From bd1ead12485385f19c4e6cb389c41874d2c577c6 Mon Sep 17 00:00:00 2001 From: pantianying <601666418@qq.com> Date: Thu, 16 Jan 2020 14:40:09 +0800 Subject: [PATCH 001/227] change readme --- README.md | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index c8cc107c4..2ebd51684 100644 --- a/README.md +++ b/README.md @@ -1,11 +1,18 @@ ### instructions - + +The gateway can support calling Java Dubbo cluster and golang Dubbo cluster + +You can use 'go build' and './start.sh' to start gateway. +then,you can do http request to you dubbo interface. + + #### HTTP request format when do not have metadata center: +Group and version is the mapping data in Dubbo service. + ``` {application Name}/​{Interface name}?version={version}&group={group}&method={method} ``` -Group and version is the mapping data in Dubbo service. http POST body: From 0ddc424907f64f26b3af2d8f1b3fa215d5da74b0 Mon Sep 17 00:00:00 2001 From: pantianying <601666418@qq.com> Date: Thu, 16 Jan 2020 14:43:37 +0800 Subject: [PATCH 002/227] change to dubbogo --- common/config/config.go | 2 +- dubbo/call.go | 6 +++--- dubbo/dubbo.go | 3 +-- go.mod | 2 +- main.go | 6 +++--- service/context.go | 2 +- service/context/http_context.go | 12 ++++++------ service/filter/match_filter.go | 4 ++-- service/metadata/redis/redis.go | 8 ++++---- service/proxy/http/http.go | 14 +++++++------- 10 files changed, 29 insertions(+), 30 deletions(-) diff --git a/common/config/config.go b/common/config/config.go index e5211a7fa..55a6215ec 100644 --- a/common/config/config.go +++ b/common/config/config.go @@ -1,7 +1,7 @@ package config import ( - "github.com/pantianying/dubbo-go-proxy/common/logger" + "github.com/dubbogo/dubbo-go-proxy/common/logger" "gopkg.in/yaml.v2" "io/ioutil" ) diff --git a/dubbo/call.go b/dubbo/call.go index 6d354fa42..d87e89c04 100644 --- a/dubbo/call.go +++ b/dubbo/call.go @@ -3,9 +3,9 @@ package dubbo import ( "errors" "fmt" - "github.com/pantianying/dubbo-go-proxy/common/config" - "github.com/pantianying/dubbo-go-proxy/common/errcode" - "github.com/pantianying/dubbo-go-proxy/common/logger" + "github.com/dubbogo/dubbo-go-proxy/common/config" + "github.com/dubbogo/dubbo-go-proxy/common/errcode" + "github.com/dubbogo/dubbo-go-proxy/common/logger" "reflect" "strings" ) diff --git a/dubbo/dubbo.go b/dubbo/dubbo.go index 94f86de43..22d69541c 100644 --- a/dubbo/dubbo.go +++ b/dubbo/dubbo.go @@ -2,8 +2,7 @@ package dubbo import ( "context" - "fmt" - "github.com/pantianying/dubbo-go-proxy/common/config" + "github.com/dubbogo/dubbo-go-proxy/common/config" "strings" "sync" "time" diff --git a/go.mod b/go.mod index 111f0aa92..d132344da 100644 --- a/go.mod +++ b/go.mod @@ -1,4 +1,4 @@ -module github.com/pantianying/dubbo-go-proxy +module github.com/dubbogo/dubbo-go-proxy go 1.12 diff --git a/main.go b/main.go index 55783f430..7713c81cd 100644 --- a/main.go +++ b/main.go @@ -1,9 +1,9 @@ package main import ( - _ "github.com/pantianying/dubbo-go-proxy/common/config" - _ "github.com/pantianying/dubbo-go-proxy/service/filter" - "github.com/pantianying/dubbo-go-proxy/service/proxy/http" + _ "github.com/dubbogo/dubbo-go-proxy/common/config" + _ "github.com/dubbogo/dubbo-go-proxy/service/filter" + "github.com/dubbogo/dubbo-go-proxy/service/proxy/http" ) // for example diff --git a/service/context.go b/service/context.go index ffb1fdfdf..3351373ef 100644 --- a/service/context.go +++ b/service/context.go @@ -2,7 +2,7 @@ package service import ( "context" - "github.com/pantianying/dubbo-go-proxy/dubbo" + "github.com/dubbogo/dubbo-go-proxy/dubbo" ) type ProxyContext interface { diff --git a/service/context/http_context.go b/service/context/http_context.go index c749ed9e0..8f872067b 100644 --- a/service/context/http_context.go +++ b/service/context/http_context.go @@ -1,12 +1,12 @@ package context import ( - "github.com/pantianying/dubbo-go-proxy/common/constant" - "github.com/pantianying/dubbo-go-proxy/common/errcode" - "github.com/pantianying/dubbo-go-proxy/common/logger" - "github.com/pantianying/dubbo-go-proxy/common/util" - "github.com/pantianying/dubbo-go-proxy/dubbo" - "github.com/pantianying/dubbo-go-proxy/service" + "github.com/dubbogo/dubbo-go-proxy/common/constant" + "github.com/dubbogo/dubbo-go-proxy/common/errcode" + "github.com/dubbogo/dubbo-go-proxy/common/logger" + "github.com/dubbogo/dubbo-go-proxy/common/util" + "github.com/dubbogo/dubbo-go-proxy/dubbo" + "github.com/dubbogo/dubbo-go-proxy/service" "io/ioutil" "net/http" "strings" diff --git a/service/filter/match_filter.go b/service/filter/match_filter.go index 17ef97689..a7c5fa9d0 100644 --- a/service/filter/match_filter.go +++ b/service/filter/match_filter.go @@ -1,8 +1,8 @@ package filter import ( - "github.com/pantianying/dubbo-go-proxy/common/constant" - "github.com/pantianying/dubbo-go-proxy/service" + "github.com/dubbogo/dubbo-go-proxy/common/constant" + "github.com/dubbogo/dubbo-go-proxy/service" ) func init() { diff --git a/service/metadata/redis/redis.go b/service/metadata/redis/redis.go index 09a0693da..df882d03f 100644 --- a/service/metadata/redis/redis.go +++ b/service/metadata/redis/redis.go @@ -2,10 +2,10 @@ package redis import ( "github.com/go-redis/redis" - "github.com/pantianying/dubbo-go-proxy/common/config" - "github.com/pantianying/dubbo-go-proxy/common/logger" - "github.com/pantianying/dubbo-go-proxy/common/util" - "github.com/pantianying/dubbo-go-proxy/service" + "github.com/dubbogo/dubbo-go-proxy/common/config" + "github.com/dubbogo/dubbo-go-proxy/common/logger" + "github.com/dubbogo/dubbo-go-proxy/common/util" + "github.com/dubbogo/dubbo-go-proxy/service" "time" ) diff --git a/service/proxy/http/http.go b/service/proxy/http/http.go index c304d3f51..bb547af36 100644 --- a/service/proxy/http/http.go +++ b/service/proxy/http/http.go @@ -1,13 +1,13 @@ package http import ( - "github.com/pantianying/dubbo-go-proxy/common/config" - "github.com/pantianying/dubbo-go-proxy/common/errcode" - "github.com/pantianying/dubbo-go-proxy/common/logger" - "github.com/pantianying/dubbo-go-proxy/common/util" - "github.com/pantianying/dubbo-go-proxy/dubbo" - ct "github.com/pantianying/dubbo-go-proxy/service/context" - "github.com/pantianying/dubbo-go-proxy/service/metadata/redis" + "github.com/dubbogo/dubbo-go-proxy/common/config" + "github.com/dubbogo/dubbo-go-proxy/common/errcode" + "github.com/dubbogo/dubbo-go-proxy/common/logger" + "github.com/dubbogo/dubbo-go-proxy/common/util" + "github.com/dubbogo/dubbo-go-proxy/dubbo" + ct "github.com/dubbogo/dubbo-go-proxy/service/context" + "github.com/dubbogo/dubbo-go-proxy/service/metadata/redis" "io" "net/http" "time" From 60689480529be3921417bd9483c255e83e2e8bb9 Mon Sep 17 00:00:00 2001 From: Joe Zou Date: Thu, 16 Jan 2020 15:30:27 +0800 Subject: [PATCH 003/227] Create auto-comment.yml --- .github/auto-comment.yml | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 .github/auto-comment.yml diff --git a/.github/auto-comment.yml b/.github/auto-comment.yml new file mode 100644 index 000000000..6d6f71029 --- /dev/null +++ b/.github/auto-comment.yml @@ -0,0 +1,7 @@ +# Comment to a new issue. +issueOpened: > + Thank your for raising a issue. We will try and get back to you as soon as possible. + Please make sure you have given us as much context as possible. +pullRequestOpened: > + Thank your for raising your pull request. + Please make sure you have followed our contributing guidelines. We will review it as soon as possible From 155e2a9899a8222ef76387ff81f69e60dbc0d053 Mon Sep 17 00:00:00 2001 From: Joe Zou Date: Fri, 17 Jan 2020 21:37:51 +0800 Subject: [PATCH 004/227] Create .travis.yml --- .travis.yml | 10 ++++++++++ 1 file changed, 10 insertions(+) create mode 100644 .travis.yml diff --git a/.travis.yml b/.travis.yml new file mode 100644 index 000000000..a61dcbcae --- /dev/null +++ b/.travis.yml @@ -0,0 +1,10 @@ +language: go + +go: + - "1.11" + - "1.12" + - "1.13.x" + +script: + - go fmt ./... && [[ -z `git status -s` ]] + - GO111MODULE=on && go mod vendor && go test ./... -bench . -race -v From 84cfbb1ff124960dd3ac6ca28f0d142dd11d6a82 Mon Sep 17 00:00:00 2001 From: Joe Zou Date: Fri, 17 Jan 2020 21:39:30 +0800 Subject: [PATCH 005/227] Update README.md --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index 2ebd51684..eef0fdc7c 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,5 @@ +[![Build Status](https://travis-ci.org/dubbogo/dubbo-go-proxy.svg?branch=master)](https://travis-ci.org/dubbogo/dubbo-go-proxy) + ### instructions The gateway can support calling Java Dubbo cluster and golang Dubbo cluster From 6a124421fce330435ac135eb22780a3300f7d0c7 Mon Sep 17 00:00:00 2001 From: Joe Zou Date: Fri, 17 Jan 2020 21:43:03 +0800 Subject: [PATCH 006/227] Update .travis.yml --- .travis.yml | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index a61dcbcae..01856b5ed 100644 --- a/.travis.yml +++ b/.travis.yml @@ -5,6 +5,11 @@ go: - "1.12" - "1.13.x" +env: + - GO111MODULE=on + +install: true + script: - go fmt ./... && [[ -z `git status -s` ]] - - GO111MODULE=on && go mod vendor && go test ./... -bench . -race -v + - go mod vendor && go test ./... From 1e7de7f654f46b4286dbae7883c9ef231e2490f8 Mon Sep 17 00:00:00 2001 From: Joe Zou Date: Fri, 17 Jan 2020 21:46:31 +0800 Subject: [PATCH 007/227] Update .travis.yml --- .travis.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 01856b5ed..b75d1490c 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,7 +1,6 @@ language: go go: - - "1.11" - "1.12" - "1.13.x" From b3ca666946412b2309d170a98c9aab390bc75cd5 Mon Sep 17 00:00:00 2001 From: Joe Zou Date: Fri, 17 Jan 2020 21:48:15 +0800 Subject: [PATCH 008/227] Update .travis.yml --- .travis.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index b75d1490c..4849bb2e5 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,7 +1,6 @@ language: go go: - - "1.12" - "1.13.x" env: From 5f9c862ba983d19c5e68f4e425cbee30515cb6ff Mon Sep 17 00:00:00 2001 From: Joe Zou Date: Fri, 17 Jan 2020 21:54:42 +0800 Subject: [PATCH 009/227] format project --- service/metadata/redis/redis.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/service/metadata/redis/redis.go b/service/metadata/redis/redis.go index df882d03f..17453c335 100644 --- a/service/metadata/redis/redis.go +++ b/service/metadata/redis/redis.go @@ -1,11 +1,11 @@ package redis import ( - "github.com/go-redis/redis" "github.com/dubbogo/dubbo-go-proxy/common/config" "github.com/dubbogo/dubbo-go-proxy/common/logger" "github.com/dubbogo/dubbo-go-proxy/common/util" "github.com/dubbogo/dubbo-go-proxy/service" + "github.com/go-redis/redis" "time" ) From 17d47a8372dd4300d3f776f53d1ebd591cf09248 Mon Sep 17 00:00:00 2001 From: pantianying <601666418@qq.com> Date: Sat, 18 Jan 2020 09:55:37 +0800 Subject: [PATCH 010/227] update --- .gitignore | 1 + common/logger/log.yml | 28 ++++++++++++++++++++++++++++ 2 files changed, 29 insertions(+) create mode 100644 common/logger/log.yml diff --git a/.gitignore b/.gitignore index 9106d08d0..f7a989311 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,3 @@ ./dubbo-go-proxy /logs +/.idea \ No newline at end of file diff --git a/common/logger/log.yml b/common/logger/log.yml new file mode 100644 index 000000000..59fa4279a --- /dev/null +++ b/common/logger/log.yml @@ -0,0 +1,28 @@ + +level: "debug" +development: true +disableCaller: false +disableStacktrace: false +sampling: +encoding: "console" + +# encoder +encoderConfig: + messageKey: "message" + levelKey: "level" + timeKey: "time" + nameKey: "logger" + callerKey: "caller" + stacktraceKey: "stacktrace" + lineEnding: "" + levelEncoder: "capitalColor" + timeEncoder: "iso8601" + durationEncoder: "seconds" + callerEncoder: "short" + nameEncoder: "" + +outputPaths: + - "stderr" +errorOutputPaths: + - "stderr" +initialFields: From ede7d87837af346ea24d72861bd0136212ccd30e Mon Sep 17 00:00:00 2001 From: pantianying <601666418@qq.com> Date: Tue, 7 Apr 2020 09:58:28 +0800 Subject: [PATCH 011/227] adapt the 1.4.0 dubbo-go --- dubbo/call.go | 4 +++- go.mod | 10 ++++------ go.sum | 46 ++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 53 insertions(+), 7 deletions(-) diff --git a/dubbo/call.go b/dubbo/call.go index d87e89c04..4c87ea1d3 100644 --- a/dubbo/call.go +++ b/dubbo/call.go @@ -1,6 +1,7 @@ package dubbo import ( + "context" "errors" "fmt" "github.com/dubbogo/dubbo-go-proxy/common/config" @@ -22,7 +23,8 @@ type InvokeData struct { func (d *GenericClientPool) Call(inData InvokeData) (resp interface{}, ret int) { var err error c := d.Get(inData.InterfaceName, inData.Version, inData.Group) - resp, err = c.Invoke([]interface{}{inData.Method, inData.ParameterTypes, inData.ReqData}) + ctx:=context.Background() + resp, err = c.Invoke(ctx,[]interface{}{inData.Method, inData.ParameterTypes, inData.ReqData}) if err != nil { ret = errcode.ServerBusy logger.Errorf("GenericClient call get err:%v, InvokeData:%+v", err, inData) diff --git a/go.mod b/go.mod index d132344da..03e354ebe 100644 --- a/go.mod +++ b/go.mod @@ -3,15 +3,13 @@ module github.com/dubbogo/dubbo-go-proxy go 1.12 require ( - github.com/apache/dubbo-go v1.2.0 - github.com/apache/dubbo-go-hessian2 v1.3.1-0.20200111150223-4ce8c8d0d7ac - github.com/dubbogo/getty v1.3.2 + github.com/apache/dubbo-go v1.4.0-rc1 + github.com/apache/dubbo-go-hessian2 v1.4.0 + github.com/dubbogo/getty v1.3.3 github.com/go-redis/redis v6.15.6+incompatible github.com/json-iterator/go v1.1.9 github.com/pkg/errors v0.8.1 - github.com/stretchr/testify v1.4.0 + github.com/stretchr/testify v1.5.1 go.uber.org/zap v1.13.0 gopkg.in/yaml.v2 v2.2.7 ) - -replace github.com/apache/dubbo-go => github.com/apache/dubbo-go v0.1.2-0.20200114023434-cabd56a95cd7 diff --git a/go.sum b/go.sum index 34cb7bd32..135fe3dd4 100644 --- a/go.sum +++ b/go.sum @@ -8,8 +8,11 @@ github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03 github.com/DataDog/datadog-go v2.2.0+incompatible/go.mod h1:LButxg5PwREeZtORoXG3tL4fMGNddJ+vMq1mwgfaqoQ= github.com/Jeffail/gabs v1.1.0/go.mod h1:6xMvQMK4k33lb7GUUpaAPh6nKMmemQeg5d4gn7/bOXc= github.com/Microsoft/go-winio v0.4.3/go.mod h1:VhR8bwka0BXejwEJY73c50VrPtXAaKcyvVC4A4RozmA= +github.com/NYTimes/gziphandler v0.0.0-20170623195520-56545f4a5d46/go.mod h1:3wb06e3pkSAbeQ52E9H9iFoQsEEwGN64994WTCIhntQ= github.com/NYTimes/gziphandler v1.0.1/go.mod h1:3wb06e3pkSAbeQ52E9H9iFoQsEEwGN64994WTCIhntQ= github.com/Nvveen/Gotty v0.0.0-20120604004816-cd527374f1e5/go.mod h1:lmUJ/7eu/Q8D7ML55dXQrVaamCz2vxCfdQBasLZfHKk= +github.com/PuerkitoBio/purell v1.0.0/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= +github.com/PuerkitoBio/urlesc v0.0.0-20160726150825-5bd2802263f2/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE= github.com/SAP/go-hdb v0.12.0/go.mod h1:etBT+FAi1t5k3K3tf5vQTnosgYmhDkRi8jEnQqCnxF0= github.com/SermoDigital/jose v0.0.0-20180104203859-803625baeddc/go.mod h1:ARgCUhI1MHQH+ONky/PAtmVHQrP5JlGY0F3poXOp/fA= github.com/StackExchange/wmi v0.0.0-20180116203802-5d049714c4a6/go.mod h1:3eOhrUMpNV+6aFIbp5/iudMxNCF27Vw2OZgy4xEx0Fg= @@ -26,10 +29,14 @@ github.com/apache/dubbo-go v0.1.2-0.20200114023434-cabd56a95cd7 h1:0cJRvG4/O03YN github.com/apache/dubbo-go v0.1.2-0.20200114023434-cabd56a95cd7/go.mod h1:dcSrFGI1kEtAwDYhc9G02yLgY3e5y3RyfLCmxcauSNQ= github.com/apache/dubbo-go v1.2.0 h1:TjWK0GhJaJ1f3wpyFypWFb5fBYhbYIv5i3WFYvMYTXg= github.com/apache/dubbo-go v1.2.0/go.mod h1:SVerp5GLubzSB6F+t5EcJECOSwwI0Do26XNNLhfwLa0= +github.com/apache/dubbo-go v1.4.0-rc1 h1:kSUhKKJjB0hokjpOgb/iIiP0RQ849dm6WplHsd0Kb1A= +github.com/apache/dubbo-go v1.4.0-rc1/go.mod h1:hzP9PQkcYFcBUgedttDeimugDNqbmGzh18QQy/vBjnw= github.com/apache/dubbo-go-hessian2 v1.2.5-0.20191029001541-894e45c9aaaa h1:11TO1wiM5bvGAVrmfN5atD8gZqUSPE1TBoIs8sI6Abk= github.com/apache/dubbo-go-hessian2 v1.2.5-0.20191029001541-894e45c9aaaa/go.mod h1:LWnndnrFXZmJLAzoyNAPNHSIJ1KOHVkTSsHgC3YYWlo= github.com/apache/dubbo-go-hessian2 v1.3.1-0.20200111150223-4ce8c8d0d7ac h1:QKRMidg/RbdI5oaQWMb8Lxo63S+fLmsgMxsFoOCftKw= github.com/apache/dubbo-go-hessian2 v1.3.1-0.20200111150223-4ce8c8d0d7ac/go.mod h1:VwEnsOMidkM1usya2uPfGpSLO9XUF//WQcWn3y+jFz8= +github.com/apache/dubbo-go-hessian2 v1.4.0 h1:Cb9FQVTy3G93dnDr7P93U8DeKFYpDTJjQp44JG5TafA= +github.com/apache/dubbo-go-hessian2 v1.4.0/go.mod h1:VwEnsOMidkM1usya2uPfGpSLO9XUF//WQcWn3y+jFz8= github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o= github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY= github.com/armon/go-metrics v0.0.0-20190430140413-ec5e00d3c878/go.mod h1:3AMJUQhVx52RsWOnlkpikZr01T/yAVN2gn0861vByNg= @@ -58,6 +65,7 @@ github.com/coreos/go-systemd v0.0.0-20190719114852-fd7a80b32e1f/go.mod h1:F5haX7 github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= github.com/creasty/defaults v1.3.0 h1:uG+RAxYbJgOPCOdKEcec9ZJXeva7Y6mj/8egdzwmLtw= github.com/creasty/defaults v1.3.0/go.mod h1:CIEEvs7oIVZm30R8VxtFJs+4k201gReYyuYHJxZc68I= +github.com/davecgh/go-spew v0.0.0-20151105211317-5215b55f46b2/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= @@ -72,6 +80,10 @@ github.com/dubbogo/getty v1.3.1 h1:9fehwTo/D6+z6/+kADMbhbKeMkP80o/3g+XwV5lFLTY= github.com/dubbogo/getty v1.3.1/go.mod h1:dtLOEb1v6EMHsQNYRWEACiRLmTWB2kJGUAj1aXayPOg= github.com/dubbogo/getty v1.3.2 h1:l1KVSs/1CtTKbIPTrkTtBT6S9ddvmswDGoAnnl2CDpM= github.com/dubbogo/getty v1.3.2/go.mod h1:ANbVQ9tbpZ2b0xdR8nRrgS/oXIsZAeRxzvPSOn/7mbk= +github.com/dubbogo/getty v1.3.3 h1:8m4zZBqFHO+NmhH7rMPlFuuYRVjcPD7cUhumevqMZZs= +github.com/dubbogo/getty v1.3.3/go.mod h1:U92BDyJ6sW9Jpohr2Vlz8w2uUbIbNZ3d+6rJvFTSPp0= +github.com/dubbogo/go-zookeeper v1.0.0 h1:RsYdlGwhDW+iKXM3eIIcvt34P2swLdmQfuIJxsHlGoM= +github.com/dubbogo/go-zookeeper v1.0.0/go.mod h1:fn6n2CAEer3novYgk9ULLwAjuV8/g4DdC2ENwRb6E+c= github.com/dubbogo/gost v1.1.1/go.mod h1:R7wZm1DrmrKGr50mBZVcg6C9ekG8aL5hP+sgWcIDwQg= github.com/dubbogo/gost v1.3.0 h1:n90mIUWCPD69BqW8wJ43NDy0RgNxx02aAG4QJcJ785U= github.com/dubbogo/gost v1.3.0/go.mod h1:R7wZm1DrmrKGr50mBZVcg6C9ekG8aL5hP+sgWcIDwQg= @@ -80,6 +92,8 @@ github.com/dubbogo/gost v1.5.2 h1:ri/03971hdpnn3QeCU+4UZgnRNGDXLDGDucR/iozZm8= github.com/dubbogo/gost v1.5.2/go.mod h1:pPTjVyoJan3aPxBPNUX0ADkXjPibLo+/Ib0/fADXSG8= github.com/duosecurity/duo_api_golang v0.0.0-20190308151101-6c680f768e74/go.mod h1:UqXY1lYT/ERa4OEAywUqdok1T4RCRdArkhic1Opuavo= github.com/elazarl/go-bindata-assetfs v0.0.0-20160803192304-e1a2a7ec64b0/go.mod h1:v+YaWX3bdea5J/mo8dSETolEo7R71Vk1u8bnjau5yw4= +github.com/emicklei/go-restful v0.0.0-20170410110728-ff4f55a20633/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs= +github.com/emicklei/go-restful/v3 v3.0.0/go.mod h1:6n3XBCmQQb25CM2LCACGz8ukIrRry+4bhvbpWn3mrbc= github.com/envoyproxy/go-control-plane v0.8.0/go.mod h1:GSSbY9P1neVhdY7G4wu+IK1rk/dqhiCC/4ExuWJZVuk= github.com/envoyproxy/protoc-gen-validate v0.0.14/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= github.com/fastly/go-utils v0.0.0-20180712184237-d95a45783239/go.mod h1:Gdwt2ce0yfBxPvZrHkprdPPTTS3N5rwmLE8T22KBXlw= @@ -87,6 +101,7 @@ github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5Kwzbycv github.com/fatih/structs v0.0.0-20180123065059-ebf56d35bba7/go.mod h1:9NiDSp5zOcgEDl+j00MP/WkGVPOlPRLejGD8Ga6PJ7M= github.com/fsnotify/fsnotify v1.4.7 h1:IXs+QLmnXW2CcXuY+8Mzv/fWEsPGWxqefPtCP5CnV9I= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= +github.com/ghodss/yaml v0.0.0-20150909031657-73d445a93680/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= github.com/go-errors/errors v1.0.1/go.mod h1:f4zRHt4oKfwPJE5k8C9vpYG+aDHdBFUsgrm6/TyX73Q= github.com/go-ini/ini v1.25.4/go.mod h1:ByCAeIL28uOIIG0E3PJtZPDL8WnHpFKFOtgjp+3Ies8= @@ -95,8 +110,13 @@ github.com/go-ldap/ldap v3.0.2+incompatible/go.mod h1:qfd9rJvER9Q0/D/Sqn1DfHRoBp github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= github.com/go-ole/go-ole v1.2.1/go.mod h1:7FAglXiTm7HKlQRDeOQ6ZNUHidzCWXuZWq/1dTyBNF8= +github.com/go-openapi/jsonpointer v0.0.0-20160704185906-46af16f9f7b1/go.mod h1:+35s3my2LFTysnkMfxsJBAMHj/DoqoB9knIWoYG/Vk0= +github.com/go-openapi/jsonreference v0.0.0-20160704190145-13c6e3589ad9/go.mod h1:W3Z9FmVs9qj+KR4zFKmDPGiLdk1D9Rlm7cyMvf57TTg= +github.com/go-openapi/spec v0.0.0-20160808142527-6aced65f8501/go.mod h1:J8+jY1nAiCcj+friV/PDoE1/3eeccG9LYBs0tYvLOWc= +github.com/go-openapi/swag v0.0.0-20160704191624-1d0bd113de87/go.mod h1:DXUve3Dpr1UfpPtxFw+EFuQ41HhCWZfha5jSVRG7C7I= github.com/go-redis/redis v6.15.6+incompatible h1:H9evprGPLI8+ci7fxQx6WNZHJSb7be8FqJQRhdQZ5Sg= github.com/go-redis/redis v6.15.6+incompatible/go.mod h1:NAIEuMOZ/fxfXJIrKDQDz8wamY7mA7PouImQ2Jvg6kA= +github.com/go-resty/resty/v2 v2.1.0/go.mod h1:dZGr0i9PLlaaTD4H/hoZIDjQ+r6xq8mgbRzHZf7f2J8= github.com/go-sql-driver/mysql v0.0.0-20180618115901-749ddf1598b4/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w= github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= github.com/go-test/deep v1.0.2/go.mod h1:wGDj63lr65AM2AQyKZd/NYHGb0R+1RLqB8NKt3aSFNA= @@ -110,6 +130,7 @@ github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4er github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= github.com/golang/mock v1.3.1 h1:qGJ6qTW+x6xX/my+8YUVl4WNpX9B7+/l2tRsHGZ7f2s= github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y= +github.com/golang/protobuf v0.0.0-20161109072736-4bd1920723d7/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.2 h1:6nsPYzhq5kReh6QImI3k5qWzO4PEbvbIW2cwSfR/6xs= @@ -124,9 +145,11 @@ github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5a github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= github.com/google/go-github v17.0.0+incompatible/go.mod h1:zLgOLi98H3fifZn+44m+umXrS52loVEgC2AApnigrVQ= github.com/google/go-querystring v0.0.0-20170111101155-53e6ce116135/go.mod h1:odCYkC5MyYFN7vkCjXpyrEuKhc/BUO6wN/zVPAxq5ck= +github.com/google/gofuzz v0.0.0-20161122191042-44d81051d367/go.mod h1:HP5RmnzzSNb993RKQDq4+1A4ia9nllfqcQFTQJedwGI= github.com/google/gofuzz v0.0.0-20170612174753-24818f796faf/go.mod h1:HP5RmnzzSNb993RKQDq4+1A4ia9nllfqcQFTQJedwGI= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= +github.com/googleapis/gnostic v0.0.0-20170729233727-0c5108395e2d/go.mod h1:sJBsCZ4ayReDTBIg8b9dl28c5xFWyhBTVRp3pOg5EKY= github.com/googleapis/gnostic v0.2.0/go.mod h1:sJBsCZ4ayReDTBIg8b9dl28c5xFWyhBTVRp3pOg5EKY= github.com/gophercloud/gophercloud v0.0.0-20180828235145-f29afc2cceca/go.mod h1:3WdhXV3rUYy9p6AUW8d94kr+HS62Y4VL9mBnFxsD8q4= github.com/gopherjs/gopherjs v0.0.0-20180825215210-0210a2f0f73c/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= @@ -139,6 +162,7 @@ github.com/gregjones/httpcache v0.0.0-20180305231024-9cad4c3443a7/go.mod h1:Fecb github.com/grpc-ecosystem/go-grpc-middleware v1.0.0/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk= github.com/grpc-ecosystem/grpc-gateway v1.9.5/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= +github.com/grpc-ecosystem/grpc-opentracing v0.0.0-20180507213350-8e809c8a8645/go.mod h1:6iZfnjpejD4L/4DwD7NryNaJyCQdzwWwH2MWhCA90Kw= github.com/hailocab/go-hostpool v0.0.0-20160125115350-e80d13ce29ed/go.mod h1:tMWxXQ9wFIaZeTI9F+hmhFiGpFmhOHzyShyFUhRm0H4= github.com/hashicorp/consul v1.5.3/go.mod h1:61E2GJCPEP3oq8La7sfDdWGQ66+Zbxzw5ecOdFD7xIE= github.com/hashicorp/consul/api v1.1.0/go.mod h1:VmuI/Lkw1nC05EYQWNKwWGbkg+FbDBtguAZLlVdkD9Q= @@ -193,6 +217,7 @@ github.com/jmespath/go-jmespath v0.0.0-20160202185014-0b12d6b521d8/go.mod h1:Nht github.com/jmespath/go-jmespath v0.0.0-20180206201540-c2b33e8439af/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k= github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo= github.com/joyent/triton-go v0.0.0-20180628001255-830d2b111e62/go.mod h1:U+RSyWxWd04xTqnuOQxnai7XGS2PrPY2cfGoDKtMHjA= +github.com/json-iterator/go v0.0.0-20180612202835-f2b4162afba3/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= github.com/json-iterator/go v1.1.5/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= github.com/json-iterator/go v1.1.7/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= @@ -218,6 +243,7 @@ github.com/lestrrat/go-strftime v0.0.0-20180220042222-ba3bf9c1d042/go.mod h1:TPp github.com/lib/pq v0.0.0-20180523175426-90697d60dd84/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= github.com/magiconair/properties v1.8.1 h1:ZC2Vc7/ZFkGmsVC9KvOjumD+G5lXy2RtTKyzRKO2BQ4= github.com/magiconair/properties v1.8.1/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= +github.com/mailru/easyjson v0.0.0-20160728113105-d5b7844b561a/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= @@ -238,22 +264,28 @@ github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421 h1:ZqeYNhU3OH github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/reflect2 v0.0.0-20180320133207-05fbef0ca5da/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742 h1:Esafd1046DLDQ0W1YjYsBW+p8U2u7vzgW2SQVmlNazg= github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= github.com/modern-go/reflect2 v1.0.1 h1:9f412s+6RmYXLWZSEzVVgPGK7C2PphHj5RJrvfx9AWI= github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= +github.com/munnerz/goautoneg v0.0.0-20120707110453-a547fc61f48d/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= github.com/nacos-group/nacos-sdk-go v0.0.0-20190723125407-0242d42e3dbb/go.mod h1:CEkSvEpoveoYjA81m4HNeYQ0sge0LFGKSEqO3JKHllo= github.com/nicolai86/scaleway-sdk v1.10.2-0.20180628010248-798f60e20bb2/go.mod h1:TLb2Sg7HQcgGdloNxkrmtgDNR9uVYF3lfdFIN4Ro6Sk= github.com/oklog/run v0.0.0-20180308005104-6934b124db28/go.mod h1:dlhp/R75TPv97u0XWUtDeV/lRKWPKSdTuV0TZvrmrQA= +github.com/onsi/ginkgo v0.0.0-20170829012221-11459a886d9c/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.6.0 h1:Ix8l273rp3QzYgXSR+c8d1fTG7UPgYkOSELPhiY/YGw= github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= +github.com/onsi/gomega v0.0.0-20170829124025-dcabb60a477c/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= github.com/onsi/gomega v1.4.1/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= github.com/onsi/gomega v1.4.2 h1:3mYCb7aPxS/RU7TI1y4rkEn1oKmPRjNJLNEXgw7MH2I= github.com/onsi/gomega v1.4.2/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= github.com/opencontainers/go-digest v1.0.0-rc1/go.mod h1:cMLVZDEM3+U2I4VmLI6N8jQYUd2OVphdqWwCJHrFt2s= github.com/opencontainers/image-spec v1.0.1/go.mod h1:BtxoFyWECRxE4U/7sNtV5W15zMzWCbyJoFRP3s7yZA0= github.com/opencontainers/runc v0.1.1/go.mod h1:qT5XzbpPznkRYVz/mWwUaVBUv2rmF59PVA73FjuZG0U= +github.com/opentracing/opentracing-go v1.1.0 h1:pWlfV3Bxv7k65HYwkikxat0+s3pV4bsqf19k25Ur8rU= +github.com/opentracing/opentracing-go v1.1.0/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= github.com/ory/dockertest v3.3.4+incompatible/go.mod h1:1vX4m9wsvi00u5bseYwXaSnhNrne+V0E6LAcBILJdPs= github.com/packethost/packngo v0.1.1-0.20180711074735-b9cb5096f54c/go.mod h1:otzZQXgoO96RTzDB/Hycg0qZcXZsWJGJRSXbmEIJ+4M= github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= @@ -263,6 +295,7 @@ github.com/peterbourgon/diskv v2.0.1+incompatible/go.mod h1:uqqh8zWWbv1HBMNONnaR github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.8.1 h1:iURUrRGxPUNPdy5/HRSm+Yj6okJ6UtLINN0Q9M4+h3I= github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pmezard/go-difflib v0.0.0-20151028094244-d8ed2627bdf0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI= @@ -302,15 +335,18 @@ github.com/smartystreets/goconvey v0.0.0-20190710185942-9d28bd7c0945 h1:N8Bg45zp github.com/smartystreets/goconvey v0.0.0-20190710185942-9d28bd7c0945/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= github.com/softlayer/softlayer-go v0.0.0-20180806151055-260589d94c7d/go.mod h1:Cw4GTlQccdRGSEf6KiMju767x0NEHE0YIVPJSaXjlsw= github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM= +github.com/spf13/pflag v0.0.0-20170130214245-9ff6c6923cff/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= github.com/spf13/pflag v1.0.2/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/testify v0.0.0-20151208002404-e3a8ff8ce365/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.3.0 h1:TivCn/peBQ7UY8ooIcPgZFpTNSz0Q2U6UrFlUfqbe0Q= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/stretchr/testify v1.4.0 h1:2E4SXV/wtOkTonXsotYi4li6zVWxYlZuYNCXe9XRJyk= github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= +github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= github.com/tebeka/strftime v0.1.3/go.mod h1:7wJm3dZlpr4l/oVK0t1HYIc4rMzQ2XJlOMIUJUJH6XQ= github.com/tent/http-link-go v0.0.0-20130702225549-ac974c61c2f9/go.mod h1:RHkNRtSLfOK7qBTHaeSX1D6BNpI3qw7NTxsmNr4RvN8= github.com/tevid/gohamcrest v1.1.1/go.mod h1:3UvtWlqm8j5JbwYZh80D/PVBt0mJ1eJiYgZMibh0H/k= @@ -343,6 +379,7 @@ golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHl golang.org/x/lint v0.0.0-20190930215403-16217165b5de h1:5hukYrvBGR8/eNkX5mdUezrA6JiaEZDtJb9Ei+1LlBs= golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= +golang.org/x/net v0.0.0-20170114055629-f2499483f923/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20181023162649-9b4f9f5ad519/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -356,12 +393,14 @@ golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190620200207-3b0461eec859 h1:R/3boaszxrf1GEUWTVDzSKVwLmSJpwZ1yqXm8j0v2QI= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/oauth2 v0.0.0-20170807180024-9a379c6b3e95/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sys v0.0.0-20170830134202-bb24a47a89ea/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -375,6 +414,7 @@ golang.org/x/sys v0.0.0-20190508220229-2d0786266e9c/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20190523142557-0e01d883c5c5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190801041406-cbf593c0f2f3 h1:4y9KwBHBgBNwDbtu44R5o1fdOCQUEXhbk/P4A9WmJq0= golang.org/x/sys v0.0.0-20190801041406-cbf593c0f2f3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/text v0.0.0-20160726164857-2910a502d2bf/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.2 h1:tW2bmiBqwgJj/UpqtC8EpXEZVYOwU0yG4iWbprSVAcs= golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= @@ -382,6 +422,7 @@ golang.org/x/time v0.0.0-20180412165947-fbb02b2291d2/go.mod h1:tRJNPiyCQ0inRvYxb golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20181011042414-1f849cf54d09/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= golang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= @@ -432,3 +473,8 @@ k8s.io/api v0.0.0-20190325185214-7544f9db76f6/go.mod h1:iuAfoD4hCxJ8Onx9kaTIt30j k8s.io/apimachinery v0.0.0-20180821005732-488889b0007f/go.mod h1:ccL7Eh7zubPUSh9A3USN90/OzHNSVN6zxzde07TDCL0= k8s.io/apimachinery v0.0.0-20190223001710-c182ff3b9841/go.mod h1:ccL7Eh7zubPUSh9A3USN90/OzHNSVN6zxzde07TDCL0= k8s.io/client-go v8.0.0+incompatible/go.mod h1:7vJpHMYJwNQCWgzmNV+VYUl1zCObLyodBc8nIyt8L5s= +k8s.io/gengo v0.0.0-20190128074634-0689ccc1d7d6/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0= +k8s.io/klog v0.0.0-20181102134211-b9b56d5dfc92/go.mod h1:Gq+BEi5rUBO/HRz0bTSXDUcqjScdoY3a9IHpCEIOOfk= +k8s.io/kube-openapi v0.0.0-20191107075043-30be4d16710a/go.mod h1:1TqjTSzOxsLGIKfj0lK8EeCP7K1iUG65v09OM0/WG5E= +sigs.k8s.io/structured-merge-diff v0.0.0-20190525122527-15d366b2352e/go.mod h1:wWxsB5ozmmv/SG7nM11ayaAW51xMvak/t1r0CSlcokI= +sigs.k8s.io/yaml v1.1.0/go.mod h1:UJmg0vDUVViEyp3mgSv9WPwZCDxu4rQW1olrI1uml+o= From d7f35e5788d3ecaca1a49ac443af2ea4f4126938 Mon Sep 17 00:00:00 2001 From: pantianying <601666418@qq.com> Date: Tue, 7 Apr 2020 09:59:52 +0800 Subject: [PATCH 012/227] go mode tidy --- go.sum | 23 +++++------------------ 1 file changed, 5 insertions(+), 18 deletions(-) diff --git a/go.sum b/go.sum index 135fe3dd4..2f94a6237 100644 --- a/go.sum +++ b/go.sum @@ -25,16 +25,8 @@ github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuy github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= github.com/aliyun/alibaba-cloud-sdk-go v0.0.0-20190802083043-4cd0c391755e/go.mod h1:myCDvQSzCW+wB1WAlocEru4wMGJxy+vlxHdhegi1CDQ= github.com/aliyun/aliyun-oss-go-sdk v0.0.0-20190307165228-86c17b95fcd5/go.mod h1:T/Aws4fEfogEE9v+HPhhw+CntffsBHJ8nXQCwKr0/g8= -github.com/apache/dubbo-go v0.1.2-0.20200114023434-cabd56a95cd7 h1:0cJRvG4/O03YN6K5DGi53Szgt/SAe8AsAolehKPDi4Y= -github.com/apache/dubbo-go v0.1.2-0.20200114023434-cabd56a95cd7/go.mod h1:dcSrFGI1kEtAwDYhc9G02yLgY3e5y3RyfLCmxcauSNQ= -github.com/apache/dubbo-go v1.2.0 h1:TjWK0GhJaJ1f3wpyFypWFb5fBYhbYIv5i3WFYvMYTXg= -github.com/apache/dubbo-go v1.2.0/go.mod h1:SVerp5GLubzSB6F+t5EcJECOSwwI0Do26XNNLhfwLa0= github.com/apache/dubbo-go v1.4.0-rc1 h1:kSUhKKJjB0hokjpOgb/iIiP0RQ849dm6WplHsd0Kb1A= github.com/apache/dubbo-go v1.4.0-rc1/go.mod h1:hzP9PQkcYFcBUgedttDeimugDNqbmGzh18QQy/vBjnw= -github.com/apache/dubbo-go-hessian2 v1.2.5-0.20191029001541-894e45c9aaaa h1:11TO1wiM5bvGAVrmfN5atD8gZqUSPE1TBoIs8sI6Abk= -github.com/apache/dubbo-go-hessian2 v1.2.5-0.20191029001541-894e45c9aaaa/go.mod h1:LWnndnrFXZmJLAzoyNAPNHSIJ1KOHVkTSsHgC3YYWlo= -github.com/apache/dubbo-go-hessian2 v1.3.1-0.20200111150223-4ce8c8d0d7ac h1:QKRMidg/RbdI5oaQWMb8Lxo63S+fLmsgMxsFoOCftKw= -github.com/apache/dubbo-go-hessian2 v1.3.1-0.20200111150223-4ce8c8d0d7ac/go.mod h1:VwEnsOMidkM1usya2uPfGpSLO9XUF//WQcWn3y+jFz8= github.com/apache/dubbo-go-hessian2 v1.4.0 h1:Cb9FQVTy3G93dnDr7P93U8DeKFYpDTJjQp44JG5TafA= github.com/apache/dubbo-go-hessian2 v1.4.0/go.mod h1:VwEnsOMidkM1usya2uPfGpSLO9XUF//WQcWn3y+jFz8= github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o= @@ -76,17 +68,10 @@ github.com/digitalocean/godo v1.1.1/go.mod h1:h6faOIcZ8lWIwNQ+DN7b3CgX4Kwby5T+nb github.com/digitalocean/godo v1.10.0/go.mod h1:h6faOIcZ8lWIwNQ+DN7b3CgX4Kwby5T+nbpNqkUIozU= github.com/docker/go-connections v0.3.0/go.mod h1:Gbd7IOopHjR8Iph03tsViu4nIes5XhDvyHbTtUxmeec= github.com/docker/go-units v0.3.3/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= -github.com/dubbogo/getty v1.3.1 h1:9fehwTo/D6+z6/+kADMbhbKeMkP80o/3g+XwV5lFLTY= -github.com/dubbogo/getty v1.3.1/go.mod h1:dtLOEb1v6EMHsQNYRWEACiRLmTWB2kJGUAj1aXayPOg= -github.com/dubbogo/getty v1.3.2 h1:l1KVSs/1CtTKbIPTrkTtBT6S9ddvmswDGoAnnl2CDpM= -github.com/dubbogo/getty v1.3.2/go.mod h1:ANbVQ9tbpZ2b0xdR8nRrgS/oXIsZAeRxzvPSOn/7mbk= github.com/dubbogo/getty v1.3.3 h1:8m4zZBqFHO+NmhH7rMPlFuuYRVjcPD7cUhumevqMZZs= github.com/dubbogo/getty v1.3.3/go.mod h1:U92BDyJ6sW9Jpohr2Vlz8w2uUbIbNZ3d+6rJvFTSPp0= github.com/dubbogo/go-zookeeper v1.0.0 h1:RsYdlGwhDW+iKXM3eIIcvt34P2swLdmQfuIJxsHlGoM= github.com/dubbogo/go-zookeeper v1.0.0/go.mod h1:fn6n2CAEer3novYgk9ULLwAjuV8/g4DdC2ENwRb6E+c= -github.com/dubbogo/gost v1.1.1/go.mod h1:R7wZm1DrmrKGr50mBZVcg6C9ekG8aL5hP+sgWcIDwQg= -github.com/dubbogo/gost v1.3.0 h1:n90mIUWCPD69BqW8wJ43NDy0RgNxx02aAG4QJcJ785U= -github.com/dubbogo/gost v1.3.0/go.mod h1:R7wZm1DrmrKGr50mBZVcg6C9ekG8aL5hP+sgWcIDwQg= github.com/dubbogo/gost v1.5.1/go.mod h1:pPTjVyoJan3aPxBPNUX0ADkXjPibLo+/Ib0/fADXSG8= github.com/dubbogo/gost v1.5.2 h1:ri/03971hdpnn3QeCU+4UZgnRNGDXLDGDucR/iozZm8= github.com/dubbogo/gost v1.5.2/go.mod h1:pPTjVyoJan3aPxBPNUX0ADkXjPibLo+/Ib0/fADXSG8= @@ -317,8 +302,6 @@ github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6So github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= github.com/ryanuber/go-glob v0.0.0-20170128012129-256dc444b735/go.mod h1:807d1WSdnB0XRJzKNil9Om6lcp/3a0v4qIHxIXzX/Yc= -github.com/samuel/go-zookeeper v0.0.0-20180130194729-c4fab1ac1bec h1:6ncX5ko6B9LntYM0YBRXkiSaZMmLYeZ/NWcmeB43mMY= -github.com/samuel/go-zookeeper v0.0.0-20180130194729-c4fab1ac1bec/go.mod h1:gi+0XIa01GRL2eRQVjQkKGqKF3SF9vZR/HnPullcV2E= github.com/satori/go.uuid v1.2.0 h1:0uYX9dsZ2yD7q2RtLRtPSdGDWzjeM3TbMJP9utgA0ww= github.com/satori/go.uuid v1.2.0/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0= github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc= @@ -339,6 +322,7 @@ github.com/spf13/pflag v0.0.0-20170130214245-9ff6c6923cff/go.mod h1:DYY7MBk1bdzu github.com/spf13/pflag v1.0.2/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/objx v0.1.1 h1:2vfRuCMp5sSVIDSqO8oNnWJq7mPa6KVP3iPIwFBuy8A= github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/testify v0.0.0-20151208002404-e3a8ff8ce365/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= @@ -346,15 +330,18 @@ github.com/stretchr/testify v1.3.0 h1:TivCn/peBQ7UY8ooIcPgZFpTNSz0Q2U6UrFlUfqbe0 github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/stretchr/testify v1.4.0 h1:2E4SXV/wtOkTonXsotYi4li6zVWxYlZuYNCXe9XRJyk= github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= +github.com/stretchr/testify v1.5.1 h1:nOGnQDM7FYENwehXlg/kFVnos3rEvtKTjRvOWSzb6H4= github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= github.com/tebeka/strftime v0.1.3/go.mod h1:7wJm3dZlpr4l/oVK0t1HYIc4rMzQ2XJlOMIUJUJH6XQ= github.com/tent/http-link-go v0.0.0-20130702225549-ac974c61c2f9/go.mod h1:RHkNRtSLfOK7qBTHaeSX1D6BNpI3qw7NTxsmNr4RvN8= +github.com/tevid/gohamcrest v1.1.1 h1:ou+xSqlIw1xfGTg1uq1nif/htZ2S3EzRqLm2BP+tYU0= github.com/tevid/gohamcrest v1.1.1/go.mod h1:3UvtWlqm8j5JbwYZh80D/PVBt0mJ1eJiYgZMibh0H/k= github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= github.com/toolkits/concurrent v0.0.0-20150624120057-a4371d70e3e3/go.mod h1:QDlpd3qS71vYtakd2hmdpqhJ9nwv6mD6A30bQ1BPBFE= github.com/tv42/httpunix v0.0.0-20150427012821-b75d8614f926/go.mod h1:9ESjWnEqriFuLhtthL60Sar/7RFoluCcXsuvEwTV5KM= github.com/vmware/govmomi v0.18.0/go.mod h1:URlwyTFZX72RmxtxuaFL2Uj3fD1JTvZdx59bHWk6aFU= github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU= +github.com/zouyx/agollo v0.0.0-20191114083447-dde9fc9f35b8 h1:k8TV7Gz7cpWpOw/dz71fx8cCZdWoPuckHJ/wkJl+meg= github.com/zouyx/agollo v0.0.0-20191114083447-dde9fc9f35b8/go.mod h1:S1cAa98KMFv4Sa8SbJ6ZtvOmf0VlgH0QJ1gXI0lBfBY= go.etcd.io/bbolt v1.3.3/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= go.etcd.io/etcd v3.3.13+incompatible/go.mod h1:yaeTdrJi5lOmYerz05bd8+V7KubZs8YSFZfzsF9A6aI= @@ -387,12 +374,12 @@ golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73r golang.org/x/net v0.0.0-20181201002055-351d144fa1fc/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20181220203305-927f97764cc3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190320064053-1272bf9dcd53/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190620200207-3b0461eec859 h1:R/3boaszxrf1GEUWTVDzSKVwLmSJpwZ1yqXm8j0v2QI= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190628185345-da137c7871d7 h1:rTIdg5QFRR7XCaK4LCjBiPbx8j4DQRpdYMnGn/bJUEU= golang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/oauth2 v0.0.0-20170807180024-9a379c6b3e95/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= From 81a9698ad20d96ca18d6c97d5d69a8e5a253b377 Mon Sep 17 00:00:00 2001 From: pantianying <601666418@qq.com> Date: Tue, 7 Apr 2020 10:06:11 +0800 Subject: [PATCH 013/227] fix fmt --- dubbo/call.go | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/dubbo/call.go b/dubbo/call.go index 4c87ea1d3..98025f441 100644 --- a/dubbo/call.go +++ b/dubbo/call.go @@ -23,8 +23,8 @@ type InvokeData struct { func (d *GenericClientPool) Call(inData InvokeData) (resp interface{}, ret int) { var err error c := d.Get(inData.InterfaceName, inData.Version, inData.Group) - ctx:=context.Background() - resp, err = c.Invoke(ctx,[]interface{}{inData.Method, inData.ParameterTypes, inData.ReqData}) + ctx := context.Background() + resp, err = c.Invoke(ctx, []interface{}{inData.Method, inData.ParameterTypes, inData.ReqData}) if err != nil { ret = errcode.ServerBusy logger.Errorf("GenericClient call get err:%v, InvokeData:%+v", err, inData) @@ -94,7 +94,7 @@ func mapIItoMapSI(in interface{}) interface{} { } s := fmt.Sprint(k) if s == "class" { - //ignore the "class" field + // ignore the "class" field continue } vt := reflect.TypeOf(v) @@ -120,7 +120,7 @@ func mapIItoMapSI(in interface{}) interface{} { return outMap } -//traverse all the keys in the map and change the hump to underline +// traverse all the keys in the map and change the hump to underline func humpToLine(in interface{}) interface{} { var m map[string]interface{} From 9c5046fc0b96fc42217e6b9f907140176e42cb39 Mon Sep 17 00:00:00 2001 From: tiecheng <18768171164@163.com> Date: Tue, 1 Sep 2020 19:53:19 +0800 Subject: [PATCH 014/227] first commit for new proxy --- .travis.yml | 2 +- cmd/proxy/control.go | 83 ++++ cmd/proxy/proxy.go | 49 +++ common/config/config.go | 36 -- common/constant/constant.go | 5 - common/errcode/errcode.go | 20 - common/util/transtype.go | 1 - common/util/util.go | 70 ---- conf/proxy.yml | 9 - configs/api_config.yaml | 5 + {conf => configs}/client.yml | 23 +- configs/conf.yaml | 49 +++ {conf => configs}/log.yml | 56 +-- dubbo/apache_dubbo_generic_exception.go | 32 -- dubbo/call_test.go | 80 ---- dubbo/dubbo.go | 93 ----- go.mod | 17 +- go.sum | 492 +++++++++++++++++------- main.go | 12 - {common => pkg}/logger/log.yml | 56 +-- {common => pkg}/logger/logger.go | 18 +- {common => pkg}/logger/logger_test.go | 2 +- {common => pkg}/logger/logging.go | 0 pkg/model/base.go | 119 ++++++ pkg/model/bootstrap.go | 36 ++ pkg/model/cluster.go | 49 +++ pkg/model/filter.go | 18 + pkg/model/health.go | 28 ++ pkg/model/http.go | 66 ++++ pkg/model/lb.go | 27 ++ pkg/model/listener.go | 10 + pkg/model/log.go | 20 + pkg/model/match.go | 41 ++ pkg/model/router.go | 42 ++ pkg/model/tracing.go | 12 + pkg/model/types.go | 1 + pkg/proxy/api.go | 130 +++++++ pkg/proxy/api_filter.go | 51 +++ pkg/proxy/cache.go | 35 ++ dubbo/call.go => pkg/proxy/client.go | 58 +-- pkg/proxy/config_load.go | 170 ++++++++ pkg/proxy/config_load_test.go | 90 +++++ pkg/proxy/context.go | 197 ++++++++++ pkg/proxy/dubbo_client.go | 174 +++++++++ pkg/proxy/dubbo_filter.go | 51 +++ pkg/proxy/http.go | 29 ++ pkg/proxy/http_context.go | 126 ++++++ pkg/proxy/http_filter.go | 93 +++++ pkg/proxy/listener.go | 148 +++++++ pkg/proxy/logger_filter.go | 21 + pkg/proxy/proxy_start.go | 105 +++++ pkg/proxy/recovery_filter.go | 15 + pkg/proxy/router_filter.go | 79 ++++ pkg/service/discovery_service.go | 56 +++ pkg/types.go | 21 + service/context.go | 37 -- service/context/http_context.go | 123 ------ service/filter.go | 20 - service/filter/match_filter.go | 20 - service/metadata.go | 32 -- service/metadata/redis/redis.go | 54 --- service/proxy/http/http.go | 101 ----- 62 files changed, 2721 insertions(+), 994 deletions(-) create mode 100644 cmd/proxy/control.go create mode 100644 cmd/proxy/proxy.go delete mode 100644 common/config/config.go delete mode 100644 common/constant/constant.go delete mode 100644 common/errcode/errcode.go delete mode 100644 common/util/transtype.go delete mode 100644 common/util/util.go delete mode 100644 conf/proxy.yml create mode 100644 configs/api_config.yaml rename {conf => configs}/client.yml (80%) create mode 100644 configs/conf.yaml rename {conf => configs}/log.yml (94%) delete mode 100644 dubbo/apache_dubbo_generic_exception.go delete mode 100644 dubbo/call_test.go delete mode 100644 dubbo/dubbo.go delete mode 100644 main.go rename {common => pkg}/logger/log.yml (94%) rename {common => pkg}/logger/logger.go (86%) rename {common => pkg}/logger/logger_test.go (96%) rename {common => pkg}/logger/logging.go (100%) create mode 100644 pkg/model/base.go create mode 100644 pkg/model/bootstrap.go create mode 100644 pkg/model/cluster.go create mode 100644 pkg/model/filter.go create mode 100644 pkg/model/health.go create mode 100644 pkg/model/http.go create mode 100644 pkg/model/lb.go create mode 100644 pkg/model/listener.go create mode 100644 pkg/model/log.go create mode 100644 pkg/model/match.go create mode 100644 pkg/model/router.go create mode 100644 pkg/model/tracing.go create mode 100644 pkg/model/types.go create mode 100644 pkg/proxy/api.go create mode 100644 pkg/proxy/api_filter.go create mode 100644 pkg/proxy/cache.go rename dubbo/call.go => pkg/proxy/client.go (77%) create mode 100644 pkg/proxy/config_load.go create mode 100644 pkg/proxy/config_load_test.go create mode 100644 pkg/proxy/context.go create mode 100644 pkg/proxy/dubbo_client.go create mode 100644 pkg/proxy/dubbo_filter.go create mode 100644 pkg/proxy/http.go create mode 100644 pkg/proxy/http_context.go create mode 100644 pkg/proxy/http_filter.go create mode 100644 pkg/proxy/listener.go create mode 100644 pkg/proxy/logger_filter.go create mode 100644 pkg/proxy/proxy_start.go create mode 100644 pkg/proxy/recovery_filter.go create mode 100644 pkg/proxy/router_filter.go create mode 100644 pkg/service/discovery_service.go create mode 100644 pkg/types.go delete mode 100644 service/context.go delete mode 100644 service/context/http_context.go delete mode 100644 service/filter.go delete mode 100644 service/filter/match_filter.go delete mode 100644 service/metadata.go delete mode 100644 service/metadata/redis/redis.go delete mode 100644 service/proxy/http/http.go diff --git a/.travis.yml b/.travis.yml index 4849bb2e5..73dde9e14 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,7 +1,7 @@ language: go go: - - "1.13.x" + - "1.14.x" env: - GO111MODULE=on diff --git a/cmd/proxy/control.go b/cmd/proxy/control.go new file mode 100644 index 000000000..28f3c0544 --- /dev/null +++ b/cmd/proxy/control.go @@ -0,0 +1,83 @@ +package main + +import ( + "github.com/urfave/cli" + "runtime" +) + +import ( + "github.com/dubbogo/dubbo-go-proxy/pkg/logger" + "github.com/dubbogo/dubbo-go-proxy/pkg/proxy" +) + +var ( + flagToLogLevel = map[string]string{ + "trace": "TRACE", + "debug": "DEBUG", + "info": "INFO", + "warning": "WARN", + "error": "ERROR", + "critical": "FATAL", + } + + cmdStart = cli.Command{ + Name: "start", + Usage: "start dubbogo proxy", + Flags: []cli.Flag{ + cli.StringFlag{ + Name: "config, c", + Usage: "Load configuration from `FILE`", + EnvVar: "DUBBOGO_PROXY_CONFIG", + Value: "configs/proxy_config.json", + }, + cli.StringFlag{ + Name: "log-level, l", + Usage: "dubbogo proxy log level, trace|debug|info|warning|error|critical", + EnvVar: "LOG_LEVEL", + }, + cli.StringFlag{ + Name: "log-format, lf", + Usage: "dubbogo proxy log format, currently useless", + }, + cli.StringFlag{ + Name: "limit-cpus, limc", + Usage: "dubbogo proxy schedule threads count", + }, + }, + Action: func(c *cli.Context) error { + configPath := c.String("config") + flagLogLevel := c.String("log-level") + + bootstrap := proxy.Load(configPath) + if logLevel, ok := flagToLogLevel[flagLogLevel]; ok { + logger.SetLoggerLevel(logLevel) + } + + limitCpus := c.Int("limit-cpus") + if limitCpus <= 0 { + runtime.GOMAXPROCS(runtime.NumCPU()) + } else { + runtime.GOMAXPROCS(limitCpus) + } + + proxy.Start(bootstrap) + return nil + }, + } + + cmdStop = cli.Command{ + Name: "stop", + Usage: "stop dubbogo proxy", + Action: func(c *cli.Context) error { + return nil + }, + } + + cmdReload = cli.Command{ + Name: "reload", + Usage: "reconfiguration", + Action: func(c *cli.Context) error { + return nil + }, + } +) diff --git a/cmd/proxy/proxy.go b/cmd/proxy/proxy.go new file mode 100644 index 000000000..8454b0f83 --- /dev/null +++ b/cmd/proxy/proxy.go @@ -0,0 +1,49 @@ +package main + +import ( + "os" + "strconv" + "time" +) + +import ( + "github.com/urfave/cli" +) + +// Version proxy version +var Version = "0.1.0" + +func main() { + app := newProxyApp(&cmdStart) + + // ignore error so we don't exit non-zero and break gfmrun README example tests + _ = app.Run(os.Args) +} + +func newProxyApp(startCmd *cli.Command) *cli.App { + app := cli.NewApp() + app.Name = "dubbogo proxy" + app.Version = Version + app.Compiled = time.Now() + app.Copyright = "(c) " + strconv.Itoa(time.Now().Year()) + " Dubbogo" + app.Usage = "Dubbogo proxy is a lightweight gateway." + app.Flags = cmdStart.Flags + + //commands + app.Commands = []cli.Command{ + cmdStart, + cmdStop, + cmdReload, + } + + //action + app.Action = func(c *cli.Context) error { + if c.NumFlags() == 0 { + return cli.ShowAppHelp(c) + } + + return startCmd.Action.(func(c *cli.Context) error)(c) + } + + return app +} diff --git a/common/config/config.go b/common/config/config.go deleted file mode 100644 index 55a6215ec..000000000 --- a/common/config/config.go +++ /dev/null @@ -1,36 +0,0 @@ -package config - -import ( - "github.com/dubbogo/dubbo-go-proxy/common/logger" - "gopkg.in/yaml.v2" - "io/ioutil" -) - -var ( - confConFile = "./conf/proxy.yml" - Config *ProxyConfig -) - -type ProxyConfig struct { - HttpListenAddr string `yaml:"http.addr"` - - Retries string `yaml:"dubbo.retries" default:"0"` - ResultFiledHumpToLine bool `yaml:"dubbo.resultFiledHumpToLine" default:true` - - UseRedisMetadataCenter bool `yaml:"UseRedisMetadataCenter"` - RedisAddr string `yaml:"redis.addr"` - RedisPassword string `yaml:"redis.password"` -} - -func init() { - confFileStream, err := ioutil.ReadFile(confConFile) - if err != nil { - logger.Warn("get config err", err) - } - Config = &ProxyConfig{} - err = yaml.Unmarshal(confFileStream, Config) - if err != nil { - logger.Error("get config err", err) - } - logger.Debugf("read config :%+v", *Config) -} diff --git a/common/constant/constant.go b/common/constant/constant.go deleted file mode 100644 index 83e06d24c..000000000 --- a/common/constant/constant.go +++ /dev/null @@ -1,5 +0,0 @@ -package constant - -const ( - MatchFilterName = "MatchFilter" -) diff --git a/common/errcode/errcode.go b/common/errcode/errcode.go deleted file mode 100644 index faedc98c5..000000000 --- a/common/errcode/errcode.go +++ /dev/null @@ -1,20 +0,0 @@ -package errcode - -import "fmt" - -var ( - Success = 0 - NotFind = 404 - ServerBusy = 500 - ErrData = 501 -) -var errorMap = map[int]string{ - Success: "success", - ServerBusy: "server busy", - NotFind: "page not find", - ErrData: "request parameter error", -} - -func GetMsg(ret int) string { - return fmt.Sprintf(`{"code":%v,"msg":"%v"}`, ret, errorMap[ret]) -} diff --git a/common/util/transtype.go b/common/util/transtype.go deleted file mode 100644 index c7d868219..000000000 --- a/common/util/transtype.go +++ /dev/null @@ -1 +0,0 @@ -package util diff --git a/common/util/util.go b/common/util/util.go deleted file mode 100644 index ff853d0cd..000000000 --- a/common/util/util.go +++ /dev/null @@ -1,70 +0,0 @@ -package util - -import ( - jsoniter "github.com/json-iterator/go" - "reflect" - "strings" -) - -var json = jsoniter.ConfigCompatibleWithStandardLibrary - -func InterfaceTOInterface(in interface{}, out interface{}) error { - b, e := json.Marshal(in) - if e != nil { - return e - } - e = json.Unmarshal(b, out) - if e != nil { - return e - } - return e -} -func StructToJsonString(v interface{}) (string, error) { - jsonBody, err := json.Marshal(v) - if err != nil { - return "", err - } - return string(jsonBody), err -} -func ParseJsonByStruct(body []byte, v interface{}) error { - if err := json.Unmarshal(body, v); err != nil { - return err - } - return nil -} -func CheckStringInArray(s string, ss []string) bool { - for _, v := range ss { - if s == v { - return true - } - } - return false -} - -func Struct2Map(obj interface{}) map[string]interface{} { - t := reflect.TypeOf(obj) - v := reflect.ValueOf(obj) - - var data = make(map[string]interface{}) - for i := 0; i < t.NumField(); i++ { - data[t.Field(i).Name] = v.Field(i).Interface() - } - return data -} - -func FixPattern(restPattern string) string { - if len(restPattern) == 0 { - return restPattern - } - if restPattern[:1] != "/" { - restPattern = "/" + restPattern - } - return restPattern -} -func GetServiceName(interfaceName string) string { - ss := strings.Split(interfaceName, ".") - if len(ss) <= 3 { - return "" - } - return ss[2] -} diff --git a/conf/proxy.yml b/conf/proxy.yml deleted file mode 100644 index ac56a284e..000000000 --- a/conf/proxy.yml +++ /dev/null @@ -1,9 +0,0 @@ -http.addr: "127.0.0.1:8800" - -dubbo.retries: "2" -dubbo.resultFiledHumpToLine: true - - -useRedisMetadataCenter : false -redis.addr: "127.0.0.1:7000" -redis.password: "pty" diff --git a/configs/api_config.yaml b/configs/api_config.yaml new file mode 100644 index 000000000..b5e8a8749 --- /dev/null +++ b/configs/api_config.yaml @@ -0,0 +1,5 @@ +- name: "test-dubbo/user" + target: "queryUser" + method: "POST" + types: + - "com.ikurento.user.User" diff --git a/conf/client.yml b/configs/client.yml similarity index 80% rename from conf/client.yml rename to configs/client.yml index b572c340b..17e323f2d 100644 --- a/conf/client.yml +++ b/configs/client.yml @@ -3,24 +3,25 @@ check: true # client -request_timeout : "10s" +request_timeout: "10s" # connect timeout -connect_timeout : "3s" +connect_timeout: "3s" # application config application: - organization : "dubbogo" - name : "dubbo-go-proxy" - module : "dubbo-go-proxy" - version : "0.0.1" - owner : "PTY" - environment : "dev" + organization: "dubbogo" + name: "dubbo-go-proxy" + module: "dubbo-go-proxy" + version: "1.0.0" + group: "test" + owner: "PTY" + environment: "dev" -registries : +registries: "zk_1": protocol: "zookeeper" - timeout : "3s" - address: "127.0.0.1:2181" + timeout: "3s" + address: "127.0.0.1:2182" username: "" password: "" references: diff --git a/configs/conf.yaml b/configs/conf.yaml new file mode 100644 index 000000000..8a8ebc993 --- /dev/null +++ b/configs/conf.yaml @@ -0,0 +1,49 @@ +--- +static_resources: + listeners: + - name: "net/http" + address: + socket_address: + protocol_type: "HTTP" + address: "0.0.0.0" + port: 8888 + filter_chains: + - filter_chain_match: + domains: + - api.dubbo.com + - api.proxy.com + filters: + - name: dgp.filters.http_connect_manager + config: + route_config: + routes: + - match: + prefix: "/api/v1" + headers: + - name: "X-DGP-WAY" + value: "dubbo" + route: + cluster: "test_dubbo" + cluster_not_found_response_code: 505 + cors: + allow_origin: + - "*" + enabled: true + http_filters: + - name: dgp.filters.http.api + config: + - name: dgp.filters.http.router + config: + - name: dgp.filters.http_transfer_dubbo + config: + server_name: "test_http_dubbo" + generate_request_id: false + config: + idle_timeout: 5s + read_timeout: 5s + write_timeout: 5s + clusters: + - name: "test_dubbo" + type: "EDS" + lb_policy: "RoundRobin" + connect_timeout: "5s" diff --git a/conf/log.yml b/configs/log.yml similarity index 94% rename from conf/log.yml rename to configs/log.yml index 59fa4279a..3ed242d29 100644 --- a/conf/log.yml +++ b/configs/log.yml @@ -1,28 +1,28 @@ - -level: "debug" -development: true -disableCaller: false -disableStacktrace: false -sampling: -encoding: "console" - -# encoder -encoderConfig: - messageKey: "message" - levelKey: "level" - timeKey: "time" - nameKey: "logger" - callerKey: "caller" - stacktraceKey: "stacktrace" - lineEnding: "" - levelEncoder: "capitalColor" - timeEncoder: "iso8601" - durationEncoder: "seconds" - callerEncoder: "short" - nameEncoder: "" - -outputPaths: - - "stderr" -errorOutputPaths: - - "stderr" -initialFields: + +level: "debug" +development: true +disableCaller: false +disableStacktrace: false +sampling: +encoding: "console" + +# encoder +encoderConfig: + messageKey: "message" + levelKey: "level" + timeKey: "time" + nameKey: "logger" + callerKey: "caller" + stacktraceKey: "stacktrace" + lineEnding: "" + levelEncoder: "capitalColor" + timeEncoder: "iso8601" + durationEncoder: "seconds" + callerEncoder: "short" + nameEncoder: "" + +outputPaths: + - "stderr" +errorOutputPaths: + - "stderr" +initialFields: diff --git a/dubbo/apache_dubbo_generic_exception.go b/dubbo/apache_dubbo_generic_exception.go deleted file mode 100644 index dfc868c1a..000000000 --- a/dubbo/apache_dubbo_generic_exception.go +++ /dev/null @@ -1,32 +0,0 @@ -package dubbo - -import ( - hessian "github.com/apache/dubbo-go-hessian2" - "github.com/apache/dubbo-go-hessian2/java_exception" -) - -func init() { - hessian.RegisterPOJO(&ApacheDubboGenericException{}) -} - -type ApacheDubboGenericException struct { - SerialVersionUID int64 - DetailMessage string - SuppressedExceptions []java_exception.Throwabler - StackTrace []java_exception.StackTraceElement - Cause java_exception.Throwabler - ExceptionClass string - ExceptionMessage string -} - -func NewApacheDubboGenericException(exceptionClass, exceptionMessage string) *ApacheDubboGenericException { - return &ApacheDubboGenericException{ExceptionClass: exceptionClass, ExceptionMessage: exceptionMessage} -} - -func (e ApacheDubboGenericException) Error() string { - return e.DetailMessage -} - -func (ApacheDubboGenericException) JavaClassName() string { - return "org.apache.dubbo.rpc.service.GenericException" -} diff --git a/dubbo/call_test.go b/dubbo/call_test.go deleted file mode 100644 index 38ed73537..000000000 --- a/dubbo/call_test.go +++ /dev/null @@ -1,80 +0,0 @@ -package dubbo - -import ( - "encoding/json" - "github.com/stretchr/testify/assert" - "testing" -) - -var ( - testDealGerRespString1 = `{ - "devices": [{ - "activeTime": 1562521341000, - "bv": [{ - "name": "xxxx" - }] - }], - "limit": 12, - "offset": 0, - "pageNo": 1, - "page_size": 12, - "total": 17 -}` - exceptGerRespString2 = `{"devices":[{"active_time":1562521341000,"bv":[{"name":"xxxx"}]}],"limit":12,"offset":0,"page_no":1,"page_size":12,"total":17}` -) - -func TestDealResp(t *testing.T) { - func() { - var testTmp = make(map[string]interface{}) - e1 := json.Unmarshal([]byte(testDealGerRespString1), &testTmp) - assert.Equal(t, nil, e1) - out, e2 := dealResp(testTmp, true) - assert.Equal(t, nil, e2) - out2, e3 := json.Marshal(out) - assert.Equal(t, nil, e3) - assert.Equal(t, exceptGerRespString2, string(out2)) - }() - - func() { - type valueStu struct { - V string - } - testTmp := [][]map[interface{}]interface{}{ - { - { - "xxx": valueStu{}, - }, - }, - } - out, e2 := dealResp(testTmp, true) - assert.Equal(t, nil, e2) - out2, e3 := json.Marshal(out) - assert.Equal(t, nil, e3) - assert.Equal(t, "[[{\"xxx\":{\"v\":\"\"}}]]", string(out2)) - }() - func() { - type valueStu struct { - V string - } - testTmp := []map[interface{}]interface{}{ - { - "xxxx": valueStu{}, - }, - } - out, e2 := dealResp(testTmp, true) - assert.Equal(t, nil, e2) - out2, e3 := json.Marshal(out) - assert.Equal(t, nil, e3) - assert.Equal(t, "[{\"xxxx\":{\"v\":\"\"}}]", string(out2)) - }() -} -func Test_Map2xx_yy(t *testing.T) { - testMap := make(map[string]interface{}) - testData := `{"AaAa":"1","BaBa":"1","CaCa":{"BaBa":"2","AaAa":"2","XxYy":{"XxXx":"3","Xx":"3"}}}` - e := json.Unmarshal([]byte(testData), &testMap) - assert.Nil(t, nil) - m := humpToLine(testMap) - s, e := json.Marshal(m) - assert.Equal(t, e, nil) - assert.Equal(t, `{"aa_aa":"1","ba_ba":"1","ca_ca":{"aa_aa":"2","ba_ba":"2","xx_yy":{"xx":"3","xx_xx":"3"}}}`, string(s)) -} diff --git a/dubbo/dubbo.go b/dubbo/dubbo.go deleted file mode 100644 index 22d69541c..000000000 --- a/dubbo/dubbo.go +++ /dev/null @@ -1,93 +0,0 @@ -package dubbo - -import ( - "context" - "github.com/dubbogo/dubbo-go-proxy/common/config" - "strings" - "sync" - "time" -) - -import ( - _ "github.com/apache/dubbo-go/cluster/cluster_impl" - _ "github.com/apache/dubbo-go/cluster/loadbalance" - _ "github.com/apache/dubbo-go/common/logger" - _ "github.com/apache/dubbo-go/common/proxy/proxy_factory" - _ "github.com/apache/dubbo-go/config" - _ "github.com/apache/dubbo-go/filter/filter_impl" - _ "github.com/apache/dubbo-go/protocol/dubbo" - _ "github.com/apache/dubbo-go/registry/protocol" - _ "github.com/apache/dubbo-go/registry/zookeeper" -) -import ( - "github.com/apache/dubbo-go/common/constant" - dg "github.com/apache/dubbo-go/config" - "github.com/apache/dubbo-go/protocol/dubbo" -) - -var ( - Client GenericClientPool - dgCfg dg.ConsumerConfig -) - -type GenericClientPool struct { - mLock sync.RWMutex - GenericServicePool map[string]*dg.GenericService -} - -func (d *GenericClientPool) Init() { - dgCfg = dg.GetConsumerConfig() - //can change config here - dg.SetConsumerConfig(dgCfg) - dg.Load() - d.GenericServicePool = make(map[string]*dg.GenericService) -} - -func (d *GenericClientPool) get(appName string) *dg.GenericService { - d.mLock.RLock() - defer d.mLock.RUnlock() - return d.GenericServicePool[appName] -} -func (d *GenericClientPool) check(appName string) bool { - d.mLock.RLock() - defer d.mLock.RUnlock() - if _, ok := d.GenericServicePool[appName]; ok { - return true - } else { - return false - } -} -func (d *GenericClientPool) create(interfaceName, version, group string) *dg.GenericService { - key := strings.Join([]string{interfaceName, version, group}, "_") - referenceConfig := dg.NewReferenceConfig(interfaceName, context.TODO()) - referenceConfig.InterfaceName = interfaceName - referenceConfig.Cluster = constant.DEFAULT_CLUSTER - var registers []string - for k := range dgCfg.Registries { - registers = append(registers, k) - } - referenceConfig.Registry = strings.Join(registers, ",") - referenceConfig.Protocol = dubbo.DUBBO - referenceConfig.Version = version - referenceConfig.Generic = true - referenceConfig.Retries = config.Config.Retries - d.mLock.Lock() - defer d.mLock.Unlock() - referenceConfig.GenericLoad(interfaceName) - time.Sleep(200 * time.Millisecond) //sleep to wait invoker create - clientService := referenceConfig.GetRPCService().(*dg.GenericService) - - d.GenericServicePool[key] = clientService - return clientService -} - -/* todo 预注册加载配置,能够提前和zk,避免接口首次请求时时间慢*/ - -func (d *GenericClientPool) Get(interfaceName, version, group string) *dg.GenericService { - key := strings.Join([]string{interfaceName, version, group}, "_") - if d.check(key) { - return d.get(key) - } else { - return d.create(interfaceName, version, group) - } -} diff --git a/go.mod b/go.mod index 03e354ebe..2129b0bd4 100644 --- a/go.mod +++ b/go.mod @@ -1,15 +1,14 @@ module github.com/dubbogo/dubbo-go-proxy -go 1.12 +go 1.14 require ( - github.com/apache/dubbo-go v1.4.0-rc1 - github.com/apache/dubbo-go-hessian2 v1.4.0 - github.com/dubbogo/getty v1.3.3 - github.com/go-redis/redis v6.15.6+incompatible - github.com/json-iterator/go v1.1.9 - github.com/pkg/errors v0.8.1 + github.com/apache/dubbo-go v1.5.1 + github.com/ghodss/yaml v1.0.1-0.20190212211648-25d852aebe32 + github.com/goinggo/mapstructure v0.0.0-20140717182941-194205d9b4a9 + github.com/pkg/errors v0.9.1 github.com/stretchr/testify v1.5.1 - go.uber.org/zap v1.13.0 - gopkg.in/yaml.v2 v2.2.7 + github.com/urfave/cli v1.22.4 + go.uber.org/zap v1.15.0 + gopkg.in/yaml.v2 v2.2.8 ) diff --git a/go.sum b/go.sum index 2f94a6237..8d782caea 100644 --- a/go.sum +++ b/go.sum @@ -1,20 +1,47 @@ cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= -github.com/Azure/azure-sdk-for-go v16.0.0+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc= -github.com/Azure/go-ansiterm v0.0.0-20170929234023-d6e3b3328b78/go.mod h1:LmzpDX56iTiv29bbRTIsUNlaFfuhWRQBWjQdVyAevI8= -github.com/Azure/go-autorest v10.7.0+incompatible/go.mod h1:r+4oMnoxhatjLLJ6zxSWATqVooLgysK6ZNox3g/xq24= -github.com/Azure/go-autorest v10.15.3+incompatible/go.mod h1:r+4oMnoxhatjLLJ6zxSWATqVooLgysK6ZNox3g/xq24= -github.com/BurntSushi/toml v0.3.1 h1:WXkYYl6Yr3qBf1K79EBnL4mak0OimBfB0XUf9Vl28OQ= +cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= +cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU= +cloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU= +cloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY= +cloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc= +cloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0= +cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o= +cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= +cloud.google.com/go/firestore v1.1.0/go.mod h1:ulACoGHTpvq5r8rxGJ4ddJZBZqakUQqClKRT5SZwBmk= +cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I= +cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw= +dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= +github.com/Azure/azure-sdk-for-go v40.3.0+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc= +github.com/Azure/go-autorest/autorest v0.9.0/go.mod h1:xyHB1BMZT0cuDHU7I0+g046+BFDTQ8rEZB0s4Yfa6bI= +github.com/Azure/go-autorest/autorest v0.9.3/go.mod h1:GsRuLYvwzLjjjRoWEIyMUaYq8GNUx2nRB378IPt/1p0= +github.com/Azure/go-autorest/autorest v0.10.0/go.mod h1:/FALq9T/kS7b5J5qsQ+RSTUdAmGFqi0vUdVNNx8q630= +github.com/Azure/go-autorest/autorest/adal v0.5.0/go.mod h1:8Z9fGy2MpX0PvDjB1pEgQTmVqjGhiHBW7RJJEciWzS0= +github.com/Azure/go-autorest/autorest/adal v0.8.0/go.mod h1:Z6vX6WXXuyieHAXwMj0S6HY6e6wcHn37qQMBQlvY3lc= +github.com/Azure/go-autorest/autorest/adal v0.8.1/go.mod h1:ZjhuQClTqx435SRJ2iMlOxPYt3d2C/T/7TiQCVZSn3Q= +github.com/Azure/go-autorest/autorest/adal v0.8.2/go.mod h1:ZjhuQClTqx435SRJ2iMlOxPYt3d2C/T/7TiQCVZSn3Q= +github.com/Azure/go-autorest/autorest/azure/auth v0.4.2/go.mod h1:90gmfKdlmKgfjUpnCEpOJzsUEjrWDSLwHIG73tSXddM= +github.com/Azure/go-autorest/autorest/azure/cli v0.3.1/go.mod h1:ZG5p860J94/0kI9mNJVoIoLgXcirM2gF5i2kWloofxw= +github.com/Azure/go-autorest/autorest/date v0.1.0/go.mod h1:plvfp3oPSKwf2DNjlBjWF/7vwR+cUD/ELuzDCXwHUVA= +github.com/Azure/go-autorest/autorest/date v0.2.0/go.mod h1:vcORJHLJEh643/Ioh9+vPmf1Ij9AEBM5FuBIXLmIy0g= +github.com/Azure/go-autorest/autorest/mocks v0.1.0/go.mod h1:OTyCOPRA2IgIlWxVYxBee2F5Gr4kF2zd2J5cFRaIDN0= +github.com/Azure/go-autorest/autorest/mocks v0.2.0/go.mod h1:OTyCOPRA2IgIlWxVYxBee2F5Gr4kF2zd2J5cFRaIDN0= +github.com/Azure/go-autorest/autorest/mocks v0.3.0/go.mod h1:a8FDP3DYzQ4RYfVAxAN3SVSiiO77gL2j2ronKKP0syM= +github.com/Azure/go-autorest/autorest/to v0.3.0/go.mod h1:MgwOyqaIuKdG4TL/2ywSsIWKAfJfgHDo8ObuUk3t5sA= +github.com/Azure/go-autorest/autorest/validation v0.2.0/go.mod h1:3EEqHnBxQGHXRYq3HT1WyXAvT7LLY3tl70hw6tQIbjI= +github.com/Azure/go-autorest/logger v0.1.0/go.mod h1:oExouG+K6PryycPJfVSxi/koC6LSNgds39diKLz7Vrc= +github.com/Azure/go-autorest/tracing v0.5.0/go.mod h1:r/s2XiOKccPW3HrqB+W0TQzfbtp2fGCgRFtBroKn4Dk= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= +github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= github.com/DataDog/datadog-go v2.2.0+incompatible/go.mod h1:LButxg5PwREeZtORoXG3tL4fMGNddJ+vMq1mwgfaqoQ= -github.com/Jeffail/gabs v1.1.0/go.mod h1:6xMvQMK4k33lb7GUUpaAPh6nKMmemQeg5d4gn7/bOXc= +github.com/DataDog/datadog-go v3.2.0+incompatible/go.mod h1:LButxg5PwREeZtORoXG3tL4fMGNddJ+vMq1mwgfaqoQ= github.com/Microsoft/go-winio v0.4.3/go.mod h1:VhR8bwka0BXejwEJY73c50VrPtXAaKcyvVC4A4RozmA= +github.com/Microsoft/go-winio v0.4.13/go.mod h1:qXqCSQ3Xa7+6tgxaGTIe4Kpcdsi+P8jBhyzoq1bpyYA= github.com/NYTimes/gziphandler v0.0.0-20170623195520-56545f4a5d46/go.mod h1:3wb06e3pkSAbeQ52E9H9iFoQsEEwGN64994WTCIhntQ= github.com/NYTimes/gziphandler v1.0.1/go.mod h1:3wb06e3pkSAbeQ52E9H9iFoQsEEwGN64994WTCIhntQ= -github.com/Nvveen/Gotty v0.0.0-20120604004816-cd527374f1e5/go.mod h1:lmUJ/7eu/Q8D7ML55dXQrVaamCz2vxCfdQBasLZfHKk= +github.com/NYTimes/gziphandler v1.1.1/go.mod h1:n/CVRwUEOgIxrgPvAQhUUr9oeUtvrhMomdKFjzJNB0c= +github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= github.com/PuerkitoBio/purell v1.0.0/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= github.com/PuerkitoBio/urlesc v0.0.0-20160726150825-5bd2802263f2/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE= -github.com/SAP/go-hdb v0.12.0/go.mod h1:etBT+FAi1t5k3K3tf5vQTnosgYmhDkRi8jEnQqCnxF0= -github.com/SermoDigital/jose v0.0.0-20180104203859-803625baeddc/go.mod h1:ARgCUhI1MHQH+ONky/PAtmVHQrP5JlGY0F3poXOp/fA= github.com/StackExchange/wmi v0.0.0-20180116203802-5d049714c4a6/go.mod h1:3eOhrUMpNV+6aFIbp5/iudMxNCF27Vw2OZgy4xEx0Fg= github.com/Workiva/go-datastructures v1.0.50 h1:slDmfW6KCHcC7U+LP3DDBbm4fqTwZGn1beOFPfGaLvo= github.com/Workiva/go-datastructures v1.0.50/go.mod h1:Z+F2Rca0qCsVYDS8z7bAGm8f3UkzuWYS/oBZz5a7VVA= @@ -23,370 +50,507 @@ github.com/afex/hystrix-go v0.0.0-20180502004556-fa1af6a1f4f5 h1:rFw4nCn9iMW+Vaj github.com/afex/hystrix-go v0.0.0-20180502004556-fa1af6a1f4f5/go.mod h1:SkGFH1ia65gfNATL8TAiHDNxPzPdmEL5uirI2Uyuz6c= github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= -github.com/aliyun/alibaba-cloud-sdk-go v0.0.0-20190802083043-4cd0c391755e/go.mod h1:myCDvQSzCW+wB1WAlocEru4wMGJxy+vlxHdhegi1CDQ= -github.com/aliyun/aliyun-oss-go-sdk v0.0.0-20190307165228-86c17b95fcd5/go.mod h1:T/Aws4fEfogEE9v+HPhhw+CntffsBHJ8nXQCwKr0/g8= -github.com/apache/dubbo-go v1.4.0-rc1 h1:kSUhKKJjB0hokjpOgb/iIiP0RQ849dm6WplHsd0Kb1A= -github.com/apache/dubbo-go v1.4.0-rc1/go.mod h1:hzP9PQkcYFcBUgedttDeimugDNqbmGzh18QQy/vBjnw= -github.com/apache/dubbo-go-hessian2 v1.4.0 h1:Cb9FQVTy3G93dnDr7P93U8DeKFYpDTJjQp44JG5TafA= -github.com/apache/dubbo-go-hessian2 v1.4.0/go.mod h1:VwEnsOMidkM1usya2uPfGpSLO9XUF//WQcWn3y+jFz8= +github.com/aliyun/alibaba-cloud-sdk-go v1.61.18/go.mod h1:v8ESoHo4SyHmuB4b1tJqDHxfTGEciD+yhvOU/5s1Rfk= +github.com/apache/dubbo-getty v1.3.10 h1:ys5mwjPdxG/KwkPjS6EI0RzQtU6p6FCPoKpaFEzpAL0= +github.com/apache/dubbo-getty v1.3.10/go.mod h1:x6rraK01BL5C7jUM2fPl5KMkAxLVIx54ZB8/XEOik9Y= +github.com/apache/dubbo-go v1.5.1 h1:9bcGOkek0+x+zqtvykKpuOwkoJfMef0zNxsyPbWOafY= +github.com/apache/dubbo-go v1.5.1/go.mod h1:lxwgtF+27mSFQsSrBLaVbdQpwCp+pBN/mHP4w4/N2Qc= +github.com/apache/dubbo-go-hessian2 v1.6.2 h1:i7F5GjVaUatLQz1x9vUmmSIFj49L8J6rVICdF6xw4qw= +github.com/apache/dubbo-go-hessian2 v1.6.2/go.mod h1:7rEw9guWABQa6Aqb8HeZcsYPHsOS7XT1qtJvkmI6c5w= github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o= +github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8= github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY= github.com/armon/go-metrics v0.0.0-20190430140413-ec5e00d3c878/go.mod h1:3AMJUQhVx52RsWOnlkpikZr01T/yAVN2gn0861vByNg= +github.com/armon/go-metrics v0.3.0/go.mod h1:zXjbSimjXTd7vOpY8B0/2LpvNvDoXBuplAD+gJD3GYs= github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= -github.com/asaskevich/govalidator v0.0.0-20180319081651-7d2e70ef918f/go.mod h1:lB+ZfQJz7igIIfQNfa7Ml4HSf2uFQQRzpGGRXenZAgY= -github.com/aws/aws-sdk-go v1.15.24/go.mod h1:mFuSZ37Z9YOHbQEwBWztmVzqXrEkub65tZoCYDt7FT0= -github.com/baiyubin/aliyun-sts-go-sdk v0.0.0-20180326062324-cfa1a18b161f/go.mod h1:AuiFmCCPBSrqvVMvuqFuk0qogytodnVFVSN5CeJB8Gc= +github.com/armon/go-radix v1.0.0/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= +github.com/aws/aws-sdk-go v1.25.41/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= -github.com/bitly/go-hostpool v0.0.0-20171023180738-a3a6125de932/go.mod h1:NOuUCSz6Q9T7+igc/hlvDOUdtWKryOrtFyIVABv/p7k= -github.com/bmizerany/assert v0.0.0-20160611221934-b7ed37b82869/go.mod h1:Ekp36dRnpXw/yCqJaO+ZrUyxD+3VXMFFr56k5XYrpB4= +github.com/bketelsen/crypt v0.0.3-0.20200106085610-5cbc8cc4026c/go.mod h1:MKsuJmJgSg28kpZDP6UIiPt0e0Oz0kqKNGyRaWEPv84= github.com/boltdb/bolt v1.3.1/go.mod h1:clJnj/oiGkjum5o1McbSZDSLxVThjynRyGBgiAx27Ps= github.com/buger/jsonparser v0.0.0-20181115193947-bf1c66bbce23/go.mod h1:bbYlZJ7hK1yFx9hf58LP0zeX7UjIGs20ufpu3evjr+s= -github.com/cenkalti/backoff v2.1.1+incompatible/go.mod h1:90ReRw6GdpyfrHakVjL/QHaoyV4aDUVVkXQJJJ3NXXM= +github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= github.com/circonus-labs/circonus-gometrics v2.3.1+incompatible/go.mod h1:nmEj6Dob7S7YxXgwXpfOuvO54S+tGdZdw9fuRZt25Ag= github.com/circonus-labs/circonusllhist v0.1.3/go.mod h1:kMXHVDlOchFAehlya5ePtbp5jckzBHf4XRpQvBOLI+I= github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= -github.com/containerd/continuity v0.0.0-20181203112020-004b46473808/go.mod h1:GL3xCUCBDV3CZiTSEKksMWbLE66hEyuu9qyDOOqM47Y= +github.com/cockroachdb/apd v1.1.0/go.mod h1:8Sl8LxpKi29FqWXR16WEFZRNSz3SoPzUzeMeY4+DwBQ= github.com/coredns/coredns v1.1.2/go.mod h1:zASH/MVDgR6XZTbxvOnsZfffS+31vg6Ackf/wo1+AM0= +github.com/coreos/bbolt v1.3.2/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk= github.com/coreos/bbolt v1.3.3/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk= +github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= github.com/coreos/etcd v3.3.13+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= +github.com/coreos/go-etcd v2.0.0+incompatible/go.mod h1:Jez6KQU2B/sWsbdaef3ED8NzMklzPG4d5KIOhIy30Tk= +github.com/coreos/go-oidc v2.1.0+incompatible/go.mod h1:CgnwVTmzoESiwO9qyAFEMiHoZ1nMCKZlZ9V6mm3/LKc= +github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= +github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= github.com/coreos/go-systemd v0.0.0-20190719114852-fd7a80b32e1f/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= +github.com/cpuguy83/go-md2man v1.0.10 h1:BSKMNlYxDvnunlTymqtgONjNnaRV1sTpcovwwjF22jk= +github.com/cpuguy83/go-md2man v1.0.10/go.mod h1:SmD6nW6nTyfqj6ABTjUi3V3JVMnlJmwcJI5acqYI6dE= +github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d h1:U+s90UTSYgptZMwQh2aRr3LuazLJIa+Pg3Kc1ylSYVY= +github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= github.com/creasty/defaults v1.3.0 h1:uG+RAxYbJgOPCOdKEcec9ZJXeva7Y6mj/8egdzwmLtw= github.com/creasty/defaults v1.3.0/go.mod h1:CIEEvs7oIVZm30R8VxtFJs+4k201gReYyuYHJxZc68I= github.com/davecgh/go-spew v0.0.0-20151105211317-5215b55f46b2/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/denisenkom/go-mssqldb v0.0.0-20180620032804-94c9c97e8c9f/go.mod h1:xN/JuLBIz4bjkxNmByTiV1IbhfnYb6oo99phBn4Eqhc= github.com/denverdino/aliyungo v0.0.0-20170926055100-d3308649c661/go.mod h1:dV8lFg6daOBZbT6/BDGIz6Y3WFGn8juu6G+CQ6LHtl0= github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= +github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no= github.com/digitalocean/godo v1.1.1/go.mod h1:h6faOIcZ8lWIwNQ+DN7b3CgX4Kwby5T+nbpNqkUIozU= github.com/digitalocean/godo v1.10.0/go.mod h1:h6faOIcZ8lWIwNQ+DN7b3CgX4Kwby5T+nbpNqkUIozU= +github.com/dimchansky/utfbom v1.1.0/go.mod h1:rO41eb7gLfo8SF1jd9F8HplJm1Fewwi4mQvIirEdv+8= +github.com/dnaeon/go-vcr v1.0.1/go.mod h1:aBB1+wY4s93YsC3HHjMBMrwTj2R9FHDzUr9KyGc8n1E= github.com/docker/go-connections v0.3.0/go.mod h1:Gbd7IOopHjR8Iph03tsViu4nIes5XhDvyHbTtUxmeec= -github.com/docker/go-units v0.3.3/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= -github.com/dubbogo/getty v1.3.3 h1:8m4zZBqFHO+NmhH7rMPlFuuYRVjcPD7cUhumevqMZZs= -github.com/dubbogo/getty v1.3.3/go.mod h1:U92BDyJ6sW9Jpohr2Vlz8w2uUbIbNZ3d+6rJvFTSPp0= -github.com/dubbogo/go-zookeeper v1.0.0 h1:RsYdlGwhDW+iKXM3eIIcvt34P2swLdmQfuIJxsHlGoM= -github.com/dubbogo/go-zookeeper v1.0.0/go.mod h1:fn6n2CAEer3novYgk9ULLwAjuV8/g4DdC2ENwRb6E+c= -github.com/dubbogo/gost v1.5.1/go.mod h1:pPTjVyoJan3aPxBPNUX0ADkXjPibLo+/Ib0/fADXSG8= -github.com/dubbogo/gost v1.5.2 h1:ri/03971hdpnn3QeCU+4UZgnRNGDXLDGDucR/iozZm8= -github.com/dubbogo/gost v1.5.2/go.mod h1:pPTjVyoJan3aPxBPNUX0ADkXjPibLo+/Ib0/fADXSG8= -github.com/duosecurity/duo_api_golang v0.0.0-20190308151101-6c680f768e74/go.mod h1:UqXY1lYT/ERa4OEAywUqdok1T4RCRdArkhic1Opuavo= +github.com/docker/go-connections v0.4.0/go.mod h1:Gbd7IOopHjR8Iph03tsViu4nIes5XhDvyHbTtUxmeec= +github.com/docker/spdystream v0.0.0-20160310174837-449fdfce4d96/go.mod h1:Qh8CwZgvJUkLughtfhJv5dyTYa91l1fOUCrgjqmcifM= +github.com/dubbogo/go-zookeeper v1.0.1 h1:irLzvOsDOTNsN8Sv9tvYYxVu6DCQfLtziZQtUHmZgz8= +github.com/dubbogo/go-zookeeper v1.0.1/go.mod h1:fn6n2CAEer3novYgk9ULLwAjuV8/g4DdC2ENwRb6E+c= +github.com/dubbogo/gost v1.9.0/go.mod h1:pPTjVyoJan3aPxBPNUX0ADkXjPibLo+/Ib0/fADXSG8= +github.com/dubbogo/gost v1.9.1 h1:0/PPFo13zPbjt4Ia0zYWMFi3C6rAe9X7O1J2Iv+BHNM= +github.com/dubbogo/gost v1.9.1/go.mod h1:pPTjVyoJan3aPxBPNUX0ADkXjPibLo+/Ib0/fADXSG8= +github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= github.com/elazarl/go-bindata-assetfs v0.0.0-20160803192304-e1a2a7ec64b0/go.mod h1:v+YaWX3bdea5J/mo8dSETolEo7R71Vk1u8bnjau5yw4= +github.com/elazarl/go-bindata-assetfs v1.0.0/go.mod h1:v+YaWX3bdea5J/mo8dSETolEo7R71Vk1u8bnjau5yw4= +github.com/elazarl/goproxy v0.0.0-20170405201442-c4fc26588b6e/go.mod h1:/Zj4wYkgs4iZTTu3o/KG3Itv/qCCa8VVMlb3i9OVuzc= github.com/emicklei/go-restful v0.0.0-20170410110728-ff4f55a20633/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs= github.com/emicklei/go-restful/v3 v3.0.0/go.mod h1:6n3XBCmQQb25CM2LCACGz8ukIrRry+4bhvbpWn3mrbc= github.com/envoyproxy/go-control-plane v0.8.0/go.mod h1:GSSbY9P1neVhdY7G4wu+IK1rk/dqhiCC/4ExuWJZVuk= github.com/envoyproxy/protoc-gen-validate v0.0.14/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= +github.com/evanphx/json-patch v4.2.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= github.com/fastly/go-utils v0.0.0-20180712184237-d95a45783239/go.mod h1:Gdwt2ce0yfBxPvZrHkprdPPTTS3N5rwmLE8T22KBXlw= github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= -github.com/fatih/structs v0.0.0-20180123065059-ebf56d35bba7/go.mod h1:9NiDSp5zOcgEDl+j00MP/WkGVPOlPRLejGD8Ga6PJ7M= -github.com/fsnotify/fsnotify v1.4.7 h1:IXs+QLmnXW2CcXuY+8Mzv/fWEsPGWxqefPtCP5CnV9I= +github.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL+zU= +github.com/fatih/structs v1.1.0/go.mod h1:9NiDSp5zOcgEDl+j00MP/WkGVPOlPRLejGD8Ga6PJ7M= +github.com/frankban/quicktest v1.4.1/go.mod h1:36zfPVQyHxymz4cH7wlDmVwDrJuljRB60qkgn7rorfQ= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= github.com/ghodss/yaml v0.0.0-20150909031657-73d445a93680/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= +github.com/ghodss/yaml v1.0.1-0.20190212211648-25d852aebe32 h1:Mn26/9ZMNWSw9C9ERFA1PUxfmGpolnw2v0bKOREu5ew= +github.com/ghodss/yaml v1.0.1-0.20190212211648-25d852aebe32/go.mod h1:GIjDIg/heH5DOkXY3YJ/wNhfHsQHoXGjl8G8amsYQ1I= +github.com/go-asn1-ber/asn1-ber v1.3.1/go.mod h1:hEBeB/ic+5LoWskz+yKT7vGhhPYkProFKoKdwZRWMe0= +github.com/go-co-op/gocron v0.1.1/go.mod h1:Y9PWlYqDChf2Nbgg7kfS+ZsXHDTZbMZYPEQ0MILqH+M= github.com/go-errors/errors v1.0.1/go.mod h1:f4zRHt4oKfwPJE5k8C9vpYG+aDHdBFUsgrm6/TyX73Q= -github.com/go-ini/ini v1.25.4/go.mod h1:ByCAeIL28uOIIG0E3PJtZPDL8WnHpFKFOtgjp+3Ies8= +github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= github.com/go-ldap/ldap v3.0.2+incompatible/go.mod h1:qfd9rJvER9Q0/D/Sqn1DfHRoBp40uXYvFoEVrNEPqRc= +github.com/go-ldap/ldap/v3 v3.1.3/go.mod h1:3rbOH3jRS2u6jg2rJnKAMLE/xQyCKIveG2Sa/Cohzb8= github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= +github.com/go-logr/logr v0.1.0/go.mod h1:ixOQHD9gLJUVQQ2ZOR7zLEifBX6tGkNJF4QyIY7sIas= github.com/go-ole/go-ole v1.2.1/go.mod h1:7FAglXiTm7HKlQRDeOQ6ZNUHidzCWXuZWq/1dTyBNF8= github.com/go-openapi/jsonpointer v0.0.0-20160704185906-46af16f9f7b1/go.mod h1:+35s3my2LFTysnkMfxsJBAMHj/DoqoB9knIWoYG/Vk0= github.com/go-openapi/jsonreference v0.0.0-20160704190145-13c6e3589ad9/go.mod h1:W3Z9FmVs9qj+KR4zFKmDPGiLdk1D9Rlm7cyMvf57TTg= github.com/go-openapi/spec v0.0.0-20160808142527-6aced65f8501/go.mod h1:J8+jY1nAiCcj+friV/PDoE1/3eeccG9LYBs0tYvLOWc= github.com/go-openapi/swag v0.0.0-20160704191624-1d0bd113de87/go.mod h1:DXUve3Dpr1UfpPtxFw+EFuQ41HhCWZfha5jSVRG7C7I= -github.com/go-redis/redis v6.15.6+incompatible h1:H9evprGPLI8+ci7fxQx6WNZHJSb7be8FqJQRhdQZ5Sg= -github.com/go-redis/redis v6.15.6+incompatible/go.mod h1:NAIEuMOZ/fxfXJIrKDQDz8wamY7mA7PouImQ2Jvg6kA= +github.com/go-redis/redis v6.15.5+incompatible/go.mod h1:NAIEuMOZ/fxfXJIrKDQDz8wamY7mA7PouImQ2Jvg6kA= github.com/go-resty/resty/v2 v2.1.0/go.mod h1:dZGr0i9PLlaaTD4H/hoZIDjQ+r6xq8mgbRzHZf7f2J8= -github.com/go-sql-driver/mysql v0.0.0-20180618115901-749ddf1598b4/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w= github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= +github.com/go-test/deep v1.0.2-0.20181118220953-042da051cf31/go.mod h1:wGDj63lr65AM2AQyKZd/NYHGb0R+1RLqB8NKt3aSFNA= github.com/go-test/deep v1.0.2/go.mod h1:wGDj63lr65AM2AQyKZd/NYHGb0R+1RLqB8NKt3aSFNA= -github.com/gocql/gocql v0.0.0-20180617115710-e06f8c1bcd78/go.mod h1:4Fw1eo5iaEhDUs8XyuhSVCVy52Jq3L+/3GJgYkwc+/0= github.com/gogo/googleapis v1.1.0/go.mod h1:gf4bu3Q80BeJ6H1S1vYPm8/ELATdvryBaNFGgqEef3s= github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4= +github.com/gogo/protobuf v1.2.2-0.20190723190241-65acae22fc9d/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= +github.com/goinggo/mapstructure v0.0.0-20140717182941-194205d9b4a9 h1:wqckanyE9qc/XnvnybC6SHOb8Nyd62QXAZOzA8twFig= +github.com/goinggo/mapstructure v0.0.0-20140717182941-194205d9b4a9/go.mod h1:64ikIrMv84B+raz7akXOqbF7cK3/OQQ/6cClY10oy7A= github.com/goji/httpauth v0.0.0-20160601135302-2da839ab0f4d/go.mod h1:nnjvkQ9ptGaCkuDUx6wNykzzlUixGxvkme+H/lnzb+A= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= +github.com/golang/groupcache v0.0.0-20160516000752-02826c3e7903/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/groupcache v0.0.0-20190129154638-5b532d6fd5ef/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= +github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= github.com/golang/mock v1.3.1 h1:qGJ6qTW+x6xX/my+8YUVl4WNpX9B7+/l2tRsHGZ7f2s= github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y= github.com/golang/protobuf v0.0.0-20161109072736-4bd1920723d7/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.2 h1:6nsPYzhq5kReh6QImI3k5qWzO4PEbvbIW2cwSfR/6xs= github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/snappy v0.0.0-20170215233205-553a64147049/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= -github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/golang/snappy v0.0.1 h1:Qgr9rKW7uDUkrbSmQeiDsGa8SjGyCOGtuasMWwvp2P4= github.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= -github.com/google/go-github v17.0.0+incompatible/go.mod h1:zLgOLi98H3fifZn+44m+umXrS52loVEgC2AApnigrVQ= +github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= github.com/google/go-querystring v0.0.0-20170111101155-53e6ce116135/go.mod h1:odCYkC5MyYFN7vkCjXpyrEuKhc/BUO6wN/zVPAxq5ck= +github.com/google/go-querystring v1.0.0/go.mod h1:odCYkC5MyYFN7vkCjXpyrEuKhc/BUO6wN/zVPAxq5ck= github.com/google/gofuzz v0.0.0-20161122191042-44d81051d367/go.mod h1:HP5RmnzzSNb993RKQDq4+1A4ia9nllfqcQFTQJedwGI= -github.com/google/gofuzz v0.0.0-20170612174753-24818f796faf/go.mod h1:HP5RmnzzSNb993RKQDq4+1A4ia9nllfqcQFTQJedwGI= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= +github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= +github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= +github.com/google/tcpproxy v0.0.0-20180808230851-dfa16c61dad2/go.mod h1:DavVbd41y+b7ukKDmlnPR4nGYmkWXR6vHUkjQNiHPBs= +github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= +github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= github.com/googleapis/gnostic v0.0.0-20170729233727-0c5108395e2d/go.mod h1:sJBsCZ4ayReDTBIg8b9dl28c5xFWyhBTVRp3pOg5EKY= github.com/googleapis/gnostic v0.2.0/go.mod h1:sJBsCZ4ayReDTBIg8b9dl28c5xFWyhBTVRp3pOg5EKY= -github.com/gophercloud/gophercloud v0.0.0-20180828235145-f29afc2cceca/go.mod h1:3WdhXV3rUYy9p6AUW8d94kr+HS62Y4VL9mBnFxsD8q4= -github.com/gopherjs/gopherjs v0.0.0-20180825215210-0210a2f0f73c/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= -github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1 h1:EGx4pi6eqNxGaHF6qqu48+N2wcFQ5qg5FXgOdqsJ5d8= +github.com/gophercloud/gophercloud v0.1.0/go.mod h1:vxM41WHh5uqHVBMZHzuwNOHh8XEoIEcSTewFxm1c5g8= github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= -github.com/gorilla/websocket v1.4.0 h1:WDFjx/TMzVgy9VdMMQi2K2Emtwi2QcUQsztZ/zLaH/Q= github.com/gorilla/websocket v1.4.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= -github.com/gotestyourself/gotestyourself v2.2.0+incompatible/go.mod h1:zZKM6oeNM8k+FRljX1mnzVYeS8wiGgQyvST1/GafPbY= +github.com/gorilla/websocket v1.4.2 h1:+/TMaTYc4QFitKJxsQ7Yye35DkWvkdLcvGKqM+x0Ufc= +github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= github.com/gregjones/httpcache v0.0.0-20180305231024-9cad4c3443a7/go.mod h1:FecbI9+v66THATjSRHfNgh1IVFe/9kFxbXtjV0ctIMA= github.com/grpc-ecosystem/go-grpc-middleware v1.0.0/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= +github.com/grpc-ecosystem/go-grpc-middleware v1.0.1-0.20190118093823-f849b5445de4/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk= +github.com/grpc-ecosystem/grpc-gateway v1.9.0/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= github.com/grpc-ecosystem/grpc-gateway v1.9.5/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= github.com/grpc-ecosystem/grpc-opentracing v0.0.0-20180507213350-8e809c8a8645/go.mod h1:6iZfnjpejD4L/4DwD7NryNaJyCQdzwWwH2MWhCA90Kw= -github.com/hailocab/go-hostpool v0.0.0-20160125115350-e80d13ce29ed/go.mod h1:tMWxXQ9wFIaZeTI9F+hmhFiGpFmhOHzyShyFUhRm0H4= -github.com/hashicorp/consul v1.5.3/go.mod h1:61E2GJCPEP3oq8La7sfDdWGQ66+Zbxzw5ecOdFD7xIE= +github.com/hashicorp/consul v1.8.0/go.mod h1:Gg9/UgAQ9rdY3CTvzQZ6g2jcIb7NlIfjI+0pvLk5D1A= github.com/hashicorp/consul/api v1.1.0/go.mod h1:VmuI/Lkw1nC05EYQWNKwWGbkg+FbDBtguAZLlVdkD9Q= +github.com/hashicorp/consul/api v1.5.0/go.mod h1:LqwrLNW876eYSuUOo4ZLHBcdKc038txr/IMfbLPATa4= github.com/hashicorp/consul/sdk v0.1.1/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyNV1vwHyQBF0x8= +github.com/hashicorp/consul/sdk v0.5.0/go.mod h1:fY08Y9z5SvJqevyZNy6WWPXiG3KwBPAvlcdx16zZ0fM= github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= -github.com/hashicorp/go-bexpr v0.1.0/go.mod h1:ANbpTX1oAql27TZkKVeW8p1w8NTdnyzPe/0qqPCKohU= +github.com/hashicorp/go-bexpr v0.1.2/go.mod h1:ANbpTX1oAql27TZkKVeW8p1w8NTdnyzPe/0qqPCKohU= github.com/hashicorp/go-checkpoint v0.0.0-20171009173528-1545e56e46de/go.mod h1:xIwEieBHERyEvaeKF/TcHh1Hu+lxPM+n2vT1+g9I4m4= github.com/hashicorp/go-cleanhttp v0.5.0/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= github.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= -github.com/hashicorp/go-discover v0.0.0-20190403160810-22221edb15cd/go.mod h1:ueUgD9BeIocT7QNuvxSyJyPAM9dfifBcaWmeybb67OY= +github.com/hashicorp/go-connlimit v0.2.0/go.mod h1:OUj9FGL1tPIhl/2RCfzYHrIiWj+VVPGNyVPnUX8AqS0= +github.com/hashicorp/go-discover v0.0.0-20200501174627-ad1e96bde088/go.mod h1:vZu6Opqf49xX5lsFAu7iFNewkcVF1sn/wyapZh5ytlg= +github.com/hashicorp/go-hclog v0.0.0-20180709165350-ff2cf002a8dd/go.mod h1:9bjs9uLqI8l75knNv3lV1kA55veR+WUPSiKIWcQHudI= +github.com/hashicorp/go-hclog v0.8.0/go.mod h1:5CU+agLiy3J7N7QjHK5d05KxGsuXiQLrjA0H7acj2lQ= github.com/hashicorp/go-hclog v0.9.1/go.mod h1:5CU+agLiy3J7N7QjHK5d05KxGsuXiQLrjA0H7acj2lQ= +github.com/hashicorp/go-hclog v0.9.2/go.mod h1:5CU+agLiy3J7N7QjHK5d05KxGsuXiQLrjA0H7acj2lQ= +github.com/hashicorp/go-hclog v0.12.0/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ= github.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= -github.com/hashicorp/go-memdb v0.0.0-20180223233045-1289e7fffe71/go.mod h1:kbfItVoBJwCfKXDXN4YoAXjxcFVZ7MRrJzyTX6H4giE= +github.com/hashicorp/go-immutable-radix v1.1.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= +github.com/hashicorp/go-memdb v1.0.3/go.mod h1:LWQ8R70vPrS4OEY9k28D2z8/Zzyu34NVzeRibGAzHO0= github.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM= github.com/hashicorp/go-msgpack v0.5.5/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM= github.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk= -github.com/hashicorp/go-plugin v0.0.0-20180331002553-e8d22c780116/go.mod h1:JSqWYsict+jzcj0+xElxyrBQRPNoiWQuddnxArJ7XHQ= +github.com/hashicorp/go-multierror v1.1.0/go.mod h1:spPvp8C1qA32ftKqdAHm4hHTbPw+vmowP0z+KUhOZdA= +github.com/hashicorp/go-plugin v1.0.1/go.mod h1:++UyYGoz3o5w9ZzAdZxtQKrWWP+iqPBn3cQptSMzBuY= github.com/hashicorp/go-raftchunking v0.6.1/go.mod h1:cGlg3JtDy7qy6c/3Bu660Mic1JF+7lWqIwCFSb08fX0= +github.com/hashicorp/go-raftchunking v0.6.3-0.20191002164813-7e9e8525653a/go.mod h1:xbXnmKqX9/+RhPkJ4zrEx4738HacP72aaUPlT2RZ4sU= github.com/hashicorp/go-retryablehttp v0.5.3/go.mod h1:9B5zBasrRhHXnJnui7y6sL7es7NDiJgTc6Er0maI1Xs= +github.com/hashicorp/go-retryablehttp v0.5.4/go.mod h1:9B5zBasrRhHXnJnui7y6sL7es7NDiJgTc6Er0maI1Xs= +github.com/hashicorp/go-retryablehttp v0.6.2/go.mod h1:gEx6HMUGxYYhJScX7W1Il64m6cc2C1mDaW3NQ9sY1FY= github.com/hashicorp/go-rootcerts v1.0.0/go.mod h1:K6zTfqpRlCUIjkwsN4Z+hiSfzSTQa6eBIzfwKfwNnHU= +github.com/hashicorp/go-rootcerts v1.0.1/go.mod h1:pqUvnprVnM5bf7AOirdbb01K4ccR319Vf4pU3K5EGc8= +github.com/hashicorp/go-rootcerts v1.0.2/go.mod h1:pqUvnprVnM5bf7AOirdbb01K4ccR319Vf4pU3K5EGc8= github.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU= +github.com/hashicorp/go-sockaddr v1.0.2/go.mod h1:rB4wwRAUzs07qva3c5SdrY/NEtAUjGlgmH/UkBUC97A= github.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4= github.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= github.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= -github.com/hashicorp/go-version v0.0.0-20170202080759-03c5bf6be031/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= +github.com/hashicorp/go-uuid v1.0.2-0.20191001231223-f32f5fe8d6a8/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= +github.com/hashicorp/go-uuid v1.0.2/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= +github.com/hashicorp/go-version v1.1.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= +github.com/hashicorp/go-version v1.2.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= github.com/hashicorp/go.net v0.0.1/go.mod h1:hjKkEWcCURg++eb33jQU7oqQcI9XDCnUzHA0oac0k90= github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= -github.com/hashicorp/hcl v0.0.0-20180906183839-65a6292f0157/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= +github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= +github.com/hashicorp/golang-lru v0.5.3/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= +github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= github.com/hashicorp/hil v0.0.0-20160711231837-1e86c6b523c5/go.mod h1:KHvg/R2/dPtaePb16oW4qIyzkMxXOL38xjRN64adsts= github.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64= github.com/hashicorp/mdns v1.0.0/go.mod h1:tL+uN++7HEJ6SQLQ2/p+z2pH24WQKWjBPkE0mNTz8vQ= github.com/hashicorp/mdns v1.0.1/go.mod h1:4gW7WsVCke5TE7EPeYliwHlRUyBtfCwuFwuMg2DmyNY= github.com/hashicorp/memberlist v0.1.3/go.mod h1:ajVTdAv/9Im8oMAAj5G31PhhMCZJV2pPBoIllUwCN7I= -github.com/hashicorp/memberlist v0.1.4/go.mod h1:ajVTdAv/9Im8oMAAj5G31PhhMCZJV2pPBoIllUwCN7I= +github.com/hashicorp/memberlist v0.2.0/go.mod h1:MS2lj3INKhZjWNqd3N0m3J+Jxf3DAOnAH9VT3Sh9MUE= +github.com/hashicorp/memberlist v0.2.2/go.mod h1:MS2lj3INKhZjWNqd3N0m3J+Jxf3DAOnAH9VT3Sh9MUE= github.com/hashicorp/net-rpc-msgpackrpc v0.0.0-20151116020338-a14192a58a69/go.mod h1:/z+jUGRBlwVpUZfjute9jWaF6/HuhjuFQuL1YXzVD1Q= github.com/hashicorp/raft v1.1.1/go.mod h1:vPAJM8Asw6u8LxC3eJCUZmRP/E4QmUGE1R7g7k8sG/8= +github.com/hashicorp/raft v1.1.2-0.20191002163536-9c6bd3e3eb17/go.mod h1:vPAJM8Asw6u8LxC3eJCUZmRP/E4QmUGE1R7g7k8sG/8= +github.com/hashicorp/raft v1.1.2/go.mod h1:vPAJM8Asw6u8LxC3eJCUZmRP/E4QmUGE1R7g7k8sG/8= github.com/hashicorp/raft-boltdb v0.0.0-20171010151810-6e5ba93211ea/go.mod h1:pNv7Wc3ycL6F5oOWn+tPGo2gWD4a5X+yp/ntwdKLjRk= github.com/hashicorp/serf v0.8.2/go.mod h1:6hOLApaqBFA1NXqRQAsxw9QxuDEvNxSQRwA/JwenrHc= -github.com/hashicorp/vault v0.10.3/go.mod h1:KfSyffbKxoVyspOdlaGVjIuwLobi07qD1bAbosPMpP0= -github.com/hashicorp/vault-plugin-secrets-kv v0.0.0-20190318174639-195e0e9d07f1/go.mod h1:VJHHT2SC1tAPrfENQeBhLlb5FbZoKZM+oC/ROmEftz0= +github.com/hashicorp/serf v0.9.0/go.mod h1:YL0HO+FifKOW2u1ke99DGVu1zhcpZzNwrLIqBC7vbYU= +github.com/hashicorp/serf v0.9.2/go.mod h1:UWDWwZeL5cuWDJdl0C6wrvrUwEqtQ4ZKBKKENpqIUyk= +github.com/hashicorp/vault/api v1.0.4/go.mod h1:gDcqh3WGcR1cpF5AJz/B1UFheUEneMoIospckxBxk6Q= +github.com/hashicorp/vault/api v1.0.5-0.20191108163347-bdd38fca2cff/go.mod h1:Uf8LaHyrYsgVgHzO2tMZKhqRGlL3UJ6XaSwW2EA1Iqo= +github.com/hashicorp/vault/sdk v0.1.13/go.mod h1:B+hVj7TpuQY1Y/GPbCpffmgd+tSEwvhkWnjtSYCaS2M= +github.com/hashicorp/vault/sdk v0.1.14-0.20191108161836-82f2b5571044/go.mod h1:PcekaFGiPJyHnFy+NZhP6ll650zEw51Ag7g/YEa+EOU= +github.com/hashicorp/vault/sdk v0.1.14-0.20191112033314-390e96e22eb2/go.mod h1:PcekaFGiPJyHnFy+NZhP6ll650zEw51Ag7g/YEa+EOU= github.com/hashicorp/vic v1.5.1-0.20190403131502-bbfe86ec9443/go.mod h1:bEpDU35nTu0ey1EXjwNwPjI9xErAsoOCmcMb9GKvyxo= +github.com/hashicorp/yamux v0.0.0-20180604194846-3520598351bb/go.mod h1:+NfK9FKeTrX5uv1uIXGdwYDTeHna2qgaIlx54MXqjAM= github.com/hashicorp/yamux v0.0.0-20181012175058-2f1d1f20f75d/go.mod h1:+NfK9FKeTrX5uv1uIXGdwYDTeHna2qgaIlx54MXqjAM= -github.com/hpcloud/tail v1.0.0 h1:nfCOvKYfkgYP8hkirhJocXT2+zOD8yUNjXaWfTlyFKI= github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= +github.com/imdario/mergo v0.3.5/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= github.com/imdario/mergo v0.3.6/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= +github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= +github.com/jackc/fake v0.0.0-20150926172116-812a484cc733/go.mod h1:WrMFNQdiFJ80sQsxDoMokWK1W5TQtxBFNpzWTD84ibQ= +github.com/jackc/pgx v3.3.0+incompatible/go.mod h1:0ZGrqGqkRlliWnWB4zKnWtjbSWbGkVEFm4TeybAXq+I= github.com/jarcoal/httpmock v0.0.0-20180424175123-9c70cfe4a1da/go.mod h1:ks+b9deReOc7jgqp+e7LuFiCBH6Rm5hL32cLcEAArb4= -github.com/jefferai/jsonx v0.0.0-20160721235117-9cc31c3135ee/go.mod h1:N0t2vlmpe8nyZB5ouIbJQPDSR+mH6oe7xHB9VZHSUzM= github.com/jehiah/go-strftime v0.0.0-20171201141054-1d33003b3869/go.mod h1:cJ6Cj7dQo+O6GJNiMx+Pa94qKj+TG8ONdKHgMNIyyag= github.com/jinzhu/copier v0.0.0-20190625015134-976e0346caa8 h1:mGIXW/lubQ4B+3bXTLxcTMTjUNDqoF6T/HUW9LbFx9s= github.com/jinzhu/copier v0.0.0-20190625015134-976e0346caa8/go.mod h1:yL958EeXv8Ylng6IfnvG4oflryUi3vgA3xPs9hmII1s= -github.com/jmespath/go-jmespath v0.0.0-20160202185014-0b12d6b521d8/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k= github.com/jmespath/go-jmespath v0.0.0-20180206201540-c2b33e8439af/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k= github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo= github.com/joyent/triton-go v0.0.0-20180628001255-830d2b111e62/go.mod h1:U+RSyWxWd04xTqnuOQxnai7XGS2PrPY2cfGoDKtMHjA= +github.com/joyent/triton-go v1.7.1-0.20200416154420-6801d15b779f/go.mod h1:KDSfL7qe5ZfQqvlDMkVjCztbmcpp/c8M77vhQP8ZPvk= github.com/json-iterator/go v0.0.0-20180612202835-f2b4162afba3/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= github.com/json-iterator/go v1.1.5/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= github.com/json-iterator/go v1.1.7/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= -github.com/json-iterator/go v1.1.9 h1:9yzud/Ht36ygwatGx56VwCZtlI/2AD15T1X2sjSuGns= -github.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= -github.com/jtolds/gls v4.2.1+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= -github.com/jtolds/gls v4.20.0+incompatible h1:xdiiI2gbIgH/gLH7ADydsJ1uDOEzR8yvV7C0MuV77Wo= +github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= -github.com/keybase/go-crypto v0.0.0-20180614160407-5114a9a81e1b/go.mod h1:ghbZscTyKdM07+Fw3KSi0hcJm+AlEUWj8QLlPtijN/M= github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q= +github.com/kisielk/errcheck v1.2.0/go.mod h1:/BMXB+zMLi60iA8Vv6Ksmxu/1UDYcXs4uQLJ+jE2L00= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= +github.com/konsorten/go-windows-terminal-sequences v1.0.2/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= -github.com/kr/pretty v0.1.0 h1:L/CwN0zerZDmRFUapSPitk6f+Q3+0za1rQkzVuMiMFI= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= +github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= -github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/lestrrat/go-envload v0.0.0-20180220120943-6ed08b54a570/go.mod h1:BLt8L9ld7wVsvEWQbuLrUZnCMnUmLZ+CGDzKtclrTlE= github.com/lestrrat/go-file-rotatelogs v0.0.0-20180223000712-d3151e2a480f/go.mod h1:UGmTpUd3rjbtfIpwAPrcfmGf/Z1HS95TATB+m57TPB8= github.com/lestrrat/go-strftime v0.0.0-20180220042222-ba3bf9c1d042/go.mod h1:TPpsiPUEh0zFL1Snz4crhMlBe60PYxRHr5oFF3rRYg0= -github.com/lib/pq v0.0.0-20180523175426-90697d60dd84/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= +github.com/lib/pq v1.1.1/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= +github.com/linode/linodego v0.7.1/go.mod h1:ga11n3ivecUrPCHN0rANxKmfWBJVkOXfLMZinAbj2sY= +github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= github.com/magiconair/properties v1.8.1 h1:ZC2Vc7/ZFkGmsVC9KvOjumD+G5lXy2RtTKyzRKO2BQ4= github.com/magiconair/properties v1.8.1/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= github.com/mailru/easyjson v0.0.0-20160728113105-d5b7844b561a/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= +github.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= +github.com/mattn/go-colorable v0.1.6/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= +github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= +github.com/mattn/go-isatty v0.0.10/go.mod h1:qgIWMr58cqv1PHHyhnkY9lrL7etaEgOFcMEpPG5Rm84= +github.com/mattn/go-isatty v0.0.11/go.mod h1:PhnuNfih5lzO57/f3n+odYbM4JtupLOxQOAqxQCu2WE= +github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= +github.com/mattn/go-runewidth v0.0.3/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= +github.com/miekg/dns v1.1.26/go.mod h1:bPDLeHnStXmXAq1m/Ch/hvfNHr14JKNPMBo3VZKjuso= github.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc= +github.com/mitchellh/cli v1.1.0/go.mod h1:xcISNoH86gajksDmfB23e/pu+B+GeFRMYmoHXxx3xhI= github.com/mitchellh/copystructure v1.0.0/go.mod h1:SNtv71yrdKgLRyLFxmLdkAbkKEFWgYaq1OVrnRcwhnw= github.com/mitchellh/go-homedir v1.0.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= +github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= +github.com/mitchellh/go-testing-interface v0.0.0-20171004221916-a61a99592b77/go.mod h1:kRemZodwjscx+RGhAo8eIhFbs2+BFgRtFPeD/KE+zxI= github.com/mitchellh/go-testing-interface v1.0.0/go.mod h1:kRemZodwjscx+RGhAo8eIhFbs2+BFgRtFPeD/KE+zxI= +github.com/mitchellh/go-testing-interface v1.14.0/go.mod h1:gfgS7OtZj6MA4U1UrDRp04twqAjfvlZyCfX3sDjEym8= +github.com/mitchellh/go-wordwrap v1.0.0/go.mod h1:ZXFpozHsX6DPmq2I0TCekCxypsnAUbP2oI0UX1GXzOo= github.com/mitchellh/gox v0.4.0/go.mod h1:Sd9lOJ0+aimLBi73mGofS1ycjY8lL3uZM3JPS42BGNg= github.com/mitchellh/hashstructure v0.0.0-20170609045927-2bca23e0e452/go.mod h1:QjSHrPWS+BGUVBYkbTZWEnOh3G1DutKwClXU/ABz6AQ= +github.com/mitchellh/hashstructure v1.0.0/go.mod h1:QjSHrPWS+BGUVBYkbTZWEnOh3G1DutKwClXU/ABz6AQ= github.com/mitchellh/iochan v1.0.0/go.mod h1:JwYml1nuB7xOzsp52dPpHFffvOCDupsG0QubkSMEySY= github.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= -github.com/mitchellh/mapstructure v1.1.2 h1:fmNYVwqnSfB9mZU6OS2O6GsXM+wcskZDuKQzvN1EDeE= github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= +github.com/mitchellh/mapstructure v1.2.3 h1:f/MjBEBDLttYCGfRaKBbKSRVF5aV2O6fnBpzknuE3jU= +github.com/mitchellh/mapstructure v1.2.3/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= +github.com/mitchellh/pointerstructure v1.0.0/go.mod h1:k4XwG94++jLVsSiTxo7qdIfXA9pj9EAeo0QsNNJOLZ8= github.com/mitchellh/reflectwalk v1.0.0/go.mod h1:mSTlrgnPZtwu0c4WaC2kGObEpuNDbx0jmZXqmk4esnw= github.com/mitchellh/reflectwalk v1.0.1/go.mod h1:mSTlrgnPZtwu0c4WaC2kGObEpuNDbx0jmZXqmk4esnw= -github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421 h1:ZqeYNhU3OHLH3mGKHDcjJRFFRrJa6eAM5H+CtDdOsPc= github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/reflect2 v0.0.0-20180320133207-05fbef0ca5da/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= -github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742 h1:Esafd1046DLDQ0W1YjYsBW+p8U2u7vzgW2SQVmlNazg= github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= -github.com/modern-go/reflect2 v1.0.1 h1:9f412s+6RmYXLWZSEzVVgPGK7C2PphHj5RJrvfx9AWI= github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= github.com/munnerz/goautoneg v0.0.0-20120707110453-a547fc61f48d/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= -github.com/nacos-group/nacos-sdk-go v0.0.0-20190723125407-0242d42e3dbb/go.mod h1:CEkSvEpoveoYjA81m4HNeYQ0sge0LFGKSEqO3JKHllo= +github.com/mxk/go-flowrate v0.0.0-20140419014527-cca7078d478f/go.mod h1:ZdcZmHo+o7JKHSa8/e818NopupXU1YMK5fe1lsApnBw= +github.com/nacos-group/nacos-sdk-go v1.0.0/go.mod h1:hlAPn3UdzlxIlSILAyOXKxjFSvDJ9oLzTJ9hLAK1KzA= github.com/nicolai86/scaleway-sdk v1.10.2-0.20180628010248-798f60e20bb2/go.mod h1:TLb2Sg7HQcgGdloNxkrmtgDNR9uVYF3lfdFIN4Ro6Sk= -github.com/oklog/run v0.0.0-20180308005104-6934b124db28/go.mod h1:dlhp/R75TPv97u0XWUtDeV/lRKWPKSdTuV0TZvrmrQA= +github.com/oklog/run v1.0.0/go.mod h1:dlhp/R75TPv97u0XWUtDeV/lRKWPKSdTuV0TZvrmrQA= +github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U= +github.com/olekukonko/tablewriter v0.0.0-20180130162743-b8a9be070da4/go.mod h1:vsDQFd/mU46D+Z4whnwzcISnGGzXWMclvtLoiIKAKIo= github.com/onsi/ginkgo v0.0.0-20170829012221-11459a886d9c/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.6.0 h1:Ix8l273rp3QzYgXSR+c8d1fTG7UPgYkOSELPhiY/YGw= github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= +github.com/onsi/ginkgo v1.8.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= +github.com/onsi/ginkgo v1.10.1/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/gomega v0.0.0-20170829124025-dcabb60a477c/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= -github.com/onsi/gomega v1.4.1/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= -github.com/onsi/gomega v1.4.2 h1:3mYCb7aPxS/RU7TI1y4rkEn1oKmPRjNJLNEXgw7MH2I= -github.com/onsi/gomega v1.4.2/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= -github.com/opencontainers/go-digest v1.0.0-rc1/go.mod h1:cMLVZDEM3+U2I4VmLI6N8jQYUd2OVphdqWwCJHrFt2s= -github.com/opencontainers/image-spec v1.0.1/go.mod h1:BtxoFyWECRxE4U/7sNtV5W15zMzWCbyJoFRP3s7yZA0= -github.com/opencontainers/runc v0.1.1/go.mod h1:qT5XzbpPznkRYVz/mWwUaVBUv2rmF59PVA73FjuZG0U= +github.com/onsi/gomega v1.5.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= +github.com/onsi/gomega v1.7.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= github.com/opentracing/opentracing-go v1.1.0 h1:pWlfV3Bxv7k65HYwkikxat0+s3pV4bsqf19k25Ur8rU= github.com/opentracing/opentracing-go v1.1.0/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= -github.com/ory/dockertest v3.3.4+incompatible/go.mod h1:1vX4m9wsvi00u5bseYwXaSnhNrne+V0E6LAcBILJdPs= github.com/packethost/packngo v0.1.1-0.20180711074735-b9cb5096f54c/go.mod h1:otzZQXgoO96RTzDB/Hycg0qZcXZsWJGJRSXbmEIJ+4M= github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= github.com/pascaldekloe/goe v0.1.0/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= -github.com/patrickmn/go-cache v0.0.0-20180527043350-9f6ff22cfff8/go.mod h1:3Qf8kWWT7OJRJbdiICTKqZju1ZixQ/KpMGzzAfe6+WQ= +github.com/patrickmn/go-cache v2.1.0+incompatible/go.mod h1:3Qf8kWWT7OJRJbdiICTKqZju1ZixQ/KpMGzzAfe6+WQ= +github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= github.com/peterbourgon/diskv v2.0.1+incompatible/go.mod h1:uqqh8zWWbv1HBMNONnaR/tNboyR3/BZd58JJSHlUSCU= +github.com/pierrec/lz4 v2.0.5+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY= +github.com/pierrec/lz4 v2.2.6+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY= github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pkg/errors v0.8.1 h1:iURUrRGxPUNPdy5/HRSm+Yj6okJ6UtLINN0Q9M4+h3I= github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= +github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pmezard/go-difflib v0.0.0-20151028094244-d8ed2627bdf0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI= +github.com/posener/complete v1.2.3/go.mod h1:WZIdtGGp+qx0sLrYKtIRAruyNpv6hFCicSgv7Sy7s/s= +github.com/pquerna/cachecontrol v0.0.0-20180517163645-1555304b9b35/go.mod h1:prYjPmNq4d1NPVmpShWobRqXY3q7Vp+80DqgxxUrUIA= github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= github.com/prometheus/client_golang v0.9.2/go.mod h1:OsXs2jCmiKlQ1lTBmv21f2mNfw4xf/QclQDMrYNZzcM= +github.com/prometheus/client_golang v0.9.3/go.mod h1:/TN21ttK/J9q6uSwhBd54HahCDft0ttaMvbicHlPoso= github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo= github.com/prometheus/client_golang v1.1.0/go.mod h1:I1FGZT9+L76gKKOs5djB6ezCbFQP1xR9D75/vuwEF3g= github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +github.com/prometheus/common v0.0.0-20181113130724-41aa239b4cce/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= github.com/prometheus/common v0.0.0-20181126121408-4724e9255275/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= +github.com/prometheus/common v0.4.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= github.com/prometheus/common v0.6.0/go.mod h1:eBmuwkDJBwy6iBfxCBob6t6dR6ENT/y+J+Zk0j9GMYc= github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= github.com/prometheus/procfs v0.0.0-20181204211112-1dc9a6cbc91a/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= +github.com/prometheus/procfs v0.0.0-20190507164030-5867b95ac084/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= github.com/prometheus/procfs v0.0.3/go.mod h1:4A/X28fw3Fc593LaREMrKMqOKvUAntwMDaekg4FpcdQ= +github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU= +github.com/rboyer/safeio v0.2.1/go.mod h1:Cq/cEPK+YXFn622lsQ0K4KsPZSPtaptHHEldsy7Fmig= github.com/renier/xmlrpc v0.0.0-20170708154548-ce4a1a486c03/go.mod h1:gRAiPF5C5Nd0eyyRdqIu9qTiFSoZzpTq727b5B8fkkU= github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg= github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= +github.com/rs/zerolog v1.4.0/go.mod h1:YbFCdg8HfsridGWAh22vktObvhZbQsZXe4/zB0OKkWU= +github.com/russross/blackfriday v1.5.2 h1:HyvC0ARfnZBqnXwABFeSZHpKvJHJJfPz81GNueLj0oo= +github.com/russross/blackfriday v1.5.2/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g= +github.com/russross/blackfriday/v2 v2.0.1 h1:lPqVAte+HuHNfhJ/0LC98ESWRz8afy9tM/0RK8m9o+Q= +github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= -github.com/ryanuber/go-glob v0.0.0-20170128012129-256dc444b735/go.mod h1:807d1WSdnB0XRJzKNil9Om6lcp/3a0v4qIHxIXzX/Yc= -github.com/satori/go.uuid v1.2.0 h1:0uYX9dsZ2yD7q2RtLRtPSdGDWzjeM3TbMJP9utgA0ww= +github.com/ryanuber/columnize v2.1.0+incompatible/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= +github.com/ryanuber/go-glob v1.0.0/go.mod h1:807d1WSdnB0XRJzKNil9Om6lcp/3a0v4qIHxIXzX/Yc= github.com/satori/go.uuid v1.2.0/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0= +github.com/satori/go.uuid v1.2.1-0.20181028125025-b2ce2384e17b h1:gQZ0qzfKHQIybLANtM3mBXNUtOfsCFXeTsnBqCsx1KM= +github.com/satori/go.uuid v1.2.1-0.20181028125025-b2ce2384e17b/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0= +github.com/sean-/conswriter v0.0.0-20180208195008-f5ae3917a627/go.mod h1:7zjs06qF79/FKAJpBvFx3P8Ww4UTIMAe+lpNXDHziac= +github.com/sean-/pager v0.0.0-20180208200047-666be9bf53b5/go.mod h1:BeybITEsBEg6qbIiqJ6/Bqeq25bCLbL7YFmpaFfJDuM= github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc= github.com/shirou/gopsutil v0.0.0-20181107111621-48177ef5f880/go.mod h1:5b4v6he4MtMOwMlS0TUMTu2PcXUg8+E1lC7eC3UO/RA= +github.com/shirou/gopsutil v2.19.9+incompatible/go.mod h1:5b4v6he4MtMOwMlS0TUMTu2PcXUg8+E1lC7eC3UO/RA= github.com/shirou/w32 v0.0.0-20160930032740-bb4de0191aa4/go.mod h1:qsXQc7+bwAM3Q1u/4XEfrquwF8Lw7D7y5cD8CuHnfIc= +github.com/shopspring/decimal v0.0.0-20180709203117-cd690d0c9e24/go.mod h1:M+9NzErvs504Cn4c5DxATwIqPbtswREoFCre64PpcG4= +github.com/shurcooL/sanitized_anchor_name v1.0.0 h1:PdmoCO6wvbs+7yrJyMORt4/BmY5IYyJwS/kOiWx8mHo= +github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= github.com/sirupsen/logrus v1.0.6/go.mod h1:pMByvHTf9Beacp5x1UXfOR9xyW/9antXMhjMPG0dEzc= github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= -github.com/smartystreets/assertions v0.0.0-20180820201707-7c9eb446e3cf/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= -github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d h1:zE9ykElWQ6/NYmHa3jpm/yHnI4xSofP+UP6SpjHcSeM= +github.com/sirupsen/logrus v1.4.1/go.mod h1:ni0Sbl8bgC9z8RoU9G6nDWqqs/fq4eDPysMBDgk/93Q= +github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= -github.com/smartystreets/goconvey v0.0.0-20180222194500-ef6db91d284a/go.mod h1:XDJAKZRPZ1CvBcN2aX5YOUTYGHki24fSF0Iv48Ibg0s= github.com/smartystreets/goconvey v0.0.0-20190330032615-68dc04aab96a/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= -github.com/smartystreets/goconvey v0.0.0-20190710185942-9d28bd7c0945 h1:N8Bg45zpk/UcpNGnfJt2y/3lRWASHNTUET8owPYCgYI= -github.com/smartystreets/goconvey v0.0.0-20190710185942-9d28bd7c0945/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= +github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= github.com/softlayer/softlayer-go v0.0.0-20180806151055-260589d94c7d/go.mod h1:Cw4GTlQccdRGSEf6KiMju767x0NEHE0YIVPJSaXjlsw= github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM= +github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= +github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ= +github.com/spf13/afero v1.2.1/go.mod h1:9ZxEEn6pIJ8Rxe320qSDBk6AsU0r9pR7Q4OcevTdifk= +github.com/spf13/afero v1.2.2/go.mod h1:9ZxEEn6pIJ8Rxe320qSDBk6AsU0r9pR7Q4OcevTdifk= +github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= +github.com/spf13/cobra v0.0.5/go.mod h1:3K3wKZymM7VvHMDS9+Akkh4K60UwM26emMESw8tLCHU= +github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo= github.com/spf13/pflag v0.0.0-20170130214245-9ff6c6923cff/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= -github.com/spf13/pflag v1.0.2/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= +github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= +github.com/spf13/viper v1.3.2/go.mod h1:ZiWeW+zYFKm7srdB9IoDzzZXaJaI5eL9QjNiN/DMA2s= +github.com/spf13/viper v1.4.0/go.mod h1:PTJ7Z/lr49W6bUbkmS1V3by4uWynFiR9p7+dSq/yZzE= +github.com/spf13/viper v1.7.0/go.mod h1:8WkrPz2fc9jxqZNCJI/76HCieCp4Q8HaLFoCha5qpdg= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/objx v0.1.1 h1:2vfRuCMp5sSVIDSqO8oNnWJq7mPa6KVP3iPIwFBuy8A= github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE= github.com/stretchr/testify v0.0.0-20151208002404-e3a8ff8ce365/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= -github.com/stretchr/testify v1.3.0 h1:TivCn/peBQ7UY8ooIcPgZFpTNSz0Q2U6UrFlUfqbe0Q= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= -github.com/stretchr/testify v1.4.0 h1:2E4SXV/wtOkTonXsotYi4li6zVWxYlZuYNCXe9XRJyk= github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= github.com/stretchr/testify v1.5.1 h1:nOGnQDM7FYENwehXlg/kFVnos3rEvtKTjRvOWSzb6H4= github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= +github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw= github.com/tebeka/strftime v0.1.3/go.mod h1:7wJm3dZlpr4l/oVK0t1HYIc4rMzQ2XJlOMIUJUJH6XQ= +github.com/tencentcloud/tencentcloud-sdk-go v3.0.83+incompatible/go.mod h1:0PfYow01SHPMhKY31xa+EFz2RStxIqj6JFAJS+IkCi4= github.com/tent/http-link-go v0.0.0-20130702225549-ac974c61c2f9/go.mod h1:RHkNRtSLfOK7qBTHaeSX1D6BNpI3qw7NTxsmNr4RvN8= -github.com/tevid/gohamcrest v1.1.1 h1:ou+xSqlIw1xfGTg1uq1nif/htZ2S3EzRqLm2BP+tYU0= github.com/tevid/gohamcrest v1.1.1/go.mod h1:3UvtWlqm8j5JbwYZh80D/PVBt0mJ1eJiYgZMibh0H/k= github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= github.com/toolkits/concurrent v0.0.0-20150624120057-a4371d70e3e3/go.mod h1:QDlpd3qS71vYtakd2hmdpqhJ9nwv6mD6A30bQ1BPBFE= github.com/tv42/httpunix v0.0.0-20150427012821-b75d8614f926/go.mod h1:9ESjWnEqriFuLhtthL60Sar/7RFoluCcXsuvEwTV5KM= +github.com/ugorji/go v1.1.4/go.mod h1:uQMGLiO92mf5W77hV/PUCpI3pbzQx3CRekS0kk+RGrc= +github.com/ugorji/go/codec v0.0.0-20181204163529-d75b2dcb6bc8/go.mod h1:VFNgLljTbGfSG7qAOspJ7OScBnGdDN/yBr0sguwnwf0= +github.com/urfave/cli v1.22.4 h1:u7tSpNPPswAFymm8IehJhy4uJMlUuU/GmqSkvJ1InXA= +github.com/urfave/cli v1.22.4/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= github.com/vmware/govmomi v0.18.0/go.mod h1:URlwyTFZX72RmxtxuaFL2Uj3fD1JTvZdx59bHWk6aFU= github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU= -github.com/zouyx/agollo v0.0.0-20191114083447-dde9fc9f35b8 h1:k8TV7Gz7cpWpOw/dz71fx8cCZdWoPuckHJ/wkJl+meg= -github.com/zouyx/agollo v0.0.0-20191114083447-dde9fc9f35b8/go.mod h1:S1cAa98KMFv4Sa8SbJ6ZtvOmf0VlgH0QJ1gXI0lBfBY= -go.etcd.io/bbolt v1.3.3/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= -go.etcd.io/etcd v3.3.13+incompatible/go.mod h1:yaeTdrJi5lOmYerz05bd8+V7KubZs8YSFZfzsF9A6aI= +github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q= +github.com/zouyx/agollo/v3 v3.4.4/go.mod h1:ag0XmE1r4iAgPd6PUnU9TJ0DMEjM1VKX1HUNqQJ2ywU= +go.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= +go.etcd.io/bbolt v1.3.4/go.mod h1:G5EMThwa9y8QZGBClrRx5EY+Yw9kAhnjy3bSjsnlVTQ= +go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= +go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= -go.uber.org/atomic v1.5.0 h1:OI5t8sDa1Or+q8AeE+yKeB/SDYioSHAgcVljj9JIETY= -go.uber.org/atomic v1.5.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= +go.uber.org/atomic v1.6.0 h1:Ezj3JGmsOnG1MoRWQkPBsKLe9DwWD9QeXzTRzzldNVk= +go.uber.org/atomic v1.6.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= -go.uber.org/multierr v1.3.0 h1:sFPn2GLc3poCkfrpIXGhBD2X0CMIo4Q/zSULXrj/+uc= -go.uber.org/multierr v1.3.0/go.mod h1:VgVr7evmIr6uPjLBxg28wmKNXyqE9akIJ5XnfpiKl+4= -go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee h1:0mgffUl7nfd+FpvXMVz4IDEaUSmT1ysygQC7qYo7sG4= +go.uber.org/multierr v1.5.0 h1:KCa4XfM8CWFCpxXRGok+Q0SS/0XBhMDbHHGABQLvD2A= +go.uber.org/multierr v1.5.0/go.mod h1:FeouvMocqHpRaaGuG9EjoKcStLC43Zu/fmqdUMPcKYU= go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee/go.mod h1:vJERXedbb3MVM5f9Ejo0C68/HhF8uaILCdgjnY+goOA= go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= -go.uber.org/zap v1.13.0 h1:nR6NoDBgAf67s68NhaXbsojM+2gxp3S1hWkHDl27pVU= -go.uber.org/zap v1.13.0/go.mod h1:zwrFLgMcdUuIBviXEYEH1YKNaOBnKXsx2IPda5bBwHM= +go.uber.org/zap v1.15.0 h1:ZZCA22JRF2gQE5FoNmhmrf7jeJJ2uhqDUNRYKm8dvmM= +go.uber.org/zap v1.15.0/go.mod h1:Mb2vm2krFEG5DV0W9qcHBYFtp/Wku1cvYaqPsS/WYfc= golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20181029021203-45a5f77698d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/crypto v0.0.0-20181203042331-505ab145d0a9/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/crypto v0.0.0-20190211182817-74369b46fc67/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= -golang.org/x/crypto v0.0.0-20190325154230-a5d413f7728c/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20190611184440-5c40567a22f8/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20190923035154-9ee001bba392/go.mod h1:/lpIB1dKB+9EgE3H3cr1v9wB50oz8l4C4h62xy7jSTY= +golang.org/x/crypto v0.0.0-20191206172530-e9b2fee46413/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20200220183623-bac4c82f6975/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= +golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= +golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= +golang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek= +golang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY= +golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= +golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= +golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= +golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20190930215403-16217165b5de h1:5hukYrvBGR8/eNkX5mdUezrA6JiaEZDtJb9Ei+1LlBs= +golang.org/x/lint v0.0.0-20190409202823-959b441ac422/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20190909230951-414d861bb4ac/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE= +golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o= golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= +golang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY= golang.org/x/net v0.0.0-20170114055629-f2499483f923/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20181023162649-9b4f9f5ad519/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20181201002055-351d144fa1fc/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20181220203305-927f97764cc3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190522155817-f3200d17e092/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= +golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190620200207-3b0461eec859 h1:R/3boaszxrf1GEUWTVDzSKVwLmSJpwZ1yqXm8j0v2QI= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190628185345-da137c7871d7 h1:rTIdg5QFRR7XCaK4LCjBiPbx8j4DQRpdYMnGn/bJUEU= golang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/oauth2 v0.0.0-20170807180024-9a379c6b3e95/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= +golang.org/x/net v0.0.0-20190923162816-aa69164e4478/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20191004110552-13f9640d40b9/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= +golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sys v0.0.0-20170830134202-bb24a47a89ea/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -395,73 +559,131 @@ golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5h golang.org/x/sys v0.0.0-20181026203630-95b1ffbd15a5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20181107165924-66b7b1311ac8/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20181205085412-a5c9d58dba9a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190129075346-302c3dd5f1cc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190209173611-3b5209105503/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190403152447-81d4e9dc473e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190508220229-2d0786266e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190515120540-06a5c4944438/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190523142557-0e01d883c5c5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190801041406-cbf593c0f2f3 h1:4y9KwBHBgBNwDbtu44R5o1fdOCQUEXhbk/P4A9WmJq0= +golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190801041406-cbf593c0f2f3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190813064441-fde4db37ae7a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190922100055-0a153f010e69/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190924154521-2837fb4f24fe/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191008105621-543471e840be/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200124204421-9fbb57f87de9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/text v0.0.0-20160726164857-2910a502d2bf/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.3.2 h1:tW2bmiBqwgJj/UpqtC8EpXEZVYOwU0yG4iWbprSVAcs= +golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.1-0.20181227161524-e6919f6577db/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= -golang.org/x/time v0.0.0-20180412165947-fbb02b2291d2/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20181011042414-1f849cf54d09/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20181030221726-6c7e314b6563/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= golang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= +golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= +golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20190907020128-2ca718005c18/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191029041327-9cc4af7d6b2c/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191029190741-b9c20aec41a5 h1:hKsoRgsbwY1NafxrwTs+k64bikrLBkAgPir1TNCj3Zs= golang.org/x/tools v0.0.0-20191029190741-b9c20aec41a5/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191112195655-aa38f8e97acc/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -google.golang.org/api v0.0.0-20180829000535-087779f1d2c9/go.mod h1:4mhQ8q/RsB7i+udVvVy5NUi08OU8ZlA0gRVgrF7VFY0= +google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= +google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M= +google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= +google.golang.org/api v0.9.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= +google.golang.org/api v0.13.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= +google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= +google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= +google.golang.org/appengine v1.6.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= +google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= +google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190404172233-64821d5d2107/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190530194941-fb225487d101/go.mod h1:z3L6/3dTEVtUr6QSP8miRzeRqwQOioJ9I66odjN4I7s= +google.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= +google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= +google.golang.org/genproto v0.0.0-20190911173649-1774047e7e51/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8= +google.golang.org/genproto v0.0.0-20191108220845-16a3f7862a1a/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/grpc v1.14.0/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= google.golang.org/grpc v1.19.1/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= -google.golang.org/grpc v1.22.1/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= +google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= +google.golang.org/grpc v1.21.0/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= +google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= +google.golang.org/grpc v1.22.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= +google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= gopkg.in/airbrake/gobrake.v2 v2.0.9/go.mod h1:/h5ZAUhDkGaJfjzjKLSjv6zCL6O0LLBxU4K+aSYdM/U= gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= gopkg.in/asn1-ber.v1 v1.0.0-20181015200546-f715ec2f112d/go.mod h1:cuepJuh7vyXfUyUwEgHQXw849cJrilpS5NeIjOWESAw= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127 h1:qIbj1fsPNlZgppZ+VLlY7N33q108Sa+fhmuc+sWQYwY= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= -gopkg.in/fsnotify.v1 v1.4.7 h1:xOHLXZwVvI9hhs+cLKq5+I5onOuwQLhQwiu63xxlHs4= gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= gopkg.in/gemnasium/logrus-airbrake-hook.v2 v2.1.2/go.mod h1:Xk6kEKp8OKb+X14hQBKWaSkCsqBpgog8nAV2xsGOxlo= gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= gopkg.in/ini.v1 v1.42.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= -gopkg.in/mgo.v2 v2.0.0-20160818020120-3f83fa500528/go.mod h1:yeKp02qBN3iKW1OzL3MGk2IdtZzaj7SFntXj72NppTA= -gopkg.in/ory-am/dockertest.v3 v3.3.4/go.mod h1:s9mmoLkaGeAh97qygnNj4xWkiN7e1SKekYC6CovU+ek= +gopkg.in/ini.v1 v1.51.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo= gopkg.in/square/go-jose.v2 v2.3.1/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI= -gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ= +gopkg.in/square/go-jose.v2 v2.4.1/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= gopkg.in/yaml.v2 v2.0.0-20170812160011-eb3733d160e7/go.mod h1:JAlM8MvJe8wmxCU4Bli9HhUf9+ttbYbLASfIpnQbh74= gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.7 h1:VUgggvou5XRW9mHwD/yXxIYSMtY0zoKQf/v226p2nyo= -gopkg.in/yaml.v2 v2.2.7/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gotest.tools v2.2.0+incompatible/go.mod h1:DsYFclhRJ6vuDpmuTbkuFWG+y2sxOXAzmJt81HFBacw= +gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.8 h1:obN1ZagJSUGI0Ek/LBmuj4SNLPfIny3KsKFopxRdj10= +gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.1-2019.2.3 h1:3JgtbtFHMiCmsznwGVTUWbgGov+pVqnlf1dEJTNAXeM= honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= istio.io/gogo-genproto v0.0.0-20190124151557-6d926a6e6feb/go.mod h1:eIDJ6jNk/IeJz6ODSksHl5Aiczy5JUq6vFhJWI5OtiI= -k8s.io/api v0.0.0-20180806132203-61b11ee65332/go.mod h1:iuAfoD4hCxJ8Onx9kaTIt30j7jUFS00AXQi6QMi99vA= -k8s.io/api v0.0.0-20190325185214-7544f9db76f6/go.mod h1:iuAfoD4hCxJ8Onx9kaTIt30j7jUFS00AXQi6QMi99vA= -k8s.io/apimachinery v0.0.0-20180821005732-488889b0007f/go.mod h1:ccL7Eh7zubPUSh9A3USN90/OzHNSVN6zxzde07TDCL0= -k8s.io/apimachinery v0.0.0-20190223001710-c182ff3b9841/go.mod h1:ccL7Eh7zubPUSh9A3USN90/OzHNSVN6zxzde07TDCL0= -k8s.io/client-go v8.0.0+incompatible/go.mod h1:7vJpHMYJwNQCWgzmNV+VYUl1zCObLyodBc8nIyt8L5s= +k8s.io/api v0.16.9/go.mod h1:Y7dZNHs1Xy0mSwSlzL9QShi6qkljnN41yR8oWCRTDe8= +k8s.io/apimachinery v0.16.9/go.mod h1:Xk2vD2TRRpuWYLQNM6lT9R7DSFZUYG03SarNkbGrnKE= +k8s.io/client-go v0.16.9/go.mod h1:ThjPlh7Kx+XoBFOCt775vx5J7atwY7F/zaFzTco5gL0= k8s.io/gengo v0.0.0-20190128074634-0689ccc1d7d6/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0= k8s.io/klog v0.0.0-20181102134211-b9b56d5dfc92/go.mod h1:Gq+BEi5rUBO/HRz0bTSXDUcqjScdoY3a9IHpCEIOOfk= +k8s.io/klog v0.3.0/go.mod h1:Gq+BEi5rUBO/HRz0bTSXDUcqjScdoY3a9IHpCEIOOfk= +k8s.io/klog v1.0.0/go.mod h1:4Bi6QPql/J/LkTDqv7R/cd3hPo4k2DG6Ptcz060Ez5I= +k8s.io/kube-openapi v0.0.0-20190816220812-743ec37842bf/go.mod h1:1TqjTSzOxsLGIKfj0lK8EeCP7K1iUG65v09OM0/WG5E= k8s.io/kube-openapi v0.0.0-20191107075043-30be4d16710a/go.mod h1:1TqjTSzOxsLGIKfj0lK8EeCP7K1iUG65v09OM0/WG5E= +k8s.io/utils v0.0.0-20190801114015-581e00157fb1/go.mod h1:sZAwmy6armz5eXlNoLmJcl4F1QuKu7sr+mFQ0byX7Ew= +launchpad.net/gocheck v0.0.0-20140225173054-000000000087/go.mod h1:hj7XX3B/0A+80Vse0e+BUHsHMTEhd0O4cpUHr/e/BUM= +rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= sigs.k8s.io/structured-merge-diff v0.0.0-20190525122527-15d366b2352e/go.mod h1:wWxsB5ozmmv/SG7nM11ayaAW51xMvak/t1r0CSlcokI= sigs.k8s.io/yaml v1.1.0/go.mod h1:UJmg0vDUVViEyp3mgSv9WPwZCDxu4rQW1olrI1uml+o= diff --git a/main.go b/main.go deleted file mode 100644 index 7713c81cd..000000000 --- a/main.go +++ /dev/null @@ -1,12 +0,0 @@ -package main - -import ( - _ "github.com/dubbogo/dubbo-go-proxy/common/config" - _ "github.com/dubbogo/dubbo-go-proxy/service/filter" - "github.com/dubbogo/dubbo-go-proxy/service/proxy/http" -) - -// for example -func main() { - http.Run() -} diff --git a/common/logger/log.yml b/pkg/logger/log.yml similarity index 94% rename from common/logger/log.yml rename to pkg/logger/log.yml index 59fa4279a..3ed242d29 100644 --- a/common/logger/log.yml +++ b/pkg/logger/log.yml @@ -1,28 +1,28 @@ - -level: "debug" -development: true -disableCaller: false -disableStacktrace: false -sampling: -encoding: "console" - -# encoder -encoderConfig: - messageKey: "message" - levelKey: "level" - timeKey: "time" - nameKey: "logger" - callerKey: "caller" - stacktraceKey: "stacktrace" - lineEnding: "" - levelEncoder: "capitalColor" - timeEncoder: "iso8601" - durationEncoder: "seconds" - callerEncoder: "short" - nameEncoder: "" - -outputPaths: - - "stderr" -errorOutputPaths: - - "stderr" -initialFields: + +level: "debug" +development: true +disableCaller: false +disableStacktrace: false +sampling: +encoding: "console" + +# encoder +encoderConfig: + messageKey: "message" + levelKey: "level" + timeKey: "time" + nameKey: "logger" + callerKey: "caller" + stacktraceKey: "stacktrace" + lineEnding: "" + levelEncoder: "capitalColor" + timeEncoder: "iso8601" + durationEncoder: "seconds" + callerEncoder: "short" + nameEncoder: "" + +outputPaths: + - "stderr" +errorOutputPaths: + - "stderr" +initialFields: diff --git a/common/logger/logger.go b/pkg/logger/logger.go similarity index 86% rename from common/logger/logger.go rename to pkg/logger/logger.go index d7951a3c6..9c52e75ec 100644 --- a/common/logger/logger.go +++ b/pkg/logger/logger.go @@ -1,10 +1,10 @@ package logger import ( - "github.com/dubbogo/getty" "io/ioutil" "log" "path" + "sync" ) import ( @@ -18,9 +18,13 @@ var ( logger Logger ) -type DubboLogger struct { +type DubbogoProxyLogger struct { + mutex sync.Mutex Logger dynamicLevel zap.AtomicLevel + // disable presents the logger state. if disable is true, the logger will write nothing + // the default value is false + disable bool } type Logger interface { @@ -93,15 +97,11 @@ func InitLogger(conf *zap.Config) { } zapLogger, _ := zapLoggerConfig.Build(zap.AddCallerSkip(1)) //logger = zapLogger.Sugar() - logger = &DubboLogger{Logger: zapLogger.Sugar(), dynamicLevel: zapLoggerConfig.Level} - - // set getty log - getty.SetLogger(logger) + logger = &DubbogoProxyLogger{Logger: zapLogger.Sugar(), dynamicLevel: zapLoggerConfig.Level} } func SetLogger(log Logger) { logger = log - getty.SetLogger(logger) } func GetLogger() Logger { @@ -121,8 +121,8 @@ type OpsLogger interface { SetLoggerLevel(level string) } -func (dl *DubboLogger) SetLoggerLevel(level string) { +func (dpl *DubbogoProxyLogger) SetLoggerLevel(level string) { l := new(zapcore.Level) l.Set(level) - dl.dynamicLevel.SetLevel(*l) + dpl.dynamicLevel.SetLevel(*l) } diff --git a/common/logger/logger_test.go b/pkg/logger/logger_test.go similarity index 96% rename from common/logger/logger_test.go rename to pkg/logger/logger_test.go index caab6bff4..da7f2358c 100644 --- a/common/logger/logger_test.go +++ b/pkg/logger/logger_test.go @@ -59,7 +59,7 @@ func TestSetLevel(t *testing.T) { Debug("debug") Info("info") - SetLogger(GetLogger().(*DubboLogger).Logger) + SetLogger(GetLogger().(*DubbogoProxyLogger).Logger) assert.False(t, SetLoggerLevel("debug")) Debug("debug") Info("info") diff --git a/common/logger/logging.go b/pkg/logger/logging.go similarity index 100% rename from common/logger/logging.go rename to pkg/logger/logging.go diff --git a/pkg/model/base.go b/pkg/model/base.go new file mode 100644 index 000000000..de602ca03 --- /dev/null +++ b/pkg/model/base.go @@ -0,0 +1,119 @@ +package model + +type Metadata struct { + Info map[string]MetadataValue +} + +type MetadataValue interface { +} + +// Status is the components status +type Status int32 + +const ( + Down Status = 0 + Up Status = 1 + Unknown Status = 2 +) + +var StatusName = map[int32]string{ + 0: "Down", + 1: "Up", + 2: "Unknown", +} + +var StatusValue = map[string]int32{ + "Down": 0, + "Up": 1, + "Unknown": 2, +} + +// ProtocolType +type ProtocolType int32 + +const ( + HTTP ProtocolType = 0 + iota // support for 1.0 + TCP + UDP +) + +// ProtocolTypeName +var ProtocolTypeName = map[int32]string{ + 0: "HTTP", + 1: "TCP", + 2: "UDP", +} + +// ProtocolTypeValue +var ProtocolTypeValue = map[string]int32{ + "HTTP": 0, + "TCP": 1, + "UDP": 2, +} + +// Address the address +type Address struct { + SocketAddress SocketAddress `yaml:"socket_address" json:"socket_address" mapstructure:"socket_address"` +} + +// Address specify either a logical or physical address and port, which are +// used to tell proxy where to bind/listen, connect to upstream and find +// management servers +type SocketAddress struct { + ProtocolStr string `yaml:"protocol_type" json:"protocol_type" mapstructure:"protocol_type"` + Protocol ProtocolType `yaml:"omitempty" json:"omitempty"` + Address string `yaml:"address" json:"address" mapstructure:"address"` + Port int `yaml:"port" json:"port" mapstructure:"port"` + ResolverName string `yaml:"resolver_name" json:"resolver_name" mapstructure:"resolver_name"` +} + +// ConfigSource +type ConfigSource struct { + Path string `yaml:"path" json:"path" mapstructure:"path"` + ApiConfigSource ApiConfigSource `yaml:"api_config_source" json:"api_config_source" mapstructure:"api_config_source"` +} + +// ApiConfigSource +type ApiConfigSource struct { + ApiType ApiType `yaml:"omitempty" json:"omitempty"` + ApiTypeStr string `yaml:"api_type" json:"api_type" mapstructure:"api_type"` + ClusterName []string `yaml:"cluster_name" json:"cluster_name" mapstructure:"cluster_name"` +} + +type ApiType int32 + +const ( + REST_VALUE = "REST" + GRPC_VALUE = "GRPC" + DUBBO_VALUE = "DUBBO" +) + +const ( + REST ApiType = 0 + iota // support for 1.0 + GRPC + DUBBO +) + +var ApiTypeName = map[int32]string{ + 0: REST_VALUE, + 1: GRPC_VALUE, + 2: DUBBO_VALUE, +} + +var ApiTypeValue = map[string]int32{ + REST_VALUE: 0, + GRPC_VALUE: 1, + DUBBO_VALUE: 2, +} + +// HeaderValueOption +type HeaderValueOption struct { + Header []HeaderValue `yaml:"header" json:"header" mapstructure:"header"` + Append []bool `yaml:"append" json:"append" mapstructure:"append"` +} + +// HeaderValue +type HeaderValue struct { + Key string `yaml:"key" json:"key" mapstructure:"key"` + Value string `yaml:"value" json:"value" mapstructure:"value"` +} diff --git a/pkg/model/bootstrap.go b/pkg/model/bootstrap.go new file mode 100644 index 000000000..a4f3124a7 --- /dev/null +++ b/pkg/model/bootstrap.go @@ -0,0 +1,36 @@ +package model + +// Bootstrap the door +type Bootstrap struct { + StaticResources StaticResources `yaml:"static_resources" json:"static_resources" mapstructure:"static_resources"` + DynamicResources DynamicResources `yaml:"dynamic_resources" json:"dynamic_resources" mapstructure:"dynamic_resources"` + Tracing Tracing `yaml:"tracing" json:"tracing" mapstructure:"tracing"` +} + +// GetListeners +func (bs *Bootstrap) GetListeners() []Listener { + return bs.StaticResources.Listeners +} + +// ExistCluster +func (bs *Bootstrap) ExistCluster(name string) bool { + if len(bs.StaticResources.Clusters) > 0 { + for _, v := range bs.StaticResources.Clusters { + if v.Name == name { + return true + } + } + } + + return false +} + +// StaticResources +type StaticResources struct { + Listeners []Listener `yaml:"listeners" json:"listeners" mapstructure:"listeners"` + Clusters []Cluster `yaml:"clusters" json:"clusters" mapstructure:"clusters"` +} + +// DynamicResources TODO +type DynamicResources struct { +} diff --git a/pkg/model/cluster.go b/pkg/model/cluster.go new file mode 100644 index 000000000..c1e95f789 --- /dev/null +++ b/pkg/model/cluster.go @@ -0,0 +1,49 @@ +package model + +// Cluster a single upstream cluster +type Cluster struct { + Name string `yaml:"name" json:"name"` // Name the cluster unique name + TypeStr string `yaml:"type" json:"type"` // Type the cluster discovery type string value + Type DiscoveryType `yaml:"omitempty" json:"omitempty"` // Type the cluster discovery type + EdsClusterConfig EdsClusterConfig `yaml:"eds_cluster_config" json:"eds_cluster_config"` + LbStr string `yaml:"lb_policy" json:"lb_policy"` // Lb the cluster select node used loadBalance policy + Lb LbPolicy `yaml:"omitempty" json:"omitempty"` // Lb the cluster select node used loadBalance policy + ConnectTimeoutStr string `yaml:"connect_timeout" json:"connect_timeout"` // ConnectTimeout timeout for connect to cluster node + HealthChecks []HealthCheck `yaml:"health_checks" json:"health_checks"` + Hosts []Address `yaml:"hosts" json:"hosts"` // Hosts whe discovery type is Static, StrictDNS or LogicalDns,this need config +} + +// DiscoveryType +type DiscoveryType int32 + +const ( + Static DiscoveryType = 0 + iota + StrictDNS + LogicalDns + EDS + OriginalDst +) + +// DiscoveryTypeName +var DiscoveryTypeName = map[int32]string{ + 0: "Static", + 1: "StrictDNS", + 2: "LogicalDns", + 3: "EDS", + 4: "OriginalDst", +} + +// DiscoveryTypeValue +var DiscoveryTypeValue = map[string]int32{ + "Static": 0, + "StrictDNS": 1, + "LogicalDns": 2, + "EDS": 3, + "OriginalDst": 4, +} + +// EdsClusterConfig +type EdsClusterConfig struct { + EdsConfig ConfigSource `yaml:"eds_config" json:"eds_config" mapstructure:"eds_config"` + ServiceName string `yaml:"service_name" json:"service_name" mapstructure:"service_name"` +} diff --git a/pkg/model/filter.go b/pkg/model/filter.go new file mode 100644 index 000000000..ae36f6200 --- /dev/null +++ b/pkg/model/filter.go @@ -0,0 +1,18 @@ +package model + +// FilterChain filter chain +type FilterChain struct { + FilterChainMatch FilterChainMatch `yaml:"filter_chain_match" json:"filter_chain_match" mapstructure:"filter_chain_match"` + Filters []Filter `yaml:"filters" json:"filters" mapstructure:"filters"` +} + +// Filter core struct, filter is extend by user +type Filter struct { + Name string `yaml:"name" json:"name" mapstructure:"name"` // Name filter name unique + Config interface{} `yaml:"config" json:"config" mapstructure:"config"` // Config filter config +} + +// FilterChainMatch +type FilterChainMatch struct { + Domains []string `yaml:"domains" json:"domains" mapstructure:"domains"` +} diff --git a/pkg/model/health.go b/pkg/model/health.go new file mode 100644 index 000000000..6e214273e --- /dev/null +++ b/pkg/model/health.go @@ -0,0 +1,28 @@ +package model + +// HealthCheck +type HealthCheck struct { +} + +// HttpHealthCheck +type HttpHealthCheck struct { + HealthCheck + Host string + Path string + UseHttp2 bool + ExpectedStatuses int64 +} + +// GrpcHealthCheck +type GrpcHealthCheck struct { + HealthCheck + ServiceName string + Authority string +} + +// CustomHealthCheck +type CustomHealthCheck struct { + HealthCheck + Name string + Config interface{} +} diff --git a/pkg/model/http.go b/pkg/model/http.go new file mode 100644 index 000000000..36e1fa9fd --- /dev/null +++ b/pkg/model/http.go @@ -0,0 +1,66 @@ +package model + +// HttpConnectionManager +type HttpConnectionManager struct { + RouteConfig RouteConfiguration `yaml:"route_config" json:"route_config" mapstructure:"route_config"` + HttpFilters []HttpFilter `yaml:"http_filters" json:"http_filters" mapstructure:"http_filters"` + ServerName string `yaml:"server_name" json:"server_name" mapstructure:"server_name"` + IdleTimeoutStr string `yaml:"idle_timeout" json:"idle_timeout" mapstructure:"idle_timeout"` + AccessLog AccessLog `yaml:"access_log" json:"access_log" mapstructure:"access_log"` + GenerateRequestId bool `yaml:"generate_request_id" json:"generate_request_id" mapstructure:"generate_request_id"` +} + +// CorsPolicy +type CorsPolicy struct { + AllowOrigin []string `yaml:"allow_origin" json:"allow_origin" mapstructure:"allow_origin"` + AllowMethods string // access-control-allow-methods + AllowHeaders string // access-control-allow-headers + ExposeHeaders string // access-control-expose-headers + MaxAge string // access-control-max-age + AllowCredentials bool + Enabled bool `yaml:"enabled" json:"enabled" mapstructure:"enabled"` +} + +// HttpFilter +type HttpFilter struct { + Name string `yaml:"name" json:"name" mapstructure:"name"` + Config interface{} `yaml:"config" json:"config" mapstructure:"config"` +} + +type RequestMethod int32 + +const ( + METHOD_UNSPECIFIED = 0 + iota // (DEFAULT) + GET + HEAD + POST + PUT + DELETE + CONNECT + OPTIONS + TRACE +) + +var RequestMethodName = map[int32]string{ + 0: "METHOD_UNSPECIFIED", + 1: "GET", + 2: "HEAD", + 3: "POST", + 4: "PUT", + 5: "DELETE", + 6: "CONNECT", + 7: "OPTIONS", + 8: "TRACE", +} + +var RequestMethodValue = map[string]int32{ + "METHOD_UNSPECIFIED": 0, + "GET": 1, + "HEAD": 2, + "POST": 3, + "PUT": 4, + "DELETE": 5, + "CONNECT": 6, + "OPTIONS": 7, + "TRACE": 8, +} diff --git a/pkg/model/lb.go b/pkg/model/lb.go new file mode 100644 index 000000000..657470a4e --- /dev/null +++ b/pkg/model/lb.go @@ -0,0 +1,27 @@ +package model + +// LbPolicy the load balance policy enum +type LbPolicy int32 + +const ( + RoundRobin LbPolicy = 0 + IPHash LbPolicy = 1 + WightRobin LbPolicy = 2 + Rand LbPolicy = 3 +) + +// LbPolicyName key int32 for LbPolicy, value string +var LbPolicyName = map[int32]string{ + 0: "RoundRobin", + 1: "IPHash", + 2: "WightRobin", + 3: "Rand", +} + +// LbPolicyValue key string, value int32 for LbPolicy +var LbPolicyValue = map[string]int32{ + "RoundRobin": 0, + "IPHash": 1, + "WightRobin": 2, + "Rand": 3, +} diff --git a/pkg/model/listener.go b/pkg/model/listener.go new file mode 100644 index 000000000..5d2d017d8 --- /dev/null +++ b/pkg/model/listener.go @@ -0,0 +1,10 @@ +package model + +// Listener is a server, listener a port +type Listener struct { + Name string `yaml:"name" json:"name" mapstructure:"name"` + Address Address `yaml:"address" json:"address" mapstructure:"address"` + + FilterChains []FilterChain `yaml:"filter_chains" json:"filter_chains" mapstructure:"filter_chains"` + Config interface{} `yaml:"config" json:"config" mapstructure:"config"` +} diff --git a/pkg/model/log.go b/pkg/model/log.go new file mode 100644 index 000000000..b2a93a1ec --- /dev/null +++ b/pkg/model/log.go @@ -0,0 +1,20 @@ +package model + +// AccessLog +type AccessLog struct { + Name string `yaml:"name" json:"name" mapstructure:"name"` + Filter AccessLogFilter `yaml:"filter" json:"filter" mapstructure:"filter"` + Config interface{} `yaml:"config" json:"config" mapstructure:"config"` +} + +// AccessLogFilter +type AccessLogFilter struct { + StatusCodeFilter StatusCodeFilter `yaml:"status_code_filter" json:"status_code_filter" mapstructure:"status_code_filter"` + DurationFilter DurationFilter `yaml:"duration_filter" json:"duration_filter" mapstructure:"duration_filter"` +} + +type StatusCodeFilter struct { +} + +type DurationFilter struct { +} diff --git a/pkg/model/match.go b/pkg/model/match.go new file mode 100644 index 000000000..42f82cc6d --- /dev/null +++ b/pkg/model/match.go @@ -0,0 +1,41 @@ +package model + +// StringMatcher matcher string +type StringMatcher struct { + Matcher MatcherType +} + +// Match +func (sm *StringMatcher) Match() (bool, error) { + return true, nil +} + +// MatcherType matcher type +type MatcherType int32 + +const ( + Exact MatcherType = 0 + iota + Prefix + Suffix + Regex +) + +var MatcherTypeName = map[int32]string{ + 0: "Exact", + 1: "Prefix", + 2: "Suffix", + 3: "Regex", +} + +var MatcherTypeValue = map[string]int32{ + "Exact": 0, + "Prefix": 1, + "Suffix": 2, + "Regex": 3, +} + +type HeaderMatcher struct { + Name string `yaml:"name" json:"name"` + Value string `yaml:"value" json:"value"` + Regex bool `yaml:"regex" json:"regex"` +} diff --git a/pkg/model/router.go b/pkg/model/router.go new file mode 100644 index 000000000..49d21978b --- /dev/null +++ b/pkg/model/router.go @@ -0,0 +1,42 @@ +package model + +// Router 路由 +type Router struct { + Match RouterMatch `yaml:"match" json:"match"` + Route RouteAction `yaml:"route" json:"route"` + Redirect RouteAction `yaml:"redirect" json:"redirect"` + //"metadata": "{...}", + //"decorator": "{...}" +} + +// RouterMatch +type RouterMatch struct { + Prefix string `yaml:"prefix" json:"prefix"` + Path string `yaml:"path" json:"path"` + Regex string `yaml:"regex" json:"regex"` + CaseSensitive bool // CaseSensitive default true + Headers []HeaderMatcher `yaml:"headers" json:"headers"` +} + +// RouteAction +type RouteAction struct { + Cluster string `yaml:"cluster" json:"cluster"` // Cluster cluster name + ClusterNotFoundResponseCode int `yaml:"cluster_not_found_response_code" json:"cluster_not_found_response_code"` + PrefixRewrite string `yaml:"prefix_rewrite" json:"prefix_rewrite"` + HostRewrite string `yaml:"host_rewrite" json:"host_rewrite"` + Timeout string `yaml:"timeout" json:"timeout"` + Priority int8 `yaml:"priority" json:"priority"` + ResponseHeadersToAdd HeaderValueOption `yaml:"response_headers_to_add" json:"response_headers_to_add"` // ResponseHeadersToAdd add response head + ResponseHeadersToRemove []string `yaml:"response_headers_to_remove" json:"response_headers_to_remove"` // ResponseHeadersToRemove remove response head + RequestHeadersToAdd HeaderValueOption `yaml:"request_headers_to_add" json:"request_headers_to_add"` // RequestHeadersToAdd add request head + Cors CorsPolicy `yaml:"cors" json:"cors"` +} + +// RouteConfiguration +type RouteConfiguration struct { + InternalOnlyHeaders []string `yaml:"internal_only_headers" json:"internal_only_headers"` // InternalOnlyHeaders used internal, clear http request head + ResponseHeadersToAdd HeaderValueOption `yaml:"response_headers_to_add" json:"response_headers_to_add"` // ResponseHeadersToAdd add response head + ResponseHeadersToRemove []string `yaml:"response_headers_to_remove" json:"response_headers_to_remove"` // ResponseHeadersToRemove remove response head + RequestHeadersToAdd HeaderValueOption `yaml:"request_headers_to_add" json:"request_headers_to_add"` // RequestHeadersToAdd add request head + Routes []Router `yaml:"routes" json:"routes"` +} diff --git a/pkg/model/tracing.go b/pkg/model/tracing.go new file mode 100644 index 000000000..dd418a66b --- /dev/null +++ b/pkg/model/tracing.go @@ -0,0 +1,12 @@ +package model + +// Tracing +type Tracing struct { + Http Http `yaml:"http" json:"http,omitempty"` +} + +// Tracing +type Http struct { + Name string `yaml:"name"` + Config interface{} `yaml:"config"` +} diff --git a/pkg/model/types.go b/pkg/model/types.go new file mode 100644 index 000000000..8b5379070 --- /dev/null +++ b/pkg/model/types.go @@ -0,0 +1 @@ +package model diff --git a/pkg/proxy/api.go b/pkg/proxy/api.go new file mode 100644 index 000000000..814933023 --- /dev/null +++ b/pkg/proxy/api.go @@ -0,0 +1,130 @@ +package proxy + +import ( + "encoding/json" + "errors" + "github.com/dubbogo/dubbo-go-proxy/pkg" + "github.com/dubbogo/dubbo-go-proxy/pkg/model" +) + +import ( + "github.com/dubbogo/dubbo-go-proxy/pkg/service" +) + +import ( + "github.com/goinggo/mapstructure" +) + +func init() { + AddApiDiscoveryService(pkg.ApiDiscoveryService_Dubbo, NewApiDiscoveryService()) +} + +// Api +type Api struct { + Name string `json:"name"` + ITypeStr string `json:"itype"` + IType model.ApiType `json:"-"` + OTypeStr string `json:"otype"` + OType model.ApiType `json:"-"` + Status model.Status `json:"status"` + Metadata interface{} `json:"metadata"` + Method string `json:"method"` + model.RequestMethod + Client Client +} + +type DubboMetadata struct { + ApplicationName string `yaml:"application_name" json:"application_name" mapstructure:"application_name"` + Group string `yaml:"group" json:"group" mapstructure:"group"` + Version string `yaml:"version" json:"version" mapstructure:"version"` + Interface string `yaml:"interface" json:"interface" mapstructure:"interface"` + Method string `yaml:"method" json:"method" mapstructure:"method"` + Types []string `yaml:"type" json:"types" mapstructure:"types"` + Retries string `yaml:"retries" json:"retries,omitempty" property:"retries"` + ProtocolTypeStr string `yaml:"protocol_type" json:"protocol_type,omitempty" property:"protocol_type"` + SerializationTypeStr string `yaml:"serialization_type" json:"serialization_type,omitempty" property:"serialization_type"` +} + +func (a *Api) FindApi(name string) (*Api, bool) { + ads := GetMustApiDiscoveryService(pkg.ApiDiscoveryService_Dubbo) + if api, err := ads.GetApi(*service.NewDiscoveryRequest([]byte(name))); err != nil { + return nil, false + } else { + return api.Data.(*Api), true + } +} + +func (a *Api) MatchMethod(method string) bool { + i := model.RequestMethodValue[method] + if a.RequestMethod == model.RequestMethod(i) { + return true + } + + return false +} + +func (a *Api) IsOk(name string) bool { + if v, ok := apiCache[name]; ok { + return v.Status == model.Up + } + + return false +} + +// Offline api offline +func (a *Api) Offline(name string) { + if v, ok := apiCache[name]; ok { + v.Status = model.Down + } +} + +// Online api online +func (a *Api) Online(name string) { + if v, ok := apiCache[name]; ok { + v.Status = model.Up + } +} + +type ApiDiscoveryService struct { +} + +func NewApiDiscoveryService() *ApiDiscoveryService { + return &ApiDiscoveryService{} +} + +func (ads *ApiDiscoveryService) AddApi(request service.DiscoveryRequest) (service.DiscoveryResponse, error) { + aj := &Api{} + if err := json.Unmarshal(request.Body, aj); err != nil { + return *service.EmptyDiscoveryResponse, err + } + + apiCache[aj.Name] = aj + + if aj.Metadata == nil { + + } else { + if v, ok := aj.Metadata.(map[string]interface{}); ok { + if d, ok := v["dubbo"]; ok { + dm := &DubboMetadata{} + if err := mapstructure.Decode(d, dm); err != nil { + return *service.EmptyDiscoveryResponse, err + } + aj.Metadata = dm + } + } + + aj.RequestMethod = model.RequestMethod(model.RequestMethodValue[aj.Method]) + } + + return *service.NewSuccessDiscoveryResponse(), nil +} + +func (ads *ApiDiscoveryService) GetApi(request service.DiscoveryRequest) (service.DiscoveryResponse, error) { + n := string(request.Body) + + if a, ok := apiCache[n]; ok { + return *service.NewDiscoveryResponse(a), nil + } + + return *service.EmptyDiscoveryResponse, errors.New("not found") +} diff --git a/pkg/proxy/api_filter.go b/pkg/proxy/api_filter.go new file mode 100644 index 000000000..30ab7d955 --- /dev/null +++ b/pkg/proxy/api_filter.go @@ -0,0 +1,51 @@ +package proxy + +import ( + "net/http" +) + +import ( + "github.com/dubbogo/dubbo-go-proxy/pkg" +) + +var ( + default404Body = []byte("404 page not found") + default405Body = []byte("405 method not allowed") + default406Body = []byte("406 api not up") +) + +func init() { + AddFilterFunc(pkg.HttpApiFilter, ApiFilter()) +} + +func ApiFilter() FilterFunc { + return func(c Context) { + url := c.GetUrl() + method := c.GetMethod() + + isHit := false + a := &Api{} + if api, b := a.FindApi(url); b { + if !api.MatchMethod(method) { + c.WriteWithStatus(http.StatusMethodNotAllowed, default405Body) + } else { + if !api.IsOk(api.Name) { + c.WriteWithStatus(http.StatusNotAcceptable, default406Body) + } else { + isHit = true + c.Api(api) + c.Next() + } + } + } else { + // status must set first + c.WriteWithStatus(http.StatusNotFound, default404Body) + } + + if !isHit { + c.AddHeader(pkg.HeaderKeyContextType, pkg.HeaderValueTextPlain) + c.Abort() + } + + } +} diff --git a/pkg/proxy/cache.go b/pkg/proxy/cache.go new file mode 100644 index 000000000..1a43b8eff --- /dev/null +++ b/pkg/proxy/cache.go @@ -0,0 +1,35 @@ +package proxy + +var ( + apiCache = map[string]*Api{} + + filterFuncCache = map[string]func(Context){} +) + +func GetMustFilterFunc(name string) FilterFunc { + if ff, ok := filterFuncCache[name]; ok { + return ff + } + + panic("filter func for " + name + " is not existing!") +} + +func AddFilterFunc(name string, ff FilterFunc) { + filterFuncCache[name] = ff +} + +var ( + apiDiscoveryService = map[string]*ApiDiscoveryService{} +) + +func GetMustApiDiscoveryService(name string) *ApiDiscoveryService { + if ff, ok := apiDiscoveryService[name]; ok { + return ff + } + + panic("api discovery service for " + name + " is not existing!") +} + +func AddApiDiscoveryService(name string, ads *ApiDiscoveryService) { + apiDiscoveryService[name] = ads +} diff --git a/dubbo/call.go b/pkg/proxy/client.go similarity index 77% rename from dubbo/call.go rename to pkg/proxy/client.go index 98025f441..be1ce79a5 100644 --- a/dubbo/call.go +++ b/pkg/proxy/client.go @@ -1,42 +1,44 @@ -package dubbo +package proxy import ( - "context" "errors" "fmt" - "github.com/dubbogo/dubbo-go-proxy/common/config" - "github.com/dubbogo/dubbo-go-proxy/common/errcode" - "github.com/dubbogo/dubbo-go-proxy/common/logger" "reflect" "strings" ) -type InvokeData struct { - InterfaceName string - Version string - Group string - Method string - ParameterTypes []string - ReqData []interface{} +type Request struct { + Body []byte + Header map[string]string + Api *Api } -func (d *GenericClientPool) Call(inData InvokeData) (resp interface{}, ret int) { - var err error - c := d.Get(inData.InterfaceName, inData.Version, inData.Group) - ctx := context.Background() - resp, err = c.Invoke(ctx, []interface{}{inData.Method, inData.ParameterTypes, inData.ReqData}) - if err != nil { - ret = errcode.ServerBusy - logger.Errorf("GenericClient call get err:%v, InvokeData:%+v", err, inData) - return +func NewRequest(b []byte, api *Api) *Request { + return &Request{ + Body: b, + Api: api, } - resp, err = dealResp(resp, config.Config.ResultFiledHumpToLine) - if err != nil { - ret = errcode.ServerBusy - logger.Errorf("deal resp err:%v", err) - return +} + +type Response struct { + data interface{} +} + +func NewResponse(data interface{}) *Response { + if r, err := dealResp(data, true); err != nil { + return &Response{data: data} + } else { + return &Response{data: r} } - return +} + +var EmptyResponse = &Response{} + +type Client interface { + Init() error + Close() error + + Call(req *Request) (resp Response, err error) } func dealResp(in interface{}, HumpToLine bool) (interface{}, error) { @@ -154,6 +156,7 @@ func humpToLine(in interface{}) interface{} { } return out } + func humpToUnderline(s string) string { data := make([]byte, 0, len(s)*2) j := false @@ -170,6 +173,7 @@ func humpToUnderline(s string) string { } return strings.ToLower(string(data[:])) } + func struct2Map(obj interface{}) map[string]interface{} { t := reflect.TypeOf(obj) v := reflect.ValueOf(obj) diff --git a/pkg/proxy/config_load.go b/pkg/proxy/config_load.go new file mode 100644 index 000000000..cefb31a2c --- /dev/null +++ b/pkg/proxy/config_load.go @@ -0,0 +1,170 @@ +package proxy + +import ( + "encoding/json" + "io/ioutil" + "log" + "path/filepath" +) + +import ( + "github.com/dubbogo/dubbo-go-proxy/pkg/logger" + "github.com/dubbogo/dubbo-go-proxy/pkg/model" +) + +import ( + "github.com/ghodss/yaml" + "github.com/goinggo/mapstructure" +) + +var ( + configPath string + config *model.Bootstrap + configLoadFunc ConfigLoadFunc = DefaultConfigLoad +) + +func GetBootstrap() *model.Bootstrap { + return config +} + +// Load config file and parse +func Load(path string) *model.Bootstrap { + logger.Infof("[dubboproxy go] load path:%s", path) + + configPath, _ = filepath.Abs(path) + if yamlFormat(path) { + RegisterConfigLoadFunc(YAMLConfigLoad) + } + if cfg := configLoadFunc(path); cfg != nil { + config = cfg + } + + return config +} + +// ConfigLoadFunc parse a input(usually file path) into a proxy config +type ConfigLoadFunc func(path string) *model.Bootstrap + +// RegisterConfigLoadFunc can replace a new config load function instead of default +func RegisterConfigLoadFunc(f ConfigLoadFunc) { + configLoadFunc = f +} + +func yamlFormat(path string) bool { + ext := filepath.Ext(path) + if ext == ".yaml" || ext == ".yml" { + return true + } + return false +} + +func YAMLConfigLoad(path string) *model.Bootstrap { + log.Println("load config in YAML format from : ", path) + content, err := ioutil.ReadFile(path) + if err != nil { + log.Fatalln("[config] [yaml load] load config failed, ", err) + } + cfg := &model.Bootstrap{} + + bytes, err := yaml.YAMLToJSON(content) + if err != nil { + log.Fatalln("[config] [yaml load] convert YAML to JSON failed, ", err) + } + + err = json.Unmarshal(bytes, cfg) + if err != nil { + log.Fatalln("[config] [yaml load] yaml unmarshal config failed, ", err) + } + + // other adapter + + for i, l := range cfg.StaticResources.Listeners { + if l.Address.SocketAddress.ProtocolStr == "" { + l.Address.SocketAddress.ProtocolStr = "HTTP" + } + l.Address.SocketAddress.Protocol = model.ProtocolType(model.ProtocolTypeValue[l.Address.SocketAddress.ProtocolStr]) + + hc := &HttpConfig{} + if l.Config != nil { + if v, ok := l.Config.(map[string]interface{}); ok { + switch l.Name { + case "net/http": + if err := mapstructure.Decode(v, hc); err != nil { + logger.Error(err) + } + + cfg.StaticResources.Listeners[i].Config = hc + } + } + } + + for _, fc := range l.FilterChains { + if fc.Filters != nil { + for i, fcf := range fc.Filters { + hcm := &model.HttpConnectionManager{} + if fcf.Config != nil { + switch fcf.Name { + case "dgp.filters.http_connect_manager": + if v, ok := fcf.Config.(map[string]interface{}); ok { + if err := mapstructure.Decode(v, hcm); err != nil { + logger.Error(err) + } + + fc.Filters[i].Config = hcm + } + } + } + } + } + } + + } + + for _, c := range cfg.StaticResources.Clusters { + var discoverType int32 + if c.TypeStr != "" { + if t, ok := model.DiscoveryTypeValue[c.TypeStr]; ok { + discoverType = t + } else { + c.TypeStr = "EDS" + discoverType = model.DiscoveryTypeValue[c.TypeStr] + } + } else { + c.TypeStr = "EDS" + discoverType = model.DiscoveryTypeValue[c.TypeStr] + } + c.Type = model.DiscoveryType(discoverType) + + var lbPolicy int32 + if c.LbStr != "" { + if lb, ok := model.LbPolicyValue[c.LbStr]; ok { + lbPolicy = lb + } else { + c.LbStr = "RoundRobin" + lbPolicy = model.LbPolicyValue[c.LbStr] + } + } else { + c.LbStr = "RoundRobin" + lbPolicy = model.LbPolicyValue[c.LbStr] + } + c.Lb = model.LbPolicy(lbPolicy) + } + + return cfg +} + +func DefaultConfigLoad(path string) *model.Bootstrap { + log.Println("load config from : ", path) + content, err := ioutil.ReadFile(path) + if err != nil { + log.Fatalln("[config] [default load] load config failed, ", err) + } + cfg := &model.Bootstrap{} + // translate to lower case + err = json.Unmarshal(content, cfg) + if err != nil { + log.Fatalln("[config] [default load] json unmarshal config failed, ", err) + } + return cfg + +} diff --git a/pkg/proxy/config_load_test.go b/pkg/proxy/config_load_test.go new file mode 100644 index 000000000..82e32a5d2 --- /dev/null +++ b/pkg/proxy/config_load_test.go @@ -0,0 +1,90 @@ +package proxy + +import ( + "encoding/json" + "testing" +) + +func TestLoad(t *testing.T) { + Load("/Users/tc/Documents/workspace_2020/aproxy/configs/conf.yaml") +} + +func TestStruct2JSON(t *testing.T) { + b := Bootstrap{ + StaticResources: StaticResources{ + Listeners: []Listener{ + { + Name: "net/http", + Address: Address{ + SocketAddress: SocketAddress{ + ProtocolStr: "HTTP", + Address: "127.0.0.0", + Port: 8899, + }, + }, + Config: HttpConfig{ + IdleTimeoutStr: "5s", + WriteTimeoutStr: "5s", + ReadTimeoutStr: "5s", + }, + FilterChains: []FilterChain{ + { + FilterChainMatch: FilterChainMatch{ + Domains: []string{ + "api.dubbo.com", + "api.proxy.com", + }, + }, + Filters: []Filter{ + { + Name: "dgp.filters.http_connect_manager", + Config: HttpConnectionManager{ + RouteConfig: RouteConfiguration{ + Routes: []Router{ + { + Match: RouterMatch{ + Prefix: "/api/v1", + }, + Route: RouteAction{ + Cluster: "test_dubbo", + Cors: CorsPolicy{ + AllowOrigin: []string{ + "*", + }, + }, + }, + }, + }, + }, + HttpFilters: []HttpFilter{ + { + Name: "dgp.filters.http.cors", + }, + { + Name: "dgp.filters.http.router", + }, + }, + }, + }, + }, + }, + }, + }, + }, + Clusters: []Cluster{ + { + Name: "test_dubbo", + TypeStr: "EDS", + LbStr: "RoundRobin", + ConnectTimeoutStr: "5s", + }, + }, + }, + } + + if bytes, err := json.Marshal(b); err != nil { + t.Fatal(err) + } else { + t.Log(string(bytes)) + } +} diff --git a/pkg/proxy/context.go b/pkg/proxy/context.go new file mode 100644 index 000000000..d852acc66 --- /dev/null +++ b/pkg/proxy/context.go @@ -0,0 +1,197 @@ +package proxy + +import ( + "bytes" + "encoding/gob" + "encoding/json" + "math" + "net/http" +) + +import ( + "github.com/dubbogo/dubbo-go-proxy/pkg" + "github.com/dubbogo/dubbo-go-proxy/pkg/model" +) + +const abortIndex int8 = math.MaxInt8 / 2 + +type Context interface { + Next() + Abort() + + AppendFilterFunc(ff ...FilterFunc) + + Status(code int) + StatusCode() int + WriteWithStatus(int, []byte) (int, error) + Write([]byte) (int, error) + AddHeader(k, v string) + GetHeader(k string) string + GetUrl() string + GetMethod() string + + BuildFilters() + + Api(api *Api) + GetApi() *Api + + WriteErr(p interface{}) +} + +type BaseContext struct { + Context + index int8 + filters _FilterChain +} + +type FilterFunc func(Context) + +type _FilterChain []FilterFunc + +// Next should be used only inside middleware. +// It executes the pending handlers in the chain inside the calling handler. +// See example in GitHub. +func (c *BaseContext) Next() { + c.index++ + for c.index < int8(len(c.filters)) { + c.filters[c.index](c) + c.index++ + } +} + +func (c *BaseContext) Abort() { + c.index = abortIndex +} + +func (c *BaseContext) AppendFilterFunc(ff ...FilterFunc) { + for _, v := range ff { + c.filters = append(c.filters, v) + } +} + +type HttpContext struct { + *BaseContext + httpConnectionManager model.HttpConnectionManager + FilterChains []model.FilterChain + l *model.Listener + api *Api + + r *http.Request + writermem responseWriter + Writer ResponseWriter +} + +func (hc *HttpContext) Next() { + hc.index++ + for hc.index < int8(len(hc.filters)) { + hc.filters[hc.index](hc) + hc.index++ + } +} + +func (hc *HttpContext) reset() { + hc.Writer = &hc.writermem + hc.filters = nil + hc.index = -1 +} + +func (hc *HttpContext) Status(code int) { + hc.Writer.WriteHeader(code) +} + +func (hc *HttpContext) StatusCode() int { + return hc.Writer.Status() +} + +func (hc *HttpContext) Write(b []byte) (int, error) { + return hc.Writer.Write(b) +} + +func (hc *HttpContext) WriteWithStatus(code int, b []byte) (int, error) { + hc.Writer.WriteHeader(code) + return hc.Writer.Write(b) +} + +func (hc *HttpContext) AddHeader(k, v string) { + hc.Writer.Header().Add(k, v) +} + +func (hc *HttpContext) GetHeader(k string) string { + return hc.r.Header.Get(k) +} + +func (hc *HttpContext) GetUrl() string { + return hc.r.URL.Path +} + +func (hc *HttpContext) GetMethod() string { + return hc.r.Method +} + +func (hc *HttpContext) Api(api *Api) { + hc.api = api +} + +func (hc *HttpContext) GetApi() *Api { + return hc.api +} + +func (hc *HttpContext) WriteFail() { + hc.doWriteJSON(nil, http.StatusInternalServerError, nil) +} + +func (hc *HttpContext) WriteErr(p interface{}) { + hc.doWriteJSON(nil, http.StatusInternalServerError, p) +} + +func (hc *HttpContext) WriteSuccess() { + hc.doWriteJSON(nil, http.StatusOK, nil) +} + +func (hc *HttpContext) WriteResponse(resp Response) { + hc.doWriteJSON(nil, http.StatusOK, resp.data) +} + +func (hc *HttpContext) doWriteJSON(h map[string]string, code int, d interface{}) { + if h == nil { + h = make(map[string]string, 1) + } + h[pkg.HeaderKeyContextType] = pkg.HeaderValueJsonUtf8 + hc.doWrite(h, code, d) +} + +func (hc *HttpContext) doWrite(h map[string]string, code int, d interface{}) { + for k, v := range h { + hc.Writer.Header().Set(k, v) + } + + hc.Writer.WriteHeader(code) + + if d != nil { + if b, err := json.Marshal(d); err != nil { + hc.Writer.Write([]byte(err.Error())) + } else { + hc.Writer.Write(b) + } + } +} + +func (hc *HttpContext) BuildFilters() { + var ff []FilterFunc + + for _, v := range hc.httpConnectionManager.HttpFilters { + ff = append(ff, GetMustFilterFunc(v.Name)) + } + + hc.AppendFilterFunc(ff...) +} + +func GetBytes(k interface{}) ([]byte, error) { + var buf bytes.Buffer + enc := gob.NewEncoder(&buf) + err := enc.Encode(k) + if err != nil { + return nil, err + } + return buf.Bytes(), nil +} diff --git a/pkg/proxy/dubbo_client.go b/pkg/proxy/dubbo_client.go new file mode 100644 index 000000000..c8603fee1 --- /dev/null +++ b/pkg/proxy/dubbo_client.go @@ -0,0 +1,174 @@ +package proxy + +import ( + "context" + "encoding/json" + "strings" + "sync" + "time" +) + +import ( + "github.com/dubbogo/dubbo-go-proxy/pkg/logger" +) + +import ( + "github.com/apache/dubbo-go/common/constant" + dg "github.com/apache/dubbo-go/config" + "github.com/apache/dubbo-go/protocol/dubbo" +) + +// TODO java class name elem +const ( + JavaStringClassName = "java.lang.String" + JavaLangClassName = "java.lang.Long" +) + +var ( + _DubboClient *DubboClient + onceClient = sync.Once{} + dgCfg dg.ConsumerConfig +) + +type DubboClient struct { + mLock sync.RWMutex + GenericServicePool map[string]*dg.GenericService +} + +func SingleDubboClient() *DubboClient { + if _DubboClient == nil { + onceClient.Do(func() { + _DubboClient = NewDubboClient() + }) + } + + return _DubboClient +} + +func NewDubboClient() *DubboClient { + return &DubboClient{ + mLock: sync.RWMutex{}, + GenericServicePool: make(map[string]*dg.GenericService), + } +} + +func (dc *DubboClient) Init() error { + dgCfg = dg.GetConsumerConfig() + dg.SetConsumerConfig(dgCfg) + dg.Load() + dc.GenericServicePool = make(map[string]*dg.GenericService) + return nil +} + +func (dc *DubboClient) Close() error { + return nil +} + +func (dc *DubboClient) Call(r *Request) (resp Response, err error) { + dm := r.Api.Metadata.(*DubboMetadata) + gs := dc.Get(dm.Interface, dm.Version, dm.Group, dm) + + var reqData []interface{} + + l := len(dm.Types) + switch { + case l == 1: + t := dm.Types[0] + switch t { + case JavaStringClassName: + var s string + if err := json.Unmarshal(r.Body, &s); err != nil { + logger.Errorf("params parse error:%+v", err) + } else { + reqData = append(reqData, s) + } + case JavaLangClassName: + var i int + if err := json.Unmarshal(r.Body, &i); err != nil { + logger.Errorf("params parse error:%+v", err) + } else { + reqData = append(reqData, i) + } + default: + bodyMap := make(map[string]interface{}) + if err := json.Unmarshal(r.Body, &bodyMap); err != nil { + return *EmptyResponse, err + } else { + reqData = append(reqData, bodyMap) + } + } + case l > 1: + if err = json.Unmarshal(r.Body, &reqData); err != nil { + return *EmptyResponse, err + } + } + + logger.Debugf("[dubbogo proxy] invoke, method:%v, types:%v, reqData:%v", dm.Method, dm.Types, reqData) + + if resp, err := gs.Invoke(context.Background(), []interface{}{dm.Method, dm.Types, reqData}); err != nil { + return *EmptyResponse, err + } else { + logger.Debugf("[dubbogo proxy] dubbo client resp:%v", resp) + return *NewResponse(resp), nil + } +} + +func (dc *DubboClient) get(key string) *dg.GenericService { + dc.mLock.RLock() + defer dc.mLock.RUnlock() + return dc.GenericServicePool[key] +} + +func (dc *DubboClient) check(key string) bool { + dc.mLock.RLock() + defer dc.mLock.RUnlock() + if _, ok := dc.GenericServicePool[key]; ok { + return true + } else { + return false + } +} + +func (dc *DubboClient) create(interfaceName, version, group string, dm *DubboMetadata) *dg.GenericService { + key := strings.Join([]string{interfaceName, version, group}, "_") + referenceConfig := dg.NewReferenceConfig(interfaceName, context.TODO()) + referenceConfig.InterfaceName = interfaceName + referenceConfig.Cluster = constant.DEFAULT_CLUSTER + var registers []string + for k := range dgCfg.Registries { + registers = append(registers, k) + } + referenceConfig.Registry = strings.Join(registers, ",") + + if dm.ProtocolTypeStr == "" { + referenceConfig.Protocol = dubbo.DUBBO + } else { + referenceConfig.Protocol = dm.ProtocolTypeStr + } + + referenceConfig.Version = version + referenceConfig.Group = group + referenceConfig.Generic = true + if dm.Retries == "" { + referenceConfig.Retries = "3" + } else { + referenceConfig.Retries = dm.Retries + } + dc.mLock.Lock() + defer dc.mLock.Unlock() + referenceConfig.GenericLoad(interfaceName) + time.Sleep(200 * time.Millisecond) //sleep to wait invoker create + clientService := referenceConfig.GetRPCService().(*dg.GenericService) + + dc.GenericServicePool[key] = clientService + return clientService +} + +func (dc *DubboClient) Get(interfaceName, version, group string, dm *DubboMetadata) *dg.GenericService { + key := strings.Join([]string{interfaceName, version, group}, "_") + if dc.check(key) { + return dc.get(key) + } else { + return dc.create(interfaceName, version, group, dm) + } +} diff --git a/pkg/proxy/dubbo_filter.go b/pkg/proxy/dubbo_filter.go new file mode 100644 index 000000000..373596f59 --- /dev/null +++ b/pkg/proxy/dubbo_filter.go @@ -0,0 +1,51 @@ +package proxy + +import ( + "io/ioutil" +) + +import ( + "github.com/dubbogo/dubbo-go-proxy/pkg" + "github.com/dubbogo/dubbo-go-proxy/pkg/logger" +) + +import ( + _ "github.com/apache/dubbo-go/cluster/cluster_impl" + _ "github.com/apache/dubbo-go/cluster/loadbalance" + _ "github.com/apache/dubbo-go/filter/filter_impl" + _ "github.com/apache/dubbo-go/registry/protocol" + _ "github.com/apache/dubbo-go/registry/zookeeper" +) + +func init() { + AddFilterFunc(pkg.HttpTransferDubboFilter, HttpDubbo()) +} + +func HttpDubbo() FilterFunc { + return func(c Context) { + doDubbo(c.(*HttpContext)) + } +} + +func doDubbo(c *HttpContext) { + api := c.GetApi() + + if bytes, err := ioutil.ReadAll(c.r.Body); err != nil { + logger.Errorf("[dubboproxy go] read body err:%v!", err) + c.WriteFail() + c.Abort() + } else { + if api.Client == nil { + api.Client = SingleDubboClient() + } + + if resp, err := api.Client.Call(NewRequest(bytes, api)); err != nil { + logger.Errorf("[dubboproxy go] client do err:%v!", err) + c.WriteFail() + c.Abort() + } else { + c.WriteResponse(resp) + c.Next() + } + } +} diff --git a/pkg/proxy/http.go b/pkg/proxy/http.go new file mode 100644 index 000000000..45e311854 --- /dev/null +++ b/pkg/proxy/http.go @@ -0,0 +1,29 @@ +package proxy + +import ( + "github.com/dubbogo/dubbo-go-proxy/pkg" + "github.com/dubbogo/dubbo-go-proxy/pkg/model" +) + +// DefaultHttpConnectionManager +func DefaultHttpConnectionManager() *model.HttpConnectionManager { + return &model.HttpConnectionManager{ + RouteConfig: model.RouteConfiguration{ + Routes: []model.Router{ + { + Match: model.RouterMatch{ + Prefix: "/api/v1", + }, + Route: model.RouteAction{ + Cluster: "*", + }, + }, + }, + }, + HttpFilters: []model.HttpFilter{ + { + Name: pkg.HttpRouterFilter, + }, + }, + } +} diff --git a/pkg/proxy/http_context.go b/pkg/proxy/http_context.go new file mode 100644 index 000000000..84637a322 --- /dev/null +++ b/pkg/proxy/http_context.go @@ -0,0 +1,126 @@ +package proxy + +import ( + "bufio" + "io" + "net" + "net/http" +) + +import ( + "github.com/dubbogo/dubbo-go-proxy/pkg/logger" +) + +const ( + noWritten = -1 + defaultStatus = http.StatusOK +) + +// ResponseWriter ... +type ResponseWriter interface { + http.ResponseWriter + http.Hijacker + http.Flusher + http.CloseNotifier + + // Returns the HTTP response status code of the current request. + Status() int + + // Returns the number of bytes already written into the response http body. + // See Written() + Size() int + + // Writes the string into the response body. + WriteString(string) (int, error) + + // Returns true if the response body was already written. + Written() bool + + // Forces to write the http header (status code + headers). + WriteHeaderNow() + + // get the http.Pusher for server push + Pusher() http.Pusher +} + +type responseWriter struct { + http.ResponseWriter + size int + status int +} + +var _ ResponseWriter = &responseWriter{} + +func (w *responseWriter) reset(writer http.ResponseWriter) { + w.ResponseWriter = writer + w.size = noWritten + w.status = defaultStatus +} + +func (w *responseWriter) WriteHeader(code int) { + if code > 0 && w.status != code { + if w.Written() { + logger.Debugf("[WARNING] Headers were already written. Wanted to override status with %d code with %d", w.status, code) + } + w.status = code + } +} + +func (w *responseWriter) WriteHeaderNow() { + if !w.Written() { + w.size = 0 + w.ResponseWriter.WriteHeader(w.status) + } +} + +func (w *responseWriter) Write(data []byte) (n int, err error) { + w.WriteHeaderNow() + n, err = w.ResponseWriter.Write(data) + w.size += n + return +} + +func (w *responseWriter) WriteString(s string) (n int, err error) { + w.WriteHeaderNow() + n, err = io.WriteString(w.ResponseWriter, s) + w.size += n + return +} + +func (w *responseWriter) Status() int { + return w.status +} + +func (w *responseWriter) Size() int { + return w.size +} + +func (w *responseWriter) Written() bool { + return w.size != noWritten +} + +// Hijack implements the http.Hijacker interface. +func (w *responseWriter) Hijack() (net.Conn, *bufio.ReadWriter, error) { + if w.size < 0 { + w.size = 0 + } + return w.ResponseWriter.(http.Hijacker).Hijack() +} + +// CloseNotify implements the http.CloseNotify interface. +func (w *responseWriter) CloseNotify() <-chan bool { + return w.ResponseWriter.(http.CloseNotifier).CloseNotify() +} + +// Flush implements the http.Flush interface. +func (w *responseWriter) Flush() { + w.WriteHeaderNow() + w.ResponseWriter.(http.Flusher).Flush() +} + +func (w *responseWriter) Pusher() (pusher http.Pusher) { + if pusher, ok := w.ResponseWriter.(http.Pusher); ok { + return pusher + } + return nil +} diff --git a/pkg/proxy/http_filter.go b/pkg/proxy/http_filter.go new file mode 100644 index 000000000..1757bedeb --- /dev/null +++ b/pkg/proxy/http_filter.go @@ -0,0 +1,93 @@ +package proxy + +import ( + "regexp" + "strings" +) + +import ( + "github.com/dubbogo/dubbo-go-proxy/pkg" + "github.com/dubbogo/dubbo-go-proxy/pkg/model" +) + +func init() { + AddFilterFunc(pkg.HttpDomainFilter, Domain()) +} + +// Domain +// https :authority +// http Host +func Domain() FilterFunc { + return func(c Context) { + if MatchDomainFilter(c.(*HttpContext)) { + c.Next() + } + } +} + +func MatchDomainFilter(c *HttpContext) bool { + for _, v := range c.l.FilterChains { + for _, d := range v.FilterChainMatch.Domains { + if d == c.GetHeader("Host") { + return true + } + } + } + + return false +} + +func HttpHeaderMatch(c *HttpContext, hm model.HeaderMatcher) bool { + if hm.Name == "" { + return true + } + + if hm.Value == "" { + if c.GetHeader(hm.Name) == "" { + return true + } + } else { + if hm.Regex { + // TODO + return true + } else { + if c.GetHeader(hm.Name) == hm.Value { + return true + } + } + } + + return false +} + +func HttpRouteMatch(c *HttpContext, rm model.RouterMatch) bool { + if rm.Prefix != "" { + if !strings.HasPrefix(c.GetUrl(), rm.Path) { + return false + } + } + + if rm.Path != "" { + if c.GetUrl() != rm.Path { + return false + } + } + + if rm.Regex != "" { + if !regexp.MustCompile(rm.Regex).MatchString(c.GetUrl()) { + return false + } + } + + return true +} + +func HttpRouteActionMatch(c *HttpContext, ra model.RouteAction) bool { + conf := GetBootstrap() + + if ra.Cluster == "" || !conf.ExistCluster(ra.Cluster) { + return false + } + + return true +} diff --git a/pkg/proxy/listener.go b/pkg/proxy/listener.go new file mode 100644 index 000000000..7faa184db --- /dev/null +++ b/pkg/proxy/listener.go @@ -0,0 +1,148 @@ +package proxy + +import ( + "log" + "net/http" + "strconv" + "sync" + "time" +) + +import ( + "github.com/dubbogo/dubbo-go-proxy/pkg" + "github.com/dubbogo/dubbo-go-proxy/pkg/logger" + "github.com/dubbogo/dubbo-go-proxy/pkg/model" +) + +type ListenerService struct { + *model.Listener +} + +func (l *ListenerService) Start() { + switch l.Address.SocketAddress.Protocol { + case model.HTTP: + l.httpListener() + default: + panic("un support protocol start: " + l.Address.SocketAddress.ProtocolStr) + } +} + +func (l *ListenerService) httpListener() { + hl := &DefaultHttpListener{ + pool: sync.Pool{}, + } + hl.pool.New = func() interface{} { + return l.allocateContext() + } + + var hc HttpConfig + if l.Config == "" { + + } else { + if c, ok := l.Config.(HttpConfig); ok { + hc = c + } + } + + mux := http.NewServeMux() + mux.HandleFunc("/", hl.ServeHTTP) + + srv := http.Server{ + Addr: resolveAddress(l.Address.SocketAddress.Address + ":" + strconv.Itoa(l.Address.SocketAddress.Port)), + Handler: mux, + ReadTimeout: resolveStr2Time(hc.ReadTimeoutStr, 20*time.Second), + WriteTimeout: resolveStr2Time(hc.WriteTimeoutStr, 20*time.Second), + IdleTimeout: resolveStr2Time(hc.IdleTimeoutStr, 20*time.Second), + MaxHeaderBytes: resolveInt2IntProp(hc.MaxHeaderBytes, 1<<20), + } + + logger.Infof("[dubboproxy go] httpListener start by config : %+v", l) + + log.Println(srv.ListenAndServe()) +} + +func (l *ListenerService) allocateContext() *HttpContext { + return &HttpContext{ + l: l.Listener, + FilterChains: l.FilterChains, + httpConnectionManager: l.findHttpManager(), + BaseContext: &BaseContext{}, + } +} + +func (l *ListenerService) findHttpManager() model.HttpConnectionManager { + for _, fc := range l.FilterChains { + for _, f := range fc.Filters { + if f.Name == pkg.HttpConnectManagerFilter { + return *f.Config.(*model.HttpConnectionManager) + } + } + } + + return *DefaultHttpConnectionManager() +} + +type HttpConfig struct { + IdleTimeoutStr string `yaml:"idle_timeout" json:"idle_timeout" mapstructure:"idle_timeout"` + ReadTimeoutStr string `json:"read_timeout,omitempty" yaml:"read_timeout,omitempty" mapstructure:"read_timeout"` + WriteTimeoutStr string `json:"write_timeout,omitempty" yaml:"write_timeout,omitempty" mapstructure:"write_timeout"` + MaxHeaderBytes int `json:"max_header_bytes,omitempty" yaml:"max_header_bytes,omitempty" mapstructure:"max_header_bytes"` +} + +type DefaultHttpListener struct { + pool sync.Pool +} + +func (s *DefaultHttpListener) ServeHTTP(w http.ResponseWriter, r *http.Request) { + hc := s.pool.Get().(*HttpContext) + hc.r = r + hc.writermem.reset(w) + hc.reset() + + hc.AppendFilterFunc(Logger(), Recover()) + + hc.BuildFilters() + + s.handleHTTPRequest(hc) + + s.pool.Put(hc) +} + +func (s *DefaultHttpListener) handleHTTPRequest(c *HttpContext) { + if len(c.BaseContext.filters) > 0 { + c.Next() + c.writermem.WriteHeaderNow() + return + } + + // TODO redirect +} + +func resolveInt2IntProp(currentV, defaultV int) int { + if currentV == 0 { + return defaultV + } + + return currentV +} + +func resolveStr2Time(currentV string, defaultV time.Duration) time.Duration { + if currentV == "" { + return defaultV + } else { + if duration, err := time.ParseDuration(currentV); err != nil { + return 20 * time.Second + } else { + return duration + } + } +} + +func resolveAddress(addr string) string { + if addr == "" { + logger.Debug("Addr is undefined. Using port :8080 by default") + return ":8080" + } + + return addr +} diff --git a/pkg/proxy/logger_filter.go b/pkg/proxy/logger_filter.go new file mode 100644 index 000000000..7caf23094 --- /dev/null +++ b/pkg/proxy/logger_filter.go @@ -0,0 +1,21 @@ +package proxy + +import ( + "time" +) + +import ( + "github.com/dubbogo/dubbo-go-proxy/pkg/logger" +) + +func Logger() FilterFunc { + return func(c Context) { + start := time.Now() + + c.Next() + + latency := time.Now().Sub(start) + + logger.Infof("[dubboproxy go] [UPSTREAM] receive request | %d | %s | %s | %s | ", c.StatusCode(), latency, c.GetMethod(), c.GetUrl()) + } +} diff --git a/pkg/proxy/proxy_start.go b/pkg/proxy/proxy_start.go new file mode 100644 index 000000000..457af8a6d --- /dev/null +++ b/pkg/proxy/proxy_start.go @@ -0,0 +1,105 @@ +package proxy + +import ( + "encoding/json" + "sync" +) + +import ( + "github.com/dubbogo/dubbo-go-proxy/pkg" + "github.com/dubbogo/dubbo-go-proxy/pkg/logger" + "github.com/dubbogo/dubbo-go-proxy/pkg/model" + "github.com/dubbogo/dubbo-go-proxy/pkg/service" +) + +type Proxy struct { + startWG sync.WaitGroup +} + +func (p *Proxy) Start() { + conf := GetBootstrap() + + p.startWG.Add(1) + + defer func() { + if re := recover(); re != nil { + logger.Error(re) + // TODO stop + } + }() + + p.beforeStart() + + listeners := conf.GetListeners() + + for _, s := range listeners { + ls := ListenerService{Listener: &s} + go ls.Start() + } +} + +func (p *Proxy) beforeStart() { + NewDubboClient().Init() + + // TODO mock api register + ads := GetMustApiDiscoveryService(pkg.ApiDiscoveryService_Dubbo) + + a1 := &Api{ + Name: "/api/v1/test-dubbo/user", + ITypeStr: "HTTP", + OTypeStr: "DUBBO", + Method: "POST", + Status: 1, + Metadata: map[string]DubboMetadata{ + "dubbo": { + ApplicationName: "BDTService", + Group: "test", + Version: "1.0.0", + Interface: "com.ikurento.user.UserProvider", + Method: "queryUser", + Types: []string{ + "com.ikurento.user.User", + }, + }, + }, + } + a2 := &Api{ + Name: "/api/v1/test-dubbo/getUserByName", + ITypeStr: "HTTP", + OTypeStr: "DUBBO", + Method: "POST", + Status: 1, + Metadata: map[string]DubboMetadata{ + "dubbo": { + ApplicationName: "BDTService", + Group: "test", + Version: "1.0.0", + Interface: "com.ikurento.user.UserProvider", + Method: "GetUser", + Types: []string{ + "java.lang.String", + }, + }, + }, + } + + j1, _ := json.Marshal(a1) + j2, _ := json.Marshal(a2) + ads.AddApi(*service.NewDiscoveryRequest(j1)) + ads.AddApi(*service.NewDiscoveryRequest(j2)) +} + +func NewProxy() *Proxy { + return &Proxy{ + startWG: sync.WaitGroup{}, + } +} + +func Start(bs *model.Bootstrap) { + logger.Infof("[dubboproxy go] start by config : %+v", bs) + + proxy := NewProxy() + proxy.Start() + + proxy.startWG.Wait() +} diff --git a/pkg/proxy/recovery_filter.go b/pkg/proxy/recovery_filter.go new file mode 100644 index 000000000..700742a63 --- /dev/null +++ b/pkg/proxy/recovery_filter.go @@ -0,0 +1,15 @@ +package proxy + +import "github.com/dubbogo/dubbo-go-proxy/pkg/logger" + +func Recover() FilterFunc { + return func(c Context) { + defer func() { + if err := recover(); err != nil { + logger.Infof("[dubboproxy go] error:%+v", err) + c.WriteErr(err) + } + }() + c.Next() + } +} diff --git a/pkg/proxy/router_filter.go b/pkg/proxy/router_filter.go new file mode 100644 index 000000000..29ba54c66 --- /dev/null +++ b/pkg/proxy/router_filter.go @@ -0,0 +1,79 @@ +package proxy + +import ( + "github.com/dubbogo/dubbo-go-proxy/pkg" + "github.com/dubbogo/dubbo-go-proxy/pkg/model" + "net/http" + "strings" +) + +var ( + default403Body = []byte("403 for bidden") +) + +func init() { + AddFilterFunc(pkg.HttpRouterFilter, HttpRouting()) +} + +// HttpRouting http router filter +func HttpRouting() FilterFunc { + return func(c Context) { + routingFilter(c.(*HttpContext)) + } +} + +// routingFilter +func routingFilter(c *HttpContext) { + result := true + for _, v := range c.httpConnectionManager.RouteConfig.Routes { + result = routeMatch(c, v) + if result { + httpHeaderCorsHandler(c, v) + break + } + } + + if !result { + c.WriteWithStatus(http.StatusForbidden, default403Body) + c.Abort() + } +} + +// routeMatch will match router with request, only true or false way +func routeMatch(c *HttpContext, r model.Router) bool { + result := true + if len(r.Match.Headers) > 0 { + for _, v := range r.Match.Headers { + result = HttpHeaderMatch(c, v) + if !result { + break + } + } + } + + if !result { + return result + } + + result = HttpRouteMatch(c, r.Match) + + if !result { + return result + } + + return HttpRouteActionMatch(c, r.Route) +} + +// httpHeaderCorsHandler will set cors, handler mean can do c.Next() +func httpHeaderCorsHandler(c *HttpContext, r model.Router) { + var acao string + if r.Route.Cors.Enabled { + acao = strings.Join(r.Route.Cors.AllowOrigin, "|") + } + + c.Next() + + if acao != "" { + c.AddHeader(pkg.HeaderKeyAccessControlAllowOrigin, acao) + } +} diff --git a/pkg/service/discovery_service.go b/pkg/service/discovery_service.go new file mode 100644 index 000000000..9e77c50e2 --- /dev/null +++ b/pkg/service/discovery_service.go @@ -0,0 +1,56 @@ +package service + +type DiscoveryRequest struct { + Body []byte +} + +func NewDiscoveryRequest(b []byte) *DiscoveryRequest { + return &DiscoveryRequest{ + Body: b, + } +} + +type DiscoveryResponse struct { + Success bool + Data interface{} +} + +func NewSuccessDiscoveryResponse() *DiscoveryResponse { + return &DiscoveryResponse{ + Success: true, + } +} + +func NewDiscoveryResponse(d interface{}) *DiscoveryResponse { + return &DiscoveryResponse{ + Success: true, + Data: d, + } +} + +var EmptyDiscoveryResponse = &DiscoveryResponse{} + +type ApiDiscoveryService interface { + AddApi(request DiscoveryRequest) (DiscoveryResponse, error) + GetApi(request DiscoveryRequest) (DiscoveryResponse, error) +} + +type ListenerDiscoveryService interface { + AddListeners(request DiscoveryRequest) (DiscoveryResponse, error) + GetListeners(request DiscoveryRequest) (DiscoveryResponse, error) +} + +type RouteDiscoveryService interface { + AddRoutes(r DiscoveryRequest) (DiscoveryResponse, error) + GetRoutes(r DiscoveryRequest) (DiscoveryResponse, error) +} + +type ClusterDiscoveryService interface { + AddClusters(r DiscoveryRequest) (DiscoveryResponse, error) + GetClusters(r DiscoveryRequest) (DiscoveryResponse, error) +} + +type EndpointDiscoveryService interface { + AddEndpoints(r DiscoveryRequest) (DiscoveryResponse, error) + GetEndpoints(r DiscoveryRequest) (DiscoveryResponse, error) +} diff --git a/pkg/types.go b/pkg/types.go new file mode 100644 index 000000000..e222f0889 --- /dev/null +++ b/pkg/types.go @@ -0,0 +1,21 @@ +package pkg + +const ( + HttpConnectManagerFilter = "dgp.filters.http_connect_manager" + HttpRouterFilter = "dgp.filters.http.router" + HttpApiFilter = "dgp.filters.http.api" + HttpDomainFilter = "dgp.filters.http.domain" + HttpTransferDubboFilter = "dgp.filters.http_transfer_dubbo" +) + +const ( + ApiDiscoveryService_Dubbo = "ads_dubbo" +) + +const ( + HeaderKeyContextType = "Content-Type" + HeaderKeyAccessControlAllowOrigin = "Access-Control-Allow-Origin" + + HeaderValueJsonUtf8 = "application/json;charset=UTF-8" + HeaderValueTextPlain = "text/plain" +) diff --git a/service/context.go b/service/context.go deleted file mode 100644 index 3351373ef..000000000 --- a/service/context.go +++ /dev/null @@ -1,37 +0,0 @@ -package service - -import ( - "context" - "github.com/dubbogo/dubbo-go-proxy/dubbo" -) - -type ProxyContext interface { - //base - NextFilter() Filter - - Match() (*MetadataIdentifier, *MetadataInfo, int) - - InvokeData() *dubbo.InvokeData - - //SetInvokeResp() - //GetInvokeResp() -} -type BaseContext struct { - filter []Filter - ctx context.Context -} - -func NewBaseContext(filter []Filter) *BaseContext { - return &BaseContext{ - filter: filter, - ctx: context.Background(), - } -} -func (h *BaseContext) NextFilter() Filter { - if len(h.filter) > 0 { - f := h.filter[0] - h.filter = h.filter[1:] - return f - } - return nil -} diff --git a/service/context/http_context.go b/service/context/http_context.go deleted file mode 100644 index 8f872067b..000000000 --- a/service/context/http_context.go +++ /dev/null @@ -1,123 +0,0 @@ -package context - -import ( - "github.com/dubbogo/dubbo-go-proxy/common/constant" - "github.com/dubbogo/dubbo-go-proxy/common/errcode" - "github.com/dubbogo/dubbo-go-proxy/common/logger" - "github.com/dubbogo/dubbo-go-proxy/common/util" - "github.com/dubbogo/dubbo-go-proxy/dubbo" - "github.com/dubbogo/dubbo-go-proxy/service" - "io/ioutil" - "net/http" - "strings" -) - -type httpContext struct { - *service.BaseContext - r *http.Request - w http.ResponseWriter - bodyMap BodyMap - - mdKey *service.MetadataIdentifier - mdInfo *service.MetadataInfo - - metadataCenter service.MetadataCenter -} -type BodyMap struct { - ParamTypes []string - ParamValues []interface{} -} - -func NewHttpContext(w http.ResponseWriter, r *http.Request) service.ProxyContext { - ctx := &httpContext{ - BaseContext: service.NewBaseContext([]service.Filter{ - service.GetFilter(constant.MatchFilterName)}), - r: r, - w: w, - } - if body, err := ioutil.ReadAll(r.Body); err == nil && len(body) > 0 { - err = util.ParseJsonByStruct(body, &ctx.bodyMap) - if err != nil { - logger.Warn("body to map[string]interface fail ", string(body)) - } - } - return ctx -} -func (hc *httpContext) Match() (*service.MetadataIdentifier, *service.MetadataInfo, int) { - //todo 需要支持更复杂的match,包括restful,等等 - if hc.mdKey != nil { - return hc.mdKey, hc.mdInfo, errcode.Success - } - ss := strings.Split(hc.r.URL.Path, "/") - if len(ss) < 3 { - return nil, nil, errcode.NotFind - } - application := ss[1] - serviceInterfaceName := ss[2] - group := hc.r.FormValue("group") - version := hc.r.FormValue("version") - hc.mdKey = &service.MetadataIdentifier{ - ServiceInterface: serviceInterfaceName, - Version: version, - Group: group, - Application: application, - Side: "provider", - } - if hc.metadataCenter == nil { - hc.mdInfo = nil - } else { - hc.mdInfo = hc.metadataCenter.GetProviderMetaData(hc.mdKey) - } - return hc.mdKey, hc.mdInfo, errcode.Success -} -func (hc *httpContext) InvokeData() *dubbo.InvokeData { - if hc.mdKey == nil { - logger.Error("httpContext.MetadataIdentifier is nil, check if had do match()") - return nil - } - method := hc.getMethod() - parameterTypes, ok := hc.getParameterTypes(method) - if !ok { - logger.Warn("get parameterTypes fail") - return nil - } - reqData, ok := hc.getParamValues() - if !ok { - logger.Warn("get paramValues fail") - return nil - } - invokeData := &dubbo.InvokeData{ - InterfaceName: hc.mdKey.ServiceInterface, - Group: hc.mdKey.Group, - Version: hc.mdKey.Version, - Method: method, - ParameterTypes: parameterTypes, - ReqData: reqData, - } - return invokeData -} -func (hc *httpContext) getMethod() string { - return hc.r.FormValue("method") -} -func (hc *httpContext) getParameterTypes(method string) ([]string, bool) { - //todo 优化 - if hc.mdInfo != nil && len(hc.mdInfo.Methods) > 0 { - for _, v := range hc.mdInfo.Methods { - if v.Name == method { - return v.ParameterTypes, true - } - } - } - - // 元数据中获取不到从body中获取 - if len(hc.bodyMap.ParamTypes) > 0 { - return hc.bodyMap.ParamTypes, true - } - return nil, false -} -func (hc *httpContext) getParamValues() ([]interface{}, bool) { - if len(hc.bodyMap.ParamValues) > 0 { - return hc.bodyMap.ParamValues, true - } - return nil, false -} diff --git a/service/filter.go b/service/filter.go deleted file mode 100644 index 7278d6bba..000000000 --- a/service/filter.go +++ /dev/null @@ -1,20 +0,0 @@ -package service - -var ( - filters = make(map[string]func() Filter) -) - -type Filter interface { - OnRequest(ctx ProxyContext) (ret int) -} - -func SetFilter(name string, v func() Filter) { - filters[name] = v -} - -func GetFilter(name string) Filter { - if filters[name] == nil { - panic("filter for " + name + " is not existing!") - } - return filters[name]() -} diff --git a/service/filter/match_filter.go b/service/filter/match_filter.go deleted file mode 100644 index a7c5fa9d0..000000000 --- a/service/filter/match_filter.go +++ /dev/null @@ -1,20 +0,0 @@ -package filter - -import ( - "github.com/dubbogo/dubbo-go-proxy/common/constant" - "github.com/dubbogo/dubbo-go-proxy/service" -) - -func init() { - service.SetFilter(constant.MatchFilterName, NewMatchFilter) -} - -type MatchFilter struct{} - -func NewMatchFilter() service.Filter { - return &MatchFilter{} -} -func (f *MatchFilter) OnRequest(ctx service.ProxyContext) (ret int) { - _, _, ret = ctx.Match() - return -} diff --git a/service/metadata.go b/service/metadata.go deleted file mode 100644 index 4ba64ef76..000000000 --- a/service/metadata.go +++ /dev/null @@ -1,32 +0,0 @@ -package service - -type MetadataCenter interface { - GetProviderMetaData(m *MetadataIdentifier) *MetadataInfo -} -type MetadataIdentifier struct { - ServiceInterface string - Version string - Group string - Side string - Application string -} -type MetadataInfo struct { - Parameters map[string]string - CanonicalName string - CodeSource string - Methods []MethodDefinition - Types []TypeDefinition -} -type MethodDefinition struct { - Name string - ParameterTypes []string - ReturnType string -} -type TypeDefinition struct { - Id string - Type string - Items []TypeDefinition - Enums []string - Ref string `json:"$ref"` - TypeBuilderName string -} diff --git a/service/metadata/redis/redis.go b/service/metadata/redis/redis.go deleted file mode 100644 index 17453c335..000000000 --- a/service/metadata/redis/redis.go +++ /dev/null @@ -1,54 +0,0 @@ -package redis - -import ( - "github.com/dubbogo/dubbo-go-proxy/common/config" - "github.com/dubbogo/dubbo-go-proxy/common/logger" - "github.com/dubbogo/dubbo-go-proxy/common/util" - "github.com/dubbogo/dubbo-go-proxy/service" - "github.com/go-redis/redis" - "time" -) - -var rc *redis.Client - -func init() { - if config.Config.UseRedisMetadataCenter { - rc = redis.NewClient(&redis.Options{ - Addr: config.Config.RedisAddr, - Password: config.Config.RedisPassword, - PoolSize: 100, - MaxRetries: 3, - IdleTimeout: time.Second * 10, - }) - go func() { - for { - _, err := rc.Ping().Result() - if err != nil { - logger.Errorf("redis ping err:%+v", err) - } - time.Sleep(1 * time.Minute) - } - }() - } - -} - -type redisMetaDataCenter struct { -} - -func NewRedisMetaDataCenter() *redisMetaDataCenter { - return &redisMetaDataCenter{} -} -func (r *redisMetaDataCenter) GetProviderMetaData(m service.MetadataIdentifier) *service.MetadataInfo { - //todo 做缓存 - mInfo := &service.MetadataInfo{} - cmd := rc.Get(getKey(m)) - if e := util.ParseJsonByStruct([]byte(cmd.String()), mInfo); e == nil { - return mInfo - } - return nil -} - -func getKey(m service.MetadataIdentifier) string { - return m.ServiceInterface + ":provider:" + m.Application + ".metaData" -} diff --git a/service/proxy/http/http.go b/service/proxy/http/http.go deleted file mode 100644 index bb547af36..000000000 --- a/service/proxy/http/http.go +++ /dev/null @@ -1,101 +0,0 @@ -package http - -import ( - "github.com/dubbogo/dubbo-go-proxy/common/config" - "github.com/dubbogo/dubbo-go-proxy/common/errcode" - "github.com/dubbogo/dubbo-go-proxy/common/logger" - "github.com/dubbogo/dubbo-go-proxy/common/util" - "github.com/dubbogo/dubbo-go-proxy/dubbo" - ct "github.com/dubbogo/dubbo-go-proxy/service/context" - "github.com/dubbogo/dubbo-go-proxy/service/metadata/redis" - "io" - "net/http" - "time" -) - -var srv http.Server -var mc = redis.NewRedisMetaDataCenter() - -func Run() { - dubbo.Client.Init() - startHttpServer() -} -func startHttpServer() { - mux := http.NewServeMux() - mux.HandleFunc("/", commonHandle) - srv = http.Server{ - Addr: config.Config.HttpListenAddr, - Handler: mux, - ReadTimeout: 20 * time.Second, - WriteTimeout: 20 * time.Second, - MaxHeaderBytes: 1 << 20, - } - - err := srv.ListenAndServe() - if err != nil { - if err != http.ErrServerClosed { - logger.Errorf("http.ListenAndServe err:%v", err) - } - } -} -func commonHandle(w http.ResponseWriter, r *http.Request) { - setJsHeader(w, r) - if r.Method == http.MethodOptions { - return - } - var ( - ret int - response interface{} - err error - responseStr string - ctx = ct.NewHttpContext(w, r) - ) - defer func() { - // to http response - if ret == errcode.Success { - io.WriteString(w, responseStr) - } else { - io.WriteString(w, getErrRsp(ret)) - } - }() - filter := ctx.NextFilter() - for filter != nil { - ret = filter.OnRequest(ctx) - if ret != errcode.Success { - return - } - filter = ctx.NextFilter() - } - reqData := ctx.InvokeData() - if reqData == nil { - ret = errcode.ErrData - return - } - if response, ret = dubbo.Client.Call(*reqData); ret != errcode.Success { - return - } - responseStr, err = util.StructToJsonString(response) - if err != nil { - ret = errcode.ServerBusy - } - return - -} - -func getErrRsp(ret int) string { - return errcode.GetMsg(ret) -} - -func setJsHeader(w http.ResponseWriter, r *http.Request) { - w.Header().Set("Access-Control-Allow-Origin", r.Header.Get("Origin")) - w.Header().Set("Access-Control-Allow-Headers", r.Header.Get("Access-Control-Request-Headers")) - w.Header().Add("Access-Control-Allow-Headers", "access_token,Content-Type") - - w.Header().Add("Access-Control-Allow-Methods", "POST") - w.Header().Add("Access-Control-Allow-Methods", "OPTIONS") - w.Header().Add("Access-Control-Allow-Methods", "GET") - w.Header().Add("Access-Control-Allow-Methods", "DELETE") - w.Header().Add("Access-Control-Allow-Methods", "PUT") - w.Header().Set("Access-Control-Allow-Credentials", "true") - w.Header().Set("Content-Type", "application/json;charset=UTF-8") -} From a173b09de1f0239a11cebdefb03d445eddd2fcfb Mon Sep 17 00:00:00 2001 From: tiecheng <18768171164@163.com> Date: Tue, 1 Sep 2020 19:55:05 +0800 Subject: [PATCH 015/227] add quick_start.md --- doc/quick_start.md | 65 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 65 insertions(+) create mode 100644 doc/quick_start.md diff --git a/doc/quick_start.md b/doc/quick_start.md new file mode 100644 index 000000000..00883c5ea --- /dev/null +++ b/doc/quick_start.md @@ -0,0 +1,65 @@ +目前在内部测试中,仅供开发人员使用 + +先提两个点: + +#### 配置文件 +- aproxy/configs/client.yml 项目配置 +- aproxy/configs/api_config.yaml 里面是Api配置 + +另外两个配置文件是 dubbo 的,考虑把必要的参数整到 client.yml 的 dgp.filters.http_transfer_dubbo 这个 filter 的配置里面 + +因为现在没有接口配置,暂时接口配置写死在代码 + +> API 配置 + +proxy_start.go#beforeStart() 里面配一些自己的 dubbo 接口元数据 + +#### IDE启动 + +程序参数 +-c /Users/tc/Documents/workspace_2020/aproxy/configs/conf.yaml + +环境变量 +CONF_CONSUMER_FILE_PATH=/Users/tc/Documents/workspace_2020/aproxy/configs/client.yml;APP_LOG_CONF_FILE=/Users/tc/Documents/workspace_2020/aproxy/configs/log.yml + +### sample + +#### 发送单参数请求 + +> 请求头 X-DGP-WAY:dubbo,和配置文件对应 + +url: http://127.0.0.1:8888/api/v1/test-dubbo/getUserByName + +body: +```json +"tiecheng" +``` + +response: +```json +{ + "id": "3213", + "name": "tiecheng", + "age": 25 +} +``` + +url: http://127.0.0.1:8888/api/v1/test-dubbo/user + +body: +```json +{ + "id": "3213", + "name": "tiecheng", + "age": 25 +} +``` + +response: +```json +{ + "age": 25, + "id": "3213", + "name": "tiecheng" +} +``` \ No newline at end of file From f7e0b0570d8322d40d7304d26a5353c55ba09b39 Mon Sep 17 00:00:00 2001 From: tiecheng <18768171164@163.com> Date: Thu, 3 Sep 2020 09:52:12 +0800 Subject: [PATCH 016/227] add log file cli --- cmd/proxy/control.go | 11 ++++++++++- pkg/proxy/dubbo_client.go | 21 ++++++++++----------- pkg/proxy/proxy_start.go | 2 +- 3 files changed, 21 insertions(+), 13 deletions(-) diff --git a/cmd/proxy/control.go b/cmd/proxy/control.go index 28f3c0544..2ebba5d93 100644 --- a/cmd/proxy/control.go +++ b/cmd/proxy/control.go @@ -28,7 +28,13 @@ var ( Name: "config, c", Usage: "Load configuration from `FILE`", EnvVar: "DUBBOGO_PROXY_CONFIG", - Value: "configs/proxy_config.json", + Value: "configs/conf.yaml", + }, + cli.StringFlag{ + Name: "log-config, lc", + Usage: "Load log configuration from `FILE`", + EnvVar: "LOG_FILE", + Value: "configs/log.yml", }, cli.StringFlag{ Name: "log-level, l", @@ -47,12 +53,15 @@ var ( Action: func(c *cli.Context) error { configPath := c.String("config") flagLogLevel := c.String("log-level") + logConfPath := c.String("log-config") bootstrap := proxy.Load(configPath) if logLevel, ok := flagToLogLevel[flagLogLevel]; ok { logger.SetLoggerLevel(logLevel) } + logger.InitLog(logConfPath) + limitCpus := c.Int("limit-cpus") if limitCpus <= 0 { runtime.GOMAXPROCS(runtime.NumCPU()) diff --git a/pkg/proxy/dubbo_client.go b/pkg/proxy/dubbo_client.go index c8603fee1..3bf22b4e4 100644 --- a/pkg/proxy/dubbo_client.go +++ b/pkg/proxy/dubbo_client.go @@ -66,7 +66,7 @@ func (dc *DubboClient) Close() error { func (dc *DubboClient) Call(r *Request) (resp Response, err error) { dm := r.Api.Metadata.(*DubboMetadata) - gs := dc.Get(dm.Interface, dm.Version, dm.Group, dm) + gs := dc.Get(dm.Interface, dm.Version, dm.Group, r.Api.Name, dm) var reqData []interface{} @@ -129,10 +129,9 @@ func (dc *DubboClient) check(key string) bool { } } -func (dc *DubboClient) create(interfaceName, version, group string, dm *DubboMetadata) *dg.GenericService { - key := strings.Join([]string{interfaceName, version, group}, "_") - referenceConfig := dg.NewReferenceConfig(interfaceName, context.TODO()) - referenceConfig.InterfaceName = interfaceName +func (dc *DubboClient) create(key string, dm *DubboMetadata) *dg.GenericService { + referenceConfig := dg.NewReferenceConfig(dm.Interface, context.TODO()) + referenceConfig.InterfaceName = dm.Interface referenceConfig.Cluster = constant.DEFAULT_CLUSTER var registers []string for k := range dgCfg.Registries { @@ -146,8 +145,8 @@ func (dc *DubboClient) create(interfaceName, version, group string, dm *DubboMet referenceConfig.Protocol = dm.ProtocolTypeStr } - referenceConfig.Version = version - referenceConfig.Group = group + referenceConfig.Version = dm.Version + referenceConfig.Group = dm.Group referenceConfig.Generic = true if dm.Retries == "" { referenceConfig.Retries = "3" @@ -156,7 +155,7 @@ func (dc *DubboClient) create(interfaceName, version, group string, dm *DubboMet } dc.mLock.Lock() defer dc.mLock.Unlock() - referenceConfig.GenericLoad(interfaceName) + referenceConfig.GenericLoad(key) time.Sleep(200 * time.Millisecond) //sleep to wait invoker create clientService := referenceConfig.GetRPCService().(*dg.GenericService) @@ -164,11 +163,11 @@ func (dc *DubboClient) create(interfaceName, version, group string, dm *DubboMet return clientService } -func (dc *DubboClient) Get(interfaceName, version, group string, dm *DubboMetadata) *dg.GenericService { - key := strings.Join([]string{interfaceName, version, group}, "_") +func (dc *DubboClient) Get(interfaceName, version, group string, apiName string, dm *DubboMetadata) *dg.GenericService { + key := strings.Join([]string{apiName, interfaceName, version, group}, "_") if dc.check(key) { return dc.get(key) } else { - return dc.create(interfaceName, version, group, dm) + return dc.create(key, dm) } } diff --git a/pkg/proxy/proxy_start.go b/pkg/proxy/proxy_start.go index 457af8a6d..fa0694f47 100644 --- a/pkg/proxy/proxy_start.go +++ b/pkg/proxy/proxy_start.go @@ -39,7 +39,7 @@ func (p *Proxy) Start() { } func (p *Proxy) beforeStart() { - NewDubboClient().Init() + SingleDubboClient().Init() // TODO mock api register ads := GetMustApiDiscoveryService(pkg.ApiDiscoveryService_Dubbo) From 89a9b8db0bc9c0c23628f4fbf79fe7b5adcf1150 Mon Sep 17 00:00:00 2001 From: tiecheng <18768171164@163.com> Date: Thu, 3 Sep 2020 10:52:24 +0800 Subject: [PATCH 017/227] add concept.md --- doc/concept.md | 29 +++++++++++++++++++++++++++++ doc/quick_start.md | 2 ++ 2 files changed, 31 insertions(+) create mode 100644 doc/concept.md diff --git a/doc/concept.md b/doc/concept.md new file mode 100644 index 000000000..01f64d965 --- /dev/null +++ b/doc/concept.md @@ -0,0 +1,29 @@ +# 术语 + +## 组件 +### Proxy +数据面板 +###Admin +控制面板 + +## 概念 +### 下游(Downstream) +下游主机连接到 Proxy ,发送请求并接收响应。(API 网关场景理解:浏览器) +### 上游(Upstream) +上游主机接收来自 Proxy 的连接和请求并返回响应。(API 网关场景理解:dubbo 服务的机器) +### 监听器(Listener) +监听器是可以被下游客户端连接的网络位置(例如,端口,unix域套接字等)。Proxy 公开一个或多个下游主机连接的监听器。 +### 集群(Cluster) +群集是指 Proxy 连接到的一组逻辑上相似的上游主机(比如 dubbo 集群)。Proxy 通过服务发现发现一个集群的成员,它可以通过主动健康检查来确定集群成员的健康度,从而 Proxy 通过负载均衡策略将请求路由到相应的集群成员。 +### 接口(Api) +接口是 API 网关的核心概念,特别针对浏览器等外部系统的访问时必须开启,所有请求必须匹配到对应的 Up 状态的接口才能继续进行后续逻辑。 +### 客户端(Client) +请求上游主机的真实调用对象。 +### 路由(Router) +路由策略,目前理解成 HTTP 路由,通过 match 逻辑路由到对应的集群。 +### 上下文(Context) +一个真实请求的上下文,包含这次请求几乎所有的信息。在各个环节都会使用,特别是 filter 链路。 +### 过滤器(Filter) +过滤器,提供拦截能力。支持自定义扩展。 +### 规则(Rule) +规则提供匹配能力,给过滤器,路由等其它概念使用。 \ No newline at end of file diff --git a/doc/quick_start.md b/doc/quick_start.md index 00883c5ea..f13b77cdc 100644 --- a/doc/quick_start.md +++ b/doc/quick_start.md @@ -16,6 +16,8 @@ proxy_start.go#beforeStart() 里面配一些自己的 dubbo 接口元数据 #### IDE启动 +启动类 cmd/proxy/proxy.go + 程序参数 -c /Users/tc/Documents/workspace_2020/aproxy/configs/conf.yaml From ebddfb64ce9651317d117c6276c29fe74a5cfc01 Mon Sep 17 00:00:00 2001 From: tiecheng <18768171164@163.com> Date: Fri, 4 Sep 2020 13:02:32 +0800 Subject: [PATCH 018/227] format package --- cmd/proxy/control.go | 3 +- pkg/client/api.go | 73 +++++++ pkg/client/client.go | 8 + pkg/{proxy => client}/dubbo_client.go | 17 +- .../client.go => client/dubbo_response.go} | 34 +-- pkg/client/request.go | 14 ++ pkg/client/response.go | 11 + pkg/common/constant/filter.go | 8 + pkg/common/constant/http.go | 15 ++ pkg/{types.go => common/constant/key.go} | 13 +- pkg/common/extension/discovery_service.go | 24 +++ pkg/common/extension/filter.go | 24 +++ pkg/{proxy => config}/config_load.go | 4 +- pkg/{proxy => config}/config_load_test.go | 37 ++-- pkg/context/base_context.go | 37 ++++ pkg/context/context.go | 29 +++ pkg/context/filter.go | 5 + pkg/context/http/context.go | 150 +++++++++++++ .../http_filter.go => context/http/util.go} | 36 +--- .../http/writer.go} | 7 +- pkg/filter/api_filter.go | 46 ++++ pkg/filter/dubbo_filter.go | 56 +++++ pkg/filter/http_filter.go | 35 ++++ pkg/filter/logger_filter.go | 28 +++ pkg/filter/recovery_filter.go | 24 +++ pkg/filter/router_filter.go | 81 +++++++ pkg/model/http.go | 8 + pkg/proxy/api.go | 130 ------------ pkg/proxy/api_filter.go | 51 ----- pkg/proxy/cache.go | 35 ---- pkg/proxy/context.go | 197 ------------------ pkg/proxy/dubbo_filter.go | 51 ----- pkg/proxy/http.go | 6 +- pkg/proxy/listener.go | 64 +++--- pkg/proxy/logger_filter.go | 21 -- pkg/proxy/proxy_start.go | 23 +- pkg/proxy/recovery_filter.go | 15 -- pkg/proxy/router_filter.go | 79 ------- pkg/service/api/discovery_service.go | 68 ++++++ pkg/service/discovery_service.go | 10 +- 40 files changed, 858 insertions(+), 719 deletions(-) create mode 100644 pkg/client/api.go create mode 100644 pkg/client/client.go rename pkg/{proxy => client}/dubbo_client.go (79%) rename pkg/{proxy/client.go => client/dubbo_response.go} (87%) create mode 100644 pkg/client/request.go create mode 100644 pkg/client/response.go create mode 100644 pkg/common/constant/filter.go create mode 100644 pkg/common/constant/http.go rename pkg/{types.go => common/constant/key.go} (52%) create mode 100644 pkg/common/extension/discovery_service.go create mode 100644 pkg/common/extension/filter.go rename pkg/{proxy => config}/config_load.go (98%) rename pkg/{proxy => config}/config_load_test.go (65%) create mode 100644 pkg/context/base_context.go create mode 100644 pkg/context/context.go create mode 100644 pkg/context/filter.go create mode 100644 pkg/context/http/context.go rename pkg/{proxy/http_filter.go => context/http/util.go} (64%) rename pkg/{proxy/http_context.go => context/http/writer.go} (99%) create mode 100644 pkg/filter/api_filter.go create mode 100644 pkg/filter/dubbo_filter.go create mode 100644 pkg/filter/http_filter.go create mode 100644 pkg/filter/logger_filter.go create mode 100644 pkg/filter/recovery_filter.go create mode 100644 pkg/filter/router_filter.go delete mode 100644 pkg/proxy/api.go delete mode 100644 pkg/proxy/api_filter.go delete mode 100644 pkg/proxy/cache.go delete mode 100644 pkg/proxy/context.go delete mode 100644 pkg/proxy/dubbo_filter.go delete mode 100644 pkg/proxy/logger_filter.go delete mode 100644 pkg/proxy/recovery_filter.go delete mode 100644 pkg/proxy/router_filter.go create mode 100644 pkg/service/api/discovery_service.go diff --git a/cmd/proxy/control.go b/cmd/proxy/control.go index 2ebba5d93..1065564ad 100644 --- a/cmd/proxy/control.go +++ b/cmd/proxy/control.go @@ -6,6 +6,7 @@ import ( ) import ( + "github.com/dubbogo/dubbo-go-proxy/pkg/config" "github.com/dubbogo/dubbo-go-proxy/pkg/logger" "github.com/dubbogo/dubbo-go-proxy/pkg/proxy" ) @@ -55,7 +56,7 @@ var ( flagLogLevel := c.String("log-level") logConfPath := c.String("log-config") - bootstrap := proxy.Load(configPath) + bootstrap := config.Load(configPath) if logLevel, ok := flagToLogLevel[flagLogLevel]; ok { logger.SetLoggerLevel(logLevel) } diff --git a/pkg/client/api.go b/pkg/client/api.go new file mode 100644 index 000000000..971963455 --- /dev/null +++ b/pkg/client/api.go @@ -0,0 +1,73 @@ +package client + +import ( + "sync" +) + +import ( + "github.com/dubbogo/dubbo-go-proxy/pkg/model" +) + +var ( + CacheApi = sync.Map{} +) + +// Api is api gateway concept, control request from browser、Mobile APP、third party people +type Api struct { + Name string `json:"name"` + ITypeStr string `json:"itype"` + IType model.ApiType `json:"-"` + OTypeStr string `json:"otype"` + OType model.ApiType `json:"-"` + Status model.Status `json:"status"` + Metadata interface{} `json:"metadata"` + Method string `json:"method"` + model.RequestMethod + Client Client + lock sync.Mutex +} + +var EmptyApi = &Api{} + +func NewApi() *Api { + return &Api{lock: sync.Mutex{}} +} + +func (a *Api) FindApi(name string) (*Api, bool) { + if v, ok := CacheApi.Load(name); ok { + return v.(*Api), true + } + + return nil, false +} + +func (a *Api) MatchMethod(method string) bool { + i := model.RequestMethodValue[method] + if a.RequestMethod == model.RequestMethod(i) { + return true + } + + return false +} + +func (a *Api) IsOk(name string) bool { + if v, ok := CacheApi.Load(name); ok { + return v.(*Api).Status == model.Up + } + + return false +} + +// Offline api offline +func (a *Api) Offline(name string) { + if v, ok := CacheApi.Load(name); ok { + v.(*Api).Status = model.Down + } +} + +// Online api online +func (a *Api) Online(name string) { + if v, ok := CacheApi.Load(name); ok { + v.(*Api).Status = model.Up + } +} diff --git a/pkg/client/client.go b/pkg/client/client.go new file mode 100644 index 000000000..53c51ddd0 --- /dev/null +++ b/pkg/client/client.go @@ -0,0 +1,8 @@ +package client + +type Client interface { + Init() error + Close() error + + Call(req *Request) (resp Response, err error) +} diff --git a/pkg/proxy/dubbo_client.go b/pkg/client/dubbo_client.go similarity index 79% rename from pkg/proxy/dubbo_client.go rename to pkg/client/dubbo_client.go index 3bf22b4e4..4eed35f8a 100644 --- a/pkg/proxy/dubbo_client.go +++ b/pkg/client/dubbo_client.go @@ -1,4 +1,4 @@ -package proxy +package client import ( "context" @@ -24,6 +24,19 @@ const ( JavaLangClassName = "java.lang.Long" ) +type DubboMetadata struct { + ApplicationName string `yaml:"application_name" json:"application_name" mapstructure:"application_name"` + Group string `yaml:"group" json:"group" mapstructure:"group"` + Version string `yaml:"version" json:"version" mapstructure:"version"` + Interface string `yaml:"interface" json:"interface" mapstructure:"interface"` + Method string `yaml:"method" json:"method" mapstructure:"method"` + Types []string `yaml:"type" json:"types" mapstructure:"types"` + Retries string `yaml:"retries" json:"retries,omitempty" property:"retries"` + ClusterName string `yaml:"cluster_name" json:"cluster_name,omitempty" property:"cluster_name"` + ProtocolTypeStr string `yaml:"protocol_type" json:"protocol_type,omitempty" property:"protocol_type"` + SerializationTypeStr string `yaml:"serialization_type" json:"serialization_type,omitempty" property:"serialization_type"` +} + var ( _DubboClient *DubboClient onceClient = sync.Once{} @@ -109,7 +122,7 @@ func (dc *DubboClient) Call(r *Request) (resp Response, err error) { return *EmptyResponse, err } else { logger.Debugf("[dubbogo proxy] dubbo client resp:%v", resp) - return *NewResponse(resp), nil + return *NewDubboResponse(resp), nil } } diff --git a/pkg/proxy/client.go b/pkg/client/dubbo_response.go similarity index 87% rename from pkg/proxy/client.go rename to pkg/client/dubbo_response.go index be1ce79a5..9acb3b130 100644 --- a/pkg/proxy/client.go +++ b/pkg/client/dubbo_response.go @@ -1,4 +1,4 @@ -package proxy +package client import ( "errors" @@ -7,40 +7,14 @@ import ( "strings" ) -type Request struct { - Body []byte - Header map[string]string - Api *Api -} - -func NewRequest(b []byte, api *Api) *Request { - return &Request{ - Body: b, - Api: api, - } -} - -type Response struct { - data interface{} -} - -func NewResponse(data interface{}) *Response { +func NewDubboResponse(data interface{}) *Response { if r, err := dealResp(data, true); err != nil { - return &Response{data: data} + return &Response{Data: data} } else { - return &Response{data: r} + return &Response{Data: r} } } -var EmptyResponse = &Response{} - -type Client interface { - Init() error - Close() error - - Call(req *Request) (resp Response, err error) -} - func dealResp(in interface{}, HumpToLine bool) (interface{}, error) { if in == nil { return in, nil diff --git a/pkg/client/request.go b/pkg/client/request.go new file mode 100644 index 000000000..28c1f33ca --- /dev/null +++ b/pkg/client/request.go @@ -0,0 +1,14 @@ +package client + +type Request struct { + Body []byte + Header map[string]string + Api *Api +} + +func NewRequest(b []byte, api *Api) *Request { + return &Request{ + Body: b, + Api: api, + } +} diff --git a/pkg/client/response.go b/pkg/client/response.go new file mode 100644 index 000000000..8b663a530 --- /dev/null +++ b/pkg/client/response.go @@ -0,0 +1,11 @@ +package client + +type Response struct { + Data interface{} +} + +func NewResponse(data interface{}) *Response { + return &Response{Data: data} +} + +var EmptyResponse = &Response{} diff --git a/pkg/common/constant/filter.go b/pkg/common/constant/filter.go new file mode 100644 index 000000000..440c65f0e --- /dev/null +++ b/pkg/common/constant/filter.go @@ -0,0 +1,8 @@ +package constant + +var ( + Default403Body = []byte("403 for bidden") + Default404Body = []byte("404 page not found") + Default405Body = []byte("405 method not allowed") + Default406Body = []byte("406 api not up") +) diff --git a/pkg/common/constant/http.go b/pkg/common/constant/http.go new file mode 100644 index 000000000..32d272669 --- /dev/null +++ b/pkg/common/constant/http.go @@ -0,0 +1,15 @@ +package constant + +const ( + HeaderKeyContextType = "Content-Type" + HeaderKeyAccessControlAllowOrigin = "Access-Control-Allow-Origin" + + HeaderValueJsonUtf8 = "application/json;charset=UTF-8" + HeaderValueTextPlain = "text/plain" + HeaderValueAll = "*" +) + +const ( + Http1HeaderKeyHost = "Host" + Http2HeaderKeyHost = ":authority" +) diff --git a/pkg/types.go b/pkg/common/constant/key.go similarity index 52% rename from pkg/types.go rename to pkg/common/constant/key.go index e222f0889..631ed928d 100644 --- a/pkg/types.go +++ b/pkg/common/constant/key.go @@ -1,4 +1,4 @@ -package pkg +package constant const ( HttpConnectManagerFilter = "dgp.filters.http_connect_manager" @@ -6,16 +6,11 @@ const ( HttpApiFilter = "dgp.filters.http.api" HttpDomainFilter = "dgp.filters.http.domain" HttpTransferDubboFilter = "dgp.filters.http_transfer_dubbo" -) -const ( - ApiDiscoveryService_Dubbo = "ads_dubbo" + LoggerFilter = "dgp.filters.logger" + RecoveryFilter = "dgp.filters.recovery" ) const ( - HeaderKeyContextType = "Content-Type" - HeaderKeyAccessControlAllowOrigin = "Access-Control-Allow-Origin" - - HeaderValueJsonUtf8 = "application/json;charset=UTF-8" - HeaderValueTextPlain = "text/plain" + LocalMemoryApiDiscoveryService = "api.ds.local_memory" ) diff --git a/pkg/common/extension/discovery_service.go b/pkg/common/extension/discovery_service.go new file mode 100644 index 000000000..bc2751f8f --- /dev/null +++ b/pkg/common/extension/discovery_service.go @@ -0,0 +1,24 @@ +package extension + +import ( + "github.com/dubbogo/dubbo-go-proxy/pkg/service" +) + +var ( + apiDiscoveryServiceMap = map[string]service.ApiDiscoveryService{} +) + +// SetApiDiscoveryService will store the @filter and @name +func SetApiDiscoveryService(name string, ads service.ApiDiscoveryService) { + apiDiscoveryServiceMap[name] = ads +} + +// GetMustApiDiscoveryService will return the service.ApiDiscoveryService +// if not found, it will panic +func GetMustApiDiscoveryService(name string) service.ApiDiscoveryService { + if ds, ok := apiDiscoveryServiceMap[name]; ok { + return ds + } + + panic("api discovery service for " + name + " is not existing!") +} diff --git a/pkg/common/extension/filter.go b/pkg/common/extension/filter.go new file mode 100644 index 000000000..5c87b9bf1 --- /dev/null +++ b/pkg/common/extension/filter.go @@ -0,0 +1,24 @@ +package extension + +import ( + "github.com/dubbogo/dubbo-go-proxy/pkg/context" +) + +var ( + filterFuncCacheMap = make(map[string]func(ctx context.Context)) +) + +// SetFilterFunc will store the @filter and @name +func SetFilterFunc(name string, filter context.FilterFunc) { + filterFuncCacheMap[name] = filter +} + +// GetMustFilterFunc will return the proxy.FilterFunc +// if not found, it will panic +func GetMustFilterFunc(name string) context.FilterFunc { + if filter, ok := filterFuncCacheMap[name]; ok { + return filter + } + + panic("filter func for " + name + " is not existing!") +} diff --git a/pkg/proxy/config_load.go b/pkg/config/config_load.go similarity index 98% rename from pkg/proxy/config_load.go rename to pkg/config/config_load.go index cefb31a2c..9ad3520f5 100644 --- a/pkg/proxy/config_load.go +++ b/pkg/config/config_load.go @@ -1,4 +1,4 @@ -package proxy +package config import ( "encoding/json" @@ -84,7 +84,7 @@ func YAMLConfigLoad(path string) *model.Bootstrap { } l.Address.SocketAddress.Protocol = model.ProtocolType(model.ProtocolTypeValue[l.Address.SocketAddress.ProtocolStr]) - hc := &HttpConfig{} + hc := &model.HttpConfig{} if l.Config != nil { if v, ok := l.Config.(map[string]interface{}); ok { switch l.Name { diff --git a/pkg/proxy/config_load_test.go b/pkg/config/config_load_test.go similarity index 65% rename from pkg/proxy/config_load_test.go rename to pkg/config/config_load_test.go index 82e32a5d2..b98a3b882 100644 --- a/pkg/proxy/config_load_test.go +++ b/pkg/config/config_load_test.go @@ -1,7 +1,8 @@ -package proxy +package config import ( "encoding/json" + "github.com/dubbogo/dubbo-go-proxy/pkg/model" "testing" ) @@ -10,44 +11,44 @@ func TestLoad(t *testing.T) { } func TestStruct2JSON(t *testing.T) { - b := Bootstrap{ - StaticResources: StaticResources{ - Listeners: []Listener{ + b := model.Bootstrap{ + StaticResources: model.StaticResources{ + Listeners: []model.Listener{ { Name: "net/http", - Address: Address{ - SocketAddress: SocketAddress{ + Address: model.Address{ + SocketAddress: model.SocketAddress{ ProtocolStr: "HTTP", Address: "127.0.0.0", Port: 8899, }, }, - Config: HttpConfig{ + Config: model.HttpConfig{ IdleTimeoutStr: "5s", WriteTimeoutStr: "5s", ReadTimeoutStr: "5s", }, - FilterChains: []FilterChain{ + FilterChains: []model.FilterChain{ { - FilterChainMatch: FilterChainMatch{ + FilterChainMatch: model.FilterChainMatch{ Domains: []string{ "api.dubbo.com", "api.proxy.com", }, }, - Filters: []Filter{ + Filters: []model.Filter{ { Name: "dgp.filters.http_connect_manager", - Config: HttpConnectionManager{ - RouteConfig: RouteConfiguration{ - Routes: []Router{ + Config: model.HttpConnectionManager{ + RouteConfig: model.RouteConfiguration{ + Routes: []model.Router{ { - Match: RouterMatch{ + Match: model.RouterMatch{ Prefix: "/api/v1", }, - Route: RouteAction{ + Route: model.RouteAction{ Cluster: "test_dubbo", - Cors: CorsPolicy{ + Cors: model.CorsPolicy{ AllowOrigin: []string{ "*", }, @@ -56,7 +57,7 @@ func TestStruct2JSON(t *testing.T) { }, }, }, - HttpFilters: []HttpFilter{ + HttpFilters: []model.HttpFilter{ { Name: "dgp.filters.http.cors", }, @@ -71,7 +72,7 @@ func TestStruct2JSON(t *testing.T) { }, }, }, - Clusters: []Cluster{ + Clusters: []model.Cluster{ { Name: "test_dubbo", TypeStr: "EDS", diff --git a/pkg/context/base_context.go b/pkg/context/base_context.go new file mode 100644 index 000000000..d54061c29 --- /dev/null +++ b/pkg/context/base_context.go @@ -0,0 +1,37 @@ +package context + +import "math" + +const abortIndex int8 = math.MaxInt8 / 2 + +// BaseContext +type BaseContext struct { + Context + Index int8 + Filters FilterChain +} + +func NewBaseContext() *BaseContext { + return &BaseContext{Index: -1} +} + +// Next should be used only inside middleware. +// It executes the pending handlers in the chain inside the calling handler. +// See example in GitHub. +func (c *BaseContext) Next() { + c.Index++ + for c.Index < int8(len(c.Filters)) { + c.Filters[c.Index](c) + c.Index++ + } +} + +func (c *BaseContext) Abort() { + c.Index = abortIndex +} + +func (c *BaseContext) AppendFilterFunc(ff ...FilterFunc) { + for _, v := range ff { + c.Filters = append(c.Filters, v) + } +} diff --git a/pkg/context/context.go b/pkg/context/context.go new file mode 100644 index 000000000..fd4e2abc0 --- /dev/null +++ b/pkg/context/context.go @@ -0,0 +1,29 @@ +package context + +import ( + "github.com/dubbogo/dubbo-go-proxy/pkg/client" +) + +// Context run context +type Context interface { + Next() + Abort() + + AppendFilterFunc(ff ...FilterFunc) + + Status(code int) + StatusCode() int + WriteWithStatus(int, []byte) (int, error) + Write([]byte) (int, error) + AddHeader(k, v string) + GetHeader(k string) string + GetUrl() string + GetMethod() string + + BuildFilters() + + Api(api *client.Api) + GetApi() *client.Api + + WriteErr(p interface{}) +} diff --git a/pkg/context/filter.go b/pkg/context/filter.go new file mode 100644 index 000000000..c529c5bb7 --- /dev/null +++ b/pkg/context/filter.go @@ -0,0 +1,5 @@ +package context + +type FilterFunc func(Context) + +type FilterChain []FilterFunc diff --git a/pkg/context/http/context.go b/pkg/context/http/context.go new file mode 100644 index 000000000..7c21e019f --- /dev/null +++ b/pkg/context/http/context.go @@ -0,0 +1,150 @@ +package http + +import ( + "encoding/json" + "net/http" +) + +import ( + "github.com/dubbogo/dubbo-go-proxy/pkg/client" + "github.com/dubbogo/dubbo-go-proxy/pkg/common/constant" + "github.com/dubbogo/dubbo-go-proxy/pkg/common/extension" + "github.com/dubbogo/dubbo-go-proxy/pkg/context" + "github.com/dubbogo/dubbo-go-proxy/pkg/model" +) + +// HttpContext +type HttpContext struct { + *context.BaseContext + HttpConnectionManager model.HttpConnectionManager + FilterChains []model.FilterChain + Listener *model.Listener + api *client.Api + + Request *http.Request + writermem responseWriter + Writer ResponseWriter +} + +func (hc *HttpContext) GetWritermem() { + +} + +func (hc *HttpContext) Next() { + hc.Index++ + for hc.Index < int8(len(hc.Filters)) { + hc.Filters[hc.Index](hc) + hc.Index++ + } +} + +func (hc *HttpContext) Reset() { + hc.Writer = &hc.writermem + hc.Filters = nil + hc.Index = -1 +} + +func (hc *HttpContext) Status(code int) { + hc.Writer.WriteHeader(code) +} + +func (hc *HttpContext) StatusCode() int { + return hc.Writer.Status() +} + +func (hc *HttpContext) Write(b []byte) (int, error) { + return hc.Writer.Write(b) +} + +func (hc *HttpContext) WriteHeaderNow() { + hc.writermem.WriteHeaderNow() +} + +// WriteWithStatus status must set first +func (hc *HttpContext) WriteWithStatus(code int, b []byte) (int, error) { + hc.Writer.WriteHeader(code) + return hc.Writer.Write(b) +} + +func (hc *HttpContext) AddHeader(k, v string) { + hc.Writer.Header().Add(k, v) +} + +func (hc *HttpContext) GetHeader(k string) string { + return hc.Request.Header.Get(k) +} + +func (hc *HttpContext) GetUrl() string { + return hc.Request.URL.Path +} + +func (hc *HttpContext) GetMethod() string { + return hc.Request.Method +} + +func (hc *HttpContext) Api(api *client.Api) { + hc.api = api +} + +func (hc *HttpContext) GetApi() *client.Api { + return hc.api +} + +func (hc *HttpContext) WriteFail() { + hc.doWriteJSON(nil, http.StatusInternalServerError, nil) +} + +func (hc *HttpContext) WriteErr(p interface{}) { + hc.doWriteJSON(nil, http.StatusInternalServerError, p) +} + +func (hc *HttpContext) WriteSuccess() { + hc.doWriteJSON(nil, http.StatusOK, nil) +} + +func (hc *HttpContext) WriteResponse(resp client.Response) { + hc.doWriteJSON(nil, http.StatusOK, resp.Data) +} + +func (hc *HttpContext) doWriteJSON(h map[string]string, code int, d interface{}) { + if h == nil { + h = make(map[string]string, 1) + } + h[constant.HeaderKeyContextType] = constant.HeaderValueJsonUtf8 + hc.doWrite(h, code, d) +} + +func (hc *HttpContext) doWrite(h map[string]string, code int, d interface{}) { + for k, v := range h { + hc.Writer.Header().Set(k, v) + } + + hc.Writer.WriteHeader(code) + + if d != nil { + if b, err := json.Marshal(d); err != nil { + hc.Writer.Write([]byte(err.Error())) + } else { + hc.Writer.Write(b) + } + } +} + +// BuildFilters build filter, from config http_filters +func (hc *HttpContext) BuildFilters() { + var ff []context.FilterFunc + + if hc.HttpConnectionManager.HttpFilters == nil { + return + } + + for _, v := range hc.HttpConnectionManager.HttpFilters { + ff = append(ff, extension.GetMustFilterFunc(v.Name)) + } + + hc.AppendFilterFunc(ff...) +} + +func (hc *HttpContext) ResetWritermen(w http.ResponseWriter) { + hc.writermem.reset(w) +} diff --git a/pkg/proxy/http_filter.go b/pkg/context/http/util.go similarity index 64% rename from pkg/proxy/http_filter.go rename to pkg/context/http/util.go index 1757bedeb..4f3769d96 100644 --- a/pkg/proxy/http_filter.go +++ b/pkg/context/http/util.go @@ -1,4 +1,4 @@ -package proxy +package http import ( "regexp" @@ -6,37 +6,11 @@ import ( ) import ( - "github.com/dubbogo/dubbo-go-proxy/pkg" + "github.com/dubbogo/dubbo-go-proxy/pkg/config" "github.com/dubbogo/dubbo-go-proxy/pkg/model" ) -func init() { - AddFilterFunc(pkg.HttpDomainFilter, Domain()) -} - -// Domain -// https :authority -// http Host -func Domain() FilterFunc { - return func(c Context) { - if MatchDomainFilter(c.(*HttpContext)) { - c.Next() - } - } -} - -func MatchDomainFilter(c *HttpContext) bool { - for _, v := range c.l.FilterChains { - for _, d := range v.FilterChainMatch.Domains { - if d == c.GetHeader("Host") { - return true - } - } - } - - return false -} - +// HttpHeaderMatch func HttpHeaderMatch(c *HttpContext, hm model.HeaderMatcher) bool { if hm.Name == "" { return true @@ -60,6 +34,7 @@ func HttpHeaderMatch(c *HttpContext, hm model.HeaderMatcher) bool { return false } +// HttpRouteMatch func HttpRouteMatch(c *HttpContext, rm model.RouterMatch) bool { if rm.Prefix != "" { if !strings.HasPrefix(c.GetUrl(), rm.Path) { @@ -82,8 +57,9 @@ func HttpRouteMatch(c *HttpContext, rm model.RouterMatch) bool { return true } +// HttpRouteActionMatch func HttpRouteActionMatch(c *HttpContext, ra model.RouteAction) bool { - conf := GetBootstrap() + conf := config.GetBootstrap() if ra.Cluster == "" || !conf.ExistCluster(ra.Cluster) { return false diff --git a/pkg/proxy/http_context.go b/pkg/context/http/writer.go similarity index 99% rename from pkg/proxy/http_context.go rename to pkg/context/http/writer.go index 84637a322..ecc6ee807 100644 --- a/pkg/proxy/http_context.go +++ b/pkg/context/http/writer.go @@ -1,16 +1,13 @@ -package proxy +package http import ( "bufio" + "github.com/dubbogo/dubbo-go-proxy/pkg/logger" "io" "net" "net/http" ) -import ( - "github.com/dubbogo/dubbo-go-proxy/pkg/logger" -) - const ( noWritten = -1 defaultStatus = http.StatusOK diff --git a/pkg/filter/api_filter.go b/pkg/filter/api_filter.go new file mode 100644 index 000000000..57cfdadc2 --- /dev/null +++ b/pkg/filter/api_filter.go @@ -0,0 +1,46 @@ +package filter + +import ( + "net/http" +) + +import ( + "github.com/dubbogo/dubbo-go-proxy/pkg/client" + "github.com/dubbogo/dubbo-go-proxy/pkg/common/constant" + "github.com/dubbogo/dubbo-go-proxy/pkg/common/extension" + "github.com/dubbogo/dubbo-go-proxy/pkg/context" +) + +func init() { + extension.SetFilterFunc(constant.HttpApiFilter, ApiFilter()) +} + +func ApiFilter() context.FilterFunc { + return func(c context.Context) { + url := c.GetUrl() + method := c.GetMethod() + + if api, ok := client.EmptyApi.FindApi(url); ok { + if !api.MatchMethod(method) { + c.WriteWithStatus(http.StatusMethodNotAllowed, constant.Default405Body) + c.AddHeader(constant.HeaderKeyContextType, constant.HeaderValueTextPlain) + c.Abort() + return + } + + if !api.IsOk(api.Name) { + c.WriteWithStatus(http.StatusNotAcceptable, constant.Default406Body) + c.AddHeader(constant.HeaderKeyContextType, constant.HeaderValueTextPlain) + c.Abort() + return + } + + c.Api(api) + c.Next() + } else { + c.WriteWithStatus(http.StatusNotFound, constant.Default404Body) + c.AddHeader(constant.HeaderKeyContextType, constant.HeaderValueTextPlain) + c.Abort() + } + } +} diff --git a/pkg/filter/dubbo_filter.go b/pkg/filter/dubbo_filter.go new file mode 100644 index 000000000..1fa7af466 --- /dev/null +++ b/pkg/filter/dubbo_filter.go @@ -0,0 +1,56 @@ +package filter + +import ( + "io/ioutil" +) + +import ( + "github.com/dubbogo/dubbo-go-proxy/pkg/client" + "github.com/dubbogo/dubbo-go-proxy/pkg/common/constant" + "github.com/dubbogo/dubbo-go-proxy/pkg/common/extension" + "github.com/dubbogo/dubbo-go-proxy/pkg/context" + "github.com/dubbogo/dubbo-go-proxy/pkg/context/http" + "github.com/dubbogo/dubbo-go-proxy/pkg/logger" +) + +import ( + _ "github.com/apache/dubbo-go/cluster/cluster_impl" + _ "github.com/apache/dubbo-go/cluster/loadbalance" + _ "github.com/apache/dubbo-go/filter/filter_impl" + _ "github.com/apache/dubbo-go/registry/protocol" + _ "github.com/apache/dubbo-go/registry/zookeeper" +) + +func init() { + extension.SetFilterFunc(constant.HttpTransferDubboFilter, HttpDubbo()) +} + +// HttpDubbo http 2 dubbo +func HttpDubbo() context.FilterFunc { + return func(c context.Context) { + doDubbo(c.(*http.HttpContext)) + } +} + +func doDubbo(c *http.HttpContext) { + api := c.GetApi() + + if bytes, err := ioutil.ReadAll(c.Request.Body); err != nil { + logger.Errorf("[dubboproxy go] read body err:%v!", err) + c.WriteFail() + c.Abort() + } else { + if api.Client == nil { + api.Client = client.SingleDubboClient() + } + + if resp, err := api.Client.Call(client.NewRequest(bytes, api)); err != nil { + logger.Errorf("[dubboproxy go] client do err:%v!", err) + c.WriteFail() + c.Abort() + } else { + c.WriteResponse(resp) + c.Next() + } + } +} diff --git a/pkg/filter/http_filter.go b/pkg/filter/http_filter.go new file mode 100644 index 000000000..1d4e0eaeb --- /dev/null +++ b/pkg/filter/http_filter.go @@ -0,0 +1,35 @@ +package filter + +import ( + "github.com/dubbogo/dubbo-go-proxy/pkg/common/constant" + "github.com/dubbogo/dubbo-go-proxy/pkg/common/extension" + "github.com/dubbogo/dubbo-go-proxy/pkg/context" + "github.com/dubbogo/dubbo-go-proxy/pkg/context/http" +) + +func init() { + extension.SetFilterFunc(constant.HttpDomainFilter, Domain()) +} + +// Domain +// https :authority +// http Host +func Domain() context.FilterFunc { + return func(c context.Context) { + if MatchDomainFilter(c.(*http.HttpContext)) { + c.Next() + } + } +} + +func MatchDomainFilter(c *http.HttpContext) bool { + for _, v := range c.Listener.FilterChains { + for _, d := range v.FilterChainMatch.Domains { + if d == c.GetHeader(constant.Http1HeaderKeyHost) { + return true + } + } + } + + return false +} diff --git a/pkg/filter/logger_filter.go b/pkg/filter/logger_filter.go new file mode 100644 index 000000000..631218a49 --- /dev/null +++ b/pkg/filter/logger_filter.go @@ -0,0 +1,28 @@ +package filter + +import ( + "time" +) + +import ( + "github.com/dubbogo/dubbo-go-proxy/pkg/common/constant" + "github.com/dubbogo/dubbo-go-proxy/pkg/common/extension" + "github.com/dubbogo/dubbo-go-proxy/pkg/context" + "github.com/dubbogo/dubbo-go-proxy/pkg/logger" +) + +func init() { + extension.SetFilterFunc(constant.LoggerFilter, Logger()) +} + +func Logger() context.FilterFunc { + return func(c context.Context) { + start := time.Now() + + c.Next() + + latency := time.Now().Sub(start) + + logger.Infof("[dubboproxy go] [UPSTREAM] receive request | %d | %s | %s | %s | ", c.StatusCode(), latency, c.GetMethod(), c.GetUrl()) + } +} diff --git a/pkg/filter/recovery_filter.go b/pkg/filter/recovery_filter.go new file mode 100644 index 000000000..4ef9fb22b --- /dev/null +++ b/pkg/filter/recovery_filter.go @@ -0,0 +1,24 @@ +package filter + +import ( + "github.com/dubbogo/dubbo-go-proxy/pkg/common/constant" + "github.com/dubbogo/dubbo-go-proxy/pkg/common/extension" + "github.com/dubbogo/dubbo-go-proxy/pkg/context" + "github.com/dubbogo/dubbo-go-proxy/pkg/logger" +) + +func init() { + extension.SetFilterFunc(constant.RecoveryFilter, Recover()) +} + +func Recover() context.FilterFunc { + return func(c context.Context) { + defer func() { + if err := recover(); err != nil { + logger.Infof("[dubboproxy go] error:%+v", err) + c.WriteErr(err) + } + }() + c.Next() + } +} diff --git a/pkg/filter/router_filter.go b/pkg/filter/router_filter.go new file mode 100644 index 000000000..25f83808b --- /dev/null +++ b/pkg/filter/router_filter.go @@ -0,0 +1,81 @@ +package filter + +import ( + nh "net/http" + "strings" +) + +import ( + "github.com/dubbogo/dubbo-go-proxy/pkg/common/constant" + "github.com/dubbogo/dubbo-go-proxy/pkg/common/extension" + "github.com/dubbogo/dubbo-go-proxy/pkg/context" + "github.com/dubbogo/dubbo-go-proxy/pkg/context/http" + "github.com/dubbogo/dubbo-go-proxy/pkg/model" +) + +func init() { + extension.SetFilterFunc(constant.HttpRouterFilter, HttpRouting()) +} + +// HttpRouting http router filter +func HttpRouting() context.FilterFunc { + return func(c context.Context) { + routingFilter(c.(*http.HttpContext)) + } +} + +// routingFilter +func routingFilter(c *http.HttpContext) { + result := true + for _, v := range c.HttpConnectionManager.RouteConfig.Routes { + result = routeMatch(c, v) + if result { + httpHeaderCorsHandler(c, v) + break + } + } + + if !result { + c.WriteWithStatus(nh.StatusForbidden, constant.Default403Body) + c.Abort() + } +} + +// routeMatch will match router with request, only true or false way +func routeMatch(c *http.HttpContext, r model.Router) bool { + result := true + if len(r.Match.Headers) > 0 { + for _, v := range r.Match.Headers { + result = http.HttpHeaderMatch(c, v) + if !result { + break + } + } + } + + if !result { + return result + } + + result = http.HttpRouteMatch(c, r.Match) + + if !result { + return result + } + + return http.HttpRouteActionMatch(c, r.Route) +} + +// httpHeaderCorsHandler will set cors, handler mean can do c.Next() +func httpHeaderCorsHandler(c *http.HttpContext, r model.Router) { + var acao string + if r.Route.Cors.Enabled { + acao = strings.Join(r.Route.Cors.AllowOrigin, "|") + } + + c.Next() + + if acao != "" { + c.AddHeader(constant.HeaderKeyAccessControlAllowOrigin, acao) + } +} diff --git a/pkg/model/http.go b/pkg/model/http.go index 36e1fa9fd..ee27e19fa 100644 --- a/pkg/model/http.go +++ b/pkg/model/http.go @@ -64,3 +64,11 @@ var RequestMethodValue = map[string]int32{ "OPTIONS": 7, "TRACE": 8, } + +// HttpConfig the http config +type HttpConfig struct { + IdleTimeoutStr string `yaml:"idle_timeout" json:"idle_timeout" mapstructure:"idle_timeout"` + ReadTimeoutStr string `json:"read_timeout,omitempty" yaml:"read_timeout,omitempty" mapstructure:"read_timeout"` + WriteTimeoutStr string `json:"write_timeout,omitempty" yaml:"write_timeout,omitempty" mapstructure:"write_timeout"` + MaxHeaderBytes int `json:"max_header_bytes,omitempty" yaml:"max_header_bytes,omitempty" mapstructure:"max_header_bytes"` +} diff --git a/pkg/proxy/api.go b/pkg/proxy/api.go deleted file mode 100644 index 814933023..000000000 --- a/pkg/proxy/api.go +++ /dev/null @@ -1,130 +0,0 @@ -package proxy - -import ( - "encoding/json" - "errors" - "github.com/dubbogo/dubbo-go-proxy/pkg" - "github.com/dubbogo/dubbo-go-proxy/pkg/model" -) - -import ( - "github.com/dubbogo/dubbo-go-proxy/pkg/service" -) - -import ( - "github.com/goinggo/mapstructure" -) - -func init() { - AddApiDiscoveryService(pkg.ApiDiscoveryService_Dubbo, NewApiDiscoveryService()) -} - -// Api -type Api struct { - Name string `json:"name"` - ITypeStr string `json:"itype"` - IType model.ApiType `json:"-"` - OTypeStr string `json:"otype"` - OType model.ApiType `json:"-"` - Status model.Status `json:"status"` - Metadata interface{} `json:"metadata"` - Method string `json:"method"` - model.RequestMethod - Client Client -} - -type DubboMetadata struct { - ApplicationName string `yaml:"application_name" json:"application_name" mapstructure:"application_name"` - Group string `yaml:"group" json:"group" mapstructure:"group"` - Version string `yaml:"version" json:"version" mapstructure:"version"` - Interface string `yaml:"interface" json:"interface" mapstructure:"interface"` - Method string `yaml:"method" json:"method" mapstructure:"method"` - Types []string `yaml:"type" json:"types" mapstructure:"types"` - Retries string `yaml:"retries" json:"retries,omitempty" property:"retries"` - ProtocolTypeStr string `yaml:"protocol_type" json:"protocol_type,omitempty" property:"protocol_type"` - SerializationTypeStr string `yaml:"serialization_type" json:"serialization_type,omitempty" property:"serialization_type"` -} - -func (a *Api) FindApi(name string) (*Api, bool) { - ads := GetMustApiDiscoveryService(pkg.ApiDiscoveryService_Dubbo) - if api, err := ads.GetApi(*service.NewDiscoveryRequest([]byte(name))); err != nil { - return nil, false - } else { - return api.Data.(*Api), true - } -} - -func (a *Api) MatchMethod(method string) bool { - i := model.RequestMethodValue[method] - if a.RequestMethod == model.RequestMethod(i) { - return true - } - - return false -} - -func (a *Api) IsOk(name string) bool { - if v, ok := apiCache[name]; ok { - return v.Status == model.Up - } - - return false -} - -// Offline api offline -func (a *Api) Offline(name string) { - if v, ok := apiCache[name]; ok { - v.Status = model.Down - } -} - -// Online api online -func (a *Api) Online(name string) { - if v, ok := apiCache[name]; ok { - v.Status = model.Up - } -} - -type ApiDiscoveryService struct { -} - -func NewApiDiscoveryService() *ApiDiscoveryService { - return &ApiDiscoveryService{} -} - -func (ads *ApiDiscoveryService) AddApi(request service.DiscoveryRequest) (service.DiscoveryResponse, error) { - aj := &Api{} - if err := json.Unmarshal(request.Body, aj); err != nil { - return *service.EmptyDiscoveryResponse, err - } - - apiCache[aj.Name] = aj - - if aj.Metadata == nil { - - } else { - if v, ok := aj.Metadata.(map[string]interface{}); ok { - if d, ok := v["dubbo"]; ok { - dm := &DubboMetadata{} - if err := mapstructure.Decode(d, dm); err != nil { - return *service.EmptyDiscoveryResponse, err - } - aj.Metadata = dm - } - } - - aj.RequestMethod = model.RequestMethod(model.RequestMethodValue[aj.Method]) - } - - return *service.NewSuccessDiscoveryResponse(), nil -} - -func (ads *ApiDiscoveryService) GetApi(request service.DiscoveryRequest) (service.DiscoveryResponse, error) { - n := string(request.Body) - - if a, ok := apiCache[n]; ok { - return *service.NewDiscoveryResponse(a), nil - } - - return *service.EmptyDiscoveryResponse, errors.New("not found") -} diff --git a/pkg/proxy/api_filter.go b/pkg/proxy/api_filter.go deleted file mode 100644 index 30ab7d955..000000000 --- a/pkg/proxy/api_filter.go +++ /dev/null @@ -1,51 +0,0 @@ -package proxy - -import ( - "net/http" -) - -import ( - "github.com/dubbogo/dubbo-go-proxy/pkg" -) - -var ( - default404Body = []byte("404 page not found") - default405Body = []byte("405 method not allowed") - default406Body = []byte("406 api not up") -) - -func init() { - AddFilterFunc(pkg.HttpApiFilter, ApiFilter()) -} - -func ApiFilter() FilterFunc { - return func(c Context) { - url := c.GetUrl() - method := c.GetMethod() - - isHit := false - a := &Api{} - if api, b := a.FindApi(url); b { - if !api.MatchMethod(method) { - c.WriteWithStatus(http.StatusMethodNotAllowed, default405Body) - } else { - if !api.IsOk(api.Name) { - c.WriteWithStatus(http.StatusNotAcceptable, default406Body) - } else { - isHit = true - c.Api(api) - c.Next() - } - } - } else { - // status must set first - c.WriteWithStatus(http.StatusNotFound, default404Body) - } - - if !isHit { - c.AddHeader(pkg.HeaderKeyContextType, pkg.HeaderValueTextPlain) - c.Abort() - } - - } -} diff --git a/pkg/proxy/cache.go b/pkg/proxy/cache.go deleted file mode 100644 index 1a43b8eff..000000000 --- a/pkg/proxy/cache.go +++ /dev/null @@ -1,35 +0,0 @@ -package proxy - -var ( - apiCache = map[string]*Api{} - - filterFuncCache = map[string]func(Context){} -) - -func GetMustFilterFunc(name string) FilterFunc { - if ff, ok := filterFuncCache[name]; ok { - return ff - } - - panic("filter func for " + name + " is not existing!") -} - -func AddFilterFunc(name string, ff FilterFunc) { - filterFuncCache[name] = ff -} - -var ( - apiDiscoveryService = map[string]*ApiDiscoveryService{} -) - -func GetMustApiDiscoveryService(name string) *ApiDiscoveryService { - if ff, ok := apiDiscoveryService[name]; ok { - return ff - } - - panic("api discovery service for " + name + " is not existing!") -} - -func AddApiDiscoveryService(name string, ads *ApiDiscoveryService) { - apiDiscoveryService[name] = ads -} diff --git a/pkg/proxy/context.go b/pkg/proxy/context.go deleted file mode 100644 index d852acc66..000000000 --- a/pkg/proxy/context.go +++ /dev/null @@ -1,197 +0,0 @@ -package proxy - -import ( - "bytes" - "encoding/gob" - "encoding/json" - "math" - "net/http" -) - -import ( - "github.com/dubbogo/dubbo-go-proxy/pkg" - "github.com/dubbogo/dubbo-go-proxy/pkg/model" -) - -const abortIndex int8 = math.MaxInt8 / 2 - -type Context interface { - Next() - Abort() - - AppendFilterFunc(ff ...FilterFunc) - - Status(code int) - StatusCode() int - WriteWithStatus(int, []byte) (int, error) - Write([]byte) (int, error) - AddHeader(k, v string) - GetHeader(k string) string - GetUrl() string - GetMethod() string - - BuildFilters() - - Api(api *Api) - GetApi() *Api - - WriteErr(p interface{}) -} - -type BaseContext struct { - Context - index int8 - filters _FilterChain -} - -type FilterFunc func(Context) - -type _FilterChain []FilterFunc - -// Next should be used only inside middleware. -// It executes the pending handlers in the chain inside the calling handler. -// See example in GitHub. -func (c *BaseContext) Next() { - c.index++ - for c.index < int8(len(c.filters)) { - c.filters[c.index](c) - c.index++ - } -} - -func (c *BaseContext) Abort() { - c.index = abortIndex -} - -func (c *BaseContext) AppendFilterFunc(ff ...FilterFunc) { - for _, v := range ff { - c.filters = append(c.filters, v) - } -} - -type HttpContext struct { - *BaseContext - httpConnectionManager model.HttpConnectionManager - FilterChains []model.FilterChain - l *model.Listener - api *Api - - r *http.Request - writermem responseWriter - Writer ResponseWriter -} - -func (hc *HttpContext) Next() { - hc.index++ - for hc.index < int8(len(hc.filters)) { - hc.filters[hc.index](hc) - hc.index++ - } -} - -func (hc *HttpContext) reset() { - hc.Writer = &hc.writermem - hc.filters = nil - hc.index = -1 -} - -func (hc *HttpContext) Status(code int) { - hc.Writer.WriteHeader(code) -} - -func (hc *HttpContext) StatusCode() int { - return hc.Writer.Status() -} - -func (hc *HttpContext) Write(b []byte) (int, error) { - return hc.Writer.Write(b) -} - -func (hc *HttpContext) WriteWithStatus(code int, b []byte) (int, error) { - hc.Writer.WriteHeader(code) - return hc.Writer.Write(b) -} - -func (hc *HttpContext) AddHeader(k, v string) { - hc.Writer.Header().Add(k, v) -} - -func (hc *HttpContext) GetHeader(k string) string { - return hc.r.Header.Get(k) -} - -func (hc *HttpContext) GetUrl() string { - return hc.r.URL.Path -} - -func (hc *HttpContext) GetMethod() string { - return hc.r.Method -} - -func (hc *HttpContext) Api(api *Api) { - hc.api = api -} - -func (hc *HttpContext) GetApi() *Api { - return hc.api -} - -func (hc *HttpContext) WriteFail() { - hc.doWriteJSON(nil, http.StatusInternalServerError, nil) -} - -func (hc *HttpContext) WriteErr(p interface{}) { - hc.doWriteJSON(nil, http.StatusInternalServerError, p) -} - -func (hc *HttpContext) WriteSuccess() { - hc.doWriteJSON(nil, http.StatusOK, nil) -} - -func (hc *HttpContext) WriteResponse(resp Response) { - hc.doWriteJSON(nil, http.StatusOK, resp.data) -} - -func (hc *HttpContext) doWriteJSON(h map[string]string, code int, d interface{}) { - if h == nil { - h = make(map[string]string, 1) - } - h[pkg.HeaderKeyContextType] = pkg.HeaderValueJsonUtf8 - hc.doWrite(h, code, d) -} - -func (hc *HttpContext) doWrite(h map[string]string, code int, d interface{}) { - for k, v := range h { - hc.Writer.Header().Set(k, v) - } - - hc.Writer.WriteHeader(code) - - if d != nil { - if b, err := json.Marshal(d); err != nil { - hc.Writer.Write([]byte(err.Error())) - } else { - hc.Writer.Write(b) - } - } -} - -func (hc *HttpContext) BuildFilters() { - var ff []FilterFunc - - for _, v := range hc.httpConnectionManager.HttpFilters { - ff = append(ff, GetMustFilterFunc(v.Name)) - } - - hc.AppendFilterFunc(ff...) -} - -func GetBytes(k interface{}) ([]byte, error) { - var buf bytes.Buffer - enc := gob.NewEncoder(&buf) - err := enc.Encode(k) - if err != nil { - return nil, err - } - return buf.Bytes(), nil -} diff --git a/pkg/proxy/dubbo_filter.go b/pkg/proxy/dubbo_filter.go deleted file mode 100644 index 373596f59..000000000 --- a/pkg/proxy/dubbo_filter.go +++ /dev/null @@ -1,51 +0,0 @@ -package proxy - -import ( - "io/ioutil" -) - -import ( - "github.com/dubbogo/dubbo-go-proxy/pkg" - "github.com/dubbogo/dubbo-go-proxy/pkg/logger" -) - -import ( - _ "github.com/apache/dubbo-go/cluster/cluster_impl" - _ "github.com/apache/dubbo-go/cluster/loadbalance" - _ "github.com/apache/dubbo-go/filter/filter_impl" - _ "github.com/apache/dubbo-go/registry/protocol" - _ "github.com/apache/dubbo-go/registry/zookeeper" -) - -func init() { - AddFilterFunc(pkg.HttpTransferDubboFilter, HttpDubbo()) -} - -func HttpDubbo() FilterFunc { - return func(c Context) { - doDubbo(c.(*HttpContext)) - } -} - -func doDubbo(c *HttpContext) { - api := c.GetApi() - - if bytes, err := ioutil.ReadAll(c.r.Body); err != nil { - logger.Errorf("[dubboproxy go] read body err:%v!", err) - c.WriteFail() - c.Abort() - } else { - if api.Client == nil { - api.Client = SingleDubboClient() - } - - if resp, err := api.Client.Call(NewRequest(bytes, api)); err != nil { - logger.Errorf("[dubboproxy go] client do err:%v!", err) - c.WriteFail() - c.Abort() - } else { - c.WriteResponse(resp) - c.Next() - } - } -} diff --git a/pkg/proxy/http.go b/pkg/proxy/http.go index 45e311854..7fca609ba 100644 --- a/pkg/proxy/http.go +++ b/pkg/proxy/http.go @@ -1,7 +1,7 @@ package proxy import ( - "github.com/dubbogo/dubbo-go-proxy/pkg" + "github.com/dubbogo/dubbo-go-proxy/pkg/common/constant" "github.com/dubbogo/dubbo-go-proxy/pkg/model" ) @@ -15,14 +15,14 @@ func DefaultHttpConnectionManager() *model.HttpConnectionManager { Prefix: "/api/v1", }, Route: model.RouteAction{ - Cluster: "*", + Cluster: constant.HeaderValueAll, }, }, }, }, HttpFilters: []model.HttpFilter{ { - Name: pkg.HttpRouterFilter, + Name: constant.HttpRouterFilter, }, }, } diff --git a/pkg/proxy/listener.go b/pkg/proxy/listener.go index 7faa184db..00218d270 100644 --- a/pkg/proxy/listener.go +++ b/pkg/proxy/listener.go @@ -9,15 +9,20 @@ import ( ) import ( - "github.com/dubbogo/dubbo-go-proxy/pkg" + "github.com/dubbogo/dubbo-go-proxy/pkg/common/constant" + "github.com/dubbogo/dubbo-go-proxy/pkg/common/extension" + "github.com/dubbogo/dubbo-go-proxy/pkg/context" + h "github.com/dubbogo/dubbo-go-proxy/pkg/context/http" "github.com/dubbogo/dubbo-go-proxy/pkg/logger" "github.com/dubbogo/dubbo-go-proxy/pkg/model" ) +// ListenerService the facade of a listener type ListenerService struct { *model.Listener } +// Start start the listener func (l *ListenerService) Start() { switch l.Address.SocketAddress.Protocol { case model.HTTP: @@ -28,18 +33,15 @@ func (l *ListenerService) Start() { } func (l *ListenerService) httpListener() { - hl := &DefaultHttpListener{ - pool: sync.Pool{}, - } + hl := NewDefaultHttpListener() hl.pool.New = func() interface{} { return l.allocateContext() } - var hc HttpConfig - if l.Config == "" { - - } else { - if c, ok := l.Config.(HttpConfig); ok { + // user customize http config + var hc model.HttpConfig + if l.Config != nil { + if c, ok := l.Config.(model.HttpConfig); ok { hc = c } } @@ -61,19 +63,19 @@ func (l *ListenerService) httpListener() { log.Println(srv.ListenAndServe()) } -func (l *ListenerService) allocateContext() *HttpContext { - return &HttpContext{ - l: l.Listener, +func (l *ListenerService) allocateContext() *h.HttpContext { + return &h.HttpContext{ + Listener: l.Listener, FilterChains: l.FilterChains, - httpConnectionManager: l.findHttpManager(), - BaseContext: &BaseContext{}, + HttpConnectionManager: l.findHttpManager(), + BaseContext: context.NewBaseContext(), } } func (l *ListenerService) findHttpManager() model.HttpConnectionManager { for _, fc := range l.FilterChains { for _, f := range fc.Filters { - if f.Name == pkg.HttpConnectManagerFilter { + if f.Name == constant.HttpConnectManagerFilter { return *f.Config.(*model.HttpConnectionManager) } } @@ -82,24 +84,26 @@ func (l *ListenerService) findHttpManager() model.HttpConnectionManager { return *DefaultHttpConnectionManager() } -type HttpConfig struct { - IdleTimeoutStr string `yaml:"idle_timeout" json:"idle_timeout" mapstructure:"idle_timeout"` - ReadTimeoutStr string `json:"read_timeout,omitempty" yaml:"read_timeout,omitempty" mapstructure:"read_timeout"` - WriteTimeoutStr string `json:"write_timeout,omitempty" yaml:"write_timeout,omitempty" mapstructure:"write_timeout"` - MaxHeaderBytes int `json:"max_header_bytes,omitempty" yaml:"max_header_bytes,omitempty" mapstructure:"max_header_bytes"` -} - type DefaultHttpListener struct { pool sync.Pool } +func NewDefaultHttpListener() *DefaultHttpListener { + return &DefaultHttpListener{ + pool: sync.Pool{}, + } +} + func (s *DefaultHttpListener) ServeHTTP(w http.ResponseWriter, r *http.Request) { - hc := s.pool.Get().(*HttpContext) - hc.r = r - hc.writermem.reset(w) - hc.reset() + hc := s.pool.Get().(*h.HttpContext) + hc.Request = r + hc.ResetWritermen(w) + hc.Reset() - hc.AppendFilterFunc(Logger(), Recover()) + hc.AppendFilterFunc( + extension.GetMustFilterFunc(constant.LoggerFilter), + extension.GetMustFilterFunc(constant.RecoveryFilter), + ) hc.BuildFilters() @@ -108,10 +112,10 @@ func (s *DefaultHttpListener) ServeHTTP(w http.ResponseWriter, r *http.Request) s.pool.Put(hc) } -func (s *DefaultHttpListener) handleHTTPRequest(c *HttpContext) { - if len(c.BaseContext.filters) > 0 { +func (s *DefaultHttpListener) handleHTTPRequest(c *h.HttpContext) { + if len(c.BaseContext.Filters) > 0 { c.Next() - c.writermem.WriteHeaderNow() + c.WriteHeaderNow() return } diff --git a/pkg/proxy/logger_filter.go b/pkg/proxy/logger_filter.go deleted file mode 100644 index 7caf23094..000000000 --- a/pkg/proxy/logger_filter.go +++ /dev/null @@ -1,21 +0,0 @@ -package proxy - -import ( - "time" -) - -import ( - "github.com/dubbogo/dubbo-go-proxy/pkg/logger" -) - -func Logger() FilterFunc { - return func(c Context) { - start := time.Now() - - c.Next() - - latency := time.Now().Sub(start) - - logger.Infof("[dubboproxy go] [UPSTREAM] receive request | %d | %s | %s | %s | ", c.StatusCode(), latency, c.GetMethod(), c.GetUrl()) - } -} diff --git a/pkg/proxy/proxy_start.go b/pkg/proxy/proxy_start.go index fa0694f47..cc87d23e2 100644 --- a/pkg/proxy/proxy_start.go +++ b/pkg/proxy/proxy_start.go @@ -6,10 +6,15 @@ import ( ) import ( - "github.com/dubbogo/dubbo-go-proxy/pkg" + "github.com/dubbogo/dubbo-go-proxy/pkg/client" + "github.com/dubbogo/dubbo-go-proxy/pkg/common/constant" + "github.com/dubbogo/dubbo-go-proxy/pkg/common/extension" + "github.com/dubbogo/dubbo-go-proxy/pkg/config" + _ "github.com/dubbogo/dubbo-go-proxy/pkg/filter" "github.com/dubbogo/dubbo-go-proxy/pkg/logger" "github.com/dubbogo/dubbo-go-proxy/pkg/model" "github.com/dubbogo/dubbo-go-proxy/pkg/service" + _ "github.com/dubbogo/dubbo-go-proxy/pkg/service/api" ) type Proxy struct { @@ -17,7 +22,7 @@ type Proxy struct { } func (p *Proxy) Start() { - conf := GetBootstrap() + conf := config.GetBootstrap() p.startWG.Add(1) @@ -39,18 +44,18 @@ func (p *Proxy) Start() { } func (p *Proxy) beforeStart() { - SingleDubboClient().Init() + client.SingleDubboClient().Init() // TODO mock api register - ads := GetMustApiDiscoveryService(pkg.ApiDiscoveryService_Dubbo) + ads := extension.GetMustApiDiscoveryService(constant.LocalMemoryApiDiscoveryService) - a1 := &Api{ + a1 := &client.Api{ Name: "/api/v1/test-dubbo/user", ITypeStr: "HTTP", OTypeStr: "DUBBO", Method: "POST", Status: 1, - Metadata: map[string]DubboMetadata{ + Metadata: map[string]client.DubboMetadata{ "dubbo": { ApplicationName: "BDTService", Group: "test", @@ -60,16 +65,17 @@ func (p *Proxy) beforeStart() { Types: []string{ "com.ikurento.user.User", }, + ClusterName: "test_dubbo", }, }, } - a2 := &Api{ + a2 := &client.Api{ Name: "/api/v1/test-dubbo/getUserByName", ITypeStr: "HTTP", OTypeStr: "DUBBO", Method: "POST", Status: 1, - Metadata: map[string]DubboMetadata{ + Metadata: map[string]client.DubboMetadata{ "dubbo": { ApplicationName: "BDTService", Group: "test", @@ -79,6 +85,7 @@ func (p *Proxy) beforeStart() { Types: []string{ "java.lang.String", }, + ClusterName: "test_dubbo", }, }, } diff --git a/pkg/proxy/recovery_filter.go b/pkg/proxy/recovery_filter.go deleted file mode 100644 index 700742a63..000000000 --- a/pkg/proxy/recovery_filter.go +++ /dev/null @@ -1,15 +0,0 @@ -package proxy - -import "github.com/dubbogo/dubbo-go-proxy/pkg/logger" - -func Recover() FilterFunc { - return func(c Context) { - defer func() { - if err := recover(); err != nil { - logger.Infof("[dubboproxy go] error:%+v", err) - c.WriteErr(err) - } - }() - c.Next() - } -} diff --git a/pkg/proxy/router_filter.go b/pkg/proxy/router_filter.go deleted file mode 100644 index 29ba54c66..000000000 --- a/pkg/proxy/router_filter.go +++ /dev/null @@ -1,79 +0,0 @@ -package proxy - -import ( - "github.com/dubbogo/dubbo-go-proxy/pkg" - "github.com/dubbogo/dubbo-go-proxy/pkg/model" - "net/http" - "strings" -) - -var ( - default403Body = []byte("403 for bidden") -) - -func init() { - AddFilterFunc(pkg.HttpRouterFilter, HttpRouting()) -} - -// HttpRouting http router filter -func HttpRouting() FilterFunc { - return func(c Context) { - routingFilter(c.(*HttpContext)) - } -} - -// routingFilter -func routingFilter(c *HttpContext) { - result := true - for _, v := range c.httpConnectionManager.RouteConfig.Routes { - result = routeMatch(c, v) - if result { - httpHeaderCorsHandler(c, v) - break - } - } - - if !result { - c.WriteWithStatus(http.StatusForbidden, default403Body) - c.Abort() - } -} - -// routeMatch will match router with request, only true or false way -func routeMatch(c *HttpContext, r model.Router) bool { - result := true - if len(r.Match.Headers) > 0 { - for _, v := range r.Match.Headers { - result = HttpHeaderMatch(c, v) - if !result { - break - } - } - } - - if !result { - return result - } - - result = HttpRouteMatch(c, r.Match) - - if !result { - return result - } - - return HttpRouteActionMatch(c, r.Route) -} - -// httpHeaderCorsHandler will set cors, handler mean can do c.Next() -func httpHeaderCorsHandler(c *HttpContext, r model.Router) { - var acao string - if r.Route.Cors.Enabled { - acao = strings.Join(r.Route.Cors.AllowOrigin, "|") - } - - c.Next() - - if acao != "" { - c.AddHeader(pkg.HeaderKeyAccessControlAllowOrigin, acao) - } -} diff --git a/pkg/service/api/discovery_service.go b/pkg/service/api/discovery_service.go new file mode 100644 index 000000000..da0cceadd --- /dev/null +++ b/pkg/service/api/discovery_service.go @@ -0,0 +1,68 @@ +package api + +import ( + "encoding/json" + "errors" + "github.com/goinggo/mapstructure" +) + +import ( + "github.com/dubbogo/dubbo-go-proxy/pkg/client" + "github.com/dubbogo/dubbo-go-proxy/pkg/common/constant" + "github.com/dubbogo/dubbo-go-proxy/pkg/common/extension" + "github.com/dubbogo/dubbo-go-proxy/pkg/logger" + "github.com/dubbogo/dubbo-go-proxy/pkg/model" + "github.com/dubbogo/dubbo-go-proxy/pkg/service" +) + +func init() { + extension.SetApiDiscoveryService(constant.LocalMemoryApiDiscoveryService, NewLocalMemoryApiDiscoveryService()) +} + +type LocalMemoryApiDiscoveryService struct { +} + +func NewLocalMemoryApiDiscoveryService() *LocalMemoryApiDiscoveryService { + return &LocalMemoryApiDiscoveryService{} +} + +func (ads *LocalMemoryApiDiscoveryService) AddApi(request service.DiscoveryRequest) (service.DiscoveryResponse, error) { + aj := client.NewApi() + if err := json.Unmarshal(request.Body, aj); err != nil { + return *service.EmptyDiscoveryResponse, err + } + + if _, loaded := client.CacheApi.LoadOrStore(aj.Name, aj); loaded { + // loaded + logger.Warnf("api:%s is exist", aj) + } else { + // store + if aj.Metadata == nil { + + } else { + if v, ok := aj.Metadata.(map[string]interface{}); ok { + if d, ok := v["dubbo"]; ok { + dm := &client.DubboMetadata{} + if err := mapstructure.Decode(d, dm); err != nil { + return *service.EmptyDiscoveryResponse, err + } + aj.Metadata = dm + } + } + + aj.RequestMethod = model.RequestMethod(model.RequestMethodValue[aj.Method]) + } + } + + return *service.NewDiscoveryResponseWithSuccess(true), nil +} + +func (ads *LocalMemoryApiDiscoveryService) GetApi(request service.DiscoveryRequest) (service.DiscoveryResponse, error) { + n := string(request.Body) + + if a, ok := client.CacheApi.Load(n); ok { + return *service.NewDiscoveryResponse(a), nil + } + + return *service.EmptyDiscoveryResponse, errors.New("not found") +} diff --git a/pkg/service/discovery_service.go b/pkg/service/discovery_service.go index 9e77c50e2..e8f682940 100644 --- a/pkg/service/discovery_service.go +++ b/pkg/service/discovery_service.go @@ -1,26 +1,31 @@ package service +// DiscoveryRequest a request for discovery type DiscoveryRequest struct { Body []byte } +// NewDiscoveryRequest return a DiscoveryRequest with body func NewDiscoveryRequest(b []byte) *DiscoveryRequest { return &DiscoveryRequest{ Body: b, } } +// DiscoveryResponse a response for discovery type DiscoveryResponse struct { Success bool Data interface{} } -func NewSuccessDiscoveryResponse() *DiscoveryResponse { +// NewDiscoveryResponseWithSuccess return a DiscoveryResponse with success +func NewDiscoveryResponseWithSuccess(b bool) *DiscoveryResponse { return &DiscoveryResponse{ - Success: true, + Success: b, } } +// NewDiscoveryResponse return a DiscoveryResponse with Data and success true func NewDiscoveryResponse(d interface{}) *DiscoveryResponse { return &DiscoveryResponse{ Success: true, @@ -30,6 +35,7 @@ func NewDiscoveryResponse(d interface{}) *DiscoveryResponse { var EmptyDiscoveryResponse = &DiscoveryResponse{} +// ApiDiscoveryService api discovery service interface type ApiDiscoveryService interface { AddApi(request DiscoveryRequest) (DiscoveryResponse, error) GetApi(request DiscoveryRequest) (DiscoveryResponse, error) From 07f13236ca8335bc5018e8d7dddfe7d60d12fe09 Mon Sep 17 00:00:00 2001 From: tiecheng <18768171164@163.com> Date: Fri, 4 Sep 2020 13:51:16 +0800 Subject: [PATCH 019/227] change api and client package --- pkg/client/{ => dubbo}/dubbo_client.go | 18 ++++++----- pkg/client/{ => dubbo}/dubbo_response.go | 12 +++++--- pkg/client/request.go | 6 ++-- pkg/context/context.go | 6 ++-- pkg/context/http/context.go | 6 ++-- pkg/filter/api_filter.go | 4 +-- pkg/filter/dubbo_filter.go | 7 ++--- pkg/{client => model}/api.go | 38 ++++++++++-------------- pkg/proxy/proxy_start.go | 12 ++++---- pkg/service/api/discovery_service.go | 10 +++---- 10 files changed, 59 insertions(+), 60 deletions(-) rename pkg/client/{ => dubbo}/dubbo_client.go (91%) rename pkg/client/{ => dubbo}/dubbo_response.go (94%) rename pkg/{client => model}/api.go (53%) diff --git a/pkg/client/dubbo_client.go b/pkg/client/dubbo/dubbo_client.go similarity index 91% rename from pkg/client/dubbo_client.go rename to pkg/client/dubbo/dubbo_client.go index 4eed35f8a..dc8ea581d 100644 --- a/pkg/client/dubbo_client.go +++ b/pkg/client/dubbo/dubbo_client.go @@ -1,4 +1,4 @@ -package client +package dubbo import ( "context" @@ -9,6 +9,7 @@ import ( ) import ( + "github.com/dubbogo/dubbo-go-proxy/pkg/client" "github.com/dubbogo/dubbo-go-proxy/pkg/logger" ) @@ -43,6 +44,7 @@ var ( dgCfg dg.ConsumerConfig ) +// DubboClient type DubboClient struct { mLock sync.RWMutex GenericServicePool map[string]*dg.GenericService @@ -77,9 +79,9 @@ func (dc *DubboClient) Close() error { return nil } -func (dc *DubboClient) Call(r *Request) (resp Response, err error) { +func (dc *DubboClient) Call(r *client.Request) (resp client.Response, err error) { dm := r.Api.Metadata.(*DubboMetadata) - gs := dc.Get(dm.Interface, dm.Version, dm.Group, r.Api.Name, dm) + gs := dc.Get(dm.Interface, dm.Version, dm.Group, dm) var reqData []interface{} @@ -105,21 +107,21 @@ func (dc *DubboClient) Call(r *Request) (resp Response, err error) { default: bodyMap := make(map[string]interface{}) if err := json.Unmarshal(r.Body, &bodyMap); err != nil { - return *EmptyResponse, err + return *client.EmptyResponse, err } else { reqData = append(reqData, bodyMap) } } case l > 1: if err = json.Unmarshal(r.Body, &reqData); err != nil { - return *EmptyResponse, err + return *client.EmptyResponse, err } } logger.Debugf("[dubbogo proxy] invoke, method:%v, types:%v, reqData:%v", dm.Method, dm.Types, reqData) if resp, err := gs.Invoke(context.Background(), []interface{}{dm.Method, dm.Types, reqData}); err != nil { - return *EmptyResponse, err + return *client.EmptyResponse, err } else { logger.Debugf("[dubbogo proxy] dubbo client resp:%v", resp) return *NewDubboResponse(resp), nil @@ -176,8 +178,8 @@ func (dc *DubboClient) create(key string, dm *DubboMetadata) *dg.GenericService return clientService } -func (dc *DubboClient) Get(interfaceName, version, group string, apiName string, dm *DubboMetadata) *dg.GenericService { - key := strings.Join([]string{apiName, interfaceName, version, group}, "_") +func (dc *DubboClient) Get(interfaceName, version, group string, dm *DubboMetadata) *dg.GenericService { + key := strings.Join([]string{dm.ApplicationName, interfaceName, version, group}, "_") if dc.check(key) { return dc.get(key) } else { diff --git a/pkg/client/dubbo_response.go b/pkg/client/dubbo/dubbo_response.go similarity index 94% rename from pkg/client/dubbo_response.go rename to pkg/client/dubbo/dubbo_response.go index 9acb3b130..a95dabb14 100644 --- a/pkg/client/dubbo_response.go +++ b/pkg/client/dubbo/dubbo_response.go @@ -1,4 +1,4 @@ -package client +package dubbo import ( "errors" @@ -7,11 +7,15 @@ import ( "strings" ) -func NewDubboResponse(data interface{}) *Response { +import ( + "github.com/dubbogo/dubbo-go-proxy/pkg/client" +) + +func NewDubboResponse(data interface{}) *client.Response { if r, err := dealResp(data, true); err != nil { - return &Response{Data: data} + return &client.Response{Data: data} } else { - return &Response{Data: r} + return &client.Response{Data: r} } } diff --git a/pkg/client/request.go b/pkg/client/request.go index 28c1f33ca..c31ca7893 100644 --- a/pkg/client/request.go +++ b/pkg/client/request.go @@ -1,12 +1,14 @@ package client +import "github.com/dubbogo/dubbo-go-proxy/pkg/model" + type Request struct { Body []byte Header map[string]string - Api *Api + Api *model.Api } -func NewRequest(b []byte, api *Api) *Request { +func NewRequest(b []byte, api *model.Api) *Request { return &Request{ Body: b, Api: api, diff --git a/pkg/context/context.go b/pkg/context/context.go index fd4e2abc0..94a44f769 100644 --- a/pkg/context/context.go +++ b/pkg/context/context.go @@ -1,7 +1,7 @@ package context import ( - "github.com/dubbogo/dubbo-go-proxy/pkg/client" + "github.com/dubbogo/dubbo-go-proxy/pkg/model" ) // Context run context @@ -22,8 +22,8 @@ type Context interface { BuildFilters() - Api(api *client.Api) - GetApi() *client.Api + Api(api *model.Api) + GetApi() *model.Api WriteErr(p interface{}) } diff --git a/pkg/context/http/context.go b/pkg/context/http/context.go index 7c21e019f..f839bf1f4 100644 --- a/pkg/context/http/context.go +++ b/pkg/context/http/context.go @@ -19,7 +19,7 @@ type HttpContext struct { HttpConnectionManager model.HttpConnectionManager FilterChains []model.FilterChain Listener *model.Listener - api *client.Api + api *model.Api Request *http.Request writermem responseWriter @@ -82,11 +82,11 @@ func (hc *HttpContext) GetMethod() string { return hc.Request.Method } -func (hc *HttpContext) Api(api *client.Api) { +func (hc *HttpContext) Api(api *model.Api) { hc.api = api } -func (hc *HttpContext) GetApi() *client.Api { +func (hc *HttpContext) GetApi() *model.Api { return hc.api } diff --git a/pkg/filter/api_filter.go b/pkg/filter/api_filter.go index 57cfdadc2..a5ff32d85 100644 --- a/pkg/filter/api_filter.go +++ b/pkg/filter/api_filter.go @@ -5,10 +5,10 @@ import ( ) import ( - "github.com/dubbogo/dubbo-go-proxy/pkg/client" "github.com/dubbogo/dubbo-go-proxy/pkg/common/constant" "github.com/dubbogo/dubbo-go-proxy/pkg/common/extension" "github.com/dubbogo/dubbo-go-proxy/pkg/context" + "github.com/dubbogo/dubbo-go-proxy/pkg/model" ) func init() { @@ -20,7 +20,7 @@ func ApiFilter() context.FilterFunc { url := c.GetUrl() method := c.GetMethod() - if api, ok := client.EmptyApi.FindApi(url); ok { + if api, ok := model.EmptyApi.FindApi(url); ok { if !api.MatchMethod(method) { c.WriteWithStatus(http.StatusMethodNotAllowed, constant.Default405Body) c.AddHeader(constant.HeaderKeyContextType, constant.HeaderValueTextPlain) diff --git a/pkg/filter/dubbo_filter.go b/pkg/filter/dubbo_filter.go index 1fa7af466..66e01b6be 100644 --- a/pkg/filter/dubbo_filter.go +++ b/pkg/filter/dubbo_filter.go @@ -6,6 +6,7 @@ import ( import ( "github.com/dubbogo/dubbo-go-proxy/pkg/client" + "github.com/dubbogo/dubbo-go-proxy/pkg/client/dubbo" "github.com/dubbogo/dubbo-go-proxy/pkg/common/constant" "github.com/dubbogo/dubbo-go-proxy/pkg/common/extension" "github.com/dubbogo/dubbo-go-proxy/pkg/context" @@ -40,11 +41,7 @@ func doDubbo(c *http.HttpContext) { c.WriteFail() c.Abort() } else { - if api.Client == nil { - api.Client = client.SingleDubboClient() - } - - if resp, err := api.Client.Call(client.NewRequest(bytes, api)); err != nil { + if resp, err := dubbo.SingleDubboClient().Call(client.NewRequest(bytes, api)); err != nil { logger.Errorf("[dubboproxy go] client do err:%v!", err) c.WriteFail() c.Abort() diff --git a/pkg/client/api.go b/pkg/model/api.go similarity index 53% rename from pkg/client/api.go rename to pkg/model/api.go index 971963455..e982966da 100644 --- a/pkg/client/api.go +++ b/pkg/model/api.go @@ -1,36 +1,30 @@ -package client +package model import ( "sync" ) -import ( - "github.com/dubbogo/dubbo-go-proxy/pkg/model" -) - var ( CacheApi = sync.Map{} ) // Api is api gateway concept, control request from browser、Mobile APP、third party people type Api struct { - Name string `json:"name"` - ITypeStr string `json:"itype"` - IType model.ApiType `json:"-"` - OTypeStr string `json:"otype"` - OType model.ApiType `json:"-"` - Status model.Status `json:"status"` - Metadata interface{} `json:"metadata"` - Method string `json:"method"` - model.RequestMethod - Client Client - lock sync.Mutex + Name string `json:"name"` + ITypeStr string `json:"itype"` + IType ApiType `json:"-"` + OTypeStr string `json:"otype"` + OType ApiType `json:"-"` + Status Status `json:"status"` + Metadata interface{} `json:"metadata"` + Method string `json:"method"` + RequestMethod } var EmptyApi = &Api{} func NewApi() *Api { - return &Api{lock: sync.Mutex{}} + return &Api{} } func (a *Api) FindApi(name string) (*Api, bool) { @@ -42,8 +36,8 @@ func (a *Api) FindApi(name string) (*Api, bool) { } func (a *Api) MatchMethod(method string) bool { - i := model.RequestMethodValue[method] - if a.RequestMethod == model.RequestMethod(i) { + i := RequestMethodValue[method] + if a.RequestMethod == RequestMethod(i) { return true } @@ -52,7 +46,7 @@ func (a *Api) MatchMethod(method string) bool { func (a *Api) IsOk(name string) bool { if v, ok := CacheApi.Load(name); ok { - return v.(*Api).Status == model.Up + return v.(*Api).Status == Up } return false @@ -61,13 +55,13 @@ func (a *Api) IsOk(name string) bool { // Offline api offline func (a *Api) Offline(name string) { if v, ok := CacheApi.Load(name); ok { - v.(*Api).Status = model.Down + v.(*Api).Status = Down } } // Online api online func (a *Api) Online(name string) { if v, ok := CacheApi.Load(name); ok { - v.(*Api).Status = model.Up + v.(*Api).Status = Up } } diff --git a/pkg/proxy/proxy_start.go b/pkg/proxy/proxy_start.go index cc87d23e2..a45ed0823 100644 --- a/pkg/proxy/proxy_start.go +++ b/pkg/proxy/proxy_start.go @@ -6,7 +6,7 @@ import ( ) import ( - "github.com/dubbogo/dubbo-go-proxy/pkg/client" + "github.com/dubbogo/dubbo-go-proxy/pkg/client/dubbo" "github.com/dubbogo/dubbo-go-proxy/pkg/common/constant" "github.com/dubbogo/dubbo-go-proxy/pkg/common/extension" "github.com/dubbogo/dubbo-go-proxy/pkg/config" @@ -44,18 +44,18 @@ func (p *Proxy) Start() { } func (p *Proxy) beforeStart() { - client.SingleDubboClient().Init() + dubbo.SingleDubboClient().Init() // TODO mock api register ads := extension.GetMustApiDiscoveryService(constant.LocalMemoryApiDiscoveryService) - a1 := &client.Api{ + a1 := &model.Api{ Name: "/api/v1/test-dubbo/user", ITypeStr: "HTTP", OTypeStr: "DUBBO", Method: "POST", Status: 1, - Metadata: map[string]client.DubboMetadata{ + Metadata: map[string]dubbo.DubboMetadata{ "dubbo": { ApplicationName: "BDTService", Group: "test", @@ -69,13 +69,13 @@ func (p *Proxy) beforeStart() { }, }, } - a2 := &client.Api{ + a2 := &model.Api{ Name: "/api/v1/test-dubbo/getUserByName", ITypeStr: "HTTP", OTypeStr: "DUBBO", Method: "POST", Status: 1, - Metadata: map[string]client.DubboMetadata{ + Metadata: map[string]dubbo.DubboMetadata{ "dubbo": { ApplicationName: "BDTService", Group: "test", diff --git a/pkg/service/api/discovery_service.go b/pkg/service/api/discovery_service.go index da0cceadd..4d092a86f 100644 --- a/pkg/service/api/discovery_service.go +++ b/pkg/service/api/discovery_service.go @@ -7,7 +7,7 @@ import ( ) import ( - "github.com/dubbogo/dubbo-go-proxy/pkg/client" + "github.com/dubbogo/dubbo-go-proxy/pkg/client/dubbo" "github.com/dubbogo/dubbo-go-proxy/pkg/common/constant" "github.com/dubbogo/dubbo-go-proxy/pkg/common/extension" "github.com/dubbogo/dubbo-go-proxy/pkg/logger" @@ -27,12 +27,12 @@ func NewLocalMemoryApiDiscoveryService() *LocalMemoryApiDiscoveryService { } func (ads *LocalMemoryApiDiscoveryService) AddApi(request service.DiscoveryRequest) (service.DiscoveryResponse, error) { - aj := client.NewApi() + aj := model.NewApi() if err := json.Unmarshal(request.Body, aj); err != nil { return *service.EmptyDiscoveryResponse, err } - if _, loaded := client.CacheApi.LoadOrStore(aj.Name, aj); loaded { + if _, loaded := model.CacheApi.LoadOrStore(aj.Name, aj); loaded { // loaded logger.Warnf("api:%s is exist", aj) } else { @@ -42,7 +42,7 @@ func (ads *LocalMemoryApiDiscoveryService) AddApi(request service.DiscoveryReque } else { if v, ok := aj.Metadata.(map[string]interface{}); ok { if d, ok := v["dubbo"]; ok { - dm := &client.DubboMetadata{} + dm := &dubbo.DubboMetadata{} if err := mapstructure.Decode(d, dm); err != nil { return *service.EmptyDiscoveryResponse, err } @@ -60,7 +60,7 @@ func (ads *LocalMemoryApiDiscoveryService) AddApi(request service.DiscoveryReque func (ads *LocalMemoryApiDiscoveryService) GetApi(request service.DiscoveryRequest) (service.DiscoveryResponse, error) { n := string(request.Body) - if a, ok := client.CacheApi.Load(n); ok { + if a, ok := model.CacheApi.Load(n); ok { return *service.NewDiscoveryResponse(a), nil } From 073b5147fa1cfa6b33558c62a7ae270a3933a0a9 Mon Sep 17 00:00:00 2001 From: tiecheng <18768171164@163.com> Date: Wed, 9 Sep 2020 10:25:52 +0800 Subject: [PATCH 020/227] format and add commit --- cmd/proxy/control.go | 5 ++++- cmd/proxy/proxy.go | 1 + go.sum | 5 +++-- pkg/client/dubbo/dubbo_client.go | 19 +++++++++++++------ pkg/client/dubbo/dubbo_response.go | 1 + pkg/client/request.go | 6 +++++- pkg/client/response.go | 3 +++ pkg/config/config_load.go | 11 +++++++---- pkg/config/config_load_test.go | 5 ++++- pkg/context/base_context.go | 4 +++- pkg/context/filter.go | 2 ++ pkg/context/http/context.go | 23 ++++++++++++++++++----- pkg/context/http/writer.go | 5 ++++- pkg/filter/api_filter.go | 1 + pkg/filter/dubbo_filter.go | 16 ++++++++-------- pkg/filter/http_filter.go | 1 + pkg/filter/logger_filter.go | 1 + pkg/filter/recovery_filter.go | 1 + pkg/logger/logger.go | 3 +++ pkg/logger/logging.go | 15 +++++++++++++++ pkg/model/api.go | 7 +++++-- pkg/model/match.go | 2 ++ pkg/model/router.go | 2 +- pkg/model/types.go | 1 - pkg/proxy/listener.go | 3 +++ pkg/proxy/proxy_start.go | 3 +++ pkg/service/api/discovery_service.go | 3 +++ pkg/service/discovery_service.go | 6 ++++++ 28 files changed, 121 insertions(+), 34 deletions(-) delete mode 100644 pkg/model/types.go diff --git a/cmd/proxy/control.go b/cmd/proxy/control.go index 1065564ad..6c2548286 100644 --- a/cmd/proxy/control.go +++ b/cmd/proxy/control.go @@ -1,10 +1,13 @@ package main import ( - "github.com/urfave/cli" "runtime" ) +import ( + "github.com/urfave/cli" +) + import ( "github.com/dubbogo/dubbo-go-proxy/pkg/config" "github.com/dubbogo/dubbo-go-proxy/pkg/logger" diff --git a/cmd/proxy/proxy.go b/cmd/proxy/proxy.go index 8454b0f83..738c4767f 100644 --- a/cmd/proxy/proxy.go +++ b/cmd/proxy/proxy.go @@ -13,6 +13,7 @@ import ( // Version proxy version var Version = "0.1.0" +// main proxy run method func main() { app := newProxyApp(&cmdStart) diff --git a/go.sum b/go.sum index 8d782caea..62525845d 100644 --- a/go.sum +++ b/go.sum @@ -11,6 +11,7 @@ cloud.google.com/go/firestore v1.1.0/go.mod h1:ulACoGHTpvq5r8rxGJ4ddJZBZqakUQqCl cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I= cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw= dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= +githu.com/apache/dubbo-getty v1.3.10 h1:ys5mwjPdxG/KwkPjS6EI0RzQtU6p6FCPoKpaFEzpAL0= github.com/Azure/azure-sdk-for-go v40.3.0+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc= github.com/Azure/go-autorest/autorest v0.9.0/go.mod h1:xyHB1BMZT0cuDHU7I0+g046+BFDTQ8rEZB0s4Yfa6bI= github.com/Azure/go-autorest/autorest v0.9.3/go.mod h1:GsRuLYvwzLjjjRoWEIyMUaYq8GNUx2nRB378IPt/1p0= @@ -51,9 +52,7 @@ github.com/afex/hystrix-go v0.0.0-20180502004556-fa1af6a1f4f5/go.mod h1:SkGFH1ia github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= github.com/aliyun/alibaba-cloud-sdk-go v1.61.18/go.mod h1:v8ESoHo4SyHmuB4b1tJqDHxfTGEciD+yhvOU/5s1Rfk= -github.com/apache/dubbo-getty v1.3.10 h1:ys5mwjPdxG/KwkPjS6EI0RzQtU6p6FCPoKpaFEzpAL0= github.com/apache/dubbo-getty v1.3.10/go.mod h1:x6rraK01BL5C7jUM2fPl5KMkAxLVIx54ZB8/XEOik9Y= -github.com/apache/dubbo-go v1.5.1 h1:9bcGOkek0+x+zqtvykKpuOwkoJfMef0zNxsyPbWOafY= github.com/apache/dubbo-go v1.5.1/go.mod h1:lxwgtF+27mSFQsSrBLaVbdQpwCp+pBN/mHP4w4/N2Qc= github.com/apache/dubbo-go-hessian2 v1.6.2 h1:i7F5GjVaUatLQz1x9vUmmSIFj49L8J6rVICdF6xw4qw= github.com/apache/dubbo-go-hessian2 v1.6.2/go.mod h1:7rEw9guWABQa6Aqb8HeZcsYPHsOS7XT1qtJvkmI6c5w= @@ -65,6 +64,7 @@ github.com/armon/go-metrics v0.3.0/go.mod h1:zXjbSimjXTd7vOpY8B0/2LpvNvDoXBuplAD github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= github.com/armon/go-radix v1.0.0/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= github.com/aws/aws-sdk-go v1.25.41/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= +github.com/bapache/dubbo-getty v1.3.10/go.mod h1:x6rraK01BL5C7jUM2fPl5KMkAxLVIx54ZB8/XEOik9Y= github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= @@ -477,6 +477,7 @@ github.com/vmware/govmomi v0.18.0/go.mod h1:URlwyTFZX72RmxtxuaFL2Uj3fD1JTvZdx59b github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU= github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q= github.com/zouyx/agollo/v3 v3.4.4/go.mod h1:ag0XmE1r4iAgPd6PUnU9TJ0DMEjM1VKX1HUNqQJ2ywU= +githubm/.com/apache/dubbo-go v1.5.1 h1:9bcGOkek0+x+zqtvykKpuOwkoJfMef0zNxsyPbWOafY= go.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= go.etcd.io/bbolt v1.3.4/go.mod h1:G5EMThwa9y8QZGBClrRx5EY+Yw9kAhnjy3bSjsnlVTQ= go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= diff --git a/pkg/client/dubbo/dubbo_client.go b/pkg/client/dubbo/dubbo_client.go index dc8ea581d..245010f9f 100644 --- a/pkg/client/dubbo/dubbo_client.go +++ b/pkg/client/dubbo/dubbo_client.go @@ -8,23 +8,24 @@ import ( "time" ) -import ( - "github.com/dubbogo/dubbo-go-proxy/pkg/client" - "github.com/dubbogo/dubbo-go-proxy/pkg/logger" -) - import ( "github.com/apache/dubbo-go/common/constant" dg "github.com/apache/dubbo-go/config" "github.com/apache/dubbo-go/protocol/dubbo" ) +import ( + "github.com/dubbogo/dubbo-go-proxy/pkg/client" + "github.com/dubbogo/dubbo-go-proxy/pkg/logger" +) + // TODO java class name elem const ( JavaStringClassName = "java.lang.String" JavaLangClassName = "java.lang.Long" ) +// DubboMetadata dubbo metadata, api config type DubboMetadata struct { ApplicationName string `yaml:"application_name" json:"application_name" mapstructure:"application_name"` Group string `yaml:"group" json:"group" mapstructure:"group"` @@ -44,12 +45,13 @@ var ( dgCfg dg.ConsumerConfig ) -// DubboClient +// DubboClient client to generic invoke dubbo type DubboClient struct { mLock sync.RWMutex GenericServicePool map[string]*dg.GenericService } +// SingleDubboClient singleton dubbo clent func SingleDubboClient() *DubboClient { if _DubboClient == nil { onceClient.Do(func() { @@ -60,6 +62,7 @@ func SingleDubboClient() *DubboClient { return _DubboClient } +// NewDubboClient create dubbo client func NewDubboClient() *DubboClient { return &DubboClient{ mLock: sync.RWMutex{}, @@ -67,6 +70,7 @@ func NewDubboClient() *DubboClient { } } +// Init init dubbo, config mapping can do here func (dc *DubboClient) Init() error { dgCfg = dg.GetConsumerConfig() dg.SetConsumerConfig(dgCfg) @@ -75,10 +79,12 @@ func (dc *DubboClient) Init() error { return nil } +// Close func (dc *DubboClient) Close() error { return nil } +// Call invoke service func (dc *DubboClient) Call(r *client.Request) (resp client.Response, err error) { dm := r.Api.Metadata.(*DubboMetadata) gs := dc.Get(dm.Interface, dm.Version, dm.Group, dm) @@ -178,6 +184,7 @@ func (dc *DubboClient) create(key string, dm *DubboMetadata) *dg.GenericService return clientService } +// Get find a dubbo GenericService func (dc *DubboClient) Get(interfaceName, version, group string, dm *DubboMetadata) *dg.GenericService { key := strings.Join([]string{dm.ApplicationName, interfaceName, version, group}, "_") if dc.check(key) { diff --git a/pkg/client/dubbo/dubbo_response.go b/pkg/client/dubbo/dubbo_response.go index a95dabb14..0fca4ce7c 100644 --- a/pkg/client/dubbo/dubbo_response.go +++ b/pkg/client/dubbo/dubbo_response.go @@ -11,6 +11,7 @@ import ( "github.com/dubbogo/dubbo-go-proxy/pkg/client" ) +// NewDubboResponse create dubbo response func NewDubboResponse(data interface{}) *client.Response { if r, err := dealResp(data, true); err != nil { return &client.Response{Data: data} diff --git a/pkg/client/request.go b/pkg/client/request.go index c31ca7893..ed2929f19 100644 --- a/pkg/client/request.go +++ b/pkg/client/request.go @@ -1,13 +1,17 @@ package client -import "github.com/dubbogo/dubbo-go-proxy/pkg/model" +import ( + "github.com/dubbogo/dubbo-go-proxy/pkg/model" +) +// Request request for endpoint type Request struct { Body []byte Header map[string]string Api *model.Api } +// NewRequest create a request func NewRequest(b []byte, api *model.Api) *Request { return &Request{ Body: b, diff --git a/pkg/client/response.go b/pkg/client/response.go index 8b663a530..2d86fd75b 100644 --- a/pkg/client/response.go +++ b/pkg/client/response.go @@ -1,11 +1,14 @@ package client +// Response response from endpoint type Response struct { Data interface{} } +// NewResponse create response func NewResponse(data interface{}) *Response { return &Response{Data: data} } +// empty Response var EmptyResponse = &Response{} diff --git a/pkg/config/config_load.go b/pkg/config/config_load.go index 9ad3520f5..639ac68ec 100644 --- a/pkg/config/config_load.go +++ b/pkg/config/config_load.go @@ -8,13 +8,13 @@ import ( ) import ( - "github.com/dubbogo/dubbo-go-proxy/pkg/logger" - "github.com/dubbogo/dubbo-go-proxy/pkg/model" + "github.com/ghodss/yaml" + "github.com/goinggo/mapstructure" ) import ( - "github.com/ghodss/yaml" - "github.com/goinggo/mapstructure" + "github.com/dubbogo/dubbo-go-proxy/pkg/logger" + "github.com/dubbogo/dubbo-go-proxy/pkg/model" ) var ( @@ -23,6 +23,7 @@ var ( configLoadFunc ConfigLoadFunc = DefaultConfigLoad ) +// GetBootstrap get config global, need a better name func GetBootstrap() *model.Bootstrap { return config } @@ -58,6 +59,7 @@ func yamlFormat(path string) bool { return false } +// YAMLConfigLoad config load yaml func YAMLConfigLoad(path string) *model.Bootstrap { log.Println("load config in YAML format from : ", path) content, err := ioutil.ReadFile(path) @@ -153,6 +155,7 @@ func YAMLConfigLoad(path string) *model.Bootstrap { return cfg } +// DefaultConfigLoad if not config, will load this func DefaultConfigLoad(path string) *model.Bootstrap { log.Println("load config from : ", path) content, err := ioutil.ReadFile(path) diff --git a/pkg/config/config_load_test.go b/pkg/config/config_load_test.go index b98a3b882..8009fde3e 100644 --- a/pkg/config/config_load_test.go +++ b/pkg/config/config_load_test.go @@ -2,10 +2,13 @@ package config import ( "encoding/json" - "github.com/dubbogo/dubbo-go-proxy/pkg/model" "testing" ) +import ( + "github.com/dubbogo/dubbo-go-proxy/pkg/model" +) + func TestLoad(t *testing.T) { Load("/Users/tc/Documents/workspace_2020/aproxy/configs/conf.yaml") } diff --git a/pkg/context/base_context.go b/pkg/context/base_context.go index d54061c29..6a6b1eb97 100644 --- a/pkg/context/base_context.go +++ b/pkg/context/base_context.go @@ -1,6 +1,8 @@ package context -import "math" +import ( + "math" +) const abortIndex int8 = math.MaxInt8 / 2 diff --git a/pkg/context/filter.go b/pkg/context/filter.go index c529c5bb7..5463ebfa9 100644 --- a/pkg/context/filter.go +++ b/pkg/context/filter.go @@ -1,5 +1,7 @@ package context +// FilterFunc filter func, filter type FilterFunc func(Context) +// FilterChain filter chain type FilterChain []FilterFunc diff --git a/pkg/context/http/context.go b/pkg/context/http/context.go index f839bf1f4..1c86022b9 100644 --- a/pkg/context/http/context.go +++ b/pkg/context/http/context.go @@ -13,7 +13,7 @@ import ( "github.com/dubbogo/dubbo-go-proxy/pkg/model" ) -// HttpContext +// HttpContext http context type HttpContext struct { *context.BaseContext HttpConnectionManager model.HttpConnectionManager @@ -26,10 +26,7 @@ type HttpContext struct { Writer ResponseWriter } -func (hc *HttpContext) GetWritermem() { - -} - +// Next logic for lookup filter func (hc *HttpContext) Next() { hc.Index++ for hc.Index < int8(len(hc.Filters)) { @@ -38,24 +35,29 @@ func (hc *HttpContext) Next() { } } +// Reset reset http context func (hc *HttpContext) Reset() { hc.Writer = &hc.writermem hc.Filters = nil hc.Index = -1 } +// Status set header status code func (hc *HttpContext) Status(code int) { hc.Writer.WriteHeader(code) } +// StatusCode get header status code func (hc *HttpContext) StatusCode() int { return hc.Writer.Status() } +// Write write body data func (hc *HttpContext) Write(b []byte) (int, error) { return hc.Writer.Write(b) } +// WriteHeaderNow func (hc *HttpContext) WriteHeaderNow() { hc.writermem.WriteHeaderNow() } @@ -66,42 +68,52 @@ func (hc *HttpContext) WriteWithStatus(code int, b []byte) (int, error) { return hc.Writer.Write(b) } +// AddHeader add header func (hc *HttpContext) AddHeader(k, v string) { hc.Writer.Header().Add(k, v) } +// GetHeader get header func (hc *HttpContext) GetHeader(k string) string { return hc.Request.Header.Get(k) } +// GetUrl get http request url func (hc *HttpContext) GetUrl() string { return hc.Request.URL.Path } +// GetMethod get method, POST/GET ... func (hc *HttpContext) GetMethod() string { return hc.Request.Method } +// Api func (hc *HttpContext) Api(api *model.Api) { hc.api = api } +// GetApi get api func (hc *HttpContext) GetApi() *model.Api { return hc.api } +// WriteFail func (hc *HttpContext) WriteFail() { hc.doWriteJSON(nil, http.StatusInternalServerError, nil) } +// WriteErr func (hc *HttpContext) WriteErr(p interface{}) { hc.doWriteJSON(nil, http.StatusInternalServerError, p) } +// WriteSuccess func (hc *HttpContext) WriteSuccess() { hc.doWriteJSON(nil, http.StatusOK, nil) } +// WriteResponse func (hc *HttpContext) WriteResponse(resp client.Response) { hc.doWriteJSON(nil, http.StatusOK, resp.Data) } @@ -145,6 +157,7 @@ func (hc *HttpContext) BuildFilters() { hc.AppendFilterFunc(ff...) } +// ResetWritermen reset writermen func (hc *HttpContext) ResetWritermen(w http.ResponseWriter) { hc.writermem.reset(w) } diff --git a/pkg/context/http/writer.go b/pkg/context/http/writer.go index ecc6ee807..0d4821e42 100644 --- a/pkg/context/http/writer.go +++ b/pkg/context/http/writer.go @@ -2,12 +2,15 @@ package http import ( "bufio" - "github.com/dubbogo/dubbo-go-proxy/pkg/logger" "io" "net" "net/http" ) +import ( + "github.com/dubbogo/dubbo-go-proxy/pkg/logger" +) + const ( noWritten = -1 defaultStatus = http.StatusOK diff --git a/pkg/filter/api_filter.go b/pkg/filter/api_filter.go index a5ff32d85..9a50b4af6 100644 --- a/pkg/filter/api_filter.go +++ b/pkg/filter/api_filter.go @@ -15,6 +15,7 @@ func init() { extension.SetFilterFunc(constant.HttpApiFilter, ApiFilter()) } +// ApiFilter url match api func ApiFilter() context.FilterFunc { return func(c context.Context) { url := c.GetUrl() diff --git a/pkg/filter/dubbo_filter.go b/pkg/filter/dubbo_filter.go index 66e01b6be..48f6d7b76 100644 --- a/pkg/filter/dubbo_filter.go +++ b/pkg/filter/dubbo_filter.go @@ -4,6 +4,14 @@ import ( "io/ioutil" ) +import ( + _ "github.com/apache/dubbo-go/cluster/cluster_impl" + _ "github.com/apache/dubbo-go/cluster/loadbalance" + _ "github.com/apache/dubbo-go/filter/filter_impl" + _ "github.com/apache/dubbo-go/registry/protocol" + _ "github.com/apache/dubbo-go/registry/zookeeper" +) + import ( "github.com/dubbogo/dubbo-go-proxy/pkg/client" "github.com/dubbogo/dubbo-go-proxy/pkg/client/dubbo" @@ -14,14 +22,6 @@ import ( "github.com/dubbogo/dubbo-go-proxy/pkg/logger" ) -import ( - _ "github.com/apache/dubbo-go/cluster/cluster_impl" - _ "github.com/apache/dubbo-go/cluster/loadbalance" - _ "github.com/apache/dubbo-go/filter/filter_impl" - _ "github.com/apache/dubbo-go/registry/protocol" - _ "github.com/apache/dubbo-go/registry/zookeeper" -) - func init() { extension.SetFilterFunc(constant.HttpTransferDubboFilter, HttpDubbo()) } diff --git a/pkg/filter/http_filter.go b/pkg/filter/http_filter.go index 1d4e0eaeb..1e187c876 100644 --- a/pkg/filter/http_filter.go +++ b/pkg/filter/http_filter.go @@ -22,6 +22,7 @@ func Domain() context.FilterFunc { } } +// MatchDomainFilter func MatchDomainFilter(c *http.HttpContext) bool { for _, v := range c.Listener.FilterChains { for _, d := range v.FilterChainMatch.Domains { diff --git a/pkg/filter/logger_filter.go b/pkg/filter/logger_filter.go index 631218a49..4442e1e34 100644 --- a/pkg/filter/logger_filter.go +++ b/pkg/filter/logger_filter.go @@ -15,6 +15,7 @@ func init() { extension.SetFilterFunc(constant.LoggerFilter, Logger()) } +// Logger logger filter, print url and latency func Logger() context.FilterFunc { return func(c context.Context) { start := time.Now() diff --git a/pkg/filter/recovery_filter.go b/pkg/filter/recovery_filter.go index 4ef9fb22b..944a43c84 100644 --- a/pkg/filter/recovery_filter.go +++ b/pkg/filter/recovery_filter.go @@ -11,6 +11,7 @@ func init() { extension.SetFilterFunc(constant.RecoveryFilter, Recover()) } +// Recover func Recover() context.FilterFunc { return func(c context.Context) { defer func() { diff --git a/pkg/logger/logger.go b/pkg/logger/logger.go index 9c52e75ec..ae6b221a4 100644 --- a/pkg/logger/logger.go +++ b/pkg/logger/logger.go @@ -18,6 +18,7 @@ var ( logger Logger ) +// DubbogoProxyLogger type DubbogoProxyLogger struct { mutex sync.Mutex Logger @@ -27,6 +28,7 @@ type DubbogoProxyLogger struct { disable bool } +// Logger type Logger interface { Info(args ...interface{}) Warn(args ...interface{}) @@ -47,6 +49,7 @@ func init() { } } +// InitLog load from config path func InitLog(logConfFile string) error { if logConfFile == "" { InitLogger(nil) diff --git a/pkg/logger/logging.go b/pkg/logger/logging.go index 279a4640b..817b0d7ce 100644 --- a/pkg/logger/logging.go +++ b/pkg/logger/logging.go @@ -1,26 +1,41 @@ package logger +// Info func Info(args ...interface{}) { logger.Info(args...) } + +// Warn func Warn(args ...interface{}) { logger.Warn(args...) } + +// Error func Error(args ...interface{}) { logger.Error(args...) } + +// Debug func Debug(args ...interface{}) { logger.Debug(args...) } + +// Infof func Infof(fmt string, args ...interface{}) { logger.Infof(fmt, args...) } + +// Warnf func Warnf(fmt string, args ...interface{}) { logger.Warnf(fmt, args...) } + +// Errorf func Errorf(fmt string, args ...interface{}) { logger.Errorf(fmt, args...) } + +// Debugf func Debugf(fmt string, args ...interface{}) { logger.Debugf(fmt, args...) } diff --git a/pkg/model/api.go b/pkg/model/api.go index e982966da..060cd89ac 100644 --- a/pkg/model/api.go +++ b/pkg/model/api.go @@ -6,6 +6,7 @@ import ( var ( CacheApi = sync.Map{} + EmptyApi = &Api{} ) // Api is api gateway concept, control request from browser、Mobile APP、third party people @@ -21,12 +22,12 @@ type Api struct { RequestMethod } -var EmptyApi = &Api{} - +// NewApi func NewApi() *Api { return &Api{} } +// FindApi find a api, if not exist, return false func (a *Api) FindApi(name string) (*Api, bool) { if v, ok := CacheApi.Load(name); ok { return v.(*Api), true @@ -35,6 +36,7 @@ func (a *Api) FindApi(name string) (*Api, bool) { return nil, false } +// MatchMethod func (a *Api) MatchMethod(method string) bool { i := RequestMethodValue[method] if a.RequestMethod == RequestMethod(i) { @@ -44,6 +46,7 @@ func (a *Api) MatchMethod(method string) bool { return false } +// IsOk api status equals Up func (a *Api) IsOk(name string) bool { if v, ok := CacheApi.Load(name); ok { return v.(*Api).Status == Up diff --git a/pkg/model/match.go b/pkg/model/match.go index 42f82cc6d..d6ae2c019 100644 --- a/pkg/model/match.go +++ b/pkg/model/match.go @@ -34,6 +34,8 @@ var MatcherTypeValue = map[string]int32{ "Regex": 3, } +// HeaderMatcher header matcher struct +// Name header key, Value header value, Regex header value is regex type HeaderMatcher struct { Name string `yaml:"name" json:"name"` Value string `yaml:"value" json:"value"` diff --git a/pkg/model/router.go b/pkg/model/router.go index 49d21978b..fe268a5f5 100644 --- a/pkg/model/router.go +++ b/pkg/model/router.go @@ -18,7 +18,7 @@ type RouterMatch struct { Headers []HeaderMatcher `yaml:"headers" json:"headers"` } -// RouteAction +// RouteAction match route should do type RouteAction struct { Cluster string `yaml:"cluster" json:"cluster"` // Cluster cluster name ClusterNotFoundResponseCode int `yaml:"cluster_not_found_response_code" json:"cluster_not_found_response_code"` diff --git a/pkg/model/types.go b/pkg/model/types.go deleted file mode 100644 index 8b5379070..000000000 --- a/pkg/model/types.go +++ /dev/null @@ -1 +0,0 @@ -package model diff --git a/pkg/proxy/listener.go b/pkg/proxy/listener.go index 00218d270..c670bd125 100644 --- a/pkg/proxy/listener.go +++ b/pkg/proxy/listener.go @@ -84,16 +84,19 @@ func (l *ListenerService) findHttpManager() model.HttpConnectionManager { return *DefaultHttpConnectionManager() } +// DefaultHttpListener type DefaultHttpListener struct { pool sync.Pool } +// NewDefaultHttpListener create http listener func NewDefaultHttpListener() *DefaultHttpListener { return &DefaultHttpListener{ pool: sync.Pool{}, } } +// ServeHTTP func (s *DefaultHttpListener) ServeHTTP(w http.ResponseWriter, r *http.Request) { hc := s.pool.Get().(*h.HttpContext) hc.Request = r diff --git a/pkg/proxy/proxy_start.go b/pkg/proxy/proxy_start.go index a45ed0823..2ba706348 100644 --- a/pkg/proxy/proxy_start.go +++ b/pkg/proxy/proxy_start.go @@ -17,10 +17,12 @@ import ( _ "github.com/dubbogo/dubbo-go-proxy/pkg/service/api" ) +// Proxy type Proxy struct { startWG sync.WaitGroup } +// Start proxy start func (p *Proxy) Start() { conf := config.GetBootstrap() @@ -96,6 +98,7 @@ func (p *Proxy) beforeStart() { ads.AddApi(*service.NewDiscoveryRequest(j2)) } +// NewProxy create proxy func NewProxy() *Proxy { return &Proxy{ startWG: sync.WaitGroup{}, diff --git a/pkg/service/api/discovery_service.go b/pkg/service/api/discovery_service.go index 4d092a86f..3c9bbbbab 100644 --- a/pkg/service/api/discovery_service.go +++ b/pkg/service/api/discovery_service.go @@ -3,6 +3,9 @@ package api import ( "encoding/json" "errors" +) + +import ( "github.com/goinggo/mapstructure" ) diff --git a/pkg/service/discovery_service.go b/pkg/service/discovery_service.go index e8f682940..30e799a07 100644 --- a/pkg/service/discovery_service.go +++ b/pkg/service/discovery_service.go @@ -41,21 +41,27 @@ type ApiDiscoveryService interface { GetApi(request DiscoveryRequest) (DiscoveryResponse, error) } +// DiscoveryService is come from envoy, it can used for admin + +// ListenerDiscoveryService type ListenerDiscoveryService interface { AddListeners(request DiscoveryRequest) (DiscoveryResponse, error) GetListeners(request DiscoveryRequest) (DiscoveryResponse, error) } +// RouteDiscoveryService type RouteDiscoveryService interface { AddRoutes(r DiscoveryRequest) (DiscoveryResponse, error) GetRoutes(r DiscoveryRequest) (DiscoveryResponse, error) } +// ClusterDiscoveryService type ClusterDiscoveryService interface { AddClusters(r DiscoveryRequest) (DiscoveryResponse, error) GetClusters(r DiscoveryRequest) (DiscoveryResponse, error) } +// EndpointDiscoveryService type EndpointDiscoveryService interface { AddEndpoints(r DiscoveryRequest) (DiscoveryResponse, error) GetEndpoints(r DiscoveryRequest) (DiscoveryResponse, error) From 01be265d3f7c89c2bed511313de0b5b97357ff1b Mon Sep 17 00:00:00 2001 From: tiecheng <18768171164@163.com> Date: Wed, 9 Sep 2020 16:37:33 +0800 Subject: [PATCH 021/227] add template for pr and issue like dubbogo --- .github/ISSUE_TEMPLATE/bug-report.md | 19 +++++++++++++++++++ .github/ISSUE_TEMPLATE/enhancement.md | 11 +++++++++++ .github/PULL_REQUEST_TEMPLATE.md | 24 ++++++++++++++++++++++++ 3 files changed, 54 insertions(+) create mode 100644 .github/ISSUE_TEMPLATE/bug-report.md create mode 100644 .github/ISSUE_TEMPLATE/enhancement.md create mode 100644 .github/PULL_REQUEST_TEMPLATE.md diff --git a/.github/ISSUE_TEMPLATE/bug-report.md b/.github/ISSUE_TEMPLATE/bug-report.md new file mode 100644 index 000000000..3e01441f7 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/bug-report.md @@ -0,0 +1,19 @@ +--- +name: Bug Report +about: Report a bug +labels: kind/bug + +--- + + + + +**What happened**: + +**What you expected to happen**: + +**How to reproduce it (as minimally and precisely as possible)**: + +**Anything else we need to know?**: diff --git a/.github/ISSUE_TEMPLATE/enhancement.md b/.github/ISSUE_TEMPLATE/enhancement.md new file mode 100644 index 000000000..6d1a6d99f --- /dev/null +++ b/.github/ISSUE_TEMPLATE/enhancement.md @@ -0,0 +1,11 @@ +--- +name: Enhancement Request +about: Suggest an enhancement +labels: kind/feature + +--- + + +**What would you like to be added**: + +**Why is this needed**: \ No newline at end of file diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md new file mode 100644 index 000000000..3eb1ec055 --- /dev/null +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -0,0 +1,24 @@ + + +**What this PR does**: + +**Which issue(s) this PR fixes**: + +Fixes # + +**Special notes for your reviewer**: + +**Does this PR introduce a user-facing change?**: + +```release-note + +``` \ No newline at end of file From ad75efca7ec46d254d767f6073c43deccd178786 Mon Sep 17 00:00:00 2001 From: zhangshen023 <1292369127@qq.com> Date: Tue, 15 Sep 2020 23:54:18 +0800 Subject: [PATCH 022/227] file api loader --- cmd/proxy/control.go | 7 +++ go.mod | 1 + go.sum | 6 ++ pkg/api_load/api_load.go | 12 ++++ pkg/api_load/file_api_load.go | 111 +++++++++++++++++++++++++++++++++ pkg/api_load/nacos_api_load.go | 20 ++++++ pkg/model/api.go | 16 ++--- 7 files changed, 165 insertions(+), 8 deletions(-) create mode 100644 pkg/api_load/api_load.go create mode 100644 pkg/api_load/file_api_load.go create mode 100644 pkg/api_load/nacos_api_load.go diff --git a/cmd/proxy/control.go b/cmd/proxy/control.go index 6c2548286..41c85d396 100644 --- a/cmd/proxy/control.go +++ b/cmd/proxy/control.go @@ -40,6 +40,12 @@ var ( EnvVar: "LOG_FILE", Value: "configs/log.yml", }, + cli.StringFlag{ + Name: "api-config, ac", + Usage: "Load api description configuration from `FILE`", + EnvVar: "API_FILE", + Value: "configs/api_config.yml", + }, cli.StringFlag{ Name: "log-level, l", Usage: "dubbogo proxy log level, trace|debug|info|warning|error|critical", @@ -58,6 +64,7 @@ var ( configPath := c.String("config") flagLogLevel := c.String("log-level") logConfPath := c.String("log-config") + apiConfPath := c.String("api-config") bootstrap := config.Load(configPath) if logLevel, ok := flagToLogLevel[flagLogLevel]; ok { diff --git a/go.mod b/go.mod index 2129b0bd4..b2fd3402e 100644 --- a/go.mod +++ b/go.mod @@ -4,6 +4,7 @@ go 1.14 require ( github.com/apache/dubbo-go v1.5.1 + github.com/fsnotify/fsnotify v1.4.9 // indirect github.com/ghodss/yaml v1.0.1-0.20190212211648-25d852aebe32 github.com/goinggo/mapstructure v0.0.0-20140717182941-194205d9b4a9 github.com/pkg/errors v0.9.1 diff --git a/go.sum b/go.sum index 62525845d..9b8e8cfea 100644 --- a/go.sum +++ b/go.sum @@ -52,7 +52,9 @@ github.com/afex/hystrix-go v0.0.0-20180502004556-fa1af6a1f4f5/go.mod h1:SkGFH1ia github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= github.com/aliyun/alibaba-cloud-sdk-go v1.61.18/go.mod h1:v8ESoHo4SyHmuB4b1tJqDHxfTGEciD+yhvOU/5s1Rfk= +github.com/apache/dubbo-getty v1.3.10 h1:ys5mwjPdxG/KwkPjS6EI0RzQtU6p6FCPoKpaFEzpAL0= github.com/apache/dubbo-getty v1.3.10/go.mod h1:x6rraK01BL5C7jUM2fPl5KMkAxLVIx54ZB8/XEOik9Y= +github.com/apache/dubbo-go v1.5.1 h1:hYktTWnMJdzwY0NkvSqJfOERkwFApZ3mH/tQBLVGO34= github.com/apache/dubbo-go v1.5.1/go.mod h1:lxwgtF+27mSFQsSrBLaVbdQpwCp+pBN/mHP4w4/N2Qc= github.com/apache/dubbo-go-hessian2 v1.6.2 h1:i7F5GjVaUatLQz1x9vUmmSIFj49L8J6rVICdF6xw4qw= github.com/apache/dubbo-go-hessian2 v1.6.2/go.mod h1:7rEw9guWABQa6Aqb8HeZcsYPHsOS7XT1qtJvkmI6c5w= @@ -129,6 +131,8 @@ github.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL github.com/fatih/structs v1.1.0/go.mod h1:9NiDSp5zOcgEDl+j00MP/WkGVPOlPRLejGD8Ga6PJ7M= github.com/frankban/quicktest v1.4.1/go.mod h1:36zfPVQyHxymz4cH7wlDmVwDrJuljRB60qkgn7rorfQ= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= +github.com/fsnotify/fsnotify v1.4.9 h1:hsms1Qyu0jgnwNXIxa+/V/PDsU6CfLf6CNO8H7IWoS4= +github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= github.com/ghodss/yaml v0.0.0-20150909031657-73d445a93680/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= github.com/ghodss/yaml v1.0.1-0.20190212211648-25d852aebe32 h1:Mn26/9ZMNWSw9C9ERFA1PUxfmGpolnw2v0bKOREu5ew= @@ -580,11 +584,13 @@ golang.org/x/sys v0.0.0-20190801041406-cbf593c0f2f3/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20190813064441-fde4db37ae7a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190922100055-0a153f010e69/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190924154521-2837fb4f24fe/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191008105621-543471e840be/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200124204421-9fbb57f87de9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae h1:/WDfKMnPU+m5M4xB+6x4kaepxRw6jWvR5iDRdvjHgy8= golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/text v0.0.0-20160726164857-2910a502d2bf/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= diff --git a/pkg/api_load/api_load.go b/pkg/api_load/api_load.go new file mode 100644 index 000000000..21ffde39b --- /dev/null +++ b/pkg/api_load/api_load.go @@ -0,0 +1,12 @@ +package api_load + +var ApiLoadTypeMap map[string]ApiLoad + +type ApiLoad interface { + // 第一次初始化加载 + InitLoad() error + // 后面动态更新加载 + HotLoad() error + // 清除所有加载的api + Clear() error +} diff --git a/pkg/api_load/file_api_load.go b/pkg/api_load/file_api_load.go new file mode 100644 index 000000000..f1246dc02 --- /dev/null +++ b/pkg/api_load/file_api_load.go @@ -0,0 +1,111 @@ +package api_load + +import ( + "encoding/json" + "io/ioutil" +) + +import ( + "github.com/fsnotify/fsnotify" + "github.com/ghodss/yaml" +) + +import ( + "github.com/dubbogo/dubbo-go-proxy/pkg/logger" + "github.com/dubbogo/dubbo-go-proxy/pkg/model" +) + +func init() { + var _ ApiLoad = new(FileApiLoader) +} + +type FileApiLoader struct { + filePath string + //locker sync.Mutex + ApiConfigs []model.Api +} + +func (f *FileApiLoader) InitLoad() (err error) { + //f.locker.Lock() + //defer f.locker.Unlock() + content, err := ioutil.ReadFile(f.filePath) + if err != nil { + logger.Errorf("fileApiLoader read api config error:%v", err) + return + } + jsonBytes, err := yaml.YAMLToJSON(content) + if err != nil { + logger.Errorf("fileApiLoader transfer api config error:%v,is it yaml format?", err) + return + } + + err = json.Unmarshal(jsonBytes, &f.ApiConfigs) + if err != nil { + logger.Errorf("fileApiLoader read api config error:%v", err) + return + } + if len(f.ApiConfigs) < 1 { + logger.Warnf("no api loaded!please make sure api config file is located") + } + //f.ApiConfigs = apiConfigs + return +} + +func (f *FileApiLoader) HotLoad() error { + watcher, err := fsnotify.NewWatcher() + if err != nil { + logger.Error(err) + return err + } + + defer watcher.Close() + + go func() { + for { + select { + case event, ok := <-watcher.Events: + if !ok { + return + } + logger.Debug("event:", event) + switch event.Op { + case fsnotify.Write: + logger.Debug("modified file:", event.Name) + content, err := ioutil.ReadFile(f.filePath) + jsonBytes, err := yaml.YAMLToJSON(content) + if err != nil { + logger.Warnf("fileApiLoader transfer api config error:%v,is it yaml format?", err) + break + } + + err = json.Unmarshal(jsonBytes, &f.ApiConfigs) + if err != nil { + logger.Warnf("fileApiLoader read api config error:%v", err) + break + } + break + case fsnotify.Remove: + logger.Debug("removed file:", event.Name) + f.ApiConfigs = nil + break + } + case err, ok := <-watcher.Errors: + if !ok { + return + } + logger.Error("error:", err) + } + } + }() + + err = watcher.Add(f.filePath) + if err != nil { + logger.Error(err) + } + return err +} + +func (f *FileApiLoader) Clear() error { + f.ApiConfigs = nil + return nil +} diff --git a/pkg/api_load/nacos_api_load.go b/pkg/api_load/nacos_api_load.go new file mode 100644 index 000000000..90cc62e9d --- /dev/null +++ b/pkg/api_load/nacos_api_load.go @@ -0,0 +1,20 @@ +package api_load + +func init() { + var _ ApiLoad = new(NacosApiLoader) +} + +type NacosApiLoader struct { +} + +func (f *NacosApiLoader) InitLoad() (err error) { + panic("") +} + +func (f *NacosApiLoader) HotLoad() error { + panic("") +} + +func (f *NacosApiLoader) Clear() error { + panic("") +} diff --git a/pkg/model/api.go b/pkg/model/api.go index 060cd89ac..4dff94760 100644 --- a/pkg/model/api.go +++ b/pkg/model/api.go @@ -11,14 +11,14 @@ var ( // Api is api gateway concept, control request from browser、Mobile APP、third party people type Api struct { - Name string `json:"name"` - ITypeStr string `json:"itype"` - IType ApiType `json:"-"` - OTypeStr string `json:"otype"` - OType ApiType `json:"-"` - Status Status `json:"status"` - Metadata interface{} `json:"metadata"` - Method string `json:"method"` + Name string `json:"name" yaml:"name"` + ITypeStr string `json:"itype" yaml:"itype"` + IType ApiType `json:"-" yaml:"-"` + OTypeStr string `json:"otype" yaml:"otype"` + OType ApiType `json:"-" yaml:"-"` + Status Status `json:"status" yaml:"status"` + Metadata interface{} `json:"metadata" yaml:"metadata"` + Method string `json:"method" yaml:"method"` RequestMethod } From aeaa91f8fe8af7895f32f3dec76e19871dd384d2 Mon Sep 17 00:00:00 2001 From: zhangshen023 <1292369127@qq.com> Date: Tue, 15 Sep 2020 23:54:18 +0800 Subject: [PATCH 023/227] file api loader --- cmd/proxy/control.go | 7 +++ go.mod | 1 + go.sum | 6 ++ pkg/api_load/api_load.go | 12 ++++ pkg/api_load/file_api_load.go | 111 +++++++++++++++++++++++++++++++++ pkg/api_load/nacos_api_load.go | 20 ++++++ pkg/model/api.go | 16 ++--- 7 files changed, 165 insertions(+), 8 deletions(-) create mode 100644 pkg/api_load/api_load.go create mode 100644 pkg/api_load/file_api_load.go create mode 100644 pkg/api_load/nacos_api_load.go diff --git a/cmd/proxy/control.go b/cmd/proxy/control.go index 6c2548286..41c85d396 100644 --- a/cmd/proxy/control.go +++ b/cmd/proxy/control.go @@ -40,6 +40,12 @@ var ( EnvVar: "LOG_FILE", Value: "configs/log.yml", }, + cli.StringFlag{ + Name: "api-config, ac", + Usage: "Load api description configuration from `FILE`", + EnvVar: "API_FILE", + Value: "configs/api_config.yml", + }, cli.StringFlag{ Name: "log-level, l", Usage: "dubbogo proxy log level, trace|debug|info|warning|error|critical", @@ -58,6 +64,7 @@ var ( configPath := c.String("config") flagLogLevel := c.String("log-level") logConfPath := c.String("log-config") + apiConfPath := c.String("api-config") bootstrap := config.Load(configPath) if logLevel, ok := flagToLogLevel[flagLogLevel]; ok { diff --git a/go.mod b/go.mod index 2129b0bd4..b2fd3402e 100644 --- a/go.mod +++ b/go.mod @@ -4,6 +4,7 @@ go 1.14 require ( github.com/apache/dubbo-go v1.5.1 + github.com/fsnotify/fsnotify v1.4.9 // indirect github.com/ghodss/yaml v1.0.1-0.20190212211648-25d852aebe32 github.com/goinggo/mapstructure v0.0.0-20140717182941-194205d9b4a9 github.com/pkg/errors v0.9.1 diff --git a/go.sum b/go.sum index 62525845d..9b8e8cfea 100644 --- a/go.sum +++ b/go.sum @@ -52,7 +52,9 @@ github.com/afex/hystrix-go v0.0.0-20180502004556-fa1af6a1f4f5/go.mod h1:SkGFH1ia github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= github.com/aliyun/alibaba-cloud-sdk-go v1.61.18/go.mod h1:v8ESoHo4SyHmuB4b1tJqDHxfTGEciD+yhvOU/5s1Rfk= +github.com/apache/dubbo-getty v1.3.10 h1:ys5mwjPdxG/KwkPjS6EI0RzQtU6p6FCPoKpaFEzpAL0= github.com/apache/dubbo-getty v1.3.10/go.mod h1:x6rraK01BL5C7jUM2fPl5KMkAxLVIx54ZB8/XEOik9Y= +github.com/apache/dubbo-go v1.5.1 h1:hYktTWnMJdzwY0NkvSqJfOERkwFApZ3mH/tQBLVGO34= github.com/apache/dubbo-go v1.5.1/go.mod h1:lxwgtF+27mSFQsSrBLaVbdQpwCp+pBN/mHP4w4/N2Qc= github.com/apache/dubbo-go-hessian2 v1.6.2 h1:i7F5GjVaUatLQz1x9vUmmSIFj49L8J6rVICdF6xw4qw= github.com/apache/dubbo-go-hessian2 v1.6.2/go.mod h1:7rEw9guWABQa6Aqb8HeZcsYPHsOS7XT1qtJvkmI6c5w= @@ -129,6 +131,8 @@ github.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL github.com/fatih/structs v1.1.0/go.mod h1:9NiDSp5zOcgEDl+j00MP/WkGVPOlPRLejGD8Ga6PJ7M= github.com/frankban/quicktest v1.4.1/go.mod h1:36zfPVQyHxymz4cH7wlDmVwDrJuljRB60qkgn7rorfQ= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= +github.com/fsnotify/fsnotify v1.4.9 h1:hsms1Qyu0jgnwNXIxa+/V/PDsU6CfLf6CNO8H7IWoS4= +github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= github.com/ghodss/yaml v0.0.0-20150909031657-73d445a93680/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= github.com/ghodss/yaml v1.0.1-0.20190212211648-25d852aebe32 h1:Mn26/9ZMNWSw9C9ERFA1PUxfmGpolnw2v0bKOREu5ew= @@ -580,11 +584,13 @@ golang.org/x/sys v0.0.0-20190801041406-cbf593c0f2f3/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20190813064441-fde4db37ae7a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190922100055-0a153f010e69/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190924154521-2837fb4f24fe/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191008105621-543471e840be/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200124204421-9fbb57f87de9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae h1:/WDfKMnPU+m5M4xB+6x4kaepxRw6jWvR5iDRdvjHgy8= golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/text v0.0.0-20160726164857-2910a502d2bf/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= diff --git a/pkg/api_load/api_load.go b/pkg/api_load/api_load.go new file mode 100644 index 000000000..21ffde39b --- /dev/null +++ b/pkg/api_load/api_load.go @@ -0,0 +1,12 @@ +package api_load + +var ApiLoadTypeMap map[string]ApiLoad + +type ApiLoad interface { + // 第一次初始化加载 + InitLoad() error + // 后面动态更新加载 + HotLoad() error + // 清除所有加载的api + Clear() error +} diff --git a/pkg/api_load/file_api_load.go b/pkg/api_load/file_api_load.go new file mode 100644 index 000000000..f1246dc02 --- /dev/null +++ b/pkg/api_load/file_api_load.go @@ -0,0 +1,111 @@ +package api_load + +import ( + "encoding/json" + "io/ioutil" +) + +import ( + "github.com/fsnotify/fsnotify" + "github.com/ghodss/yaml" +) + +import ( + "github.com/dubbogo/dubbo-go-proxy/pkg/logger" + "github.com/dubbogo/dubbo-go-proxy/pkg/model" +) + +func init() { + var _ ApiLoad = new(FileApiLoader) +} + +type FileApiLoader struct { + filePath string + //locker sync.Mutex + ApiConfigs []model.Api +} + +func (f *FileApiLoader) InitLoad() (err error) { + //f.locker.Lock() + //defer f.locker.Unlock() + content, err := ioutil.ReadFile(f.filePath) + if err != nil { + logger.Errorf("fileApiLoader read api config error:%v", err) + return + } + jsonBytes, err := yaml.YAMLToJSON(content) + if err != nil { + logger.Errorf("fileApiLoader transfer api config error:%v,is it yaml format?", err) + return + } + + err = json.Unmarshal(jsonBytes, &f.ApiConfigs) + if err != nil { + logger.Errorf("fileApiLoader read api config error:%v", err) + return + } + if len(f.ApiConfigs) < 1 { + logger.Warnf("no api loaded!please make sure api config file is located") + } + //f.ApiConfigs = apiConfigs + return +} + +func (f *FileApiLoader) HotLoad() error { + watcher, err := fsnotify.NewWatcher() + if err != nil { + logger.Error(err) + return err + } + + defer watcher.Close() + + go func() { + for { + select { + case event, ok := <-watcher.Events: + if !ok { + return + } + logger.Debug("event:", event) + switch event.Op { + case fsnotify.Write: + logger.Debug("modified file:", event.Name) + content, err := ioutil.ReadFile(f.filePath) + jsonBytes, err := yaml.YAMLToJSON(content) + if err != nil { + logger.Warnf("fileApiLoader transfer api config error:%v,is it yaml format?", err) + break + } + + err = json.Unmarshal(jsonBytes, &f.ApiConfigs) + if err != nil { + logger.Warnf("fileApiLoader read api config error:%v", err) + break + } + break + case fsnotify.Remove: + logger.Debug("removed file:", event.Name) + f.ApiConfigs = nil + break + } + case err, ok := <-watcher.Errors: + if !ok { + return + } + logger.Error("error:", err) + } + } + }() + + err = watcher.Add(f.filePath) + if err != nil { + logger.Error(err) + } + return err +} + +func (f *FileApiLoader) Clear() error { + f.ApiConfigs = nil + return nil +} diff --git a/pkg/api_load/nacos_api_load.go b/pkg/api_load/nacos_api_load.go new file mode 100644 index 000000000..90cc62e9d --- /dev/null +++ b/pkg/api_load/nacos_api_load.go @@ -0,0 +1,20 @@ +package api_load + +func init() { + var _ ApiLoad = new(NacosApiLoader) +} + +type NacosApiLoader struct { +} + +func (f *NacosApiLoader) InitLoad() (err error) { + panic("") +} + +func (f *NacosApiLoader) HotLoad() error { + panic("") +} + +func (f *NacosApiLoader) Clear() error { + panic("") +} diff --git a/pkg/model/api.go b/pkg/model/api.go index 060cd89ac..4dff94760 100644 --- a/pkg/model/api.go +++ b/pkg/model/api.go @@ -11,14 +11,14 @@ var ( // Api is api gateway concept, control request from browser、Mobile APP、third party people type Api struct { - Name string `json:"name"` - ITypeStr string `json:"itype"` - IType ApiType `json:"-"` - OTypeStr string `json:"otype"` - OType ApiType `json:"-"` - Status Status `json:"status"` - Metadata interface{} `json:"metadata"` - Method string `json:"method"` + Name string `json:"name" yaml:"name"` + ITypeStr string `json:"itype" yaml:"itype"` + IType ApiType `json:"-" yaml:"-"` + OTypeStr string `json:"otype" yaml:"otype"` + OType ApiType `json:"-" yaml:"-"` + Status Status `json:"status" yaml:"status"` + Metadata interface{} `json:"metadata" yaml:"metadata"` + Method string `json:"method" yaml:"method"` RequestMethod } From 756d33de7cb4cca4706ed15bebe437176c85fb5f Mon Sep 17 00:00:00 2001 From: zhangshen023 <1292369127@qq.com> Date: Wed, 16 Sep 2020 07:28:21 +0800 Subject: [PATCH 024/227] file api loader --- pkg/api_load/nacos_api_load.go | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/pkg/api_load/nacos_api_load.go b/pkg/api_load/nacos_api_load.go index 90cc62e9d..1106eb06f 100644 --- a/pkg/api_load/nacos_api_load.go +++ b/pkg/api_load/nacos_api_load.go @@ -1,10 +1,14 @@ package api_load +import "github.com/dubbogo/dubbo-go-proxy/pkg/model" + +// TODO func init() { var _ ApiLoad = new(NacosApiLoader) } type NacosApiLoader struct { + ApiConfigs []model.Api } func (f *NacosApiLoader) InitLoad() (err error) { From dce74deb75c3122ba82236458d5b2671b382882c Mon Sep 17 00:00:00 2001 From: zhangshen023 <1292369127@qq.com> Date: Wed, 16 Sep 2020 07:28:21 +0800 Subject: [PATCH 025/227] file api loader --- pkg/api_load/nacos_api_load.go | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/pkg/api_load/nacos_api_load.go b/pkg/api_load/nacos_api_load.go index 90cc62e9d..1106eb06f 100644 --- a/pkg/api_load/nacos_api_load.go +++ b/pkg/api_load/nacos_api_load.go @@ -1,10 +1,14 @@ package api_load +import "github.com/dubbogo/dubbo-go-proxy/pkg/model" + +// TODO func init() { var _ ApiLoad = new(NacosApiLoader) } type NacosApiLoader struct { + ApiConfigs []model.Api } func (f *NacosApiLoader) InitLoad() (err error) { From 1e70971e595181e81156ea48b6f569430a2f9bdb Mon Sep 17 00:00:00 2001 From: zhangshen023 <1292369127@qq.com> Date: Wed, 16 Sep 2020 07:28:21 +0800 Subject: [PATCH 026/227] file api loader --- pkg/api_load/nacos_api_load.go | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/pkg/api_load/nacos_api_load.go b/pkg/api_load/nacos_api_load.go index 90cc62e9d..1106eb06f 100644 --- a/pkg/api_load/nacos_api_load.go +++ b/pkg/api_load/nacos_api_load.go @@ -1,10 +1,14 @@ package api_load +import "github.com/dubbogo/dubbo-go-proxy/pkg/model" + +// TODO func init() { var _ ApiLoad = new(NacosApiLoader) } type NacosApiLoader struct { + ApiConfigs []model.Api } func (f *NacosApiLoader) InitLoad() (err error) { From 9fdf57157358c5686d8499830c606d102b7a683b Mon Sep 17 00:00:00 2001 From: zhangshen023 <1292369127@qq.com> Date: Wed, 16 Sep 2020 07:28:21 +0800 Subject: [PATCH 027/227] file api loader --- pkg/api_load/nacos_api_load.go | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/pkg/api_load/nacos_api_load.go b/pkg/api_load/nacos_api_load.go index 90cc62e9d..1106eb06f 100644 --- a/pkg/api_load/nacos_api_load.go +++ b/pkg/api_load/nacos_api_load.go @@ -1,10 +1,14 @@ package api_load +import "github.com/dubbogo/dubbo-go-proxy/pkg/model" + +// TODO func init() { var _ ApiLoad = new(NacosApiLoader) } type NacosApiLoader struct { + ApiConfigs []model.Api } func (f *NacosApiLoader) InitLoad() (err error) { From 138a3729d00ee1bdbe5120a24d8c9e5ef70ae4ae Mon Sep 17 00:00:00 2001 From: tiecheng <18768171164@163.com> Date: Wed, 16 Sep 2020 22:44:39 +0800 Subject: [PATCH 028/227] add license add github actions --- .github/workflows/github-actions.yml | 118 ++++++++++++++++ LICENSE | 202 +++++++++++++++++++++++++++ before_validate_license.sh | 26 ++++ 3 files changed, 346 insertions(+) create mode 100644 .github/workflows/github-actions.yml create mode 100644 LICENSE create mode 100644 before_validate_license.sh diff --git a/.github/workflows/github-actions.yml b/.github/workflows/github-actions.yml new file mode 100644 index 000000000..8845c5b34 --- /dev/null +++ b/.github/workflows/github-actions.yml @@ -0,0 +1,118 @@ +name: CI + +on: + push: + branches: [master, develop] + pull_request: + branches: "*" + +jobs: + + build: + name: ${{ matrix.os }} - Go ${{ matrix.go_version }} + runs-on: ${{ matrix.os }} + strategy: + # If you want to matrix build , you can append the following list. + matrix: + go_version: + - 1.14 + os: + - ubuntu-latest + + env: + DING_TOKEN: ${{ secrets.DING_TOKEN }} + DING_SIGN: ${{ secrets.DING_SIGN }} + + steps: + + - name: Set up Go 1.x + uses: actions/setup-go@v2 + with: + go-version: ${{ matrix.go_version }} + id: go + + - name: Check out code into the Go module directory + uses: actions/checkout@v2 + + - name: Cache dependencies + uses: actions/cache@v2 + with: + # Cache + path: ~/go/pkg/mod + # Cache key + key: ${{ runner.os }}-go-${{ hashFiles('**/go.sum') }} + # An ordered list of keys to use for restoring the cache if no cache hit occurred for key + restore-keys: | + ${{ runner.os }}-go- + + - name: Get dependencies + run: | + if [ -f Gopkg.toml ]; then + curl https://raw.githubusercontent.com/golang/dep/master/install.sh | sh + dep ensure + else + go get -v -t -d ./... + fi + + - name: Go Fmt + run: go fmt ./... && [[ -z `git status -s` ]] + + - name: License Check + run: | + go fmt ./... && [[ -z `git status -s` ]] + sh before_validate_license.sh + chmod u+x /tmp/tools/license/license-header-checker + /tmp/tools/license/license-header-checker -v -a -r -i vendor /tmp/tools/license/license.txt . go && [[ -z `git status -s` ]] + + - name: Go Test + run: GO111MODULE=on && go mod vendor && go test ./... -bench . -race -v -coverprofile=coverage.txt + +# - name: Test +# run: | +# chmod u+x before_ut.sh && ./before_ut.sh +# go mod vendor && go test ./... -coverprofile=coverage.txt -covermode=atomic +# chmod +x integrate_test.sh && ./integrate_test.sh + + - name: Coverage + run: bash <(curl -s https://codecov.io/bash) + + # Because the contexts of push and PR are different, there are two Notify. + # Notifications are triggered only in the dubbogo/dubbo-go-proxy repository. + - name: DingTalk Message Notify only Push + uses: zcong1993/actions-ding@v3.0.1 + # Whether job is successful or not, always () is always true. + if: | + always() && + github.event_name == 'push' && + github.repository == 'dubbogo/dubbo-go-proxy' + with: + # DingDing bot token + dingToken: ${{ env.DING_TOKEN }} + secret: ${{ env.DING_SIGN }} + # Post Body to send + body: | + { + "msgtype": "markdown", + "markdown": { + "title": "Github Actions", + "text": "## Github Actions \n - name: CI \n - repository: ${{ github.repository }} \n - trigger: ${{ github.actor }} \n - event: ${{ github.event_name }} \n - ref: ${{ github.ref }} \n - status: [${{ job.status }}](https://github.com/${{ github.repository }}/actions/runs/${{ github.run_id }}) \n - environment: ${{ runner.os }} \n - SHA: [${{ github.sha }}](${{ github.event.compare }})" + } + } + + - name: DingTalk Message Notify only PR + uses: zcong1993/actions-ding@v3.0.1 + if: | + always() && + github.event_name == 'pull_request' && + github.repository == 'dubbogo/dubbo-go-proxy' + with: + dingToken: ${{ env.DING_TOKEN }} + secret: ${{ env.DING_SIGN }} + body: | + { + "msgtype": "markdown", + "markdown": { + "title": "Github Actions", + "text": "## Github Actions \n - name: CI \n - repository: ${{ github.repository }} \n - pr_title: ${{ github.event.pull_request.title }} \n - trigger: ${{ github.actor }} \n - event: ${{ github.event_name }} \n - ref: [${{ github.ref }}](${{ github.event.pull_request._links.html.href }}) \n - status: [${{ job.status }}](https://github.com/${{ github.repository }}/actions/runs/${{ github.run_id }}) \n - environment: ${{ runner.os }} \n > SHA: [${{ github.sha }}](${{ github.event.pull_request._links.html.href }})" + } + } diff --git a/LICENSE b/LICENSE new file mode 100644 index 000000000..d64569567 --- /dev/null +++ b/LICENSE @@ -0,0 +1,202 @@ + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/before_validate_license.sh b/before_validate_license.sh new file mode 100644 index 000000000..8fa6e381c --- /dev/null +++ b/before_validate_license.sh @@ -0,0 +1,26 @@ +# +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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. + +remoteLicenseCheckerPath="https://github.com/dubbogo/resources/raw/master/tools/license" +remoteLicenseCheckerName="license-header-checker" +remoteLicenseCheckerURL="${remoteLicenseCheckerPath}/${remoteLicenseCheckerName}" +remoteLicenseName="license.txt" +remoteLicenseURL="${remoteLicenseCheckerPath}/${remoteLicenseName}" + +licensePath="/tmp/tools/license" +mkdir -p ${licensePath} +wget -P "${licensePath}" ${remoteLicenseCheckerURL} +wget -P "${licensePath}" ${remoteLicenseURL} From 79541d4e30e2a9343eeef5f36e6105b95765670e Mon Sep 17 00:00:00 2001 From: tiecheng <18768171164@163.com> Date: Wed, 16 Sep 2020 22:44:39 +0800 Subject: [PATCH 029/227] add license add github actions --- .github/workflows/github-actions.yml | 118 ++++++++++++++++ LICENSE | 202 +++++++++++++++++++++++++++ before_validate_license.sh | 26 ++++ 3 files changed, 346 insertions(+) create mode 100644 .github/workflows/github-actions.yml create mode 100644 LICENSE create mode 100644 before_validate_license.sh diff --git a/.github/workflows/github-actions.yml b/.github/workflows/github-actions.yml new file mode 100644 index 000000000..8845c5b34 --- /dev/null +++ b/.github/workflows/github-actions.yml @@ -0,0 +1,118 @@ +name: CI + +on: + push: + branches: [master, develop] + pull_request: + branches: "*" + +jobs: + + build: + name: ${{ matrix.os }} - Go ${{ matrix.go_version }} + runs-on: ${{ matrix.os }} + strategy: + # If you want to matrix build , you can append the following list. + matrix: + go_version: + - 1.14 + os: + - ubuntu-latest + + env: + DING_TOKEN: ${{ secrets.DING_TOKEN }} + DING_SIGN: ${{ secrets.DING_SIGN }} + + steps: + + - name: Set up Go 1.x + uses: actions/setup-go@v2 + with: + go-version: ${{ matrix.go_version }} + id: go + + - name: Check out code into the Go module directory + uses: actions/checkout@v2 + + - name: Cache dependencies + uses: actions/cache@v2 + with: + # Cache + path: ~/go/pkg/mod + # Cache key + key: ${{ runner.os }}-go-${{ hashFiles('**/go.sum') }} + # An ordered list of keys to use for restoring the cache if no cache hit occurred for key + restore-keys: | + ${{ runner.os }}-go- + + - name: Get dependencies + run: | + if [ -f Gopkg.toml ]; then + curl https://raw.githubusercontent.com/golang/dep/master/install.sh | sh + dep ensure + else + go get -v -t -d ./... + fi + + - name: Go Fmt + run: go fmt ./... && [[ -z `git status -s` ]] + + - name: License Check + run: | + go fmt ./... && [[ -z `git status -s` ]] + sh before_validate_license.sh + chmod u+x /tmp/tools/license/license-header-checker + /tmp/tools/license/license-header-checker -v -a -r -i vendor /tmp/tools/license/license.txt . go && [[ -z `git status -s` ]] + + - name: Go Test + run: GO111MODULE=on && go mod vendor && go test ./... -bench . -race -v -coverprofile=coverage.txt + +# - name: Test +# run: | +# chmod u+x before_ut.sh && ./before_ut.sh +# go mod vendor && go test ./... -coverprofile=coverage.txt -covermode=atomic +# chmod +x integrate_test.sh && ./integrate_test.sh + + - name: Coverage + run: bash <(curl -s https://codecov.io/bash) + + # Because the contexts of push and PR are different, there are two Notify. + # Notifications are triggered only in the dubbogo/dubbo-go-proxy repository. + - name: DingTalk Message Notify only Push + uses: zcong1993/actions-ding@v3.0.1 + # Whether job is successful or not, always () is always true. + if: | + always() && + github.event_name == 'push' && + github.repository == 'dubbogo/dubbo-go-proxy' + with: + # DingDing bot token + dingToken: ${{ env.DING_TOKEN }} + secret: ${{ env.DING_SIGN }} + # Post Body to send + body: | + { + "msgtype": "markdown", + "markdown": { + "title": "Github Actions", + "text": "## Github Actions \n - name: CI \n - repository: ${{ github.repository }} \n - trigger: ${{ github.actor }} \n - event: ${{ github.event_name }} \n - ref: ${{ github.ref }} \n - status: [${{ job.status }}](https://github.com/${{ github.repository }}/actions/runs/${{ github.run_id }}) \n - environment: ${{ runner.os }} \n - SHA: [${{ github.sha }}](${{ github.event.compare }})" + } + } + + - name: DingTalk Message Notify only PR + uses: zcong1993/actions-ding@v3.0.1 + if: | + always() && + github.event_name == 'pull_request' && + github.repository == 'dubbogo/dubbo-go-proxy' + with: + dingToken: ${{ env.DING_TOKEN }} + secret: ${{ env.DING_SIGN }} + body: | + { + "msgtype": "markdown", + "markdown": { + "title": "Github Actions", + "text": "## Github Actions \n - name: CI \n - repository: ${{ github.repository }} \n - pr_title: ${{ github.event.pull_request.title }} \n - trigger: ${{ github.actor }} \n - event: ${{ github.event_name }} \n - ref: [${{ github.ref }}](${{ github.event.pull_request._links.html.href }}) \n - status: [${{ job.status }}](https://github.com/${{ github.repository }}/actions/runs/${{ github.run_id }}) \n - environment: ${{ runner.os }} \n > SHA: [${{ github.sha }}](${{ github.event.pull_request._links.html.href }})" + } + } diff --git a/LICENSE b/LICENSE new file mode 100644 index 000000000..d64569567 --- /dev/null +++ b/LICENSE @@ -0,0 +1,202 @@ + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/before_validate_license.sh b/before_validate_license.sh new file mode 100644 index 000000000..8fa6e381c --- /dev/null +++ b/before_validate_license.sh @@ -0,0 +1,26 @@ +# +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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. + +remoteLicenseCheckerPath="https://github.com/dubbogo/resources/raw/master/tools/license" +remoteLicenseCheckerName="license-header-checker" +remoteLicenseCheckerURL="${remoteLicenseCheckerPath}/${remoteLicenseCheckerName}" +remoteLicenseName="license.txt" +remoteLicenseURL="${remoteLicenseCheckerPath}/${remoteLicenseName}" + +licensePath="/tmp/tools/license" +mkdir -p ${licensePath} +wget -P "${licensePath}" ${remoteLicenseCheckerURL} +wget -P "${licensePath}" ${remoteLicenseURL} From 5d546e71284e29eab4dc5bc7b0e9a4c6a5039efa Mon Sep 17 00:00:00 2001 From: tiecheng <18768171164@163.com> Date: Wed, 16 Sep 2020 22:44:39 +0800 Subject: [PATCH 030/227] add license add github actions --- .github/workflows/github-actions.yml | 118 ++++++++++++++++ LICENSE | 202 +++++++++++++++++++++++++++ before_validate_license.sh | 26 ++++ 3 files changed, 346 insertions(+) create mode 100644 .github/workflows/github-actions.yml create mode 100644 LICENSE create mode 100644 before_validate_license.sh diff --git a/.github/workflows/github-actions.yml b/.github/workflows/github-actions.yml new file mode 100644 index 000000000..8845c5b34 --- /dev/null +++ b/.github/workflows/github-actions.yml @@ -0,0 +1,118 @@ +name: CI + +on: + push: + branches: [master, develop] + pull_request: + branches: "*" + +jobs: + + build: + name: ${{ matrix.os }} - Go ${{ matrix.go_version }} + runs-on: ${{ matrix.os }} + strategy: + # If you want to matrix build , you can append the following list. + matrix: + go_version: + - 1.14 + os: + - ubuntu-latest + + env: + DING_TOKEN: ${{ secrets.DING_TOKEN }} + DING_SIGN: ${{ secrets.DING_SIGN }} + + steps: + + - name: Set up Go 1.x + uses: actions/setup-go@v2 + with: + go-version: ${{ matrix.go_version }} + id: go + + - name: Check out code into the Go module directory + uses: actions/checkout@v2 + + - name: Cache dependencies + uses: actions/cache@v2 + with: + # Cache + path: ~/go/pkg/mod + # Cache key + key: ${{ runner.os }}-go-${{ hashFiles('**/go.sum') }} + # An ordered list of keys to use for restoring the cache if no cache hit occurred for key + restore-keys: | + ${{ runner.os }}-go- + + - name: Get dependencies + run: | + if [ -f Gopkg.toml ]; then + curl https://raw.githubusercontent.com/golang/dep/master/install.sh | sh + dep ensure + else + go get -v -t -d ./... + fi + + - name: Go Fmt + run: go fmt ./... && [[ -z `git status -s` ]] + + - name: License Check + run: | + go fmt ./... && [[ -z `git status -s` ]] + sh before_validate_license.sh + chmod u+x /tmp/tools/license/license-header-checker + /tmp/tools/license/license-header-checker -v -a -r -i vendor /tmp/tools/license/license.txt . go && [[ -z `git status -s` ]] + + - name: Go Test + run: GO111MODULE=on && go mod vendor && go test ./... -bench . -race -v -coverprofile=coverage.txt + +# - name: Test +# run: | +# chmod u+x before_ut.sh && ./before_ut.sh +# go mod vendor && go test ./... -coverprofile=coverage.txt -covermode=atomic +# chmod +x integrate_test.sh && ./integrate_test.sh + + - name: Coverage + run: bash <(curl -s https://codecov.io/bash) + + # Because the contexts of push and PR are different, there are two Notify. + # Notifications are triggered only in the dubbogo/dubbo-go-proxy repository. + - name: DingTalk Message Notify only Push + uses: zcong1993/actions-ding@v3.0.1 + # Whether job is successful or not, always () is always true. + if: | + always() && + github.event_name == 'push' && + github.repository == 'dubbogo/dubbo-go-proxy' + with: + # DingDing bot token + dingToken: ${{ env.DING_TOKEN }} + secret: ${{ env.DING_SIGN }} + # Post Body to send + body: | + { + "msgtype": "markdown", + "markdown": { + "title": "Github Actions", + "text": "## Github Actions \n - name: CI \n - repository: ${{ github.repository }} \n - trigger: ${{ github.actor }} \n - event: ${{ github.event_name }} \n - ref: ${{ github.ref }} \n - status: [${{ job.status }}](https://github.com/${{ github.repository }}/actions/runs/${{ github.run_id }}) \n - environment: ${{ runner.os }} \n - SHA: [${{ github.sha }}](${{ github.event.compare }})" + } + } + + - name: DingTalk Message Notify only PR + uses: zcong1993/actions-ding@v3.0.1 + if: | + always() && + github.event_name == 'pull_request' && + github.repository == 'dubbogo/dubbo-go-proxy' + with: + dingToken: ${{ env.DING_TOKEN }} + secret: ${{ env.DING_SIGN }} + body: | + { + "msgtype": "markdown", + "markdown": { + "title": "Github Actions", + "text": "## Github Actions \n - name: CI \n - repository: ${{ github.repository }} \n - pr_title: ${{ github.event.pull_request.title }} \n - trigger: ${{ github.actor }} \n - event: ${{ github.event_name }} \n - ref: [${{ github.ref }}](${{ github.event.pull_request._links.html.href }}) \n - status: [${{ job.status }}](https://github.com/${{ github.repository }}/actions/runs/${{ github.run_id }}) \n - environment: ${{ runner.os }} \n > SHA: [${{ github.sha }}](${{ github.event.pull_request._links.html.href }})" + } + } diff --git a/LICENSE b/LICENSE new file mode 100644 index 000000000..d64569567 --- /dev/null +++ b/LICENSE @@ -0,0 +1,202 @@ + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/before_validate_license.sh b/before_validate_license.sh new file mode 100644 index 000000000..8fa6e381c --- /dev/null +++ b/before_validate_license.sh @@ -0,0 +1,26 @@ +# +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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. + +remoteLicenseCheckerPath="https://github.com/dubbogo/resources/raw/master/tools/license" +remoteLicenseCheckerName="license-header-checker" +remoteLicenseCheckerURL="${remoteLicenseCheckerPath}/${remoteLicenseCheckerName}" +remoteLicenseName="license.txt" +remoteLicenseURL="${remoteLicenseCheckerPath}/${remoteLicenseName}" + +licensePath="/tmp/tools/license" +mkdir -p ${licensePath} +wget -P "${licensePath}" ${remoteLicenseCheckerURL} +wget -P "${licensePath}" ${remoteLicenseURL} From 6e1e0c1a9e8be9c601e425bb73a0e9433110758b Mon Sep 17 00:00:00 2001 From: zhangshen023 <1292369127@qq.com> Date: Thu, 17 Sep 2020 07:42:07 +0800 Subject: [PATCH 031/227] file api loader --- cmd/proxy/control.go | 12 +++++++----- configs/conf.yaml | 7 +++++++ pkg/api_load/api.go | 25 +++++++++++++++++++++++++ pkg/api_load/api_load.go | 6 +++--- pkg/api_load/file_api_load.go | 21 +++++++++++++++++++-- pkg/api_load/nacos_api_load.go | 19 ++++++++++++++++++- pkg/model/api_config.go | 9 +++++++++ pkg/model/bootstrap.go | 1 + 8 files changed, 89 insertions(+), 11 deletions(-) create mode 100644 pkg/api_load/api.go create mode 100644 pkg/model/api_config.go diff --git a/cmd/proxy/control.go b/cmd/proxy/control.go index 41c85d396..29cea2ef4 100644 --- a/cmd/proxy/control.go +++ b/cmd/proxy/control.go @@ -1,6 +1,7 @@ package main import ( + "github.com/dubbogo/dubbo-go-proxy/pkg/api_load" "runtime" ) @@ -41,10 +42,9 @@ var ( Value: "configs/log.yml", }, cli.StringFlag{ - Name: "api-config, ac", - Usage: "Load api description configuration from `FILE`", - EnvVar: "API_FILE", - Value: "configs/api_config.yml", + Name: "file-api-config, fac", + Usage: "Load file api description configuration from `FILE`", + EnvVar: "FILE_API_CONFIG", }, cli.StringFlag{ Name: "log-level, l", @@ -64,7 +64,7 @@ var ( configPath := c.String("config") flagLogLevel := c.String("log-level") logConfPath := c.String("log-config") - apiConfPath := c.String("api-config") + fileApiConfPath := c.String("file-api-config") bootstrap := config.Load(configPath) if logLevel, ok := flagToLogLevel[flagLogLevel]; ok { @@ -80,6 +80,8 @@ var ( runtime.GOMAXPROCS(limitCpus) } + api_load.AddApiLoad(fileApiConfPath, bootstrap.DynamicResources.ApiConfig) + proxy.Start(bootstrap) return nil }, diff --git a/configs/conf.yaml b/configs/conf.yaml index 8a8ebc993..4cde46460 100644 --- a/configs/conf.yaml +++ b/configs/conf.yaml @@ -47,3 +47,10 @@ static_resources: type: "EDS" lb_policy: "RoundRobin" connect_timeout: "5s" +--- +dynamic_resources: + api_config: + nacos: + address: localhost:8848 + apollo: + address: localhost:8070 \ No newline at end of file diff --git a/pkg/api_load/api.go b/pkg/api_load/api.go new file mode 100644 index 000000000..d62ce12f0 --- /dev/null +++ b/pkg/api_load/api.go @@ -0,0 +1,25 @@ +package api_load + +import "github.com/dubbogo/dubbo-go-proxy/pkg/model" + +var ApiLoadTypeMap = make(map[ApiLoadType]ApiLoad, 8) + +type ApiLoadType string + +const ( + File ApiLoadType = "file" + Nacos ApiLoadType = "nacos" +) + +func AddApiLoad(fileApiConfPath string, config model.ApiConfig) { + if len(fileApiConfPath) > 0 { + ApiLoadTypeMap[File] = NewFileApiLoader(WithFilePath(fileApiConfPath)) + } + if config.Nacos != nil { + ApiLoadTypeMap[Nacos] = NewNacosApiLoader(WithNacosAddress(config.Nacos.Address)) + } +} + +func MergeApi() { + +} diff --git a/pkg/api_load/api_load.go b/pkg/api_load/api_load.go index 21ffde39b..4edb4c758 100644 --- a/pkg/api_load/api_load.go +++ b/pkg/api_load/api_load.go @@ -1,12 +1,12 @@ package api_load -var ApiLoadTypeMap map[string]ApiLoad +import "github.com/dubbogo/dubbo-go-proxy/pkg/service" type ApiLoad interface { // 第一次初始化加载 - InitLoad() error + InitLoad(service.ApiDiscoveryService) error // 后面动态更新加载 - HotLoad() error + HotLoad(service.ApiDiscoveryService) error // 清除所有加载的api Clear() error } diff --git a/pkg/api_load/file_api_load.go b/pkg/api_load/file_api_load.go index f1246dc02..feef1cbbd 100644 --- a/pkg/api_load/file_api_load.go +++ b/pkg/api_load/file_api_load.go @@ -2,6 +2,7 @@ package api_load import ( "encoding/json" + "github.com/dubbogo/dubbo-go-proxy/pkg/service" "io/ioutil" ) @@ -25,7 +26,23 @@ type FileApiLoader struct { ApiConfigs []model.Api } -func (f *FileApiLoader) InitLoad() (err error) { +type FileApiLoaderOption func(*FileApiLoader) + +func WithFilePath(filePath string) FileApiLoaderOption { + return func(opt *FileApiLoader) { + opt.filePath = filePath + } +} + +func NewFileApiLoader(opts ...FileApiLoaderOption) *FileApiLoader { + fileApiLoader := &FileApiLoader{} + for _, opt := range opts { + opt(fileApiLoader) + } + return fileApiLoader +} + +func (f *FileApiLoader) InitLoad(ads service.ApiDiscoveryService) (err error) { //f.locker.Lock() //defer f.locker.Unlock() content, err := ioutil.ReadFile(f.filePath) @@ -51,7 +68,7 @@ func (f *FileApiLoader) InitLoad() (err error) { return } -func (f *FileApiLoader) HotLoad() error { +func (f *FileApiLoader) HotLoad(ads service.ApiDiscoveryService) error { watcher, err := fsnotify.NewWatcher() if err != nil { logger.Error(err) diff --git a/pkg/api_load/nacos_api_load.go b/pkg/api_load/nacos_api_load.go index 1106eb06f..679b364be 100644 --- a/pkg/api_load/nacos_api_load.go +++ b/pkg/api_load/nacos_api_load.go @@ -8,7 +8,24 @@ func init() { } type NacosApiLoader struct { - ApiConfigs []model.Api + NacosAddress string + ApiConfigs []model.Api +} + +type NacosApiLoaderOption func(*NacosApiLoader) + +func WithNacosAddress(nacosAddress string) NacosApiLoaderOption { + return func(opt *NacosApiLoader) { + opt.NacosAddress = nacosAddress + } +} + +func NewNacosApiLoader(opts ...NacosApiLoaderOption) *NacosApiLoader { + var NacosApiLoader = &NacosApiLoader{} + for _, opt := range opts { + opt(NacosApiLoader) + } + return NacosApiLoader } func (f *NacosApiLoader) InitLoad() (err error) { diff --git a/pkg/model/api_config.go b/pkg/model/api_config.go new file mode 100644 index 000000000..b656a4eea --- /dev/null +++ b/pkg/model/api_config.go @@ -0,0 +1,9 @@ +package model + +type ApiConfig struct { + Nacos *Nacos `yaml:"nacos" json:"nacos"` +} + +type Nacos struct { + Address string `yaml:"address" json:"address"` +} diff --git a/pkg/model/bootstrap.go b/pkg/model/bootstrap.go index a4f3124a7..bac4ca250 100644 --- a/pkg/model/bootstrap.go +++ b/pkg/model/bootstrap.go @@ -33,4 +33,5 @@ type StaticResources struct { // DynamicResources TODO type DynamicResources struct { + ApiConfig ApiConfig `yaml:"api_config" json:"apiConfig"` } From 18f8de29a4f307f1f99cc99fb82603a6c3dbb255 Mon Sep 17 00:00:00 2001 From: zhangshen023 <1292369127@qq.com> Date: Thu, 17 Sep 2020 07:42:07 +0800 Subject: [PATCH 032/227] file api loader --- cmd/proxy/control.go | 12 +++++++----- configs/conf.yaml | 7 +++++++ pkg/api_load/api.go | 25 +++++++++++++++++++++++++ pkg/api_load/api_load.go | 6 +++--- pkg/api_load/file_api_load.go | 21 +++++++++++++++++++-- pkg/api_load/nacos_api_load.go | 19 ++++++++++++++++++- pkg/model/api_config.go | 9 +++++++++ pkg/model/bootstrap.go | 1 + 8 files changed, 89 insertions(+), 11 deletions(-) create mode 100644 pkg/api_load/api.go create mode 100644 pkg/model/api_config.go diff --git a/cmd/proxy/control.go b/cmd/proxy/control.go index 41c85d396..29cea2ef4 100644 --- a/cmd/proxy/control.go +++ b/cmd/proxy/control.go @@ -1,6 +1,7 @@ package main import ( + "github.com/dubbogo/dubbo-go-proxy/pkg/api_load" "runtime" ) @@ -41,10 +42,9 @@ var ( Value: "configs/log.yml", }, cli.StringFlag{ - Name: "api-config, ac", - Usage: "Load api description configuration from `FILE`", - EnvVar: "API_FILE", - Value: "configs/api_config.yml", + Name: "file-api-config, fac", + Usage: "Load file api description configuration from `FILE`", + EnvVar: "FILE_API_CONFIG", }, cli.StringFlag{ Name: "log-level, l", @@ -64,7 +64,7 @@ var ( configPath := c.String("config") flagLogLevel := c.String("log-level") logConfPath := c.String("log-config") - apiConfPath := c.String("api-config") + fileApiConfPath := c.String("file-api-config") bootstrap := config.Load(configPath) if logLevel, ok := flagToLogLevel[flagLogLevel]; ok { @@ -80,6 +80,8 @@ var ( runtime.GOMAXPROCS(limitCpus) } + api_load.AddApiLoad(fileApiConfPath, bootstrap.DynamicResources.ApiConfig) + proxy.Start(bootstrap) return nil }, diff --git a/configs/conf.yaml b/configs/conf.yaml index 8a8ebc993..4cde46460 100644 --- a/configs/conf.yaml +++ b/configs/conf.yaml @@ -47,3 +47,10 @@ static_resources: type: "EDS" lb_policy: "RoundRobin" connect_timeout: "5s" +--- +dynamic_resources: + api_config: + nacos: + address: localhost:8848 + apollo: + address: localhost:8070 \ No newline at end of file diff --git a/pkg/api_load/api.go b/pkg/api_load/api.go new file mode 100644 index 000000000..d62ce12f0 --- /dev/null +++ b/pkg/api_load/api.go @@ -0,0 +1,25 @@ +package api_load + +import "github.com/dubbogo/dubbo-go-proxy/pkg/model" + +var ApiLoadTypeMap = make(map[ApiLoadType]ApiLoad, 8) + +type ApiLoadType string + +const ( + File ApiLoadType = "file" + Nacos ApiLoadType = "nacos" +) + +func AddApiLoad(fileApiConfPath string, config model.ApiConfig) { + if len(fileApiConfPath) > 0 { + ApiLoadTypeMap[File] = NewFileApiLoader(WithFilePath(fileApiConfPath)) + } + if config.Nacos != nil { + ApiLoadTypeMap[Nacos] = NewNacosApiLoader(WithNacosAddress(config.Nacos.Address)) + } +} + +func MergeApi() { + +} diff --git a/pkg/api_load/api_load.go b/pkg/api_load/api_load.go index 21ffde39b..4edb4c758 100644 --- a/pkg/api_load/api_load.go +++ b/pkg/api_load/api_load.go @@ -1,12 +1,12 @@ package api_load -var ApiLoadTypeMap map[string]ApiLoad +import "github.com/dubbogo/dubbo-go-proxy/pkg/service" type ApiLoad interface { // 第一次初始化加载 - InitLoad() error + InitLoad(service.ApiDiscoveryService) error // 后面动态更新加载 - HotLoad() error + HotLoad(service.ApiDiscoveryService) error // 清除所有加载的api Clear() error } diff --git a/pkg/api_load/file_api_load.go b/pkg/api_load/file_api_load.go index f1246dc02..feef1cbbd 100644 --- a/pkg/api_load/file_api_load.go +++ b/pkg/api_load/file_api_load.go @@ -2,6 +2,7 @@ package api_load import ( "encoding/json" + "github.com/dubbogo/dubbo-go-proxy/pkg/service" "io/ioutil" ) @@ -25,7 +26,23 @@ type FileApiLoader struct { ApiConfigs []model.Api } -func (f *FileApiLoader) InitLoad() (err error) { +type FileApiLoaderOption func(*FileApiLoader) + +func WithFilePath(filePath string) FileApiLoaderOption { + return func(opt *FileApiLoader) { + opt.filePath = filePath + } +} + +func NewFileApiLoader(opts ...FileApiLoaderOption) *FileApiLoader { + fileApiLoader := &FileApiLoader{} + for _, opt := range opts { + opt(fileApiLoader) + } + return fileApiLoader +} + +func (f *FileApiLoader) InitLoad(ads service.ApiDiscoveryService) (err error) { //f.locker.Lock() //defer f.locker.Unlock() content, err := ioutil.ReadFile(f.filePath) @@ -51,7 +68,7 @@ func (f *FileApiLoader) InitLoad() (err error) { return } -func (f *FileApiLoader) HotLoad() error { +func (f *FileApiLoader) HotLoad(ads service.ApiDiscoveryService) error { watcher, err := fsnotify.NewWatcher() if err != nil { logger.Error(err) diff --git a/pkg/api_load/nacos_api_load.go b/pkg/api_load/nacos_api_load.go index 1106eb06f..679b364be 100644 --- a/pkg/api_load/nacos_api_load.go +++ b/pkg/api_load/nacos_api_load.go @@ -8,7 +8,24 @@ func init() { } type NacosApiLoader struct { - ApiConfigs []model.Api + NacosAddress string + ApiConfigs []model.Api +} + +type NacosApiLoaderOption func(*NacosApiLoader) + +func WithNacosAddress(nacosAddress string) NacosApiLoaderOption { + return func(opt *NacosApiLoader) { + opt.NacosAddress = nacosAddress + } +} + +func NewNacosApiLoader(opts ...NacosApiLoaderOption) *NacosApiLoader { + var NacosApiLoader = &NacosApiLoader{} + for _, opt := range opts { + opt(NacosApiLoader) + } + return NacosApiLoader } func (f *NacosApiLoader) InitLoad() (err error) { diff --git a/pkg/model/api_config.go b/pkg/model/api_config.go new file mode 100644 index 000000000..b656a4eea --- /dev/null +++ b/pkg/model/api_config.go @@ -0,0 +1,9 @@ +package model + +type ApiConfig struct { + Nacos *Nacos `yaml:"nacos" json:"nacos"` +} + +type Nacos struct { + Address string `yaml:"address" json:"address"` +} diff --git a/pkg/model/bootstrap.go b/pkg/model/bootstrap.go index a4f3124a7..bac4ca250 100644 --- a/pkg/model/bootstrap.go +++ b/pkg/model/bootstrap.go @@ -33,4 +33,5 @@ type StaticResources struct { // DynamicResources TODO type DynamicResources struct { + ApiConfig ApiConfig `yaml:"api_config" json:"apiConfig"` } From 043954ca0f6c89c11178e8e5d0a88cb3c3da3348 Mon Sep 17 00:00:00 2001 From: zhangshen023 <1292369127@qq.com> Date: Thu, 17 Sep 2020 07:42:07 +0800 Subject: [PATCH 033/227] file api loader --- cmd/proxy/control.go | 12 +++++++----- configs/conf.yaml | 7 +++++++ pkg/api_load/api.go | 25 +++++++++++++++++++++++++ pkg/api_load/api_load.go | 6 +++--- pkg/api_load/file_api_load.go | 21 +++++++++++++++++++-- pkg/api_load/nacos_api_load.go | 19 ++++++++++++++++++- pkg/model/api_config.go | 9 +++++++++ pkg/model/bootstrap.go | 1 + 8 files changed, 89 insertions(+), 11 deletions(-) create mode 100644 pkg/api_load/api.go create mode 100644 pkg/model/api_config.go diff --git a/cmd/proxy/control.go b/cmd/proxy/control.go index 41c85d396..29cea2ef4 100644 --- a/cmd/proxy/control.go +++ b/cmd/proxy/control.go @@ -1,6 +1,7 @@ package main import ( + "github.com/dubbogo/dubbo-go-proxy/pkg/api_load" "runtime" ) @@ -41,10 +42,9 @@ var ( Value: "configs/log.yml", }, cli.StringFlag{ - Name: "api-config, ac", - Usage: "Load api description configuration from `FILE`", - EnvVar: "API_FILE", - Value: "configs/api_config.yml", + Name: "file-api-config, fac", + Usage: "Load file api description configuration from `FILE`", + EnvVar: "FILE_API_CONFIG", }, cli.StringFlag{ Name: "log-level, l", @@ -64,7 +64,7 @@ var ( configPath := c.String("config") flagLogLevel := c.String("log-level") logConfPath := c.String("log-config") - apiConfPath := c.String("api-config") + fileApiConfPath := c.String("file-api-config") bootstrap := config.Load(configPath) if logLevel, ok := flagToLogLevel[flagLogLevel]; ok { @@ -80,6 +80,8 @@ var ( runtime.GOMAXPROCS(limitCpus) } + api_load.AddApiLoad(fileApiConfPath, bootstrap.DynamicResources.ApiConfig) + proxy.Start(bootstrap) return nil }, diff --git a/configs/conf.yaml b/configs/conf.yaml index 8a8ebc993..4cde46460 100644 --- a/configs/conf.yaml +++ b/configs/conf.yaml @@ -47,3 +47,10 @@ static_resources: type: "EDS" lb_policy: "RoundRobin" connect_timeout: "5s" +--- +dynamic_resources: + api_config: + nacos: + address: localhost:8848 + apollo: + address: localhost:8070 \ No newline at end of file diff --git a/pkg/api_load/api.go b/pkg/api_load/api.go new file mode 100644 index 000000000..d62ce12f0 --- /dev/null +++ b/pkg/api_load/api.go @@ -0,0 +1,25 @@ +package api_load + +import "github.com/dubbogo/dubbo-go-proxy/pkg/model" + +var ApiLoadTypeMap = make(map[ApiLoadType]ApiLoad, 8) + +type ApiLoadType string + +const ( + File ApiLoadType = "file" + Nacos ApiLoadType = "nacos" +) + +func AddApiLoad(fileApiConfPath string, config model.ApiConfig) { + if len(fileApiConfPath) > 0 { + ApiLoadTypeMap[File] = NewFileApiLoader(WithFilePath(fileApiConfPath)) + } + if config.Nacos != nil { + ApiLoadTypeMap[Nacos] = NewNacosApiLoader(WithNacosAddress(config.Nacos.Address)) + } +} + +func MergeApi() { + +} diff --git a/pkg/api_load/api_load.go b/pkg/api_load/api_load.go index 21ffde39b..4edb4c758 100644 --- a/pkg/api_load/api_load.go +++ b/pkg/api_load/api_load.go @@ -1,12 +1,12 @@ package api_load -var ApiLoadTypeMap map[string]ApiLoad +import "github.com/dubbogo/dubbo-go-proxy/pkg/service" type ApiLoad interface { // 第一次初始化加载 - InitLoad() error + InitLoad(service.ApiDiscoveryService) error // 后面动态更新加载 - HotLoad() error + HotLoad(service.ApiDiscoveryService) error // 清除所有加载的api Clear() error } diff --git a/pkg/api_load/file_api_load.go b/pkg/api_load/file_api_load.go index f1246dc02..feef1cbbd 100644 --- a/pkg/api_load/file_api_load.go +++ b/pkg/api_load/file_api_load.go @@ -2,6 +2,7 @@ package api_load import ( "encoding/json" + "github.com/dubbogo/dubbo-go-proxy/pkg/service" "io/ioutil" ) @@ -25,7 +26,23 @@ type FileApiLoader struct { ApiConfigs []model.Api } -func (f *FileApiLoader) InitLoad() (err error) { +type FileApiLoaderOption func(*FileApiLoader) + +func WithFilePath(filePath string) FileApiLoaderOption { + return func(opt *FileApiLoader) { + opt.filePath = filePath + } +} + +func NewFileApiLoader(opts ...FileApiLoaderOption) *FileApiLoader { + fileApiLoader := &FileApiLoader{} + for _, opt := range opts { + opt(fileApiLoader) + } + return fileApiLoader +} + +func (f *FileApiLoader) InitLoad(ads service.ApiDiscoveryService) (err error) { //f.locker.Lock() //defer f.locker.Unlock() content, err := ioutil.ReadFile(f.filePath) @@ -51,7 +68,7 @@ func (f *FileApiLoader) InitLoad() (err error) { return } -func (f *FileApiLoader) HotLoad() error { +func (f *FileApiLoader) HotLoad(ads service.ApiDiscoveryService) error { watcher, err := fsnotify.NewWatcher() if err != nil { logger.Error(err) diff --git a/pkg/api_load/nacos_api_load.go b/pkg/api_load/nacos_api_load.go index 1106eb06f..679b364be 100644 --- a/pkg/api_load/nacos_api_load.go +++ b/pkg/api_load/nacos_api_load.go @@ -8,7 +8,24 @@ func init() { } type NacosApiLoader struct { - ApiConfigs []model.Api + NacosAddress string + ApiConfigs []model.Api +} + +type NacosApiLoaderOption func(*NacosApiLoader) + +func WithNacosAddress(nacosAddress string) NacosApiLoaderOption { + return func(opt *NacosApiLoader) { + opt.NacosAddress = nacosAddress + } +} + +func NewNacosApiLoader(opts ...NacosApiLoaderOption) *NacosApiLoader { + var NacosApiLoader = &NacosApiLoader{} + for _, opt := range opts { + opt(NacosApiLoader) + } + return NacosApiLoader } func (f *NacosApiLoader) InitLoad() (err error) { diff --git a/pkg/model/api_config.go b/pkg/model/api_config.go new file mode 100644 index 000000000..b656a4eea --- /dev/null +++ b/pkg/model/api_config.go @@ -0,0 +1,9 @@ +package model + +type ApiConfig struct { + Nacos *Nacos `yaml:"nacos" json:"nacos"` +} + +type Nacos struct { + Address string `yaml:"address" json:"address"` +} diff --git a/pkg/model/bootstrap.go b/pkg/model/bootstrap.go index a4f3124a7..bac4ca250 100644 --- a/pkg/model/bootstrap.go +++ b/pkg/model/bootstrap.go @@ -33,4 +33,5 @@ type StaticResources struct { // DynamicResources TODO type DynamicResources struct { + ApiConfig ApiConfig `yaml:"api_config" json:"apiConfig"` } From 6462ff67446d35bd53445516b405d498726da7bf Mon Sep 17 00:00:00 2001 From: zhangshen023 <1292369127@qq.com> Date: Thu, 17 Sep 2020 07:42:07 +0800 Subject: [PATCH 034/227] file api loader --- cmd/proxy/control.go | 12 +++++++----- configs/conf.yaml | 7 +++++++ pkg/api_load/api.go | 25 +++++++++++++++++++++++++ pkg/api_load/api_load.go | 6 +++--- pkg/api_load/file_api_load.go | 21 +++++++++++++++++++-- pkg/api_load/nacos_api_load.go | 19 ++++++++++++++++++- pkg/model/api_config.go | 9 +++++++++ pkg/model/bootstrap.go | 1 + 8 files changed, 89 insertions(+), 11 deletions(-) create mode 100644 pkg/api_load/api.go create mode 100644 pkg/model/api_config.go diff --git a/cmd/proxy/control.go b/cmd/proxy/control.go index 41c85d396..29cea2ef4 100644 --- a/cmd/proxy/control.go +++ b/cmd/proxy/control.go @@ -1,6 +1,7 @@ package main import ( + "github.com/dubbogo/dubbo-go-proxy/pkg/api_load" "runtime" ) @@ -41,10 +42,9 @@ var ( Value: "configs/log.yml", }, cli.StringFlag{ - Name: "api-config, ac", - Usage: "Load api description configuration from `FILE`", - EnvVar: "API_FILE", - Value: "configs/api_config.yml", + Name: "file-api-config, fac", + Usage: "Load file api description configuration from `FILE`", + EnvVar: "FILE_API_CONFIG", }, cli.StringFlag{ Name: "log-level, l", @@ -64,7 +64,7 @@ var ( configPath := c.String("config") flagLogLevel := c.String("log-level") logConfPath := c.String("log-config") - apiConfPath := c.String("api-config") + fileApiConfPath := c.String("file-api-config") bootstrap := config.Load(configPath) if logLevel, ok := flagToLogLevel[flagLogLevel]; ok { @@ -80,6 +80,8 @@ var ( runtime.GOMAXPROCS(limitCpus) } + api_load.AddApiLoad(fileApiConfPath, bootstrap.DynamicResources.ApiConfig) + proxy.Start(bootstrap) return nil }, diff --git a/configs/conf.yaml b/configs/conf.yaml index 8a8ebc993..4cde46460 100644 --- a/configs/conf.yaml +++ b/configs/conf.yaml @@ -47,3 +47,10 @@ static_resources: type: "EDS" lb_policy: "RoundRobin" connect_timeout: "5s" +--- +dynamic_resources: + api_config: + nacos: + address: localhost:8848 + apollo: + address: localhost:8070 \ No newline at end of file diff --git a/pkg/api_load/api.go b/pkg/api_load/api.go new file mode 100644 index 000000000..d62ce12f0 --- /dev/null +++ b/pkg/api_load/api.go @@ -0,0 +1,25 @@ +package api_load + +import "github.com/dubbogo/dubbo-go-proxy/pkg/model" + +var ApiLoadTypeMap = make(map[ApiLoadType]ApiLoad, 8) + +type ApiLoadType string + +const ( + File ApiLoadType = "file" + Nacos ApiLoadType = "nacos" +) + +func AddApiLoad(fileApiConfPath string, config model.ApiConfig) { + if len(fileApiConfPath) > 0 { + ApiLoadTypeMap[File] = NewFileApiLoader(WithFilePath(fileApiConfPath)) + } + if config.Nacos != nil { + ApiLoadTypeMap[Nacos] = NewNacosApiLoader(WithNacosAddress(config.Nacos.Address)) + } +} + +func MergeApi() { + +} diff --git a/pkg/api_load/api_load.go b/pkg/api_load/api_load.go index 21ffde39b..4edb4c758 100644 --- a/pkg/api_load/api_load.go +++ b/pkg/api_load/api_load.go @@ -1,12 +1,12 @@ package api_load -var ApiLoadTypeMap map[string]ApiLoad +import "github.com/dubbogo/dubbo-go-proxy/pkg/service" type ApiLoad interface { // 第一次初始化加载 - InitLoad() error + InitLoad(service.ApiDiscoveryService) error // 后面动态更新加载 - HotLoad() error + HotLoad(service.ApiDiscoveryService) error // 清除所有加载的api Clear() error } diff --git a/pkg/api_load/file_api_load.go b/pkg/api_load/file_api_load.go index f1246dc02..feef1cbbd 100644 --- a/pkg/api_load/file_api_load.go +++ b/pkg/api_load/file_api_load.go @@ -2,6 +2,7 @@ package api_load import ( "encoding/json" + "github.com/dubbogo/dubbo-go-proxy/pkg/service" "io/ioutil" ) @@ -25,7 +26,23 @@ type FileApiLoader struct { ApiConfigs []model.Api } -func (f *FileApiLoader) InitLoad() (err error) { +type FileApiLoaderOption func(*FileApiLoader) + +func WithFilePath(filePath string) FileApiLoaderOption { + return func(opt *FileApiLoader) { + opt.filePath = filePath + } +} + +func NewFileApiLoader(opts ...FileApiLoaderOption) *FileApiLoader { + fileApiLoader := &FileApiLoader{} + for _, opt := range opts { + opt(fileApiLoader) + } + return fileApiLoader +} + +func (f *FileApiLoader) InitLoad(ads service.ApiDiscoveryService) (err error) { //f.locker.Lock() //defer f.locker.Unlock() content, err := ioutil.ReadFile(f.filePath) @@ -51,7 +68,7 @@ func (f *FileApiLoader) InitLoad() (err error) { return } -func (f *FileApiLoader) HotLoad() error { +func (f *FileApiLoader) HotLoad(ads service.ApiDiscoveryService) error { watcher, err := fsnotify.NewWatcher() if err != nil { logger.Error(err) diff --git a/pkg/api_load/nacos_api_load.go b/pkg/api_load/nacos_api_load.go index 1106eb06f..679b364be 100644 --- a/pkg/api_load/nacos_api_load.go +++ b/pkg/api_load/nacos_api_load.go @@ -8,7 +8,24 @@ func init() { } type NacosApiLoader struct { - ApiConfigs []model.Api + NacosAddress string + ApiConfigs []model.Api +} + +type NacosApiLoaderOption func(*NacosApiLoader) + +func WithNacosAddress(nacosAddress string) NacosApiLoaderOption { + return func(opt *NacosApiLoader) { + opt.NacosAddress = nacosAddress + } +} + +func NewNacosApiLoader(opts ...NacosApiLoaderOption) *NacosApiLoader { + var NacosApiLoader = &NacosApiLoader{} + for _, opt := range opts { + opt(NacosApiLoader) + } + return NacosApiLoader } func (f *NacosApiLoader) InitLoad() (err error) { diff --git a/pkg/model/api_config.go b/pkg/model/api_config.go new file mode 100644 index 000000000..b656a4eea --- /dev/null +++ b/pkg/model/api_config.go @@ -0,0 +1,9 @@ +package model + +type ApiConfig struct { + Nacos *Nacos `yaml:"nacos" json:"nacos"` +} + +type Nacos struct { + Address string `yaml:"address" json:"address"` +} diff --git a/pkg/model/bootstrap.go b/pkg/model/bootstrap.go index a4f3124a7..bac4ca250 100644 --- a/pkg/model/bootstrap.go +++ b/pkg/model/bootstrap.go @@ -33,4 +33,5 @@ type StaticResources struct { // DynamicResources TODO type DynamicResources struct { + ApiConfig ApiConfig `yaml:"api_config" json:"apiConfig"` } From f94f0c6deb48f4bec0755813cff574bb0e8fd1ef Mon Sep 17 00:00:00 2001 From: tiecheng <18768171164@163.com> Date: Thu, 17 Sep 2020 10:31:21 +0800 Subject: [PATCH 035/227] fix test load --- pkg/config/conf_test.yaml | 49 ++++++++++++++++++++++++++++++++++ pkg/config/config_load_test.go | 9 ++++++- 2 files changed, 57 insertions(+), 1 deletion(-) create mode 100644 pkg/config/conf_test.yaml diff --git a/pkg/config/conf_test.yaml b/pkg/config/conf_test.yaml new file mode 100644 index 000000000..8a8ebc993 --- /dev/null +++ b/pkg/config/conf_test.yaml @@ -0,0 +1,49 @@ +--- +static_resources: + listeners: + - name: "net/http" + address: + socket_address: + protocol_type: "HTTP" + address: "0.0.0.0" + port: 8888 + filter_chains: + - filter_chain_match: + domains: + - api.dubbo.com + - api.proxy.com + filters: + - name: dgp.filters.http_connect_manager + config: + route_config: + routes: + - match: + prefix: "/api/v1" + headers: + - name: "X-DGP-WAY" + value: "dubbo" + route: + cluster: "test_dubbo" + cluster_not_found_response_code: 505 + cors: + allow_origin: + - "*" + enabled: true + http_filters: + - name: dgp.filters.http.api + config: + - name: dgp.filters.http.router + config: + - name: dgp.filters.http_transfer_dubbo + config: + server_name: "test_http_dubbo" + generate_request_id: false + config: + idle_timeout: 5s + read_timeout: 5s + write_timeout: 5s + clusters: + - name: "test_dubbo" + type: "EDS" + lb_policy: "RoundRobin" + connect_timeout: "5s" diff --git a/pkg/config/config_load_test.go b/pkg/config/config_load_test.go index 8009fde3e..425eb68c6 100644 --- a/pkg/config/config_load_test.go +++ b/pkg/config/config_load_test.go @@ -5,12 +5,19 @@ import ( "testing" ) +import ( + "github.com/stretchr/testify/assert" +) + import ( "github.com/dubbogo/dubbo-go-proxy/pkg/model" ) func TestLoad(t *testing.T) { - Load("/Users/tc/Documents/workspace_2020/aproxy/configs/conf.yaml") + conf := Load("conf_test.yaml") + + assert.Equal(t, 1, len(conf.StaticResources.Listeners)) + assert.Equal(t, 1, len(conf.StaticResources.Clusters)) } func TestStruct2JSON(t *testing.T) { From 33b38b0854836b898d8567e13f085a7c809de8a1 Mon Sep 17 00:00:00 2001 From: tiecheng <18768171164@163.com> Date: Thu, 17 Sep 2020 10:31:21 +0800 Subject: [PATCH 036/227] fix test load --- pkg/config/conf_test.yaml | 49 ++++++++++++++++++++++++++++++++++ pkg/config/config_load_test.go | 9 ++++++- 2 files changed, 57 insertions(+), 1 deletion(-) create mode 100644 pkg/config/conf_test.yaml diff --git a/pkg/config/conf_test.yaml b/pkg/config/conf_test.yaml new file mode 100644 index 000000000..8a8ebc993 --- /dev/null +++ b/pkg/config/conf_test.yaml @@ -0,0 +1,49 @@ +--- +static_resources: + listeners: + - name: "net/http" + address: + socket_address: + protocol_type: "HTTP" + address: "0.0.0.0" + port: 8888 + filter_chains: + - filter_chain_match: + domains: + - api.dubbo.com + - api.proxy.com + filters: + - name: dgp.filters.http_connect_manager + config: + route_config: + routes: + - match: + prefix: "/api/v1" + headers: + - name: "X-DGP-WAY" + value: "dubbo" + route: + cluster: "test_dubbo" + cluster_not_found_response_code: 505 + cors: + allow_origin: + - "*" + enabled: true + http_filters: + - name: dgp.filters.http.api + config: + - name: dgp.filters.http.router + config: + - name: dgp.filters.http_transfer_dubbo + config: + server_name: "test_http_dubbo" + generate_request_id: false + config: + idle_timeout: 5s + read_timeout: 5s + write_timeout: 5s + clusters: + - name: "test_dubbo" + type: "EDS" + lb_policy: "RoundRobin" + connect_timeout: "5s" diff --git a/pkg/config/config_load_test.go b/pkg/config/config_load_test.go index 8009fde3e..425eb68c6 100644 --- a/pkg/config/config_load_test.go +++ b/pkg/config/config_load_test.go @@ -5,12 +5,19 @@ import ( "testing" ) +import ( + "github.com/stretchr/testify/assert" +) + import ( "github.com/dubbogo/dubbo-go-proxy/pkg/model" ) func TestLoad(t *testing.T) { - Load("/Users/tc/Documents/workspace_2020/aproxy/configs/conf.yaml") + conf := Load("conf_test.yaml") + + assert.Equal(t, 1, len(conf.StaticResources.Listeners)) + assert.Equal(t, 1, len(conf.StaticResources.Clusters)) } func TestStruct2JSON(t *testing.T) { From a60c43428dd4186493ac11219099b6e0ea56efc4 Mon Sep 17 00:00:00 2001 From: tiecheng <18768171164@163.com> Date: Thu, 17 Sep 2020 10:31:21 +0800 Subject: [PATCH 037/227] fix test load --- pkg/config/conf_test.yaml | 49 ++++++++++++++++++++++++++++++++++ pkg/config/config_load_test.go | 9 ++++++- 2 files changed, 57 insertions(+), 1 deletion(-) create mode 100644 pkg/config/conf_test.yaml diff --git a/pkg/config/conf_test.yaml b/pkg/config/conf_test.yaml new file mode 100644 index 000000000..8a8ebc993 --- /dev/null +++ b/pkg/config/conf_test.yaml @@ -0,0 +1,49 @@ +--- +static_resources: + listeners: + - name: "net/http" + address: + socket_address: + protocol_type: "HTTP" + address: "0.0.0.0" + port: 8888 + filter_chains: + - filter_chain_match: + domains: + - api.dubbo.com + - api.proxy.com + filters: + - name: dgp.filters.http_connect_manager + config: + route_config: + routes: + - match: + prefix: "/api/v1" + headers: + - name: "X-DGP-WAY" + value: "dubbo" + route: + cluster: "test_dubbo" + cluster_not_found_response_code: 505 + cors: + allow_origin: + - "*" + enabled: true + http_filters: + - name: dgp.filters.http.api + config: + - name: dgp.filters.http.router + config: + - name: dgp.filters.http_transfer_dubbo + config: + server_name: "test_http_dubbo" + generate_request_id: false + config: + idle_timeout: 5s + read_timeout: 5s + write_timeout: 5s + clusters: + - name: "test_dubbo" + type: "EDS" + lb_policy: "RoundRobin" + connect_timeout: "5s" diff --git a/pkg/config/config_load_test.go b/pkg/config/config_load_test.go index 8009fde3e..425eb68c6 100644 --- a/pkg/config/config_load_test.go +++ b/pkg/config/config_load_test.go @@ -5,12 +5,19 @@ import ( "testing" ) +import ( + "github.com/stretchr/testify/assert" +) + import ( "github.com/dubbogo/dubbo-go-proxy/pkg/model" ) func TestLoad(t *testing.T) { - Load("/Users/tc/Documents/workspace_2020/aproxy/configs/conf.yaml") + conf := Load("conf_test.yaml") + + assert.Equal(t, 1, len(conf.StaticResources.Listeners)) + assert.Equal(t, 1, len(conf.StaticResources.Clusters)) } func TestStruct2JSON(t *testing.T) { From b1ac8b51067e398e2fd45c6c26aa0c1aa0324d4a Mon Sep 17 00:00:00 2001 From: tiecheng <18768171164@163.com> Date: Thu, 17 Sep 2020 10:49:16 +0800 Subject: [PATCH 038/227] add travis notify --- .travis.yml | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/.travis.yml b/.travis.yml index 73dde9e14..681cec348 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,8 +1,7 @@ language: go go: - - "1.14.x" - + - "1.14" env: - GO111MODULE=on @@ -10,4 +9,8 @@ install: true script: - go fmt ./... && [[ -z `git status -s` ]] - - go mod vendor && go test ./... + - echo 'start unit-test' + - go mod vendor && go test ./... -coverprofile=coverage.txt -covermode=atomic + +notifications: + webhooks: https://oapi.dingtalk.com/robot/send?access_token=72c669f31d5903698cba73d3dccd061a198b7c9a853d9bfac94289f8c0bf4baf From c41ae4a0ace78ab82c288b8bf1bbfb13f7275701 Mon Sep 17 00:00:00 2001 From: tiecheng <18768171164@163.com> Date: Thu, 17 Sep 2020 10:49:16 +0800 Subject: [PATCH 039/227] add travis notify --- .travis.yml | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/.travis.yml b/.travis.yml index 73dde9e14..681cec348 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,8 +1,7 @@ language: go go: - - "1.14.x" - + - "1.14" env: - GO111MODULE=on @@ -10,4 +9,8 @@ install: true script: - go fmt ./... && [[ -z `git status -s` ]] - - go mod vendor && go test ./... + - echo 'start unit-test' + - go mod vendor && go test ./... -coverprofile=coverage.txt -covermode=atomic + +notifications: + webhooks: https://oapi.dingtalk.com/robot/send?access_token=72c669f31d5903698cba73d3dccd061a198b7c9a853d9bfac94289f8c0bf4baf From 2ddb38aff6c9603ccfdcbbec20aefa3371be10cd Mon Sep 17 00:00:00 2001 From: tiecheng <18768171164@163.com> Date: Thu, 17 Sep 2020 10:49:16 +0800 Subject: [PATCH 040/227] add travis notify --- .travis.yml | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/.travis.yml b/.travis.yml index 73dde9e14..681cec348 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,8 +1,7 @@ language: go go: - - "1.14.x" - + - "1.14" env: - GO111MODULE=on @@ -10,4 +9,8 @@ install: true script: - go fmt ./... && [[ -z `git status -s` ]] - - go mod vendor && go test ./... + - echo 'start unit-test' + - go mod vendor && go test ./... -coverprofile=coverage.txt -covermode=atomic + +notifications: + webhooks: https://oapi.dingtalk.com/robot/send?access_token=72c669f31d5903698cba73d3dccd061a198b7c9a853d9bfac94289f8c0bf4baf From 3a59b6e767a99d96cd6d6b02512543900c1fb1ec Mon Sep 17 00:00:00 2001 From: zouyixian Date: Thu, 17 Sep 2020 13:57:22 +0800 Subject: [PATCH 041/227] tidy module --- go.sum | 32 +++++++++++++++++++++++++++++--- 1 file changed, 29 insertions(+), 3 deletions(-) diff --git a/go.sum b/go.sum index 62525845d..19b2130bf 100644 --- a/go.sum +++ b/go.sum @@ -11,7 +11,6 @@ cloud.google.com/go/firestore v1.1.0/go.mod h1:ulACoGHTpvq5r8rxGJ4ddJZBZqakUQqCl cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I= cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw= dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= -githu.com/apache/dubbo-getty v1.3.10 h1:ys5mwjPdxG/KwkPjS6EI0RzQtU6p6FCPoKpaFEzpAL0= github.com/Azure/azure-sdk-for-go v40.3.0+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc= github.com/Azure/go-autorest/autorest v0.9.0/go.mod h1:xyHB1BMZT0cuDHU7I0+g046+BFDTQ8rEZB0s4Yfa6bI= github.com/Azure/go-autorest/autorest v0.9.3/go.mod h1:GsRuLYvwzLjjjRoWEIyMUaYq8GNUx2nRB378IPt/1p0= @@ -31,6 +30,7 @@ github.com/Azure/go-autorest/autorest/to v0.3.0/go.mod h1:MgwOyqaIuKdG4TL/2ywSsI github.com/Azure/go-autorest/autorest/validation v0.2.0/go.mod h1:3EEqHnBxQGHXRYq3HT1WyXAvT7LLY3tl70hw6tQIbjI= github.com/Azure/go-autorest/logger v0.1.0/go.mod h1:oExouG+K6PryycPJfVSxi/koC6LSNgds39diKLz7Vrc= github.com/Azure/go-autorest/tracing v0.5.0/go.mod h1:r/s2XiOKccPW3HrqB+W0TQzfbtp2fGCgRFtBroKn4Dk= +github.com/BurntSushi/toml v0.3.1 h1:WXkYYl6Yr3qBf1K79EBnL4mak0OimBfB0XUf9Vl28OQ= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= github.com/DataDog/datadog-go v2.2.0+incompatible/go.mod h1:LButxg5PwREeZtORoXG3tL4fMGNddJ+vMq1mwgfaqoQ= @@ -52,7 +52,9 @@ github.com/afex/hystrix-go v0.0.0-20180502004556-fa1af6a1f4f5/go.mod h1:SkGFH1ia github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= github.com/aliyun/alibaba-cloud-sdk-go v1.61.18/go.mod h1:v8ESoHo4SyHmuB4b1tJqDHxfTGEciD+yhvOU/5s1Rfk= +github.com/apache/dubbo-getty v1.3.10 h1:ys5mwjPdxG/KwkPjS6EI0RzQtU6p6FCPoKpaFEzpAL0= github.com/apache/dubbo-getty v1.3.10/go.mod h1:x6rraK01BL5C7jUM2fPl5KMkAxLVIx54ZB8/XEOik9Y= +github.com/apache/dubbo-go v1.5.1 h1:hYktTWnMJdzwY0NkvSqJfOERkwFApZ3mH/tQBLVGO34= github.com/apache/dubbo-go v1.5.1/go.mod h1:lxwgtF+27mSFQsSrBLaVbdQpwCp+pBN/mHP4w4/N2Qc= github.com/apache/dubbo-go-hessian2 v1.6.2 h1:i7F5GjVaUatLQz1x9vUmmSIFj49L8J6rVICdF6xw4qw= github.com/apache/dubbo-go-hessian2 v1.6.2/go.mod h1:7rEw9guWABQa6Aqb8HeZcsYPHsOS7XT1qtJvkmI6c5w= @@ -64,7 +66,6 @@ github.com/armon/go-metrics v0.3.0/go.mod h1:zXjbSimjXTd7vOpY8B0/2LpvNvDoXBuplAD github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= github.com/armon/go-radix v1.0.0/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= github.com/aws/aws-sdk-go v1.25.41/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= -github.com/bapache/dubbo-getty v1.3.10/go.mod h1:x6rraK01BL5C7jUM2fPl5KMkAxLVIx54ZB8/XEOik9Y= github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= @@ -128,6 +129,7 @@ github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5Kwzbycv github.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL+zU= github.com/fatih/structs v1.1.0/go.mod h1:9NiDSp5zOcgEDl+j00MP/WkGVPOlPRLejGD8Ga6PJ7M= github.com/frankban/quicktest v1.4.1/go.mod h1:36zfPVQyHxymz4cH7wlDmVwDrJuljRB60qkgn7rorfQ= +github.com/fsnotify/fsnotify v1.4.7 h1:IXs+QLmnXW2CcXuY+8Mzv/fWEsPGWxqefPtCP5CnV9I= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= github.com/ghodss/yaml v0.0.0-20150909031657-73d445a93680/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= @@ -194,6 +196,7 @@ github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5m github.com/googleapis/gnostic v0.0.0-20170729233727-0c5108395e2d/go.mod h1:sJBsCZ4ayReDTBIg8b9dl28c5xFWyhBTVRp3pOg5EKY= github.com/googleapis/gnostic v0.2.0/go.mod h1:sJBsCZ4ayReDTBIg8b9dl28c5xFWyhBTVRp3pOg5EKY= github.com/gophercloud/gophercloud v0.1.0/go.mod h1:vxM41WHh5uqHVBMZHzuwNOHh8XEoIEcSTewFxm1c5g8= +github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1 h1:EGx4pi6eqNxGaHF6qqu48+N2wcFQ5qg5FXgOdqsJ5d8= github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= github.com/gorilla/websocket v1.4.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= github.com/gorilla/websocket v1.4.2 h1:+/TMaTYc4QFitKJxsQ7Yye35DkWvkdLcvGKqM+x0Ufc= @@ -251,6 +254,7 @@ github.com/hashicorp/go.net v0.0.1/go.mod h1:hjKkEWcCURg++eb33jQU7oqQcI9XDCnUzHA github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= github.com/hashicorp/golang-lru v0.5.3/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= +github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4= github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= github.com/hashicorp/hil v0.0.0-20160711231837-1e86c6b523c5/go.mod h1:KHvg/R2/dPtaePb16oW4qIyzkMxXOL38xjRN64adsts= github.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64= @@ -294,6 +298,7 @@ github.com/json-iterator/go v1.1.5/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCV github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= github.com/json-iterator/go v1.1.7/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= +github.com/jtolds/gls v4.20.0+incompatible h1:xdiiI2gbIgH/gLH7ADydsJ1uDOEzR8yvV7C0MuV77Wo= github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q= @@ -303,8 +308,10 @@ github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxv github.com/konsorten/go-windows-terminal-sequences v1.0.2/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= +github.com/kr/pretty v0.2.0 h1:s5hAObm+yFO5uHYt5dYjxi2rXrsnmRpJx4OYvIWUaQs= github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= +github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/lestrrat/go-envload v0.0.0-20180220120943-6ed08b54a570/go.mod h1:BLt8L9ld7wVsvEWQbuLrUZnCMnUmLZ+CGDzKtclrTlE= github.com/lestrrat/go-file-rotatelogs v0.0.0-20180223000712-d3151e2a480f/go.mod h1:UGmTpUd3rjbtfIpwAPrcfmGf/Z1HS95TATB+m57TPB8= @@ -374,6 +381,7 @@ github.com/packethost/packngo v0.1.1-0.20180711074735-b9cb5096f54c/go.mod h1:otz github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= github.com/pascaldekloe/goe v0.1.0/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= github.com/patrickmn/go-cache v2.1.0+incompatible/go.mod h1:3Qf8kWWT7OJRJbdiICTKqZju1ZixQ/KpMGzzAfe6+WQ= +github.com/pelletier/go-toml v1.2.0 h1:T5zMGML61Wp+FlcbWjRDT7yAxhJNAiPPLOFECq181zc= github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= github.com/peterbourgon/diskv v2.0.1+incompatible/go.mod h1:uqqh8zWWbv1HBMNONnaR/tNboyR3/BZd58JJSHlUSCU= github.com/pierrec/lz4 v2.0.5+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY= @@ -434,26 +442,34 @@ github.com/sirupsen/logrus v1.0.6/go.mod h1:pMByvHTf9Beacp5x1UXfOR9xyW/9antXMhjM github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= github.com/sirupsen/logrus v1.4.1/go.mod h1:ni0Sbl8bgC9z8RoU9G6nDWqqs/fq4eDPysMBDgk/93Q= github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= +github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d h1:zE9ykElWQ6/NYmHa3jpm/yHnI4xSofP+UP6SpjHcSeM= github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= github.com/smartystreets/goconvey v0.0.0-20190330032615-68dc04aab96a/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= +github.com/smartystreets/goconvey v1.6.4 h1:fv0U8FUIMPNf1L9lnHLvLhgicrIVChEkdzIKYqbNC9s= github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= github.com/softlayer/softlayer-go v0.0.0-20180806151055-260589d94c7d/go.mod h1:Cw4GTlQccdRGSEf6KiMju767x0NEHE0YIVPJSaXjlsw= github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM= github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ= github.com/spf13/afero v1.2.1/go.mod h1:9ZxEEn6pIJ8Rxe320qSDBk6AsU0r9pR7Q4OcevTdifk= +github.com/spf13/afero v1.2.2 h1:5jhuqJyZCZf2JRofRvN/nIFgIWNzPa3/Vz8mYylgbWc= github.com/spf13/afero v1.2.2/go.mod h1:9ZxEEn6pIJ8Rxe320qSDBk6AsU0r9pR7Q4OcevTdifk= +github.com/spf13/cast v1.3.0 h1:oget//CVOEoFewqQxwr0Ej5yjygnqGkvggSE/gB35Q8= github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= github.com/spf13/cobra v0.0.5/go.mod h1:3K3wKZymM7VvHMDS9+Akkh4K60UwM26emMESw8tLCHU= +github.com/spf13/jwalterweatherman v1.0.0 h1:XHEdyB+EcvlqZamSM4ZOMGlc93t6AcsBEu9Gc1vn7yk= github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo= github.com/spf13/pflag v0.0.0-20170130214245-9ff6c6923cff/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= +github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= github.com/spf13/viper v1.3.2/go.mod h1:ZiWeW+zYFKm7srdB9IoDzzZXaJaI5eL9QjNiN/DMA2s= github.com/spf13/viper v1.4.0/go.mod h1:PTJ7Z/lr49W6bUbkmS1V3by4uWynFiR9p7+dSq/yZzE= +github.com/spf13/viper v1.7.0 h1:xVKxvI7ouOI5I+U9s2eeiUfMaWBVoXA3AWskkrqK0VM= github.com/spf13/viper v1.7.0/go.mod h1:8WkrPz2fc9jxqZNCJI/76HCieCp4Q8HaLFoCha5qpdg= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/objx v0.2.0 h1:Hbg2NidpLE8veEBkEZTL3CvlkUIVzuU9jDplZO54c48= github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE= github.com/stretchr/testify v0.0.0-20151208002404-e3a8ff8ce365/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= @@ -461,10 +477,12 @@ github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UV github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= github.com/stretchr/testify v1.5.1 h1:nOGnQDM7FYENwehXlg/kFVnos3rEvtKTjRvOWSzb6H4= github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= +github.com/subosito/gotenv v1.2.0 h1:Slr1R9HxAlEKefgq5jn9U+DnETlIUa6HfgEzj0g5d7s= github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw= github.com/tebeka/strftime v0.1.3/go.mod h1:7wJm3dZlpr4l/oVK0t1HYIc4rMzQ2XJlOMIUJUJH6XQ= github.com/tencentcloud/tencentcloud-sdk-go v3.0.83+incompatible/go.mod h1:0PfYow01SHPMhKY31xa+EFz2RStxIqj6JFAJS+IkCi4= github.com/tent/http-link-go v0.0.0-20130702225549-ac974c61c2f9/go.mod h1:RHkNRtSLfOK7qBTHaeSX1D6BNpI3qw7NTxsmNr4RvN8= +github.com/tevid/gohamcrest v1.1.1 h1:ou+xSqlIw1xfGTg1uq1nif/htZ2S3EzRqLm2BP+tYU0= github.com/tevid/gohamcrest v1.1.1/go.mod h1:3UvtWlqm8j5JbwYZh80D/PVBt0mJ1eJiYgZMibh0H/k= github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= github.com/toolkits/concurrent v0.0.0-20150624120057-a4371d70e3e3/go.mod h1:QDlpd3qS71vYtakd2hmdpqhJ9nwv6mD6A30bQ1BPBFE= @@ -476,8 +494,8 @@ github.com/urfave/cli v1.22.4/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtX github.com/vmware/govmomi v0.18.0/go.mod h1:URlwyTFZX72RmxtxuaFL2Uj3fD1JTvZdx59bHWk6aFU= github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU= github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q= +github.com/zouyx/agollo/v3 v3.4.4 h1:5G7QNw3fw74Ns8SfnHNhjndV2mlz5Fg8bB7q84ydFYI= github.com/zouyx/agollo/v3 v3.4.4/go.mod h1:ag0XmE1r4iAgPd6PUnU9TJ0DMEjM1VKX1HUNqQJ2ywU= -githubm/.com/apache/dubbo-go v1.5.1 h1:9bcGOkek0+x+zqtvykKpuOwkoJfMef0zNxsyPbWOafY= go.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= go.etcd.io/bbolt v1.3.4/go.mod h1:G5EMThwa9y8QZGBClrRx5EY+Yw9kAhnjy3bSjsnlVTQ= go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= @@ -488,6 +506,7 @@ go.uber.org/atomic v1.6.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= go.uber.org/multierr v1.5.0 h1:KCa4XfM8CWFCpxXRGok+Q0SS/0XBhMDbHHGABQLvD2A= go.uber.org/multierr v1.5.0/go.mod h1:FeouvMocqHpRaaGuG9EjoKcStLC43Zu/fmqdUMPcKYU= +go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee h1:0mgffUl7nfd+FpvXMVz4IDEaUSmT1ysygQC7qYo7sG4= go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee/go.mod h1:vJERXedbb3MVM5f9Ejo0C68/HhF8uaILCdgjnY+goOA= go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= go.uber.org/zap v1.15.0 h1:ZZCA22JRF2gQE5FoNmhmrf7jeJJ2uhqDUNRYKm8dvmM= @@ -516,6 +535,7 @@ golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTk golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= golang.org/x/lint v0.0.0-20190409202823-959b441ac422/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= golang.org/x/lint v0.0.0-20190909230951-414d861bb4ac/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20190930215403-16217165b5de h1:5hukYrvBGR8/eNkX5mdUezrA6JiaEZDtJb9Ei+1LlBs= golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE= golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o= @@ -585,11 +605,13 @@ golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200124204421-9fbb57f87de9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae h1:/WDfKMnPU+m5M4xB+6x4kaepxRw6jWvR5iDRdvjHgy8= golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/text v0.0.0-20160726164857-2910a502d2bf/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.1-0.20181227161524-e6919f6577db/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= +golang.org/x/text v0.3.2 h1:tW2bmiBqwgJj/UpqtC8EpXEZVYOwU0yG4iWbprSVAcs= golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= @@ -615,6 +637,7 @@ golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtn golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191029041327-9cc4af7d6b2c/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191029190741-b9c20aec41a5/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191112195655-aa38f8e97acc h1:NCy3Ohtk6Iny5V/reW2Ktypo4zIpWBdRJ1uFMjBxdg8= golang.org/x/tools v0.0.0-20191112195655-aa38f8e97acc/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= @@ -651,12 +674,14 @@ gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLks gopkg.in/asn1-ber.v1 v1.0.0-20181015200546-f715ec2f112d/go.mod h1:cuepJuh7vyXfUyUwEgHQXw849cJrilpS5NeIjOWESAw= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15 h1:YR8cESwS4TdDjEe65xsg0ogRM/Nc3DYOhEAlW+xobZo= gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= gopkg.in/gemnasium/logrus-airbrake-hook.v2 v2.1.2/go.mod h1:Xk6kEKp8OKb+X14hQBKWaSkCsqBpgog8nAV2xsGOxlo= gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= gopkg.in/ini.v1 v1.42.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= +gopkg.in/ini.v1 v1.51.0 h1:AQvPpx3LzTDM0AjnIRlVFwFFGC+npRopjZxLJj6gdno= gopkg.in/ini.v1 v1.51.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo= gopkg.in/square/go-jose.v2 v2.3.1/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI= @@ -672,6 +697,7 @@ honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWh honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.1-2019.2.3 h1:3JgtbtFHMiCmsznwGVTUWbgGov+pVqnlf1dEJTNAXeM= honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= istio.io/gogo-genproto v0.0.0-20190124151557-6d926a6e6feb/go.mod h1:eIDJ6jNk/IeJz6ODSksHl5Aiczy5JUq6vFhJWI5OtiI= k8s.io/api v0.16.9/go.mod h1:Y7dZNHs1Xy0mSwSlzL9QShi6qkljnN41yR8oWCRTDe8= From 65662dda7a3ebd0733b693202791b3e3a3b505aa Mon Sep 17 00:00:00 2001 From: zouyixian Date: Thu, 17 Sep 2020 13:57:22 +0800 Subject: [PATCH 042/227] tidy module --- go.sum | 32 +++++++++++++++++++++++++++++--- 1 file changed, 29 insertions(+), 3 deletions(-) diff --git a/go.sum b/go.sum index 62525845d..19b2130bf 100644 --- a/go.sum +++ b/go.sum @@ -11,7 +11,6 @@ cloud.google.com/go/firestore v1.1.0/go.mod h1:ulACoGHTpvq5r8rxGJ4ddJZBZqakUQqCl cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I= cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw= dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= -githu.com/apache/dubbo-getty v1.3.10 h1:ys5mwjPdxG/KwkPjS6EI0RzQtU6p6FCPoKpaFEzpAL0= github.com/Azure/azure-sdk-for-go v40.3.0+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc= github.com/Azure/go-autorest/autorest v0.9.0/go.mod h1:xyHB1BMZT0cuDHU7I0+g046+BFDTQ8rEZB0s4Yfa6bI= github.com/Azure/go-autorest/autorest v0.9.3/go.mod h1:GsRuLYvwzLjjjRoWEIyMUaYq8GNUx2nRB378IPt/1p0= @@ -31,6 +30,7 @@ github.com/Azure/go-autorest/autorest/to v0.3.0/go.mod h1:MgwOyqaIuKdG4TL/2ywSsI github.com/Azure/go-autorest/autorest/validation v0.2.0/go.mod h1:3EEqHnBxQGHXRYq3HT1WyXAvT7LLY3tl70hw6tQIbjI= github.com/Azure/go-autorest/logger v0.1.0/go.mod h1:oExouG+K6PryycPJfVSxi/koC6LSNgds39diKLz7Vrc= github.com/Azure/go-autorest/tracing v0.5.0/go.mod h1:r/s2XiOKccPW3HrqB+W0TQzfbtp2fGCgRFtBroKn4Dk= +github.com/BurntSushi/toml v0.3.1 h1:WXkYYl6Yr3qBf1K79EBnL4mak0OimBfB0XUf9Vl28OQ= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= github.com/DataDog/datadog-go v2.2.0+incompatible/go.mod h1:LButxg5PwREeZtORoXG3tL4fMGNddJ+vMq1mwgfaqoQ= @@ -52,7 +52,9 @@ github.com/afex/hystrix-go v0.0.0-20180502004556-fa1af6a1f4f5/go.mod h1:SkGFH1ia github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= github.com/aliyun/alibaba-cloud-sdk-go v1.61.18/go.mod h1:v8ESoHo4SyHmuB4b1tJqDHxfTGEciD+yhvOU/5s1Rfk= +github.com/apache/dubbo-getty v1.3.10 h1:ys5mwjPdxG/KwkPjS6EI0RzQtU6p6FCPoKpaFEzpAL0= github.com/apache/dubbo-getty v1.3.10/go.mod h1:x6rraK01BL5C7jUM2fPl5KMkAxLVIx54ZB8/XEOik9Y= +github.com/apache/dubbo-go v1.5.1 h1:hYktTWnMJdzwY0NkvSqJfOERkwFApZ3mH/tQBLVGO34= github.com/apache/dubbo-go v1.5.1/go.mod h1:lxwgtF+27mSFQsSrBLaVbdQpwCp+pBN/mHP4w4/N2Qc= github.com/apache/dubbo-go-hessian2 v1.6.2 h1:i7F5GjVaUatLQz1x9vUmmSIFj49L8J6rVICdF6xw4qw= github.com/apache/dubbo-go-hessian2 v1.6.2/go.mod h1:7rEw9guWABQa6Aqb8HeZcsYPHsOS7XT1qtJvkmI6c5w= @@ -64,7 +66,6 @@ github.com/armon/go-metrics v0.3.0/go.mod h1:zXjbSimjXTd7vOpY8B0/2LpvNvDoXBuplAD github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= github.com/armon/go-radix v1.0.0/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= github.com/aws/aws-sdk-go v1.25.41/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= -github.com/bapache/dubbo-getty v1.3.10/go.mod h1:x6rraK01BL5C7jUM2fPl5KMkAxLVIx54ZB8/XEOik9Y= github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= @@ -128,6 +129,7 @@ github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5Kwzbycv github.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL+zU= github.com/fatih/structs v1.1.0/go.mod h1:9NiDSp5zOcgEDl+j00MP/WkGVPOlPRLejGD8Ga6PJ7M= github.com/frankban/quicktest v1.4.1/go.mod h1:36zfPVQyHxymz4cH7wlDmVwDrJuljRB60qkgn7rorfQ= +github.com/fsnotify/fsnotify v1.4.7 h1:IXs+QLmnXW2CcXuY+8Mzv/fWEsPGWxqefPtCP5CnV9I= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= github.com/ghodss/yaml v0.0.0-20150909031657-73d445a93680/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= @@ -194,6 +196,7 @@ github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5m github.com/googleapis/gnostic v0.0.0-20170729233727-0c5108395e2d/go.mod h1:sJBsCZ4ayReDTBIg8b9dl28c5xFWyhBTVRp3pOg5EKY= github.com/googleapis/gnostic v0.2.0/go.mod h1:sJBsCZ4ayReDTBIg8b9dl28c5xFWyhBTVRp3pOg5EKY= github.com/gophercloud/gophercloud v0.1.0/go.mod h1:vxM41WHh5uqHVBMZHzuwNOHh8XEoIEcSTewFxm1c5g8= +github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1 h1:EGx4pi6eqNxGaHF6qqu48+N2wcFQ5qg5FXgOdqsJ5d8= github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= github.com/gorilla/websocket v1.4.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= github.com/gorilla/websocket v1.4.2 h1:+/TMaTYc4QFitKJxsQ7Yye35DkWvkdLcvGKqM+x0Ufc= @@ -251,6 +254,7 @@ github.com/hashicorp/go.net v0.0.1/go.mod h1:hjKkEWcCURg++eb33jQU7oqQcI9XDCnUzHA github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= github.com/hashicorp/golang-lru v0.5.3/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= +github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4= github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= github.com/hashicorp/hil v0.0.0-20160711231837-1e86c6b523c5/go.mod h1:KHvg/R2/dPtaePb16oW4qIyzkMxXOL38xjRN64adsts= github.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64= @@ -294,6 +298,7 @@ github.com/json-iterator/go v1.1.5/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCV github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= github.com/json-iterator/go v1.1.7/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= +github.com/jtolds/gls v4.20.0+incompatible h1:xdiiI2gbIgH/gLH7ADydsJ1uDOEzR8yvV7C0MuV77Wo= github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q= @@ -303,8 +308,10 @@ github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxv github.com/konsorten/go-windows-terminal-sequences v1.0.2/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= +github.com/kr/pretty v0.2.0 h1:s5hAObm+yFO5uHYt5dYjxi2rXrsnmRpJx4OYvIWUaQs= github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= +github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/lestrrat/go-envload v0.0.0-20180220120943-6ed08b54a570/go.mod h1:BLt8L9ld7wVsvEWQbuLrUZnCMnUmLZ+CGDzKtclrTlE= github.com/lestrrat/go-file-rotatelogs v0.0.0-20180223000712-d3151e2a480f/go.mod h1:UGmTpUd3rjbtfIpwAPrcfmGf/Z1HS95TATB+m57TPB8= @@ -374,6 +381,7 @@ github.com/packethost/packngo v0.1.1-0.20180711074735-b9cb5096f54c/go.mod h1:otz github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= github.com/pascaldekloe/goe v0.1.0/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= github.com/patrickmn/go-cache v2.1.0+incompatible/go.mod h1:3Qf8kWWT7OJRJbdiICTKqZju1ZixQ/KpMGzzAfe6+WQ= +github.com/pelletier/go-toml v1.2.0 h1:T5zMGML61Wp+FlcbWjRDT7yAxhJNAiPPLOFECq181zc= github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= github.com/peterbourgon/diskv v2.0.1+incompatible/go.mod h1:uqqh8zWWbv1HBMNONnaR/tNboyR3/BZd58JJSHlUSCU= github.com/pierrec/lz4 v2.0.5+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY= @@ -434,26 +442,34 @@ github.com/sirupsen/logrus v1.0.6/go.mod h1:pMByvHTf9Beacp5x1UXfOR9xyW/9antXMhjM github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= github.com/sirupsen/logrus v1.4.1/go.mod h1:ni0Sbl8bgC9z8RoU9G6nDWqqs/fq4eDPysMBDgk/93Q= github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= +github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d h1:zE9ykElWQ6/NYmHa3jpm/yHnI4xSofP+UP6SpjHcSeM= github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= github.com/smartystreets/goconvey v0.0.0-20190330032615-68dc04aab96a/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= +github.com/smartystreets/goconvey v1.6.4 h1:fv0U8FUIMPNf1L9lnHLvLhgicrIVChEkdzIKYqbNC9s= github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= github.com/softlayer/softlayer-go v0.0.0-20180806151055-260589d94c7d/go.mod h1:Cw4GTlQccdRGSEf6KiMju767x0NEHE0YIVPJSaXjlsw= github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM= github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ= github.com/spf13/afero v1.2.1/go.mod h1:9ZxEEn6pIJ8Rxe320qSDBk6AsU0r9pR7Q4OcevTdifk= +github.com/spf13/afero v1.2.2 h1:5jhuqJyZCZf2JRofRvN/nIFgIWNzPa3/Vz8mYylgbWc= github.com/spf13/afero v1.2.2/go.mod h1:9ZxEEn6pIJ8Rxe320qSDBk6AsU0r9pR7Q4OcevTdifk= +github.com/spf13/cast v1.3.0 h1:oget//CVOEoFewqQxwr0Ej5yjygnqGkvggSE/gB35Q8= github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= github.com/spf13/cobra v0.0.5/go.mod h1:3K3wKZymM7VvHMDS9+Akkh4K60UwM26emMESw8tLCHU= +github.com/spf13/jwalterweatherman v1.0.0 h1:XHEdyB+EcvlqZamSM4ZOMGlc93t6AcsBEu9Gc1vn7yk= github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo= github.com/spf13/pflag v0.0.0-20170130214245-9ff6c6923cff/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= +github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= github.com/spf13/viper v1.3.2/go.mod h1:ZiWeW+zYFKm7srdB9IoDzzZXaJaI5eL9QjNiN/DMA2s= github.com/spf13/viper v1.4.0/go.mod h1:PTJ7Z/lr49W6bUbkmS1V3by4uWynFiR9p7+dSq/yZzE= +github.com/spf13/viper v1.7.0 h1:xVKxvI7ouOI5I+U9s2eeiUfMaWBVoXA3AWskkrqK0VM= github.com/spf13/viper v1.7.0/go.mod h1:8WkrPz2fc9jxqZNCJI/76HCieCp4Q8HaLFoCha5qpdg= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/objx v0.2.0 h1:Hbg2NidpLE8veEBkEZTL3CvlkUIVzuU9jDplZO54c48= github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE= github.com/stretchr/testify v0.0.0-20151208002404-e3a8ff8ce365/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= @@ -461,10 +477,12 @@ github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UV github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= github.com/stretchr/testify v1.5.1 h1:nOGnQDM7FYENwehXlg/kFVnos3rEvtKTjRvOWSzb6H4= github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= +github.com/subosito/gotenv v1.2.0 h1:Slr1R9HxAlEKefgq5jn9U+DnETlIUa6HfgEzj0g5d7s= github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw= github.com/tebeka/strftime v0.1.3/go.mod h1:7wJm3dZlpr4l/oVK0t1HYIc4rMzQ2XJlOMIUJUJH6XQ= github.com/tencentcloud/tencentcloud-sdk-go v3.0.83+incompatible/go.mod h1:0PfYow01SHPMhKY31xa+EFz2RStxIqj6JFAJS+IkCi4= github.com/tent/http-link-go v0.0.0-20130702225549-ac974c61c2f9/go.mod h1:RHkNRtSLfOK7qBTHaeSX1D6BNpI3qw7NTxsmNr4RvN8= +github.com/tevid/gohamcrest v1.1.1 h1:ou+xSqlIw1xfGTg1uq1nif/htZ2S3EzRqLm2BP+tYU0= github.com/tevid/gohamcrest v1.1.1/go.mod h1:3UvtWlqm8j5JbwYZh80D/PVBt0mJ1eJiYgZMibh0H/k= github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= github.com/toolkits/concurrent v0.0.0-20150624120057-a4371d70e3e3/go.mod h1:QDlpd3qS71vYtakd2hmdpqhJ9nwv6mD6A30bQ1BPBFE= @@ -476,8 +494,8 @@ github.com/urfave/cli v1.22.4/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtX github.com/vmware/govmomi v0.18.0/go.mod h1:URlwyTFZX72RmxtxuaFL2Uj3fD1JTvZdx59bHWk6aFU= github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU= github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q= +github.com/zouyx/agollo/v3 v3.4.4 h1:5G7QNw3fw74Ns8SfnHNhjndV2mlz5Fg8bB7q84ydFYI= github.com/zouyx/agollo/v3 v3.4.4/go.mod h1:ag0XmE1r4iAgPd6PUnU9TJ0DMEjM1VKX1HUNqQJ2ywU= -githubm/.com/apache/dubbo-go v1.5.1 h1:9bcGOkek0+x+zqtvykKpuOwkoJfMef0zNxsyPbWOafY= go.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= go.etcd.io/bbolt v1.3.4/go.mod h1:G5EMThwa9y8QZGBClrRx5EY+Yw9kAhnjy3bSjsnlVTQ= go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= @@ -488,6 +506,7 @@ go.uber.org/atomic v1.6.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= go.uber.org/multierr v1.5.0 h1:KCa4XfM8CWFCpxXRGok+Q0SS/0XBhMDbHHGABQLvD2A= go.uber.org/multierr v1.5.0/go.mod h1:FeouvMocqHpRaaGuG9EjoKcStLC43Zu/fmqdUMPcKYU= +go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee h1:0mgffUl7nfd+FpvXMVz4IDEaUSmT1ysygQC7qYo7sG4= go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee/go.mod h1:vJERXedbb3MVM5f9Ejo0C68/HhF8uaILCdgjnY+goOA= go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= go.uber.org/zap v1.15.0 h1:ZZCA22JRF2gQE5FoNmhmrf7jeJJ2uhqDUNRYKm8dvmM= @@ -516,6 +535,7 @@ golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTk golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= golang.org/x/lint v0.0.0-20190409202823-959b441ac422/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= golang.org/x/lint v0.0.0-20190909230951-414d861bb4ac/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20190930215403-16217165b5de h1:5hukYrvBGR8/eNkX5mdUezrA6JiaEZDtJb9Ei+1LlBs= golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE= golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o= @@ -585,11 +605,13 @@ golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200124204421-9fbb57f87de9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae h1:/WDfKMnPU+m5M4xB+6x4kaepxRw6jWvR5iDRdvjHgy8= golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/text v0.0.0-20160726164857-2910a502d2bf/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.1-0.20181227161524-e6919f6577db/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= +golang.org/x/text v0.3.2 h1:tW2bmiBqwgJj/UpqtC8EpXEZVYOwU0yG4iWbprSVAcs= golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= @@ -615,6 +637,7 @@ golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtn golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191029041327-9cc4af7d6b2c/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191029190741-b9c20aec41a5/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191112195655-aa38f8e97acc h1:NCy3Ohtk6Iny5V/reW2Ktypo4zIpWBdRJ1uFMjBxdg8= golang.org/x/tools v0.0.0-20191112195655-aa38f8e97acc/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= @@ -651,12 +674,14 @@ gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLks gopkg.in/asn1-ber.v1 v1.0.0-20181015200546-f715ec2f112d/go.mod h1:cuepJuh7vyXfUyUwEgHQXw849cJrilpS5NeIjOWESAw= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15 h1:YR8cESwS4TdDjEe65xsg0ogRM/Nc3DYOhEAlW+xobZo= gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= gopkg.in/gemnasium/logrus-airbrake-hook.v2 v2.1.2/go.mod h1:Xk6kEKp8OKb+X14hQBKWaSkCsqBpgog8nAV2xsGOxlo= gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= gopkg.in/ini.v1 v1.42.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= +gopkg.in/ini.v1 v1.51.0 h1:AQvPpx3LzTDM0AjnIRlVFwFFGC+npRopjZxLJj6gdno= gopkg.in/ini.v1 v1.51.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo= gopkg.in/square/go-jose.v2 v2.3.1/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI= @@ -672,6 +697,7 @@ honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWh honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.1-2019.2.3 h1:3JgtbtFHMiCmsznwGVTUWbgGov+pVqnlf1dEJTNAXeM= honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= istio.io/gogo-genproto v0.0.0-20190124151557-6d926a6e6feb/go.mod h1:eIDJ6jNk/IeJz6ODSksHl5Aiczy5JUq6vFhJWI5OtiI= k8s.io/api v0.16.9/go.mod h1:Y7dZNHs1Xy0mSwSlzL9QShi6qkljnN41yR8oWCRTDe8= From 540b202b818f6ae5d5fb3c0599e99830de9fc24d Mon Sep 17 00:00:00 2001 From: zouyixian Date: Thu, 17 Sep 2020 13:57:22 +0800 Subject: [PATCH 043/227] tidy module --- go.sum | 32 +++++++++++++++++++++++++++++--- 1 file changed, 29 insertions(+), 3 deletions(-) diff --git a/go.sum b/go.sum index 62525845d..19b2130bf 100644 --- a/go.sum +++ b/go.sum @@ -11,7 +11,6 @@ cloud.google.com/go/firestore v1.1.0/go.mod h1:ulACoGHTpvq5r8rxGJ4ddJZBZqakUQqCl cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I= cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw= dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= -githu.com/apache/dubbo-getty v1.3.10 h1:ys5mwjPdxG/KwkPjS6EI0RzQtU6p6FCPoKpaFEzpAL0= github.com/Azure/azure-sdk-for-go v40.3.0+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc= github.com/Azure/go-autorest/autorest v0.9.0/go.mod h1:xyHB1BMZT0cuDHU7I0+g046+BFDTQ8rEZB0s4Yfa6bI= github.com/Azure/go-autorest/autorest v0.9.3/go.mod h1:GsRuLYvwzLjjjRoWEIyMUaYq8GNUx2nRB378IPt/1p0= @@ -31,6 +30,7 @@ github.com/Azure/go-autorest/autorest/to v0.3.0/go.mod h1:MgwOyqaIuKdG4TL/2ywSsI github.com/Azure/go-autorest/autorest/validation v0.2.0/go.mod h1:3EEqHnBxQGHXRYq3HT1WyXAvT7LLY3tl70hw6tQIbjI= github.com/Azure/go-autorest/logger v0.1.0/go.mod h1:oExouG+K6PryycPJfVSxi/koC6LSNgds39diKLz7Vrc= github.com/Azure/go-autorest/tracing v0.5.0/go.mod h1:r/s2XiOKccPW3HrqB+W0TQzfbtp2fGCgRFtBroKn4Dk= +github.com/BurntSushi/toml v0.3.1 h1:WXkYYl6Yr3qBf1K79EBnL4mak0OimBfB0XUf9Vl28OQ= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= github.com/DataDog/datadog-go v2.2.0+incompatible/go.mod h1:LButxg5PwREeZtORoXG3tL4fMGNddJ+vMq1mwgfaqoQ= @@ -52,7 +52,9 @@ github.com/afex/hystrix-go v0.0.0-20180502004556-fa1af6a1f4f5/go.mod h1:SkGFH1ia github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= github.com/aliyun/alibaba-cloud-sdk-go v1.61.18/go.mod h1:v8ESoHo4SyHmuB4b1tJqDHxfTGEciD+yhvOU/5s1Rfk= +github.com/apache/dubbo-getty v1.3.10 h1:ys5mwjPdxG/KwkPjS6EI0RzQtU6p6FCPoKpaFEzpAL0= github.com/apache/dubbo-getty v1.3.10/go.mod h1:x6rraK01BL5C7jUM2fPl5KMkAxLVIx54ZB8/XEOik9Y= +github.com/apache/dubbo-go v1.5.1 h1:hYktTWnMJdzwY0NkvSqJfOERkwFApZ3mH/tQBLVGO34= github.com/apache/dubbo-go v1.5.1/go.mod h1:lxwgtF+27mSFQsSrBLaVbdQpwCp+pBN/mHP4w4/N2Qc= github.com/apache/dubbo-go-hessian2 v1.6.2 h1:i7F5GjVaUatLQz1x9vUmmSIFj49L8J6rVICdF6xw4qw= github.com/apache/dubbo-go-hessian2 v1.6.2/go.mod h1:7rEw9guWABQa6Aqb8HeZcsYPHsOS7XT1qtJvkmI6c5w= @@ -64,7 +66,6 @@ github.com/armon/go-metrics v0.3.0/go.mod h1:zXjbSimjXTd7vOpY8B0/2LpvNvDoXBuplAD github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= github.com/armon/go-radix v1.0.0/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= github.com/aws/aws-sdk-go v1.25.41/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= -github.com/bapache/dubbo-getty v1.3.10/go.mod h1:x6rraK01BL5C7jUM2fPl5KMkAxLVIx54ZB8/XEOik9Y= github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= @@ -128,6 +129,7 @@ github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5Kwzbycv github.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL+zU= github.com/fatih/structs v1.1.0/go.mod h1:9NiDSp5zOcgEDl+j00MP/WkGVPOlPRLejGD8Ga6PJ7M= github.com/frankban/quicktest v1.4.1/go.mod h1:36zfPVQyHxymz4cH7wlDmVwDrJuljRB60qkgn7rorfQ= +github.com/fsnotify/fsnotify v1.4.7 h1:IXs+QLmnXW2CcXuY+8Mzv/fWEsPGWxqefPtCP5CnV9I= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= github.com/ghodss/yaml v0.0.0-20150909031657-73d445a93680/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= @@ -194,6 +196,7 @@ github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5m github.com/googleapis/gnostic v0.0.0-20170729233727-0c5108395e2d/go.mod h1:sJBsCZ4ayReDTBIg8b9dl28c5xFWyhBTVRp3pOg5EKY= github.com/googleapis/gnostic v0.2.0/go.mod h1:sJBsCZ4ayReDTBIg8b9dl28c5xFWyhBTVRp3pOg5EKY= github.com/gophercloud/gophercloud v0.1.0/go.mod h1:vxM41WHh5uqHVBMZHzuwNOHh8XEoIEcSTewFxm1c5g8= +github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1 h1:EGx4pi6eqNxGaHF6qqu48+N2wcFQ5qg5FXgOdqsJ5d8= github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= github.com/gorilla/websocket v1.4.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= github.com/gorilla/websocket v1.4.2 h1:+/TMaTYc4QFitKJxsQ7Yye35DkWvkdLcvGKqM+x0Ufc= @@ -251,6 +254,7 @@ github.com/hashicorp/go.net v0.0.1/go.mod h1:hjKkEWcCURg++eb33jQU7oqQcI9XDCnUzHA github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= github.com/hashicorp/golang-lru v0.5.3/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= +github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4= github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= github.com/hashicorp/hil v0.0.0-20160711231837-1e86c6b523c5/go.mod h1:KHvg/R2/dPtaePb16oW4qIyzkMxXOL38xjRN64adsts= github.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64= @@ -294,6 +298,7 @@ github.com/json-iterator/go v1.1.5/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCV github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= github.com/json-iterator/go v1.1.7/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= +github.com/jtolds/gls v4.20.0+incompatible h1:xdiiI2gbIgH/gLH7ADydsJ1uDOEzR8yvV7C0MuV77Wo= github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q= @@ -303,8 +308,10 @@ github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxv github.com/konsorten/go-windows-terminal-sequences v1.0.2/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= +github.com/kr/pretty v0.2.0 h1:s5hAObm+yFO5uHYt5dYjxi2rXrsnmRpJx4OYvIWUaQs= github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= +github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/lestrrat/go-envload v0.0.0-20180220120943-6ed08b54a570/go.mod h1:BLt8L9ld7wVsvEWQbuLrUZnCMnUmLZ+CGDzKtclrTlE= github.com/lestrrat/go-file-rotatelogs v0.0.0-20180223000712-d3151e2a480f/go.mod h1:UGmTpUd3rjbtfIpwAPrcfmGf/Z1HS95TATB+m57TPB8= @@ -374,6 +381,7 @@ github.com/packethost/packngo v0.1.1-0.20180711074735-b9cb5096f54c/go.mod h1:otz github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= github.com/pascaldekloe/goe v0.1.0/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= github.com/patrickmn/go-cache v2.1.0+incompatible/go.mod h1:3Qf8kWWT7OJRJbdiICTKqZju1ZixQ/KpMGzzAfe6+WQ= +github.com/pelletier/go-toml v1.2.0 h1:T5zMGML61Wp+FlcbWjRDT7yAxhJNAiPPLOFECq181zc= github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= github.com/peterbourgon/diskv v2.0.1+incompatible/go.mod h1:uqqh8zWWbv1HBMNONnaR/tNboyR3/BZd58JJSHlUSCU= github.com/pierrec/lz4 v2.0.5+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY= @@ -434,26 +442,34 @@ github.com/sirupsen/logrus v1.0.6/go.mod h1:pMByvHTf9Beacp5x1UXfOR9xyW/9antXMhjM github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= github.com/sirupsen/logrus v1.4.1/go.mod h1:ni0Sbl8bgC9z8RoU9G6nDWqqs/fq4eDPysMBDgk/93Q= github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= +github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d h1:zE9ykElWQ6/NYmHa3jpm/yHnI4xSofP+UP6SpjHcSeM= github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= github.com/smartystreets/goconvey v0.0.0-20190330032615-68dc04aab96a/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= +github.com/smartystreets/goconvey v1.6.4 h1:fv0U8FUIMPNf1L9lnHLvLhgicrIVChEkdzIKYqbNC9s= github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= github.com/softlayer/softlayer-go v0.0.0-20180806151055-260589d94c7d/go.mod h1:Cw4GTlQccdRGSEf6KiMju767x0NEHE0YIVPJSaXjlsw= github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM= github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ= github.com/spf13/afero v1.2.1/go.mod h1:9ZxEEn6pIJ8Rxe320qSDBk6AsU0r9pR7Q4OcevTdifk= +github.com/spf13/afero v1.2.2 h1:5jhuqJyZCZf2JRofRvN/nIFgIWNzPa3/Vz8mYylgbWc= github.com/spf13/afero v1.2.2/go.mod h1:9ZxEEn6pIJ8Rxe320qSDBk6AsU0r9pR7Q4OcevTdifk= +github.com/spf13/cast v1.3.0 h1:oget//CVOEoFewqQxwr0Ej5yjygnqGkvggSE/gB35Q8= github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= github.com/spf13/cobra v0.0.5/go.mod h1:3K3wKZymM7VvHMDS9+Akkh4K60UwM26emMESw8tLCHU= +github.com/spf13/jwalterweatherman v1.0.0 h1:XHEdyB+EcvlqZamSM4ZOMGlc93t6AcsBEu9Gc1vn7yk= github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo= github.com/spf13/pflag v0.0.0-20170130214245-9ff6c6923cff/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= +github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= github.com/spf13/viper v1.3.2/go.mod h1:ZiWeW+zYFKm7srdB9IoDzzZXaJaI5eL9QjNiN/DMA2s= github.com/spf13/viper v1.4.0/go.mod h1:PTJ7Z/lr49W6bUbkmS1V3by4uWynFiR9p7+dSq/yZzE= +github.com/spf13/viper v1.7.0 h1:xVKxvI7ouOI5I+U9s2eeiUfMaWBVoXA3AWskkrqK0VM= github.com/spf13/viper v1.7.0/go.mod h1:8WkrPz2fc9jxqZNCJI/76HCieCp4Q8HaLFoCha5qpdg= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/objx v0.2.0 h1:Hbg2NidpLE8veEBkEZTL3CvlkUIVzuU9jDplZO54c48= github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE= github.com/stretchr/testify v0.0.0-20151208002404-e3a8ff8ce365/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= @@ -461,10 +477,12 @@ github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UV github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= github.com/stretchr/testify v1.5.1 h1:nOGnQDM7FYENwehXlg/kFVnos3rEvtKTjRvOWSzb6H4= github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= +github.com/subosito/gotenv v1.2.0 h1:Slr1R9HxAlEKefgq5jn9U+DnETlIUa6HfgEzj0g5d7s= github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw= github.com/tebeka/strftime v0.1.3/go.mod h1:7wJm3dZlpr4l/oVK0t1HYIc4rMzQ2XJlOMIUJUJH6XQ= github.com/tencentcloud/tencentcloud-sdk-go v3.0.83+incompatible/go.mod h1:0PfYow01SHPMhKY31xa+EFz2RStxIqj6JFAJS+IkCi4= github.com/tent/http-link-go v0.0.0-20130702225549-ac974c61c2f9/go.mod h1:RHkNRtSLfOK7qBTHaeSX1D6BNpI3qw7NTxsmNr4RvN8= +github.com/tevid/gohamcrest v1.1.1 h1:ou+xSqlIw1xfGTg1uq1nif/htZ2S3EzRqLm2BP+tYU0= github.com/tevid/gohamcrest v1.1.1/go.mod h1:3UvtWlqm8j5JbwYZh80D/PVBt0mJ1eJiYgZMibh0H/k= github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= github.com/toolkits/concurrent v0.0.0-20150624120057-a4371d70e3e3/go.mod h1:QDlpd3qS71vYtakd2hmdpqhJ9nwv6mD6A30bQ1BPBFE= @@ -476,8 +494,8 @@ github.com/urfave/cli v1.22.4/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtX github.com/vmware/govmomi v0.18.0/go.mod h1:URlwyTFZX72RmxtxuaFL2Uj3fD1JTvZdx59bHWk6aFU= github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU= github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q= +github.com/zouyx/agollo/v3 v3.4.4 h1:5G7QNw3fw74Ns8SfnHNhjndV2mlz5Fg8bB7q84ydFYI= github.com/zouyx/agollo/v3 v3.4.4/go.mod h1:ag0XmE1r4iAgPd6PUnU9TJ0DMEjM1VKX1HUNqQJ2ywU= -githubm/.com/apache/dubbo-go v1.5.1 h1:9bcGOkek0+x+zqtvykKpuOwkoJfMef0zNxsyPbWOafY= go.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= go.etcd.io/bbolt v1.3.4/go.mod h1:G5EMThwa9y8QZGBClrRx5EY+Yw9kAhnjy3bSjsnlVTQ= go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= @@ -488,6 +506,7 @@ go.uber.org/atomic v1.6.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= go.uber.org/multierr v1.5.0 h1:KCa4XfM8CWFCpxXRGok+Q0SS/0XBhMDbHHGABQLvD2A= go.uber.org/multierr v1.5.0/go.mod h1:FeouvMocqHpRaaGuG9EjoKcStLC43Zu/fmqdUMPcKYU= +go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee h1:0mgffUl7nfd+FpvXMVz4IDEaUSmT1ysygQC7qYo7sG4= go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee/go.mod h1:vJERXedbb3MVM5f9Ejo0C68/HhF8uaILCdgjnY+goOA= go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= go.uber.org/zap v1.15.0 h1:ZZCA22JRF2gQE5FoNmhmrf7jeJJ2uhqDUNRYKm8dvmM= @@ -516,6 +535,7 @@ golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTk golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= golang.org/x/lint v0.0.0-20190409202823-959b441ac422/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= golang.org/x/lint v0.0.0-20190909230951-414d861bb4ac/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20190930215403-16217165b5de h1:5hukYrvBGR8/eNkX5mdUezrA6JiaEZDtJb9Ei+1LlBs= golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE= golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o= @@ -585,11 +605,13 @@ golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200124204421-9fbb57f87de9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae h1:/WDfKMnPU+m5M4xB+6x4kaepxRw6jWvR5iDRdvjHgy8= golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/text v0.0.0-20160726164857-2910a502d2bf/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.1-0.20181227161524-e6919f6577db/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= +golang.org/x/text v0.3.2 h1:tW2bmiBqwgJj/UpqtC8EpXEZVYOwU0yG4iWbprSVAcs= golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= @@ -615,6 +637,7 @@ golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtn golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191029041327-9cc4af7d6b2c/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191029190741-b9c20aec41a5/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191112195655-aa38f8e97acc h1:NCy3Ohtk6Iny5V/reW2Ktypo4zIpWBdRJ1uFMjBxdg8= golang.org/x/tools v0.0.0-20191112195655-aa38f8e97acc/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= @@ -651,12 +674,14 @@ gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLks gopkg.in/asn1-ber.v1 v1.0.0-20181015200546-f715ec2f112d/go.mod h1:cuepJuh7vyXfUyUwEgHQXw849cJrilpS5NeIjOWESAw= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15 h1:YR8cESwS4TdDjEe65xsg0ogRM/Nc3DYOhEAlW+xobZo= gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= gopkg.in/gemnasium/logrus-airbrake-hook.v2 v2.1.2/go.mod h1:Xk6kEKp8OKb+X14hQBKWaSkCsqBpgog8nAV2xsGOxlo= gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= gopkg.in/ini.v1 v1.42.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= +gopkg.in/ini.v1 v1.51.0 h1:AQvPpx3LzTDM0AjnIRlVFwFFGC+npRopjZxLJj6gdno= gopkg.in/ini.v1 v1.51.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo= gopkg.in/square/go-jose.v2 v2.3.1/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI= @@ -672,6 +697,7 @@ honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWh honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.1-2019.2.3 h1:3JgtbtFHMiCmsznwGVTUWbgGov+pVqnlf1dEJTNAXeM= honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= istio.io/gogo-genproto v0.0.0-20190124151557-6d926a6e6feb/go.mod h1:eIDJ6jNk/IeJz6ODSksHl5Aiczy5JUq6vFhJWI5OtiI= k8s.io/api v0.16.9/go.mod h1:Y7dZNHs1Xy0mSwSlzL9QShi6qkljnN41yR8oWCRTDe8= From 579aa179552374994938d5f089268a3434f88d6d Mon Sep 17 00:00:00 2001 From: tiecheng <18768171164@163.com> Date: Thu, 17 Sep 2020 14:09:59 +0800 Subject: [PATCH 044/227] update dingtalk url --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 681cec348..e0dbd425e 100644 --- a/.travis.yml +++ b/.travis.yml @@ -13,4 +13,4 @@ script: - go mod vendor && go test ./... -coverprofile=coverage.txt -covermode=atomic notifications: - webhooks: https://oapi.dingtalk.com/robot/send?access_token=72c669f31d5903698cba73d3dccd061a198b7c9a853d9bfac94289f8c0bf4baf + webhooks: https://oapi.dingtalk.com/robot/send?access_token=e6b085c90561a7543cc5fde89e9c8108100460c15e955c0604fea180a500a0ad From 790d122756918478dd2774c141f926a3f157e288 Mon Sep 17 00:00:00 2001 From: tiecheng <18768171164@163.com> Date: Thu, 17 Sep 2020 14:09:59 +0800 Subject: [PATCH 045/227] update dingtalk url --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 681cec348..e0dbd425e 100644 --- a/.travis.yml +++ b/.travis.yml @@ -13,4 +13,4 @@ script: - go mod vendor && go test ./... -coverprofile=coverage.txt -covermode=atomic notifications: - webhooks: https://oapi.dingtalk.com/robot/send?access_token=72c669f31d5903698cba73d3dccd061a198b7c9a853d9bfac94289f8c0bf4baf + webhooks: https://oapi.dingtalk.com/robot/send?access_token=e6b085c90561a7543cc5fde89e9c8108100460c15e955c0604fea180a500a0ad From 70991631f00420a91816b0900b947e8263b023da Mon Sep 17 00:00:00 2001 From: tiecheng <18768171164@163.com> Date: Thu, 17 Sep 2020 14:09:59 +0800 Subject: [PATCH 046/227] update dingtalk url --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 681cec348..e0dbd425e 100644 --- a/.travis.yml +++ b/.travis.yml @@ -13,4 +13,4 @@ script: - go mod vendor && go test ./... -coverprofile=coverage.txt -covermode=atomic notifications: - webhooks: https://oapi.dingtalk.com/robot/send?access_token=72c669f31d5903698cba73d3dccd061a198b7c9a853d9bfac94289f8c0bf4baf + webhooks: https://oapi.dingtalk.com/robot/send?access_token=e6b085c90561a7543cc5fde89e9c8108100460c15e955c0604fea180a500a0ad From cb96a9132c40c9a9178d1d5b39c1174943b74252 Mon Sep 17 00:00:00 2001 From: tiecheng Date: Thu, 17 Sep 2020 19:03:24 +0800 Subject: [PATCH 047/227] add licensed before package --- cmd/proxy/control.go | 17 +++++++++++++++++ cmd/proxy/proxy.go | 17 +++++++++++++++++ pkg/client/client.go | 17 +++++++++++++++++ pkg/client/dubbo/dubbo_client.go | 17 +++++++++++++++++ pkg/client/dubbo/dubbo_response.go | 17 +++++++++++++++++ pkg/client/request.go | 17 +++++++++++++++++ pkg/client/response.go | 17 +++++++++++++++++ pkg/common/constant/filter.go | 17 +++++++++++++++++ pkg/common/constant/http.go | 17 +++++++++++++++++ pkg/common/constant/key.go | 17 +++++++++++++++++ pkg/common/extension/discovery_service.go | 17 +++++++++++++++++ pkg/common/extension/filter.go | 17 +++++++++++++++++ pkg/config/config_load.go | 17 +++++++++++++++++ pkg/config/config_load_test.go | 17 +++++++++++++++++ pkg/context/base_context.go | 17 +++++++++++++++++ pkg/context/context.go | 17 +++++++++++++++++ pkg/context/filter.go | 17 +++++++++++++++++ pkg/context/http/context.go | 17 +++++++++++++++++ pkg/context/http/util.go | 17 +++++++++++++++++ pkg/context/http/writer.go | 17 +++++++++++++++++ pkg/filter/api_filter.go | 17 +++++++++++++++++ pkg/filter/dubbo_filter.go | 17 +++++++++++++++++ pkg/filter/http_filter.go | 17 +++++++++++++++++ pkg/filter/logger_filter.go | 17 +++++++++++++++++ pkg/filter/recovery_filter.go | 17 +++++++++++++++++ pkg/filter/router_filter.go | 17 +++++++++++++++++ pkg/logger/logger.go | 17 +++++++++++++++++ pkg/logger/logger_test.go | 17 +++++++++++++++++ pkg/logger/logging.go | 17 +++++++++++++++++ pkg/model/api.go | 17 +++++++++++++++++ pkg/model/base.go | 17 +++++++++++++++++ pkg/model/bootstrap.go | 17 +++++++++++++++++ pkg/model/cluster.go | 17 +++++++++++++++++ pkg/model/filter.go | 17 +++++++++++++++++ pkg/model/health.go | 17 +++++++++++++++++ pkg/model/http.go | 17 +++++++++++++++++ pkg/model/lb.go | 17 +++++++++++++++++ pkg/model/listener.go | 17 +++++++++++++++++ pkg/model/log.go | 17 +++++++++++++++++ pkg/model/match.go | 17 +++++++++++++++++ pkg/model/router.go | 17 +++++++++++++++++ pkg/model/tracing.go | 17 +++++++++++++++++ pkg/proxy/http.go | 17 +++++++++++++++++ pkg/proxy/listener.go | 17 +++++++++++++++++ pkg/proxy/proxy_start.go | 17 +++++++++++++++++ pkg/service/api/discovery_service.go | 17 +++++++++++++++++ pkg/service/discovery_service.go | 17 +++++++++++++++++ 47 files changed, 799 insertions(+) diff --git a/cmd/proxy/control.go b/cmd/proxy/control.go index 6c2548286..afd0de0ff 100644 --- a/cmd/proxy/control.go +++ b/cmd/proxy/control.go @@ -1,3 +1,20 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + */ + package main import ( diff --git a/cmd/proxy/proxy.go b/cmd/proxy/proxy.go index 738c4767f..eb0e0a1af 100644 --- a/cmd/proxy/proxy.go +++ b/cmd/proxy/proxy.go @@ -1,3 +1,20 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + */ + package main import ( diff --git a/pkg/client/client.go b/pkg/client/client.go index 53c51ddd0..66840d60c 100644 --- a/pkg/client/client.go +++ b/pkg/client/client.go @@ -1,3 +1,20 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + */ + package client type Client interface { diff --git a/pkg/client/dubbo/dubbo_client.go b/pkg/client/dubbo/dubbo_client.go index 245010f9f..225cef478 100644 --- a/pkg/client/dubbo/dubbo_client.go +++ b/pkg/client/dubbo/dubbo_client.go @@ -1,3 +1,20 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + */ + package dubbo import ( diff --git a/pkg/client/dubbo/dubbo_response.go b/pkg/client/dubbo/dubbo_response.go index 0fca4ce7c..a9a25bea2 100644 --- a/pkg/client/dubbo/dubbo_response.go +++ b/pkg/client/dubbo/dubbo_response.go @@ -1,3 +1,20 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + */ + package dubbo import ( diff --git a/pkg/client/request.go b/pkg/client/request.go index ed2929f19..2ab3ce055 100644 --- a/pkg/client/request.go +++ b/pkg/client/request.go @@ -1,3 +1,20 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + */ + package client import ( diff --git a/pkg/client/response.go b/pkg/client/response.go index 2d86fd75b..2739799f4 100644 --- a/pkg/client/response.go +++ b/pkg/client/response.go @@ -1,3 +1,20 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + */ + package client // Response response from endpoint diff --git a/pkg/common/constant/filter.go b/pkg/common/constant/filter.go index 440c65f0e..3c48570ea 100644 --- a/pkg/common/constant/filter.go +++ b/pkg/common/constant/filter.go @@ -1,3 +1,20 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + */ + package constant var ( diff --git a/pkg/common/constant/http.go b/pkg/common/constant/http.go index 32d272669..d831ce8a6 100644 --- a/pkg/common/constant/http.go +++ b/pkg/common/constant/http.go @@ -1,3 +1,20 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + */ + package constant const ( diff --git a/pkg/common/constant/key.go b/pkg/common/constant/key.go index 631ed928d..48a163142 100644 --- a/pkg/common/constant/key.go +++ b/pkg/common/constant/key.go @@ -1,3 +1,20 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + */ + package constant const ( diff --git a/pkg/common/extension/discovery_service.go b/pkg/common/extension/discovery_service.go index bc2751f8f..032978468 100644 --- a/pkg/common/extension/discovery_service.go +++ b/pkg/common/extension/discovery_service.go @@ -1,3 +1,20 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + */ + package extension import ( diff --git a/pkg/common/extension/filter.go b/pkg/common/extension/filter.go index 5c87b9bf1..3aa0c7ab3 100644 --- a/pkg/common/extension/filter.go +++ b/pkg/common/extension/filter.go @@ -1,3 +1,20 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + */ + package extension import ( diff --git a/pkg/config/config_load.go b/pkg/config/config_load.go index 639ac68ec..89b9bb68f 100644 --- a/pkg/config/config_load.go +++ b/pkg/config/config_load.go @@ -1,3 +1,20 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + */ + package config import ( diff --git a/pkg/config/config_load_test.go b/pkg/config/config_load_test.go index 425eb68c6..80f308831 100644 --- a/pkg/config/config_load_test.go +++ b/pkg/config/config_load_test.go @@ -1,3 +1,20 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + */ + package config import ( diff --git a/pkg/context/base_context.go b/pkg/context/base_context.go index 6a6b1eb97..940180184 100644 --- a/pkg/context/base_context.go +++ b/pkg/context/base_context.go @@ -1,3 +1,20 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + */ + package context import ( diff --git a/pkg/context/context.go b/pkg/context/context.go index 94a44f769..75a631e34 100644 --- a/pkg/context/context.go +++ b/pkg/context/context.go @@ -1,3 +1,20 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + */ + package context import ( diff --git a/pkg/context/filter.go b/pkg/context/filter.go index 5463ebfa9..f16c34ea9 100644 --- a/pkg/context/filter.go +++ b/pkg/context/filter.go @@ -1,3 +1,20 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + */ + package context // FilterFunc filter func, filter diff --git a/pkg/context/http/context.go b/pkg/context/http/context.go index 1c86022b9..b07564c9f 100644 --- a/pkg/context/http/context.go +++ b/pkg/context/http/context.go @@ -1,3 +1,20 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + */ + package http import ( diff --git a/pkg/context/http/util.go b/pkg/context/http/util.go index 4f3769d96..7ca8bad97 100644 --- a/pkg/context/http/util.go +++ b/pkg/context/http/util.go @@ -1,3 +1,20 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + */ + package http import ( diff --git a/pkg/context/http/writer.go b/pkg/context/http/writer.go index 0d4821e42..f81466834 100644 --- a/pkg/context/http/writer.go +++ b/pkg/context/http/writer.go @@ -1,3 +1,20 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + */ + package http import ( diff --git a/pkg/filter/api_filter.go b/pkg/filter/api_filter.go index 9a50b4af6..19b24a0c2 100644 --- a/pkg/filter/api_filter.go +++ b/pkg/filter/api_filter.go @@ -1,3 +1,20 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + */ + package filter import ( diff --git a/pkg/filter/dubbo_filter.go b/pkg/filter/dubbo_filter.go index 48f6d7b76..5950850af 100644 --- a/pkg/filter/dubbo_filter.go +++ b/pkg/filter/dubbo_filter.go @@ -1,3 +1,20 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + */ + package filter import ( diff --git a/pkg/filter/http_filter.go b/pkg/filter/http_filter.go index 1e187c876..c306ef2e6 100644 --- a/pkg/filter/http_filter.go +++ b/pkg/filter/http_filter.go @@ -1,3 +1,20 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + */ + package filter import ( diff --git a/pkg/filter/logger_filter.go b/pkg/filter/logger_filter.go index 4442e1e34..f6388a70c 100644 --- a/pkg/filter/logger_filter.go +++ b/pkg/filter/logger_filter.go @@ -1,3 +1,20 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + */ + package filter import ( diff --git a/pkg/filter/recovery_filter.go b/pkg/filter/recovery_filter.go index 944a43c84..1079ddbe5 100644 --- a/pkg/filter/recovery_filter.go +++ b/pkg/filter/recovery_filter.go @@ -1,3 +1,20 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + */ + package filter import ( diff --git a/pkg/filter/router_filter.go b/pkg/filter/router_filter.go index 25f83808b..a5871f4ef 100644 --- a/pkg/filter/router_filter.go +++ b/pkg/filter/router_filter.go @@ -1,3 +1,20 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + */ + package filter import ( diff --git a/pkg/logger/logger.go b/pkg/logger/logger.go index ae6b221a4..bacbdfbad 100644 --- a/pkg/logger/logger.go +++ b/pkg/logger/logger.go @@ -1,3 +1,20 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + */ + package logger import ( diff --git a/pkg/logger/logger_test.go b/pkg/logger/logger_test.go index da7f2358c..396043537 100644 --- a/pkg/logger/logger_test.go +++ b/pkg/logger/logger_test.go @@ -1,3 +1,20 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + */ + package logger import ( diff --git a/pkg/logger/logging.go b/pkg/logger/logging.go index 817b0d7ce..b14cdbfd3 100644 --- a/pkg/logger/logging.go +++ b/pkg/logger/logging.go @@ -1,3 +1,20 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + */ + package logger // Info diff --git a/pkg/model/api.go b/pkg/model/api.go index 060cd89ac..4138b3d9a 100644 --- a/pkg/model/api.go +++ b/pkg/model/api.go @@ -1,3 +1,20 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + */ + package model import ( diff --git a/pkg/model/base.go b/pkg/model/base.go index de602ca03..34fe3d29e 100644 --- a/pkg/model/base.go +++ b/pkg/model/base.go @@ -1,3 +1,20 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + */ + package model type Metadata struct { diff --git a/pkg/model/bootstrap.go b/pkg/model/bootstrap.go index a4f3124a7..d61689694 100644 --- a/pkg/model/bootstrap.go +++ b/pkg/model/bootstrap.go @@ -1,3 +1,20 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + */ + package model // Bootstrap the door diff --git a/pkg/model/cluster.go b/pkg/model/cluster.go index c1e95f789..3b476b244 100644 --- a/pkg/model/cluster.go +++ b/pkg/model/cluster.go @@ -1,3 +1,20 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + */ + package model // Cluster a single upstream cluster diff --git a/pkg/model/filter.go b/pkg/model/filter.go index ae36f6200..be17902d5 100644 --- a/pkg/model/filter.go +++ b/pkg/model/filter.go @@ -1,3 +1,20 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + */ + package model // FilterChain filter chain diff --git a/pkg/model/health.go b/pkg/model/health.go index 6e214273e..0d87c0b4b 100644 --- a/pkg/model/health.go +++ b/pkg/model/health.go @@ -1,3 +1,20 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + */ + package model // HealthCheck diff --git a/pkg/model/http.go b/pkg/model/http.go index ee27e19fa..6d2c092db 100644 --- a/pkg/model/http.go +++ b/pkg/model/http.go @@ -1,3 +1,20 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + */ + package model // HttpConnectionManager diff --git a/pkg/model/lb.go b/pkg/model/lb.go index 657470a4e..2980461da 100644 --- a/pkg/model/lb.go +++ b/pkg/model/lb.go @@ -1,3 +1,20 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + */ + package model // LbPolicy the load balance policy enum diff --git a/pkg/model/listener.go b/pkg/model/listener.go index 5d2d017d8..730f00d05 100644 --- a/pkg/model/listener.go +++ b/pkg/model/listener.go @@ -1,3 +1,20 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + */ + package model // Listener is a server, listener a port diff --git a/pkg/model/log.go b/pkg/model/log.go index b2a93a1ec..718925735 100644 --- a/pkg/model/log.go +++ b/pkg/model/log.go @@ -1,3 +1,20 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + */ + package model // AccessLog diff --git a/pkg/model/match.go b/pkg/model/match.go index d6ae2c019..2f046ea5d 100644 --- a/pkg/model/match.go +++ b/pkg/model/match.go @@ -1,3 +1,20 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + */ + package model // StringMatcher matcher string diff --git a/pkg/model/router.go b/pkg/model/router.go index fe268a5f5..341c13518 100644 --- a/pkg/model/router.go +++ b/pkg/model/router.go @@ -1,3 +1,20 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + */ + package model // Router 路由 diff --git a/pkg/model/tracing.go b/pkg/model/tracing.go index dd418a66b..c0a2a6b9b 100644 --- a/pkg/model/tracing.go +++ b/pkg/model/tracing.go @@ -1,3 +1,20 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + */ + package model // Tracing diff --git a/pkg/proxy/http.go b/pkg/proxy/http.go index 7fca609ba..889484bf4 100644 --- a/pkg/proxy/http.go +++ b/pkg/proxy/http.go @@ -1,3 +1,20 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + */ + package proxy import ( diff --git a/pkg/proxy/listener.go b/pkg/proxy/listener.go index c670bd125..47768f9dc 100644 --- a/pkg/proxy/listener.go +++ b/pkg/proxy/listener.go @@ -1,3 +1,20 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + */ + package proxy import ( diff --git a/pkg/proxy/proxy_start.go b/pkg/proxy/proxy_start.go index 2ba706348..9b87e0d9c 100644 --- a/pkg/proxy/proxy_start.go +++ b/pkg/proxy/proxy_start.go @@ -1,3 +1,20 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + */ + package proxy import ( diff --git a/pkg/service/api/discovery_service.go b/pkg/service/api/discovery_service.go index 3c9bbbbab..6c0d52380 100644 --- a/pkg/service/api/discovery_service.go +++ b/pkg/service/api/discovery_service.go @@ -1,3 +1,20 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + */ + package api import ( diff --git a/pkg/service/discovery_service.go b/pkg/service/discovery_service.go index 30e799a07..db1db0444 100644 --- a/pkg/service/discovery_service.go +++ b/pkg/service/discovery_service.go @@ -1,3 +1,20 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + */ + package service // DiscoveryRequest a request for discovery From 2211b486f6f45237d549927cc0110ff3f22b0f88 Mon Sep 17 00:00:00 2001 From: tiecheng Date: Thu, 17 Sep 2020 19:03:24 +0800 Subject: [PATCH 048/227] add licensed before package --- cmd/proxy/control.go | 17 +++++++++++++++++ cmd/proxy/proxy.go | 17 +++++++++++++++++ pkg/client/client.go | 17 +++++++++++++++++ pkg/client/dubbo/dubbo_client.go | 17 +++++++++++++++++ pkg/client/dubbo/dubbo_response.go | 17 +++++++++++++++++ pkg/client/request.go | 17 +++++++++++++++++ pkg/client/response.go | 17 +++++++++++++++++ pkg/common/constant/filter.go | 17 +++++++++++++++++ pkg/common/constant/http.go | 17 +++++++++++++++++ pkg/common/constant/key.go | 17 +++++++++++++++++ pkg/common/extension/discovery_service.go | 17 +++++++++++++++++ pkg/common/extension/filter.go | 17 +++++++++++++++++ pkg/config/config_load.go | 17 +++++++++++++++++ pkg/config/config_load_test.go | 17 +++++++++++++++++ pkg/context/base_context.go | 17 +++++++++++++++++ pkg/context/context.go | 17 +++++++++++++++++ pkg/context/filter.go | 17 +++++++++++++++++ pkg/context/http/context.go | 17 +++++++++++++++++ pkg/context/http/util.go | 17 +++++++++++++++++ pkg/context/http/writer.go | 17 +++++++++++++++++ pkg/filter/api_filter.go | 17 +++++++++++++++++ pkg/filter/dubbo_filter.go | 17 +++++++++++++++++ pkg/filter/http_filter.go | 17 +++++++++++++++++ pkg/filter/logger_filter.go | 17 +++++++++++++++++ pkg/filter/recovery_filter.go | 17 +++++++++++++++++ pkg/filter/router_filter.go | 17 +++++++++++++++++ pkg/logger/logger.go | 17 +++++++++++++++++ pkg/logger/logger_test.go | 17 +++++++++++++++++ pkg/logger/logging.go | 17 +++++++++++++++++ pkg/model/api.go | 17 +++++++++++++++++ pkg/model/base.go | 17 +++++++++++++++++ pkg/model/bootstrap.go | 17 +++++++++++++++++ pkg/model/cluster.go | 17 +++++++++++++++++ pkg/model/filter.go | 17 +++++++++++++++++ pkg/model/health.go | 17 +++++++++++++++++ pkg/model/http.go | 17 +++++++++++++++++ pkg/model/lb.go | 17 +++++++++++++++++ pkg/model/listener.go | 17 +++++++++++++++++ pkg/model/log.go | 17 +++++++++++++++++ pkg/model/match.go | 17 +++++++++++++++++ pkg/model/router.go | 17 +++++++++++++++++ pkg/model/tracing.go | 17 +++++++++++++++++ pkg/proxy/http.go | 17 +++++++++++++++++ pkg/proxy/listener.go | 17 +++++++++++++++++ pkg/proxy/proxy_start.go | 17 +++++++++++++++++ pkg/service/api/discovery_service.go | 17 +++++++++++++++++ pkg/service/discovery_service.go | 17 +++++++++++++++++ 47 files changed, 799 insertions(+) diff --git a/cmd/proxy/control.go b/cmd/proxy/control.go index 6c2548286..afd0de0ff 100644 --- a/cmd/proxy/control.go +++ b/cmd/proxy/control.go @@ -1,3 +1,20 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + */ + package main import ( diff --git a/cmd/proxy/proxy.go b/cmd/proxy/proxy.go index 738c4767f..eb0e0a1af 100644 --- a/cmd/proxy/proxy.go +++ b/cmd/proxy/proxy.go @@ -1,3 +1,20 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + */ + package main import ( diff --git a/pkg/client/client.go b/pkg/client/client.go index 53c51ddd0..66840d60c 100644 --- a/pkg/client/client.go +++ b/pkg/client/client.go @@ -1,3 +1,20 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + */ + package client type Client interface { diff --git a/pkg/client/dubbo/dubbo_client.go b/pkg/client/dubbo/dubbo_client.go index 245010f9f..225cef478 100644 --- a/pkg/client/dubbo/dubbo_client.go +++ b/pkg/client/dubbo/dubbo_client.go @@ -1,3 +1,20 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + */ + package dubbo import ( diff --git a/pkg/client/dubbo/dubbo_response.go b/pkg/client/dubbo/dubbo_response.go index 0fca4ce7c..a9a25bea2 100644 --- a/pkg/client/dubbo/dubbo_response.go +++ b/pkg/client/dubbo/dubbo_response.go @@ -1,3 +1,20 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + */ + package dubbo import ( diff --git a/pkg/client/request.go b/pkg/client/request.go index ed2929f19..2ab3ce055 100644 --- a/pkg/client/request.go +++ b/pkg/client/request.go @@ -1,3 +1,20 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + */ + package client import ( diff --git a/pkg/client/response.go b/pkg/client/response.go index 2d86fd75b..2739799f4 100644 --- a/pkg/client/response.go +++ b/pkg/client/response.go @@ -1,3 +1,20 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + */ + package client // Response response from endpoint diff --git a/pkg/common/constant/filter.go b/pkg/common/constant/filter.go index 440c65f0e..3c48570ea 100644 --- a/pkg/common/constant/filter.go +++ b/pkg/common/constant/filter.go @@ -1,3 +1,20 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + */ + package constant var ( diff --git a/pkg/common/constant/http.go b/pkg/common/constant/http.go index 32d272669..d831ce8a6 100644 --- a/pkg/common/constant/http.go +++ b/pkg/common/constant/http.go @@ -1,3 +1,20 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + */ + package constant const ( diff --git a/pkg/common/constant/key.go b/pkg/common/constant/key.go index 631ed928d..48a163142 100644 --- a/pkg/common/constant/key.go +++ b/pkg/common/constant/key.go @@ -1,3 +1,20 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + */ + package constant const ( diff --git a/pkg/common/extension/discovery_service.go b/pkg/common/extension/discovery_service.go index bc2751f8f..032978468 100644 --- a/pkg/common/extension/discovery_service.go +++ b/pkg/common/extension/discovery_service.go @@ -1,3 +1,20 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + */ + package extension import ( diff --git a/pkg/common/extension/filter.go b/pkg/common/extension/filter.go index 5c87b9bf1..3aa0c7ab3 100644 --- a/pkg/common/extension/filter.go +++ b/pkg/common/extension/filter.go @@ -1,3 +1,20 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + */ + package extension import ( diff --git a/pkg/config/config_load.go b/pkg/config/config_load.go index 639ac68ec..89b9bb68f 100644 --- a/pkg/config/config_load.go +++ b/pkg/config/config_load.go @@ -1,3 +1,20 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + */ + package config import ( diff --git a/pkg/config/config_load_test.go b/pkg/config/config_load_test.go index 425eb68c6..80f308831 100644 --- a/pkg/config/config_load_test.go +++ b/pkg/config/config_load_test.go @@ -1,3 +1,20 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + */ + package config import ( diff --git a/pkg/context/base_context.go b/pkg/context/base_context.go index 6a6b1eb97..940180184 100644 --- a/pkg/context/base_context.go +++ b/pkg/context/base_context.go @@ -1,3 +1,20 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + */ + package context import ( diff --git a/pkg/context/context.go b/pkg/context/context.go index 94a44f769..75a631e34 100644 --- a/pkg/context/context.go +++ b/pkg/context/context.go @@ -1,3 +1,20 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + */ + package context import ( diff --git a/pkg/context/filter.go b/pkg/context/filter.go index 5463ebfa9..f16c34ea9 100644 --- a/pkg/context/filter.go +++ b/pkg/context/filter.go @@ -1,3 +1,20 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + */ + package context // FilterFunc filter func, filter diff --git a/pkg/context/http/context.go b/pkg/context/http/context.go index 1c86022b9..b07564c9f 100644 --- a/pkg/context/http/context.go +++ b/pkg/context/http/context.go @@ -1,3 +1,20 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + */ + package http import ( diff --git a/pkg/context/http/util.go b/pkg/context/http/util.go index 4f3769d96..7ca8bad97 100644 --- a/pkg/context/http/util.go +++ b/pkg/context/http/util.go @@ -1,3 +1,20 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + */ + package http import ( diff --git a/pkg/context/http/writer.go b/pkg/context/http/writer.go index 0d4821e42..f81466834 100644 --- a/pkg/context/http/writer.go +++ b/pkg/context/http/writer.go @@ -1,3 +1,20 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + */ + package http import ( diff --git a/pkg/filter/api_filter.go b/pkg/filter/api_filter.go index 9a50b4af6..19b24a0c2 100644 --- a/pkg/filter/api_filter.go +++ b/pkg/filter/api_filter.go @@ -1,3 +1,20 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + */ + package filter import ( diff --git a/pkg/filter/dubbo_filter.go b/pkg/filter/dubbo_filter.go index 48f6d7b76..5950850af 100644 --- a/pkg/filter/dubbo_filter.go +++ b/pkg/filter/dubbo_filter.go @@ -1,3 +1,20 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + */ + package filter import ( diff --git a/pkg/filter/http_filter.go b/pkg/filter/http_filter.go index 1e187c876..c306ef2e6 100644 --- a/pkg/filter/http_filter.go +++ b/pkg/filter/http_filter.go @@ -1,3 +1,20 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + */ + package filter import ( diff --git a/pkg/filter/logger_filter.go b/pkg/filter/logger_filter.go index 4442e1e34..f6388a70c 100644 --- a/pkg/filter/logger_filter.go +++ b/pkg/filter/logger_filter.go @@ -1,3 +1,20 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + */ + package filter import ( diff --git a/pkg/filter/recovery_filter.go b/pkg/filter/recovery_filter.go index 944a43c84..1079ddbe5 100644 --- a/pkg/filter/recovery_filter.go +++ b/pkg/filter/recovery_filter.go @@ -1,3 +1,20 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + */ + package filter import ( diff --git a/pkg/filter/router_filter.go b/pkg/filter/router_filter.go index 25f83808b..a5871f4ef 100644 --- a/pkg/filter/router_filter.go +++ b/pkg/filter/router_filter.go @@ -1,3 +1,20 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + */ + package filter import ( diff --git a/pkg/logger/logger.go b/pkg/logger/logger.go index ae6b221a4..bacbdfbad 100644 --- a/pkg/logger/logger.go +++ b/pkg/logger/logger.go @@ -1,3 +1,20 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + */ + package logger import ( diff --git a/pkg/logger/logger_test.go b/pkg/logger/logger_test.go index da7f2358c..396043537 100644 --- a/pkg/logger/logger_test.go +++ b/pkg/logger/logger_test.go @@ -1,3 +1,20 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + */ + package logger import ( diff --git a/pkg/logger/logging.go b/pkg/logger/logging.go index 817b0d7ce..b14cdbfd3 100644 --- a/pkg/logger/logging.go +++ b/pkg/logger/logging.go @@ -1,3 +1,20 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + */ + package logger // Info diff --git a/pkg/model/api.go b/pkg/model/api.go index 060cd89ac..4138b3d9a 100644 --- a/pkg/model/api.go +++ b/pkg/model/api.go @@ -1,3 +1,20 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + */ + package model import ( diff --git a/pkg/model/base.go b/pkg/model/base.go index de602ca03..34fe3d29e 100644 --- a/pkg/model/base.go +++ b/pkg/model/base.go @@ -1,3 +1,20 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + */ + package model type Metadata struct { diff --git a/pkg/model/bootstrap.go b/pkg/model/bootstrap.go index a4f3124a7..d61689694 100644 --- a/pkg/model/bootstrap.go +++ b/pkg/model/bootstrap.go @@ -1,3 +1,20 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + */ + package model // Bootstrap the door diff --git a/pkg/model/cluster.go b/pkg/model/cluster.go index c1e95f789..3b476b244 100644 --- a/pkg/model/cluster.go +++ b/pkg/model/cluster.go @@ -1,3 +1,20 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + */ + package model // Cluster a single upstream cluster diff --git a/pkg/model/filter.go b/pkg/model/filter.go index ae36f6200..be17902d5 100644 --- a/pkg/model/filter.go +++ b/pkg/model/filter.go @@ -1,3 +1,20 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + */ + package model // FilterChain filter chain diff --git a/pkg/model/health.go b/pkg/model/health.go index 6e214273e..0d87c0b4b 100644 --- a/pkg/model/health.go +++ b/pkg/model/health.go @@ -1,3 +1,20 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + */ + package model // HealthCheck diff --git a/pkg/model/http.go b/pkg/model/http.go index ee27e19fa..6d2c092db 100644 --- a/pkg/model/http.go +++ b/pkg/model/http.go @@ -1,3 +1,20 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + */ + package model // HttpConnectionManager diff --git a/pkg/model/lb.go b/pkg/model/lb.go index 657470a4e..2980461da 100644 --- a/pkg/model/lb.go +++ b/pkg/model/lb.go @@ -1,3 +1,20 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + */ + package model // LbPolicy the load balance policy enum diff --git a/pkg/model/listener.go b/pkg/model/listener.go index 5d2d017d8..730f00d05 100644 --- a/pkg/model/listener.go +++ b/pkg/model/listener.go @@ -1,3 +1,20 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + */ + package model // Listener is a server, listener a port diff --git a/pkg/model/log.go b/pkg/model/log.go index b2a93a1ec..718925735 100644 --- a/pkg/model/log.go +++ b/pkg/model/log.go @@ -1,3 +1,20 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + */ + package model // AccessLog diff --git a/pkg/model/match.go b/pkg/model/match.go index d6ae2c019..2f046ea5d 100644 --- a/pkg/model/match.go +++ b/pkg/model/match.go @@ -1,3 +1,20 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + */ + package model // StringMatcher matcher string diff --git a/pkg/model/router.go b/pkg/model/router.go index fe268a5f5..341c13518 100644 --- a/pkg/model/router.go +++ b/pkg/model/router.go @@ -1,3 +1,20 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + */ + package model // Router 路由 diff --git a/pkg/model/tracing.go b/pkg/model/tracing.go index dd418a66b..c0a2a6b9b 100644 --- a/pkg/model/tracing.go +++ b/pkg/model/tracing.go @@ -1,3 +1,20 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + */ + package model // Tracing diff --git a/pkg/proxy/http.go b/pkg/proxy/http.go index 7fca609ba..889484bf4 100644 --- a/pkg/proxy/http.go +++ b/pkg/proxy/http.go @@ -1,3 +1,20 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + */ + package proxy import ( diff --git a/pkg/proxy/listener.go b/pkg/proxy/listener.go index c670bd125..47768f9dc 100644 --- a/pkg/proxy/listener.go +++ b/pkg/proxy/listener.go @@ -1,3 +1,20 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + */ + package proxy import ( diff --git a/pkg/proxy/proxy_start.go b/pkg/proxy/proxy_start.go index 2ba706348..9b87e0d9c 100644 --- a/pkg/proxy/proxy_start.go +++ b/pkg/proxy/proxy_start.go @@ -1,3 +1,20 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + */ + package proxy import ( diff --git a/pkg/service/api/discovery_service.go b/pkg/service/api/discovery_service.go index 3c9bbbbab..6c0d52380 100644 --- a/pkg/service/api/discovery_service.go +++ b/pkg/service/api/discovery_service.go @@ -1,3 +1,20 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + */ + package api import ( diff --git a/pkg/service/discovery_service.go b/pkg/service/discovery_service.go index 30e799a07..db1db0444 100644 --- a/pkg/service/discovery_service.go +++ b/pkg/service/discovery_service.go @@ -1,3 +1,20 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + */ + package service // DiscoveryRequest a request for discovery From 4f634f0abe21c7b7f7adef21a7ee2090738758e8 Mon Sep 17 00:00:00 2001 From: tiecheng Date: Thu, 17 Sep 2020 19:03:24 +0800 Subject: [PATCH 049/227] add licensed before package --- cmd/proxy/control.go | 17 +++++++++++++++++ cmd/proxy/proxy.go | 17 +++++++++++++++++ pkg/client/client.go | 17 +++++++++++++++++ pkg/client/dubbo/dubbo_client.go | 17 +++++++++++++++++ pkg/client/dubbo/dubbo_response.go | 17 +++++++++++++++++ pkg/client/request.go | 17 +++++++++++++++++ pkg/client/response.go | 17 +++++++++++++++++ pkg/common/constant/filter.go | 17 +++++++++++++++++ pkg/common/constant/http.go | 17 +++++++++++++++++ pkg/common/constant/key.go | 17 +++++++++++++++++ pkg/common/extension/discovery_service.go | 17 +++++++++++++++++ pkg/common/extension/filter.go | 17 +++++++++++++++++ pkg/config/config_load.go | 17 +++++++++++++++++ pkg/config/config_load_test.go | 17 +++++++++++++++++ pkg/context/base_context.go | 17 +++++++++++++++++ pkg/context/context.go | 17 +++++++++++++++++ pkg/context/filter.go | 17 +++++++++++++++++ pkg/context/http/context.go | 17 +++++++++++++++++ pkg/context/http/util.go | 17 +++++++++++++++++ pkg/context/http/writer.go | 17 +++++++++++++++++ pkg/filter/api_filter.go | 17 +++++++++++++++++ pkg/filter/dubbo_filter.go | 17 +++++++++++++++++ pkg/filter/http_filter.go | 17 +++++++++++++++++ pkg/filter/logger_filter.go | 17 +++++++++++++++++ pkg/filter/recovery_filter.go | 17 +++++++++++++++++ pkg/filter/router_filter.go | 17 +++++++++++++++++ pkg/logger/logger.go | 17 +++++++++++++++++ pkg/logger/logger_test.go | 17 +++++++++++++++++ pkg/logger/logging.go | 17 +++++++++++++++++ pkg/model/api.go | 17 +++++++++++++++++ pkg/model/base.go | 17 +++++++++++++++++ pkg/model/bootstrap.go | 17 +++++++++++++++++ pkg/model/cluster.go | 17 +++++++++++++++++ pkg/model/filter.go | 17 +++++++++++++++++ pkg/model/health.go | 17 +++++++++++++++++ pkg/model/http.go | 17 +++++++++++++++++ pkg/model/lb.go | 17 +++++++++++++++++ pkg/model/listener.go | 17 +++++++++++++++++ pkg/model/log.go | 17 +++++++++++++++++ pkg/model/match.go | 17 +++++++++++++++++ pkg/model/router.go | 17 +++++++++++++++++ pkg/model/tracing.go | 17 +++++++++++++++++ pkg/proxy/http.go | 17 +++++++++++++++++ pkg/proxy/listener.go | 17 +++++++++++++++++ pkg/proxy/proxy_start.go | 17 +++++++++++++++++ pkg/service/api/discovery_service.go | 17 +++++++++++++++++ pkg/service/discovery_service.go | 17 +++++++++++++++++ 47 files changed, 799 insertions(+) diff --git a/cmd/proxy/control.go b/cmd/proxy/control.go index 6c2548286..afd0de0ff 100644 --- a/cmd/proxy/control.go +++ b/cmd/proxy/control.go @@ -1,3 +1,20 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + */ + package main import ( diff --git a/cmd/proxy/proxy.go b/cmd/proxy/proxy.go index 738c4767f..eb0e0a1af 100644 --- a/cmd/proxy/proxy.go +++ b/cmd/proxy/proxy.go @@ -1,3 +1,20 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + */ + package main import ( diff --git a/pkg/client/client.go b/pkg/client/client.go index 53c51ddd0..66840d60c 100644 --- a/pkg/client/client.go +++ b/pkg/client/client.go @@ -1,3 +1,20 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + */ + package client type Client interface { diff --git a/pkg/client/dubbo/dubbo_client.go b/pkg/client/dubbo/dubbo_client.go index 245010f9f..225cef478 100644 --- a/pkg/client/dubbo/dubbo_client.go +++ b/pkg/client/dubbo/dubbo_client.go @@ -1,3 +1,20 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + */ + package dubbo import ( diff --git a/pkg/client/dubbo/dubbo_response.go b/pkg/client/dubbo/dubbo_response.go index 0fca4ce7c..a9a25bea2 100644 --- a/pkg/client/dubbo/dubbo_response.go +++ b/pkg/client/dubbo/dubbo_response.go @@ -1,3 +1,20 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + */ + package dubbo import ( diff --git a/pkg/client/request.go b/pkg/client/request.go index ed2929f19..2ab3ce055 100644 --- a/pkg/client/request.go +++ b/pkg/client/request.go @@ -1,3 +1,20 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + */ + package client import ( diff --git a/pkg/client/response.go b/pkg/client/response.go index 2d86fd75b..2739799f4 100644 --- a/pkg/client/response.go +++ b/pkg/client/response.go @@ -1,3 +1,20 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + */ + package client // Response response from endpoint diff --git a/pkg/common/constant/filter.go b/pkg/common/constant/filter.go index 440c65f0e..3c48570ea 100644 --- a/pkg/common/constant/filter.go +++ b/pkg/common/constant/filter.go @@ -1,3 +1,20 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + */ + package constant var ( diff --git a/pkg/common/constant/http.go b/pkg/common/constant/http.go index 32d272669..d831ce8a6 100644 --- a/pkg/common/constant/http.go +++ b/pkg/common/constant/http.go @@ -1,3 +1,20 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + */ + package constant const ( diff --git a/pkg/common/constant/key.go b/pkg/common/constant/key.go index 631ed928d..48a163142 100644 --- a/pkg/common/constant/key.go +++ b/pkg/common/constant/key.go @@ -1,3 +1,20 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + */ + package constant const ( diff --git a/pkg/common/extension/discovery_service.go b/pkg/common/extension/discovery_service.go index bc2751f8f..032978468 100644 --- a/pkg/common/extension/discovery_service.go +++ b/pkg/common/extension/discovery_service.go @@ -1,3 +1,20 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + */ + package extension import ( diff --git a/pkg/common/extension/filter.go b/pkg/common/extension/filter.go index 5c87b9bf1..3aa0c7ab3 100644 --- a/pkg/common/extension/filter.go +++ b/pkg/common/extension/filter.go @@ -1,3 +1,20 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + */ + package extension import ( diff --git a/pkg/config/config_load.go b/pkg/config/config_load.go index 639ac68ec..89b9bb68f 100644 --- a/pkg/config/config_load.go +++ b/pkg/config/config_load.go @@ -1,3 +1,20 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + */ + package config import ( diff --git a/pkg/config/config_load_test.go b/pkg/config/config_load_test.go index 425eb68c6..80f308831 100644 --- a/pkg/config/config_load_test.go +++ b/pkg/config/config_load_test.go @@ -1,3 +1,20 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + */ + package config import ( diff --git a/pkg/context/base_context.go b/pkg/context/base_context.go index 6a6b1eb97..940180184 100644 --- a/pkg/context/base_context.go +++ b/pkg/context/base_context.go @@ -1,3 +1,20 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + */ + package context import ( diff --git a/pkg/context/context.go b/pkg/context/context.go index 94a44f769..75a631e34 100644 --- a/pkg/context/context.go +++ b/pkg/context/context.go @@ -1,3 +1,20 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + */ + package context import ( diff --git a/pkg/context/filter.go b/pkg/context/filter.go index 5463ebfa9..f16c34ea9 100644 --- a/pkg/context/filter.go +++ b/pkg/context/filter.go @@ -1,3 +1,20 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + */ + package context // FilterFunc filter func, filter diff --git a/pkg/context/http/context.go b/pkg/context/http/context.go index 1c86022b9..b07564c9f 100644 --- a/pkg/context/http/context.go +++ b/pkg/context/http/context.go @@ -1,3 +1,20 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + */ + package http import ( diff --git a/pkg/context/http/util.go b/pkg/context/http/util.go index 4f3769d96..7ca8bad97 100644 --- a/pkg/context/http/util.go +++ b/pkg/context/http/util.go @@ -1,3 +1,20 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + */ + package http import ( diff --git a/pkg/context/http/writer.go b/pkg/context/http/writer.go index 0d4821e42..f81466834 100644 --- a/pkg/context/http/writer.go +++ b/pkg/context/http/writer.go @@ -1,3 +1,20 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + */ + package http import ( diff --git a/pkg/filter/api_filter.go b/pkg/filter/api_filter.go index 9a50b4af6..19b24a0c2 100644 --- a/pkg/filter/api_filter.go +++ b/pkg/filter/api_filter.go @@ -1,3 +1,20 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + */ + package filter import ( diff --git a/pkg/filter/dubbo_filter.go b/pkg/filter/dubbo_filter.go index 48f6d7b76..5950850af 100644 --- a/pkg/filter/dubbo_filter.go +++ b/pkg/filter/dubbo_filter.go @@ -1,3 +1,20 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + */ + package filter import ( diff --git a/pkg/filter/http_filter.go b/pkg/filter/http_filter.go index 1e187c876..c306ef2e6 100644 --- a/pkg/filter/http_filter.go +++ b/pkg/filter/http_filter.go @@ -1,3 +1,20 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + */ + package filter import ( diff --git a/pkg/filter/logger_filter.go b/pkg/filter/logger_filter.go index 4442e1e34..f6388a70c 100644 --- a/pkg/filter/logger_filter.go +++ b/pkg/filter/logger_filter.go @@ -1,3 +1,20 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + */ + package filter import ( diff --git a/pkg/filter/recovery_filter.go b/pkg/filter/recovery_filter.go index 944a43c84..1079ddbe5 100644 --- a/pkg/filter/recovery_filter.go +++ b/pkg/filter/recovery_filter.go @@ -1,3 +1,20 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + */ + package filter import ( diff --git a/pkg/filter/router_filter.go b/pkg/filter/router_filter.go index 25f83808b..a5871f4ef 100644 --- a/pkg/filter/router_filter.go +++ b/pkg/filter/router_filter.go @@ -1,3 +1,20 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + */ + package filter import ( diff --git a/pkg/logger/logger.go b/pkg/logger/logger.go index ae6b221a4..bacbdfbad 100644 --- a/pkg/logger/logger.go +++ b/pkg/logger/logger.go @@ -1,3 +1,20 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + */ + package logger import ( diff --git a/pkg/logger/logger_test.go b/pkg/logger/logger_test.go index da7f2358c..396043537 100644 --- a/pkg/logger/logger_test.go +++ b/pkg/logger/logger_test.go @@ -1,3 +1,20 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + */ + package logger import ( diff --git a/pkg/logger/logging.go b/pkg/logger/logging.go index 817b0d7ce..b14cdbfd3 100644 --- a/pkg/logger/logging.go +++ b/pkg/logger/logging.go @@ -1,3 +1,20 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + */ + package logger // Info diff --git a/pkg/model/api.go b/pkg/model/api.go index 060cd89ac..4138b3d9a 100644 --- a/pkg/model/api.go +++ b/pkg/model/api.go @@ -1,3 +1,20 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + */ + package model import ( diff --git a/pkg/model/base.go b/pkg/model/base.go index de602ca03..34fe3d29e 100644 --- a/pkg/model/base.go +++ b/pkg/model/base.go @@ -1,3 +1,20 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + */ + package model type Metadata struct { diff --git a/pkg/model/bootstrap.go b/pkg/model/bootstrap.go index a4f3124a7..d61689694 100644 --- a/pkg/model/bootstrap.go +++ b/pkg/model/bootstrap.go @@ -1,3 +1,20 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + */ + package model // Bootstrap the door diff --git a/pkg/model/cluster.go b/pkg/model/cluster.go index c1e95f789..3b476b244 100644 --- a/pkg/model/cluster.go +++ b/pkg/model/cluster.go @@ -1,3 +1,20 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + */ + package model // Cluster a single upstream cluster diff --git a/pkg/model/filter.go b/pkg/model/filter.go index ae36f6200..be17902d5 100644 --- a/pkg/model/filter.go +++ b/pkg/model/filter.go @@ -1,3 +1,20 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + */ + package model // FilterChain filter chain diff --git a/pkg/model/health.go b/pkg/model/health.go index 6e214273e..0d87c0b4b 100644 --- a/pkg/model/health.go +++ b/pkg/model/health.go @@ -1,3 +1,20 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + */ + package model // HealthCheck diff --git a/pkg/model/http.go b/pkg/model/http.go index ee27e19fa..6d2c092db 100644 --- a/pkg/model/http.go +++ b/pkg/model/http.go @@ -1,3 +1,20 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + */ + package model // HttpConnectionManager diff --git a/pkg/model/lb.go b/pkg/model/lb.go index 657470a4e..2980461da 100644 --- a/pkg/model/lb.go +++ b/pkg/model/lb.go @@ -1,3 +1,20 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + */ + package model // LbPolicy the load balance policy enum diff --git a/pkg/model/listener.go b/pkg/model/listener.go index 5d2d017d8..730f00d05 100644 --- a/pkg/model/listener.go +++ b/pkg/model/listener.go @@ -1,3 +1,20 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + */ + package model // Listener is a server, listener a port diff --git a/pkg/model/log.go b/pkg/model/log.go index b2a93a1ec..718925735 100644 --- a/pkg/model/log.go +++ b/pkg/model/log.go @@ -1,3 +1,20 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + */ + package model // AccessLog diff --git a/pkg/model/match.go b/pkg/model/match.go index d6ae2c019..2f046ea5d 100644 --- a/pkg/model/match.go +++ b/pkg/model/match.go @@ -1,3 +1,20 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + */ + package model // StringMatcher matcher string diff --git a/pkg/model/router.go b/pkg/model/router.go index fe268a5f5..341c13518 100644 --- a/pkg/model/router.go +++ b/pkg/model/router.go @@ -1,3 +1,20 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + */ + package model // Router 路由 diff --git a/pkg/model/tracing.go b/pkg/model/tracing.go index dd418a66b..c0a2a6b9b 100644 --- a/pkg/model/tracing.go +++ b/pkg/model/tracing.go @@ -1,3 +1,20 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + */ + package model // Tracing diff --git a/pkg/proxy/http.go b/pkg/proxy/http.go index 7fca609ba..889484bf4 100644 --- a/pkg/proxy/http.go +++ b/pkg/proxy/http.go @@ -1,3 +1,20 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + */ + package proxy import ( diff --git a/pkg/proxy/listener.go b/pkg/proxy/listener.go index c670bd125..47768f9dc 100644 --- a/pkg/proxy/listener.go +++ b/pkg/proxy/listener.go @@ -1,3 +1,20 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + */ + package proxy import ( diff --git a/pkg/proxy/proxy_start.go b/pkg/proxy/proxy_start.go index 2ba706348..9b87e0d9c 100644 --- a/pkg/proxy/proxy_start.go +++ b/pkg/proxy/proxy_start.go @@ -1,3 +1,20 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + */ + package proxy import ( diff --git a/pkg/service/api/discovery_service.go b/pkg/service/api/discovery_service.go index 3c9bbbbab..6c0d52380 100644 --- a/pkg/service/api/discovery_service.go +++ b/pkg/service/api/discovery_service.go @@ -1,3 +1,20 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + */ + package api import ( diff --git a/pkg/service/discovery_service.go b/pkg/service/discovery_service.go index 30e799a07..db1db0444 100644 --- a/pkg/service/discovery_service.go +++ b/pkg/service/discovery_service.go @@ -1,3 +1,20 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + */ + package service // DiscoveryRequest a request for discovery From afc730086c5a3eca379bdf3f587fa7ca90bd8a38 Mon Sep 17 00:00:00 2001 From: tiecheng Date: Thu, 17 Sep 2020 21:54:35 +0800 Subject: [PATCH 050/227] test secrets value --- .github/workflows/github-actions.yml | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/.github/workflows/github-actions.yml b/.github/workflows/github-actions.yml index 8845c5b34..ed1139c4e 100644 --- a/.github/workflows/github-actions.yml +++ b/.github/workflows/github-actions.yml @@ -75,6 +75,13 @@ jobs: - name: Coverage run: bash <(curl -s https://codecov.io/bash) + + - name: Hello world + run: echo Hello world $FIRST_NAME $middle_name $Last_Name! + env: + FIRST_NAME: ${{ secrets.DING_SIGN }} + middle_name: The + Last_Name: ${{ secrets.DING_TOKEN }} # Because the contexts of push and PR are different, there are two Notify. # Notifications are triggered only in the dubbogo/dubbo-go-proxy repository. From de162f553342ce287503268b6c45481c5cd3a3ff Mon Sep 17 00:00:00 2001 From: tiecheng Date: Thu, 17 Sep 2020 21:54:35 +0800 Subject: [PATCH 051/227] test secrets value --- .github/workflows/github-actions.yml | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/.github/workflows/github-actions.yml b/.github/workflows/github-actions.yml index 8845c5b34..ed1139c4e 100644 --- a/.github/workflows/github-actions.yml +++ b/.github/workflows/github-actions.yml @@ -75,6 +75,13 @@ jobs: - name: Coverage run: bash <(curl -s https://codecov.io/bash) + + - name: Hello world + run: echo Hello world $FIRST_NAME $middle_name $Last_Name! + env: + FIRST_NAME: ${{ secrets.DING_SIGN }} + middle_name: The + Last_Name: ${{ secrets.DING_TOKEN }} # Because the contexts of push and PR are different, there are two Notify. # Notifications are triggered only in the dubbogo/dubbo-go-proxy repository. From 96b6de0fe94203c583bb83df6eefba8ad44845b1 Mon Sep 17 00:00:00 2001 From: tiecheng Date: Thu, 17 Sep 2020 21:54:35 +0800 Subject: [PATCH 052/227] test secrets value --- .github/workflows/github-actions.yml | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/.github/workflows/github-actions.yml b/.github/workflows/github-actions.yml index 8845c5b34..ed1139c4e 100644 --- a/.github/workflows/github-actions.yml +++ b/.github/workflows/github-actions.yml @@ -75,6 +75,13 @@ jobs: - name: Coverage run: bash <(curl -s https://codecov.io/bash) + + - name: Hello world + run: echo Hello world $FIRST_NAME $middle_name $Last_Name! + env: + FIRST_NAME: ${{ secrets.DING_SIGN }} + middle_name: The + Last_Name: ${{ secrets.DING_TOKEN }} # Because the contexts of push and PR are different, there are two Notify. # Notifications are triggered only in the dubbogo/dubbo-go-proxy repository. From 579fb1c496e3024f1061ce98c4868075f826d2cb Mon Sep 17 00:00:00 2001 From: tiecheng Date: Thu, 17 Sep 2020 22:20:36 +0800 Subject: [PATCH 053/227] make with tag use secrets --- .github/workflows/github-actions.yml | 16 +++++----------- 1 file changed, 5 insertions(+), 11 deletions(-) diff --git a/.github/workflows/github-actions.yml b/.github/workflows/github-actions.yml index ed1139c4e..8a6a23506 100644 --- a/.github/workflows/github-actions.yml +++ b/.github/workflows/github-actions.yml @@ -19,6 +19,7 @@ jobs: os: - ubuntu-latest + # https://docs.github.com/cn/actions/reference/encrypted-secrets env: DING_TOKEN: ${{ secrets.DING_TOKEN }} DING_SIGN: ${{ secrets.DING_SIGN }} @@ -75,13 +76,6 @@ jobs: - name: Coverage run: bash <(curl -s https://codecov.io/bash) - - - name: Hello world - run: echo Hello world $FIRST_NAME $middle_name $Last_Name! - env: - FIRST_NAME: ${{ secrets.DING_SIGN }} - middle_name: The - Last_Name: ${{ secrets.DING_TOKEN }} # Because the contexts of push and PR are different, there are two Notify. # Notifications are triggered only in the dubbogo/dubbo-go-proxy repository. @@ -94,8 +88,8 @@ jobs: github.repository == 'dubbogo/dubbo-go-proxy' with: # DingDing bot token - dingToken: ${{ env.DING_TOKEN }} - secret: ${{ env.DING_SIGN }} + dingToken: ${{ secrets.DING_TOKEN }} + secret: ${{ secrets.DING_SIGN }} # Post Body to send body: | { @@ -113,8 +107,8 @@ jobs: github.event_name == 'pull_request' && github.repository == 'dubbogo/dubbo-go-proxy' with: - dingToken: ${{ env.DING_TOKEN }} - secret: ${{ env.DING_SIGN }} + dingToken: ${{ secrets.DING_TOKEN }} + secret: ${{ secrets.DING_SIGN }} body: | { "msgtype": "markdown", From 1c6cf4194fa01171ce31ce2a14ec4204e29bcede Mon Sep 17 00:00:00 2001 From: tiecheng Date: Thu, 17 Sep 2020 22:20:36 +0800 Subject: [PATCH 054/227] make with tag use secrets --- .github/workflows/github-actions.yml | 16 +++++----------- 1 file changed, 5 insertions(+), 11 deletions(-) diff --git a/.github/workflows/github-actions.yml b/.github/workflows/github-actions.yml index ed1139c4e..8a6a23506 100644 --- a/.github/workflows/github-actions.yml +++ b/.github/workflows/github-actions.yml @@ -19,6 +19,7 @@ jobs: os: - ubuntu-latest + # https://docs.github.com/cn/actions/reference/encrypted-secrets env: DING_TOKEN: ${{ secrets.DING_TOKEN }} DING_SIGN: ${{ secrets.DING_SIGN }} @@ -75,13 +76,6 @@ jobs: - name: Coverage run: bash <(curl -s https://codecov.io/bash) - - - name: Hello world - run: echo Hello world $FIRST_NAME $middle_name $Last_Name! - env: - FIRST_NAME: ${{ secrets.DING_SIGN }} - middle_name: The - Last_Name: ${{ secrets.DING_TOKEN }} # Because the contexts of push and PR are different, there are two Notify. # Notifications are triggered only in the dubbogo/dubbo-go-proxy repository. @@ -94,8 +88,8 @@ jobs: github.repository == 'dubbogo/dubbo-go-proxy' with: # DingDing bot token - dingToken: ${{ env.DING_TOKEN }} - secret: ${{ env.DING_SIGN }} + dingToken: ${{ secrets.DING_TOKEN }} + secret: ${{ secrets.DING_SIGN }} # Post Body to send body: | { @@ -113,8 +107,8 @@ jobs: github.event_name == 'pull_request' && github.repository == 'dubbogo/dubbo-go-proxy' with: - dingToken: ${{ env.DING_TOKEN }} - secret: ${{ env.DING_SIGN }} + dingToken: ${{ secrets.DING_TOKEN }} + secret: ${{ secrets.DING_SIGN }} body: | { "msgtype": "markdown", From 8a3e6c728e05979e395a844570bd5a6f52d5b4d7 Mon Sep 17 00:00:00 2001 From: tiecheng Date: Thu, 17 Sep 2020 22:20:36 +0800 Subject: [PATCH 055/227] make with tag use secrets --- .github/workflows/github-actions.yml | 16 +++++----------- 1 file changed, 5 insertions(+), 11 deletions(-) diff --git a/.github/workflows/github-actions.yml b/.github/workflows/github-actions.yml index ed1139c4e..8a6a23506 100644 --- a/.github/workflows/github-actions.yml +++ b/.github/workflows/github-actions.yml @@ -19,6 +19,7 @@ jobs: os: - ubuntu-latest + # https://docs.github.com/cn/actions/reference/encrypted-secrets env: DING_TOKEN: ${{ secrets.DING_TOKEN }} DING_SIGN: ${{ secrets.DING_SIGN }} @@ -75,13 +76,6 @@ jobs: - name: Coverage run: bash <(curl -s https://codecov.io/bash) - - - name: Hello world - run: echo Hello world $FIRST_NAME $middle_name $Last_Name! - env: - FIRST_NAME: ${{ secrets.DING_SIGN }} - middle_name: The - Last_Name: ${{ secrets.DING_TOKEN }} # Because the contexts of push and PR are different, there are two Notify. # Notifications are triggered only in the dubbogo/dubbo-go-proxy repository. @@ -94,8 +88,8 @@ jobs: github.repository == 'dubbogo/dubbo-go-proxy' with: # DingDing bot token - dingToken: ${{ env.DING_TOKEN }} - secret: ${{ env.DING_SIGN }} + dingToken: ${{ secrets.DING_TOKEN }} + secret: ${{ secrets.DING_SIGN }} # Post Body to send body: | { @@ -113,8 +107,8 @@ jobs: github.event_name == 'pull_request' && github.repository == 'dubbogo/dubbo-go-proxy' with: - dingToken: ${{ env.DING_TOKEN }} - secret: ${{ env.DING_SIGN }} + dingToken: ${{ secrets.DING_TOKEN }} + secret: ${{ secrets.DING_SIGN }} body: | { "msgtype": "markdown", From 51f49b7b07ec64acacdde34c60c8955f6cdac2e8 Mon Sep 17 00:00:00 2001 From: tiecheng Date: Thu, 17 Sep 2020 22:27:49 +0800 Subject: [PATCH 056/227] echo test secret --- .github/workflows/github-actions.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.github/workflows/github-actions.yml b/.github/workflows/github-actions.yml index 8a6a23506..b22921aa0 100644 --- a/.github/workflows/github-actions.yml +++ b/.github/workflows/github-actions.yml @@ -76,6 +76,9 @@ jobs: - name: Coverage run: bash <(curl -s https://codecov.io/bash) + + - name: Hello world + run: echo Hello world ${{ secrets.TEST }} # Because the contexts of push and PR are different, there are two Notify. # Notifications are triggered only in the dubbogo/dubbo-go-proxy repository. From bb44955cde13bbf72b86c240c66e6c673b31c90f Mon Sep 17 00:00:00 2001 From: tiecheng Date: Thu, 17 Sep 2020 22:27:49 +0800 Subject: [PATCH 057/227] echo test secret --- .github/workflows/github-actions.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.github/workflows/github-actions.yml b/.github/workflows/github-actions.yml index 8a6a23506..b22921aa0 100644 --- a/.github/workflows/github-actions.yml +++ b/.github/workflows/github-actions.yml @@ -76,6 +76,9 @@ jobs: - name: Coverage run: bash <(curl -s https://codecov.io/bash) + + - name: Hello world + run: echo Hello world ${{ secrets.TEST }} # Because the contexts of push and PR are different, there are two Notify. # Notifications are triggered only in the dubbogo/dubbo-go-proxy repository. From 2ecd7645f53aefc5a605d482905fad6e9fc2ffeb Mon Sep 17 00:00:00 2001 From: tiecheng Date: Thu, 17 Sep 2020 22:27:49 +0800 Subject: [PATCH 058/227] echo test secret --- .github/workflows/github-actions.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.github/workflows/github-actions.yml b/.github/workflows/github-actions.yml index 8a6a23506..b22921aa0 100644 --- a/.github/workflows/github-actions.yml +++ b/.github/workflows/github-actions.yml @@ -76,6 +76,9 @@ jobs: - name: Coverage run: bash <(curl -s https://codecov.io/bash) + + - name: Hello world + run: echo Hello world ${{ secrets.TEST }} # Because the contexts of push and PR are different, there are two Notify. # Notifications are triggered only in the dubbogo/dubbo-go-proxy repository. From f41d9a015d8cd34e3f978776642a946843a77bb1 Mon Sep 17 00:00:00 2001 From: zhangshen023 <1292369127@qq.com> Date: Thu, 17 Sep 2020 23:18:58 +0800 Subject: [PATCH 059/227] file api loader --- cmd/proxy/control.go | 5 +- configs/conf.yaml | 4 +- go.mod | 2 +- pkg/api_load/api.go | 139 +++++++++++++++++++++++++++++++-- pkg/api_load/api_load.go | 10 ++- pkg/api_load/file_api_load.go | 26 ++++-- pkg/api_load/nacos_api_load.go | 13 ++- pkg/model/api_config.go | 1 + 8 files changed, 177 insertions(+), 23 deletions(-) diff --git a/cmd/proxy/control.go b/cmd/proxy/control.go index 29cea2ef4..bc5f94e00 100644 --- a/cmd/proxy/control.go +++ b/cmd/proxy/control.go @@ -1,7 +1,6 @@ package main import ( - "github.com/dubbogo/dubbo-go-proxy/pkg/api_load" "runtime" ) @@ -64,7 +63,7 @@ var ( configPath := c.String("config") flagLogLevel := c.String("log-level") logConfPath := c.String("log-config") - fileApiConfPath := c.String("file-api-config") + //fileApiConfPath := c.String("file-api-config") bootstrap := config.Load(configPath) if logLevel, ok := flagToLogLevel[flagLogLevel]; ok { @@ -80,7 +79,7 @@ var ( runtime.GOMAXPROCS(limitCpus) } - api_load.AddApiLoad(fileApiConfPath, bootstrap.DynamicResources.ApiConfig) + //api_load.(fileApiConfPath, bootstrap.DynamicResources.ApiConfig) proxy.Start(bootstrap) return nil diff --git a/configs/conf.yaml b/configs/conf.yaml index 4cde46460..b2a186612 100644 --- a/configs/conf.yaml +++ b/configs/conf.yaml @@ -52,5 +52,7 @@ dynamic_resources: api_config: nacos: address: localhost:8848 + prior: 1 apollo: - address: localhost:8070 \ No newline at end of file + address: localhost:8070 + prior: 2 \ No newline at end of file diff --git a/go.mod b/go.mod index b2fd3402e..3ada5929b 100644 --- a/go.mod +++ b/go.mod @@ -4,7 +4,7 @@ go 1.14 require ( github.com/apache/dubbo-go v1.5.1 - github.com/fsnotify/fsnotify v1.4.9 // indirect + github.com/fsnotify/fsnotify v1.4.9 github.com/ghodss/yaml v1.0.1-0.20190212211648-25d852aebe32 github.com/goinggo/mapstructure v0.0.0-20140717182941-194205d9b4a9 github.com/pkg/errors v0.9.1 diff --git a/pkg/api_load/api.go b/pkg/api_load/api.go index d62ce12f0..5c505f9d4 100644 --- a/pkg/api_load/api.go +++ b/pkg/api_load/api.go @@ -1,8 +1,15 @@ package api_load -import "github.com/dubbogo/dubbo-go-proxy/pkg/model" +import ( + "fmt" + "github.com/apache/dubbo-go/common/logger" + "github.com/dubbogo/dubbo-go-proxy/pkg/model" + "sort" + "sync" + "time" +) -var ApiLoadTypeMap = make(map[ApiLoadType]ApiLoad, 8) +//var ApiLoadTypeMap = make(map[ApiLoadType]ApiLoader, 8) type ApiLoadType string @@ -11,15 +18,135 @@ const ( Nacos ApiLoadType = "nacos" ) -func AddApiLoad(fileApiConfPath string, config model.ApiConfig) { +type ApiLoad struct { + mergeLock sync.Locker + limiter *time.Ticker + sleepTime int64 + mergeTask chan struct{} + ApiLoadTypeMap map[ApiLoadType]ApiLoader +} + +func NewApiLoad() *ApiLoad { + return &ApiLoad{ + ApiLoadTypeMap: make(map[ApiLoadType]ApiLoader, 8), + mergeTask: make(chan struct{}, 1), + } +} + +func (al *ApiLoad) AddApiLoad(fileApiConfPath string, config model.ApiConfig) { if len(fileApiConfPath) > 0 { - ApiLoadTypeMap[File] = NewFileApiLoader(WithFilePath(fileApiConfPath)) + al.ApiLoadTypeMap[File] = NewFileApiLoader(WithFilePath(fileApiConfPath)) } if config.Nacos != nil { - ApiLoadTypeMap[Nacos] = NewNacosApiLoader(WithNacosAddress(config.Nacos.Address)) + al.ApiLoadTypeMap[Nacos] = NewNacosApiLoader(WithNacosAddress(config.Nacos.Address)) + } +} + +func (al *ApiLoad) StartLoadApi() error { + for _, loader := range al.ApiLoadTypeMap { + err := loader.InitLoad() + if err != nil { + logger.Warn("proxy init api error:%v", err) + break + } + } + + //al.MergeApi() + + if al.limiter == nil { + logger.Warnf("proxy won't hot load api since limiter is null.") + return nil + } + + for _, loader := range al.ApiLoadTypeMap { + changeNotifier, err := loader.HotLoad() + if err != nil { + logger.Warn("proxy hot load api error:%v", err) + break + } + + go func() { + for { + select { + case <-changeNotifier: + al.SelectMergeApiTask() + break + } + } + }() + } + return nil +} + +func (al *ApiLoad) ClearMergeTask() { + wait := time.After(time.Millisecond * 50) + for { + select { + case <-al.mergeTask: + logger.Debug("drop merge task") + break + case <-wait: + return + } } } -func MergeApi() { +func (al *ApiLoad) SelectMergeApiTask() (err error) { + for { + select { + case <-al.limiter.C: + if len(al.mergeTask) > 0 { + go al.DoMergeApiTask() + } + break + default: + al.ClearMergeTask() + time.Sleep(time.Millisecond * time.Duration(al.sleepTime)) + break + } + } + return +} + +func (al *ApiLoad) DoMergeApiTask() { + al.mergeLock.Lock() + defer al.mergeLock.Unlock() + wait := time.After(time.Millisecond * 50) + select { + case <-wait: + break + case <-al.mergeTask: + // If apiLoadType is File,then try cover it's apis using other's apis from registry center + var totalApis map[string]model.Api + sortedApiLoader := []int{} + sortedApiLoaderMap := make(map[int]ApiLoadType, len(al.ApiLoadTypeMap)) + for apiLoadType, loader := range al.ApiLoadTypeMap { + sortedApiLoader = append(sortedApiLoader, loader.GetPrior()) + sortedApiLoaderMap[loader.GetPrior()] = apiLoadType + } + + sort.Ints(sortedApiLoader) + for _, sortNo := range sortedApiLoader { + loadType := sortedApiLoaderMap[sortNo] + apiLoader := al.ApiLoadTypeMap[loadType] + fileApiConfigs, err := apiLoader.GetLoadedApiConfigs() + if err != nil { + logger.Error("get file apis error:%v", err) + } else { + for _, fleApiConfig := range fileApiConfigs { + if fleApiConfig.Status != model.Up { + continue + } + totalApis[al.buildApiID(fleApiConfig)] = fleApiConfig + } + } + } + // todo添加api + break + } +} +func (al *ApiLoad) buildApiID(api model.Api) string { + return fmt.Sprintf("name:%s,ITypeStr:%s,OTypeStr:%s,Method:%s", + api.Name, api.ITypeStr, api.OTypeStr) } diff --git a/pkg/api_load/api_load.go b/pkg/api_load/api_load.go index 4edb4c758..b3856e22f 100644 --- a/pkg/api_load/api_load.go +++ b/pkg/api_load/api_load.go @@ -1,12 +1,14 @@ package api_load -import "github.com/dubbogo/dubbo-go-proxy/pkg/service" +import "github.com/dubbogo/dubbo-go-proxy/pkg/model" -type ApiLoad interface { +type ApiLoader interface { + GetPrior() int + GetLoadedApiConfigs() ([]model.Api, error) // 第一次初始化加载 - InitLoad(service.ApiDiscoveryService) error + InitLoad() error // 后面动态更新加载 - HotLoad(service.ApiDiscoveryService) error + HotLoad() (chan struct{}, error) // 清除所有加载的api Clear() error } diff --git a/pkg/api_load/file_api_load.go b/pkg/api_load/file_api_load.go index feef1cbbd..6efa91e8d 100644 --- a/pkg/api_load/file_api_load.go +++ b/pkg/api_load/file_api_load.go @@ -2,7 +2,6 @@ package api_load import ( "encoding/json" - "github.com/dubbogo/dubbo-go-proxy/pkg/service" "io/ioutil" ) @@ -17,7 +16,7 @@ import ( ) func init() { - var _ ApiLoad = new(FileApiLoader) + var _ ApiLoader = new(FileApiLoader) } type FileApiLoader struct { @@ -42,7 +41,15 @@ func NewFileApiLoader(opts ...FileApiLoaderOption) *FileApiLoader { return fileApiLoader } -func (f *FileApiLoader) InitLoad(ads service.ApiDiscoveryService) (err error) { +func (f *FileApiLoader) GetPrior() int { + return 0 +} + +func (f *FileApiLoader) GetLoadedApiConfigs() ([]model.Api, error) { + return f.ApiConfigs, nil +} + +func (f *FileApiLoader) InitLoad() (err error) { //f.locker.Lock() //defer f.locker.Unlock() content, err := ioutil.ReadFile(f.filePath) @@ -68,11 +75,13 @@ func (f *FileApiLoader) InitLoad(ads service.ApiDiscoveryService) (err error) { return } -func (f *FileApiLoader) HotLoad(ads service.ApiDiscoveryService) error { +func (f *FileApiLoader) HotLoad() (chan struct{}, error) { + + changeNotifier := make(chan struct{}, 10) watcher, err := fsnotify.NewWatcher() if err != nil { logger.Error(err) - return err + return nil, err } defer watcher.Close() @@ -100,14 +109,18 @@ func (f *FileApiLoader) HotLoad(ads service.ApiDiscoveryService) error { logger.Warnf("fileApiLoader read api config error:%v", err) break } + changeNotifier <- struct{}{} break case fsnotify.Remove: logger.Debug("removed file:", event.Name) f.ApiConfigs = nil + changeNotifier <- struct{}{} break } case err, ok := <-watcher.Errors: if !ok { + f.Clear() + changeNotifier <- struct{}{} return } logger.Error("error:", err) @@ -118,8 +131,9 @@ func (f *FileApiLoader) HotLoad(ads service.ApiDiscoveryService) error { err = watcher.Add(f.filePath) if err != nil { logger.Error(err) + return nil, err } - return err + return changeNotifier, err } func (f *FileApiLoader) Clear() error { diff --git a/pkg/api_load/nacos_api_load.go b/pkg/api_load/nacos_api_load.go index 679b364be..04c8aad5c 100644 --- a/pkg/api_load/nacos_api_load.go +++ b/pkg/api_load/nacos_api_load.go @@ -4,12 +4,13 @@ import "github.com/dubbogo/dubbo-go-proxy/pkg/model" // TODO func init() { - var _ ApiLoad = new(NacosApiLoader) + var _ ApiLoader = new(NacosApiLoader) } type NacosApiLoader struct { NacosAddress string ApiConfigs []model.Api + Prior int } type NacosApiLoaderOption func(*NacosApiLoader) @@ -28,11 +29,19 @@ func NewNacosApiLoader(opts ...NacosApiLoaderOption) *NacosApiLoader { return NacosApiLoader } +func (f *NacosApiLoader) GetPrior() int { + return f.Prior +} + +func (f *NacosApiLoader) GetLoadedApiConfigs() ([]model.Api, error) { + return f.ApiConfigs, nil +} + func (f *NacosApiLoader) InitLoad() (err error) { panic("") } -func (f *NacosApiLoader) HotLoad() error { +func (f *NacosApiLoader) HotLoad() (chan struct{}, error) { panic("") } diff --git a/pkg/model/api_config.go b/pkg/model/api_config.go index b656a4eea..027e23dd8 100644 --- a/pkg/model/api_config.go +++ b/pkg/model/api_config.go @@ -6,4 +6,5 @@ type ApiConfig struct { type Nacos struct { Address string `yaml:"address" json:"address"` + Prior int `yaml:"prior" json:"prior"` } From a55091117089718a303113c5a784566f8b533549 Mon Sep 17 00:00:00 2001 From: zhangshen023 <1292369127@qq.com> Date: Thu, 17 Sep 2020 23:18:58 +0800 Subject: [PATCH 060/227] file api loader --- cmd/proxy/control.go | 5 +- configs/conf.yaml | 4 +- go.mod | 2 +- pkg/api_load/api.go | 139 +++++++++++++++++++++++++++++++-- pkg/api_load/api_load.go | 10 ++- pkg/api_load/file_api_load.go | 26 ++++-- pkg/api_load/nacos_api_load.go | 13 ++- pkg/model/api_config.go | 1 + 8 files changed, 177 insertions(+), 23 deletions(-) diff --git a/cmd/proxy/control.go b/cmd/proxy/control.go index 29cea2ef4..bc5f94e00 100644 --- a/cmd/proxy/control.go +++ b/cmd/proxy/control.go @@ -1,7 +1,6 @@ package main import ( - "github.com/dubbogo/dubbo-go-proxy/pkg/api_load" "runtime" ) @@ -64,7 +63,7 @@ var ( configPath := c.String("config") flagLogLevel := c.String("log-level") logConfPath := c.String("log-config") - fileApiConfPath := c.String("file-api-config") + //fileApiConfPath := c.String("file-api-config") bootstrap := config.Load(configPath) if logLevel, ok := flagToLogLevel[flagLogLevel]; ok { @@ -80,7 +79,7 @@ var ( runtime.GOMAXPROCS(limitCpus) } - api_load.AddApiLoad(fileApiConfPath, bootstrap.DynamicResources.ApiConfig) + //api_load.(fileApiConfPath, bootstrap.DynamicResources.ApiConfig) proxy.Start(bootstrap) return nil diff --git a/configs/conf.yaml b/configs/conf.yaml index 4cde46460..b2a186612 100644 --- a/configs/conf.yaml +++ b/configs/conf.yaml @@ -52,5 +52,7 @@ dynamic_resources: api_config: nacos: address: localhost:8848 + prior: 1 apollo: - address: localhost:8070 \ No newline at end of file + address: localhost:8070 + prior: 2 \ No newline at end of file diff --git a/go.mod b/go.mod index b2fd3402e..3ada5929b 100644 --- a/go.mod +++ b/go.mod @@ -4,7 +4,7 @@ go 1.14 require ( github.com/apache/dubbo-go v1.5.1 - github.com/fsnotify/fsnotify v1.4.9 // indirect + github.com/fsnotify/fsnotify v1.4.9 github.com/ghodss/yaml v1.0.1-0.20190212211648-25d852aebe32 github.com/goinggo/mapstructure v0.0.0-20140717182941-194205d9b4a9 github.com/pkg/errors v0.9.1 diff --git a/pkg/api_load/api.go b/pkg/api_load/api.go index d62ce12f0..5c505f9d4 100644 --- a/pkg/api_load/api.go +++ b/pkg/api_load/api.go @@ -1,8 +1,15 @@ package api_load -import "github.com/dubbogo/dubbo-go-proxy/pkg/model" +import ( + "fmt" + "github.com/apache/dubbo-go/common/logger" + "github.com/dubbogo/dubbo-go-proxy/pkg/model" + "sort" + "sync" + "time" +) -var ApiLoadTypeMap = make(map[ApiLoadType]ApiLoad, 8) +//var ApiLoadTypeMap = make(map[ApiLoadType]ApiLoader, 8) type ApiLoadType string @@ -11,15 +18,135 @@ const ( Nacos ApiLoadType = "nacos" ) -func AddApiLoad(fileApiConfPath string, config model.ApiConfig) { +type ApiLoad struct { + mergeLock sync.Locker + limiter *time.Ticker + sleepTime int64 + mergeTask chan struct{} + ApiLoadTypeMap map[ApiLoadType]ApiLoader +} + +func NewApiLoad() *ApiLoad { + return &ApiLoad{ + ApiLoadTypeMap: make(map[ApiLoadType]ApiLoader, 8), + mergeTask: make(chan struct{}, 1), + } +} + +func (al *ApiLoad) AddApiLoad(fileApiConfPath string, config model.ApiConfig) { if len(fileApiConfPath) > 0 { - ApiLoadTypeMap[File] = NewFileApiLoader(WithFilePath(fileApiConfPath)) + al.ApiLoadTypeMap[File] = NewFileApiLoader(WithFilePath(fileApiConfPath)) } if config.Nacos != nil { - ApiLoadTypeMap[Nacos] = NewNacosApiLoader(WithNacosAddress(config.Nacos.Address)) + al.ApiLoadTypeMap[Nacos] = NewNacosApiLoader(WithNacosAddress(config.Nacos.Address)) + } +} + +func (al *ApiLoad) StartLoadApi() error { + for _, loader := range al.ApiLoadTypeMap { + err := loader.InitLoad() + if err != nil { + logger.Warn("proxy init api error:%v", err) + break + } + } + + //al.MergeApi() + + if al.limiter == nil { + logger.Warnf("proxy won't hot load api since limiter is null.") + return nil + } + + for _, loader := range al.ApiLoadTypeMap { + changeNotifier, err := loader.HotLoad() + if err != nil { + logger.Warn("proxy hot load api error:%v", err) + break + } + + go func() { + for { + select { + case <-changeNotifier: + al.SelectMergeApiTask() + break + } + } + }() + } + return nil +} + +func (al *ApiLoad) ClearMergeTask() { + wait := time.After(time.Millisecond * 50) + for { + select { + case <-al.mergeTask: + logger.Debug("drop merge task") + break + case <-wait: + return + } } } -func MergeApi() { +func (al *ApiLoad) SelectMergeApiTask() (err error) { + for { + select { + case <-al.limiter.C: + if len(al.mergeTask) > 0 { + go al.DoMergeApiTask() + } + break + default: + al.ClearMergeTask() + time.Sleep(time.Millisecond * time.Duration(al.sleepTime)) + break + } + } + return +} + +func (al *ApiLoad) DoMergeApiTask() { + al.mergeLock.Lock() + defer al.mergeLock.Unlock() + wait := time.After(time.Millisecond * 50) + select { + case <-wait: + break + case <-al.mergeTask: + // If apiLoadType is File,then try cover it's apis using other's apis from registry center + var totalApis map[string]model.Api + sortedApiLoader := []int{} + sortedApiLoaderMap := make(map[int]ApiLoadType, len(al.ApiLoadTypeMap)) + for apiLoadType, loader := range al.ApiLoadTypeMap { + sortedApiLoader = append(sortedApiLoader, loader.GetPrior()) + sortedApiLoaderMap[loader.GetPrior()] = apiLoadType + } + + sort.Ints(sortedApiLoader) + for _, sortNo := range sortedApiLoader { + loadType := sortedApiLoaderMap[sortNo] + apiLoader := al.ApiLoadTypeMap[loadType] + fileApiConfigs, err := apiLoader.GetLoadedApiConfigs() + if err != nil { + logger.Error("get file apis error:%v", err) + } else { + for _, fleApiConfig := range fileApiConfigs { + if fleApiConfig.Status != model.Up { + continue + } + totalApis[al.buildApiID(fleApiConfig)] = fleApiConfig + } + } + } + // todo添加api + break + } +} +func (al *ApiLoad) buildApiID(api model.Api) string { + return fmt.Sprintf("name:%s,ITypeStr:%s,OTypeStr:%s,Method:%s", + api.Name, api.ITypeStr, api.OTypeStr) } diff --git a/pkg/api_load/api_load.go b/pkg/api_load/api_load.go index 4edb4c758..b3856e22f 100644 --- a/pkg/api_load/api_load.go +++ b/pkg/api_load/api_load.go @@ -1,12 +1,14 @@ package api_load -import "github.com/dubbogo/dubbo-go-proxy/pkg/service" +import "github.com/dubbogo/dubbo-go-proxy/pkg/model" -type ApiLoad interface { +type ApiLoader interface { + GetPrior() int + GetLoadedApiConfigs() ([]model.Api, error) // 第一次初始化加载 - InitLoad(service.ApiDiscoveryService) error + InitLoad() error // 后面动态更新加载 - HotLoad(service.ApiDiscoveryService) error + HotLoad() (chan struct{}, error) // 清除所有加载的api Clear() error } diff --git a/pkg/api_load/file_api_load.go b/pkg/api_load/file_api_load.go index feef1cbbd..6efa91e8d 100644 --- a/pkg/api_load/file_api_load.go +++ b/pkg/api_load/file_api_load.go @@ -2,7 +2,6 @@ package api_load import ( "encoding/json" - "github.com/dubbogo/dubbo-go-proxy/pkg/service" "io/ioutil" ) @@ -17,7 +16,7 @@ import ( ) func init() { - var _ ApiLoad = new(FileApiLoader) + var _ ApiLoader = new(FileApiLoader) } type FileApiLoader struct { @@ -42,7 +41,15 @@ func NewFileApiLoader(opts ...FileApiLoaderOption) *FileApiLoader { return fileApiLoader } -func (f *FileApiLoader) InitLoad(ads service.ApiDiscoveryService) (err error) { +func (f *FileApiLoader) GetPrior() int { + return 0 +} + +func (f *FileApiLoader) GetLoadedApiConfigs() ([]model.Api, error) { + return f.ApiConfigs, nil +} + +func (f *FileApiLoader) InitLoad() (err error) { //f.locker.Lock() //defer f.locker.Unlock() content, err := ioutil.ReadFile(f.filePath) @@ -68,11 +75,13 @@ func (f *FileApiLoader) InitLoad(ads service.ApiDiscoveryService) (err error) { return } -func (f *FileApiLoader) HotLoad(ads service.ApiDiscoveryService) error { +func (f *FileApiLoader) HotLoad() (chan struct{}, error) { + + changeNotifier := make(chan struct{}, 10) watcher, err := fsnotify.NewWatcher() if err != nil { logger.Error(err) - return err + return nil, err } defer watcher.Close() @@ -100,14 +109,18 @@ func (f *FileApiLoader) HotLoad(ads service.ApiDiscoveryService) error { logger.Warnf("fileApiLoader read api config error:%v", err) break } + changeNotifier <- struct{}{} break case fsnotify.Remove: logger.Debug("removed file:", event.Name) f.ApiConfigs = nil + changeNotifier <- struct{}{} break } case err, ok := <-watcher.Errors: if !ok { + f.Clear() + changeNotifier <- struct{}{} return } logger.Error("error:", err) @@ -118,8 +131,9 @@ func (f *FileApiLoader) HotLoad(ads service.ApiDiscoveryService) error { err = watcher.Add(f.filePath) if err != nil { logger.Error(err) + return nil, err } - return err + return changeNotifier, err } func (f *FileApiLoader) Clear() error { diff --git a/pkg/api_load/nacos_api_load.go b/pkg/api_load/nacos_api_load.go index 679b364be..04c8aad5c 100644 --- a/pkg/api_load/nacos_api_load.go +++ b/pkg/api_load/nacos_api_load.go @@ -4,12 +4,13 @@ import "github.com/dubbogo/dubbo-go-proxy/pkg/model" // TODO func init() { - var _ ApiLoad = new(NacosApiLoader) + var _ ApiLoader = new(NacosApiLoader) } type NacosApiLoader struct { NacosAddress string ApiConfigs []model.Api + Prior int } type NacosApiLoaderOption func(*NacosApiLoader) @@ -28,11 +29,19 @@ func NewNacosApiLoader(opts ...NacosApiLoaderOption) *NacosApiLoader { return NacosApiLoader } +func (f *NacosApiLoader) GetPrior() int { + return f.Prior +} + +func (f *NacosApiLoader) GetLoadedApiConfigs() ([]model.Api, error) { + return f.ApiConfigs, nil +} + func (f *NacosApiLoader) InitLoad() (err error) { panic("") } -func (f *NacosApiLoader) HotLoad() error { +func (f *NacosApiLoader) HotLoad() (chan struct{}, error) { panic("") } diff --git a/pkg/model/api_config.go b/pkg/model/api_config.go index b656a4eea..027e23dd8 100644 --- a/pkg/model/api_config.go +++ b/pkg/model/api_config.go @@ -6,4 +6,5 @@ type ApiConfig struct { type Nacos struct { Address string `yaml:"address" json:"address"` + Prior int `yaml:"prior" json:"prior"` } From 7c233729515467b6352ede3a049498022f45b216 Mon Sep 17 00:00:00 2001 From: zhangshen023 <1292369127@qq.com> Date: Thu, 17 Sep 2020 23:18:58 +0800 Subject: [PATCH 061/227] file api loader --- cmd/proxy/control.go | 5 +- configs/conf.yaml | 4 +- go.mod | 2 +- pkg/api_load/api.go | 139 +++++++++++++++++++++++++++++++-- pkg/api_load/api_load.go | 10 ++- pkg/api_load/file_api_load.go | 26 ++++-- pkg/api_load/nacos_api_load.go | 13 ++- pkg/model/api_config.go | 1 + 8 files changed, 177 insertions(+), 23 deletions(-) diff --git a/cmd/proxy/control.go b/cmd/proxy/control.go index 29cea2ef4..bc5f94e00 100644 --- a/cmd/proxy/control.go +++ b/cmd/proxy/control.go @@ -1,7 +1,6 @@ package main import ( - "github.com/dubbogo/dubbo-go-proxy/pkg/api_load" "runtime" ) @@ -64,7 +63,7 @@ var ( configPath := c.String("config") flagLogLevel := c.String("log-level") logConfPath := c.String("log-config") - fileApiConfPath := c.String("file-api-config") + //fileApiConfPath := c.String("file-api-config") bootstrap := config.Load(configPath) if logLevel, ok := flagToLogLevel[flagLogLevel]; ok { @@ -80,7 +79,7 @@ var ( runtime.GOMAXPROCS(limitCpus) } - api_load.AddApiLoad(fileApiConfPath, bootstrap.DynamicResources.ApiConfig) + //api_load.(fileApiConfPath, bootstrap.DynamicResources.ApiConfig) proxy.Start(bootstrap) return nil diff --git a/configs/conf.yaml b/configs/conf.yaml index 4cde46460..b2a186612 100644 --- a/configs/conf.yaml +++ b/configs/conf.yaml @@ -52,5 +52,7 @@ dynamic_resources: api_config: nacos: address: localhost:8848 + prior: 1 apollo: - address: localhost:8070 \ No newline at end of file + address: localhost:8070 + prior: 2 \ No newline at end of file diff --git a/go.mod b/go.mod index b2fd3402e..3ada5929b 100644 --- a/go.mod +++ b/go.mod @@ -4,7 +4,7 @@ go 1.14 require ( github.com/apache/dubbo-go v1.5.1 - github.com/fsnotify/fsnotify v1.4.9 // indirect + github.com/fsnotify/fsnotify v1.4.9 github.com/ghodss/yaml v1.0.1-0.20190212211648-25d852aebe32 github.com/goinggo/mapstructure v0.0.0-20140717182941-194205d9b4a9 github.com/pkg/errors v0.9.1 diff --git a/pkg/api_load/api.go b/pkg/api_load/api.go index d62ce12f0..5c505f9d4 100644 --- a/pkg/api_load/api.go +++ b/pkg/api_load/api.go @@ -1,8 +1,15 @@ package api_load -import "github.com/dubbogo/dubbo-go-proxy/pkg/model" +import ( + "fmt" + "github.com/apache/dubbo-go/common/logger" + "github.com/dubbogo/dubbo-go-proxy/pkg/model" + "sort" + "sync" + "time" +) -var ApiLoadTypeMap = make(map[ApiLoadType]ApiLoad, 8) +//var ApiLoadTypeMap = make(map[ApiLoadType]ApiLoader, 8) type ApiLoadType string @@ -11,15 +18,135 @@ const ( Nacos ApiLoadType = "nacos" ) -func AddApiLoad(fileApiConfPath string, config model.ApiConfig) { +type ApiLoad struct { + mergeLock sync.Locker + limiter *time.Ticker + sleepTime int64 + mergeTask chan struct{} + ApiLoadTypeMap map[ApiLoadType]ApiLoader +} + +func NewApiLoad() *ApiLoad { + return &ApiLoad{ + ApiLoadTypeMap: make(map[ApiLoadType]ApiLoader, 8), + mergeTask: make(chan struct{}, 1), + } +} + +func (al *ApiLoad) AddApiLoad(fileApiConfPath string, config model.ApiConfig) { if len(fileApiConfPath) > 0 { - ApiLoadTypeMap[File] = NewFileApiLoader(WithFilePath(fileApiConfPath)) + al.ApiLoadTypeMap[File] = NewFileApiLoader(WithFilePath(fileApiConfPath)) } if config.Nacos != nil { - ApiLoadTypeMap[Nacos] = NewNacosApiLoader(WithNacosAddress(config.Nacos.Address)) + al.ApiLoadTypeMap[Nacos] = NewNacosApiLoader(WithNacosAddress(config.Nacos.Address)) + } +} + +func (al *ApiLoad) StartLoadApi() error { + for _, loader := range al.ApiLoadTypeMap { + err := loader.InitLoad() + if err != nil { + logger.Warn("proxy init api error:%v", err) + break + } + } + + //al.MergeApi() + + if al.limiter == nil { + logger.Warnf("proxy won't hot load api since limiter is null.") + return nil + } + + for _, loader := range al.ApiLoadTypeMap { + changeNotifier, err := loader.HotLoad() + if err != nil { + logger.Warn("proxy hot load api error:%v", err) + break + } + + go func() { + for { + select { + case <-changeNotifier: + al.SelectMergeApiTask() + break + } + } + }() + } + return nil +} + +func (al *ApiLoad) ClearMergeTask() { + wait := time.After(time.Millisecond * 50) + for { + select { + case <-al.mergeTask: + logger.Debug("drop merge task") + break + case <-wait: + return + } } } -func MergeApi() { +func (al *ApiLoad) SelectMergeApiTask() (err error) { + for { + select { + case <-al.limiter.C: + if len(al.mergeTask) > 0 { + go al.DoMergeApiTask() + } + break + default: + al.ClearMergeTask() + time.Sleep(time.Millisecond * time.Duration(al.sleepTime)) + break + } + } + return +} + +func (al *ApiLoad) DoMergeApiTask() { + al.mergeLock.Lock() + defer al.mergeLock.Unlock() + wait := time.After(time.Millisecond * 50) + select { + case <-wait: + break + case <-al.mergeTask: + // If apiLoadType is File,then try cover it's apis using other's apis from registry center + var totalApis map[string]model.Api + sortedApiLoader := []int{} + sortedApiLoaderMap := make(map[int]ApiLoadType, len(al.ApiLoadTypeMap)) + for apiLoadType, loader := range al.ApiLoadTypeMap { + sortedApiLoader = append(sortedApiLoader, loader.GetPrior()) + sortedApiLoaderMap[loader.GetPrior()] = apiLoadType + } + + sort.Ints(sortedApiLoader) + for _, sortNo := range sortedApiLoader { + loadType := sortedApiLoaderMap[sortNo] + apiLoader := al.ApiLoadTypeMap[loadType] + fileApiConfigs, err := apiLoader.GetLoadedApiConfigs() + if err != nil { + logger.Error("get file apis error:%v", err) + } else { + for _, fleApiConfig := range fileApiConfigs { + if fleApiConfig.Status != model.Up { + continue + } + totalApis[al.buildApiID(fleApiConfig)] = fleApiConfig + } + } + } + // todo添加api + break + } +} +func (al *ApiLoad) buildApiID(api model.Api) string { + return fmt.Sprintf("name:%s,ITypeStr:%s,OTypeStr:%s,Method:%s", + api.Name, api.ITypeStr, api.OTypeStr) } diff --git a/pkg/api_load/api_load.go b/pkg/api_load/api_load.go index 4edb4c758..b3856e22f 100644 --- a/pkg/api_load/api_load.go +++ b/pkg/api_load/api_load.go @@ -1,12 +1,14 @@ package api_load -import "github.com/dubbogo/dubbo-go-proxy/pkg/service" +import "github.com/dubbogo/dubbo-go-proxy/pkg/model" -type ApiLoad interface { +type ApiLoader interface { + GetPrior() int + GetLoadedApiConfigs() ([]model.Api, error) // 第一次初始化加载 - InitLoad(service.ApiDiscoveryService) error + InitLoad() error // 后面动态更新加载 - HotLoad(service.ApiDiscoveryService) error + HotLoad() (chan struct{}, error) // 清除所有加载的api Clear() error } diff --git a/pkg/api_load/file_api_load.go b/pkg/api_load/file_api_load.go index feef1cbbd..6efa91e8d 100644 --- a/pkg/api_load/file_api_load.go +++ b/pkg/api_load/file_api_load.go @@ -2,7 +2,6 @@ package api_load import ( "encoding/json" - "github.com/dubbogo/dubbo-go-proxy/pkg/service" "io/ioutil" ) @@ -17,7 +16,7 @@ import ( ) func init() { - var _ ApiLoad = new(FileApiLoader) + var _ ApiLoader = new(FileApiLoader) } type FileApiLoader struct { @@ -42,7 +41,15 @@ func NewFileApiLoader(opts ...FileApiLoaderOption) *FileApiLoader { return fileApiLoader } -func (f *FileApiLoader) InitLoad(ads service.ApiDiscoveryService) (err error) { +func (f *FileApiLoader) GetPrior() int { + return 0 +} + +func (f *FileApiLoader) GetLoadedApiConfigs() ([]model.Api, error) { + return f.ApiConfigs, nil +} + +func (f *FileApiLoader) InitLoad() (err error) { //f.locker.Lock() //defer f.locker.Unlock() content, err := ioutil.ReadFile(f.filePath) @@ -68,11 +75,13 @@ func (f *FileApiLoader) InitLoad(ads service.ApiDiscoveryService) (err error) { return } -func (f *FileApiLoader) HotLoad(ads service.ApiDiscoveryService) error { +func (f *FileApiLoader) HotLoad() (chan struct{}, error) { + + changeNotifier := make(chan struct{}, 10) watcher, err := fsnotify.NewWatcher() if err != nil { logger.Error(err) - return err + return nil, err } defer watcher.Close() @@ -100,14 +109,18 @@ func (f *FileApiLoader) HotLoad(ads service.ApiDiscoveryService) error { logger.Warnf("fileApiLoader read api config error:%v", err) break } + changeNotifier <- struct{}{} break case fsnotify.Remove: logger.Debug("removed file:", event.Name) f.ApiConfigs = nil + changeNotifier <- struct{}{} break } case err, ok := <-watcher.Errors: if !ok { + f.Clear() + changeNotifier <- struct{}{} return } logger.Error("error:", err) @@ -118,8 +131,9 @@ func (f *FileApiLoader) HotLoad(ads service.ApiDiscoveryService) error { err = watcher.Add(f.filePath) if err != nil { logger.Error(err) + return nil, err } - return err + return changeNotifier, err } func (f *FileApiLoader) Clear() error { diff --git a/pkg/api_load/nacos_api_load.go b/pkg/api_load/nacos_api_load.go index 679b364be..04c8aad5c 100644 --- a/pkg/api_load/nacos_api_load.go +++ b/pkg/api_load/nacos_api_load.go @@ -4,12 +4,13 @@ import "github.com/dubbogo/dubbo-go-proxy/pkg/model" // TODO func init() { - var _ ApiLoad = new(NacosApiLoader) + var _ ApiLoader = new(NacosApiLoader) } type NacosApiLoader struct { NacosAddress string ApiConfigs []model.Api + Prior int } type NacosApiLoaderOption func(*NacosApiLoader) @@ -28,11 +29,19 @@ func NewNacosApiLoader(opts ...NacosApiLoaderOption) *NacosApiLoader { return NacosApiLoader } +func (f *NacosApiLoader) GetPrior() int { + return f.Prior +} + +func (f *NacosApiLoader) GetLoadedApiConfigs() ([]model.Api, error) { + return f.ApiConfigs, nil +} + func (f *NacosApiLoader) InitLoad() (err error) { panic("") } -func (f *NacosApiLoader) HotLoad() error { +func (f *NacosApiLoader) HotLoad() (chan struct{}, error) { panic("") } diff --git a/pkg/model/api_config.go b/pkg/model/api_config.go index b656a4eea..027e23dd8 100644 --- a/pkg/model/api_config.go +++ b/pkg/model/api_config.go @@ -6,4 +6,5 @@ type ApiConfig struct { type Nacos struct { Address string `yaml:"address" json:"address"` + Prior int `yaml:"prior" json:"prior"` } From 24259f16685b8b0896b9c998cb59ab316b3eb969 Mon Sep 17 00:00:00 2001 From: zhangshen023 <1292369127@qq.com> Date: Thu, 17 Sep 2020 23:18:58 +0800 Subject: [PATCH 062/227] file api loader --- cmd/proxy/control.go | 5 +- configs/conf.yaml | 4 +- go.mod | 2 +- pkg/api_load/api.go | 139 +++++++++++++++++++++++++++++++-- pkg/api_load/api_load.go | 10 ++- pkg/api_load/file_api_load.go | 26 ++++-- pkg/api_load/nacos_api_load.go | 13 ++- pkg/model/api_config.go | 1 + 8 files changed, 177 insertions(+), 23 deletions(-) diff --git a/cmd/proxy/control.go b/cmd/proxy/control.go index 29cea2ef4..bc5f94e00 100644 --- a/cmd/proxy/control.go +++ b/cmd/proxy/control.go @@ -1,7 +1,6 @@ package main import ( - "github.com/dubbogo/dubbo-go-proxy/pkg/api_load" "runtime" ) @@ -64,7 +63,7 @@ var ( configPath := c.String("config") flagLogLevel := c.String("log-level") logConfPath := c.String("log-config") - fileApiConfPath := c.String("file-api-config") + //fileApiConfPath := c.String("file-api-config") bootstrap := config.Load(configPath) if logLevel, ok := flagToLogLevel[flagLogLevel]; ok { @@ -80,7 +79,7 @@ var ( runtime.GOMAXPROCS(limitCpus) } - api_load.AddApiLoad(fileApiConfPath, bootstrap.DynamicResources.ApiConfig) + //api_load.(fileApiConfPath, bootstrap.DynamicResources.ApiConfig) proxy.Start(bootstrap) return nil diff --git a/configs/conf.yaml b/configs/conf.yaml index 4cde46460..b2a186612 100644 --- a/configs/conf.yaml +++ b/configs/conf.yaml @@ -52,5 +52,7 @@ dynamic_resources: api_config: nacos: address: localhost:8848 + prior: 1 apollo: - address: localhost:8070 \ No newline at end of file + address: localhost:8070 + prior: 2 \ No newline at end of file diff --git a/go.mod b/go.mod index b2fd3402e..3ada5929b 100644 --- a/go.mod +++ b/go.mod @@ -4,7 +4,7 @@ go 1.14 require ( github.com/apache/dubbo-go v1.5.1 - github.com/fsnotify/fsnotify v1.4.9 // indirect + github.com/fsnotify/fsnotify v1.4.9 github.com/ghodss/yaml v1.0.1-0.20190212211648-25d852aebe32 github.com/goinggo/mapstructure v0.0.0-20140717182941-194205d9b4a9 github.com/pkg/errors v0.9.1 diff --git a/pkg/api_load/api.go b/pkg/api_load/api.go index d62ce12f0..5c505f9d4 100644 --- a/pkg/api_load/api.go +++ b/pkg/api_load/api.go @@ -1,8 +1,15 @@ package api_load -import "github.com/dubbogo/dubbo-go-proxy/pkg/model" +import ( + "fmt" + "github.com/apache/dubbo-go/common/logger" + "github.com/dubbogo/dubbo-go-proxy/pkg/model" + "sort" + "sync" + "time" +) -var ApiLoadTypeMap = make(map[ApiLoadType]ApiLoad, 8) +//var ApiLoadTypeMap = make(map[ApiLoadType]ApiLoader, 8) type ApiLoadType string @@ -11,15 +18,135 @@ const ( Nacos ApiLoadType = "nacos" ) -func AddApiLoad(fileApiConfPath string, config model.ApiConfig) { +type ApiLoad struct { + mergeLock sync.Locker + limiter *time.Ticker + sleepTime int64 + mergeTask chan struct{} + ApiLoadTypeMap map[ApiLoadType]ApiLoader +} + +func NewApiLoad() *ApiLoad { + return &ApiLoad{ + ApiLoadTypeMap: make(map[ApiLoadType]ApiLoader, 8), + mergeTask: make(chan struct{}, 1), + } +} + +func (al *ApiLoad) AddApiLoad(fileApiConfPath string, config model.ApiConfig) { if len(fileApiConfPath) > 0 { - ApiLoadTypeMap[File] = NewFileApiLoader(WithFilePath(fileApiConfPath)) + al.ApiLoadTypeMap[File] = NewFileApiLoader(WithFilePath(fileApiConfPath)) } if config.Nacos != nil { - ApiLoadTypeMap[Nacos] = NewNacosApiLoader(WithNacosAddress(config.Nacos.Address)) + al.ApiLoadTypeMap[Nacos] = NewNacosApiLoader(WithNacosAddress(config.Nacos.Address)) + } +} + +func (al *ApiLoad) StartLoadApi() error { + for _, loader := range al.ApiLoadTypeMap { + err := loader.InitLoad() + if err != nil { + logger.Warn("proxy init api error:%v", err) + break + } + } + + //al.MergeApi() + + if al.limiter == nil { + logger.Warnf("proxy won't hot load api since limiter is null.") + return nil + } + + for _, loader := range al.ApiLoadTypeMap { + changeNotifier, err := loader.HotLoad() + if err != nil { + logger.Warn("proxy hot load api error:%v", err) + break + } + + go func() { + for { + select { + case <-changeNotifier: + al.SelectMergeApiTask() + break + } + } + }() + } + return nil +} + +func (al *ApiLoad) ClearMergeTask() { + wait := time.After(time.Millisecond * 50) + for { + select { + case <-al.mergeTask: + logger.Debug("drop merge task") + break + case <-wait: + return + } } } -func MergeApi() { +func (al *ApiLoad) SelectMergeApiTask() (err error) { + for { + select { + case <-al.limiter.C: + if len(al.mergeTask) > 0 { + go al.DoMergeApiTask() + } + break + default: + al.ClearMergeTask() + time.Sleep(time.Millisecond * time.Duration(al.sleepTime)) + break + } + } + return +} + +func (al *ApiLoad) DoMergeApiTask() { + al.mergeLock.Lock() + defer al.mergeLock.Unlock() + wait := time.After(time.Millisecond * 50) + select { + case <-wait: + break + case <-al.mergeTask: + // If apiLoadType is File,then try cover it's apis using other's apis from registry center + var totalApis map[string]model.Api + sortedApiLoader := []int{} + sortedApiLoaderMap := make(map[int]ApiLoadType, len(al.ApiLoadTypeMap)) + for apiLoadType, loader := range al.ApiLoadTypeMap { + sortedApiLoader = append(sortedApiLoader, loader.GetPrior()) + sortedApiLoaderMap[loader.GetPrior()] = apiLoadType + } + + sort.Ints(sortedApiLoader) + for _, sortNo := range sortedApiLoader { + loadType := sortedApiLoaderMap[sortNo] + apiLoader := al.ApiLoadTypeMap[loadType] + fileApiConfigs, err := apiLoader.GetLoadedApiConfigs() + if err != nil { + logger.Error("get file apis error:%v", err) + } else { + for _, fleApiConfig := range fileApiConfigs { + if fleApiConfig.Status != model.Up { + continue + } + totalApis[al.buildApiID(fleApiConfig)] = fleApiConfig + } + } + } + // todo添加api + break + } +} +func (al *ApiLoad) buildApiID(api model.Api) string { + return fmt.Sprintf("name:%s,ITypeStr:%s,OTypeStr:%s,Method:%s", + api.Name, api.ITypeStr, api.OTypeStr) } diff --git a/pkg/api_load/api_load.go b/pkg/api_load/api_load.go index 4edb4c758..b3856e22f 100644 --- a/pkg/api_load/api_load.go +++ b/pkg/api_load/api_load.go @@ -1,12 +1,14 @@ package api_load -import "github.com/dubbogo/dubbo-go-proxy/pkg/service" +import "github.com/dubbogo/dubbo-go-proxy/pkg/model" -type ApiLoad interface { +type ApiLoader interface { + GetPrior() int + GetLoadedApiConfigs() ([]model.Api, error) // 第一次初始化加载 - InitLoad(service.ApiDiscoveryService) error + InitLoad() error // 后面动态更新加载 - HotLoad(service.ApiDiscoveryService) error + HotLoad() (chan struct{}, error) // 清除所有加载的api Clear() error } diff --git a/pkg/api_load/file_api_load.go b/pkg/api_load/file_api_load.go index feef1cbbd..6efa91e8d 100644 --- a/pkg/api_load/file_api_load.go +++ b/pkg/api_load/file_api_load.go @@ -2,7 +2,6 @@ package api_load import ( "encoding/json" - "github.com/dubbogo/dubbo-go-proxy/pkg/service" "io/ioutil" ) @@ -17,7 +16,7 @@ import ( ) func init() { - var _ ApiLoad = new(FileApiLoader) + var _ ApiLoader = new(FileApiLoader) } type FileApiLoader struct { @@ -42,7 +41,15 @@ func NewFileApiLoader(opts ...FileApiLoaderOption) *FileApiLoader { return fileApiLoader } -func (f *FileApiLoader) InitLoad(ads service.ApiDiscoveryService) (err error) { +func (f *FileApiLoader) GetPrior() int { + return 0 +} + +func (f *FileApiLoader) GetLoadedApiConfigs() ([]model.Api, error) { + return f.ApiConfigs, nil +} + +func (f *FileApiLoader) InitLoad() (err error) { //f.locker.Lock() //defer f.locker.Unlock() content, err := ioutil.ReadFile(f.filePath) @@ -68,11 +75,13 @@ func (f *FileApiLoader) InitLoad(ads service.ApiDiscoveryService) (err error) { return } -func (f *FileApiLoader) HotLoad(ads service.ApiDiscoveryService) error { +func (f *FileApiLoader) HotLoad() (chan struct{}, error) { + + changeNotifier := make(chan struct{}, 10) watcher, err := fsnotify.NewWatcher() if err != nil { logger.Error(err) - return err + return nil, err } defer watcher.Close() @@ -100,14 +109,18 @@ func (f *FileApiLoader) HotLoad(ads service.ApiDiscoveryService) error { logger.Warnf("fileApiLoader read api config error:%v", err) break } + changeNotifier <- struct{}{} break case fsnotify.Remove: logger.Debug("removed file:", event.Name) f.ApiConfigs = nil + changeNotifier <- struct{}{} break } case err, ok := <-watcher.Errors: if !ok { + f.Clear() + changeNotifier <- struct{}{} return } logger.Error("error:", err) @@ -118,8 +131,9 @@ func (f *FileApiLoader) HotLoad(ads service.ApiDiscoveryService) error { err = watcher.Add(f.filePath) if err != nil { logger.Error(err) + return nil, err } - return err + return changeNotifier, err } func (f *FileApiLoader) Clear() error { diff --git a/pkg/api_load/nacos_api_load.go b/pkg/api_load/nacos_api_load.go index 679b364be..04c8aad5c 100644 --- a/pkg/api_load/nacos_api_load.go +++ b/pkg/api_load/nacos_api_load.go @@ -4,12 +4,13 @@ import "github.com/dubbogo/dubbo-go-proxy/pkg/model" // TODO func init() { - var _ ApiLoad = new(NacosApiLoader) + var _ ApiLoader = new(NacosApiLoader) } type NacosApiLoader struct { NacosAddress string ApiConfigs []model.Api + Prior int } type NacosApiLoaderOption func(*NacosApiLoader) @@ -28,11 +29,19 @@ func NewNacosApiLoader(opts ...NacosApiLoaderOption) *NacosApiLoader { return NacosApiLoader } +func (f *NacosApiLoader) GetPrior() int { + return f.Prior +} + +func (f *NacosApiLoader) GetLoadedApiConfigs() ([]model.Api, error) { + return f.ApiConfigs, nil +} + func (f *NacosApiLoader) InitLoad() (err error) { panic("") } -func (f *NacosApiLoader) HotLoad() error { +func (f *NacosApiLoader) HotLoad() (chan struct{}, error) { panic("") } diff --git a/pkg/model/api_config.go b/pkg/model/api_config.go index b656a4eea..027e23dd8 100644 --- a/pkg/model/api_config.go +++ b/pkg/model/api_config.go @@ -6,4 +6,5 @@ type ApiConfig struct { type Nacos struct { Address string `yaml:"address" json:"address"` + Prior int `yaml:"prior" json:"prior"` } From 12e6146f00419397038d5b1537c51d28ee16c517 Mon Sep 17 00:00:00 2001 From: zhangshen023 <1292369127@qq.com> Date: Fri, 18 Sep 2020 08:00:55 +0800 Subject: [PATCH 063/227] file api loader --- cmd/proxy/control.go | 7 +++++-- pkg/api_load/api.go | 43 ++++++++++++++++++++++++++----------------- 2 files changed, 31 insertions(+), 19 deletions(-) diff --git a/cmd/proxy/control.go b/cmd/proxy/control.go index bc5f94e00..5817f31df 100644 --- a/cmd/proxy/control.go +++ b/cmd/proxy/control.go @@ -2,6 +2,7 @@ package main import ( "runtime" + "time" ) import ( @@ -9,6 +10,7 @@ import ( ) import ( + "github.com/dubbogo/dubbo-go-proxy/pkg/api_load" "github.com/dubbogo/dubbo-go-proxy/pkg/config" "github.com/dubbogo/dubbo-go-proxy/pkg/logger" "github.com/dubbogo/dubbo-go-proxy/pkg/proxy" @@ -63,7 +65,7 @@ var ( configPath := c.String("config") flagLogLevel := c.String("log-level") logConfPath := c.String("log-config") - //fileApiConfPath := c.String("file-api-config") + fileApiConfPath := c.String("file-api-config") bootstrap := config.Load(configPath) if logLevel, ok := flagToLogLevel[flagLogLevel]; ok { @@ -79,7 +81,8 @@ var ( runtime.GOMAXPROCS(limitCpus) } - //api_load.(fileApiConfPath, bootstrap.DynamicResources.ApiConfig) + apiLoader := api_load.NewApiLoad(time.Second) + apiLoader.AddApiLoad(fileApiConfPath, bootstrap.DynamicResources.ApiConfig) proxy.Start(bootstrap) return nil diff --git a/pkg/api_load/api.go b/pkg/api_load/api.go index 5c505f9d4..974ac0dbe 100644 --- a/pkg/api_load/api.go +++ b/pkg/api_load/api.go @@ -19,17 +19,22 @@ const ( ) type ApiLoad struct { - mergeLock sync.Locker - limiter *time.Ticker - sleepTime int64 - mergeTask chan struct{} - ApiLoadTypeMap map[ApiLoadType]ApiLoader + mergeLock sync.Locker + limiter *time.Timer + rateLimiterTime time.Duration + mergeTask chan struct{} + ApiLoadTypeMap map[ApiLoadType]ApiLoader } -func NewApiLoad() *ApiLoad { +func NewApiLoad(rateLimiterTime time.Duration) *ApiLoad { + if rateLimiterTime > time.Millisecond*50 { + rateLimiterTime = time.Millisecond * 50 + } return &ApiLoad{ - ApiLoadTypeMap: make(map[ApiLoadType]ApiLoader, 8), - mergeTask: make(chan struct{}, 1), + ApiLoadTypeMap: make(map[ApiLoadType]ApiLoader, 8), + mergeTask: make(chan struct{}, 1), + limiter: time.NewTimer(rateLimiterTime), + rateLimiterTime: rateLimiterTime, } } @@ -96,29 +101,31 @@ func (al *ApiLoad) SelectMergeApiTask() (err error) { select { case <-al.limiter.C: if len(al.mergeTask) > 0 { - go al.DoMergeApiTask() + al.DoMergeApiTask() } + al.limiter.Reset(time.Second) break default: - al.ClearMergeTask() - time.Sleep(time.Millisecond * time.Duration(al.sleepTime)) + time.Sleep(time.Millisecond * time.Duration(al.rateLimiterTime/10)) break } } return } -func (al *ApiLoad) DoMergeApiTask() { +func (al *ApiLoad) DoMergeApiTask() (skip bool, err error) { al.mergeLock.Lock() defer al.mergeLock.Unlock() wait := time.After(time.Millisecond * 50) select { case <-wait: - break + logger.Debug("merge api task is too frequent.") + skip = true + return case <-al.mergeTask: // If apiLoadType is File,then try cover it's apis using other's apis from registry center var totalApis map[string]model.Api - sortedApiLoader := []int{} + var sortedApiLoader []int sortedApiLoaderMap := make(map[int]ApiLoadType, len(al.ApiLoadTypeMap)) for apiLoadType, loader := range al.ApiLoadTypeMap { sortedApiLoader = append(sortedApiLoader, loader.GetPrior()) @@ -129,11 +136,13 @@ func (al *ApiLoad) DoMergeApiTask() { for _, sortNo := range sortedApiLoader { loadType := sortedApiLoaderMap[sortNo] apiLoader := al.ApiLoadTypeMap[loadType] - fileApiConfigs, err := apiLoader.GetLoadedApiConfigs() + var apiConfigs []model.Api + apiConfigs, err = apiLoader.GetLoadedApiConfigs() if err != nil { logger.Error("get file apis error:%v", err) + return } else { - for _, fleApiConfig := range fileApiConfigs { + for _, fleApiConfig := range apiConfigs { if fleApiConfig.Status != model.Up { continue } @@ -142,7 +151,7 @@ func (al *ApiLoad) DoMergeApiTask() { } } // todo添加api - break + return true, nil } } From bd1efff3bb90a2dedb71d7ee43781ee8cdf1ead2 Mon Sep 17 00:00:00 2001 From: zhangshen023 <1292369127@qq.com> Date: Fri, 18 Sep 2020 08:00:55 +0800 Subject: [PATCH 064/227] file api loader --- cmd/proxy/control.go | 7 +++++-- pkg/api_load/api.go | 43 ++++++++++++++++++++++++++----------------- 2 files changed, 31 insertions(+), 19 deletions(-) diff --git a/cmd/proxy/control.go b/cmd/proxy/control.go index bc5f94e00..5817f31df 100644 --- a/cmd/proxy/control.go +++ b/cmd/proxy/control.go @@ -2,6 +2,7 @@ package main import ( "runtime" + "time" ) import ( @@ -9,6 +10,7 @@ import ( ) import ( + "github.com/dubbogo/dubbo-go-proxy/pkg/api_load" "github.com/dubbogo/dubbo-go-proxy/pkg/config" "github.com/dubbogo/dubbo-go-proxy/pkg/logger" "github.com/dubbogo/dubbo-go-proxy/pkg/proxy" @@ -63,7 +65,7 @@ var ( configPath := c.String("config") flagLogLevel := c.String("log-level") logConfPath := c.String("log-config") - //fileApiConfPath := c.String("file-api-config") + fileApiConfPath := c.String("file-api-config") bootstrap := config.Load(configPath) if logLevel, ok := flagToLogLevel[flagLogLevel]; ok { @@ -79,7 +81,8 @@ var ( runtime.GOMAXPROCS(limitCpus) } - //api_load.(fileApiConfPath, bootstrap.DynamicResources.ApiConfig) + apiLoader := api_load.NewApiLoad(time.Second) + apiLoader.AddApiLoad(fileApiConfPath, bootstrap.DynamicResources.ApiConfig) proxy.Start(bootstrap) return nil diff --git a/pkg/api_load/api.go b/pkg/api_load/api.go index 5c505f9d4..974ac0dbe 100644 --- a/pkg/api_load/api.go +++ b/pkg/api_load/api.go @@ -19,17 +19,22 @@ const ( ) type ApiLoad struct { - mergeLock sync.Locker - limiter *time.Ticker - sleepTime int64 - mergeTask chan struct{} - ApiLoadTypeMap map[ApiLoadType]ApiLoader + mergeLock sync.Locker + limiter *time.Timer + rateLimiterTime time.Duration + mergeTask chan struct{} + ApiLoadTypeMap map[ApiLoadType]ApiLoader } -func NewApiLoad() *ApiLoad { +func NewApiLoad(rateLimiterTime time.Duration) *ApiLoad { + if rateLimiterTime > time.Millisecond*50 { + rateLimiterTime = time.Millisecond * 50 + } return &ApiLoad{ - ApiLoadTypeMap: make(map[ApiLoadType]ApiLoader, 8), - mergeTask: make(chan struct{}, 1), + ApiLoadTypeMap: make(map[ApiLoadType]ApiLoader, 8), + mergeTask: make(chan struct{}, 1), + limiter: time.NewTimer(rateLimiterTime), + rateLimiterTime: rateLimiterTime, } } @@ -96,29 +101,31 @@ func (al *ApiLoad) SelectMergeApiTask() (err error) { select { case <-al.limiter.C: if len(al.mergeTask) > 0 { - go al.DoMergeApiTask() + al.DoMergeApiTask() } + al.limiter.Reset(time.Second) break default: - al.ClearMergeTask() - time.Sleep(time.Millisecond * time.Duration(al.sleepTime)) + time.Sleep(time.Millisecond * time.Duration(al.rateLimiterTime/10)) break } } return } -func (al *ApiLoad) DoMergeApiTask() { +func (al *ApiLoad) DoMergeApiTask() (skip bool, err error) { al.mergeLock.Lock() defer al.mergeLock.Unlock() wait := time.After(time.Millisecond * 50) select { case <-wait: - break + logger.Debug("merge api task is too frequent.") + skip = true + return case <-al.mergeTask: // If apiLoadType is File,then try cover it's apis using other's apis from registry center var totalApis map[string]model.Api - sortedApiLoader := []int{} + var sortedApiLoader []int sortedApiLoaderMap := make(map[int]ApiLoadType, len(al.ApiLoadTypeMap)) for apiLoadType, loader := range al.ApiLoadTypeMap { sortedApiLoader = append(sortedApiLoader, loader.GetPrior()) @@ -129,11 +136,13 @@ func (al *ApiLoad) DoMergeApiTask() { for _, sortNo := range sortedApiLoader { loadType := sortedApiLoaderMap[sortNo] apiLoader := al.ApiLoadTypeMap[loadType] - fileApiConfigs, err := apiLoader.GetLoadedApiConfigs() + var apiConfigs []model.Api + apiConfigs, err = apiLoader.GetLoadedApiConfigs() if err != nil { logger.Error("get file apis error:%v", err) + return } else { - for _, fleApiConfig := range fileApiConfigs { + for _, fleApiConfig := range apiConfigs { if fleApiConfig.Status != model.Up { continue } @@ -142,7 +151,7 @@ func (al *ApiLoad) DoMergeApiTask() { } } // todo添加api - break + return true, nil } } From 83c618b0776ed2c2fbc31545840b1e686a355c41 Mon Sep 17 00:00:00 2001 From: zhangshen023 <1292369127@qq.com> Date: Fri, 18 Sep 2020 08:00:55 +0800 Subject: [PATCH 065/227] file api loader --- cmd/proxy/control.go | 7 +++++-- pkg/api_load/api.go | 43 ++++++++++++++++++++++++++----------------- 2 files changed, 31 insertions(+), 19 deletions(-) diff --git a/cmd/proxy/control.go b/cmd/proxy/control.go index bc5f94e00..5817f31df 100644 --- a/cmd/proxy/control.go +++ b/cmd/proxy/control.go @@ -2,6 +2,7 @@ package main import ( "runtime" + "time" ) import ( @@ -9,6 +10,7 @@ import ( ) import ( + "github.com/dubbogo/dubbo-go-proxy/pkg/api_load" "github.com/dubbogo/dubbo-go-proxy/pkg/config" "github.com/dubbogo/dubbo-go-proxy/pkg/logger" "github.com/dubbogo/dubbo-go-proxy/pkg/proxy" @@ -63,7 +65,7 @@ var ( configPath := c.String("config") flagLogLevel := c.String("log-level") logConfPath := c.String("log-config") - //fileApiConfPath := c.String("file-api-config") + fileApiConfPath := c.String("file-api-config") bootstrap := config.Load(configPath) if logLevel, ok := flagToLogLevel[flagLogLevel]; ok { @@ -79,7 +81,8 @@ var ( runtime.GOMAXPROCS(limitCpus) } - //api_load.(fileApiConfPath, bootstrap.DynamicResources.ApiConfig) + apiLoader := api_load.NewApiLoad(time.Second) + apiLoader.AddApiLoad(fileApiConfPath, bootstrap.DynamicResources.ApiConfig) proxy.Start(bootstrap) return nil diff --git a/pkg/api_load/api.go b/pkg/api_load/api.go index 5c505f9d4..974ac0dbe 100644 --- a/pkg/api_load/api.go +++ b/pkg/api_load/api.go @@ -19,17 +19,22 @@ const ( ) type ApiLoad struct { - mergeLock sync.Locker - limiter *time.Ticker - sleepTime int64 - mergeTask chan struct{} - ApiLoadTypeMap map[ApiLoadType]ApiLoader + mergeLock sync.Locker + limiter *time.Timer + rateLimiterTime time.Duration + mergeTask chan struct{} + ApiLoadTypeMap map[ApiLoadType]ApiLoader } -func NewApiLoad() *ApiLoad { +func NewApiLoad(rateLimiterTime time.Duration) *ApiLoad { + if rateLimiterTime > time.Millisecond*50 { + rateLimiterTime = time.Millisecond * 50 + } return &ApiLoad{ - ApiLoadTypeMap: make(map[ApiLoadType]ApiLoader, 8), - mergeTask: make(chan struct{}, 1), + ApiLoadTypeMap: make(map[ApiLoadType]ApiLoader, 8), + mergeTask: make(chan struct{}, 1), + limiter: time.NewTimer(rateLimiterTime), + rateLimiterTime: rateLimiterTime, } } @@ -96,29 +101,31 @@ func (al *ApiLoad) SelectMergeApiTask() (err error) { select { case <-al.limiter.C: if len(al.mergeTask) > 0 { - go al.DoMergeApiTask() + al.DoMergeApiTask() } + al.limiter.Reset(time.Second) break default: - al.ClearMergeTask() - time.Sleep(time.Millisecond * time.Duration(al.sleepTime)) + time.Sleep(time.Millisecond * time.Duration(al.rateLimiterTime/10)) break } } return } -func (al *ApiLoad) DoMergeApiTask() { +func (al *ApiLoad) DoMergeApiTask() (skip bool, err error) { al.mergeLock.Lock() defer al.mergeLock.Unlock() wait := time.After(time.Millisecond * 50) select { case <-wait: - break + logger.Debug("merge api task is too frequent.") + skip = true + return case <-al.mergeTask: // If apiLoadType is File,then try cover it's apis using other's apis from registry center var totalApis map[string]model.Api - sortedApiLoader := []int{} + var sortedApiLoader []int sortedApiLoaderMap := make(map[int]ApiLoadType, len(al.ApiLoadTypeMap)) for apiLoadType, loader := range al.ApiLoadTypeMap { sortedApiLoader = append(sortedApiLoader, loader.GetPrior()) @@ -129,11 +136,13 @@ func (al *ApiLoad) DoMergeApiTask() { for _, sortNo := range sortedApiLoader { loadType := sortedApiLoaderMap[sortNo] apiLoader := al.ApiLoadTypeMap[loadType] - fileApiConfigs, err := apiLoader.GetLoadedApiConfigs() + var apiConfigs []model.Api + apiConfigs, err = apiLoader.GetLoadedApiConfigs() if err != nil { logger.Error("get file apis error:%v", err) + return } else { - for _, fleApiConfig := range fileApiConfigs { + for _, fleApiConfig := range apiConfigs { if fleApiConfig.Status != model.Up { continue } @@ -142,7 +151,7 @@ func (al *ApiLoad) DoMergeApiTask() { } } // todo添加api - break + return true, nil } } From 03ed34e75d4c050e065cc300c86a328bd351361d Mon Sep 17 00:00:00 2001 From: zhangshen023 <1292369127@qq.com> Date: Fri, 18 Sep 2020 08:00:55 +0800 Subject: [PATCH 066/227] file api loader --- cmd/proxy/control.go | 7 +++++-- pkg/api_load/api.go | 43 ++++++++++++++++++++++++++----------------- 2 files changed, 31 insertions(+), 19 deletions(-) diff --git a/cmd/proxy/control.go b/cmd/proxy/control.go index bc5f94e00..5817f31df 100644 --- a/cmd/proxy/control.go +++ b/cmd/proxy/control.go @@ -2,6 +2,7 @@ package main import ( "runtime" + "time" ) import ( @@ -9,6 +10,7 @@ import ( ) import ( + "github.com/dubbogo/dubbo-go-proxy/pkg/api_load" "github.com/dubbogo/dubbo-go-proxy/pkg/config" "github.com/dubbogo/dubbo-go-proxy/pkg/logger" "github.com/dubbogo/dubbo-go-proxy/pkg/proxy" @@ -63,7 +65,7 @@ var ( configPath := c.String("config") flagLogLevel := c.String("log-level") logConfPath := c.String("log-config") - //fileApiConfPath := c.String("file-api-config") + fileApiConfPath := c.String("file-api-config") bootstrap := config.Load(configPath) if logLevel, ok := flagToLogLevel[flagLogLevel]; ok { @@ -79,7 +81,8 @@ var ( runtime.GOMAXPROCS(limitCpus) } - //api_load.(fileApiConfPath, bootstrap.DynamicResources.ApiConfig) + apiLoader := api_load.NewApiLoad(time.Second) + apiLoader.AddApiLoad(fileApiConfPath, bootstrap.DynamicResources.ApiConfig) proxy.Start(bootstrap) return nil diff --git a/pkg/api_load/api.go b/pkg/api_load/api.go index 5c505f9d4..974ac0dbe 100644 --- a/pkg/api_load/api.go +++ b/pkg/api_load/api.go @@ -19,17 +19,22 @@ const ( ) type ApiLoad struct { - mergeLock sync.Locker - limiter *time.Ticker - sleepTime int64 - mergeTask chan struct{} - ApiLoadTypeMap map[ApiLoadType]ApiLoader + mergeLock sync.Locker + limiter *time.Timer + rateLimiterTime time.Duration + mergeTask chan struct{} + ApiLoadTypeMap map[ApiLoadType]ApiLoader } -func NewApiLoad() *ApiLoad { +func NewApiLoad(rateLimiterTime time.Duration) *ApiLoad { + if rateLimiterTime > time.Millisecond*50 { + rateLimiterTime = time.Millisecond * 50 + } return &ApiLoad{ - ApiLoadTypeMap: make(map[ApiLoadType]ApiLoader, 8), - mergeTask: make(chan struct{}, 1), + ApiLoadTypeMap: make(map[ApiLoadType]ApiLoader, 8), + mergeTask: make(chan struct{}, 1), + limiter: time.NewTimer(rateLimiterTime), + rateLimiterTime: rateLimiterTime, } } @@ -96,29 +101,31 @@ func (al *ApiLoad) SelectMergeApiTask() (err error) { select { case <-al.limiter.C: if len(al.mergeTask) > 0 { - go al.DoMergeApiTask() + al.DoMergeApiTask() } + al.limiter.Reset(time.Second) break default: - al.ClearMergeTask() - time.Sleep(time.Millisecond * time.Duration(al.sleepTime)) + time.Sleep(time.Millisecond * time.Duration(al.rateLimiterTime/10)) break } } return } -func (al *ApiLoad) DoMergeApiTask() { +func (al *ApiLoad) DoMergeApiTask() (skip bool, err error) { al.mergeLock.Lock() defer al.mergeLock.Unlock() wait := time.After(time.Millisecond * 50) select { case <-wait: - break + logger.Debug("merge api task is too frequent.") + skip = true + return case <-al.mergeTask: // If apiLoadType is File,then try cover it's apis using other's apis from registry center var totalApis map[string]model.Api - sortedApiLoader := []int{} + var sortedApiLoader []int sortedApiLoaderMap := make(map[int]ApiLoadType, len(al.ApiLoadTypeMap)) for apiLoadType, loader := range al.ApiLoadTypeMap { sortedApiLoader = append(sortedApiLoader, loader.GetPrior()) @@ -129,11 +136,13 @@ func (al *ApiLoad) DoMergeApiTask() { for _, sortNo := range sortedApiLoader { loadType := sortedApiLoaderMap[sortNo] apiLoader := al.ApiLoadTypeMap[loadType] - fileApiConfigs, err := apiLoader.GetLoadedApiConfigs() + var apiConfigs []model.Api + apiConfigs, err = apiLoader.GetLoadedApiConfigs() if err != nil { logger.Error("get file apis error:%v", err) + return } else { - for _, fleApiConfig := range fileApiConfigs { + for _, fleApiConfig := range apiConfigs { if fleApiConfig.Status != model.Up { continue } @@ -142,7 +151,7 @@ func (al *ApiLoad) DoMergeApiTask() { } } // todo添加api - break + return true, nil } } From 95612b3463f56f8e121fdca8b104d7a2c12add46 Mon Sep 17 00:00:00 2001 From: tiecheng Date: Fri, 18 Sep 2020 13:11:52 +0800 Subject: [PATCH 067/227] test org secret --- .github/workflows/github-actions.yml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/github-actions.yml b/.github/workflows/github-actions.yml index b22921aa0..b3e927c35 100644 --- a/.github/workflows/github-actions.yml +++ b/.github/workflows/github-actions.yml @@ -21,8 +21,8 @@ jobs: # https://docs.github.com/cn/actions/reference/encrypted-secrets env: - DING_TOKEN: ${{ secrets.DING_TOKEN }} - DING_SIGN: ${{ secrets.DING_SIGN }} + DING_TOKEN: ${{ secrets.PROXY_DING_TOKEN }} + DING_SIGN: ${{ secrets.PROXY_DING_SIGN }} steps: @@ -78,8 +78,8 @@ jobs: run: bash <(curl -s https://codecov.io/bash) - name: Hello world - run: echo Hello world ${{ secrets.TEST }} - + run: echo Hello world ${{ secrets.PROXY_DING_TOKEN }} ${{ secrets.PROXY_DING_SIGN }} + # Because the contexts of push and PR are different, there are two Notify. # Notifications are triggered only in the dubbogo/dubbo-go-proxy repository. - name: DingTalk Message Notify only Push From 3e6e03979afe495161180e9cd5b7b931e09f83e2 Mon Sep 17 00:00:00 2001 From: tiecheng Date: Fri, 18 Sep 2020 13:11:52 +0800 Subject: [PATCH 068/227] test org secret --- .github/workflows/github-actions.yml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/github-actions.yml b/.github/workflows/github-actions.yml index b22921aa0..b3e927c35 100644 --- a/.github/workflows/github-actions.yml +++ b/.github/workflows/github-actions.yml @@ -21,8 +21,8 @@ jobs: # https://docs.github.com/cn/actions/reference/encrypted-secrets env: - DING_TOKEN: ${{ secrets.DING_TOKEN }} - DING_SIGN: ${{ secrets.DING_SIGN }} + DING_TOKEN: ${{ secrets.PROXY_DING_TOKEN }} + DING_SIGN: ${{ secrets.PROXY_DING_SIGN }} steps: @@ -78,8 +78,8 @@ jobs: run: bash <(curl -s https://codecov.io/bash) - name: Hello world - run: echo Hello world ${{ secrets.TEST }} - + run: echo Hello world ${{ secrets.PROXY_DING_TOKEN }} ${{ secrets.PROXY_DING_SIGN }} + # Because the contexts of push and PR are different, there are two Notify. # Notifications are triggered only in the dubbogo/dubbo-go-proxy repository. - name: DingTalk Message Notify only Push From 5a987e24013227d584e7e07d795a2fc109bb1af2 Mon Sep 17 00:00:00 2001 From: tiecheng Date: Fri, 18 Sep 2020 13:11:52 +0800 Subject: [PATCH 069/227] test org secret --- .github/workflows/github-actions.yml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/github-actions.yml b/.github/workflows/github-actions.yml index b22921aa0..b3e927c35 100644 --- a/.github/workflows/github-actions.yml +++ b/.github/workflows/github-actions.yml @@ -21,8 +21,8 @@ jobs: # https://docs.github.com/cn/actions/reference/encrypted-secrets env: - DING_TOKEN: ${{ secrets.DING_TOKEN }} - DING_SIGN: ${{ secrets.DING_SIGN }} + DING_TOKEN: ${{ secrets.PROXY_DING_TOKEN }} + DING_SIGN: ${{ secrets.PROXY_DING_SIGN }} steps: @@ -78,8 +78,8 @@ jobs: run: bash <(curl -s https://codecov.io/bash) - name: Hello world - run: echo Hello world ${{ secrets.TEST }} - + run: echo Hello world ${{ secrets.PROXY_DING_TOKEN }} ${{ secrets.PROXY_DING_SIGN }} + # Because the contexts of push and PR are different, there are two Notify. # Notifications are triggered only in the dubbogo/dubbo-go-proxy repository. - name: DingTalk Message Notify only Push From 5554628fa976c69b4ab23eb937a9d3a4133163e0 Mon Sep 17 00:00:00 2001 From: tiecheng Date: Fri, 18 Sep 2020 13:16:01 +0800 Subject: [PATCH 070/227] secret write direct --- .github/workflows/github-actions.yml | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/.github/workflows/github-actions.yml b/.github/workflows/github-actions.yml index b3e927c35..9d54f88fb 100644 --- a/.github/workflows/github-actions.yml +++ b/.github/workflows/github-actions.yml @@ -21,8 +21,8 @@ jobs: # https://docs.github.com/cn/actions/reference/encrypted-secrets env: - DING_TOKEN: ${{ secrets.PROXY_DING_TOKEN }} - DING_SIGN: ${{ secrets.PROXY_DING_SIGN }} + DING_TOKEN: ce7f7eda223fe7bd2c750ea6f19526416ab343edd6084bd5b8c41dd19257af9f + DING_SIGN: SECdcf84e54ff9f38ef903af8f68c5b69e7e6afb13b3efe78b6b88e7a4df4bb9a88 steps: @@ -91,8 +91,8 @@ jobs: github.repository == 'dubbogo/dubbo-go-proxy' with: # DingDing bot token - dingToken: ${{ secrets.DING_TOKEN }} - secret: ${{ secrets.DING_SIGN }} + dingToken: ${{ env.DING_TOKEN }} + secret: ${{ env.DING_SIGN }} # Post Body to send body: | { @@ -110,8 +110,8 @@ jobs: github.event_name == 'pull_request' && github.repository == 'dubbogo/dubbo-go-proxy' with: - dingToken: ${{ secrets.DING_TOKEN }} - secret: ${{ secrets.DING_SIGN }} + dingToken: ${{ env.DING_TOKEN }} + secret: ${{ env.DING_SIGN }} body: | { "msgtype": "markdown", From 6dee5eaccde60dcbaafbb72e93b298aca4244bc1 Mon Sep 17 00:00:00 2001 From: tiecheng Date: Fri, 18 Sep 2020 13:16:01 +0800 Subject: [PATCH 071/227] secret write direct --- .github/workflows/github-actions.yml | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/.github/workflows/github-actions.yml b/.github/workflows/github-actions.yml index b3e927c35..9d54f88fb 100644 --- a/.github/workflows/github-actions.yml +++ b/.github/workflows/github-actions.yml @@ -21,8 +21,8 @@ jobs: # https://docs.github.com/cn/actions/reference/encrypted-secrets env: - DING_TOKEN: ${{ secrets.PROXY_DING_TOKEN }} - DING_SIGN: ${{ secrets.PROXY_DING_SIGN }} + DING_TOKEN: ce7f7eda223fe7bd2c750ea6f19526416ab343edd6084bd5b8c41dd19257af9f + DING_SIGN: SECdcf84e54ff9f38ef903af8f68c5b69e7e6afb13b3efe78b6b88e7a4df4bb9a88 steps: @@ -91,8 +91,8 @@ jobs: github.repository == 'dubbogo/dubbo-go-proxy' with: # DingDing bot token - dingToken: ${{ secrets.DING_TOKEN }} - secret: ${{ secrets.DING_SIGN }} + dingToken: ${{ env.DING_TOKEN }} + secret: ${{ env.DING_SIGN }} # Post Body to send body: | { @@ -110,8 +110,8 @@ jobs: github.event_name == 'pull_request' && github.repository == 'dubbogo/dubbo-go-proxy' with: - dingToken: ${{ secrets.DING_TOKEN }} - secret: ${{ secrets.DING_SIGN }} + dingToken: ${{ env.DING_TOKEN }} + secret: ${{ env.DING_SIGN }} body: | { "msgtype": "markdown", From 0a7314d0c9428c3559caae6874e00cd604e0f3f3 Mon Sep 17 00:00:00 2001 From: tiecheng Date: Fri, 18 Sep 2020 13:16:01 +0800 Subject: [PATCH 072/227] secret write direct --- .github/workflows/github-actions.yml | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/.github/workflows/github-actions.yml b/.github/workflows/github-actions.yml index b3e927c35..9d54f88fb 100644 --- a/.github/workflows/github-actions.yml +++ b/.github/workflows/github-actions.yml @@ -21,8 +21,8 @@ jobs: # https://docs.github.com/cn/actions/reference/encrypted-secrets env: - DING_TOKEN: ${{ secrets.PROXY_DING_TOKEN }} - DING_SIGN: ${{ secrets.PROXY_DING_SIGN }} + DING_TOKEN: ce7f7eda223fe7bd2c750ea6f19526416ab343edd6084bd5b8c41dd19257af9f + DING_SIGN: SECdcf84e54ff9f38ef903af8f68c5b69e7e6afb13b3efe78b6b88e7a4df4bb9a88 steps: @@ -91,8 +91,8 @@ jobs: github.repository == 'dubbogo/dubbo-go-proxy' with: # DingDing bot token - dingToken: ${{ secrets.DING_TOKEN }} - secret: ${{ secrets.DING_SIGN }} + dingToken: ${{ env.DING_TOKEN }} + secret: ${{ env.DING_SIGN }} # Post Body to send body: | { @@ -110,8 +110,8 @@ jobs: github.event_name == 'pull_request' && github.repository == 'dubbogo/dubbo-go-proxy' with: - dingToken: ${{ secrets.DING_TOKEN }} - secret: ${{ secrets.DING_SIGN }} + dingToken: ${{ env.DING_TOKEN }} + secret: ${{ env.DING_SIGN }} body: | { "msgtype": "markdown", From f88bab9593d52781372f198a2b5c5299b765e45a Mon Sep 17 00:00:00 2001 From: tiecheng Date: Fri, 18 Sep 2020 16:24:59 +0800 Subject: [PATCH 073/227] make token sign to secret --- .github/workflows/github-actions.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/github-actions.yml b/.github/workflows/github-actions.yml index 9d54f88fb..06b812c78 100644 --- a/.github/workflows/github-actions.yml +++ b/.github/workflows/github-actions.yml @@ -21,8 +21,8 @@ jobs: # https://docs.github.com/cn/actions/reference/encrypted-secrets env: - DING_TOKEN: ce7f7eda223fe7bd2c750ea6f19526416ab343edd6084bd5b8c41dd19257af9f - DING_SIGN: SECdcf84e54ff9f38ef903af8f68c5b69e7e6afb13b3efe78b6b88e7a4df4bb9a88 + DING_TOKEN: ${{ secrets.PROXY_DING_TOKEN }} + DING_SIGN: ${{ secrets.PROXY_DING_SIGN }} steps: From f94e1a0f2a5e759031c9cf0411aa15e2ee3ae06f Mon Sep 17 00:00:00 2001 From: tiecheng Date: Fri, 18 Sep 2020 16:24:59 +0800 Subject: [PATCH 074/227] make token sign to secret --- .github/workflows/github-actions.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/github-actions.yml b/.github/workflows/github-actions.yml index 9d54f88fb..06b812c78 100644 --- a/.github/workflows/github-actions.yml +++ b/.github/workflows/github-actions.yml @@ -21,8 +21,8 @@ jobs: # https://docs.github.com/cn/actions/reference/encrypted-secrets env: - DING_TOKEN: ce7f7eda223fe7bd2c750ea6f19526416ab343edd6084bd5b8c41dd19257af9f - DING_SIGN: SECdcf84e54ff9f38ef903af8f68c5b69e7e6afb13b3efe78b6b88e7a4df4bb9a88 + DING_TOKEN: ${{ secrets.PROXY_DING_TOKEN }} + DING_SIGN: ${{ secrets.PROXY_DING_SIGN }} steps: From 3f0302f6055339ec5b2e5e23f9800e40d5365de8 Mon Sep 17 00:00:00 2001 From: tiecheng Date: Fri, 18 Sep 2020 16:24:59 +0800 Subject: [PATCH 075/227] make token sign to secret --- .github/workflows/github-actions.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/github-actions.yml b/.github/workflows/github-actions.yml index 9d54f88fb..06b812c78 100644 --- a/.github/workflows/github-actions.yml +++ b/.github/workflows/github-actions.yml @@ -21,8 +21,8 @@ jobs: # https://docs.github.com/cn/actions/reference/encrypted-secrets env: - DING_TOKEN: ce7f7eda223fe7bd2c750ea6f19526416ab343edd6084bd5b8c41dd19257af9f - DING_SIGN: SECdcf84e54ff9f38ef903af8f68c5b69e7e6afb13b3efe78b6b88e7a4df4bb9a88 + DING_TOKEN: ${{ secrets.PROXY_DING_TOKEN }} + DING_SIGN: ${{ secrets.PROXY_DING_SIGN }} steps: From 01f55ddc0ddbaef3a699908c293ec6b4699d2b19 Mon Sep 17 00:00:00 2001 From: william feng <> Date: Thu, 10 Sep 2020 14:51:55 +0800 Subject: [PATCH 076/227] define new api config file --- .gitignore | 3 +- configs/api_config.yaml | 57 ++++++++++++++++++++++++++--- pkg/config/api_config.go | 67 +++++++++++++++++++++++++++++++++++ pkg/config/api_config_test.go | 0 4 files changed, 121 insertions(+), 6 deletions(-) create mode 100644 pkg/config/api_config.go create mode 100644 pkg/config/api_config_test.go diff --git a/.gitignore b/.gitignore index f7a989311..9a8941e54 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,4 @@ ./dubbo-go-proxy /logs -/.idea \ No newline at end of file +/.idea +/.vscode \ No newline at end of file diff --git a/configs/api_config.yaml b/configs/api_config.yaml index b5e8a8749..9723bf7cb 100644 --- a/configs/api_config.yaml +++ b/configs/api_config.yaml @@ -1,5 +1,52 @@ -- name: "test-dubbo/user" - target: "queryUser" - method: "POST" - types: - - "com.ikurento.user.User" +# - name: "test-dubbo/user" +# target: "queryUser" +# method: "POST" +# types: +# - "com.ikurento.user.User" + +name: api name +description: api description +resources: + - path: '/' + description: resource documentation + filters: + - filterA + - filterB + methods: + - method: GET + inboundRequest: + type: http + headers: + - name: auth + - required: true + queryStrings: + - name: page + required: false + - name: type + required: false + requestBody: + - modelDefinition + integrationRequest: + type: dubbo + paramTypes: + - "com.ikurento.user.User" + + +Definitions: + - name: modelDefinition + contentType: application/json + schema: >- + { + "type" : "object", + "properties" : { + "id" : { + "type" : "integer" + }, + "type" : { + "type" : "string" + }, + "price" : { + "type" : "number" + } + } + } diff --git a/pkg/config/api_config.go b/pkg/config/api_config.go new file mode 100644 index 000000000..e982966da --- /dev/null +++ b/pkg/config/api_config.go @@ -0,0 +1,67 @@ +package model + +import ( + "sync" +) + +var ( + CacheApi = sync.Map{} +) + +// Api is api gateway concept, control request from browser、Mobile APP、third party people +type Api struct { + Name string `json:"name"` + ITypeStr string `json:"itype"` + IType ApiType `json:"-"` + OTypeStr string `json:"otype"` + OType ApiType `json:"-"` + Status Status `json:"status"` + Metadata interface{} `json:"metadata"` + Method string `json:"method"` + RequestMethod +} + +var EmptyApi = &Api{} + +func NewApi() *Api { + return &Api{} +} + +func (a *Api) FindApi(name string) (*Api, bool) { + if v, ok := CacheApi.Load(name); ok { + return v.(*Api), true + } + + return nil, false +} + +func (a *Api) MatchMethod(method string) bool { + i := RequestMethodValue[method] + if a.RequestMethod == RequestMethod(i) { + return true + } + + return false +} + +func (a *Api) IsOk(name string) bool { + if v, ok := CacheApi.Load(name); ok { + return v.(*Api).Status == Up + } + + return false +} + +// Offline api offline +func (a *Api) Offline(name string) { + if v, ok := CacheApi.Load(name); ok { + v.(*Api).Status = Down + } +} + +// Online api online +func (a *Api) Online(name string) { + if v, ok := CacheApi.Load(name); ok { + v.(*Api).Status = Up + } +} diff --git a/pkg/config/api_config_test.go b/pkg/config/api_config_test.go new file mode 100644 index 000000000..e69de29bb From cead76d072ac2fb41d150912084cbf019efa5407 Mon Sep 17 00:00:00 2001 From: william feng <> Date: Thu, 10 Sep 2020 14:51:55 +0800 Subject: [PATCH 077/227] define new api config file --- .gitignore | 3 +- configs/api_config.yaml | 57 ++++++++++++++++++++++++++--- pkg/config/api_config.go | 67 +++++++++++++++++++++++++++++++++++ pkg/config/api_config_test.go | 0 4 files changed, 121 insertions(+), 6 deletions(-) create mode 100644 pkg/config/api_config.go create mode 100644 pkg/config/api_config_test.go diff --git a/.gitignore b/.gitignore index f7a989311..9a8941e54 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,4 @@ ./dubbo-go-proxy /logs -/.idea \ No newline at end of file +/.idea +/.vscode \ No newline at end of file diff --git a/configs/api_config.yaml b/configs/api_config.yaml index b5e8a8749..9723bf7cb 100644 --- a/configs/api_config.yaml +++ b/configs/api_config.yaml @@ -1,5 +1,52 @@ -- name: "test-dubbo/user" - target: "queryUser" - method: "POST" - types: - - "com.ikurento.user.User" +# - name: "test-dubbo/user" +# target: "queryUser" +# method: "POST" +# types: +# - "com.ikurento.user.User" + +name: api name +description: api description +resources: + - path: '/' + description: resource documentation + filters: + - filterA + - filterB + methods: + - method: GET + inboundRequest: + type: http + headers: + - name: auth + - required: true + queryStrings: + - name: page + required: false + - name: type + required: false + requestBody: + - modelDefinition + integrationRequest: + type: dubbo + paramTypes: + - "com.ikurento.user.User" + + +Definitions: + - name: modelDefinition + contentType: application/json + schema: >- + { + "type" : "object", + "properties" : { + "id" : { + "type" : "integer" + }, + "type" : { + "type" : "string" + }, + "price" : { + "type" : "number" + } + } + } diff --git a/pkg/config/api_config.go b/pkg/config/api_config.go new file mode 100644 index 000000000..e982966da --- /dev/null +++ b/pkg/config/api_config.go @@ -0,0 +1,67 @@ +package model + +import ( + "sync" +) + +var ( + CacheApi = sync.Map{} +) + +// Api is api gateway concept, control request from browser、Mobile APP、third party people +type Api struct { + Name string `json:"name"` + ITypeStr string `json:"itype"` + IType ApiType `json:"-"` + OTypeStr string `json:"otype"` + OType ApiType `json:"-"` + Status Status `json:"status"` + Metadata interface{} `json:"metadata"` + Method string `json:"method"` + RequestMethod +} + +var EmptyApi = &Api{} + +func NewApi() *Api { + return &Api{} +} + +func (a *Api) FindApi(name string) (*Api, bool) { + if v, ok := CacheApi.Load(name); ok { + return v.(*Api), true + } + + return nil, false +} + +func (a *Api) MatchMethod(method string) bool { + i := RequestMethodValue[method] + if a.RequestMethod == RequestMethod(i) { + return true + } + + return false +} + +func (a *Api) IsOk(name string) bool { + if v, ok := CacheApi.Load(name); ok { + return v.(*Api).Status == Up + } + + return false +} + +// Offline api offline +func (a *Api) Offline(name string) { + if v, ok := CacheApi.Load(name); ok { + v.(*Api).Status = Down + } +} + +// Online api online +func (a *Api) Online(name string) { + if v, ok := CacheApi.Load(name); ok { + v.(*Api).Status = Up + } +} diff --git a/pkg/config/api_config_test.go b/pkg/config/api_config_test.go new file mode 100644 index 000000000..e69de29bb From 659f9f30eaa8f02faa663732efe55ac4ddc391a4 Mon Sep 17 00:00:00 2001 From: william feng <> Date: Thu, 10 Sep 2020 14:51:55 +0800 Subject: [PATCH 078/227] define new api config file --- .gitignore | 3 +- configs/api_config.yaml | 57 ++++++++++++++++++++++++++--- pkg/config/api_config.go | 67 +++++++++++++++++++++++++++++++++++ pkg/config/api_config_test.go | 0 4 files changed, 121 insertions(+), 6 deletions(-) create mode 100644 pkg/config/api_config.go create mode 100644 pkg/config/api_config_test.go diff --git a/.gitignore b/.gitignore index f7a989311..9a8941e54 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,4 @@ ./dubbo-go-proxy /logs -/.idea \ No newline at end of file +/.idea +/.vscode \ No newline at end of file diff --git a/configs/api_config.yaml b/configs/api_config.yaml index b5e8a8749..9723bf7cb 100644 --- a/configs/api_config.yaml +++ b/configs/api_config.yaml @@ -1,5 +1,52 @@ -- name: "test-dubbo/user" - target: "queryUser" - method: "POST" - types: - - "com.ikurento.user.User" +# - name: "test-dubbo/user" +# target: "queryUser" +# method: "POST" +# types: +# - "com.ikurento.user.User" + +name: api name +description: api description +resources: + - path: '/' + description: resource documentation + filters: + - filterA + - filterB + methods: + - method: GET + inboundRequest: + type: http + headers: + - name: auth + - required: true + queryStrings: + - name: page + required: false + - name: type + required: false + requestBody: + - modelDefinition + integrationRequest: + type: dubbo + paramTypes: + - "com.ikurento.user.User" + + +Definitions: + - name: modelDefinition + contentType: application/json + schema: >- + { + "type" : "object", + "properties" : { + "id" : { + "type" : "integer" + }, + "type" : { + "type" : "string" + }, + "price" : { + "type" : "number" + } + } + } diff --git a/pkg/config/api_config.go b/pkg/config/api_config.go new file mode 100644 index 000000000..e982966da --- /dev/null +++ b/pkg/config/api_config.go @@ -0,0 +1,67 @@ +package model + +import ( + "sync" +) + +var ( + CacheApi = sync.Map{} +) + +// Api is api gateway concept, control request from browser、Mobile APP、third party people +type Api struct { + Name string `json:"name"` + ITypeStr string `json:"itype"` + IType ApiType `json:"-"` + OTypeStr string `json:"otype"` + OType ApiType `json:"-"` + Status Status `json:"status"` + Metadata interface{} `json:"metadata"` + Method string `json:"method"` + RequestMethod +} + +var EmptyApi = &Api{} + +func NewApi() *Api { + return &Api{} +} + +func (a *Api) FindApi(name string) (*Api, bool) { + if v, ok := CacheApi.Load(name); ok { + return v.(*Api), true + } + + return nil, false +} + +func (a *Api) MatchMethod(method string) bool { + i := RequestMethodValue[method] + if a.RequestMethod == RequestMethod(i) { + return true + } + + return false +} + +func (a *Api) IsOk(name string) bool { + if v, ok := CacheApi.Load(name); ok { + return v.(*Api).Status == Up + } + + return false +} + +// Offline api offline +func (a *Api) Offline(name string) { + if v, ok := CacheApi.Load(name); ok { + v.(*Api).Status = Down + } +} + +// Online api online +func (a *Api) Online(name string) { + if v, ok := CacheApi.Load(name); ok { + v.(*Api).Status = Up + } +} diff --git a/pkg/config/api_config_test.go b/pkg/config/api_config_test.go new file mode 100644 index 000000000..e69de29bb From 8d8f05296b9c39807e726ae938815f60a126a00c Mon Sep 17 00:00:00 2001 From: william feng <> Date: Sat, 12 Sep 2020 16:57:40 +0800 Subject: [PATCH 079/227] changed the api config structure --- configs/api_config.yaml | 12 +- go.sum | 2 + pkg/common/yaml/testdata/config.yml | 7 + pkg/common/yaml/yaml.go | 60 +++++++++ pkg/common/yaml/yaml_test.go | 70 ++++++++++ pkg/config/api_config.go | 197 +++++++++++++++++++++------- pkg/config/api_config_test.go | 24 ++++ pkg/config/mock/api_config.yml | 52 ++++++++ pkg/logger/logger.go | 2 +- 9 files changed, 379 insertions(+), 47 deletions(-) create mode 100644 pkg/common/yaml/testdata/config.yml create mode 100644 pkg/common/yaml/yaml.go create mode 100644 pkg/common/yaml/yaml_test.go create mode 100644 pkg/config/mock/api_config.yml diff --git a/configs/api_config.yaml b/configs/api_config.yaml index 9723bf7cb..f041446e1 100644 --- a/configs/api_config.yaml +++ b/configs/api_config.yaml @@ -8,12 +8,14 @@ name: api name description: api description resources: - path: '/' + type: restful description: resource documentation filters: - filterA - filterB methods: - - method: GET + - httpVerb: GET + onAir: true inboundRequest: type: http headers: @@ -28,8 +30,14 @@ resources: - modelDefinition integrationRequest: type: dubbo + applicationName: BDTService + group: test + version: 1.0.0 + interface: com.ikurento.user.UserProvider + Method: GetUser paramTypes: - - "com.ikurento.user.User" + - java.lang.String + ClusterName: test_dubbo Definitions: diff --git a/go.sum b/go.sum index 19b2130bf..cc1e82215 100644 --- a/go.sum +++ b/go.sum @@ -693,6 +693,8 @@ gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.8 h1:obN1ZagJSUGI0Ek/LBmuj4SNLPfIny3KsKFopxRdj10= gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.3.0 h1:clyUAQHOM3G0M3f5vQj7LuJrETvjVot3Z5el9nffUtU= +gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= diff --git a/pkg/common/yaml/testdata/config.yml b/pkg/common/yaml/testdata/config.yml new file mode 100644 index 000000000..b5c2ca8ad --- /dev/null +++ b/pkg/common/yaml/testdata/config.yml @@ -0,0 +1,7 @@ + +intTest: 11 +booleanTest: false +strTest: "strTest" + +child: + strTest: "childStrTest" \ No newline at end of file diff --git a/pkg/common/yaml/yaml.go b/pkg/common/yaml/yaml.go new file mode 100644 index 000000000..de67bfca5 --- /dev/null +++ b/pkg/common/yaml/yaml.go @@ -0,0 +1,60 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + */ + +package yaml + +import ( + "io/ioutil" + "path" +) + +import ( + perrors "github.com/pkg/errors" + "gopkg.in/yaml.v2" +) + +// LoadYMLConfig Load yml config byte from file +func LoadYMLConfig(confProFile string) ([]byte, error) { + if len(confProFile) == 0 { + return nil, perrors.Errorf("configure file name is nil") + } + + if path.Ext(confProFile) != ".yml" { + return nil, perrors.Errorf("configure file name{%v} suffix must be .yml", confProFile) + } + + return ioutil.ReadFile(confProFile) +} + +// UnmarshalYMLConfig Load yml config byte from file, then unmarshal to object +func UnmarshalYMLConfig(confProFile string, out interface{}) ([]byte, error) { + confFileStream, err := LoadYMLConfig(confProFile) + if err != nil { + return confFileStream, perrors.Errorf("ioutil.ReadFile(file:%s) = error:%v", confProFile, perrors.WithStack(err)) + } + return confFileStream, yaml.Unmarshal(confFileStream, out) +} + +//UnmarshalYML unmarshals decodes the first document found within the in byte slice and assigns decoded values into the out value. +func UnmarshalYML(data []byte, out interface{}) error { + return yaml.Unmarshal(data, out) +} + +// MarshalYML serializes the value provided into a YAML document. +func MarshalYML(in interface{}) ([]byte, error) { + return yaml.Marshal(in) +} diff --git a/pkg/common/yaml/yaml_test.go b/pkg/common/yaml/yaml_test.go new file mode 100644 index 000000000..5a271a258 --- /dev/null +++ b/pkg/common/yaml/yaml_test.go @@ -0,0 +1,70 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + */ + +package yaml + +import ( + "path/filepath" + "testing" +) + +import ( + "github.com/stretchr/testify/assert" +) + +func TestUnmarshalYMLConfig(t *testing.T) { + conPath, err := filepath.Abs("./testdata/config.yml") + assert.NoError(t, err) + c := &Config{} + _, err = UnmarshalYMLConfig(conPath, c) + assert.NoError(t, err) + assert.Equal(t, "strTest", c.StrTest) + assert.Equal(t, 11, c.IntTest) + assert.Equal(t, false, c.BooleanTest) + assert.Equal(t, "childStrTest", c.ChildConfig.StrTest) +} + +func TestUnmarshalYMLConfigError(t *testing.T) { + c := &Config{} + _, err := UnmarshalYMLConfig("./testdata/config", c) + assert.Error(t, err) + _, err = UnmarshalYMLConfig("", c) + assert.Error(t, err) +} + +func TestUnmarshalYML(t *testing.T) { + c := &Config{} + b, err := LoadYMLConfig("./testdata/config.yml") + assert.NoError(t, err) + err = UnmarshalYML(b, c) + assert.NoError(t, err) + assert.Equal(t, "strTest", c.StrTest) + assert.Equal(t, 11, c.IntTest) + assert.Equal(t, false, c.BooleanTest) + assert.Equal(t, "childStrTest", c.ChildConfig.StrTest) +} + +type Config struct { + StrTest string `yaml:"strTest" default:"default" json:"strTest,omitempty" property:"strTest"` + IntTest int `default:"109" yaml:"intTest" json:"intTest,omitempty" property:"intTest"` + BooleanTest bool `yaml:"booleanTest" default:"true" json:"booleanTest,omitempty"` + ChildConfig ChildConfig `yaml:"child" json:"child,omitempty"` +} + +type ChildConfig struct { + StrTest string `default:"strTest" default:"default" yaml:"strTest" json:"strTest,omitempty"` +} diff --git a/pkg/config/api_config.go b/pkg/config/api_config.go index e982966da..9e5bd74b1 100644 --- a/pkg/config/api_config.go +++ b/pkg/config/api_config.go @@ -1,67 +1,176 @@ -package model +package config import ( - "sync" + "log" ) -var ( - CacheApi = sync.Map{} +import ( + "github.com/dubbogo/dubbo-go-proxy/pkg/client/dubbo" + "github.com/dubbogo/dubbo-go-proxy/pkg/common/yaml" + perrors "github.com/pkg/errors" ) -// Api is api gateway concept, control request from browser、Mobile APP、third party people -type Api struct { - Name string `json:"name"` - ITypeStr string `json:"itype"` - IType ApiType `json:"-"` - OTypeStr string `json:"otype"` - OType ApiType `json:"-"` - Status Status `json:"status"` - Metadata interface{} `json:"metadata"` - Method string `json:"method"` - RequestMethod -} +// import ( +// "sync" +// ) + +// var ( +// CacheApi = sync.Map{} +// ) + +// // Api is api gateway concept, control request from browser、Mobile APP、third party people +// type Api struct { +// Name string `json:"name"` +// ITypeStr string `json:"itype"` +// IType ApiType `json:"-"` +// OTypeStr string `json:"otype"` +// OType ApiType `json:"-"` +// Status Status `json:"status"` +// Metadata interface{} `json:"metadata"` +// Method string `json:"method"` +// RequestMethod +// } + +// var EmptyApi = &Api{} + +// func NewApi() *Api { +// return &Api{} +// } + +// func (a *Api) FindApi(name string) (*Api, bool) { +// if v, ok := CacheApi.Load(name); ok { +// return v.(*Api), true +// } + +// return nil, false +// } + +// func (a *Api) MatchMethod(method string) bool { +// i := RequestMethodValue[method] +// if a.RequestMethod == RequestMethod(i) { +// return true +// } + +// return false +// } + +// func (a *Api) IsOk(name string) bool { +// if v, ok := CacheApi.Load(name); ok { +// return v.(*Api).Status == Up +// } + +// return false +// } + +// // Offline api offline +// func (a *Api) Offline(name string) { +// if v, ok := CacheApi.Load(name); ok { +// v.(*Api).Status = Down +// } +// } -var EmptyApi = &Api{} +// // Online api online +// func (a *Api) Online(name string) { +// if v, ok := CacheApi.Load(name); ok { +// v.(*Api).Status = Up +// } +// } -func NewApi() *Api { - return &Api{} +// HTTPVerb defines the restful api http verb +type HTTPVerb string + +const ( + // MethodAny any method + MethodAny HTTPVerb = "ANY" + // MethodGet get + MethodGet HTTPVerb = "GET" + // MethodHead head + MethodHead HTTPVerb = "HEAD" + // MethodPost post + MethodPost HTTPVerb = "POST" + // MethodPut put + MethodPut HTTPVerb = "PUT" + // MethodPatch patch + MethodPatch HTTPVerb = "PATCH" // RFC 5789 + // MethodDelete delete + MethodDelete HTTPVerb = "DELETE" + // MethodOptions options + MethodOptions HTTPVerb = "OPTIONS" +) + +// APIConfig defines the data structure of the api gateway configuration +type APIConfig struct { + Name string `yaml:"name"` + Description string `yaml:"description"` + Resources []Resource `yaml:"resources"` + Definitions []Definition `yaml:"definitions"` } -func (a *Api) FindApi(name string) (*Api, bool) { - if v, ok := CacheApi.Load(name); ok { - return v.(*Api), true - } +// Resource defines the API path +type Resource struct { + Type string `yaml:"type"` // Restful, Dubbo + Path string `yaml:"path"` + Description string `yaml:"description"` + Filters []string `yaml:"filters"` + Methods []Method `yaml:"methods"` + Resources []Resource `yaml:"resources,omitempty"` +} - return nil, false +// Method defines the method of the api +type Method struct { + OnAir bool `yaml:"onAir"` + HTTPVerb `yaml:"httpVerb"` + InboundRequest `yaml:"inboundRequest"` } -func (a *Api) MatchMethod(method string) bool { - i := RequestMethodValue[method] - if a.RequestMethod == RequestMethod(i) { - return true - } +// InboundRequest defines the details of the inbound +type InboundRequest struct { + Type string `yaml:"type"` //http, TO-DO: dubbo + Headers []Params `yaml:"headers"` + QueryStrings []Params `yaml:"queryStrings"` + RequestBody []BodyDefinition `yaml:"requestBody"` +} - return false +// Params defines the simple parameter definition +type Params struct { + Name string `yaml:"name"` + Required bool `yaml:"required"` } -func (a *Api) IsOk(name string) bool { - if v, ok := CacheApi.Load(name); ok { - return v.(*Api).Status == Up - } +// BodyDefinition connects the request body to the definitions +type BodyDefinition struct { + DefinitionName string `yaml:"definitionName"` + ContentType string `yaml:"contentType"` +} - return false +// IntegrationRequest defines the backend request format and target +type IntegrationRequest struct { + Type string `yaml:"type"` // dubbo, TO-DO: http + dubbo.DubboMetadata `yaml:"dubboMetaData,inline"` } -// Offline api offline -func (a *Api) Offline(name string) { - if v, ok := CacheApi.Load(name); ok { - v.(*Api).Status = Down - } +// MappingParams defines the mapping rules of headers and queryStrings +type MappingParams struct { + Name string `yaml:"name"` + MapTo string `yaml:"mapTo"` } -// Online api online -func (a *Api) Online(name string) { - if v, ok := CacheApi.Load(name); ok { - v.(*Api).Status = Up +// Definition defines the complex json request body +type Definition struct { + Name string `yaml:"name"` + Schema string `yaml:"schema"` // use json schema +} + +// LoadAPIConfigFromFile load the api config from file +func LoadAPIConfigFromFile(path string) (*APIConfig, error) { + if len(path) == 0 { + return nil, perrors.Errorf("Config file not specified") + } + log.Printf("Load API configuration file form %s", path) + apiConf := &APIConfig{} + _, err := yaml.UnmarshalYMLConfig(path, apiConf) + if err != nil { + return nil, perrors.Errorf("unmarshalYmlConfig error %v", perrors.WithStack(err)) } + return apiConf, nil } diff --git a/pkg/config/api_config_test.go b/pkg/config/api_config_test.go index e69de29bb..172b69172 100644 --- a/pkg/config/api_config_test.go +++ b/pkg/config/api_config_test.go @@ -0,0 +1,24 @@ +package config_test + +import ( + "log" + "testing" +) + +import ( + "github.com/dubbogo/dubbo-go-proxy/pkg/config" + "github.com/ghodss/yaml" + "github.com/stretchr/testify/assert" +) + +func TestLoadAPIConfigFromFile(t *testing.T) { + apiC, err := config.LoadAPIConfigFromFile("") + assert.Empty(t, apiC) + assert.EqualError(t, err, "Config file not specified") + + apiC, err = config.LoadAPIConfigFromFile("./mock/api_config.yml") + assert.Empty(t, err) + assert.Equal(t, apiC.Name, "api name") + bytes, _ := yaml.Marshal(apiC) + log.Printf("%s", bytes) +} diff --git a/pkg/config/mock/api_config.yml b/pkg/config/mock/api_config.yml new file mode 100644 index 000000000..624b90c9e --- /dev/null +++ b/pkg/config/mock/api_config.yml @@ -0,0 +1,52 @@ +name: api name +description: api description +resources: + - path: '/' + type: restful + description: resource documentation + filters: + - filterA + - filterB + methods: + - httpVerb: GET + onAir: true + inboundRequest: + type: http + headers: + - name: auth + required: true + queryStrings: + - name: page + required: false + - name: type + required: false + requestBody: + - definitionName: modelDefinition + contentType: application/json + integrationRequest: + type: dubbo + applicationName: BDTService + group: test + version: 1.0.0 + interface: com.ikurento.user.UserProvider + Method: GetUser + paramTypes: + - java.lang.String + ClusterName: test_dubbo +definitions: + - name: modelDefinition + schema: >- + { + "type" : "object", + "properties" : { + "id" : { + "type" : "integer" + }, + "type" : { + "type" : "string" + }, + "price" : { + "type" : "number" + } + } + } diff --git a/pkg/logger/logger.go b/pkg/logger/logger.go index bacbdfbad..71913a0f4 100644 --- a/pkg/logger/logger.go +++ b/pkg/logger/logger.go @@ -25,10 +25,10 @@ import ( ) import ( + "github.com/ghodss/yaml" perrors "github.com/pkg/errors" "go.uber.org/zap" "go.uber.org/zap/zapcore" - "gopkg.in/yaml.v2" ) var ( From 6c38da6d07cadb3ce8aad2b48868d572a44214c7 Mon Sep 17 00:00:00 2001 From: william feng <> Date: Sat, 12 Sep 2020 16:57:40 +0800 Subject: [PATCH 080/227] changed the api config structure --- configs/api_config.yaml | 12 +- go.sum | 2 + pkg/common/yaml/testdata/config.yml | 7 + pkg/common/yaml/yaml.go | 60 +++++++++ pkg/common/yaml/yaml_test.go | 70 ++++++++++ pkg/config/api_config.go | 197 +++++++++++++++++++++------- pkg/config/api_config_test.go | 24 ++++ pkg/config/mock/api_config.yml | 52 ++++++++ pkg/logger/logger.go | 2 +- 9 files changed, 379 insertions(+), 47 deletions(-) create mode 100644 pkg/common/yaml/testdata/config.yml create mode 100644 pkg/common/yaml/yaml.go create mode 100644 pkg/common/yaml/yaml_test.go create mode 100644 pkg/config/mock/api_config.yml diff --git a/configs/api_config.yaml b/configs/api_config.yaml index 9723bf7cb..f041446e1 100644 --- a/configs/api_config.yaml +++ b/configs/api_config.yaml @@ -8,12 +8,14 @@ name: api name description: api description resources: - path: '/' + type: restful description: resource documentation filters: - filterA - filterB methods: - - method: GET + - httpVerb: GET + onAir: true inboundRequest: type: http headers: @@ -28,8 +30,14 @@ resources: - modelDefinition integrationRequest: type: dubbo + applicationName: BDTService + group: test + version: 1.0.0 + interface: com.ikurento.user.UserProvider + Method: GetUser paramTypes: - - "com.ikurento.user.User" + - java.lang.String + ClusterName: test_dubbo Definitions: diff --git a/go.sum b/go.sum index 19b2130bf..cc1e82215 100644 --- a/go.sum +++ b/go.sum @@ -693,6 +693,8 @@ gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.8 h1:obN1ZagJSUGI0Ek/LBmuj4SNLPfIny3KsKFopxRdj10= gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.3.0 h1:clyUAQHOM3G0M3f5vQj7LuJrETvjVot3Z5el9nffUtU= +gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= diff --git a/pkg/common/yaml/testdata/config.yml b/pkg/common/yaml/testdata/config.yml new file mode 100644 index 000000000..b5c2ca8ad --- /dev/null +++ b/pkg/common/yaml/testdata/config.yml @@ -0,0 +1,7 @@ + +intTest: 11 +booleanTest: false +strTest: "strTest" + +child: + strTest: "childStrTest" \ No newline at end of file diff --git a/pkg/common/yaml/yaml.go b/pkg/common/yaml/yaml.go new file mode 100644 index 000000000..de67bfca5 --- /dev/null +++ b/pkg/common/yaml/yaml.go @@ -0,0 +1,60 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + */ + +package yaml + +import ( + "io/ioutil" + "path" +) + +import ( + perrors "github.com/pkg/errors" + "gopkg.in/yaml.v2" +) + +// LoadYMLConfig Load yml config byte from file +func LoadYMLConfig(confProFile string) ([]byte, error) { + if len(confProFile) == 0 { + return nil, perrors.Errorf("configure file name is nil") + } + + if path.Ext(confProFile) != ".yml" { + return nil, perrors.Errorf("configure file name{%v} suffix must be .yml", confProFile) + } + + return ioutil.ReadFile(confProFile) +} + +// UnmarshalYMLConfig Load yml config byte from file, then unmarshal to object +func UnmarshalYMLConfig(confProFile string, out interface{}) ([]byte, error) { + confFileStream, err := LoadYMLConfig(confProFile) + if err != nil { + return confFileStream, perrors.Errorf("ioutil.ReadFile(file:%s) = error:%v", confProFile, perrors.WithStack(err)) + } + return confFileStream, yaml.Unmarshal(confFileStream, out) +} + +//UnmarshalYML unmarshals decodes the first document found within the in byte slice and assigns decoded values into the out value. +func UnmarshalYML(data []byte, out interface{}) error { + return yaml.Unmarshal(data, out) +} + +// MarshalYML serializes the value provided into a YAML document. +func MarshalYML(in interface{}) ([]byte, error) { + return yaml.Marshal(in) +} diff --git a/pkg/common/yaml/yaml_test.go b/pkg/common/yaml/yaml_test.go new file mode 100644 index 000000000..5a271a258 --- /dev/null +++ b/pkg/common/yaml/yaml_test.go @@ -0,0 +1,70 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + */ + +package yaml + +import ( + "path/filepath" + "testing" +) + +import ( + "github.com/stretchr/testify/assert" +) + +func TestUnmarshalYMLConfig(t *testing.T) { + conPath, err := filepath.Abs("./testdata/config.yml") + assert.NoError(t, err) + c := &Config{} + _, err = UnmarshalYMLConfig(conPath, c) + assert.NoError(t, err) + assert.Equal(t, "strTest", c.StrTest) + assert.Equal(t, 11, c.IntTest) + assert.Equal(t, false, c.BooleanTest) + assert.Equal(t, "childStrTest", c.ChildConfig.StrTest) +} + +func TestUnmarshalYMLConfigError(t *testing.T) { + c := &Config{} + _, err := UnmarshalYMLConfig("./testdata/config", c) + assert.Error(t, err) + _, err = UnmarshalYMLConfig("", c) + assert.Error(t, err) +} + +func TestUnmarshalYML(t *testing.T) { + c := &Config{} + b, err := LoadYMLConfig("./testdata/config.yml") + assert.NoError(t, err) + err = UnmarshalYML(b, c) + assert.NoError(t, err) + assert.Equal(t, "strTest", c.StrTest) + assert.Equal(t, 11, c.IntTest) + assert.Equal(t, false, c.BooleanTest) + assert.Equal(t, "childStrTest", c.ChildConfig.StrTest) +} + +type Config struct { + StrTest string `yaml:"strTest" default:"default" json:"strTest,omitempty" property:"strTest"` + IntTest int `default:"109" yaml:"intTest" json:"intTest,omitempty" property:"intTest"` + BooleanTest bool `yaml:"booleanTest" default:"true" json:"booleanTest,omitempty"` + ChildConfig ChildConfig `yaml:"child" json:"child,omitempty"` +} + +type ChildConfig struct { + StrTest string `default:"strTest" default:"default" yaml:"strTest" json:"strTest,omitempty"` +} diff --git a/pkg/config/api_config.go b/pkg/config/api_config.go index e982966da..9e5bd74b1 100644 --- a/pkg/config/api_config.go +++ b/pkg/config/api_config.go @@ -1,67 +1,176 @@ -package model +package config import ( - "sync" + "log" ) -var ( - CacheApi = sync.Map{} +import ( + "github.com/dubbogo/dubbo-go-proxy/pkg/client/dubbo" + "github.com/dubbogo/dubbo-go-proxy/pkg/common/yaml" + perrors "github.com/pkg/errors" ) -// Api is api gateway concept, control request from browser、Mobile APP、third party people -type Api struct { - Name string `json:"name"` - ITypeStr string `json:"itype"` - IType ApiType `json:"-"` - OTypeStr string `json:"otype"` - OType ApiType `json:"-"` - Status Status `json:"status"` - Metadata interface{} `json:"metadata"` - Method string `json:"method"` - RequestMethod -} +// import ( +// "sync" +// ) + +// var ( +// CacheApi = sync.Map{} +// ) + +// // Api is api gateway concept, control request from browser、Mobile APP、third party people +// type Api struct { +// Name string `json:"name"` +// ITypeStr string `json:"itype"` +// IType ApiType `json:"-"` +// OTypeStr string `json:"otype"` +// OType ApiType `json:"-"` +// Status Status `json:"status"` +// Metadata interface{} `json:"metadata"` +// Method string `json:"method"` +// RequestMethod +// } + +// var EmptyApi = &Api{} + +// func NewApi() *Api { +// return &Api{} +// } + +// func (a *Api) FindApi(name string) (*Api, bool) { +// if v, ok := CacheApi.Load(name); ok { +// return v.(*Api), true +// } + +// return nil, false +// } + +// func (a *Api) MatchMethod(method string) bool { +// i := RequestMethodValue[method] +// if a.RequestMethod == RequestMethod(i) { +// return true +// } + +// return false +// } + +// func (a *Api) IsOk(name string) bool { +// if v, ok := CacheApi.Load(name); ok { +// return v.(*Api).Status == Up +// } + +// return false +// } + +// // Offline api offline +// func (a *Api) Offline(name string) { +// if v, ok := CacheApi.Load(name); ok { +// v.(*Api).Status = Down +// } +// } -var EmptyApi = &Api{} +// // Online api online +// func (a *Api) Online(name string) { +// if v, ok := CacheApi.Load(name); ok { +// v.(*Api).Status = Up +// } +// } -func NewApi() *Api { - return &Api{} +// HTTPVerb defines the restful api http verb +type HTTPVerb string + +const ( + // MethodAny any method + MethodAny HTTPVerb = "ANY" + // MethodGet get + MethodGet HTTPVerb = "GET" + // MethodHead head + MethodHead HTTPVerb = "HEAD" + // MethodPost post + MethodPost HTTPVerb = "POST" + // MethodPut put + MethodPut HTTPVerb = "PUT" + // MethodPatch patch + MethodPatch HTTPVerb = "PATCH" // RFC 5789 + // MethodDelete delete + MethodDelete HTTPVerb = "DELETE" + // MethodOptions options + MethodOptions HTTPVerb = "OPTIONS" +) + +// APIConfig defines the data structure of the api gateway configuration +type APIConfig struct { + Name string `yaml:"name"` + Description string `yaml:"description"` + Resources []Resource `yaml:"resources"` + Definitions []Definition `yaml:"definitions"` } -func (a *Api) FindApi(name string) (*Api, bool) { - if v, ok := CacheApi.Load(name); ok { - return v.(*Api), true - } +// Resource defines the API path +type Resource struct { + Type string `yaml:"type"` // Restful, Dubbo + Path string `yaml:"path"` + Description string `yaml:"description"` + Filters []string `yaml:"filters"` + Methods []Method `yaml:"methods"` + Resources []Resource `yaml:"resources,omitempty"` +} - return nil, false +// Method defines the method of the api +type Method struct { + OnAir bool `yaml:"onAir"` + HTTPVerb `yaml:"httpVerb"` + InboundRequest `yaml:"inboundRequest"` } -func (a *Api) MatchMethod(method string) bool { - i := RequestMethodValue[method] - if a.RequestMethod == RequestMethod(i) { - return true - } +// InboundRequest defines the details of the inbound +type InboundRequest struct { + Type string `yaml:"type"` //http, TO-DO: dubbo + Headers []Params `yaml:"headers"` + QueryStrings []Params `yaml:"queryStrings"` + RequestBody []BodyDefinition `yaml:"requestBody"` +} - return false +// Params defines the simple parameter definition +type Params struct { + Name string `yaml:"name"` + Required bool `yaml:"required"` } -func (a *Api) IsOk(name string) bool { - if v, ok := CacheApi.Load(name); ok { - return v.(*Api).Status == Up - } +// BodyDefinition connects the request body to the definitions +type BodyDefinition struct { + DefinitionName string `yaml:"definitionName"` + ContentType string `yaml:"contentType"` +} - return false +// IntegrationRequest defines the backend request format and target +type IntegrationRequest struct { + Type string `yaml:"type"` // dubbo, TO-DO: http + dubbo.DubboMetadata `yaml:"dubboMetaData,inline"` } -// Offline api offline -func (a *Api) Offline(name string) { - if v, ok := CacheApi.Load(name); ok { - v.(*Api).Status = Down - } +// MappingParams defines the mapping rules of headers and queryStrings +type MappingParams struct { + Name string `yaml:"name"` + MapTo string `yaml:"mapTo"` } -// Online api online -func (a *Api) Online(name string) { - if v, ok := CacheApi.Load(name); ok { - v.(*Api).Status = Up +// Definition defines the complex json request body +type Definition struct { + Name string `yaml:"name"` + Schema string `yaml:"schema"` // use json schema +} + +// LoadAPIConfigFromFile load the api config from file +func LoadAPIConfigFromFile(path string) (*APIConfig, error) { + if len(path) == 0 { + return nil, perrors.Errorf("Config file not specified") + } + log.Printf("Load API configuration file form %s", path) + apiConf := &APIConfig{} + _, err := yaml.UnmarshalYMLConfig(path, apiConf) + if err != nil { + return nil, perrors.Errorf("unmarshalYmlConfig error %v", perrors.WithStack(err)) } + return apiConf, nil } diff --git a/pkg/config/api_config_test.go b/pkg/config/api_config_test.go index e69de29bb..172b69172 100644 --- a/pkg/config/api_config_test.go +++ b/pkg/config/api_config_test.go @@ -0,0 +1,24 @@ +package config_test + +import ( + "log" + "testing" +) + +import ( + "github.com/dubbogo/dubbo-go-proxy/pkg/config" + "github.com/ghodss/yaml" + "github.com/stretchr/testify/assert" +) + +func TestLoadAPIConfigFromFile(t *testing.T) { + apiC, err := config.LoadAPIConfigFromFile("") + assert.Empty(t, apiC) + assert.EqualError(t, err, "Config file not specified") + + apiC, err = config.LoadAPIConfigFromFile("./mock/api_config.yml") + assert.Empty(t, err) + assert.Equal(t, apiC.Name, "api name") + bytes, _ := yaml.Marshal(apiC) + log.Printf("%s", bytes) +} diff --git a/pkg/config/mock/api_config.yml b/pkg/config/mock/api_config.yml new file mode 100644 index 000000000..624b90c9e --- /dev/null +++ b/pkg/config/mock/api_config.yml @@ -0,0 +1,52 @@ +name: api name +description: api description +resources: + - path: '/' + type: restful + description: resource documentation + filters: + - filterA + - filterB + methods: + - httpVerb: GET + onAir: true + inboundRequest: + type: http + headers: + - name: auth + required: true + queryStrings: + - name: page + required: false + - name: type + required: false + requestBody: + - definitionName: modelDefinition + contentType: application/json + integrationRequest: + type: dubbo + applicationName: BDTService + group: test + version: 1.0.0 + interface: com.ikurento.user.UserProvider + Method: GetUser + paramTypes: + - java.lang.String + ClusterName: test_dubbo +definitions: + - name: modelDefinition + schema: >- + { + "type" : "object", + "properties" : { + "id" : { + "type" : "integer" + }, + "type" : { + "type" : "string" + }, + "price" : { + "type" : "number" + } + } + } diff --git a/pkg/logger/logger.go b/pkg/logger/logger.go index bacbdfbad..71913a0f4 100644 --- a/pkg/logger/logger.go +++ b/pkg/logger/logger.go @@ -25,10 +25,10 @@ import ( ) import ( + "github.com/ghodss/yaml" perrors "github.com/pkg/errors" "go.uber.org/zap" "go.uber.org/zap/zapcore" - "gopkg.in/yaml.v2" ) var ( From 6b9db1d4f237c60b1084d88caf37dec12fc0cb56 Mon Sep 17 00:00:00 2001 From: william feng <> Date: Sat, 12 Sep 2020 16:57:40 +0800 Subject: [PATCH 081/227] changed the api config structure --- configs/api_config.yaml | 12 +- go.sum | 2 + pkg/common/yaml/testdata/config.yml | 7 + pkg/common/yaml/yaml.go | 60 +++++++++ pkg/common/yaml/yaml_test.go | 70 ++++++++++ pkg/config/api_config.go | 197 +++++++++++++++++++++------- pkg/config/api_config_test.go | 24 ++++ pkg/config/mock/api_config.yml | 52 ++++++++ pkg/logger/logger.go | 2 +- 9 files changed, 379 insertions(+), 47 deletions(-) create mode 100644 pkg/common/yaml/testdata/config.yml create mode 100644 pkg/common/yaml/yaml.go create mode 100644 pkg/common/yaml/yaml_test.go create mode 100644 pkg/config/mock/api_config.yml diff --git a/configs/api_config.yaml b/configs/api_config.yaml index 9723bf7cb..f041446e1 100644 --- a/configs/api_config.yaml +++ b/configs/api_config.yaml @@ -8,12 +8,14 @@ name: api name description: api description resources: - path: '/' + type: restful description: resource documentation filters: - filterA - filterB methods: - - method: GET + - httpVerb: GET + onAir: true inboundRequest: type: http headers: @@ -28,8 +30,14 @@ resources: - modelDefinition integrationRequest: type: dubbo + applicationName: BDTService + group: test + version: 1.0.0 + interface: com.ikurento.user.UserProvider + Method: GetUser paramTypes: - - "com.ikurento.user.User" + - java.lang.String + ClusterName: test_dubbo Definitions: diff --git a/go.sum b/go.sum index 19b2130bf..cc1e82215 100644 --- a/go.sum +++ b/go.sum @@ -693,6 +693,8 @@ gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.8 h1:obN1ZagJSUGI0Ek/LBmuj4SNLPfIny3KsKFopxRdj10= gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.3.0 h1:clyUAQHOM3G0M3f5vQj7LuJrETvjVot3Z5el9nffUtU= +gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= diff --git a/pkg/common/yaml/testdata/config.yml b/pkg/common/yaml/testdata/config.yml new file mode 100644 index 000000000..b5c2ca8ad --- /dev/null +++ b/pkg/common/yaml/testdata/config.yml @@ -0,0 +1,7 @@ + +intTest: 11 +booleanTest: false +strTest: "strTest" + +child: + strTest: "childStrTest" \ No newline at end of file diff --git a/pkg/common/yaml/yaml.go b/pkg/common/yaml/yaml.go new file mode 100644 index 000000000..de67bfca5 --- /dev/null +++ b/pkg/common/yaml/yaml.go @@ -0,0 +1,60 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + */ + +package yaml + +import ( + "io/ioutil" + "path" +) + +import ( + perrors "github.com/pkg/errors" + "gopkg.in/yaml.v2" +) + +// LoadYMLConfig Load yml config byte from file +func LoadYMLConfig(confProFile string) ([]byte, error) { + if len(confProFile) == 0 { + return nil, perrors.Errorf("configure file name is nil") + } + + if path.Ext(confProFile) != ".yml" { + return nil, perrors.Errorf("configure file name{%v} suffix must be .yml", confProFile) + } + + return ioutil.ReadFile(confProFile) +} + +// UnmarshalYMLConfig Load yml config byte from file, then unmarshal to object +func UnmarshalYMLConfig(confProFile string, out interface{}) ([]byte, error) { + confFileStream, err := LoadYMLConfig(confProFile) + if err != nil { + return confFileStream, perrors.Errorf("ioutil.ReadFile(file:%s) = error:%v", confProFile, perrors.WithStack(err)) + } + return confFileStream, yaml.Unmarshal(confFileStream, out) +} + +//UnmarshalYML unmarshals decodes the first document found within the in byte slice and assigns decoded values into the out value. +func UnmarshalYML(data []byte, out interface{}) error { + return yaml.Unmarshal(data, out) +} + +// MarshalYML serializes the value provided into a YAML document. +func MarshalYML(in interface{}) ([]byte, error) { + return yaml.Marshal(in) +} diff --git a/pkg/common/yaml/yaml_test.go b/pkg/common/yaml/yaml_test.go new file mode 100644 index 000000000..5a271a258 --- /dev/null +++ b/pkg/common/yaml/yaml_test.go @@ -0,0 +1,70 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + */ + +package yaml + +import ( + "path/filepath" + "testing" +) + +import ( + "github.com/stretchr/testify/assert" +) + +func TestUnmarshalYMLConfig(t *testing.T) { + conPath, err := filepath.Abs("./testdata/config.yml") + assert.NoError(t, err) + c := &Config{} + _, err = UnmarshalYMLConfig(conPath, c) + assert.NoError(t, err) + assert.Equal(t, "strTest", c.StrTest) + assert.Equal(t, 11, c.IntTest) + assert.Equal(t, false, c.BooleanTest) + assert.Equal(t, "childStrTest", c.ChildConfig.StrTest) +} + +func TestUnmarshalYMLConfigError(t *testing.T) { + c := &Config{} + _, err := UnmarshalYMLConfig("./testdata/config", c) + assert.Error(t, err) + _, err = UnmarshalYMLConfig("", c) + assert.Error(t, err) +} + +func TestUnmarshalYML(t *testing.T) { + c := &Config{} + b, err := LoadYMLConfig("./testdata/config.yml") + assert.NoError(t, err) + err = UnmarshalYML(b, c) + assert.NoError(t, err) + assert.Equal(t, "strTest", c.StrTest) + assert.Equal(t, 11, c.IntTest) + assert.Equal(t, false, c.BooleanTest) + assert.Equal(t, "childStrTest", c.ChildConfig.StrTest) +} + +type Config struct { + StrTest string `yaml:"strTest" default:"default" json:"strTest,omitempty" property:"strTest"` + IntTest int `default:"109" yaml:"intTest" json:"intTest,omitempty" property:"intTest"` + BooleanTest bool `yaml:"booleanTest" default:"true" json:"booleanTest,omitempty"` + ChildConfig ChildConfig `yaml:"child" json:"child,omitempty"` +} + +type ChildConfig struct { + StrTest string `default:"strTest" default:"default" yaml:"strTest" json:"strTest,omitempty"` +} diff --git a/pkg/config/api_config.go b/pkg/config/api_config.go index e982966da..9e5bd74b1 100644 --- a/pkg/config/api_config.go +++ b/pkg/config/api_config.go @@ -1,67 +1,176 @@ -package model +package config import ( - "sync" + "log" ) -var ( - CacheApi = sync.Map{} +import ( + "github.com/dubbogo/dubbo-go-proxy/pkg/client/dubbo" + "github.com/dubbogo/dubbo-go-proxy/pkg/common/yaml" + perrors "github.com/pkg/errors" ) -// Api is api gateway concept, control request from browser、Mobile APP、third party people -type Api struct { - Name string `json:"name"` - ITypeStr string `json:"itype"` - IType ApiType `json:"-"` - OTypeStr string `json:"otype"` - OType ApiType `json:"-"` - Status Status `json:"status"` - Metadata interface{} `json:"metadata"` - Method string `json:"method"` - RequestMethod -} +// import ( +// "sync" +// ) + +// var ( +// CacheApi = sync.Map{} +// ) + +// // Api is api gateway concept, control request from browser、Mobile APP、third party people +// type Api struct { +// Name string `json:"name"` +// ITypeStr string `json:"itype"` +// IType ApiType `json:"-"` +// OTypeStr string `json:"otype"` +// OType ApiType `json:"-"` +// Status Status `json:"status"` +// Metadata interface{} `json:"metadata"` +// Method string `json:"method"` +// RequestMethod +// } + +// var EmptyApi = &Api{} + +// func NewApi() *Api { +// return &Api{} +// } + +// func (a *Api) FindApi(name string) (*Api, bool) { +// if v, ok := CacheApi.Load(name); ok { +// return v.(*Api), true +// } + +// return nil, false +// } + +// func (a *Api) MatchMethod(method string) bool { +// i := RequestMethodValue[method] +// if a.RequestMethod == RequestMethod(i) { +// return true +// } + +// return false +// } + +// func (a *Api) IsOk(name string) bool { +// if v, ok := CacheApi.Load(name); ok { +// return v.(*Api).Status == Up +// } + +// return false +// } + +// // Offline api offline +// func (a *Api) Offline(name string) { +// if v, ok := CacheApi.Load(name); ok { +// v.(*Api).Status = Down +// } +// } -var EmptyApi = &Api{} +// // Online api online +// func (a *Api) Online(name string) { +// if v, ok := CacheApi.Load(name); ok { +// v.(*Api).Status = Up +// } +// } -func NewApi() *Api { - return &Api{} +// HTTPVerb defines the restful api http verb +type HTTPVerb string + +const ( + // MethodAny any method + MethodAny HTTPVerb = "ANY" + // MethodGet get + MethodGet HTTPVerb = "GET" + // MethodHead head + MethodHead HTTPVerb = "HEAD" + // MethodPost post + MethodPost HTTPVerb = "POST" + // MethodPut put + MethodPut HTTPVerb = "PUT" + // MethodPatch patch + MethodPatch HTTPVerb = "PATCH" // RFC 5789 + // MethodDelete delete + MethodDelete HTTPVerb = "DELETE" + // MethodOptions options + MethodOptions HTTPVerb = "OPTIONS" +) + +// APIConfig defines the data structure of the api gateway configuration +type APIConfig struct { + Name string `yaml:"name"` + Description string `yaml:"description"` + Resources []Resource `yaml:"resources"` + Definitions []Definition `yaml:"definitions"` } -func (a *Api) FindApi(name string) (*Api, bool) { - if v, ok := CacheApi.Load(name); ok { - return v.(*Api), true - } +// Resource defines the API path +type Resource struct { + Type string `yaml:"type"` // Restful, Dubbo + Path string `yaml:"path"` + Description string `yaml:"description"` + Filters []string `yaml:"filters"` + Methods []Method `yaml:"methods"` + Resources []Resource `yaml:"resources,omitempty"` +} - return nil, false +// Method defines the method of the api +type Method struct { + OnAir bool `yaml:"onAir"` + HTTPVerb `yaml:"httpVerb"` + InboundRequest `yaml:"inboundRequest"` } -func (a *Api) MatchMethod(method string) bool { - i := RequestMethodValue[method] - if a.RequestMethod == RequestMethod(i) { - return true - } +// InboundRequest defines the details of the inbound +type InboundRequest struct { + Type string `yaml:"type"` //http, TO-DO: dubbo + Headers []Params `yaml:"headers"` + QueryStrings []Params `yaml:"queryStrings"` + RequestBody []BodyDefinition `yaml:"requestBody"` +} - return false +// Params defines the simple parameter definition +type Params struct { + Name string `yaml:"name"` + Required bool `yaml:"required"` } -func (a *Api) IsOk(name string) bool { - if v, ok := CacheApi.Load(name); ok { - return v.(*Api).Status == Up - } +// BodyDefinition connects the request body to the definitions +type BodyDefinition struct { + DefinitionName string `yaml:"definitionName"` + ContentType string `yaml:"contentType"` +} - return false +// IntegrationRequest defines the backend request format and target +type IntegrationRequest struct { + Type string `yaml:"type"` // dubbo, TO-DO: http + dubbo.DubboMetadata `yaml:"dubboMetaData,inline"` } -// Offline api offline -func (a *Api) Offline(name string) { - if v, ok := CacheApi.Load(name); ok { - v.(*Api).Status = Down - } +// MappingParams defines the mapping rules of headers and queryStrings +type MappingParams struct { + Name string `yaml:"name"` + MapTo string `yaml:"mapTo"` } -// Online api online -func (a *Api) Online(name string) { - if v, ok := CacheApi.Load(name); ok { - v.(*Api).Status = Up +// Definition defines the complex json request body +type Definition struct { + Name string `yaml:"name"` + Schema string `yaml:"schema"` // use json schema +} + +// LoadAPIConfigFromFile load the api config from file +func LoadAPIConfigFromFile(path string) (*APIConfig, error) { + if len(path) == 0 { + return nil, perrors.Errorf("Config file not specified") + } + log.Printf("Load API configuration file form %s", path) + apiConf := &APIConfig{} + _, err := yaml.UnmarshalYMLConfig(path, apiConf) + if err != nil { + return nil, perrors.Errorf("unmarshalYmlConfig error %v", perrors.WithStack(err)) } + return apiConf, nil } diff --git a/pkg/config/api_config_test.go b/pkg/config/api_config_test.go index e69de29bb..172b69172 100644 --- a/pkg/config/api_config_test.go +++ b/pkg/config/api_config_test.go @@ -0,0 +1,24 @@ +package config_test + +import ( + "log" + "testing" +) + +import ( + "github.com/dubbogo/dubbo-go-proxy/pkg/config" + "github.com/ghodss/yaml" + "github.com/stretchr/testify/assert" +) + +func TestLoadAPIConfigFromFile(t *testing.T) { + apiC, err := config.LoadAPIConfigFromFile("") + assert.Empty(t, apiC) + assert.EqualError(t, err, "Config file not specified") + + apiC, err = config.LoadAPIConfigFromFile("./mock/api_config.yml") + assert.Empty(t, err) + assert.Equal(t, apiC.Name, "api name") + bytes, _ := yaml.Marshal(apiC) + log.Printf("%s", bytes) +} diff --git a/pkg/config/mock/api_config.yml b/pkg/config/mock/api_config.yml new file mode 100644 index 000000000..624b90c9e --- /dev/null +++ b/pkg/config/mock/api_config.yml @@ -0,0 +1,52 @@ +name: api name +description: api description +resources: + - path: '/' + type: restful + description: resource documentation + filters: + - filterA + - filterB + methods: + - httpVerb: GET + onAir: true + inboundRequest: + type: http + headers: + - name: auth + required: true + queryStrings: + - name: page + required: false + - name: type + required: false + requestBody: + - definitionName: modelDefinition + contentType: application/json + integrationRequest: + type: dubbo + applicationName: BDTService + group: test + version: 1.0.0 + interface: com.ikurento.user.UserProvider + Method: GetUser + paramTypes: + - java.lang.String + ClusterName: test_dubbo +definitions: + - name: modelDefinition + schema: >- + { + "type" : "object", + "properties" : { + "id" : { + "type" : "integer" + }, + "type" : { + "type" : "string" + }, + "price" : { + "type" : "number" + } + } + } diff --git a/pkg/logger/logger.go b/pkg/logger/logger.go index bacbdfbad..71913a0f4 100644 --- a/pkg/logger/logger.go +++ b/pkg/logger/logger.go @@ -25,10 +25,10 @@ import ( ) import ( + "github.com/ghodss/yaml" perrors "github.com/pkg/errors" "go.uber.org/zap" "go.uber.org/zap/zapcore" - "gopkg.in/yaml.v2" ) var ( From 22a793e6ec1c94b0c3ff1fe561cddaf2aa73edf1 Mon Sep 17 00:00:00 2001 From: william feng <> Date: Sat, 19 Sep 2020 15:27:39 +0800 Subject: [PATCH 082/227] included the integration config for api --- configs/api_config.yaml | 21 +++---- go.mod | 2 +- go.sum | 4 +- pkg/client/dubbo/dubbo_client.go | 2 +- pkg/config/api_config.go | 101 +++++++++---------------------- pkg/config/api_config_test.go | 17 ++++++ pkg/config/mock/api_config.yml | 9 ++- 7 files changed, 61 insertions(+), 95 deletions(-) diff --git a/configs/api_config.yaml b/configs/api_config.yaml index f041446e1..35ab2d5bf 100644 --- a/configs/api_config.yaml +++ b/configs/api_config.yaml @@ -1,9 +1,3 @@ -# - name: "test-dubbo/user" -# target: "queryUser" -# method: "POST" -# types: -# - "com.ikurento.user.User" - name: api name description: api description resources: @@ -20,16 +14,20 @@ resources: type: http headers: - name: auth - - required: true + required: true queryStrings: - - name: page + - name: id required: false - name: type required: false requestBody: - - modelDefinition + - definitionName: modelDefinition + contentType: application/json integrationRequest: type: dubbo + mappingParams: + - name: queryStrings.id + mapTo: 1 applicationName: BDTService group: test version: 1.0.0 @@ -38,11 +36,8 @@ resources: paramTypes: - java.lang.String ClusterName: test_dubbo - - -Definitions: +definitions: - name: modelDefinition - contentType: application/json schema: >- { "type" : "object", diff --git a/go.mod b/go.mod index 2129b0bd4..c0782e824 100644 --- a/go.mod +++ b/go.mod @@ -11,4 +11,4 @@ require ( github.com/urfave/cli v1.22.4 go.uber.org/zap v1.15.0 gopkg.in/yaml.v2 v2.2.8 -) +) \ No newline at end of file diff --git a/go.sum b/go.sum index cc1e82215..4ffe74917 100644 --- a/go.sum +++ b/go.sum @@ -693,8 +693,6 @@ gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.8 h1:obN1ZagJSUGI0Ek/LBmuj4SNLPfIny3KsKFopxRdj10= gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.3.0 h1:clyUAQHOM3G0M3f5vQj7LuJrETvjVot3Z5el9nffUtU= -gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= @@ -715,4 +713,4 @@ k8s.io/utils v0.0.0-20190801114015-581e00157fb1/go.mod h1:sZAwmy6armz5eXlNoLmJcl launchpad.net/gocheck v0.0.0-20140225173054-000000000087/go.mod h1:hj7XX3B/0A+80Vse0e+BUHsHMTEhd0O4cpUHr/e/BUM= rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= sigs.k8s.io/structured-merge-diff v0.0.0-20190525122527-15d366b2352e/go.mod h1:wWxsB5ozmmv/SG7nM11ayaAW51xMvak/t1r0CSlcokI= -sigs.k8s.io/yaml v1.1.0/go.mod h1:UJmg0vDUVViEyp3mgSv9WPwZCDxu4rQW1olrI1uml+o= +sigs.k8s.io/yaml v1.1.0/go.mod h1:UJmg0vDUVViEyp3mgSv9WPwZCDxu4rQW1olrI1uml+o= \ No newline at end of file diff --git a/pkg/client/dubbo/dubbo_client.go b/pkg/client/dubbo/dubbo_client.go index 225cef478..0d4a1bf98 100644 --- a/pkg/client/dubbo/dubbo_client.go +++ b/pkg/client/dubbo/dubbo_client.go @@ -49,7 +49,7 @@ type DubboMetadata struct { Version string `yaml:"version" json:"version" mapstructure:"version"` Interface string `yaml:"interface" json:"interface" mapstructure:"interface"` Method string `yaml:"method" json:"method" mapstructure:"method"` - Types []string `yaml:"type" json:"types" mapstructure:"types"` + Types []string `yaml:"types" json:"types" mapstructure:"types"` Retries string `yaml:"retries" json:"retries,omitempty" property:"retries"` ClusterName string `yaml:"cluster_name" json:"cluster_name,omitempty" property:"cluster_name"` ProtocolTypeStr string `yaml:"protocol_type" json:"protocol_type,omitempty" property:"protocol_type"` diff --git a/pkg/config/api_config.go b/pkg/config/api_config.go index 9e5bd74b1..6544e225e 100644 --- a/pkg/config/api_config.go +++ b/pkg/config/api_config.go @@ -1,3 +1,20 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + */ + package config import ( @@ -10,72 +27,6 @@ import ( perrors "github.com/pkg/errors" ) -// import ( -// "sync" -// ) - -// var ( -// CacheApi = sync.Map{} -// ) - -// // Api is api gateway concept, control request from browser、Mobile APP、third party people -// type Api struct { -// Name string `json:"name"` -// ITypeStr string `json:"itype"` -// IType ApiType `json:"-"` -// OTypeStr string `json:"otype"` -// OType ApiType `json:"-"` -// Status Status `json:"status"` -// Metadata interface{} `json:"metadata"` -// Method string `json:"method"` -// RequestMethod -// } - -// var EmptyApi = &Api{} - -// func NewApi() *Api { -// return &Api{} -// } - -// func (a *Api) FindApi(name string) (*Api, bool) { -// if v, ok := CacheApi.Load(name); ok { -// return v.(*Api), true -// } - -// return nil, false -// } - -// func (a *Api) MatchMethod(method string) bool { -// i := RequestMethodValue[method] -// if a.RequestMethod == RequestMethod(i) { -// return true -// } - -// return false -// } - -// func (a *Api) IsOk(name string) bool { -// if v, ok := CacheApi.Load(name); ok { -// return v.(*Api).Status == Up -// } - -// return false -// } - -// // Offline api offline -// func (a *Api) Offline(name string) { -// if v, ok := CacheApi.Load(name); ok { -// v.(*Api).Status = Down -// } -// } - -// // Online api online -// func (a *Api) Online(name string) { -// if v, ok := CacheApi.Load(name); ok { -// v.(*Api).Status = Up -// } -// } - // HTTPVerb defines the restful api http verb type HTTPVerb string @@ -118,14 +69,15 @@ type Resource struct { // Method defines the method of the api type Method struct { - OnAir bool `yaml:"onAir"` - HTTPVerb `yaml:"httpVerb"` - InboundRequest `yaml:"inboundRequest"` + OnAir bool `yaml:"onAir"` + HTTPVerb `yaml:"httpVerb"` + InboundRequest `yaml:"inboundRequest"` + IntegrationRequest `yaml:"integrationRequest"` } // InboundRequest defines the details of the inbound type InboundRequest struct { - Type string `yaml:"type"` //http, TO-DO: dubbo + RequestType string `yaml:"requestType"` //http, TO-DO: dubbo Headers []Params `yaml:"headers"` QueryStrings []Params `yaml:"queryStrings"` RequestBody []BodyDefinition `yaml:"requestBody"` @@ -145,12 +97,13 @@ type BodyDefinition struct { // IntegrationRequest defines the backend request format and target type IntegrationRequest struct { - Type string `yaml:"type"` // dubbo, TO-DO: http - dubbo.DubboMetadata `yaml:"dubboMetaData,inline"` + RequestType string `yaml:"requestType"` // dubbo, TO-DO: http + MappingParams []MappingParam `yaml:"mappingParams,omitempty"` + dubbo.DubboMetadata `yaml:"dubboMetaData,inline,omitempty"` } -// MappingParams defines the mapping rules of headers and queryStrings -type MappingParams struct { +// MappingParam defines the mapping rules of headers and queryStrings +type MappingParam struct { Name string `yaml:"name"` MapTo string `yaml:"mapTo"` } diff --git a/pkg/config/api_config_test.go b/pkg/config/api_config_test.go index 172b69172..0644ea9a3 100644 --- a/pkg/config/api_config_test.go +++ b/pkg/config/api_config_test.go @@ -1,3 +1,20 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + */ + package config_test import ( diff --git a/pkg/config/mock/api_config.yml b/pkg/config/mock/api_config.yml index 624b90c9e..80769333e 100644 --- a/pkg/config/mock/api_config.yml +++ b/pkg/config/mock/api_config.yml @@ -11,12 +11,12 @@ resources: - httpVerb: GET onAir: true inboundRequest: - type: http + requestType: http headers: - name: auth required: true queryStrings: - - name: page + - name: id required: false - name: type required: false @@ -24,7 +24,10 @@ resources: - definitionName: modelDefinition contentType: application/json integrationRequest: - type: dubbo + requestType: dubbo + mappingParams: + - name: queryStrings.id + mapTo: 1 applicationName: BDTService group: test version: 1.0.0 From e8b4798904acc608a5a7aa8903c9d01ad61e5e2c Mon Sep 17 00:00:00 2001 From: william feng <> Date: Sat, 19 Sep 2020 15:27:39 +0800 Subject: [PATCH 083/227] included the integration config for api --- configs/api_config.yaml | 21 +++---- go.mod | 2 +- go.sum | 4 +- pkg/client/dubbo/dubbo_client.go | 2 +- pkg/config/api_config.go | 101 +++++++++---------------------- pkg/config/api_config_test.go | 17 ++++++ pkg/config/mock/api_config.yml | 9 ++- 7 files changed, 61 insertions(+), 95 deletions(-) diff --git a/configs/api_config.yaml b/configs/api_config.yaml index f041446e1..35ab2d5bf 100644 --- a/configs/api_config.yaml +++ b/configs/api_config.yaml @@ -1,9 +1,3 @@ -# - name: "test-dubbo/user" -# target: "queryUser" -# method: "POST" -# types: -# - "com.ikurento.user.User" - name: api name description: api description resources: @@ -20,16 +14,20 @@ resources: type: http headers: - name: auth - - required: true + required: true queryStrings: - - name: page + - name: id required: false - name: type required: false requestBody: - - modelDefinition + - definitionName: modelDefinition + contentType: application/json integrationRequest: type: dubbo + mappingParams: + - name: queryStrings.id + mapTo: 1 applicationName: BDTService group: test version: 1.0.0 @@ -38,11 +36,8 @@ resources: paramTypes: - java.lang.String ClusterName: test_dubbo - - -Definitions: +definitions: - name: modelDefinition - contentType: application/json schema: >- { "type" : "object", diff --git a/go.mod b/go.mod index 2129b0bd4..c0782e824 100644 --- a/go.mod +++ b/go.mod @@ -11,4 +11,4 @@ require ( github.com/urfave/cli v1.22.4 go.uber.org/zap v1.15.0 gopkg.in/yaml.v2 v2.2.8 -) +) \ No newline at end of file diff --git a/go.sum b/go.sum index cc1e82215..4ffe74917 100644 --- a/go.sum +++ b/go.sum @@ -693,8 +693,6 @@ gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.8 h1:obN1ZagJSUGI0Ek/LBmuj4SNLPfIny3KsKFopxRdj10= gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.3.0 h1:clyUAQHOM3G0M3f5vQj7LuJrETvjVot3Z5el9nffUtU= -gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= @@ -715,4 +713,4 @@ k8s.io/utils v0.0.0-20190801114015-581e00157fb1/go.mod h1:sZAwmy6armz5eXlNoLmJcl launchpad.net/gocheck v0.0.0-20140225173054-000000000087/go.mod h1:hj7XX3B/0A+80Vse0e+BUHsHMTEhd0O4cpUHr/e/BUM= rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= sigs.k8s.io/structured-merge-diff v0.0.0-20190525122527-15d366b2352e/go.mod h1:wWxsB5ozmmv/SG7nM11ayaAW51xMvak/t1r0CSlcokI= -sigs.k8s.io/yaml v1.1.0/go.mod h1:UJmg0vDUVViEyp3mgSv9WPwZCDxu4rQW1olrI1uml+o= +sigs.k8s.io/yaml v1.1.0/go.mod h1:UJmg0vDUVViEyp3mgSv9WPwZCDxu4rQW1olrI1uml+o= \ No newline at end of file diff --git a/pkg/client/dubbo/dubbo_client.go b/pkg/client/dubbo/dubbo_client.go index 225cef478..0d4a1bf98 100644 --- a/pkg/client/dubbo/dubbo_client.go +++ b/pkg/client/dubbo/dubbo_client.go @@ -49,7 +49,7 @@ type DubboMetadata struct { Version string `yaml:"version" json:"version" mapstructure:"version"` Interface string `yaml:"interface" json:"interface" mapstructure:"interface"` Method string `yaml:"method" json:"method" mapstructure:"method"` - Types []string `yaml:"type" json:"types" mapstructure:"types"` + Types []string `yaml:"types" json:"types" mapstructure:"types"` Retries string `yaml:"retries" json:"retries,omitempty" property:"retries"` ClusterName string `yaml:"cluster_name" json:"cluster_name,omitempty" property:"cluster_name"` ProtocolTypeStr string `yaml:"protocol_type" json:"protocol_type,omitempty" property:"protocol_type"` diff --git a/pkg/config/api_config.go b/pkg/config/api_config.go index 9e5bd74b1..6544e225e 100644 --- a/pkg/config/api_config.go +++ b/pkg/config/api_config.go @@ -1,3 +1,20 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + */ + package config import ( @@ -10,72 +27,6 @@ import ( perrors "github.com/pkg/errors" ) -// import ( -// "sync" -// ) - -// var ( -// CacheApi = sync.Map{} -// ) - -// // Api is api gateway concept, control request from browser、Mobile APP、third party people -// type Api struct { -// Name string `json:"name"` -// ITypeStr string `json:"itype"` -// IType ApiType `json:"-"` -// OTypeStr string `json:"otype"` -// OType ApiType `json:"-"` -// Status Status `json:"status"` -// Metadata interface{} `json:"metadata"` -// Method string `json:"method"` -// RequestMethod -// } - -// var EmptyApi = &Api{} - -// func NewApi() *Api { -// return &Api{} -// } - -// func (a *Api) FindApi(name string) (*Api, bool) { -// if v, ok := CacheApi.Load(name); ok { -// return v.(*Api), true -// } - -// return nil, false -// } - -// func (a *Api) MatchMethod(method string) bool { -// i := RequestMethodValue[method] -// if a.RequestMethod == RequestMethod(i) { -// return true -// } - -// return false -// } - -// func (a *Api) IsOk(name string) bool { -// if v, ok := CacheApi.Load(name); ok { -// return v.(*Api).Status == Up -// } - -// return false -// } - -// // Offline api offline -// func (a *Api) Offline(name string) { -// if v, ok := CacheApi.Load(name); ok { -// v.(*Api).Status = Down -// } -// } - -// // Online api online -// func (a *Api) Online(name string) { -// if v, ok := CacheApi.Load(name); ok { -// v.(*Api).Status = Up -// } -// } - // HTTPVerb defines the restful api http verb type HTTPVerb string @@ -118,14 +69,15 @@ type Resource struct { // Method defines the method of the api type Method struct { - OnAir bool `yaml:"onAir"` - HTTPVerb `yaml:"httpVerb"` - InboundRequest `yaml:"inboundRequest"` + OnAir bool `yaml:"onAir"` + HTTPVerb `yaml:"httpVerb"` + InboundRequest `yaml:"inboundRequest"` + IntegrationRequest `yaml:"integrationRequest"` } // InboundRequest defines the details of the inbound type InboundRequest struct { - Type string `yaml:"type"` //http, TO-DO: dubbo + RequestType string `yaml:"requestType"` //http, TO-DO: dubbo Headers []Params `yaml:"headers"` QueryStrings []Params `yaml:"queryStrings"` RequestBody []BodyDefinition `yaml:"requestBody"` @@ -145,12 +97,13 @@ type BodyDefinition struct { // IntegrationRequest defines the backend request format and target type IntegrationRequest struct { - Type string `yaml:"type"` // dubbo, TO-DO: http - dubbo.DubboMetadata `yaml:"dubboMetaData,inline"` + RequestType string `yaml:"requestType"` // dubbo, TO-DO: http + MappingParams []MappingParam `yaml:"mappingParams,omitempty"` + dubbo.DubboMetadata `yaml:"dubboMetaData,inline,omitempty"` } -// MappingParams defines the mapping rules of headers and queryStrings -type MappingParams struct { +// MappingParam defines the mapping rules of headers and queryStrings +type MappingParam struct { Name string `yaml:"name"` MapTo string `yaml:"mapTo"` } diff --git a/pkg/config/api_config_test.go b/pkg/config/api_config_test.go index 172b69172..0644ea9a3 100644 --- a/pkg/config/api_config_test.go +++ b/pkg/config/api_config_test.go @@ -1,3 +1,20 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + */ + package config_test import ( diff --git a/pkg/config/mock/api_config.yml b/pkg/config/mock/api_config.yml index 624b90c9e..80769333e 100644 --- a/pkg/config/mock/api_config.yml +++ b/pkg/config/mock/api_config.yml @@ -11,12 +11,12 @@ resources: - httpVerb: GET onAir: true inboundRequest: - type: http + requestType: http headers: - name: auth required: true queryStrings: - - name: page + - name: id required: false - name: type required: false @@ -24,7 +24,10 @@ resources: - definitionName: modelDefinition contentType: application/json integrationRequest: - type: dubbo + requestType: dubbo + mappingParams: + - name: queryStrings.id + mapTo: 1 applicationName: BDTService group: test version: 1.0.0 From 6827ccbeab9d942b35a0ba34571f9c4158b62d4d Mon Sep 17 00:00:00 2001 From: william feng <> Date: Sat, 19 Sep 2020 15:27:39 +0800 Subject: [PATCH 084/227] included the integration config for api --- configs/api_config.yaml | 21 +++---- go.mod | 2 +- go.sum | 4 +- pkg/client/dubbo/dubbo_client.go | 2 +- pkg/config/api_config.go | 101 +++++++++---------------------- pkg/config/api_config_test.go | 17 ++++++ pkg/config/mock/api_config.yml | 9 ++- 7 files changed, 61 insertions(+), 95 deletions(-) diff --git a/configs/api_config.yaml b/configs/api_config.yaml index f041446e1..35ab2d5bf 100644 --- a/configs/api_config.yaml +++ b/configs/api_config.yaml @@ -1,9 +1,3 @@ -# - name: "test-dubbo/user" -# target: "queryUser" -# method: "POST" -# types: -# - "com.ikurento.user.User" - name: api name description: api description resources: @@ -20,16 +14,20 @@ resources: type: http headers: - name: auth - - required: true + required: true queryStrings: - - name: page + - name: id required: false - name: type required: false requestBody: - - modelDefinition + - definitionName: modelDefinition + contentType: application/json integrationRequest: type: dubbo + mappingParams: + - name: queryStrings.id + mapTo: 1 applicationName: BDTService group: test version: 1.0.0 @@ -38,11 +36,8 @@ resources: paramTypes: - java.lang.String ClusterName: test_dubbo - - -Definitions: +definitions: - name: modelDefinition - contentType: application/json schema: >- { "type" : "object", diff --git a/go.mod b/go.mod index 2129b0bd4..c0782e824 100644 --- a/go.mod +++ b/go.mod @@ -11,4 +11,4 @@ require ( github.com/urfave/cli v1.22.4 go.uber.org/zap v1.15.0 gopkg.in/yaml.v2 v2.2.8 -) +) \ No newline at end of file diff --git a/go.sum b/go.sum index cc1e82215..4ffe74917 100644 --- a/go.sum +++ b/go.sum @@ -693,8 +693,6 @@ gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.8 h1:obN1ZagJSUGI0Ek/LBmuj4SNLPfIny3KsKFopxRdj10= gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.3.0 h1:clyUAQHOM3G0M3f5vQj7LuJrETvjVot3Z5el9nffUtU= -gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= @@ -715,4 +713,4 @@ k8s.io/utils v0.0.0-20190801114015-581e00157fb1/go.mod h1:sZAwmy6armz5eXlNoLmJcl launchpad.net/gocheck v0.0.0-20140225173054-000000000087/go.mod h1:hj7XX3B/0A+80Vse0e+BUHsHMTEhd0O4cpUHr/e/BUM= rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= sigs.k8s.io/structured-merge-diff v0.0.0-20190525122527-15d366b2352e/go.mod h1:wWxsB5ozmmv/SG7nM11ayaAW51xMvak/t1r0CSlcokI= -sigs.k8s.io/yaml v1.1.0/go.mod h1:UJmg0vDUVViEyp3mgSv9WPwZCDxu4rQW1olrI1uml+o= +sigs.k8s.io/yaml v1.1.0/go.mod h1:UJmg0vDUVViEyp3mgSv9WPwZCDxu4rQW1olrI1uml+o= \ No newline at end of file diff --git a/pkg/client/dubbo/dubbo_client.go b/pkg/client/dubbo/dubbo_client.go index 225cef478..0d4a1bf98 100644 --- a/pkg/client/dubbo/dubbo_client.go +++ b/pkg/client/dubbo/dubbo_client.go @@ -49,7 +49,7 @@ type DubboMetadata struct { Version string `yaml:"version" json:"version" mapstructure:"version"` Interface string `yaml:"interface" json:"interface" mapstructure:"interface"` Method string `yaml:"method" json:"method" mapstructure:"method"` - Types []string `yaml:"type" json:"types" mapstructure:"types"` + Types []string `yaml:"types" json:"types" mapstructure:"types"` Retries string `yaml:"retries" json:"retries,omitempty" property:"retries"` ClusterName string `yaml:"cluster_name" json:"cluster_name,omitempty" property:"cluster_name"` ProtocolTypeStr string `yaml:"protocol_type" json:"protocol_type,omitempty" property:"protocol_type"` diff --git a/pkg/config/api_config.go b/pkg/config/api_config.go index 9e5bd74b1..6544e225e 100644 --- a/pkg/config/api_config.go +++ b/pkg/config/api_config.go @@ -1,3 +1,20 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + */ + package config import ( @@ -10,72 +27,6 @@ import ( perrors "github.com/pkg/errors" ) -// import ( -// "sync" -// ) - -// var ( -// CacheApi = sync.Map{} -// ) - -// // Api is api gateway concept, control request from browser、Mobile APP、third party people -// type Api struct { -// Name string `json:"name"` -// ITypeStr string `json:"itype"` -// IType ApiType `json:"-"` -// OTypeStr string `json:"otype"` -// OType ApiType `json:"-"` -// Status Status `json:"status"` -// Metadata interface{} `json:"metadata"` -// Method string `json:"method"` -// RequestMethod -// } - -// var EmptyApi = &Api{} - -// func NewApi() *Api { -// return &Api{} -// } - -// func (a *Api) FindApi(name string) (*Api, bool) { -// if v, ok := CacheApi.Load(name); ok { -// return v.(*Api), true -// } - -// return nil, false -// } - -// func (a *Api) MatchMethod(method string) bool { -// i := RequestMethodValue[method] -// if a.RequestMethod == RequestMethod(i) { -// return true -// } - -// return false -// } - -// func (a *Api) IsOk(name string) bool { -// if v, ok := CacheApi.Load(name); ok { -// return v.(*Api).Status == Up -// } - -// return false -// } - -// // Offline api offline -// func (a *Api) Offline(name string) { -// if v, ok := CacheApi.Load(name); ok { -// v.(*Api).Status = Down -// } -// } - -// // Online api online -// func (a *Api) Online(name string) { -// if v, ok := CacheApi.Load(name); ok { -// v.(*Api).Status = Up -// } -// } - // HTTPVerb defines the restful api http verb type HTTPVerb string @@ -118,14 +69,15 @@ type Resource struct { // Method defines the method of the api type Method struct { - OnAir bool `yaml:"onAir"` - HTTPVerb `yaml:"httpVerb"` - InboundRequest `yaml:"inboundRequest"` + OnAir bool `yaml:"onAir"` + HTTPVerb `yaml:"httpVerb"` + InboundRequest `yaml:"inboundRequest"` + IntegrationRequest `yaml:"integrationRequest"` } // InboundRequest defines the details of the inbound type InboundRequest struct { - Type string `yaml:"type"` //http, TO-DO: dubbo + RequestType string `yaml:"requestType"` //http, TO-DO: dubbo Headers []Params `yaml:"headers"` QueryStrings []Params `yaml:"queryStrings"` RequestBody []BodyDefinition `yaml:"requestBody"` @@ -145,12 +97,13 @@ type BodyDefinition struct { // IntegrationRequest defines the backend request format and target type IntegrationRequest struct { - Type string `yaml:"type"` // dubbo, TO-DO: http - dubbo.DubboMetadata `yaml:"dubboMetaData,inline"` + RequestType string `yaml:"requestType"` // dubbo, TO-DO: http + MappingParams []MappingParam `yaml:"mappingParams,omitempty"` + dubbo.DubboMetadata `yaml:"dubboMetaData,inline,omitempty"` } -// MappingParams defines the mapping rules of headers and queryStrings -type MappingParams struct { +// MappingParam defines the mapping rules of headers and queryStrings +type MappingParam struct { Name string `yaml:"name"` MapTo string `yaml:"mapTo"` } diff --git a/pkg/config/api_config_test.go b/pkg/config/api_config_test.go index 172b69172..0644ea9a3 100644 --- a/pkg/config/api_config_test.go +++ b/pkg/config/api_config_test.go @@ -1,3 +1,20 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + */ + package config_test import ( diff --git a/pkg/config/mock/api_config.yml b/pkg/config/mock/api_config.yml index 624b90c9e..80769333e 100644 --- a/pkg/config/mock/api_config.yml +++ b/pkg/config/mock/api_config.yml @@ -11,12 +11,12 @@ resources: - httpVerb: GET onAir: true inboundRequest: - type: http + requestType: http headers: - name: auth required: true queryStrings: - - name: page + - name: id required: false - name: type required: false @@ -24,7 +24,10 @@ resources: - definitionName: modelDefinition contentType: application/json integrationRequest: - type: dubbo + requestType: dubbo + mappingParams: + - name: queryStrings.id + mapTo: 1 applicationName: BDTService group: test version: 1.0.0 From a3bb79e5dcf17c182655a7be402a10612e1851b9 Mon Sep 17 00:00:00 2001 From: zhangshen023 <1292369127@qq.com> Date: Mon, 21 Sep 2020 07:48:08 +0800 Subject: [PATCH 085/227] file api loader --- cmd/proxy/control.go | 11 --------- pkg/api_load/api.go | 50 ++++++++++++++++++++------------------ pkg/filter/dubbo_filter.go | 3 ++- pkg/model/api_config.go | 5 ++++ pkg/proxy/proxy_start.go | 17 ++++++++++--- 5 files changed, 47 insertions(+), 39 deletions(-) diff --git a/cmd/proxy/control.go b/cmd/proxy/control.go index 5817f31df..6c2548286 100644 --- a/cmd/proxy/control.go +++ b/cmd/proxy/control.go @@ -2,7 +2,6 @@ package main import ( "runtime" - "time" ) import ( @@ -10,7 +9,6 @@ import ( ) import ( - "github.com/dubbogo/dubbo-go-proxy/pkg/api_load" "github.com/dubbogo/dubbo-go-proxy/pkg/config" "github.com/dubbogo/dubbo-go-proxy/pkg/logger" "github.com/dubbogo/dubbo-go-proxy/pkg/proxy" @@ -42,11 +40,6 @@ var ( EnvVar: "LOG_FILE", Value: "configs/log.yml", }, - cli.StringFlag{ - Name: "file-api-config, fac", - Usage: "Load file api description configuration from `FILE`", - EnvVar: "FILE_API_CONFIG", - }, cli.StringFlag{ Name: "log-level, l", Usage: "dubbogo proxy log level, trace|debug|info|warning|error|critical", @@ -65,7 +58,6 @@ var ( configPath := c.String("config") flagLogLevel := c.String("log-level") logConfPath := c.String("log-config") - fileApiConfPath := c.String("file-api-config") bootstrap := config.Load(configPath) if logLevel, ok := flagToLogLevel[flagLogLevel]; ok { @@ -81,9 +73,6 @@ var ( runtime.GOMAXPROCS(limitCpus) } - apiLoader := api_load.NewApiLoad(time.Second) - apiLoader.AddApiLoad(fileApiConfPath, bootstrap.DynamicResources.ApiConfig) - proxy.Start(bootstrap) return nil }, diff --git a/pkg/api_load/api.go b/pkg/api_load/api.go index 974ac0dbe..4448c37e8 100644 --- a/pkg/api_load/api.go +++ b/pkg/api_load/api.go @@ -1,9 +1,11 @@ package api_load import ( + "errors" "fmt" "github.com/apache/dubbo-go/common/logger" "github.com/dubbogo/dubbo-go-proxy/pkg/model" + "github.com/dubbogo/dubbo-go-proxy/pkg/service" "sort" "sync" "time" @@ -24,9 +26,10 @@ type ApiLoad struct { rateLimiterTime time.Duration mergeTask chan struct{} ApiLoadTypeMap map[ApiLoadType]ApiLoader + ads service.ApiDiscoveryService } -func NewApiLoad(rateLimiterTime time.Duration) *ApiLoad { +func NewApiLoad(rateLimiterTime time.Duration, ads service.ApiDiscoveryService) *ApiLoad { if rateLimiterTime > time.Millisecond*50 { rateLimiterTime = time.Millisecond * 50 } @@ -35,12 +38,13 @@ func NewApiLoad(rateLimiterTime time.Duration) *ApiLoad { mergeTask: make(chan struct{}, 1), limiter: time.NewTimer(rateLimiterTime), rateLimiterTime: rateLimiterTime, + ads: ads, } } -func (al *ApiLoad) AddApiLoad(fileApiConfPath string, config model.ApiConfig) { - if len(fileApiConfPath) > 0 { - al.ApiLoadTypeMap[File] = NewFileApiLoader(WithFilePath(fileApiConfPath)) +func (al *ApiLoad) AddApiLoad(config model.ApiConfig) { + if config.File != nil { + al.ApiLoadTypeMap[File] = NewFileApiLoader(WithFilePath(config.File.FileApiConfPath)) } if config.Nacos != nil { al.ApiLoadTypeMap[Nacos] = NewNacosApiLoader(WithNacosAddress(config.Nacos.Address)) @@ -59,8 +63,7 @@ func (al *ApiLoad) StartLoadApi() error { //al.MergeApi() if al.limiter == nil { - logger.Warnf("proxy won't hot load api since limiter is null.") - return nil + return errors.New("proxy won't hot load api since limiter is null.") } for _, loader := range al.ApiLoadTypeMap { @@ -83,30 +86,20 @@ func (al *ApiLoad) StartLoadApi() error { return nil } -func (al *ApiLoad) ClearMergeTask() { - wait := time.After(time.Millisecond * 50) - for { - select { - case <-al.mergeTask: - logger.Debug("drop merge task") - break - case <-wait: - return - } - } -} - func (al *ApiLoad) SelectMergeApiTask() (err error) { for { select { case <-al.limiter.C: if len(al.mergeTask) > 0 { - al.DoMergeApiTask() + _, err = al.DoMergeApiTask() + if err != nil { + logger.Warnf("error merge api task:%v", err) + } } al.limiter.Reset(time.Second) break default: - time.Sleep(time.Millisecond * time.Duration(al.rateLimiterTime/10)) + time.Sleep(time.Millisecond * al.rateLimiterTime / 10) break } } @@ -124,7 +117,7 @@ func (al *ApiLoad) DoMergeApiTask() (skip bool, err error) { return case <-al.mergeTask: // If apiLoadType is File,then try cover it's apis using other's apis from registry center - var totalApis map[string]model.Api + var multiApisMerged map[string]model.Api var sortedApiLoader []int sortedApiLoaderMap := make(map[int]ApiLoadType, len(al.ApiLoadTypeMap)) for apiLoadType, loader := range al.ApiLoadTypeMap { @@ -146,15 +139,24 @@ func (al *ApiLoad) DoMergeApiTask() (skip bool, err error) { if fleApiConfig.Status != model.Up { continue } - totalApis[al.buildApiID(fleApiConfig)] = fleApiConfig + multiApisMerged[al.buildApiID(fleApiConfig)] = fleApiConfig } } } - // todo添加api + + var totalApis []model.Api + for _, api := range multiApisMerged { + totalApis = append(totalApis, api) + } + al.add2ApiDiscoveryService(totalApis) return true, nil } } +func (al *ApiLoad) add2ApiDiscoveryService(apis []model.Api) error { + al.ads.AddApi() +} + func (al *ApiLoad) buildApiID(api model.Api) string { return fmt.Sprintf("name:%s,ITypeStr:%s,OTypeStr:%s,Method:%s", api.Name, api.ITypeStr, api.OTypeStr) diff --git a/pkg/filter/dubbo_filter.go b/pkg/filter/dubbo_filter.go index 48f6d7b76..b39d12ed9 100644 --- a/pkg/filter/dubbo_filter.go +++ b/pkg/filter/dubbo_filter.go @@ -41,7 +41,8 @@ func doDubbo(c *http.HttpContext) { c.WriteFail() c.Abort() } else { - if resp, err := dubbo.SingleDubboClient().Call(client.NewRequest(bytes, api)); err != nil { + if resp, err := dubbo.SingleDubboClient(). + Call(client.NewRequest(bytes, api)); err != nil { logger.Errorf("[dubboproxy go] client do err:%v!", err) c.WriteFail() c.Abort() diff --git a/pkg/model/api_config.go b/pkg/model/api_config.go index 027e23dd8..da5996826 100644 --- a/pkg/model/api_config.go +++ b/pkg/model/api_config.go @@ -2,9 +2,14 @@ package model type ApiConfig struct { Nacos *Nacos `yaml:"nacos" json:"nacos"` + File *File `yaml:"file" json:"file"` } type Nacos struct { Address string `yaml:"address" json:"address"` Prior int `yaml:"prior" json:"prior"` } + +type File struct { + FileApiConfPath string `yaml:"file-api-conf-path" json:"fileApiConfPath"` +} diff --git a/pkg/proxy/proxy_start.go b/pkg/proxy/proxy_start.go index 2ba706348..95e2a0b26 100644 --- a/pkg/proxy/proxy_start.go +++ b/pkg/proxy/proxy_start.go @@ -2,7 +2,9 @@ package proxy import ( "encoding/json" + "github.com/dubbogo/dubbo-go-proxy/pkg/api_load" "sync" + "time" ) import ( @@ -20,6 +22,7 @@ import ( // Proxy type Proxy struct { startWG sync.WaitGroup + bs *model.Bootstrap } // Start proxy start @@ -45,12 +48,19 @@ func (p *Proxy) Start() { } } -func (p *Proxy) beforeStart() { +func (p *Proxy) beforeStart() error { dubbo.SingleDubboClient().Init() // TODO mock api register ads := extension.GetMustApiDiscoveryService(constant.LocalMemoryApiDiscoveryService) + apiLoader := api_load.NewApiLoad(time.Second, ads) + apiLoader.AddApiLoad(p.bs.DynamicResources.ApiConfig) + err := apiLoader.StartLoadApi() + if err != nil { + logger.Errorf("error load api:%v", err) + return err + } a1 := &model.Api{ Name: "/api/v1/test-dubbo/user", ITypeStr: "HTTP", @@ -99,16 +109,17 @@ func (p *Proxy) beforeStart() { } // NewProxy create proxy -func NewProxy() *Proxy { +func NewProxy(bs *model.Bootstrap) *Proxy { return &Proxy{ startWG: sync.WaitGroup{}, + bs: bs, } } func Start(bs *model.Bootstrap) { logger.Infof("[dubboproxy go] start by config : %+v", bs) - proxy := NewProxy() + proxy := NewProxy(bs) proxy.Start() proxy.startWG.Wait() From 57b450bf05f79f77879835155fb6f93ba6d06b21 Mon Sep 17 00:00:00 2001 From: zhangshen023 <1292369127@qq.com> Date: Mon, 21 Sep 2020 07:48:08 +0800 Subject: [PATCH 086/227] file api loader --- cmd/proxy/control.go | 11 --------- pkg/api_load/api.go | 50 ++++++++++++++++++++------------------ pkg/filter/dubbo_filter.go | 3 ++- pkg/model/api_config.go | 5 ++++ pkg/proxy/proxy_start.go | 17 ++++++++++--- 5 files changed, 47 insertions(+), 39 deletions(-) diff --git a/cmd/proxy/control.go b/cmd/proxy/control.go index 5817f31df..6c2548286 100644 --- a/cmd/proxy/control.go +++ b/cmd/proxy/control.go @@ -2,7 +2,6 @@ package main import ( "runtime" - "time" ) import ( @@ -10,7 +9,6 @@ import ( ) import ( - "github.com/dubbogo/dubbo-go-proxy/pkg/api_load" "github.com/dubbogo/dubbo-go-proxy/pkg/config" "github.com/dubbogo/dubbo-go-proxy/pkg/logger" "github.com/dubbogo/dubbo-go-proxy/pkg/proxy" @@ -42,11 +40,6 @@ var ( EnvVar: "LOG_FILE", Value: "configs/log.yml", }, - cli.StringFlag{ - Name: "file-api-config, fac", - Usage: "Load file api description configuration from `FILE`", - EnvVar: "FILE_API_CONFIG", - }, cli.StringFlag{ Name: "log-level, l", Usage: "dubbogo proxy log level, trace|debug|info|warning|error|critical", @@ -65,7 +58,6 @@ var ( configPath := c.String("config") flagLogLevel := c.String("log-level") logConfPath := c.String("log-config") - fileApiConfPath := c.String("file-api-config") bootstrap := config.Load(configPath) if logLevel, ok := flagToLogLevel[flagLogLevel]; ok { @@ -81,9 +73,6 @@ var ( runtime.GOMAXPROCS(limitCpus) } - apiLoader := api_load.NewApiLoad(time.Second) - apiLoader.AddApiLoad(fileApiConfPath, bootstrap.DynamicResources.ApiConfig) - proxy.Start(bootstrap) return nil }, diff --git a/pkg/api_load/api.go b/pkg/api_load/api.go index 974ac0dbe..4448c37e8 100644 --- a/pkg/api_load/api.go +++ b/pkg/api_load/api.go @@ -1,9 +1,11 @@ package api_load import ( + "errors" "fmt" "github.com/apache/dubbo-go/common/logger" "github.com/dubbogo/dubbo-go-proxy/pkg/model" + "github.com/dubbogo/dubbo-go-proxy/pkg/service" "sort" "sync" "time" @@ -24,9 +26,10 @@ type ApiLoad struct { rateLimiterTime time.Duration mergeTask chan struct{} ApiLoadTypeMap map[ApiLoadType]ApiLoader + ads service.ApiDiscoveryService } -func NewApiLoad(rateLimiterTime time.Duration) *ApiLoad { +func NewApiLoad(rateLimiterTime time.Duration, ads service.ApiDiscoveryService) *ApiLoad { if rateLimiterTime > time.Millisecond*50 { rateLimiterTime = time.Millisecond * 50 } @@ -35,12 +38,13 @@ func NewApiLoad(rateLimiterTime time.Duration) *ApiLoad { mergeTask: make(chan struct{}, 1), limiter: time.NewTimer(rateLimiterTime), rateLimiterTime: rateLimiterTime, + ads: ads, } } -func (al *ApiLoad) AddApiLoad(fileApiConfPath string, config model.ApiConfig) { - if len(fileApiConfPath) > 0 { - al.ApiLoadTypeMap[File] = NewFileApiLoader(WithFilePath(fileApiConfPath)) +func (al *ApiLoad) AddApiLoad(config model.ApiConfig) { + if config.File != nil { + al.ApiLoadTypeMap[File] = NewFileApiLoader(WithFilePath(config.File.FileApiConfPath)) } if config.Nacos != nil { al.ApiLoadTypeMap[Nacos] = NewNacosApiLoader(WithNacosAddress(config.Nacos.Address)) @@ -59,8 +63,7 @@ func (al *ApiLoad) StartLoadApi() error { //al.MergeApi() if al.limiter == nil { - logger.Warnf("proxy won't hot load api since limiter is null.") - return nil + return errors.New("proxy won't hot load api since limiter is null.") } for _, loader := range al.ApiLoadTypeMap { @@ -83,30 +86,20 @@ func (al *ApiLoad) StartLoadApi() error { return nil } -func (al *ApiLoad) ClearMergeTask() { - wait := time.After(time.Millisecond * 50) - for { - select { - case <-al.mergeTask: - logger.Debug("drop merge task") - break - case <-wait: - return - } - } -} - func (al *ApiLoad) SelectMergeApiTask() (err error) { for { select { case <-al.limiter.C: if len(al.mergeTask) > 0 { - al.DoMergeApiTask() + _, err = al.DoMergeApiTask() + if err != nil { + logger.Warnf("error merge api task:%v", err) + } } al.limiter.Reset(time.Second) break default: - time.Sleep(time.Millisecond * time.Duration(al.rateLimiterTime/10)) + time.Sleep(time.Millisecond * al.rateLimiterTime / 10) break } } @@ -124,7 +117,7 @@ func (al *ApiLoad) DoMergeApiTask() (skip bool, err error) { return case <-al.mergeTask: // If apiLoadType is File,then try cover it's apis using other's apis from registry center - var totalApis map[string]model.Api + var multiApisMerged map[string]model.Api var sortedApiLoader []int sortedApiLoaderMap := make(map[int]ApiLoadType, len(al.ApiLoadTypeMap)) for apiLoadType, loader := range al.ApiLoadTypeMap { @@ -146,15 +139,24 @@ func (al *ApiLoad) DoMergeApiTask() (skip bool, err error) { if fleApiConfig.Status != model.Up { continue } - totalApis[al.buildApiID(fleApiConfig)] = fleApiConfig + multiApisMerged[al.buildApiID(fleApiConfig)] = fleApiConfig } } } - // todo添加api + + var totalApis []model.Api + for _, api := range multiApisMerged { + totalApis = append(totalApis, api) + } + al.add2ApiDiscoveryService(totalApis) return true, nil } } +func (al *ApiLoad) add2ApiDiscoveryService(apis []model.Api) error { + al.ads.AddApi() +} + func (al *ApiLoad) buildApiID(api model.Api) string { return fmt.Sprintf("name:%s,ITypeStr:%s,OTypeStr:%s,Method:%s", api.Name, api.ITypeStr, api.OTypeStr) diff --git a/pkg/filter/dubbo_filter.go b/pkg/filter/dubbo_filter.go index 48f6d7b76..b39d12ed9 100644 --- a/pkg/filter/dubbo_filter.go +++ b/pkg/filter/dubbo_filter.go @@ -41,7 +41,8 @@ func doDubbo(c *http.HttpContext) { c.WriteFail() c.Abort() } else { - if resp, err := dubbo.SingleDubboClient().Call(client.NewRequest(bytes, api)); err != nil { + if resp, err := dubbo.SingleDubboClient(). + Call(client.NewRequest(bytes, api)); err != nil { logger.Errorf("[dubboproxy go] client do err:%v!", err) c.WriteFail() c.Abort() diff --git a/pkg/model/api_config.go b/pkg/model/api_config.go index 027e23dd8..da5996826 100644 --- a/pkg/model/api_config.go +++ b/pkg/model/api_config.go @@ -2,9 +2,14 @@ package model type ApiConfig struct { Nacos *Nacos `yaml:"nacos" json:"nacos"` + File *File `yaml:"file" json:"file"` } type Nacos struct { Address string `yaml:"address" json:"address"` Prior int `yaml:"prior" json:"prior"` } + +type File struct { + FileApiConfPath string `yaml:"file-api-conf-path" json:"fileApiConfPath"` +} diff --git a/pkg/proxy/proxy_start.go b/pkg/proxy/proxy_start.go index 2ba706348..95e2a0b26 100644 --- a/pkg/proxy/proxy_start.go +++ b/pkg/proxy/proxy_start.go @@ -2,7 +2,9 @@ package proxy import ( "encoding/json" + "github.com/dubbogo/dubbo-go-proxy/pkg/api_load" "sync" + "time" ) import ( @@ -20,6 +22,7 @@ import ( // Proxy type Proxy struct { startWG sync.WaitGroup + bs *model.Bootstrap } // Start proxy start @@ -45,12 +48,19 @@ func (p *Proxy) Start() { } } -func (p *Proxy) beforeStart() { +func (p *Proxy) beforeStart() error { dubbo.SingleDubboClient().Init() // TODO mock api register ads := extension.GetMustApiDiscoveryService(constant.LocalMemoryApiDiscoveryService) + apiLoader := api_load.NewApiLoad(time.Second, ads) + apiLoader.AddApiLoad(p.bs.DynamicResources.ApiConfig) + err := apiLoader.StartLoadApi() + if err != nil { + logger.Errorf("error load api:%v", err) + return err + } a1 := &model.Api{ Name: "/api/v1/test-dubbo/user", ITypeStr: "HTTP", @@ -99,16 +109,17 @@ func (p *Proxy) beforeStart() { } // NewProxy create proxy -func NewProxy() *Proxy { +func NewProxy(bs *model.Bootstrap) *Proxy { return &Proxy{ startWG: sync.WaitGroup{}, + bs: bs, } } func Start(bs *model.Bootstrap) { logger.Infof("[dubboproxy go] start by config : %+v", bs) - proxy := NewProxy() + proxy := NewProxy(bs) proxy.Start() proxy.startWG.Wait() From edb3097b0154f3b467358fce20627389688d56d8 Mon Sep 17 00:00:00 2001 From: zhangshen023 <1292369127@qq.com> Date: Mon, 21 Sep 2020 07:48:08 +0800 Subject: [PATCH 087/227] file api loader --- cmd/proxy/control.go | 11 --------- pkg/api_load/api.go | 50 ++++++++++++++++++++------------------ pkg/filter/dubbo_filter.go | 3 ++- pkg/model/api_config.go | 5 ++++ pkg/proxy/proxy_start.go | 17 ++++++++++--- 5 files changed, 47 insertions(+), 39 deletions(-) diff --git a/cmd/proxy/control.go b/cmd/proxy/control.go index 5817f31df..6c2548286 100644 --- a/cmd/proxy/control.go +++ b/cmd/proxy/control.go @@ -2,7 +2,6 @@ package main import ( "runtime" - "time" ) import ( @@ -10,7 +9,6 @@ import ( ) import ( - "github.com/dubbogo/dubbo-go-proxy/pkg/api_load" "github.com/dubbogo/dubbo-go-proxy/pkg/config" "github.com/dubbogo/dubbo-go-proxy/pkg/logger" "github.com/dubbogo/dubbo-go-proxy/pkg/proxy" @@ -42,11 +40,6 @@ var ( EnvVar: "LOG_FILE", Value: "configs/log.yml", }, - cli.StringFlag{ - Name: "file-api-config, fac", - Usage: "Load file api description configuration from `FILE`", - EnvVar: "FILE_API_CONFIG", - }, cli.StringFlag{ Name: "log-level, l", Usage: "dubbogo proxy log level, trace|debug|info|warning|error|critical", @@ -65,7 +58,6 @@ var ( configPath := c.String("config") flagLogLevel := c.String("log-level") logConfPath := c.String("log-config") - fileApiConfPath := c.String("file-api-config") bootstrap := config.Load(configPath) if logLevel, ok := flagToLogLevel[flagLogLevel]; ok { @@ -81,9 +73,6 @@ var ( runtime.GOMAXPROCS(limitCpus) } - apiLoader := api_load.NewApiLoad(time.Second) - apiLoader.AddApiLoad(fileApiConfPath, bootstrap.DynamicResources.ApiConfig) - proxy.Start(bootstrap) return nil }, diff --git a/pkg/api_load/api.go b/pkg/api_load/api.go index 974ac0dbe..4448c37e8 100644 --- a/pkg/api_load/api.go +++ b/pkg/api_load/api.go @@ -1,9 +1,11 @@ package api_load import ( + "errors" "fmt" "github.com/apache/dubbo-go/common/logger" "github.com/dubbogo/dubbo-go-proxy/pkg/model" + "github.com/dubbogo/dubbo-go-proxy/pkg/service" "sort" "sync" "time" @@ -24,9 +26,10 @@ type ApiLoad struct { rateLimiterTime time.Duration mergeTask chan struct{} ApiLoadTypeMap map[ApiLoadType]ApiLoader + ads service.ApiDiscoveryService } -func NewApiLoad(rateLimiterTime time.Duration) *ApiLoad { +func NewApiLoad(rateLimiterTime time.Duration, ads service.ApiDiscoveryService) *ApiLoad { if rateLimiterTime > time.Millisecond*50 { rateLimiterTime = time.Millisecond * 50 } @@ -35,12 +38,13 @@ func NewApiLoad(rateLimiterTime time.Duration) *ApiLoad { mergeTask: make(chan struct{}, 1), limiter: time.NewTimer(rateLimiterTime), rateLimiterTime: rateLimiterTime, + ads: ads, } } -func (al *ApiLoad) AddApiLoad(fileApiConfPath string, config model.ApiConfig) { - if len(fileApiConfPath) > 0 { - al.ApiLoadTypeMap[File] = NewFileApiLoader(WithFilePath(fileApiConfPath)) +func (al *ApiLoad) AddApiLoad(config model.ApiConfig) { + if config.File != nil { + al.ApiLoadTypeMap[File] = NewFileApiLoader(WithFilePath(config.File.FileApiConfPath)) } if config.Nacos != nil { al.ApiLoadTypeMap[Nacos] = NewNacosApiLoader(WithNacosAddress(config.Nacos.Address)) @@ -59,8 +63,7 @@ func (al *ApiLoad) StartLoadApi() error { //al.MergeApi() if al.limiter == nil { - logger.Warnf("proxy won't hot load api since limiter is null.") - return nil + return errors.New("proxy won't hot load api since limiter is null.") } for _, loader := range al.ApiLoadTypeMap { @@ -83,30 +86,20 @@ func (al *ApiLoad) StartLoadApi() error { return nil } -func (al *ApiLoad) ClearMergeTask() { - wait := time.After(time.Millisecond * 50) - for { - select { - case <-al.mergeTask: - logger.Debug("drop merge task") - break - case <-wait: - return - } - } -} - func (al *ApiLoad) SelectMergeApiTask() (err error) { for { select { case <-al.limiter.C: if len(al.mergeTask) > 0 { - al.DoMergeApiTask() + _, err = al.DoMergeApiTask() + if err != nil { + logger.Warnf("error merge api task:%v", err) + } } al.limiter.Reset(time.Second) break default: - time.Sleep(time.Millisecond * time.Duration(al.rateLimiterTime/10)) + time.Sleep(time.Millisecond * al.rateLimiterTime / 10) break } } @@ -124,7 +117,7 @@ func (al *ApiLoad) DoMergeApiTask() (skip bool, err error) { return case <-al.mergeTask: // If apiLoadType is File,then try cover it's apis using other's apis from registry center - var totalApis map[string]model.Api + var multiApisMerged map[string]model.Api var sortedApiLoader []int sortedApiLoaderMap := make(map[int]ApiLoadType, len(al.ApiLoadTypeMap)) for apiLoadType, loader := range al.ApiLoadTypeMap { @@ -146,15 +139,24 @@ func (al *ApiLoad) DoMergeApiTask() (skip bool, err error) { if fleApiConfig.Status != model.Up { continue } - totalApis[al.buildApiID(fleApiConfig)] = fleApiConfig + multiApisMerged[al.buildApiID(fleApiConfig)] = fleApiConfig } } } - // todo添加api + + var totalApis []model.Api + for _, api := range multiApisMerged { + totalApis = append(totalApis, api) + } + al.add2ApiDiscoveryService(totalApis) return true, nil } } +func (al *ApiLoad) add2ApiDiscoveryService(apis []model.Api) error { + al.ads.AddApi() +} + func (al *ApiLoad) buildApiID(api model.Api) string { return fmt.Sprintf("name:%s,ITypeStr:%s,OTypeStr:%s,Method:%s", api.Name, api.ITypeStr, api.OTypeStr) diff --git a/pkg/filter/dubbo_filter.go b/pkg/filter/dubbo_filter.go index 48f6d7b76..b39d12ed9 100644 --- a/pkg/filter/dubbo_filter.go +++ b/pkg/filter/dubbo_filter.go @@ -41,7 +41,8 @@ func doDubbo(c *http.HttpContext) { c.WriteFail() c.Abort() } else { - if resp, err := dubbo.SingleDubboClient().Call(client.NewRequest(bytes, api)); err != nil { + if resp, err := dubbo.SingleDubboClient(). + Call(client.NewRequest(bytes, api)); err != nil { logger.Errorf("[dubboproxy go] client do err:%v!", err) c.WriteFail() c.Abort() diff --git a/pkg/model/api_config.go b/pkg/model/api_config.go index 027e23dd8..da5996826 100644 --- a/pkg/model/api_config.go +++ b/pkg/model/api_config.go @@ -2,9 +2,14 @@ package model type ApiConfig struct { Nacos *Nacos `yaml:"nacos" json:"nacos"` + File *File `yaml:"file" json:"file"` } type Nacos struct { Address string `yaml:"address" json:"address"` Prior int `yaml:"prior" json:"prior"` } + +type File struct { + FileApiConfPath string `yaml:"file-api-conf-path" json:"fileApiConfPath"` +} diff --git a/pkg/proxy/proxy_start.go b/pkg/proxy/proxy_start.go index 2ba706348..95e2a0b26 100644 --- a/pkg/proxy/proxy_start.go +++ b/pkg/proxy/proxy_start.go @@ -2,7 +2,9 @@ package proxy import ( "encoding/json" + "github.com/dubbogo/dubbo-go-proxy/pkg/api_load" "sync" + "time" ) import ( @@ -20,6 +22,7 @@ import ( // Proxy type Proxy struct { startWG sync.WaitGroup + bs *model.Bootstrap } // Start proxy start @@ -45,12 +48,19 @@ func (p *Proxy) Start() { } } -func (p *Proxy) beforeStart() { +func (p *Proxy) beforeStart() error { dubbo.SingleDubboClient().Init() // TODO mock api register ads := extension.GetMustApiDiscoveryService(constant.LocalMemoryApiDiscoveryService) + apiLoader := api_load.NewApiLoad(time.Second, ads) + apiLoader.AddApiLoad(p.bs.DynamicResources.ApiConfig) + err := apiLoader.StartLoadApi() + if err != nil { + logger.Errorf("error load api:%v", err) + return err + } a1 := &model.Api{ Name: "/api/v1/test-dubbo/user", ITypeStr: "HTTP", @@ -99,16 +109,17 @@ func (p *Proxy) beforeStart() { } // NewProxy create proxy -func NewProxy() *Proxy { +func NewProxy(bs *model.Bootstrap) *Proxy { return &Proxy{ startWG: sync.WaitGroup{}, + bs: bs, } } func Start(bs *model.Bootstrap) { logger.Infof("[dubboproxy go] start by config : %+v", bs) - proxy := NewProxy() + proxy := NewProxy(bs) proxy.Start() proxy.startWG.Wait() From 0673a596db106a7528db8e0ad5f4ad97e46f50d7 Mon Sep 17 00:00:00 2001 From: zhangshen023 <1292369127@qq.com> Date: Mon, 21 Sep 2020 07:48:08 +0800 Subject: [PATCH 088/227] file api loader --- cmd/proxy/control.go | 11 --------- pkg/api_load/api.go | 50 ++++++++++++++++++++------------------ pkg/filter/dubbo_filter.go | 3 ++- pkg/model/api_config.go | 5 ++++ pkg/proxy/proxy_start.go | 17 ++++++++++--- 5 files changed, 47 insertions(+), 39 deletions(-) diff --git a/cmd/proxy/control.go b/cmd/proxy/control.go index 5817f31df..6c2548286 100644 --- a/cmd/proxy/control.go +++ b/cmd/proxy/control.go @@ -2,7 +2,6 @@ package main import ( "runtime" - "time" ) import ( @@ -10,7 +9,6 @@ import ( ) import ( - "github.com/dubbogo/dubbo-go-proxy/pkg/api_load" "github.com/dubbogo/dubbo-go-proxy/pkg/config" "github.com/dubbogo/dubbo-go-proxy/pkg/logger" "github.com/dubbogo/dubbo-go-proxy/pkg/proxy" @@ -42,11 +40,6 @@ var ( EnvVar: "LOG_FILE", Value: "configs/log.yml", }, - cli.StringFlag{ - Name: "file-api-config, fac", - Usage: "Load file api description configuration from `FILE`", - EnvVar: "FILE_API_CONFIG", - }, cli.StringFlag{ Name: "log-level, l", Usage: "dubbogo proxy log level, trace|debug|info|warning|error|critical", @@ -65,7 +58,6 @@ var ( configPath := c.String("config") flagLogLevel := c.String("log-level") logConfPath := c.String("log-config") - fileApiConfPath := c.String("file-api-config") bootstrap := config.Load(configPath) if logLevel, ok := flagToLogLevel[flagLogLevel]; ok { @@ -81,9 +73,6 @@ var ( runtime.GOMAXPROCS(limitCpus) } - apiLoader := api_load.NewApiLoad(time.Second) - apiLoader.AddApiLoad(fileApiConfPath, bootstrap.DynamicResources.ApiConfig) - proxy.Start(bootstrap) return nil }, diff --git a/pkg/api_load/api.go b/pkg/api_load/api.go index 974ac0dbe..4448c37e8 100644 --- a/pkg/api_load/api.go +++ b/pkg/api_load/api.go @@ -1,9 +1,11 @@ package api_load import ( + "errors" "fmt" "github.com/apache/dubbo-go/common/logger" "github.com/dubbogo/dubbo-go-proxy/pkg/model" + "github.com/dubbogo/dubbo-go-proxy/pkg/service" "sort" "sync" "time" @@ -24,9 +26,10 @@ type ApiLoad struct { rateLimiterTime time.Duration mergeTask chan struct{} ApiLoadTypeMap map[ApiLoadType]ApiLoader + ads service.ApiDiscoveryService } -func NewApiLoad(rateLimiterTime time.Duration) *ApiLoad { +func NewApiLoad(rateLimiterTime time.Duration, ads service.ApiDiscoveryService) *ApiLoad { if rateLimiterTime > time.Millisecond*50 { rateLimiterTime = time.Millisecond * 50 } @@ -35,12 +38,13 @@ func NewApiLoad(rateLimiterTime time.Duration) *ApiLoad { mergeTask: make(chan struct{}, 1), limiter: time.NewTimer(rateLimiterTime), rateLimiterTime: rateLimiterTime, + ads: ads, } } -func (al *ApiLoad) AddApiLoad(fileApiConfPath string, config model.ApiConfig) { - if len(fileApiConfPath) > 0 { - al.ApiLoadTypeMap[File] = NewFileApiLoader(WithFilePath(fileApiConfPath)) +func (al *ApiLoad) AddApiLoad(config model.ApiConfig) { + if config.File != nil { + al.ApiLoadTypeMap[File] = NewFileApiLoader(WithFilePath(config.File.FileApiConfPath)) } if config.Nacos != nil { al.ApiLoadTypeMap[Nacos] = NewNacosApiLoader(WithNacosAddress(config.Nacos.Address)) @@ -59,8 +63,7 @@ func (al *ApiLoad) StartLoadApi() error { //al.MergeApi() if al.limiter == nil { - logger.Warnf("proxy won't hot load api since limiter is null.") - return nil + return errors.New("proxy won't hot load api since limiter is null.") } for _, loader := range al.ApiLoadTypeMap { @@ -83,30 +86,20 @@ func (al *ApiLoad) StartLoadApi() error { return nil } -func (al *ApiLoad) ClearMergeTask() { - wait := time.After(time.Millisecond * 50) - for { - select { - case <-al.mergeTask: - logger.Debug("drop merge task") - break - case <-wait: - return - } - } -} - func (al *ApiLoad) SelectMergeApiTask() (err error) { for { select { case <-al.limiter.C: if len(al.mergeTask) > 0 { - al.DoMergeApiTask() + _, err = al.DoMergeApiTask() + if err != nil { + logger.Warnf("error merge api task:%v", err) + } } al.limiter.Reset(time.Second) break default: - time.Sleep(time.Millisecond * time.Duration(al.rateLimiterTime/10)) + time.Sleep(time.Millisecond * al.rateLimiterTime / 10) break } } @@ -124,7 +117,7 @@ func (al *ApiLoad) DoMergeApiTask() (skip bool, err error) { return case <-al.mergeTask: // If apiLoadType is File,then try cover it's apis using other's apis from registry center - var totalApis map[string]model.Api + var multiApisMerged map[string]model.Api var sortedApiLoader []int sortedApiLoaderMap := make(map[int]ApiLoadType, len(al.ApiLoadTypeMap)) for apiLoadType, loader := range al.ApiLoadTypeMap { @@ -146,15 +139,24 @@ func (al *ApiLoad) DoMergeApiTask() (skip bool, err error) { if fleApiConfig.Status != model.Up { continue } - totalApis[al.buildApiID(fleApiConfig)] = fleApiConfig + multiApisMerged[al.buildApiID(fleApiConfig)] = fleApiConfig } } } - // todo添加api + + var totalApis []model.Api + for _, api := range multiApisMerged { + totalApis = append(totalApis, api) + } + al.add2ApiDiscoveryService(totalApis) return true, nil } } +func (al *ApiLoad) add2ApiDiscoveryService(apis []model.Api) error { + al.ads.AddApi() +} + func (al *ApiLoad) buildApiID(api model.Api) string { return fmt.Sprintf("name:%s,ITypeStr:%s,OTypeStr:%s,Method:%s", api.Name, api.ITypeStr, api.OTypeStr) diff --git a/pkg/filter/dubbo_filter.go b/pkg/filter/dubbo_filter.go index 48f6d7b76..b39d12ed9 100644 --- a/pkg/filter/dubbo_filter.go +++ b/pkg/filter/dubbo_filter.go @@ -41,7 +41,8 @@ func doDubbo(c *http.HttpContext) { c.WriteFail() c.Abort() } else { - if resp, err := dubbo.SingleDubboClient().Call(client.NewRequest(bytes, api)); err != nil { + if resp, err := dubbo.SingleDubboClient(). + Call(client.NewRequest(bytes, api)); err != nil { logger.Errorf("[dubboproxy go] client do err:%v!", err) c.WriteFail() c.Abort() diff --git a/pkg/model/api_config.go b/pkg/model/api_config.go index 027e23dd8..da5996826 100644 --- a/pkg/model/api_config.go +++ b/pkg/model/api_config.go @@ -2,9 +2,14 @@ package model type ApiConfig struct { Nacos *Nacos `yaml:"nacos" json:"nacos"` + File *File `yaml:"file" json:"file"` } type Nacos struct { Address string `yaml:"address" json:"address"` Prior int `yaml:"prior" json:"prior"` } + +type File struct { + FileApiConfPath string `yaml:"file-api-conf-path" json:"fileApiConfPath"` +} diff --git a/pkg/proxy/proxy_start.go b/pkg/proxy/proxy_start.go index 2ba706348..95e2a0b26 100644 --- a/pkg/proxy/proxy_start.go +++ b/pkg/proxy/proxy_start.go @@ -2,7 +2,9 @@ package proxy import ( "encoding/json" + "github.com/dubbogo/dubbo-go-proxy/pkg/api_load" "sync" + "time" ) import ( @@ -20,6 +22,7 @@ import ( // Proxy type Proxy struct { startWG sync.WaitGroup + bs *model.Bootstrap } // Start proxy start @@ -45,12 +48,19 @@ func (p *Proxy) Start() { } } -func (p *Proxy) beforeStart() { +func (p *Proxy) beforeStart() error { dubbo.SingleDubboClient().Init() // TODO mock api register ads := extension.GetMustApiDiscoveryService(constant.LocalMemoryApiDiscoveryService) + apiLoader := api_load.NewApiLoad(time.Second, ads) + apiLoader.AddApiLoad(p.bs.DynamicResources.ApiConfig) + err := apiLoader.StartLoadApi() + if err != nil { + logger.Errorf("error load api:%v", err) + return err + } a1 := &model.Api{ Name: "/api/v1/test-dubbo/user", ITypeStr: "HTTP", @@ -99,16 +109,17 @@ func (p *Proxy) beforeStart() { } // NewProxy create proxy -func NewProxy() *Proxy { +func NewProxy(bs *model.Bootstrap) *Proxy { return &Proxy{ startWG: sync.WaitGroup{}, + bs: bs, } } func Start(bs *model.Bootstrap) { logger.Infof("[dubboproxy go] start by config : %+v", bs) - proxy := NewProxy() + proxy := NewProxy(bs) proxy.Start() proxy.startWG.Wait() From e2156e726742186827cd997aad6f102075585350 Mon Sep 17 00:00:00 2001 From: "yangqing.xyq" Date: Mon, 21 Sep 2020 11:18:06 +0800 Subject: [PATCH 089/227] remove .idea --- .idea/.gitignore | 2 -- .idea/dubbo-go-proxy.iml | 9 --------- .idea/misc.xml | 6 ------ .idea/modules.xml | 8 -------- .idea/vcs.xml | 6 ------ 5 files changed, 31 deletions(-) delete mode 100644 .idea/.gitignore delete mode 100644 .idea/dubbo-go-proxy.iml delete mode 100644 .idea/misc.xml delete mode 100644 .idea/modules.xml delete mode 100644 .idea/vcs.xml diff --git a/.idea/.gitignore b/.idea/.gitignore deleted file mode 100644 index e7e9d11d4..000000000 --- a/.idea/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -# Default ignored files -/workspace.xml diff --git a/.idea/dubbo-go-proxy.iml b/.idea/dubbo-go-proxy.iml deleted file mode 100644 index 5e764c4f0..000000000 --- a/.idea/dubbo-go-proxy.iml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - - \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml deleted file mode 100644 index 28a804d89..000000000 --- a/.idea/misc.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - \ No newline at end of file diff --git a/.idea/modules.xml b/.idea/modules.xml deleted file mode 100644 index 288f721bd..000000000 --- a/.idea/modules.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml deleted file mode 100644 index 94a25f7f4..000000000 --- a/.idea/vcs.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - \ No newline at end of file From 68feb7ee40648d28b009cede7574b022f2701f4c Mon Sep 17 00:00:00 2001 From: "yangqing.xyq" Date: Mon, 21 Sep 2020 11:18:06 +0800 Subject: [PATCH 090/227] remove .idea --- .idea/.gitignore | 2 -- .idea/dubbo-go-proxy.iml | 9 --------- .idea/misc.xml | 6 ------ .idea/modules.xml | 8 -------- .idea/vcs.xml | 6 ------ 5 files changed, 31 deletions(-) delete mode 100644 .idea/.gitignore delete mode 100644 .idea/dubbo-go-proxy.iml delete mode 100644 .idea/misc.xml delete mode 100644 .idea/modules.xml delete mode 100644 .idea/vcs.xml diff --git a/.idea/.gitignore b/.idea/.gitignore deleted file mode 100644 index e7e9d11d4..000000000 --- a/.idea/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -# Default ignored files -/workspace.xml diff --git a/.idea/dubbo-go-proxy.iml b/.idea/dubbo-go-proxy.iml deleted file mode 100644 index 5e764c4f0..000000000 --- a/.idea/dubbo-go-proxy.iml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - - \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml deleted file mode 100644 index 28a804d89..000000000 --- a/.idea/misc.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - \ No newline at end of file diff --git a/.idea/modules.xml b/.idea/modules.xml deleted file mode 100644 index 288f721bd..000000000 --- a/.idea/modules.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml deleted file mode 100644 index 94a25f7f4..000000000 --- a/.idea/vcs.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - \ No newline at end of file From fae06e4614facf3d191dc06eaacf3a3c5251d4b7 Mon Sep 17 00:00:00 2001 From: "yangqing.xyq" Date: Mon, 21 Sep 2020 11:18:06 +0800 Subject: [PATCH 091/227] remove .idea --- .idea/.gitignore | 2 -- .idea/dubbo-go-proxy.iml | 9 --------- .idea/misc.xml | 6 ------ .idea/modules.xml | 8 -------- .idea/vcs.xml | 6 ------ 5 files changed, 31 deletions(-) delete mode 100644 .idea/.gitignore delete mode 100644 .idea/dubbo-go-proxy.iml delete mode 100644 .idea/misc.xml delete mode 100644 .idea/modules.xml delete mode 100644 .idea/vcs.xml diff --git a/.idea/.gitignore b/.idea/.gitignore deleted file mode 100644 index e7e9d11d4..000000000 --- a/.idea/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -# Default ignored files -/workspace.xml diff --git a/.idea/dubbo-go-proxy.iml b/.idea/dubbo-go-proxy.iml deleted file mode 100644 index 5e764c4f0..000000000 --- a/.idea/dubbo-go-proxy.iml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - - \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml deleted file mode 100644 index 28a804d89..000000000 --- a/.idea/misc.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - \ No newline at end of file diff --git a/.idea/modules.xml b/.idea/modules.xml deleted file mode 100644 index 288f721bd..000000000 --- a/.idea/modules.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml deleted file mode 100644 index 94a25f7f4..000000000 --- a/.idea/vcs.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - \ No newline at end of file From 49693b0a0bef6d3a6d4afb56e35e96206ba89199 Mon Sep 17 00:00:00 2001 From: william feng <> Date: Mon, 21 Sep 2020 14:12:38 +0800 Subject: [PATCH 092/227] update the import to meet coding standards --- pkg/config/api_config.go | 6 +++--- pkg/config/api_config_test.go | 5 ++++- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/pkg/config/api_config.go b/pkg/config/api_config.go index 6544e225e..bfc02f301 100644 --- a/pkg/config/api_config.go +++ b/pkg/config/api_config.go @@ -18,13 +18,13 @@ package config import ( - "log" + perrors "github.com/pkg/errors" ) import ( "github.com/dubbogo/dubbo-go-proxy/pkg/client/dubbo" "github.com/dubbogo/dubbo-go-proxy/pkg/common/yaml" - perrors "github.com/pkg/errors" + "github.com/dubbogo/dubbo-go-proxy/pkg/logger" ) // HTTPVerb defines the restful api http verb @@ -119,7 +119,7 @@ func LoadAPIConfigFromFile(path string) (*APIConfig, error) { if len(path) == 0 { return nil, perrors.Errorf("Config file not specified") } - log.Printf("Load API configuration file form %s", path) + logger.Info("Load API configuration file form %s", path) apiConf := &APIConfig{} _, err := yaml.UnmarshalYMLConfig(path, apiConf) if err != nil { diff --git a/pkg/config/api_config_test.go b/pkg/config/api_config_test.go index 0644ea9a3..c5d18df82 100644 --- a/pkg/config/api_config_test.go +++ b/pkg/config/api_config_test.go @@ -23,11 +23,14 @@ import ( ) import ( - "github.com/dubbogo/dubbo-go-proxy/pkg/config" "github.com/ghodss/yaml" "github.com/stretchr/testify/assert" ) +import ( + "github.com/dubbogo/dubbo-go-proxy/pkg/config" +) + func TestLoadAPIConfigFromFile(t *testing.T) { apiC, err := config.LoadAPIConfigFromFile("") assert.Empty(t, apiC) From 67d4975768ee8b82e5ad7dfcfb912c925642d5a4 Mon Sep 17 00:00:00 2001 From: william feng <> Date: Mon, 21 Sep 2020 14:12:38 +0800 Subject: [PATCH 093/227] update the import to meet coding standards --- pkg/config/api_config.go | 6 +++--- pkg/config/api_config_test.go | 5 ++++- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/pkg/config/api_config.go b/pkg/config/api_config.go index 6544e225e..bfc02f301 100644 --- a/pkg/config/api_config.go +++ b/pkg/config/api_config.go @@ -18,13 +18,13 @@ package config import ( - "log" + perrors "github.com/pkg/errors" ) import ( "github.com/dubbogo/dubbo-go-proxy/pkg/client/dubbo" "github.com/dubbogo/dubbo-go-proxy/pkg/common/yaml" - perrors "github.com/pkg/errors" + "github.com/dubbogo/dubbo-go-proxy/pkg/logger" ) // HTTPVerb defines the restful api http verb @@ -119,7 +119,7 @@ func LoadAPIConfigFromFile(path string) (*APIConfig, error) { if len(path) == 0 { return nil, perrors.Errorf("Config file not specified") } - log.Printf("Load API configuration file form %s", path) + logger.Info("Load API configuration file form %s", path) apiConf := &APIConfig{} _, err := yaml.UnmarshalYMLConfig(path, apiConf) if err != nil { diff --git a/pkg/config/api_config_test.go b/pkg/config/api_config_test.go index 0644ea9a3..c5d18df82 100644 --- a/pkg/config/api_config_test.go +++ b/pkg/config/api_config_test.go @@ -23,11 +23,14 @@ import ( ) import ( - "github.com/dubbogo/dubbo-go-proxy/pkg/config" "github.com/ghodss/yaml" "github.com/stretchr/testify/assert" ) +import ( + "github.com/dubbogo/dubbo-go-proxy/pkg/config" +) + func TestLoadAPIConfigFromFile(t *testing.T) { apiC, err := config.LoadAPIConfigFromFile("") assert.Empty(t, apiC) From 773328e53e666d6c57d39beed950c49d41da72ce Mon Sep 17 00:00:00 2001 From: william feng <> Date: Mon, 21 Sep 2020 14:12:38 +0800 Subject: [PATCH 094/227] update the import to meet coding standards --- pkg/config/api_config.go | 6 +++--- pkg/config/api_config_test.go | 5 ++++- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/pkg/config/api_config.go b/pkg/config/api_config.go index 6544e225e..bfc02f301 100644 --- a/pkg/config/api_config.go +++ b/pkg/config/api_config.go @@ -18,13 +18,13 @@ package config import ( - "log" + perrors "github.com/pkg/errors" ) import ( "github.com/dubbogo/dubbo-go-proxy/pkg/client/dubbo" "github.com/dubbogo/dubbo-go-proxy/pkg/common/yaml" - perrors "github.com/pkg/errors" + "github.com/dubbogo/dubbo-go-proxy/pkg/logger" ) // HTTPVerb defines the restful api http verb @@ -119,7 +119,7 @@ func LoadAPIConfigFromFile(path string) (*APIConfig, error) { if len(path) == 0 { return nil, perrors.Errorf("Config file not specified") } - log.Printf("Load API configuration file form %s", path) + logger.Info("Load API configuration file form %s", path) apiConf := &APIConfig{} _, err := yaml.UnmarshalYMLConfig(path, apiConf) if err != nil { diff --git a/pkg/config/api_config_test.go b/pkg/config/api_config_test.go index 0644ea9a3..c5d18df82 100644 --- a/pkg/config/api_config_test.go +++ b/pkg/config/api_config_test.go @@ -23,11 +23,14 @@ import ( ) import ( - "github.com/dubbogo/dubbo-go-proxy/pkg/config" "github.com/ghodss/yaml" "github.com/stretchr/testify/assert" ) +import ( + "github.com/dubbogo/dubbo-go-proxy/pkg/config" +) + func TestLoadAPIConfigFromFile(t *testing.T) { apiC, err := config.LoadAPIConfigFromFile("") assert.Empty(t, apiC) From e69b7c735ec9ade8afa5eb8d99c1204c5c0e2dfa Mon Sep 17 00:00:00 2001 From: william feng <> Date: Tue, 22 Sep 2020 15:49:12 +0800 Subject: [PATCH 095/227] remove the unnecessary return from unmarshalymlconfig function --- pkg/common/yaml/yaml.go | 6 +++--- pkg/common/yaml/yaml_test.go | 6 +++--- pkg/config/api_config.go | 2 +- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/pkg/common/yaml/yaml.go b/pkg/common/yaml/yaml.go index de67bfca5..47c65123f 100644 --- a/pkg/common/yaml/yaml.go +++ b/pkg/common/yaml/yaml.go @@ -41,12 +41,12 @@ func LoadYMLConfig(confProFile string) ([]byte, error) { } // UnmarshalYMLConfig Load yml config byte from file, then unmarshal to object -func UnmarshalYMLConfig(confProFile string, out interface{}) ([]byte, error) { +func UnmarshalYMLConfig(confProFile string, out interface{}) error { confFileStream, err := LoadYMLConfig(confProFile) if err != nil { - return confFileStream, perrors.Errorf("ioutil.ReadFile(file:%s) = error:%v", confProFile, perrors.WithStack(err)) + return perrors.Errorf("ioutil.ReadFile(file:%s) = error:%v", confProFile, perrors.WithStack(err)) } - return confFileStream, yaml.Unmarshal(confFileStream, out) + return yaml.Unmarshal(confFileStream, out) } //UnmarshalYML unmarshals decodes the first document found within the in byte slice and assigns decoded values into the out value. diff --git a/pkg/common/yaml/yaml_test.go b/pkg/common/yaml/yaml_test.go index 5a271a258..0380a4f3e 100644 --- a/pkg/common/yaml/yaml_test.go +++ b/pkg/common/yaml/yaml_test.go @@ -30,7 +30,7 @@ func TestUnmarshalYMLConfig(t *testing.T) { conPath, err := filepath.Abs("./testdata/config.yml") assert.NoError(t, err) c := &Config{} - _, err = UnmarshalYMLConfig(conPath, c) + err = UnmarshalYMLConfig(conPath, c) assert.NoError(t, err) assert.Equal(t, "strTest", c.StrTest) assert.Equal(t, 11, c.IntTest) @@ -40,9 +40,9 @@ func TestUnmarshalYMLConfig(t *testing.T) { func TestUnmarshalYMLConfigError(t *testing.T) { c := &Config{} - _, err := UnmarshalYMLConfig("./testdata/config", c) + err := UnmarshalYMLConfig("./testdata/config", c) assert.Error(t, err) - _, err = UnmarshalYMLConfig("", c) + err = UnmarshalYMLConfig("", c) assert.Error(t, err) } diff --git a/pkg/config/api_config.go b/pkg/config/api_config.go index bfc02f301..97638a769 100644 --- a/pkg/config/api_config.go +++ b/pkg/config/api_config.go @@ -121,7 +121,7 @@ func LoadAPIConfigFromFile(path string) (*APIConfig, error) { } logger.Info("Load API configuration file form %s", path) apiConf := &APIConfig{} - _, err := yaml.UnmarshalYMLConfig(path, apiConf) + err := yaml.UnmarshalYMLConfig(path, apiConf) if err != nil { return nil, perrors.Errorf("unmarshalYmlConfig error %v", perrors.WithStack(err)) } From 61f2334b53f311061e09af6f4fd87b96c68948fd Mon Sep 17 00:00:00 2001 From: william feng <> Date: Tue, 22 Sep 2020 15:49:12 +0800 Subject: [PATCH 096/227] remove the unnecessary return from unmarshalymlconfig function --- pkg/common/yaml/yaml.go | 6 +++--- pkg/common/yaml/yaml_test.go | 6 +++--- pkg/config/api_config.go | 2 +- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/pkg/common/yaml/yaml.go b/pkg/common/yaml/yaml.go index de67bfca5..47c65123f 100644 --- a/pkg/common/yaml/yaml.go +++ b/pkg/common/yaml/yaml.go @@ -41,12 +41,12 @@ func LoadYMLConfig(confProFile string) ([]byte, error) { } // UnmarshalYMLConfig Load yml config byte from file, then unmarshal to object -func UnmarshalYMLConfig(confProFile string, out interface{}) ([]byte, error) { +func UnmarshalYMLConfig(confProFile string, out interface{}) error { confFileStream, err := LoadYMLConfig(confProFile) if err != nil { - return confFileStream, perrors.Errorf("ioutil.ReadFile(file:%s) = error:%v", confProFile, perrors.WithStack(err)) + return perrors.Errorf("ioutil.ReadFile(file:%s) = error:%v", confProFile, perrors.WithStack(err)) } - return confFileStream, yaml.Unmarshal(confFileStream, out) + return yaml.Unmarshal(confFileStream, out) } //UnmarshalYML unmarshals decodes the first document found within the in byte slice and assigns decoded values into the out value. diff --git a/pkg/common/yaml/yaml_test.go b/pkg/common/yaml/yaml_test.go index 5a271a258..0380a4f3e 100644 --- a/pkg/common/yaml/yaml_test.go +++ b/pkg/common/yaml/yaml_test.go @@ -30,7 +30,7 @@ func TestUnmarshalYMLConfig(t *testing.T) { conPath, err := filepath.Abs("./testdata/config.yml") assert.NoError(t, err) c := &Config{} - _, err = UnmarshalYMLConfig(conPath, c) + err = UnmarshalYMLConfig(conPath, c) assert.NoError(t, err) assert.Equal(t, "strTest", c.StrTest) assert.Equal(t, 11, c.IntTest) @@ -40,9 +40,9 @@ func TestUnmarshalYMLConfig(t *testing.T) { func TestUnmarshalYMLConfigError(t *testing.T) { c := &Config{} - _, err := UnmarshalYMLConfig("./testdata/config", c) + err := UnmarshalYMLConfig("./testdata/config", c) assert.Error(t, err) - _, err = UnmarshalYMLConfig("", c) + err = UnmarshalYMLConfig("", c) assert.Error(t, err) } diff --git a/pkg/config/api_config.go b/pkg/config/api_config.go index bfc02f301..97638a769 100644 --- a/pkg/config/api_config.go +++ b/pkg/config/api_config.go @@ -121,7 +121,7 @@ func LoadAPIConfigFromFile(path string) (*APIConfig, error) { } logger.Info("Load API configuration file form %s", path) apiConf := &APIConfig{} - _, err := yaml.UnmarshalYMLConfig(path, apiConf) + err := yaml.UnmarshalYMLConfig(path, apiConf) if err != nil { return nil, perrors.Errorf("unmarshalYmlConfig error %v", perrors.WithStack(err)) } From 513c4b3a30c3eeb8123c537b4c6bbbffce98ada1 Mon Sep 17 00:00:00 2001 From: william feng <> Date: Tue, 22 Sep 2020 15:49:12 +0800 Subject: [PATCH 097/227] remove the unnecessary return from unmarshalymlconfig function --- pkg/common/yaml/yaml.go | 6 +++--- pkg/common/yaml/yaml_test.go | 6 +++--- pkg/config/api_config.go | 2 +- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/pkg/common/yaml/yaml.go b/pkg/common/yaml/yaml.go index de67bfca5..47c65123f 100644 --- a/pkg/common/yaml/yaml.go +++ b/pkg/common/yaml/yaml.go @@ -41,12 +41,12 @@ func LoadYMLConfig(confProFile string) ([]byte, error) { } // UnmarshalYMLConfig Load yml config byte from file, then unmarshal to object -func UnmarshalYMLConfig(confProFile string, out interface{}) ([]byte, error) { +func UnmarshalYMLConfig(confProFile string, out interface{}) error { confFileStream, err := LoadYMLConfig(confProFile) if err != nil { - return confFileStream, perrors.Errorf("ioutil.ReadFile(file:%s) = error:%v", confProFile, perrors.WithStack(err)) + return perrors.Errorf("ioutil.ReadFile(file:%s) = error:%v", confProFile, perrors.WithStack(err)) } - return confFileStream, yaml.Unmarshal(confFileStream, out) + return yaml.Unmarshal(confFileStream, out) } //UnmarshalYML unmarshals decodes the first document found within the in byte slice and assigns decoded values into the out value. diff --git a/pkg/common/yaml/yaml_test.go b/pkg/common/yaml/yaml_test.go index 5a271a258..0380a4f3e 100644 --- a/pkg/common/yaml/yaml_test.go +++ b/pkg/common/yaml/yaml_test.go @@ -30,7 +30,7 @@ func TestUnmarshalYMLConfig(t *testing.T) { conPath, err := filepath.Abs("./testdata/config.yml") assert.NoError(t, err) c := &Config{} - _, err = UnmarshalYMLConfig(conPath, c) + err = UnmarshalYMLConfig(conPath, c) assert.NoError(t, err) assert.Equal(t, "strTest", c.StrTest) assert.Equal(t, 11, c.IntTest) @@ -40,9 +40,9 @@ func TestUnmarshalYMLConfig(t *testing.T) { func TestUnmarshalYMLConfigError(t *testing.T) { c := &Config{} - _, err := UnmarshalYMLConfig("./testdata/config", c) + err := UnmarshalYMLConfig("./testdata/config", c) assert.Error(t, err) - _, err = UnmarshalYMLConfig("", c) + err = UnmarshalYMLConfig("", c) assert.Error(t, err) } diff --git a/pkg/config/api_config.go b/pkg/config/api_config.go index bfc02f301..97638a769 100644 --- a/pkg/config/api_config.go +++ b/pkg/config/api_config.go @@ -121,7 +121,7 @@ func LoadAPIConfigFromFile(path string) (*APIConfig, error) { } logger.Info("Load API configuration file form %s", path) apiConf := &APIConfig{} - _, err := yaml.UnmarshalYMLConfig(path, apiConf) + err := yaml.UnmarshalYMLConfig(path, apiConf) if err != nil { return nil, perrors.Errorf("unmarshalYmlConfig error %v", perrors.WithStack(err)) } From e10513a92192f9eccac74ae7513fd7b51058d92c Mon Sep 17 00:00:00 2001 From: william feng <> Date: Tue, 22 Sep 2020 22:14:24 +0800 Subject: [PATCH 098/227] remove content-type from definition --- configs/api_config.yaml | 1 - pkg/config/api_config.go | 1 - pkg/config/mock/api_config.yml | 1 - 3 files changed, 3 deletions(-) diff --git a/configs/api_config.yaml b/configs/api_config.yaml index 35ab2d5bf..b41c38089 100644 --- a/configs/api_config.yaml +++ b/configs/api_config.yaml @@ -22,7 +22,6 @@ resources: required: false requestBody: - definitionName: modelDefinition - contentType: application/json integrationRequest: type: dubbo mappingParams: diff --git a/pkg/config/api_config.go b/pkg/config/api_config.go index 97638a769..b869b2a8c 100644 --- a/pkg/config/api_config.go +++ b/pkg/config/api_config.go @@ -92,7 +92,6 @@ type Params struct { // BodyDefinition connects the request body to the definitions type BodyDefinition struct { DefinitionName string `yaml:"definitionName"` - ContentType string `yaml:"contentType"` } // IntegrationRequest defines the backend request format and target diff --git a/pkg/config/mock/api_config.yml b/pkg/config/mock/api_config.yml index 80769333e..9e0f104b0 100644 --- a/pkg/config/mock/api_config.yml +++ b/pkg/config/mock/api_config.yml @@ -22,7 +22,6 @@ resources: required: false requestBody: - definitionName: modelDefinition - contentType: application/json integrationRequest: requestType: dubbo mappingParams: From e75bd701ba2d908fbd06fda76707061b7ad9b50f Mon Sep 17 00:00:00 2001 From: william feng <> Date: Tue, 22 Sep 2020 22:14:24 +0800 Subject: [PATCH 099/227] remove content-type from definition --- configs/api_config.yaml | 1 - pkg/config/api_config.go | 1 - pkg/config/mock/api_config.yml | 1 - 3 files changed, 3 deletions(-) diff --git a/configs/api_config.yaml b/configs/api_config.yaml index 35ab2d5bf..b41c38089 100644 --- a/configs/api_config.yaml +++ b/configs/api_config.yaml @@ -22,7 +22,6 @@ resources: required: false requestBody: - definitionName: modelDefinition - contentType: application/json integrationRequest: type: dubbo mappingParams: diff --git a/pkg/config/api_config.go b/pkg/config/api_config.go index 97638a769..b869b2a8c 100644 --- a/pkg/config/api_config.go +++ b/pkg/config/api_config.go @@ -92,7 +92,6 @@ type Params struct { // BodyDefinition connects the request body to the definitions type BodyDefinition struct { DefinitionName string `yaml:"definitionName"` - ContentType string `yaml:"contentType"` } // IntegrationRequest defines the backend request format and target diff --git a/pkg/config/mock/api_config.yml b/pkg/config/mock/api_config.yml index 80769333e..9e0f104b0 100644 --- a/pkg/config/mock/api_config.yml +++ b/pkg/config/mock/api_config.yml @@ -22,7 +22,6 @@ resources: required: false requestBody: - definitionName: modelDefinition - contentType: application/json integrationRequest: requestType: dubbo mappingParams: From 75a371f7c1cd013aab9714a25ae1aa8438f69337 Mon Sep 17 00:00:00 2001 From: william feng <> Date: Tue, 22 Sep 2020 22:14:24 +0800 Subject: [PATCH 100/227] remove content-type from definition --- configs/api_config.yaml | 1 - pkg/config/api_config.go | 1 - pkg/config/mock/api_config.yml | 1 - 3 files changed, 3 deletions(-) diff --git a/configs/api_config.yaml b/configs/api_config.yaml index 35ab2d5bf..b41c38089 100644 --- a/configs/api_config.yaml +++ b/configs/api_config.yaml @@ -22,7 +22,6 @@ resources: required: false requestBody: - definitionName: modelDefinition - contentType: application/json integrationRequest: type: dubbo mappingParams: diff --git a/pkg/config/api_config.go b/pkg/config/api_config.go index 97638a769..b869b2a8c 100644 --- a/pkg/config/api_config.go +++ b/pkg/config/api_config.go @@ -92,7 +92,6 @@ type Params struct { // BodyDefinition connects the request body to the definitions type BodyDefinition struct { DefinitionName string `yaml:"definitionName"` - ContentType string `yaml:"contentType"` } // IntegrationRequest defines the backend request format and target diff --git a/pkg/config/mock/api_config.yml b/pkg/config/mock/api_config.yml index 80769333e..9e0f104b0 100644 --- a/pkg/config/mock/api_config.yml +++ b/pkg/config/mock/api_config.yml @@ -22,7 +22,6 @@ resources: required: false requestBody: - definitionName: modelDefinition - contentType: application/json integrationRequest: requestType: dubbo mappingParams: From be38ebceb575e45207b5a39b47808bbb21682b6b Mon Sep 17 00:00:00 2001 From: shen Date: Tue, 22 Sep 2020 22:24:31 +0800 Subject: [PATCH 101/227] add api --- pkg/api_load/api.go | 44 ++++++++++++++++++++++++---- pkg/proxy/proxy_start.go | 4 +++ pkg/service/api/discovery_service.go | 13 ++++++++ pkg/service/discovery_service.go | 2 ++ 4 files changed, 58 insertions(+), 5 deletions(-) diff --git a/pkg/api_load/api.go b/pkg/api_load/api.go index 4448c37e8..86c517bd4 100644 --- a/pkg/api_load/api.go +++ b/pkg/api_load/api.go @@ -1,6 +1,7 @@ package api_load import ( + "encoding/json" "errors" "fmt" "github.com/apache/dubbo-go/common/logger" @@ -76,8 +77,12 @@ func (al *ApiLoad) StartLoadApi() error { go func() { for { select { - case <-changeNotifier: - al.SelectMergeApiTask() + case _, ok := <-changeNotifier: + if !ok { + logger.Debug("changeNotifier of apiloader was closed!") + return + } + al.AddMergeTask() break } } @@ -86,6 +91,18 @@ func (al *ApiLoad) StartLoadApi() error { return nil } +func (al *ApiLoad) AddMergeTask() error { + select { + case al.mergeTask <- struct{}{}: + logger.Debug("added a merge task, waiting to merge api.") + break + case <-time.After(5 * time.Second): + logger.Errorf("add merge task fail:wait timeout.") + break + } + return nil +} + func (al *ApiLoad) SelectMergeApiTask() (err error) { for { select { @@ -148,13 +165,30 @@ func (al *ApiLoad) DoMergeApiTask() (skip bool, err error) { for _, api := range multiApisMerged { totalApis = append(totalApis, api) } - al.add2ApiDiscoveryService(totalApis) - return true, nil + err = al.ads.RemoveAllApi() + if err != nil { + logger.Errorf("remove all older apis error:%v", err) + return + } + err = al.add2ApiDiscoveryService(totalApis) + if err != nil { + logger.Errorf("add newer apis error:%v", err) + return + } + return } } func (al *ApiLoad) add2ApiDiscoveryService(apis []model.Api) error { - al.ads.AddApi() + for _, api := range apis { + j, _ := json.Marshal(api) + _, err := al.ads.AddApi(*service.NewDiscoveryRequest(j)) + if err != nil { + logger.Errorf("error add api:%s", j) + return err + } + } + return nil } func (al *ApiLoad) buildApiID(api model.Api) string { diff --git a/pkg/proxy/proxy_start.go b/pkg/proxy/proxy_start.go index 95e2a0b26..d43e7c5c3 100644 --- a/pkg/proxy/proxy_start.go +++ b/pkg/proxy/proxy_start.go @@ -61,6 +61,10 @@ func (p *Proxy) beforeStart() error { logger.Errorf("error load api:%v", err) return err } + err = apiLoader.SelectMergeApiTask() + if err != nil { + logger.Errorf("error select merge api task :%v", err) + } a1 := &model.Api{ Name: "/api/v1/test-dubbo/user", ITypeStr: "HTTP", diff --git a/pkg/service/api/discovery_service.go b/pkg/service/api/discovery_service.go index 3c9bbbbab..4e6971720 100644 --- a/pkg/service/api/discovery_service.go +++ b/pkg/service/api/discovery_service.go @@ -29,6 +29,19 @@ func NewLocalMemoryApiDiscoveryService() *LocalMemoryApiDiscoveryService { return &LocalMemoryApiDiscoveryService{} } +func (ads *LocalMemoryApiDiscoveryService) RemoveAllApi() error { + model.CacheApi.Range(func(name, _ interface{}) bool { + model.CacheApi.Delete(name) + return true + }) + return nil +} + +func (ads *LocalMemoryApiDiscoveryService) RemoveApi(name string) error { + model.CacheApi.Delete(name) + return nil +} + func (ads *LocalMemoryApiDiscoveryService) AddApi(request service.DiscoveryRequest) (service.DiscoveryResponse, error) { aj := model.NewApi() if err := json.Unmarshal(request.Body, aj); err != nil { diff --git a/pkg/service/discovery_service.go b/pkg/service/discovery_service.go index 30e799a07..6581e5c12 100644 --- a/pkg/service/discovery_service.go +++ b/pkg/service/discovery_service.go @@ -39,6 +39,8 @@ var EmptyDiscoveryResponse = &DiscoveryResponse{} type ApiDiscoveryService interface { AddApi(request DiscoveryRequest) (DiscoveryResponse, error) GetApi(request DiscoveryRequest) (DiscoveryResponse, error) + RemoveApi(name string) error + RemoveAllApi() error } // DiscoveryService is come from envoy, it can used for admin From fb1c2408f327cb527dece86bcd4ffcaa90ce0f4a Mon Sep 17 00:00:00 2001 From: shen Date: Tue, 22 Sep 2020 22:24:31 +0800 Subject: [PATCH 102/227] add api --- pkg/api_load/api.go | 44 ++++++++++++++++++++++++---- pkg/proxy/proxy_start.go | 4 +++ pkg/service/api/discovery_service.go | 13 ++++++++ pkg/service/discovery_service.go | 2 ++ 4 files changed, 58 insertions(+), 5 deletions(-) diff --git a/pkg/api_load/api.go b/pkg/api_load/api.go index 4448c37e8..86c517bd4 100644 --- a/pkg/api_load/api.go +++ b/pkg/api_load/api.go @@ -1,6 +1,7 @@ package api_load import ( + "encoding/json" "errors" "fmt" "github.com/apache/dubbo-go/common/logger" @@ -76,8 +77,12 @@ func (al *ApiLoad) StartLoadApi() error { go func() { for { select { - case <-changeNotifier: - al.SelectMergeApiTask() + case _, ok := <-changeNotifier: + if !ok { + logger.Debug("changeNotifier of apiloader was closed!") + return + } + al.AddMergeTask() break } } @@ -86,6 +91,18 @@ func (al *ApiLoad) StartLoadApi() error { return nil } +func (al *ApiLoad) AddMergeTask() error { + select { + case al.mergeTask <- struct{}{}: + logger.Debug("added a merge task, waiting to merge api.") + break + case <-time.After(5 * time.Second): + logger.Errorf("add merge task fail:wait timeout.") + break + } + return nil +} + func (al *ApiLoad) SelectMergeApiTask() (err error) { for { select { @@ -148,13 +165,30 @@ func (al *ApiLoad) DoMergeApiTask() (skip bool, err error) { for _, api := range multiApisMerged { totalApis = append(totalApis, api) } - al.add2ApiDiscoveryService(totalApis) - return true, nil + err = al.ads.RemoveAllApi() + if err != nil { + logger.Errorf("remove all older apis error:%v", err) + return + } + err = al.add2ApiDiscoveryService(totalApis) + if err != nil { + logger.Errorf("add newer apis error:%v", err) + return + } + return } } func (al *ApiLoad) add2ApiDiscoveryService(apis []model.Api) error { - al.ads.AddApi() + for _, api := range apis { + j, _ := json.Marshal(api) + _, err := al.ads.AddApi(*service.NewDiscoveryRequest(j)) + if err != nil { + logger.Errorf("error add api:%s", j) + return err + } + } + return nil } func (al *ApiLoad) buildApiID(api model.Api) string { diff --git a/pkg/proxy/proxy_start.go b/pkg/proxy/proxy_start.go index 95e2a0b26..d43e7c5c3 100644 --- a/pkg/proxy/proxy_start.go +++ b/pkg/proxy/proxy_start.go @@ -61,6 +61,10 @@ func (p *Proxy) beforeStart() error { logger.Errorf("error load api:%v", err) return err } + err = apiLoader.SelectMergeApiTask() + if err != nil { + logger.Errorf("error select merge api task :%v", err) + } a1 := &model.Api{ Name: "/api/v1/test-dubbo/user", ITypeStr: "HTTP", diff --git a/pkg/service/api/discovery_service.go b/pkg/service/api/discovery_service.go index 3c9bbbbab..4e6971720 100644 --- a/pkg/service/api/discovery_service.go +++ b/pkg/service/api/discovery_service.go @@ -29,6 +29,19 @@ func NewLocalMemoryApiDiscoveryService() *LocalMemoryApiDiscoveryService { return &LocalMemoryApiDiscoveryService{} } +func (ads *LocalMemoryApiDiscoveryService) RemoveAllApi() error { + model.CacheApi.Range(func(name, _ interface{}) bool { + model.CacheApi.Delete(name) + return true + }) + return nil +} + +func (ads *LocalMemoryApiDiscoveryService) RemoveApi(name string) error { + model.CacheApi.Delete(name) + return nil +} + func (ads *LocalMemoryApiDiscoveryService) AddApi(request service.DiscoveryRequest) (service.DiscoveryResponse, error) { aj := model.NewApi() if err := json.Unmarshal(request.Body, aj); err != nil { diff --git a/pkg/service/discovery_service.go b/pkg/service/discovery_service.go index 30e799a07..6581e5c12 100644 --- a/pkg/service/discovery_service.go +++ b/pkg/service/discovery_service.go @@ -39,6 +39,8 @@ var EmptyDiscoveryResponse = &DiscoveryResponse{} type ApiDiscoveryService interface { AddApi(request DiscoveryRequest) (DiscoveryResponse, error) GetApi(request DiscoveryRequest) (DiscoveryResponse, error) + RemoveApi(name string) error + RemoveAllApi() error } // DiscoveryService is come from envoy, it can used for admin From 4ae6f03e13d22c6bfab149c86b599bfdc105c0ea Mon Sep 17 00:00:00 2001 From: shen Date: Tue, 22 Sep 2020 22:24:31 +0800 Subject: [PATCH 103/227] add api --- pkg/api_load/api.go | 44 ++++++++++++++++++++++++---- pkg/proxy/proxy_start.go | 4 +++ pkg/service/api/discovery_service.go | 13 ++++++++ pkg/service/discovery_service.go | 2 ++ 4 files changed, 58 insertions(+), 5 deletions(-) diff --git a/pkg/api_load/api.go b/pkg/api_load/api.go index 4448c37e8..86c517bd4 100644 --- a/pkg/api_load/api.go +++ b/pkg/api_load/api.go @@ -1,6 +1,7 @@ package api_load import ( + "encoding/json" "errors" "fmt" "github.com/apache/dubbo-go/common/logger" @@ -76,8 +77,12 @@ func (al *ApiLoad) StartLoadApi() error { go func() { for { select { - case <-changeNotifier: - al.SelectMergeApiTask() + case _, ok := <-changeNotifier: + if !ok { + logger.Debug("changeNotifier of apiloader was closed!") + return + } + al.AddMergeTask() break } } @@ -86,6 +91,18 @@ func (al *ApiLoad) StartLoadApi() error { return nil } +func (al *ApiLoad) AddMergeTask() error { + select { + case al.mergeTask <- struct{}{}: + logger.Debug("added a merge task, waiting to merge api.") + break + case <-time.After(5 * time.Second): + logger.Errorf("add merge task fail:wait timeout.") + break + } + return nil +} + func (al *ApiLoad) SelectMergeApiTask() (err error) { for { select { @@ -148,13 +165,30 @@ func (al *ApiLoad) DoMergeApiTask() (skip bool, err error) { for _, api := range multiApisMerged { totalApis = append(totalApis, api) } - al.add2ApiDiscoveryService(totalApis) - return true, nil + err = al.ads.RemoveAllApi() + if err != nil { + logger.Errorf("remove all older apis error:%v", err) + return + } + err = al.add2ApiDiscoveryService(totalApis) + if err != nil { + logger.Errorf("add newer apis error:%v", err) + return + } + return } } func (al *ApiLoad) add2ApiDiscoveryService(apis []model.Api) error { - al.ads.AddApi() + for _, api := range apis { + j, _ := json.Marshal(api) + _, err := al.ads.AddApi(*service.NewDiscoveryRequest(j)) + if err != nil { + logger.Errorf("error add api:%s", j) + return err + } + } + return nil } func (al *ApiLoad) buildApiID(api model.Api) string { diff --git a/pkg/proxy/proxy_start.go b/pkg/proxy/proxy_start.go index 95e2a0b26..d43e7c5c3 100644 --- a/pkg/proxy/proxy_start.go +++ b/pkg/proxy/proxy_start.go @@ -61,6 +61,10 @@ func (p *Proxy) beforeStart() error { logger.Errorf("error load api:%v", err) return err } + err = apiLoader.SelectMergeApiTask() + if err != nil { + logger.Errorf("error select merge api task :%v", err) + } a1 := &model.Api{ Name: "/api/v1/test-dubbo/user", ITypeStr: "HTTP", diff --git a/pkg/service/api/discovery_service.go b/pkg/service/api/discovery_service.go index 3c9bbbbab..4e6971720 100644 --- a/pkg/service/api/discovery_service.go +++ b/pkg/service/api/discovery_service.go @@ -29,6 +29,19 @@ func NewLocalMemoryApiDiscoveryService() *LocalMemoryApiDiscoveryService { return &LocalMemoryApiDiscoveryService{} } +func (ads *LocalMemoryApiDiscoveryService) RemoveAllApi() error { + model.CacheApi.Range(func(name, _ interface{}) bool { + model.CacheApi.Delete(name) + return true + }) + return nil +} + +func (ads *LocalMemoryApiDiscoveryService) RemoveApi(name string) error { + model.CacheApi.Delete(name) + return nil +} + func (ads *LocalMemoryApiDiscoveryService) AddApi(request service.DiscoveryRequest) (service.DiscoveryResponse, error) { aj := model.NewApi() if err := json.Unmarshal(request.Body, aj); err != nil { diff --git a/pkg/service/discovery_service.go b/pkg/service/discovery_service.go index 30e799a07..6581e5c12 100644 --- a/pkg/service/discovery_service.go +++ b/pkg/service/discovery_service.go @@ -39,6 +39,8 @@ var EmptyDiscoveryResponse = &DiscoveryResponse{} type ApiDiscoveryService interface { AddApi(request DiscoveryRequest) (DiscoveryResponse, error) GetApi(request DiscoveryRequest) (DiscoveryResponse, error) + RemoveApi(name string) error + RemoveAllApi() error } // DiscoveryService is come from envoy, it can used for admin From 33dc20e1e47334661b17dadd1de032b500787788 Mon Sep 17 00:00:00 2001 From: shen Date: Tue, 22 Sep 2020 22:24:31 +0800 Subject: [PATCH 104/227] add api --- pkg/api_load/api.go | 44 ++++++++++++++++++++++++---- pkg/proxy/proxy_start.go | 4 +++ pkg/service/api/discovery_service.go | 13 ++++++++ pkg/service/discovery_service.go | 2 ++ 4 files changed, 58 insertions(+), 5 deletions(-) diff --git a/pkg/api_load/api.go b/pkg/api_load/api.go index 4448c37e8..86c517bd4 100644 --- a/pkg/api_load/api.go +++ b/pkg/api_load/api.go @@ -1,6 +1,7 @@ package api_load import ( + "encoding/json" "errors" "fmt" "github.com/apache/dubbo-go/common/logger" @@ -76,8 +77,12 @@ func (al *ApiLoad) StartLoadApi() error { go func() { for { select { - case <-changeNotifier: - al.SelectMergeApiTask() + case _, ok := <-changeNotifier: + if !ok { + logger.Debug("changeNotifier of apiloader was closed!") + return + } + al.AddMergeTask() break } } @@ -86,6 +91,18 @@ func (al *ApiLoad) StartLoadApi() error { return nil } +func (al *ApiLoad) AddMergeTask() error { + select { + case al.mergeTask <- struct{}{}: + logger.Debug("added a merge task, waiting to merge api.") + break + case <-time.After(5 * time.Second): + logger.Errorf("add merge task fail:wait timeout.") + break + } + return nil +} + func (al *ApiLoad) SelectMergeApiTask() (err error) { for { select { @@ -148,13 +165,30 @@ func (al *ApiLoad) DoMergeApiTask() (skip bool, err error) { for _, api := range multiApisMerged { totalApis = append(totalApis, api) } - al.add2ApiDiscoveryService(totalApis) - return true, nil + err = al.ads.RemoveAllApi() + if err != nil { + logger.Errorf("remove all older apis error:%v", err) + return + } + err = al.add2ApiDiscoveryService(totalApis) + if err != nil { + logger.Errorf("add newer apis error:%v", err) + return + } + return } } func (al *ApiLoad) add2ApiDiscoveryService(apis []model.Api) error { - al.ads.AddApi() + for _, api := range apis { + j, _ := json.Marshal(api) + _, err := al.ads.AddApi(*service.NewDiscoveryRequest(j)) + if err != nil { + logger.Errorf("error add api:%s", j) + return err + } + } + return nil } func (al *ApiLoad) buildApiID(api model.Api) string { diff --git a/pkg/proxy/proxy_start.go b/pkg/proxy/proxy_start.go index 95e2a0b26..d43e7c5c3 100644 --- a/pkg/proxy/proxy_start.go +++ b/pkg/proxy/proxy_start.go @@ -61,6 +61,10 @@ func (p *Proxy) beforeStart() error { logger.Errorf("error load api:%v", err) return err } + err = apiLoader.SelectMergeApiTask() + if err != nil { + logger.Errorf("error select merge api task :%v", err) + } a1 := &model.Api{ Name: "/api/v1/test-dubbo/user", ITypeStr: "HTTP", diff --git a/pkg/service/api/discovery_service.go b/pkg/service/api/discovery_service.go index 3c9bbbbab..4e6971720 100644 --- a/pkg/service/api/discovery_service.go +++ b/pkg/service/api/discovery_service.go @@ -29,6 +29,19 @@ func NewLocalMemoryApiDiscoveryService() *LocalMemoryApiDiscoveryService { return &LocalMemoryApiDiscoveryService{} } +func (ads *LocalMemoryApiDiscoveryService) RemoveAllApi() error { + model.CacheApi.Range(func(name, _ interface{}) bool { + model.CacheApi.Delete(name) + return true + }) + return nil +} + +func (ads *LocalMemoryApiDiscoveryService) RemoveApi(name string) error { + model.CacheApi.Delete(name) + return nil +} + func (ads *LocalMemoryApiDiscoveryService) AddApi(request service.DiscoveryRequest) (service.DiscoveryResponse, error) { aj := model.NewApi() if err := json.Unmarshal(request.Body, aj); err != nil { diff --git a/pkg/service/discovery_service.go b/pkg/service/discovery_service.go index 30e799a07..6581e5c12 100644 --- a/pkg/service/discovery_service.go +++ b/pkg/service/discovery_service.go @@ -39,6 +39,8 @@ var EmptyDiscoveryResponse = &DiscoveryResponse{} type ApiDiscoveryService interface { AddApi(request DiscoveryRequest) (DiscoveryResponse, error) GetApi(request DiscoveryRequest) (DiscoveryResponse, error) + RemoveApi(name string) error + RemoveAllApi() error } // DiscoveryService is come from envoy, it can used for admin From d72b2812e288bc903031acaca7c1fd2bc25617ff Mon Sep 17 00:00:00 2001 From: shen Date: Wed, 23 Sep 2020 17:38:36 +0800 Subject: [PATCH 105/227] unit test for fileApiLoader --- pkg/api_load/api_load.go | 14 --- pkg/api_load/api_loader.go | 16 +++ pkg/api_load/{api.go => api_manager.go} | 13 +- .../{file_api_load.go => file_api_loader.go} | 10 +- pkg/api_load/file_api_loader_test.go | 111 ++++++++++++++++++ pkg/api_load/mock/api_config.yaml | 15 +++ ...{nacos_api_load.go => nacos_api_loader.go} | 0 pkg/model/api.go | 18 +-- 8 files changed, 161 insertions(+), 36 deletions(-) delete mode 100644 pkg/api_load/api_load.go create mode 100644 pkg/api_load/api_loader.go rename pkg/api_load/{api.go => api_manager.go} (96%) rename pkg/api_load/{file_api_load.go => file_api_loader.go} (95%) create mode 100644 pkg/api_load/file_api_loader_test.go create mode 100644 pkg/api_load/mock/api_config.yaml rename pkg/api_load/{nacos_api_load.go => nacos_api_loader.go} (100%) diff --git a/pkg/api_load/api_load.go b/pkg/api_load/api_load.go deleted file mode 100644 index b3856e22f..000000000 --- a/pkg/api_load/api_load.go +++ /dev/null @@ -1,14 +0,0 @@ -package api_load - -import "github.com/dubbogo/dubbo-go-proxy/pkg/model" - -type ApiLoader interface { - GetPrior() int - GetLoadedApiConfigs() ([]model.Api, error) - // 第一次初始化加载 - InitLoad() error - // 后面动态更新加载 - HotLoad() (chan struct{}, error) - // 清除所有加载的api - Clear() error -} diff --git a/pkg/api_load/api_loader.go b/pkg/api_load/api_loader.go new file mode 100644 index 000000000..4d4929de1 --- /dev/null +++ b/pkg/api_load/api_loader.go @@ -0,0 +1,16 @@ +package api_load + +import "github.com/dubbogo/dubbo-go-proxy/pkg/model" + +type ApiLoader interface { + // every apiloader has a Priority, since remote api configurer such as nacos may cover fileapiloader. + // and the larger priority number indicates it's apis can cover apis of lower priority number priority. + GetPrior() int + GetLoadedApiConfigs() ([]model.Api, error) + // load all apis at first time + InitLoad() error + // watch apis when apis configured were changed. + HotLoad() (chan struct{}, error) + // clear all apis + Clear() error +} diff --git a/pkg/api_load/api.go b/pkg/api_load/api_manager.go similarity index 96% rename from pkg/api_load/api.go rename to pkg/api_load/api_manager.go index 86c517bd4..1381b5e1a 100644 --- a/pkg/api_load/api.go +++ b/pkg/api_load/api_manager.go @@ -4,15 +4,16 @@ import ( "encoding/json" "errors" "fmt" - "github.com/apache/dubbo-go/common/logger" - "github.com/dubbogo/dubbo-go-proxy/pkg/model" - "github.com/dubbogo/dubbo-go-proxy/pkg/service" "sort" "sync" "time" ) -//var ApiLoadTypeMap = make(map[ApiLoadType]ApiLoader, 8) +import ( + "github.com/apache/dubbo-go/common/logger" + "github.com/dubbogo/dubbo-go-proxy/pkg/model" + "github.com/dubbogo/dubbo-go-proxy/pkg/service" +) type ApiLoadType string @@ -31,7 +32,7 @@ type ApiLoad struct { } func NewApiLoad(rateLimiterTime time.Duration, ads service.ApiDiscoveryService) *ApiLoad { - if rateLimiterTime > time.Millisecond*50 { + if rateLimiterTime < time.Millisecond*50 { rateLimiterTime = time.Millisecond * 50 } return &ApiLoad{ @@ -193,5 +194,5 @@ func (al *ApiLoad) add2ApiDiscoveryService(apis []model.Api) error { func (al *ApiLoad) buildApiID(api model.Api) string { return fmt.Sprintf("name:%s,ITypeStr:%s,OTypeStr:%s,Method:%s", - api.Name, api.ITypeStr, api.OTypeStr) + api.Name, api.ITypeStr, api.OTypeStr, api.Method) } diff --git a/pkg/api_load/file_api_load.go b/pkg/api_load/file_api_loader.go similarity index 95% rename from pkg/api_load/file_api_load.go rename to pkg/api_load/file_api_loader.go index 6efa91e8d..1fb70eaa6 100644 --- a/pkg/api_load/file_api_load.go +++ b/pkg/api_load/file_api_loader.go @@ -20,8 +20,7 @@ func init() { } type FileApiLoader struct { - filePath string - //locker sync.Mutex + filePath string ApiConfigs []model.Api } @@ -50,8 +49,6 @@ func (f *FileApiLoader) GetLoadedApiConfigs() ([]model.Api, error) { } func (f *FileApiLoader) InitLoad() (err error) { - //f.locker.Lock() - //defer f.locker.Unlock() content, err := ioutil.ReadFile(f.filePath) if err != nil { logger.Errorf("fileApiLoader read api config error:%v", err) @@ -71,7 +68,6 @@ func (f *FileApiLoader) InitLoad() (err error) { if len(f.ApiConfigs) < 1 { logger.Warnf("no api loaded!please make sure api config file is located") } - //f.ApiConfigs = apiConfigs return } @@ -84,9 +80,8 @@ func (f *FileApiLoader) HotLoad() (chan struct{}, error) { return nil, err } - defer watcher.Close() - go func() { + defer watcher.Close() for { select { case event, ok := <-watcher.Events: @@ -99,6 +94,7 @@ func (f *FileApiLoader) HotLoad() (chan struct{}, error) { logger.Debug("modified file:", event.Name) content, err := ioutil.ReadFile(f.filePath) jsonBytes, err := yaml.YAMLToJSON(content) + logger.Debugf("modified content:%s", content) if err != nil { logger.Warnf("fileApiLoader transfer api config error:%v,is it yaml format?", err) break diff --git a/pkg/api_load/file_api_loader_test.go b/pkg/api_load/file_api_loader_test.go new file mode 100644 index 000000000..a9132e621 --- /dev/null +++ b/pkg/api_load/file_api_loader_test.go @@ -0,0 +1,111 @@ +package api_load + +import ( + "github.com/dubbogo/dubbo-go-proxy/pkg/client/dubbo" + "github.com/dubbogo/dubbo-go-proxy/pkg/model" + "io" + "io/ioutil" + "os" + "testing" + "time" +) + +import ( + "github.com/ghodss/yaml" + "github.com/stretchr/testify/assert" +) + +const filePath = "./mock/api_config.yaml" + +func newFileLoader() ApiLoader { + return &FileApiLoader{ + filePath: filePath, + } +} + +func TestFileApiLoader_InitLoad(t *testing.T) { + fileApiLoader := newFileLoader() + err := fileApiLoader.InitLoad() + assert.Nil(t, err) + apis, err := fileApiLoader.GetLoadedApiConfigs() + assert.Nil(t, err) + assert.NotNil(t, apis) + bytes, err := yaml.Marshal(apis) + assert.Nil(t, err) + content, err := ioutil.ReadFile(filePath) + assert.Nil(t, err) + assert.YAMLEq(t, string(bytes), string(content)) +} + +func TestFileApiLoader_GetPrior(t *testing.T) { + fileApiLoader := newFileLoader() + prior := fileApiLoader.GetPrior() + assert.Equal(t, 0, prior) +} + +func TestFileApiLoader_HotLoad(t *testing.T) { + fileApiLoader := newFileLoader() + fileChangeNotifier, err := fileApiLoader.HotLoad() + assert.Nil(t, err) + assert.NotNil(t, fileChangeNotifier) + appendApiName := "test_append_api" + appendApi := model.Api{ + Name: appendApiName, + ITypeStr: "HTTP", + OTypeStr: "REST", + Method: "GET", + Status: 1, + Metadata: map[string]dubbo.DubboMetadata{ + "dubbo": { + ApplicationName: "BDTService", + Group: "test1", + Version: "2.0.0", + Interface: "com.ikurento.user.UserProvider", + Method: "GetUser", + Types: []string{ + "java.lang.String", + }, + ClusterName: "test_dubbo", + }, + }, + } + + bytes, err := yaml.Marshal([]model.Api{appendApi}) + assert.Nil(t, err) + originContent, _ := ioutil.ReadFile(filePath) + t.Log(string(bytes)) + err = appendContent(filePath, bytes) + ok := assert.Nil(t, err) + if ok { + defer ioutil.WriteFile(filePath, originContent, os.ModePerm) + } + select { + case <-fileChangeNotifier: + apis, err := fileApiLoader.GetLoadedApiConfigs() + assert.Nil(t, err) + assert.Len(t, apis, 2) + for _, api := range apis { + if api.Name == appendApiName { + assert.True(t, true) + return + } + } + assert.True(t, false) + break + case <-time.After(time.Second * 10000): + assert.Fail(t, "did't get change notice!") + } +} + +func appendContent(filename string, content []byte) error { + fl, err := os.OpenFile(filename, os.O_APPEND|os.O_CREATE, 0644) + if err != nil { + return err + } + defer fl.Close() + n, err := fl.Write(content) + if err == nil && n < len(content) { + err = io.ErrShortWrite + } + return err +} diff --git a/pkg/api_load/mock/api_config.yaml b/pkg/api_load/mock/api_config.yaml new file mode 100644 index 000000000..b0c8e35f9 --- /dev/null +++ b/pkg/api_load/mock/api_config.yaml @@ -0,0 +1,15 @@ +- name: "/api/v1/test-dubbo/user" + itype: "HTTP" + otype: "DUBBO" + method: "POST" + status: 1 + metadata: + - dubbo: + - application_name: "BDTService" + - group: "test" + - version: "1.0.0" + - interface: "com.ikurento.user.UserProvider" + - method: "queryUser" + - cluster_name: "test_dubbo" + - types: + - "com.ikurento.user.User" diff --git a/pkg/api_load/nacos_api_load.go b/pkg/api_load/nacos_api_loader.go similarity index 100% rename from pkg/api_load/nacos_api_load.go rename to pkg/api_load/nacos_api_loader.go diff --git a/pkg/model/api.go b/pkg/model/api.go index 667f6c68b..7d3e4bb99 100644 --- a/pkg/model/api.go +++ b/pkg/model/api.go @@ -28,15 +28,15 @@ var ( // Api is api gateway concept, control request from browser、Mobile APP、third party people type Api struct { - Name string `json:"name" yaml:"name"` - ITypeStr string `json:"itype" yaml:"itype"` - IType ApiType `json:"-" yaml:"-"` - OTypeStr string `json:"otype" yaml:"otype"` - OType ApiType `json:"-" yaml:"-"` - Status Status `json:"status" yaml:"status"` - Metadata interface{} `json:"metadata" yaml:"metadata"` - Method string `json:"method" yaml:"method"` - RequestMethod + Name string `json:"name" yaml:"name"` + ITypeStr string `json:"itype" yaml:"itype"` + IType ApiType `json:"-" yaml:"-"` + OTypeStr string `json:"otype" yaml:"otype"` + OType ApiType `json:"-" yaml:"-"` + Status Status `json:"status" yaml:"status"` + Metadata interface{} `json:"metadata" yaml:"metadata"` + Method string `json:"method" yaml:"method"` + RequestMethod `json:",omitempty" yaml:"-"` } // NewApi From 2b37d190195fab1e8b88e630f31e2fdd5841a28b Mon Sep 17 00:00:00 2001 From: shen Date: Wed, 23 Sep 2020 17:38:36 +0800 Subject: [PATCH 106/227] unit test for fileApiLoader --- pkg/api_load/api_load.go | 14 --- pkg/api_load/api_loader.go | 16 +++ pkg/api_load/{api.go => api_manager.go} | 13 +- .../{file_api_load.go => file_api_loader.go} | 10 +- pkg/api_load/file_api_loader_test.go | 111 ++++++++++++++++++ pkg/api_load/mock/api_config.yaml | 15 +++ ...{nacos_api_load.go => nacos_api_loader.go} | 0 pkg/model/api.go | 18 +-- 8 files changed, 161 insertions(+), 36 deletions(-) delete mode 100644 pkg/api_load/api_load.go create mode 100644 pkg/api_load/api_loader.go rename pkg/api_load/{api.go => api_manager.go} (96%) rename pkg/api_load/{file_api_load.go => file_api_loader.go} (95%) create mode 100644 pkg/api_load/file_api_loader_test.go create mode 100644 pkg/api_load/mock/api_config.yaml rename pkg/api_load/{nacos_api_load.go => nacos_api_loader.go} (100%) diff --git a/pkg/api_load/api_load.go b/pkg/api_load/api_load.go deleted file mode 100644 index b3856e22f..000000000 --- a/pkg/api_load/api_load.go +++ /dev/null @@ -1,14 +0,0 @@ -package api_load - -import "github.com/dubbogo/dubbo-go-proxy/pkg/model" - -type ApiLoader interface { - GetPrior() int - GetLoadedApiConfigs() ([]model.Api, error) - // 第一次初始化加载 - InitLoad() error - // 后面动态更新加载 - HotLoad() (chan struct{}, error) - // 清除所有加载的api - Clear() error -} diff --git a/pkg/api_load/api_loader.go b/pkg/api_load/api_loader.go new file mode 100644 index 000000000..4d4929de1 --- /dev/null +++ b/pkg/api_load/api_loader.go @@ -0,0 +1,16 @@ +package api_load + +import "github.com/dubbogo/dubbo-go-proxy/pkg/model" + +type ApiLoader interface { + // every apiloader has a Priority, since remote api configurer such as nacos may cover fileapiloader. + // and the larger priority number indicates it's apis can cover apis of lower priority number priority. + GetPrior() int + GetLoadedApiConfigs() ([]model.Api, error) + // load all apis at first time + InitLoad() error + // watch apis when apis configured were changed. + HotLoad() (chan struct{}, error) + // clear all apis + Clear() error +} diff --git a/pkg/api_load/api.go b/pkg/api_load/api_manager.go similarity index 96% rename from pkg/api_load/api.go rename to pkg/api_load/api_manager.go index 86c517bd4..1381b5e1a 100644 --- a/pkg/api_load/api.go +++ b/pkg/api_load/api_manager.go @@ -4,15 +4,16 @@ import ( "encoding/json" "errors" "fmt" - "github.com/apache/dubbo-go/common/logger" - "github.com/dubbogo/dubbo-go-proxy/pkg/model" - "github.com/dubbogo/dubbo-go-proxy/pkg/service" "sort" "sync" "time" ) -//var ApiLoadTypeMap = make(map[ApiLoadType]ApiLoader, 8) +import ( + "github.com/apache/dubbo-go/common/logger" + "github.com/dubbogo/dubbo-go-proxy/pkg/model" + "github.com/dubbogo/dubbo-go-proxy/pkg/service" +) type ApiLoadType string @@ -31,7 +32,7 @@ type ApiLoad struct { } func NewApiLoad(rateLimiterTime time.Duration, ads service.ApiDiscoveryService) *ApiLoad { - if rateLimiterTime > time.Millisecond*50 { + if rateLimiterTime < time.Millisecond*50 { rateLimiterTime = time.Millisecond * 50 } return &ApiLoad{ @@ -193,5 +194,5 @@ func (al *ApiLoad) add2ApiDiscoveryService(apis []model.Api) error { func (al *ApiLoad) buildApiID(api model.Api) string { return fmt.Sprintf("name:%s,ITypeStr:%s,OTypeStr:%s,Method:%s", - api.Name, api.ITypeStr, api.OTypeStr) + api.Name, api.ITypeStr, api.OTypeStr, api.Method) } diff --git a/pkg/api_load/file_api_load.go b/pkg/api_load/file_api_loader.go similarity index 95% rename from pkg/api_load/file_api_load.go rename to pkg/api_load/file_api_loader.go index 6efa91e8d..1fb70eaa6 100644 --- a/pkg/api_load/file_api_load.go +++ b/pkg/api_load/file_api_loader.go @@ -20,8 +20,7 @@ func init() { } type FileApiLoader struct { - filePath string - //locker sync.Mutex + filePath string ApiConfigs []model.Api } @@ -50,8 +49,6 @@ func (f *FileApiLoader) GetLoadedApiConfigs() ([]model.Api, error) { } func (f *FileApiLoader) InitLoad() (err error) { - //f.locker.Lock() - //defer f.locker.Unlock() content, err := ioutil.ReadFile(f.filePath) if err != nil { logger.Errorf("fileApiLoader read api config error:%v", err) @@ -71,7 +68,6 @@ func (f *FileApiLoader) InitLoad() (err error) { if len(f.ApiConfigs) < 1 { logger.Warnf("no api loaded!please make sure api config file is located") } - //f.ApiConfigs = apiConfigs return } @@ -84,9 +80,8 @@ func (f *FileApiLoader) HotLoad() (chan struct{}, error) { return nil, err } - defer watcher.Close() - go func() { + defer watcher.Close() for { select { case event, ok := <-watcher.Events: @@ -99,6 +94,7 @@ func (f *FileApiLoader) HotLoad() (chan struct{}, error) { logger.Debug("modified file:", event.Name) content, err := ioutil.ReadFile(f.filePath) jsonBytes, err := yaml.YAMLToJSON(content) + logger.Debugf("modified content:%s", content) if err != nil { logger.Warnf("fileApiLoader transfer api config error:%v,is it yaml format?", err) break diff --git a/pkg/api_load/file_api_loader_test.go b/pkg/api_load/file_api_loader_test.go new file mode 100644 index 000000000..a9132e621 --- /dev/null +++ b/pkg/api_load/file_api_loader_test.go @@ -0,0 +1,111 @@ +package api_load + +import ( + "github.com/dubbogo/dubbo-go-proxy/pkg/client/dubbo" + "github.com/dubbogo/dubbo-go-proxy/pkg/model" + "io" + "io/ioutil" + "os" + "testing" + "time" +) + +import ( + "github.com/ghodss/yaml" + "github.com/stretchr/testify/assert" +) + +const filePath = "./mock/api_config.yaml" + +func newFileLoader() ApiLoader { + return &FileApiLoader{ + filePath: filePath, + } +} + +func TestFileApiLoader_InitLoad(t *testing.T) { + fileApiLoader := newFileLoader() + err := fileApiLoader.InitLoad() + assert.Nil(t, err) + apis, err := fileApiLoader.GetLoadedApiConfigs() + assert.Nil(t, err) + assert.NotNil(t, apis) + bytes, err := yaml.Marshal(apis) + assert.Nil(t, err) + content, err := ioutil.ReadFile(filePath) + assert.Nil(t, err) + assert.YAMLEq(t, string(bytes), string(content)) +} + +func TestFileApiLoader_GetPrior(t *testing.T) { + fileApiLoader := newFileLoader() + prior := fileApiLoader.GetPrior() + assert.Equal(t, 0, prior) +} + +func TestFileApiLoader_HotLoad(t *testing.T) { + fileApiLoader := newFileLoader() + fileChangeNotifier, err := fileApiLoader.HotLoad() + assert.Nil(t, err) + assert.NotNil(t, fileChangeNotifier) + appendApiName := "test_append_api" + appendApi := model.Api{ + Name: appendApiName, + ITypeStr: "HTTP", + OTypeStr: "REST", + Method: "GET", + Status: 1, + Metadata: map[string]dubbo.DubboMetadata{ + "dubbo": { + ApplicationName: "BDTService", + Group: "test1", + Version: "2.0.0", + Interface: "com.ikurento.user.UserProvider", + Method: "GetUser", + Types: []string{ + "java.lang.String", + }, + ClusterName: "test_dubbo", + }, + }, + } + + bytes, err := yaml.Marshal([]model.Api{appendApi}) + assert.Nil(t, err) + originContent, _ := ioutil.ReadFile(filePath) + t.Log(string(bytes)) + err = appendContent(filePath, bytes) + ok := assert.Nil(t, err) + if ok { + defer ioutil.WriteFile(filePath, originContent, os.ModePerm) + } + select { + case <-fileChangeNotifier: + apis, err := fileApiLoader.GetLoadedApiConfigs() + assert.Nil(t, err) + assert.Len(t, apis, 2) + for _, api := range apis { + if api.Name == appendApiName { + assert.True(t, true) + return + } + } + assert.True(t, false) + break + case <-time.After(time.Second * 10000): + assert.Fail(t, "did't get change notice!") + } +} + +func appendContent(filename string, content []byte) error { + fl, err := os.OpenFile(filename, os.O_APPEND|os.O_CREATE, 0644) + if err != nil { + return err + } + defer fl.Close() + n, err := fl.Write(content) + if err == nil && n < len(content) { + err = io.ErrShortWrite + } + return err +} diff --git a/pkg/api_load/mock/api_config.yaml b/pkg/api_load/mock/api_config.yaml new file mode 100644 index 000000000..b0c8e35f9 --- /dev/null +++ b/pkg/api_load/mock/api_config.yaml @@ -0,0 +1,15 @@ +- name: "/api/v1/test-dubbo/user" + itype: "HTTP" + otype: "DUBBO" + method: "POST" + status: 1 + metadata: + - dubbo: + - application_name: "BDTService" + - group: "test" + - version: "1.0.0" + - interface: "com.ikurento.user.UserProvider" + - method: "queryUser" + - cluster_name: "test_dubbo" + - types: + - "com.ikurento.user.User" diff --git a/pkg/api_load/nacos_api_load.go b/pkg/api_load/nacos_api_loader.go similarity index 100% rename from pkg/api_load/nacos_api_load.go rename to pkg/api_load/nacos_api_loader.go diff --git a/pkg/model/api.go b/pkg/model/api.go index 667f6c68b..7d3e4bb99 100644 --- a/pkg/model/api.go +++ b/pkg/model/api.go @@ -28,15 +28,15 @@ var ( // Api is api gateway concept, control request from browser、Mobile APP、third party people type Api struct { - Name string `json:"name" yaml:"name"` - ITypeStr string `json:"itype" yaml:"itype"` - IType ApiType `json:"-" yaml:"-"` - OTypeStr string `json:"otype" yaml:"otype"` - OType ApiType `json:"-" yaml:"-"` - Status Status `json:"status" yaml:"status"` - Metadata interface{} `json:"metadata" yaml:"metadata"` - Method string `json:"method" yaml:"method"` - RequestMethod + Name string `json:"name" yaml:"name"` + ITypeStr string `json:"itype" yaml:"itype"` + IType ApiType `json:"-" yaml:"-"` + OTypeStr string `json:"otype" yaml:"otype"` + OType ApiType `json:"-" yaml:"-"` + Status Status `json:"status" yaml:"status"` + Metadata interface{} `json:"metadata" yaml:"metadata"` + Method string `json:"method" yaml:"method"` + RequestMethod `json:",omitempty" yaml:"-"` } // NewApi From 7aecd564983114cbfe2eeb45a1598f95f49a6fef Mon Sep 17 00:00:00 2001 From: shen Date: Wed, 23 Sep 2020 17:38:36 +0800 Subject: [PATCH 107/227] unit test for fileApiLoader --- pkg/api_load/api_load.go | 14 --- pkg/api_load/api_loader.go | 16 +++ pkg/api_load/{api.go => api_manager.go} | 13 +- .../{file_api_load.go => file_api_loader.go} | 10 +- pkg/api_load/file_api_loader_test.go | 111 ++++++++++++++++++ pkg/api_load/mock/api_config.yaml | 15 +++ ...{nacos_api_load.go => nacos_api_loader.go} | 0 pkg/model/api.go | 18 +-- 8 files changed, 161 insertions(+), 36 deletions(-) delete mode 100644 pkg/api_load/api_load.go create mode 100644 pkg/api_load/api_loader.go rename pkg/api_load/{api.go => api_manager.go} (96%) rename pkg/api_load/{file_api_load.go => file_api_loader.go} (95%) create mode 100644 pkg/api_load/file_api_loader_test.go create mode 100644 pkg/api_load/mock/api_config.yaml rename pkg/api_load/{nacos_api_load.go => nacos_api_loader.go} (100%) diff --git a/pkg/api_load/api_load.go b/pkg/api_load/api_load.go deleted file mode 100644 index b3856e22f..000000000 --- a/pkg/api_load/api_load.go +++ /dev/null @@ -1,14 +0,0 @@ -package api_load - -import "github.com/dubbogo/dubbo-go-proxy/pkg/model" - -type ApiLoader interface { - GetPrior() int - GetLoadedApiConfigs() ([]model.Api, error) - // 第一次初始化加载 - InitLoad() error - // 后面动态更新加载 - HotLoad() (chan struct{}, error) - // 清除所有加载的api - Clear() error -} diff --git a/pkg/api_load/api_loader.go b/pkg/api_load/api_loader.go new file mode 100644 index 000000000..4d4929de1 --- /dev/null +++ b/pkg/api_load/api_loader.go @@ -0,0 +1,16 @@ +package api_load + +import "github.com/dubbogo/dubbo-go-proxy/pkg/model" + +type ApiLoader interface { + // every apiloader has a Priority, since remote api configurer such as nacos may cover fileapiloader. + // and the larger priority number indicates it's apis can cover apis of lower priority number priority. + GetPrior() int + GetLoadedApiConfigs() ([]model.Api, error) + // load all apis at first time + InitLoad() error + // watch apis when apis configured were changed. + HotLoad() (chan struct{}, error) + // clear all apis + Clear() error +} diff --git a/pkg/api_load/api.go b/pkg/api_load/api_manager.go similarity index 96% rename from pkg/api_load/api.go rename to pkg/api_load/api_manager.go index 86c517bd4..1381b5e1a 100644 --- a/pkg/api_load/api.go +++ b/pkg/api_load/api_manager.go @@ -4,15 +4,16 @@ import ( "encoding/json" "errors" "fmt" - "github.com/apache/dubbo-go/common/logger" - "github.com/dubbogo/dubbo-go-proxy/pkg/model" - "github.com/dubbogo/dubbo-go-proxy/pkg/service" "sort" "sync" "time" ) -//var ApiLoadTypeMap = make(map[ApiLoadType]ApiLoader, 8) +import ( + "github.com/apache/dubbo-go/common/logger" + "github.com/dubbogo/dubbo-go-proxy/pkg/model" + "github.com/dubbogo/dubbo-go-proxy/pkg/service" +) type ApiLoadType string @@ -31,7 +32,7 @@ type ApiLoad struct { } func NewApiLoad(rateLimiterTime time.Duration, ads service.ApiDiscoveryService) *ApiLoad { - if rateLimiterTime > time.Millisecond*50 { + if rateLimiterTime < time.Millisecond*50 { rateLimiterTime = time.Millisecond * 50 } return &ApiLoad{ @@ -193,5 +194,5 @@ func (al *ApiLoad) add2ApiDiscoveryService(apis []model.Api) error { func (al *ApiLoad) buildApiID(api model.Api) string { return fmt.Sprintf("name:%s,ITypeStr:%s,OTypeStr:%s,Method:%s", - api.Name, api.ITypeStr, api.OTypeStr) + api.Name, api.ITypeStr, api.OTypeStr, api.Method) } diff --git a/pkg/api_load/file_api_load.go b/pkg/api_load/file_api_loader.go similarity index 95% rename from pkg/api_load/file_api_load.go rename to pkg/api_load/file_api_loader.go index 6efa91e8d..1fb70eaa6 100644 --- a/pkg/api_load/file_api_load.go +++ b/pkg/api_load/file_api_loader.go @@ -20,8 +20,7 @@ func init() { } type FileApiLoader struct { - filePath string - //locker sync.Mutex + filePath string ApiConfigs []model.Api } @@ -50,8 +49,6 @@ func (f *FileApiLoader) GetLoadedApiConfigs() ([]model.Api, error) { } func (f *FileApiLoader) InitLoad() (err error) { - //f.locker.Lock() - //defer f.locker.Unlock() content, err := ioutil.ReadFile(f.filePath) if err != nil { logger.Errorf("fileApiLoader read api config error:%v", err) @@ -71,7 +68,6 @@ func (f *FileApiLoader) InitLoad() (err error) { if len(f.ApiConfigs) < 1 { logger.Warnf("no api loaded!please make sure api config file is located") } - //f.ApiConfigs = apiConfigs return } @@ -84,9 +80,8 @@ func (f *FileApiLoader) HotLoad() (chan struct{}, error) { return nil, err } - defer watcher.Close() - go func() { + defer watcher.Close() for { select { case event, ok := <-watcher.Events: @@ -99,6 +94,7 @@ func (f *FileApiLoader) HotLoad() (chan struct{}, error) { logger.Debug("modified file:", event.Name) content, err := ioutil.ReadFile(f.filePath) jsonBytes, err := yaml.YAMLToJSON(content) + logger.Debugf("modified content:%s", content) if err != nil { logger.Warnf("fileApiLoader transfer api config error:%v,is it yaml format?", err) break diff --git a/pkg/api_load/file_api_loader_test.go b/pkg/api_load/file_api_loader_test.go new file mode 100644 index 000000000..a9132e621 --- /dev/null +++ b/pkg/api_load/file_api_loader_test.go @@ -0,0 +1,111 @@ +package api_load + +import ( + "github.com/dubbogo/dubbo-go-proxy/pkg/client/dubbo" + "github.com/dubbogo/dubbo-go-proxy/pkg/model" + "io" + "io/ioutil" + "os" + "testing" + "time" +) + +import ( + "github.com/ghodss/yaml" + "github.com/stretchr/testify/assert" +) + +const filePath = "./mock/api_config.yaml" + +func newFileLoader() ApiLoader { + return &FileApiLoader{ + filePath: filePath, + } +} + +func TestFileApiLoader_InitLoad(t *testing.T) { + fileApiLoader := newFileLoader() + err := fileApiLoader.InitLoad() + assert.Nil(t, err) + apis, err := fileApiLoader.GetLoadedApiConfigs() + assert.Nil(t, err) + assert.NotNil(t, apis) + bytes, err := yaml.Marshal(apis) + assert.Nil(t, err) + content, err := ioutil.ReadFile(filePath) + assert.Nil(t, err) + assert.YAMLEq(t, string(bytes), string(content)) +} + +func TestFileApiLoader_GetPrior(t *testing.T) { + fileApiLoader := newFileLoader() + prior := fileApiLoader.GetPrior() + assert.Equal(t, 0, prior) +} + +func TestFileApiLoader_HotLoad(t *testing.T) { + fileApiLoader := newFileLoader() + fileChangeNotifier, err := fileApiLoader.HotLoad() + assert.Nil(t, err) + assert.NotNil(t, fileChangeNotifier) + appendApiName := "test_append_api" + appendApi := model.Api{ + Name: appendApiName, + ITypeStr: "HTTP", + OTypeStr: "REST", + Method: "GET", + Status: 1, + Metadata: map[string]dubbo.DubboMetadata{ + "dubbo": { + ApplicationName: "BDTService", + Group: "test1", + Version: "2.0.0", + Interface: "com.ikurento.user.UserProvider", + Method: "GetUser", + Types: []string{ + "java.lang.String", + }, + ClusterName: "test_dubbo", + }, + }, + } + + bytes, err := yaml.Marshal([]model.Api{appendApi}) + assert.Nil(t, err) + originContent, _ := ioutil.ReadFile(filePath) + t.Log(string(bytes)) + err = appendContent(filePath, bytes) + ok := assert.Nil(t, err) + if ok { + defer ioutil.WriteFile(filePath, originContent, os.ModePerm) + } + select { + case <-fileChangeNotifier: + apis, err := fileApiLoader.GetLoadedApiConfigs() + assert.Nil(t, err) + assert.Len(t, apis, 2) + for _, api := range apis { + if api.Name == appendApiName { + assert.True(t, true) + return + } + } + assert.True(t, false) + break + case <-time.After(time.Second * 10000): + assert.Fail(t, "did't get change notice!") + } +} + +func appendContent(filename string, content []byte) error { + fl, err := os.OpenFile(filename, os.O_APPEND|os.O_CREATE, 0644) + if err != nil { + return err + } + defer fl.Close() + n, err := fl.Write(content) + if err == nil && n < len(content) { + err = io.ErrShortWrite + } + return err +} diff --git a/pkg/api_load/mock/api_config.yaml b/pkg/api_load/mock/api_config.yaml new file mode 100644 index 000000000..b0c8e35f9 --- /dev/null +++ b/pkg/api_load/mock/api_config.yaml @@ -0,0 +1,15 @@ +- name: "/api/v1/test-dubbo/user" + itype: "HTTP" + otype: "DUBBO" + method: "POST" + status: 1 + metadata: + - dubbo: + - application_name: "BDTService" + - group: "test" + - version: "1.0.0" + - interface: "com.ikurento.user.UserProvider" + - method: "queryUser" + - cluster_name: "test_dubbo" + - types: + - "com.ikurento.user.User" diff --git a/pkg/api_load/nacos_api_load.go b/pkg/api_load/nacos_api_loader.go similarity index 100% rename from pkg/api_load/nacos_api_load.go rename to pkg/api_load/nacos_api_loader.go diff --git a/pkg/model/api.go b/pkg/model/api.go index 667f6c68b..7d3e4bb99 100644 --- a/pkg/model/api.go +++ b/pkg/model/api.go @@ -28,15 +28,15 @@ var ( // Api is api gateway concept, control request from browser、Mobile APP、third party people type Api struct { - Name string `json:"name" yaml:"name"` - ITypeStr string `json:"itype" yaml:"itype"` - IType ApiType `json:"-" yaml:"-"` - OTypeStr string `json:"otype" yaml:"otype"` - OType ApiType `json:"-" yaml:"-"` - Status Status `json:"status" yaml:"status"` - Metadata interface{} `json:"metadata" yaml:"metadata"` - Method string `json:"method" yaml:"method"` - RequestMethod + Name string `json:"name" yaml:"name"` + ITypeStr string `json:"itype" yaml:"itype"` + IType ApiType `json:"-" yaml:"-"` + OTypeStr string `json:"otype" yaml:"otype"` + OType ApiType `json:"-" yaml:"-"` + Status Status `json:"status" yaml:"status"` + Metadata interface{} `json:"metadata" yaml:"metadata"` + Method string `json:"method" yaml:"method"` + RequestMethod `json:",omitempty" yaml:"-"` } // NewApi From 1bbd64aa43c67436d8f4528f0652e49a87424e5b Mon Sep 17 00:00:00 2001 From: shen Date: Wed, 23 Sep 2020 17:38:36 +0800 Subject: [PATCH 108/227] unit test for fileApiLoader --- pkg/api_load/api_load.go | 14 --- pkg/api_load/api_loader.go | 16 +++ pkg/api_load/{api.go => api_manager.go} | 13 +- .../{file_api_load.go => file_api_loader.go} | 10 +- pkg/api_load/file_api_loader_test.go | 111 ++++++++++++++++++ pkg/api_load/mock/api_config.yaml | 15 +++ ...{nacos_api_load.go => nacos_api_loader.go} | 0 pkg/model/api.go | 18 +-- 8 files changed, 161 insertions(+), 36 deletions(-) delete mode 100644 pkg/api_load/api_load.go create mode 100644 pkg/api_load/api_loader.go rename pkg/api_load/{api.go => api_manager.go} (96%) rename pkg/api_load/{file_api_load.go => file_api_loader.go} (95%) create mode 100644 pkg/api_load/file_api_loader_test.go create mode 100644 pkg/api_load/mock/api_config.yaml rename pkg/api_load/{nacos_api_load.go => nacos_api_loader.go} (100%) diff --git a/pkg/api_load/api_load.go b/pkg/api_load/api_load.go deleted file mode 100644 index b3856e22f..000000000 --- a/pkg/api_load/api_load.go +++ /dev/null @@ -1,14 +0,0 @@ -package api_load - -import "github.com/dubbogo/dubbo-go-proxy/pkg/model" - -type ApiLoader interface { - GetPrior() int - GetLoadedApiConfigs() ([]model.Api, error) - // 第一次初始化加载 - InitLoad() error - // 后面动态更新加载 - HotLoad() (chan struct{}, error) - // 清除所有加载的api - Clear() error -} diff --git a/pkg/api_load/api_loader.go b/pkg/api_load/api_loader.go new file mode 100644 index 000000000..4d4929de1 --- /dev/null +++ b/pkg/api_load/api_loader.go @@ -0,0 +1,16 @@ +package api_load + +import "github.com/dubbogo/dubbo-go-proxy/pkg/model" + +type ApiLoader interface { + // every apiloader has a Priority, since remote api configurer such as nacos may cover fileapiloader. + // and the larger priority number indicates it's apis can cover apis of lower priority number priority. + GetPrior() int + GetLoadedApiConfigs() ([]model.Api, error) + // load all apis at first time + InitLoad() error + // watch apis when apis configured were changed. + HotLoad() (chan struct{}, error) + // clear all apis + Clear() error +} diff --git a/pkg/api_load/api.go b/pkg/api_load/api_manager.go similarity index 96% rename from pkg/api_load/api.go rename to pkg/api_load/api_manager.go index 86c517bd4..1381b5e1a 100644 --- a/pkg/api_load/api.go +++ b/pkg/api_load/api_manager.go @@ -4,15 +4,16 @@ import ( "encoding/json" "errors" "fmt" - "github.com/apache/dubbo-go/common/logger" - "github.com/dubbogo/dubbo-go-proxy/pkg/model" - "github.com/dubbogo/dubbo-go-proxy/pkg/service" "sort" "sync" "time" ) -//var ApiLoadTypeMap = make(map[ApiLoadType]ApiLoader, 8) +import ( + "github.com/apache/dubbo-go/common/logger" + "github.com/dubbogo/dubbo-go-proxy/pkg/model" + "github.com/dubbogo/dubbo-go-proxy/pkg/service" +) type ApiLoadType string @@ -31,7 +32,7 @@ type ApiLoad struct { } func NewApiLoad(rateLimiterTime time.Duration, ads service.ApiDiscoveryService) *ApiLoad { - if rateLimiterTime > time.Millisecond*50 { + if rateLimiterTime < time.Millisecond*50 { rateLimiterTime = time.Millisecond * 50 } return &ApiLoad{ @@ -193,5 +194,5 @@ func (al *ApiLoad) add2ApiDiscoveryService(apis []model.Api) error { func (al *ApiLoad) buildApiID(api model.Api) string { return fmt.Sprintf("name:%s,ITypeStr:%s,OTypeStr:%s,Method:%s", - api.Name, api.ITypeStr, api.OTypeStr) + api.Name, api.ITypeStr, api.OTypeStr, api.Method) } diff --git a/pkg/api_load/file_api_load.go b/pkg/api_load/file_api_loader.go similarity index 95% rename from pkg/api_load/file_api_load.go rename to pkg/api_load/file_api_loader.go index 6efa91e8d..1fb70eaa6 100644 --- a/pkg/api_load/file_api_load.go +++ b/pkg/api_load/file_api_loader.go @@ -20,8 +20,7 @@ func init() { } type FileApiLoader struct { - filePath string - //locker sync.Mutex + filePath string ApiConfigs []model.Api } @@ -50,8 +49,6 @@ func (f *FileApiLoader) GetLoadedApiConfigs() ([]model.Api, error) { } func (f *FileApiLoader) InitLoad() (err error) { - //f.locker.Lock() - //defer f.locker.Unlock() content, err := ioutil.ReadFile(f.filePath) if err != nil { logger.Errorf("fileApiLoader read api config error:%v", err) @@ -71,7 +68,6 @@ func (f *FileApiLoader) InitLoad() (err error) { if len(f.ApiConfigs) < 1 { logger.Warnf("no api loaded!please make sure api config file is located") } - //f.ApiConfigs = apiConfigs return } @@ -84,9 +80,8 @@ func (f *FileApiLoader) HotLoad() (chan struct{}, error) { return nil, err } - defer watcher.Close() - go func() { + defer watcher.Close() for { select { case event, ok := <-watcher.Events: @@ -99,6 +94,7 @@ func (f *FileApiLoader) HotLoad() (chan struct{}, error) { logger.Debug("modified file:", event.Name) content, err := ioutil.ReadFile(f.filePath) jsonBytes, err := yaml.YAMLToJSON(content) + logger.Debugf("modified content:%s", content) if err != nil { logger.Warnf("fileApiLoader transfer api config error:%v,is it yaml format?", err) break diff --git a/pkg/api_load/file_api_loader_test.go b/pkg/api_load/file_api_loader_test.go new file mode 100644 index 000000000..a9132e621 --- /dev/null +++ b/pkg/api_load/file_api_loader_test.go @@ -0,0 +1,111 @@ +package api_load + +import ( + "github.com/dubbogo/dubbo-go-proxy/pkg/client/dubbo" + "github.com/dubbogo/dubbo-go-proxy/pkg/model" + "io" + "io/ioutil" + "os" + "testing" + "time" +) + +import ( + "github.com/ghodss/yaml" + "github.com/stretchr/testify/assert" +) + +const filePath = "./mock/api_config.yaml" + +func newFileLoader() ApiLoader { + return &FileApiLoader{ + filePath: filePath, + } +} + +func TestFileApiLoader_InitLoad(t *testing.T) { + fileApiLoader := newFileLoader() + err := fileApiLoader.InitLoad() + assert.Nil(t, err) + apis, err := fileApiLoader.GetLoadedApiConfigs() + assert.Nil(t, err) + assert.NotNil(t, apis) + bytes, err := yaml.Marshal(apis) + assert.Nil(t, err) + content, err := ioutil.ReadFile(filePath) + assert.Nil(t, err) + assert.YAMLEq(t, string(bytes), string(content)) +} + +func TestFileApiLoader_GetPrior(t *testing.T) { + fileApiLoader := newFileLoader() + prior := fileApiLoader.GetPrior() + assert.Equal(t, 0, prior) +} + +func TestFileApiLoader_HotLoad(t *testing.T) { + fileApiLoader := newFileLoader() + fileChangeNotifier, err := fileApiLoader.HotLoad() + assert.Nil(t, err) + assert.NotNil(t, fileChangeNotifier) + appendApiName := "test_append_api" + appendApi := model.Api{ + Name: appendApiName, + ITypeStr: "HTTP", + OTypeStr: "REST", + Method: "GET", + Status: 1, + Metadata: map[string]dubbo.DubboMetadata{ + "dubbo": { + ApplicationName: "BDTService", + Group: "test1", + Version: "2.0.0", + Interface: "com.ikurento.user.UserProvider", + Method: "GetUser", + Types: []string{ + "java.lang.String", + }, + ClusterName: "test_dubbo", + }, + }, + } + + bytes, err := yaml.Marshal([]model.Api{appendApi}) + assert.Nil(t, err) + originContent, _ := ioutil.ReadFile(filePath) + t.Log(string(bytes)) + err = appendContent(filePath, bytes) + ok := assert.Nil(t, err) + if ok { + defer ioutil.WriteFile(filePath, originContent, os.ModePerm) + } + select { + case <-fileChangeNotifier: + apis, err := fileApiLoader.GetLoadedApiConfigs() + assert.Nil(t, err) + assert.Len(t, apis, 2) + for _, api := range apis { + if api.Name == appendApiName { + assert.True(t, true) + return + } + } + assert.True(t, false) + break + case <-time.After(time.Second * 10000): + assert.Fail(t, "did't get change notice!") + } +} + +func appendContent(filename string, content []byte) error { + fl, err := os.OpenFile(filename, os.O_APPEND|os.O_CREATE, 0644) + if err != nil { + return err + } + defer fl.Close() + n, err := fl.Write(content) + if err == nil && n < len(content) { + err = io.ErrShortWrite + } + return err +} diff --git a/pkg/api_load/mock/api_config.yaml b/pkg/api_load/mock/api_config.yaml new file mode 100644 index 000000000..b0c8e35f9 --- /dev/null +++ b/pkg/api_load/mock/api_config.yaml @@ -0,0 +1,15 @@ +- name: "/api/v1/test-dubbo/user" + itype: "HTTP" + otype: "DUBBO" + method: "POST" + status: 1 + metadata: + - dubbo: + - application_name: "BDTService" + - group: "test" + - version: "1.0.0" + - interface: "com.ikurento.user.UserProvider" + - method: "queryUser" + - cluster_name: "test_dubbo" + - types: + - "com.ikurento.user.User" diff --git a/pkg/api_load/nacos_api_load.go b/pkg/api_load/nacos_api_loader.go similarity index 100% rename from pkg/api_load/nacos_api_load.go rename to pkg/api_load/nacos_api_loader.go diff --git a/pkg/model/api.go b/pkg/model/api.go index 667f6c68b..7d3e4bb99 100644 --- a/pkg/model/api.go +++ b/pkg/model/api.go @@ -28,15 +28,15 @@ var ( // Api is api gateway concept, control request from browser、Mobile APP、third party people type Api struct { - Name string `json:"name" yaml:"name"` - ITypeStr string `json:"itype" yaml:"itype"` - IType ApiType `json:"-" yaml:"-"` - OTypeStr string `json:"otype" yaml:"otype"` - OType ApiType `json:"-" yaml:"-"` - Status Status `json:"status" yaml:"status"` - Metadata interface{} `json:"metadata" yaml:"metadata"` - Method string `json:"method" yaml:"method"` - RequestMethod + Name string `json:"name" yaml:"name"` + ITypeStr string `json:"itype" yaml:"itype"` + IType ApiType `json:"-" yaml:"-"` + OTypeStr string `json:"otype" yaml:"otype"` + OType ApiType `json:"-" yaml:"-"` + Status Status `json:"status" yaml:"status"` + Metadata interface{} `json:"metadata" yaml:"metadata"` + Method string `json:"method" yaml:"method"` + RequestMethod `json:",omitempty" yaml:"-"` } // NewApi From cf23c63583b52f8a4c3767b3174674225dfdd77b Mon Sep 17 00:00:00 2001 From: shen Date: Wed, 23 Sep 2020 18:31:49 +0800 Subject: [PATCH 109/227] unit test for apiManager --- pkg/api_load/api_manager.go | 28 ++++++++++++++++++---------- pkg/api_load/api_manager_test.go | 22 ++++++++++++++++++++++ pkg/proxy/proxy_start.go | 2 +- 3 files changed, 41 insertions(+), 11 deletions(-) create mode 100644 pkg/api_load/api_manager_test.go diff --git a/pkg/api_load/api_manager.go b/pkg/api_load/api_manager.go index 1381b5e1a..af3265bfc 100644 --- a/pkg/api_load/api_manager.go +++ b/pkg/api_load/api_manager.go @@ -22,7 +22,7 @@ const ( Nacos ApiLoadType = "nacos" ) -type ApiLoad struct { +type ApiManager struct { mergeLock sync.Locker limiter *time.Timer rateLimiterTime time.Duration @@ -31,11 +31,11 @@ type ApiLoad struct { ads service.ApiDiscoveryService } -func NewApiLoad(rateLimiterTime time.Duration, ads service.ApiDiscoveryService) *ApiLoad { +func NewApiManager(rateLimiterTime time.Duration, ads service.ApiDiscoveryService) *ApiManager { if rateLimiterTime < time.Millisecond*50 { rateLimiterTime = time.Millisecond * 50 } - return &ApiLoad{ + return &ApiManager{ ApiLoadTypeMap: make(map[ApiLoadType]ApiLoader, 8), mergeTask: make(chan struct{}, 1), limiter: time.NewTimer(rateLimiterTime), @@ -44,7 +44,7 @@ func NewApiLoad(rateLimiterTime time.Duration, ads service.ApiDiscoveryService) } } -func (al *ApiLoad) AddApiLoad(config model.ApiConfig) { +func (al *ApiManager) AddApiLoad(config model.ApiConfig) { if config.File != nil { al.ApiLoadTypeMap[File] = NewFileApiLoader(WithFilePath(config.File.FileApiConfPath)) } @@ -53,7 +53,15 @@ func (al *ApiLoad) AddApiLoad(config model.ApiConfig) { } } -func (al *ApiLoad) StartLoadApi() error { +func (al *ApiManager) GetApiLoad(apiLoadType ApiLoadType) (ApiLoader, error) { + if apiLoader, ok := al.ApiLoadTypeMap[apiLoadType]; ok { + return apiLoader, nil + } + return nil, errors.New(fmt.Sprintf("can't load apiLoader for :%s", apiLoadType)) + +} + +func (al *ApiManager) StartLoadApi() error { for _, loader := range al.ApiLoadTypeMap { err := loader.InitLoad() if err != nil { @@ -92,7 +100,7 @@ func (al *ApiLoad) StartLoadApi() error { return nil } -func (al *ApiLoad) AddMergeTask() error { +func (al *ApiManager) AddMergeTask() error { select { case al.mergeTask <- struct{}{}: logger.Debug("added a merge task, waiting to merge api.") @@ -104,7 +112,7 @@ func (al *ApiLoad) AddMergeTask() error { return nil } -func (al *ApiLoad) SelectMergeApiTask() (err error) { +func (al *ApiManager) SelectMergeApiTask() (err error) { for { select { case <-al.limiter.C: @@ -124,7 +132,7 @@ func (al *ApiLoad) SelectMergeApiTask() (err error) { return } -func (al *ApiLoad) DoMergeApiTask() (skip bool, err error) { +func (al *ApiManager) DoMergeApiTask() (skip bool, err error) { al.mergeLock.Lock() defer al.mergeLock.Unlock() wait := time.After(time.Millisecond * 50) @@ -180,7 +188,7 @@ func (al *ApiLoad) DoMergeApiTask() (skip bool, err error) { } } -func (al *ApiLoad) add2ApiDiscoveryService(apis []model.Api) error { +func (al *ApiManager) add2ApiDiscoveryService(apis []model.Api) error { for _, api := range apis { j, _ := json.Marshal(api) _, err := al.ads.AddApi(*service.NewDiscoveryRequest(j)) @@ -192,7 +200,7 @@ func (al *ApiLoad) add2ApiDiscoveryService(apis []model.Api) error { return nil } -func (al *ApiLoad) buildApiID(api model.Api) string { +func (al *ApiManager) buildApiID(api model.Api) string { return fmt.Sprintf("name:%s,ITypeStr:%s,OTypeStr:%s,Method:%s", api.Name, api.ITypeStr, api.OTypeStr, api.Method) } diff --git a/pkg/api_load/api_manager_test.go b/pkg/api_load/api_manager_test.go new file mode 100644 index 000000000..391b04597 --- /dev/null +++ b/pkg/api_load/api_manager_test.go @@ -0,0 +1,22 @@ +package api_load + +import ( + "github.com/dubbogo/dubbo-go-proxy/pkg/model" + "github.com/dubbogo/dubbo-go-proxy/pkg/service/api" + "testing" + "time" +) + +func TestApiLoad_StartLoadApi(t *testing.T) { +} + +func TestApiLoad_AddApiLoad(t *testing.T) { + ads := api.NewLocalMemoryApiDiscoveryService() + apiManager := NewApiManager(time.Second*5, ads) + apiManager.AddApiLoad(model.ApiConfig{ + File: &model.File{ + FileApiConfPath: filePath, + }, + }) + +} diff --git a/pkg/proxy/proxy_start.go b/pkg/proxy/proxy_start.go index 698d7bdaa..72e2c9161 100644 --- a/pkg/proxy/proxy_start.go +++ b/pkg/proxy/proxy_start.go @@ -71,7 +71,7 @@ func (p *Proxy) beforeStart() error { // TODO mock api register ads := extension.GetMustApiDiscoveryService(constant.LocalMemoryApiDiscoveryService) - apiLoader := api_load.NewApiLoad(time.Second, ads) + apiLoader := api_load.NewApiManager(time.Second, ads) apiLoader.AddApiLoad(p.bs.DynamicResources.ApiConfig) err := apiLoader.StartLoadApi() if err != nil { From fb7cdcea7bca9208fa031b82b0af4c904b3f0b17 Mon Sep 17 00:00:00 2001 From: shen Date: Wed, 23 Sep 2020 18:31:49 +0800 Subject: [PATCH 110/227] unit test for apiManager --- pkg/api_load/api_manager.go | 28 ++++++++++++++++++---------- pkg/api_load/api_manager_test.go | 22 ++++++++++++++++++++++ pkg/proxy/proxy_start.go | 2 +- 3 files changed, 41 insertions(+), 11 deletions(-) create mode 100644 pkg/api_load/api_manager_test.go diff --git a/pkg/api_load/api_manager.go b/pkg/api_load/api_manager.go index 1381b5e1a..af3265bfc 100644 --- a/pkg/api_load/api_manager.go +++ b/pkg/api_load/api_manager.go @@ -22,7 +22,7 @@ const ( Nacos ApiLoadType = "nacos" ) -type ApiLoad struct { +type ApiManager struct { mergeLock sync.Locker limiter *time.Timer rateLimiterTime time.Duration @@ -31,11 +31,11 @@ type ApiLoad struct { ads service.ApiDiscoveryService } -func NewApiLoad(rateLimiterTime time.Duration, ads service.ApiDiscoveryService) *ApiLoad { +func NewApiManager(rateLimiterTime time.Duration, ads service.ApiDiscoveryService) *ApiManager { if rateLimiterTime < time.Millisecond*50 { rateLimiterTime = time.Millisecond * 50 } - return &ApiLoad{ + return &ApiManager{ ApiLoadTypeMap: make(map[ApiLoadType]ApiLoader, 8), mergeTask: make(chan struct{}, 1), limiter: time.NewTimer(rateLimiterTime), @@ -44,7 +44,7 @@ func NewApiLoad(rateLimiterTime time.Duration, ads service.ApiDiscoveryService) } } -func (al *ApiLoad) AddApiLoad(config model.ApiConfig) { +func (al *ApiManager) AddApiLoad(config model.ApiConfig) { if config.File != nil { al.ApiLoadTypeMap[File] = NewFileApiLoader(WithFilePath(config.File.FileApiConfPath)) } @@ -53,7 +53,15 @@ func (al *ApiLoad) AddApiLoad(config model.ApiConfig) { } } -func (al *ApiLoad) StartLoadApi() error { +func (al *ApiManager) GetApiLoad(apiLoadType ApiLoadType) (ApiLoader, error) { + if apiLoader, ok := al.ApiLoadTypeMap[apiLoadType]; ok { + return apiLoader, nil + } + return nil, errors.New(fmt.Sprintf("can't load apiLoader for :%s", apiLoadType)) + +} + +func (al *ApiManager) StartLoadApi() error { for _, loader := range al.ApiLoadTypeMap { err := loader.InitLoad() if err != nil { @@ -92,7 +100,7 @@ func (al *ApiLoad) StartLoadApi() error { return nil } -func (al *ApiLoad) AddMergeTask() error { +func (al *ApiManager) AddMergeTask() error { select { case al.mergeTask <- struct{}{}: logger.Debug("added a merge task, waiting to merge api.") @@ -104,7 +112,7 @@ func (al *ApiLoad) AddMergeTask() error { return nil } -func (al *ApiLoad) SelectMergeApiTask() (err error) { +func (al *ApiManager) SelectMergeApiTask() (err error) { for { select { case <-al.limiter.C: @@ -124,7 +132,7 @@ func (al *ApiLoad) SelectMergeApiTask() (err error) { return } -func (al *ApiLoad) DoMergeApiTask() (skip bool, err error) { +func (al *ApiManager) DoMergeApiTask() (skip bool, err error) { al.mergeLock.Lock() defer al.mergeLock.Unlock() wait := time.After(time.Millisecond * 50) @@ -180,7 +188,7 @@ func (al *ApiLoad) DoMergeApiTask() (skip bool, err error) { } } -func (al *ApiLoad) add2ApiDiscoveryService(apis []model.Api) error { +func (al *ApiManager) add2ApiDiscoveryService(apis []model.Api) error { for _, api := range apis { j, _ := json.Marshal(api) _, err := al.ads.AddApi(*service.NewDiscoveryRequest(j)) @@ -192,7 +200,7 @@ func (al *ApiLoad) add2ApiDiscoveryService(apis []model.Api) error { return nil } -func (al *ApiLoad) buildApiID(api model.Api) string { +func (al *ApiManager) buildApiID(api model.Api) string { return fmt.Sprintf("name:%s,ITypeStr:%s,OTypeStr:%s,Method:%s", api.Name, api.ITypeStr, api.OTypeStr, api.Method) } diff --git a/pkg/api_load/api_manager_test.go b/pkg/api_load/api_manager_test.go new file mode 100644 index 000000000..391b04597 --- /dev/null +++ b/pkg/api_load/api_manager_test.go @@ -0,0 +1,22 @@ +package api_load + +import ( + "github.com/dubbogo/dubbo-go-proxy/pkg/model" + "github.com/dubbogo/dubbo-go-proxy/pkg/service/api" + "testing" + "time" +) + +func TestApiLoad_StartLoadApi(t *testing.T) { +} + +func TestApiLoad_AddApiLoad(t *testing.T) { + ads := api.NewLocalMemoryApiDiscoveryService() + apiManager := NewApiManager(time.Second*5, ads) + apiManager.AddApiLoad(model.ApiConfig{ + File: &model.File{ + FileApiConfPath: filePath, + }, + }) + +} diff --git a/pkg/proxy/proxy_start.go b/pkg/proxy/proxy_start.go index 698d7bdaa..72e2c9161 100644 --- a/pkg/proxy/proxy_start.go +++ b/pkg/proxy/proxy_start.go @@ -71,7 +71,7 @@ func (p *Proxy) beforeStart() error { // TODO mock api register ads := extension.GetMustApiDiscoveryService(constant.LocalMemoryApiDiscoveryService) - apiLoader := api_load.NewApiLoad(time.Second, ads) + apiLoader := api_load.NewApiManager(time.Second, ads) apiLoader.AddApiLoad(p.bs.DynamicResources.ApiConfig) err := apiLoader.StartLoadApi() if err != nil { From 91bb41ffd6be27ec6ed013d47af55e4fb35fa3b3 Mon Sep 17 00:00:00 2001 From: shen Date: Wed, 23 Sep 2020 18:31:49 +0800 Subject: [PATCH 111/227] unit test for apiManager --- pkg/api_load/api_manager.go | 28 ++++++++++++++++++---------- pkg/api_load/api_manager_test.go | 22 ++++++++++++++++++++++ pkg/proxy/proxy_start.go | 2 +- 3 files changed, 41 insertions(+), 11 deletions(-) create mode 100644 pkg/api_load/api_manager_test.go diff --git a/pkg/api_load/api_manager.go b/pkg/api_load/api_manager.go index 1381b5e1a..af3265bfc 100644 --- a/pkg/api_load/api_manager.go +++ b/pkg/api_load/api_manager.go @@ -22,7 +22,7 @@ const ( Nacos ApiLoadType = "nacos" ) -type ApiLoad struct { +type ApiManager struct { mergeLock sync.Locker limiter *time.Timer rateLimiterTime time.Duration @@ -31,11 +31,11 @@ type ApiLoad struct { ads service.ApiDiscoveryService } -func NewApiLoad(rateLimiterTime time.Duration, ads service.ApiDiscoveryService) *ApiLoad { +func NewApiManager(rateLimiterTime time.Duration, ads service.ApiDiscoveryService) *ApiManager { if rateLimiterTime < time.Millisecond*50 { rateLimiterTime = time.Millisecond * 50 } - return &ApiLoad{ + return &ApiManager{ ApiLoadTypeMap: make(map[ApiLoadType]ApiLoader, 8), mergeTask: make(chan struct{}, 1), limiter: time.NewTimer(rateLimiterTime), @@ -44,7 +44,7 @@ func NewApiLoad(rateLimiterTime time.Duration, ads service.ApiDiscoveryService) } } -func (al *ApiLoad) AddApiLoad(config model.ApiConfig) { +func (al *ApiManager) AddApiLoad(config model.ApiConfig) { if config.File != nil { al.ApiLoadTypeMap[File] = NewFileApiLoader(WithFilePath(config.File.FileApiConfPath)) } @@ -53,7 +53,15 @@ func (al *ApiLoad) AddApiLoad(config model.ApiConfig) { } } -func (al *ApiLoad) StartLoadApi() error { +func (al *ApiManager) GetApiLoad(apiLoadType ApiLoadType) (ApiLoader, error) { + if apiLoader, ok := al.ApiLoadTypeMap[apiLoadType]; ok { + return apiLoader, nil + } + return nil, errors.New(fmt.Sprintf("can't load apiLoader for :%s", apiLoadType)) + +} + +func (al *ApiManager) StartLoadApi() error { for _, loader := range al.ApiLoadTypeMap { err := loader.InitLoad() if err != nil { @@ -92,7 +100,7 @@ func (al *ApiLoad) StartLoadApi() error { return nil } -func (al *ApiLoad) AddMergeTask() error { +func (al *ApiManager) AddMergeTask() error { select { case al.mergeTask <- struct{}{}: logger.Debug("added a merge task, waiting to merge api.") @@ -104,7 +112,7 @@ func (al *ApiLoad) AddMergeTask() error { return nil } -func (al *ApiLoad) SelectMergeApiTask() (err error) { +func (al *ApiManager) SelectMergeApiTask() (err error) { for { select { case <-al.limiter.C: @@ -124,7 +132,7 @@ func (al *ApiLoad) SelectMergeApiTask() (err error) { return } -func (al *ApiLoad) DoMergeApiTask() (skip bool, err error) { +func (al *ApiManager) DoMergeApiTask() (skip bool, err error) { al.mergeLock.Lock() defer al.mergeLock.Unlock() wait := time.After(time.Millisecond * 50) @@ -180,7 +188,7 @@ func (al *ApiLoad) DoMergeApiTask() (skip bool, err error) { } } -func (al *ApiLoad) add2ApiDiscoveryService(apis []model.Api) error { +func (al *ApiManager) add2ApiDiscoveryService(apis []model.Api) error { for _, api := range apis { j, _ := json.Marshal(api) _, err := al.ads.AddApi(*service.NewDiscoveryRequest(j)) @@ -192,7 +200,7 @@ func (al *ApiLoad) add2ApiDiscoveryService(apis []model.Api) error { return nil } -func (al *ApiLoad) buildApiID(api model.Api) string { +func (al *ApiManager) buildApiID(api model.Api) string { return fmt.Sprintf("name:%s,ITypeStr:%s,OTypeStr:%s,Method:%s", api.Name, api.ITypeStr, api.OTypeStr, api.Method) } diff --git a/pkg/api_load/api_manager_test.go b/pkg/api_load/api_manager_test.go new file mode 100644 index 000000000..391b04597 --- /dev/null +++ b/pkg/api_load/api_manager_test.go @@ -0,0 +1,22 @@ +package api_load + +import ( + "github.com/dubbogo/dubbo-go-proxy/pkg/model" + "github.com/dubbogo/dubbo-go-proxy/pkg/service/api" + "testing" + "time" +) + +func TestApiLoad_StartLoadApi(t *testing.T) { +} + +func TestApiLoad_AddApiLoad(t *testing.T) { + ads := api.NewLocalMemoryApiDiscoveryService() + apiManager := NewApiManager(time.Second*5, ads) + apiManager.AddApiLoad(model.ApiConfig{ + File: &model.File{ + FileApiConfPath: filePath, + }, + }) + +} diff --git a/pkg/proxy/proxy_start.go b/pkg/proxy/proxy_start.go index 698d7bdaa..72e2c9161 100644 --- a/pkg/proxy/proxy_start.go +++ b/pkg/proxy/proxy_start.go @@ -71,7 +71,7 @@ func (p *Proxy) beforeStart() error { // TODO mock api register ads := extension.GetMustApiDiscoveryService(constant.LocalMemoryApiDiscoveryService) - apiLoader := api_load.NewApiLoad(time.Second, ads) + apiLoader := api_load.NewApiManager(time.Second, ads) apiLoader.AddApiLoad(p.bs.DynamicResources.ApiConfig) err := apiLoader.StartLoadApi() if err != nil { From 82f6a39d0e837f9bc305afaebe95c562e03856ab Mon Sep 17 00:00:00 2001 From: shen Date: Wed, 23 Sep 2020 18:31:49 +0800 Subject: [PATCH 112/227] unit test for apiManager --- pkg/api_load/api_manager.go | 28 ++++++++++++++++++---------- pkg/api_load/api_manager_test.go | 22 ++++++++++++++++++++++ pkg/proxy/proxy_start.go | 2 +- 3 files changed, 41 insertions(+), 11 deletions(-) create mode 100644 pkg/api_load/api_manager_test.go diff --git a/pkg/api_load/api_manager.go b/pkg/api_load/api_manager.go index 1381b5e1a..af3265bfc 100644 --- a/pkg/api_load/api_manager.go +++ b/pkg/api_load/api_manager.go @@ -22,7 +22,7 @@ const ( Nacos ApiLoadType = "nacos" ) -type ApiLoad struct { +type ApiManager struct { mergeLock sync.Locker limiter *time.Timer rateLimiterTime time.Duration @@ -31,11 +31,11 @@ type ApiLoad struct { ads service.ApiDiscoveryService } -func NewApiLoad(rateLimiterTime time.Duration, ads service.ApiDiscoveryService) *ApiLoad { +func NewApiManager(rateLimiterTime time.Duration, ads service.ApiDiscoveryService) *ApiManager { if rateLimiterTime < time.Millisecond*50 { rateLimiterTime = time.Millisecond * 50 } - return &ApiLoad{ + return &ApiManager{ ApiLoadTypeMap: make(map[ApiLoadType]ApiLoader, 8), mergeTask: make(chan struct{}, 1), limiter: time.NewTimer(rateLimiterTime), @@ -44,7 +44,7 @@ func NewApiLoad(rateLimiterTime time.Duration, ads service.ApiDiscoveryService) } } -func (al *ApiLoad) AddApiLoad(config model.ApiConfig) { +func (al *ApiManager) AddApiLoad(config model.ApiConfig) { if config.File != nil { al.ApiLoadTypeMap[File] = NewFileApiLoader(WithFilePath(config.File.FileApiConfPath)) } @@ -53,7 +53,15 @@ func (al *ApiLoad) AddApiLoad(config model.ApiConfig) { } } -func (al *ApiLoad) StartLoadApi() error { +func (al *ApiManager) GetApiLoad(apiLoadType ApiLoadType) (ApiLoader, error) { + if apiLoader, ok := al.ApiLoadTypeMap[apiLoadType]; ok { + return apiLoader, nil + } + return nil, errors.New(fmt.Sprintf("can't load apiLoader for :%s", apiLoadType)) + +} + +func (al *ApiManager) StartLoadApi() error { for _, loader := range al.ApiLoadTypeMap { err := loader.InitLoad() if err != nil { @@ -92,7 +100,7 @@ func (al *ApiLoad) StartLoadApi() error { return nil } -func (al *ApiLoad) AddMergeTask() error { +func (al *ApiManager) AddMergeTask() error { select { case al.mergeTask <- struct{}{}: logger.Debug("added a merge task, waiting to merge api.") @@ -104,7 +112,7 @@ func (al *ApiLoad) AddMergeTask() error { return nil } -func (al *ApiLoad) SelectMergeApiTask() (err error) { +func (al *ApiManager) SelectMergeApiTask() (err error) { for { select { case <-al.limiter.C: @@ -124,7 +132,7 @@ func (al *ApiLoad) SelectMergeApiTask() (err error) { return } -func (al *ApiLoad) DoMergeApiTask() (skip bool, err error) { +func (al *ApiManager) DoMergeApiTask() (skip bool, err error) { al.mergeLock.Lock() defer al.mergeLock.Unlock() wait := time.After(time.Millisecond * 50) @@ -180,7 +188,7 @@ func (al *ApiLoad) DoMergeApiTask() (skip bool, err error) { } } -func (al *ApiLoad) add2ApiDiscoveryService(apis []model.Api) error { +func (al *ApiManager) add2ApiDiscoveryService(apis []model.Api) error { for _, api := range apis { j, _ := json.Marshal(api) _, err := al.ads.AddApi(*service.NewDiscoveryRequest(j)) @@ -192,7 +200,7 @@ func (al *ApiLoad) add2ApiDiscoveryService(apis []model.Api) error { return nil } -func (al *ApiLoad) buildApiID(api model.Api) string { +func (al *ApiManager) buildApiID(api model.Api) string { return fmt.Sprintf("name:%s,ITypeStr:%s,OTypeStr:%s,Method:%s", api.Name, api.ITypeStr, api.OTypeStr, api.Method) } diff --git a/pkg/api_load/api_manager_test.go b/pkg/api_load/api_manager_test.go new file mode 100644 index 000000000..391b04597 --- /dev/null +++ b/pkg/api_load/api_manager_test.go @@ -0,0 +1,22 @@ +package api_load + +import ( + "github.com/dubbogo/dubbo-go-proxy/pkg/model" + "github.com/dubbogo/dubbo-go-proxy/pkg/service/api" + "testing" + "time" +) + +func TestApiLoad_StartLoadApi(t *testing.T) { +} + +func TestApiLoad_AddApiLoad(t *testing.T) { + ads := api.NewLocalMemoryApiDiscoveryService() + apiManager := NewApiManager(time.Second*5, ads) + apiManager.AddApiLoad(model.ApiConfig{ + File: &model.File{ + FileApiConfPath: filePath, + }, + }) + +} diff --git a/pkg/proxy/proxy_start.go b/pkg/proxy/proxy_start.go index 698d7bdaa..72e2c9161 100644 --- a/pkg/proxy/proxy_start.go +++ b/pkg/proxy/proxy_start.go @@ -71,7 +71,7 @@ func (p *Proxy) beforeStart() error { // TODO mock api register ads := extension.GetMustApiDiscoveryService(constant.LocalMemoryApiDiscoveryService) - apiLoader := api_load.NewApiLoad(time.Second, ads) + apiLoader := api_load.NewApiManager(time.Second, ads) apiLoader.AddApiLoad(p.bs.DynamicResources.ApiConfig) err := apiLoader.StartLoadApi() if err != nil { From 22f2e5beef5b04f62983c609092ba1321a2b37a0 Mon Sep 17 00:00:00 2001 From: shen <1292369127@qq.com> Date: Wed, 23 Sep 2020 22:09:27 +0800 Subject: [PATCH 113/227] unit test for api loader --- pkg/api_load/api_manager.go | 34 ++++++++----- pkg/api_load/api_manager_test.go | 74 ++++++++++++++++++++++++++-- pkg/api_load/file_api_loader_test.go | 9 ++-- pkg/proxy/proxy_start.go | 2 +- pkg/service/api/discovery_service.go | 8 +-- 5 files changed, 104 insertions(+), 23 deletions(-) diff --git a/pkg/api_load/api_manager.go b/pkg/api_load/api_manager.go index af3265bfc..426e075ac 100644 --- a/pkg/api_load/api_manager.go +++ b/pkg/api_load/api_manager.go @@ -23,12 +23,14 @@ const ( ) type ApiManager struct { - mergeLock sync.Locker - limiter *time.Timer + mergeLock *sync.RWMutex + // rate limiter + limiter *time.Ticker rateLimiterTime time.Duration mergeTask chan struct{} - ApiLoadTypeMap map[ApiLoadType]ApiLoader - ads service.ApiDiscoveryService + // store apiLoaders + ApiLoadTypeMap map[ApiLoadType]ApiLoader + ads service.ApiDiscoveryService } func NewApiManager(rateLimiterTime time.Duration, ads service.ApiDiscoveryService) *ApiManager { @@ -38,13 +40,15 @@ func NewApiManager(rateLimiterTime time.Duration, ads service.ApiDiscoveryServic return &ApiManager{ ApiLoadTypeMap: make(map[ApiLoadType]ApiLoader, 8), mergeTask: make(chan struct{}, 1), - limiter: time.NewTimer(rateLimiterTime), + limiter: time.NewTicker(rateLimiterTime), rateLimiterTime: rateLimiterTime, + mergeLock: &sync.RWMutex{}, ads: ads, } } -func (al *ApiManager) AddApiLoad(config model.ApiConfig) { +// add apiLoader by ApiLoadType +func (al *ApiManager) AddApiLoader(config model.ApiConfig) { if config.File != nil { al.ApiLoadTypeMap[File] = NewFileApiLoader(WithFilePath(config.File.FileApiConfPath)) } @@ -53,14 +57,15 @@ func (al *ApiManager) AddApiLoad(config model.ApiConfig) { } } +// nolint func (al *ApiManager) GetApiLoad(apiLoadType ApiLoadType) (ApiLoader, error) { if apiLoader, ok := al.ApiLoadTypeMap[apiLoadType]; ok { return apiLoader, nil } return nil, errors.New(fmt.Sprintf("can't load apiLoader for :%s", apiLoadType)) - } +// start to load apis using apiLoaders stored in ApiLoadTypeMap func (al *ApiManager) StartLoadApi() error { for _, loader := range al.ApiLoadTypeMap { err := loader.InitLoad() @@ -70,8 +75,6 @@ func (al *ApiManager) StartLoadApi() error { } } - //al.MergeApi() - if al.limiter == nil { return errors.New("proxy won't hot load api since limiter is null.") } @@ -100,6 +103,7 @@ func (al *ApiManager) StartLoadApi() error { return nil } +// store a message to mergeTask to notify calling DoMergeApiTask func (al *ApiManager) AddMergeTask() error { select { case al.mergeTask <- struct{}{}: @@ -112,6 +116,7 @@ func (al *ApiManager) AddMergeTask() error { return nil } +// to merge apis to store in ads.Notice that limiter will limit frequency of merging. func (al *ApiManager) SelectMergeApiTask() (err error) { for { select { @@ -122,16 +127,17 @@ func (al *ApiManager) SelectMergeApiTask() (err error) { logger.Warnf("error merge api task:%v", err) } } - al.limiter.Reset(time.Second) + //al.limiter.Reset(time.Second) break default: - time.Sleep(time.Millisecond * al.rateLimiterTime / 10) + time.Sleep(al.rateLimiterTime / 10) break } } return } +// merge apis func (al *ApiManager) DoMergeApiTask() (skip bool, err error) { al.mergeLock.Lock() defer al.mergeLock.Unlock() @@ -142,8 +148,8 @@ func (al *ApiManager) DoMergeApiTask() (skip bool, err error) { skip = true return case <-al.mergeTask: - // If apiLoadType is File,then try cover it's apis using other's apis from registry center - var multiApisMerged map[string]model.Api + // If apiLoadType is File,then try covering it's apis using other's apis from registry center + multiApisMerged := make(map[string]model.Api, 8) var sortedApiLoader []int sortedApiLoaderMap := make(map[int]ApiLoadType, len(al.ApiLoadTypeMap)) for apiLoadType, loader := range al.ApiLoadTypeMap { @@ -188,6 +194,7 @@ func (al *ApiManager) DoMergeApiTask() (skip bool, err error) { } } +// add merged apis to ads func (al *ApiManager) add2ApiDiscoveryService(apis []model.Api) error { for _, api := range apis { j, _ := json.Marshal(api) @@ -200,6 +207,7 @@ func (al *ApiManager) add2ApiDiscoveryService(apis []model.Api) error { return nil } +// nolint func (al *ApiManager) buildApiID(api model.Api) string { return fmt.Sprintf("name:%s,ITypeStr:%s,OTypeStr:%s,Method:%s", api.Name, api.ITypeStr, api.OTypeStr, api.Method) diff --git a/pkg/api_load/api_manager_test.go b/pkg/api_load/api_manager_test.go index 391b04597..137637b5b 100644 --- a/pkg/api_load/api_manager_test.go +++ b/pkg/api_load/api_manager_test.go @@ -1,22 +1,90 @@ package api_load import ( - "github.com/dubbogo/dubbo-go-proxy/pkg/model" - "github.com/dubbogo/dubbo-go-proxy/pkg/service/api" + "context" + "encoding/json" + "io/ioutil" + "os" "testing" "time" ) +import ( + "github.com/dubbogo/dubbo-go-proxy/pkg/client/dubbo" + "github.com/dubbogo/dubbo-go-proxy/pkg/model" + "github.com/dubbogo/dubbo-go-proxy/pkg/service" + "github.com/dubbogo/dubbo-go-proxy/pkg/service/api" +) + +import ( + "github.com/stretchr/testify/assert" + "gopkg.in/yaml.v2" +) + func TestApiLoad_StartLoadApi(t *testing.T) { } func TestApiLoad_AddApiLoad(t *testing.T) { ads := api.NewLocalMemoryApiDiscoveryService() apiManager := NewApiManager(time.Second*5, ads) - apiManager.AddApiLoad(model.ApiConfig{ + apiManager.AddApiLoader(model.ApiConfig{ File: &model.File{ FileApiConfPath: filePath, }, }) + apiLoader, err := apiManager.GetApiLoad(File) + assert.Nil(t, err) + assert.NotNil(t, apiLoader) + +} + +func TestApiManager_StartLoadApi(t *testing.T) { + ads := api.NewLocalMemoryApiDiscoveryService() + apiManager := NewApiManager(time.Second, ads) + apiManager.AddApiLoader(model.ApiConfig{ + File: &model.File{ + FileApiConfPath: filePath, + }, + }) + err := apiManager.StartLoadApi() + assert.Nil(t, err) + go apiManager.SelectMergeApiTask() + appendApiName := "test_append_api" + appendApi := model.Api{ + Name: appendApiName, + ITypeStr: "HTTP", + OTypeStr: "REST", + Method: "GET", + Status: 1, + Metadata: map[string]dubbo.DubboMetadata{ + "dubbo": { + ApplicationName: "BDTService", + Group: "test1", + Version: "2.0.0", + Interface: "com.ikurento.user.UserProvider", + Method: "GetUser", + Types: []string{ + "java.lang.String", + }, + ClusterName: "test_dubbo", + }, + }, + } + bytes, err := yaml.Marshal([]model.Api{appendApi}) + assert.Nil(t, err) + originContent, _ := ioutil.ReadFile(filePath) + err = appendContent(filePath, bytes) + ok := assert.Nil(t, err) + if ok { + defer ioutil.WriteFile(filePath, originContent, os.ModePerm) + } + j, _ := json.Marshal(appendApi) + ctx, _ := context.WithTimeout(context.Background(), time.Second*3) + select { + case <-ctx.Done(): + _, err = apiManager.ads.GetApi(*service.NewDiscoveryRequest(j)) + assert.Nil(t, err) + return + } } diff --git a/pkg/api_load/file_api_loader_test.go b/pkg/api_load/file_api_loader_test.go index a9132e621..88342dd92 100644 --- a/pkg/api_load/file_api_loader_test.go +++ b/pkg/api_load/file_api_loader_test.go @@ -1,8 +1,6 @@ package api_load import ( - "github.com/dubbogo/dubbo-go-proxy/pkg/client/dubbo" - "github.com/dubbogo/dubbo-go-proxy/pkg/model" "io" "io/ioutil" "os" @@ -10,6 +8,11 @@ import ( "time" ) +import ( + "github.com/dubbogo/dubbo-go-proxy/pkg/client/dubbo" + "github.com/dubbogo/dubbo-go-proxy/pkg/model" +) + import ( "github.com/ghodss/yaml" "github.com/stretchr/testify/assert" @@ -98,7 +101,7 @@ func TestFileApiLoader_HotLoad(t *testing.T) { } func appendContent(filename string, content []byte) error { - fl, err := os.OpenFile(filename, os.O_APPEND|os.O_CREATE, 0644) + fl, err := os.OpenFile(filename, os.O_WRONLY|os.O_CREATE|os.O_APPEND, os.ModePerm) if err != nil { return err } diff --git a/pkg/proxy/proxy_start.go b/pkg/proxy/proxy_start.go index 72e2c9161..c82b2c3c3 100644 --- a/pkg/proxy/proxy_start.go +++ b/pkg/proxy/proxy_start.go @@ -72,7 +72,7 @@ func (p *Proxy) beforeStart() error { ads := extension.GetMustApiDiscoveryService(constant.LocalMemoryApiDiscoveryService) apiLoader := api_load.NewApiManager(time.Second, ads) - apiLoader.AddApiLoad(p.bs.DynamicResources.ApiConfig) + apiLoader.AddApiLoader(p.bs.DynamicResources.ApiConfig) err := apiLoader.StartLoadApi() if err != nil { logger.Errorf("error load api:%v", err) diff --git a/pkg/service/api/discovery_service.go b/pkg/service/api/discovery_service.go index ab4346b59..47d510b41 100644 --- a/pkg/service/api/discovery_service.go +++ b/pkg/service/api/discovery_service.go @@ -91,9 +91,11 @@ func (ads *LocalMemoryApiDiscoveryService) AddApi(request service.DiscoveryReque } func (ads *LocalMemoryApiDiscoveryService) GetApi(request service.DiscoveryRequest) (service.DiscoveryResponse, error) { - n := string(request.Body) - - if a, ok := model.CacheApi.Load(n); ok { + aj := model.NewApi() + if err := json.Unmarshal(request.Body, aj); err != nil { + return *service.EmptyDiscoveryResponse, err + } + if a, ok := model.CacheApi.Load(aj.Name); ok { return *service.NewDiscoveryResponse(a), nil } From bade80f3897040ed85225bf2ed20e244d0c327b1 Mon Sep 17 00:00:00 2001 From: shen <1292369127@qq.com> Date: Wed, 23 Sep 2020 22:09:27 +0800 Subject: [PATCH 114/227] unit test for api loader --- pkg/api_load/api_manager.go | 34 ++++++++----- pkg/api_load/api_manager_test.go | 74 ++++++++++++++++++++++++++-- pkg/api_load/file_api_loader_test.go | 9 ++-- pkg/proxy/proxy_start.go | 2 +- pkg/service/api/discovery_service.go | 8 +-- 5 files changed, 104 insertions(+), 23 deletions(-) diff --git a/pkg/api_load/api_manager.go b/pkg/api_load/api_manager.go index af3265bfc..426e075ac 100644 --- a/pkg/api_load/api_manager.go +++ b/pkg/api_load/api_manager.go @@ -23,12 +23,14 @@ const ( ) type ApiManager struct { - mergeLock sync.Locker - limiter *time.Timer + mergeLock *sync.RWMutex + // rate limiter + limiter *time.Ticker rateLimiterTime time.Duration mergeTask chan struct{} - ApiLoadTypeMap map[ApiLoadType]ApiLoader - ads service.ApiDiscoveryService + // store apiLoaders + ApiLoadTypeMap map[ApiLoadType]ApiLoader + ads service.ApiDiscoveryService } func NewApiManager(rateLimiterTime time.Duration, ads service.ApiDiscoveryService) *ApiManager { @@ -38,13 +40,15 @@ func NewApiManager(rateLimiterTime time.Duration, ads service.ApiDiscoveryServic return &ApiManager{ ApiLoadTypeMap: make(map[ApiLoadType]ApiLoader, 8), mergeTask: make(chan struct{}, 1), - limiter: time.NewTimer(rateLimiterTime), + limiter: time.NewTicker(rateLimiterTime), rateLimiterTime: rateLimiterTime, + mergeLock: &sync.RWMutex{}, ads: ads, } } -func (al *ApiManager) AddApiLoad(config model.ApiConfig) { +// add apiLoader by ApiLoadType +func (al *ApiManager) AddApiLoader(config model.ApiConfig) { if config.File != nil { al.ApiLoadTypeMap[File] = NewFileApiLoader(WithFilePath(config.File.FileApiConfPath)) } @@ -53,14 +57,15 @@ func (al *ApiManager) AddApiLoad(config model.ApiConfig) { } } +// nolint func (al *ApiManager) GetApiLoad(apiLoadType ApiLoadType) (ApiLoader, error) { if apiLoader, ok := al.ApiLoadTypeMap[apiLoadType]; ok { return apiLoader, nil } return nil, errors.New(fmt.Sprintf("can't load apiLoader for :%s", apiLoadType)) - } +// start to load apis using apiLoaders stored in ApiLoadTypeMap func (al *ApiManager) StartLoadApi() error { for _, loader := range al.ApiLoadTypeMap { err := loader.InitLoad() @@ -70,8 +75,6 @@ func (al *ApiManager) StartLoadApi() error { } } - //al.MergeApi() - if al.limiter == nil { return errors.New("proxy won't hot load api since limiter is null.") } @@ -100,6 +103,7 @@ func (al *ApiManager) StartLoadApi() error { return nil } +// store a message to mergeTask to notify calling DoMergeApiTask func (al *ApiManager) AddMergeTask() error { select { case al.mergeTask <- struct{}{}: @@ -112,6 +116,7 @@ func (al *ApiManager) AddMergeTask() error { return nil } +// to merge apis to store in ads.Notice that limiter will limit frequency of merging. func (al *ApiManager) SelectMergeApiTask() (err error) { for { select { @@ -122,16 +127,17 @@ func (al *ApiManager) SelectMergeApiTask() (err error) { logger.Warnf("error merge api task:%v", err) } } - al.limiter.Reset(time.Second) + //al.limiter.Reset(time.Second) break default: - time.Sleep(time.Millisecond * al.rateLimiterTime / 10) + time.Sleep(al.rateLimiterTime / 10) break } } return } +// merge apis func (al *ApiManager) DoMergeApiTask() (skip bool, err error) { al.mergeLock.Lock() defer al.mergeLock.Unlock() @@ -142,8 +148,8 @@ func (al *ApiManager) DoMergeApiTask() (skip bool, err error) { skip = true return case <-al.mergeTask: - // If apiLoadType is File,then try cover it's apis using other's apis from registry center - var multiApisMerged map[string]model.Api + // If apiLoadType is File,then try covering it's apis using other's apis from registry center + multiApisMerged := make(map[string]model.Api, 8) var sortedApiLoader []int sortedApiLoaderMap := make(map[int]ApiLoadType, len(al.ApiLoadTypeMap)) for apiLoadType, loader := range al.ApiLoadTypeMap { @@ -188,6 +194,7 @@ func (al *ApiManager) DoMergeApiTask() (skip bool, err error) { } } +// add merged apis to ads func (al *ApiManager) add2ApiDiscoveryService(apis []model.Api) error { for _, api := range apis { j, _ := json.Marshal(api) @@ -200,6 +207,7 @@ func (al *ApiManager) add2ApiDiscoveryService(apis []model.Api) error { return nil } +// nolint func (al *ApiManager) buildApiID(api model.Api) string { return fmt.Sprintf("name:%s,ITypeStr:%s,OTypeStr:%s,Method:%s", api.Name, api.ITypeStr, api.OTypeStr, api.Method) diff --git a/pkg/api_load/api_manager_test.go b/pkg/api_load/api_manager_test.go index 391b04597..137637b5b 100644 --- a/pkg/api_load/api_manager_test.go +++ b/pkg/api_load/api_manager_test.go @@ -1,22 +1,90 @@ package api_load import ( - "github.com/dubbogo/dubbo-go-proxy/pkg/model" - "github.com/dubbogo/dubbo-go-proxy/pkg/service/api" + "context" + "encoding/json" + "io/ioutil" + "os" "testing" "time" ) +import ( + "github.com/dubbogo/dubbo-go-proxy/pkg/client/dubbo" + "github.com/dubbogo/dubbo-go-proxy/pkg/model" + "github.com/dubbogo/dubbo-go-proxy/pkg/service" + "github.com/dubbogo/dubbo-go-proxy/pkg/service/api" +) + +import ( + "github.com/stretchr/testify/assert" + "gopkg.in/yaml.v2" +) + func TestApiLoad_StartLoadApi(t *testing.T) { } func TestApiLoad_AddApiLoad(t *testing.T) { ads := api.NewLocalMemoryApiDiscoveryService() apiManager := NewApiManager(time.Second*5, ads) - apiManager.AddApiLoad(model.ApiConfig{ + apiManager.AddApiLoader(model.ApiConfig{ File: &model.File{ FileApiConfPath: filePath, }, }) + apiLoader, err := apiManager.GetApiLoad(File) + assert.Nil(t, err) + assert.NotNil(t, apiLoader) + +} + +func TestApiManager_StartLoadApi(t *testing.T) { + ads := api.NewLocalMemoryApiDiscoveryService() + apiManager := NewApiManager(time.Second, ads) + apiManager.AddApiLoader(model.ApiConfig{ + File: &model.File{ + FileApiConfPath: filePath, + }, + }) + err := apiManager.StartLoadApi() + assert.Nil(t, err) + go apiManager.SelectMergeApiTask() + appendApiName := "test_append_api" + appendApi := model.Api{ + Name: appendApiName, + ITypeStr: "HTTP", + OTypeStr: "REST", + Method: "GET", + Status: 1, + Metadata: map[string]dubbo.DubboMetadata{ + "dubbo": { + ApplicationName: "BDTService", + Group: "test1", + Version: "2.0.0", + Interface: "com.ikurento.user.UserProvider", + Method: "GetUser", + Types: []string{ + "java.lang.String", + }, + ClusterName: "test_dubbo", + }, + }, + } + bytes, err := yaml.Marshal([]model.Api{appendApi}) + assert.Nil(t, err) + originContent, _ := ioutil.ReadFile(filePath) + err = appendContent(filePath, bytes) + ok := assert.Nil(t, err) + if ok { + defer ioutil.WriteFile(filePath, originContent, os.ModePerm) + } + j, _ := json.Marshal(appendApi) + ctx, _ := context.WithTimeout(context.Background(), time.Second*3) + select { + case <-ctx.Done(): + _, err = apiManager.ads.GetApi(*service.NewDiscoveryRequest(j)) + assert.Nil(t, err) + return + } } diff --git a/pkg/api_load/file_api_loader_test.go b/pkg/api_load/file_api_loader_test.go index a9132e621..88342dd92 100644 --- a/pkg/api_load/file_api_loader_test.go +++ b/pkg/api_load/file_api_loader_test.go @@ -1,8 +1,6 @@ package api_load import ( - "github.com/dubbogo/dubbo-go-proxy/pkg/client/dubbo" - "github.com/dubbogo/dubbo-go-proxy/pkg/model" "io" "io/ioutil" "os" @@ -10,6 +8,11 @@ import ( "time" ) +import ( + "github.com/dubbogo/dubbo-go-proxy/pkg/client/dubbo" + "github.com/dubbogo/dubbo-go-proxy/pkg/model" +) + import ( "github.com/ghodss/yaml" "github.com/stretchr/testify/assert" @@ -98,7 +101,7 @@ func TestFileApiLoader_HotLoad(t *testing.T) { } func appendContent(filename string, content []byte) error { - fl, err := os.OpenFile(filename, os.O_APPEND|os.O_CREATE, 0644) + fl, err := os.OpenFile(filename, os.O_WRONLY|os.O_CREATE|os.O_APPEND, os.ModePerm) if err != nil { return err } diff --git a/pkg/proxy/proxy_start.go b/pkg/proxy/proxy_start.go index 72e2c9161..c82b2c3c3 100644 --- a/pkg/proxy/proxy_start.go +++ b/pkg/proxy/proxy_start.go @@ -72,7 +72,7 @@ func (p *Proxy) beforeStart() error { ads := extension.GetMustApiDiscoveryService(constant.LocalMemoryApiDiscoveryService) apiLoader := api_load.NewApiManager(time.Second, ads) - apiLoader.AddApiLoad(p.bs.DynamicResources.ApiConfig) + apiLoader.AddApiLoader(p.bs.DynamicResources.ApiConfig) err := apiLoader.StartLoadApi() if err != nil { logger.Errorf("error load api:%v", err) diff --git a/pkg/service/api/discovery_service.go b/pkg/service/api/discovery_service.go index ab4346b59..47d510b41 100644 --- a/pkg/service/api/discovery_service.go +++ b/pkg/service/api/discovery_service.go @@ -91,9 +91,11 @@ func (ads *LocalMemoryApiDiscoveryService) AddApi(request service.DiscoveryReque } func (ads *LocalMemoryApiDiscoveryService) GetApi(request service.DiscoveryRequest) (service.DiscoveryResponse, error) { - n := string(request.Body) - - if a, ok := model.CacheApi.Load(n); ok { + aj := model.NewApi() + if err := json.Unmarshal(request.Body, aj); err != nil { + return *service.EmptyDiscoveryResponse, err + } + if a, ok := model.CacheApi.Load(aj.Name); ok { return *service.NewDiscoveryResponse(a), nil } From 6a6556e8c1296cd31f1f0ecbec9929857c0c9cc9 Mon Sep 17 00:00:00 2001 From: shen <1292369127@qq.com> Date: Wed, 23 Sep 2020 22:09:27 +0800 Subject: [PATCH 115/227] unit test for api loader --- pkg/api_load/api_manager.go | 34 ++++++++----- pkg/api_load/api_manager_test.go | 74 ++++++++++++++++++++++++++-- pkg/api_load/file_api_loader_test.go | 9 ++-- pkg/proxy/proxy_start.go | 2 +- pkg/service/api/discovery_service.go | 8 +-- 5 files changed, 104 insertions(+), 23 deletions(-) diff --git a/pkg/api_load/api_manager.go b/pkg/api_load/api_manager.go index af3265bfc..426e075ac 100644 --- a/pkg/api_load/api_manager.go +++ b/pkg/api_load/api_manager.go @@ -23,12 +23,14 @@ const ( ) type ApiManager struct { - mergeLock sync.Locker - limiter *time.Timer + mergeLock *sync.RWMutex + // rate limiter + limiter *time.Ticker rateLimiterTime time.Duration mergeTask chan struct{} - ApiLoadTypeMap map[ApiLoadType]ApiLoader - ads service.ApiDiscoveryService + // store apiLoaders + ApiLoadTypeMap map[ApiLoadType]ApiLoader + ads service.ApiDiscoveryService } func NewApiManager(rateLimiterTime time.Duration, ads service.ApiDiscoveryService) *ApiManager { @@ -38,13 +40,15 @@ func NewApiManager(rateLimiterTime time.Duration, ads service.ApiDiscoveryServic return &ApiManager{ ApiLoadTypeMap: make(map[ApiLoadType]ApiLoader, 8), mergeTask: make(chan struct{}, 1), - limiter: time.NewTimer(rateLimiterTime), + limiter: time.NewTicker(rateLimiterTime), rateLimiterTime: rateLimiterTime, + mergeLock: &sync.RWMutex{}, ads: ads, } } -func (al *ApiManager) AddApiLoad(config model.ApiConfig) { +// add apiLoader by ApiLoadType +func (al *ApiManager) AddApiLoader(config model.ApiConfig) { if config.File != nil { al.ApiLoadTypeMap[File] = NewFileApiLoader(WithFilePath(config.File.FileApiConfPath)) } @@ -53,14 +57,15 @@ func (al *ApiManager) AddApiLoad(config model.ApiConfig) { } } +// nolint func (al *ApiManager) GetApiLoad(apiLoadType ApiLoadType) (ApiLoader, error) { if apiLoader, ok := al.ApiLoadTypeMap[apiLoadType]; ok { return apiLoader, nil } return nil, errors.New(fmt.Sprintf("can't load apiLoader for :%s", apiLoadType)) - } +// start to load apis using apiLoaders stored in ApiLoadTypeMap func (al *ApiManager) StartLoadApi() error { for _, loader := range al.ApiLoadTypeMap { err := loader.InitLoad() @@ -70,8 +75,6 @@ func (al *ApiManager) StartLoadApi() error { } } - //al.MergeApi() - if al.limiter == nil { return errors.New("proxy won't hot load api since limiter is null.") } @@ -100,6 +103,7 @@ func (al *ApiManager) StartLoadApi() error { return nil } +// store a message to mergeTask to notify calling DoMergeApiTask func (al *ApiManager) AddMergeTask() error { select { case al.mergeTask <- struct{}{}: @@ -112,6 +116,7 @@ func (al *ApiManager) AddMergeTask() error { return nil } +// to merge apis to store in ads.Notice that limiter will limit frequency of merging. func (al *ApiManager) SelectMergeApiTask() (err error) { for { select { @@ -122,16 +127,17 @@ func (al *ApiManager) SelectMergeApiTask() (err error) { logger.Warnf("error merge api task:%v", err) } } - al.limiter.Reset(time.Second) + //al.limiter.Reset(time.Second) break default: - time.Sleep(time.Millisecond * al.rateLimiterTime / 10) + time.Sleep(al.rateLimiterTime / 10) break } } return } +// merge apis func (al *ApiManager) DoMergeApiTask() (skip bool, err error) { al.mergeLock.Lock() defer al.mergeLock.Unlock() @@ -142,8 +148,8 @@ func (al *ApiManager) DoMergeApiTask() (skip bool, err error) { skip = true return case <-al.mergeTask: - // If apiLoadType is File,then try cover it's apis using other's apis from registry center - var multiApisMerged map[string]model.Api + // If apiLoadType is File,then try covering it's apis using other's apis from registry center + multiApisMerged := make(map[string]model.Api, 8) var sortedApiLoader []int sortedApiLoaderMap := make(map[int]ApiLoadType, len(al.ApiLoadTypeMap)) for apiLoadType, loader := range al.ApiLoadTypeMap { @@ -188,6 +194,7 @@ func (al *ApiManager) DoMergeApiTask() (skip bool, err error) { } } +// add merged apis to ads func (al *ApiManager) add2ApiDiscoveryService(apis []model.Api) error { for _, api := range apis { j, _ := json.Marshal(api) @@ -200,6 +207,7 @@ func (al *ApiManager) add2ApiDiscoveryService(apis []model.Api) error { return nil } +// nolint func (al *ApiManager) buildApiID(api model.Api) string { return fmt.Sprintf("name:%s,ITypeStr:%s,OTypeStr:%s,Method:%s", api.Name, api.ITypeStr, api.OTypeStr, api.Method) diff --git a/pkg/api_load/api_manager_test.go b/pkg/api_load/api_manager_test.go index 391b04597..137637b5b 100644 --- a/pkg/api_load/api_manager_test.go +++ b/pkg/api_load/api_manager_test.go @@ -1,22 +1,90 @@ package api_load import ( - "github.com/dubbogo/dubbo-go-proxy/pkg/model" - "github.com/dubbogo/dubbo-go-proxy/pkg/service/api" + "context" + "encoding/json" + "io/ioutil" + "os" "testing" "time" ) +import ( + "github.com/dubbogo/dubbo-go-proxy/pkg/client/dubbo" + "github.com/dubbogo/dubbo-go-proxy/pkg/model" + "github.com/dubbogo/dubbo-go-proxy/pkg/service" + "github.com/dubbogo/dubbo-go-proxy/pkg/service/api" +) + +import ( + "github.com/stretchr/testify/assert" + "gopkg.in/yaml.v2" +) + func TestApiLoad_StartLoadApi(t *testing.T) { } func TestApiLoad_AddApiLoad(t *testing.T) { ads := api.NewLocalMemoryApiDiscoveryService() apiManager := NewApiManager(time.Second*5, ads) - apiManager.AddApiLoad(model.ApiConfig{ + apiManager.AddApiLoader(model.ApiConfig{ File: &model.File{ FileApiConfPath: filePath, }, }) + apiLoader, err := apiManager.GetApiLoad(File) + assert.Nil(t, err) + assert.NotNil(t, apiLoader) + +} + +func TestApiManager_StartLoadApi(t *testing.T) { + ads := api.NewLocalMemoryApiDiscoveryService() + apiManager := NewApiManager(time.Second, ads) + apiManager.AddApiLoader(model.ApiConfig{ + File: &model.File{ + FileApiConfPath: filePath, + }, + }) + err := apiManager.StartLoadApi() + assert.Nil(t, err) + go apiManager.SelectMergeApiTask() + appendApiName := "test_append_api" + appendApi := model.Api{ + Name: appendApiName, + ITypeStr: "HTTP", + OTypeStr: "REST", + Method: "GET", + Status: 1, + Metadata: map[string]dubbo.DubboMetadata{ + "dubbo": { + ApplicationName: "BDTService", + Group: "test1", + Version: "2.0.0", + Interface: "com.ikurento.user.UserProvider", + Method: "GetUser", + Types: []string{ + "java.lang.String", + }, + ClusterName: "test_dubbo", + }, + }, + } + bytes, err := yaml.Marshal([]model.Api{appendApi}) + assert.Nil(t, err) + originContent, _ := ioutil.ReadFile(filePath) + err = appendContent(filePath, bytes) + ok := assert.Nil(t, err) + if ok { + defer ioutil.WriteFile(filePath, originContent, os.ModePerm) + } + j, _ := json.Marshal(appendApi) + ctx, _ := context.WithTimeout(context.Background(), time.Second*3) + select { + case <-ctx.Done(): + _, err = apiManager.ads.GetApi(*service.NewDiscoveryRequest(j)) + assert.Nil(t, err) + return + } } diff --git a/pkg/api_load/file_api_loader_test.go b/pkg/api_load/file_api_loader_test.go index a9132e621..88342dd92 100644 --- a/pkg/api_load/file_api_loader_test.go +++ b/pkg/api_load/file_api_loader_test.go @@ -1,8 +1,6 @@ package api_load import ( - "github.com/dubbogo/dubbo-go-proxy/pkg/client/dubbo" - "github.com/dubbogo/dubbo-go-proxy/pkg/model" "io" "io/ioutil" "os" @@ -10,6 +8,11 @@ import ( "time" ) +import ( + "github.com/dubbogo/dubbo-go-proxy/pkg/client/dubbo" + "github.com/dubbogo/dubbo-go-proxy/pkg/model" +) + import ( "github.com/ghodss/yaml" "github.com/stretchr/testify/assert" @@ -98,7 +101,7 @@ func TestFileApiLoader_HotLoad(t *testing.T) { } func appendContent(filename string, content []byte) error { - fl, err := os.OpenFile(filename, os.O_APPEND|os.O_CREATE, 0644) + fl, err := os.OpenFile(filename, os.O_WRONLY|os.O_CREATE|os.O_APPEND, os.ModePerm) if err != nil { return err } diff --git a/pkg/proxy/proxy_start.go b/pkg/proxy/proxy_start.go index 72e2c9161..c82b2c3c3 100644 --- a/pkg/proxy/proxy_start.go +++ b/pkg/proxy/proxy_start.go @@ -72,7 +72,7 @@ func (p *Proxy) beforeStart() error { ads := extension.GetMustApiDiscoveryService(constant.LocalMemoryApiDiscoveryService) apiLoader := api_load.NewApiManager(time.Second, ads) - apiLoader.AddApiLoad(p.bs.DynamicResources.ApiConfig) + apiLoader.AddApiLoader(p.bs.DynamicResources.ApiConfig) err := apiLoader.StartLoadApi() if err != nil { logger.Errorf("error load api:%v", err) diff --git a/pkg/service/api/discovery_service.go b/pkg/service/api/discovery_service.go index ab4346b59..47d510b41 100644 --- a/pkg/service/api/discovery_service.go +++ b/pkg/service/api/discovery_service.go @@ -91,9 +91,11 @@ func (ads *LocalMemoryApiDiscoveryService) AddApi(request service.DiscoveryReque } func (ads *LocalMemoryApiDiscoveryService) GetApi(request service.DiscoveryRequest) (service.DiscoveryResponse, error) { - n := string(request.Body) - - if a, ok := model.CacheApi.Load(n); ok { + aj := model.NewApi() + if err := json.Unmarshal(request.Body, aj); err != nil { + return *service.EmptyDiscoveryResponse, err + } + if a, ok := model.CacheApi.Load(aj.Name); ok { return *service.NewDiscoveryResponse(a), nil } From a52ad2658d2ac0d1cf1255c8c39af42aa95a1a9f Mon Sep 17 00:00:00 2001 From: shen <1292369127@qq.com> Date: Wed, 23 Sep 2020 22:09:27 +0800 Subject: [PATCH 116/227] unit test for api loader --- pkg/api_load/api_manager.go | 34 ++++++++----- pkg/api_load/api_manager_test.go | 74 ++++++++++++++++++++++++++-- pkg/api_load/file_api_loader_test.go | 9 ++-- pkg/proxy/proxy_start.go | 2 +- pkg/service/api/discovery_service.go | 8 +-- 5 files changed, 104 insertions(+), 23 deletions(-) diff --git a/pkg/api_load/api_manager.go b/pkg/api_load/api_manager.go index af3265bfc..426e075ac 100644 --- a/pkg/api_load/api_manager.go +++ b/pkg/api_load/api_manager.go @@ -23,12 +23,14 @@ const ( ) type ApiManager struct { - mergeLock sync.Locker - limiter *time.Timer + mergeLock *sync.RWMutex + // rate limiter + limiter *time.Ticker rateLimiterTime time.Duration mergeTask chan struct{} - ApiLoadTypeMap map[ApiLoadType]ApiLoader - ads service.ApiDiscoveryService + // store apiLoaders + ApiLoadTypeMap map[ApiLoadType]ApiLoader + ads service.ApiDiscoveryService } func NewApiManager(rateLimiterTime time.Duration, ads service.ApiDiscoveryService) *ApiManager { @@ -38,13 +40,15 @@ func NewApiManager(rateLimiterTime time.Duration, ads service.ApiDiscoveryServic return &ApiManager{ ApiLoadTypeMap: make(map[ApiLoadType]ApiLoader, 8), mergeTask: make(chan struct{}, 1), - limiter: time.NewTimer(rateLimiterTime), + limiter: time.NewTicker(rateLimiterTime), rateLimiterTime: rateLimiterTime, + mergeLock: &sync.RWMutex{}, ads: ads, } } -func (al *ApiManager) AddApiLoad(config model.ApiConfig) { +// add apiLoader by ApiLoadType +func (al *ApiManager) AddApiLoader(config model.ApiConfig) { if config.File != nil { al.ApiLoadTypeMap[File] = NewFileApiLoader(WithFilePath(config.File.FileApiConfPath)) } @@ -53,14 +57,15 @@ func (al *ApiManager) AddApiLoad(config model.ApiConfig) { } } +// nolint func (al *ApiManager) GetApiLoad(apiLoadType ApiLoadType) (ApiLoader, error) { if apiLoader, ok := al.ApiLoadTypeMap[apiLoadType]; ok { return apiLoader, nil } return nil, errors.New(fmt.Sprintf("can't load apiLoader for :%s", apiLoadType)) - } +// start to load apis using apiLoaders stored in ApiLoadTypeMap func (al *ApiManager) StartLoadApi() error { for _, loader := range al.ApiLoadTypeMap { err := loader.InitLoad() @@ -70,8 +75,6 @@ func (al *ApiManager) StartLoadApi() error { } } - //al.MergeApi() - if al.limiter == nil { return errors.New("proxy won't hot load api since limiter is null.") } @@ -100,6 +103,7 @@ func (al *ApiManager) StartLoadApi() error { return nil } +// store a message to mergeTask to notify calling DoMergeApiTask func (al *ApiManager) AddMergeTask() error { select { case al.mergeTask <- struct{}{}: @@ -112,6 +116,7 @@ func (al *ApiManager) AddMergeTask() error { return nil } +// to merge apis to store in ads.Notice that limiter will limit frequency of merging. func (al *ApiManager) SelectMergeApiTask() (err error) { for { select { @@ -122,16 +127,17 @@ func (al *ApiManager) SelectMergeApiTask() (err error) { logger.Warnf("error merge api task:%v", err) } } - al.limiter.Reset(time.Second) + //al.limiter.Reset(time.Second) break default: - time.Sleep(time.Millisecond * al.rateLimiterTime / 10) + time.Sleep(al.rateLimiterTime / 10) break } } return } +// merge apis func (al *ApiManager) DoMergeApiTask() (skip bool, err error) { al.mergeLock.Lock() defer al.mergeLock.Unlock() @@ -142,8 +148,8 @@ func (al *ApiManager) DoMergeApiTask() (skip bool, err error) { skip = true return case <-al.mergeTask: - // If apiLoadType is File,then try cover it's apis using other's apis from registry center - var multiApisMerged map[string]model.Api + // If apiLoadType is File,then try covering it's apis using other's apis from registry center + multiApisMerged := make(map[string]model.Api, 8) var sortedApiLoader []int sortedApiLoaderMap := make(map[int]ApiLoadType, len(al.ApiLoadTypeMap)) for apiLoadType, loader := range al.ApiLoadTypeMap { @@ -188,6 +194,7 @@ func (al *ApiManager) DoMergeApiTask() (skip bool, err error) { } } +// add merged apis to ads func (al *ApiManager) add2ApiDiscoveryService(apis []model.Api) error { for _, api := range apis { j, _ := json.Marshal(api) @@ -200,6 +207,7 @@ func (al *ApiManager) add2ApiDiscoveryService(apis []model.Api) error { return nil } +// nolint func (al *ApiManager) buildApiID(api model.Api) string { return fmt.Sprintf("name:%s,ITypeStr:%s,OTypeStr:%s,Method:%s", api.Name, api.ITypeStr, api.OTypeStr, api.Method) diff --git a/pkg/api_load/api_manager_test.go b/pkg/api_load/api_manager_test.go index 391b04597..137637b5b 100644 --- a/pkg/api_load/api_manager_test.go +++ b/pkg/api_load/api_manager_test.go @@ -1,22 +1,90 @@ package api_load import ( - "github.com/dubbogo/dubbo-go-proxy/pkg/model" - "github.com/dubbogo/dubbo-go-proxy/pkg/service/api" + "context" + "encoding/json" + "io/ioutil" + "os" "testing" "time" ) +import ( + "github.com/dubbogo/dubbo-go-proxy/pkg/client/dubbo" + "github.com/dubbogo/dubbo-go-proxy/pkg/model" + "github.com/dubbogo/dubbo-go-proxy/pkg/service" + "github.com/dubbogo/dubbo-go-proxy/pkg/service/api" +) + +import ( + "github.com/stretchr/testify/assert" + "gopkg.in/yaml.v2" +) + func TestApiLoad_StartLoadApi(t *testing.T) { } func TestApiLoad_AddApiLoad(t *testing.T) { ads := api.NewLocalMemoryApiDiscoveryService() apiManager := NewApiManager(time.Second*5, ads) - apiManager.AddApiLoad(model.ApiConfig{ + apiManager.AddApiLoader(model.ApiConfig{ File: &model.File{ FileApiConfPath: filePath, }, }) + apiLoader, err := apiManager.GetApiLoad(File) + assert.Nil(t, err) + assert.NotNil(t, apiLoader) + +} + +func TestApiManager_StartLoadApi(t *testing.T) { + ads := api.NewLocalMemoryApiDiscoveryService() + apiManager := NewApiManager(time.Second, ads) + apiManager.AddApiLoader(model.ApiConfig{ + File: &model.File{ + FileApiConfPath: filePath, + }, + }) + err := apiManager.StartLoadApi() + assert.Nil(t, err) + go apiManager.SelectMergeApiTask() + appendApiName := "test_append_api" + appendApi := model.Api{ + Name: appendApiName, + ITypeStr: "HTTP", + OTypeStr: "REST", + Method: "GET", + Status: 1, + Metadata: map[string]dubbo.DubboMetadata{ + "dubbo": { + ApplicationName: "BDTService", + Group: "test1", + Version: "2.0.0", + Interface: "com.ikurento.user.UserProvider", + Method: "GetUser", + Types: []string{ + "java.lang.String", + }, + ClusterName: "test_dubbo", + }, + }, + } + bytes, err := yaml.Marshal([]model.Api{appendApi}) + assert.Nil(t, err) + originContent, _ := ioutil.ReadFile(filePath) + err = appendContent(filePath, bytes) + ok := assert.Nil(t, err) + if ok { + defer ioutil.WriteFile(filePath, originContent, os.ModePerm) + } + j, _ := json.Marshal(appendApi) + ctx, _ := context.WithTimeout(context.Background(), time.Second*3) + select { + case <-ctx.Done(): + _, err = apiManager.ads.GetApi(*service.NewDiscoveryRequest(j)) + assert.Nil(t, err) + return + } } diff --git a/pkg/api_load/file_api_loader_test.go b/pkg/api_load/file_api_loader_test.go index a9132e621..88342dd92 100644 --- a/pkg/api_load/file_api_loader_test.go +++ b/pkg/api_load/file_api_loader_test.go @@ -1,8 +1,6 @@ package api_load import ( - "github.com/dubbogo/dubbo-go-proxy/pkg/client/dubbo" - "github.com/dubbogo/dubbo-go-proxy/pkg/model" "io" "io/ioutil" "os" @@ -10,6 +8,11 @@ import ( "time" ) +import ( + "github.com/dubbogo/dubbo-go-proxy/pkg/client/dubbo" + "github.com/dubbogo/dubbo-go-proxy/pkg/model" +) + import ( "github.com/ghodss/yaml" "github.com/stretchr/testify/assert" @@ -98,7 +101,7 @@ func TestFileApiLoader_HotLoad(t *testing.T) { } func appendContent(filename string, content []byte) error { - fl, err := os.OpenFile(filename, os.O_APPEND|os.O_CREATE, 0644) + fl, err := os.OpenFile(filename, os.O_WRONLY|os.O_CREATE|os.O_APPEND, os.ModePerm) if err != nil { return err } diff --git a/pkg/proxy/proxy_start.go b/pkg/proxy/proxy_start.go index 72e2c9161..c82b2c3c3 100644 --- a/pkg/proxy/proxy_start.go +++ b/pkg/proxy/proxy_start.go @@ -72,7 +72,7 @@ func (p *Proxy) beforeStart() error { ads := extension.GetMustApiDiscoveryService(constant.LocalMemoryApiDiscoveryService) apiLoader := api_load.NewApiManager(time.Second, ads) - apiLoader.AddApiLoad(p.bs.DynamicResources.ApiConfig) + apiLoader.AddApiLoader(p.bs.DynamicResources.ApiConfig) err := apiLoader.StartLoadApi() if err != nil { logger.Errorf("error load api:%v", err) diff --git a/pkg/service/api/discovery_service.go b/pkg/service/api/discovery_service.go index ab4346b59..47d510b41 100644 --- a/pkg/service/api/discovery_service.go +++ b/pkg/service/api/discovery_service.go @@ -91,9 +91,11 @@ func (ads *LocalMemoryApiDiscoveryService) AddApi(request service.DiscoveryReque } func (ads *LocalMemoryApiDiscoveryService) GetApi(request service.DiscoveryRequest) (service.DiscoveryResponse, error) { - n := string(request.Body) - - if a, ok := model.CacheApi.Load(n); ok { + aj := model.NewApi() + if err := json.Unmarshal(request.Body, aj); err != nil { + return *service.EmptyDiscoveryResponse, err + } + if a, ok := model.CacheApi.Load(aj.Name); ok { return *service.NewDiscoveryResponse(a), nil } From 02c71fb78515f24b876acdbf97c21f4f1a124f7a Mon Sep 17 00:00:00 2001 From: shen <1292369127@qq.com> Date: Wed, 23 Sep 2020 22:12:18 +0800 Subject: [PATCH 117/227] add license --- pkg/api_load/api_loader.go | 16 ++++++++++++++++ pkg/api_load/api_manager.go | 16 ++++++++++++++++ pkg/api_load/api_manager_test.go | 16 ++++++++++++++++ pkg/api_load/file_api_loader.go | 16 ++++++++++++++++ pkg/api_load/file_api_loader_test.go | 16 ++++++++++++++++ pkg/api_load/nacos_api_loader.go | 16 ++++++++++++++++ 6 files changed, 96 insertions(+) diff --git a/pkg/api_load/api_loader.go b/pkg/api_load/api_loader.go index 4d4929de1..740c7c83d 100644 --- a/pkg/api_load/api_loader.go +++ b/pkg/api_load/api_loader.go @@ -1,3 +1,19 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + */ package api_load import "github.com/dubbogo/dubbo-go-proxy/pkg/model" diff --git a/pkg/api_load/api_manager.go b/pkg/api_load/api_manager.go index 426e075ac..4dcf8976e 100644 --- a/pkg/api_load/api_manager.go +++ b/pkg/api_load/api_manager.go @@ -1,3 +1,19 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + */ package api_load import ( diff --git a/pkg/api_load/api_manager_test.go b/pkg/api_load/api_manager_test.go index 137637b5b..012c89289 100644 --- a/pkg/api_load/api_manager_test.go +++ b/pkg/api_load/api_manager_test.go @@ -1,3 +1,19 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + */ package api_load import ( diff --git a/pkg/api_load/file_api_loader.go b/pkg/api_load/file_api_loader.go index 1fb70eaa6..6d5e57dd7 100644 --- a/pkg/api_load/file_api_loader.go +++ b/pkg/api_load/file_api_loader.go @@ -1,3 +1,19 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + */ package api_load import ( diff --git a/pkg/api_load/file_api_loader_test.go b/pkg/api_load/file_api_loader_test.go index 88342dd92..6c85143a3 100644 --- a/pkg/api_load/file_api_loader_test.go +++ b/pkg/api_load/file_api_loader_test.go @@ -1,3 +1,19 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + */ package api_load import ( diff --git a/pkg/api_load/nacos_api_loader.go b/pkg/api_load/nacos_api_loader.go index 04c8aad5c..c6e0e3cf7 100644 --- a/pkg/api_load/nacos_api_loader.go +++ b/pkg/api_load/nacos_api_loader.go @@ -1,3 +1,19 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + */ package api_load import "github.com/dubbogo/dubbo-go-proxy/pkg/model" From 541d393e07e0f16afa41e597b9df2fa6f9fafa76 Mon Sep 17 00:00:00 2001 From: shen <1292369127@qq.com> Date: Wed, 23 Sep 2020 22:12:18 +0800 Subject: [PATCH 118/227] add license --- pkg/api_load/api_loader.go | 16 ++++++++++++++++ pkg/api_load/api_manager.go | 16 ++++++++++++++++ pkg/api_load/api_manager_test.go | 16 ++++++++++++++++ pkg/api_load/file_api_loader.go | 16 ++++++++++++++++ pkg/api_load/file_api_loader_test.go | 16 ++++++++++++++++ pkg/api_load/nacos_api_loader.go | 16 ++++++++++++++++ 6 files changed, 96 insertions(+) diff --git a/pkg/api_load/api_loader.go b/pkg/api_load/api_loader.go index 4d4929de1..740c7c83d 100644 --- a/pkg/api_load/api_loader.go +++ b/pkg/api_load/api_loader.go @@ -1,3 +1,19 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + */ package api_load import "github.com/dubbogo/dubbo-go-proxy/pkg/model" diff --git a/pkg/api_load/api_manager.go b/pkg/api_load/api_manager.go index 426e075ac..4dcf8976e 100644 --- a/pkg/api_load/api_manager.go +++ b/pkg/api_load/api_manager.go @@ -1,3 +1,19 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + */ package api_load import ( diff --git a/pkg/api_load/api_manager_test.go b/pkg/api_load/api_manager_test.go index 137637b5b..012c89289 100644 --- a/pkg/api_load/api_manager_test.go +++ b/pkg/api_load/api_manager_test.go @@ -1,3 +1,19 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + */ package api_load import ( diff --git a/pkg/api_load/file_api_loader.go b/pkg/api_load/file_api_loader.go index 1fb70eaa6..6d5e57dd7 100644 --- a/pkg/api_load/file_api_loader.go +++ b/pkg/api_load/file_api_loader.go @@ -1,3 +1,19 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + */ package api_load import ( diff --git a/pkg/api_load/file_api_loader_test.go b/pkg/api_load/file_api_loader_test.go index 88342dd92..6c85143a3 100644 --- a/pkg/api_load/file_api_loader_test.go +++ b/pkg/api_load/file_api_loader_test.go @@ -1,3 +1,19 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + */ package api_load import ( diff --git a/pkg/api_load/nacos_api_loader.go b/pkg/api_load/nacos_api_loader.go index 04c8aad5c..c6e0e3cf7 100644 --- a/pkg/api_load/nacos_api_loader.go +++ b/pkg/api_load/nacos_api_loader.go @@ -1,3 +1,19 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + */ package api_load import "github.com/dubbogo/dubbo-go-proxy/pkg/model" From 01c4bfb28e2f4dfbf1f6755b47ad2c777173e379 Mon Sep 17 00:00:00 2001 From: shen <1292369127@qq.com> Date: Wed, 23 Sep 2020 22:12:18 +0800 Subject: [PATCH 119/227] add license --- pkg/api_load/api_loader.go | 16 ++++++++++++++++ pkg/api_load/api_manager.go | 16 ++++++++++++++++ pkg/api_load/api_manager_test.go | 16 ++++++++++++++++ pkg/api_load/file_api_loader.go | 16 ++++++++++++++++ pkg/api_load/file_api_loader_test.go | 16 ++++++++++++++++ pkg/api_load/nacos_api_loader.go | 16 ++++++++++++++++ 6 files changed, 96 insertions(+) diff --git a/pkg/api_load/api_loader.go b/pkg/api_load/api_loader.go index 4d4929de1..740c7c83d 100644 --- a/pkg/api_load/api_loader.go +++ b/pkg/api_load/api_loader.go @@ -1,3 +1,19 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + */ package api_load import "github.com/dubbogo/dubbo-go-proxy/pkg/model" diff --git a/pkg/api_load/api_manager.go b/pkg/api_load/api_manager.go index 426e075ac..4dcf8976e 100644 --- a/pkg/api_load/api_manager.go +++ b/pkg/api_load/api_manager.go @@ -1,3 +1,19 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + */ package api_load import ( diff --git a/pkg/api_load/api_manager_test.go b/pkg/api_load/api_manager_test.go index 137637b5b..012c89289 100644 --- a/pkg/api_load/api_manager_test.go +++ b/pkg/api_load/api_manager_test.go @@ -1,3 +1,19 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + */ package api_load import ( diff --git a/pkg/api_load/file_api_loader.go b/pkg/api_load/file_api_loader.go index 1fb70eaa6..6d5e57dd7 100644 --- a/pkg/api_load/file_api_loader.go +++ b/pkg/api_load/file_api_loader.go @@ -1,3 +1,19 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + */ package api_load import ( diff --git a/pkg/api_load/file_api_loader_test.go b/pkg/api_load/file_api_loader_test.go index 88342dd92..6c85143a3 100644 --- a/pkg/api_load/file_api_loader_test.go +++ b/pkg/api_load/file_api_loader_test.go @@ -1,3 +1,19 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + */ package api_load import ( diff --git a/pkg/api_load/nacos_api_loader.go b/pkg/api_load/nacos_api_loader.go index 04c8aad5c..c6e0e3cf7 100644 --- a/pkg/api_load/nacos_api_loader.go +++ b/pkg/api_load/nacos_api_loader.go @@ -1,3 +1,19 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + */ package api_load import "github.com/dubbogo/dubbo-go-proxy/pkg/model" From 87f9791b3e9ac789c6f71bed47b00a100958b06b Mon Sep 17 00:00:00 2001 From: shen <1292369127@qq.com> Date: Wed, 23 Sep 2020 22:12:18 +0800 Subject: [PATCH 120/227] add license --- pkg/api_load/api_loader.go | 16 ++++++++++++++++ pkg/api_load/api_manager.go | 16 ++++++++++++++++ pkg/api_load/api_manager_test.go | 16 ++++++++++++++++ pkg/api_load/file_api_loader.go | 16 ++++++++++++++++ pkg/api_load/file_api_loader_test.go | 16 ++++++++++++++++ pkg/api_load/nacos_api_loader.go | 16 ++++++++++++++++ 6 files changed, 96 insertions(+) diff --git a/pkg/api_load/api_loader.go b/pkg/api_load/api_loader.go index 4d4929de1..740c7c83d 100644 --- a/pkg/api_load/api_loader.go +++ b/pkg/api_load/api_loader.go @@ -1,3 +1,19 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + */ package api_load import "github.com/dubbogo/dubbo-go-proxy/pkg/model" diff --git a/pkg/api_load/api_manager.go b/pkg/api_load/api_manager.go index 426e075ac..4dcf8976e 100644 --- a/pkg/api_load/api_manager.go +++ b/pkg/api_load/api_manager.go @@ -1,3 +1,19 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + */ package api_load import ( diff --git a/pkg/api_load/api_manager_test.go b/pkg/api_load/api_manager_test.go index 137637b5b..012c89289 100644 --- a/pkg/api_load/api_manager_test.go +++ b/pkg/api_load/api_manager_test.go @@ -1,3 +1,19 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + */ package api_load import ( diff --git a/pkg/api_load/file_api_loader.go b/pkg/api_load/file_api_loader.go index 1fb70eaa6..6d5e57dd7 100644 --- a/pkg/api_load/file_api_loader.go +++ b/pkg/api_load/file_api_loader.go @@ -1,3 +1,19 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + */ package api_load import ( diff --git a/pkg/api_load/file_api_loader_test.go b/pkg/api_load/file_api_loader_test.go index 88342dd92..6c85143a3 100644 --- a/pkg/api_load/file_api_loader_test.go +++ b/pkg/api_load/file_api_loader_test.go @@ -1,3 +1,19 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + */ package api_load import ( diff --git a/pkg/api_load/nacos_api_loader.go b/pkg/api_load/nacos_api_loader.go index 04c8aad5c..c6e0e3cf7 100644 --- a/pkg/api_load/nacos_api_loader.go +++ b/pkg/api_load/nacos_api_loader.go @@ -1,3 +1,19 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + */ package api_load import "github.com/dubbogo/dubbo-go-proxy/pkg/model" From ead7e91de57fa69fea55f73a9abcb9e1ea185848 Mon Sep 17 00:00:00 2001 From: xiaoliu <18721825717@163.com> Date: Thu, 24 Sep 2020 21:22:57 +0800 Subject: [PATCH 121/227] add pprof --- configs/conf.yaml | 3 + go.mod | 2 +- go.sum | 716 -------------------------------------- pkg/config/conf_test.yaml | 3 + pkg/model/bootstrap.go | 6 + pkg/model/pprof.go | 23 ++ pkg/proxy/proxy_start.go | 5 + 7 files changed, 41 insertions(+), 717 deletions(-) delete mode 100644 go.sum create mode 100644 pkg/model/pprof.go diff --git a/configs/conf.yaml b/configs/conf.yaml index 8a8ebc993..58826d80f 100644 --- a/configs/conf.yaml +++ b/configs/conf.yaml @@ -47,3 +47,6 @@ static_resources: type: "EDS" lb_policy: "RoundRobin" connect_timeout: "5s" + pprofConf: + enable: true + addr: "0.0.0.0:6060" \ No newline at end of file diff --git a/go.mod b/go.mod index c0782e824..2129b0bd4 100644 --- a/go.mod +++ b/go.mod @@ -11,4 +11,4 @@ require ( github.com/urfave/cli v1.22.4 go.uber.org/zap v1.15.0 gopkg.in/yaml.v2 v2.2.8 -) \ No newline at end of file +) diff --git a/go.sum b/go.sum deleted file mode 100644 index 4ffe74917..000000000 --- a/go.sum +++ /dev/null @@ -1,716 +0,0 @@ -cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= -cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= -cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU= -cloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU= -cloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY= -cloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc= -cloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0= -cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o= -cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= -cloud.google.com/go/firestore v1.1.0/go.mod h1:ulACoGHTpvq5r8rxGJ4ddJZBZqakUQqClKRT5SZwBmk= -cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I= -cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw= -dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= -github.com/Azure/azure-sdk-for-go v40.3.0+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc= -github.com/Azure/go-autorest/autorest v0.9.0/go.mod h1:xyHB1BMZT0cuDHU7I0+g046+BFDTQ8rEZB0s4Yfa6bI= -github.com/Azure/go-autorest/autorest v0.9.3/go.mod h1:GsRuLYvwzLjjjRoWEIyMUaYq8GNUx2nRB378IPt/1p0= -github.com/Azure/go-autorest/autorest v0.10.0/go.mod h1:/FALq9T/kS7b5J5qsQ+RSTUdAmGFqi0vUdVNNx8q630= -github.com/Azure/go-autorest/autorest/adal v0.5.0/go.mod h1:8Z9fGy2MpX0PvDjB1pEgQTmVqjGhiHBW7RJJEciWzS0= -github.com/Azure/go-autorest/autorest/adal v0.8.0/go.mod h1:Z6vX6WXXuyieHAXwMj0S6HY6e6wcHn37qQMBQlvY3lc= -github.com/Azure/go-autorest/autorest/adal v0.8.1/go.mod h1:ZjhuQClTqx435SRJ2iMlOxPYt3d2C/T/7TiQCVZSn3Q= -github.com/Azure/go-autorest/autorest/adal v0.8.2/go.mod h1:ZjhuQClTqx435SRJ2iMlOxPYt3d2C/T/7TiQCVZSn3Q= -github.com/Azure/go-autorest/autorest/azure/auth v0.4.2/go.mod h1:90gmfKdlmKgfjUpnCEpOJzsUEjrWDSLwHIG73tSXddM= -github.com/Azure/go-autorest/autorest/azure/cli v0.3.1/go.mod h1:ZG5p860J94/0kI9mNJVoIoLgXcirM2gF5i2kWloofxw= -github.com/Azure/go-autorest/autorest/date v0.1.0/go.mod h1:plvfp3oPSKwf2DNjlBjWF/7vwR+cUD/ELuzDCXwHUVA= -github.com/Azure/go-autorest/autorest/date v0.2.0/go.mod h1:vcORJHLJEh643/Ioh9+vPmf1Ij9AEBM5FuBIXLmIy0g= -github.com/Azure/go-autorest/autorest/mocks v0.1.0/go.mod h1:OTyCOPRA2IgIlWxVYxBee2F5Gr4kF2zd2J5cFRaIDN0= -github.com/Azure/go-autorest/autorest/mocks v0.2.0/go.mod h1:OTyCOPRA2IgIlWxVYxBee2F5Gr4kF2zd2J5cFRaIDN0= -github.com/Azure/go-autorest/autorest/mocks v0.3.0/go.mod h1:a8FDP3DYzQ4RYfVAxAN3SVSiiO77gL2j2ronKKP0syM= -github.com/Azure/go-autorest/autorest/to v0.3.0/go.mod h1:MgwOyqaIuKdG4TL/2ywSsIWKAfJfgHDo8ObuUk3t5sA= -github.com/Azure/go-autorest/autorest/validation v0.2.0/go.mod h1:3EEqHnBxQGHXRYq3HT1WyXAvT7LLY3tl70hw6tQIbjI= -github.com/Azure/go-autorest/logger v0.1.0/go.mod h1:oExouG+K6PryycPJfVSxi/koC6LSNgds39diKLz7Vrc= -github.com/Azure/go-autorest/tracing v0.5.0/go.mod h1:r/s2XiOKccPW3HrqB+W0TQzfbtp2fGCgRFtBroKn4Dk= -github.com/BurntSushi/toml v0.3.1 h1:WXkYYl6Yr3qBf1K79EBnL4mak0OimBfB0XUf9Vl28OQ= -github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= -github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= -github.com/DataDog/datadog-go v2.2.0+incompatible/go.mod h1:LButxg5PwREeZtORoXG3tL4fMGNddJ+vMq1mwgfaqoQ= -github.com/DataDog/datadog-go v3.2.0+incompatible/go.mod h1:LButxg5PwREeZtORoXG3tL4fMGNddJ+vMq1mwgfaqoQ= -github.com/Microsoft/go-winio v0.4.3/go.mod h1:VhR8bwka0BXejwEJY73c50VrPtXAaKcyvVC4A4RozmA= -github.com/Microsoft/go-winio v0.4.13/go.mod h1:qXqCSQ3Xa7+6tgxaGTIe4Kpcdsi+P8jBhyzoq1bpyYA= -github.com/NYTimes/gziphandler v0.0.0-20170623195520-56545f4a5d46/go.mod h1:3wb06e3pkSAbeQ52E9H9iFoQsEEwGN64994WTCIhntQ= -github.com/NYTimes/gziphandler v1.0.1/go.mod h1:3wb06e3pkSAbeQ52E9H9iFoQsEEwGN64994WTCIhntQ= -github.com/NYTimes/gziphandler v1.1.1/go.mod h1:n/CVRwUEOgIxrgPvAQhUUr9oeUtvrhMomdKFjzJNB0c= -github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= -github.com/PuerkitoBio/purell v1.0.0/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= -github.com/PuerkitoBio/urlesc v0.0.0-20160726150825-5bd2802263f2/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE= -github.com/StackExchange/wmi v0.0.0-20180116203802-5d049714c4a6/go.mod h1:3eOhrUMpNV+6aFIbp5/iudMxNCF27Vw2OZgy4xEx0Fg= -github.com/Workiva/go-datastructures v1.0.50 h1:slDmfW6KCHcC7U+LP3DDBbm4fqTwZGn1beOFPfGaLvo= -github.com/Workiva/go-datastructures v1.0.50/go.mod h1:Z+F2Rca0qCsVYDS8z7bAGm8f3UkzuWYS/oBZz5a7VVA= -github.com/abdullin/seq v0.0.0-20160510034733-d5467c17e7af/go.mod h1:5Jv4cbFiHJMsVxt52+i0Ha45fjshj6wxYr1r19tB9bw= -github.com/afex/hystrix-go v0.0.0-20180502004556-fa1af6a1f4f5 h1:rFw4nCn9iMW+Vajsk51NtYIcwSTkXr+JGrMd36kTDJw= -github.com/afex/hystrix-go v0.0.0-20180502004556-fa1af6a1f4f5/go.mod h1:SkGFH1ia65gfNATL8TAiHDNxPzPdmEL5uirI2Uyuz6c= -github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= -github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= -github.com/aliyun/alibaba-cloud-sdk-go v1.61.18/go.mod h1:v8ESoHo4SyHmuB4b1tJqDHxfTGEciD+yhvOU/5s1Rfk= -github.com/apache/dubbo-getty v1.3.10 h1:ys5mwjPdxG/KwkPjS6EI0RzQtU6p6FCPoKpaFEzpAL0= -github.com/apache/dubbo-getty v1.3.10/go.mod h1:x6rraK01BL5C7jUM2fPl5KMkAxLVIx54ZB8/XEOik9Y= -github.com/apache/dubbo-go v1.5.1 h1:hYktTWnMJdzwY0NkvSqJfOERkwFApZ3mH/tQBLVGO34= -github.com/apache/dubbo-go v1.5.1/go.mod h1:lxwgtF+27mSFQsSrBLaVbdQpwCp+pBN/mHP4w4/N2Qc= -github.com/apache/dubbo-go-hessian2 v1.6.2 h1:i7F5GjVaUatLQz1x9vUmmSIFj49L8J6rVICdF6xw4qw= -github.com/apache/dubbo-go-hessian2 v1.6.2/go.mod h1:7rEw9guWABQa6Aqb8HeZcsYPHsOS7XT1qtJvkmI6c5w= -github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o= -github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8= -github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY= -github.com/armon/go-metrics v0.0.0-20190430140413-ec5e00d3c878/go.mod h1:3AMJUQhVx52RsWOnlkpikZr01T/yAVN2gn0861vByNg= -github.com/armon/go-metrics v0.3.0/go.mod h1:zXjbSimjXTd7vOpY8B0/2LpvNvDoXBuplAD+gJD3GYs= -github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= -github.com/armon/go-radix v1.0.0/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= -github.com/aws/aws-sdk-go v1.25.41/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= -github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= -github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= -github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= -github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= -github.com/bketelsen/crypt v0.0.3-0.20200106085610-5cbc8cc4026c/go.mod h1:MKsuJmJgSg28kpZDP6UIiPt0e0Oz0kqKNGyRaWEPv84= -github.com/boltdb/bolt v1.3.1/go.mod h1:clJnj/oiGkjum5o1McbSZDSLxVThjynRyGBgiAx27Ps= -github.com/buger/jsonparser v0.0.0-20181115193947-bf1c66bbce23/go.mod h1:bbYlZJ7hK1yFx9hf58LP0zeX7UjIGs20ufpu3evjr+s= -github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= -github.com/circonus-labs/circonus-gometrics v2.3.1+incompatible/go.mod h1:nmEj6Dob7S7YxXgwXpfOuvO54S+tGdZdw9fuRZt25Ag= -github.com/circonus-labs/circonusllhist v0.1.3/go.mod h1:kMXHVDlOchFAehlya5ePtbp5jckzBHf4XRpQvBOLI+I= -github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= -github.com/cockroachdb/apd v1.1.0/go.mod h1:8Sl8LxpKi29FqWXR16WEFZRNSz3SoPzUzeMeY4+DwBQ= -github.com/coredns/coredns v1.1.2/go.mod h1:zASH/MVDgR6XZTbxvOnsZfffS+31vg6Ackf/wo1+AM0= -github.com/coreos/bbolt v1.3.2/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk= -github.com/coreos/bbolt v1.3.3/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk= -github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= -github.com/coreos/etcd v3.3.13+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= -github.com/coreos/go-etcd v2.0.0+incompatible/go.mod h1:Jez6KQU2B/sWsbdaef3ED8NzMklzPG4d5KIOhIy30Tk= -github.com/coreos/go-oidc v2.1.0+incompatible/go.mod h1:CgnwVTmzoESiwO9qyAFEMiHoZ1nMCKZlZ9V6mm3/LKc= -github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= -github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= -github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= -github.com/coreos/go-systemd v0.0.0-20190719114852-fd7a80b32e1f/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= -github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= -github.com/cpuguy83/go-md2man v1.0.10 h1:BSKMNlYxDvnunlTymqtgONjNnaRV1sTpcovwwjF22jk= -github.com/cpuguy83/go-md2man v1.0.10/go.mod h1:SmD6nW6nTyfqj6ABTjUi3V3JVMnlJmwcJI5acqYI6dE= -github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d h1:U+s90UTSYgptZMwQh2aRr3LuazLJIa+Pg3Kc1ylSYVY= -github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= -github.com/creasty/defaults v1.3.0 h1:uG+RAxYbJgOPCOdKEcec9ZJXeva7Y6mj/8egdzwmLtw= -github.com/creasty/defaults v1.3.0/go.mod h1:CIEEvs7oIVZm30R8VxtFJs+4k201gReYyuYHJxZc68I= -github.com/davecgh/go-spew v0.0.0-20151105211317-5215b55f46b2/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= -github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/denverdino/aliyungo v0.0.0-20170926055100-d3308649c661/go.mod h1:dV8lFg6daOBZbT6/BDGIz6Y3WFGn8juu6G+CQ6LHtl0= -github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= -github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no= -github.com/digitalocean/godo v1.1.1/go.mod h1:h6faOIcZ8lWIwNQ+DN7b3CgX4Kwby5T+nbpNqkUIozU= -github.com/digitalocean/godo v1.10.0/go.mod h1:h6faOIcZ8lWIwNQ+DN7b3CgX4Kwby5T+nbpNqkUIozU= -github.com/dimchansky/utfbom v1.1.0/go.mod h1:rO41eb7gLfo8SF1jd9F8HplJm1Fewwi4mQvIirEdv+8= -github.com/dnaeon/go-vcr v1.0.1/go.mod h1:aBB1+wY4s93YsC3HHjMBMrwTj2R9FHDzUr9KyGc8n1E= -github.com/docker/go-connections v0.3.0/go.mod h1:Gbd7IOopHjR8Iph03tsViu4nIes5XhDvyHbTtUxmeec= -github.com/docker/go-connections v0.4.0/go.mod h1:Gbd7IOopHjR8Iph03tsViu4nIes5XhDvyHbTtUxmeec= -github.com/docker/spdystream v0.0.0-20160310174837-449fdfce4d96/go.mod h1:Qh8CwZgvJUkLughtfhJv5dyTYa91l1fOUCrgjqmcifM= -github.com/dubbogo/go-zookeeper v1.0.1 h1:irLzvOsDOTNsN8Sv9tvYYxVu6DCQfLtziZQtUHmZgz8= -github.com/dubbogo/go-zookeeper v1.0.1/go.mod h1:fn6n2CAEer3novYgk9ULLwAjuV8/g4DdC2ENwRb6E+c= -github.com/dubbogo/gost v1.9.0/go.mod h1:pPTjVyoJan3aPxBPNUX0ADkXjPibLo+/Ib0/fADXSG8= -github.com/dubbogo/gost v1.9.1 h1:0/PPFo13zPbjt4Ia0zYWMFi3C6rAe9X7O1J2Iv+BHNM= -github.com/dubbogo/gost v1.9.1/go.mod h1:pPTjVyoJan3aPxBPNUX0ADkXjPibLo+/Ib0/fADXSG8= -github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= -github.com/elazarl/go-bindata-assetfs v0.0.0-20160803192304-e1a2a7ec64b0/go.mod h1:v+YaWX3bdea5J/mo8dSETolEo7R71Vk1u8bnjau5yw4= -github.com/elazarl/go-bindata-assetfs v1.0.0/go.mod h1:v+YaWX3bdea5J/mo8dSETolEo7R71Vk1u8bnjau5yw4= -github.com/elazarl/goproxy v0.0.0-20170405201442-c4fc26588b6e/go.mod h1:/Zj4wYkgs4iZTTu3o/KG3Itv/qCCa8VVMlb3i9OVuzc= -github.com/emicklei/go-restful v0.0.0-20170410110728-ff4f55a20633/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs= -github.com/emicklei/go-restful/v3 v3.0.0/go.mod h1:6n3XBCmQQb25CM2LCACGz8ukIrRry+4bhvbpWn3mrbc= -github.com/envoyproxy/go-control-plane v0.8.0/go.mod h1:GSSbY9P1neVhdY7G4wu+IK1rk/dqhiCC/4ExuWJZVuk= -github.com/envoyproxy/protoc-gen-validate v0.0.14/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= -github.com/evanphx/json-patch v4.2.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= -github.com/fastly/go-utils v0.0.0-20180712184237-d95a45783239/go.mod h1:Gdwt2ce0yfBxPvZrHkprdPPTTS3N5rwmLE8T22KBXlw= -github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= -github.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL+zU= -github.com/fatih/structs v1.1.0/go.mod h1:9NiDSp5zOcgEDl+j00MP/WkGVPOlPRLejGD8Ga6PJ7M= -github.com/frankban/quicktest v1.4.1/go.mod h1:36zfPVQyHxymz4cH7wlDmVwDrJuljRB60qkgn7rorfQ= -github.com/fsnotify/fsnotify v1.4.7 h1:IXs+QLmnXW2CcXuY+8Mzv/fWEsPGWxqefPtCP5CnV9I= -github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= -github.com/ghodss/yaml v0.0.0-20150909031657-73d445a93680/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= -github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= -github.com/ghodss/yaml v1.0.1-0.20190212211648-25d852aebe32 h1:Mn26/9ZMNWSw9C9ERFA1PUxfmGpolnw2v0bKOREu5ew= -github.com/ghodss/yaml v1.0.1-0.20190212211648-25d852aebe32/go.mod h1:GIjDIg/heH5DOkXY3YJ/wNhfHsQHoXGjl8G8amsYQ1I= -github.com/go-asn1-ber/asn1-ber v1.3.1/go.mod h1:hEBeB/ic+5LoWskz+yKT7vGhhPYkProFKoKdwZRWMe0= -github.com/go-co-op/gocron v0.1.1/go.mod h1:Y9PWlYqDChf2Nbgg7kfS+ZsXHDTZbMZYPEQ0MILqH+M= -github.com/go-errors/errors v1.0.1/go.mod h1:f4zRHt4oKfwPJE5k8C9vpYG+aDHdBFUsgrm6/TyX73Q= -github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= -github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= -github.com/go-ldap/ldap v3.0.2+incompatible/go.mod h1:qfd9rJvER9Q0/D/Sqn1DfHRoBp40uXYvFoEVrNEPqRc= -github.com/go-ldap/ldap/v3 v3.1.3/go.mod h1:3rbOH3jRS2u6jg2rJnKAMLE/xQyCKIveG2Sa/Cohzb8= -github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= -github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= -github.com/go-logr/logr v0.1.0/go.mod h1:ixOQHD9gLJUVQQ2ZOR7zLEifBX6tGkNJF4QyIY7sIas= -github.com/go-ole/go-ole v1.2.1/go.mod h1:7FAglXiTm7HKlQRDeOQ6ZNUHidzCWXuZWq/1dTyBNF8= -github.com/go-openapi/jsonpointer v0.0.0-20160704185906-46af16f9f7b1/go.mod h1:+35s3my2LFTysnkMfxsJBAMHj/DoqoB9knIWoYG/Vk0= -github.com/go-openapi/jsonreference v0.0.0-20160704190145-13c6e3589ad9/go.mod h1:W3Z9FmVs9qj+KR4zFKmDPGiLdk1D9Rlm7cyMvf57TTg= -github.com/go-openapi/spec v0.0.0-20160808142527-6aced65f8501/go.mod h1:J8+jY1nAiCcj+friV/PDoE1/3eeccG9LYBs0tYvLOWc= -github.com/go-openapi/swag v0.0.0-20160704191624-1d0bd113de87/go.mod h1:DXUve3Dpr1UfpPtxFw+EFuQ41HhCWZfha5jSVRG7C7I= -github.com/go-redis/redis v6.15.5+incompatible/go.mod h1:NAIEuMOZ/fxfXJIrKDQDz8wamY7mA7PouImQ2Jvg6kA= -github.com/go-resty/resty/v2 v2.1.0/go.mod h1:dZGr0i9PLlaaTD4H/hoZIDjQ+r6xq8mgbRzHZf7f2J8= -github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= -github.com/go-test/deep v1.0.2-0.20181118220953-042da051cf31/go.mod h1:wGDj63lr65AM2AQyKZd/NYHGb0R+1RLqB8NKt3aSFNA= -github.com/go-test/deep v1.0.2/go.mod h1:wGDj63lr65AM2AQyKZd/NYHGb0R+1RLqB8NKt3aSFNA= -github.com/gogo/googleapis v1.1.0/go.mod h1:gf4bu3Q80BeJ6H1S1vYPm8/ELATdvryBaNFGgqEef3s= -github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= -github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4= -github.com/gogo/protobuf v1.2.2-0.20190723190241-65acae22fc9d/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= -github.com/goinggo/mapstructure v0.0.0-20140717182941-194205d9b4a9 h1:wqckanyE9qc/XnvnybC6SHOb8Nyd62QXAZOzA8twFig= -github.com/goinggo/mapstructure v0.0.0-20140717182941-194205d9b4a9/go.mod h1:64ikIrMv84B+raz7akXOqbF7cK3/OQQ/6cClY10oy7A= -github.com/goji/httpauth v0.0.0-20160601135302-2da839ab0f4d/go.mod h1:nnjvkQ9ptGaCkuDUx6wNykzzlUixGxvkme+H/lnzb+A= -github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= -github.com/golang/groupcache v0.0.0-20160516000752-02826c3e7903/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20190129154638-5b532d6fd5ef/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= -github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= -github.com/golang/mock v1.3.1 h1:qGJ6qTW+x6xX/my+8YUVl4WNpX9B7+/l2tRsHGZ7f2s= -github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y= -github.com/golang/protobuf v0.0.0-20161109072736-4bd1920723d7/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/snappy v0.0.1 h1:Qgr9rKW7uDUkrbSmQeiDsGa8SjGyCOGtuasMWwvp2P4= -github.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= -github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= -github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= -github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= -github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= -github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= -github.com/google/go-querystring v0.0.0-20170111101155-53e6ce116135/go.mod h1:odCYkC5MyYFN7vkCjXpyrEuKhc/BUO6wN/zVPAxq5ck= -github.com/google/go-querystring v1.0.0/go.mod h1:odCYkC5MyYFN7vkCjXpyrEuKhc/BUO6wN/zVPAxq5ck= -github.com/google/gofuzz v0.0.0-20161122191042-44d81051d367/go.mod h1:HP5RmnzzSNb993RKQDq4+1A4ia9nllfqcQFTQJedwGI= -github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= -github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= -github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= -github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= -github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= -github.com/google/tcpproxy v0.0.0-20180808230851-dfa16c61dad2/go.mod h1:DavVbd41y+b7ukKDmlnPR4nGYmkWXR6vHUkjQNiHPBs= -github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= -github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= -github.com/googleapis/gnostic v0.0.0-20170729233727-0c5108395e2d/go.mod h1:sJBsCZ4ayReDTBIg8b9dl28c5xFWyhBTVRp3pOg5EKY= -github.com/googleapis/gnostic v0.2.0/go.mod h1:sJBsCZ4ayReDTBIg8b9dl28c5xFWyhBTVRp3pOg5EKY= -github.com/gophercloud/gophercloud v0.1.0/go.mod h1:vxM41WHh5uqHVBMZHzuwNOHh8XEoIEcSTewFxm1c5g8= -github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1 h1:EGx4pi6eqNxGaHF6qqu48+N2wcFQ5qg5FXgOdqsJ5d8= -github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= -github.com/gorilla/websocket v1.4.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= -github.com/gorilla/websocket v1.4.2 h1:+/TMaTYc4QFitKJxsQ7Yye35DkWvkdLcvGKqM+x0Ufc= -github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= -github.com/gregjones/httpcache v0.0.0-20180305231024-9cad4c3443a7/go.mod h1:FecbI9+v66THATjSRHfNgh1IVFe/9kFxbXtjV0ctIMA= -github.com/grpc-ecosystem/go-grpc-middleware v1.0.0/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= -github.com/grpc-ecosystem/go-grpc-middleware v1.0.1-0.20190118093823-f849b5445de4/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= -github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk= -github.com/grpc-ecosystem/grpc-gateway v1.9.0/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= -github.com/grpc-ecosystem/grpc-gateway v1.9.5/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= -github.com/grpc-ecosystem/grpc-opentracing v0.0.0-20180507213350-8e809c8a8645/go.mod h1:6iZfnjpejD4L/4DwD7NryNaJyCQdzwWwH2MWhCA90Kw= -github.com/hashicorp/consul v1.8.0/go.mod h1:Gg9/UgAQ9rdY3CTvzQZ6g2jcIb7NlIfjI+0pvLk5D1A= -github.com/hashicorp/consul/api v1.1.0/go.mod h1:VmuI/Lkw1nC05EYQWNKwWGbkg+FbDBtguAZLlVdkD9Q= -github.com/hashicorp/consul/api v1.5.0/go.mod h1:LqwrLNW876eYSuUOo4ZLHBcdKc038txr/IMfbLPATa4= -github.com/hashicorp/consul/sdk v0.1.1/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyNV1vwHyQBF0x8= -github.com/hashicorp/consul/sdk v0.5.0/go.mod h1:fY08Y9z5SvJqevyZNy6WWPXiG3KwBPAvlcdx16zZ0fM= -github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= -github.com/hashicorp/go-bexpr v0.1.2/go.mod h1:ANbpTX1oAql27TZkKVeW8p1w8NTdnyzPe/0qqPCKohU= -github.com/hashicorp/go-checkpoint v0.0.0-20171009173528-1545e56e46de/go.mod h1:xIwEieBHERyEvaeKF/TcHh1Hu+lxPM+n2vT1+g9I4m4= -github.com/hashicorp/go-cleanhttp v0.5.0/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= -github.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= -github.com/hashicorp/go-connlimit v0.2.0/go.mod h1:OUj9FGL1tPIhl/2RCfzYHrIiWj+VVPGNyVPnUX8AqS0= -github.com/hashicorp/go-discover v0.0.0-20200501174627-ad1e96bde088/go.mod h1:vZu6Opqf49xX5lsFAu7iFNewkcVF1sn/wyapZh5ytlg= -github.com/hashicorp/go-hclog v0.0.0-20180709165350-ff2cf002a8dd/go.mod h1:9bjs9uLqI8l75knNv3lV1kA55veR+WUPSiKIWcQHudI= -github.com/hashicorp/go-hclog v0.8.0/go.mod h1:5CU+agLiy3J7N7QjHK5d05KxGsuXiQLrjA0H7acj2lQ= -github.com/hashicorp/go-hclog v0.9.1/go.mod h1:5CU+agLiy3J7N7QjHK5d05KxGsuXiQLrjA0H7acj2lQ= -github.com/hashicorp/go-hclog v0.9.2/go.mod h1:5CU+agLiy3J7N7QjHK5d05KxGsuXiQLrjA0H7acj2lQ= -github.com/hashicorp/go-hclog v0.12.0/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ= -github.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= -github.com/hashicorp/go-immutable-radix v1.1.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= -github.com/hashicorp/go-memdb v1.0.3/go.mod h1:LWQ8R70vPrS4OEY9k28D2z8/Zzyu34NVzeRibGAzHO0= -github.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM= -github.com/hashicorp/go-msgpack v0.5.5/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM= -github.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk= -github.com/hashicorp/go-multierror v1.1.0/go.mod h1:spPvp8C1qA32ftKqdAHm4hHTbPw+vmowP0z+KUhOZdA= -github.com/hashicorp/go-plugin v1.0.1/go.mod h1:++UyYGoz3o5w9ZzAdZxtQKrWWP+iqPBn3cQptSMzBuY= -github.com/hashicorp/go-raftchunking v0.6.1/go.mod h1:cGlg3JtDy7qy6c/3Bu660Mic1JF+7lWqIwCFSb08fX0= -github.com/hashicorp/go-raftchunking v0.6.3-0.20191002164813-7e9e8525653a/go.mod h1:xbXnmKqX9/+RhPkJ4zrEx4738HacP72aaUPlT2RZ4sU= -github.com/hashicorp/go-retryablehttp v0.5.3/go.mod h1:9B5zBasrRhHXnJnui7y6sL7es7NDiJgTc6Er0maI1Xs= -github.com/hashicorp/go-retryablehttp v0.5.4/go.mod h1:9B5zBasrRhHXnJnui7y6sL7es7NDiJgTc6Er0maI1Xs= -github.com/hashicorp/go-retryablehttp v0.6.2/go.mod h1:gEx6HMUGxYYhJScX7W1Il64m6cc2C1mDaW3NQ9sY1FY= -github.com/hashicorp/go-rootcerts v1.0.0/go.mod h1:K6zTfqpRlCUIjkwsN4Z+hiSfzSTQa6eBIzfwKfwNnHU= -github.com/hashicorp/go-rootcerts v1.0.1/go.mod h1:pqUvnprVnM5bf7AOirdbb01K4ccR319Vf4pU3K5EGc8= -github.com/hashicorp/go-rootcerts v1.0.2/go.mod h1:pqUvnprVnM5bf7AOirdbb01K4ccR319Vf4pU3K5EGc8= -github.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU= -github.com/hashicorp/go-sockaddr v1.0.2/go.mod h1:rB4wwRAUzs07qva3c5SdrY/NEtAUjGlgmH/UkBUC97A= -github.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4= -github.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= -github.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= -github.com/hashicorp/go-uuid v1.0.2-0.20191001231223-f32f5fe8d6a8/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= -github.com/hashicorp/go-uuid v1.0.2/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= -github.com/hashicorp/go-version v1.1.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= -github.com/hashicorp/go-version v1.2.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= -github.com/hashicorp/go.net v0.0.1/go.mod h1:hjKkEWcCURg++eb33jQU7oqQcI9XDCnUzHA0oac0k90= -github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= -github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= -github.com/hashicorp/golang-lru v0.5.3/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= -github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4= -github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= -github.com/hashicorp/hil v0.0.0-20160711231837-1e86c6b523c5/go.mod h1:KHvg/R2/dPtaePb16oW4qIyzkMxXOL38xjRN64adsts= -github.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64= -github.com/hashicorp/mdns v1.0.0/go.mod h1:tL+uN++7HEJ6SQLQ2/p+z2pH24WQKWjBPkE0mNTz8vQ= -github.com/hashicorp/mdns v1.0.1/go.mod h1:4gW7WsVCke5TE7EPeYliwHlRUyBtfCwuFwuMg2DmyNY= -github.com/hashicorp/memberlist v0.1.3/go.mod h1:ajVTdAv/9Im8oMAAj5G31PhhMCZJV2pPBoIllUwCN7I= -github.com/hashicorp/memberlist v0.2.0/go.mod h1:MS2lj3INKhZjWNqd3N0m3J+Jxf3DAOnAH9VT3Sh9MUE= -github.com/hashicorp/memberlist v0.2.2/go.mod h1:MS2lj3INKhZjWNqd3N0m3J+Jxf3DAOnAH9VT3Sh9MUE= -github.com/hashicorp/net-rpc-msgpackrpc v0.0.0-20151116020338-a14192a58a69/go.mod h1:/z+jUGRBlwVpUZfjute9jWaF6/HuhjuFQuL1YXzVD1Q= -github.com/hashicorp/raft v1.1.1/go.mod h1:vPAJM8Asw6u8LxC3eJCUZmRP/E4QmUGE1R7g7k8sG/8= -github.com/hashicorp/raft v1.1.2-0.20191002163536-9c6bd3e3eb17/go.mod h1:vPAJM8Asw6u8LxC3eJCUZmRP/E4QmUGE1R7g7k8sG/8= -github.com/hashicorp/raft v1.1.2/go.mod h1:vPAJM8Asw6u8LxC3eJCUZmRP/E4QmUGE1R7g7k8sG/8= -github.com/hashicorp/raft-boltdb v0.0.0-20171010151810-6e5ba93211ea/go.mod h1:pNv7Wc3ycL6F5oOWn+tPGo2gWD4a5X+yp/ntwdKLjRk= -github.com/hashicorp/serf v0.8.2/go.mod h1:6hOLApaqBFA1NXqRQAsxw9QxuDEvNxSQRwA/JwenrHc= -github.com/hashicorp/serf v0.9.0/go.mod h1:YL0HO+FifKOW2u1ke99DGVu1zhcpZzNwrLIqBC7vbYU= -github.com/hashicorp/serf v0.9.2/go.mod h1:UWDWwZeL5cuWDJdl0C6wrvrUwEqtQ4ZKBKKENpqIUyk= -github.com/hashicorp/vault/api v1.0.4/go.mod h1:gDcqh3WGcR1cpF5AJz/B1UFheUEneMoIospckxBxk6Q= -github.com/hashicorp/vault/api v1.0.5-0.20191108163347-bdd38fca2cff/go.mod h1:Uf8LaHyrYsgVgHzO2tMZKhqRGlL3UJ6XaSwW2EA1Iqo= -github.com/hashicorp/vault/sdk v0.1.13/go.mod h1:B+hVj7TpuQY1Y/GPbCpffmgd+tSEwvhkWnjtSYCaS2M= -github.com/hashicorp/vault/sdk v0.1.14-0.20191108161836-82f2b5571044/go.mod h1:PcekaFGiPJyHnFy+NZhP6ll650zEw51Ag7g/YEa+EOU= -github.com/hashicorp/vault/sdk v0.1.14-0.20191112033314-390e96e22eb2/go.mod h1:PcekaFGiPJyHnFy+NZhP6ll650zEw51Ag7g/YEa+EOU= -github.com/hashicorp/vic v1.5.1-0.20190403131502-bbfe86ec9443/go.mod h1:bEpDU35nTu0ey1EXjwNwPjI9xErAsoOCmcMb9GKvyxo= -github.com/hashicorp/yamux v0.0.0-20180604194846-3520598351bb/go.mod h1:+NfK9FKeTrX5uv1uIXGdwYDTeHna2qgaIlx54MXqjAM= -github.com/hashicorp/yamux v0.0.0-20181012175058-2f1d1f20f75d/go.mod h1:+NfK9FKeTrX5uv1uIXGdwYDTeHna2qgaIlx54MXqjAM= -github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= -github.com/imdario/mergo v0.3.5/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= -github.com/imdario/mergo v0.3.6/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= -github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= -github.com/jackc/fake v0.0.0-20150926172116-812a484cc733/go.mod h1:WrMFNQdiFJ80sQsxDoMokWK1W5TQtxBFNpzWTD84ibQ= -github.com/jackc/pgx v3.3.0+incompatible/go.mod h1:0ZGrqGqkRlliWnWB4zKnWtjbSWbGkVEFm4TeybAXq+I= -github.com/jarcoal/httpmock v0.0.0-20180424175123-9c70cfe4a1da/go.mod h1:ks+b9deReOc7jgqp+e7LuFiCBH6Rm5hL32cLcEAArb4= -github.com/jehiah/go-strftime v0.0.0-20171201141054-1d33003b3869/go.mod h1:cJ6Cj7dQo+O6GJNiMx+Pa94qKj+TG8ONdKHgMNIyyag= -github.com/jinzhu/copier v0.0.0-20190625015134-976e0346caa8 h1:mGIXW/lubQ4B+3bXTLxcTMTjUNDqoF6T/HUW9LbFx9s= -github.com/jinzhu/copier v0.0.0-20190625015134-976e0346caa8/go.mod h1:yL958EeXv8Ylng6IfnvG4oflryUi3vgA3xPs9hmII1s= -github.com/jmespath/go-jmespath v0.0.0-20180206201540-c2b33e8439af/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k= -github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo= -github.com/joyent/triton-go v0.0.0-20180628001255-830d2b111e62/go.mod h1:U+RSyWxWd04xTqnuOQxnai7XGS2PrPY2cfGoDKtMHjA= -github.com/joyent/triton-go v1.7.1-0.20200416154420-6801d15b779f/go.mod h1:KDSfL7qe5ZfQqvlDMkVjCztbmcpp/c8M77vhQP8ZPvk= -github.com/json-iterator/go v0.0.0-20180612202835-f2b4162afba3/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= -github.com/json-iterator/go v1.1.5/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= -github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= -github.com/json-iterator/go v1.1.7/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= -github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= -github.com/jtolds/gls v4.20.0+incompatible h1:xdiiI2gbIgH/gLH7ADydsJ1uDOEzR8yvV7C0MuV77Wo= -github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= -github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= -github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q= -github.com/kisielk/errcheck v1.2.0/go.mod h1:/BMXB+zMLi60iA8Vv6Ksmxu/1UDYcXs4uQLJ+jE2L00= -github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= -github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= -github.com/konsorten/go-windows-terminal-sequences v1.0.2/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= -github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= -github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= -github.com/kr/pretty v0.2.0 h1:s5hAObm+yFO5uHYt5dYjxi2rXrsnmRpJx4OYvIWUaQs= -github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= -github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= -github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE= -github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= -github.com/lestrrat/go-envload v0.0.0-20180220120943-6ed08b54a570/go.mod h1:BLt8L9ld7wVsvEWQbuLrUZnCMnUmLZ+CGDzKtclrTlE= -github.com/lestrrat/go-file-rotatelogs v0.0.0-20180223000712-d3151e2a480f/go.mod h1:UGmTpUd3rjbtfIpwAPrcfmGf/Z1HS95TATB+m57TPB8= -github.com/lestrrat/go-strftime v0.0.0-20180220042222-ba3bf9c1d042/go.mod h1:TPpsiPUEh0zFL1Snz4crhMlBe60PYxRHr5oFF3rRYg0= -github.com/lib/pq v1.1.1/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= -github.com/linode/linodego v0.7.1/go.mod h1:ga11n3ivecUrPCHN0rANxKmfWBJVkOXfLMZinAbj2sY= -github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= -github.com/magiconair/properties v1.8.1 h1:ZC2Vc7/ZFkGmsVC9KvOjumD+G5lXy2RtTKyzRKO2BQ4= -github.com/magiconair/properties v1.8.1/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= -github.com/mailru/easyjson v0.0.0-20160728113105-d5b7844b561a/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= -github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= -github.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= -github.com/mattn/go-colorable v0.1.6/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= -github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= -github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= -github.com/mattn/go-isatty v0.0.10/go.mod h1:qgIWMr58cqv1PHHyhnkY9lrL7etaEgOFcMEpPG5Rm84= -github.com/mattn/go-isatty v0.0.11/go.mod h1:PhnuNfih5lzO57/f3n+odYbM4JtupLOxQOAqxQCu2WE= -github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= -github.com/mattn/go-runewidth v0.0.3/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= -github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= -github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= -github.com/miekg/dns v1.1.26/go.mod h1:bPDLeHnStXmXAq1m/Ch/hvfNHr14JKNPMBo3VZKjuso= -github.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc= -github.com/mitchellh/cli v1.1.0/go.mod h1:xcISNoH86gajksDmfB23e/pu+B+GeFRMYmoHXxx3xhI= -github.com/mitchellh/copystructure v1.0.0/go.mod h1:SNtv71yrdKgLRyLFxmLdkAbkKEFWgYaq1OVrnRcwhnw= -github.com/mitchellh/go-homedir v1.0.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= -github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= -github.com/mitchellh/go-testing-interface v0.0.0-20171004221916-a61a99592b77/go.mod h1:kRemZodwjscx+RGhAo8eIhFbs2+BFgRtFPeD/KE+zxI= -github.com/mitchellh/go-testing-interface v1.0.0/go.mod h1:kRemZodwjscx+RGhAo8eIhFbs2+BFgRtFPeD/KE+zxI= -github.com/mitchellh/go-testing-interface v1.14.0/go.mod h1:gfgS7OtZj6MA4U1UrDRp04twqAjfvlZyCfX3sDjEym8= -github.com/mitchellh/go-wordwrap v1.0.0/go.mod h1:ZXFpozHsX6DPmq2I0TCekCxypsnAUbP2oI0UX1GXzOo= -github.com/mitchellh/gox v0.4.0/go.mod h1:Sd9lOJ0+aimLBi73mGofS1ycjY8lL3uZM3JPS42BGNg= -github.com/mitchellh/hashstructure v0.0.0-20170609045927-2bca23e0e452/go.mod h1:QjSHrPWS+BGUVBYkbTZWEnOh3G1DutKwClXU/ABz6AQ= -github.com/mitchellh/hashstructure v1.0.0/go.mod h1:QjSHrPWS+BGUVBYkbTZWEnOh3G1DutKwClXU/ABz6AQ= -github.com/mitchellh/iochan v1.0.0/go.mod h1:JwYml1nuB7xOzsp52dPpHFffvOCDupsG0QubkSMEySY= -github.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= -github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= -github.com/mitchellh/mapstructure v1.2.3 h1:f/MjBEBDLttYCGfRaKBbKSRVF5aV2O6fnBpzknuE3jU= -github.com/mitchellh/mapstructure v1.2.3/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= -github.com/mitchellh/pointerstructure v1.0.0/go.mod h1:k4XwG94++jLVsSiTxo7qdIfXA9pj9EAeo0QsNNJOLZ8= -github.com/mitchellh/reflectwalk v1.0.0/go.mod h1:mSTlrgnPZtwu0c4WaC2kGObEpuNDbx0jmZXqmk4esnw= -github.com/mitchellh/reflectwalk v1.0.1/go.mod h1:mSTlrgnPZtwu0c4WaC2kGObEpuNDbx0jmZXqmk4esnw= -github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= -github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= -github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= -github.com/modern-go/reflect2 v0.0.0-20180320133207-05fbef0ca5da/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= -github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= -github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= -github.com/munnerz/goautoneg v0.0.0-20120707110453-a547fc61f48d/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= -github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= -github.com/mxk/go-flowrate v0.0.0-20140419014527-cca7078d478f/go.mod h1:ZdcZmHo+o7JKHSa8/e818NopupXU1YMK5fe1lsApnBw= -github.com/nacos-group/nacos-sdk-go v1.0.0/go.mod h1:hlAPn3UdzlxIlSILAyOXKxjFSvDJ9oLzTJ9hLAK1KzA= -github.com/nicolai86/scaleway-sdk v1.10.2-0.20180628010248-798f60e20bb2/go.mod h1:TLb2Sg7HQcgGdloNxkrmtgDNR9uVYF3lfdFIN4Ro6Sk= -github.com/oklog/run v1.0.0/go.mod h1:dlhp/R75TPv97u0XWUtDeV/lRKWPKSdTuV0TZvrmrQA= -github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U= -github.com/olekukonko/tablewriter v0.0.0-20180130162743-b8a9be070da4/go.mod h1:vsDQFd/mU46D+Z4whnwzcISnGGzXWMclvtLoiIKAKIo= -github.com/onsi/ginkgo v0.0.0-20170829012221-11459a886d9c/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.8.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.10.1/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/gomega v0.0.0-20170829124025-dcabb60a477c/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= -github.com/onsi/gomega v1.5.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= -github.com/onsi/gomega v1.7.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= -github.com/opentracing/opentracing-go v1.1.0 h1:pWlfV3Bxv7k65HYwkikxat0+s3pV4bsqf19k25Ur8rU= -github.com/opentracing/opentracing-go v1.1.0/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= -github.com/packethost/packngo v0.1.1-0.20180711074735-b9cb5096f54c/go.mod h1:otzZQXgoO96RTzDB/Hycg0qZcXZsWJGJRSXbmEIJ+4M= -github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= -github.com/pascaldekloe/goe v0.1.0/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= -github.com/patrickmn/go-cache v2.1.0+incompatible/go.mod h1:3Qf8kWWT7OJRJbdiICTKqZju1ZixQ/KpMGzzAfe6+WQ= -github.com/pelletier/go-toml v1.2.0 h1:T5zMGML61Wp+FlcbWjRDT7yAxhJNAiPPLOFECq181zc= -github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= -github.com/peterbourgon/diskv v2.0.1+incompatible/go.mod h1:uqqh8zWWbv1HBMNONnaR/tNboyR3/BZd58JJSHlUSCU= -github.com/pierrec/lz4 v2.0.5+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY= -github.com/pierrec/lz4 v2.2.6+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY= -github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= -github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pmezard/go-difflib v0.0.0-20151028094244-d8ed2627bdf0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= -github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI= -github.com/posener/complete v1.2.3/go.mod h1:WZIdtGGp+qx0sLrYKtIRAruyNpv6hFCicSgv7Sy7s/s= -github.com/pquerna/cachecontrol v0.0.0-20180517163645-1555304b9b35/go.mod h1:prYjPmNq4d1NPVmpShWobRqXY3q7Vp+80DqgxxUrUIA= -github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= -github.com/prometheus/client_golang v0.9.2/go.mod h1:OsXs2jCmiKlQ1lTBmv21f2mNfw4xf/QclQDMrYNZzcM= -github.com/prometheus/client_golang v0.9.3/go.mod h1:/TN21ttK/J9q6uSwhBd54HahCDft0ttaMvbicHlPoso= -github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo= -github.com/prometheus/client_golang v1.1.0/go.mod h1:I1FGZT9+L76gKKOs5djB6ezCbFQP1xR9D75/vuwEF3g= -github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= -github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/prometheus/common v0.0.0-20181113130724-41aa239b4cce/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= -github.com/prometheus/common v0.0.0-20181126121408-4724e9255275/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= -github.com/prometheus/common v0.4.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= -github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= -github.com/prometheus/common v0.6.0/go.mod h1:eBmuwkDJBwy6iBfxCBob6t6dR6ENT/y+J+Zk0j9GMYc= -github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= -github.com/prometheus/procfs v0.0.0-20181204211112-1dc9a6cbc91a/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= -github.com/prometheus/procfs v0.0.0-20190507164030-5867b95ac084/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= -github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= -github.com/prometheus/procfs v0.0.3/go.mod h1:4A/X28fw3Fc593LaREMrKMqOKvUAntwMDaekg4FpcdQ= -github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU= -github.com/rboyer/safeio v0.2.1/go.mod h1:Cq/cEPK+YXFn622lsQ0K4KsPZSPtaptHHEldsy7Fmig= -github.com/renier/xmlrpc v0.0.0-20170708154548-ce4a1a486c03/go.mod h1:gRAiPF5C5Nd0eyyRdqIu9qTiFSoZzpTq727b5B8fkkU= -github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg= -github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= -github.com/rs/zerolog v1.4.0/go.mod h1:YbFCdg8HfsridGWAh22vktObvhZbQsZXe4/zB0OKkWU= -github.com/russross/blackfriday v1.5.2 h1:HyvC0ARfnZBqnXwABFeSZHpKvJHJJfPz81GNueLj0oo= -github.com/russross/blackfriday v1.5.2/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g= -github.com/russross/blackfriday/v2 v2.0.1 h1:lPqVAte+HuHNfhJ/0LC98ESWRz8afy9tM/0RK8m9o+Q= -github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= -github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= -github.com/ryanuber/columnize v2.1.0+incompatible/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= -github.com/ryanuber/go-glob v1.0.0/go.mod h1:807d1WSdnB0XRJzKNil9Om6lcp/3a0v4qIHxIXzX/Yc= -github.com/satori/go.uuid v1.2.0/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0= -github.com/satori/go.uuid v1.2.1-0.20181028125025-b2ce2384e17b h1:gQZ0qzfKHQIybLANtM3mBXNUtOfsCFXeTsnBqCsx1KM= -github.com/satori/go.uuid v1.2.1-0.20181028125025-b2ce2384e17b/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0= -github.com/sean-/conswriter v0.0.0-20180208195008-f5ae3917a627/go.mod h1:7zjs06qF79/FKAJpBvFx3P8Ww4UTIMAe+lpNXDHziac= -github.com/sean-/pager v0.0.0-20180208200047-666be9bf53b5/go.mod h1:BeybITEsBEg6qbIiqJ6/Bqeq25bCLbL7YFmpaFfJDuM= -github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc= -github.com/shirou/gopsutil v0.0.0-20181107111621-48177ef5f880/go.mod h1:5b4v6he4MtMOwMlS0TUMTu2PcXUg8+E1lC7eC3UO/RA= -github.com/shirou/gopsutil v2.19.9+incompatible/go.mod h1:5b4v6he4MtMOwMlS0TUMTu2PcXUg8+E1lC7eC3UO/RA= -github.com/shirou/w32 v0.0.0-20160930032740-bb4de0191aa4/go.mod h1:qsXQc7+bwAM3Q1u/4XEfrquwF8Lw7D7y5cD8CuHnfIc= -github.com/shopspring/decimal v0.0.0-20180709203117-cd690d0c9e24/go.mod h1:M+9NzErvs504Cn4c5DxATwIqPbtswREoFCre64PpcG4= -github.com/shurcooL/sanitized_anchor_name v1.0.0 h1:PdmoCO6wvbs+7yrJyMORt4/BmY5IYyJwS/kOiWx8mHo= -github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= -github.com/sirupsen/logrus v1.0.6/go.mod h1:pMByvHTf9Beacp5x1UXfOR9xyW/9antXMhjMPG0dEzc= -github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= -github.com/sirupsen/logrus v1.4.1/go.mod h1:ni0Sbl8bgC9z8RoU9G6nDWqqs/fq4eDPysMBDgk/93Q= -github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= -github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d h1:zE9ykElWQ6/NYmHa3jpm/yHnI4xSofP+UP6SpjHcSeM= -github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= -github.com/smartystreets/goconvey v0.0.0-20190330032615-68dc04aab96a/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= -github.com/smartystreets/goconvey v1.6.4 h1:fv0U8FUIMPNf1L9lnHLvLhgicrIVChEkdzIKYqbNC9s= -github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= -github.com/softlayer/softlayer-go v0.0.0-20180806151055-260589d94c7d/go.mod h1:Cw4GTlQccdRGSEf6KiMju767x0NEHE0YIVPJSaXjlsw= -github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM= -github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= -github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ= -github.com/spf13/afero v1.2.1/go.mod h1:9ZxEEn6pIJ8Rxe320qSDBk6AsU0r9pR7Q4OcevTdifk= -github.com/spf13/afero v1.2.2 h1:5jhuqJyZCZf2JRofRvN/nIFgIWNzPa3/Vz8mYylgbWc= -github.com/spf13/afero v1.2.2/go.mod h1:9ZxEEn6pIJ8Rxe320qSDBk6AsU0r9pR7Q4OcevTdifk= -github.com/spf13/cast v1.3.0 h1:oget//CVOEoFewqQxwr0Ej5yjygnqGkvggSE/gB35Q8= -github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= -github.com/spf13/cobra v0.0.5/go.mod h1:3K3wKZymM7VvHMDS9+Akkh4K60UwM26emMESw8tLCHU= -github.com/spf13/jwalterweatherman v1.0.0 h1:XHEdyB+EcvlqZamSM4ZOMGlc93t6AcsBEu9Gc1vn7yk= -github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo= -github.com/spf13/pflag v0.0.0-20170130214245-9ff6c6923cff/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= -github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= -github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= -github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= -github.com/spf13/viper v1.3.2/go.mod h1:ZiWeW+zYFKm7srdB9IoDzzZXaJaI5eL9QjNiN/DMA2s= -github.com/spf13/viper v1.4.0/go.mod h1:PTJ7Z/lr49W6bUbkmS1V3by4uWynFiR9p7+dSq/yZzE= -github.com/spf13/viper v1.7.0 h1:xVKxvI7ouOI5I+U9s2eeiUfMaWBVoXA3AWskkrqK0VM= -github.com/spf13/viper v1.7.0/go.mod h1:8WkrPz2fc9jxqZNCJI/76HCieCp4Q8HaLFoCha5qpdg= -github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/objx v0.2.0 h1:Hbg2NidpLE8veEBkEZTL3CvlkUIVzuU9jDplZO54c48= -github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE= -github.com/stretchr/testify v0.0.0-20151208002404-e3a8ff8ce365/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= -github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= -github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= -github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= -github.com/stretchr/testify v1.5.1 h1:nOGnQDM7FYENwehXlg/kFVnos3rEvtKTjRvOWSzb6H4= -github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= -github.com/subosito/gotenv v1.2.0 h1:Slr1R9HxAlEKefgq5jn9U+DnETlIUa6HfgEzj0g5d7s= -github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw= -github.com/tebeka/strftime v0.1.3/go.mod h1:7wJm3dZlpr4l/oVK0t1HYIc4rMzQ2XJlOMIUJUJH6XQ= -github.com/tencentcloud/tencentcloud-sdk-go v3.0.83+incompatible/go.mod h1:0PfYow01SHPMhKY31xa+EFz2RStxIqj6JFAJS+IkCi4= -github.com/tent/http-link-go v0.0.0-20130702225549-ac974c61c2f9/go.mod h1:RHkNRtSLfOK7qBTHaeSX1D6BNpI3qw7NTxsmNr4RvN8= -github.com/tevid/gohamcrest v1.1.1 h1:ou+xSqlIw1xfGTg1uq1nif/htZ2S3EzRqLm2BP+tYU0= -github.com/tevid/gohamcrest v1.1.1/go.mod h1:3UvtWlqm8j5JbwYZh80D/PVBt0mJ1eJiYgZMibh0H/k= -github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= -github.com/toolkits/concurrent v0.0.0-20150624120057-a4371d70e3e3/go.mod h1:QDlpd3qS71vYtakd2hmdpqhJ9nwv6mD6A30bQ1BPBFE= -github.com/tv42/httpunix v0.0.0-20150427012821-b75d8614f926/go.mod h1:9ESjWnEqriFuLhtthL60Sar/7RFoluCcXsuvEwTV5KM= -github.com/ugorji/go v1.1.4/go.mod h1:uQMGLiO92mf5W77hV/PUCpI3pbzQx3CRekS0kk+RGrc= -github.com/ugorji/go/codec v0.0.0-20181204163529-d75b2dcb6bc8/go.mod h1:VFNgLljTbGfSG7qAOspJ7OScBnGdDN/yBr0sguwnwf0= -github.com/urfave/cli v1.22.4 h1:u7tSpNPPswAFymm8IehJhy4uJMlUuU/GmqSkvJ1InXA= -github.com/urfave/cli v1.22.4/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= -github.com/vmware/govmomi v0.18.0/go.mod h1:URlwyTFZX72RmxtxuaFL2Uj3fD1JTvZdx59bHWk6aFU= -github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU= -github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q= -github.com/zouyx/agollo/v3 v3.4.4 h1:5G7QNw3fw74Ns8SfnHNhjndV2mlz5Fg8bB7q84ydFYI= -github.com/zouyx/agollo/v3 v3.4.4/go.mod h1:ag0XmE1r4iAgPd6PUnU9TJ0DMEjM1VKX1HUNqQJ2ywU= -go.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= -go.etcd.io/bbolt v1.3.4/go.mod h1:G5EMThwa9y8QZGBClrRx5EY+Yw9kAhnjy3bSjsnlVTQ= -go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= -go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= -go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= -go.uber.org/atomic v1.6.0 h1:Ezj3JGmsOnG1MoRWQkPBsKLe9DwWD9QeXzTRzzldNVk= -go.uber.org/atomic v1.6.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= -go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= -go.uber.org/multierr v1.5.0 h1:KCa4XfM8CWFCpxXRGok+Q0SS/0XBhMDbHHGABQLvD2A= -go.uber.org/multierr v1.5.0/go.mod h1:FeouvMocqHpRaaGuG9EjoKcStLC43Zu/fmqdUMPcKYU= -go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee h1:0mgffUl7nfd+FpvXMVz4IDEaUSmT1ysygQC7qYo7sG4= -go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee/go.mod h1:vJERXedbb3MVM5f9Ejo0C68/HhF8uaILCdgjnY+goOA= -go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= -go.uber.org/zap v1.15.0 h1:ZZCA22JRF2gQE5FoNmhmrf7jeJJ2uhqDUNRYKm8dvmM= -go.uber.org/zap v1.15.0/go.mod h1:Mb2vm2krFEG5DV0W9qcHBYFtp/Wku1cvYaqPsS/WYfc= -golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20181029021203-45a5f77698d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20181203042331-505ab145d0a9/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20190211182817-74369b46fc67/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= -golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190611184440-5c40567a22f8/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190923035154-9ee001bba392/go.mod h1:/lpIB1dKB+9EgE3H3cr1v9wB50oz8l4C4h62xy7jSTY= -golang.org/x/crypto v0.0.0-20191206172530-e9b2fee46413/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20200220183623-bac4c82f6975/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= -golang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek= -golang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY= -golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= -golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= -golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= -golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= -golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= -golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20190409202823-959b441ac422/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20190909230951-414d861bb4ac/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20190930215403-16217165b5de h1:5hukYrvBGR8/eNkX5mdUezrA6JiaEZDtJb9Ei+1LlBs= -golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE= -golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o= -golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= -golang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY= -golang.org/x/net v0.0.0-20170114055629-f2499483f923/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181023162649-9b4f9f5ad519/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181201002055-351d144fa1fc/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181220203305-927f97764cc3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190522155817-f3200d17e092/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= -golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= -golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190923162816-aa69164e4478/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20191004110552-13f9640d40b9/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= -golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sys v0.0.0-20170830134202-bb24a47a89ea/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20181026203630-95b1ffbd15a5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20181107165924-66b7b1311ac8/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20181205085412-a5c9d58dba9a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190129075346-302c3dd5f1cc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190209173611-3b5209105503/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190403152447-81d4e9dc473e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190508220229-2d0786266e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190515120540-06a5c4944438/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190523142557-0e01d883c5c5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190801041406-cbf593c0f2f3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190813064441-fde4db37ae7a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190922100055-0a153f010e69/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190924154521-2837fb4f24fe/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191008105621-543471e840be/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200124204421-9fbb57f87de9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae h1:/WDfKMnPU+m5M4xB+6x4kaepxRw6jWvR5iDRdvjHgy8= -golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/text v0.0.0-20160726164857-2910a502d2bf/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.3.1-0.20181227161524-e6919f6577db/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= -golang.org/x/text v0.3.2 h1:tW2bmiBqwgJj/UpqtC8EpXEZVYOwU0yG4iWbprSVAcs= -golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= -golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20181011042414-1f849cf54d09/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20181030221726-6c7e314b6563/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= -golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= -golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= -golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= -golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20190907020128-2ca718005c18/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191029041327-9cc4af7d6b2c/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191029190741-b9c20aec41a5/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191112195655-aa38f8e97acc h1:NCy3Ohtk6Iny5V/reW2Ktypo4zIpWBdRJ1uFMjBxdg8= -golang.org/x/tools v0.0.0-20191112195655-aa38f8e97acc/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= -google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M= -google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= -google.golang.org/api v0.9.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= -google.golang.org/api v0.13.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= -google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= -google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= -google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= -google.golang.org/appengine v1.6.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= -google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= -google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= -google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190404172233-64821d5d2107/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190530194941-fb225487d101/go.mod h1:z3L6/3dTEVtUr6QSP8miRzeRqwQOioJ9I66odjN4I7s= -google.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= -google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= -google.golang.org/genproto v0.0.0-20190911173649-1774047e7e51/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8= -google.golang.org/genproto v0.0.0-20191108220845-16a3f7862a1a/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/grpc v1.14.0/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw= -google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= -google.golang.org/grpc v1.19.1/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= -google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= -google.golang.org/grpc v1.21.0/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= -google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= -google.golang.org/grpc v1.22.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= -google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= -gopkg.in/airbrake/gobrake.v2 v2.0.9/go.mod h1:/h5ZAUhDkGaJfjzjKLSjv6zCL6O0LLBxU4K+aSYdM/U= -gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= -gopkg.in/asn1-ber.v1 v1.0.0-20181015200546-f715ec2f112d/go.mod h1:cuepJuh7vyXfUyUwEgHQXw849cJrilpS5NeIjOWESAw= -gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15 h1:YR8cESwS4TdDjEe65xsg0ogRM/Nc3DYOhEAlW+xobZo= -gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= -gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= -gopkg.in/gemnasium/logrus-airbrake-hook.v2 v2.1.2/go.mod h1:Xk6kEKp8OKb+X14hQBKWaSkCsqBpgog8nAV2xsGOxlo= -gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= -gopkg.in/ini.v1 v1.42.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= -gopkg.in/ini.v1 v1.51.0 h1:AQvPpx3LzTDM0AjnIRlVFwFFGC+npRopjZxLJj6gdno= -gopkg.in/ini.v1 v1.51.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= -gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo= -gopkg.in/square/go-jose.v2 v2.3.1/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI= -gopkg.in/square/go-jose.v2 v2.4.1/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI= -gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= -gopkg.in/yaml.v2 v2.0.0-20170812160011-eb3733d160e7/go.mod h1:JAlM8MvJe8wmxCU4Bli9HhUf9+ttbYbLASfIpnQbh74= -gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.8 h1:obN1ZagJSUGI0Ek/LBmuj4SNLPfIny3KsKFopxRdj10= -gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.1-2019.2.3 h1:3JgtbtFHMiCmsznwGVTUWbgGov+pVqnlf1dEJTNAXeM= -honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= -istio.io/gogo-genproto v0.0.0-20190124151557-6d926a6e6feb/go.mod h1:eIDJ6jNk/IeJz6ODSksHl5Aiczy5JUq6vFhJWI5OtiI= -k8s.io/api v0.16.9/go.mod h1:Y7dZNHs1Xy0mSwSlzL9QShi6qkljnN41yR8oWCRTDe8= -k8s.io/apimachinery v0.16.9/go.mod h1:Xk2vD2TRRpuWYLQNM6lT9R7DSFZUYG03SarNkbGrnKE= -k8s.io/client-go v0.16.9/go.mod h1:ThjPlh7Kx+XoBFOCt775vx5J7atwY7F/zaFzTco5gL0= -k8s.io/gengo v0.0.0-20190128074634-0689ccc1d7d6/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0= -k8s.io/klog v0.0.0-20181102134211-b9b56d5dfc92/go.mod h1:Gq+BEi5rUBO/HRz0bTSXDUcqjScdoY3a9IHpCEIOOfk= -k8s.io/klog v0.3.0/go.mod h1:Gq+BEi5rUBO/HRz0bTSXDUcqjScdoY3a9IHpCEIOOfk= -k8s.io/klog v1.0.0/go.mod h1:4Bi6QPql/J/LkTDqv7R/cd3hPo4k2DG6Ptcz060Ez5I= -k8s.io/kube-openapi v0.0.0-20190816220812-743ec37842bf/go.mod h1:1TqjTSzOxsLGIKfj0lK8EeCP7K1iUG65v09OM0/WG5E= -k8s.io/kube-openapi v0.0.0-20191107075043-30be4d16710a/go.mod h1:1TqjTSzOxsLGIKfj0lK8EeCP7K1iUG65v09OM0/WG5E= -k8s.io/utils v0.0.0-20190801114015-581e00157fb1/go.mod h1:sZAwmy6armz5eXlNoLmJcl4F1QuKu7sr+mFQ0byX7Ew= -launchpad.net/gocheck v0.0.0-20140225173054-000000000087/go.mod h1:hj7XX3B/0A+80Vse0e+BUHsHMTEhd0O4cpUHr/e/BUM= -rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= -sigs.k8s.io/structured-merge-diff v0.0.0-20190525122527-15d366b2352e/go.mod h1:wWxsB5ozmmv/SG7nM11ayaAW51xMvak/t1r0CSlcokI= -sigs.k8s.io/yaml v1.1.0/go.mod h1:UJmg0vDUVViEyp3mgSv9WPwZCDxu4rQW1olrI1uml+o= \ No newline at end of file diff --git a/pkg/config/conf_test.yaml b/pkg/config/conf_test.yaml index 8a8ebc993..58826d80f 100644 --- a/pkg/config/conf_test.yaml +++ b/pkg/config/conf_test.yaml @@ -47,3 +47,6 @@ static_resources: type: "EDS" lb_policy: "RoundRobin" connect_timeout: "5s" + pprofConf: + enable: true + addr: "0.0.0.0:6060" \ No newline at end of file diff --git a/pkg/model/bootstrap.go b/pkg/model/bootstrap.go index d61689694..7f686b99a 100644 --- a/pkg/model/bootstrap.go +++ b/pkg/model/bootstrap.go @@ -29,6 +29,11 @@ func (bs *Bootstrap) GetListeners() []Listener { return bs.StaticResources.Listeners } +// GetListeners +func (bs *Bootstrap) GetPprof() PprofConf { + return bs.StaticResources.PprofConf +} + // ExistCluster func (bs *Bootstrap) ExistCluster(name string) bool { if len(bs.StaticResources.Clusters) > 0 { @@ -46,6 +51,7 @@ func (bs *Bootstrap) ExistCluster(name string) bool { type StaticResources struct { Listeners []Listener `yaml:"listeners" json:"listeners" mapstructure:"listeners"` Clusters []Cluster `yaml:"clusters" json:"clusters" mapstructure:"clusters"` + PprofConf PprofConf `yaml:"pprofConf json:"pprofConf" mapstructure:"pprofConf"` } // DynamicResources TODO diff --git a/pkg/model/pprof.go b/pkg/model/pprof.go new file mode 100644 index 000000000..ce0d1c882 --- /dev/null +++ b/pkg/model/pprof.go @@ -0,0 +1,23 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + */ + +package model + +type PprofConf struct { + Enable bool `yaml:"enable" json:"enable" mapstructure:"enable" default: false` + Addr string `yaml:"addr" json:"addr" mapstructure:"addr" default: "0.0.0.0:6060"` +} diff --git a/pkg/proxy/proxy_start.go b/pkg/proxy/proxy_start.go index 9b87e0d9c..8621ee9f9 100644 --- a/pkg/proxy/proxy_start.go +++ b/pkg/proxy/proxy_start.go @@ -19,6 +19,7 @@ package proxy import ( "encoding/json" + "net/http" "sync" ) @@ -60,6 +61,10 @@ func (p *Proxy) Start() { ls := ListenerService{Listener: &s} go ls.Start() } + + if conf.GetPprof().Enable { + go http.ListenAndServe(conf.GetPprof().Addr, nil) + } } func (p *Proxy) beforeStart() { From 79720dba9f18b0d53243c16496087e907fa9a973 Mon Sep 17 00:00:00 2001 From: "yangqing.xyq" Date: Sat, 26 Sep 2020 11:05:01 +0800 Subject: [PATCH 122/227] add httpclient --- configs/conf.yaml | 2 +- doc/quick_start.md | 2 +- go.mod | 11 +- go.sum | 173 +++++++++++++++- pkg/client/client.go | 38 +++- pkg/client/httpclient/http_client.go | 195 ++++++++++++++++++ pkg/client/httpclient/http_response.go | 165 +++++++++++++++ pkg/common/constant/key.go | 2 +- ...{dubbo_filter.go => remote_call_filter.go} | 17 +- 9 files changed, 591 insertions(+), 14 deletions(-) create mode 100644 pkg/client/httpclient/http_client.go create mode 100644 pkg/client/httpclient/http_response.go rename pkg/filter/{dubbo_filter.go => remote_call_filter.go} (76%) diff --git a/configs/conf.yaml b/configs/conf.yaml index 8a8ebc993..17319534b 100644 --- a/configs/conf.yaml +++ b/configs/conf.yaml @@ -34,7 +34,7 @@ static_resources: config: - name: dgp.filters.http.router config: - - name: dgp.filters.http_transfer_dubbo + - name: dgp.filters.remote_call config: server_name: "test_http_dubbo" generate_request_id: false diff --git a/doc/quick_start.md b/doc/quick_start.md index f13b77cdc..c62488f3c 100644 --- a/doc/quick_start.md +++ b/doc/quick_start.md @@ -6,7 +6,7 @@ - aproxy/configs/client.yml 项目配置 - aproxy/configs/api_config.yaml 里面是Api配置 -另外两个配置文件是 dubbo 的,考虑把必要的参数整到 client.yml 的 dgp.filters.http_transfer_dubbo 这个 filter 的配置里面 +另外两个配置文件是 dubbo 的,考虑把必要的参数整到 client.yml 的 dgp.filters.remote_call 这个 filter 的配置里面 因为现在没有接口配置,暂时接口配置写死在代码 diff --git a/go.mod b/go.mod index 2129b0bd4..d6904d3e8 100644 --- a/go.mod +++ b/go.mod @@ -3,12 +3,19 @@ module github.com/dubbogo/dubbo-go-proxy go 1.14 require ( - github.com/apache/dubbo-go v1.5.1 + github.com/apache/dubbo-go v1.5.0 github.com/ghodss/yaml v1.0.1-0.20190212211648-25d852aebe32 + github.com/gin-gonic/gin v1.6.3 + github.com/go-playground/validator/v10 v10.3.0 // indirect github.com/goinggo/mapstructure v0.0.0-20140717182941-194205d9b4a9 + github.com/golang/protobuf v1.4.2 // indirect + github.com/json-iterator/go v1.1.10 // indirect github.com/pkg/errors v0.9.1 github.com/stretchr/testify v1.5.1 + github.com/ugorji/go v1.1.8 // indirect github.com/urfave/cli v1.22.4 go.uber.org/zap v1.15.0 - gopkg.in/yaml.v2 v2.2.8 + golang.org/x/sys v0.0.0-20200916084744-dbad9cb7cb7a // indirect + google.golang.org/protobuf v1.25.0 // indirect + gopkg.in/yaml.v2 v2.3.0 ) diff --git a/go.sum b/go.sum index 62525845d..14a142da4 100644 --- a/go.sum +++ b/go.sum @@ -11,8 +11,11 @@ cloud.google.com/go/firestore v1.1.0/go.mod h1:ulACoGHTpvq5r8rxGJ4ddJZBZqakUQqCl cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I= cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw= dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= -githu.com/apache/dubbo-getty v1.3.10 h1:ys5mwjPdxG/KwkPjS6EI0RzQtU6p6FCPoKpaFEzpAL0= +github.com/Azure/azure-sdk-for-go v16.0.0+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc= github.com/Azure/azure-sdk-for-go v40.3.0+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc= +github.com/Azure/go-ansiterm v0.0.0-20170929234023-d6e3b3328b78/go.mod h1:LmzpDX56iTiv29bbRTIsUNlaFfuhWRQBWjQdVyAevI8= +github.com/Azure/go-autorest v10.7.0+incompatible/go.mod h1:r+4oMnoxhatjLLJ6zxSWATqVooLgysK6ZNox3g/xq24= +github.com/Azure/go-autorest v10.15.3+incompatible/go.mod h1:r+4oMnoxhatjLLJ6zxSWATqVooLgysK6ZNox3g/xq24= github.com/Azure/go-autorest/autorest v0.9.0/go.mod h1:xyHB1BMZT0cuDHU7I0+g046+BFDTQ8rEZB0s4Yfa6bI= github.com/Azure/go-autorest/autorest v0.9.3/go.mod h1:GsRuLYvwzLjjjRoWEIyMUaYq8GNUx2nRB378IPt/1p0= github.com/Azure/go-autorest/autorest v0.10.0/go.mod h1:/FALq9T/kS7b5J5qsQ+RSTUdAmGFqi0vUdVNNx8q630= @@ -31,18 +34,23 @@ github.com/Azure/go-autorest/autorest/to v0.3.0/go.mod h1:MgwOyqaIuKdG4TL/2ywSsI github.com/Azure/go-autorest/autorest/validation v0.2.0/go.mod h1:3EEqHnBxQGHXRYq3HT1WyXAvT7LLY3tl70hw6tQIbjI= github.com/Azure/go-autorest/logger v0.1.0/go.mod h1:oExouG+K6PryycPJfVSxi/koC6LSNgds39diKLz7Vrc= github.com/Azure/go-autorest/tracing v0.5.0/go.mod h1:r/s2XiOKccPW3HrqB+W0TQzfbtp2fGCgRFtBroKn4Dk= +github.com/BurntSushi/toml v0.3.1 h1:WXkYYl6Yr3qBf1K79EBnL4mak0OimBfB0XUf9Vl28OQ= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= github.com/DataDog/datadog-go v2.2.0+incompatible/go.mod h1:LButxg5PwREeZtORoXG3tL4fMGNddJ+vMq1mwgfaqoQ= github.com/DataDog/datadog-go v3.2.0+incompatible/go.mod h1:LButxg5PwREeZtORoXG3tL4fMGNddJ+vMq1mwgfaqoQ= +github.com/Jeffail/gabs v1.1.0/go.mod h1:6xMvQMK4k33lb7GUUpaAPh6nKMmemQeg5d4gn7/bOXc= github.com/Microsoft/go-winio v0.4.3/go.mod h1:VhR8bwka0BXejwEJY73c50VrPtXAaKcyvVC4A4RozmA= github.com/Microsoft/go-winio v0.4.13/go.mod h1:qXqCSQ3Xa7+6tgxaGTIe4Kpcdsi+P8jBhyzoq1bpyYA= github.com/NYTimes/gziphandler v0.0.0-20170623195520-56545f4a5d46/go.mod h1:3wb06e3pkSAbeQ52E9H9iFoQsEEwGN64994WTCIhntQ= github.com/NYTimes/gziphandler v1.0.1/go.mod h1:3wb06e3pkSAbeQ52E9H9iFoQsEEwGN64994WTCIhntQ= github.com/NYTimes/gziphandler v1.1.1/go.mod h1:n/CVRwUEOgIxrgPvAQhUUr9oeUtvrhMomdKFjzJNB0c= +github.com/Nvveen/Gotty v0.0.0-20120604004816-cd527374f1e5/go.mod h1:lmUJ/7eu/Q8D7ML55dXQrVaamCz2vxCfdQBasLZfHKk= github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= github.com/PuerkitoBio/purell v1.0.0/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= github.com/PuerkitoBio/urlesc v0.0.0-20160726150825-5bd2802263f2/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE= +github.com/SAP/go-hdb v0.12.0/go.mod h1:etBT+FAi1t5k3K3tf5vQTnosgYmhDkRi8jEnQqCnxF0= +github.com/SermoDigital/jose v0.0.0-20180104203859-803625baeddc/go.mod h1:ARgCUhI1MHQH+ONky/PAtmVHQrP5JlGY0F3poXOp/fA= github.com/StackExchange/wmi v0.0.0-20180116203802-5d049714c4a6/go.mod h1:3eOhrUMpNV+6aFIbp5/iudMxNCF27Vw2OZgy4xEx0Fg= github.com/Workiva/go-datastructures v1.0.50 h1:slDmfW6KCHcC7U+LP3DDBbm4fqTwZGn1beOFPfGaLvo= github.com/Workiva/go-datastructures v1.0.50/go.mod h1:Z+F2Rca0qCsVYDS8z7bAGm8f3UkzuWYS/oBZz5a7VVA= @@ -52,8 +60,15 @@ github.com/afex/hystrix-go v0.0.0-20180502004556-fa1af6a1f4f5/go.mod h1:SkGFH1ia github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= github.com/aliyun/alibaba-cloud-sdk-go v1.61.18/go.mod h1:v8ESoHo4SyHmuB4b1tJqDHxfTGEciD+yhvOU/5s1Rfk= +github.com/aliyun/aliyun-oss-go-sdk v0.0.0-20190307165228-86c17b95fcd5/go.mod h1:T/Aws4fEfogEE9v+HPhhw+CntffsBHJ8nXQCwKr0/g8= +github.com/apache/dubbo-getty v1.3.10 h1:ys5mwjPdxG/KwkPjS6EI0RzQtU6p6FCPoKpaFEzpAL0= github.com/apache/dubbo-getty v1.3.10/go.mod h1:x6rraK01BL5C7jUM2fPl5KMkAxLVIx54ZB8/XEOik9Y= +github.com/apache/dubbo-go v1.5.0 h1:S+2Xfw/oiGg44iIe34wWumB6AFsA080tb64llb0bKuc= +github.com/apache/dubbo-go v1.5.0/go.mod h1:eY9FotCshc5y8X7e7MCDNW3wadorSq/3XGaNLtSbcFw= +github.com/apache/dubbo-go v1.5.1 h1:9bcGOkek0+x+zqtvykKpuOwkoJfMef0zNxsyPbWOafY= github.com/apache/dubbo-go v1.5.1/go.mod h1:lxwgtF+27mSFQsSrBLaVbdQpwCp+pBN/mHP4w4/N2Qc= +github.com/apache/dubbo-go-hessian2 v1.6.1 h1:mFKeCZzaCkk4mMOyP+LQ85GHbRyqKT7858KS21JQYA4= +github.com/apache/dubbo-go-hessian2 v1.6.1/go.mod h1:7rEw9guWABQa6Aqb8HeZcsYPHsOS7XT1qtJvkmI6c5w= github.com/apache/dubbo-go-hessian2 v1.6.2 h1:i7F5GjVaUatLQz1x9vUmmSIFj49L8J6rVICdF6xw4qw= github.com/apache/dubbo-go-hessian2 v1.6.2/go.mod h1:7rEw9guWABQa6Aqb8HeZcsYPHsOS7XT1qtJvkmI6c5w= github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o= @@ -63,20 +78,27 @@ github.com/armon/go-metrics v0.0.0-20190430140413-ec5e00d3c878/go.mod h1:3AMJUQh github.com/armon/go-metrics v0.3.0/go.mod h1:zXjbSimjXTd7vOpY8B0/2LpvNvDoXBuplAD+gJD3GYs= github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= github.com/armon/go-radix v1.0.0/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= +github.com/asaskevich/govalidator v0.0.0-20180319081651-7d2e70ef918f/go.mod h1:lB+ZfQJz7igIIfQNfa7Ml4HSf2uFQQRzpGGRXenZAgY= +github.com/aws/aws-sdk-go v1.15.24/go.mod h1:mFuSZ37Z9YOHbQEwBWztmVzqXrEkub65tZoCYDt7FT0= github.com/aws/aws-sdk-go v1.25.41/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= -github.com/bapache/dubbo-getty v1.3.10/go.mod h1:x6rraK01BL5C7jUM2fPl5KMkAxLVIx54ZB8/XEOik9Y= +github.com/baiyubin/aliyun-sts-go-sdk v0.0.0-20180326062324-cfa1a18b161f/go.mod h1:AuiFmCCPBSrqvVMvuqFuk0qogytodnVFVSN5CeJB8Gc= github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= +github.com/bitly/go-hostpool v0.0.0-20171023180738-a3a6125de932/go.mod h1:NOuUCSz6Q9T7+igc/hlvDOUdtWKryOrtFyIVABv/p7k= github.com/bketelsen/crypt v0.0.3-0.20200106085610-5cbc8cc4026c/go.mod h1:MKsuJmJgSg28kpZDP6UIiPt0e0Oz0kqKNGyRaWEPv84= +github.com/bmizerany/assert v0.0.0-20160611221934-b7ed37b82869/go.mod h1:Ekp36dRnpXw/yCqJaO+ZrUyxD+3VXMFFr56k5XYrpB4= github.com/boltdb/bolt v1.3.1/go.mod h1:clJnj/oiGkjum5o1McbSZDSLxVThjynRyGBgiAx27Ps= github.com/buger/jsonparser v0.0.0-20181115193947-bf1c66bbce23/go.mod h1:bbYlZJ7hK1yFx9hf58LP0zeX7UjIGs20ufpu3evjr+s= +github.com/cenkalti/backoff v2.1.1+incompatible/go.mod h1:90ReRw6GdpyfrHakVjL/QHaoyV4aDUVVkXQJJJ3NXXM= +github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= github.com/circonus-labs/circonus-gometrics v2.3.1+incompatible/go.mod h1:nmEj6Dob7S7YxXgwXpfOuvO54S+tGdZdw9fuRZt25Ag= github.com/circonus-labs/circonusllhist v0.1.3/go.mod h1:kMXHVDlOchFAehlya5ePtbp5jckzBHf4XRpQvBOLI+I= github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= github.com/cockroachdb/apd v1.1.0/go.mod h1:8Sl8LxpKi29FqWXR16WEFZRNSz3SoPzUzeMeY4+DwBQ= +github.com/containerd/continuity v0.0.0-20181203112020-004b46473808/go.mod h1:GL3xCUCBDV3CZiTSEKksMWbLE66hEyuu9qyDOOqM47Y= github.com/coredns/coredns v1.1.2/go.mod h1:zASH/MVDgR6XZTbxvOnsZfffS+31vg6Ackf/wo1+AM0= github.com/coreos/bbolt v1.3.2/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk= github.com/coreos/bbolt v1.3.3/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk= @@ -99,6 +121,7 @@ github.com/davecgh/go-spew v0.0.0-20151105211317-5215b55f46b2/go.mod h1:J7Y8YcW2 github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/denisenkom/go-mssqldb v0.0.0-20180620032804-94c9c97e8c9f/go.mod h1:xN/JuLBIz4bjkxNmByTiV1IbhfnYb6oo99phBn4Eqhc= github.com/denverdino/aliyungo v0.0.0-20170926055100-d3308649c661/go.mod h1:dV8lFg6daOBZbT6/BDGIz6Y3WFGn8juu6G+CQ6LHtl0= github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no= @@ -108,12 +131,17 @@ github.com/dimchansky/utfbom v1.1.0/go.mod h1:rO41eb7gLfo8SF1jd9F8HplJm1Fewwi4mQ github.com/dnaeon/go-vcr v1.0.1/go.mod h1:aBB1+wY4s93YsC3HHjMBMrwTj2R9FHDzUr9KyGc8n1E= github.com/docker/go-connections v0.3.0/go.mod h1:Gbd7IOopHjR8Iph03tsViu4nIes5XhDvyHbTtUxmeec= github.com/docker/go-connections v0.4.0/go.mod h1:Gbd7IOopHjR8Iph03tsViu4nIes5XhDvyHbTtUxmeec= +github.com/docker/go-units v0.3.3/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= github.com/docker/spdystream v0.0.0-20160310174837-449fdfce4d96/go.mod h1:Qh8CwZgvJUkLughtfhJv5dyTYa91l1fOUCrgjqmcifM= +github.com/dubbogo/getty v1.3.7 h1:xlkYD2/AH34iGteuLMsGjLl2PwBVrbIhHjf3tlUsv1M= +github.com/dubbogo/getty v1.3.7/go.mod h1:XWO4+wAaMqgnBN9Ykv2YxxOAkGxymg6LGO9RK+EiCDY= github.com/dubbogo/go-zookeeper v1.0.1 h1:irLzvOsDOTNsN8Sv9tvYYxVu6DCQfLtziZQtUHmZgz8= github.com/dubbogo/go-zookeeper v1.0.1/go.mod h1:fn6n2CAEer3novYgk9ULLwAjuV8/g4DdC2ENwRb6E+c= +github.com/dubbogo/gost v1.9.0 h1:UT+dWwvLyJiDotxJERO75jB3Yxgsdy10KztR5ycxRAk= github.com/dubbogo/gost v1.9.0/go.mod h1:pPTjVyoJan3aPxBPNUX0ADkXjPibLo+/Ib0/fADXSG8= github.com/dubbogo/gost v1.9.1 h1:0/PPFo13zPbjt4Ia0zYWMFi3C6rAe9X7O1J2Iv+BHNM= github.com/dubbogo/gost v1.9.1/go.mod h1:pPTjVyoJan3aPxBPNUX0ADkXjPibLo+/Ib0/fADXSG8= +github.com/duosecurity/duo_api_golang v0.0.0-20190308151101-6c680f768e74/go.mod h1:UqXY1lYT/ERa4OEAywUqdok1T4RCRdArkhic1Opuavo= github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= github.com/elazarl/go-bindata-assetfs v0.0.0-20160803192304-e1a2a7ec64b0/go.mod h1:v+YaWX3bdea5J/mo8dSETolEo7R71Vk1u8bnjau5yw4= github.com/elazarl/go-bindata-assetfs v1.0.0/go.mod h1:v+YaWX3bdea5J/mo8dSETolEo7R71Vk1u8bnjau5yw4= @@ -121,11 +149,14 @@ github.com/elazarl/goproxy v0.0.0-20170405201442-c4fc26588b6e/go.mod h1:/Zj4wYkg github.com/emicklei/go-restful v0.0.0-20170410110728-ff4f55a20633/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs= github.com/emicklei/go-restful/v3 v3.0.0/go.mod h1:6n3XBCmQQb25CM2LCACGz8ukIrRry+4bhvbpWn3mrbc= github.com/envoyproxy/go-control-plane v0.8.0/go.mod h1:GSSbY9P1neVhdY7G4wu+IK1rk/dqhiCC/4ExuWJZVuk= +github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/protoc-gen-validate v0.0.14/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= +github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= github.com/evanphx/json-patch v4.2.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= github.com/fastly/go-utils v0.0.0-20180712184237-d95a45783239/go.mod h1:Gdwt2ce0yfBxPvZrHkprdPPTTS3N5rwmLE8T22KBXlw= github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= github.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL+zU= +github.com/fatih/structs v0.0.0-20180123065059-ebf56d35bba7/go.mod h1:9NiDSp5zOcgEDl+j00MP/WkGVPOlPRLejGD8Ga6PJ7M= github.com/fatih/structs v1.1.0/go.mod h1:9NiDSp5zOcgEDl+j00MP/WkGVPOlPRLejGD8Ga6PJ7M= github.com/frankban/quicktest v1.4.1/go.mod h1:36zfPVQyHxymz4cH7wlDmVwDrJuljRB60qkgn7rorfQ= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= @@ -133,10 +164,15 @@ github.com/ghodss/yaml v0.0.0-20150909031657-73d445a93680/go.mod h1:4dBDuWmgqj2H github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= github.com/ghodss/yaml v1.0.1-0.20190212211648-25d852aebe32 h1:Mn26/9ZMNWSw9C9ERFA1PUxfmGpolnw2v0bKOREu5ew= github.com/ghodss/yaml v1.0.1-0.20190212211648-25d852aebe32/go.mod h1:GIjDIg/heH5DOkXY3YJ/wNhfHsQHoXGjl8G8amsYQ1I= +github.com/gin-contrib/sse v0.1.0 h1:Y/yl/+YNO8GZSjAhjMsSuLt29uWRFHdHYUb5lYOV9qE= +github.com/gin-contrib/sse v0.1.0/go.mod h1:RHrZQHXnP2xjPF+u1gW/2HnVO7nvIa9PG3Gm+fLHvGI= +github.com/gin-gonic/gin v1.6.3 h1:ahKqKTFpO5KTPHxWZjEdPScmYaGtLo8Y4DMHoEsnp14= +github.com/gin-gonic/gin v1.6.3/go.mod h1:75u5sXoLsGZoRN5Sgbi1eraJ4GU3++wFwWzhwvtwp4M= github.com/go-asn1-ber/asn1-ber v1.3.1/go.mod h1:hEBeB/ic+5LoWskz+yKT7vGhhPYkProFKoKdwZRWMe0= github.com/go-co-op/gocron v0.1.1/go.mod h1:Y9PWlYqDChf2Nbgg7kfS+ZsXHDTZbMZYPEQ0MILqH+M= github.com/go-errors/errors v1.0.1/go.mod h1:f4zRHt4oKfwPJE5k8C9vpYG+aDHdBFUsgrm6/TyX73Q= github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= +github.com/go-ini/ini v1.25.4/go.mod h1:ByCAeIL28uOIIG0E3PJtZPDL8WnHpFKFOtgjp+3Ies8= github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= github.com/go-ldap/ldap v3.0.2+incompatible/go.mod h1:qfd9rJvER9Q0/D/Sqn1DfHRoBp40uXYvFoEVrNEPqRc= github.com/go-ldap/ldap/v3 v3.1.3/go.mod h1:3rbOH3jRS2u6jg2rJnKAMLE/xQyCKIveG2Sa/Cohzb8= @@ -148,11 +184,22 @@ github.com/go-openapi/jsonpointer v0.0.0-20160704185906-46af16f9f7b1/go.mod h1:+ github.com/go-openapi/jsonreference v0.0.0-20160704190145-13c6e3589ad9/go.mod h1:W3Z9FmVs9qj+KR4zFKmDPGiLdk1D9Rlm7cyMvf57TTg= github.com/go-openapi/spec v0.0.0-20160808142527-6aced65f8501/go.mod h1:J8+jY1nAiCcj+friV/PDoE1/3eeccG9LYBs0tYvLOWc= github.com/go-openapi/swag v0.0.0-20160704191624-1d0bd113de87/go.mod h1:DXUve3Dpr1UfpPtxFw+EFuQ41HhCWZfha5jSVRG7C7I= +github.com/go-playground/assert/v2 v2.0.1/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4= +github.com/go-playground/locales v0.13.0 h1:HyWk6mgj5qFqCT5fjGBuRArbVDfE4hi8+e8ceBS/t7Q= +github.com/go-playground/locales v0.13.0/go.mod h1:taPMhCMXrRLJO55olJkUXHZBHCxTMfnGwq/HNwmWNS8= +github.com/go-playground/universal-translator v0.17.0 h1:icxd5fm+REJzpZx7ZfpaD876Lmtgy7VtROAbHHXk8no= +github.com/go-playground/universal-translator v0.17.0/go.mod h1:UkSxE5sNxxRwHyU+Scu5vgOQjsIJAF8j9muTVoKLVtA= +github.com/go-playground/validator/v10 v10.2.0 h1:KgJ0snyC2R9VXYN2rneOtQcw5aHQB1Vv0sFl1UcHBOY= +github.com/go-playground/validator/v10 v10.2.0/go.mod h1:uOYAAleCW8F/7oMFd6aG0GOhaH6EGOAJShg8Id5JGkI= +github.com/go-playground/validator/v10 v10.3.0 h1:nZU+7q+yJoFmwvNgv/LnPUkwPal62+b2xXj0AU1Es7o= +github.com/go-playground/validator/v10 v10.3.0/go.mod h1:uOYAAleCW8F/7oMFd6aG0GOhaH6EGOAJShg8Id5JGkI= github.com/go-redis/redis v6.15.5+incompatible/go.mod h1:NAIEuMOZ/fxfXJIrKDQDz8wamY7mA7PouImQ2Jvg6kA= github.com/go-resty/resty/v2 v2.1.0/go.mod h1:dZGr0i9PLlaaTD4H/hoZIDjQ+r6xq8mgbRzHZf7f2J8= +github.com/go-sql-driver/mysql v0.0.0-20180618115901-749ddf1598b4/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w= github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= github.com/go-test/deep v1.0.2-0.20181118220953-042da051cf31/go.mod h1:wGDj63lr65AM2AQyKZd/NYHGb0R+1RLqB8NKt3aSFNA= github.com/go-test/deep v1.0.2/go.mod h1:wGDj63lr65AM2AQyKZd/NYHGb0R+1RLqB8NKt3aSFNA= +github.com/gocql/gocql v0.0.0-20180617115710-e06f8c1bcd78/go.mod h1:4Fw1eo5iaEhDUs8XyuhSVCVy52Jq3L+/3GJgYkwc+/0= github.com/gogo/googleapis v1.1.0/go.mod h1:gf4bu3Q80BeJ6H1S1vYPm8/ELATdvryBaNFGgqEef3s= github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4= @@ -172,6 +219,18 @@ github.com/golang/protobuf v0.0.0-20161109072736-4bd1920723d7/go.mod h1:6lQm79b+ github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.3 h1:gyjaxf+svBWX08ZjK86iN9geUJF0H6gp2IRKX6Nf6/I= +github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= +github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= +github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA= +github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs= +github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w= +github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= +github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8= +github.com/golang/protobuf v1.4.2 h1:+Z5KGCizgyZCbGh1KZqA0fcLLkwbsjIzS4aV2v7wJX0= +github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= +github.com/golang/snappy v0.0.0-20170215233205-553a64147049/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/golang/snappy v0.0.1 h1:Qgr9rKW7uDUkrbSmQeiDsGa8SjGyCOGtuasMWwvp2P4= github.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= @@ -179,9 +238,13 @@ github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= +github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-github v17.0.0+incompatible/go.mod h1:zLgOLi98H3fifZn+44m+umXrS52loVEgC2AApnigrVQ= github.com/google/go-querystring v0.0.0-20170111101155-53e6ce116135/go.mod h1:odCYkC5MyYFN7vkCjXpyrEuKhc/BUO6wN/zVPAxq5ck= github.com/google/go-querystring v1.0.0/go.mod h1:odCYkC5MyYFN7vkCjXpyrEuKhc/BUO6wN/zVPAxq5ck= github.com/google/gofuzz v0.0.0-20161122191042-44d81051d367/go.mod h1:HP5RmnzzSNb993RKQDq4+1A4ia9nllfqcQFTQJedwGI= +github.com/google/gofuzz v0.0.0-20170612174753-24818f796faf/go.mod h1:HP5RmnzzSNb993RKQDq4+1A4ia9nllfqcQFTQJedwGI= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= @@ -193,11 +256,15 @@ github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+ github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= github.com/googleapis/gnostic v0.0.0-20170729233727-0c5108395e2d/go.mod h1:sJBsCZ4ayReDTBIg8b9dl28c5xFWyhBTVRp3pOg5EKY= github.com/googleapis/gnostic v0.2.0/go.mod h1:sJBsCZ4ayReDTBIg8b9dl28c5xFWyhBTVRp3pOg5EKY= +github.com/gophercloud/gophercloud v0.0.0-20180828235145-f29afc2cceca/go.mod h1:3WdhXV3rUYy9p6AUW8d94kr+HS62Y4VL9mBnFxsD8q4= github.com/gophercloud/gophercloud v0.1.0/go.mod h1:vxM41WHh5uqHVBMZHzuwNOHh8XEoIEcSTewFxm1c5g8= +github.com/gopherjs/gopherjs v0.0.0-20180825215210-0210a2f0f73c/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= +github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1 h1:EGx4pi6eqNxGaHF6qqu48+N2wcFQ5qg5FXgOdqsJ5d8= github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= github.com/gorilla/websocket v1.4.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= github.com/gorilla/websocket v1.4.2 h1:+/TMaTYc4QFitKJxsQ7Yye35DkWvkdLcvGKqM+x0Ufc= github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= +github.com/gotestyourself/gotestyourself v2.2.0+incompatible/go.mod h1:zZKM6oeNM8k+FRljX1mnzVYeS8wiGgQyvST1/GafPbY= github.com/gregjones/httpcache v0.0.0-20180305231024-9cad4c3443a7/go.mod h1:FecbI9+v66THATjSRHfNgh1IVFe/9kFxbXtjV0ctIMA= github.com/grpc-ecosystem/go-grpc-middleware v1.0.0/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= github.com/grpc-ecosystem/go-grpc-middleware v1.0.1-0.20190118093823-f849b5445de4/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= @@ -205,17 +272,21 @@ github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgf github.com/grpc-ecosystem/grpc-gateway v1.9.0/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= github.com/grpc-ecosystem/grpc-gateway v1.9.5/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= github.com/grpc-ecosystem/grpc-opentracing v0.0.0-20180507213350-8e809c8a8645/go.mod h1:6iZfnjpejD4L/4DwD7NryNaJyCQdzwWwH2MWhCA90Kw= +github.com/hailocab/go-hostpool v0.0.0-20160125115350-e80d13ce29ed/go.mod h1:tMWxXQ9wFIaZeTI9F+hmhFiGpFmhOHzyShyFUhRm0H4= +github.com/hashicorp/consul v1.5.3/go.mod h1:61E2GJCPEP3oq8La7sfDdWGQ66+Zbxzw5ecOdFD7xIE= github.com/hashicorp/consul v1.8.0/go.mod h1:Gg9/UgAQ9rdY3CTvzQZ6g2jcIb7NlIfjI+0pvLk5D1A= github.com/hashicorp/consul/api v1.1.0/go.mod h1:VmuI/Lkw1nC05EYQWNKwWGbkg+FbDBtguAZLlVdkD9Q= github.com/hashicorp/consul/api v1.5.0/go.mod h1:LqwrLNW876eYSuUOo4ZLHBcdKc038txr/IMfbLPATa4= github.com/hashicorp/consul/sdk v0.1.1/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyNV1vwHyQBF0x8= github.com/hashicorp/consul/sdk v0.5.0/go.mod h1:fY08Y9z5SvJqevyZNy6WWPXiG3KwBPAvlcdx16zZ0fM= github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= +github.com/hashicorp/go-bexpr v0.1.0/go.mod h1:ANbpTX1oAql27TZkKVeW8p1w8NTdnyzPe/0qqPCKohU= github.com/hashicorp/go-bexpr v0.1.2/go.mod h1:ANbpTX1oAql27TZkKVeW8p1w8NTdnyzPe/0qqPCKohU= github.com/hashicorp/go-checkpoint v0.0.0-20171009173528-1545e56e46de/go.mod h1:xIwEieBHERyEvaeKF/TcHh1Hu+lxPM+n2vT1+g9I4m4= github.com/hashicorp/go-cleanhttp v0.5.0/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= github.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= github.com/hashicorp/go-connlimit v0.2.0/go.mod h1:OUj9FGL1tPIhl/2RCfzYHrIiWj+VVPGNyVPnUX8AqS0= +github.com/hashicorp/go-discover v0.0.0-20190403160810-22221edb15cd/go.mod h1:ueUgD9BeIocT7QNuvxSyJyPAM9dfifBcaWmeybb67OY= github.com/hashicorp/go-discover v0.0.0-20200501174627-ad1e96bde088/go.mod h1:vZu6Opqf49xX5lsFAu7iFNewkcVF1sn/wyapZh5ytlg= github.com/hashicorp/go-hclog v0.0.0-20180709165350-ff2cf002a8dd/go.mod h1:9bjs9uLqI8l75knNv3lV1kA55veR+WUPSiKIWcQHudI= github.com/hashicorp/go-hclog v0.8.0/go.mod h1:5CU+agLiy3J7N7QjHK5d05KxGsuXiQLrjA0H7acj2lQ= @@ -224,11 +295,13 @@ github.com/hashicorp/go-hclog v0.9.2/go.mod h1:5CU+agLiy3J7N7QjHK5d05KxGsuXiQLrj github.com/hashicorp/go-hclog v0.12.0/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ= github.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= github.com/hashicorp/go-immutable-radix v1.1.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= +github.com/hashicorp/go-memdb v0.0.0-20180223233045-1289e7fffe71/go.mod h1:kbfItVoBJwCfKXDXN4YoAXjxcFVZ7MRrJzyTX6H4giE= github.com/hashicorp/go-memdb v1.0.3/go.mod h1:LWQ8R70vPrS4OEY9k28D2z8/Zzyu34NVzeRibGAzHO0= github.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM= github.com/hashicorp/go-msgpack v0.5.5/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM= github.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk= github.com/hashicorp/go-multierror v1.1.0/go.mod h1:spPvp8C1qA32ftKqdAHm4hHTbPw+vmowP0z+KUhOZdA= +github.com/hashicorp/go-plugin v0.0.0-20180331002553-e8d22c780116/go.mod h1:JSqWYsict+jzcj0+xElxyrBQRPNoiWQuddnxArJ7XHQ= github.com/hashicorp/go-plugin v1.0.1/go.mod h1:++UyYGoz3o5w9ZzAdZxtQKrWWP+iqPBn3cQptSMzBuY= github.com/hashicorp/go-raftchunking v0.6.1/go.mod h1:cGlg3JtDy7qy6c/3Bu660Mic1JF+7lWqIwCFSb08fX0= github.com/hashicorp/go-raftchunking v0.6.3-0.20191002164813-7e9e8525653a/go.mod h1:xbXnmKqX9/+RhPkJ4zrEx4738HacP72aaUPlT2RZ4sU= @@ -245,18 +318,21 @@ github.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/b github.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= github.com/hashicorp/go-uuid v1.0.2-0.20191001231223-f32f5fe8d6a8/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= github.com/hashicorp/go-uuid v1.0.2/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= +github.com/hashicorp/go-version v0.0.0-20170202080759-03c5bf6be031/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= github.com/hashicorp/go-version v1.1.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= github.com/hashicorp/go-version v1.2.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= github.com/hashicorp/go.net v0.0.1/go.mod h1:hjKkEWcCURg++eb33jQU7oqQcI9XDCnUzHA0oac0k90= github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= github.com/hashicorp/golang-lru v0.5.3/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= +github.com/hashicorp/hcl v0.0.0-20180906183839-65a6292f0157/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= github.com/hashicorp/hil v0.0.0-20160711231837-1e86c6b523c5/go.mod h1:KHvg/R2/dPtaePb16oW4qIyzkMxXOL38xjRN64adsts= github.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64= github.com/hashicorp/mdns v1.0.0/go.mod h1:tL+uN++7HEJ6SQLQ2/p+z2pH24WQKWjBPkE0mNTz8vQ= github.com/hashicorp/mdns v1.0.1/go.mod h1:4gW7WsVCke5TE7EPeYliwHlRUyBtfCwuFwuMg2DmyNY= github.com/hashicorp/memberlist v0.1.3/go.mod h1:ajVTdAv/9Im8oMAAj5G31PhhMCZJV2pPBoIllUwCN7I= +github.com/hashicorp/memberlist v0.1.4/go.mod h1:ajVTdAv/9Im8oMAAj5G31PhhMCZJV2pPBoIllUwCN7I= github.com/hashicorp/memberlist v0.2.0/go.mod h1:MS2lj3INKhZjWNqd3N0m3J+Jxf3DAOnAH9VT3Sh9MUE= github.com/hashicorp/memberlist v0.2.2/go.mod h1:MS2lj3INKhZjWNqd3N0m3J+Jxf3DAOnAH9VT3Sh9MUE= github.com/hashicorp/net-rpc-msgpackrpc v0.0.0-20151116020338-a14192a58a69/go.mod h1:/z+jUGRBlwVpUZfjute9jWaF6/HuhjuFQuL1YXzVD1Q= @@ -267,6 +343,8 @@ github.com/hashicorp/raft-boltdb v0.0.0-20171010151810-6e5ba93211ea/go.mod h1:pN github.com/hashicorp/serf v0.8.2/go.mod h1:6hOLApaqBFA1NXqRQAsxw9QxuDEvNxSQRwA/JwenrHc= github.com/hashicorp/serf v0.9.0/go.mod h1:YL0HO+FifKOW2u1ke99DGVu1zhcpZzNwrLIqBC7vbYU= github.com/hashicorp/serf v0.9.2/go.mod h1:UWDWwZeL5cuWDJdl0C6wrvrUwEqtQ4ZKBKKENpqIUyk= +github.com/hashicorp/vault v0.10.3/go.mod h1:KfSyffbKxoVyspOdlaGVjIuwLobi07qD1bAbosPMpP0= +github.com/hashicorp/vault-plugin-secrets-kv v0.0.0-20190318174639-195e0e9d07f1/go.mod h1:VJHHT2SC1tAPrfENQeBhLlb5FbZoKZM+oC/ROmEftz0= github.com/hashicorp/vault/api v1.0.4/go.mod h1:gDcqh3WGcR1cpF5AJz/B1UFheUEneMoIospckxBxk6Q= github.com/hashicorp/vault/api v1.0.5-0.20191108163347-bdd38fca2cff/go.mod h1:Uf8LaHyrYsgVgHzO2tMZKhqRGlL3UJ6XaSwW2EA1Iqo= github.com/hashicorp/vault/sdk v0.1.13/go.mod h1:B+hVj7TpuQY1Y/GPbCpffmgd+tSEwvhkWnjtSYCaS2M= @@ -282,9 +360,11 @@ github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANyt github.com/jackc/fake v0.0.0-20150926172116-812a484cc733/go.mod h1:WrMFNQdiFJ80sQsxDoMokWK1W5TQtxBFNpzWTD84ibQ= github.com/jackc/pgx v3.3.0+incompatible/go.mod h1:0ZGrqGqkRlliWnWB4zKnWtjbSWbGkVEFm4TeybAXq+I= github.com/jarcoal/httpmock v0.0.0-20180424175123-9c70cfe4a1da/go.mod h1:ks+b9deReOc7jgqp+e7LuFiCBH6Rm5hL32cLcEAArb4= +github.com/jefferai/jsonx v0.0.0-20160721235117-9cc31c3135ee/go.mod h1:N0t2vlmpe8nyZB5ouIbJQPDSR+mH6oe7xHB9VZHSUzM= github.com/jehiah/go-strftime v0.0.0-20171201141054-1d33003b3869/go.mod h1:cJ6Cj7dQo+O6GJNiMx+Pa94qKj+TG8ONdKHgMNIyyag= github.com/jinzhu/copier v0.0.0-20190625015134-976e0346caa8 h1:mGIXW/lubQ4B+3bXTLxcTMTjUNDqoF6T/HUW9LbFx9s= github.com/jinzhu/copier v0.0.0-20190625015134-976e0346caa8/go.mod h1:yL958EeXv8Ylng6IfnvG4oflryUi3vgA3xPs9hmII1s= +github.com/jmespath/go-jmespath v0.0.0-20160202185014-0b12d6b521d8/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k= github.com/jmespath/go-jmespath v0.0.0-20180206201540-c2b33e8439af/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k= github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo= github.com/joyent/triton-go v0.0.0-20180628001255-830d2b111e62/go.mod h1:U+RSyWxWd04xTqnuOQxnai7XGS2PrPY2cfGoDKtMHjA= @@ -293,22 +373,40 @@ github.com/json-iterator/go v0.0.0-20180612202835-f2b4162afba3/go.mod h1:+SdeFBv github.com/json-iterator/go v1.1.5/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= github.com/json-iterator/go v1.1.7/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= +github.com/json-iterator/go v1.1.9 h1:9yzud/Ht36ygwatGx56VwCZtlI/2AD15T1X2sjSuGns= +github.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= +github.com/json-iterator/go v1.1.10 h1:Kz6Cvnvv2wGdaG/V8yMvfkmNiXq9Ya2KUv4rouJJr68= +github.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= +github.com/jtolds/gls v4.2.1+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= +github.com/jtolds/gls v4.20.0+incompatible h1:xdiiI2gbIgH/gLH7ADydsJ1uDOEzR8yvV7C0MuV77Wo= github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= +github.com/juju/errors v0.0.0-20190930114154-d42613fe1ab9 h1:hJix6idebFclqlfZCHE7EUX7uqLCyb70nHNHH1XKGBg= +github.com/juju/errors v0.0.0-20190930114154-d42613fe1ab9/go.mod h1:W54LbzXuIE0boCoNJfwqpmkKJ1O4TCTZMetAt6jGk7Q= +github.com/juju/loggo v0.0.0-20190526231331-6e530bcce5d8 h1:UUHMLvzt/31azWTN/ifGWef4WUqvXk0iRqdhdy/2uzI= +github.com/juju/loggo v0.0.0-20190526231331-6e530bcce5d8/go.mod h1:vgyd7OREkbtVEN/8IXZe5Ooef3LQePvuBm9UWj6ZL8U= +github.com/juju/testing v0.0.0-20191001232224-ce9dec17d28b h1:Rrp0ByJXEjhREMPGTt3aWYjoIsUGCbt21ekbeJcTWv0= +github.com/juju/testing v0.0.0-20191001232224-ce9dec17d28b/go.mod h1:63prj8cnj0tU0S9OHjGJn+b1h0ZghCndfnbQolrYTwA= github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= +github.com/keybase/go-crypto v0.0.0-20180614160407-5114a9a81e1b/go.mod h1:ghbZscTyKdM07+Fw3KSi0hcJm+AlEUWj8QLlPtijN/M= github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q= github.com/kisielk/errcheck v1.2.0/go.mod h1:/BMXB+zMLi60iA8Vv6Ksmxu/1UDYcXs4uQLJ+jE2L00= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/konsorten/go-windows-terminal-sequences v1.0.2/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= +github.com/kr/pretty v0.1.0 h1:L/CwN0zerZDmRFUapSPitk6f+Q3+0za1rQkzVuMiMFI= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= +github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= +github.com/leodido/go-urn v1.2.0 h1:hpXL4XnriNwQ/ABnpepYM/1vCLWNDfUNts8dX3xTG6Y= +github.com/leodido/go-urn v1.2.0/go.mod h1:+8+nEpDfqqsY+g338gtMEUOtuK+4dEMhiQEgxpxOKII= github.com/lestrrat/go-envload v0.0.0-20180220120943-6ed08b54a570/go.mod h1:BLt8L9ld7wVsvEWQbuLrUZnCMnUmLZ+CGDzKtclrTlE= github.com/lestrrat/go-file-rotatelogs v0.0.0-20180223000712-d3151e2a480f/go.mod h1:UGmTpUd3rjbtfIpwAPrcfmGf/Z1HS95TATB+m57TPB8= github.com/lestrrat/go-strftime v0.0.0-20180220042222-ba3bf9c1d042/go.mod h1:TPpsiPUEh0zFL1Snz4crhMlBe60PYxRHr5oFF3rRYg0= +github.com/lib/pq v0.0.0-20180523175426-90697d60dd84/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= github.com/lib/pq v1.1.1/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= github.com/linode/linodego v0.7.1/go.mod h1:ga11n3ivecUrPCHN0rANxKmfWBJVkOXfLMZinAbj2sY= github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= @@ -322,6 +420,7 @@ github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNx github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= github.com/mattn/go-isatty v0.0.10/go.mod h1:qgIWMr58cqv1PHHyhnkY9lrL7etaEgOFcMEpPG5Rm84= github.com/mattn/go-isatty v0.0.11/go.mod h1:PhnuNfih5lzO57/f3n+odYbM4JtupLOxQOAqxQCu2WE= +github.com/mattn/go-isatty v0.0.12 h1:wuysRhFDzyxgEmMf5xjvJ2M9dZoWAXNNr5LSBS7uHXY= github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= github.com/mattn/go-runewidth v0.0.3/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= @@ -341,6 +440,7 @@ github.com/mitchellh/hashstructure v0.0.0-20170609045927-2bca23e0e452/go.mod h1: github.com/mitchellh/hashstructure v1.0.0/go.mod h1:QjSHrPWS+BGUVBYkbTZWEnOh3G1DutKwClXU/ABz6AQ= github.com/mitchellh/iochan v1.0.0/go.mod h1:JwYml1nuB7xOzsp52dPpHFffvOCDupsG0QubkSMEySY= github.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= +github.com/mitchellh/mapstructure v1.1.2 h1:fmNYVwqnSfB9mZU6OS2O6GsXM+wcskZDuKQzvN1EDeE= github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= github.com/mitchellh/mapstructure v1.2.3 h1:f/MjBEBDLttYCGfRaKBbKSRVF5aV2O6fnBpzknuE3jU= github.com/mitchellh/mapstructure v1.2.3/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= @@ -352,12 +452,15 @@ github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/reflect2 v0.0.0-20180320133207-05fbef0ca5da/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= +github.com/modern-go/reflect2 v1.0.1 h1:9f412s+6RmYXLWZSEzVVgPGK7C2PphHj5RJrvfx9AWI= github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= github.com/munnerz/goautoneg v0.0.0-20120707110453-a547fc61f48d/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= github.com/mxk/go-flowrate v0.0.0-20140419014527-cca7078d478f/go.mod h1:ZdcZmHo+o7JKHSa8/e818NopupXU1YMK5fe1lsApnBw= +github.com/nacos-group/nacos-sdk-go v0.3.3-0.20200617023039-50c7537d6a5f/go.mod h1:fti1GlX/EB6RDKvzK/P7Vuibqj0JMPJHQwrcTU1tLXk= github.com/nacos-group/nacos-sdk-go v1.0.0/go.mod h1:hlAPn3UdzlxIlSILAyOXKxjFSvDJ9oLzTJ9hLAK1KzA= github.com/nicolai86/scaleway-sdk v1.10.2-0.20180628010248-798f60e20bb2/go.mod h1:TLb2Sg7HQcgGdloNxkrmtgDNR9uVYF3lfdFIN4Ro6Sk= +github.com/oklog/run v0.0.0-20180308005104-6934b124db28/go.mod h1:dlhp/R75TPv97u0XWUtDeV/lRKWPKSdTuV0TZvrmrQA= github.com/oklog/run v1.0.0/go.mod h1:dlhp/R75TPv97u0XWUtDeV/lRKWPKSdTuV0TZvrmrQA= github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U= github.com/olekukonko/tablewriter v0.0.0-20180130162743-b8a9be070da4/go.mod h1:vsDQFd/mU46D+Z4whnwzcISnGGzXWMclvtLoiIKAKIo= @@ -366,13 +469,20 @@ github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+W github.com/onsi/ginkgo v1.8.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.10.1/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/gomega v0.0.0-20170829124025-dcabb60a477c/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= +github.com/onsi/gomega v1.4.1/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= +github.com/onsi/gomega v1.4.2/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= github.com/onsi/gomega v1.5.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= github.com/onsi/gomega v1.7.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= +github.com/opencontainers/go-digest v1.0.0-rc1/go.mod h1:cMLVZDEM3+U2I4VmLI6N8jQYUd2OVphdqWwCJHrFt2s= +github.com/opencontainers/image-spec v1.0.1/go.mod h1:BtxoFyWECRxE4U/7sNtV5W15zMzWCbyJoFRP3s7yZA0= +github.com/opencontainers/runc v0.1.1/go.mod h1:qT5XzbpPznkRYVz/mWwUaVBUv2rmF59PVA73FjuZG0U= github.com/opentracing/opentracing-go v1.1.0 h1:pWlfV3Bxv7k65HYwkikxat0+s3pV4bsqf19k25Ur8rU= github.com/opentracing/opentracing-go v1.1.0/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= +github.com/ory/dockertest v3.3.4+incompatible/go.mod h1:1vX4m9wsvi00u5bseYwXaSnhNrne+V0E6LAcBILJdPs= github.com/packethost/packngo v0.1.1-0.20180711074735-b9cb5096f54c/go.mod h1:otzZQXgoO96RTzDB/Hycg0qZcXZsWJGJRSXbmEIJ+4M= github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= github.com/pascaldekloe/goe v0.1.0/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= +github.com/patrickmn/go-cache v0.0.0-20180527043350-9f6ff22cfff8/go.mod h1:3Qf8kWWT7OJRJbdiICTKqZju1ZixQ/KpMGzzAfe6+WQ= github.com/patrickmn/go-cache v2.1.0+incompatible/go.mod h1:3Qf8kWWT7OJRJbdiICTKqZju1ZixQ/KpMGzzAfe6+WQ= github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= github.com/peterbourgon/diskv v2.0.1+incompatible/go.mod h1:uqqh8zWWbv1HBMNONnaR/tNboyR3/BZd58JJSHlUSCU= @@ -395,6 +505,7 @@ github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5Fsn github.com/prometheus/client_golang v1.1.0/go.mod h1:I1FGZT9+L76gKKOs5djB6ezCbFQP1xR9D75/vuwEF3g= github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/common v0.0.0-20181113130724-41aa239b4cce/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= github.com/prometheus/common v0.0.0-20181126121408-4724e9255275/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= github.com/prometheus/common v0.4.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= @@ -417,6 +528,7 @@ github.com/russross/blackfriday/v2 v2.0.1 h1:lPqVAte+HuHNfhJ/0LC98ESWRz8afy9tM/0 github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= github.com/ryanuber/columnize v2.1.0+incompatible/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= +github.com/ryanuber/go-glob v0.0.0-20170128012129-256dc444b735/go.mod h1:807d1WSdnB0XRJzKNil9Om6lcp/3a0v4qIHxIXzX/Yc= github.com/ryanuber/go-glob v1.0.0/go.mod h1:807d1WSdnB0XRJzKNil9Om6lcp/3a0v4qIHxIXzX/Yc= github.com/satori/go.uuid v1.2.0/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0= github.com/satori/go.uuid v1.2.1-0.20181028125025-b2ce2384e17b h1:gQZ0qzfKHQIybLANtM3mBXNUtOfsCFXeTsnBqCsx1KM= @@ -434,8 +546,13 @@ github.com/sirupsen/logrus v1.0.6/go.mod h1:pMByvHTf9Beacp5x1UXfOR9xyW/9antXMhjM github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= github.com/sirupsen/logrus v1.4.1/go.mod h1:ni0Sbl8bgC9z8RoU9G6nDWqqs/fq4eDPysMBDgk/93Q= github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= +github.com/smartystreets/assertions v0.0.0-20180820201707-7c9eb446e3cf/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= +github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d h1:zE9ykElWQ6/NYmHa3jpm/yHnI4xSofP+UP6SpjHcSeM= github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= +github.com/smartystreets/goconvey v0.0.0-20180222194500-ef6db91d284a/go.mod h1:XDJAKZRPZ1CvBcN2aX5YOUTYGHki24fSF0Iv48Ibg0s= github.com/smartystreets/goconvey v0.0.0-20190330032615-68dc04aab96a/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= +github.com/smartystreets/goconvey v0.0.0-20190710185942-9d28bd7c0945 h1:N8Bg45zpk/UcpNGnfJt2y/3lRWASHNTUET8owPYCgYI= +github.com/smartystreets/goconvey v0.0.0-20190710185942-9d28bd7c0945/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= github.com/softlayer/softlayer-go v0.0.0-20180806151055-260589d94c7d/go.mod h1:Cw4GTlQccdRGSEf6KiMju767x0NEHE0YIVPJSaXjlsw= github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM= @@ -447,12 +564,14 @@ github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkU github.com/spf13/cobra v0.0.5/go.mod h1:3K3wKZymM7VvHMDS9+Akkh4K60UwM26emMESw8tLCHU= github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo= github.com/spf13/pflag v0.0.0-20170130214245-9ff6c6923cff/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= +github.com/spf13/pflag v1.0.2/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= github.com/spf13/viper v1.3.2/go.mod h1:ZiWeW+zYFKm7srdB9IoDzzZXaJaI5eL9QjNiN/DMA2s= github.com/spf13/viper v1.4.0/go.mod h1:PTJ7Z/lr49W6bUbkmS1V3by4uWynFiR9p7+dSq/yZzE= github.com/spf13/viper v1.7.0/go.mod h1:8WkrPz2fc9jxqZNCJI/76HCieCp4Q8HaLFoCha5qpdg= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/objx v0.1.1 h1:2vfRuCMp5sSVIDSqO8oNnWJq7mPa6KVP3iPIwFBuy8A= github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE= github.com/stretchr/testify v0.0.0-20151208002404-e3a8ff8ce365/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= @@ -465,19 +584,29 @@ github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69 github.com/tebeka/strftime v0.1.3/go.mod h1:7wJm3dZlpr4l/oVK0t1HYIc4rMzQ2XJlOMIUJUJH6XQ= github.com/tencentcloud/tencentcloud-sdk-go v3.0.83+incompatible/go.mod h1:0PfYow01SHPMhKY31xa+EFz2RStxIqj6JFAJS+IkCi4= github.com/tent/http-link-go v0.0.0-20130702225549-ac974c61c2f9/go.mod h1:RHkNRtSLfOK7qBTHaeSX1D6BNpI3qw7NTxsmNr4RvN8= +github.com/tevid/gohamcrest v1.1.1 h1:ou+xSqlIw1xfGTg1uq1nif/htZ2S3EzRqLm2BP+tYU0= github.com/tevid/gohamcrest v1.1.1/go.mod h1:3UvtWlqm8j5JbwYZh80D/PVBt0mJ1eJiYgZMibh0H/k= github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= github.com/toolkits/concurrent v0.0.0-20150624120057-a4371d70e3e3/go.mod h1:QDlpd3qS71vYtakd2hmdpqhJ9nwv6mD6A30bQ1BPBFE= github.com/tv42/httpunix v0.0.0-20150427012821-b75d8614f926/go.mod h1:9ESjWnEqriFuLhtthL60Sar/7RFoluCcXsuvEwTV5KM= github.com/ugorji/go v1.1.4/go.mod h1:uQMGLiO92mf5W77hV/PUCpI3pbzQx3CRekS0kk+RGrc= +github.com/ugorji/go v1.1.7 h1:/68gy2h+1mWMrwZFeD1kQialdSzAb432dtpeJ42ovdo= +github.com/ugorji/go v1.1.7/go.mod h1:kZn38zHttfInRq0xu/PH0az30d+z6vm202qpg1oXVMw= +github.com/ugorji/go v1.1.8 h1:/D9x7IRpfMHDlizVOgxrag5Fh+/NY+LtI8bsr+AswRA= +github.com/ugorji/go v1.1.8/go.mod h1:0lNM99SwWUIRhCXnigEMClngXBk/EmpTXa7mgiewYWA= github.com/ugorji/go/codec v0.0.0-20181204163529-d75b2dcb6bc8/go.mod h1:VFNgLljTbGfSG7qAOspJ7OScBnGdDN/yBr0sguwnwf0= +github.com/ugorji/go/codec v1.1.7 h1:2SvQaVZ1ouYrrKKwoSk2pzd4A9evlKJb9oTL+OaLUSs= +github.com/ugorji/go/codec v1.1.7/go.mod h1:Ax+UKWsSmolVDwsd+7N3ZtXu+yMGCf907BLYF3GoBXY= +github.com/ugorji/go/codec v1.1.8 h1:4dryPvxMP9OtkjIbuNeK2nb27M38XMHLGlfNSNph/5s= +github.com/ugorji/go/codec v1.1.8/go.mod h1:X00B19HDtwvKbQY2DcYjvZxKQp8mzrJoQ6EgoIY/D2E= github.com/urfave/cli v1.22.4 h1:u7tSpNPPswAFymm8IehJhy4uJMlUuU/GmqSkvJ1InXA= github.com/urfave/cli v1.22.4/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= github.com/vmware/govmomi v0.18.0/go.mod h1:URlwyTFZX72RmxtxuaFL2Uj3fD1JTvZdx59bHWk6aFU= github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU= github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q= +github.com/zouyx/agollo v0.0.0-20191114083447-dde9fc9f35b8 h1:k8TV7Gz7cpWpOw/dz71fx8cCZdWoPuckHJ/wkJl+meg= +github.com/zouyx/agollo v0.0.0-20191114083447-dde9fc9f35b8/go.mod h1:S1cAa98KMFv4Sa8SbJ6ZtvOmf0VlgH0QJ1gXI0lBfBY= github.com/zouyx/agollo/v3 v3.4.4/go.mod h1:ag0XmE1r4iAgPd6PUnU9TJ0DMEjM1VKX1HUNqQJ2ywU= -githubm/.com/apache/dubbo-go v1.5.1 h1:9bcGOkek0+x+zqtvykKpuOwkoJfMef0zNxsyPbWOafY= go.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= go.etcd.io/bbolt v1.3.4/go.mod h1:G5EMThwa9y8QZGBClrRx5EY+Yw9kAhnjy3bSjsnlVTQ= go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= @@ -488,6 +617,7 @@ go.uber.org/atomic v1.6.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= go.uber.org/multierr v1.5.0 h1:KCa4XfM8CWFCpxXRGok+Q0SS/0XBhMDbHHGABQLvD2A= go.uber.org/multierr v1.5.0/go.mod h1:FeouvMocqHpRaaGuG9EjoKcStLC43Zu/fmqdUMPcKYU= +go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee h1:0mgffUl7nfd+FpvXMVz4IDEaUSmT1ysygQC7qYo7sG4= go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee/go.mod h1:vJERXedbb3MVM5f9Ejo0C68/HhF8uaILCdgjnY+goOA= go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= go.uber.org/zap v1.15.0 h1:ZZCA22JRF2gQE5FoNmhmrf7jeJJ2uhqDUNRYKm8dvmM= @@ -497,6 +627,7 @@ golang.org/x/crypto v0.0.0-20181029021203-45a5f77698d3/go.mod h1:6SG95UA2DQfeDnf golang.org/x/crypto v0.0.0-20181203042331-505ab145d0a9/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20190211182817-74369b46fc67/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20190325154230-a5d413f7728c/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190611184440-5c40567a22f8/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= @@ -516,6 +647,7 @@ golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTk golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= golang.org/x/lint v0.0.0-20190409202823-959b441ac422/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= golang.org/x/lint v0.0.0-20190909230951-414d861bb4ac/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20190930215403-16217165b5de h1:5hukYrvBGR8/eNkX5mdUezrA6JiaEZDtJb9Ei+1LlBs= golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE= golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o= @@ -543,6 +675,7 @@ golang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLL golang.org/x/net v0.0.0-20190923162816-aa69164e4478/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20191004110552-13f9640d40b9/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/oauth2 v0.0.0-20170807180024-9a379c6b3e95/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= @@ -584,13 +717,17 @@ golang.org/x/sys v0.0.0-20191008105621-543471e840be/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200124204421-9fbb57f87de9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5 h1:LfCXLvNmTYH9kEmVgqbnsWfruoXZIrh4YBgqVHtDvw0= golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200916084744-dbad9cb7cb7a h1:chkwkn8HYWVtTE5DCQNKYlkyptadXYY0+PuyaVdyMo4= +golang.org/x/sys v0.0.0-20200916084744-dbad9cb7cb7a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/text v0.0.0-20160726164857-2910a502d2bf/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.1-0.20181227161524-e6919f6577db/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= +golang.org/x/time v0.0.0-20180412165947-fbb02b2291d2/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= @@ -614,9 +751,12 @@ golang.org/x/tools v0.0.0-20190907020128-2ca718005c18/go.mod h1:b+2E5dAYhXwXZwtn golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191029041327-9cc4af7d6b2c/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191029190741-b9c20aec41a5 h1:hKsoRgsbwY1NafxrwTs+k64bikrLBkAgPir1TNCj3Zs= golang.org/x/tools v0.0.0-20191029190741-b9c20aec41a5/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191112195655-aa38f8e97acc/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +google.golang.org/api v0.0.0-20180829000535-087779f1d2c9/go.mod h1:4mhQ8q/RsB7i+udVvVy5NUi08OU8ZlA0gRVgrF7VFY0= google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M= google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= @@ -638,6 +778,7 @@ google.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98 google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= google.golang.org/genproto v0.0.0-20190911173649-1774047e7e51/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8= google.golang.org/genproto v0.0.0-20191108220845-16a3f7862a1a/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= google.golang.org/grpc v1.14.0/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= google.golang.org/grpc v1.19.1/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= @@ -645,11 +786,25 @@ google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiq google.golang.org/grpc v1.21.0/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= google.golang.org/grpc v1.22.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= +google.golang.org/grpc v1.22.1/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= +google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= +google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= +google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= +google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= +google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE= +google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo= +google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= +google.golang.org/protobuf v1.23.0 h1:4MY060fB1DLGMB/7MBTLnwQUY6+F09GEiz6SsrNqyzM= +google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= +google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= +google.golang.org/protobuf v1.25.0 h1:Ejskq+SyPohKW+1uil0JJMtmHCgJPJ/qWTxr8qp+R4c= +google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= gopkg.in/airbrake/gobrake.v2 v2.0.9/go.mod h1:/h5ZAUhDkGaJfjzjKLSjv6zCL6O0LLBxU4K+aSYdM/U= gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= gopkg.in/asn1-ber.v1 v1.0.0-20181015200546-f715ec2f112d/go.mod h1:cuepJuh7vyXfUyUwEgHQXw849cJrilpS5NeIjOWESAw= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127 h1:qIbj1fsPNlZgppZ+VLlY7N33q108Sa+fhmuc+sWQYwY= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= @@ -658,6 +813,9 @@ gopkg.in/gemnasium/logrus-airbrake-hook.v2 v2.1.2/go.mod h1:Xk6kEKp8OKb+X14hQBKW gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= gopkg.in/ini.v1 v1.42.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= gopkg.in/ini.v1 v1.51.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= +gopkg.in/mgo.v2 v2.0.0-20160818020120-3f83fa500528 h1:/saqWwm73dLmuzbNhe92F0QsZ/KiFND+esHco2v1hiY= +gopkg.in/mgo.v2 v2.0.0-20160818020120-3f83fa500528/go.mod h1:yeKp02qBN3iKW1OzL3MGk2IdtZzaj7SFntXj72NppTA= +gopkg.in/ory-am/dockertest.v3 v3.3.4/go.mod h1:s9mmoLkaGeAh97qygnNj4xWkiN7e1SKekYC6CovU+ek= gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo= gopkg.in/square/go-jose.v2 v2.3.1/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI= gopkg.in/square/go-jose.v2 v2.4.1/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI= @@ -668,15 +826,24 @@ gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.8 h1:obN1ZagJSUGI0Ek/LBmuj4SNLPfIny3KsKFopxRdj10= gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.3.0 h1:clyUAQHOM3G0M3f5vQj7LuJrETvjVot3Z5el9nffUtU= +gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gotest.tools v2.2.0+incompatible/go.mod h1:DsYFclhRJ6vuDpmuTbkuFWG+y2sxOXAzmJt81HFBacw= honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.1-2019.2.3 h1:3JgtbtFHMiCmsznwGVTUWbgGov+pVqnlf1dEJTNAXeM= honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= istio.io/gogo-genproto v0.0.0-20190124151557-6d926a6e6feb/go.mod h1:eIDJ6jNk/IeJz6ODSksHl5Aiczy5JUq6vFhJWI5OtiI= +k8s.io/api v0.0.0-20180806132203-61b11ee65332/go.mod h1:iuAfoD4hCxJ8Onx9kaTIt30j7jUFS00AXQi6QMi99vA= +k8s.io/api v0.0.0-20190325185214-7544f9db76f6/go.mod h1:iuAfoD4hCxJ8Onx9kaTIt30j7jUFS00AXQi6QMi99vA= k8s.io/api v0.16.9/go.mod h1:Y7dZNHs1Xy0mSwSlzL9QShi6qkljnN41yR8oWCRTDe8= +k8s.io/apimachinery v0.0.0-20180821005732-488889b0007f/go.mod h1:ccL7Eh7zubPUSh9A3USN90/OzHNSVN6zxzde07TDCL0= +k8s.io/apimachinery v0.0.0-20190223001710-c182ff3b9841/go.mod h1:ccL7Eh7zubPUSh9A3USN90/OzHNSVN6zxzde07TDCL0= k8s.io/apimachinery v0.16.9/go.mod h1:Xk2vD2TRRpuWYLQNM6lT9R7DSFZUYG03SarNkbGrnKE= k8s.io/client-go v0.16.9/go.mod h1:ThjPlh7Kx+XoBFOCt775vx5J7atwY7F/zaFzTco5gL0= +k8s.io/client-go v8.0.0+incompatible/go.mod h1:7vJpHMYJwNQCWgzmNV+VYUl1zCObLyodBc8nIyt8L5s= k8s.io/gengo v0.0.0-20190128074634-0689ccc1d7d6/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0= k8s.io/klog v0.0.0-20181102134211-b9b56d5dfc92/go.mod h1:Gq+BEi5rUBO/HRz0bTSXDUcqjScdoY3a9IHpCEIOOfk= k8s.io/klog v0.3.0/go.mod h1:Gq+BEi5rUBO/HRz0bTSXDUcqjScdoY3a9IHpCEIOOfk= diff --git a/pkg/client/client.go b/pkg/client/client.go index 53c51ddd0..5d975e052 100644 --- a/pkg/client/client.go +++ b/pkg/client/client.go @@ -1,8 +1,44 @@ package client +import ( + "errors" + "github.com/dubbogo/dubbo-go-proxy/pkg/client/dubbo" + "github.com/dubbogo/dubbo-go-proxy/pkg/client/httpclient" + "github.com/dubbogo/dubbo-go-proxy/pkg/model" + _ "github.com/gin-gonic/gin" + "sync" +) + type Client interface { Init() error Close() error - Call(req *Request) (resp Response, err error) } + +type ClientPool struct { + poolMap map[model.ApiType]*sync.Pool +} + +func (pool *ClientPool) getClient(t model.ApiType) (Client, error) { + if pool.poolMap[t] != nil { + return pool.poolMap[t].Get().(Client), nil + } + return nil, errors.New("protocol not supported yet") +} + +func NewClientPool() *ClientPool { + clientPool := &ClientPool{ + poolMap: make(map[model.ApiType]*sync.Pool), + } + clientPool.poolMap[model.DUBBO] = &sync.Pool{ + New: func() interface{} { + return dubbo.NewDubboClient() + }, + } + clientPool.poolMap[model.REST] = &sync.Pool{ + New: func() interface{} { + return httpclient.NewHttpClient() + }, + } + return clientPool +} diff --git a/pkg/client/httpclient/http_client.go b/pkg/client/httpclient/http_client.go new file mode 100644 index 000000000..2da99b83c --- /dev/null +++ b/pkg/client/httpclient/http_client.go @@ -0,0 +1,195 @@ +package httpclient + +import ( + "context" + "encoding/json" + "strings" + "sync" + "time" +) + +import ( + "github.com/apache/dubbo-go/common/constant" + dg "github.com/apache/dubbo-go/config" + "github.com/apache/dubbo-go/protocol/dubbo" +) + +import ( + "github.com/dubbogo/dubbo-go-proxy/pkg/client" + "github.com/dubbogo/dubbo-go-proxy/pkg/logger" +) + +// TODO java class name elem +const ( + JavaStringClassName = "java.lang.String" + JavaLangClassName = "java.lang.Long" +) + +// DubboMetadata dubbo metadata, api config +type RestMetadata struct { + ApplicationName string `yaml:"application_name" json:"application_name" mapstructure:"application_name"` + Group string `yaml:"group" json:"group" mapstructure:"group"` + Version string `yaml:"version" json:"version" mapstructure:"version"` + Interface string `yaml:"interface" json:"interface" mapstructure:"interface"` + Method string `yaml:"method" json:"method" mapstructure:"method"` + Types []string `yaml:"type" json:"types" mapstructure:"types"` + Retries string `yaml:"retries" json:"retries,omitempty" property:"retries"` + ClusterName string `yaml:"cluster_name" json:"cluster_name,omitempty" property:"cluster_name"` + ProtocolTypeStr string `yaml:"protocol_type" json:"protocol_type,omitempty" property:"protocol_type"` + SerializationTypeStr string `yaml:"serialization_type" json:"serialization_type,omitempty" property:"serialization_type"` +} + +var ( + _httpClient *HttpClient + countDown = sync.Once{} + dgCfg dg.ConsumerConfig +) + +// DubboClient client to generic invoke dubbo +type HttpClient struct { + mLock sync.RWMutex + GenericServicePool map[string]*dg.GenericService +} + +// SingleDubboClient singleton dubbo clent +func SingleHttpClient() *HttpClient { + + if _httpClient == nil { + countDown.Do(func() { + _httpClient = NewHttpClient() + }) + } + return _httpClient +} + +// NewDubboClient create dubbo client +func NewHttpClient() *HttpClient { + return &HttpClient{ + mLock: sync.RWMutex{}, + GenericServicePool: make(map[string]*dg.GenericService), + } +} + +// Init init dubbo, config mapping can do here +func (dc *HttpClient) Init() error { + dgCfg = dg.GetConsumerConfig() + dg.SetConsumerConfig(dgCfg) + dg.Load() + dc.GenericServicePool = make(map[string]*dg.GenericService) + return nil +} + +// Close +func (dc *HttpClient) Close() error { + return nil +} + +// Call invoke service +func (dc *HttpClient) Call(r *client.Request) (resp client.Response, err error) { + dm := r.Api.Metadata.(*DubboMetadata) + gs := dc.Get(dm.Interface, dm.Version, dm.Group, dm) + + var reqData []interface{} + + l := len(dm.Types) + switch { + case l == 1: + t := dm.Types[0] + switch t { + case JavaStringClassName: + var s string + if err := json.Unmarshal(r.Body, &s); err != nil { + logger.Errorf("params parse error:%+v", err) + } else { + reqData = append(reqData, s) + } + case JavaLangClassName: + var i int + if err := json.Unmarshal(r.Body, &i); err != nil { + logger.Errorf("params parse error:%+v", err) + } else { + reqData = append(reqData, i) + } + default: + bodyMap := make(map[string]interface{}) + if err := json.Unmarshal(r.Body, &bodyMap); err != nil { + return *client.EmptyResponse, err + } else { + reqData = append(reqData, bodyMap) + } + } + case l > 1: + if err = json.Unmarshal(r.Body, &reqData); err != nil { + return *client.EmptyResponse, err + } + } + + logger.Debugf("[dubbogo proxy] invoke, method:%v, types:%v, reqData:%v", dm.Method, dm.Types, reqData) + + if resp, err := gs.Invoke(context.Background(), []interface{}{dm.Method, dm.Types, reqData}); err != nil { + return *client.EmptyResponse, err + } else { + logger.Debugf("[dubbogo proxy] dubbo client resp:%v", resp) + return *NewDubboResponse(resp), nil + } +} + +func (dc *HttpClient) get(key string) *dg.GenericService { + dc.mLock.RLock() + defer dc.mLock.RUnlock() + return dc.GenericServicePool[key] +} + +func (dc *HttpClient) check(key string) bool { + dc.mLock.RLock() + defer dc.mLock.RUnlock() + if _, ok := dc.GenericServicePool[key]; ok { + return true + } else { + return false + } +} + +func (dc *HttpClient) create(key string, dm *DubboMetadata) *dg.GenericService { + referenceConfig := dg.NewReferenceConfig(dm.Interface, context.TODO()) + referenceConfig.InterfaceName = dm.Interface + referenceConfig.Cluster = constant.DEFAULT_CLUSTER + var registers []string + for k := range dgCfg.Registries { + registers = append(registers, k) + } + referenceConfig.Registry = strings.Join(registers, ",") + + if dm.ProtocolTypeStr == "" { + referenceConfig.Protocol = dubbo.DUBBO + } else { + referenceConfig.Protocol = dm.ProtocolTypeStr + } + + referenceConfig.Version = dm.Version + referenceConfig.Group = dm.Group + referenceConfig.Generic = true + if dm.Retries == "" { + referenceConfig.Retries = "3" + } else { + referenceConfig.Retries = dm.Retries + } + dc.mLock.Lock() + defer dc.mLock.Unlock() + referenceConfig.GenericLoad(key) + time.Sleep(200 * time.Millisecond) //sleep to wait invoker create + clientService := referenceConfig.GetRPCService().(*dg.GenericService) + + dc.GenericServicePool[key] = clientService + return clientService +} + +// Get find a dubbo GenericService +func (dc *HttpClient) Get(interfaceName, version, group string, dm *DubboMetadata) *dg.GenericService { + key := strings.Join([]string{dm.ApplicationName, interfaceName, version, group}, "_") + if dc.check(key) { + return dc.get(key) + } else { + return dc.create(key, dm) + } +} diff --git a/pkg/client/httpclient/http_response.go b/pkg/client/httpclient/http_response.go new file mode 100644 index 000000000..ebb9c348f --- /dev/null +++ b/pkg/client/httpclient/http_response.go @@ -0,0 +1,165 @@ +package httpclient + +import ( + "errors" + "fmt" + "reflect" + "strings" +) + +import ( + "github.com/dubbogo/dubbo-go-proxy/pkg/client" +) + +// NewDubboResponse create dubbo response +func NewDubboResponse(data interface{}) *client.Response { + if r, err := dealResp(data, true); err != nil { + return &client.Response{Data: data} + } else { + return &client.Response{Data: r} + } +} + +func dealResp(in interface{}, HumpToLine bool) (interface{}, error) { + if in == nil { + return in, nil + } + switch reflect.TypeOf(in).Kind() { + case reflect.Map: + if _, ok := in.(map[interface{}]interface{}); ok { + m := mapIItoMapSI(in) + if HumpToLine { + m = humpToLine(m) + } + return m, nil + } else if inm, ok := in.(map[string]interface{}); ok { + if HumpToLine { + m := humpToLine(in) + return m, nil + } + return inm, nil + } + case reflect.Slice: + value := reflect.ValueOf(in) + newTemps := make([]interface{}, 0, value.Len()) + for i := 0; i < value.Len(); i++ { + if value.Index(i).CanInterface() { + newTemp, e := dealResp(value.Index(i).Interface(), HumpToLine) + if e != nil { + return nil, e + } + newTemps = append(newTemps, newTemp) + } else { + return nil, errors.New(fmt.Sprintf("unexpect err,value:%+v", value)) + } + } + return newTemps, nil + default: + return in, nil + } + return in, nil +} + +func mapIItoMapSI(in interface{}) interface{} { + var inMap = make(map[interface{}]interface{}) + if v, ok := in.(map[interface{}]interface{}); !ok { + return in + } else { + inMap = v + } + outMap := make(map[string]interface{}, len(inMap)) + + for k, v := range inMap { + if v == nil { + continue + } + s := fmt.Sprint(k) + if s == "class" { + // ignore the "class" field + continue + } + vt := reflect.TypeOf(v) + switch vt.Kind() { + case reflect.Map: + if _, ok := v.(map[interface{}]interface{}); ok { + v = mapIItoMapSI(v) + } + case reflect.Slice: + vl := reflect.ValueOf(v) + os := make([]interface{}, 0, vl.Len()) + for i := 0; i < vl.Len(); i++ { + if vl.Index(i).CanInterface() { + osv := mapIItoMapSI(vl.Index(i).Interface()) + os = append(os, osv) + } + } + v = os + } + outMap[s] = v + + } + return outMap +} + +// traverse all the keys in the map and change the hump to underline +func humpToLine(in interface{}) interface{} { + + var m map[string]interface{} + if v, ok := in.(map[string]interface{}); ok { + m = v + } else { + return in + } + + var out = make(map[string]interface{}, len(m)) + for k1, v1 := range m { + x := humpToUnderline(k1) + + if v1 == nil { + out[x] = v1 + } else if reflect.TypeOf(v1).Kind() == reflect.Struct { + out[x] = humpToLine(struct2Map(v1)) + } else if reflect.TypeOf(v1).Kind() == reflect.Slice { + value := reflect.ValueOf(v1) + var newTemps = make([]interface{}, 0, value.Len()) + for i := 0; i < value.Len(); i++ { + newTemp := humpToLine(value.Index(i).Interface()) + newTemps = append(newTemps, newTemp) + } + out[x] = newTemps + } else if reflect.TypeOf(v1).Kind() == reflect.Map { + out[x] = humpToLine(v1) + } else { + out[x] = v1 + } + } + return out +} + +func humpToUnderline(s string) string { + data := make([]byte, 0, len(s)*2) + j := false + num := len(s) + for i := 0; i < num; i++ { + d := s[i] + if i > 0 && d >= 'A' && d <= 'Z' && j { + data = append(data, '_') + } + if d != '_' { + j = true + } + data = append(data, d) + } + return strings.ToLower(string(data[:])) +} + +func struct2Map(obj interface{}) map[string]interface{} { + t := reflect.TypeOf(obj) + v := reflect.ValueOf(obj) + + var data = make(map[string]interface{}) + for i := 0; i < t.NumField(); i++ { + data[t.Field(i).Name] = v.Field(i).Interface() + } + return data +} diff --git a/pkg/common/constant/key.go b/pkg/common/constant/key.go index 631ed928d..99ebcee5d 100644 --- a/pkg/common/constant/key.go +++ b/pkg/common/constant/key.go @@ -5,7 +5,7 @@ const ( HttpRouterFilter = "dgp.filters.http.router" HttpApiFilter = "dgp.filters.http.api" HttpDomainFilter = "dgp.filters.http.domain" - HttpTransferDubboFilter = "dgp.filters.http_transfer_dubbo" + RemoteCallFilter = "dgp.filters.remote_call" LoggerFilter = "dgp.filters.logger" RecoveryFilter = "dgp.filters.recovery" diff --git a/pkg/filter/dubbo_filter.go b/pkg/filter/remote_call_filter.go similarity index 76% rename from pkg/filter/dubbo_filter.go rename to pkg/filter/remote_call_filter.go index 48f6d7b76..ca2e677ff 100644 --- a/pkg/filter/dubbo_filter.go +++ b/pkg/filter/remote_call_filter.go @@ -1,6 +1,7 @@ package filter import ( + "github.com/dubbogo/dubbo-go-proxy/pkg/model" "io/ioutil" ) @@ -23,18 +24,24 @@ import ( ) func init() { - extension.SetFilterFunc(constant.HttpTransferDubboFilter, HttpDubbo()) + extension.SetFilterFunc(constant.RemoteCallFilter, RemoteCall()) } -// HttpDubbo http 2 dubbo -func HttpDubbo() context.FilterFunc { +// RemoteCall http 2 dubbo +func RemoteCall() context.FilterFunc { return func(c context.Context) { - doDubbo(c.(*http.HttpContext)) + doRemoteCall(c.(*http.HttpContext)) } } -func doDubbo(c *http.HttpContext) { +func doRemoteCall(c *http.HttpContext) { api := c.GetApi() + client := ClientPool.getClient(api.IType) + client.call(metadata) + switch api.IType { + case model.REST: + + } if bytes, err := ioutil.ReadAll(c.Request.Body); err != nil { logger.Errorf("[dubboproxy go] read body err:%v!", err) From a613a25327265d056e803c05f417917e1b51e9ca Mon Sep 17 00:00:00 2001 From: xiaoliu <18721825717@163.com> Date: Sat, 26 Sep 2020 12:01:26 +0800 Subject: [PATCH 123/227] add pprof --- go.sum | 716 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 716 insertions(+) create mode 100644 go.sum diff --git a/go.sum b/go.sum new file mode 100644 index 000000000..ff175ea4b --- /dev/null +++ b/go.sum @@ -0,0 +1,716 @@ +cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= +cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= +cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU= +cloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU= +cloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY= +cloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc= +cloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0= +cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o= +cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= +cloud.google.com/go/firestore v1.1.0/go.mod h1:ulACoGHTpvq5r8rxGJ4ddJZBZqakUQqClKRT5SZwBmk= +cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I= +cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw= +dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= +github.com/Azure/azure-sdk-for-go v40.3.0+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc= +github.com/Azure/go-autorest/autorest v0.9.0/go.mod h1:xyHB1BMZT0cuDHU7I0+g046+BFDTQ8rEZB0s4Yfa6bI= +github.com/Azure/go-autorest/autorest v0.9.3/go.mod h1:GsRuLYvwzLjjjRoWEIyMUaYq8GNUx2nRB378IPt/1p0= +github.com/Azure/go-autorest/autorest v0.10.0/go.mod h1:/FALq9T/kS7b5J5qsQ+RSTUdAmGFqi0vUdVNNx8q630= +github.com/Azure/go-autorest/autorest/adal v0.5.0/go.mod h1:8Z9fGy2MpX0PvDjB1pEgQTmVqjGhiHBW7RJJEciWzS0= +github.com/Azure/go-autorest/autorest/adal v0.8.0/go.mod h1:Z6vX6WXXuyieHAXwMj0S6HY6e6wcHn37qQMBQlvY3lc= +github.com/Azure/go-autorest/autorest/adal v0.8.1/go.mod h1:ZjhuQClTqx435SRJ2iMlOxPYt3d2C/T/7TiQCVZSn3Q= +github.com/Azure/go-autorest/autorest/adal v0.8.2/go.mod h1:ZjhuQClTqx435SRJ2iMlOxPYt3d2C/T/7TiQCVZSn3Q= +github.com/Azure/go-autorest/autorest/azure/auth v0.4.2/go.mod h1:90gmfKdlmKgfjUpnCEpOJzsUEjrWDSLwHIG73tSXddM= +github.com/Azure/go-autorest/autorest/azure/cli v0.3.1/go.mod h1:ZG5p860J94/0kI9mNJVoIoLgXcirM2gF5i2kWloofxw= +github.com/Azure/go-autorest/autorest/date v0.1.0/go.mod h1:plvfp3oPSKwf2DNjlBjWF/7vwR+cUD/ELuzDCXwHUVA= +github.com/Azure/go-autorest/autorest/date v0.2.0/go.mod h1:vcORJHLJEh643/Ioh9+vPmf1Ij9AEBM5FuBIXLmIy0g= +github.com/Azure/go-autorest/autorest/mocks v0.1.0/go.mod h1:OTyCOPRA2IgIlWxVYxBee2F5Gr4kF2zd2J5cFRaIDN0= +github.com/Azure/go-autorest/autorest/mocks v0.2.0/go.mod h1:OTyCOPRA2IgIlWxVYxBee2F5Gr4kF2zd2J5cFRaIDN0= +github.com/Azure/go-autorest/autorest/mocks v0.3.0/go.mod h1:a8FDP3DYzQ4RYfVAxAN3SVSiiO77gL2j2ronKKP0syM= +github.com/Azure/go-autorest/autorest/to v0.3.0/go.mod h1:MgwOyqaIuKdG4TL/2ywSsIWKAfJfgHDo8ObuUk3t5sA= +github.com/Azure/go-autorest/autorest/validation v0.2.0/go.mod h1:3EEqHnBxQGHXRYq3HT1WyXAvT7LLY3tl70hw6tQIbjI= +github.com/Azure/go-autorest/logger v0.1.0/go.mod h1:oExouG+K6PryycPJfVSxi/koC6LSNgds39diKLz7Vrc= +github.com/Azure/go-autorest/tracing v0.5.0/go.mod h1:r/s2XiOKccPW3HrqB+W0TQzfbtp2fGCgRFtBroKn4Dk= +github.com/BurntSushi/toml v0.3.1 h1:WXkYYl6Yr3qBf1K79EBnL4mak0OimBfB0XUf9Vl28OQ= +github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= +github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= +github.com/DataDog/datadog-go v2.2.0+incompatible/go.mod h1:LButxg5PwREeZtORoXG3tL4fMGNddJ+vMq1mwgfaqoQ= +github.com/DataDog/datadog-go v3.2.0+incompatible/go.mod h1:LButxg5PwREeZtORoXG3tL4fMGNddJ+vMq1mwgfaqoQ= +github.com/Microsoft/go-winio v0.4.3/go.mod h1:VhR8bwka0BXejwEJY73c50VrPtXAaKcyvVC4A4RozmA= +github.com/Microsoft/go-winio v0.4.13/go.mod h1:qXqCSQ3Xa7+6tgxaGTIe4Kpcdsi+P8jBhyzoq1bpyYA= +github.com/NYTimes/gziphandler v0.0.0-20170623195520-56545f4a5d46/go.mod h1:3wb06e3pkSAbeQ52E9H9iFoQsEEwGN64994WTCIhntQ= +github.com/NYTimes/gziphandler v1.0.1/go.mod h1:3wb06e3pkSAbeQ52E9H9iFoQsEEwGN64994WTCIhntQ= +github.com/NYTimes/gziphandler v1.1.1/go.mod h1:n/CVRwUEOgIxrgPvAQhUUr9oeUtvrhMomdKFjzJNB0c= +github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= +github.com/PuerkitoBio/purell v1.0.0/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= +github.com/PuerkitoBio/urlesc v0.0.0-20160726150825-5bd2802263f2/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE= +github.com/StackExchange/wmi v0.0.0-20180116203802-5d049714c4a6/go.mod h1:3eOhrUMpNV+6aFIbp5/iudMxNCF27Vw2OZgy4xEx0Fg= +github.com/Workiva/go-datastructures v1.0.50 h1:slDmfW6KCHcC7U+LP3DDBbm4fqTwZGn1beOFPfGaLvo= +github.com/Workiva/go-datastructures v1.0.50/go.mod h1:Z+F2Rca0qCsVYDS8z7bAGm8f3UkzuWYS/oBZz5a7VVA= +github.com/abdullin/seq v0.0.0-20160510034733-d5467c17e7af/go.mod h1:5Jv4cbFiHJMsVxt52+i0Ha45fjshj6wxYr1r19tB9bw= +github.com/afex/hystrix-go v0.0.0-20180502004556-fa1af6a1f4f5 h1:rFw4nCn9iMW+Vajsk51NtYIcwSTkXr+JGrMd36kTDJw= +github.com/afex/hystrix-go v0.0.0-20180502004556-fa1af6a1f4f5/go.mod h1:SkGFH1ia65gfNATL8TAiHDNxPzPdmEL5uirI2Uyuz6c= +github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= +github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= +github.com/aliyun/alibaba-cloud-sdk-go v1.61.18/go.mod h1:v8ESoHo4SyHmuB4b1tJqDHxfTGEciD+yhvOU/5s1Rfk= +github.com/apache/dubbo-getty v1.3.10 h1:ys5mwjPdxG/KwkPjS6EI0RzQtU6p6FCPoKpaFEzpAL0= +github.com/apache/dubbo-getty v1.3.10/go.mod h1:x6rraK01BL5C7jUM2fPl5KMkAxLVIx54ZB8/XEOik9Y= +github.com/apache/dubbo-go v1.5.1 h1:9bcGOkek0+x+zqtvykKpuOwkoJfMef0zNxsyPbWOafY= +github.com/apache/dubbo-go v1.5.1/go.mod h1:lxwgtF+27mSFQsSrBLaVbdQpwCp+pBN/mHP4w4/N2Qc= +github.com/apache/dubbo-go-hessian2 v1.6.2 h1:i7F5GjVaUatLQz1x9vUmmSIFj49L8J6rVICdF6xw4qw= +github.com/apache/dubbo-go-hessian2 v1.6.2/go.mod h1:7rEw9guWABQa6Aqb8HeZcsYPHsOS7XT1qtJvkmI6c5w= +github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o= +github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8= +github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY= +github.com/armon/go-metrics v0.0.0-20190430140413-ec5e00d3c878/go.mod h1:3AMJUQhVx52RsWOnlkpikZr01T/yAVN2gn0861vByNg= +github.com/armon/go-metrics v0.3.0/go.mod h1:zXjbSimjXTd7vOpY8B0/2LpvNvDoXBuplAD+gJD3GYs= +github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= +github.com/armon/go-radix v1.0.0/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= +github.com/aws/aws-sdk-go v1.25.41/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= +github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= +github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= +github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= +github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= +github.com/bketelsen/crypt v0.0.3-0.20200106085610-5cbc8cc4026c/go.mod h1:MKsuJmJgSg28kpZDP6UIiPt0e0Oz0kqKNGyRaWEPv84= +github.com/boltdb/bolt v1.3.1/go.mod h1:clJnj/oiGkjum5o1McbSZDSLxVThjynRyGBgiAx27Ps= +github.com/buger/jsonparser v0.0.0-20181115193947-bf1c66bbce23/go.mod h1:bbYlZJ7hK1yFx9hf58LP0zeX7UjIGs20ufpu3evjr+s= +github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= +github.com/circonus-labs/circonus-gometrics v2.3.1+incompatible/go.mod h1:nmEj6Dob7S7YxXgwXpfOuvO54S+tGdZdw9fuRZt25Ag= +github.com/circonus-labs/circonusllhist v0.1.3/go.mod h1:kMXHVDlOchFAehlya5ePtbp5jckzBHf4XRpQvBOLI+I= +github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= +github.com/cockroachdb/apd v1.1.0/go.mod h1:8Sl8LxpKi29FqWXR16WEFZRNSz3SoPzUzeMeY4+DwBQ= +github.com/coredns/coredns v1.1.2/go.mod h1:zASH/MVDgR6XZTbxvOnsZfffS+31vg6Ackf/wo1+AM0= +github.com/coreos/bbolt v1.3.2/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk= +github.com/coreos/bbolt v1.3.3/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk= +github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= +github.com/coreos/etcd v3.3.13+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= +github.com/coreos/go-etcd v2.0.0+incompatible/go.mod h1:Jez6KQU2B/sWsbdaef3ED8NzMklzPG4d5KIOhIy30Tk= +github.com/coreos/go-oidc v2.1.0+incompatible/go.mod h1:CgnwVTmzoESiwO9qyAFEMiHoZ1nMCKZlZ9V6mm3/LKc= +github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= +github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= +github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= +github.com/coreos/go-systemd v0.0.0-20190719114852-fd7a80b32e1f/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= +github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= +github.com/cpuguy83/go-md2man v1.0.10 h1:BSKMNlYxDvnunlTymqtgONjNnaRV1sTpcovwwjF22jk= +github.com/cpuguy83/go-md2man v1.0.10/go.mod h1:SmD6nW6nTyfqj6ABTjUi3V3JVMnlJmwcJI5acqYI6dE= +github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d h1:U+s90UTSYgptZMwQh2aRr3LuazLJIa+Pg3Kc1ylSYVY= +github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= +github.com/creasty/defaults v1.3.0 h1:uG+RAxYbJgOPCOdKEcec9ZJXeva7Y6mj/8egdzwmLtw= +github.com/creasty/defaults v1.3.0/go.mod h1:CIEEvs7oIVZm30R8VxtFJs+4k201gReYyuYHJxZc68I= +github.com/davecgh/go-spew v0.0.0-20151105211317-5215b55f46b2/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/denverdino/aliyungo v0.0.0-20170926055100-d3308649c661/go.mod h1:dV8lFg6daOBZbT6/BDGIz6Y3WFGn8juu6G+CQ6LHtl0= +github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= +github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no= +github.com/digitalocean/godo v1.1.1/go.mod h1:h6faOIcZ8lWIwNQ+DN7b3CgX4Kwby5T+nbpNqkUIozU= +github.com/digitalocean/godo v1.10.0/go.mod h1:h6faOIcZ8lWIwNQ+DN7b3CgX4Kwby5T+nbpNqkUIozU= +github.com/dimchansky/utfbom v1.1.0/go.mod h1:rO41eb7gLfo8SF1jd9F8HplJm1Fewwi4mQvIirEdv+8= +github.com/dnaeon/go-vcr v1.0.1/go.mod h1:aBB1+wY4s93YsC3HHjMBMrwTj2R9FHDzUr9KyGc8n1E= +github.com/docker/go-connections v0.3.0/go.mod h1:Gbd7IOopHjR8Iph03tsViu4nIes5XhDvyHbTtUxmeec= +github.com/docker/go-connections v0.4.0/go.mod h1:Gbd7IOopHjR8Iph03tsViu4nIes5XhDvyHbTtUxmeec= +github.com/docker/spdystream v0.0.0-20160310174837-449fdfce4d96/go.mod h1:Qh8CwZgvJUkLughtfhJv5dyTYa91l1fOUCrgjqmcifM= +github.com/dubbogo/go-zookeeper v1.0.1 h1:irLzvOsDOTNsN8Sv9tvYYxVu6DCQfLtziZQtUHmZgz8= +github.com/dubbogo/go-zookeeper v1.0.1/go.mod h1:fn6n2CAEer3novYgk9ULLwAjuV8/g4DdC2ENwRb6E+c= +github.com/dubbogo/gost v1.9.0/go.mod h1:pPTjVyoJan3aPxBPNUX0ADkXjPibLo+/Ib0/fADXSG8= +github.com/dubbogo/gost v1.9.1 h1:0/PPFo13zPbjt4Ia0zYWMFi3C6rAe9X7O1J2Iv+BHNM= +github.com/dubbogo/gost v1.9.1/go.mod h1:pPTjVyoJan3aPxBPNUX0ADkXjPibLo+/Ib0/fADXSG8= +github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= +github.com/elazarl/go-bindata-assetfs v0.0.0-20160803192304-e1a2a7ec64b0/go.mod h1:v+YaWX3bdea5J/mo8dSETolEo7R71Vk1u8bnjau5yw4= +github.com/elazarl/go-bindata-assetfs v1.0.0/go.mod h1:v+YaWX3bdea5J/mo8dSETolEo7R71Vk1u8bnjau5yw4= +github.com/elazarl/goproxy v0.0.0-20170405201442-c4fc26588b6e/go.mod h1:/Zj4wYkgs4iZTTu3o/KG3Itv/qCCa8VVMlb3i9OVuzc= +github.com/emicklei/go-restful v0.0.0-20170410110728-ff4f55a20633/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs= +github.com/emicklei/go-restful/v3 v3.0.0/go.mod h1:6n3XBCmQQb25CM2LCACGz8ukIrRry+4bhvbpWn3mrbc= +github.com/envoyproxy/go-control-plane v0.8.0/go.mod h1:GSSbY9P1neVhdY7G4wu+IK1rk/dqhiCC/4ExuWJZVuk= +github.com/envoyproxy/protoc-gen-validate v0.0.14/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= +github.com/evanphx/json-patch v4.2.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= +github.com/fastly/go-utils v0.0.0-20180712184237-d95a45783239/go.mod h1:Gdwt2ce0yfBxPvZrHkprdPPTTS3N5rwmLE8T22KBXlw= +github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= +github.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL+zU= +github.com/fatih/structs v1.1.0/go.mod h1:9NiDSp5zOcgEDl+j00MP/WkGVPOlPRLejGD8Ga6PJ7M= +github.com/frankban/quicktest v1.4.1/go.mod h1:36zfPVQyHxymz4cH7wlDmVwDrJuljRB60qkgn7rorfQ= +github.com/fsnotify/fsnotify v1.4.7 h1:IXs+QLmnXW2CcXuY+8Mzv/fWEsPGWxqefPtCP5CnV9I= +github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= +github.com/ghodss/yaml v0.0.0-20150909031657-73d445a93680/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= +github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= +github.com/ghodss/yaml v1.0.1-0.20190212211648-25d852aebe32 h1:Mn26/9ZMNWSw9C9ERFA1PUxfmGpolnw2v0bKOREu5ew= +github.com/ghodss/yaml v1.0.1-0.20190212211648-25d852aebe32/go.mod h1:GIjDIg/heH5DOkXY3YJ/wNhfHsQHoXGjl8G8amsYQ1I= +github.com/go-asn1-ber/asn1-ber v1.3.1/go.mod h1:hEBeB/ic+5LoWskz+yKT7vGhhPYkProFKoKdwZRWMe0= +github.com/go-co-op/gocron v0.1.1/go.mod h1:Y9PWlYqDChf2Nbgg7kfS+ZsXHDTZbMZYPEQ0MILqH+M= +github.com/go-errors/errors v1.0.1/go.mod h1:f4zRHt4oKfwPJE5k8C9vpYG+aDHdBFUsgrm6/TyX73Q= +github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= +github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= +github.com/go-ldap/ldap v3.0.2+incompatible/go.mod h1:qfd9rJvER9Q0/D/Sqn1DfHRoBp40uXYvFoEVrNEPqRc= +github.com/go-ldap/ldap/v3 v3.1.3/go.mod h1:3rbOH3jRS2u6jg2rJnKAMLE/xQyCKIveG2Sa/Cohzb8= +github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= +github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= +github.com/go-logr/logr v0.1.0/go.mod h1:ixOQHD9gLJUVQQ2ZOR7zLEifBX6tGkNJF4QyIY7sIas= +github.com/go-ole/go-ole v1.2.1/go.mod h1:7FAglXiTm7HKlQRDeOQ6ZNUHidzCWXuZWq/1dTyBNF8= +github.com/go-openapi/jsonpointer v0.0.0-20160704185906-46af16f9f7b1/go.mod h1:+35s3my2LFTysnkMfxsJBAMHj/DoqoB9knIWoYG/Vk0= +github.com/go-openapi/jsonreference v0.0.0-20160704190145-13c6e3589ad9/go.mod h1:W3Z9FmVs9qj+KR4zFKmDPGiLdk1D9Rlm7cyMvf57TTg= +github.com/go-openapi/spec v0.0.0-20160808142527-6aced65f8501/go.mod h1:J8+jY1nAiCcj+friV/PDoE1/3eeccG9LYBs0tYvLOWc= +github.com/go-openapi/swag v0.0.0-20160704191624-1d0bd113de87/go.mod h1:DXUve3Dpr1UfpPtxFw+EFuQ41HhCWZfha5jSVRG7C7I= +github.com/go-redis/redis v6.15.5+incompatible/go.mod h1:NAIEuMOZ/fxfXJIrKDQDz8wamY7mA7PouImQ2Jvg6kA= +github.com/go-resty/resty/v2 v2.1.0/go.mod h1:dZGr0i9PLlaaTD4H/hoZIDjQ+r6xq8mgbRzHZf7f2J8= +github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= +github.com/go-test/deep v1.0.2-0.20181118220953-042da051cf31/go.mod h1:wGDj63lr65AM2AQyKZd/NYHGb0R+1RLqB8NKt3aSFNA= +github.com/go-test/deep v1.0.2/go.mod h1:wGDj63lr65AM2AQyKZd/NYHGb0R+1RLqB8NKt3aSFNA= +github.com/gogo/googleapis v1.1.0/go.mod h1:gf4bu3Q80BeJ6H1S1vYPm8/ELATdvryBaNFGgqEef3s= +github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= +github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4= +github.com/gogo/protobuf v1.2.2-0.20190723190241-65acae22fc9d/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= +github.com/goinggo/mapstructure v0.0.0-20140717182941-194205d9b4a9 h1:wqckanyE9qc/XnvnybC6SHOb8Nyd62QXAZOzA8twFig= +github.com/goinggo/mapstructure v0.0.0-20140717182941-194205d9b4a9/go.mod h1:64ikIrMv84B+raz7akXOqbF7cK3/OQQ/6cClY10oy7A= +github.com/goji/httpauth v0.0.0-20160601135302-2da839ab0f4d/go.mod h1:nnjvkQ9ptGaCkuDUx6wNykzzlUixGxvkme+H/lnzb+A= +github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= +github.com/golang/groupcache v0.0.0-20160516000752-02826c3e7903/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/groupcache v0.0.0-20190129154638-5b532d6fd5ef/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= +github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= +github.com/golang/mock v1.3.1 h1:qGJ6qTW+x6xX/my+8YUVl4WNpX9B7+/l2tRsHGZ7f2s= +github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y= +github.com/golang/protobuf v0.0.0-20161109072736-4bd1920723d7/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/snappy v0.0.1 h1:Qgr9rKW7uDUkrbSmQeiDsGa8SjGyCOGtuasMWwvp2P4= +github.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= +github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= +github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= +github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= +github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= +github.com/google/go-querystring v0.0.0-20170111101155-53e6ce116135/go.mod h1:odCYkC5MyYFN7vkCjXpyrEuKhc/BUO6wN/zVPAxq5ck= +github.com/google/go-querystring v1.0.0/go.mod h1:odCYkC5MyYFN7vkCjXpyrEuKhc/BUO6wN/zVPAxq5ck= +github.com/google/gofuzz v0.0.0-20161122191042-44d81051d367/go.mod h1:HP5RmnzzSNb993RKQDq4+1A4ia9nllfqcQFTQJedwGI= +github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= +github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= +github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= +github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= +github.com/google/tcpproxy v0.0.0-20180808230851-dfa16c61dad2/go.mod h1:DavVbd41y+b7ukKDmlnPR4nGYmkWXR6vHUkjQNiHPBs= +github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= +github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= +github.com/googleapis/gnostic v0.0.0-20170729233727-0c5108395e2d/go.mod h1:sJBsCZ4ayReDTBIg8b9dl28c5xFWyhBTVRp3pOg5EKY= +github.com/googleapis/gnostic v0.2.0/go.mod h1:sJBsCZ4ayReDTBIg8b9dl28c5xFWyhBTVRp3pOg5EKY= +github.com/gophercloud/gophercloud v0.1.0/go.mod h1:vxM41WHh5uqHVBMZHzuwNOHh8XEoIEcSTewFxm1c5g8= +github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1 h1:EGx4pi6eqNxGaHF6qqu48+N2wcFQ5qg5FXgOdqsJ5d8= +github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= +github.com/gorilla/websocket v1.4.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= +github.com/gorilla/websocket v1.4.2 h1:+/TMaTYc4QFitKJxsQ7Yye35DkWvkdLcvGKqM+x0Ufc= +github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= +github.com/gregjones/httpcache v0.0.0-20180305231024-9cad4c3443a7/go.mod h1:FecbI9+v66THATjSRHfNgh1IVFe/9kFxbXtjV0ctIMA= +github.com/grpc-ecosystem/go-grpc-middleware v1.0.0/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= +github.com/grpc-ecosystem/go-grpc-middleware v1.0.1-0.20190118093823-f849b5445de4/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= +github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk= +github.com/grpc-ecosystem/grpc-gateway v1.9.0/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= +github.com/grpc-ecosystem/grpc-gateway v1.9.5/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= +github.com/grpc-ecosystem/grpc-opentracing v0.0.0-20180507213350-8e809c8a8645/go.mod h1:6iZfnjpejD4L/4DwD7NryNaJyCQdzwWwH2MWhCA90Kw= +github.com/hashicorp/consul v1.8.0/go.mod h1:Gg9/UgAQ9rdY3CTvzQZ6g2jcIb7NlIfjI+0pvLk5D1A= +github.com/hashicorp/consul/api v1.1.0/go.mod h1:VmuI/Lkw1nC05EYQWNKwWGbkg+FbDBtguAZLlVdkD9Q= +github.com/hashicorp/consul/api v1.5.0/go.mod h1:LqwrLNW876eYSuUOo4ZLHBcdKc038txr/IMfbLPATa4= +github.com/hashicorp/consul/sdk v0.1.1/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyNV1vwHyQBF0x8= +github.com/hashicorp/consul/sdk v0.5.0/go.mod h1:fY08Y9z5SvJqevyZNy6WWPXiG3KwBPAvlcdx16zZ0fM= +github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= +github.com/hashicorp/go-bexpr v0.1.2/go.mod h1:ANbpTX1oAql27TZkKVeW8p1w8NTdnyzPe/0qqPCKohU= +github.com/hashicorp/go-checkpoint v0.0.0-20171009173528-1545e56e46de/go.mod h1:xIwEieBHERyEvaeKF/TcHh1Hu+lxPM+n2vT1+g9I4m4= +github.com/hashicorp/go-cleanhttp v0.5.0/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= +github.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= +github.com/hashicorp/go-connlimit v0.2.0/go.mod h1:OUj9FGL1tPIhl/2RCfzYHrIiWj+VVPGNyVPnUX8AqS0= +github.com/hashicorp/go-discover v0.0.0-20200501174627-ad1e96bde088/go.mod h1:vZu6Opqf49xX5lsFAu7iFNewkcVF1sn/wyapZh5ytlg= +github.com/hashicorp/go-hclog v0.0.0-20180709165350-ff2cf002a8dd/go.mod h1:9bjs9uLqI8l75knNv3lV1kA55veR+WUPSiKIWcQHudI= +github.com/hashicorp/go-hclog v0.8.0/go.mod h1:5CU+agLiy3J7N7QjHK5d05KxGsuXiQLrjA0H7acj2lQ= +github.com/hashicorp/go-hclog v0.9.1/go.mod h1:5CU+agLiy3J7N7QjHK5d05KxGsuXiQLrjA0H7acj2lQ= +github.com/hashicorp/go-hclog v0.9.2/go.mod h1:5CU+agLiy3J7N7QjHK5d05KxGsuXiQLrjA0H7acj2lQ= +github.com/hashicorp/go-hclog v0.12.0/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ= +github.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= +github.com/hashicorp/go-immutable-radix v1.1.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= +github.com/hashicorp/go-memdb v1.0.3/go.mod h1:LWQ8R70vPrS4OEY9k28D2z8/Zzyu34NVzeRibGAzHO0= +github.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM= +github.com/hashicorp/go-msgpack v0.5.5/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM= +github.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk= +github.com/hashicorp/go-multierror v1.1.0/go.mod h1:spPvp8C1qA32ftKqdAHm4hHTbPw+vmowP0z+KUhOZdA= +github.com/hashicorp/go-plugin v1.0.1/go.mod h1:++UyYGoz3o5w9ZzAdZxtQKrWWP+iqPBn3cQptSMzBuY= +github.com/hashicorp/go-raftchunking v0.6.1/go.mod h1:cGlg3JtDy7qy6c/3Bu660Mic1JF+7lWqIwCFSb08fX0= +github.com/hashicorp/go-raftchunking v0.6.3-0.20191002164813-7e9e8525653a/go.mod h1:xbXnmKqX9/+RhPkJ4zrEx4738HacP72aaUPlT2RZ4sU= +github.com/hashicorp/go-retryablehttp v0.5.3/go.mod h1:9B5zBasrRhHXnJnui7y6sL7es7NDiJgTc6Er0maI1Xs= +github.com/hashicorp/go-retryablehttp v0.5.4/go.mod h1:9B5zBasrRhHXnJnui7y6sL7es7NDiJgTc6Er0maI1Xs= +github.com/hashicorp/go-retryablehttp v0.6.2/go.mod h1:gEx6HMUGxYYhJScX7W1Il64m6cc2C1mDaW3NQ9sY1FY= +github.com/hashicorp/go-rootcerts v1.0.0/go.mod h1:K6zTfqpRlCUIjkwsN4Z+hiSfzSTQa6eBIzfwKfwNnHU= +github.com/hashicorp/go-rootcerts v1.0.1/go.mod h1:pqUvnprVnM5bf7AOirdbb01K4ccR319Vf4pU3K5EGc8= +github.com/hashicorp/go-rootcerts v1.0.2/go.mod h1:pqUvnprVnM5bf7AOirdbb01K4ccR319Vf4pU3K5EGc8= +github.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU= +github.com/hashicorp/go-sockaddr v1.0.2/go.mod h1:rB4wwRAUzs07qva3c5SdrY/NEtAUjGlgmH/UkBUC97A= +github.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4= +github.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= +github.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= +github.com/hashicorp/go-uuid v1.0.2-0.20191001231223-f32f5fe8d6a8/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= +github.com/hashicorp/go-uuid v1.0.2/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= +github.com/hashicorp/go-version v1.1.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= +github.com/hashicorp/go-version v1.2.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= +github.com/hashicorp/go.net v0.0.1/go.mod h1:hjKkEWcCURg++eb33jQU7oqQcI9XDCnUzHA0oac0k90= +github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= +github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= +github.com/hashicorp/golang-lru v0.5.3/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= +github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4= +github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= +github.com/hashicorp/hil v0.0.0-20160711231837-1e86c6b523c5/go.mod h1:KHvg/R2/dPtaePb16oW4qIyzkMxXOL38xjRN64adsts= +github.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64= +github.com/hashicorp/mdns v1.0.0/go.mod h1:tL+uN++7HEJ6SQLQ2/p+z2pH24WQKWjBPkE0mNTz8vQ= +github.com/hashicorp/mdns v1.0.1/go.mod h1:4gW7WsVCke5TE7EPeYliwHlRUyBtfCwuFwuMg2DmyNY= +github.com/hashicorp/memberlist v0.1.3/go.mod h1:ajVTdAv/9Im8oMAAj5G31PhhMCZJV2pPBoIllUwCN7I= +github.com/hashicorp/memberlist v0.2.0/go.mod h1:MS2lj3INKhZjWNqd3N0m3J+Jxf3DAOnAH9VT3Sh9MUE= +github.com/hashicorp/memberlist v0.2.2/go.mod h1:MS2lj3INKhZjWNqd3N0m3J+Jxf3DAOnAH9VT3Sh9MUE= +github.com/hashicorp/net-rpc-msgpackrpc v0.0.0-20151116020338-a14192a58a69/go.mod h1:/z+jUGRBlwVpUZfjute9jWaF6/HuhjuFQuL1YXzVD1Q= +github.com/hashicorp/raft v1.1.1/go.mod h1:vPAJM8Asw6u8LxC3eJCUZmRP/E4QmUGE1R7g7k8sG/8= +github.com/hashicorp/raft v1.1.2-0.20191002163536-9c6bd3e3eb17/go.mod h1:vPAJM8Asw6u8LxC3eJCUZmRP/E4QmUGE1R7g7k8sG/8= +github.com/hashicorp/raft v1.1.2/go.mod h1:vPAJM8Asw6u8LxC3eJCUZmRP/E4QmUGE1R7g7k8sG/8= +github.com/hashicorp/raft-boltdb v0.0.0-20171010151810-6e5ba93211ea/go.mod h1:pNv7Wc3ycL6F5oOWn+tPGo2gWD4a5X+yp/ntwdKLjRk= +github.com/hashicorp/serf v0.8.2/go.mod h1:6hOLApaqBFA1NXqRQAsxw9QxuDEvNxSQRwA/JwenrHc= +github.com/hashicorp/serf v0.9.0/go.mod h1:YL0HO+FifKOW2u1ke99DGVu1zhcpZzNwrLIqBC7vbYU= +github.com/hashicorp/serf v0.9.2/go.mod h1:UWDWwZeL5cuWDJdl0C6wrvrUwEqtQ4ZKBKKENpqIUyk= +github.com/hashicorp/vault/api v1.0.4/go.mod h1:gDcqh3WGcR1cpF5AJz/B1UFheUEneMoIospckxBxk6Q= +github.com/hashicorp/vault/api v1.0.5-0.20191108163347-bdd38fca2cff/go.mod h1:Uf8LaHyrYsgVgHzO2tMZKhqRGlL3UJ6XaSwW2EA1Iqo= +github.com/hashicorp/vault/sdk v0.1.13/go.mod h1:B+hVj7TpuQY1Y/GPbCpffmgd+tSEwvhkWnjtSYCaS2M= +github.com/hashicorp/vault/sdk v0.1.14-0.20191108161836-82f2b5571044/go.mod h1:PcekaFGiPJyHnFy+NZhP6ll650zEw51Ag7g/YEa+EOU= +github.com/hashicorp/vault/sdk v0.1.14-0.20191112033314-390e96e22eb2/go.mod h1:PcekaFGiPJyHnFy+NZhP6ll650zEw51Ag7g/YEa+EOU= +github.com/hashicorp/vic v1.5.1-0.20190403131502-bbfe86ec9443/go.mod h1:bEpDU35nTu0ey1EXjwNwPjI9xErAsoOCmcMb9GKvyxo= +github.com/hashicorp/yamux v0.0.0-20180604194846-3520598351bb/go.mod h1:+NfK9FKeTrX5uv1uIXGdwYDTeHna2qgaIlx54MXqjAM= +github.com/hashicorp/yamux v0.0.0-20181012175058-2f1d1f20f75d/go.mod h1:+NfK9FKeTrX5uv1uIXGdwYDTeHna2qgaIlx54MXqjAM= +github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= +github.com/imdario/mergo v0.3.5/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= +github.com/imdario/mergo v0.3.6/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= +github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= +github.com/jackc/fake v0.0.0-20150926172116-812a484cc733/go.mod h1:WrMFNQdiFJ80sQsxDoMokWK1W5TQtxBFNpzWTD84ibQ= +github.com/jackc/pgx v3.3.0+incompatible/go.mod h1:0ZGrqGqkRlliWnWB4zKnWtjbSWbGkVEFm4TeybAXq+I= +github.com/jarcoal/httpmock v0.0.0-20180424175123-9c70cfe4a1da/go.mod h1:ks+b9deReOc7jgqp+e7LuFiCBH6Rm5hL32cLcEAArb4= +github.com/jehiah/go-strftime v0.0.0-20171201141054-1d33003b3869/go.mod h1:cJ6Cj7dQo+O6GJNiMx+Pa94qKj+TG8ONdKHgMNIyyag= +github.com/jinzhu/copier v0.0.0-20190625015134-976e0346caa8 h1:mGIXW/lubQ4B+3bXTLxcTMTjUNDqoF6T/HUW9LbFx9s= +github.com/jinzhu/copier v0.0.0-20190625015134-976e0346caa8/go.mod h1:yL958EeXv8Ylng6IfnvG4oflryUi3vgA3xPs9hmII1s= +github.com/jmespath/go-jmespath v0.0.0-20180206201540-c2b33e8439af/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k= +github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo= +github.com/joyent/triton-go v0.0.0-20180628001255-830d2b111e62/go.mod h1:U+RSyWxWd04xTqnuOQxnai7XGS2PrPY2cfGoDKtMHjA= +github.com/joyent/triton-go v1.7.1-0.20200416154420-6801d15b779f/go.mod h1:KDSfL7qe5ZfQqvlDMkVjCztbmcpp/c8M77vhQP8ZPvk= +github.com/json-iterator/go v0.0.0-20180612202835-f2b4162afba3/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= +github.com/json-iterator/go v1.1.5/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= +github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= +github.com/json-iterator/go v1.1.7/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= +github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= +github.com/jtolds/gls v4.20.0+incompatible h1:xdiiI2gbIgH/gLH7ADydsJ1uDOEzR8yvV7C0MuV77Wo= +github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= +github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= +github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q= +github.com/kisielk/errcheck v1.2.0/go.mod h1:/BMXB+zMLi60iA8Vv6Ksmxu/1UDYcXs4uQLJ+jE2L00= +github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= +github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= +github.com/konsorten/go-windows-terminal-sequences v1.0.2/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= +github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= +github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= +github.com/kr/pretty v0.2.0 h1:s5hAObm+yFO5uHYt5dYjxi2rXrsnmRpJx4OYvIWUaQs= +github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= +github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= +github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE= +github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= +github.com/lestrrat/go-envload v0.0.0-20180220120943-6ed08b54a570/go.mod h1:BLt8L9ld7wVsvEWQbuLrUZnCMnUmLZ+CGDzKtclrTlE= +github.com/lestrrat/go-file-rotatelogs v0.0.0-20180223000712-d3151e2a480f/go.mod h1:UGmTpUd3rjbtfIpwAPrcfmGf/Z1HS95TATB+m57TPB8= +github.com/lestrrat/go-strftime v0.0.0-20180220042222-ba3bf9c1d042/go.mod h1:TPpsiPUEh0zFL1Snz4crhMlBe60PYxRHr5oFF3rRYg0= +github.com/lib/pq v1.1.1/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= +github.com/linode/linodego v0.7.1/go.mod h1:ga11n3ivecUrPCHN0rANxKmfWBJVkOXfLMZinAbj2sY= +github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= +github.com/magiconair/properties v1.8.1 h1:ZC2Vc7/ZFkGmsVC9KvOjumD+G5lXy2RtTKyzRKO2BQ4= +github.com/magiconair/properties v1.8.1/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= +github.com/mailru/easyjson v0.0.0-20160728113105-d5b7844b561a/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= +github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= +github.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= +github.com/mattn/go-colorable v0.1.6/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= +github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= +github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= +github.com/mattn/go-isatty v0.0.10/go.mod h1:qgIWMr58cqv1PHHyhnkY9lrL7etaEgOFcMEpPG5Rm84= +github.com/mattn/go-isatty v0.0.11/go.mod h1:PhnuNfih5lzO57/f3n+odYbM4JtupLOxQOAqxQCu2WE= +github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= +github.com/mattn/go-runewidth v0.0.3/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= +github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= +github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= +github.com/miekg/dns v1.1.26/go.mod h1:bPDLeHnStXmXAq1m/Ch/hvfNHr14JKNPMBo3VZKjuso= +github.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc= +github.com/mitchellh/cli v1.1.0/go.mod h1:xcISNoH86gajksDmfB23e/pu+B+GeFRMYmoHXxx3xhI= +github.com/mitchellh/copystructure v1.0.0/go.mod h1:SNtv71yrdKgLRyLFxmLdkAbkKEFWgYaq1OVrnRcwhnw= +github.com/mitchellh/go-homedir v1.0.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= +github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= +github.com/mitchellh/go-testing-interface v0.0.0-20171004221916-a61a99592b77/go.mod h1:kRemZodwjscx+RGhAo8eIhFbs2+BFgRtFPeD/KE+zxI= +github.com/mitchellh/go-testing-interface v1.0.0/go.mod h1:kRemZodwjscx+RGhAo8eIhFbs2+BFgRtFPeD/KE+zxI= +github.com/mitchellh/go-testing-interface v1.14.0/go.mod h1:gfgS7OtZj6MA4U1UrDRp04twqAjfvlZyCfX3sDjEym8= +github.com/mitchellh/go-wordwrap v1.0.0/go.mod h1:ZXFpozHsX6DPmq2I0TCekCxypsnAUbP2oI0UX1GXzOo= +github.com/mitchellh/gox v0.4.0/go.mod h1:Sd9lOJ0+aimLBi73mGofS1ycjY8lL3uZM3JPS42BGNg= +github.com/mitchellh/hashstructure v0.0.0-20170609045927-2bca23e0e452/go.mod h1:QjSHrPWS+BGUVBYkbTZWEnOh3G1DutKwClXU/ABz6AQ= +github.com/mitchellh/hashstructure v1.0.0/go.mod h1:QjSHrPWS+BGUVBYkbTZWEnOh3G1DutKwClXU/ABz6AQ= +github.com/mitchellh/iochan v1.0.0/go.mod h1:JwYml1nuB7xOzsp52dPpHFffvOCDupsG0QubkSMEySY= +github.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= +github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= +github.com/mitchellh/mapstructure v1.2.3 h1:f/MjBEBDLttYCGfRaKBbKSRVF5aV2O6fnBpzknuE3jU= +github.com/mitchellh/mapstructure v1.2.3/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= +github.com/mitchellh/pointerstructure v1.0.0/go.mod h1:k4XwG94++jLVsSiTxo7qdIfXA9pj9EAeo0QsNNJOLZ8= +github.com/mitchellh/reflectwalk v1.0.0/go.mod h1:mSTlrgnPZtwu0c4WaC2kGObEpuNDbx0jmZXqmk4esnw= +github.com/mitchellh/reflectwalk v1.0.1/go.mod h1:mSTlrgnPZtwu0c4WaC2kGObEpuNDbx0jmZXqmk4esnw= +github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/reflect2 v0.0.0-20180320133207-05fbef0ca5da/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= +github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= +github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= +github.com/munnerz/goautoneg v0.0.0-20120707110453-a547fc61f48d/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= +github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= +github.com/mxk/go-flowrate v0.0.0-20140419014527-cca7078d478f/go.mod h1:ZdcZmHo+o7JKHSa8/e818NopupXU1YMK5fe1lsApnBw= +github.com/nacos-group/nacos-sdk-go v1.0.0/go.mod h1:hlAPn3UdzlxIlSILAyOXKxjFSvDJ9oLzTJ9hLAK1KzA= +github.com/nicolai86/scaleway-sdk v1.10.2-0.20180628010248-798f60e20bb2/go.mod h1:TLb2Sg7HQcgGdloNxkrmtgDNR9uVYF3lfdFIN4Ro6Sk= +github.com/oklog/run v1.0.0/go.mod h1:dlhp/R75TPv97u0XWUtDeV/lRKWPKSdTuV0TZvrmrQA= +github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U= +github.com/olekukonko/tablewriter v0.0.0-20180130162743-b8a9be070da4/go.mod h1:vsDQFd/mU46D+Z4whnwzcISnGGzXWMclvtLoiIKAKIo= +github.com/onsi/ginkgo v0.0.0-20170829012221-11459a886d9c/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= +github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= +github.com/onsi/ginkgo v1.8.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= +github.com/onsi/ginkgo v1.10.1/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= +github.com/onsi/gomega v0.0.0-20170829124025-dcabb60a477c/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= +github.com/onsi/gomega v1.5.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= +github.com/onsi/gomega v1.7.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= +github.com/opentracing/opentracing-go v1.1.0 h1:pWlfV3Bxv7k65HYwkikxat0+s3pV4bsqf19k25Ur8rU= +github.com/opentracing/opentracing-go v1.1.0/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= +github.com/packethost/packngo v0.1.1-0.20180711074735-b9cb5096f54c/go.mod h1:otzZQXgoO96RTzDB/Hycg0qZcXZsWJGJRSXbmEIJ+4M= +github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= +github.com/pascaldekloe/goe v0.1.0/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= +github.com/patrickmn/go-cache v2.1.0+incompatible/go.mod h1:3Qf8kWWT7OJRJbdiICTKqZju1ZixQ/KpMGzzAfe6+WQ= +github.com/pelletier/go-toml v1.2.0 h1:T5zMGML61Wp+FlcbWjRDT7yAxhJNAiPPLOFECq181zc= +github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= +github.com/peterbourgon/diskv v2.0.1+incompatible/go.mod h1:uqqh8zWWbv1HBMNONnaR/tNboyR3/BZd58JJSHlUSCU= +github.com/pierrec/lz4 v2.0.5+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY= +github.com/pierrec/lz4 v2.2.6+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY= +github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= +github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pmezard/go-difflib v0.0.0-20151028094244-d8ed2627bdf0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI= +github.com/posener/complete v1.2.3/go.mod h1:WZIdtGGp+qx0sLrYKtIRAruyNpv6hFCicSgv7Sy7s/s= +github.com/pquerna/cachecontrol v0.0.0-20180517163645-1555304b9b35/go.mod h1:prYjPmNq4d1NPVmpShWobRqXY3q7Vp+80DqgxxUrUIA= +github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= +github.com/prometheus/client_golang v0.9.2/go.mod h1:OsXs2jCmiKlQ1lTBmv21f2mNfw4xf/QclQDMrYNZzcM= +github.com/prometheus/client_golang v0.9.3/go.mod h1:/TN21ttK/J9q6uSwhBd54HahCDft0ttaMvbicHlPoso= +github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo= +github.com/prometheus/client_golang v1.1.0/go.mod h1:I1FGZT9+L76gKKOs5djB6ezCbFQP1xR9D75/vuwEF3g= +github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= +github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +github.com/prometheus/common v0.0.0-20181113130724-41aa239b4cce/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= +github.com/prometheus/common v0.0.0-20181126121408-4724e9255275/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= +github.com/prometheus/common v0.4.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= +github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= +github.com/prometheus/common v0.6.0/go.mod h1:eBmuwkDJBwy6iBfxCBob6t6dR6ENT/y+J+Zk0j9GMYc= +github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= +github.com/prometheus/procfs v0.0.0-20181204211112-1dc9a6cbc91a/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= +github.com/prometheus/procfs v0.0.0-20190507164030-5867b95ac084/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= +github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= +github.com/prometheus/procfs v0.0.3/go.mod h1:4A/X28fw3Fc593LaREMrKMqOKvUAntwMDaekg4FpcdQ= +github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU= +github.com/rboyer/safeio v0.2.1/go.mod h1:Cq/cEPK+YXFn622lsQ0K4KsPZSPtaptHHEldsy7Fmig= +github.com/renier/xmlrpc v0.0.0-20170708154548-ce4a1a486c03/go.mod h1:gRAiPF5C5Nd0eyyRdqIu9qTiFSoZzpTq727b5B8fkkU= +github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg= +github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= +github.com/rs/zerolog v1.4.0/go.mod h1:YbFCdg8HfsridGWAh22vktObvhZbQsZXe4/zB0OKkWU= +github.com/russross/blackfriday v1.5.2 h1:HyvC0ARfnZBqnXwABFeSZHpKvJHJJfPz81GNueLj0oo= +github.com/russross/blackfriday v1.5.2/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g= +github.com/russross/blackfriday/v2 v2.0.1 h1:lPqVAte+HuHNfhJ/0LC98ESWRz8afy9tM/0RK8m9o+Q= +github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= +github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= +github.com/ryanuber/columnize v2.1.0+incompatible/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= +github.com/ryanuber/go-glob v1.0.0/go.mod h1:807d1WSdnB0XRJzKNil9Om6lcp/3a0v4qIHxIXzX/Yc= +github.com/satori/go.uuid v1.2.0/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0= +github.com/satori/go.uuid v1.2.1-0.20181028125025-b2ce2384e17b h1:gQZ0qzfKHQIybLANtM3mBXNUtOfsCFXeTsnBqCsx1KM= +github.com/satori/go.uuid v1.2.1-0.20181028125025-b2ce2384e17b/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0= +github.com/sean-/conswriter v0.0.0-20180208195008-f5ae3917a627/go.mod h1:7zjs06qF79/FKAJpBvFx3P8Ww4UTIMAe+lpNXDHziac= +github.com/sean-/pager v0.0.0-20180208200047-666be9bf53b5/go.mod h1:BeybITEsBEg6qbIiqJ6/Bqeq25bCLbL7YFmpaFfJDuM= +github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc= +github.com/shirou/gopsutil v0.0.0-20181107111621-48177ef5f880/go.mod h1:5b4v6he4MtMOwMlS0TUMTu2PcXUg8+E1lC7eC3UO/RA= +github.com/shirou/gopsutil v2.19.9+incompatible/go.mod h1:5b4v6he4MtMOwMlS0TUMTu2PcXUg8+E1lC7eC3UO/RA= +github.com/shirou/w32 v0.0.0-20160930032740-bb4de0191aa4/go.mod h1:qsXQc7+bwAM3Q1u/4XEfrquwF8Lw7D7y5cD8CuHnfIc= +github.com/shopspring/decimal v0.0.0-20180709203117-cd690d0c9e24/go.mod h1:M+9NzErvs504Cn4c5DxATwIqPbtswREoFCre64PpcG4= +github.com/shurcooL/sanitized_anchor_name v1.0.0 h1:PdmoCO6wvbs+7yrJyMORt4/BmY5IYyJwS/kOiWx8mHo= +github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= +github.com/sirupsen/logrus v1.0.6/go.mod h1:pMByvHTf9Beacp5x1UXfOR9xyW/9antXMhjMPG0dEzc= +github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= +github.com/sirupsen/logrus v1.4.1/go.mod h1:ni0Sbl8bgC9z8RoU9G6nDWqqs/fq4eDPysMBDgk/93Q= +github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= +github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d h1:zE9ykElWQ6/NYmHa3jpm/yHnI4xSofP+UP6SpjHcSeM= +github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= +github.com/smartystreets/goconvey v0.0.0-20190330032615-68dc04aab96a/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= +github.com/smartystreets/goconvey v1.6.4 h1:fv0U8FUIMPNf1L9lnHLvLhgicrIVChEkdzIKYqbNC9s= +github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= +github.com/softlayer/softlayer-go v0.0.0-20180806151055-260589d94c7d/go.mod h1:Cw4GTlQccdRGSEf6KiMju767x0NEHE0YIVPJSaXjlsw= +github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM= +github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= +github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ= +github.com/spf13/afero v1.2.1/go.mod h1:9ZxEEn6pIJ8Rxe320qSDBk6AsU0r9pR7Q4OcevTdifk= +github.com/spf13/afero v1.2.2 h1:5jhuqJyZCZf2JRofRvN/nIFgIWNzPa3/Vz8mYylgbWc= +github.com/spf13/afero v1.2.2/go.mod h1:9ZxEEn6pIJ8Rxe320qSDBk6AsU0r9pR7Q4OcevTdifk= +github.com/spf13/cast v1.3.0 h1:oget//CVOEoFewqQxwr0Ej5yjygnqGkvggSE/gB35Q8= +github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= +github.com/spf13/cobra v0.0.5/go.mod h1:3K3wKZymM7VvHMDS9+Akkh4K60UwM26emMESw8tLCHU= +github.com/spf13/jwalterweatherman v1.0.0 h1:XHEdyB+EcvlqZamSM4ZOMGlc93t6AcsBEu9Gc1vn7yk= +github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo= +github.com/spf13/pflag v0.0.0-20170130214245-9ff6c6923cff/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= +github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= +github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= +github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= +github.com/spf13/viper v1.3.2/go.mod h1:ZiWeW+zYFKm7srdB9IoDzzZXaJaI5eL9QjNiN/DMA2s= +github.com/spf13/viper v1.4.0/go.mod h1:PTJ7Z/lr49W6bUbkmS1V3by4uWynFiR9p7+dSq/yZzE= +github.com/spf13/viper v1.7.0 h1:xVKxvI7ouOI5I+U9s2eeiUfMaWBVoXA3AWskkrqK0VM= +github.com/spf13/viper v1.7.0/go.mod h1:8WkrPz2fc9jxqZNCJI/76HCieCp4Q8HaLFoCha5qpdg= +github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/objx v0.2.0 h1:Hbg2NidpLE8veEBkEZTL3CvlkUIVzuU9jDplZO54c48= +github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE= +github.com/stretchr/testify v0.0.0-20151208002404-e3a8ff8ce365/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= +github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= +github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= +github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= +github.com/stretchr/testify v1.5.1 h1:nOGnQDM7FYENwehXlg/kFVnos3rEvtKTjRvOWSzb6H4= +github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= +github.com/subosito/gotenv v1.2.0 h1:Slr1R9HxAlEKefgq5jn9U+DnETlIUa6HfgEzj0g5d7s= +github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw= +github.com/tebeka/strftime v0.1.3/go.mod h1:7wJm3dZlpr4l/oVK0t1HYIc4rMzQ2XJlOMIUJUJH6XQ= +github.com/tencentcloud/tencentcloud-sdk-go v3.0.83+incompatible/go.mod h1:0PfYow01SHPMhKY31xa+EFz2RStxIqj6JFAJS+IkCi4= +github.com/tent/http-link-go v0.0.0-20130702225549-ac974c61c2f9/go.mod h1:RHkNRtSLfOK7qBTHaeSX1D6BNpI3qw7NTxsmNr4RvN8= +github.com/tevid/gohamcrest v1.1.1 h1:ou+xSqlIw1xfGTg1uq1nif/htZ2S3EzRqLm2BP+tYU0= +github.com/tevid/gohamcrest v1.1.1/go.mod h1:3UvtWlqm8j5JbwYZh80D/PVBt0mJ1eJiYgZMibh0H/k= +github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= +github.com/toolkits/concurrent v0.0.0-20150624120057-a4371d70e3e3/go.mod h1:QDlpd3qS71vYtakd2hmdpqhJ9nwv6mD6A30bQ1BPBFE= +github.com/tv42/httpunix v0.0.0-20150427012821-b75d8614f926/go.mod h1:9ESjWnEqriFuLhtthL60Sar/7RFoluCcXsuvEwTV5KM= +github.com/ugorji/go v1.1.4/go.mod h1:uQMGLiO92mf5W77hV/PUCpI3pbzQx3CRekS0kk+RGrc= +github.com/ugorji/go/codec v0.0.0-20181204163529-d75b2dcb6bc8/go.mod h1:VFNgLljTbGfSG7qAOspJ7OScBnGdDN/yBr0sguwnwf0= +github.com/urfave/cli v1.22.4 h1:u7tSpNPPswAFymm8IehJhy4uJMlUuU/GmqSkvJ1InXA= +github.com/urfave/cli v1.22.4/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= +github.com/vmware/govmomi v0.18.0/go.mod h1:URlwyTFZX72RmxtxuaFL2Uj3fD1JTvZdx59bHWk6aFU= +github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU= +github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q= +github.com/zouyx/agollo/v3 v3.4.4 h1:5G7QNw3fw74Ns8SfnHNhjndV2mlz5Fg8bB7q84ydFYI= +github.com/zouyx/agollo/v3 v3.4.4/go.mod h1:ag0XmE1r4iAgPd6PUnU9TJ0DMEjM1VKX1HUNqQJ2ywU= +go.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= +go.etcd.io/bbolt v1.3.4/go.mod h1:G5EMThwa9y8QZGBClrRx5EY+Yw9kAhnjy3bSjsnlVTQ= +go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= +go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= +go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= +go.uber.org/atomic v1.6.0 h1:Ezj3JGmsOnG1MoRWQkPBsKLe9DwWD9QeXzTRzzldNVk= +go.uber.org/atomic v1.6.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= +go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= +go.uber.org/multierr v1.5.0 h1:KCa4XfM8CWFCpxXRGok+Q0SS/0XBhMDbHHGABQLvD2A= +go.uber.org/multierr v1.5.0/go.mod h1:FeouvMocqHpRaaGuG9EjoKcStLC43Zu/fmqdUMPcKYU= +go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee h1:0mgffUl7nfd+FpvXMVz4IDEaUSmT1ysygQC7qYo7sG4= +go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee/go.mod h1:vJERXedbb3MVM5f9Ejo0C68/HhF8uaILCdgjnY+goOA= +go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= +go.uber.org/zap v1.15.0 h1:ZZCA22JRF2gQE5FoNmhmrf7jeJJ2uhqDUNRYKm8dvmM= +go.uber.org/zap v1.15.0/go.mod h1:Mb2vm2krFEG5DV0W9qcHBYFtp/Wku1cvYaqPsS/WYfc= +golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/crypto v0.0.0-20181029021203-45a5f77698d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/crypto v0.0.0-20181203042331-505ab145d0a9/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/crypto v0.0.0-20190211182817-74369b46fc67/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20190611184440-5c40567a22f8/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20190923035154-9ee001bba392/go.mod h1:/lpIB1dKB+9EgE3H3cr1v9wB50oz8l4C4h62xy7jSTY= +golang.org/x/crypto v0.0.0-20191206172530-e9b2fee46413/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20200220183623-bac4c82f6975/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= +golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= +golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= +golang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek= +golang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY= +golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= +golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= +golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= +golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= +golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= +golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20190409202823-959b441ac422/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20190909230951-414d861bb4ac/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20190930215403-16217165b5de h1:5hukYrvBGR8/eNkX5mdUezrA6JiaEZDtJb9Ei+1LlBs= +golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE= +golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o= +golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= +golang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY= +golang.org/x/net v0.0.0-20170114055629-f2499483f923/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20181023162649-9b4f9f5ad519/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20181201002055-351d144fa1fc/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20181220203305-927f97764cc3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190522155817-f3200d17e092/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= +golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= +golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190923162816-aa69164e4478/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20191004110552-13f9640d40b9/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= +golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sys v0.0.0-20170830134202-bb24a47a89ea/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20181026203630-95b1ffbd15a5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20181107165924-66b7b1311ac8/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20181205085412-a5c9d58dba9a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190129075346-302c3dd5f1cc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190209173611-3b5209105503/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190403152447-81d4e9dc473e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190508220229-2d0786266e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190515120540-06a5c4944438/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190523142557-0e01d883c5c5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190801041406-cbf593c0f2f3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190813064441-fde4db37ae7a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190922100055-0a153f010e69/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190924154521-2837fb4f24fe/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191008105621-543471e840be/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200124204421-9fbb57f87de9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae h1:/WDfKMnPU+m5M4xB+6x4kaepxRw6jWvR5iDRdvjHgy8= +golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/text v0.0.0-20160726164857-2910a502d2bf/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.1-0.20181227161524-e6919f6577db/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= +golang.org/x/text v0.3.2 h1:tW2bmiBqwgJj/UpqtC8EpXEZVYOwU0yG4iWbprSVAcs= +golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= +golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20181011042414-1f849cf54d09/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20181030221726-6c7e314b6563/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= +golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= +golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= +golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= +golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20190907020128-2ca718005c18/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191029041327-9cc4af7d6b2c/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191029190741-b9c20aec41a5/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191112195655-aa38f8e97acc h1:NCy3Ohtk6Iny5V/reW2Ktypo4zIpWBdRJ1uFMjBxdg8= +golang.org/x/tools v0.0.0-20191112195655-aa38f8e97acc/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= +google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M= +google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= +google.golang.org/api v0.9.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= +google.golang.org/api v0.13.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= +google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= +google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= +google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= +google.golang.org/appengine v1.6.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= +google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= +google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= +google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190404172233-64821d5d2107/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190530194941-fb225487d101/go.mod h1:z3L6/3dTEVtUr6QSP8miRzeRqwQOioJ9I66odjN4I7s= +google.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= +google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= +google.golang.org/genproto v0.0.0-20190911173649-1774047e7e51/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8= +google.golang.org/genproto v0.0.0-20191108220845-16a3f7862a1a/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/grpc v1.14.0/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw= +google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= +google.golang.org/grpc v1.19.1/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= +google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= +google.golang.org/grpc v1.21.0/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= +google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= +google.golang.org/grpc v1.22.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= +google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= +gopkg.in/airbrake/gobrake.v2 v2.0.9/go.mod h1:/h5ZAUhDkGaJfjzjKLSjv6zCL6O0LLBxU4K+aSYdM/U= +gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= +gopkg.in/asn1-ber.v1 v1.0.0-20181015200546-f715ec2f112d/go.mod h1:cuepJuh7vyXfUyUwEgHQXw849cJrilpS5NeIjOWESAw= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15 h1:YR8cESwS4TdDjEe65xsg0ogRM/Nc3DYOhEAlW+xobZo= +gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= +gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= +gopkg.in/gemnasium/logrus-airbrake-hook.v2 v2.1.2/go.mod h1:Xk6kEKp8OKb+X14hQBKWaSkCsqBpgog8nAV2xsGOxlo= +gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= +gopkg.in/ini.v1 v1.42.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= +gopkg.in/ini.v1 v1.51.0 h1:AQvPpx3LzTDM0AjnIRlVFwFFGC+npRopjZxLJj6gdno= +gopkg.in/ini.v1 v1.51.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= +gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo= +gopkg.in/square/go-jose.v2 v2.3.1/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI= +gopkg.in/square/go-jose.v2 v2.4.1/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI= +gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= +gopkg.in/yaml.v2 v2.0.0-20170812160011-eb3733d160e7/go.mod h1:JAlM8MvJe8wmxCU4Bli9HhUf9+ttbYbLASfIpnQbh74= +gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.8 h1:obN1ZagJSUGI0Ek/LBmuj4SNLPfIny3KsKFopxRdj10= +gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.1-2019.2.3 h1:3JgtbtFHMiCmsznwGVTUWbgGov+pVqnlf1dEJTNAXeM= +honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= +istio.io/gogo-genproto v0.0.0-20190124151557-6d926a6e6feb/go.mod h1:eIDJ6jNk/IeJz6ODSksHl5Aiczy5JUq6vFhJWI5OtiI= +k8s.io/api v0.16.9/go.mod h1:Y7dZNHs1Xy0mSwSlzL9QShi6qkljnN41yR8oWCRTDe8= +k8s.io/apimachinery v0.16.9/go.mod h1:Xk2vD2TRRpuWYLQNM6lT9R7DSFZUYG03SarNkbGrnKE= +k8s.io/client-go v0.16.9/go.mod h1:ThjPlh7Kx+XoBFOCt775vx5J7atwY7F/zaFzTco5gL0= +k8s.io/gengo v0.0.0-20190128074634-0689ccc1d7d6/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0= +k8s.io/klog v0.0.0-20181102134211-b9b56d5dfc92/go.mod h1:Gq+BEi5rUBO/HRz0bTSXDUcqjScdoY3a9IHpCEIOOfk= +k8s.io/klog v0.3.0/go.mod h1:Gq+BEi5rUBO/HRz0bTSXDUcqjScdoY3a9IHpCEIOOfk= +k8s.io/klog v1.0.0/go.mod h1:4Bi6QPql/J/LkTDqv7R/cd3hPo4k2DG6Ptcz060Ez5I= +k8s.io/kube-openapi v0.0.0-20190816220812-743ec37842bf/go.mod h1:1TqjTSzOxsLGIKfj0lK8EeCP7K1iUG65v09OM0/WG5E= +k8s.io/kube-openapi v0.0.0-20191107075043-30be4d16710a/go.mod h1:1TqjTSzOxsLGIKfj0lK8EeCP7K1iUG65v09OM0/WG5E= +k8s.io/utils v0.0.0-20190801114015-581e00157fb1/go.mod h1:sZAwmy6armz5eXlNoLmJcl4F1QuKu7sr+mFQ0byX7Ew= +launchpad.net/gocheck v0.0.0-20140225173054-000000000087/go.mod h1:hj7XX3B/0A+80Vse0e+BUHsHMTEhd0O4cpUHr/e/BUM= +rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= +sigs.k8s.io/structured-merge-diff v0.0.0-20190525122527-15d366b2352e/go.mod h1:wWxsB5ozmmv/SG7nM11ayaAW51xMvak/t1r0CSlcokI= +sigs.k8s.io/yaml v1.1.0/go.mod h1:UJmg0vDUVViEyp3mgSv9WPwZCDxu4rQW1olrI1uml+o= From 3fe73439946eecbb75ef0199a9898bdadcc597a1 Mon Sep 17 00:00:00 2001 From: "yangqing.xyq" Date: Sun, 27 Sep 2020 18:43:11 +0800 Subject: [PATCH 124/227] rest client supported --- go.mod | 3 +- go.sum | 111 ++------------------------- pkg/client/httpclient/http_client.go | 6 +- 3 files changed, 11 insertions(+), 109 deletions(-) diff --git a/go.mod b/go.mod index 7dcf79bdd..2422fea4f 100644 --- a/go.mod +++ b/go.mod @@ -3,7 +3,7 @@ module github.com/dubbogo/dubbo-go-proxy go 1.14 require ( - github.com/apache/dubbo-go v1.5.0 + github.com/apache/dubbo-go v1.5.1 github.com/ghodss/yaml v1.0.1-0.20190212211648-25d852aebe32 github.com/gin-gonic/gin v1.6.3 github.com/go-playground/validator/v10 v10.3.0 // indirect @@ -19,4 +19,3 @@ require ( google.golang.org/protobuf v1.25.0 // indirect gopkg.in/yaml.v2 v2.3.0 ) - diff --git a/go.sum b/go.sum index 79d401346..221edc591 100644 --- a/go.sum +++ b/go.sum @@ -11,13 +11,7 @@ cloud.google.com/go/firestore v1.1.0/go.mod h1:ulACoGHTpvq5r8rxGJ4ddJZBZqakUQqCl cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I= cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw= dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= -github.com/Azure/azure-sdk-for-go v16.0.0+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc= - ->>>>>>> fc6c351d7cf9adc566416c9f7c3f143a87e3e85c github.com/Azure/azure-sdk-for-go v40.3.0+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc= -github.com/Azure/go-ansiterm v0.0.0-20170929234023-d6e3b3328b78/go.mod h1:LmzpDX56iTiv29bbRTIsUNlaFfuhWRQBWjQdVyAevI8= -github.com/Azure/go-autorest v10.7.0+incompatible/go.mod h1:r+4oMnoxhatjLLJ6zxSWATqVooLgysK6ZNox3g/xq24= -github.com/Azure/go-autorest v10.15.3+incompatible/go.mod h1:r+4oMnoxhatjLLJ6zxSWATqVooLgysK6ZNox3g/xq24= github.com/Azure/go-autorest/autorest v0.9.0/go.mod h1:xyHB1BMZT0cuDHU7I0+g046+BFDTQ8rEZB0s4Yfa6bI= github.com/Azure/go-autorest/autorest v0.9.3/go.mod h1:GsRuLYvwzLjjjRoWEIyMUaYq8GNUx2nRB378IPt/1p0= github.com/Azure/go-autorest/autorest v0.10.0/go.mod h1:/FALq9T/kS7b5J5qsQ+RSTUdAmGFqi0vUdVNNx8q630= @@ -41,18 +35,14 @@ github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03 github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= github.com/DataDog/datadog-go v2.2.0+incompatible/go.mod h1:LButxg5PwREeZtORoXG3tL4fMGNddJ+vMq1mwgfaqoQ= github.com/DataDog/datadog-go v3.2.0+incompatible/go.mod h1:LButxg5PwREeZtORoXG3tL4fMGNddJ+vMq1mwgfaqoQ= -github.com/Jeffail/gabs v1.1.0/go.mod h1:6xMvQMK4k33lb7GUUpaAPh6nKMmemQeg5d4gn7/bOXc= github.com/Microsoft/go-winio v0.4.3/go.mod h1:VhR8bwka0BXejwEJY73c50VrPtXAaKcyvVC4A4RozmA= github.com/Microsoft/go-winio v0.4.13/go.mod h1:qXqCSQ3Xa7+6tgxaGTIe4Kpcdsi+P8jBhyzoq1bpyYA= github.com/NYTimes/gziphandler v0.0.0-20170623195520-56545f4a5d46/go.mod h1:3wb06e3pkSAbeQ52E9H9iFoQsEEwGN64994WTCIhntQ= github.com/NYTimes/gziphandler v1.0.1/go.mod h1:3wb06e3pkSAbeQ52E9H9iFoQsEEwGN64994WTCIhntQ= github.com/NYTimes/gziphandler v1.1.1/go.mod h1:n/CVRwUEOgIxrgPvAQhUUr9oeUtvrhMomdKFjzJNB0c= -github.com/Nvveen/Gotty v0.0.0-20120604004816-cd527374f1e5/go.mod h1:lmUJ/7eu/Q8D7ML55dXQrVaamCz2vxCfdQBasLZfHKk= github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= github.com/PuerkitoBio/purell v1.0.0/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= github.com/PuerkitoBio/urlesc v0.0.0-20160726150825-5bd2802263f2/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE= -github.com/SAP/go-hdb v0.12.0/go.mod h1:etBT+FAi1t5k3K3tf5vQTnosgYmhDkRi8jEnQqCnxF0= -github.com/SermoDigital/jose v0.0.0-20180104203859-803625baeddc/go.mod h1:ARgCUhI1MHQH+ONky/PAtmVHQrP5JlGY0F3poXOp/fA= github.com/StackExchange/wmi v0.0.0-20180116203802-5d049714c4a6/go.mod h1:3eOhrUMpNV+6aFIbp5/iudMxNCF27Vw2OZgy4xEx0Fg= github.com/Workiva/go-datastructures v1.0.50 h1:slDmfW6KCHcC7U+LP3DDBbm4fqTwZGn1beOFPfGaLvo= github.com/Workiva/go-datastructures v1.0.50/go.mod h1:Z+F2Rca0qCsVYDS8z7bAGm8f3UkzuWYS/oBZz5a7VVA= @@ -62,18 +52,10 @@ github.com/afex/hystrix-go v0.0.0-20180502004556-fa1af6a1f4f5/go.mod h1:SkGFH1ia github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= github.com/aliyun/alibaba-cloud-sdk-go v1.61.18/go.mod h1:v8ESoHo4SyHmuB4b1tJqDHxfTGEciD+yhvOU/5s1Rfk= -github.com/aliyun/aliyun-oss-go-sdk v0.0.0-20190307165228-86c17b95fcd5/go.mod h1:T/Aws4fEfogEE9v+HPhhw+CntffsBHJ8nXQCwKr0/g8= -github.com/apache/dubbo-getty v1.3.10 h1:ys5mwjPdxG/KwkPjS6EI0RzQtU6p6FCPoKpaFEzpAL0= -github.com/apache/dubbo-getty v1.3.10/go.mod h1:x6rraK01BL5C7jUM2fPl5KMkAxLVIx54ZB8/XEOik9Y= -github.com/apache/dubbo-go v1.5.0 h1:S+2Xfw/oiGg44iIe34wWumB6AFsA080tb64llb0bKuc= -github.com/apache/dubbo-go v1.5.0/go.mod h1:eY9FotCshc5y8X7e7MCDNW3wadorSq/3XGaNLtSbcFw= -github.com/apache/dubbo-go v1.5.1 h1:9bcGOkek0+x+zqtvykKpuOwkoJfMef0zNxsyPbWOafY= github.com/apache/dubbo-getty v1.3.10 h1:ys5mwjPdxG/KwkPjS6EI0RzQtU6p6FCPoKpaFEzpAL0= github.com/apache/dubbo-getty v1.3.10/go.mod h1:x6rraK01BL5C7jUM2fPl5KMkAxLVIx54ZB8/XEOik9Y= github.com/apache/dubbo-go v1.5.1 h1:hYktTWnMJdzwY0NkvSqJfOERkwFApZ3mH/tQBLVGO34= github.com/apache/dubbo-go v1.5.1/go.mod h1:lxwgtF+27mSFQsSrBLaVbdQpwCp+pBN/mHP4w4/N2Qc= -github.com/apache/dubbo-go-hessian2 v1.6.1 h1:mFKeCZzaCkk4mMOyP+LQ85GHbRyqKT7858KS21JQYA4= -github.com/apache/dubbo-go-hessian2 v1.6.1/go.mod h1:7rEw9guWABQa6Aqb8HeZcsYPHsOS7XT1qtJvkmI6c5w= github.com/apache/dubbo-go-hessian2 v1.6.2 h1:i7F5GjVaUatLQz1x9vUmmSIFj49L8J6rVICdF6xw4qw= github.com/apache/dubbo-go-hessian2 v1.6.2/go.mod h1:7rEw9guWABQa6Aqb8HeZcsYPHsOS7XT1qtJvkmI6c5w= github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o= @@ -83,27 +65,20 @@ github.com/armon/go-metrics v0.0.0-20190430140413-ec5e00d3c878/go.mod h1:3AMJUQh github.com/armon/go-metrics v0.3.0/go.mod h1:zXjbSimjXTd7vOpY8B0/2LpvNvDoXBuplAD+gJD3GYs= github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= github.com/armon/go-radix v1.0.0/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= -github.com/asaskevich/govalidator v0.0.0-20180319081651-7d2e70ef918f/go.mod h1:lB+ZfQJz7igIIfQNfa7Ml4HSf2uFQQRzpGGRXenZAgY= -github.com/aws/aws-sdk-go v1.15.24/go.mod h1:mFuSZ37Z9YOHbQEwBWztmVzqXrEkub65tZoCYDt7FT0= github.com/aws/aws-sdk-go v1.25.41/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= -github.com/baiyubin/aliyun-sts-go-sdk v0.0.0-20180326062324-cfa1a18b161f/go.mod h1:AuiFmCCPBSrqvVMvuqFuk0qogytodnVFVSN5CeJB8Gc= github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= -github.com/bitly/go-hostpool v0.0.0-20171023180738-a3a6125de932/go.mod h1:NOuUCSz6Q9T7+igc/hlvDOUdtWKryOrtFyIVABv/p7k= github.com/bketelsen/crypt v0.0.3-0.20200106085610-5cbc8cc4026c/go.mod h1:MKsuJmJgSg28kpZDP6UIiPt0e0Oz0kqKNGyRaWEPv84= -github.com/bmizerany/assert v0.0.0-20160611221934-b7ed37b82869/go.mod h1:Ekp36dRnpXw/yCqJaO+ZrUyxD+3VXMFFr56k5XYrpB4= github.com/boltdb/bolt v1.3.1/go.mod h1:clJnj/oiGkjum5o1McbSZDSLxVThjynRyGBgiAx27Ps= github.com/buger/jsonparser v0.0.0-20181115193947-bf1c66bbce23/go.mod h1:bbYlZJ7hK1yFx9hf58LP0zeX7UjIGs20ufpu3evjr+s= -github.com/cenkalti/backoff v2.1.1+incompatible/go.mod h1:90ReRw6GdpyfrHakVjL/QHaoyV4aDUVVkXQJJJ3NXXM= github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= github.com/circonus-labs/circonus-gometrics v2.3.1+incompatible/go.mod h1:nmEj6Dob7S7YxXgwXpfOuvO54S+tGdZdw9fuRZt25Ag= github.com/circonus-labs/circonusllhist v0.1.3/go.mod h1:kMXHVDlOchFAehlya5ePtbp5jckzBHf4XRpQvBOLI+I= github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= github.com/cockroachdb/apd v1.1.0/go.mod h1:8Sl8LxpKi29FqWXR16WEFZRNSz3SoPzUzeMeY4+DwBQ= -github.com/containerd/continuity v0.0.0-20181203112020-004b46473808/go.mod h1:GL3xCUCBDV3CZiTSEKksMWbLE66hEyuu9qyDOOqM47Y= github.com/coredns/coredns v1.1.2/go.mod h1:zASH/MVDgR6XZTbxvOnsZfffS+31vg6Ackf/wo1+AM0= github.com/coreos/bbolt v1.3.2/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk= github.com/coreos/bbolt v1.3.3/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk= @@ -126,7 +101,6 @@ github.com/davecgh/go-spew v0.0.0-20151105211317-5215b55f46b2/go.mod h1:J7Y8YcW2 github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/denisenkom/go-mssqldb v0.0.0-20180620032804-94c9c97e8c9f/go.mod h1:xN/JuLBIz4bjkxNmByTiV1IbhfnYb6oo99phBn4Eqhc= github.com/denverdino/aliyungo v0.0.0-20170926055100-d3308649c661/go.mod h1:dV8lFg6daOBZbT6/BDGIz6Y3WFGn8juu6G+CQ6LHtl0= github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no= @@ -136,17 +110,12 @@ github.com/dimchansky/utfbom v1.1.0/go.mod h1:rO41eb7gLfo8SF1jd9F8HplJm1Fewwi4mQ github.com/dnaeon/go-vcr v1.0.1/go.mod h1:aBB1+wY4s93YsC3HHjMBMrwTj2R9FHDzUr9KyGc8n1E= github.com/docker/go-connections v0.3.0/go.mod h1:Gbd7IOopHjR8Iph03tsViu4nIes5XhDvyHbTtUxmeec= github.com/docker/go-connections v0.4.0/go.mod h1:Gbd7IOopHjR8Iph03tsViu4nIes5XhDvyHbTtUxmeec= -github.com/docker/go-units v0.3.3/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= github.com/docker/spdystream v0.0.0-20160310174837-449fdfce4d96/go.mod h1:Qh8CwZgvJUkLughtfhJv5dyTYa91l1fOUCrgjqmcifM= -github.com/dubbogo/getty v1.3.7 h1:xlkYD2/AH34iGteuLMsGjLl2PwBVrbIhHjf3tlUsv1M= -github.com/dubbogo/getty v1.3.7/go.mod h1:XWO4+wAaMqgnBN9Ykv2YxxOAkGxymg6LGO9RK+EiCDY= github.com/dubbogo/go-zookeeper v1.0.1 h1:irLzvOsDOTNsN8Sv9tvYYxVu6DCQfLtziZQtUHmZgz8= github.com/dubbogo/go-zookeeper v1.0.1/go.mod h1:fn6n2CAEer3novYgk9ULLwAjuV8/g4DdC2ENwRb6E+c= -github.com/dubbogo/gost v1.9.0 h1:UT+dWwvLyJiDotxJERO75jB3Yxgsdy10KztR5ycxRAk= github.com/dubbogo/gost v1.9.0/go.mod h1:pPTjVyoJan3aPxBPNUX0ADkXjPibLo+/Ib0/fADXSG8= github.com/dubbogo/gost v1.9.1 h1:0/PPFo13zPbjt4Ia0zYWMFi3C6rAe9X7O1J2Iv+BHNM= github.com/dubbogo/gost v1.9.1/go.mod h1:pPTjVyoJan3aPxBPNUX0ADkXjPibLo+/Ib0/fADXSG8= -github.com/duosecurity/duo_api_golang v0.0.0-20190308151101-6c680f768e74/go.mod h1:UqXY1lYT/ERa4OEAywUqdok1T4RCRdArkhic1Opuavo= github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= github.com/elazarl/go-bindata-assetfs v0.0.0-20160803192304-e1a2a7ec64b0/go.mod h1:v+YaWX3bdea5J/mo8dSETolEo7R71Vk1u8bnjau5yw4= github.com/elazarl/go-bindata-assetfs v1.0.0/go.mod h1:v+YaWX3bdea5J/mo8dSETolEo7R71Vk1u8bnjau5yw4= @@ -161,7 +130,6 @@ github.com/evanphx/json-patch v4.2.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLi github.com/fastly/go-utils v0.0.0-20180712184237-d95a45783239/go.mod h1:Gdwt2ce0yfBxPvZrHkprdPPTTS3N5rwmLE8T22KBXlw= github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= github.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL+zU= -github.com/fatih/structs v0.0.0-20180123065059-ebf56d35bba7/go.mod h1:9NiDSp5zOcgEDl+j00MP/WkGVPOlPRLejGD8Ga6PJ7M= github.com/fatih/structs v1.1.0/go.mod h1:9NiDSp5zOcgEDl+j00MP/WkGVPOlPRLejGD8Ga6PJ7M= github.com/frankban/quicktest v1.4.1/go.mod h1:36zfPVQyHxymz4cH7wlDmVwDrJuljRB60qkgn7rorfQ= github.com/fsnotify/fsnotify v1.4.7 h1:IXs+QLmnXW2CcXuY+8Mzv/fWEsPGWxqefPtCP5CnV9I= @@ -178,7 +146,6 @@ github.com/go-asn1-ber/asn1-ber v1.3.1/go.mod h1:hEBeB/ic+5LoWskz+yKT7vGhhPYkPro github.com/go-co-op/gocron v0.1.1/go.mod h1:Y9PWlYqDChf2Nbgg7kfS+ZsXHDTZbMZYPEQ0MILqH+M= github.com/go-errors/errors v1.0.1/go.mod h1:f4zRHt4oKfwPJE5k8C9vpYG+aDHdBFUsgrm6/TyX73Q= github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= -github.com/go-ini/ini v1.25.4/go.mod h1:ByCAeIL28uOIIG0E3PJtZPDL8WnHpFKFOtgjp+3Ies8= github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= github.com/go-ldap/ldap v3.0.2+incompatible/go.mod h1:qfd9rJvER9Q0/D/Sqn1DfHRoBp40uXYvFoEVrNEPqRc= github.com/go-ldap/ldap/v3 v3.1.3/go.mod h1:3rbOH3jRS2u6jg2rJnKAMLE/xQyCKIveG2Sa/Cohzb8= @@ -190,22 +157,20 @@ github.com/go-openapi/jsonpointer v0.0.0-20160704185906-46af16f9f7b1/go.mod h1:+ github.com/go-openapi/jsonreference v0.0.0-20160704190145-13c6e3589ad9/go.mod h1:W3Z9FmVs9qj+KR4zFKmDPGiLdk1D9Rlm7cyMvf57TTg= github.com/go-openapi/spec v0.0.0-20160808142527-6aced65f8501/go.mod h1:J8+jY1nAiCcj+friV/PDoE1/3eeccG9LYBs0tYvLOWc= github.com/go-openapi/swag v0.0.0-20160704191624-1d0bd113de87/go.mod h1:DXUve3Dpr1UfpPtxFw+EFuQ41HhCWZfha5jSVRG7C7I= +github.com/go-playground/assert/v2 v2.0.1 h1:MsBgLAaY856+nPRTKrp3/OZK38U/wa0CcBYNjji3q3A= github.com/go-playground/assert/v2 v2.0.1/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4= github.com/go-playground/locales v0.13.0 h1:HyWk6mgj5qFqCT5fjGBuRArbVDfE4hi8+e8ceBS/t7Q= github.com/go-playground/locales v0.13.0/go.mod h1:taPMhCMXrRLJO55olJkUXHZBHCxTMfnGwq/HNwmWNS8= github.com/go-playground/universal-translator v0.17.0 h1:icxd5fm+REJzpZx7ZfpaD876Lmtgy7VtROAbHHXk8no= github.com/go-playground/universal-translator v0.17.0/go.mod h1:UkSxE5sNxxRwHyU+Scu5vgOQjsIJAF8j9muTVoKLVtA= -github.com/go-playground/validator/v10 v10.2.0 h1:KgJ0snyC2R9VXYN2rneOtQcw5aHQB1Vv0sFl1UcHBOY= github.com/go-playground/validator/v10 v10.2.0/go.mod h1:uOYAAleCW8F/7oMFd6aG0GOhaH6EGOAJShg8Id5JGkI= github.com/go-playground/validator/v10 v10.3.0 h1:nZU+7q+yJoFmwvNgv/LnPUkwPal62+b2xXj0AU1Es7o= github.com/go-playground/validator/v10 v10.3.0/go.mod h1:uOYAAleCW8F/7oMFd6aG0GOhaH6EGOAJShg8Id5JGkI= github.com/go-redis/redis v6.15.5+incompatible/go.mod h1:NAIEuMOZ/fxfXJIrKDQDz8wamY7mA7PouImQ2Jvg6kA= github.com/go-resty/resty/v2 v2.1.0/go.mod h1:dZGr0i9PLlaaTD4H/hoZIDjQ+r6xq8mgbRzHZf7f2J8= -github.com/go-sql-driver/mysql v0.0.0-20180618115901-749ddf1598b4/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w= github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= github.com/go-test/deep v1.0.2-0.20181118220953-042da051cf31/go.mod h1:wGDj63lr65AM2AQyKZd/NYHGb0R+1RLqB8NKt3aSFNA= github.com/go-test/deep v1.0.2/go.mod h1:wGDj63lr65AM2AQyKZd/NYHGb0R+1RLqB8NKt3aSFNA= -github.com/gocql/gocql v0.0.0-20180617115710-e06f8c1bcd78/go.mod h1:4Fw1eo5iaEhDUs8XyuhSVCVy52Jq3L+/3GJgYkwc+/0= github.com/gogo/googleapis v1.1.0/go.mod h1:gf4bu3Q80BeJ6H1S1vYPm8/ELATdvryBaNFGgqEef3s= github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4= @@ -225,7 +190,6 @@ github.com/golang/protobuf v0.0.0-20161109072736-4bd1920723d7/go.mod h1:6lQm79b+ github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.3 h1:gyjaxf+svBWX08ZjK86iN9geUJF0H6gp2IRKX6Nf6/I= github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA= @@ -235,8 +199,6 @@ github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvq github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8= github.com/golang/protobuf v1.4.2 h1:+Z5KGCizgyZCbGh1KZqA0fcLLkwbsjIzS4aV2v7wJX0= github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= -github.com/golang/snappy v0.0.0-20170215233205-553a64147049/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= -github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/golang/snappy v0.0.1 h1:Qgr9rKW7uDUkrbSmQeiDsGa8SjGyCOGtuasMWwvp2P4= github.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= @@ -245,12 +207,11 @@ github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5a github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.0 h1:/QaMHBdZ26BB3SSst0Iwl10Epc+xhTquomWX0oZEB6w= github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-github v17.0.0+incompatible/go.mod h1:zLgOLi98H3fifZn+44m+umXrS52loVEgC2AApnigrVQ= github.com/google/go-querystring v0.0.0-20170111101155-53e6ce116135/go.mod h1:odCYkC5MyYFN7vkCjXpyrEuKhc/BUO6wN/zVPAxq5ck= github.com/google/go-querystring v1.0.0/go.mod h1:odCYkC5MyYFN7vkCjXpyrEuKhc/BUO6wN/zVPAxq5ck= github.com/google/gofuzz v0.0.0-20161122191042-44d81051d367/go.mod h1:HP5RmnzzSNb993RKQDq4+1A4ia9nllfqcQFTQJedwGI= -github.com/google/gofuzz v0.0.0-20170612174753-24818f796faf/go.mod h1:HP5RmnzzSNb993RKQDq4+1A4ia9nllfqcQFTQJedwGI= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= @@ -262,15 +223,12 @@ github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+ github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= github.com/googleapis/gnostic v0.0.0-20170729233727-0c5108395e2d/go.mod h1:sJBsCZ4ayReDTBIg8b9dl28c5xFWyhBTVRp3pOg5EKY= github.com/googleapis/gnostic v0.2.0/go.mod h1:sJBsCZ4ayReDTBIg8b9dl28c5xFWyhBTVRp3pOg5EKY= -github.com/gophercloud/gophercloud v0.0.0-20180828235145-f29afc2cceca/go.mod h1:3WdhXV3rUYy9p6AUW8d94kr+HS62Y4VL9mBnFxsD8q4= github.com/gophercloud/gophercloud v0.1.0/go.mod h1:vxM41WHh5uqHVBMZHzuwNOHh8XEoIEcSTewFxm1c5g8= -github.com/gopherjs/gopherjs v0.0.0-20180825215210-0210a2f0f73c/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1 h1:EGx4pi6eqNxGaHF6qqu48+N2wcFQ5qg5FXgOdqsJ5d8= github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= github.com/gorilla/websocket v1.4.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= github.com/gorilla/websocket v1.4.2 h1:+/TMaTYc4QFitKJxsQ7Yye35DkWvkdLcvGKqM+x0Ufc= github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= -github.com/gotestyourself/gotestyourself v2.2.0+incompatible/go.mod h1:zZKM6oeNM8k+FRljX1mnzVYeS8wiGgQyvST1/GafPbY= github.com/gregjones/httpcache v0.0.0-20180305231024-9cad4c3443a7/go.mod h1:FecbI9+v66THATjSRHfNgh1IVFe/9kFxbXtjV0ctIMA= github.com/grpc-ecosystem/go-grpc-middleware v1.0.0/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= github.com/grpc-ecosystem/go-grpc-middleware v1.0.1-0.20190118093823-f849b5445de4/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= @@ -278,21 +236,17 @@ github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgf github.com/grpc-ecosystem/grpc-gateway v1.9.0/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= github.com/grpc-ecosystem/grpc-gateway v1.9.5/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= github.com/grpc-ecosystem/grpc-opentracing v0.0.0-20180507213350-8e809c8a8645/go.mod h1:6iZfnjpejD4L/4DwD7NryNaJyCQdzwWwH2MWhCA90Kw= -github.com/hailocab/go-hostpool v0.0.0-20160125115350-e80d13ce29ed/go.mod h1:tMWxXQ9wFIaZeTI9F+hmhFiGpFmhOHzyShyFUhRm0H4= -github.com/hashicorp/consul v1.5.3/go.mod h1:61E2GJCPEP3oq8La7sfDdWGQ66+Zbxzw5ecOdFD7xIE= github.com/hashicorp/consul v1.8.0/go.mod h1:Gg9/UgAQ9rdY3CTvzQZ6g2jcIb7NlIfjI+0pvLk5D1A= github.com/hashicorp/consul/api v1.1.0/go.mod h1:VmuI/Lkw1nC05EYQWNKwWGbkg+FbDBtguAZLlVdkD9Q= github.com/hashicorp/consul/api v1.5.0/go.mod h1:LqwrLNW876eYSuUOo4ZLHBcdKc038txr/IMfbLPATa4= github.com/hashicorp/consul/sdk v0.1.1/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyNV1vwHyQBF0x8= github.com/hashicorp/consul/sdk v0.5.0/go.mod h1:fY08Y9z5SvJqevyZNy6WWPXiG3KwBPAvlcdx16zZ0fM= github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= -github.com/hashicorp/go-bexpr v0.1.0/go.mod h1:ANbpTX1oAql27TZkKVeW8p1w8NTdnyzPe/0qqPCKohU= github.com/hashicorp/go-bexpr v0.1.2/go.mod h1:ANbpTX1oAql27TZkKVeW8p1w8NTdnyzPe/0qqPCKohU= github.com/hashicorp/go-checkpoint v0.0.0-20171009173528-1545e56e46de/go.mod h1:xIwEieBHERyEvaeKF/TcHh1Hu+lxPM+n2vT1+g9I4m4= github.com/hashicorp/go-cleanhttp v0.5.0/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= github.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= github.com/hashicorp/go-connlimit v0.2.0/go.mod h1:OUj9FGL1tPIhl/2RCfzYHrIiWj+VVPGNyVPnUX8AqS0= -github.com/hashicorp/go-discover v0.0.0-20190403160810-22221edb15cd/go.mod h1:ueUgD9BeIocT7QNuvxSyJyPAM9dfifBcaWmeybb67OY= github.com/hashicorp/go-discover v0.0.0-20200501174627-ad1e96bde088/go.mod h1:vZu6Opqf49xX5lsFAu7iFNewkcVF1sn/wyapZh5ytlg= github.com/hashicorp/go-hclog v0.0.0-20180709165350-ff2cf002a8dd/go.mod h1:9bjs9uLqI8l75knNv3lV1kA55veR+WUPSiKIWcQHudI= github.com/hashicorp/go-hclog v0.8.0/go.mod h1:5CU+agLiy3J7N7QjHK5d05KxGsuXiQLrjA0H7acj2lQ= @@ -301,13 +255,11 @@ github.com/hashicorp/go-hclog v0.9.2/go.mod h1:5CU+agLiy3J7N7QjHK5d05KxGsuXiQLrj github.com/hashicorp/go-hclog v0.12.0/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ= github.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= github.com/hashicorp/go-immutable-radix v1.1.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= -github.com/hashicorp/go-memdb v0.0.0-20180223233045-1289e7fffe71/go.mod h1:kbfItVoBJwCfKXDXN4YoAXjxcFVZ7MRrJzyTX6H4giE= github.com/hashicorp/go-memdb v1.0.3/go.mod h1:LWQ8R70vPrS4OEY9k28D2z8/Zzyu34NVzeRibGAzHO0= github.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM= github.com/hashicorp/go-msgpack v0.5.5/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM= github.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk= github.com/hashicorp/go-multierror v1.1.0/go.mod h1:spPvp8C1qA32ftKqdAHm4hHTbPw+vmowP0z+KUhOZdA= -github.com/hashicorp/go-plugin v0.0.0-20180331002553-e8d22c780116/go.mod h1:JSqWYsict+jzcj0+xElxyrBQRPNoiWQuddnxArJ7XHQ= github.com/hashicorp/go-plugin v1.0.1/go.mod h1:++UyYGoz3o5w9ZzAdZxtQKrWWP+iqPBn3cQptSMzBuY= github.com/hashicorp/go-raftchunking v0.6.1/go.mod h1:cGlg3JtDy7qy6c/3Bu660Mic1JF+7lWqIwCFSb08fX0= github.com/hashicorp/go-raftchunking v0.6.3-0.20191002164813-7e9e8525653a/go.mod h1:xbXnmKqX9/+RhPkJ4zrEx4738HacP72aaUPlT2RZ4sU= @@ -324,7 +276,6 @@ github.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/b github.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= github.com/hashicorp/go-uuid v1.0.2-0.20191001231223-f32f5fe8d6a8/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= github.com/hashicorp/go-uuid v1.0.2/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= -github.com/hashicorp/go-version v0.0.0-20170202080759-03c5bf6be031/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= github.com/hashicorp/go-version v1.1.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= github.com/hashicorp/go-version v1.2.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= github.com/hashicorp/go.net v0.0.1/go.mod h1:hjKkEWcCURg++eb33jQU7oqQcI9XDCnUzHA0oac0k90= @@ -338,7 +289,6 @@ github.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO github.com/hashicorp/mdns v1.0.0/go.mod h1:tL+uN++7HEJ6SQLQ2/p+z2pH24WQKWjBPkE0mNTz8vQ= github.com/hashicorp/mdns v1.0.1/go.mod h1:4gW7WsVCke5TE7EPeYliwHlRUyBtfCwuFwuMg2DmyNY= github.com/hashicorp/memberlist v0.1.3/go.mod h1:ajVTdAv/9Im8oMAAj5G31PhhMCZJV2pPBoIllUwCN7I= -github.com/hashicorp/memberlist v0.1.4/go.mod h1:ajVTdAv/9Im8oMAAj5G31PhhMCZJV2pPBoIllUwCN7I= github.com/hashicorp/memberlist v0.2.0/go.mod h1:MS2lj3INKhZjWNqd3N0m3J+Jxf3DAOnAH9VT3Sh9MUE= github.com/hashicorp/memberlist v0.2.2/go.mod h1:MS2lj3INKhZjWNqd3N0m3J+Jxf3DAOnAH9VT3Sh9MUE= github.com/hashicorp/net-rpc-msgpackrpc v0.0.0-20151116020338-a14192a58a69/go.mod h1:/z+jUGRBlwVpUZfjute9jWaF6/HuhjuFQuL1YXzVD1Q= @@ -349,8 +299,6 @@ github.com/hashicorp/raft-boltdb v0.0.0-20171010151810-6e5ba93211ea/go.mod h1:pN github.com/hashicorp/serf v0.8.2/go.mod h1:6hOLApaqBFA1NXqRQAsxw9QxuDEvNxSQRwA/JwenrHc= github.com/hashicorp/serf v0.9.0/go.mod h1:YL0HO+FifKOW2u1ke99DGVu1zhcpZzNwrLIqBC7vbYU= github.com/hashicorp/serf v0.9.2/go.mod h1:UWDWwZeL5cuWDJdl0C6wrvrUwEqtQ4ZKBKKENpqIUyk= -github.com/hashicorp/vault v0.10.3/go.mod h1:KfSyffbKxoVyspOdlaGVjIuwLobi07qD1bAbosPMpP0= -github.com/hashicorp/vault-plugin-secrets-kv v0.0.0-20190318174639-195e0e9d07f1/go.mod h1:VJHHT2SC1tAPrfENQeBhLlb5FbZoKZM+oC/ROmEftz0= github.com/hashicorp/vault/api v1.0.4/go.mod h1:gDcqh3WGcR1cpF5AJz/B1UFheUEneMoIospckxBxk6Q= github.com/hashicorp/vault/api v1.0.5-0.20191108163347-bdd38fca2cff/go.mod h1:Uf8LaHyrYsgVgHzO2tMZKhqRGlL3UJ6XaSwW2EA1Iqo= github.com/hashicorp/vault/sdk v0.1.13/go.mod h1:B+hVj7TpuQY1Y/GPbCpffmgd+tSEwvhkWnjtSYCaS2M= @@ -366,11 +314,9 @@ github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANyt github.com/jackc/fake v0.0.0-20150926172116-812a484cc733/go.mod h1:WrMFNQdiFJ80sQsxDoMokWK1W5TQtxBFNpzWTD84ibQ= github.com/jackc/pgx v3.3.0+incompatible/go.mod h1:0ZGrqGqkRlliWnWB4zKnWtjbSWbGkVEFm4TeybAXq+I= github.com/jarcoal/httpmock v0.0.0-20180424175123-9c70cfe4a1da/go.mod h1:ks+b9deReOc7jgqp+e7LuFiCBH6Rm5hL32cLcEAArb4= -github.com/jefferai/jsonx v0.0.0-20160721235117-9cc31c3135ee/go.mod h1:N0t2vlmpe8nyZB5ouIbJQPDSR+mH6oe7xHB9VZHSUzM= github.com/jehiah/go-strftime v0.0.0-20171201141054-1d33003b3869/go.mod h1:cJ6Cj7dQo+O6GJNiMx+Pa94qKj+TG8ONdKHgMNIyyag= github.com/jinzhu/copier v0.0.0-20190625015134-976e0346caa8 h1:mGIXW/lubQ4B+3bXTLxcTMTjUNDqoF6T/HUW9LbFx9s= github.com/jinzhu/copier v0.0.0-20190625015134-976e0346caa8/go.mod h1:yL958EeXv8Ylng6IfnvG4oflryUi3vgA3xPs9hmII1s= -github.com/jmespath/go-jmespath v0.0.0-20160202185014-0b12d6b521d8/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k= github.com/jmespath/go-jmespath v0.0.0-20180206201540-c2b33e8439af/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k= github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo= github.com/joyent/triton-go v0.0.0-20180628001255-830d2b111e62/go.mod h1:U+RSyWxWd04xTqnuOQxnai7XGS2PrPY2cfGoDKtMHjA= @@ -379,29 +325,19 @@ github.com/json-iterator/go v0.0.0-20180612202835-f2b4162afba3/go.mod h1:+SdeFBv github.com/json-iterator/go v1.1.5/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= github.com/json-iterator/go v1.1.7/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= -github.com/json-iterator/go v1.1.9 h1:9yzud/Ht36ygwatGx56VwCZtlI/2AD15T1X2sjSuGns= github.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= github.com/json-iterator/go v1.1.10 h1:Kz6Cvnvv2wGdaG/V8yMvfkmNiXq9Ya2KUv4rouJJr68= github.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= -github.com/jtolds/gls v4.2.1+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= github.com/jtolds/gls v4.20.0+incompatible h1:xdiiI2gbIgH/gLH7ADydsJ1uDOEzR8yvV7C0MuV77Wo= github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= -github.com/juju/errors v0.0.0-20190930114154-d42613fe1ab9 h1:hJix6idebFclqlfZCHE7EUX7uqLCyb70nHNHH1XKGBg= -github.com/juju/errors v0.0.0-20190930114154-d42613fe1ab9/go.mod h1:W54LbzXuIE0boCoNJfwqpmkKJ1O4TCTZMetAt6jGk7Q= -github.com/juju/loggo v0.0.0-20190526231331-6e530bcce5d8 h1:UUHMLvzt/31azWTN/ifGWef4WUqvXk0iRqdhdy/2uzI= -github.com/juju/loggo v0.0.0-20190526231331-6e530bcce5d8/go.mod h1:vgyd7OREkbtVEN/8IXZe5Ooef3LQePvuBm9UWj6ZL8U= -github.com/juju/testing v0.0.0-20191001232224-ce9dec17d28b h1:Rrp0ByJXEjhREMPGTt3aWYjoIsUGCbt21ekbeJcTWv0= -github.com/juju/testing v0.0.0-20191001232224-ce9dec17d28b/go.mod h1:63prj8cnj0tU0S9OHjGJn+b1h0ZghCndfnbQolrYTwA= github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= -github.com/keybase/go-crypto v0.0.0-20180614160407-5114a9a81e1b/go.mod h1:ghbZscTyKdM07+Fw3KSi0hcJm+AlEUWj8QLlPtijN/M= github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q= github.com/kisielk/errcheck v1.2.0/go.mod h1:/BMXB+zMLi60iA8Vv6Ksmxu/1UDYcXs4uQLJ+jE2L00= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/konsorten/go-windows-terminal-sequences v1.0.2/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= -github.com/kr/pretty v0.1.0 h1:L/CwN0zerZDmRFUapSPitk6f+Q3+0za1rQkzVuMiMFI= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= github.com/kr/pretty v0.2.0 h1:s5hAObm+yFO5uHYt5dYjxi2rXrsnmRpJx4OYvIWUaQs= github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= @@ -413,7 +349,6 @@ github.com/leodido/go-urn v1.2.0/go.mod h1:+8+nEpDfqqsY+g338gtMEUOtuK+4dEMhiQEgx github.com/lestrrat/go-envload v0.0.0-20180220120943-6ed08b54a570/go.mod h1:BLt8L9ld7wVsvEWQbuLrUZnCMnUmLZ+CGDzKtclrTlE= github.com/lestrrat/go-file-rotatelogs v0.0.0-20180223000712-d3151e2a480f/go.mod h1:UGmTpUd3rjbtfIpwAPrcfmGf/Z1HS95TATB+m57TPB8= github.com/lestrrat/go-strftime v0.0.0-20180220042222-ba3bf9c1d042/go.mod h1:TPpsiPUEh0zFL1Snz4crhMlBe60PYxRHr5oFF3rRYg0= -github.com/lib/pq v0.0.0-20180523175426-90697d60dd84/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= github.com/lib/pq v1.1.1/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= github.com/linode/linodego v0.7.1/go.mod h1:ga11n3ivecUrPCHN0rANxKmfWBJVkOXfLMZinAbj2sY= github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= @@ -447,7 +382,6 @@ github.com/mitchellh/hashstructure v0.0.0-20170609045927-2bca23e0e452/go.mod h1: github.com/mitchellh/hashstructure v1.0.0/go.mod h1:QjSHrPWS+BGUVBYkbTZWEnOh3G1DutKwClXU/ABz6AQ= github.com/mitchellh/iochan v1.0.0/go.mod h1:JwYml1nuB7xOzsp52dPpHFffvOCDupsG0QubkSMEySY= github.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= -github.com/mitchellh/mapstructure v1.1.2 h1:fmNYVwqnSfB9mZU6OS2O6GsXM+wcskZDuKQzvN1EDeE= github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= github.com/mitchellh/mapstructure v1.2.3 h1:f/MjBEBDLttYCGfRaKBbKSRVF5aV2O6fnBpzknuE3jU= github.com/mitchellh/mapstructure v1.2.3/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= @@ -464,10 +398,8 @@ github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3Rllmb github.com/munnerz/goautoneg v0.0.0-20120707110453-a547fc61f48d/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= github.com/mxk/go-flowrate v0.0.0-20140419014527-cca7078d478f/go.mod h1:ZdcZmHo+o7JKHSa8/e818NopupXU1YMK5fe1lsApnBw= -github.com/nacos-group/nacos-sdk-go v0.3.3-0.20200617023039-50c7537d6a5f/go.mod h1:fti1GlX/EB6RDKvzK/P7Vuibqj0JMPJHQwrcTU1tLXk= github.com/nacos-group/nacos-sdk-go v1.0.0/go.mod h1:hlAPn3UdzlxIlSILAyOXKxjFSvDJ9oLzTJ9hLAK1KzA= github.com/nicolai86/scaleway-sdk v1.10.2-0.20180628010248-798f60e20bb2/go.mod h1:TLb2Sg7HQcgGdloNxkrmtgDNR9uVYF3lfdFIN4Ro6Sk= -github.com/oklog/run v0.0.0-20180308005104-6934b124db28/go.mod h1:dlhp/R75TPv97u0XWUtDeV/lRKWPKSdTuV0TZvrmrQA= github.com/oklog/run v1.0.0/go.mod h1:dlhp/R75TPv97u0XWUtDeV/lRKWPKSdTuV0TZvrmrQA= github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U= github.com/olekukonko/tablewriter v0.0.0-20180130162743-b8a9be070da4/go.mod h1:vsDQFd/mU46D+Z4whnwzcISnGGzXWMclvtLoiIKAKIo= @@ -476,20 +408,13 @@ github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+W github.com/onsi/ginkgo v1.8.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.10.1/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/gomega v0.0.0-20170829124025-dcabb60a477c/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= -github.com/onsi/gomega v1.4.1/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= -github.com/onsi/gomega v1.4.2/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= github.com/onsi/gomega v1.5.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= github.com/onsi/gomega v1.7.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= -github.com/opencontainers/go-digest v1.0.0-rc1/go.mod h1:cMLVZDEM3+U2I4VmLI6N8jQYUd2OVphdqWwCJHrFt2s= -github.com/opencontainers/image-spec v1.0.1/go.mod h1:BtxoFyWECRxE4U/7sNtV5W15zMzWCbyJoFRP3s7yZA0= -github.com/opencontainers/runc v0.1.1/go.mod h1:qT5XzbpPznkRYVz/mWwUaVBUv2rmF59PVA73FjuZG0U= github.com/opentracing/opentracing-go v1.1.0 h1:pWlfV3Bxv7k65HYwkikxat0+s3pV4bsqf19k25Ur8rU= github.com/opentracing/opentracing-go v1.1.0/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= -github.com/ory/dockertest v3.3.4+incompatible/go.mod h1:1vX4m9wsvi00u5bseYwXaSnhNrne+V0E6LAcBILJdPs= github.com/packethost/packngo v0.1.1-0.20180711074735-b9cb5096f54c/go.mod h1:otzZQXgoO96RTzDB/Hycg0qZcXZsWJGJRSXbmEIJ+4M= github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= github.com/pascaldekloe/goe v0.1.0/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= -github.com/patrickmn/go-cache v0.0.0-20180527043350-9f6ff22cfff8/go.mod h1:3Qf8kWWT7OJRJbdiICTKqZju1ZixQ/KpMGzzAfe6+WQ= github.com/patrickmn/go-cache v2.1.0+incompatible/go.mod h1:3Qf8kWWT7OJRJbdiICTKqZju1ZixQ/KpMGzzAfe6+WQ= github.com/pelletier/go-toml v1.2.0 h1:T5zMGML61Wp+FlcbWjRDT7yAxhJNAiPPLOFECq181zc= github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= @@ -536,7 +461,6 @@ github.com/russross/blackfriday/v2 v2.0.1 h1:lPqVAte+HuHNfhJ/0LC98ESWRz8afy9tM/0 github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= github.com/ryanuber/columnize v2.1.0+incompatible/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= -github.com/ryanuber/go-glob v0.0.0-20170128012129-256dc444b735/go.mod h1:807d1WSdnB0XRJzKNil9Om6lcp/3a0v4qIHxIXzX/Yc= github.com/ryanuber/go-glob v1.0.0/go.mod h1:807d1WSdnB0XRJzKNil9Om6lcp/3a0v4qIHxIXzX/Yc= github.com/satori/go.uuid v1.2.0/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0= github.com/satori/go.uuid v1.2.1-0.20181028125025-b2ce2384e17b h1:gQZ0qzfKHQIybLANtM3mBXNUtOfsCFXeTsnBqCsx1KM= @@ -554,7 +478,9 @@ github.com/sirupsen/logrus v1.0.6/go.mod h1:pMByvHTf9Beacp5x1UXfOR9xyW/9antXMhjM github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= github.com/sirupsen/logrus v1.4.1/go.mod h1:ni0Sbl8bgC9z8RoU9G6nDWqqs/fq4eDPysMBDgk/93Q= github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= -github.com/smartystreets/assertions v0.0.0-20180820201707-7c9eb446e3cf/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= +github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d h1:zE9ykElWQ6/NYmHa3jpm/yHnI4xSofP+UP6SpjHcSeM= +github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= +github.com/smartystreets/goconvey v0.0.0-20190330032615-68dc04aab96a/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= github.com/smartystreets/goconvey v1.6.4 h1:fv0U8FUIMPNf1L9lnHLvLhgicrIVChEkdzIKYqbNC9s= github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= github.com/softlayer/softlayer-go v0.0.0-20180806151055-260589d94c7d/go.mod h1:Cw4GTlQccdRGSEf6KiMju767x0NEHE0YIVPJSaXjlsw= @@ -570,7 +496,6 @@ github.com/spf13/cobra v0.0.5/go.mod h1:3K3wKZymM7VvHMDS9+Akkh4K60UwM26emMESw8tL github.com/spf13/jwalterweatherman v1.0.0 h1:XHEdyB+EcvlqZamSM4ZOMGlc93t6AcsBEu9Gc1vn7yk= github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo= github.com/spf13/pflag v0.0.0-20170130214245-9ff6c6923cff/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= -github.com/spf13/pflag v1.0.2/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= @@ -579,7 +504,6 @@ github.com/spf13/viper v1.4.0/go.mod h1:PTJ7Z/lr49W6bUbkmS1V3by4uWynFiR9p7+dSq/y github.com/spf13/viper v1.7.0 h1:xVKxvI7ouOI5I+U9s2eeiUfMaWBVoXA3AWskkrqK0VM= github.com/spf13/viper v1.7.0/go.mod h1:8WkrPz2fc9jxqZNCJI/76HCieCp4Q8HaLFoCha5qpdg= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/objx v0.1.1 h1:2vfRuCMp5sSVIDSqO8oNnWJq7mPa6KVP3iPIwFBuy8A= github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.2.0 h1:Hbg2NidpLE8veEBkEZTL3CvlkUIVzuU9jDplZO54c48= github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE= @@ -600,12 +524,10 @@ github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1 github.com/toolkits/concurrent v0.0.0-20150624120057-a4371d70e3e3/go.mod h1:QDlpd3qS71vYtakd2hmdpqhJ9nwv6mD6A30bQ1BPBFE= github.com/tv42/httpunix v0.0.0-20150427012821-b75d8614f926/go.mod h1:9ESjWnEqriFuLhtthL60Sar/7RFoluCcXsuvEwTV5KM= github.com/ugorji/go v1.1.4/go.mod h1:uQMGLiO92mf5W77hV/PUCpI3pbzQx3CRekS0kk+RGrc= -github.com/ugorji/go v1.1.7 h1:/68gy2h+1mWMrwZFeD1kQialdSzAb432dtpeJ42ovdo= github.com/ugorji/go v1.1.7/go.mod h1:kZn38zHttfInRq0xu/PH0az30d+z6vm202qpg1oXVMw= github.com/ugorji/go v1.1.8 h1:/D9x7IRpfMHDlizVOgxrag5Fh+/NY+LtI8bsr+AswRA= github.com/ugorji/go v1.1.8/go.mod h1:0lNM99SwWUIRhCXnigEMClngXBk/EmpTXa7mgiewYWA= github.com/ugorji/go/codec v0.0.0-20181204163529-d75b2dcb6bc8/go.mod h1:VFNgLljTbGfSG7qAOspJ7OScBnGdDN/yBr0sguwnwf0= -github.com/ugorji/go/codec v1.1.7 h1:2SvQaVZ1ouYrrKKwoSk2pzd4A9evlKJb9oTL+OaLUSs= github.com/ugorji/go/codec v1.1.7/go.mod h1:Ax+UKWsSmolVDwsd+7N3ZtXu+yMGCf907BLYF3GoBXY= github.com/ugorji/go/codec v1.1.8 h1:4dryPvxMP9OtkjIbuNeK2nb27M38XMHLGlfNSNph/5s= github.com/ugorji/go/codec v1.1.8/go.mod h1:X00B19HDtwvKbQY2DcYjvZxKQp8mzrJoQ6EgoIY/D2E= @@ -636,7 +558,6 @@ golang.org/x/crypto v0.0.0-20181029021203-45a5f77698d3/go.mod h1:6SG95UA2DQfeDnf golang.org/x/crypto v0.0.0-20181203042331-505ab145d0a9/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20190211182817-74369b46fc67/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= -golang.org/x/crypto v0.0.0-20190325154230-a5d413f7728c/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190611184440-5c40567a22f8/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= @@ -684,7 +605,6 @@ golang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLL golang.org/x/net v0.0.0-20190923162816-aa69164e4478/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20191004110552-13f9640d40b9/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/oauth2 v0.0.0-20170807180024-9a379c6b3e95/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= @@ -726,9 +646,7 @@ golang.org/x/sys v0.0.0-20191008105621-543471e840be/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200124204421-9fbb57f87de9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5 h1:LfCXLvNmTYH9kEmVgqbnsWfruoXZIrh4YBgqVHtDvw0= golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae h1:/WDfKMnPU+m5M4xB+6x4kaepxRw6jWvR5iDRdvjHgy8= golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200916084744-dbad9cb7cb7a h1:chkwkn8HYWVtTE5DCQNKYlkyptadXYY0+PuyaVdyMo4= golang.org/x/sys v0.0.0-20200916084744-dbad9cb7cb7a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -738,7 +656,6 @@ golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3 golang.org/x/text v0.3.1-0.20181227161524-e6919f6577db/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= golang.org/x/text v0.3.2 h1:tW2bmiBqwgJj/UpqtC8EpXEZVYOwU0yG4iWbprSVAcs= golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= -golang.org/x/time v0.0.0-20180412165947-fbb02b2291d2/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= @@ -762,13 +679,12 @@ golang.org/x/tools v0.0.0-20190907020128-2ca718005c18/go.mod h1:b+2E5dAYhXwXZwtn golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191029041327-9cc4af7d6b2c/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191029190741-b9c20aec41a5 h1:hKsoRgsbwY1NafxrwTs+k64bikrLBkAgPir1TNCj3Zs= golang.org/x/tools v0.0.0-20191029190741-b9c20aec41a5/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191112195655-aa38f8e97acc h1:NCy3Ohtk6Iny5V/reW2Ktypo4zIpWBdRJ1uFMjBxdg8= golang.org/x/tools v0.0.0-20191112195655-aa38f8e97acc/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543 h1:E7g+9GITq07hpfrRu66IVDexMakfv52eLZ2CXBWiKr4= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -google.golang.org/api v0.0.0-20180829000535-087779f1d2c9/go.mod h1:4mhQ8q/RsB7i+udVvVy5NUi08OU8ZlA0gRVgrF7VFY0= google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M= google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= @@ -798,7 +714,6 @@ google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiq google.golang.org/grpc v1.21.0/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= google.golang.org/grpc v1.22.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= -google.golang.org/grpc v1.22.1/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= @@ -807,7 +722,6 @@ google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQ google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE= google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo= google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= -google.golang.org/protobuf v1.23.0 h1:4MY060fB1DLGMB/7MBTLnwQUY6+F09GEiz6SsrNqyzM= google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= google.golang.org/protobuf v1.25.0 h1:Ejskq+SyPohKW+1uil0JJMtmHCgJPJ/qWTxr8qp+R4c= @@ -816,7 +730,6 @@ gopkg.in/airbrake/gobrake.v2 v2.0.9/go.mod h1:/h5ZAUhDkGaJfjzjKLSjv6zCL6O0LLBxU4 gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= gopkg.in/asn1-ber.v1 v1.0.0-20181015200546-f715ec2f112d/go.mod h1:cuepJuh7vyXfUyUwEgHQXw849cJrilpS5NeIjOWESAw= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127 h1:qIbj1fsPNlZgppZ+VLlY7N33q108Sa+fhmuc+sWQYwY= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15 h1:YR8cESwS4TdDjEe65xsg0ogRM/Nc3DYOhEAlW+xobZo= gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= @@ -827,9 +740,6 @@ gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= gopkg.in/ini.v1 v1.42.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= gopkg.in/ini.v1 v1.51.0 h1:AQvPpx3LzTDM0AjnIRlVFwFFGC+npRopjZxLJj6gdno= gopkg.in/ini.v1 v1.51.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= -gopkg.in/mgo.v2 v2.0.0-20160818020120-3f83fa500528 h1:/saqWwm73dLmuzbNhe92F0QsZ/KiFND+esHco2v1hiY= -gopkg.in/mgo.v2 v2.0.0-20160818020120-3f83fa500528/go.mod h1:yeKp02qBN3iKW1OzL3MGk2IdtZzaj7SFntXj72NppTA= -gopkg.in/ory-am/dockertest.v3 v3.3.4/go.mod h1:s9mmoLkaGeAh97qygnNj4xWkiN7e1SKekYC6CovU+ek= gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo= gopkg.in/square/go-jose.v2 v2.3.1/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI= gopkg.in/square/go-jose.v2 v2.4.1/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI= @@ -838,11 +748,9 @@ gopkg.in/yaml.v2 v2.0.0-20170812160011-eb3733d160e7/go.mod h1:JAlM8MvJe8wmxCU4Bl gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.8 h1:obN1ZagJSUGI0Ek/LBmuj4SNLPfIny3KsKFopxRdj10= gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.3.0 h1:clyUAQHOM3G0M3f5vQj7LuJrETvjVot3Z5el9nffUtU= gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gotest.tools v2.2.0+incompatible/go.mod h1:DsYFclhRJ6vuDpmuTbkuFWG+y2sxOXAzmJt81HFBacw= honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= @@ -850,14 +758,9 @@ honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWh honnef.co/go/tools v0.0.1-2019.2.3 h1:3JgtbtFHMiCmsznwGVTUWbgGov+pVqnlf1dEJTNAXeM= honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= istio.io/gogo-genproto v0.0.0-20190124151557-6d926a6e6feb/go.mod h1:eIDJ6jNk/IeJz6ODSksHl5Aiczy5JUq6vFhJWI5OtiI= -k8s.io/api v0.0.0-20180806132203-61b11ee65332/go.mod h1:iuAfoD4hCxJ8Onx9kaTIt30j7jUFS00AXQi6QMi99vA= -k8s.io/api v0.0.0-20190325185214-7544f9db76f6/go.mod h1:iuAfoD4hCxJ8Onx9kaTIt30j7jUFS00AXQi6QMi99vA= k8s.io/api v0.16.9/go.mod h1:Y7dZNHs1Xy0mSwSlzL9QShi6qkljnN41yR8oWCRTDe8= -k8s.io/apimachinery v0.0.0-20180821005732-488889b0007f/go.mod h1:ccL7Eh7zubPUSh9A3USN90/OzHNSVN6zxzde07TDCL0= -k8s.io/apimachinery v0.0.0-20190223001710-c182ff3b9841/go.mod h1:ccL7Eh7zubPUSh9A3USN90/OzHNSVN6zxzde07TDCL0= k8s.io/apimachinery v0.16.9/go.mod h1:Xk2vD2TRRpuWYLQNM6lT9R7DSFZUYG03SarNkbGrnKE= k8s.io/client-go v0.16.9/go.mod h1:ThjPlh7Kx+XoBFOCt775vx5J7atwY7F/zaFzTco5gL0= -k8s.io/client-go v8.0.0+incompatible/go.mod h1:7vJpHMYJwNQCWgzmNV+VYUl1zCObLyodBc8nIyt8L5s= k8s.io/gengo v0.0.0-20190128074634-0689ccc1d7d6/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0= k8s.io/klog v0.0.0-20181102134211-b9b56d5dfc92/go.mod h1:Gq+BEi5rUBO/HRz0bTSXDUcqjScdoY3a9IHpCEIOOfk= k8s.io/klog v0.3.0/go.mod h1:Gq+BEi5rUBO/HRz0bTSXDUcqjScdoY3a9IHpCEIOOfk= @@ -868,4 +771,4 @@ k8s.io/utils v0.0.0-20190801114015-581e00157fb1/go.mod h1:sZAwmy6armz5eXlNoLmJcl launchpad.net/gocheck v0.0.0-20140225173054-000000000087/go.mod h1:hj7XX3B/0A+80Vse0e+BUHsHMTEhd0O4cpUHr/e/BUM= rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= sigs.k8s.io/structured-merge-diff v0.0.0-20190525122527-15d366b2352e/go.mod h1:wWxsB5ozmmv/SG7nM11ayaAW51xMvak/t1r0CSlcokI= -sigs.k8s.io/yaml v1.1.0/go.mod h1:UJmg0vDUVViEyp3mgSv9WPwZCDxu4rQW1olrI1uml+o= \ No newline at end of file +sigs.k8s.io/yaml v1.1.0/go.mod h1:UJmg0vDUVViEyp3mgSv9WPwZCDxu4rQW1olrI1uml+o= diff --git a/pkg/client/httpclient/http_client.go b/pkg/client/httpclient/http_client.go index 2da99b83c..38272a0b6 100644 --- a/pkg/client/httpclient/http_client.go +++ b/pkg/client/httpclient/http_client.go @@ -86,7 +86,7 @@ func (dc *HttpClient) Close() error { // Call invoke service func (dc *HttpClient) Call(r *client.Request) (resp client.Response, err error) { - dm := r.Api.Metadata.(*DubboMetadata) + dm := r.Api.Metadata.(*RestMetadata) gs := dc.Get(dm.Interface, dm.Version, dm.Group, dm) var reqData []interface{} @@ -150,7 +150,7 @@ func (dc *HttpClient) check(key string) bool { } } -func (dc *HttpClient) create(key string, dm *DubboMetadata) *dg.GenericService { +func (dc *HttpClient) create(key string, dm *RestMetadata) *dg.GenericService { referenceConfig := dg.NewReferenceConfig(dm.Interface, context.TODO()) referenceConfig.InterfaceName = dm.Interface referenceConfig.Cluster = constant.DEFAULT_CLUSTER @@ -185,7 +185,7 @@ func (dc *HttpClient) create(key string, dm *DubboMetadata) *dg.GenericService { } // Get find a dubbo GenericService -func (dc *HttpClient) Get(interfaceName, version, group string, dm *DubboMetadata) *dg.GenericService { +func (dc *HttpClient) Get(interfaceName, version, group string, dm *RestMetadata) *dg.GenericService { key := strings.Join([]string{dm.ApplicationName, interfaceName, version, group}, "_") if dc.check(key) { return dc.get(key) From 12e182f1ac93e609f3730c5330cab7dd08232149 Mon Sep 17 00:00:00 2001 From: "yangqing.xyq" Date: Sun, 27 Sep 2020 20:30:15 +0800 Subject: [PATCH 125/227] add rest client but not implement it. --- pkg/client/client.go | 20 ++++++++++++++++++-- pkg/client/httpclient/http_client.go | 2 -- pkg/context/base_context.go | 5 +++++ pkg/context/context.go | 2 +- pkg/filter/remote_call_filter.go | 14 +++++--------- 5 files changed, 29 insertions(+), 14 deletions(-) diff --git a/pkg/client/client.go b/pkg/client/client.go index 128992715..6afa990e7 100644 --- a/pkg/client/client.go +++ b/pkg/client/client.go @@ -36,14 +36,30 @@ type ClientPool struct { poolMap map[model.ApiType]*sync.Pool } -func (pool *ClientPool) getClient(t model.ApiType) (Client, error) { +var ( + _clinetPool *ClientPool + once = sync.Once{} +) + +// SingleDubboClient singleton dubbo clent +func SingletonPool() *ClientPool { + if _clinetPool == nil { + once.Do(func() { + _clinetPool = newClientPool() + }) + } + + return _clinetPool +} + +func (pool *ClientPool) GetClient(t model.ApiType) (Client, error) { if pool.poolMap[t] != nil { return pool.poolMap[t].Get().(Client), nil } return nil, errors.New("protocol not supported yet") } -func NewClientPool() *ClientPool { +func newClientPool() *ClientPool { clientPool := &ClientPool{ poolMap: make(map[model.ApiType]*sync.Pool), } diff --git a/pkg/client/httpclient/http_client.go b/pkg/client/httpclient/http_client.go index 38272a0b6..3a3413904 100644 --- a/pkg/client/httpclient/http_client.go +++ b/pkg/client/httpclient/http_client.go @@ -88,9 +88,7 @@ func (dc *HttpClient) Close() error { func (dc *HttpClient) Call(r *client.Request) (resp client.Response, err error) { dm := r.Api.Metadata.(*RestMetadata) gs := dc.Get(dm.Interface, dm.Version, dm.Group, dm) - var reqData []interface{} - l := len(dm.Types) switch { case l == 1: diff --git a/pkg/context/base_context.go b/pkg/context/base_context.go index 940180184..f6beccf53 100644 --- a/pkg/context/base_context.go +++ b/pkg/context/base_context.go @@ -18,6 +18,7 @@ package context import ( + "log" "math" ) @@ -48,6 +49,10 @@ func (c *BaseContext) Next() { func (c *BaseContext) Abort() { c.Index = abortIndex } +func (c *BaseContext) AbortAndLog(message string, err error) { + c.Index = abortIndex + log.Println(message, err) //TODO print stack +} func (c *BaseContext) AppendFilterFunc(ff ...FilterFunc) { for _, v := range ff { diff --git a/pkg/context/context.go b/pkg/context/context.go index 75a631e34..ace854f80 100644 --- a/pkg/context/context.go +++ b/pkg/context/context.go @@ -25,7 +25,7 @@ import ( type Context interface { Next() Abort() - + AbortAndLog(string, error) AppendFilterFunc(ff ...FilterFunc) Status(code int) diff --git a/pkg/filter/remote_call_filter.go b/pkg/filter/remote_call_filter.go index b1d15c94a..4f57f0d80 100644 --- a/pkg/filter/remote_call_filter.go +++ b/pkg/filter/remote_call_filter.go @@ -18,7 +18,6 @@ package filter import ( - "github.com/dubbogo/dubbo-go-proxy/pkg/model" "io/ioutil" ) @@ -32,7 +31,6 @@ import ( import ( "github.com/dubbogo/dubbo-go-proxy/pkg/client" - "github.com/dubbogo/dubbo-go-proxy/pkg/client/dubbo" "github.com/dubbogo/dubbo-go-proxy/pkg/common/constant" "github.com/dubbogo/dubbo-go-proxy/pkg/common/extension" "github.com/dubbogo/dubbo-go-proxy/pkg/context" @@ -53,19 +51,17 @@ func RemoteCall() context.FilterFunc { func doRemoteCall(c *http.HttpContext) { api := c.GetApi() - client := ClientPool.getClient(api.IType) - client.call(metadata) - switch api.IType { - case model.REST: - + cl, e := client.SingletonPool().GetClient(api.IType) + if e != nil { + c.WriteFail() + c.AbortAndLog("", e) } - if bytes, err := ioutil.ReadAll(c.Request.Body); err != nil { logger.Errorf("[dubboproxy go] read body err:%v!", err) c.WriteFail() c.Abort() } else { - if resp, err := dubbo.SingleDubboClient().Call(client.NewRequest(bytes, api)); err != nil { + if resp, err := cl.Call(client.NewRequest(bytes, api)); err != nil { logger.Errorf("[dubboproxy go] client do err:%v!", err) c.WriteFail() c.Abort() From 4b4a2606403bce9e1c62b73c5ca29bb4eec35837 Mon Sep 17 00:00:00 2001 From: "yangqing.xyq" Date: Tue, 29 Sep 2020 19:09:35 +0800 Subject: [PATCH 126/227] add rest client but not implement it. --- pkg/client/httpclient/http_client.go | 45 +--------------------------- 1 file changed, 1 insertion(+), 44 deletions(-) diff --git a/pkg/client/httpclient/http_client.go b/pkg/client/httpclient/http_client.go index 3a3413904..59df87289 100644 --- a/pkg/client/httpclient/http_client.go +++ b/pkg/client/httpclient/http_client.go @@ -86,50 +86,7 @@ func (dc *HttpClient) Close() error { // Call invoke service func (dc *HttpClient) Call(r *client.Request) (resp client.Response, err error) { - dm := r.Api.Metadata.(*RestMetadata) - gs := dc.Get(dm.Interface, dm.Version, dm.Group, dm) - var reqData []interface{} - l := len(dm.Types) - switch { - case l == 1: - t := dm.Types[0] - switch t { - case JavaStringClassName: - var s string - if err := json.Unmarshal(r.Body, &s); err != nil { - logger.Errorf("params parse error:%+v", err) - } else { - reqData = append(reqData, s) - } - case JavaLangClassName: - var i int - if err := json.Unmarshal(r.Body, &i); err != nil { - logger.Errorf("params parse error:%+v", err) - } else { - reqData = append(reqData, i) - } - default: - bodyMap := make(map[string]interface{}) - if err := json.Unmarshal(r.Body, &bodyMap); err != nil { - return *client.EmptyResponse, err - } else { - reqData = append(reqData, bodyMap) - } - } - case l > 1: - if err = json.Unmarshal(r.Body, &reqData); err != nil { - return *client.EmptyResponse, err - } - } - - logger.Debugf("[dubbogo proxy] invoke, method:%v, types:%v, reqData:%v", dm.Method, dm.Types, reqData) - - if resp, err := gs.Invoke(context.Background(), []interface{}{dm.Method, dm.Types, reqData}); err != nil { - return *client.EmptyResponse, err - } else { - logger.Debugf("[dubbogo proxy] dubbo client resp:%v", resp) - return *NewDubboResponse(resp), nil - } + //TODO:get Matched rest api url according to input url ,then make a http call. } func (dc *HttpClient) get(key string) *dg.GenericService { From f2fa3cf79ded527f349a86dc46a88b407fdb1949 Mon Sep 17 00:00:00 2001 From: williamfeng323 Date: Thu, 8 Oct 2020 01:06:54 +0800 Subject: [PATCH 127/227] load the API router config into the local memory --- pkg/config/api_config.go | 60 +++---- pkg/config/mock/api_config.yml | 94 +++++++++++ pkg/filter/api_filter.go | 4 +- pkg/router/route_test.go | 4 + pkg/service/api.go | 28 ++++ pkg/service/api/discovery_service.go | 95 ++++++++++- pkg/service/api/discovery_service_test.go | 195 ++++++++++++++++++++++ pkg/service/discovery_service.go | 6 + 8 files changed, 447 insertions(+), 39 deletions(-) create mode 100644 pkg/service/api.go create mode 100644 pkg/service/api/discovery_service_test.go diff --git a/pkg/config/api_config.go b/pkg/config/api_config.go index d191397e3..b3c69602e 100644 --- a/pkg/config/api_config.go +++ b/pkg/config/api_config.go @@ -51,67 +51,67 @@ const ( // APIConfig defines the data structure of the api gateway configuration type APIConfig struct { - Name string `yaml:"name"` - Description string `yaml:"description"` - Resources []Resource `yaml:"resources"` - Definitions []Definition `yaml:"definitions"` + Name string `json:"name" yaml:"name"` + Description string `json:"description" yaml:"description"` + Resources []Resource `json:"resources" yaml:"resources"` + Definitions []Definition `json:"definitions" yaml:"definitions"` } // Resource defines the API path type Resource struct { - Type string `yaml:"type"` // Restful, Dubbo - Path string `yaml:"path"` - Description string `yaml:"description"` - Filters []string `yaml:"filters"` - Methods []Method `yaml:"methods"` - Resources []Resource `yaml:"resources,omitempty"` + Type string `json:"type" yaml:"type"` // Restful, Dubbo + Path string `json:"path" yaml:"path"` + Description string `json:"description" yaml:"description"` + Filters []string `json:"filters" yaml:"filters"` + Methods []Method `json:"methods" yaml:"methods"` + Resources []Resource `json:"resources,omitempty" yaml:"resources,omitempty"` } // Method defines the method of the api type Method struct { - OnAir bool `yaml:"onAir"` // true means the method is up and false means method is down - Filters []string `yaml:"filters"` - HTTPVerb `yaml:"httpVerb"` - InboundRequest `yaml:"inboundRequest"` - IntegrationRequest `yaml:"integrationRequest"` + OnAir bool `json:"onAir" yaml:"onAir"` // true means the method is up and false means method is down + Filters []string `json:"filters" yaml:"filters"` + HTTPVerb `json:"httpVerb" yaml:"httpVerb"` + InboundRequest `json:"inboundRequest" yaml:"inboundRequest"` + IntegrationRequest `json:"integrationRequest" yaml:"integrationRequest"` } // InboundRequest defines the details of the inbound type InboundRequest struct { - RequestType string `yaml:"requestType"` //http, TO-DO: dubbo - Headers []Params `yaml:"headers"` - QueryStrings []Params `yaml:"queryStrings"` - RequestBody []BodyDefinition `yaml:"requestBody"` + RequestType string `json:"requestType" yaml:"requestType"` //http, TO-DO: dubbo + Headers []Params `json:"headers" yaml:"headers"` + QueryStrings []Params `json:"queryStrings" yaml:"queryStrings"` + RequestBody []BodyDefinition `json:"requestBody" yaml:"requestBody"` } // Params defines the simple parameter definition type Params struct { - Name string `yaml:"name"` - Required bool `yaml:"required"` + Name string `json:"name" yaml:"name"` + Required bool `json:"required" yaml:"required"` } // BodyDefinition connects the request body to the definitions type BodyDefinition struct { - DefinitionName string `yaml:"definitionName"` + DefinitionName string `json:"definitionName" yaml:"definitionName"` } // IntegrationRequest defines the backend request format and target type IntegrationRequest struct { - RequestType string `yaml:"requestType"` // dubbo, TO-DO: http - MappingParams []MappingParam `yaml:"mappingParams,omitempty"` - dubbo.DubboMetadata `yaml:"dubboMetaData,inline,omitempty"` + RequestType string `json:"requestType" yaml:"requestType"` // dubbo, TO-DO: http + MappingParams []MappingParam `json:"mappingParams,omitempty" yaml:"mappingParams,omitempty"` + dubbo.DubboMetadata `json:"dubboMetaData,inline,omitempty" yaml:"dubboMetaData,inline,omitempty"` } // MappingParam defines the mapping rules of headers and queryStrings type MappingParam struct { - Name string `yaml:"name"` - MapTo string `yaml:"mapTo"` + Name string `json:"name" yaml:"name"` + MapTo string `json:"mapTo" yaml:"mapTo"` } // Definition defines the complex json request body type Definition struct { - Name string `yaml:"name"` - Schema string `yaml:"schema"` // use json schema + Name string `json:"name" yaml:"name"` + Schema string `json:"schema" yaml:"schema"` // use json schema } // LoadAPIConfigFromFile load the api config from file @@ -119,7 +119,7 @@ func LoadAPIConfigFromFile(path string) (*APIConfig, error) { if len(path) == 0 { return nil, perrors.Errorf("Config file not specified") } - logger.Info("Load API configuration file form %s", path) + logger.Info("Load API configuration file form ", path) apiConf := &APIConfig{} err := yaml.UnmarshalYMLConfig(path, apiConf) if err != nil { diff --git a/pkg/config/mock/api_config.yml b/pkg/config/mock/api_config.yml index 2cf1faee8..ecdb51b28 100644 --- a/pkg/config/mock/api_config.yml +++ b/pkg/config/mock/api_config.yml @@ -37,6 +37,100 @@ resources: paramTypes: - java.lang.String ClusterName: test_dubbo + - path: '/mockTest' + type: restful + description: mockTest + filters: + - filter0 + methods: + - httpVerb: GET + filters: + - filterA + - filterB + onAir: true + inboundRequest: + requestType: http + headers: + - name: auth + required: true + queryStrings: + - name: id + required: false + - name: type + required: false + requestBody: + - definitionName: modelDefinition + integrationRequest: + requestType: dubbo + mappingParams: + - name: queryStrings.id + mapTo: 1 + applicationName: BDTService + group: test + version: 1.0.0 + interface: com.ikurento.user.UserProvider + Method: GetUsers + paramTypes: + - java.lang.String + ClusterName: test_dubbo + - httpVerb: POST + filters: + - filterA + onAir: true + inboundRequest: + requestType: http + headers: + - name: auth + required: true + queryStrings: + - name: id + required: false + - name: type + required: false + integrationRequest: + requestType: dubbo + mappingParams: + - name: queryStrings.id + mapTo: 1 + applicationName: BDTService + group: test + version: 1.0.0 + interface: com.ikurento.user.UserProvider + Method: NewUser + paramTypes: + - java.lang.String + ClusterName: test_dubbo + resources: + - path: '/:id' + type: restful + description: resource documentation + filters: + - filter0 + methods: + - httpVerb: GET + onAir: true + inboundRequest: + requestType: http + headers: + - name: auth + required: true + queryStrings: + - name: id + required: true + integrationRequest: + requestType: dubbo + mappingParams: + - name: queryStrings.id + mapTo: 1 + applicationName: BDTService + group: test + version: 1.0.0 + interface: com.ikurento.user.UserProvider + Method: GetUser + paramTypes: + - java.lang.String + ClusterName: test_dubbo + definitions: - name: modelDefinition schema: >- diff --git a/pkg/filter/api_filter.go b/pkg/filter/api_filter.go index 19b24a0c2..fbdbd253b 100644 --- a/pkg/filter/api_filter.go +++ b/pkg/filter/api_filter.go @@ -37,7 +37,7 @@ func ApiFilter() context.FilterFunc { return func(c context.Context) { url := c.GetUrl() method := c.GetMethod() - + // [williamfeng323]TO-DO: get the API details from router which saved in constant.LocalMemoryApiDiscoveryService if api, ok := model.EmptyApi.FindApi(url); ok { if !api.MatchMethod(method) { c.WriteWithStatus(http.StatusMethodNotAllowed, constant.Default405Body) @@ -52,7 +52,7 @@ func ApiFilter() context.FilterFunc { c.Abort() return } - + // [williamfeng323]TO-DO: the c.Api method need to be updated to use the newest API definition c.Api(api) c.Next() } else { diff --git a/pkg/router/route_test.go b/pkg/router/route_test.go index b7c22bdfa..b95dbdbaa 100644 --- a/pkg/router/route_test.go +++ b/pkg/router/route_test.go @@ -107,6 +107,10 @@ func TestFindMethod(t *testing.T) { assert.False(t, ok) assert.Nil(t, m) + m, ok = rt.FindMethod("/vought/爱国者/supe/startlight", config.MethodPost) + assert.True(t, ok) + assert.NotNil(t, m) + m, ok = rt.FindMethod("/vought/123/supe/startlight", config.MethodPost) assert.True(t, ok) assert.NotNil(t, m) diff --git a/pkg/service/api.go b/pkg/service/api.go new file mode 100644 index 000000000..380929926 --- /dev/null +++ b/pkg/service/api.go @@ -0,0 +1,28 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + */ + +package service + +import ( + "github.com/dubbogo/dubbo-go-proxy/pkg/config" +) + +// API describes the minimum configuration of an RESTful api configure in gateway +type API struct { + URLPattern string `json:"urlPattern" yaml:"urlPattern"` + config.Method `json:"method,inline" yaml:"method,inline"` +} diff --git a/pkg/service/api/discovery_service.go b/pkg/service/api/discovery_service.go index 6c0d52380..e9e88acb0 100644 --- a/pkg/service/api/discovery_service.go +++ b/pkg/service/api/discovery_service.go @@ -19,34 +19,44 @@ package api import ( "encoding/json" - "errors" ) import ( "github.com/goinggo/mapstructure" + "github.com/pkg/errors" ) import ( + "fmt" "github.com/dubbogo/dubbo-go-proxy/pkg/client/dubbo" "github.com/dubbogo/dubbo-go-proxy/pkg/common/constant" "github.com/dubbogo/dubbo-go-proxy/pkg/common/extension" + "github.com/dubbogo/dubbo-go-proxy/pkg/config" "github.com/dubbogo/dubbo-go-proxy/pkg/logger" "github.com/dubbogo/dubbo-go-proxy/pkg/model" + "github.com/dubbogo/dubbo-go-proxy/pkg/router" "github.com/dubbogo/dubbo-go-proxy/pkg/service" + "strings" ) func init() { - extension.SetApiDiscoveryService(constant.LocalMemoryApiDiscoveryService, NewLocalMemoryApiDiscoveryService()) + extension.SetApiDiscoveryService(constant.LocalMemoryApiDiscoveryService, NewLocalMemoryAPIDiscoveryService()) } -type LocalMemoryApiDiscoveryService struct { +// LocalMemoryAPIDiscoveryService is the local cached API discovery service +type LocalMemoryAPIDiscoveryService struct { + router *router.Route } -func NewLocalMemoryApiDiscoveryService() *LocalMemoryApiDiscoveryService { - return &LocalMemoryApiDiscoveryService{} +// NewLocalMemoryAPIDiscoveryService creates a new LocalMemoryApiDiscoveryService instance +func NewLocalMemoryAPIDiscoveryService() *LocalMemoryAPIDiscoveryService { + return &LocalMemoryAPIDiscoveryService{ + router: router.NewRoute(), + } } -func (ads *LocalMemoryApiDiscoveryService) AddApi(request service.DiscoveryRequest) (service.DiscoveryResponse, error) { +// AddApi adds a method to the router tree +func (ads *LocalMemoryAPIDiscoveryService) AddApi(request service.DiscoveryRequest) (service.DiscoveryResponse, error) { aj := model.NewApi() if err := json.Unmarshal(request.Body, aj); err != nil { return *service.EmptyDiscoveryResponse, err @@ -77,7 +87,7 @@ func (ads *LocalMemoryApiDiscoveryService) AddApi(request service.DiscoveryReque return *service.NewDiscoveryResponseWithSuccess(true), nil } -func (ads *LocalMemoryApiDiscoveryService) GetApi(request service.DiscoveryRequest) (service.DiscoveryResponse, error) { +func (ads *LocalMemoryAPIDiscoveryService) GetApi(request service.DiscoveryRequest) (service.DiscoveryResponse, error) { n := string(request.Body) if a, ok := model.CacheApi.Load(n); ok { @@ -86,3 +96,74 @@ func (ads *LocalMemoryApiDiscoveryService) GetApi(request service.DiscoveryReque return *service.EmptyDiscoveryResponse, errors.New("not found") } + +// AddAPI adds a method to the router tree +func (ads *LocalMemoryAPIDiscoveryService) AddAPI(api service.API) error { + return ads.router.Put(api.URLPattern, api.Method) +} + +// GetAPI returns the method to the caller +func (ads *LocalMemoryAPIDiscoveryService) GetAPI(url string, httpVerb config.HTTPVerb) (service.DiscoveryResponse, error) { + if method, ok := ads.router.FindMethod(url, httpVerb); ok { + return *service.NewDiscoveryResponse(method), nil + } + + return *service.EmptyDiscoveryResponse, errors.New("not found") +} + +// InitAPIsFromConfig inits the router from API config and to local cache +func InitAPIsFromConfig(apiConfig *config.APIConfig) error { + localAPIDiscSrv := extension.GetMustApiDiscoveryService(constant.LocalMemoryApiDiscoveryService) + if len(apiConfig.Resources) == 0 { + return nil + } + return loadAPIFromResource("", apiConfig.Resources, localAPIDiscSrv) +} + +func loadAPIFromResource(parrentPath string, resources []config.Resource, localSrv service.ApiDiscoveryService) error { + errStack := []string{} + if len(resources) == 0 { + return nil + } + groupPath := parrentPath + if parrentPath == constant.PathSlash { + groupPath = "" + } + for _, resource := range resources { + fullPath := groupPath + resource.Path + if !strings.HasPrefix(resource.Path, constant.PathSlash) { + errStack = append(errStack, fmt.Sprintf("Path %s in %s doesn't start with /", resource.Path, parrentPath)) + continue + } + if len(resource.Resources) > 0 { + if err := loadAPIFromResource(resource.Path, resource.Resources, localSrv); err != nil { + errStack = append(errStack, err.Error()) + } + } + + if err := loadAPIFromMethods(fullPath, resource.Methods, localSrv); err != nil { + errStack = append(errStack, err.Error()) + } + } + if len(errStack) > 0 { + return errors.New(strings.Join(errStack, "; ")) + } + return nil +} + +func loadAPIFromMethods(fullPath string, methods []config.Method, localSrv service.ApiDiscoveryService) error { + errStack := []string{} + for _, method := range methods { + api := service.API{ + URLPattern: fullPath, + Method: method, + } + if err := localSrv.AddAPI(api); err != nil { + errStack = append(errStack, fmt.Sprintf("Path: %s, Method: %s, error: %s", fullPath, method.HTTPVerb, err.Error())) + } + } + if len(errStack) > 0 { + return errors.New(strings.Join(errStack, "\n")) + } + return nil +} diff --git a/pkg/service/api/discovery_service_test.go b/pkg/service/api/discovery_service_test.go new file mode 100644 index 000000000..00f6c4a7c --- /dev/null +++ b/pkg/service/api/discovery_service_test.go @@ -0,0 +1,195 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + */ + +package api + +import ( + "testing" +) + +import ( + "github.com/stretchr/testify/assert" +) + +import ( + "github.com/dubbogo/dubbo-go-proxy/pkg/common/constant" + "github.com/dubbogo/dubbo-go-proxy/pkg/common/extension" + "github.com/dubbogo/dubbo-go-proxy/pkg/config" + "github.com/dubbogo/dubbo-go-proxy/pkg/service" +) + +func getMockAPI(urlPattern string, verb config.HTTPVerb) service.API { + inbound := config.InboundRequest{} + integration := config.IntegrationRequest{} + method := config.Method{ + OnAir: true, + HTTPVerb: verb, + InboundRequest: inbound, + IntegrationRequest: integration, + } + return service.API{ + URLPattern: urlPattern, + Method: method, + } +} + +func TestNewLocalMemoryAPIDiscoveryService(t *testing.T) { + l := NewLocalMemoryAPIDiscoveryService() + assert.NotNil(t, l) + assert.NotNil(t, l.router) +} + +func TestAddAPI(t *testing.T) { + l := NewLocalMemoryAPIDiscoveryService() + err := l.AddAPI(getMockAPI("/this/is/test", config.MethodPut)) + assert.Nil(t, err) + _, found := l.router.FindMethod("/this/is/test", config.MethodPut) + assert.True(t, found) +} + +func TestGetAPI(t *testing.T) { + l := NewLocalMemoryAPIDiscoveryService() + err := l.AddAPI(getMockAPI("/this/is/test", config.MethodPut)) + assert.Nil(t, err) + _, err = l.GetAPI("/this/is/test", config.MethodPut) + assert.Nil(t, err) + + _, err = l.GetAPI("/this/is/test/or/else", config.MethodPut) + assert.NotNil(t, err) +} + +func TestLoadAPI(t *testing.T) { + apiC, err := config.LoadAPIConfigFromFile("../../config/mock/api_config.yml") + assert.Empty(t, err) + err = InitAPIsFromConfig(apiC) + assert.Nil(t, err) + apiDisSrv := extension.GetMustApiDiscoveryService(constant.LocalMemoryApiDiscoveryService) + rsp, err := apiDisSrv.GetAPI("/", config.MethodGet) + assert.True(t, rsp.Success) + rsp, err = apiDisSrv.GetAPI("/mockTest", config.MethodGet) + assert.True(t, rsp.Success) + rsp, err = apiDisSrv.GetAPI("/mockTest", config.MethodPost) + assert.True(t, rsp.Success) + rsp, err = apiDisSrv.GetAPI("/mockTest/12345", config.MethodGet) + assert.True(t, rsp.Success) +} + +func TestLoadAPIFromResource(t *testing.T) { + apiDiscSrv := NewLocalMemoryAPIDiscoveryService() + mockMethod1 := getMockAPI("", config.MethodPut).Method + mockMethod2 := getMockAPI("", config.MethodPost).Method + mockMethod3 := getMockAPI("", config.MethodGet).Method + tempResources := []config.Resource{ + { + Type: "Restful", + Path: "/", + Description: "test only", + Methods: []config.Method{ + mockMethod1, + mockMethod2, + mockMethod3, + }, + Resources: []config.Resource{ + { + Type: "Restful", + Path: "/mock", + Description: "test only", + Methods: []config.Method{ + mockMethod1, + mockMethod2, + mockMethod3, + }, + }, + { + Type: "Restful", + Path: "/mock2", + Description: "test only", + Methods: []config.Method{ + mockMethod1, + }, + Resources: []config.Resource{ + { + Type: "Restful", + Path: "/:id", + Description: "test only", + Methods: []config.Method{ + mockMethod1, + }, + }, + }, + }, + }, + }, + } + err := loadAPIFromResource("", tempResources, apiDiscSrv) + assert.Nil(t, err) + rsp, _ := apiDiscSrv.GetAPI("/", config.MethodPut) + assert.True(t, rsp.Success) + rsp, _ = apiDiscSrv.GetAPI("/", config.MethodGet) + assert.True(t, rsp.Success) + rsp, _ = apiDiscSrv.GetAPI("/mock", config.MethodGet) + assert.True(t, rsp.Success) + rsp, _ = apiDiscSrv.GetAPI("/mock2/12345", config.MethodPut) + assert.True(t, rsp.Success) + + tempResources = []config.Resource{ + { + Type: "Restful", + Path: "/mock", + Description: "test only", + Methods: []config.Method{ + mockMethod1, + }, + Resources: []config.Resource{ + { + Type: "Restful", + Path: ":id", + Description: "test only", + Methods: []config.Method{ + mockMethod1, + }, + }, + { + Type: "Restful", + Path: ":ik", + Description: "test only", + Methods: []config.Method{ + mockMethod1, + }, + }, + }, + }, + } + apiDiscSrv = NewLocalMemoryAPIDiscoveryService() + err = loadAPIFromResource("", tempResources, apiDiscSrv) + assert.EqualError(t, err, "Path :id in /mock doesn't start with /; Path :ik in /mock doesn't start with /") +} + +func TestLoadAPIFromMethods(t *testing.T) { + tempMethods := []config.Method{ + getMockAPI("", config.MethodPut).Method, + getMockAPI("", config.MethodGet).Method, + getMockAPI("", config.MethodPut).Method, + } + apiDiscSrv := NewLocalMemoryAPIDiscoveryService() + err := loadAPIFromMethods("/mock", tempMethods, apiDiscSrv) + rsp, _ := apiDiscSrv.GetAPI("/mock", config.MethodPut) + assert.True(t, rsp.Success) + rsp, _ = apiDiscSrv.GetAPI("/mock", config.MethodGet) + assert.True(t, rsp.Success) + assert.EqualError(t, err, "Path: /mock, Method: PUT, error: Method PUT already exists in path /mock") +} diff --git a/pkg/service/discovery_service.go b/pkg/service/discovery_service.go index db1db0444..246b3f03c 100644 --- a/pkg/service/discovery_service.go +++ b/pkg/service/discovery_service.go @@ -17,6 +17,10 @@ package service +import ( + "github.com/dubbogo/dubbo-go-proxy/pkg/config" +) + // DiscoveryRequest a request for discovery type DiscoveryRequest struct { Body []byte @@ -56,6 +60,8 @@ var EmptyDiscoveryResponse = &DiscoveryResponse{} type ApiDiscoveryService interface { AddApi(request DiscoveryRequest) (DiscoveryResponse, error) GetApi(request DiscoveryRequest) (DiscoveryResponse, error) + AddAPI(API) error + GetAPI(string, config.HTTPVerb) (DiscoveryResponse, error) } // DiscoveryService is come from envoy, it can used for admin From 7db7cd1347068d0934d86b2fa9540937a56a3c73 Mon Sep 17 00:00:00 2001 From: xiaoliu <18721825717@163.com> Date: Fri, 9 Oct 2020 08:59:56 +0800 Subject: [PATCH 128/227] add pprof --- configs/conf.yaml | 9 +- go.sum | 716 --------------------------------------- pkg/model/base.go | 1 + pkg/model/bootstrap.go | 1 + pkg/model/pprof.go | 2 +- pkg/proxy/proxy_start.go | 13 +- 6 files changed, 23 insertions(+), 719 deletions(-) delete mode 100644 go.sum diff --git a/configs/conf.yaml b/configs/conf.yaml index 58826d80f..659c37df7 100644 --- a/configs/conf.yaml +++ b/configs/conf.yaml @@ -49,4 +49,11 @@ static_resources: connect_timeout: "5s" pprofConf: enable: true - addr: "0.0.0.0:6060" \ No newline at end of file + addr: "pprof" + +addresses: + - name: "pprof" + socket_address: + protocol_type: "HTTP" + address: "0.0.0.0" + port: 6060 \ No newline at end of file diff --git a/go.sum b/go.sum deleted file mode 100644 index ff175ea4b..000000000 --- a/go.sum +++ /dev/null @@ -1,716 +0,0 @@ -cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= -cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= -cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU= -cloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU= -cloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY= -cloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc= -cloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0= -cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o= -cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= -cloud.google.com/go/firestore v1.1.0/go.mod h1:ulACoGHTpvq5r8rxGJ4ddJZBZqakUQqClKRT5SZwBmk= -cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I= -cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw= -dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= -github.com/Azure/azure-sdk-for-go v40.3.0+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc= -github.com/Azure/go-autorest/autorest v0.9.0/go.mod h1:xyHB1BMZT0cuDHU7I0+g046+BFDTQ8rEZB0s4Yfa6bI= -github.com/Azure/go-autorest/autorest v0.9.3/go.mod h1:GsRuLYvwzLjjjRoWEIyMUaYq8GNUx2nRB378IPt/1p0= -github.com/Azure/go-autorest/autorest v0.10.0/go.mod h1:/FALq9T/kS7b5J5qsQ+RSTUdAmGFqi0vUdVNNx8q630= -github.com/Azure/go-autorest/autorest/adal v0.5.0/go.mod h1:8Z9fGy2MpX0PvDjB1pEgQTmVqjGhiHBW7RJJEciWzS0= -github.com/Azure/go-autorest/autorest/adal v0.8.0/go.mod h1:Z6vX6WXXuyieHAXwMj0S6HY6e6wcHn37qQMBQlvY3lc= -github.com/Azure/go-autorest/autorest/adal v0.8.1/go.mod h1:ZjhuQClTqx435SRJ2iMlOxPYt3d2C/T/7TiQCVZSn3Q= -github.com/Azure/go-autorest/autorest/adal v0.8.2/go.mod h1:ZjhuQClTqx435SRJ2iMlOxPYt3d2C/T/7TiQCVZSn3Q= -github.com/Azure/go-autorest/autorest/azure/auth v0.4.2/go.mod h1:90gmfKdlmKgfjUpnCEpOJzsUEjrWDSLwHIG73tSXddM= -github.com/Azure/go-autorest/autorest/azure/cli v0.3.1/go.mod h1:ZG5p860J94/0kI9mNJVoIoLgXcirM2gF5i2kWloofxw= -github.com/Azure/go-autorest/autorest/date v0.1.0/go.mod h1:plvfp3oPSKwf2DNjlBjWF/7vwR+cUD/ELuzDCXwHUVA= -github.com/Azure/go-autorest/autorest/date v0.2.0/go.mod h1:vcORJHLJEh643/Ioh9+vPmf1Ij9AEBM5FuBIXLmIy0g= -github.com/Azure/go-autorest/autorest/mocks v0.1.0/go.mod h1:OTyCOPRA2IgIlWxVYxBee2F5Gr4kF2zd2J5cFRaIDN0= -github.com/Azure/go-autorest/autorest/mocks v0.2.0/go.mod h1:OTyCOPRA2IgIlWxVYxBee2F5Gr4kF2zd2J5cFRaIDN0= -github.com/Azure/go-autorest/autorest/mocks v0.3.0/go.mod h1:a8FDP3DYzQ4RYfVAxAN3SVSiiO77gL2j2ronKKP0syM= -github.com/Azure/go-autorest/autorest/to v0.3.0/go.mod h1:MgwOyqaIuKdG4TL/2ywSsIWKAfJfgHDo8ObuUk3t5sA= -github.com/Azure/go-autorest/autorest/validation v0.2.0/go.mod h1:3EEqHnBxQGHXRYq3HT1WyXAvT7LLY3tl70hw6tQIbjI= -github.com/Azure/go-autorest/logger v0.1.0/go.mod h1:oExouG+K6PryycPJfVSxi/koC6LSNgds39diKLz7Vrc= -github.com/Azure/go-autorest/tracing v0.5.0/go.mod h1:r/s2XiOKccPW3HrqB+W0TQzfbtp2fGCgRFtBroKn4Dk= -github.com/BurntSushi/toml v0.3.1 h1:WXkYYl6Yr3qBf1K79EBnL4mak0OimBfB0XUf9Vl28OQ= -github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= -github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= -github.com/DataDog/datadog-go v2.2.0+incompatible/go.mod h1:LButxg5PwREeZtORoXG3tL4fMGNddJ+vMq1mwgfaqoQ= -github.com/DataDog/datadog-go v3.2.0+incompatible/go.mod h1:LButxg5PwREeZtORoXG3tL4fMGNddJ+vMq1mwgfaqoQ= -github.com/Microsoft/go-winio v0.4.3/go.mod h1:VhR8bwka0BXejwEJY73c50VrPtXAaKcyvVC4A4RozmA= -github.com/Microsoft/go-winio v0.4.13/go.mod h1:qXqCSQ3Xa7+6tgxaGTIe4Kpcdsi+P8jBhyzoq1bpyYA= -github.com/NYTimes/gziphandler v0.0.0-20170623195520-56545f4a5d46/go.mod h1:3wb06e3pkSAbeQ52E9H9iFoQsEEwGN64994WTCIhntQ= -github.com/NYTimes/gziphandler v1.0.1/go.mod h1:3wb06e3pkSAbeQ52E9H9iFoQsEEwGN64994WTCIhntQ= -github.com/NYTimes/gziphandler v1.1.1/go.mod h1:n/CVRwUEOgIxrgPvAQhUUr9oeUtvrhMomdKFjzJNB0c= -github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= -github.com/PuerkitoBio/purell v1.0.0/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= -github.com/PuerkitoBio/urlesc v0.0.0-20160726150825-5bd2802263f2/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE= -github.com/StackExchange/wmi v0.0.0-20180116203802-5d049714c4a6/go.mod h1:3eOhrUMpNV+6aFIbp5/iudMxNCF27Vw2OZgy4xEx0Fg= -github.com/Workiva/go-datastructures v1.0.50 h1:slDmfW6KCHcC7U+LP3DDBbm4fqTwZGn1beOFPfGaLvo= -github.com/Workiva/go-datastructures v1.0.50/go.mod h1:Z+F2Rca0qCsVYDS8z7bAGm8f3UkzuWYS/oBZz5a7VVA= -github.com/abdullin/seq v0.0.0-20160510034733-d5467c17e7af/go.mod h1:5Jv4cbFiHJMsVxt52+i0Ha45fjshj6wxYr1r19tB9bw= -github.com/afex/hystrix-go v0.0.0-20180502004556-fa1af6a1f4f5 h1:rFw4nCn9iMW+Vajsk51NtYIcwSTkXr+JGrMd36kTDJw= -github.com/afex/hystrix-go v0.0.0-20180502004556-fa1af6a1f4f5/go.mod h1:SkGFH1ia65gfNATL8TAiHDNxPzPdmEL5uirI2Uyuz6c= -github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= -github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= -github.com/aliyun/alibaba-cloud-sdk-go v1.61.18/go.mod h1:v8ESoHo4SyHmuB4b1tJqDHxfTGEciD+yhvOU/5s1Rfk= -github.com/apache/dubbo-getty v1.3.10 h1:ys5mwjPdxG/KwkPjS6EI0RzQtU6p6FCPoKpaFEzpAL0= -github.com/apache/dubbo-getty v1.3.10/go.mod h1:x6rraK01BL5C7jUM2fPl5KMkAxLVIx54ZB8/XEOik9Y= -github.com/apache/dubbo-go v1.5.1 h1:9bcGOkek0+x+zqtvykKpuOwkoJfMef0zNxsyPbWOafY= -github.com/apache/dubbo-go v1.5.1/go.mod h1:lxwgtF+27mSFQsSrBLaVbdQpwCp+pBN/mHP4w4/N2Qc= -github.com/apache/dubbo-go-hessian2 v1.6.2 h1:i7F5GjVaUatLQz1x9vUmmSIFj49L8J6rVICdF6xw4qw= -github.com/apache/dubbo-go-hessian2 v1.6.2/go.mod h1:7rEw9guWABQa6Aqb8HeZcsYPHsOS7XT1qtJvkmI6c5w= -github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o= -github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8= -github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY= -github.com/armon/go-metrics v0.0.0-20190430140413-ec5e00d3c878/go.mod h1:3AMJUQhVx52RsWOnlkpikZr01T/yAVN2gn0861vByNg= -github.com/armon/go-metrics v0.3.0/go.mod h1:zXjbSimjXTd7vOpY8B0/2LpvNvDoXBuplAD+gJD3GYs= -github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= -github.com/armon/go-radix v1.0.0/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= -github.com/aws/aws-sdk-go v1.25.41/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= -github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= -github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= -github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= -github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= -github.com/bketelsen/crypt v0.0.3-0.20200106085610-5cbc8cc4026c/go.mod h1:MKsuJmJgSg28kpZDP6UIiPt0e0Oz0kqKNGyRaWEPv84= -github.com/boltdb/bolt v1.3.1/go.mod h1:clJnj/oiGkjum5o1McbSZDSLxVThjynRyGBgiAx27Ps= -github.com/buger/jsonparser v0.0.0-20181115193947-bf1c66bbce23/go.mod h1:bbYlZJ7hK1yFx9hf58LP0zeX7UjIGs20ufpu3evjr+s= -github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= -github.com/circonus-labs/circonus-gometrics v2.3.1+incompatible/go.mod h1:nmEj6Dob7S7YxXgwXpfOuvO54S+tGdZdw9fuRZt25Ag= -github.com/circonus-labs/circonusllhist v0.1.3/go.mod h1:kMXHVDlOchFAehlya5ePtbp5jckzBHf4XRpQvBOLI+I= -github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= -github.com/cockroachdb/apd v1.1.0/go.mod h1:8Sl8LxpKi29FqWXR16WEFZRNSz3SoPzUzeMeY4+DwBQ= -github.com/coredns/coredns v1.1.2/go.mod h1:zASH/MVDgR6XZTbxvOnsZfffS+31vg6Ackf/wo1+AM0= -github.com/coreos/bbolt v1.3.2/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk= -github.com/coreos/bbolt v1.3.3/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk= -github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= -github.com/coreos/etcd v3.3.13+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= -github.com/coreos/go-etcd v2.0.0+incompatible/go.mod h1:Jez6KQU2B/sWsbdaef3ED8NzMklzPG4d5KIOhIy30Tk= -github.com/coreos/go-oidc v2.1.0+incompatible/go.mod h1:CgnwVTmzoESiwO9qyAFEMiHoZ1nMCKZlZ9V6mm3/LKc= -github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= -github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= -github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= -github.com/coreos/go-systemd v0.0.0-20190719114852-fd7a80b32e1f/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= -github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= -github.com/cpuguy83/go-md2man v1.0.10 h1:BSKMNlYxDvnunlTymqtgONjNnaRV1sTpcovwwjF22jk= -github.com/cpuguy83/go-md2man v1.0.10/go.mod h1:SmD6nW6nTyfqj6ABTjUi3V3JVMnlJmwcJI5acqYI6dE= -github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d h1:U+s90UTSYgptZMwQh2aRr3LuazLJIa+Pg3Kc1ylSYVY= -github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= -github.com/creasty/defaults v1.3.0 h1:uG+RAxYbJgOPCOdKEcec9ZJXeva7Y6mj/8egdzwmLtw= -github.com/creasty/defaults v1.3.0/go.mod h1:CIEEvs7oIVZm30R8VxtFJs+4k201gReYyuYHJxZc68I= -github.com/davecgh/go-spew v0.0.0-20151105211317-5215b55f46b2/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= -github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/denverdino/aliyungo v0.0.0-20170926055100-d3308649c661/go.mod h1:dV8lFg6daOBZbT6/BDGIz6Y3WFGn8juu6G+CQ6LHtl0= -github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= -github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no= -github.com/digitalocean/godo v1.1.1/go.mod h1:h6faOIcZ8lWIwNQ+DN7b3CgX4Kwby5T+nbpNqkUIozU= -github.com/digitalocean/godo v1.10.0/go.mod h1:h6faOIcZ8lWIwNQ+DN7b3CgX4Kwby5T+nbpNqkUIozU= -github.com/dimchansky/utfbom v1.1.0/go.mod h1:rO41eb7gLfo8SF1jd9F8HplJm1Fewwi4mQvIirEdv+8= -github.com/dnaeon/go-vcr v1.0.1/go.mod h1:aBB1+wY4s93YsC3HHjMBMrwTj2R9FHDzUr9KyGc8n1E= -github.com/docker/go-connections v0.3.0/go.mod h1:Gbd7IOopHjR8Iph03tsViu4nIes5XhDvyHbTtUxmeec= -github.com/docker/go-connections v0.4.0/go.mod h1:Gbd7IOopHjR8Iph03tsViu4nIes5XhDvyHbTtUxmeec= -github.com/docker/spdystream v0.0.0-20160310174837-449fdfce4d96/go.mod h1:Qh8CwZgvJUkLughtfhJv5dyTYa91l1fOUCrgjqmcifM= -github.com/dubbogo/go-zookeeper v1.0.1 h1:irLzvOsDOTNsN8Sv9tvYYxVu6DCQfLtziZQtUHmZgz8= -github.com/dubbogo/go-zookeeper v1.0.1/go.mod h1:fn6n2CAEer3novYgk9ULLwAjuV8/g4DdC2ENwRb6E+c= -github.com/dubbogo/gost v1.9.0/go.mod h1:pPTjVyoJan3aPxBPNUX0ADkXjPibLo+/Ib0/fADXSG8= -github.com/dubbogo/gost v1.9.1 h1:0/PPFo13zPbjt4Ia0zYWMFi3C6rAe9X7O1J2Iv+BHNM= -github.com/dubbogo/gost v1.9.1/go.mod h1:pPTjVyoJan3aPxBPNUX0ADkXjPibLo+/Ib0/fADXSG8= -github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= -github.com/elazarl/go-bindata-assetfs v0.0.0-20160803192304-e1a2a7ec64b0/go.mod h1:v+YaWX3bdea5J/mo8dSETolEo7R71Vk1u8bnjau5yw4= -github.com/elazarl/go-bindata-assetfs v1.0.0/go.mod h1:v+YaWX3bdea5J/mo8dSETolEo7R71Vk1u8bnjau5yw4= -github.com/elazarl/goproxy v0.0.0-20170405201442-c4fc26588b6e/go.mod h1:/Zj4wYkgs4iZTTu3o/KG3Itv/qCCa8VVMlb3i9OVuzc= -github.com/emicklei/go-restful v0.0.0-20170410110728-ff4f55a20633/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs= -github.com/emicklei/go-restful/v3 v3.0.0/go.mod h1:6n3XBCmQQb25CM2LCACGz8ukIrRry+4bhvbpWn3mrbc= -github.com/envoyproxy/go-control-plane v0.8.0/go.mod h1:GSSbY9P1neVhdY7G4wu+IK1rk/dqhiCC/4ExuWJZVuk= -github.com/envoyproxy/protoc-gen-validate v0.0.14/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= -github.com/evanphx/json-patch v4.2.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= -github.com/fastly/go-utils v0.0.0-20180712184237-d95a45783239/go.mod h1:Gdwt2ce0yfBxPvZrHkprdPPTTS3N5rwmLE8T22KBXlw= -github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= -github.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL+zU= -github.com/fatih/structs v1.1.0/go.mod h1:9NiDSp5zOcgEDl+j00MP/WkGVPOlPRLejGD8Ga6PJ7M= -github.com/frankban/quicktest v1.4.1/go.mod h1:36zfPVQyHxymz4cH7wlDmVwDrJuljRB60qkgn7rorfQ= -github.com/fsnotify/fsnotify v1.4.7 h1:IXs+QLmnXW2CcXuY+8Mzv/fWEsPGWxqefPtCP5CnV9I= -github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= -github.com/ghodss/yaml v0.0.0-20150909031657-73d445a93680/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= -github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= -github.com/ghodss/yaml v1.0.1-0.20190212211648-25d852aebe32 h1:Mn26/9ZMNWSw9C9ERFA1PUxfmGpolnw2v0bKOREu5ew= -github.com/ghodss/yaml v1.0.1-0.20190212211648-25d852aebe32/go.mod h1:GIjDIg/heH5DOkXY3YJ/wNhfHsQHoXGjl8G8amsYQ1I= -github.com/go-asn1-ber/asn1-ber v1.3.1/go.mod h1:hEBeB/ic+5LoWskz+yKT7vGhhPYkProFKoKdwZRWMe0= -github.com/go-co-op/gocron v0.1.1/go.mod h1:Y9PWlYqDChf2Nbgg7kfS+ZsXHDTZbMZYPEQ0MILqH+M= -github.com/go-errors/errors v1.0.1/go.mod h1:f4zRHt4oKfwPJE5k8C9vpYG+aDHdBFUsgrm6/TyX73Q= -github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= -github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= -github.com/go-ldap/ldap v3.0.2+incompatible/go.mod h1:qfd9rJvER9Q0/D/Sqn1DfHRoBp40uXYvFoEVrNEPqRc= -github.com/go-ldap/ldap/v3 v3.1.3/go.mod h1:3rbOH3jRS2u6jg2rJnKAMLE/xQyCKIveG2Sa/Cohzb8= -github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= -github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= -github.com/go-logr/logr v0.1.0/go.mod h1:ixOQHD9gLJUVQQ2ZOR7zLEifBX6tGkNJF4QyIY7sIas= -github.com/go-ole/go-ole v1.2.1/go.mod h1:7FAglXiTm7HKlQRDeOQ6ZNUHidzCWXuZWq/1dTyBNF8= -github.com/go-openapi/jsonpointer v0.0.0-20160704185906-46af16f9f7b1/go.mod h1:+35s3my2LFTysnkMfxsJBAMHj/DoqoB9knIWoYG/Vk0= -github.com/go-openapi/jsonreference v0.0.0-20160704190145-13c6e3589ad9/go.mod h1:W3Z9FmVs9qj+KR4zFKmDPGiLdk1D9Rlm7cyMvf57TTg= -github.com/go-openapi/spec v0.0.0-20160808142527-6aced65f8501/go.mod h1:J8+jY1nAiCcj+friV/PDoE1/3eeccG9LYBs0tYvLOWc= -github.com/go-openapi/swag v0.0.0-20160704191624-1d0bd113de87/go.mod h1:DXUve3Dpr1UfpPtxFw+EFuQ41HhCWZfha5jSVRG7C7I= -github.com/go-redis/redis v6.15.5+incompatible/go.mod h1:NAIEuMOZ/fxfXJIrKDQDz8wamY7mA7PouImQ2Jvg6kA= -github.com/go-resty/resty/v2 v2.1.0/go.mod h1:dZGr0i9PLlaaTD4H/hoZIDjQ+r6xq8mgbRzHZf7f2J8= -github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= -github.com/go-test/deep v1.0.2-0.20181118220953-042da051cf31/go.mod h1:wGDj63lr65AM2AQyKZd/NYHGb0R+1RLqB8NKt3aSFNA= -github.com/go-test/deep v1.0.2/go.mod h1:wGDj63lr65AM2AQyKZd/NYHGb0R+1RLqB8NKt3aSFNA= -github.com/gogo/googleapis v1.1.0/go.mod h1:gf4bu3Q80BeJ6H1S1vYPm8/ELATdvryBaNFGgqEef3s= -github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= -github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4= -github.com/gogo/protobuf v1.2.2-0.20190723190241-65acae22fc9d/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= -github.com/goinggo/mapstructure v0.0.0-20140717182941-194205d9b4a9 h1:wqckanyE9qc/XnvnybC6SHOb8Nyd62QXAZOzA8twFig= -github.com/goinggo/mapstructure v0.0.0-20140717182941-194205d9b4a9/go.mod h1:64ikIrMv84B+raz7akXOqbF7cK3/OQQ/6cClY10oy7A= -github.com/goji/httpauth v0.0.0-20160601135302-2da839ab0f4d/go.mod h1:nnjvkQ9ptGaCkuDUx6wNykzzlUixGxvkme+H/lnzb+A= -github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= -github.com/golang/groupcache v0.0.0-20160516000752-02826c3e7903/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20190129154638-5b532d6fd5ef/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= -github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= -github.com/golang/mock v1.3.1 h1:qGJ6qTW+x6xX/my+8YUVl4WNpX9B7+/l2tRsHGZ7f2s= -github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y= -github.com/golang/protobuf v0.0.0-20161109072736-4bd1920723d7/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/snappy v0.0.1 h1:Qgr9rKW7uDUkrbSmQeiDsGa8SjGyCOGtuasMWwvp2P4= -github.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= -github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= -github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= -github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= -github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= -github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= -github.com/google/go-querystring v0.0.0-20170111101155-53e6ce116135/go.mod h1:odCYkC5MyYFN7vkCjXpyrEuKhc/BUO6wN/zVPAxq5ck= -github.com/google/go-querystring v1.0.0/go.mod h1:odCYkC5MyYFN7vkCjXpyrEuKhc/BUO6wN/zVPAxq5ck= -github.com/google/gofuzz v0.0.0-20161122191042-44d81051d367/go.mod h1:HP5RmnzzSNb993RKQDq4+1A4ia9nllfqcQFTQJedwGI= -github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= -github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= -github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= -github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= -github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= -github.com/google/tcpproxy v0.0.0-20180808230851-dfa16c61dad2/go.mod h1:DavVbd41y+b7ukKDmlnPR4nGYmkWXR6vHUkjQNiHPBs= -github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= -github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= -github.com/googleapis/gnostic v0.0.0-20170729233727-0c5108395e2d/go.mod h1:sJBsCZ4ayReDTBIg8b9dl28c5xFWyhBTVRp3pOg5EKY= -github.com/googleapis/gnostic v0.2.0/go.mod h1:sJBsCZ4ayReDTBIg8b9dl28c5xFWyhBTVRp3pOg5EKY= -github.com/gophercloud/gophercloud v0.1.0/go.mod h1:vxM41WHh5uqHVBMZHzuwNOHh8XEoIEcSTewFxm1c5g8= -github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1 h1:EGx4pi6eqNxGaHF6qqu48+N2wcFQ5qg5FXgOdqsJ5d8= -github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= -github.com/gorilla/websocket v1.4.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= -github.com/gorilla/websocket v1.4.2 h1:+/TMaTYc4QFitKJxsQ7Yye35DkWvkdLcvGKqM+x0Ufc= -github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= -github.com/gregjones/httpcache v0.0.0-20180305231024-9cad4c3443a7/go.mod h1:FecbI9+v66THATjSRHfNgh1IVFe/9kFxbXtjV0ctIMA= -github.com/grpc-ecosystem/go-grpc-middleware v1.0.0/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= -github.com/grpc-ecosystem/go-grpc-middleware v1.0.1-0.20190118093823-f849b5445de4/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= -github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk= -github.com/grpc-ecosystem/grpc-gateway v1.9.0/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= -github.com/grpc-ecosystem/grpc-gateway v1.9.5/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= -github.com/grpc-ecosystem/grpc-opentracing v0.0.0-20180507213350-8e809c8a8645/go.mod h1:6iZfnjpejD4L/4DwD7NryNaJyCQdzwWwH2MWhCA90Kw= -github.com/hashicorp/consul v1.8.0/go.mod h1:Gg9/UgAQ9rdY3CTvzQZ6g2jcIb7NlIfjI+0pvLk5D1A= -github.com/hashicorp/consul/api v1.1.0/go.mod h1:VmuI/Lkw1nC05EYQWNKwWGbkg+FbDBtguAZLlVdkD9Q= -github.com/hashicorp/consul/api v1.5.0/go.mod h1:LqwrLNW876eYSuUOo4ZLHBcdKc038txr/IMfbLPATa4= -github.com/hashicorp/consul/sdk v0.1.1/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyNV1vwHyQBF0x8= -github.com/hashicorp/consul/sdk v0.5.0/go.mod h1:fY08Y9z5SvJqevyZNy6WWPXiG3KwBPAvlcdx16zZ0fM= -github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= -github.com/hashicorp/go-bexpr v0.1.2/go.mod h1:ANbpTX1oAql27TZkKVeW8p1w8NTdnyzPe/0qqPCKohU= -github.com/hashicorp/go-checkpoint v0.0.0-20171009173528-1545e56e46de/go.mod h1:xIwEieBHERyEvaeKF/TcHh1Hu+lxPM+n2vT1+g9I4m4= -github.com/hashicorp/go-cleanhttp v0.5.0/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= -github.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= -github.com/hashicorp/go-connlimit v0.2.0/go.mod h1:OUj9FGL1tPIhl/2RCfzYHrIiWj+VVPGNyVPnUX8AqS0= -github.com/hashicorp/go-discover v0.0.0-20200501174627-ad1e96bde088/go.mod h1:vZu6Opqf49xX5lsFAu7iFNewkcVF1sn/wyapZh5ytlg= -github.com/hashicorp/go-hclog v0.0.0-20180709165350-ff2cf002a8dd/go.mod h1:9bjs9uLqI8l75knNv3lV1kA55veR+WUPSiKIWcQHudI= -github.com/hashicorp/go-hclog v0.8.0/go.mod h1:5CU+agLiy3J7N7QjHK5d05KxGsuXiQLrjA0H7acj2lQ= -github.com/hashicorp/go-hclog v0.9.1/go.mod h1:5CU+agLiy3J7N7QjHK5d05KxGsuXiQLrjA0H7acj2lQ= -github.com/hashicorp/go-hclog v0.9.2/go.mod h1:5CU+agLiy3J7N7QjHK5d05KxGsuXiQLrjA0H7acj2lQ= -github.com/hashicorp/go-hclog v0.12.0/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ= -github.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= -github.com/hashicorp/go-immutable-radix v1.1.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= -github.com/hashicorp/go-memdb v1.0.3/go.mod h1:LWQ8R70vPrS4OEY9k28D2z8/Zzyu34NVzeRibGAzHO0= -github.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM= -github.com/hashicorp/go-msgpack v0.5.5/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM= -github.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk= -github.com/hashicorp/go-multierror v1.1.0/go.mod h1:spPvp8C1qA32ftKqdAHm4hHTbPw+vmowP0z+KUhOZdA= -github.com/hashicorp/go-plugin v1.0.1/go.mod h1:++UyYGoz3o5w9ZzAdZxtQKrWWP+iqPBn3cQptSMzBuY= -github.com/hashicorp/go-raftchunking v0.6.1/go.mod h1:cGlg3JtDy7qy6c/3Bu660Mic1JF+7lWqIwCFSb08fX0= -github.com/hashicorp/go-raftchunking v0.6.3-0.20191002164813-7e9e8525653a/go.mod h1:xbXnmKqX9/+RhPkJ4zrEx4738HacP72aaUPlT2RZ4sU= -github.com/hashicorp/go-retryablehttp v0.5.3/go.mod h1:9B5zBasrRhHXnJnui7y6sL7es7NDiJgTc6Er0maI1Xs= -github.com/hashicorp/go-retryablehttp v0.5.4/go.mod h1:9B5zBasrRhHXnJnui7y6sL7es7NDiJgTc6Er0maI1Xs= -github.com/hashicorp/go-retryablehttp v0.6.2/go.mod h1:gEx6HMUGxYYhJScX7W1Il64m6cc2C1mDaW3NQ9sY1FY= -github.com/hashicorp/go-rootcerts v1.0.0/go.mod h1:K6zTfqpRlCUIjkwsN4Z+hiSfzSTQa6eBIzfwKfwNnHU= -github.com/hashicorp/go-rootcerts v1.0.1/go.mod h1:pqUvnprVnM5bf7AOirdbb01K4ccR319Vf4pU3K5EGc8= -github.com/hashicorp/go-rootcerts v1.0.2/go.mod h1:pqUvnprVnM5bf7AOirdbb01K4ccR319Vf4pU3K5EGc8= -github.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU= -github.com/hashicorp/go-sockaddr v1.0.2/go.mod h1:rB4wwRAUzs07qva3c5SdrY/NEtAUjGlgmH/UkBUC97A= -github.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4= -github.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= -github.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= -github.com/hashicorp/go-uuid v1.0.2-0.20191001231223-f32f5fe8d6a8/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= -github.com/hashicorp/go-uuid v1.0.2/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= -github.com/hashicorp/go-version v1.1.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= -github.com/hashicorp/go-version v1.2.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= -github.com/hashicorp/go.net v0.0.1/go.mod h1:hjKkEWcCURg++eb33jQU7oqQcI9XDCnUzHA0oac0k90= -github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= -github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= -github.com/hashicorp/golang-lru v0.5.3/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= -github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4= -github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= -github.com/hashicorp/hil v0.0.0-20160711231837-1e86c6b523c5/go.mod h1:KHvg/R2/dPtaePb16oW4qIyzkMxXOL38xjRN64adsts= -github.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64= -github.com/hashicorp/mdns v1.0.0/go.mod h1:tL+uN++7HEJ6SQLQ2/p+z2pH24WQKWjBPkE0mNTz8vQ= -github.com/hashicorp/mdns v1.0.1/go.mod h1:4gW7WsVCke5TE7EPeYliwHlRUyBtfCwuFwuMg2DmyNY= -github.com/hashicorp/memberlist v0.1.3/go.mod h1:ajVTdAv/9Im8oMAAj5G31PhhMCZJV2pPBoIllUwCN7I= -github.com/hashicorp/memberlist v0.2.0/go.mod h1:MS2lj3INKhZjWNqd3N0m3J+Jxf3DAOnAH9VT3Sh9MUE= -github.com/hashicorp/memberlist v0.2.2/go.mod h1:MS2lj3INKhZjWNqd3N0m3J+Jxf3DAOnAH9VT3Sh9MUE= -github.com/hashicorp/net-rpc-msgpackrpc v0.0.0-20151116020338-a14192a58a69/go.mod h1:/z+jUGRBlwVpUZfjute9jWaF6/HuhjuFQuL1YXzVD1Q= -github.com/hashicorp/raft v1.1.1/go.mod h1:vPAJM8Asw6u8LxC3eJCUZmRP/E4QmUGE1R7g7k8sG/8= -github.com/hashicorp/raft v1.1.2-0.20191002163536-9c6bd3e3eb17/go.mod h1:vPAJM8Asw6u8LxC3eJCUZmRP/E4QmUGE1R7g7k8sG/8= -github.com/hashicorp/raft v1.1.2/go.mod h1:vPAJM8Asw6u8LxC3eJCUZmRP/E4QmUGE1R7g7k8sG/8= -github.com/hashicorp/raft-boltdb v0.0.0-20171010151810-6e5ba93211ea/go.mod h1:pNv7Wc3ycL6F5oOWn+tPGo2gWD4a5X+yp/ntwdKLjRk= -github.com/hashicorp/serf v0.8.2/go.mod h1:6hOLApaqBFA1NXqRQAsxw9QxuDEvNxSQRwA/JwenrHc= -github.com/hashicorp/serf v0.9.0/go.mod h1:YL0HO+FifKOW2u1ke99DGVu1zhcpZzNwrLIqBC7vbYU= -github.com/hashicorp/serf v0.9.2/go.mod h1:UWDWwZeL5cuWDJdl0C6wrvrUwEqtQ4ZKBKKENpqIUyk= -github.com/hashicorp/vault/api v1.0.4/go.mod h1:gDcqh3WGcR1cpF5AJz/B1UFheUEneMoIospckxBxk6Q= -github.com/hashicorp/vault/api v1.0.5-0.20191108163347-bdd38fca2cff/go.mod h1:Uf8LaHyrYsgVgHzO2tMZKhqRGlL3UJ6XaSwW2EA1Iqo= -github.com/hashicorp/vault/sdk v0.1.13/go.mod h1:B+hVj7TpuQY1Y/GPbCpffmgd+tSEwvhkWnjtSYCaS2M= -github.com/hashicorp/vault/sdk v0.1.14-0.20191108161836-82f2b5571044/go.mod h1:PcekaFGiPJyHnFy+NZhP6ll650zEw51Ag7g/YEa+EOU= -github.com/hashicorp/vault/sdk v0.1.14-0.20191112033314-390e96e22eb2/go.mod h1:PcekaFGiPJyHnFy+NZhP6ll650zEw51Ag7g/YEa+EOU= -github.com/hashicorp/vic v1.5.1-0.20190403131502-bbfe86ec9443/go.mod h1:bEpDU35nTu0ey1EXjwNwPjI9xErAsoOCmcMb9GKvyxo= -github.com/hashicorp/yamux v0.0.0-20180604194846-3520598351bb/go.mod h1:+NfK9FKeTrX5uv1uIXGdwYDTeHna2qgaIlx54MXqjAM= -github.com/hashicorp/yamux v0.0.0-20181012175058-2f1d1f20f75d/go.mod h1:+NfK9FKeTrX5uv1uIXGdwYDTeHna2qgaIlx54MXqjAM= -github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= -github.com/imdario/mergo v0.3.5/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= -github.com/imdario/mergo v0.3.6/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= -github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= -github.com/jackc/fake v0.0.0-20150926172116-812a484cc733/go.mod h1:WrMFNQdiFJ80sQsxDoMokWK1W5TQtxBFNpzWTD84ibQ= -github.com/jackc/pgx v3.3.0+incompatible/go.mod h1:0ZGrqGqkRlliWnWB4zKnWtjbSWbGkVEFm4TeybAXq+I= -github.com/jarcoal/httpmock v0.0.0-20180424175123-9c70cfe4a1da/go.mod h1:ks+b9deReOc7jgqp+e7LuFiCBH6Rm5hL32cLcEAArb4= -github.com/jehiah/go-strftime v0.0.0-20171201141054-1d33003b3869/go.mod h1:cJ6Cj7dQo+O6GJNiMx+Pa94qKj+TG8ONdKHgMNIyyag= -github.com/jinzhu/copier v0.0.0-20190625015134-976e0346caa8 h1:mGIXW/lubQ4B+3bXTLxcTMTjUNDqoF6T/HUW9LbFx9s= -github.com/jinzhu/copier v0.0.0-20190625015134-976e0346caa8/go.mod h1:yL958EeXv8Ylng6IfnvG4oflryUi3vgA3xPs9hmII1s= -github.com/jmespath/go-jmespath v0.0.0-20180206201540-c2b33e8439af/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k= -github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo= -github.com/joyent/triton-go v0.0.0-20180628001255-830d2b111e62/go.mod h1:U+RSyWxWd04xTqnuOQxnai7XGS2PrPY2cfGoDKtMHjA= -github.com/joyent/triton-go v1.7.1-0.20200416154420-6801d15b779f/go.mod h1:KDSfL7qe5ZfQqvlDMkVjCztbmcpp/c8M77vhQP8ZPvk= -github.com/json-iterator/go v0.0.0-20180612202835-f2b4162afba3/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= -github.com/json-iterator/go v1.1.5/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= -github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= -github.com/json-iterator/go v1.1.7/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= -github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= -github.com/jtolds/gls v4.20.0+incompatible h1:xdiiI2gbIgH/gLH7ADydsJ1uDOEzR8yvV7C0MuV77Wo= -github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= -github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= -github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q= -github.com/kisielk/errcheck v1.2.0/go.mod h1:/BMXB+zMLi60iA8Vv6Ksmxu/1UDYcXs4uQLJ+jE2L00= -github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= -github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= -github.com/konsorten/go-windows-terminal-sequences v1.0.2/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= -github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= -github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= -github.com/kr/pretty v0.2.0 h1:s5hAObm+yFO5uHYt5dYjxi2rXrsnmRpJx4OYvIWUaQs= -github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= -github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= -github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE= -github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= -github.com/lestrrat/go-envload v0.0.0-20180220120943-6ed08b54a570/go.mod h1:BLt8L9ld7wVsvEWQbuLrUZnCMnUmLZ+CGDzKtclrTlE= -github.com/lestrrat/go-file-rotatelogs v0.0.0-20180223000712-d3151e2a480f/go.mod h1:UGmTpUd3rjbtfIpwAPrcfmGf/Z1HS95TATB+m57TPB8= -github.com/lestrrat/go-strftime v0.0.0-20180220042222-ba3bf9c1d042/go.mod h1:TPpsiPUEh0zFL1Snz4crhMlBe60PYxRHr5oFF3rRYg0= -github.com/lib/pq v1.1.1/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= -github.com/linode/linodego v0.7.1/go.mod h1:ga11n3ivecUrPCHN0rANxKmfWBJVkOXfLMZinAbj2sY= -github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= -github.com/magiconair/properties v1.8.1 h1:ZC2Vc7/ZFkGmsVC9KvOjumD+G5lXy2RtTKyzRKO2BQ4= -github.com/magiconair/properties v1.8.1/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= -github.com/mailru/easyjson v0.0.0-20160728113105-d5b7844b561a/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= -github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= -github.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= -github.com/mattn/go-colorable v0.1.6/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= -github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= -github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= -github.com/mattn/go-isatty v0.0.10/go.mod h1:qgIWMr58cqv1PHHyhnkY9lrL7etaEgOFcMEpPG5Rm84= -github.com/mattn/go-isatty v0.0.11/go.mod h1:PhnuNfih5lzO57/f3n+odYbM4JtupLOxQOAqxQCu2WE= -github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= -github.com/mattn/go-runewidth v0.0.3/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= -github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= -github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= -github.com/miekg/dns v1.1.26/go.mod h1:bPDLeHnStXmXAq1m/Ch/hvfNHr14JKNPMBo3VZKjuso= -github.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc= -github.com/mitchellh/cli v1.1.0/go.mod h1:xcISNoH86gajksDmfB23e/pu+B+GeFRMYmoHXxx3xhI= -github.com/mitchellh/copystructure v1.0.0/go.mod h1:SNtv71yrdKgLRyLFxmLdkAbkKEFWgYaq1OVrnRcwhnw= -github.com/mitchellh/go-homedir v1.0.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= -github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= -github.com/mitchellh/go-testing-interface v0.0.0-20171004221916-a61a99592b77/go.mod h1:kRemZodwjscx+RGhAo8eIhFbs2+BFgRtFPeD/KE+zxI= -github.com/mitchellh/go-testing-interface v1.0.0/go.mod h1:kRemZodwjscx+RGhAo8eIhFbs2+BFgRtFPeD/KE+zxI= -github.com/mitchellh/go-testing-interface v1.14.0/go.mod h1:gfgS7OtZj6MA4U1UrDRp04twqAjfvlZyCfX3sDjEym8= -github.com/mitchellh/go-wordwrap v1.0.0/go.mod h1:ZXFpozHsX6DPmq2I0TCekCxypsnAUbP2oI0UX1GXzOo= -github.com/mitchellh/gox v0.4.0/go.mod h1:Sd9lOJ0+aimLBi73mGofS1ycjY8lL3uZM3JPS42BGNg= -github.com/mitchellh/hashstructure v0.0.0-20170609045927-2bca23e0e452/go.mod h1:QjSHrPWS+BGUVBYkbTZWEnOh3G1DutKwClXU/ABz6AQ= -github.com/mitchellh/hashstructure v1.0.0/go.mod h1:QjSHrPWS+BGUVBYkbTZWEnOh3G1DutKwClXU/ABz6AQ= -github.com/mitchellh/iochan v1.0.0/go.mod h1:JwYml1nuB7xOzsp52dPpHFffvOCDupsG0QubkSMEySY= -github.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= -github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= -github.com/mitchellh/mapstructure v1.2.3 h1:f/MjBEBDLttYCGfRaKBbKSRVF5aV2O6fnBpzknuE3jU= -github.com/mitchellh/mapstructure v1.2.3/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= -github.com/mitchellh/pointerstructure v1.0.0/go.mod h1:k4XwG94++jLVsSiTxo7qdIfXA9pj9EAeo0QsNNJOLZ8= -github.com/mitchellh/reflectwalk v1.0.0/go.mod h1:mSTlrgnPZtwu0c4WaC2kGObEpuNDbx0jmZXqmk4esnw= -github.com/mitchellh/reflectwalk v1.0.1/go.mod h1:mSTlrgnPZtwu0c4WaC2kGObEpuNDbx0jmZXqmk4esnw= -github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= -github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= -github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= -github.com/modern-go/reflect2 v0.0.0-20180320133207-05fbef0ca5da/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= -github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= -github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= -github.com/munnerz/goautoneg v0.0.0-20120707110453-a547fc61f48d/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= -github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= -github.com/mxk/go-flowrate v0.0.0-20140419014527-cca7078d478f/go.mod h1:ZdcZmHo+o7JKHSa8/e818NopupXU1YMK5fe1lsApnBw= -github.com/nacos-group/nacos-sdk-go v1.0.0/go.mod h1:hlAPn3UdzlxIlSILAyOXKxjFSvDJ9oLzTJ9hLAK1KzA= -github.com/nicolai86/scaleway-sdk v1.10.2-0.20180628010248-798f60e20bb2/go.mod h1:TLb2Sg7HQcgGdloNxkrmtgDNR9uVYF3lfdFIN4Ro6Sk= -github.com/oklog/run v1.0.0/go.mod h1:dlhp/R75TPv97u0XWUtDeV/lRKWPKSdTuV0TZvrmrQA= -github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U= -github.com/olekukonko/tablewriter v0.0.0-20180130162743-b8a9be070da4/go.mod h1:vsDQFd/mU46D+Z4whnwzcISnGGzXWMclvtLoiIKAKIo= -github.com/onsi/ginkgo v0.0.0-20170829012221-11459a886d9c/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.8.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.10.1/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/gomega v0.0.0-20170829124025-dcabb60a477c/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= -github.com/onsi/gomega v1.5.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= -github.com/onsi/gomega v1.7.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= -github.com/opentracing/opentracing-go v1.1.0 h1:pWlfV3Bxv7k65HYwkikxat0+s3pV4bsqf19k25Ur8rU= -github.com/opentracing/opentracing-go v1.1.0/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= -github.com/packethost/packngo v0.1.1-0.20180711074735-b9cb5096f54c/go.mod h1:otzZQXgoO96RTzDB/Hycg0qZcXZsWJGJRSXbmEIJ+4M= -github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= -github.com/pascaldekloe/goe v0.1.0/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= -github.com/patrickmn/go-cache v2.1.0+incompatible/go.mod h1:3Qf8kWWT7OJRJbdiICTKqZju1ZixQ/KpMGzzAfe6+WQ= -github.com/pelletier/go-toml v1.2.0 h1:T5zMGML61Wp+FlcbWjRDT7yAxhJNAiPPLOFECq181zc= -github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= -github.com/peterbourgon/diskv v2.0.1+incompatible/go.mod h1:uqqh8zWWbv1HBMNONnaR/tNboyR3/BZd58JJSHlUSCU= -github.com/pierrec/lz4 v2.0.5+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY= -github.com/pierrec/lz4 v2.2.6+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY= -github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= -github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pmezard/go-difflib v0.0.0-20151028094244-d8ed2627bdf0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= -github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI= -github.com/posener/complete v1.2.3/go.mod h1:WZIdtGGp+qx0sLrYKtIRAruyNpv6hFCicSgv7Sy7s/s= -github.com/pquerna/cachecontrol v0.0.0-20180517163645-1555304b9b35/go.mod h1:prYjPmNq4d1NPVmpShWobRqXY3q7Vp+80DqgxxUrUIA= -github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= -github.com/prometheus/client_golang v0.9.2/go.mod h1:OsXs2jCmiKlQ1lTBmv21f2mNfw4xf/QclQDMrYNZzcM= -github.com/prometheus/client_golang v0.9.3/go.mod h1:/TN21ttK/J9q6uSwhBd54HahCDft0ttaMvbicHlPoso= -github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo= -github.com/prometheus/client_golang v1.1.0/go.mod h1:I1FGZT9+L76gKKOs5djB6ezCbFQP1xR9D75/vuwEF3g= -github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= -github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/prometheus/common v0.0.0-20181113130724-41aa239b4cce/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= -github.com/prometheus/common v0.0.0-20181126121408-4724e9255275/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= -github.com/prometheus/common v0.4.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= -github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= -github.com/prometheus/common v0.6.0/go.mod h1:eBmuwkDJBwy6iBfxCBob6t6dR6ENT/y+J+Zk0j9GMYc= -github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= -github.com/prometheus/procfs v0.0.0-20181204211112-1dc9a6cbc91a/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= -github.com/prometheus/procfs v0.0.0-20190507164030-5867b95ac084/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= -github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= -github.com/prometheus/procfs v0.0.3/go.mod h1:4A/X28fw3Fc593LaREMrKMqOKvUAntwMDaekg4FpcdQ= -github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU= -github.com/rboyer/safeio v0.2.1/go.mod h1:Cq/cEPK+YXFn622lsQ0K4KsPZSPtaptHHEldsy7Fmig= -github.com/renier/xmlrpc v0.0.0-20170708154548-ce4a1a486c03/go.mod h1:gRAiPF5C5Nd0eyyRdqIu9qTiFSoZzpTq727b5B8fkkU= -github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg= -github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= -github.com/rs/zerolog v1.4.0/go.mod h1:YbFCdg8HfsridGWAh22vktObvhZbQsZXe4/zB0OKkWU= -github.com/russross/blackfriday v1.5.2 h1:HyvC0ARfnZBqnXwABFeSZHpKvJHJJfPz81GNueLj0oo= -github.com/russross/blackfriday v1.5.2/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g= -github.com/russross/blackfriday/v2 v2.0.1 h1:lPqVAte+HuHNfhJ/0LC98ESWRz8afy9tM/0RK8m9o+Q= -github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= -github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= -github.com/ryanuber/columnize v2.1.0+incompatible/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= -github.com/ryanuber/go-glob v1.0.0/go.mod h1:807d1WSdnB0XRJzKNil9Om6lcp/3a0v4qIHxIXzX/Yc= -github.com/satori/go.uuid v1.2.0/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0= -github.com/satori/go.uuid v1.2.1-0.20181028125025-b2ce2384e17b h1:gQZ0qzfKHQIybLANtM3mBXNUtOfsCFXeTsnBqCsx1KM= -github.com/satori/go.uuid v1.2.1-0.20181028125025-b2ce2384e17b/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0= -github.com/sean-/conswriter v0.0.0-20180208195008-f5ae3917a627/go.mod h1:7zjs06qF79/FKAJpBvFx3P8Ww4UTIMAe+lpNXDHziac= -github.com/sean-/pager v0.0.0-20180208200047-666be9bf53b5/go.mod h1:BeybITEsBEg6qbIiqJ6/Bqeq25bCLbL7YFmpaFfJDuM= -github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc= -github.com/shirou/gopsutil v0.0.0-20181107111621-48177ef5f880/go.mod h1:5b4v6he4MtMOwMlS0TUMTu2PcXUg8+E1lC7eC3UO/RA= -github.com/shirou/gopsutil v2.19.9+incompatible/go.mod h1:5b4v6he4MtMOwMlS0TUMTu2PcXUg8+E1lC7eC3UO/RA= -github.com/shirou/w32 v0.0.0-20160930032740-bb4de0191aa4/go.mod h1:qsXQc7+bwAM3Q1u/4XEfrquwF8Lw7D7y5cD8CuHnfIc= -github.com/shopspring/decimal v0.0.0-20180709203117-cd690d0c9e24/go.mod h1:M+9NzErvs504Cn4c5DxATwIqPbtswREoFCre64PpcG4= -github.com/shurcooL/sanitized_anchor_name v1.0.0 h1:PdmoCO6wvbs+7yrJyMORt4/BmY5IYyJwS/kOiWx8mHo= -github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= -github.com/sirupsen/logrus v1.0.6/go.mod h1:pMByvHTf9Beacp5x1UXfOR9xyW/9antXMhjMPG0dEzc= -github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= -github.com/sirupsen/logrus v1.4.1/go.mod h1:ni0Sbl8bgC9z8RoU9G6nDWqqs/fq4eDPysMBDgk/93Q= -github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= -github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d h1:zE9ykElWQ6/NYmHa3jpm/yHnI4xSofP+UP6SpjHcSeM= -github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= -github.com/smartystreets/goconvey v0.0.0-20190330032615-68dc04aab96a/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= -github.com/smartystreets/goconvey v1.6.4 h1:fv0U8FUIMPNf1L9lnHLvLhgicrIVChEkdzIKYqbNC9s= -github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= -github.com/softlayer/softlayer-go v0.0.0-20180806151055-260589d94c7d/go.mod h1:Cw4GTlQccdRGSEf6KiMju767x0NEHE0YIVPJSaXjlsw= -github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM= -github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= -github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ= -github.com/spf13/afero v1.2.1/go.mod h1:9ZxEEn6pIJ8Rxe320qSDBk6AsU0r9pR7Q4OcevTdifk= -github.com/spf13/afero v1.2.2 h1:5jhuqJyZCZf2JRofRvN/nIFgIWNzPa3/Vz8mYylgbWc= -github.com/spf13/afero v1.2.2/go.mod h1:9ZxEEn6pIJ8Rxe320qSDBk6AsU0r9pR7Q4OcevTdifk= -github.com/spf13/cast v1.3.0 h1:oget//CVOEoFewqQxwr0Ej5yjygnqGkvggSE/gB35Q8= -github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= -github.com/spf13/cobra v0.0.5/go.mod h1:3K3wKZymM7VvHMDS9+Akkh4K60UwM26emMESw8tLCHU= -github.com/spf13/jwalterweatherman v1.0.0 h1:XHEdyB+EcvlqZamSM4ZOMGlc93t6AcsBEu9Gc1vn7yk= -github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo= -github.com/spf13/pflag v0.0.0-20170130214245-9ff6c6923cff/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= -github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= -github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= -github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= -github.com/spf13/viper v1.3.2/go.mod h1:ZiWeW+zYFKm7srdB9IoDzzZXaJaI5eL9QjNiN/DMA2s= -github.com/spf13/viper v1.4.0/go.mod h1:PTJ7Z/lr49W6bUbkmS1V3by4uWynFiR9p7+dSq/yZzE= -github.com/spf13/viper v1.7.0 h1:xVKxvI7ouOI5I+U9s2eeiUfMaWBVoXA3AWskkrqK0VM= -github.com/spf13/viper v1.7.0/go.mod h1:8WkrPz2fc9jxqZNCJI/76HCieCp4Q8HaLFoCha5qpdg= -github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/objx v0.2.0 h1:Hbg2NidpLE8veEBkEZTL3CvlkUIVzuU9jDplZO54c48= -github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE= -github.com/stretchr/testify v0.0.0-20151208002404-e3a8ff8ce365/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= -github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= -github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= -github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= -github.com/stretchr/testify v1.5.1 h1:nOGnQDM7FYENwehXlg/kFVnos3rEvtKTjRvOWSzb6H4= -github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= -github.com/subosito/gotenv v1.2.0 h1:Slr1R9HxAlEKefgq5jn9U+DnETlIUa6HfgEzj0g5d7s= -github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw= -github.com/tebeka/strftime v0.1.3/go.mod h1:7wJm3dZlpr4l/oVK0t1HYIc4rMzQ2XJlOMIUJUJH6XQ= -github.com/tencentcloud/tencentcloud-sdk-go v3.0.83+incompatible/go.mod h1:0PfYow01SHPMhKY31xa+EFz2RStxIqj6JFAJS+IkCi4= -github.com/tent/http-link-go v0.0.0-20130702225549-ac974c61c2f9/go.mod h1:RHkNRtSLfOK7qBTHaeSX1D6BNpI3qw7NTxsmNr4RvN8= -github.com/tevid/gohamcrest v1.1.1 h1:ou+xSqlIw1xfGTg1uq1nif/htZ2S3EzRqLm2BP+tYU0= -github.com/tevid/gohamcrest v1.1.1/go.mod h1:3UvtWlqm8j5JbwYZh80D/PVBt0mJ1eJiYgZMibh0H/k= -github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= -github.com/toolkits/concurrent v0.0.0-20150624120057-a4371d70e3e3/go.mod h1:QDlpd3qS71vYtakd2hmdpqhJ9nwv6mD6A30bQ1BPBFE= -github.com/tv42/httpunix v0.0.0-20150427012821-b75d8614f926/go.mod h1:9ESjWnEqriFuLhtthL60Sar/7RFoluCcXsuvEwTV5KM= -github.com/ugorji/go v1.1.4/go.mod h1:uQMGLiO92mf5W77hV/PUCpI3pbzQx3CRekS0kk+RGrc= -github.com/ugorji/go/codec v0.0.0-20181204163529-d75b2dcb6bc8/go.mod h1:VFNgLljTbGfSG7qAOspJ7OScBnGdDN/yBr0sguwnwf0= -github.com/urfave/cli v1.22.4 h1:u7tSpNPPswAFymm8IehJhy4uJMlUuU/GmqSkvJ1InXA= -github.com/urfave/cli v1.22.4/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= -github.com/vmware/govmomi v0.18.0/go.mod h1:URlwyTFZX72RmxtxuaFL2Uj3fD1JTvZdx59bHWk6aFU= -github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU= -github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q= -github.com/zouyx/agollo/v3 v3.4.4 h1:5G7QNw3fw74Ns8SfnHNhjndV2mlz5Fg8bB7q84ydFYI= -github.com/zouyx/agollo/v3 v3.4.4/go.mod h1:ag0XmE1r4iAgPd6PUnU9TJ0DMEjM1VKX1HUNqQJ2ywU= -go.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= -go.etcd.io/bbolt v1.3.4/go.mod h1:G5EMThwa9y8QZGBClrRx5EY+Yw9kAhnjy3bSjsnlVTQ= -go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= -go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= -go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= -go.uber.org/atomic v1.6.0 h1:Ezj3JGmsOnG1MoRWQkPBsKLe9DwWD9QeXzTRzzldNVk= -go.uber.org/atomic v1.6.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= -go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= -go.uber.org/multierr v1.5.0 h1:KCa4XfM8CWFCpxXRGok+Q0SS/0XBhMDbHHGABQLvD2A= -go.uber.org/multierr v1.5.0/go.mod h1:FeouvMocqHpRaaGuG9EjoKcStLC43Zu/fmqdUMPcKYU= -go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee h1:0mgffUl7nfd+FpvXMVz4IDEaUSmT1ysygQC7qYo7sG4= -go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee/go.mod h1:vJERXedbb3MVM5f9Ejo0C68/HhF8uaILCdgjnY+goOA= -go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= -go.uber.org/zap v1.15.0 h1:ZZCA22JRF2gQE5FoNmhmrf7jeJJ2uhqDUNRYKm8dvmM= -go.uber.org/zap v1.15.0/go.mod h1:Mb2vm2krFEG5DV0W9qcHBYFtp/Wku1cvYaqPsS/WYfc= -golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20181029021203-45a5f77698d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20181203042331-505ab145d0a9/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20190211182817-74369b46fc67/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= -golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190611184440-5c40567a22f8/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190923035154-9ee001bba392/go.mod h1:/lpIB1dKB+9EgE3H3cr1v9wB50oz8l4C4h62xy7jSTY= -golang.org/x/crypto v0.0.0-20191206172530-e9b2fee46413/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20200220183623-bac4c82f6975/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= -golang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek= -golang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY= -golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= -golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= -golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= -golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= -golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= -golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20190409202823-959b441ac422/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20190909230951-414d861bb4ac/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20190930215403-16217165b5de h1:5hukYrvBGR8/eNkX5mdUezrA6JiaEZDtJb9Ei+1LlBs= -golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE= -golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o= -golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= -golang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY= -golang.org/x/net v0.0.0-20170114055629-f2499483f923/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181023162649-9b4f9f5ad519/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181201002055-351d144fa1fc/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181220203305-927f97764cc3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190522155817-f3200d17e092/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= -golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= -golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190923162816-aa69164e4478/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20191004110552-13f9640d40b9/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= -golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sys v0.0.0-20170830134202-bb24a47a89ea/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20181026203630-95b1ffbd15a5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20181107165924-66b7b1311ac8/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20181205085412-a5c9d58dba9a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190129075346-302c3dd5f1cc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190209173611-3b5209105503/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190403152447-81d4e9dc473e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190508220229-2d0786266e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190515120540-06a5c4944438/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190523142557-0e01d883c5c5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190801041406-cbf593c0f2f3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190813064441-fde4db37ae7a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190922100055-0a153f010e69/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190924154521-2837fb4f24fe/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191008105621-543471e840be/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200124204421-9fbb57f87de9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae h1:/WDfKMnPU+m5M4xB+6x4kaepxRw6jWvR5iDRdvjHgy8= -golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/text v0.0.0-20160726164857-2910a502d2bf/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.3.1-0.20181227161524-e6919f6577db/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= -golang.org/x/text v0.3.2 h1:tW2bmiBqwgJj/UpqtC8EpXEZVYOwU0yG4iWbprSVAcs= -golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= -golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20181011042414-1f849cf54d09/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20181030221726-6c7e314b6563/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= -golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= -golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= -golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= -golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20190907020128-2ca718005c18/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191029041327-9cc4af7d6b2c/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191029190741-b9c20aec41a5/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191112195655-aa38f8e97acc h1:NCy3Ohtk6Iny5V/reW2Ktypo4zIpWBdRJ1uFMjBxdg8= -golang.org/x/tools v0.0.0-20191112195655-aa38f8e97acc/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= -google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M= -google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= -google.golang.org/api v0.9.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= -google.golang.org/api v0.13.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= -google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= -google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= -google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= -google.golang.org/appengine v1.6.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= -google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= -google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= -google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190404172233-64821d5d2107/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190530194941-fb225487d101/go.mod h1:z3L6/3dTEVtUr6QSP8miRzeRqwQOioJ9I66odjN4I7s= -google.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= -google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= -google.golang.org/genproto v0.0.0-20190911173649-1774047e7e51/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8= -google.golang.org/genproto v0.0.0-20191108220845-16a3f7862a1a/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/grpc v1.14.0/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw= -google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= -google.golang.org/grpc v1.19.1/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= -google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= -google.golang.org/grpc v1.21.0/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= -google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= -google.golang.org/grpc v1.22.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= -google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= -gopkg.in/airbrake/gobrake.v2 v2.0.9/go.mod h1:/h5ZAUhDkGaJfjzjKLSjv6zCL6O0LLBxU4K+aSYdM/U= -gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= -gopkg.in/asn1-ber.v1 v1.0.0-20181015200546-f715ec2f112d/go.mod h1:cuepJuh7vyXfUyUwEgHQXw849cJrilpS5NeIjOWESAw= -gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15 h1:YR8cESwS4TdDjEe65xsg0ogRM/Nc3DYOhEAlW+xobZo= -gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= -gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= -gopkg.in/gemnasium/logrus-airbrake-hook.v2 v2.1.2/go.mod h1:Xk6kEKp8OKb+X14hQBKWaSkCsqBpgog8nAV2xsGOxlo= -gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= -gopkg.in/ini.v1 v1.42.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= -gopkg.in/ini.v1 v1.51.0 h1:AQvPpx3LzTDM0AjnIRlVFwFFGC+npRopjZxLJj6gdno= -gopkg.in/ini.v1 v1.51.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= -gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo= -gopkg.in/square/go-jose.v2 v2.3.1/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI= -gopkg.in/square/go-jose.v2 v2.4.1/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI= -gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= -gopkg.in/yaml.v2 v2.0.0-20170812160011-eb3733d160e7/go.mod h1:JAlM8MvJe8wmxCU4Bli9HhUf9+ttbYbLASfIpnQbh74= -gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.8 h1:obN1ZagJSUGI0Ek/LBmuj4SNLPfIny3KsKFopxRdj10= -gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.1-2019.2.3 h1:3JgtbtFHMiCmsznwGVTUWbgGov+pVqnlf1dEJTNAXeM= -honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= -istio.io/gogo-genproto v0.0.0-20190124151557-6d926a6e6feb/go.mod h1:eIDJ6jNk/IeJz6ODSksHl5Aiczy5JUq6vFhJWI5OtiI= -k8s.io/api v0.16.9/go.mod h1:Y7dZNHs1Xy0mSwSlzL9QShi6qkljnN41yR8oWCRTDe8= -k8s.io/apimachinery v0.16.9/go.mod h1:Xk2vD2TRRpuWYLQNM6lT9R7DSFZUYG03SarNkbGrnKE= -k8s.io/client-go v0.16.9/go.mod h1:ThjPlh7Kx+XoBFOCt775vx5J7atwY7F/zaFzTco5gL0= -k8s.io/gengo v0.0.0-20190128074634-0689ccc1d7d6/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0= -k8s.io/klog v0.0.0-20181102134211-b9b56d5dfc92/go.mod h1:Gq+BEi5rUBO/HRz0bTSXDUcqjScdoY3a9IHpCEIOOfk= -k8s.io/klog v0.3.0/go.mod h1:Gq+BEi5rUBO/HRz0bTSXDUcqjScdoY3a9IHpCEIOOfk= -k8s.io/klog v1.0.0/go.mod h1:4Bi6QPql/J/LkTDqv7R/cd3hPo4k2DG6Ptcz060Ez5I= -k8s.io/kube-openapi v0.0.0-20190816220812-743ec37842bf/go.mod h1:1TqjTSzOxsLGIKfj0lK8EeCP7K1iUG65v09OM0/WG5E= -k8s.io/kube-openapi v0.0.0-20191107075043-30be4d16710a/go.mod h1:1TqjTSzOxsLGIKfj0lK8EeCP7K1iUG65v09OM0/WG5E= -k8s.io/utils v0.0.0-20190801114015-581e00157fb1/go.mod h1:sZAwmy6armz5eXlNoLmJcl4F1QuKu7sr+mFQ0byX7Ew= -launchpad.net/gocheck v0.0.0-20140225173054-000000000087/go.mod h1:hj7XX3B/0A+80Vse0e+BUHsHMTEhd0O4cpUHr/e/BUM= -rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= -sigs.k8s.io/structured-merge-diff v0.0.0-20190525122527-15d366b2352e/go.mod h1:wWxsB5ozmmv/SG7nM11ayaAW51xMvak/t1r0CSlcokI= -sigs.k8s.io/yaml v1.1.0/go.mod h1:UJmg0vDUVViEyp3mgSv9WPwZCDxu4rQW1olrI1uml+o= diff --git a/pkg/model/base.go b/pkg/model/base.go index 34fe3d29e..1a5e37ecd 100644 --- a/pkg/model/base.go +++ b/pkg/model/base.go @@ -71,6 +71,7 @@ var ProtocolTypeValue = map[string]int32{ // Address the address type Address struct { SocketAddress SocketAddress `yaml:"socket_address" json:"socket_address" mapstructure:"socket_address"` + Name string `yaml:"name" json:"name" mapstructure:"name"` } // Address specify either a logical or physical address and port, which are diff --git a/pkg/model/bootstrap.go b/pkg/model/bootstrap.go index 7f686b99a..1265a6964 100644 --- a/pkg/model/bootstrap.go +++ b/pkg/model/bootstrap.go @@ -22,6 +22,7 @@ type Bootstrap struct { StaticResources StaticResources `yaml:"static_resources" json:"static_resources" mapstructure:"static_resources"` DynamicResources DynamicResources `yaml:"dynamic_resources" json:"dynamic_resources" mapstructure:"dynamic_resources"` Tracing Tracing `yaml:"tracing" json:"tracing" mapstructure:"tracing"` + Addresses []Address `yaml:"addresses" json:"addresses" mapstructure:"addresses"` } // GetListeners diff --git a/pkg/model/pprof.go b/pkg/model/pprof.go index ce0d1c882..d955c63cc 100644 --- a/pkg/model/pprof.go +++ b/pkg/model/pprof.go @@ -19,5 +19,5 @@ package model type PprofConf struct { Enable bool `yaml:"enable" json:"enable" mapstructure:"enable" default: false` - Addr string `yaml:"addr" json:"addr" mapstructure:"addr" default: "0.0.0.0:6060"` + Addr string `yaml:"addr" json:"addr" mapstructure:"addr"` } diff --git a/pkg/proxy/proxy_start.go b/pkg/proxy/proxy_start.go index 8621ee9f9..ae879b633 100644 --- a/pkg/proxy/proxy_start.go +++ b/pkg/proxy/proxy_start.go @@ -20,10 +20,13 @@ package proxy import ( "encoding/json" "net/http" + "strconv" "sync" ) import ( + _ "github.com/apache/dubbo-go/metadata/service/inmemory" + _ "github.com/apache/dubbo-go/metadata/service/remote" "github.com/dubbogo/dubbo-go-proxy/pkg/client/dubbo" "github.com/dubbogo/dubbo-go-proxy/pkg/common/constant" "github.com/dubbogo/dubbo-go-proxy/pkg/common/extension" @@ -63,7 +66,15 @@ func (p *Proxy) Start() { } if conf.GetPprof().Enable { - go http.ListenAndServe(conf.GetPprof().Addr, nil) + addr := conf.GetPprof().Addr + for _, address := range conf.Addresses { + if addr == address.Name { + fullAddr := address.SocketAddress.Address + ":" + strconv.Itoa(address.SocketAddress.Port) + go http.ListenAndServe(fullAddr, nil) + logger.Infof("[dubboproxy pprof] httpListener start by : %s", fullAddr) + break + } + } } } From e22f933777b5a7e0db7988b02613eef6d184ec1d Mon Sep 17 00:00:00 2001 From: xiaoliu <18721825717@163.com> Date: Fri, 9 Oct 2020 15:34:16 +0800 Subject: [PATCH 129/227] =?UTF-8?q?1.=20=E4=BF=AE=E6=94=B9=E9=85=8D?= =?UTF-8?q?=E7=BD=AE=E4=BF=A1=E6=81=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- configs/conf.yaml | 2 +- pkg/proxy/proxy_start.go | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/configs/conf.yaml b/configs/conf.yaml index 659c37df7..380b2e2a9 100644 --- a/configs/conf.yaml +++ b/configs/conf.yaml @@ -48,7 +48,7 @@ static_resources: lb_policy: "RoundRobin" connect_timeout: "5s" pprofConf: - enable: true + enable: false addr: "pprof" addresses: diff --git a/pkg/proxy/proxy_start.go b/pkg/proxy/proxy_start.go index ae879b633..62323a25c 100644 --- a/pkg/proxy/proxy_start.go +++ b/pkg/proxy/proxy_start.go @@ -20,6 +20,7 @@ package proxy import ( "encoding/json" "net/http" + _ "net/http/pprof" "strconv" "sync" ) From 29903be2e09be79cd38e50a5b5044213a0028448 Mon Sep 17 00:00:00 2001 From: xiaoliu <18721825717@163.com> Date: Sat, 10 Oct 2020 11:02:08 +0800 Subject: [PATCH 130/227] =?UTF-8?q?1.=20=E4=BF=AE=E6=94=B9go.sum=20?= =?UTF-8?q?=E4=BF=A1=E6=81=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- go.sum | 698 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 698 insertions(+) create mode 100644 go.sum diff --git a/go.sum b/go.sum new file mode 100644 index 000000000..c6c6d02dd --- /dev/null +++ b/go.sum @@ -0,0 +1,698 @@ +cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= +cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= +cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU= +cloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU= +cloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY= +cloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc= +cloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0= +cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o= +cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= +cloud.google.com/go/firestore v1.1.0/go.mod h1:ulACoGHTpvq5r8rxGJ4ddJZBZqakUQqClKRT5SZwBmk= +cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I= +cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw= +dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= +github.com/Azure/azure-sdk-for-go v40.3.0+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc= +github.com/Azure/go-autorest/autorest v0.9.0/go.mod h1:xyHB1BMZT0cuDHU7I0+g046+BFDTQ8rEZB0s4Yfa6bI= +github.com/Azure/go-autorest/autorest v0.9.3/go.mod h1:GsRuLYvwzLjjjRoWEIyMUaYq8GNUx2nRB378IPt/1p0= +github.com/Azure/go-autorest/autorest v0.10.0/go.mod h1:/FALq9T/kS7b5J5qsQ+RSTUdAmGFqi0vUdVNNx8q630= +github.com/Azure/go-autorest/autorest/adal v0.5.0/go.mod h1:8Z9fGy2MpX0PvDjB1pEgQTmVqjGhiHBW7RJJEciWzS0= +github.com/Azure/go-autorest/autorest/adal v0.8.0/go.mod h1:Z6vX6WXXuyieHAXwMj0S6HY6e6wcHn37qQMBQlvY3lc= +github.com/Azure/go-autorest/autorest/adal v0.8.1/go.mod h1:ZjhuQClTqx435SRJ2iMlOxPYt3d2C/T/7TiQCVZSn3Q= +github.com/Azure/go-autorest/autorest/adal v0.8.2/go.mod h1:ZjhuQClTqx435SRJ2iMlOxPYt3d2C/T/7TiQCVZSn3Q= +github.com/Azure/go-autorest/autorest/azure/auth v0.4.2/go.mod h1:90gmfKdlmKgfjUpnCEpOJzsUEjrWDSLwHIG73tSXddM= +github.com/Azure/go-autorest/autorest/azure/cli v0.3.1/go.mod h1:ZG5p860J94/0kI9mNJVoIoLgXcirM2gF5i2kWloofxw= +github.com/Azure/go-autorest/autorest/date v0.1.0/go.mod h1:plvfp3oPSKwf2DNjlBjWF/7vwR+cUD/ELuzDCXwHUVA= +github.com/Azure/go-autorest/autorest/date v0.2.0/go.mod h1:vcORJHLJEh643/Ioh9+vPmf1Ij9AEBM5FuBIXLmIy0g= +github.com/Azure/go-autorest/autorest/mocks v0.1.0/go.mod h1:OTyCOPRA2IgIlWxVYxBee2F5Gr4kF2zd2J5cFRaIDN0= +github.com/Azure/go-autorest/autorest/mocks v0.2.0/go.mod h1:OTyCOPRA2IgIlWxVYxBee2F5Gr4kF2zd2J5cFRaIDN0= +github.com/Azure/go-autorest/autorest/mocks v0.3.0/go.mod h1:a8FDP3DYzQ4RYfVAxAN3SVSiiO77gL2j2ronKKP0syM= +github.com/Azure/go-autorest/autorest/to v0.3.0/go.mod h1:MgwOyqaIuKdG4TL/2ywSsIWKAfJfgHDo8ObuUk3t5sA= +github.com/Azure/go-autorest/autorest/validation v0.2.0/go.mod h1:3EEqHnBxQGHXRYq3HT1WyXAvT7LLY3tl70hw6tQIbjI= +github.com/Azure/go-autorest/logger v0.1.0/go.mod h1:oExouG+K6PryycPJfVSxi/koC6LSNgds39diKLz7Vrc= +github.com/Azure/go-autorest/tracing v0.5.0/go.mod h1:r/s2XiOKccPW3HrqB+W0TQzfbtp2fGCgRFtBroKn4Dk= +github.com/BurntSushi/toml v0.3.1 h1:WXkYYl6Yr3qBf1K79EBnL4mak0OimBfB0XUf9Vl28OQ= +github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= +github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= +github.com/DataDog/datadog-go v2.2.0+incompatible/go.mod h1:LButxg5PwREeZtORoXG3tL4fMGNddJ+vMq1mwgfaqoQ= +github.com/DataDog/datadog-go v3.2.0+incompatible/go.mod h1:LButxg5PwREeZtORoXG3tL4fMGNddJ+vMq1mwgfaqoQ= +github.com/Microsoft/go-winio v0.4.3/go.mod h1:VhR8bwka0BXejwEJY73c50VrPtXAaKcyvVC4A4RozmA= +github.com/Microsoft/go-winio v0.4.13/go.mod h1:qXqCSQ3Xa7+6tgxaGTIe4Kpcdsi+P8jBhyzoq1bpyYA= +github.com/NYTimes/gziphandler v0.0.0-20170623195520-56545f4a5d46/go.mod h1:3wb06e3pkSAbeQ52E9H9iFoQsEEwGN64994WTCIhntQ= +github.com/NYTimes/gziphandler v1.0.1/go.mod h1:3wb06e3pkSAbeQ52E9H9iFoQsEEwGN64994WTCIhntQ= +github.com/NYTimes/gziphandler v1.1.1/go.mod h1:n/CVRwUEOgIxrgPvAQhUUr9oeUtvrhMomdKFjzJNB0c= +github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= +github.com/PuerkitoBio/purell v1.0.0/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= +github.com/PuerkitoBio/urlesc v0.0.0-20160726150825-5bd2802263f2/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE= +github.com/StackExchange/wmi v0.0.0-20180116203802-5d049714c4a6/go.mod h1:3eOhrUMpNV+6aFIbp5/iudMxNCF27Vw2OZgy4xEx0Fg= +github.com/Workiva/go-datastructures v1.0.50 h1:slDmfW6KCHcC7U+LP3DDBbm4fqTwZGn1beOFPfGaLvo= +github.com/Workiva/go-datastructures v1.0.50/go.mod h1:Z+F2Rca0qCsVYDS8z7bAGm8f3UkzuWYS/oBZz5a7VVA= +github.com/abdullin/seq v0.0.0-20160510034733-d5467c17e7af/go.mod h1:5Jv4cbFiHJMsVxt52+i0Ha45fjshj6wxYr1r19tB9bw= +github.com/afex/hystrix-go v0.0.0-20180502004556-fa1af6a1f4f5 h1:rFw4nCn9iMW+Vajsk51NtYIcwSTkXr+JGrMd36kTDJw= +github.com/afex/hystrix-go v0.0.0-20180502004556-fa1af6a1f4f5/go.mod h1:SkGFH1ia65gfNATL8TAiHDNxPzPdmEL5uirI2Uyuz6c= +github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= +github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= +github.com/aliyun/alibaba-cloud-sdk-go v1.61.18/go.mod h1:v8ESoHo4SyHmuB4b1tJqDHxfTGEciD+yhvOU/5s1Rfk= +github.com/apache/dubbo-getty v1.3.10 h1:ys5mwjPdxG/KwkPjS6EI0RzQtU6p6FCPoKpaFEzpAL0= +github.com/apache/dubbo-getty v1.3.10/go.mod h1:x6rraK01BL5C7jUM2fPl5KMkAxLVIx54ZB8/XEOik9Y= +github.com/apache/dubbo-go v1.5.1 h1:hYktTWnMJdzwY0NkvSqJfOERkwFApZ3mH/tQBLVGO34= +github.com/apache/dubbo-go v1.5.1/go.mod h1:lxwgtF+27mSFQsSrBLaVbdQpwCp+pBN/mHP4w4/N2Qc= +github.com/apache/dubbo-go-hessian2 v1.6.2 h1:i7F5GjVaUatLQz1x9vUmmSIFj49L8J6rVICdF6xw4qw= +github.com/apache/dubbo-go-hessian2 v1.6.2/go.mod h1:7rEw9guWABQa6Aqb8HeZcsYPHsOS7XT1qtJvkmI6c5w= +github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o= +github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8= +github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY= +github.com/armon/go-metrics v0.0.0-20190430140413-ec5e00d3c878/go.mod h1:3AMJUQhVx52RsWOnlkpikZr01T/yAVN2gn0861vByNg= +github.com/armon/go-metrics v0.3.0/go.mod h1:zXjbSimjXTd7vOpY8B0/2LpvNvDoXBuplAD+gJD3GYs= +github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= +github.com/armon/go-radix v1.0.0/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= +github.com/aws/aws-sdk-go v1.25.41/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= +github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= +github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= +github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= +github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= +github.com/bketelsen/crypt v0.0.3-0.20200106085610-5cbc8cc4026c/go.mod h1:MKsuJmJgSg28kpZDP6UIiPt0e0Oz0kqKNGyRaWEPv84= +github.com/boltdb/bolt v1.3.1/go.mod h1:clJnj/oiGkjum5o1McbSZDSLxVThjynRyGBgiAx27Ps= +github.com/buger/jsonparser v0.0.0-20181115193947-bf1c66bbce23/go.mod h1:bbYlZJ7hK1yFx9hf58LP0zeX7UjIGs20ufpu3evjr+s= +github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= +github.com/circonus-labs/circonus-gometrics v2.3.1+incompatible/go.mod h1:nmEj6Dob7S7YxXgwXpfOuvO54S+tGdZdw9fuRZt25Ag= +github.com/circonus-labs/circonusllhist v0.1.3/go.mod h1:kMXHVDlOchFAehlya5ePtbp5jckzBHf4XRpQvBOLI+I= +github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= +github.com/cockroachdb/apd v1.1.0/go.mod h1:8Sl8LxpKi29FqWXR16WEFZRNSz3SoPzUzeMeY4+DwBQ= +github.com/coredns/coredns v1.1.2/go.mod h1:zASH/MVDgR6XZTbxvOnsZfffS+31vg6Ackf/wo1+AM0= +github.com/coreos/bbolt v1.3.2/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk= +github.com/coreos/bbolt v1.3.3/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk= +github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= +github.com/coreos/etcd v3.3.13+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= +github.com/coreos/go-etcd v2.0.0+incompatible/go.mod h1:Jez6KQU2B/sWsbdaef3ED8NzMklzPG4d5KIOhIy30Tk= +github.com/coreos/go-oidc v2.1.0+incompatible/go.mod h1:CgnwVTmzoESiwO9qyAFEMiHoZ1nMCKZlZ9V6mm3/LKc= +github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= +github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= +github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= +github.com/coreos/go-systemd v0.0.0-20190719114852-fd7a80b32e1f/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= +github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= +github.com/cpuguy83/go-md2man v1.0.10 h1:BSKMNlYxDvnunlTymqtgONjNnaRV1sTpcovwwjF22jk= +github.com/cpuguy83/go-md2man v1.0.10/go.mod h1:SmD6nW6nTyfqj6ABTjUi3V3JVMnlJmwcJI5acqYI6dE= +github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d h1:U+s90UTSYgptZMwQh2aRr3LuazLJIa+Pg3Kc1ylSYVY= +github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= +github.com/creasty/defaults v1.3.0 h1:uG+RAxYbJgOPCOdKEcec9ZJXeva7Y6mj/8egdzwmLtw= +github.com/creasty/defaults v1.3.0/go.mod h1:CIEEvs7oIVZm30R8VxtFJs+4k201gReYyuYHJxZc68I= +github.com/davecgh/go-spew v0.0.0-20151105211317-5215b55f46b2/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/denverdino/aliyungo v0.0.0-20170926055100-d3308649c661/go.mod h1:dV8lFg6daOBZbT6/BDGIz6Y3WFGn8juu6G+CQ6LHtl0= +github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= +github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no= +github.com/digitalocean/godo v1.1.1/go.mod h1:h6faOIcZ8lWIwNQ+DN7b3CgX4Kwby5T+nbpNqkUIozU= +github.com/digitalocean/godo v1.10.0/go.mod h1:h6faOIcZ8lWIwNQ+DN7b3CgX4Kwby5T+nbpNqkUIozU= +github.com/dimchansky/utfbom v1.1.0/go.mod h1:rO41eb7gLfo8SF1jd9F8HplJm1Fewwi4mQvIirEdv+8= +github.com/dnaeon/go-vcr v1.0.1/go.mod h1:aBB1+wY4s93YsC3HHjMBMrwTj2R9FHDzUr9KyGc8n1E= +github.com/docker/go-connections v0.3.0/go.mod h1:Gbd7IOopHjR8Iph03tsViu4nIes5XhDvyHbTtUxmeec= +github.com/docker/go-connections v0.4.0/go.mod h1:Gbd7IOopHjR8Iph03tsViu4nIes5XhDvyHbTtUxmeec= +github.com/docker/spdystream v0.0.0-20160310174837-449fdfce4d96/go.mod h1:Qh8CwZgvJUkLughtfhJv5dyTYa91l1fOUCrgjqmcifM= +github.com/dubbogo/go-zookeeper v1.0.1 h1:irLzvOsDOTNsN8Sv9tvYYxVu6DCQfLtziZQtUHmZgz8= +github.com/dubbogo/go-zookeeper v1.0.1/go.mod h1:fn6n2CAEer3novYgk9ULLwAjuV8/g4DdC2ENwRb6E+c= +github.com/dubbogo/gost v1.9.0/go.mod h1:pPTjVyoJan3aPxBPNUX0ADkXjPibLo+/Ib0/fADXSG8= +github.com/dubbogo/gost v1.9.1 h1:0/PPFo13zPbjt4Ia0zYWMFi3C6rAe9X7O1J2Iv+BHNM= +github.com/dubbogo/gost v1.9.1/go.mod h1:pPTjVyoJan3aPxBPNUX0ADkXjPibLo+/Ib0/fADXSG8= +github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= +github.com/elazarl/go-bindata-assetfs v0.0.0-20160803192304-e1a2a7ec64b0/go.mod h1:v+YaWX3bdea5J/mo8dSETolEo7R71Vk1u8bnjau5yw4= +github.com/elazarl/go-bindata-assetfs v1.0.0/go.mod h1:v+YaWX3bdea5J/mo8dSETolEo7R71Vk1u8bnjau5yw4= +github.com/elazarl/goproxy v0.0.0-20170405201442-c4fc26588b6e/go.mod h1:/Zj4wYkgs4iZTTu3o/KG3Itv/qCCa8VVMlb3i9OVuzc= +github.com/emicklei/go-restful v0.0.0-20170410110728-ff4f55a20633/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs= +github.com/emicklei/go-restful/v3 v3.0.0/go.mod h1:6n3XBCmQQb25CM2LCACGz8ukIrRry+4bhvbpWn3mrbc= +github.com/envoyproxy/go-control-plane v0.8.0/go.mod h1:GSSbY9P1neVhdY7G4wu+IK1rk/dqhiCC/4ExuWJZVuk= +github.com/envoyproxy/protoc-gen-validate v0.0.14/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= +github.com/evanphx/json-patch v4.2.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= +github.com/fastly/go-utils v0.0.0-20180712184237-d95a45783239/go.mod h1:Gdwt2ce0yfBxPvZrHkprdPPTTS3N5rwmLE8T22KBXlw= +github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= +github.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL+zU= +github.com/fatih/structs v1.1.0/go.mod h1:9NiDSp5zOcgEDl+j00MP/WkGVPOlPRLejGD8Ga6PJ7M= +github.com/frankban/quicktest v1.4.1/go.mod h1:36zfPVQyHxymz4cH7wlDmVwDrJuljRB60qkgn7rorfQ= +github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= +github.com/ghodss/yaml v0.0.0-20150909031657-73d445a93680/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= +github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= +github.com/ghodss/yaml v1.0.1-0.20190212211648-25d852aebe32 h1:Mn26/9ZMNWSw9C9ERFA1PUxfmGpolnw2v0bKOREu5ew= +github.com/ghodss/yaml v1.0.1-0.20190212211648-25d852aebe32/go.mod h1:GIjDIg/heH5DOkXY3YJ/wNhfHsQHoXGjl8G8amsYQ1I= +github.com/go-asn1-ber/asn1-ber v1.3.1/go.mod h1:hEBeB/ic+5LoWskz+yKT7vGhhPYkProFKoKdwZRWMe0= +github.com/go-co-op/gocron v0.1.1 h1:OfDmkqkCguFtFMsm6Eaayci3DADLa8pXvdmOlPU/JcU= +github.com/go-co-op/gocron v0.1.1/go.mod h1:Y9PWlYqDChf2Nbgg7kfS+ZsXHDTZbMZYPEQ0MILqH+M= +github.com/go-errors/errors v1.0.1/go.mod h1:f4zRHt4oKfwPJE5k8C9vpYG+aDHdBFUsgrm6/TyX73Q= +github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= +github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= +github.com/go-ldap/ldap v3.0.2+incompatible/go.mod h1:qfd9rJvER9Q0/D/Sqn1DfHRoBp40uXYvFoEVrNEPqRc= +github.com/go-ldap/ldap/v3 v3.1.3/go.mod h1:3rbOH3jRS2u6jg2rJnKAMLE/xQyCKIveG2Sa/Cohzb8= +github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= +github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= +github.com/go-logr/logr v0.1.0/go.mod h1:ixOQHD9gLJUVQQ2ZOR7zLEifBX6tGkNJF4QyIY7sIas= +github.com/go-ole/go-ole v1.2.1/go.mod h1:7FAglXiTm7HKlQRDeOQ6ZNUHidzCWXuZWq/1dTyBNF8= +github.com/go-openapi/jsonpointer v0.0.0-20160704185906-46af16f9f7b1/go.mod h1:+35s3my2LFTysnkMfxsJBAMHj/DoqoB9knIWoYG/Vk0= +github.com/go-openapi/jsonreference v0.0.0-20160704190145-13c6e3589ad9/go.mod h1:W3Z9FmVs9qj+KR4zFKmDPGiLdk1D9Rlm7cyMvf57TTg= +github.com/go-openapi/spec v0.0.0-20160808142527-6aced65f8501/go.mod h1:J8+jY1nAiCcj+friV/PDoE1/3eeccG9LYBs0tYvLOWc= +github.com/go-openapi/swag v0.0.0-20160704191624-1d0bd113de87/go.mod h1:DXUve3Dpr1UfpPtxFw+EFuQ41HhCWZfha5jSVRG7C7I= +github.com/go-redis/redis v6.15.5+incompatible/go.mod h1:NAIEuMOZ/fxfXJIrKDQDz8wamY7mA7PouImQ2Jvg6kA= +github.com/go-resty/resty/v2 v2.1.0/go.mod h1:dZGr0i9PLlaaTD4H/hoZIDjQ+r6xq8mgbRzHZf7f2J8= +github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= +github.com/go-test/deep v1.0.2-0.20181118220953-042da051cf31/go.mod h1:wGDj63lr65AM2AQyKZd/NYHGb0R+1RLqB8NKt3aSFNA= +github.com/go-test/deep v1.0.2/go.mod h1:wGDj63lr65AM2AQyKZd/NYHGb0R+1RLqB8NKt3aSFNA= +github.com/gogo/googleapis v1.1.0/go.mod h1:gf4bu3Q80BeJ6H1S1vYPm8/ELATdvryBaNFGgqEef3s= +github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= +github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4= +github.com/gogo/protobuf v1.2.2-0.20190723190241-65acae22fc9d/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= +github.com/goinggo/mapstructure v0.0.0-20140717182941-194205d9b4a9 h1:wqckanyE9qc/XnvnybC6SHOb8Nyd62QXAZOzA8twFig= +github.com/goinggo/mapstructure v0.0.0-20140717182941-194205d9b4a9/go.mod h1:64ikIrMv84B+raz7akXOqbF7cK3/OQQ/6cClY10oy7A= +github.com/goji/httpauth v0.0.0-20160601135302-2da839ab0f4d/go.mod h1:nnjvkQ9ptGaCkuDUx6wNykzzlUixGxvkme+H/lnzb+A= +github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= +github.com/golang/groupcache v0.0.0-20160516000752-02826c3e7903/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/groupcache v0.0.0-20190129154638-5b532d6fd5ef/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= +github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= +github.com/golang/mock v1.3.1 h1:qGJ6qTW+x6xX/my+8YUVl4WNpX9B7+/l2tRsHGZ7f2s= +github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y= +github.com/golang/protobuf v0.0.0-20161109072736-4bd1920723d7/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/snappy v0.0.1 h1:Qgr9rKW7uDUkrbSmQeiDsGa8SjGyCOGtuasMWwvp2P4= +github.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= +github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= +github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= +github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= +github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= +github.com/google/go-querystring v0.0.0-20170111101155-53e6ce116135/go.mod h1:odCYkC5MyYFN7vkCjXpyrEuKhc/BUO6wN/zVPAxq5ck= +github.com/google/go-querystring v1.0.0/go.mod h1:odCYkC5MyYFN7vkCjXpyrEuKhc/BUO6wN/zVPAxq5ck= +github.com/google/gofuzz v0.0.0-20161122191042-44d81051d367/go.mod h1:HP5RmnzzSNb993RKQDq4+1A4ia9nllfqcQFTQJedwGI= +github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= +github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= +github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= +github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= +github.com/google/tcpproxy v0.0.0-20180808230851-dfa16c61dad2/go.mod h1:DavVbd41y+b7ukKDmlnPR4nGYmkWXR6vHUkjQNiHPBs= +github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= +github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= +github.com/googleapis/gnostic v0.0.0-20170729233727-0c5108395e2d/go.mod h1:sJBsCZ4ayReDTBIg8b9dl28c5xFWyhBTVRp3pOg5EKY= +github.com/googleapis/gnostic v0.2.0/go.mod h1:sJBsCZ4ayReDTBIg8b9dl28c5xFWyhBTVRp3pOg5EKY= +github.com/gophercloud/gophercloud v0.1.0/go.mod h1:vxM41WHh5uqHVBMZHzuwNOHh8XEoIEcSTewFxm1c5g8= +github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= +github.com/gorilla/websocket v1.4.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= +github.com/gorilla/websocket v1.4.2 h1:+/TMaTYc4QFitKJxsQ7Yye35DkWvkdLcvGKqM+x0Ufc= +github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= +github.com/gregjones/httpcache v0.0.0-20180305231024-9cad4c3443a7/go.mod h1:FecbI9+v66THATjSRHfNgh1IVFe/9kFxbXtjV0ctIMA= +github.com/grpc-ecosystem/go-grpc-middleware v1.0.0/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= +github.com/grpc-ecosystem/go-grpc-middleware v1.0.1-0.20190118093823-f849b5445de4/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= +github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk= +github.com/grpc-ecosystem/grpc-gateway v1.9.0/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= +github.com/grpc-ecosystem/grpc-gateway v1.9.5/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= +github.com/grpc-ecosystem/grpc-opentracing v0.0.0-20180507213350-8e809c8a8645/go.mod h1:6iZfnjpejD4L/4DwD7NryNaJyCQdzwWwH2MWhCA90Kw= +github.com/hashicorp/consul v1.8.0/go.mod h1:Gg9/UgAQ9rdY3CTvzQZ6g2jcIb7NlIfjI+0pvLk5D1A= +github.com/hashicorp/consul/api v1.1.0/go.mod h1:VmuI/Lkw1nC05EYQWNKwWGbkg+FbDBtguAZLlVdkD9Q= +github.com/hashicorp/consul/api v1.5.0/go.mod h1:LqwrLNW876eYSuUOo4ZLHBcdKc038txr/IMfbLPATa4= +github.com/hashicorp/consul/sdk v0.1.1/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyNV1vwHyQBF0x8= +github.com/hashicorp/consul/sdk v0.5.0/go.mod h1:fY08Y9z5SvJqevyZNy6WWPXiG3KwBPAvlcdx16zZ0fM= +github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= +github.com/hashicorp/go-bexpr v0.1.2/go.mod h1:ANbpTX1oAql27TZkKVeW8p1w8NTdnyzPe/0qqPCKohU= +github.com/hashicorp/go-checkpoint v0.0.0-20171009173528-1545e56e46de/go.mod h1:xIwEieBHERyEvaeKF/TcHh1Hu+lxPM+n2vT1+g9I4m4= +github.com/hashicorp/go-cleanhttp v0.5.0/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= +github.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= +github.com/hashicorp/go-connlimit v0.2.0/go.mod h1:OUj9FGL1tPIhl/2RCfzYHrIiWj+VVPGNyVPnUX8AqS0= +github.com/hashicorp/go-discover v0.0.0-20200501174627-ad1e96bde088/go.mod h1:vZu6Opqf49xX5lsFAu7iFNewkcVF1sn/wyapZh5ytlg= +github.com/hashicorp/go-hclog v0.0.0-20180709165350-ff2cf002a8dd/go.mod h1:9bjs9uLqI8l75knNv3lV1kA55veR+WUPSiKIWcQHudI= +github.com/hashicorp/go-hclog v0.8.0/go.mod h1:5CU+agLiy3J7N7QjHK5d05KxGsuXiQLrjA0H7acj2lQ= +github.com/hashicorp/go-hclog v0.9.1/go.mod h1:5CU+agLiy3J7N7QjHK5d05KxGsuXiQLrjA0H7acj2lQ= +github.com/hashicorp/go-hclog v0.9.2/go.mod h1:5CU+agLiy3J7N7QjHK5d05KxGsuXiQLrjA0H7acj2lQ= +github.com/hashicorp/go-hclog v0.12.0/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ= +github.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= +github.com/hashicorp/go-immutable-radix v1.1.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= +github.com/hashicorp/go-memdb v1.0.3/go.mod h1:LWQ8R70vPrS4OEY9k28D2z8/Zzyu34NVzeRibGAzHO0= +github.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM= +github.com/hashicorp/go-msgpack v0.5.5/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM= +github.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk= +github.com/hashicorp/go-multierror v1.1.0/go.mod h1:spPvp8C1qA32ftKqdAHm4hHTbPw+vmowP0z+KUhOZdA= +github.com/hashicorp/go-plugin v1.0.1/go.mod h1:++UyYGoz3o5w9ZzAdZxtQKrWWP+iqPBn3cQptSMzBuY= +github.com/hashicorp/go-raftchunking v0.6.1/go.mod h1:cGlg3JtDy7qy6c/3Bu660Mic1JF+7lWqIwCFSb08fX0= +github.com/hashicorp/go-raftchunking v0.6.3-0.20191002164813-7e9e8525653a/go.mod h1:xbXnmKqX9/+RhPkJ4zrEx4738HacP72aaUPlT2RZ4sU= +github.com/hashicorp/go-retryablehttp v0.5.3/go.mod h1:9B5zBasrRhHXnJnui7y6sL7es7NDiJgTc6Er0maI1Xs= +github.com/hashicorp/go-retryablehttp v0.5.4/go.mod h1:9B5zBasrRhHXnJnui7y6sL7es7NDiJgTc6Er0maI1Xs= +github.com/hashicorp/go-retryablehttp v0.6.2/go.mod h1:gEx6HMUGxYYhJScX7W1Il64m6cc2C1mDaW3NQ9sY1FY= +github.com/hashicorp/go-rootcerts v1.0.0/go.mod h1:K6zTfqpRlCUIjkwsN4Z+hiSfzSTQa6eBIzfwKfwNnHU= +github.com/hashicorp/go-rootcerts v1.0.1/go.mod h1:pqUvnprVnM5bf7AOirdbb01K4ccR319Vf4pU3K5EGc8= +github.com/hashicorp/go-rootcerts v1.0.2/go.mod h1:pqUvnprVnM5bf7AOirdbb01K4ccR319Vf4pU3K5EGc8= +github.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU= +github.com/hashicorp/go-sockaddr v1.0.2/go.mod h1:rB4wwRAUzs07qva3c5SdrY/NEtAUjGlgmH/UkBUC97A= +github.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4= +github.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= +github.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= +github.com/hashicorp/go-uuid v1.0.2-0.20191001231223-f32f5fe8d6a8/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= +github.com/hashicorp/go-uuid v1.0.2/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= +github.com/hashicorp/go-version v1.1.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= +github.com/hashicorp/go-version v1.2.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= +github.com/hashicorp/go.net v0.0.1/go.mod h1:hjKkEWcCURg++eb33jQU7oqQcI9XDCnUzHA0oac0k90= +github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= +github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= +github.com/hashicorp/golang-lru v0.5.3/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= +github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= +github.com/hashicorp/hil v0.0.0-20160711231837-1e86c6b523c5/go.mod h1:KHvg/R2/dPtaePb16oW4qIyzkMxXOL38xjRN64adsts= +github.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64= +github.com/hashicorp/mdns v1.0.0/go.mod h1:tL+uN++7HEJ6SQLQ2/p+z2pH24WQKWjBPkE0mNTz8vQ= +github.com/hashicorp/mdns v1.0.1/go.mod h1:4gW7WsVCke5TE7EPeYliwHlRUyBtfCwuFwuMg2DmyNY= +github.com/hashicorp/memberlist v0.1.3/go.mod h1:ajVTdAv/9Im8oMAAj5G31PhhMCZJV2pPBoIllUwCN7I= +github.com/hashicorp/memberlist v0.2.0/go.mod h1:MS2lj3INKhZjWNqd3N0m3J+Jxf3DAOnAH9VT3Sh9MUE= +github.com/hashicorp/memberlist v0.2.2/go.mod h1:MS2lj3INKhZjWNqd3N0m3J+Jxf3DAOnAH9VT3Sh9MUE= +github.com/hashicorp/net-rpc-msgpackrpc v0.0.0-20151116020338-a14192a58a69/go.mod h1:/z+jUGRBlwVpUZfjute9jWaF6/HuhjuFQuL1YXzVD1Q= +github.com/hashicorp/raft v1.1.1/go.mod h1:vPAJM8Asw6u8LxC3eJCUZmRP/E4QmUGE1R7g7k8sG/8= +github.com/hashicorp/raft v1.1.2-0.20191002163536-9c6bd3e3eb17/go.mod h1:vPAJM8Asw6u8LxC3eJCUZmRP/E4QmUGE1R7g7k8sG/8= +github.com/hashicorp/raft v1.1.2/go.mod h1:vPAJM8Asw6u8LxC3eJCUZmRP/E4QmUGE1R7g7k8sG/8= +github.com/hashicorp/raft-boltdb v0.0.0-20171010151810-6e5ba93211ea/go.mod h1:pNv7Wc3ycL6F5oOWn+tPGo2gWD4a5X+yp/ntwdKLjRk= +github.com/hashicorp/serf v0.8.2/go.mod h1:6hOLApaqBFA1NXqRQAsxw9QxuDEvNxSQRwA/JwenrHc= +github.com/hashicorp/serf v0.9.0/go.mod h1:YL0HO+FifKOW2u1ke99DGVu1zhcpZzNwrLIqBC7vbYU= +github.com/hashicorp/serf v0.9.2/go.mod h1:UWDWwZeL5cuWDJdl0C6wrvrUwEqtQ4ZKBKKENpqIUyk= +github.com/hashicorp/vault/api v1.0.4/go.mod h1:gDcqh3WGcR1cpF5AJz/B1UFheUEneMoIospckxBxk6Q= +github.com/hashicorp/vault/api v1.0.5-0.20191108163347-bdd38fca2cff/go.mod h1:Uf8LaHyrYsgVgHzO2tMZKhqRGlL3UJ6XaSwW2EA1Iqo= +github.com/hashicorp/vault/sdk v0.1.13/go.mod h1:B+hVj7TpuQY1Y/GPbCpffmgd+tSEwvhkWnjtSYCaS2M= +github.com/hashicorp/vault/sdk v0.1.14-0.20191108161836-82f2b5571044/go.mod h1:PcekaFGiPJyHnFy+NZhP6ll650zEw51Ag7g/YEa+EOU= +github.com/hashicorp/vault/sdk v0.1.14-0.20191112033314-390e96e22eb2/go.mod h1:PcekaFGiPJyHnFy+NZhP6ll650zEw51Ag7g/YEa+EOU= +github.com/hashicorp/vic v1.5.1-0.20190403131502-bbfe86ec9443/go.mod h1:bEpDU35nTu0ey1EXjwNwPjI9xErAsoOCmcMb9GKvyxo= +github.com/hashicorp/yamux v0.0.0-20180604194846-3520598351bb/go.mod h1:+NfK9FKeTrX5uv1uIXGdwYDTeHna2qgaIlx54MXqjAM= +github.com/hashicorp/yamux v0.0.0-20181012175058-2f1d1f20f75d/go.mod h1:+NfK9FKeTrX5uv1uIXGdwYDTeHna2qgaIlx54MXqjAM= +github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= +github.com/imdario/mergo v0.3.5/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= +github.com/imdario/mergo v0.3.6/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= +github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= +github.com/jackc/fake v0.0.0-20150926172116-812a484cc733/go.mod h1:WrMFNQdiFJ80sQsxDoMokWK1W5TQtxBFNpzWTD84ibQ= +github.com/jackc/pgx v3.3.0+incompatible/go.mod h1:0ZGrqGqkRlliWnWB4zKnWtjbSWbGkVEFm4TeybAXq+I= +github.com/jarcoal/httpmock v0.0.0-20180424175123-9c70cfe4a1da/go.mod h1:ks+b9deReOc7jgqp+e7LuFiCBH6Rm5hL32cLcEAArb4= +github.com/jehiah/go-strftime v0.0.0-20171201141054-1d33003b3869/go.mod h1:cJ6Cj7dQo+O6GJNiMx+Pa94qKj+TG8ONdKHgMNIyyag= +github.com/jinzhu/copier v0.0.0-20190625015134-976e0346caa8 h1:mGIXW/lubQ4B+3bXTLxcTMTjUNDqoF6T/HUW9LbFx9s= +github.com/jinzhu/copier v0.0.0-20190625015134-976e0346caa8/go.mod h1:yL958EeXv8Ylng6IfnvG4oflryUi3vgA3xPs9hmII1s= +github.com/jmespath/go-jmespath v0.0.0-20180206201540-c2b33e8439af/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k= +github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo= +github.com/joyent/triton-go v0.0.0-20180628001255-830d2b111e62/go.mod h1:U+RSyWxWd04xTqnuOQxnai7XGS2PrPY2cfGoDKtMHjA= +github.com/joyent/triton-go v1.7.1-0.20200416154420-6801d15b779f/go.mod h1:KDSfL7qe5ZfQqvlDMkVjCztbmcpp/c8M77vhQP8ZPvk= +github.com/json-iterator/go v0.0.0-20180612202835-f2b4162afba3/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= +github.com/json-iterator/go v1.1.5/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= +github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= +github.com/json-iterator/go v1.1.7/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= +github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= +github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= +github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= +github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q= +github.com/kisielk/errcheck v1.2.0/go.mod h1:/BMXB+zMLi60iA8Vv6Ksmxu/1UDYcXs4uQLJ+jE2L00= +github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= +github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= +github.com/konsorten/go-windows-terminal-sequences v1.0.2/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= +github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= +github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= +github.com/kr/pretty v0.2.0 h1:s5hAObm+yFO5uHYt5dYjxi2rXrsnmRpJx4OYvIWUaQs= +github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= +github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= +github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE= +github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= +github.com/lestrrat/go-envload v0.0.0-20180220120943-6ed08b54a570/go.mod h1:BLt8L9ld7wVsvEWQbuLrUZnCMnUmLZ+CGDzKtclrTlE= +github.com/lestrrat/go-file-rotatelogs v0.0.0-20180223000712-d3151e2a480f/go.mod h1:UGmTpUd3rjbtfIpwAPrcfmGf/Z1HS95TATB+m57TPB8= +github.com/lestrrat/go-strftime v0.0.0-20180220042222-ba3bf9c1d042/go.mod h1:TPpsiPUEh0zFL1Snz4crhMlBe60PYxRHr5oFF3rRYg0= +github.com/lib/pq v1.1.1/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= +github.com/linode/linodego v0.7.1/go.mod h1:ga11n3ivecUrPCHN0rANxKmfWBJVkOXfLMZinAbj2sY= +github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= +github.com/magiconair/properties v1.8.1 h1:ZC2Vc7/ZFkGmsVC9KvOjumD+G5lXy2RtTKyzRKO2BQ4= +github.com/magiconair/properties v1.8.1/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= +github.com/mailru/easyjson v0.0.0-20160728113105-d5b7844b561a/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= +github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= +github.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= +github.com/mattn/go-colorable v0.1.6/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= +github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= +github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= +github.com/mattn/go-isatty v0.0.10/go.mod h1:qgIWMr58cqv1PHHyhnkY9lrL7etaEgOFcMEpPG5Rm84= +github.com/mattn/go-isatty v0.0.11/go.mod h1:PhnuNfih5lzO57/f3n+odYbM4JtupLOxQOAqxQCu2WE= +github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= +github.com/mattn/go-runewidth v0.0.3/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= +github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= +github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= +github.com/miekg/dns v1.1.26/go.mod h1:bPDLeHnStXmXAq1m/Ch/hvfNHr14JKNPMBo3VZKjuso= +github.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc= +github.com/mitchellh/cli v1.1.0/go.mod h1:xcISNoH86gajksDmfB23e/pu+B+GeFRMYmoHXxx3xhI= +github.com/mitchellh/copystructure v1.0.0/go.mod h1:SNtv71yrdKgLRyLFxmLdkAbkKEFWgYaq1OVrnRcwhnw= +github.com/mitchellh/go-homedir v1.0.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= +github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= +github.com/mitchellh/go-testing-interface v0.0.0-20171004221916-a61a99592b77/go.mod h1:kRemZodwjscx+RGhAo8eIhFbs2+BFgRtFPeD/KE+zxI= +github.com/mitchellh/go-testing-interface v1.0.0/go.mod h1:kRemZodwjscx+RGhAo8eIhFbs2+BFgRtFPeD/KE+zxI= +github.com/mitchellh/go-testing-interface v1.14.0/go.mod h1:gfgS7OtZj6MA4U1UrDRp04twqAjfvlZyCfX3sDjEym8= +github.com/mitchellh/go-wordwrap v1.0.0/go.mod h1:ZXFpozHsX6DPmq2I0TCekCxypsnAUbP2oI0UX1GXzOo= +github.com/mitchellh/gox v0.4.0/go.mod h1:Sd9lOJ0+aimLBi73mGofS1ycjY8lL3uZM3JPS42BGNg= +github.com/mitchellh/hashstructure v0.0.0-20170609045927-2bca23e0e452/go.mod h1:QjSHrPWS+BGUVBYkbTZWEnOh3G1DutKwClXU/ABz6AQ= +github.com/mitchellh/hashstructure v1.0.0/go.mod h1:QjSHrPWS+BGUVBYkbTZWEnOh3G1DutKwClXU/ABz6AQ= +github.com/mitchellh/iochan v1.0.0/go.mod h1:JwYml1nuB7xOzsp52dPpHFffvOCDupsG0QubkSMEySY= +github.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= +github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= +github.com/mitchellh/mapstructure v1.2.3 h1:f/MjBEBDLttYCGfRaKBbKSRVF5aV2O6fnBpzknuE3jU= +github.com/mitchellh/mapstructure v1.2.3/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= +github.com/mitchellh/pointerstructure v1.0.0/go.mod h1:k4XwG94++jLVsSiTxo7qdIfXA9pj9EAeo0QsNNJOLZ8= +github.com/mitchellh/reflectwalk v1.0.0/go.mod h1:mSTlrgnPZtwu0c4WaC2kGObEpuNDbx0jmZXqmk4esnw= +github.com/mitchellh/reflectwalk v1.0.1/go.mod h1:mSTlrgnPZtwu0c4WaC2kGObEpuNDbx0jmZXqmk4esnw= +github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/reflect2 v0.0.0-20180320133207-05fbef0ca5da/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= +github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= +github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= +github.com/munnerz/goautoneg v0.0.0-20120707110453-a547fc61f48d/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= +github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= +github.com/mxk/go-flowrate v0.0.0-20140419014527-cca7078d478f/go.mod h1:ZdcZmHo+o7JKHSa8/e818NopupXU1YMK5fe1lsApnBw= +github.com/nacos-group/nacos-sdk-go v1.0.0/go.mod h1:hlAPn3UdzlxIlSILAyOXKxjFSvDJ9oLzTJ9hLAK1KzA= +github.com/nicolai86/scaleway-sdk v1.10.2-0.20180628010248-798f60e20bb2/go.mod h1:TLb2Sg7HQcgGdloNxkrmtgDNR9uVYF3lfdFIN4Ro6Sk= +github.com/oklog/run v1.0.0/go.mod h1:dlhp/R75TPv97u0XWUtDeV/lRKWPKSdTuV0TZvrmrQA= +github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U= +github.com/olekukonko/tablewriter v0.0.0-20180130162743-b8a9be070da4/go.mod h1:vsDQFd/mU46D+Z4whnwzcISnGGzXWMclvtLoiIKAKIo= +github.com/onsi/ginkgo v0.0.0-20170829012221-11459a886d9c/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= +github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= +github.com/onsi/ginkgo v1.8.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= +github.com/onsi/ginkgo v1.10.1/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= +github.com/onsi/gomega v0.0.0-20170829124025-dcabb60a477c/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= +github.com/onsi/gomega v1.5.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= +github.com/onsi/gomega v1.7.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= +github.com/opentracing/opentracing-go v1.1.0 h1:pWlfV3Bxv7k65HYwkikxat0+s3pV4bsqf19k25Ur8rU= +github.com/opentracing/opentracing-go v1.1.0/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= +github.com/packethost/packngo v0.1.1-0.20180711074735-b9cb5096f54c/go.mod h1:otzZQXgoO96RTzDB/Hycg0qZcXZsWJGJRSXbmEIJ+4M= +github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= +github.com/pascaldekloe/goe v0.1.0/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= +github.com/patrickmn/go-cache v2.1.0+incompatible/go.mod h1:3Qf8kWWT7OJRJbdiICTKqZju1ZixQ/KpMGzzAfe6+WQ= +github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= +github.com/peterbourgon/diskv v2.0.1+incompatible/go.mod h1:uqqh8zWWbv1HBMNONnaR/tNboyR3/BZd58JJSHlUSCU= +github.com/pierrec/lz4 v2.0.5+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY= +github.com/pierrec/lz4 v2.2.6+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY= +github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= +github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pmezard/go-difflib v0.0.0-20151028094244-d8ed2627bdf0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI= +github.com/posener/complete v1.2.3/go.mod h1:WZIdtGGp+qx0sLrYKtIRAruyNpv6hFCicSgv7Sy7s/s= +github.com/pquerna/cachecontrol v0.0.0-20180517163645-1555304b9b35/go.mod h1:prYjPmNq4d1NPVmpShWobRqXY3q7Vp+80DqgxxUrUIA= +github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= +github.com/prometheus/client_golang v0.9.2/go.mod h1:OsXs2jCmiKlQ1lTBmv21f2mNfw4xf/QclQDMrYNZzcM= +github.com/prometheus/client_golang v0.9.3/go.mod h1:/TN21ttK/J9q6uSwhBd54HahCDft0ttaMvbicHlPoso= +github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo= +github.com/prometheus/client_golang v1.1.0/go.mod h1:I1FGZT9+L76gKKOs5djB6ezCbFQP1xR9D75/vuwEF3g= +github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= +github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +github.com/prometheus/common v0.0.0-20181113130724-41aa239b4cce/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= +github.com/prometheus/common v0.0.0-20181126121408-4724e9255275/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= +github.com/prometheus/common v0.4.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= +github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= +github.com/prometheus/common v0.6.0/go.mod h1:eBmuwkDJBwy6iBfxCBob6t6dR6ENT/y+J+Zk0j9GMYc= +github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= +github.com/prometheus/procfs v0.0.0-20181204211112-1dc9a6cbc91a/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= +github.com/prometheus/procfs v0.0.0-20190507164030-5867b95ac084/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= +github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= +github.com/prometheus/procfs v0.0.3/go.mod h1:4A/X28fw3Fc593LaREMrKMqOKvUAntwMDaekg4FpcdQ= +github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU= +github.com/rboyer/safeio v0.2.1/go.mod h1:Cq/cEPK+YXFn622lsQ0K4KsPZSPtaptHHEldsy7Fmig= +github.com/renier/xmlrpc v0.0.0-20170708154548-ce4a1a486c03/go.mod h1:gRAiPF5C5Nd0eyyRdqIu9qTiFSoZzpTq727b5B8fkkU= +github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg= +github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= +github.com/rs/zerolog v1.4.0/go.mod h1:YbFCdg8HfsridGWAh22vktObvhZbQsZXe4/zB0OKkWU= +github.com/russross/blackfriday v1.5.2 h1:HyvC0ARfnZBqnXwABFeSZHpKvJHJJfPz81GNueLj0oo= +github.com/russross/blackfriday v1.5.2/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g= +github.com/russross/blackfriday/v2 v2.0.1 h1:lPqVAte+HuHNfhJ/0LC98ESWRz8afy9tM/0RK8m9o+Q= +github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= +github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= +github.com/ryanuber/columnize v2.1.0+incompatible/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= +github.com/ryanuber/go-glob v1.0.0/go.mod h1:807d1WSdnB0XRJzKNil9Om6lcp/3a0v4qIHxIXzX/Yc= +github.com/satori/go.uuid v1.2.0/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0= +github.com/satori/go.uuid v1.2.1-0.20181028125025-b2ce2384e17b h1:gQZ0qzfKHQIybLANtM3mBXNUtOfsCFXeTsnBqCsx1KM= +github.com/satori/go.uuid v1.2.1-0.20181028125025-b2ce2384e17b/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0= +github.com/sean-/conswriter v0.0.0-20180208195008-f5ae3917a627/go.mod h1:7zjs06qF79/FKAJpBvFx3P8Ww4UTIMAe+lpNXDHziac= +github.com/sean-/pager v0.0.0-20180208200047-666be9bf53b5/go.mod h1:BeybITEsBEg6qbIiqJ6/Bqeq25bCLbL7YFmpaFfJDuM= +github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc= +github.com/shirou/gopsutil v0.0.0-20181107111621-48177ef5f880/go.mod h1:5b4v6he4MtMOwMlS0TUMTu2PcXUg8+E1lC7eC3UO/RA= +github.com/shirou/gopsutil v2.19.9+incompatible/go.mod h1:5b4v6he4MtMOwMlS0TUMTu2PcXUg8+E1lC7eC3UO/RA= +github.com/shirou/w32 v0.0.0-20160930032740-bb4de0191aa4/go.mod h1:qsXQc7+bwAM3Q1u/4XEfrquwF8Lw7D7y5cD8CuHnfIc= +github.com/shopspring/decimal v0.0.0-20180709203117-cd690d0c9e24/go.mod h1:M+9NzErvs504Cn4c5DxATwIqPbtswREoFCre64PpcG4= +github.com/shurcooL/sanitized_anchor_name v1.0.0 h1:PdmoCO6wvbs+7yrJyMORt4/BmY5IYyJwS/kOiWx8mHo= +github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= +github.com/sirupsen/logrus v1.0.6/go.mod h1:pMByvHTf9Beacp5x1UXfOR9xyW/9antXMhjMPG0dEzc= +github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= +github.com/sirupsen/logrus v1.4.1/go.mod h1:ni0Sbl8bgC9z8RoU9G6nDWqqs/fq4eDPysMBDgk/93Q= +github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= +github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= +github.com/smartystreets/goconvey v0.0.0-20190330032615-68dc04aab96a/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= +github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= +github.com/softlayer/softlayer-go v0.0.0-20180806151055-260589d94c7d/go.mod h1:Cw4GTlQccdRGSEf6KiMju767x0NEHE0YIVPJSaXjlsw= +github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM= +github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= +github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ= +github.com/spf13/afero v1.2.1/go.mod h1:9ZxEEn6pIJ8Rxe320qSDBk6AsU0r9pR7Q4OcevTdifk= +github.com/spf13/afero v1.2.2/go.mod h1:9ZxEEn6pIJ8Rxe320qSDBk6AsU0r9pR7Q4OcevTdifk= +github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= +github.com/spf13/cobra v0.0.5/go.mod h1:3K3wKZymM7VvHMDS9+Akkh4K60UwM26emMESw8tLCHU= +github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo= +github.com/spf13/pflag v0.0.0-20170130214245-9ff6c6923cff/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= +github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= +github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= +github.com/spf13/viper v1.3.2/go.mod h1:ZiWeW+zYFKm7srdB9IoDzzZXaJaI5eL9QjNiN/DMA2s= +github.com/spf13/viper v1.4.0/go.mod h1:PTJ7Z/lr49W6bUbkmS1V3by4uWynFiR9p7+dSq/yZzE= +github.com/spf13/viper v1.7.0/go.mod h1:8WkrPz2fc9jxqZNCJI/76HCieCp4Q8HaLFoCha5qpdg= +github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE= +github.com/stretchr/testify v0.0.0-20151208002404-e3a8ff8ce365/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= +github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= +github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= +github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= +github.com/stretchr/testify v1.5.1 h1:nOGnQDM7FYENwehXlg/kFVnos3rEvtKTjRvOWSzb6H4= +github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= +github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw= +github.com/tebeka/strftime v0.1.3/go.mod h1:7wJm3dZlpr4l/oVK0t1HYIc4rMzQ2XJlOMIUJUJH6XQ= +github.com/tencentcloud/tencentcloud-sdk-go v3.0.83+incompatible/go.mod h1:0PfYow01SHPMhKY31xa+EFz2RStxIqj6JFAJS+IkCi4= +github.com/tent/http-link-go v0.0.0-20130702225549-ac974c61c2f9/go.mod h1:RHkNRtSLfOK7qBTHaeSX1D6BNpI3qw7NTxsmNr4RvN8= +github.com/tevid/gohamcrest v1.1.1/go.mod h1:3UvtWlqm8j5JbwYZh80D/PVBt0mJ1eJiYgZMibh0H/k= +github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= +github.com/toolkits/concurrent v0.0.0-20150624120057-a4371d70e3e3/go.mod h1:QDlpd3qS71vYtakd2hmdpqhJ9nwv6mD6A30bQ1BPBFE= +github.com/tv42/httpunix v0.0.0-20150427012821-b75d8614f926/go.mod h1:9ESjWnEqriFuLhtthL60Sar/7RFoluCcXsuvEwTV5KM= +github.com/ugorji/go v1.1.4/go.mod h1:uQMGLiO92mf5W77hV/PUCpI3pbzQx3CRekS0kk+RGrc= +github.com/ugorji/go/codec v0.0.0-20181204163529-d75b2dcb6bc8/go.mod h1:VFNgLljTbGfSG7qAOspJ7OScBnGdDN/yBr0sguwnwf0= +github.com/urfave/cli v1.22.4 h1:u7tSpNPPswAFymm8IehJhy4uJMlUuU/GmqSkvJ1InXA= +github.com/urfave/cli v1.22.4/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= +github.com/vmware/govmomi v0.18.0/go.mod h1:URlwyTFZX72RmxtxuaFL2Uj3fD1JTvZdx59bHWk6aFU= +github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU= +github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q= +github.com/zouyx/agollo/v3 v3.4.4/go.mod h1:ag0XmE1r4iAgPd6PUnU9TJ0DMEjM1VKX1HUNqQJ2ywU= +go.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= +go.etcd.io/bbolt v1.3.4/go.mod h1:G5EMThwa9y8QZGBClrRx5EY+Yw9kAhnjy3bSjsnlVTQ= +go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= +go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= +go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= +go.uber.org/atomic v1.6.0 h1:Ezj3JGmsOnG1MoRWQkPBsKLe9DwWD9QeXzTRzzldNVk= +go.uber.org/atomic v1.6.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= +go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= +go.uber.org/multierr v1.5.0 h1:KCa4XfM8CWFCpxXRGok+Q0SS/0XBhMDbHHGABQLvD2A= +go.uber.org/multierr v1.5.0/go.mod h1:FeouvMocqHpRaaGuG9EjoKcStLC43Zu/fmqdUMPcKYU= +go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee h1:0mgffUl7nfd+FpvXMVz4IDEaUSmT1ysygQC7qYo7sG4= +go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee/go.mod h1:vJERXedbb3MVM5f9Ejo0C68/HhF8uaILCdgjnY+goOA= +go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= +go.uber.org/zap v1.15.0 h1:ZZCA22JRF2gQE5FoNmhmrf7jeJJ2uhqDUNRYKm8dvmM= +go.uber.org/zap v1.15.0/go.mod h1:Mb2vm2krFEG5DV0W9qcHBYFtp/Wku1cvYaqPsS/WYfc= +golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/crypto v0.0.0-20181029021203-45a5f77698d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/crypto v0.0.0-20181203042331-505ab145d0a9/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/crypto v0.0.0-20190211182817-74369b46fc67/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20190611184440-5c40567a22f8/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20190923035154-9ee001bba392/go.mod h1:/lpIB1dKB+9EgE3H3cr1v9wB50oz8l4C4h62xy7jSTY= +golang.org/x/crypto v0.0.0-20191206172530-e9b2fee46413/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20200220183623-bac4c82f6975/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= +golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= +golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= +golang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek= +golang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY= +golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= +golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= +golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= +golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= +golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= +golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20190409202823-959b441ac422/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20190909230951-414d861bb4ac/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20190930215403-16217165b5de h1:5hukYrvBGR8/eNkX5mdUezrA6JiaEZDtJb9Ei+1LlBs= +golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE= +golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o= +golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= +golang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY= +golang.org/x/net v0.0.0-20170114055629-f2499483f923/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20181023162649-9b4f9f5ad519/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20181201002055-351d144fa1fc/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20181220203305-927f97764cc3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190522155817-f3200d17e092/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= +golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= +golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190923162816-aa69164e4478/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20191004110552-13f9640d40b9/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= +golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sys v0.0.0-20170830134202-bb24a47a89ea/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20181026203630-95b1ffbd15a5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20181107165924-66b7b1311ac8/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20181205085412-a5c9d58dba9a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190129075346-302c3dd5f1cc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190209173611-3b5209105503/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190403152447-81d4e9dc473e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190508220229-2d0786266e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190515120540-06a5c4944438/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190523142557-0e01d883c5c5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190801041406-cbf593c0f2f3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190813064441-fde4db37ae7a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190922100055-0a153f010e69/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190924154521-2837fb4f24fe/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191008105621-543471e840be/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200124204421-9fbb57f87de9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/text v0.0.0-20160726164857-2910a502d2bf/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.1-0.20181227161524-e6919f6577db/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= +golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= +golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20181011042414-1f849cf54d09/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20181030221726-6c7e314b6563/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= +golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= +golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= +golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= +golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20190907020128-2ca718005c18/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191029041327-9cc4af7d6b2c/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191029190741-b9c20aec41a5/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191112195655-aa38f8e97acc h1:NCy3Ohtk6Iny5V/reW2Ktypo4zIpWBdRJ1uFMjBxdg8= +golang.org/x/tools v0.0.0-20191112195655-aa38f8e97acc/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= +google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M= +google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= +google.golang.org/api v0.9.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= +google.golang.org/api v0.13.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= +google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= +google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= +google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= +google.golang.org/appengine v1.6.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= +google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= +google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= +google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190404172233-64821d5d2107/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190530194941-fb225487d101/go.mod h1:z3L6/3dTEVtUr6QSP8miRzeRqwQOioJ9I66odjN4I7s= +google.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= +google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= +google.golang.org/genproto v0.0.0-20190911173649-1774047e7e51/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8= +google.golang.org/genproto v0.0.0-20191108220845-16a3f7862a1a/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/grpc v1.14.0/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw= +google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= +google.golang.org/grpc v1.19.1/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= +google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= +google.golang.org/grpc v1.21.0/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= +google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= +google.golang.org/grpc v1.22.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= +google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= +gopkg.in/airbrake/gobrake.v2 v2.0.9/go.mod h1:/h5ZAUhDkGaJfjzjKLSjv6zCL6O0LLBxU4K+aSYdM/U= +gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= +gopkg.in/asn1-ber.v1 v1.0.0-20181015200546-f715ec2f112d/go.mod h1:cuepJuh7vyXfUyUwEgHQXw849cJrilpS5NeIjOWESAw= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15 h1:YR8cESwS4TdDjEe65xsg0ogRM/Nc3DYOhEAlW+xobZo= +gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= +gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= +gopkg.in/gemnasium/logrus-airbrake-hook.v2 v2.1.2/go.mod h1:Xk6kEKp8OKb+X14hQBKWaSkCsqBpgog8nAV2xsGOxlo= +gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= +gopkg.in/ini.v1 v1.42.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= +gopkg.in/ini.v1 v1.51.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= +gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo= +gopkg.in/square/go-jose.v2 v2.3.1/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI= +gopkg.in/square/go-jose.v2 v2.4.1/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI= +gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= +gopkg.in/yaml.v2 v2.0.0-20170812160011-eb3733d160e7/go.mod h1:JAlM8MvJe8wmxCU4Bli9HhUf9+ttbYbLASfIpnQbh74= +gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.8 h1:obN1ZagJSUGI0Ek/LBmuj4SNLPfIny3KsKFopxRdj10= +gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.1-2019.2.3 h1:3JgtbtFHMiCmsznwGVTUWbgGov+pVqnlf1dEJTNAXeM= +honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= +istio.io/gogo-genproto v0.0.0-20190124151557-6d926a6e6feb/go.mod h1:eIDJ6jNk/IeJz6ODSksHl5Aiczy5JUq6vFhJWI5OtiI= +k8s.io/api v0.16.9/go.mod h1:Y7dZNHs1Xy0mSwSlzL9QShi6qkljnN41yR8oWCRTDe8= +k8s.io/apimachinery v0.16.9/go.mod h1:Xk2vD2TRRpuWYLQNM6lT9R7DSFZUYG03SarNkbGrnKE= +k8s.io/client-go v0.16.9/go.mod h1:ThjPlh7Kx+XoBFOCt775vx5J7atwY7F/zaFzTco5gL0= +k8s.io/gengo v0.0.0-20190128074634-0689ccc1d7d6/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0= +k8s.io/klog v0.0.0-20181102134211-b9b56d5dfc92/go.mod h1:Gq+BEi5rUBO/HRz0bTSXDUcqjScdoY3a9IHpCEIOOfk= +k8s.io/klog v0.3.0/go.mod h1:Gq+BEi5rUBO/HRz0bTSXDUcqjScdoY3a9IHpCEIOOfk= +k8s.io/klog v1.0.0/go.mod h1:4Bi6QPql/J/LkTDqv7R/cd3hPo4k2DG6Ptcz060Ez5I= +k8s.io/kube-openapi v0.0.0-20190816220812-743ec37842bf/go.mod h1:1TqjTSzOxsLGIKfj0lK8EeCP7K1iUG65v09OM0/WG5E= +k8s.io/kube-openapi v0.0.0-20191107075043-30be4d16710a/go.mod h1:1TqjTSzOxsLGIKfj0lK8EeCP7K1iUG65v09OM0/WG5E= +k8s.io/utils v0.0.0-20190801114015-581e00157fb1/go.mod h1:sZAwmy6armz5eXlNoLmJcl4F1QuKu7sr+mFQ0byX7Ew= +launchpad.net/gocheck v0.0.0-20140225173054-000000000087/go.mod h1:hj7XX3B/0A+80Vse0e+BUHsHMTEhd0O4cpUHr/e/BUM= +rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= +sigs.k8s.io/structured-merge-diff v0.0.0-20190525122527-15d366b2352e/go.mod h1:wWxsB5ozmmv/SG7nM11ayaAW51xMvak/t1r0CSlcokI= +sigs.k8s.io/yaml v1.1.0/go.mod h1:UJmg0vDUVViEyp3mgSv9WPwZCDxu4rQW1olrI1uml+o= From 24cc06af0dee426bc94de9008d8a9005d4b62744 Mon Sep 17 00:00:00 2001 From: tiecheng Date: Sat, 10 Oct 2020 22:31:29 +0800 Subject: [PATCH 131/227] timeout filter --- pkg/common/constant/key.go | 1 + pkg/filter/filter.go | 9 +++++++++ pkg/filter/timeout/timeout.go | 31 +++++++++++++++++++++++++++++++ 3 files changed, 41 insertions(+) create mode 100644 pkg/filter/filter.go create mode 100644 pkg/filter/timeout/timeout.go diff --git a/pkg/common/constant/key.go b/pkg/common/constant/key.go index 48a163142..3cd2c914a 100644 --- a/pkg/common/constant/key.go +++ b/pkg/common/constant/key.go @@ -23,6 +23,7 @@ const ( HttpApiFilter = "dgp.filters.http.api" HttpDomainFilter = "dgp.filters.http.domain" HttpTransferDubboFilter = "dgp.filters.http_transfer_dubbo" + TimeoutFilter = "dgp.filters.timeout" LoggerFilter = "dgp.filters.logger" RecoveryFilter = "dgp.filters.recovery" diff --git a/pkg/filter/filter.go b/pkg/filter/filter.go new file mode 100644 index 000000000..45b07b53d --- /dev/null +++ b/pkg/filter/filter.go @@ -0,0 +1,9 @@ +package filter + +import "github.com/dubbogo/dubbo-go-proxy/pkg/context" + +// Filter filter interface. +type Filter interface { + // Run do filter, next() to next filter, before is pre logic, after is post logic. + Run() context.FilterFunc +} diff --git a/pkg/filter/timeout/timeout.go b/pkg/filter/timeout/timeout.go new file mode 100644 index 000000000..7c66bfe16 --- /dev/null +++ b/pkg/filter/timeout/timeout.go @@ -0,0 +1,31 @@ +package timeout + +import ( + "github.com/dubbogo/dubbo-go-proxy/pkg/common/constant" + "github.com/dubbogo/dubbo-go-proxy/pkg/common/extension" + "github.com/dubbogo/dubbo-go-proxy/pkg/context" + "time" +) + +func init() { + extension.SetFilterFunc(constant.TimeoutFilter, NewTimeoutFilter().Run()) +} + +// timeoutFilter is a filter for control request time out. +type timeoutFilter struct { + waitTime time.Duration +} + +// NewTimeoutFilter create filter. +func NewTimeoutFilter() *timeoutFilter { + return &timeoutFilter{ + waitTime: time.Minute, + } +} + +// DoFilter do filter. +func (f *timeoutFilter) Run() context.FilterFunc { + return func(c context.Context) { + + } +} From 2ff8a6df50882c8451d2426d016bb082d119f9a1 Mon Sep 17 00:00:00 2001 From: zhangshen023 <1292369127@qq.com> Date: Mon, 12 Oct 2020 08:17:46 +0800 Subject: [PATCH 132/227] pull api from registry --- go.mod | 1 + go.sum | 98 +++++++++++++++++++++- pkg/registry_load/consul_registry.go | 121 +++++++++++++++++++++++++++ pkg/registry_load/registry_load.go | 23 +++++ pkg/registry_load/util.go | 1 + 5 files changed, 241 insertions(+), 3 deletions(-) create mode 100644 pkg/registry_load/consul_registry.go create mode 100644 pkg/registry_load/registry_load.go create mode 100644 pkg/registry_load/util.go diff --git a/go.mod b/go.mod index c4a449479..bbb6360cb 100644 --- a/go.mod +++ b/go.mod @@ -12,4 +12,5 @@ require ( github.com/urfave/cli v1.22.4 go.uber.org/zap v1.15.0 gopkg.in/yaml.v2 v2.2.8 + github.com/hashicorp/consul/api v1.5.0 ) diff --git a/go.sum b/go.sum index dc272d645..251410f41 100644 --- a/go.sum +++ b/go.sum @@ -34,8 +34,10 @@ github.com/BurntSushi/toml v0.3.1 h1:WXkYYl6Yr3qBf1K79EBnL4mak0OimBfB0XUf9Vl28OQ github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= github.com/DataDog/datadog-go v2.2.0+incompatible/go.mod h1:LButxg5PwREeZtORoXG3tL4fMGNddJ+vMq1mwgfaqoQ= +github.com/DataDog/datadog-go v3.2.0+incompatible h1:qSG2N4FghB1He/r2mFrWKCaL7dXCilEuNEeAn20fdD4= github.com/DataDog/datadog-go v3.2.0+incompatible/go.mod h1:LButxg5PwREeZtORoXG3tL4fMGNddJ+vMq1mwgfaqoQ= github.com/Microsoft/go-winio v0.4.3/go.mod h1:VhR8bwka0BXejwEJY73c50VrPtXAaKcyvVC4A4RozmA= +github.com/Microsoft/go-winio v0.4.13 h1:Hmi80lzZuI/CaYmlJp/b+FjZdRZhKu9c2mDVqKlLWVs= github.com/Microsoft/go-winio v0.4.13/go.mod h1:qXqCSQ3Xa7+6tgxaGTIe4Kpcdsi+P8jBhyzoq1bpyYA= github.com/NYTimes/gziphandler v0.0.0-20170623195520-56545f4a5d46/go.mod h1:3wb06e3pkSAbeQ52E9H9iFoQsEEwGN64994WTCIhntQ= github.com/NYTimes/gziphandler v1.0.1/go.mod h1:3wb06e3pkSAbeQ52E9H9iFoQsEEwGN64994WTCIhntQ= @@ -58,23 +60,32 @@ github.com/apache/dubbo-go v1.5.1 h1:hYktTWnMJdzwY0NkvSqJfOERkwFApZ3mH/tQBLVGO34 github.com/apache/dubbo-go v1.5.1/go.mod h1:lxwgtF+27mSFQsSrBLaVbdQpwCp+pBN/mHP4w4/N2Qc= github.com/apache/dubbo-go-hessian2 v1.6.2 h1:i7F5GjVaUatLQz1x9vUmmSIFj49L8J6rVICdF6xw4qw= github.com/apache/dubbo-go-hessian2 v1.6.2/go.mod h1:7rEw9guWABQa6Aqb8HeZcsYPHsOS7XT1qtJvkmI6c5w= +github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e h1:QEF07wC0T1rKkctt1RINW/+RMTVmiwxETico2l3gxJA= github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o= github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8= github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY= github.com/armon/go-metrics v0.0.0-20190430140413-ec5e00d3c878/go.mod h1:3AMJUQhVx52RsWOnlkpikZr01T/yAVN2gn0861vByNg= +github.com/armon/go-metrics v0.3.0 h1:B7AQgHi8QSEi4uHu7Sbsga+IJDU+CENgjxoo81vDUqU= github.com/armon/go-metrics v0.3.0/go.mod h1:zXjbSimjXTd7vOpY8B0/2LpvNvDoXBuplAD+gJD3GYs= github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= +github.com/armon/go-radix v1.0.0 h1:F4z6KzEeeQIMeLFa97iZU6vupzoecKdU5TX24SNppXI= github.com/armon/go-radix v1.0.0/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= +github.com/aws/aws-sdk-go v1.25.41 h1:/hj7nZ0586wFqpwjNpzWiUTwtaMgxAZNZKHay80MdXw= github.com/aws/aws-sdk-go v1.25.41/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= +github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= +github.com/bgentry/speakeasy v0.1.0 h1:ByYyxL9InA1OWqxJqqp2A5pYHUrCiAL6K3J+LKSsQkY= github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= github.com/bketelsen/crypt v0.0.3-0.20200106085610-5cbc8cc4026c/go.mod h1:MKsuJmJgSg28kpZDP6UIiPt0e0Oz0kqKNGyRaWEPv84= +github.com/boltdb/bolt v1.3.1 h1:JQmyP4ZBrce+ZQu0dY660FMfatumYDLun9hBCUVIkF4= github.com/boltdb/bolt v1.3.1/go.mod h1:clJnj/oiGkjum5o1McbSZDSLxVThjynRyGBgiAx27Ps= github.com/buger/jsonparser v0.0.0-20181115193947-bf1c66bbce23/go.mod h1:bbYlZJ7hK1yFx9hf58LP0zeX7UjIGs20ufpu3evjr+s= github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= +github.com/circonus-labs/circonus-gometrics v2.3.1+incompatible h1:C29Ae4G5GtYyYMm1aztcyj/J5ckgJm2zwdDajFbx1NY= github.com/circonus-labs/circonus-gometrics v2.3.1+incompatible/go.mod h1:nmEj6Dob7S7YxXgwXpfOuvO54S+tGdZdw9fuRZt25Ag= +github.com/circonus-labs/circonusllhist v0.1.3 h1:TJH+oke8D16535+jHExHj4nQvzlZrj7ug5D7I/orNUA= github.com/circonus-labs/circonusllhist v0.1.3/go.mod h1:kMXHVDlOchFAehlya5ePtbp5jckzBHf4XRpQvBOLI+I= github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= github.com/cockroachdb/apd v1.1.0/go.mod h1:8Sl8LxpKi29FqWXR16WEFZRNSz3SoPzUzeMeY4+DwBQ= @@ -84,6 +95,7 @@ github.com/coreos/bbolt v1.3.3/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkE github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= github.com/coreos/etcd v3.3.13+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= github.com/coreos/go-etcd v2.0.0+incompatible/go.mod h1:Jez6KQU2B/sWsbdaef3ED8NzMklzPG4d5KIOhIy30Tk= +github.com/coreos/go-oidc v2.1.0+incompatible h1:sdJrfw8akMnCuUlaZU3tE/uYXFgfqom8DBE9so9EBsM= github.com/coreos/go-oidc v2.1.0+incompatible/go.mod h1:CgnwVTmzoESiwO9qyAFEMiHoZ1nMCKZlZ9V6mm3/LKc= github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= @@ -108,6 +120,7 @@ github.com/digitalocean/godo v1.10.0/go.mod h1:h6faOIcZ8lWIwNQ+DN7b3CgX4Kwby5T+n github.com/dimchansky/utfbom v1.1.0/go.mod h1:rO41eb7gLfo8SF1jd9F8HplJm1Fewwi4mQvIirEdv+8= github.com/dnaeon/go-vcr v1.0.1/go.mod h1:aBB1+wY4s93YsC3HHjMBMrwTj2R9FHDzUr9KyGc8n1E= github.com/docker/go-connections v0.3.0/go.mod h1:Gbd7IOopHjR8Iph03tsViu4nIes5XhDvyHbTtUxmeec= +github.com/docker/go-connections v0.4.0 h1:El9xVISelRB7BuFusrZozjnkIM5YnzCViNKohAFqRJQ= github.com/docker/go-connections v0.4.0/go.mod h1:Gbd7IOopHjR8Iph03tsViu4nIes5XhDvyHbTtUxmeec= github.com/docker/spdystream v0.0.0-20160310174837-449fdfce4d96/go.mod h1:Qh8CwZgvJUkLughtfhJv5dyTYa91l1fOUCrgjqmcifM= github.com/dubbogo/go-zookeeper v1.0.1 h1:irLzvOsDOTNsN8Sv9tvYYxVu6DCQfLtziZQtUHmZgz8= @@ -128,13 +141,13 @@ github.com/envoyproxy/protoc-gen-validate v0.0.14/go.mod h1:iSmxcyjqTsJpI2R4NaDN github.com/evanphx/json-patch v4.2.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= github.com/fastly/go-utils v0.0.0-20180712184237-d95a45783239/go.mod h1:Gdwt2ce0yfBxPvZrHkprdPPTTS3N5rwmLE8T22KBXlw= github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= +github.com/fatih/color v1.9.0 h1:8xPHl4/q1VyqGIPif1F+1V3Y3lSmrq01EabUW3CoW5s= github.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL+zU= github.com/fatih/structs v1.1.0/go.mod h1:9NiDSp5zOcgEDl+j00MP/WkGVPOlPRLejGD8Ga6PJ7M= +github.com/frankban/quicktest v1.4.1 h1:Wv2VwvNn73pAdFIVUQRXYDFp31lXKbqblIXo/Q5GPSg= github.com/frankban/quicktest v1.4.1/go.mod h1:36zfPVQyHxymz4cH7wlDmVwDrJuljRB60qkgn7rorfQ= github.com/fsnotify/fsnotify v1.4.7 h1:IXs+QLmnXW2CcXuY+8Mzv/fWEsPGWxqefPtCP5CnV9I= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= -github.com/fsnotify/fsnotify v1.4.9 h1:hsms1Qyu0jgnwNXIxa+/V/PDsU6CfLf6CNO8H7IWoS4= -github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= github.com/ghodss/yaml v0.0.0-20150909031657-73d445a93680/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= github.com/ghodss/yaml v1.0.1-0.20190212211648-25d852aebe32 h1:Mn26/9ZMNWSw9C9ERFA1PUxfmGpolnw2v0bKOREu5ew= @@ -158,14 +171,17 @@ github.com/go-redis/redis v6.15.5+incompatible/go.mod h1:NAIEuMOZ/fxfXJIrKDQDz8w github.com/go-resty/resty/v2 v2.1.0/go.mod h1:dZGr0i9PLlaaTD4H/hoZIDjQ+r6xq8mgbRzHZf7f2J8= github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= github.com/go-test/deep v1.0.2-0.20181118220953-042da051cf31/go.mod h1:wGDj63lr65AM2AQyKZd/NYHGb0R+1RLqB8NKt3aSFNA= +github.com/go-test/deep v1.0.2 h1:onZX1rnHT3Wv6cqNgYyFOOlgVKJrksuCMCRvJStbMYw= github.com/go-test/deep v1.0.2/go.mod h1:wGDj63lr65AM2AQyKZd/NYHGb0R+1RLqB8NKt3aSFNA= github.com/gogo/googleapis v1.1.0/go.mod h1:gf4bu3Q80BeJ6H1S1vYPm8/ELATdvryBaNFGgqEef3s= github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4= +github.com/gogo/protobuf v1.2.2-0.20190723190241-65acae22fc9d h1:3PaI8p3seN09VjbTYC/QWlUZdZ1qS1zGjy7LH2Wt07I= github.com/gogo/protobuf v1.2.2-0.20190723190241-65acae22fc9d/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= github.com/goinggo/mapstructure v0.0.0-20140717182941-194205d9b4a9 h1:wqckanyE9qc/XnvnybC6SHOb8Nyd62QXAZOzA8twFig= github.com/goinggo/mapstructure v0.0.0-20140717182941-194205d9b4a9/go.mod h1:64ikIrMv84B+raz7akXOqbF7cK3/OQQ/6cClY10oy7A= github.com/goji/httpauth v0.0.0-20160601135302-2da839ab0f4d/go.mod h1:nnjvkQ9ptGaCkuDUx6wNykzzlUixGxvkme+H/lnzb+A= +github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b h1:VKtxabqXZkF25pY9ekfRL6a582T4P37/31XEstQ5p58= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= github.com/golang/groupcache v0.0.0-20160516000752-02826c3e7903/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20190129154638-5b532d6fd5ef/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= @@ -177,27 +193,33 @@ github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFU github.com/golang/protobuf v0.0.0-20161109072736-4bd1920723d7/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.2 h1:6nsPYzhq5kReh6QImI3k5qWzO4PEbvbIW2cwSfR/6xs= github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/snappy v0.0.1 h1:Qgr9rKW7uDUkrbSmQeiDsGa8SjGyCOGtuasMWwvp2P4= github.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= +github.com/google/btree v1.0.0 h1:0udJVsspx3VBr5FwtLhQQtuAsVc79tTq0ocGIPAU6qo= github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= +github.com/google/go-cmp v0.3.1 h1:Xye71clBPdm5HgqGwUkwhbynsUJZhDbS20FvLhQ2izg= github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= github.com/google/go-querystring v0.0.0-20170111101155-53e6ce116135/go.mod h1:odCYkC5MyYFN7vkCjXpyrEuKhc/BUO6wN/zVPAxq5ck= github.com/google/go-querystring v1.0.0/go.mod h1:odCYkC5MyYFN7vkCjXpyrEuKhc/BUO6wN/zVPAxq5ck= github.com/google/gofuzz v0.0.0-20161122191042-44d81051d367/go.mod h1:HP5RmnzzSNb993RKQDq4+1A4ia9nllfqcQFTQJedwGI= +github.com/google/gofuzz v1.0.0 h1:A8PeW59pxE9IoFRqBp37U+mSNaQoZ46F1f0f863XSXw= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= +github.com/google/tcpproxy v0.0.0-20180808230851-dfa16c61dad2 h1:AtvtonGEH/fZK0XPNNBdB6swgy7Iudfx88wzyIpwqJ8= github.com/google/tcpproxy v0.0.0-20180808230851-dfa16c61dad2/go.mod h1:DavVbd41y+b7ukKDmlnPR4nGYmkWXR6vHUkjQNiHPBs= github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= github.com/googleapis/gnostic v0.0.0-20170729233727-0c5108395e2d/go.mod h1:sJBsCZ4ayReDTBIg8b9dl28c5xFWyhBTVRp3pOg5EKY= +github.com/googleapis/gnostic v0.2.0 h1:l6N3VoaVzTncYYW+9yOz2LJJammFZGBO13sqgEhpy9g= github.com/googleapis/gnostic v0.2.0/go.mod h1:sJBsCZ4ayReDTBIg8b9dl28c5xFWyhBTVRp3pOg5EKY= github.com/gophercloud/gophercloud v0.1.0/go.mod h1:vxM41WHh5uqHVBMZHzuwNOHh8XEoIEcSTewFxm1c5g8= github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1 h1:EGx4pi6eqNxGaHF6qqu48+N2wcFQ5qg5FXgOdqsJ5d8= @@ -212,76 +234,105 @@ github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgf github.com/grpc-ecosystem/grpc-gateway v1.9.0/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= github.com/grpc-ecosystem/grpc-gateway v1.9.5/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= github.com/grpc-ecosystem/grpc-opentracing v0.0.0-20180507213350-8e809c8a8645/go.mod h1:6iZfnjpejD4L/4DwD7NryNaJyCQdzwWwH2MWhCA90Kw= +github.com/hashicorp/consul v1.8.0 h1:yRKMKZyPLqUxl37t4nFt5OuGmTXoFhTJrakhfnYKCYA= github.com/hashicorp/consul v1.8.0/go.mod h1:Gg9/UgAQ9rdY3CTvzQZ6g2jcIb7NlIfjI+0pvLk5D1A= github.com/hashicorp/consul/api v1.1.0/go.mod h1:VmuI/Lkw1nC05EYQWNKwWGbkg+FbDBtguAZLlVdkD9Q= +github.com/hashicorp/consul/api v1.5.0 h1:Yo2bneoGy68A7aNwmuETFnPhjyBEm7n3vzRacEVMjvI= github.com/hashicorp/consul/api v1.5.0/go.mod h1:LqwrLNW876eYSuUOo4ZLHBcdKc038txr/IMfbLPATa4= github.com/hashicorp/consul/sdk v0.1.1/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyNV1vwHyQBF0x8= +github.com/hashicorp/consul/sdk v0.5.0 h1:WC4594Wp/LkEeML/OdQKEC1yqBmEYkRp6i7X5u0zDAs= github.com/hashicorp/consul/sdk v0.5.0/go.mod h1:fY08Y9z5SvJqevyZNy6WWPXiG3KwBPAvlcdx16zZ0fM= +github.com/hashicorp/errwrap v1.0.0 h1:hLrqtEDnRye3+sgx6z4qVLNuviH3MR5aQ0ykNJa/UYA= github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= +github.com/hashicorp/go-bexpr v0.1.2 h1:ijMXI4qERbzxbCnkxmfUtwMyjrrk3y+Vt0MxojNCbBs= github.com/hashicorp/go-bexpr v0.1.2/go.mod h1:ANbpTX1oAql27TZkKVeW8p1w8NTdnyzPe/0qqPCKohU= github.com/hashicorp/go-checkpoint v0.0.0-20171009173528-1545e56e46de/go.mod h1:xIwEieBHERyEvaeKF/TcHh1Hu+lxPM+n2vT1+g9I4m4= github.com/hashicorp/go-cleanhttp v0.5.0/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= +github.com/hashicorp/go-cleanhttp v0.5.1 h1:dH3aiDG9Jvb5r5+bYHsikaOUIpcM0xvgMXVoDkXMzJM= github.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= +github.com/hashicorp/go-connlimit v0.2.0 h1:OZjcfNxH/hPh/bT2Iw5yOJcLzz+zuIWpsp3I1S4Pjw4= github.com/hashicorp/go-connlimit v0.2.0/go.mod h1:OUj9FGL1tPIhl/2RCfzYHrIiWj+VVPGNyVPnUX8AqS0= github.com/hashicorp/go-discover v0.0.0-20200501174627-ad1e96bde088/go.mod h1:vZu6Opqf49xX5lsFAu7iFNewkcVF1sn/wyapZh5ytlg= github.com/hashicorp/go-hclog v0.0.0-20180709165350-ff2cf002a8dd/go.mod h1:9bjs9uLqI8l75knNv3lV1kA55veR+WUPSiKIWcQHudI= github.com/hashicorp/go-hclog v0.8.0/go.mod h1:5CU+agLiy3J7N7QjHK5d05KxGsuXiQLrjA0H7acj2lQ= github.com/hashicorp/go-hclog v0.9.1/go.mod h1:5CU+agLiy3J7N7QjHK5d05KxGsuXiQLrjA0H7acj2lQ= github.com/hashicorp/go-hclog v0.9.2/go.mod h1:5CU+agLiy3J7N7QjHK5d05KxGsuXiQLrjA0H7acj2lQ= +github.com/hashicorp/go-hclog v0.12.0 h1:d4QkX8FRTYaKaCZBoXYY8zJX2BXjWxurN/GA2tkrmZM= github.com/hashicorp/go-hclog v0.12.0/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ= github.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= +github.com/hashicorp/go-immutable-radix v1.1.0 h1:vN9wG1D6KG6YHRTWr8512cxGOVgTMEfgEdSj/hr8MPc= github.com/hashicorp/go-immutable-radix v1.1.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= +github.com/hashicorp/go-memdb v1.0.3 h1:iiqzNk8jKB6/sLRj623Ui/Vi1zf21LOUpgzGjTge6a8= github.com/hashicorp/go-memdb v1.0.3/go.mod h1:LWQ8R70vPrS4OEY9k28D2z8/Zzyu34NVzeRibGAzHO0= github.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM= +github.com/hashicorp/go-msgpack v0.5.5 h1:i9R9JSrqIz0QVLz3sz+i3YJdT7TTSLcfLLzJi9aZTuI= github.com/hashicorp/go-msgpack v0.5.5/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM= github.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk= +github.com/hashicorp/go-multierror v1.1.0 h1:B9UzwGQJehnUY1yNrnwREHc3fGbC2xefo8g4TbElacI= github.com/hashicorp/go-multierror v1.1.0/go.mod h1:spPvp8C1qA32ftKqdAHm4hHTbPw+vmowP0z+KUhOZdA= github.com/hashicorp/go-plugin v1.0.1/go.mod h1:++UyYGoz3o5w9ZzAdZxtQKrWWP+iqPBn3cQptSMzBuY= github.com/hashicorp/go-raftchunking v0.6.1/go.mod h1:cGlg3JtDy7qy6c/3Bu660Mic1JF+7lWqIwCFSb08fX0= +github.com/hashicorp/go-raftchunking v0.6.3-0.20191002164813-7e9e8525653a h1:FmnBDwGwlTgugDGbVxwV8UavqSMACbGrUpfc98yFLR4= github.com/hashicorp/go-raftchunking v0.6.3-0.20191002164813-7e9e8525653a/go.mod h1:xbXnmKqX9/+RhPkJ4zrEx4738HacP72aaUPlT2RZ4sU= github.com/hashicorp/go-retryablehttp v0.5.3/go.mod h1:9B5zBasrRhHXnJnui7y6sL7es7NDiJgTc6Er0maI1Xs= github.com/hashicorp/go-retryablehttp v0.5.4/go.mod h1:9B5zBasrRhHXnJnui7y6sL7es7NDiJgTc6Er0maI1Xs= +github.com/hashicorp/go-retryablehttp v0.6.2 h1:bHM2aVXwBtBJWxHtkSrWuI4umABCUczs52eiUS9nSiw= github.com/hashicorp/go-retryablehttp v0.6.2/go.mod h1:gEx6HMUGxYYhJScX7W1Il64m6cc2C1mDaW3NQ9sY1FY= github.com/hashicorp/go-rootcerts v1.0.0/go.mod h1:K6zTfqpRlCUIjkwsN4Z+hiSfzSTQa6eBIzfwKfwNnHU= github.com/hashicorp/go-rootcerts v1.0.1/go.mod h1:pqUvnprVnM5bf7AOirdbb01K4ccR319Vf4pU3K5EGc8= +github.com/hashicorp/go-rootcerts v1.0.2 h1:jzhAVGtqPKbwpyCPELlgNWhE1znq+qwJtW5Oi2viEzc= github.com/hashicorp/go-rootcerts v1.0.2/go.mod h1:pqUvnprVnM5bf7AOirdbb01K4ccR319Vf4pU3K5EGc8= github.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU= +github.com/hashicorp/go-sockaddr v1.0.2 h1:ztczhD1jLxIRjVejw8gFomI1BQZOe2WoVOu0SyteCQc= github.com/hashicorp/go-sockaddr v1.0.2/go.mod h1:rB4wwRAUzs07qva3c5SdrY/NEtAUjGlgmH/UkBUC97A= +github.com/hashicorp/go-syslog v1.0.0 h1:KaodqZuhUoZereWVIYmpUgZysurB1kBLX2j0MwMrUAE= github.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4= github.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= github.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= github.com/hashicorp/go-uuid v1.0.2-0.20191001231223-f32f5fe8d6a8/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= +github.com/hashicorp/go-uuid v1.0.2 h1:cfejS+Tpcp13yd5nYHWDI6qVCny6wyX2Mt5SGur2IGE= github.com/hashicorp/go-uuid v1.0.2/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= github.com/hashicorp/go-version v1.1.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= +github.com/hashicorp/go-version v1.2.0 h1:3vNe/fWF5CBgRIguda1meWhsZHy3m8gCJ5wx+dIzX/E= github.com/hashicorp/go-version v1.2.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= github.com/hashicorp/go.net v0.0.1/go.mod h1:hjKkEWcCURg++eb33jQU7oqQcI9XDCnUzHA0oac0k90= github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= +github.com/hashicorp/golang-lru v0.5.3 h1:YPkqC67at8FYaadspW/6uE0COsBxS2656RLEr8Bppgk= github.com/hashicorp/golang-lru v0.5.3/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4= github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= +github.com/hashicorp/hil v0.0.0-20160711231837-1e86c6b523c5 h1:uk280DXEbQiCOZgCOI3elFSeNxf8YIZiNsbr2pQLYD0= github.com/hashicorp/hil v0.0.0-20160711231837-1e86c6b523c5/go.mod h1:KHvg/R2/dPtaePb16oW4qIyzkMxXOL38xjRN64adsts= github.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64= github.com/hashicorp/mdns v1.0.0/go.mod h1:tL+uN++7HEJ6SQLQ2/p+z2pH24WQKWjBPkE0mNTz8vQ= github.com/hashicorp/mdns v1.0.1/go.mod h1:4gW7WsVCke5TE7EPeYliwHlRUyBtfCwuFwuMg2DmyNY= github.com/hashicorp/memberlist v0.1.3/go.mod h1:ajVTdAv/9Im8oMAAj5G31PhhMCZJV2pPBoIllUwCN7I= github.com/hashicorp/memberlist v0.2.0/go.mod h1:MS2lj3INKhZjWNqd3N0m3J+Jxf3DAOnAH9VT3Sh9MUE= +github.com/hashicorp/memberlist v0.2.2 h1:5+RffWKwqJ71YPu9mWsF7ZOscZmwfasdA8kbdC7AO2g= github.com/hashicorp/memberlist v0.2.2/go.mod h1:MS2lj3INKhZjWNqd3N0m3J+Jxf3DAOnAH9VT3Sh9MUE= +github.com/hashicorp/net-rpc-msgpackrpc v0.0.0-20151116020338-a14192a58a69 h1:lc3c72qGlIMDqQpQH82Y4vaglRMMFdJbziYWriR4UcE= github.com/hashicorp/net-rpc-msgpackrpc v0.0.0-20151116020338-a14192a58a69/go.mod h1:/z+jUGRBlwVpUZfjute9jWaF6/HuhjuFQuL1YXzVD1Q= github.com/hashicorp/raft v1.1.1/go.mod h1:vPAJM8Asw6u8LxC3eJCUZmRP/E4QmUGE1R7g7k8sG/8= github.com/hashicorp/raft v1.1.2-0.20191002163536-9c6bd3e3eb17/go.mod h1:vPAJM8Asw6u8LxC3eJCUZmRP/E4QmUGE1R7g7k8sG/8= +github.com/hashicorp/raft v1.1.2 h1:oxEL5DDeurYxLd3UbcY/hccgSPhLLpiBZ1YxtWEq59c= github.com/hashicorp/raft v1.1.2/go.mod h1:vPAJM8Asw6u8LxC3eJCUZmRP/E4QmUGE1R7g7k8sG/8= +github.com/hashicorp/raft-boltdb v0.0.0-20171010151810-6e5ba93211ea h1:xykPFhrBAS2J0VBzVa5e80b5ZtYuNQtgXjN40qBZlD4= github.com/hashicorp/raft-boltdb v0.0.0-20171010151810-6e5ba93211ea/go.mod h1:pNv7Wc3ycL6F5oOWn+tPGo2gWD4a5X+yp/ntwdKLjRk= github.com/hashicorp/serf v0.8.2/go.mod h1:6hOLApaqBFA1NXqRQAsxw9QxuDEvNxSQRwA/JwenrHc= github.com/hashicorp/serf v0.9.0/go.mod h1:YL0HO+FifKOW2u1ke99DGVu1zhcpZzNwrLIqBC7vbYU= +github.com/hashicorp/serf v0.9.2 h1:yJoyfZXo4Pk2p/M/viW+YLibBFiIbKoP79gu7kDAFP0= github.com/hashicorp/serf v0.9.2/go.mod h1:UWDWwZeL5cuWDJdl0C6wrvrUwEqtQ4ZKBKKENpqIUyk= github.com/hashicorp/vault/api v1.0.4/go.mod h1:gDcqh3WGcR1cpF5AJz/B1UFheUEneMoIospckxBxk6Q= +github.com/hashicorp/vault/api v1.0.5-0.20191108163347-bdd38fca2cff h1:cl94LQIrs/mNbh3ny1R8lM1gtYcUBa7HnGtOCi35SlQ= github.com/hashicorp/vault/api v1.0.5-0.20191108163347-bdd38fca2cff/go.mod h1:Uf8LaHyrYsgVgHzO2tMZKhqRGlL3UJ6XaSwW2EA1Iqo= github.com/hashicorp/vault/sdk v0.1.13/go.mod h1:B+hVj7TpuQY1Y/GPbCpffmgd+tSEwvhkWnjtSYCaS2M= github.com/hashicorp/vault/sdk v0.1.14-0.20191108161836-82f2b5571044/go.mod h1:PcekaFGiPJyHnFy+NZhP6ll650zEw51Ag7g/YEa+EOU= +github.com/hashicorp/vault/sdk v0.1.14-0.20191112033314-390e96e22eb2 h1:mKYi4Fm2uSfe94Ji89CoAaP7SPEEkfdtaUlgRGGb2go= github.com/hashicorp/vault/sdk v0.1.14-0.20191112033314-390e96e22eb2/go.mod h1:PcekaFGiPJyHnFy+NZhP6ll650zEw51Ag7g/YEa+EOU= github.com/hashicorp/vic v1.5.1-0.20190403131502-bbfe86ec9443/go.mod h1:bEpDU35nTu0ey1EXjwNwPjI9xErAsoOCmcMb9GKvyxo= github.com/hashicorp/yamux v0.0.0-20180604194846-3520598351bb/go.mod h1:+NfK9FKeTrX5uv1uIXGdwYDTeHna2qgaIlx54MXqjAM= +github.com/hashicorp/yamux v0.0.0-20181012175058-2f1d1f20f75d h1:kJCB4vdITiW1eC1vq2e6IsrXKrZit1bv/TDYFGMp4BQ= github.com/hashicorp/yamux v0.0.0-20181012175058-2f1d1f20f75d/go.mod h1:+NfK9FKeTrX5uv1uIXGdwYDTeHna2qgaIlx54MXqjAM= github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= github.com/imdario/mergo v0.3.5/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= @@ -293,6 +344,7 @@ github.com/jarcoal/httpmock v0.0.0-20180424175123-9c70cfe4a1da/go.mod h1:ks+b9de github.com/jehiah/go-strftime v0.0.0-20171201141054-1d33003b3869/go.mod h1:cJ6Cj7dQo+O6GJNiMx+Pa94qKj+TG8ONdKHgMNIyyag= github.com/jinzhu/copier v0.0.0-20190625015134-976e0346caa8 h1:mGIXW/lubQ4B+3bXTLxcTMTjUNDqoF6T/HUW9LbFx9s= github.com/jinzhu/copier v0.0.0-20190625015134-976e0346caa8/go.mod h1:yL958EeXv8Ylng6IfnvG4oflryUi3vgA3xPs9hmII1s= +github.com/jmespath/go-jmespath v0.0.0-20180206201540-c2b33e8439af h1:pmfjZENx5imkbgOkpRUYLnmbU7UEFbjtDA2hxJ1ichM= github.com/jmespath/go-jmespath v0.0.0-20180206201540-c2b33e8439af/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k= github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo= github.com/joyent/triton-go v0.0.0-20180628001255-830d2b111e62/go.mod h1:U+RSyWxWd04xTqnuOQxnai7XGS2PrPY2cfGoDKtMHjA= @@ -300,6 +352,7 @@ github.com/joyent/triton-go v1.7.1-0.20200416154420-6801d15b779f/go.mod h1:KDSfL github.com/json-iterator/go v0.0.0-20180612202835-f2b4162afba3/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= github.com/json-iterator/go v1.1.5/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= +github.com/json-iterator/go v1.1.7 h1:KfgG9LzI+pYjr4xvmz/5H4FXjokeP+rlHLhv3iH62Fo= github.com/json-iterator/go v1.1.7/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= github.com/jtolds/gls v4.20.0+incompatible h1:xdiiI2gbIgH/gLH7ADydsJ1uDOEzR8yvV7C0MuV77Wo= @@ -328,41 +381,53 @@ github.com/magiconair/properties v1.8.1/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czP github.com/mailru/easyjson v0.0.0-20160728113105-d5b7844b561a/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= github.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= +github.com/mattn/go-colorable v0.1.6 h1:6Su7aK7lXmJ/U79bYtBjLNaha4Fs1Rg9plHpcH+vvnE= github.com/mattn/go-colorable v0.1.6/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= github.com/mattn/go-isatty v0.0.10/go.mod h1:qgIWMr58cqv1PHHyhnkY9lrL7etaEgOFcMEpPG5Rm84= github.com/mattn/go-isatty v0.0.11/go.mod h1:PhnuNfih5lzO57/f3n+odYbM4JtupLOxQOAqxQCu2WE= +github.com/mattn/go-isatty v0.0.12 h1:wuysRhFDzyxgEmMf5xjvJ2M9dZoWAXNNr5LSBS7uHXY= github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= github.com/mattn/go-runewidth v0.0.3/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= +github.com/matttproud/golang_protobuf_extensions v1.0.1 h1:4hp9jkHxhMHkqkrB3Ix0jegS5sx/RkqARlsWZ6pIwiU= github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= +github.com/miekg/dns v1.1.26 h1:gPxPSwALAeHJSjarOs00QjVdV9QoBvc1D2ujQUr5BzU= github.com/miekg/dns v1.1.26/go.mod h1:bPDLeHnStXmXAq1m/Ch/hvfNHr14JKNPMBo3VZKjuso= github.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc= +github.com/mitchellh/cli v1.1.0 h1:tEElEatulEHDeedTxwckzyYMA5c86fbmNIUL1hBIiTg= github.com/mitchellh/cli v1.1.0/go.mod h1:xcISNoH86gajksDmfB23e/pu+B+GeFRMYmoHXxx3xhI= +github.com/mitchellh/copystructure v1.0.0 h1:Laisrj+bAB6b/yJwB5Bt3ITZhGJdqmxquMKeZ+mmkFQ= github.com/mitchellh/copystructure v1.0.0/go.mod h1:SNtv71yrdKgLRyLFxmLdkAbkKEFWgYaq1OVrnRcwhnw= github.com/mitchellh/go-homedir v1.0.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= +github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y= github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= github.com/mitchellh/go-testing-interface v0.0.0-20171004221916-a61a99592b77/go.mod h1:kRemZodwjscx+RGhAo8eIhFbs2+BFgRtFPeD/KE+zxI= github.com/mitchellh/go-testing-interface v1.0.0/go.mod h1:kRemZodwjscx+RGhAo8eIhFbs2+BFgRtFPeD/KE+zxI= +github.com/mitchellh/go-testing-interface v1.14.0 h1:/x0XQ6h+3U3nAyk1yx+bHPURrKa9sVVvYbuqZ7pIAtI= github.com/mitchellh/go-testing-interface v1.14.0/go.mod h1:gfgS7OtZj6MA4U1UrDRp04twqAjfvlZyCfX3sDjEym8= github.com/mitchellh/go-wordwrap v1.0.0/go.mod h1:ZXFpozHsX6DPmq2I0TCekCxypsnAUbP2oI0UX1GXzOo= github.com/mitchellh/gox v0.4.0/go.mod h1:Sd9lOJ0+aimLBi73mGofS1ycjY8lL3uZM3JPS42BGNg= github.com/mitchellh/hashstructure v0.0.0-20170609045927-2bca23e0e452/go.mod h1:QjSHrPWS+BGUVBYkbTZWEnOh3G1DutKwClXU/ABz6AQ= +github.com/mitchellh/hashstructure v1.0.0 h1:ZkRJX1CyOoTkar7p/mLS5TZU4nJ1Rn/F8u9dGS02Q3Y= github.com/mitchellh/hashstructure v1.0.0/go.mod h1:QjSHrPWS+BGUVBYkbTZWEnOh3G1DutKwClXU/ABz6AQ= github.com/mitchellh/iochan v1.0.0/go.mod h1:JwYml1nuB7xOzsp52dPpHFffvOCDupsG0QubkSMEySY= github.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= github.com/mitchellh/mapstructure v1.2.3 h1:f/MjBEBDLttYCGfRaKBbKSRVF5aV2O6fnBpzknuE3jU= github.com/mitchellh/mapstructure v1.2.3/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= +github.com/mitchellh/pointerstructure v1.0.0 h1:ATSdz4NWrmWPOF1CeCBU4sMCno2hgqdbSrRPFWQSVZI= github.com/mitchellh/pointerstructure v1.0.0/go.mod h1:k4XwG94++jLVsSiTxo7qdIfXA9pj9EAeo0QsNNJOLZ8= github.com/mitchellh/reflectwalk v1.0.0/go.mod h1:mSTlrgnPZtwu0c4WaC2kGObEpuNDbx0jmZXqmk4esnw= +github.com/mitchellh/reflectwalk v1.0.1 h1:FVzMWA5RllMAKIdUSC8mdWo3XtwoecrH79BY70sEEpE= github.com/mitchellh/reflectwalk v1.0.1/go.mod h1:mSTlrgnPZtwu0c4WaC2kGObEpuNDbx0jmZXqmk4esnw= github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/reflect2 v0.0.0-20180320133207-05fbef0ca5da/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= +github.com/modern-go/reflect2 v1.0.1 h1:9f412s+6RmYXLWZSEzVVgPGK7C2PphHj5RJrvfx9AWI= github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= github.com/munnerz/goautoneg v0.0.0-20120707110453-a547fc61f48d/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= @@ -383,12 +448,15 @@ github.com/opentracing/opentracing-go v1.1.0 h1:pWlfV3Bxv7k65HYwkikxat0+s3pV4bsq github.com/opentracing/opentracing-go v1.1.0/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= github.com/packethost/packngo v0.1.1-0.20180711074735-b9cb5096f54c/go.mod h1:otzZQXgoO96RTzDB/Hycg0qZcXZsWJGJRSXbmEIJ+4M= github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= +github.com/pascaldekloe/goe v0.1.0 h1:cBOtyMzM9HTpWjXfbbunk26uA6nG3a8n06Wieeh0MwY= github.com/pascaldekloe/goe v0.1.0/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= +github.com/patrickmn/go-cache v2.1.0+incompatible h1:HRMgzkcYKYpi3C8ajMPV8OFXaaRUnok+kx1WdO15EQc= github.com/patrickmn/go-cache v2.1.0+incompatible/go.mod h1:3Qf8kWWT7OJRJbdiICTKqZju1ZixQ/KpMGzzAfe6+WQ= github.com/pelletier/go-toml v1.2.0 h1:T5zMGML61Wp+FlcbWjRDT7yAxhJNAiPPLOFECq181zc= github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= github.com/peterbourgon/diskv v2.0.1+incompatible/go.mod h1:uqqh8zWWbv1HBMNONnaR/tNboyR3/BZd58JJSHlUSCU= github.com/pierrec/lz4 v2.0.5+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY= +github.com/pierrec/lz4 v2.2.6+incompatible h1:6aCX4/YZ9v8q69hTyiR7dNLnTA3fgtKHVVW5BCd5Znw= github.com/pierrec/lz4 v2.2.6+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY= github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= @@ -398,24 +466,30 @@ github.com/pmezard/go-difflib v0.0.0-20151028094244-d8ed2627bdf0/go.mod h1:iKH77 github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI= +github.com/posener/complete v1.2.3 h1:NP0eAhjcjImqslEwo/1hq7gpajME0fTLTezBKDqfXqo= github.com/posener/complete v1.2.3/go.mod h1:WZIdtGGp+qx0sLrYKtIRAruyNpv6hFCicSgv7Sy7s/s= +github.com/pquerna/cachecontrol v0.0.0-20180517163645-1555304b9b35 h1:J9b7z+QKAmPf4YLrFg6oQUotqHQeUNWwkvo7jZp1GLU= github.com/pquerna/cachecontrol v0.0.0-20180517163645-1555304b9b35/go.mod h1:prYjPmNq4d1NPVmpShWobRqXY3q7Vp+80DqgxxUrUIA= github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= github.com/prometheus/client_golang v0.9.2/go.mod h1:OsXs2jCmiKlQ1lTBmv21f2mNfw4xf/QclQDMrYNZzcM= github.com/prometheus/client_golang v0.9.3/go.mod h1:/TN21ttK/J9q6uSwhBd54HahCDft0ttaMvbicHlPoso= github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo= +github.com/prometheus/client_golang v1.1.0 h1:BQ53HtBmfOitExawJ6LokA4x8ov/z0SYYb0+HxJfRI8= github.com/prometheus/client_golang v1.1.0/go.mod h1:I1FGZT9+L76gKKOs5djB6ezCbFQP1xR9D75/vuwEF3g= github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= +github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90 h1:S/YWwWx/RA8rT8tKFRuGUZhuA90OyIBpPCXkcbwU8DE= github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/common v0.0.0-20181113130724-41aa239b4cce/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= github.com/prometheus/common v0.0.0-20181126121408-4724e9255275/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= github.com/prometheus/common v0.4.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= +github.com/prometheus/common v0.6.0 h1:kRhiuYSXR3+uv2IbVbZhUxK5zVD/2pp3Gd2PpvPkpEo= github.com/prometheus/common v0.6.0/go.mod h1:eBmuwkDJBwy6iBfxCBob6t6dR6ENT/y+J+Zk0j9GMYc= github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= github.com/prometheus/procfs v0.0.0-20181204211112-1dc9a6cbc91a/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= github.com/prometheus/procfs v0.0.0-20190507164030-5867b95ac084/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= +github.com/prometheus/procfs v0.0.3 h1:CTwfnzjQ+8dS6MhHHu4YswVAD99sL2wjPqP+VkURmKE= github.com/prometheus/procfs v0.0.3/go.mod h1:4A/X28fw3Fc593LaREMrKMqOKvUAntwMDaekg4FpcdQ= github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU= github.com/rboyer/safeio v0.2.1/go.mod h1:Cq/cEPK+YXFn622lsQ0K4KsPZSPtaptHHEldsy7Fmig= @@ -429,12 +503,14 @@ github.com/russross/blackfriday/v2 v2.0.1 h1:lPqVAte+HuHNfhJ/0LC98ESWRz8afy9tM/0 github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= github.com/ryanuber/columnize v2.1.0+incompatible/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= +github.com/ryanuber/go-glob v1.0.0 h1:iQh3xXAumdQ+4Ufa5b25cRpC5TYKlno6hsv6Cb3pkBk= github.com/ryanuber/go-glob v1.0.0/go.mod h1:807d1WSdnB0XRJzKNil9Om6lcp/3a0v4qIHxIXzX/Yc= github.com/satori/go.uuid v1.2.0/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0= github.com/satori/go.uuid v1.2.1-0.20181028125025-b2ce2384e17b h1:gQZ0qzfKHQIybLANtM3mBXNUtOfsCFXeTsnBqCsx1KM= github.com/satori/go.uuid v1.2.1-0.20181028125025-b2ce2384e17b/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0= github.com/sean-/conswriter v0.0.0-20180208195008-f5ae3917a627/go.mod h1:7zjs06qF79/FKAJpBvFx3P8Ww4UTIMAe+lpNXDHziac= github.com/sean-/pager v0.0.0-20180208200047-666be9bf53b5/go.mod h1:BeybITEsBEg6qbIiqJ6/Bqeq25bCLbL7YFmpaFfJDuM= +github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529 h1:nn5Wsu0esKSJiIVhscUtVbo7ada43DJhG55ua/hjS5I= github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc= github.com/shirou/gopsutil v0.0.0-20181107111621-48177ef5f880/go.mod h1:5b4v6he4MtMOwMlS0TUMTu2PcXUg8+E1lC7eC3UO/RA= github.com/shirou/gopsutil v2.19.9+incompatible/go.mod h1:5b4v6he4MtMOwMlS0TUMTu2PcXUg8+E1lC7eC3UO/RA= @@ -490,6 +566,7 @@ github.com/tevid/gohamcrest v1.1.1 h1:ou+xSqlIw1xfGTg1uq1nif/htZ2S3EzRqLm2BP+tYU github.com/tevid/gohamcrest v1.1.1/go.mod h1:3UvtWlqm8j5JbwYZh80D/PVBt0mJ1eJiYgZMibh0H/k= github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= github.com/toolkits/concurrent v0.0.0-20150624120057-a4371d70e3e3/go.mod h1:QDlpd3qS71vYtakd2hmdpqhJ9nwv6mD6A30bQ1BPBFE= +github.com/tv42/httpunix v0.0.0-20150427012821-b75d8614f926 h1:G3dpKMzFDjgEh2q1Z7zUUtKa8ViPtH+ocF0bE0g00O8= github.com/tv42/httpunix v0.0.0-20150427012821-b75d8614f926/go.mod h1:9ESjWnEqriFuLhtthL60Sar/7RFoluCcXsuvEwTV5KM= github.com/ugorji/go v1.1.4/go.mod h1:uQMGLiO92mf5W77hV/PUCpI3pbzQx3CRekS0kk+RGrc= github.com/ugorji/go/codec v0.0.0-20181204163529-d75b2dcb6bc8/go.mod h1:VFNgLljTbGfSG7qAOspJ7OScBnGdDN/yBr0sguwnwf0= @@ -525,6 +602,7 @@ golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8U golang.org/x/crypto v0.0.0-20190611184440-5c40567a22f8/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190923035154-9ee001bba392/go.mod h1:/lpIB1dKB+9EgE3H3cr1v9wB50oz8l4C4h62xy7jSTY= golang.org/x/crypto v0.0.0-20191206172530-e9b2fee46413/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20200220183623-bac4c82f6975 h1:/Tl7pH94bvbAAHBdZJT947M/+gp0+CqQXDtMRC0fseo= golang.org/x/crypto v0.0.0-20200220183623-bac4c82f6975/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= @@ -566,15 +644,18 @@ golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLL golang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190923162816-aa69164e4478/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20191004110552-13f9640d40b9/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200226121028-0de0cce0169b h1:0mm1VjtFUOIlE1SbDlwjYaDxZVDP2S5ou6y0gSgXHu8= golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45 h1:SVwTIAaPC2U/AvvLNZ2a7OVsmBpC8L5BlwK1whH3hm0= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e h1:vcxGaoTs7kV8m5Np9uUNQin4BrLOthgV7252N8V+FwY= golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sys v0.0.0-20170830134202-bb24a47a89ea/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -604,7 +685,6 @@ golang.org/x/sys v0.0.0-20190801041406-cbf593c0f2f3/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20190813064441-fde4db37ae7a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190922100055-0a153f010e69/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190924154521-2837fb4f24fe/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191008105621-543471e840be/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -619,6 +699,7 @@ golang.org/x/text v0.3.1-0.20181227161524-e6919f6577db/go.mod h1:bEr9sfX3Q8Zfm5f golang.org/x/text v0.3.2 h1:tW2bmiBqwgJj/UpqtC8EpXEZVYOwU0yG4iWbprSVAcs= golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.0.0-20190308202827-9d24e82272b4 h1:SvFZT6jyqRaOeXpc5h/JSfZenJ2O330aBsf7JfSUXmQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= @@ -654,6 +735,7 @@ google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9Ywl google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/appengine v1.6.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= +google.golang.org/appengine v1.6.1 h1:QzqyMA1tlu6CgqCDUtU9V+ZKhLFT2dkJuANu5QaxI3I= google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= @@ -665,6 +747,7 @@ google.golang.org/genproto v0.0.0-20190530194941-fb225487d101/go.mod h1:z3L6/3dT google.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= google.golang.org/genproto v0.0.0-20190911173649-1774047e7e51/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8= +google.golang.org/genproto v0.0.0-20191108220845-16a3f7862a1a h1:Ob5/580gVHBJZgXnff1cZDbG+xLtMVE5mDRTe+nIsX4= google.golang.org/genproto v0.0.0-20191108220845-16a3f7862a1a/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= google.golang.org/grpc v1.14.0/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= @@ -673,6 +756,7 @@ google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiq google.golang.org/grpc v1.21.0/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= google.golang.org/grpc v1.22.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= +google.golang.org/grpc v1.23.0 h1:AzbTB6ux+okLTzP8Ru1Xs41C303zdcfEht7MQnYJt5A= google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= gopkg.in/airbrake/gobrake.v2 v2.0.9/go.mod h1:/h5ZAUhDkGaJfjzjKLSjv6zCL6O0LLBxU4K+aSYdM/U= gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= @@ -684,12 +768,14 @@ gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8 gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= gopkg.in/gemnasium/logrus-airbrake-hook.v2 v2.1.2/go.mod h1:Xk6kEKp8OKb+X14hQBKWaSkCsqBpgog8nAV2xsGOxlo= +gopkg.in/inf.v0 v0.9.1 h1:73M5CoZyi3ZLMOyDlQh031Cx6N9NDJ2Vvfl76EDAgDc= gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= gopkg.in/ini.v1 v1.42.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= gopkg.in/ini.v1 v1.51.0 h1:AQvPpx3LzTDM0AjnIRlVFwFFGC+npRopjZxLJj6gdno= gopkg.in/ini.v1 v1.51.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo= gopkg.in/square/go-jose.v2 v2.3.1/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI= +gopkg.in/square/go-jose.v2 v2.4.1 h1:H0TmLt7/KmzlrDOpa1F+zr0Tk90PbJYBfsVUmRLrf9Y= gopkg.in/square/go-jose.v2 v2.4.1/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= gopkg.in/yaml.v2 v2.0.0-20170812160011-eb3733d160e7/go.mod h1:JAlM8MvJe8wmxCU4Bli9HhUf9+ttbYbLASfIpnQbh74= @@ -705,17 +791,23 @@ honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWh honnef.co/go/tools v0.0.1-2019.2.3 h1:3JgtbtFHMiCmsznwGVTUWbgGov+pVqnlf1dEJTNAXeM= honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= istio.io/gogo-genproto v0.0.0-20190124151557-6d926a6e6feb/go.mod h1:eIDJ6jNk/IeJz6ODSksHl5Aiczy5JUq6vFhJWI5OtiI= +k8s.io/api v0.16.9 h1:3vCx0WX9qcg1Hv4aQ/G1tiIKectGVuimvPVTJU4VOCA= k8s.io/api v0.16.9/go.mod h1:Y7dZNHs1Xy0mSwSlzL9QShi6qkljnN41yR8oWCRTDe8= +k8s.io/apimachinery v0.16.9 h1:ESUZ4hMBUKF2kn2HBFL5zM/wQv4j/0uRbR7AjgqGJ4o= k8s.io/apimachinery v0.16.9/go.mod h1:Xk2vD2TRRpuWYLQNM6lT9R7DSFZUYG03SarNkbGrnKE= +k8s.io/client-go v0.16.9 h1:6Eh4lMDxFtDzBkqid1AOL3bQ/pPYrulx8l23DXw4mRU= k8s.io/client-go v0.16.9/go.mod h1:ThjPlh7Kx+XoBFOCt775vx5J7atwY7F/zaFzTco5gL0= k8s.io/gengo v0.0.0-20190128074634-0689ccc1d7d6/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0= k8s.io/klog v0.0.0-20181102134211-b9b56d5dfc92/go.mod h1:Gq+BEi5rUBO/HRz0bTSXDUcqjScdoY3a9IHpCEIOOfk= k8s.io/klog v0.3.0/go.mod h1:Gq+BEi5rUBO/HRz0bTSXDUcqjScdoY3a9IHpCEIOOfk= +k8s.io/klog v1.0.0 h1:Pt+yjF5aB1xDSVbau4VsWe+dQNzA0qv1LlXdC2dF6Q8= k8s.io/klog v1.0.0/go.mod h1:4Bi6QPql/J/LkTDqv7R/cd3hPo4k2DG6Ptcz060Ez5I= k8s.io/kube-openapi v0.0.0-20190816220812-743ec37842bf/go.mod h1:1TqjTSzOxsLGIKfj0lK8EeCP7K1iUG65v09OM0/WG5E= k8s.io/kube-openapi v0.0.0-20191107075043-30be4d16710a/go.mod h1:1TqjTSzOxsLGIKfj0lK8EeCP7K1iUG65v09OM0/WG5E= +k8s.io/utils v0.0.0-20190801114015-581e00157fb1 h1:+ySTxfHnfzZb9ys375PXNlLhkJPLKgHajBU0N62BDvE= k8s.io/utils v0.0.0-20190801114015-581e00157fb1/go.mod h1:sZAwmy6armz5eXlNoLmJcl4F1QuKu7sr+mFQ0byX7Ew= launchpad.net/gocheck v0.0.0-20140225173054-000000000087/go.mod h1:hj7XX3B/0A+80Vse0e+BUHsHMTEhd0O4cpUHr/e/BUM= rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= sigs.k8s.io/structured-merge-diff v0.0.0-20190525122527-15d366b2352e/go.mod h1:wWxsB5ozmmv/SG7nM11ayaAW51xMvak/t1r0CSlcokI= +sigs.k8s.io/yaml v1.1.0 h1:4A07+ZFc2wgJwo8YNlQpr1rVlgUDlxXHhPJciaPY5gs= sigs.k8s.io/yaml v1.1.0/go.mod h1:UJmg0vDUVViEyp3mgSv9WPwZCDxu4rQW1olrI1uml+o= diff --git a/pkg/registry_load/consul_registry.go b/pkg/registry_load/consul_registry.go new file mode 100644 index 000000000..8aa6dfd31 --- /dev/null +++ b/pkg/registry_load/consul_registry.go @@ -0,0 +1,121 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + */ +package registry_load + +import ( + "github.com/apache/dubbo-go/common/constant" + "github.com/dubbogo/dubbo-go-proxy/pkg/logger" + "net/url" + "strconv" + "strings" +) + +import ( + "github.com/apache/dubbo-go/common" +) + +import ( + consul "github.com/hashicorp/consul/api" + perrors "github.com/pkg/errors" +) + +func init() { + var _ RegistryLoad = new(ConsulRegistryLoad) +} + +const ( + dubbo_api_filter = "dubbo in Tags" +) + +type ConsulRegistryLoad struct { + Address string + // Consul client. + client *consul.Client +} + +func newConsulRegistryLoad(address string) (RegistryLoad, error) { + config := &consul.Config{Address: address} + client, err := consul.NewClient(config) + if err != nil { + return nil, err + } + + r := &ConsulRegistryLoad{ + Address: address, + client: client, + } + + return r, nil +} + +func (crl *ConsulRegistryLoad) transfer2Url(service consul.AgentService) (common.URL, error) { + var err error + + var params url.Values + + for _, tag := range service.Tags { + kv := strings.Split(tag, "=") + if len(kv) != 2 { + continue + } + params.Add(kv[0], kv[1]) + } + + url := common.NewURLWithOptions(common.WithPort(strconv.Itoa(service.Port)), + common.WithIp(service.Address), common.WithParams(params)) + + // tags + + // meta + meta := make(map[string]string, 8) + meta["url"] = url.String() + + // check + check := &consul.AgentServiceCheck{ + TCP: tcp, + Interval: url.GetParam("consul-check-interval", "10s"), + Timeout: url.GetParam("consul-check-timeout", "1s"), + DeregisterCriticalServiceAfter: url.GetParam("consul-deregister-critical-service-after", "20s"), + } + + service := &consul.AgentServiceRegistration{ + Name: url.Service(), + Tags: tags, + Meta: meta, + Check: check, + } + + return *url, nil +} + +func (crl *ConsulRegistryLoad) LoadAllApis() ([]common.URL, error) { + agentServices, err := crl.client.Agent().ServicesWithFilter(dubbo_api_filter) + if err != nil { + logger.Error("consul load all apis error:%v", err) + return nil, perrors.Wrap(err, "consul load all apis") + } + var urls []common.URL + for _, service := range agentServices { + url, err := crl.transfer2Url(*service) + if err != nil { + logger.Warnf("consul transfer service to url error:%v", err) + continue + } + urls = append(urls, url) + } + return urls, nil +} diff --git a/pkg/registry_load/registry_load.go b/pkg/registry_load/registry_load.go new file mode 100644 index 000000000..4c8159066 --- /dev/null +++ b/pkg/registry_load/registry_load.go @@ -0,0 +1,23 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + */ +package registry_load + +import "github.com/apache/dubbo-go/common" + +type RegistryLoad interface { + LoadAllApis() ([]common.URL, error) +} diff --git a/pkg/registry_load/util.go b/pkg/registry_load/util.go new file mode 100644 index 000000000..ea5a91af4 --- /dev/null +++ b/pkg/registry_load/util.go @@ -0,0 +1 @@ +package registry_load From cc6a1f1381ea4223efa0b467a8463615e90d4ad0 Mon Sep 17 00:00:00 2001 From: shen <1292369127@qq.com> Date: Mon, 12 Oct 2020 17:56:59 +0800 Subject: [PATCH 133/227] construct api --- go.mod | 2 +- pkg/registry_load/consul_registry.go | 35 +++++++--------------- pkg/registry_load/util.go | 43 ++++++++++++++++++++++++++++ 3 files changed, 54 insertions(+), 26 deletions(-) diff --git a/go.mod b/go.mod index bbb6360cb..0ca13b182 100644 --- a/go.mod +++ b/go.mod @@ -7,10 +7,10 @@ require ( github.com/emirpasic/gods v1.12.0 github.com/ghodss/yaml v1.0.1-0.20190212211648-25d852aebe32 github.com/goinggo/mapstructure v0.0.0-20140717182941-194205d9b4a9 + github.com/hashicorp/consul/api v1.5.0 github.com/pkg/errors v0.9.1 github.com/stretchr/testify v1.5.1 github.com/urfave/cli v1.22.4 go.uber.org/zap v1.15.0 gopkg.in/yaml.v2 v2.2.8 - github.com/hashicorp/consul/api v1.5.0 ) diff --git a/pkg/registry_load/consul_registry.go b/pkg/registry_load/consul_registry.go index 8aa6dfd31..635550b0e 100644 --- a/pkg/registry_load/consul_registry.go +++ b/pkg/registry_load/consul_registry.go @@ -17,13 +17,15 @@ package registry_load import ( - "github.com/apache/dubbo-go/common/constant" - "github.com/dubbogo/dubbo-go-proxy/pkg/logger" "net/url" "strconv" "strings" ) +import ( + "github.com/dubbogo/dubbo-go-proxy/pkg/logger" +) + import ( "github.com/apache/dubbo-go/common" ) @@ -63,9 +65,8 @@ func newConsulRegistryLoad(address string) (RegistryLoad, error) { } func (crl *ConsulRegistryLoad) transfer2Url(service consul.AgentService) (common.URL, error) { - var err error - var params url.Values + var protocol string for _, tag := range service.Tags { kv := strings.Split(tag, "=") @@ -75,29 +76,13 @@ func (crl *ConsulRegistryLoad) transfer2Url(service consul.AgentService) (common params.Add(kv[0], kv[1]) } - url := common.NewURLWithOptions(common.WithPort(strconv.Itoa(service.Port)), - common.WithIp(service.Address), common.WithParams(params)) - - // tags - - // meta - meta := make(map[string]string, 8) - meta["url"] = url.String() - - // check - check := &consul.AgentServiceCheck{ - TCP: tcp, - Interval: url.GetParam("consul-check-interval", "10s"), - Timeout: url.GetParam("consul-check-timeout", "1s"), - DeregisterCriticalServiceAfter: url.GetParam("consul-deregister-critical-service-after", "20s"), + if url, ok := service.Meta["url"]; ok { + protocol = strings.Split(url, ":")[0] } - service := &consul.AgentServiceRegistration{ - Name: url.Service(), - Tags: tags, - Meta: meta, - Check: check, - } + url := common.NewURLWithOptions(common.WithPort(strconv.Itoa(service.Port)), + common.WithProtocol(protocol), + common.WithIp(service.Address), common.WithParams(params)) return *url, nil } diff --git a/pkg/registry_load/util.go b/pkg/registry_load/util.go index ea5a91af4..c5310b133 100644 --- a/pkg/registry_load/util.go +++ b/pkg/registry_load/util.go @@ -1 +1,44 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + */ package registry_load + +import ( + "github.com/apache/dubbo-go/common" + "github.com/dubbogo/dubbo-go-proxy/pkg/client/dubbo" +) + +import ( + "github.com/dubbogo/dubbo-go-proxy/pkg/config" +) + +func TransferUrl2Api(url common.URL) config.IntegrationRequest { + return config.IntegrationRequest{ + RequestType: url.Protocol, + DubboMetadata: dubbo.DubboMetadata{ + ApplicationName: url.GetParam("name", ""), + Group: url.GetParam("group", ""), + Version: url.GetParam("Version", ""), + Interface: url.GetParam("Interface", ""), + Method: "", + Types: nil, + Retries: url.GetParam("Retries", ""), + ClusterName: "", + ProtocolTypeStr: "", + SerializationTypeStr: "", + }, + } +} From 8254ad5a2560cd385659817c71648a28416051f5 Mon Sep 17 00:00:00 2001 From: xiaoliu <18721825717@163.com> Date: Mon, 12 Oct 2020 22:44:04 +0800 Subject: [PATCH 134/227] 1. FIX import scope 2. FIX GetPprof comment --- cmd/proxy/proxy.go | 2 ++ configs/conf.yaml | 2 +- pkg/model/bootstrap.go | 2 +- pkg/proxy/proxy_start.go | 4 +--- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/cmd/proxy/proxy.go b/cmd/proxy/proxy.go index eb0e0a1af..5eeaee3ee 100644 --- a/cmd/proxy/proxy.go +++ b/cmd/proxy/proxy.go @@ -24,7 +24,9 @@ import ( ) import ( + _ "github.com/apache/dubbo-go/metadata/service/inmemory" "github.com/urfave/cli" + _ "net/http/pprof" ) // Version proxy version diff --git a/configs/conf.yaml b/configs/conf.yaml index 380b2e2a9..659c37df7 100644 --- a/configs/conf.yaml +++ b/configs/conf.yaml @@ -48,7 +48,7 @@ static_resources: lb_policy: "RoundRobin" connect_timeout: "5s" pprofConf: - enable: false + enable: true addr: "pprof" addresses: diff --git a/pkg/model/bootstrap.go b/pkg/model/bootstrap.go index 1265a6964..b1d5a61e1 100644 --- a/pkg/model/bootstrap.go +++ b/pkg/model/bootstrap.go @@ -30,7 +30,7 @@ func (bs *Bootstrap) GetListeners() []Listener { return bs.StaticResources.Listeners } -// GetListeners +// GetPprof func (bs *Bootstrap) GetPprof() PprofConf { return bs.StaticResources.PprofConf } diff --git a/pkg/proxy/proxy_start.go b/pkg/proxy/proxy_start.go index 62323a25c..9ad61dd9e 100644 --- a/pkg/proxy/proxy_start.go +++ b/pkg/proxy/proxy_start.go @@ -20,13 +20,11 @@ package proxy import ( "encoding/json" "net/http" - _ "net/http/pprof" "strconv" "sync" ) import ( - _ "github.com/apache/dubbo-go/metadata/service/inmemory" _ "github.com/apache/dubbo-go/metadata/service/remote" "github.com/dubbogo/dubbo-go-proxy/pkg/client/dubbo" "github.com/dubbogo/dubbo-go-proxy/pkg/common/constant" @@ -72,7 +70,7 @@ func (p *Proxy) Start() { if addr == address.Name { fullAddr := address.SocketAddress.Address + ":" + strconv.Itoa(address.SocketAddress.Port) go http.ListenAndServe(fullAddr, nil) - logger.Infof("[dubboproxy pprof] httpListener start by : %s", fullAddr) + logger.Infof("[dubboproxy go pprof] httpListener start by : %s", fullAddr) break } } From 74998cb7d88a9134d15be4735607ad9bafa69b69 Mon Sep 17 00:00:00 2001 From: zhangshen023 <1292369127@qq.com> Date: Mon, 12 Oct 2020 22:58:18 +0800 Subject: [PATCH 135/227] unit test --- pkg/registry_load/consul_registry.go | 12 ++++++--- pkg/registry_load/consul_registry_test.go | 26 ++++++++++++++++++ pkg/registry_load/registry_load.go | 5 +++- pkg/registry_load/util.go | 32 ++++++++++++----------- 4 files changed, 56 insertions(+), 19 deletions(-) create mode 100644 pkg/registry_load/consul_registry_test.go diff --git a/pkg/registry_load/consul_registry.go b/pkg/registry_load/consul_registry.go index 635550b0e..f6eb849af 100644 --- a/pkg/registry_load/consul_registry.go +++ b/pkg/registry_load/consul_registry.go @@ -46,10 +46,11 @@ const ( type ConsulRegistryLoad struct { Address string // Consul client. - client *consul.Client + client *consul.Client + cluster string } -func newConsulRegistryLoad(address string) (RegistryLoad, error) { +func newConsulRegistryLoad(address, cluster string) (RegistryLoad, error) { config := &consul.Config{Address: address} client, err := consul.NewClient(config) if err != nil { @@ -59,11 +60,16 @@ func newConsulRegistryLoad(address string) (RegistryLoad, error) { r := &ConsulRegistryLoad{ Address: address, client: client, + cluster: cluster, } return r, nil } +func (crl *ConsulRegistryLoad) GetCluster() (string, error) { + return crl.cluster, nil +} + func (crl *ConsulRegistryLoad) transfer2Url(service consul.AgentService) (common.URL, error) { var params url.Values var protocol string @@ -87,7 +93,7 @@ func (crl *ConsulRegistryLoad) transfer2Url(service consul.AgentService) (common return *url, nil } -func (crl *ConsulRegistryLoad) LoadAllApis() ([]common.URL, error) { +func (crl *ConsulRegistryLoad) LoadAllServices() ([]common.URL, error) { agentServices, err := crl.client.Agent().ServicesWithFilter(dubbo_api_filter) if err != nil { logger.Error("consul load all apis error:%v", err) diff --git a/pkg/registry_load/consul_registry_test.go b/pkg/registry_load/consul_registry_test.go new file mode 100644 index 000000000..9e3d04f30 --- /dev/null +++ b/pkg/registry_load/consul_registry_test.go @@ -0,0 +1,26 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + */ +package registry_load + +import "testing" + +func TestConsulRegistryLoad_GetCluster(t *testing.T) { + +} + +func TestConsulRegistryLoad_LoadAllServices(t *testing.T) { +} diff --git a/pkg/registry_load/registry_load.go b/pkg/registry_load/registry_load.go index 4c8159066..75d1476aa 100644 --- a/pkg/registry_load/registry_load.go +++ b/pkg/registry_load/registry_load.go @@ -18,6 +18,9 @@ package registry_load import "github.com/apache/dubbo-go/common" +// this interface defined for load services from different kinds registry, such as nacos,consul,zookeeper. type RegistryLoad interface { - LoadAllApis() ([]common.URL, error) + // load all services registered in registry + LoadAllServices() ([]common.URL, error) + GetCluster() (string, error) } diff --git a/pkg/registry_load/util.go b/pkg/registry_load/util.go index c5310b133..7d0e6a774 100644 --- a/pkg/registry_load/util.go +++ b/pkg/registry_load/util.go @@ -25,20 +25,22 @@ import ( "github.com/dubbogo/dubbo-go-proxy/pkg/config" ) -func TransferUrl2Api(url common.URL) config.IntegrationRequest { - return config.IntegrationRequest{ - RequestType: url.Protocol, - DubboMetadata: dubbo.DubboMetadata{ - ApplicationName: url.GetParam("name", ""), - Group: url.GetParam("group", ""), - Version: url.GetParam("Version", ""), - Interface: url.GetParam("Interface", ""), - Method: "", - Types: nil, - Retries: url.GetParam("Retries", ""), - ClusterName: "", - ProtocolTypeStr: "", - SerializationTypeStr: "", - }, +func TransferUrl2Api(url common.URL, clusterName string) []config.IntegrationRequest { + var irs []config.IntegrationRequest + for _, method := range url.Methods { + irs = append(irs, config.IntegrationRequest{ + RequestType: url.Protocol, + DubboMetadata: dubbo.DubboMetadata{ + ApplicationName: url.GetParam("name", ""), + Group: url.GetParam("group", ""), + Version: url.GetParam("version", ""), + Interface: url.GetParam("interface", ""), + Method: method, + Retries: url.GetParam("retries", ""), + ClusterName: clusterName, + ProtocolTypeStr: url.Protocol, + }, + }) } + return irs } From 56ed6b93a04661d13e19d2a5227effd1fa87d56d Mon Sep 17 00:00:00 2001 From: williamfeng323 Date: Tue, 13 Oct 2020 18:27:04 +0800 Subject: [PATCH 136/227] add listener.routeRequest method --- pkg/config/api_config.go | 18 ++++- pkg/config/mock/api_config.yml | 12 +-- pkg/context/context.go | 3 + pkg/context/http/context.go | 20 +++-- pkg/context/http/context_test.go | 10 +++ pkg/proxy/listener.go | 24 ++++++ pkg/proxy/listener_test.go | 96 +++++++++++++++++++++++ pkg/{service => router}/api.go | 2 +- pkg/router/route.go | 73 ++++++++++------- pkg/router/route_test.go | 78 +++++++++++------- pkg/service/api/discovery_service.go | 14 ++-- pkg/service/api/discovery_service_test.go | 28 +++---- pkg/service/discovery_service.go | 5 +- 13 files changed, 285 insertions(+), 98 deletions(-) create mode 100644 pkg/context/http/context_test.go create mode 100644 pkg/proxy/listener_test.go rename pkg/{service => router}/api.go (98%) diff --git a/pkg/config/api_config.go b/pkg/config/api_config.go index b3c69602e..c16cc69f5 100644 --- a/pkg/config/api_config.go +++ b/pkg/config/api_config.go @@ -22,7 +22,6 @@ import ( ) import ( - "github.com/dubbogo/dubbo-go-proxy/pkg/client/dubbo" "github.com/dubbogo/dubbo-go-proxy/pkg/common/yaml" "github.com/dubbogo/dubbo-go-proxy/pkg/logger" ) @@ -97,9 +96,9 @@ type BodyDefinition struct { // IntegrationRequest defines the backend request format and target type IntegrationRequest struct { - RequestType string `json:"requestType" yaml:"requestType"` // dubbo, TO-DO: http - MappingParams []MappingParam `json:"mappingParams,omitempty" yaml:"mappingParams,omitempty"` - dubbo.DubboMetadata `json:"dubboMetaData,inline,omitempty" yaml:"dubboMetaData,inline,omitempty"` + RequestType string `json:"requestType" yaml:"requestType"` // dubbo, TO-DO: http + MappingParams []MappingParam `json:"mappingParams,omitempty" yaml:"mappingParams,omitempty"` + DubboBackendConfig `json:"dubboBackendConfig,inline,omitempty" yaml:"dubboBackendConfig,inline,omitempty"` } // MappingParam defines the mapping rules of headers and queryStrings @@ -108,6 +107,17 @@ type MappingParam struct { MapTo string `json:"mapTo" yaml:"mapTo"` } +// DubboBackendConfig defines the basic dubbo backend config +type DubboBackendConfig struct { + ApplicationName string `yaml:"applicationName" json:"applicationName"` + Group string `yaml:"group" json:"group"` + Version string `yaml:"version" json:"version"` + Interface string `yaml:"interface" json:"interface"` + Method string `yaml:"method" json:"method" mapstructure:"method"` + ClusterName string `yaml:"clusterName" json:"clusterName,omitempty"` + ParamTypes []string `yaml:"paramTypes" json:"paramTypes"` +} + // Definition defines the complex json request body type Definition struct { Name string `json:"name" yaml:"name"` diff --git a/pkg/config/mock/api_config.yml b/pkg/config/mock/api_config.yml index ecdb51b28..2a02da232 100644 --- a/pkg/config/mock/api_config.yml +++ b/pkg/config/mock/api_config.yml @@ -69,10 +69,10 @@ resources: group: test version: 1.0.0 interface: com.ikurento.user.UserProvider - Method: GetUsers + method: GetUsers paramTypes: - java.lang.String - ClusterName: test_dubbo + clusterName: test_dubbo - httpVerb: POST filters: - filterA @@ -96,10 +96,10 @@ resources: group: test version: 1.0.0 interface: com.ikurento.user.UserProvider - Method: NewUser + method: NewUser paramTypes: - java.lang.String - ClusterName: test_dubbo + clusterName: test_dubbo resources: - path: '/:id' type: restful @@ -126,10 +126,10 @@ resources: group: test version: 1.0.0 interface: com.ikurento.user.UserProvider - Method: GetUser + method: GetUser paramTypes: - java.lang.String - ClusterName: test_dubbo + clusterName: test_dubbo definitions: - name: modelDefinition diff --git a/pkg/context/context.go b/pkg/context/context.go index 75a631e34..2fb3098f5 100644 --- a/pkg/context/context.go +++ b/pkg/context/context.go @@ -19,6 +19,7 @@ package context import ( "github.com/dubbogo/dubbo-go-proxy/pkg/model" + "github.com/dubbogo/dubbo-go-proxy/pkg/router" ) // Context run context @@ -39,6 +40,8 @@ type Context interface { BuildFilters() + API(router.API) + GetAPI() *router.API Api(api *model.Api) GetApi() *model.Api diff --git a/pkg/context/http/context.go b/pkg/context/http/context.go index b07564c9f..9202256f1 100644 --- a/pkg/context/http/context.go +++ b/pkg/context/http/context.go @@ -28,6 +28,7 @@ import ( "github.com/dubbogo/dubbo-go-proxy/pkg/common/extension" "github.com/dubbogo/dubbo-go-proxy/pkg/context" "github.com/dubbogo/dubbo-go-proxy/pkg/model" + "github.com/dubbogo/dubbo-go-proxy/pkg/router" ) // HttpContext http context @@ -36,7 +37,7 @@ type HttpContext struct { HttpConnectionManager model.HttpConnectionManager FilterChains []model.FilterChain Listener *model.Listener - api *model.Api + api router.API Request *http.Request writermem responseWriter @@ -107,12 +108,17 @@ func (hc *HttpContext) GetMethod() string { // Api func (hc *HttpContext) Api(api *model.Api) { + // hc.api = api +} + +// API sets the API to http context +func (hc *HttpContext) API(api router.API) { hc.api = api } -// GetApi get api -func (hc *HttpContext) GetApi() *model.Api { - return hc.api +// GetAPI get api +func (hc *HttpContext) GetAPI() *router.API { + return &hc.api } // WriteFail @@ -161,17 +167,17 @@ func (hc *HttpContext) doWrite(h map[string]string, code int, d interface{}) { // BuildFilters build filter, from config http_filters func (hc *HttpContext) BuildFilters() { - var ff []context.FilterFunc + var filterFuncs []context.FilterFunc if hc.HttpConnectionManager.HttpFilters == nil { return } for _, v := range hc.HttpConnectionManager.HttpFilters { - ff = append(ff, extension.GetMustFilterFunc(v.Name)) + filterFuncs = append(filterFuncs, extension.GetMustFilterFunc(v.Name)) } - hc.AppendFilterFunc(ff...) + hc.AppendFilterFunc(filterFuncs...) } // ResetWritermen reset writermen diff --git a/pkg/context/http/context_test.go b/pkg/context/http/context_test.go new file mode 100644 index 000000000..e447cecdb --- /dev/null +++ b/pkg/context/http/context_test.go @@ -0,0 +1,10 @@ +package http + +import ( + "testing" +) + +func TestBuildContext(t *testing.T) { + ctx := HttpContext{} + ctx.BuildFilters() +} diff --git a/pkg/proxy/listener.go b/pkg/proxy/listener.go index 47768f9dc..afee92981 100644 --- a/pkg/proxy/listener.go +++ b/pkg/proxy/listener.go @@ -28,10 +28,13 @@ import ( import ( "github.com/dubbogo/dubbo-go-proxy/pkg/common/constant" "github.com/dubbogo/dubbo-go-proxy/pkg/common/extension" + "github.com/dubbogo/dubbo-go-proxy/pkg/config" "github.com/dubbogo/dubbo-go-proxy/pkg/context" h "github.com/dubbogo/dubbo-go-proxy/pkg/context/http" "github.com/dubbogo/dubbo-go-proxy/pkg/logger" "github.com/dubbogo/dubbo-go-proxy/pkg/model" + "github.com/dubbogo/dubbo-go-proxy/pkg/router" + "github.com/pkg/errors" ) // ListenerService the facade of a listener @@ -132,6 +135,27 @@ func (s *DefaultHttpListener) ServeHTTP(w http.ResponseWriter, r *http.Request) s.pool.Put(hc) } +func (s *DefaultHttpListener) routeRequest(ctx *h.HttpContext, req *http.Request) (router.API, error) { + apiDiscSrv := extension.GetMustApiDiscoveryService(constant.LocalMemoryApiDiscoveryService) + api, err := apiDiscSrv.GetAPI(req.URL.Path, config.HTTPVerb(req.Method)) + if err != nil { + ctx.WriteWithStatus(http.StatusNotFound, constant.Default404Body) + ctx.AddHeader(constant.HeaderKeyContextType, constant.HeaderValueTextPlain) + e := errors.Errorf("Requested URL %s not found", req.URL.Path) + logger.Debug(e.Error()) + return router.API{}, e + } + if !api.Method.OnAir { + ctx.WriteWithStatus(http.StatusNotAcceptable, constant.Default406Body) + ctx.AddHeader(constant.HeaderKeyContextType, constant.HeaderValueTextPlain) + e := errors.Errorf("Requested API %s %s does not online", req.Method, req.URL.Path) + logger.Debug(e.Error()) + return router.API{}, e + } + ctx.API(api) + return api, nil +} + func (s *DefaultHttpListener) handleHTTPRequest(c *h.HttpContext) { if len(c.BaseContext.Filters) > 0 { c.Next() diff --git a/pkg/proxy/listener_test.go b/pkg/proxy/listener_test.go new file mode 100644 index 000000000..4883c1545 --- /dev/null +++ b/pkg/proxy/listener_test.go @@ -0,0 +1,96 @@ +package proxy + +import ( + "bytes" + "net/http" + "net/http/httptest" + "testing" +) + +import ( + "github.com/dubbogo/dubbo-go-proxy/pkg/common/constant" + "github.com/dubbogo/dubbo-go-proxy/pkg/common/extension" + "github.com/dubbogo/dubbo-go-proxy/pkg/config" + "github.com/dubbogo/dubbo-go-proxy/pkg/context" + ctxHttp "github.com/dubbogo/dubbo-go-proxy/pkg/context/http" + "github.com/dubbogo/dubbo-go-proxy/pkg/model" + "github.com/dubbogo/dubbo-go-proxy/pkg/router" + "github.com/stretchr/testify/assert" +) + +func getTestContext() *ctxHttp.HttpContext { + l := ListenerService{ + Listener: &model.Listener{ + Name: "test", + Address: model.Address{ + SocketAddress: model.SocketAddress{ + Protocol: model.HTTP, + Address: "0.0.0.0", + Port: 8888, + }, + }, + FilterChains: []model.FilterChain{}, + }, + } + + hc := &ctxHttp.HttpContext{ + Listener: l.Listener, + FilterChains: l.FilterChains, + HttpConnectionManager: l.findHttpManager(), + BaseContext: context.NewBaseContext(), + } + hc.ResetWritermen(httptest.NewRecorder()) + hc.Reset() + return hc +} + +func getMockAPI(verb config.HTTPVerb, urlPattern string) router.API { + inbound := config.InboundRequest{} + integration := config.IntegrationRequest{} + method := config.Method{ + OnAir: true, + HTTPVerb: verb, + InboundRequest: inbound, + IntegrationRequest: integration, + } + return router.API{ + URLPattern: urlPattern, + Method: method, + } +} +func TestRouteRequest(t *testing.T) { + mockAPI := getMockAPI(config.MethodPost, "/mock/test") + mockAPI.Method.OnAir = false + + apiDiscoverySrv := extension.GetMustApiDiscoveryService(constant.LocalMemoryApiDiscoveryService) + apiDiscoverySrv.AddAPI(mockAPI) + apiDiscoverySrv.AddAPI(getMockAPI(config.MethodGet, "/mock/test")) + + listener := NewDefaultHttpListener() + listener.pool.New = func() interface{} { + return getTestContext() + } + r := bytes.NewReader([]byte("test")) + + req, _ := http.NewRequest("GET", "/mock/test", r) + ctx := listener.pool.Get().(*ctxHttp.HttpContext) + api, err := listener.routeRequest(ctx, req) + assert.Nil(t, err) + assert.NotNil(t, api) + assert.Equal(t, api.URLPattern, "/mock/test") + assert.Equal(t, api.HTTPVerb, config.MethodGet) + + req, _ = http.NewRequest("GET", "/mock/test2", r) + ctx = listener.pool.Get().(*ctxHttp.HttpContext) + api, err = listener.routeRequest(ctx, req) + assert.EqualError(t, err, "Requested URL /mock/test2 not found") + assert.Equal(t, ctx.StatusCode(), 404) + assert.Equal(t, api, router.API{}) + + req, _ = http.NewRequest("POST", "/mock/test", r) + ctx = listener.pool.Get().(*ctxHttp.HttpContext) + api, err = listener.routeRequest(ctx, req) + assert.EqualError(t, err, "Requested API POST /mock/test does not online") + assert.Equal(t, ctx.StatusCode(), 406) + assert.Equal(t, api, router.API{}) +} diff --git a/pkg/service/api.go b/pkg/router/api.go similarity index 98% rename from pkg/service/api.go rename to pkg/router/api.go index 380929926..4e856b153 100644 --- a/pkg/service/api.go +++ b/pkg/router/api.go @@ -15,7 +15,7 @@ * limitations under the License. */ -package service +package router import ( "github.com/dubbogo/dubbo-go-proxy/pkg/config" diff --git a/pkg/router/route.go b/pkg/router/route.go index 27c9f13ae..f22f534f0 100644 --- a/pkg/router/route.go +++ b/pkg/router/route.go @@ -36,6 +36,7 @@ import ( type Node struct { fullPath string wildcard bool + filters []string methods map[config.HTTPVerb]*config.Method } @@ -46,9 +47,9 @@ type Route struct { wildcardTree *avltree.Tree } -// Put put a key val into the tree -func (rt *Route) Put(fullPath string, method config.Method) error { - lowerCasePath := strings.ToLower(fullPath) +// PutAPI puts an api into the resource +func (rt *Route) PutAPI(api API) error { + lowerCasePath := strings.ToLower(api.URLPattern) node, ok := rt.findNode(lowerCasePath) rt.lock.Lock() defer rt.lock.Unlock() @@ -56,7 +57,7 @@ func (rt *Route) Put(fullPath string, method config.Method) error { wildcard := strings.Contains(lowerCasePath, constant.PathParamIdentifier) rn := &Node{ fullPath: lowerCasePath, - methods: map[config.HTTPVerb]*config.Method{method.HTTPVerb: &method}, + methods: map[config.HTTPVerb]*config.Method{api.Method.HTTPVerb: &api.Method}, wildcard: wildcard, } if wildcard { @@ -65,22 +66,55 @@ func (rt *Route) Put(fullPath string, method config.Method) error { rt.tree.Put(lowerCasePath, rn) return nil } - return node.putMethod(method) + return node.putMethod(api.Method) } -// UpdateMethod update the api method in the existing router node -func (rt *Route) UpdateMethod(fullPath string, verb config.HTTPVerb, method config.Method) error { - node, found := rt.findNode(fullPath) +func (node *Node) putMethod(method config.Method) error { + if _, ok := node.methods[method.HTTPVerb]; ok { + return errors.Errorf("Method %s already exists in path %s", method.HTTPVerb, node.fullPath) + } + node.methods[method.HTTPVerb] = &method + return nil +} + +// UpdateAPI update the api method in the existing router node +func (rt *Route) UpdateAPI(api API) error { + node, found := rt.findNode(api.URLPattern) if found { - if _, ok := node.methods[verb]; ok { + if _, ok := node.methods[api.Method.HTTPVerb]; ok { rt.lock.Lock() defer rt.lock.Unlock() - node.methods[verb] = &method + node.methods[api.Method.HTTPVerb] = &api.Method } } return nil } +// FindAPI returns the api that meets the +func (rt *Route) FindAPI(fullPath string, httpverb config.HTTPVerb) (*API, bool) { + if n, found := rt.findNode(fullPath); found { + rt.lock.RLock() + defer rt.lock.RUnlock() + if method, ok := n.methods[httpverb]; ok { + return &API{ + URLPattern: n.fullPath, + Method: *method, + }, ok + } + } + return nil, false +} + +// UpdateResource updates the resource configuration +func (rt *Route) UpdateResource() error { + return nil +} + +// PutResource creates the resource into the tree +func (rt *Route) PutResource() error { + return nil +} + func (rt *Route) findNode(fullPath string) (*Node, bool) { lowerPath := strings.ToLower(fullPath) var n interface{} @@ -95,17 +129,6 @@ func (rt *Route) findNode(fullPath string) (*Node, bool) { return n.(*Node), found } -// FindMethod returns the api that meets the -func (rt *Route) FindMethod(fullPath string, httpverb config.HTTPVerb) (*config.Method, bool) { - if n, found := rt.findNode(fullPath); found { - rt.lock.RLock() - defer rt.lock.RUnlock() - method, ok := n.methods[httpverb] - return method, ok - } - return nil, false -} - func (rt *Route) searchWildcard(fullPath string) (*Node, bool) { rt.lock.RLock() defer rt.lock.RUnlock() @@ -119,14 +142,6 @@ func (rt *Route) searchWildcard(fullPath string) (*Node, bool) { return nil, false } -func (node *Node) putMethod(method config.Method) error { - if _, ok := node.methods[method.HTTPVerb]; ok { - return errors.Errorf("Method %s already exists in path %s", method.HTTPVerb, node.fullPath) - } - node.methods[method.HTTPVerb] = &method - return nil -} - // wildcardMatch validate if the checkPath meets the wildcardPath, // for example /vought/12345 should match wildcard path /vought/:id; // /vought/1234abcd/status should not match /vought/:id; diff --git a/pkg/router/route_test.go b/pkg/router/route_test.go index b95dbdbaa..7b02b6faa 100644 --- a/pkg/router/route_test.go +++ b/pkg/router/route_test.go @@ -47,38 +47,38 @@ func TestPut(t *testing.T) { wildcardTree: avltree.NewWithStringComparator(), } n0 := getMockMethod(config.MethodGet) - rt.Put("/", n0) + rt.PutAPI(API{URLPattern: "/", Method: n0}) _, ok := rt.tree.Get("/") assert.True(t, ok) - err := rt.Put("/", n0) + err := rt.PutAPI(API{URLPattern: "/", Method: n0}) assert.Error(t, err, "Method GET already exists in path /") n1 := getMockMethod(config.MethodPost) - err = rt.Put("/mock", n0) + err = rt.PutAPI(API{URLPattern: "/mock", Method: n0}) assert.Nil(t, err) - err = rt.Put("/mock", n1) + err = rt.PutAPI(API{URLPattern: "/mock", Method: n1}) assert.Nil(t, err) mNode, ok := rt.tree.Get("/mock") assert.True(t, ok) assert.Equal(t, len(mNode.(*Node).methods), 2) - err = rt.Put("/mock/test", n0) + err = rt.PutAPI(API{URLPattern: "/mock/test", Method: n0}) assert.Nil(t, err) - _, ok = rt.tree.Get("/mock") + _, ok = rt.tree.Get("/mock/test") assert.True(t, ok) - rt.Put("/test/:id", n0) + rt.PutAPI(API{URLPattern: "/test/:id", Method: n0}) tNode, ok := rt.tree.Get("/test/:id") assert.True(t, ok) assert.True(t, tNode.(*Node).wildcard) - err = rt.Put("/test/:id", n1) + err = rt.PutAPI(API{URLPattern: "/test/:id", Method: n1}) assert.Nil(t, err) - err = rt.Put("/test/js", n0) + err = rt.PutAPI(API{URLPattern: "/test/js", Method: n0}) assert.Error(t, err, "/test/:id wildcard already exist so that cannot add path /test/js") - err = rt.Put("/test/:id/mock", n0) + err = rt.PutAPI(API{URLPattern: "/test/:id/mock", Method: n0}) tNode, ok = rt.tree.Get("/test/:id/mock") assert.True(t, ok) assert.True(t, tNode.(*Node).wildcard) @@ -92,28 +92,31 @@ func TestFindMethod(t *testing.T) { } n0 := getMockMethod(config.MethodGet) n1 := getMockMethod(config.MethodPost) - e := rt.Put("/theboys", n0) + e := rt.PutAPI(API{URLPattern: "/theboys", Method: n0}) assert.Nil(t, e) - e = rt.Put("/theboys/:id", n0) + e = rt.PutAPI(API{URLPattern: "/theboys/:id", Method: n0}) assert.Nil(t, e) - e = rt.Put("/vought/:id/supe/:name", n1) + e = rt.PutAPI(API{URLPattern: "/vought/:id/supe/:name", Method: n1}) assert.Nil(t, e) - m, ok := rt.FindMethod("/theboys", config.MethodGet) + m, ok := rt.FindAPI("/theboys", config.MethodGet) assert.True(t, ok) assert.NotNil(t, m) + assert.Equal(t, m.URLPattern, "/theboys") - m, ok = rt.FindMethod("/theboys", config.MethodPost) + m, ok = rt.FindAPI("/theboys", config.MethodPost) assert.False(t, ok) assert.Nil(t, m) - m, ok = rt.FindMethod("/vought/爱国者/supe/startlight", config.MethodPost) + m, ok = rt.FindAPI("/vought/爱国者/supe/startlight", config.MethodPost) assert.True(t, ok) assert.NotNil(t, m) + assert.Equal(t, m.URLPattern, "/vought/:id/supe/:name") - m, ok = rt.FindMethod("/vought/123/supe/startlight", config.MethodPost) + m, ok = rt.FindAPI("/vought/123/supe/startlight", config.MethodPost) assert.True(t, ok) assert.NotNil(t, m) + assert.Equal(t, m.URLPattern, "/vought/:id/supe/:name") } func TestUpdateMethod(t *testing.T) { @@ -123,19 +126,19 @@ func TestUpdateMethod(t *testing.T) { m1.Version = "2.0.0" rt := NewRoute() - rt.Put("/marvel", m0) - m, _ := rt.FindMethod("/marvel", config.MethodGet) + rt.PutAPI(API{URLPattern: "/marvel", Method: m0}) + m, _ := rt.FindAPI("/marvel", config.MethodGet) assert.Equal(t, m.Version, "1.0.0") - rt.UpdateMethod("/marvel", config.MethodGet, m1) - m, ok := rt.FindMethod("/marvel", config.MethodGet) + rt.UpdateAPI(API{URLPattern: "/marvel", Method: m1}) + m, ok := rt.FindAPI("/marvel", config.MethodGet) assert.True(t, ok) assert.Equal(t, m.Version, "2.0.0") - rt.Put("/theboys/:id", m0) - m, _ = rt.FindMethod("/theBoys/12345", config.MethodGet) + rt.PutAPI(API{URLPattern: "/theboys/:id", Method: m0}) + m, _ = rt.FindAPI("/theBoys/12345", config.MethodGet) assert.Equal(t, m.Version, "1.0.0") - rt.UpdateMethod("/theBoys/:id", config.MethodGet, m1) - m, ok = rt.FindMethod("/theBoys/12345", config.MethodGet) + rt.UpdateAPI(API{URLPattern: "/theBoys/:id", Method: m1}) + m, ok = rt.FindAPI("/theBoys/12345", config.MethodGet) assert.True(t, ok) assert.Equal(t, m.Version, "2.0.0") } @@ -146,11 +149,11 @@ func TestSearchWildcard(t *testing.T) { wildcardTree: avltree.NewWithStringComparator(), } n0 := getMockMethod(config.MethodGet) - e := rt.Put("/theboys", n0) + e := rt.PutAPI(API{URLPattern: "/theboys", Method: n0}) assert.Nil(t, e) - e = rt.Put("/theboys/:id", n0) + e = rt.PutAPI(API{URLPattern: "/theboys/:id", Method: n0}) assert.Nil(t, e) - e = rt.Put("/vought/:id/supe/:name", n0) + e = rt.PutAPI(API{URLPattern: "/vought/:id/supe/:name", Method: n0}) assert.Nil(t, e) _, ok := rt.searchWildcard("/marvel") @@ -169,3 +172,22 @@ func TestWildcardMatch(t *testing.T) { assert.False(t, wildcardMatch("/vought/:id", "/vought/1234abcd/status")) assert.True(t, wildcardMatch("/voughT/:id/:action", "/Vought/1234abcd/attack")) } + +func TestPutResource(t *testing.T) { + rt := NewRoute() + err := rt.PutResource() + assert.Nil(t, err) +} + +func TestGetFilters(t *testing.T) { + rt := NewRoute() + n0 := getMockMethod(config.MethodGet) + n1 := getMockMethod(config.MethodPost) + e := rt.PutAPI(API{URLPattern: "/theboys", Method: n0}) + assert.Nil(t, e) + e = rt.PutAPI(API{URLPattern: "/theboys/:id", Method: n0}) + assert.Nil(t, e) + e = rt.PutAPI(API{URLPattern: "/vought/:id/supe/:name", Method: n1}) + assert.Nil(t, e) + +} diff --git a/pkg/service/api/discovery_service.go b/pkg/service/api/discovery_service.go index e9e88acb0..2e072a0ea 100644 --- a/pkg/service/api/discovery_service.go +++ b/pkg/service/api/discovery_service.go @@ -98,17 +98,17 @@ func (ads *LocalMemoryAPIDiscoveryService) GetApi(request service.DiscoveryReque } // AddAPI adds a method to the router tree -func (ads *LocalMemoryAPIDiscoveryService) AddAPI(api service.API) error { - return ads.router.Put(api.URLPattern, api.Method) +func (ads *LocalMemoryAPIDiscoveryService) AddAPI(api router.API) error { + return ads.router.PutAPI(api) } // GetAPI returns the method to the caller -func (ads *LocalMemoryAPIDiscoveryService) GetAPI(url string, httpVerb config.HTTPVerb) (service.DiscoveryResponse, error) { - if method, ok := ads.router.FindMethod(url, httpVerb); ok { - return *service.NewDiscoveryResponse(method), nil +func (ads *LocalMemoryAPIDiscoveryService) GetAPI(url string, httpVerb config.HTTPVerb) (router.API, error) { + if api, ok := ads.router.FindAPI(url, httpVerb); ok { + return *api, nil } - return *service.EmptyDiscoveryResponse, errors.New("not found") + return router.API{}, errors.New("not found") } // InitAPIsFromConfig inits the router from API config and to local cache @@ -154,7 +154,7 @@ func loadAPIFromResource(parrentPath string, resources []config.Resource, localS func loadAPIFromMethods(fullPath string, methods []config.Method, localSrv service.ApiDiscoveryService) error { errStack := []string{} for _, method := range methods { - api := service.API{ + api := router.API{ URLPattern: fullPath, Method: method, } diff --git a/pkg/service/api/discovery_service_test.go b/pkg/service/api/discovery_service_test.go index 00f6c4a7c..f52a5a841 100644 --- a/pkg/service/api/discovery_service_test.go +++ b/pkg/service/api/discovery_service_test.go @@ -29,10 +29,10 @@ import ( "github.com/dubbogo/dubbo-go-proxy/pkg/common/constant" "github.com/dubbogo/dubbo-go-proxy/pkg/common/extension" "github.com/dubbogo/dubbo-go-proxy/pkg/config" - "github.com/dubbogo/dubbo-go-proxy/pkg/service" + "github.com/dubbogo/dubbo-go-proxy/pkg/router" ) -func getMockAPI(urlPattern string, verb config.HTTPVerb) service.API { +func getMockAPI(urlPattern string, verb config.HTTPVerb) router.API { inbound := config.InboundRequest{} integration := config.IntegrationRequest{} method := config.Method{ @@ -41,7 +41,7 @@ func getMockAPI(urlPattern string, verb config.HTTPVerb) service.API { InboundRequest: inbound, IntegrationRequest: integration, } - return service.API{ + return router.API{ URLPattern: urlPattern, Method: method, } @@ -57,7 +57,7 @@ func TestAddAPI(t *testing.T) { l := NewLocalMemoryAPIDiscoveryService() err := l.AddAPI(getMockAPI("/this/is/test", config.MethodPut)) assert.Nil(t, err) - _, found := l.router.FindMethod("/this/is/test", config.MethodPut) + _, found := l.router.FindAPI("/this/is/test", config.MethodPut) assert.True(t, found) } @@ -79,13 +79,13 @@ func TestLoadAPI(t *testing.T) { assert.Nil(t, err) apiDisSrv := extension.GetMustApiDiscoveryService(constant.LocalMemoryApiDiscoveryService) rsp, err := apiDisSrv.GetAPI("/", config.MethodGet) - assert.True(t, rsp.Success) + assert.NotNil(t, rsp.URLPattern) rsp, err = apiDisSrv.GetAPI("/mockTest", config.MethodGet) - assert.True(t, rsp.Success) + assert.NotNil(t, rsp.URLPattern) rsp, err = apiDisSrv.GetAPI("/mockTest", config.MethodPost) - assert.True(t, rsp.Success) + assert.NotNil(t, rsp.URLPattern) rsp, err = apiDisSrv.GetAPI("/mockTest/12345", config.MethodGet) - assert.True(t, rsp.Success) + assert.NotNil(t, rsp.URLPattern) } func TestLoadAPIFromResource(t *testing.T) { @@ -138,13 +138,13 @@ func TestLoadAPIFromResource(t *testing.T) { err := loadAPIFromResource("", tempResources, apiDiscSrv) assert.Nil(t, err) rsp, _ := apiDiscSrv.GetAPI("/", config.MethodPut) - assert.True(t, rsp.Success) + assert.Equal(t, rsp.URLPattern, "/") rsp, _ = apiDiscSrv.GetAPI("/", config.MethodGet) - assert.True(t, rsp.Success) + assert.Equal(t, rsp.URLPattern, "/") rsp, _ = apiDiscSrv.GetAPI("/mock", config.MethodGet) - assert.True(t, rsp.Success) + assert.Equal(t, rsp.URLPattern, "/mock") rsp, _ = apiDiscSrv.GetAPI("/mock2/12345", config.MethodPut) - assert.True(t, rsp.Success) + assert.Equal(t, rsp.URLPattern, "/mock2/:id") tempResources = []config.Resource{ { @@ -188,8 +188,8 @@ func TestLoadAPIFromMethods(t *testing.T) { apiDiscSrv := NewLocalMemoryAPIDiscoveryService() err := loadAPIFromMethods("/mock", tempMethods, apiDiscSrv) rsp, _ := apiDiscSrv.GetAPI("/mock", config.MethodPut) - assert.True(t, rsp.Success) + assert.Equal(t, rsp.URLPattern, "/mock") rsp, _ = apiDiscSrv.GetAPI("/mock", config.MethodGet) - assert.True(t, rsp.Success) + assert.Equal(t, rsp.URLPattern, "/mock") assert.EqualError(t, err, "Path: /mock, Method: PUT, error: Method PUT already exists in path /mock") } diff --git a/pkg/service/discovery_service.go b/pkg/service/discovery_service.go index 246b3f03c..251b91afe 100644 --- a/pkg/service/discovery_service.go +++ b/pkg/service/discovery_service.go @@ -19,6 +19,7 @@ package service import ( "github.com/dubbogo/dubbo-go-proxy/pkg/config" + "github.com/dubbogo/dubbo-go-proxy/pkg/router" ) // DiscoveryRequest a request for discovery @@ -60,8 +61,8 @@ var EmptyDiscoveryResponse = &DiscoveryResponse{} type ApiDiscoveryService interface { AddApi(request DiscoveryRequest) (DiscoveryResponse, error) GetApi(request DiscoveryRequest) (DiscoveryResponse, error) - AddAPI(API) error - GetAPI(string, config.HTTPVerb) (DiscoveryResponse, error) + AddAPI(router.API) error + GetAPI(string, config.HTTPVerb) (router.API, error) } // DiscoveryService is come from envoy, it can used for admin From 5fad5c7e9a014786865e4b3bdee27b8fef448dae Mon Sep 17 00:00:00 2001 From: williamfeng323 Date: Tue, 13 Oct 2020 22:54:45 +0800 Subject: [PATCH 137/227] update the httpContext.BuildFilters to read filter list from api method --- pkg/config/api_config.go | 22 ++++++++---- pkg/context/http/context.go | 14 ++++++-- pkg/context/http/context_test.go | 57 ++++++++++++++++++++++++++++++-- pkg/proxy/listener.go | 5 +++ pkg/proxy/listener_test.go | 17 ++++++++++ 5 files changed, 104 insertions(+), 11 deletions(-) diff --git a/pkg/config/api_config.go b/pkg/config/api_config.go index c16cc69f5..8b0f49226 100644 --- a/pkg/config/api_config.go +++ b/pkg/config/api_config.go @@ -48,6 +48,16 @@ const ( MethodOptions HTTPVerb = "OPTIONS" ) +// RequestType describes the type of the request. could be DUBBO/HTTP and others that we might implement in the future +type RequestType string + +const ( + // DubboRequest represents the dubbo request + DubboRequest RequestType = "DUBBO" + // HTTPRequest represents the http request + HTTPRequest RequestType = "HTTP" +) + // APIConfig defines the data structure of the api gateway configuration type APIConfig struct { Name string `json:"name" yaml:"name"` @@ -77,10 +87,10 @@ type Method struct { // InboundRequest defines the details of the inbound type InboundRequest struct { - RequestType string `json:"requestType" yaml:"requestType"` //http, TO-DO: dubbo - Headers []Params `json:"headers" yaml:"headers"` - QueryStrings []Params `json:"queryStrings" yaml:"queryStrings"` - RequestBody []BodyDefinition `json:"requestBody" yaml:"requestBody"` + RequestType `json:"requestType" yaml:"requestType"` //http, TO-DO: dubbo + Headers []Params `json:"headers" yaml:"headers"` + QueryStrings []Params `json:"queryStrings" yaml:"queryStrings"` + RequestBody []BodyDefinition `json:"requestBody" yaml:"requestBody"` } // Params defines the simple parameter definition @@ -96,8 +106,8 @@ type BodyDefinition struct { // IntegrationRequest defines the backend request format and target type IntegrationRequest struct { - RequestType string `json:"requestType" yaml:"requestType"` // dubbo, TO-DO: http - MappingParams []MappingParam `json:"mappingParams,omitempty" yaml:"mappingParams,omitempty"` + RequestType `json:"requestType" yaml:"requestType"` // dubbo, TO-DO: http + MappingParams []MappingParam `json:"mappingParams,omitempty" yaml:"mappingParams,omitempty"` DubboBackendConfig `json:"dubboBackendConfig,inline,omitempty" yaml:"dubboBackendConfig,inline,omitempty"` } diff --git a/pkg/context/http/context.go b/pkg/context/http/context.go index 9202256f1..283e593bb 100644 --- a/pkg/context/http/context.go +++ b/pkg/context/http/context.go @@ -26,6 +26,7 @@ import ( "github.com/dubbogo/dubbo-go-proxy/pkg/client" "github.com/dubbogo/dubbo-go-proxy/pkg/common/constant" "github.com/dubbogo/dubbo-go-proxy/pkg/common/extension" + "github.com/dubbogo/dubbo-go-proxy/pkg/config" "github.com/dubbogo/dubbo-go-proxy/pkg/context" "github.com/dubbogo/dubbo-go-proxy/pkg/model" "github.com/dubbogo/dubbo-go-proxy/pkg/router" @@ -168,13 +169,20 @@ func (hc *HttpContext) doWrite(h map[string]string, code int, d interface{}) { // BuildFilters build filter, from config http_filters func (hc *HttpContext) BuildFilters() { var filterFuncs []context.FilterFunc + api := hc.GetAPI() - if hc.HttpConnectionManager.HttpFilters == nil { + if api == nil { return } + for _, v := range api.Method.Filters { + filterFuncs = append(filterFuncs, extension.GetMustFilterFunc(v)) + } - for _, v := range hc.HttpConnectionManager.HttpFilters { - filterFuncs = append(filterFuncs, extension.GetMustFilterFunc(v.Name)) + switch api.Method.IntegrationRequest.RequestType { + case config.DubboRequest: + hc.AppendFilterFunc(extension.GetMustFilterFunc(constant.HttpTransferDubboFilter)) + case config.HTTPRequest: + break } hc.AppendFilterFunc(filterFuncs...) diff --git a/pkg/context/http/context_test.go b/pkg/context/http/context_test.go index e447cecdb..8811a5b6b 100644 --- a/pkg/context/http/context_test.go +++ b/pkg/context/http/context_test.go @@ -1,10 +1,63 @@ -package http +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + */ + +package http_test import ( "testing" ) +import ( + "github.com/dubbogo/dubbo-go-proxy/pkg/common/extension" + "github.com/dubbogo/dubbo-go-proxy/pkg/config" + "github.com/dubbogo/dubbo-go-proxy/pkg/context" + httpCtx "github.com/dubbogo/dubbo-go-proxy/pkg/context/http" + _ "github.com/dubbogo/dubbo-go-proxy/pkg/filter" + "github.com/dubbogo/dubbo-go-proxy/pkg/model" + "github.com/dubbogo/dubbo-go-proxy/pkg/router" + "github.com/stretchr/testify/assert" +) + +func getMockAPI(verb config.HTTPVerb, urlPattern string, filters ...string) router.API { + inbound := config.InboundRequest{} + integration := config.IntegrationRequest{RequestType: config.DubboRequest} + method := config.Method{ + OnAir: true, + HTTPVerb: verb, + InboundRequest: inbound, + IntegrationRequest: integration, + Filters: filters, + } + return router.API{ + URLPattern: urlPattern, + Method: method, + } +} + func TestBuildContext(t *testing.T) { - ctx := HttpContext{} + extension.SetFilterFunc("a", func(ctx context.Context) { ctx.Next() }) + extension.SetFilterFunc("b", func(ctx context.Context) { ctx.Next() }) + extension.SetFilterFunc("c", func(ctx context.Context) { ctx.Next() }) + ctx := httpCtx.HttpContext{ + FilterChains: []model.FilterChain{}, + BaseContext: context.NewBaseContext(), + } + ctx.API(getMockAPI(config.MethodPost, "/mock/test", "a", "b", "c")) ctx.BuildFilters() + + assert.Equal(t, len(ctx.Filters), 4) } diff --git a/pkg/proxy/listener.go b/pkg/proxy/listener.go index afee92981..81ed3be66 100644 --- a/pkg/proxy/listener.go +++ b/pkg/proxy/listener.go @@ -128,6 +128,11 @@ func (s *DefaultHttpListener) ServeHTTP(w http.ResponseWriter, r *http.Request) extension.GetMustFilterFunc(constant.RecoveryFilter), ) + _, err := s.routeRequest(hc, r) + if err != nil { + s.pool.Put(hc) + return + } hc.BuildFilters() s.handleHTTPRequest(hc) diff --git a/pkg/proxy/listener_test.go b/pkg/proxy/listener_test.go index 4883c1545..52d5a4310 100644 --- a/pkg/proxy/listener_test.go +++ b/pkg/proxy/listener_test.go @@ -1,3 +1,20 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + */ + package proxy import ( From 440f00f2482bc5c8338b2964f5ca77ae221f020a Mon Sep 17 00:00:00 2001 From: zhangshen023 <1292369127@qq.com> Date: Tue, 13 Oct 2020 23:18:56 +0800 Subject: [PATCH 138/227] unit test passed --- go.sum | 41 ++++++++++++++++++ pkg/registry_load/consul_registry.go | 15 ++++--- pkg/registry_load/consul_registry_test.go | 53 ++++++++++++++++++++++- 3 files changed, 102 insertions(+), 7 deletions(-) diff --git a/go.sum b/go.sum index 251410f41..8573a9f95 100644 --- a/go.sum +++ b/go.sum @@ -4,6 +4,7 @@ cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSR cloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU= cloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY= cloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc= +cloud.google.com/go v0.46.3 h1:AVXDdKsrtX33oR9fbCMu/+c1o8Ofjq6Ku/MInaLVg5Y= cloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0= cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o= cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= @@ -11,24 +12,34 @@ cloud.google.com/go/firestore v1.1.0/go.mod h1:ulACoGHTpvq5r8rxGJ4ddJZBZqakUQqCl cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I= cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw= dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= +github.com/Azure/azure-sdk-for-go v40.3.0+incompatible h1:NthZg3psrLxvQLN6rVm07pZ9mv2wvGNaBNGQ3fnPvLE= github.com/Azure/azure-sdk-for-go v40.3.0+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc= github.com/Azure/go-autorest/autorest v0.9.0/go.mod h1:xyHB1BMZT0cuDHU7I0+g046+BFDTQ8rEZB0s4Yfa6bI= github.com/Azure/go-autorest/autorest v0.9.3/go.mod h1:GsRuLYvwzLjjjRoWEIyMUaYq8GNUx2nRB378IPt/1p0= +github.com/Azure/go-autorest/autorest v0.10.0 h1:mvdtztBqcL8se7MdrUweNieTNi4kfNG6GOJuurQJpuY= github.com/Azure/go-autorest/autorest v0.10.0/go.mod h1:/FALq9T/kS7b5J5qsQ+RSTUdAmGFqi0vUdVNNx8q630= github.com/Azure/go-autorest/autorest/adal v0.5.0/go.mod h1:8Z9fGy2MpX0PvDjB1pEgQTmVqjGhiHBW7RJJEciWzS0= github.com/Azure/go-autorest/autorest/adal v0.8.0/go.mod h1:Z6vX6WXXuyieHAXwMj0S6HY6e6wcHn37qQMBQlvY3lc= github.com/Azure/go-autorest/autorest/adal v0.8.1/go.mod h1:ZjhuQClTqx435SRJ2iMlOxPYt3d2C/T/7TiQCVZSn3Q= +github.com/Azure/go-autorest/autorest/adal v0.8.2 h1:O1X4oexUxnZCaEUGsvMnr8ZGj8HI37tNezwY4npRqA0= github.com/Azure/go-autorest/autorest/adal v0.8.2/go.mod h1:ZjhuQClTqx435SRJ2iMlOxPYt3d2C/T/7TiQCVZSn3Q= +github.com/Azure/go-autorest/autorest/azure/auth v0.4.2 h1:iM6UAvjR97ZIeR93qTcwpKNMpV+/FTWjwEbuPD495Tk= github.com/Azure/go-autorest/autorest/azure/auth v0.4.2/go.mod h1:90gmfKdlmKgfjUpnCEpOJzsUEjrWDSLwHIG73tSXddM= +github.com/Azure/go-autorest/autorest/azure/cli v0.3.1 h1:LXl088ZQlP0SBppGFsRZonW6hSvwgL5gRByMbvUbx8U= github.com/Azure/go-autorest/autorest/azure/cli v0.3.1/go.mod h1:ZG5p860J94/0kI9mNJVoIoLgXcirM2gF5i2kWloofxw= github.com/Azure/go-autorest/autorest/date v0.1.0/go.mod h1:plvfp3oPSKwf2DNjlBjWF/7vwR+cUD/ELuzDCXwHUVA= +github.com/Azure/go-autorest/autorest/date v0.2.0 h1:yW+Zlqf26583pE43KhfnhFcdmSWlm5Ew6bxipnr/tbM= github.com/Azure/go-autorest/autorest/date v0.2.0/go.mod h1:vcORJHLJEh643/Ioh9+vPmf1Ij9AEBM5FuBIXLmIy0g= github.com/Azure/go-autorest/autorest/mocks v0.1.0/go.mod h1:OTyCOPRA2IgIlWxVYxBee2F5Gr4kF2zd2J5cFRaIDN0= github.com/Azure/go-autorest/autorest/mocks v0.2.0/go.mod h1:OTyCOPRA2IgIlWxVYxBee2F5Gr4kF2zd2J5cFRaIDN0= github.com/Azure/go-autorest/autorest/mocks v0.3.0/go.mod h1:a8FDP3DYzQ4RYfVAxAN3SVSiiO77gL2j2ronKKP0syM= +github.com/Azure/go-autorest/autorest/to v0.3.0 h1:zebkZaadz7+wIQYgC7GXaz3Wb28yKYfVkkBKwc38VF8= github.com/Azure/go-autorest/autorest/to v0.3.0/go.mod h1:MgwOyqaIuKdG4TL/2ywSsIWKAfJfgHDo8ObuUk3t5sA= +github.com/Azure/go-autorest/autorest/validation v0.2.0 h1:15vMO4y76dehZSq7pAaOLQxC6dZYsSrj2GQpflyM/L4= github.com/Azure/go-autorest/autorest/validation v0.2.0/go.mod h1:3EEqHnBxQGHXRYq3HT1WyXAvT7LLY3tl70hw6tQIbjI= +github.com/Azure/go-autorest/logger v0.1.0 h1:ruG4BSDXONFRrZZJ2GUXDiUyVpayPmb1GnWeHDdaNKY= github.com/Azure/go-autorest/logger v0.1.0/go.mod h1:oExouG+K6PryycPJfVSxi/koC6LSNgds39diKLz7Vrc= +github.com/Azure/go-autorest/tracing v0.5.0 h1:TRn4WjSnkcSy5AEG3pnbtFSwNtwzjr4VYyQflFE619k= github.com/Azure/go-autorest/tracing v0.5.0/go.mod h1:r/s2XiOKccPW3HrqB+W0TQzfbtp2fGCgRFtBroKn4Dk= github.com/BurntSushi/toml v0.3.1 h1:WXkYYl6Yr3qBf1K79EBnL4mak0OimBfB0XUf9Vl28OQ= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= @@ -41,6 +52,7 @@ github.com/Microsoft/go-winio v0.4.13 h1:Hmi80lzZuI/CaYmlJp/b+FjZdRZhKu9c2mDVqKl github.com/Microsoft/go-winio v0.4.13/go.mod h1:qXqCSQ3Xa7+6tgxaGTIe4Kpcdsi+P8jBhyzoq1bpyYA= github.com/NYTimes/gziphandler v0.0.0-20170623195520-56545f4a5d46/go.mod h1:3wb06e3pkSAbeQ52E9H9iFoQsEEwGN64994WTCIhntQ= github.com/NYTimes/gziphandler v1.0.1/go.mod h1:3wb06e3pkSAbeQ52E9H9iFoQsEEwGN64994WTCIhntQ= +github.com/NYTimes/gziphandler v1.1.1 h1:ZUDjpQae29j0ryrS0u/B8HZfJBtBQHjqw2rQ2cqUQ3I= github.com/NYTimes/gziphandler v1.1.1/go.mod h1:n/CVRwUEOgIxrgPvAQhUUr9oeUtvrhMomdKFjzJNB0c= github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= github.com/PuerkitoBio/purell v1.0.0/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= @@ -89,6 +101,7 @@ github.com/circonus-labs/circonusllhist v0.1.3 h1:TJH+oke8D16535+jHExHj4nQvzlZrj github.com/circonus-labs/circonusllhist v0.1.3/go.mod h1:kMXHVDlOchFAehlya5ePtbp5jckzBHf4XRpQvBOLI+I= github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= github.com/cockroachdb/apd v1.1.0/go.mod h1:8Sl8LxpKi29FqWXR16WEFZRNSz3SoPzUzeMeY4+DwBQ= +github.com/coredns/coredns v1.1.2 h1:bAFHrSsBeTeRG5W3Nf2su3lUGw7Npw2UKeCJm/3A638= github.com/coredns/coredns v1.1.2/go.mod h1:zASH/MVDgR6XZTbxvOnsZfffS+31vg6Ackf/wo1+AM0= github.com/coreos/bbolt v1.3.2/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk= github.com/coreos/bbolt v1.3.3/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk= @@ -112,11 +125,15 @@ github.com/davecgh/go-spew v0.0.0-20151105211317-5215b55f46b2/go.mod h1:J7Y8YcW2 github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/denverdino/aliyungo v0.0.0-20170926055100-d3308649c661 h1:lrWnAyy/F72MbxIxFUzKmcMCdt9Oi8RzpAxzTNQHD7o= github.com/denverdino/aliyungo v0.0.0-20170926055100-d3308649c661/go.mod h1:dV8lFg6daOBZbT6/BDGIz6Y3WFGn8juu6G+CQ6LHtl0= +github.com/dgrijalva/jwt-go v3.2.0+incompatible h1:7qlOGliEKZXTDg6OTjfoBKDXWrumCAMpl/TFQ4/5kLM= github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no= github.com/digitalocean/godo v1.1.1/go.mod h1:h6faOIcZ8lWIwNQ+DN7b3CgX4Kwby5T+nbpNqkUIozU= +github.com/digitalocean/godo v1.10.0 h1:uW1/FcvZE/hoixnJcnlmIUvTVNdZCLjRLzmDtRi1xXY= github.com/digitalocean/godo v1.10.0/go.mod h1:h6faOIcZ8lWIwNQ+DN7b3CgX4Kwby5T+nbpNqkUIozU= +github.com/dimchansky/utfbom v1.1.0 h1:FcM3g+nofKgUteL8dm/UpdRXNC9KmADgTpLKsu0TRo4= github.com/dimchansky/utfbom v1.1.0/go.mod h1:rO41eb7gLfo8SF1jd9F8HplJm1Fewwi4mQvIirEdv+8= github.com/dnaeon/go-vcr v1.0.1/go.mod h1:aBB1+wY4s93YsC3HHjMBMrwTj2R9FHDzUr9KyGc8n1E= github.com/docker/go-connections v0.3.0/go.mod h1:Gbd7IOopHjR8Iph03tsViu4nIes5XhDvyHbTtUxmeec= @@ -130,13 +147,16 @@ github.com/dubbogo/gost v1.9.1 h1:0/PPFo13zPbjt4Ia0zYWMFi3C6rAe9X7O1J2Iv+BHNM= github.com/dubbogo/gost v1.9.1/go.mod h1:pPTjVyoJan3aPxBPNUX0ADkXjPibLo+/Ib0/fADXSG8= github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= github.com/elazarl/go-bindata-assetfs v0.0.0-20160803192304-e1a2a7ec64b0/go.mod h1:v+YaWX3bdea5J/mo8dSETolEo7R71Vk1u8bnjau5yw4= +github.com/elazarl/go-bindata-assetfs v1.0.0 h1:G/bYguwHIzWq9ZoyUQqrjTmJbbYn3j3CKKpKinvZLFk= github.com/elazarl/go-bindata-assetfs v1.0.0/go.mod h1:v+YaWX3bdea5J/mo8dSETolEo7R71Vk1u8bnjau5yw4= github.com/elazarl/goproxy v0.0.0-20170405201442-c4fc26588b6e/go.mod h1:/Zj4wYkgs4iZTTu3o/KG3Itv/qCCa8VVMlb3i9OVuzc= github.com/emicklei/go-restful v0.0.0-20170410110728-ff4f55a20633/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs= github.com/emicklei/go-restful/v3 v3.0.0/go.mod h1:6n3XBCmQQb25CM2LCACGz8ukIrRry+4bhvbpWn3mrbc= github.com/emirpasic/gods v1.12.0 h1:QAUIPSaCu4G+POclxeqb3F+WPpdKqFGlw36+yOzGlrg= github.com/emirpasic/gods v1.12.0/go.mod h1:YfzfFFoVP/catgzJb4IKIqXjX78Ha8FMSDh3ymbK86o= +github.com/envoyproxy/go-control-plane v0.8.0 h1:uE6Fp4fOcAJdc1wTQXLJ+SYistkbG1dNoi6Zs1+Ybvk= github.com/envoyproxy/go-control-plane v0.8.0/go.mod h1:GSSbY9P1neVhdY7G4wu+IK1rk/dqhiCC/4ExuWJZVuk= +github.com/envoyproxy/protoc-gen-validate v0.0.14 h1:YBW6/cKy9prEGRYLnaGa4IDhzxZhRCtKsax8srGKDnM= github.com/envoyproxy/protoc-gen-validate v0.0.14/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= github.com/evanphx/json-patch v4.2.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= github.com/fastly/go-utils v0.0.0-20180712184237-d95a45783239/go.mod h1:Gdwt2ce0yfBxPvZrHkprdPPTTS3N5rwmLE8T22KBXlw= @@ -173,6 +193,7 @@ github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/me github.com/go-test/deep v1.0.2-0.20181118220953-042da051cf31/go.mod h1:wGDj63lr65AM2AQyKZd/NYHGb0R+1RLqB8NKt3aSFNA= github.com/go-test/deep v1.0.2 h1:onZX1rnHT3Wv6cqNgYyFOOlgVKJrksuCMCRvJStbMYw= github.com/go-test/deep v1.0.2/go.mod h1:wGDj63lr65AM2AQyKZd/NYHGb0R+1RLqB8NKt3aSFNA= +github.com/gogo/googleapis v1.1.0 h1:kFkMAZBNAn4j7K0GiZr8cRYzejq68VbheufiV3YuyFI= github.com/gogo/googleapis v1.1.0/go.mod h1:gf4bu3Q80BeJ6H1S1vYPm8/ELATdvryBaNFGgqEef3s= github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4= @@ -205,6 +226,7 @@ github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMyw github.com/google/go-cmp v0.3.1 h1:Xye71clBPdm5HgqGwUkwhbynsUJZhDbS20FvLhQ2izg= github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= github.com/google/go-querystring v0.0.0-20170111101155-53e6ce116135/go.mod h1:odCYkC5MyYFN7vkCjXpyrEuKhc/BUO6wN/zVPAxq5ck= +github.com/google/go-querystring v1.0.0 h1:Xkwi/a1rcvNg1PPYe5vI8GbeBY/jrVuDX5ASuANWTrk= github.com/google/go-querystring v1.0.0/go.mod h1:odCYkC5MyYFN7vkCjXpyrEuKhc/BUO6wN/zVPAxq5ck= github.com/google/gofuzz v0.0.0-20161122191042-44d81051d367/go.mod h1:HP5RmnzzSNb993RKQDq4+1A4ia9nllfqcQFTQJedwGI= github.com/google/gofuzz v1.0.0 h1:A8PeW59pxE9IoFRqBp37U+mSNaQoZ46F1f0f863XSXw= @@ -217,10 +239,12 @@ github.com/google/tcpproxy v0.0.0-20180808230851-dfa16c61dad2 h1:AtvtonGEH/fZK0X github.com/google/tcpproxy v0.0.0-20180808230851-dfa16c61dad2/go.mod h1:DavVbd41y+b7ukKDmlnPR4nGYmkWXR6vHUkjQNiHPBs= github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= +github.com/googleapis/gax-go/v2 v2.0.5 h1:sjZBwGj9Jlw33ImPtvFviGYvseOtDM7hkSKB7+Tv3SM= github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= github.com/googleapis/gnostic v0.0.0-20170729233727-0c5108395e2d/go.mod h1:sJBsCZ4ayReDTBIg8b9dl28c5xFWyhBTVRp3pOg5EKY= github.com/googleapis/gnostic v0.2.0 h1:l6N3VoaVzTncYYW+9yOz2LJJammFZGBO13sqgEhpy9g= github.com/googleapis/gnostic v0.2.0/go.mod h1:sJBsCZ4ayReDTBIg8b9dl28c5xFWyhBTVRp3pOg5EKY= +github.com/gophercloud/gophercloud v0.1.0 h1:P/nh25+rzXouhytV2pUHBb65fnds26Ghl8/391+sT5o= github.com/gophercloud/gophercloud v0.1.0/go.mod h1:vxM41WHh5uqHVBMZHzuwNOHh8XEoIEcSTewFxm1c5g8= github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1 h1:EGx4pi6eqNxGaHF6qqu48+N2wcFQ5qg5FXgOdqsJ5d8= github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= @@ -252,6 +276,7 @@ github.com/hashicorp/go-cleanhttp v0.5.1 h1:dH3aiDG9Jvb5r5+bYHsikaOUIpcM0xvgMXVo github.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= github.com/hashicorp/go-connlimit v0.2.0 h1:OZjcfNxH/hPh/bT2Iw5yOJcLzz+zuIWpsp3I1S4Pjw4= github.com/hashicorp/go-connlimit v0.2.0/go.mod h1:OUj9FGL1tPIhl/2RCfzYHrIiWj+VVPGNyVPnUX8AqS0= +github.com/hashicorp/go-discover v0.0.0-20200501174627-ad1e96bde088 h1:jBvElOilnIl6mm8S6gva/dfeTJCcMs9TGO6/2C6k52E= github.com/hashicorp/go-discover v0.0.0-20200501174627-ad1e96bde088/go.mod h1:vZu6Opqf49xX5lsFAu7iFNewkcVF1sn/wyapZh5ytlg= github.com/hashicorp/go-hclog v0.0.0-20180709165350-ff2cf002a8dd/go.mod h1:9bjs9uLqI8l75knNv3lV1kA55veR+WUPSiKIWcQHudI= github.com/hashicorp/go-hclog v0.8.0/go.mod h1:5CU+agLiy3J7N7QjHK5d05KxGsuXiQLrjA0H7acj2lQ= @@ -306,6 +331,7 @@ github.com/hashicorp/hil v0.0.0-20160711231837-1e86c6b523c5 h1:uk280DXEbQiCOZgCO github.com/hashicorp/hil v0.0.0-20160711231837-1e86c6b523c5/go.mod h1:KHvg/R2/dPtaePb16oW4qIyzkMxXOL38xjRN64adsts= github.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64= github.com/hashicorp/mdns v1.0.0/go.mod h1:tL+uN++7HEJ6SQLQ2/p+z2pH24WQKWjBPkE0mNTz8vQ= +github.com/hashicorp/mdns v1.0.1 h1:XFSOubp8KWB+Jd2PDyaX5xUd5bhSP/+pTDZVDMzZJM8= github.com/hashicorp/mdns v1.0.1/go.mod h1:4gW7WsVCke5TE7EPeYliwHlRUyBtfCwuFwuMg2DmyNY= github.com/hashicorp/memberlist v0.1.3/go.mod h1:ajVTdAv/9Im8oMAAj5G31PhhMCZJV2pPBoIllUwCN7I= github.com/hashicorp/memberlist v0.2.0/go.mod h1:MS2lj3INKhZjWNqd3N0m3J+Jxf3DAOnAH9VT3Sh9MUE= @@ -330,12 +356,14 @@ github.com/hashicorp/vault/sdk v0.1.13/go.mod h1:B+hVj7TpuQY1Y/GPbCpffmgd+tSEwvh github.com/hashicorp/vault/sdk v0.1.14-0.20191108161836-82f2b5571044/go.mod h1:PcekaFGiPJyHnFy+NZhP6ll650zEw51Ag7g/YEa+EOU= github.com/hashicorp/vault/sdk v0.1.14-0.20191112033314-390e96e22eb2 h1:mKYi4Fm2uSfe94Ji89CoAaP7SPEEkfdtaUlgRGGb2go= github.com/hashicorp/vault/sdk v0.1.14-0.20191112033314-390e96e22eb2/go.mod h1:PcekaFGiPJyHnFy+NZhP6ll650zEw51Ag7g/YEa+EOU= +github.com/hashicorp/vic v1.5.1-0.20190403131502-bbfe86ec9443 h1:O/pT5C1Q3mVXMyuqg7yuAWUg/jMZR1/0QTzTRdNR6Uw= github.com/hashicorp/vic v1.5.1-0.20190403131502-bbfe86ec9443/go.mod h1:bEpDU35nTu0ey1EXjwNwPjI9xErAsoOCmcMb9GKvyxo= github.com/hashicorp/yamux v0.0.0-20180604194846-3520598351bb/go.mod h1:+NfK9FKeTrX5uv1uIXGdwYDTeHna2qgaIlx54MXqjAM= github.com/hashicorp/yamux v0.0.0-20181012175058-2f1d1f20f75d h1:kJCB4vdITiW1eC1vq2e6IsrXKrZit1bv/TDYFGMp4BQ= github.com/hashicorp/yamux v0.0.0-20181012175058-2f1d1f20f75d/go.mod h1:+NfK9FKeTrX5uv1uIXGdwYDTeHna2qgaIlx54MXqjAM= github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= github.com/imdario/mergo v0.3.5/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= +github.com/imdario/mergo v0.3.6 h1:xTNEAn+kxVO7dTZGu0CegyqKZmoWFI0rF8UxjlB2d28= github.com/imdario/mergo v0.3.6/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= github.com/jackc/fake v0.0.0-20150926172116-812a484cc733/go.mod h1:WrMFNQdiFJ80sQsxDoMokWK1W5TQtxBFNpzWTD84ibQ= @@ -348,6 +376,7 @@ github.com/jmespath/go-jmespath v0.0.0-20180206201540-c2b33e8439af h1:pmfjZENx5i github.com/jmespath/go-jmespath v0.0.0-20180206201540-c2b33e8439af/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k= github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo= github.com/joyent/triton-go v0.0.0-20180628001255-830d2b111e62/go.mod h1:U+RSyWxWd04xTqnuOQxnai7XGS2PrPY2cfGoDKtMHjA= +github.com/joyent/triton-go v1.7.1-0.20200416154420-6801d15b779f h1:ENpDacvnr8faw5ugQmEF1QYk+f/Y9lXFvuYmRxykago= github.com/joyent/triton-go v1.7.1-0.20200416154420-6801d15b779f/go.mod h1:KDSfL7qe5ZfQqvlDMkVjCztbmcpp/c8M77vhQP8ZPvk= github.com/json-iterator/go v0.0.0-20180612202835-f2b4162afba3/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= github.com/json-iterator/go v1.1.5/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= @@ -374,6 +403,7 @@ github.com/lestrrat/go-envload v0.0.0-20180220120943-6ed08b54a570/go.mod h1:BLt8 github.com/lestrrat/go-file-rotatelogs v0.0.0-20180223000712-d3151e2a480f/go.mod h1:UGmTpUd3rjbtfIpwAPrcfmGf/Z1HS95TATB+m57TPB8= github.com/lestrrat/go-strftime v0.0.0-20180220042222-ba3bf9c1d042/go.mod h1:TPpsiPUEh0zFL1Snz4crhMlBe60PYxRHr5oFF3rRYg0= github.com/lib/pq v1.1.1/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= +github.com/linode/linodego v0.7.1 h1:4WZmMpSA2NRwlPZcc0+4Gyn7rr99Evk9bnr0B3gXRKE= github.com/linode/linodego v0.7.1/go.mod h1:ga11n3ivecUrPCHN0rANxKmfWBJVkOXfLMZinAbj2sY= github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= github.com/magiconair/properties v1.8.1 h1:ZC2Vc7/ZFkGmsVC9KvOjumD+G5lXy2RtTKyzRKO2BQ4= @@ -433,6 +463,7 @@ github.com/munnerz/goautoneg v0.0.0-20120707110453-a547fc61f48d/go.mod h1:+n7T8m github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= github.com/mxk/go-flowrate v0.0.0-20140419014527-cca7078d478f/go.mod h1:ZdcZmHo+o7JKHSa8/e818NopupXU1YMK5fe1lsApnBw= github.com/nacos-group/nacos-sdk-go v1.0.0/go.mod h1:hlAPn3UdzlxIlSILAyOXKxjFSvDJ9oLzTJ9hLAK1KzA= +github.com/nicolai86/scaleway-sdk v1.10.2-0.20180628010248-798f60e20bb2 h1:BQ1HW7hr4IVovMwWg0E0PYcyW8CzqDcVmaew9cujU4s= github.com/nicolai86/scaleway-sdk v1.10.2-0.20180628010248-798f60e20bb2/go.mod h1:TLb2Sg7HQcgGdloNxkrmtgDNR9uVYF3lfdFIN4Ro6Sk= github.com/oklog/run v1.0.0/go.mod h1:dlhp/R75TPv97u0XWUtDeV/lRKWPKSdTuV0TZvrmrQA= github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U= @@ -446,6 +477,7 @@ github.com/onsi/gomega v1.5.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1Cpa github.com/onsi/gomega v1.7.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= github.com/opentracing/opentracing-go v1.1.0 h1:pWlfV3Bxv7k65HYwkikxat0+s3pV4bsqf19k25Ur8rU= github.com/opentracing/opentracing-go v1.1.0/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= +github.com/packethost/packngo v0.1.1-0.20180711074735-b9cb5096f54c h1:vwpFWvAO8DeIZfFeqASzZfsxuWPno9ncAebBEP0N3uE= github.com/packethost/packngo v0.1.1-0.20180711074735-b9cb5096f54c/go.mod h1:otzZQXgoO96RTzDB/Hycg0qZcXZsWJGJRSXbmEIJ+4M= github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= github.com/pascaldekloe/goe v0.1.0 h1:cBOtyMzM9HTpWjXfbbunk26uA6nG3a8n06Wieeh0MwY= @@ -493,6 +525,7 @@ github.com/prometheus/procfs v0.0.3 h1:CTwfnzjQ+8dS6MhHHu4YswVAD99sL2wjPqP+VkURm github.com/prometheus/procfs v0.0.3/go.mod h1:4A/X28fw3Fc593LaREMrKMqOKvUAntwMDaekg4FpcdQ= github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU= github.com/rboyer/safeio v0.2.1/go.mod h1:Cq/cEPK+YXFn622lsQ0K4KsPZSPtaptHHEldsy7Fmig= +github.com/renier/xmlrpc v0.0.0-20170708154548-ce4a1a486c03 h1:Wdi9nwnhFNAlseAOekn6B5G/+GMtks9UKbvRU/CMM/o= github.com/renier/xmlrpc v0.0.0-20170708154548-ce4a1a486c03/go.mod h1:gRAiPF5C5Nd0eyyRdqIu9qTiFSoZzpTq727b5B8fkkU= github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg= github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= @@ -513,6 +546,7 @@ github.com/sean-/pager v0.0.0-20180208200047-666be9bf53b5/go.mod h1:BeybITEsBEg6 github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529 h1:nn5Wsu0esKSJiIVhscUtVbo7ada43DJhG55ua/hjS5I= github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc= github.com/shirou/gopsutil v0.0.0-20181107111621-48177ef5f880/go.mod h1:5b4v6he4MtMOwMlS0TUMTu2PcXUg8+E1lC7eC3UO/RA= +github.com/shirou/gopsutil v2.19.9+incompatible h1:IrPVlK4nfwW10DF7pW+7YJKws9NkgNzWozwwWv9FsgY= github.com/shirou/gopsutil v2.19.9+incompatible/go.mod h1:5b4v6he4MtMOwMlS0TUMTu2PcXUg8+E1lC7eC3UO/RA= github.com/shirou/w32 v0.0.0-20160930032740-bb4de0191aa4/go.mod h1:qsXQc7+bwAM3Q1u/4XEfrquwF8Lw7D7y5cD8CuHnfIc= github.com/shopspring/decimal v0.0.0-20180709203117-cd690d0c9e24/go.mod h1:M+9NzErvs504Cn4c5DxATwIqPbtswREoFCre64PpcG4= @@ -521,12 +555,14 @@ github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeV github.com/sirupsen/logrus v1.0.6/go.mod h1:pMByvHTf9Beacp5x1UXfOR9xyW/9antXMhjMPG0dEzc= github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= github.com/sirupsen/logrus v1.4.1/go.mod h1:ni0Sbl8bgC9z8RoU9G6nDWqqs/fq4eDPysMBDgk/93Q= +github.com/sirupsen/logrus v1.4.2 h1:SPIRibHv4MatM3XXNO2BJeFLZwZ2LvZgfQ5+UNI2im4= github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d h1:zE9ykElWQ6/NYmHa3jpm/yHnI4xSofP+UP6SpjHcSeM= github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= github.com/smartystreets/goconvey v0.0.0-20190330032615-68dc04aab96a/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= github.com/smartystreets/goconvey v1.6.4 h1:fv0U8FUIMPNf1L9lnHLvLhgicrIVChEkdzIKYqbNC9s= github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= +github.com/softlayer/softlayer-go v0.0.0-20180806151055-260589d94c7d h1:bVQRCxQvfjNUeRqaY/uT0tFuvuFY0ulgnczuR684Xic= github.com/softlayer/softlayer-go v0.0.0-20180806151055-260589d94c7d/go.mod h1:Cw4GTlQccdRGSEf6KiMju767x0NEHE0YIVPJSaXjlsw= github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM= github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= @@ -560,6 +596,7 @@ github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5 github.com/subosito/gotenv v1.2.0 h1:Slr1R9HxAlEKefgq5jn9U+DnETlIUa6HfgEzj0g5d7s= github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw= github.com/tebeka/strftime v0.1.3/go.mod h1:7wJm3dZlpr4l/oVK0t1HYIc4rMzQ2XJlOMIUJUJH6XQ= +github.com/tencentcloud/tencentcloud-sdk-go v3.0.83+incompatible h1:8uRvJleFpqLsO77WaAh2UrasMOzd8MxXrNj20e7El+Q= github.com/tencentcloud/tencentcloud-sdk-go v3.0.83+incompatible/go.mod h1:0PfYow01SHPMhKY31xa+EFz2RStxIqj6JFAJS+IkCi4= github.com/tent/http-link-go v0.0.0-20130702225549-ac974c61c2f9/go.mod h1:RHkNRtSLfOK7qBTHaeSX1D6BNpI3qw7NTxsmNr4RvN8= github.com/tevid/gohamcrest v1.1.1 h1:ou+xSqlIw1xfGTg1uq1nif/htZ2S3EzRqLm2BP+tYU0= @@ -572,6 +609,7 @@ github.com/ugorji/go v1.1.4/go.mod h1:uQMGLiO92mf5W77hV/PUCpI3pbzQx3CRekS0kk+RGr github.com/ugorji/go/codec v0.0.0-20181204163529-d75b2dcb6bc8/go.mod h1:VFNgLljTbGfSG7qAOspJ7OScBnGdDN/yBr0sguwnwf0= github.com/urfave/cli v1.22.4 h1:u7tSpNPPswAFymm8IehJhy4uJMlUuU/GmqSkvJ1InXA= github.com/urfave/cli v1.22.4/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= +github.com/vmware/govmomi v0.18.0 h1:f7QxSmP7meCtoAmiKZogvVbLInT+CZx6Px6K5rYsJZo= github.com/vmware/govmomi v0.18.0/go.mod h1:URlwyTFZX72RmxtxuaFL2Uj3fD1JTvZdx59bHWk6aFU= github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU= github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q= @@ -580,6 +618,7 @@ github.com/zouyx/agollo/v3 v3.4.4/go.mod h1:ag0XmE1r4iAgPd6PUnU9TJ0DMEjM1VKX1HUN go.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= go.etcd.io/bbolt v1.3.4/go.mod h1:G5EMThwa9y8QZGBClrRx5EY+Yw9kAhnjy3bSjsnlVTQ= go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= +go.opencensus.io v0.22.0 h1:C9hSCOW830chIVkdja34wa6Ky+IzWllkUinR+BtRZd4= go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= go.uber.org/atomic v1.6.0 h1:Ezj3JGmsOnG1MoRWQkPBsKLe9DwWD9QeXzTRzzldNVk= @@ -730,6 +769,7 @@ google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEt google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M= google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= google.golang.org/api v0.9.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= +google.golang.org/api v0.13.0 h1:Q3Ui3V3/CVinFWFiW39Iw0kMuVrRzYX0wN6OPFp0lTA= google.golang.org/api v0.13.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= @@ -773,6 +813,7 @@ gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= gopkg.in/ini.v1 v1.42.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= gopkg.in/ini.v1 v1.51.0 h1:AQvPpx3LzTDM0AjnIRlVFwFFGC+npRopjZxLJj6gdno= gopkg.in/ini.v1 v1.51.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= +gopkg.in/resty.v1 v1.12.0 h1:CuXP0Pjfw9rOuY6EP+UvtNvt5DSqHpIxILZKT/quCZI= gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo= gopkg.in/square/go-jose.v2 v2.3.1/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI= gopkg.in/square/go-jose.v2 v2.4.1 h1:H0TmLt7/KmzlrDOpa1F+zr0Tk90PbJYBfsVUmRLrf9Y= diff --git a/pkg/registry_load/consul_registry.go b/pkg/registry_load/consul_registry.go index f6eb849af..b5b05c6cd 100644 --- a/pkg/registry_load/consul_registry.go +++ b/pkg/registry_load/consul_registry.go @@ -28,9 +28,7 @@ import ( import ( "github.com/apache/dubbo-go/common" -) - -import ( + "github.com/apache/dubbo-go/common/constant" consul "github.com/hashicorp/consul/api" perrors "github.com/pkg/errors" ) @@ -71,7 +69,7 @@ func (crl *ConsulRegistryLoad) GetCluster() (string, error) { } func (crl *ConsulRegistryLoad) transfer2Url(service consul.AgentService) (common.URL, error) { - var params url.Values + var params = url.Values{} var protocol string for _, tag := range service.Tags { @@ -86,8 +84,15 @@ func (crl *ConsulRegistryLoad) transfer2Url(service consul.AgentService) (common protocol = strings.Split(url, ":")[0] } + methodsParam := strings.Split(params.Get(constant.METHODS_KEY), ",") + var methods []string + for _, method := range methodsParam { + if method != "" { + methods = append(methods, method) + } + } url := common.NewURLWithOptions(common.WithPort(strconv.Itoa(service.Port)), - common.WithProtocol(protocol), + common.WithProtocol(protocol), common.WithMethods(methods), common.WithIp(service.Address), common.WithParams(params)) return *url, nil diff --git a/pkg/registry_load/consul_registry_test.go b/pkg/registry_load/consul_registry_test.go index 9e3d04f30..09d2ad72c 100644 --- a/pkg/registry_load/consul_registry_test.go +++ b/pkg/registry_load/consul_registry_test.go @@ -16,11 +16,60 @@ */ package registry_load -import "testing" +import ( + "net/url" + "strconv" + "testing" +) -func TestConsulRegistryLoad_GetCluster(t *testing.T) { +import ( + "github.com/apache/dubbo-go/common" + "github.com/apache/dubbo-go/common/constant" + "github.com/apache/dubbo-go/common/extension" + _ "github.com/apache/dubbo-go/registry/consul" + "github.com/apache/dubbo-go/remoting/consul" + "github.com/stretchr/testify/assert" +) + +var ( + registryHost = "localhost" + registryPort = 8500 + providerHost = "localhost" + providerPort = 8000 + consumerHost = "localhost" + consumerPort = 8001 + service = "HelloWorld" + protocol = "tcp" + cluster = "test_cluster" +) +func TestConsulRegistryLoad_GetCluster(t *testing.T) { + loader, err := newConsulRegistryLoad(registryHost+":"+strconv.Itoa(registryPort), "test_cluster") + assert.Nil(t, err) + consulCluster, err := loader.GetCluster() + assert.Nil(t, err) + assert.Equal(t, cluster, consulCluster) } func TestConsulRegistryLoad_LoadAllServices(t *testing.T) { + consulAgent := consul.NewConsulAgent(t, registryPort) + defer consulAgent.Shutdown() + registryUrl, _ := common.NewURL(protocol + "://" + providerHost + ":" + strconv.Itoa(providerPort) + "/" + service + "?anyhost=true&" + + "application=BDTService&category=providers&default.timeout=10000&dubbo=dubbo-provider-golang-1.0.0&" + + "environment=dev&interface=com.ikurento.user.UserProvider&ip=192.168.56.1&methods=GetUser%2C&" + + "module=dubbogo+user-info+server&org=ikurento.com&owner=ZX&pid=1447&revision=0.0.1&" + + "side=provider&timeout=3000×tamp=1556509797245") + + registry, err := extension.GetRegistry("consul", common.NewURLWithOptions(common.WithParams(url.Values{}), common.WithIp("localhost"), common.WithPort("8500"), common.WithParamsValue(constant.ROLE_KEY, strconv.Itoa(common.PROVIDER)))) + assert.Nil(t, err) + err = registry.Register(registryUrl) + assert.Nil(t, err) + defer registry.UnRegister(registryUrl) + loader, err := newConsulRegistryLoad(registryHost+":"+strconv.Itoa(registryPort), "test_cluster") + assert.Nil(t, err) + services, err := loader.LoadAllServices() + assert.Nil(t, err) + assert.Len(t, services, 1) + assert.Contains(t, services[0].Methods, "GetUser") + assert.Equal(t, services[0].GetParams(), registryUrl.GetParams()) } From fdacf0069ef36fabd03be5e8b277e8fadb82aaa0 Mon Sep 17 00:00:00 2001 From: "yangqing.xyq" Date: Wed, 14 Oct 2020 20:15:35 +0800 Subject: [PATCH 139/227] add rest client but not implement it. --- go.mod | 1 - pkg/client/client.go | 5 ++-- pkg/client/httpclient/http_client.go | 33 +++++++++++++------------- pkg/client/httpclient/http_response.go | 16 ++++++------- pkg/context/base_context.go | 6 ++++- pkg/context/context.go | 2 +- pkg/filter/remote_call_filter.go | 2 +- 7 files changed, 34 insertions(+), 31 deletions(-) diff --git a/go.mod b/go.mod index 2422fea4f..f7283a203 100644 --- a/go.mod +++ b/go.mod @@ -5,7 +5,6 @@ go 1.14 require ( github.com/apache/dubbo-go v1.5.1 github.com/ghodss/yaml v1.0.1-0.20190212211648-25d852aebe32 - github.com/gin-gonic/gin v1.6.3 github.com/go-playground/validator/v10 v10.3.0 // indirect github.com/goinggo/mapstructure v0.0.0-20140717182941-194205d9b4a9 github.com/golang/protobuf v1.4.2 // indirect diff --git a/pkg/client/client.go b/pkg/client/client.go index 6afa990e7..fd9c6ec1e 100644 --- a/pkg/client/client.go +++ b/pkg/client/client.go @@ -22,7 +22,6 @@ import ( "github.com/dubbogo/dubbo-go-proxy/pkg/client/dubbo" "github.com/dubbogo/dubbo-go-proxy/pkg/client/httpclient" "github.com/dubbogo/dubbo-go-proxy/pkg/model" - _ "github.com/gin-gonic/gin" "sync" ) @@ -32,6 +31,7 @@ type Client interface { Call(req *Request) (resp Response, err error) } +//ClientPool a pool of client. type ClientPool struct { poolMap map[model.ApiType]*sync.Pool } @@ -41,7 +41,7 @@ var ( once = sync.Once{} ) -// SingleDubboClient singleton dubbo clent +// SingletonPool singleton pool func SingletonPool() *ClientPool { if _clinetPool == nil { once.Do(func() { @@ -52,6 +52,7 @@ func SingletonPool() *ClientPool { return _clinetPool } +// GetClient a factory method to get a client according to apiType . func (pool *ClientPool) GetClient(t model.ApiType) (Client, error) { if pool.poolMap[t] != nil { return pool.poolMap[t].Get().(Client), nil diff --git a/pkg/client/httpclient/http_client.go b/pkg/client/httpclient/http_client.go index 59df87289..162b82b76 100644 --- a/pkg/client/httpclient/http_client.go +++ b/pkg/client/httpclient/http_client.go @@ -40,19 +40,19 @@ type RestMetadata struct { } var ( - _httpClient *HttpClient + _httpClient *HTTPClient countDown = sync.Once{} dgCfg dg.ConsumerConfig ) -// DubboClient client to generic invoke dubbo -type HttpClient struct { +// HTTPClient client to generic invoke dubbo +type HTTPClient struct { mLock sync.RWMutex GenericServicePool map[string]*dg.GenericService } -// SingleDubboClient singleton dubbo clent -func SingleHttpClient() *HttpClient { +// SingleHttpClient singleton HTTP Client +func SingleHttpClient() *HTTPClient { if _httpClient == nil { countDown.Do(func() { @@ -62,16 +62,16 @@ func SingleHttpClient() *HttpClient { return _httpClient } -// NewDubboClient create dubbo client -func NewHttpClient() *HttpClient { - return &HttpClient{ +// NewHttpClient create dubbo client +func NewHttpClient() *HTTPClient { + return &HTTPClient{ mLock: sync.RWMutex{}, GenericServicePool: make(map[string]*dg.GenericService), } } // Init init dubbo, config mapping can do here -func (dc *HttpClient) Init() error { +func (dc *HTTPClient) Init() error { dgCfg = dg.GetConsumerConfig() dg.SetConsumerConfig(dgCfg) dg.Load() @@ -80,22 +80,22 @@ func (dc *HttpClient) Init() error { } // Close -func (dc *HttpClient) Close() error { +func (dc *HTTPClient) Close() error { return nil } // Call invoke service -func (dc *HttpClient) Call(r *client.Request) (resp client.Response, err error) { +func (dc *HTTPClient) Call(r *client.Request) (resp client.Response, err error) { //TODO:get Matched rest api url according to input url ,then make a http call. } -func (dc *HttpClient) get(key string) *dg.GenericService { +func (dc *HTTPClient) get(key string) *dg.GenericService { dc.mLock.RLock() defer dc.mLock.RUnlock() return dc.GenericServicePool[key] } -func (dc *HttpClient) check(key string) bool { +func (dc *HTTPClient) check(key string) bool { dc.mLock.RLock() defer dc.mLock.RUnlock() if _, ok := dc.GenericServicePool[key]; ok { @@ -105,7 +105,7 @@ func (dc *HttpClient) check(key string) bool { } } -func (dc *HttpClient) create(key string, dm *RestMetadata) *dg.GenericService { +func (dc *HTTPClient) create(key string, dm *RestMetadata) *dg.GenericService { referenceConfig := dg.NewReferenceConfig(dm.Interface, context.TODO()) referenceConfig.InterfaceName = dm.Interface referenceConfig.Cluster = constant.DEFAULT_CLUSTER @@ -140,11 +140,10 @@ func (dc *HttpClient) create(key string, dm *RestMetadata) *dg.GenericService { } // Get find a dubbo GenericService -func (dc *HttpClient) Get(interfaceName, version, group string, dm *RestMetadata) *dg.GenericService { +func (dc *HTTPClient) Get(interfaceName, version, group string, dm *RestMetadata) *dg.GenericService { key := strings.Join([]string{dm.ApplicationName, interfaceName, version, group}, "_") if dc.check(key) { return dc.get(key) - } else { - return dc.create(key, dm) } + return dc.create(key, dm) } diff --git a/pkg/client/httpclient/http_response.go b/pkg/client/httpclient/http_response.go index ebb9c348f..68decac33 100644 --- a/pkg/client/httpclient/http_response.go +++ b/pkg/client/httpclient/http_response.go @@ -1,7 +1,6 @@ package httpclient import ( - "errors" "fmt" "reflect" "strings" @@ -13,11 +12,12 @@ import ( // NewDubboResponse create dubbo response func NewDubboResponse(data interface{}) *client.Response { - if r, err := dealResp(data, true); err != nil { + r, err := dealResp(data, true) + if err != nil { return &client.Response{Data: data} - } else { - return &client.Response{Data: r} } + return &client.Response{Data: r} + } func dealResp(in interface{}, HumpToLine bool) (interface{}, error) { @@ -50,7 +50,7 @@ func dealResp(in interface{}, HumpToLine bool) (interface{}, error) { } newTemps = append(newTemps, newTemp) } else { - return nil, errors.New(fmt.Sprintf("unexpect err,value:%+v", value)) + return nil, fmt.Errorf("unexpect err,value:%+v", value) } } return newTemps, nil @@ -62,11 +62,11 @@ func dealResp(in interface{}, HumpToLine bool) (interface{}, error) { func mapIItoMapSI(in interface{}) interface{} { var inMap = make(map[interface{}]interface{}) - if v, ok := in.(map[interface{}]interface{}); !ok { + v, ok := in.(map[interface{}]interface{}) + if ok { return in - } else { - inMap = v } + inMap = v outMap := make(map[string]interface{}, len(inMap)) for k, v := range inMap { diff --git a/pkg/context/base_context.go b/pkg/context/base_context.go index f6beccf53..b98f5ead4 100644 --- a/pkg/context/base_context.go +++ b/pkg/context/base_context.go @@ -46,12 +46,16 @@ func (c *BaseContext) Next() { } } +// AbortWithError filter chain break , filter after the current filter will not executed. func (c *BaseContext) Abort() { c.Index = abortIndex } -func (c *BaseContext) AbortAndLog(message string, err error) { + +// AbortWithError filter chain break , filter after the current filter will not executed. And log will print. +func (c *BaseContext) AbortWithError(message string, err error) { c.Index = abortIndex log.Println(message, err) //TODO print stack + } func (c *BaseContext) AppendFilterFunc(ff ...FilterFunc) { diff --git a/pkg/context/context.go b/pkg/context/context.go index ace854f80..e82789015 100644 --- a/pkg/context/context.go +++ b/pkg/context/context.go @@ -25,7 +25,7 @@ import ( type Context interface { Next() Abort() - AbortAndLog(string, error) + AbortWithError(string, error) AppendFilterFunc(ff ...FilterFunc) Status(code int) diff --git a/pkg/filter/remote_call_filter.go b/pkg/filter/remote_call_filter.go index 4f57f0d80..707cd7663 100644 --- a/pkg/filter/remote_call_filter.go +++ b/pkg/filter/remote_call_filter.go @@ -54,7 +54,7 @@ func doRemoteCall(c *http.HttpContext) { cl, e := client.SingletonPool().GetClient(api.IType) if e != nil { c.WriteFail() - c.AbortAndLog("", e) + c.AbortWithError("", e) } if bytes, err := ioutil.ReadAll(c.Request.Body); err != nil { logger.Errorf("[dubboproxy go] read body err:%v!", err) From 173f43da4400e2516be7efbc039e75d67245be22 Mon Sep 17 00:00:00 2001 From: "yangqing.xyq" Date: Wed, 14 Oct 2020 20:22:12 +0800 Subject: [PATCH 140/227] add rest client but not implement it. --- pkg/client/httpclient/http_client.go | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/pkg/client/httpclient/http_client.go b/pkg/client/httpclient/http_client.go index 162b82b76..99e5b0597 100644 --- a/pkg/client/httpclient/http_client.go +++ b/pkg/client/httpclient/http_client.go @@ -2,7 +2,6 @@ package httpclient import ( "context" - "encoding/json" "strings" "sync" "time" @@ -16,7 +15,6 @@ import ( import ( "github.com/dubbogo/dubbo-go-proxy/pkg/client" - "github.com/dubbogo/dubbo-go-proxy/pkg/logger" ) // TODO java class name elem @@ -79,7 +77,7 @@ func (dc *HTTPClient) Init() error { return nil } -// Close +// Close close func (dc *HTTPClient) Close() error { return nil } From 99cdd05cb97ac1871f8fd902a840ec88ac099e8d Mon Sep 17 00:00:00 2001 From: zhangshen023 <1292369127@qq.com> Date: Wed, 14 Oct 2020 20:59:14 +0800 Subject: [PATCH 141/227] revert --- configs/conf.yaml | 9 -- pkg/api_load/api_loader.go | 32 ---- pkg/api_load/api_manager.go | 230 --------------------------- pkg/api_load/api_manager_test.go | 106 ------------ pkg/api_load/file_api_loader.go | 154 ------------------ pkg/api_load/file_api_loader_test.go | 130 --------------- pkg/api_load/mock/api_config.yaml | 15 -- pkg/api_load/nacos_api_loader.go | 66 -------- 8 files changed, 742 deletions(-) delete mode 100644 pkg/api_load/api_loader.go delete mode 100644 pkg/api_load/api_manager.go delete mode 100644 pkg/api_load/api_manager_test.go delete mode 100644 pkg/api_load/file_api_loader.go delete mode 100644 pkg/api_load/file_api_loader_test.go delete mode 100644 pkg/api_load/mock/api_config.yaml delete mode 100644 pkg/api_load/nacos_api_loader.go diff --git a/configs/conf.yaml b/configs/conf.yaml index b2a186612..8a8ebc993 100644 --- a/configs/conf.yaml +++ b/configs/conf.yaml @@ -47,12 +47,3 @@ static_resources: type: "EDS" lb_policy: "RoundRobin" connect_timeout: "5s" ---- -dynamic_resources: - api_config: - nacos: - address: localhost:8848 - prior: 1 - apollo: - address: localhost:8070 - prior: 2 \ No newline at end of file diff --git a/pkg/api_load/api_loader.go b/pkg/api_load/api_loader.go deleted file mode 100644 index 740c7c83d..000000000 --- a/pkg/api_load/api_loader.go +++ /dev/null @@ -1,32 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You 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. - */ -package api_load - -import "github.com/dubbogo/dubbo-go-proxy/pkg/model" - -type ApiLoader interface { - // every apiloader has a Priority, since remote api configurer such as nacos may cover fileapiloader. - // and the larger priority number indicates it's apis can cover apis of lower priority number priority. - GetPrior() int - GetLoadedApiConfigs() ([]model.Api, error) - // load all apis at first time - InitLoad() error - // watch apis when apis configured were changed. - HotLoad() (chan struct{}, error) - // clear all apis - Clear() error -} diff --git a/pkg/api_load/api_manager.go b/pkg/api_load/api_manager.go deleted file mode 100644 index 4dcf8976e..000000000 --- a/pkg/api_load/api_manager.go +++ /dev/null @@ -1,230 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You 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. - */ -package api_load - -import ( - "encoding/json" - "errors" - "fmt" - "sort" - "sync" - "time" -) - -import ( - "github.com/apache/dubbo-go/common/logger" - "github.com/dubbogo/dubbo-go-proxy/pkg/model" - "github.com/dubbogo/dubbo-go-proxy/pkg/service" -) - -type ApiLoadType string - -const ( - File ApiLoadType = "file" - Nacos ApiLoadType = "nacos" -) - -type ApiManager struct { - mergeLock *sync.RWMutex - // rate limiter - limiter *time.Ticker - rateLimiterTime time.Duration - mergeTask chan struct{} - // store apiLoaders - ApiLoadTypeMap map[ApiLoadType]ApiLoader - ads service.ApiDiscoveryService -} - -func NewApiManager(rateLimiterTime time.Duration, ads service.ApiDiscoveryService) *ApiManager { - if rateLimiterTime < time.Millisecond*50 { - rateLimiterTime = time.Millisecond * 50 - } - return &ApiManager{ - ApiLoadTypeMap: make(map[ApiLoadType]ApiLoader, 8), - mergeTask: make(chan struct{}, 1), - limiter: time.NewTicker(rateLimiterTime), - rateLimiterTime: rateLimiterTime, - mergeLock: &sync.RWMutex{}, - ads: ads, - } -} - -// add apiLoader by ApiLoadType -func (al *ApiManager) AddApiLoader(config model.ApiConfig) { - if config.File != nil { - al.ApiLoadTypeMap[File] = NewFileApiLoader(WithFilePath(config.File.FileApiConfPath)) - } - if config.Nacos != nil { - al.ApiLoadTypeMap[Nacos] = NewNacosApiLoader(WithNacosAddress(config.Nacos.Address)) - } -} - -// nolint -func (al *ApiManager) GetApiLoad(apiLoadType ApiLoadType) (ApiLoader, error) { - if apiLoader, ok := al.ApiLoadTypeMap[apiLoadType]; ok { - return apiLoader, nil - } - return nil, errors.New(fmt.Sprintf("can't load apiLoader for :%s", apiLoadType)) -} - -// start to load apis using apiLoaders stored in ApiLoadTypeMap -func (al *ApiManager) StartLoadApi() error { - for _, loader := range al.ApiLoadTypeMap { - err := loader.InitLoad() - if err != nil { - logger.Warn("proxy init api error:%v", err) - break - } - } - - if al.limiter == nil { - return errors.New("proxy won't hot load api since limiter is null.") - } - - for _, loader := range al.ApiLoadTypeMap { - changeNotifier, err := loader.HotLoad() - if err != nil { - logger.Warn("proxy hot load api error:%v", err) - break - } - - go func() { - for { - select { - case _, ok := <-changeNotifier: - if !ok { - logger.Debug("changeNotifier of apiloader was closed!") - return - } - al.AddMergeTask() - break - } - } - }() - } - return nil -} - -// store a message to mergeTask to notify calling DoMergeApiTask -func (al *ApiManager) AddMergeTask() error { - select { - case al.mergeTask <- struct{}{}: - logger.Debug("added a merge task, waiting to merge api.") - break - case <-time.After(5 * time.Second): - logger.Errorf("add merge task fail:wait timeout.") - break - } - return nil -} - -// to merge apis to store in ads.Notice that limiter will limit frequency of merging. -func (al *ApiManager) SelectMergeApiTask() (err error) { - for { - select { - case <-al.limiter.C: - if len(al.mergeTask) > 0 { - _, err = al.DoMergeApiTask() - if err != nil { - logger.Warnf("error merge api task:%v", err) - } - } - //al.limiter.Reset(time.Second) - break - default: - time.Sleep(al.rateLimiterTime / 10) - break - } - } - return -} - -// merge apis -func (al *ApiManager) DoMergeApiTask() (skip bool, err error) { - al.mergeLock.Lock() - defer al.mergeLock.Unlock() - wait := time.After(time.Millisecond * 50) - select { - case <-wait: - logger.Debug("merge api task is too frequent.") - skip = true - return - case <-al.mergeTask: - // If apiLoadType is File,then try covering it's apis using other's apis from registry center - multiApisMerged := make(map[string]model.Api, 8) - var sortedApiLoader []int - sortedApiLoaderMap := make(map[int]ApiLoadType, len(al.ApiLoadTypeMap)) - for apiLoadType, loader := range al.ApiLoadTypeMap { - sortedApiLoader = append(sortedApiLoader, loader.GetPrior()) - sortedApiLoaderMap[loader.GetPrior()] = apiLoadType - } - - sort.Ints(sortedApiLoader) - for _, sortNo := range sortedApiLoader { - loadType := sortedApiLoaderMap[sortNo] - apiLoader := al.ApiLoadTypeMap[loadType] - var apiConfigs []model.Api - apiConfigs, err = apiLoader.GetLoadedApiConfigs() - if err != nil { - logger.Error("get file apis error:%v", err) - return - } else { - for _, fleApiConfig := range apiConfigs { - if fleApiConfig.Status != model.Up { - continue - } - multiApisMerged[al.buildApiID(fleApiConfig)] = fleApiConfig - } - } - } - - var totalApis []model.Api - for _, api := range multiApisMerged { - totalApis = append(totalApis, api) - } - err = al.ads.RemoveAllApi() - if err != nil { - logger.Errorf("remove all older apis error:%v", err) - return - } - err = al.add2ApiDiscoveryService(totalApis) - if err != nil { - logger.Errorf("add newer apis error:%v", err) - return - } - return - } -} - -// add merged apis to ads -func (al *ApiManager) add2ApiDiscoveryService(apis []model.Api) error { - for _, api := range apis { - j, _ := json.Marshal(api) - _, err := al.ads.AddApi(*service.NewDiscoveryRequest(j)) - if err != nil { - logger.Errorf("error add api:%s", j) - return err - } - } - return nil -} - -// nolint -func (al *ApiManager) buildApiID(api model.Api) string { - return fmt.Sprintf("name:%s,ITypeStr:%s,OTypeStr:%s,Method:%s", - api.Name, api.ITypeStr, api.OTypeStr, api.Method) -} diff --git a/pkg/api_load/api_manager_test.go b/pkg/api_load/api_manager_test.go deleted file mode 100644 index 012c89289..000000000 --- a/pkg/api_load/api_manager_test.go +++ /dev/null @@ -1,106 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You 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. - */ -package api_load - -import ( - "context" - "encoding/json" - "io/ioutil" - "os" - "testing" - "time" -) - -import ( - "github.com/dubbogo/dubbo-go-proxy/pkg/client/dubbo" - "github.com/dubbogo/dubbo-go-proxy/pkg/model" - "github.com/dubbogo/dubbo-go-proxy/pkg/service" - "github.com/dubbogo/dubbo-go-proxy/pkg/service/api" -) - -import ( - "github.com/stretchr/testify/assert" - "gopkg.in/yaml.v2" -) - -func TestApiLoad_StartLoadApi(t *testing.T) { -} - -func TestApiLoad_AddApiLoad(t *testing.T) { - ads := api.NewLocalMemoryApiDiscoveryService() - apiManager := NewApiManager(time.Second*5, ads) - apiManager.AddApiLoader(model.ApiConfig{ - File: &model.File{ - FileApiConfPath: filePath, - }, - }) - apiLoader, err := apiManager.GetApiLoad(File) - assert.Nil(t, err) - assert.NotNil(t, apiLoader) - -} - -func TestApiManager_StartLoadApi(t *testing.T) { - ads := api.NewLocalMemoryApiDiscoveryService() - apiManager := NewApiManager(time.Second, ads) - apiManager.AddApiLoader(model.ApiConfig{ - File: &model.File{ - FileApiConfPath: filePath, - }, - }) - err := apiManager.StartLoadApi() - assert.Nil(t, err) - go apiManager.SelectMergeApiTask() - appendApiName := "test_append_api" - appendApi := model.Api{ - Name: appendApiName, - ITypeStr: "HTTP", - OTypeStr: "REST", - Method: "GET", - Status: 1, - Metadata: map[string]dubbo.DubboMetadata{ - "dubbo": { - ApplicationName: "BDTService", - Group: "test1", - Version: "2.0.0", - Interface: "com.ikurento.user.UserProvider", - Method: "GetUser", - Types: []string{ - "java.lang.String", - }, - ClusterName: "test_dubbo", - }, - }, - } - - bytes, err := yaml.Marshal([]model.Api{appendApi}) - assert.Nil(t, err) - originContent, _ := ioutil.ReadFile(filePath) - err = appendContent(filePath, bytes) - ok := assert.Nil(t, err) - if ok { - defer ioutil.WriteFile(filePath, originContent, os.ModePerm) - } - j, _ := json.Marshal(appendApi) - ctx, _ := context.WithTimeout(context.Background(), time.Second*3) - select { - case <-ctx.Done(): - _, err = apiManager.ads.GetApi(*service.NewDiscoveryRequest(j)) - assert.Nil(t, err) - return - } -} diff --git a/pkg/api_load/file_api_loader.go b/pkg/api_load/file_api_loader.go deleted file mode 100644 index 6d5e57dd7..000000000 --- a/pkg/api_load/file_api_loader.go +++ /dev/null @@ -1,154 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You 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. - */ -package api_load - -import ( - "encoding/json" - "io/ioutil" -) - -import ( - "github.com/fsnotify/fsnotify" - "github.com/ghodss/yaml" -) - -import ( - "github.com/dubbogo/dubbo-go-proxy/pkg/logger" - "github.com/dubbogo/dubbo-go-proxy/pkg/model" -) - -func init() { - var _ ApiLoader = new(FileApiLoader) -} - -type FileApiLoader struct { - filePath string - ApiConfigs []model.Api -} - -type FileApiLoaderOption func(*FileApiLoader) - -func WithFilePath(filePath string) FileApiLoaderOption { - return func(opt *FileApiLoader) { - opt.filePath = filePath - } -} - -func NewFileApiLoader(opts ...FileApiLoaderOption) *FileApiLoader { - fileApiLoader := &FileApiLoader{} - for _, opt := range opts { - opt(fileApiLoader) - } - return fileApiLoader -} - -func (f *FileApiLoader) GetPrior() int { - return 0 -} - -func (f *FileApiLoader) GetLoadedApiConfigs() ([]model.Api, error) { - return f.ApiConfigs, nil -} - -func (f *FileApiLoader) InitLoad() (err error) { - content, err := ioutil.ReadFile(f.filePath) - if err != nil { - logger.Errorf("fileApiLoader read api config error:%v", err) - return - } - jsonBytes, err := yaml.YAMLToJSON(content) - if err != nil { - logger.Errorf("fileApiLoader transfer api config error:%v,is it yaml format?", err) - return - } - - err = json.Unmarshal(jsonBytes, &f.ApiConfigs) - if err != nil { - logger.Errorf("fileApiLoader read api config error:%v", err) - return - } - if len(f.ApiConfigs) < 1 { - logger.Warnf("no api loaded!please make sure api config file is located") - } - return -} - -func (f *FileApiLoader) HotLoad() (chan struct{}, error) { - - changeNotifier := make(chan struct{}, 10) - watcher, err := fsnotify.NewWatcher() - if err != nil { - logger.Error(err) - return nil, err - } - - go func() { - defer watcher.Close() - for { - select { - case event, ok := <-watcher.Events: - if !ok { - return - } - logger.Debug("event:", event) - switch event.Op { - case fsnotify.Write: - logger.Debug("modified file:", event.Name) - content, err := ioutil.ReadFile(f.filePath) - jsonBytes, err := yaml.YAMLToJSON(content) - logger.Debugf("modified content:%s", content) - if err != nil { - logger.Warnf("fileApiLoader transfer api config error:%v,is it yaml format?", err) - break - } - - err = json.Unmarshal(jsonBytes, &f.ApiConfigs) - if err != nil { - logger.Warnf("fileApiLoader read api config error:%v", err) - break - } - changeNotifier <- struct{}{} - break - case fsnotify.Remove: - logger.Debug("removed file:", event.Name) - f.ApiConfigs = nil - changeNotifier <- struct{}{} - break - } - case err, ok := <-watcher.Errors: - if !ok { - f.Clear() - changeNotifier <- struct{}{} - return - } - logger.Error("error:", err) - } - } - }() - - err = watcher.Add(f.filePath) - if err != nil { - logger.Error(err) - return nil, err - } - return changeNotifier, err -} - -func (f *FileApiLoader) Clear() error { - f.ApiConfigs = nil - return nil -} diff --git a/pkg/api_load/file_api_loader_test.go b/pkg/api_load/file_api_loader_test.go deleted file mode 100644 index 6c85143a3..000000000 --- a/pkg/api_load/file_api_loader_test.go +++ /dev/null @@ -1,130 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You 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. - */ -package api_load - -import ( - "io" - "io/ioutil" - "os" - "testing" - "time" -) - -import ( - "github.com/dubbogo/dubbo-go-proxy/pkg/client/dubbo" - "github.com/dubbogo/dubbo-go-proxy/pkg/model" -) - -import ( - "github.com/ghodss/yaml" - "github.com/stretchr/testify/assert" -) - -const filePath = "./mock/api_config.yaml" - -func newFileLoader() ApiLoader { - return &FileApiLoader{ - filePath: filePath, - } -} - -func TestFileApiLoader_InitLoad(t *testing.T) { - fileApiLoader := newFileLoader() - err := fileApiLoader.InitLoad() - assert.Nil(t, err) - apis, err := fileApiLoader.GetLoadedApiConfigs() - assert.Nil(t, err) - assert.NotNil(t, apis) - bytes, err := yaml.Marshal(apis) - assert.Nil(t, err) - content, err := ioutil.ReadFile(filePath) - assert.Nil(t, err) - assert.YAMLEq(t, string(bytes), string(content)) -} - -func TestFileApiLoader_GetPrior(t *testing.T) { - fileApiLoader := newFileLoader() - prior := fileApiLoader.GetPrior() - assert.Equal(t, 0, prior) -} - -func TestFileApiLoader_HotLoad(t *testing.T) { - fileApiLoader := newFileLoader() - fileChangeNotifier, err := fileApiLoader.HotLoad() - assert.Nil(t, err) - assert.NotNil(t, fileChangeNotifier) - appendApiName := "test_append_api" - appendApi := model.Api{ - Name: appendApiName, - ITypeStr: "HTTP", - OTypeStr: "REST", - Method: "GET", - Status: 1, - Metadata: map[string]dubbo.DubboMetadata{ - "dubbo": { - ApplicationName: "BDTService", - Group: "test1", - Version: "2.0.0", - Interface: "com.ikurento.user.UserProvider", - Method: "GetUser", - Types: []string{ - "java.lang.String", - }, - ClusterName: "test_dubbo", - }, - }, - } - - bytes, err := yaml.Marshal([]model.Api{appendApi}) - assert.Nil(t, err) - originContent, _ := ioutil.ReadFile(filePath) - t.Log(string(bytes)) - err = appendContent(filePath, bytes) - ok := assert.Nil(t, err) - if ok { - defer ioutil.WriteFile(filePath, originContent, os.ModePerm) - } - select { - case <-fileChangeNotifier: - apis, err := fileApiLoader.GetLoadedApiConfigs() - assert.Nil(t, err) - assert.Len(t, apis, 2) - for _, api := range apis { - if api.Name == appendApiName { - assert.True(t, true) - return - } - } - assert.True(t, false) - break - case <-time.After(time.Second * 10000): - assert.Fail(t, "did't get change notice!") - } -} - -func appendContent(filename string, content []byte) error { - fl, err := os.OpenFile(filename, os.O_WRONLY|os.O_CREATE|os.O_APPEND, os.ModePerm) - if err != nil { - return err - } - defer fl.Close() - n, err := fl.Write(content) - if err == nil && n < len(content) { - err = io.ErrShortWrite - } - return err -} diff --git a/pkg/api_load/mock/api_config.yaml b/pkg/api_load/mock/api_config.yaml deleted file mode 100644 index b0c8e35f9..000000000 --- a/pkg/api_load/mock/api_config.yaml +++ /dev/null @@ -1,15 +0,0 @@ -- name: "/api/v1/test-dubbo/user" - itype: "HTTP" - otype: "DUBBO" - method: "POST" - status: 1 - metadata: - - dubbo: - - application_name: "BDTService" - - group: "test" - - version: "1.0.0" - - interface: "com.ikurento.user.UserProvider" - - method: "queryUser" - - cluster_name: "test_dubbo" - - types: - - "com.ikurento.user.User" diff --git a/pkg/api_load/nacos_api_loader.go b/pkg/api_load/nacos_api_loader.go deleted file mode 100644 index c6e0e3cf7..000000000 --- a/pkg/api_load/nacos_api_loader.go +++ /dev/null @@ -1,66 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You 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. - */ -package api_load - -import "github.com/dubbogo/dubbo-go-proxy/pkg/model" - -// TODO -func init() { - var _ ApiLoader = new(NacosApiLoader) -} - -type NacosApiLoader struct { - NacosAddress string - ApiConfigs []model.Api - Prior int -} - -type NacosApiLoaderOption func(*NacosApiLoader) - -func WithNacosAddress(nacosAddress string) NacosApiLoaderOption { - return func(opt *NacosApiLoader) { - opt.NacosAddress = nacosAddress - } -} - -func NewNacosApiLoader(opts ...NacosApiLoaderOption) *NacosApiLoader { - var NacosApiLoader = &NacosApiLoader{} - for _, opt := range opts { - opt(NacosApiLoader) - } - return NacosApiLoader -} - -func (f *NacosApiLoader) GetPrior() int { - return f.Prior -} - -func (f *NacosApiLoader) GetLoadedApiConfigs() ([]model.Api, error) { - return f.ApiConfigs, nil -} - -func (f *NacosApiLoader) InitLoad() (err error) { - panic("") -} - -func (f *NacosApiLoader) HotLoad() (chan struct{}, error) { - panic("") -} - -func (f *NacosApiLoader) Clear() error { - panic("") -} From 4c8ca1395a6ee001fae3d5e7cec7c0da01fe66cc Mon Sep 17 00:00:00 2001 From: zhangshen023 <1292369127@qq.com> Date: Wed, 14 Oct 2020 21:07:04 +0800 Subject: [PATCH 142/227] revert --- pkg/model/api_config.go | 15 --------------- pkg/model/bootstrap.go | 18 ------------------ pkg/proxy/proxy_start.go | 21 +++------------------ pkg/service/api/discovery_service.go | 21 +++------------------ pkg/service/discovery_service.go | 2 -- 5 files changed, 6 insertions(+), 71 deletions(-) delete mode 100644 pkg/model/api_config.go diff --git a/pkg/model/api_config.go b/pkg/model/api_config.go deleted file mode 100644 index da5996826..000000000 --- a/pkg/model/api_config.go +++ /dev/null @@ -1,15 +0,0 @@ -package model - -type ApiConfig struct { - Nacos *Nacos `yaml:"nacos" json:"nacos"` - File *File `yaml:"file" json:"file"` -} - -type Nacos struct { - Address string `yaml:"address" json:"address"` - Prior int `yaml:"prior" json:"prior"` -} - -type File struct { - FileApiConfPath string `yaml:"file-api-conf-path" json:"fileApiConfPath"` -} diff --git a/pkg/model/bootstrap.go b/pkg/model/bootstrap.go index 811d98f31..a4f3124a7 100644 --- a/pkg/model/bootstrap.go +++ b/pkg/model/bootstrap.go @@ -1,20 +1,3 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You 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. - */ - package model // Bootstrap the door @@ -50,5 +33,4 @@ type StaticResources struct { // DynamicResources TODO type DynamicResources struct { - ApiConfig ApiConfig `yaml:"api_config" json:"apiConfig"` } diff --git a/pkg/proxy/proxy_start.go b/pkg/proxy/proxy_start.go index c82b2c3c3..9b87e0d9c 100644 --- a/pkg/proxy/proxy_start.go +++ b/pkg/proxy/proxy_start.go @@ -19,9 +19,7 @@ package proxy import ( "encoding/json" - "github.com/dubbogo/dubbo-go-proxy/pkg/api_load" "sync" - "time" ) import ( @@ -39,7 +37,6 @@ import ( // Proxy type Proxy struct { startWG sync.WaitGroup - bs *model.Bootstrap } // Start proxy start @@ -65,23 +62,12 @@ func (p *Proxy) Start() { } } -func (p *Proxy) beforeStart() error { +func (p *Proxy) beforeStart() { dubbo.SingleDubboClient().Init() // TODO mock api register ads := extension.GetMustApiDiscoveryService(constant.LocalMemoryApiDiscoveryService) - apiLoader := api_load.NewApiManager(time.Second, ads) - apiLoader.AddApiLoader(p.bs.DynamicResources.ApiConfig) - err := apiLoader.StartLoadApi() - if err != nil { - logger.Errorf("error load api:%v", err) - return err - } - err = apiLoader.SelectMergeApiTask() - if err != nil { - logger.Errorf("error select merge api task :%v", err) - } a1 := &model.Api{ Name: "/api/v1/test-dubbo/user", ITypeStr: "HTTP", @@ -130,17 +116,16 @@ func (p *Proxy) beforeStart() error { } // NewProxy create proxy -func NewProxy(bs *model.Bootstrap) *Proxy { +func NewProxy() *Proxy { return &Proxy{ startWG: sync.WaitGroup{}, - bs: bs, } } func Start(bs *model.Bootstrap) { logger.Infof("[dubboproxy go] start by config : %+v", bs) - proxy := NewProxy(bs) + proxy := NewProxy() proxy.Start() proxy.startWG.Wait() diff --git a/pkg/service/api/discovery_service.go b/pkg/service/api/discovery_service.go index 47d510b41..6c0d52380 100644 --- a/pkg/service/api/discovery_service.go +++ b/pkg/service/api/discovery_service.go @@ -46,19 +46,6 @@ func NewLocalMemoryApiDiscoveryService() *LocalMemoryApiDiscoveryService { return &LocalMemoryApiDiscoveryService{} } -func (ads *LocalMemoryApiDiscoveryService) RemoveAllApi() error { - model.CacheApi.Range(func(name, _ interface{}) bool { - model.CacheApi.Delete(name) - return true - }) - return nil -} - -func (ads *LocalMemoryApiDiscoveryService) RemoveApi(name string) error { - model.CacheApi.Delete(name) - return nil -} - func (ads *LocalMemoryApiDiscoveryService) AddApi(request service.DiscoveryRequest) (service.DiscoveryResponse, error) { aj := model.NewApi() if err := json.Unmarshal(request.Body, aj); err != nil { @@ -91,11 +78,9 @@ func (ads *LocalMemoryApiDiscoveryService) AddApi(request service.DiscoveryReque } func (ads *LocalMemoryApiDiscoveryService) GetApi(request service.DiscoveryRequest) (service.DiscoveryResponse, error) { - aj := model.NewApi() - if err := json.Unmarshal(request.Body, aj); err != nil { - return *service.EmptyDiscoveryResponse, err - } - if a, ok := model.CacheApi.Load(aj.Name); ok { + n := string(request.Body) + + if a, ok := model.CacheApi.Load(n); ok { return *service.NewDiscoveryResponse(a), nil } diff --git a/pkg/service/discovery_service.go b/pkg/service/discovery_service.go index fcf571760..db1db0444 100644 --- a/pkg/service/discovery_service.go +++ b/pkg/service/discovery_service.go @@ -56,8 +56,6 @@ var EmptyDiscoveryResponse = &DiscoveryResponse{} type ApiDiscoveryService interface { AddApi(request DiscoveryRequest) (DiscoveryResponse, error) GetApi(request DiscoveryRequest) (DiscoveryResponse, error) - RemoveApi(name string) error - RemoveAllApi() error } // DiscoveryService is come from envoy, it can used for admin From caa82669e27b5ff5a9b7d4e6332d12227bc9f529 Mon Sep 17 00:00:00 2001 From: zhangshen023 <1292369127@qq.com> Date: Wed, 14 Oct 2020 21:09:26 +0800 Subject: [PATCH 143/227] revert --- pkg/model/bootstrap.go | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/pkg/model/bootstrap.go b/pkg/model/bootstrap.go index a4f3124a7..d61689694 100644 --- a/pkg/model/bootstrap.go +++ b/pkg/model/bootstrap.go @@ -1,3 +1,20 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + */ + package model // Bootstrap the door From c49c924375a51fdb3575eb0a199bdd3d4aa7ce4d Mon Sep 17 00:00:00 2001 From: williamfeng323 Date: Wed, 14 Oct 2020 23:54:48 +0800 Subject: [PATCH 144/227] update the dubbo client to use new dubbo server config format --- cmd/proxy/control.go | 11 ++++- configs/api_config.yaml | 25 +++------- configs/client.yml | 50 ++++++++----------- pkg/client/dubbo/dubbo_client.go | 48 ++++++++---------- pkg/client/request.go | 8 +-- pkg/common/extension/discovery_service.go | 10 ++-- pkg/common/yaml/yaml.go | 5 +- pkg/config/api_config.go | 22 +++++++-- pkg/filter/dubbo_filter.go | 2 +- pkg/proxy/listener.go | 2 +- pkg/proxy/listener_test.go | 2 +- pkg/proxy/proxy_start.go | 55 +-------------------- pkg/service/api/discovery_service.go | 59 +++-------------------- pkg/service/api/discovery_service_test.go | 4 +- pkg/service/discovery_service.go | 6 +-- 15 files changed, 102 insertions(+), 207 deletions(-) diff --git a/cmd/proxy/control.go b/cmd/proxy/control.go index afd0de0ff..6b3f2ca0f 100644 --- a/cmd/proxy/control.go +++ b/cmd/proxy/control.go @@ -51,6 +51,12 @@ var ( EnvVar: "DUBBOGO_PROXY_CONFIG", Value: "configs/conf.yaml", }, + cli.StringFlag{ + Name: "api-config, a", + Usage: "Load api configuration from `FILE`", + EnvVar: "DUBBOGO_PROXY_API_CONFIG", + Value: "configs/api_config.yaml", + }, cli.StringFlag{ Name: "log-config, lc", Usage: "Load log configuration from `FILE`", @@ -73,6 +79,7 @@ var ( }, Action: func(c *cli.Context) error { configPath := c.String("config") + apiConfigPath := c.String("api-config") flagLogLevel := c.String("log-level") logConfPath := c.String("log-config") @@ -80,8 +87,10 @@ var ( if logLevel, ok := flagToLogLevel[flagLogLevel]; ok { logger.SetLoggerLevel(logLevel) } - logger.InitLog(logConfPath) + if _, err := config.LoadAPIConfigFromFile(apiConfigPath); err != nil { + logger.Info(err.Error()) + } limitCpus := c.Int("limit-cpus") if limitCpus <= 0 { diff --git a/configs/api_config.yaml b/configs/api_config.yaml index 2cf1faee8..ba96ba899 100644 --- a/configs/api_config.yaml +++ b/configs/api_config.yaml @@ -8,35 +8,22 @@ resources: - filter0 methods: - httpVerb: GET - filters: - - filterA - - filterB onAir: true inboundRequest: requestType: http - headers: - - name: auth - required: true queryStrings: - name: id required: false - - name: type - required: false - requestBody: - - definitionName: modelDefinition integrationRequest: - requestType: dubbo + requestType: DUBBO mappingParams: - name: queryStrings.id mapTo: 1 - applicationName: BDTService - group: test - version: 1.0.0 - interface: com.ikurento.user.UserProvider - Method: GetUser - paramTypes: - - java.lang.String - ClusterName: test_dubbo + applicationName: "BDTService" + interface: "com.ikurento.user.UserProvider" + method: "GetUser" + clusterName: "test_dubbo" + definitions: - name: modelDefinition schema: >- diff --git a/configs/client.yml b/configs/client.yml index 17e323f2d..129c4f056 100644 --- a/configs/client.yml +++ b/configs/client.yml @@ -3,44 +3,37 @@ check: true # client -request_timeout: "10s" +request_timeout : "3s" # connect timeout -connect_timeout: "3s" +connect_timeout : "3s" # application config application: - organization: "dubbogo" - name: "dubbo-go-proxy" - module: "dubbo-go-proxy" - version: "1.0.0" - group: "test" - owner: "PTY" - environment: "dev" + organization : "dubbo-go-proxy" + name : "DubboGoProxy" + module : "dubbogo proxy client" + version : "0.0.1" + owner : "DubboGoProxy" + environment : "dev" -registries: - "zk_1": +registries : + "hangzhouzk": protocol: "zookeeper" - timeout: "3s" - address: "127.0.0.1:2182" + timeout : "3s" + address: "127.0.0.1:2181" username: "" password: "" + references: protocol_conf: dubbo: reconnect_interval: 0 connection_number: 2 - heartbeat_period: "30s" - session_timeout: "360s" - fail_fast_timeout: "5s" - pool_size: 4 + heartbeat_period: "5s" + session_timeout: "20s" + pool_size: 64 pool_ttl: 600 - # gr_pool_size is recommended to be set to [cpu core number] * 100 - gr_pool_size: 200 - # queue_len is recommended to be set to 64 or 128 - queue_len: 64 - # queue_number is recommended to be set to gr_pool_size / 20 - queue_number: 10 getty_session_param: compress_encoding: false tcp_no_delay: true @@ -48,10 +41,9 @@ protocol_conf: keep_alive_period: "120s" tcp_r_buf_size: 262144 tcp_w_buf_size: 65536 - pkg_rq_size: 1024 pkg_wq_size: 512 - tcp_read_timeout: "1s" #1 - tcp_write_timeout: "5s" #5 - wait_timeout: "5s" - max_msg_len: 10240000 - session_name: "client" + tcp_read_timeout: "1s" + tcp_write_timeout: "5s" + wait_timeout: "1s" + max_msg_len: 10240 + session_name: "client" \ No newline at end of file diff --git a/pkg/client/dubbo/dubbo_client.go b/pkg/client/dubbo/dubbo_client.go index 0d4a1bf98..9fec9c777 100644 --- a/pkg/client/dubbo/dubbo_client.go +++ b/pkg/client/dubbo/dubbo_client.go @@ -33,6 +33,7 @@ import ( import ( "github.com/dubbogo/dubbo-go-proxy/pkg/client" + "github.com/dubbogo/dubbo-go-proxy/pkg/config" "github.com/dubbogo/dubbo-go-proxy/pkg/logger" ) @@ -42,20 +43,6 @@ const ( JavaLangClassName = "java.lang.Long" ) -// DubboMetadata dubbo metadata, api config -type DubboMetadata struct { - ApplicationName string `yaml:"application_name" json:"application_name" mapstructure:"application_name"` - Group string `yaml:"group" json:"group" mapstructure:"group"` - Version string `yaml:"version" json:"version" mapstructure:"version"` - Interface string `yaml:"interface" json:"interface" mapstructure:"interface"` - Method string `yaml:"method" json:"method" mapstructure:"method"` - Types []string `yaml:"types" json:"types" mapstructure:"types"` - Retries string `yaml:"retries" json:"retries,omitempty" property:"retries"` - ClusterName string `yaml:"cluster_name" json:"cluster_name,omitempty" property:"cluster_name"` - ProtocolTypeStr string `yaml:"protocol_type" json:"protocol_type,omitempty" property:"protocol_type"` - SerializationTypeStr string `yaml:"serialization_type" json:"serialization_type,omitempty" property:"serialization_type"` -} - var ( _DubboClient *DubboClient onceClient = sync.Once{} @@ -90,6 +77,7 @@ func NewDubboClient() *DubboClient { // Init init dubbo, config mapping can do here func (dc *DubboClient) Init() error { dgCfg = dg.GetConsumerConfig() + //can change config here dg.SetConsumerConfig(dgCfg) dg.Load() dc.GenericServicePool = make(map[string]*dg.GenericService) @@ -103,15 +91,15 @@ func (dc *DubboClient) Close() error { // Call invoke service func (dc *DubboClient) Call(r *client.Request) (resp client.Response, err error) { - dm := r.Api.Metadata.(*DubboMetadata) + dm := r.API.Method.IntegrationRequest gs := dc.Get(dm.Interface, dm.Version, dm.Group, dm) var reqData []interface{} - l := len(dm.Types) + l := len(dm.ParamTypes) switch { case l == 1: - t := dm.Types[0] + t := dm.ParamTypes[0] switch t { case JavaStringClassName: var s string @@ -141,14 +129,18 @@ func (dc *DubboClient) Call(r *client.Request) (resp client.Response, err error) } } - logger.Debugf("[dubbogo proxy] invoke, method:%v, types:%v, reqData:%v", dm.Method, dm.Types, reqData) + logger.Debugf("[dubbogo proxy] invoke, method:%s, types:%s, reqData:%s", dm.Method, dm.ParamTypes, reqData) - if resp, err := gs.Invoke(context.Background(), []interface{}{dm.Method, dm.Types, reqData}); err != nil { + rst, err := gs.Invoke(context.Background(), []interface{}{dm.Method, dm.ParamTypes, reqData}) + if err != nil { return *client.EmptyResponse, err - } else { - logger.Debugf("[dubbogo proxy] dubbo client resp:%v", resp) - return *NewDubboResponse(resp), nil } + if rst == nil { + return client.Response{}, nil + } + resp = rst.(client.Response) + logger.Debugf("[dubbogo proxy] dubbo client resp:%v", resp) + return *NewDubboResponse(resp), nil } func (dc *DubboClient) get(key string) *dg.GenericService { @@ -167,7 +159,7 @@ func (dc *DubboClient) check(key string) bool { } } -func (dc *DubboClient) create(key string, dm *DubboMetadata) *dg.GenericService { +func (dc *DubboClient) create(key string, dm config.IntegrationRequest) *dg.GenericService { referenceConfig := dg.NewReferenceConfig(dm.Interface, context.TODO()) referenceConfig.InterfaceName = dm.Interface referenceConfig.Cluster = constant.DEFAULT_CLUSTER @@ -177,10 +169,10 @@ func (dc *DubboClient) create(key string, dm *DubboMetadata) *dg.GenericService } referenceConfig.Registry = strings.Join(registers, ",") - if dm.ProtocolTypeStr == "" { + if dm.Protocol == "" { referenceConfig.Protocol = dubbo.DUBBO } else { - referenceConfig.Protocol = dm.ProtocolTypeStr + referenceConfig.Protocol = dm.Protocol } referenceConfig.Version = dm.Version @@ -202,11 +194,11 @@ func (dc *DubboClient) create(key string, dm *DubboMetadata) *dg.GenericService } // Get find a dubbo GenericService -func (dc *DubboClient) Get(interfaceName, version, group string, dm *DubboMetadata) *dg.GenericService { +func (dc *DubboClient) Get(interfaceName, version, group string, dm config.IntegrationRequest) *dg.GenericService { key := strings.Join([]string{dm.ApplicationName, interfaceName, version, group}, "_") if dc.check(key) { return dc.get(key) - } else { - return dc.create(key, dm) } + + return dc.create(key, dm) } diff --git a/pkg/client/request.go b/pkg/client/request.go index 2ab3ce055..c8623ff15 100644 --- a/pkg/client/request.go +++ b/pkg/client/request.go @@ -18,20 +18,20 @@ package client import ( - "github.com/dubbogo/dubbo-go-proxy/pkg/model" + "github.com/dubbogo/dubbo-go-proxy/pkg/router" ) // Request request for endpoint type Request struct { Body []byte Header map[string]string - Api *model.Api + API *router.API } // NewRequest create a request -func NewRequest(b []byte, api *model.Api) *Request { +func NewRequest(b []byte, api *router.API) *Request { return &Request{ Body: b, - Api: api, + API: api, } } diff --git a/pkg/common/extension/discovery_service.go b/pkg/common/extension/discovery_service.go index 032978468..a0817df8c 100644 --- a/pkg/common/extension/discovery_service.go +++ b/pkg/common/extension/discovery_service.go @@ -22,17 +22,17 @@ import ( ) var ( - apiDiscoveryServiceMap = map[string]service.ApiDiscoveryService{} + apiDiscoveryServiceMap = map[string]service.APIDiscoveryService{} ) -// SetApiDiscoveryService will store the @filter and @name -func SetApiDiscoveryService(name string, ads service.ApiDiscoveryService) { +// SetAPIDiscoveryService will store the @filter and @name +func SetAPIDiscoveryService(name string, ads service.APIDiscoveryService) { apiDiscoveryServiceMap[name] = ads } -// GetMustApiDiscoveryService will return the service.ApiDiscoveryService +// GetMustAPIDiscoveryService will return the service.APIDiscoveryService // if not found, it will panic -func GetMustApiDiscoveryService(name string) service.ApiDiscoveryService { +func GetMustAPIDiscoveryService(name string) service.APIDiscoveryService { if ds, ok := apiDiscoveryServiceMap[name]; ok { return ds } diff --git a/pkg/common/yaml/yaml.go b/pkg/common/yaml/yaml.go index 47c65123f..0e2b3ab25 100644 --- a/pkg/common/yaml/yaml.go +++ b/pkg/common/yaml/yaml.go @@ -32,9 +32,8 @@ func LoadYMLConfig(confProFile string) ([]byte, error) { if len(confProFile) == 0 { return nil, perrors.Errorf("configure file name is nil") } - - if path.Ext(confProFile) != ".yml" { - return nil, perrors.Errorf("configure file name{%v} suffix must be .yml", confProFile) + if path.Ext(confProFile) != ".yml" && path.Ext(confProFile) != ".yaml" { + return nil, perrors.Errorf("configure file name{%v} suffix must be .yml or .yaml", confProFile) } return ioutil.ReadFile(confProFile) diff --git a/pkg/config/api_config.go b/pkg/config/api_config.go index 8b0f49226..d5784edf0 100644 --- a/pkg/config/api_config.go +++ b/pkg/config/api_config.go @@ -24,6 +24,12 @@ import ( import ( "github.com/dubbogo/dubbo-go-proxy/pkg/common/yaml" "github.com/dubbogo/dubbo-go-proxy/pkg/logger" + "sync" +) + +var ( + apiConfig *APIConfig + once sync.Once ) // HTTPVerb defines the restful api http verb @@ -107,8 +113,8 @@ type BodyDefinition struct { // IntegrationRequest defines the backend request format and target type IntegrationRequest struct { RequestType `json:"requestType" yaml:"requestType"` // dubbo, TO-DO: http - MappingParams []MappingParam `json:"mappingParams,omitempty" yaml:"mappingParams,omitempty"` DubboBackendConfig `json:"dubboBackendConfig,inline,omitempty" yaml:"dubboBackendConfig,inline,omitempty"` + MappingParams []MappingParam `json:"mappingParams,omitempty" yaml:"mappingParams,omitempty"` } // MappingParam defines the mapping rules of headers and queryStrings @@ -119,13 +125,15 @@ type MappingParam struct { // DubboBackendConfig defines the basic dubbo backend config type DubboBackendConfig struct { + ClusterName string `yaml:"clusterName" json:"clusterName"` ApplicationName string `yaml:"applicationName" json:"applicationName"` + Protocol string `yaml:"protocol" json:"protocol,omitempty" default:"dubbo"` Group string `yaml:"group" json:"group"` Version string `yaml:"version" json:"version"` Interface string `yaml:"interface" json:"interface"` - Method string `yaml:"method" json:"method" mapstructure:"method"` - ClusterName string `yaml:"clusterName" json:"clusterName,omitempty"` + Method string `yaml:"method" json:"method"` ParamTypes []string `yaml:"paramTypes" json:"paramTypes"` + Retries string `yaml:"retries" json:"retries,omitempty"` } // Definition defines the complex json request body @@ -145,5 +153,13 @@ func LoadAPIConfigFromFile(path string) (*APIConfig, error) { if err != nil { return nil, perrors.Errorf("unmarshalYmlConfig error %v", perrors.WithStack(err)) } + once.Do(func() { + apiConfig = apiConf + }) return apiConf, nil } + +// GetAPIConf returns the initted api config +func GetAPIConf() APIConfig { + return *apiConfig +} diff --git a/pkg/filter/dubbo_filter.go b/pkg/filter/dubbo_filter.go index 5950850af..be1af73fc 100644 --- a/pkg/filter/dubbo_filter.go +++ b/pkg/filter/dubbo_filter.go @@ -51,7 +51,7 @@ func HttpDubbo() context.FilterFunc { } func doDubbo(c *http.HttpContext) { - api := c.GetApi() + api := c.GetAPI() if bytes, err := ioutil.ReadAll(c.Request.Body); err != nil { logger.Errorf("[dubboproxy go] read body err:%v!", err) diff --git a/pkg/proxy/listener.go b/pkg/proxy/listener.go index 81ed3be66..f7bd449c9 100644 --- a/pkg/proxy/listener.go +++ b/pkg/proxy/listener.go @@ -141,7 +141,7 @@ func (s *DefaultHttpListener) ServeHTTP(w http.ResponseWriter, r *http.Request) } func (s *DefaultHttpListener) routeRequest(ctx *h.HttpContext, req *http.Request) (router.API, error) { - apiDiscSrv := extension.GetMustApiDiscoveryService(constant.LocalMemoryApiDiscoveryService) + apiDiscSrv := extension.GetMustAPIDiscoveryService(constant.LocalMemoryApiDiscoveryService) api, err := apiDiscSrv.GetAPI(req.URL.Path, config.HTTPVerb(req.Method)) if err != nil { ctx.WriteWithStatus(http.StatusNotFound, constant.Default404Body) diff --git a/pkg/proxy/listener_test.go b/pkg/proxy/listener_test.go index 52d5a4310..d9557858e 100644 --- a/pkg/proxy/listener_test.go +++ b/pkg/proxy/listener_test.go @@ -79,7 +79,7 @@ func TestRouteRequest(t *testing.T) { mockAPI := getMockAPI(config.MethodPost, "/mock/test") mockAPI.Method.OnAir = false - apiDiscoverySrv := extension.GetMustApiDiscoveryService(constant.LocalMemoryApiDiscoveryService) + apiDiscoverySrv := extension.GetMustAPIDiscoveryService(constant.LocalMemoryApiDiscoveryService) apiDiscoverySrv.AddAPI(mockAPI) apiDiscoverySrv.AddAPI(getMockAPI(config.MethodGet, "/mock/test")) diff --git a/pkg/proxy/proxy_start.go b/pkg/proxy/proxy_start.go index 9b87e0d9c..609c14bd3 100644 --- a/pkg/proxy/proxy_start.go +++ b/pkg/proxy/proxy_start.go @@ -18,20 +18,16 @@ package proxy import ( - "encoding/json" "sync" ) import ( "github.com/dubbogo/dubbo-go-proxy/pkg/client/dubbo" - "github.com/dubbogo/dubbo-go-proxy/pkg/common/constant" - "github.com/dubbogo/dubbo-go-proxy/pkg/common/extension" "github.com/dubbogo/dubbo-go-proxy/pkg/config" _ "github.com/dubbogo/dubbo-go-proxy/pkg/filter" "github.com/dubbogo/dubbo-go-proxy/pkg/logger" "github.com/dubbogo/dubbo-go-proxy/pkg/model" - "github.com/dubbogo/dubbo-go-proxy/pkg/service" - _ "github.com/dubbogo/dubbo-go-proxy/pkg/service/api" + "github.com/dubbogo/dubbo-go-proxy/pkg/service/api" ) // Proxy @@ -65,54 +61,7 @@ func (p *Proxy) Start() { func (p *Proxy) beforeStart() { dubbo.SingleDubboClient().Init() - // TODO mock api register - ads := extension.GetMustApiDiscoveryService(constant.LocalMemoryApiDiscoveryService) - - a1 := &model.Api{ - Name: "/api/v1/test-dubbo/user", - ITypeStr: "HTTP", - OTypeStr: "DUBBO", - Method: "POST", - Status: 1, - Metadata: map[string]dubbo.DubboMetadata{ - "dubbo": { - ApplicationName: "BDTService", - Group: "test", - Version: "1.0.0", - Interface: "com.ikurento.user.UserProvider", - Method: "queryUser", - Types: []string{ - "com.ikurento.user.User", - }, - ClusterName: "test_dubbo", - }, - }, - } - a2 := &model.Api{ - Name: "/api/v1/test-dubbo/getUserByName", - ITypeStr: "HTTP", - OTypeStr: "DUBBO", - Method: "POST", - Status: 1, - Metadata: map[string]dubbo.DubboMetadata{ - "dubbo": { - ApplicationName: "BDTService", - Group: "test", - Version: "1.0.0", - Interface: "com.ikurento.user.UserProvider", - Method: "GetUser", - Types: []string{ - "java.lang.String", - }, - ClusterName: "test_dubbo", - }, - }, - } - - j1, _ := json.Marshal(a1) - j2, _ := json.Marshal(a2) - ads.AddApi(*service.NewDiscoveryRequest(j1)) - ads.AddApi(*service.NewDiscoveryRequest(j2)) + api.InitAPIsFromConfig(config.GetAPIConf()) } // NewProxy create proxy diff --git a/pkg/service/api/discovery_service.go b/pkg/service/api/discovery_service.go index 2e072a0ea..043152bb6 100644 --- a/pkg/service/api/discovery_service.go +++ b/pkg/service/api/discovery_service.go @@ -18,29 +18,24 @@ package api import ( - "encoding/json" + "fmt" ) import ( - "github.com/goinggo/mapstructure" "github.com/pkg/errors" ) import ( - "fmt" - "github.com/dubbogo/dubbo-go-proxy/pkg/client/dubbo" "github.com/dubbogo/dubbo-go-proxy/pkg/common/constant" "github.com/dubbogo/dubbo-go-proxy/pkg/common/extension" "github.com/dubbogo/dubbo-go-proxy/pkg/config" - "github.com/dubbogo/dubbo-go-proxy/pkg/logger" - "github.com/dubbogo/dubbo-go-proxy/pkg/model" "github.com/dubbogo/dubbo-go-proxy/pkg/router" "github.com/dubbogo/dubbo-go-proxy/pkg/service" "strings" ) func init() { - extension.SetApiDiscoveryService(constant.LocalMemoryApiDiscoveryService, NewLocalMemoryAPIDiscoveryService()) + extension.SetAPIDiscoveryService(constant.LocalMemoryApiDiscoveryService, NewLocalMemoryAPIDiscoveryService()) } // LocalMemoryAPIDiscoveryService is the local cached API discovery service @@ -55,48 +50,6 @@ func NewLocalMemoryAPIDiscoveryService() *LocalMemoryAPIDiscoveryService { } } -// AddApi adds a method to the router tree -func (ads *LocalMemoryAPIDiscoveryService) AddApi(request service.DiscoveryRequest) (service.DiscoveryResponse, error) { - aj := model.NewApi() - if err := json.Unmarshal(request.Body, aj); err != nil { - return *service.EmptyDiscoveryResponse, err - } - - if _, loaded := model.CacheApi.LoadOrStore(aj.Name, aj); loaded { - // loaded - logger.Warnf("api:%s is exist", aj) - } else { - // store - if aj.Metadata == nil { - - } else { - if v, ok := aj.Metadata.(map[string]interface{}); ok { - if d, ok := v["dubbo"]; ok { - dm := &dubbo.DubboMetadata{} - if err := mapstructure.Decode(d, dm); err != nil { - return *service.EmptyDiscoveryResponse, err - } - aj.Metadata = dm - } - } - - aj.RequestMethod = model.RequestMethod(model.RequestMethodValue[aj.Method]) - } - } - - return *service.NewDiscoveryResponseWithSuccess(true), nil -} - -func (ads *LocalMemoryAPIDiscoveryService) GetApi(request service.DiscoveryRequest) (service.DiscoveryResponse, error) { - n := string(request.Body) - - if a, ok := model.CacheApi.Load(n); ok { - return *service.NewDiscoveryResponse(a), nil - } - - return *service.EmptyDiscoveryResponse, errors.New("not found") -} - // AddAPI adds a method to the router tree func (ads *LocalMemoryAPIDiscoveryService) AddAPI(api router.API) error { return ads.router.PutAPI(api) @@ -112,15 +65,15 @@ func (ads *LocalMemoryAPIDiscoveryService) GetAPI(url string, httpVerb config.HT } // InitAPIsFromConfig inits the router from API config and to local cache -func InitAPIsFromConfig(apiConfig *config.APIConfig) error { - localAPIDiscSrv := extension.GetMustApiDiscoveryService(constant.LocalMemoryApiDiscoveryService) +func InitAPIsFromConfig(apiConfig config.APIConfig) error { + localAPIDiscSrv := extension.GetMustAPIDiscoveryService(constant.LocalMemoryApiDiscoveryService) if len(apiConfig.Resources) == 0 { return nil } return loadAPIFromResource("", apiConfig.Resources, localAPIDiscSrv) } -func loadAPIFromResource(parrentPath string, resources []config.Resource, localSrv service.ApiDiscoveryService) error { +func loadAPIFromResource(parrentPath string, resources []config.Resource, localSrv service.APIDiscoveryService) error { errStack := []string{} if len(resources) == 0 { return nil @@ -151,7 +104,7 @@ func loadAPIFromResource(parrentPath string, resources []config.Resource, localS return nil } -func loadAPIFromMethods(fullPath string, methods []config.Method, localSrv service.ApiDiscoveryService) error { +func loadAPIFromMethods(fullPath string, methods []config.Method, localSrv service.APIDiscoveryService) error { errStack := []string{} for _, method := range methods { api := router.API{ diff --git a/pkg/service/api/discovery_service_test.go b/pkg/service/api/discovery_service_test.go index f52a5a841..ae8b14f1f 100644 --- a/pkg/service/api/discovery_service_test.go +++ b/pkg/service/api/discovery_service_test.go @@ -75,9 +75,9 @@ func TestGetAPI(t *testing.T) { func TestLoadAPI(t *testing.T) { apiC, err := config.LoadAPIConfigFromFile("../../config/mock/api_config.yml") assert.Empty(t, err) - err = InitAPIsFromConfig(apiC) + err = InitAPIsFromConfig(*apiC) assert.Nil(t, err) - apiDisSrv := extension.GetMustApiDiscoveryService(constant.LocalMemoryApiDiscoveryService) + apiDisSrv := extension.GetMustAPIDiscoveryService(constant.LocalMemoryApiDiscoveryService) rsp, err := apiDisSrv.GetAPI("/", config.MethodGet) assert.NotNil(t, rsp.URLPattern) rsp, err = apiDisSrv.GetAPI("/mockTest", config.MethodGet) diff --git a/pkg/service/discovery_service.go b/pkg/service/discovery_service.go index 251b91afe..9b928b4c4 100644 --- a/pkg/service/discovery_service.go +++ b/pkg/service/discovery_service.go @@ -57,10 +57,8 @@ func NewDiscoveryResponse(d interface{}) *DiscoveryResponse { var EmptyDiscoveryResponse = &DiscoveryResponse{} -// ApiDiscoveryService api discovery service interface -type ApiDiscoveryService interface { - AddApi(request DiscoveryRequest) (DiscoveryResponse, error) - GetApi(request DiscoveryRequest) (DiscoveryResponse, error) +// APIDiscoveryService api discovery service interface +type APIDiscoveryService interface { AddAPI(router.API) error GetAPI(string, config.HTTPVerb) (router.API, error) } From da8f7b7e858795f9134fb038d1aa5113617303ee Mon Sep 17 00:00:00 2001 From: tiecheng Date: Thu, 15 Oct 2020 13:13:17 +0800 Subject: [PATCH 145/227] timeout filter --- pkg/context/base_context.go | 10 ++++ pkg/context/http/context.go | 2 + pkg/filter/timeout/timeout.go | 86 +++++++++++++++++++++++++++++++++-- 3 files changed, 93 insertions(+), 5 deletions(-) diff --git a/pkg/context/base_context.go b/pkg/context/base_context.go index 940180184..f9b5962f3 100644 --- a/pkg/context/base_context.go +++ b/pkg/context/base_context.go @@ -19,6 +19,7 @@ package context import ( "math" + "time" ) const abortIndex int8 = math.MaxInt8 / 2 @@ -28,6 +29,7 @@ type BaseContext struct { Context Index int8 Filters FilterChain + Timeout *time.Duration } func NewBaseContext() *BaseContext { @@ -54,3 +56,11 @@ func (c *BaseContext) AppendFilterFunc(ff ...FilterFunc) { c.Filters = append(c.Filters, v) } } + +func (c *BaseContext) GetTimeout(t *time.Duration) time.Duration { + if t == nil { + return 3 * time.Second + } + + return *t +} diff --git a/pkg/context/http/context.go b/pkg/context/http/context.go index b07564c9f..f6515a4f7 100644 --- a/pkg/context/http/context.go +++ b/pkg/context/http/context.go @@ -20,6 +20,7 @@ package http import ( "encoding/json" "net/http" + "sync" ) import ( @@ -41,6 +42,7 @@ type HttpContext struct { Request *http.Request writermem responseWriter Writer ResponseWriter + Lock sync.Mutex } // Next logic for lookup filter diff --git a/pkg/filter/timeout/timeout.go b/pkg/filter/timeout/timeout.go index 7c66bfe16..cb201e96a 100644 --- a/pkg/filter/timeout/timeout.go +++ b/pkg/filter/timeout/timeout.go @@ -1,12 +1,43 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + */ + package timeout import ( + "context" + "encoding/json" + "fmt" + "net/http" + "time" + "github.com/dubbogo/dubbo-go-proxy/pkg/common/constant" "github.com/dubbogo/dubbo-go-proxy/pkg/common/extension" - "github.com/dubbogo/dubbo-go-proxy/pkg/context" - "time" + selfcontext "github.com/dubbogo/dubbo-go-proxy/pkg/context" + contexthttp "github.com/dubbogo/dubbo-go-proxy/pkg/context/http" +) + +const ( + // timeout code + HandlerFuncTimeout = "E509" + // unknown code + ErrUnknownError = "E003" ) +// TODO 改初始化的时候注入 func init() { extension.SetFilterFunc(constant.TimeoutFilter, NewTimeoutFilter().Run()) } @@ -16,7 +47,7 @@ type timeoutFilter struct { waitTime time.Duration } -// NewTimeoutFilter create filter. +// NewTimeoutFilter create timeout filter. func NewTimeoutFilter() *timeoutFilter { return &timeoutFilter{ waitTime: time.Minute, @@ -24,8 +55,53 @@ func NewTimeoutFilter() *timeoutFilter { } // DoFilter do filter. -func (f *timeoutFilter) Run() context.FilterFunc { - return func(c context.Context) { +func (f *timeoutFilter) Run() selfcontext.FilterFunc { + return func(c selfcontext.Context) { + hc := c.(*contexthttp.HttpContext) + ctx, cancel := context.WithTimeout(context.Background(), hc.GetTimeout(hc.Timeout)) + + // Channel capacity must be greater than 0. + // Otherwise, if the parent coroutine quit due to timeout, + // the child coroutine may never be able to quit. + finish := make(chan struct{}, 1) + panicChan := make(chan interface{}, 1) + go func() { + // 变动点1: 增加子协程的recover + defer func() { + if p := recover(); p != nil { + panicChan <- p + } + }() + c.Next() + finish <- struct{}{} + }() + + select { + case p := <-panicChan: + bt, _ := json.Marshal(errResponse{Code: ErrUnknownError, + Msg: fmt.Sprintf("unknow internal error, %v", p)}) + c.WriteWithStatus(http.StatusInternalServerError, bt) + c.Abort() + case <-ctx.Done(): + hc.Lock.Lock() + defer hc.Lock.Unlock() + + bt, _ := json.Marshal(errResponse{Code: HandlerFuncTimeout, + Msg: http.ErrHandlerTimeout.Error()}) + c.WriteWithStatus(http.StatusInternalServerError, bt) + c.Abort() + cancel() + // If timeout happen, the buffer cannot be cleared actively, + // but wait for the GC to recycle. + case <-finish: + hc.Lock.Lock() + defer hc.Lock.Unlock() + } } } + +type errResponse struct { + Code string `json:"code"` + Msg string `json:"msg"` +} From a929c0d0e82598f424a115391121ddd941194864 Mon Sep 17 00:00:00 2001 From: zhangshen023 <1292369127@qq.com> Date: Fri, 16 Oct 2020 08:20:35 +0800 Subject: [PATCH 146/227] registry center --- configs/conf.yaml | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/configs/conf.yaml b/configs/conf.yaml index 8a8ebc993..ab48f6cbb 100644 --- a/configs/conf.yaml +++ b/configs/conf.yaml @@ -44,6 +44,14 @@ static_resources: write_timeout: 5s clusters: - name: "test_dubbo" - type: "EDS" lb_policy: "RoundRobin" connect_timeout: "5s" + registries: + "zookeeper": + - timeout: "3s" + address: "127.0.0.1:2182" + username: "" + password: "" + "consul": + - timeout: "3s" + address: "127.0.0.1:8500" From 678c4ae84f75f69d42902eab60b01916f083237e Mon Sep 17 00:00:00 2001 From: shen <1292369127@qq.com> Date: Fri, 16 Oct 2020 11:09:56 +0800 Subject: [PATCH 147/227] remove dubbogo config file --- configs/conf.yaml | 5 +++++ pkg/config/conf_test.yaml | 15 ++++++++++++++- pkg/model/bootstrap.go | 11 +++++++++-- pkg/model/cluster.go | 27 ++++++++++++++++++--------- 4 files changed, 46 insertions(+), 12 deletions(-) diff --git a/configs/conf.yaml b/configs/conf.yaml index ab48f6cbb..a8d1b12de 100644 --- a/configs/conf.yaml +++ b/configs/conf.yaml @@ -46,6 +46,7 @@ static_resources: - name: "test_dubbo" lb_policy: "RoundRobin" connect_timeout: "5s" + request_timeout: "10s" registries: "zookeeper": - timeout: "3s" @@ -55,3 +56,7 @@ static_resources: "consul": - timeout: "3s" address: "127.0.0.1:8500" + shutdown_config: + timeout: "60s" + step_timeout: "10s" + reject_policy: "immediacy" \ No newline at end of file diff --git a/pkg/config/conf_test.yaml b/pkg/config/conf_test.yaml index 8a8ebc993..c310efe5e 100644 --- a/pkg/config/conf_test.yaml +++ b/pkg/config/conf_test.yaml @@ -44,6 +44,19 @@ static_resources: write_timeout: 5s clusters: - name: "test_dubbo" - type: "EDS" lb_policy: "RoundRobin" connect_timeout: "5s" + request_timeout: "10s" + registries: + "zookeeper": + timeout: "3s" + address: "127.0.0.1:2182" + username: "" + password: "" + "consul": + timeout: "3s" + address: "127.0.0.1:8500" + shutdown_config: + timeout: "60s" + step_timeout: "10s" + reject_policy: "immediacy" diff --git a/pkg/model/bootstrap.go b/pkg/model/bootstrap.go index d61689694..38716ddbb 100644 --- a/pkg/model/bootstrap.go +++ b/pkg/model/bootstrap.go @@ -44,10 +44,17 @@ func (bs *Bootstrap) ExistCluster(name string) bool { // StaticResources type StaticResources struct { - Listeners []Listener `yaml:"listeners" json:"listeners" mapstructure:"listeners"` - Clusters []Cluster `yaml:"clusters" json:"clusters" mapstructure:"clusters"` + Listeners []Listener `yaml:"listeners" json:"listeners" mapstructure:"listeners"` + Clusters []Cluster `yaml:"clusters" json:"clusters" mapstructure:"clusters"` + ShutdownConfig *ShutdownConfig `yaml:"shutdown_config" json:"shutdown_config" mapstructure:"shutdown_config"` } // DynamicResources TODO type DynamicResources struct { } + +type ShutdownConfig struct { + Timeout string `default:"60s" yaml:"timeout" json:"timeout,omitempty"` + StepTimeout string `default:"10s" yaml:"step_timeout" json:"step_timeout,omitempty"` + RejectPolicy string `yaml:"reject_policy" json:"reject_policy,omitempty"` +} diff --git a/pkg/model/cluster.go b/pkg/model/cluster.go index 3b476b244..21f037606 100644 --- a/pkg/model/cluster.go +++ b/pkg/model/cluster.go @@ -19,15 +19,17 @@ package model // Cluster a single upstream cluster type Cluster struct { - Name string `yaml:"name" json:"name"` // Name the cluster unique name - TypeStr string `yaml:"type" json:"type"` // Type the cluster discovery type string value - Type DiscoveryType `yaml:"omitempty" json:"omitempty"` // Type the cluster discovery type - EdsClusterConfig EdsClusterConfig `yaml:"eds_cluster_config" json:"eds_cluster_config"` - LbStr string `yaml:"lb_policy" json:"lb_policy"` // Lb the cluster select node used loadBalance policy - Lb LbPolicy `yaml:"omitempty" json:"omitempty"` // Lb the cluster select node used loadBalance policy - ConnectTimeoutStr string `yaml:"connect_timeout" json:"connect_timeout"` // ConnectTimeout timeout for connect to cluster node - HealthChecks []HealthCheck `yaml:"health_checks" json:"health_checks"` - Hosts []Address `yaml:"hosts" json:"hosts"` // Hosts whe discovery type is Static, StrictDNS or LogicalDns,this need config + Name string `yaml:"name" json:"name"` // Name the cluster unique name + TypeStr string `yaml:"type" json:"type"` // Type the cluster discovery type string value + Type DiscoveryType `yaml:"omitempty" json:"omitempty"` // Type the cluster discovery type + EdsClusterConfig EdsClusterConfig `yaml:"eds_cluster_config" json:"eds_cluster_config"` + LbStr string `yaml:"lb_policy" json:"lb_policy"` // Lb the cluster select node used loadBalance policy + Lb LbPolicy `yaml:"omitempty" json:"omitempty"` // Lb the cluster select node used loadBalance policy + ConnectTimeoutStr string `yaml:"connect_timeout" json:"connect_timeout"` // ConnectTimeout timeout for connect to cluster node + HealthChecks []HealthCheck `yaml:"health_checks" json:"health_checks"` + Hosts []Address `yaml:"hosts" json:"hosts"` // Hosts whe discovery type is Static, StrictDNS or LogicalDns,this need config + RequestTimeout string `yaml:"request_timeout" json:"request_timeout"` + Registries map[string]Registry `yaml:"registries" json:"registries"` } // DiscoveryType @@ -64,3 +66,10 @@ type EdsClusterConfig struct { EdsConfig ConfigSource `yaml:"eds_config" json:"eds_config" mapstructure:"eds_config"` ServiceName string `yaml:"service_name" json:"service_name" mapstructure:"service_name"` } + +type Registry struct { + Timeout string `yaml:"timeout" json:"timeout"` + Address string `yaml:"address" json:"address"` + Username string `yaml:"username" json:"username"` + Password string `yaml:"password" json:"password"` +} From 47b292720e293ff941443cc660818d53f190b018 Mon Sep 17 00:00:00 2001 From: shen <1292369127@qq.com> Date: Fri, 16 Oct 2020 16:35:18 +0800 Subject: [PATCH 148/227] add comment --- pkg/model/cluster.go | 1 + 1 file changed, 1 insertion(+) diff --git a/pkg/model/cluster.go b/pkg/model/cluster.go index 21f037606..86ab8efe4 100644 --- a/pkg/model/cluster.go +++ b/pkg/model/cluster.go @@ -67,6 +67,7 @@ type EdsClusterConfig struct { ServiceName string `yaml:"service_name" json:"service_name" mapstructure:"service_name"` } +// Registry remote registry where dubbo apis are registered. type Registry struct { Timeout string `yaml:"timeout" json:"timeout"` Address string `yaml:"address" json:"address"` From ce680f5001a8a78ddc1f9e5a442f8abac8f809bd Mon Sep 17 00:00:00 2001 From: shen <1292369127@qq.com> Date: Fri, 16 Oct 2020 16:37:54 +0800 Subject: [PATCH 149/227] add comment --- pkg/model/bootstrap.go | 1 + 1 file changed, 1 insertion(+) diff --git a/pkg/model/bootstrap.go b/pkg/model/bootstrap.go index 38716ddbb..d169ef821 100644 --- a/pkg/model/bootstrap.go +++ b/pkg/model/bootstrap.go @@ -53,6 +53,7 @@ type StaticResources struct { type DynamicResources struct { } +// ShutdownConfig how to shutdown proxy. type ShutdownConfig struct { Timeout string `default:"60s" yaml:"timeout" json:"timeout,omitempty"` StepTimeout string `default:"10s" yaml:"step_timeout" json:"step_timeout,omitempty"` From 636e9001f35b4473c20a134d0741953b8bc548f8 Mon Sep 17 00:00:00 2001 From: shen <1292369127@qq.com> Date: Fri, 16 Oct 2020 17:13:57 +0800 Subject: [PATCH 150/227] optimize code --- pkg/{registry_load => registry}/consul_registry.go | 2 +- pkg/{registry_load => registry}/consul_registry_test.go | 2 +- pkg/{registry_load => registry}/registry_load.go | 5 +++-- pkg/{registry_load => registry}/util.go | 5 +++-- 4 files changed, 8 insertions(+), 6 deletions(-) rename pkg/{registry_load => registry}/consul_registry.go (99%) rename pkg/{registry_load => registry}/consul_registry_test.go (99%) rename pkg/{registry_load => registry}/registry_load.go (90%) rename pkg/{registry_load => registry}/util.go (94%) diff --git a/pkg/registry_load/consul_registry.go b/pkg/registry/consul_registry.go similarity index 99% rename from pkg/registry_load/consul_registry.go rename to pkg/registry/consul_registry.go index b5b05c6cd..58a02ca31 100644 --- a/pkg/registry_load/consul_registry.go +++ b/pkg/registry/consul_registry.go @@ -14,7 +14,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package registry_load +package registry import ( "net/url" diff --git a/pkg/registry_load/consul_registry_test.go b/pkg/registry/consul_registry_test.go similarity index 99% rename from pkg/registry_load/consul_registry_test.go rename to pkg/registry/consul_registry_test.go index 09d2ad72c..7ebadb2ab 100644 --- a/pkg/registry_load/consul_registry_test.go +++ b/pkg/registry/consul_registry_test.go @@ -14,7 +14,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package registry_load +package registry import ( "net/url" diff --git a/pkg/registry_load/registry_load.go b/pkg/registry/registry_load.go similarity index 90% rename from pkg/registry_load/registry_load.go rename to pkg/registry/registry_load.go index 75d1476aa..7f856c273 100644 --- a/pkg/registry_load/registry_load.go +++ b/pkg/registry/registry_load.go @@ -14,13 +14,14 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package registry_load +package registry import "github.com/apache/dubbo-go/common" // this interface defined for load services from different kinds registry, such as nacos,consul,zookeeper. type RegistryLoad interface { - // load all services registered in registry + // LoadAllServices load all services registered in registry LoadAllServices() ([]common.URL, error) + // GetCluster get the registry name GetCluster() (string, error) } diff --git a/pkg/registry_load/util.go b/pkg/registry/util.go similarity index 94% rename from pkg/registry_load/util.go rename to pkg/registry/util.go index 7d0e6a774..3a5ed34eb 100644 --- a/pkg/registry_load/util.go +++ b/pkg/registry/util.go @@ -14,17 +14,18 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package registry_load +package registry import ( "github.com/apache/dubbo-go/common" - "github.com/dubbogo/dubbo-go-proxy/pkg/client/dubbo" ) import ( + "github.com/dubbogo/dubbo-go-proxy/pkg/client/dubbo" "github.com/dubbogo/dubbo-go-proxy/pkg/config" ) +// TransferUrl2Api transfer url and clusterName to IntegrationRequest func TransferUrl2Api(url common.URL, clusterName string) []config.IntegrationRequest { var irs []config.IntegrationRequest for _, method := range url.Methods { From 6a5fa27d75a617f3dc146f4c018d6edecb3c9da7 Mon Sep 17 00:00:00 2001 From: shen <1292369127@qq.com> Date: Fri, 16 Oct 2020 17:22:50 +0800 Subject: [PATCH 151/227] repair Hound error --- pkg/registry/consul_registry.go | 6 ++++-- pkg/registry/registry_load.go | 2 +- pkg/registry/util.go | 4 ++-- 3 files changed, 7 insertions(+), 5 deletions(-) diff --git a/pkg/registry/consul_registry.go b/pkg/registry/consul_registry.go index 58a02ca31..11637c7ce 100644 --- a/pkg/registry/consul_registry.go +++ b/pkg/registry/consul_registry.go @@ -38,9 +38,10 @@ func init() { } const ( - dubbo_api_filter = "dubbo in Tags" + dubboAPIFilter = "dubbo in Tags" ) +// ConsulRegistryLoad load dubbo apis from consul registry type ConsulRegistryLoad struct { Address string // Consul client. @@ -98,8 +99,9 @@ func (crl *ConsulRegistryLoad) transfer2Url(service consul.AgentService) (common return *url, nil } +// LoadAllServices load all services from consul registry func (crl *ConsulRegistryLoad) LoadAllServices() ([]common.URL, error) { - agentServices, err := crl.client.Agent().ServicesWithFilter(dubbo_api_filter) + agentServices, err := crl.client.Agent().ServicesWithFilter(dubboAPIFilter) if err != nil { logger.Error("consul load all apis error:%v", err) return nil, perrors.Wrap(err, "consul load all apis") diff --git a/pkg/registry/registry_load.go b/pkg/registry/registry_load.go index 7f856c273..670521ca6 100644 --- a/pkg/registry/registry_load.go +++ b/pkg/registry/registry_load.go @@ -18,7 +18,7 @@ package registry import "github.com/apache/dubbo-go/common" -// this interface defined for load services from different kinds registry, such as nacos,consul,zookeeper. +// RegistryLoad this interface defined for load services from different kinds registry, such as nacos,consul,zookeeper. type RegistryLoad interface { // LoadAllServices load all services registered in registry LoadAllServices() ([]common.URL, error) diff --git a/pkg/registry/util.go b/pkg/registry/util.go index 3a5ed34eb..700636255 100644 --- a/pkg/registry/util.go +++ b/pkg/registry/util.go @@ -25,8 +25,8 @@ import ( "github.com/dubbogo/dubbo-go-proxy/pkg/config" ) -// TransferUrl2Api transfer url and clusterName to IntegrationRequest -func TransferUrl2Api(url common.URL, clusterName string) []config.IntegrationRequest { +// TransferURL2Api transfer url and clusterName to IntegrationRequest +func TransferURL2Api(url common.URL, clusterName string) []config.IntegrationRequest { var irs []config.IntegrationRequest for _, method := range url.Methods { irs = append(irs, config.IntegrationRequest{ From 45f10f5d53b620e7d9f6d63d04e85d1a8bb62fc3 Mon Sep 17 00:00:00 2001 From: williamfeng323 Date: Mon, 19 Oct 2020 21:49:24 +0800 Subject: [PATCH 152/227] fixed typo in api_config.go --- pkg/client/dubbo/dubbo_client.go | 24 ++++++++++++------------ pkg/config/api_config.go | 2 +- 2 files changed, 13 insertions(+), 13 deletions(-) diff --git a/pkg/client/dubbo/dubbo_client.go b/pkg/client/dubbo/dubbo_client.go index 9fec9c777..76753a496 100644 --- a/pkg/client/dubbo/dubbo_client.go +++ b/pkg/client/dubbo/dubbo_client.go @@ -159,9 +159,9 @@ func (dc *DubboClient) check(key string) bool { } } -func (dc *DubboClient) create(key string, dm config.IntegrationRequest) *dg.GenericService { - referenceConfig := dg.NewReferenceConfig(dm.Interface, context.TODO()) - referenceConfig.InterfaceName = dm.Interface +func (dc *DubboClient) create(key string, irequest config.IntegrationRequest) *dg.GenericService { + referenceConfig := dg.NewReferenceConfig(irequest.Interface, context.TODO()) + referenceConfig.InterfaceName = irequest.Interface referenceConfig.Cluster = constant.DEFAULT_CLUSTER var registers []string for k := range dgCfg.Registries { @@ -169,19 +169,19 @@ func (dc *DubboClient) create(key string, dm config.IntegrationRequest) *dg.Gene } referenceConfig.Registry = strings.Join(registers, ",") - if dm.Protocol == "" { + if irequest.Protocol == "" { referenceConfig.Protocol = dubbo.DUBBO } else { - referenceConfig.Protocol = dm.Protocol + referenceConfig.Protocol = irequest.Protocol } - referenceConfig.Version = dm.Version - referenceConfig.Group = dm.Group + referenceConfig.Version = irequest.Version + referenceConfig.Group = irequest.Group referenceConfig.Generic = true - if dm.Retries == "" { + if irequest.Retries == "" { referenceConfig.Retries = "3" } else { - referenceConfig.Retries = dm.Retries + referenceConfig.Retries = irequest.Retries } dc.mLock.Lock() defer dc.mLock.Unlock() @@ -194,11 +194,11 @@ func (dc *DubboClient) create(key string, dm config.IntegrationRequest) *dg.Gene } // Get find a dubbo GenericService -func (dc *DubboClient) Get(interfaceName, version, group string, dm config.IntegrationRequest) *dg.GenericService { - key := strings.Join([]string{dm.ApplicationName, interfaceName, version, group}, "_") +func (dc *DubboClient) Get(interfaceName, version, group string, ir config.IntegrationRequest) *dg.GenericService { + key := strings.Join([]string{ir.ApplicationName, interfaceName, version, group}, "_") if dc.check(key) { return dc.get(key) } - return dc.create(key, dm) + return dc.create(key, ir) } diff --git a/pkg/config/api_config.go b/pkg/config/api_config.go index d5784edf0..cff0e6518 100644 --- a/pkg/config/api_config.go +++ b/pkg/config/api_config.go @@ -147,7 +147,7 @@ func LoadAPIConfigFromFile(path string) (*APIConfig, error) { if len(path) == 0 { return nil, perrors.Errorf("Config file not specified") } - logger.Info("Load API configuration file form ", path) + logger.Infof("Load API configuration file form %s", path) apiConf := &APIConfig{} err := yaml.UnmarshalYMLConfig(path, apiConf) if err != nil { From e9c611946ec2b2afcc7b878dad17b0236aedeb76 Mon Sep 17 00:00:00 2001 From: oaoit Date: Wed, 21 Oct 2020 16:12:01 +0800 Subject: [PATCH 153/227] add filter for blacklist/whitelist. --- configs/conf.yaml | 12 ++++++ pkg/common/constant/key.go | 1 + pkg/context/context.go | 3 ++ pkg/context/http/context.go | 30 ++++++++++++++ pkg/filter/authority_filter.go | 72 ++++++++++++++++++++++++++++++++++ pkg/model/authority.go | 51 ++++++++++++++++++++++++ pkg/model/http.go | 13 +++--- 7 files changed, 176 insertions(+), 6 deletions(-) create mode 100644 pkg/filter/authority_filter.go create mode 100644 pkg/model/authority.go diff --git a/configs/conf.yaml b/configs/conf.yaml index 8a8ebc993..fa3e1d571 100644 --- a/configs/conf.yaml +++ b/configs/conf.yaml @@ -29,7 +29,19 @@ static_resources: allow_origin: - "*" enabled: true + authority_config: + authority_rules: + - strategy: "Blacklist" + limit: "IP" + items: + - "127.0.0.1" + - strategy: "Whitelist" + limit: "App" + items: + - "test_dubbo" http_filters: + - name: dgp.filters.http.authority_filter + config: - name: dgp.filters.http.api config: - name: dgp.filters.http.router diff --git a/pkg/common/constant/key.go b/pkg/common/constant/key.go index 48a163142..19d9f83be 100644 --- a/pkg/common/constant/key.go +++ b/pkg/common/constant/key.go @@ -19,6 +19,7 @@ package constant const ( HttpConnectManagerFilter = "dgp.filters.http_connect_manager" + HttpAuthorityFilter = "dgp.filters.http.authority_filter" HttpRouterFilter = "dgp.filters.http.router" HttpApiFilter = "dgp.filters.http.api" HttpDomainFilter = "dgp.filters.http.domain" diff --git a/pkg/context/context.go b/pkg/context/context.go index 75a631e34..4d77db7bf 100644 --- a/pkg/context/context.go +++ b/pkg/context/context.go @@ -42,5 +42,8 @@ type Context interface { Api(api *model.Api) GetApi() *model.Api + GetClientIP() string + GetApplicationName() string + WriteErr(p interface{}) } diff --git a/pkg/context/http/context.go b/pkg/context/http/context.go index b07564c9f..869239c71 100644 --- a/pkg/context/http/context.go +++ b/pkg/context/http/context.go @@ -19,7 +19,10 @@ package http import ( "encoding/json" + "net" "net/http" + "net/url" + "strings" ) import ( @@ -115,6 +118,33 @@ func (hc *HttpContext) GetApi() *model.Api { return hc.api } +func (hc *HttpContext) GetClientIP() string { + xForwardedFor := hc.Request.Header.Get("X-Forwarded-For") + ip := strings.TrimSpace(strings.Split(xForwardedFor, ",")[0]) + if ip != "" { + return ip + } + + ip = strings.TrimSpace(hc.Request.Header.Get("X-Real-Ip")) + if ip != "" { + return ip + } + + if ip, _, err := net.SplitHostPort(strings.TrimSpace(hc.Request.RemoteAddr)); err == nil { + return ip + } + + return "" +} + +func (hc *HttpContext) GetApplicationName() string { + if u, err := url.Parse(hc.Request.RequestURI); err == nil { + return strings.Split(u.Path, "/")[0] + } + + return "" +} + // WriteFail func (hc *HttpContext) WriteFail() { hc.doWriteJSON(nil, http.StatusInternalServerError, nil) diff --git a/pkg/filter/authority_filter.go b/pkg/filter/authority_filter.go new file mode 100644 index 000000000..1376a6a29 --- /dev/null +++ b/pkg/filter/authority_filter.go @@ -0,0 +1,72 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + */ + +package filter + +import ( + "github.com/dubbogo/dubbo-go-proxy/pkg/common/constant" + "github.com/dubbogo/dubbo-go-proxy/pkg/common/extension" + "github.com/dubbogo/dubbo-go-proxy/pkg/context" + "github.com/dubbogo/dubbo-go-proxy/pkg/context/http" + "github.com/dubbogo/dubbo-go-proxy/pkg/model" + nh "net/http" +) + +func init() { + extension.SetFilterFunc(constant.HttpAuthorityFilter, Authority()) +} + +// blacklist/whitelist filter +func Authority() context.FilterFunc { + return func(c context.Context) { + authorityFilter(c.(*http.HttpContext)) + } +} + +func authorityFilter(c *http.HttpContext) { + for _, r := range c.HttpConnectionManager.AuthorityConfig.Rules { + item := c.GetClientIP() + if r.Limit == model.App { + item = c.GetApplicationName() + } + + result := passCheck(item, r) + if !result { + c.WriteWithStatus(nh.StatusForbidden, constant.Default403Body) + c.Abort() + return + } + } + + c.Next() +} + +func passCheck(item string, rule model.AuthorityRule) bool { + result := false + for _, it := range rule.Items { + if it == item { + result = true + break + } + } + + if (rule.Strategy == model.Blacklist && result == true) || (rule.Strategy == model.Whitelist && result == false) { + return false + } else { + return true + } +} diff --git a/pkg/model/authority.go b/pkg/model/authority.go new file mode 100644 index 000000000..ff67c377e --- /dev/null +++ b/pkg/model/authority.go @@ -0,0 +1,51 @@ +package model + +type AuthorityConfiguration struct { + Rules []AuthorityRule `yaml:"authority_rule" json:"authority_rule"` //Rules the authority rule list +} + +type AuthorityRule struct { + Strategy StrategyType `yaml:"strategy" json:"strategy"` //Strategy the authority rule strategy + Limit LimitType `yaml:"limit" json:"limit"` //Limit the authority rule limit + Items []string `yaml:"items" json:"items"` //Items the authority rule items +} + +// StrategyType the authority rule strategy enum +type StrategyType int32 + +const ( + Whitelist StrategyType = 0 + Blacklist StrategyType = 1 +) + +// StrategyTypeName key int32 for StrategyType, value string +var StrategyTypeName = map[int32]string{ + 0: "Whitelist", + 1: "Blacklist", +} + +// StrategyTypeValue key string, value int32 for StrategyType +var StrategyTypeValue = map[string]int32{ + "Whitelist": 0, + "Blacklist": 1, +} + +// LimitType the authority rule limit enum +type LimitType int32 + +const ( + IP LimitType = 0 + App LimitType = 1 +) + +// LimitTypeName key int32 for LimitType, value string +var LimitTypeName = map[int32]string{ + 0: "IP", + 1: "App", +} + +// LimitTypeValue key string, value int32 for LimitType +var LimitTypeValue = map[string]int32{ + "IP": 0, + "App": 1, +} diff --git a/pkg/model/http.go b/pkg/model/http.go index 6d2c092db..b92a498c0 100644 --- a/pkg/model/http.go +++ b/pkg/model/http.go @@ -19,12 +19,13 @@ package model // HttpConnectionManager type HttpConnectionManager struct { - RouteConfig RouteConfiguration `yaml:"route_config" json:"route_config" mapstructure:"route_config"` - HttpFilters []HttpFilter `yaml:"http_filters" json:"http_filters" mapstructure:"http_filters"` - ServerName string `yaml:"server_name" json:"server_name" mapstructure:"server_name"` - IdleTimeoutStr string `yaml:"idle_timeout" json:"idle_timeout" mapstructure:"idle_timeout"` - AccessLog AccessLog `yaml:"access_log" json:"access_log" mapstructure:"access_log"` - GenerateRequestId bool `yaml:"generate_request_id" json:"generate_request_id" mapstructure:"generate_request_id"` + RouteConfig RouteConfiguration `yaml:"route_config" json:"route_config" mapstructure:"route_config"` + AuthorityConfig AuthorityConfiguration `yaml:"authority_config" json:"authority_config" mapstructure:"authority_config"` + HttpFilters []HttpFilter `yaml:"http_filters" json:"http_filters" mapstructure:"http_filters"` + ServerName string `yaml:"server_name" json:"server_name" mapstructure:"server_name"` + IdleTimeoutStr string `yaml:"idle_timeout" json:"idle_timeout" mapstructure:"idle_timeout"` + AccessLog AccessLog `yaml:"access_log" json:"access_log" mapstructure:"access_log"` + GenerateRequestId bool `yaml:"generate_request_id" json:"generate_request_id" mapstructure:"generate_request_id"` } // CorsPolicy From 3d8fae7a4d48dce123e734dc5e0f76ed532d531c Mon Sep 17 00:00:00 2001 From: oaoit Date: Wed, 21 Oct 2020 16:52:15 +0800 Subject: [PATCH 154/227] add license. --- pkg/model/authority.go | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/pkg/model/authority.go b/pkg/model/authority.go index ff67c377e..24293cbf5 100644 --- a/pkg/model/authority.go +++ b/pkg/model/authority.go @@ -1,3 +1,20 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + */ + package model type AuthorityConfiguration struct { From d7c1653320f3835152ef098ac9a7a96fd28fd0b7 Mon Sep 17 00:00:00 2001 From: shen <1292369127@qq.com> Date: Wed, 21 Oct 2020 17:37:30 +0800 Subject: [PATCH 155/227] zookeeper registry --- pkg/registry/zookeeper_registry.go | 93 +++++++++++++++++++++++++ pkg/registry/zookeeper_registry_test.go | 28 ++++++++ 2 files changed, 121 insertions(+) create mode 100644 pkg/registry/zookeeper_registry.go create mode 100644 pkg/registry/zookeeper_registry_test.go diff --git a/pkg/registry/zookeeper_registry.go b/pkg/registry/zookeeper_registry.go new file mode 100644 index 000000000..cd8a5855c --- /dev/null +++ b/pkg/registry/zookeeper_registry.go @@ -0,0 +1,93 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + */ +package registry + +import ( + "path" + "strings" + "time" +) + +import ( + "github.com/dubbogo/dubbo-go-proxy/pkg/logger" +) + +import ( + "github.com/apache/dubbo-go/common" + "github.com/apache/dubbo-go/remoting/zookeeper" +) + +func init() { + var _ RegistryLoad = new(ZookeeperRegistryLoad) +} + +// ConsulRegistryLoad load dubbo apis from consul registry +type ZookeeperRegistryLoad struct { + zkName string + zkPath map[string]int + client *zookeeper.ZookeeperClient + Address string + cluster string +} + +func newZookeeperRegistryLoad(address, cluster string) (RegistryLoad, error) { + newClient, err := zookeeper.NewZookeeperClient("zkClient", strings.Split(address, ","), 15*time.Second) + if err != nil { + logger.Warnf("newZookeeperClient error:%v", err) + return nil, err + } + + r := &ZookeeperRegistryLoad{ + Address: address, + client: newClient, + cluster: cluster, + } + + return r, nil +} + +func (crl *ZookeeperRegistryLoad) GetCluster() (string, error) { + return crl.cluster, nil +} + +// LoadAllServices load all services from consul registry +func (crl *ZookeeperRegistryLoad) LoadAllServices() ([]common.URL, error) { + rootPath := "/dubbo/" + children, err := crl.client.GetChildren(rootPath) + if err != nil { + logger.Errorf("[zookeeper registry] get zk children error:%v", err) + return nil, err + } + var urls []common.URL + for _, child := range children { + providerStr := path.Join(rootPath, "/", child, "/", "providers") + urlStrs, err := crl.client.GetChildren(providerStr) + if err != nil { + logger.Errorf("[zookeeper registry] get zk children \"%s\" error:%v", providerStr, err) + return nil, err + } + for _, url := range urlStrs { + dubboUrl, err := common.NewURL(url) + if err != nil { + logger.Warnf("[zookeeper registry] transfer zk info to url error:%v", err) + continue + } + urls = append(urls, dubboUrl) + } + } + return urls, nil +} diff --git a/pkg/registry/zookeeper_registry_test.go b/pkg/registry/zookeeper_registry_test.go new file mode 100644 index 000000000..f304fd3c6 --- /dev/null +++ b/pkg/registry/zookeeper_registry_test.go @@ -0,0 +1,28 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + */ +package registry + +import ( + "testing" +) + +func TestZookeeperRegistryLoad_GetCluster(t *testing.T) { + +} + +func TestZookeeperRegistryLoad_LoadAllServices(t *testing.T) { +} From 60b4e879e449c1de99fcc58133674bbd1d2d4aa4 Mon Sep 17 00:00:00 2001 From: zhangshen023 <1292369127@qq.com> Date: Thu, 22 Oct 2020 07:36:14 +0800 Subject: [PATCH 156/227] zookeeper registry unit test --- pkg/registry/zookeeper_registry.go | 1 - pkg/registry/zookeeper_registry_test.go | 105 +++++++++++++++++++++++- 2 files changed, 104 insertions(+), 2 deletions(-) diff --git a/pkg/registry/zookeeper_registry.go b/pkg/registry/zookeeper_registry.go index cd8a5855c..3f1414595 100644 --- a/pkg/registry/zookeeper_registry.go +++ b/pkg/registry/zookeeper_registry.go @@ -38,7 +38,6 @@ func init() { // ConsulRegistryLoad load dubbo apis from consul registry type ZookeeperRegistryLoad struct { zkName string - zkPath map[string]int client *zookeeper.ZookeeperClient Address string cluster string diff --git a/pkg/registry/zookeeper_registry_test.go b/pkg/registry/zookeeper_registry_test.go index f304fd3c6..cb9d66f81 100644 --- a/pkg/registry/zookeeper_registry_test.go +++ b/pkg/registry/zookeeper_registry_test.go @@ -17,11 +17,114 @@ package registry import ( + "fmt" + "github.com/apache/dubbo-go/common" + "github.com/apache/dubbo-go/common/constant" + zkRegistry "github.com/apache/dubbo-go/registry" + "github.com/apache/dubbo-go/remoting/zookeeper" + "github.com/dubbogo/dubbo-go-proxy/pkg/logger" + "github.com/dubbogo/go-zookeeper/zk" + perrors "github.com/pkg/errors" + "github.com/stretchr/testify/assert" + "net/url" + "strconv" + "strings" "testing" + "time" ) -func TestZookeeperRegistryLoad_GetCluster(t *testing.T) { +func newMockZkRegistry(providerUrl common.URL, opts ...zookeeper.Option) (*zk.TestCluster, error) { + var ( + err error + c *zk.TestCluster + client *zookeeper.ZookeeperClient + registry *zkRegistry.BaseRegistry + //event <-chan zk.Event + ) + c, client, _, err = zookeeper.NewMockZookeeperClient("test", 15*time.Second, opts...) + if err != nil { + return nil, err + } + var ( + //revision string + params url.Values + rawURL string + zkPath string + encodedURL string + dubboPath string + //conf config.URL + ) + params = url.Values{} + + providerUrl.RangeParams(func(key, value string) bool { + params.Add(key, value) + return true + }) + + params.Add("pid", "") + params.Add("ip", "") + //params.Add("timeout", fmt.Sprintf("%d", int64(r.Timeout)/1e6)) + + role, _ := strconv.Atoi(registry.URL.GetParam(constant.ROLE_KEY, "")) + switch role { + + case common.PROVIDER: + dubboPath = fmt.Sprintf("/dubbo/%s/%s", url.QueryEscape(providerUrl.Service()), common.DubboNodes[common.PROVIDER]) + client.CreateWithValue(dubboPath, []byte("")) + + } + var host string + if providerUrl.Ip == "" { + host = "" + } else { + host = providerUrl.Ip + } + rawURL = fmt.Sprintf("%s://%s%s?%s", providerUrl.Protocol, host, c.Path, params.Encode()) + + encodedURL = url.QueryEscape(rawURL) + dubboPath = strings.ReplaceAll(dubboPath, "$", "%24") + err = client.Create(dubboPath) + if err != nil { + return nil, perrors.WithStack(err) + } + + // try to register the node + zkPath, err = client.RegisterTemp(dubboPath, encodedURL) + if err != nil { + logger.Errorf("Register temp node(root{%s}, node{%s}) = error{%v}", dubboPath, encodedURL, perrors.WithStack(err)) + if perrors.Cause(err) == zk.ErrNodeExists { + // should delete the old node + logger.Info("Register temp node failed, try to delete the old and recreate (root{%s}, node{%s}) , ignore!", dubboPath, encodedURL) + if err = client.Delete(zkPath); err == nil { + _, err = client.RegisterTemp(dubboPath, encodedURL) + } + if err != nil { + logger.Errorf("Recreate the temp node failed, (root{%s}, node{%s}) = error{%v}", dubboPath, encodedURL, perrors.WithStack(err)) + } + } + return nil, perrors.WithMessagef(err, "RegisterTempNode(root{%s}, node{%s})", dubboPath, encodedURL) + } + logger.Debugf("Create a zookeeper node:%s", zkPath) + defer c.Stop() + return c, nil +} + +func registerProvider() (*zk.TestCluster, error) { + providerUrl, _ := common.NewURL("dubbo://127.0.0.1:20000/com.ikurento.user.UserProvider", common.WithParamsValue(constant.CLUSTER_KEY, "mock"), common.WithParamsValue("serviceid", "soa.mock"), common.WithMethods([]string{"GetUser", "AddUser"})) + return newMockZkRegistry(providerUrl) +} + +func TestZookeeperRegistryLoad_GetCluster(t *testing.T) { + testCluster, err := registerProvider() + assert.Nil(t, err) + defer testCluster.Stop() + registryLoad, err := newZookeeperRegistryLoad("127.0.0.1:1111", "test-cluster") + assert.Nil(t, err) + assert.NotNil(t, registryLoad) + clusterName, err := registryLoad.GetCluster() + assert.NotNil(t, err) + assert.Equal(t, "test-cluster", clusterName) } func TestZookeeperRegistryLoad_LoadAllServices(t *testing.T) { From 9b49f724294ed5b4552eca26d6cf1b45f70819e0 Mon Sep 17 00:00:00 2001 From: "yangqing.xyq" Date: Thu, 22 Oct 2020 13:39:03 +0800 Subject: [PATCH 157/227] fix according to comments. --- go.sum | 1 + pkg/client/client.go | 54 ------------------------------ pkg/client/dubbo/dubbo_client.go | 22 +++---------- pkg/client/metadata.go | 15 +++++++++ pkg/config/api_config.go | 8 ++--- pkg/pool/pool.go | 56 ++++++++++++++++++++++++++++++++ 6 files changed, 80 insertions(+), 76 deletions(-) create mode 100644 pkg/client/metadata.go create mode 100644 pkg/pool/pool.go diff --git a/go.sum b/go.sum index 44b1acde6..fece06134 100644 --- a/go.sum +++ b/go.sum @@ -750,6 +750,7 @@ gopkg.in/yaml.v2 v2.0.0-20170812160011-eb3733d160e7/go.mod h1:JAlM8MvJe8wmxCU4Bl gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.8 h1:obN1ZagJSUGI0Ek/LBmuj4SNLPfIny3KsKFopxRdj10= gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.3.0 h1:clyUAQHOM3G0M3f5vQj7LuJrETvjVot3Z5el9nffUtU= gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= diff --git a/pkg/client/client.go b/pkg/client/client.go index fd9c6ec1e..ac7c56a1d 100644 --- a/pkg/client/client.go +++ b/pkg/client/client.go @@ -17,62 +17,8 @@ package client -import ( - "errors" - "github.com/dubbogo/dubbo-go-proxy/pkg/client/dubbo" - "github.com/dubbogo/dubbo-go-proxy/pkg/client/httpclient" - "github.com/dubbogo/dubbo-go-proxy/pkg/model" - "sync" -) - type Client interface { Init() error Close() error Call(req *Request) (resp Response, err error) } - -//ClientPool a pool of client. -type ClientPool struct { - poolMap map[model.ApiType]*sync.Pool -} - -var ( - _clinetPool *ClientPool - once = sync.Once{} -) - -// SingletonPool singleton pool -func SingletonPool() *ClientPool { - if _clinetPool == nil { - once.Do(func() { - _clinetPool = newClientPool() - }) - } - - return _clinetPool -} - -// GetClient a factory method to get a client according to apiType . -func (pool *ClientPool) GetClient(t model.ApiType) (Client, error) { - if pool.poolMap[t] != nil { - return pool.poolMap[t].Get().(Client), nil - } - return nil, errors.New("protocol not supported yet") -} - -func newClientPool() *ClientPool { - clientPool := &ClientPool{ - poolMap: make(map[model.ApiType]*sync.Pool), - } - clientPool.poolMap[model.DUBBO] = &sync.Pool{ - New: func() interface{} { - return dubbo.NewDubboClient() - }, - } - clientPool.poolMap[model.REST] = &sync.Pool{ - New: func() interface{} { - return httpclient.NewHttpClient() - }, - } - return clientPool -} diff --git a/pkg/client/dubbo/dubbo_client.go b/pkg/client/dubbo/dubbo_client.go index 0d4a1bf98..0de5dadde 100644 --- a/pkg/client/dubbo/dubbo_client.go +++ b/pkg/client/dubbo/dubbo_client.go @@ -20,6 +20,7 @@ package dubbo import ( "context" "encoding/json" + "github.com/dubbogo/dubbo-go-proxy/pkg/client" "strings" "sync" "time" @@ -32,7 +33,6 @@ import ( ) import ( - "github.com/dubbogo/dubbo-go-proxy/pkg/client" "github.com/dubbogo/dubbo-go-proxy/pkg/logger" ) @@ -42,20 +42,6 @@ const ( JavaLangClassName = "java.lang.Long" ) -// DubboMetadata dubbo metadata, api config -type DubboMetadata struct { - ApplicationName string `yaml:"application_name" json:"application_name" mapstructure:"application_name"` - Group string `yaml:"group" json:"group" mapstructure:"group"` - Version string `yaml:"version" json:"version" mapstructure:"version"` - Interface string `yaml:"interface" json:"interface" mapstructure:"interface"` - Method string `yaml:"method" json:"method" mapstructure:"method"` - Types []string `yaml:"types" json:"types" mapstructure:"types"` - Retries string `yaml:"retries" json:"retries,omitempty" property:"retries"` - ClusterName string `yaml:"cluster_name" json:"cluster_name,omitempty" property:"cluster_name"` - ProtocolTypeStr string `yaml:"protocol_type" json:"protocol_type,omitempty" property:"protocol_type"` - SerializationTypeStr string `yaml:"serialization_type" json:"serialization_type,omitempty" property:"serialization_type"` -} - var ( _DubboClient *DubboClient onceClient = sync.Once{} @@ -103,7 +89,7 @@ func (dc *DubboClient) Close() error { // Call invoke service func (dc *DubboClient) Call(r *client.Request) (resp client.Response, err error) { - dm := r.Api.Metadata.(*DubboMetadata) + dm := r.Api.Metadata.(*client.DubboMetadata) gs := dc.Get(dm.Interface, dm.Version, dm.Group, dm) var reqData []interface{} @@ -167,7 +153,7 @@ func (dc *DubboClient) check(key string) bool { } } -func (dc *DubboClient) create(key string, dm *DubboMetadata) *dg.GenericService { +func (dc *DubboClient) create(key string, dm *client.DubboMetadata) *dg.GenericService { referenceConfig := dg.NewReferenceConfig(dm.Interface, context.TODO()) referenceConfig.InterfaceName = dm.Interface referenceConfig.Cluster = constant.DEFAULT_CLUSTER @@ -202,7 +188,7 @@ func (dc *DubboClient) create(key string, dm *DubboMetadata) *dg.GenericService } // Get find a dubbo GenericService -func (dc *DubboClient) Get(interfaceName, version, group string, dm *DubboMetadata) *dg.GenericService { +func (dc *DubboClient) Get(interfaceName, version, group string, dm *client.DubboMetadata) *dg.GenericService { key := strings.Join([]string{dm.ApplicationName, interfaceName, version, group}, "_") if dc.check(key) { return dc.get(key) diff --git a/pkg/client/metadata.go b/pkg/client/metadata.go new file mode 100644 index 000000000..d1dd651c3 --- /dev/null +++ b/pkg/client/metadata.go @@ -0,0 +1,15 @@ +package client + +// DubboMetadata dubbo metadata, api config +type DubboMetadata struct { + ApplicationName string `yaml:"application_name" json:"application_name" mapstructure:"application_name"` + Group string `yaml:"group" json:"group" mapstructure:"group"` + Version string `yaml:"version" json:"version" mapstructure:"version"` + Interface string `yaml:"interface" json:"interface" mapstructure:"interface"` + Method string `yaml:"method" json:"method" mapstructure:"method"` + Types []string `yaml:"types" json:"types" mapstructure:"types"` + Retries string `yaml:"retries" json:"retries,omitempty" property:"retries"` + ClusterName string `yaml:"cluster_name" json:"cluster_name,omitempty" property:"cluster_name"` + ProtocolTypeStr string `yaml:"protocol_type" json:"protocol_type,omitempty" property:"protocol_type"` + SerializationTypeStr string `yaml:"serialization_type" json:"serialization_type,omitempty" property:"serialization_type"` +} diff --git a/pkg/config/api_config.go b/pkg/config/api_config.go index d191397e3..91933f181 100644 --- a/pkg/config/api_config.go +++ b/pkg/config/api_config.go @@ -18,11 +18,11 @@ package config import ( + "github.com/dubbogo/dubbo-go-proxy/pkg/client" perrors "github.com/pkg/errors" ) import ( - "github.com/dubbogo/dubbo-go-proxy/pkg/client/dubbo" "github.com/dubbogo/dubbo-go-proxy/pkg/common/yaml" "github.com/dubbogo/dubbo-go-proxy/pkg/logger" ) @@ -97,9 +97,9 @@ type BodyDefinition struct { // IntegrationRequest defines the backend request format and target type IntegrationRequest struct { - RequestType string `yaml:"requestType"` // dubbo, TO-DO: http - MappingParams []MappingParam `yaml:"mappingParams,omitempty"` - dubbo.DubboMetadata `yaml:"dubboMetaData,inline,omitempty"` + RequestType string `yaml:"requestType"` // dubbo, TO-DO: http + MappingParams []MappingParam `yaml:"mappingParams,omitempty"` + client.DubboMetadata `yaml:"dubboMetaData,inline,omitempty"` } // MappingParam defines the mapping rules of headers and queryStrings diff --git a/pkg/pool/pool.go b/pkg/pool/pool.go new file mode 100644 index 000000000..2ad473c7d --- /dev/null +++ b/pkg/pool/pool.go @@ -0,0 +1,56 @@ +package pool + +import ( + "errors" + "github.com/dubbogo/dubbo-go-proxy/pkg/client" + "github.com/dubbogo/dubbo-go-proxy/pkg/client/dubbo" + "github.com/dubbogo/dubbo-go-proxy/pkg/client/httpclient" + "github.com/dubbogo/dubbo-go-proxy/pkg/model" + "sync" +) + +//ClientPool a pool of client. +type ClientPool struct { + poolMap map[model.ApiType]*sync.Pool +} + +var ( + _clinetPool *ClientPool + once = sync.Once{} +) + +func newClientPool() *ClientPool { + clientPool := &ClientPool{ + poolMap: make(map[model.ApiType]*sync.Pool), + } + clientPool.poolMap[model.DUBBO] = &sync.Pool{ + New: func() interface{} { + return dubbo.NewDubboClient() + }, + } + clientPool.poolMap[model.REST] = &sync.Pool{ + New: func() interface{} { + return httpclient.NewHttpClient() + }, + } + return clientPool +} + +// SingletonPool singleton pool +func SingletonPool() *ClientPool { + if _clinetPool == nil { + once.Do(func() { + _clinetPool = newClientPool() + }) + } + + return _clinetPool +} + +// GetClient a factory method to get a client according to apiType . +func (pool *ClientPool) GetClient(t model.ApiType) (client.Client, error) { + if pool.poolMap[t] != nil { + return pool.poolMap[t].Get().(client.Client), nil + } + return nil, errors.New("protocol not supported yet") +} From cdd49f71c46e8d0c4c8ff49914d9b30d39d3c2ef Mon Sep 17 00:00:00 2001 From: shen <1292369127@qq.com> Date: Sat, 24 Oct 2020 16:21:07 +0800 Subject: [PATCH 158/227] zookeeper registry unit test --- go.mod | 1 + pkg/registry/zookeeper_registry.go | 6 +- pkg/registry/zookeeper_registry_test.go | 101 +++++++++++------------- 3 files changed, 51 insertions(+), 57 deletions(-) diff --git a/go.mod b/go.mod index 0ca13b182..6721884c5 100644 --- a/go.mod +++ b/go.mod @@ -4,6 +4,7 @@ go 1.14 require ( github.com/apache/dubbo-go v1.5.1 + github.com/dubbogo/go-zookeeper v1.0.1 github.com/emirpasic/gods v1.12.0 github.com/ghodss/yaml v1.0.1-0.20190212211648-25d852aebe32 github.com/goinggo/mapstructure v0.0.0-20140717182941-194205d9b4a9 diff --git a/pkg/registry/zookeeper_registry.go b/pkg/registry/zookeeper_registry.go index 3f1414595..99ec8c835 100644 --- a/pkg/registry/zookeeper_registry.go +++ b/pkg/registry/zookeeper_registry.go @@ -65,15 +65,15 @@ func (crl *ZookeeperRegistryLoad) GetCluster() (string, error) { // LoadAllServices load all services from consul registry func (crl *ZookeeperRegistryLoad) LoadAllServices() ([]common.URL, error) { - rootPath := "/dubbo/" + rootPath := "/dubbo" children, err := crl.client.GetChildren(rootPath) if err != nil { logger.Errorf("[zookeeper registry] get zk children error:%v", err) return nil, err } var urls []common.URL - for _, child := range children { - providerStr := path.Join(rootPath, "/", child, "/", "providers") + for _, _interface := range children { + providerStr := path.Join(rootPath, "/", _interface, "/", "providers") urlStrs, err := crl.client.GetChildren(providerStr) if err != nil { logger.Errorf("[zookeeper registry] get zk children \"%s\" error:%v", providerStr, err) diff --git a/pkg/registry/zookeeper_registry_test.go b/pkg/registry/zookeeper_registry_test.go index cb9d66f81..981062d86 100644 --- a/pkg/registry/zookeeper_registry_test.go +++ b/pkg/registry/zookeeper_registry_test.go @@ -18,14 +18,6 @@ package registry import ( "fmt" - "github.com/apache/dubbo-go/common" - "github.com/apache/dubbo-go/common/constant" - zkRegistry "github.com/apache/dubbo-go/registry" - "github.com/apache/dubbo-go/remoting/zookeeper" - "github.com/dubbogo/dubbo-go-proxy/pkg/logger" - "github.com/dubbogo/go-zookeeper/zk" - perrors "github.com/pkg/errors" - "github.com/stretchr/testify/assert" "net/url" "strconv" "strings" @@ -33,26 +25,34 @@ import ( "time" ) -func newMockZkRegistry(providerUrl common.URL, opts ...zookeeper.Option) (*zk.TestCluster, error) { +import ( + "github.com/dubbogo/go-zookeeper/zk" +) + +import ( + "github.com/apache/dubbo-go/common" + "github.com/apache/dubbo-go/common/constant" + "github.com/apache/dubbo-go/remoting/zookeeper" + "github.com/stretchr/testify/assert" +) + +const providerUrlstr = "dubbo://127.0.0.1:20000/com.ikurento.user.UserProvider?methods.GetUser.retries=1" + +func newMockZkRegistry(t *testing.T, providerUrl common.URL, opts ...zookeeper.Option) (*zk.TestCluster, error) { var ( - err error - c *zk.TestCluster - client *zookeeper.ZookeeperClient - registry *zkRegistry.BaseRegistry - //event <-chan zk.Event + err error + c *zk.TestCluster + client *zookeeper.ZookeeperClient ) c, client, _, err = zookeeper.NewMockZookeeperClient("test", 15*time.Second, opts...) if err != nil { return nil, err } var ( - //revision string params url.Values rawURL string - zkPath string encodedURL string dubboPath string - //conf config.URL ) params = url.Values{} @@ -61,17 +61,12 @@ func newMockZkRegistry(providerUrl common.URL, opts ...zookeeper.Option) (*zk.Te return true }) - params.Add("pid", "") - params.Add("ip", "") - //params.Add("timeout", fmt.Sprintf("%d", int64(r.Timeout)/1e6)) - - role, _ := strconv.Atoi(registry.URL.GetParam(constant.ROLE_KEY, "")) - switch role { - - case common.PROVIDER: - dubboPath = fmt.Sprintf("/dubbo/%s/%s", url.QueryEscape(providerUrl.Service()), common.DubboNodes[common.PROVIDER]) - client.CreateWithValue(dubboPath, []byte("")) + dubboPath = fmt.Sprintf("/dubbo/%s/%s", url.QueryEscape(providerUrl.Service()), common.DubboNodes[common.PROVIDER]) + err = client.CreateWithValue(dubboPath, []byte("")) + assert.Nil(t, err) + if len(providerUrl.Methods) > 0 { + params.Add(constant.METHODS_KEY, strings.Join(providerUrl.Methods, ",")) } var host string if providerUrl.Ip == "" { @@ -79,53 +74,51 @@ func newMockZkRegistry(providerUrl common.URL, opts ...zookeeper.Option) (*zk.Te } else { host = providerUrl.Ip } - rawURL = fmt.Sprintf("%s://%s%s?%s", providerUrl.Protocol, host, c.Path, params.Encode()) + host += ":" + providerUrl.Port + rawURL = fmt.Sprintf("%s://%s%s?%s", providerUrl.Protocol, host, providerUrl.Path, params.Encode()) encodedURL = url.QueryEscape(rawURL) dubboPath = strings.ReplaceAll(dubboPath, "$", "%24") err = client.Create(dubboPath) - if err != nil { - return nil, perrors.WithStack(err) - } + assert.Nil(t, err) - // try to register the node - zkPath, err = client.RegisterTemp(dubboPath, encodedURL) - if err != nil { - logger.Errorf("Register temp node(root{%s}, node{%s}) = error{%v}", dubboPath, encodedURL, perrors.WithStack(err)) - if perrors.Cause(err) == zk.ErrNodeExists { - // should delete the old node - logger.Info("Register temp node failed, try to delete the old and recreate (root{%s}, node{%s}) , ignore!", dubboPath, encodedURL) - if err = client.Delete(zkPath); err == nil { - _, err = client.RegisterTemp(dubboPath, encodedURL) - } - if err != nil { - logger.Errorf("Recreate the temp node failed, (root{%s}, node{%s}) = error{%v}", dubboPath, encodedURL, perrors.WithStack(err)) - } - } - return nil, perrors.WithMessagef(err, "RegisterTempNode(root{%s}, node{%s})", dubboPath, encodedURL) - } - logger.Debugf("Create a zookeeper node:%s", zkPath) - defer c.Stop() + // to register the node + _, err = client.RegisterTemp(dubboPath, encodedURL) + assert.Nil(t, err) return c, nil } -func registerProvider() (*zk.TestCluster, error) { - providerUrl, _ := common.NewURL("dubbo://127.0.0.1:20000/com.ikurento.user.UserProvider", common.WithParamsValue(constant.CLUSTER_KEY, "mock"), common.WithParamsValue("serviceid", "soa.mock"), common.WithMethods([]string{"GetUser", "AddUser"})) - return newMockZkRegistry(providerUrl) +func registerProvider(providerUrl common.URL, t *testing.T) (*zk.TestCluster, error) { + return newMockZkRegistry(t, providerUrl) } func TestZookeeperRegistryLoad_GetCluster(t *testing.T) { - testCluster, err := registerProvider() + providerUrl, _ := common.NewURL(providerUrlstr) + testCluster, err := registerProvider(providerUrl, t) assert.Nil(t, err) defer testCluster.Stop() registryLoad, err := newZookeeperRegistryLoad("127.0.0.1:1111", "test-cluster") assert.Nil(t, err) assert.NotNil(t, registryLoad) clusterName, err := registryLoad.GetCluster() - assert.NotNil(t, err) + assert.Nil(t, err) assert.Equal(t, "test-cluster", clusterName) } func TestZookeeperRegistryLoad_LoadAllServices(t *testing.T) { + providerUrl, _ := common.NewURL(providerUrlstr) + testCluster, err := registerProvider(providerUrl, t) + assert.Nil(t, err) + defer testCluster.Stop() + registryLoad, err := newZookeeperRegistryLoad(fmt.Sprintf("%s:%s", "127.0.0.1", strconv.Itoa(testCluster.Servers[0].Port)), "test-cluster") + assert.Nil(t, err) + assert.NotNil(t, registryLoad) + services, err := registryLoad.LoadAllServices() + assert.Nil(t, err) + assert.GreaterOrEqual(t, len(services), 1) + assert.Equal(t, services[0].Protocol, "dubbo") + assert.Equal(t, services[0].Location, "127.0.0.1:20000") + assert.Equal(t, services[0].Path, "/com.ikurento.user.UserProvider") + assert.Equal(t, services[0].GetMethodParam("GetUser", "retries", ""), "1") } From 2ff60b5bfcb49b71f09c35b09836d2ab67166018 Mon Sep 17 00:00:00 2001 From: williamfeng323 Date: Sun, 25 Oct 2020 15:16:25 +0800 Subject: [PATCH 159/227] fix typo and other minor issues --- configs/api_config.yaml | 2 +- configs/client.yml | 14 +++++++------- pkg/client/dubbo/dubbo_client.go | 4 ++-- pkg/config/api_config.go | 4 ++-- pkg/context/http/context_test.go | 5 ++++- pkg/proxy/listener.go | 5 ++++- 6 files changed, 20 insertions(+), 14 deletions(-) diff --git a/configs/api_config.yaml b/configs/api_config.yaml index ba96ba899..e7f2e40a8 100644 --- a/configs/api_config.yaml +++ b/configs/api_config.yaml @@ -15,7 +15,7 @@ resources: - name: id required: false integrationRequest: - requestType: DUBBO + requestType: dubbo mappingParams: - name: queryStrings.id mapTo: 1 diff --git a/configs/client.yml b/configs/client.yml index 129c4f056..96f8260a3 100644 --- a/configs/client.yml +++ b/configs/client.yml @@ -9,17 +9,17 @@ connect_timeout : "3s" # application config application: - organization : "dubbo-go-proxy" - name : "DubboGoProxy" - module : "dubbogo proxy client" - version : "0.0.1" - owner : "DubboGoProxy" - environment : "dev" + organization: "dubbo-go-proxy" + name : "DubboGoProxy" + module: "dubbogo proxy client" + version: "0.0.1" + owner: "DubboGoProxy" + environment: "dev" registries : "hangzhouzk": protocol: "zookeeper" - timeout : "3s" + timeout: "3s" address: "127.0.0.1:2181" username: "" password: "" diff --git a/pkg/client/dubbo/dubbo_client.go b/pkg/client/dubbo/dubbo_client.go index 76753a496..8723ee612 100644 --- a/pkg/client/dubbo/dubbo_client.go +++ b/pkg/client/dubbo/dubbo_client.go @@ -169,7 +169,7 @@ func (dc *DubboClient) create(key string, irequest config.IntegrationRequest) *d } referenceConfig.Registry = strings.Join(registers, ",") - if irequest.Protocol == "" { + if len(irequest.Protocol) == 0 { referenceConfig.Protocol = dubbo.DUBBO } else { referenceConfig.Protocol = irequest.Protocol @@ -178,7 +178,7 @@ func (dc *DubboClient) create(key string, irequest config.IntegrationRequest) *d referenceConfig.Version = irequest.Version referenceConfig.Group = irequest.Group referenceConfig.Generic = true - if irequest.Retries == "" { + if len(irequest.Retries) == 0 { referenceConfig.Retries = "3" } else { referenceConfig.Retries = irequest.Retries diff --git a/pkg/config/api_config.go b/pkg/config/api_config.go index cff0e6518..fff47240d 100644 --- a/pkg/config/api_config.go +++ b/pkg/config/api_config.go @@ -59,9 +59,9 @@ type RequestType string const ( // DubboRequest represents the dubbo request - DubboRequest RequestType = "DUBBO" + DubboRequest RequestType = "dubbo" // HTTPRequest represents the http request - HTTPRequest RequestType = "HTTP" + HTTPRequest RequestType = "http" ) // APIConfig defines the data structure of the api gateway configuration diff --git a/pkg/context/http/context_test.go b/pkg/context/http/context_test.go index 8811a5b6b..3f94c49bf 100644 --- a/pkg/context/http/context_test.go +++ b/pkg/context/http/context_test.go @@ -21,6 +21,10 @@ import ( "testing" ) +import ( + "github.com/stretchr/testify/assert" +) + import ( "github.com/dubbogo/dubbo-go-proxy/pkg/common/extension" "github.com/dubbogo/dubbo-go-proxy/pkg/config" @@ -29,7 +33,6 @@ import ( _ "github.com/dubbogo/dubbo-go-proxy/pkg/filter" "github.com/dubbogo/dubbo-go-proxy/pkg/model" "github.com/dubbogo/dubbo-go-proxy/pkg/router" - "github.com/stretchr/testify/assert" ) func getMockAPI(verb config.HTTPVerb, urlPattern string, filters ...string) router.API { diff --git a/pkg/proxy/listener.go b/pkg/proxy/listener.go index f7bd449c9..791e787e1 100644 --- a/pkg/proxy/listener.go +++ b/pkg/proxy/listener.go @@ -25,6 +25,10 @@ import ( "time" ) +import ( + "github.com/pkg/errors" +) + import ( "github.com/dubbogo/dubbo-go-proxy/pkg/common/constant" "github.com/dubbogo/dubbo-go-proxy/pkg/common/extension" @@ -34,7 +38,6 @@ import ( "github.com/dubbogo/dubbo-go-proxy/pkg/logger" "github.com/dubbogo/dubbo-go-proxy/pkg/model" "github.com/dubbogo/dubbo-go-proxy/pkg/router" - "github.com/pkg/errors" ) // ListenerService the facade of a listener From 37879d0ffce9af05628b932d16bf4c993870b68f Mon Sep 17 00:00:00 2001 From: tiecheng Date: Sun, 25 Oct 2020 17:23:36 +0800 Subject: [PATCH 160/227] add timeout filter --- pkg/common/constant/key.go | 5 +- pkg/common/extension/filter.go | 2 +- pkg/context/base_context.go | 5 +- pkg/filter/filter.go | 21 ++++- .../recovery.go} | 16 +++- pkg/filter/recovery/recovery_test.go | 64 ++++++++++++++ pkg/filter/timeout/timeout.go | 52 ++++------- pkg/filter/timeout/timeout_test.go | 87 +++++++++++++++++++ 8 files changed, 208 insertions(+), 44 deletions(-) rename pkg/filter/{recovery_filter.go => recovery/recovery.go} (78%) create mode 100644 pkg/filter/recovery/recovery_test.go create mode 100644 pkg/filter/timeout/timeout_test.go diff --git a/pkg/common/constant/key.go b/pkg/common/constant/key.go index 3cd2c914a..f523847b8 100644 --- a/pkg/common/constant/key.go +++ b/pkg/common/constant/key.go @@ -24,9 +24,8 @@ const ( HttpDomainFilter = "dgp.filters.http.domain" HttpTransferDubboFilter = "dgp.filters.http_transfer_dubbo" TimeoutFilter = "dgp.filters.timeout" - - LoggerFilter = "dgp.filters.logger" - RecoveryFilter = "dgp.filters.recovery" + LoggerFilter = "dgp.filters.logger" + RecoveryFilter = "dgp.filters.recovery" ) const ( diff --git a/pkg/common/extension/filter.go b/pkg/common/extension/filter.go index 3aa0c7ab3..11c0b1d7e 100644 --- a/pkg/common/extension/filter.go +++ b/pkg/common/extension/filter.go @@ -22,7 +22,7 @@ import ( ) var ( - filterFuncCacheMap = make(map[string]func(ctx context.Context)) + filterFuncCacheMap = make(map[string]func(ctx context.Context), 4) ) // SetFilterFunc will store the @filter and @name diff --git a/pkg/context/base_context.go b/pkg/context/base_context.go index f9b5962f3..61dc1caf2 100644 --- a/pkg/context/base_context.go +++ b/pkg/context/base_context.go @@ -18,6 +18,7 @@ package context import ( + "context" "math" "time" ) @@ -30,6 +31,7 @@ type BaseContext struct { Index int8 Filters FilterChain Timeout *time.Duration + Ctx context.Context } func NewBaseContext() *BaseContext { @@ -57,9 +59,10 @@ func (c *BaseContext) AppendFilterFunc(ff ...FilterFunc) { } } +// GetTimeout get func (c *BaseContext) GetTimeout(t *time.Duration) time.Duration { if t == nil { - return 3 * time.Second + return 1 * time.Second } return *t diff --git a/pkg/filter/filter.go b/pkg/filter/filter.go index 45b07b53d..064a170cd 100644 --- a/pkg/filter/filter.go +++ b/pkg/filter/filter.go @@ -1,9 +1,26 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + */ + package filter import "github.com/dubbogo/dubbo-go-proxy/pkg/context" // Filter filter interface. type Filter interface { - // Run do filter, next() to next filter, before is pre logic, after is post logic. - Run() context.FilterFunc + // Do run filter, use c.next() to next filter, before is pre logic, after is post logic. + Do() context.FilterFunc } diff --git a/pkg/filter/recovery_filter.go b/pkg/filter/recovery/recovery.go similarity index 78% rename from pkg/filter/recovery_filter.go rename to pkg/filter/recovery/recovery.go index 1079ddbe5..c81a72a7d 100644 --- a/pkg/filter/recovery_filter.go +++ b/pkg/filter/recovery/recovery.go @@ -15,7 +15,7 @@ * limitations under the License. */ -package filter +package recovery import ( "github.com/dubbogo/dubbo-go-proxy/pkg/common/constant" @@ -25,11 +25,19 @@ import ( ) func init() { - extension.SetFilterFunc(constant.RecoveryFilter, Recover()) + extension.SetFilterFunc(constant.RecoveryFilter, NewRecoveryFilter().Do()) } -// Recover -func Recover() context.FilterFunc { +type recoveryFilter struct { +} + +// NewRecoveryFilter create timeout filter. +func NewRecoveryFilter() *recoveryFilter { + return &recoveryFilter{} +} + +// Do recoveryFilter execute filter logic. +func (f *recoveryFilter) Do() context.FilterFunc { return func(c context.Context) { defer func() { if err := recover(); err != nil { diff --git a/pkg/filter/recovery/recovery_test.go b/pkg/filter/recovery/recovery_test.go new file mode 100644 index 000000000..0ff6435ce --- /dev/null +++ b/pkg/filter/recovery/recovery_test.go @@ -0,0 +1,64 @@ +package recovery + +import ( + "context" + "fmt" + "net/http" + "testing" + "time" +) + +import ( + selfcontext "github.com/dubbogo/dubbo-go-proxy/pkg/context" + selfhttp "github.com/dubbogo/dubbo-go-proxy/pkg/context/http" +) + +func TestRecovery(t *testing.T) { + c := MockHttpContext(func(c selfcontext.Context) { + time.Sleep(time.Millisecond * 100) + // panic + var m map[string]string + m["name"] = "1" + }) + c.Next() + // print + // 500 + // "assignment to entry in nil map" +} + +func MockHttpContext(fc ...selfcontext.FilterFunc) *selfhttp.HttpContext { + result := &selfhttp.HttpContext{ + BaseContext: &selfcontext.BaseContext{ + Index: -1, + Ctx: context.Background(), + }, + } + + w := MockWriter{header: map[string][]string{}} + result.ResetWritermen(&w) + result.Reset() + + result.Filters = append(result.Filters, NewRecoveryFilter().Do()) + for i := range fc { + result.Filters = append(result.Filters, fc[i]) + } + + return result +} + +type MockWriter struct { + header http.Header +} + +func (w *MockWriter) Header() http.Header { + return w.header +} + +func (w *MockWriter) Write(b []byte) (int, error) { + fmt.Println(string(b)) + return -1, nil +} + +func (w *MockWriter) WriteHeader(statusCode int) { + fmt.Println(statusCode) +} diff --git a/pkg/filter/timeout/timeout.go b/pkg/filter/timeout/timeout.go index cb201e96a..f4a00a054 100644 --- a/pkg/filter/timeout/timeout.go +++ b/pkg/filter/timeout/timeout.go @@ -20,10 +20,11 @@ package timeout import ( "context" "encoding/json" - "fmt" "net/http" "time" +) +import ( "github.com/dubbogo/dubbo-go-proxy/pkg/common/constant" "github.com/dubbogo/dubbo-go-proxy/pkg/common/extension" selfcontext "github.com/dubbogo/dubbo-go-proxy/pkg/context" @@ -32,14 +33,13 @@ import ( const ( // timeout code - HandlerFuncTimeout = "E509" + TimeoutError = "S005" // unknown code - ErrUnknownError = "E003" + UnknownError = "S003" ) -// TODO 改初始化的时候注入 func init() { - extension.SetFilterFunc(constant.TimeoutFilter, NewTimeoutFilter().Run()) + extension.SetFilterFunc(constant.TimeoutFilter, NewTimeoutFilter().Do()) } // timeoutFilter is a filter for control request time out. @@ -54,54 +54,40 @@ func NewTimeoutFilter() *timeoutFilter { } } -// DoFilter do filter. -func (f *timeoutFilter) Run() selfcontext.FilterFunc { +// Do timeoutFilter execute filter logic. +func (f *timeoutFilter) Do() selfcontext.FilterFunc { return func(c selfcontext.Context) { hc := c.(*contexthttp.HttpContext) - ctx, cancel := context.WithTimeout(context.Background(), hc.GetTimeout(hc.Timeout)) - + ctx, cancel := context.WithTimeout(hc.Ctx, hc.GetTimeout(hc.Timeout)) + defer cancel() // Channel capacity must be greater than 0. // Otherwise, if the parent coroutine quit due to timeout, // the child coroutine may never be able to quit. - finish := make(chan struct{}, 1) - panicChan := make(chan interface{}, 1) + finishChan := make(chan struct{}, 1) go func() { - // 变动点1: 增加子协程的recover - defer func() { - if p := recover(); p != nil { - panicChan <- p - } - }() + // panic by recovery c.Next() - finish <- struct{}{} + finishChan <- struct{}{} }() select { - case p := <-panicChan: - bt, _ := json.Marshal(errResponse{Code: ErrUnknownError, - Msg: fmt.Sprintf("unknow internal error, %v", p)}) - c.WriteWithStatus(http.StatusInternalServerError, bt) - c.Abort() case <-ctx.Done(): hc.Lock.Lock() defer hc.Lock.Unlock() - - bt, _ := json.Marshal(errResponse{Code: HandlerFuncTimeout, - Msg: http.ErrHandlerTimeout.Error()}) - c.WriteWithStatus(http.StatusInternalServerError, bt) + bt, _ := json.Marshal(errResponse{Code: TimeoutError, + Message: http.ErrHandlerTimeout.Error()}) + c.WriteWithStatus(http.StatusServiceUnavailable, bt) c.Abort() - cancel() - // If timeout happen, the buffer cannot be cleared actively, - // but wait for the GC to recycle. - case <-finish: + case <-finishChan: hc.Lock.Lock() defer hc.Lock.Unlock() + // finish callback } } } type errResponse struct { - Code string `json:"code"` - Msg string `json:"msg"` + Code string `json:"code"` + Message string `json:"message"` } diff --git a/pkg/filter/timeout/timeout_test.go b/pkg/filter/timeout/timeout_test.go new file mode 100644 index 000000000..2121aede1 --- /dev/null +++ b/pkg/filter/timeout/timeout_test.go @@ -0,0 +1,87 @@ +package timeout + +import ( + "context" + "fmt" + "github.com/dubbogo/dubbo-go-proxy/pkg/filter/recovery" + "net/http" + "testing" + "time" +) + +import ( + selfcontext "github.com/dubbogo/dubbo-go-proxy/pkg/context" + selfhttp "github.com/dubbogo/dubbo-go-proxy/pkg/context/http" +) + +func TestPanic(t *testing.T) { + c := MockHttpContext(testPanicFilter) + c.Next() + // print + // 500 + // "timeout filter test panic" +} + +var testPanicFilter = func(c selfcontext.Context) { + time.Sleep(time.Millisecond * 100) + panic("timeout filter test panic") +} + +func TestTimeout(t *testing.T) { + c := MockHttpContext(testTimeoutFilter) + c.Next() + // print + // 503 + // {"code":"S005","message":"http: Handler timeout"} +} + +var testTimeoutFilter = func(c selfcontext.Context) { + time.Sleep(time.Second * 3) +} + +func TestNormal(t *testing.T) { + c := MockHttpContext(testNormalFilter) + c.Next() +} + +var testNormalFilter = func(c selfcontext.Context) { + time.Sleep(time.Millisecond * 200) + fmt.Println("normal call") +} + +func MockHttpContext(fc ...selfcontext.FilterFunc) *selfhttp.HttpContext { + result := &selfhttp.HttpContext{ + BaseContext: &selfcontext.BaseContext{ + Index: -1, + Ctx: context.Background(), + }, + } + + w := MockWriter{header: map[string][]string{}} + result.ResetWritermen(&w) + result.Reset() + + result.Filters = append(result.Filters, NewTimeoutFilter().Do(), recovery.NewRecoveryFilter().Do()) + for i := range fc { + result.Filters = append(result.Filters, fc[i]) + } + + return result +} + +type MockWriter struct { + header http.Header +} + +func (w *MockWriter) Header() http.Header { + return w.header +} + +func (w *MockWriter) Write(b []byte) (int, error) { + fmt.Println(string(b)) + return -1, nil +} + +func (w *MockWriter) WriteHeader(statusCode int) { + fmt.Println(statusCode) +} From 089e10387b5a2c038181bf0eb23aa209b5910520 Mon Sep 17 00:00:00 2001 From: "yangqing.xyq" Date: Mon, 26 Oct 2020 10:09:14 +0800 Subject: [PATCH 161/227] fix according to comments. --- pkg/client/httpclient/http_client.go | 2 +- pkg/client/httpclient/http_response.go | 2 +- pkg/context/base_context.go | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/pkg/client/httpclient/http_client.go b/pkg/client/httpclient/http_client.go index 99e5b0597..5eda83e26 100644 --- a/pkg/client/httpclient/http_client.go +++ b/pkg/client/httpclient/http_client.go @@ -23,7 +23,7 @@ const ( JavaLangClassName = "java.lang.Long" ) -// DubboMetadata dubbo metadata, api config +// RestMetadata dubbo metadata, api config type RestMetadata struct { ApplicationName string `yaml:"application_name" json:"application_name" mapstructure:"application_name"` Group string `yaml:"group" json:"group" mapstructure:"group"` diff --git a/pkg/client/httpclient/http_response.go b/pkg/client/httpclient/http_response.go index 68decac33..fcf3ceb85 100644 --- a/pkg/client/httpclient/http_response.go +++ b/pkg/client/httpclient/http_response.go @@ -10,7 +10,7 @@ import ( "github.com/dubbogo/dubbo-go-proxy/pkg/client" ) -// NewDubboResponse create dubbo response +// NewDubboResponse creates dubbo response func NewDubboResponse(data interface{}) *client.Response { r, err := dealResp(data, true) if err != nil { diff --git a/pkg/context/base_context.go b/pkg/context/base_context.go index b98f5ead4..c7b1b5428 100644 --- a/pkg/context/base_context.go +++ b/pkg/context/base_context.go @@ -46,7 +46,7 @@ func (c *BaseContext) Next() { } } -// AbortWithError filter chain break , filter after the current filter will not executed. +// Abort filter chain break , filter after the current filter will not executed. func (c *BaseContext) Abort() { c.Index = abortIndex } From 91007b38fe2cd9ae06e943216e6e10ed2bff065d Mon Sep 17 00:00:00 2001 From: "yangqing.xyq" Date: Mon, 26 Oct 2020 10:17:19 +0800 Subject: [PATCH 162/227] fix according to comments. --- pkg/client/dubbo/dubbo_client.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkg/client/dubbo/dubbo_client.go b/pkg/client/dubbo/dubbo_client.go index 0de5dadde..337e66cc6 100644 --- a/pkg/client/dubbo/dubbo_client.go +++ b/pkg/client/dubbo/dubbo_client.go @@ -20,7 +20,6 @@ package dubbo import ( "context" "encoding/json" - "github.com/dubbogo/dubbo-go-proxy/pkg/client" "strings" "sync" "time" @@ -30,6 +29,7 @@ import ( "github.com/apache/dubbo-go/common/constant" dg "github.com/apache/dubbo-go/config" "github.com/apache/dubbo-go/protocol/dubbo" + "github.com/dubbogo/dubbo-go-proxy/pkg/client" ) import ( From 3e0696d7beb4f5192064f6805d98b1df18c353bd Mon Sep 17 00:00:00 2001 From: "yangqing.xyq" Date: Mon, 26 Oct 2020 10:28:10 +0800 Subject: [PATCH 163/227] add license --- pkg/client/httpclient/http_client.go | 17 +++++++++++++++++ pkg/client/httpclient/http_response.go | 16 ++++++++++++++++ pkg/client/metadata.go | 16 ++++++++++++++++ pkg/pool/pool.go | 17 +++++++++++++++++ 4 files changed, 66 insertions(+) diff --git a/pkg/client/httpclient/http_client.go b/pkg/client/httpclient/http_client.go index 5eda83e26..c3f1a0459 100644 --- a/pkg/client/httpclient/http_client.go +++ b/pkg/client/httpclient/http_client.go @@ -1,3 +1,20 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + */ + package httpclient import ( diff --git a/pkg/client/httpclient/http_response.go b/pkg/client/httpclient/http_response.go index fcf3ceb85..fc73ea8d8 100644 --- a/pkg/client/httpclient/http_response.go +++ b/pkg/client/httpclient/http_response.go @@ -1,3 +1,19 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + */ package httpclient import ( diff --git a/pkg/client/metadata.go b/pkg/client/metadata.go index d1dd651c3..164b01624 100644 --- a/pkg/client/metadata.go +++ b/pkg/client/metadata.go @@ -1,3 +1,19 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + */ package client // DubboMetadata dubbo metadata, api config diff --git a/pkg/pool/pool.go b/pkg/pool/pool.go index 2ad473c7d..82cdbb680 100644 --- a/pkg/pool/pool.go +++ b/pkg/pool/pool.go @@ -1,3 +1,20 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + */ + package pool import ( From cc8aa654db4af77668cbb6ddc142238d901dc430 Mon Sep 17 00:00:00 2001 From: "yangqing.xyq" Date: Mon, 26 Oct 2020 10:34:11 +0800 Subject: [PATCH 164/227] move to new package to resolve cycle dependents --- pkg/proxy/proxy_start.go | 5 +++-- pkg/service/api/discovery_service.go | 4 ++-- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/pkg/proxy/proxy_start.go b/pkg/proxy/proxy_start.go index 9b87e0d9c..99151650e 100644 --- a/pkg/proxy/proxy_start.go +++ b/pkg/proxy/proxy_start.go @@ -19,6 +19,7 @@ package proxy import ( "encoding/json" + "github.com/dubbogo/dubbo-go-proxy/pkg/client" "sync" ) @@ -74,7 +75,7 @@ func (p *Proxy) beforeStart() { OTypeStr: "DUBBO", Method: "POST", Status: 1, - Metadata: map[string]dubbo.DubboMetadata{ + Metadata: map[string]client.DubboMetadata{ "dubbo": { ApplicationName: "BDTService", Group: "test", @@ -94,7 +95,7 @@ func (p *Proxy) beforeStart() { OTypeStr: "DUBBO", Method: "POST", Status: 1, - Metadata: map[string]dubbo.DubboMetadata{ + Metadata: map[string]client.DubboMetadata{ "dubbo": { ApplicationName: "BDTService", Group: "test", diff --git a/pkg/service/api/discovery_service.go b/pkg/service/api/discovery_service.go index 6c0d52380..6d4d9068a 100644 --- a/pkg/service/api/discovery_service.go +++ b/pkg/service/api/discovery_service.go @@ -20,6 +20,7 @@ package api import ( "encoding/json" "errors" + "github.com/dubbogo/dubbo-go-proxy/pkg/client" ) import ( @@ -27,7 +28,6 @@ import ( ) import ( - "github.com/dubbogo/dubbo-go-proxy/pkg/client/dubbo" "github.com/dubbogo/dubbo-go-proxy/pkg/common/constant" "github.com/dubbogo/dubbo-go-proxy/pkg/common/extension" "github.com/dubbogo/dubbo-go-proxy/pkg/logger" @@ -62,7 +62,7 @@ func (ads *LocalMemoryApiDiscoveryService) AddApi(request service.DiscoveryReque } else { if v, ok := aj.Metadata.(map[string]interface{}); ok { if d, ok := v["dubbo"]; ok { - dm := &dubbo.DubboMetadata{} + dm := &client.DubboMetadata{} if err := mapstructure.Decode(d, dm); err != nil { return *service.EmptyDiscoveryResponse, err } From 4e97f7cb9360caae424eefa5c5df31f73960d04f Mon Sep 17 00:00:00 2001 From: xiaoliu <18721825717@163.com> Date: Tue, 27 Oct 2020 09:03:22 +0800 Subject: [PATCH 165/227] 1. FIX remove address list --- configs/conf.yaml | 13 +++++-------- pkg/model/pprof.go | 4 ++-- pkg/proxy/proxy_start.go | 12 +++--------- 3 files changed, 10 insertions(+), 19 deletions(-) diff --git a/configs/conf.yaml b/configs/conf.yaml index 659c37df7..580cc8e59 100644 --- a/configs/conf.yaml +++ b/configs/conf.yaml @@ -49,11 +49,8 @@ static_resources: connect_timeout: "5s" pprofConf: enable: true - addr: "pprof" - -addresses: - - name: "pprof" - socket_address: - protocol_type: "HTTP" - address: "0.0.0.0" - port: 6060 \ No newline at end of file + address: + socket_address: + protocol_type: "HTTP" + address: "0.0.0.0" + port: 6060 diff --git a/pkg/model/pprof.go b/pkg/model/pprof.go index d955c63cc..5d3e78d6a 100644 --- a/pkg/model/pprof.go +++ b/pkg/model/pprof.go @@ -18,6 +18,6 @@ package model type PprofConf struct { - Enable bool `yaml:"enable" json:"enable" mapstructure:"enable" default: false` - Addr string `yaml:"addr" json:"addr" mapstructure:"addr"` + Enable bool `yaml:"enable" json:"enable" mapstructure:"enable" default: false` + Address Address `yaml:"address" json:"address" mapstructure:"address"` } diff --git a/pkg/proxy/proxy_start.go b/pkg/proxy/proxy_start.go index 9ad61dd9e..3508fc357 100644 --- a/pkg/proxy/proxy_start.go +++ b/pkg/proxy/proxy_start.go @@ -65,15 +65,9 @@ func (p *Proxy) Start() { } if conf.GetPprof().Enable { - addr := conf.GetPprof().Addr - for _, address := range conf.Addresses { - if addr == address.Name { - fullAddr := address.SocketAddress.Address + ":" + strconv.Itoa(address.SocketAddress.Port) - go http.ListenAndServe(fullAddr, nil) - logger.Infof("[dubboproxy go pprof] httpListener start by : %s", fullAddr) - break - } - } + addr := conf.GetPprof().Address.SocketAddress + go http.ListenAndServe(addr.Address + ":" + strconv.Itoa(addr.Port), nil) + logger.Infof("[dubboproxy go pprof] httpListener start by : %s", addr.Address + ":" + strconv.Itoa(addr.Port)) } } From e639af42640782a8eb91c22647915cd6ae572789 Mon Sep 17 00:00:00 2001 From: "yangqing.xyq" Date: Tue, 27 Oct 2020 19:46:58 +0800 Subject: [PATCH 166/227] move to new package to resolve cycle dependents --- pkg/client/httpclient/http_client.go | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/pkg/client/httpclient/http_client.go b/pkg/client/httpclient/http_client.go index c3f1a0459..fd4760f11 100644 --- a/pkg/client/httpclient/http_client.go +++ b/pkg/client/httpclient/http_client.go @@ -100,8 +100,9 @@ func (dc *HTTPClient) Close() error { } // Call invoke service -func (dc *HTTPClient) Call(r *client.Request) (resp client.Response, err error) { +func (dc *HTTPClient) Call(r *client.Request) (resp *client.Response, err error) { //TODO:get Matched rest api url according to input url ,then make a http call. + return nil, nil } func (dc *HTTPClient) get(key string) *dg.GenericService { From b473686ce56de6bd4fab7d81399158888e839a8e Mon Sep 17 00:00:00 2001 From: zhangshen023 <1292369127@qq.com> Date: Tue, 27 Oct 2020 19:55:20 +0800 Subject: [PATCH 167/227] delete client.yml --- configs/client.yml | 57 ---------------------------------------------- 1 file changed, 57 deletions(-) delete mode 100644 configs/client.yml diff --git a/configs/client.yml b/configs/client.yml deleted file mode 100644 index 17e323f2d..000000000 --- a/configs/client.yml +++ /dev/null @@ -1,57 +0,0 @@ -# dubbo client yaml configure file - - -check: true -# client -request_timeout: "10s" -# connect timeout -connect_timeout: "3s" - -# application config -application: - organization: "dubbogo" - name: "dubbo-go-proxy" - module: "dubbo-go-proxy" - version: "1.0.0" - group: "test" - owner: "PTY" - environment: "dev" - -registries: - "zk_1": - protocol: "zookeeper" - timeout: "3s" - address: "127.0.0.1:2182" - username: "" - password: "" -references: - -protocol_conf: - dubbo: - reconnect_interval: 0 - connection_number: 2 - heartbeat_period: "30s" - session_timeout: "360s" - fail_fast_timeout: "5s" - pool_size: 4 - pool_ttl: 600 - # gr_pool_size is recommended to be set to [cpu core number] * 100 - gr_pool_size: 200 - # queue_len is recommended to be set to 64 or 128 - queue_len: 64 - # queue_number is recommended to be set to gr_pool_size / 20 - queue_number: 10 - getty_session_param: - compress_encoding: false - tcp_no_delay: true - tcp_keep_alive: true - keep_alive_period: "120s" - tcp_r_buf_size: 262144 - tcp_w_buf_size: 65536 - pkg_rq_size: 1024 - pkg_wq_size: 512 - tcp_read_timeout: "1s" #1 - tcp_write_timeout: "5s" #5 - wait_timeout: "5s" - max_msg_len: 10240000 - session_name: "client" From 1f5fef865e807199747ff9b7fa2a3fed7bd9a1b8 Mon Sep 17 00:00:00 2001 From: "yangqing.xyq" Date: Tue, 27 Oct 2020 19:55:53 +0800 Subject: [PATCH 168/227] move to new package to resolve cycle dependents --- pkg/filter/remote_call_filter.go | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/pkg/filter/remote_call_filter.go b/pkg/filter/remote_call_filter.go index 707cd7663..644214dbb 100644 --- a/pkg/filter/remote_call_filter.go +++ b/pkg/filter/remote_call_filter.go @@ -18,6 +18,7 @@ package filter import ( + "github.com/dubbogo/dubbo-go-proxy/pkg/pool" "io/ioutil" ) @@ -51,7 +52,7 @@ func RemoteCall() context.FilterFunc { func doRemoteCall(c *http.HttpContext) { api := c.GetApi() - cl, e := client.SingletonPool().GetClient(api.IType) + cl, e := pool.SingletonPool().GetClient(api.IType) if e != nil { c.WriteFail() c.AbortWithError("", e) From 9cd36905dc3b0f286abdd848d89d5b6436f2a796 Mon Sep 17 00:00:00 2001 From: xiaoliu <18721825717@163.com> Date: Wed, 28 Oct 2020 18:15:08 +0800 Subject: [PATCH 169/227] 1. FIX pprof config enable default value 2. add pprof config default address and port --- configs/conf.yaml | 1 - pkg/common/constant/http.go | 5 +++++ pkg/model/pprof.go | 2 +- pkg/proxy/proxy_start.go | 10 ++++++++-- 4 files changed, 14 insertions(+), 4 deletions(-) diff --git a/configs/conf.yaml b/configs/conf.yaml index 580cc8e59..598219c9a 100644 --- a/configs/conf.yaml +++ b/configs/conf.yaml @@ -51,6 +51,5 @@ static_resources: enable: true address: socket_address: - protocol_type: "HTTP" address: "0.0.0.0" port: 6060 diff --git a/pkg/common/constant/http.go b/pkg/common/constant/http.go index d831ce8a6..e8ca72c80 100644 --- a/pkg/common/constant/http.go +++ b/pkg/common/constant/http.go @@ -30,3 +30,8 @@ const ( Http1HeaderKeyHost = "Host" Http2HeaderKeyHost = ":authority" ) + +const ( + PprofDefaultAddress = "0.0.0.0" + PprofDefaultPort = 7070 +) diff --git a/pkg/model/pprof.go b/pkg/model/pprof.go index 5d3e78d6a..e27f72470 100644 --- a/pkg/model/pprof.go +++ b/pkg/model/pprof.go @@ -18,6 +18,6 @@ package model type PprofConf struct { - Enable bool `yaml:"enable" json:"enable" mapstructure:"enable" default: false` + Enable bool `yaml:"enable" json:"enable" mapstructure:"enable" default:"false"` Address Address `yaml:"address" json:"address" mapstructure:"address"` } diff --git a/pkg/proxy/proxy_start.go b/pkg/proxy/proxy_start.go index 3508fc357..875e136f7 100644 --- a/pkg/proxy/proxy_start.go +++ b/pkg/proxy/proxy_start.go @@ -66,8 +66,14 @@ func (p *Proxy) Start() { if conf.GetPprof().Enable { addr := conf.GetPprof().Address.SocketAddress - go http.ListenAndServe(addr.Address + ":" + strconv.Itoa(addr.Port), nil) - logger.Infof("[dubboproxy go pprof] httpListener start by : %s", addr.Address + ":" + strconv.Itoa(addr.Port)) + if len(addr.Address) == 0 { + addr.Address = constant.PprofDefaultAddress + } + if addr.Port == 0 { + addr.Port = constant.PprofDefaultPort + } + go http.ListenAndServe(addr.Address+":"+strconv.Itoa(addr.Port), nil) + logger.Infof("[dubboproxy go pprof] httpListener start by : %s", addr.Address+":"+strconv.Itoa(addr.Port)) } } From 55f2cbb96db8eeaa54f68825cc9f7a6c9c6f107b Mon Sep 17 00:00:00 2001 From: williamfeng323 Date: Wed, 28 Oct 2020 22:35:13 +0800 Subject: [PATCH 170/227] update according to alex's comment --- pkg/proxy/listener_test.go | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/pkg/proxy/listener_test.go b/pkg/proxy/listener_test.go index d9557858e..321436621 100644 --- a/pkg/proxy/listener_test.go +++ b/pkg/proxy/listener_test.go @@ -24,6 +24,10 @@ import ( "testing" ) +import ( + "github.com/stretchr/testify/assert" +) + import ( "github.com/dubbogo/dubbo-go-proxy/pkg/common/constant" "github.com/dubbogo/dubbo-go-proxy/pkg/common/extension" @@ -32,7 +36,6 @@ import ( ctxHttp "github.com/dubbogo/dubbo-go-proxy/pkg/context/http" "github.com/dubbogo/dubbo-go-proxy/pkg/model" "github.com/dubbogo/dubbo-go-proxy/pkg/router" - "github.com/stretchr/testify/assert" ) func getTestContext() *ctxHttp.HttpContext { @@ -75,6 +78,7 @@ func getMockAPI(verb config.HTTPVerb, urlPattern string) router.API { Method: method, } } + func TestRouteRequest(t *testing.T) { mockAPI := getMockAPI(config.MethodPost, "/mock/test") mockAPI.Method.OnAir = false From fe3b5dae4bc567436f704139f87ae2d4ae59e7a4 Mon Sep 17 00:00:00 2001 From: tiecheng Date: Thu, 29 Oct 2020 13:09:20 +0800 Subject: [PATCH 171/227] add License for timeout_test.go --- pkg/filter/timeout/timeout_test.go | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/pkg/filter/timeout/timeout_test.go b/pkg/filter/timeout/timeout_test.go index 2121aede1..fb35de81f 100644 --- a/pkg/filter/timeout/timeout_test.go +++ b/pkg/filter/timeout/timeout_test.go @@ -1,3 +1,20 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + */ + package timeout import ( From 70f09dd63e81f30a1f95f554d208ff2cdf2e02d6 Mon Sep 17 00:00:00 2001 From: oaoit Date: Thu, 29 Oct 2020 15:19:33 +0800 Subject: [PATCH 172/227] split the import block and move this package to the 1st import block. --- pkg/filter/authority_filter.go | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/pkg/filter/authority_filter.go b/pkg/filter/authority_filter.go index 1376a6a29..eb3d893fe 100644 --- a/pkg/filter/authority_filter.go +++ b/pkg/filter/authority_filter.go @@ -17,13 +17,16 @@ package filter +import ( + nh "net/http" +) + import ( "github.com/dubbogo/dubbo-go-proxy/pkg/common/constant" "github.com/dubbogo/dubbo-go-proxy/pkg/common/extension" "github.com/dubbogo/dubbo-go-proxy/pkg/context" "github.com/dubbogo/dubbo-go-proxy/pkg/context/http" "github.com/dubbogo/dubbo-go-proxy/pkg/model" - nh "net/http" ) func init() { From 4ffb621170a355a47f6c2e256f5562d605da1ce8 Mon Sep 17 00:00:00 2001 From: oaoit Date: Thu, 29 Oct 2020 15:56:23 +0800 Subject: [PATCH 173/227] use len(ip) != 0 instead of ip != "" --- pkg/context/http/context.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/pkg/context/http/context.go b/pkg/context/http/context.go index f5cb7c5b0..78ce2251e 100644 --- a/pkg/context/http/context.go +++ b/pkg/context/http/context.go @@ -128,16 +128,16 @@ func (hc *HttpContext) GetAPI() *router.API { func (hc *HttpContext) GetClientIP() string { xForwardedFor := hc.Request.Header.Get("X-Forwarded-For") ip := strings.TrimSpace(strings.Split(xForwardedFor, ",")[0]) - if ip != "" { + if len(ip) != 0 { return ip } ip = strings.TrimSpace(hc.Request.Header.Get("X-Real-Ip")) - if ip != "" { + if len(ip) != 0 { return ip } - if ip, _, err := net.SplitHostPort(strings.TrimSpace(hc.Request.RemoteAddr)); err == nil { + if ip, _, err := net.SplitHostPort(strings.TrimSpace(hc.Request.RemoteAddr)); err == nil && len(ip) != 0 { return ip } From 26cd00bdd5eeef928f5346b5dc81804442e064db Mon Sep 17 00:00:00 2001 From: oaoit Date: Thu, 29 Oct 2020 16:05:25 +0800 Subject: [PATCH 174/227] struct field GenerateRequestId be changed to GenerateRequestID --- pkg/model/http.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkg/model/http.go b/pkg/model/http.go index b92a498c0..ebc91520b 100644 --- a/pkg/model/http.go +++ b/pkg/model/http.go @@ -25,7 +25,7 @@ type HttpConnectionManager struct { ServerName string `yaml:"server_name" json:"server_name" mapstructure:"server_name"` IdleTimeoutStr string `yaml:"idle_timeout" json:"idle_timeout" mapstructure:"idle_timeout"` AccessLog AccessLog `yaml:"access_log" json:"access_log" mapstructure:"access_log"` - GenerateRequestId bool `yaml:"generate_request_id" json:"generate_request_id" mapstructure:"generate_request_id"` + GenerateRequestID bool `yaml:"generate_request_id" json:"generate_request_id" mapstructure:"generate_request_id"` } // CorsPolicy From 8c3a5e2a77ec4e59f4648996322c2e1d3d597add Mon Sep 17 00:00:00 2001 From: oaoit Date: Thu, 29 Oct 2020 16:22:13 +0800 Subject: [PATCH 175/227] const Http**Filter be changed to HTTP**Filter. --- pkg/common/constant/key.go | 12 ++++++------ pkg/context/http/context.go | 2 +- pkg/filter/api_filter.go | 2 +- pkg/filter/authority_filter.go | 2 +- pkg/filter/dubbo_filter.go | 2 +- pkg/filter/http_filter.go | 2 +- pkg/filter/router_filter.go | 2 +- pkg/proxy/http.go | 2 +- pkg/proxy/listener.go | 2 +- 9 files changed, 14 insertions(+), 14 deletions(-) diff --git a/pkg/common/constant/key.go b/pkg/common/constant/key.go index 19d9f83be..6afe78a6e 100644 --- a/pkg/common/constant/key.go +++ b/pkg/common/constant/key.go @@ -18,12 +18,12 @@ package constant const ( - HttpConnectManagerFilter = "dgp.filters.http_connect_manager" - HttpAuthorityFilter = "dgp.filters.http.authority_filter" - HttpRouterFilter = "dgp.filters.http.router" - HttpApiFilter = "dgp.filters.http.api" - HttpDomainFilter = "dgp.filters.http.domain" - HttpTransferDubboFilter = "dgp.filters.http_transfer_dubbo" + HTTPConnectManagerFilter = "dgp.filters.http_connect_manager" + HTTPAuthorityFilter = "dgp.filters.http.authority_filter" + HTTPRouterFilter = "dgp.filters.http.router" + HTTPApiFilter = "dgp.filters.http.api" + HTTPDomainFilter = "dgp.filters.http.domain" + HTTPTransferDubboFilter = "dgp.filters.http_transfer_dubbo" LoggerFilter = "dgp.filters.logger" RecoveryFilter = "dgp.filters.recovery" diff --git a/pkg/context/http/context.go b/pkg/context/http/context.go index 78ce2251e..2e4637ab9 100644 --- a/pkg/context/http/context.go +++ b/pkg/context/http/context.go @@ -210,7 +210,7 @@ func (hc *HttpContext) BuildFilters() { switch api.Method.IntegrationRequest.RequestType { case config.DubboRequest: - hc.AppendFilterFunc(extension.GetMustFilterFunc(constant.HttpTransferDubboFilter)) + hc.AppendFilterFunc(extension.GetMustFilterFunc(constant.HTTPTransferDubboFilter)) case config.HTTPRequest: break } diff --git a/pkg/filter/api_filter.go b/pkg/filter/api_filter.go index fbdbd253b..14fe6b908 100644 --- a/pkg/filter/api_filter.go +++ b/pkg/filter/api_filter.go @@ -29,7 +29,7 @@ import ( ) func init() { - extension.SetFilterFunc(constant.HttpApiFilter, ApiFilter()) + extension.SetFilterFunc(constant.HTTPApiFilter, ApiFilter()) } // ApiFilter url match api diff --git a/pkg/filter/authority_filter.go b/pkg/filter/authority_filter.go index eb3d893fe..2893ad8df 100644 --- a/pkg/filter/authority_filter.go +++ b/pkg/filter/authority_filter.go @@ -30,7 +30,7 @@ import ( ) func init() { - extension.SetFilterFunc(constant.HttpAuthorityFilter, Authority()) + extension.SetFilterFunc(constant.HTTPAuthorityFilter, Authority()) } // blacklist/whitelist filter diff --git a/pkg/filter/dubbo_filter.go b/pkg/filter/dubbo_filter.go index be1af73fc..1ae6b7b9c 100644 --- a/pkg/filter/dubbo_filter.go +++ b/pkg/filter/dubbo_filter.go @@ -40,7 +40,7 @@ import ( ) func init() { - extension.SetFilterFunc(constant.HttpTransferDubboFilter, HttpDubbo()) + extension.SetFilterFunc(constant.HTTPTransferDubboFilter, HttpDubbo()) } // HttpDubbo http 2 dubbo diff --git a/pkg/filter/http_filter.go b/pkg/filter/http_filter.go index c306ef2e6..a03189a11 100644 --- a/pkg/filter/http_filter.go +++ b/pkg/filter/http_filter.go @@ -25,7 +25,7 @@ import ( ) func init() { - extension.SetFilterFunc(constant.HttpDomainFilter, Domain()) + extension.SetFilterFunc(constant.HTTPDomainFilter, Domain()) } // Domain diff --git a/pkg/filter/router_filter.go b/pkg/filter/router_filter.go index a5871f4ef..bc4739004 100644 --- a/pkg/filter/router_filter.go +++ b/pkg/filter/router_filter.go @@ -31,7 +31,7 @@ import ( ) func init() { - extension.SetFilterFunc(constant.HttpRouterFilter, HttpRouting()) + extension.SetFilterFunc(constant.HTTPRouterFilter, HttpRouting()) } // HttpRouting http router filter diff --git a/pkg/proxy/http.go b/pkg/proxy/http.go index 889484bf4..846f4033a 100644 --- a/pkg/proxy/http.go +++ b/pkg/proxy/http.go @@ -39,7 +39,7 @@ func DefaultHttpConnectionManager() *model.HttpConnectionManager { }, HttpFilters: []model.HttpFilter{ { - Name: constant.HttpRouterFilter, + Name: constant.HTTPRouterFilter, }, }, } diff --git a/pkg/proxy/listener.go b/pkg/proxy/listener.go index 791e787e1..18096f5c5 100644 --- a/pkg/proxy/listener.go +++ b/pkg/proxy/listener.go @@ -98,7 +98,7 @@ func (l *ListenerService) allocateContext() *h.HttpContext { func (l *ListenerService) findHttpManager() model.HttpConnectionManager { for _, fc := range l.FilterChains { for _, f := range fc.Filters { - if f.Name == constant.HttpConnectManagerFilter { + if f.Name == constant.HTTPConnectManagerFilter { return *f.Config.(*model.HttpConnectionManager) } } From 963b452c140724d86752541b932206efdc41e050 Mon Sep 17 00:00:00 2001 From: oaoit Date: Thu, 29 Oct 2020 17:49:28 +0800 Subject: [PATCH 176/227] add comments. --- pkg/common/constant/key.go | 1 + pkg/config/config_load_test.go | 2 +- pkg/context/http/context.go | 2 ++ pkg/filter/authority_filter.go | 6 +++--- pkg/model/authority.go | 6 +++++- pkg/model/http.go | 6 +++--- pkg/proxy/http.go | 2 +- 7 files changed, 16 insertions(+), 9 deletions(-) diff --git a/pkg/common/constant/key.go b/pkg/common/constant/key.go index 6afe78a6e..07a0aeb55 100644 --- a/pkg/common/constant/key.go +++ b/pkg/common/constant/key.go @@ -17,6 +17,7 @@ package constant +// HTTP filter const const ( HTTPConnectManagerFilter = "dgp.filters.http_connect_manager" HTTPAuthorityFilter = "dgp.filters.http.authority_filter" diff --git a/pkg/config/config_load_test.go b/pkg/config/config_load_test.go index 80f308831..a6642dde8 100644 --- a/pkg/config/config_load_test.go +++ b/pkg/config/config_load_test.go @@ -84,7 +84,7 @@ func TestStruct2JSON(t *testing.T) { }, }, }, - HttpFilters: []model.HttpFilter{ + HTTPFilters: []model.HTTPFilter{ { Name: "dgp.filters.http.cors", }, diff --git a/pkg/context/http/context.go b/pkg/context/http/context.go index 2e4637ab9..43b894cb2 100644 --- a/pkg/context/http/context.go +++ b/pkg/context/http/context.go @@ -125,6 +125,7 @@ func (hc *HttpContext) GetAPI() *router.API { return &hc.api } +// GetClientIP get client IP func (hc *HttpContext) GetClientIP() string { xForwardedFor := hc.Request.Header.Get("X-Forwarded-For") ip := strings.TrimSpace(strings.Split(xForwardedFor, ",")[0]) @@ -144,6 +145,7 @@ func (hc *HttpContext) GetClientIP() string { return "" } +// GetApplicationName get application name func (hc *HttpContext) GetApplicationName() string { if u, err := url.Parse(hc.Request.RequestURI); err == nil { return strings.Split(u.Path, "/")[0] diff --git a/pkg/filter/authority_filter.go b/pkg/filter/authority_filter.go index 2893ad8df..fb9c53f96 100644 --- a/pkg/filter/authority_filter.go +++ b/pkg/filter/authority_filter.go @@ -33,7 +33,7 @@ func init() { extension.SetFilterFunc(constant.HTTPAuthorityFilter, Authority()) } -// blacklist/whitelist filter +// Authority blacklist/whitelist filter func Authority() context.FilterFunc { return func(c context.Context) { authorityFilter(c.(*http.HttpContext)) @@ -69,7 +69,7 @@ func passCheck(item string, rule model.AuthorityRule) bool { if (rule.Strategy == model.Blacklist && result == true) || (rule.Strategy == model.Whitelist && result == false) { return false - } else { - return true } + + return true } diff --git a/pkg/model/authority.go b/pkg/model/authority.go index 24293cbf5..e4532b2e6 100644 --- a/pkg/model/authority.go +++ b/pkg/model/authority.go @@ -17,10 +17,12 @@ package model +// AuthorityConfiguration blacklist/whitelist config type AuthorityConfiguration struct { - Rules []AuthorityRule `yaml:"authority_rule" json:"authority_rule"` //Rules the authority rule list + Rules []AuthorityRule `yaml:"authority_rules" json:"authority_rules"` //Rules the authority rule list } +// AuthorityRule blacklist/whitelist rule type AuthorityRule struct { Strategy StrategyType `yaml:"strategy" json:"strategy"` //Strategy the authority rule strategy Limit LimitType `yaml:"limit" json:"limit"` //Limit the authority rule limit @@ -30,6 +32,7 @@ type AuthorityRule struct { // StrategyType the authority rule strategy enum type StrategyType int32 +// StrategyType strategy type const const ( Whitelist StrategyType = 0 Blacklist StrategyType = 1 @@ -50,6 +53,7 @@ var StrategyTypeValue = map[string]int32{ // LimitType the authority rule limit enum type LimitType int32 +// LimitType limit type const const ( IP LimitType = 0 App LimitType = 1 diff --git a/pkg/model/http.go b/pkg/model/http.go index ebc91520b..b3e92d932 100644 --- a/pkg/model/http.go +++ b/pkg/model/http.go @@ -21,7 +21,7 @@ package model type HttpConnectionManager struct { RouteConfig RouteConfiguration `yaml:"route_config" json:"route_config" mapstructure:"route_config"` AuthorityConfig AuthorityConfiguration `yaml:"authority_config" json:"authority_config" mapstructure:"authority_config"` - HttpFilters []HttpFilter `yaml:"http_filters" json:"http_filters" mapstructure:"http_filters"` + HTTPFilters []HTTPFilter `yaml:"http_filters" json:"http_filters" mapstructure:"http_filters"` ServerName string `yaml:"server_name" json:"server_name" mapstructure:"server_name"` IdleTimeoutStr string `yaml:"idle_timeout" json:"idle_timeout" mapstructure:"idle_timeout"` AccessLog AccessLog `yaml:"access_log" json:"access_log" mapstructure:"access_log"` @@ -39,8 +39,8 @@ type CorsPolicy struct { Enabled bool `yaml:"enabled" json:"enabled" mapstructure:"enabled"` } -// HttpFilter -type HttpFilter struct { +// HTTPFilter +type HTTPFilter struct { Name string `yaml:"name" json:"name" mapstructure:"name"` Config interface{} `yaml:"config" json:"config" mapstructure:"config"` } diff --git a/pkg/proxy/http.go b/pkg/proxy/http.go index 846f4033a..ba1955a86 100644 --- a/pkg/proxy/http.go +++ b/pkg/proxy/http.go @@ -37,7 +37,7 @@ func DefaultHttpConnectionManager() *model.HttpConnectionManager { }, }, }, - HttpFilters: []model.HttpFilter{ + HTTPFilters: []model.HTTPFilter{ { Name: constant.HTTPRouterFilter, }, From a112c206be19e26e2917166beb610a3b67700ca9 Mon Sep 17 00:00:00 2001 From: oaoit Date: Thu, 29 Oct 2020 17:51:46 +0800 Subject: [PATCH 177/227] add comments. --- pkg/model/http.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkg/model/http.go b/pkg/model/http.go index b3e92d932..a8af4c2d8 100644 --- a/pkg/model/http.go +++ b/pkg/model/http.go @@ -39,7 +39,7 @@ type CorsPolicy struct { Enabled bool `yaml:"enabled" json:"enabled" mapstructure:"enabled"` } -// HTTPFilter +// HTTPFilter http filter type HTTPFilter struct { Name string `yaml:"name" json:"name" mapstructure:"name"` Config interface{} `yaml:"config" json:"config" mapstructure:"config"` From 2e801cb3123d6def3ca191f9352194c1a0d1f35f Mon Sep 17 00:00:00 2001 From: shen <1292369127@qq.com> Date: Thu, 29 Oct 2020 21:56:14 +0800 Subject: [PATCH 178/227] add zookeeper files Former-commit-id: 211c108adb94d922175632d13d5dcfc7d388df7f Former-commit-id: ce32fca66cd05536e19fb16963b3c0316ea1df41 --- pkg/registry/zookeeper-3.4.6/CHANGES.txt | 2276 ++ pkg/registry/zookeeper-3.4.6/LICENSE.txt | 202 + pkg/registry/zookeeper-3.4.6/NOTICE.txt | 5 + pkg/registry/zookeeper-3.4.6/README.txt | 36 + .../zookeeper-3.4.6/README_packaging.txt | 65 + pkg/registry/zookeeper-3.4.6/bin/README.txt | 6 + pkg/registry/zookeeper-3.4.6/bin/zkCleanup.sh | 51 + pkg/registry/zookeeper-3.4.6/bin/zkCli.cmd | 24 + pkg/registry/zookeeper-3.4.6/bin/zkCli.sh | 41 + pkg/registry/zookeeper-3.4.6/bin/zkEnv.cmd | 34 + pkg/registry/zookeeper-3.4.6/bin/zkEnv.sh | 115 + pkg/registry/zookeeper-3.4.6/bin/zkServer.cmd | 25 + pkg/registry/zookeeper-3.4.6/bin/zkServer.sh | 186 + pkg/registry/zookeeper-3.4.6/build.xml | 1805 ++ .../zookeeper-3.4.6/conf/configuration.xsl | 24 + .../zookeeper-3.4.6/conf/log4j.properties | 58 + .../zookeeper-3.4.6/conf/zoo_sample.cfg | 28 + .../contrib/ZooInspector/build.xml | 152 + .../config/defaultConnectionSettings.cfg | 21 + .../config/defaultNodeVeiwers.cfg | 17 + .../ZooInspector/icons/edtsrclkup_co.gif | Bin 0 -> 204 bytes .../contrib/ZooInspector/icons/file_obj.gif | Bin 0 -> 354 bytes .../contrib/ZooInspector/icons/fldr_obj.gif | Bin 0 -> 216 bytes .../contrib/ZooInspector/icons/info_obj.gif | Bin 0 -> 121 bytes .../contrib/ZooInspector/icons/jspdecl.gif | Bin 0 -> 190 bytes .../contrib/ZooInspector/icons/launch_run.gif | Bin 0 -> 379 bytes .../ZooInspector/icons/launch_stop.gif | Bin 0 -> 916 bytes .../contrib/ZooInspector/icons/new_con.gif | Bin 0 -> 353 bytes .../contrib/ZooInspector/icons/refresh.gif | Bin 0 -> 327 bytes .../contrib/ZooInspector/icons/save_edit.gif | Bin 0 -> 639 bytes .../ZooInspector/icons/search_next.gif | Bin 0 -> 332 bytes .../ZooInspector/icons/search_prev.gif | Bin 0 -> 323 bytes .../contrib/ZooInspector/icons/trash.gif | Bin 0 -> 132 bytes .../ZooInspector/lib/jtoaster-1.0.4.jar | Bin 0 -> 14975 bytes .../licences/Apache Software Licence v2.0.txt | 202 + .../ZooInspector/licences/epl-v10.html | 261 + .../zookeeper/inspector/ZooInspector.java | 66 + .../BasicDataEncryptionManager.java | 50 + .../encryption/DataEncryptionManager.java | 39 + .../gui/NodeViewersChangeListener.java | 37 + .../gui/ZooInspectorAboutDialog.java | 80 + ...ooInspectorConnectionPropertiesDialog.java | 321 + .../gui/ZooInspectorIconResources.java | 118 + .../gui/ZooInspectorNodeViewersDialog.java | 605 + .../gui/ZooInspectorNodeViewersPanel.java | 140 + .../inspector/gui/ZooInspectorPanel.java | 361 + .../inspector/gui/ZooInspectorTreeViewer.java | 362 + .../apache/zookeeper/inspector/gui/about.html | 21 + .../gui/nodeviewer/NodeViewerACL.java | 187 + .../gui/nodeviewer/NodeViewerData.java | 146 + .../gui/nodeviewer/NodeViewerMetaData.java | 186 + .../nodeviewer/ZooInspectorNodeViewer.java | 138 + .../inspector/logger/LoggerFactory.java | 36 + .../inspector/manager/NodeListener.java | 37 + .../zookeeper/inspector/manager/Pair.java | 120 + .../manager/ZooInspectorManager.java | 139 + .../manager/ZooInspectorManagerImpl.java | 884 + .../manager/ZooInspectorNodeManager.java | 33 + .../manager/ZooInspectorNodeTreeManager.java | 43 + .../manager/ZooInspectorReadOnlyManager.java | 99 + .../zookeeper/retry/ZooKeeperRetry.java | 288 + .../zookeeper-3.4.6-ZooInspector.jar | Bin 0 -> 100691 bytes .../zookeeper-3.4.6/contrib/fatjar/build.xml | 74 + .../contrib/fatjar/conf/mainClasses | 10 + .../org/apache/zookeeper/util/FatJarMain.java | 126 + .../zookeeper-3.4.6-fatjar.jar.REMOVED.git-id | 1 + .../contrib/loggraph/build.xml | 70 + .../zookeeper/graph/FilterException.java | 22 + .../org/apache/zookeeper/graph/FilterOp.java | 75 + .../apache/zookeeper/graph/FilterParser.java | 131 + .../apache/zookeeper/graph/JsonGenerator.java | 223 + .../apache/zookeeper/graph/Log4JEntry.java | 40 + .../apache/zookeeper/graph/Log4JSource.java | 381 + .../org/apache/zookeeper/graph/LogEntry.java | 46 + .../apache/zookeeper/graph/LogIterator.java | 26 + .../org/apache/zookeeper/graph/LogServer.java | 66 + .../apache/zookeeper/graph/LogSkipList.java | 95 + .../org/apache/zookeeper/graph/LogSource.java | 33 + .../zookeeper/graph/MeasureThroughput.java | 103 + .../zookeeper/graph/MergedLogSource.java | 219 + .../graph/RandomAccessFileReader.java | 328 + .../zookeeper/graph/TransactionEntry.java | 59 + .../apache/zookeeper/graph/TxnLogSource.java | 376 + .../zookeeper/graph/filterops/AndOp.java | 33 + .../apache/zookeeper/graph/filterops/Arg.java | 36 + .../zookeeper/graph/filterops/EqualsOp.java | 44 + .../graph/filterops/GreaterThanOp.java | 70 + .../zookeeper/graph/filterops/LessThanOp.java | 69 + .../zookeeper/graph/filterops/NotOp.java | 31 + .../zookeeper/graph/filterops/NumberArg.java | 28 + .../zookeeper/graph/filterops/OrOp.java | 33 + .../zookeeper/graph/filterops/StringArg.java | 28 + .../zookeeper/graph/filterops/SymbolArg.java | 27 + .../zookeeper/graph/filterops/XorOp.java | 40 + .../zookeeper/graph/servlets/FileLoader.java | 60 + .../apache/zookeeper/graph/servlets/Fs.java | 69 + .../zookeeper/graph/servlets/GraphData.java | 85 + .../zookeeper/graph/servlets/JsonServlet.java | 85 + .../zookeeper/graph/servlets/NumEvents.java | 87 + .../graph/servlets/StaticContent.java | 50 + .../zookeeper/graph/servlets/Throughput.java | 125 + .../loggraph/zookeeper-3.4.6-loggraph.jar | Bin 0 -> 139103 bytes .../contrib/rest/zookeeper-3.4.6-rest.jar | Bin 0 -> 41552 bytes .../contrib/zkfuse/Makefile.am | 4 + .../zookeeper-3.4.6/contrib/zkfuse/README.txt | 63 + .../zookeeper-3.4.6/contrib/zkfuse/VERSION | 1 + .../zookeeper-3.4.6/contrib/zkfuse/build.xml | 61 + .../contrib/zkfuse/configure.ac | 72 + .../contrib/zkfuse/src/Makefile.am | 7 + .../contrib/zkfuse/src/blockingqueue.h | 154 + .../contrib/zkfuse/src/doxygen.cfg | 1242 + .../contrib/zkfuse/src/event.cc | 29 + .../contrib/zkfuse/src/event.h | 553 + .../zookeeper-3.4.6/contrib/zkfuse/src/log.cc | 36 + .../zookeeper-3.4.6/contrib/zkfuse/src/log.h | 116 + .../contrib/zkfuse/src/log4cxx.properties | 28 + .../contrib/zkfuse/src/mutex.h | 169 + .../contrib/zkfuse/src/thread.cc | 41 + .../contrib/zkfuse/src/thread.h | 99 + .../contrib/zkfuse/src/zkadapter.cc | 881 + .../contrib/zkfuse/src/zkadapter.h | 718 + .../contrib/zkfuse/src/zkfuse.cc | 4492 ++++ .../zookeeper-3.4.6/contrib/zkperl/Changes | 65 + .../zookeeper-3.4.6/contrib/zkperl/LICENSE | 202 + .../zookeeper-3.4.6/contrib/zkperl/MANIFEST | 23 + .../contrib/zkperl/Makefile.PL | 73 + .../zookeeper-3.4.6/contrib/zkperl/NOTICE | 6 + .../zookeeper-3.4.6/contrib/zkperl/README | 86 + .../zookeeper-3.4.6/contrib/zkperl/VERSION | 1 + .../contrib/zkperl/ZooKeeper.pm | 1257 + .../contrib/zkperl/ZooKeeper.xs | 2669 ++ .../zookeeper-3.4.6/contrib/zkperl/build.xml | 61 + .../contrib/zkperl/build/check_zk_version.c | 29 + .../contrib/zkperl/build/check_zk_version.h | 27 + .../contrib/zkperl/t/10_invalid.t | 773 + .../contrib/zkperl/t/15_thread.t | 121 + .../zookeeper-3.4.6/contrib/zkperl/t/20_tie.t | 353 + .../contrib/zkperl/t/22_stat_tie.t | 438 + .../contrib/zkperl/t/24_watch_tie.t | 292 + .../contrib/zkperl/t/30_connect.t | 202 + .../zookeeper-3.4.6/contrib/zkperl/t/35_log.t | 88 + .../contrib/zkperl/t/40_basic.t | 277 + .../contrib/zkperl/t/45_class.t | 408 + .../contrib/zkperl/t/50_access.t | 356 + .../contrib/zkperl/t/60_watch.t | 304 + .../zookeeper-3.4.6/contrib/zkperl/t/util.pl | 62 + .../zookeeper-3.4.6/contrib/zkperl/typemap | 38 + .../zookeeper-3.4.6/contrib/zkpython/README | 109 + .../zookeeper-3.4.6/contrib/zkpython/VERSION | 1 + .../contrib/zkpython/build.xml | 198 + .../zookeeper-3.4.6/contrib/zkpython/ivy.xml | 43 + .../contrib/zkpython/src/c/pyzk_docstrings.h | 594 + .../contrib/zkpython/src/c/zookeeper.c | 1664 ++ .../contrib/zkpython/src/examples/README | 8 + .../src/examples/watch_znode_for_changes.py | 202 + .../src/packages/deb/zkpython.control/control | 23 + .../src/packages/rpm/spec/zkpython.spec | 81 + .../contrib/zkpython/src/python/setup.py | 36 + .../contrib/zkpython/src/python/zk.py | 76 + .../contrib/zktreeutil/Makefile.am | 4 + .../contrib/zktreeutil/README.txt | 74 + .../contrib/zktreeutil/VERSION | 1 + .../contrib/zktreeutil/build.xml | 61 + .../contrib/zktreeutil/configure.ac | 66 + .../contrib/zktreeutil/src/Makefile.am | 24 + .../contrib/zktreeutil/src/SimpleTree.h | 150 + .../contrib/zktreeutil/src/ZkAdaptor.cc | 513 + .../contrib/zktreeutil/src/ZkAdaptor.h | 327 + .../contrib/zktreeutil/src/ZkTreeUtil.cc | 705 + .../contrib/zktreeutil/src/ZkTreeUtil.h | 262 + .../contrib/zktreeutil/src/ZkTreeUtilMain.cc | 247 + .../contrib/zktreeutil/tests/zk_sample.xml | 44 + .../dist-maven/zookeeper-3.4.6-javadoc.jar | Bin 0 -> 351986 bytes .../zookeeper-3.4.6-javadoc.jar.asc | 17 + .../zookeeper-3.4.6-javadoc.jar.md5 | 1 + .../zookeeper-3.4.6-javadoc.jar.sha1 | 1 + .../dist-maven/zookeeper-3.4.6-sources.jar | Bin 0 -> 554610 bytes .../zookeeper-3.4.6-sources.jar.asc | 17 + .../zookeeper-3.4.6-sources.jar.md5 | 1 + .../zookeeper-3.4.6-sources.jar.sha1 | 1 + .../dist-maven/zookeeper-3.4.6-tests.jar | Bin 0 -> 539262 bytes .../dist-maven/zookeeper-3.4.6-tests.jar.asc | 17 + .../dist-maven/zookeeper-3.4.6-tests.jar.md5 | 1 + .../dist-maven/zookeeper-3.4.6-tests.jar.sha1 | 1 + .../dist-maven/zookeeper-3.4.6.jar.asc | 17 + .../dist-maven/zookeeper-3.4.6.jar.md5 | 1 + .../dist-maven/zookeeper-3.4.6.jar.sha1 | 1 + .../dist-maven/zookeeper-3.4.6.pom | 113 + .../dist-maven/zookeeper-3.4.6.pom.asc | 17 + .../dist-maven/zookeeper-3.4.6.pom.md5 | 1 + .../dist-maven/zookeeper-3.4.6.pom.sha1 | 1 + .../docs/api/allclasses-frame.html | 75 + .../docs/api/allclasses-noframe.html | 75 + .../docs/api/constant-values.html | 503 + .../docs/api/deprecated-list.html | 325 + .../zookeeper-3.4.6/docs/api/help-doc.html | 221 + .../zookeeper-3.4.6/docs/api/index-all.html | 1351 + .../zookeeper-3.4.6/docs/api/index.html | 67 + .../zookeeper/AsyncCallback.ACLCallback.html | 239 + .../AsyncCallback.Children2Callback.html | 239 + .../AsyncCallback.ChildrenCallback.html | 237 + .../zookeeper/AsyncCallback.DataCallback.html | 239 + .../zookeeper/AsyncCallback.StatCallback.html | 237 + .../AsyncCallback.StringCallback.html | 237 + .../zookeeper/AsyncCallback.VoidCallback.html | 235 + .../org/apache/zookeeper/AsyncCallback.html | 212 + .../api/org/apache/zookeeper/CreateMode.html | 421 + .../KeeperException.APIErrorException.html | 283 + .../KeeperException.AuthFailedException.html | 283 + ...KeeperException.BadArgumentsException.html | 295 + .../KeeperException.BadVersionException.html | 295 + .../zookeeper/KeeperException.Code.html | 694 + .../KeeperException.CodeDeprecated.html | 636 + ...eperException.ConnectionLossException.html | 283 + ...rException.DataInconsistencyException.html | 283 + .../KeeperException.InvalidACLException.html | 295 + ...perException.InvalidCallbackException.html | 283 + ...erException.MarshallingErrorException.html | 283 + .../KeeperException.NoAuthException.html | 283 + ...tion.NoChildrenForEphemeralsException.html | 295 + .../KeeperException.NoNodeException.html | 295 + .../KeeperException.NodeExistsException.html | 295 + .../KeeperException.NotEmptyException.html | 295 + .../KeeperException.NotReadOnlyException.html | 283 + ...erException.OperationTimeoutException.html | 283 + ...ception.RuntimeInconsistencyException.html | 283 + ...eperException.SessionExpiredException.html | 283 + ...KeeperException.SessionMovedException.html | 283 + .../KeeperException.SystemErrorException.html | 283 + ...eeperException.UnimplementedException.html | 283 + .../org/apache/zookeeper/KeeperException.html | 597 + .../apache/zookeeper/ServerAdminClient.html | 349 + .../org/apache/zookeeper/WatchedEvent.html | 342 + .../zookeeper/Watcher.Event.EventType.html | 389 + .../zookeeper/Watcher.Event.KeeperState.html | 472 + .../org/apache/zookeeper/Watcher.Event.html | 197 + .../api/org/apache/zookeeper/Watcher.html | 233 + .../api/org/apache/zookeeper/ZooDefs.Ids.html | 279 + .../org/apache/zookeeper/ZooDefs.OpCode.html | 478 + .../org/apache/zookeeper/ZooDefs.Perms.html | 282 + .../api/org/apache/zookeeper/ZooDefs.html | 292 + .../apache/zookeeper/ZooKeeper.States.html | 419 + .../api/org/apache/zookeeper/ZooKeeper.html | 1669 ++ .../org/apache/zookeeper/ZooKeeperMain.html | 405 + .../class-use/AsyncCallback.ACLCallback.html | 161 + .../AsyncCallback.Children2Callback.html | 170 + .../AsyncCallback.ChildrenCallback.html | 170 + .../class-use/AsyncCallback.DataCallback.html | 170 + .../class-use/AsyncCallback.StatCallback.html | 190 + .../AsyncCallback.StringCallback.html | 163 + .../class-use/AsyncCallback.VoidCallback.html | 169 + .../zookeeper/class-use/AsyncCallback.html | 180 + .../zookeeper/class-use/CreateMode.html | 200 + .../KeeperException.APIErrorException.html | 116 + .../KeeperException.AuthFailedException.html | 116 + ...KeeperException.BadArgumentsException.html | 116 + .../KeeperException.BadVersionException.html | 116 + .../class-use/KeeperException.Code.html | 214 + .../KeeperException.CodeDeprecated.html | 159 + ...eperException.ConnectionLossException.html | 116 + ...rException.DataInconsistencyException.html | 116 + .../KeeperException.InvalidACLException.html | 116 + ...perException.InvalidCallbackException.html | 116 + ...erException.MarshallingErrorException.html | 116 + .../KeeperException.NoAuthException.html | 116 + ...tion.NoChildrenForEphemeralsException.html | 116 + .../KeeperException.NoNodeException.html | 116 + .../KeeperException.NodeExistsException.html | 116 + .../KeeperException.NotEmptyException.html | 116 + .../KeeperException.NotReadOnlyException.html | 116 + ...erException.OperationTimeoutException.html | 116 + ...ception.RuntimeInconsistencyException.html | 116 + ...eperException.SessionExpiredException.html | 116 + ...KeeperException.SessionMovedException.html | 116 + .../KeeperException.SystemErrorException.html | 116 + ...eeperException.UnimplementedException.html | 116 + .../zookeeper/class-use/KeeperException.html | 430 + .../class-use/ServerAdminClient.html | 116 + .../zookeeper/class-use/WatchedEvent.html | 156 + .../class-use/Watcher.Event.EventType.html | 188 + .../class-use/Watcher.Event.KeeperState.html | 188 + .../zookeeper/class-use/Watcher.Event.html | 116 + .../apache/zookeeper/class-use/Watcher.html | 275 + .../zookeeper/class-use/ZooDefs.Ids.html | 116 + .../zookeeper/class-use/ZooDefs.OpCode.html | 116 + .../zookeeper/class-use/ZooDefs.Perms.html | 116 + .../apache/zookeeper/class-use/ZooDefs.html | 116 + .../zookeeper/class-use/ZooKeeper.States.html | 169 + .../apache/zookeeper/class-use/ZooKeeper.html | 181 + .../zookeeper/class-use/ZooKeeperMain.html | 116 + .../zookeeper/client/FourLetterWordMain.html | 285 + .../client/class-use/FourLetterWordMain.html | 116 + .../zookeeper/client/package-frame.html | 19 + .../zookeeper/client/package-summary.html | 134 + .../apache/zookeeper/client/package-tree.html | 129 + .../apache/zookeeper/client/package-use.html | 116 + .../api/org/apache/zookeeper/data/ACL.html | 469 + .../api/org/apache/zookeeper/data/Id.html | 469 + .../api/org/apache/zookeeper/data/Stat.html | 721 + .../apache/zookeeper/data/StatPersisted.html | 665 + .../zookeeper/data/StatPersistedV1.html | 637 + .../apache/zookeeper/data/class-use/ACL.html | 242 + .../apache/zookeeper/data/class-use/Id.html | 211 + .../apache/zookeeper/data/class-use/Stat.html | 273 + .../data/class-use/StatPersisted.html | 116 + .../data/class-use/StatPersistedV1.html | 116 + .../apache/zookeeper/data/package-frame.html | 23 + .../zookeeper/data/package-summary.html | 150 + .../apache/zookeeper/data/package-tree.html | 133 + .../apache/zookeeper/data/package-use.html | 174 + .../org/apache/zookeeper/package-frame.html | 73 + .../org/apache/zookeeper/package-summary.html | 368 + .../org/apache/zookeeper/package-tree.html | 202 + .../api/org/apache/zookeeper/package-use.html | 219 + .../apache/zookeeper/server/LogFormatter.html | 261 + .../apache/zookeeper/server/PurgeTxnLog.html | 295 + .../zookeeper/server/SnapshotFormatter.html | 280 + .../zookeeper/server/ZooKeeperServerMain.html | 278 + .../server/class-use/LogFormatter.html | 116 + .../server/class-use/PurgeTxnLog.html | 116 + .../server/class-use/SnapshotFormatter.html | 116 + .../server/class-use/ZooKeeperServerMain.html | 116 + .../zookeeper/server/package-frame.html | 22 + .../zookeeper/server/package-summary.html | 241 + .../apache/zookeeper/server/package-tree.html | 132 + .../apache/zookeeper/server/package-use.html | 116 + .../server/quorum/QuorumPeerMain.html | 303 + .../quorum/class-use/QuorumPeerMain.html | 116 + .../server/quorum/package-frame.html | 19 + .../server/quorum/package-summary.html | 136 + .../zookeeper/server/quorum/package-tree.html | 129 + .../zookeeper/server/quorum/package-use.html | 116 + .../zookeeper/server/upgrade/UpgradeMain.html | 294 + .../server/upgrade/class-use/UpgradeMain.html | 116 + .../server/upgrade/package-frame.html | 19 + .../server/upgrade/package-summary.html | 138 + .../server/upgrade/package-tree.html | 129 + .../zookeeper/server/upgrade/package-use.html | 116 + .../docs/api/overview-frame.html | 25 + .../docs/api/overview-summary.html | 165 + .../docs/api/overview-tree.html | 219 + .../zookeeper-3.4.6/docs/api/package-list | 6 + .../docs/api/resources/background.gif | Bin 0 -> 2313 bytes .../docs/api/resources/tab.gif | Bin 0 -> 291 bytes .../docs/api/resources/titlebar.gif | Bin 0 -> 10701 bytes .../docs/api/resources/titlebar_end.gif | Bin 0 -> 849 bytes .../docs/api/serialized-form.html | 329 + .../docs/bookkeeperConfig.html | 384 + .../zookeeper-3.4.6/docs/bookkeeperConfig.pdf | Bin 0 -> 13824 bytes .../docs/bookkeeperOverview.html | 694 + .../docs/bookkeeperOverview.pdf | Bin 0 -> 147596 bytes .../docs/bookkeeperProgrammer.html | 1083 + .../docs/bookkeeperProgrammer.pdf | Bin 0 -> 24991 bytes .../docs/bookkeeperStarted.html | 448 + .../docs/bookkeeperStarted.pdf | Bin 0 -> 17130 bytes .../docs/bookkeeperStream.html | 612 + .../zookeeper-3.4.6/docs/bookkeeperStream.pdf | Bin 0 -> 13215 bytes .../zookeeper-3.4.6/docs/broken-links.xml | 2 + .../zookeeper-3.4.6/docs/images/2pc.jpg | Bin 0 -> 15174 bytes .../docs/images/bk-overview.jpg | Bin 0 -> 124211 bytes .../docs/images/built-with-forrest-button.png | Bin 0 -> 1936 bytes .../zookeeper-3.4.6/docs/images/favicon.ico | Bin 0 -> 766 bytes .../docs/images/hadoop-logo.jpg | Bin 0 -> 9443 bytes .../docs/images/instruction_arrow.png | Bin 0 -> 285 bytes .../zookeeper-3.4.6/docs/images/state_dia.jpg | Bin 0 -> 51364 bytes .../docs/images/zkcomponents.jpg | Bin 0 -> 30831 bytes .../docs/images/zknamespace.jpg | Bin 0 -> 35414 bytes .../docs/images/zkperfRW-3.2.jpg | Bin 0 -> 41948 bytes .../zookeeper-3.4.6/docs/images/zkperfRW.jpg | Bin 0 -> 161542 bytes .../docs/images/zkperfreliability.jpg | Bin 0 -> 69825 bytes .../zookeeper-3.4.6/docs/images/zkservice.jpg | Bin 0 -> 86790 bytes .../docs/images/zookeeper_small.gif | Bin 0 -> 4847 bytes pkg/registry/zookeeper-3.4.6/docs/index.html | 391 + pkg/registry/zookeeper-3.4.6/docs/index.pdf | Bin 0 -> 13525 bytes .../zookeeper-3.4.6/docs/javaExample.html | 908 + .../zookeeper-3.4.6/docs/javaExample.pdf | Bin 0 -> 33852 bytes .../zookeeper-3.4.6/docs/jdiff/changes.html | 32 + .../changes/alldiffs_index_additions.html | 612 + .../jdiff/changes/alldiffs_index_all.html | 791 + .../jdiff/changes/alldiffs_index_changes.html | 190 + .../changes/alldiffs_index_removals.html | 94 + .../docs/jdiff/changes/changes-summary.html | 70 + .../changes/classes_index_additions.html | 181 + .../docs/jdiff/changes/classes_index_all.html | 243 + .../jdiff/changes/classes_index_changes.html | 106 + .../jdiff/changes/classes_index_removals.html | 50 + .../changes/constructors_index_additions.html | 97 + .../jdiff/changes/constructors_index_all.html | 103 + .../changes/constructors_index_changes.html | 50 + .../changes/constructors_index_removals.html | 67 + .../jdiff/changes/fields_index_additions.html | 222 + .../docs/jdiff/changes/fields_index_all.html | 250 + .../jdiff/changes/fields_index_changes.html | 56 + .../jdiff/changes/fields_index_removals.html | 56 + .../docs/jdiff/changes/jdiff_help.html | 111 + .../docs/jdiff/changes/jdiff_statistics.html | 307 + .../jdiff/changes/jdiff_topleftframe.html | 40 + .../changes/methods_index_additions.html | 230 + .../docs/jdiff/changes/methods_index_all.html | 282 + .../jdiff/changes/methods_index_changes.html | 64 + .../jdiff/changes/methods_index_removals.html | 56 + .../org.apache.zookeeper.ClientCnxn.html | 240 + .../org.apache.zookeeper.Environment.html | 118 + ...KeeperException.BadArgumentsException.html | 100 + ...r.KeeperException.BadVersionException.html | 100 + ...apache.zookeeper.KeeperException.Code.html | 107 + ...r.KeeperException.InvalidACLException.html | 100 + ...tion.NoChildrenForEphemeralsException.html | 100 + ...eeper.KeeperException.NoNodeException.html | 100 + ...r.KeeperException.NodeExistsException.html | 100 + ...per.KeeperException.NotEmptyException.html | 100 + .../org.apache.zookeeper.KeeperException.html | 100 + ...e.zookeeper.Watcher.Event.KeeperState.html | 114 + .../org.apache.zookeeper.ZooDefs.OpCode.html | 121 + ...org.apache.zookeeper.ZooKeeper.States.html | 122 + .../org.apache.zookeeper.ZooKeeper.html | 236 + .../org.apache.zookeeper.ZooKeeperMain.html | 268 + .../changes/packages_index_additions.html | 51 + .../jdiff/changes/packages_index_all.html | 53 + .../jdiff/changes/packages_index_changes.html | 53 + .../changes/packages_index_removals.html | 51 + .../changes/pkg_org.apache.zookeeper.html | 371 + .../docs/jdiff/missingSinces.txt | 89 + ...for_zookeeper_3.1.1_to_zookeeper_3.4.6.xml | 702 + .../zookeeper-3.4.6/docs/linkmap.html | 434 + pkg/registry/zookeeper-3.4.6/docs/linkmap.pdf | Bin 0 -> 12472 bytes .../zookeeper-3.4.6/docs/recipes.html | 974 + pkg/registry/zookeeper-3.4.6/docs/recipes.pdf | Bin 0 -> 31072 bytes .../zookeeper-3.4.6/docs/releasenotes.html | 4799 ++++ .../zookeeper-3.4.6/docs/releasenotes.pdf | Bin 0 -> 118640 bytes .../docs/skin/CommonMessages_de.xml | 23 + .../docs/skin/CommonMessages_en_US.xml | 23 + .../docs/skin/CommonMessages_es.xml | 23 + .../docs/skin/CommonMessages_fr.xml | 23 + .../docs/skin/images/README.txt | 1 + .../zookeeper-3.4.6/docs/skin/images/add.jpg | Bin 0 -> 1142 bytes .../docs/skin/images/apache-thanks.png | Bin 0 -> 4840 bytes .../docs/skin/images/built-with-cocoon.gif | Bin 0 -> 2252 bytes .../skin/images/built-with-forrest-button.png | Bin 0 -> 1936 bytes .../docs/skin/images/chapter.gif | Bin 0 -> 49 bytes .../docs/skin/images/chapter_open.gif | Bin 0 -> 49 bytes .../docs/skin/images/current.gif | Bin 0 -> 54 bytes .../docs/skin/images/error.png | Bin 0 -> 1709 bytes .../docs/skin/images/external-link.gif | Bin 0 -> 71 bytes .../zookeeper-3.4.6/docs/skin/images/fix.jpg | Bin 0 -> 932 bytes .../docs/skin/images/forrest-credit-logo.png | Bin 0 -> 4633 bytes .../zookeeper-3.4.6/docs/skin/images/hack.jpg | Bin 0 -> 743 bytes .../docs/skin/images/header_white_line.gif | Bin 0 -> 37 bytes .../zookeeper-3.4.6/docs/skin/images/info.png | Bin 0 -> 1320 bytes .../docs/skin/images/instruction_arrow.png | Bin 0 -> 285 bytes .../docs/skin/images/label.gif | Bin 0 -> 54 bytes .../zookeeper-3.4.6/docs/skin/images/page.gif | Bin 0 -> 79 bytes .../docs/skin/images/pdfdoc.gif | Bin 0 -> 1008 bytes .../docs/skin/images/poddoc.png | Bin 0 -> 856 bytes .../docs/skin/images/printer.gif | Bin 0 -> 603 bytes .../images/rc-b-l-15-1body-2menu-3menu.png | Bin 0 -> 348 bytes .../images/rc-b-r-15-1body-2menu-3menu.png | Bin 0 -> 319 bytes ...-5-1header-2tab-selected-3tab-selected.png | Bin 0 -> 200 bytes ...rc-t-l-5-1header-2searchbox-3searchbox.png | Bin 0 -> 199 bytes ...-5-1header-2tab-selected-3tab-selected.png | Bin 0 -> 209 bytes ...header-2tab-unselected-3tab-unselected.png | Bin 0 -> 199 bytes .../images/rc-t-r-15-1body-2menu-3menu.png | Bin 0 -> 390 bytes ...rc-t-r-5-1header-2searchbox-3searchbox.png | Bin 0 -> 214 bytes ...-5-1header-2tab-selected-3tab-selected.png | Bin 0 -> 215 bytes ...header-2tab-unselected-3tab-unselected.png | Bin 0 -> 214 bytes .../docs/skin/images/remove.jpg | Bin 0 -> 1251 bytes .../zookeeper-3.4.6/docs/skin/images/rss.png | Bin 0 -> 360 bytes .../docs/skin/images/spacer.gif | Bin 0 -> 43 bytes .../docs/skin/images/success.png | Bin 0 -> 1291 bytes .../docs/skin/images/txtdoc.png | Bin 0 -> 784 bytes .../docs/skin/images/update.jpg | Bin 0 -> 990 bytes .../docs/skin/images/valid-html401.png | Bin 0 -> 2948 bytes .../zookeeper-3.4.6/docs/skin/images/vcss.png | Bin 0 -> 1134 bytes .../docs/skin/images/warning.png | Bin 0 -> 1215 bytes .../docs/skin/images/xmldoc.gif | Bin 0 -> 992 bytes .../zookeeper-3.4.6/docs/skin/note.txt | 50 + .../zookeeper-3.4.6/docs/zookeeperAdmin.html | 1877 ++ .../zookeeper-3.4.6/docs/zookeeperAdmin.pdf | Bin 0 -> 74144 bytes .../docs/zookeeperHierarchicalQuorums.html | 276 + .../docs/zookeeperHierarchicalQuorums.pdf | Bin 0 -> 6660 bytes .../docs/zookeeperInternals.html | 805 + .../docs/zookeeperInternals.pdf | Bin 0 -> 48872 bytes .../zookeeper-3.4.6/docs/zookeeperJMX.html | 479 + .../zookeeper-3.4.6/docs/zookeeperJMX.pdf | Bin 0 -> 16498 bytes .../docs/zookeeperObservers.html | 366 + .../docs/zookeeperObservers.pdf | Bin 0 -> 12884 bytes .../docs/zookeeperOtherInfo.html | 230 + .../docs/zookeeperOtherInfo.pdf | Bin 0 -> 2947 bytes .../zookeeper-3.4.6/docs/zookeeperOver.html | 704 + .../zookeeper-3.4.6/docs/zookeeperOver.pdf | Bin 0 -> 302521 bytes .../docs/zookeeperProgrammers.html | 2238 ++ .../docs/zookeeperProgrammers.pdf | Bin 0 -> 133888 bytes .../zookeeper-3.4.6/docs/zookeeperQuotas.html | 291 + .../zookeeper-3.4.6/docs/zookeeperQuotas.pdf | Bin 0 -> 11269 bytes .../docs/zookeeperStarted.html | 645 + .../zookeeper-3.4.6/docs/zookeeperStarted.pdf | Bin 0 -> 27581 bytes .../docs/zookeeperTutorial.html | 894 + .../docs/zookeeperTutorial.pdf | Bin 0 -> 30557 bytes pkg/registry/zookeeper-3.4.6/ivy.xml | 77 + pkg/registry/zookeeper-3.4.6/ivysettings.xml | 46 + .../zookeeper-3.4.6/lib/cobertura/README.txt | 3 + .../lib/jdiff/zookeeper_3.1.1.xml | 2717 ++ .../lib/jdiff/zookeeper_3.4.6-SNAPSHOT.xml | 4559 ++++ .../lib/jdiff/zookeeper_3.4.6.xml | 4559 ++++ .../lib/jline-0.9.94.LICENSE.txt | 33 + .../zookeeper-3.4.6/lib/jline-0.9.94.jar | Bin 0 -> 87325 bytes .../lib/log4j-1.2.16.LICENSE.txt | 202 + .../zookeeper-3.4.6/lib/log4j-1.2.16.jar | Bin 0 -> 481535 bytes .../lib/netty-3.7.0.Final.jar.REMOVED.git-id | 1 + .../zookeeper-3.4.6/lib/slf4j-api-1.6.1.jar | Bin 0 -> 25496 bytes .../lib/slf4j-log4j12-1.6.1.jar | Bin 0 -> 9753 bytes .../recipes/election/build.xml | 128 + .../recipes/leader/LeaderElectionAware.java | 37 + .../recipes/leader/LeaderElectionSupport.java | 461 + .../zookeeper/recipes/leader/LeaderOffer.java | 84 + .../zookeeper-3.4.6/recipes/lock/build.xml | 128 + .../recipes/lock/src/c/INSTALL | 234 + .../recipes/lock/src/c/LICENSE | 202 + .../recipes/lock/src/c/Makefile.am | 46 + .../recipes/lock/src/c/README.txt | 28 + .../recipes/lock/src/c/acinclude.m4 | 312 + .../recipes/lock/src/c/aminclude.am | 186 + .../recipes/lock/src/c/c-doc.Doxyfile | 1252 + .../recipes/lock/src/c/configure.ac | 82 + .../recipes/lock/src/c/include/zoo_lock.h | 168 + .../recipes/lock/src/c/src/zoo_lock.c | 396 + .../recipes/lock/src/c/tests/TestClient.cc | 201 + .../recipes/lock/src/c/tests/TestDriver.cc | 114 + .../recipes/lock/src/c/tests/Util.cc | 30 + .../recipes/lock/src/c/tests/Util.h | 134 + .../recipes/lock/src/c/tests/zkServer.sh | 75 + .../zookeeper/recipes/lock/LockListener.java | 38 + .../recipes/lock/ProtocolSupport.java | 193 + .../zookeeper/recipes/lock/WriteLock.java | 296 + .../zookeeper/recipes/lock/ZNodeName.java | 110 + .../recipes/lock/ZooKeeperOperation.java | 38 + .../zookeeper-3.4.6/recipes/queue/build.xml | 128 + .../recipes/queue/src/c/INSTALL | 234 + .../recipes/queue/src/c/LICENSE | 202 + .../recipes/queue/src/c/Makefile.am | 46 + .../recipes/queue/src/c/README.txt | 30 + .../recipes/queue/src/c/acinclude.m4 | 312 + .../recipes/queue/src/c/aminclude.am | 186 + .../recipes/queue/src/c/c-doc.Doxyfile | 1252 + .../recipes/queue/src/c/configure.ac | 82 + .../recipes/queue/src/c/include/zoo_queue.h | 118 + .../recipes/queue/src/c/src/zoo_queue.c | 442 + .../recipes/queue/src/c/tests/TestClient.cc | 452 + .../recipes/queue/src/c/tests/TestDriver.cc | 114 + .../recipes/queue/src/c/tests/Util.cc | 30 + .../recipes/queue/src/c/tests/Util.h | 134 + .../recipes/queue/src/c/tests/zkServer.sh | 75 + .../recipes/queue/DistributedQueue.java | 313 + pkg/registry/zookeeper-3.4.6/src/c/ChangeLog | 116 + pkg/registry/zookeeper-3.4.6/src/c/Cli.vcproj | 210 + pkg/registry/zookeeper-3.4.6/src/c/INSTALL | 234 + pkg/registry/zookeeper-3.4.6/src/c/LICENSE | 202 + .../zookeeper-3.4.6/src/c/Makefile.am | 108 + .../zookeeper-3.4.6/src/c/Makefile.in | 1782 ++ pkg/registry/zookeeper-3.4.6/src/c/NOTICE.txt | 41 + pkg/registry/zookeeper-3.4.6/src/c/README | 129 + .../zookeeper-3.4.6/src/c/acinclude.m4 | 312 + pkg/registry/zookeeper-3.4.6/src/c/aclocal.m4 | 9706 ++++++++ .../zookeeper-3.4.6/src/c/aminclude.am | 186 + .../src/c/autom4te.cache/output.0 | 8641 +++++++ .../src/c/autom4te.cache/output.1 | 20613 +++++++++++++++ .../src/c/autom4te.cache/output.2 | 20471 +++++++++++++++ .../src/c/autom4te.cache/output.3 | 20617 ++++++++++++++++ .../src/c/autom4te.cache/requests | 673 + .../src/c/autom4te.cache/traces.0 | 1523 ++ .../src/c/autom4te.cache/traces.1 | 1138 + .../src/c/autom4te.cache/traces.2 | 3183 +++ .../src/c/autom4te.cache/traces.3 | 3272 +++ .../zookeeper-3.4.6/src/c/c-doc.Doxyfile | 1252 + pkg/registry/zookeeper-3.4.6/src/c/compile | 343 + .../zookeeper-3.4.6/src/c/config.guess | 1530 ++ .../zookeeper-3.4.6/src/c/config.h.in | 152 + pkg/registry/zookeeper-3.4.6/src/c/config.sub | 1782 ++ pkg/registry/zookeeper-3.4.6/src/c/configure | 20613 +++++++++++++++ .../zookeeper-3.4.6/src/c/configure.ac | 149 + pkg/registry/zookeeper-3.4.6/src/c/depcomp | 708 + .../src/c/generated/zookeeper.jute.c | 1315 + .../src/c/generated/zookeeper.jute.h | 485 + .../zookeeper-3.4.6/src/c/include/proto.h | 47 + .../zookeeper-3.4.6/src/c/include/recordio.h | 82 + .../zookeeper-3.4.6/src/c/include/winconfig.h | 191 + .../zookeeper-3.4.6/src/c/include/winstdint.h | 247 + .../zookeeper-3.4.6/src/c/include/zookeeper.h | 1583 ++ .../src/c/include/zookeeper_log.h | 51 + .../src/c/include/zookeeper_version.h | 33 + pkg/registry/zookeeper-3.4.6/src/c/install-sh | 527 + pkg/registry/zookeeper-3.4.6/src/c/ltmain.sh | 9661 ++++++++ pkg/registry/zookeeper-3.4.6/src/c/missing | 331 + pkg/registry/zookeeper-3.4.6/src/c/src/cli.c | 681 + .../src/c/src/hashtable/LICENSE.txt | 30 + .../src/c/src/hashtable/hashtable.c | 274 + .../src/c/src/hashtable/hashtable.h | 209 + .../src/c/src/hashtable/hashtable_itr.c | 176 + .../src/c/src/hashtable/hashtable_itr.h | 119 + .../src/c/src/hashtable/hashtable_private.h | 85 + .../zookeeper-3.4.6/src/c/src/load_gen.c | 286 + .../zookeeper-3.4.6/src/c/src/mt_adaptor.c | 530 + .../zookeeper-3.4.6/src/c/src/recordio.c | 360 + .../zookeeper-3.4.6/src/c/src/st_adaptor.c | 99 + .../zookeeper-3.4.6/src/c/src/winport.c | 292 + .../zookeeper-3.4.6/src/c/src/winport.h | 123 + .../zookeeper-3.4.6/src/c/src/zk_adaptor.h | 276 + .../zookeeper-3.4.6/src/c/src/zk_hashtable.c | 337 + .../zookeeper-3.4.6/src/c/src/zk_hashtable.h | 69 + .../zookeeper-3.4.6/src/c/src/zk_log.c | 176 + .../zookeeper-3.4.6/src/c/src/zookeeper.c | 3714 +++ .../src/c/tests/CollectionUtil.h | 195 + .../src/c/tests/CppAssertHelper.h | 37 + .../zookeeper-3.4.6/src/c/tests/LibCMocks.cc | 333 + .../zookeeper-3.4.6/src/c/tests/LibCMocks.h | 408 + .../src/c/tests/LibCSymTable.cc | 83 + .../src/c/tests/LibCSymTable.h | 107 + .../zookeeper-3.4.6/src/c/tests/MocksBase.cc | 36 + .../zookeeper-3.4.6/src/c/tests/MocksBase.h | 36 + .../src/c/tests/PthreadMocks.cc | 106 + .../src/c/tests/PthreadMocks.h | 449 + .../zookeeper-3.4.6/src/c/tests/TestClient.cc | 1135 + .../src/c/tests/TestClientRetry.cc | 273 + .../zookeeper-3.4.6/src/c/tests/TestDriver.cc | 173 + .../zookeeper-3.4.6/src/c/tests/TestMulti.cc | 703 + .../src/c/tests/TestOperations.cc | 675 + .../src/c/tests/TestWatchers.cc | 773 + .../src/c/tests/TestZookeeperClose.cc | 472 + .../src/c/tests/TestZookeeperInit.cc | 301 + .../src/c/tests/ThreadingUtil.cc | 87 + .../src/c/tests/ThreadingUtil.h | 261 + .../zookeeper-3.4.6/src/c/tests/Util.cc | 51 + .../zookeeper-3.4.6/src/c/tests/Util.h | 137 + .../zookeeper-3.4.6/src/c/tests/Vector.h | 37 + .../zookeeper-3.4.6/src/c/tests/ZKMocks.cc | 519 + .../zookeeper-3.4.6/src/c/tests/ZKMocks.h | 509 + .../src/c/tests/wrappers-mt.opt | 3 + .../zookeeper-3.4.6/src/c/tests/wrappers.opt | 6 + .../zookeeper-3.4.6/src/c/tests/zkServer.sh | 161 + .../zookeeper-3.4.6/src/c/zookeeper.sln | 25 + .../zookeeper-3.4.6/src/c/zookeeper.vcproj | 300 + .../src/contrib/build-contrib.xml | 248 + .../zookeeper-3.4.6/src/contrib/build.xml | 88 + .../src/contrib/fatjar/README.txt | 2 + .../src/contrib/fatjar/build.xml | 74 + .../src/contrib/fatjar/conf/mainClasses | 10 + .../org/apache/zookeeper/util/FatJarMain.java | 126 + .../src/contrib/huebrowser/README | 62 + .../src/contrib/huebrowser/zkui/Makefile | 21 + .../src/contrib/huebrowser/zkui/setup.py | 46 + .../huebrowser/zkui/src/zkui/__init__.py | 16 + .../contrib/huebrowser/zkui/src/zkui/forms.py | 29 + .../huebrowser/zkui/src/zkui/models.py | 17 + .../contrib/huebrowser/zkui/src/zkui/rest.py | 230 + .../huebrowser/zkui/src/zkui/settings.py | 30 + .../zkui/src/zkui/static/art/line_icons.png | Bin 0 -> 7499 bytes .../zkui/src/zkui/static/art/zkui.png | Bin 0 -> 4430 bytes .../zkui/src/zkui/static/help/index.html | 26 + .../zkui/src/zkui/static/js/package.yml | 19 + .../contrib/huebrowser/zkui/src/zkui/stats.py | 170 + .../zkui/src/zkui/templates/clients.mako | 51 + .../zkui/src/zkui/templates/create.mako | 34 + .../zkui/src/zkui/templates/edit.mako | 34 + .../zkui/src/zkui/templates/index.mako | 54 + .../src/zkui/templates/shared_components.mako | 66 + .../zkui/src/zkui/templates/tree.mako | 75 + .../zkui/src/zkui/templates/view.mako | 128 + .../contrib/huebrowser/zkui/src/zkui/urls.py | 28 + .../contrib/huebrowser/zkui/src/zkui/utils.py | 33 + .../contrib/huebrowser/zkui/src/zkui/views.py | 165 + .../huebrowser/zkui/src/zkui/windmilltests.py | 23 + .../src/contrib/loggraph/README.txt | 69 + .../src/contrib/loggraph/bin/loggraph-dev.sh | 43 + .../src/contrib/loggraph/bin/loggraph.sh | 48 + .../src/contrib/loggraph/build.xml | 70 + .../src/contrib/loggraph/ivy.xml | 44 + .../zookeeper/graph/FilterException.java | 22 + .../org/apache/zookeeper/graph/FilterOp.java | 75 + .../apache/zookeeper/graph/FilterParser.java | 131 + .../apache/zookeeper/graph/JsonGenerator.java | 223 + .../apache/zookeeper/graph/Log4JEntry.java | 40 + .../apache/zookeeper/graph/Log4JSource.java | 381 + .../org/apache/zookeeper/graph/LogEntry.java | 46 + .../apache/zookeeper/graph/LogIterator.java | 26 + .../org/apache/zookeeper/graph/LogServer.java | 66 + .../apache/zookeeper/graph/LogSkipList.java | 95 + .../org/apache/zookeeper/graph/LogSource.java | 33 + .../zookeeper/graph/MeasureThroughput.java | 103 + .../zookeeper/graph/MergedLogSource.java | 219 + .../graph/RandomAccessFileReader.java | 328 + .../zookeeper/graph/TransactionEntry.java | 59 + .../apache/zookeeper/graph/TxnLogSource.java | 376 + .../zookeeper/graph/filterops/AndOp.java | 33 + .../apache/zookeeper/graph/filterops/Arg.java | 36 + .../zookeeper/graph/filterops/EqualsOp.java | 44 + .../graph/filterops/GreaterThanOp.java | 70 + .../zookeeper/graph/filterops/LessThanOp.java | 69 + .../zookeeper/graph/filterops/NotOp.java | 31 + .../zookeeper/graph/filterops/NumberArg.java | 28 + .../zookeeper/graph/filterops/OrOp.java | 33 + .../zookeeper/graph/filterops/StringArg.java | 28 + .../zookeeper/graph/filterops/SymbolArg.java | 27 + .../zookeeper/graph/filterops/XorOp.java | 40 + .../zookeeper/graph/servlets/FileLoader.java | 60 + .../apache/zookeeper/graph/servlets/Fs.java | 69 + .../zookeeper/graph/servlets/GraphData.java | 85 + .../zookeeper/graph/servlets/JsonServlet.java | 85 + .../zookeeper/graph/servlets/NumEvents.java | 87 + .../graph/servlets/StaticContent.java | 50 + .../zookeeper/graph/servlets/Throughput.java | 125 + .../apache/zookeeper/graph/log4j.properties | 11 + .../zookeeper/graph/resources/load-big.gif | Bin 0 -> 1924 bytes .../apache/zookeeper/graph/resources/load.gif | Bin 0 -> 673 bytes .../zookeeper/graph/resources/main.html | 60 + .../src/contrib/monitoring/JMX-RESOURCES | 38 + .../src/contrib/monitoring/README | 84 + .../src/contrib/monitoring/cacti/README | 56 + .../src/contrib/monitoring/check_zookeeper.py | 358 + .../src/contrib/monitoring/ganglia/README | 48 + .../contrib/monitoring/ganglia/Screenshot.png | Bin 0 -> 111055 bytes .../contrib/monitoring/ganglia/modpython.conf | 28 + .../monitoring/ganglia/zookeeper.pyconf | 49 + .../monitoring/ganglia/zookeeper_ganglia.py | 209 + .../src/contrib/monitoring/nagios/README.txt | 86 + .../monitoring/nagios/Screenshot-1.png | Bin 0 -> 196668 bytes .../contrib/monitoring/nagios/Screenshot.png | Bin 0 -> 163646 bytes .../contrib/monitoring/nagios/hostgroups.cfg | 25 + .../contrib/monitoring/nagios/services.cfg | 67 + .../contrib/monitoring/nagios/zookeeper.cfg | 30 + .../src/contrib/monitoring/test.py | 282 + .../src/contrib/rest/NOTICE.txt | 7 + .../src/contrib/rest/README.txt | 72 + .../zookeeper-3.4.6/src/contrib/rest/SPEC.txt | 355 + .../src/contrib/rest/build.xml | 167 + .../src/contrib/rest/conf/keys/README | 8 + .../src/contrib/rest/conf/keys/rest.cer | Bin 0 -> 595 bytes .../src/contrib/rest/conf/keys/rest.jks | Bin 0 -> 1363 bytes .../src/contrib/rest/conf/log4j.properties | 72 + .../src/contrib/rest/conf/rest.properties | 70 + .../zookeeper-3.4.6/src/contrib/rest/ivy.xml | 48 + .../zookeeper-3.4.6/src/contrib/rest/rest.sh | 90 + .../zookeeper/server/jersey/RestMain.java | 151 + .../server/jersey/ZooKeeperService.java | 242 + .../server/jersey/cfg/Credentials.java | 47 + .../zookeeper/server/jersey/cfg/Endpoint.java | 72 + .../zookeeper/server/jersey/cfg/HostPort.java | 51 + .../server/jersey/cfg/HostPortSet.java | 51 + .../zookeeper/server/jersey/cfg/RestCfg.java | 106 + .../server/jersey/filters/HTTPBasicAuth.java | 87 + .../server/jersey/jaxb/ZChildren.java | 80 + .../server/jersey/jaxb/ZChildrenJSON.java | 76 + .../zookeeper/server/jersey/jaxb/ZError.java | 41 + .../zookeeper/server/jersey/jaxb/ZPath.java | 63 + .../server/jersey/jaxb/ZSession.java | 55 + .../zookeeper/server/jersey/jaxb/ZStat.java | 106 + .../jersey/resources/JAXBContextResolver.java | 72 + .../resources/KeeperExceptionMapper.java | 86 + .../resources/RuntimeExceptionMapper.java | 55 + .../jersey/resources/SessionsResource.java | 135 + .../server/jersey/resources/ZErrorWriter.java | 63 + .../jersey/resources/ZNodeResource.java | 412 + .../src/contrib/rest/src/python/README.txt | 9 + .../rest/src/python/demo_master_election.py | 90 + .../src/contrib/rest/src/python/demo_queue.py | 99 + .../src/contrib/rest/src/python/test.py | 163 + .../contrib/rest/src/python/zk_dump_tree.py | 108 + .../src/contrib/rest/src/python/zkrest.py | 218 + .../src/contrib/zkfuse/Makefile.am | 4 + .../src/contrib/zkfuse/README.txt | 63 + .../src/contrib/zkfuse/build.xml | 61 + .../src/contrib/zkfuse/configure.ac | 72 + .../src/contrib/zkfuse/src/Makefile.am | 7 + .../src/contrib/zkfuse/src/blockingqueue.h | 154 + .../src/contrib/zkfuse/src/doxygen.cfg | 1242 + .../src/contrib/zkfuse/src/event.cc | 29 + .../src/contrib/zkfuse/src/event.h | 553 + .../src/contrib/zkfuse/src/log.cc | 36 + .../src/contrib/zkfuse/src/log.h | 116 + .../src/contrib/zkfuse/src/log4cxx.properties | 28 + .../src/contrib/zkfuse/src/mutex.h | 169 + .../src/contrib/zkfuse/src/thread.cc | 41 + .../src/contrib/zkfuse/src/thread.h | 99 + .../src/contrib/zkfuse/src/zkadapter.cc | 881 + .../src/contrib/zkfuse/src/zkadapter.h | 718 + .../src/contrib/zkfuse/src/zkfuse.cc | 4492 ++++ .../src/contrib/zkperl/Changes | 65 + .../src/contrib/zkperl/LICENSE | 202 + .../src/contrib/zkperl/MANIFEST | 23 + .../src/contrib/zkperl/Makefile.PL | 73 + .../zookeeper-3.4.6/src/contrib/zkperl/NOTICE | 6 + .../zookeeper-3.4.6/src/contrib/zkperl/README | 86 + .../src/contrib/zkperl/ZooKeeper.pm | 1257 + .../src/contrib/zkperl/ZooKeeper.xs | 2669 ++ .../src/contrib/zkperl/build.xml | 61 + .../contrib/zkperl/build/check_zk_version.c | 29 + .../contrib/zkperl/build/check_zk_version.h | 27 + .../src/contrib/zkperl/t/10_invalid.t | 773 + .../src/contrib/zkperl/t/15_thread.t | 121 + .../src/contrib/zkperl/t/20_tie.t | 353 + .../src/contrib/zkperl/t/22_stat_tie.t | 438 + .../src/contrib/zkperl/t/24_watch_tie.t | 292 + .../src/contrib/zkperl/t/30_connect.t | 202 + .../src/contrib/zkperl/t/35_log.t | 88 + .../src/contrib/zkperl/t/40_basic.t | 277 + .../src/contrib/zkperl/t/45_class.t | 408 + .../src/contrib/zkperl/t/50_access.t | 356 + .../src/contrib/zkperl/t/60_watch.t | 304 + .../src/contrib/zkperl/t/util.pl | 62 + .../src/contrib/zkperl/typemap | 38 + .../src/contrib/zkpython/README | 109 + .../src/contrib/zkpython/build.xml | 198 + .../src/contrib/zkpython/ivy.xml | 43 + .../contrib/zkpython/src/c/pyzk_docstrings.h | 594 + .../src/contrib/zkpython/src/c/zookeeper.c | 1664 ++ .../src/contrib/zkpython/src/examples/README | 8 + .../src/examples/watch_znode_for_changes.py | 202 + .../src/packages/deb/zkpython.control/control | 23 + .../src/packages/rpm/spec/zkpython.spec | 81 + .../src/contrib/zkpython/src/python/setup.py | 36 + .../src/contrib/zkpython/src/python/zk.py | 76 + .../src/contrib/zktreeutil/Makefile.am | 4 + .../src/contrib/zktreeutil/README.txt | 74 + .../src/contrib/zktreeutil/build.xml | 61 + .../src/contrib/zktreeutil/configure.ac | 66 + .../src/contrib/zktreeutil/src/Makefile.am | 24 + .../src/contrib/zktreeutil/src/SimpleTree.h | 150 + .../src/contrib/zktreeutil/src/ZkAdaptor.cc | 513 + .../src/contrib/zktreeutil/src/ZkAdaptor.h | 327 + .../src/contrib/zktreeutil/src/ZkTreeUtil.cc | 705 + .../src/contrib/zktreeutil/src/ZkTreeUtil.h | 262 + .../contrib/zktreeutil/src/ZkTreeUtilMain.cc | 247 + .../contrib/zktreeutil/tests/zk_sample.xml | 44 + .../src/contrib/zooinspector/NOTICE.txt | 3 + .../src/contrib/zooinspector/README.txt | 94 + .../src/contrib/zooinspector/build.xml | 152 + .../config/defaultConnectionSettings.cfg | 21 + .../config/defaultNodeVeiwers.cfg | 17 + .../zooinspector/icons/edtsrclkup_co.gif | Bin 0 -> 204 bytes .../contrib/zooinspector/icons/file_obj.gif | Bin 0 -> 354 bytes .../contrib/zooinspector/icons/fldr_obj.gif | Bin 0 -> 216 bytes .../contrib/zooinspector/icons/info_obj.gif | Bin 0 -> 121 bytes .../contrib/zooinspector/icons/jspdecl.gif | Bin 0 -> 190 bytes .../contrib/zooinspector/icons/launch_run.gif | Bin 0 -> 379 bytes .../zooinspector/icons/launch_stop.gif | Bin 0 -> 916 bytes .../contrib/zooinspector/icons/new_con.gif | Bin 0 -> 353 bytes .../contrib/zooinspector/icons/refresh.gif | Bin 0 -> 327 bytes .../contrib/zooinspector/icons/save_edit.gif | Bin 0 -> 639 bytes .../zooinspector/icons/search_next.gif | Bin 0 -> 332 bytes .../zooinspector/icons/search_prev.gif | Bin 0 -> 323 bytes .../src/contrib/zooinspector/icons/trash.gif | Bin 0 -> 132 bytes .../src/contrib/zooinspector/ivy.xml | 48 + .../zooinspector/lib/jtoaster-1.0.4.jar | Bin 0 -> 14975 bytes .../contrib/zooinspector/lib/log4j.properties | 9 + .../licences/Apache Software Licence v2.0.txt | 202 + .../zooinspector/licences/epl-v10.html | 261 + .../zookeeper/inspector/ZooInspector.java | 66 + .../BasicDataEncryptionManager.java | 50 + .../encryption/DataEncryptionManager.java | 39 + .../gui/NodeViewersChangeListener.java | 37 + .../gui/ZooInspectorAboutDialog.java | 80 + ...ooInspectorConnectionPropertiesDialog.java | 321 + .../gui/ZooInspectorIconResources.java | 118 + .../gui/ZooInspectorNodeViewersDialog.java | 605 + .../gui/ZooInspectorNodeViewersPanel.java | 140 + .../inspector/gui/ZooInspectorPanel.java | 361 + .../inspector/gui/ZooInspectorTreeViewer.java | 362 + .../apache/zookeeper/inspector/gui/about.html | 21 + .../gui/nodeviewer/NodeViewerACL.java | 187 + .../gui/nodeviewer/NodeViewerData.java | 146 + .../gui/nodeviewer/NodeViewerMetaData.java | 186 + .../nodeviewer/ZooInspectorNodeViewer.java | 138 + .../inspector/logger/LoggerFactory.java | 36 + .../inspector/manager/NodeListener.java | 37 + .../zookeeper/inspector/manager/Pair.java | 120 + .../manager/ZooInspectorManager.java | 139 + .../manager/ZooInspectorManagerImpl.java | 884 + .../manager/ZooInspectorNodeManager.java | 33 + .../manager/ZooInspectorNodeTreeManager.java | 43 + .../manager/ZooInspectorReadOnlyManager.java | 99 + .../zookeeper/retry/ZooKeeperRetry.java | 288 + .../contrib/zooinspector/zooInspector-dev.sh | 18 + .../src/contrib/zooinspector/zooInspector.cmd | 18 + .../src/contrib/zooinspector/zooInspector.sh | 18 + .../src/docs/forrest.properties | 108 + .../src/docs/src/documentation/README.txt | 7 + .../src/docs/src/documentation/TODO.txt | 227 + .../classes/CatalogManager.properties | 37 + .../content/xdocs/bookkeeperConfig.xml | 156 + .../content/xdocs/bookkeeperOverview.xml | 419 + .../content/xdocs/bookkeeperProgrammer.xml | 678 + .../content/xdocs/bookkeeperStarted.xml | 208 + .../content/xdocs/bookkeeperStream.xml | 331 + .../src/documentation/content/xdocs/index.xml | 98 + .../content/xdocs/javaExample.xml | 663 + .../documentation/content/xdocs/recipes.xml | 637 + .../content/xdocs/releasenotes.xml | 2875 +++ .../src/documentation/content/xdocs/site.xml | 103 + .../src/documentation/content/xdocs/tabs.xml | 36 + .../content/xdocs/zookeeperAdmin.xml | 1532 ++ .../xdocs/zookeeperHierarchicalQuorums.xml | 75 + .../content/xdocs/zookeeperInternals.xml | 487 + .../content/xdocs/zookeeperJMX.xml | 236 + .../content/xdocs/zookeeperObservers.xml | 145 + .../content/xdocs/zookeeperOtherInfo.xml | 46 + .../content/xdocs/zookeeperOver.xml | 464 + .../content/xdocs/zookeeperProgrammers.xml | 1658 ++ .../content/xdocs/zookeeperQuotas.xml | 72 + .../content/xdocs/zookeeperStarted.xml | 423 + .../content/xdocs/zookeeperTutorial.xml | 675 + .../documentation/resources/images/2pc.jpg | Bin 0 -> 15174 bytes .../resources/images/bk-overview.jpg | Bin 0 -> 124211 bytes .../resources/images/favicon.ico | Bin 0 -> 766 bytes .../resources/images/hadoop-logo.jpg | Bin 0 -> 9443 bytes .../resources/images/state_dia.dia | Bin 0 -> 2597 bytes .../resources/images/state_dia.jpg | Bin 0 -> 51364 bytes .../documentation/resources/images/zkarch.jpg | Bin 0 -> 24535 bytes .../resources/images/zkcomponents.jpg | Bin 0 -> 30831 bytes .../resources/images/zknamespace.jpg | Bin 0 -> 35414 bytes .../resources/images/zkperfRW-3.2.jpg | Bin 0 -> 41948 bytes .../resources/images/zkperfRW.jpg | Bin 0 -> 161542 bytes .../resources/images/zkperfreliability.jpg | Bin 0 -> 69825 bytes .../resources/images/zkservice.jpg | Bin 0 -> 86790 bytes .../resources/images/zookeeper_small.gif | Bin 0 -> 4847 bytes .../src/docs/src/documentation/skinconf.xml | 360 + .../zookeeper-3.4.6/src/docs/status.xml | 74 + .../zookeeper-3.4.6/src/java/OldChangeLog | 0 .../src/java/generated/.generated | 0 .../org/apache/zookeeper/data/ACL.java | 122 + .../org/apache/zookeeper/data/Id.java | 121 + .../org/apache/zookeeper/data/Stat.java | 283 + .../apache/zookeeper/data/StatPersisted.java | 247 + .../zookeeper/data/StatPersistedV1.java | 229 + .../apache/zookeeper/proto/AuthPacket.java | 143 + .../zookeeper/proto/CheckVersionRequest.java | 121 + .../zookeeper/proto/ConnectRequest.java | 179 + .../zookeeper/proto/ConnectResponse.java | 161 + .../apache/zookeeper/proto/CreateRequest.java | 173 + .../zookeeper/proto/CreateResponse.java | 103 + .../apache/zookeeper/proto/DeleteRequest.java | 121 + .../apache/zookeeper/proto/ErrorResponse.java | 103 + .../apache/zookeeper/proto/ExistsRequest.java | 121 + .../zookeeper/proto/ExistsResponse.java | 104 + .../apache/zookeeper/proto/GetACLRequest.java | 103 + .../zookeeper/proto/GetACLResponse.java | 142 + .../zookeeper/proto/GetChildren2Request.java | 121 + .../zookeeper/proto/GetChildren2Response.java | 141 + .../zookeeper/proto/GetChildrenRequest.java | 121 + .../zookeeper/proto/GetChildrenResponse.java | 124 + .../zookeeper/proto/GetDataRequest.java | 121 + .../zookeeper/proto/GetDataResponse.java | 126 + .../proto/GetMaxChildrenRequest.java | 103 + .../proto/GetMaxChildrenResponse.java | 103 + .../zookeeper/proto/GetSASLRequest.java | 107 + .../apache/zookeeper/proto/MultiHeader.java | 139 + .../apache/zookeeper/proto/ReplyHeader.java | 139 + .../apache/zookeeper/proto/RequestHeader.java | 121 + .../apache/zookeeper/proto/SetACLRequest.java | 157 + .../zookeeper/proto/SetACLResponse.java | 104 + .../zookeeper/proto/SetDataRequest.java | 143 + .../zookeeper/proto/SetDataResponse.java | 104 + .../proto/SetMaxChildrenRequest.java | 121 + .../zookeeper/proto/SetSASLRequest.java | 107 + .../zookeeper/proto/SetSASLResponse.java | 107 + .../apache/zookeeper/proto/SetWatches.java | 228 + .../apache/zookeeper/proto/SyncRequest.java | 103 + .../apache/zookeeper/proto/SyncResponse.java | 103 + .../apache/zookeeper/proto/WatcherEvent.java | 139 + .../server/persistence/FileHeader.java | 139 + .../zookeeper/server/quorum/LearnerInfo.java | 121 + .../zookeeper/server/quorum/QuorumPacket.java | 173 + .../apache/zookeeper/txn/CheckVersionTxn.java | 121 + .../zookeeper/txn/CreateSessionTxn.java | 103 + .../org/apache/zookeeper/txn/CreateTxn.java | 189 + .../org/apache/zookeeper/txn/CreateTxnV0.java | 173 + .../org/apache/zookeeper/txn/DeleteTxn.java | 103 + .../org/apache/zookeeper/txn/ErrorTxn.java | 103 + .../org/apache/zookeeper/txn/MultiTxn.java | 125 + .../org/apache/zookeeper/txn/SetACLTxn.java | 157 + .../org/apache/zookeeper/txn/SetDataTxn.java | 143 + .../zookeeper/txn/SetMaxChildrenTxn.java | 121 + .../org/apache/zookeeper/txn/Txn.java | 125 + .../org/apache/zookeeper/txn/TxnHeader.java | 175 + .../org/apache/zookeeper/version/Info.java | 30 + .../src/java/lib/cobertura/README.txt | 3 + .../src/java/lib/jdiff/zookeeper_3.1.1.xml | 2717 ++ .../lib/jdiff/zookeeper_3.4.6-SNAPSHOT.xml | 4559 ++++ .../src/java/lib/jdiff/zookeeper_3.4.6.xml | 4559 ++++ .../src/java/lib/jline-0.9.94.LICENSE.txt | 33 + .../src/java/lib/log4j-1.2.16.LICENSE.txt | 202 + .../org/apache/jute/BinaryInputArchive.java | 126 + .../org/apache/jute/BinaryOutputArchive.java | 146 + .../main/org/apache/jute/CsvInputArchive.java | 208 + .../org/apache/jute/CsvOutputArchive.java | 150 + .../src/java/main/org/apache/jute/Index.java | 38 + .../main/org/apache/jute/InputArchive.java | 43 + .../main/org/apache/jute/OutputArchive.java | 47 + .../src/java/main/org/apache/jute/Record.java | 32 + .../main/org/apache/jute/RecordReader.java | 93 + .../main/org/apache/jute/RecordWriter.java | 113 + .../src/java/main/org/apache/jute/Utils.java | 282 + .../main/org/apache/jute/XmlInputArchive.java | 251 + .../org/apache/jute/XmlOutputArchive.java | 251 + .../org/apache/jute/compiler/CGenerator.java | 130 + .../apache/jute/compiler/CSharpGenerator.java | 53 + .../apache/jute/compiler/CppGenerator.java | 125 + .../org/apache/jute/compiler/JBoolean.java | 50 + .../org/apache/jute/compiler/JBuffer.java | 106 + .../main/org/apache/jute/compiler/JByte.java | 34 + .../org/apache/jute/compiler/JCompType.java | 66 + .../org/apache/jute/compiler/JDouble.java | 40 + .../main/org/apache/jute/compiler/JField.java | 140 + .../main/org/apache/jute/compiler/JFile.java | 84 + .../main/org/apache/jute/compiler/JFloat.java | 39 + .../main/org/apache/jute/compiler/JInt.java | 34 + .../main/org/apache/jute/compiler/JLong.java | 38 + .../main/org/apache/jute/compiler/JMap.java | 149 + .../org/apache/jute/compiler/JRecord.java | 761 + .../org/apache/jute/compiler/JString.java | 46 + .../main/org/apache/jute/compiler/JType.java | 204 + .../org/apache/jute/compiler/JVector.java | 153 + .../apache/jute/compiler/JavaGenerator.java | 57 + .../compiler/generated/ParseException.java | 210 + .../apache/jute/compiler/generated/Rcc.java | 525 + .../jute/compiler/generated/RccConstants.java | 88 + .../compiler/generated/RccTokenManager.java | 833 + .../compiler/generated/SimpleCharStream.java | 457 + .../apache/jute/compiler/generated/Token.java | 99 + .../compiler/generated/TokenMgrError.java | 151 + .../jute/compiler/generated/package.html | 28 + .../org/apache/jute/compiler/generated/rcc.jj | 374 + .../org/apache/jute/compiler/package.html | 30 + .../java/main/org/apache/jute/package.html | 801 + .../org/apache/zookeeper/AsyncCallback.java | 57 + .../main/org/apache/zookeeper/ClientCnxn.java | 1412 ++ .../apache/zookeeper/ClientCnxnSocket.java | 174 + .../apache/zookeeper/ClientCnxnSocketNIO.java | 431 + .../apache/zookeeper/ClientWatchManager.java | 40 + .../main/org/apache/zookeeper/CreateMode.java | 92 + .../org/apache/zookeeper/Environment.java | 103 + .../apache/zookeeper/JLineZNodeCompletor.java | 84 + .../org/apache/zookeeper/KeeperException.java | 702 + .../java/main/org/apache/zookeeper/Login.java | 402 + .../org/apache/zookeeper/MultiResponse.java | 166 + .../zookeeper/MultiTransactionRecord.java | 160 + .../java/main/org/apache/zookeeper/Op.java | 351 + .../main/org/apache/zookeeper/OpResult.java | 185 + .../main/org/apache/zookeeper/Quotas.java | 68 + .../apache/zookeeper/ServerAdminClient.java | 313 + .../java/main/org/apache/zookeeper/Shell.java | 475 + .../main/org/apache/zookeeper/StatsTrack.java | 101 + .../org/apache/zookeeper/Transaction.java | 63 + .../main/org/apache/zookeeper/Version.java | 79 + .../org/apache/zookeeper/WatchedEvent.java | 79 + .../main/org/apache/zookeeper/Watcher.java | 149 + .../main/org/apache/zookeeper/ZKUtil.java | 124 + .../main/org/apache/zookeeper/ZooDefs.java | 119 + .../main/org/apache/zookeeper/ZooKeeper.java | 1788 ++ .../org/apache/zookeeper/ZooKeeperMain.java | 859 + .../zookeeper/client/ConnectStringParser.java | 87 + .../zookeeper/client/FourLetterWordMain.java | 79 + .../apache/zookeeper/client/HostProvider.java | 61 + .../zookeeper/client/StaticHostProvider.java | 116 + .../zookeeper/client/ZooKeeperSaslClient.java | 584 + .../common/AtomicFileOutputStream.java | 115 + .../org/apache/zookeeper/common/IOUtils.java | 123 + .../org/apache/zookeeper/common/PathTrie.java | 293 + .../apache/zookeeper/common/PathUtils.java | 103 + .../org/apache/zookeeper/jmx/CommonNames.java | 29 + .../apache/zookeeper/jmx/MBeanRegistry.java | 215 + .../org/apache/zookeeper/jmx/ManagedUtil.java | 71 + .../org/apache/zookeeper/jmx/ZKMBeanInfo.java | 36 + .../server/ByteBufferInputStream.java | 82 + .../server/ByteBufferOutputStream.java | 52 + .../zookeeper/server/ConnectionBean.java | 173 + .../zookeeper/server/ConnectionMXBean.java | 98 + .../org/apache/zookeeper/server/DataNode.java | 173 + .../org/apache/zookeeper/server/DataTree.java | 1350 + .../apache/zookeeper/server/DataTreeBean.java | 61 + .../zookeeper/server/DataTreeMXBean.java | 47 + .../server/DatadirCleanupManager.java | 192 + .../server/FinalRequestProcessor.java | 418 + .../apache/zookeeper/server/LogFormatter.java | 106 + .../zookeeper/server/NIOServerCnxn.java | 1162 + .../server/NIOServerCnxnFactory.java | 309 + .../zookeeper/server/NettyServerCnxn.java | 856 + .../server/NettyServerCnxnFactory.java | 403 + .../apache/zookeeper/server/ObserverBean.java | 45 + .../server/PrepRequestProcessor.java | 766 + .../apache/zookeeper/server/PurgeTxnLog.java | 133 + .../org/apache/zookeeper/server/Request.java | 241 + .../zookeeper/server/RequestProcessor.java | 44 + .../apache/zookeeper/server/ServerCnxn.java | 452 + .../zookeeper/server/ServerCnxnFactory.java | 211 + .../apache/zookeeper/server/ServerConfig.java | 111 + .../apache/zookeeper/server/ServerStats.java | 139 + .../zookeeper/server/SessionTracker.java | 81 + .../zookeeper/server/SessionTrackerImpl.java | 279 + .../zookeeper/server/SnapshotFormatter.java | 128 + .../org/apache/zookeeper/server/Stats.java | 68 + .../server/SyncRequestProcessor.java | 235 + .../zookeeper/server/TraceFormatter.java | 123 + .../server/UnimplementedRequestProcessor.java | 48 + .../apache/zookeeper/server/WatchManager.java | 171 + .../apache/zookeeper/server/ZKDatabase.java | 502 + .../zookeeper/server/ZooKeeperSaslServer.java | 173 + .../zookeeper/server/ZooKeeperServer.java | 1012 + .../zookeeper/server/ZooKeeperServerBean.java | 147 + .../server/ZooKeeperServerMXBean.java | 110 + .../zookeeper/server/ZooKeeperServerMain.java | 134 + .../org/apache/zookeeper/server/ZooTrace.java | 93 + .../server/auth/AuthenticationProvider.java | 82 + .../auth/DigestAuthenticationProvider.java | 139 + .../server/auth/DigestLoginModule.java | 61 + .../server/auth/IPAuthenticationProvider.java | 117 + .../zookeeper/server/auth/KerberosName.java | 418 + .../server/auth/ProviderRegistry.java | 77 + .../auth/SASLAuthenticationProvider.java | 70 + .../auth/SaslServerCallbackHandler.java | 152 + .../org/apache/zookeeper/server/package.html | 101 + .../server/persistence/FileSnap.java | 250 + .../server/persistence/FileTxnLog.java | 684 + .../server/persistence/FileTxnSnapLog.java | 341 + .../server/persistence/SnapShot.java | 66 + .../zookeeper/server/persistence/TxnLog.java | 121 + .../zookeeper/server/persistence/Util.java | 326 + .../server/quorum/AckRequestProcessor.java | 54 + .../server/quorum/AuthFastLeaderElection.java | 978 + .../server/quorum/CommitProcessor.java | 192 + .../zookeeper/server/quorum/Election.java | 27 + .../server/quorum/FastLeaderElection.java | 999 + .../zookeeper/server/quorum/Follower.java | 169 + .../zookeeper/server/quorum/FollowerBean.java | 50 + .../server/quorum/FollowerMXBean.java | 41 + .../quorum/FollowerRequestProcessor.java | 112 + .../quorum/FollowerZooKeeperServer.java | 164 + .../zookeeper/server/quorum/Leader.java | 1055 + .../zookeeper/server/quorum/LeaderBean.java | 53 + .../server/quorum/LeaderElection.java | 295 + .../server/quorum/LeaderElectionBean.java | 42 + .../server/quorum/LeaderElectionMXBean.java | 31 + .../zookeeper/server/quorum/LeaderMXBean.java | 36 + .../server/quorum/LeaderZooKeeperServer.java | 180 + .../zookeeper/server/quorum/Learner.java | 549 + .../server/quorum/LearnerHandler.java | 700 + .../server/quorum/LearnerSessionTracker.java | 96 + .../server/quorum/LearnerSyncRequest.java | 34 + .../server/quorum/LearnerZooKeeperServer.java | 145 + .../server/quorum/LocalPeerBean.java | 79 + .../server/quorum/LocalPeerMXBean.java | 77 + .../zookeeper/server/quorum/Observer.java | 141 + .../server/quorum/ObserverMXBean.java | 37 + .../quorum/ObserverRequestProcessor.java | 126 + .../quorum/ObserverZooKeeperServer.java | 147 + .../quorum/ProposalRequestProcessor.java | 93 + .../zookeeper/server/quorum/QuorumBean.java | 44 + .../server/quorum/QuorumCnxManager.java | 903 + .../zookeeper/server/quorum/QuorumMXBean.java | 34 + .../zookeeper/server/quorum/QuorumPeer.java | 1249 + .../server/quorum/QuorumPeerConfig.java | 425 + .../server/quorum/QuorumPeerMain.java | 160 + .../zookeeper/server/quorum/QuorumStats.java | 68 + .../server/quorum/QuorumZooKeeperServer.java | 60 + .../zookeeper/server/quorum/ReadOnlyBean.java | 38 + .../quorum/ReadOnlyRequestProcessor.java | 128 + .../quorum/ReadOnlyZooKeeperServer.java | 146 + .../server/quorum/RemotePeerBean.java | 45 + .../server/quorum/RemotePeerMXBean.java | 33 + .../quorum/SendAckRequestProcessor.java | 80 + .../zookeeper/server/quorum/ServerBean.java | 38 + .../zookeeper/server/quorum/ServerMXBean.java | 33 + .../zookeeper/server/quorum/StateSummary.java | 57 + .../apache/zookeeper/server/quorum/Vote.java | 169 + .../quorum/flexible/QuorumHierarchical.java | 273 + .../server/quorum/flexible/QuorumMaj.java | 63 + .../quorum/flexible/QuorumVerifier.java | 33 + .../zookeeper/server/upgrade/DataNodeV1.java | 129 + .../zookeeper/server/upgrade/DataTreeV1.java | 584 + .../zookeeper/server/upgrade/UpgradeMain.java | 181 + .../server/upgrade/UpgradeSnapShot.java | 33 + .../server/upgrade/UpgradeSnapShotV1.java | 332 + .../zookeeper/server/util/KerberosUtil.java | 45 + .../zookeeper/server/util/OSMXBean.java | 182 + .../zookeeper/server/util/Profiler.java | 41 + .../zookeeper/server/util/SerializeUtils.java | 141 + .../zookeeper/server/util/ZxidUtils.java | 34 + .../apache/zookeeper/version/util/VerGen.java | 177 + .../src/java/main/overview.html | 26 + .../src/java/systest/README.txt | 62 + .../zookeeper-3.4.6/src/lastRevision.bat | 23 + .../zookeeper-3.4.6/src/lastRevision.sh | 21 + .../src/packages/deb/init.d/zookeeper | 140 + .../packages/deb/zookeeper.control/conffile | 15 + .../packages/deb/zookeeper.control/control | 23 + .../packages/deb/zookeeper.control/postinst | 23 + .../src/packages/deb/zookeeper.control/postrm | 19 + .../packages/deb/zookeeper.control/preinst | 20 + .../src/packages/deb/zookeeper.control/prerm | 24 + .../src/packages/rpm/init.d/zookeeper | 84 + .../src/packages/rpm/spec/zookeeper.spec | 166 + .../packages/templates/conf/zookeeper-env.sh | 16 + .../src/packages/update-zookeeper-env.sh | 163 + .../zookeeper-3.4.6/src/recipes/README.txt | 25 + .../src/recipes/build-recipes.xml | 177 + .../zookeeper-3.4.6/src/recipes/build.xml | 79 + .../src/recipes/election/README.txt | 27 + .../src/recipes/election/build.xml | 128 + .../recipes/leader/LeaderElectionAware.java | 37 + .../recipes/leader/LeaderElectionSupport.java | 461 + .../zookeeper/recipes/leader/LeaderOffer.java | 84 + .../src/recipes/lock/README.txt | 28 + .../src/recipes/lock/build.xml | 128 + .../src/recipes/lock/src/c/INSTALL | 234 + .../src/recipes/lock/src/c/LICENSE | 202 + .../src/recipes/lock/src/c/Makefile.am | 46 + .../src/recipes/lock/src/c/README.txt | 28 + .../src/recipes/lock/src/c/acinclude.m4 | 312 + .../src/recipes/lock/src/c/aminclude.am | 186 + .../src/recipes/lock/src/c/c-doc.Doxyfile | 1252 + .../src/recipes/lock/src/c/configure.ac | 82 + .../src/recipes/lock/src/c/include/zoo_lock.h | 168 + .../src/recipes/lock/src/c/src/zoo_lock.c | 396 + .../recipes/lock/src/c/tests/TestClient.cc | 201 + .../recipes/lock/src/c/tests/TestDriver.cc | 114 + .../src/recipes/lock/src/c/tests/Util.cc | 30 + .../src/recipes/lock/src/c/tests/Util.h | 134 + .../src/recipes/lock/src/c/tests/zkServer.sh | 75 + .../zookeeper/recipes/lock/LockListener.java | 38 + .../recipes/lock/ProtocolSupport.java | 193 + .../zookeeper/recipes/lock/WriteLock.java | 296 + .../zookeeper/recipes/lock/ZNodeName.java | 110 + .../recipes/lock/ZooKeeperOperation.java | 38 + .../src/recipes/queue/README.txt | 30 + .../src/recipes/queue/build.xml | 128 + .../src/recipes/queue/src/c/INSTALL | 234 + .../src/recipes/queue/src/c/LICENSE | 202 + .../src/recipes/queue/src/c/Makefile.am | 46 + .../src/recipes/queue/src/c/README.txt | 30 + .../src/recipes/queue/src/c/acinclude.m4 | 312 + .../src/recipes/queue/src/c/aminclude.am | 186 + .../src/recipes/queue/src/c/c-doc.Doxyfile | 1252 + .../src/recipes/queue/src/c/configure.ac | 82 + .../recipes/queue/src/c/include/zoo_queue.h | 118 + .../src/recipes/queue/src/c/src/zoo_queue.c | 442 + .../recipes/queue/src/c/tests/TestClient.cc | 452 + .../recipes/queue/src/c/tests/TestDriver.cc | 114 + .../src/recipes/queue/src/c/tests/Util.cc | 30 + .../src/recipes/queue/src/c/tests/Util.h | 134 + .../src/recipes/queue/src/c/tests/zkServer.sh | 75 + .../recipes/queue/DistributedQueue.java | 313 + .../zookeeper-3.4.6/src/zookeeper.jute | 288 + .../zookeeper-3.4.6.jar.REMOVED.git-id | 1 + .../zookeeper-3.4.6/zookeeper-3.4.6.jar.asc | 17 + .../zookeeper-3.4.6/zookeeper-3.4.6.jar.md5 | 1 + .../zookeeper-3.4.6/zookeeper-3.4.6.jar.sha1 | 1 + 1254 files changed, 397862 insertions(+) create mode 100644 pkg/registry/zookeeper-3.4.6/CHANGES.txt create mode 100644 pkg/registry/zookeeper-3.4.6/LICENSE.txt create mode 100644 pkg/registry/zookeeper-3.4.6/NOTICE.txt create mode 100644 pkg/registry/zookeeper-3.4.6/README.txt create mode 100644 pkg/registry/zookeeper-3.4.6/README_packaging.txt create mode 100755 pkg/registry/zookeeper-3.4.6/bin/README.txt create mode 100755 pkg/registry/zookeeper-3.4.6/bin/zkCleanup.sh create mode 100755 pkg/registry/zookeeper-3.4.6/bin/zkCli.cmd create mode 100755 pkg/registry/zookeeper-3.4.6/bin/zkCli.sh create mode 100755 pkg/registry/zookeeper-3.4.6/bin/zkEnv.cmd create mode 100755 pkg/registry/zookeeper-3.4.6/bin/zkEnv.sh create mode 100755 pkg/registry/zookeeper-3.4.6/bin/zkServer.cmd create mode 100755 pkg/registry/zookeeper-3.4.6/bin/zkServer.sh create mode 100644 pkg/registry/zookeeper-3.4.6/build.xml create mode 100644 pkg/registry/zookeeper-3.4.6/conf/configuration.xsl create mode 100644 pkg/registry/zookeeper-3.4.6/conf/log4j.properties create mode 100644 pkg/registry/zookeeper-3.4.6/conf/zoo_sample.cfg create mode 100644 pkg/registry/zookeeper-3.4.6/contrib/ZooInspector/build.xml create mode 100644 pkg/registry/zookeeper-3.4.6/contrib/ZooInspector/config/defaultConnectionSettings.cfg create mode 100644 pkg/registry/zookeeper-3.4.6/contrib/ZooInspector/config/defaultNodeVeiwers.cfg create mode 100644 pkg/registry/zookeeper-3.4.6/contrib/ZooInspector/icons/edtsrclkup_co.gif create mode 100644 pkg/registry/zookeeper-3.4.6/contrib/ZooInspector/icons/file_obj.gif create mode 100644 pkg/registry/zookeeper-3.4.6/contrib/ZooInspector/icons/fldr_obj.gif create mode 100644 pkg/registry/zookeeper-3.4.6/contrib/ZooInspector/icons/info_obj.gif create mode 100644 pkg/registry/zookeeper-3.4.6/contrib/ZooInspector/icons/jspdecl.gif create mode 100644 pkg/registry/zookeeper-3.4.6/contrib/ZooInspector/icons/launch_run.gif create mode 100644 pkg/registry/zookeeper-3.4.6/contrib/ZooInspector/icons/launch_stop.gif create mode 100644 pkg/registry/zookeeper-3.4.6/contrib/ZooInspector/icons/new_con.gif create mode 100644 pkg/registry/zookeeper-3.4.6/contrib/ZooInspector/icons/refresh.gif create mode 100644 pkg/registry/zookeeper-3.4.6/contrib/ZooInspector/icons/save_edit.gif create mode 100644 pkg/registry/zookeeper-3.4.6/contrib/ZooInspector/icons/search_next.gif create mode 100644 pkg/registry/zookeeper-3.4.6/contrib/ZooInspector/icons/search_prev.gif create mode 100644 pkg/registry/zookeeper-3.4.6/contrib/ZooInspector/icons/trash.gif create mode 100644 pkg/registry/zookeeper-3.4.6/contrib/ZooInspector/lib/jtoaster-1.0.4.jar create mode 100644 pkg/registry/zookeeper-3.4.6/contrib/ZooInspector/licences/Apache Software Licence v2.0.txt create mode 100644 pkg/registry/zookeeper-3.4.6/contrib/ZooInspector/licences/epl-v10.html create mode 100644 pkg/registry/zookeeper-3.4.6/contrib/ZooInspector/src/java/org/apache/zookeeper/inspector/ZooInspector.java create mode 100644 pkg/registry/zookeeper-3.4.6/contrib/ZooInspector/src/java/org/apache/zookeeper/inspector/encryption/BasicDataEncryptionManager.java create mode 100644 pkg/registry/zookeeper-3.4.6/contrib/ZooInspector/src/java/org/apache/zookeeper/inspector/encryption/DataEncryptionManager.java create mode 100644 pkg/registry/zookeeper-3.4.6/contrib/ZooInspector/src/java/org/apache/zookeeper/inspector/gui/NodeViewersChangeListener.java create mode 100644 pkg/registry/zookeeper-3.4.6/contrib/ZooInspector/src/java/org/apache/zookeeper/inspector/gui/ZooInspectorAboutDialog.java create mode 100644 pkg/registry/zookeeper-3.4.6/contrib/ZooInspector/src/java/org/apache/zookeeper/inspector/gui/ZooInspectorConnectionPropertiesDialog.java create mode 100644 pkg/registry/zookeeper-3.4.6/contrib/ZooInspector/src/java/org/apache/zookeeper/inspector/gui/ZooInspectorIconResources.java create mode 100644 pkg/registry/zookeeper-3.4.6/contrib/ZooInspector/src/java/org/apache/zookeeper/inspector/gui/ZooInspectorNodeViewersDialog.java create mode 100644 pkg/registry/zookeeper-3.4.6/contrib/ZooInspector/src/java/org/apache/zookeeper/inspector/gui/ZooInspectorNodeViewersPanel.java create mode 100644 pkg/registry/zookeeper-3.4.6/contrib/ZooInspector/src/java/org/apache/zookeeper/inspector/gui/ZooInspectorPanel.java create mode 100644 pkg/registry/zookeeper-3.4.6/contrib/ZooInspector/src/java/org/apache/zookeeper/inspector/gui/ZooInspectorTreeViewer.java create mode 100644 pkg/registry/zookeeper-3.4.6/contrib/ZooInspector/src/java/org/apache/zookeeper/inspector/gui/about.html create mode 100644 pkg/registry/zookeeper-3.4.6/contrib/ZooInspector/src/java/org/apache/zookeeper/inspector/gui/nodeviewer/NodeViewerACL.java create mode 100644 pkg/registry/zookeeper-3.4.6/contrib/ZooInspector/src/java/org/apache/zookeeper/inspector/gui/nodeviewer/NodeViewerData.java create mode 100644 pkg/registry/zookeeper-3.4.6/contrib/ZooInspector/src/java/org/apache/zookeeper/inspector/gui/nodeviewer/NodeViewerMetaData.java create mode 100644 pkg/registry/zookeeper-3.4.6/contrib/ZooInspector/src/java/org/apache/zookeeper/inspector/gui/nodeviewer/ZooInspectorNodeViewer.java create mode 100644 pkg/registry/zookeeper-3.4.6/contrib/ZooInspector/src/java/org/apache/zookeeper/inspector/logger/LoggerFactory.java create mode 100644 pkg/registry/zookeeper-3.4.6/contrib/ZooInspector/src/java/org/apache/zookeeper/inspector/manager/NodeListener.java create mode 100644 pkg/registry/zookeeper-3.4.6/contrib/ZooInspector/src/java/org/apache/zookeeper/inspector/manager/Pair.java create mode 100644 pkg/registry/zookeeper-3.4.6/contrib/ZooInspector/src/java/org/apache/zookeeper/inspector/manager/ZooInspectorManager.java create mode 100644 pkg/registry/zookeeper-3.4.6/contrib/ZooInspector/src/java/org/apache/zookeeper/inspector/manager/ZooInspectorManagerImpl.java create mode 100644 pkg/registry/zookeeper-3.4.6/contrib/ZooInspector/src/java/org/apache/zookeeper/inspector/manager/ZooInspectorNodeManager.java create mode 100644 pkg/registry/zookeeper-3.4.6/contrib/ZooInspector/src/java/org/apache/zookeeper/inspector/manager/ZooInspectorNodeTreeManager.java create mode 100644 pkg/registry/zookeeper-3.4.6/contrib/ZooInspector/src/java/org/apache/zookeeper/inspector/manager/ZooInspectorReadOnlyManager.java create mode 100644 pkg/registry/zookeeper-3.4.6/contrib/ZooInspector/src/java/org/apache/zookeeper/retry/ZooKeeperRetry.java create mode 100644 pkg/registry/zookeeper-3.4.6/contrib/ZooInspector/zookeeper-3.4.6-ZooInspector.jar create mode 100644 pkg/registry/zookeeper-3.4.6/contrib/fatjar/build.xml create mode 100644 pkg/registry/zookeeper-3.4.6/contrib/fatjar/conf/mainClasses create mode 100644 pkg/registry/zookeeper-3.4.6/contrib/fatjar/src/java/org/apache/zookeeper/util/FatJarMain.java create mode 100644 pkg/registry/zookeeper-3.4.6/contrib/fatjar/zookeeper-3.4.6-fatjar.jar.REMOVED.git-id create mode 100644 pkg/registry/zookeeper-3.4.6/contrib/loggraph/build.xml create mode 100644 pkg/registry/zookeeper-3.4.6/contrib/loggraph/src/java/org/apache/zookeeper/graph/FilterException.java create mode 100644 pkg/registry/zookeeper-3.4.6/contrib/loggraph/src/java/org/apache/zookeeper/graph/FilterOp.java create mode 100644 pkg/registry/zookeeper-3.4.6/contrib/loggraph/src/java/org/apache/zookeeper/graph/FilterParser.java create mode 100644 pkg/registry/zookeeper-3.4.6/contrib/loggraph/src/java/org/apache/zookeeper/graph/JsonGenerator.java create mode 100644 pkg/registry/zookeeper-3.4.6/contrib/loggraph/src/java/org/apache/zookeeper/graph/Log4JEntry.java create mode 100644 pkg/registry/zookeeper-3.4.6/contrib/loggraph/src/java/org/apache/zookeeper/graph/Log4JSource.java create mode 100644 pkg/registry/zookeeper-3.4.6/contrib/loggraph/src/java/org/apache/zookeeper/graph/LogEntry.java create mode 100644 pkg/registry/zookeeper-3.4.6/contrib/loggraph/src/java/org/apache/zookeeper/graph/LogIterator.java create mode 100644 pkg/registry/zookeeper-3.4.6/contrib/loggraph/src/java/org/apache/zookeeper/graph/LogServer.java create mode 100644 pkg/registry/zookeeper-3.4.6/contrib/loggraph/src/java/org/apache/zookeeper/graph/LogSkipList.java create mode 100644 pkg/registry/zookeeper-3.4.6/contrib/loggraph/src/java/org/apache/zookeeper/graph/LogSource.java create mode 100644 pkg/registry/zookeeper-3.4.6/contrib/loggraph/src/java/org/apache/zookeeper/graph/MeasureThroughput.java create mode 100644 pkg/registry/zookeeper-3.4.6/contrib/loggraph/src/java/org/apache/zookeeper/graph/MergedLogSource.java create mode 100644 pkg/registry/zookeeper-3.4.6/contrib/loggraph/src/java/org/apache/zookeeper/graph/RandomAccessFileReader.java create mode 100644 pkg/registry/zookeeper-3.4.6/contrib/loggraph/src/java/org/apache/zookeeper/graph/TransactionEntry.java create mode 100644 pkg/registry/zookeeper-3.4.6/contrib/loggraph/src/java/org/apache/zookeeper/graph/TxnLogSource.java create mode 100644 pkg/registry/zookeeper-3.4.6/contrib/loggraph/src/java/org/apache/zookeeper/graph/filterops/AndOp.java create mode 100644 pkg/registry/zookeeper-3.4.6/contrib/loggraph/src/java/org/apache/zookeeper/graph/filterops/Arg.java create mode 100644 pkg/registry/zookeeper-3.4.6/contrib/loggraph/src/java/org/apache/zookeeper/graph/filterops/EqualsOp.java create mode 100644 pkg/registry/zookeeper-3.4.6/contrib/loggraph/src/java/org/apache/zookeeper/graph/filterops/GreaterThanOp.java create mode 100644 pkg/registry/zookeeper-3.4.6/contrib/loggraph/src/java/org/apache/zookeeper/graph/filterops/LessThanOp.java create mode 100644 pkg/registry/zookeeper-3.4.6/contrib/loggraph/src/java/org/apache/zookeeper/graph/filterops/NotOp.java create mode 100644 pkg/registry/zookeeper-3.4.6/contrib/loggraph/src/java/org/apache/zookeeper/graph/filterops/NumberArg.java create mode 100644 pkg/registry/zookeeper-3.4.6/contrib/loggraph/src/java/org/apache/zookeeper/graph/filterops/OrOp.java create mode 100644 pkg/registry/zookeeper-3.4.6/contrib/loggraph/src/java/org/apache/zookeeper/graph/filterops/StringArg.java create mode 100644 pkg/registry/zookeeper-3.4.6/contrib/loggraph/src/java/org/apache/zookeeper/graph/filterops/SymbolArg.java create mode 100644 pkg/registry/zookeeper-3.4.6/contrib/loggraph/src/java/org/apache/zookeeper/graph/filterops/XorOp.java create mode 100644 pkg/registry/zookeeper-3.4.6/contrib/loggraph/src/java/org/apache/zookeeper/graph/servlets/FileLoader.java create mode 100644 pkg/registry/zookeeper-3.4.6/contrib/loggraph/src/java/org/apache/zookeeper/graph/servlets/Fs.java create mode 100644 pkg/registry/zookeeper-3.4.6/contrib/loggraph/src/java/org/apache/zookeeper/graph/servlets/GraphData.java create mode 100644 pkg/registry/zookeeper-3.4.6/contrib/loggraph/src/java/org/apache/zookeeper/graph/servlets/JsonServlet.java create mode 100644 pkg/registry/zookeeper-3.4.6/contrib/loggraph/src/java/org/apache/zookeeper/graph/servlets/NumEvents.java create mode 100644 pkg/registry/zookeeper-3.4.6/contrib/loggraph/src/java/org/apache/zookeeper/graph/servlets/StaticContent.java create mode 100644 pkg/registry/zookeeper-3.4.6/contrib/loggraph/src/java/org/apache/zookeeper/graph/servlets/Throughput.java create mode 100644 pkg/registry/zookeeper-3.4.6/contrib/loggraph/zookeeper-3.4.6-loggraph.jar create mode 100644 pkg/registry/zookeeper-3.4.6/contrib/rest/zookeeper-3.4.6-rest.jar create mode 100644 pkg/registry/zookeeper-3.4.6/contrib/zkfuse/Makefile.am create mode 100644 pkg/registry/zookeeper-3.4.6/contrib/zkfuse/README.txt create mode 100644 pkg/registry/zookeeper-3.4.6/contrib/zkfuse/VERSION create mode 100644 pkg/registry/zookeeper-3.4.6/contrib/zkfuse/build.xml create mode 100644 pkg/registry/zookeeper-3.4.6/contrib/zkfuse/configure.ac create mode 100644 pkg/registry/zookeeper-3.4.6/contrib/zkfuse/src/Makefile.am create mode 100644 pkg/registry/zookeeper-3.4.6/contrib/zkfuse/src/blockingqueue.h create mode 100644 pkg/registry/zookeeper-3.4.6/contrib/zkfuse/src/doxygen.cfg create mode 100644 pkg/registry/zookeeper-3.4.6/contrib/zkfuse/src/event.cc create mode 100644 pkg/registry/zookeeper-3.4.6/contrib/zkfuse/src/event.h create mode 100644 pkg/registry/zookeeper-3.4.6/contrib/zkfuse/src/log.cc create mode 100644 pkg/registry/zookeeper-3.4.6/contrib/zkfuse/src/log.h create mode 100644 pkg/registry/zookeeper-3.4.6/contrib/zkfuse/src/log4cxx.properties create mode 100644 pkg/registry/zookeeper-3.4.6/contrib/zkfuse/src/mutex.h create mode 100644 pkg/registry/zookeeper-3.4.6/contrib/zkfuse/src/thread.cc create mode 100644 pkg/registry/zookeeper-3.4.6/contrib/zkfuse/src/thread.h create mode 100644 pkg/registry/zookeeper-3.4.6/contrib/zkfuse/src/zkadapter.cc create mode 100644 pkg/registry/zookeeper-3.4.6/contrib/zkfuse/src/zkadapter.h create mode 100644 pkg/registry/zookeeper-3.4.6/contrib/zkfuse/src/zkfuse.cc create mode 100644 pkg/registry/zookeeper-3.4.6/contrib/zkperl/Changes create mode 100644 pkg/registry/zookeeper-3.4.6/contrib/zkperl/LICENSE create mode 100644 pkg/registry/zookeeper-3.4.6/contrib/zkperl/MANIFEST create mode 100644 pkg/registry/zookeeper-3.4.6/contrib/zkperl/Makefile.PL create mode 100644 pkg/registry/zookeeper-3.4.6/contrib/zkperl/NOTICE create mode 100644 pkg/registry/zookeeper-3.4.6/contrib/zkperl/README create mode 100644 pkg/registry/zookeeper-3.4.6/contrib/zkperl/VERSION create mode 100644 pkg/registry/zookeeper-3.4.6/contrib/zkperl/ZooKeeper.pm create mode 100644 pkg/registry/zookeeper-3.4.6/contrib/zkperl/ZooKeeper.xs create mode 100644 pkg/registry/zookeeper-3.4.6/contrib/zkperl/build.xml create mode 100644 pkg/registry/zookeeper-3.4.6/contrib/zkperl/build/check_zk_version.c create mode 100644 pkg/registry/zookeeper-3.4.6/contrib/zkperl/build/check_zk_version.h create mode 100644 pkg/registry/zookeeper-3.4.6/contrib/zkperl/t/10_invalid.t create mode 100644 pkg/registry/zookeeper-3.4.6/contrib/zkperl/t/15_thread.t create mode 100644 pkg/registry/zookeeper-3.4.6/contrib/zkperl/t/20_tie.t create mode 100644 pkg/registry/zookeeper-3.4.6/contrib/zkperl/t/22_stat_tie.t create mode 100644 pkg/registry/zookeeper-3.4.6/contrib/zkperl/t/24_watch_tie.t create mode 100644 pkg/registry/zookeeper-3.4.6/contrib/zkperl/t/30_connect.t create mode 100644 pkg/registry/zookeeper-3.4.6/contrib/zkperl/t/35_log.t create mode 100644 pkg/registry/zookeeper-3.4.6/contrib/zkperl/t/40_basic.t create mode 100644 pkg/registry/zookeeper-3.4.6/contrib/zkperl/t/45_class.t create mode 100644 pkg/registry/zookeeper-3.4.6/contrib/zkperl/t/50_access.t create mode 100644 pkg/registry/zookeeper-3.4.6/contrib/zkperl/t/60_watch.t create mode 100644 pkg/registry/zookeeper-3.4.6/contrib/zkperl/t/util.pl create mode 100644 pkg/registry/zookeeper-3.4.6/contrib/zkperl/typemap create mode 100644 pkg/registry/zookeeper-3.4.6/contrib/zkpython/README create mode 100644 pkg/registry/zookeeper-3.4.6/contrib/zkpython/VERSION create mode 100644 pkg/registry/zookeeper-3.4.6/contrib/zkpython/build.xml create mode 100644 pkg/registry/zookeeper-3.4.6/contrib/zkpython/ivy.xml create mode 100644 pkg/registry/zookeeper-3.4.6/contrib/zkpython/src/c/pyzk_docstrings.h create mode 100644 pkg/registry/zookeeper-3.4.6/contrib/zkpython/src/c/zookeeper.c create mode 100644 pkg/registry/zookeeper-3.4.6/contrib/zkpython/src/examples/README create mode 100644 pkg/registry/zookeeper-3.4.6/contrib/zkpython/src/examples/watch_znode_for_changes.py create mode 100644 pkg/registry/zookeeper-3.4.6/contrib/zkpython/src/packages/deb/zkpython.control/control create mode 100644 pkg/registry/zookeeper-3.4.6/contrib/zkpython/src/packages/rpm/spec/zkpython.spec create mode 100644 pkg/registry/zookeeper-3.4.6/contrib/zkpython/src/python/setup.py create mode 100644 pkg/registry/zookeeper-3.4.6/contrib/zkpython/src/python/zk.py create mode 100644 pkg/registry/zookeeper-3.4.6/contrib/zktreeutil/Makefile.am create mode 100644 pkg/registry/zookeeper-3.4.6/contrib/zktreeutil/README.txt create mode 100644 pkg/registry/zookeeper-3.4.6/contrib/zktreeutil/VERSION create mode 100644 pkg/registry/zookeeper-3.4.6/contrib/zktreeutil/build.xml create mode 100644 pkg/registry/zookeeper-3.4.6/contrib/zktreeutil/configure.ac create mode 100644 pkg/registry/zookeeper-3.4.6/contrib/zktreeutil/src/Makefile.am create mode 100644 pkg/registry/zookeeper-3.4.6/contrib/zktreeutil/src/SimpleTree.h create mode 100644 pkg/registry/zookeeper-3.4.6/contrib/zktreeutil/src/ZkAdaptor.cc create mode 100644 pkg/registry/zookeeper-3.4.6/contrib/zktreeutil/src/ZkAdaptor.h create mode 100644 pkg/registry/zookeeper-3.4.6/contrib/zktreeutil/src/ZkTreeUtil.cc create mode 100644 pkg/registry/zookeeper-3.4.6/contrib/zktreeutil/src/ZkTreeUtil.h create mode 100644 pkg/registry/zookeeper-3.4.6/contrib/zktreeutil/src/ZkTreeUtilMain.cc create mode 100644 pkg/registry/zookeeper-3.4.6/contrib/zktreeutil/tests/zk_sample.xml create mode 100644 pkg/registry/zookeeper-3.4.6/dist-maven/zookeeper-3.4.6-javadoc.jar create mode 100644 pkg/registry/zookeeper-3.4.6/dist-maven/zookeeper-3.4.6-javadoc.jar.asc create mode 100644 pkg/registry/zookeeper-3.4.6/dist-maven/zookeeper-3.4.6-javadoc.jar.md5 create mode 100644 pkg/registry/zookeeper-3.4.6/dist-maven/zookeeper-3.4.6-javadoc.jar.sha1 create mode 100644 pkg/registry/zookeeper-3.4.6/dist-maven/zookeeper-3.4.6-sources.jar create mode 100644 pkg/registry/zookeeper-3.4.6/dist-maven/zookeeper-3.4.6-sources.jar.asc create mode 100644 pkg/registry/zookeeper-3.4.6/dist-maven/zookeeper-3.4.6-sources.jar.md5 create mode 100644 pkg/registry/zookeeper-3.4.6/dist-maven/zookeeper-3.4.6-sources.jar.sha1 create mode 100644 pkg/registry/zookeeper-3.4.6/dist-maven/zookeeper-3.4.6-tests.jar create mode 100644 pkg/registry/zookeeper-3.4.6/dist-maven/zookeeper-3.4.6-tests.jar.asc create mode 100644 pkg/registry/zookeeper-3.4.6/dist-maven/zookeeper-3.4.6-tests.jar.md5 create mode 100644 pkg/registry/zookeeper-3.4.6/dist-maven/zookeeper-3.4.6-tests.jar.sha1 create mode 100644 pkg/registry/zookeeper-3.4.6/dist-maven/zookeeper-3.4.6.jar.asc create mode 100644 pkg/registry/zookeeper-3.4.6/dist-maven/zookeeper-3.4.6.jar.md5 create mode 100644 pkg/registry/zookeeper-3.4.6/dist-maven/zookeeper-3.4.6.jar.sha1 create mode 100644 pkg/registry/zookeeper-3.4.6/dist-maven/zookeeper-3.4.6.pom create mode 100644 pkg/registry/zookeeper-3.4.6/dist-maven/zookeeper-3.4.6.pom.asc create mode 100644 pkg/registry/zookeeper-3.4.6/dist-maven/zookeeper-3.4.6.pom.md5 create mode 100644 pkg/registry/zookeeper-3.4.6/dist-maven/zookeeper-3.4.6.pom.sha1 create mode 100644 pkg/registry/zookeeper-3.4.6/docs/api/allclasses-frame.html create mode 100644 pkg/registry/zookeeper-3.4.6/docs/api/allclasses-noframe.html create mode 100644 pkg/registry/zookeeper-3.4.6/docs/api/constant-values.html create mode 100644 pkg/registry/zookeeper-3.4.6/docs/api/deprecated-list.html create mode 100644 pkg/registry/zookeeper-3.4.6/docs/api/help-doc.html create mode 100644 pkg/registry/zookeeper-3.4.6/docs/api/index-all.html create mode 100644 pkg/registry/zookeeper-3.4.6/docs/api/index.html create mode 100644 pkg/registry/zookeeper-3.4.6/docs/api/org/apache/zookeeper/AsyncCallback.ACLCallback.html create mode 100644 pkg/registry/zookeeper-3.4.6/docs/api/org/apache/zookeeper/AsyncCallback.Children2Callback.html create mode 100644 pkg/registry/zookeeper-3.4.6/docs/api/org/apache/zookeeper/AsyncCallback.ChildrenCallback.html create mode 100644 pkg/registry/zookeeper-3.4.6/docs/api/org/apache/zookeeper/AsyncCallback.DataCallback.html create mode 100644 pkg/registry/zookeeper-3.4.6/docs/api/org/apache/zookeeper/AsyncCallback.StatCallback.html create mode 100644 pkg/registry/zookeeper-3.4.6/docs/api/org/apache/zookeeper/AsyncCallback.StringCallback.html create mode 100644 pkg/registry/zookeeper-3.4.6/docs/api/org/apache/zookeeper/AsyncCallback.VoidCallback.html create mode 100644 pkg/registry/zookeeper-3.4.6/docs/api/org/apache/zookeeper/AsyncCallback.html create mode 100644 pkg/registry/zookeeper-3.4.6/docs/api/org/apache/zookeeper/CreateMode.html create mode 100644 pkg/registry/zookeeper-3.4.6/docs/api/org/apache/zookeeper/KeeperException.APIErrorException.html create mode 100644 pkg/registry/zookeeper-3.4.6/docs/api/org/apache/zookeeper/KeeperException.AuthFailedException.html create mode 100644 pkg/registry/zookeeper-3.4.6/docs/api/org/apache/zookeeper/KeeperException.BadArgumentsException.html create mode 100644 pkg/registry/zookeeper-3.4.6/docs/api/org/apache/zookeeper/KeeperException.BadVersionException.html create mode 100644 pkg/registry/zookeeper-3.4.6/docs/api/org/apache/zookeeper/KeeperException.Code.html create mode 100644 pkg/registry/zookeeper-3.4.6/docs/api/org/apache/zookeeper/KeeperException.CodeDeprecated.html create mode 100644 pkg/registry/zookeeper-3.4.6/docs/api/org/apache/zookeeper/KeeperException.ConnectionLossException.html create mode 100644 pkg/registry/zookeeper-3.4.6/docs/api/org/apache/zookeeper/KeeperException.DataInconsistencyException.html create mode 100644 pkg/registry/zookeeper-3.4.6/docs/api/org/apache/zookeeper/KeeperException.InvalidACLException.html create mode 100644 pkg/registry/zookeeper-3.4.6/docs/api/org/apache/zookeeper/KeeperException.InvalidCallbackException.html create mode 100644 pkg/registry/zookeeper-3.4.6/docs/api/org/apache/zookeeper/KeeperException.MarshallingErrorException.html create mode 100644 pkg/registry/zookeeper-3.4.6/docs/api/org/apache/zookeeper/KeeperException.NoAuthException.html create mode 100644 pkg/registry/zookeeper-3.4.6/docs/api/org/apache/zookeeper/KeeperException.NoChildrenForEphemeralsException.html create mode 100644 pkg/registry/zookeeper-3.4.6/docs/api/org/apache/zookeeper/KeeperException.NoNodeException.html create mode 100644 pkg/registry/zookeeper-3.4.6/docs/api/org/apache/zookeeper/KeeperException.NodeExistsException.html create mode 100644 pkg/registry/zookeeper-3.4.6/docs/api/org/apache/zookeeper/KeeperException.NotEmptyException.html create mode 100644 pkg/registry/zookeeper-3.4.6/docs/api/org/apache/zookeeper/KeeperException.NotReadOnlyException.html create mode 100644 pkg/registry/zookeeper-3.4.6/docs/api/org/apache/zookeeper/KeeperException.OperationTimeoutException.html create mode 100644 pkg/registry/zookeeper-3.4.6/docs/api/org/apache/zookeeper/KeeperException.RuntimeInconsistencyException.html create mode 100644 pkg/registry/zookeeper-3.4.6/docs/api/org/apache/zookeeper/KeeperException.SessionExpiredException.html create mode 100644 pkg/registry/zookeeper-3.4.6/docs/api/org/apache/zookeeper/KeeperException.SessionMovedException.html create mode 100644 pkg/registry/zookeeper-3.4.6/docs/api/org/apache/zookeeper/KeeperException.SystemErrorException.html create mode 100644 pkg/registry/zookeeper-3.4.6/docs/api/org/apache/zookeeper/KeeperException.UnimplementedException.html create mode 100644 pkg/registry/zookeeper-3.4.6/docs/api/org/apache/zookeeper/KeeperException.html create mode 100644 pkg/registry/zookeeper-3.4.6/docs/api/org/apache/zookeeper/ServerAdminClient.html create mode 100644 pkg/registry/zookeeper-3.4.6/docs/api/org/apache/zookeeper/WatchedEvent.html create mode 100644 pkg/registry/zookeeper-3.4.6/docs/api/org/apache/zookeeper/Watcher.Event.EventType.html create mode 100644 pkg/registry/zookeeper-3.4.6/docs/api/org/apache/zookeeper/Watcher.Event.KeeperState.html create mode 100644 pkg/registry/zookeeper-3.4.6/docs/api/org/apache/zookeeper/Watcher.Event.html create mode 100644 pkg/registry/zookeeper-3.4.6/docs/api/org/apache/zookeeper/Watcher.html create mode 100644 pkg/registry/zookeeper-3.4.6/docs/api/org/apache/zookeeper/ZooDefs.Ids.html create mode 100644 pkg/registry/zookeeper-3.4.6/docs/api/org/apache/zookeeper/ZooDefs.OpCode.html create mode 100644 pkg/registry/zookeeper-3.4.6/docs/api/org/apache/zookeeper/ZooDefs.Perms.html create mode 100644 pkg/registry/zookeeper-3.4.6/docs/api/org/apache/zookeeper/ZooDefs.html create mode 100644 pkg/registry/zookeeper-3.4.6/docs/api/org/apache/zookeeper/ZooKeeper.States.html create mode 100644 pkg/registry/zookeeper-3.4.6/docs/api/org/apache/zookeeper/ZooKeeper.html create mode 100644 pkg/registry/zookeeper-3.4.6/docs/api/org/apache/zookeeper/ZooKeeperMain.html create mode 100644 pkg/registry/zookeeper-3.4.6/docs/api/org/apache/zookeeper/class-use/AsyncCallback.ACLCallback.html create mode 100644 pkg/registry/zookeeper-3.4.6/docs/api/org/apache/zookeeper/class-use/AsyncCallback.Children2Callback.html create mode 100644 pkg/registry/zookeeper-3.4.6/docs/api/org/apache/zookeeper/class-use/AsyncCallback.ChildrenCallback.html create mode 100644 pkg/registry/zookeeper-3.4.6/docs/api/org/apache/zookeeper/class-use/AsyncCallback.DataCallback.html create mode 100644 pkg/registry/zookeeper-3.4.6/docs/api/org/apache/zookeeper/class-use/AsyncCallback.StatCallback.html create mode 100644 pkg/registry/zookeeper-3.4.6/docs/api/org/apache/zookeeper/class-use/AsyncCallback.StringCallback.html create mode 100644 pkg/registry/zookeeper-3.4.6/docs/api/org/apache/zookeeper/class-use/AsyncCallback.VoidCallback.html create mode 100644 pkg/registry/zookeeper-3.4.6/docs/api/org/apache/zookeeper/class-use/AsyncCallback.html create mode 100644 pkg/registry/zookeeper-3.4.6/docs/api/org/apache/zookeeper/class-use/CreateMode.html create mode 100644 pkg/registry/zookeeper-3.4.6/docs/api/org/apache/zookeeper/class-use/KeeperException.APIErrorException.html create mode 100644 pkg/registry/zookeeper-3.4.6/docs/api/org/apache/zookeeper/class-use/KeeperException.AuthFailedException.html create mode 100644 pkg/registry/zookeeper-3.4.6/docs/api/org/apache/zookeeper/class-use/KeeperException.BadArgumentsException.html create mode 100644 pkg/registry/zookeeper-3.4.6/docs/api/org/apache/zookeeper/class-use/KeeperException.BadVersionException.html create mode 100644 pkg/registry/zookeeper-3.4.6/docs/api/org/apache/zookeeper/class-use/KeeperException.Code.html create mode 100644 pkg/registry/zookeeper-3.4.6/docs/api/org/apache/zookeeper/class-use/KeeperException.CodeDeprecated.html create mode 100644 pkg/registry/zookeeper-3.4.6/docs/api/org/apache/zookeeper/class-use/KeeperException.ConnectionLossException.html create mode 100644 pkg/registry/zookeeper-3.4.6/docs/api/org/apache/zookeeper/class-use/KeeperException.DataInconsistencyException.html create mode 100644 pkg/registry/zookeeper-3.4.6/docs/api/org/apache/zookeeper/class-use/KeeperException.InvalidACLException.html create mode 100644 pkg/registry/zookeeper-3.4.6/docs/api/org/apache/zookeeper/class-use/KeeperException.InvalidCallbackException.html create mode 100644 pkg/registry/zookeeper-3.4.6/docs/api/org/apache/zookeeper/class-use/KeeperException.MarshallingErrorException.html create mode 100644 pkg/registry/zookeeper-3.4.6/docs/api/org/apache/zookeeper/class-use/KeeperException.NoAuthException.html create mode 100644 pkg/registry/zookeeper-3.4.6/docs/api/org/apache/zookeeper/class-use/KeeperException.NoChildrenForEphemeralsException.html create mode 100644 pkg/registry/zookeeper-3.4.6/docs/api/org/apache/zookeeper/class-use/KeeperException.NoNodeException.html create mode 100644 pkg/registry/zookeeper-3.4.6/docs/api/org/apache/zookeeper/class-use/KeeperException.NodeExistsException.html create mode 100644 pkg/registry/zookeeper-3.4.6/docs/api/org/apache/zookeeper/class-use/KeeperException.NotEmptyException.html create mode 100644 pkg/registry/zookeeper-3.4.6/docs/api/org/apache/zookeeper/class-use/KeeperException.NotReadOnlyException.html create mode 100644 pkg/registry/zookeeper-3.4.6/docs/api/org/apache/zookeeper/class-use/KeeperException.OperationTimeoutException.html create mode 100644 pkg/registry/zookeeper-3.4.6/docs/api/org/apache/zookeeper/class-use/KeeperException.RuntimeInconsistencyException.html create mode 100644 pkg/registry/zookeeper-3.4.6/docs/api/org/apache/zookeeper/class-use/KeeperException.SessionExpiredException.html create mode 100644 pkg/registry/zookeeper-3.4.6/docs/api/org/apache/zookeeper/class-use/KeeperException.SessionMovedException.html create mode 100644 pkg/registry/zookeeper-3.4.6/docs/api/org/apache/zookeeper/class-use/KeeperException.SystemErrorException.html create mode 100644 pkg/registry/zookeeper-3.4.6/docs/api/org/apache/zookeeper/class-use/KeeperException.UnimplementedException.html create mode 100644 pkg/registry/zookeeper-3.4.6/docs/api/org/apache/zookeeper/class-use/KeeperException.html create mode 100644 pkg/registry/zookeeper-3.4.6/docs/api/org/apache/zookeeper/class-use/ServerAdminClient.html create mode 100644 pkg/registry/zookeeper-3.4.6/docs/api/org/apache/zookeeper/class-use/WatchedEvent.html create mode 100644 pkg/registry/zookeeper-3.4.6/docs/api/org/apache/zookeeper/class-use/Watcher.Event.EventType.html create mode 100644 pkg/registry/zookeeper-3.4.6/docs/api/org/apache/zookeeper/class-use/Watcher.Event.KeeperState.html create mode 100644 pkg/registry/zookeeper-3.4.6/docs/api/org/apache/zookeeper/class-use/Watcher.Event.html create mode 100644 pkg/registry/zookeeper-3.4.6/docs/api/org/apache/zookeeper/class-use/Watcher.html create mode 100644 pkg/registry/zookeeper-3.4.6/docs/api/org/apache/zookeeper/class-use/ZooDefs.Ids.html create mode 100644 pkg/registry/zookeeper-3.4.6/docs/api/org/apache/zookeeper/class-use/ZooDefs.OpCode.html create mode 100644 pkg/registry/zookeeper-3.4.6/docs/api/org/apache/zookeeper/class-use/ZooDefs.Perms.html create mode 100644 pkg/registry/zookeeper-3.4.6/docs/api/org/apache/zookeeper/class-use/ZooDefs.html create mode 100644 pkg/registry/zookeeper-3.4.6/docs/api/org/apache/zookeeper/class-use/ZooKeeper.States.html create mode 100644 pkg/registry/zookeeper-3.4.6/docs/api/org/apache/zookeeper/class-use/ZooKeeper.html create mode 100644 pkg/registry/zookeeper-3.4.6/docs/api/org/apache/zookeeper/class-use/ZooKeeperMain.html create mode 100644 pkg/registry/zookeeper-3.4.6/docs/api/org/apache/zookeeper/client/FourLetterWordMain.html create mode 100644 pkg/registry/zookeeper-3.4.6/docs/api/org/apache/zookeeper/client/class-use/FourLetterWordMain.html create mode 100644 pkg/registry/zookeeper-3.4.6/docs/api/org/apache/zookeeper/client/package-frame.html create mode 100644 pkg/registry/zookeeper-3.4.6/docs/api/org/apache/zookeeper/client/package-summary.html create mode 100644 pkg/registry/zookeeper-3.4.6/docs/api/org/apache/zookeeper/client/package-tree.html create mode 100644 pkg/registry/zookeeper-3.4.6/docs/api/org/apache/zookeeper/client/package-use.html create mode 100644 pkg/registry/zookeeper-3.4.6/docs/api/org/apache/zookeeper/data/ACL.html create mode 100644 pkg/registry/zookeeper-3.4.6/docs/api/org/apache/zookeeper/data/Id.html create mode 100644 pkg/registry/zookeeper-3.4.6/docs/api/org/apache/zookeeper/data/Stat.html create mode 100644 pkg/registry/zookeeper-3.4.6/docs/api/org/apache/zookeeper/data/StatPersisted.html create mode 100644 pkg/registry/zookeeper-3.4.6/docs/api/org/apache/zookeeper/data/StatPersistedV1.html create mode 100644 pkg/registry/zookeeper-3.4.6/docs/api/org/apache/zookeeper/data/class-use/ACL.html create mode 100644 pkg/registry/zookeeper-3.4.6/docs/api/org/apache/zookeeper/data/class-use/Id.html create mode 100644 pkg/registry/zookeeper-3.4.6/docs/api/org/apache/zookeeper/data/class-use/Stat.html create mode 100644 pkg/registry/zookeeper-3.4.6/docs/api/org/apache/zookeeper/data/class-use/StatPersisted.html create mode 100644 pkg/registry/zookeeper-3.4.6/docs/api/org/apache/zookeeper/data/class-use/StatPersistedV1.html create mode 100644 pkg/registry/zookeeper-3.4.6/docs/api/org/apache/zookeeper/data/package-frame.html create mode 100644 pkg/registry/zookeeper-3.4.6/docs/api/org/apache/zookeeper/data/package-summary.html create mode 100644 pkg/registry/zookeeper-3.4.6/docs/api/org/apache/zookeeper/data/package-tree.html create mode 100644 pkg/registry/zookeeper-3.4.6/docs/api/org/apache/zookeeper/data/package-use.html create mode 100644 pkg/registry/zookeeper-3.4.6/docs/api/org/apache/zookeeper/package-frame.html create mode 100644 pkg/registry/zookeeper-3.4.6/docs/api/org/apache/zookeeper/package-summary.html create mode 100644 pkg/registry/zookeeper-3.4.6/docs/api/org/apache/zookeeper/package-tree.html create mode 100644 pkg/registry/zookeeper-3.4.6/docs/api/org/apache/zookeeper/package-use.html create mode 100644 pkg/registry/zookeeper-3.4.6/docs/api/org/apache/zookeeper/server/LogFormatter.html create mode 100644 pkg/registry/zookeeper-3.4.6/docs/api/org/apache/zookeeper/server/PurgeTxnLog.html create mode 100644 pkg/registry/zookeeper-3.4.6/docs/api/org/apache/zookeeper/server/SnapshotFormatter.html create mode 100644 pkg/registry/zookeeper-3.4.6/docs/api/org/apache/zookeeper/server/ZooKeeperServerMain.html create mode 100644 pkg/registry/zookeeper-3.4.6/docs/api/org/apache/zookeeper/server/class-use/LogFormatter.html create mode 100644 pkg/registry/zookeeper-3.4.6/docs/api/org/apache/zookeeper/server/class-use/PurgeTxnLog.html create mode 100644 pkg/registry/zookeeper-3.4.6/docs/api/org/apache/zookeeper/server/class-use/SnapshotFormatter.html create mode 100644 pkg/registry/zookeeper-3.4.6/docs/api/org/apache/zookeeper/server/class-use/ZooKeeperServerMain.html create mode 100644 pkg/registry/zookeeper-3.4.6/docs/api/org/apache/zookeeper/server/package-frame.html create mode 100644 pkg/registry/zookeeper-3.4.6/docs/api/org/apache/zookeeper/server/package-summary.html create mode 100644 pkg/registry/zookeeper-3.4.6/docs/api/org/apache/zookeeper/server/package-tree.html create mode 100644 pkg/registry/zookeeper-3.4.6/docs/api/org/apache/zookeeper/server/package-use.html create mode 100644 pkg/registry/zookeeper-3.4.6/docs/api/org/apache/zookeeper/server/quorum/QuorumPeerMain.html create mode 100644 pkg/registry/zookeeper-3.4.6/docs/api/org/apache/zookeeper/server/quorum/class-use/QuorumPeerMain.html create mode 100644 pkg/registry/zookeeper-3.4.6/docs/api/org/apache/zookeeper/server/quorum/package-frame.html create mode 100644 pkg/registry/zookeeper-3.4.6/docs/api/org/apache/zookeeper/server/quorum/package-summary.html create mode 100644 pkg/registry/zookeeper-3.4.6/docs/api/org/apache/zookeeper/server/quorum/package-tree.html create mode 100644 pkg/registry/zookeeper-3.4.6/docs/api/org/apache/zookeeper/server/quorum/package-use.html create mode 100644 pkg/registry/zookeeper-3.4.6/docs/api/org/apache/zookeeper/server/upgrade/UpgradeMain.html create mode 100644 pkg/registry/zookeeper-3.4.6/docs/api/org/apache/zookeeper/server/upgrade/class-use/UpgradeMain.html create mode 100644 pkg/registry/zookeeper-3.4.6/docs/api/org/apache/zookeeper/server/upgrade/package-frame.html create mode 100644 pkg/registry/zookeeper-3.4.6/docs/api/org/apache/zookeeper/server/upgrade/package-summary.html create mode 100644 pkg/registry/zookeeper-3.4.6/docs/api/org/apache/zookeeper/server/upgrade/package-tree.html create mode 100644 pkg/registry/zookeeper-3.4.6/docs/api/org/apache/zookeeper/server/upgrade/package-use.html create mode 100644 pkg/registry/zookeeper-3.4.6/docs/api/overview-frame.html create mode 100644 pkg/registry/zookeeper-3.4.6/docs/api/overview-summary.html create mode 100644 pkg/registry/zookeeper-3.4.6/docs/api/overview-tree.html create mode 100644 pkg/registry/zookeeper-3.4.6/docs/api/package-list create mode 100644 pkg/registry/zookeeper-3.4.6/docs/api/resources/background.gif create mode 100644 pkg/registry/zookeeper-3.4.6/docs/api/resources/tab.gif create mode 100644 pkg/registry/zookeeper-3.4.6/docs/api/resources/titlebar.gif create mode 100644 pkg/registry/zookeeper-3.4.6/docs/api/resources/titlebar_end.gif create mode 100644 pkg/registry/zookeeper-3.4.6/docs/api/serialized-form.html create mode 100644 pkg/registry/zookeeper-3.4.6/docs/bookkeeperConfig.html create mode 100644 pkg/registry/zookeeper-3.4.6/docs/bookkeeperConfig.pdf create mode 100644 pkg/registry/zookeeper-3.4.6/docs/bookkeeperOverview.html create mode 100644 pkg/registry/zookeeper-3.4.6/docs/bookkeeperOverview.pdf create mode 100644 pkg/registry/zookeeper-3.4.6/docs/bookkeeperProgrammer.html create mode 100644 pkg/registry/zookeeper-3.4.6/docs/bookkeeperProgrammer.pdf create mode 100644 pkg/registry/zookeeper-3.4.6/docs/bookkeeperStarted.html create mode 100644 pkg/registry/zookeeper-3.4.6/docs/bookkeeperStarted.pdf create mode 100644 pkg/registry/zookeeper-3.4.6/docs/bookkeeperStream.html create mode 100644 pkg/registry/zookeeper-3.4.6/docs/bookkeeperStream.pdf create mode 100644 pkg/registry/zookeeper-3.4.6/docs/broken-links.xml create mode 100644 pkg/registry/zookeeper-3.4.6/docs/images/2pc.jpg create mode 100644 pkg/registry/zookeeper-3.4.6/docs/images/bk-overview.jpg create mode 100644 pkg/registry/zookeeper-3.4.6/docs/images/built-with-forrest-button.png create mode 100644 pkg/registry/zookeeper-3.4.6/docs/images/favicon.ico create mode 100644 pkg/registry/zookeeper-3.4.6/docs/images/hadoop-logo.jpg create mode 100644 pkg/registry/zookeeper-3.4.6/docs/images/instruction_arrow.png create mode 100644 pkg/registry/zookeeper-3.4.6/docs/images/state_dia.jpg create mode 100644 pkg/registry/zookeeper-3.4.6/docs/images/zkcomponents.jpg create mode 100644 pkg/registry/zookeeper-3.4.6/docs/images/zknamespace.jpg create mode 100644 pkg/registry/zookeeper-3.4.6/docs/images/zkperfRW-3.2.jpg create mode 100644 pkg/registry/zookeeper-3.4.6/docs/images/zkperfRW.jpg create mode 100644 pkg/registry/zookeeper-3.4.6/docs/images/zkperfreliability.jpg create mode 100644 pkg/registry/zookeeper-3.4.6/docs/images/zkservice.jpg create mode 100644 pkg/registry/zookeeper-3.4.6/docs/images/zookeeper_small.gif create mode 100644 pkg/registry/zookeeper-3.4.6/docs/index.html create mode 100644 pkg/registry/zookeeper-3.4.6/docs/index.pdf create mode 100644 pkg/registry/zookeeper-3.4.6/docs/javaExample.html create mode 100644 pkg/registry/zookeeper-3.4.6/docs/javaExample.pdf create mode 100644 pkg/registry/zookeeper-3.4.6/docs/jdiff/changes.html create mode 100644 pkg/registry/zookeeper-3.4.6/docs/jdiff/changes/alldiffs_index_additions.html create mode 100644 pkg/registry/zookeeper-3.4.6/docs/jdiff/changes/alldiffs_index_all.html create mode 100644 pkg/registry/zookeeper-3.4.6/docs/jdiff/changes/alldiffs_index_changes.html create mode 100644 pkg/registry/zookeeper-3.4.6/docs/jdiff/changes/alldiffs_index_removals.html create mode 100644 pkg/registry/zookeeper-3.4.6/docs/jdiff/changes/changes-summary.html create mode 100644 pkg/registry/zookeeper-3.4.6/docs/jdiff/changes/classes_index_additions.html create mode 100644 pkg/registry/zookeeper-3.4.6/docs/jdiff/changes/classes_index_all.html create mode 100644 pkg/registry/zookeeper-3.4.6/docs/jdiff/changes/classes_index_changes.html create mode 100644 pkg/registry/zookeeper-3.4.6/docs/jdiff/changes/classes_index_removals.html create mode 100644 pkg/registry/zookeeper-3.4.6/docs/jdiff/changes/constructors_index_additions.html create mode 100644 pkg/registry/zookeeper-3.4.6/docs/jdiff/changes/constructors_index_all.html create mode 100644 pkg/registry/zookeeper-3.4.6/docs/jdiff/changes/constructors_index_changes.html create mode 100644 pkg/registry/zookeeper-3.4.6/docs/jdiff/changes/constructors_index_removals.html create mode 100644 pkg/registry/zookeeper-3.4.6/docs/jdiff/changes/fields_index_additions.html create mode 100644 pkg/registry/zookeeper-3.4.6/docs/jdiff/changes/fields_index_all.html create mode 100644 pkg/registry/zookeeper-3.4.6/docs/jdiff/changes/fields_index_changes.html create mode 100644 pkg/registry/zookeeper-3.4.6/docs/jdiff/changes/fields_index_removals.html create mode 100644 pkg/registry/zookeeper-3.4.6/docs/jdiff/changes/jdiff_help.html create mode 100644 pkg/registry/zookeeper-3.4.6/docs/jdiff/changes/jdiff_statistics.html create mode 100644 pkg/registry/zookeeper-3.4.6/docs/jdiff/changes/jdiff_topleftframe.html create mode 100644 pkg/registry/zookeeper-3.4.6/docs/jdiff/changes/methods_index_additions.html create mode 100644 pkg/registry/zookeeper-3.4.6/docs/jdiff/changes/methods_index_all.html create mode 100644 pkg/registry/zookeeper-3.4.6/docs/jdiff/changes/methods_index_changes.html create mode 100644 pkg/registry/zookeeper-3.4.6/docs/jdiff/changes/methods_index_removals.html create mode 100644 pkg/registry/zookeeper-3.4.6/docs/jdiff/changes/org.apache.zookeeper.ClientCnxn.html create mode 100644 pkg/registry/zookeeper-3.4.6/docs/jdiff/changes/org.apache.zookeeper.Environment.html create mode 100644 pkg/registry/zookeeper-3.4.6/docs/jdiff/changes/org.apache.zookeeper.KeeperException.BadArgumentsException.html create mode 100644 pkg/registry/zookeeper-3.4.6/docs/jdiff/changes/org.apache.zookeeper.KeeperException.BadVersionException.html create mode 100644 pkg/registry/zookeeper-3.4.6/docs/jdiff/changes/org.apache.zookeeper.KeeperException.Code.html create mode 100644 pkg/registry/zookeeper-3.4.6/docs/jdiff/changes/org.apache.zookeeper.KeeperException.InvalidACLException.html create mode 100644 pkg/registry/zookeeper-3.4.6/docs/jdiff/changes/org.apache.zookeeper.KeeperException.NoChildrenForEphemeralsException.html create mode 100644 pkg/registry/zookeeper-3.4.6/docs/jdiff/changes/org.apache.zookeeper.KeeperException.NoNodeException.html create mode 100644 pkg/registry/zookeeper-3.4.6/docs/jdiff/changes/org.apache.zookeeper.KeeperException.NodeExistsException.html create mode 100644 pkg/registry/zookeeper-3.4.6/docs/jdiff/changes/org.apache.zookeeper.KeeperException.NotEmptyException.html create mode 100644 pkg/registry/zookeeper-3.4.6/docs/jdiff/changes/org.apache.zookeeper.KeeperException.html create mode 100644 pkg/registry/zookeeper-3.4.6/docs/jdiff/changes/org.apache.zookeeper.Watcher.Event.KeeperState.html create mode 100644 pkg/registry/zookeeper-3.4.6/docs/jdiff/changes/org.apache.zookeeper.ZooDefs.OpCode.html create mode 100644 pkg/registry/zookeeper-3.4.6/docs/jdiff/changes/org.apache.zookeeper.ZooKeeper.States.html create mode 100644 pkg/registry/zookeeper-3.4.6/docs/jdiff/changes/org.apache.zookeeper.ZooKeeper.html create mode 100644 pkg/registry/zookeeper-3.4.6/docs/jdiff/changes/org.apache.zookeeper.ZooKeeperMain.html create mode 100644 pkg/registry/zookeeper-3.4.6/docs/jdiff/changes/packages_index_additions.html create mode 100644 pkg/registry/zookeeper-3.4.6/docs/jdiff/changes/packages_index_all.html create mode 100644 pkg/registry/zookeeper-3.4.6/docs/jdiff/changes/packages_index_changes.html create mode 100644 pkg/registry/zookeeper-3.4.6/docs/jdiff/changes/packages_index_removals.html create mode 100644 pkg/registry/zookeeper-3.4.6/docs/jdiff/changes/pkg_org.apache.zookeeper.html create mode 100644 pkg/registry/zookeeper-3.4.6/docs/jdiff/missingSinces.txt create mode 100644 pkg/registry/zookeeper-3.4.6/docs/jdiff/user_comments_for_zookeeper_3.1.1_to_zookeeper_3.4.6.xml create mode 100644 pkg/registry/zookeeper-3.4.6/docs/linkmap.html create mode 100644 pkg/registry/zookeeper-3.4.6/docs/linkmap.pdf create mode 100644 pkg/registry/zookeeper-3.4.6/docs/recipes.html create mode 100644 pkg/registry/zookeeper-3.4.6/docs/recipes.pdf create mode 100644 pkg/registry/zookeeper-3.4.6/docs/releasenotes.html create mode 100644 pkg/registry/zookeeper-3.4.6/docs/releasenotes.pdf create mode 100644 pkg/registry/zookeeper-3.4.6/docs/skin/CommonMessages_de.xml create mode 100644 pkg/registry/zookeeper-3.4.6/docs/skin/CommonMessages_en_US.xml create mode 100644 pkg/registry/zookeeper-3.4.6/docs/skin/CommonMessages_es.xml create mode 100644 pkg/registry/zookeeper-3.4.6/docs/skin/CommonMessages_fr.xml create mode 100644 pkg/registry/zookeeper-3.4.6/docs/skin/images/README.txt create mode 100644 pkg/registry/zookeeper-3.4.6/docs/skin/images/add.jpg create mode 100644 pkg/registry/zookeeper-3.4.6/docs/skin/images/apache-thanks.png create mode 100644 pkg/registry/zookeeper-3.4.6/docs/skin/images/built-with-cocoon.gif create mode 100644 pkg/registry/zookeeper-3.4.6/docs/skin/images/built-with-forrest-button.png create mode 100644 pkg/registry/zookeeper-3.4.6/docs/skin/images/chapter.gif create mode 100644 pkg/registry/zookeeper-3.4.6/docs/skin/images/chapter_open.gif create mode 100644 pkg/registry/zookeeper-3.4.6/docs/skin/images/current.gif create mode 100644 pkg/registry/zookeeper-3.4.6/docs/skin/images/error.png create mode 100644 pkg/registry/zookeeper-3.4.6/docs/skin/images/external-link.gif create mode 100644 pkg/registry/zookeeper-3.4.6/docs/skin/images/fix.jpg create mode 100644 pkg/registry/zookeeper-3.4.6/docs/skin/images/forrest-credit-logo.png create mode 100644 pkg/registry/zookeeper-3.4.6/docs/skin/images/hack.jpg create mode 100644 pkg/registry/zookeeper-3.4.6/docs/skin/images/header_white_line.gif create mode 100644 pkg/registry/zookeeper-3.4.6/docs/skin/images/info.png create mode 100644 pkg/registry/zookeeper-3.4.6/docs/skin/images/instruction_arrow.png create mode 100644 pkg/registry/zookeeper-3.4.6/docs/skin/images/label.gif create mode 100644 pkg/registry/zookeeper-3.4.6/docs/skin/images/page.gif create mode 100644 pkg/registry/zookeeper-3.4.6/docs/skin/images/pdfdoc.gif create mode 100644 pkg/registry/zookeeper-3.4.6/docs/skin/images/poddoc.png create mode 100644 pkg/registry/zookeeper-3.4.6/docs/skin/images/printer.gif create mode 100644 pkg/registry/zookeeper-3.4.6/docs/skin/images/rc-b-l-15-1body-2menu-3menu.png create mode 100644 pkg/registry/zookeeper-3.4.6/docs/skin/images/rc-b-r-15-1body-2menu-3menu.png create mode 100644 pkg/registry/zookeeper-3.4.6/docs/skin/images/rc-b-r-5-1header-2tab-selected-3tab-selected.png create mode 100644 pkg/registry/zookeeper-3.4.6/docs/skin/images/rc-t-l-5-1header-2searchbox-3searchbox.png create mode 100644 pkg/registry/zookeeper-3.4.6/docs/skin/images/rc-t-l-5-1header-2tab-selected-3tab-selected.png create mode 100644 pkg/registry/zookeeper-3.4.6/docs/skin/images/rc-t-l-5-1header-2tab-unselected-3tab-unselected.png create mode 100644 pkg/registry/zookeeper-3.4.6/docs/skin/images/rc-t-r-15-1body-2menu-3menu.png create mode 100644 pkg/registry/zookeeper-3.4.6/docs/skin/images/rc-t-r-5-1header-2searchbox-3searchbox.png create mode 100644 pkg/registry/zookeeper-3.4.6/docs/skin/images/rc-t-r-5-1header-2tab-selected-3tab-selected.png create mode 100644 pkg/registry/zookeeper-3.4.6/docs/skin/images/rc-t-r-5-1header-2tab-unselected-3tab-unselected.png create mode 100644 pkg/registry/zookeeper-3.4.6/docs/skin/images/remove.jpg create mode 100644 pkg/registry/zookeeper-3.4.6/docs/skin/images/rss.png create mode 100644 pkg/registry/zookeeper-3.4.6/docs/skin/images/spacer.gif create mode 100644 pkg/registry/zookeeper-3.4.6/docs/skin/images/success.png create mode 100644 pkg/registry/zookeeper-3.4.6/docs/skin/images/txtdoc.png create mode 100644 pkg/registry/zookeeper-3.4.6/docs/skin/images/update.jpg create mode 100644 pkg/registry/zookeeper-3.4.6/docs/skin/images/valid-html401.png create mode 100644 pkg/registry/zookeeper-3.4.6/docs/skin/images/vcss.png create mode 100644 pkg/registry/zookeeper-3.4.6/docs/skin/images/warning.png create mode 100644 pkg/registry/zookeeper-3.4.6/docs/skin/images/xmldoc.gif create mode 100644 pkg/registry/zookeeper-3.4.6/docs/skin/note.txt create mode 100644 pkg/registry/zookeeper-3.4.6/docs/zookeeperAdmin.html create mode 100644 pkg/registry/zookeeper-3.4.6/docs/zookeeperAdmin.pdf create mode 100644 pkg/registry/zookeeper-3.4.6/docs/zookeeperHierarchicalQuorums.html create mode 100644 pkg/registry/zookeeper-3.4.6/docs/zookeeperHierarchicalQuorums.pdf create mode 100644 pkg/registry/zookeeper-3.4.6/docs/zookeeperInternals.html create mode 100644 pkg/registry/zookeeper-3.4.6/docs/zookeeperInternals.pdf create mode 100644 pkg/registry/zookeeper-3.4.6/docs/zookeeperJMX.html create mode 100644 pkg/registry/zookeeper-3.4.6/docs/zookeeperJMX.pdf create mode 100644 pkg/registry/zookeeper-3.4.6/docs/zookeeperObservers.html create mode 100644 pkg/registry/zookeeper-3.4.6/docs/zookeeperObservers.pdf create mode 100644 pkg/registry/zookeeper-3.4.6/docs/zookeeperOtherInfo.html create mode 100644 pkg/registry/zookeeper-3.4.6/docs/zookeeperOtherInfo.pdf create mode 100644 pkg/registry/zookeeper-3.4.6/docs/zookeeperOver.html create mode 100644 pkg/registry/zookeeper-3.4.6/docs/zookeeperOver.pdf create mode 100644 pkg/registry/zookeeper-3.4.6/docs/zookeeperProgrammers.html create mode 100644 pkg/registry/zookeeper-3.4.6/docs/zookeeperProgrammers.pdf create mode 100644 pkg/registry/zookeeper-3.4.6/docs/zookeeperQuotas.html create mode 100644 pkg/registry/zookeeper-3.4.6/docs/zookeeperQuotas.pdf create mode 100644 pkg/registry/zookeeper-3.4.6/docs/zookeeperStarted.html create mode 100644 pkg/registry/zookeeper-3.4.6/docs/zookeeperStarted.pdf create mode 100644 pkg/registry/zookeeper-3.4.6/docs/zookeeperTutorial.html create mode 100644 pkg/registry/zookeeper-3.4.6/docs/zookeeperTutorial.pdf create mode 100644 pkg/registry/zookeeper-3.4.6/ivy.xml create mode 100644 pkg/registry/zookeeper-3.4.6/ivysettings.xml create mode 100644 pkg/registry/zookeeper-3.4.6/lib/cobertura/README.txt create mode 100644 pkg/registry/zookeeper-3.4.6/lib/jdiff/zookeeper_3.1.1.xml create mode 100644 pkg/registry/zookeeper-3.4.6/lib/jdiff/zookeeper_3.4.6-SNAPSHOT.xml create mode 100644 pkg/registry/zookeeper-3.4.6/lib/jdiff/zookeeper_3.4.6.xml create mode 100644 pkg/registry/zookeeper-3.4.6/lib/jline-0.9.94.LICENSE.txt create mode 100644 pkg/registry/zookeeper-3.4.6/lib/jline-0.9.94.jar create mode 100644 pkg/registry/zookeeper-3.4.6/lib/log4j-1.2.16.LICENSE.txt create mode 100644 pkg/registry/zookeeper-3.4.6/lib/log4j-1.2.16.jar create mode 100644 pkg/registry/zookeeper-3.4.6/lib/netty-3.7.0.Final.jar.REMOVED.git-id create mode 100644 pkg/registry/zookeeper-3.4.6/lib/slf4j-api-1.6.1.jar create mode 100644 pkg/registry/zookeeper-3.4.6/lib/slf4j-log4j12-1.6.1.jar create mode 100644 pkg/registry/zookeeper-3.4.6/recipes/election/build.xml create mode 100644 pkg/registry/zookeeper-3.4.6/recipes/election/src/java/org/apache/zookeeper/recipes/leader/LeaderElectionAware.java create mode 100644 pkg/registry/zookeeper-3.4.6/recipes/election/src/java/org/apache/zookeeper/recipes/leader/LeaderElectionSupport.java create mode 100644 pkg/registry/zookeeper-3.4.6/recipes/election/src/java/org/apache/zookeeper/recipes/leader/LeaderOffer.java create mode 100644 pkg/registry/zookeeper-3.4.6/recipes/lock/build.xml create mode 100644 pkg/registry/zookeeper-3.4.6/recipes/lock/src/c/INSTALL create mode 100644 pkg/registry/zookeeper-3.4.6/recipes/lock/src/c/LICENSE create mode 100644 pkg/registry/zookeeper-3.4.6/recipes/lock/src/c/Makefile.am create mode 100644 pkg/registry/zookeeper-3.4.6/recipes/lock/src/c/README.txt create mode 100644 pkg/registry/zookeeper-3.4.6/recipes/lock/src/c/acinclude.m4 create mode 100644 pkg/registry/zookeeper-3.4.6/recipes/lock/src/c/aminclude.am create mode 100644 pkg/registry/zookeeper-3.4.6/recipes/lock/src/c/c-doc.Doxyfile create mode 100644 pkg/registry/zookeeper-3.4.6/recipes/lock/src/c/configure.ac create mode 100644 pkg/registry/zookeeper-3.4.6/recipes/lock/src/c/include/zoo_lock.h create mode 100644 pkg/registry/zookeeper-3.4.6/recipes/lock/src/c/src/zoo_lock.c create mode 100644 pkg/registry/zookeeper-3.4.6/recipes/lock/src/c/tests/TestClient.cc create mode 100644 pkg/registry/zookeeper-3.4.6/recipes/lock/src/c/tests/TestDriver.cc create mode 100644 pkg/registry/zookeeper-3.4.6/recipes/lock/src/c/tests/Util.cc create mode 100644 pkg/registry/zookeeper-3.4.6/recipes/lock/src/c/tests/Util.h create mode 100755 pkg/registry/zookeeper-3.4.6/recipes/lock/src/c/tests/zkServer.sh create mode 100644 pkg/registry/zookeeper-3.4.6/recipes/lock/src/java/org/apache/zookeeper/recipes/lock/LockListener.java create mode 100644 pkg/registry/zookeeper-3.4.6/recipes/lock/src/java/org/apache/zookeeper/recipes/lock/ProtocolSupport.java create mode 100644 pkg/registry/zookeeper-3.4.6/recipes/lock/src/java/org/apache/zookeeper/recipes/lock/WriteLock.java create mode 100644 pkg/registry/zookeeper-3.4.6/recipes/lock/src/java/org/apache/zookeeper/recipes/lock/ZNodeName.java create mode 100644 pkg/registry/zookeeper-3.4.6/recipes/lock/src/java/org/apache/zookeeper/recipes/lock/ZooKeeperOperation.java create mode 100644 pkg/registry/zookeeper-3.4.6/recipes/queue/build.xml create mode 100644 pkg/registry/zookeeper-3.4.6/recipes/queue/src/c/INSTALL create mode 100644 pkg/registry/zookeeper-3.4.6/recipes/queue/src/c/LICENSE create mode 100644 pkg/registry/zookeeper-3.4.6/recipes/queue/src/c/Makefile.am create mode 100644 pkg/registry/zookeeper-3.4.6/recipes/queue/src/c/README.txt create mode 100644 pkg/registry/zookeeper-3.4.6/recipes/queue/src/c/acinclude.m4 create mode 100644 pkg/registry/zookeeper-3.4.6/recipes/queue/src/c/aminclude.am create mode 100644 pkg/registry/zookeeper-3.4.6/recipes/queue/src/c/c-doc.Doxyfile create mode 100644 pkg/registry/zookeeper-3.4.6/recipes/queue/src/c/configure.ac create mode 100644 pkg/registry/zookeeper-3.4.6/recipes/queue/src/c/include/zoo_queue.h create mode 100644 pkg/registry/zookeeper-3.4.6/recipes/queue/src/c/src/zoo_queue.c create mode 100644 pkg/registry/zookeeper-3.4.6/recipes/queue/src/c/tests/TestClient.cc create mode 100644 pkg/registry/zookeeper-3.4.6/recipes/queue/src/c/tests/TestDriver.cc create mode 100644 pkg/registry/zookeeper-3.4.6/recipes/queue/src/c/tests/Util.cc create mode 100644 pkg/registry/zookeeper-3.4.6/recipes/queue/src/c/tests/Util.h create mode 100755 pkg/registry/zookeeper-3.4.6/recipes/queue/src/c/tests/zkServer.sh create mode 100644 pkg/registry/zookeeper-3.4.6/recipes/queue/src/java/org/apache/zookeeper/recipes/queue/DistributedQueue.java create mode 100644 pkg/registry/zookeeper-3.4.6/src/c/ChangeLog create mode 100644 pkg/registry/zookeeper-3.4.6/src/c/Cli.vcproj create mode 100644 pkg/registry/zookeeper-3.4.6/src/c/INSTALL create mode 100644 pkg/registry/zookeeper-3.4.6/src/c/LICENSE create mode 100644 pkg/registry/zookeeper-3.4.6/src/c/Makefile.am create mode 100644 pkg/registry/zookeeper-3.4.6/src/c/Makefile.in create mode 100644 pkg/registry/zookeeper-3.4.6/src/c/NOTICE.txt create mode 100644 pkg/registry/zookeeper-3.4.6/src/c/README create mode 100644 pkg/registry/zookeeper-3.4.6/src/c/acinclude.m4 create mode 100644 pkg/registry/zookeeper-3.4.6/src/c/aclocal.m4 create mode 100644 pkg/registry/zookeeper-3.4.6/src/c/aminclude.am create mode 100644 pkg/registry/zookeeper-3.4.6/src/c/autom4te.cache/output.0 create mode 100644 pkg/registry/zookeeper-3.4.6/src/c/autom4te.cache/output.1 create mode 100644 pkg/registry/zookeeper-3.4.6/src/c/autom4te.cache/output.2 create mode 100644 pkg/registry/zookeeper-3.4.6/src/c/autom4te.cache/output.3 create mode 100644 pkg/registry/zookeeper-3.4.6/src/c/autom4te.cache/requests create mode 100644 pkg/registry/zookeeper-3.4.6/src/c/autom4te.cache/traces.0 create mode 100644 pkg/registry/zookeeper-3.4.6/src/c/autom4te.cache/traces.1 create mode 100644 pkg/registry/zookeeper-3.4.6/src/c/autom4te.cache/traces.2 create mode 100644 pkg/registry/zookeeper-3.4.6/src/c/autom4te.cache/traces.3 create mode 100644 pkg/registry/zookeeper-3.4.6/src/c/c-doc.Doxyfile create mode 100755 pkg/registry/zookeeper-3.4.6/src/c/compile create mode 100755 pkg/registry/zookeeper-3.4.6/src/c/config.guess create mode 100644 pkg/registry/zookeeper-3.4.6/src/c/config.h.in create mode 100755 pkg/registry/zookeeper-3.4.6/src/c/config.sub create mode 100755 pkg/registry/zookeeper-3.4.6/src/c/configure create mode 100644 pkg/registry/zookeeper-3.4.6/src/c/configure.ac create mode 100755 pkg/registry/zookeeper-3.4.6/src/c/depcomp create mode 100644 pkg/registry/zookeeper-3.4.6/src/c/generated/zookeeper.jute.c create mode 100644 pkg/registry/zookeeper-3.4.6/src/c/generated/zookeeper.jute.h create mode 100644 pkg/registry/zookeeper-3.4.6/src/c/include/proto.h create mode 100644 pkg/registry/zookeeper-3.4.6/src/c/include/recordio.h create mode 100644 pkg/registry/zookeeper-3.4.6/src/c/include/winconfig.h create mode 100644 pkg/registry/zookeeper-3.4.6/src/c/include/winstdint.h create mode 100644 pkg/registry/zookeeper-3.4.6/src/c/include/zookeeper.h create mode 100644 pkg/registry/zookeeper-3.4.6/src/c/include/zookeeper_log.h create mode 100644 pkg/registry/zookeeper-3.4.6/src/c/include/zookeeper_version.h create mode 100755 pkg/registry/zookeeper-3.4.6/src/c/install-sh create mode 100755 pkg/registry/zookeeper-3.4.6/src/c/ltmain.sh create mode 100755 pkg/registry/zookeeper-3.4.6/src/c/missing create mode 100644 pkg/registry/zookeeper-3.4.6/src/c/src/cli.c create mode 100644 pkg/registry/zookeeper-3.4.6/src/c/src/hashtable/LICENSE.txt create mode 100644 pkg/registry/zookeeper-3.4.6/src/c/src/hashtable/hashtable.c create mode 100644 pkg/registry/zookeeper-3.4.6/src/c/src/hashtable/hashtable.h create mode 100644 pkg/registry/zookeeper-3.4.6/src/c/src/hashtable/hashtable_itr.c create mode 100644 pkg/registry/zookeeper-3.4.6/src/c/src/hashtable/hashtable_itr.h create mode 100644 pkg/registry/zookeeper-3.4.6/src/c/src/hashtable/hashtable_private.h create mode 100644 pkg/registry/zookeeper-3.4.6/src/c/src/load_gen.c create mode 100644 pkg/registry/zookeeper-3.4.6/src/c/src/mt_adaptor.c create mode 100644 pkg/registry/zookeeper-3.4.6/src/c/src/recordio.c create mode 100644 pkg/registry/zookeeper-3.4.6/src/c/src/st_adaptor.c create mode 100644 pkg/registry/zookeeper-3.4.6/src/c/src/winport.c create mode 100644 pkg/registry/zookeeper-3.4.6/src/c/src/winport.h create mode 100644 pkg/registry/zookeeper-3.4.6/src/c/src/zk_adaptor.h create mode 100644 pkg/registry/zookeeper-3.4.6/src/c/src/zk_hashtable.c create mode 100644 pkg/registry/zookeeper-3.4.6/src/c/src/zk_hashtable.h create mode 100644 pkg/registry/zookeeper-3.4.6/src/c/src/zk_log.c create mode 100644 pkg/registry/zookeeper-3.4.6/src/c/src/zookeeper.c create mode 100644 pkg/registry/zookeeper-3.4.6/src/c/tests/CollectionUtil.h create mode 100644 pkg/registry/zookeeper-3.4.6/src/c/tests/CppAssertHelper.h create mode 100644 pkg/registry/zookeeper-3.4.6/src/c/tests/LibCMocks.cc create mode 100644 pkg/registry/zookeeper-3.4.6/src/c/tests/LibCMocks.h create mode 100644 pkg/registry/zookeeper-3.4.6/src/c/tests/LibCSymTable.cc create mode 100644 pkg/registry/zookeeper-3.4.6/src/c/tests/LibCSymTable.h create mode 100644 pkg/registry/zookeeper-3.4.6/src/c/tests/MocksBase.cc create mode 100644 pkg/registry/zookeeper-3.4.6/src/c/tests/MocksBase.h create mode 100644 pkg/registry/zookeeper-3.4.6/src/c/tests/PthreadMocks.cc create mode 100644 pkg/registry/zookeeper-3.4.6/src/c/tests/PthreadMocks.h create mode 100644 pkg/registry/zookeeper-3.4.6/src/c/tests/TestClient.cc create mode 100644 pkg/registry/zookeeper-3.4.6/src/c/tests/TestClientRetry.cc create mode 100644 pkg/registry/zookeeper-3.4.6/src/c/tests/TestDriver.cc create mode 100644 pkg/registry/zookeeper-3.4.6/src/c/tests/TestMulti.cc create mode 100644 pkg/registry/zookeeper-3.4.6/src/c/tests/TestOperations.cc create mode 100644 pkg/registry/zookeeper-3.4.6/src/c/tests/TestWatchers.cc create mode 100644 pkg/registry/zookeeper-3.4.6/src/c/tests/TestZookeeperClose.cc create mode 100644 pkg/registry/zookeeper-3.4.6/src/c/tests/TestZookeeperInit.cc create mode 100644 pkg/registry/zookeeper-3.4.6/src/c/tests/ThreadingUtil.cc create mode 100644 pkg/registry/zookeeper-3.4.6/src/c/tests/ThreadingUtil.h create mode 100644 pkg/registry/zookeeper-3.4.6/src/c/tests/Util.cc create mode 100644 pkg/registry/zookeeper-3.4.6/src/c/tests/Util.h create mode 100644 pkg/registry/zookeeper-3.4.6/src/c/tests/Vector.h create mode 100644 pkg/registry/zookeeper-3.4.6/src/c/tests/ZKMocks.cc create mode 100644 pkg/registry/zookeeper-3.4.6/src/c/tests/ZKMocks.h create mode 100644 pkg/registry/zookeeper-3.4.6/src/c/tests/wrappers-mt.opt create mode 100644 pkg/registry/zookeeper-3.4.6/src/c/tests/wrappers.opt create mode 100755 pkg/registry/zookeeper-3.4.6/src/c/tests/zkServer.sh create mode 100644 pkg/registry/zookeeper-3.4.6/src/c/zookeeper.sln create mode 100644 pkg/registry/zookeeper-3.4.6/src/c/zookeeper.vcproj create mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/build-contrib.xml create mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/build.xml create mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/fatjar/README.txt create mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/fatjar/build.xml create mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/fatjar/conf/mainClasses create mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/fatjar/src/java/org/apache/zookeeper/util/FatJarMain.java create mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/huebrowser/README create mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/huebrowser/zkui/Makefile create mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/huebrowser/zkui/setup.py create mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/huebrowser/zkui/src/zkui/__init__.py create mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/huebrowser/zkui/src/zkui/forms.py create mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/huebrowser/zkui/src/zkui/models.py create mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/huebrowser/zkui/src/zkui/rest.py create mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/huebrowser/zkui/src/zkui/settings.py create mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/huebrowser/zkui/src/zkui/static/art/line_icons.png create mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/huebrowser/zkui/src/zkui/static/art/zkui.png create mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/huebrowser/zkui/src/zkui/static/help/index.html create mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/huebrowser/zkui/src/zkui/static/js/package.yml create mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/huebrowser/zkui/src/zkui/stats.py create mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/huebrowser/zkui/src/zkui/templates/clients.mako create mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/huebrowser/zkui/src/zkui/templates/create.mako create mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/huebrowser/zkui/src/zkui/templates/edit.mako create mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/huebrowser/zkui/src/zkui/templates/index.mako create mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/huebrowser/zkui/src/zkui/templates/shared_components.mako create mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/huebrowser/zkui/src/zkui/templates/tree.mako create mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/huebrowser/zkui/src/zkui/templates/view.mako create mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/huebrowser/zkui/src/zkui/urls.py create mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/huebrowser/zkui/src/zkui/utils.py create mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/huebrowser/zkui/src/zkui/views.py create mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/huebrowser/zkui/src/zkui/windmilltests.py create mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/loggraph/README.txt create mode 100755 pkg/registry/zookeeper-3.4.6/src/contrib/loggraph/bin/loggraph-dev.sh create mode 100755 pkg/registry/zookeeper-3.4.6/src/contrib/loggraph/bin/loggraph.sh create mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/loggraph/build.xml create mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/loggraph/ivy.xml create mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/loggraph/src/java/org/apache/zookeeper/graph/FilterException.java create mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/loggraph/src/java/org/apache/zookeeper/graph/FilterOp.java create mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/loggraph/src/java/org/apache/zookeeper/graph/FilterParser.java create mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/loggraph/src/java/org/apache/zookeeper/graph/JsonGenerator.java create mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/loggraph/src/java/org/apache/zookeeper/graph/Log4JEntry.java create mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/loggraph/src/java/org/apache/zookeeper/graph/Log4JSource.java create mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/loggraph/src/java/org/apache/zookeeper/graph/LogEntry.java create mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/loggraph/src/java/org/apache/zookeeper/graph/LogIterator.java create mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/loggraph/src/java/org/apache/zookeeper/graph/LogServer.java create mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/loggraph/src/java/org/apache/zookeeper/graph/LogSkipList.java create mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/loggraph/src/java/org/apache/zookeeper/graph/LogSource.java create mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/loggraph/src/java/org/apache/zookeeper/graph/MeasureThroughput.java create mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/loggraph/src/java/org/apache/zookeeper/graph/MergedLogSource.java create mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/loggraph/src/java/org/apache/zookeeper/graph/RandomAccessFileReader.java create mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/loggraph/src/java/org/apache/zookeeper/graph/TransactionEntry.java create mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/loggraph/src/java/org/apache/zookeeper/graph/TxnLogSource.java create mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/loggraph/src/java/org/apache/zookeeper/graph/filterops/AndOp.java create mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/loggraph/src/java/org/apache/zookeeper/graph/filterops/Arg.java create mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/loggraph/src/java/org/apache/zookeeper/graph/filterops/EqualsOp.java create mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/loggraph/src/java/org/apache/zookeeper/graph/filterops/GreaterThanOp.java create mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/loggraph/src/java/org/apache/zookeeper/graph/filterops/LessThanOp.java create mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/loggraph/src/java/org/apache/zookeeper/graph/filterops/NotOp.java create mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/loggraph/src/java/org/apache/zookeeper/graph/filterops/NumberArg.java create mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/loggraph/src/java/org/apache/zookeeper/graph/filterops/OrOp.java create mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/loggraph/src/java/org/apache/zookeeper/graph/filterops/StringArg.java create mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/loggraph/src/java/org/apache/zookeeper/graph/filterops/SymbolArg.java create mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/loggraph/src/java/org/apache/zookeeper/graph/filterops/XorOp.java create mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/loggraph/src/java/org/apache/zookeeper/graph/servlets/FileLoader.java create mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/loggraph/src/java/org/apache/zookeeper/graph/servlets/Fs.java create mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/loggraph/src/java/org/apache/zookeeper/graph/servlets/GraphData.java create mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/loggraph/src/java/org/apache/zookeeper/graph/servlets/JsonServlet.java create mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/loggraph/src/java/org/apache/zookeeper/graph/servlets/NumEvents.java create mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/loggraph/src/java/org/apache/zookeeper/graph/servlets/StaticContent.java create mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/loggraph/src/java/org/apache/zookeeper/graph/servlets/Throughput.java create mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/loggraph/web/org/apache/zookeeper/graph/log4j.properties create mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/loggraph/web/org/apache/zookeeper/graph/resources/load-big.gif create mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/loggraph/web/org/apache/zookeeper/graph/resources/load.gif create mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/loggraph/web/org/apache/zookeeper/graph/resources/main.html create mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/monitoring/JMX-RESOURCES create mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/monitoring/README create mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/monitoring/cacti/README create mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/monitoring/check_zookeeper.py create mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/monitoring/ganglia/README create mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/monitoring/ganglia/Screenshot.png create mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/monitoring/ganglia/modpython.conf create mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/monitoring/ganglia/zookeeper.pyconf create mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/monitoring/ganglia/zookeeper_ganglia.py create mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/monitoring/nagios/README.txt create mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/monitoring/nagios/Screenshot-1.png create mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/monitoring/nagios/Screenshot.png create mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/monitoring/nagios/hostgroups.cfg create mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/monitoring/nagios/services.cfg create mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/monitoring/nagios/zookeeper.cfg create mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/monitoring/test.py create mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/rest/NOTICE.txt create mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/rest/README.txt create mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/rest/SPEC.txt create mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/rest/build.xml create mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/rest/conf/keys/README create mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/rest/conf/keys/rest.cer create mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/rest/conf/keys/rest.jks create mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/rest/conf/log4j.properties create mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/rest/conf/rest.properties create mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/rest/ivy.xml create mode 100755 pkg/registry/zookeeper-3.4.6/src/contrib/rest/rest.sh create mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/rest/src/java/org/apache/zookeeper/server/jersey/RestMain.java create mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/rest/src/java/org/apache/zookeeper/server/jersey/ZooKeeperService.java create mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/rest/src/java/org/apache/zookeeper/server/jersey/cfg/Credentials.java create mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/rest/src/java/org/apache/zookeeper/server/jersey/cfg/Endpoint.java create mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/rest/src/java/org/apache/zookeeper/server/jersey/cfg/HostPort.java create mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/rest/src/java/org/apache/zookeeper/server/jersey/cfg/HostPortSet.java create mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/rest/src/java/org/apache/zookeeper/server/jersey/cfg/RestCfg.java create mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/rest/src/java/org/apache/zookeeper/server/jersey/filters/HTTPBasicAuth.java create mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/rest/src/java/org/apache/zookeeper/server/jersey/jaxb/ZChildren.java create mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/rest/src/java/org/apache/zookeeper/server/jersey/jaxb/ZChildrenJSON.java create mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/rest/src/java/org/apache/zookeeper/server/jersey/jaxb/ZError.java create mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/rest/src/java/org/apache/zookeeper/server/jersey/jaxb/ZPath.java create mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/rest/src/java/org/apache/zookeeper/server/jersey/jaxb/ZSession.java create mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/rest/src/java/org/apache/zookeeper/server/jersey/jaxb/ZStat.java create mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/rest/src/java/org/apache/zookeeper/server/jersey/resources/JAXBContextResolver.java create mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/rest/src/java/org/apache/zookeeper/server/jersey/resources/KeeperExceptionMapper.java create mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/rest/src/java/org/apache/zookeeper/server/jersey/resources/RuntimeExceptionMapper.java create mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/rest/src/java/org/apache/zookeeper/server/jersey/resources/SessionsResource.java create mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/rest/src/java/org/apache/zookeeper/server/jersey/resources/ZErrorWriter.java create mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/rest/src/java/org/apache/zookeeper/server/jersey/resources/ZNodeResource.java create mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/rest/src/python/README.txt create mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/rest/src/python/demo_master_election.py create mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/rest/src/python/demo_queue.py create mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/rest/src/python/test.py create mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/rest/src/python/zk_dump_tree.py create mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/rest/src/python/zkrest.py create mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/zkfuse/Makefile.am create mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/zkfuse/README.txt create mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/zkfuse/build.xml create mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/zkfuse/configure.ac create mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/zkfuse/src/Makefile.am create mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/zkfuse/src/blockingqueue.h create mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/zkfuse/src/doxygen.cfg create mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/zkfuse/src/event.cc create mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/zkfuse/src/event.h create mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/zkfuse/src/log.cc create mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/zkfuse/src/log.h create mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/zkfuse/src/log4cxx.properties create mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/zkfuse/src/mutex.h create mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/zkfuse/src/thread.cc create mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/zkfuse/src/thread.h create mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/zkfuse/src/zkadapter.cc create mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/zkfuse/src/zkadapter.h create mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/zkfuse/src/zkfuse.cc create mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/zkperl/Changes create mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/zkperl/LICENSE create mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/zkperl/MANIFEST create mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/zkperl/Makefile.PL create mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/zkperl/NOTICE create mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/zkperl/README create mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/zkperl/ZooKeeper.pm create mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/zkperl/ZooKeeper.xs create mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/zkperl/build.xml create mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/zkperl/build/check_zk_version.c create mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/zkperl/build/check_zk_version.h create mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/zkperl/t/10_invalid.t create mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/zkperl/t/15_thread.t create mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/zkperl/t/20_tie.t create mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/zkperl/t/22_stat_tie.t create mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/zkperl/t/24_watch_tie.t create mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/zkperl/t/30_connect.t create mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/zkperl/t/35_log.t create mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/zkperl/t/40_basic.t create mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/zkperl/t/45_class.t create mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/zkperl/t/50_access.t create mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/zkperl/t/60_watch.t create mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/zkperl/t/util.pl create mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/zkperl/typemap create mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/zkpython/README create mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/zkpython/build.xml create mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/zkpython/ivy.xml create mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/zkpython/src/c/pyzk_docstrings.h create mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/zkpython/src/c/zookeeper.c create mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/zkpython/src/examples/README create mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/zkpython/src/examples/watch_znode_for_changes.py create mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/zkpython/src/packages/deb/zkpython.control/control create mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/zkpython/src/packages/rpm/spec/zkpython.spec create mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/zkpython/src/python/setup.py create mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/zkpython/src/python/zk.py create mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/zktreeutil/Makefile.am create mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/zktreeutil/README.txt create mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/zktreeutil/build.xml create mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/zktreeutil/configure.ac create mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/zktreeutil/src/Makefile.am create mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/zktreeutil/src/SimpleTree.h create mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/zktreeutil/src/ZkAdaptor.cc create mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/zktreeutil/src/ZkAdaptor.h create mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/zktreeutil/src/ZkTreeUtil.cc create mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/zktreeutil/src/ZkTreeUtil.h create mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/zktreeutil/src/ZkTreeUtilMain.cc create mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/zktreeutil/tests/zk_sample.xml create mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/zooinspector/NOTICE.txt create mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/zooinspector/README.txt create mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/zooinspector/build.xml create mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/zooinspector/config/defaultConnectionSettings.cfg create mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/zooinspector/config/defaultNodeVeiwers.cfg create mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/zooinspector/icons/edtsrclkup_co.gif create mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/zooinspector/icons/file_obj.gif create mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/zooinspector/icons/fldr_obj.gif create mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/zooinspector/icons/info_obj.gif create mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/zooinspector/icons/jspdecl.gif create mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/zooinspector/icons/launch_run.gif create mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/zooinspector/icons/launch_stop.gif create mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/zooinspector/icons/new_con.gif create mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/zooinspector/icons/refresh.gif create mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/zooinspector/icons/save_edit.gif create mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/zooinspector/icons/search_next.gif create mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/zooinspector/icons/search_prev.gif create mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/zooinspector/icons/trash.gif create mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/zooinspector/ivy.xml create mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/zooinspector/lib/jtoaster-1.0.4.jar create mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/zooinspector/lib/log4j.properties create mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/zooinspector/licences/Apache Software Licence v2.0.txt create mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/zooinspector/licences/epl-v10.html create mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/zooinspector/src/java/org/apache/zookeeper/inspector/ZooInspector.java create mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/zooinspector/src/java/org/apache/zookeeper/inspector/encryption/BasicDataEncryptionManager.java create mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/zooinspector/src/java/org/apache/zookeeper/inspector/encryption/DataEncryptionManager.java create mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/zooinspector/src/java/org/apache/zookeeper/inspector/gui/NodeViewersChangeListener.java create mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/zooinspector/src/java/org/apache/zookeeper/inspector/gui/ZooInspectorAboutDialog.java create mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/zooinspector/src/java/org/apache/zookeeper/inspector/gui/ZooInspectorConnectionPropertiesDialog.java create mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/zooinspector/src/java/org/apache/zookeeper/inspector/gui/ZooInspectorIconResources.java create mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/zooinspector/src/java/org/apache/zookeeper/inspector/gui/ZooInspectorNodeViewersDialog.java create mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/zooinspector/src/java/org/apache/zookeeper/inspector/gui/ZooInspectorNodeViewersPanel.java create mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/zooinspector/src/java/org/apache/zookeeper/inspector/gui/ZooInspectorPanel.java create mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/zooinspector/src/java/org/apache/zookeeper/inspector/gui/ZooInspectorTreeViewer.java create mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/zooinspector/src/java/org/apache/zookeeper/inspector/gui/about.html create mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/zooinspector/src/java/org/apache/zookeeper/inspector/gui/nodeviewer/NodeViewerACL.java create mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/zooinspector/src/java/org/apache/zookeeper/inspector/gui/nodeviewer/NodeViewerData.java create mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/zooinspector/src/java/org/apache/zookeeper/inspector/gui/nodeviewer/NodeViewerMetaData.java create mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/zooinspector/src/java/org/apache/zookeeper/inspector/gui/nodeviewer/ZooInspectorNodeViewer.java create mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/zooinspector/src/java/org/apache/zookeeper/inspector/logger/LoggerFactory.java create mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/zooinspector/src/java/org/apache/zookeeper/inspector/manager/NodeListener.java create mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/zooinspector/src/java/org/apache/zookeeper/inspector/manager/Pair.java create mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/zooinspector/src/java/org/apache/zookeeper/inspector/manager/ZooInspectorManager.java create mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/zooinspector/src/java/org/apache/zookeeper/inspector/manager/ZooInspectorManagerImpl.java create mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/zooinspector/src/java/org/apache/zookeeper/inspector/manager/ZooInspectorNodeManager.java create mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/zooinspector/src/java/org/apache/zookeeper/inspector/manager/ZooInspectorNodeTreeManager.java create mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/zooinspector/src/java/org/apache/zookeeper/inspector/manager/ZooInspectorReadOnlyManager.java create mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/zooinspector/src/java/org/apache/zookeeper/retry/ZooKeeperRetry.java create mode 100755 pkg/registry/zookeeper-3.4.6/src/contrib/zooinspector/zooInspector-dev.sh create mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/zooinspector/zooInspector.cmd create mode 100755 pkg/registry/zookeeper-3.4.6/src/contrib/zooinspector/zooInspector.sh create mode 100644 pkg/registry/zookeeper-3.4.6/src/docs/forrest.properties create mode 100644 pkg/registry/zookeeper-3.4.6/src/docs/src/documentation/README.txt create mode 100644 pkg/registry/zookeeper-3.4.6/src/docs/src/documentation/TODO.txt create mode 100644 pkg/registry/zookeeper-3.4.6/src/docs/src/documentation/classes/CatalogManager.properties create mode 100644 pkg/registry/zookeeper-3.4.6/src/docs/src/documentation/content/xdocs/bookkeeperConfig.xml create mode 100644 pkg/registry/zookeeper-3.4.6/src/docs/src/documentation/content/xdocs/bookkeeperOverview.xml create mode 100644 pkg/registry/zookeeper-3.4.6/src/docs/src/documentation/content/xdocs/bookkeeperProgrammer.xml create mode 100644 pkg/registry/zookeeper-3.4.6/src/docs/src/documentation/content/xdocs/bookkeeperStarted.xml create mode 100644 pkg/registry/zookeeper-3.4.6/src/docs/src/documentation/content/xdocs/bookkeeperStream.xml create mode 100644 pkg/registry/zookeeper-3.4.6/src/docs/src/documentation/content/xdocs/index.xml create mode 100644 pkg/registry/zookeeper-3.4.6/src/docs/src/documentation/content/xdocs/javaExample.xml create mode 100644 pkg/registry/zookeeper-3.4.6/src/docs/src/documentation/content/xdocs/recipes.xml create mode 100644 pkg/registry/zookeeper-3.4.6/src/docs/src/documentation/content/xdocs/releasenotes.xml create mode 100644 pkg/registry/zookeeper-3.4.6/src/docs/src/documentation/content/xdocs/site.xml create mode 100644 pkg/registry/zookeeper-3.4.6/src/docs/src/documentation/content/xdocs/tabs.xml create mode 100644 pkg/registry/zookeeper-3.4.6/src/docs/src/documentation/content/xdocs/zookeeperAdmin.xml create mode 100644 pkg/registry/zookeeper-3.4.6/src/docs/src/documentation/content/xdocs/zookeeperHierarchicalQuorums.xml create mode 100644 pkg/registry/zookeeper-3.4.6/src/docs/src/documentation/content/xdocs/zookeeperInternals.xml create mode 100644 pkg/registry/zookeeper-3.4.6/src/docs/src/documentation/content/xdocs/zookeeperJMX.xml create mode 100644 pkg/registry/zookeeper-3.4.6/src/docs/src/documentation/content/xdocs/zookeeperObservers.xml create mode 100644 pkg/registry/zookeeper-3.4.6/src/docs/src/documentation/content/xdocs/zookeeperOtherInfo.xml create mode 100644 pkg/registry/zookeeper-3.4.6/src/docs/src/documentation/content/xdocs/zookeeperOver.xml create mode 100644 pkg/registry/zookeeper-3.4.6/src/docs/src/documentation/content/xdocs/zookeeperProgrammers.xml create mode 100644 pkg/registry/zookeeper-3.4.6/src/docs/src/documentation/content/xdocs/zookeeperQuotas.xml create mode 100644 pkg/registry/zookeeper-3.4.6/src/docs/src/documentation/content/xdocs/zookeeperStarted.xml create mode 100644 pkg/registry/zookeeper-3.4.6/src/docs/src/documentation/content/xdocs/zookeeperTutorial.xml create mode 100644 pkg/registry/zookeeper-3.4.6/src/docs/src/documentation/resources/images/2pc.jpg create mode 100644 pkg/registry/zookeeper-3.4.6/src/docs/src/documentation/resources/images/bk-overview.jpg create mode 100644 pkg/registry/zookeeper-3.4.6/src/docs/src/documentation/resources/images/favicon.ico create mode 100644 pkg/registry/zookeeper-3.4.6/src/docs/src/documentation/resources/images/hadoop-logo.jpg create mode 100644 pkg/registry/zookeeper-3.4.6/src/docs/src/documentation/resources/images/state_dia.dia create mode 100644 pkg/registry/zookeeper-3.4.6/src/docs/src/documentation/resources/images/state_dia.jpg create mode 100644 pkg/registry/zookeeper-3.4.6/src/docs/src/documentation/resources/images/zkarch.jpg create mode 100644 pkg/registry/zookeeper-3.4.6/src/docs/src/documentation/resources/images/zkcomponents.jpg create mode 100644 pkg/registry/zookeeper-3.4.6/src/docs/src/documentation/resources/images/zknamespace.jpg create mode 100644 pkg/registry/zookeeper-3.4.6/src/docs/src/documentation/resources/images/zkperfRW-3.2.jpg create mode 100644 pkg/registry/zookeeper-3.4.6/src/docs/src/documentation/resources/images/zkperfRW.jpg create mode 100644 pkg/registry/zookeeper-3.4.6/src/docs/src/documentation/resources/images/zkperfreliability.jpg create mode 100644 pkg/registry/zookeeper-3.4.6/src/docs/src/documentation/resources/images/zkservice.jpg create mode 100644 pkg/registry/zookeeper-3.4.6/src/docs/src/documentation/resources/images/zookeeper_small.gif create mode 100644 pkg/registry/zookeeper-3.4.6/src/docs/src/documentation/skinconf.xml create mode 100644 pkg/registry/zookeeper-3.4.6/src/docs/status.xml create mode 100644 pkg/registry/zookeeper-3.4.6/src/java/OldChangeLog create mode 100644 pkg/registry/zookeeper-3.4.6/src/java/generated/.generated create mode 100644 pkg/registry/zookeeper-3.4.6/src/java/generated/org/apache/zookeeper/data/ACL.java create mode 100644 pkg/registry/zookeeper-3.4.6/src/java/generated/org/apache/zookeeper/data/Id.java create mode 100644 pkg/registry/zookeeper-3.4.6/src/java/generated/org/apache/zookeeper/data/Stat.java create mode 100644 pkg/registry/zookeeper-3.4.6/src/java/generated/org/apache/zookeeper/data/StatPersisted.java create mode 100644 pkg/registry/zookeeper-3.4.6/src/java/generated/org/apache/zookeeper/data/StatPersistedV1.java create mode 100644 pkg/registry/zookeeper-3.4.6/src/java/generated/org/apache/zookeeper/proto/AuthPacket.java create mode 100644 pkg/registry/zookeeper-3.4.6/src/java/generated/org/apache/zookeeper/proto/CheckVersionRequest.java create mode 100644 pkg/registry/zookeeper-3.4.6/src/java/generated/org/apache/zookeeper/proto/ConnectRequest.java create mode 100644 pkg/registry/zookeeper-3.4.6/src/java/generated/org/apache/zookeeper/proto/ConnectResponse.java create mode 100644 pkg/registry/zookeeper-3.4.6/src/java/generated/org/apache/zookeeper/proto/CreateRequest.java create mode 100644 pkg/registry/zookeeper-3.4.6/src/java/generated/org/apache/zookeeper/proto/CreateResponse.java create mode 100644 pkg/registry/zookeeper-3.4.6/src/java/generated/org/apache/zookeeper/proto/DeleteRequest.java create mode 100644 pkg/registry/zookeeper-3.4.6/src/java/generated/org/apache/zookeeper/proto/ErrorResponse.java create mode 100644 pkg/registry/zookeeper-3.4.6/src/java/generated/org/apache/zookeeper/proto/ExistsRequest.java create mode 100644 pkg/registry/zookeeper-3.4.6/src/java/generated/org/apache/zookeeper/proto/ExistsResponse.java create mode 100644 pkg/registry/zookeeper-3.4.6/src/java/generated/org/apache/zookeeper/proto/GetACLRequest.java create mode 100644 pkg/registry/zookeeper-3.4.6/src/java/generated/org/apache/zookeeper/proto/GetACLResponse.java create mode 100644 pkg/registry/zookeeper-3.4.6/src/java/generated/org/apache/zookeeper/proto/GetChildren2Request.java create mode 100644 pkg/registry/zookeeper-3.4.6/src/java/generated/org/apache/zookeeper/proto/GetChildren2Response.java create mode 100644 pkg/registry/zookeeper-3.4.6/src/java/generated/org/apache/zookeeper/proto/GetChildrenRequest.java create mode 100644 pkg/registry/zookeeper-3.4.6/src/java/generated/org/apache/zookeeper/proto/GetChildrenResponse.java create mode 100644 pkg/registry/zookeeper-3.4.6/src/java/generated/org/apache/zookeeper/proto/GetDataRequest.java create mode 100644 pkg/registry/zookeeper-3.4.6/src/java/generated/org/apache/zookeeper/proto/GetDataResponse.java create mode 100644 pkg/registry/zookeeper-3.4.6/src/java/generated/org/apache/zookeeper/proto/GetMaxChildrenRequest.java create mode 100644 pkg/registry/zookeeper-3.4.6/src/java/generated/org/apache/zookeeper/proto/GetMaxChildrenResponse.java create mode 100644 pkg/registry/zookeeper-3.4.6/src/java/generated/org/apache/zookeeper/proto/GetSASLRequest.java create mode 100644 pkg/registry/zookeeper-3.4.6/src/java/generated/org/apache/zookeeper/proto/MultiHeader.java create mode 100644 pkg/registry/zookeeper-3.4.6/src/java/generated/org/apache/zookeeper/proto/ReplyHeader.java create mode 100644 pkg/registry/zookeeper-3.4.6/src/java/generated/org/apache/zookeeper/proto/RequestHeader.java create mode 100644 pkg/registry/zookeeper-3.4.6/src/java/generated/org/apache/zookeeper/proto/SetACLRequest.java create mode 100644 pkg/registry/zookeeper-3.4.6/src/java/generated/org/apache/zookeeper/proto/SetACLResponse.java create mode 100644 pkg/registry/zookeeper-3.4.6/src/java/generated/org/apache/zookeeper/proto/SetDataRequest.java create mode 100644 pkg/registry/zookeeper-3.4.6/src/java/generated/org/apache/zookeeper/proto/SetDataResponse.java create mode 100644 pkg/registry/zookeeper-3.4.6/src/java/generated/org/apache/zookeeper/proto/SetMaxChildrenRequest.java create mode 100644 pkg/registry/zookeeper-3.4.6/src/java/generated/org/apache/zookeeper/proto/SetSASLRequest.java create mode 100644 pkg/registry/zookeeper-3.4.6/src/java/generated/org/apache/zookeeper/proto/SetSASLResponse.java create mode 100644 pkg/registry/zookeeper-3.4.6/src/java/generated/org/apache/zookeeper/proto/SetWatches.java create mode 100644 pkg/registry/zookeeper-3.4.6/src/java/generated/org/apache/zookeeper/proto/SyncRequest.java create mode 100644 pkg/registry/zookeeper-3.4.6/src/java/generated/org/apache/zookeeper/proto/SyncResponse.java create mode 100644 pkg/registry/zookeeper-3.4.6/src/java/generated/org/apache/zookeeper/proto/WatcherEvent.java create mode 100644 pkg/registry/zookeeper-3.4.6/src/java/generated/org/apache/zookeeper/server/persistence/FileHeader.java create mode 100644 pkg/registry/zookeeper-3.4.6/src/java/generated/org/apache/zookeeper/server/quorum/LearnerInfo.java create mode 100644 pkg/registry/zookeeper-3.4.6/src/java/generated/org/apache/zookeeper/server/quorum/QuorumPacket.java create mode 100644 pkg/registry/zookeeper-3.4.6/src/java/generated/org/apache/zookeeper/txn/CheckVersionTxn.java create mode 100644 pkg/registry/zookeeper-3.4.6/src/java/generated/org/apache/zookeeper/txn/CreateSessionTxn.java create mode 100644 pkg/registry/zookeeper-3.4.6/src/java/generated/org/apache/zookeeper/txn/CreateTxn.java create mode 100644 pkg/registry/zookeeper-3.4.6/src/java/generated/org/apache/zookeeper/txn/CreateTxnV0.java create mode 100644 pkg/registry/zookeeper-3.4.6/src/java/generated/org/apache/zookeeper/txn/DeleteTxn.java create mode 100644 pkg/registry/zookeeper-3.4.6/src/java/generated/org/apache/zookeeper/txn/ErrorTxn.java create mode 100644 pkg/registry/zookeeper-3.4.6/src/java/generated/org/apache/zookeeper/txn/MultiTxn.java create mode 100644 pkg/registry/zookeeper-3.4.6/src/java/generated/org/apache/zookeeper/txn/SetACLTxn.java create mode 100644 pkg/registry/zookeeper-3.4.6/src/java/generated/org/apache/zookeeper/txn/SetDataTxn.java create mode 100644 pkg/registry/zookeeper-3.4.6/src/java/generated/org/apache/zookeeper/txn/SetMaxChildrenTxn.java create mode 100644 pkg/registry/zookeeper-3.4.6/src/java/generated/org/apache/zookeeper/txn/Txn.java create mode 100644 pkg/registry/zookeeper-3.4.6/src/java/generated/org/apache/zookeeper/txn/TxnHeader.java create mode 100644 pkg/registry/zookeeper-3.4.6/src/java/generated/org/apache/zookeeper/version/Info.java create mode 100644 pkg/registry/zookeeper-3.4.6/src/java/lib/cobertura/README.txt create mode 100644 pkg/registry/zookeeper-3.4.6/src/java/lib/jdiff/zookeeper_3.1.1.xml create mode 100644 pkg/registry/zookeeper-3.4.6/src/java/lib/jdiff/zookeeper_3.4.6-SNAPSHOT.xml create mode 100644 pkg/registry/zookeeper-3.4.6/src/java/lib/jdiff/zookeeper_3.4.6.xml create mode 100644 pkg/registry/zookeeper-3.4.6/src/java/lib/jline-0.9.94.LICENSE.txt create mode 100644 pkg/registry/zookeeper-3.4.6/src/java/lib/log4j-1.2.16.LICENSE.txt create mode 100644 pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/jute/BinaryInputArchive.java create mode 100644 pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/jute/BinaryOutputArchive.java create mode 100644 pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/jute/CsvInputArchive.java create mode 100644 pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/jute/CsvOutputArchive.java create mode 100644 pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/jute/Index.java create mode 100644 pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/jute/InputArchive.java create mode 100644 pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/jute/OutputArchive.java create mode 100644 pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/jute/Record.java create mode 100644 pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/jute/RecordReader.java create mode 100644 pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/jute/RecordWriter.java create mode 100644 pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/jute/Utils.java create mode 100644 pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/jute/XmlInputArchive.java create mode 100644 pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/jute/XmlOutputArchive.java create mode 100644 pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/jute/compiler/CGenerator.java create mode 100644 pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/jute/compiler/CSharpGenerator.java create mode 100644 pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/jute/compiler/CppGenerator.java create mode 100644 pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/jute/compiler/JBoolean.java create mode 100644 pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/jute/compiler/JBuffer.java create mode 100644 pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/jute/compiler/JByte.java create mode 100644 pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/jute/compiler/JCompType.java create mode 100644 pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/jute/compiler/JDouble.java create mode 100644 pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/jute/compiler/JField.java create mode 100644 pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/jute/compiler/JFile.java create mode 100644 pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/jute/compiler/JFloat.java create mode 100644 pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/jute/compiler/JInt.java create mode 100644 pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/jute/compiler/JLong.java create mode 100644 pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/jute/compiler/JMap.java create mode 100644 pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/jute/compiler/JRecord.java create mode 100644 pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/jute/compiler/JString.java create mode 100644 pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/jute/compiler/JType.java create mode 100644 pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/jute/compiler/JVector.java create mode 100644 pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/jute/compiler/JavaGenerator.java create mode 100644 pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/jute/compiler/generated/ParseException.java create mode 100644 pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/jute/compiler/generated/Rcc.java create mode 100644 pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/jute/compiler/generated/RccConstants.java create mode 100644 pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/jute/compiler/generated/RccTokenManager.java create mode 100644 pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/jute/compiler/generated/SimpleCharStream.java create mode 100644 pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/jute/compiler/generated/Token.java create mode 100644 pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/jute/compiler/generated/TokenMgrError.java create mode 100644 pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/jute/compiler/generated/package.html create mode 100644 pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/jute/compiler/generated/rcc.jj create mode 100644 pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/jute/compiler/package.html create mode 100644 pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/jute/package.html create mode 100644 pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/AsyncCallback.java create mode 100644 pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/ClientCnxn.java create mode 100644 pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/ClientCnxnSocket.java create mode 100644 pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/ClientCnxnSocketNIO.java create mode 100644 pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/ClientWatchManager.java create mode 100644 pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/CreateMode.java create mode 100644 pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/Environment.java create mode 100644 pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/JLineZNodeCompletor.java create mode 100644 pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/KeeperException.java create mode 100644 pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/Login.java create mode 100644 pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/MultiResponse.java create mode 100644 pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/MultiTransactionRecord.java create mode 100644 pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/Op.java create mode 100644 pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/OpResult.java create mode 100644 pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/Quotas.java create mode 100644 pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/ServerAdminClient.java create mode 100644 pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/Shell.java create mode 100644 pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/StatsTrack.java create mode 100644 pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/Transaction.java create mode 100644 pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/Version.java create mode 100644 pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/WatchedEvent.java create mode 100644 pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/Watcher.java create mode 100644 pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/ZKUtil.java create mode 100644 pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/ZooDefs.java create mode 100644 pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/ZooKeeper.java create mode 100644 pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/ZooKeeperMain.java create mode 100644 pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/client/ConnectStringParser.java create mode 100644 pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/client/FourLetterWordMain.java create mode 100644 pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/client/HostProvider.java create mode 100644 pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/client/StaticHostProvider.java create mode 100644 pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/client/ZooKeeperSaslClient.java create mode 100644 pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/common/AtomicFileOutputStream.java create mode 100644 pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/common/IOUtils.java create mode 100644 pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/common/PathTrie.java create mode 100644 pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/common/PathUtils.java create mode 100644 pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/jmx/CommonNames.java create mode 100644 pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/jmx/MBeanRegistry.java create mode 100644 pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/jmx/ManagedUtil.java create mode 100644 pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/jmx/ZKMBeanInfo.java create mode 100644 pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/ByteBufferInputStream.java create mode 100644 pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/ByteBufferOutputStream.java create mode 100644 pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/ConnectionBean.java create mode 100644 pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/ConnectionMXBean.java create mode 100644 pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/DataNode.java create mode 100644 pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/DataTree.java create mode 100644 pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/DataTreeBean.java create mode 100644 pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/DataTreeMXBean.java create mode 100644 pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/DatadirCleanupManager.java create mode 100644 pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/FinalRequestProcessor.java create mode 100644 pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/LogFormatter.java create mode 100644 pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/NIOServerCnxn.java create mode 100644 pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/NIOServerCnxnFactory.java create mode 100644 pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/NettyServerCnxn.java create mode 100644 pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/NettyServerCnxnFactory.java create mode 100644 pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/ObserverBean.java create mode 100644 pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/PrepRequestProcessor.java create mode 100644 pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/PurgeTxnLog.java create mode 100644 pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/Request.java create mode 100644 pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/RequestProcessor.java create mode 100644 pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/ServerCnxn.java create mode 100644 pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/ServerCnxnFactory.java create mode 100644 pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/ServerConfig.java create mode 100644 pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/ServerStats.java create mode 100644 pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/SessionTracker.java create mode 100644 pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/SessionTrackerImpl.java create mode 100644 pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/SnapshotFormatter.java create mode 100644 pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/Stats.java create mode 100644 pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/SyncRequestProcessor.java create mode 100644 pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/TraceFormatter.java create mode 100644 pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/UnimplementedRequestProcessor.java create mode 100644 pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/WatchManager.java create mode 100644 pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/ZKDatabase.java create mode 100644 pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/ZooKeeperSaslServer.java create mode 100644 pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/ZooKeeperServer.java create mode 100644 pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/ZooKeeperServerBean.java create mode 100644 pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/ZooKeeperServerMXBean.java create mode 100644 pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/ZooKeeperServerMain.java create mode 100644 pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/ZooTrace.java create mode 100644 pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/auth/AuthenticationProvider.java create mode 100644 pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/auth/DigestAuthenticationProvider.java create mode 100644 pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/auth/DigestLoginModule.java create mode 100644 pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/auth/IPAuthenticationProvider.java create mode 100644 pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/auth/KerberosName.java create mode 100644 pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/auth/ProviderRegistry.java create mode 100644 pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/auth/SASLAuthenticationProvider.java create mode 100644 pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/auth/SaslServerCallbackHandler.java create mode 100644 pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/package.html create mode 100644 pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/persistence/FileSnap.java create mode 100644 pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/persistence/FileTxnLog.java create mode 100644 pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/persistence/FileTxnSnapLog.java create mode 100644 pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/persistence/SnapShot.java create mode 100644 pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/persistence/TxnLog.java create mode 100644 pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/persistence/Util.java create mode 100644 pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/quorum/AckRequestProcessor.java create mode 100644 pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/quorum/AuthFastLeaderElection.java create mode 100644 pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/quorum/CommitProcessor.java create mode 100644 pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/quorum/Election.java create mode 100644 pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/quorum/FastLeaderElection.java create mode 100644 pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/quorum/Follower.java create mode 100644 pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/quorum/FollowerBean.java create mode 100644 pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/quorum/FollowerMXBean.java create mode 100644 pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/quorum/FollowerRequestProcessor.java create mode 100644 pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/quorum/FollowerZooKeeperServer.java create mode 100644 pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/quorum/Leader.java create mode 100644 pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/quorum/LeaderBean.java create mode 100644 pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/quorum/LeaderElection.java create mode 100644 pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/quorum/LeaderElectionBean.java create mode 100644 pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/quorum/LeaderElectionMXBean.java create mode 100644 pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/quorum/LeaderMXBean.java create mode 100644 pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/quorum/LeaderZooKeeperServer.java create mode 100644 pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/quorum/Learner.java create mode 100644 pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/quorum/LearnerHandler.java create mode 100644 pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/quorum/LearnerSessionTracker.java create mode 100644 pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/quorum/LearnerSyncRequest.java create mode 100644 pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/quorum/LearnerZooKeeperServer.java create mode 100644 pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/quorum/LocalPeerBean.java create mode 100644 pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/quorum/LocalPeerMXBean.java create mode 100644 pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/quorum/Observer.java create mode 100644 pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/quorum/ObserverMXBean.java create mode 100644 pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/quorum/ObserverRequestProcessor.java create mode 100644 pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/quorum/ObserverZooKeeperServer.java create mode 100644 pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/quorum/ProposalRequestProcessor.java create mode 100644 pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/quorum/QuorumBean.java create mode 100644 pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/quorum/QuorumCnxManager.java create mode 100644 pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/quorum/QuorumMXBean.java create mode 100644 pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/quorum/QuorumPeer.java create mode 100644 pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/quorum/QuorumPeerConfig.java create mode 100644 pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/quorum/QuorumPeerMain.java create mode 100644 pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/quorum/QuorumStats.java create mode 100644 pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/quorum/QuorumZooKeeperServer.java create mode 100644 pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/quorum/ReadOnlyBean.java create mode 100644 pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/quorum/ReadOnlyRequestProcessor.java create mode 100644 pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/quorum/ReadOnlyZooKeeperServer.java create mode 100644 pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/quorum/RemotePeerBean.java create mode 100644 pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/quorum/RemotePeerMXBean.java create mode 100644 pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/quorum/SendAckRequestProcessor.java create mode 100644 pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/quorum/ServerBean.java create mode 100644 pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/quorum/ServerMXBean.java create mode 100644 pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/quorum/StateSummary.java create mode 100644 pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/quorum/Vote.java create mode 100644 pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/quorum/flexible/QuorumHierarchical.java create mode 100644 pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/quorum/flexible/QuorumMaj.java create mode 100644 pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/quorum/flexible/QuorumVerifier.java create mode 100644 pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/upgrade/DataNodeV1.java create mode 100644 pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/upgrade/DataTreeV1.java create mode 100644 pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/upgrade/UpgradeMain.java create mode 100644 pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/upgrade/UpgradeSnapShot.java create mode 100644 pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/upgrade/UpgradeSnapShotV1.java create mode 100644 pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/util/KerberosUtil.java create mode 100644 pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/util/OSMXBean.java create mode 100644 pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/util/Profiler.java create mode 100644 pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/util/SerializeUtils.java create mode 100644 pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/util/ZxidUtils.java create mode 100644 pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/version/util/VerGen.java create mode 100644 pkg/registry/zookeeper-3.4.6/src/java/main/overview.html create mode 100644 pkg/registry/zookeeper-3.4.6/src/java/systest/README.txt create mode 100644 pkg/registry/zookeeper-3.4.6/src/lastRevision.bat create mode 100755 pkg/registry/zookeeper-3.4.6/src/lastRevision.sh create mode 100644 pkg/registry/zookeeper-3.4.6/src/packages/deb/init.d/zookeeper create mode 100644 pkg/registry/zookeeper-3.4.6/src/packages/deb/zookeeper.control/conffile create mode 100644 pkg/registry/zookeeper-3.4.6/src/packages/deb/zookeeper.control/control create mode 100644 pkg/registry/zookeeper-3.4.6/src/packages/deb/zookeeper.control/postinst create mode 100644 pkg/registry/zookeeper-3.4.6/src/packages/deb/zookeeper.control/postrm create mode 100644 pkg/registry/zookeeper-3.4.6/src/packages/deb/zookeeper.control/preinst create mode 100644 pkg/registry/zookeeper-3.4.6/src/packages/deb/zookeeper.control/prerm create mode 100644 pkg/registry/zookeeper-3.4.6/src/packages/rpm/init.d/zookeeper create mode 100644 pkg/registry/zookeeper-3.4.6/src/packages/rpm/spec/zookeeper.spec create mode 100755 pkg/registry/zookeeper-3.4.6/src/packages/templates/conf/zookeeper-env.sh create mode 100755 pkg/registry/zookeeper-3.4.6/src/packages/update-zookeeper-env.sh create mode 100644 pkg/registry/zookeeper-3.4.6/src/recipes/README.txt create mode 100644 pkg/registry/zookeeper-3.4.6/src/recipes/build-recipes.xml create mode 100644 pkg/registry/zookeeper-3.4.6/src/recipes/build.xml create mode 100644 pkg/registry/zookeeper-3.4.6/src/recipes/election/README.txt create mode 100644 pkg/registry/zookeeper-3.4.6/src/recipes/election/build.xml create mode 100644 pkg/registry/zookeeper-3.4.6/src/recipes/election/src/java/org/apache/zookeeper/recipes/leader/LeaderElectionAware.java create mode 100644 pkg/registry/zookeeper-3.4.6/src/recipes/election/src/java/org/apache/zookeeper/recipes/leader/LeaderElectionSupport.java create mode 100644 pkg/registry/zookeeper-3.4.6/src/recipes/election/src/java/org/apache/zookeeper/recipes/leader/LeaderOffer.java create mode 100644 pkg/registry/zookeeper-3.4.6/src/recipes/lock/README.txt create mode 100644 pkg/registry/zookeeper-3.4.6/src/recipes/lock/build.xml create mode 100644 pkg/registry/zookeeper-3.4.6/src/recipes/lock/src/c/INSTALL create mode 100644 pkg/registry/zookeeper-3.4.6/src/recipes/lock/src/c/LICENSE create mode 100644 pkg/registry/zookeeper-3.4.6/src/recipes/lock/src/c/Makefile.am create mode 100644 pkg/registry/zookeeper-3.4.6/src/recipes/lock/src/c/README.txt create mode 100644 pkg/registry/zookeeper-3.4.6/src/recipes/lock/src/c/acinclude.m4 create mode 100644 pkg/registry/zookeeper-3.4.6/src/recipes/lock/src/c/aminclude.am create mode 100644 pkg/registry/zookeeper-3.4.6/src/recipes/lock/src/c/c-doc.Doxyfile create mode 100644 pkg/registry/zookeeper-3.4.6/src/recipes/lock/src/c/configure.ac create mode 100644 pkg/registry/zookeeper-3.4.6/src/recipes/lock/src/c/include/zoo_lock.h create mode 100644 pkg/registry/zookeeper-3.4.6/src/recipes/lock/src/c/src/zoo_lock.c create mode 100644 pkg/registry/zookeeper-3.4.6/src/recipes/lock/src/c/tests/TestClient.cc create mode 100644 pkg/registry/zookeeper-3.4.6/src/recipes/lock/src/c/tests/TestDriver.cc create mode 100644 pkg/registry/zookeeper-3.4.6/src/recipes/lock/src/c/tests/Util.cc create mode 100644 pkg/registry/zookeeper-3.4.6/src/recipes/lock/src/c/tests/Util.h create mode 100755 pkg/registry/zookeeper-3.4.6/src/recipes/lock/src/c/tests/zkServer.sh create mode 100644 pkg/registry/zookeeper-3.4.6/src/recipes/lock/src/java/org/apache/zookeeper/recipes/lock/LockListener.java create mode 100644 pkg/registry/zookeeper-3.4.6/src/recipes/lock/src/java/org/apache/zookeeper/recipes/lock/ProtocolSupport.java create mode 100644 pkg/registry/zookeeper-3.4.6/src/recipes/lock/src/java/org/apache/zookeeper/recipes/lock/WriteLock.java create mode 100644 pkg/registry/zookeeper-3.4.6/src/recipes/lock/src/java/org/apache/zookeeper/recipes/lock/ZNodeName.java create mode 100644 pkg/registry/zookeeper-3.4.6/src/recipes/lock/src/java/org/apache/zookeeper/recipes/lock/ZooKeeperOperation.java create mode 100644 pkg/registry/zookeeper-3.4.6/src/recipes/queue/README.txt create mode 100644 pkg/registry/zookeeper-3.4.6/src/recipes/queue/build.xml create mode 100644 pkg/registry/zookeeper-3.4.6/src/recipes/queue/src/c/INSTALL create mode 100644 pkg/registry/zookeeper-3.4.6/src/recipes/queue/src/c/LICENSE create mode 100644 pkg/registry/zookeeper-3.4.6/src/recipes/queue/src/c/Makefile.am create mode 100644 pkg/registry/zookeeper-3.4.6/src/recipes/queue/src/c/README.txt create mode 100644 pkg/registry/zookeeper-3.4.6/src/recipes/queue/src/c/acinclude.m4 create mode 100644 pkg/registry/zookeeper-3.4.6/src/recipes/queue/src/c/aminclude.am create mode 100644 pkg/registry/zookeeper-3.4.6/src/recipes/queue/src/c/c-doc.Doxyfile create mode 100644 pkg/registry/zookeeper-3.4.6/src/recipes/queue/src/c/configure.ac create mode 100644 pkg/registry/zookeeper-3.4.6/src/recipes/queue/src/c/include/zoo_queue.h create mode 100644 pkg/registry/zookeeper-3.4.6/src/recipes/queue/src/c/src/zoo_queue.c create mode 100644 pkg/registry/zookeeper-3.4.6/src/recipes/queue/src/c/tests/TestClient.cc create mode 100644 pkg/registry/zookeeper-3.4.6/src/recipes/queue/src/c/tests/TestDriver.cc create mode 100644 pkg/registry/zookeeper-3.4.6/src/recipes/queue/src/c/tests/Util.cc create mode 100644 pkg/registry/zookeeper-3.4.6/src/recipes/queue/src/c/tests/Util.h create mode 100755 pkg/registry/zookeeper-3.4.6/src/recipes/queue/src/c/tests/zkServer.sh create mode 100644 pkg/registry/zookeeper-3.4.6/src/recipes/queue/src/java/org/apache/zookeeper/recipes/queue/DistributedQueue.java create mode 100644 pkg/registry/zookeeper-3.4.6/src/zookeeper.jute create mode 100644 pkg/registry/zookeeper-3.4.6/zookeeper-3.4.6.jar.REMOVED.git-id create mode 100644 pkg/registry/zookeeper-3.4.6/zookeeper-3.4.6.jar.asc create mode 100644 pkg/registry/zookeeper-3.4.6/zookeeper-3.4.6.jar.md5 create mode 100644 pkg/registry/zookeeper-3.4.6/zookeeper-3.4.6.jar.sha1 diff --git a/pkg/registry/zookeeper-3.4.6/CHANGES.txt b/pkg/registry/zookeeper-3.4.6/CHANGES.txt new file mode 100644 index 000000000..915fec2cb --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/CHANGES.txt @@ -0,0 +1,2276 @@ +Release 3.4.6 - 2014-03-10 + +Backward compatible changes: + +BUGFIXES: + + ZOOKEEPER-1474. Cannot build Zookeeper with IBM Java: use of Sun + MXBean classes (Adalberto Medeiros via phunt) + + ZOOKEEPER-1596. Zab1_0Test should ensure that the file is closed + (Enis Soztutar via phunt) + + ZOOKEEPER-1513. "Unreasonable length" exception while starting a + server (Skye W-M via phunt) + + ZOOKEEPER-1581. change copyright in notice to 2012 (breed via phunt) + + ZOOKEEPER-753. log4j dependency in the pom needs to have exclusion + lists (Sean Busbey via phunt) + + ZOOKEEPER-1553. Findbugs configuration is missing some dependencies + (Sean Busbey via phunt) + + ZOOKEEPER-1478. Small bug in QuorumTest.testFollowersStartAfterLeader( ) + (Alexander Shraer via fpj, breed, phunt) + + ZOOKEEPER-1387. Wrong epoch file created + (Benjamin Busjaeger via breed, phunt) + + ZOOKEEPER-1578. org.apache.zookeeper.server.quorum.Zab1_0Test failed due to + hard code with 33556 port. (Li Ping via mahadev) + + ZOOKEEPER-1334. Zookeeper 3.4.x is not OSGi compliant - MANIFEST.MF + is flawed (Claus Ibsen via phunt) + + ZOOKEEPER-1535. ZK Shell/Cli re-executes last command on exit + (Edward Ribeiro via camille) + + ZOOKEEPER-1495. ZK client hangs when using a function not available + on the server. (Skye W-M via phunt) + + ZOOKEEPER-1613. The documentation still points to 2008 in the + copyright notice (Edward Ribeiro via phunt) + + ZOOKEEPER-1562. Memory leaks in zoo_multi API + (Deepak Jagtap via phunt) + + ZOOKEEPER-1645. ZooKeeper OSGi package imports not complete + (Arnoud Glimmerveen via phunt) + + ZOOKEEPER-1648. Fix WatcherTest in JDK7 + (Thawan Kooburat via phunt) + + ZOOKEEPER-1606. intermittent failures in ZkDatabaseCorruptionTest on + jenkins (lixiaofeng via phunt) + + ZOOKEEPER-1647. OSGi package import/export changes not applied to + bin-jar (Arnoud Glimmerveen via phunt) + + ZOOKEEPER-1633. Introduce a protocol version to connection initiation + message (Alexander Shraer via michim) + + ZOOKEEPER-1697. large snapshots can cause continuous quorum failure + (phunt via fpj) + + ZOOKEEPER-1706. Typo in Double Barriers example (Jingguo Yao via fpj) + + ZOOKEEPER-1642. Leader Loading Database Twice (fpj via camille) + + ZOOKEEPER-1663. scripts don't work when path contains spaces (Amichai Rothman via camille) + + ZOOKEEPER-1714 perl client segfaults if ZOO_READ_ACL_UNSAFE constant is used + (Botond Hejj via camille) + + ZOOKEEPER-1719. zkCli.sh, zkServer.sh and zkEnv.sh regression caused by ZOOKEEPER-1663 + (Marshall McMullen via camille) + + ZOOKEEPER-1702. ZooKeeper client may write operation packets before + receiving successful response to connection request, can cause TCP + RST (Chris Nauroth via phunt) + + ZOOKEEPER-1629. testTransactionLogCorruption occasionally fails. (shralex via camille) + + ZOOKEEPER-1731. Unsynchronized access to ServerCnxnFactory.connectionBeans results in + deadlock. (Dave Latham via camille) + + ZOOKEEPER-1713. wrong time calculation in zkfuse.cc (german via fpj) + + ZOOKEEPER-1379. 'printwatches, redo, history and connect '. client commands always print usage. This is not necessary (edward via fpj) + + ZOOKEEPER-1448: Node+Quota creation in transaction log can crash leader startup (Botond Hejj via fpj) + + ZOOKEEPER-1664. Kerberos auth doesn't work with native platform GSS integration. (Boaz Kelmer via camille) + + ZOOKEEPER-1750. Race condition producing NPE in NIOServerCnxn.toString + (Rakesh R via michim) + + ZOOKEEPER-1754. Read-only server allows to create znode (Rakesh R via fpj) + + ZOOKEEPER-1751. ClientCnxn#run could miss the second ping or connection get + dropped before a ping. (Jeffrey Zhong via mahadev) + + ZOOKEEPER-1657. Increased CPU usage by unnecessary SASL checks (Philip K. Warren via fpj) + + ZOOKEEPER-1753. ClientCnxn is not properly releasing the resources, + which are used to ping RwServer (Rakesh R via fpj) + + ZOOKEEPER-1096. Leader communication should listen on specified IP, not wildcard address (Jared Cantwell, German Blanco via fpj) + + ZOOKEEPER-87. Follower does not shut itself down if its too far behind the leader. (German Blanco via fpj) + + ZOOKEEPER-1603. StaticHostProviderTest testUpdateClientMigrateOrNot hangs (fpj) + + ZOOKEEPER-1696. Fail to run zookeeper client on Weblogic application server. + (Jeffrey Zhong via mahadev) + + ZOOKEEPER-1770. NullPointerException in SnapshotFormatter + (Germán Blanco via phunt) + + ZOOKEEPER-732. Improper translation of error into Python exception (Andrei Savu, Lei Zhang, fpj via fpj) + + ZOOKEEPER-1551. Observers ignore txns that come after snapshot and UPTODATE + (thawan, fpj via thawan) + + ZOOKEEPER-1774. QuorumPeerMainTest fails consistently with + "complains about host" assertion failure (phunt) + + ZOOKEEPER-877. zkpython does not work with python3.1 + (Daniel Enman via phunt) + + ZOOKEEPER-1624. PrepRequestProcessor abort multi-operation incorrectly. (thawan via camille) + + ZOOKEEPER-1610. Some classes are using == or != to compare + Long/String objects instead of .equals() (Edward Ribeiro via phunt) + + ZOOKEEPER-1646. mt c client tests fail on Ubuntu Raring (phunt) + + ZOOKEEPER-1558. Leader should not snapshot uncommitted state (fpj) + + ZOOKEEPER-1732. ZooKeeper server unable to join established + ensemble (German Blanco via fpj) + + ZOOKEEPER-1667. Watch event isn't handled correctly when + a client reestablish to a server (jacky007, fpj via fpj) + + ZOOKEEPER-1799. SaslAuthFailDesignatedClientTest.testAuth fails + frequently on SUSE (Jeffrey Zhong via phunt) + + ZOOKEEPER-1557. jenkins jdk7 test failure in + testBadSaslAuthNotifiesWatch (Eugene Koontz via phunt) + + ZOOKEEPER-1744. clientPortAddress breaks "zkServer.sh status" + (Nick Ohanian via phunt) + + ZOOKEEPER-1798. Fix race condition in testNormalObserverRun + (thawan, fpj via thawan) + + ZOOKEEPER-1808. Add version to FLE notifications for 3.4 branch (fpj) + + ZOOKEEPER-1812. ZooInspector reconnection always fails if first + connection fails (Benjamin Jaton via phunt) + + ZOOKEEPER-1597. Windows build failing (michim via fpj) + + ZOOKEEPER-1817. Fix don't care for b3.4 (fpj) + + ZOOKEEPER-1653. zookeeper fails to start because of inconsistent + epoch (michim via fpj) + + ZOOKEEPER-1821. very ugly warning when compiling load_gen.c + (german blanco via fpj) + + ZOOKEEPER-1632. fix memory leaks in cli_st (fpj via michim) + + ZOOKEEPER-1459. Standalone ZooKeeperServer is not closing + the transaction log files on shutdown (Rakesh R via fpj) + + ZOOKEEPER-1019. zkfuse doesn't list dependency on boost in README + (Raul Gutierrez Segales via michim) + + ZOOKEEPER-1834. Catch IOException in FileTxnLog (fpj via michim) + + ZOOKEEPER-1382. Zookeeper server holds onto dead/expired session ids in the watch data structures + (Germán Blanco and Michael Morello via camille) + + ZOOKEEPER-1837. Fix JMXEnv checks (potential race conditions) + (Germán Blanco via fpj) + + ZOOKEEPER-1839. Deadlock in NettyServerCnxn (Rakesh R via michim) + + ZOOKEEPER-1622. session ids will be negative in the year 2022 + (Eric Newton via phunt) + + ZOOKEEPER-1756. zookeeper_interest() in C client can return a timeval of 0 + (Eric Lindvall via michim) + + ZOOKEEPER-1388. Client side 'PathValidation' is missing for the + multi-transaction api. (Rakesh R via marshallm, phunt) + + ZOOKEEPER-1841. problem in QuorumTest (Germán via fpj) + + ZOOKEEPER-1733 FLETest#testLE is flaky oo.l windows boxes + (michim, Jeffrey Zhong via fpj) + + ZOOKEEPER-1849. Need to properly tear down tests in various + cases (Germán via fpj) + + ZOOKEEPER-1179. NettyServerCnxn does not properly close + socket on 4 letter word requests (Rakesh R, Germán Blanco + via fpj) + + ZOOKEEPER-1852. ServerCnxnFactory instance is not properly + cleanedup (Rakesh R via fpj) + + ZOOKEEPER-1414. QuorumPeerMainTest.testQuorum, testBadPackets are failing + intermittently (Rakesh R via michim) + + ZOOKEEPER-1057. zookeeper c-client, connection to offline server fails to + successfully fallback to second zk host (Germán Blanco via michim) + + ZOOKEEPER-1857. PrepRequestProcessotTest doesn't shutdown ZooKeeper server + (Germán Blanco via michim) + + ZOOKEEPER-1238. when the linger time was changed for NIO the patch missed + Netty (Skye Wanderman-Milne via fpj) + + ZOOKEEPER-1837. Fix JMXEnv checks (potential race conditions) + (Germán Blanco via fpj) + + ZOOKEEPER-1858. JMX checks - potential race conditions while stopping + and starting server (Rakesh R via fpj) + + ZOOKEEPER-1867. Bug in ZkDatabaseCorruptionTest (fpj) + + ZOOKEEPER-1872. QuorumPeer is not shutdown in few cases + (Rakesh R via fpj) + + ZOOKEEPER-1573. Unable to load database due to missing parent node + (Vinayakumar B via phunt, fpj) + + ZOOKEEPER-1811. The ZooKeeperSaslClient service name principal is + hardcoded to "zookeeper" (Harsh J via phunt) + + ZOOKEEPER-1873. Unnecessarily InstanceNotFoundException is coming when + unregister failed jmxbeans (Rakesh R via michim) + + ZOOKEEPER-1844. TruncateTest fails on windows (Rakesh R via fpj) + + ZOOKEEPER-1755. Concurrent operations of four letter 'dump' ephemeral + command and killSession causing NPE (Rakesh R via camille) + +IMPROVEMENTS: + + ZOOKEEPER-1564. Allow JUnit test build with IBM Java + (Paulo Ricardo Paz Vital via phunt) + + ZOOKEEPER-1598. Ability to support more digits in the version string + (Raja Aluri via phunt) + + ZOOKEEPER-1583. Document maxClientCnxns in conf/zoo_sample.cfg + (Christopher Tubbs via phunt) + + ZOOKEEPER-1584. Adding mvn-install target for deploying the + zookeeper artifacts to .m2 repository (Ashish Singh via phunt) + + ZOOKEEPER-1324. Remove Duplicate NEWLEADER packets from the + Leader to the Follower. (thawan, fpj via fpj) + + ZOOKEEPER-1615. minor typos in ZooKeeper Programmer's Guide web page + (Evan Zacks via phunt) + + ZOOKEEPER-1552. Enable sync request processor in Observer (thawan, fpj) + + ZOOKEEPER-1758. Add documentation for zookeeper.observer.syncEnabled flag + (thawan, fpj via thawan) + + ZOOKEEPER-1771. ZooInspector authentication (Benjamin Jaton via phunt) + + ZOOKEEPER-1627. Add org.apache.zookeeper.common to exported packages + in OSGi MANIFEST (Arnoud Glimmerveen via phunt) + + ZOOKEEPER-1666. Avoid Reverse DNS lookup if the hostname in + connection string is literal IP address. (George Cao via camille) + + ZOOKEEPER-1786. ZooKeeper data model documentation is incorrect + (Niraj Tolia via fpj) + + ZOOKEEPER-1715. Upgrade netty version (Sean Bridges via michim) + + ZOOKEEPER-1430. add maven deploy support to the build + (Giridharan Kesavan via phunt) + +Release 3.4.5 - 2012-09-30 + +Backward compatible changes: + +BUGFIXES: + + ZOOKEEPER-1376. zkServer.sh does not correctly check for + $SERVER_JVMFLAGS (Skye W-M via henryr) + + ZOOKEEPER-1550. ZooKeeperSaslClient does not finish anonymous login on + OpenJDK. (Eugene Koontz via mahadev) + + +Release 3.4.4 - 2012-09-17 + +Backward compatible changes: + +BUGFIXES: + + ZOOKEEPER-1466. QuorumCnxManager.shutdown missing synchronization. + (Patrick Hunt via mahadev) + + ZOOKEEPER-1386. avoid flaky URL redirection in "ant javadoc" : + replace "http://java.sun.com/javase/6/docs/api/" with + "http://download.oracle.com/javase/6/docs/api/" (Eugene Koontz via camille) + + ZOOKEEPER-1354. AuthTest.testBadAuthThenSendOtherCommands fails + intermittently (phunt via camille) + + ZOOKEEPER-1277. servers stop serving when lower 32bits of zxid roll + over (phunt) + + ZOOKEEPER-1412. java client watches inconsistently triggered on + reconnect (phunt) + + ZOOKEEPER-1344. ZooKeeper client multi-update command is not + considering the Chroot request (Rakesh R via phunt) + + ZOOKEEPER-1307. zkCli.sh is exiting when an Invalid ACL exception is + thrown from setACL command through client (Kavita Sharma via phunt) + + ZOOKEEPER-1390. some expensive debug code not protected by a check + for debug (breed via camille) + + ZOOKEEPER-1406. dpkg init scripts don't restart - missing + check_priv_sep_dir (Chris Beauchamp via phunt) + + ZOOKEEPER-1403. zkCli.sh script quoting issue (James Page via phunt) + + ZOOKEEPER-1384. test-cppunit overrides LD_LIBRARY_PATH and fails if + gcc is in non-standard location (Jay Shrauner via phunt) + + ZOOKEEPER-1419. Leader election never settles for a 5-node cluster + (flavio via camille) + + ZOOKEEPER-1256. ClientPortBindTest is failing on Mac OS X + (Daniel Gómez Ferro via phunt) + + ZOOKEEPER-1433. improve ZxidRolloverTest (test seems flakey) (phunt via henryr) + + ZOOKEEPER-1395. node-watcher double-free redux (Mike Lundy via henryr) + + ZOOKEEPER-1450. Backport of ZOOKEEPER-1294 fix to 3.4 and 3.3 (Norman Bishop via camille) + + ZOOKEEPER-1048. addauth command does not work in cli_mt/cli_st (allengao via michim) + + ZOOKEEPER-1339. C client doesn't build with --enable-debug (Eric Liang via michim) + + ZOOKEEPER-1318. In Python binding, get_children (and get and exists, and probably others) + with expired session doesn't raise exception properly (henryr via michim) + + ZOOKEEPER-1431. zkpython async calls leak memory (Kapil Thangavelu and Andre Cruz via henryr) + + ZOOKEEPER-1163. Memory leak in zk_hashtable.c:do_insert_watcher_object() + (Anupam Chanda via michim) + + ZOOKEEPER-1490. If the configured log directory does not exist + zookeeper will not start. Better to create the directory and start + (suja s via phunt) + + ZOOKEEPER-1210. Can't build ZooKeeper RPM with RPM >= 4.6.0 (i.e. on + RHEL 6 and Fedora >= 10) (Tadeusz Andrzej Kadłubowski via phunt) + + ZOOKEEPER-1236. Security uses proprietary Sun APIs + (Adalberto Medeiros via phunt) + + ZOOKEEPER-1471. Jute generates invalid C++ code + (Michi Mutsuzaki via phunt) + + ZOOKEEPER-1465. Cluster availability following new leader election + takes a long time with large datasets - is correlated to dataset size + (fpj and Thawan Kooburat via camille) + + ZOOKEEPER-1427. Writing to local files is done non-atomically (phunt) + + ZOOKEEPER-1489. Data loss after truncate on transaction log (phunt) + + ZOOKEEPER-1521. LearnerHandler initLimit/syncLimit problems + specifying follower socket timeout limits (phunt) + + ZOOKEEPER-1493. C Client: zookeeper_process doesn't invoke + completion callback if zookeeper_close has been called + (Michi Mutsuzaki via phunt and mahadev) + + ZOOKEEPER-1522. intermittent failures in Zab test due to NPE in + recursiveDelete test function (phunt via flavio) + + ZOOKEEPER-1514. FastLeaderElection - leader ignores the round + information when joining a quorum (flavio via henryr) + + ZOOKEEPER-1536 c client : memory leak in winport.c (brooklin via michim) + + ZOOKEEPER-1481 allow the C cli to run exists with a watcher (phunt via michim) + + ZOOKEEPER-1380. zkperl: _zk_release_watch doesn't remove items properly from + the watch list. (Botond Hejj via mahadev) + + ZOOKEEPER-1501. Nagios plugin always returns OK when it cannot connect to + zookeeper. (Brian Sutherland via mahadev) + + ZOOKEEPER-1494. C client: socket leak after receive timeout in + zookeeper_interest() (Michi Mutsuzaki via mahadev) + + ZOOKEEPER-1483. Fix leader election recipe documentation. (Michi Mutsuzaki + via mahadev) + + ZOOKEEPER-1496. Ephemeral node not getting cleared even after client has + exited (Rakesh R via mahadev) + +IMPROVEMENTS: + + ZOOKEEPER-1389. it would be nice if start-foreground used exec $JAVA + in order to get rid of the intermediate shell process + (Roman Shaposhnik via phunt) + + ZOOKEEPER-1377. add support for dumping a snapshot file content (similar to LogFormatter). (phunt via camille) + + ZOOKEEPER-1454. Document how to run autoreconf if cppunit is + installed in a non-standard directory (Michi Mutsuzaki via phunt) + + ZOOKEEPER-1503. remove redundant JAAS configuration code in SaslAuthTest and + SaslAuthFailTest (Eugene Koontz via phunt) + + ZOOKEEPER-1510. Should not log SASL errors for non-secure usage + (Todd Lipcon via phunt) + + ZOOKEEPER-1497. Allow server-side SASL login with JAAS configuration + to be programmatically set (rather than only by reading JAAS + configuration file) (Matteo Bertozzi via phunt) + + ZOOKEEPER-1437. Client uses session before SASL authentication complete. + (Eugene Koontz via mahadev) + + ZOOKEEPER-1361. Leader.lead iterates over 'learners' set without proper + synchronisation. (Henry Robinson via mahadev) + +Release 3.4.3 - 2012-02-06 + +Backward compatible changes: + +BUGFIXES: + + ZOOKEEPER-1089. zkServer.sh status does not work due to invalid + option of nc (Roman Shaposhnik via phunt) + + ZOOKEEPER-1345. Add a .gitignore file with general exclusions and + Eclipse project files excluded (Harsh J via phunt) + + ZOOKEEPER-1343. getEpochToPropose should check if lastAcceptedEpoch is greater or equal than epoch (fpj via breed) + + ZOOKEEPER-1358. In StaticHostProviderTest.java, testNextDoesNotSleepForZero tests that hostProvider.next(0) + doesn't sleep by checking that the latency of this call is less than 10sec (Alex Shraer via camille) + + ZOOKEEPER-1351. invalid test verification in MultiTransactionTest (phunt via camille) + + ZOOKEEPER-973. bind() could fail on Leader because it does not + setReuseAddress on its ServerSocket (Harsh J via phunt) + + ZOOKEEPER-1367. Data inconsistencies and unexpired ephemeral nodes after cluster restart. + (Bejamin Reed via mahadev) + + ZOOKEEPER-1353. C client test suite fails consistently. + (Clint Byrum via mahadev) + + ZOOKEEPER-1373. Hardcoded SASL login context name clashes with Hadoop security + configuration override. (Eugene Koontz and Thomas Weise via mahadev) + + ZOOKEEPER-1352. server.InvalidSnapshotTest is using connection timeouts that + are too short. (phunt via mahadev) + + ZOOKEEPER-1336. javadoc for multi is confusing, references functionality that doesn't + seem to exist (phunt via mahadev) + + ZOOKEEPER-1340. multi problem - typical user operations are + generating ERROR level messages in the server (phunt via mahadev) + + ZOOKEEPER-1374. C client multi-threaded test suite fails to + compile on ARM architectures. (James Page via mahadev) + + ZOOKEEPER-1337. multi's "Transaction" class is missing tests. + (phunt and camille via mahadev) + + ZOOKEEPER-1338. class cast exceptions may be thrown by multi + ErrorResult class (invalid equals) (phunt via mahadev) + +IMPROVEMENTS: + + ZOOKEEPER-1322. Cleanup/fix logging in Quorum code. (phunt via mahadev) + + ZOOKEEPER-1327. there are still remnants of hadoop urls. + (Harsh J via mahadev) + + +Release 3.4.2 - 2011-12-21 + +Backward compatible changes: + +BUGFIXES: + + ZOOKEEPER-1323. c client doesn't compile on freebsd + (michi mutsuzaki via phunt) + + ZOOKEEPER-1333. NPE in FileTxnSnapLog when restarting a cluster. + (Patrick Hunt and Andrew Mc Nair via mahadev) + +Release 3.4.1 - 2011-12-12 + +Backward compatible changes: + +BUGFIXES: + + ZOOKEEPER-1311. ZooKeeper test jar is broken (Ivan Kelly via phunt) + + ZOOKEEPER-1305. zookeeper.c:prepend_string func can dereference null ptr. + (Daniel Lescohier via mahadev) + + ZOOKEEPER-1316. zookeeper_init leaks memory if chroot is just '/'. + (Akira Kitada via mahadev) + + ZOOKEEPER-1315. zookeeper_init always reports sessionPasswd=. + (Akira Kitada via mahadev) + + ZOOKEEPER-1317. Possible segfault in zookeeper_init. + (Akira Kitada via mahadev) + + ZOOKEEPER-1319. Missing data after restarting+expanding a cluster. + (Patrick Hunt and Ben Reed via mahadev) + + ZOOKEEPER-1269. Multi deserialization issues (Camille Fournier via + mahadev) + +Release 3.4.0 - 2011-10-25 + +Non-backward compatible changes: + +BUGFIXES: + +Backward compatible changes: + +BUGFIXES: + + ZOOKEEPER-735. cppunit test testipv6 assumes that the machine is ipv6 + enabled. (mahadev) + + ZOOKEEPER-720. Use zookeeper-{version}-sources.jar instead of + zookeeper-{version}-src.jar to publish sources in the Maven repository + (paolo via phunt) + + ZOOKEEPER-722. zkServer.sh uses sh's builtin echo on BSD, behaves + incorrectly. (Ivan Kelly via phunt) + + ZOOKEEPER-741. root level create on REST proxy fails (phunt) + + ZOOKEEPER-631. zkpython's C code could do with a style clean-up + (henry robinson via phunt) + + ZOOKEEPER-746. learner outputs session id to log in dec (phunt via + henryr) + + ZOOKEEPER-738. zookeeper.jute.h fails to compile with -pedantic + (Jozef Hatala via phunt) + + ZOOKEEPER-734. QuorumPeerTestBase.java and ZooKeeperServerMainTest.java + do not handle windows path correctly (Vishal K via phunt) + + ZOOKEEPER-754. numerous misspellings "succesfully" + (Andrei Savu via phunt) + + ZOOKEEPER-749. OSGi metadata not included in binary only jar (phunt + via henryr) + + ZOOKEEPER-750. move maven artifacts into "dist-maven" subdir of the + release (package target) (phunt via henryr) + + ZOOKEEPER-758. zkpython segfaults on invalid acl with missing key + (Kapil Thangavelu via henryr) + + ZOOKEEPER-737. some 4 letter words may fail with netcat (nc). (mahadev) + + ZOOKEEPER-764. Observer elected leader due to inconsistent voting view + (henry via mahadev) + + ZOOKEEPER-763. Deadlock on close w/ zkpython / c client + (henry via phunt) + + ZOOKEEPER-774. Recipes tests are slightly outdated: they do not compile + against JUnit 4.8 (Sergey Doroshenko via phunt) + + ZOOKEEPER-772. zkpython segfaults when watcher from async get children is + invoked. (henry via phunt) + + ZOOKEEPER-636. configure.ac has instructions which override the contents of + CFLAGS and CXXFLAGS. (Maxim P. Dementiev via phunt) + + ZOOKEEPER-796. zkServer.sh should support an external PIDFILE variable + (Alex Newman via phunt) + + ZOOKEEPER-719. Add throttling to BookKeeper client (fpj via breed) + + ZOOKEEPER-814. monitoring scripts are missing apache license headers + (andrei savu via mahadev) + + ZOOKEEPER-783. committedLog in ZKDatabase is not properly synchronized + (henry via mahadev) + + ZOOKEEPER-790. Last processed zxid set prematurely while establishing + leadership (flavio via mahadev) + + ZOOKEEPER-795. eventThread isn't shutdown after a connection + "session expired" event coming (Sergey Doroshenko and Ben via mahadev) + + ZOOKEEPER-792. zkpython memory leak (Lei Zhang via henryr) + + ZOOKEEPER-854. BookKeeper does not compile due to changes in the ZooKeeper + code (Flavio via mahadev) + + ZOOKEEPER-861. Missing the test SSL certificate used for running junit tests. + (erwin tam via mahadev) + + ZOOKEEPER-867. ClientTest is failing on hudson - fd cleanup (phunt) + + ZOOKEEPER-785. Zookeeper 3.3.1 shouldn't infinite loop if someone creates a + server.0 line (phunt and Andrei Savu via breed) + + ZOOKEEPER-785. Zookeeper 3.3.1 shouldn't infinite loop if someone creates a + server.0 line (part 2) (phunt) + + ZOOKEEPER-870. Zookeeper trunk build broken. (mahadev via phunt) + + ZOOKEEPER-831. BookKeeper: Throttling improved for reads (breed via fpj) + + ZOOKEEPER-846. zookeeper client doesn't shut down cleanly on the close call + (phunt) + + ZOOKEEPER-804. c unit tests failing due to "assertion cptr failed" (michi + mutsuzaki via mahadev) + + ZOOKEEPER-844. handle auth failure in java client + (Camille Fournier via phunt) + + ZOOKEEPER-822. Leader election taking a long time to complete + (Vishal K via phunt) + + ZOOKEEPER-866. Hedwig Server stays in "disconnected" state when + connection to ZK dies but gets reconnected (erwin tam via breed) + + ZOOKEEPER-881. ZooKeeperServer.loadData loads database twice + (jared cantwell via breed) + + ZOOKEEPER-855. clientPortBindAddress should be clientPortAddress + (Jared Cantwell via fpj) + + ZOOKEEPER-888. c-client / zkpython: Double free corruption on + node watcher (Austin Shoemaker via henryr) + + ZOOKEEPER-893. ZooKeeper high cpu usage when invalid requests + (Thijs Terlouw via phunt) + + ZOOKEEPER-804. c unit tests failing due to "assertion cptr failed" + (second try - Jared Cantwell via phunt) + + ZOOKEEPER-820. update c unit tests to ensure "zombie" java server + processes don't cause failure (Michi Mutsuzaki via phunt) + + ZOOKEEPER-794. Callbacks are not invoked when the client is closed + (Alexis Midon via phunt) + + ZOOKEEPER-800. zoo_add_auth returns ZOK if zookeeper handle is in + ZOO_CLOSED_STATE (michi mutsuzaki via mahadev konar) + + ZOOKEEPER-904. super digest is not actually acting as a full superuser + (Camille Fournier via mahadev) + + ZOOKEEPER-897. C Client seg faults during close (jared cantwell via mahadev) + + ZOOKEEPER-898. C Client might not cleanup correctly during close + (jared cantwell via mahadev) + + ZOOKEEPER-907. Spurious "KeeperErrorCode = Session moved" messages (vishal k via breed) + + ZOOKEEPER-884. Remove LedgerSequence references from BookKeeper documentation and comments in tests (fpj via breed) + + ZOOKEEPER-916. Problem receiving messages from subscribed channels in c++ client (ivan via breed) + + ZOOKEEPER-930. Hedwig c++ client uses a non thread safe logging library (ivan via breed) + + ZOOKEEPER-900. FLE implementation should be improved to use non-blocking sockets (vishal via fpj) + + ZOOKEEPER-937. test -e not available on solaris /bin/sh (Erik Hetzner via mahadev) + + ZOOKEEPER-905. enhance zkServer.sh for easier zookeeper automation-izing (Nicholas Harteau via mahadev) + + ZOOKEEPER-913. Version parser fails to parse "3.3.2-dev" from build.xml (Anthony Urso and phunt via breed) + + ZOOKEEPER-957. zkCleanup.sh doesn't do anything (Ted Dunning via mahadev) + + ZOOKEEPER-958. Flag to turn off autoconsume in hedwig c++ client (Ivan Kelly + via mahadev) + + ZOOKEEPER-882. Startup loads last transaction from snapshot (j:ared via fpj) + + ZOOKEEPER-962. leader/follower coherence issue when follower is receiving a DIFF + (camille fournier via breed) + + ZOOKEEPER-902. Fix findbug issue in trunk "Malicious code vulnerability" + (flavio and phunt via phunt) + + ZOOKEEPER-985. Test BookieRecoveryTest fails on trunk. (fpj via breed) + + ZOOKEEPER-983. running zkServer.sh start remotely using ssh hangs (phunt) + + ZOOKEEPER-976. ZooKeeper startup script doesn't use JAVA_HOME (phunt) + + ZOOKEEPER-994 "eclipse" target in the build script doesnot include + libraray required for test classes in the classpath (MIS via phunt) + + ZOOKEEPER-1013 zkServer.sh usage message should mention all startup options + (eugene koontz via mahadev) + + ZOOKEEPER-1007. iarchive leak in C client (jeremy stribling via mahadev) + + ZOOKEEPER-993. Code improvements (MIS via fpj) + + ZOOKEEPER-1012. support distinct JVMFLAGS for zookeeper server in zkServer.sh + and zookeeper client in zkCli.sh (Eugene Koontz via breed) + + ZOOKEEPER-880. QuorumCnxManager$SendWorker grows without bounds (vishal via breed) + + ZOOKEEPER-1018. The connection permutation in get_addrs uses a weak and inefficient + shuffle (Stephen Tyree via breed) + + ZOOKEEPER-1028. In python bindings, zookeeper.set2() should return a stat dict but + instead returns None. (Chris Medaglia and Ivan Kelly via mahadev) + + ZOOKEEPER-975. new peer goes in LEADING state even if ensemble is online. (vishal via fpj) + + ZOOKEEPER-1049. Session expire/close flooding renders heartbeats to delay significantly. + (chang song via mahadev) + + ZOOKEEPER-1033. c client should install includes into INCDIR/zookeeper, not INCDIR/c-client-src + (Nicholas Harteau via mahadev) + + ZOOKEEPER-1061. Zookeeper stop fails if start called twice. (Ted Dunning via mahadev) + + ZOOKEEPER-1059. stat command isses on non-existing node causes NPE. (Bhallamudi Kamesh via mahadev) + + ZOOKEEPER-1058. fix typo in opToString for getData. (camille) + + ZOOKEEPER-1046. Creating a new sequential node results in a ZNODEEXISTS error. (Vishal K via camille) + + ZOOKEEPER-1069. Calling shutdown() on a QuorumPeer too quickly can lead to a corrupt log. (Vishal K via camille) + + ZOOKEEPER-1083. Javadoc for WatchedEvent not being generated. (Ivan Kelly via michim) + + ZOOKEEPER-1086. zookeeper test jar has non mavenised dependency. (Ivan Kelly via michim) + + ZOOKEEPER-335. zookeeper servers should commit the new leader txn to their logs. (breed) + + ZOOKEEPER-1081. modify leader/follower code to correctly deal with new leader (breed) + + ZOOKEEPER-1082. modify leader election to correctly take into account current epoch (fpj via breed) + + ZOOKEEPER-1060. QuorumPeer takes a long time to shutdown (Vishal via fpj) + + ZOOKEEPER-1087. ForceSync VM arguement not working when set to "no" (Nate Putnam via breed) + + ZOOKEEPER-1068. Documentation and default config suggest incorrect + location for Zookeeper state (Roman Shaposhnik via phunt) + + ZOOKEEPER-1103. In QuorumTest, use the same "for ( .. try { break } + catch { } )" pattern in testFollowersStartAfterLeaders as in + testSessionMove. (Eugene Koontz via phunt) + ZOOKEEPER-1046. Creating a new sequential node results in a ZNODEEXISTS error. (breed via camille) + + ZOOKEEPER-1097. Quota is not correctly rehydrated on snapshot reload (camille via henryr) + + ZOOKEEPER-1046. Small fix: Creating a new sequential node results in a ZNODEEXISTS error. (Vishal K via camille) + + ZOOKEEPER-782. Incorrect C API documentation for Watches. (mahadev via breed) + + ZOOKEEPER-1063. Dubious synchronization in Zookeeper and ClientCnxnSocketNIO classes (Yanick Dufresne via breed) + + ZOOKEEPER-1124. Multiop submitted to non-leader always fails due to timeout (Marshall McMullen via breed) + + ZOOKEEPER-1111. JMXEnv uses System.err instead of logging + (Ivan Kelly via phunt) + + ZOOKEEPER-1027. chroot not transparent in zoo_create() (Thijs Terlouw via + mahadev) + + ZOOKEEPER-1109. Zookeeper service is down when SyncRequestProcessor meets + any exception. (Laxman via mahadev) + + ZOOKEEPER-1134. ClientCnxnSocket string comparison using == rather than equals. + (phunt via mahadev) + + ZOOKEEPER-1119. zkServer stop command incorrectly reading comment lines in + zoo.cfg (phunt via mahadev) + + ZOOKEEPER-1090. Race condition while taking snapshot can lead to not restoring data tree correctly (Vishal K via breed) + + ZOOKEEPER-1138. release audit failing for a number of new files. (phunt via mahadev) + + ZOOKEEPER-1139. jenkins is reporting two warnings, fix these (phunt via mahadev) + + ZOOKEEPER-1142. incorrect stat output (phunt via mahadev) + + ZOOKEEPER-1144. ZooKeeperServer not starting on leader due to a race condition (Vishal K via camille) + + ZOOKEEPER-839. deleteRecursive does not belong to the other methods. + (mahadev) + + ZOOKEEPER-1146. significant regression in client (c/python) performance. + (phunt via mahadev) + + ZOOKEEPER-1150. fix for this patch to compile on windows. (dheeraj + via mahadev) + + ZOOKEEPER-1055. check for duplicate ACLs in addACL() and create(). + (Eugene Koontz via mahadev) + + ZOOKEEPER-1141. zkpython fails tests under python 2.4. (phunt via mahadev) + + ZOOKEEPER-1025. zkCli is overly sensitive to to spaces. (Laxman via camille) + + ZOOKEEPER-1117. zookeeper 3.3.3 fails to build with gcc >= 4.6.1 on + Debian/Ubuntu (James Page via mahadev) + + ZOOKEEPER-1140. server shutdown is not stopping threads. (laxman via mahadev) + + ZOOKEEPER-1051. SIGPIPE in Zookeeper 0.3.* when send'ing after + cluster disconnection (Stephen Tyree via mahadev) + + ZOOKEEPER-1168. ZooKeeper fails to run with IKVM (Andrew Finnell via phunt) + + ZOOKEEPER-1165. better eclipse support in tests (Warren Turkal via phunt) + + ZOOKEEPER-1154. Data inconsistency when the node(s) with the highest zxid is not present at the time of leader election. (Vishal Kathuria via camille) + + ZOOKEEPER-1156. Log truncation truncating log too much - can cause data loss. (Vishal Kathuria via camille) + + ZOOKEEPER-1160. test timeouts are too small (breed via phunt) + + ZOOKEEPER-731. Zookeeper#delete , #create - async versions miss a verb in the javadoc. (Thomas Koch via camille) + + ZOOKEEPER-1108. Various bugs in zoo_add_auth in C. (Dheeraj Agrawal via mahadev) + + ZOOKEEPER-981. Hang in zookeeper_close() in the multi-threaded C client. + (Jeremy Stribling via mahadev) + + ZOOKEEPER-1125. Intermittent java core test failures. (Vishar Kher via mahadev) + + ZOOKEEPER-961. Watch recovery after disconnection when connection string contains a prefix. + (Matthias Spycher via mahadev) + + ZOOKEEPER-1136. NEW_LEADER should be queued not sent to match the Zab 1.0 protocol + on the twiki (breed via mahadev) + + ZOOKEEPER-1189. For an invalid snapshot file(less than 10bytes size) RandomAccessFile + stream is leaking. (Rakesh R via mahadev) + + ZOOKEEPER-1185. Send AuthFailed event to client if SASL authentication fails. + (Eugene Kuntz via mahadev) + + ZOOKEEPER-1174. FD leak when network unreachable (Ted Dunning via camille) + + ZOOKEEPER-1203. Zookeeper systest is missing Junit Classes + (Prashant Gokhale via phunt) + + ZOOKEEPER-1206. Sequential node creation does not use always use + digits in node name given certain Locales. (Mark Miller via phunt) + + ZOOKEEPER-1212. zkServer.sh stop action is not conformat with LSB + para 20.2 Init Script Actions (Roman Shaposhnik via phunt) + + ZOOKEEPER-1190. ant package is not including many of the bin scripts + in the package (zkServer.sh for example) (Eric Yang via phunt) + + ZOOKEEPER-1181. Fix problems with Kerberos TGT renewal. + (Eugene Koontz via mahadev) + + ZOOKEEPER-1264. FollowerResyncConcurrencyTest failing intermittently. (phunt via camille) + + ZOOKEEPER-1268. problems with read only mode, intermittent test failures + and ERRORs in the log. (phunt via mahadev) + + ZOOKEEPER-1246. Dead code in PrepRequestProcessor catch Exception block. (camille) + + ZOOKEEPER-1271. testEarlyLeaderAbandonment failing on solaris - + clients not retrying connection (mahadev via phunt) + + ZOOKEEPER-1192. Leader.waitForEpochAck() checks waitingForNewEpoch instead + of checking electionFinished (Alexander Shraer via mahadev) + + ZOOKEEPER-1270. testEarlyLeaderAbandonment failing intermittently, + quorum formed, no serving. (Flavio, Camille and Alexander Shraer via mahadev) + + ZOOKEEPER-1264. FollowerResyncConcurrencyTest failing + intermittently. (breed, camille and Alex Shraer via camille) + + ZOOKEEPER-1282. Learner.java not following Zab 1.0 protocol - + setCurrentEpoch should be done upon receipt of NEWLEADER + (before acking it) and not upon receipt of UPTODATE (breed via camille) + + ZOOKEEPER-1291. AcceptedEpoch not updated at leader before it proposes the epoch to followers. (Alex Shraer via camille) + + ZOOKEEPER-1208. Ephemeral node not removed after the client session is long gone. (phunt via camille) + + ZOOKEEPER-1239. add logging/stats to identify fsync stalls. (phunt via camille) + + ZOOKEEPER-1299. Add winconfig.h file to ignore in release audit. (mahadev) + +IMPROVEMENTS: + ZOOKEEPER-724. Improve junit test integration - log harness information + (phunt via mahadev) + + ZOOKEEPER-766. forrest recipes docs don't mention the lock/queue recipe + implementations available in the release (phunt via mahadev) + + ZOOKEEPER-769: Leader can treat observers as quorum members + (Sergey Doroshenko via henryr) + + ZOOKEEPER-788: Add server id to message logs + (Ivan Kelly via flavio) + + ZOOKEEPER-789. Improve FLE log messages (flavio via phunt) + + ZOOKEEPER-798. Fixup loggraph for FLE changes (Ivan Kelly via phunt) + + ZOOKEEPER-797 c client source with AI_ADDRCONFIG cannot be compiled with + early glibc (Qian Ye via phunt) + + ZOOKEEPER-790. Last processed zxid set prematurely while establishing leadership + (fpj via breed) + + ZOOKEEPER-821. Add ZooKeeper version information to zkpython (Rich + Schumacher via mahadev) + + ZOOKEEPER-765. Add python example script (Travis and Andrei via mahadev) + + ZOOKEEPER-809. Improved REST Interface (Andrei Savu via phunt) + + ZOOKEEPER-733. use netty to handle client connections (breed and phunt) + + ZOOKEEPER-853. Make zookeeper.is_unrecoverable return True or False + in zkpython (Andrei Savu via henryr) + + ZOOKEEPER-864. Hedwig C++ client improvements (Ivan Kelly via breed) + + ZOOKEEPER-862. Hedwig created ledgers with hardcoded Bookkeeper ensemble and + quorum size. Make these a server config parameter instead. (Erwin T via breed) + + ZOOKEEPER-926. Fork Hadoop common's test-patch.sh and modify for Zookeeper. + (nigel) + + ZOOKEEPER-909. Extract NIO specific code from ClientCnxn + (Thomas Koch via phunt) + + ZOOKEEPER-908. Remove code duplication and inconsistent naming in + ClientCnxn.Packet creation (Thomas Koch via phunt) + + ZOOKEEPER-836. hostlist as string. (Thomas Koch via breed) + + ZOOKEEPER-921. zkPython incorrectly checks for existence of required + ACL elements (Nicholas Knight via henryr) + + ZOOKEEPER-963. Make Forrest work with JDK6 (Carl Steinbach via henryr) + + ZOOKEEPER-500. Async methods shouldnt throw exceptions (fpj via breed) + + ZOOKEEPER-977. passing null for path_buffer in zoo_create (breed via mahadev) + + ZOOKEEPER-465. Ledger size in bytes. (flavio via mahadev) + + ZOOKEEPER-980. allow configuration parameters for log4j.properties + (phunt via mahadev) + + ZOOKEEPER-1042. Generate zookeeper test jar for maven installation + (ivan kelly via breed) + + ZOOKEEPER-1030: Increase default for maxClientCnxns + (Todd Lipcon via breed/mahadev/phunt) + + ZOOKEEPER-850: Switch from log4j to slf4j (Olaf Krische via michim) + + ZOOKEEPER-874. FileTxnSnapLog.restore does not call listener (diogo via fpj) + + ZOOKEEPER-1052. Findbugs warning in QuorumPeer.ResponderThread.run() (fpj via michim) + + ZOOKEEPER-1094. Small improvements to LeaderElection and Vote classes (henryr via breed) + + ZOOKEEPER-1074. zkServer.sh is missing nohup/sleep, which are necessary + for remote invocation. (phunt via mahadev) + + ZOOKEEPER-965. Need a multi-update command to allow multiple znodes to be updated safely (Marshall McMullen and Ted Dunning via breed) + + ZOOKEEPER-1073. address a documentation issue in ZOOKEEPER-1030. (phunt via mahadev) + + ZOOKEEPER-1095. Simple leader election recipe + (Eric Sammer via henry and phunt) + + ZOOKEEPER-1076. some quorum tests are unnecessarily extending QuorumBase (phunt via mahadev) + + ZOOKEEPER-1143. quorum send & recv workers are missing thread names + (phunt via mahadev) + + ZOOKEEPER-1104. CLONE - In QuorumTest, use the same "for ( .. try { break } + catch { } )" pattern in testFollowersStartAfterLeaders as in testSessionMove. + (Eugene Koontz via mahadev) + + ZOOKEEPER-1034. perl bindings should automatically find the zookeeper + c-client headers (nicholas harteau via mahadev) + + ZOOKEEPER-1166. Please add a few svn:ignore properties (via phunt) + + ZOOKEEPER-1169. Fix compiler (eclipse) warnings in (generated) jute + code (Thomas Koch via phunt) + + ZOOKEEPER-1171. fix build for java 7 (phunt via mahadev) + + ZOOKEEPER-1201. Clean SaslServerCallbackHandler.java. (Thomas Koch + via mahadev) + + ZOOKEEPER-1321. Add number of client connections metric in JMX and srvr. (Neha Narkhede via camille) + +NEW FEATURES: + ZOOKEEPER-729. Java client API to recursively delete a subtree. + (Kay Kay via henry) + + ZOOKEEPER-747. Add C# generation to Jute (Eric Hauser via phunt) + + ZOOKEEPER-464. Need procedure to garbage collect ledgers + (erwin via fpj) + + ZOOKEEPER-773. Log visualisation (Ivan Kelly via phunt) + + ZOOKEEPER-744. Add monitoring four-letter word (Andrei Savu via phunt) + + ZOOKEEPER-712. Bookie recovery. (erwin tam via breed) + + ZOOKEEPER-799. Add tools and recipes for monitoring as a contrib + (Andrei Savu via phunt) + + ZOOKEEPER-808. Web-based Administrative Interface + (Andrei Savu via phunt) + + ZOOKEEPER-775. A large scale pub/sub system (Erwin, Ivan and Ben via + mahadev) + + ZOOKEEPER-1020. Implement function in C client to determine which host you're currently connected to. (stephen tyree via breed) + + ZOOKEEPER-1038. Move bookkeeper and hedwig code in subversion (breed) + + ZOOKEEPER-784. Server-side functionality for read-only mode (Sergey Doroshenko via henryr) + + ZOOKEEPER-992. MT Native Version of Windows C Client (Dheeraj Agrawal via michim) + + ZOOKEEPER-938. Support Kerberos authentication of clients. (Eugene Koontz + via mahadev) + + ZOOKEEPER-1152. Exceptions thrown from handleAuthentication can cause buffer corruption issues in NIOServer. (camille via breed) + + ZOOKEEPER-999. Create an package integration project (Eric Yang via phunt) + + ZOOKEEPER-1107. automating log and snapshot cleaning (Laxman via phunt) + +DEPRECATION: + ZOOKEEPER-1153. Deprecate AuthFLE and LE. (Flavio Junqueira via mahadev) + +Release 3.3.0 - 2010-03-24 + +Non-backward compatible changes: + +BUGFIXES: + +Backward compatible changes: + +BUGFIXES: + ZOOKEEPER-59. Synchronized block in NIOServerCnxn (fpj via breed) + + ZOOKEEPER-524. DBSizeTest is not really testing anything (breed) + + ZOOKEEPER-469. make sure CPPUNIT_CFLAGS isn't overwritten + (chris via mahadev) + + ZOOKEEPER-471. update zkperl for 3.2.x branch (chris via mahadev) + + ZOOKEEPER-470. include unistd.h for sleep() in c tests (chris via mahadev) + + ZOOKEEPR-460. bad testRetry in cppunit tests (hudson failure) + (giri via mahadev) + + ZOOKEEPER-467. Change log level in BookieHandle. (flavio via mahadev) + + ZOOKEEPER-482. ignore sigpipe in testRetry to avoid silent immediate + failure. (chris via mahadev) + + ZOOKEEPER-487. setdata on root (/) crashes the servers (mahadev via phunt) + + ZOOKEEPER-457. Make ZookeeperMain public, support for HBase (and other) + embedded clients (ryan rawson via phunt) + + ZOOKEEPER-481. Add lastMessageSent to QuorumCnxManager. (flavio via mahadev) + + ZOOKEEPER-479. QuorumHierarchical does not count groups correctly + (flavio via mahadev) + + ZOOKEEPER-466. crash on zookeeper_close() when using auth with empty cert + (Chris Darroch via phunt) + + ZOOKEEPER-480. FLE should perform leader check when node is not leading and + add vote of follower (flavio via mahadev) + + ZOOKEEPER-491. Prevent zero-weight servers from being elected. + (flavio via mahadev) + + ZOOKEEPER-447. zkServer.sh doesn't allow different config files to be + specified on the command line (henry robinson via phunt) + + ZOOKEEPER-493. patch for command line setquota (steve bendiola via phunt) + + ZOOKEEPER-311. handle small path lengths in zoo_create() + (chris barroch via breed) + + ZOOKEEPER-484. Clients get SESSION MOVED exception when switching from + follower to a leader. (mahadev) + + ZOOKEEPER-490. the java docs for session creation are misleading/incomplete + (phunt) + + ZOOKEEPER-501. CnxManagerTest failed on hudson. (flavio via mahadev) + + ZOOKEEPER-499. electionAlg should default to FLE (3) - regression + (phunt via mahadev) + + ZOOKEEPER-477. zkCleanup.sh is flaky (fernando via mahadev) + + ZOOKEEPER-498. Unending Leader Elections : WAN configuration + (flavio via mahadev) + + ZOOKEEPER-508. proposals and commits for DIFF and Truncate messages from the + leader to the followers is buggy. (mahadev and ben via mahadev) + + ZOOKEEPER-518. DEBUG message for outstanding proposals in leader should be + moved to trace. (phunt) + + ZOOKEEPER-533. ant error running clean twice (phunt via mahadev) + + ZOOKEEPER-535. ivy task does not enjoy being defined twice + (build error) (phunt via mahadev) + + ZOOKEEPER-420. build/test should not require install in zkpython + (henry robinson via phunt) + + ZOOKEEPER-538. zookeeper.async causes python to segfault + (henry robinson via phunt) + + ZOOKEEPER-542. c-client can spin when server unresponsive (Christian + Wiedmann via mahadev) + + ZOOKEEEPER-510. zkpython lumps all exceptions as IOError, needs specialized + exceptions for KeeperException types (henry & pat via mahadev) + + ZOOKEEPER-541. zkpython limited to 256 handles (henry robinson via phunt) + + ZOOKEEPER-554. zkpython can segfault when statting a deleted node + (henry robinson via phunt) + + ZOOKEEPER-512. FLE election fails to elect leader (flavio via mahadev) + + ZOOKEEPER-563. ant test for recipes is broken. (mahadev via phunt) + + ZOOKEEPER-562. c client can flood server with pings if tcp send queue + filled. (ben reed via mahadev) + + ZOOKEEPER-537. The zookeeper jar includes the java source files + (Thomas Dudziak via phunt) + + ZOOKEEPER-551. unnecessary SetWatches message on new session. + (phunt via flavio) + + ZOOKEEPER-566. "reqs" four letter word (command port) returns no information + (phunt via breed) + + ZOOKEEPER-567. javadoc for getchildren2 needs to mention "new in 3.3.0" + (phunt via breed) + + ZOOKEEPER-547. Sanity check in QuorumCnxn Manager and quorum communication + port. (mahadev via breed) + + ZOOKEEPER-532. java compiler should be target Java 1.5 + (hiram chirino and phunt via breed) + + ZOOKEEPER-519. Followerhandler should close the socket if it gets an exception + on a write. (mahadev via breed) + + ZOOKEEPER-570. AsyncHammerTest is broken, callbacks need to validate rc + parameter (phunt via breed) + + ZOOKEEPER-3. syncLimit has slightly different comments in the class header, + and > inline with the variable. (mahadev via breed) + + ZOOKEEPER-576. docs need to be updated for session moved exception and how + to handle it (breed via phunt) + + ZOOKEEPER-582. ZooKeeper can revert to old data when a snapshot is created + outside of normal processing (ben reed and mahadev via mahadev) + + ZOOKEEPER-597. ASyncHammerTest is failing intermittently on hudson trunk + (Patrick Hunt via mahadev) + + ZOOKEEPER-598. LearnerHandler is misspelt in the thread's constructor + (Henry Robinson via fpj) + + ZOOKEEPER-597. ASyncHammerTest is failing intermittently on hudson trunk (take 2) + (breed) + + ZOOKEEPER-597. ASyncHammerTest is failing intermittently on hudson trunk + (take 3) (phunt via mahadev) + + ZOOKEEPER-597. ASyncHammerTest is failing intermittently on hudson trunk + (take 4) (breed via mahadev) + + ZOOKEEPER-597. ASyncHammerTest is failing intermittently on hudson trunk + (take 5) (mahadev) + + ZOOKEEPER-611. hudson build failiure (mahadev) + + ZOOKEEPER-611. hudson build failure (take 2) (mahadev) + + ZOOKEEPER-615. wrong javadoc for create with a sequence flag + (mahadev via breed) + + ZOOKEEPER-588. remove unnecessary/annoying log of tostring error in + Request.toString() (phunt via breed) + + ZOOKEEPER-587. client should log timeout negotiated with server + (phunt via mahadev) + + ZOOKEEPER-610. cleanup final fields, esp those used for locking + (phunt via henry) + + ZOOKEEPER-614. Improper synchronisation in getClientCnxnCount + (henry via mahadev) + + ZOOKEEPER-609. ObserverTest failure "zk should not be connected expected not + same" (henry robinson via phunt) + + ZOOKEEPER-630. Trunk has duplicate ObserverTest.java files + (henry robinson via phunt) + + ZOOKEEPER-627. zkpython arbitrarily restricts the size of a 'get' to 512 + bytes (henry robinson via mahadev) + + ZOOKEEPER-534. The test target in contib/bookkeeper does not depend on jar + target. (phunt via mahadev) + + ZOOKEEPER-623. ClientBase in bookkeeper.util requires junit (fpj via breed) + + ZOOKEEPER-600. TODO pondering about allocation behavior in zkpython may be + removed (gustavo via mahadev) + + ZOOKEEPER-596. The last logged zxid calculated by zookeeper servers could + cause problems in leader election if data gets corrupted. (mahadev) + + ZOOKEEPER-637. Trunk build is failing (fpj via breed) + + ZOOKEEPER-637. Trunk build is failing - second patch (breed via fpj) + + ZOOKEEPER-644. Nightly build failed on hudson. (pat via mahadev) + + ZOOKEEPER-651: Log exception trace in QuorumCnxManager.SendWorker + (flavio via henry) + + ZOOKEEPER-608. Receipt of ACK from observer should not be logged as ERROR + (henry via mahadev) + + ZOOKEEPER-647. hudson failure in testLeaderShutdown (flavio via mahadev) + + ZOOKEEPER-574. the documentation on snapcount in the admin guide has the + wrong default (phunt via mahadev) + + ZOOKEEPER-656. SledgeHammer test - thread.run() deprecated (kay kay via mahadev) + + ZOOKEEPER-413. two flaws need addressing in the c tests that can cause false + positive failures (phunt via mahadev) + + ZOOKEEPER-495. c client logs an invalid error when zookeeper_init is called + with chroot (phunt via mahadev) + + ZOOKEEPER-589. When create a znode, a NULL ACL parameter cannot be accepted. + (breed via mahadev) + + ZOOKEEPER-673. Fix observer documentation regarding leader election (flavio + via mahadev) + + ZOOKEEPER-672. typo nits across documentation (Kay Kay via mahadev) + + ZOOKEEPER-668. Close method in LedgerInputStream doesn't do anything (flavio + via mahadev) + + ZOOKEEPER-569. Failure of elected leader can lead to never-ending leader + election (henry via flavio) + + ZOOKEEPER-669. watchedevent tostring should clearly output the + state/type/path (phunt via mahadev) + + ZOOKEEPER-683. LogFormatter fails to parse transactional log files (phunt + via mahadev) + + ZOOKEEPER-682. Event is not processed when the watcher is set to watch "/" + if chrooted (Scott Wang via mahadev) + + ZOOKEEPER-687. LENonterminatetest fails on some machines. (mahadev) + + ZOOKEEPER-681. Minor doc issue re unset maxClientCnxns (phunt via mahadev) + + ZOOKEEPER-622. Test for pending watches in send_set_watches should be moved + (ben and steven via mahadev) + + ZOOKEEPER-689. release build broken - ivysettings.xml not copied during + "package" (phunt via mahadev) + + ZOOKEEPER-59. Synchronized block in NIOServerCnxn (flavio via mahadev) + + ZOOKEEPER-691. Interface changed for NIOServer.Factory (breed via mahadev) + + ZOOKEEPER-685. Race in LENonTerminateTest (henry via breed) + + ZOOKEEPER-677. c client doesn't allow ipv6 numeric connect string + (breed & phunt & mahadev via breed) + + ZOOKEEPER-693. TestObserver stuck in tight notification loop in FLE + (flavio via phunt) + + ZOOKEEPER-696. NPE in the hudson logs, seems nioservercnxn closed twice + (phunt via mahadev) + + ZOOKEEPER-511. bad error handling in FollowerHandler.sendPackets + (mahadev via flavio) + + ZOOKEEPER-604. zk needs to prevent export of any symbol not listed in their + api (mahadev) + + ZOOKEEPER-121. SyncRequestProcessor is not closing log stream during + shutdown (mahadev) + + ZOOKEEPER-698. intermittent JMX test failures due to not verifying QuorumPeer + shutdown (phunt) + + ZOOKEEPER-121_2. SyncRequestProcessor is not closing log stream during + shutdown (breed via mahadev) + + ZOOKEEPER-121_3. SyncRequestProcessor is not closing log stream during + shutdown (mahadev via phunt) + + ZOOKEEPER-121_4. SyncRequestProcessor is not closing log stream during + shutdown (mahadev via breed) + + ZOOKEEPER-586. c client does not compile under cygwin (phunt, mahadev, breed via breed) + + ZOOKEEPER-624. The C Client cause core dump when receive error data from + Zookeeper Server (mahadev) + + ZOOKEEPER-591. The C Client cannot exit properly in some situation (mahadev) + + ZOOKEEPER-591_2. The C Client cannot exit properly in some situation + (mahadev via phunt) + + ZOOKEEPER-709. bookkeeper build failing with missing factory + (phunt) + + ZOOKEEPER-708. zkpython failing due to undefined symbol + deallocate_String_vector (mahadev via phunt) + + ZOOKEEPER-436. Bookies should auto register to ZooKeeper (erwin tam & fpj via breed) + + ZOOKEEPER-710. permanent ZSESSIONMOVED error after client app reconnects to zookeeper cluster (phunt via breed) + + ZOOKEEPER-718. the fatjar is missing libraries (ben via mahadev) + + ZOOKEEPER-717. add a preferred list to the instancemanager (breed via + mahadev) + +IMPROVEMENTS: + ZOOKEEPER-473. cleanup junit tests to eliminate false positives due to + "socket reuse" and failure to close client (phunt via mahadev) + + ZOOKEEPER-488. Fix zkServer.sh to add clover.jar in classpath + (Giridharan Kesavan via gkesavan) + + ZOOKEEPER-516. add support for 10 minute test ie "pre-commit" test (phunt) + + ZOOKEEPER-529. Use Ivy to pull dependencies and also generate pom (phunt + via mahadev) + + ZOOKEEPER-530. Memory corruption: Zookeeper c client IPv6 implementation + does not honor struct sockaddr_in6 size (isabel drost via mahadev) + + ZOOKEEPER-549. Refactor Followers and related classes into a Peer->Follower + hierarchy in preparation for Observers (henry robinson via mahadev) + + ZOOKEEPER-472. Making DataNode not instantiate a HashMap when the node is + ephmeral (Erik Holstad via mahadev) + + ZOOKEEPER-425. Add OSGi metadata to zookeeper.jar (david bosschaert via breed) + + ZOOKEEPER-599. Changes to FLE and QuorumCnxManager to support Observers + (fpj via breed) + + ZOOKEEPER-506. QuorumBase should use default leader election (fpj via breed) + + ZOOKEEPER-633. Fetch netty using ivy for bookkeeper (giri via fpj) + + ZOOKEEPER-544. improve client testability - allow test client to access + connected server location (phunt via breed) + + ZOOKEEPER-426. Windows versions of zookeeper scripts + (David Bosschaert via breed) + + ZOOKEEPER-638. upgrade ivy to 2.1.0 final from 2.1.0 release + candidate (phunt via breed) + + ZOOKEEPER-648. Fix releaseaudit warning count to zero (phunt via henry) + + ZOOKEEPER-626. ensure the c/java cli's print xid/sessionid/etc... in hex + (pat via mahadev) + + ZOOKEEPER-655. StringBuffer -> StringBuilder - conversion of references as + necessary (Kay Kay via henry) + + ZOOKEEPER-612. Make Zookeeper C client can be compiled by gcc of early + version (qian via mahadev) + + ZOOKEEPER-456. CREATOR_ALL_ACL has unnecessary PERMS.ADMIN in the + declartion. (phunt via mahadev) + + ZOOKEEPER-593. java client api does not allow client to access negotiated + session timeout (phunt via mahadev) + + ZOOKEEPER-507. BookKeeper client re-write (Utkarsh and ben via mahadev) + + ZOOKEEPER-665. Add BookKeeper streaming documentation (flavio via mahadev) + + ZOOKEEPER-664. BookKeeper API documentation (flavio via mahadev) + + ZOOKEEPER-607. improve bookkeeper overview (flavio via mahadev) + + ZOOKEEPER-485. Need ops documentation that details supervision of ZK server + processes. (phunt via mahadev) + + ZOOKEEPER-658. update forrest docs - AuthFLE no longer supported (flavio via + mahadev) + + ZOOKEEPER-640. make build.xml more configurable to ease packaging for linux + distros (phunt via mahadev) + + ZOOKEEPER-579. zkpython needs more test coverage for ACL code paths (henry + via mahadev) + + ZOOKEEPER-688. explain session expiration better in the docs & faq (phunt + via mahadev) + + ZOOKEEPER-663. hudson failure in ZKDatabaseCorruptionTest (mahadev via henryr) + + ZOOKEEPER-543. Tests for ZooKeeper examples (steven via mahadev) + + ZOOKEEPER-692. upgrade junit to latest version (4.8.1) (phunt via mahadev) + + ZOOKEEPER-601. allow configuration of session timeout min/max bounds (phunt + via mahadev) + +NEW FEATURES: + ZOOKEEPER-539. generate eclipse project via ant target. (phunt via mahadev) + + ZOOKEEPER-555. Add stat information to GetChildrenResponse. (Arni Jonson and + phunt via mahadev) + + ZOOKEEPER-550. Java Queue Recipe. (steven cheng via mahadev) + + ZOOKEEPER-368. Observers: core functionality (henry robinson via mahadev) + + ZOOKEEPER-496. zookeeper-tree utility for export, import and incremental + updates (anirban roy via breed) + + ZOOKEEPER-572. add ability for operator to examine state of watches + currently registered with a server (phunt via mahadev) + + ZOOKEEPER-678. Gui browser application to view and edit the contents of a + zookeeper instance (Colin Goodheart-Smithe via phunt) + + ZOOKEEPER-635. Server supports listening on a specified network address (phunt via breed) + +Release 3.2.0 - 2009-06-30 + +Non-backward compatible changes: + +BUGFIXES: + ZOOKEEPER-444. perms definition for PERMS_ALL differ in C and java (mahadev) + +Backward compatible changes: + +BUGFIXES: + ZOOKEEPER-303. Bin scripts dont work on a Mac. (tom white via mahadev) + + ZOOKEEPER-330. zookeeper standalone server does not startup with just a + port and datadir. (chris darroch and mahadev) + + ZOOKEEPER-319. add locking around auth info in zhandle_t. + (chris darroch via mahadev) + + ZOOKEEPER-320. call auth completion in free_completions(). + (chris darroch via mahadev) + + ZOOKEEPER-334. bookkeeper benchmark (testclient.java) has compiling errors. + (flavio and mahadev) + + ZOOKEEPER-281. autoreconf fails for /zookeeper-3.0.1/src/c/ (phunt) + + ZOOKEEPER-318. remove locking in zk_hashtable.c or add locking in + collect_keys() (chris darroch via mahadev) + + ZOOKEEPER-333. helgrind thread issues identified in mt c client code + (mahadev via phunt) + + ZOOKEEPER-309. core dump using zoo_get_acl() (mahadev via phunt) + + ZOOKEEPER-341. regression in QuorumPeerMain, + tickTime from config is lost, cannot start quorum (phunt via mahadev) + + ZOOKEEPER-360. WeakHashMap in Bookie.java causes NPE (flavio via mahadev) + + ZOOKEEPER-362. Issues with FLENewEpochTest. (fix bug in Fast leader election) + (flavio via mahadev) + + ZOOKEEPER-363. NPE when recovering ledger with no hint. (flavio via mahadev) + + ZOOKEEPER-370. Fix critical problems reported by findbugs. + (flavio via mahadev) + + ZOOKEEPER-347. zkfuse uses non-standard String. (patrick hunt via mahadev) + + ZOOKEEPER-355. make validatePath non public in Zookeeper client api. + (phunt via mahadev) + + ZOOKEEPER-374. Uninitialized struct variable in C causes warning which + is treated as an error (phunt via mahadev) + + ZOOKEEPER-337. improve logging in leader election lookForLeader method when + address resolution fails (phunt via mahadev) + + ZOOKEEPER-367. RecoveryTest failure - "unreasonable length" IOException + (mahadev via phunt) + + ZOOKEEPER-346. remove the kill command fro mthe client port. + (phunt via mahadev) + + ZOOKEEPER-377. running ant cppunit tests, a failure still results in + BUILD SUCCESSFUL (giri via mahadev) + + ZOOKEEPER-382. zookeeper cpp tests fails on 64 bit machines with gcc 4.1.2 + (mahadev via phunt) + + ZOOKEEPER-365. javadoc is wrong for setLast in LedgerHandle + (flavio via phunt) + + ZOOKEEPER-392. Change log4j properties in bookkeeper. (flavio via mahadev) + + ZOOKEEPER-400. Issues with procedure to close ledger. (flavio) + + ZOOKEEPER-405. nullpointer exception in zookeeper java shell. + (mahadev via breed) + + ZOOKEEPER-410. address all findbugs warnings in client/server classes. + (phunt via breed) + + ZOOKEEPER-403. cleanup javac compiler warnings. (flavio via breed) + + ZOOKEEPER-407. address all findbugs warnings in + org.apache.zookeeper.server.quorum.** packages. + (flavio via breed) + + ZOOKEEPER-411. Building zookeeper fails on RHEL 5 64 bit during test-cppunit + (mahadev via phunt) + + ZOOKEEPER-402. zookeeper c library segfaults on data for a node in zookeeper + being null. (mahadev via phunt) + + ZOOKEEPER-415. zookeeper c tests hang. (mahadev via phunt) + + ZOOKEEPER-385. crctest failed on hudson patch test (mahadev via phunt) + + ZOOKEEPER-192. trailing whitespace in config file can cause number format + exceptions (phunt via breed) + + ZOOKEEPER-409. address all findbugs warnings in jute related classes + (phunt via breed) + + ZOOKEEPER-416. bookkeeper jar includes unnnecessary files. + (flavio via mahadev) + + ZOOKEEPER-419. Reference counting bug in Python bindings causes abort errors + (henry robinson via phunt) + + ZOOKEEPER-421. zkpython run_tests.sh is missing #! + (henry robinson via phunt) + + ZOOKEEPER-406. address all findbugs warnings in persistence classes. + (phunt et al via breed) + + ZOOKEEPER-435. allow "super" admin digest based auth to be configurable + (phunt via breed) + + ZOOKEEPER-375. zoo_add_auth only retains most recent auth on re-sync. + (mahadev) + + ZOOKEEPER-433. getacl on root znode (/) fails. (phunt via mahadev) + + ZOOKEEPER-408. address all findbugs warnings in persistence classes. + (phunt, mahadev, flavio via mahadev) + + ZOOKEEPER-427. ZooKeeper server unexpectedly high CPU utilisation + (Sergey Zhuravlev via breed) + + ZOOKEEPER-446. some traces of the host auth scheme left (breed via mahadev) + + ZOOKEEPER-438. addauth fails to register auth on new client that's not yet + connected (breed via mahadev) + + ZOOKEEPER-448. png files do nto work with forrest. (mahadev) + + ZOOKEEPER-417. stray message problem when changing servers + (breed via mahadev) + + ZOOKEEPER-449. sesssionmoved in java code and ZCLOSING in C have the same + value. (mahadev) + + ZOOKEEPER-452. zookeeper performance graph should have percentage of reads + rather than percentage of writes - zkperfRW-3.2.jpg (mahadev) + + ZOOKEEPER-450. emphemeral cleanup not happening with session timeout. + (breed via mahadev) + + ZOOKEEPER-453. Worker is not removed in QuorumCnxManager upon crash. + (flavio via mahadev) + + ZOOKEEPER-454. allow compilation with jdk1.5 (phunt) + + ZOOKEEPER-455. zookeeper c client crashes with chroot specified in the string. + (phunt via mahadev) + + ZOOKEEPER-468. avoid compile warning in send_auth_info(). + +IMPROVEMENTS: + ZOOKEEPER-308. improve the atomic broadcast performance 3x. + (breed via mahadev) + + ZOOKEEPER-326. standalone server ignores tickTime configuration. + (chris darroch via mahadev) + + ZOOKEEPER-279. Allow specialization of quorum config parsing + (e.g. variable expansion in zoo.cfg) (Jean-Daniel Cryans via phunt) + + ZOOKEEPER-351. to run checkstyle (giridharan kesavan via mahadev) + + ZOOKEEPER-350. to run rats for releaseaudit. + (giridharan kesavan via mahadev) + + ZOOKEEPER-352. to add standard ant targets required by test-patch.sh script + (giridharan kesavan via mahadev) + + ZOOKEEPER-353. javadoc warnings needs to be fixed. + (giridharan kesavan via mahadev) + + ZOOKEEPER-354. to fix javadoc warning in the source files. (mahadev) + + ZOOKEEPER-349. to automate patch testing. (giridharan kesavan via mahadev) + + ZOOKEEPER-288. Cleanup and fixes to BookKeeper (flavio via mahadev) + + ZOOKEEPER-305. Replace timers with semaphores in FLENewEpochTest. + (flavio via mahadev) + + ZOOKEEPER-60. Get cppunit tests running as part of Hudson CI. + (girish via mahadev) + + ZOOKEEPER-343. add tests that specifically verify the zkmain and + qpmain classes. (phunt via mahadev) + + ZOOKEEPER-361. integrate cppunit testing as part of hudson patch process. + (giri via mahadev) + + ZOOKEEPER-373. One thread per bookie (flavio via mahadev) + + ZOOKEEPER-384. keeper exceptions missing path (phunt via mahadev) + + ZOOKEEPER-380. bookkeeper should have a streaming api so that its easier to + store checpoints/snapshots in bookkeeper. (mahadev via flavio) + + ZOOKEEPER-389. add help/usage to the c shell cli.c (phunt via mahadev) + + ZOOKEEPER-376. ant test target re-compiles cppunit code every time + (phunt via mahadev) + + ZOOKEEPER-391. bookeeper mainline code should not be calling + printStackTrace. (flavio via mahadev) + + ZOOKEEPER-300. zk jmx code is calling printStackTrace when creating bean + name (should not be) (phunt via mahadev) + + ZOOKEEPER-94. JMX tests are needed to verify that the JMX MBeans work + properly (phunt via mahadev) + + ZOOKEEPER-404. nightly build failed on hudson. + (henry robinson and pat via mahadev) + + ZOOKEEPER-345. the CLIs should allow addAuth to be invoked. + (henry robinson via breed) + + ZOOKEEPER-292. commit configure scripts (autotools) to svn for c projects and + include in release (phunt via breed) + + ZOOKEEPER-383. Asynchronous version of createLedger(). (flavio via mahadev) + + ZOOKEEPER-358. Throw exception when ledger does not exist. (flavio via breed) + + ZOOKEEPER-431. Expose methods to ease ZK integration. (Jean-Daniel via breed) + + ZOOKEEPER-396. race condition in zookeeper client library between + zookeeper_close and zoo_synchronous api. (mahadev) + + ZOOKEEPER-196. doxygen comment for state argument of watcher_fn typedef and + implementation differ ("...one of the *_STATE constants, otherwise -1") + (breed via mahadev) + + ZOOKEEPER-336. single bad client can cause server to stop accepting + connections (henry robinson via breed) + + ZOOKEEPER-434. the java shell should indicate connection status on command + prompt (henry robinson via breed) + + ZOOKEEPER-437. Variety of Documentation Updates (grant via mahadev) + + ZOOKEEPER-443. trace logging in watch notification not wrapped with + istraceneabled - inefficient (pat via mahadev) + + ZOOKEEPER-432. Various improvements to zkpython bindings. + (henry via mahadev) + + ZOOKEEPER-428. logging should be makred as warn rathen than error in + NIOServerCnxn. (phunt via mahadev) + + ZOOKEEPER-422. Java CLI should support ephemeral and sequential node creation + (henry via breed) + + ZOOKEEPER-315. add forrest docs for bookkeeper. (flavio via mahadev) + + ZOOKEEPER-329. document how to integrate 3rd party authentication into ZK + server ACLs. (breed via mahadev) + + ZOOKEEPER-356. Masking bookie failure during writes to a ledger + (flavio via breed) + + ZOOKEEPER-327. document effects (latency) of storing large amounts of data + in znodes. (breed via mahadev) + + ZOOKEEPER-264. docs should include a state transition diagram for client + state (breed via mahadev) + + ZOOKEEPER-440. update the performance documentation in forrest + (breed via phunt) + +NEW FEATURES: + + ZOOKEEPER-371. jdiff documentation included in build/release (giri via phunt) + + ZOOKEEPER-78. added a high level protocol/feature - for easy Leader + Election or exclusive Write Lock creation (mahadev via phunt) + + ZOOKEEPER-29. Flexible quorums (flavio via mahadev) + + ZOOKEEPER-378. perl binding for zookeeper (chris darroch via mahadev) + + ZOOKEEPER-386. improve java cli shell. (henry robinson via mahadev) + + ZOOKEEPER-36. REST access to ZooKeeper (phunt via mahadev) + + ZOOKEEPER-395. Python bindings. (henry robinson via mahadev) + + ZOOKEEPER-237. Add a Chroot request (phunt and mahadev) + + +Release 3.1.0 - 2009-02-06 + +Non-backward compatible changes: + +BUGFIXES: + + ZOOKEEPER-255. zoo_set() api does not return stat datastructure. + (avery ching via mahadev) + + ZOOKEEPER-246. review error code definition in both source and docs. + (pat via mahadev) + +Backward compatible changes: + +BUGFIXES: + ZOOKEEPER-211. Not all Mock tests are working (ben via phunt) + + ZOOKEEPER-223. change default level in root logger to INFO. + (pat via mahadev) + + ZOOKEEPER-212. fix the snapshot to be asynchronous. (mahadev and ben) + + ZOOKEEPER-213. fix programmer guide C api docs to be in sync with latest + zookeeper.h (pat via mahadev) + + ZOOKEEPER-219. fix events.poll timeout in watcher test to be longer. + (pat via mahadev) + + ZOOKEEPER-217. Fix errors in config to be thrown as Exceptions. (mahadev) + + ZOOKEEPER-228. fix apache header missing in DBTest. (mahadev) + + ZOOKEEPER-218. fix the error in the barrier example code. (pat via mahadev) + + ZOOKEEPER-206. documentation tab should contain the version number and + other small site changes. (pat via mahadev) + + ZOOKEEPER-226. fix exists calls that fail on server if node has null data. + (mahadev) + + ZOOKEEPER-204. SetWatches needs to be the first message after auth + messages to the server (ben via mahadev) + + ZOOKEEPER-208. Zookeeper C client uses API that are not thread safe, + causing crashes when multiple instances are active. + (austin shoemaker, chris daroch and ben reed via mahadev) + + ZOOKEEPER-227. gcc warning from recordio.h (chris darroch via mahadev) + + ZOOKEEPER-232. fix apache licence header in TestableZookeeper (mahadev) + + ZOOKEEPER-249. QuorumPeer.getClientPort() always returns -1. + (nitay joffe via mahadev) + + ZOOKEEPER-248. QuorumPeer should use Map interface instead of HashMap + implementation. (nitay joffe via mahadev) + + ZOOKEEPER-241. Build of a distro fails after clean target is run. + (patrick hunt via mahadev) + + ZOOKEEPER-245. update readme/quickstart to be release tar, rather than + source, based (patrick hunt via mahadev) + + ZOOKEEPER-251. NullPointerException stopping and starting Zookeeper servers + (mahadev via phunt) + + ZOOKEEPER-250. isvalidsnapshot should handle the case of 0 snapshot + files better. (mahadev via phunt) + + ZOOKEEPER-265. remove (deprecate) unused NoSyncConnected from KeeperState. + (phunt via mahadev) + + ZOOKEEPER-273. Zookeeper c client build should not depend on CPPUNIT. (pat +and runping via mahadev) + + ZOOKEEPER-268. tostring on jute generated objects can cause NPE. (pat via mahadev) + + ZOOKEEPER-267. java client incorrectly generating syncdisconnected event when in disconnected state. (pat via breed) + + ZOOKEEPER-263. document connection host:port as comma separated list in forrest docs (pat via breed) + + ZOOKEEPER-275. Bug in FastLeaderElection. (flavio via mahadev) + + ZOOKEEPER-272. getchildren can fail for large number of children. (mahadev) + + ZOOKEEPER-16. Need to do path validation. (pat, mahadev) + + ZOOKEEPER-252. PurgeTxnLog is not handling the new dataDir directory + structure (mahadev via phunt) + + ZOOKEEPER-291. regression for legacy code using KeeperException.Code + constants (due to 246). (pat via mahadev) + + ZOOKEEPER-255. zoo_set() api does not return stat datastructure. + (avery ching via mahadev) + + ZOOKEEPER-293. zoo_set needs to be abi compatible (3.1 changed the +signature), fix this by adding zoo_set2 (pat via mahadev) + + ZOOKEEPER-302. Quote values in JMX objectnames. (tom and pat via mahadev) + +IMPROVEMENTS: + + ZOOKEEPER-64. Log system env information when initializing server and + client (pat via mahadev) + + ZOOKEEPER-243. add SEQUENCE flag documentation to the programming guide. + (patrick hunt via mahadev) + + ZOOKEEPER-161. Content needed: "Designing a ZooKeeper Deployment" + (breed via phunt) + + ZOOKEEPER-247. fix formatting of C API in ACL section of programmer guide. + (patrick hunt via mahadev) + + ZOOKEEPER-230. Improvements to FLE. (Flavio via mahadev) + + ZOOKEEPER-225. c client should log an info message in zookeeper_init + detailing connection parameters. (pat via mahadev) + + ZOOKEEPER-222. print C client log message timestamp in human readable + form. (pat via mahadev) + + ZOOKEEPER-256. support use of JMX to manage log4j configuration at runtime. + (pat via mahadev) + + ZOOKEEPER-214. add new "stat reset" command to server admin port. + (pat via mahadev) + + ZOOKEEPER-258. docs incorrectly state max client timeout as 60 seconds + (it's based on server ticktime). (phunt via mahadev) + + ZOOKEEPER-135. Fat jar build target. (phunt and breed via mahadev) + + ZOOKEEPER-234. Eliminate using statics to initialize the sever. Should + allow server to be more embeddable in OSGi enviorments. (phunt) + + ZOOKEEPER-259. cleanup the logging levels used (use the correct level) + and messages generated. (phunt via breed) + + ZOOKEEPER-210. Require Java 6. (phunt via breed) + + ZOOKEEPER-177. needed: docs for JMX (phunt via mahadev) + + ZOOKEEPER-253. documentation of DataWatcher state transition is misleading +regarding auto watch reset on reconnect. (phunt via mahadev) + + ZOOKEEPER-269. connectionloss- add more documentation to detail. (phunt and +flavio via mahadev) + + ZOOKEEPER-260. document the recommended values for server id's + (mahadev via phunt) + + ZOOKEEPER-215. expand system test environment (breed via phunt) + + ZOOKEEPER-229. improve documentation regarding user's responsibility to + cleanup datadir (snaps/logs) (mahadev via phunt) + + ZOOKEEPER-69. ZooKeeper logo + + ZOOKEEPER-286. Make GenerateLoad use InstanceContainers. (breed via mahadev) + + ZOOKEEPER-220. programming guide watches section should clarify + server/clientlib role in data/child watch maint. (breed via phunt) + + ZOOKEEPER-289. add debug messages to nioserver select loop. (mahadev) + +NEW FEATURES: + + ZOOKEEPER-276. Bookkeeper contribution (Flavio and Luca Telloli via mahadev) + + ZOOKEEPER-231. Quotas in ZooKeeper. (mahadev) + +Release 3.0.0 - 2008-10-21 + +Non-backward compatible changes: + + ZOOKEEPER-43. Server side of auto reset watches. (breed via mahadev) + + ZOOKEEPER-132. Create Enum to replace CreateFlag in ZooKepper.create + method (Jakob Homan via phunt) + + ZOOKEEPER-139. Create Enums for WatcherEvent's KeeperState and EventType + (Jakob Homan via phunt) + + ZOOKEEPER-18. keeper state inconsistency (Jakob Homan via phunt) + + ZOOKEEPER-38. headers (version+) in log/snap files (Andrew Kornev and Mahadev + Konar via breed) + + ZOOKEEPER-8. Stat enchaned to include num of children and size + (phunt) + + ZOOKEEPER-6. List of problem identifiers in zookeeper.h + (phunt) + + ZOOKEEPER-7. Use enums rather than ints for types and state + (Jakob Homan via mahadev) + + ZOOKEEPER-27. Unique DB identifiers for servers and clients + (mahadev) + + ZOOKEEPER-32. CRCs for ZooKeeper data + (mahadev) + + ZOOKEEPER-33. Better ACL management + (mahadev) + +Backward compatible changes: + + BUGFIXES: + + ZOOKEEPER-203. fix datadir typo in releasenotes (phunt) + + ZOOKEEPER-145. write detailed release notes for users migrating from 2.x + to 3.0 (phunt) + + ZOOKEEPER-23. Auto reset of watches on reconnect (breed via phunt) + + ZOOKEEPER-191. forrest docs for upgrade. (mahadev via phunt) + + ZOOKEEPER-201. validate magic number when reading snapshot and transaction + logs (mahadev via phunt) + + ZOOKEEPER-200. the magic number for snapshot and log must be different + (currently same) (phunt) + + ZOOKEEPER-199. fix log messages in persistence code (mahadev via phunt) + + ZOOKEEPER-197. create checksums for snapshots (mahadev via phunt) + + ZOOKEEPER-198. apache license header missing from FollowerSyncRequest.java + (phunt) + + ZOOKEEPER-5. Upgrade Feature in Zookeeper server. (mahadev via phunt) + + ZOOKEEPER-194. Fix terminology in zookeeperAdmin.xml + (Flavio Paiva Junqueira) + + ZOOKEEPER-151. Document change to server configuration + (Flavio Paiva Junqueira) + + ZOOKEEPER-193. update java example doc to compile with latest zookeeper + (phunt) + + ZOOKEEPER-187. CreateMode api docs missing (phunt) + + ZOOKEEPER-186. add new "releasenotes.xml" to forrest documentation + (phunt) + + ZOOKEEPER-190. Reorg links to docs and navs to docs into related sections + (robbie via phunt) + + ZOOKEEPER-189. forrest build not validated xml of input documents + (robbie via phunt) + + ZOOKEEPER-188. Check that election port is present for all servers + (Flavio Paiva Junqueira via phunt) + + ZOOKEEPER-185. Improved version of FLETest (Flavio Paiva Junqueira) + + ZOOKEEPER-184. tests: An explicit include derective is needed for the usage + of memcpy(), memset(), strlen(), strdup() and free() functions + (Maxim P. Dementiev via phunt) + + ZOOKEEPER-183. Array subscript is above array bounds in od_completion(), + src/cli.c. (Maxim P. Dementiev via phunt) + + ZOOKEEPER-182. zookeeper_init accepts empty host-port string and returns + valid pointer to zhandle_t. (Maxim P. Dementiev via phunt) + + ZOOKEEPER-17. zookeeper_init doc needs clarification (phunt) + + ZOOKEEPER-181. Some Source Forge Documents did not get moved over: + javaExample, zookeeperTutorial, zookeeperInternals (robbie via phunt) + + ZOOKEEPER-180. Placeholder sections needed in document for new topics that + the umbrella jira discusses (robbie via phunt) + + ZOOKEEPER-179. Programmer's Guide "Basic Operations" section is missing + content (robbie via phunt) + + ZOOKEEPER-178. FLE test. (Flavio Paiva Junqueira) + + ZOOKEEPER-159. Cover two corner cases of leader election + (Flavio Paiva Junqueira via phunt) + + ZOOKEEPER-156. update programmer guide with acl details from old wiki page + (phunt) + + ZOOKEEPER-154. reliability graph diagram in overview doc needs context + (phunt) + + ZOOKEEPER-157. Peer can't find existing leader (Flavio Paiva Junqueira) + + ZOOKEEPER-155. improve "the zookeeper project" section of overview doc + (phunt) + + ZOOKEEPER-140. Deadlock in QuorumCnxManager (Flavio Paiva Junqueira) + + ZOOKEEPER-147. This is version of the documents with most of the [tbd...] + scrubbed out (robbie via phunt) + + ZOOKEEPER-150. zookeeper build broken (mahadev via phunt) + + ZOOKEEPER-136. sync causes hang in all followers of quorum. (breed) + + ZOOKEEPER-134. findbugs cleanup (phunt) + + ZOOKEEPER-133. hudson tests failing intermittently (phunt) + + ZOOKEEPER-144. add tostring support for watcher event, and enums for event + type/state (Jakob Homan via phunt) + + ZOOKEEPER-21. Improve zk ctor/watcher (state transition) docs (phunt) + + ZOOKEEPER-142. Provide Javadoc as to the maximum size of the data byte + array that may be stored within a znode (Jakob Homan via phunt) + + ZOOKEEPER-93. Create Documentation for Zookeeper (phunt) + + ZOOKEEPER-117. threading issues in Leader election (fpj via breed) + + ZOOKEEPER-137. client watcher objects can lose events (phunt via breed) + + ZOOKEEPER-131. Old leader election can elect a dead leader over and over + again (breed via mahadev) + + ZOOKEEPER-130. update build.xml to support apache release process + (phunt via mahadev) + + ZOOKEEPER-118. findbugs flagged switch statement in + followerrequestprocessor.run() (Flavio Paiva Junqueira via phunt) + + ZOOKEEPER-115. Potential NPE in QuorumCnxManager + (Flavio Paiva Junqueira) + + ZOOKEEPER-114. cleanup ugly event messages in zookeeper client + (Jakob Homan) + + ZOOKEEPER-112. src/java/main ZooKeeper.java has test code embedded into it. + (phunt) + + ZOOKEEPER-39. Use Watcher objects rather than boolean on read operations. + (Andrew Kornev) + + ZOOKEEPER-97. supports optional output directory in code generator. (Hiram + Chirino via phunt) + + ZOOKEEPER-101. Integrate ZooKeeper with "violations" feature on hudson + (phunt) + + ZOOKEEPER-105. Catch Zookeeper exceptions and print on the stderr. + (Anthony Urso via Mahadev) + + ZOOKEEPER-42. Change Leader Election to fast tcp. (Flavio Paiva Junqueira + via phunt) + + ZOOKEEPER-48. auth_id now handled correctly when no auth ids present + (Benjamin Reed via phunt) + + ZOOKEEPER-44. Create sequence flag children with prefixes of 0's so that + they can be lexicographically sorted. (Jakob Homan via mahadev) + + ZOOKEEPER-108. Fix sync operation reordering on a Quorum. + (Flavio Paiva Junqueira via Mahadev) + + ZOOKEEPER-25. Fuse module for Zookeeper. (Swee Lim, Bart, Patrick Hunt and + Andrew Kornev via Mahadev) + + ZOOKEEPER-58. Race condition on ClientCnxn.java (breed) + + ZOOKEEPER-56. Add clover support to build.xml. (Patrick Hunt via mahadev) + + ZOOKEEPER-75. register the ZooKeeper mailing lists with nabble.com (phunt) + + ZOOKEEPER-54. remove sleeps in the tests. (phunt) + + ZOOKEEPER-55. build.xml failes to retrieve a release number from SVN and + the ant target "dist" fails (Andrew Kornev) + + ZOOKEEPER-89. invoke WhenOwnerListener.whenNotOwner() when the ZK + connection fails (james strachan) + + ZOOKEEPER-90. invoke WhenOwnerListener.whenNotOwner() when the ZK + session expires and the znode is the leader (james strachan) + + ZOOKEEPER-82. Make the ZooKeeperServer more DI friendly. (Hiram Chirino via + mahadev) + + ZOOKEEPER-110. Build script relies on svnant, which is not compatible + with subversion 1.5 working copies (Jakob Homan) + + ZOOKEEPER-111. Significant cleanup of existing tests. (Patrick Hunt via + mahadev) + + ZOOKEEPER-122. Fix NPE in jute's Utils.toCSVString. (Anthony Urso via + mahadev) + + ZOOKEEPER-123. Fix the wrong class is specified for the logger. (Jakob Homan + via mahadev) + + ZOOKEEPER-2. Fix synchronization issues in QuorumPeer and FastLeader + election. (Flavio Paiva Junqueira via mahadev) + + ZOOKEEPER-125. Remove unwanted class declaration in FastLeaderElection. + (Flavio Paiva Junqueira via mahadev) + + ZOOKEEPER-61. Address (remove) use of sleep(#) in client/server test cases. + (phunt) + + ZOOKEEPER-75. cleanup the library directory (phunt) + + ZOOKEEPER-109. cleanup of NPE and Resource issue nits found by static + analysis (phunt) + + ZOOKEEPER-76. Commit 677109 removed the cobertura library, but not the + build targets. (phunt) + + ZOOKEEPER-63. Race condition in client close() operation. (phunt via breed) + + ZOOKEEPER-70. Add skeleton forrest doc structure for ZooKeeper (phunt) + + ZOOKEEPER-79. Document jacob's leader election on the wiki recipes page + (Flavio Junqueira) + + ZOOKEEPER-73. Move ZK wiki from SourceForge to Apache (phunt) + + ZOOKEEPER-72. Initial creation/setup of ZooKeeper ASF site. (phunt) + + ZOOKEEPER-71. Determine what to do re ZooKeeper Changelog(s) (mahadev) + + ZOOKEEPER-68. parseACLs in ZooKeeper.java fails to parse elements of ACL, + should be lastIndexOf rather than IndexOf (mahadev) + + ZOOKEEPER-130. update build.xml to support apache release process. + (phunt via mahadev) + + ZOOKEEPER-131. Fix Old leader election can elect a dead leader over and over + again. (breed via mahadev) + + ZOOKEEPER-137. client watcher objects can lose events (Patrick Hunt via breed) + + ZOOKEEPER-117. threading issues in Leader election (Flavio Junqueira and + Patrick Hunt via breed) + + ZOOKEEPER-128. test coverage on async client operations needs to be improved + (phunt) + + ZOOKEEPER-127. Use of non-standard election ports in config breaks services + (Mark Harwood and Flavio Junqueira via breed) + + ZOOKEEPER-53. tests failing on solaris. (phunt) + + ZOOKEEPER-172. FLE Test (Flavio Junqueira via breed) + + ZOOKEEPER-41. Sample startup script (mahadev) + + ZOOKEEPER-33. Better ACL management (Mahadev Konar) + + ZOOKEEPER-49. SetACL does not work (breed) + + ZOOKEEPER-20. Child watches are not triggered when the node is deleted + (phunt) + + ZOOKEEPER-15. handle failure better in build.xml:test (phunt) + + ZOOKEEPER-11. ArrayList is used instead of List (phunt) + + ZOOKEEPER-45. Restructure the SVN repository after initial import (phunt) + + ZOOKEEPER-1. Initial ZooKeeper code contribution from Yahoo! (phunt) diff --git a/pkg/registry/zookeeper-3.4.6/LICENSE.txt b/pkg/registry/zookeeper-3.4.6/LICENSE.txt new file mode 100644 index 000000000..d64569567 --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/LICENSE.txt @@ -0,0 +1,202 @@ + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/pkg/registry/zookeeper-3.4.6/NOTICE.txt b/pkg/registry/zookeeper-3.4.6/NOTICE.txt new file mode 100644 index 000000000..35add9689 --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/NOTICE.txt @@ -0,0 +1,5 @@ +Apache ZooKeeper +Copyright 2009-2012 The Apache Software Foundation + +This product includes software developed at +The Apache Software Foundation (http://www.apache.org/). diff --git a/pkg/registry/zookeeper-3.4.6/README.txt b/pkg/registry/zookeeper-3.4.6/README.txt new file mode 100644 index 000000000..d056f5afb --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/README.txt @@ -0,0 +1,36 @@ +For the latest information about ZooKeeper, please visit our website at: + + http://zookeeper.apache.org/ + +and our wiki, at: + + https://cwiki.apache.org/confluence/display/ZOOKEEPER + +Full documentation for this release can also be found in docs/index.html + +--------------------------- +Packaging/release artifacts + +The release artifact contains the following jar file at the toplevel: + +zookeeper-.jar - legacy jar file which contains all classes + and source files. Prior to version 3.3.0 this + was the only jar file available. It has the + benefit of having the source included (for + debugging purposes) however is also larger as + a result + +The release artifact contains the following jar files in "dist-maven" directory: + +zookeeper-.jar - bin (binary) jar - contains only class (*.class) files +zookeeper--sources.jar - contains only src (*.java) files +zookeeper--javadoc.jar - contains only javadoc files + +These bin/src/javadoc jars were added specifically to support Maven/Ivy which have +the ability to pull these down automatically as part of your build process. +The content of the legacy jar and the bin+sources jar are the same. + +As of version 3.3.0 bin/sources/javadoc jars contained in dist-maven directory +are deployed to the Apache Maven repository after the release has been accepted +by Apache: + http://people.apache.org/repo/m2-ibiblio-rsync-repository/ diff --git a/pkg/registry/zookeeper-3.4.6/README_packaging.txt b/pkg/registry/zookeeper-3.4.6/README_packaging.txt new file mode 100644 index 000000000..48b69183b --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/README_packaging.txt @@ -0,0 +1,65 @@ +README file for Packaging Notes + +Requirement +----------- + +gcc, cppunit and python-setuptools are required to build +C and python bindings. + +On RHEL machine: + +yum install cppunit +yum install python-setuptools + +On Ubuntu: + +apt-get --install cppunit +apt-get --install python-setuptools + +Package build command +--------------------- + +Command to build Debian package: ant deb +Command to build RPM Package: ant rpm + +rpm and deb packages are generated and placed in: + +build/zookeeper*.[rpm|deb] +build/contrib/**.[rpm|deb] + +Default package file structure layout + + /usr/bin - User executable + /usr/sbin - System executable + /usr/libexec - Configuration boot trap script + /usr/lib - Native libraries + /usr/share/doc/zookeeper - Documents + /usr/share/zookeeper - Project files + /usr/share/zookeeper/template/conf - Configuration template files + /etc/zookeeper - Configuration files + /etc/init.d/zookeeper - OS startup script + +Source file structure layout +--------------------- + +src/packages/update-zookeeper-env.sh + - setup environment variables and symlink $PREFIX/etc/zookeeper to + /etc/zookeeper. + - This script is designed to run in post installation, and pre-remove + phase of ZooKeeper package. + - Run update-zookeeper-env.sh -h to get a list of supported parameters. + +src/packages/template + - Standard configuration template + +src/packages/deb + Meta data for creating Debian package + +src/packages/deb/init.d + Daemon start/stop script for Debian flavor of Linux + +src/packages/rpm + Meta data for creating RPM package + +src/packages/rpm/init.d + Daemon start/stop script for Redhat flavor of Linux diff --git a/pkg/registry/zookeeper-3.4.6/bin/README.txt b/pkg/registry/zookeeper-3.4.6/bin/README.txt new file mode 100755 index 000000000..e70506dd7 --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/bin/README.txt @@ -0,0 +1,6 @@ +This directory contain scripts that allow easy access (classpath in particular) +to the ZooKeeper server and command line client. + +Files ending in .sh are unix and cygwin compatible + +Files ending in .cmd are msdos/windows compatible diff --git a/pkg/registry/zookeeper-3.4.6/bin/zkCleanup.sh b/pkg/registry/zookeeper-3.4.6/bin/zkCleanup.sh new file mode 100755 index 000000000..38ee2e8be --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/bin/zkCleanup.sh @@ -0,0 +1,51 @@ +#!/usr/bin/env bash + +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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 script cleans up old transaction logs and snapshots +# + +# +# If this scripted is run out of /usr/bin or some other system bin directory +# it should be linked to and not copied. Things like java jar files are found +# relative to the canonical path of this script. +# + +# use POSTIX interface, symlink is followed automatically +ZOOBIN="${BASH_SOURCE-$0}" +ZOOBIN="$(dirname "${ZOOBIN}")" +ZOOBINDIR="$(cd "${ZOOBIN}"; pwd)" + +if [ -e "$ZOOBIN/../libexec/zkEnv.sh" ]; then + . "$ZOOBINDIR"/../libexec/zkEnv.sh +else + . "$ZOOBINDIR"/zkEnv.sh +fi + +ZOODATADIR="$(grep "^[[:space:]]*dataDir=" "$ZOOCFG" | sed -e 's/.*=//')" +ZOODATALOGDIR="$(grep "^[[:space:]]*dataLogDir=" "$ZOOCFG" | sed -e 's/.*=//')" + +if [ "x$ZOODATALOGDIR" = "x" ] +then +"$JAVA" "-Dzookeeper.log.dir=${ZOO_LOG_DIR}" "-Dzookeeper.root.logger=${ZOO_LOG4J_PROP}" \ + -cp "$CLASSPATH" $JVMFLAGS \ + org.apache.zookeeper.server.PurgeTxnLog "$ZOODATADIR" $* +else +"$JAVA" "-Dzookeeper.log.dir=${ZOO_LOG_DIR}" "-Dzookeeper.root.logger=${ZOO_LOG4J_PROP}" \ + -cp "$CLASSPATH" $JVMFLAGS \ + org.apache.zookeeper.server.PurgeTxnLog "$ZOODATALOGDIR" "$ZOODATADIR" $* +fi diff --git a/pkg/registry/zookeeper-3.4.6/bin/zkCli.cmd b/pkg/registry/zookeeper-3.4.6/bin/zkCli.cmd new file mode 100755 index 000000000..fc9bff869 --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/bin/zkCli.cmd @@ -0,0 +1,24 @@ +@echo off +REM Licensed to the Apache Software Foundation (ASF) under one or more +REM contributor license agreements. See the NOTICE file distributed with +REM this work for additional information regarding copyright ownership. +REM The ASF licenses this file to You under the Apache License, Version 2.0 +REM (the "License"); you may not use this file except in compliance with +REM the License. You may obtain a copy of the License at +REM +REM http://www.apache.org/licenses/LICENSE-2.0 +REM +REM Unless required by applicable law or agreed to in writing, software +REM distributed under the License is distributed on an "AS IS" BASIS, +REM WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +REM See the License for the specific language governing permissions and +REM limitations under the License. + +setlocal +call "%~dp0zkEnv.cmd" + +set ZOOMAIN=org.apache.zookeeper.ZooKeeperMain +java "-Dzookeeper.log.dir=%ZOO_LOG_DIR%" "-Dzookeeper.root.logger=%ZOO_LOG4J_PROP%" -cp "%CLASSPATH%" %ZOOMAIN% %* + +endlocal + diff --git a/pkg/registry/zookeeper-3.4.6/bin/zkCli.sh b/pkg/registry/zookeeper-3.4.6/bin/zkCli.sh new file mode 100755 index 000000000..992a91367 --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/bin/zkCli.sh @@ -0,0 +1,41 @@ +#!/usr/bin/env bash + +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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 script cleans up old transaction logs and snapshots +# + +# +# If this scripted is run out of /usr/bin or some other system bin directory +# it should be linked to and not copied. Things like java jar files are found +# relative to the canonical path of this script. +# + +# use POSTIX interface, symlink is followed automatically +ZOOBIN="${BASH_SOURCE-$0}" +ZOOBIN="$(dirname "${ZOOBIN}")" +ZOOBINDIR="$(cd "${ZOOBIN}"; pwd)" + +if [ -e "$ZOOBIN/../libexec/zkEnv.sh" ]; then + . "$ZOOBINDIR"/../libexec/zkEnv.sh +else + . "$ZOOBINDIR"/zkEnv.sh +fi + +"$JAVA" "-Dzookeeper.log.dir=${ZOO_LOG_DIR}" "-Dzookeeper.root.logger=${ZOO_LOG4J_PROP}" \ + -cp "$CLASSPATH" $CLIENT_JVMFLAGS $JVMFLAGS \ + org.apache.zookeeper.ZooKeeperMain "$@" diff --git a/pkg/registry/zookeeper-3.4.6/bin/zkEnv.cmd b/pkg/registry/zookeeper-3.4.6/bin/zkEnv.cmd new file mode 100755 index 000000000..5711e5645 --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/bin/zkEnv.cmd @@ -0,0 +1,34 @@ +@echo off +REM Licensed to the Apache Software Foundation (ASF) under one or more +REM contributor license agreements. See the NOTICE file distributed with +REM this work for additional information regarding copyright ownership. +REM The ASF licenses this file to You under the Apache License, Version 2.0 +REM (the "License"); you may not use this file except in compliance with +REM the License. You may obtain a copy of the License at +REM +REM http://www.apache.org/licenses/LICENSE-2.0 +REM +REM Unless required by applicable law or agreed to in writing, software +REM distributed under the License is distributed on an "AS IS" BASIS, +REM WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +REM See the License for the specific language governing permissions and +REM limitations under the License. + +set ZOOCFGDIR=%~dp0%..\conf +set ZOO_LOG_DIR=%~dp0%.. +set ZOO_LOG4J_PROP=INFO,CONSOLE + +REM for sanity sake assume Java 1.6 +REM see: http://java.sun.com/javase/6/docs/technotes/tools/windows/java.html + +REM add the zoocfg dir to classpath +set CLASSPATH=%ZOOCFGDIR% + +REM make it work in the release +SET CLASSPATH=%~dp0..\*;%~dp0..\lib\*;%CLASSPATH% + +REM make it work for developers +SET CLASSPATH=%~dp0..\build\classes;%~dp0..\build\lib\*;%CLASSPATH% + +set ZOOCFG=%ZOOCFGDIR%\zoo.cfg + diff --git a/pkg/registry/zookeeper-3.4.6/bin/zkEnv.sh b/pkg/registry/zookeeper-3.4.6/bin/zkEnv.sh new file mode 100755 index 000000000..43cbc2235 --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/bin/zkEnv.sh @@ -0,0 +1,115 @@ +#!/usr/bin/env bash + +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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 script should be sourced into other zookeeper +# scripts to setup the env variables + +# We use ZOOCFGDIR if defined, +# otherwise we use /etc/zookeeper +# or the conf directory that is +# a sibling of this script's directory + +ZOOBINDIR="${ZOOBINDIR:-/usr/bin}" +ZOOKEEPER_PREFIX="${ZOOBINDIR}/.." + +if [ "x$ZOOCFGDIR" = "x" ] +then + if [ -e "${ZOOKEEPER_PREFIX}/conf" ]; then + ZOOCFGDIR="$ZOOBINDIR/../conf" + else + ZOOCFGDIR="$ZOOBINDIR/../etc/zookeeper" + fi +fi + +if [ -f "${ZOOCFGDIR}/zookeeper-env.sh" ]; then + . "${ZOOCFGDIR}/zookeeper-env.sh" +fi + +if [ "x$ZOOCFG" = "x" ] +then + ZOOCFG="zoo.cfg" +fi + +ZOOCFG="$ZOOCFGDIR/$ZOOCFG" + +if [ -f "$ZOOCFGDIR/java.env" ] +then + . "$ZOOCFGDIR/java.env" +fi + +if [ "x${ZOO_LOG_DIR}" = "x" ] +then + ZOO_LOG_DIR="." +fi + +if [ "x${ZOO_LOG4J_PROP}" = "x" ] +then + ZOO_LOG4J_PROP="INFO,CONSOLE" +fi + +if [ "$JAVA_HOME" != "" ]; then + JAVA="$JAVA_HOME/bin/java" +else + JAVA=java +fi + +#add the zoocfg dir to classpath +CLASSPATH="$ZOOCFGDIR:$CLASSPATH" + +for i in "$ZOOBINDIR"/../src/java/lib/*.jar +do + CLASSPATH="$i:$CLASSPATH" +done + +#make it work in the binary package +#(use array for LIBPATH to account for spaces within wildcard expansion) +if [ -e "${ZOOKEEPER_PREFIX}"/share/zookeeper/zookeeper-*.jar ]; then + LIBPATH=("${ZOOKEEPER_PREFIX}"/share/zookeeper/*.jar) +else + #release tarball format + for i in "$ZOOBINDIR"/../zookeeper-*.jar + do + CLASSPATH="$i:$CLASSPATH" + done + LIBPATH=("${ZOOBINDIR}"/../lib/*.jar) +fi + +for i in "${LIBPATH[@]}" +do + CLASSPATH="$i:$CLASSPATH" +done + +#make it work for developers +for d in "$ZOOBINDIR"/../build/lib/*.jar +do + CLASSPATH="$d:$CLASSPATH" +done + +#make it work for developers +CLASSPATH="$ZOOBINDIR/../build/classes:$CLASSPATH" + +case "`uname`" in + CYGWIN*) cygwin=true ;; + *) cygwin=false ;; +esac + +if $cygwin +then + CLASSPATH=`cygpath -wp "$CLASSPATH"` +fi + +#echo "CLASSPATH=$CLASSPATH" \ No newline at end of file diff --git a/pkg/registry/zookeeper-3.4.6/bin/zkServer.cmd b/pkg/registry/zookeeper-3.4.6/bin/zkServer.cmd new file mode 100755 index 000000000..0f35415ff --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/bin/zkServer.cmd @@ -0,0 +1,25 @@ +@echo off +REM Licensed to the Apache Software Foundation (ASF) under one or more +REM contributor license agreements. See the NOTICE file distributed with +REM this work for additional information regarding copyright ownership. +REM The ASF licenses this file to You under the Apache License, Version 2.0 +REM (the "License"); you may not use this file except in compliance with +REM the License. You may obtain a copy of the License at +REM +REM http://www.apache.org/licenses/LICENSE-2.0 +REM +REM Unless required by applicable law or agreed to in writing, software +REM distributed under the License is distributed on an "AS IS" BASIS, +REM WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +REM See the License for the specific language governing permissions and +REM limitations under the License. + +setlocal +call "%~dp0zkEnv.cmd" + +set ZOOMAIN=org.apache.zookeeper.server.quorum.QuorumPeerMain +echo on +java "-Dzookeeper.log.dir=%ZOO_LOG_DIR%" "-Dzookeeper.root.logger=%ZOO_LOG4J_PROP%" -cp "%CLASSPATH%" %ZOOMAIN% "%ZOOCFG%" %* + +endlocal + diff --git a/pkg/registry/zookeeper-3.4.6/bin/zkServer.sh b/pkg/registry/zookeeper-3.4.6/bin/zkServer.sh new file mode 100755 index 000000000..049098276 --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/bin/zkServer.sh @@ -0,0 +1,186 @@ +#!/usr/bin/env bash + +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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. + +# +# If this scripted is run out of /usr/bin or some other system bin directory +# it should be linked to and not copied. Things like java jar files are found +# relative to the canonical path of this script. +# + +# See the following page for extensive details on setting +# up the JVM to accept JMX remote management: +# http://java.sun.com/javase/6/docs/technotes/guides/management/agent.html +# by default we allow local JMX connections +if [ "x$JMXLOCALONLY" = "x" ] +then + JMXLOCALONLY=false +fi + +if [ "x$JMXDISABLE" = "x" ] +then + echo "JMX enabled by default" >&2 + # for some reason these two options are necessary on jdk6 on Ubuntu + # accord to the docs they are not necessary, but otw jconsole cannot + # do a local attach + ZOOMAIN="-Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.local.only=$JMXLOCALONLY org.apache.zookeeper.server.quorum.QuorumPeerMain" +else + echo "JMX disabled by user request" >&2 + ZOOMAIN="org.apache.zookeeper.server.quorum.QuorumPeerMain" +fi + +# use POSTIX interface, symlink is followed automatically +ZOOBIN="${BASH_SOURCE-$0}" +ZOOBIN="$(dirname "${ZOOBIN}")" +ZOOBINDIR="$(cd "${ZOOBIN}"; pwd)" + +if [ -e "$ZOOBIN/../libexec/zkEnv.sh" ]; then + . "$ZOOBINDIR/../libexec/zkEnv.sh" +else + . "$ZOOBINDIR/zkEnv.sh" +fi + +if [ "x$SERVER_JVMFLAGS" != "x" ] +then + JVMFLAGS="$SERVER_JVMFLAGS $JVMFLAGS" +fi + +if [ "x$2" != "x" ] +then + ZOOCFG="$ZOOCFGDIR/$2" +fi + +# if we give a more complicated path to the config, don't screw around in $ZOOCFGDIR +if [ "x$(dirname "$ZOOCFG")" != "x$ZOOCFGDIR" ] +then + ZOOCFG="$2" +fi + +if $cygwin +then + ZOOCFG=`cygpath -wp "$ZOOCFG"` + # cygwin has a "kill" in the shell itself, gets confused + KILL=/bin/kill +else + KILL=kill +fi + +echo "Using config: $ZOOCFG" >&2 + +if [ -z "$ZOOPIDFILE" ]; then + ZOO_DATADIR="$(grep "^[[:space:]]*dataDir" "$ZOOCFG" | sed -e 's/.*=//')" + if [ ! -d "$ZOO_DATADIR" ]; then + mkdir -p "$ZOO_DATADIR" + fi + ZOOPIDFILE="$ZOO_DATADIR/zookeeper_server.pid" +else + # ensure it exists, otw stop will fail + mkdir -p "$(dirname "$ZOOPIDFILE")" +fi + +if [ ! -w "$ZOO_LOG_DIR" ] ; then +mkdir -p "$ZOO_LOG_DIR" +fi + +_ZOO_DAEMON_OUT="$ZOO_LOG_DIR/zookeeper.out" + +case $1 in +start) + echo -n "Starting zookeeper ... " + if [ -f "$ZOOPIDFILE" ]; then + if kill -0 `cat "$ZOOPIDFILE"` > /dev/null 2>&1; then + echo $command already running as process `cat "$ZOOPIDFILE"`. + exit 0 + fi + fi + nohup "$JAVA" "-Dzookeeper.log.dir=${ZOO_LOG_DIR}" "-Dzookeeper.root.logger=${ZOO_LOG4J_PROP}" \ + -cp "$CLASSPATH" $JVMFLAGS $ZOOMAIN "$ZOOCFG" > "$_ZOO_DAEMON_OUT" 2>&1 < /dev/null & + if [ $? -eq 0 ] + then + if /bin/echo -n $! > "$ZOOPIDFILE" + then + sleep 1 + echo STARTED + else + echo FAILED TO WRITE PID + exit 1 + fi + else + echo SERVER DID NOT START + exit 1 + fi + ;; +start-foreground) + ZOO_CMD=(exec "$JAVA") + if [ "${ZOO_NOEXEC}" != "" ]; then + ZOO_CMD=("$JAVA") + fi + "${ZOO_CMD[@]}" "-Dzookeeper.log.dir=${ZOO_LOG_DIR}" "-Dzookeeper.root.logger=${ZOO_LOG4J_PROP}" \ + -cp "$CLASSPATH" $JVMFLAGS $ZOOMAIN "$ZOOCFG" + ;; +print-cmd) + echo "\"$JAVA\" -Dzookeeper.log.dir=\"${ZOO_LOG_DIR}\" -Dzookeeper.root.logger=\"${ZOO_LOG4J_PROP}\" -cp \"$CLASSPATH\" $JVMFLAGS $ZOOMAIN \"$ZOOCFG\" > \"$_ZOO_DAEMON_OUT\" 2>&1 < /dev/null" + ;; +stop) + echo -n "Stopping zookeeper ... " + if [ ! -f "$ZOOPIDFILE" ] + then + echo "no zookeeper to stop (could not find file $ZOOPIDFILE)" + else + $KILL -9 $(cat "$ZOOPIDFILE") + rm "$ZOOPIDFILE" + echo STOPPED + fi + exit 0 + ;; +upgrade) + shift + echo "upgrading the servers to 3.*" + "$JAVA" "-Dzookeeper.log.dir=${ZOO_LOG_DIR}" "-Dzookeeper.root.logger=${ZOO_LOG4J_PROP}" \ + -cp "$CLASSPATH" $JVMFLAGS org.apache.zookeeper.server.upgrade.UpgradeMain ${@} + echo "Upgrading ... " + ;; +restart) + shift + "$0" stop ${@} + sleep 3 + "$0" start ${@} + ;; +status) + # -q is necessary on some versions of linux where nc returns too quickly, and no stat result is output + clientPortAddress=`grep "^[[:space:]]*clientPortAddress[^[:alpha:]]" "$ZOOCFG" | sed -e 's/.*=//'` + if ! [ $clientPortAddress ] + then + clientPortAddress="localhost" + fi + clientPort=`grep "^[[:space:]]*clientPort[^[:alpha:]]" "$ZOOCFG" | sed -e 's/.*=//'` + STAT=`"$JAVA" "-Dzookeeper.log.dir=${ZOO_LOG_DIR}" "-Dzookeeper.root.logger=${ZOO_LOG4J_PROP}" \ + -cp "$CLASSPATH" $JVMFLAGS org.apache.zookeeper.client.FourLetterWordMain \ + $clientPortAddress $clientPort srvr 2> /dev/null \ + | grep Mode` + if [ "x$STAT" = "x" ] + then + echo "Error contacting service. It is probably not running." + exit 1 + else + echo $STAT + exit 0 + fi + ;; +*) + echo "Usage: $0 {start|start-foreground|stop|restart|status|upgrade|print-cmd}" >&2 + +esac diff --git a/pkg/registry/zookeeper-3.4.6/build.xml b/pkg/registry/zookeeper-3.4.6/build.xml new file mode 100644 index 000000000..442d52e99 --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/build.xml @@ -0,0 +1,1805 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Eclipse Public License - v 1.0

+ +

THE ACCOMPANYING PROGRAM IS PROVIDED UNDER THE TERMS OF THIS ECLIPSE +PUBLIC LICENSE ("AGREEMENT"). ANY USE, REPRODUCTION OR +DISTRIBUTION OF THE PROGRAM CONSTITUTES RECIPIENT'S ACCEPTANCE OF THIS +AGREEMENT.

+ +

1. DEFINITIONS

+ +

"Contribution" means:

+ +

a) in the case of the initial Contributor, the initial +code and documentation distributed under this Agreement, and

+

b) in the case of each subsequent Contributor:

+

i) changes to the Program, and

+

ii) additions to the Program;

+

where such changes and/or additions to the Program +originate from and are distributed by that particular Contributor. A +Contribution 'originates' from a Contributor if it was added to the +Program by such Contributor itself or anyone acting on such +Contributor's behalf. Contributions do not include additions to the +Program which: (i) are separate modules of software distributed in +conjunction with the Program under their own license agreement, and (ii) +are not derivative works of the Program.

+ +

"Contributor" means any person or entity that distributes +the Program.

+ +

"Licensed Patents" mean patent claims licensable by a +Contributor which are necessarily infringed by the use or sale of its +Contribution alone or when combined with the Program.

+ +

"Program" means the Contributions distributed in accordance +with this Agreement.

+ +

"Recipient" means anyone who receives the Program under +this Agreement, including all Contributors.

+ +

2. GRANT OF RIGHTS

+ +

a) Subject to the terms of this Agreement, each +Contributor hereby grants Recipient a non-exclusive, worldwide, +royalty-free copyright license to reproduce, prepare derivative works +of, publicly display, publicly perform, distribute and sublicense the +Contribution of such Contributor, if any, and such derivative works, in +source code and object code form.

+ +

b) Subject to the terms of this Agreement, each +Contributor hereby grants Recipient a non-exclusive, worldwide, +royalty-free patent license under Licensed Patents to make, use, sell, +offer to sell, import and otherwise transfer the Contribution of such +Contributor, if any, in source code and object code form. This patent +license shall apply to the combination of the Contribution and the +Program if, at the time the Contribution is added by the Contributor, +such addition of the Contribution causes such combination to be covered +by the Licensed Patents. The patent license shall not apply to any other +combinations which include the Contribution. No hardware per se is +licensed hereunder.

+ +

c) Recipient understands that although each Contributor +grants the licenses to its Contributions set forth herein, no assurances +are provided by any Contributor that the Program does not infringe the +patent or other intellectual property rights of any other entity. Each +Contributor disclaims any liability to Recipient for claims brought by +any other entity based on infringement of intellectual property rights +or otherwise. As a condition to exercising the rights and licenses +granted hereunder, each Recipient hereby assumes sole responsibility to +secure any other intellectual property rights needed, if any. For +example, if a third party patent license is required to allow Recipient +to distribute the Program, it is Recipient's responsibility to acquire +that license before distributing the Program.

+ +

d) Each Contributor represents that to its knowledge it +has sufficient copyright rights in its Contribution, if any, to grant +the copyright license set forth in this Agreement.

+ +

3. REQUIREMENTS

+ +

A Contributor may choose to distribute the Program in object code +form under its own license agreement, provided that:

+ +

a) it complies with the terms and conditions of this +Agreement; and

+ +

b) its license agreement:

+ +

i) effectively disclaims on behalf of all Contributors +all warranties and conditions, express and implied, including warranties +or conditions of title and non-infringement, and implied warranties or +conditions of merchantability and fitness for a particular purpose;

+ +

ii) effectively excludes on behalf of all Contributors +all liability for damages, including direct, indirect, special, +incidental and consequential damages, such as lost profits;

+ +

iii) states that any provisions which differ from this +Agreement are offered by that Contributor alone and not by any other +party; and

+ +

iv) states that source code for the Program is available +from such Contributor, and informs licensees how to obtain it in a +reasonable manner on or through a medium customarily used for software +exchange.

+ +

When the Program is made available in source code form:

+ +

a) it must be made available under this Agreement; and

+ +

b) a copy of this Agreement must be included with each +copy of the Program.

+ +

Contributors may not remove or alter any copyright notices contained +within the Program.

+ +

Each Contributor must identify itself as the originator of its +Contribution, if any, in a manner that reasonably allows subsequent +Recipients to identify the originator of the Contribution.

+ +

4. COMMERCIAL DISTRIBUTION

+ +

Commercial distributors of software may accept certain +responsibilities with respect to end users, business partners and the +like. While this license is intended to facilitate the commercial use of +the Program, the Contributor who includes the Program in a commercial +product offering should do so in a manner which does not create +potential liability for other Contributors. Therefore, if a Contributor +includes the Program in a commercial product offering, such Contributor +("Commercial Contributor") hereby agrees to defend and +indemnify every other Contributor ("Indemnified Contributor") +against any losses, damages and costs (collectively "Losses") +arising from claims, lawsuits and other legal actions brought by a third +party against the Indemnified Contributor to the extent caused by the +acts or omissions of such Commercial Contributor in connection with its +distribution of the Program in a commercial product offering. The +obligations in this section do not apply to any claims or Losses +relating to any actual or alleged intellectual property infringement. In +order to qualify, an Indemnified Contributor must: a) promptly notify +the Commercial Contributor in writing of such claim, and b) allow the +Commercial Contributor to control, and cooperate with the Commercial +Contributor in, the defense and any related settlement negotiations. The +Indemnified Contributor may participate in any such claim at its own +expense.

+ +

For example, a Contributor might include the Program in a commercial +product offering, Product X. That Contributor is then a Commercial +Contributor. If that Commercial Contributor then makes performance +claims, or offers warranties related to Product X, those performance +claims and warranties are such Commercial Contributor's responsibility +alone. Under this section, the Commercial Contributor would have to +defend claims against the other Contributors related to those +performance claims and warranties, and if a court requires any other +Contributor to pay any damages as a result, the Commercial Contributor +must pay those damages.

+ +

5. NO WARRANTY

+ +

EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, THE PROGRAM IS +PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS +OF ANY KIND, EITHER EXPRESS OR IMPLIED INCLUDING, WITHOUT LIMITATION, +ANY WARRANTIES OR CONDITIONS OF TITLE, NON-INFRINGEMENT, MERCHANTABILITY +OR FITNESS FOR A PARTICULAR PURPOSE. Each Recipient is solely +responsible for determining the appropriateness of using and +distributing the Program and assumes all risks associated with its +exercise of rights under this Agreement , including but not limited to +the risks and costs of program errors, compliance with applicable laws, +damage to or loss of data, programs or equipment, and unavailability or +interruption of operations.

+ +

6. DISCLAIMER OF LIABILITY

+ +

EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, NEITHER RECIPIENT +NOR ANY CONTRIBUTORS SHALL HAVE ANY LIABILITY FOR ANY DIRECT, INDIRECT, +INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING +WITHOUT LIMITATION LOST PROFITS), 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 OR +DISTRIBUTION OF THE PROGRAM OR THE EXERCISE OF ANY RIGHTS GRANTED +HEREUNDER, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.

+ +

7. GENERAL

+ +

If any provision of this Agreement is invalid or unenforceable under +applicable law, it shall not affect the validity or enforceability of +the remainder of the terms of this Agreement, and without further action +by the parties hereto, such provision shall be reformed to the minimum +extent necessary to make such provision valid and enforceable.

+ +

If Recipient institutes patent litigation against any entity +(including a cross-claim or counterclaim in a lawsuit) alleging that the +Program itself (excluding combinations of the Program with other +software or hardware) infringes such Recipient's patent(s), then such +Recipient's rights granted under Section 2(b) shall terminate as of the +date such litigation is filed.

+ +

All Recipient's rights under this Agreement shall terminate if it +fails to comply with any of the material terms or conditions of this +Agreement and does not cure such failure in a reasonable period of time +after becoming aware of such noncompliance. If all Recipient's rights +under this Agreement terminate, Recipient agrees to cease use and +distribution of the Program as soon as reasonably practicable. However, +Recipient's obligations under this Agreement and any licenses granted by +Recipient relating to the Program shall continue and survive.

+ +

Everyone is permitted to copy and distribute copies of this +Agreement, but in order to avoid inconsistency the Agreement is +copyrighted and may only be modified in the following manner. The +Agreement Steward reserves the right to publish new versions (including +revisions) of this Agreement from time to time. No one other than the +Agreement Steward has the right to modify this Agreement. The Eclipse +Foundation is the initial Agreement Steward. The Eclipse Foundation may +assign the responsibility to serve as the Agreement Steward to a +suitable separate entity. Each new version of the Agreement will be +given a distinguishing version number. The Program (including +Contributions) may always be distributed subject to the version of the +Agreement under which it was received. In addition, after a new version +of the Agreement is published, Contributor may elect to distribute the +Program (including its Contributions) under the new version. Except as +expressly stated in Sections 2(a) and 2(b) above, Recipient receives no +rights or licenses to the intellectual property of any Contributor under +this Agreement, whether expressly, by implication, estoppel or +otherwise. All rights in the Program not expressly granted under this +Agreement are reserved.

+ +

This Agreement is governed by the laws of the State of New York and +the intellectual property laws of the United States of America. No party +to this Agreement will bring a legal action under this Agreement more +than one year after the cause of action arose. Each party waives its +rights to a jury trial in any resulting litigation.

+ + + + diff --git a/pkg/registry/zookeeper-3.4.6/contrib/ZooInspector/src/java/org/apache/zookeeper/inspector/ZooInspector.java b/pkg/registry/zookeeper-3.4.6/contrib/ZooInspector/src/java/org/apache/zookeeper/inspector/ZooInspector.java new file mode 100644 index 000000000..b637bfd4c --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/contrib/ZooInspector/src/java/org/apache/zookeeper/inspector/ZooInspector.java @@ -0,0 +1,66 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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. + */ +package org.apache.zookeeper.inspector; + +import java.awt.event.WindowAdapter; +import java.awt.event.WindowEvent; + +import javax.swing.JFrame; +import javax.swing.JOptionPane; +import javax.swing.UIManager; + +import org.apache.zookeeper.inspector.gui.ZooInspectorPanel; +import org.apache.zookeeper.inspector.logger.LoggerFactory; +import org.apache.zookeeper.inspector.manager.ZooInspectorManagerImpl; + +/** + * + */ +public class ZooInspector { + /** + * @param args + * - not used. The value of these parameters will have no effect + * on the application + */ + public static void main(String[] args) { + try { + UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); + JFrame frame = new JFrame("ZooInspector"); + frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); + final ZooInspectorPanel zooInspectorPanel = new ZooInspectorPanel( + new ZooInspectorManagerImpl()); + frame.addWindowListener(new WindowAdapter() { + @Override + public void windowClosed(WindowEvent e) { + super.windowClosed(e); + zooInspectorPanel.disconnect(true); + } + }); + + frame.setContentPane(zooInspectorPanel); + frame.setSize(1024, 768); + frame.setVisible(true); + } catch (Exception e) { + LoggerFactory.getLogger().error( + "Error occurred loading ZooInspector", e); + JOptionPane.showMessageDialog(null, + "ZooInspector failed to start: " + e.getMessage(), "Error", + JOptionPane.ERROR_MESSAGE); + } + } +} diff --git a/pkg/registry/zookeeper-3.4.6/contrib/ZooInspector/src/java/org/apache/zookeeper/inspector/encryption/BasicDataEncryptionManager.java b/pkg/registry/zookeeper-3.4.6/contrib/ZooInspector/src/java/org/apache/zookeeper/inspector/encryption/BasicDataEncryptionManager.java new file mode 100644 index 000000000..a9e5ac477 --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/contrib/ZooInspector/src/java/org/apache/zookeeper/inspector/encryption/BasicDataEncryptionManager.java @@ -0,0 +1,50 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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. + */ +package org.apache.zookeeper.inspector.encryption; + +/** + * + */ +public class BasicDataEncryptionManager implements DataEncryptionManager { + + /* + * (non-Javadoc) + * + * @see + * org.apache.zookeeper.inspector.encryption.DataEncryptionManager#decryptData + * (byte[]) + */ + public String decryptData(byte[] encrypted) throws Exception { + return new String(encrypted); + } + + /* + * (non-Javadoc) + * + * @see + * org.apache.zookeeper.inspector.encryption.DataEncryptionManager#encryptData + * (java.lang.String) + */ + public byte[] encryptData(String data) throws Exception { + if (data == null) { + return new byte[0]; + } + return data.getBytes(); + } + +} diff --git a/pkg/registry/zookeeper-3.4.6/contrib/ZooInspector/src/java/org/apache/zookeeper/inspector/encryption/DataEncryptionManager.java b/pkg/registry/zookeeper-3.4.6/contrib/ZooInspector/src/java/org/apache/zookeeper/inspector/encryption/DataEncryptionManager.java new file mode 100644 index 000000000..15a9ee435 --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/contrib/ZooInspector/src/java/org/apache/zookeeper/inspector/encryption/DataEncryptionManager.java @@ -0,0 +1,39 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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. + */ +package org.apache.zookeeper.inspector.encryption; + +/** + * A class which describes how data should be encrypted and decrypted + */ +public interface DataEncryptionManager { + /** + * @param data + * - the data to be encrypted + * @return the encrypted data + * @throws Exception + */ + public byte[] encryptData(String data) throws Exception; + + /** + * @param encrypted + * - the data to be decrypted + * @return the decrypted data + * @throws Exception + */ + public String decryptData(byte[] encrypted) throws Exception; +} diff --git a/pkg/registry/zookeeper-3.4.6/contrib/ZooInspector/src/java/org/apache/zookeeper/inspector/gui/NodeViewersChangeListener.java b/pkg/registry/zookeeper-3.4.6/contrib/ZooInspector/src/java/org/apache/zookeeper/inspector/gui/NodeViewersChangeListener.java new file mode 100644 index 000000000..b0b1e9801 --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/contrib/ZooInspector/src/java/org/apache/zookeeper/inspector/gui/NodeViewersChangeListener.java @@ -0,0 +1,37 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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. + */ +package org.apache.zookeeper.inspector.gui; + +import java.util.List; + +import org.apache.zookeeper.inspector.gui.nodeviewer.ZooInspectorNodeViewer; + +/** + * A Listener for changes to the configuration of which node viewers are shown + */ +public interface NodeViewersChangeListener { + /** + * Called when the node viewers configuration is changed (i.e node viewers + * are added, removed or the order of the node viewers is changed) + * + * @param newViewers + * - a {@link List} of {@link ZooInspectorNodeViewer}s which are + * to be shown + */ + public void nodeViewersChanged(List newViewers); +} diff --git a/pkg/registry/zookeeper-3.4.6/contrib/ZooInspector/src/java/org/apache/zookeeper/inspector/gui/ZooInspectorAboutDialog.java b/pkg/registry/zookeeper-3.4.6/contrib/ZooInspector/src/java/org/apache/zookeeper/inspector/gui/ZooInspectorAboutDialog.java new file mode 100644 index 000000000..fbae8f10f --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/contrib/ZooInspector/src/java/org/apache/zookeeper/inspector/gui/ZooInspectorAboutDialog.java @@ -0,0 +1,80 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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. + */ +package org.apache.zookeeper.inspector.gui; + +import java.awt.BorderLayout; +import java.awt.Dimension; +import java.awt.FlowLayout; +import java.awt.Frame; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.io.IOException; + +import javax.swing.JButton; +import javax.swing.JDialog; +import javax.swing.JEditorPane; +import javax.swing.JPanel; + +import org.apache.zookeeper.inspector.logger.LoggerFactory; + +/** + * The About Dialog for the application + */ +public class ZooInspectorAboutDialog extends JDialog { + /** + * @param frame + * - the Frame from which the dialog is displayed + */ + public ZooInspectorAboutDialog(Frame frame) { + super(frame); + this.setLayout(new BorderLayout()); + this.setIconImage(ZooInspectorIconResources.getInformationIcon() + .getImage()); + this.setTitle("About ZooInspector"); + this.setModal(true); + this.setAlwaysOnTop(true); + this.setResizable(false); + JPanel panel = new JPanel(); + panel.setLayout(new BorderLayout()); + JEditorPane aboutPane = new JEditorPane(); + aboutPane.setEditable(false); + aboutPane.setOpaque(false); + java.net.URL aboutURL = ZooInspectorAboutDialog.class + .getResource("about.html"); + try { + aboutPane.setPage(aboutURL); + } catch (IOException e) { + LoggerFactory.getLogger().error( + "Error loading about.html, file may be corrupt", e); + } + panel.add(aboutPane, BorderLayout.CENTER); + panel.setPreferredSize(new Dimension(600, 200)); + JPanel buttonsPanel = new JPanel(); + buttonsPanel.setLayout(new FlowLayout(FlowLayout.CENTER, 10, 10)); + JButton okButton = new JButton("OK"); + okButton.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + ZooInspectorAboutDialog.this.dispose(); + } + }); + buttonsPanel.add(okButton); + this.add(panel, BorderLayout.CENTER); + this.add(buttonsPanel, BorderLayout.SOUTH); + this.pack(); + } +} diff --git a/pkg/registry/zookeeper-3.4.6/contrib/ZooInspector/src/java/org/apache/zookeeper/inspector/gui/ZooInspectorConnectionPropertiesDialog.java b/pkg/registry/zookeeper-3.4.6/contrib/ZooInspector/src/java/org/apache/zookeeper/inspector/gui/ZooInspectorConnectionPropertiesDialog.java new file mode 100644 index 000000000..c7db5243b --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/contrib/ZooInspector/src/java/org/apache/zookeeper/inspector/gui/ZooInspectorConnectionPropertiesDialog.java @@ -0,0 +1,321 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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. + */ +package org.apache.zookeeper.inspector.gui; + +import java.awt.BorderLayout; +import java.awt.GridBagConstraints; +import java.awt.GridBagLayout; +import java.awt.Insets; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.io.File; +import java.io.FileReader; +import java.io.IOException; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Properties; +import java.util.Map.Entry; + +import javax.swing.JButton; +import javax.swing.JComboBox; +import javax.swing.JComponent; +import javax.swing.JDialog; +import javax.swing.JFileChooser; +import javax.swing.JLabel; +import javax.swing.JOptionPane; +import javax.swing.JPanel; +import javax.swing.JTextField; + +import org.apache.zookeeper.inspector.logger.LoggerFactory; +import org.apache.zookeeper.inspector.manager.Pair; + +/** + * The connection properties dialog. This is used to determine the settings for + * connecting to a zookeeper instance + */ +public class ZooInspectorConnectionPropertiesDialog extends JDialog { + + private final HashMap components; + + /** + * @param lastConnectionProps + * - the last connection properties used. if this is the first + * conneciton since starting the applications this will be the + * default settings + * @param connectionPropertiesTemplateAndLabels + * - the connection properties and labels to show in this dialog + * @param zooInspectorPanel + * - the {@link ZooInspectorPanel} linked to this dialog + */ + public ZooInspectorConnectionPropertiesDialog( + Properties lastConnectionProps, + Pair>, Map> connectionPropertiesTemplateAndLabels, + final ZooInspectorPanel zooInspectorPanel) { + final Map> connectionPropertiesTemplate = connectionPropertiesTemplateAndLabels + .getKey(); + final Map connectionPropertiesLabels = connectionPropertiesTemplateAndLabels + .getValue(); + this.setLayout(new BorderLayout()); + this.setTitle("Connection Settings"); + this.setModal(true); + this.setAlwaysOnTop(true); + this.setResizable(false); + final JPanel options = new JPanel(); + final JFileChooser fileChooser = new JFileChooser(); + options.setLayout(new GridBagLayout()); + int i = 0; + components = new HashMap(); + for (Entry> entry : connectionPropertiesTemplate + .entrySet()) { + int rowPos = 2 * i + 1; + JLabel label = new JLabel(connectionPropertiesLabels.get(entry + .getKey())); + GridBagConstraints c1 = new GridBagConstraints(); + c1.gridx = 0; + c1.gridy = rowPos; + c1.gridwidth = 1; + c1.gridheight = 1; + c1.weightx = 0; + c1.weighty = 0; + c1.anchor = GridBagConstraints.WEST; + c1.fill = GridBagConstraints.HORIZONTAL; + c1.insets = new Insets(5, 5, 5, 5); + c1.ipadx = 0; + c1.ipady = 0; + options.add(label, c1); + if (entry.getValue().size() == 0) { + JTextField text = new JTextField(); + GridBagConstraints c2 = new GridBagConstraints(); + c2.gridx = 2; + c2.gridy = rowPos; + c2.gridwidth = 1; + c2.gridheight = 1; + c2.weightx = 0; + c2.weighty = 0; + c2.anchor = GridBagConstraints.WEST; + c2.fill = GridBagConstraints.HORIZONTAL; + c2.insets = new Insets(5, 5, 5, 5); + c2.ipadx = 0; + c2.ipady = 0; + options.add(text, c2); + components.put(entry.getKey(), text); + } else if (entry.getValue().size() == 1) { + JTextField text = new JTextField(entry.getValue().get(0)); + GridBagConstraints c2 = new GridBagConstraints(); + c2.gridx = 2; + c2.gridy = rowPos; + c2.gridwidth = 1; + c2.gridheight = 1; + c2.weightx = 0; + c2.weighty = 0; + c2.anchor = GridBagConstraints.WEST; + c2.fill = GridBagConstraints.HORIZONTAL; + c2.insets = new Insets(5, 5, 5, 5); + c2.ipadx = 0; + c2.ipady = 0; + options.add(text, c2); + components.put(entry.getKey(), text); + } else { + List list = entry.getValue(); + JComboBox combo = new JComboBox(list.toArray(new String[list + .size()])); + combo.setSelectedItem(list.get(0)); + GridBagConstraints c2 = new GridBagConstraints(); + c2.gridx = 2; + c2.gridy = rowPos; + c2.gridwidth = 1; + c2.gridheight = 1; + c2.weightx = 0; + c2.weighty = 0; + c2.anchor = GridBagConstraints.WEST; + c2.fill = GridBagConstraints.HORIZONTAL; + c2.insets = new Insets(5, 5, 5, 5); + c2.ipadx = 0; + c2.ipady = 0; + options.add(combo, c2); + components.put(entry.getKey(), combo); + } + i++; + } + loadConnectionProps(lastConnectionProps); + JPanel buttonsPanel = new JPanel(); + buttonsPanel.setLayout(new GridBagLayout()); + JButton loadPropsFileButton = new JButton("Load from file"); + loadPropsFileButton.addActionListener(new ActionListener() { + + public void actionPerformed(ActionEvent e) { + int result = fileChooser + .showOpenDialog(ZooInspectorConnectionPropertiesDialog.this); + if (result == JFileChooser.APPROVE_OPTION) { + File propsFilePath = fileChooser.getSelectedFile(); + Properties props = new Properties(); + try { + FileReader reader = new FileReader(propsFilePath); + try { + props.load(reader); + loadConnectionProps(props); + } finally { + reader.close(); + } + } catch (IOException ex) { + LoggerFactory + .getLogger() + .error( + "An Error occurred loading connection properties from file", + ex); + JOptionPane + .showMessageDialog( + ZooInspectorConnectionPropertiesDialog.this, + "An Error occurred loading connection properties from file", + "Error", JOptionPane.ERROR_MESSAGE); + } + options.revalidate(); + options.repaint(); + } + + } + }); + GridBagConstraints c3 = new GridBagConstraints(); + c3.gridx = 0; + c3.gridy = 0; + c3.gridwidth = 1; + c3.gridheight = 1; + c3.weightx = 0; + c3.weighty = 1; + c3.anchor = GridBagConstraints.SOUTHWEST; + c3.fill = GridBagConstraints.NONE; + c3.insets = new Insets(5, 5, 5, 5); + c3.ipadx = 0; + c3.ipady = 0; + buttonsPanel.add(loadPropsFileButton, c3); + JButton saveDefaultPropsFileButton = new JButton("Set As Default"); + saveDefaultPropsFileButton.addActionListener(new ActionListener() { + + public void actionPerformed(ActionEvent e) { + + Properties connectionProps = getConnectionProps(); + try { + zooInspectorPanel + .setdefaultConnectionProps(connectionProps); + } catch (IOException ex) { + LoggerFactory + .getLogger() + .error( + "An Error occurred saving the default connection properties file", + ex); + JOptionPane + .showMessageDialog( + ZooInspectorConnectionPropertiesDialog.this, + "An Error occurred saving the default connection properties file", + "Error", JOptionPane.ERROR_MESSAGE); + } + } + }); + GridBagConstraints c6 = new GridBagConstraints(); + c6.gridx = 1; + c6.gridy = 0; + c6.gridwidth = 1; + c6.gridheight = 1; + c6.weightx = 1; + c6.weighty = 1; + c6.anchor = GridBagConstraints.SOUTHWEST; + c6.fill = GridBagConstraints.NONE; + c6.insets = new Insets(5, 5, 5, 5); + c6.ipadx = 0; + c6.ipady = 0; + buttonsPanel.add(saveDefaultPropsFileButton, c6); + JButton okButton = new JButton("OK"); + okButton.addActionListener(new ActionListener() { + + public void actionPerformed(ActionEvent e) { + ZooInspectorConnectionPropertiesDialog.this.dispose(); + Properties connectionProps = getConnectionProps(); + zooInspectorPanel.connect(connectionProps); + } + }); + GridBagConstraints c4 = new GridBagConstraints(); + c4.gridx = 2; + c4.gridy = 0; + c4.gridwidth = 1; + c4.gridheight = 1; + c4.weightx = 0; + c4.weighty = 1; + c4.anchor = GridBagConstraints.SOUTH; + c4.fill = GridBagConstraints.HORIZONTAL; + c4.insets = new Insets(5, 5, 5, 5); + c4.ipadx = 0; + c4.ipady = 0; + buttonsPanel.add(okButton, c4); + JButton cancelButton = new JButton("Cancel"); + cancelButton.addActionListener(new ActionListener() { + + public void actionPerformed(ActionEvent e) { + ZooInspectorConnectionPropertiesDialog.this.dispose(); + } + }); + GridBagConstraints c5 = new GridBagConstraints(); + c5.gridx = 3; + c5.gridy = 0; + c5.gridwidth = 1; + c5.gridheight = 1; + c5.weightx = 0; + c5.weighty = 1; + c5.anchor = GridBagConstraints.SOUTH; + c5.fill = GridBagConstraints.HORIZONTAL; + c5.insets = new Insets(5, 5, 5, 5); + c5.ipadx = 0; + c5.ipady = 0; + buttonsPanel.add(cancelButton, c5); + this.add(options, BorderLayout.CENTER); + this.add(buttonsPanel, BorderLayout.SOUTH); + this.pack(); + } + + private void loadConnectionProps(Properties props) { + if (props != null) { + for (Object key : props.keySet()) { + String propsKey = (String) key; + if (components.containsKey(propsKey)) { + JComponent component = components.get(propsKey); + String value = props.getProperty(propsKey); + if (component instanceof JTextField) { + ((JTextField) component).setText(value); + } else if (component instanceof JComboBox) { + ((JComboBox) component).setSelectedItem(value); + } + } + } + } + } + + private Properties getConnectionProps() { + Properties connectionProps = new Properties(); + for (Entry entry : components.entrySet()) { + String value = null; + JComponent component = entry.getValue(); + if (component instanceof JTextField) { + value = ((JTextField) component).getText(); + } else if (component instanceof JComboBox) { + value = ((JComboBox) component).getSelectedItem().toString(); + } + connectionProps.put(entry.getKey(), value); + } + return connectionProps; + } +} diff --git a/pkg/registry/zookeeper-3.4.6/contrib/ZooInspector/src/java/org/apache/zookeeper/inspector/gui/ZooInspectorIconResources.java b/pkg/registry/zookeeper-3.4.6/contrib/ZooInspector/src/java/org/apache/zookeeper/inspector/gui/ZooInspectorIconResources.java new file mode 100644 index 000000000..fa45ab31e --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/contrib/ZooInspector/src/java/org/apache/zookeeper/inspector/gui/ZooInspectorIconResources.java @@ -0,0 +1,118 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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. + */ +package org.apache.zookeeper.inspector.gui; + +import javax.swing.ImageIcon; + +/** + * A class containing static methods for retrieving {@link ImageIcon}s used in + * the application + */ +public class ZooInspectorIconResources { + + /** + * @return file icon + */ + public static ImageIcon getTreeLeafIcon() { + return new ImageIcon("icons/file_obj.gif"); //$NON-NLS-1$ + } + + /** + * @return folder open icon + */ + public static ImageIcon getTreeOpenIcon() { + return new ImageIcon("icons/fldr_obj.gif"); //$NON-NLS-1$ + } + + /** + * @return folder closed icon + */ + public static ImageIcon getTreeClosedIcon() { + return new ImageIcon("icons/fldr_obj.gif"); //$NON-NLS-1$ + } + + /** + * @return connect icon + */ + public static ImageIcon getConnectIcon() { + return new ImageIcon("icons/launch_run.gif"); //$NON-NLS-1$ + } + + /** + * @return disconnect icon + */ + public static ImageIcon getDisconnectIcon() { + return new ImageIcon("icons/launch_stop.gif"); //$NON-NLS-1$ + } + + /** + * @return save icon + */ + public static ImageIcon getSaveIcon() { + return new ImageIcon("icons/save_edit.gif"); //$NON-NLS-1$ + } + + /** + * @return add icon + */ + public static ImageIcon getAddNodeIcon() { + return new ImageIcon("icons/new_con.gif"); //$NON-NLS-1$ + } + + /** + * @return delete icon + */ + public static ImageIcon getDeleteNodeIcon() { + return new ImageIcon("icons/trash.gif"); //$NON-NLS-1$ + } + + /** + * @return refresh icon + */ + public static ImageIcon getRefreshIcon() { + return new ImageIcon("icons/refresh.gif"); //$NON-NLS-1$ + } + + /** + * @return information icon + */ + public static ImageIcon getInformationIcon() { + return new ImageIcon("icons/info_obj.gif"); //$NON-NLS-1$ + } + + /** + * @return node viewers icon + */ + public static ImageIcon getChangeNodeViewersIcon() { + return new ImageIcon("icons/edtsrclkup_co.gif"); //$NON-NLS-1$ + } + + /** + * @return up icon + */ + public static ImageIcon getUpIcon() { + return new ImageIcon("icons/search_prev.gif"); //$NON-NLS-1$ + } + + /** + * @return down icon + */ + public static ImageIcon getDownIcon() { + return new ImageIcon("icons/search_next.gif"); //$NON-NLS-1$ + } +} diff --git a/pkg/registry/zookeeper-3.4.6/contrib/ZooInspector/src/java/org/apache/zookeeper/inspector/gui/ZooInspectorNodeViewersDialog.java b/pkg/registry/zookeeper-3.4.6/contrib/ZooInspector/src/java/org/apache/zookeeper/inspector/gui/ZooInspectorNodeViewersDialog.java new file mode 100644 index 000000000..fd0b00ac0 --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/contrib/ZooInspector/src/java/org/apache/zookeeper/inspector/gui/ZooInspectorNodeViewersDialog.java @@ -0,0 +1,605 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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. + */ +package org.apache.zookeeper.inspector.gui; + +import java.awt.BorderLayout; +import java.awt.Component; +import java.awt.FlowLayout; +import java.awt.Frame; +import java.awt.GridBagConstraints; +import java.awt.GridBagLayout; +import java.awt.Insets; +import java.awt.datatransfer.Transferable; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.io.File; +import java.io.IOException; +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; + +import javax.swing.DefaultListCellRenderer; +import javax.swing.DefaultListModel; +import javax.swing.DropMode; +import javax.swing.JButton; +import javax.swing.JComponent; +import javax.swing.JDialog; +import javax.swing.JFileChooser; +import javax.swing.JLabel; +import javax.swing.JList; +import javax.swing.JOptionPane; +import javax.swing.JPanel; +import javax.swing.JScrollPane; +import javax.swing.JTextField; +import javax.swing.ListSelectionModel; +import javax.swing.TransferHandler; +import javax.swing.event.ListSelectionEvent; +import javax.swing.event.ListSelectionListener; + +import org.apache.zookeeper.inspector.gui.nodeviewer.ZooInspectorNodeViewer; +import org.apache.zookeeper.inspector.logger.LoggerFactory; +import org.apache.zookeeper.inspector.manager.ZooInspectorManager; + +/** + * A {@link JDialog} for configuring which {@link ZooInspectorNodeViewer}s to + * show in the application + */ +public class ZooInspectorNodeViewersDialog extends JDialog implements + ListSelectionListener { + + private final JButton upButton; + private final JButton downButton; + private final JButton removeButton; + private final JButton addButton; + private final JList viewersList; + private final JButton saveFileButton; + private final JButton loadFileButton; + private final JButton setDefaultsButton; + private final JFileChooser fileChooser = new JFileChooser(new File(".")); + + /** + * @param frame + * - the Frame from which the dialog is displayed + * @param currentViewers + * - the {@link ZooInspectorNodeViewer}s to show + * @param listeners + * - the {@link NodeViewersChangeListener}s which need to be + * notified of changes to the node viewers configuration + * @param manager + * - the {@link ZooInspectorManager} for the application + * + */ + public ZooInspectorNodeViewersDialog(Frame frame, + final List currentViewers, + final Collection listeners, + final ZooInspectorManager manager) { + super(frame); + final List newViewers = new ArrayList( + currentViewers); + this.setLayout(new BorderLayout()); + this.setIconImage(ZooInspectorIconResources.getChangeNodeViewersIcon() + .getImage()); + this.setTitle("About ZooInspector"); + this.setModal(true); + this.setAlwaysOnTop(true); + this.setResizable(true); + final JPanel panel = new JPanel(); + panel.setLayout(new GridBagLayout()); + viewersList = new JList(); + DefaultListModel model = new DefaultListModel(); + for (ZooInspectorNodeViewer viewer : newViewers) { + model.addElement(viewer); + } + viewersList.setModel(model); + viewersList.setCellRenderer(new DefaultListCellRenderer() { + @Override + public Component getListCellRendererComponent(JList list, + Object value, int index, boolean isSelected, + boolean cellHasFocus) { + ZooInspectorNodeViewer viewer = (ZooInspectorNodeViewer) value; + JLabel label = (JLabel) super.getListCellRendererComponent( + list, value, index, isSelected, cellHasFocus); + label.setText(viewer.getTitle()); + return label; + } + }); + viewersList.setDropMode(DropMode.INSERT); + viewersList.enableInputMethods(true); + viewersList.setDragEnabled(true); + viewersList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); + viewersList.getSelectionModel().addListSelectionListener(this); + viewersList.setTransferHandler(new TransferHandler() { + + @Override + public boolean canImport(TransferHandler.TransferSupport info) { + // we only import NodeViewers + if (!info + .isDataFlavorSupported(ZooInspectorNodeViewer.nodeViewerDataFlavor)) { + return false; + } + + JList.DropLocation dl = (JList.DropLocation) info + .getDropLocation(); + if (dl.getIndex() == -1) { + return false; + } + return true; + } + + @Override + public boolean importData(TransferHandler.TransferSupport info) { + JList.DropLocation dl = (JList.DropLocation) info + .getDropLocation(); + DefaultListModel listModel = (DefaultListModel) viewersList + .getModel(); + int index = dl.getIndex(); + boolean insert = dl.isInsert(); + // Get the string that is being dropped. + Transferable t = info.getTransferable(); + String data; + try { + data = (String) t + .getTransferData(ZooInspectorNodeViewer.nodeViewerDataFlavor); + } catch (Exception e) { + return false; + } + try { + ZooInspectorNodeViewer viewer = (ZooInspectorNodeViewer) Class + .forName(data).newInstance(); + if (listModel.contains(viewer)) { + listModel.removeElement(viewer); + } + if (insert) { + listModel.add(index, viewer); + } else { + listModel.set(index, viewer); + } + return true; + } catch (Exception e) { + LoggerFactory.getLogger().error( + "Error instantiating class: " + data, e); + return false; + } + + } + + @Override + public int getSourceActions(JComponent c) { + return MOVE; + } + + @Override + protected Transferable createTransferable(JComponent c) { + JList list = (JList) c; + ZooInspectorNodeViewer value = (ZooInspectorNodeViewer) list + .getSelectedValue(); + return value; + } + }); + JScrollPane scroller = new JScrollPane(viewersList); + GridBagConstraints c1 = new GridBagConstraints(); + c1.gridx = 0; + c1.gridy = 0; + c1.gridwidth = 3; + c1.gridheight = 3; + c1.weightx = 0; + c1.weighty = 1; + c1.anchor = GridBagConstraints.CENTER; + c1.fill = GridBagConstraints.BOTH; + c1.insets = new Insets(5, 5, 5, 5); + c1.ipadx = 0; + c1.ipady = 0; + panel.add(scroller, c1); + upButton = new JButton(ZooInspectorIconResources.getUpIcon()); + downButton = new JButton(ZooInspectorIconResources.getDownIcon()); + removeButton = new JButton(ZooInspectorIconResources + .getDeleteNodeIcon()); + addButton = new JButton(ZooInspectorIconResources.getAddNodeIcon()); + upButton.setEnabled(false); + downButton.setEnabled(false); + removeButton.setEnabled(false); + addButton.setEnabled(true); + upButton.setToolTipText("Move currently selected node viewer up"); + downButton.setToolTipText("Move currently selected node viewer down"); + removeButton.setToolTipText("Remove currently selected node viewer"); + addButton.setToolTipText("Add node viewer"); + final JTextField newViewerTextField = new JTextField(); + GridBagConstraints c2 = new GridBagConstraints(); + c2.gridx = 3; + c2.gridy = 0; + c2.gridwidth = 1; + c2.gridheight = 1; + c2.weightx = 0; + c2.weighty = 0; + c2.anchor = GridBagConstraints.NORTH; + c2.fill = GridBagConstraints.HORIZONTAL; + c2.insets = new Insets(5, 5, 5, 5); + c2.ipadx = 0; + c2.ipady = 0; + panel.add(upButton, c2); + GridBagConstraints c3 = new GridBagConstraints(); + c3.gridx = 3; + c3.gridy = 2; + c3.gridwidth = 1; + c3.gridheight = 1; + c3.weightx = 0; + c3.weighty = 0; + c3.anchor = GridBagConstraints.NORTH; + c3.fill = GridBagConstraints.HORIZONTAL; + c3.insets = new Insets(5, 5, 5, 5); + c3.ipadx = 0; + c3.ipady = 0; + panel.add(downButton, c3); + GridBagConstraints c4 = new GridBagConstraints(); + c4.gridx = 3; + c4.gridy = 1; + c4.gridwidth = 1; + c4.gridheight = 1; + c4.weightx = 0; + c4.weighty = 0; + c4.anchor = GridBagConstraints.NORTH; + c4.fill = GridBagConstraints.HORIZONTAL; + c4.insets = new Insets(5, 5, 5, 5); + c4.ipadx = 0; + c4.ipady = 0; + panel.add(removeButton, c4); + GridBagConstraints c5 = new GridBagConstraints(); + c5.gridx = 0; + c5.gridy = 3; + c5.gridwidth = 3; + c5.gridheight = 1; + c5.weightx = 0; + c5.weighty = 0; + c5.anchor = GridBagConstraints.CENTER; + c5.fill = GridBagConstraints.BOTH; + c5.insets = new Insets(5, 5, 5, 5); + c5.ipadx = 0; + c5.ipady = 0; + panel.add(newViewerTextField, c5); + GridBagConstraints c6 = new GridBagConstraints(); + c6.gridx = 3; + c6.gridy = 3; + c6.gridwidth = 1; + c6.gridheight = 1; + c6.weightx = 0; + c6.weighty = 0; + c6.anchor = GridBagConstraints.CENTER; + c6.fill = GridBagConstraints.BOTH; + c6.insets = new Insets(5, 5, 5, 5); + c6.ipadx = 0; + c6.ipady = 0; + panel.add(addButton, c6); + upButton.addActionListener(new ActionListener() { + + public void actionPerformed(ActionEvent e) { + DefaultListModel listModel = (DefaultListModel) viewersList + .getModel(); + ZooInspectorNodeViewer viewer = (ZooInspectorNodeViewer) viewersList + .getSelectedValue(); + int index = viewersList.getSelectedIndex(); + if (listModel.contains(viewer)) { + listModel.removeElementAt(index); + listModel.insertElementAt(viewer, index - 1); + viewersList.setSelectedValue(viewer, true); + } + } + }); + downButton.addActionListener(new ActionListener() { + + public void actionPerformed(ActionEvent e) { + DefaultListModel listModel = (DefaultListModel) viewersList + .getModel(); + ZooInspectorNodeViewer viewer = (ZooInspectorNodeViewer) viewersList + .getSelectedValue(); + int index = viewersList.getSelectedIndex(); + if (listModel.contains(viewer)) { + listModel.removeElementAt(index); + listModel.insertElementAt(viewer, index + 1); + viewersList.setSelectedValue(viewer, true); + } + } + }); + removeButton.addActionListener(new ActionListener() { + + public void actionPerformed(ActionEvent e) { + DefaultListModel listModel = (DefaultListModel) viewersList + .getModel(); + ZooInspectorNodeViewer viewer = (ZooInspectorNodeViewer) viewersList + .getSelectedValue(); + int index = viewersList.getSelectedIndex(); + if (listModel.contains(viewer)) { + listModel.removeElement(viewer); + viewersList + .setSelectedIndex(index == listModel.size() ? index - 1 + : index); + } + } + }); + addButton.addActionListener(new ActionListener() { + + public void actionPerformed(ActionEvent e) { + String className = newViewerTextField.getText(); + if (className == null || className.length() == 0) { + JOptionPane + .showMessageDialog( + ZooInspectorNodeViewersDialog.this, + "Please enter the full class name for a Node Viewer and click the add button", + "Input Error", JOptionPane.ERROR_MESSAGE); + } else { + try { + DefaultListModel listModel = (DefaultListModel) viewersList + .getModel(); + ZooInspectorNodeViewer viewer = (ZooInspectorNodeViewer) Class + .forName(className).newInstance(); + if (listModel.contains(viewer)) { + JOptionPane + .showMessageDialog( + ZooInspectorNodeViewersDialog.this, + "Node viewer already exists. Each node viewer can only be added once.", + "Input Error", + JOptionPane.ERROR_MESSAGE); + } else { + listModel.addElement(viewer); + } + } catch (Exception ex) { + LoggerFactory + .getLogger() + .error( + "An error occurred while instaniating the node viewer. ", + ex); + JOptionPane.showMessageDialog( + ZooInspectorNodeViewersDialog.this, + "An error occurred while instaniating the node viewer: " + + ex.getMessage(), "Error", + JOptionPane.ERROR_MESSAGE); + } + } + } + }); + saveFileButton = new JButton("Save"); + loadFileButton = new JButton("Load"); + setDefaultsButton = new JButton("Set As Defaults"); + saveFileButton + .setToolTipText("Save current node viewer configuration to file"); + loadFileButton + .setToolTipText("Load node viewer configuration frm file"); + setDefaultsButton + .setToolTipText("Set current configuration asd defaults"); + GridBagConstraints c7 = new GridBagConstraints(); + c7.gridx = 0; + c7.gridy = 4; + c7.gridwidth = 1; + c7.gridheight = 1; + c7.weightx = 1; + c7.weighty = 0; + c7.anchor = GridBagConstraints.WEST; + c7.fill = GridBagConstraints.VERTICAL; + c7.insets = new Insets(5, 5, 5, 5); + c7.ipadx = 0; + c7.ipady = 0; + panel.add(saveFileButton, c7); + GridBagConstraints c8 = new GridBagConstraints(); + c8.gridx = 1; + c8.gridy = 4; + c8.gridwidth = 1; + c8.gridheight = 1; + c8.weightx = 0; + c8.weighty = 0; + c8.anchor = GridBagConstraints.WEST; + c8.fill = GridBagConstraints.VERTICAL; + c8.insets = new Insets(5, 5, 5, 5); + c8.ipadx = 0; + c8.ipady = 0; + panel.add(loadFileButton, c8); + GridBagConstraints c9 = new GridBagConstraints(); + c9.gridx = 2; + c9.gridy = 4; + c9.gridwidth = 1; + c9.gridheight = 1; + c9.weightx = 0; + c9.weighty = 0; + c9.anchor = GridBagConstraints.WEST; + c9.fill = GridBagConstraints.VERTICAL; + c9.insets = new Insets(5, 5, 5, 5); + c9.ipadx = 0; + c9.ipady = 0; + panel.add(setDefaultsButton, c9); + saveFileButton.addActionListener(new ActionListener() { + + public void actionPerformed(ActionEvent e) { + int result = fileChooser + .showSaveDialog(ZooInspectorNodeViewersDialog.this); + if (result == JFileChooser.APPROVE_OPTION) { + File selectedFile = fileChooser.getSelectedFile(); + int answer = JOptionPane.YES_OPTION; + if (selectedFile.exists()) { + answer = JOptionPane + .showConfirmDialog( + ZooInspectorNodeViewersDialog.this, + "The specified file already exists. do you want to overwrite it?", + "Confirm Overwrite", + JOptionPane.YES_NO_OPTION, + JOptionPane.WARNING_MESSAGE); + } + if (answer == JOptionPane.YES_OPTION) { + DefaultListModel listModel = (DefaultListModel) viewersList + .getModel(); + List nodeViewersClassNames = new ArrayList(); + Object[] modelContents = listModel.toArray(); + for (Object o : modelContents) { + nodeViewersClassNames + .add(((ZooInspectorNodeViewer) o) + .getClass().getCanonicalName()); + } + try { + manager.saveNodeViewersFile(selectedFile, + nodeViewersClassNames); + } catch (IOException ex) { + LoggerFactory + .getLogger() + .error( + "Error saving node veiwer configuration from file.", + ex); + JOptionPane.showMessageDialog( + ZooInspectorNodeViewersDialog.this, + "Error saving node veiwer configuration from file: " + + ex.getMessage(), "Error", + JOptionPane.ERROR_MESSAGE); + } + } + } + } + }); + loadFileButton.addActionListener(new ActionListener() { + + public void actionPerformed(ActionEvent e) { + int result = fileChooser + .showOpenDialog(ZooInspectorNodeViewersDialog.this); + if (result == JFileChooser.APPROVE_OPTION) { + try { + List nodeViewersClassNames = manager + .loadNodeViewersFile(fileChooser + .getSelectedFile()); + List nodeViewers = new ArrayList(); + for (String nodeViewersClassName : nodeViewersClassNames) { + ZooInspectorNodeViewer viewer = (ZooInspectorNodeViewer) Class + .forName(nodeViewersClassName) + .newInstance(); + nodeViewers.add(viewer); + } + DefaultListModel model = new DefaultListModel(); + for (ZooInspectorNodeViewer viewer : nodeViewers) { + model.addElement(viewer); + } + viewersList.setModel(model); + panel.revalidate(); + panel.repaint(); + } catch (Exception ex) { + LoggerFactory + .getLogger() + .error( + "Error loading node veiwer configuration from file.", + ex); + JOptionPane.showMessageDialog( + ZooInspectorNodeViewersDialog.this, + "Error loading node veiwer configuration from file: " + + ex.getMessage(), "Error", + JOptionPane.ERROR_MESSAGE); + } + } + } + }); + setDefaultsButton.addActionListener(new ActionListener() { + + public void actionPerformed(ActionEvent e) { + int answer = JOptionPane + .showConfirmDialog( + ZooInspectorNodeViewersDialog.this, + "Are you sure you want to save this configuration as the default?", + "Confirm Set Defaults", + JOptionPane.YES_NO_OPTION, + JOptionPane.WARNING_MESSAGE); + if (answer == JOptionPane.YES_OPTION) { + DefaultListModel listModel = (DefaultListModel) viewersList + .getModel(); + List nodeViewersClassNames = new ArrayList(); + Object[] modelContents = listModel.toArray(); + for (Object o : modelContents) { + nodeViewersClassNames.add(((ZooInspectorNodeViewer) o) + .getClass().getCanonicalName()); + } + try { + manager + .setDefaultNodeViewerConfiguration(nodeViewersClassNames); + } catch (IOException ex) { + LoggerFactory + .getLogger() + .error( + "Error setting default node veiwer configuration.", + ex); + JOptionPane.showMessageDialog( + ZooInspectorNodeViewersDialog.this, + "Error setting default node veiwer configuration: " + + ex.getMessage(), "Error", + JOptionPane.ERROR_MESSAGE); + } + } + } + }); + + JPanel buttonsPanel = new JPanel(); + buttonsPanel.setLayout(new FlowLayout(FlowLayout.CENTER, 10, 10)); + JButton okButton = new JButton("OK"); + okButton.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + ZooInspectorNodeViewersDialog.this.dispose(); + DefaultListModel listModel = (DefaultListModel) viewersList + .getModel(); + newViewers.clear(); + Object[] modelContents = listModel.toArray(); + for (Object o : modelContents) { + newViewers.add((ZooInspectorNodeViewer) o); + } + currentViewers.clear(); + currentViewers.addAll(newViewers); + for (NodeViewersChangeListener listener : listeners) { + listener.nodeViewersChanged(currentViewers); + } + } + }); + buttonsPanel.add(okButton); + JButton cancelButton = new JButton("Cancel"); + cancelButton.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + ZooInspectorNodeViewersDialog.this.dispose(); + } + }); + buttonsPanel.add(cancelButton); + this.add(panel, BorderLayout.CENTER); + this.add(buttonsPanel, BorderLayout.SOUTH); + this.pack(); + } + + /* + * (non-Javadoc) + * + * @see + * javax.swing.event.ListSelectionListener#valueChanged(javax.swing.event + * .ListSelectionEvent) + */ + public void valueChanged(ListSelectionEvent e) { + int index = viewersList.getSelectedIndex(); + if (index == -1) { + removeButton.setEnabled(false); + upButton.setEnabled(false); + downButton.setEnabled(false); + } else { + removeButton.setEnabled(true); + if (index == 0) { + upButton.setEnabled(false); + } else { + upButton.setEnabled(true); + } + if (index == ((DefaultListModel) viewersList.getModel()).getSize()) { + downButton.setEnabled(false); + } else { + downButton.setEnabled(true); + } + } + } +} diff --git a/pkg/registry/zookeeper-3.4.6/contrib/ZooInspector/src/java/org/apache/zookeeper/inspector/gui/ZooInspectorNodeViewersPanel.java b/pkg/registry/zookeeper-3.4.6/contrib/ZooInspector/src/java/org/apache/zookeeper/inspector/gui/ZooInspectorNodeViewersPanel.java new file mode 100644 index 000000000..05c256b5a --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/contrib/ZooInspector/src/java/org/apache/zookeeper/inspector/gui/ZooInspectorNodeViewersPanel.java @@ -0,0 +1,140 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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. + */ +package org.apache.zookeeper.inspector.gui; + +import java.awt.BorderLayout; +import java.util.ArrayList; +import java.util.List; + +import javax.swing.JPanel; +import javax.swing.JTabbedPane; +import javax.swing.event.ChangeEvent; +import javax.swing.event.ChangeListener; +import javax.swing.event.TreeSelectionEvent; +import javax.swing.event.TreeSelectionListener; +import javax.swing.tree.TreePath; + +import org.apache.zookeeper.inspector.gui.nodeviewer.ZooInspectorNodeViewer; +import org.apache.zookeeper.inspector.manager.ZooInspectorManager; +import org.apache.zookeeper.inspector.manager.ZooInspectorNodeManager; + +/** + * This is the {@link JPanel} which contains the {@link ZooInspectorNodeViewer}s + */ +public class ZooInspectorNodeViewersPanel extends JPanel implements + TreeSelectionListener, ChangeListener { + + private final List nodeVeiwers = new ArrayList(); + private final List needsReload = new ArrayList(); + private final JTabbedPane tabbedPane; + private final List selectedNodes = new ArrayList(); + private final ZooInspectorNodeManager zooInspectorManager; + + /** + * @param zooInspectorManager + * - the {@link ZooInspectorManager} for the application + * @param nodeVeiwers + * - the {@link ZooInspectorNodeViewer}s to show + */ + public ZooInspectorNodeViewersPanel( + ZooInspectorNodeManager zooInspectorManager, + List nodeVeiwers) { + this.zooInspectorManager = zooInspectorManager; + this.setLayout(new BorderLayout()); + tabbedPane = new JTabbedPane(JTabbedPane.TOP, + JTabbedPane.WRAP_TAB_LAYOUT); + setNodeViewers(nodeVeiwers); + tabbedPane.addChangeListener(this); + this.add(tabbedPane, BorderLayout.CENTER); + reloadSelectedViewer(); + } + + /** + * @param nodeViewers + * - the {@link ZooInspectorNodeViewer}s to show + */ + public void setNodeViewers(List nodeViewers) { + this.nodeVeiwers.clear(); + this.nodeVeiwers.addAll(nodeViewers); + needsReload.clear(); + tabbedPane.removeAll(); + for (ZooInspectorNodeViewer nodeViewer : nodeVeiwers) { + nodeViewer.setZooInspectorManager(zooInspectorManager); + needsReload.add(true); + tabbedPane.add(nodeViewer.getTitle(), nodeViewer); + } + this.revalidate(); + this.repaint(); + } + + private void reloadSelectedViewer() { + int index = this.tabbedPane.getSelectedIndex(); + if (index != -1 && this.needsReload.get(index)) { + ZooInspectorNodeViewer viewer = this.nodeVeiwers.get(index); + viewer.nodeSelectionChanged(selectedNodes); + this.needsReload.set(index, false); + } + } + + /* + * (non-Javadoc) + * + * @see + * javax.swing.event.TreeSelectionListener#valueChanged(javax.swing.event + * .TreeSelectionEvent) + */ + public void valueChanged(TreeSelectionEvent e) { + TreePath[] paths = e.getPaths(); + selectedNodes.clear(); + for (TreePath path : paths) { + boolean appended = false; + StringBuilder sb = new StringBuilder(); + Object[] pathArray = path.getPath(); + for (Object o : pathArray) { + if (o != null) { + String nodeName = o.toString(); + if (nodeName != null) { + if (nodeName.length() > 0) { + appended = true; + sb.append("/"); //$NON-NLS-1$ + sb.append(o.toString()); + } + } + } + } + if (appended) { + selectedNodes.add(sb.toString()); + } + } + for (int i = 0; i < needsReload.size(); i++) { + this.needsReload.set(i, true); + } + reloadSelectedViewer(); + } + + /* + * (non-Javadoc) + * + * @see + * javax.swing.event.ChangeListener#stateChanged(javax.swing.event.ChangeEvent + * ) + */ + public void stateChanged(ChangeEvent e) { + reloadSelectedViewer(); + } +} diff --git a/pkg/registry/zookeeper-3.4.6/contrib/ZooInspector/src/java/org/apache/zookeeper/inspector/gui/ZooInspectorPanel.java b/pkg/registry/zookeeper-3.4.6/contrib/ZooInspector/src/java/org/apache/zookeeper/inspector/gui/ZooInspectorPanel.java new file mode 100644 index 000000000..7a4efafa4 --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/contrib/ZooInspector/src/java/org/apache/zookeeper/inspector/gui/ZooInspectorPanel.java @@ -0,0 +1,361 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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. + */ +package org.apache.zookeeper.inspector.gui; + +import java.awt.BorderLayout; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; +import java.util.Properties; +import java.util.concurrent.ExecutionException; + +import javax.swing.JButton; +import javax.swing.JOptionPane; +import javax.swing.JPanel; +import javax.swing.JScrollPane; +import javax.swing.JSplitPane; +import javax.swing.JToolBar; +import javax.swing.SwingWorker; + +import org.apache.zookeeper.inspector.gui.nodeviewer.ZooInspectorNodeViewer; +import org.apache.zookeeper.inspector.logger.LoggerFactory; +import org.apache.zookeeper.inspector.manager.ZooInspectorManager; + +/** + * The parent {@link JPanel} for the whole application + */ +public class ZooInspectorPanel extends JPanel implements + NodeViewersChangeListener { + private final JButton refreshButton; + private final JButton disconnectButton; + private final JButton connectButton; + private final ZooInspectorNodeViewersPanel nodeViewersPanel; + private final ZooInspectorTreeViewer treeViewer; + private final ZooInspectorManager zooInspectorManager; + private final JButton addNodeButton; + private final JButton deleteNodeButton; + private final JButton nodeViewersButton; + private final JButton aboutButton; + private final List listeners = new ArrayList(); + { + listeners.add(this); + } + + /** + * @param zooInspectorManager + * - the {@link ZooInspectorManager} for the application + */ + public ZooInspectorPanel(final ZooInspectorManager zooInspectorManager) { + this.zooInspectorManager = zooInspectorManager; + final ArrayList nodeViewers = new ArrayList(); + try { + List defaultNodeViewersClassNames = this.zooInspectorManager + .getDefaultNodeViewerConfiguration(); + for (String className : defaultNodeViewersClassNames) { + nodeViewers.add((ZooInspectorNodeViewer) Class.forName( + className).newInstance()); + } + } catch (Exception ex) { + LoggerFactory.getLogger().error( + "Error loading default node viewers.", ex); + JOptionPane.showMessageDialog(ZooInspectorPanel.this, + "Error loading default node viewers: " + ex.getMessage(), + "Error", JOptionPane.ERROR_MESSAGE); + } + nodeViewersPanel = new ZooInspectorNodeViewersPanel( + zooInspectorManager, nodeViewers); + treeViewer = new ZooInspectorTreeViewer(zooInspectorManager, + nodeViewersPanel); + this.setLayout(new BorderLayout()); + JToolBar toolbar = new JToolBar(); + toolbar.setFloatable(false); + connectButton = new JButton(ZooInspectorIconResources.getConnectIcon()); + disconnectButton = new JButton(ZooInspectorIconResources + .getDisconnectIcon()); + refreshButton = new JButton(ZooInspectorIconResources.getRefreshIcon()); + addNodeButton = new JButton(ZooInspectorIconResources.getAddNodeIcon()); + deleteNodeButton = new JButton(ZooInspectorIconResources + .getDeleteNodeIcon()); + nodeViewersButton = new JButton(ZooInspectorIconResources + .getChangeNodeViewersIcon()); + aboutButton = new JButton(ZooInspectorIconResources + .getInformationIcon()); + toolbar.add(connectButton); + toolbar.add(disconnectButton); + toolbar.add(refreshButton); + toolbar.add(addNodeButton); + toolbar.add(deleteNodeButton); + toolbar.add(nodeViewersButton); + toolbar.add(aboutButton); + aboutButton.setEnabled(true); + connectButton.setEnabled(true); + disconnectButton.setEnabled(false); + refreshButton.setEnabled(false); + addNodeButton.setEnabled(false); + deleteNodeButton.setEnabled(false); + nodeViewersButton.setEnabled(true); + nodeViewersButton.setToolTipText("Change Node Viewers"); + aboutButton.setToolTipText("About ZooInspector"); + connectButton.setToolTipText("Connect"); + disconnectButton.setToolTipText("Disconnect"); + refreshButton.setToolTipText("Refresh"); + addNodeButton.setToolTipText("Add Node"); + deleteNodeButton.setToolTipText("Delete Node"); + connectButton.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + ZooInspectorConnectionPropertiesDialog zicpd = new ZooInspectorConnectionPropertiesDialog( + zooInspectorManager.getLastConnectionProps(), + zooInspectorManager.getConnectionPropertiesTemplate(), + ZooInspectorPanel.this); + zicpd.setVisible(true); + } + }); + disconnectButton.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + disconnect(); + } + }); + refreshButton.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + treeViewer.refreshView(); + } + }); + addNodeButton.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + final List selectedNodes = treeViewer + .getSelectedNodes(); + if (selectedNodes.size() == 1) { + final String nodeName = JOptionPane.showInputDialog( + ZooInspectorPanel.this, + "Please Enter a name for the new node", + "Create Node", JOptionPane.INFORMATION_MESSAGE); + if (nodeName != null && nodeName.length() > 0) { + SwingWorker worker = new SwingWorker() { + + @Override + protected Boolean doInBackground() throws Exception { + return ZooInspectorPanel.this.zooInspectorManager + .createNode(selectedNodes.get(0), + nodeName); + } + + @Override + protected void done() { + treeViewer.refreshView(); + } + }; + worker.execute(); + } + } else { + JOptionPane.showMessageDialog(ZooInspectorPanel.this, + "Please select 1 parent node for the new node."); + } + } + }); + deleteNodeButton.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + final List selectedNodes = treeViewer + .getSelectedNodes(); + if (selectedNodes.size() == 0) { + JOptionPane.showMessageDialog(ZooInspectorPanel.this, + "Please select at least 1 node to be deleted"); + } else { + int answer = JOptionPane.showConfirmDialog( + ZooInspectorPanel.this, + "Are you sure you want to delete the selected nodes?" + + "(This action cannot be reverted)", + "Confirm Delete", JOptionPane.YES_NO_OPTION, + JOptionPane.WARNING_MESSAGE); + if (answer == JOptionPane.YES_OPTION) { + SwingWorker worker = new SwingWorker() { + + @Override + protected Boolean doInBackground() throws Exception { + for (String nodePath : selectedNodes) { + ZooInspectorPanel.this.zooInspectorManager + .deleteNode(nodePath); + } + return true; + } + + @Override + protected void done() { + treeViewer.refreshView(); + } + }; + worker.execute(); + } + } + } + }); + nodeViewersButton.addActionListener(new ActionListener() { + + public void actionPerformed(ActionEvent e) { + ZooInspectorNodeViewersDialog nvd = new ZooInspectorNodeViewersDialog( + JOptionPane.getRootFrame(), nodeViewers, listeners, + zooInspectorManager); + nvd.setVisible(true); + } + }); + aboutButton.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + ZooInspectorAboutDialog zicpd = new ZooInspectorAboutDialog( + JOptionPane.getRootFrame()); + zicpd.setVisible(true); + } + }); + JScrollPane treeScroller = new JScrollPane(treeViewer); + JSplitPane splitPane = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, + treeScroller, nodeViewersPanel); + splitPane.setResizeWeight(0.25); + this.add(splitPane, BorderLayout.CENTER); + this.add(toolbar, BorderLayout.NORTH); + } + + /** + * @param connectionProps + * the {@link Properties} for connecting to the zookeeper + * instance + */ + public void connect(final Properties connectionProps) { + SwingWorker worker = new SwingWorker() { + + @Override + protected Boolean doInBackground() throws Exception { + zooInspectorManager.setLastConnectionProps(connectionProps); + return zooInspectorManager.connect(connectionProps); + } + + @Override + protected void done() { + try { + if (get()) { + treeViewer.refreshView(); + connectButton.setEnabled(false); + disconnectButton.setEnabled(true); + refreshButton.setEnabled(true); + addNodeButton.setEnabled(true); + deleteNodeButton.setEnabled(true); + } else { + JOptionPane.showMessageDialog(ZooInspectorPanel.this, + "Unable to connect to zookeeper", "Error", + JOptionPane.ERROR_MESSAGE); + } + } catch (InterruptedException e) { + LoggerFactory + .getLogger() + .error( + "Error occurred while connecting to ZooKeeper server", + e); + } catch (ExecutionException e) { + LoggerFactory + .getLogger() + .error( + "Error occurred while connecting to ZooKeeper server", + e); + } + } + + }; + worker.execute(); + } + + /** + * + */ + public void disconnect() { + disconnect(false); + } + + /** + * @param wait + * - set this to true if the method should only return once the + * application has successfully disconnected + */ + public void disconnect(boolean wait) { + SwingWorker worker = new SwingWorker() { + + @Override + protected Boolean doInBackground() throws Exception { + return ZooInspectorPanel.this.zooInspectorManager.disconnect(); + } + + @Override + protected void done() { + try { + if (get()) { + treeViewer.clearView(); + connectButton.setEnabled(true); + disconnectButton.setEnabled(false); + refreshButton.setEnabled(false); + addNodeButton.setEnabled(false); + deleteNodeButton.setEnabled(false); + } + } catch (InterruptedException e) { + LoggerFactory + .getLogger() + .error( + "Error occurred while disconnecting from ZooKeeper server", + e); + } catch (ExecutionException e) { + LoggerFactory + .getLogger() + .error( + "Error occurred while disconnecting from ZooKeeper server", + e); + } + } + + }; + worker.execute(); + if (wait) { + while (!worker.isDone()) { + try { + Thread.sleep(100); + } catch (InterruptedException e) { + LoggerFactory + .getLogger() + .error( + "Error occurred while disconnecting from ZooKeeper server", + e); + } + } + } + } + + /* + * (non-Javadoc) + * + * @seeorg.apache.zookeeper.inspector.gui.NodeViewersChangeListener# + * nodeViewersChanged(java.util.List) + */ + public void nodeViewersChanged(List newViewers) { + this.nodeViewersPanel.setNodeViewers(newViewers); + } + + /** + * @param connectionProps + * @throws IOException + */ + public void setdefaultConnectionProps(Properties connectionProps) + throws IOException { + this.zooInspectorManager.saveDefaultConnectionFile(connectionProps); + } +} diff --git a/pkg/registry/zookeeper-3.4.6/contrib/ZooInspector/src/java/org/apache/zookeeper/inspector/gui/ZooInspectorTreeViewer.java b/pkg/registry/zookeeper-3.4.6/contrib/ZooInspector/src/java/org/apache/zookeeper/inspector/gui/ZooInspectorTreeViewer.java new file mode 100644 index 000000000..128b358eb --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/contrib/ZooInspector/src/java/org/apache/zookeeper/inspector/gui/ZooInspectorTreeViewer.java @@ -0,0 +1,362 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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. + */ +package org.apache.zookeeper.inspector.gui; + +import java.awt.BorderLayout; +import java.awt.Color; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.awt.event.MouseAdapter; +import java.awt.event.MouseEvent; +import java.util.ArrayList; +import java.util.Collections; +import java.util.Enumeration; +import java.util.LinkedHashSet; +import java.util.List; +import java.util.Map; +import java.util.Set; + +import javax.swing.JMenuItem; +import javax.swing.JPanel; +import javax.swing.JPopupMenu; +import javax.swing.JTree; +import javax.swing.SwingWorker; +import javax.swing.event.TreeSelectionListener; +import javax.swing.tree.DefaultMutableTreeNode; +import javax.swing.tree.DefaultTreeCellRenderer; +import javax.swing.tree.DefaultTreeModel; +import javax.swing.tree.TreeNode; +import javax.swing.tree.TreePath; + +import org.apache.zookeeper.inspector.manager.NodeListener; +import org.apache.zookeeper.inspector.manager.ZooInspectorManager; + +import com.nitido.utils.toaster.Toaster; + +/** + * A {@link JPanel} for showing the tree view of all the nodes in the zookeeper + * instance + */ +public class ZooInspectorTreeViewer extends JPanel implements NodeListener { + private final ZooInspectorManager zooInspectorManager; + private final JTree tree; + private final Toaster toasterManager; + + /** + * @param zooInspectorManager + * - the {@link ZooInspectorManager} for the application + * @param listener + * - the {@link TreeSelectionListener} to listen for changes in + * the selected node on the node tree + */ + public ZooInspectorTreeViewer( + final ZooInspectorManager zooInspectorManager, + TreeSelectionListener listener) { + this.zooInspectorManager = zooInspectorManager; + this.setLayout(new BorderLayout()); + final JPopupMenu popupMenu = new JPopupMenu(); + final JMenuItem addNotify = new JMenuItem("Add Change Notification"); + this.toasterManager = new Toaster(); + this.toasterManager.setBorderColor(Color.BLACK); + this.toasterManager.setMessageColor(Color.BLACK); + this.toasterManager.setToasterColor(Color.WHITE); + addNotify.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + List selectedNodes = getSelectedNodes(); + zooInspectorManager.addWatchers(selectedNodes, + ZooInspectorTreeViewer.this); + } + }); + final JMenuItem removeNotify = new JMenuItem( + "Remove Change Notification"); + removeNotify.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + List selectedNodes = getSelectedNodes(); + zooInspectorManager.removeWatchers(selectedNodes); + } + }); + tree = new JTree(new DefaultMutableTreeNode()); + tree.setCellRenderer(new ZooInspectorTreeCellRenderer()); + tree.setEditable(false); + tree.getSelectionModel().addTreeSelectionListener(listener); + tree.addMouseListener(new MouseAdapter() { + @Override + public void mouseClicked(MouseEvent e) { + if (e.isPopupTrigger() || e.getButton() == MouseEvent.BUTTON3) { + // TODO only show add if a selected node isn't being + // watched, and only show remove if a selected node is being + // watched + popupMenu.removeAll(); + popupMenu.add(addNotify); + popupMenu.add(removeNotify); + popupMenu.show(ZooInspectorTreeViewer.this, e.getX(), e + .getY()); + } + } + }); + this.add(tree, BorderLayout.CENTER); + } + + /** + * Refresh the tree view + */ + public void refreshView() { + final Set expandedNodes = new LinkedHashSet(); + int rowCount = tree.getRowCount(); + for (int i = 0; i < rowCount; i++) { + TreePath path = tree.getPathForRow(i); + if (tree.isExpanded(path)) { + expandedNodes.add(path); + } + } + final TreePath[] selectedNodes = tree.getSelectionPaths(); + SwingWorker worker = new SwingWorker() { + + @Override + protected Boolean doInBackground() throws Exception { + tree.setModel(new DefaultTreeModel(new ZooInspectorTreeNode( + "/", null))); + return true; + } + + @Override + protected void done() { + for (TreePath path : expandedNodes) { + tree.expandPath(path); + } + tree.getSelectionModel().setSelectionPaths(selectedNodes); + } + }; + worker.execute(); + } + + /** + * clear the tree view of all nodes + */ + public void clearView() { + tree.setModel(new DefaultTreeModel(new DefaultMutableTreeNode())); + } + + /** + * @author Colin + * + */ + private static class ZooInspectorTreeCellRenderer extends + DefaultTreeCellRenderer { + public ZooInspectorTreeCellRenderer() { + setLeafIcon(ZooInspectorIconResources.getTreeLeafIcon()); + setOpenIcon(ZooInspectorIconResources.getTreeOpenIcon()); + setClosedIcon(ZooInspectorIconResources.getTreeClosedIcon()); + } + } + + /** + * @author Colin + * + */ + private class ZooInspectorTreeNode implements TreeNode { + private final String nodePath; + private final String nodeName; + private final ZooInspectorTreeNode parent; + + public ZooInspectorTreeNode(String nodePath, ZooInspectorTreeNode parent) { + this.parent = parent; + this.nodePath = nodePath; + int index = nodePath.lastIndexOf("/"); + if (index == -1) { + throw new IllegalArgumentException("Invalid node path" + + nodePath); + } + this.nodeName = nodePath.substring(index + 1); + } + + /* + * (non-Javadoc) + * + * @see javax.swing.tree.TreeNode#children() + */ + public Enumeration children() { + List children = zooInspectorManager + .getChildren(this.nodePath); + Collections.sort(children); + List returnChildren = new ArrayList(); + for (String child : children) { + returnChildren.add(new ZooInspectorTreeNode((this.nodePath + .equals("/") ? "" : this.nodePath) + + "/" + child, this)); + } + return Collections.enumeration(returnChildren); + } + + /* + * (non-Javadoc) + * + * @see javax.swing.tree.TreeNode#getAllowsChildren() + */ + public boolean getAllowsChildren() { + return zooInspectorManager.isAllowsChildren(this.nodePath); + } + + /* + * (non-Javadoc) + * + * @see javax.swing.tree.TreeNode#getChildAt(int) + */ + public TreeNode getChildAt(int childIndex) { + String child = zooInspectorManager.getNodeChild(this.nodePath, + childIndex); + if (child != null) { + return new ZooInspectorTreeNode((this.nodePath.equals("/") ? "" + : this.nodePath) + + "/" + child, this); + } + return null; + } + + /* + * (non-Javadoc) + * + * @see javax.swing.tree.TreeNode#getChildCount() + */ + public int getChildCount() { + return zooInspectorManager.getNumChildren(this.nodePath); + } + + /* + * (non-Javadoc) + * + * @see javax.swing.tree.TreeNode#getIndex(javax.swing.tree.TreeNode) + */ + public int getIndex(TreeNode node) { + return zooInspectorManager.getNodeIndex(this.nodePath); + } + + /* + * (non-Javadoc) + * + * @see javax.swing.tree.TreeNode#getParent() + */ + public TreeNode getParent() { + return this.parent; + } + + /* + * (non-Javadoc) + * + * @see javax.swing.tree.TreeNode#isLeaf() + */ + public boolean isLeaf() { + return !zooInspectorManager.hasChildren(this.nodePath); + } + + @Override + public String toString() { + return this.nodeName; + } + + @Override + public int hashCode() { + final int prime = 31; + int result = 1; + result = prime * result + getOuterType().hashCode(); + result = prime * result + + ((nodePath == null) ? 0 : nodePath.hashCode()); + result = prime * result + + ((parent == null) ? 0 : parent.hashCode()); + return result; + } + + @Override + public boolean equals(Object obj) { + if (this == obj) + return true; + if (obj == null) + return false; + if (getClass() != obj.getClass()) + return false; + ZooInspectorTreeNode other = (ZooInspectorTreeNode) obj; + if (!getOuterType().equals(other.getOuterType())) + return false; + if (nodePath == null) { + if (other.nodePath != null) + return false; + } else if (!nodePath.equals(other.nodePath)) + return false; + if (parent == null) { + if (other.parent != null) + return false; + } else if (!parent.equals(other.parent)) + return false; + return true; + } + + private ZooInspectorTreeViewer getOuterType() { + return ZooInspectorTreeViewer.this; + } + + } + + /** + * @return {@link List} of the currently selected nodes + */ + public List getSelectedNodes() { + TreePath[] paths = tree.getSelectionPaths(); + List selectedNodes = new ArrayList(); + if (paths != null) { + for (TreePath path : paths) { + StringBuilder sb = new StringBuilder(); + Object[] pathArray = path.getPath(); + for (Object o : pathArray) { + String nodeName = o.toString(); + if (nodeName.length() > 0) { + sb.append("/"); + sb.append(o.toString()); + } + } + selectedNodes.add(sb.toString()); + } + } + return selectedNodes; + } + + /* + * (non-Javadoc) + * + * @see + * org.apache.zookeeper.inspector.manager.NodeListener#processEvent(java + * .lang.String, java.lang.String, java.util.Map) + */ + public void processEvent(String nodePath, String eventType, + Map eventInfo) { + StringBuilder sb = new StringBuilder(); + sb.append("Node: "); + sb.append(nodePath); + sb.append("\nEvent: "); + sb.append(eventType); + if (eventInfo != null) { + for (Map.Entry entry : eventInfo.entrySet()) { + sb.append("\n"); + sb.append(entry.getKey()); + sb.append(": "); + sb.append(entry.getValue()); + } + } + this.toasterManager.showToaster(ZooInspectorIconResources + .getInformationIcon(), sb.toString()); + } +} diff --git a/pkg/registry/zookeeper-3.4.6/contrib/ZooInspector/src/java/org/apache/zookeeper/inspector/gui/about.html b/pkg/registry/zookeeper-3.4.6/contrib/ZooInspector/src/java/org/apache/zookeeper/inspector/gui/about.html new file mode 100644 index 000000000..17fb3dca2 --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/contrib/ZooInspector/src/java/org/apache/zookeeper/inspector/gui/about.html @@ -0,0 +1,21 @@ + + + + +ZooInspector v0.1 + + +

ZooInspector was developed by Colin Goodheart-Smithe and is +available under the Apache Software Licence v2.0.

+

The Icons used were sourced from the Eclipse project (http://www.eclipse.org) and licensed +under the Eclipse Public Licence v1.0. [http://www.eclipse.org/org/documents/epl-v10.php] +

+

ZooKeeper is available from http://zookeeper.apache.org/ +and is licensed under an Apache Software Licence v2.0

+

The ApacheSoftware Licence v2.0 can be found at http://www.apache.org/licenses/LICENSE-2.0

+ + diff --git a/pkg/registry/zookeeper-3.4.6/contrib/ZooInspector/src/java/org/apache/zookeeper/inspector/gui/nodeviewer/NodeViewerACL.java b/pkg/registry/zookeeper-3.4.6/contrib/ZooInspector/src/java/org/apache/zookeeper/inspector/gui/nodeviewer/NodeViewerACL.java new file mode 100644 index 000000000..5ac203c28 --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/contrib/ZooInspector/src/java/org/apache/zookeeper/inspector/gui/nodeviewer/NodeViewerACL.java @@ -0,0 +1,187 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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. + */ +package org.apache.zookeeper.inspector.gui.nodeviewer; + +import java.awt.BorderLayout; +import java.awt.Color; +import java.awt.GridBagConstraints; +import java.awt.GridBagLayout; +import java.awt.Insets; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.concurrent.ExecutionException; + +import javax.swing.BorderFactory; +import javax.swing.JLabel; +import javax.swing.JPanel; +import javax.swing.JScrollPane; +import javax.swing.JTextField; +import javax.swing.SwingWorker; + +import org.apache.zookeeper.inspector.logger.LoggerFactory; +import org.apache.zookeeper.inspector.manager.ZooInspectorNodeManager; + +/** + * A node viewer for displaying the ACLs currently applied to the selected node + */ +public class NodeViewerACL extends ZooInspectorNodeViewer { + private ZooInspectorNodeManager zooInspectorManager; + private final JPanel aclDataPanel; + private String selectedNode; + + /** + * + */ + public NodeViewerACL() { + this.setLayout(new BorderLayout()); + this.aclDataPanel = new JPanel(); + this.aclDataPanel.setBackground(Color.WHITE); + JScrollPane scroller = new JScrollPane(this.aclDataPanel); + this.add(scroller, BorderLayout.CENTER); + } + + /* + * (non-Javadoc) + * + * @see + * org.apache.zookeeper.inspector.gui.nodeviewer.ZooInspectorNodeViewer# + * getTitle() + */ + @Override + public String getTitle() { + return "Node ACLs"; + } + + /* + * (non-Javadoc) + * + * @see + * org.apache.zookeeper.inspector.gui.nodeviewer.ZooInspectorNodeViewer# + * nodeSelectionChanged(java.util.Set) + */ + @Override + public void nodeSelectionChanged(List selectedNodes) { + this.aclDataPanel.removeAll(); + if (selectedNodes.size() > 0) { + this.selectedNode = selectedNodes.get(0); + SwingWorker>, Void> worker = new SwingWorker>, Void>() { + + @Override + protected List> doInBackground() + throws Exception { + return NodeViewerACL.this.zooInspectorManager + .getACLs(NodeViewerACL.this.selectedNode); + } + + @Override + protected void done() { + List> acls = null; + try { + acls = get(); + } catch (InterruptedException e) { + acls = new ArrayList>(); + LoggerFactory.getLogger().error( + "Error retrieving ACL Information for node: " + + NodeViewerACL.this.selectedNode, e); + } catch (ExecutionException e) { + acls = new ArrayList>(); + LoggerFactory.getLogger().error( + "Error retrieving ACL Information for node: " + + NodeViewerACL.this.selectedNode, e); + } + aclDataPanel.setLayout(new GridBagLayout()); + int j = 0; + for (Map data : acls) { + int rowPos = 2 * j + 1; + JPanel aclPanel = new JPanel(); + aclPanel.setBorder(BorderFactory + .createLineBorder(Color.BLACK)); + aclPanel.setBackground(Color.WHITE); + aclPanel.setLayout(new GridBagLayout()); + int i = 0; + for (Map.Entry entry : data.entrySet()) { + int rowPosACL = 2 * i + 1; + JLabel label = new JLabel(entry.getKey()); + JTextField text = new JTextField(entry.getValue()); + text.setEditable(false); + GridBagConstraints c1 = new GridBagConstraints(); + c1.gridx = 1; + c1.gridy = rowPosACL; + c1.gridwidth = 1; + c1.gridheight = 1; + c1.weightx = 0; + c1.weighty = 0; + c1.anchor = GridBagConstraints.NORTHWEST; + c1.fill = GridBagConstraints.BOTH; + c1.insets = new Insets(5, 5, 5, 5); + c1.ipadx = 0; + c1.ipady = 0; + aclPanel.add(label, c1); + GridBagConstraints c2 = new GridBagConstraints(); + c2.gridx = 3; + c2.gridy = rowPosACL; + c2.gridwidth = 1; + c2.gridheight = 1; + c2.weightx = 0; + c2.weighty = 0; + c2.anchor = GridBagConstraints.NORTHWEST; + c2.fill = GridBagConstraints.BOTH; + c2.insets = new Insets(5, 5, 5, 5); + c2.ipadx = 0; + c2.ipady = 0; + aclPanel.add(text, c2); + i++; + } + GridBagConstraints c = new GridBagConstraints(); + c.gridx = 1; + c.gridy = rowPos; + c.gridwidth = 1; + c.gridheight = 1; + c.weightx = 1; + c.weighty = 1; + c.anchor = GridBagConstraints.NORTHWEST; + c.fill = GridBagConstraints.NONE; + c.insets = new Insets(5, 5, 5, 5); + c.ipadx = 0; + c.ipady = 0; + aclDataPanel.add(aclPanel, c); + } + NodeViewerACL.this.aclDataPanel.revalidate(); + NodeViewerACL.this.aclDataPanel.repaint(); + } + }; + worker.execute(); + } + } + + /* + * (non-Javadoc) + * + * @see + * org.apache.zookeeper.inspector.gui.nodeviewer.ZooInspectorNodeViewer# + * setZooInspectorManager + * (org.apache.zookeeper.inspector.manager.ZooInspectorNodeManager) + */ + @Override + public void setZooInspectorManager( + ZooInspectorNodeManager zooInspectorManager) { + this.zooInspectorManager = zooInspectorManager; + } + +} diff --git a/pkg/registry/zookeeper-3.4.6/contrib/ZooInspector/src/java/org/apache/zookeeper/inspector/gui/nodeviewer/NodeViewerData.java b/pkg/registry/zookeeper-3.4.6/contrib/ZooInspector/src/java/org/apache/zookeeper/inspector/gui/nodeviewer/NodeViewerData.java new file mode 100644 index 000000000..001cb7b21 --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/contrib/ZooInspector/src/java/org/apache/zookeeper/inspector/gui/nodeviewer/NodeViewerData.java @@ -0,0 +1,146 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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. + */ +package org.apache.zookeeper.inspector.gui.nodeviewer; + +import java.awt.BorderLayout; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.util.List; +import java.util.concurrent.ExecutionException; + +import javax.swing.JButton; +import javax.swing.JOptionPane; +import javax.swing.JScrollPane; +import javax.swing.JTextPane; +import javax.swing.JToolBar; +import javax.swing.SwingWorker; + +import org.apache.zookeeper.inspector.gui.ZooInspectorIconResources; +import org.apache.zookeeper.inspector.logger.LoggerFactory; +import org.apache.zookeeper.inspector.manager.ZooInspectorNodeManager; + +/** + * A node viewer for displaying the data for the currently selected node + */ +public class NodeViewerData extends ZooInspectorNodeViewer { + private ZooInspectorNodeManager zooInspectorManager; + private final JTextPane dataArea; + private final JToolBar toolbar; + private String selectedNode; + + /** + * + */ + public NodeViewerData() { + this.setLayout(new BorderLayout()); + this.dataArea = new JTextPane(); + this.toolbar = new JToolBar(); + this.toolbar.setFloatable(false); + JScrollPane scroller = new JScrollPane(this.dataArea); + scroller + .setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_NEVER); + this.add(scroller, BorderLayout.CENTER); + this.add(this.toolbar, BorderLayout.NORTH); + JButton saveButton = new JButton(ZooInspectorIconResources + .getSaveIcon()); + saveButton.addActionListener(new ActionListener() { + + public void actionPerformed(ActionEvent e) { + if (selectedNode != null) { + if (JOptionPane.showConfirmDialog(NodeViewerData.this, + "Are you sure you want to save this node?" + + " (this action cannot be reverted)", + "Confirm Save", JOptionPane.YES_NO_OPTION, + JOptionPane.WARNING_MESSAGE) == JOptionPane.YES_OPTION) { + zooInspectorManager.setData(selectedNode, dataArea + .getText()); + } + } + } + }); + this.toolbar.add(saveButton); + + } + + /* + * (non-Javadoc) + * + * @see + * org.apache.zookeeper.inspector.gui.nodeviewer.ZooInspectorNodeViewer# + * getTitle() + */ + @Override + public String getTitle() { + return "Node Data"; + } + + /* + * (non-Javadoc) + * + * @see + * org.apache.zookeeper.inspector.gui.nodeviewer.ZooInspectorNodeViewer# + * nodeSelectionChanged(java.util.Set) + */ + @Override + public void nodeSelectionChanged(List selectedNodes) { + if (selectedNodes.size() > 0) { + this.selectedNode = selectedNodes.get(0); + SwingWorker worker = new SwingWorker() { + + @Override + protected String doInBackground() throws Exception { + return NodeViewerData.this.zooInspectorManager + .getData(NodeViewerData.this.selectedNode); + } + + @Override + protected void done() { + String data = ""; + try { + data = get(); + } catch (InterruptedException e) { + LoggerFactory.getLogger().error( + "Error retrieving data for node: " + + NodeViewerData.this.selectedNode, e); + } catch (ExecutionException e) { + LoggerFactory.getLogger().error( + "Error retrieving data for node: " + + NodeViewerData.this.selectedNode, e); + } + NodeViewerData.this.dataArea.setText(data); + } + }; + worker.execute(); + } + } + + /* + * (non-Javadoc) + * + * @see + * org.apache.zookeeper.inspector.gui.nodeviewer.ZooInspectorNodeViewer# + * setZooInspectorManager + * (org.apache.zookeeper.inspector.manager.ZooInspectorNodeManager) + */ + @Override + public void setZooInspectorManager( + ZooInspectorNodeManager zooInspectorManager) { + this.zooInspectorManager = zooInspectorManager; + } + +} diff --git a/pkg/registry/zookeeper-3.4.6/contrib/ZooInspector/src/java/org/apache/zookeeper/inspector/gui/nodeviewer/NodeViewerMetaData.java b/pkg/registry/zookeeper-3.4.6/contrib/ZooInspector/src/java/org/apache/zookeeper/inspector/gui/nodeviewer/NodeViewerMetaData.java new file mode 100644 index 000000000..5c2df8d88 --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/contrib/ZooInspector/src/java/org/apache/zookeeper/inspector/gui/nodeviewer/NodeViewerMetaData.java @@ -0,0 +1,186 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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. + */ +package org.apache.zookeeper.inspector.gui.nodeviewer; + +import java.awt.BorderLayout; +import java.awt.Color; +import java.awt.GridBagConstraints; +import java.awt.GridBagLayout; +import java.awt.Insets; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.concurrent.ExecutionException; + +import javax.swing.JLabel; +import javax.swing.JPanel; +import javax.swing.JScrollPane; +import javax.swing.JTextField; +import javax.swing.SwingWorker; + +import org.apache.zookeeper.data.Stat; +import org.apache.zookeeper.inspector.logger.LoggerFactory; +import org.apache.zookeeper.inspector.manager.ZooInspectorNodeManager; + +/** + * A node viewer for displaying the meta data for the currently selected node. + * The meta data is essentially the information from the {@link Stat} for the + * node + */ +public class NodeViewerMetaData extends ZooInspectorNodeViewer { + private ZooInspectorNodeManager zooInspectorManager; + private final JPanel metaDataPanel; + private String selectedNode; + + /** + * + */ + public NodeViewerMetaData() { + this.setLayout(new BorderLayout()); + this.metaDataPanel = new JPanel(); + this.metaDataPanel.setBackground(Color.WHITE); + JScrollPane scroller = new JScrollPane(this.metaDataPanel); + this.add(scroller, BorderLayout.CENTER); + } + + /* + * (non-Javadoc) + * + * @see + * org.apache.zookeeper.inspector.gui.nodeviewer.ZooInspectorNodeViewer# + * getTitle() + */ + @Override + public String getTitle() { + return "Node Metadata"; + } + + /* + * (non-Javadoc) + * + * @see + * org.apache.zookeeper.inspector.gui.nodeviewer.ZooInspectorNodeViewer# + * nodeSelectionChanged(java.util.Set) + */ + @Override + public void nodeSelectionChanged(List selectedNodes) { + this.metaDataPanel.removeAll(); + if (selectedNodes.size() > 0) { + this.selectedNode = selectedNodes.get(0); + SwingWorker, Void> worker = new SwingWorker, Void>() { + + @Override + protected Map doInBackground() throws Exception { + return NodeViewerMetaData.this.zooInspectorManager + .getNodeMeta(NodeViewerMetaData.this.selectedNode); + } + + @Override + protected void done() { + Map data = null; + try { + data = get(); + } catch (InterruptedException e) { + data = new HashMap(); + LoggerFactory.getLogger().error( + "Error retrieving meta data for node: " + + NodeViewerMetaData.this.selectedNode, + e); + } catch (ExecutionException e) { + data = new HashMap(); + LoggerFactory.getLogger().error( + "Error retrieving meta data for node: " + + NodeViewerMetaData.this.selectedNode, + e); + } + NodeViewerMetaData.this.metaDataPanel + .setLayout(new GridBagLayout()); + JPanel infoPanel = new JPanel(); + infoPanel.setBackground(Color.WHITE); + infoPanel.setLayout(new GridBagLayout()); + int i = 0; + int rowPos = 0; + for (Map.Entry entry : data.entrySet()) { + rowPos = 2 * i + 1; + JLabel label = new JLabel(entry.getKey()); + JTextField text = new JTextField(entry.getValue()); + text.setEditable(false); + GridBagConstraints c1 = new GridBagConstraints(); + c1.gridx = 0; + c1.gridy = rowPos; + c1.gridwidth = 1; + c1.gridheight = 1; + c1.weightx = 0; + c1.weighty = 0; + c1.anchor = GridBagConstraints.WEST; + c1.fill = GridBagConstraints.HORIZONTAL; + c1.insets = new Insets(5, 5, 5, 5); + c1.ipadx = 0; + c1.ipady = 0; + infoPanel.add(label, c1); + GridBagConstraints c2 = new GridBagConstraints(); + c2.gridx = 2; + c2.gridy = rowPos; + c2.gridwidth = 1; + c2.gridheight = 1; + c2.weightx = 0; + c2.weighty = 0; + c2.anchor = GridBagConstraints.WEST; + c2.fill = GridBagConstraints.HORIZONTAL; + c2.insets = new Insets(5, 5, 5, 5); + c2.ipadx = 0; + c2.ipady = 0; + infoPanel.add(text, c2); + i++; + } + GridBagConstraints c = new GridBagConstraints(); + c.gridx = 1; + c.gridy = rowPos; + c.gridwidth = 1; + c.gridheight = 1; + c.weightx = 1; + c.weighty = 1; + c.anchor = GridBagConstraints.NORTHWEST; + c.fill = GridBagConstraints.NONE; + c.insets = new Insets(5, 5, 5, 5); + c.ipadx = 0; + c.ipady = 0; + NodeViewerMetaData.this.metaDataPanel.add(infoPanel, c); + NodeViewerMetaData.this.metaDataPanel.revalidate(); + NodeViewerMetaData.this.metaDataPanel.repaint(); + } + }; + worker.execute(); + } + } + + /* + * (non-Javadoc) + * + * @see + * org.apache.zookeeper.inspector.gui.nodeviewer.ZooInspectorNodeViewer# + * setZooInspectorManager + * (org.apache.zookeeper.inspector.manager.ZooInspectorNodeManager) + */ + @Override + public void setZooInspectorManager( + ZooInspectorNodeManager zooInspectorManager) { + this.zooInspectorManager = zooInspectorManager; + } + +} diff --git a/pkg/registry/zookeeper-3.4.6/contrib/ZooInspector/src/java/org/apache/zookeeper/inspector/gui/nodeviewer/ZooInspectorNodeViewer.java b/pkg/registry/zookeeper-3.4.6/contrib/ZooInspector/src/java/org/apache/zookeeper/inspector/gui/nodeviewer/ZooInspectorNodeViewer.java new file mode 100644 index 000000000..32119a85c --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/contrib/ZooInspector/src/java/org/apache/zookeeper/inspector/gui/nodeviewer/ZooInspectorNodeViewer.java @@ -0,0 +1,138 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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. + */ +package org.apache.zookeeper.inspector.gui.nodeviewer; + +import java.awt.datatransfer.DataFlavor; +import java.awt.datatransfer.Transferable; +import java.awt.datatransfer.UnsupportedFlavorException; +import java.io.IOException; +import java.util.List; + +import javax.swing.JPanel; + +import org.apache.zookeeper.inspector.manager.ZooInspectorNodeManager; + +/** + * A {@link JPanel} for displaying information about the currently selected + * node(s) + */ +public abstract class ZooInspectorNodeViewer extends JPanel implements + Transferable { + /** + * The {@link DataFlavor} used for DnD in the node viewer configuration + * dialog + */ + public static final DataFlavor nodeViewerDataFlavor = new DataFlavor( + ZooInspectorNodeViewer.class, "nodeviewer"); + + /** + * @param zooInspectorManager + */ + public abstract void setZooInspectorManager( + ZooInspectorNodeManager zooInspectorManager); + + /** + * Called whenever the selected nodes in the tree view changes. + * + * @param selectedNodes + * - the nodes currently selected in the tree view + * + */ + public abstract void nodeSelectionChanged(List selectedNodes); + + /** + * @return the title of the node viewer. this will be shown on the tab for + * this node viewer. + */ + public abstract String getTitle(); + + /* + * (non-Javadoc) + * + * @see + * java.awt.datatransfer.Transferable#getTransferData(java.awt.datatransfer + * .DataFlavor) + */ + public Object getTransferData(DataFlavor flavor) + throws UnsupportedFlavorException, IOException { + if (flavor.equals(nodeViewerDataFlavor)) { + return this.getClass().getCanonicalName(); + } else { + return null; + } + } + + /* + * (non-Javadoc) + * + * @see java.awt.datatransfer.Transferable#getTransferDataFlavors() + */ + public DataFlavor[] getTransferDataFlavors() { + return new DataFlavor[] { nodeViewerDataFlavor }; + } + + /* + * (non-Javadoc) + * + * @seejava.awt.datatransfer.Transferable#isDataFlavorSupported(java.awt. + * datatransfer.DataFlavor) + */ + public boolean isDataFlavorSupported(DataFlavor flavor) { + return flavor.equals(nodeViewerDataFlavor); + } + + /* + * (non-Javadoc) + * + * @see java.lang.Object#hashCode() + */ + @Override + public int hashCode() { + final int prime = 31; + int result = 1; + result = prime * result + + ((getTitle() == null) ? 0 : getTitle().hashCode()); + return result; + } + + /* + * (non-Javadoc) + * + * @see java.lang.Object#equals(java.lang.Object) + */ + @Override + public boolean equals(Object obj) { + if (this == obj) + return true; + if (obj == null) + return false; + if (getClass() != obj.getClass()) + return false; + ZooInspectorNodeViewer other = (ZooInspectorNodeViewer) obj; + if (getClass().getCanonicalName() != other.getClass() + .getCanonicalName()) { + return false; + } + if (getTitle() == null) { + if (other.getTitle() != null) + return false; + } else if (!getTitle().equals(other.getTitle())) + return false; + return true; + } +} diff --git a/pkg/registry/zookeeper-3.4.6/contrib/ZooInspector/src/java/org/apache/zookeeper/inspector/logger/LoggerFactory.java b/pkg/registry/zookeeper-3.4.6/contrib/ZooInspector/src/java/org/apache/zookeeper/inspector/logger/LoggerFactory.java new file mode 100644 index 000000000..e4fae4169 --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/contrib/ZooInspector/src/java/org/apache/zookeeper/inspector/logger/LoggerFactory.java @@ -0,0 +1,36 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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. + */ +package org.apache.zookeeper.inspector.logger; + +/** + * Provides a {@link Logger} for use across the entire application + * + */ +public class LoggerFactory +{ + private static final org.slf4j.Logger logger = org.slf4j.LoggerFactory.getLogger("org.apache.zookeeper.inspector"); //$NON-NLS-1$ + + /** + * @return {@link Logger} for ZooInspector + */ + public static org.slf4j.Logger getLogger() + { + return logger; + } + +} diff --git a/pkg/registry/zookeeper-3.4.6/contrib/ZooInspector/src/java/org/apache/zookeeper/inspector/manager/NodeListener.java b/pkg/registry/zookeeper-3.4.6/contrib/ZooInspector/src/java/org/apache/zookeeper/inspector/manager/NodeListener.java new file mode 100644 index 000000000..fe55a45b8 --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/contrib/ZooInspector/src/java/org/apache/zookeeper/inspector/manager/NodeListener.java @@ -0,0 +1,37 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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. + */ +package org.apache.zookeeper.inspector.manager; + +import java.util.Map; + +/** + * A Listener for Events on zookeeper nodes + */ +public interface NodeListener { + /** + * @param nodePath + * - the path of the node + * @param eventType + * - the event type + * @param eventInfo + * - a {@link Map} containing any other information about this + * event + */ + public void processEvent(String nodePath, String eventType, + Map eventInfo); +} diff --git a/pkg/registry/zookeeper-3.4.6/contrib/ZooInspector/src/java/org/apache/zookeeper/inspector/manager/Pair.java b/pkg/registry/zookeeper-3.4.6/contrib/ZooInspector/src/java/org/apache/zookeeper/inspector/manager/Pair.java new file mode 100644 index 000000000..b72950c95 --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/contrib/ZooInspector/src/java/org/apache/zookeeper/inspector/manager/Pair.java @@ -0,0 +1,120 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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. + */ +package org.apache.zookeeper.inspector.manager; + +/** + * A utility class for storing a pair of objects + * + * @param + * @param + */ +public class Pair { + private K key; + private V value; + + /** + * @param key + * @param value + */ + public Pair(K key, V value) { + this.key = key; + this.value = value; + } + + /** + * + */ + public Pair() { + // Do Nothing + } + + /** + * @return key + */ + public K getKey() { + return key; + } + + /** + * @param key + */ + public void setKey(K key) { + this.key = key; + } + + /** + * @return value + */ + public V getValue() { + return value; + } + + /** + * @param value + */ + public void setValue(V value) { + this.value = value; + } + + @Override + public String toString() { + return "Pair [" + key + ", " + value + "]"; + } + + /* + * (non-Javadoc) + * + * @see java.lang.Object#hashCode() + */ + @Override + public int hashCode() { + final int prime = 31; + int result = 1; + result = prime * result + ((key == null) ? 0 : key.hashCode()); + result = prime * result + ((value == null) ? 0 : value.hashCode()); + return result; + } + + /* + * (non-Javadoc) + * + * @see java.lang.Object#equals(java.lang.Object) + */ + @Override + public boolean equals(Object obj) { + if (this == obj) + return true; + if (obj == null) + return false; + if (getClass() != obj.getClass()) + return false; + Pair other = (Pair) obj; + if (key == null) { + if (other.key != null) + return false; + } else if (!key.equals(other.key)) + return false; + if (value == null) { + if (other.value != null) + return false; + } else if (!value.equals(other.value)) + return false; + return true; + } + +} diff --git a/pkg/registry/zookeeper-3.4.6/contrib/ZooInspector/src/java/org/apache/zookeeper/inspector/manager/ZooInspectorManager.java b/pkg/registry/zookeeper-3.4.6/contrib/ZooInspector/src/java/org/apache/zookeeper/inspector/manager/ZooInspectorManager.java new file mode 100644 index 000000000..74c3cb20e --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/contrib/ZooInspector/src/java/org/apache/zookeeper/inspector/manager/ZooInspectorManager.java @@ -0,0 +1,139 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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. + */ +package org.apache.zookeeper.inspector.manager; + +import java.io.File; +import java.io.IOException; +import java.util.Collection; +import java.util.List; +import java.util.Map; +import java.util.Properties; + +import javax.swing.JComboBox; +import javax.swing.JTextField; + +/** + * A Manager for all interactions between the application and the Zookeeper + * instance + */ +public interface ZooInspectorManager extends ZooInspectorNodeManager, + ZooInspectorNodeTreeManager { + + /** + * @param connectionProps + * @return true if successfully connected + */ + public boolean connect(Properties connectionProps); + + /** + * @return true if successfully disconnected + */ + public boolean disconnect(); + + /** + * @return a {@link Pair} containing the following: + * ]]> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Important: All versions, of all nodes, under the given node are deleted. +

+ If there is an error with deleting one of the sub-nodes in the tree, + this operation would abort and would be the responsibility of the app to handle the same. + + See {@link #delete(String, int)} for more details. + + @throws IllegalArgumentException if an invalid path is specified]]> + + + + + + + + + + + + Important: All versions, of all nodes, under the given node are deleted. +

+ If there is an error with deleting one of the sub-nodes in the tree, + this operation would abort and would be the responsibility of the app to handle the same. +

+ @param zk the zookeeper handle + @param pathRoot the path to be deleted + @param cb call back method + @param ctx the context the callback method is called with + @throws IllegalArgumentException if an invalid path is specified]]> + + + + + + + + + + Important: This is not an atomic snapshot of the tree ever, but the + state as it exists across multiple RPCs from zkClient to the ensemble. + For practical purposes, it is suggested to bring the clients to the ensemble + down (i.e. prevent writes to pathRoot) to 'simulate' a snapshot behavior. + + @param zk the zookeeper handle + @param pathRoot The znode path, for which the entire subtree needs to be listed. + @throws InterruptedException + @throws KeeperException]]> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Session establishment is asynchronous. This constructor will initiate + connection to the server and return immediately - potentially (usually) + before the session is fully established. The watcher argument specifies + the watcher that will be notified of any changes in state. This + notification can come at any point before or after the constructor call + has returned. +

+ The instantiated ZooKeeper client object will pick an arbitrary server + from the connectString and attempt to connect to it. If establishment of + the connection fails, another server in the connect string will be tried + (the order is non-deterministic, as we random shuffle the list), until a + connection is established. The client will continue attempts until the + session is explicitly closed. +

+ Added in 3.2.0: An optional "chroot" suffix may also be appended to the + connection string. This will run the client commands while interpreting + all paths relative to this root (similar to the unix chroot command). + + @param connectString + comma separated host:port pairs, each corresponding to a zk + server. e.g. "127.0.0.1:3000,127.0.0.1:3001,127.0.0.1:3002" If + the optional chroot suffix is used the example would look + like: "127.0.0.1:3000,127.0.0.1:3001,127.0.0.1:3002/app/a" + where the client would be rooted at "/app/a" and all paths + would be relative to this root - ie getting/setting/etc... + "/foo/bar" would result in operations being run on + "/app/a/foo/bar" (from the server perspective). + @param sessionTimeout + session timeout in milliseconds + @param watcher + a watcher object which will be notified of state changes, may + also be notified for node events + + @throws IOException + in cases of network failure + @throws IllegalArgumentException + if an invalid chroot path is specified]]> + + + + + + + Session establishment is asynchronous. This constructor will initiate + connection to the server and return immediately - potentially (usually) + before the session is fully established. The watcher argument specifies + the watcher that will be notified of any changes in state. This + notification can come at any point before or after the constructor call + has returned. +

+ The instantiated ZooKeeper client object will pick an arbitrary server + from the connectString and attempt to connect to it. If establishment of + the connection fails, another server in the connect string will be tried + (the order is non-deterministic, as we random shuffle the list), until a + connection is established. The client will continue attempts until the + session is explicitly closed. +

+ Added in 3.2.0: An optional "chroot" suffix may also be appended to the + connection string. This will run the client commands while interpreting + all paths relative to this root (similar to the unix chroot command). + + @param connectString + comma separated host:port pairs, each corresponding to a zk + server. e.g. "127.0.0.1:3000,127.0.0.1:3001,127.0.0.1:3002" If + the optional chroot suffix is used the example would look + like: "127.0.0.1:3000,127.0.0.1:3001,127.0.0.1:3002/app/a" + where the client would be rooted at "/app/a" and all paths + would be relative to this root - ie getting/setting/etc... + "/foo/bar" would result in operations being run on + "/app/a/foo/bar" (from the server perspective). + @param sessionTimeout + session timeout in milliseconds + @param watcher + a watcher object which will be notified of state changes, may + also be notified for node events + @param canBeReadOnly + (added in 3.4) whether the created client is allowed to go to + read-only mode in case of partitioning. Read-only mode + basically means that if the client can't find any majority + servers but there's partitioned server it could reach, it + connects to one in read-only mode, i.e. read requests are + allowed while write requests are not. It continues seeking for + majority in the background. + + @throws IOException + in cases of network failure + @throws IllegalArgumentException + if an invalid chroot path is specified]]> + + + + + + + Session establishment is asynchronous. This constructor will initiate + connection to the server and return immediately - potentially (usually) + before the session is fully established. The watcher argument specifies + the watcher that will be notified of any changes in state. This + notification can come at any point before or after the constructor call + has returned. +

+ The instantiated ZooKeeper client object will pick an arbitrary server + from the connectString and attempt to connect to it. If establishment of + the connection fails, another server in the connect string will be tried + (the order is non-deterministic, as we random shuffle the list), until a + connection is established. The client will continue attempts until the + session is explicitly closed (or the session is expired by the server). +

+ Added in 3.2.0: An optional "chroot" suffix may also be appended to the + connection string. This will run the client commands while interpreting + all paths relative to this root (similar to the unix chroot command). +

+ Use {@link #getSessionId} and {@link #getSessionPasswd} on an established + client connection, these values must be passed as sessionId and + sessionPasswd respectively if reconnecting. Otherwise, if not + reconnecting, use the other constructor which does not require these + parameters. + + @param connectString + comma separated host:port pairs, each corresponding to a zk + server. e.g. "127.0.0.1:3000,127.0.0.1:3001,127.0.0.1:3002" + If the optional chroot suffix is used the example would look + like: "127.0.0.1:3000,127.0.0.1:3001,127.0.0.1:3002/app/a" + where the client would be rooted at "/app/a" and all paths + would be relative to this root - ie getting/setting/etc... + "/foo/bar" would result in operations being run on + "/app/a/foo/bar" (from the server perspective). + @param sessionTimeout + session timeout in milliseconds + @param watcher + a watcher object which will be notified of state changes, may + also be notified for node events + @param sessionId + specific session id to use if reconnecting + @param sessionPasswd + password for this session + + @throws IOException in cases of network failure + @throws IllegalArgumentException if an invalid chroot path is specified + @throws IllegalArgumentException for an invalid list of ZooKeeper hosts]]> + + + + + + + Session establishment is asynchronous. This constructor will initiate + connection to the server and return immediately - potentially (usually) + before the session is fully established. The watcher argument specifies + the watcher that will be notified of any changes in state. This + notification can come at any point before or after the constructor call + has returned. +

+ The instantiated ZooKeeper client object will pick an arbitrary server + from the connectString and attempt to connect to it. If establishment of + the connection fails, another server in the connect string will be tried + (the order is non-deterministic, as we random shuffle the list), until a + connection is established. The client will continue attempts until the + session is explicitly closed (or the session is expired by the server). +

+ Added in 3.2.0: An optional "chroot" suffix may also be appended to the + connection string. This will run the client commands while interpreting + all paths relative to this root (similar to the unix chroot command). +

+ Use {@link #getSessionId} and {@link #getSessionPasswd} on an established + client connection, these values must be passed as sessionId and + sessionPasswd respectively if reconnecting. Otherwise, if not + reconnecting, use the other constructor which does not require these + parameters. + + @param connectString + comma separated host:port pairs, each corresponding to a zk + server. e.g. "127.0.0.1:3000,127.0.0.1:3001,127.0.0.1:3002" + If the optional chroot suffix is used the example would look + like: "127.0.0.1:3000,127.0.0.1:3001,127.0.0.1:3002/app/a" + where the client would be rooted at "/app/a" and all paths + would be relative to this root - ie getting/setting/etc... + "/foo/bar" would result in operations being run on + "/app/a/foo/bar" (from the server perspective). + @param sessionTimeout + session timeout in milliseconds + @param watcher + a watcher object which will be notified of state changes, may + also be notified for node events + @param sessionId + specific session id to use if reconnecting + @param sessionPasswd + password for this session + @param canBeReadOnly + (added in 3.4) whether the created client is allowed to go to + read-only mode in case of partitioning. Read-only mode + basically means that if the client can't find any majority + servers but there's partitioned server it could reach, it + connects to one in read-only mode, i.e. read requests are + allowed while write requests are not. It continues seeking for + majority in the background. + + @throws IOException in cases of network failure + @throws IllegalArgumentException if an invalid chroot path is specified]]> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + The flags argument specifies whether the created node will be ephemeral + or not. +

+ An ephemeral node will be removed by the ZooKeeper automatically when the + session associated with the creation of the node expires. +

+ The flags argument can also specify to create a sequential node. The + actual path name of a sequential node will be the given path plus a + suffix "i" where i is the current sequential number of the node. The sequence + number is always fixed length of 10 digits, 0 padded. Once + such a node is created, the sequential number will be incremented by one. +

+ If a node with the same actual path already exists in the ZooKeeper, a + KeeperException with error code KeeperException.NodeExists will be + thrown. Note that since a different actual path is used for each + invocation of creating sequential node with the same path argument, the + call will never throw "file exists" KeeperException. +

+ If the parent node does not exist in the ZooKeeper, a KeeperException + with error code KeeperException.NoNode will be thrown. +

+ An ephemeral node cannot have children. If the parent node of the given + path is ephemeral, a KeeperException with error code + KeeperException.NoChildrenForEphemerals will be thrown. +

+ This operation, if successful, will trigger all the watches left on the + node of the given path by exists and getData API calls, and the watches + left on the parent node by getChildren API calls. +

+ If a node is created successfully, the ZooKeeper server will trigger the + watches on the path left by exists calls, and the watches on the parent + of the node by getChildren calls. +

+ The maximum allowable size of the data array is 1 MB (1,048,576 bytes). + Arrays larger than this will cause a KeeperExecption to be thrown. + + @param path + the path for the node + @param data + the initial data for the node + @param acl + the acl for the node + @param createMode + specifying whether the node to be created is ephemeral + and/or sequential + @return the actual path of the created node + @throws KeeperException if the server returns a non-zero error code + @throws KeeperException.InvalidACLException if the ACL is invalid, null, or empty + @throws InterruptedException if the transaction is interrupted + @throws IllegalArgumentException if an invalid path is specified]]> + + + + + + + + + + + + + + + + + + + + + A KeeperException with error code KeeperException.NoNode will be thrown + if the nodes does not exist. +

+ A KeeperException with error code KeeperException.BadVersion will be + thrown if the given version does not match the node's version. +

+ A KeeperException with error code KeeperException.NotEmpty will be thrown + if the node has children. +

+ This operation, if successful, will trigger all the watches on the node + of the given path left by exists API calls, and the watches on the parent + node left by getChildren API calls. + + @param path + the path of the node to be deleted. + @param version + the expected node version. + @throws InterruptedException IF the server transaction is interrupted + @throws KeeperException If the server signals an error with a non-zero + return code. + @throws IllegalArgumentException if an invalid path is specified]]> + + + + + + + + + On success, a list of results is returned. + On failure, an exception is raised which contains partial results and + error details, see {@link KeeperException#getResults} +

+ Note: The maximum allowable size of all of the data arrays in all of + the setData operations in this single request is typically 1 MB + (1,048,576 bytes). This limit is specified on the server via + jute.maxbuffer. + Requests larger than this will cause a KeeperException to be + thrown. + + @param ops An iterable that contains the operations to be done. + These should be created using the factory methods on {@link Op}. + @return A list of results, one for each input Op, the order of + which exactly matches the order of the ops input + operations. + @throws InterruptedException If the operation was interrupted. + The operation may or may not have succeeded, but will not have + partially succeeded if this exception is thrown. + @throws KeeperException If the operation could not be completed + due to some error in doing one of the specified ops. + @throws IllegalArgumentException if an invalid path is specified + + @since 3.4.0]]> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + If the watch is non-null and the call is successful (no exception is thrown), + a watch will be left on the node with the given path. The watch will be + triggered by a successful operation that creates/delete the node or sets + the data on the node. + + @param path the node path + @param watcher explicit watcher + @return the stat of the node of the given path; return null if no such a + node exists. + @throws KeeperException If the server signals an error + @throws InterruptedException If the server transaction is interrupted. + @throws IllegalArgumentException if an invalid path is specified]]> + + + + + + + + + + If the watch is true and the call is successful (no exception is thrown), + a watch will be left on the node with the given path. The watch will be + triggered by a successful operation that creates/delete the node or sets + the data on the node. + + @param path + the node path + @param watch + whether need to watch this node + @return the stat of the node of the given path; return null if no such a + node exists. + @throws KeeperException If the server signals an error + @throws InterruptedException If the server transaction is interrupted.]]> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + If the watch is non-null and the call is successful (no exception is + thrown), a watch will be left on the node with the given path. The watch + will be triggered by a successful operation that sets data on the node, or + deletes the node. +

+ A KeeperException with error code KeeperException.NoNode will be thrown + if no node with the given path exists. + + @param path the given path + @param watcher explicit watcher + @param stat the stat of the node + @return the data of the node + @throws KeeperException If the server signals an error with a non-zero error code + @throws InterruptedException If the server transaction is interrupted. + @throws IllegalArgumentException if an invalid path is specified]]> + + + + + + + + + + + If the watch is true and the call is successful (no exception is + thrown), a watch will be left on the node with the given path. The watch + will be triggered by a successful operation that sets data on the node, or + deletes the node. +

+ A KeeperException with error code KeeperException.NoNode will be thrown + if no node with the given path exists. + + @param path the given path + @param watch whether need to watch this node + @param stat the stat of the node + @return the data of the node + @throws KeeperException If the server signals an error with a non-zero error code + @throws InterruptedException If the server transaction is interrupted.]]> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + This operation, if successful, will trigger all the watches on the node + of the given path left by getData calls. +

+ A KeeperException with error code KeeperException.NoNode will be thrown + if no node with the given path exists. +

+ A KeeperException with error code KeeperException.BadVersion will be + thrown if the given version does not match the node's version. +

+ The maximum allowable size of the data array is 1 MB (1,048,576 bytes). + Arrays larger than this will cause a KeeperException to be thrown. + + @param path + the path of the node + @param data + the data to set + @param version + the expected matching version + @return the state of the node + @throws InterruptedException If the server transaction is interrupted. + @throws KeeperException If the server signals an error with a non-zero error code. + @throws IllegalArgumentException if an invalid path is specified]]> + + + + + + + + + + + + + + + + + + + + A KeeperException with error code KeeperException.NoNode will be thrown + if no node with the given path exists. + + @param path + the given path for the node + @param stat + the stat of the node will be copied to this parameter. + @return the ACL array of the given node. + @throws InterruptedException If the server transaction is interrupted. + @throws KeeperException If the server signals an error with a non-zero error code. + @throws IllegalArgumentException if an invalid path is specified]]> + + + + + + + + + + + + + + + + + + + + A KeeperException with error code KeeperException.NoNode will be thrown + if no node with the given path exists. +

+ A KeeperException with error code KeeperException.BadVersion will be + thrown if the given version does not match the node's version. + + @param path + @param acl + @param version + @return the stat of the node. + @throws InterruptedException If the server transaction is interrupted. + @throws KeeperException If the server signals an error with a non-zero error code. + @throws org.apache.zookeeper.KeeperException.InvalidACLException If the acl is invalide. + @throws IllegalArgumentException if an invalid path is specified]]> + + + + + + + + + + + + + + + + + + + + If the watch is non-null and the call is successful (no exception is thrown), + a watch will be left on the node with the given path. The watch willbe + triggered by a successful operation that deletes the node of the given + path or creates/delete a child under the node. +

+ The list of children returned is not sorted and no guarantee is provided + as to its natural or lexical order. +

+ A KeeperException with error code KeeperException.NoNode will be thrown + if no node with the given path exists. + + @param path + @param watcher explicit watcher + @return an unordered array of children of the node with the given path + @throws InterruptedException If the server transaction is interrupted. + @throws KeeperException If the server signals an error with a non-zero error code. + @throws IllegalArgumentException if an invalid path is specified]]> + + + + + + + + + + If the watch is true and the call is successful (no exception is thrown), + a watch will be left on the node with the given path. The watch willbe + triggered by a successful operation that deletes the node of the given + path or creates/delete a child under the node. +

+ The list of children returned is not sorted and no guarantee is provided + as to its natural or lexical order. +

+ A KeeperException with error code KeeperException.NoNode will be thrown + if no node with the given path exists. + + @param path + @param watch + @return an unordered array of children of the node with the given path + @throws InterruptedException If the server transaction is interrupted. + @throws KeeperException If the server signals an error with a non-zero error code.]]> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + If the watch is non-null and the call is successful (no exception is thrown), + a watch will be left on the node with the given path. The watch willbe + triggered by a successful operation that deletes the node of the given + path or creates/delete a child under the node. +

+ The list of children returned is not sorted and no guarantee is provided + as to its natural or lexical order. +

+ A KeeperException with error code KeeperException.NoNode will be thrown + if no node with the given path exists. + + @since 3.3.0 + + @param path + @param watcher explicit watcher + @param stat stat of the znode designated by path + @return an unordered array of children of the node with the given path + @throws InterruptedException If the server transaction is interrupted. + @throws KeeperException If the server signals an error with a non-zero error code. + @throws IllegalArgumentException if an invalid path is specified]]> + + + + + + + + + + + If the watch is true and the call is successful (no exception is thrown), + a watch will be left on the node with the given path. The watch willbe + triggered by a successful operation that deletes the node of the given + path or creates/delete a child under the node. +

+ The list of children returned is not sorted and no guarantee is provided + as to its natural or lexical order. +

+ A KeeperException with error code KeeperException.NoNode will be thrown + if no node with the given path exists. + + @since 3.3.0 + + @param path + @param watch + @param stat stat of the znode designated by path + @return an unordered array of children of the node with the given path + @throws InterruptedException If the server transaction is interrupted. + @throws KeeperException If the server signals an error with a non-zero + error code.]]> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Once a connection to a server is established, a session ID is assigned to the + client. The client will send heart beats to the server periodically to keep + the session valid. +

+ The application can call ZooKeeper APIs through a client as long as the + session ID of the client remains valid. +

+ If for some reason, the client fails to send heart beats to the server for a + prolonged period of time (exceeding the sessionTimeout value, for instance), + the server will expire the session, and the session ID will become invalid. + The client object will no longer be usable. To make ZooKeeper API calls, the + application must create a new client object. +

+ If the ZooKeeper server the client currently connects to fails or otherwise + does not respond, the client will automatically try to connect to another + server before its session ID expires. If successful, the application can + continue to use the client. +

+ The ZooKeeper API methods are either synchronous or asynchronous. Synchronous + methods blocks until the server has responded. Asynchronous methods just queue + the request for sending and return immediately. They take a callback object that + will be executed either on successful execution of the request or on error with + an appropriate return code (rc) indicating the error. +

+ Some successful ZooKeeper API calls can leave watches on the "data nodes" in + the ZooKeeper server. Other successful ZooKeeper API calls can trigger those + watches. Once a watch is triggered, an event will be delivered to the client + which left the watch at the first place. Each watch can be triggered only + once. Thus, up to one event will be delivered to a client for every watch it + leaves. +

+ A client needs an object of a class implementing Watcher interface for + processing the events delivered to the client. + + When a client drops current connection and re-connects to a server, all the + existing watches are considered as being triggered but the undelivered events + are lost. To emulate this, the client will generate a special event to tell + the event handler a connection has been dropped. This special event has type + EventNone and state sKeeperStateDisconnected.]]> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/pkg/registry/zookeeper-3.4.6/lib/jdiff/zookeeper_3.4.6.xml b/pkg/registry/zookeeper-3.4.6/lib/jdiff/zookeeper_3.4.6.xml new file mode 100644 index 000000000..f91f61149 --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/lib/jdiff/zookeeper_3.4.6.xml @@ -0,0 +1,4559 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + null. + @param memoryLimit virtual memory limit + @return a String[] with the ulimit command arguments or + null if we are running on a non *nix platform or + if the limit is unspecified.]]> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Shell interface. + @param cmd shell command to execute. + @return the output of the executed command.]]> + + + + + + + + + Shell interface. + @param env the map of environment key=value + @param cmd shell command to execute. + @param timeout time in milliseconds after which script should be marked timeout + @return the output of the executed command.o]]> + + + + + + + + Shell interface. + @param env the map of environment key=value + @param cmd shell command to execute. + @return the output of the executed command.]]> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Shell can be used to run unix commands like du or + df. It also offers facilities to gate commands by + time-intervals.]]> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ShellCommandExecutorshould be used in cases where the output + of the command needs no explicit parsing and where the command, working + directory and the environment remains unchanged. The output of the command + is stored as-is and is expected to be small.]]> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

  • --short - prints a short version string "1.2.3" +
  • --revision - prints a short version string with the SVN + repository revision "1.2.3-94" +
  • --full - prints the revision and the build date + ]]> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Important: All versions, of all nodes, under the given node are deleted. +

    + If there is an error with deleting one of the sub-nodes in the tree, + this operation would abort and would be the responsibility of the app to handle the same. + + See {@link #delete(String, int)} for more details. + + @throws IllegalArgumentException if an invalid path is specified]]> + + + + + + + + + + + + Important: All versions, of all nodes, under the given node are deleted. +

    + If there is an error with deleting one of the sub-nodes in the tree, + this operation would abort and would be the responsibility of the app to handle the same. +

    + @param zk the zookeeper handle + @param pathRoot the path to be deleted + @param cb call back method + @param ctx the context the callback method is called with + @throws IllegalArgumentException if an invalid path is specified]]> + + + + + + + + + + Important: This is not an atomic snapshot of the tree ever, but the + state as it exists across multiple RPCs from zkClient to the ensemble. + For practical purposes, it is suggested to bring the clients to the ensemble + down (i.e. prevent writes to pathRoot) to 'simulate' a snapshot behavior. + + @param zk the zookeeper handle + @param pathRoot The znode path, for which the entire subtree needs to be listed. + @throws InterruptedException + @throws KeeperException]]> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Session establishment is asynchronous. This constructor will initiate + connection to the server and return immediately - potentially (usually) + before the session is fully established. The watcher argument specifies + the watcher that will be notified of any changes in state. This + notification can come at any point before or after the constructor call + has returned. +

    + The instantiated ZooKeeper client object will pick an arbitrary server + from the connectString and attempt to connect to it. If establishment of + the connection fails, another server in the connect string will be tried + (the order is non-deterministic, as we random shuffle the list), until a + connection is established. The client will continue attempts until the + session is explicitly closed. +

    + Added in 3.2.0: An optional "chroot" suffix may also be appended to the + connection string. This will run the client commands while interpreting + all paths relative to this root (similar to the unix chroot command). + + @param connectString + comma separated host:port pairs, each corresponding to a zk + server. e.g. "127.0.0.1:3000,127.0.0.1:3001,127.0.0.1:3002" If + the optional chroot suffix is used the example would look + like: "127.0.0.1:3000,127.0.0.1:3001,127.0.0.1:3002/app/a" + where the client would be rooted at "/app/a" and all paths + would be relative to this root - ie getting/setting/etc... + "/foo/bar" would result in operations being run on + "/app/a/foo/bar" (from the server perspective). + @param sessionTimeout + session timeout in milliseconds + @param watcher + a watcher object which will be notified of state changes, may + also be notified for node events + + @throws IOException + in cases of network failure + @throws IllegalArgumentException + if an invalid chroot path is specified]]> + + + + + + + Session establishment is asynchronous. This constructor will initiate + connection to the server and return immediately - potentially (usually) + before the session is fully established. The watcher argument specifies + the watcher that will be notified of any changes in state. This + notification can come at any point before or after the constructor call + has returned. +

    + The instantiated ZooKeeper client object will pick an arbitrary server + from the connectString and attempt to connect to it. If establishment of + the connection fails, another server in the connect string will be tried + (the order is non-deterministic, as we random shuffle the list), until a + connection is established. The client will continue attempts until the + session is explicitly closed. +

    + Added in 3.2.0: An optional "chroot" suffix may also be appended to the + connection string. This will run the client commands while interpreting + all paths relative to this root (similar to the unix chroot command). + + @param connectString + comma separated host:port pairs, each corresponding to a zk + server. e.g. "127.0.0.1:3000,127.0.0.1:3001,127.0.0.1:3002" If + the optional chroot suffix is used the example would look + like: "127.0.0.1:3000,127.0.0.1:3001,127.0.0.1:3002/app/a" + where the client would be rooted at "/app/a" and all paths + would be relative to this root - ie getting/setting/etc... + "/foo/bar" would result in operations being run on + "/app/a/foo/bar" (from the server perspective). + @param sessionTimeout + session timeout in milliseconds + @param watcher + a watcher object which will be notified of state changes, may + also be notified for node events + @param canBeReadOnly + (added in 3.4) whether the created client is allowed to go to + read-only mode in case of partitioning. Read-only mode + basically means that if the client can't find any majority + servers but there's partitioned server it could reach, it + connects to one in read-only mode, i.e. read requests are + allowed while write requests are not. It continues seeking for + majority in the background. + + @throws IOException + in cases of network failure + @throws IllegalArgumentException + if an invalid chroot path is specified]]> + + + + + + + Session establishment is asynchronous. This constructor will initiate + connection to the server and return immediately - potentially (usually) + before the session is fully established. The watcher argument specifies + the watcher that will be notified of any changes in state. This + notification can come at any point before or after the constructor call + has returned. +

    + The instantiated ZooKeeper client object will pick an arbitrary server + from the connectString and attempt to connect to it. If establishment of + the connection fails, another server in the connect string will be tried + (the order is non-deterministic, as we random shuffle the list), until a + connection is established. The client will continue attempts until the + session is explicitly closed (or the session is expired by the server). +

    + Added in 3.2.0: An optional "chroot" suffix may also be appended to the + connection string. This will run the client commands while interpreting + all paths relative to this root (similar to the unix chroot command). +

    + Use {@link #getSessionId} and {@link #getSessionPasswd} on an established + client connection, these values must be passed as sessionId and + sessionPasswd respectively if reconnecting. Otherwise, if not + reconnecting, use the other constructor which does not require these + parameters. + + @param connectString + comma separated host:port pairs, each corresponding to a zk + server. e.g. "127.0.0.1:3000,127.0.0.1:3001,127.0.0.1:3002" + If the optional chroot suffix is used the example would look + like: "127.0.0.1:3000,127.0.0.1:3001,127.0.0.1:3002/app/a" + where the client would be rooted at "/app/a" and all paths + would be relative to this root - ie getting/setting/etc... + "/foo/bar" would result in operations being run on + "/app/a/foo/bar" (from the server perspective). + @param sessionTimeout + session timeout in milliseconds + @param watcher + a watcher object which will be notified of state changes, may + also be notified for node events + @param sessionId + specific session id to use if reconnecting + @param sessionPasswd + password for this session + + @throws IOException in cases of network failure + @throws IllegalArgumentException if an invalid chroot path is specified + @throws IllegalArgumentException for an invalid list of ZooKeeper hosts]]> + + + + + + + Session establishment is asynchronous. This constructor will initiate + connection to the server and return immediately - potentially (usually) + before the session is fully established. The watcher argument specifies + the watcher that will be notified of any changes in state. This + notification can come at any point before or after the constructor call + has returned. +

    + The instantiated ZooKeeper client object will pick an arbitrary server + from the connectString and attempt to connect to it. If establishment of + the connection fails, another server in the connect string will be tried + (the order is non-deterministic, as we random shuffle the list), until a + connection is established. The client will continue attempts until the + session is explicitly closed (or the session is expired by the server). +

    + Added in 3.2.0: An optional "chroot" suffix may also be appended to the + connection string. This will run the client commands while interpreting + all paths relative to this root (similar to the unix chroot command). +

    + Use {@link #getSessionId} and {@link #getSessionPasswd} on an established + client connection, these values must be passed as sessionId and + sessionPasswd respectively if reconnecting. Otherwise, if not + reconnecting, use the other constructor which does not require these + parameters. + + @param connectString + comma separated host:port pairs, each corresponding to a zk + server. e.g. "127.0.0.1:3000,127.0.0.1:3001,127.0.0.1:3002" + If the optional chroot suffix is used the example would look + like: "127.0.0.1:3000,127.0.0.1:3001,127.0.0.1:3002/app/a" + where the client would be rooted at "/app/a" and all paths + would be relative to this root - ie getting/setting/etc... + "/foo/bar" would result in operations being run on + "/app/a/foo/bar" (from the server perspective). + @param sessionTimeout + session timeout in milliseconds + @param watcher + a watcher object which will be notified of state changes, may + also be notified for node events + @param sessionId + specific session id to use if reconnecting + @param sessionPasswd + password for this session + @param canBeReadOnly + (added in 3.4) whether the created client is allowed to go to + read-only mode in case of partitioning. Read-only mode + basically means that if the client can't find any majority + servers but there's partitioned server it could reach, it + connects to one in read-only mode, i.e. read requests are + allowed while write requests are not. It continues seeking for + majority in the background. + + @throws IOException in cases of network failure + @throws IllegalArgumentException if an invalid chroot path is specified]]> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + The flags argument specifies whether the created node will be ephemeral + or not. +

    + An ephemeral node will be removed by the ZooKeeper automatically when the + session associated with the creation of the node expires. +

    + The flags argument can also specify to create a sequential node. The + actual path name of a sequential node will be the given path plus a + suffix "i" where i is the current sequential number of the node. The sequence + number is always fixed length of 10 digits, 0 padded. Once + such a node is created, the sequential number will be incremented by one. +

    + If a node with the same actual path already exists in the ZooKeeper, a + KeeperException with error code KeeperException.NodeExists will be + thrown. Note that since a different actual path is used for each + invocation of creating sequential node with the same path argument, the + call will never throw "file exists" KeeperException. +

    + If the parent node does not exist in the ZooKeeper, a KeeperException + with error code KeeperException.NoNode will be thrown. +

    + An ephemeral node cannot have children. If the parent node of the given + path is ephemeral, a KeeperException with error code + KeeperException.NoChildrenForEphemerals will be thrown. +

    + This operation, if successful, will trigger all the watches left on the + node of the given path by exists and getData API calls, and the watches + left on the parent node by getChildren API calls. +

    + If a node is created successfully, the ZooKeeper server will trigger the + watches on the path left by exists calls, and the watches on the parent + of the node by getChildren calls. +

    + The maximum allowable size of the data array is 1 MB (1,048,576 bytes). + Arrays larger than this will cause a KeeperExecption to be thrown. + + @param path + the path for the node + @param data + the initial data for the node + @param acl + the acl for the node + @param createMode + specifying whether the node to be created is ephemeral + and/or sequential + @return the actual path of the created node + @throws KeeperException if the server returns a non-zero error code + @throws KeeperException.InvalidACLException if the ACL is invalid, null, or empty + @throws InterruptedException if the transaction is interrupted + @throws IllegalArgumentException if an invalid path is specified]]> + + + + + + + + + + + + + + + + + + + + + A KeeperException with error code KeeperException.NoNode will be thrown + if the nodes does not exist. +

    + A KeeperException with error code KeeperException.BadVersion will be + thrown if the given version does not match the node's version. +

    + A KeeperException with error code KeeperException.NotEmpty will be thrown + if the node has children. +

    + This operation, if successful, will trigger all the watches on the node + of the given path left by exists API calls, and the watches on the parent + node left by getChildren API calls. + + @param path + the path of the node to be deleted. + @param version + the expected node version. + @throws InterruptedException IF the server transaction is interrupted + @throws KeeperException If the server signals an error with a non-zero + return code. + @throws IllegalArgumentException if an invalid path is specified]]> + + + + + + + + + On success, a list of results is returned. + On failure, an exception is raised which contains partial results and + error details, see {@link KeeperException#getResults} +

    + Note: The maximum allowable size of all of the data arrays in all of + the setData operations in this single request is typically 1 MB + (1,048,576 bytes). This limit is specified on the server via + jute.maxbuffer. + Requests larger than this will cause a KeeperException to be + thrown. + + @param ops An iterable that contains the operations to be done. + These should be created using the factory methods on {@link Op}. + @return A list of results, one for each input Op, the order of + which exactly matches the order of the ops input + operations. + @throws InterruptedException If the operation was interrupted. + The operation may or may not have succeeded, but will not have + partially succeeded if this exception is thrown. + @throws KeeperException If the operation could not be completed + due to some error in doing one of the specified ops. + @throws IllegalArgumentException if an invalid path is specified + + @since 3.4.0]]> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + If the watch is non-null and the call is successful (no exception is thrown), + a watch will be left on the node with the given path. The watch will be + triggered by a successful operation that creates/delete the node or sets + the data on the node. + + @param path the node path + @param watcher explicit watcher + @return the stat of the node of the given path; return null if no such a + node exists. + @throws KeeperException If the server signals an error + @throws InterruptedException If the server transaction is interrupted. + @throws IllegalArgumentException if an invalid path is specified]]> + + + + + + + + + + If the watch is true and the call is successful (no exception is thrown), + a watch will be left on the node with the given path. The watch will be + triggered by a successful operation that creates/delete the node or sets + the data on the node. + + @param path + the node path + @param watch + whether need to watch this node + @return the stat of the node of the given path; return null if no such a + node exists. + @throws KeeperException If the server signals an error + @throws InterruptedException If the server transaction is interrupted.]]> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + If the watch is non-null and the call is successful (no exception is + thrown), a watch will be left on the node with the given path. The watch + will be triggered by a successful operation that sets data on the node, or + deletes the node. +

    + A KeeperException with error code KeeperException.NoNode will be thrown + if no node with the given path exists. + + @param path the given path + @param watcher explicit watcher + @param stat the stat of the node + @return the data of the node + @throws KeeperException If the server signals an error with a non-zero error code + @throws InterruptedException If the server transaction is interrupted. + @throws IllegalArgumentException if an invalid path is specified]]> + + + + + + + + + + + If the watch is true and the call is successful (no exception is + thrown), a watch will be left on the node with the given path. The watch + will be triggered by a successful operation that sets data on the node, or + deletes the node. +

    + A KeeperException with error code KeeperException.NoNode will be thrown + if no node with the given path exists. + + @param path the given path + @param watch whether need to watch this node + @param stat the stat of the node + @return the data of the node + @throws KeeperException If the server signals an error with a non-zero error code + @throws InterruptedException If the server transaction is interrupted.]]> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + This operation, if successful, will trigger all the watches on the node + of the given path left by getData calls. +

    + A KeeperException with error code KeeperException.NoNode will be thrown + if no node with the given path exists. +

    + A KeeperException with error code KeeperException.BadVersion will be + thrown if the given version does not match the node's version. +

    + The maximum allowable size of the data array is 1 MB (1,048,576 bytes). + Arrays larger than this will cause a KeeperException to be thrown. + + @param path + the path of the node + @param data + the data to set + @param version + the expected matching version + @return the state of the node + @throws InterruptedException If the server transaction is interrupted. + @throws KeeperException If the server signals an error with a non-zero error code. + @throws IllegalArgumentException if an invalid path is specified]]> + + + + + + + + + + + + + + + + + + + + A KeeperException with error code KeeperException.NoNode will be thrown + if no node with the given path exists. + + @param path + the given path for the node + @param stat + the stat of the node will be copied to this parameter. + @return the ACL array of the given node. + @throws InterruptedException If the server transaction is interrupted. + @throws KeeperException If the server signals an error with a non-zero error code. + @throws IllegalArgumentException if an invalid path is specified]]> + + + + + + + + + + + + + + + + + + + + A KeeperException with error code KeeperException.NoNode will be thrown + if no node with the given path exists. +

    + A KeeperException with error code KeeperException.BadVersion will be + thrown if the given version does not match the node's version. + + @param path + @param acl + @param version + @return the stat of the node. + @throws InterruptedException If the server transaction is interrupted. + @throws KeeperException If the server signals an error with a non-zero error code. + @throws org.apache.zookeeper.KeeperException.InvalidACLException If the acl is invalide. + @throws IllegalArgumentException if an invalid path is specified]]> + + + + + + + + + + + + + + + + + + + + If the watch is non-null and the call is successful (no exception is thrown), + a watch will be left on the node with the given path. The watch willbe + triggered by a successful operation that deletes the node of the given + path or creates/delete a child under the node. +

    + The list of children returned is not sorted and no guarantee is provided + as to its natural or lexical order. +

    + A KeeperException with error code KeeperException.NoNode will be thrown + if no node with the given path exists. + + @param path + @param watcher explicit watcher + @return an unordered array of children of the node with the given path + @throws InterruptedException If the server transaction is interrupted. + @throws KeeperException If the server signals an error with a non-zero error code. + @throws IllegalArgumentException if an invalid path is specified]]> + + + + + + + + + + If the watch is true and the call is successful (no exception is thrown), + a watch will be left on the node with the given path. The watch willbe + triggered by a successful operation that deletes the node of the given + path or creates/delete a child under the node. +

    + The list of children returned is not sorted and no guarantee is provided + as to its natural or lexical order. +

    + A KeeperException with error code KeeperException.NoNode will be thrown + if no node with the given path exists. + + @param path + @param watch + @return an unordered array of children of the node with the given path + @throws InterruptedException If the server transaction is interrupted. + @throws KeeperException If the server signals an error with a non-zero error code.]]> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + If the watch is non-null and the call is successful (no exception is thrown), + a watch will be left on the node with the given path. The watch willbe + triggered by a successful operation that deletes the node of the given + path or creates/delete a child under the node. +

    + The list of children returned is not sorted and no guarantee is provided + as to its natural or lexical order. +

    + A KeeperException with error code KeeperException.NoNode will be thrown + if no node with the given path exists. + + @since 3.3.0 + + @param path + @param watcher explicit watcher + @param stat stat of the znode designated by path + @return an unordered array of children of the node with the given path + @throws InterruptedException If the server transaction is interrupted. + @throws KeeperException If the server signals an error with a non-zero error code. + @throws IllegalArgumentException if an invalid path is specified]]> + + + + + + + + + + + If the watch is true and the call is successful (no exception is thrown), + a watch will be left on the node with the given path. The watch willbe + triggered by a successful operation that deletes the node of the given + path or creates/delete a child under the node. +

    + The list of children returned is not sorted and no guarantee is provided + as to its natural or lexical order. +

    + A KeeperException with error code KeeperException.NoNode will be thrown + if no node with the given path exists. + + @since 3.3.0 + + @param path + @param watch + @param stat stat of the znode designated by path + @return an unordered array of children of the node with the given path + @throws InterruptedException If the server transaction is interrupted. + @throws KeeperException If the server signals an error with a non-zero + error code.]]> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Once a connection to a server is established, a session ID is assigned to the + client. The client will send heart beats to the server periodically to keep + the session valid. +

    + The application can call ZooKeeper APIs through a client as long as the + session ID of the client remains valid. +

    + If for some reason, the client fails to send heart beats to the server for a + prolonged period of time (exceeding the sessionTimeout value, for instance), + the server will expire the session, and the session ID will become invalid. + The client object will no longer be usable. To make ZooKeeper API calls, the + application must create a new client object. +

    + If the ZooKeeper server the client currently connects to fails or otherwise + does not respond, the client will automatically try to connect to another + server before its session ID expires. If successful, the application can + continue to use the client. +

    + The ZooKeeper API methods are either synchronous or asynchronous. Synchronous + methods blocks until the server has responded. Asynchronous methods just queue + the request for sending and return immediately. They take a callback object that + will be executed either on successful execution of the request or on error with + an appropriate return code (rc) indicating the error. +

    + Some successful ZooKeeper API calls can leave watches on the "data nodes" in + the ZooKeeper server. Other successful ZooKeeper API calls can trigger those + watches. Once a watch is triggered, an event will be delivered to the client + which left the watch at the first place. Each watch can be triggered only + once. Thus, up to one event will be delivered to a client for every watch it + leaves. +

    + A client needs an object of a class implementing Watcher interface for + processing the events delivered to the client. + + When a client drops current connection and re-connects to a server, all the + existing watches are considered as being triggered but the undelivered events + are lost. To emulate this, the client will generate a special event to tell + the event handler a connection has been dropped. This special event has type + EventNone and state sKeeperStateDisconnected.]]> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/pkg/registry/zookeeper-3.4.6/lib/jline-0.9.94.LICENSE.txt b/pkg/registry/zookeeper-3.4.6/lib/jline-0.9.94.LICENSE.txt new file mode 100644 index 000000000..1cdc44c21 --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/lib/jline-0.9.94.LICENSE.txt @@ -0,0 +1,33 @@ +Copyright (c) 2002-2006, Marc Prud'hommeaux +All rights reserved. + +Redistribution and use in source and binary forms, with or +without modification, are permitted provided that the following +conditions are met: + +Redistributions of source code must retain the above copyright +notice, this list of conditions and the following disclaimer. + +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. + +Neither the name of JLine nor the names of its contributors +may be used to endorse or promote products derived from this +software without specific prior written permission. + +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. + diff --git a/pkg/registry/zookeeper-3.4.6/lib/jline-0.9.94.jar b/pkg/registry/zookeeper-3.4.6/lib/jline-0.9.94.jar new file mode 100644 index 0000000000000000000000000000000000000000..dede3721dee71225c942ebcfa4e38250e1e893c2 GIT binary patch literal 87325 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

    Y5qC;k%1U!?;t&iH#A^9N0vn>7fOhR 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 -o+ALO7?mx!OF3QAyE8xC_VXp@rcY;N!vJ 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%0D(0l}xubAF&V4B`Bb|aqh(GW1t_X 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 literal 0 HcmV?d00001 diff --git a/pkg/registry/zookeeper-3.4.6/lib/log4j-1.2.16.LICENSE.txt b/pkg/registry/zookeeper-3.4.6/lib/log4j-1.2.16.LICENSE.txt new file mode 100644 index 000000000..6279e5206 --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/lib/log4j-1.2.16.LICENSE.txt @@ -0,0 +1,202 @@ + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright 1999-2005 The Apache Software Foundation + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/pkg/registry/zookeeper-3.4.6/lib/log4j-1.2.16.jar b/pkg/registry/zookeeper-3.4.6/lib/log4j-1.2.16.jar new file mode 100644 index 0000000000000000000000000000000000000000..5429a903e117a21f19144206555f9608185e5642 GIT binary patch literal 481535 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
    d$%UM@zCiyG3zXz~%I zEk%$kl1$Zn3M8P_nn5eIX5~Wpq}<<_^jP{~zKz;Q1~w6i4H*Vn5GBb58xUr;QvMk5 zQ9*HegYapLRJ|&PugZikv=9}ms zF6|Rrq@nLCwgnxl@4gLbrq=Ny08HxGga+qFAT>|TPBmQi^8r&9e9`#30!?3e&FnwC zrX^A6#o%(H!aWO-no{@`$-Y}vTj@%KXxb9!nWT0x??CoO9^>yN4V!rrn{@fXSGKa9 z<9*!k>I{qazBm;3ufJ=7i7mE0-~VWjB(V+XZpNo6?f)j{Bgh)H9j)!XLOqE~%%OSP zQwved!x1QULV!;8s#D<%YMwB(QN13dJMyKzE@`aNHPzs*3wZCxK+OZDKd|nYbkn~4 z$~gKpSR%PRUbD-SYymYn-OqLH-LfhkC+XnXsKytib409=9BWi@&-mw2a7q!+=$$u< z@DnCi&J_B~>#~>xlJpMqdY41NihHWx>+Ha$)(-{6*czWWN*;OSAm|Qrz&(J0FZD-= zqf|V@%vr8Bh+hAyEC%(I-obrJb|Ci^Nm*9h2LY*pPKrwEXR%`3yf^R{gILN9&i#UE zc79bOrpb71S_5x)#OkGq$D(Psgr@#9fwV7Ua>Hjl>$XACbV(IX?G5Ob9r3lQ33Y98 z*kt|CQ5q|WAomyKmkoFwqwf9%$cq@*&mAJp6h%_$aO1JEe`qOPmbxV)~ABDZ{s z-j+u{a^PWXE17&v+%uNS!I*tcXoX!Gk^DxC#w^k@SGn|``##^_$dqV>9d@3{ziwaR zjqRW=_xdEE)N6Sc=UKGQHmjyNrj*XI=>;+6Rvz)d)11Aq&guwNf+HY#f`rz+toVw! z>3>PO>+p?X=1Va@fUN|gTR2KQ$PznIMM0_U{Rz7{oAWKBL6pyu zR@>EN>2`PFGL1a+Gaw?herPlW>Z_@AP1{t0)p z7JnrMz+(Eg^NjZi_fC5Hj$e5i7U9*Yc1I(ghYYwJ1%oVHzDBi69ajQ+OjeE)rLVAPEWZ{%< z`6B0Hr zT+-1@XRD`)%M!cqpEr&iLj?2qRo>pgXnu#ZiA6Q;2m%R@!ZSo5yzlq3Xv$Gy98r*Y zqyqo2BZk^gtDhJJMQ4bVZ;HY~TxXyvfR6;lB~Mupy#v!zVn2)CQBESunxMqsuRy5d z+co%ib9xjVVSd!*Dk|5mattubWk+cvKLE}f+Cn(jyXpN0`MS zNEp8soG^Jt+!nqh)&y=F@G+95kM;>u%mE}6h0<()O6ic|4`I(ri$}N>#MCZKS-_bC z5H~pkq96|Pek#8IJYCP_C5W^CNEVqEbqQPB;ntHi+%i`qTU5EY)4XTTU!wMbK0QS~l}@M{2Y zwM#18(y(HpVD*d9Jgt0_&X4=DwT+`m3r^K;xx3|vh1PJAhmJ~c_DOR4bHXu3Ky!&O?l^)fWyRB?!i)8O?Kx3DvX9CHhAq2)j)(hp!YwA=*iX z?WAyEHC!x(1ubF3{M$(lla8?dcxfN>%IB|u4AL#6Br!yNuf#1HW(7ey%~4#_7*@}) zFbso9yUSL8txy%$i|rW6*eb~?szlP-ghG@`7U~jwg6QE>Br~QZlQK^v6|XgjB)Y!T zbVS{v0TVAj+mT1>`|cXKP)y6zhVGimi2ZwUM}$1f|LMP!T#*gf$1LA z%DcM!YhB9PFA5-p>_lg`v4)^6ph+wuA{WgarINjNp8k;dh3KaA4EsP4`M?^tzxDy zVSq7=?~)6R0yBkkJL_83P|MUi)P9erHA|b!GC7#@HnU0#sW1=@jFAOxWkDJCl^(=7 z9#%q{YzVLonf}U-_Kd*mxH>C>jXB)cV0&7K$1pQqX56mf0}5|1h%@YAeB!^eeLmff zARmJ%u9q?n-Qxe%eqW2J;4ie3=niGD53t}B?X-=EGV;BGU89zAnzK-)1iB$S0G3lO ziI(9AY(zP8mip1`9y`7-MB|-BVPa{>NZXa|qNYd89+Y(TkH!z)2T|MNM_nWo69h~j}UBAo69m>+bgHY$0iDwx_=I3cHsFZ^E8NA;p@9Y zfHyez$a&_R zEM-hkGTQ}JexplwoJC$P8L0pWz#xbGO<`HAX1ZTL}%%pxstj;TDS`4NggN?Mw z^hrnFW)`h0>IA|^JAlbpb0D3`brsc)(_q6<>W7mVX(NNr$IRt^K#+*1^v=9;iQSPB zih)MEBV=fa&E#*FN$rK{fU>N#oZM7|-!A0jJRR$GvWvfx391*22I^pL3W7oo(@7zt zm7ln9ZKSbN+7#FHkY@sV%%En>&0U=(-C*=WXTBd$d8Z+sQl}C6?p} z(i{0NI;1_!9>)aHnDNMOTzM-LN3^+o(pk!ny)}HLH6;m`nhtPB7quH)M76zP~V}D2-I_^oYZ&O^JV%u=}W{c7|^u0{@5cFUZItrT+#sgzVU>ic<&CH&xkYUpU zVTL#(tjkrkVHqqM;&Mntn5F0tHK!*eZkx`q8&Y-}k#5Z{h%Cg3D)5lguU`!GJM~&s zklleoVEREYN=fyvo)5xJPrJ5xm zQz|KnCz6y%kW=f!C)m)Gutr5BD32mRSS))B_fnk-%5Ih_&lgdE0K2$4F!1`1Z$Smk z#$V+w3b=_gHtMS6S|upMokgW08mSUHou7Fxl-bk!uiy_27V>ti3c$11MS z&MS$m@^!FWaduFC#S`gK7MwtitT`v~j7sI0sCtK%e1senXRGODL#Qp~ccWGSTadk_ zS$%QBDI@0^Zq0>lxPdRxggn;}at99h)460#O6nXPj_sP>Z>t9EE2& z=T|eNBvcC$%ewM%U&cR%_!v`mgnECFAGRF(0{UCab%{^6!T%mmouK}wA@x5xZA1($ zZ9J6hZEP&<%*8DKds_X+bgB;NuA_?jY0s3NE~B@>pu6a*w7@2vm}F<53?!SuLMf@d z*;FiAM$b$?ZcYAB!fd|*R+$%oT_Z6c02QI(PlaNkRAwYdGf_~Wp`rpnK@dSeRJrB1 zPmxI|H|m-4apU|p%gw&dI^Foa&2+}aVyT`Da_JllHwT{%t@^xx)g=C6=WY81&R!GW z-^#i|Vq~!=V#i*|8Bk z)F&;(x(G8VozReXe-O7#`8WpZ;koO@m+*Q3zKi2~RY%)sB)+F(t&88`up|BT!~Uq= z`%vUtx4S?IK1xfd_Y0*j+31JPlb42P@9kcyy9nD`GCFz0EyXorxgV|gmsrM*)I%D2 z@5BDH-n*dPLmP`c#Cjqg&(ZLr9uG0Q$4cOd_Y3hS$@GI>7Xf+i>0s_%0y_QMw_tX^ zU!T`q)lf(Mq{B9wcC%x}&CbTgUQNLkYFJi{#O~r-v4SUu@p^L`n@Bkk)6$IHneoui zA6&3xVtq35o2eM3tD1UKyQNyIU3A0)ss}~Vip(#~(%Jcelj%rlZXwgH=E^F$9Vj8# zWmBVcvjs7d;$^e-qVut%4)3gb(_nN;!oGWe^3EU^Q7R}}Arg~~$g?+J0fX^rP1Z-u z0i3>3jF8{xN{vFYf!u~!r#0d&fs-HaTrn+Pr*2%Owf{0U1Xk0o-sq!4wxCNx!BDOf z^`d&QkW0Q2TDx1iWwp9>z;I%&=wU4mkJwaEVMfP%NQQby(Y|-v^a)$L8p1Rq&DGO0 zh2|R7Y^VvFLQ3?A3{*W4mFVsTz-&|{`{;&UPuI8^?rqbwp6%F$&^>C(loLjrtge8glUQf?cD>g7KcX(NL0VtTz~JcC4+ z*&-Zl3n`XKyiC!!7%(D!){ZgbsrlxW>H0;7_n${(`l)*o4052$@h!1`vNtdaV za}f$jpy0eJ>YvK9gpX?~kcE2&ul}?cV9RKrmBOB9mD(?4AVScTkQ2;)lqWuykwV6X zLes*wkGmSo=LCup*l}3K=}uwhsJ3jCSF&yf4-72Mwf&z!ZwsSTP7eE5qgZTOPTJVp3U;p_q>__at@Y;0bZ(G9p>a z3Jv9hCHGjW`6bGU+Hy#%0wL2-%-F>+&L~6%V*jQAWcpGwM0DzeE^%(Akj zz2H_@Kv5{PL43m}x<)aD5rSJY+Z4+%my1g>K+4lfji_XYw=SNj)pWaM1}54Fb;gi| zOnnykaE~0?t5z>rFSAuJ&O!SlNQz>iRX#jadF4#3;>x8^&3-R%={_p{RL^DYST#eb z7$9nHE*?ufveW83?f1Imh#hYj8}S#UnmtSit6X9h%K9~_wVgNHee1iY=63fRY7MmtY{wmz)3$4dL9p5cdr~3q>&6mqQ4HM#bp7dHNQ1_V z(oWK2r*aOL8`aVwG?*#lr`aT_tmcTz zCrteoL}V)lYZ0aQnVW0IBUdCQ9wpo)049<|Zn_;)#9dV4O6dFtSMEF{_GuWlH1raO z%q>qVI2XI^a}+|&^V9Q4Os;v2EI{Fsy9sGh*3k#lv`d&m*@R=C1fF&4QesT~2#}rg z)S=p7&lSG4S-ERty@I1tC^jT~(p`B&O!KEZpUtnx-`;XIapb@q9KX_7e+}IoSKYPa z*pFk`AH8%{-Mw+}@mqWU7~O0bxjBhF3SERR>8TPp6eVU2eK3{X_14tp&`&|PDV2)Z zTOIAzSgzY1pO-_a17A{w6;yqFfFtfbhtT0WV1TNK8R#~J$QitC&>pL~VTh=ZD8zMw zi>c2Bh2J!G*!#AxL6hyO&A=8Qi7QN&YG+ky-9xNNaM063caG7H>W?1izOSgO(mTNB zzidk@s1gSSVzARp@bHQHgHy~kQXI4F+n2gw|!%sw0+DdDuvioL!CJ ziBEaLDAan$$+Kj~LLX(1Hj{nw{p_ZkW{ndo+frRlGSPs_W%dd{_gdn#bV{IdPQb=L ztf`W^Bh*RSsGPxkIMQ(CzPBH@IRcR3Pc9e=iiM(^%e=tR)6CBJu1VM%}#z$l}6+o2R^R9%q{QP>dNw_N(|f(dT~#*aLV z01d|I4ABV2n3)&|fg`s5BdOTp!#N?T^!|We9to#^%dnefANA*G`8fIRXkwawsX}yV zJ;JO3WzKNAJDjce!{{B)-W^a)pY+TyaMza5`R8B^degiUe!nnxHXVKn6`f6rzyzo-`^~LJgt!h6 zksF|*!9fb*NF|&1*k+!!gYBAYI@eUL@xBO=(z+`Bmq(z>%(yNctt!r4K~t04#WhN; zRUT5%F~&yaCmbWGXi1)6^^a62Q#|gHJzTdlupZ#dt$HzzNtRS2<(6p$CB|r#o9#4q z=;fLkHD-nJ_cdy!Yh}l~K&mlm8PJ(5=oL~YBNra2q83FVGQTS0KjasJp)pR)ktMnx z7op3NCpk_Cbz1iq4-sOwG8g7Kz<$j#U^K27lzq~0g7nZtCn_pz&vb9?FBJs6;gIVc z^MAl)#fJ(T>ndh(9RyzCBqPd5KM%Twm3hfe#7+*yme(DS12tPdaCe5%0}-2FwBDy^WM^2=Ct1#eoC z?<5CFWD-shbo7=1FTazVwiPn5ELHTjZ1}d4G%ZhV)JQcJtQp9>ym7t=YrZ_APO^Hy z!-^GuyE?3lZD<)wr+mXvrh0VH3K>sPmm{BTpSC$YcFP&Jl1<@+Tp?!m02&DoVz;On zjagRbI_OjmX8=9hU@`JTZf(4jl-}H8LmUUD6f~7bT50}8FNS2TiRroq=C%S7( z$m|E?Ad+1om=4jaEdnh#gRFobyV{NT9%2(*!E|rQk}JrGiYk1*u8WeKU-iuC5M&V* zL@HFi24-53r$Wsig?t*7%BwO(?mCrV#abefCpjYS6iE-(rIS<-{ZwSA#l6Pl*3O8N zwmK+vC&jmfDa1f)ViqmYKJ|Rp-xW z|I^KZ_CJ9&BBo}Bt~M_JB!k2ZjlY%W{~&~-m1N}y1W>Yqg^CLZCQ^rn+!0yU0)Hvc zV<07h!DArBO6yJmK%QW&k$(-ku$PL~&eHV93kU zG3>DXyuz}=qQa>-p41$bRG2%f>d8FT53l~X`Xcg;L_>Ly)~=HUxo;oLHNb;l(6^_& zya$JQiH6@nhHoFBpH_2|1v^E3*GFDsyOT%%N ztkQEC>z3TEW6OCe2CC?UMeSwAaPr}fx4yQGA>e+pzuP< zHEkE0IV+JSr11%jQYv0zL^}i~8zN@*wmf}ACuRJwZCrUoKixDE;(0w2g|zr%FvH|w zH5WI!efz%yY-s-PPnzHHU54Kv+y9=D_|Lb!zrQmT3nzOwLn9kgrT zt(skOG-}5EAoy#zH;>Ppy(piCS!D}%!8iMv_w^!I-%lLAX16@V(S)VT-x8Ib zWrB&yjD@1D+z_o*Wh*6=o9b9)O8O%pgt@I!a1fmejTJ_sBgD(eOuY>8y?M8*rH+z;w}8oTSJ)g-fjpkXm(9c3x>wr1!Gsu4$yN_o!5A(wUrwctp+K zC1F6Fy~f(XDsNDvEaqC1F=~|VI&TLQi|F;bfgrRYOc=A-Z8{BcAz<7H9bKT#{%Smi zm#I8omkZvtNSBsAP7;9Sv z?5=s#RZA=tFSyL5cAldvx9y~R&{?JXP^QjnU7OKb0VJHSx}cWbVXXz-LbI4zsynDU zzQpJs$%T}Lf&n)f#wVl{-vo;a?}~C8ww|SDjGNg;!QiRYLB0iMgd2O8{CMB|&chk8 z?@sCBO)Lo3(ot~PLG2$N(=<@F?YZ0-q5BtVNemGU?q&lN=_N##S92bh%_S7cr<)&s zV|`b%b$U+UA*5%uRjE*$@SU7>)27(Wp@KxMvqZYGf|>B^~l z1mul}Tq3GCmRty%-&g4z{BFU$Q@yxJ{>fzpzYwob!#f!7Fjta?OAYl{AfZpQ@!CnJ zyYS)eCr~+#*W2kIj(XNNuSvfOv?CG@Uv`M0gG@p_VUxBIb^s0z%+K1gIN-h;Z62Q? zRR`6Q41`_>5|Ymkw`c(^j2)3&6kYqhB;eGl{xDN$4ul+~}U-mkiFrFja3i z_IO|L@9`6eI6{ru{fWnKVzYW1x9X9-#X{>BCGYMv`{MUX$w#ctVC2Dh_V>0CmAoOo z@g2wF2mU{`4Z{D}>MfoBHGoCMRvB6SJ1+^Tfy4&1Txq@l1w|N1g0?`d3?ayZ{CMAG(?9A5fa zkL&j5XMW#TSVNdRBysW(BaYAunh?#cust%ndO&2a@6>)vKs<*LhSdl~ZEoEioV9UP z^l1FB2#y=$xRI1#4DGYVRxEKWI86yE3d$5jkeW1*59lVXIg9urHIwni(S>z-1Pkt& z8Z$Crnrgy`E;kb!F-%@+G`Zt=yg)!>5ys#83op|ZN3!2;<>9ol#cJZc!&oT;ZScP6 zVg-jkRs${UtmViugjCo6dL(N7yrdYvs1RgcageEt8|ZatJnu_=;#1UrOt+H)R0|r! zxTU3sY8!NfW=^lpby{ahC-C`gBut&L0!TMHojkgt(4)z`NVdaLeVjLI7s;^IOmQ$F zQ)iK_DXLuaNaiyvy4>FN%ss@`v1}_Yg?w&Pqu?APJwTTZTg@XP`^Dn;Dx-2TtAAH3 zmI1~I7qwfWye-HM^~6zd82nU`p|SuPU3F?NKSKUaBJTiVsp~}PDO{_3$b7*m$w6S4 z2Tg@%q#%NvhHo$-z!WvtShOFVs^?HkpODny?uAU%8+M=tN>@-ZSVU4Z{eTWfxI$o4 zaV0o{nl&Roax|A7RzuY@F+-;{{7b?p9lkJF23~g%0BfHZ?ZGC-$}d8YP4S)>75@pQ z+y_5jn^eqRS&jT`judToICr`3FW0jSywhk;Ekr?=Yf=VTMOodTepgEU#jba(wpt|D zh}>*5OX27x&l>n-7(nR|Ops$zl2oe2s?IFi``7lu)K}N}l7WDEe@iy!MPGQ0?2h)e zE%0C0<=e%~n{k?pJW*oo-J#ik5kcIs2=Dsb(hnV6*0P-T1dn8yqV~kScRSkS}tFku1{BHw9WSDTNLcaK2I-N!KFS+m{Q=uH3=Vx@J`rx^C7k zi8sXl(j$;{_msr$qlDSlHGx=1*lQD1wKsw(Y?IR47PKXqyCKHex%tT|hP`nEDnTR) z5bF|Di;*JHC+bph&yHfSSh%q8@^{b6mb*bEPVg{>dTdcXDxGsbP2>f9!YeMp!PYeqO4U#ObofdIkE@amEFfH@#clQ zeWuoF0dcpK2=&qmi{J&(ggb7YnR|9gX!I&-TiLwUU`a2S3XcHyIBA65h~+(}_^cYb z%Ybmcn_J`_ex5au3<|TjCc}x`{!qT` z*{3s@y$pJOsF)Y}zX8^PGf9*Oo2MehD3ES9GgrXG!sBE zJsEI?6-4=rO;8vTicA+U=)>=OB1pp!FRrIQ3e~90OdX*&2Jc_$^zh`;B{u}~2$Q&J zYcDFfPFIyg#Mq`SL&JPvPTFu~oY7eQR-Iu`p)zISZIN#4Cy=F`N{Vb`Z-B9BfzN}x zXR%+?S;f&aRH!MgO=UiNbunvc5`pt|;@Bljf`)FlX^-pX(xyR8A;B@eU2PNVMB<#R zDQOBRS#__lQzf@6wd(q{3t(og<%DaMC2AkB#X>x&yT+0oWa?JUsI)XIp2=MA@xp&9t@8YQx=e*|sbpUjPE`yITZyY#@g+p0ysmGfxRIdk=r ztQC{)3F>ocss(_2swe9f#Tt;kDP>?V+;C$7H@J>RX~7nyGE<>ODFukmoC(g6NuQ~U zjC2h-;QlLLh_<$d0p}7ZQ%hIV(c_xAqQvyUtlUi7z7mw1DT_2mt_XTQMn(xt=IsCF+>I3wYH#~a0P=#&ot5 zHIBBBi5+r-`ytHq>9Xwl>*U3ct2Jru33b3eIuf=9TZ>n@Fl?x< z^wz7)(Pp#>gU&6`6KQK)7r{Py{6@)$bkyo{k)>Ja3k0O&dMj;Fyn3@A3YQUJ;oUK z@l8I3c09=pZ;1UK2`;$;_KEnzpgKisNV>_=ZI=`2IXbb^n)KNpLqh9Rzr;6Vk}f%v z{N5xiSFO+W|JDZiu}H(KzuREzzr->9yYrUee`V0)Fgf?g1mMRMv!(e2Dt;zvOg}-6WF2mX@6{C_1PMEbVhNbY=w84*d#f&);S1_ z@In!_37&3O?i#&~0D&QeM#fC5c0F~cubLT1F zrR1Rn&_nF$VUn9~V@rR_m~Sz0Er>0| zbaoXZ4X9X3T(s*X{?c8VO9)^RE}KTMVrFyIJjUz(wk~7v4}EX)BJMx##_XJ|QXr#;?J#Qu(GOggtBw$%GG;mI+=Q`Cv?kADNc8kX$A|_^0r-iNkl3`HRvYjsxc!<*ISg*<<2E3KlMl3;E!tTH~S%=E5$ZW*_hbw zl8VoK?Sc&EW%?l93Ug2$onAb+lVcJIjI7~D_>_<`gYMxL&sVONuYHlwRAWb&2OMN6 z2?Y1+GG9-LDC+gbb&M1mJGM#Xs)D2_rj1ehd!3Ah1~}A7jMp4}6R&2|J*X{F5*f@% z9@Hj&VWV5lU*1x<_A5+&APLK}CY{feuw$#mlj)UQSTY!-gdf5V)H%>8PmPmA*>dO_^L#wA36^K znB>Y|pa7C-o;BN+)(S=AHV%a=dr+DwmgDYf!bf;(-y;^;zZwkH-+*oT4aH zfJoiR&}MQ}{oz#=ohWG%8B7%{6pE5Yt|swv4Kfz8q%uEDef2w7Z)KsQu|$RWP-Yvw zK+(Ds%^4vDN7j}xcfH}(I=z9R1@UPti1Q~E)SVGc%pJu$-L5>MNL{L)&>QG`c$Ieq z{)D@Nh;J7=lW)a7>3ftXE)OOqedS9##0vebG-@wWrTVQkW^Kg_tZ(JM+eg9o%b_z9J4unC8^BRFlzV{r*YGhHf!>TqG?LyU7qY;L+jwNhWjl|l zk+W2bOhum5F_RSh`wRzIL3-N-8UA|C@6`ezlT{^VdiW33Ifv_Q=?I zqdtYvUlxuGQ*t_j`)vE^&2qeDRJg1$o#}gn;SJE80nY#_blyIR;7IF-Rv}{jGub$^ zrGnzB2^20e?7jX05#JsdIBD#oJ2NF#W}Dx=OT#?6@8`t&RK8YjgLt4Xx<{R$23YYe zAbWDyYMHTK)q5)nFQq?eqn`R1$nr;s`D4QEcEJLw8uw?0-eFmhzVQqt|_8=V}FzGprqGsgVWt2z@{};&6VUn>7x?cD{y!C-OdnC`pVQT zbYIRG2zJTcyF)*A9w~)3J{cHzr?pHI-j2u;_8CoK-o7`B86tmsRaIhMn{OYdM0ek( zA8{|Mdx9iH+p}P2%qcoq@+tE%kU4_~MCJ`s%2MP~w!xmvk~tNIUCTHX1R-dP?DkJZ z!HMCQ*Zx$S-6ArkC!G@dG&VaLm!gR%buL1!#h%VKUUd1piyZv~DNtE0NE7EisL}@? zax8n6#6pXi9k7g(y%|9z!^Gw716!b|K*K};C;bz1@!iC-JE7FTZ=$iDFL9)inb-xb zMi`*SKwtSh0+XsqF+$yf##kkCkIC5O_q+_*_?z&_!XLzB5whtIVfz3})1RLWFm5~E zX6O@V9wJI_c5TJV!?2}gu;%0T!b6f#rE#+bv7{C{lqg(*;ZW}2i*M_M7*GN90k=#t zVS!#7u)9>l;_~5@^>4o`>wSL6Z;G%e?$ zX%{J=H3K^*mHJnbibRH*;NmlN$P^Y0q9xuxYj}2f4|H;}YI4Y$=j?J)K5Jb9q6eQa zu&)PywXess7IlR<3fCR91GK{q34=fwA*2rTUouop>&hOj?_iJLdE2whrZ=JPuuo@r z#x0l4Kct(aR=9CPxEbwgmvS(&r3m(nvc)@Z^tFfy{lGE2@Wf2g9sqENMQ=)?NqQ#_ zHO95aWeig=b!fUXb;GrXXpIohb*bLYuN2^nYh*xqb|?mFlAINyr%@i|!cvXP3~W4@ z;VzUVW432Klt*H1vOa`?;ff1Yw~r-dCW)&dqUBE`1)1@8M%+=YPyD0s!^%j|7krsfHK2Nl9SBH{89Bv}hDnF6kja+}8oRtg z^c~4)RnRAj#&5+0vn_L!*nZl7UW=_9{F)#!os>J|FMv$0zfxJ zqexYmIE`6@e{pj$wT1Vh*wUGAuCM>w>#O^8*4oud@+0X;tEIDgxPCyY!G4Wnh8Zs9ZzL?M*FV%ylA?!XHSb6=#g}cds0|ta2f135RD0k-WZTJK-O$|iwc!h*S(7x-Sr+lo2rl=nq z>%L|qrl@G&7J%*?4-wvwXn2YYMf&*;il1~)kUtn{|AvEkam%A%tA=HDB8**5u|Hy^~fDhW2yq?7DRFz9fwN3OJ0OkHJnDHj>9esD0YOu0 zzP0BDj-xd$MM>(=ac4wJEDtExYI{?dFAF#`o9>NIUUnd>jDpu19!o8HKI%ugn8E-| zimTP&GE1nzQ%pA6;A#sOKcg-3f7>Ye{Xl{)pLZ9RoXCaeM8+k1b&B)x$m^abv23c8 z-j&6!AUB}mHFw6L^2fnsDloKJ&tUVUd7wH{%oC3>zhq|_bJKS#Pit26u+skX3bM8x z35ctEJ0J*CiIj#}Y(x2^8i-dufI@h@W>=~dO4Hs{q$M3=r#c47PLzcSY@C@a49==t z#+>iSS^`{%lmv6v=?oxTEY?PtcGQW9s188RRRIYi>lX#k8*r)({IpZba)K@0RQ{OT zb6pmq0`cpc%uf37kn^G_Y7}g={yP0e?Tf>@9NqwYAc0cruG~QQ{HhIh4k&g)mQGiV zodgq`RAxL9M(&gw;Bishj&7=OQyPewqnNGZE`khu>yu7r1cMzwz!_^S8rc(Y{MDMm zVSdy?`H{0*LS1e7g3Sf4+GbBqRZ=z?IAr7?q^UV(LN6dm0?FB{ zXOGvje1mI60ZjqP{D+qS9_5S;#S_;X$0vdq9s^g?h1A6k+lOM-NvRmxEa<&bXxTUB zC%o_Po?utEe?Gp%3iPojN^?6!C+nH`x>Dt-adw@UjtaKI2*Ug;F<@v){DXaP;>5{6CHErapeR-b;Vw4&C{7j?6F7iHGUpZBeHB-oaw?= zsiSR7U6d#47H?A5_VD;^ZYOQRW}D=P*{ORW`bmlITVu;grs0vtR)LneFJW?C(b@es z`QUj4xsNOAbuG;+gV+@i9bri0`x281Ic)O?k2=>6;Z5;5VcgzU7G@TE3`Qowh;tky9rs#L`fD-LJS5k!2>ozaK!G?+TG!%%SzS*L_{rvNydLys>d6h0~Y7g($)01y(~ ziPLU~PsMkk-tg~{J(!^o$?EpvEmvtUbLewZMv7Lt2DcRt$0tO_XA)HioML*p8^@{A z4Gzyau=Xela`}g-PFbT}78*Se)_Z9&0Enrm#9g^}#>j)u2KoOH7hz(f4)5jDBX9EMb~`l3Yro>gX1tXcyvj2cqc? z|DvC0O^%mkVFU7U5#s?9QSXG1fH0!m5noZGV@$RrLimAryhNyJC71@H> z)N6i{w7=Y;*XoA60Wyzg8yvb$P>(PkP+r?H@55K+Cg^yXeTj1Ux)%J&;H39tk`9T( zAJNh3imuXZE~?~^GmT3hOz)h7a3B8`5dD?_|H3S~+yNi9)Y)&U2h`c)lOFncg!{pO z69C(O%G=mHc=r>2xYXo66^RE-9iMe2pW&OBYzq!Z?$sF`zh@XhX;i`**XauLI+|fa z)ntlTF0w>bm%1VV{cmX3>sOIfK+l}5_LBT0r4;mfQ$*eypl(hJacwDR$N{p({knu#? zY2O8}JUZ^IvL1(&(m0_YtUitVWTpUGZdUi?QAfWPK zqyFEBiNMsJd8I;_E;RBxHDi(1Ca3StAo?L!_5s7La63pjhLtlHQT!`!FZI%?8`gqy z&2^Q1o3SUq06!| zLEOBk=0+7P)ZEaF@z9c6R74-@2tc|Ktirf1XbMre?Y?ekZWipZeHtZS6G`7;u-$&I ze%`v?pm^GBK*dlFn>U~xcon$;g6PsW0`m>j?U@LD1}4au=?|}sndwa@(L1%rVD0G! zJhpYn_AS12N%vbsR{eI+7aZt>suS#a3E43AAvP%u6CyK=HYann!tH2mXofFag@&&q z>?znLR{MK9uv%4y*|0&S+jNEzzP5EDJ?$7Gx?)_PCsxOHA&q!OcS4Ll1cnEg34jZP z#uwD&U4+JmgbBB;krYNeRQpueauaT%!wt;Y3AYs3zR9AoOnOVrrMb>}h2N~Ok#~dn z?Rlb6hZcou4L`twz0E)ED|jBQAG1w%U;;F-k1T7RS*tB9ZLKW$WP5=+Rn-bQ$N(HC zXRI(gR&|;`OC27dAdpeLbQkbojbI9q&&?iZ-cwa{73o^(nrcnWx4Od}AVct)JbAAw zLgz;l>E7GJaBsW;!Uln`Bl%NvzayQrspS6zMun2gpCE`0h-Uc}Sq(cV_M@JYpJ3T? zls7#*IhjM}tPeRMFocEDs-f!hmH4TWqAi1ydm4u2N<~$C#U6zZ1}s(RM0iPc={E5% zTgGl1I!)am%=KzE&v()xDf|sYL>Nh6E-aAt>Ml$#GA7j-MmhKsY~-~TscnNVgN8;f z6oJ$I#j#QR7IlN;pkkTH@aq#6v`#q20t!!uZ61Y}z{TCLk4VB&TS(Btaod0tkwS%^ zHYZfzJ+%9`p~idebbIWb^uniw_W4r~O8Ppln+Y?Wz)vz#1P;Cw-69K~YLPUi4gYP`vig#oY+^9khQPl7zSjqK42iGn*oF_V1)+57bwo zkK`YkN~u6Yhy_FP9dj`#eeUFfh3KRcwA5HF)MC$_XhOpzd>jxHRfq~qnnr3VfR5VV zbQ>`widd82=4HE}$m~#j!d)S5K7;8P`vCl$T_s80mblV}eU^u`_bV=3zLtGhFY^(# zm-MhN2?d7^D8muJLXZni@++8P6?4|_%y63r7VaILq7b>|L>%MGb?Pp$C}E4N z%2ookg8MATtkVch)-28Bc_dXTS0~a7wMj)C%UW(&O&lHoOi?s;P$CS1yzz$3;^J8O+ogtgdx#68vdbj}4^+g_ro0!@1o?)K0>B&|Y_{DW zEs-xoP0JkVRrNosl_66<;gIEn!yPp%tB|R%p#v`MifFmUr^b!Jsi{Jki7>7eP!|s; zz5Yo272Bh64ncvb;M{R9RLVPmQW()UwW~T$%sH@wX-;RPOz~iqOqes7IRW$|tAQ4A zA3wRdD5wRjCbuPQ-&!IgwC8A!dr=g@=ImRzwzyZjQ0vrz0od-R57?@nF4mTo93|$u z?OKpYJ}Na9)Tb0|NR^LC!6~(gxnh`ROvJJYutU=?esnkv`4 zd_O1A*xshtGeq-Ae9oK9W}%ShH#X;6%M0qFn0a0ipp}n2M(<;I>XD@c!HRvZrN(q} z1n2ZidF?&wFcR(__?+$H?Lwu|p*hN|ZuxBRhERjBdohySGfAuA&Er~=XLU>t?@xZy zQNI$sFA{YPE<8^Rt{>bOm<0Fsv35qn{oD_=5ww8=FUYe8)*HH+OipmygB8;uN0Uv4 zqFYcrmLq$wIxVd?Y2GiS3W2V!0wtA{Ji!D2^lvi9WJcBLXIA9A8DV+ku09ukR5&CD!*(&H1=HoY$y^MJAkSTpP&*!%9$ z`8#+ca}xb9Ts4zigmP#P<7uAh1t;9d{CN$D{S_x5(xo}M=G8Wu=DW;H0tudIKr^!f zXF!%}MvsHv_}wMa;XYWi05zd$QB2W?uDTkM5jRY8UhQT*e6vGHC%j08%oxSI2P2HR zbA050LV&qlE*=cVeDzP{{?&x~xxbVz?5c3Li(SsY1oCb5Uw_4OQ`W5py5#zG_M?#h zDpN#pb4Ae@=vhXYRjSuM!ltC$f!VOeRtO@$d7%}7VGhSS!Os&PLRyFq2MeW06^qL~ zHSq_WOyr5rWeuQ(9Vr`G2e(lVS=pl@n(8DBS&Y>_nFgrqXP^4sGY%^?V2K3Z8dXX$ zYf{9Lga1+@34(=`7xdo=y%hrOfhLP=g6o~u8@3)PrNiR&V~Vb8{M7=AC1y#Hz=3zF zGo*@F3%cL*GttF_iJKhGv;wQwpWAMB-YP#Vu=GF*fq=T3xoeDOO4&eB@`_lC(fx-~ zbs?JRO&<0ZR1+x7R=R%Lc!!L7{DA|)ZY}Ey@O?Ku`G9&VYCC0YA*|ZCbxg(T4p}Iw zZ2g}>PAwoPc}YD4LO)rvKMDg`ME2C3hv;(n?|h5fYUK+TTKpu&2U>}| zZSk9I3*CBFc#gtj4q29T^6WYBav004y{*2VnL7zQNy61d^H@`=Dxqe86=V{Cj9#=16fV&kD(+%{Z!TL~%=8mG9Uu8q zP$78(CXhYo?*n?3TQqYjnLE>V zXKIl<6J6WJ^#PoKrS5WbXR5Xia|MG4Q`j=5IgD4B;V3>z z?}n(+iD^@AjQF_HXK$sT$wE77_H;g}t)7-%`fH*#Pae&9N<>j~m^01aB0P-PLTp4Q zwPP(a9ipV1)QorKfaluxzvc;Oo;j_ba6f*OWB<>2;(v!^5dA0GR@~g!LEpj9?Ef>g zSE>J7gk5s}nlWRG%C@FUzO1ui^25}qu)YXH(pyE9!3a^1jx31VSP&a`A63UJ{-iw)DS5K=}mrEE4(_b^7A<%aNG% zPUwF$@qLSGe6mLNED`!*4)28AA`*WXg2CR%Nq)}|e@F#7d;=nLf^Kb-UR*yy#$V)g zzNFT^v{Uo~Zzib!^}RX0+AiJtmf!TeG}UuVId}2;X ztM9EkuN)>1D4QRe?=pX5(~)_%S2sC{vCy%gZd(*Blr=e1teL2UQk}Snot$eh6F&+r z^8ZS9XH`53DPjtcGSAK=Wg_Ee|8*R6@DWQ3HP#SYxw{#bn5I2a&4jXD z3-gzgn?F^8tbM_Vers`l17(tmbdt}g#LY39H<1?YLfE#LCIi6pJmh$4YVoT#YiWv9cOMO%qEN#i)?JR0Bius$r^ zk1=^7QGB@#%=_zN6XP)d!{}|Vtm{@=(YGVxtN%}YUmAPd;c{VC#PJ&hAX?>C*g*Oe zAS2tWc>C~sWLTLeM^9_{mK#BLio=t<)M4Q*(MxW4tx%5Kj)a`Kt^P;GXxwV9L3Vxy z;@YWTOaw>YyhNr}_I4?ztb5CbPsK#QZ@uy8dtH$P=5jU0#GjIe*ja4DuupzR5xSKp z5vWPl6uSNZ%T|I+k~bkDKK-ZI)# zYGEMZ;J}yQjOkOPS9M->H)JVAT3bbOS#nuP60YPB;JAb5-uN8yzSb+;&g!>;I_2Xr zYr-m9(+P~m5u1+NbJ7%sl9t{R8kn95B%sD=tSR@SMs%c^gn0D7m_y7r8-Z2#lzU92m_F$gKPJ@Q~pHVrqNNU{CJ*FQk;PO~u+FZy3vv~9x8 znt19v=D>y*yp2PGx9oiUmlTZ7)mR;@$zKM4Z+V2QN(`ZE_*%4HK)TJw*w)E;!_P10 zErAu%_-n-6;FdH0QhTsu$F%5G_&Qh-ZHMWI*Q|k-XFa?QX=I+pIieB8ViZxOWGVZi z#cNoh9ZFQ5MAN4MXu9AAl_3jH&KkvZRa2?%WU3tTO@_%ADWKthg4u+@kpIG+qbF;Z zrFUsn8<6IBZPQ@{*&D|G0itzzresYWBwU3kXtW#HukvP2nK&4&xVQi|3s$a%VK^#2 zF8cg)D@sPNmxj~kcq9g>me#R(8U_+kO%&1g#+o+OcPLxTLlj|F-Ub%`JkTwi!(o9U*WPUAdtBrD8vqm)rh#ay~ zvfl*5V6RkUOk0FHj;xOz_lJq^q)FBHVn(OVfPaEC;qyCV%Q>g0RB-X>>sC)B;cCoy zzB45#2Jfw`c0K8vc5r7g3@&)PjJ0IZywiSSxJ1ccBxd2iDvSrzWvO^Kh)KMMl~Etr z_YI7vAwRxAvRQB2t&wpp*-g5DC>x5_-|B4yyvpp8udpCy$;od6OCWJqiBW(0F8pM% zeJo;j_XsT7aCF?34j&#WTWp;=Q&gS>$&zVz_t}c}DPLdQvfewB77sQ^zDg3Zn8i*v zOGQ|oX4P;Fh7H#nuCfIM#^aUYa^F(J8pe_-_!l)^r}MV84)gTy9>ctPOW*^?eRlAB z+g4*hOM5%)z^jG9`0zD<@NrTJeD8A@XXB+$Ca}c1*GHsN;Fh^Nu(8ZEy1zLI?l=6* zxAwQp?uj0lLEWuCLj6a2?cba#&e8Ii@rCt%p+XUeh1LK+zfengqQxC2?3Drh2$pCI z={dXSl*RX65E2zJ1;I5(fkJW(QSR z?RaG_iv2y!_84s^9TEqK@z{#BO(Ku}83OGF0eK;_kQGHEMV zK1?C=`w$}si5_B&*AK4SHFkj2>_oJNi%;6eh3M$<15|h|@OVg@O(yDY- zpjp}?>??D9@SFGz`q>nY1blvoIJg`F?eVH_GW0 z?%aARE+y}7wjzos=6X3ME3){*MJ+rK2%DJb3pi597qd$yUbWLdBi~Yc+n^jiDZ#e` zgIa@tZArjaEY;m7`=iQ-NsX|WUD1LsG4}xlG4^s!in>3(6VSAHL;06gGy1m* zfm%63dt!%kC@WhL7G5w7_Jlf4->r54k9r*E>AXk_kQ3FjLSTE82dCoB$d2UBHi=xm zx#u}-Bnptx8Z1ggkJjF6PJQEo(_r#W1Ii9R?=z=l<2zK-`=_;=TPFEsHu+`ifEkJ~ z>ea7SJeey8z}jJOe)A!?GJ6Zp&tmC{BN;6!?d*d$w7+lYi@Px+uPw_7%9bw`zWmW0 zI$wwixKZ=eB0yO6;uwX-ni_TVQpCw`T7z~4LM)My2KDvRm^UrWoc?;4O{Cbk1%8}` zyf_7j?87%alU=lP z{%c&;lMM>{#Z`yvZ<*`Egws#v6}8flip6(;#XZ-fPm)K^?RS0)Qp9tchimI8cCL@L zVJ&?66#K}baqq;0p)PY}31v>199<`$BN}F+!^>-HZ%mC0!fMjWCjtYfw61lO$=b4GmJiqxO#4u#YqUBZDFSu;{q__J*nuuEkJv6PmsSyFazJg zm@q6NPqkDUhr=pPXP_8D#*B)u7$ch&6k*KPJc{=qiS}+pUmfp`mG~+yMH)TI*(zYr zsxdu;Uyt-WYOp_FB|M5UX=-I{@F%wItP@asVfiUfOK^|pGwIyg?VS!kHqva*&i9u; zcR_?7Y|GCly$9gBVxi;&^Auzi#XD_z>|&72(x)K&S}!}hafH@|5lq45@J3O|j~PY0 z%M(>nIS8i_wN@W&q8B z;xWtR7Bu!Io5de`L)jfmW}f}*ybY@T;#G$D1QgM_B#Q9!drW9oQ+IjgUL1zphI+dH z)e=MZtAa-)Iw17#*^404M%kY?ZO5ECeUpO~eJL2so{XRv}1a829K_6?p} zlfDMC6|b0hZ*VxgRV6EthC01z$%=f=l&*-?4MiHoC}_iR*JY5nvXr@al3V>z3iSGc z{7PhT=plSaIyfJtPQ=a>Wi#y17PMz0lHwI};y1Bg>+q!0tu{_Ok7tfA@Q>|8_6(Sbm6Se!(08|pUeb0PN>@6fVl zY_3$Yf}{G>u%2L2=08pNhUw zm!Z+OZ8l88hV}55S!(J0e?JwO^>d=|)-MadDs*FZI7GHWr}Dmo?E3DG$`L041H;^z z?QBj>o~Eu?mltZ(9o^m`{Bn-1VVV~t&0z;^&(478E8p!M=tVMnotjVR-@9ZcM{pVK z{vL*m{`K>&rGg0}G1A3jF5+G}Y*U|_CErBHty`!vQXcOh$9e7+mc0!Q#22lKjpKLJ zf|I$qT_v~NCc)!?%PfIQuQ?(uJyY>540!VeSg`>HgKde*<>J*1jnhnFnkK`j-8-`v z&I^uk&2MU7Db^2K7rc>andnPA*qHLm`+#KJr%@6eAG4si1XpGkn^&{9n zSqy>ndSuP7B&)|2{Q^1Q8|?7rJ8;_P6~oAS@O&2)147*%USYjn>zG4SJKCKWmW*FB zcb_0JB@2QTsyFtj&&9 z*Eseak=G_K3KfK#X&l4Yr$hRgT>5nLXq2MPf5kHME+qTZfvBS0f`X&L3aWwc3xzSrK+CWN z6$V1;jXH7Ll&oD@6@#w(lEs(a_7U#JFmG>FiA&0OrFkA-@tRI^Ue4(4_!33Yb<*ei zE%9U@+%|>+cxZ@X9FWgfL)(uzt&VDwgo22#S<@dAR6k?$4jx{xTf7O}Tqex0-BcjX zXP!|@wvGP42VYdf6}nHv($^5O7+I8)VwvD$haQ>t&^;jAzLV@J(LcwuCC_=YPNr7l zG178Lda@z5ZJ;;TbY^8=-sEus9*my4=DlsOwi9b?;RVgP$M3~;KBd8m+xa9OBPpb1 zz=JWOgNb>$^|D*la=X0yxCJRbvlYqDjtem<=^(^(s`!5Ok6my(jOmchv?4?1#ZePc z1T8Z%>gX3r>0h;fQDzuOWm%|Qj6rc{xm5_m&`ugecjMm9t>(=b|8{^TqXtEGn2MU` zT*c7cEebMM=j^PnjlzdzXB?=#iP;pt*YkzE%(gRcWM=9Xe&a*r^0|1Fq#y7{_MVqg zz_UPyu?~i_JUpM1k#@B4674Bs0GV;xf5AyJe!EBieH7PkV1$q>*2L_W)087vBCxG`i%9H{$OdXr&+8Cj4oS5yOyBI{5y(Eb%LN61#d zb2Mv&LF_{zyB7wiYF>|bU-JR+U+kIN1SvcBzl;Hd|081df8Rp9|9A_HU5u^%dnqqV z^<4|?7~LlX+(ZLH15-q#%}icjp?5G{SYD{LFrzXe2pk||Iby87T*=+a5|Q2`ItMbl)#tMvD(J^eiqJ3HO-v5R-y;l8o%wmxobxOE zZnVkb7PAI87H^lC`{|sno0Ax{XDd?{P;iLw=IVqk_owuZ>(VkBIvU(v@4{-E>2>wI zIMl&!@!s}#eQ|L>Wcb67cTp6hy1`jSS4fC!LQg;K*Zj6_4(EaBq?yz;dzx#bi%oSa zzn?tnbC)MmQ^q;hbG1}S0Q{09J}usys&UhbyE1*}k3ddC7vm}I_6j{#Y|*8YwM=f~ zwzS0H@oj1P{i~JQYC6??uCpVSHYd4C?@Zw125NHfx*NGE84N{?)@z|V&qS8^rYsY4 z!mYv+`@~jRp%dU0#kLczkv2|OWZHE$u zoaNd&Iv3ocA6sUv5o_Cmhis-%(3bPGMmqeR{uzPKzUoWr)$-fS6u~h$wTiUA6KvTH zUEQ_nHl6y4Kqq+CNZIRe*{;nkZ=}c5UBWQLMk;X1<&IgZRamz>H(%`fy5`=BH>hSa z1Gx-1U0i}!x{9m13Zb_B3Gi!>H3%31R$Zrb)q%!qX*xK~w7zk*Tf`l)8S2uK<}Roj zU1gOqTfZ{~@o}19UlRd|$XLP3&fG(((JSzs{u1zX-xF+>J%#bLN%MYyQ>w#z7u}Hz zi0ys`cpkrd!ETE`gjY;A06b)7n_a)qE8Ti8HIh(;B)C$Vdei7{&zmnqAec__*|CfA*tJ zZtaxrx?R@DYJn7&Uj006W(r+WvWJ%o**Ws-4v3o3hQ(?>Z0w^eyRb*0!f)<$KvtVZ zic6}zdQN9`i=4~jxi%gf@Wa!+Z3 zf@h@;%{Va$%tWKbR6WZyZN-tJKPFe~hNn9SlhGej<1i(5Xo5PygF%xYRRiB-2#~aZ z%wOWG6q3W`M(qKQj_)|C9sF9`#$ z7=iDA;!uqG7=r=#`^ot5P&;a25z{IOsJ|_kHtr)jR%tcD!v<~M8A+bQ4r|*MIW@Oq zcn?q(A=RR!&1(;HgTTN#Bn(ZHtAkLhgZ3T7e?eWp)fj^p#*8B{hKpfLx22p+0%nYV zGi_&M#+;5Uh_ARh&Dt;UXa=#rd)@Oi(+A1Nz|3310d3)c*Kk1C;F}nfm8ghn+|%_3 zos@)#^L_Ex=$Kk7kauga-e##)ANZ!YX7EPBPp}P!{CI9mdAeI#A}&mw_Hvc-O}+VZ z{<(19B-UBB9mlyHFs*Q3jqV<>840hr6OhKX7ZtE*=EFOh(iiD0dQ%f)cGlyR2o05a zq4eJ=TTo)*+7Ge(;UI)^V%n&bda1=C#jR} zoe8=Y>Z;Y}9SBPqS+6RUs^V@8!~yi>gw$}I8{!~*Nh@hx#7MgF;?L)mNwlztIPxqx zqcS+mUGsAs*^5oKnPk(o+dUBee?q$dEk*t3$JEwTM)bcQ z)2R$-FRh`hk?(>9#4unDC*g&Z|W34c&qI$e|a7h>~ zGuTyYP9YA#+*C^`@$mh4hbFClnYAK$_2!_%VB-ytE~*Fid(nMU)9gp9%&n>8{khI( zlcV>HZ{KZS1S&b-+gZ|sLQ;)MF@^;i-M6F^-N!l02SUD0pDnS8Q-1FU%eN_x@)CBp zyW*Iyi0!+%jR%AtuM~>w*AwrzUMa#iGji{PqVK2q5x&iDLWa*|->+#g)YE64*FcJ# zy91W&4}bnoLx|5YDc>grWK;Axy_bZZyG^l=+ntxgW430~P??uxw$g4t-dg{c%uZp=v(3vSF=E4-POX>ongyO=EcYHSk|lATs;q`qQm z?{DJyY}sar6xfGLwotYRGcuyhzmC~bv++tKmq#-C>!1px3yjp5aWX77g|PJ;Ij|*~ zk_;^>M7QLUB%Aijd8^t50GP0@jnmfBm)1&x660% zENA;w6PDOAY)fTFWD3UG`^(WrTEDQZ4GuK$ES7AJF$Di9_OM%=UP;N zkD_X=$xA@tM7@cOY9p=21YEF(HVE(P+!=Hyn^=rF;sPpB7Aa{5)yf?tb4dbrtrePO zrq+&n+JajdoiO1-(lq9%nICo=d8!R0IOs%7nPyodl%(rxSk^m(mSB8G%tZET2lYvyqWx2*?P>XACfj zBIsHNml^5MVwl5^P@`7qTr&38)5*lijG1-*!YnYP;p!xjlR)845MF~h3)TuF#2k3#tD-k2(@YTOYnKAZIHm5 zHAdxd$J19H0++|{IWjBJ}2g| zBEnBt8zIRj$ZxJd)Zb7Esl6N)T6NhXwt7GK_q`;x>Nt`QTtyajGt6SPy)e8~L--12 zt_*Pf@>OKZRINrdr8))S0#Abkf)u8I?HM3|}#YRU&GY^dr1jJz!AnlZRYNX}hj~%_3(`7^i zF1xSs@Mp|myqqd?P07JG_D@9LH8?cSPEh~zZ9MvD4&_u9iZXDo&tTLUV#(lG!18k^ zPhmUtkZ+Ss!%`q@mPZW@NbmmRA&!#oriK=K8t&$aIcIf_;;6x&=~R z)=sUOQnG-irgs~bs}}rP6OQL@4j6LNq5=6k0sgC;ol4(>j>mTgJlTQn{Zk|9Zu64~ zp*c;ps@aXVzs3{bJFmcfxc*KDQW1Mc|2wgKVv(HuymAaLYob@vc%RrcLw{K;A>Fki z`9!yq-TKu}Q)x?+>99_#;tuY_O-)c^VpHeMzP(=jQ||D5Tki>k|a6Du!<$L=l#QkL6~bgOL># zxC9(069JJ%o3&ulot${*;gx0rvUuG0nH7aLF8KVTkxq@|8-oh`JysU56x0dB`xceH zeQ3`E8Ehh4>5y+$=tq+b`22oX7n(a%DhD^s58DenGx#TIct6fIl7F(m@sU6vH%lEJ zt4AymGTe_-6-+fQDJe^yO!pz;d@tR|Sn|}V+@CB8vu1~qw;=Gp!|^RnwSe8!2=&*g z7ult9n531Z$%Tj#8@4o97#lw_i+-6M*CRw*R3D1945hzGvV12S38FQOzE!JgNWc|0 ztrPvh3+=E>R>|@q2^8f%=hECOPp_!Xa{=d@F4bQ1Q=Cw()~-XzX-cY~K7W1Dux$2K z;US0!d=*YpQ{*)(9zsH3CmVX1pf1BvHnoiJ;Or>0kEPhygZ>&mfFlTT#%C`Aoi_6ejF;9(x^CnS#B3Z7Ex)vSMRt8dDGGxSW~y zZYrTW9m*In{h2QJ*q9m0bFd!)f8gbHNX%C^h?G+?=o~AT`7*h?fL{Cs82kn#{AJLx z^Tw!-?x$D=KR~!7odF%?II)@w1U&_D$m``CeT@=yqR$GMLDKUdg;o^v>+aeUEsa6gs9K*9&vl=_&^_6so`I4{UlMDJ)*8F)WMDl7Il#o+wJ`U8 z=P?`K5NQw`eNy-;jBrsDDD5S?ySFI_EBjz_9c|y^YHfX<7}0sAN?TyEfTAHM)B)lA zmezQX884V9ORmmMIAM;gv@vd^Eziel9~8;)x2eL&ud`znZfIdtoile)Kl#yy-6GcK z@^=4gXMokd%~8SxSVvy~iGJnh3HeF8EBgq%LYkS7-3)|XiXd>dpS*M$>rFUM+}Gh45#uJ<$T`w5f8C(!Lz@({N{iR&uQx%-s+wm7Vt?uT1M zxg@uMI|YB6UZ(1HN+z!jR-w}B*`poZN&H)z9-B5d20>0`()AKS|IhSl7f)jbmLns> zL@sGzpB5$IY1GX%Lh3m=jvV_yZOfm)?QjZibDXVUrg~V0yDY4fuEwaV0Pd^e>jhpX z?kzF?!uM0?b(xu2&rn_5GC%vU+ISR zD4f7f3?=unQ3nwjG1P>nSUr?DR-)Ds)}@c{Z$}UkY>wLK8dW;U)Rm<|dZJn)xi@WH zUMQsZFGe6Uw=7+rqD)Nnj9s4CI;IianinDkW|9h&L_Ewj*M1@w7BdhYSktK0U|pOQ z4YaR6GEQml(^@MNl>93Ua1M6+kXU`8as!&XePE}H&ydjbLdx;Ti9CSl4(Ji3_5`}U zOSQ-94#U2}4EI)Gf!54*J#g`g_7vwV*vh}bdmv|f{M|0@ndN@q>_VJ}oD?IZjtK#Z z4D6!V9=$<8JE;El-0 zZH$q`@fh>1tUx2Ynhz$Oc$2{D2e)IJN)Aqy*pKyz?$C=x6fk0TRAd`)00m`7d<8iw zCOJaK=Y$5G2zE53Q1bvImsQoQn_Y1V`z`}wZy2tol-;o zAI9DSHj-vt5;csOY0S*b%*@O@W@hH`n3|I^mw|Y`3 zRZ3-LR;jbHv%ZKgVtEqwqI90!r;JWbXZUe0!H>;iG<)<{@)&Gza=8RXJNj;d*ku-U zwA>#C%%y{H2kF5!q1I5MSRko6I0|Zbys{bAw;8{zZgA>-2H>*JLe)4M`p44Lpaqy;LUhX>6`iYObm+dhBa{`>{?K*WbLos1m0E1kjgj z8PtL23$VkUJ~aZxBilz4Us=j(e!iYkm1)i{CVJ=kD*v*+H;)|EUQrx*TyVbl$PPrO)JF$v-XjBw>LvIvZ$=7GJ;w&n~uPODD7Qmv}-mMj0 zXRzWdDW#vA$Mc^Z4&s=DvB+vqOcp*^=@?2Aw=e^FZOy(Twn z9>}o{dGTGkgI#{R_MjTL5DQj?*9eQ-n3L$Po7tUmubPtEjNT|STVXfrF1>bfqDjL8 zbk4`28ga5-i#Wmg0@sv1q<|8ubzmXmEK1>2i)&u9fvcNN-y!giGL2;d`!T5W0<}RCa!TJL-5Xmx$Yfc8!L`cM4?S#8EmX31Ltcf)iFDhUUdKArKgTl3Q%zK}FXP$09(q)hVgo#z&%bA0aspRc4_q?>ck2?{jE5{n zs*NQCaidi7SQWBME5lvLrz<=o$bSTT$VUJoMzm8SjFU79zyeK#K7f!F`i1ryRQvS! z!S%6~Ghh#RN{lN)nWxejHSkcCP$F1sZCaaJyE$Pt!Q9&E21#BsNF`Xvi$joe5wFPc}!5c@a_JYLy@O;yGcW z1MoDC(=6h1BE8bIv9|=o@1Tr(clke>!I$Gy^PKI3hEZ zU#U*@z<@A9>T9uun`>0o5+{JNJM{e1KTP!q_aId7!94WLX!TSD0atV|)l-BxnW-VR-zYJ%#t6RXTlNZ)i~a zdY#pb{O1mJ?8W9nP705cX0Oo;j~h(T#eEt({=zmLm19xFcgqPJ(bkSsHhX;Vujzjx zXNuGL!8NuB`z$|J_ege}5sEZGm-c{PJmvdY`z&t*HXo1*w8eluL5~mz1MKeqxk{j{ z-S>|RKIEF`ddFXai|TE;hUm&_z1dqKxV5c^CrghH^Gq{Kw<(Yd=vnjC|5M}YHU(t| zYI(q6*+C}Xaz^MpS}jTs3M&hfmQyU&Aa>&ZfnmLD$SfD_wg}#m{i|A4vhM6^?(&ru zSlwg1!t|AEbKFoq>$au2_OCJiX`DbY-_AossxVYNh;{LLRp3*cPvKROg+YViJRBBG z=}N*-0>8{L?y8^pSXm1UwEw&QYXty4`nIn^fky1nc>dke)`4V{zw9~?e0IM{igu;sTveu;(PRzJxA*$ z0C_w?F=~-L&)uzyqOa=#dsP2nNQm<29kI#F=N>`+2>wIx+v7fpk%!cm`^!k~kBAT2 z+5qs!C={c0@<-tiwP|-zKi$N<2#$gh^YB#~g8l2AYeIjqQf+rFvB{=uf>1*U7Za7C ze=Gh4yzEUUCrH%k4zh~+l&e;<9+S2jd(xWHzKl^q1AuwxeJGe-UlJ9UD3w#IS;MAe zij-3{DP9XL`@cqH%58{Jq76t=T7NV8>+ArqeJZx1ObT1n>|RIAlzUttMfC^O*`b(D zxgIm7*#FC|%$n9#1Nv8I+-dvAZLHT^a{p098=WRJ^LNelLB&ANSU4v*;e~^%3Wfq6-D7EQVN(ua(x+* zz(l2dGW77(>G*3;9+)V4ay}@S8PWbIK(b?3^7Vo%YHUmLH6&Rl42(mZO20exuEhx% zU0w1uHJL9YOaM-CFuqEEPf3#Fuas|bVJv(Gu-?9a2< zF3kK`^oFR+-*Fv(%Fb|y^wFC7@%1}+%S`=vn!vUd1Y=_Al! z)sm4fP*J5?yxw57hV;=mZI5LcWbBA4uI>c=qSP|CoF?l-nx&~G9Kk-AsQeXuOs+RB z{;fq#t1%v#@~=~x{kEg{yTYNP6A0iR9Nf`orvQo)ujUSaLGERt-!_D8gc#`E1ujy4 z1pZ<2N?=MfY(omMh z=K6v;o#u==Kv{x~6M*WY3U&(&>j&j8@!2}8Dh7zUPzqsiKw9vo|I5GZl;hX4tx_>S zK&+Mi@A&S22TT9Q)MdG^_^y$?k;Q*x*i-(|?pwtF>^2>+r9cbBAVnDxh7d({@0t^` z6GeofgCQfvDhnCAT%X!GpX8C`(y^)ZY+PD0XkH0gvYx9@tCjzCb6l{qs^epQwX{{m z|MyJLF2KROe$|xoMM+?{D`We;`soAzs)h0IQADY7g!*$@v;tn41eAS>qb_>OgjhFe zBog#I6!``Ui`H*Hk^~tFxUp^uBx)H&M-;A zpL{u)%aj{zUk$pv%Dy8fsaeFuoiCXft;?hv@(spZ0_2IbA!jW*q{ste7{i2XM|Off z0E@;>c=W-uHG13_SEPwDAA|3+4!U8SFt=X{1Bshy51}^90c{bOig4dv1%DjEh&M z(MeIe4JY|T#cxIj2a^#Z(M|NKQV$E=`lcGjXC>s*)63KCRo2V&h=K73e5@i2C^J(roJ>4M#BN?g{G-j4> zPpouw3C1fb!$EC`Tjj;?sxxMa&RiAi+$3r;$Y z+u9S3nY!>=nwaL5Emm9>mIxMV=wx)QA+Y(+AmH!)?8c$b#1WFyH{@;Sqod7^JiTok z>bV@S7;9e~U3CRyF8CI#yv*ANnmF0Cx$)%X;C$~Dt3t6~Z>MriUd4@mF-*ZNtc{1B<&n*^C*dD5c?G9VU zVxaiF2dd#@eT5UE5rvzYN`c;dLrkCdB&-ODKGJlH+Fi2)^-L_-uDyy9yFqDrn5r^6gO|tva7%^33l_Z4(bgf7NvnWs{{}4F6ib3|Nl<8<9%G9< zf;2l*J

    z#qEwBW>+@VGKmYC5&VfE)-Z9@l5;R@Guz3ZNVc^Hj+gvht55N|{TJtT zdvG4j&ZyLL#xJ^1jN=vh-6L54z~#ZH;@)9<2t+-I+|de@`-LVxpWOM?2}8J$RI1%H zSpN`1xH5mz)NNE80TVuavHYmWM#@Py7zdhXe1F9lS^zep<~7uNLOmI>lzh!KtA)zI zI6wf`cQuQZ>|MI=OT#b}0+ilC*UP?xhmxbXmBz{-y+c;%Va7J?tW!?H)M-kiM<`r( zvtXy@IZJD+5UfpsoWJ6*O(Qm2q1>n}Y6b-p)LXl6`zB5r)BHjR{^+eE^D)?qT}%nX zPoXq(<;q6wTCr2X$fkjhR6gXm0((;~O6F-@Dylt*VeV`X9(QeGyi!8~Axkkc>vUGY zZOJpl@{-g{_7IB>`XfUWv}w{AlSm%6loOrd;=28@T($FKpt*@M-TLrId_CVU zhFXA~OU{A14|-205c^aj33KA!$+=GsN8j=r{`PuO#?UrH=&-f~Akj+rSxJXsV1o!6 zzfU0``PoX~kC|Unaf=H!vTxIus!tr8qLY+~mcNVuT0iR{q)0Hs>5g+HEdn>;uIsjX zlgICMZv+UyWDyb9Qn;{Hv%?;rMcNzAB-WmbRZy-Nb8Dg%dj7WuMl5EH`wN%j;dQ)2 znt>D-QC+OzaWm+iKENthc(F0nJzDf|GV5-mASWb1ql==csy|yf{!Sa7|y#4!*oTJ^4Ln7dw~~Y~4~F3{o#jc&)MypEq0<`l^)h9;0z2u3+!m_qnxu z5Nk>$Zmg*2g42xQq}_GCo27d$8XUqfHZwEoK9JW0gQzzr3W7mYJ~6?5!afHfDreI?AmXb~$M@r#nf z6)Qlxp%b*qA10ENIP~m@1S%nCPt>Su^n#bhtDiVjgAA69lGMLMr4rh_>4ersI&>zn z3c#VHqa0iJv5Jyft-;_RDQn~PB4T!3dH6_?DQYd5+=sDFIfkd@IATq1gn?{x1_4;g zb$R0TBXz;Mb-!F_N1?Cjh7PzzPQMYmCB}ObAb2Je-lJ;lWBeYfgcwXk)7)_c$EUa` zRcpcu6yZ#JVJ^0e-9O*wqGTG16#0a#Tc|~^H8?tG%8CcEsa|ZTCn~Xo;$D>Rz$pkR zkbgZRHKqM-yWXNuyN)jWDCOs9MffId^4hJ{`4KA~eeFcQp+*pus+6he_XIc@@$ZRJ z(TUD8MbJLcG;Rcb0raDd2g&}lka4^H%xuv{2NDVKF~T&%IICQliSm^BgPG+V8u)`< zb*=e!k>rC*Q#vG5l*)u1mUx&gVyC2(P6p?wpD#?`6?f+Q4w>~R46Jo3GDUOIwD<#Q zsdhC-s_}-@9}<)s2bX3SsFq^)?H&@;T~nR({IFu^)$2TfnlXR}rc{OT-=x##uY@+V z;Y#X*YgU3Xlw0Dv6T8kEL87g3x5UtC(hnfk5h$l9ZorLHl%~LT-~o_)Nd==(InX`v z4wRaz2|C7&UoF5q+c530V%=f}F*kX(C6kiiSZXL*>s=(W0n! z^?V&8PK1Mk4qEY*hrnMo`fkcfdU`;8O=0aDk7<4v@1$H_7qrC9V#4X{wx`^?kDO2L zCl7**qfgg!E9V8+r5(V?u|wCrhXKyroHEYS?(Mz+Ph9N50@}-cQCx0esn;zzqu;7z z=`3^Z`xlCe#P<}(_k@w_Ly;GI$2fEQr}E`KJ1zHVuI*k?;ML+4N3r{|*unE8%f;~q zf-q&F#rNLM+X?XphduZG7v<-4(z4gBZ0v@1>OvHk!R5I+tcQG;ByOFbb_%EPdcCih&wsl(c&zNH~$ zPDD1t{4ZJL?tF6dpLPn6-jbu@=>!$-7A5fk5tlgA6s*A$p?KSx3r~jwj6!!LOvM~KvQ=AsC*<*R zQjS#4unRfvp=N4$KAI#q{Jrpm&#Pfg~;r+a@> zy`Uy}efuQZeadz7v5^%EVMbsow+Gc7{fME>j^cdukp2NdOoho}(lEUN^$L~^A+FUp zG-gS~E!PrDVlsra5BV<}DLea=mi!c}hU!uDB9Oy`-7dW@Q^(>rg;8RMg~jBl~> z*dqMDIj#> zFn+Y;`Afzz>12Oxfl??5tP~@|mLz>9!=42;WqY0$vhGv!GEb2B`VeDkm2n^D2|w;R zKH~EJid`|$k!6d>zCe-yS3u(!`*kNV}d@)GGNi;Eo|5mSFHL3?LX% zS1>kP%126+a0Ap|Ny^=E*$P%Lsq zV!;->LN!sw6dX$NtYyi?Sla7nMv|-6-AlP!WP9#tnZx~HYvDzWt3ktOj0Le~GZ1`{ z=g{2C;$32IVY(fG)J4T>s!SoI)vz9?otkK2&BP2Ea6@<)7coY+UGA1TG^(=jlU+!K zBWB}RNj;XXFqY8uIiv8^>#hdiD>k{h+Mf1WoV8D#aTwntN$!a%3%o|zwCMU2QfEX< zl5R}P+GJ5qLV047Y+5l7!`fs~Bx6h8Au?86WY3oRjj8FtkHYL%(+AFu>u_i}*vdts zD5I9=xs|J#n$8n4pHqrnR!3KDZ#?HOVUIVAEvFJVHc|0R> zItTv-0aZM*D`-x0{o`rq&CY1-T^m@3Er}Vu!e!`MU}4ola&szUL|qFW%)hLO96~AK z_Ee5?-pMjCn1;(7n~r9ACn!>}0VH>Gr03z0#!wiTh6|kGub47`>1o)PmLZI-#u&+WRduFH{RkX;xJ5+tp_!RVhxd-*OFn0 zMmV~Q9KFE$RD`v#kU9#~P=sBCj?mc-yKdC3pi1TZK;<0s20l|vmY4&Jpmg3PngtwZ zd<`k#6Ayq$nA`q{@u0^ZiPeal04>AK9*#bTTzx5COxo%}e`z2(#3oZbnzrDkCcF%% zjVauY^l2!(e(lR_y`rEQ`8sKN8%|$bSp+P$+|juSrNcmRFUaM4$&RZzDtf2)#PAvu zfp5LFi&LS})0~M_8NyOm@PD|>2WwXqhZaZf2>*#e;=Ku`A=NPmvJ+k=riT#B3{xi( z=ZPGy2qU&amk814!jA>8AFPctMr{T^Xl+fr1~ghmf8Q3p^Qw*=3CK>(2AM{S!-ssn zgFZx&?T|rl6#Mptqhb$oH|iEN%c`Ml?5ZU-0ApR?@t?kZ6ExdJr&dVV`zm@;Rn43$ zF1TiX-Kjg~dQ3*xh-v~vG)=<1Q3`xu3f`*sXD{XoQ>lS0yub;ek8fp~cmPx#wJMRt zwSp~>Q%#|dVdjdsMAStnbi$@$>vQ^@wpR?H#h8WLvELq}VHGmz6D(ieiIr;6_7u)( zVeb-IF|hXAgOOnqcmvRc2RoY{umP}=0LJk z$JoV0+QrZ}q15ps)bX3()NKNa8B~F0&A_I70}$&4wlWy{CJkj9yYeidE_7h5mC~D~ zkc!7RCV82JL!jgIESHf^CGU&A(G|p#HH`_%LS{*;TtLOXAz~=9@_pvP@VE~i;W-krXx=Lv;di9J@IA!tF_J{G;GRP@3c*K zL<8s328Bd#xkIYs7}a{a<3ounkUv zmIDD?6{>RjX`NPPgFfynOPO!$x3~zVMyrI$EfgaIY+BVZv#F>?%;yPQ+XHDbEUcbb zqS2Lf)BnO!^V{+A5vA0Il`l9I!|#)%`Q9 zT7j)T@PfF8H!gDXC04)D@T_p@3pgzW$rhn;g~Iz+r0gzng_jbJiU5|UagT$-4;{=Z7X3z^u&DNBVNtY{4qfw6@%=UZfS9#A;0kWJ58BH{ z8VLb@tjCAbMRfq`lzFf|#2VskwR`7ToQ=mvlBGAV+lbIQg3iWGwP5w;gJR(c{vtp8 zn!&6D-qq_@PoHF&TWXt}Kix?!IeE7pMw&YOX{VMnHwi&60QsA{p38*Gm##db?p>f&M4` zJt%dVZtm&#(6iv|HlsN-9ux_0_s3E5-wxz^iKHN+#>kF3&Q{M416@z|=CAp=NTs9N2UV0qbd$$Ar9+dBPTckp#q z@^gWR4@-Aj0KGf%3R|sDX|P?|$~wjpsR0D7dqn!ZZ7nCL4{I%9HmbXt@zv=3nlJLH0^UdBZPV#gAh%Q!Ho3tpaS;#l;AB13!*U7a|WRE7OS&1tu5%ka#|z9DB}xsKDV00y&KyonYvCH#(EGLX8Z)GUc`;qWsfOo_i>f3BSknODkq%rfvwjN%fJ z#acv0UaB01nw_|uqCs&qsJi2XfIY*LLXpCpFsB?P_+`QqE@^C?n=;8~G0)c{n=NBQ z{z>||>?Md{a)-jVAbrg9GrK%vg3pC|n>8+yACA7uM4!#4@F2NtBhg>3BL7#>Q9_ph|e=i&Pc@pYhp0r>IT^J~$U2myYqfFGbugg-tEpSmvQE{-` z0TlW#;vJ#LHrVB104n{Z_2LDCqmwB-FnOWDGeZ3qrPM|}$=4^g%2ezucO?q_Tx5KR zFp3JQ{h-vltZf#xDc%rQ;3Aydx8Iq40+eo>;xEsVYSeBixwGnr7%r6xtGvl^vub~^ zMYO}TgH$xilhtX=Qe?D?|8**3#`lEmYyf;_;{TPXM{4MQ%LBV}bUr#vIogF_90U0C zl9+#ukRy9Kfu?DX(*9f{d^f5Xc5=684eBTSjtG4BaudK;7OXZPKa~t7C~n9teu1!v zTi{+N05l*f6I4gfWsXn{n)FgIVP!aZ-Ov1!L8>l}g=zd{nUN^{f5)o+J1F}9mGq+Z zzhhNHnlGw&BN%^i+&xkko#BX)6B5AYe{q@iQh|{SS_L6%br3abC9?L`{;ogYS=IlR zkTT#*g39|uJ>rgfptPsQ5-H5gp>RG(;(qy-MyCD(=d5;6rpE2H$qL^P7Hrx^qjuq{ z*u!ZUaCQ8YscGQj4slX8e5LOReMH7bx7)>VKK!QF=(`mnGHJ2%@eC5cN3yGo$#N|W zL+EUTCP24K%3!(&KovL?;SgZhMPvB0mxL;CAR-_@zst&izVj=1MDLl7AnjTVa_bi* zYb|D8(zO?+4ATsuq2pd5n&F=X#x|v3Mwf>gE~l}Gn%kioY0vS98r~ZO%I=fFmh9(d zw6q-0wFn3p&FqyclF=*2Yl~--xd?L17|k~I?UZY}Aivr5rMaQnCdEatrrSn7j&fiq zP-vihO~6b7hMje#J_0L02qQ#%JcsxYlYoQJk9+CE#mQ<|R`0+Z+$2!Z6opv4$ z*V0tH%}Ys;%{(P`cblWDN(AHx79M?{Ba`<};!RbjWcO305sc9D?jKqwaq=-VYx#UQ zD$iS|>3BReHo|}H>DCI9`lPH6eLdD>G806Z&3^ncin1u`?=RL@7mdWDz~GSSK@que z)xzMRFq0>UqQTK5F8m!tyuCmW#*C@n+L&Y1Fk+GN#5DjmTUWH&gv(Wxs0C7Y#&OTBe``$w0bU`bf0#9QH=ok1{U)6v zFYXUU?m=w)tOZp&1NuNoIL^W_x|1c=#_PHfIZt^ktEWSpn6=J{DoXtfgRMVli?u^M$ zOps@w;2N3lOw853IHy5>6nY?faq8K}Ph#5c!P`Yb6-6nk8s8T)YbNR96u9c4g6sNm zP0f8JG3kQ|LE}+rx>DbdlvX!>S+dU4;kX;LP<-hzEs>`3#zrg1r&Hf#>r=$qDEL*-AVp4$oxyR{r$=VR% zsBgd+IQ<(1(Qzp zJjP!^0p}iZ&W=LRtfs}I<>5uj8elNvfD4=%+F1xA@H<`%v-dmxBdVNeh0j8sRiO-+ zf>qgy8wS%iA_#VJN-1~??rNy?JGTFNx%jJst=g=ERPCms%niKM{6d6fZ_J$Obxe{) zTx-6oHT`hC9Ij&OrZb!OqXkm5(&B{JYDV6srQhrgRH$LbovmvhpGY?=h=~*ecchKi zg*lf*ell#4^O0I!*hI6h~k>i z(ifzV+2%&>TAlPN(gjDGGjmtmA3Ku>N;CPVZTpANVX| zMR3}~EG+LsvW`{Y+`&8f5Jcd9T(%(hl;E~|AeUl4MV&zSv6w(EpEnN%BNvk1lW#wb zz<0D*g1|nj$!(>-c~XJ)GHyvY=0OOJ+RgxG^9)X8zj?AD?r zeqvfw|U5!2n3o3q)7zWuOk}a**4nz)v$)e3AB^-8x3aN1K24| zn(`k*A*TbdW_rM2PcY|&_TXbD@3Ha_W%0e%AYyZHPL$`}>&cShL1lcIG^a|XUW+#& z1u}Bcqfufc6j}q(*T^ZVkSUbmkvYQ}IWnr_7ZbLVO_$$)D*pM5t8+;qli{GCbdR)M>CFVo{t{%SI7D}%F(RdGvuqTFhL7b(#r zn@o4H>uw%$%L|)zkyddpurrdv#~T3XRqk>|>C!lhI^W=ih;4WK3L8mFmU=KuRCdC;w>e;+_>&mv{`!EpX^NRth_XpMFgNi~D)oy;ghWHw%h_Y8 zG&IifO!Er4K*@nFGZ;1qu>b43mBT%cdRm?D4~noHpX0Ht&h}c9zl)03SRd}EsWcg5 zmRfmuAWbOO^YYX*1OTjo;{2xwPjJk~~t~!=KBFrk8 zEllut9T^naT4KF0L6>=+#*UM7d=`T$1sn^MnR+j%#r*X<(+n<&{y2<5!&On$zUae4IPWZwUOP(T~4LZTd8xcs?T2yO@E6r zYO&>lKY}%-I>R295!IeSE)SEpiy<)~zr4)CgPj)$HD=OJTXfouah346V#y{M)1Igp z&s8K0%Y0*X~&OtkECE&Ny$ehf( zqsKESd=9zFHc-D|a<}Ub`Lpf@`7ns+$T5 zE?&})%6n4Hg(GwwR5e<rVSj8&u7hbFgHLQD5ubnU``}TJb;m5p}t2Wb)NH~7h3EV;vAM0!UhL*QTe2)j$fa#+E(T;!#lNo`f4t~Y`J0fPZLIXd(^ zdo%ekm90kVuHqN>3BD#1 z;phcQwpOB@tjQW2u&D^S>2&(48mtg6KXRMVftR9O{aHBdwq{O0a~{<{b1{k3$nfgB zGZ`Ur4D9~t%88!a99#TUBkrYZe1fI${RpkS2<;L|OiOnj zc+wa#5{H|j<@ER`uu^7myyr@H*b(5gfR3o8>7%0Jinyx?0Hx@uQn=7=YjtCZ?b+F& z1sonHxdAFj_GsdYT|Nmmy&<-*)Eo_5D++hNN z0Q*hKSry%HfvSor*`sHbkPQ{4k;@YZV-hB^&FVrGg(McEO{3kjjf>pkt2j`w`iq)J z`j7g2o7YeqL`V+1Yz~%CjOlS!7JJ-hgHG8$g)ol@To>xY;{`RsH1-*6lY`W^LG zYAj@`V|YGit7e4zwT|&@{J>vowvO!{0bHr}K>;~W zi{1o!Ubu!QQq;Jg2?tupMX3*I@Oqlpp}H}i zS_zUIjr{JXqAA zrYHS*4BF*peD`xFW7m%jff-{!l-IJV`o_r|^f~dh+gQEF9L`^qe>?GnS5^~gPVqJh zNbW;(dK|gd&Uc$pznE;x-dCS#Ky6G&iD*^lil_a%3s+ESIIh!AFyT?)B*2}_RoIQ} z8$OJ%WIsfylf4t&_V}l)lwHzi|BYtoOV)(l{pj+t#Eh1$PylvUDc(*U_zDb#j*+jV z&47$x7V!o0rQ%Vwd!4MQXJYeqN!8K9b#U_x2?Wm5?661i2WYYk?^~5g{ShTy zf7B=FKPwj(u^*cA*UEMLwd4A)mFvHgtLXlxl}kZPluXRZ$im*i#nsA0)WP1>%+vMX zYgvrSy8VI>GJjGQ+OpLGs*F|JH|U`@CBgU>Fr-!y5!i!*GSoO+k9{8J<%A2O?w^Lj zdn9TRC8$z-kAZO_lRQLZDg~F;7Unb2)7jb=ae0P4q;YS@=}dJ7!VtKS)fv%dX=gm` z1yk~NIFRQazEX}nb6aD(O)-E%@Vp0P+jP8s{pqqLI86inen3G!`uF07R zWZi_0bMGRnxGhVvZAy&1fr1240Qmia{+J`i3sOQ~FY^0~fvKI#3(j!fb&--bM>&c^qgh65rlcx2?> z2_Rm7!upA&2pB~P?1SP1reB7CLot}JtIkg}Dt*^Cq8ss{H|dDP@kw&Q*yu-{H2i0x z%y0Kg%z%P`kc0ofCd&W#7xy(${`a)dJkwNL#`wfP96Mmyp`wC@tW^KeYb7_Y<=Y62 z1r1&zB*ccpI1tjtQ?u1(GDy)B$Cue{SU1!tUubtS(EOubLUqYn&#kIeLy-Mr!~Frt zvSW?$V`*)>?TMwANnbXl;cC?=-7QjGkuPf01v1(wHA;AfGD zf{ZZzyz`ipyN17?OdyguNSjPqEg2;vk|FdCcbl}-P?UQ50C}4)&(9^42b zod#H(c<4QsM1O}bjf(aXjUT_SSjawX+KnTe2bPR{&KSL^;JbkF_WuQLd=20Nmow~MhE z>%0WrLAxeonGban>s?smVA#1BlRE=rXC|#eI#N|_=cYh_4mQbXO~qT56TQ?gS(d?a z{VkBnYyr^Gh@!l=WMO?fZaa2#K+37eSggwJv^ur20nYCoL2$G*SHbj}tIS|3p5kmi z9^h5Uo4F=?vLr3(r~gb)I4<7kzQ{YlP%yw5nh-JTvK^|aT zTmE}sgzQOMHb-R*QcXH`&k037O{uQvnmDKE))J@{Z#s?hudqGo7N_Jnxvl845%^UU z;nzAvu*zqwcD3^nQkw3dWwrZ#Slq%Q4H|(!dyH*yy`d+jnmrl=%^SaWp&^(_xO1;s zF76Ue~Ru`*!n z$P`_vz2wjq^mH?WunR!@Bo>*V9Em32?%XM*I(@>XcJ?!G{cMS6~)ydEud^@&xjgk zX?P#$mp@bWnjbLp^_sOQw!`Cn2^W6}_C!t=ovz8pEmTev!hilg zL;}$d2`4OI&xm%9VLMz|HaJ)KVIU&)JZtw1wZ1J`n*$Q4F4=$WoO9%zg3=Xhy(K}b z;B_L0gd#N9U8wqDFJ^>$LqNDV^a%EAz7!QGUM(xuC7tcDlph*dHgX*t<(x^?HUqUcGuEvhxW~ z$|;2MY;#%Rorg0(6RO7hlgd3JGHtb!$u?l(0QU|BtfSQ*fhmfLBCF zg#;S>@O(6O7LL>^aBK?O_Tbgw+clx}mLw_bDjiL&>T|8^GYSgmIi@e2I6I^`G@uYN z$rw!`f{CpTVxbUGyAH#v4q*oFuLuoJ9a-iz!_!p+zI*Olgh04A{65!RSJcH@GQZ;6 z%Ttmq5|Y6lh-^93jIs|fRpJ_F_?m6z$jf_!;9N#Po7Rr~G_}jiMAvV{zLGy`w~O45 zoM#u~O^Ni&xp%|CW>bM`rR+_BHtdq3QVdaoL* z>RWTonm9A=YztW`FnQLvZNW0L(@13{hWz$s3BC=25bVljNPJYjMivw8J+mJOx+su? zS0$|vt%hI~BpE?PmLX&8J3E8$3_@R^C!L^C+_Z6q*xtb9B9+|~a|R(3`H9V57{uDs z4y?o~yN8DJa2AwZHn=2R1I5jEqd$iF4j3?t^(@DLCO@0^eBArGm0GKNmE7bv#EmQ5 zi?}Uvg7kHSYup0>E*X@{;hmKGq6wT2t|$@nqjsR`0-~%@P z^$q^MkFi9B?b+XveG&-&(;olpzXXGZHYRF@)-ERhd#86v*!~V;MjGjz=X>4fq*N1) z(okedjog5>qeM)^BEBo z$N1DbZ0nZqiCx=bp{|$=D3C&gw&Jk1bBspzM4fnd;`ay9ze0PQzDGj6hiW=x_89P!9=?_7I#L}!bYtS%t~Nqo zw8f2U?j7c4A5*ae4x>)FBt`p7r=eT${(#tQUNnR$fum{@{X4jm{%p(ce=R#X)9>br zZ)jKd9ew=Yp8-h!t7TU(bapmzwEa&R+^W)cxTZw-IgdAwY9XrS22yv@cGE7*pU zktwk7-|yKJOm`$;j3*0rlcc)&j2cW&NUN3K*&b}T$JyV0t19Z#sjA738>K5kygm6l zGo{gBDne-c^V(_b#&064Q}#UO6`JS33OFjP*p!zh$=a3Fp+rK2nOBE5g1`gKJRMBg z^7MWqQ*J`n`Lm|AwP(s4po}>iW<2S19aq*YE<=xKAFQW%-c2qT3P=^k$G!SnS ziL!JkMoy@KPVba^Q)syIc?ViRcpi7oaGGrFEA z&rGbbtELhc(yO8*HtD8RPc;@n@8~{dp0JETvVJi48XtXn=oqtw7^opb{RCkfvJO^O zcA|QB?OF1jjRIW+3KpJ@)$_zoM z?@pQY`POrjlA5J*vHsZ8UXF7oHiTU`GZ^X5AM6w$irjCkVX6UxH)PbduHavC(pdfR z!LV(V1^!~tX7;I!o^6Se8Ut@Aw#3)N4Z+eH3HGpNWZwRF!Mk6CzxZY7ejH1WLT$lh zv<4MeGOECZUV)DU5&xcM%f=vCQbqrXGz?&{)xR49qJb;1U28iflDm7Tu|%pdPXyPC zuppOeQH=3-hh@MyP_i8on4K{_gtE!qsj~m*i$TR2MA}9j(L6Ws2=se<{XOgug#Tf( z6qa?b{=7S^b-kf2?WnBji3PapKd-9RZE9Q9AC&hxaX0@7=z7%%uAt+0X;5o>&fRK>B4f;9>RW1Ys5}kF|6f=VZ$vTPMbr#EEX~)$VA2x}T-g=6Ugz z%eW_WnoT97%%m8Aw(M$EjIi}Z87$ZC4#RVBd0H3GglcN2N8}f|Ya8T8z0LD+%jZYC zp`W!tA~J!@EW=63cZ5ii(Zc!v)E4HbZY!gzqkYn65oTfi zf({2kH@A_7GC;DS1FuOS#DRw<506p1L|LwL&RR4Ez|Du#7MY`txIeTS|)UA1TRetw>+Q(}#HB6W{K?f@Dhf9KZT)a{M9 zqoZCZt2oTXb%N+A zZ_mp9Oh8dMD?D|v5s^;UYERCGFVe}xfKunEDpk$&Q($3dRc2TR`Meky$WbxX z%=cNMR=26Kt~EE6Rp#By1HPDh>wL^j)7c@~ev1 zUqDkR3Y<+0i#+QKl|xgkO>%>v;0CqOLW1zgdWtRRH5V&|UN>1pY8$Rcr&7sOZ6Ht*r8j@w?Udq^oLs-mP&NlNAKMNI)CRmvhUzqS!#2tJ@7)!8M@VXZzj4|{E z358ci5OJ5ZmfWK)ObIHjj&jzik8cVwTXxBvk@E}pNc|MBEWI5kXYEj8(L6Midgnjbja95^5WZw%ydAZC zW*-c^;ogvae&BwG*yT6}GVW^N6A97z*bq< zEnF)JBs82{^mID@2LgK=jR}&OL+pSUkYKvg5S6u&lOg2xD&g(mNWx|Dwu2Sqw~l?z z@mQvasKznnN6*&3Rl)lR(ldu>w+Bv~Q$*y(^dgqh>{QL4Ba8YwG?eSWW7u4q@|Qq2 z+yL+XR$2YbKtJ5D+qjau(ES^yx*^xN76m<0`rvR{8IW{nrt@cf)y1< z0^jj56r1>`Y2Ka5iwypajKfe#x^tH9Ws!4UQFp>&CpQMV#mnfE28M2G;}seBYk3KG zZc$^x(MZPxbQ^2e_(HcZ`6N5aF#do&$*$cSRL%tsv?}c-|C#Jd_KDC(bgVEdN(}YP z>;vCBimL?T8>tGmxFza8g5E(1(rGxcxKR9{{0%GwiIh4chm$eeFir;7?4H=9`^V|{ zaBNSo-`w5QL&u;0LClt=)&>lHPsHN?^h@dgCT3~=>xpP*Z{q0e@lDB^T9~;w8amrK z{%=@b;sx!kviR`Db!=j~C8H;a1;t3qO#5dv6t+-Y2ox+l6ioOBC^5nqDKH?#^tltM=pE zyYAx+4&JwYlDGf}GMr~1O4mYAng`I45U!ubJAXHY|M>@pJCK^t9calA4Y1;MuZgqZ zkUZo@)VmJCD`@M7Y!}WA;*hc^g5-Dsl5c$5=-h#(h+BL8+I;R=h#+l3BkPAgVX?i* zPdWVW=&mR3XLyKmrdt;4Vg&y42IyzAt9EUtTV0GbHbGK4PT1mNyh(YDP<> z%DVFfno!I6N{LY`(0ee92dGH(AwDwFaO1F1v5z|UT#T7FP*!rUZLw9dZ|m_TH|Qx2 z!Arx!M-g{?coP`wC5p{(_MC{QKdkQk?B%UW;0N5bYPb^c1j=*w{N2ap?xDKvD%oFW zzQ@lv)J5zm+t2ffAAE9okBTKcc`lfIPKZ?wJ~Kl8s9k-A_N9)S;eF=77kCna>Ycs0 zzWr1p_=;!JAM>wuc`t+fIt17Ox4C_3a<)ByUKuX}+@I>?AN@fBXU|Dt-{j;%#6gXT zNOFU-Ybm)kc3KKR5D1CN7qR?)HoUPAbJ zs{DC-Y{tNc-y|+LCG);YgmiKFNHPB`s^#`IjByxZ-lQ!8B*nEdWh8vg$@j907MXSYT4hGg z)XNs!*O*hIr5P#-vW?~~yhrXQE7tD8u}KmsNRx{dT4gvnM`JrLx8+lzZx%mkGS7;e z6w1UJ9&m%b>uFEjJr<;0BEnK%cRU`!xcec!L}h2@nGthNg3>J7Yyb zKRUASS|U0y*Y+s94_2H~CPRx!Oo$nIi;hnle*5=DLPnU46k zrlLZ7%S~=^Bg)M7rON|-kwsbCQkAcStkzb}W+;%0O_e35^asZxEq$JzYJC@C`%GqF zRTrkElIo;W>E79G$L;Dj*Rr6u;(-1DrI%Y>I8FOTQ*};lSv66WO2fZ+=tP4AgQF!9 zG3c)L;ja9!pK>>58k-X)A! zisc4AcCpO$eIhk-8v0Hq(^ep`2Yb!D^IaD$LbE!De-o@~(p1COF6a_L#&%y$A`rxFoI~X(nt}&PH(<`mWnpNO zLfnAmkOEok)(8fkQIZ_c!(KL>jqfmC6cZ&f7K))~2vHxKlJIxf-YQ%*V5EVpiETI& zdHBH&IuaMPo^#}$WcsV_>8~nzU;Ey!XnM|oWQ%l%tTYG^-AyY(0X7K`Dh1nV4~E;`N$OF>h5C?9sfsYyKwX zDyH~rU>41)^5oRu%+NC6FeV0B&y}>@RgG59q{j4!e?7mXZ?fkUmTPhqIknCoo@gr! zPrGsHvFUx=Y&{JlLDCMs7N(V&VOC_ifVuEm<}m``$!skQd;Dj-G7eQ$nV71`tC*v# zGAaipR(z@A-_aj0gu2L2jCJ*`ZmC1tX1OjIwVIB>-T_7Q(st^}R>iSgbaf0W|5Tjr zDfs3Xb(O$3HG9-^ zrYW>ZtRQt3t8e2q14Kcobu<|bt|sCZ`H*%-`3&uH6B(+UMzyIHnl0l~f}AGVkFBuQ z^v=lSxTfiTaEw5rd9y6*GFLO3 z30!4)AuXq0R*pi|d|ODV?jb%L%A^|9)x629<@n1^?~hK|npAwGi%epyEE~os5h=J$ zk!rXn{Ry|TtI8~-HXCAAaL-WuNAb;Zf$93?-HTjGH6kni^1Cc8-vNyi6!HQAIYL$z zIYMO-q;Hpe><_c25II6-IL>Nu8>fbrT2`hx#XvbCtT`{YvQ{UkK6YMP@#^koCaf5; zAX;0ay8cyM0!(96c*ryyXZ9QbPe=7azLQ0B*ffhdU(O7I0+k_$)4AD-=W6gz&V);= zyg3j=U4z*W=LER%6p4s{{rD-T$(i9qf{vAZ=@X?OdXY{4-T{gW{K%#zrmn*7)%=N5 z7zo+MF*LVQ=U+0qYh@0ajEPX}q1YZTaEKhK5SZldLR1&&{*6{@SXBp7c&7#M5V~UO zxX$pp=Q7nGN{G5I=ICop7&gx>mEB&T(NaE3Rn-FeGr-0!T;B&&RS88SYdw29;&YC8L!6 zhGg}JF+wyb>?uD5m~00$*yEJud8K6OqX8urL`?z5yPiQ;C2umfdF^Jq=}X4OQ^PP_ zc?3J08*7^UhZn$q+w%*khxl`ikEN1LOqAV1P8QZ&vh~kWB_VSLCd8B(PIX6ZMev^S z1k9Wv+|&7C7FA&_*bBec;m-CJ8}VMH}D30TZ3-?Q%L7)_oAvT+L^ow$5=&eV zeE}x1DT{%oy$k6oiV9T&5dI#w`!0K^;cpt8r)KmOy4IAqIvF;Y{GcdE#AH8iM2mgp zNV)m!_0UGccgbx{bw@|4eP#wnaADysx*={yaIESb_2!>h!V_{+lQ-#jRJ5$|{AIB1 z&rwP_KNRfHRjUS;r2Js%m_kq-ZOa{yYL*ih-t|5wpbi4p1yCI7JBvU)45eS8>c{L_ zKFn`iY5coZF2|^{h3LQV3xjB&J~H(b70~y%iuD-G>sogI;5|Vl9w9~9U<7K+H}g3> zI2fgaan>X#--zwa1vC?c?EbBL=dVz+E@QDKbp+c;jh++g^i!f+DN#4Thj%(ksfy42 zfexZiFp?1$xOCZlZuAHjx}NQ<2Gwp^h?pZ|trJUR)vc}~r5_7%p)*v=PFAgi=$7z% zoPC4%2;m3LhC%p{F1<6kc%9T*^yepm;@m^K;NDm8@)z~iU!>B{k)D-c`Q$c`QN0eY z?KQBq>`8&n{IM#YIfWJ4=*7J!%bfz1nsU#xkSnZ#_z3DjQTbfU_nYgrc9$Ph{qB~R zSAu&LS7@0^E=efUS@+K_=751wz?_4!3E~7*%GsP|y?LY2jlbCo~ur?*M>2}rl zK~PaBRL8(;rQ0Ee4NI%uWYjMjrh7sGT}PpXMCelRe^MTM^aay3;)xg2uH+kBMrFYeD2vW>O^eUCX5bEa(2ol=K9 zlj=|FHLN(%ro8KWjQ3EstiP@I&i@pu#$_@WuZ+=Yku%=@vL|VAimGOeMlU>TZ%T>c zP87w!uBnd>=?yb5W(c4gYkkG{;L;R;2CC_)lDTbVyd9oPGMgq$Z+DkpH*v6%Px;j3B|F?y1 z%*IqohDV{?N}w)RyzSvB~wHhA1ZtnLvTHoVTlM+I9khL=C+lzZ(cCnLG zK$e`28x=;Q1)#ysMm?*d;<0vR?IO2edmOejd*KgZix|Soe7dW#i`ei8E1DASi>AS* zN7*YQ=RCfvPaK2pM(`z`{37fvUlU+l$=Z7*fT?dwB6j2*nm86Mp}5OjpK)=ny|>E~ zFmD5twS;M*b~~Hm;+)emOt~+n0B?PI?LWU*kD>?an#A5dZ;TQm?y(b>3w=I`OJmjf zF<&8zdm^M~LPFe)J;oucK_9O!D|*a40>?=`?7H@TRt~%w+NO7q8;2)CNyzEJUhA^Z zlrm&b$xg|k=BdyaRSg{0)VRu#J?-@u69y#@&=pT7)1ggCv%Gv2F$lDF(rO zetPDmIBx4mi=w9tSk11=Z%_i-hIg?9WG~U4Wq;=%);A)>)Ra=(Up=hTIT7MR&BzrG z`+7?9Cp3noXEvkw3xQ|!M7d|$Sl!=xyJn(YjHFgGh@xWlV_`uO+IKt`hq$Eoy1_@QR!bzAu?M(2yUk3W3Roui}N)8>z1>rP|$3LZ!1XhmVou zSLpl+GKOD;uXL64ZXr}`bTz3dYEC7K8&u8xI=A`L@(jzC8q0J1mG(Ssux|ck{0v?^ zC+mF^==vY7qgxQeLBt5J&s;xPed+gwXbgU_{$XE+OZthE4$3_BW0Ean-nlgO_v3{> zo+(>C&P0Q&psmk8*HM}YYG`AZ0YQ&vP|eOAIn^_N{p9uz1AB@Cx4uP_zX)wzlj!z* zKZDqXTDrn)z-m`}K|v;++x$c+qG|U8z9@a22Yi1L2&`SfJ)T_zGBK|*S~YYrxAJ9F zO@0_;P;@I_pDuvrj=)Ms@)%wO?F4-kAW0d-dlDju{K5@nL=PQUwEwnDxq56{G;a^# zq{F0DJ$+b{uD9!N$vb}O+P7MAG<&f{n}O$!<6?wa%Lwzg0HAchg?MovN1O_f82nLq z5y^KwIg=;C_Foi+uPfRhVuza*g3b+yauFPOLFtc~)bG-9+x$@DRws>Yk8g8$OM|xE z9KJp_dQ&FW+k3O#2#;@*HojPU-S$g>AbO>)?)cX?r1nMx2w<4W_0b+D$8)AtQ}Fm| zS-7#GPzVG48|yX?XTYY#swg@QSK<xu%QAO^=3e}J6G*zIUjU6GHo2kQ= ztPpf+Mvvo`)^=*z>5D!V)x)<+A&Z=50m`&$p1TH=CxHW7yek4X|Ii3J8XFuqxAwm8 z()h+}7J;(Ttd{;SJ@zIv8Cj0P8ep1%^ce(k1MsIC%GdjMJv{XnfpLAx+$U#1*=-;q zVjl>ye2-icvoU3Op6v23!dA7euuo-TXJi)4(yEQTnm7K#@)Z zse~`aE1C%ud83i#wiMltwyYZLcL_8Xp$yJ4|L+XIb+4+^YjA!#; zInL6NstMSr6^=5@hT0j0p^Q%$i%pm2X6kj#P`O8nZ7j^Wk0F>$4WMel5`E zBk5J9f*UMZQQ#n1ooTY+9l39kk+RG9qZ#8_;s2D9LepVwy-*z8GX%b znbSYj-SqAGN-^7F8%!q|?p9b{$9X{tb0M)M<|(`Q(DVv`5YCXMP6phQp+?yBhuuh( z3trHZCh6HQ6WF$`%%i;HAGcdmAGf|+XMPFIt=R!;TebaJK!o|RH`LOkCrp_q;;!mf z*>wYk-9lJrM}Y4^08=r*{Z@#`1Q1}{XP68~#qvL81u<1diY-Y{5G%@0oq)9v(3rd? zW5to%d2$>NK|1WOU`0}!|J9ayyX#BPnKI()^i{}{4 zEA>j6xMtk+l6gW-6EN(UdHw*O_ZhpcwZQY1*iX6KMDXaM$Bo6L>7zTGgRUIhfsfPd zCU74r<-A9KjI&*+lRb_fD8Lq2gFUfPE`^T*k%Joff1%v?PTZ$udVI1XN|It_$A z0F1q$8yf>xHqJtuavGzGkt&hzQ5^;jah-^mX~k4K1puO~Sbu1h;dOTSvy*hRF6|Rq zivpCqAg%J@v5RDoj<7ZN5ozZt7VDm`XUne}m`bc+SHKUyZq1uzb!oo!-e8j}e`1Kr z5~#h*2a_ub*eH;{C|}Tj-X=h<%D8`J?ZZDQ<7x1YqRIxqqyr|8>vX3bFzgwPAZAf! z&8Zj+un+!4Fh-{WptODpS^9&(G}^HDqgk4ES_gPIHw1}6G8fAB0|Y;5=Dp1#?rO-S z#x~euFumG@ORUpNfK*XWXHZ_NDid8A7}*0ozJFYPbI?i*cMH>J2iKtr7lM67%9*c# zap_nd%!z9N+Kk!k(6ZB%+E6n|i(xrc+D*R|Pfl#f|8UBS zo9q0Sm{PM5rko*~<}>VZa=T+ zA=(HA{T=9cri(2-2ma_FKrGDyDy&@uyFlJ{j4zzdPeRsRbmOjZ&GIH*4uk44;>9U- z^Kgl#Q+IP_1_fHUv!?MX1dkYSJwdE2m(g?@($v$%NT-%Kj5V=hlJvu6Q^`>X4A*U( zNna%--8tj_SZdf#OYgCJP1&rUJ_F_rBi`Cxz&#WHR{h`X62gQE7=?J*m*=$2CRfL=@>BQRfn_BA)Yxb+%*M&6%nI7gE z@04@vI(HuFlpB#+BC1fzxc&P>0x2XlHFjv9_Ii$N^f2|0_N-G*a}EWWIycId|AV#N z=UpoR+}c4$!Pkv1ZPG=boWOCHeAH6`1~bLOx&;%KMV_1Gi)_x3>aFIBS#^z4qVWst z5OMW$g3I~bzhGzuTHRUD)}ikXNoVXQwz|zY>LAMGyR@Jux z{r;^3>AC?uxAd`vPxiDQ*ik2-&Fiw!zEOsBYByURoU8=?PW72J2PEZvIJWa9Pk2=f zuGKvn9>^7Qye2=Ds2geXHC6**5dyC5`C*0w-}3=Yk+k(yKf4;9U^QcK$r2IPJlBi~ z<2bl1sXh9xHmqG7JNMa-KHmo{UC_ZB2m-Ufw{4kjE=@!1II^BytH6NMI<2ctT-wYK zgp|8Rm#%?{6g#motRZm$`nMiGj?sR1`IZ4cQpTR-hMwe-?80{T={2-a?A-vmd^hj4 zZ<7ksoR-pmqrYrB&FcA1a(ja2mO6&CsstN;gr_4C=%X1pT%rHGW&!U~hjy=}+W8n~ zzu8Ij--1WHhk7>HZifNoW;tT9oO5*_g_)h`y4n^j*K0hqUr&4^WFMg`pE+A^UA%I7 zxLh}VNO^hQxcttM!5?n`UEQ1|JNuiY)SBHJmyErZoc*5de_g-MCHQoBjEA=aa0)Y) z93SfI*gWEfwUh;;52SW?F%6SK&?<~efknw(zH ziAi{l5ccKOycMi{elxP4*YB6e>-)T?!V}B`DBgpQtmq48_k^n6%Re64?cls(u>X6y znE49mJnaSI@hnT@4CJu});7~l{?pOOKjoCY+oPQd8?jhjsXW}P&?5M|2(j0kNoY3@ zvAeluFg^!@HXAzsxduf&D?S&nMp?P@*7nsI#P0aVFz7S@L!{ZLMP25#VG>xE7HaE$ z?@H6*PMv+5*EMqT#J3?dj!a+HD_xzQrzUsrk#_Y=;q69s-i9EQc~lKMVt2NG204PXY9>HDA6p);Y0paoS6B_dFASF3vI?8dYKpzNY88NsGSS z0^a3Og3`{*GK2|CH93Ae!N9@*TE6tixu-e|WL-~i|1Q)ItrT>n;B7_CWncm6QWSCR zyW?Gl)!EPWC%UQ)je~PX*E#}=#;+^Oz4>Lv)3pN4z{E}J+Bfm=^U2j+EVxd|zd)%$ z^bQ@|+p!h^)eM`>^6}(Y`er;F<@WVt ziJynITW9VeX{f{4O38|TB9*!b6@aBK6_+9lOu3G-;b|rGb67eW%unL+eXkq&{%uU$ z5{QHKcPfZ!&6{$;a#zsir_9osL1qh5>>`FxP77A5)rd%t8X~d{G-*?beQ66E{Xe;2 zn&w0MB3G1+zcv1yO%U#aR>2fartVri;Cc&MyDm0l-sNJuPIM6Z7B-whJSp|`(;8`g zVp=Hb=9gIi)C`5SW6Uh9fG{?6dL=c0^X7RV)g_#_91rZ1x!Hc%TKjXmYwm55n*kK> z4^UO>M9>LCaB=Kz@7W&|f1=kLc2PLt)`2S1_^~02)Mrn7n(S zNd2y*xP2#$AnFbac@xNAFKsx>z!k)QCBv`J*N{3@oQ-9iiVK)>Xb&MFj!MjmwwyhY z=V;?G{g^=3)R`gdiFtQ!Z(2g(5qWnImWLE^!Yv-}@}4K$JXA_S8#QQm^KrBjY_qEc z3l+q$W@r+kz=6;}NE%BfJ3iz|&BEsxhhS`#TDWYH1|?6b}4DpexJB-3^G? z@d)gp)bcBYsC$B^Ui5=y3RIi|8Nv1A=YNR5%opP;5`X>pQ6ly~=}#&CC#i$Fp|g>> zv7OofYd_PK#uY;2OOkEq(3NG&WVaNkrXx-5VDOQK3h|fMMyEq295H6*X}Ag=E8W>P z-;VSXrfhE7K?F*qY-y5U6fFegv4WS}(@#c^#Jk$l7 zz^d!;I^AR!tf)jtX~RV|1H=7}geFn3FG|G88WgV?57s*#vaNHU(r_{JE}8;hUeZHHfJa-@pL~X6CWLWJ z$9o}hX&MhVFjjC?U)_VcRK&=rW>_mYcJ33XT?!L%yt_(Rp$%wMhFaH=0R+^QXTb$} zRr0T#c;!3nDP5im^UH3;W|?lhN1!EV_>O%gru8Hegj~>bWvWqiF=)%%xj{K5Z~Rj& z1v}nC{V$Q&11U5Zri$Y#kxSZh`DWrC)eiw$$^ZO5IUFI6?U#B|%k zE|#oVTO%W&pkCZAM3yxkt$SF%<(+lPsAebaCAd)?H!%N%W(WlmAzrr;?quwS}#jh@rKKt+C<% z5g~=B=vt$F3&f{CU0dfHXwgf+I|9dDr8+ef<3E47YHQFA%_1Vb7r6b?~JT7xNyu24g<4x0n}F}J<%VmNYTyoqzY%sOps{>fhDIL*9Vx%pmy zdLECvJpT(VD+(tRTWfi%9S1;K_v0A6h?K`exh?~K86qbv%@;(LE z^F>oY)hAMBhO!YylFipYnazQ%$(EnHTqIhpT!kCPMD5s7Xf4@xK2Agh`|~IwMUNo~ z>z3Md@PYX?m;}>x%f-@7K*(sr#S(J=iUbV*jAFa_NijhH_Xs$SWZsF*Bpc}XS(Yx3 z4Nk&Ct(2Oy?akOcQ%^fT{e+WR=OkXAG@FRWY2IaBJghq}1)mi*=oCxGeSDe>`j4sz z*j|f*lRDtkmpU*Ojs#Xe5zc=W+b- zc72*gXTmQ_gDp?wjPq~^F6tUwJm-d(h$|!D=qlLRMv*M3n~yoIZiFW#Sy? z3P24{<4~KN$#!B6Zxj|v@efyAON8*1?P8D~9=rW=SQ!VRE^M~COFJ}2-h@{A0N!f! zkn$D5OsxN~;8*pUU7SOxYhfQ??_jd}RF3rESCh1U(AdyE`gQ#P4umf$oTqq>>;YNaWzSAD03N4u<&t zNRvqGT9bT=KUlD{*uCCuTnN4|1)o%`C~-q7E{b$1 z39D=fRoQyi4+yI(7+BQZjXbF_0UL+Pt(^-o{^4v*pjs@2E`&lC8CkYgbj#*$p&V8W zbDFlpLsPH-bxkqR9kA@G#{kScU;~`D5LDfzAuky{Y)R~MT9(>Jk;&K3>YQiTZB6Nj z7kjzL@WgoX53;Js?UF`~>+I|DvwP_!7J-bP*VpNZFBEn2@E-KHR(gHG!+XwlRF(U% z|CKGeg5W9dRj7H<{7Z47YrE^UB05qZvL%7&pnFf$dlttioaCM>M=U`|BA?e+ zD$gWW2E@r3Mt+5pIE9OyKTa>E$}VKE51rn{^NEOZCfJ@=PcNvwVbSfA?FipK)qWRB z15)S?(^2oU%kDG0BKXatZxmFa6%$GpSv7rENs?^lgH6qPz9y`llzlTxyX73W24lPD z={ZQLrWD1pCd;4yQTEZbz9xzNEqkQC)6Kk=EKZbyE{c)w=$EXzfph z0+ed8MwHr`lr($2Ijl{|65?Xz_IvTC?T7n!>LzJt!6@R@M*DI0G4IocQy%^& zaJzL|i0o?M`a>gD1^r;gQ@9v(hp^5d9bhh=(Q z7eg~>rf_1R9D}IhcJGEFLN;pYLn+M(C!f}pG}tVm?JFhu6fuTYof(qpkTFexW-h$g zt=#C;pwe#C=I4`GMOGdAzm2S1%V#97!|%!3l(uceNg{F*oOQM~#inqg&CpVvvrYr- zNzo$^aCU>a>a6uOPzIAg2h3!tO&EPTM2PSxA1-3?*c;U(o_a?6B{`9QBLsWZu!`_J zLJ`Uju+y;0<5ujPn`IgskCti%io}P@2E1(-?dS{Ou_>u-$Rv8aeThguFTi6hrBbPy z9BM3kj-U{ZBcRI%kmm+5Oj+Kq94;|Gc8o+8pU#jt&J9l0fhAN$-VyTQz=ZzI1uUEXpWNB%!Un7vtY?ClM7EbnpH%s_YH43uzPvSje2A}wyF8%j;qAF( z%=uXU#0BV|P-E2bE1NEB88mWEJ6aDtgfb5f)}I-WCY1P)gSK3*8I+O*?=*sj5MM}* z(6z*GqJ&+v3ty^K3A>Q5w+{1NkeN)gCq;&JP6hll)$^N`)ROZQDTQg>4isqJwlbYp z1kkx;@Y`XkadX#cjlfhd+<<#4j! zO$@_Ntmen+8&nDJFA)E2MvQ%s;<45`v}_dz-{Hr{y{UxjU2uS|^|MqienB0PmxxvwTCa^|S|y-wS|WJq+W1H0+Hf7;Ai1 z3zjwXjaWB+8$juF$`^}^1PvQMGw;DAcMgCeXa-y%vMaRns5TrpLy;WcSjyQwXqGk( zG(bpwaF1V-&crVV`*~#j5!ZJWWOmt19_h%^;2XB*H8QdOC^q)`BR)_UO_g1-Yl`DCy{)p%W+~q#HR~K|Ce}3Vr0-}`8Db5FfDdV@EgEsg_s;0`yFmnXQg#2tF zN}u=j!&TbeIQoLkV;1q4hOmEG0^k8PyX^y=495r7P}=PevVd;tU1K#$W;v-@CKOp7 zdSQz9nF4Vk-u3=E=)Hjlw%p?y3w_S8%C_A2(unlr1+@EeO@FYev#hgj&+eLg7_mZ=>+* zN{MP8|4>n3YsRW}a z5GNAEj&3l)ItKNi(BH~4(;i|vJXNdT_Zyc2;SQ+`mM6|4Pw)L6*|e8Y_VLf{l>tJ{ z9+@eTlQi^E-q3Kqs5xG7Zr;T1V^o`4%2KuN2tG+U!AK(B)npKOHq81Q6DmpOabCA+_uv9Qu!ZK{vzyQQ%5=kcPHjsm{Brp>`u z?(0pY)Q)P(0GUhjHpd9C!xO}=eE*%CJAz{oT}O4_UEL?x>deSnQti5;cgN>}!#n>o z78f0ca23BN?Q5+1_`}PeqajiAx{ux3EKWdry1T0YM{#}ZzAC$B5P8`%o!8Y-O-N>$ z+O5BvLVJPIbv3hIvL|1sgcI<#x66WNZ8etW16PoW+$2fTR1d4B+P++#;p3~0aH+hw zAE#0$kZ?_5-kIE4a1ZpEaoitm6{mntM+n%I^t1lMShJ%nzeJGF!J*UaEonE`(Y*I|bI{8ixXL86A_ zfbr~mw|I!*2KSDv?NXajR!Lt{>_@p`1(aO~Q9U(2b~Vdj%mzI&LFZebVP9hGiY49^ zv|ZTs;%HLy26OGDqdfJ7gQbw_E1Yub`6_wsoug_x+p-=vqx5Z^9x8@_BkoUC?43hF zc8_1Vi=e06gTGaDuHzx$Cd893mrE?#TV#c!WOu=6+9g4go8-%}02h9w23W~0`|G7+#3@!M#XxXXl@X){xS}$71u;w)I0Jq;Z3H{!ZrBS_WI3_sVI_=d&L(sCvl zoc5Eh0W5e6VwBa#;`6bca7QrPPNz`h{RPn9Ku=xHH@G`-Ry>pYD}&SpK8ix%;HUEL z+eT@Uq-K`(&~nLMONUp2b$Y?bETaEEiTN^BlC0RsB}3sMBv8PMQQbSopdP~RCDWdM zz7MGz97)sTJPjxxNsOL623IyoajON^kVd+1SDNEr<=79ocqsf3RM908IfDifZ;4K$ z`|VM`Pz<{Q`Hy2Q$)kcc$U-QiZyE4nxLSM60Jik){REz7x7ndw>5G98o zHe139QvbPj$6}b|jDRbNs3WFvS00JTU^hSc-5cecP%NFBQH##^{znLaOgc1~$2S?1 z^Nqs)dj$Sp8jqCi9Gy*!rA<7aoB;1}VxV z2WTj<(18KGVBk%`g;Em}2XK(PBzg(w=w_R2!}t$WDb5jG35Lq|S; z)V6}X(#W6aL2xpRtg?sqn4X0PSTBR=n$%F*Zg3N%3mnGjp-x!^T&{g)!VISPd?}bg zHy#isgId25fysuE8A?QC7hDlc3$mIPd;+!Wp}gw!nu;Lw>Utb35t<|HlW-+_(tkn> zf_i=vPo0Z}u~S$n2)-qon4!Ej=TxvY-XI4Vq_QuImPBq{oTSbN7HOWR~?xXapQyUVs+UAAr8c6HgdZQHhO z+paEm*IUobocZRQm~SFZ#JOYt*b#fj{cB}jD_35*l6lckY={Q-YcbF=9*y7t?q-tA z0M@#lx*(UqyA1^Bf*m{&mIyRdA2fH_CE_ zigyPkO#C9VP9&RFuldzNqdiOlrn$WIaKA=nwPkAtQ}LVwN5Zhy?%Lj2j0|p>@5nF0 zN3XL24S3+r5;>ybAhUG*QMrE0ki7yr*u?8zST@YAv>Hz^(ddk_q9Xoyj2iG1hb zSO2Yr4De=d+6ckLDt};cdu_YL8+J=)gS(!s8k93;UNz0XUxly#qLV~$?cx0Kw{bo5 z+PAE&uc$fyk5NPL@AAKrlAz#!%l;}`U(U5CpIgMl1U9c?6!=AQloo=}QTR(LWoFp9 z`2WkJjB#3@trwG&pXYUhz(vuBS(=(xj}y54trE)p2>Tm=PLb#K?c2X50QP*N^+ z-W;CY*Eb*694AP4pB)bfKO%Ec2IM1I3m{I^JI4&D{aXyo`Zuh!LiY(z3e_VUJpG%* zmuZJ?;fmEf*}|V!M+fPns4Y{}Cxz^TdK#uu1*4H05IgbvI{Ckp(n5{YI;VkUSZRK0 z$i@?8O^f0t2E#Gq-^~ZMQyIZDwi}*leMRH-{H`X#+Nz2qOS1}&tYA$MNk_)!QP6=i z7r{0$@+JnM5<&AOKak`^*o>O%+li|(+m#4qxebq(<~uFUtU9J+wHGIVy)hT&70%Ps z>Bg1D7N;u<9on2Y3v5zRGc0h#-Oghi>XN@4%;y_bl(|~!j#2Io=Y%Kbr&*Z4C#vcF zbeY1=_mp$xJe6DD$c39)!9BSgULIn>H+5Ufqq1Y&>vD3JmNk}=E|?5+HeW3e^m&HD z3hLxfI0X3hmHb3BTVNSzG)kkj^wGNTwwkU~bLS{)m}_6TS={Q@}=n6X7b6)g~~Ef3zIGl0$~){zX{UU+`N53 zgT0a~kIPm)D3TUbkNnNWOz+aqtVFQVwF`OCp8O)+e{81QGcS-H*0wj3Mgeaz$34mP z{5hB5MvS6W)4i^2mteXUd#PTi-8tZFbx=B}sF{fGl?Q&jwKGUuIS892qNmx~{tnov z%v%;?v^HN73m%(}F0rgJP39z^QBO@isxOysoY0)cwP0pS%4+3cV-W0E74&8DLjdmV zDFky1%ChZwxY|`NvIY3BWFCH3Z#fOjy^(XkCd6D9_$eGKO#X_TUfl#^MbsH2#)yZi z%>22_&nsGwj~E{TN*`rnH0M9T9;pu86AfDR`hcQrvFipzb~X`&Y_nG{h|2zY*k4i} z%92d;mbg?l8Lrse0DhHhYz-++No@x`Kp^NOY!>6@8&{If8=$nTZVawEAE~Q$%^(G4A8uN5n7yM=&^Q~QGup1xVqXvJJZj~7Hv4#rFIu)&y1 zs=2m`9nqC)4dLgmwP+w^WP|4Lk)DI~>%%0qzA@sLY zlrONZw_LnK_%FaQwCs>h1aQw<%Ls0*E?*C5<29kf5!BoHe7mOYLyXY3B zYVL%*g8C<$M!lJP^*eTe__wsBWUEc2CshnEZ><;m>FXWB{kY_ z&LrB2rPt?!NcsK0He5-gn>Dyfw%}il-DE#GaahZGwtKmnFee*x?BRHBGd^$KY~Rq@ zK0f;9wE9ap?G}-%99&~n_VXZivW$1N2)DU;!nW)XG*+$0g* zBxF5{-ujWB+q<&xk{^T^Jq#?pgi`ZrM8xbJEVas_cnRR;MD8oTIDzJb?Ka3~_W!YCYFO&J(!Sh+@nJDQXXC)d~71`jX5Y@855pI)NR8n-_74$@=?3$9mNETakBmG1kq_P4g0BJOWx=4*K-rZE9%`M)` zRFz~>)iYYINM%f9#{m=57#8NiSeF=KHJOz3WQDoK+)Z#bS7D zyiqldbd8JXcQ02|R}*kr+pTSHuU+hd_)~zK%+or0GP7I2`Uex^JOXj1koh!xzarhy z#VP3bel;6YC-JOl`M9mtLt)Tqku|zkv1ea4+}}0w_S3HxqodlZ#+W{&No^ur;hNLk zjKu;SZ|7gMSq*mMTaLoe$y&OB&sez0^uKbuh}`-Iqu(LJ@(HH|8?smLnf4pxaQo0s z{|5dI{h)i4pZA_X41ME*%gPu`)X65h)OQGcJ70~X)JLWQ_*{LDIb&@y9}Ya8*Qth; zUcbLjvN^ZiVqe5N#})Y;gViCoo@8&v~C!Lxd@|K z+DKwGK~tz3Ot|_T5(#vY#4Vm^??o8sEX9khm7bs&nCk_j%Tku7V+xYPGPE_r-ryB; znpxRh-K|#55whh$xN$7EY@iFrokLrQ1w$qg#DjJ}!OFN8`N_^e(qV$!}kS3w)&eP8@}fZZn{x~2TF-{lZPJn%rXum zoX$Ezw`3_E(c25-N&4`3OZNwrQPSbmZt%1HK}V$%(p1)aea zIJMfmgpu(_+*@RRi$o&B@w<|oh2M|#}{Z2Fz%?PLr&fJy*N+gBOv1kVBO&2W3mEd&2q2OUOhS|Cy zuSVT~E_z2)bKpO{OZevJIWJE$UZ1iOA3=eCl59R;t6sQ#w?9E9 z?&!upGa7%7uy}(-r3;EPXvaGl#ztaqE%(kajd!O7>HOHTRR8J*3fwc5N{!KQaMd{^ zQffMYh)I`wH>Z-2G}ZJ&R+Lj%_C#=M95#%u7{9e^#IMLfTNjM zino_}1TH$6Q3hj{1AXab`xYvQR+8T~{0T@qdhd}pLaqu7374qTCS#j_krd4i$F}}7 z-;_*#1ZoPjlbkDEhfE^(H;2&nFT0Y`1DjyU$k74@1#`YwK;YG2Uwt< zFHM=LSklW@4FN9&4O!qOmubFO8t|~%cPm@>%Q$0S%Vh*;S&*<{;^du0)Iq9GQ!>P4 zE%n!480qdB~B5igUs@xyj1(Jl=FP_4yJsVJVdA5(LrU8(O18P28=L72srR zuXoMijFoWQ;8=027!QNFsqa9R&LkVY4$Js2$qPZPd{GK4Plz zECL8{t%DNQigr)TpyGxsL2Ip8;*MulmLD9-SJq0m4yZ7unmZx7ipUFX{9G5GeQr*kqGR*jN@Jq85n1IzCjXf=*8k`q}KMs;TiC^kK6B{*X>(%Cn3u4 zHC1#u!8;NTccGA7=sEQUdSD$+y=NT}b6;YZ&!O>%UIyg(K|VCLv(g#>J?qo%f>3MQ zT_La6dzK8^g+F52c#9qbrtyn2g#lu+R%^#}kC_c=W|&liY(dJJ4Z*^iL#3+kzk&b4 zbr%DE3F8+WUH_x9^1nbMAcx{}ok~?P)Q1DA>uztLsuLcX!|au2zzibY z>)mr<(>z_Ry*}~NjQK4_3WL<=7UHEK@?;yf55tc6?8@DH+Hsoa_v^(we54*`jCAC_ z4jOp)d23BH7&5$G26-Ptt(o3fFJr*k(T_M=VP{18)g*G8*3N;hV!MFSx^0Ip(&vG| zn-0y8j!ra4+}A*Y4o8gf;@IwySVfF_Oc3N=N&sr#0Zx~R5FrCA6jukAu6lTx3H1TuqOjqtGDv5um&YnB~%z> zwYu1WRxo5$n#jF$pp||~JS??_TgVHisR7m*`f9nYpX{wQmNa|vd=Dorig(BqX43$o z=JdYFH92wgwVr8*#cQEFyy!Uug)|Ikmof(pE79RZ!31>-8*?)fBmpdHukWZK;_te> z3aAZ_2T}79MrSRP6%=K^etO(nXqhr&9pKYQ-+-=RR3|k0B{rjE+UiXkz*Cr(g&>-? zg*>X(m&oNZ3C{Hrke)R*YW1Sn@Y5VhZ(`|n<({H=J5D1K;1GC6QjLse_NT7@&Mx(y zl~eqE3zQgda{%YZu-Qd@DhmAD3GQ_Ao6}Q$ZVuGrM39tX>H^0@>auzx#CpumUyyam zm`PXtf-EiAzoz2<>D~3efGpF0L3T?9Ssvk!jAnMo>NZrg>|b0W+9% zco*MRcB5uX$JDiXUW^_ymNznT?;s3*ZwTY`8d@0x|C-Uv^kmwr$#KS-ZjbMW5Dtme zd1}7`G}d(mQB5=iXY!q#D3CC0aWE=u1;8Vx!@c`}EpS4v^ySCGzP3$E;L+RERI_nQ z>p_s$&N}AhT{{)w3>l#8yf=Y{05_vg4udsiBiard@Q}oM^8iA%>DpQR%R&|hU`tL( zp(&H9%g3j<_H4Ah|aj__j0LExU z)jhR^1&>n{6A8710TLRSl1=7cKQSN|JCs>_`~lu%5vvV)Z{5;I;&%-5i9-I?pRmld zbL}kVR^3=SPaIn%Dwb-Du*evtZW9bI$%VtAKG3^d`1*O>!AOSv~ z%8+|d?q{yGP;1iL-ySRqj%OGU%w;|SV1iz9C`TpX4oLy zt9&7r=>H0_%>RPeA1Hr{tF+r`ftwIMgloT!e6%DkST^Cv;#{cJcYQAN78}#CYq?$d zNRa|tJ>XQgJ&+fjVJe-doL)Um#PZ*P=ecfG^Z zcGrMMhwOdsXL{HTTRP)e+i|@G;KZ_v4or}<~)h^t5Q!z{v9rS9hP%5k-3He zOVB)Nut1p>mvnQUL3p0eBwRD)VyjT;uOv!m5p&>!qR+W;=gk6q>(J)!qCNULEn>Ey zj|nSX=L@AFzD_d7nu658J zk^OwSzd4=P=juW}UbN*>VEIR<4Ht&xlhFSIt>cZw-3ni5#rwZPE6abO^&gagRkd`8 z;UAO$LwHCQt6Pd8UHb2opxt04{>i3SmJtgUoc=C=uNVJo&or<p!8P@nlz6e` zTLWmtZorMt2kG5(Ybm?}(rA_=*~w-mmuvU$j}I`s>wOhSd@9^Y{iWawg5_E~J)&Nd zpV)xC#1yEVx%Ygd)1!7QO;VXt+eFgByKG_nF~vY`U1?d{6;H5B&Ue8~NfI4=T!8QqBw$Mmy>s&* zsqxjS!5Uldo8Y4ah5Ro`ofUtV`QYvNkVS<_7^0?i)Fm!$+)(e}CLP{A#q2x7gs?I> zQqOC0I%*eQ?`!&jadj!I1%7hEE8aPoofPQaUywLyWT^NV}~ z`Al*SEaTe%vi$Fg6`#KnC)Oc3Nx*ANJy$JQ(SzIaQ9AoMw*+&hIr(9 zeCyG=VAy5drA`r#@T%bJ)3q`RnAZvOtdP|C+3D z`j2~+{uf-4?H}k+)U-wV>*SR~TW&%R^suy6u5{9DSFTtxOIOMd3#N=Kh9Ca2lk1N+ zUb%#u{e$A`H$$p`jQ;_|iyh@V>}JA$lxMzbG?VFgtkvz9X4})_B@9f$O>Ymr!bC4G zcNk1KL28plAfEXP=D)5}oXr{~h9yW6qncZ(UGL~p_Vf$N&le>X5}GGU*w z31hJB=o0hfwuQcaPas(Af-+hhn>|5aU@%%ccRO?tov7a%Tk}`3!)ZSQgEjr&m%gb` ze>M~pwV;?Zz%P=gd*mmR9>J) zP5z7YTA^5#@Var#vwobbj^1vjAMJX9c!VYnP1x{}gXP`0i$trx%Z~6e{OdMLl#v*U za@xefl;Ty2j$m*jx@9H==b&YiPZs#dPa6189gCv(1kLG2P{IEcZ|7HVRkJzr`T+d|%&dO!) zA`qX=-(;p)Wi4N~tRrz}Mguwqp1-R+vkYThrB|`MK7qHoyo}d;!^Q-YVFdD8aDCEn z^PItU^S*u4wd48qwPbt8_nUjEQGB56ZUP}M$^HToZ-6vX9h;x5^oG0sM(XSO!dK`hfMe27%XA;<%lY=)P6a!SCXXd!+{8&&HaH1 zU$bMGrjQrSPxIEKgc?T&Y_gr*!;DNX$-x$q%%B@PhmJt5+JKpEDua?hhs`Pc>%H`D zvi*0TO^UqmjSh4^ggVK7oJ+WTd{3cGGJRf`h*c_m0(=N!>V3oYm>*D0IF0b{AQ=6> zyCc(1!~DNo%av9Co<_Iw#Bc&(@)%EU>f<*}*k3aV--)I4mx zo&}H%p3aC8{8+fWzO`1J*8EM-el)Z^jHSHn!8GNpj`I;^AdK3mCO!F7(OQ#i7@&z7 zfWh`ltpm%HeaT+qs;)dEOtofM&?0BfIu3y-rzF}#dRZ}9+=2!V-&Vl-q?v5Zp=+rO zFDt)=aIo!>Q&*Z;C9PfmJh?hfbDV^uS#rZ{LPA^JzXY(dqUY3%{Y!+-l}-QAj3T1O zOG^1i#lYgCT0%960VaCPnZ<$!%{wgATS57e#A`yGnaO%uc!#3+#ZuLq%>-jSAR&ax zVRciBIj_t_M53Ae6G`KE?u3|NK)p!)6}4GvUS2bq=qPa85z{2vYtBMVTEvxcc@=x9 zoqDU8>M?tu!7NebUeBI+kJM6!LRNsn$|*y>O8kU_m4GXtoLy^hfzbyvLH}*+l2M9_ zcHUxDK(fg>I@TPkI23>4t3x&pdB7p#G1h6xpv?gquDpBm2vf+@rI z<2vl6EHdSe3A1LmHj*f_b9`)u;}r}}(MY6(*qAt|cYgBBrF?PJ4Yp>&4W!42+-|3F ztxeG}bMFz^090G#VjkRs(kVxyQAr}ovhYIsBfN7gD~WMiKx?>$;}w>y=jhNi^8-&Q zB*F2R3w~#V@y}1b@Rx*0zJt<8*IV@RUw2I*ND?G+611|UEDPI|G(*mRl!te2t0Q|J z*rms`@d*DA9PoTNeheSmEqx;0*eNJqTXNYO-x zNyVz;J;+g6?kaQp{Dv9TJSN$sY~m`4!f%N^@M2Wi69`rZEqCBoW-X-zDIW(PYegy^ z6-s+m=NF+;;heQ!#a4%)ZLkx{T1cy%rq^7OnS#xDhz{>NwU;5Ks8+YBR_vjpnOJfq zJvp~u^hvxVS;RJxV#-)7HBR+z>?B{xC~7)W5s2Wp!8ndtqh``rw;nsUQo9<}DrP)q zjMs?w5dU7Jj(M~o;b`vQe0zk3Z^_LakD?U4j}`4)Jb!SKKVT`JV6hqG`HPlCL_3DY z_2jT9C8xFPqfthL3$S238v(44v9yA5Y<$Lh%zp(nqi@438#U*yoQ z7g6IxK~q{*T}3NocyPW%rK*@#S@mVcH*mj9I?j4CKl~PP+I?iLsl75Q=11E_Y#E}` zT(gp&+!ZZwPgY5CDjz}9(m0JM9!KKt4?5jlJ?kz^xuq$Tv*2{ag9A1*y1E_!Y7u#s z>{&(GmCCdd^RC0P-LZ)AjACO2d?luxn3G1pV{Gn%G&Q-7&xsbV^2-kDWVlsEHg?0* zq@uZ$hHHw0sw_Y$UNXwewd6N*lapJ}YV4%t`ZX+m?ZXJ2N`ZvWszPa>oDrk!h@s=t zZM{=JlfvY(w??y;Hdjr+X`Lq4&P#IPvN`c<(U#(RFCvMd=b$WzDe~!dV<*d|%E~yh z*D{p99gcuL?B~wFIQr%tkZrQ3`%$qB<^fE&2HugXiHVxepWQiaBbFDsm_PcBa}UBl*&y+u!^XxJZj;a>0&d~I(}PmPi_{uJGDf{t9if7d zmp>ElNqV#9D06RAawuD&V+OKXz0Pde>Dw*}EgyT&X+Q zJZ=SE&ATE7&u^$n+g+uTI@ZdCt(;Mg79Y@He>Mpw_xk@ZA72k}1EGfR$e-b#8H1zC z0khihj)2Xp?d}7^(bA*IC=g?R#Z4hI@8v!*1X)xN4CN2(me2!#^TpQI+yI#MR$x4f z4Mj5XPVRG=;zf~g^b&iWsLD~{E)cc+(cdql-==Hij6?&t=NSpk*$H*W=)xU@{ve!> zd0@e^((d#foqSnNwE`FAmPQ;v2hWbGYR8HsL{Zztg5k7n(5A6Cnf9bAPWnMO#>Kd& zM!u$ogQbQEvtzTA_PVp9OV%Qs7&4sCMtV>-f>V}=cmbr0(F4)+1MNV_vZ9Hnj*g=C!)uP?{l!`kvlUpeYTcT?T;R^J+L?G2Kp@(&aHg1(v^9Ra9G$#oB-5-R3w7l!Hr@;Nal%2eC zAfP|VP3&}Npr4eR&}yil|CgK8YV=6Z#$BKtTQ&;#U8Eht40Oz%`yNNpx>>)l-yR} zp0HP;{S%a<85qnjtH4jp%LH(7)+QOVK)625F*F6Zvxs`4>WHkfQiL};BK{^n?)Si* z2%*wcyg2~rM+=;$c@ZXHi{xk3vQK3U^U=q10CHM<&<#{90iD3}m4x8u?^URYxH=xT zrhq27=`?Fkwjej&QL(=IwxQEukuQJ#3sLx^pe+xI2G9&w5x#VMQT@C6AJj3IKOSV{ zp3U(F!+BbNnvzV^%gdzlaw+mfcbHZBiE*E>jo_Yi90<5-9Y+7UUOfeT{!M1Q%@`az z{OVC+p#CRe{NLU!|0jDCGIr88|9fNcAC-@idnwW74Eaa*Y(Nu#c*nY{i-nW(IWXU_V2_ocC{ zXZh!|iOX1UVC={7RK|_>jpyf$*ADOReM8w?B-8LV&gwxfX04(<3)~L-D4F{v&gl{7 zC9@GOmQG1g$dxlUwr%8oPiL(dY^P3mHj7qq(WnuZhG^iii}3(FI=eQC=FO>Gme#?@?iOVfQRK_ghs4R#?0Q2iU+Uxma`P zYI6r%6c`*wr2rarky#pTJj?ne3ds#Bx$WK$$W zTQ2p*lHGdE3o;s*exr5$NC76CDQuz!Sp_^MzQYQco5EQZAw-P z!A9#%Sum5C!p+A*!;>c$6wTYnnl*#V=tIk%3dC$PIY)kzsfoxb*hNTN1stxk4hvAg z*3u{QHW|HbaraE9jZI|X-F2$p5l)o!Ohh?NoncMiX+#+y1Gz2()6Q738b6-GfL!UN zrDxcup$<^uNLhYoIg)}V0IpN@B}yiW}axXvSt7a)tF6RK5VbnnjxxCFNSQj?M&)V!=QBd z4t9*+;IMt$`%@x4H%T^Cuu(?vaP=wye{2-R-kd1j=$mxE;u;?}|C$afBz2aE3&RVQ z3oSak^}ayLRrAI`+hK4Pl%-g@vOTS#LNh6&Pq30m;m$7`&sA}?D|5{7rUQXS;qb*< z8jzjgp~&tt83Z+_#G(lmsf#M0m@#`R(E(S07y1mwXn1;0JLvf$uj61;mMNF` z#2LNlmA>l0Gr$XHzov?^(L#0-4!+2LED_7B2~YdS>!z4IBiLb18&uWB2NXr3;DCq9&2$+|7PnB zBlSfRiu9)Vv%O2>Dh6Te(O)Ma%N|5*+Pj6;WLMG2)>^z^OqNl`q!VhYQhn=9ygI|K zDseSUJ9`VqTXn|NR5AMEsf=>tsVdTX_gA@Y8X-6im82n=Zf;%c>^84fzH1KykFJOp z^6HE)gG|K~i}zm|7_})ASt2-)b+1eNBsJCeWq~D0B{e7YMYm4pCt}=N50;zQHIHM+(*<#mtKdaX1g&1N+n7@TxRyYdMUw$No8IW zS&hY*fL7v6HM8z+WBCnJh0$Vj8g7ll8BC&5crSu5LHyoWtTkeUuA*~walk&4U1zhp z($fbUX^pgHDVBUnFgjb_U3m)IG;!X1~s z%rp6w+c&&7TxO#O#T~W!4cVLqBVK5o>b)@P)p_h{z&+*ioOM&BGhC@nd2@(Si>65t z{b|-vWUXb=cya2thrBxK%i&NELHC0lBYbnpF5lg0$!Z=@k{N+#Zl%tX1 zL0F5~2uG<_CBX)*%Cb#Lk#^rEv7lvw1xlMrWf?FGQ9`D!)^Qw}J1kB_xhlN>hsn{S zQy9~l!X&q?_>;#_xSD{1=cB-_Eifp=hq(H?a^%dIgm~2?_yU0qSI(11(l^)@stBor zLK?kU9ISeWF$GAOh5aOrfmln=#QKR&F=&%Yt#RB$?d{yNN=F_Hd-eML5kyYg@Euzn zHMA3Bv94=7q?MPRkJ`WAU-9V=GwBe-b8JCpAP+^iVFC=WOd$zB$vS46vQVE z(5|qbB!@b{J|Jxw+-9c(tYF?$w1e1CTGQJ?s8pl4{TX*?O7U+hso4q!u*^j!esVI~ z0lk7=Irk_sSCPEoLBO8$ig~(9z5Cv+VS^;V*2Ly8Fm6NX{MM)Tnair~7$wg%kSKC| z!9`o%KpfVm*A*7=2~5KXXV)<0?gi24A z!HD)Mr^lOvrerUNHq9RTQNbz!HT$){$|dSJEi>TUZB}M z=@_RT=)&Vk{{lZ??oQD}FycwxO*@6C@EDgls{;lVR;ZNqtg>TI(lY14w}vF_iugD`e~;sAfZ6V81wK^_n@0DT^zma2Rx(4|o}+Aj$|O z`&|iCwm%5M&thWr%z-E&?h9NSw#B+VWv>S{y1s&dh|(g4sArl?{xJP8{WSfcJ&<5c zKn1`OjaP_6+Ac#sYY%QfJ2(b|6@!(=YELH}V?*34bC3+!+;`$($%Obf4^SPc-m9x1 z9c0&OU9S}fDa7^CRzDwK1n_~6xX3tc|H#F>D)5&{DR*p8yH#t@6!{|- zEy>XDUq$h~sXa}|l zyF3)X+kcq=&q@2?J6O(?I=Qucwiu9Gx{>rqr+*39h0=*#!5TZyRFs=G~Vpx^OJM z3UE!Y`FV}U*{b9a)spef_8P7N=W4qjjtHPus>0p^25sEhJq#L`Q0Ws#IqqO&>=L#7FPKm+SBL&l&f>$T(g$xHt*h*pDrR^I3>$$)gH;Q`es zF(qrc6mQ7G;p&4ni9-k3o{X`oGLbciI>%=Y`219a$8k}s<2nBlm`pnN!e{u^(*rH# zWhdriR~{A%YPrTra2hYR3O0Pe>`GoQ*uwHvzsK5;Z%ucK5Gvnh%?ih$x(9p-P+_dT zDfxIUhX<+eqgOf8jPvnAR$Ax$L+2lvh3_EWZ;^z3=LM&!YB*#GGMQ*1*&}EMGp#y< zS`%=s^%uuTHN@E0j9|pcGAsy=jH=KobHZ5tVFIJK^8?wF_4F}EYWr{aP+cOTb%um1 z_mFt5RON~>oRq0~k?4pZPRV8C1EX<}P#5NaldxCjNWw*&8^z=WL{lgv&P(}C3!NUJ ztJF2ND{$R)6^)5Bw)+X@VS4l;gQX2KhZ(StnMuv1en%I+$d^dr51P4q;1#RJ9$SezocnRlCgLzBCIg6vk37T{ad3$JsEYe&j#<~xZ*%-bVh5D;!ATh^K~OpP>1;Df;~RG6ZaqyYMPjV zLdk1gG?`oZUfO!#Dh2EU!20O*1kh!CwnpkZQdLfGIp5u2lU!sCW9v_#UQSIdqYNz^ zJXb(pF^;=(;@q%m=TAXpS18G0s1o(=6Fi#+nFTeM2I5p4WO7Pb^FZ@8$8VVdmLv*# z1+!rzhw5j@Kun6e0+k)RY-JNhpc7l+PoV6gCBL?*hPX|rTP9Deos3pPV?QJRZbFZz zgqt(V&3)N)yIj~ppn?frKUdd@mueu{>W6toQT{8CQ|y3bBMC3=@e^JGxWEEaq~15N z9>FczQuZ*qjCQ$ojNa=-SQxy)VL_XQmHMvQJ+5xJmGTmjs>yi1oaIJXH#Q@i!~|E_ zuH3oFJ*hZPPY;|35I~kSV%G*%Hj2PZv`iR#A};%NWsf==`*Z+?MT^-EZ3~d)(O=eBtB8&e1gFL{bbrt}J^zO=g7GFVFZHOkRW`JP2v)9m{Z*pp=`0q*h{a( zSz^TseJz6a!h1lMVk7FfV(H^5?`p_BdLxbQhOifWNq3OKJ~8Q2%52`wCKRVRit2zF zmil48C%+qvVNXRi+-q5{?CDFi()z0C$vqtBHqnnb@62t#C$O?3p3Jo$D-?2A<1+XlvLK#TeN9(aWehMtO&{UDgo3Dsb;S;!~$3J$%pL)+Vnqz+- zMQ9PnUN4rudGEgY6Uysts=`=L!}a3c*ueFWb@M#!b&&Gs`O>lU2i2d8kO2R12Gj!| zDZTlbGtb|rgA}OGuX+263QoH|cTYdvxXF3(74B;B*>(}{?n?1(`wjQ+O!#CD>=~X1 z89TvjQEhD>_O5(7L2gjSZ|?WD47_5(pWo_$O1#{1Fm`T6AZ~x$JrVFZ^Ii^M-q|mQ z#Jt?f^YI49RJ;Vj=b$9>9u1UuzeK|4{MvKm&3xE<;N?CWKv(jTA5!$$Bt%*bqYK06 zrtbd;hdeaLpN2U=|7Z<0Rnk(BSCT_M>k<6nJvdD=FkFf#o3%Ap^LiM;pWwk{ET!=1`hPYUL>cAaQ_GL`B7%aM2=Dz_2WJU^`i_Aam#uS49}Jw{;2 zZuqnY#ne!877A?3ri;2LJfDn7V-zx#i6Vy(x@u44I5=7~DQ8@1oCLQ6HniSr< zM2=p%9BYFbSk1-{_9r{6m4j01NLi|^by5!2+@p6gYPGF0O>TBKAAxl^tCmAVSAWGb z#w|sCSuLm%xG06sq^=!!8}r>s1zR=_FzDMx727`JPhD4PPYmXvt+S4Un_LAeos27URy zI_!ep*{_s`JiP^$xKf%RxKyHQIa<>bB`@WHmD|kV0XH3P8KlXer>5ZFr^~m_U$Pub zYx$mwQ=IQghjY-Ytp$51my(y{K+9cz@Xc-qrOx~L=Z(@kDXro8ErG9pPeq77FnQ zG4SZO19;Q3vM(-_Km=tx*|AT;B5r!d)YcanMl*J4zPfO%VG^gza}be(F46SQ<8^~^ z_BS{W-mil_;blm@>e*2px`6*k=&^Xg{!_h&|56exxXZgEL1axkv0fO_%s8=ba)khE zD@@eL`_#+A*Ek?p(bp+p~X|jPN}KGd)eG=vwrX;PP|vwiomo`%1A?-vXtkcv{ExlJBB=;#0|oxSZv(=W$e5J zro$Gh)#6z>xoL|f&@efvlZ>%6GtjVMH(3}soY5?D$uV?^&)e57wsiEG$g|C7p#d?^ z4H>^_hl<;|F&%wxhme)gQ5t>LhRP!8?JS(ezOwFE#UNo=C@?X>+{uxpQqg$uw$EG7 z1U7<0pNS$XIpU(M26k_zFKKD&oa@sj3=Wt;*=1Zox|ld~QIdA$Re4B=(|U@==CJ8K zraToXx8jC+9iIi5k?@ADk;Kb&E(M}>+CVb&G3dY@k^Dc(-Z8imuIm=(Q>6`a^&wI}~Uw!r5y0w4p+Ex3}N=~iWR`Y#3mL@Ll3?@G{X zui#`OS6}C>kz^5cz+3JvPputhBel>s(zFXmRcgZP?<^66Gip*39AZlU;wsY6pMEVkha+Btny zR2yqo=*j1uYCuUuFq(*#%EL3IODWB&B?gadh0+>*W)NHtj<&D{BaWQJy}vFAhrIcY ze71d{q~n3+LqaP7p%OV_BhO-^=fhz=7JIksblgPo7Ua-psdm5W0oppz$fRV9L#9A1 zAsCB2hiFL(_3vABlI=v2G6DMj7pmDY(gozA-#V1^H-1Iv8Xi*(YSEZ!7G47~%S}Y; zC#2)Kri*|4cFl}U;yz7Cdbk^DjmE5b6IlS)b-})@ja>0TXv}Pl;=!!dv?er3Mg->w zSNi-fQQf2LvQ@;Ft=A*cKM_`J{~tq+nc0^KvZ9I67pZRINUHRebMckW{%-^#N!3bi zT@|~I7w6S} zK*;YHjY1dm)WrUdkkC2eg5CHSSK5;i;t~VK5VF?&+7JrH0|1(#dUB5vJPo5ag+^Db zfl5C!{MRKPFR(7&8UqvziClH*8l{s9QtfTli?9#b)mC@?(~k;gq`^n2(b0EVSEJp{ z(rCMCa^-LVE}8U1lCYlS#ud|g3QUPu;Iu}(a~?u<^U0c+7(sxv!U=k zUq8$YUygQ(bxF8pVp&^|v+hg#flk2g*ooLAzD?EhOAD5oSpO%}mjdMXc)5x|1n!UP zDIhOoaPdu`w@6^Rn31685;ZHj>m{jK;~w5jQ4z9(u+QlVKac2ebMn$sFurMrBpq!~ zzz(i)Kjp70p~(9=?bjqa>b!lg!VA9aY*CZt-Kq&i65qy{_6-^hYUoH`_T%La!-9BS zpj80f5nfvFl#xXXJv1C#Ka)MU8a!O@0x&Tk=LS{-Q;;CY*fyj~10_%6fM^-G@ogAK zXuE9oORSAXM0y7cO7IKFOWLcM?EWIi#eqGD>6|<`R7?#qm0bG;|;&d9i4XE&UcT5Te! z0VU9ua-iX}iAfaArRkSkd6GBszu)yUsGBL5EXn?)3qQ6b{y83q%>wj$w5`K8r{ska z__`@y(mo^VJ zs2Dm+DCB_lD8654t(o5%o4cRHP@8m$VxSESF}60iV@y3;J@kZ-Jd9EBBJdf7jZ$fT zEX5+>isqDDf@ACf%_JSU;CC1KDAxdG!J9|y4lckqk}=(7PN&#USVH*ozfh35S5`*; zuYFAA{|g2A?{YJS|38=1e=estH&hX{PjZ?1(>g(TdCdqc%NZ6riE>Iy52!;G87)FO zEM@!lv_h?f&6?HUOPJ4nPj8oeJ=NT#yDLujV$(N2fZYn$6XZ5Hf`gC7rp!*)ZryL2 zX&E1P*I)1`uIuhG!o`3DW2Rz!-|t@*;3X=Vy^+*w@v5_d^@i>ez2nr%9mLkt;10Tj zyo!;`2SB66XT$>*7CQr01~YM06`W; zOzJZL`uYQE(>_xTBgDhVuinTi3$1(<+0}eTYAEoij!`-{4x=(%9kwGFLmElxNlxwQ zFnHqT)%Bm311kqiuVKPyhRhdHtS!abq2@97%`=P5KPP6EI~Wbx#V+fTEP@{C;3~%)@9s3qGte>)K9herD;Gdrz)4@pm5AZb-FxQV7eenhfuV$tcXq$fP>N zM}}ZQun5mq@3_F*?LY}VcOU4lbQv-kNEP&RpJQ{xTvEC#^=q|M7+|Rl)X4R(yNALo z-=;%Fx&hz}G5bBMXLb|Hx#&woZ?Z$49Fp?hqHNoQ`7#@`Y6w`Z+jc|r3wA-Z7lA~) zh9{O)(|L}pH1sOVjO#jw=u@1oL>0S6-uXL9@Hx9q;CklIiZ!1wDcGDDh(G#)KA5zM zRwBfW)q}w35WCt~1Ea{q@fija*bG(m%((msr(i3KxPzKV5zT0;XM}C5FcJY>VT!BS za4F6k&MbFSeE3iY;a)@>-vPPo{f|R|kNi^>`HUhM=@W2WxnlZwpHVA(%b50k=ZS|* zc9+>t)f7{wa#%^8yn=zveoh7`h4z4n?_N zO=i#1929GbXesW?5|x%5-#gV0R7F{r0PSM?vp8im4Im<+sc2XQ!GUQ}{lUhY(cf`h zN4%8ET|!*I95(1%vu6aBAAd37J@eV@SJ4LJY2nOssWj0lu*y+-oSPr*u`>;5LZw?P zI3Yd~_{2s?wl3tTS)4cSdbvplokDg&`se6^mx|3M%CXRLD7EKuP*#Cpg%Ey%++z>z zH@t!Iq#Z1aI@wi3=uhYgh*|Hjs#`-_dTODc+X}T4<+;wUh+O~dfosJ&;fFZyr838m z`&wZQ>{VJJ>A&BzAnrYwXLe6U5+#+ejJjWq^kIPk@k1us_4p+B&V!^@XE=gKcOLQ$ zP|e%sdF=|4Z;Ob|lR>v8D9tVZMR%_(z?MdrN6{Hn`PIeIJ5{W4f1pXgsRCyj{r>cE z-2ZG1vXgHiEI#q`qDy06nq?O&2Y2ohWV6oqMIPSO$0N%Ol3Fs6HX=Aa`H&#RE&ywz z%KBjEcORArI<}7k7N4FXiJG(>TcLo7@RgNu3sAk9BMe^UUV1u0Us@2OmkPeyAh}Nr(5`IOdHbSi*@DeEuEnAqvtNV;UN{mg^V;&1! zG$u}5ygCM-BM`S7Vat#3z!Om<(==-p3+LGx4*ys|I%^LUn`^Gw#{p?@gpAh$Zkp$# z5amcHV=2%d~}U z=`O%Iy4C9Bc-3llb#cwd=a={EcqIa9M<5K>9cvF+l>{Ny%3ZM^ho}Zsr9l@Z-6t^? z)q#30T$+h_i$``YT)qv-x`NCiRGCiJ@F# zTHWd?c2Jo#zaczR(k4+Zd&a5N4HGH{Rkhj(B|nd2TwG0_wvT+;Ia}+>-K2j?JX13bmD=XG`oS-2tF_a|8?E1GOBl}8Mx}MSPm>p>$<5xdLqqgn< zPqhc-VOehvnEyHf%MpZ_RbTQTynmDjk^W>1L5RabjVQ6@ z89!tZhL6XBLEPj&GUOZEE2(0>xnN0zf&TH1r`F0CWvdYf6^cDJs28n;6s_h^5 zUDt1KTNisEG_~)HTz6jGPam7zPhQ@)eAgaGMdon=uy(y#@EwyqJ{VguZtA2t0Eg~i zqD%nL9~|`-o3@k!(jFD&9-9?V9> zQ^vD@FyfvNIj{8|2?lROEcSCtxLoRUVYr;i&ir#!z_g}%>@*c}4%-bltlmHhocF3A zT~|JV9sme{)dISpZr1>1yvO^RZ}3648*9+Fm40lq0YPEa_Cg_ijd!WvR|e$Z-WU30 z-#7XgfKm_7NuKX(`I_B~H(IdW{nvEw-~CvC6rg@hGrye3Kl6S6TJG7MJzYya`K3OW zg!@r_`r$su2GhSUql9588cI@WkQz#2zZ7kt^&`#q83;-QQ(@?t#8Wj~{*RNx@&E{C34}QI+33ED7D8 zN=?La*q88ge+zd{;p4t29#u#b=S-7^$F>v4ppO!3dDXud*IcnnB*opFiL z%49o&WgJ_jsr@?R3}kb515kiW%PBNuk>;(-M7u#;mF_TAZkD;5{xThYI>sEK42nfR z+1j_dT;Iq;@Z$!oWXryd!H&bKugQ^Z)MjRi|J*Y{>kC#<`Xn-2rKFREvBWgwsf52$ z&D=1IQk=%1pes$U<~x<_GDN1$=&s7#$-ez{Crc?2MMs-$fmZl&AV5(xm;#>n#E=DF zrE*Z0BoU|KR1TLuIL}pIIDzF1IxJ;+M05zAlszI}kM2Y`l%N|Yq@L*zcvCB6+xH;b z<~*Dn>6$;*IJbZV(AL5-&T_!_^<034DbPqz-hnM%1^#Rtw{qlV=~jqR0S?2n*E`I9mwE%2i&VJ5Xj)oQ+M*%th4 z$yAu6+h~}^w(8dUlI9ol3Zml8vg}%t zY_2>e$@c^43iSNbK_3^c@b8!B37Z=4s#O2O6sE(BnMnv zT=aVgA=b4z2}_$OL64I4apM-M;=nUgLm^*I(fgIu#Hp71DO0U8<4FBu4@25RNJa*9 zTWqIa$gh^%MHR8&zS522(L34BN&?04-zVP|;ykr*f(lJUUbAy|fpC(|XMK@9l z;IqIh;qn7Bj&8WX+xVhX<6WB=h4z}PlWbr^nrZ^dX0|NG(H+Ug3qt|yh9jln+Zsfn*Glr)!M+ZL? znpmV@&w+h^nokMRmbEoC?g!WNG;NG*niV0FPHThZvT;1&q^qZt$7GsA$_fbA;7@A~ zHCN4~D43cqQqHYAklgB4kDl26OqqzM&~45cjeOTa7<>3N{-Zedh=swLm2O{1NOGBG zsw5!B+d8>)MSbN}c9@*I_)G#YF<{L>+R0t4f$CG?!$E89b$+yWa!FMwV@-J(JH$GB zAoEZw7V9Oz58m=t8gX$HX?r;)#)dU#H_o_7l#G6Q%S{b4w^kB}8sItk9KOCmI5a>m zTM8PGbXGC7(jhrgTW|lx_U+(;N5cG`29&lQ2kxNQ2pO$C1={NxUE5gMad_MKRCr|2 zu|XgAjKvLO<2oq?+P2ktXr(eo=i%b?n*an}C7L;g2j|_lnuZFU)_xo-G+Az4b#*N* z(RW&o&^6(uXxVHOZ8Vwg9yIJ4(H^A3vnOH_EuTBY62;JgCZuY0;9Hm}!zVb!V9MfO z#PWDn<_14R7k-4>|EUepnG#KlVy+O)T$>z3m^mDrk~!KYo+5cM`c*Gyb8{*^O)#}X z7+OV)*9z)>HQ_pmr)slZ_1A1;RZ}>Xz%>$T0=}097Bd}^{ZCC&a};ENKV0FzsUn37}^!Hbmc5I=7s7{tCfI5E0i0x0RZ!{g)>Ib$pZt}a$$94 zarj}m4eV`=b0<6Uid2QS0hTe-gmUOQA<^ z!1UB6p;o?JS#1)pc^Nn!Avu>vCv0;we}RNAjg7x%zOwwo;~150fNP> z!+yQ0HFPHm<-%!!6S1qf2}=<{D0Z|lE6YO(u~;Wt#KNs+xqUOsW`82Bl5Mhb0JwGc zSJ}|V<~Udguw8bJ*|AuvRk)|gS^rj=f^$#N2Liv1Njg#FqJD?P8pu#acF%-qLrqFBz0FiGoCaO+T^&49IPqEtHR z&Jvl>T$#x{8Y~{+rfnaHW8=ayv3OOEmF)Vv@?zWeiexLgR|DZMn(4Bn7kGrIz z3>;*9JZm$5A&s&~{YWf5Ne>y^7TI)p&{&yQ-}s@!6kf#h0I#9#=!}!};i5&3Y!e}E zq~UizCqZjRZBI>}{LWp=Sh$$bF30_rs7_@p+j zDqx8^S3FRY2x)Z**#hVMjjE!!tb#rge$iw$TEjYBw367?mb#jrVKUzqN9(oRg5M`m z!A2OjcqUb(BmKzwvYOV%vS>lhPzys%dS9~6VgHf5el4@xQ^n7sQNc#mP)sQ}Srxf6 zeGaO-zS|Zhb|OFgK*vSdzWKH%`|Wgsj@@5~a&@A&I-!7eDpW(2XU|#2ajQgJz!(j{K`j5M$2>Z}2&~7`Xy2Q468$(SBCnt)h^R9A z6`}2wfDBi#6(Gr*Ba55eTjxpMdPTS`HS%Izk^8}A{$lW2lH-6kK-2m}aMcyL<$-SG zz@|GC@J_!`UeFM`r6~Z-K?Kw*so(?y|6y+Vom(+1AdnmbbDPG zL~3MIMk92hXDUs#?Z0M$SDYqRRUSzYy%i_&ced@M_9S|DTxK@oVI0l2RgVqTWLTAZe%4Bmn}v_fUV4~9V*86qfZ9HQBh4#3*LY2doi|#GYKg;>zzrGz zvNe1hs2&t*TC;H1=$>V(-%%W=W$+MJ9n`HrO<}fLD*4uIjGQLCD&!eEmYsm-*jjus z6Q)v_gnFafA)r*?PT~`&t;FJBIwZ6X;H`Q64(AOgRS-@E_n6b)gZ(>^3H%99mGaUg zISQpiLhIi2J*pd{j0*ts`Cp=N@h{{>3GUmsPwansrv9^sfsBW;fuXgD%vY4>|27O% z9Jl?~D%QT(W=I&T4b^WTwO|~tjG+E3KN%XoWm2+8`4xrfZ|Q@T_)D~#AG9xEb}Rk^ zAhqQKVni_%$b!m(o7&sUt;ZX!pD*X@ZYwK8A1K-z_wsbTeRPP;JR3LmYWhd5G0sgC z`pZjl;F+%Pvd|N5&V?~U{Z*2(#%#u>wWyFx+)3f|dlqw}ubk-q{2qJ}%5w-N>C~pI zoDOq$hvE=EhoKJD9KgV?1qJHux6mJOuW`b=fu2%5uzS1W*#-%3__^EplezFoxOdP7Fnf9lE5#f10}3*#*0nl@0=ZsNa{Yk zLNhjTPepfkZ!I&~=*JP!e&hke_}moNUo9L;L-=U&ph+8q{?S=dhsvWooQ4-O0ged7 zLSUF|2kBsesf;>0d3nE8wP))R^kzLoxr~yy+JUk0nCrRbjwq+kWdc7orJY&f9^P2u z(B>*R*7VrrdO1Q=7t>;CpL)bxDMy$bmJ=Bq`}SRO8>7Pqq+`%k zmJ-#H6FvsU>VsFzBE|EUDwJnT2Gi=e?VB3ymdzhe-ShB1t8+f&?Mq|lA=;F5Jyf3< z{f(G&V&l&>Nu9AUb-e04&W_!FX`y)esLt^X!Mxs;_@?tr=x^)2BHJG8ZO^yG2Z}Wm z7B%~AC=SI~JFZ;7JIYExT3<1a3VRv+Es@Zc5Pv{s17$cWE*+!2B5Iw<)Of=H$Ys*G zmSP-cO6x_Hr>a~zff~}t(vUeb_QzIrkpX4C+{towXI?cNmjv#zRb`&aNo-l%Pnpey zVi3u0mESL0AU&5(NKBN?qv^3_#751Z=yxs4;z)TD{nWa&ggN4taRdMjw{kDZ_e8&$3{DsQ-qOVwgh7dkI^y(g+*n1 z@s6;k@UqpgJ-}g~m3wv2&^G#guo2O`LqeGdsN@xta|4*%yBZ5=cGQ2@7Usg~4AuRb zR#4R6sRdE;ua`FvCulUnl4aR%(a}D_Nn%(qo?McypRJx%b!wYF&|Y?%F9+?u!#@AHx~lYy!xAp@K&7kZD$^?YE4E>EvP(_uATb+ zcvgx}bCacOE7wju3Pf|;`aP(ZBm^u=Zr&nHmOvAA*E_&v>be zfKs%RM7BVM5yG!Gbc@=as}L#p555%QAVxY7on9)y_}P5YZEN z!3UkKZ!D}WJ+<3%LYv|XI9#prr`i+#yol|NdG^y-9}{#0wJAaBL)(Dm%o=pNdIjNY zu_D3Na7M`@TE&yt&QqR96wSWE5HH|AZ3%^KiKTJ(cfiSP2FA6-$`|au03x14j*gkr zBc^M`PsVK(m5k~5&pqah3mwoE?)$}>x&+}IZoR+j?Gayg7(YRO(6t`y>1@-3md1gS zlEH9Dl&cM(M0SI4wS;xThwIqzL2M2owU67ok2&KaqXl95$97qgpX=> zSI*>_8T(T^q#L-)a3cb)rwBCpp*xJr`+G;`#}F|2SNCn6@=-U&SocjHo*#{#A4UH* z%`@bWKfq*6z4!+;ljn3ey_8*CvS;#7g|1JDUOt*<%pa^fdOqs0eu=wUOx{{C-6Z{P zozL0k&)0R&hzy@fM}HN8+q@ewe{YEV|32)#xoag~1NkY5@`td%#4(XmU4l^a?m@>z&) ztIB_l)0W0-dZlnpY~yyx^EMCq*(~bK=O`tu<9AIBnii#GcrA zEa;eu+y)X7+hbh75)%{KYBO^0Lt|YL9}$t4z+x?8E%BL6S(awAqU5YXOv!@_3%!22 zJLi^nQwW!G8!8Pp3>b@zu;hnJ6aydb5u<}*A>IT@f{sXN21SY+%!!L8UGKU7P)zu= zm5CTpb*VR1TNNIgU+>uaEsuy#+lxXg@!7gw%u9E&SquOYsWxx)nQnjf=8*Z>U!)Sm z3+Z*xVAQMEPcCY>1|@`)#fCZ)QO7=s8Wr1~>|2c0J;!BZnW4_%qHCxH&i>v|+!I=p zmi$36Lz&0I%Vcu0)-p+@mJ!7^w)cStZ=)!u^s)!~);1q`>&~_gNMn(uy@tb{Ekp(| zbGgv)q>>waRw6^&ktDLLkw#-k7_E&)e^7`v)TVCb;4K>kEoyLTh7%FNXNjjOwP8mi zSz5aaE>H?bdnJyhR*|t|y-+muLud2M3NLg--j$cVAoVUzCalEhv*aO83=BK>Coo(| zh&HScO@@uFtvaVEDLlH&tJIOMe_KkP(3V?g+zC`kY~#qxyp)|Hm6l55edN7%p)g{; z398pgU&Wf)qwQ`ht8SHF(Z*4#t#=uo;mz1nc|Vn~1?nWov9q zZ8gzz3jpk&&+`0*xz(u5Xa6o5v@*_Bm8 z^;e(J;_>zz>zadLwq(+r$w0w&KWd41P79lIn`vByyH-q zc$ZUh)fBl6=DhMdhOgG3M@QivG8VP;M5#MkJ#|8=>WONSZU1;sh?NO~TA@ioK%q#3 zTux0m9Ek;`bGxLQd`ZO9t`QUW_%tn_j{2ZUXe?IS)Rih@I8_&ay9#$yY6MyfuNwWl z3wDUB;GVR9#6El89wRnE$}V)Kym_po+nxkEUl4^;&>A4V=JGXjJyk$Ge@cgGqjHXC zuZP)PRRnEVnLD}!k7i9ow0&Mw#T$pA++9?bCRxs=US*({fL5zXfM8H;aZt9$PAsc zV$Mqh82OwlX@H}05+?byuSCtmkNC&=H-Vx=0V6sm`ATY+u+SLG3Raexs#ac@{! z+zjbc|NCo$o2g;n86k;;QY0XCwq?tnG}|+`UZ997V$41Y*GGtDR)6_y38Jj_@ur`8 zaA2YZC?~I2WT9bsA0`QL9{B?UGP3issq-?q^U}g=y?(z8DZ_dW?&;uM+W(T{)M&k* zN1v2Btgn5;ev>2wBfio(@?dOwQpvt)Q$@w|w`ny_s`kBUUiChHnFhv+!I*&9a%u~Y zp=n~$F^>`kdpwJEk5XFV)2Ie+2(+t%Gm5to63QYg`lk$GQSqaW0+g45-t<=Bd;k6p zVm|-TP;Y`x;^upZ845H}O)p|WqE9+ON?T!FFiLJ**U-wE_4A;+ z*;JcW`3w3J!tc4`rqy=T{$h3h?S6BDMy_C~!!^8g{uQk|c7GPfy|DSOt}bChJlXSm z(L+IS#6l1sSNN&2d|W}?$?3o-X4b=ooW`Pccp|a84+VruBBg|=CoO~9a(XmEXI?kXTb{?O2$6hAD7R zRc|ejO|NtoC&%G**uFq&d~T!8e1kXo_O4E`8P&Z6y;fs-b+j~*+MnJkqV+o}vLbC4 zWm*J8tO7tnVKuoknvNZ&erGiG-onhcI{_!^{wO&NvMct@>cM&HEUjXZ^K-g1e3@@d zue!gV+h158+Hwa(vR{f)%RiKFy#KCLz3&Vh4f1GLkDts=^~U1?L_1&)yan_V09#r+ z)VQQ>6@8xCVf+07vxe9EJ8s{1&AuTr7BDUC$d)n_s z_4v^h7Ley1k${VV*nNU`FwdJrsJ%d_-F~cLhB`IAzHIK%k{+COkdBsLiKxMqhF#7L_uRzsFR}LV%GM8~4dt_EeoCoG~)>YGZefpduem!9_dd3p9nULw9C2BA4 zOir(~CEHdLr!WM4*Ni38jG@z7vM}}_DNe}GP$h*@c<~O)wAu9=WO{oo#Gjv(zN6tw zEY-nXTaMa)%L6cc*#h>+^o9Om5Pz$ikF3GF`bzXn?z)Gn z_s&=R?To2v7z=ttxu?;k(4H5qsA?V|(4R4Kd^6CW5omxqsyklG@;kv+RPtVdFy1+G z+os@K0_b9%ptAt9=jTQ=bvGjzd1$oTyiCXJQV*=X3)xXB;W8>^iXoQ3%{+SzmF{N?@S7mKiyR_SYxwX)ImWGlxT zj}1{MwC`V+Tk(+WdNvhT5^l%1KpU=Ud=f#p;qN=yjlbVRUIOL`6}CJ*rI~ z##$7DopW>#LD%{?o{LGY`aR98aH~e8t%w6eepxnsqK&`+wrK;m z6i{qV9arZkBwLsD95)nBp2qCEmPmF$)5!AX0O09SmQ22!Ht&Q~(n_Z>A}h-2+I#kF z6%R38DBK(K8c7n1} zxDAsYCja*<$1y}rTF8v(lfxN;5koLiVIWpvf7lGA>8UTb2;vUtJt42Km_q_V-yKVc z+#I`Xe9SycFnGisyywd8GuYcLLQG@>MsWNj#5;o52F>TB@U9F5RQ-hyW>*k%s@bIE z4S1#r>1m(lJH74!uC4Wu2d%x@6Jei;{^(wF&-Dr3Ht;s<&V5uOl}1)}${t{8rnbyr zctTq2?((DB5`*zwA?nr=vU*9QoX~HPp4b`1%ERy2YK1Pbb9C6IV{LKUb8zgoQ98v} zwM6q0zSw~^A|-yF^EX2sCkPyuELr6Dz&=a}K%r`M1gOtDGloyZNKVZDx5rg_7{`ShR zob%yuMo!MvP4!(nya;WYVH2p4T`(MLW2VF+c&YVSX6l_P%yM_P+y<_zPI|%u<@6AP}IWOMBKpE*!n*^ z^;v3feoBYff3sOr67PS{@z+u=z-mb-5w+#v@5If)qRpv_TlC7_u<*zz$tEOZ{_c}s zIL*AP%V=-O%P1{(U6V1>`aN33clq?ewca)DB|9%3cy7kmk#c;?dwu7dGcNJ@ay@OE zi_s2@{Yk)26lRD8pbV;kjFBcwGwo}EKNk5}zW)mev)|ZHt5}LN8*Nl6-(6#PzK*wG zf0eMSV88Vz>#j#y7w!No@oP2`!`X8eo~Oj{xQjb@b;JQAr!Uq}EYOI^H-8_X;rD0X z%-|ib8)?r4zkA_^24Bs&BX3^@zkBHh7vJu*h5EKR(48Xc?Zy_Xdr%wc8vLd!WJdmY zmzk%Z2UG}$IGoC9C~Do59$$_#Sem|5Psm4&SIv1Mli7NWOiCyV@8nv7oD1>E90~?7 zvnj%}3Xjjh$Uf&mDIifW6W&`jmDkl9!0ZFs8HfY2`uW~sViiVy8|=K1$*Pp7x-nJq zBt58!jyfbyZbgRA%q26VP@7(3I$(LH zSuROjJ>r@clQe}%50|RZ)t90oyKE9l4x7wz#q?m^twNh_Vapal=%gvmA`gSY{;H3d5gau`Fn=swkuQ`)fW+E~!pf zSI9;g59(>6xWdB2nla2{u0i>yQjE%uNbiZcnqE#R_yqm!=pXD$6l$ubQho9Y?X|Q6 z4jQ&CBdw~_&e_J6s!$R(3v6A*!gwxikI~VUY;Q`xr7;uwKW2*=C_BWAHL}@pXiVt( zwhN#~4sJ%JY$+d{pMI}J!0gGjn|u!3Yv&O>8V*&3mvgpJ$|_?^bTZHQrp$;a3ZSz( z+wd@YD7aQlMDn~1C;4{#L<$U*l;OzxyCI8Pq!9$f&wK-^2Wgf#{_X&~J^z4Ehnb#h zU_bz3ZBL(kTHSO47yLVc-_N-Iuz-$K*j7Q+xPVw-ZGf&bl5t9gi_}ODvH@$0v{_Lq zi*=_-F4ma6IQM5kfLxr3&E`c@052Y(CM*`)^AEj2+KrPkG^E31Ps#H{k3lQ@L5&1j zkp!5-W={^VH9!_GpOZ&&eBDcU(oQN6YA@u=+NRq;1!0*;2w3 zO-|>Po`iMXL_U#l`8z3{CMhASWK3itAv3<1mvVEga?6sAUSC$OULUZbRYbg$t$yja z)S5sAUt4y&v9t0!$?>t7XRN~Y_6iw3qd=v4tF;Q}_t+n)Ln#iiLlir>!wQX*o$SN9 zId^Y`#oQ+4YF^KQy}K@_%5zUzpN*O^se?nhJPTI7@l7_BddG!3{mYaHWQW_WD$cd$ z_r6X%o;KBIaiT;9<4o9dEA8_gOj3wu)KEgIWdY&8D@$6Mv z%UJRhpM>43R&fr0gYcLq*~mJm9>uAWsWmaLJul_xj9L?UHoS}k`W43fPz&|RjCHsY z1%qSvx^ ztCBY;^xH5kI=L}(t%*?98iRo6EByXv>`@%r;S22@L#ZvbLGY30sr`5H(N-(bP9q}3 z^y_UgG9^3`#&=BVk1vK=64ozx&2;%`2}ihgdj=X-!QFsUubJ%wwfFKBDyzipNcjU- zUM(tzqRs;+Uz;nwznX))NX!V{a$yXAhOt1C`&^?6@G(G{1U%ArGf6R&Ms{eYdWXo2 zZ-}`*@s<%4jPG}*xNNb{`z{rIe^ zq(quisiaaxBG!0TaAi_e(}wmaukk1ydLy?qWH&~g0iSaBCKQPs;_~A!&t_6hAeut! z1dea|;yqmAhek&%CYq_&hFbDX8pA%b-jLZ=znH7ifF4p~czec?gNmR(7#~nzHQe8@ zOId-=_c{URh4BEN_k8s6_UGN9?`Uf~hbD)sz4&E=J&UBM!$xydHQnxc?R>}h(*UNV zbKory&~*><_JtH;UeoDiGU#b5-$1Mx5z(j*weIzrR&;&Kz;%8fa>8JpI?2G9$l?tqtV2Z@6F0{C_v{{~kSu z^*<7NcDAM#X8#yG_uox^c>dvkzL>x-X`Qo&n2GaOA~ETIz6u#wTN@e}S^XQL=X$VP z=7lhY(1Fl(g+OqHuoZ>aYIvXP`0bzn{%avWK~faL4nC)1picNBbD+c7=Wk)f!U2jE zY5Yz?{zQlKJF&b@xI&#RsR`d6~NV#JjsWruhejFZQ%Be-=zoad<9J3S5f+itB@)cT*Vu zs)^uKs_@^zW+uyGU7T;eKd~_V(pIHIXae*}dm`emY-7-8 zV7`|TAxY~9N)qD~29I7{nD&{Pa&h4%%qscqN4?=oraEu+o`tu-Am$Ajy511;uN@ld zu83-AUOmhjGu#@~ZF%4%VHa6VcjXQj^;NGMI(NyA2l{sZ)8H*AI3JoYAIu(j@6oW} z_1!~@f6l^wiQ!9{I?FqEm>#9OLN5bZ1-|n|#cs=drzbh{ABrjQnOC}TdrxLhdb0yk zFi3*fVYvr9F50})vga1wvSFsSq!@gBd^VITUFgQgla`<%OEnh_M~Ybac>9H!O6>~L z+uV35cGIOs{Crl5pdQwMCGyk;_|_PUBC-k^qYEmLgV#KZaeQWNW+H=fIdiU4R-ST- zp{S;)EMNT&n;Ax%VdoOEkvHja=O?KZB;6|GgO(uv>MR!0itvnN#<(0TK&F8YixE`8 zMNl?J6<6^yJqYMkszgSgLqyaIu~GJjdS8>Gsb_Cjf5W$R*97(NQaSpj z64Iz;IU4#$1dEl%L*fW>X3%;+bX7s)QHhZ|wN@FvK|ckTv*$`aEJ$CLI)}J1>bLv2 zZb>Fv=`p+T6?8GgQ(?&4sIx2M*WJnXoiK|4SX3a2r0i9I2_bsBXs~}>1xc+ngt2RQ z3Ij#Q#2oR~6@XUo-M!;Dydl`Nq=0vfYRc!VknMdHaK9NKj_z^|{fI{ zHn>hCqiiIHktFZquecq&U#}hwvG6ulOyYFg&@EEB>x;|ZS#U6Lzj+|Nt+_j*glgXy zc!2@KqXQ*$6n((#p_gWViM?e1c5tMvkrQ%??}wr;GZ}8u`;{lBnO=k7w+PmHRfOs?8Pkgcgy8 z>3xeZ9!855jcEz+q;!*5F@LB(jDjr|l))z!^zfuilrlVRV8v|t)=YRZ0JNfA`>gPP zIw~IN1sI~wlV$^}bUc}@bue}rNrVO+Yg@98Vi{0{STLbysi_Cch38;Lju0Cba<+!y zcut>OSVJO8>CRu>DxKB#4vz50bG}uYB)q|8VT!iu2cP(2jFCsaz#)45VXq#$qpQOc zKBb!VmBNs8uUMlw2;6AGQ~X@xEa$SuiC*xK=r#~lbGM#-LwAw>nI#QC^%!QPZNBgH zrDDw6t2IwQ$~F~dUW z>IZy6e>yCEfn@N$^TVDukAFCbADoCf==!RC~36TL&Wq3JaQekCHn@gqH^9sW1 zJXPS49MnTyr=yg&L=yCXvKHtP6jBx@Pa}DBUV|Jdp z-Iry;K;|E|8{b@#Qw+X*0{Bw7mcjg(p*}&Xib{5N!o% z4r_wPBBvFyZ5C|!3!y}UA>nT6+A;fR**&Dw^X@3eKYty+)VK$*RU@;GGkV5jv5j7D zV?78a{E{R%cZk|B-U{D=yKzQn=k8*n0=sa?PIm}L$<{}5yZd{T2&aVK=$)e|>%QC3 z7-!dv(dSW)HRbQVgI0gR;k#_l#}NvIuds-kAmMaG-o+jX`gya?u(QkI{9K~rbaF2j z&*A)1Qt1>1J@)1^mMVsg>UNw5W{Onm9O@T{rC}6zQYj__GSWz{lWg46nawUL!x+`#1)Fwx$(ZF}GiK_a>>Z(0J zt}w5N-FRSn}|?~I9H@@Rhv+m5R4HlNSqx81U}y+L7Fu%F{_0Oc4*1d zP^*Dp(J~P7{~_%igDa1>ZPAWx+qP}nwzFc}oup&i9ox2zj&0lNI4}F`bKZSt*SY)M zs#~=_|7(4iHGXrBIp!Ec&;UByz680rB`bv5@Ajao>tb{5t+Ax&`fKKboD^q#o#-5TxZ~Z4j{B^vz z{Uk=b5#Req@{22t+fU-jUZC5(edCt^Ljk0Ip*k+o=~v-r!|%j^-7!Rd+9X`a-P(Xh zq`DVNNCKGMusD9|>PJ;f0u1Dl{u2rE;7j0*08V_=5l|mo1(*{G&_^gCU*#bdYJRma zi`%R}ZvdhXEVNv;TP`qd;?2cBo3^BD(WcUYbA^UkSC`ADdf=Wa8SZBt4{MDk+D#RY zswD+2+QZ0TVkuiDC3p(s63i6VYfU%_=KZS~tav0+T2-5N3mtM2Et5E~8LP#Fn)c+f z$I4*y`JM*lEBU?KmMtni!VT$+OGO>p(Fe)>twDR{9da$rCsHaGe8tEe=QpyAifuI(9$J`i7*lksz-8Fl1Hk&E3NHCtlu&A z+d+3@LbeK0aS`Z>}LD@B&X*d zv@jlE!fBtgdO)6HtpTgZQ0_tZAvbxyi;NMpBT@X9Cm)MRs$CI)euKTz=jcGD!N;?R zJZh7E15gl?TEfF!*zvB{p03Eq=B4K6|NLm0g_M(ZoYu;|dTN^K*hU3iYbqMJ7>2=G zIf7otTeIs_nV-*lDLP=q3TPFkwf<9SM7IQJ1;=6a!Jk3V^?RtS1czhTfiZr`4`tY$ z!tRd3VDkYpSiE8L(fbK6GsMB_gTheuoDyokZw9yB=dNXLQWzI;4S44NHgN*!%>O~{ zHyVu7pw0U2v8~SNNGb{^faIWED>tAn^nog1!jQU zt(A*dV)JEdZ<;IpM8Z0@zJFP$!JZmiPyYlo`L~6`y4=Wy88=@NB>m-|swASxMyqEw zzkTLiGf;}wO5-+T>Ms_!a; z4+g@QJwx@oum){XHHN!i%=P0ArM7Nv>!mvC6FMIq(S5;R z$?~pqB-Phws@W=7hi8SXYc47CaVE#unP#MW@+FPyq_4UqIW~x!+0fWn1FgF@xajk9 zmO0_c*5*YoF-vDqdfhzX?b!2Uh4D8FMT4>xn9hE(W8S@$7Yi!ZmxXn6%otnf z$kpUA`|@F?tE_Z&@MloT>PT{7K4*||O=7^K&*yCTNUm~SubORI9BKxTXV*#Rh*=hG zuFW6MsBYyjY?C}sRx;Ct2hwN@`%ym*7u5;Z7AT|OulxC^MozFF<)ni{w_J}}wqF|u z25;o4n|FZyh-(6Zk|A%rvsGYr5=o@_Yi@FIRqw{MhAfZ{S2tR_!#m90`ILK0uqz(m z1i7T^f8ex*l68O!Ef}Mel~rR_51I=q3s(^*+ukN^N|^EUACG`5BHlj^VDJF>Py7J> zfP{~4T#Qw$tRx7j8;9+GXTWCWg$U7QAlDa4E&x@U9Q2tS23Flc7SIjud49Wy19{4C6*?MAF=zC)uwxq7yir*8AGaW@M2WbNPTc^C?IPzXDfO z3S0%8$<=nzF{|X}ueMZW!U1cDKr=D#8PCVrED|C+iRd!GWeZi`4L%y4tCQEFb;G$e zRJjw3r*MF)R}T_wzl;i$vZ8`Htvf~rkS(w$5TfX)MIemi4}QE1R?a6WQO+mGau!r) z0x2GZHR*%ipnbNWA}J9x;ur{QCodc+wg5|iVfJcz6Ux1qjNZAbW0D+i$li&;)EUGR zs5E65qo`E9Lz*uvIafd$S-|CZO^b|p5n)t*2JBn1tUg=v%OhTsfLMzz>H$>0ejEix z9C*kKf~kVJf{Kz=4Mr}oG8r3s`AQ^2(H#-PTrBb!zKl926$L+HR-7F2UqaRJ94s zj%+dxjJL9;?9(3DzvF|-Vz3QN6o+V7R6pHd5EZcj-Vn|Ol3Ee+X_GxBUGuNflMrMJZ zU?MrOaH$>z69j`~B9g;06W*(4*Mr6zWV3_1mt3r_-@n?^8(=BDk@MG4xw%LBYKk@t zv!?tzuE`U#V2rtoeEsKGW^Wj8q;mYhJ=a1Jd}^duTsI|ZSI;>^?k-Sp0I|+B=|(KT zr^_4~ue^OlSi0I&Yk-SU$kw;CI)sKczW%FQN+N#oWBk#nG$&LR z32)L-GGuJX6Y$POkcAz#+cApT%0p0kYfor65KaDo;VKg66GXK~xbv;V^al><^p=T7 z@~nhb`_N98|=uYWde$(k@8s>_a_5^I|s+IoSS zafVC?K+O75lFSSOpl-mxMytZ#tPV5LQ?d&g9c{ zr*>~MBDo(~ljHm#8Q|3^V-S$Qf9J4KER|Ip`00FoWrb1o!++R)hRc0=GArHxlSRXT z`)h%PQlg=gB|s&O)nTny1;}MzHeezb!H_MdT97VhcD4bC_t!DaEtrqe^5=Lj47fgQ z9<;)nqq@Jr+=#*3E!oFM=8x{E8cdJX-feJ7e|Z7}I76mx^xo~=^WT4X(#wP9Pxj0!JP|Ist}b+)eo{;8n$sZDVF z(Yk}7SO>`=g@sYHfv5n+J$R0hYY_E=n^m+Xe47F7mETaZ$UwG7^~Eg3!2GR9`|tGc zJWx;6beUzd90MzAhmr+sW`O{n+ZX7I<*}e2PtL?dWseiWXg$&tk?-}I{;4NhMSf)! zac1>d$4O}I%GaqCuJy`zt>lD8@zRabKl6CE`~?v&xDBJVtCVQiH`)un0{Gye&} zZbhXPTV{OM?RDx@&*kaY#vbD7+^h((qzdXFa9k|j9;lWJcVU< zBPY2vCG{0`m?G<3$&ejR^rY~?A*qvmH5Zcecpbxeg5b8(!=Qv!zrn>7`=Gv|jF@}XkUget2?=25+y)6z3&UPXyt8qu@^4148^ zpku#>7twho{75D&GdI<|Woh{JQ{fjeu)7ZCI+ueuz2|n`97FQ65{tMU0A0|x3(es{ zJQ=f<7z^}|Xe1)9RbeUtOO$Wd&wCi+dbSiUQ;MoA8YLd_ba|meRcf@Y-P2uayxv6( z$ie;}9>z;V?Tbj=lUUUY5K_mp7oBH#Qo{(=ZGV>fk=xeoN+kAvYGXsu0PxQEzU>de z{wC)|I+3S3d0tat?7WDdo|5}Ie-wcnmIEloJP#*JQdpwzK?`{MZdAdGg9tTs`b7uK z8W<`adWItKn&wz{oL{6J9w*l#;Pu&?+grJ_Fg9;pBzRG9XeZ5ASDIj@6?hYIYk7#r zm7F70w)3T70jxz(6r;DP^HiG5WOI1#!Obfo)p1T0R27A*gGhi~kiVH>Bu3H|y4Iss zDodllB9;JQlE}eD}lIOB*`gVUtqG1Jb zN^IwBM!{9sr6Ub*$r?yBJw^ZaVca^lda`e>AYoEY24H1DBRmS7zVt9?PX^B zHp-bybE)hTKg2Mpr`CeNR6I$V7R~HaNL=4M?mpVjZUCE3>U($StG6NkCYvL&F~j73nqbDBs~ta_>bEU>%;7lf9C& zZQn{YC4956#lHK-lTZoJD*J@ra#+J7SiN=>PChCes0!#<)a%>E<6+8^?`ZHL#kld6 z5A~U6>Y11$xrtEHarK7!9Rqn(YjdKMVC73YpY22x7Idy1HZ*9lO^bB~6Aa3Ncx1hi zKDS(Bq>S*KE`$(r;nX}))XI2}O{E_xy0*A;k6c4iIO?NQ8QSL&BcX8NRD2XH%~Xz6 zCBYj5hzMG`cXT6VfU2MkAKvX}C@T@%#+(0)NfXrr}cC!H!Z*<%?>i z?WWkGzvG5j^t|TRCfdkSq{^7awjJUyP-HgaQ* zdk~8k7sBw0OsI@4(!Rn_f9WT?T&_5H4FbAWEv9G|v+5J4g|rjLJtyF|3%0I}wK6zUiRd zX?Z?*k73T%;4Ag^`Q8kXjV>zomBdqp+1O|nH+c;AD>5Rzcx5&_W~=^eGBckiKCF~; z*j#;AZ_n#@M`XawIpe=P?K>7ys>8@xQB;~yeX}X zj?@Rk4n4{q^ay0;Dv7F?!8GhG(2IR`f;Ktt*N*CE6pIXq)M0OYI2d!MFrnxhVct=a zZB63Rw`#?n}p+t9+U?P_^&O>fxSt%hl!+uSG%fbW@~*qkH~TDpYp@FSXAmnrQ#r<+ZgbIu*b;T5wna(a9|Iy_a}9T!TO zxp-T2Ivm$q;x)zoU0lcuMuq!YyL3hMtOMPl>1a#nK&!SN*`sdyV;l=;z}8BAYO_W< zr?PYOHk}s7-C??J(neTTb=Uz2_#Y8FqXpZr?~m3sFhbxC<^^I617ZzzL0SPM&6hsi zKO5kaZUw5@bAoE>PNgs@IB5oWUa~@*`0alW$*bhD&__TDFA#_bQk z_1Q+cb007P-K}g_Pl}?)+J@=8=Gfn9+l^MhFvY@14)Cl&)S`E5Y=U;uE)N~gd=hW8 z@BCXLfY}*h4e!-+Spzac1tq|VIlhxoCdC0)bOq?h0TUh_GViY;+pV}%VwspRZ{e-8 zl%bpsirNRG=V1mPz609~QN2ut13lhAGuy45yEu1X8hl~3+ASAe|U`xsHpg781i@79;j zM@tIM>%~D5Tm9bOX>0=(4S_lMW1D|5((r6Jz@jCta0X^p>(2hPA3h@-C^@&s64+km z3~b3U>^4A&#ne21uO5J#zU~^#ii~qdLNQGD)Cyyx?J=XR6DPj(N)f}UYe_%pNKV5f zI)X>WD)3;yA0XHRduN*7{pkTmfQ-N|1VfMl-EYh`a(;u<22YSo|Lr<(!^Ab- z=r2r~S%p3u+pa!e{ZD*7SM(f|;9Kc>pup8lA9QPHs?`H^e^&?R9OQQtONJi{q|H(L zp~L1?lU4hcfP2*92CCF4wUDs~-ay;Q66R6#jZnK^SFAeGQ6QR5`aXdL4Efj=Ob850 zXA?<05@R)SDEj0|epBIR+|pN~ASBNv*kDKO5&;soj5GApCm`~u<&M4Kc{m{wt@*fr zdRJbtDvBN&wI;r3)w6^o46YDc4t%a%d<8;ua^d1(?NyXLhVLQERk>G+&ZDP@>|ZjV zZ0zr&RnnD8Eq?v9_2r@X-s(wLbNO~RXmTaqT&lP^*SH`0oQ>6doATjOu+N_;qE&fMPPmIq_g0&;Ksyt2Xms#v{XJqBd>PiOb!9pEHA z7bWd#?2Xg_b~`5rz_f_>3i*XD`Dk-uclT){G@vl(=ze;ua~GK@a_=Oi{63vZ9Z`k= z-HXC^3;0bEBFW{0Y`n`i-ca2ad%Bp5q`&!0Z9fe;9ul0A$fJgAF|a} z+(6s7A3U3LmAFz-==V$J%o|U6yF(fZZ>xBpV)i&@ilw!o<^}c1@znOE=%f9?jehfx zo(_I%lNab5Gb-^!03X+Z;)8-o5=-Y2w$06EB>vZ!Pd?+k$TSML#b#?c)d!xv%S1oDNS9DrF8nE0nJF^8h~rQ)LO_{#3$snjIVW6+a&4q9OW~lj2%FpAK@rnc4k_X?`BoatEk|=_z$i zWGnn=V(r*sGHcgq0Dph|tB{(3`PXU0qt+4GDQim0Gnd`CWXE@DwctT7W%0sUeJk}E z%y+>XIhLnFh*u~z{*t9>RmGqD^FKBk9QJ&d{qR42un_#a*_iGBKos)N*;vfO#LVG; z#l0lQPuQU_p@#ZfIQ=H?ifdF9ZfgukBMtgpN)yozr3wrONks8vs&p`jOtKROp%>hd7uJ@vKWM7X_bBVy2jBng<&=e2cSJ3QT3we@;3qV_gYIAv zwz{>ZiRNgb5;2x!B2_kjn}2E`pJCeNDQg396G(iN+2PyevcMKDs9q>mLDOZpBRN(| zKc6FEkZ7S}Eeq>w$co$nxyWOTbn<3Cuz!BOeYEuc)KkFkjro~Ue}2_6AJ(nyWb=_G zW>#Um_$Wd$Zj7;dyz(d`z6EmlK}k^&EK=^R6&T`dehtT)m6LeZCp80YnyIeTcwDV^ z*mRFKt&38BEk@cmmCJ1W*dkxb2H8PY-&uPF>tkO&_V^9;X@^4sa1LD)Jm)m`T_-%( z$t8!P7_%%h$j^Iz*eR3v@XBMJ)1#zy!{n_F=)7QbD^4JtK=Y@JeSc0=+y(Q?t4| z*jmq~3ps{&B;+%2c!{6teLm6^6;?9*zxKDry=Ojv|G}?pTkQ$%e#>LH{+r{#zY3JT-79|BJ6SLoIT)E(nlaee zTd-O&Sen^NcFsY{Aw@*=h?Er)q8A1<0wM!bh~;$hjD6({5;P3%=Q=SIM?%7S%w2}D zMxrY*Ia(dX1xfZfCtDYidEDFQjCLOo9Cn{KQ{%{4U5DL{w!F7KrroFcjypI6zV1Kp zo^N4s(R3K|jZsaUTy?AURpW=l2|ES8HX+&f3vq`@L}ewv15pw==`jV-&|LuLUfP&YN4NCW9MYd z6jF#EON25P+?ym?kcTn@XO5&kM0(B5MZO#)>99w>2!UCEHG7u+Rv|g}LCr#0Nyy3I z<^0pr;=11%piYg0A=j~II%)Qkb?T_{6#XKC$4EQn6!Q5<8Tj{r`K(JU^fO9_IVdod zcf4KpzWFStnwCD}IF@f8vuTc7O39+9`PySFPzz!BQ_T9Ik21sQYEXRR#rtQ`_er*N zrL2=>UtLv%_2>;ryLHs+q1h%L>Pki_Uguthy7E;{OXP5#tdQe5y7dzLK$bIpWUnqu zcp-tV#?-Dfy+zXbw%)!g2bVea(jH))N$<(lVObm>Sm>#4l9G5TvEISP*l?Bht`}%z zbQ};*R2KY}7#9#CEx*$jJ;viS1*lcRF&|w*y_Dg7bn3G2OVD@2{3~hP<(8o-FSGD* zY$LB6H(^kpy|hzhXEU-}sg@eXJw$98&7|_wUE*u~SCSkqc0Zi)h_y2c23xS$RV( zAERI)zDnuo58D5DE}C7FOjV>K?xZpKu$-lhx+N$T z^0#@}&wEa;%Gab?w%D!B)9huBa#eh^`U%zOIAX2-%b zg*HA#T#_LfGeB6f@N*ye5wYvGT6kDBFk+uMUVf%%jyV@Eye*oFDs#%GJP@(D0LGEg zUz^`%i2c*veub~mjdc}a)~|KU543!NXt_Lz_?Yl7rEZME9Jh4TPUWK?#H=??H}yLQ z?@S4&-5vw111Qj5z6X$kj450!sGDPoZkKB{YnM+J4{!Bm3zDS>yKFt`rUY;ORfb5m zY_(fKtV@u9jki_fo8Vd!UPwI!| zc1)@2=*6BgA#iCn4@{oiBZbY{g>i-l<7X$&O(jb*+J)n%wjUUl@G;^ag69AA)7rri zFZG7b{W|VLqBA7d0jp;R?>&O%8SZ)yp)t1%hZ}h-jR-7v&>H=ruHqSN16*DaJ9y z>NdQIJD9gxp)<>E$qlE@2ld3wep@0Pf4|hQl;|#d3qEg^}sftH7z|2jA8U8vo6D;a??-{~ksi9L(%Y&76c>T)xrzAJ#!qwhlJ`38P69&Zugr z!#z9*uk z!RZ9$v=l>r|Dm2hQ+D!;5rx?MrAbc@Z z9{Kn>jEExS(+wt0SVJt9Iwtoaoz?O z8W&^9c7_I)nA~m`jDJUiCfxhtlfw53zqaR0&4$EP!#RkcPJeENm zwH^s0F6AyalJZUc5jt@HhNau2FH~qF^O_;OPIvoG^p46KZ~6!(ue_DyUQ+11N1)TE1wMAMqxe9iB!Dy0nW?jI*X(o`4eLa$t&_Z^#w0=e zYv!p+(CbBhY7#}o@GCUBZVLz|IW6vN;Sg_qQLdv?T=4J@jcAq#vmF+U{<*Cs>m?jL zPUDuMo7RjIaobi3k_Fz-eO?10m2XdBRGkn-7yf#Rq}_s9=5o&M^^k|NQi}&yMoSiR zO*5!38$PF*9-ka}5g&ZXO|b*`E73&!877^M0X^@ca%**C&!jI z1{`W87ot(t2)++-5S}2YihxsM~+Y$1VIl6v5km z>c40T*)VPp0HR%V#Y=cCqbu{SG!_(|3hhYn`-j3>UuSahCV*z}7aXS?I7H)P3cv<< zXN(2JB{^lw9b?O4XP*j?ViQPZ0q(zH-qOIJfT#VmNk=jAT@wsMe6G#aBRm!`y2PZ= z(U#F12OfVEhgbL2MemXt$uFbklTi)=MU>!fJ&<840S_v($yYGDR3#8CI^$&YLSqYv zG#baoGnWsPLhj|}JN~KLH)y(o3K}r%xsw}!{ zTUA&s=@dt%fkpd<1-oF1sNZcsR6~fZr5*yyP(x%u`hq+*!?FjK&?DFHj(MxcJN%*4 zsUfm8$|9yucO)ptzjH`7)&YDs&ZtL6C=)y7EO(&mfSWmrA)kk`O7R_FMuSzF_@UUDkf=((v>tz*{KsaI?&g38{Co2|}KyuZA7x zQH{q~j+t4GGt=##uKoSKP^jTe_#?70t%We;WtixP(izG7IdQ~ThKbXXUb9eZL>b9k z*(1oaQd4R|;}c(-D2L9KzDcv;5Jq#0sW79jg zGE>c>GV6XP3A9G-rn@An@eMUJN-i)tnNSs1G|QA$AvF4P4(MSBVWImpBdjYu`}mT!1DfPzE71AD%w76mY;3*6Y&eTHQ>nWTCnlPgci0LNe=jGWG0#p-IF3BHF zhpMrw9py;jCeX-sVTT;B?4=DGm>oESPy}H( zDyk`IENAf~dfF^CR&HGiGIPf)?IKBH@Shxx+=1WG1<~Q}B%nRKH1gabxUWtrS6E3Y z4R)^BS%XU(PT42{k3_=CrOK9$wrJi21%NB2jN>K5t0-P!nRlf8>?&PeVH>!akK`Bu zQ62722sd8QH(zn+U9oWx%ip|%Cm*_(VmMDor-Vqj!%(<=0Nf$e7$T_(d;%cn)4vYp ze1%yUua__metifxf+y@5N#44R_cizvH8n}XUNO=g%nU3Z0nHs@&#O0_g=py; zzr9_9Kf)AqL@`Uk9Ay1`w31m&w?IRg!X2}$1v!xN&WS%iCgt;a!c+sU)B~^3S=->gt>q5-N!IC@7+n z4{7Vh-Xch(7Xv!YrCqU5b=$2LyzkRv?;Q5G3sGvj5!MHQ+*Bj< zB@H(zxivT4&EU>W+m6&fV*eEMbW?~-$h#sy`=`|&hf6t0hI>QA&+upJ*F$b4+}XKJ zZC<6qk1!jD4(_y*CCeQA1Ig$6-MYAv`gOqRk@GGTzfJ8<0>>Odd|r#>R4f;7E@P^K z=U=S153Y_+GO0JT>3!?FeH?aIFqvocYsV~_XLvTBScF@UF294Fjo(9hHQEDyPmfkr zH=^nl(RBt-t&0;H5|nDg{;AgwP624}7uQ@-(2Lg`eD z!*T!Fi{(&7y+_3o-ild&pns4Bts)*|((7$a?ng1PGAo2~FF5j77O0EDi7Y!%C z|Er@-R{5u+Wg@3rLdFB0v`1r62zTtT?<}xwLs^6*nqX;ZSWzbYnCfs0E`%n@EnTIi zDm9_z4UiA&-t-`xFDOuEI*YtMcNtj#Z>ZNwZ%8rTZ;%Rio%EB!6G5X1+4UQ-Cz&GSxY za&{elCWn9QT7tXqK>cq1+`{Wpk6kla>U;uOU{*rK3S4!r9rv+VY!^*RPSx;S<)A=% z#w2L3pxTDsiQSO9>+o8x>m+2|U@Pzh{X#<9dl46d6*&el4|*gT9TA+&oj`{g@n$T! zc7}H0fIsA5hmLh@!7Ng&+n;x$L2oCbu9eHfyZufjTHV=I*H~^%rZ7vq)E91WBlYlF zz6N#u6qF<)f1T7yX(eaIWUV#cgRciym(vxR4i1+AUy|Jz;tQSShn3qH0TmG!lIwB_ zUWfWtkFzc<%sY!9#=v;d9bQqhTF4;AuOiMW){ZAZ-8p+*!j7)qcH zGs;?LxEaE8e>5RQ6t|mU4q@iyJDNg?il;IOEy`kJ_H~O0FY1Jt3`XQ4F?4c7CbrTouN)nkt3B_*BD1p8{NhMMBh;qOr>5z&~@bPnDpHNp*6|2Xl zhn%+xdB7&BE*_fD_z4E-FY-TyE~q)l0cC6kL59-yO_jDG0}3(7!{0o^*-I@{h)fr? zu90Sw_Yy{<&eA`?{!!YHqqS$=z(0OWewX+E{#1&H(LO&?EEkgA5zu+~*w4NuzJpHD6Q2L4~KJiwgc6-E~#?udLs z520=Ic>RFG8OnK#eyzi8$O7mO?;GMRSYyE#=kY8JbH#KRqC#Oz=sjb^RM7H5B8LO< zHAiQu0z=ahvpFZH67z(ipmbTDwk*K0vh&>2D`3wfJfD!VNgcV-XSru8sgBo7>b!di1b)Vkc&Q{}!` zE`_HXZLYBqdXA19;@X^!#oN!#O1eE5O@4E1JjjBZJr*o#Oe)aiR!>(_s3L_Lm9vuu z7?|s{Y;WMQLmGp;?{;*Qn<>zPr;G=C`_M5}ReNsQa~@V#>%kh-*0V!Z?%uS!7jD84 z8USd}7*2O>a2i!*z1o~qK8|9t5OqMb*)HBIG+Svqs5KkQGRk&#Zt#4nyrHc1C!yMJ z163;@K&Y0R(0nN}5q~kH#qax0W0KY0G4!6K9kv;X#HtHYVdZm{AC_HDCd=`Tn|D^W^jmY;={?2N`ImOlGX}sKhvvY2~cO?KNb~9QB~Wb64@*2=c^5 zPgFZf`XFew+kJabUDTRquykCCQq2;K%Vg=Y9r7M=#v<`qi3CTH1V?WRktk0XBYj*s zYM`Dd1U=FdBfZL!27n_VRxKd*c5MVog>V`sb!Urmz;@AJxT>0vPpC{=$JF>XuR-;IpsV8C3oce!B|1GA1b?^ zZC+IPR~2O<@~<)58uhRD#VcFyCXJOz0b1pSxQrOFk6HhrE_b~RIGnvF0!#cgm7;4T z|E7Sv?yx-QH;_&3f~ER^oEY&cVHtA@?XzV-TTS?o|EH|Ww-!lkw*076Eccj^s*avH zb=?(*+Gm~M;w|_K>F|qb^*Q+ZTcv&GY;_Mb=hFn`6HeRRPuoq7gm6RjJs2lv_Dm9zb9Kt8{@URRxp@5N zi!Er(bn5pFX+hsfo&O8g{&mQq`ggGQ4<=sL$kX2SKbiPwjdOPtHN-F5Ot-|#r@lG# zaSs;2^@a7OLNUve>CAW%Fvzr$iheQ5KH99FIgu1{efWB!7L z#<+)qQhsXL>faAHdJN*QCeC^s)CR2Ck>oHpwQ}VT&9w)l{MPrk80DDb!N0@1)`L?_ zXZ$v{2w{43E^hfgwJ(;(EGxxg+Y2r}IE{sn5B3QZ0#c66kvvPxC{utcwWuu!?AzL? z!^)nQh;F?)Cu%8?teTOW2AC7}37+y&Apgmd*fN<2U+rrg<@e5EFJSVMr&yH8zb*Al z+Hh})jWcdx5{r2JwA3Y#osl~ki(^Nc*Yb#xqGQh|E3mPL!aI^py4pD6NIxkadY*?6%0f)4C$Ae?YZ0pn#n+)AaQ?#zJaZ0~LnZkHo0XI=- z#s8+?1UjFHkynhYI9bbHuU#{{sXtzU9R#CwP1Flmo5+y-6zXCJh#y1IdxNwe%^Gi2 zKRh(%@ap2Ws}i3*;>1IqK1`oGCh}-<#pj^ccH=^CYFe}dH}gT{1?XMPr6;5k&@Ash zL>Iw>Hm3Tf8;7;)=7*vqqmofs7A7Wo86=r0`_e19vHZaLbyFVTY8DZW=TB_H(Fxkg zU1HW5^fSpiB&JS!!rSOL!kL+VR|PA#kHUmN6^lUx%~5OkxRtm7VZi1jwT=M7^x08u zkPQo@m3}WYioro;nAmRY8M#GlBmNfcN?EV=Nf?)AQ#hc-CIt4BDY{xQVus7Wt zwzpAjFg!l1-6~fW<*m1?e8p`KP`B2o$DAL2wl40eP410zGhRGDFtm39p@F`WI`i~k zd<74laCQun<<8MBh&)5c+>ID|ix>{2$Yiwppi^hwo-Yj1CM?b%SeFs`A5pOp=I!DR zfTuEfClGmi@`!cYqQ=QME%ng!#UGIe-*7J>qg@}uL0)4V5G6ofZ?P{AD*0meTrQK65& zj7CvkgxofA|Dy>(DOX4&M*Vjr2oknMm{&^ajKla*Wu4rrsKNjx zSSM7j*zTcsUIY+ED0MnUIW^B7NVC6$RHl+D%l6$Kq2no7eOubGWYeW2TZ~rBvkbSg z#>r?=LJV%pyj4`=suoVH0=PBiC`x6ClxM#?bRzHI8Z0&ph2#u%=kJN#`gBxD~7NzPc6 zL(Cs^o|4zkERW?9F7XCbIs_^!ej}itdG*gI$F~^t`}P}y^PRP{YergwVQQ(7ZkqB= zODbRgF*6DbWj4@&|M=kw_wQaHrvJYe=zrV^tDef^XkhX!!+^6OLO4hYW6aTQ878n6 zMS=jq7RqO%TBVS_mkvL9@Xj)tOhr}P(S9sbSQag*RxLoBOgunoKW@}nLstSnk$4F@A=C8z^nNYFsuk<&g zf>F7Vj@ZF^Gw~uxdbC?xE!ACl6`K&Cxq}X>1f~a>cz2t>jbtp&6%_T*2U#9VUl2ENSCSzqGFHLRd;N98+u6>Is3_=U!;c7%7xFPLhwNBU~TiG(o2rV0weN(Z<$Tw z`$|hUHfLF7U=w?1HC0^$1q)Wiquzo98{dw5>oASp8ESAsexmBkyV&M-&jCV%Otp`0 z16}iM{sC_M*aB_j4%H_nKS*pNYPT$iK`~-CJ?QvZxsM+n)hDDrNCbDtp>hY5q0obB zhz9I>k1z1zD~$%owenGY$hmTf(Rk_4$K6g0smf`*4)b!2y-zYX;F5v<`Wqk=kd?Id_zX1w?9nXoiN$c9>S z)liLvb`&>8a~W5K*N{p5nL&C&Eu}2+om@eyIqqbH4ap%H#9$(OIj06O(p$g-f$0;0 z3Jf27P2%gj$Ao}njtAjL{Faj#eIHx@?|aUFJ4*kii{kLCYecav!KLZc>i19mYhqbX7gyvYtE!-!g>my9;fy z)-&x7pbx6gu;#Zd(5dpOirQ9-tG45-jv4-A{moOIHjZnbV<+y=)DS>lj3&~B9{b>NodYz1SWNNP)| z5C#edia@kOT{TQ=$Bk$cz8G)dx01X0wxRz1k1`*k7Ggs4lT6rmuY>2=gnhO`!Tbxa zIrrx0bb1@^Z62+eTbk7uN|%puwZNQ&hb#)<&!DU5w+!d%zh3fu8F12e=_|2W ze^QIGFr-Tc`Ha;JbI&E1VR4!yQ$UTEb+@CdVQ{BAy;p9KW7A=!d5;A99uKF6mqKAN zvfvaFVIpE$4uY#QTC&AeUC)6nV1zWsxY6A^cr;C@{OBNOKp%{ zvE-Ui#wSZb5{nF{b1M_TZ`)bMlZj<-jiwot%IkFi!MaHAJhM_-=s3S|_{Ie2$F&c@ z`TIg7ILTB#>vUpAzx^bhfz?NvaqNdqHqx^Yu#J@Dt;1Eavt}x~fXz#0Of$2;gYHGh zLl+HA1_w*A`G*1E?kS^#TBfoaBOoZLOy>Q4p}oD{%t$9+765YW!+O}oHWOfsl>RMb~s20Vq&f+M=*A(iAgtd zbDAt$ES&i>>wmuKu1hziIwK}DLE=DpZ-+|){*~xPREmmfB(h1X{xoIgyl6{YgXJs2 zfgN>P=B>OGrQ(B1%g^hGJ46L5v_mr8{>+J0&i8Cvx-=V$q9d}t`;--3cv;%a7iC(4 zL^QFgkmWiXvkIt-q<=$fcmHGZ_lnT`o~Al9n6Lh){u^2X4N1pJ3&=cs#)>`1>|f!; zXHkNL0}m*spz9KfXaz^m++EIL$!F%S{VYABLAB~1A5|u&Z@P&%^MG0d2Ox~~gKCy8 zyR|evNoD&P>9Z~rS+jZ&nkR6Y;v&S*-`a{Y13Yv6s8rLiuQ_Wy{Wg2OO}3`y21HHu zkuI-4$>C?WWfJ)(e}{jjavI|->1E$Ph-=m*w${?tEoqeE05>tZ4{u)E zAEqY0Rpg%C^Y;d1`zJx&Z?d}dLNCr?Do+e|yx$ih+QlWd>Bt_!UtuZlk$j%DW0+{J zQI#k&4r#^5Wb!rxl%-zwUys_iF$J-@3eBDb1v`T2Tht#2ZF}|a_&kgLDmko|oG{cb zK9PaF-!|O_A8`LbtIANaT($2B+2X&U)xQcZ{zqGg|5^k7Q>XS1R$I!>-2OlDO4-^T zSqYIZm1A9PJY`9u=?_J1kzV9uI9nMxo2aqCLfndi{!TrumfKi8X3tBeEG=8cGswHr zo-Sddc9k8wg}KF1PI`lL&)4%EoRH1$Lc;K5PV+kKcScUXzHP##||1Npo#J$wUtu zwveHsLr#MgekJ6c%bn&bq7|*Kb{cIKW7krQ2Q8KOBHepl#eE%}Tgai886CC-WEa&p zUc-UsuC3QPFfx8HYSH+Cj=o^QU>aU%K;sH#)H z%&bhATpqE^?8MTtVmq?p;kxi{4iV)j82D8_0($?#>FBTc$K?h*+}(*^YJ5ZvD=Gv~ zr)vYp9k#;~Y@++dNB467syPjLGG2@yuzBl0i7x*uDntKIJF$e496KvL!+(`Y#;EF8 z|LA+ZZQZ)Keqs?X=4kpP5r#{w*T37EMSNRT(KO4Oo9FJ?u4Zh(Ox;qqHS+!Ms|d;g zkc@&)qX-7ZqL7<_4WT38gz>!T@21gr9+$z8@|K)TQ@<7WNl$!Fw%&ezICH&bE0t!3F3y^OX24a4~H zElZtJGh0KIiRx0mO>+LW+>L}_0*uQ$t>ot}08iwV1F8Pl0D(w~76Inc^3-V6LADEC zgaL0UFv)I3>hjcFO_Yr^U*>a~&P6X+#V+WtAY!d;|Iyr;tI^bq%aEy1E$d&9zfpJ!#vIq`MA-8eooZeg?~+oTM=bZm z3>%bL(*+ha<1%>3iM1&|Gycu7_v}qrU=sC^>N*kmc$$fD!{*c}GJc`mw+0!YC~2DN zion2mSX^pqL1|K210nnSQ{}hY@Un!VY`TYGr;=x8GbT_B|gZTqsi3P*7ON& zQPc${Tcpb&Rz7jG6%Qwx_*3A=&X}xmaD8rAIGP0pDI=rq2qwnGZ6w;LiE+ZiU}C~3 z1fA>zdx!)^nSUA9#RL6xjlv6whJKL5;bd0OUX;yDohc1J+g(N zOA8LPGwa)kG&2h=ZQzz+t4;%2Jek+B*fs>>>C~_qCda>Cupo`wtF~3_@%k3d zD_p^NZp@W#y`7Q1Dcp6Y*@iPV>Ie|(sI~p;mM2rYe)&})!%BjT4RI?-BIzyY;&J{p zxlOVrJtJM0Xbdyv8%IbamdGTQb4)!%99JQkQ*gx!lH?G|QyiEpQf9PP$Tc!oLkF40SZY2vXDdqkyWbtJ)9AB^nX*4C0g0JG%#^wt`mg$d3JZ zhcKAJV$D#sFw5*W$Cq~OW{$JSoMGW8pDUGgvIr;*1q|e50T71jN=-+WnxxZDc>;Jn z;Dq%}KaFzxX+QUatZB%sVC&&-uBt5_-6Ev`z?WFvh=O?DBI@v?`#8UK&4>7UGWt`Y z|7LkFe?=F1jpl{5HNd-`1CcQRhNF)ZWA`6r565!==R2VHEr|MnF?z*u_=JG*BMR_K zK*l{K^fxlZfNsd-rCk|7b{PvdH6BJi6o#Xo4?{A9CmSXw6#*<0fiw#isoP~@C!<~H zy5ppcz-p)F9q!skt&QYzmy_P}x%-6|F4j(pd(f$~l7_%vB))K_xhs;!9YA)ztf!AO{YIV(b&5YNrx2Z=#GLVLTlmlxk4E`HHZ8DWYDsNirB$Dz71nICCi``T zu%pnrB5$P{9+o_fI#JPYm8?`o(1zH_eq%`bf!pQ7*FaS3kSoh(2%%fX9#Yd2fF6VB zD&2=?c}bR^S@B-_h}-RU^_+LNE_xvAWpm^Aufg9QlCqQaqdAiLN6it*KMj6qJA)r> z=YK32DQYop$Z9BmWg5q&Nr51s3gF>W(It7=o(q1th8+8rL-)KY^p5kr8KFLs|37a{X$Pp?_TNLKYQ4I;=vjrMx9)DvOfO! zyj-~5_%P*tzYJxOi*fNTBaF63219Cz5hZe_^;H_tVdKCNstgaH2x-P6QPQ54hZY$q zPAOs1M!reF=pj9ORiw(J{aM$d41>Rtw%$~0W-c-E? zMB<&lBKT5=o+y6`4?PG@$b}@MF?W~mkq{i1QTo;%m`GQ(Q$PC^?4@z~hNwAf4^$bt z%M4u@9#uxNDSv7P*xBpf76ba3Pi50{?VA!VFzj+R2pjhWs%*Ow9%VwjBxA^FK~e(G z(t=D_fT%Qx54u(lT*n7q?X_n}vTVo}&r4_Sl`o^W5qXVZ7O8Sua8!)M+r+BJ2C{%i zb`B$)mt&?&wku4=grHQv9DwyHGm`3mgTg6CU$c=XY1UA=_NHikZvGkf+wa zFB}Y|GMU4U((HxcupX32laZcY7S6_uC_=V|nCpd^>4i1d5n28GgBMc~t9~s(Wm1+y z4|i>=iJ44-%j`u3F?r>FX&lbTOh%U<_^sVt&d+B^fCJ-#%^7rC`LA%R_lsN40C_d<8`)I_QM) zjxGN}Ao_Y?c@lAa@rtf9)< zk>rmDKH79v@%#10V1fjPYy5qDbqqq{0*H|zc34UY+s}GkuT~B;d9QzsxHvAxzG+JQb*{(-!^IbQ0so@)#Daa?Vfplw= zb&#G$sEI}>(@EM>kbeINC(u7grWPDD(hPD!{YnVbk(qe_S_m-ZX7Wv4^fwG`%GeCHGWc(=X?^gPgs2gOO%uOwr` zmxEWi-`qiw(E%6fY_|ZgRO(uViYUxSg39tzgEava$yPBZ*;baNczBSza1hXzA?5k- zC{ry+#NZFgiSdFZc9 z--h}CZfn1Lvd7dS1N!#ubXTgEs+)K{GC#sb!{JP57(;z5mR#Sb97bfy`g)|%m;?=V z6x1em++0dHL2j}nnKGIYp*1&oG$jmZuJnFiV{{;P9dG=keqD>b9&9rj!jy5;p|Ybs z+wOoY8q~H_dwXnOeGLlqnXe9WOiSgHi-)9%*vvOdm#OSEAE-mHiPdR&r&sN_#vL){ z*#Sv4rhXuj)NSHX?hRxdUGFTo4Tc^)hg(E1d*@Q(Q35Pvq&Q5{HlU}4ROo>wfQ($a z9d*h5(Q-hucaRh~nLww>(jSIDbQCq|YbE^<%K((&ndaFSjLMWvyO`gGuC>DZ@%S=9 z+r>vGFe0g31TPs)x(b_ZCkvU~+Z{yVXEj1visvcDv>S6hD_oC<*ThGh(ZN zor#QJcf?7#k#G=WSDhIC73;{%4T?QL01IjJw zMUWROr6rh%IOxeEmFyS4INI`;oS?)FcEiMZy5OAgc~%Ing;xIsMj1{gY)>y`;2ib) ziv?Sgsr;#KPYCqequS$qT!_FMb(sX_z6^1oAjkS@ix{rhb z)9K}doo(KznJN6G)vW%74KS@y%1g5irpkl)*lrUCF3)6-@a%K9JLuK72I%BydvCN1 z^l+3T>f^;{D|~Z0NKgMPmO#`xRHM+^09q&`bix5u`LIUy(1COeSvoK&04}MaK`thd z3oa_3K&}Yj?7#?=_&$ktVJmX!-u>bMB1?$_3R3q0=^X;?K2j~suEf@W(koZ)2;W^a z@S}ky_p~40`&)}k3dceil6NQ3YVR1CV0uUw^xqK)Xn1|R?+^j*krc}8!L-KlHVsn9 zU81cUdsWDV6Aw}*y|Bg%*9b=u!Yk$2S%WbDmhm8$uwa+4K8^AGBld`R#>sxxc#@V>+Vp{_xW(P2Z+u7zZTgEWqTBksD zbJZqxPN=Ck$rM_{$vL5-P{|s{Gzf4rp_&it3!UUzrn^uQx{>Nar>u&vm>Sz0={IGJ zyFRD}p4eZ%kR7 zKWYW2`a&uF!WiRnMzv7uTS{2d2Wo+`CTi=6S>I+%ZuzfjspQ8?-`t>B73!C3dOa@p z#=CgV0V+XT7rSwkR{}Ac4QTkPFEFxetgUO-#vRzSj&WN@!7QeF1L>CykP$M~gksB? zz37gHjkQ!x^XDAD|Gj!3b|i<8|EK`0{?Y#O|6}zqlm0(=tg@CG*3UyT6qpo3D1g60 z#1eptH~^7KrD2#djh`Z!KYy!x7ao>?c`A6kSjXr7zFJC$w*~G=C9M}ZjY2go&V|M= zdGbcOHkscb!O8T->G}Kl<%;Lw#&7mJ6e_J@Z%6~$V?Ofb&~ZBI0$ug47p?{Uem8WB zFMcwNH(Gxwj3IiG3jvO_nBii=>o-}*CC-*Si5bw6wpS=+87Bz zXh&Q^NrPxamzCmj^O$t#;@B`Dq5=g}#IWJ1P@#_-F^fjSWk`a^Vn==#5;zUHeKdP) zB%_$Xw5bbgP&0Ylq{mcSj^<2NaRa1m^N*}4vh#GhDq(fm(`zeu+0^gloZD9Ml8_XL z*>s5SBuy*PHKkA*Y9YCp$x5W+Dd+$eh^k1!FwL;Uz@~sA!11iwZD=_m6j@Dt zHdo;--a}3I_=aIx5{4!dlO$93*hlL``Vbg zFYZMpkoZs1QdB0$vv6&hL^(4%D+g|9G(57iQ~{MGTuLJi^6>1c<>ni*nV>r>UW1J$ zY*|QyGZ&0z8Qq3X>Y=i@3q~dQB6T*gnWmDb#fz#W)0*}%K&umSDEa%`8}_io!d0L$ z&9jTO6l=cCLf;&VJAgRaRw)~FF>K*3&B}+H8449*fzBNx9zz!Sh;;Ft z;qrH|)31hdVb?;~k~>Ab&uJRr(qG?i?r${VmrJ2It~O1NT~{}e)P>7k%HHgeog(ZU zH_kg4Zy(>^SL`Q(7XVGz9_4LmAn2qU@I2dlk=_tg>85fG-(Q8;pKpi{qNum6O2L6{ z+0ZxNaQ}KGwFwjxs{cT;82?FT{9oa*f253MgoUI`JbupFMckbo4UC-scK~{ds+AIw z8L}^`AS<<12f1N4U?3^Ja8-+A1q!?t^Df8|p^XcKR3m(&bJN~}S5@n?X$zVb=ORYg zK{VdyehG~1Su)so$8IPYolZR0~zVB#n=3Oihx_rG6 z3=AMh-QQA>aeAutIA%}^K~B8pkafIJ)PS%n+#6kgYUQDtOX(anuM5*k9+O74MNvCQNVg?a&~%Ja$;q{q4gFbLL2R< z5oZPM7~4#Uk!N=f+mfN3aIWpFTxHf$QER0l%U22QsnRR*6(cH@4#}2@2cj}-(V{WJ z%}#=HYlxCf+^6u8OSG3cvTF?6tb|lrn5))WZHR-KBZ+Ox;^@!55N`py6cD+vPU2=$ z21Erf#Ur3DRdQI-55?5hqRp=q(~Q4)ozlzXB*x!dO`w^GVK=Cy zvaThg%Pw^{7g`u941Y`fvymjj4kIROyXEe=|;-fGxFU7u1Re!{PLqKaHi$8yQ6tbcoiP! zFHoa`H~Jmt^kXF_vo=TyJkLbpEbthWA_^`s$FepgRy2w3q!TE5OeZ2w!=M#-P$skT z71omPQX|_Ov;~j)1n4iI2zg40oaOOcL#QX4jk}BXb+XkOkkEcNN)5v@i+RRDt7@AMl{u93%#-M6svVpEW!U5Hva(fb;Rm-x2UC z-Zk95B5A84OkBB^mSEwvG)Kxg=#HSEsNH2m&fbAk-8$qD%=ISk>NU^>_p_kr?OCDu zIqaF-3PHWfq$kM#*Vu5V-Xa0%hs9x~X%lL6TtI7@l5iuYm}!?FZ6Rl~ z0vyn`QO>QJ;rN6-WXDri{W~x!^VfxHyJ0%|cQA)!T_)h9*<}BHk$x@2AsjVy@}&ad z7F}jDw3eT+jt49}Pug~3i8Q@`dv5p!!->*7$%v?Q z(}s1yCdy_0UO#`=FZH%v!)JRGHOQS%T#j~jjt7KP&{SBj%l$TYu3vC`H~+52)Lp_hbd`%xDQm7ueOVOv{kR{8q#i8|mk=GW8i0hY@|SQWl@V>QTyh6> zYkvy=~^e7{+Z`G)7nsS|EOBhdErt03SHh;kaNp*_us$HYG(;c{MJZ* zo+_yBGeE7%;_;R9!L<6!WuCxVP~X(HM?)bjb+MI3k(EZVc+Kkh4n(}U#z?-UxOw(k zRQJRAdh$Z3+Tgm z2H6v^FjPGG6AWxR=Qx*T%&>Mfh4M`R?FI-V_B@Co?9e7{JQj!f*d1rRe7Ub@ZRYjK z55TSfxtp)n`9joJaUOA~gI&|H+IV zF$TZR7oI$ghfU^z8S&BxzLNQ{PSXyvG;f|C>Tl44JQ<^Gz{fFDw8rT&OUOWh4xQtt z6KLSTi#b%(2g+3BF7S5>2&Ak|M;HLyA<{T_t7uc}yqdqQwx9NNcb9kBpYs-xmUXUJ z>A)5|szewDuHG0#brP+=C)i0gC*{*JqPOrJo`$Q#rY3vhrDAq_>jDFA)N@W&y>*I5 zFpBLjX38Q}d*8{co#|`u(T6*?j$_dlXt|zI!0R%eJ?(K}t%44PN#5tb)n_)4h-~#g z_9o!}$h0y26W}UmYwaOtYh)tg=xFEopVAallx@_I#E^YO6RjJm1q&7LP@+ca0ahtD zRH;!I%$X5k!g2df>oJD*8?o51tp5uA_5X&Ntw>#j<0;eoDB}K;p@T{(@JQUjFwrV=Wjk-QhS{dyjo*>=8(W=`mmhimqw-)XNCpLD$8e~5on*Jlh7!&tt3;~ zUTSD$s7L7cXj4px860NH+c{FGpiPXO{p6AEq$V`bsFe&8^wgU!*`aRx)OM{tJ!On& zPr~7$F1rAkw&TiKIFHGgwi`EDw!tY?3>{PP@h52x^a{2dwezZ)aQ$yJZ33$|R<|^d z-LaFk3`n&c*dUdMpw!{bEnSq4IS$@O1`XY%2%ArBE)wONGva51d^0G#PZuzHdRL4pBXOuhPCNYnQ z1v#Nyo3@bE;XvAVb zJA35gCG=u?5B)@qtD-Q63i(x79m~!o5A=|rvHENM=+fu>E@!W*%TN@ho3J8HnsTLG zDETAxM8ptt_M81U$}n5Q3NSCk)-stAq2qR)1JFX7CFfLDgQN{Jk4u)b%_YnHx1=mK zZbAORTb{hym~}q5BsbYj%LqefJmU+~`E)^VM_3Z&-&SvsNw@4me|dxOZ6DcKh(q$f z2!4T`G7+0-A6mG>Ray=^Ue*|l5ym|3Y zU6xNLZWys+k?{&@-c4s5MI>DUHQW5sSdGG@;e;Xul z>J?T_M$Re+XWmkfdPhR!8BU2^PY{brGGs+(@F?E{y@iJ;{Q2E)Moh?(Cotsn7?hOx z46AT2ap$d_ov^Xu+gW>6a3S)Uk579AcV~$gK1u0&j`Xib0{@JQhR07=XZ$DK#(#Yz z{Nt3D`?uMZke#jTPcYj5;Z!uCyp@kq_{f+tIx?W)K?8$<(FNn_Jp#xL-NAw9_z~l8 z>A9094@oi7r+#|?2R?n}Q_3q;1;X88P~ihy!j}+QhO}&MyI$DZs9g=Ix^-Q-cDZia zRIPl^y4^^Vj^nT3ZF%)Rlf{hp#x0mN@p1m%&8>}y@Z&p`p#XCLrG z2~9^ZkK?S4_C0%CMAnqdtYd7L6=N-AA~j41I9qmwK7W>Z2BB2yKpU;gBRtCWRz4M1kpFp6xgvjd8p%RO@p-GY1PnnObp-Mo8fd>W@m zY1Hw(iEORwJvG|wF~@y+)!mV7ZrPo83>tff=s}3AZtQaPf>n!d-2)g* zJ)$D3;Q}m{6_!864SMR+m{_v53EQoa7&d|+!5h_gs0nbLrxFwc5%7wlqr%d<;pQlKINTibx6@gqc&* zF*8ETY7~hW)rrd*sF1Cg3<3C*65b5h7c>jqPQO`;h|z6(+?^zH<}H9TNb`(1HxS4x zAi^{OYwp5vp~TX$n}7=Vt!a~LoF^4_A#m#p5s@ zh!A?9AWc(hu`ZXPt0^$tZ>d?i2_K+Y&7m*}}+ z?$tPgr#IO!y`Lya8pTHLfcD@3ax~lq+OwOV zvX3ZWaJRcoXr|9uSUR!NDNgJ$*z3fb+p%RfAPXDrZOBtM#coiH%|KXqGd-h)5nXv& z&$IRw45Ei}7#UCvqndI~33%iO@3lBd|I+@vGpF9NrEqaMMd$6nTSCi;&!eb&Os{m;&w@GFFudnp&f&BA#f@Ye{joVk zvS32Vh^~lr4s03TFUb=aES`qPX1|BYvmuAS-MFDYXTBWt@a0Q{DT78SiKK}jw$+Ap zwpcWK^_tDfv!RM*$=W&~hd@*rNQ&jq=EFrAL})USM}?}34UQQTa3y-YtHEgUa~9TD z>q-vc3=9NnPsXKx?%L*`j%R5bZ5L@6vVQX0Kfodh0ZfvSon!&ij!p2(o2?QLdg+lw z=?YC~ZYSkAQ&JHcEL+9WVlB~DSyoxQUbEnOEPO9ctS~^Qx@*7)@^=W5j_m^=6GA@8*A_OwA*b?_}bL6vht<a)*u2MWXP_9V;~wCgk5`21)%wcX8JV&(7B;?# zxbXuAXKPiRa@7PzFh~!e{nAb%#Pp__@sDk9ep%Nw|0I{i)l=OIXUY&A3(p;yzfyQz zXS^BMA^J7UK`n|PRwbI_({i^-U$85}pk#bU$7OFA4@1zqQEN<5xoQQ~Y8saz!`CpS zizJctM`mxS-!qfS9_gm;Swo>`9jrZzx96#YsqSNRh`N(ZCC4)pJ(kQOk8VsUUpOk0 z)3bMM?;*UHkVJ?PZoi`kIuO9i4WZ$$Kz ziRWXBz10#R@wTC|S>Ek^ALLDxr^d7{IRF4r86fLLzBplCZucpRF3m}NsV*JZ={RfcRf?mWGv7K+|cxIGq z@lz;9SnnPUl_Di7CB)`!NqWfX?h`V6Y00#_e#^o#8o$!Ps{&FU=ozhmkbRSo$iW|a zhRs7Fdkj#HDcr=00#@Sv;~XP)Cm_}ZY#EZ%+e##(Ra-GswFM<~8{DY$DbZK53|>e9 zQgnSKew~@LG}YLE(oLyV#eNu7$w9vtie@#&r%Cw;M-?xK`NMJA{7qc}<<=17=QzxOC`Udk`Vf;zDMDIB_dPx&G( z9M_|?O>&ubdJXm1%o0lVrLME`yWl4Vap4NiEkEEc1@`*FlBwQOBn@a<+^SmUOVNKb zv1jS<-619yk7<+z{Q?IZ3SZ5@Vp{*_vfY>lRrY%+A?oXCJ7KbK$%VVb?305hk`~%e zJ~1ms#=!$?A+6jI#~+@Kmc z<5}{Pl@d4f2}kl3^u;eNRmo@mf==3SK?h@-MlDvIWH{BI;~EvsERX%DEx@(#F&MC5 z7ou4O1k*ocCnjq%yI$t+g+aDCMYAknr{MXmwgawolkgrG*X0;DIL|en#LW2aV0tF+ zz61&MPx?_nl^ly8Ux^f7WGUUg*3EJ4?gzby0t4c)Vz8g++8ubni7a>tI8b%x@p!y5 zIJ!S*7G4`Ib(xN1Za89v#yPN1jVd<*iNjy)j5Az{J_wPMvdE=<@phePJn!OgXR=SD zz!`b@$h_#Zzy*O-XeY}R|LkddM<7R5He+iRsCYm4!l$oN;sPBi`b2_3rOK_dHl{`2 z2iGEiph7D^K(&tPy=JccsQ|a%bY4Wo5Y0if1cYQ3iev&7iX_WeDY89oT6WCKznjIr zaBC&da#%b0Y?z}P4?TnLg3wj=rrpgxWaAIW!>K*N<-!bQOTzA)vjCgZp7(Nu;^vB0 zMmPIg4z8YZD7ji3Wap_4t#8*Ut$USvic{7pgJCKQ$x7Ui$KxK;`2Rvrlw>d`(iS-| zOVu1Oxy&0qwlgkCeFzW)SU}_SlQ!Lo@bUoU!l-gf$YrS7lZ+HTDd+_{9%mD)Da}Jn z*wjzgpKM0u7H@jLJ#SuR-AIrR+wJR5&o8yI}F5Ppd z^&e(oPDV9oPN&VMvR_hLFs>}IXbwJ}QTM`Q-P#@@q-0K2>?`E10cg2hfYyBaQ%twzaa4L0|Wv}kIagvyb{lma`0Coaf= zrRoay1VHu=j+Kuy8N$8zteo)fVXoZJ)#sB6kr1Noe>ai95>#AedE;YQ~}DPG+n?mk^U&-oBmT3E#>If6}3MVT%!~ldNw(A2*vxwjO1rc$0a z<`PXYvq&$iOeMW zp2Vzjf@G#0lbDOPR13IZ*4gm4@@^rrSeZ)JNF%u_zb?%)MU;1)Wi5fk?qM#=l2zt{ z#D?hnWXWukOOMR%OLO$J5D2uKDKIkN!^R5y)jIA)W-s$c%-_m%mq+SHKZ;S{g2<^Wkl!7N&jo|* z4Kwh@>3AXoyrBi&>nCjQgXY->rn3Vk+6yCd^9y1J#Pbsvlh=QVuKx@E!Vgf27x0De zlrEpI=x_1tnVPnAUVow9gYi4eY{8Br%vY>dKh)f4cZlz-TfiR)zuoOeF<#(z@UMut zg}k@X#|lY*A@L~M4e+Y#kQy=lMXW~~;+aYDNVYTR#!njJWsP^R;J=&k?oj;ufhZ#4 z88`Z$9E|Vy&wKtLX+iI_qyX)qhd|@ac2Bvoa?`rbv^?N&~VX7+HbbonaNq7QE^u(CV3E9xa=4YV{{_sd%FZ?imn5N zRpp$yE6?M_EtDyf*R||VtV>;t;DvqxL@H8)D8n!VegNDzz~oMp7W|M4*+K_vB1jx* zlpf&T^vTC}^qLbxXO_=%ptu5{CrbWw`RHi!WN`&N+TwJ#>@KxVduOtbc!1V`K|B=f z7X$0PKv!I0T6%6I9h zl(mb>DM_If(l%m|qaWa+CZ?(p7NlvfGq=FX8~34%*wMXl*HV}r6dw4#O{c6-Hqe}H zsm<#v(PfeAt-v7MSzyz)3_}7wSj-kA9SkHIe}Hto@=gRLiWaz6Ww2(M_-?o#{?KKQ zj+@^u`vUW$QtmCD(;Tn?m@=leMe`NcV@_fj0iPgZRJC~&R?Rme(h1+vmSXn;26&N7 zACfd@rV-L#oI2R%19fNT?p2*?=nB+1A@z*MIESh&faUWYsyrgp9aG!xTk8(N_GU(T z{#=+9B5Fdzy@h4xJ9Si*-WquhYfy?W_Qk=JUVt|wI#0yW& zBCKgZ3O<+1hM&Srsy(%K^cpQOunMe7*u@CyGP~m0!txyTHY|7nf$t8n94*`grr5Qi zzmgLMokm}NT6?QFB-UCqIv@WWev|(ly@juE*CkP(a|q4I7oc=st4T#SXMFT|X|&YhVEb|+rI@p>`KbS!OC0FA z%N;ES7&30pD}dB%Z1M$22KQGhuW;JKP;>Chg5w{t%{Pb6l$S+W-$2~mvQq|8aeFqN z*|0P8K7Kj}xExT%$%5*z$ykCIKL4nrMArsMIj~yoqjD8Die`@>UyG7UEY%6i@{olx zvjWfV;&*4P_hBM%>a(@9d{7@?N~~p>?>;h6{lomhuZh8T?5dzY12FbS&z4^68WzDb z^11=rPCkLXjcM4qSm(PnEaUZk3_W!-bX=lr5<<>R>+svfn1xxprwnChKX`HzGsoL@ z&5D}^hSwwUc4)`uk5|bN-8>HKd6(!+J^}rWSMu;q*pMH8$R{iImk{N#TRaG#AZoXi z)f-Rb!-xNA-h9j_RA-W3#!AOc{@+49Dzz*5qga$DtarQW_zlfO$2 zBzB8_;@i1&Di6SJTOQe*_qOb^36}@W%f8v2zag?+rS1(F{5cEt$u+G@`6$W0{_gzy zC>5fk*=+GALk@xb|0ae0>zNnbKM?`)2F^byq3wUc3u9Dvl>Q}zvTY>JYEMSTj6}4Q ztO^chZWXK&42l0WHO9R)+@2pDOD%L=@|E?JYz zTq$a>DxFGI($RBRt5KWT;>l>njA=S8t9A+0G_oA%@3qqiA}m@PEd-#qPR*J+sVX7a z2Y-9oar9V8OaIQ?WrmGD-e{1P=vidCPLk<`O0#KMY>tz&P8jTLGK!2ouG!l0XKRPm zDr>|wBT>Iqk$yr;bUN`TrN`n@(0D-vqXcsF*T??m88;+Eeh}et;1klBl7~t z{b0Pa+8VF@x^euw!et|i!$=I@o8U4Um_%I>&PFmuCzA$sV!QVJNwP_mewBK?R{rL7 zE18x>dnh@SjiG>mdYrh{^R6NkeIN7KL2T&bRXQkEhK_f&K4cX0kDxIATvRwaxvPkH zvbZoK%fgpC=fVTTqvVWFc2dC2AeB37>&p~i7Z1;FGRMO#*I^Y~+r_rF;JoyX0_MdI zIBS2os*KlY2mHz9OxO9dT*pY*9;82kedR6a;ixS;_tw!RL~#QP*2u$Z$EJT2 z6+ZF@2H~+Mgc|j!F9eAwqqATL6r1=c`mgZCN1RvsX*Y_<$*n$_iWLX`7-+g2Iky}? zAuBYG!n_CdPY`ZJ;p-GZ$ETEhrQgt7mk^o8x;Kh`P)+SuztAs$&j91A$W8H)MPvzH zswqrhi5aBr7*mSYE-Ab(B6biQM|Jz3fST2{X=V5LB(nEgxFp5*bl(t+?u5-coFK1| zhvKxvxd1Vz6JT(RxO3wpW5eRPPwn>3|F-1-(Y$g-{Y}&s@ORFzkr;~m0Kf0Z>&Hx* zs{aL-!H-J8JqT3&&=w$bD8K7dY3~wF<{sLu6x<=JX(qyMxR)qv7OP&X6@5IgO1#75aWIVaeLg}F!Zh? zCaVh}!QEVC+4a61UwPTRY|hf@A&kJAx}cxN5Qb7IXp7{@*6NM2K$o9(Izr$`6e}mI z+R6{rgC-H|-zb9sO)@act;b%?(nFKn*EUP*9)%>*Pu8+@TBHhhP!^lbbTtn8?6_8E zH|?1^jI1~;E<1JczwSX4a`px;Tgj?Qt6@^sZpYYK8| ztgfRb5`q$)unU?_Zao0cn||j^?5&&7@(_GnOqihWV~sMJinD$?LTeV3{-)P0Bh_7I zeW*1-_&d;Q|0&JbH{RBvaU5$>`rdR6%R7S_Jz&1%! z!n}nTgpSssWGSIs%8EcU_g%yERCWoYSU=8P$M1?-YBQy^Pbd$=f_i&a(T&2LFuO3m zu$`PcPRsd@-{?z#&gT;Jm#F9vKdjZ`F!}XJh|t?hI4~M*=`;L0Ja)ej|A*{z(7taY zLL)C1d|c558!Q#57SP2+YEFr7dVupa(^u3>V|Ah1`A#xv-{ zB@J$ao4}x%6$Ca(cQ~$g@uQ%#=9xArXg(5Rk)AQxqu##=IXDT_hJv4?R=OYQ#eZ-6 zAo4$N2%#V2F*7?ykN>78lyvMC>5+M65>s6@z>IJXjOrU0H)0TafdzB;%L^4t%rTLl zuUl--DO#w=YL@&!;QW6B@%iJ0w2xOxAkhdDCOXy4_PngUtbM;-e85rbIDlK5Z;83Hqf7kXNjkC3Kj4u zIOzRu6nX+v9DhX_8l3`uc*xv4PE!(W5zHM4Y|=a4elfu_9#w!H-p&CzG~R^(XCfDQO@JqFMrV481ygczfsfzXW>m26In8%u zbRD7%qRYh^ya*X9ZV0`J0gfJN!^4O(pIkA5#_XOR-$kCkPZ;Kn`=Wih>x-)ry84%b zXh=XbR5h{^mzSQtk8G3ndm1_91%%^@5w)gVgYcSZph9yn6-A!Z zr<#%~S`~TOJd1YLeIIew@9dsB^;c)vY$EiPhh+OJ>b>l_0nXYo6SjrVtafSF5bi8g zJ<^N#?bfKif6F@v^`Pwlerhi4Ke=}PR}xtC|3}SP8#p=18rYcpH$|tsX}ib|&y$sf zwAw76$sZsnwaA=SdJGT|CJc^%K%uCN0_d|tie*MM8oMG}{EfmbPmKHeix-mNLbQSs zu|Al@%hYWqTO$wSYF2N@4?lv_8VTd_Fn&Y{X|~?V5N;L*83vo)crXDvk`8@BM~{Ow z@Ag}Kt@ft7yIyQC2OMRsj2k-SUbX`=*pmLxGfkHrvEWk4SILvnd-|4wb-+@4Q_Uz) za`wz!sBgX^o1s|qo1fm=xr9u%^uVcr_ueVZm9@(^uggqZq9@m`^znw?x=kAwn9Q5{ zxJ0X$4JncvwCcb^P~?}uTpL52j<$qEWHp>!PIdv}2bsi71fmay_>Pf2PG~pL;Pa9T z-Hu!bRhS~Qvr4F%6f!L7!u5Ns&`+ZKAQV>0HAtSr=25QEi=fDdG69Wqv;iL|K+yU_ zStZ>DqvBgC_-N)V*5Bo%0*oXEgO={H$CEqF7f76XcWrgCZ|pHyL`iRHgt}`go~y|QXd+wQPN#GQsi2$m1N-q z`Da#TiL-)z5udU&h+0K;!#TSZk7+I!<=E*jZ>SOX3YT*|>XeZqhK&(Rs!JtX!0gLd zaR?I?OLyN?hi)4pbO$9PV*>FcP;)%VI zwTrnXbu&LZq*;erQ;ux6{Oa`HEE@2skK`C zwvmn$3x*USPl1J~@)RTi$bx_bche;~|K1HcLB50ghSU^jDG_|0#V}^A*+83vNlCNT znNIF=CcT;X{Cs%A@RZb55k`DK98h?rgYyXp(#GKv(-S)_P&jeP-PdBpC~=KM2b4gX zpnJUo3i!ILE-^ZX;IMth?Oz*dC_|GB!4EA)=a%bNahfhS#ur%4G)tTM>(OU73d^xn zh}8By*J)=i&q;J^9TgU_*kdhF)T#q>EOSi^v+j$pxR1`JGEw#F)Lh%w7+oid&t^6_ zin?vUm9BYA`YAG4LUkb;1zxq)EjBj}0*OIwh8x?((_%DZl2$*Lk31T%LdzWxY(hn2 zT#;#62I%J<`=BLj1AfzQ8cVlSR+wEGCVVn^Z51jolPa@T7xtckFCc}+;n6?p)EmP( zcAuxWij3f=1wb3o#=UH>t)V1JFm{gm@y|!I>&FEV0PLo z34w8rjfh+rb@Dm6bF>0QeTQ6 zNeqM*I_H~7lD+9Xh3Xw&si2X#jGJ_M+z85dvY&$7agLTu38+DovD{iGL{Z@Cr4;bY z+D7hl29XON`P-WyQ^DkD@}>;ulgQ`z2_5m;cZbHTMPhI>IeEg$`DX(HUrFt zoquX%eMVvq!5|@x{C5R)5r*W;!5bUsz?+z$>u=DFcj$l5FpT)NgOHF9z;Dp+r=Wf) zX+jsZpBVlbK`*>EH?$2pNCx>iciMx{Sl; zf73pRGIl@nJak85zn!5pL{O=hqB)rv#9KfRT$zB7l0c(eQGvs5A?9F0N6U(<5462M zfJoe19QzgEll*rzPD(y8AtKn#Oze(_shO+q_xm@H%9hAvKnNAglKt`k%a7sK(1=VR zPDsWQAtCjLm?3$$czOTktaEvwSn&ISe8@ViK?%#7*M-0Q#qY4h`ol2E-m$nY#XjV1 zaZK$kr1^lk0*<)s7Hjy@V3j`UPBO+nDrBlc73+lUvnh$4NdJqqcMP&DTDL^2veLF~ z+qP}nwr$(2v~6eZv~8P}W~DmMx%YLyKKJ&Cei3i|+OcED+CSD@V~%gk@qHtLIfdGL ze}wZ!n9%drnTUh^*C^H~c>?F7XuX$UsiNKF4@Zz?d0~#ynr9;)YDU1cF^Sy0Z{ASS z*gWyWJ3F}gy*0UtYHGIYJ?|cX8u}zzR9ZbRXjE>Ns#eNVS8*X&S@*D(_rpz zucy<@s1CLMmIzKu3=CRpoy7s`^ZwVm)aqX}eQ7P5j4PH>w-`Ke;t1uiV6FvG8`nm* zlggh~+;6Bq1cx31sww@T%R1NHP87`4P*qMMfp3SPPxlHm+g%(ZTF8QHYZ)Sa{KKG zrTMq;{QrTdO4}Lz(pWnrs4r&<+f}eby|3?ytFn?45yhJ9lV4&mP zmZEH{RO*&#XZ#H*Z;)F04^rK4(h!06sbe0^fOygbgS;S#)X33zGMVvu%*Et1{dUlL z4L^u8SuT$NMHFp7A*vj`?~3j~tc)r_p{Q7d5=}7+LEu+Q44zEV^d?ft%`F>#qCK-1 zlbApUx#c=lPSZ_(nRqk)w_@)N;G_yuOWg%c(A9GCBC@CD@s!tyJ>e(pzRk$*)Jd|k zVX8F2&?wtKWsGz&=`y!vT*JdLfk4Hzfd%j~wO*}?INt0ssKv@9Sz$2|#|@jMd-k4i zu}nbIF;jErCNkF;LD(*^NuCI#$!i+*Y{MWtDeSZlWh0ooLx7O%i4;z^i0^kCn|Jya zXFnEn_FgiCZ6{V)oHy*HeWsq(XV7f~uMiAre%OOvt}9d+XL06W)+cowU%7kK8>=Y# zk+K*iCWL|yvpDB#36U{_AYqa^sC}1nUg^v9K^id6#qRzZAkZ9Nc^N0%d13NqS)XEl zpDM^}u0kiKiL+*qy}UAr!KJ|o?m@8T@r$Mc=MxJGtMz}*nb*snbfgV6UPRoShE|W) zABM47!kM|c1%qXECk$0{M75|uKwmu+egeDOr)Y?pjP*Ywm7Ni_^<9w9=-zM=vy44p z$uqiy^E>Xs_phK#M4{Mim(G|M%E_NWd7e^vYVeI-X9{-&e?r;Ely9i*`nOQa|9=m)-%VHl{VR~8ETx3~t&vW5Win40iJL-;!Z0vQ^Cz() zB%y;RNcVm3xZppHydR<6GD(xJ>Py2AmDV&g)NNmW(QdX4QIZs>XkbnOo*N~lXuiTc zZQ)|2(ILl0c6dLwuDPDOYWkOaOH1-V_WxuWyg=k zRI>rUBMGuoI|m#&h}d!ym&1wkR1*5b0~J7wf^Ssng-^$6)1yih7;z@j?|3%qK_Ti1 zHtIhN0QQs@o~Z_@Q-Cgd$r_eA{mCdr4R;iy$;Xp99`I?h8)exF#86AT1*wE^1`eBxB$k#nuox(CPsW^R8Y zWCNyS`mFuWBuH9IcUUFJ5*BShbf^Y5UD^buZXXH^-98Bn-2n8IaY``ShX zoBdpoYdRH@|aNJJ^x1adIhcE_IgK|I; zqE|*2gnnVKTk9KcP>Yp*;j?c)E$C|hI7aabCG&XfP%W9%?q>x{{LYYQa@- z{fULS<2@v7wjbo@e>-z?4L^eeg}}6rxbU#))Vu98?bhS<_hV(nF5CbF&INkU6$lg6 znK6p8qcmI#IzAa`yLWJz)*m zRth-3{RnJC6`3Pf=N9wRlf

    xAk9_etJz8?)n8@UgUnLi&+xmuJaY@=RQd6_Ui!2 zMQ6d#hgcWt^Uh=`;O&y@oN#|`(87HW!d2&LdSvG+Zs^@Z!~Uj$ z|87ze^l}C=LbwDXM=(7?KRLoMPDbBfN7CYW?AD`r|r?qvw)7~LijbZYG#|Qu)r^@ z3J(T z8oWu2ariPFh`U81cuqz!8+uow`qY`^Yuq#GB0M-zeGfzFg`cGZ`Q($jrFz%w;-NZV zW356xf85RP>!Nh_tWFNQH+0v5|CH+bSdQF*2;I@T1*7^TKj;NH^RqVZ$71|69#C-~ zi2Opa?4~%N!D0pX*-pKUg~=Ma$TR7(3KCP_3xv`2mK)Zq0;WR9izcSZP{+@(Q5Hna zFwUrAZBiWB&iP@VKlw!7n$twViW~(-ZsfbywmUbcNB7!wh8D;J!YLzDGHn0sO5R$X z<)`}4sDJN7>jcs%jH^e7_v9%WF#NF>7gvW*XL?x@a3*-MO^%L7a0J4i&sc5%HGD3Q zhcLuNkBuAtEY|6RXUBUEPB%xpG;5C0M9W)8i(3ndfx8Mj#V!PB)T|y-%dOi>Wc*Cj zpN{~;!GfPUrz2f8sZbd49t{Z#C^5F#xvZy)^_zsT4*pU5?D}7FknCDj5=g0Cfn682N zt8;(MYdN^Ofdb%rf6PdDOrQwkUM^;2NVu{q^@83be=q(RnDVh?FH7$_d?!xiqw3>F zlEfhCBcAu$9^m|*wqzTSDr%u=a-ll8h4e8Mg9K(O5EBzk9En=w{%RlK3Ze z*7%Y#A(U21#596YF+#bLF4;2=Sv63}xIFrr9y(F8iO7k z69<=cJlmf^2MAPoc<3?XMvB;}z@Q9ipDf9uo*9X_&;%=Od6eGmr+_}b*Qc-JMS3KD z3sgq3cW zEW}0`lEp<9=CV}8n5S1Lv}E!@35pc*NxcK=E(r-HZd1F%8#@;r5vp7Ukp#ViSFejV%abYj9R|JM zcz1uquuYo&@wGp9wH1Cwn~0s7^@nALj!d!OM}_NKlyB)YT}eZED~Mivy)=_L--TE1 zP`$*$zN3kk=X{6zr(}HLZ8+!rn47mm&JJBi?EK=*r?P1&WI$GV7zLYgmTpNqzBvqd zkccOHstp7Tj75&zfk@30g-#ty&M2<0#vBtE;>UX&TtQ^V)Ed_SZU9DAEsOoq<{#u8 zzuP96U->~11_~g}wF$rNO6jvRr(4cQBvJ^5hZcL9$WZ^B>nQYl=2?caclMC-jC>$^s*KKNqje z!~s7B6tGA8{f6u(f50(fv-LrQhC$!RK$F4PLrTT7_6zov4d&MM$q$+tRfnO5t{E$CRo{c$%n>2ztzm7%8QT+J>S>8l9+OxI^%41T|7tTJ zr{Ul1Si|%yYxJ=mM(NkgG5MDUGRhf~lx-|SZH-7<#-a&5(S*&@2jqT;CbDJ&+YGBC^1S1H4yzhrAc6>9zSoe+H*Hxg zr^AAmd);2{*B3Be%g0YuLk6s{X?An1W>4HeNP}^7TDse^*osH{VcF<5*ar1K&p=Tm2PxTCf=EJ_$BIs&F0Mql8 zWapbFErrOpRcu5j4*T9?4^@i7HjRgB43|6uT&5X;6ZTYK=`74#|K2@dO133$2-v+2 z2<0`6Jj^HMm=8qU;ra*Q)C|@bz+8ffdag;?5=N%1zQ~kN*ATX9eTd5Jk{biGY&N1S zdIpjyESUrb*@&PlEE}0H6PPDd*bEBx`-)?H)B(FjH`OXs;Y)|nvT)4l=dso51 zsnEOi-ifv9qyg;O0l7(MRhR7ponAGqmJ7NYM%Vjq+7rwvhmI;t-~D&(RIM_K{4;vV zJhWA@y2vRtf4|0~u-NxC{H57-9qD&BrQ5R8H4R z7+aedTbYadWNY-~Z$U%(7&1aU~Rj&xDO3l%%vgO2?&9W`#_5 zbOiOO8Ph9z6LrF#Id1*SkR-1nf=5H=m@}FqgXU^%^u;Xb)pY?n>`g<^H zf7YM0+fH?>UT(AkO$Cgh(5SNG>B?hV6F5kdhvI8qFNBM<6Q=tW^^t=x4rg8ffe)Fg zy$_7NOn2D8uT#O>xP68PK$NFd7M#FR{ul$yf}Y z6wOOS6D(f}>%NHvmTtmRo#`55n_$JD&^pXGMQSD0dv{G~-m5?h@CxOEqh&2>xl8Jq zuCHj5UIU9d_k;Fl_wJr@+A?bX)PwYNE?V!t51oe{F6YR-;xF3t3^1nq9HnLK3}LA_ zrKk!AZH54k3r^uP9X&;jJ7DS*5*(Q)mjiV_@O!fQfC29V z&wKKDnI{>ILsL;(gwbu%w`J=2fl<|fE>pzq+!BZ;2>k_5DOR->2TkU)as`XMbL-x} z2-bdx_kTW-+DcB)TjBr!bj|>rIHJ03?g&?eE6HLHARJJi_CvRGGYYnD-hdp?`6JNz zcENeXUuWJwA+BZjHEl{AUxy$r8RdN~)E_MO3QF&yrjcp?n&vuo#5=0x-gy%oEps1* z2#)hku~-lOwuPPm?tnIyTkhy=Tq@m=Ppp|xDFCb|AnjUXkK~4N;Dw&5cHs0#Q+Qxy zdA!32oxEIIxkL3HCBNci+=6Kav#~pW3Bz_tP~EUD9pE_b%`8SkHRbkNwjd~wWt@64 zDg{$hwSzMgY^tkl_b?9(J*gT z7J!*ov`kJ-lF}5Kn%C@*UgxKoht;G4vB+7J!6Hs!l?rMS!6b}x274{yvdDUHSf|A) zz?nyY6n|cLD>8B}WR~cjmw=QgHScu}1}AbTl&n&!+?&CAp&LONNXyLN!2FdLqtR62GW zs+6cTMegLKlRlmAB0m!!nUKOw(Na8MFvNkRcoO)>hhmJco(8${ZeO2AA z-IgsUUre7- zK^Dv(KOVHw$kcf6<8=A?`t|{qNgqptArL)rD%y}jtTGHtN+R8yXsRhF85&H+I~o3^ zgqIufbS9OzpZ=eg1!b3HFsV6s(05AptY&IHJSeVT0vkcgc);v_G%-4u&FjaY7 zs!*XiGHaYNP0TYEWVSrU=#j>-t?-ytS{GYeuHtWDPYS)Dw^67@FgTey#&(irVcWVZ zanOq(jH{|lFD+VVpHzxhIOe0E3uF4@+7xzO6}D*4Hp><9eerZ6`u&n{g&M7lPRkY9 zn3-y?*jsFmbxfsK&!x}gG<5BqCy*VYYV!2g>{AKxFpKvQgp`B_&!`>Ae5zXt6Sz=E z1}GxCj8ZPC^_E0_zPr4VfHVc_R*{F}SL~vI5*MKaGmOsqKskZ%fHMT!I_lEm;5upr zV;Y@mE`d{`xmML_<==3DRH_rPUME2=*AwhD2g(>DM?-#XQ~9x7k5h2<(>sSW8lZF6 zVo166I0Ix#hr>Z_#vEQG`pboXYlciE8U$ZhB_L0d7bkQ&=McEBSyEz9&@OGk5K&5Q z8mC}~#$KRW)~S-)GmXTz*>GYirvNEl_{26V;l$_{&BbwperiEPrW@;S6SKnm)3TSp^2G5~oGVBVn08>Fc!hp|u z2-TIlf0#cN58wv~QsR%Bc1_0k5w zaTK^n3mQkm6tOqwNL}Nn>>_HSvyjfiSysUOwME)Q@PrWQBwIihC*(&S6^8{-w2F2@ zolvyXk1G8cZJ{coI)vo-LAN{Rz5afDvo5iHGwSbDnl#oq>scHXbBOS}X)0`AdtiMkrT}}Sm)HJ0HMI-@u zo}`V;^kDyR{B3x;_8(TrM+A|n^5uzMZqR2u`5n z94l$L^*En8)i%Ckwh0=KR(tkaDx9d`9X`3-n!N8m(1a4@<^D|M>Wg!yv?ymm&w1xh z!*4ih2ForL(QE^Ehu%DS3=kTZ95a`Ll!_k0^`)On=H+WUb;XY9Y+phyIC5TqnX0MN zjxp>&Mp1c?157uxBPtFa+bZODT3XPzPprV+502?D@GFS$WZi@-Dee90j+0x``%w0a%5r5VA3aj@N?Y4 zIG*{2K1PfjOI_}OA(uY=>$L#7@hcf-pgq6S`yu6&L7MH?3{s13-^zRg0HxqhVa!zQ zbWs0kcz^D6&X;tP_@+z9Rsq$C8!0VN>gf!_4`F*0w0PhcDK9hzELi_basy^GPNzc~ zOFVJ3-awRIf;*78nGVCuX=)LHUISX)UQX8M1+fr>pmW=4TT`5eqAR3#A_aRw(_qktRwWPS$q+H5fidNy`rLd+Ziy zs?-@Od5e3#u9lYiZ!0Sh87y388)5=dP$i@N3Dgq$sqw_E;u5=05+tYy($61$$+wer z<&Y!>i5yH$$6Pz@Q}2I2KF9#%2O>aH?p;4{vJ|a{;^p{-2w;V3L?|R3l8-uQ>P?~L z3|9@rJ<)RiILB6{)`j@>_nku{WaT+!5qRQz0%{qQ?_-!QHW@>VdfY;0wmv)u9JorB zS~YcS5&O3@&K^TNPCH`X*3X-50LZZzO=_}POyB)ABRkN%Irh&vE`~{@3-+3+KGyAm zxxb2!-9kp>GfA%c|Xncu{Th_{rTZ$uMO)k&H z35$thkoQOL%wjlds4C z4;8%1os(`>me&p-+4A9X#UsbX#I;t39Scwwy)n6ir`!0RAw++8nF{Jd@k*6nESMOH zY^M(ipGl&Xw#XAi^hSRW^J~X#MKnSsYzZT2s0rg#I5CX48`{d%T{ZzWhDls!6h*FX z@kCmoESoUgOQ)jSA~BmJ06!n%0&970oXp>Wfe3HaMdAc{!lF!AU*_Olwnkn+!i8vCOfejE3q z&1$Nw7`}hFKMI!W@1?#MYXASXQ2&+I{M&T8|5&JMj{k5L{fD3*qiW-XwS?lUs_T{V zNa}hB4=!AfC`mH`uoU`@U#7W1@cUcPXOxYR0%&SVWL3E>ZK1>}K_=g+YAOOXbv2VD zw*;iR>i01!&CJ@JN%K8x~()Q6S{F4?R0xxd3a1aU2#VQJLSht?k5h{3hZhs3Rs?1ODTRbCC}bndG#b_`KNJ$Dn&g{C z4IxPBQ176E)d0~!>WTb{3umXIoHkIooThq_MUE4_)d7hsXGah8(C$Z~>yaSo9{U5m=BmQM2cP z_!QdFvS)UuO)ALoc+_z)uT~^o>|;}0*ioydm%ADscvtu73K!dMMaC-1lr<-a&Jn?W}nU`+Z(l-Vg2|U1+X279a1(Z%dJC;&)pio6lQTUohBUX&t za?YZS*3;)xQks<#Wq?G0WvAAR3F99p^DunuLp?P~Jn7#q6 z%-Vn~8u1NPJ-{EWJ7Bnm2$Y2e#ExsM2^YRSt_XaPC;zA=cKHem;ALOt{}`#-EU zMSHT}hPXd9C4m!|+d~Dx#$4GLvOkk>a$fA*2sI#r@=A4)Z8U{`a=={gwQlVOuSk%8 z%6@lYb%)wTl(Bv2ee|`!U}wsfkf2*a+%@84QxK1{vuUlFn%WPKjdi&{Xmy;NXpQ@L zcH6FI>z>)Fszm^@hL^+t$~rW1JQ3F}7ltabyxTih94+T%W?kQ4N>$r#W*s80(i*cfhPINl?kc~Ikg{s85M-6px^ogcv8-qyC^4gV zdUZ^>1R8CQEn)bqonF~FcV73)r}1}vx@f+NR<2YsIlEyniP)ebE8)WFQ|#Cf)?Jg2&=hlA`YP0s$ko(Bv`9P4shVQPm|4 zPVWC@fy78g6z?u~5ij3L7{w$s!pk?ioLO!E=|QmE8Qa4bBO~T`mOd}c>q!oDPtZ!)cf<3-u8n=COkR=FC zryyk0bBBwDxpqn?G&RNO?P)A;_bS&Vu>I%?ta4TkhPlo>GwE71=!^+OL-S45@38%AX8p{>mX_^Vil zXAD>eH#j$H%DKZKon6{4%z+oOxvgPq*nPY~_jC-YK@J&++Fx@I5K_?bT?rxeAGa>V zS?C}1ZG3@0QsnvuXkUK*RxaCy9NdClND16>=!gUEd<)_yYfJM`g%&(!73!IZ?+O?# z<{gevvj@YwrDEq^7PjR4u%PYH8s4btjot(uMxA$XnEt|APM97Ch%P=JvjT*Qz|~0r z_taBHt5G8o(@4@U5>KN_)T@m@?}(x~h2Nd1rGhnyh*f`c2jZ}g-Gz5KYIz)~Qw!*u z!NMih{Em7FLJ^ohrRcjpB!4hhSeCcdRuW6s`X!l#nfMTsLF-mrB=K)3;d@(FlD z^Z=TX)A zb>!S}ww018ny`~9X`hQ?OUKgf#t?+MkKBI+b#68V=V$ld&ejDxhOjYmrjohy8Efp_;ygSnnNrSA_VYh=Jy9 z{Hj^H?Rfy4OEF!ns`E~BE>EOE9A7jK%^k&3#iac8DjGW8+99=pmh{`~;tRGD-?KB%L>IOae7N1wCYl3!(6q;+6Du z_(Dl=J%A}6CMqyu{mfMQ-Q0&dw}E^OuK{DGO1kM>(sOiLXD^jYPSb!cOW_0bkLO4c zcx!C)?OL_@<}UxMD*RX8^4;D1!_Lu+&cNQl$lQePn@=-a()~YEZIvAjY@JN)9Buyd z5vuGsA*vyN(o)yO%QW=IlO{AtG$m70R*P1L>Vw0JFsuR_u?!mr9EnMyYNy6B`J7Ad z{9PQ0^{I>t$nbZ7!JIXCPFMyBwWOyiQtgaxw$JPIw(U2)HWoLO4rJx z{)j(9A1_UE7xCxO+mL2vcjl@>uVSvFLapGUL}7sn3OZ;kbemCSYg7KhMrIHPw026e zwglaHqo*;qCu{tc2qBLl+L_0eu2ktP`47jck&W3xB{cQGZtT)SCWe`P=m{%&uyJ7# z1GJe{N6Y#)mAR-c%_2*#Mq$}9n{wf>!?QenWi#r)ne{-K@KT9pmF1jgA!9FAwdG@p zX;XoR(2~|sXuTMxw`OG-YlIeoEV;M#xi;Tp)$ne`*;I=J2kN>>=&h0M#2-furqMNp zDnufQTo)NL_I%c?OkK%)x3Q_j8T+S~g{>bxiUpZ%WiOz9If8TRj4+@Ks#R`KCt7w* zF$FD(2Phcl5WFKs66yU_U{;9B32F9d$hK8q2b+(%!7~nefM3>%4ni(Y0UL1bIt&uI zR7F=T7H(mFfEv{zOm{B=3aGaPzt^?M)7W!8hRS92xnvJZPYJKY!efX%Xue&nC4f#_8m#noKpgk0 zKSW5$MllUQzFFJ$%Hm-KAiBL14Q@Vt@^I z3eQ&Q^{7yQRUudQ4N!wZu!JTDAZ6$C!HB-IPR~ui8nWIpymFLJ=k0p8O8CLYF|iTa z#mBvbaiZ%&fBuk&SS?7+zWsdwQXpv@xj6PNe;ap0^TPDbbxU#Q#61G9P|C?(-}d!1 z^Xu-9e)3z_#a|UnqS@;yQAdS zKX8ereEeAOyOy&4-&}$Woxa@PQ1m}9)bCIK1(z(14UOo2{c}9SKYsWPZ2!Fe7rOmx zBj10EZvVWCq_CinfW5tm?f=Zii&68?$2LLv@>!EHjk8FkwE=1hd5~q3Q2GtVio8Ke z(PXQ*{==r-xq)lVdi64NZL387r^#bIrFS9C@P4V|v4ckZYp zV53szz{>3}$eUujW2`Z3PMtD=#NRl%cd5%HR_4rV3x2sg$)CE27XLR|nKXq@seh$w z-y6iwj8$N>L!Hv-2{rUh=0dxW&n7aISSHU-okF8C>+@YdvQElSgKEt-8vRzFktau{ z2GC)S90Si)b+O=X+vd+Gb~QM7<7jgS?yB`Ga{@* zjl%_%Z?1zK&m&U^D{H)04$)HlFHWxpkW8hAcSYe{7Ibte*%TC8x*~y7-v#D7qj+)ee#)P zs6DIbwCeVcQP+Xh~ zl}1pri+|vlO&C(OoShE2h8$2T|JrllAE|_2m?Ij1W2iV#!0-*m;lv#{;LMFbin}d} z&D*8G;Tuxn6g_+}dub2VJAEM`zocix^esMEd5H<#Ie)?Nl@n5qw!+aM=tZ`G@teIB zdzTo$f&_ff~PWU7mv-C&qY7WKi^h10?B>bD7IgsxFK0oHy; zX=Ni57h}b&yy|4N!9ao!MWZ|DJ*wR|&I7MnG%_Rcn9`aN%a|omH@+41)&X5Iixnl- zwACpZ++aiqYvgQg^9{spqPAGEY1 z%B8jTjy~wLV6L~XY|4TA4d<4$aI<-8AeTB_O_nSq{X}!dbw5FuVNrG>xCgs4&Ps<2NhQkZ_Tingeaw^u12n@XAFd;KD_WGLS`iZ z?`3B3cS_@O>tyoE;K}<_vo?L1fiscob=fY-iG3ovUvJ^~UCB>zn-LARoFbH&7g<90 zm=E%Wo|_k$LTf6=5WvR(kHAMdvSB}di{RTq8eRo%1m3{SMrBzYReaX>=LcWkKVse6)5bz0RUEXl7nT_iYbsh}r&-qVnsbsH&7IgQyWNh!Wr zBSpj8UHQRn>qOf@P}=)U9-Wf5VkZg#1>po<&#Lp-O$eCTTC{=QI^u;82T}I*W{hA~ zMicC&*Zc4Zd+Z1oqQEa4V#`h@=BqdpDN`>cRa*MDmHr12_dzlT?=3#1z1RA&!6el|iC#^>$ ze+S|!&juM%on-KD&9rCUf45D0La_Cgx&T2Tdv0iw+AE^C;s_ge_x?c-v_UdAjC{Rz z;w`8?PfuLT}HN(m3v#-m^^OP!I z;xz}vl1Do;6RGiifJiMstQ7B>(e+_(jz+j7Ohr&;lVPaFZz#U4b)z!*Dq{8KKv5{R1^q-)!}ZD2u-yKkK8ZvVgG)2&zRv zM(yAwO9s|5Q)^|ZdI=gKx?Z<3Rqd+v1o_G?eysqGw&*kYAs}U|u(Y_NRfYCQ&{KVe ziM8>p+&d4s*M+VEmRJ`P6S3-ipA}VVZIIgY=8hjKpACtntjY4K9?4!A^{_|9w(`_* zE#i-+Anrd9md_WSo3Q(-hU-7^Elr+%v!~~06_BT6MVDeMn?q(E8|me21{hJO#=?$t zd8tQux%QAJUd=-UaVRUbDqm+q;I{2w>V(QQB3n^U(lX^`Y{EnyN(tDYGBt`0 zqq5)y@3;l;t_U9`_U`rqs)`Ang!0o!Dk{Xc@dziBh#kcQbtjwQ4FzKMXL(?8?QggtBxY%Gjq1WgQV|D(81QS*35yMy|0kgoFnZ!odJk1fGVo_*(Dv?F%P zgLJeghdLmw8(oa+dqawCx@~X%VX$s@@DY>jn_VGX@71Wd-9p{y10$3dc3uKnIH-C# zNDR)oa4~N8#i$Yc`5-00-~lc-!DUWOA4XBg3KA|i#Z?lDJEYS79R)@n>R}^e?$a&? z9p(*2{y`%n?@9lOiMPP;_qR#6UBGs2BqgLtIhNW<@=LsBu$7MtDshW$SrKKpYt;GF z_&3q>J(GHqvSbbMZ&$G}CeBrVF$2C1K6MI7U9d@g*xnwF>;iaobtY7Vws$y0M_Q<`RO#!3iJS>cy4Fts5ZI)=fJ zaLP)ZC43O5quLiyyQ=5h^{-r`H!OG(4xp-?g$Q8FL}nY zZs11{c5-HT>=9nz(D3iyNSIX@LCJpBriNv+X)ll|^MqR#5WNu& zj2-zKnQWyS8gH$BH~ZM6uD-X)=yi_dF;T`eZivbf9_y%~rf^IvNnu67$^Irnzr;V? zb9jm_Tl613nR;?VhJcmp1_Lvo+3fRcw8z$}A=B1{Q?-xaSds&_zaNl2Vb@fvk!p}6 zeEJ5HJeA0sA+7QUm)e3ea47HKZjQNAEMq3`>iu%SqZ6iiCy2|3YtM2s9T@n?5KI|R zO2cv}@6dGPFYSQ{?}Ed0DDRMTlrJp0iZ`U2<@mw$P=tQue+vQ7NJzS52W*hOQ9BM* zoWq)_=dEF@%|J6dQt=n>`;}uOYWWhwc*ujdVn4_8h^fc2U^PG>Kcjm`Un&E8AzD9U z)6C6d1B!O>UP^=4qw=V;UvTD(6J7RN$FtkN(#W^`qS7HNU7r#L;9DxK^XmAD%?98# zNfxyq5R?8;i`hAbqp>H@HJk%v9g#9o5=ztsl?IHe3lCkN^bIZtYlgz%h6*Zd;bhF1 zP~8Ci^&R#=<{u2A>2QYmYud$VV>B> z?{ij_k>=R>KpAA>(tjJ+XBS(h)6!&?{J|7QCwfxk^$QO)Z7mOdx;8wr)Zo3~noSljGkWSE7fY(XC2*Pq zGLmxz+R)A@XvL^(B%j&bs({>4{NtZ_xhN`A@1@oHPJF~`5`tl?AVXtFd>YSH^;m35 zI)vb>Q~%s}QedCRrOF1O^YzThg2l2?m1X9TL+;g-PSS6)k``w5Iow!89xz7Ifg>tt zHDyr_Pi}@Qk(Xve->G_M_Q&)yek;)Gbpv}} z3hFj)2Sm4WkhTAfTikGG*QIkvX&kBUw=0n1A7n{SGI>wX8YOSFzzcU2zL(IsG19-fe)BI+~nTpm!jt+Dy)i6ApMeI*-vj{)KesoB$tEWo@j?_X^s zcMZ%Q2WngAS8WSzMp(OJXSH%>-_O^MBQf)>>n#x6b7JWOd^7n-_cp z-5kcT$Z+9H7HUR{a*v@u|5<=((gYU_9jBg=>C>7({Cz=Q9HrDyAwRfC?^ zbvHVyOxk8LeUiEarUwN5f;DW`W9^Z zoKb+`wT|jVM!8B(ck3-|8;Hsf+A-vou%m=ELUz%=uQptg_1;Cgr zT(-Z~pyk9Q!tC;*HQv(_rC7L5;A!{3LB;M3Q3)7C?i&JT57F^zMej2Lgz7Tyxq6U> zF5gNNm|?x^&@3{L}7(ZQh9s^S5WTiWMQ7xk0WGinp0`(r(WtBMWK`M#q|1t%@I1 znKCa@H=5=FE%HxJ18&yvF%;Pahq)&!**addgRrX z2Q}K+_`?a~p;=Bcc$>_7l;4s>d#)wd&)dW3#+{@M_SiWyiE?3PTMvzWHBfHl;#}9! z30GU?H_q13&=Ey&<)FYZ)F~4f9F+YqrX#4?hpVlDKEZivj+ZkH0|^=&1p@ib=~5Wg z`H4snIlAX7^Ji5X6?^(r3Af+MQ9>&;kHA*S;YVMBIpIO}%Xj9iF-AS7XpP-EL;;%Y ze#(5YOF1$o0ikCS+^`~y$w z@?Iu+Pspn@?r7`rp#^-HP3s@p3!9NAVJ6Q*cX#3Y(4jYSMr(t=ujUmRPzIF z_gV-;clp(d;LxUs+XJtu9r&G$wxCy5>s_o4t{%Gs$hZ8^n;#M$nJ*~*ntiJ_akp;f z>>cT{L)EA-hANt~w}^<`12b}8`gWc-Cg9pbOmg1{y>xd7GijaxIZOAihA}R(e@LyV zmgQD8&CZQFJ$tF%{9qMpq0Ub!4??=A8syN_&*U$(X*dU&5gXH?=Xd#`SS)}3Av^iM zLn*#8LuYW|qA;6v=;zgXsZPrxYm8G6TFzuBNo9tmc@sY=FW7nBNy8lG+KH1~pi>Q8 zUW2}xgqlp|3*V3N-U2S&9VOS$9L0cHAWiv`B7(78acl@(`s}SRf`8vOuU#a4HBYWx zSKx4vi1m-eI2Mjc-9kW&Tc4-kEledWZLPvCyy(?JG>qlVBDN|^#u6X1DHyCoDts3lBcpqyk%7yHj1%j-DLI< zxhlrZR(ncgJgPAzlvW$DVl^mb8drUxhARF|n|8sVtsXmurcuKYnRpjcrJ6uB`~;^}(Vpc>qc# z%Xk(p$sVS39l{h|Lx7WEdh5`uLHj<*m9L~$P)qdbi}--#bM z^ByU;VS5(dWHZ7BUBJN>(pGnrE|W=ky3zbMKP%+iNM=21(3v5fC(0mRpJh%+YVQX2@Y`*%XyhIOv-7j34gtHAsC87+cMNa212#u! z?4#~~AhAIQ-BVIt9b^b*7Jn)uGm&40xTK6h3M0wj&zsBU3!0Gjw_;R!=Bp1-3kmiF zuJ)KWI#FNk∨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%0Ao>2bPD$nQmXX;mkRER5};S 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 }O5e6!ynv{ihgprhj@_^{_Ad4%F4 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 literal 0 HcmV?d00001 diff --git a/pkg/registry/zookeeper-3.4.6/lib/slf4j-log4j12-1.6.1.jar b/pkg/registry/zookeeper-3.4.6/lib/slf4j-log4j12-1.6.1.jar new file mode 100644 index 0000000000000000000000000000000000000000..641159959c21651235677a4912bb58bc47cfef41 GIT binary patch literal 9753 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 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Tests failed! + + + + + + + + + + + + + + + + + + diff --git a/pkg/registry/zookeeper-3.4.6/recipes/election/src/java/org/apache/zookeeper/recipes/leader/LeaderElectionAware.java b/pkg/registry/zookeeper-3.4.6/recipes/election/src/java/org/apache/zookeeper/recipes/leader/LeaderElectionAware.java new file mode 100644 index 000000000..6c32ebc9b --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/recipes/election/src/java/org/apache/zookeeper/recipes/leader/LeaderElectionAware.java @@ -0,0 +1,37 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + */ +package org.apache.zookeeper.recipes.leader; + +import org.apache.zookeeper.recipes.leader.LeaderElectionSupport.EventType; + +/** + * An interface to be implemented by clients that want to receive election + * events. + */ +public interface LeaderElectionAware { + + /** + * Called during each state transition. Current, low level events are provided + * at the beginning and end of each state. For instance, START may be followed + * by OFFER_START, OFFER_COMPLETE, DETERMINE_START, DETERMINE_COMPLETE, and so + * on. + * + * @param eventType + */ + public void onElectionEvent(EventType eventType); + +} diff --git a/pkg/registry/zookeeper-3.4.6/recipes/election/src/java/org/apache/zookeeper/recipes/leader/LeaderElectionSupport.java b/pkg/registry/zookeeper-3.4.6/recipes/election/src/java/org/apache/zookeeper/recipes/leader/LeaderElectionSupport.java new file mode 100644 index 000000000..8f8ae2060 --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/recipes/election/src/java/org/apache/zookeeper/recipes/leader/LeaderElectionSupport.java @@ -0,0 +1,461 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + */ +package org.apache.zookeeper.recipes.leader; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.HashSet; +import java.util.List; +import java.util.Set; + +import org.apache.zookeeper.CreateMode; +import org.apache.zookeeper.KeeperException; +import org.apache.zookeeper.WatchedEvent; +import org.apache.zookeeper.Watcher; +import org.apache.zookeeper.ZooDefs; +import org.apache.zookeeper.ZooKeeper; +import org.apache.zookeeper.data.Stat; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + *

    + * A leader election support library implementing the ZooKeeper election recipe. + *

    + *

    + * This support library is meant to simplify the construction of an exclusive + * leader system on top of Apache ZooKeeper. Any application that can become the + * leader (usually a process that provides a service, exclusively) would + * configure an instance of this class with their hostname, at least one + * listener (an implementation of {@link LeaderElectionAware}), and either an + * instance of {@link ZooKeeper} or the proper connection information. Once + * configured, invoking {@link #start()} will cause the client to connect to + * ZooKeeper and create a leader offer. The library then determines if it has + * been elected the leader using the algorithm described below. The client + * application can follow all state transitions via the listener callback. + *

    + *

    + * Leader election algorithm + *

    + *

    + * The library starts in a START state. Through each state transition, a state + * start and a state complete event are sent to all listeners. When + * {@link #start()} is called, a leader offer is created in ZooKeeper. A leader + * offer is an ephemeral sequential node that indicates a process that can act + * as a leader for this service. A read of all leader offers is then performed. + * The offer with the lowest sequence number is said to be the leader. The + * process elected leader will transition to the leader state. All other + * processes will transition to a ready state. Internally, the library creates a + * ZooKeeper watch on the leader offer with the sequence ID of N - 1 (where N is + * the process's sequence ID). If that offer disappears due to a process + * failure, the watching process will run through the election determination + * process again to see if it should become the leader. Note that sequence ID + * may not be contiguous due to failed processes. A process may revoke its offer + * to be the leader at any time by calling {@link #stop()}. + *

    + *

    + * Guarantees (not) Made and Caveats + *

    + *

    + *

      + *
    • It is possible for a (poorly implemented) process to create a leader + * offer, get the lowest sequence ID, but have something terrible occur where it + * maintains its connection to ZK (and thus its ephemeral leader offer node) but + * doesn't actually provide the service in question. It is up to the user to + * ensure any failure to become the leader - and whatever that means in the + * context of the user's application - results in a revocation of its leader + * offer (i.e. that {@link #stop()} is called).
    • + *
    • It is possible for ZK timeouts and retries to play a role in service + * liveliness. In other words, if process A has the lowest sequence ID but + * requires a few attempts to read the other leader offers' sequence IDs, + * election can seem slow. Users should apply timeouts during the determination + * process if they need to hit a specific SLA.
    • + *
    • The library makes a "best effort" to detect catastrophic failures of the + * process. It is possible that an unforeseen event results in (for instance) an + * unchecked exception that propagates passed normal error handling code. This + * normally doesn't matter as the same exception would almost certain destroy + * the entire process and thus the connection to ZK and the leader offer + * resulting in another round of leader determination.
    • + *
    + *

    + */ +public class LeaderElectionSupport implements Watcher { + + private static final Logger logger = LoggerFactory + .getLogger(LeaderElectionSupport.class); + + private ZooKeeper zooKeeper; + + private State state; + private Set listeners; + + private String rootNodeName; + private LeaderOffer leaderOffer; + private String hostName; + + public LeaderElectionSupport() { + state = State.STOP; + listeners = Collections.synchronizedSet(new HashSet()); + } + + /** + *

    + * Start the election process. This method will create a leader offer, + * determine its status, and either become the leader or become ready. If an + * instance of {@link ZooKeeper} has not yet been configured by the user, a + * new instance is created using the connectString and sessionTime specified. + *

    + *

    + * Any (anticipated) failures result in a failed event being sent to all + * listeners. + *

    + */ + public synchronized void start() { + state = State.START; + dispatchEvent(EventType.START); + + logger.info("Starting leader election support"); + + if (zooKeeper == null) { + throw new IllegalStateException( + "No instance of zookeeper provided. Hint: use setZooKeeper()"); + } + + if (hostName == null) { + throw new IllegalStateException( + "No hostname provided. Hint: use setHostName()"); + } + + try { + makeOffer(); + determineElectionStatus(); + } catch (KeeperException e) { + becomeFailed(e); + return; + } catch (InterruptedException e) { + becomeFailed(e); + return; + } + } + + /** + * Stops all election services, revokes any outstanding leader offers, and + * disconnects from ZooKeeper. + */ + public synchronized void stop() { + state = State.STOP; + dispatchEvent(EventType.STOP_START); + + logger.info("Stopping leader election support"); + + if (leaderOffer != null) { + try { + zooKeeper.delete(leaderOffer.getNodePath(), -1); + logger.info("Removed leader offer {}", leaderOffer.getNodePath()); + } catch (InterruptedException e) { + becomeFailed(e); + } catch (KeeperException e) { + becomeFailed(e); + } + } + + dispatchEvent(EventType.STOP_COMPLETE); + } + + private void makeOffer() throws KeeperException, InterruptedException { + state = State.OFFER; + dispatchEvent(EventType.OFFER_START); + + leaderOffer = new LeaderOffer(); + + leaderOffer.setHostName(hostName); + leaderOffer.setNodePath(zooKeeper.create(rootNodeName + "/" + "n_", + hostName.getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, + CreateMode.EPHEMERAL_SEQUENTIAL)); + + logger.debug("Created leader offer {}", leaderOffer); + + dispatchEvent(EventType.OFFER_COMPLETE); + } + + private void determineElectionStatus() throws KeeperException, + InterruptedException { + + state = State.DETERMINE; + dispatchEvent(EventType.DETERMINE_START); + + String[] components = leaderOffer.getNodePath().split("/"); + + leaderOffer.setId(Integer.valueOf(components[components.length - 1] + .substring("n_".length()))); + + List leaderOffers = toLeaderOffers(zooKeeper.getChildren( + rootNodeName, false)); + + /* + * For each leader offer, find out where we fit in. If we're first, we + * become the leader. If we're not elected the leader, attempt to stat the + * offer just less than us. If they exist, watch for their failure, but if + * they don't, become the leader. + */ + for (int i = 0; i < leaderOffers.size(); i++) { + LeaderOffer leaderOffer = leaderOffers.get(i); + + if (leaderOffer.getId().equals(this.leaderOffer.getId())) { + logger.debug("There are {} leader offers. I am {} in line.", + leaderOffers.size(), i); + + dispatchEvent(EventType.DETERMINE_COMPLETE); + + if (i == 0) { + becomeLeader(); + } else { + becomeReady(leaderOffers.get(i - 1)); + } + + /* Once we've figured out where we are, we're done. */ + break; + } + } + } + + private void becomeReady(LeaderOffer neighborLeaderOffer) + throws KeeperException, InterruptedException { + dispatchEvent(EventType.READY_START); + + logger.info("{} not elected leader. Watching node:{}", + leaderOffer.getNodePath(), neighborLeaderOffer.getNodePath()); + + /* + * Make sure to pass an explicit Watcher because we could be sharing this + * zooKeeper instance with someone else. + */ + Stat stat = zooKeeper.exists(neighborLeaderOffer.getNodePath(), this); + + if (stat != null) { + logger.debug( + "We're behind {} in line and they're alive. Keeping an eye on them.", + neighborLeaderOffer.getNodePath()); + state = State.READY; + dispatchEvent(EventType.READY_COMPLETE); + } else { + /* + * If the stat fails, the node has gone missing between the call to + * getChildren() and exists(). We need to try and become the leader. + */ + logger + .info( + "We were behind {} but it looks like they died. Back to determination.", + neighborLeaderOffer.getNodePath()); + determineElectionStatus(); + } + + } + + private void becomeLeader() { + state = State.ELECTED; + dispatchEvent(EventType.ELECTED_START); + + logger.info("Becoming leader with node:{}", leaderOffer.getNodePath()); + + dispatchEvent(EventType.ELECTED_COMPLETE); + } + + private void becomeFailed(Exception e) { + logger.error("Failed in state {} - Exception:{}", state, e); + + state = State.FAILED; + dispatchEvent(EventType.FAILED); + } + + /** + * Fetch the (user supplied) hostname of the current leader. Note that by the + * time this method returns, state could have changed so do not depend on this + * to be strongly consistent. This method has to read all leader offers from + * ZooKeeper to deterime who the leader is (i.e. there is no caching) so + * consider the performance implications of frequent invocation. If there are + * no leader offers this method returns null. + * + * @return hostname of the current leader + * @throws KeeperException + * @throws InterruptedException + */ + public String getLeaderHostName() throws KeeperException, + InterruptedException { + + List leaderOffers = toLeaderOffers(zooKeeper.getChildren( + rootNodeName, false)); + + if (leaderOffers.size() > 0) { + return leaderOffers.get(0).getHostName(); + } + + return null; + } + + private List toLeaderOffers(List strings) + throws KeeperException, InterruptedException { + + List leaderOffers = new ArrayList(strings.size()); + + /* + * Turn each child of rootNodeName into a leader offer. This is a tuple of + * the sequence number and the node name. + */ + for (String offer : strings) { + String hostName = new String(zooKeeper.getData( + rootNodeName + "/" + offer, false, null)); + + leaderOffers.add(new LeaderOffer(Integer.valueOf(offer.substring("n_" + .length())), rootNodeName + "/" + offer, hostName)); + } + + /* + * We sort leader offers by sequence number (which may not be zero-based or + * contiguous) and keep their paths handy for setting watches. + */ + Collections.sort(leaderOffers, new LeaderOffer.IdComparator()); + + return leaderOffers; + } + + @Override + public void process(WatchedEvent event) { + if (event.getType().equals(Watcher.Event.EventType.NodeDeleted)) { + if (!event.getPath().equals(leaderOffer.getNodePath()) + && state != State.STOP) { + logger.debug( + "Node {} deleted. Need to run through the election process.", + event.getPath()); + try { + determineElectionStatus(); + } catch (KeeperException e) { + becomeFailed(e); + } catch (InterruptedException e) { + becomeFailed(e); + } + } + } + } + + private void dispatchEvent(EventType eventType) { + logger.debug("Dispatching event:{}", eventType); + + synchronized (listeners) { + if (listeners.size() > 0) { + for (LeaderElectionAware observer : listeners) { + observer.onElectionEvent(eventType); + } + } + } + } + + /** + * Adds {@code listener} to the list of listeners who will receive events. + * + * @param listener + */ + public void addListener(LeaderElectionAware listener) { + listeners.add(listener); + } + + /** + * Remove {@code listener} from the list of listeners who receive events. + * + * @param listener + */ + public void removeListener(LeaderElectionAware listener) { + listeners.remove(listener); + } + + @Override + public String toString() { + return "{ state:" + state + " leaderOffer:" + leaderOffer + " zooKeeper:" + + zooKeeper + " hostName:" + hostName + " listeners:" + listeners + + " }"; + } + + /** + *

    + * Gets the ZooKeeper root node to use for this service. + *

    + *

    + * For instance, a root node of {@code /mycompany/myservice} would be the + * parent of all leader offers for this service. Obviously all processes that + * wish to contend for leader status need to use the same root node. Note: We + * assume this node already exists. + *

    + * + * @return a znode path + */ + public String getRootNodeName() { + return rootNodeName; + } + + /** + *

    + * Sets the ZooKeeper root node to use for this service. + *

    + *

    + * For instance, a root node of {@code /mycompany/myservice} would be the + * parent of all leader offers for this service. Obviously all processes that + * wish to contend for leader status need to use the same root node. Note: We + * assume this node already exists. + *

    + */ + public void setRootNodeName(String rootNodeName) { + this.rootNodeName = rootNodeName; + } + + /** + * The {@link ZooKeeper} instance to use for all operations. Provided this + * overrides any connectString or sessionTimeout set. + */ + public ZooKeeper getZooKeeper() { + return zooKeeper; + } + + public void setZooKeeper(ZooKeeper zooKeeper) { + this.zooKeeper = zooKeeper; + } + + /** + * The hostname of this process. Mostly used as a convenience for logging and + * to respond to {@link #getLeaderHostName()} requests. + */ + public String getHostName() { + return hostName; + } + + public void setHostName(String hostName) { + this.hostName = hostName; + } + + /** + * The type of event. + */ + public static enum EventType { + START, OFFER_START, OFFER_COMPLETE, DETERMINE_START, DETERMINE_COMPLETE, ELECTED_START, ELECTED_COMPLETE, READY_START, READY_COMPLETE, FAILED, STOP_START, STOP_COMPLETE, + } + + /** + * The internal state of the election support service. + */ + public static enum State { + START, OFFER, DETERMINE, ELECTED, READY, FAILED, STOP + } +} diff --git a/pkg/registry/zookeeper-3.4.6/recipes/election/src/java/org/apache/zookeeper/recipes/leader/LeaderOffer.java b/pkg/registry/zookeeper-3.4.6/recipes/election/src/java/org/apache/zookeeper/recipes/leader/LeaderOffer.java new file mode 100644 index 000000000..188a6d575 --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/recipes/election/src/java/org/apache/zookeeper/recipes/leader/LeaderOffer.java @@ -0,0 +1,84 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + */ +package org.apache.zookeeper.recipes.leader; + +import java.util.Comparator; + +/** + * A leader offer is a numeric id / path pair. The id is the sequential node id + * assigned by ZooKeeper where as the path is the absolute path to the ZNode. + */ +public class LeaderOffer { + + private Integer id; + private String nodePath; + private String hostName; + + public LeaderOffer() { + // Default constructor + } + + public LeaderOffer(Integer id, String nodePath, String hostName) { + this.id = id; + this.nodePath = nodePath; + this.hostName = hostName; + } + + @Override + public String toString() { + return "{ id:" + id + " nodePath:" + nodePath + " hostName:" + hostName + + " }"; + } + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public String getNodePath() { + return nodePath; + } + + public void setNodePath(String nodePath) { + this.nodePath = nodePath; + } + + public String getHostName() { + return hostName; + } + + public void setHostName(String hostName) { + this.hostName = hostName; + } + + /** + * Compare two instances of {@link LeaderOffer} using only the {code}id{code} + * member. + */ + public static class IdComparator implements Comparator { + + @Override + public int compare(LeaderOffer o1, LeaderOffer o2) { + return o1.getId().compareTo(o2.getId()); + } + + } + +} diff --git a/pkg/registry/zookeeper-3.4.6/recipes/lock/build.xml b/pkg/registry/zookeeper-3.4.6/recipes/lock/build.xml new file mode 100644 index 000000000..841cc0181 --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/recipes/lock/build.xml @@ -0,0 +1,128 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Tests failed! + + + + + + + + + + + + + + + + + + diff --git a/pkg/registry/zookeeper-3.4.6/recipes/lock/src/c/INSTALL b/pkg/registry/zookeeper-3.4.6/recipes/lock/src/c/INSTALL new file mode 100644 index 000000000..5458714e1 --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/recipes/lock/src/c/INSTALL @@ -0,0 +1,234 @@ +Installation Instructions +************************* + +Copyright (C) 1994, 1995, 1996, 1999, 2000, 2001, 2002, 2004, 2005, +2006 Free Software Foundation, Inc. + +This file is free documentation; the Free Software Foundation gives +unlimited permission to copy, distribute and modify it. + +Basic Installation +================== + +Briefly, the shell commands `./configure; make; make install' should +configure, build, and install this package. The following +more-detailed instructions are generic; see the `README' file for +instructions specific to this package. + + The `configure' shell script attempts to guess correct values for +various system-dependent variables used during compilation. It uses +those values to create a `Makefile' in each directory of the package. +It may also create one or more `.h' files containing system-dependent +definitions. Finally, it creates a shell script `config.status' that +you can run in the future to recreate the current configuration, and a +file `config.log' containing compiler output (useful mainly for +debugging `configure'). + + It can also use an optional file (typically called `config.cache' +and enabled with `--cache-file=config.cache' or simply `-C') that saves +the results of its tests to speed up reconfiguring. Caching is +disabled by default to prevent problems with accidental use of stale +cache files. + + If you need to do unusual things to compile the package, please try +to figure out how `configure' could check whether to do them, and mail +diffs or instructions to the address given in the `README' so they can +be considered for the next release. If you are using the cache, and at +some point `config.cache' contains results you don't want to keep, you +may remove or edit it. + + The file `configure.ac' (or `configure.in') is used to create +`configure' by a program called `autoconf'. You need `configure.ac' if +you want to change it or regenerate `configure' using a newer version +of `autoconf'. + +The simplest way to compile this package is: + + 1. `cd' to the directory containing the package's source code and type + `./configure' to configure the package for your system. + + Running `configure' might take a while. While running, it prints + some messages telling which features it is checking for. + + 2. Type `make' to compile the package. + + 3. Optionally, type `make check' to run any self-tests that come with + the package. + + 4. Type `make install' to install the programs and any data files and + documentation. + + 5. You can remove the program binaries and object files from the + source code directory by typing `make clean'. To also remove the + files that `configure' created (so you can compile the package for + a different kind of computer), type `make distclean'. There is + also a `make maintainer-clean' target, but that is intended mainly + for the package's developers. If you use it, you may have to get + all sorts of other programs in order to regenerate files that came + with the distribution. + +Compilers and Options +===================== + +Some systems require unusual options for compilation or linking that the +`configure' script does not know about. Run `./configure --help' for +details on some of the pertinent environment variables. + + You can give `configure' initial values for configuration parameters +by setting variables in the command line or in the environment. Here +is an example: + + ./configure CC=c99 CFLAGS=-g LIBS=-lposix + + *Note Defining Variables::, for more details. + +Compiling For Multiple Architectures +==================================== + +You can compile the package for more than one kind of computer at the +same time, by placing the object files for each architecture in their +own directory. To do this, you can use GNU `make'. `cd' to the +directory where you want the object files and executables to go and run +the `configure' script. `configure' automatically checks for the +source code in the directory that `configure' is in and in `..'. + + With a non-GNU `make', it is safer to compile the package for one +architecture at a time in the source code directory. After you have +installed the package for one architecture, use `make distclean' before +reconfiguring for another architecture. + +Installation Names +================== + +By default, `make install' installs the package's commands under +`/usr/local/bin', include files under `/usr/local/include', etc. You +can specify an installation prefix other than `/usr/local' by giving +`configure' the option `--prefix=PREFIX'. + + You can specify separate installation prefixes for +architecture-specific files and architecture-independent files. If you +pass the option `--exec-prefix=PREFIX' to `configure', the package uses +PREFIX as the prefix for installing programs and libraries. +Documentation and other data files still use the regular prefix. + + In addition, if you use an unusual directory layout you can give +options like `--bindir=DIR' to specify different values for particular +kinds of files. Run `configure --help' for a list of the directories +you can set and what kinds of files go in them. + + If the package supports it, you can cause programs to be installed +with an extra prefix or suffix on their names by giving `configure' the +option `--program-prefix=PREFIX' or `--program-suffix=SUFFIX'. + +Optional Features +================= + +Some packages pay attention to `--enable-FEATURE' options to +`configure', where FEATURE indicates an optional part of the package. +They may also pay attention to `--with-PACKAGE' options, where PACKAGE +is something like `gnu-as' or `x' (for the X Window System). The +`README' should mention any `--enable-' and `--with-' options that the +package recognizes. + + For packages that use the X Window System, `configure' can usually +find the X include and library files automatically, but if it doesn't, +you can use the `configure' options `--x-includes=DIR' and +`--x-libraries=DIR' to specify their locations. + +Specifying the System Type +========================== + +There may be some features `configure' cannot figure out automatically, +but needs to determine by the type of machine the package will run on. +Usually, assuming the package is built to be run on the _same_ +architectures, `configure' can figure that out, but if it prints a +message saying it cannot guess the machine type, give it the +`--build=TYPE' option. TYPE can either be a short name for the system +type, such as `sun4', or a canonical name which has the form: + + CPU-COMPANY-SYSTEM + +where SYSTEM can have one of these forms: + + OS KERNEL-OS + + See the file `config.sub' for the possible values of each field. If +`config.sub' isn't included in this package, then this package doesn't +need to know the machine type. + + If you are _building_ compiler tools for cross-compiling, you should +use the option `--target=TYPE' to select the type of system they will +produce code for. + + If you want to _use_ a cross compiler, that generates code for a +platform different from the build platform, you should specify the +"host" platform (i.e., that on which the generated programs will +eventually be run) with `--host=TYPE'. + +Sharing Defaults +================ + +If you want to set default values for `configure' scripts to share, you +can create a site shell script called `config.site' that gives default +values for variables like `CC', `cache_file', and `prefix'. +`configure' looks for `PREFIX/share/config.site' if it exists, then +`PREFIX/etc/config.site' if it exists. Or, you can set the +`CONFIG_SITE' environment variable to the location of the site script. +A warning: not all `configure' scripts look for a site script. + +Defining Variables +================== + +Variables not defined in a site shell script can be set in the +environment passed to `configure'. However, some packages may run +configure again during the build, and the customized values of these +variables may be lost. In order to avoid this problem, you should set +them in the `configure' command line, using `VAR=value'. For example: + + ./configure CC=/usr/local2/bin/gcc + +causes the specified `gcc' to be used as the C compiler (unless it is +overridden in the site shell script). + +Unfortunately, this technique does not work for `CONFIG_SHELL' due to +an Autoconf bug. Until the bug is fixed you can use this workaround: + + CONFIG_SHELL=/bin/bash /bin/bash ./configure CONFIG_SHELL=/bin/bash + +`configure' Invocation +====================== + +`configure' recognizes the following options to control how it operates. + +`--help' +`-h' + Print a summary of the options to `configure', and exit. + +`--version' +`-V' + Print the version of Autoconf used to generate the `configure' + script, and exit. + +`--cache-file=FILE' + Enable the cache: use and save the results of the tests in FILE, + traditionally `config.cache'. FILE defaults to `/dev/null' to + disable caching. + +`--config-cache' +`-C' + Alias for `--cache-file=config.cache'. + +`--quiet' +`--silent' +`-q' + Do not print messages saying which checks are being made. To + suppress all normal output, redirect it to `/dev/null' (any error + messages will still be shown). + +`--srcdir=DIR' + Look for the package's source code in directory DIR. Usually + `configure' can determine that directory automatically. + +`configure' also accepts some other, not widely useful, options. Run +`configure --help' for more details. + diff --git a/pkg/registry/zookeeper-3.4.6/recipes/lock/src/c/LICENSE b/pkg/registry/zookeeper-3.4.6/recipes/lock/src/c/LICENSE new file mode 100644 index 000000000..d64569567 --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/recipes/lock/src/c/LICENSE @@ -0,0 +1,202 @@ + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/pkg/registry/zookeeper-3.4.6/recipes/lock/src/c/Makefile.am b/pkg/registry/zookeeper-3.4.6/recipes/lock/src/c/Makefile.am new file mode 100644 index 000000000..9b36b43e1 --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/recipes/lock/src/c/Makefile.am @@ -0,0 +1,46 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you 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. + +include $(top_srcdir)/aminclude.am + +AM_CFLAGS = -Wall -fPIC -I${ZOOKEEPER_PATH}/include -I${ZOOKEEPER_PATH}/generated \ + -I$(top_srcdir)/include -I/usr/include +AM_CPPFLAGS = -Wall -I${ZOOKEEPER_PATH}/include -I${ZOOKEEPER_PATH}/generated\ + -I${top_srcdir}/include -I/usr/include +EXTRA_DIST = LICENSE +lib_LTLIBRARIES = libzoolock.la +libzoolock_la_SOURCES = src/zoo_lock.c include/zoo_lock.h +libzoolock_la_CPPFLAGS = -DDLOPEN_MODULE +libzoolock_la_LDFLAGS = -version-info 0:1:0 + +#run the tests now + +TEST_SOURCES = tests/TestDriver.cc tests/TestClient.cc tests/Util.cc + + +check_PROGRAMS = zklocktest +nodist_zklocktest_SOURCES = ${TEST_SOURCES} +zklocktest_LDADD = ${ZOOKEEPER_LD} libzoolock.la -lpthread ${CPPUNIT_LIBS} +zklocktest_CXXFLAGS = -DUSE_STATIC_LIB ${CPPUNIT_CFLAGS} + +run-check: check + ./zklocktest ${TEST_OPTIONS} + +clean-local: clean-check + ${RM} ${DX_CLEANFILES} + +clean-check: + ${RM} ${nodist_zklocktest_OBJECTS} diff --git a/pkg/registry/zookeeper-3.4.6/recipes/lock/src/c/README.txt b/pkg/registry/zookeeper-3.4.6/recipes/lock/src/c/README.txt new file mode 100644 index 000000000..326bba85d --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/recipes/lock/src/c/README.txt @@ -0,0 +1,28 @@ + Zookeeper C lock client library + + +INSTALLATION + +If you're building the client from a source checkout you need to +follow the steps outlined below. If you're building from a release +tar downloaded from Apache please skip to step 2. + +1) make sure that you compile the main zookeeper c client library. + +2) change directory to src/recipes/lock/src/c + and do a "autoreconf -if" to bootstrap + autoconf, automake and libtool. Please make sure you have autoconf + version 2.59 or greater installed. +3) do a "./configure [OPTIONS]" to generate the makefile. See INSTALL + for general information about running configure. + +4) do a "make" or "make install" to build the libraries and install them. + Alternatively, you can also build and run a unit test suite (and + you probably should). Please make sure you have cppunit-1.10.x or + higher installed before you execute step 4. Once ./configure has + finished, do a "make run-check". It will build the libraries, build + the tests and run them. +5) to generate doxygen documentation do a "make doxygen-doc". All + documentations will be placed to a new subfolder named docs. By + default only HTML documentation is generated. For information on + other document formats please use "./configure --help" diff --git a/pkg/registry/zookeeper-3.4.6/recipes/lock/src/c/acinclude.m4 b/pkg/registry/zookeeper-3.4.6/recipes/lock/src/c/acinclude.m4 new file mode 100644 index 000000000..d0041d8c2 --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/recipes/lock/src/c/acinclude.m4 @@ -0,0 +1,312 @@ +# This file is part of Autoconf. -*- Autoconf -*- + +# Copyright (C) 2004 Oren Ben-Kiki +# This file is distributed under the same terms as the Autoconf macro files. + +# Generate automatic documentation using Doxygen. Works in concert with the +# aminclude.m4 file and a compatible doxygen configuration file. Defines the +# following public macros: +# +# DX_???_FEATURE(ON|OFF) - control the default setting fo a Doxygen feature. +# Supported features are 'DOXYGEN' itself, 'DOT' for generating graphics, +# 'HTML' for plain HTML, 'CHM' for compressed HTML help (for MS users), 'CHI' +# for generating a seperate .chi file by the .chm file, and 'MAN', 'RTF', +# 'XML', 'PDF' and 'PS' for the appropriate output formats. The environment +# variable DOXYGEN_PAPER_SIZE may be specified to override the default 'a4wide' +# paper size. +# +# By default, HTML, PDF and PS documentation is generated as this seems to be +# the most popular and portable combination. MAN pages created by Doxygen are +# usually problematic, though by picking an appropriate subset and doing some +# massaging they might be better than nothing. CHM and RTF are specific for MS +# (note that you can't generate both HTML and CHM at the same time). The XML is +# rather useless unless you apply specialized post-processing to it. +# +# The macro mainly controls the default state of the feature. The use can +# override the default by specifying --enable or --disable. The macros ensure +# that contradictory flags are not given (e.g., --enable-doxygen-html and +# --enable-doxygen-chm, --enable-doxygen-anything with --disable-doxygen, etc.) +# Finally, each feature will be automatically disabled (with a warning) if the +# required programs are missing. +# +# Once all the feature defaults have been specified, call DX_INIT_DOXYGEN with +# the following parameters: a one-word name for the project for use as a +# filename base etc., an optional configuration file name (the default is +# 'Doxyfile', the same as Doxygen's default), and an optional output directory +# name (the default is 'doxygen-doc'). + +## ----------## +## Defaults. ## +## ----------## + +DX_ENV="" +AC_DEFUN([DX_FEATURE_doc], ON) +AC_DEFUN([DX_FEATURE_dot], ON) +AC_DEFUN([DX_FEATURE_man], OFF) +AC_DEFUN([DX_FEATURE_html], ON) +AC_DEFUN([DX_FEATURE_chm], OFF) +AC_DEFUN([DX_FEATURE_chi], OFF) +AC_DEFUN([DX_FEATURE_rtf], OFF) +AC_DEFUN([DX_FEATURE_xml], OFF) +AC_DEFUN([DX_FEATURE_pdf], ON) +AC_DEFUN([DX_FEATURE_ps], ON) + +## --------------- ## +## Private macros. ## +## --------------- ## + +# DX_ENV_APPEND(VARIABLE, VALUE) +# ------------------------------ +# Append VARIABLE="VALUE" to DX_ENV for invoking doxygen. +AC_DEFUN([DX_ENV_APPEND], [AC_SUBST([DX_ENV], ["$DX_ENV $1='$2'"])]) + +# DX_DIRNAME_EXPR +# --------------- +# Expand into a shell expression prints the directory part of a path. +AC_DEFUN([DX_DIRNAME_EXPR], + [[expr ".$1" : '\(\.\)[^/]*$' \| "x$1" : 'x\(.*\)/[^/]*$']]) + +# DX_IF_FEATURE(FEATURE, IF-ON, IF-OFF) +# ------------------------------------- +# Expands according to the M4 (static) status of the feature. +AC_DEFUN([DX_IF_FEATURE], [ifelse(DX_FEATURE_$1, ON, [$2], [$3])]) + +# DX_REQUIRE_PROG(VARIABLE, PROGRAM) +# ---------------------------------- +# Require the specified program to be found for the DX_CURRENT_FEATURE to work. +AC_DEFUN([DX_REQUIRE_PROG], [ +AC_PATH_TOOL([$1], [$2]) +if test "$DX_FLAG_$[DX_CURRENT_FEATURE$$1]" = 1; then + AC_MSG_WARN([$2 not found - will not DX_CURRENT_DESCRIPTION]) + AC_SUBST([DX_FLAG_]DX_CURRENT_FEATURE, 0) +fi +]) + +# DX_TEST_FEATURE(FEATURE) +# ------------------------ +# Expand to a shell expression testing whether the feature is active. +AC_DEFUN([DX_TEST_FEATURE], [test "$DX_FLAG_$1" = 1]) + +# DX_CHECK_DEPEND(REQUIRED_FEATURE, REQUIRED_STATE) +# ------------------------------------------------- +# Verify that a required features has the right state before trying to turn on +# the DX_CURRENT_FEATURE. +AC_DEFUN([DX_CHECK_DEPEND], [ +test "$DX_FLAG_$1" = "$2" \ +|| AC_MSG_ERROR([doxygen-DX_CURRENT_FEATURE ifelse([$2], 1, + requires, contradicts) doxygen-DX_CURRENT_FEATURE]) +]) + +# DX_CLEAR_DEPEND(FEATURE, REQUIRED_FEATURE, REQUIRED_STATE) +# ---------------------------------------------------------- +# Turn off the DX_CURRENT_FEATURE if the required feature is off. +AC_DEFUN([DX_CLEAR_DEPEND], [ +test "$DX_FLAG_$1" = "$2" || AC_SUBST([DX_FLAG_]DX_CURRENT_FEATURE, 0) +]) + +# DX_FEATURE_ARG(FEATURE, DESCRIPTION, +# CHECK_DEPEND, CLEAR_DEPEND, +# REQUIRE, DO-IF-ON, DO-IF-OFF) +# -------------------------------------------- +# Parse the command-line option controlling a feature. CHECK_DEPEND is called +# if the user explicitly turns the feature on (and invokes DX_CHECK_DEPEND), +# otherwise CLEAR_DEPEND is called to turn off the default state if a required +# feature is disabled (using DX_CLEAR_DEPEND). REQUIRE performs additional +# requirement tests (DX_REQUIRE_PROG). Finally, an automake flag is set and +# DO-IF-ON or DO-IF-OFF are called according to the final state of the feature. +AC_DEFUN([DX_ARG_ABLE], [ + AC_DEFUN([DX_CURRENT_FEATURE], [$1]) + AC_DEFUN([DX_CURRENT_DESCRIPTION], [$2]) + AC_ARG_ENABLE(doxygen-$1, + [AS_HELP_STRING(DX_IF_FEATURE([$1], [--disable-doxygen-$1], + [--enable-doxygen-$1]), + DX_IF_FEATURE([$1], [don't $2], [$2]))], + [ +case "$enableval" in +#( +y|Y|yes|Yes|YES) + AC_SUBST([DX_FLAG_$1], 1) + $3 +;; #( +n|N|no|No|NO) + AC_SUBST([DX_FLAG_$1], 0) +;; #( +*) + AC_MSG_ERROR([invalid value '$enableval' given to doxygen-$1]) +;; +esac +], [ +AC_SUBST([DX_FLAG_$1], [DX_IF_FEATURE([$1], 1, 0)]) +$4 +]) +if DX_TEST_FEATURE([$1]); then + $5 + : +fi +if DX_TEST_FEATURE([$1]); then + AM_CONDITIONAL(DX_COND_$1, :) + $6 + : +else + AM_CONDITIONAL(DX_COND_$1, false) + $7 + : +fi +]) + +## -------------- ## +## Public macros. ## +## -------------- ## + +# DX_XXX_FEATURE(DEFAULT_STATE) +# ----------------------------- +AC_DEFUN([DX_DOXYGEN_FEATURE], [AC_DEFUN([DX_FEATURE_doc], [$1])]) +AC_DEFUN([DX_MAN_FEATURE], [AC_DEFUN([DX_FEATURE_man], [$1])]) +AC_DEFUN([DX_HTML_FEATURE], [AC_DEFUN([DX_FEATURE_html], [$1])]) +AC_DEFUN([DX_CHM_FEATURE], [AC_DEFUN([DX_FEATURE_chm], [$1])]) +AC_DEFUN([DX_CHI_FEATURE], [AC_DEFUN([DX_FEATURE_chi], [$1])]) +AC_DEFUN([DX_RTF_FEATURE], [AC_DEFUN([DX_FEATURE_rtf], [$1])]) +AC_DEFUN([DX_XML_FEATURE], [AC_DEFUN([DX_FEATURE_xml], [$1])]) +AC_DEFUN([DX_XML_FEATURE], [AC_DEFUN([DX_FEATURE_xml], [$1])]) +AC_DEFUN([DX_PDF_FEATURE], [AC_DEFUN([DX_FEATURE_pdf], [$1])]) +AC_DEFUN([DX_PS_FEATURE], [AC_DEFUN([DX_FEATURE_ps], [$1])]) + +# DX_INIT_DOXYGEN(PROJECT, [CONFIG-FILE], [OUTPUT-DOC-DIR]) +# --------------------------------------------------------- +# PROJECT also serves as the base name for the documentation files. +# The default CONFIG-FILE is "Doxyfile" and OUTPUT-DOC-DIR is "doxygen-doc". +AC_DEFUN([DX_INIT_DOXYGEN], [ + +# Files: +AC_SUBST([DX_PROJECT], [$1]) +AC_SUBST([DX_CONFIG], [ifelse([$2], [], Doxyfile, [$2])]) +AC_SUBST([DX_DOCDIR], [ifelse([$3], [], doxygen-doc, [$3])]) + +# Environment variables used inside doxygen.cfg: +DX_ENV_APPEND(SRCDIR, $srcdir) +DX_ENV_APPEND(PROJECT, $DX_PROJECT) +DX_ENV_APPEND(DOCDIR, $DX_DOCDIR) +DX_ENV_APPEND(VERSION, $PACKAGE_VERSION) + +# Doxygen itself: +DX_ARG_ABLE(doc, [generate any doxygen documentation], + [], + [], + [DX_REQUIRE_PROG([DX_DOXYGEN], doxygen) + DX_REQUIRE_PROG([DX_PERL], perl)], + [DX_ENV_APPEND(PERL_PATH, $DX_PERL)]) + +# Dot for graphics: +DX_ARG_ABLE(dot, [generate graphics for doxygen documentation], + [DX_CHECK_DEPEND(doc, 1)], + [DX_CLEAR_DEPEND(doc, 1)], + [DX_REQUIRE_PROG([DX_DOT], dot)], + [DX_ENV_APPEND(HAVE_DOT, YES) + DX_ENV_APPEND(DOT_PATH, [`DX_DIRNAME_EXPR($DX_DOT)`])], + [DX_ENV_APPEND(HAVE_DOT, NO)]) + +# Man pages generation: +DX_ARG_ABLE(man, [generate doxygen manual pages], + [DX_CHECK_DEPEND(doc, 1)], + [DX_CLEAR_DEPEND(doc, 1)], + [], + [DX_ENV_APPEND(GENERATE_MAN, YES)], + [DX_ENV_APPEND(GENERATE_MAN, NO)]) + +# RTF file generation: +DX_ARG_ABLE(rtf, [generate doxygen RTF documentation], + [DX_CHECK_DEPEND(doc, 1)], + [DX_CLEAR_DEPEND(doc, 1)], + [], + [DX_ENV_APPEND(GENERATE_RTF, YES)], + [DX_ENV_APPEND(GENERATE_RTF, NO)]) + +# XML file generation: +DX_ARG_ABLE(xml, [generate doxygen XML documentation], + [DX_CHECK_DEPEND(doc, 1)], + [DX_CLEAR_DEPEND(doc, 1)], + [], + [DX_ENV_APPEND(GENERATE_XML, YES)], + [DX_ENV_APPEND(GENERATE_XML, NO)]) + +# (Compressed) HTML help generation: +DX_ARG_ABLE(chm, [generate doxygen compressed HTML help documentation], + [DX_CHECK_DEPEND(doc, 1)], + [DX_CLEAR_DEPEND(doc, 1)], + [DX_REQUIRE_PROG([DX_HHC], hhc)], + [DX_ENV_APPEND(HHC_PATH, $DX_HHC) + DX_ENV_APPEND(GENERATE_HTML, YES) + DX_ENV_APPEND(GENERATE_HTMLHELP, YES)], + [DX_ENV_APPEND(GENERATE_HTMLHELP, NO)]) + +# Seperate CHI file generation. +DX_ARG_ABLE(chi, [generate doxygen seperate compressed HTML help index file], + [DX_CHECK_DEPEND(chm, 1)], + [DX_CLEAR_DEPEND(chm, 1)], + [], + [DX_ENV_APPEND(GENERATE_CHI, YES)], + [DX_ENV_APPEND(GENERATE_CHI, NO)]) + +# Plain HTML pages generation: +DX_ARG_ABLE(html, [generate doxygen plain HTML documentation], + [DX_CHECK_DEPEND(doc, 1) DX_CHECK_DEPEND(chm, 0)], + [DX_CLEAR_DEPEND(doc, 1) DX_CLEAR_DEPEND(chm, 0)], + [], + [DX_ENV_APPEND(GENERATE_HTML, YES)], + [DX_TEST_FEATURE(chm) || DX_ENV_APPEND(GENERATE_HTML, NO)]) + +# PostScript file generation: +DX_ARG_ABLE(ps, [generate doxygen PostScript documentation], + [DX_CHECK_DEPEND(doc, 1)], + [DX_CLEAR_DEPEND(doc, 1)], + [DX_REQUIRE_PROG([DX_LATEX], latex) + DX_REQUIRE_PROG([DX_MAKEINDEX], makeindex) + DX_REQUIRE_PROG([DX_DVIPS], dvips) + DX_REQUIRE_PROG([DX_EGREP], egrep)]) + +# PDF file generation: +DX_ARG_ABLE(pdf, [generate doxygen PDF documentation], + [DX_CHECK_DEPEND(doc, 1)], + [DX_CLEAR_DEPEND(doc, 1)], + [DX_REQUIRE_PROG([DX_PDFLATEX], pdflatex) + DX_REQUIRE_PROG([DX_MAKEINDEX], makeindex) + DX_REQUIRE_PROG([DX_EGREP], egrep)]) + +# LaTeX generation for PS and/or PDF: +if DX_TEST_FEATURE(ps) || DX_TEST_FEATURE(pdf); then + AM_CONDITIONAL(DX_COND_latex, :) + DX_ENV_APPEND(GENERATE_LATEX, YES) +else + AM_CONDITIONAL(DX_COND_latex, false) + DX_ENV_APPEND(GENERATE_LATEX, NO) +fi + +# Paper size for PS and/or PDF: +AC_ARG_VAR(DOXYGEN_PAPER_SIZE, + [a4wide (default), a4, letter, legal or executive]) +case "$DOXYGEN_PAPER_SIZE" in +#( +"") + AC_SUBST(DOXYGEN_PAPER_SIZE, "") +;; #( +a4wide|a4|letter|legal|executive) + DX_ENV_APPEND(PAPER_SIZE, $DOXYGEN_PAPER_SIZE) +;; #( +*) + AC_MSG_ERROR([unknown DOXYGEN_PAPER_SIZE='$DOXYGEN_PAPER_SIZE']) +;; +esac + +#For debugging: +#echo DX_FLAG_doc=$DX_FLAG_doc +#echo DX_FLAG_dot=$DX_FLAG_dot +#echo DX_FLAG_man=$DX_FLAG_man +#echo DX_FLAG_html=$DX_FLAG_html +#echo DX_FLAG_chm=$DX_FLAG_chm +#echo DX_FLAG_chi=$DX_FLAG_chi +#echo DX_FLAG_rtf=$DX_FLAG_rtf +#echo DX_FLAG_xml=$DX_FLAG_xml +#echo DX_FLAG_pdf=$DX_FLAG_pdf +#echo DX_FLAG_ps=$DX_FLAG_ps +#echo DX_ENV=$DX_ENV +]) diff --git a/pkg/registry/zookeeper-3.4.6/recipes/lock/src/c/aminclude.am b/pkg/registry/zookeeper-3.4.6/recipes/lock/src/c/aminclude.am new file mode 100644 index 000000000..420049eca --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/recipes/lock/src/c/aminclude.am @@ -0,0 +1,186 @@ +# Copyright (C) 2004 Oren Ben-Kiki +# This file is distributed under the same terms as the Automake macro files. + +# Generate automatic documentation using Doxygen. Goals and variables values +# are controlled by the various DX_COND_??? conditionals set by autoconf. +# +# The provided goals are: +# doxygen-doc: Generate all doxygen documentation. +# doxygen-run: Run doxygen, which will generate some of the documentation +# (HTML, CHM, CHI, MAN, RTF, XML) but will not do the post +# processing required for the rest of it (PS, PDF, and some MAN). +# doxygen-man: Rename some doxygen generated man pages. +# doxygen-ps: Generate doxygen PostScript documentation. +# doxygen-pdf: Generate doxygen PDF documentation. +# +# Note that by default these are not integrated into the automake goals. If +# doxygen is used to generate man pages, you can achieve this integration by +# setting man3_MANS to the list of man pages generated and then adding the +# dependency: +# +# $(man3_MANS): doxygen-doc +# +# This will cause make to run doxygen and generate all the documentation. +# +# The following variable is intended for use in Makefile.am: +# +# DX_CLEANFILES = everything to clean. +# +# This is usually added to MOSTLYCLEANFILES. + +## --------------------------------- ## +## Format-independent Doxygen rules. ## +## --------------------------------- ## + +if DX_COND_doc + +## ------------------------------- ## +## Rules specific for HTML output. ## +## ------------------------------- ## + +if DX_COND_html + +DX_CLEAN_HTML = @DX_DOCDIR@/html + +endif DX_COND_html + +## ------------------------------ ## +## Rules specific for CHM output. ## +## ------------------------------ ## + +if DX_COND_chm + +DX_CLEAN_CHM = @DX_DOCDIR@/chm + +if DX_COND_chi + +DX_CLEAN_CHI = @DX_DOCDIR@/@PACKAGE@.chi + +endif DX_COND_chi + +endif DX_COND_chm + +## ------------------------------ ## +## Rules specific for MAN output. ## +## ------------------------------ ## + +if DX_COND_man + +DX_CLEAN_MAN = @DX_DOCDIR@/man + +endif DX_COND_man + +## ------------------------------ ## +## Rules specific for RTF output. ## +## ------------------------------ ## + +if DX_COND_rtf + +DX_CLEAN_RTF = @DX_DOCDIR@/rtf + +endif DX_COND_rtf + +## ------------------------------ ## +## Rules specific for XML output. ## +## ------------------------------ ## + +if DX_COND_xml + +DX_CLEAN_XML = @DX_DOCDIR@/xml + +endif DX_COND_xml + +## ----------------------------- ## +## Rules specific for PS output. ## +## ----------------------------- ## + +if DX_COND_ps + +DX_CLEAN_PS = @DX_DOCDIR@/@PACKAGE@.ps + +DX_PS_GOAL = doxygen-ps + +doxygen-ps: @DX_DOCDIR@/@PACKAGE@.ps + +@DX_DOCDIR@/@PACKAGE@.ps: @DX_DOCDIR@/@PACKAGE@.tag + cd @DX_DOCDIR@/latex; \ + rm -f *.aux *.toc *.idx *.ind *.ilg *.log *.out; \ + $(DX_LATEX) refman.tex; \ + $(MAKEINDEX_PATH) refman.idx; \ + $(DX_LATEX) refman.tex; \ + countdown=5; \ + while $(DX_EGREP) 'Rerun (LaTeX|to get cross-references right)' \ + refman.log > /dev/null 2>&1 \ + && test $$countdown -gt 0; do \ + $(DX_LATEX) refman.tex; \ + countdown=`expr $$countdown - 1`; \ + done; \ + $(DX_DVIPS) -o ../@PACKAGE@.ps refman.dvi + +endif DX_COND_ps + +## ------------------------------ ## +## Rules specific for PDF output. ## +## ------------------------------ ## + +if DX_COND_pdf + +DX_CLEAN_PDF = @DX_DOCDIR@/@PACKAGE@.pdf + +DX_PDF_GOAL = doxygen-pdf + +doxygen-pdf: @DX_DOCDIR@/@PACKAGE@.pdf + +@DX_DOCDIR@/@PACKAGE@.pdf: @DX_DOCDIR@/@PACKAGE@.tag + cd @DX_DOCDIR@/latex; \ + rm -f *.aux *.toc *.idx *.ind *.ilg *.log *.out; \ + $(DX_PDFLATEX) refman.tex; \ + $(DX_MAKEINDEX) refman.idx; \ + $(DX_PDFLATEX) refman.tex; \ + countdown=5; \ + while $(DX_EGREP) 'Rerun (LaTeX|to get cross-references right)' \ + refman.log > /dev/null 2>&1 \ + && test $$countdown -gt 0; do \ + $(DX_PDFLATEX) refman.tex; \ + countdown=`expr $$countdown - 1`; \ + done; \ + mv refman.pdf ../@PACKAGE@.pdf + +endif DX_COND_pdf + +## ------------------------------------------------- ## +## Rules specific for LaTeX (shared for PS and PDF). ## +## ------------------------------------------------- ## + +if DX_COND_latex + +DX_CLEAN_LATEX = @DX_DOCDIR@/latex + +endif DX_COND_latex + +.PHONY: doxygen-run doxygen-doc $(DX_PS_GOAL) $(DX_PDF_GOAL) + +.INTERMEDIATE: doxygen-run $(DX_PS_GOAL) $(DX_PDF_GOAL) + +doxygen-run: @DX_DOCDIR@/@PACKAGE@.tag + +doxygen-doc: doxygen-run $(DX_PS_GOAL) $(DX_PDF_GOAL) + +@DX_DOCDIR@/@PACKAGE@.tag: $(DX_CONFIG) $(pkginclude_HEADERS) + rm -rf @DX_DOCDIR@ + $(DX_ENV) $(DX_DOXYGEN) $(srcdir)/$(DX_CONFIG) + +DX_CLEANFILES = \ + @DX_DOCDIR@/@PACKAGE@.tag \ + -r \ + $(DX_CLEAN_HTML) \ + $(DX_CLEAN_CHM) \ + $(DX_CLEAN_CHI) \ + $(DX_CLEAN_MAN) \ + $(DX_CLEAN_RTF) \ + $(DX_CLEAN_XML) \ + $(DX_CLEAN_PS) \ + $(DX_CLEAN_PDF) \ + $(DX_CLEAN_LATEX) + +endif DX_COND_doc diff --git a/pkg/registry/zookeeper-3.4.6/recipes/lock/src/c/c-doc.Doxyfile b/pkg/registry/zookeeper-3.4.6/recipes/lock/src/c/c-doc.Doxyfile new file mode 100644 index 000000000..c56e86dc5 --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/recipes/lock/src/c/c-doc.Doxyfile @@ -0,0 +1,1252 @@ +# Doxyfile 1.4.7 + +# 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 (" ") + +#--------------------------------------------------------------------------- +# Project related 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 = $(PROJECT)-$(VERSION) + +# 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 = $(DOCDIR) + +# If the CREATE_SUBDIRS tag is set to YES, then doxygen will create +# 4096 sub-directories (in 2 levels) under the output directory of each output +# format and will distribute the generated files over these directories. +# Enabling this option can be useful when feeding doxygen a huge amount of +# source files, where putting all generated files in the same directory would +# otherwise cause performance problems for the file system. + +CREATE_SUBDIRS = NO + +# 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, Korean-en, Norwegian, +# Polish, Portuguese, Romanian, Russian, Serbian, Slovak, Slovene, Spanish, +# Swedish, and Ukrainian. + +OUTPUT_LANGUAGE = English + +# This tag can be used to specify the encoding used in the generated output. +# The encoding is not always determined by the language that is chosen, +# but also whether or not the output is meant for Windows or non-Windows users. +# In case there is a difference, setting the USE_WINDOWS_ENCODING tag to YES +# forces the Windows encoding (this is the default for the Windows binary), +# whereas setting the tag to NO uses a Unix-style encoding (the default for +# all platforms other than Windows). + +USE_WINDOWS_ENCODING = 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 + +# This tag implements a quasi-intelligent brief description abbreviator +# that is used to form the text in various listings. Each string +# in this list, if found as the leading text of the brief description, will be +# stripped from the text and the result after processing the whole list, is +# used as the annotated text. Otherwise, the brief description is used as-is. +# If left blank, the following values are used ("$name" is automatically +# replaced with the name of the entity): "The $name class" "The $name widget" +# "The $name file" "is" "provides" "specifies" "contains" +# "represents" "a" "an" "the" + +ABBREVIATE_BRIEF = + +# 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 = YES + +# 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. The tag can be used to show relative paths in the file list. +# If left blank the directory from which doxygen is run is used as the +# path to strip. + +STRIP_FROM_PATH = + +# The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of +# the path mentioned in the documentation of a class, which tells +# the reader which header file to include in order to use a class. +# If left blank only the name of the header file containing the class +# definition is used. Otherwise one should specify the include paths that +# are normally passed to the compiler using the -I flag. + +STRIP_FROM_INC_PATH = + +# 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 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 +# explicit @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 +# re-implements. + +INHERIT_DOCS = YES + +# If the SEPARATE_MEMBER_PAGES tag is set to YES, then doxygen will produce +# a new page for each member. If set to NO, the documentation of a member will +# be part of the file/class/namespace that contains it. + +SEPARATE_MEMBER_PAGES = 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 + +# 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 = + +# 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 + +# If you use STL classes (i.e. std::string, std::vector, etc.) but do not want to +# include (a tag file for) the STL sources as input, then you should +# set this tag to YES in order to let doxygen match functions declarations and +# definitions whose arguments contain STL classes (e.g. func(std::string); v.s. +# func(std::string) {}). This also make the inheritance and collaboration +# diagrams that involve STL classes more complete and accurate. + +BUILTIN_STL_SUPPORT = NO + +# 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 + +# Set the SUBGROUPING tag to YES (the default) to allow class member groups of +# the same type (for instance a group of public functions) to be put as a +# subgroup of that type (e.g. under the Public Functions section). Set it to +# NO to prevent subgrouping. Alternatively, this can be done per class using +# the \nosubgrouping command. + +SUBGROUPING = YES + +#--------------------------------------------------------------------------- +# Build related configuration options +#--------------------------------------------------------------------------- + +# 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 = NO + +# 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 = YES + +# 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 = YES + +# This flag is only useful for Objective-C code. When set to YES local +# methods, which are defined in the implementation section but not in +# the interface are included in the documentation. +# If set to NO (the default) only methods in the interface are included. + +EXTRACT_LOCAL_METHODS = 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 classes 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 HIDE_IN_BODY_DOCS tag is set to YES, Doxygen will hide any +# documentation blocks found inside the body of a function. +# If set to NO (the default) these blocks will be appended to the +# function's detailed documentation block. + +HIDE_IN_BODY_DOCS = NO + +# 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 + +# 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 +# and Mac users are advised to set this option to NO. + +CASE_SENSE_NAMES = YES + +# 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 SHOW_INCLUDE_FILES tag is set to YES (the default) then Doxygen +# will put a list of the files that are included by a file in the documentation +# of that file. + +SHOW_INCLUDE_FILES = NO + +# 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 the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the +# brief documentation of file, namespace and class members alphabetically +# by member name. If set to NO (the default) the members will appear in +# declaration order. + +SORT_BRIEF_DOCS = NO + +# If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be +# sorted by fully-qualified names, including namespaces. If set to +# NO (the default), the class list will be sorted only by class name, +# not including the namespace part. +# Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES. +# Note: This option applies only to the class list, not to the +# alphabetical list. + +SORT_BY_SCOPE_NAME = NO + +# 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 + +# 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 consists 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 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 = YES + +# If the sources in your project are distributed over multiple directories +# then setting the SHOW_DIRECTORIES tag to YES will show the directory hierarchy +# in the documentation. The default is NO. + +SHOW_DIRECTORIES = NO + +# The FILE_VERSION_FILTER tag can be used to specify a program or script that +# doxygen should invoke to get the current version for each file (typically from the +# version control system). Doxygen will invoke the program by executing (via +# popen()) the command , where is the value of +# the FILE_VERSION_FILTER tag, and is the name of an input file +# provided by doxygen. Whatever the program writes to standard output +# is used as the file version. See the manual for examples. + +FILE_VERSION_FILTER = + +#--------------------------------------------------------------------------- +# 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 + +# If WARN_IF_DOC_ERROR is set to YES, doxygen will generate warnings for +# potential errors in the documentation, such as not documenting some +# parameters in a documented function, or documenting parameters that +# don't exist or using markup commands wrongly. + +WARN_IF_DOC_ERROR = YES + +# This WARN_NO_PARAMDOC option can be abled to get warnings for +# functions that are documented, but have no documentation for their parameters +# or return value. If set to NO (the default) doxygen will only warn about +# wrong or incomplete parameter documentation, but not about the absence of +# documentation. + +WARN_NO_PARAMDOC = NO + +# 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. Optionally the format may contain +# $version, which will be replaced by the version of the file (if it could +# be obtained via FILE_VERSION_FILTER) + +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 = include/zoo_lock.h + +# 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 *.cs *.php *.php3 *.inc *.m *.mm *.py + +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. Note that the wildcards are matched +# against the file with absolute path, so to exclude all test directories +# for example use the pattern */test/* + +EXCLUDE_PATTERNS = + +# The EXAMPLE_PATH tag can be used to specify one or more files or +# directories that contain example code fragments that are included (see +# the \include command). + +EXAMPLE_PATH = + +# If the value of the EXAMPLE_PATH tag contains directories, you can use the +# EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp +# and *.h) to filter out the source-files in the directories. If left +# blank all files are included. + +EXAMPLE_PATTERNS = + +# If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be +# searched for input files to be used with the \include or \dontinclude +# commands irrespective of the value of the RECURSIVE tag. +# Possible values are YES and NO. If left blank NO is used. + +EXAMPLE_RECURSIVE = NO + +# The IMAGE_PATH tag can be used to specify one or more files or +# directories that contain image that are included in the documentation (see +# the \image command). + +IMAGE_PATH = + +# The INPUT_FILTER tag can be used to specify a program that doxygen should +# invoke to filter for each input file. Doxygen will invoke the filter program +# by executing (via popen()) the command , where +# is the value of the INPUT_FILTER tag, and is the name of an +# input file. Doxygen will then use the output that the filter program writes +# to standard output. If FILTER_PATTERNS is specified, this tag will be +# ignored. + +INPUT_FILTER = + +# The FILTER_PATTERNS tag can be used to specify filters on a per file pattern +# basis. Doxygen will compare the file name with each pattern and apply the +# filter if there is a match. The filters are a list of the form: +# pattern=filter (like *.cpp=my_cpp_filter). See INPUT_FILTER for further +# info on how filters are used. If FILTER_PATTERNS is empty, INPUT_FILTER +# is applied to all files. + +FILTER_PATTERNS = + +# 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. +# Note: To get rid of all source code in the generated output, make sure also +# VERBATIM_HEADERS is set to NO. + +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 + +# 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 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 = YES + +# 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 = YES + +# If the REFERENCES_LINK_SOURCE tag is set to YES (the default) +# and SOURCE_BROWSER tag is set to YES, then the hyperlinks from +# functions in REFERENCES_RELATION and REFERENCED_BY_RELATION lists will +# link to the source code. Otherwise they will link to the documentstion. + +REFERENCES_LINK_SOURCE = YES + +# If the USE_HTAGS tag is set to YES then the references to source code +# will point to the HTML generated by the htags(1) tool instead of doxygen +# built-in source browser. The htags tool is part of GNU's global source +# tagging system (see http://www.gnu.org/software/global/global.html). You +# will need version 4.8.6 or higher. + +USE_HTAGS = 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 + +#--------------------------------------------------------------------------- +# 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 = NO + +# 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 = $(GENERATE_HTML) + +# 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 = html + +# 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. Note that doxygen will try to copy +# the style sheet file to the HTML output directory, so don't put your own +# stylesheet in the HTML output directory as well, or it will be erased! + +HTML_STYLESHEET = + +# 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 = $(GENERATE_HTMLHELP) + +# 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 directory. + +CHM_FILE = ../$(PROJECT).chm + +# 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 = $(HHC_PATH) + +# 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 = $(GENERATE_CHI) + +# 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 = NO + +# 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, DHTML, CSS and frames is required (for instance Mozilla 1.0+, +# Netscape 6.0+, Internet explorer 5.0+, or Konqueror). 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 = $(GENERATE_LATEX) + +# 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 = $(PAPER_SIZE) + +# 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 = $(GENERATE_PDF) + +# 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 + +# If LATEX_HIDE_INDICES is set to YES then doxygen will not +# include the index chapters (such as File Index, Compound Index, etc.) +# in the output. + +LATEX_HIDE_INDICES = 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 optimized for Word 97 and may not look very pretty with +# other RTF readers or editors. + +GENERATE_RTF = $(GENERATE_RTF) + +# 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 assignments. 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 = $(GENERATE_MAN) + +# 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. + +GENERATE_XML = $(GENERATE_XML) + +# The XML_OUTPUT tag is used to specify where the XML 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 `xml' will be used as the default path. + +XML_OUTPUT = xml + +# 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 = + +# If the XML_PROGRAMLISTING tag is set to YES Doxygen will +# dump the program listings (including syntax highlighting +# and cross-referencing information) to the XML output. Note that +# enabling this will significantly increase the size of the XML output. + +XML_PROGRAMLISTING = YES + +#--------------------------------------------------------------------------- +# 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 Perl module output +#--------------------------------------------------------------------------- + +# If the GENERATE_PERLMOD tag is set to YES Doxygen will +# generate a Perl module file that captures the structure of +# the code including all documentation. Note that this +# feature is still experimental and incomplete at the +# moment. + +GENERATE_PERLMOD = NO + +# If the PERLMOD_LATEX tag is set to YES Doxygen will generate +# the necessary Makefile rules, Perl scripts and LaTeX code to be able +# to generate PDF and DVI output from the Perl module output. + +PERLMOD_LATEX = NO + +# If the PERLMOD_PRETTY tag is set to YES the Perl module output will be +# nicely formatted so it can be parsed by a human reader. This is useful +# if you want to understand what is going on. On the other hand, if this +# tag is set to NO the size of the Perl module output will be much smaller +# and Perl will parse it just the same. + +PERLMOD_PRETTY = YES + +# The names of the make variables in the generated doxyrules.make file +# are prefixed with the string contained in PERLMOD_MAKEVAR_PREFIX. +# This is useful so different doxyrules.make files included by the same +# Makefile don't overwrite each other's variables. + +PERLMOD_MAKEVAR_PREFIX = + +#--------------------------------------------------------------------------- +# 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 = YES + +# 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_DEFINED 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. To prevent a macro definition from being +# undefined via #undef or recursively expanded use the := operator +# instead of the = operator. + +PREDEFINED = + +# If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF 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::additions related to external references +#--------------------------------------------------------------------------- + +# The TAGFILES option can be used to specify one or more tagfiles. +# Optionally an initial location of the external documentation +# can be added for each tagfile. The format of a tag file without +# this location is as follows: +# TAGFILES = file1 file2 ... +# Adding location for the tag files is done as follows: +# TAGFILES = file1=loc1 "file2 = loc2" ... +# where "loc1" and "loc2" can be relative or absolute paths or +# URLs. If a location is present for each tag, the installdox tool +# does not have to be run to correct the links. +# Note that each tag file must have a unique name +# (where the name does NOT include the path) +# If a tag file is not located in the directory in which doxygen +# is run, you must also specify the path to the tagfile here. + +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 = $(DOCDIR)/$(PROJECT).tag + +# 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 superseded by the HAVE_DOT option below. This is only a +# fallback. It is recommended to install and use dot, since it yields 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 = $(HAVE_DOT) + +# 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 the GROUP_GRAPHS and HAVE_DOT tags are set to YES then doxygen +# will generate a graph for groups, showing the direct groups dependencies + +GROUP_GRAPHS = YES + +# If the UML_LOOK tag is set to YES doxygen will generate inheritance and +# collaboration diagrams in a style similar to the OMG's Unified Modeling +# Language. + +UML_LOOK = NO + +# If set to YES, the inheritance and collaboration graphs will show the +# relations between templates and their instances. + +TEMPLATE_RELATIONS = NO + +# 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 CALL_GRAPH and HAVE_DOT tags are set to YES then doxygen will +# generate a call dependency graph for every global function or class method. +# Note that enabling this option will significantly increase the time of a run. +# So in most cases it will be better to enable call graphs for selected +# functions only using the \callgraph command. + +CALL_GRAPH = NO + +# If the CALLER_GRAPH and HAVE_DOT tags are set to YES then doxygen will +# generate a caller dependency graph for every global function or class method. +# Note that enabling this option will significantly increase the time of a run. +# So in most cases it will be better to enable caller graphs for selected +# functions only using the \callergraph command. + +CALLER_GRAPH = NO + +# 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 + +# If the DIRECTORY_GRAPH, SHOW_DIRECTORIES and HAVE_DOT tags are set to YES +# then doxygen will show the dependencies a directory has on other directories +# in a graphical way. The dependency relations are determined by the #include +# relations between the files in the directories. + +DIRECTORY_GRAPH = 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 in the path. + +DOT_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 + +# The MAX_DOT_GRAPH_DEPTH tag can be used to set the maximum depth of the +# graphs generated by dot. A depth value of 3 means that only nodes reachable +# from the root by following a path via at most 3 edges will be shown. Nodes +# that lay further from the root node will be omitted. Note that setting this +# option to 1 or 2 may greatly reduce the computation time needed for large +# code bases. Also note that a graph may be further truncated if the graph's +# image dimensions are not sufficient to fit the graph (see MAX_DOT_GRAPH_WIDTH +# and MAX_DOT_GRAPH_HEIGHT). If 0 is used for the depth value (the default), +# the graph is not depth-constrained. + +MAX_DOT_GRAPH_DEPTH = 0 + +# Set the DOT_TRANSPARENT tag to YES to generate images with a transparent +# background. This is disabled by default, which results in a white background. +# Warning: Depending on the platform used, enabling this option may lead to +# badly anti-aliased labels on the edges of a graph (i.e. they become hard to +# read). + +DOT_TRANSPARENT = NO + +# Set the DOT_MULTI_TARGETS tag to YES allow dot to generate multiple output +# files in one run (i.e. multiple -o and -T options on the command line). This +# makes dot run faster, but since only newer versions of dot (>1.8.10) +# support this, this feature is disabled by default. + +DOT_MULTI_TARGETS = NO + +# 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 intermediate dot files that are used to generate +# the various graphs. + +DOT_CLEANUP = YES + +#--------------------------------------------------------------------------- +# Configuration::additions 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 diff --git a/pkg/registry/zookeeper-3.4.6/recipes/lock/src/c/configure.ac b/pkg/registry/zookeeper-3.4.6/recipes/lock/src/c/configure.ac new file mode 100644 index 000000000..3954123ee --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/recipes/lock/src/c/configure.ac @@ -0,0 +1,82 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you 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. +# -*- Autoconf -*- +# Process this file with autoconf to produce a configure script. + +AC_PREREQ(2.59) + +AC_INIT([zoolock], [3.2.0]) + +AC_CONFIG_SRCDIR([include/zoo_lock.h]) + +PACKAGE=zoolock +VERSION=1.0 + +AC_SUBST(PACKAGE) +AC_SUBST(VERSION) + +BUILD_PATH="`pwd`" + +# Checks for programs. +AC_LANG_CPLUSPLUS + +AM_INIT_AUTOMAKE([-Wall foreign]) +# Checks for libraries. + +#initialize Doxygen support +DX_HTML_FEATURE(ON) +DX_CHM_FEATURE(OFF) +DX_CHI_FEATURE(OFF) +DX_MAN_FEATURE(OFF) +DX_RTF_FEATURE(OFF) +DX_XML_FEATURE(OFF) +DX_PDF_FEATURE(OFF) +DX_PS_FEATURE(OFF) +DX_INIT_DOXYGEN([zookeeper-locks],[c-doc.Doxyfile],[docs]) + + +ZOOKEEPER_PATH=${BUILD_PATH}/../../../../../src/c +ZOOKEEPER_LD=-L${BUILD_PATH}/../../../../../src/c\ -lzookeeper_mt + +AC_SUBST(ZOOKEEPER_PATH) +AC_SUBST(ZOOKEEPER_LD) + +# Checks for header files. +AC_HEADER_DIRENT +AC_HEADER_STDC +AC_CHECK_HEADERS([fcntl.h stdlib.h string.h sys/time.h unistd.h]) + +# Checks for typedefs, structures, and compiler characteristics. +AC_HEADER_STDBOOL +AC_C_CONST +AC_TYPE_UID_T +AC_C_INLINE +AC_TYPE_OFF_T +AC_TYPE_SIZE_T +AC_STRUCT_ST_BLOCKS +AC_HEADER_TIME +AC_C_VOLATILE +AC_PROG_CC +AC_PROG_LIBTOOL +#check for cppunit +AM_PATH_CPPUNIT(1.10.2) +# Checks for library functions. +AC_FUNC_UTIME_NULL +AC_CHECK_FUNCS([gettimeofday memset mkdir rmdir strdup strerror strstr strtol strtoul strtoull utime]) + +AC_CONFIG_FILES([Makefile]) +AC_OUTPUT +AC_C_VOLATILE diff --git a/pkg/registry/zookeeper-3.4.6/recipes/lock/src/c/include/zoo_lock.h b/pkg/registry/zookeeper-3.4.6/recipes/lock/src/c/include/zoo_lock.h new file mode 100644 index 000000000..5c06bbf2f --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/recipes/lock/src/c/include/zoo_lock.h @@ -0,0 +1,168 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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. + */ +#ifndef ZOOKEEPER_LOCK_H_ +#define ZOOKEEPER_LOCK_H_ + +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif +/** + * \brief the call back function called on status change of lock + * + * the call back funtion is called with a rc of 0 if lock is acquired and + * with an rc of 1 if the lock is released + * \param rc the value to let us know if its locked or unlocked + * \param cbdata the callback data that we passed when initializing + * the zookeeper lock. + */ + +typedef void (* zkr_lock_completion) (int rc, void* cbdata); + +/** + * \file zoo_lock.h + * \brief zookeeper recipe for locking and leader election. + * this api implements a writelock on a given path in zookeeper. + * this api can also be used for leader election. + */ + +struct zkr_lock_mutex { + zhandle_t *zh; + char *path; + struct ACL_vector *acl; + char *id; + void *cbdata; + zkr_lock_completion completion; + pthread_mutex_t pmutex; + int isOwner; + char* ownerid; +}; + +typedef struct zkr_lock_mutex zkr_lock_mutex_t; + + +/** + * \brief initializing a zookeeper lock. + * + * this method instantiates the zookeeper mutex lock. + * \param mutex the mutex to initialize + * \param zh the zookeeper handle to use + * \param path the path in zookeeper to use for locking + * \param acl the acls to use in zookeeper. + * \return return 0 if successful. + */ +ZOOAPI int zkr_lock_init(zkr_lock_mutex_t *mutex, zhandle_t* zh, + char* path, struct ACL_vector *acl); + +/** + * \brief initializing a zookeeper lock. + * + * + * this method instantiates the zookeeper mutex lock with + * a completion function. + * + * \param mutex the mutex to initialize + * \param zh the zookeeper handle to use + * \param path the path in zookeeper to use for locking + * \param acl the acls to use in zookeeper. + * \param completion the callback thats called when lock + * is acquired and released. + * \param cbdata the callback method is called with data + * \return return 0 if successful. + */ +ZOOAPI int zkr_lock_init_cb(zkr_lock_mutex_t *mutex, zhandle_t* zh, + char* path, struct ACL_vector *acl, + zkr_lock_completion completion, void* cbdata); + +/** + * \brief lock the zookeeper mutex + * + * this method tries locking the mutex + * \param mutex the zookeeper mutex + * \return return 0 if there is no error. check + * with zkr_lock_isowner() if you have the lock + */ +ZOOAPI int zkr_lock_lock(zkr_lock_mutex_t *mutex); + +/** + * \brief unlock the zookeeper mutex + * + * this method unlocks the zookeeper mutex + * \param mutex the zookeeper mutex + * \return return 0 if there is not error in executing unlock. + * else returns non zero + */ +ZOOAPI int zkr_lock_unlock(zkr_lock_mutex_t *mutex); + +/** + * \brief set the callback function for zookeeper mutex + * + * this method sets the callback for zookeeper mutex + * \param mutex the zookeeper mutex + * \param callback the call back completion function + */ +ZOOAPI void zkr_lock_setcallback(zkr_lock_mutex_t *mutex, + zkr_lock_completion completion); + +/** + * \brief get the callback function for zookeeper mutex + * + * this method gets the callback funtion for zookeeper mutex + * \param mutex the zookeeper mutex + * \return the lock completion function + */ +ZOOAPI zkr_lock_completion zkr_lock_getcallback(zkr_lock_mutex_t *mutex); + +/** + * \brief destroy the mutex + * this method free the mutex + * \param mutex destroy the zookepeer lock. + * \return return 0 if destroyed. + */ +ZOOAPI int zkr_lock_destroy(zkr_lock_mutex_t* mutex); + +/** + * \brief return the parent path this mutex is using + * this method returns the parent path + * \param mutex the mutex + * \return return the parent path + */ +ZOOAPI char* zkr_lock_getpath(zkr_lock_mutex_t *mutex); + +/** + * \brief return if this mutex is owner of the lock + * this method returns if its owner or not + * \param mutex the mutex + * \return return true if is owner and false if not + */ +ZOOAPI int zkr_lock_isowner(zkr_lock_mutex_t *mutex); + +/** + * \brief return the id for this mutex + * this mutex retunrns the id string + * \param mutex the mutex + * \return the id for this mutex + */ +ZOOAPI char* zkr_lock_getid(zkr_lock_mutex_t *mutex); + +#ifdef __cplusplus +} +#endif +#endif //ZOOKEEPER_LOCK_H_ diff --git a/pkg/registry/zookeeper-3.4.6/recipes/lock/src/c/src/zoo_lock.c b/pkg/registry/zookeeper-3.4.6/recipes/lock/src/c/src/zoo_lock.c new file mode 100644 index 000000000..8a6d81763 --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/recipes/lock/src/c/src/zoo_lock.c @@ -0,0 +1,396 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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. + */ + +#ifdef DLL_EXPORT +#define USE_STATIC_LIB +#endif + +#if defined(__CYGWIN__) +#define USE_IPV6 +#endif + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#ifdef HAVE_SYS_UTSNAME_H +#include +#endif + +#ifdef HAVE_GETPWUID_R +#include +#endif + +#define IF_DEBUG(x) if (logLevel==ZOO_LOG_LEVEL_DEBUG) {x;} + + +ZOOAPI int zkr_lock_init(zkr_lock_mutex_t* mutex, zhandle_t* zh, + char* path, struct ACL_vector *acl) { + mutex->zh = zh; + mutex->path = path; + mutex->acl = acl; + mutex->completion = NULL; + mutex->cbdata = NULL; + mutex->id = NULL; + mutex->ownerid = NULL; + mutex->isOwner = 0; + pthread_mutex_init(&(mutex->pmutex), NULL); + return 0; +} + +ZOOAPI int zkr_lock_init_cb(zkr_lock_mutex_t *mutex, zhandle_t* zh, + char *path, struct ACL_vector *acl, + zkr_lock_completion completion, void* cbdata) { + mutex->zh = zh; + mutex->path = path; + mutex->acl = acl; + mutex->completion = completion; + mutex->cbdata = cbdata; + mutex->isOwner = 0; + mutex->ownerid = NULL; + mutex->id = NULL; + pthread_mutex_init(&(mutex->pmutex), NULL); + return 0; +} + +/** + * unlock the mutex + */ +ZOOAPI int zkr_lock_unlock(zkr_lock_mutex_t *mutex) { + pthread_mutex_lock(&(mutex->pmutex)); + zhandle_t *zh = mutex->zh; + if (mutex->id != NULL) { + int len = strlen(mutex->path) + strlen(mutex->id) + 2; + char buf[len]; + sprintf(buf, "%s/%s", mutex->path, mutex->id); + int ret = 0; + int count = 0; + struct timespec ts; + ts.tv_sec = 0; + ts.tv_nsec = (.5)*1000000; + ret = ZCONNECTIONLOSS; + while (ret == ZCONNECTIONLOSS && (count < 3)) { + ret = zoo_delete(zh, buf, -1); + if (ret == ZCONNECTIONLOSS) { + LOG_DEBUG(("connectionloss while deleting the node")); + nanosleep(&ts, 0); + count++; + } + } + if (ret == ZOK || ret == ZNONODE) { + zkr_lock_completion completion = mutex->completion; + if (completion != NULL) { + completion(1, mutex->cbdata); + } + + free(mutex->id); + mutex->id = NULL; + pthread_mutex_unlock(&(mutex->pmutex)); + return 0; + } + LOG_WARN(("not able to connect to server - giving up")); + pthread_mutex_unlock(&(mutex->pmutex)); + return ZCONNECTIONLOSS; + } + pthread_mutex_unlock(&(mutex->pmutex)); + return ZSYSTEMERROR; +} + +static void free_String_vector(struct String_vector *v) { + if (v->data) { + int32_t i; + for (i=0; icount; i++) { + free(v->data[i]); + } + free(v->data); + v->data = 0; + } +} + +static int vstrcmp(const void* str1, const void* str2) { + const char **a = (const char**)str1; + const char **b = (const char**) str2; + return strcmp(strrchr(*a, '-')+1, strrchr(*b, '-')+1); +} + +static void sort_children(struct String_vector *vector) { + qsort( vector->data, vector->count, sizeof(char*), &vstrcmp); +} + +static char* child_floor(char **sorted_data, int len, char *element) { + char* ret = NULL; + int i =0; + for (i=0; i < len; i++) { + if (strcmp(sorted_data[i], element) < 0) { + ret = sorted_data[i]; + } + } + return ret; +} + +static void lock_watcher_fn(zhandle_t* zh, int type, int state, + const char* path, void *watcherCtx) { + //callback that we registered + //should be called + zkr_lock_lock((zkr_lock_mutex_t*) watcherCtx); +} + +/** + * get the last name of the path + */ +static char* getName(char* str) { + char* name = strrchr(str, '/'); + if (name == NULL) + return NULL; + return strdup(name + 1); +} + +/** + * just a method to retry get children + */ +static int retry_getchildren(zhandle_t *zh, char* path, struct String_vector *vector, + struct timespec *ts, int retry) { + int ret = ZCONNECTIONLOSS; + int count = 0; + while (ret == ZCONNECTIONLOSS && count < retry) { + ret = zoo_get_children(zh, path, 0, vector); + if (ret == ZCONNECTIONLOSS) { + LOG_DEBUG(("connection loss to the server")); + nanosleep(ts, 0); + count++; + } + } + return ret; +} + +/** see if our node already exists + * if it does then we dup the name and + * return it + */ +static char* lookupnode(struct String_vector *vector, char *prefix) { + char *ret = NULL; + if (vector->data) { + int i = 0; + for (i = 0; i < vector->count; i++) { + char* child = vector->data[i]; + if (strncmp(prefix, child, strlen(prefix)) == 0) { + ret = strdup(child); + break; + } + } + } + return ret; +} + +/** retry zoo_wexists + */ +static int retry_zoowexists(zhandle_t *zh, char* path, watcher_fn watcher, void* ctx, + struct Stat *stat, struct timespec *ts, int retry) { + int ret = ZCONNECTIONLOSS; + int count = 0; + while (ret == ZCONNECTIONLOSS && count < retry) { + ret = zoo_wexists(zh, path, watcher, ctx, stat); + if (ret == ZCONNECTIONLOSS) { + LOG_DEBUG(("connectionloss while setting watch on my predecessor")); + nanosleep(ts, 0); + count++; + } + } + return ret; +} + +/** + * the main code that does the zookeeper leader + * election. this code creates its own ephemeral + * node on the given path and sees if its the first + * one on the list and claims to be a leader if and only + * if its the first one of children in the paretn path + */ +static int zkr_lock_operation(zkr_lock_mutex_t *mutex, struct timespec *ts) { + zhandle_t *zh = mutex->zh; + char *path = mutex->path; + char *id = mutex->id; + struct Stat stat; + char* owner_id = NULL; + int retry = 3; + do { + const clientid_t *cid = zoo_client_id(zh); + // get the session id + int64_t session = cid->client_id; + char prefix[30]; + int ret = 0; +#if defined(__x86_64__) + snprintf(prefix, 30, "x-%016lx-", session); +#else + snprintf(prefix, 30, "x-%016llx-", session); +#endif + struct String_vector vectorst; + vectorst.data = NULL; + vectorst.count = 0; + ret = ZCONNECTIONLOSS; + ret = retry_getchildren(zh, path, &vectorst, ts, retry); + if (ret != ZOK) + return ret; + struct String_vector *vector = &vectorst; + mutex->id = lookupnode(vector, prefix); + free_String_vector(vector); + if (mutex->id == NULL) { + int len = strlen(path) + strlen(prefix) + 2; + char buf[len]; + char retbuf[len+20]; + snprintf(buf, len, "%s/%s", path, prefix); + ret = ZCONNECTIONLOSS; + ret = zoo_create(zh, buf, NULL, 0, mutex->acl, + ZOO_EPHEMERAL|ZOO_SEQUENCE, retbuf, (len+20)); + + // do not want to retry the create since + // we would end up creating more than one child + if (ret != ZOK) { + LOG_WARN(("could not create zoo node %s", buf)); + return ret; + } + mutex->id = getName(retbuf); + } + + if (mutex->id != NULL) { + ret = ZCONNECTIONLOSS; + ret = retry_getchildren(zh, path, vector, ts, retry); + if (ret != ZOK) { + LOG_WARN(("could not connect to server")); + return ret; + } + //sort this list + sort_children(vector); + owner_id = vector->data[0]; + mutex->ownerid = strdup(owner_id); + id = mutex->id; + char* lessthanme = child_floor(vector->data, vector->count, id); + if (lessthanme != NULL) { + int flen = strlen(mutex->path) + strlen(lessthanme) + 2; + char last_child[flen]; + sprintf(last_child, "%s/%s",mutex->path, lessthanme); + ret = ZCONNECTIONLOSS; + ret = retry_zoowexists(zh, last_child, &lock_watcher_fn, mutex, + &stat, ts, retry); + // cannot watch my predecessor i am giving up + // we need to be able to watch the predecessor + // since if we do not become a leader the others + // will keep waiting + if (ret != ZOK) { + free_String_vector(vector); + LOG_WARN(("unable to watch my predecessor")); + ret = zkr_lock_unlock(mutex); + while (ret == 0) { + //we have to give up our leadership + // since we cannot watch out predecessor + ret = zkr_lock_unlock(mutex); + } + return ret; + } + // we are not the owner of the lock + mutex->isOwner = 0; + } + else { + // this is the case when we are the owner + // of the lock + if (strcmp(mutex->id, owner_id) == 0) { + LOG_DEBUG(("got the zoo lock owner - %s", mutex->id)); + mutex->isOwner = 1; + if (mutex->completion != NULL) { + mutex->completion(0, mutex->cbdata); + } + return ZOK; + } + } + free_String_vector(vector); + return ZOK; + } + } while (mutex->id == NULL); + return ZOK; +} + +ZOOAPI int zkr_lock_lock(zkr_lock_mutex_t *mutex) { + pthread_mutex_lock(&(mutex->pmutex)); + zhandle_t *zh = mutex->zh; + char *path = mutex->path; + struct Stat stat; + int exists = zoo_exists(zh, path, 0, &stat); + int count = 0; + struct timespec ts; + ts.tv_sec = 0; + ts.tv_nsec = (.5)*1000000; + // retry to see if the path exists and + // and create if the path does not exist + while ((exists == ZCONNECTIONLOSS || exists == ZNONODE) && (count <4)) { + count++; + // retry the operation + if (exists == ZCONNECTIONLOSS) + exists = zoo_exists(zh, path, 0, &stat); + else if (exists == ZNONODE) + exists = zoo_create(zh, path, NULL, 0, mutex->acl, 0, NULL, 0); + nanosleep(&ts, 0); + + } + + // need to check if we cannot still access the server + int check_retry = ZCONNECTIONLOSS; + count = 0; + while (check_retry != ZOK && count <4) { + check_retry = zkr_lock_operation(mutex, &ts); + if (check_retry != ZOK) { + nanosleep(&ts, 0); + count++; + } + } + pthread_mutex_unlock(&(mutex->pmutex)); + return zkr_lock_isowner(mutex); +} + + +ZOOAPI char* zkr_lock_getpath(zkr_lock_mutex_t *mutex) { + return mutex->path; +} + +ZOOAPI int zkr_lock_isowner(zkr_lock_mutex_t *mutex) { + return (mutex->id != NULL && mutex->ownerid != NULL + && (strcmp(mutex->id, mutex->ownerid) == 0)); +} + +ZOOAPI char* zkr_lock_getid(zkr_lock_mutex_t *mutex) { + return mutex->ownerid; +} + +ZOOAPI int zkr_lock_destroy(zkr_lock_mutex_t* mutex) { + if (mutex->id) + free(mutex->id); + mutex->path = NULL; + mutex->acl = NULL; + mutex->completion = NULL; + pthread_mutex_destroy(&(mutex->pmutex)); + mutex->isOwner = 0; + if (mutex->ownerid) + free(mutex->ownerid); + return 0; +} + diff --git a/pkg/registry/zookeeper-3.4.6/recipes/lock/src/c/tests/TestClient.cc b/pkg/registry/zookeeper-3.4.6/recipes/lock/src/c/tests/TestClient.cc new file mode 100644 index 000000000..2cc56cf34 --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/recipes/lock/src/c/tests/TestClient.cc @@ -0,0 +1,201 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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. + */ + +#include + +#include +#include +#include + + +using namespace std; + +#include +#include + +#include +#include + +static void yield(zhandle_t *zh, int i) +{ + sleep(i); +} + +typedef struct evt { + string path; + int type; +} evt_t; + +typedef struct watchCtx { +private: + list events; +public: + bool connected; + zhandle_t *zh; + + watchCtx() { + connected = false; + zh = 0; + } + ~watchCtx() { + if (zh) { + zookeeper_close(zh); + zh = 0; + } + } + + evt_t getEvent() { + evt_t evt; + evt = events.front(); + events.pop_front(); + return evt; + } + + int countEvents() { + int count; + count = events.size(); + return count; + } + + void putEvent(evt_t evt) { + events.push_back(evt); + } + + bool waitForConnected(zhandle_t *zh) { + time_t expires = time(0) + 10; + while(!connected && time(0) < expires) { + yield(zh, 1); + } + return connected; + } + bool waitForDisconnected(zhandle_t *zh) { + time_t expires = time(0) + 15; + while(connected && time(0) < expires) { + yield(zh, 1); + } + return !connected; + } +} watchctx_t; + +class Zookeeper_locktest : public CPPUNIT_NS::TestFixture +{ + CPPUNIT_TEST_SUITE(Zookeeper_locktest); + CPPUNIT_TEST(testlock); + CPPUNIT_TEST_SUITE_END(); + + static void watcher(zhandle_t *, int type, int state, const char *path,void*v){ + watchctx_t *ctx = (watchctx_t*)v; + + if (state == ZOO_CONNECTED_STATE) { + ctx->connected = true; + } else { + ctx->connected = false; + } + if (type != ZOO_SESSION_EVENT) { + evt_t evt; + evt.path = path; + evt.type = type; + ctx->putEvent(evt); + } + } + + static const char hostPorts[]; + + const char *getHostPorts() { + return hostPorts; + } + + zhandle_t *createClient(watchctx_t *ctx) { + zhandle_t *zk = zookeeper_init(hostPorts, watcher, 10000, 0, + ctx, 0); + ctx->zh = zk; + sleep(1); + return zk; + } + +public: + +#define ZKSERVER_CMD "./tests/zkServer.sh" + + void setUp() + { + char cmd[1024]; + sprintf(cmd, "%s startClean %s", ZKSERVER_CMD, getHostPorts()); + CPPUNIT_ASSERT(system(cmd) == 0); + } + + + void startServer() { + char cmd[1024]; + sprintf(cmd, "%s start %s", ZKSERVER_CMD, getHostPorts()); + CPPUNIT_ASSERT(system(cmd) == 0); + } + + void stopServer() { + tearDown(); + } + + void tearDown() + { + char cmd[1024]; + sprintf(cmd, "%s stop %s", ZKSERVER_CMD, getHostPorts()); + CPPUNIT_ASSERT(system(cmd) == 0); + } + + + void testlock() + { + watchctx_t ctx; + int rc; + struct Stat stat; + char buf[1024]; + int blen; + struct String_vector strings; + const char *testName; + zkr_lock_mutex_t mutexes[3]; + int count = 3; + int i = 0; + char* path = "/test-lock"; + for (i=0; i< 3; i++) { + zhandle_t *zh = createClient(&ctx); + zkr_lock_init(&mutexes[i], zh, path, &ZOO_OPEN_ACL_UNSAFE); + zkr_lock_lock(&mutexes[i]); + } + sleep(30); + zkr_lock_mutex leader = mutexes[0]; + zkr_lock_mutex mutex; + int ret = strcmp(leader.id, leader.ownerid); + CPPUNIT_ASSERT(ret == 0); + for(i=1; i < count; i++) { + mutex = mutexes[i]; + CPPUNIT_ASSERT(strcmp(mutex.id, mutex.ownerid) != 0); + } + zkr_lock_unlock(&leader); + sleep(30); + zkr_lock_mutex secondleader = mutexes[1]; + CPPUNIT_ASSERT(strcmp(secondleader.id , secondleader.ownerid) == 0); + for (i=2; i +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "Util.h" + +using namespace std; + +CPPUNIT_NS_BEGIN + +class EclipseOutputter: public CompilerOutputter +{ +public: + EclipseOutputter(TestResultCollector *result,ostream &stream): + CompilerOutputter(result,stream,"%p:%l: "),stream_(stream) + { + } + virtual void printFailedTestName( TestFailure *failure ){} + virtual void printFailureMessage( TestFailure *failure ) + { + stream_<<": "; + Message msg = failure->thrownException()->message(); + stream_<< msg.shortDescription(); + + string text; + for(int i=0; i the output must be in the compiler error format. + //bool selfTest = (argc > 1) && (std::string("-ide") == argv[1]); + globalTestConfig.addConfigFromCmdLine(argc,argv); + + // Create the event manager and test controller + CPPUNIT_NS::TestResult controller; + // Add a listener that colllects test result + CPPUNIT_NS::TestResultCollector result; + controller.addListener( &result ); + + // Add a listener that print dots as tests run. + // CPPUNIT_NS::TextTestProgressListener progress; + CPPUNIT_NS::BriefTestProgressListener progress; + controller.addListener( &progress ); + + CPPUNIT_NS::TestRunner runner; + runner.addTest( CPPUNIT_NS::TestFactoryRegistry::getRegistry().makeTest() ); + + try + { + cout << "Running " << globalTestConfig.getTestName(); + runner.run( controller, globalTestConfig.getTestName()); + cout< +#include +#include + +// number of elements in array +#define COUNTOF(array) sizeof(array)/sizeof(array[0]) + +#define DECLARE_WRAPPER(ret,sym,sig) \ + extern "C" ret __real_##sym sig; \ + extern "C" ret __wrap_##sym sig + +#define CALL_REAL(sym,params) \ + __real_##sym params + +// must include "src/zookeeper_log.h" to be able to use this macro +#define TEST_TRACE(x) \ + log_message(3,__LINE__,__func__,format_log_message x) + +extern const std::string EMPTY_STRING; + +// ***************************************************************************** +// A bit of wizardry to get to the bare type from a reference or a pointer +// to the type +template +struct TypeOp { + typedef T BareT; + typedef T ArgT; +}; + +// partial specialization for reference types +template +struct TypeOp{ + typedef T& ArgT; + typedef typename TypeOp::BareT BareT; +}; + +// partial specialization for pointers +template +struct TypeOp{ + typedef T* ArgT; + typedef typename TypeOp::BareT BareT; +}; + +// ***************************************************************************** +// Container utilities + +template +void putValue(std::map& map,const K& k, const V& v){ + typedef std::map Map; + typename Map::const_iterator it=map.find(k); + if(it==map.end()) + map.insert(typename Map::value_type(k,v)); + else + map[k]=v; +} + +template +bool getValue(const std::map& map,const K& k,V& v){ + typedef std::map Map; + typename Map::const_iterator it=map.find(k); + if(it==map.end()) + return false; + v=it->second; + return true; +} + +// ***************************************************************************** +// misc utils + +// millisecond sleep +void millisleep(int ms); +// evaluate given predicate until it returns true or the timeout +// (in millis) has expired +template +int ensureCondition(const Predicate& p,int timeout){ + int elapsed=0; + while(!p() && elapsed CmdLineOptList; +public: + typedef CmdLineOptList::const_iterator const_iterator; + TestConfig(){} + ~TestConfig(){} + void addConfigFromCmdLine(int argc, char* argv[]){ + if(argc>=2) + testName_=argv[1]; + for(int i=2; i /tmp/zk.log & + echo $! > /tmp/zk.pid + sleep 5 + ;; +stop) + # Already killed above + ;; +*) + echo "Unknown command " + $1 + exit 2 +esac + diff --git a/pkg/registry/zookeeper-3.4.6/recipes/lock/src/java/org/apache/zookeeper/recipes/lock/LockListener.java b/pkg/registry/zookeeper-3.4.6/recipes/lock/src/java/org/apache/zookeeper/recipes/lock/LockListener.java new file mode 100644 index 000000000..1c21ad661 --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/recipes/lock/src/java/org/apache/zookeeper/recipes/lock/LockListener.java @@ -0,0 +1,38 @@ +/** + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + */ +package org.apache.zookeeper.recipes.lock; + +/** + * This class has two methods which are call + * back methods when a lock is acquired and + * when the lock is released. + * + */ +public interface LockListener { + /** + * call back called when the lock + * is acquired + */ + public void lockAcquired(); + + /** + * call back called when the lock is + * released. + */ + public void lockReleased(); +} diff --git a/pkg/registry/zookeeper-3.4.6/recipes/lock/src/java/org/apache/zookeeper/recipes/lock/ProtocolSupport.java b/pkg/registry/zookeeper-3.4.6/recipes/lock/src/java/org/apache/zookeeper/recipes/lock/ProtocolSupport.java new file mode 100644 index 000000000..4efdb854d --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/recipes/lock/src/java/org/apache/zookeeper/recipes/lock/ProtocolSupport.java @@ -0,0 +1,193 @@ +/** + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + */ +package org.apache.zookeeper.recipes.lock; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.apache.zookeeper.CreateMode; +import org.apache.zookeeper.KeeperException; +import org.apache.zookeeper.ZooDefs; +import org.apache.zookeeper.ZooKeeper; +import org.apache.zookeeper.data.ACL; +import org.apache.zookeeper.data.Stat; +import org.apache.zookeeper.recipes.lock.ZooKeeperOperation; + +import java.util.List; +import java.util.concurrent.atomic.AtomicBoolean; + +/** + * A base class for protocol implementations which provides a number of higher + * level helper methods for working with ZooKeeper along with retrying synchronous + * operations if the connection to ZooKeeper closes such as + * {@link #retryOperation(ZooKeeperOperation)} + * + */ +class ProtocolSupport { + private static final Logger LOG = LoggerFactory.getLogger(ProtocolSupport.class); + + protected final ZooKeeper zookeeper; + private AtomicBoolean closed = new AtomicBoolean(false); + private long retryDelay = 500L; + private int retryCount = 10; + private List acl = ZooDefs.Ids.OPEN_ACL_UNSAFE; + + public ProtocolSupport(ZooKeeper zookeeper) { + this.zookeeper = zookeeper; + } + + /** + * Closes this strategy and releases any ZooKeeper resources; but keeps the + * ZooKeeper instance open + */ + public void close() { + if (closed.compareAndSet(false, true)) { + doClose(); + } + } + + /** + * return zookeeper client instance + * @return zookeeper client instance + */ + public ZooKeeper getZookeeper() { + return zookeeper; + } + + /** + * return the acl its using + * @return the acl. + */ + public List getAcl() { + return acl; + } + + /** + * set the acl + * @param acl the acl to set to + */ + public void setAcl(List acl) { + this.acl = acl; + } + + /** + * get the retry delay in milliseconds + * @return the retry delay + */ + public long getRetryDelay() { + return retryDelay; + } + + /** + * Sets the time waited between retry delays + * @param retryDelay the retry delay + */ + public void setRetryDelay(long retryDelay) { + this.retryDelay = retryDelay; + } + + /** + * Allow derived classes to perform + * some custom closing operations to release resources + */ + protected void doClose() { + } + + + /** + * Perform the given operation, retrying if the connection fails + * @return object. it needs to be cast to the callee's expected + * return type. + */ + protected Object retryOperation(ZooKeeperOperation operation) + throws KeeperException, InterruptedException { + KeeperException exception = null; + for (int i = 0; i < retryCount; i++) { + try { + return operation.execute(); + } catch (KeeperException.SessionExpiredException e) { + LOG.warn("Session expired for: " + zookeeper + " so reconnecting due to: " + e, e); + throw e; + } catch (KeeperException.ConnectionLossException e) { + if (exception == null) { + exception = e; + } + LOG.debug("Attempt " + i + " failed with connection loss so " + + "attempting to reconnect: " + e, e); + retryDelay(i); + } + } + throw exception; + } + + /** + * Ensures that the given path exists with no data, the current + * ACL and no flags + * @param path + */ + protected void ensurePathExists(String path) { + ensureExists(path, null, acl, CreateMode.PERSISTENT); + } + + /** + * Ensures that the given path exists with the given data, ACL and flags + * @param path + * @param acl + * @param flags + */ + protected void ensureExists(final String path, final byte[] data, + final List acl, final CreateMode flags) { + try { + retryOperation(new ZooKeeperOperation() { + public boolean execute() throws KeeperException, InterruptedException { + Stat stat = zookeeper.exists(path, false); + if (stat != null) { + return true; + } + zookeeper.create(path, data, acl, flags); + return true; + } + }); + } catch (KeeperException e) { + LOG.warn("Caught: " + e, e); + } catch (InterruptedException e) { + LOG.warn("Caught: " + e, e); + } + } + + /** + * Returns true if this protocol has been closed + * @return true if this protocol is closed + */ + protected boolean isClosed() { + return closed.get(); + } + + /** + * Performs a retry delay if this is not the first attempt + * @param attemptCount the number of the attempts performed so far + */ + protected void retryDelay(int attemptCount) { + if (attemptCount > 0) { + try { + Thread.sleep(attemptCount * retryDelay); + } catch (InterruptedException e) { + LOG.debug("Failed to sleep: " + e, e); + } + } + } +} diff --git a/pkg/registry/zookeeper-3.4.6/recipes/lock/src/java/org/apache/zookeeper/recipes/lock/WriteLock.java b/pkg/registry/zookeeper-3.4.6/recipes/lock/src/java/org/apache/zookeeper/recipes/lock/WriteLock.java new file mode 100644 index 000000000..5caebee46 --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/recipes/lock/src/java/org/apache/zookeeper/recipes/lock/WriteLock.java @@ -0,0 +1,296 @@ +/** + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + */ +package org.apache.zookeeper.recipes.lock; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.apache.zookeeper.KeeperException; +import org.apache.zookeeper.WatchedEvent; +import org.apache.zookeeper.Watcher; +import static org.apache.zookeeper.CreateMode.EPHEMERAL_SEQUENTIAL; +import org.apache.zookeeper.ZooKeeper; +import org.apache.zookeeper.data.ACL; +import org.apache.zookeeper.data.Stat; + +import java.util.List; +import java.util.SortedSet; +import java.util.TreeSet; + +/** + * A
    protocol to implement an exclusive + * write lock or to elect a leader.

    You invoke {@link #lock()} to + * start the process of grabbing the lock; you may get the lock then or it may be + * some time later.

    You can register a listener so that you are invoked + * when you get the lock; otherwise you can ask if you have the lock + * by calling {@link #isOwner()} + * + */ +public class WriteLock extends ProtocolSupport { + private static final Logger LOG = LoggerFactory.getLogger(WriteLock.class); + + private final String dir; + private String id; + private ZNodeName idName; + private String ownerId; + private String lastChildId; + private byte[] data = {0x12, 0x34}; + private LockListener callback; + private LockZooKeeperOperation zop; + + /** + * zookeeper contructor for writelock + * @param zookeeper zookeeper client instance + * @param dir the parent path you want to use for locking + * @param acls the acls that you want to use for all the paths, + * if null world read/write is used. + */ + public WriteLock(ZooKeeper zookeeper, String dir, List acl) { + super(zookeeper); + this.dir = dir; + if (acl != null) { + setAcl(acl); + } + this.zop = new LockZooKeeperOperation(); + } + + /** + * zookeeper contructor for writelock with callback + * @param zookeeper the zookeeper client instance + * @param dir the parent path you want to use for locking + * @param acl the acls that you want to use for all the paths + * @param callback the call back instance + */ + public WriteLock(ZooKeeper zookeeper, String dir, List acl, + LockListener callback) { + this(zookeeper, dir, acl); + this.callback = callback; + } + + /** + * return the current locklistener + * @return the locklistener + */ + public LockListener getLockListener() { + return this.callback; + } + + /** + * register a different call back listener + * @param callback the call back instance + */ + public void setLockListener(LockListener callback) { + this.callback = callback; + } + + /** + * Removes the lock or associated znode if + * you no longer require the lock. this also + * removes your request in the queue for locking + * in case you do not already hold the lock. + * @throws RuntimeException throws a runtime exception + * if it cannot connect to zookeeper. + */ + public synchronized void unlock() throws RuntimeException { + + if (!isClosed() && id != null) { + // we don't need to retry this operation in the case of failure + // as ZK will remove ephemeral files and we don't wanna hang + // this process when closing if we cannot reconnect to ZK + try { + + ZooKeeperOperation zopdel = new ZooKeeperOperation() { + public boolean execute() throws KeeperException, + InterruptedException { + zookeeper.delete(id, -1); + return Boolean.TRUE; + } + }; + zopdel.execute(); + } catch (InterruptedException e) { + LOG.warn("Caught: " + e, e); + //set that we have been interrupted. + Thread.currentThread().interrupt(); + } catch (KeeperException.NoNodeException e) { + // do nothing + } catch (KeeperException e) { + LOG.warn("Caught: " + e, e); + throw (RuntimeException) new RuntimeException(e.getMessage()). + initCause(e); + } + finally { + if (callback != null) { + callback.lockReleased(); + } + id = null; + } + } + } + + /** + * the watcher called on + * getting watch while watching + * my predecessor + */ + private class LockWatcher implements Watcher { + public void process(WatchedEvent event) { + // lets either become the leader or watch the new/updated node + LOG.debug("Watcher fired on path: " + event.getPath() + " state: " + + event.getState() + " type " + event.getType()); + try { + lock(); + } catch (Exception e) { + LOG.warn("Failed to acquire lock: " + e, e); + } + } + } + + /** + * a zoookeeper operation that is mainly responsible + * for all the magic required for locking. + */ + private class LockZooKeeperOperation implements ZooKeeperOperation { + + /** find if we have been created earler if not create our node + * + * @param prefix the prefix node + * @param zookeeper teh zookeeper client + * @param dir the dir paretn + * @throws KeeperException + * @throws InterruptedException + */ + private void findPrefixInChildren(String prefix, ZooKeeper zookeeper, String dir) + throws KeeperException, InterruptedException { + List names = zookeeper.getChildren(dir, false); + for (String name : names) { + if (name.startsWith(prefix)) { + id = name; + if (LOG.isDebugEnabled()) { + LOG.debug("Found id created last time: " + id); + } + break; + } + } + if (id == null) { + id = zookeeper.create(dir + "/" + prefix, data, + getAcl(), EPHEMERAL_SEQUENTIAL); + + if (LOG.isDebugEnabled()) { + LOG.debug("Created id: " + id); + } + } + + } + + /** + * the command that is run and retried for actually + * obtaining the lock + * @return if the command was successful or not + */ + public boolean execute() throws KeeperException, InterruptedException { + do { + if (id == null) { + long sessionId = zookeeper.getSessionId(); + String prefix = "x-" + sessionId + "-"; + // lets try look up the current ID if we failed + // in the middle of creating the znode + findPrefixInChildren(prefix, zookeeper, dir); + idName = new ZNodeName(id); + } + if (id != null) { + List names = zookeeper.getChildren(dir, false); + if (names.isEmpty()) { + LOG.warn("No children in: " + dir + " when we've just " + + "created one! Lets recreate it..."); + // lets force the recreation of the id + id = null; + } else { + // lets sort them explicitly (though they do seem to come back in order ususally :) + SortedSet sortedNames = new TreeSet(); + for (String name : names) { + sortedNames.add(new ZNodeName(dir + "/" + name)); + } + ownerId = sortedNames.first().getName(); + SortedSet lessThanMe = sortedNames.headSet(idName); + if (!lessThanMe.isEmpty()) { + ZNodeName lastChildName = lessThanMe.last(); + lastChildId = lastChildName.getName(); + if (LOG.isDebugEnabled()) { + LOG.debug("watching less than me node: " + lastChildId); + } + Stat stat = zookeeper.exists(lastChildId, new LockWatcher()); + if (stat != null) { + return Boolean.FALSE; + } else { + LOG.warn("Could not find the" + + " stats for less than me: " + lastChildName.getName()); + } + } else { + if (isOwner()) { + if (callback != null) { + callback.lockAcquired(); + } + return Boolean.TRUE; + } + } + } + } + } + while (id == null); + return Boolean.FALSE; + } + }; + + /** + * Attempts to acquire the exclusive write lock returning whether or not it was + * acquired. Note that the exclusive lock may be acquired some time later after + * this method has been invoked due to the current lock owner going away. + */ + public synchronized boolean lock() throws KeeperException, InterruptedException { + if (isClosed()) { + return false; + } + ensurePathExists(dir); + + return (Boolean) retryOperation(zop); + } + + /** + * return the parent dir for lock + * @return the parent dir used for locks. + */ + public String getDir() { + return dir; + } + + /** + * Returns true if this node is the owner of the + * lock (or the leader) + */ + public boolean isOwner() { + return id != null && ownerId != null && id.equals(ownerId); + } + + /** + * return the id for this lock + * @return the id for this lock + */ + public String getId() { + return this.id; + } +} + diff --git a/pkg/registry/zookeeper-3.4.6/recipes/lock/src/java/org/apache/zookeeper/recipes/lock/ZNodeName.java b/pkg/registry/zookeeper-3.4.6/recipes/lock/src/java/org/apache/zookeeper/recipes/lock/ZNodeName.java new file mode 100644 index 000000000..99b6616f9 --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/recipes/lock/src/java/org/apache/zookeeper/recipes/lock/ZNodeName.java @@ -0,0 +1,110 @@ +/** + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + */ +package org.apache.zookeeper.recipes.lock; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * Represents an ephemeral znode name which has an ordered sequence number + * and can be sorted in order + * + */ +class ZNodeName implements Comparable { + private final String name; + private String prefix; + private int sequence = -1; + private static final Logger LOG = LoggerFactory.getLogger(ZNodeName.class); + + public ZNodeName(String name) { + if (name == null) { + throw new NullPointerException("id cannot be null"); + } + this.name = name; + this.prefix = name; + int idx = name.lastIndexOf('-'); + if (idx >= 0) { + this.prefix = name.substring(0, idx); + try { + this.sequence = Integer.parseInt(name.substring(idx + 1)); + // If an exception occurred we misdetected a sequence suffix, + // so return -1. + } catch (NumberFormatException e) { + LOG.info("Number format exception for " + idx, e); + } catch (ArrayIndexOutOfBoundsException e) { + LOG.info("Array out of bounds for " + idx, e); + } + } + } + + @Override + public String toString() { + return name.toString(); + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + + ZNodeName sequence = (ZNodeName) o; + + if (!name.equals(sequence.name)) return false; + + return true; + } + + @Override + public int hashCode() { + return name.hashCode() + 37; + } + + public int compareTo(ZNodeName that) { + int answer = this.prefix.compareTo(that.prefix); + if (answer == 0) { + int s1 = this.sequence; + int s2 = that.sequence; + if (s1 == -1 && s2 == -1) { + return this.name.compareTo(that.name); + } + answer = s1 == -1 ? 1 : s2 == -1 ? -1 : s1 - s2; + } + return answer; + } + + /** + * Returns the name of the znode + */ + public String getName() { + return name; + } + + /** + * Returns the sequence number + */ + public int getZNodeName() { + return sequence; + } + + /** + * Returns the text prefix before the sequence number + */ + public String getPrefix() { + return prefix; + } +} diff --git a/pkg/registry/zookeeper-3.4.6/recipes/lock/src/java/org/apache/zookeeper/recipes/lock/ZooKeeperOperation.java b/pkg/registry/zookeeper-3.4.6/recipes/lock/src/java/org/apache/zookeeper/recipes/lock/ZooKeeperOperation.java new file mode 100644 index 000000000..54317ed95 --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/recipes/lock/src/java/org/apache/zookeeper/recipes/lock/ZooKeeperOperation.java @@ -0,0 +1,38 @@ +/** + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + */ +package org.apache.zookeeper.recipes.lock; + +import org.apache.zookeeper.KeeperException; + +/** + * A callback object which can be used for implementing retry-able operations in the + * {@link org.apache.zookeeper.recipes.lock.ProtocolSupport} class + * + */ +public interface ZooKeeperOperation { + + /** + * Performs the operation - which may be involved multiple times if the connection + * to ZooKeeper closes during this operation + * + * @return the result of the operation or null + * @throws KeeperException + * @throws InterruptedException + */ + public boolean execute() throws KeeperException, InterruptedException; +} diff --git a/pkg/registry/zookeeper-3.4.6/recipes/queue/build.xml b/pkg/registry/zookeeper-3.4.6/recipes/queue/build.xml new file mode 100644 index 000000000..0f3505ab9 --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/recipes/queue/build.xml @@ -0,0 +1,128 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Tests failed! + + + + + + + + + + + + + + + + + + diff --git a/pkg/registry/zookeeper-3.4.6/recipes/queue/src/c/INSTALL b/pkg/registry/zookeeper-3.4.6/recipes/queue/src/c/INSTALL new file mode 100644 index 000000000..5458714e1 --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/recipes/queue/src/c/INSTALL @@ -0,0 +1,234 @@ +Installation Instructions +************************* + +Copyright (C) 1994, 1995, 1996, 1999, 2000, 2001, 2002, 2004, 2005, +2006 Free Software Foundation, Inc. + +This file is free documentation; the Free Software Foundation gives +unlimited permission to copy, distribute and modify it. + +Basic Installation +================== + +Briefly, the shell commands `./configure; make; make install' should +configure, build, and install this package. The following +more-detailed instructions are generic; see the `README' file for +instructions specific to this package. + + The `configure' shell script attempts to guess correct values for +various system-dependent variables used during compilation. It uses +those values to create a `Makefile' in each directory of the package. +It may also create one or more `.h' files containing system-dependent +definitions. Finally, it creates a shell script `config.status' that +you can run in the future to recreate the current configuration, and a +file `config.log' containing compiler output (useful mainly for +debugging `configure'). + + It can also use an optional file (typically called `config.cache' +and enabled with `--cache-file=config.cache' or simply `-C') that saves +the results of its tests to speed up reconfiguring. Caching is +disabled by default to prevent problems with accidental use of stale +cache files. + + If you need to do unusual things to compile the package, please try +to figure out how `configure' could check whether to do them, and mail +diffs or instructions to the address given in the `README' so they can +be considered for the next release. If you are using the cache, and at +some point `config.cache' contains results you don't want to keep, you +may remove or edit it. + + The file `configure.ac' (or `configure.in') is used to create +`configure' by a program called `autoconf'. You need `configure.ac' if +you want to change it or regenerate `configure' using a newer version +of `autoconf'. + +The simplest way to compile this package is: + + 1. `cd' to the directory containing the package's source code and type + `./configure' to configure the package for your system. + + Running `configure' might take a while. While running, it prints + some messages telling which features it is checking for. + + 2. Type `make' to compile the package. + + 3. Optionally, type `make check' to run any self-tests that come with + the package. + + 4. Type `make install' to install the programs and any data files and + documentation. + + 5. You can remove the program binaries and object files from the + source code directory by typing `make clean'. To also remove the + files that `configure' created (so you can compile the package for + a different kind of computer), type `make distclean'. There is + also a `make maintainer-clean' target, but that is intended mainly + for the package's developers. If you use it, you may have to get + all sorts of other programs in order to regenerate files that came + with the distribution. + +Compilers and Options +===================== + +Some systems require unusual options for compilation or linking that the +`configure' script does not know about. Run `./configure --help' for +details on some of the pertinent environment variables. + + You can give `configure' initial values for configuration parameters +by setting variables in the command line or in the environment. Here +is an example: + + ./configure CC=c99 CFLAGS=-g LIBS=-lposix + + *Note Defining Variables::, for more details. + +Compiling For Multiple Architectures +==================================== + +You can compile the package for more than one kind of computer at the +same time, by placing the object files for each architecture in their +own directory. To do this, you can use GNU `make'. `cd' to the +directory where you want the object files and executables to go and run +the `configure' script. `configure' automatically checks for the +source code in the directory that `configure' is in and in `..'. + + With a non-GNU `make', it is safer to compile the package for one +architecture at a time in the source code directory. After you have +installed the package for one architecture, use `make distclean' before +reconfiguring for another architecture. + +Installation Names +================== + +By default, `make install' installs the package's commands under +`/usr/local/bin', include files under `/usr/local/include', etc. You +can specify an installation prefix other than `/usr/local' by giving +`configure' the option `--prefix=PREFIX'. + + You can specify separate installation prefixes for +architecture-specific files and architecture-independent files. If you +pass the option `--exec-prefix=PREFIX' to `configure', the package uses +PREFIX as the prefix for installing programs and libraries. +Documentation and other data files still use the regular prefix. + + In addition, if you use an unusual directory layout you can give +options like `--bindir=DIR' to specify different values for particular +kinds of files. Run `configure --help' for a list of the directories +you can set and what kinds of files go in them. + + If the package supports it, you can cause programs to be installed +with an extra prefix or suffix on their names by giving `configure' the +option `--program-prefix=PREFIX' or `--program-suffix=SUFFIX'. + +Optional Features +================= + +Some packages pay attention to `--enable-FEATURE' options to +`configure', where FEATURE indicates an optional part of the package. +They may also pay attention to `--with-PACKAGE' options, where PACKAGE +is something like `gnu-as' or `x' (for the X Window System). The +`README' should mention any `--enable-' and `--with-' options that the +package recognizes. + + For packages that use the X Window System, `configure' can usually +find the X include and library files automatically, but if it doesn't, +you can use the `configure' options `--x-includes=DIR' and +`--x-libraries=DIR' to specify their locations. + +Specifying the System Type +========================== + +There may be some features `configure' cannot figure out automatically, +but needs to determine by the type of machine the package will run on. +Usually, assuming the package is built to be run on the _same_ +architectures, `configure' can figure that out, but if it prints a +message saying it cannot guess the machine type, give it the +`--build=TYPE' option. TYPE can either be a short name for the system +type, such as `sun4', or a canonical name which has the form: + + CPU-COMPANY-SYSTEM + +where SYSTEM can have one of these forms: + + OS KERNEL-OS + + See the file `config.sub' for the possible values of each field. If +`config.sub' isn't included in this package, then this package doesn't +need to know the machine type. + + If you are _building_ compiler tools for cross-compiling, you should +use the option `--target=TYPE' to select the type of system they will +produce code for. + + If you want to _use_ a cross compiler, that generates code for a +platform different from the build platform, you should specify the +"host" platform (i.e., that on which the generated programs will +eventually be run) with `--host=TYPE'. + +Sharing Defaults +================ + +If you want to set default values for `configure' scripts to share, you +can create a site shell script called `config.site' that gives default +values for variables like `CC', `cache_file', and `prefix'. +`configure' looks for `PREFIX/share/config.site' if it exists, then +`PREFIX/etc/config.site' if it exists. Or, you can set the +`CONFIG_SITE' environment variable to the location of the site script. +A warning: not all `configure' scripts look for a site script. + +Defining Variables +================== + +Variables not defined in a site shell script can be set in the +environment passed to `configure'. However, some packages may run +configure again during the build, and the customized values of these +variables may be lost. In order to avoid this problem, you should set +them in the `configure' command line, using `VAR=value'. For example: + + ./configure CC=/usr/local2/bin/gcc + +causes the specified `gcc' to be used as the C compiler (unless it is +overridden in the site shell script). + +Unfortunately, this technique does not work for `CONFIG_SHELL' due to +an Autoconf bug. Until the bug is fixed you can use this workaround: + + CONFIG_SHELL=/bin/bash /bin/bash ./configure CONFIG_SHELL=/bin/bash + +`configure' Invocation +====================== + +`configure' recognizes the following options to control how it operates. + +`--help' +`-h' + Print a summary of the options to `configure', and exit. + +`--version' +`-V' + Print the version of Autoconf used to generate the `configure' + script, and exit. + +`--cache-file=FILE' + Enable the cache: use and save the results of the tests in FILE, + traditionally `config.cache'. FILE defaults to `/dev/null' to + disable caching. + +`--config-cache' +`-C' + Alias for `--cache-file=config.cache'. + +`--quiet' +`--silent' +`-q' + Do not print messages saying which checks are being made. To + suppress all normal output, redirect it to `/dev/null' (any error + messages will still be shown). + +`--srcdir=DIR' + Look for the package's source code in directory DIR. Usually + `configure' can determine that directory automatically. + +`configure' also accepts some other, not widely useful, options. Run +`configure --help' for more details. + diff --git a/pkg/registry/zookeeper-3.4.6/recipes/queue/src/c/LICENSE b/pkg/registry/zookeeper-3.4.6/recipes/queue/src/c/LICENSE new file mode 100644 index 000000000..d64569567 --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/recipes/queue/src/c/LICENSE @@ -0,0 +1,202 @@ + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/pkg/registry/zookeeper-3.4.6/recipes/queue/src/c/Makefile.am b/pkg/registry/zookeeper-3.4.6/recipes/queue/src/c/Makefile.am new file mode 100644 index 000000000..ecef3cc79 --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/recipes/queue/src/c/Makefile.am @@ -0,0 +1,46 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you 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. + +include $(top_srcdir)/aminclude.am + +AM_CFLAGS = -Wall -fPIC -I${ZOOKEEPER_PATH}/include -I${ZOOKEEPER_PATH}/generated \ + -I$(top_srcdir)/include -I/usr/include +AM_CPPFLAGS = -Wall -I${ZOOKEEPER_PATH}/include -I${ZOOKEEPER_PATH}/generated\ + -I${top_srcdir}/include -I/usr/include +EXTRA_DIST = LICENSE +lib_LTLIBRARIES = libzooqueue.la +libzooqueue_la_SOURCES = src/zoo_queue.c include/zoo_queue.h +libzooqueue_la_CPPFLAGS = -DDLOPEN_MODULE +libzooqueue_la_LDFLAGS = -version-info 0:1:0 + +#run the tests now + +TEST_SOURCES = tests/TestDriver.cc tests/TestClient.cc tests/Util.cc + + +check_PROGRAMS = zkqueuetest +nodist_zkqueuetest_SOURCES = ${TEST_SOURCES} +zkqueuetest_LDADD = ${ZOOKEEPER_LD} libzooqueue.la -lpthread ${CPPUNIT_LIBS} +zkqueuetest_CXXFLAGS = -DUSE_STATIC_LIB ${CPPUNIT_CFLAGS} + +run-check: check + ./zkqueuetest ${TEST_OPTIONS} + +clean-local: clean-check + ${RM} ${DX_CLEANFILES} + +clean-check: + ${RM} ${nodist_zkqueuetest_OBJECTS} diff --git a/pkg/registry/zookeeper-3.4.6/recipes/queue/src/c/README.txt b/pkg/registry/zookeeper-3.4.6/recipes/queue/src/c/README.txt new file mode 100644 index 000000000..7ef253fc9 --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/recipes/queue/src/c/README.txt @@ -0,0 +1,30 @@ + Zookeeper C queue client library + + +INSTALLATION + +If you're building the client from a source checkout you need to +follow the steps outlined below. If you're building from a release +tar downloaded from Apache please skip to step 2. + +This recipe does not handle ZCONNECTIONLOSS. It will only work correctly once ZOOKEEPER-22 https://issues.apache.org/jira/browse/ZOOKEEPER-22 is resolved. + +1) make sure that you compile the main zookeeper c client library. + +2) change directory to src/recipes/queue/src/c + and do a "autoreconf -if" to bootstrap + autoconf, automake and libtool. Please make sure you have autoconf + version 2.59 or greater installed. +3) do a "./configure [OPTIONS]" to generate the makefile. See INSTALL + for general information about running configure. + +4) do a "make" or "make install" to build the libraries and install them. + Alternatively, you can also build and run a unit test suite (and + you probably should). Please make sure you have cppunit-1.10.x or + higher installed before you execute step 4. Once ./configure has + finished, do a "make run-check". It will build the libraries, build + the tests and run them. +5) to generate doxygen documentation do a "make doxygen-doc". All + documentations will be placed to a new subfolder named docs. By + default only HTML documentation is generated. For information on + other document formats please use "./configure --help" diff --git a/pkg/registry/zookeeper-3.4.6/recipes/queue/src/c/acinclude.m4 b/pkg/registry/zookeeper-3.4.6/recipes/queue/src/c/acinclude.m4 new file mode 100644 index 000000000..d0041d8c2 --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/recipes/queue/src/c/acinclude.m4 @@ -0,0 +1,312 @@ +# This file is part of Autoconf. -*- Autoconf -*- + +# Copyright (C) 2004 Oren Ben-Kiki +# This file is distributed under the same terms as the Autoconf macro files. + +# Generate automatic documentation using Doxygen. Works in concert with the +# aminclude.m4 file and a compatible doxygen configuration file. Defines the +# following public macros: +# +# DX_???_FEATURE(ON|OFF) - control the default setting fo a Doxygen feature. +# Supported features are 'DOXYGEN' itself, 'DOT' for generating graphics, +# 'HTML' for plain HTML, 'CHM' for compressed HTML help (for MS users), 'CHI' +# for generating a seperate .chi file by the .chm file, and 'MAN', 'RTF', +# 'XML', 'PDF' and 'PS' for the appropriate output formats. The environment +# variable DOXYGEN_PAPER_SIZE may be specified to override the default 'a4wide' +# paper size. +# +# By default, HTML, PDF and PS documentation is generated as this seems to be +# the most popular and portable combination. MAN pages created by Doxygen are +# usually problematic, though by picking an appropriate subset and doing some +# massaging they might be better than nothing. CHM and RTF are specific for MS +# (note that you can't generate both HTML and CHM at the same time). The XML is +# rather useless unless you apply specialized post-processing to it. +# +# The macro mainly controls the default state of the feature. The use can +# override the default by specifying --enable or --disable. The macros ensure +# that contradictory flags are not given (e.g., --enable-doxygen-html and +# --enable-doxygen-chm, --enable-doxygen-anything with --disable-doxygen, etc.) +# Finally, each feature will be automatically disabled (with a warning) if the +# required programs are missing. +# +# Once all the feature defaults have been specified, call DX_INIT_DOXYGEN with +# the following parameters: a one-word name for the project for use as a +# filename base etc., an optional configuration file name (the default is +# 'Doxyfile', the same as Doxygen's default), and an optional output directory +# name (the default is 'doxygen-doc'). + +## ----------## +## Defaults. ## +## ----------## + +DX_ENV="" +AC_DEFUN([DX_FEATURE_doc], ON) +AC_DEFUN([DX_FEATURE_dot], ON) +AC_DEFUN([DX_FEATURE_man], OFF) +AC_DEFUN([DX_FEATURE_html], ON) +AC_DEFUN([DX_FEATURE_chm], OFF) +AC_DEFUN([DX_FEATURE_chi], OFF) +AC_DEFUN([DX_FEATURE_rtf], OFF) +AC_DEFUN([DX_FEATURE_xml], OFF) +AC_DEFUN([DX_FEATURE_pdf], ON) +AC_DEFUN([DX_FEATURE_ps], ON) + +## --------------- ## +## Private macros. ## +## --------------- ## + +# DX_ENV_APPEND(VARIABLE, VALUE) +# ------------------------------ +# Append VARIABLE="VALUE" to DX_ENV for invoking doxygen. +AC_DEFUN([DX_ENV_APPEND], [AC_SUBST([DX_ENV], ["$DX_ENV $1='$2'"])]) + +# DX_DIRNAME_EXPR +# --------------- +# Expand into a shell expression prints the directory part of a path. +AC_DEFUN([DX_DIRNAME_EXPR], + [[expr ".$1" : '\(\.\)[^/]*$' \| "x$1" : 'x\(.*\)/[^/]*$']]) + +# DX_IF_FEATURE(FEATURE, IF-ON, IF-OFF) +# ------------------------------------- +# Expands according to the M4 (static) status of the feature. +AC_DEFUN([DX_IF_FEATURE], [ifelse(DX_FEATURE_$1, ON, [$2], [$3])]) + +# DX_REQUIRE_PROG(VARIABLE, PROGRAM) +# ---------------------------------- +# Require the specified program to be found for the DX_CURRENT_FEATURE to work. +AC_DEFUN([DX_REQUIRE_PROG], [ +AC_PATH_TOOL([$1], [$2]) +if test "$DX_FLAG_$[DX_CURRENT_FEATURE$$1]" = 1; then + AC_MSG_WARN([$2 not found - will not DX_CURRENT_DESCRIPTION]) + AC_SUBST([DX_FLAG_]DX_CURRENT_FEATURE, 0) +fi +]) + +# DX_TEST_FEATURE(FEATURE) +# ------------------------ +# Expand to a shell expression testing whether the feature is active. +AC_DEFUN([DX_TEST_FEATURE], [test "$DX_FLAG_$1" = 1]) + +# DX_CHECK_DEPEND(REQUIRED_FEATURE, REQUIRED_STATE) +# ------------------------------------------------- +# Verify that a required features has the right state before trying to turn on +# the DX_CURRENT_FEATURE. +AC_DEFUN([DX_CHECK_DEPEND], [ +test "$DX_FLAG_$1" = "$2" \ +|| AC_MSG_ERROR([doxygen-DX_CURRENT_FEATURE ifelse([$2], 1, + requires, contradicts) doxygen-DX_CURRENT_FEATURE]) +]) + +# DX_CLEAR_DEPEND(FEATURE, REQUIRED_FEATURE, REQUIRED_STATE) +# ---------------------------------------------------------- +# Turn off the DX_CURRENT_FEATURE if the required feature is off. +AC_DEFUN([DX_CLEAR_DEPEND], [ +test "$DX_FLAG_$1" = "$2" || AC_SUBST([DX_FLAG_]DX_CURRENT_FEATURE, 0) +]) + +# DX_FEATURE_ARG(FEATURE, DESCRIPTION, +# CHECK_DEPEND, CLEAR_DEPEND, +# REQUIRE, DO-IF-ON, DO-IF-OFF) +# -------------------------------------------- +# Parse the command-line option controlling a feature. CHECK_DEPEND is called +# if the user explicitly turns the feature on (and invokes DX_CHECK_DEPEND), +# otherwise CLEAR_DEPEND is called to turn off the default state if a required +# feature is disabled (using DX_CLEAR_DEPEND). REQUIRE performs additional +# requirement tests (DX_REQUIRE_PROG). Finally, an automake flag is set and +# DO-IF-ON or DO-IF-OFF are called according to the final state of the feature. +AC_DEFUN([DX_ARG_ABLE], [ + AC_DEFUN([DX_CURRENT_FEATURE], [$1]) + AC_DEFUN([DX_CURRENT_DESCRIPTION], [$2]) + AC_ARG_ENABLE(doxygen-$1, + [AS_HELP_STRING(DX_IF_FEATURE([$1], [--disable-doxygen-$1], + [--enable-doxygen-$1]), + DX_IF_FEATURE([$1], [don't $2], [$2]))], + [ +case "$enableval" in +#( +y|Y|yes|Yes|YES) + AC_SUBST([DX_FLAG_$1], 1) + $3 +;; #( +n|N|no|No|NO) + AC_SUBST([DX_FLAG_$1], 0) +;; #( +*) + AC_MSG_ERROR([invalid value '$enableval' given to doxygen-$1]) +;; +esac +], [ +AC_SUBST([DX_FLAG_$1], [DX_IF_FEATURE([$1], 1, 0)]) +$4 +]) +if DX_TEST_FEATURE([$1]); then + $5 + : +fi +if DX_TEST_FEATURE([$1]); then + AM_CONDITIONAL(DX_COND_$1, :) + $6 + : +else + AM_CONDITIONAL(DX_COND_$1, false) + $7 + : +fi +]) + +## -------------- ## +## Public macros. ## +## -------------- ## + +# DX_XXX_FEATURE(DEFAULT_STATE) +# ----------------------------- +AC_DEFUN([DX_DOXYGEN_FEATURE], [AC_DEFUN([DX_FEATURE_doc], [$1])]) +AC_DEFUN([DX_MAN_FEATURE], [AC_DEFUN([DX_FEATURE_man], [$1])]) +AC_DEFUN([DX_HTML_FEATURE], [AC_DEFUN([DX_FEATURE_html], [$1])]) +AC_DEFUN([DX_CHM_FEATURE], [AC_DEFUN([DX_FEATURE_chm], [$1])]) +AC_DEFUN([DX_CHI_FEATURE], [AC_DEFUN([DX_FEATURE_chi], [$1])]) +AC_DEFUN([DX_RTF_FEATURE], [AC_DEFUN([DX_FEATURE_rtf], [$1])]) +AC_DEFUN([DX_XML_FEATURE], [AC_DEFUN([DX_FEATURE_xml], [$1])]) +AC_DEFUN([DX_XML_FEATURE], [AC_DEFUN([DX_FEATURE_xml], [$1])]) +AC_DEFUN([DX_PDF_FEATURE], [AC_DEFUN([DX_FEATURE_pdf], [$1])]) +AC_DEFUN([DX_PS_FEATURE], [AC_DEFUN([DX_FEATURE_ps], [$1])]) + +# DX_INIT_DOXYGEN(PROJECT, [CONFIG-FILE], [OUTPUT-DOC-DIR]) +# --------------------------------------------------------- +# PROJECT also serves as the base name for the documentation files. +# The default CONFIG-FILE is "Doxyfile" and OUTPUT-DOC-DIR is "doxygen-doc". +AC_DEFUN([DX_INIT_DOXYGEN], [ + +# Files: +AC_SUBST([DX_PROJECT], [$1]) +AC_SUBST([DX_CONFIG], [ifelse([$2], [], Doxyfile, [$2])]) +AC_SUBST([DX_DOCDIR], [ifelse([$3], [], doxygen-doc, [$3])]) + +# Environment variables used inside doxygen.cfg: +DX_ENV_APPEND(SRCDIR, $srcdir) +DX_ENV_APPEND(PROJECT, $DX_PROJECT) +DX_ENV_APPEND(DOCDIR, $DX_DOCDIR) +DX_ENV_APPEND(VERSION, $PACKAGE_VERSION) + +# Doxygen itself: +DX_ARG_ABLE(doc, [generate any doxygen documentation], + [], + [], + [DX_REQUIRE_PROG([DX_DOXYGEN], doxygen) + DX_REQUIRE_PROG([DX_PERL], perl)], + [DX_ENV_APPEND(PERL_PATH, $DX_PERL)]) + +# Dot for graphics: +DX_ARG_ABLE(dot, [generate graphics for doxygen documentation], + [DX_CHECK_DEPEND(doc, 1)], + [DX_CLEAR_DEPEND(doc, 1)], + [DX_REQUIRE_PROG([DX_DOT], dot)], + [DX_ENV_APPEND(HAVE_DOT, YES) + DX_ENV_APPEND(DOT_PATH, [`DX_DIRNAME_EXPR($DX_DOT)`])], + [DX_ENV_APPEND(HAVE_DOT, NO)]) + +# Man pages generation: +DX_ARG_ABLE(man, [generate doxygen manual pages], + [DX_CHECK_DEPEND(doc, 1)], + [DX_CLEAR_DEPEND(doc, 1)], + [], + [DX_ENV_APPEND(GENERATE_MAN, YES)], + [DX_ENV_APPEND(GENERATE_MAN, NO)]) + +# RTF file generation: +DX_ARG_ABLE(rtf, [generate doxygen RTF documentation], + [DX_CHECK_DEPEND(doc, 1)], + [DX_CLEAR_DEPEND(doc, 1)], + [], + [DX_ENV_APPEND(GENERATE_RTF, YES)], + [DX_ENV_APPEND(GENERATE_RTF, NO)]) + +# XML file generation: +DX_ARG_ABLE(xml, [generate doxygen XML documentation], + [DX_CHECK_DEPEND(doc, 1)], + [DX_CLEAR_DEPEND(doc, 1)], + [], + [DX_ENV_APPEND(GENERATE_XML, YES)], + [DX_ENV_APPEND(GENERATE_XML, NO)]) + +# (Compressed) HTML help generation: +DX_ARG_ABLE(chm, [generate doxygen compressed HTML help documentation], + [DX_CHECK_DEPEND(doc, 1)], + [DX_CLEAR_DEPEND(doc, 1)], + [DX_REQUIRE_PROG([DX_HHC], hhc)], + [DX_ENV_APPEND(HHC_PATH, $DX_HHC) + DX_ENV_APPEND(GENERATE_HTML, YES) + DX_ENV_APPEND(GENERATE_HTMLHELP, YES)], + [DX_ENV_APPEND(GENERATE_HTMLHELP, NO)]) + +# Seperate CHI file generation. +DX_ARG_ABLE(chi, [generate doxygen seperate compressed HTML help index file], + [DX_CHECK_DEPEND(chm, 1)], + [DX_CLEAR_DEPEND(chm, 1)], + [], + [DX_ENV_APPEND(GENERATE_CHI, YES)], + [DX_ENV_APPEND(GENERATE_CHI, NO)]) + +# Plain HTML pages generation: +DX_ARG_ABLE(html, [generate doxygen plain HTML documentation], + [DX_CHECK_DEPEND(doc, 1) DX_CHECK_DEPEND(chm, 0)], + [DX_CLEAR_DEPEND(doc, 1) DX_CLEAR_DEPEND(chm, 0)], + [], + [DX_ENV_APPEND(GENERATE_HTML, YES)], + [DX_TEST_FEATURE(chm) || DX_ENV_APPEND(GENERATE_HTML, NO)]) + +# PostScript file generation: +DX_ARG_ABLE(ps, [generate doxygen PostScript documentation], + [DX_CHECK_DEPEND(doc, 1)], + [DX_CLEAR_DEPEND(doc, 1)], + [DX_REQUIRE_PROG([DX_LATEX], latex) + DX_REQUIRE_PROG([DX_MAKEINDEX], makeindex) + DX_REQUIRE_PROG([DX_DVIPS], dvips) + DX_REQUIRE_PROG([DX_EGREP], egrep)]) + +# PDF file generation: +DX_ARG_ABLE(pdf, [generate doxygen PDF documentation], + [DX_CHECK_DEPEND(doc, 1)], + [DX_CLEAR_DEPEND(doc, 1)], + [DX_REQUIRE_PROG([DX_PDFLATEX], pdflatex) + DX_REQUIRE_PROG([DX_MAKEINDEX], makeindex) + DX_REQUIRE_PROG([DX_EGREP], egrep)]) + +# LaTeX generation for PS and/or PDF: +if DX_TEST_FEATURE(ps) || DX_TEST_FEATURE(pdf); then + AM_CONDITIONAL(DX_COND_latex, :) + DX_ENV_APPEND(GENERATE_LATEX, YES) +else + AM_CONDITIONAL(DX_COND_latex, false) + DX_ENV_APPEND(GENERATE_LATEX, NO) +fi + +# Paper size for PS and/or PDF: +AC_ARG_VAR(DOXYGEN_PAPER_SIZE, + [a4wide (default), a4, letter, legal or executive]) +case "$DOXYGEN_PAPER_SIZE" in +#( +"") + AC_SUBST(DOXYGEN_PAPER_SIZE, "") +;; #( +a4wide|a4|letter|legal|executive) + DX_ENV_APPEND(PAPER_SIZE, $DOXYGEN_PAPER_SIZE) +;; #( +*) + AC_MSG_ERROR([unknown DOXYGEN_PAPER_SIZE='$DOXYGEN_PAPER_SIZE']) +;; +esac + +#For debugging: +#echo DX_FLAG_doc=$DX_FLAG_doc +#echo DX_FLAG_dot=$DX_FLAG_dot +#echo DX_FLAG_man=$DX_FLAG_man +#echo DX_FLAG_html=$DX_FLAG_html +#echo DX_FLAG_chm=$DX_FLAG_chm +#echo DX_FLAG_chi=$DX_FLAG_chi +#echo DX_FLAG_rtf=$DX_FLAG_rtf +#echo DX_FLAG_xml=$DX_FLAG_xml +#echo DX_FLAG_pdf=$DX_FLAG_pdf +#echo DX_FLAG_ps=$DX_FLAG_ps +#echo DX_ENV=$DX_ENV +]) diff --git a/pkg/registry/zookeeper-3.4.6/recipes/queue/src/c/aminclude.am b/pkg/registry/zookeeper-3.4.6/recipes/queue/src/c/aminclude.am new file mode 100644 index 000000000..420049eca --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/recipes/queue/src/c/aminclude.am @@ -0,0 +1,186 @@ +# Copyright (C) 2004 Oren Ben-Kiki +# This file is distributed under the same terms as the Automake macro files. + +# Generate automatic documentation using Doxygen. Goals and variables values +# are controlled by the various DX_COND_??? conditionals set by autoconf. +# +# The provided goals are: +# doxygen-doc: Generate all doxygen documentation. +# doxygen-run: Run doxygen, which will generate some of the documentation +# (HTML, CHM, CHI, MAN, RTF, XML) but will not do the post +# processing required for the rest of it (PS, PDF, and some MAN). +# doxygen-man: Rename some doxygen generated man pages. +# doxygen-ps: Generate doxygen PostScript documentation. +# doxygen-pdf: Generate doxygen PDF documentation. +# +# Note that by default these are not integrated into the automake goals. If +# doxygen is used to generate man pages, you can achieve this integration by +# setting man3_MANS to the list of man pages generated and then adding the +# dependency: +# +# $(man3_MANS): doxygen-doc +# +# This will cause make to run doxygen and generate all the documentation. +# +# The following variable is intended for use in Makefile.am: +# +# DX_CLEANFILES = everything to clean. +# +# This is usually added to MOSTLYCLEANFILES. + +## --------------------------------- ## +## Format-independent Doxygen rules. ## +## --------------------------------- ## + +if DX_COND_doc + +## ------------------------------- ## +## Rules specific for HTML output. ## +## ------------------------------- ## + +if DX_COND_html + +DX_CLEAN_HTML = @DX_DOCDIR@/html + +endif DX_COND_html + +## ------------------------------ ## +## Rules specific for CHM output. ## +## ------------------------------ ## + +if DX_COND_chm + +DX_CLEAN_CHM = @DX_DOCDIR@/chm + +if DX_COND_chi + +DX_CLEAN_CHI = @DX_DOCDIR@/@PACKAGE@.chi + +endif DX_COND_chi + +endif DX_COND_chm + +## ------------------------------ ## +## Rules specific for MAN output. ## +## ------------------------------ ## + +if DX_COND_man + +DX_CLEAN_MAN = @DX_DOCDIR@/man + +endif DX_COND_man + +## ------------------------------ ## +## Rules specific for RTF output. ## +## ------------------------------ ## + +if DX_COND_rtf + +DX_CLEAN_RTF = @DX_DOCDIR@/rtf + +endif DX_COND_rtf + +## ------------------------------ ## +## Rules specific for XML output. ## +## ------------------------------ ## + +if DX_COND_xml + +DX_CLEAN_XML = @DX_DOCDIR@/xml + +endif DX_COND_xml + +## ----------------------------- ## +## Rules specific for PS output. ## +## ----------------------------- ## + +if DX_COND_ps + +DX_CLEAN_PS = @DX_DOCDIR@/@PACKAGE@.ps + +DX_PS_GOAL = doxygen-ps + +doxygen-ps: @DX_DOCDIR@/@PACKAGE@.ps + +@DX_DOCDIR@/@PACKAGE@.ps: @DX_DOCDIR@/@PACKAGE@.tag + cd @DX_DOCDIR@/latex; \ + rm -f *.aux *.toc *.idx *.ind *.ilg *.log *.out; \ + $(DX_LATEX) refman.tex; \ + $(MAKEINDEX_PATH) refman.idx; \ + $(DX_LATEX) refman.tex; \ + countdown=5; \ + while $(DX_EGREP) 'Rerun (LaTeX|to get cross-references right)' \ + refman.log > /dev/null 2>&1 \ + && test $$countdown -gt 0; do \ + $(DX_LATEX) refman.tex; \ + countdown=`expr $$countdown - 1`; \ + done; \ + $(DX_DVIPS) -o ../@PACKAGE@.ps refman.dvi + +endif DX_COND_ps + +## ------------------------------ ## +## Rules specific for PDF output. ## +## ------------------------------ ## + +if DX_COND_pdf + +DX_CLEAN_PDF = @DX_DOCDIR@/@PACKAGE@.pdf + +DX_PDF_GOAL = doxygen-pdf + +doxygen-pdf: @DX_DOCDIR@/@PACKAGE@.pdf + +@DX_DOCDIR@/@PACKAGE@.pdf: @DX_DOCDIR@/@PACKAGE@.tag + cd @DX_DOCDIR@/latex; \ + rm -f *.aux *.toc *.idx *.ind *.ilg *.log *.out; \ + $(DX_PDFLATEX) refman.tex; \ + $(DX_MAKEINDEX) refman.idx; \ + $(DX_PDFLATEX) refman.tex; \ + countdown=5; \ + while $(DX_EGREP) 'Rerun (LaTeX|to get cross-references right)' \ + refman.log > /dev/null 2>&1 \ + && test $$countdown -gt 0; do \ + $(DX_PDFLATEX) refman.tex; \ + countdown=`expr $$countdown - 1`; \ + done; \ + mv refman.pdf ../@PACKAGE@.pdf + +endif DX_COND_pdf + +## ------------------------------------------------- ## +## Rules specific for LaTeX (shared for PS and PDF). ## +## ------------------------------------------------- ## + +if DX_COND_latex + +DX_CLEAN_LATEX = @DX_DOCDIR@/latex + +endif DX_COND_latex + +.PHONY: doxygen-run doxygen-doc $(DX_PS_GOAL) $(DX_PDF_GOAL) + +.INTERMEDIATE: doxygen-run $(DX_PS_GOAL) $(DX_PDF_GOAL) + +doxygen-run: @DX_DOCDIR@/@PACKAGE@.tag + +doxygen-doc: doxygen-run $(DX_PS_GOAL) $(DX_PDF_GOAL) + +@DX_DOCDIR@/@PACKAGE@.tag: $(DX_CONFIG) $(pkginclude_HEADERS) + rm -rf @DX_DOCDIR@ + $(DX_ENV) $(DX_DOXYGEN) $(srcdir)/$(DX_CONFIG) + +DX_CLEANFILES = \ + @DX_DOCDIR@/@PACKAGE@.tag \ + -r \ + $(DX_CLEAN_HTML) \ + $(DX_CLEAN_CHM) \ + $(DX_CLEAN_CHI) \ + $(DX_CLEAN_MAN) \ + $(DX_CLEAN_RTF) \ + $(DX_CLEAN_XML) \ + $(DX_CLEAN_PS) \ + $(DX_CLEAN_PDF) \ + $(DX_CLEAN_LATEX) + +endif DX_COND_doc diff --git a/pkg/registry/zookeeper-3.4.6/recipes/queue/src/c/c-doc.Doxyfile b/pkg/registry/zookeeper-3.4.6/recipes/queue/src/c/c-doc.Doxyfile new file mode 100644 index 000000000..32e09a1c8 --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/recipes/queue/src/c/c-doc.Doxyfile @@ -0,0 +1,1252 @@ +# Doxyfile 1.4.7 + +# 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 (" ") + +#--------------------------------------------------------------------------- +# Project related 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 = $(PROJECT)-$(VERSION) + +# 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 = $(DOCDIR) + +# If the CREATE_SUBDIRS tag is set to YES, then doxygen will create +# 4096 sub-directories (in 2 levels) under the output directory of each output +# format and will distribute the generated files over these directories. +# Enabling this option can be useful when feeding doxygen a huge amount of +# source files, where putting all generated files in the same directory would +# otherwise cause performance problems for the file system. + +CREATE_SUBDIRS = NO + +# 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, Korean-en, Norwegian, +# Polish, Portuguese, Romanian, Russian, Serbian, Slovak, Slovene, Spanish, +# Swedish, and Ukrainian. + +OUTPUT_LANGUAGE = English + +# This tag can be used to specify the encoding used in the generated output. +# The encoding is not always determined by the language that is chosen, +# but also whether or not the output is meant for Windows or non-Windows users. +# In case there is a difference, setting the USE_WINDOWS_ENCODING tag to YES +# forces the Windows encoding (this is the default for the Windows binary), +# whereas setting the tag to NO uses a Unix-style encoding (the default for +# all platforms other than Windows). + +USE_WINDOWS_ENCODING = 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 + +# This tag implements a quasi-intelligent brief description abbreviator +# that is used to form the text in various listings. Each string +# in this list, if found as the leading text of the brief description, will be +# stripped from the text and the result after processing the whole list, is +# used as the annotated text. Otherwise, the brief description is used as-is. +# If left blank, the following values are used ("$name" is automatically +# replaced with the name of the entity): "The $name class" "The $name widget" +# "The $name file" "is" "provides" "specifies" "contains" +# "represents" "a" "an" "the" + +ABBREVIATE_BRIEF = + +# 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 = YES + +# 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. The tag can be used to show relative paths in the file list. +# If left blank the directory from which doxygen is run is used as the +# path to strip. + +STRIP_FROM_PATH = + +# The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of +# the path mentioned in the documentation of a class, which tells +# the reader which header file to include in order to use a class. +# If left blank only the name of the header file containing the class +# definition is used. Otherwise one should specify the include paths that +# are normally passed to the compiler using the -I flag. + +STRIP_FROM_INC_PATH = + +# 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 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 +# explicit @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 +# re-implements. + +INHERIT_DOCS = YES + +# If the SEPARATE_MEMBER_PAGES tag is set to YES, then doxygen will produce +# a new page for each member. If set to NO, the documentation of a member will +# be part of the file/class/namespace that contains it. + +SEPARATE_MEMBER_PAGES = 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 + +# 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 = + +# 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 + +# If you use STL classes (i.e. std::string, std::vector, etc.) but do not want to +# include (a tag file for) the STL sources as input, then you should +# set this tag to YES in order to let doxygen match functions declarations and +# definitions whose arguments contain STL classes (e.g. func(std::string); v.s. +# func(std::string) {}). This also make the inheritance and collaboration +# diagrams that involve STL classes more complete and accurate. + +BUILTIN_STL_SUPPORT = NO + +# 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 + +# Set the SUBGROUPING tag to YES (the default) to allow class member groups of +# the same type (for instance a group of public functions) to be put as a +# subgroup of that type (e.g. under the Public Functions section). Set it to +# NO to prevent subgrouping. Alternatively, this can be done per class using +# the \nosubgrouping command. + +SUBGROUPING = YES + +#--------------------------------------------------------------------------- +# Build related configuration options +#--------------------------------------------------------------------------- + +# 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 = NO + +# 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 = YES + +# 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 = YES + +# This flag is only useful for Objective-C code. When set to YES local +# methods, which are defined in the implementation section but not in +# the interface are included in the documentation. +# If set to NO (the default) only methods in the interface are included. + +EXTRACT_LOCAL_METHODS = 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 classes 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 HIDE_IN_BODY_DOCS tag is set to YES, Doxygen will hide any +# documentation blocks found inside the body of a function. +# If set to NO (the default) these blocks will be appended to the +# function's detailed documentation block. + +HIDE_IN_BODY_DOCS = NO + +# 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 + +# 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 +# and Mac users are advised to set this option to NO. + +CASE_SENSE_NAMES = YES + +# 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 SHOW_INCLUDE_FILES tag is set to YES (the default) then Doxygen +# will put a list of the files that are included by a file in the documentation +# of that file. + +SHOW_INCLUDE_FILES = NO + +# 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 the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the +# brief documentation of file, namespace and class members alphabetically +# by member name. If set to NO (the default) the members will appear in +# declaration order. + +SORT_BRIEF_DOCS = NO + +# If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be +# sorted by fully-qualified names, including namespaces. If set to +# NO (the default), the class list will be sorted only by class name, +# not including the namespace part. +# Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES. +# Note: This option applies only to the class list, not to the +# alphabetical list. + +SORT_BY_SCOPE_NAME = NO + +# 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 + +# 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 consists 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 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 = YES + +# If the sources in your project are distributed over multiple directories +# then setting the SHOW_DIRECTORIES tag to YES will show the directory hierarchy +# in the documentation. The default is NO. + +SHOW_DIRECTORIES = NO + +# The FILE_VERSION_FILTER tag can be used to specify a program or script that +# doxygen should invoke to get the current version for each file (typically from the +# version control system). Doxygen will invoke the program by executing (via +# popen()) the command , where is the value of +# the FILE_VERSION_FILTER tag, and is the name of an input file +# provided by doxygen. Whatever the program writes to standard output +# is used as the file version. See the manual for examples. + +FILE_VERSION_FILTER = + +#--------------------------------------------------------------------------- +# 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 + +# If WARN_IF_DOC_ERROR is set to YES, doxygen will generate warnings for +# potential errors in the documentation, such as not documenting some +# parameters in a documented function, or documenting parameters that +# don't exist or using markup commands wrongly. + +WARN_IF_DOC_ERROR = YES + +# This WARN_NO_PARAMDOC option can be abled to get warnings for +# functions that are documented, but have no documentation for their parameters +# or return value. If set to NO (the default) doxygen will only warn about +# wrong or incomplete parameter documentation, but not about the absence of +# documentation. + +WARN_NO_PARAMDOC = NO + +# 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. Optionally the format may contain +# $version, which will be replaced by the version of the file (if it could +# be obtained via FILE_VERSION_FILTER) + +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 = include/zoo_queue.h + +# 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 *.cs *.php *.php3 *.inc *.m *.mm *.py + +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. Note that the wildcards are matched +# against the file with absolute path, so to exclude all test directories +# for example use the pattern */test/* + +EXCLUDE_PATTERNS = + +# The EXAMPLE_PATH tag can be used to specify one or more files or +# directories that contain example code fragments that are included (see +# the \include command). + +EXAMPLE_PATH = + +# If the value of the EXAMPLE_PATH tag contains directories, you can use the +# EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp +# and *.h) to filter out the source-files in the directories. If left +# blank all files are included. + +EXAMPLE_PATTERNS = + +# If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be +# searched for input files to be used with the \include or \dontinclude +# commands irrespective of the value of the RECURSIVE tag. +# Possible values are YES and NO. If left blank NO is used. + +EXAMPLE_RECURSIVE = NO + +# The IMAGE_PATH tag can be used to specify one or more files or +# directories that contain image that are included in the documentation (see +# the \image command). + +IMAGE_PATH = + +# The INPUT_FILTER tag can be used to specify a program that doxygen should +# invoke to filter for each input file. Doxygen will invoke the filter program +# by executing (via popen()) the command , where +# is the value of the INPUT_FILTER tag, and is the name of an +# input file. Doxygen will then use the output that the filter program writes +# to standard output. If FILTER_PATTERNS is specified, this tag will be +# ignored. + +INPUT_FILTER = + +# The FILTER_PATTERNS tag can be used to specify filters on a per file pattern +# basis. Doxygen will compare the file name with each pattern and apply the +# filter if there is a match. The filters are a list of the form: +# pattern=filter (like *.cpp=my_cpp_filter). See INPUT_FILTER for further +# info on how filters are used. If FILTER_PATTERNS is empty, INPUT_FILTER +# is applied to all files. + +FILTER_PATTERNS = + +# 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. +# Note: To get rid of all source code in the generated output, make sure also +# VERBATIM_HEADERS is set to NO. + +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 + +# 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 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 = YES + +# 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 = YES + +# If the REFERENCES_LINK_SOURCE tag is set to YES (the default) +# and SOURCE_BROWSER tag is set to YES, then the hyperlinks from +# functions in REFERENCES_RELATION and REFERENCED_BY_RELATION lists will +# link to the source code. Otherwise they will link to the documentstion. + +REFERENCES_LINK_SOURCE = YES + +# If the USE_HTAGS tag is set to YES then the references to source code +# will point to the HTML generated by the htags(1) tool instead of doxygen +# built-in source browser. The htags tool is part of GNU's global source +# tagging system (see http://www.gnu.org/software/global/global.html). You +# will need version 4.8.6 or higher. + +USE_HTAGS = 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 + +#--------------------------------------------------------------------------- +# 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 = NO + +# 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 = $(GENERATE_HTML) + +# 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 = html + +# 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. Note that doxygen will try to copy +# the style sheet file to the HTML output directory, so don't put your own +# stylesheet in the HTML output directory as well, or it will be erased! + +HTML_STYLESHEET = + +# 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 = $(GENERATE_HTMLHELP) + +# 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 directory. + +CHM_FILE = ../$(PROJECT).chm + +# 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 = $(HHC_PATH) + +# 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 = $(GENERATE_CHI) + +# 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 = NO + +# 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, DHTML, CSS and frames is required (for instance Mozilla 1.0+, +# Netscape 6.0+, Internet explorer 5.0+, or Konqueror). 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 = $(GENERATE_LATEX) + +# 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 = $(PAPER_SIZE) + +# 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 = $(GENERATE_PDF) + +# 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 + +# If LATEX_HIDE_INDICES is set to YES then doxygen will not +# include the index chapters (such as File Index, Compound Index, etc.) +# in the output. + +LATEX_HIDE_INDICES = 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 optimized for Word 97 and may not look very pretty with +# other RTF readers or editors. + +GENERATE_RTF = $(GENERATE_RTF) + +# 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 assignments. 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 = $(GENERATE_MAN) + +# 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. + +GENERATE_XML = $(GENERATE_XML) + +# The XML_OUTPUT tag is used to specify where the XML 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 `xml' will be used as the default path. + +XML_OUTPUT = xml + +# 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 = + +# If the XML_PROGRAMLISTING tag is set to YES Doxygen will +# dump the program listings (including syntax highlighting +# and cross-referencing information) to the XML output. Note that +# enabling this will significantly increase the size of the XML output. + +XML_PROGRAMLISTING = YES + +#--------------------------------------------------------------------------- +# 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 Perl module output +#--------------------------------------------------------------------------- + +# If the GENERATE_PERLMOD tag is set to YES Doxygen will +# generate a Perl module file that captures the structure of +# the code including all documentation. Note that this +# feature is still experimental and incomplete at the +# moment. + +GENERATE_PERLMOD = NO + +# If the PERLMOD_LATEX tag is set to YES Doxygen will generate +# the necessary Makefile rules, Perl scripts and LaTeX code to be able +# to generate PDF and DVI output from the Perl module output. + +PERLMOD_LATEX = NO + +# If the PERLMOD_PRETTY tag is set to YES the Perl module output will be +# nicely formatted so it can be parsed by a human reader. This is useful +# if you want to understand what is going on. On the other hand, if this +# tag is set to NO the size of the Perl module output will be much smaller +# and Perl will parse it just the same. + +PERLMOD_PRETTY = YES + +# The names of the make variables in the generated doxyrules.make file +# are prefixed with the string contained in PERLMOD_MAKEVAR_PREFIX. +# This is useful so different doxyrules.make files included by the same +# Makefile don't overwrite each other's variables. + +PERLMOD_MAKEVAR_PREFIX = + +#--------------------------------------------------------------------------- +# 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 = YES + +# 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_DEFINED 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. To prevent a macro definition from being +# undefined via #undef or recursively expanded use the := operator +# instead of the = operator. + +PREDEFINED = + +# If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF 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::additions related to external references +#--------------------------------------------------------------------------- + +# The TAGFILES option can be used to specify one or more tagfiles. +# Optionally an initial location of the external documentation +# can be added for each tagfile. The format of a tag file without +# this location is as follows: +# TAGFILES = file1 file2 ... +# Adding location for the tag files is done as follows: +# TAGFILES = file1=loc1 "file2 = loc2" ... +# where "loc1" and "loc2" can be relative or absolute paths or +# URLs. If a location is present for each tag, the installdox tool +# does not have to be run to correct the links. +# Note that each tag file must have a unique name +# (where the name does NOT include the path) +# If a tag file is not located in the directory in which doxygen +# is run, you must also specify the path to the tagfile here. + +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 = $(DOCDIR)/$(PROJECT).tag + +# 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 superseded by the HAVE_DOT option below. This is only a +# fallback. It is recommended to install and use dot, since it yields 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 = $(HAVE_DOT) + +# 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 the GROUP_GRAPHS and HAVE_DOT tags are set to YES then doxygen +# will generate a graph for groups, showing the direct groups dependencies + +GROUP_GRAPHS = YES + +# If the UML_LOOK tag is set to YES doxygen will generate inheritance and +# collaboration diagrams in a style similar to the OMG's Unified Modeling +# Language. + +UML_LOOK = NO + +# If set to YES, the inheritance and collaboration graphs will show the +# relations between templates and their instances. + +TEMPLATE_RELATIONS = NO + +# 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 CALL_GRAPH and HAVE_DOT tags are set to YES then doxygen will +# generate a call dependency graph for every global function or class method. +# Note that enabling this option will significantly increase the time of a run. +# So in most cases it will be better to enable call graphs for selected +# functions only using the \callgraph command. + +CALL_GRAPH = NO + +# If the CALLER_GRAPH and HAVE_DOT tags are set to YES then doxygen will +# generate a caller dependency graph for every global function or class method. +# Note that enabling this option will significantly increase the time of a run. +# So in most cases it will be better to enable caller graphs for selected +# functions only using the \callergraph command. + +CALLER_GRAPH = NO + +# 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 + +# If the DIRECTORY_GRAPH, SHOW_DIRECTORIES and HAVE_DOT tags are set to YES +# then doxygen will show the dependencies a directory has on other directories +# in a graphical way. The dependency relations are determined by the #include +# relations between the files in the directories. + +DIRECTORY_GRAPH = 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 in the path. + +DOT_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 + +# The MAX_DOT_GRAPH_DEPTH tag can be used to set the maximum depth of the +# graphs generated by dot. A depth value of 3 means that only nodes reachable +# from the root by following a path via at most 3 edges will be shown. Nodes +# that lay further from the root node will be omitted. Note that setting this +# option to 1 or 2 may greatly reduce the computation time needed for large +# code bases. Also note that a graph may be further truncated if the graph's +# image dimensions are not sufficient to fit the graph (see MAX_DOT_GRAPH_WIDTH +# and MAX_DOT_GRAPH_HEIGHT). If 0 is used for the depth value (the default), +# the graph is not depth-constrained. + +MAX_DOT_GRAPH_DEPTH = 0 + +# Set the DOT_TRANSPARENT tag to YES to generate images with a transparent +# background. This is disabled by default, which results in a white background. +# Warning: Depending on the platform used, enabling this option may lead to +# badly anti-aliased labels on the edges of a graph (i.e. they become hard to +# read). + +DOT_TRANSPARENT = NO + +# Set the DOT_MULTI_TARGETS tag to YES allow dot to generate multiple output +# files in one run (i.e. multiple -o and -T options on the command line). This +# makes dot run faster, but since only newer versions of dot (>1.8.10) +# support this, this feature is disabled by default. + +DOT_MULTI_TARGETS = NO + +# 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 intermediate dot files that are used to generate +# the various graphs. + +DOT_CLEANUP = YES + +#--------------------------------------------------------------------------- +# Configuration::additions 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 diff --git a/pkg/registry/zookeeper-3.4.6/recipes/queue/src/c/configure.ac b/pkg/registry/zookeeper-3.4.6/recipes/queue/src/c/configure.ac new file mode 100644 index 000000000..a9fb7b130 --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/recipes/queue/src/c/configure.ac @@ -0,0 +1,82 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you 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. +# -*- Autoconf -*- +# Process this file with autoconf to produce a configure script. + +AC_PREREQ(2.59) + +AC_INIT([zooqueue], [3.2.0]) + +AC_CONFIG_SRCDIR([include/zoo_queue.h]) + +PACKAGE=zooqueue +VERSION=1.0 + +AC_SUBST(PACKAGE) +AC_SUBST(VERSION) + +BUILD_PATH="`pwd`" + +# Checks for programs. +AC_LANG_CPLUSPLUS + +AM_INIT_AUTOMAKE([-Wall foreign]) +# Checks for libraries. + +#initialize Doxygen support +DX_HTML_FEATURE(ON) +DX_CHM_FEATURE(OFF) +DX_CHI_FEATURE(OFF) +DX_MAN_FEATURE(OFF) +DX_RTF_FEATURE(OFF) +DX_XML_FEATURE(OFF) +DX_PDF_FEATURE(OFF) +DX_PS_FEATURE(OFF) +DX_INIT_DOXYGEN([zookeeper-queues],[c-doc.Doxyfile],[docs]) + + +ZOOKEEPER_PATH=${BUILD_PATH}/../../../../../src/c +ZOOKEEPER_LD=-L${BUILD_PATH}/../../../../../src/c\ -lzookeeper_mt + +AC_SUBST(ZOOKEEPER_PATH) +AC_SUBST(ZOOKEEPER_LD) + +# Checks for header files. +AC_HEADER_DIRENT +AC_HEADER_STDC +AC_CHECK_HEADERS([fcntl.h stdlib.h string.h sys/time.h unistd.h]) + +# Checks for typedefs, structures, and compiler characteristics. +AC_HEADER_STDBOOL +AC_C_CONST +AC_TYPE_UID_T +AC_C_INLINE +AC_TYPE_OFF_T +AC_TYPE_SIZE_T +AC_STRUCT_ST_BLOCKS +AC_HEADER_TIME +AC_C_VOLATILE +AC_PROG_CC +AC_PROG_LIBTOOL +#check for cppunit +AM_PATH_CPPUNIT(1.10.2) +# Checks for library functions. +AC_FUNC_UTIME_NULL +AC_CHECK_FUNCS([gettimeofday memset mkdir rmdir strdup strerror strstr strtol strtoul strtoull utime]) + +AC_CONFIG_FILES([Makefile]) +AC_OUTPUT +AC_C_VOLATILE diff --git a/pkg/registry/zookeeper-3.4.6/recipes/queue/src/c/include/zoo_queue.h b/pkg/registry/zookeeper-3.4.6/recipes/queue/src/c/include/zoo_queue.h new file mode 100644 index 000000000..ccc4602f6 --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/recipes/queue/src/c/include/zoo_queue.h @@ -0,0 +1,118 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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. + */ + +#ifndef ZOOKEEPER_QUEUE_H_ +#define ZOOKEEPER_QUEUE_H_ + +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + + +/** + * \file zoo_queue.h + * \brief zookeeper recipe for queues. + */ + + +struct zkr_queue { + zhandle_t *zh; + char *path; + struct ACL_vector *acl; + pthread_mutex_t pmutex; + char *node_name; + int node_name_length; + char *cached_create_path; +}; + +typedef struct zkr_queue zkr_queue_t; + + +/** + * \brief initializes a zookeeper queue + * + * this method instantiates a zookeeper queue + * \param queue the zookeeper queue to initialize + * \param zh the zookeeper handle to use + * \param path the path in zookeeper to use for the queue + * \param acl the acl to use in zookeeper. + * \return return 0 if successful. + */ +ZOOAPI int zkr_queue_init(zkr_queue_t *queue, zhandle_t* zh, char* path, struct ACL_vector *acl); + +/** + * \brief adds an element to a zookeeper queue + * + * this method adds an element to the back of a zookeeper queue. + * \param queue the zookeeper queue to add the element to + * \param data a pointer to a data buffer + * \param buffer_len the length of the buffer + * \return returns 0 (ZOK) if successful, otherwise returns a zookeeper error code. + */ +ZOOAPI int zkr_queue_offer(zkr_queue_t *queue, const char *data, int buffer_len); + +/** + * \brief returns the head of a zookeeper queue + * + * this method returns the head of a zookeeper queue without removing it. + * \param queue the zookeeper queue to add the element to + * \param buffer a pointer to a data buffer + * \param buffer_len a pointer to the length of the buffer + * \return returns 0 (ZOK) and sets *buffer_len to the length of data written if successful (-1 if the queue is empty). Otherwise it will set *buffer_len to -1 and return a zookeeper error code. + */ +ZOOAPI int zkr_queue_element(zkr_queue_t *queue, char *buffer, int *buffer_len); + +/** + * \brief returns the head of a zookeeper queue + * + * this method returns the head of a zookeeper queue without removing it. + * \param queue the zookeeper queue to get the head of + * \param buffer a pointer to a data buffer + * \param buffer_len a pointer to the length of the buffer + * \return returns 0 (ZOK) and sets *buffer_len to the length of data written if successful (-1 if the queue is empty). Otherwise it will set *buffer_len to -1 and return a zookeeper error code. + */ +ZOOAPI int zkr_queue_remove(zkr_queue_t *queue, char *buffer, int *buffer_len); + +/** + * \brief removes and returns the head of a zookeeper queue, blocks if necessary + * + * this method returns the head of a zookeeper queue without removing it. + * \param queue the zookeeper queue to remove and return the head of + * \param buffer a pointer to a data buffer + * \param buffer_len a pointer to the length of the buffer + * \return returns 0 (ZOK) and sets *buffer_len to the length of data written if successful. Otherwise it will set *buffer_len to -1 and return a zookeeper error code. + */ +ZOOAPI int zkr_queue_take(zkr_queue_t *queue, char *buffer, int *buffer_len); + +/** + * \brief destroys a zookeeper queue structure + * + * this destroys a zookeeper queue structure, this is only a local operation and will not affect + * the state of the queue on the zookeeper server. + * \param queue the zookeeper queue to destroy + */ +void zkr_queue_destroy(zkr_queue_t *queue); + + +#ifdef __cplusplus +} +#endif +#endif //ZOOKEEPER_QUEUE_H_ diff --git a/pkg/registry/zookeeper-3.4.6/recipes/queue/src/c/src/zoo_queue.c b/pkg/registry/zookeeper-3.4.6/recipes/queue/src/c/src/zoo_queue.c new file mode 100644 index 000000000..89ec24b6e --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/recipes/queue/src/c/src/zoo_queue.c @@ -0,0 +1,442 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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. + */ + +#ifdef DLL_EXPORT +#define USE_STATIC_LIB +#endif + +#if defined(__CYGWIN__) +#define USE_IPV6 +#endif + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#ifdef HAVE_SYS_UTSNAME_H +#include +#endif + +#ifdef HAVE_GETPWUID_R +#include +#endif + +#define IF_DEBUG(x) if (logLevel==ZOO_LOG_LEVEL_DEBUG) {x;} + + +static void free_String_vector(struct String_vector *v) { + if (v->data) { + int32_t i; + for (i=0; icount; i++) { + free(v->data[i]); + } + free(v->data); + v->data = 0; + } +} + + +static int vstrcmp(const void* str1, const void* str2) { + const char **a = (const char**)str1; + const char **b = (const char**) str2; + return strcmp(*a, *b); +} + +static void sort_children(struct String_vector *vector) { + qsort( vector->data, vector->count, sizeof(char*), &vstrcmp); +} + + +static void concat_path_nodename_n(char *buffer, int len, const char *path, const char *node_name){ + snprintf(buffer, len, "%s/%s", path, node_name); +} + +static char *concat_path_nodename(const char *path, const char *node_name){ + int node_path_length = strlen(path) + 1+ strlen(node_name) +1; + char *node_path = (char *) malloc(node_path_length * sizeof(char)); + concat_path_nodename_n(node_path, node_path_length, path, node_name); + return node_path; +} + + +static void zkr_queue_cache_create_path(zkr_queue_t *queue){ + if(queue->cached_create_path != NULL){ + free(queue->cached_create_path); + } + queue->cached_create_path = concat_path_nodename(queue->path, queue->node_name); +} + +ZOOAPI int zkr_queue_init(zkr_queue_t *queue, zhandle_t* zh, char* path, struct ACL_vector *acl){ + queue->zh = zh; + queue->path = path; + queue->node_name = "qn-"; + queue->node_name_length = strlen(queue->node_name); + queue->cached_create_path = NULL; + queue->acl = acl; + pthread_mutex_init(&(queue->pmutex), NULL); + zkr_queue_cache_create_path(queue); + return 0; +} + +static ZOOAPI int create_queue_root(zkr_queue_t *queue){ + return zoo_create(queue->zh, queue->path, NULL, 0, queue->acl, 0, NULL, 0 ); +} + +static int valid_child_name(zkr_queue_t *queue, const char *child_name){ + return strncmp(queue->node_name, child_name, queue->node_name_length); +} + +ZOOAPI int zkr_queue_offer(zkr_queue_t *queue, const char *data, int buffer_len){ + for(;;){ + int rc = zoo_create(queue->zh, queue->cached_create_path, data, buffer_len, queue->acl, ZOO_SEQUENCE, NULL, 0 ); + switch(rc){ + int create_root_rc; + case ZNONODE: + create_root_rc = create_queue_root(queue); + switch(create_root_rc){ + case ZNODEEXISTS: + case ZOK: + break; + default: + return create_root_rc; + } + break; + default: + return rc; + } + } +} + + +ZOOAPI int zkr_queue_element(zkr_queue_t *queue, char *buffer, int *buffer_len){ + int path_length = strlen(queue->path); + for(;;){ + struct String_vector stvector; + struct String_vector *vector = &stvector; + /*Get sorted children*/ + int get_children_rc = zoo_get_children(queue->zh, queue->path, 0, vector); + switch(get_children_rc){ + case ZOK: + break; + case ZNONODE: + *buffer_len = -1; + return ZOK; + default: + return get_children_rc; + } + if(stvector.count == 0){ + *buffer_len = -1; + return ZOK; + } + + sort_children(vector); + /*try all*/ + int i; + for(i=0; i < stvector.count; i++){ + char *child_name = stvector.data[i]; + int child_path_length = path_length + 1 + strlen(child_name) +1; + char child_path[child_path_length]; + concat_path_nodename_n(child_path, child_path_length, queue->path, child_name); + int get_rc = zoo_get(queue->zh, child_path, 0, buffer, buffer_len, NULL); + switch(get_rc){ + case ZOK: + free_String_vector(vector); + return ZOK; + case ZNONODE: + break; + default: + free_String_vector(vector); + return get_rc; + } + } + + free_String_vector(vector); + } +} + +ZOOAPI int zkr_queue_remove(zkr_queue_t *queue, char *buffer, int *buffer_len){ + int path_length = strlen(queue->path); + for(;;){ + struct String_vector stvector; + struct String_vector *vector = &stvector; + /*Get sorted children*/ + int get_children_rc = zoo_get_children(queue->zh, queue->path, 0, &stvector); + switch(get_children_rc){ + case ZOK: + break; + case ZNONODE: + *buffer_len = -1; + return ZOK; + + default: + *buffer_len = -1; + return get_children_rc; + } + if(stvector.count == 0){ + *buffer_len = -1; + return ZOK; + } + + sort_children(vector); + /*try all*/ + int i; + for( i=0; i < stvector.count; i++){ + char *child_name = stvector.data[i]; + int child_path_length = path_length + 1 + strlen(child_name) +1; + char child_path[child_path_length]; + concat_path_nodename_n(child_path, child_path_length, queue->path, child_name); + int get_rc = zoo_get(queue->zh, child_path, 0, buffer, buffer_len, NULL); + switch(get_rc){ + int delete_rc; + case ZOK: + delete_rc = zoo_delete(queue->zh, child_path, -1); + switch(delete_rc){ + case ZOK: + free_String_vector(vector); + return delete_rc; + case ZNONODE: + break; + default: + free_String_vector(vector); + *buffer_len = -1; + return delete_rc; + } + break; + case ZNONODE: + break; + default: + free_String_vector(vector); + *buffer_len = -1; + return get_rc; + } + } + free_String_vector(vector); + } +} + +/** + * The take_latch structure roughly emulates a Java CountdownLatch with 1 as the initial value. + * It is meant to be used by a setter thread and a waiter thread. + * + * This latch is specialized to be used with the queue, all latches created for the same queue structure will use the same mutex. + * + * The setter thread at some point will call take_latch_setter_trigger_latch() on the thread. + * + * The waiter thread creates the latch and at some point either calls take_latch_waiter_await()s or take_latch_waiter_mark_unneeded()s it. + * The await function will return after the setter thread has triggered the latch. + * The mark unneeded function will return immediately and avoid some unneeded initialization. + * + * Whichever thread is last to call their required function disposes of the latch. + * + * The latch may disposed if no threads will call the waiting, marking, or triggering functions using take_latch_destroy_syncrhonized(). + */ + +struct take_latch { + enum take_state {take_init, take_waiting, take_triggered, take_not_needed} state; + pthread_cond_t latch_condition; + zkr_queue_t *queue; +}; + + +typedef struct take_latch take_latch_t; + + +static void take_latch_init( take_latch_t *latch, zkr_queue_t *queue){ + pthread_mutex_t *mutex = &(queue->pmutex); + pthread_mutex_lock(mutex); + latch->state = take_init; + latch->queue = queue; + pthread_mutex_unlock(mutex); +} + +static take_latch_t *create_take_latch(zkr_queue_t *queue){ + take_latch_t *new_take_latch = (take_latch_t *) malloc(sizeof(take_latch_t)); + take_latch_init(new_take_latch, queue); + return new_take_latch; +} + + +//Only call this when you own the mutex +static void take_latch_destroy_unsafe(take_latch_t *latch){ + if(latch->state == take_waiting){ + pthread_cond_destroy(&(latch->latch_condition)); + } + free(latch); +} + +static void take_latch_destroy_synchronized(take_latch_t *latch){ + pthread_mutex_t *mutex = &(latch->queue->pmutex); + pthread_mutex_lock(mutex); + take_latch_destroy_unsafe(latch); + pthread_mutex_unlock(mutex); +} + +static void take_latch_setter_trigger_latch(take_latch_t *latch){ + pthread_mutex_t *mutex = &(latch->queue->pmutex); + pthread_mutex_lock(mutex); + switch(latch->state){ + case take_init: + latch->state = take_triggered; + break; + case take_not_needed: + take_latch_destroy_unsafe(latch); + break; + case take_triggered: + LOG_DEBUG(("Error! Latch was triggered twice.")); + break; + case take_waiting: + pthread_cond_signal(&(latch->latch_condition)); + break; + } + pthread_mutex_unlock(mutex); +} + +static void take_latch_waiter_await(take_latch_t *latch){ + pthread_mutex_t *mutex = &(latch->queue->pmutex); + pthread_mutex_lock(mutex); + switch(latch->state){ + case take_init: + pthread_cond_init(&(latch->latch_condition),NULL); + latch->state = take_waiting; + pthread_cond_wait(&(latch->latch_condition),mutex); + take_latch_destroy_unsafe(latch); + break; + case take_waiting: + LOG_DEBUG(("Error! Called await twice.")); + break; + case take_not_needed: + LOG_DEBUG(("Error! Waiting after marking not needed.")); + break; + case take_triggered: + take_latch_destroy_unsafe(latch); + break; + } + pthread_mutex_unlock(mutex); +} + +static void take_latch_waiter_mark_unneeded(take_latch_t *latch){ + pthread_mutex_t *mutex = &(latch->queue->pmutex); + pthread_mutex_lock(mutex); + switch(latch->state){ + case take_init: + latch->state = take_not_needed; + break; + case take_waiting: + LOG_DEBUG(("Error! Can't mark unneeded after waiting.")); + break; + case take_not_needed: + LOG_DEBUG(("Marked unneeded twice.")); + break; + case take_triggered: + take_latch_destroy_unsafe(latch); + break; + } + pthread_mutex_unlock(mutex); +} + +static void take_watcher(zhandle_t *zh, int type, int state, const char *path, void *watcherCtx){ + take_latch_t *latch = (take_latch_t *) watcherCtx; + take_latch_setter_trigger_latch(latch); +} + + + +ZOOAPI int zkr_queue_take(zkr_queue_t *queue, char *buffer, int *buffer_len){ + int path_length = strlen(queue->path); +take_attempt: + for(;;){ + struct String_vector stvector; + struct String_vector *vector = &stvector; + /*Get sorted children*/ + take_latch_t *take_latch = create_take_latch(queue); + int get_children_rc = zoo_wget_children(queue->zh, queue->path, take_watcher, take_latch, &stvector); + switch(get_children_rc){ + case ZOK: + break; + int create_queue_rc; + case ZNONODE: + take_latch_destroy_synchronized(take_latch); + create_queue_rc = create_queue_root(queue); + switch(create_queue_rc){ + case ZNODEEXISTS: + case ZOK: + goto take_attempt; + default: + *buffer_len = -1; + return create_queue_rc; + } + default: + take_latch_destroy_synchronized(take_latch); + *buffer_len = -1; + return get_children_rc; + } + if(stvector.count == 0){ + take_latch_waiter_await(take_latch); + }else{ + take_latch_waiter_mark_unneeded(take_latch); + } + + sort_children(vector); + /*try all*/ + int i; + for( i=0; i < stvector.count; i++){ + char *child_name = stvector.data[i]; + int child_path_length = path_length + 1 + strlen(child_name) +1; + char child_path[child_path_length]; + concat_path_nodename_n(child_path, child_path_length, queue->path, child_name); + int get_rc = zoo_get(queue->zh, child_path, 0, buffer, buffer_len, NULL); + switch(get_rc){ + int delete_rc; + case ZOK: + delete_rc = zoo_delete(queue->zh, child_path, -1); + switch(delete_rc){ + case ZOK: + free_String_vector(vector); + return delete_rc; + case ZNONODE: + break; + default: + free_String_vector(vector); + *buffer_len = -1; + return delete_rc; + } + break; + case ZNONODE: + break; + default: + free_String_vector(vector); + *buffer_len = -1; + return get_rc; + } + } + free_String_vector(vector); + } +} + +ZOOAPI void zkr_queue_destroy(zkr_queue_t *queue){ + pthread_mutex_destroy(&(queue->pmutex)); + if(queue->cached_create_path != NULL){ + free(queue->cached_create_path); + } +} diff --git a/pkg/registry/zookeeper-3.4.6/recipes/queue/src/c/tests/TestClient.cc b/pkg/registry/zookeeper-3.4.6/recipes/queue/src/c/tests/TestClient.cc new file mode 100644 index 000000000..5446d9b82 --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/recipes/queue/src/c/tests/TestClient.cc @@ -0,0 +1,452 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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. + */ + +#include + +#include +#include +#include +#include +#include + + +using namespace std; + +#include +#include + +#include +#include + +static void yield(zhandle_t *zh, int i) +{ + sleep(i); +} + +typedef struct evt { + string path; + int type; +} evt_t; + +typedef struct watchCtx { +private: + list events; +public: + bool connected; + zhandle_t *zh; + + watchCtx() { + connected = false; + zh = 0; + } + ~watchCtx() { + if (zh) { + zookeeper_close(zh); + zh = 0; + } + } + + evt_t getEvent() { + evt_t evt; + evt = events.front(); + events.pop_front(); + return evt; + } + + int countEvents() { + int count; + count = events.size(); + return count; + } + + void putEvent(evt_t evt) { + events.push_back(evt); + } + + bool waitForConnected(zhandle_t *zh) { + time_t expires = time(0) + 10; + while(!connected && time(0) < expires) { + yield(zh, 1); + } + return connected; + } + bool waitForDisconnected(zhandle_t *zh) { + time_t expires = time(0) + 15; + while(connected && time(0) < expires) { + yield(zh, 1); + } + return !connected; + } +} watchctx_t; + +extern "C" { + + const char *thread_test_string="Hello World!"; + + void *offer_thread_shared_queue(void *queue_handle){ + zkr_queue_t *queue = (zkr_queue_t *) queue_handle; + + int test_string_buffer_length = strlen(thread_test_string) + 1; + int offer_rc = zkr_queue_offer(queue, thread_test_string, test_string_buffer_length); + pthread_exit(NULL); + } + + void *take_thread_shared_queue(void *queue_handle){ + zkr_queue_t *queue = (zkr_queue_t *) queue_handle; + + int test_string_buffer_length = strlen(thread_test_string) + 1; + int receive_buffer_capacity = test_string_buffer_length; + int receive_buffer_length = receive_buffer_capacity; + char *receive_buffer = (char *) malloc(sizeof(char) * receive_buffer_capacity); + + int remove_rc = zkr_queue_take(queue, receive_buffer, &receive_buffer_length); + switch(remove_rc){ + case ZOK: + pthread_exit(receive_buffer); + default: + free(receive_buffer); + pthread_exit(NULL); + } + } + + int valid_test_string(void *result){ + char *result_string = (char *) result; + return !strncmp(result_string, thread_test_string, strlen(thread_test_string)); + } +} + +class Zookeeper_queuetest : public CPPUNIT_NS::TestFixture +{ + CPPUNIT_TEST_SUITE(Zookeeper_queuetest); + CPPUNIT_TEST(testInitDestroy); + CPPUNIT_TEST(testOffer1); + CPPUNIT_TEST(testOfferRemove1); + CPPUNIT_TEST(testOfferRemove2); + CPPUNIT_TEST(testOfferRemove3); + CPPUNIT_TEST(testOfferRemove4); + CPPUNIT_TEST(testOfferRemove5); + CPPUNIT_TEST(testOfferRemove6); + CPPUNIT_TEST(testOfferTake1); + CPPUNIT_TEST(testOfferTake2); + CPPUNIT_TEST(testOfferTake3); + CPPUNIT_TEST(testOfferTake4); + CPPUNIT_TEST(testOfferTake5); + CPPUNIT_TEST(testOfferTake6); + CPPUNIT_TEST_SUITE_END(); + + static void watcher(zhandle_t *, int type, int state, const char *path,void*v){ + watchctx_t *ctx = (watchctx_t*)v; + + if (state == ZOO_CONNECTED_STATE) { + ctx->connected = true; + } else { + ctx->connected = false; + } + if (type != ZOO_SESSION_EVENT) { + evt_t evt; + evt.path = path; + evt.type = type; + ctx->putEvent(evt); + } + } + + static const char hostPorts[]; + + const char *getHostPorts() { + return hostPorts; + } + + zhandle_t *createClient(watchctx_t *ctx) { + zhandle_t *zk = zookeeper_init(hostPorts, watcher, 10000, 0, + ctx, 0); + ctx->zh = zk; + sleep(1); + return zk; + } + +public: + +#define ZKSERVER_CMD "./tests/zkServer.sh" + + void setUp() + { + char cmd[1024]; + sprintf(cmd, "%s startClean %s", ZKSERVER_CMD, getHostPorts()); + CPPUNIT_ASSERT(system(cmd) == 0); + } + + + void startServer() { + char cmd[1024]; + sprintf(cmd, "%s start %s", ZKSERVER_CMD, getHostPorts()); + CPPUNIT_ASSERT(system(cmd) == 0); + } + + void stopServer() { + tearDown(); + } + + void tearDown() + { + char cmd[1024]; + sprintf(cmd, "%s stop %s", ZKSERVER_CMD, getHostPorts()); + CPPUNIT_ASSERT(system(cmd) == 0); + } + + void initializeQueuesAndHandles(int num_clients, zhandle_t *zoohandles[], + watchctx_t ctxs[], zkr_queue_t queues[], char *path){ + int i; + for(i=0; i< num_clients; i++){ + zoohandles[i] = createClient(&ctxs[i]); + zkr_queue_init(&queues[i], zoohandles[i], path, &ZOO_OPEN_ACL_UNSAFE); + } + } + + void cleanUpQueues(int num_clients, zkr_queue_t queues[]){ + int i; + for(i=0; i < num_clients; i++){ + zkr_queue_destroy(&queues[i]); + } + } + + void testInitDestroy(){ + int num_clients = 1; + watchctx_t ctxs[num_clients]; + zhandle_t *zoohandles[num_clients]; + zkr_queue_t queues[num_clients]; + char *path= (char *)"/testInitDestroy"; + + int i; + for(i=0; i< num_clients; i++){ + zoohandles[i] = createClient(&ctxs[i]); + zkr_queue_init(&queues[i], zoohandles[i], path, &ZOO_OPEN_ACL_UNSAFE); + } + + for(i=0; i< num_clients; i++){ + zkr_queue_destroy(&queues[i]); + } + + } + + void testOffer1(){ + int num_clients = 1; + watchctx_t ctxs[num_clients]; + zhandle_t *zoohandles[num_clients]; + zkr_queue_t queues[num_clients]; + char *path= (char *)"/testOffer1"; + + initializeQueuesAndHandles(num_clients, zoohandles, ctxs, queues, path); + + const char *test_string="Hello World!"; + int test_string_length = strlen(test_string); + int test_string_buffer_length = test_string_length + 1; + char buffer[test_string_buffer_length]; + + int offer_rc = zkr_queue_offer(&queues[0], test_string, test_string_buffer_length); + CPPUNIT_ASSERT(offer_rc == ZOK); + + int removed_element_buffer_length = test_string_buffer_length; + int remove_rc = zkr_queue_remove(&queues[0], buffer, &removed_element_buffer_length); + CPPUNIT_ASSERT(remove_rc == ZOK); + CPPUNIT_ASSERT(removed_element_buffer_length == test_string_buffer_length); + CPPUNIT_ASSERT(strncmp(test_string,buffer,test_string_length)==0); + + cleanUpQueues(num_clients,queues); + } + + void create_n_remove_m(char *path, int n, int m){ + int num_clients = 2; + watchctx_t ctxs[num_clients]; + zhandle_t *zoohandles[num_clients]; + zkr_queue_t queues[num_clients]; + + initializeQueuesAndHandles(num_clients, zoohandles, ctxs, queues, path); + + int i; + int max_digits = sizeof(int)*3; + const char *test_string = "Hello World!"; + int buffer_length = strlen(test_string) + max_digits + 1; + char correct_buffer[buffer_length]; + char receive_buffer[buffer_length]; + + for(i = 0; i < n; i++){ + snprintf(correct_buffer, buffer_length, "%s%d", test_string,i); + int offer_rc = zkr_queue_offer(&queues[0], correct_buffer, buffer_length); + CPPUNIT_ASSERT(offer_rc == ZOK); + } + printf("Offers\n"); + for(i=0; i=n){ + CPPUNIT_ASSERT(receive_buffer_length == -1); + }else{ + CPPUNIT_ASSERT(strncmp(correct_buffer,receive_buffer, buffer_length)==0); + } + } + + cleanUpQueues(num_clients,queues); + } + + void testOfferRemove1(){ + create_n_remove_m((char *)"/testOfferRemove1", 0,1); + } + + void testOfferRemove2(){ + create_n_remove_m((char *)"/testOfferRemove2", 1,1); + } + + void testOfferRemove3(){ + create_n_remove_m((char *)"/testOfferRemove3", 10,1); + } + + void testOfferRemove4(){ + create_n_remove_m((char *)"/testOfferRemove4", 10,10); + } + + void testOfferRemove5(){ + create_n_remove_m((char *)"/testOfferRemove5", 10,5); + } + + void testOfferRemove6(){ + create_n_remove_m((char *)"/testOfferRemove6", 10,11); + } + + void create_n_take_m(char *path, int n, int m){ + CPPUNIT_ASSERT(m<=n); + int num_clients = 2; + watchctx_t ctxs[num_clients]; + zhandle_t *zoohandles[num_clients]; + zkr_queue_t queues[num_clients]; + + initializeQueuesAndHandles(num_clients, zoohandles, ctxs, queues, path); + + int i; + int max_digits = sizeof(int)*3; + const char *test_string = "Hello World!"; + int buffer_length = strlen(test_string) + max_digits + 1; + char correct_buffer[buffer_length]; + char receive_buffer[buffer_length]; + + for(i = 0; i < n; i++){ + snprintf(correct_buffer, buffer_length, "%s%d", test_string,i); + int offer_rc = zkr_queue_offer(&queues[0], correct_buffer, buffer_length); + CPPUNIT_ASSERT(offer_rc == ZOK); + } + printf("Offers\n"); + for(i=0; i=n){ + CPPUNIT_ASSERT(receive_buffer_length == -1); + }else{ + CPPUNIT_ASSERT(strncmp(correct_buffer,receive_buffer, buffer_length)==0); + } + } + + cleanUpQueues(num_clients,queues); + } + + void testOfferTake1(){ + create_n_take_m((char *)"/testOfferTake1", 2,1); + } + + void testOfferTake2(){ + create_n_take_m((char *)"/testOfferTake2", 1,1); + } + + void testOfferTake3(){ + create_n_take_m((char *)"/testOfferTake3", 10,1); + } + + void testOfferTake4(){ + create_n_take_m((char *)"/testOfferTake4", 10,10); + } + + void testOfferTake5(){ + create_n_take_m((char *)"/testOfferTake5", 10,5); + } + + void testOfferTake6(){ + create_n_take_m((char *)"/testOfferTake6", 12,11); + } + + void testTakeThreaded(){ + int num_clients = 1; + watchctx_t ctxs[num_clients]; + zhandle_t *zoohandles[num_clients]; + zkr_queue_t queues[num_clients]; + char *path=(char *)"/testTakeThreaded"; + + initializeQueuesAndHandles(num_clients, zoohandles, ctxs, queues, path); + pthread_t take_thread; + + pthread_create(&take_thread, NULL, take_thread_shared_queue, (void *) &queues[0]); + + usleep(1000); + + pthread_t offer_thread; + pthread_create(&offer_thread, NULL, offer_thread_shared_queue, (void *) &queues[0]); + pthread_join(offer_thread, NULL); + + void *take_thread_result; + pthread_join(take_thread, &take_thread_result); + CPPUNIT_ASSERT(take_thread_result != NULL); + CPPUNIT_ASSERT(valid_test_string(take_thread_result)); + + cleanUpQueues(num_clients,queues); + } + + void testTakeThreaded2(){ + int num_clients = 1; + watchctx_t ctxs[num_clients]; + zhandle_t *zoohandles[num_clients]; + zkr_queue_t queues[num_clients]; + char *path=(char *)"/testTakeThreaded2"; + + initializeQueuesAndHandles(num_clients, zoohandles, ctxs, queues, path); + + int take_attempts; + int num_take_attempts = 2; + for(take_attempts=0; take_attempts < num_take_attempts; take_attempts++){ + pthread_t take_thread; + + pthread_create(&take_thread, NULL, take_thread_shared_queue, (void *) &queues[0]); + + usleep(1000); + + pthread_t offer_thread; + pthread_create(&offer_thread, NULL, offer_thread_shared_queue, (void *) &queues[0]); + pthread_join(offer_thread, NULL); + + void *take_thread_result; + pthread_join(take_thread, &take_thread_result); + CPPUNIT_ASSERT(take_thread_result != NULL); + CPPUNIT_ASSERT(valid_test_string(take_thread_result)); + + } + cleanUpQueues(num_clients,queues); + } +}; + +const char Zookeeper_queuetest::hostPorts[] = "127.0.0.1:22181"; +CPPUNIT_TEST_SUITE_REGISTRATION(Zookeeper_queuetest); diff --git a/pkg/registry/zookeeper-3.4.6/recipes/queue/src/c/tests/TestDriver.cc b/pkg/registry/zookeeper-3.4.6/recipes/queue/src/c/tests/TestDriver.cc new file mode 100644 index 000000000..2b818f450 --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/recipes/queue/src/c/tests/TestDriver.cc @@ -0,0 +1,114 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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. + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "Util.h" + +using namespace std; + +CPPUNIT_NS_BEGIN + +class EclipseOutputter: public CompilerOutputter +{ +public: + EclipseOutputter(TestResultCollector *result,ostream &stream): + CompilerOutputter(result,stream,"%p:%l: "),stream_(stream) + { + } + virtual void printFailedTestName( TestFailure *failure ){} + virtual void printFailureMessage( TestFailure *failure ) + { + stream_<<": "; + Message msg = failure->thrownException()->message(); + stream_<< msg.shortDescription(); + + string text; + for(int i=0; i the output must be in the compiler error format. + //bool selfTest = (argc > 1) && (std::string("-ide") == argv[1]); + globalTestConfig.addConfigFromCmdLine(argc,argv); + + // Create the event manager and test controller + CPPUNIT_NS::TestResult controller; + // Add a listener that colllects test result + CPPUNIT_NS::TestResultCollector result; + controller.addListener( &result ); + + // Add a listener that print dots as tests run. + // CPPUNIT_NS::TextTestProgressListener progress; + CPPUNIT_NS::BriefTestProgressListener progress; + controller.addListener( &progress ); + + CPPUNIT_NS::TestRunner runner; + runner.addTest( CPPUNIT_NS::TestFactoryRegistry::getRegistry().makeTest() ); + + try + { + cout << "Running " << globalTestConfig.getTestName(); + runner.run( controller, globalTestConfig.getTestName()); + cout< +#include +#include + +// number of elements in array +#define COUNTOF(array) sizeof(array)/sizeof(array[0]) + +#define DECLARE_WRAPPER(ret,sym,sig) \ + extern "C" ret __real_##sym sig; \ + extern "C" ret __wrap_##sym sig + +#define CALL_REAL(sym,params) \ + __real_##sym params + +// must include "src/zookeeper_log.h" to be able to use this macro +#define TEST_TRACE(x) \ + log_message(3,__LINE__,__func__,format_log_message x) + +extern const std::string EMPTY_STRING; + +// ***************************************************************************** +// A bit of wizardry to get to the bare type from a reference or a pointer +// to the type +template +struct TypeOp { + typedef T BareT; + typedef T ArgT; +}; + +// partial specialization for reference types +template +struct TypeOp{ + typedef T& ArgT; + typedef typename TypeOp::BareT BareT; +}; + +// partial specialization for pointers +template +struct TypeOp{ + typedef T* ArgT; + typedef typename TypeOp::BareT BareT; +}; + +// ***************************************************************************** +// Container utilities + +template +void putValue(std::map& map,const K& k, const V& v){ + typedef std::map Map; + typename Map::const_iterator it=map.find(k); + if(it==map.end()) + map.insert(typename Map::value_type(k,v)); + else + map[k]=v; +} + +template +bool getValue(const std::map& map,const K& k,V& v){ + typedef std::map Map; + typename Map::const_iterator it=map.find(k); + if(it==map.end()) + return false; + v=it->second; + return true; +} + +// ***************************************************************************** +// misc utils + +// millisecond sleep +void millisleep(int ms); +// evaluate given predicate until it returns true or the timeout +// (in millis) has expired +template +int ensureCondition(const Predicate& p,int timeout){ + int elapsed=0; + while(!p() && elapsed CmdLineOptList; +public: + typedef CmdLineOptList::const_iterator const_iterator; + TestConfig(){} + ~TestConfig(){} + void addConfigFromCmdLine(int argc, char* argv[]){ + if(argc>=2) + testName_=argv[1]; + for(int i=2; i /tmp/zk.log & + echo $! > /tmp/zk.pid + sleep 5 + ;; +stop) + # Already killed above + ;; +*) + echo "Unknown command " + $1 + exit 2 +esac + diff --git a/pkg/registry/zookeeper-3.4.6/recipes/queue/src/java/org/apache/zookeeper/recipes/queue/DistributedQueue.java b/pkg/registry/zookeeper-3.4.6/recipes/queue/src/java/org/apache/zookeeper/recipes/queue/DistributedQueue.java new file mode 100644 index 000000000..c5d7c83ec --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/recipes/queue/src/java/org/apache/zookeeper/recipes/queue/DistributedQueue.java @@ -0,0 +1,313 @@ +/** + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + */ + +package org.apache.zookeeper.recipes.queue; + +import java.util.List; +import java.util.NoSuchElementException; +import java.util.TreeMap; +import java.util.concurrent.CountDownLatch; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.apache.zookeeper.CreateMode; +import org.apache.zookeeper.KeeperException; +import org.apache.zookeeper.WatchedEvent; +import org.apache.zookeeper.Watcher; +import org.apache.zookeeper.ZooDefs; +import org.apache.zookeeper.ZooKeeper; +import org.apache.zookeeper.data.ACL; +import org.apache.zookeeper.data.Stat; + +/** + * + * A protocol to implement a distributed queue. + * + */ + +public class DistributedQueue { + private static final Logger LOG = LoggerFactory.getLogger(DistributedQueue.class); + + private final String dir; + + private ZooKeeper zookeeper; + private List acl = ZooDefs.Ids.OPEN_ACL_UNSAFE; + + private final String prefix = "qn-"; + + + public DistributedQueue(ZooKeeper zookeeper, String dir, List acl){ + this.dir = dir; + + if(acl != null){ + this.acl = acl; + } + this.zookeeper = zookeeper; + + } + + + + /** + * Returns a Map of the children, ordered by id. + * @param watcher optional watcher on getChildren() operation. + * @return map from id to child name for all children + */ + private TreeMap orderedChildren(Watcher watcher) throws KeeperException, InterruptedException { + TreeMap orderedChildren = new TreeMap(); + + List childNames = null; + try{ + childNames = zookeeper.getChildren(dir, watcher); + }catch (KeeperException.NoNodeException e){ + throw e; + } + + for(String childName : childNames){ + try{ + //Check format + if(!childName.regionMatches(0, prefix, 0, prefix.length())){ + LOG.warn("Found child node with improper name: " + childName); + continue; + } + String suffix = childName.substring(prefix.length()); + Long childId = new Long(suffix); + orderedChildren.put(childId,childName); + }catch(NumberFormatException e){ + LOG.warn("Found child node with improper format : " + childName + " " + e,e); + } + } + + return orderedChildren; + } + + /** + * Find the smallest child node. + * @return The name of the smallest child node. + */ + private String smallestChildName() throws KeeperException, InterruptedException { + long minId = Long.MAX_VALUE; + String minName = ""; + + List childNames = null; + + try{ + childNames = zookeeper.getChildren(dir, false); + }catch(KeeperException.NoNodeException e){ + LOG.warn("Caught: " +e,e); + return null; + } + + for(String childName : childNames){ + try{ + //Check format + if(!childName.regionMatches(0, prefix, 0, prefix.length())){ + LOG.warn("Found child node with improper name: " + childName); + continue; + } + String suffix = childName.substring(prefix.length()); + long childId = Long.parseLong(suffix); + if(childId < minId){ + minId = childId; + minName = childName; + } + }catch(NumberFormatException e){ + LOG.warn("Found child node with improper format : " + childName + " " + e,e); + } + } + + + if(minId < Long.MAX_VALUE){ + return minName; + }else{ + return null; + } + } + + /** + * Return the head of the queue without modifying the queue. + * @return the data at the head of the queue. + * @throws NoSuchElementException + * @throws KeeperException + * @throws InterruptedException + */ + public byte[] element() throws NoSuchElementException, KeeperException, InterruptedException { + TreeMap orderedChildren; + + // element, take, and remove follow the same pattern. + // We want to return the child node with the smallest sequence number. + // Since other clients are remove()ing and take()ing nodes concurrently, + // the child with the smallest sequence number in orderedChildren might be gone by the time we check. + // We don't call getChildren again until we have tried the rest of the nodes in sequence order. + while(true){ + try{ + orderedChildren = orderedChildren(null); + }catch(KeeperException.NoNodeException e){ + throw new NoSuchElementException(); + } + if(orderedChildren.size() == 0 ) throw new NoSuchElementException(); + + for(String headNode : orderedChildren.values()){ + if(headNode != null){ + try{ + return zookeeper.getData(dir+"/"+headNode, false, null); + }catch(KeeperException.NoNodeException e){ + //Another client removed the node first, try next + } + } + } + + } + } + + + /** + * Attempts to remove the head of the queue and return it. + * @return The former head of the queue + * @throws NoSuchElementException + * @throws KeeperException + * @throws InterruptedException + */ + public byte[] remove() throws NoSuchElementException, KeeperException, InterruptedException { + TreeMap orderedChildren; + // Same as for element. Should refactor this. + while(true){ + try{ + orderedChildren = orderedChildren(null); + }catch(KeeperException.NoNodeException e){ + throw new NoSuchElementException(); + } + if(orderedChildren.size() == 0) throw new NoSuchElementException(); + + for(String headNode : orderedChildren.values()){ + String path = dir +"/"+headNode; + try{ + byte[] data = zookeeper.getData(path, false, null); + zookeeper.delete(path, -1); + return data; + }catch(KeeperException.NoNodeException e){ + // Another client deleted the node first. + } + } + + } + } + + private class LatchChildWatcher implements Watcher { + + CountDownLatch latch; + + public LatchChildWatcher(){ + latch = new CountDownLatch(1); + } + + public void process(WatchedEvent event){ + LOG.debug("Watcher fired on path: " + event.getPath() + " state: " + + event.getState() + " type " + event.getType()); + latch.countDown(); + } + public void await() throws InterruptedException { + latch.await(); + } + } + + /** + * Removes the head of the queue and returns it, blocks until it succeeds. + * @return The former head of the queue + * @throws NoSuchElementException + * @throws KeeperException + * @throws InterruptedException + */ + public byte[] take() throws KeeperException, InterruptedException { + TreeMap orderedChildren; + // Same as for element. Should refactor this. + while(true){ + LatchChildWatcher childWatcher = new LatchChildWatcher(); + try{ + orderedChildren = orderedChildren(childWatcher); + }catch(KeeperException.NoNodeException e){ + zookeeper.create(dir, new byte[0], acl, CreateMode.PERSISTENT); + continue; + } + if(orderedChildren.size() == 0){ + childWatcher.await(); + continue; + } + + for(String headNode : orderedChildren.values()){ + String path = dir +"/"+headNode; + try{ + byte[] data = zookeeper.getData(path, false, null); + zookeeper.delete(path, -1); + return data; + }catch(KeeperException.NoNodeException e){ + // Another client deleted the node first. + } + } + } + } + + /** + * Inserts data into queue. + * @param data + * @return true if data was successfully added + */ + public boolean offer(byte[] data) throws KeeperException, InterruptedException{ + for(;;){ + try{ + zookeeper.create(dir+"/"+prefix, data, acl, CreateMode.PERSISTENT_SEQUENTIAL); + return true; + }catch(KeeperException.NoNodeException e){ + zookeeper.create(dir, new byte[0], acl, CreateMode.PERSISTENT); + } + } + + } + + /** + * Returns the data at the first element of the queue, or null if the queue is empty. + * @return data at the first element of the queue, or null. + * @throws KeeperException + * @throws InterruptedException + */ + public byte[] peek() throws KeeperException, InterruptedException{ + try{ + return element(); + }catch(NoSuchElementException e){ + return null; + } + } + + + /** + * Attempts to remove the head of the queue and return it. Returns null if the queue is empty. + * @return Head of the queue or null. + * @throws KeeperException + * @throws InterruptedException + */ + public byte[] poll() throws KeeperException, InterruptedException { + try{ + return remove(); + }catch(NoSuchElementException e){ + return null; + } + } + + + +} diff --git a/pkg/registry/zookeeper-3.4.6/src/c/ChangeLog b/pkg/registry/zookeeper-3.4.6/src/c/ChangeLog new file mode 100644 index 000000000..c85a6c0ad --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/c/ChangeLog @@ -0,0 +1,116 @@ +Release 2.1.1 +2008-04-30 Andrew Kornev + + * changed the distributino package name to "c-client-src" + +Release 2.1.0 +2008-04-30 Andrew Kornev + + * added the client latency diagnostics; the client prints a warning when the + reponse latency exceeds 20ms + + * modified logging format to report the znode path for which the zookeeper + operation is called + + * fixed a minor bug where error messages were missing for some of the newer + zookeeper error codes (ZCLOSING and ZNOTHING). + + * improved logging by adding the XID to the message to make it easy to match + requests to responses + + * fixed the bug causing sporadic session termination and timeouts + + * added a new return code to zookeeper_process() -- ZNOTHING -- + that indicates that the socket has no more data to read + + * more unit tests added + +Release 1.1.3 +2008-02-07 Andrew Kornev + + * get_xid() is not thread-safe (xid initialization race condition + in the multi-threaded mode). + + * the I/O thread doesnt automatically terminate on AUTH_FAILURE and + SESSION_EXPIRED events. + + * all session events should be processed on the completion thread. + + * PING operation doesnt atomically enqueue the completion and + send buffers like other operations do. + + * corrected zookeeper_init() doxygen docs. + + * new unit tests added. + + +Release 1.1.2 +2008-01-24 Andrew Kornev + + * fixed a race condition caused by the code in zookeeper_process() + and free_completions() setting sc->complete to 1 without proper + synchronization; + + * fixed zoo_get() not updating buffer_len value with the actual + buffer length on return; added missing enter_critical/leave_critical + calls to the async ZK operations. + + * Replaced select() with poll() to fix the problem with the FD_SET + macro causing stack corruption for FDs higher than 1024 + + * Added zoo_set_log_stream() to the public API. The function allows + applications to specify a different log file. + + * Removed unused declarations from zookeeper.h (ACL related) + + * changed zoo_get() signature to take a pointer to buffer length. + The function sets the parameter to the actual data length upon return. + + * the watcher callback now takes the zhandle as its first parameter. This + is to avoid a race condition in the multi-threaded client when a watcher + is called before zookeeper_init() has returned. + + * fixed zookeeper_close() resource leaks and race conditions, + fixed the race condition causing xid mismatch. + + * added support for cppunit, added new targets: "check" and "run-check" + to build and run unit tests. + + * Changed the signature of zookeeper_init(): it now takes a context pointer + as a parameter. This is to avoid a race condition in the multi-threaded client. + + * Using a self-pipe rather than SIGUSR1 to wake up select() in the I/O thread + + * Added the doxygen target to the autoconf scripts + + * Pulled out the logging functionality from zookeeper.c to zk_log.c/.h. + Fixed a minor issue with PING responses being unnecessarily put on + the completion queue rather than simply dropped. Make use of DLL_EXPORT + symbol for building shared lib on cygwin. + + * Implemented new Zookeeper operation sync() to flush the leader channel + to ensure that all updates have reached the followers. + + * Synchronous methods not being handled properly on disconnect + + * breed: fixed an incorrect parameter passed to zookeeper API by + the Sync API wrapper functions + + * breed: the set and delete commands now support both Sync and Async API. + Prefix the command name with an 'a' to call the Async API: aset, adelete + + * Make sure mutexes and condition variables are properly initialized + and destroyed + + * Fixed zookeeper_close() causing core dumps with mt_adaptor + + +Release 1.0.0 +2007-11-27 Andrew Kornev + + * configure.ac and Makefile.am added support for GNU autotools + + * recordio.c/.h updated jute IO routines to use bit-explicit integer types + (int32_t vs. int, and int64_t vs. long long) + + * README rough draft \ No newline at end of file diff --git a/pkg/registry/zookeeper-3.4.6/src/c/Cli.vcproj b/pkg/registry/zookeeper-3.4.6/src/c/Cli.vcproj new file mode 100644 index 000000000..39ed8a429 --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/c/Cli.vcproj @@ -0,0 +1,210 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/pkg/registry/zookeeper-3.4.6/src/c/INSTALL b/pkg/registry/zookeeper-3.4.6/src/c/INSTALL new file mode 100644 index 000000000..5458714e1 --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/c/INSTALL @@ -0,0 +1,234 @@ +Installation Instructions +************************* + +Copyright (C) 1994, 1995, 1996, 1999, 2000, 2001, 2002, 2004, 2005, +2006 Free Software Foundation, Inc. + +This file is free documentation; the Free Software Foundation gives +unlimited permission to copy, distribute and modify it. + +Basic Installation +================== + +Briefly, the shell commands `./configure; make; make install' should +configure, build, and install this package. The following +more-detailed instructions are generic; see the `README' file for +instructions specific to this package. + + The `configure' shell script attempts to guess correct values for +various system-dependent variables used during compilation. It uses +those values to create a `Makefile' in each directory of the package. +It may also create one or more `.h' files containing system-dependent +definitions. Finally, it creates a shell script `config.status' that +you can run in the future to recreate the current configuration, and a +file `config.log' containing compiler output (useful mainly for +debugging `configure'). + + It can also use an optional file (typically called `config.cache' +and enabled with `--cache-file=config.cache' or simply `-C') that saves +the results of its tests to speed up reconfiguring. Caching is +disabled by default to prevent problems with accidental use of stale +cache files. + + If you need to do unusual things to compile the package, please try +to figure out how `configure' could check whether to do them, and mail +diffs or instructions to the address given in the `README' so they can +be considered for the next release. If you are using the cache, and at +some point `config.cache' contains results you don't want to keep, you +may remove or edit it. + + The file `configure.ac' (or `configure.in') is used to create +`configure' by a program called `autoconf'. You need `configure.ac' if +you want to change it or regenerate `configure' using a newer version +of `autoconf'. + +The simplest way to compile this package is: + + 1. `cd' to the directory containing the package's source code and type + `./configure' to configure the package for your system. + + Running `configure' might take a while. While running, it prints + some messages telling which features it is checking for. + + 2. Type `make' to compile the package. + + 3. Optionally, type `make check' to run any self-tests that come with + the package. + + 4. Type `make install' to install the programs and any data files and + documentation. + + 5. You can remove the program binaries and object files from the + source code directory by typing `make clean'. To also remove the + files that `configure' created (so you can compile the package for + a different kind of computer), type `make distclean'. There is + also a `make maintainer-clean' target, but that is intended mainly + for the package's developers. If you use it, you may have to get + all sorts of other programs in order to regenerate files that came + with the distribution. + +Compilers and Options +===================== + +Some systems require unusual options for compilation or linking that the +`configure' script does not know about. Run `./configure --help' for +details on some of the pertinent environment variables. + + You can give `configure' initial values for configuration parameters +by setting variables in the command line or in the environment. Here +is an example: + + ./configure CC=c99 CFLAGS=-g LIBS=-lposix + + *Note Defining Variables::, for more details. + +Compiling For Multiple Architectures +==================================== + +You can compile the package for more than one kind of computer at the +same time, by placing the object files for each architecture in their +own directory. To do this, you can use GNU `make'. `cd' to the +directory where you want the object files and executables to go and run +the `configure' script. `configure' automatically checks for the +source code in the directory that `configure' is in and in `..'. + + With a non-GNU `make', it is safer to compile the package for one +architecture at a time in the source code directory. After you have +installed the package for one architecture, use `make distclean' before +reconfiguring for another architecture. + +Installation Names +================== + +By default, `make install' installs the package's commands under +`/usr/local/bin', include files under `/usr/local/include', etc. You +can specify an installation prefix other than `/usr/local' by giving +`configure' the option `--prefix=PREFIX'. + + You can specify separate installation prefixes for +architecture-specific files and architecture-independent files. If you +pass the option `--exec-prefix=PREFIX' to `configure', the package uses +PREFIX as the prefix for installing programs and libraries. +Documentation and other data files still use the regular prefix. + + In addition, if you use an unusual directory layout you can give +options like `--bindir=DIR' to specify different values for particular +kinds of files. Run `configure --help' for a list of the directories +you can set and what kinds of files go in them. + + If the package supports it, you can cause programs to be installed +with an extra prefix or suffix on their names by giving `configure' the +option `--program-prefix=PREFIX' or `--program-suffix=SUFFIX'. + +Optional Features +================= + +Some packages pay attention to `--enable-FEATURE' options to +`configure', where FEATURE indicates an optional part of the package. +They may also pay attention to `--with-PACKAGE' options, where PACKAGE +is something like `gnu-as' or `x' (for the X Window System). The +`README' should mention any `--enable-' and `--with-' options that the +package recognizes. + + For packages that use the X Window System, `configure' can usually +find the X include and library files automatically, but if it doesn't, +you can use the `configure' options `--x-includes=DIR' and +`--x-libraries=DIR' to specify their locations. + +Specifying the System Type +========================== + +There may be some features `configure' cannot figure out automatically, +but needs to determine by the type of machine the package will run on. +Usually, assuming the package is built to be run on the _same_ +architectures, `configure' can figure that out, but if it prints a +message saying it cannot guess the machine type, give it the +`--build=TYPE' option. TYPE can either be a short name for the system +type, such as `sun4', or a canonical name which has the form: + + CPU-COMPANY-SYSTEM + +where SYSTEM can have one of these forms: + + OS KERNEL-OS + + See the file `config.sub' for the possible values of each field. If +`config.sub' isn't included in this package, then this package doesn't +need to know the machine type. + + If you are _building_ compiler tools for cross-compiling, you should +use the option `--target=TYPE' to select the type of system they will +produce code for. + + If you want to _use_ a cross compiler, that generates code for a +platform different from the build platform, you should specify the +"host" platform (i.e., that on which the generated programs will +eventually be run) with `--host=TYPE'. + +Sharing Defaults +================ + +If you want to set default values for `configure' scripts to share, you +can create a site shell script called `config.site' that gives default +values for variables like `CC', `cache_file', and `prefix'. +`configure' looks for `PREFIX/share/config.site' if it exists, then +`PREFIX/etc/config.site' if it exists. Or, you can set the +`CONFIG_SITE' environment variable to the location of the site script. +A warning: not all `configure' scripts look for a site script. + +Defining Variables +================== + +Variables not defined in a site shell script can be set in the +environment passed to `configure'. However, some packages may run +configure again during the build, and the customized values of these +variables may be lost. In order to avoid this problem, you should set +them in the `configure' command line, using `VAR=value'. For example: + + ./configure CC=/usr/local2/bin/gcc + +causes the specified `gcc' to be used as the C compiler (unless it is +overridden in the site shell script). + +Unfortunately, this technique does not work for `CONFIG_SHELL' due to +an Autoconf bug. Until the bug is fixed you can use this workaround: + + CONFIG_SHELL=/bin/bash /bin/bash ./configure CONFIG_SHELL=/bin/bash + +`configure' Invocation +====================== + +`configure' recognizes the following options to control how it operates. + +`--help' +`-h' + Print a summary of the options to `configure', and exit. + +`--version' +`-V' + Print the version of Autoconf used to generate the `configure' + script, and exit. + +`--cache-file=FILE' + Enable the cache: use and save the results of the tests in FILE, + traditionally `config.cache'. FILE defaults to `/dev/null' to + disable caching. + +`--config-cache' +`-C' + Alias for `--cache-file=config.cache'. + +`--quiet' +`--silent' +`-q' + Do not print messages saying which checks are being made. To + suppress all normal output, redirect it to `/dev/null' (any error + messages will still be shown). + +`--srcdir=DIR' + Look for the package's source code in directory DIR. Usually + `configure' can determine that directory automatically. + +`configure' also accepts some other, not widely useful, options. Run +`configure --help' for more details. + diff --git a/pkg/registry/zookeeper-3.4.6/src/c/LICENSE b/pkg/registry/zookeeper-3.4.6/src/c/LICENSE new file mode 100644 index 000000000..d64569567 --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/c/LICENSE @@ -0,0 +1,202 @@ + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/pkg/registry/zookeeper-3.4.6/src/c/Makefile.am b/pkg/registry/zookeeper-3.4.6/src/c/Makefile.am new file mode 100644 index 000000000..dbf4080f5 --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/c/Makefile.am @@ -0,0 +1,108 @@ +# need this for Doxygen integration +include $(top_srcdir)/aminclude.am + +AM_CPPFLAGS = -I${srcdir}/include -I${srcdir}/tests -I${srcdir}/generated +AM_CFLAGS = -Wall -Werror +AM_CXXFLAGS = -Wall $(USEIPV6) + +LIB_LDFLAGS = -no-undefined -version-info 2 + +pkginclude_HEADERS = include/zookeeper.h include/zookeeper_version.h include/zookeeper_log.h include/proto.h include/recordio.h generated/zookeeper.jute.h +EXTRA_DIST=LICENSE + +HASHTABLE_SRC = src/hashtable/hashtable_itr.h src/hashtable/hashtable_itr.c \ + src/hashtable/hashtable_private.h src/hashtable/hashtable.h src/hashtable/hashtable.c + +noinst_LTLIBRARIES = libhashtable.la +libhashtable_la_SOURCES = $(HASHTABLE_SRC) + +COMMON_SRC = src/zookeeper.c include/zookeeper.h include/zookeeper_version.h include/zookeeper_log.h\ + src/recordio.c include/recordio.h include/proto.h \ + src/zk_adaptor.h generated/zookeeper.jute.c \ + src/zookeeper_log.h src/zk_log.c src/zk_hashtable.h src/zk_hashtable.c + +# These are the symbols (classes, mostly) we want to export from our library. +EXPORT_SYMBOLS = '(zoo_|zookeeper_|zhandle|Z|format_log_message|log_message|logLevel|deallocate_|zerror|is_unrecoverable)' +noinst_LTLIBRARIES += libzkst.la +libzkst_la_SOURCES =$(COMMON_SRC) src/st_adaptor.c +libzkst_la_LIBADD = -lm + +lib_LTLIBRARIES = libzookeeper_st.la +libzookeeper_st_la_SOURCES = +libzookeeper_st_la_LIBADD=libzkst.la libhashtable.la +libzookeeper_st_la_DEPENDENCIES=libzkst.la libhashtable.la +libzookeeper_st_la_LDFLAGS = $(LIB_LDFLAGS) -export-symbols-regex $(EXPORT_SYMBOLS) + +if WANT_SYNCAPI +noinst_LTLIBRARIES += libzkmt.la +libzkmt_la_SOURCES =$(COMMON_SRC) src/mt_adaptor.c +libzkmt_la_CFLAGS = -DTHREADED +libzkmt_la_LIBADD = -lm + +lib_LTLIBRARIES += libzookeeper_mt.la +libzookeeper_mt_la_SOURCES = +libzookeeper_mt_la_LIBADD=libzkmt.la libhashtable.la -lpthread +libzookeeper_mt_la_DEPENDENCIES=libzkmt.la libhashtable.la +libzookeeper_mt_la_LDFLAGS = $(LIB_LDFLAGS) -export-symbols-regex $(EXPORT_SYMBOLS) +endif + +bin_PROGRAMS = cli_st + +cli_st_SOURCES = src/cli.c +cli_st_LDADD = libzookeeper_st.la + +if WANT_SYNCAPI +bin_PROGRAMS += cli_mt load_gen + +cli_mt_SOURCES = src/cli.c +cli_mt_LDADD = libzookeeper_mt.la +cli_mt_CFLAGS = -DTHREADED + +load_gen_SOURCES = src/load_gen.c +load_gen_LDADD = libzookeeper_mt.la +load_gen_CFLAGS = -DTHREADED + +endif + +######################################################################### +# build and run unit tests + +EXTRA_DIST+=$(wildcard ${srcdir}/tests/*.cc) $(wildcard ${srcdir}/tests/*.h) \ + ${srcdir}/tests/wrappers.opt ${srcdir}/tests/wrappers-mt.opt + +TEST_SOURCES = tests/TestDriver.cc tests/LibCMocks.cc tests/LibCSymTable.cc \ + tests/MocksBase.cc tests/ZKMocks.cc tests/Util.cc tests/ThreadingUtil.cc \ + tests/TestClientRetry.cc \ + tests/TestOperations.cc tests/TestZookeeperInit.cc \ + tests/TestZookeeperClose.cc tests/TestClient.cc \ + tests/TestMulti.cc tests/TestWatchers.cc + + +SYMBOL_WRAPPERS=$(shell cat ${srcdir}/tests/wrappers.opt) + +check_PROGRAMS = zktest-st +nodist_zktest_st_SOURCES = $(TEST_SOURCES) +zktest_st_LDADD = libzkst.la libhashtable.la $(CPPUNIT_LIBS) +zktest_st_CXXFLAGS = -DUSE_STATIC_LIB $(CPPUNIT_CFLAGS) $(USEIPV6) +zktest_st_LDFLAGS = -static-libtool-libs $(SYMBOL_WRAPPERS) + +if WANT_SYNCAPI + check_PROGRAMS += zktest-mt + nodist_zktest_mt_SOURCES = $(TEST_SOURCES) tests/PthreadMocks.cc + zktest_mt_LDADD = libzkmt.la libhashtable.la -lpthread $(CPPUNIT_LIBS) + zktest_mt_CXXFLAGS = -DUSE_STATIC_LIB -DTHREADED $(CPPUNIT_CFLAGS) $(USEIPV6) + SYMBOL_WRAPPERS_MT=$(SYMBOL_WRAPPERS) $(shell cat ${srcdir}/tests/wrappers-mt.opt) + zktest_mt_LDFLAGS = -static-libtool-libs $(SYMBOL_WRAPPERS_MT) +endif + +run-check: check + ./zktest-st $(TEST_OPTIONS) +if WANT_SYNCAPI + ./zktest-mt $(TEST_OPTIONS) +endif + +clean-local: clean-check + $(RM) $(DX_CLEANFILES) + +clean-check: + $(RM) $(nodist_zktest_st_OBJECTS) $(nodist_zktest_mt_OBJECTS) diff --git a/pkg/registry/zookeeper-3.4.6/src/c/Makefile.in b/pkg/registry/zookeeper-3.4.6/src/c/Makefile.in new file mode 100644 index 000000000..b91747f91 --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/c/Makefile.in @@ -0,0 +1,1782 @@ +# Makefile.in generated by automake 1.11.6 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software +# Foundation, Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +# Copyright (C) 2004 Oren Ben-Kiki +# This file is distributed under the same terms as the Automake macro files. + +# Generate automatic documentation using Doxygen. Goals and variables values +# are controlled by the various DX_COND_??? conditionals set by autoconf. +# +# The provided goals are: +# doxygen-doc: Generate all doxygen documentation. +# doxygen-run: Run doxygen, which will generate some of the documentation +# (HTML, CHM, CHI, MAN, RTF, XML) but will not do the post +# processing required for the rest of it (PS, PDF, and some MAN). +# doxygen-man: Rename some doxygen generated man pages. +# doxygen-ps: Generate doxygen PostScript documentation. +# doxygen-pdf: Generate doxygen PDF documentation. +# +# Note that by default these are not integrated into the automake goals. If +# doxygen is used to generate man pages, you can achieve this integration by +# setting man3_MANS to the list of man pages generated and then adding the +# dependency: +# +# $(man3_MANS): doxygen-doc +# +# This will cause make to run doxygen and generate all the documentation. +# +# The following variable is intended for use in Makefile.am: +# +# DX_CLEANFILES = everything to clean. +# +# This is usually added to MOSTLYCLEANFILES. + + + +VPATH = @srcdir@ +am__make_dryrun = \ + { \ + am__dry=no; \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + echo 'am--echo: ; @echo "AM" OK' | $(MAKE) -f - 2>/dev/null \ + | grep '^AM OK$$' >/dev/null || am__dry=yes;; \ + *) \ + for am__flg in $$MAKEFLAGS; do \ + case $$am__flg in \ + *=*|--*) ;; \ + *n*) am__dry=yes; break;; \ + esac; \ + done;; \ + esac; \ + test $$am__dry = yes; \ + } +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +DIST_COMMON = README $(am__configure_deps) $(pkginclude_HEADERS) \ + $(srcdir)/Makefile.am $(srcdir)/Makefile.in \ + $(srcdir)/config.h.in $(top_srcdir)/aminclude.am \ + $(top_srcdir)/configure ChangeLog INSTALL compile config.guess \ + config.sub depcomp install-sh ltmain.sh missing +@WANT_SYNCAPI_TRUE@am__append_1 = libzkmt.la +@WANT_SYNCAPI_TRUE@am__append_2 = libzookeeper_mt.la +bin_PROGRAMS = cli_st$(EXEEXT) $(am__EXEEXT_1) +@WANT_SYNCAPI_TRUE@am__append_3 = cli_mt load_gen +check_PROGRAMS = zktest-st$(EXEEXT) $(am__EXEEXT_2) +@WANT_SYNCAPI_TRUE@am__append_4 = zktest-mt +subdir = . +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/acinclude.m4 \ + $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +am__CONFIG_DISTCLEAN_FILES = config.status config.cache config.log \ + configure.lineno config.status.lineno +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; +am__vpath_adj = case $$p in \ + $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ + *) f=$$p;; \ + esac; +am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; +am__install_max = 40 +am__nobase_strip_setup = \ + srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` +am__nobase_strip = \ + for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" +am__nobase_list = $(am__nobase_strip_setup); \ + for p in $$list; do echo "$$p $$p"; done | \ + sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ + $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ + if (++n[$$2] == $(am__install_max)) \ + { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ + END { for (dir in files) print dir, files[dir] }' +am__base_list = \ + sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ + sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' +am__uninstall_files_from_dir = { \ + test -z "$$files" \ + || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ + || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ + $(am__cd) "$$dir" && rm -f $$files; }; \ + } +am__installdirs = "$(DESTDIR)$(libdir)" "$(DESTDIR)$(bindir)" \ + "$(DESTDIR)$(pkgincludedir)" +LTLIBRARIES = $(lib_LTLIBRARIES) $(noinst_LTLIBRARIES) +libhashtable_la_LIBADD = +am__objects_1 = hashtable_itr.lo hashtable.lo +am_libhashtable_la_OBJECTS = $(am__objects_1) +libhashtable_la_OBJECTS = $(am_libhashtable_la_OBJECTS) +libzkmt_la_DEPENDENCIES = +am__libzkmt_la_SOURCES_DIST = src/zookeeper.c include/zookeeper.h \ + include/zookeeper_version.h include/zookeeper_log.h \ + src/recordio.c include/recordio.h include/proto.h \ + src/zk_adaptor.h generated/zookeeper.jute.c \ + src/zookeeper_log.h src/zk_log.c src/zk_hashtable.h \ + src/zk_hashtable.c src/mt_adaptor.c +am__objects_2 = libzkmt_la-zookeeper.lo libzkmt_la-recordio.lo \ + libzkmt_la-zookeeper.jute.lo libzkmt_la-zk_log.lo \ + libzkmt_la-zk_hashtable.lo +@WANT_SYNCAPI_TRUE@am_libzkmt_la_OBJECTS = $(am__objects_2) \ +@WANT_SYNCAPI_TRUE@ libzkmt_la-mt_adaptor.lo +libzkmt_la_OBJECTS = $(am_libzkmt_la_OBJECTS) +libzkmt_la_LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(libzkmt_la_CFLAGS) \ + $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ +@WANT_SYNCAPI_TRUE@am_libzkmt_la_rpath = +libzkst_la_DEPENDENCIES = +am__objects_3 = zookeeper.lo recordio.lo zookeeper.jute.lo zk_log.lo \ + zk_hashtable.lo +am_libzkst_la_OBJECTS = $(am__objects_3) st_adaptor.lo +libzkst_la_OBJECTS = $(am_libzkst_la_OBJECTS) +am_libzookeeper_mt_la_OBJECTS = +libzookeeper_mt_la_OBJECTS = $(am_libzookeeper_mt_la_OBJECTS) +libzookeeper_mt_la_LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(libzookeeper_mt_la_LDFLAGS) $(LDFLAGS) -o $@ +@WANT_SYNCAPI_TRUE@am_libzookeeper_mt_la_rpath = -rpath $(libdir) +am_libzookeeper_st_la_OBJECTS = +libzookeeper_st_la_OBJECTS = $(am_libzookeeper_st_la_OBJECTS) +libzookeeper_st_la_LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(libzookeeper_st_la_LDFLAGS) $(LDFLAGS) -o $@ +@WANT_SYNCAPI_TRUE@am__EXEEXT_1 = cli_mt$(EXEEXT) load_gen$(EXEEXT) +@WANT_SYNCAPI_TRUE@am__EXEEXT_2 = zktest-mt$(EXEEXT) +PROGRAMS = $(bin_PROGRAMS) +am__cli_mt_SOURCES_DIST = src/cli.c +@WANT_SYNCAPI_TRUE@am_cli_mt_OBJECTS = cli_mt-cli.$(OBJEXT) +cli_mt_OBJECTS = $(am_cli_mt_OBJECTS) +@WANT_SYNCAPI_TRUE@cli_mt_DEPENDENCIES = libzookeeper_mt.la +cli_mt_LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=link $(CCLD) $(cli_mt_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \ + $(LDFLAGS) -o $@ +am_cli_st_OBJECTS = cli.$(OBJEXT) +cli_st_OBJECTS = $(am_cli_st_OBJECTS) +cli_st_DEPENDENCIES = libzookeeper_st.la +am__load_gen_SOURCES_DIST = src/load_gen.c +@WANT_SYNCAPI_TRUE@am_load_gen_OBJECTS = load_gen-load_gen.$(OBJEXT) +load_gen_OBJECTS = $(am_load_gen_OBJECTS) +@WANT_SYNCAPI_TRUE@load_gen_DEPENDENCIES = libzookeeper_mt.la +load_gen_LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=link $(CCLD) $(load_gen_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \ + $(LDFLAGS) -o $@ +am__objects_4 = zktest_mt-TestDriver.$(OBJEXT) \ + zktest_mt-LibCMocks.$(OBJEXT) zktest_mt-LibCSymTable.$(OBJEXT) \ + zktest_mt-MocksBase.$(OBJEXT) zktest_mt-ZKMocks.$(OBJEXT) \ + zktest_mt-Util.$(OBJEXT) zktest_mt-ThreadingUtil.$(OBJEXT) \ + zktest_mt-TestClientRetry.$(OBJEXT) \ + zktest_mt-TestOperations.$(OBJEXT) \ + zktest_mt-TestZookeeperInit.$(OBJEXT) \ + zktest_mt-TestZookeeperClose.$(OBJEXT) \ + zktest_mt-TestClient.$(OBJEXT) zktest_mt-TestMulti.$(OBJEXT) \ + zktest_mt-TestWatchers.$(OBJEXT) +@WANT_SYNCAPI_TRUE@nodist_zktest_mt_OBJECTS = $(am__objects_4) \ +@WANT_SYNCAPI_TRUE@ zktest_mt-PthreadMocks.$(OBJEXT) +zktest_mt_OBJECTS = $(nodist_zktest_mt_OBJECTS) +am__DEPENDENCIES_1 = +@WANT_SYNCAPI_TRUE@zktest_mt_DEPENDENCIES = libzkmt.la libhashtable.la \ +@WANT_SYNCAPI_TRUE@ $(am__DEPENDENCIES_1) +zktest_mt_LINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CXXLD) $(zktest_mt_CXXFLAGS) \ + $(CXXFLAGS) $(zktest_mt_LDFLAGS) $(LDFLAGS) -o $@ +am__objects_5 = zktest_st-TestDriver.$(OBJEXT) \ + zktest_st-LibCMocks.$(OBJEXT) zktest_st-LibCSymTable.$(OBJEXT) \ + zktest_st-MocksBase.$(OBJEXT) zktest_st-ZKMocks.$(OBJEXT) \ + zktest_st-Util.$(OBJEXT) zktest_st-ThreadingUtil.$(OBJEXT) \ + zktest_st-TestClientRetry.$(OBJEXT) \ + zktest_st-TestOperations.$(OBJEXT) \ + zktest_st-TestZookeeperInit.$(OBJEXT) \ + zktest_st-TestZookeeperClose.$(OBJEXT) \ + zktest_st-TestClient.$(OBJEXT) zktest_st-TestMulti.$(OBJEXT) \ + zktest_st-TestWatchers.$(OBJEXT) +nodist_zktest_st_OBJECTS = $(am__objects_5) +zktest_st_OBJECTS = $(nodist_zktest_st_OBJECTS) +zktest_st_DEPENDENCIES = libzkst.la libhashtable.la \ + $(am__DEPENDENCIES_1) +zktest_st_LINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CXXLD) $(zktest_st_CXXFLAGS) \ + $(CXXFLAGS) $(zktest_st_LDFLAGS) $(LDFLAGS) -o $@ +DEFAULT_INCLUDES = -I.@am__isrc@ +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +am__mv = mv -f +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +LTCOMPILE = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +CCLD = $(CC) +LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \ + $(LDFLAGS) -o $@ +CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) +LTCXXCOMPILE = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) +CXXLD = $(CXX) +CXXLINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=link $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) \ + $(LDFLAGS) -o $@ +SOURCES = $(libhashtable_la_SOURCES) $(libzkmt_la_SOURCES) \ + $(libzkst_la_SOURCES) $(libzookeeper_mt_la_SOURCES) \ + $(libzookeeper_st_la_SOURCES) $(cli_mt_SOURCES) \ + $(cli_st_SOURCES) $(load_gen_SOURCES) \ + $(nodist_zktest_mt_SOURCES) $(nodist_zktest_st_SOURCES) +DIST_SOURCES = $(libhashtable_la_SOURCES) \ + $(am__libzkmt_la_SOURCES_DIST) $(libzkst_la_SOURCES) \ + $(libzookeeper_mt_la_SOURCES) $(libzookeeper_st_la_SOURCES) \ + $(am__cli_mt_SOURCES_DIST) $(cli_st_SOURCES) \ + $(am__load_gen_SOURCES_DIST) +am__can_run_installinfo = \ + case $$AM_UPDATE_INFO_DIR in \ + n|no|NO) false;; \ + *) (install-info --version) >/dev/null 2>&1;; \ + esac +HEADERS = $(pkginclude_HEADERS) +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +distdir = $(PACKAGE)-$(VERSION) +top_distdir = $(distdir) +am__remove_distdir = \ + if test -d "$(distdir)"; then \ + find "$(distdir)" -type d ! -perm -200 -exec chmod u+w {} ';' \ + && rm -rf "$(distdir)" \ + || { sleep 5 && rm -rf "$(distdir)"; }; \ + else :; fi +DIST_ARCHIVES = $(distdir).tar.gz +GZIP_ENV = --best +distuninstallcheck_listfiles = find . -type f -print +am__distuninstallcheck_listfiles = $(distuninstallcheck_listfiles) \ + | sed 's|^\./|$(prefix)/|' | grep -v '$(infodir)/dir$$' +distcleancheck_listfiles = find . -type f -print +ACLOCAL = @ACLOCAL@ +AMTAR = @AMTAR@ +AR = @AR@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CPPUNIT_CFLAGS = @CPPUNIT_CFLAGS@ +CPPUNIT_CONFIG = @CPPUNIT_CONFIG@ +CPPUNIT_LIBS = @CPPUNIT_LIBS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DLLTOOL = @DLLTOOL@ +DOXYGEN_PAPER_SIZE = @DOXYGEN_PAPER_SIZE@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +DX_CONFIG = @DX_CONFIG@ +DX_DOCDIR = @DX_DOCDIR@ +DX_DOT = @DX_DOT@ +DX_DOXYGEN = @DX_DOXYGEN@ +DX_DVIPS = @DX_DVIPS@ +DX_EGREP = @DX_EGREP@ +DX_ENV = @DX_ENV@ +DX_FLAG_chi = @DX_FLAG_chi@ +DX_FLAG_chm = @DX_FLAG_chm@ +DX_FLAG_doc = @DX_FLAG_doc@ +DX_FLAG_dot = @DX_FLAG_dot@ +DX_FLAG_html = @DX_FLAG_html@ +DX_FLAG_man = @DX_FLAG_man@ +DX_FLAG_pdf = @DX_FLAG_pdf@ +DX_FLAG_ps = @DX_FLAG_ps@ +DX_FLAG_rtf = @DX_FLAG_rtf@ +DX_FLAG_xml = @DX_FLAG_xml@ +DX_HHC = @DX_HHC@ +DX_LATEX = @DX_LATEX@ +DX_MAKEINDEX = @DX_MAKEINDEX@ +DX_PDFLATEX = @DX_PDFLATEX@ +DX_PERL = @DX_PERL@ +DX_PROJECT = @DX_PROJECT@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +FGREP = @FGREP@ +GREP = @GREP@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBOBJS = @LTLIBOBJS@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MKDIR_P = @MKDIR_P@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +RANLIB = @RANLIB@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +STRIP = @STRIP@ +USEIPV6 = @USEIPV6@ +VERSION = @VERSION@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +@DX_COND_doc_TRUE@@DX_COND_html_TRUE@DX_CLEAN_HTML = @DX_DOCDIR@/html +@DX_COND_chm_TRUE@@DX_COND_doc_TRUE@DX_CLEAN_CHM = @DX_DOCDIR@/chm +@DX_COND_chi_TRUE@@DX_COND_chm_TRUE@@DX_COND_doc_TRUE@DX_CLEAN_CHI = @DX_DOCDIR@/@PACKAGE@.chi +@DX_COND_doc_TRUE@@DX_COND_man_TRUE@DX_CLEAN_MAN = @DX_DOCDIR@/man +@DX_COND_doc_TRUE@@DX_COND_rtf_TRUE@DX_CLEAN_RTF = @DX_DOCDIR@/rtf +@DX_COND_doc_TRUE@@DX_COND_xml_TRUE@DX_CLEAN_XML = @DX_DOCDIR@/xml +@DX_COND_doc_TRUE@@DX_COND_ps_TRUE@DX_CLEAN_PS = @DX_DOCDIR@/@PACKAGE@.ps +@DX_COND_doc_TRUE@@DX_COND_ps_TRUE@DX_PS_GOAL = doxygen-ps +@DX_COND_doc_TRUE@@DX_COND_pdf_TRUE@DX_CLEAN_PDF = @DX_DOCDIR@/@PACKAGE@.pdf +@DX_COND_doc_TRUE@@DX_COND_pdf_TRUE@DX_PDF_GOAL = doxygen-pdf +@DX_COND_doc_TRUE@@DX_COND_latex_TRUE@DX_CLEAN_LATEX = @DX_DOCDIR@/latex +@DX_COND_doc_TRUE@DX_CLEANFILES = \ +@DX_COND_doc_TRUE@ @DX_DOCDIR@/@PACKAGE@.tag \ +@DX_COND_doc_TRUE@ -r \ +@DX_COND_doc_TRUE@ $(DX_CLEAN_HTML) \ +@DX_COND_doc_TRUE@ $(DX_CLEAN_CHM) \ +@DX_COND_doc_TRUE@ $(DX_CLEAN_CHI) \ +@DX_COND_doc_TRUE@ $(DX_CLEAN_MAN) \ +@DX_COND_doc_TRUE@ $(DX_CLEAN_RTF) \ +@DX_COND_doc_TRUE@ $(DX_CLEAN_XML) \ +@DX_COND_doc_TRUE@ $(DX_CLEAN_PS) \ +@DX_COND_doc_TRUE@ $(DX_CLEAN_PDF) \ +@DX_COND_doc_TRUE@ $(DX_CLEAN_LATEX) + + +# need this for Doxygen integration +AM_CPPFLAGS = -I${srcdir}/include -I${srcdir}/tests -I${srcdir}/generated +AM_CFLAGS = -Wall -Werror +AM_CXXFLAGS = -Wall $(USEIPV6) +LIB_LDFLAGS = -no-undefined -version-info 2 +pkginclude_HEADERS = include/zookeeper.h include/zookeeper_version.h include/zookeeper_log.h include/proto.h include/recordio.h generated/zookeeper.jute.h + +######################################################################### +# build and run unit tests +EXTRA_DIST = LICENSE $(wildcard ${srcdir}/tests/*.cc) $(wildcard \ + ${srcdir}/tests/*.h) ${srcdir}/tests/wrappers.opt \ + ${srcdir}/tests/wrappers-mt.opt +HASHTABLE_SRC = src/hashtable/hashtable_itr.h src/hashtable/hashtable_itr.c \ + src/hashtable/hashtable_private.h src/hashtable/hashtable.h src/hashtable/hashtable.c + +noinst_LTLIBRARIES = libhashtable.la libzkst.la $(am__append_1) +libhashtable_la_SOURCES = $(HASHTABLE_SRC) +COMMON_SRC = src/zookeeper.c include/zookeeper.h include/zookeeper_version.h include/zookeeper_log.h\ + src/recordio.c include/recordio.h include/proto.h \ + src/zk_adaptor.h generated/zookeeper.jute.c \ + src/zookeeper_log.h src/zk_log.c src/zk_hashtable.h src/zk_hashtable.c + + +# These are the symbols (classes, mostly) we want to export from our library. +EXPORT_SYMBOLS = '(zoo_|zookeeper_|zhandle|Z|format_log_message|log_message|logLevel|deallocate_|zerror|is_unrecoverable)' +libzkst_la_SOURCES = $(COMMON_SRC) src/st_adaptor.c +libzkst_la_LIBADD = -lm +lib_LTLIBRARIES = libzookeeper_st.la $(am__append_2) +libzookeeper_st_la_SOURCES = +libzookeeper_st_la_LIBADD = libzkst.la libhashtable.la +libzookeeper_st_la_DEPENDENCIES = libzkst.la libhashtable.la +libzookeeper_st_la_LDFLAGS = $(LIB_LDFLAGS) -export-symbols-regex $(EXPORT_SYMBOLS) +@WANT_SYNCAPI_TRUE@libzkmt_la_SOURCES = $(COMMON_SRC) src/mt_adaptor.c +@WANT_SYNCAPI_TRUE@libzkmt_la_CFLAGS = -DTHREADED +@WANT_SYNCAPI_TRUE@libzkmt_la_LIBADD = -lm +@WANT_SYNCAPI_TRUE@libzookeeper_mt_la_SOURCES = +@WANT_SYNCAPI_TRUE@libzookeeper_mt_la_LIBADD = libzkmt.la libhashtable.la -lpthread +@WANT_SYNCAPI_TRUE@libzookeeper_mt_la_DEPENDENCIES = libzkmt.la libhashtable.la +@WANT_SYNCAPI_TRUE@libzookeeper_mt_la_LDFLAGS = $(LIB_LDFLAGS) -export-symbols-regex $(EXPORT_SYMBOLS) +cli_st_SOURCES = src/cli.c +cli_st_LDADD = libzookeeper_st.la +@WANT_SYNCAPI_TRUE@cli_mt_SOURCES = src/cli.c +@WANT_SYNCAPI_TRUE@cli_mt_LDADD = libzookeeper_mt.la +@WANT_SYNCAPI_TRUE@cli_mt_CFLAGS = -DTHREADED +@WANT_SYNCAPI_TRUE@load_gen_SOURCES = src/load_gen.c +@WANT_SYNCAPI_TRUE@load_gen_LDADD = libzookeeper_mt.la +@WANT_SYNCAPI_TRUE@load_gen_CFLAGS = -DTHREADED +TEST_SOURCES = tests/TestDriver.cc tests/LibCMocks.cc tests/LibCSymTable.cc \ + tests/MocksBase.cc tests/ZKMocks.cc tests/Util.cc tests/ThreadingUtil.cc \ + tests/TestClientRetry.cc \ + tests/TestOperations.cc tests/TestZookeeperInit.cc \ + tests/TestZookeeperClose.cc tests/TestClient.cc \ + tests/TestMulti.cc tests/TestWatchers.cc + +SYMBOL_WRAPPERS = $(shell cat ${srcdir}/tests/wrappers.opt) +nodist_zktest_st_SOURCES = $(TEST_SOURCES) +zktest_st_LDADD = libzkst.la libhashtable.la $(CPPUNIT_LIBS) +zktest_st_CXXFLAGS = -DUSE_STATIC_LIB $(CPPUNIT_CFLAGS) $(USEIPV6) +zktest_st_LDFLAGS = -static-libtool-libs $(SYMBOL_WRAPPERS) +@WANT_SYNCAPI_TRUE@nodist_zktest_mt_SOURCES = $(TEST_SOURCES) tests/PthreadMocks.cc +@WANT_SYNCAPI_TRUE@zktest_mt_LDADD = libzkmt.la libhashtable.la -lpthread $(CPPUNIT_LIBS) +@WANT_SYNCAPI_TRUE@zktest_mt_CXXFLAGS = -DUSE_STATIC_LIB -DTHREADED $(CPPUNIT_CFLAGS) $(USEIPV6) +@WANT_SYNCAPI_TRUE@SYMBOL_WRAPPERS_MT = $(SYMBOL_WRAPPERS) $(shell cat ${srcdir}/tests/wrappers-mt.opt) +@WANT_SYNCAPI_TRUE@zktest_mt_LDFLAGS = -static-libtool-libs $(SYMBOL_WRAPPERS_MT) +all: config.h + $(MAKE) $(AM_MAKEFLAGS) all-am + +.SUFFIXES: +.SUFFIXES: .c .cc .lo .o .obj +am--refresh: Makefile + @: +$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(top_srcdir)/aminclude.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + echo ' cd $(srcdir) && $(AUTOMAKE) --foreign'; \ + $(am__cd) $(srcdir) && $(AUTOMAKE) --foreign \ + && exit 0; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --foreign Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + echo ' $(SHELL) ./config.status'; \ + $(SHELL) ./config.status;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe);; \ + esac; +$(top_srcdir)/aminclude.am: + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + $(SHELL) ./config.status --recheck + +$(top_srcdir)/configure: $(am__configure_deps) + $(am__cd) $(srcdir) && $(AUTOCONF) +$(ACLOCAL_M4): $(am__aclocal_m4_deps) + $(am__cd) $(srcdir) && $(ACLOCAL) $(ACLOCAL_AMFLAGS) +$(am__aclocal_m4_deps): + +config.h: stamp-h1 + @if test ! -f $@; then rm -f stamp-h1; else :; fi + @if test ! -f $@; then $(MAKE) $(AM_MAKEFLAGS) stamp-h1; else :; fi + +stamp-h1: $(srcdir)/config.h.in $(top_builddir)/config.status + @rm -f stamp-h1 + cd $(top_builddir) && $(SHELL) ./config.status config.h +$(srcdir)/config.h.in: $(am__configure_deps) + ($(am__cd) $(top_srcdir) && $(AUTOHEADER)) + rm -f stamp-h1 + touch $@ + +distclean-hdr: + -rm -f config.h stamp-h1 +install-libLTLIBRARIES: $(lib_LTLIBRARIES) + @$(NORMAL_INSTALL) + @list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \ + list2=; for p in $$list; do \ + if test -f $$p; then \ + list2="$$list2 $$p"; \ + else :; fi; \ + done; \ + test -z "$$list2" || { \ + echo " $(MKDIR_P) '$(DESTDIR)$(libdir)'"; \ + $(MKDIR_P) "$(DESTDIR)$(libdir)" || exit 1; \ + echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(libdir)'"; \ + $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(libdir)"; \ + } + +uninstall-libLTLIBRARIES: + @$(NORMAL_UNINSTALL) + @list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \ + for p in $$list; do \ + $(am__strip_dir) \ + echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(libdir)/$$f'"; \ + $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(libdir)/$$f"; \ + done + +clean-libLTLIBRARIES: + -test -z "$(lib_LTLIBRARIES)" || rm -f $(lib_LTLIBRARIES) + @list='$(lib_LTLIBRARIES)'; for p in $$list; do \ + dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ + test "$$dir" != "$$p" || dir=.; \ + echo "rm -f \"$${dir}/so_locations\""; \ + rm -f "$${dir}/so_locations"; \ + done + +clean-noinstLTLIBRARIES: + -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) + @list='$(noinst_LTLIBRARIES)'; for p in $$list; do \ + dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ + test "$$dir" != "$$p" || dir=.; \ + echo "rm -f \"$${dir}/so_locations\""; \ + rm -f "$${dir}/so_locations"; \ + done +libhashtable.la: $(libhashtable_la_OBJECTS) $(libhashtable_la_DEPENDENCIES) $(EXTRA_libhashtable_la_DEPENDENCIES) + $(LINK) $(libhashtable_la_OBJECTS) $(libhashtable_la_LIBADD) $(LIBS) +libzkmt.la: $(libzkmt_la_OBJECTS) $(libzkmt_la_DEPENDENCIES) $(EXTRA_libzkmt_la_DEPENDENCIES) + $(libzkmt_la_LINK) $(am_libzkmt_la_rpath) $(libzkmt_la_OBJECTS) $(libzkmt_la_LIBADD) $(LIBS) +libzkst.la: $(libzkst_la_OBJECTS) $(libzkst_la_DEPENDENCIES) $(EXTRA_libzkst_la_DEPENDENCIES) + $(LINK) $(libzkst_la_OBJECTS) $(libzkst_la_LIBADD) $(LIBS) +libzookeeper_mt.la: $(libzookeeper_mt_la_OBJECTS) $(libzookeeper_mt_la_DEPENDENCIES) $(EXTRA_libzookeeper_mt_la_DEPENDENCIES) + $(libzookeeper_mt_la_LINK) $(am_libzookeeper_mt_la_rpath) $(libzookeeper_mt_la_OBJECTS) $(libzookeeper_mt_la_LIBADD) $(LIBS) +libzookeeper_st.la: $(libzookeeper_st_la_OBJECTS) $(libzookeeper_st_la_DEPENDENCIES) $(EXTRA_libzookeeper_st_la_DEPENDENCIES) + $(libzookeeper_st_la_LINK) -rpath $(libdir) $(libzookeeper_st_la_OBJECTS) $(libzookeeper_st_la_LIBADD) $(LIBS) +install-binPROGRAMS: $(bin_PROGRAMS) + @$(NORMAL_INSTALL) + @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \ + if test -n "$$list"; then \ + echo " $(MKDIR_P) '$(DESTDIR)$(bindir)'"; \ + $(MKDIR_P) "$(DESTDIR)$(bindir)" || exit 1; \ + fi; \ + for p in $$list; do echo "$$p $$p"; done | \ + sed 's/$(EXEEXT)$$//' | \ + while read p p1; do if test -f $$p || test -f $$p1; \ + then echo "$$p"; echo "$$p"; else :; fi; \ + done | \ + sed -e 'p;s,.*/,,;n;h' -e 's|.*|.|' \ + -e 'p;x;s,.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/' | \ + sed 'N;N;N;s,\n, ,g' | \ + $(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1 } \ + { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \ + if ($$2 == $$4) files[d] = files[d] " " $$1; \ + else { print "f", $$3 "/" $$4, $$1; } } \ + END { for (d in files) print "f", d, files[d] }' | \ + while read type dir files; do \ + if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \ + test -z "$$files" || { \ + echo " $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files '$(DESTDIR)$(bindir)$$dir'"; \ + $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files "$(DESTDIR)$(bindir)$$dir" || exit $$?; \ + } \ + ; done + +uninstall-binPROGRAMS: + @$(NORMAL_UNINSTALL) + @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \ + files=`for p in $$list; do echo "$$p"; done | \ + sed -e 'h;s,^.*/,,;s/$(EXEEXT)$$//;$(transform)' \ + -e 's/$$/$(EXEEXT)/' `; \ + test -n "$$list" || exit 0; \ + echo " ( cd '$(DESTDIR)$(bindir)' && rm -f" $$files ")"; \ + cd "$(DESTDIR)$(bindir)" && rm -f $$files + +clean-binPROGRAMS: + @list='$(bin_PROGRAMS)'; test -n "$$list" || exit 0; \ + echo " rm -f" $$list; \ + rm -f $$list || exit $$?; \ + test -n "$(EXEEXT)" || exit 0; \ + list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ + echo " rm -f" $$list; \ + rm -f $$list + +clean-checkPROGRAMS: + @list='$(check_PROGRAMS)'; test -n "$$list" || exit 0; \ + echo " rm -f" $$list; \ + rm -f $$list || exit $$?; \ + test -n "$(EXEEXT)" || exit 0; \ + list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ + echo " rm -f" $$list; \ + rm -f $$list +cli_mt$(EXEEXT): $(cli_mt_OBJECTS) $(cli_mt_DEPENDENCIES) $(EXTRA_cli_mt_DEPENDENCIES) + @rm -f cli_mt$(EXEEXT) + $(cli_mt_LINK) $(cli_mt_OBJECTS) $(cli_mt_LDADD) $(LIBS) +cli_st$(EXEEXT): $(cli_st_OBJECTS) $(cli_st_DEPENDENCIES) $(EXTRA_cli_st_DEPENDENCIES) + @rm -f cli_st$(EXEEXT) + $(LINK) $(cli_st_OBJECTS) $(cli_st_LDADD) $(LIBS) +load_gen$(EXEEXT): $(load_gen_OBJECTS) $(load_gen_DEPENDENCIES) $(EXTRA_load_gen_DEPENDENCIES) + @rm -f load_gen$(EXEEXT) + $(load_gen_LINK) $(load_gen_OBJECTS) $(load_gen_LDADD) $(LIBS) +zktest-mt$(EXEEXT): $(zktest_mt_OBJECTS) $(zktest_mt_DEPENDENCIES) $(EXTRA_zktest_mt_DEPENDENCIES) + @rm -f zktest-mt$(EXEEXT) + $(zktest_mt_LINK) $(zktest_mt_OBJECTS) $(zktest_mt_LDADD) $(LIBS) +zktest-st$(EXEEXT): $(zktest_st_OBJECTS) $(zktest_st_DEPENDENCIES) $(EXTRA_zktest_st_DEPENDENCIES) + @rm -f zktest-st$(EXEEXT) + $(zktest_st_LINK) $(zktest_st_OBJECTS) $(zktest_st_LDADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cli.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cli_mt-cli.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hashtable.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hashtable_itr.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libzkmt_la-mt_adaptor.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libzkmt_la-recordio.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libzkmt_la-zk_hashtable.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libzkmt_la-zk_log.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libzkmt_la-zookeeper.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libzkmt_la-zookeeper.jute.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/load_gen-load_gen.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/recordio.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/st_adaptor.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/zk_hashtable.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/zk_log.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/zktest_mt-LibCMocks.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/zktest_mt-LibCSymTable.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/zktest_mt-MocksBase.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/zktest_mt-PthreadMocks.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/zktest_mt-TestClient.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/zktest_mt-TestClientRetry.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/zktest_mt-TestDriver.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/zktest_mt-TestMulti.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/zktest_mt-TestOperations.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/zktest_mt-TestWatchers.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/zktest_mt-TestZookeeperClose.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/zktest_mt-TestZookeeperInit.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/zktest_mt-ThreadingUtil.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/zktest_mt-Util.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/zktest_mt-ZKMocks.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/zktest_st-LibCMocks.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/zktest_st-LibCSymTable.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/zktest_st-MocksBase.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/zktest_st-TestClient.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/zktest_st-TestClientRetry.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/zktest_st-TestDriver.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/zktest_st-TestMulti.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/zktest_st-TestOperations.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/zktest_st-TestWatchers.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/zktest_st-TestZookeeperClose.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/zktest_st-TestZookeeperInit.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/zktest_st-ThreadingUtil.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/zktest_st-Util.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/zktest_st-ZKMocks.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/zookeeper.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/zookeeper.jute.Plo@am__quote@ + +.c.o: +@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(COMPILE) -c $< + +.c.obj: +@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'` + +.c.lo: +@am__fastdepCC_TRUE@ $(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $< + +hashtable_itr.lo: src/hashtable/hashtable_itr.c +@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT hashtable_itr.lo -MD -MP -MF $(DEPDIR)/hashtable_itr.Tpo -c -o hashtable_itr.lo `test -f 'src/hashtable/hashtable_itr.c' || echo '$(srcdir)/'`src/hashtable/hashtable_itr.c +@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/hashtable_itr.Tpo $(DEPDIR)/hashtable_itr.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='src/hashtable/hashtable_itr.c' object='hashtable_itr.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o hashtable_itr.lo `test -f 'src/hashtable/hashtable_itr.c' || echo '$(srcdir)/'`src/hashtable/hashtable_itr.c + +hashtable.lo: src/hashtable/hashtable.c +@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT hashtable.lo -MD -MP -MF $(DEPDIR)/hashtable.Tpo -c -o hashtable.lo `test -f 'src/hashtable/hashtable.c' || echo '$(srcdir)/'`src/hashtable/hashtable.c +@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/hashtable.Tpo $(DEPDIR)/hashtable.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='src/hashtable/hashtable.c' object='hashtable.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o hashtable.lo `test -f 'src/hashtable/hashtable.c' || echo '$(srcdir)/'`src/hashtable/hashtable.c + +libzkmt_la-zookeeper.lo: src/zookeeper.c +@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libzkmt_la_CFLAGS) $(CFLAGS) -MT libzkmt_la-zookeeper.lo -MD -MP -MF $(DEPDIR)/libzkmt_la-zookeeper.Tpo -c -o libzkmt_la-zookeeper.lo `test -f 'src/zookeeper.c' || echo '$(srcdir)/'`src/zookeeper.c +@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libzkmt_la-zookeeper.Tpo $(DEPDIR)/libzkmt_la-zookeeper.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='src/zookeeper.c' object='libzkmt_la-zookeeper.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libzkmt_la_CFLAGS) $(CFLAGS) -c -o libzkmt_la-zookeeper.lo `test -f 'src/zookeeper.c' || echo '$(srcdir)/'`src/zookeeper.c + +libzkmt_la-recordio.lo: src/recordio.c +@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libzkmt_la_CFLAGS) $(CFLAGS) -MT libzkmt_la-recordio.lo -MD -MP -MF $(DEPDIR)/libzkmt_la-recordio.Tpo -c -o libzkmt_la-recordio.lo `test -f 'src/recordio.c' || echo '$(srcdir)/'`src/recordio.c +@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libzkmt_la-recordio.Tpo $(DEPDIR)/libzkmt_la-recordio.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='src/recordio.c' object='libzkmt_la-recordio.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libzkmt_la_CFLAGS) $(CFLAGS) -c -o libzkmt_la-recordio.lo `test -f 'src/recordio.c' || echo '$(srcdir)/'`src/recordio.c + +libzkmt_la-zookeeper.jute.lo: generated/zookeeper.jute.c +@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libzkmt_la_CFLAGS) $(CFLAGS) -MT libzkmt_la-zookeeper.jute.lo -MD -MP -MF $(DEPDIR)/libzkmt_la-zookeeper.jute.Tpo -c -o libzkmt_la-zookeeper.jute.lo `test -f 'generated/zookeeper.jute.c' || echo '$(srcdir)/'`generated/zookeeper.jute.c +@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libzkmt_la-zookeeper.jute.Tpo $(DEPDIR)/libzkmt_la-zookeeper.jute.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='generated/zookeeper.jute.c' object='libzkmt_la-zookeeper.jute.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libzkmt_la_CFLAGS) $(CFLAGS) -c -o libzkmt_la-zookeeper.jute.lo `test -f 'generated/zookeeper.jute.c' || echo '$(srcdir)/'`generated/zookeeper.jute.c + +libzkmt_la-zk_log.lo: src/zk_log.c +@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libzkmt_la_CFLAGS) $(CFLAGS) -MT libzkmt_la-zk_log.lo -MD -MP -MF $(DEPDIR)/libzkmt_la-zk_log.Tpo -c -o libzkmt_la-zk_log.lo `test -f 'src/zk_log.c' || echo '$(srcdir)/'`src/zk_log.c +@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libzkmt_la-zk_log.Tpo $(DEPDIR)/libzkmt_la-zk_log.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='src/zk_log.c' object='libzkmt_la-zk_log.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libzkmt_la_CFLAGS) $(CFLAGS) -c -o libzkmt_la-zk_log.lo `test -f 'src/zk_log.c' || echo '$(srcdir)/'`src/zk_log.c + +libzkmt_la-zk_hashtable.lo: src/zk_hashtable.c +@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libzkmt_la_CFLAGS) $(CFLAGS) -MT libzkmt_la-zk_hashtable.lo -MD -MP -MF $(DEPDIR)/libzkmt_la-zk_hashtable.Tpo -c -o libzkmt_la-zk_hashtable.lo `test -f 'src/zk_hashtable.c' || echo '$(srcdir)/'`src/zk_hashtable.c +@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libzkmt_la-zk_hashtable.Tpo $(DEPDIR)/libzkmt_la-zk_hashtable.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='src/zk_hashtable.c' object='libzkmt_la-zk_hashtable.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libzkmt_la_CFLAGS) $(CFLAGS) -c -o libzkmt_la-zk_hashtable.lo `test -f 'src/zk_hashtable.c' || echo '$(srcdir)/'`src/zk_hashtable.c + +libzkmt_la-mt_adaptor.lo: src/mt_adaptor.c +@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libzkmt_la_CFLAGS) $(CFLAGS) -MT libzkmt_la-mt_adaptor.lo -MD -MP -MF $(DEPDIR)/libzkmt_la-mt_adaptor.Tpo -c -o libzkmt_la-mt_adaptor.lo `test -f 'src/mt_adaptor.c' || echo '$(srcdir)/'`src/mt_adaptor.c +@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libzkmt_la-mt_adaptor.Tpo $(DEPDIR)/libzkmt_la-mt_adaptor.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='src/mt_adaptor.c' object='libzkmt_la-mt_adaptor.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libzkmt_la_CFLAGS) $(CFLAGS) -c -o libzkmt_la-mt_adaptor.lo `test -f 'src/mt_adaptor.c' || echo '$(srcdir)/'`src/mt_adaptor.c + +zookeeper.lo: src/zookeeper.c +@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT zookeeper.lo -MD -MP -MF $(DEPDIR)/zookeeper.Tpo -c -o zookeeper.lo `test -f 'src/zookeeper.c' || echo '$(srcdir)/'`src/zookeeper.c +@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/zookeeper.Tpo $(DEPDIR)/zookeeper.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='src/zookeeper.c' object='zookeeper.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o zookeeper.lo `test -f 'src/zookeeper.c' || echo '$(srcdir)/'`src/zookeeper.c + +recordio.lo: src/recordio.c +@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT recordio.lo -MD -MP -MF $(DEPDIR)/recordio.Tpo -c -o recordio.lo `test -f 'src/recordio.c' || echo '$(srcdir)/'`src/recordio.c +@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/recordio.Tpo $(DEPDIR)/recordio.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='src/recordio.c' object='recordio.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o recordio.lo `test -f 'src/recordio.c' || echo '$(srcdir)/'`src/recordio.c + +zookeeper.jute.lo: generated/zookeeper.jute.c +@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT zookeeper.jute.lo -MD -MP -MF $(DEPDIR)/zookeeper.jute.Tpo -c -o zookeeper.jute.lo `test -f 'generated/zookeeper.jute.c' || echo '$(srcdir)/'`generated/zookeeper.jute.c +@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/zookeeper.jute.Tpo $(DEPDIR)/zookeeper.jute.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='generated/zookeeper.jute.c' object='zookeeper.jute.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o zookeeper.jute.lo `test -f 'generated/zookeeper.jute.c' || echo '$(srcdir)/'`generated/zookeeper.jute.c + +zk_log.lo: src/zk_log.c +@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT zk_log.lo -MD -MP -MF $(DEPDIR)/zk_log.Tpo -c -o zk_log.lo `test -f 'src/zk_log.c' || echo '$(srcdir)/'`src/zk_log.c +@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/zk_log.Tpo $(DEPDIR)/zk_log.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='src/zk_log.c' object='zk_log.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o zk_log.lo `test -f 'src/zk_log.c' || echo '$(srcdir)/'`src/zk_log.c + +zk_hashtable.lo: src/zk_hashtable.c +@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT zk_hashtable.lo -MD -MP -MF $(DEPDIR)/zk_hashtable.Tpo -c -o zk_hashtable.lo `test -f 'src/zk_hashtable.c' || echo '$(srcdir)/'`src/zk_hashtable.c +@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/zk_hashtable.Tpo $(DEPDIR)/zk_hashtable.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='src/zk_hashtable.c' object='zk_hashtable.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o zk_hashtable.lo `test -f 'src/zk_hashtable.c' || echo '$(srcdir)/'`src/zk_hashtable.c + +st_adaptor.lo: src/st_adaptor.c +@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT st_adaptor.lo -MD -MP -MF $(DEPDIR)/st_adaptor.Tpo -c -o st_adaptor.lo `test -f 'src/st_adaptor.c' || echo '$(srcdir)/'`src/st_adaptor.c +@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/st_adaptor.Tpo $(DEPDIR)/st_adaptor.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='src/st_adaptor.c' object='st_adaptor.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o st_adaptor.lo `test -f 'src/st_adaptor.c' || echo '$(srcdir)/'`src/st_adaptor.c + +cli_mt-cli.o: src/cli.c +@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cli_mt_CFLAGS) $(CFLAGS) -MT cli_mt-cli.o -MD -MP -MF $(DEPDIR)/cli_mt-cli.Tpo -c -o cli_mt-cli.o `test -f 'src/cli.c' || echo '$(srcdir)/'`src/cli.c +@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/cli_mt-cli.Tpo $(DEPDIR)/cli_mt-cli.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='src/cli.c' object='cli_mt-cli.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cli_mt_CFLAGS) $(CFLAGS) -c -o cli_mt-cli.o `test -f 'src/cli.c' || echo '$(srcdir)/'`src/cli.c + +cli_mt-cli.obj: src/cli.c +@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cli_mt_CFLAGS) $(CFLAGS) -MT cli_mt-cli.obj -MD -MP -MF $(DEPDIR)/cli_mt-cli.Tpo -c -o cli_mt-cli.obj `if test -f 'src/cli.c'; then $(CYGPATH_W) 'src/cli.c'; else $(CYGPATH_W) '$(srcdir)/src/cli.c'; fi` +@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/cli_mt-cli.Tpo $(DEPDIR)/cli_mt-cli.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='src/cli.c' object='cli_mt-cli.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cli_mt_CFLAGS) $(CFLAGS) -c -o cli_mt-cli.obj `if test -f 'src/cli.c'; then $(CYGPATH_W) 'src/cli.c'; else $(CYGPATH_W) '$(srcdir)/src/cli.c'; fi` + +cli.o: src/cli.c +@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT cli.o -MD -MP -MF $(DEPDIR)/cli.Tpo -c -o cli.o `test -f 'src/cli.c' || echo '$(srcdir)/'`src/cli.c +@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/cli.Tpo $(DEPDIR)/cli.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='src/cli.c' object='cli.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o cli.o `test -f 'src/cli.c' || echo '$(srcdir)/'`src/cli.c + +cli.obj: src/cli.c +@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT cli.obj -MD -MP -MF $(DEPDIR)/cli.Tpo -c -o cli.obj `if test -f 'src/cli.c'; then $(CYGPATH_W) 'src/cli.c'; else $(CYGPATH_W) '$(srcdir)/src/cli.c'; fi` +@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/cli.Tpo $(DEPDIR)/cli.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='src/cli.c' object='cli.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o cli.obj `if test -f 'src/cli.c'; then $(CYGPATH_W) 'src/cli.c'; else $(CYGPATH_W) '$(srcdir)/src/cli.c'; fi` + +load_gen-load_gen.o: src/load_gen.c +@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(load_gen_CFLAGS) $(CFLAGS) -MT load_gen-load_gen.o -MD -MP -MF $(DEPDIR)/load_gen-load_gen.Tpo -c -o load_gen-load_gen.o `test -f 'src/load_gen.c' || echo '$(srcdir)/'`src/load_gen.c +@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/load_gen-load_gen.Tpo $(DEPDIR)/load_gen-load_gen.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='src/load_gen.c' object='load_gen-load_gen.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(load_gen_CFLAGS) $(CFLAGS) -c -o load_gen-load_gen.o `test -f 'src/load_gen.c' || echo '$(srcdir)/'`src/load_gen.c + +load_gen-load_gen.obj: src/load_gen.c +@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(load_gen_CFLAGS) $(CFLAGS) -MT load_gen-load_gen.obj -MD -MP -MF $(DEPDIR)/load_gen-load_gen.Tpo -c -o load_gen-load_gen.obj `if test -f 'src/load_gen.c'; then $(CYGPATH_W) 'src/load_gen.c'; else $(CYGPATH_W) '$(srcdir)/src/load_gen.c'; fi` +@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/load_gen-load_gen.Tpo $(DEPDIR)/load_gen-load_gen.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='src/load_gen.c' object='load_gen-load_gen.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(load_gen_CFLAGS) $(CFLAGS) -c -o load_gen-load_gen.obj `if test -f 'src/load_gen.c'; then $(CYGPATH_W) 'src/load_gen.c'; else $(CYGPATH_W) '$(srcdir)/src/load_gen.c'; fi` + +.cc.o: +@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ $< + +.cc.obj: +@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` + +.cc.lo: +@am__fastdepCXX_TRUE@ $(LTCXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LTCXXCOMPILE) -c -o $@ $< + +zktest_mt-TestDriver.o: tests/TestDriver.cc +@am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(zktest_mt_CXXFLAGS) $(CXXFLAGS) -MT zktest_mt-TestDriver.o -MD -MP -MF $(DEPDIR)/zktest_mt-TestDriver.Tpo -c -o zktest_mt-TestDriver.o `test -f 'tests/TestDriver.cc' || echo '$(srcdir)/'`tests/TestDriver.cc +@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/zktest_mt-TestDriver.Tpo $(DEPDIR)/zktest_mt-TestDriver.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='tests/TestDriver.cc' object='zktest_mt-TestDriver.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(zktest_mt_CXXFLAGS) $(CXXFLAGS) -c -o zktest_mt-TestDriver.o `test -f 'tests/TestDriver.cc' || echo '$(srcdir)/'`tests/TestDriver.cc + +zktest_mt-TestDriver.obj: tests/TestDriver.cc +@am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(zktest_mt_CXXFLAGS) $(CXXFLAGS) -MT zktest_mt-TestDriver.obj -MD -MP -MF $(DEPDIR)/zktest_mt-TestDriver.Tpo -c -o zktest_mt-TestDriver.obj `if test -f 'tests/TestDriver.cc'; then $(CYGPATH_W) 'tests/TestDriver.cc'; else $(CYGPATH_W) '$(srcdir)/tests/TestDriver.cc'; fi` +@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/zktest_mt-TestDriver.Tpo $(DEPDIR)/zktest_mt-TestDriver.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='tests/TestDriver.cc' object='zktest_mt-TestDriver.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(zktest_mt_CXXFLAGS) $(CXXFLAGS) -c -o zktest_mt-TestDriver.obj `if test -f 'tests/TestDriver.cc'; then $(CYGPATH_W) 'tests/TestDriver.cc'; else $(CYGPATH_W) '$(srcdir)/tests/TestDriver.cc'; fi` + +zktest_mt-LibCMocks.o: tests/LibCMocks.cc +@am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(zktest_mt_CXXFLAGS) $(CXXFLAGS) -MT zktest_mt-LibCMocks.o -MD -MP -MF $(DEPDIR)/zktest_mt-LibCMocks.Tpo -c -o zktest_mt-LibCMocks.o `test -f 'tests/LibCMocks.cc' || echo '$(srcdir)/'`tests/LibCMocks.cc +@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/zktest_mt-LibCMocks.Tpo $(DEPDIR)/zktest_mt-LibCMocks.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='tests/LibCMocks.cc' object='zktest_mt-LibCMocks.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(zktest_mt_CXXFLAGS) $(CXXFLAGS) -c -o zktest_mt-LibCMocks.o `test -f 'tests/LibCMocks.cc' || echo '$(srcdir)/'`tests/LibCMocks.cc + +zktest_mt-LibCMocks.obj: tests/LibCMocks.cc +@am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(zktest_mt_CXXFLAGS) $(CXXFLAGS) -MT zktest_mt-LibCMocks.obj -MD -MP -MF $(DEPDIR)/zktest_mt-LibCMocks.Tpo -c -o zktest_mt-LibCMocks.obj `if test -f 'tests/LibCMocks.cc'; then $(CYGPATH_W) 'tests/LibCMocks.cc'; else $(CYGPATH_W) '$(srcdir)/tests/LibCMocks.cc'; fi` +@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/zktest_mt-LibCMocks.Tpo $(DEPDIR)/zktest_mt-LibCMocks.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='tests/LibCMocks.cc' object='zktest_mt-LibCMocks.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(zktest_mt_CXXFLAGS) $(CXXFLAGS) -c -o zktest_mt-LibCMocks.obj `if test -f 'tests/LibCMocks.cc'; then $(CYGPATH_W) 'tests/LibCMocks.cc'; else $(CYGPATH_W) '$(srcdir)/tests/LibCMocks.cc'; fi` + +zktest_mt-LibCSymTable.o: tests/LibCSymTable.cc +@am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(zktest_mt_CXXFLAGS) $(CXXFLAGS) -MT zktest_mt-LibCSymTable.o -MD -MP -MF $(DEPDIR)/zktest_mt-LibCSymTable.Tpo -c -o zktest_mt-LibCSymTable.o `test -f 'tests/LibCSymTable.cc' || echo '$(srcdir)/'`tests/LibCSymTable.cc +@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/zktest_mt-LibCSymTable.Tpo $(DEPDIR)/zktest_mt-LibCSymTable.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='tests/LibCSymTable.cc' object='zktest_mt-LibCSymTable.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(zktest_mt_CXXFLAGS) $(CXXFLAGS) -c -o zktest_mt-LibCSymTable.o `test -f 'tests/LibCSymTable.cc' || echo '$(srcdir)/'`tests/LibCSymTable.cc + +zktest_mt-LibCSymTable.obj: tests/LibCSymTable.cc +@am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(zktest_mt_CXXFLAGS) $(CXXFLAGS) -MT zktest_mt-LibCSymTable.obj -MD -MP -MF $(DEPDIR)/zktest_mt-LibCSymTable.Tpo -c -o zktest_mt-LibCSymTable.obj `if test -f 'tests/LibCSymTable.cc'; then $(CYGPATH_W) 'tests/LibCSymTable.cc'; else $(CYGPATH_W) '$(srcdir)/tests/LibCSymTable.cc'; fi` +@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/zktest_mt-LibCSymTable.Tpo $(DEPDIR)/zktest_mt-LibCSymTable.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='tests/LibCSymTable.cc' object='zktest_mt-LibCSymTable.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(zktest_mt_CXXFLAGS) $(CXXFLAGS) -c -o zktest_mt-LibCSymTable.obj `if test -f 'tests/LibCSymTable.cc'; then $(CYGPATH_W) 'tests/LibCSymTable.cc'; else $(CYGPATH_W) '$(srcdir)/tests/LibCSymTable.cc'; fi` + +zktest_mt-MocksBase.o: tests/MocksBase.cc +@am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(zktest_mt_CXXFLAGS) $(CXXFLAGS) -MT zktest_mt-MocksBase.o -MD -MP -MF $(DEPDIR)/zktest_mt-MocksBase.Tpo -c -o zktest_mt-MocksBase.o `test -f 'tests/MocksBase.cc' || echo '$(srcdir)/'`tests/MocksBase.cc +@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/zktest_mt-MocksBase.Tpo $(DEPDIR)/zktest_mt-MocksBase.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='tests/MocksBase.cc' object='zktest_mt-MocksBase.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(zktest_mt_CXXFLAGS) $(CXXFLAGS) -c -o zktest_mt-MocksBase.o `test -f 'tests/MocksBase.cc' || echo '$(srcdir)/'`tests/MocksBase.cc + +zktest_mt-MocksBase.obj: tests/MocksBase.cc +@am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(zktest_mt_CXXFLAGS) $(CXXFLAGS) -MT zktest_mt-MocksBase.obj -MD -MP -MF $(DEPDIR)/zktest_mt-MocksBase.Tpo -c -o zktest_mt-MocksBase.obj `if test -f 'tests/MocksBase.cc'; then $(CYGPATH_W) 'tests/MocksBase.cc'; else $(CYGPATH_W) '$(srcdir)/tests/MocksBase.cc'; fi` +@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/zktest_mt-MocksBase.Tpo $(DEPDIR)/zktest_mt-MocksBase.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='tests/MocksBase.cc' object='zktest_mt-MocksBase.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(zktest_mt_CXXFLAGS) $(CXXFLAGS) -c -o zktest_mt-MocksBase.obj `if test -f 'tests/MocksBase.cc'; then $(CYGPATH_W) 'tests/MocksBase.cc'; else $(CYGPATH_W) '$(srcdir)/tests/MocksBase.cc'; fi` + +zktest_mt-ZKMocks.o: tests/ZKMocks.cc +@am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(zktest_mt_CXXFLAGS) $(CXXFLAGS) -MT zktest_mt-ZKMocks.o -MD -MP -MF $(DEPDIR)/zktest_mt-ZKMocks.Tpo -c -o zktest_mt-ZKMocks.o `test -f 'tests/ZKMocks.cc' || echo '$(srcdir)/'`tests/ZKMocks.cc +@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/zktest_mt-ZKMocks.Tpo $(DEPDIR)/zktest_mt-ZKMocks.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='tests/ZKMocks.cc' object='zktest_mt-ZKMocks.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(zktest_mt_CXXFLAGS) $(CXXFLAGS) -c -o zktest_mt-ZKMocks.o `test -f 'tests/ZKMocks.cc' || echo '$(srcdir)/'`tests/ZKMocks.cc + +zktest_mt-ZKMocks.obj: tests/ZKMocks.cc +@am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(zktest_mt_CXXFLAGS) $(CXXFLAGS) -MT zktest_mt-ZKMocks.obj -MD -MP -MF $(DEPDIR)/zktest_mt-ZKMocks.Tpo -c -o zktest_mt-ZKMocks.obj `if test -f 'tests/ZKMocks.cc'; then $(CYGPATH_W) 'tests/ZKMocks.cc'; else $(CYGPATH_W) '$(srcdir)/tests/ZKMocks.cc'; fi` +@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/zktest_mt-ZKMocks.Tpo $(DEPDIR)/zktest_mt-ZKMocks.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='tests/ZKMocks.cc' object='zktest_mt-ZKMocks.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(zktest_mt_CXXFLAGS) $(CXXFLAGS) -c -o zktest_mt-ZKMocks.obj `if test -f 'tests/ZKMocks.cc'; then $(CYGPATH_W) 'tests/ZKMocks.cc'; else $(CYGPATH_W) '$(srcdir)/tests/ZKMocks.cc'; fi` + +zktest_mt-Util.o: tests/Util.cc +@am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(zktest_mt_CXXFLAGS) $(CXXFLAGS) -MT zktest_mt-Util.o -MD -MP -MF $(DEPDIR)/zktest_mt-Util.Tpo -c -o zktest_mt-Util.o `test -f 'tests/Util.cc' || echo '$(srcdir)/'`tests/Util.cc +@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/zktest_mt-Util.Tpo $(DEPDIR)/zktest_mt-Util.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='tests/Util.cc' object='zktest_mt-Util.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(zktest_mt_CXXFLAGS) $(CXXFLAGS) -c -o zktest_mt-Util.o `test -f 'tests/Util.cc' || echo '$(srcdir)/'`tests/Util.cc + +zktest_mt-Util.obj: tests/Util.cc +@am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(zktest_mt_CXXFLAGS) $(CXXFLAGS) -MT zktest_mt-Util.obj -MD -MP -MF $(DEPDIR)/zktest_mt-Util.Tpo -c -o zktest_mt-Util.obj `if test -f 'tests/Util.cc'; then $(CYGPATH_W) 'tests/Util.cc'; else $(CYGPATH_W) '$(srcdir)/tests/Util.cc'; fi` +@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/zktest_mt-Util.Tpo $(DEPDIR)/zktest_mt-Util.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='tests/Util.cc' object='zktest_mt-Util.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(zktest_mt_CXXFLAGS) $(CXXFLAGS) -c -o zktest_mt-Util.obj `if test -f 'tests/Util.cc'; then $(CYGPATH_W) 'tests/Util.cc'; else $(CYGPATH_W) '$(srcdir)/tests/Util.cc'; fi` + +zktest_mt-ThreadingUtil.o: tests/ThreadingUtil.cc +@am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(zktest_mt_CXXFLAGS) $(CXXFLAGS) -MT zktest_mt-ThreadingUtil.o -MD -MP -MF $(DEPDIR)/zktest_mt-ThreadingUtil.Tpo -c -o zktest_mt-ThreadingUtil.o `test -f 'tests/ThreadingUtil.cc' || echo '$(srcdir)/'`tests/ThreadingUtil.cc +@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/zktest_mt-ThreadingUtil.Tpo $(DEPDIR)/zktest_mt-ThreadingUtil.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='tests/ThreadingUtil.cc' object='zktest_mt-ThreadingUtil.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(zktest_mt_CXXFLAGS) $(CXXFLAGS) -c -o zktest_mt-ThreadingUtil.o `test -f 'tests/ThreadingUtil.cc' || echo '$(srcdir)/'`tests/ThreadingUtil.cc + +zktest_mt-ThreadingUtil.obj: tests/ThreadingUtil.cc +@am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(zktest_mt_CXXFLAGS) $(CXXFLAGS) -MT zktest_mt-ThreadingUtil.obj -MD -MP -MF $(DEPDIR)/zktest_mt-ThreadingUtil.Tpo -c -o zktest_mt-ThreadingUtil.obj `if test -f 'tests/ThreadingUtil.cc'; then $(CYGPATH_W) 'tests/ThreadingUtil.cc'; else $(CYGPATH_W) '$(srcdir)/tests/ThreadingUtil.cc'; fi` +@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/zktest_mt-ThreadingUtil.Tpo $(DEPDIR)/zktest_mt-ThreadingUtil.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='tests/ThreadingUtil.cc' object='zktest_mt-ThreadingUtil.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(zktest_mt_CXXFLAGS) $(CXXFLAGS) -c -o zktest_mt-ThreadingUtil.obj `if test -f 'tests/ThreadingUtil.cc'; then $(CYGPATH_W) 'tests/ThreadingUtil.cc'; else $(CYGPATH_W) '$(srcdir)/tests/ThreadingUtil.cc'; fi` + +zktest_mt-TestClientRetry.o: tests/TestClientRetry.cc +@am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(zktest_mt_CXXFLAGS) $(CXXFLAGS) -MT zktest_mt-TestClientRetry.o -MD -MP -MF $(DEPDIR)/zktest_mt-TestClientRetry.Tpo -c -o zktest_mt-TestClientRetry.o `test -f 'tests/TestClientRetry.cc' || echo '$(srcdir)/'`tests/TestClientRetry.cc +@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/zktest_mt-TestClientRetry.Tpo $(DEPDIR)/zktest_mt-TestClientRetry.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='tests/TestClientRetry.cc' object='zktest_mt-TestClientRetry.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(zktest_mt_CXXFLAGS) $(CXXFLAGS) -c -o zktest_mt-TestClientRetry.o `test -f 'tests/TestClientRetry.cc' || echo '$(srcdir)/'`tests/TestClientRetry.cc + +zktest_mt-TestClientRetry.obj: tests/TestClientRetry.cc +@am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(zktest_mt_CXXFLAGS) $(CXXFLAGS) -MT zktest_mt-TestClientRetry.obj -MD -MP -MF $(DEPDIR)/zktest_mt-TestClientRetry.Tpo -c -o zktest_mt-TestClientRetry.obj `if test -f 'tests/TestClientRetry.cc'; then $(CYGPATH_W) 'tests/TestClientRetry.cc'; else $(CYGPATH_W) '$(srcdir)/tests/TestClientRetry.cc'; fi` +@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/zktest_mt-TestClientRetry.Tpo $(DEPDIR)/zktest_mt-TestClientRetry.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='tests/TestClientRetry.cc' object='zktest_mt-TestClientRetry.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(zktest_mt_CXXFLAGS) $(CXXFLAGS) -c -o zktest_mt-TestClientRetry.obj `if test -f 'tests/TestClientRetry.cc'; then $(CYGPATH_W) 'tests/TestClientRetry.cc'; else $(CYGPATH_W) '$(srcdir)/tests/TestClientRetry.cc'; fi` + +zktest_mt-TestOperations.o: tests/TestOperations.cc +@am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(zktest_mt_CXXFLAGS) $(CXXFLAGS) -MT zktest_mt-TestOperations.o -MD -MP -MF $(DEPDIR)/zktest_mt-TestOperations.Tpo -c -o zktest_mt-TestOperations.o `test -f 'tests/TestOperations.cc' || echo '$(srcdir)/'`tests/TestOperations.cc +@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/zktest_mt-TestOperations.Tpo $(DEPDIR)/zktest_mt-TestOperations.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='tests/TestOperations.cc' object='zktest_mt-TestOperations.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(zktest_mt_CXXFLAGS) $(CXXFLAGS) -c -o zktest_mt-TestOperations.o `test -f 'tests/TestOperations.cc' || echo '$(srcdir)/'`tests/TestOperations.cc + +zktest_mt-TestOperations.obj: tests/TestOperations.cc +@am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(zktest_mt_CXXFLAGS) $(CXXFLAGS) -MT zktest_mt-TestOperations.obj -MD -MP -MF $(DEPDIR)/zktest_mt-TestOperations.Tpo -c -o zktest_mt-TestOperations.obj `if test -f 'tests/TestOperations.cc'; then $(CYGPATH_W) 'tests/TestOperations.cc'; else $(CYGPATH_W) '$(srcdir)/tests/TestOperations.cc'; fi` +@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/zktest_mt-TestOperations.Tpo $(DEPDIR)/zktest_mt-TestOperations.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='tests/TestOperations.cc' object='zktest_mt-TestOperations.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(zktest_mt_CXXFLAGS) $(CXXFLAGS) -c -o zktest_mt-TestOperations.obj `if test -f 'tests/TestOperations.cc'; then $(CYGPATH_W) 'tests/TestOperations.cc'; else $(CYGPATH_W) '$(srcdir)/tests/TestOperations.cc'; fi` + +zktest_mt-TestZookeeperInit.o: tests/TestZookeeperInit.cc +@am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(zktest_mt_CXXFLAGS) $(CXXFLAGS) -MT zktest_mt-TestZookeeperInit.o -MD -MP -MF $(DEPDIR)/zktest_mt-TestZookeeperInit.Tpo -c -o zktest_mt-TestZookeeperInit.o `test -f 'tests/TestZookeeperInit.cc' || echo '$(srcdir)/'`tests/TestZookeeperInit.cc +@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/zktest_mt-TestZookeeperInit.Tpo $(DEPDIR)/zktest_mt-TestZookeeperInit.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='tests/TestZookeeperInit.cc' object='zktest_mt-TestZookeeperInit.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(zktest_mt_CXXFLAGS) $(CXXFLAGS) -c -o zktest_mt-TestZookeeperInit.o `test -f 'tests/TestZookeeperInit.cc' || echo '$(srcdir)/'`tests/TestZookeeperInit.cc + +zktest_mt-TestZookeeperInit.obj: tests/TestZookeeperInit.cc +@am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(zktest_mt_CXXFLAGS) $(CXXFLAGS) -MT zktest_mt-TestZookeeperInit.obj -MD -MP -MF $(DEPDIR)/zktest_mt-TestZookeeperInit.Tpo -c -o zktest_mt-TestZookeeperInit.obj `if test -f 'tests/TestZookeeperInit.cc'; then $(CYGPATH_W) 'tests/TestZookeeperInit.cc'; else $(CYGPATH_W) '$(srcdir)/tests/TestZookeeperInit.cc'; fi` +@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/zktest_mt-TestZookeeperInit.Tpo $(DEPDIR)/zktest_mt-TestZookeeperInit.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='tests/TestZookeeperInit.cc' object='zktest_mt-TestZookeeperInit.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(zktest_mt_CXXFLAGS) $(CXXFLAGS) -c -o zktest_mt-TestZookeeperInit.obj `if test -f 'tests/TestZookeeperInit.cc'; then $(CYGPATH_W) 'tests/TestZookeeperInit.cc'; else $(CYGPATH_W) '$(srcdir)/tests/TestZookeeperInit.cc'; fi` + +zktest_mt-TestZookeeperClose.o: tests/TestZookeeperClose.cc +@am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(zktest_mt_CXXFLAGS) $(CXXFLAGS) -MT zktest_mt-TestZookeeperClose.o -MD -MP -MF $(DEPDIR)/zktest_mt-TestZookeeperClose.Tpo -c -o zktest_mt-TestZookeeperClose.o `test -f 'tests/TestZookeeperClose.cc' || echo '$(srcdir)/'`tests/TestZookeeperClose.cc +@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/zktest_mt-TestZookeeperClose.Tpo $(DEPDIR)/zktest_mt-TestZookeeperClose.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='tests/TestZookeeperClose.cc' object='zktest_mt-TestZookeeperClose.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(zktest_mt_CXXFLAGS) $(CXXFLAGS) -c -o zktest_mt-TestZookeeperClose.o `test -f 'tests/TestZookeeperClose.cc' || echo '$(srcdir)/'`tests/TestZookeeperClose.cc + +zktest_mt-TestZookeeperClose.obj: tests/TestZookeeperClose.cc +@am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(zktest_mt_CXXFLAGS) $(CXXFLAGS) -MT zktest_mt-TestZookeeperClose.obj -MD -MP -MF $(DEPDIR)/zktest_mt-TestZookeeperClose.Tpo -c -o zktest_mt-TestZookeeperClose.obj `if test -f 'tests/TestZookeeperClose.cc'; then $(CYGPATH_W) 'tests/TestZookeeperClose.cc'; else $(CYGPATH_W) '$(srcdir)/tests/TestZookeeperClose.cc'; fi` +@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/zktest_mt-TestZookeeperClose.Tpo $(DEPDIR)/zktest_mt-TestZookeeperClose.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='tests/TestZookeeperClose.cc' object='zktest_mt-TestZookeeperClose.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(zktest_mt_CXXFLAGS) $(CXXFLAGS) -c -o zktest_mt-TestZookeeperClose.obj `if test -f 'tests/TestZookeeperClose.cc'; then $(CYGPATH_W) 'tests/TestZookeeperClose.cc'; else $(CYGPATH_W) '$(srcdir)/tests/TestZookeeperClose.cc'; fi` + +zktest_mt-TestClient.o: tests/TestClient.cc +@am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(zktest_mt_CXXFLAGS) $(CXXFLAGS) -MT zktest_mt-TestClient.o -MD -MP -MF $(DEPDIR)/zktest_mt-TestClient.Tpo -c -o zktest_mt-TestClient.o `test -f 'tests/TestClient.cc' || echo '$(srcdir)/'`tests/TestClient.cc +@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/zktest_mt-TestClient.Tpo $(DEPDIR)/zktest_mt-TestClient.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='tests/TestClient.cc' object='zktest_mt-TestClient.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(zktest_mt_CXXFLAGS) $(CXXFLAGS) -c -o zktest_mt-TestClient.o `test -f 'tests/TestClient.cc' || echo '$(srcdir)/'`tests/TestClient.cc + +zktest_mt-TestClient.obj: tests/TestClient.cc +@am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(zktest_mt_CXXFLAGS) $(CXXFLAGS) -MT zktest_mt-TestClient.obj -MD -MP -MF $(DEPDIR)/zktest_mt-TestClient.Tpo -c -o zktest_mt-TestClient.obj `if test -f 'tests/TestClient.cc'; then $(CYGPATH_W) 'tests/TestClient.cc'; else $(CYGPATH_W) '$(srcdir)/tests/TestClient.cc'; fi` +@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/zktest_mt-TestClient.Tpo $(DEPDIR)/zktest_mt-TestClient.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='tests/TestClient.cc' object='zktest_mt-TestClient.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(zktest_mt_CXXFLAGS) $(CXXFLAGS) -c -o zktest_mt-TestClient.obj `if test -f 'tests/TestClient.cc'; then $(CYGPATH_W) 'tests/TestClient.cc'; else $(CYGPATH_W) '$(srcdir)/tests/TestClient.cc'; fi` + +zktest_mt-TestMulti.o: tests/TestMulti.cc +@am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(zktest_mt_CXXFLAGS) $(CXXFLAGS) -MT zktest_mt-TestMulti.o -MD -MP -MF $(DEPDIR)/zktest_mt-TestMulti.Tpo -c -o zktest_mt-TestMulti.o `test -f 'tests/TestMulti.cc' || echo '$(srcdir)/'`tests/TestMulti.cc +@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/zktest_mt-TestMulti.Tpo $(DEPDIR)/zktest_mt-TestMulti.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='tests/TestMulti.cc' object='zktest_mt-TestMulti.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(zktest_mt_CXXFLAGS) $(CXXFLAGS) -c -o zktest_mt-TestMulti.o `test -f 'tests/TestMulti.cc' || echo '$(srcdir)/'`tests/TestMulti.cc + +zktest_mt-TestMulti.obj: tests/TestMulti.cc +@am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(zktest_mt_CXXFLAGS) $(CXXFLAGS) -MT zktest_mt-TestMulti.obj -MD -MP -MF $(DEPDIR)/zktest_mt-TestMulti.Tpo -c -o zktest_mt-TestMulti.obj `if test -f 'tests/TestMulti.cc'; then $(CYGPATH_W) 'tests/TestMulti.cc'; else $(CYGPATH_W) '$(srcdir)/tests/TestMulti.cc'; fi` +@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/zktest_mt-TestMulti.Tpo $(DEPDIR)/zktest_mt-TestMulti.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='tests/TestMulti.cc' object='zktest_mt-TestMulti.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(zktest_mt_CXXFLAGS) $(CXXFLAGS) -c -o zktest_mt-TestMulti.obj `if test -f 'tests/TestMulti.cc'; then $(CYGPATH_W) 'tests/TestMulti.cc'; else $(CYGPATH_W) '$(srcdir)/tests/TestMulti.cc'; fi` + +zktest_mt-TestWatchers.o: tests/TestWatchers.cc +@am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(zktest_mt_CXXFLAGS) $(CXXFLAGS) -MT zktest_mt-TestWatchers.o -MD -MP -MF $(DEPDIR)/zktest_mt-TestWatchers.Tpo -c -o zktest_mt-TestWatchers.o `test -f 'tests/TestWatchers.cc' || echo '$(srcdir)/'`tests/TestWatchers.cc +@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/zktest_mt-TestWatchers.Tpo $(DEPDIR)/zktest_mt-TestWatchers.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='tests/TestWatchers.cc' object='zktest_mt-TestWatchers.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(zktest_mt_CXXFLAGS) $(CXXFLAGS) -c -o zktest_mt-TestWatchers.o `test -f 'tests/TestWatchers.cc' || echo '$(srcdir)/'`tests/TestWatchers.cc + +zktest_mt-TestWatchers.obj: tests/TestWatchers.cc +@am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(zktest_mt_CXXFLAGS) $(CXXFLAGS) -MT zktest_mt-TestWatchers.obj -MD -MP -MF $(DEPDIR)/zktest_mt-TestWatchers.Tpo -c -o zktest_mt-TestWatchers.obj `if test -f 'tests/TestWatchers.cc'; then $(CYGPATH_W) 'tests/TestWatchers.cc'; else $(CYGPATH_W) '$(srcdir)/tests/TestWatchers.cc'; fi` +@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/zktest_mt-TestWatchers.Tpo $(DEPDIR)/zktest_mt-TestWatchers.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='tests/TestWatchers.cc' object='zktest_mt-TestWatchers.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(zktest_mt_CXXFLAGS) $(CXXFLAGS) -c -o zktest_mt-TestWatchers.obj `if test -f 'tests/TestWatchers.cc'; then $(CYGPATH_W) 'tests/TestWatchers.cc'; else $(CYGPATH_W) '$(srcdir)/tests/TestWatchers.cc'; fi` + +zktest_mt-PthreadMocks.o: tests/PthreadMocks.cc +@am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(zktest_mt_CXXFLAGS) $(CXXFLAGS) -MT zktest_mt-PthreadMocks.o -MD -MP -MF $(DEPDIR)/zktest_mt-PthreadMocks.Tpo -c -o zktest_mt-PthreadMocks.o `test -f 'tests/PthreadMocks.cc' || echo '$(srcdir)/'`tests/PthreadMocks.cc +@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/zktest_mt-PthreadMocks.Tpo $(DEPDIR)/zktest_mt-PthreadMocks.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='tests/PthreadMocks.cc' object='zktest_mt-PthreadMocks.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(zktest_mt_CXXFLAGS) $(CXXFLAGS) -c -o zktest_mt-PthreadMocks.o `test -f 'tests/PthreadMocks.cc' || echo '$(srcdir)/'`tests/PthreadMocks.cc + +zktest_mt-PthreadMocks.obj: tests/PthreadMocks.cc +@am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(zktest_mt_CXXFLAGS) $(CXXFLAGS) -MT zktest_mt-PthreadMocks.obj -MD -MP -MF $(DEPDIR)/zktest_mt-PthreadMocks.Tpo -c -o zktest_mt-PthreadMocks.obj `if test -f 'tests/PthreadMocks.cc'; then $(CYGPATH_W) 'tests/PthreadMocks.cc'; else $(CYGPATH_W) '$(srcdir)/tests/PthreadMocks.cc'; fi` +@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/zktest_mt-PthreadMocks.Tpo $(DEPDIR)/zktest_mt-PthreadMocks.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='tests/PthreadMocks.cc' object='zktest_mt-PthreadMocks.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(zktest_mt_CXXFLAGS) $(CXXFLAGS) -c -o zktest_mt-PthreadMocks.obj `if test -f 'tests/PthreadMocks.cc'; then $(CYGPATH_W) 'tests/PthreadMocks.cc'; else $(CYGPATH_W) '$(srcdir)/tests/PthreadMocks.cc'; fi` + +zktest_st-TestDriver.o: tests/TestDriver.cc +@am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(zktest_st_CXXFLAGS) $(CXXFLAGS) -MT zktest_st-TestDriver.o -MD -MP -MF $(DEPDIR)/zktest_st-TestDriver.Tpo -c -o zktest_st-TestDriver.o `test -f 'tests/TestDriver.cc' || echo '$(srcdir)/'`tests/TestDriver.cc +@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/zktest_st-TestDriver.Tpo $(DEPDIR)/zktest_st-TestDriver.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='tests/TestDriver.cc' object='zktest_st-TestDriver.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(zktest_st_CXXFLAGS) $(CXXFLAGS) -c -o zktest_st-TestDriver.o `test -f 'tests/TestDriver.cc' || echo '$(srcdir)/'`tests/TestDriver.cc + +zktest_st-TestDriver.obj: tests/TestDriver.cc +@am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(zktest_st_CXXFLAGS) $(CXXFLAGS) -MT zktest_st-TestDriver.obj -MD -MP -MF $(DEPDIR)/zktest_st-TestDriver.Tpo -c -o zktest_st-TestDriver.obj `if test -f 'tests/TestDriver.cc'; then $(CYGPATH_W) 'tests/TestDriver.cc'; else $(CYGPATH_W) '$(srcdir)/tests/TestDriver.cc'; fi` +@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/zktest_st-TestDriver.Tpo $(DEPDIR)/zktest_st-TestDriver.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='tests/TestDriver.cc' object='zktest_st-TestDriver.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(zktest_st_CXXFLAGS) $(CXXFLAGS) -c -o zktest_st-TestDriver.obj `if test -f 'tests/TestDriver.cc'; then $(CYGPATH_W) 'tests/TestDriver.cc'; else $(CYGPATH_W) '$(srcdir)/tests/TestDriver.cc'; fi` + +zktest_st-LibCMocks.o: tests/LibCMocks.cc +@am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(zktest_st_CXXFLAGS) $(CXXFLAGS) -MT zktest_st-LibCMocks.o -MD -MP -MF $(DEPDIR)/zktest_st-LibCMocks.Tpo -c -o zktest_st-LibCMocks.o `test -f 'tests/LibCMocks.cc' || echo '$(srcdir)/'`tests/LibCMocks.cc +@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/zktest_st-LibCMocks.Tpo $(DEPDIR)/zktest_st-LibCMocks.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='tests/LibCMocks.cc' object='zktest_st-LibCMocks.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(zktest_st_CXXFLAGS) $(CXXFLAGS) -c -o zktest_st-LibCMocks.o `test -f 'tests/LibCMocks.cc' || echo '$(srcdir)/'`tests/LibCMocks.cc + +zktest_st-LibCMocks.obj: tests/LibCMocks.cc +@am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(zktest_st_CXXFLAGS) $(CXXFLAGS) -MT zktest_st-LibCMocks.obj -MD -MP -MF $(DEPDIR)/zktest_st-LibCMocks.Tpo -c -o zktest_st-LibCMocks.obj `if test -f 'tests/LibCMocks.cc'; then $(CYGPATH_W) 'tests/LibCMocks.cc'; else $(CYGPATH_W) '$(srcdir)/tests/LibCMocks.cc'; fi` +@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/zktest_st-LibCMocks.Tpo $(DEPDIR)/zktest_st-LibCMocks.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='tests/LibCMocks.cc' object='zktest_st-LibCMocks.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(zktest_st_CXXFLAGS) $(CXXFLAGS) -c -o zktest_st-LibCMocks.obj `if test -f 'tests/LibCMocks.cc'; then $(CYGPATH_W) 'tests/LibCMocks.cc'; else $(CYGPATH_W) '$(srcdir)/tests/LibCMocks.cc'; fi` + +zktest_st-LibCSymTable.o: tests/LibCSymTable.cc +@am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(zktest_st_CXXFLAGS) $(CXXFLAGS) -MT zktest_st-LibCSymTable.o -MD -MP -MF $(DEPDIR)/zktest_st-LibCSymTable.Tpo -c -o zktest_st-LibCSymTable.o `test -f 'tests/LibCSymTable.cc' || echo '$(srcdir)/'`tests/LibCSymTable.cc +@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/zktest_st-LibCSymTable.Tpo $(DEPDIR)/zktest_st-LibCSymTable.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='tests/LibCSymTable.cc' object='zktest_st-LibCSymTable.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(zktest_st_CXXFLAGS) $(CXXFLAGS) -c -o zktest_st-LibCSymTable.o `test -f 'tests/LibCSymTable.cc' || echo '$(srcdir)/'`tests/LibCSymTable.cc + +zktest_st-LibCSymTable.obj: tests/LibCSymTable.cc +@am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(zktest_st_CXXFLAGS) $(CXXFLAGS) -MT zktest_st-LibCSymTable.obj -MD -MP -MF $(DEPDIR)/zktest_st-LibCSymTable.Tpo -c -o zktest_st-LibCSymTable.obj `if test -f 'tests/LibCSymTable.cc'; then $(CYGPATH_W) 'tests/LibCSymTable.cc'; else $(CYGPATH_W) '$(srcdir)/tests/LibCSymTable.cc'; fi` +@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/zktest_st-LibCSymTable.Tpo $(DEPDIR)/zktest_st-LibCSymTable.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='tests/LibCSymTable.cc' object='zktest_st-LibCSymTable.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(zktest_st_CXXFLAGS) $(CXXFLAGS) -c -o zktest_st-LibCSymTable.obj `if test -f 'tests/LibCSymTable.cc'; then $(CYGPATH_W) 'tests/LibCSymTable.cc'; else $(CYGPATH_W) '$(srcdir)/tests/LibCSymTable.cc'; fi` + +zktest_st-MocksBase.o: tests/MocksBase.cc +@am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(zktest_st_CXXFLAGS) $(CXXFLAGS) -MT zktest_st-MocksBase.o -MD -MP -MF $(DEPDIR)/zktest_st-MocksBase.Tpo -c -o zktest_st-MocksBase.o `test -f 'tests/MocksBase.cc' || echo '$(srcdir)/'`tests/MocksBase.cc +@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/zktest_st-MocksBase.Tpo $(DEPDIR)/zktest_st-MocksBase.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='tests/MocksBase.cc' object='zktest_st-MocksBase.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(zktest_st_CXXFLAGS) $(CXXFLAGS) -c -o zktest_st-MocksBase.o `test -f 'tests/MocksBase.cc' || echo '$(srcdir)/'`tests/MocksBase.cc + +zktest_st-MocksBase.obj: tests/MocksBase.cc +@am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(zktest_st_CXXFLAGS) $(CXXFLAGS) -MT zktest_st-MocksBase.obj -MD -MP -MF $(DEPDIR)/zktest_st-MocksBase.Tpo -c -o zktest_st-MocksBase.obj `if test -f 'tests/MocksBase.cc'; then $(CYGPATH_W) 'tests/MocksBase.cc'; else $(CYGPATH_W) '$(srcdir)/tests/MocksBase.cc'; fi` +@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/zktest_st-MocksBase.Tpo $(DEPDIR)/zktest_st-MocksBase.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='tests/MocksBase.cc' object='zktest_st-MocksBase.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(zktest_st_CXXFLAGS) $(CXXFLAGS) -c -o zktest_st-MocksBase.obj `if test -f 'tests/MocksBase.cc'; then $(CYGPATH_W) 'tests/MocksBase.cc'; else $(CYGPATH_W) '$(srcdir)/tests/MocksBase.cc'; fi` + +zktest_st-ZKMocks.o: tests/ZKMocks.cc +@am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(zktest_st_CXXFLAGS) $(CXXFLAGS) -MT zktest_st-ZKMocks.o -MD -MP -MF $(DEPDIR)/zktest_st-ZKMocks.Tpo -c -o zktest_st-ZKMocks.o `test -f 'tests/ZKMocks.cc' || echo '$(srcdir)/'`tests/ZKMocks.cc +@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/zktest_st-ZKMocks.Tpo $(DEPDIR)/zktest_st-ZKMocks.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='tests/ZKMocks.cc' object='zktest_st-ZKMocks.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(zktest_st_CXXFLAGS) $(CXXFLAGS) -c -o zktest_st-ZKMocks.o `test -f 'tests/ZKMocks.cc' || echo '$(srcdir)/'`tests/ZKMocks.cc + +zktest_st-ZKMocks.obj: tests/ZKMocks.cc +@am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(zktest_st_CXXFLAGS) $(CXXFLAGS) -MT zktest_st-ZKMocks.obj -MD -MP -MF $(DEPDIR)/zktest_st-ZKMocks.Tpo -c -o zktest_st-ZKMocks.obj `if test -f 'tests/ZKMocks.cc'; then $(CYGPATH_W) 'tests/ZKMocks.cc'; else $(CYGPATH_W) '$(srcdir)/tests/ZKMocks.cc'; fi` +@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/zktest_st-ZKMocks.Tpo $(DEPDIR)/zktest_st-ZKMocks.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='tests/ZKMocks.cc' object='zktest_st-ZKMocks.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(zktest_st_CXXFLAGS) $(CXXFLAGS) -c -o zktest_st-ZKMocks.obj `if test -f 'tests/ZKMocks.cc'; then $(CYGPATH_W) 'tests/ZKMocks.cc'; else $(CYGPATH_W) '$(srcdir)/tests/ZKMocks.cc'; fi` + +zktest_st-Util.o: tests/Util.cc +@am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(zktest_st_CXXFLAGS) $(CXXFLAGS) -MT zktest_st-Util.o -MD -MP -MF $(DEPDIR)/zktest_st-Util.Tpo -c -o zktest_st-Util.o `test -f 'tests/Util.cc' || echo '$(srcdir)/'`tests/Util.cc +@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/zktest_st-Util.Tpo $(DEPDIR)/zktest_st-Util.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='tests/Util.cc' object='zktest_st-Util.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(zktest_st_CXXFLAGS) $(CXXFLAGS) -c -o zktest_st-Util.o `test -f 'tests/Util.cc' || echo '$(srcdir)/'`tests/Util.cc + +zktest_st-Util.obj: tests/Util.cc +@am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(zktest_st_CXXFLAGS) $(CXXFLAGS) -MT zktest_st-Util.obj -MD -MP -MF $(DEPDIR)/zktest_st-Util.Tpo -c -o zktest_st-Util.obj `if test -f 'tests/Util.cc'; then $(CYGPATH_W) 'tests/Util.cc'; else $(CYGPATH_W) '$(srcdir)/tests/Util.cc'; fi` +@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/zktest_st-Util.Tpo $(DEPDIR)/zktest_st-Util.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='tests/Util.cc' object='zktest_st-Util.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(zktest_st_CXXFLAGS) $(CXXFLAGS) -c -o zktest_st-Util.obj `if test -f 'tests/Util.cc'; then $(CYGPATH_W) 'tests/Util.cc'; else $(CYGPATH_W) '$(srcdir)/tests/Util.cc'; fi` + +zktest_st-ThreadingUtil.o: tests/ThreadingUtil.cc +@am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(zktest_st_CXXFLAGS) $(CXXFLAGS) -MT zktest_st-ThreadingUtil.o -MD -MP -MF $(DEPDIR)/zktest_st-ThreadingUtil.Tpo -c -o zktest_st-ThreadingUtil.o `test -f 'tests/ThreadingUtil.cc' || echo '$(srcdir)/'`tests/ThreadingUtil.cc +@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/zktest_st-ThreadingUtil.Tpo $(DEPDIR)/zktest_st-ThreadingUtil.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='tests/ThreadingUtil.cc' object='zktest_st-ThreadingUtil.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(zktest_st_CXXFLAGS) $(CXXFLAGS) -c -o zktest_st-ThreadingUtil.o `test -f 'tests/ThreadingUtil.cc' || echo '$(srcdir)/'`tests/ThreadingUtil.cc + +zktest_st-ThreadingUtil.obj: tests/ThreadingUtil.cc +@am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(zktest_st_CXXFLAGS) $(CXXFLAGS) -MT zktest_st-ThreadingUtil.obj -MD -MP -MF $(DEPDIR)/zktest_st-ThreadingUtil.Tpo -c -o zktest_st-ThreadingUtil.obj `if test -f 'tests/ThreadingUtil.cc'; then $(CYGPATH_W) 'tests/ThreadingUtil.cc'; else $(CYGPATH_W) '$(srcdir)/tests/ThreadingUtil.cc'; fi` +@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/zktest_st-ThreadingUtil.Tpo $(DEPDIR)/zktest_st-ThreadingUtil.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='tests/ThreadingUtil.cc' object='zktest_st-ThreadingUtil.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(zktest_st_CXXFLAGS) $(CXXFLAGS) -c -o zktest_st-ThreadingUtil.obj `if test -f 'tests/ThreadingUtil.cc'; then $(CYGPATH_W) 'tests/ThreadingUtil.cc'; else $(CYGPATH_W) '$(srcdir)/tests/ThreadingUtil.cc'; fi` + +zktest_st-TestClientRetry.o: tests/TestClientRetry.cc +@am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(zktest_st_CXXFLAGS) $(CXXFLAGS) -MT zktest_st-TestClientRetry.o -MD -MP -MF $(DEPDIR)/zktest_st-TestClientRetry.Tpo -c -o zktest_st-TestClientRetry.o `test -f 'tests/TestClientRetry.cc' || echo '$(srcdir)/'`tests/TestClientRetry.cc +@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/zktest_st-TestClientRetry.Tpo $(DEPDIR)/zktest_st-TestClientRetry.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='tests/TestClientRetry.cc' object='zktest_st-TestClientRetry.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(zktest_st_CXXFLAGS) $(CXXFLAGS) -c -o zktest_st-TestClientRetry.o `test -f 'tests/TestClientRetry.cc' || echo '$(srcdir)/'`tests/TestClientRetry.cc + +zktest_st-TestClientRetry.obj: tests/TestClientRetry.cc +@am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(zktest_st_CXXFLAGS) $(CXXFLAGS) -MT zktest_st-TestClientRetry.obj -MD -MP -MF $(DEPDIR)/zktest_st-TestClientRetry.Tpo -c -o zktest_st-TestClientRetry.obj `if test -f 'tests/TestClientRetry.cc'; then $(CYGPATH_W) 'tests/TestClientRetry.cc'; else $(CYGPATH_W) '$(srcdir)/tests/TestClientRetry.cc'; fi` +@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/zktest_st-TestClientRetry.Tpo $(DEPDIR)/zktest_st-TestClientRetry.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='tests/TestClientRetry.cc' object='zktest_st-TestClientRetry.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(zktest_st_CXXFLAGS) $(CXXFLAGS) -c -o zktest_st-TestClientRetry.obj `if test -f 'tests/TestClientRetry.cc'; then $(CYGPATH_W) 'tests/TestClientRetry.cc'; else $(CYGPATH_W) '$(srcdir)/tests/TestClientRetry.cc'; fi` + +zktest_st-TestOperations.o: tests/TestOperations.cc +@am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(zktest_st_CXXFLAGS) $(CXXFLAGS) -MT zktest_st-TestOperations.o -MD -MP -MF $(DEPDIR)/zktest_st-TestOperations.Tpo -c -o zktest_st-TestOperations.o `test -f 'tests/TestOperations.cc' || echo '$(srcdir)/'`tests/TestOperations.cc +@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/zktest_st-TestOperations.Tpo $(DEPDIR)/zktest_st-TestOperations.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='tests/TestOperations.cc' object='zktest_st-TestOperations.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(zktest_st_CXXFLAGS) $(CXXFLAGS) -c -o zktest_st-TestOperations.o `test -f 'tests/TestOperations.cc' || echo '$(srcdir)/'`tests/TestOperations.cc + +zktest_st-TestOperations.obj: tests/TestOperations.cc +@am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(zktest_st_CXXFLAGS) $(CXXFLAGS) -MT zktest_st-TestOperations.obj -MD -MP -MF $(DEPDIR)/zktest_st-TestOperations.Tpo -c -o zktest_st-TestOperations.obj `if test -f 'tests/TestOperations.cc'; then $(CYGPATH_W) 'tests/TestOperations.cc'; else $(CYGPATH_W) '$(srcdir)/tests/TestOperations.cc'; fi` +@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/zktest_st-TestOperations.Tpo $(DEPDIR)/zktest_st-TestOperations.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='tests/TestOperations.cc' object='zktest_st-TestOperations.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(zktest_st_CXXFLAGS) $(CXXFLAGS) -c -o zktest_st-TestOperations.obj `if test -f 'tests/TestOperations.cc'; then $(CYGPATH_W) 'tests/TestOperations.cc'; else $(CYGPATH_W) '$(srcdir)/tests/TestOperations.cc'; fi` + +zktest_st-TestZookeeperInit.o: tests/TestZookeeperInit.cc +@am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(zktest_st_CXXFLAGS) $(CXXFLAGS) -MT zktest_st-TestZookeeperInit.o -MD -MP -MF $(DEPDIR)/zktest_st-TestZookeeperInit.Tpo -c -o zktest_st-TestZookeeperInit.o `test -f 'tests/TestZookeeperInit.cc' || echo '$(srcdir)/'`tests/TestZookeeperInit.cc +@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/zktest_st-TestZookeeperInit.Tpo $(DEPDIR)/zktest_st-TestZookeeperInit.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='tests/TestZookeeperInit.cc' object='zktest_st-TestZookeeperInit.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(zktest_st_CXXFLAGS) $(CXXFLAGS) -c -o zktest_st-TestZookeeperInit.o `test -f 'tests/TestZookeeperInit.cc' || echo '$(srcdir)/'`tests/TestZookeeperInit.cc + +zktest_st-TestZookeeperInit.obj: tests/TestZookeeperInit.cc +@am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(zktest_st_CXXFLAGS) $(CXXFLAGS) -MT zktest_st-TestZookeeperInit.obj -MD -MP -MF $(DEPDIR)/zktest_st-TestZookeeperInit.Tpo -c -o zktest_st-TestZookeeperInit.obj `if test -f 'tests/TestZookeeperInit.cc'; then $(CYGPATH_W) 'tests/TestZookeeperInit.cc'; else $(CYGPATH_W) '$(srcdir)/tests/TestZookeeperInit.cc'; fi` +@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/zktest_st-TestZookeeperInit.Tpo $(DEPDIR)/zktest_st-TestZookeeperInit.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='tests/TestZookeeperInit.cc' object='zktest_st-TestZookeeperInit.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(zktest_st_CXXFLAGS) $(CXXFLAGS) -c -o zktest_st-TestZookeeperInit.obj `if test -f 'tests/TestZookeeperInit.cc'; then $(CYGPATH_W) 'tests/TestZookeeperInit.cc'; else $(CYGPATH_W) '$(srcdir)/tests/TestZookeeperInit.cc'; fi` + +zktest_st-TestZookeeperClose.o: tests/TestZookeeperClose.cc +@am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(zktest_st_CXXFLAGS) $(CXXFLAGS) -MT zktest_st-TestZookeeperClose.o -MD -MP -MF $(DEPDIR)/zktest_st-TestZookeeperClose.Tpo -c -o zktest_st-TestZookeeperClose.o `test -f 'tests/TestZookeeperClose.cc' || echo '$(srcdir)/'`tests/TestZookeeperClose.cc +@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/zktest_st-TestZookeeperClose.Tpo $(DEPDIR)/zktest_st-TestZookeeperClose.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='tests/TestZookeeperClose.cc' object='zktest_st-TestZookeeperClose.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(zktest_st_CXXFLAGS) $(CXXFLAGS) -c -o zktest_st-TestZookeeperClose.o `test -f 'tests/TestZookeeperClose.cc' || echo '$(srcdir)/'`tests/TestZookeeperClose.cc + +zktest_st-TestZookeeperClose.obj: tests/TestZookeeperClose.cc +@am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(zktest_st_CXXFLAGS) $(CXXFLAGS) -MT zktest_st-TestZookeeperClose.obj -MD -MP -MF $(DEPDIR)/zktest_st-TestZookeeperClose.Tpo -c -o zktest_st-TestZookeeperClose.obj `if test -f 'tests/TestZookeeperClose.cc'; then $(CYGPATH_W) 'tests/TestZookeeperClose.cc'; else $(CYGPATH_W) '$(srcdir)/tests/TestZookeeperClose.cc'; fi` +@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/zktest_st-TestZookeeperClose.Tpo $(DEPDIR)/zktest_st-TestZookeeperClose.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='tests/TestZookeeperClose.cc' object='zktest_st-TestZookeeperClose.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(zktest_st_CXXFLAGS) $(CXXFLAGS) -c -o zktest_st-TestZookeeperClose.obj `if test -f 'tests/TestZookeeperClose.cc'; then $(CYGPATH_W) 'tests/TestZookeeperClose.cc'; else $(CYGPATH_W) '$(srcdir)/tests/TestZookeeperClose.cc'; fi` + +zktest_st-TestClient.o: tests/TestClient.cc +@am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(zktest_st_CXXFLAGS) $(CXXFLAGS) -MT zktest_st-TestClient.o -MD -MP -MF $(DEPDIR)/zktest_st-TestClient.Tpo -c -o zktest_st-TestClient.o `test -f 'tests/TestClient.cc' || echo '$(srcdir)/'`tests/TestClient.cc +@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/zktest_st-TestClient.Tpo $(DEPDIR)/zktest_st-TestClient.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='tests/TestClient.cc' object='zktest_st-TestClient.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(zktest_st_CXXFLAGS) $(CXXFLAGS) -c -o zktest_st-TestClient.o `test -f 'tests/TestClient.cc' || echo '$(srcdir)/'`tests/TestClient.cc + +zktest_st-TestClient.obj: tests/TestClient.cc +@am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(zktest_st_CXXFLAGS) $(CXXFLAGS) -MT zktest_st-TestClient.obj -MD -MP -MF $(DEPDIR)/zktest_st-TestClient.Tpo -c -o zktest_st-TestClient.obj `if test -f 'tests/TestClient.cc'; then $(CYGPATH_W) 'tests/TestClient.cc'; else $(CYGPATH_W) '$(srcdir)/tests/TestClient.cc'; fi` +@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/zktest_st-TestClient.Tpo $(DEPDIR)/zktest_st-TestClient.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='tests/TestClient.cc' object='zktest_st-TestClient.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(zktest_st_CXXFLAGS) $(CXXFLAGS) -c -o zktest_st-TestClient.obj `if test -f 'tests/TestClient.cc'; then $(CYGPATH_W) 'tests/TestClient.cc'; else $(CYGPATH_W) '$(srcdir)/tests/TestClient.cc'; fi` + +zktest_st-TestMulti.o: tests/TestMulti.cc +@am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(zktest_st_CXXFLAGS) $(CXXFLAGS) -MT zktest_st-TestMulti.o -MD -MP -MF $(DEPDIR)/zktest_st-TestMulti.Tpo -c -o zktest_st-TestMulti.o `test -f 'tests/TestMulti.cc' || echo '$(srcdir)/'`tests/TestMulti.cc +@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/zktest_st-TestMulti.Tpo $(DEPDIR)/zktest_st-TestMulti.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='tests/TestMulti.cc' object='zktest_st-TestMulti.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(zktest_st_CXXFLAGS) $(CXXFLAGS) -c -o zktest_st-TestMulti.o `test -f 'tests/TestMulti.cc' || echo '$(srcdir)/'`tests/TestMulti.cc + +zktest_st-TestMulti.obj: tests/TestMulti.cc +@am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(zktest_st_CXXFLAGS) $(CXXFLAGS) -MT zktest_st-TestMulti.obj -MD -MP -MF $(DEPDIR)/zktest_st-TestMulti.Tpo -c -o zktest_st-TestMulti.obj `if test -f 'tests/TestMulti.cc'; then $(CYGPATH_W) 'tests/TestMulti.cc'; else $(CYGPATH_W) '$(srcdir)/tests/TestMulti.cc'; fi` +@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/zktest_st-TestMulti.Tpo $(DEPDIR)/zktest_st-TestMulti.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='tests/TestMulti.cc' object='zktest_st-TestMulti.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(zktest_st_CXXFLAGS) $(CXXFLAGS) -c -o zktest_st-TestMulti.obj `if test -f 'tests/TestMulti.cc'; then $(CYGPATH_W) 'tests/TestMulti.cc'; else $(CYGPATH_W) '$(srcdir)/tests/TestMulti.cc'; fi` + +zktest_st-TestWatchers.o: tests/TestWatchers.cc +@am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(zktest_st_CXXFLAGS) $(CXXFLAGS) -MT zktest_st-TestWatchers.o -MD -MP -MF $(DEPDIR)/zktest_st-TestWatchers.Tpo -c -o zktest_st-TestWatchers.o `test -f 'tests/TestWatchers.cc' || echo '$(srcdir)/'`tests/TestWatchers.cc +@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/zktest_st-TestWatchers.Tpo $(DEPDIR)/zktest_st-TestWatchers.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='tests/TestWatchers.cc' object='zktest_st-TestWatchers.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(zktest_st_CXXFLAGS) $(CXXFLAGS) -c -o zktest_st-TestWatchers.o `test -f 'tests/TestWatchers.cc' || echo '$(srcdir)/'`tests/TestWatchers.cc + +zktest_st-TestWatchers.obj: tests/TestWatchers.cc +@am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(zktest_st_CXXFLAGS) $(CXXFLAGS) -MT zktest_st-TestWatchers.obj -MD -MP -MF $(DEPDIR)/zktest_st-TestWatchers.Tpo -c -o zktest_st-TestWatchers.obj `if test -f 'tests/TestWatchers.cc'; then $(CYGPATH_W) 'tests/TestWatchers.cc'; else $(CYGPATH_W) '$(srcdir)/tests/TestWatchers.cc'; fi` +@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/zktest_st-TestWatchers.Tpo $(DEPDIR)/zktest_st-TestWatchers.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='tests/TestWatchers.cc' object='zktest_st-TestWatchers.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(zktest_st_CXXFLAGS) $(CXXFLAGS) -c -o zktest_st-TestWatchers.obj `if test -f 'tests/TestWatchers.cc'; then $(CYGPATH_W) 'tests/TestWatchers.cc'; else $(CYGPATH_W) '$(srcdir)/tests/TestWatchers.cc'; fi` + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +distclean-libtool: + -rm -f libtool config.lt +install-pkgincludeHEADERS: $(pkginclude_HEADERS) + @$(NORMAL_INSTALL) + @list='$(pkginclude_HEADERS)'; test -n "$(pkgincludedir)" || list=; \ + if test -n "$$list"; then \ + echo " $(MKDIR_P) '$(DESTDIR)$(pkgincludedir)'"; \ + $(MKDIR_P) "$(DESTDIR)$(pkgincludedir)" || exit 1; \ + fi; \ + for p in $$list; do \ + if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ + echo "$$d$$p"; \ + done | $(am__base_list) | \ + while read files; do \ + echo " $(INSTALL_HEADER) $$files '$(DESTDIR)$(pkgincludedir)'"; \ + $(INSTALL_HEADER) $$files "$(DESTDIR)$(pkgincludedir)" || exit $$?; \ + done + +uninstall-pkgincludeHEADERS: + @$(NORMAL_UNINSTALL) + @list='$(pkginclude_HEADERS)'; test -n "$(pkgincludedir)" || list=; \ + files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ + dir='$(DESTDIR)$(pkgincludedir)'; $(am__uninstall_files_from_dir) + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: $(HEADERS) $(SOURCES) config.h.in $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + set x; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) config.h.in $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: CTAGS +CTAGS: $(HEADERS) $(SOURCES) config.h.in $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + list='$(SOURCES) $(HEADERS) config.h.in $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + $(am__remove_distdir) + test -d "$(distdir)" || mkdir "$(distdir)" + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done + -test -n "$(am__skip_mode_fix)" \ + || find "$(distdir)" -type d ! -perm -755 \ + -exec chmod u+rwx,go+rx {} \; -o \ + ! -type d ! -perm -444 -links 1 -exec chmod a+r {} \; -o \ + ! -type d ! -perm -400 -exec chmod a+r {} \; -o \ + ! -type d ! -perm -444 -exec $(install_sh) -c -m a+r {} {} \; \ + || chmod -R a+r "$(distdir)" +dist-gzip: distdir + tardir=$(distdir) && $(am__tar) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz + $(am__remove_distdir) + +dist-bzip2: distdir + tardir=$(distdir) && $(am__tar) | BZIP2=$${BZIP2--9} bzip2 -c >$(distdir).tar.bz2 + $(am__remove_distdir) + +dist-lzip: distdir + tardir=$(distdir) && $(am__tar) | lzip -c $${LZIP_OPT--9} >$(distdir).tar.lz + $(am__remove_distdir) + +dist-lzma: distdir + tardir=$(distdir) && $(am__tar) | lzma -9 -c >$(distdir).tar.lzma + $(am__remove_distdir) + +dist-xz: distdir + tardir=$(distdir) && $(am__tar) | XZ_OPT=$${XZ_OPT--e} xz -c >$(distdir).tar.xz + $(am__remove_distdir) + +dist-tarZ: distdir + tardir=$(distdir) && $(am__tar) | compress -c >$(distdir).tar.Z + $(am__remove_distdir) + +dist-shar: distdir + shar $(distdir) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).shar.gz + $(am__remove_distdir) + +dist-zip: distdir + -rm -f $(distdir).zip + zip -rq $(distdir).zip $(distdir) + $(am__remove_distdir) + +dist dist-all: distdir + tardir=$(distdir) && $(am__tar) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz + $(am__remove_distdir) + +# This target untars the dist file and tries a VPATH configuration. Then +# it guarantees that the distribution is self-contained by making another +# tarfile. +distcheck: dist + case '$(DIST_ARCHIVES)' in \ + *.tar.gz*) \ + GZIP=$(GZIP_ENV) gzip -dc $(distdir).tar.gz | $(am__untar) ;;\ + *.tar.bz2*) \ + bzip2 -dc $(distdir).tar.bz2 | $(am__untar) ;;\ + *.tar.lzma*) \ + lzma -dc $(distdir).tar.lzma | $(am__untar) ;;\ + *.tar.lz*) \ + lzip -dc $(distdir).tar.lz | $(am__untar) ;;\ + *.tar.xz*) \ + xz -dc $(distdir).tar.xz | $(am__untar) ;;\ + *.tar.Z*) \ + uncompress -c $(distdir).tar.Z | $(am__untar) ;;\ + *.shar.gz*) \ + GZIP=$(GZIP_ENV) gzip -dc $(distdir).shar.gz | unshar ;;\ + *.zip*) \ + unzip $(distdir).zip ;;\ + esac + chmod -R a-w $(distdir); chmod u+w $(distdir) + mkdir $(distdir)/_build + mkdir $(distdir)/_inst + chmod a-w $(distdir) + test -d $(distdir)/_build || exit 0; \ + dc_install_base=`$(am__cd) $(distdir)/_inst && pwd | sed -e 's,^[^:\\/]:[\\/],/,'` \ + && dc_destdir="$${TMPDIR-/tmp}/am-dc-$$$$/" \ + && am__cwd=`pwd` \ + && $(am__cd) $(distdir)/_build \ + && ../configure --srcdir=.. --prefix="$$dc_install_base" \ + $(AM_DISTCHECK_CONFIGURE_FLAGS) \ + $(DISTCHECK_CONFIGURE_FLAGS) \ + && $(MAKE) $(AM_MAKEFLAGS) \ + && $(MAKE) $(AM_MAKEFLAGS) dvi \ + && $(MAKE) $(AM_MAKEFLAGS) check \ + && $(MAKE) $(AM_MAKEFLAGS) install \ + && $(MAKE) $(AM_MAKEFLAGS) installcheck \ + && $(MAKE) $(AM_MAKEFLAGS) uninstall \ + && $(MAKE) $(AM_MAKEFLAGS) distuninstallcheck_dir="$$dc_install_base" \ + distuninstallcheck \ + && chmod -R a-w "$$dc_install_base" \ + && ({ \ + (cd ../.. && umask 077 && mkdir "$$dc_destdir") \ + && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" install \ + && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" uninstall \ + && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" \ + distuninstallcheck_dir="$$dc_destdir" distuninstallcheck; \ + } || { rm -rf "$$dc_destdir"; exit 1; }) \ + && rm -rf "$$dc_destdir" \ + && $(MAKE) $(AM_MAKEFLAGS) dist \ + && rm -rf $(DIST_ARCHIVES) \ + && $(MAKE) $(AM_MAKEFLAGS) distcleancheck \ + && cd "$$am__cwd" \ + || exit 1 + $(am__remove_distdir) + @(echo "$(distdir) archives ready for distribution: "; \ + list='$(DIST_ARCHIVES)'; for i in $$list; do echo $$i; done) | \ + sed -e 1h -e 1s/./=/g -e 1p -e 1x -e '$$p' -e '$$x' +distuninstallcheck: + @test -n '$(distuninstallcheck_dir)' || { \ + echo 'ERROR: trying to run $@ with an empty' \ + '$$(distuninstallcheck_dir)' >&2; \ + exit 1; \ + }; \ + $(am__cd) '$(distuninstallcheck_dir)' || { \ + echo 'ERROR: cannot chdir into $(distuninstallcheck_dir)' >&2; \ + exit 1; \ + }; \ + test `$(am__distuninstallcheck_listfiles) | wc -l` -eq 0 \ + || { echo "ERROR: files left after uninstall:" ; \ + if test -n "$(DESTDIR)"; then \ + echo " (check DESTDIR support)"; \ + fi ; \ + $(distuninstallcheck_listfiles) ; \ + exit 1; } >&2 +distcleancheck: distclean + @if test '$(srcdir)' = . ; then \ + echo "ERROR: distcleancheck can only run from a VPATH build" ; \ + exit 1 ; \ + fi + @test `$(distcleancheck_listfiles) | wc -l` -eq 0 \ + || { echo "ERROR: files left in build directory after distclean:" ; \ + $(distcleancheck_listfiles) ; \ + exit 1; } >&2 +check-am: all-am + $(MAKE) $(AM_MAKEFLAGS) $(check_PROGRAMS) +check: check-am +all-am: Makefile $(LTLIBRARIES) $(PROGRAMS) $(HEADERS) config.h +install-binPROGRAMS: install-libLTLIBRARIES + +installdirs: + for dir in "$(DESTDIR)$(libdir)" "$(DESTDIR)$(bindir)" "$(DESTDIR)$(pkgincludedir)"; do \ + test -z "$$dir" || $(MKDIR_P) "$$dir"; \ + done +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-binPROGRAMS clean-checkPROGRAMS clean-generic \ + clean-libLTLIBRARIES clean-libtool clean-local \ + clean-noinstLTLIBRARIES mostlyclean-am + +distclean: distclean-am + -rm -f $(am__CONFIG_DISTCLEAN_FILES) + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-hdr distclean-libtool distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: install-pkgincludeHEADERS + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: install-binPROGRAMS install-libLTLIBRARIES + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -f $(am__CONFIG_DISTCLEAN_FILES) + -rm -rf $(top_srcdir)/autom4te.cache + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: uninstall-binPROGRAMS uninstall-libLTLIBRARIES \ + uninstall-pkgincludeHEADERS + +.MAKE: all check-am install-am install-strip + +.PHONY: CTAGS GTAGS all all-am am--refresh check check-am clean \ + clean-binPROGRAMS clean-checkPROGRAMS clean-generic \ + clean-libLTLIBRARIES clean-libtool clean-local \ + clean-noinstLTLIBRARIES ctags dist dist-all dist-bzip2 \ + dist-gzip dist-lzip dist-lzma dist-shar dist-tarZ dist-xz \ + dist-zip distcheck distclean distclean-compile \ + distclean-generic distclean-hdr distclean-libtool \ + distclean-tags distcleancheck distdir distuninstallcheck dvi \ + dvi-am html html-am info info-am install install-am \ + install-binPROGRAMS install-data install-data-am install-dvi \ + install-dvi-am install-exec install-exec-am install-html \ + install-html-am install-info install-info-am \ + install-libLTLIBRARIES install-man install-pdf install-pdf-am \ + install-pkgincludeHEADERS install-ps install-ps-am \ + install-strip installcheck installcheck-am installdirs \ + maintainer-clean maintainer-clean-generic mostlyclean \ + mostlyclean-compile mostlyclean-generic mostlyclean-libtool \ + pdf pdf-am ps ps-am tags uninstall uninstall-am \ + uninstall-binPROGRAMS uninstall-libLTLIBRARIES \ + uninstall-pkgincludeHEADERS + + +@DX_COND_doc_TRUE@@DX_COND_ps_TRUE@doxygen-ps: @DX_DOCDIR@/@PACKAGE@.ps + +@DX_COND_doc_TRUE@@DX_COND_ps_TRUE@@DX_DOCDIR@/@PACKAGE@.ps: @DX_DOCDIR@/@PACKAGE@.tag +@DX_COND_doc_TRUE@@DX_COND_ps_TRUE@ cd @DX_DOCDIR@/latex; \ +@DX_COND_doc_TRUE@@DX_COND_ps_TRUE@ rm -f *.aux *.toc *.idx *.ind *.ilg *.log *.out; \ +@DX_COND_doc_TRUE@@DX_COND_ps_TRUE@ $(DX_LATEX) refman.tex; \ +@DX_COND_doc_TRUE@@DX_COND_ps_TRUE@ $(MAKEINDEX_PATH) refman.idx; \ +@DX_COND_doc_TRUE@@DX_COND_ps_TRUE@ $(DX_LATEX) refman.tex; \ +@DX_COND_doc_TRUE@@DX_COND_ps_TRUE@ countdown=5; \ +@DX_COND_doc_TRUE@@DX_COND_ps_TRUE@ while $(DX_EGREP) 'Rerun (LaTeX|to get cross-references right)' \ +@DX_COND_doc_TRUE@@DX_COND_ps_TRUE@ refman.log > /dev/null 2>&1 \ +@DX_COND_doc_TRUE@@DX_COND_ps_TRUE@ && test $$countdown -gt 0; do \ +@DX_COND_doc_TRUE@@DX_COND_ps_TRUE@ $(DX_LATEX) refman.tex; \ +@DX_COND_doc_TRUE@@DX_COND_ps_TRUE@ countdown=`expr $$countdown - 1`; \ +@DX_COND_doc_TRUE@@DX_COND_ps_TRUE@ done; \ +@DX_COND_doc_TRUE@@DX_COND_ps_TRUE@ $(DX_DVIPS) -o ../@PACKAGE@.ps refman.dvi + +@DX_COND_doc_TRUE@@DX_COND_pdf_TRUE@doxygen-pdf: @DX_DOCDIR@/@PACKAGE@.pdf + +@DX_COND_doc_TRUE@@DX_COND_pdf_TRUE@@DX_DOCDIR@/@PACKAGE@.pdf: @DX_DOCDIR@/@PACKAGE@.tag +@DX_COND_doc_TRUE@@DX_COND_pdf_TRUE@ cd @DX_DOCDIR@/latex; \ +@DX_COND_doc_TRUE@@DX_COND_pdf_TRUE@ rm -f *.aux *.toc *.idx *.ind *.ilg *.log *.out; \ +@DX_COND_doc_TRUE@@DX_COND_pdf_TRUE@ $(DX_PDFLATEX) refman.tex; \ +@DX_COND_doc_TRUE@@DX_COND_pdf_TRUE@ $(DX_MAKEINDEX) refman.idx; \ +@DX_COND_doc_TRUE@@DX_COND_pdf_TRUE@ $(DX_PDFLATEX) refman.tex; \ +@DX_COND_doc_TRUE@@DX_COND_pdf_TRUE@ countdown=5; \ +@DX_COND_doc_TRUE@@DX_COND_pdf_TRUE@ while $(DX_EGREP) 'Rerun (LaTeX|to get cross-references right)' \ +@DX_COND_doc_TRUE@@DX_COND_pdf_TRUE@ refman.log > /dev/null 2>&1 \ +@DX_COND_doc_TRUE@@DX_COND_pdf_TRUE@ && test $$countdown -gt 0; do \ +@DX_COND_doc_TRUE@@DX_COND_pdf_TRUE@ $(DX_PDFLATEX) refman.tex; \ +@DX_COND_doc_TRUE@@DX_COND_pdf_TRUE@ countdown=`expr $$countdown - 1`; \ +@DX_COND_doc_TRUE@@DX_COND_pdf_TRUE@ done; \ +@DX_COND_doc_TRUE@@DX_COND_pdf_TRUE@ mv refman.pdf ../@PACKAGE@.pdf + +@DX_COND_doc_TRUE@.PHONY: doxygen-run doxygen-doc $(DX_PS_GOAL) $(DX_PDF_GOAL) + +@DX_COND_doc_TRUE@.INTERMEDIATE: doxygen-run $(DX_PS_GOAL) $(DX_PDF_GOAL) + +@DX_COND_doc_TRUE@doxygen-run: @DX_DOCDIR@/@PACKAGE@.tag + +@DX_COND_doc_TRUE@doxygen-doc: doxygen-run $(DX_PS_GOAL) $(DX_PDF_GOAL) + +@DX_COND_doc_TRUE@@DX_DOCDIR@/@PACKAGE@.tag: $(DX_CONFIG) $(pkginclude_HEADERS) +@DX_COND_doc_TRUE@ rm -rf @DX_DOCDIR@ +@DX_COND_doc_TRUE@ $(DX_ENV) $(DX_DOXYGEN) $(srcdir)/$(DX_CONFIG) + +run-check: check + ./zktest-st $(TEST_OPTIONS) +@WANT_SYNCAPI_TRUE@ ./zktest-mt $(TEST_OPTIONS) + +clean-local: clean-check + $(RM) $(DX_CLEANFILES) + +clean-check: + $(RM) $(nodist_zktest_st_OBJECTS) $(nodist_zktest_mt_OBJECTS) + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/pkg/registry/zookeeper-3.4.6/src/c/NOTICE.txt b/pkg/registry/zookeeper-3.4.6/src/c/NOTICE.txt new file mode 100644 index 000000000..07ef1ad51 --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/c/NOTICE.txt @@ -0,0 +1,41 @@ +Apache ZooKeeper +Copyright 2009-2011 The Apache Software Foundation + +This product includes software developed at +The Apache Software Foundation (http://www.apache.org/). + +---------- +include/winstdint.h is included only for Windows Client support, as follows: + +// ISO C9x compliant stdint.h for Microsoft Visual Studio +// Based on ISO/IEC 9899:TC2 Committee draft (May 6, 2005) WG14/N1124 +// +// Copyright (c) 2006-2008 Alexander Chemeris +// +// 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 name of the author may be used to endorse or promote products +// derived from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED +// WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO +// EVENT SHALL THE AUTHOR 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. +// +/////////////////////////////////////////////////////////////////////////////// + +---------- diff --git a/pkg/registry/zookeeper-3.4.6/src/c/README b/pkg/registry/zookeeper-3.4.6/src/c/README new file mode 100644 index 000000000..0b31d0a7a --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/c/README @@ -0,0 +1,129 @@ + Zookeeper C client library + + +This package provides a C client interface to Zookeeper server. + +For the latest information about ZooKeeper, please visit our website at: + http://zookeeper.apache.org/ +and our wiki, at: + https://cwiki.apache.org/confluence/display/ZOOKEEPER + +Full documentation for this release can also be found in ../../docs/index.html + + +OVERVIEW + +The client supports two types of APIs -- synchronous and asynchronous. + +Asynchronous API provides non-blocking operations with completion callbacks and +relies on the application to implement event multiplexing on its behalf. + +On the other hand, Synchronous API provides a blocking flavor of +zookeeper operations and runs its own event loop in a separate thread. + +Sync and Async APIs can be mixed and matched within the same application. + +The package includes two shared libraries: zookeeper_st and +zookeeper_mt. The former only provides the Async API and is not +thread-safe. The only reason this library exists is to support the +platforms were pthread library is not available or unstable +(i.e. FreeBSD 4.x). In all other cases the application developers are +advised to link against zookeeper_mt as it includes support for both +Sync and Async API. + + +INSTALLATION + +If you're building the client from a source checkout you need to +follow the steps outlined below. If you're building from a release +tar downloaded from Apache please skip to step 2. + +1) do a "ant compile_jute" from the zookeeper top level directory (.../trunk). + This will create a directory named "generated" under src/c. Skip to step 3. +2) unzip/untar the source tarball and cd to the zookeeper-x.x.x/src/c directory +3) change directory to src/c and do a "autoreconf -if" to bootstrap + autoconf, automake and libtool. Please make sure you have autoconf + version 2.59 or greater installed. If cppunit is installed in a non-standard + directory, you need to specify where to find cppunit.m4. For example, if + cppunit is installed under /usr/local, run: + + ACLOCAL="aclocal -I /usr/local/share/aclocal" autoreconf -if + +4) do a "./configure [OPTIONS]" to generate the makefile. See INSTALL + for general information about running configure. Additionally, the + configure supports the following options: + --enable-debug enables optimization and enables debug info compiler + options, disabled by default + --without-syncapi disables Sync API support; zookeeper_mt library won't + be built, enabled by default + --disable-static do not build static libraries, enabled by default + --disable-shared do not build shared libraries, enabled by default + --without-cppunit do not build the test library, enabled by default. + +5) do a "make" or "make install" to build the libraries and install them. + Alternatively, you can also build and run a unit test suite (and + you probably should). Please make sure you have cppunit-1.10.x or + higher installed before you execute step 4. Once ./configure has + finished, do a "make run-check". It will build the libraries, build + the tests and run them. +6) to generate doxygen documentation do a "make doxygen-doc". All + documentations will be placed to a new subfolder named docs. By + default only HTML documentation is generated. For information on + other document formats please use "./configure --help" + + +USING THE CLIENT + +You can test your client by running a zookeeper server (see +instructions on the project wiki page on how to run it) and connecting +to it using the zookeeper shell application cli that is built as part +of the installation procedure. + +cli_mt (multithreaded, built against zookeeper_mt library) is shown in +this example, but you could also use cli_st (singlethreaded, built +against zookeeper_st library): + +$ cli_mt zookeeper_host:9876 + +This is a client application that gives you a shell for executing +simple zookeeper commands. Once successfully started and connected to +the server it displays a shell prompt. + +You can now enter zookeeper commands. For example, to create a node: + +> create /my_new_node + +To verify that the node's been created: + +> ls / + +You should see a list of nodes who are the children of the root node "/". + +Here's a list of command supported by the cli shell: + +ls -- list children of a znode identified by . The + command set a children watch on the znode. +get -- get the value of a znode at +set -- set the value of a znode at to +create [+e|+s] -- create a znode as a child of znode ; + use +e option to create an ephemeral znode, + use +s option to create a znode with a sequence number + appended to the name. The operation will fail if + the parent znode (the one identified by ) doesn't + exist. +delete -- delete the znode at . The command will fail if the znode + has children. +sync -- make sure all pending updates have been applied to znode at +exists -- returns a result code indicating whether the znode at + exists. The command also sets a znode watch. +myid -- prints out the current zookeeper session id. +quit -- exit the shell. + +In order to be able to use the zookeeper API in your application you have to +1) remember to include the zookeeper header + #include +2) use -DTHREADED compiler option to enable Sync API; in this case you should + be linking your code against zookeeper_mt library + +Please take a look at cli.c to understand how to use the two API types. +(TODO: some kind of short tutorial would be helpful, I guess) diff --git a/pkg/registry/zookeeper-3.4.6/src/c/acinclude.m4 b/pkg/registry/zookeeper-3.4.6/src/c/acinclude.m4 new file mode 100644 index 000000000..d0041d8c2 --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/c/acinclude.m4 @@ -0,0 +1,312 @@ +# This file is part of Autoconf. -*- Autoconf -*- + +# Copyright (C) 2004 Oren Ben-Kiki +# This file is distributed under the same terms as the Autoconf macro files. + +# Generate automatic documentation using Doxygen. Works in concert with the +# aminclude.m4 file and a compatible doxygen configuration file. Defines the +# following public macros: +# +# DX_???_FEATURE(ON|OFF) - control the default setting fo a Doxygen feature. +# Supported features are 'DOXYGEN' itself, 'DOT' for generating graphics, +# 'HTML' for plain HTML, 'CHM' for compressed HTML help (for MS users), 'CHI' +# for generating a seperate .chi file by the .chm file, and 'MAN', 'RTF', +# 'XML', 'PDF' and 'PS' for the appropriate output formats. The environment +# variable DOXYGEN_PAPER_SIZE may be specified to override the default 'a4wide' +# paper size. +# +# By default, HTML, PDF and PS documentation is generated as this seems to be +# the most popular and portable combination. MAN pages created by Doxygen are +# usually problematic, though by picking an appropriate subset and doing some +# massaging they might be better than nothing. CHM and RTF are specific for MS +# (note that you can't generate both HTML and CHM at the same time). The XML is +# rather useless unless you apply specialized post-processing to it. +# +# The macro mainly controls the default state of the feature. The use can +# override the default by specifying --enable or --disable. The macros ensure +# that contradictory flags are not given (e.g., --enable-doxygen-html and +# --enable-doxygen-chm, --enable-doxygen-anything with --disable-doxygen, etc.) +# Finally, each feature will be automatically disabled (with a warning) if the +# required programs are missing. +# +# Once all the feature defaults have been specified, call DX_INIT_DOXYGEN with +# the following parameters: a one-word name for the project for use as a +# filename base etc., an optional configuration file name (the default is +# 'Doxyfile', the same as Doxygen's default), and an optional output directory +# name (the default is 'doxygen-doc'). + +## ----------## +## Defaults. ## +## ----------## + +DX_ENV="" +AC_DEFUN([DX_FEATURE_doc], ON) +AC_DEFUN([DX_FEATURE_dot], ON) +AC_DEFUN([DX_FEATURE_man], OFF) +AC_DEFUN([DX_FEATURE_html], ON) +AC_DEFUN([DX_FEATURE_chm], OFF) +AC_DEFUN([DX_FEATURE_chi], OFF) +AC_DEFUN([DX_FEATURE_rtf], OFF) +AC_DEFUN([DX_FEATURE_xml], OFF) +AC_DEFUN([DX_FEATURE_pdf], ON) +AC_DEFUN([DX_FEATURE_ps], ON) + +## --------------- ## +## Private macros. ## +## --------------- ## + +# DX_ENV_APPEND(VARIABLE, VALUE) +# ------------------------------ +# Append VARIABLE="VALUE" to DX_ENV for invoking doxygen. +AC_DEFUN([DX_ENV_APPEND], [AC_SUBST([DX_ENV], ["$DX_ENV $1='$2'"])]) + +# DX_DIRNAME_EXPR +# --------------- +# Expand into a shell expression prints the directory part of a path. +AC_DEFUN([DX_DIRNAME_EXPR], + [[expr ".$1" : '\(\.\)[^/]*$' \| "x$1" : 'x\(.*\)/[^/]*$']]) + +# DX_IF_FEATURE(FEATURE, IF-ON, IF-OFF) +# ------------------------------------- +# Expands according to the M4 (static) status of the feature. +AC_DEFUN([DX_IF_FEATURE], [ifelse(DX_FEATURE_$1, ON, [$2], [$3])]) + +# DX_REQUIRE_PROG(VARIABLE, PROGRAM) +# ---------------------------------- +# Require the specified program to be found for the DX_CURRENT_FEATURE to work. +AC_DEFUN([DX_REQUIRE_PROG], [ +AC_PATH_TOOL([$1], [$2]) +if test "$DX_FLAG_$[DX_CURRENT_FEATURE$$1]" = 1; then + AC_MSG_WARN([$2 not found - will not DX_CURRENT_DESCRIPTION]) + AC_SUBST([DX_FLAG_]DX_CURRENT_FEATURE, 0) +fi +]) + +# DX_TEST_FEATURE(FEATURE) +# ------------------------ +# Expand to a shell expression testing whether the feature is active. +AC_DEFUN([DX_TEST_FEATURE], [test "$DX_FLAG_$1" = 1]) + +# DX_CHECK_DEPEND(REQUIRED_FEATURE, REQUIRED_STATE) +# ------------------------------------------------- +# Verify that a required features has the right state before trying to turn on +# the DX_CURRENT_FEATURE. +AC_DEFUN([DX_CHECK_DEPEND], [ +test "$DX_FLAG_$1" = "$2" \ +|| AC_MSG_ERROR([doxygen-DX_CURRENT_FEATURE ifelse([$2], 1, + requires, contradicts) doxygen-DX_CURRENT_FEATURE]) +]) + +# DX_CLEAR_DEPEND(FEATURE, REQUIRED_FEATURE, REQUIRED_STATE) +# ---------------------------------------------------------- +# Turn off the DX_CURRENT_FEATURE if the required feature is off. +AC_DEFUN([DX_CLEAR_DEPEND], [ +test "$DX_FLAG_$1" = "$2" || AC_SUBST([DX_FLAG_]DX_CURRENT_FEATURE, 0) +]) + +# DX_FEATURE_ARG(FEATURE, DESCRIPTION, +# CHECK_DEPEND, CLEAR_DEPEND, +# REQUIRE, DO-IF-ON, DO-IF-OFF) +# -------------------------------------------- +# Parse the command-line option controlling a feature. CHECK_DEPEND is called +# if the user explicitly turns the feature on (and invokes DX_CHECK_DEPEND), +# otherwise CLEAR_DEPEND is called to turn off the default state if a required +# feature is disabled (using DX_CLEAR_DEPEND). REQUIRE performs additional +# requirement tests (DX_REQUIRE_PROG). Finally, an automake flag is set and +# DO-IF-ON or DO-IF-OFF are called according to the final state of the feature. +AC_DEFUN([DX_ARG_ABLE], [ + AC_DEFUN([DX_CURRENT_FEATURE], [$1]) + AC_DEFUN([DX_CURRENT_DESCRIPTION], [$2]) + AC_ARG_ENABLE(doxygen-$1, + [AS_HELP_STRING(DX_IF_FEATURE([$1], [--disable-doxygen-$1], + [--enable-doxygen-$1]), + DX_IF_FEATURE([$1], [don't $2], [$2]))], + [ +case "$enableval" in +#( +y|Y|yes|Yes|YES) + AC_SUBST([DX_FLAG_$1], 1) + $3 +;; #( +n|N|no|No|NO) + AC_SUBST([DX_FLAG_$1], 0) +;; #( +*) + AC_MSG_ERROR([invalid value '$enableval' given to doxygen-$1]) +;; +esac +], [ +AC_SUBST([DX_FLAG_$1], [DX_IF_FEATURE([$1], 1, 0)]) +$4 +]) +if DX_TEST_FEATURE([$1]); then + $5 + : +fi +if DX_TEST_FEATURE([$1]); then + AM_CONDITIONAL(DX_COND_$1, :) + $6 + : +else + AM_CONDITIONAL(DX_COND_$1, false) + $7 + : +fi +]) + +## -------------- ## +## Public macros. ## +## -------------- ## + +# DX_XXX_FEATURE(DEFAULT_STATE) +# ----------------------------- +AC_DEFUN([DX_DOXYGEN_FEATURE], [AC_DEFUN([DX_FEATURE_doc], [$1])]) +AC_DEFUN([DX_MAN_FEATURE], [AC_DEFUN([DX_FEATURE_man], [$1])]) +AC_DEFUN([DX_HTML_FEATURE], [AC_DEFUN([DX_FEATURE_html], [$1])]) +AC_DEFUN([DX_CHM_FEATURE], [AC_DEFUN([DX_FEATURE_chm], [$1])]) +AC_DEFUN([DX_CHI_FEATURE], [AC_DEFUN([DX_FEATURE_chi], [$1])]) +AC_DEFUN([DX_RTF_FEATURE], [AC_DEFUN([DX_FEATURE_rtf], [$1])]) +AC_DEFUN([DX_XML_FEATURE], [AC_DEFUN([DX_FEATURE_xml], [$1])]) +AC_DEFUN([DX_XML_FEATURE], [AC_DEFUN([DX_FEATURE_xml], [$1])]) +AC_DEFUN([DX_PDF_FEATURE], [AC_DEFUN([DX_FEATURE_pdf], [$1])]) +AC_DEFUN([DX_PS_FEATURE], [AC_DEFUN([DX_FEATURE_ps], [$1])]) + +# DX_INIT_DOXYGEN(PROJECT, [CONFIG-FILE], [OUTPUT-DOC-DIR]) +# --------------------------------------------------------- +# PROJECT also serves as the base name for the documentation files. +# The default CONFIG-FILE is "Doxyfile" and OUTPUT-DOC-DIR is "doxygen-doc". +AC_DEFUN([DX_INIT_DOXYGEN], [ + +# Files: +AC_SUBST([DX_PROJECT], [$1]) +AC_SUBST([DX_CONFIG], [ifelse([$2], [], Doxyfile, [$2])]) +AC_SUBST([DX_DOCDIR], [ifelse([$3], [], doxygen-doc, [$3])]) + +# Environment variables used inside doxygen.cfg: +DX_ENV_APPEND(SRCDIR, $srcdir) +DX_ENV_APPEND(PROJECT, $DX_PROJECT) +DX_ENV_APPEND(DOCDIR, $DX_DOCDIR) +DX_ENV_APPEND(VERSION, $PACKAGE_VERSION) + +# Doxygen itself: +DX_ARG_ABLE(doc, [generate any doxygen documentation], + [], + [], + [DX_REQUIRE_PROG([DX_DOXYGEN], doxygen) + DX_REQUIRE_PROG([DX_PERL], perl)], + [DX_ENV_APPEND(PERL_PATH, $DX_PERL)]) + +# Dot for graphics: +DX_ARG_ABLE(dot, [generate graphics for doxygen documentation], + [DX_CHECK_DEPEND(doc, 1)], + [DX_CLEAR_DEPEND(doc, 1)], + [DX_REQUIRE_PROG([DX_DOT], dot)], + [DX_ENV_APPEND(HAVE_DOT, YES) + DX_ENV_APPEND(DOT_PATH, [`DX_DIRNAME_EXPR($DX_DOT)`])], + [DX_ENV_APPEND(HAVE_DOT, NO)]) + +# Man pages generation: +DX_ARG_ABLE(man, [generate doxygen manual pages], + [DX_CHECK_DEPEND(doc, 1)], + [DX_CLEAR_DEPEND(doc, 1)], + [], + [DX_ENV_APPEND(GENERATE_MAN, YES)], + [DX_ENV_APPEND(GENERATE_MAN, NO)]) + +# RTF file generation: +DX_ARG_ABLE(rtf, [generate doxygen RTF documentation], + [DX_CHECK_DEPEND(doc, 1)], + [DX_CLEAR_DEPEND(doc, 1)], + [], + [DX_ENV_APPEND(GENERATE_RTF, YES)], + [DX_ENV_APPEND(GENERATE_RTF, NO)]) + +# XML file generation: +DX_ARG_ABLE(xml, [generate doxygen XML documentation], + [DX_CHECK_DEPEND(doc, 1)], + [DX_CLEAR_DEPEND(doc, 1)], + [], + [DX_ENV_APPEND(GENERATE_XML, YES)], + [DX_ENV_APPEND(GENERATE_XML, NO)]) + +# (Compressed) HTML help generation: +DX_ARG_ABLE(chm, [generate doxygen compressed HTML help documentation], + [DX_CHECK_DEPEND(doc, 1)], + [DX_CLEAR_DEPEND(doc, 1)], + [DX_REQUIRE_PROG([DX_HHC], hhc)], + [DX_ENV_APPEND(HHC_PATH, $DX_HHC) + DX_ENV_APPEND(GENERATE_HTML, YES) + DX_ENV_APPEND(GENERATE_HTMLHELP, YES)], + [DX_ENV_APPEND(GENERATE_HTMLHELP, NO)]) + +# Seperate CHI file generation. +DX_ARG_ABLE(chi, [generate doxygen seperate compressed HTML help index file], + [DX_CHECK_DEPEND(chm, 1)], + [DX_CLEAR_DEPEND(chm, 1)], + [], + [DX_ENV_APPEND(GENERATE_CHI, YES)], + [DX_ENV_APPEND(GENERATE_CHI, NO)]) + +# Plain HTML pages generation: +DX_ARG_ABLE(html, [generate doxygen plain HTML documentation], + [DX_CHECK_DEPEND(doc, 1) DX_CHECK_DEPEND(chm, 0)], + [DX_CLEAR_DEPEND(doc, 1) DX_CLEAR_DEPEND(chm, 0)], + [], + [DX_ENV_APPEND(GENERATE_HTML, YES)], + [DX_TEST_FEATURE(chm) || DX_ENV_APPEND(GENERATE_HTML, NO)]) + +# PostScript file generation: +DX_ARG_ABLE(ps, [generate doxygen PostScript documentation], + [DX_CHECK_DEPEND(doc, 1)], + [DX_CLEAR_DEPEND(doc, 1)], + [DX_REQUIRE_PROG([DX_LATEX], latex) + DX_REQUIRE_PROG([DX_MAKEINDEX], makeindex) + DX_REQUIRE_PROG([DX_DVIPS], dvips) + DX_REQUIRE_PROG([DX_EGREP], egrep)]) + +# PDF file generation: +DX_ARG_ABLE(pdf, [generate doxygen PDF documentation], + [DX_CHECK_DEPEND(doc, 1)], + [DX_CLEAR_DEPEND(doc, 1)], + [DX_REQUIRE_PROG([DX_PDFLATEX], pdflatex) + DX_REQUIRE_PROG([DX_MAKEINDEX], makeindex) + DX_REQUIRE_PROG([DX_EGREP], egrep)]) + +# LaTeX generation for PS and/or PDF: +if DX_TEST_FEATURE(ps) || DX_TEST_FEATURE(pdf); then + AM_CONDITIONAL(DX_COND_latex, :) + DX_ENV_APPEND(GENERATE_LATEX, YES) +else + AM_CONDITIONAL(DX_COND_latex, false) + DX_ENV_APPEND(GENERATE_LATEX, NO) +fi + +# Paper size for PS and/or PDF: +AC_ARG_VAR(DOXYGEN_PAPER_SIZE, + [a4wide (default), a4, letter, legal or executive]) +case "$DOXYGEN_PAPER_SIZE" in +#( +"") + AC_SUBST(DOXYGEN_PAPER_SIZE, "") +;; #( +a4wide|a4|letter|legal|executive) + DX_ENV_APPEND(PAPER_SIZE, $DOXYGEN_PAPER_SIZE) +;; #( +*) + AC_MSG_ERROR([unknown DOXYGEN_PAPER_SIZE='$DOXYGEN_PAPER_SIZE']) +;; +esac + +#For debugging: +#echo DX_FLAG_doc=$DX_FLAG_doc +#echo DX_FLAG_dot=$DX_FLAG_dot +#echo DX_FLAG_man=$DX_FLAG_man +#echo DX_FLAG_html=$DX_FLAG_html +#echo DX_FLAG_chm=$DX_FLAG_chm +#echo DX_FLAG_chi=$DX_FLAG_chi +#echo DX_FLAG_rtf=$DX_FLAG_rtf +#echo DX_FLAG_xml=$DX_FLAG_xml +#echo DX_FLAG_pdf=$DX_FLAG_pdf +#echo DX_FLAG_ps=$DX_FLAG_ps +#echo DX_ENV=$DX_ENV +]) diff --git a/pkg/registry/zookeeper-3.4.6/src/c/aclocal.m4 b/pkg/registry/zookeeper-3.4.6/src/c/aclocal.m4 new file mode 100644 index 000000000..95e810ce1 --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/c/aclocal.m4 @@ -0,0 +1,9706 @@ +# generated automatically by aclocal 1.11.6 -*- Autoconf -*- + +# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, +# 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software Foundation, +# Inc. +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +m4_ifndef([AC_AUTOCONF_VERSION], + [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl +m4_if(m4_defn([AC_AUTOCONF_VERSION]), [2.69],, +[m4_warning([this file was generated for autoconf 2.69. +You have another version of autoconf. It may work, but is not guaranteed to. +If you have problems, you may need to regenerate the build system entirely. +To do so, use the procedure documented by the package, typically `autoreconf'.])]) + +dnl +dnl AM_PATH_CPPUNIT(MINIMUM-VERSION, [ACTION-IF-FOUND [, ACTION-IF-NOT-FOUND]]) +dnl +AC_DEFUN([AM_PATH_CPPUNIT], +[ + +AC_ARG_WITH(cppunit-prefix,[ --with-cppunit-prefix=PFX Prefix where CppUnit is installed (optional)], + cppunit_config_prefix="$withval", cppunit_config_prefix="") +AC_ARG_WITH(cppunit-exec-prefix,[ --with-cppunit-exec-prefix=PFX Exec prefix where CppUnit is installed (optional)], + cppunit_config_exec_prefix="$withval", cppunit_config_exec_prefix="") + + if test x$cppunit_config_exec_prefix != x ; then + cppunit_config_args="$cppunit_config_args --exec-prefix=$cppunit_config_exec_prefix" + if test x${CPPUNIT_CONFIG+set} != xset ; then + CPPUNIT_CONFIG=$cppunit_config_exec_prefix/bin/cppunit-config + fi + fi + if test x$cppunit_config_prefix != x ; then + cppunit_config_args="$cppunit_config_args --prefix=$cppunit_config_prefix" + if test x${CPPUNIT_CONFIG+set} != xset ; then + CPPUNIT_CONFIG=$cppunit_config_prefix/bin/cppunit-config + fi + fi + + AC_PATH_PROG(CPPUNIT_CONFIG, cppunit-config, no) + cppunit_version_min=$1 + + AC_MSG_CHECKING(for Cppunit - version >= $cppunit_version_min) + no_cppunit="" + if test "$CPPUNIT_CONFIG" = "no" ; then + AC_MSG_RESULT(no) + no_cppunit=yes + else + CPPUNIT_CFLAGS=`$CPPUNIT_CONFIG --cflags` + CPPUNIT_LIBS=`$CPPUNIT_CONFIG --libs` + cppunit_version=`$CPPUNIT_CONFIG --version` + + cppunit_major_version=`echo $cppunit_version | \ + sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\1/'` + cppunit_minor_version=`echo $cppunit_version | \ + sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\2/'` + cppunit_micro_version=`echo $cppunit_version | \ + sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\3/'` + + cppunit_major_min=`echo $cppunit_version_min | \ + sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\1/'` + if test "x${cppunit_major_min}" = "x" ; then + cppunit_major_min=0 + fi + + cppunit_minor_min=`echo $cppunit_version_min | \ + sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\2/'` + if test "x${cppunit_minor_min}" = "x" ; then + cppunit_minor_min=0 + fi + + cppunit_micro_min=`echo $cppunit_version_min | \ + sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\3/'` + if test "x${cppunit_micro_min}" = "x" ; then + cppunit_micro_min=0 + fi + + cppunit_version_proper=`expr \ + $cppunit_major_version \> $cppunit_major_min \| \ + $cppunit_major_version \= $cppunit_major_min \& \ + $cppunit_minor_version \> $cppunit_minor_min \| \ + $cppunit_major_version \= $cppunit_major_min \& \ + $cppunit_minor_version \= $cppunit_minor_min \& \ + $cppunit_micro_version \>= $cppunit_micro_min ` + + if test "$cppunit_version_proper" = "1" ; then + AC_MSG_RESULT([$cppunit_major_version.$cppunit_minor_version.$cppunit_micro_version]) + else + AC_MSG_RESULT(no) + no_cppunit=yes + fi + fi + + if test "x$no_cppunit" = x ; then + ifelse([$2], , :, [$2]) + else + CPPUNIT_CFLAGS="" + CPPUNIT_LIBS="" + ifelse([$3], , :, [$3]) + fi + + AC_SUBST(CPPUNIT_CFLAGS) + AC_SUBST(CPPUNIT_LIBS) +]) + + + + +# libtool.m4 - Configure libtool for the host system. -*-Autoconf-*- +# +# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005, +# 2006, 2007, 2008, 2009, 2010, 2011 Free Software +# Foundation, Inc. +# Written by Gordon Matzigkeit, 1996 +# +# This file is free software; the Free Software Foundation gives +# unlimited permission to copy and/or distribute it, with or without +# modifications, as long as this notice is preserved. + +m4_define([_LT_COPYING], [dnl +# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005, +# 2006, 2007, 2008, 2009, 2010, 2011 Free Software +# Foundation, Inc. +# Written by Gordon Matzigkeit, 1996 +# +# This file is part of GNU Libtool. +# +# GNU Libtool is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License as +# published by the Free Software Foundation; either version 2 of +# the License, or (at your option) any later version. +# +# As a special exception to the GNU General Public License, +# if you distribute this file as part of a program or library that +# is built using GNU Libtool, you may include this file under the +# same distribution terms that you use for the rest of that program. +# +# GNU Libtool is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with GNU Libtool; see the file COPYING. If not, a copy +# can be downloaded from http://www.gnu.org/licenses/gpl.html, or +# obtained by writing to the Free Software Foundation, Inc., +# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +]) + +# serial 57 LT_INIT + + +# LT_PREREQ(VERSION) +# ------------------ +# Complain and exit if this libtool version is less that VERSION. +m4_defun([LT_PREREQ], +[m4_if(m4_version_compare(m4_defn([LT_PACKAGE_VERSION]), [$1]), -1, + [m4_default([$3], + [m4_fatal([Libtool version $1 or higher is required], + 63)])], + [$2])]) + + +# _LT_CHECK_BUILDDIR +# ------------------ +# Complain if the absolute build directory name contains unusual characters +m4_defun([_LT_CHECK_BUILDDIR], +[case `pwd` in + *\ * | *\ *) + AC_MSG_WARN([Libtool does not cope well with whitespace in `pwd`]) ;; +esac +]) + + +# LT_INIT([OPTIONS]) +# ------------------ +AC_DEFUN([LT_INIT], +[AC_PREREQ([2.58])dnl We use AC_INCLUDES_DEFAULT +AC_REQUIRE([AC_CONFIG_AUX_DIR_DEFAULT])dnl +AC_BEFORE([$0], [LT_LANG])dnl +AC_BEFORE([$0], [LT_OUTPUT])dnl +AC_BEFORE([$0], [LTDL_INIT])dnl +m4_require([_LT_CHECK_BUILDDIR])dnl + +dnl Autoconf doesn't catch unexpanded LT_ macros by default: +m4_pattern_forbid([^_?LT_[A-Z_]+$])dnl +m4_pattern_allow([^(_LT_EOF|LT_DLGLOBAL|LT_DLLAZY_OR_NOW|LT_MULTI_MODULE)$])dnl +dnl aclocal doesn't pull ltoptions.m4, ltsugar.m4, or ltversion.m4 +dnl unless we require an AC_DEFUNed macro: +AC_REQUIRE([LTOPTIONS_VERSION])dnl +AC_REQUIRE([LTSUGAR_VERSION])dnl +AC_REQUIRE([LTVERSION_VERSION])dnl +AC_REQUIRE([LTOBSOLETE_VERSION])dnl +m4_require([_LT_PROG_LTMAIN])dnl + +_LT_SHELL_INIT([SHELL=${CONFIG_SHELL-/bin/sh}]) + +dnl Parse OPTIONS +_LT_SET_OPTIONS([$0], [$1]) + +# This can be used to rebuild libtool when needed +LIBTOOL_DEPS="$ltmain" + +# Always use our own libtool. +LIBTOOL='$(SHELL) $(top_builddir)/libtool' +AC_SUBST(LIBTOOL)dnl + +_LT_SETUP + +# Only expand once: +m4_define([LT_INIT]) +])# LT_INIT + +# Old names: +AU_ALIAS([AC_PROG_LIBTOOL], [LT_INIT]) +AU_ALIAS([AM_PROG_LIBTOOL], [LT_INIT]) +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AC_PROG_LIBTOOL], []) +dnl AC_DEFUN([AM_PROG_LIBTOOL], []) + + +# _LT_CC_BASENAME(CC) +# ------------------- +# Calculate cc_basename. Skip known compiler wrappers and cross-prefix. +m4_defun([_LT_CC_BASENAME], +[for cc_temp in $1""; do + case $cc_temp in + compile | *[[\\/]]compile | ccache | *[[\\/]]ccache ) ;; + distcc | *[[\\/]]distcc | purify | *[[\\/]]purify ) ;; + \-*) ;; + *) break;; + esac +done +cc_basename=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"` +]) + + +# _LT_FILEUTILS_DEFAULTS +# ---------------------- +# It is okay to use these file commands and assume they have been set +# sensibly after `m4_require([_LT_FILEUTILS_DEFAULTS])'. +m4_defun([_LT_FILEUTILS_DEFAULTS], +[: ${CP="cp -f"} +: ${MV="mv -f"} +: ${RM="rm -f"} +])# _LT_FILEUTILS_DEFAULTS + + +# _LT_SETUP +# --------- +m4_defun([_LT_SETUP], +[AC_REQUIRE([AC_CANONICAL_HOST])dnl +AC_REQUIRE([AC_CANONICAL_BUILD])dnl +AC_REQUIRE([_LT_PREPARE_SED_QUOTE_VARS])dnl +AC_REQUIRE([_LT_PROG_ECHO_BACKSLASH])dnl + +_LT_DECL([], [PATH_SEPARATOR], [1], [The PATH separator for the build system])dnl +dnl +_LT_DECL([], [host_alias], [0], [The host system])dnl +_LT_DECL([], [host], [0])dnl +_LT_DECL([], [host_os], [0])dnl +dnl +_LT_DECL([], [build_alias], [0], [The build system])dnl +_LT_DECL([], [build], [0])dnl +_LT_DECL([], [build_os], [0])dnl +dnl +AC_REQUIRE([AC_PROG_CC])dnl +AC_REQUIRE([LT_PATH_LD])dnl +AC_REQUIRE([LT_PATH_NM])dnl +dnl +AC_REQUIRE([AC_PROG_LN_S])dnl +test -z "$LN_S" && LN_S="ln -s" +_LT_DECL([], [LN_S], [1], [Whether we need soft or hard links])dnl +dnl +AC_REQUIRE([LT_CMD_MAX_LEN])dnl +_LT_DECL([objext], [ac_objext], [0], [Object file suffix (normally "o")])dnl +_LT_DECL([], [exeext], [0], [Executable file suffix (normally "")])dnl +dnl +m4_require([_LT_FILEUTILS_DEFAULTS])dnl +m4_require([_LT_CHECK_SHELL_FEATURES])dnl +m4_require([_LT_PATH_CONVERSION_FUNCTIONS])dnl +m4_require([_LT_CMD_RELOAD])dnl +m4_require([_LT_CHECK_MAGIC_METHOD])dnl +m4_require([_LT_CHECK_SHAREDLIB_FROM_LINKLIB])dnl +m4_require([_LT_CMD_OLD_ARCHIVE])dnl +m4_require([_LT_CMD_GLOBAL_SYMBOLS])dnl +m4_require([_LT_WITH_SYSROOT])dnl + +_LT_CONFIG_LIBTOOL_INIT([ +# See if we are running on zsh, and set the options which allow our +# commands through without removal of \ escapes INIT. +if test -n "\${ZSH_VERSION+set}" ; then + setopt NO_GLOB_SUBST +fi +]) +if test -n "${ZSH_VERSION+set}" ; then + setopt NO_GLOB_SUBST +fi + +_LT_CHECK_OBJDIR + +m4_require([_LT_TAG_COMPILER])dnl + +case $host_os in +aix3*) + # AIX sometimes has problems with the GCC collect2 program. For some + # reason, if we set the COLLECT_NAMES environment variable, the problems + # vanish in a puff of smoke. + if test "X${COLLECT_NAMES+set}" != Xset; then + COLLECT_NAMES= + export COLLECT_NAMES + fi + ;; +esac + +# Global variables: +ofile=libtool +can_build_shared=yes + +# All known linkers require a `.a' archive for static linking (except MSVC, +# which needs '.lib'). +libext=a + +with_gnu_ld="$lt_cv_prog_gnu_ld" + +old_CC="$CC" +old_CFLAGS="$CFLAGS" + +# Set sane defaults for various variables +test -z "$CC" && CC=cc +test -z "$LTCC" && LTCC=$CC +test -z "$LTCFLAGS" && LTCFLAGS=$CFLAGS +test -z "$LD" && LD=ld +test -z "$ac_objext" && ac_objext=o + +_LT_CC_BASENAME([$compiler]) + +# Only perform the check for file, if the check method requires it +test -z "$MAGIC_CMD" && MAGIC_CMD=file +case $deplibs_check_method in +file_magic*) + if test "$file_magic_cmd" = '$MAGIC_CMD'; then + _LT_PATH_MAGIC + fi + ;; +esac + +# Use C for the default configuration in the libtool script +LT_SUPPORTED_TAG([CC]) +_LT_LANG_C_CONFIG +_LT_LANG_DEFAULT_CONFIG +_LT_CONFIG_COMMANDS +])# _LT_SETUP + + +# _LT_PREPARE_SED_QUOTE_VARS +# -------------------------- +# Define a few sed substitution that help us do robust quoting. +m4_defun([_LT_PREPARE_SED_QUOTE_VARS], +[# Backslashify metacharacters that are still active within +# double-quoted strings. +sed_quote_subst='s/\([["`$\\]]\)/\\\1/g' + +# Same as above, but do not quote variable references. +double_quote_subst='s/\([["`\\]]\)/\\\1/g' + +# Sed substitution to delay expansion of an escaped shell variable in a +# double_quote_subst'ed string. +delay_variable_subst='s/\\\\\\\\\\\$/\\\\\\$/g' + +# Sed substitution to delay expansion of an escaped single quote. +delay_single_quote_subst='s/'\''/'\'\\\\\\\'\''/g' + +# Sed substitution to avoid accidental globbing in evaled expressions +no_glob_subst='s/\*/\\\*/g' +]) + +# _LT_PROG_LTMAIN +# --------------- +# Note that this code is called both from `configure', and `config.status' +# now that we use AC_CONFIG_COMMANDS to generate libtool. Notably, +# `config.status' has no value for ac_aux_dir unless we are using Automake, +# so we pass a copy along to make sure it has a sensible value anyway. +m4_defun([_LT_PROG_LTMAIN], +[m4_ifdef([AC_REQUIRE_AUX_FILE], [AC_REQUIRE_AUX_FILE([ltmain.sh])])dnl +_LT_CONFIG_LIBTOOL_INIT([ac_aux_dir='$ac_aux_dir']) +ltmain="$ac_aux_dir/ltmain.sh" +])# _LT_PROG_LTMAIN + + + +# So that we can recreate a full libtool script including additional +# tags, we accumulate the chunks of code to send to AC_CONFIG_COMMANDS +# in macros and then make a single call at the end using the `libtool' +# label. + + +# _LT_CONFIG_LIBTOOL_INIT([INIT-COMMANDS]) +# ---------------------------------------- +# Register INIT-COMMANDS to be passed to AC_CONFIG_COMMANDS later. +m4_define([_LT_CONFIG_LIBTOOL_INIT], +[m4_ifval([$1], + [m4_append([_LT_OUTPUT_LIBTOOL_INIT], + [$1 +])])]) + +# Initialize. +m4_define([_LT_OUTPUT_LIBTOOL_INIT]) + + +# _LT_CONFIG_LIBTOOL([COMMANDS]) +# ------------------------------ +# Register COMMANDS to be passed to AC_CONFIG_COMMANDS later. +m4_define([_LT_CONFIG_LIBTOOL], +[m4_ifval([$1], + [m4_append([_LT_OUTPUT_LIBTOOL_COMMANDS], + [$1 +])])]) + +# Initialize. +m4_define([_LT_OUTPUT_LIBTOOL_COMMANDS]) + + +# _LT_CONFIG_SAVE_COMMANDS([COMMANDS], [INIT_COMMANDS]) +# ----------------------------------------------------- +m4_defun([_LT_CONFIG_SAVE_COMMANDS], +[_LT_CONFIG_LIBTOOL([$1]) +_LT_CONFIG_LIBTOOL_INIT([$2]) +]) + + +# _LT_FORMAT_COMMENT([COMMENT]) +# ----------------------------- +# Add leading comment marks to the start of each line, and a trailing +# full-stop to the whole comment if one is not present already. +m4_define([_LT_FORMAT_COMMENT], +[m4_ifval([$1], [ +m4_bpatsubst([m4_bpatsubst([$1], [^ *], [# ])], + [['`$\]], [\\\&])]m4_bmatch([$1], [[!?.]$], [], [.]) +)]) + + + + + +# _LT_DECL([CONFIGNAME], VARNAME, VALUE, [DESCRIPTION], [IS-TAGGED?]) +# ------------------------------------------------------------------- +# CONFIGNAME is the name given to the value in the libtool script. +# VARNAME is the (base) name used in the configure script. +# VALUE may be 0, 1 or 2 for a computed quote escaped value based on +# VARNAME. Any other value will be used directly. +m4_define([_LT_DECL], +[lt_if_append_uniq([lt_decl_varnames], [$2], [, ], + [lt_dict_add_subkey([lt_decl_dict], [$2], [libtool_name], + [m4_ifval([$1], [$1], [$2])]) + lt_dict_add_subkey([lt_decl_dict], [$2], [value], [$3]) + m4_ifval([$4], + [lt_dict_add_subkey([lt_decl_dict], [$2], [description], [$4])]) + lt_dict_add_subkey([lt_decl_dict], [$2], + [tagged?], [m4_ifval([$5], [yes], [no])])]) +]) + + +# _LT_TAGDECL([CONFIGNAME], VARNAME, VALUE, [DESCRIPTION]) +# -------------------------------------------------------- +m4_define([_LT_TAGDECL], [_LT_DECL([$1], [$2], [$3], [$4], [yes])]) + + +# lt_decl_tag_varnames([SEPARATOR], [VARNAME1...]) +# ------------------------------------------------ +m4_define([lt_decl_tag_varnames], +[_lt_decl_filter([tagged?], [yes], $@)]) + + +# _lt_decl_filter(SUBKEY, VALUE, [SEPARATOR], [VARNAME1..]) +# --------------------------------------------------------- +m4_define([_lt_decl_filter], +[m4_case([$#], + [0], [m4_fatal([$0: too few arguments: $#])], + [1], [m4_fatal([$0: too few arguments: $#: $1])], + [2], [lt_dict_filter([lt_decl_dict], [$1], [$2], [], lt_decl_varnames)], + [3], [lt_dict_filter([lt_decl_dict], [$1], [$2], [$3], lt_decl_varnames)], + [lt_dict_filter([lt_decl_dict], $@)])[]dnl +]) + + +# lt_decl_quote_varnames([SEPARATOR], [VARNAME1...]) +# -------------------------------------------------- +m4_define([lt_decl_quote_varnames], +[_lt_decl_filter([value], [1], $@)]) + + +# lt_decl_dquote_varnames([SEPARATOR], [VARNAME1...]) +# --------------------------------------------------- +m4_define([lt_decl_dquote_varnames], +[_lt_decl_filter([value], [2], $@)]) + + +# lt_decl_varnames_tagged([SEPARATOR], [VARNAME1...]) +# --------------------------------------------------- +m4_define([lt_decl_varnames_tagged], +[m4_assert([$# <= 2])dnl +_$0(m4_quote(m4_default([$1], [[, ]])), + m4_ifval([$2], [[$2]], [m4_dquote(lt_decl_tag_varnames)]), + m4_split(m4_normalize(m4_quote(_LT_TAGS)), [ ]))]) +m4_define([_lt_decl_varnames_tagged], +[m4_ifval([$3], [lt_combine([$1], [$2], [_], $3)])]) + + +# lt_decl_all_varnames([SEPARATOR], [VARNAME1...]) +# ------------------------------------------------ +m4_define([lt_decl_all_varnames], +[_$0(m4_quote(m4_default([$1], [[, ]])), + m4_if([$2], [], + m4_quote(lt_decl_varnames), + m4_quote(m4_shift($@))))[]dnl +]) +m4_define([_lt_decl_all_varnames], +[lt_join($@, lt_decl_varnames_tagged([$1], + lt_decl_tag_varnames([[, ]], m4_shift($@))))dnl +]) + + +# _LT_CONFIG_STATUS_DECLARE([VARNAME]) +# ------------------------------------ +# Quote a variable value, and forward it to `config.status' so that its +# declaration there will have the same value as in `configure'. VARNAME +# must have a single quote delimited value for this to work. +m4_define([_LT_CONFIG_STATUS_DECLARE], +[$1='`$ECHO "$][$1" | $SED "$delay_single_quote_subst"`']) + + +# _LT_CONFIG_STATUS_DECLARATIONS +# ------------------------------ +# We delimit libtool config variables with single quotes, so when +# we write them to config.status, we have to be sure to quote all +# embedded single quotes properly. In configure, this macro expands +# each variable declared with _LT_DECL (and _LT_TAGDECL) into: +# +# ='`$ECHO "$" | $SED "$delay_single_quote_subst"`' +m4_defun([_LT_CONFIG_STATUS_DECLARATIONS], +[m4_foreach([_lt_var], m4_quote(lt_decl_all_varnames), + [m4_n([_LT_CONFIG_STATUS_DECLARE(_lt_var)])])]) + + +# _LT_LIBTOOL_TAGS +# ---------------- +# Output comment and list of tags supported by the script +m4_defun([_LT_LIBTOOL_TAGS], +[_LT_FORMAT_COMMENT([The names of the tagged configurations supported by this script])dnl +available_tags="_LT_TAGS"dnl +]) + + +# _LT_LIBTOOL_DECLARE(VARNAME, [TAG]) +# ----------------------------------- +# Extract the dictionary values for VARNAME (optionally with TAG) and +# expand to a commented shell variable setting: +# +# # Some comment about what VAR is for. +# visible_name=$lt_internal_name +m4_define([_LT_LIBTOOL_DECLARE], +[_LT_FORMAT_COMMENT(m4_quote(lt_dict_fetch([lt_decl_dict], [$1], + [description])))[]dnl +m4_pushdef([_libtool_name], + m4_quote(lt_dict_fetch([lt_decl_dict], [$1], [libtool_name])))[]dnl +m4_case(m4_quote(lt_dict_fetch([lt_decl_dict], [$1], [value])), + [0], [_libtool_name=[$]$1], + [1], [_libtool_name=$lt_[]$1], + [2], [_libtool_name=$lt_[]$1], + [_libtool_name=lt_dict_fetch([lt_decl_dict], [$1], [value])])[]dnl +m4_ifval([$2], [_$2])[]m4_popdef([_libtool_name])[]dnl +]) + + +# _LT_LIBTOOL_CONFIG_VARS +# ----------------------- +# Produce commented declarations of non-tagged libtool config variables +# suitable for insertion in the LIBTOOL CONFIG section of the `libtool' +# script. Tagged libtool config variables (even for the LIBTOOL CONFIG +# section) are produced by _LT_LIBTOOL_TAG_VARS. +m4_defun([_LT_LIBTOOL_CONFIG_VARS], +[m4_foreach([_lt_var], + m4_quote(_lt_decl_filter([tagged?], [no], [], lt_decl_varnames)), + [m4_n([_LT_LIBTOOL_DECLARE(_lt_var)])])]) + + +# _LT_LIBTOOL_TAG_VARS(TAG) +# ------------------------- +m4_define([_LT_LIBTOOL_TAG_VARS], +[m4_foreach([_lt_var], m4_quote(lt_decl_tag_varnames), + [m4_n([_LT_LIBTOOL_DECLARE(_lt_var, [$1])])])]) + + +# _LT_TAGVAR(VARNAME, [TAGNAME]) +# ------------------------------ +m4_define([_LT_TAGVAR], [m4_ifval([$2], [$1_$2], [$1])]) + + +# _LT_CONFIG_COMMANDS +# ------------------- +# Send accumulated output to $CONFIG_STATUS. Thanks to the lists of +# variables for single and double quote escaping we saved from calls +# to _LT_DECL, we can put quote escaped variables declarations +# into `config.status', and then the shell code to quote escape them in +# for loops in `config.status'. Finally, any additional code accumulated +# from calls to _LT_CONFIG_LIBTOOL_INIT is expanded. +m4_defun([_LT_CONFIG_COMMANDS], +[AC_PROVIDE_IFELSE([LT_OUTPUT], + dnl If the libtool generation code has been placed in $CONFIG_LT, + dnl instead of duplicating it all over again into config.status, + dnl then we will have config.status run $CONFIG_LT later, so it + dnl needs to know what name is stored there: + [AC_CONFIG_COMMANDS([libtool], + [$SHELL $CONFIG_LT || AS_EXIT(1)], [CONFIG_LT='$CONFIG_LT'])], + dnl If the libtool generation code is destined for config.status, + dnl expand the accumulated commands and init code now: + [AC_CONFIG_COMMANDS([libtool], + [_LT_OUTPUT_LIBTOOL_COMMANDS], [_LT_OUTPUT_LIBTOOL_COMMANDS_INIT])]) +])#_LT_CONFIG_COMMANDS + + +# Initialize. +m4_define([_LT_OUTPUT_LIBTOOL_COMMANDS_INIT], +[ + +# The HP-UX ksh and POSIX shell print the target directory to stdout +# if CDPATH is set. +(unset CDPATH) >/dev/null 2>&1 && unset CDPATH + +sed_quote_subst='$sed_quote_subst' +double_quote_subst='$double_quote_subst' +delay_variable_subst='$delay_variable_subst' +_LT_CONFIG_STATUS_DECLARATIONS +LTCC='$LTCC' +LTCFLAGS='$LTCFLAGS' +compiler='$compiler_DEFAULT' + +# A function that is used when there is no print builtin or printf. +func_fallback_echo () +{ + eval 'cat <<_LTECHO_EOF +\$[]1 +_LTECHO_EOF' +} + +# Quote evaled strings. +for var in lt_decl_all_varnames([[ \ +]], lt_decl_quote_varnames); do + case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in + *[[\\\\\\\`\\"\\\$]]*) + eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED \\"\\\$sed_quote_subst\\"\\\`\\\\\\"" + ;; + *) + eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\"" + ;; + esac +done + +# Double-quote double-evaled strings. +for var in lt_decl_all_varnames([[ \ +]], lt_decl_dquote_varnames); do + case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in + *[[\\\\\\\`\\"\\\$]]*) + eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED -e \\"\\\$double_quote_subst\\" -e \\"\\\$sed_quote_subst\\" -e \\"\\\$delay_variable_subst\\"\\\`\\\\\\"" + ;; + *) + eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\"" + ;; + esac +done + +_LT_OUTPUT_LIBTOOL_INIT +]) + +# _LT_GENERATED_FILE_INIT(FILE, [COMMENT]) +# ------------------------------------ +# Generate a child script FILE with all initialization necessary to +# reuse the environment learned by the parent script, and make the +# file executable. If COMMENT is supplied, it is inserted after the +# `#!' sequence but before initialization text begins. After this +# macro, additional text can be appended to FILE to form the body of +# the child script. The macro ends with non-zero status if the +# file could not be fully written (such as if the disk is full). +m4_ifdef([AS_INIT_GENERATED], +[m4_defun([_LT_GENERATED_FILE_INIT],[AS_INIT_GENERATED($@)])], +[m4_defun([_LT_GENERATED_FILE_INIT], +[m4_require([AS_PREPARE])]dnl +[m4_pushdef([AS_MESSAGE_LOG_FD])]dnl +[lt_write_fail=0 +cat >$1 <<_ASEOF || lt_write_fail=1 +#! $SHELL +# Generated by $as_me. +$2 +SHELL=\${CONFIG_SHELL-$SHELL} +export SHELL +_ASEOF +cat >>$1 <<\_ASEOF || lt_write_fail=1 +AS_SHELL_SANITIZE +_AS_PREPARE +exec AS_MESSAGE_FD>&1 +_ASEOF +test $lt_write_fail = 0 && chmod +x $1[]dnl +m4_popdef([AS_MESSAGE_LOG_FD])])])# _LT_GENERATED_FILE_INIT + +# LT_OUTPUT +# --------- +# This macro allows early generation of the libtool script (before +# AC_OUTPUT is called), incase it is used in configure for compilation +# tests. +AC_DEFUN([LT_OUTPUT], +[: ${CONFIG_LT=./config.lt} +AC_MSG_NOTICE([creating $CONFIG_LT]) +_LT_GENERATED_FILE_INIT(["$CONFIG_LT"], +[# Run this file to recreate a libtool stub with the current configuration.]) + +cat >>"$CONFIG_LT" <<\_LTEOF +lt_cl_silent=false +exec AS_MESSAGE_LOG_FD>>config.log +{ + echo + AS_BOX([Running $as_me.]) +} >&AS_MESSAGE_LOG_FD + +lt_cl_help="\ +\`$as_me' creates a local libtool stub from the current configuration, +for use in further configure time tests before the real libtool is +generated. + +Usage: $[0] [[OPTIONS]] + + -h, --help print this help, then exit + -V, --version print version number, then exit + -q, --quiet do not print progress messages + -d, --debug don't remove temporary files + +Report bugs to ." + +lt_cl_version="\ +m4_ifset([AC_PACKAGE_NAME], [AC_PACKAGE_NAME ])config.lt[]dnl +m4_ifset([AC_PACKAGE_VERSION], [ AC_PACKAGE_VERSION]) +configured by $[0], generated by m4_PACKAGE_STRING. + +Copyright (C) 2011 Free Software Foundation, Inc. +This config.lt script is free software; the Free Software Foundation +gives unlimited permision to copy, distribute and modify it." + +while test $[#] != 0 +do + case $[1] in + --version | --v* | -V ) + echo "$lt_cl_version"; exit 0 ;; + --help | --h* | -h ) + echo "$lt_cl_help"; exit 0 ;; + --debug | --d* | -d ) + debug=: ;; + --quiet | --q* | --silent | --s* | -q ) + lt_cl_silent=: ;; + + -*) AC_MSG_ERROR([unrecognized option: $[1] +Try \`$[0] --help' for more information.]) ;; + + *) AC_MSG_ERROR([unrecognized argument: $[1] +Try \`$[0] --help' for more information.]) ;; + esac + shift +done + +if $lt_cl_silent; then + exec AS_MESSAGE_FD>/dev/null +fi +_LTEOF + +cat >>"$CONFIG_LT" <<_LTEOF +_LT_OUTPUT_LIBTOOL_COMMANDS_INIT +_LTEOF + +cat >>"$CONFIG_LT" <<\_LTEOF +AC_MSG_NOTICE([creating $ofile]) +_LT_OUTPUT_LIBTOOL_COMMANDS +AS_EXIT(0) +_LTEOF +chmod +x "$CONFIG_LT" + +# configure is writing to config.log, but config.lt does its own redirection, +# appending to config.log, which fails on DOS, as config.log is still kept +# open by configure. Here we exec the FD to /dev/null, effectively closing +# config.log, so it can be properly (re)opened and appended to by config.lt. +lt_cl_success=: +test "$silent" = yes && + lt_config_lt_args="$lt_config_lt_args --quiet" +exec AS_MESSAGE_LOG_FD>/dev/null +$SHELL "$CONFIG_LT" $lt_config_lt_args || lt_cl_success=false +exec AS_MESSAGE_LOG_FD>>config.log +$lt_cl_success || AS_EXIT(1) +])# LT_OUTPUT + + +# _LT_CONFIG(TAG) +# --------------- +# If TAG is the built-in tag, create an initial libtool script with a +# default configuration from the untagged config vars. Otherwise add code +# to config.status for appending the configuration named by TAG from the +# matching tagged config vars. +m4_defun([_LT_CONFIG], +[m4_require([_LT_FILEUTILS_DEFAULTS])dnl +_LT_CONFIG_SAVE_COMMANDS([ + m4_define([_LT_TAG], m4_if([$1], [], [C], [$1]))dnl + m4_if(_LT_TAG, [C], [ + # See if we are running on zsh, and set the options which allow our + # commands through without removal of \ escapes. + if test -n "${ZSH_VERSION+set}" ; then + setopt NO_GLOB_SUBST + fi + + cfgfile="${ofile}T" + trap "$RM \"$cfgfile\"; exit 1" 1 2 15 + $RM "$cfgfile" + + cat <<_LT_EOF >> "$cfgfile" +#! $SHELL + +# `$ECHO "$ofile" | sed 's%^.*/%%'` - Provide generalized library-building support services. +# Generated automatically by $as_me ($PACKAGE$TIMESTAMP) $VERSION +# Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`: +# NOTE: Changes made to this file will be lost: look at ltmain.sh. +# +_LT_COPYING +_LT_LIBTOOL_TAGS + +# ### BEGIN LIBTOOL CONFIG +_LT_LIBTOOL_CONFIG_VARS +_LT_LIBTOOL_TAG_VARS +# ### END LIBTOOL CONFIG + +_LT_EOF + + case $host_os in + aix3*) + cat <<\_LT_EOF >> "$cfgfile" +# AIX sometimes has problems with the GCC collect2 program. For some +# reason, if we set the COLLECT_NAMES environment variable, the problems +# vanish in a puff of smoke. +if test "X${COLLECT_NAMES+set}" != Xset; then + COLLECT_NAMES= + export COLLECT_NAMES +fi +_LT_EOF + ;; + esac + + _LT_PROG_LTMAIN + + # We use sed instead of cat because bash on DJGPP gets confused if + # if finds mixed CR/LF and LF-only lines. Since sed operates in + # text mode, it properly converts lines to CR/LF. This bash problem + # is reportedly fixed, but why not run on old versions too? + sed '$q' "$ltmain" >> "$cfgfile" \ + || (rm -f "$cfgfile"; exit 1) + + _LT_PROG_REPLACE_SHELLFNS + + mv -f "$cfgfile" "$ofile" || + (rm -f "$ofile" && cp "$cfgfile" "$ofile" && rm -f "$cfgfile") + chmod +x "$ofile" +], +[cat <<_LT_EOF >> "$ofile" + +dnl Unfortunately we have to use $1 here, since _LT_TAG is not expanded +dnl in a comment (ie after a #). +# ### BEGIN LIBTOOL TAG CONFIG: $1 +_LT_LIBTOOL_TAG_VARS(_LT_TAG) +# ### END LIBTOOL TAG CONFIG: $1 +_LT_EOF +])dnl /m4_if +], +[m4_if([$1], [], [ + PACKAGE='$PACKAGE' + VERSION='$VERSION' + TIMESTAMP='$TIMESTAMP' + RM='$RM' + ofile='$ofile'], []) +])dnl /_LT_CONFIG_SAVE_COMMANDS +])# _LT_CONFIG + + +# LT_SUPPORTED_TAG(TAG) +# --------------------- +# Trace this macro to discover what tags are supported by the libtool +# --tag option, using: +# autoconf --trace 'LT_SUPPORTED_TAG:$1' +AC_DEFUN([LT_SUPPORTED_TAG], []) + + +# C support is built-in for now +m4_define([_LT_LANG_C_enabled], []) +m4_define([_LT_TAGS], []) + + +# LT_LANG(LANG) +# ------------- +# Enable libtool support for the given language if not already enabled. +AC_DEFUN([LT_LANG], +[AC_BEFORE([$0], [LT_OUTPUT])dnl +m4_case([$1], + [C], [_LT_LANG(C)], + [C++], [_LT_LANG(CXX)], + [Go], [_LT_LANG(GO)], + [Java], [_LT_LANG(GCJ)], + [Fortran 77], [_LT_LANG(F77)], + [Fortran], [_LT_LANG(FC)], + [Windows Resource], [_LT_LANG(RC)], + [m4_ifdef([_LT_LANG_]$1[_CONFIG], + [_LT_LANG($1)], + [m4_fatal([$0: unsupported language: "$1"])])])dnl +])# LT_LANG + + +# _LT_LANG(LANGNAME) +# ------------------ +m4_defun([_LT_LANG], +[m4_ifdef([_LT_LANG_]$1[_enabled], [], + [LT_SUPPORTED_TAG([$1])dnl + m4_append([_LT_TAGS], [$1 ])dnl + m4_define([_LT_LANG_]$1[_enabled], [])dnl + _LT_LANG_$1_CONFIG($1)])dnl +])# _LT_LANG + + +m4_ifndef([AC_PROG_GO], [ +# NOTE: This macro has been submitted for inclusion into # +# GNU Autoconf as AC_PROG_GO. When it is available in # +# a released version of Autoconf we should remove this # +# macro and use it instead. # +m4_defun([AC_PROG_GO], +[AC_LANG_PUSH(Go)dnl +AC_ARG_VAR([GOC], [Go compiler command])dnl +AC_ARG_VAR([GOFLAGS], [Go compiler flags])dnl +_AC_ARG_VAR_LDFLAGS()dnl +AC_CHECK_TOOL(GOC, gccgo) +if test -z "$GOC"; then + if test -n "$ac_tool_prefix"; then + AC_CHECK_PROG(GOC, [${ac_tool_prefix}gccgo], [${ac_tool_prefix}gccgo]) + fi +fi +if test -z "$GOC"; then + AC_CHECK_PROG(GOC, gccgo, gccgo, false) +fi +])#m4_defun +])#m4_ifndef + + +# _LT_LANG_DEFAULT_CONFIG +# ----------------------- +m4_defun([_LT_LANG_DEFAULT_CONFIG], +[AC_PROVIDE_IFELSE([AC_PROG_CXX], + [LT_LANG(CXX)], + [m4_define([AC_PROG_CXX], defn([AC_PROG_CXX])[LT_LANG(CXX)])]) + +AC_PROVIDE_IFELSE([AC_PROG_F77], + [LT_LANG(F77)], + [m4_define([AC_PROG_F77], defn([AC_PROG_F77])[LT_LANG(F77)])]) + +AC_PROVIDE_IFELSE([AC_PROG_FC], + [LT_LANG(FC)], + [m4_define([AC_PROG_FC], defn([AC_PROG_FC])[LT_LANG(FC)])]) + +dnl The call to [A][M_PROG_GCJ] is quoted like that to stop aclocal +dnl pulling things in needlessly. +AC_PROVIDE_IFELSE([AC_PROG_GCJ], + [LT_LANG(GCJ)], + [AC_PROVIDE_IFELSE([A][M_PROG_GCJ], + [LT_LANG(GCJ)], + [AC_PROVIDE_IFELSE([LT_PROG_GCJ], + [LT_LANG(GCJ)], + [m4_ifdef([AC_PROG_GCJ], + [m4_define([AC_PROG_GCJ], defn([AC_PROG_GCJ])[LT_LANG(GCJ)])]) + m4_ifdef([A][M_PROG_GCJ], + [m4_define([A][M_PROG_GCJ], defn([A][M_PROG_GCJ])[LT_LANG(GCJ)])]) + m4_ifdef([LT_PROG_GCJ], + [m4_define([LT_PROG_GCJ], defn([LT_PROG_GCJ])[LT_LANG(GCJ)])])])])]) + +AC_PROVIDE_IFELSE([AC_PROG_GO], + [LT_LANG(GO)], + [m4_define([AC_PROG_GO], defn([AC_PROG_GO])[LT_LANG(GO)])]) + +AC_PROVIDE_IFELSE([LT_PROG_RC], + [LT_LANG(RC)], + [m4_define([LT_PROG_RC], defn([LT_PROG_RC])[LT_LANG(RC)])]) +])# _LT_LANG_DEFAULT_CONFIG + +# Obsolete macros: +AU_DEFUN([AC_LIBTOOL_CXX], [LT_LANG(C++)]) +AU_DEFUN([AC_LIBTOOL_F77], [LT_LANG(Fortran 77)]) +AU_DEFUN([AC_LIBTOOL_FC], [LT_LANG(Fortran)]) +AU_DEFUN([AC_LIBTOOL_GCJ], [LT_LANG(Java)]) +AU_DEFUN([AC_LIBTOOL_RC], [LT_LANG(Windows Resource)]) +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AC_LIBTOOL_CXX], []) +dnl AC_DEFUN([AC_LIBTOOL_F77], []) +dnl AC_DEFUN([AC_LIBTOOL_FC], []) +dnl AC_DEFUN([AC_LIBTOOL_GCJ], []) +dnl AC_DEFUN([AC_LIBTOOL_RC], []) + + +# _LT_TAG_COMPILER +# ---------------- +m4_defun([_LT_TAG_COMPILER], +[AC_REQUIRE([AC_PROG_CC])dnl + +_LT_DECL([LTCC], [CC], [1], [A C compiler])dnl +_LT_DECL([LTCFLAGS], [CFLAGS], [1], [LTCC compiler flags])dnl +_LT_TAGDECL([CC], [compiler], [1], [A language specific compiler])dnl +_LT_TAGDECL([with_gcc], [GCC], [0], [Is the compiler the GNU compiler?])dnl + +# If no C compiler was specified, use CC. +LTCC=${LTCC-"$CC"} + +# If no C compiler flags were specified, use CFLAGS. +LTCFLAGS=${LTCFLAGS-"$CFLAGS"} + +# Allow CC to be a program name with arguments. +compiler=$CC +])# _LT_TAG_COMPILER + + +# _LT_COMPILER_BOILERPLATE +# ------------------------ +# Check for compiler boilerplate output or warnings with +# the simple compiler test code. +m4_defun([_LT_COMPILER_BOILERPLATE], +[m4_require([_LT_DECL_SED])dnl +ac_outfile=conftest.$ac_objext +echo "$lt_simple_compile_test_code" >conftest.$ac_ext +eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err +_lt_compiler_boilerplate=`cat conftest.err` +$RM conftest* +])# _LT_COMPILER_BOILERPLATE + + +# _LT_LINKER_BOILERPLATE +# ---------------------- +# Check for linker boilerplate output or warnings with +# the simple link test code. +m4_defun([_LT_LINKER_BOILERPLATE], +[m4_require([_LT_DECL_SED])dnl +ac_outfile=conftest.$ac_objext +echo "$lt_simple_link_test_code" >conftest.$ac_ext +eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err +_lt_linker_boilerplate=`cat conftest.err` +$RM -r conftest* +])# _LT_LINKER_BOILERPLATE + +# _LT_REQUIRED_DARWIN_CHECKS +# ------------------------- +m4_defun_once([_LT_REQUIRED_DARWIN_CHECKS],[ + case $host_os in + rhapsody* | darwin*) + AC_CHECK_TOOL([DSYMUTIL], [dsymutil], [:]) + AC_CHECK_TOOL([NMEDIT], [nmedit], [:]) + AC_CHECK_TOOL([LIPO], [lipo], [:]) + AC_CHECK_TOOL([OTOOL], [otool], [:]) + AC_CHECK_TOOL([OTOOL64], [otool64], [:]) + _LT_DECL([], [DSYMUTIL], [1], + [Tool to manipulate archived DWARF debug symbol files on Mac OS X]) + _LT_DECL([], [NMEDIT], [1], + [Tool to change global to local symbols on Mac OS X]) + _LT_DECL([], [LIPO], [1], + [Tool to manipulate fat objects and archives on Mac OS X]) + _LT_DECL([], [OTOOL], [1], + [ldd/readelf like tool for Mach-O binaries on Mac OS X]) + _LT_DECL([], [OTOOL64], [1], + [ldd/readelf like tool for 64 bit Mach-O binaries on Mac OS X 10.4]) + + AC_CACHE_CHECK([for -single_module linker flag],[lt_cv_apple_cc_single_mod], + [lt_cv_apple_cc_single_mod=no + if test -z "${LT_MULTI_MODULE}"; then + # By default we will add the -single_module flag. You can override + # by either setting the environment variable LT_MULTI_MODULE + # non-empty at configure time, or by adding -multi_module to the + # link flags. + rm -rf libconftest.dylib* + echo "int foo(void){return 1;}" > conftest.c + echo "$LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \ +-dynamiclib -Wl,-single_module conftest.c" >&AS_MESSAGE_LOG_FD + $LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \ + -dynamiclib -Wl,-single_module conftest.c 2>conftest.err + _lt_result=$? + # If there is a non-empty error log, and "single_module" + # appears in it, assume the flag caused a linker warning + if test -s conftest.err && $GREP single_module conftest.err; then + cat conftest.err >&AS_MESSAGE_LOG_FD + # Otherwise, if the output was created with a 0 exit code from + # the compiler, it worked. + elif test -f libconftest.dylib && test $_lt_result -eq 0; then + lt_cv_apple_cc_single_mod=yes + else + cat conftest.err >&AS_MESSAGE_LOG_FD + fi + rm -rf libconftest.dylib* + rm -f conftest.* + fi]) + + AC_CACHE_CHECK([for -exported_symbols_list linker flag], + [lt_cv_ld_exported_symbols_list], + [lt_cv_ld_exported_symbols_list=no + save_LDFLAGS=$LDFLAGS + echo "_main" > conftest.sym + LDFLAGS="$LDFLAGS -Wl,-exported_symbols_list,conftest.sym" + AC_LINK_IFELSE([AC_LANG_PROGRAM([],[])], + [lt_cv_ld_exported_symbols_list=yes], + [lt_cv_ld_exported_symbols_list=no]) + LDFLAGS="$save_LDFLAGS" + ]) + + AC_CACHE_CHECK([for -force_load linker flag],[lt_cv_ld_force_load], + [lt_cv_ld_force_load=no + cat > conftest.c << _LT_EOF +int forced_loaded() { return 2;} +_LT_EOF + echo "$LTCC $LTCFLAGS -c -o conftest.o conftest.c" >&AS_MESSAGE_LOG_FD + $LTCC $LTCFLAGS -c -o conftest.o conftest.c 2>&AS_MESSAGE_LOG_FD + echo "$AR cru libconftest.a conftest.o" >&AS_MESSAGE_LOG_FD + $AR cru libconftest.a conftest.o 2>&AS_MESSAGE_LOG_FD + echo "$RANLIB libconftest.a" >&AS_MESSAGE_LOG_FD + $RANLIB libconftest.a 2>&AS_MESSAGE_LOG_FD + cat > conftest.c << _LT_EOF +int main() { return 0;} +_LT_EOF + echo "$LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a" >&AS_MESSAGE_LOG_FD + $LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a 2>conftest.err + _lt_result=$? + if test -s conftest.err && $GREP force_load conftest.err; then + cat conftest.err >&AS_MESSAGE_LOG_FD + elif test -f conftest && test $_lt_result -eq 0 && $GREP forced_load conftest >/dev/null 2>&1 ; then + lt_cv_ld_force_load=yes + else + cat conftest.err >&AS_MESSAGE_LOG_FD + fi + rm -f conftest.err libconftest.a conftest conftest.c + rm -rf conftest.dSYM + ]) + case $host_os in + rhapsody* | darwin1.[[012]]) + _lt_dar_allow_undefined='${wl}-undefined ${wl}suppress' ;; + darwin1.*) + _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;; + darwin*) # darwin 5.x on + # if running on 10.5 or later, the deployment target defaults + # to the OS version, if on x86, and 10.4, the deployment + # target defaults to 10.4. Don't you love it? + case ${MACOSX_DEPLOYMENT_TARGET-10.0},$host in + 10.0,*86*-darwin8*|10.0,*-darwin[[91]]*) + _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;; + 10.[[012]]*) + _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;; + 10.*) + _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;; + esac + ;; + esac + if test "$lt_cv_apple_cc_single_mod" = "yes"; then + _lt_dar_single_mod='$single_module' + fi + if test "$lt_cv_ld_exported_symbols_list" = "yes"; then + _lt_dar_export_syms=' ${wl}-exported_symbols_list,$output_objdir/${libname}-symbols.expsym' + else + _lt_dar_export_syms='~$NMEDIT -s $output_objdir/${libname}-symbols.expsym ${lib}' + fi + if test "$DSYMUTIL" != ":" && test "$lt_cv_ld_force_load" = "no"; then + _lt_dsymutil='~$DSYMUTIL $lib || :' + else + _lt_dsymutil= + fi + ;; + esac +]) + + +# _LT_DARWIN_LINKER_FEATURES([TAG]) +# --------------------------------- +# Checks for linker and compiler features on darwin +m4_defun([_LT_DARWIN_LINKER_FEATURES], +[ + m4_require([_LT_REQUIRED_DARWIN_CHECKS]) + _LT_TAGVAR(archive_cmds_need_lc, $1)=no + _LT_TAGVAR(hardcode_direct, $1)=no + _LT_TAGVAR(hardcode_automatic, $1)=yes + _LT_TAGVAR(hardcode_shlibpath_var, $1)=unsupported + if test "$lt_cv_ld_force_load" = "yes"; then + _LT_TAGVAR(whole_archive_flag_spec, $1)='`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience ${wl}-force_load,$conv\"; done; func_echo_all \"$new_convenience\"`' + m4_case([$1], [F77], [_LT_TAGVAR(compiler_needs_object, $1)=yes], + [FC], [_LT_TAGVAR(compiler_needs_object, $1)=yes]) + else + _LT_TAGVAR(whole_archive_flag_spec, $1)='' + fi + _LT_TAGVAR(link_all_deplibs, $1)=yes + _LT_TAGVAR(allow_undefined_flag, $1)="$_lt_dar_allow_undefined" + case $cc_basename in + ifort*) _lt_dar_can_shared=yes ;; + *) _lt_dar_can_shared=$GCC ;; + esac + if test "$_lt_dar_can_shared" = "yes"; then + output_verbose_link_cmd=func_echo_all + _LT_TAGVAR(archive_cmds, $1)="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod${_lt_dsymutil}" + _LT_TAGVAR(module_cmds, $1)="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dsymutil}" + _LT_TAGVAR(archive_expsym_cmds, $1)="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring ${_lt_dar_single_mod}${_lt_dar_export_syms}${_lt_dsymutil}" + _LT_TAGVAR(module_expsym_cmds, $1)="sed -e 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dar_export_syms}${_lt_dsymutil}" + m4_if([$1], [CXX], +[ if test "$lt_cv_apple_cc_single_mod" != "yes"; then + _LT_TAGVAR(archive_cmds, $1)="\$CC -r -keep_private_externs -nostdlib -o \${lib}-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \${lib}-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring${_lt_dsymutil}" + _LT_TAGVAR(archive_expsym_cmds, $1)="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -r -keep_private_externs -nostdlib -o \${lib}-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \${lib}-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring${_lt_dar_export_syms}${_lt_dsymutil}" + fi +],[]) + else + _LT_TAGVAR(ld_shlibs, $1)=no + fi +]) + +# _LT_SYS_MODULE_PATH_AIX([TAGNAME]) +# ---------------------------------- +# Links a minimal program and checks the executable +# for the system default hardcoded library path. In most cases, +# this is /usr/lib:/lib, but when the MPI compilers are used +# the location of the communication and MPI libs are included too. +# If we don't find anything, use the default library path according +# to the aix ld manual. +# Store the results from the different compilers for each TAGNAME. +# Allow to override them for all tags through lt_cv_aix_libpath. +m4_defun([_LT_SYS_MODULE_PATH_AIX], +[m4_require([_LT_DECL_SED])dnl +if test "${lt_cv_aix_libpath+set}" = set; then + aix_libpath=$lt_cv_aix_libpath +else + AC_CACHE_VAL([_LT_TAGVAR([lt_cv_aix_libpath_], [$1])], + [AC_LINK_IFELSE([AC_LANG_PROGRAM],[ + lt_aix_libpath_sed='[ + /Import File Strings/,/^$/ { + /^0/ { + s/^0 *\([^ ]*\) *$/\1/ + p + } + }]' + _LT_TAGVAR([lt_cv_aix_libpath_], [$1])=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` + # Check for a 64-bit object if we didn't find anything. + if test -z "$_LT_TAGVAR([lt_cv_aix_libpath_], [$1])"; then + _LT_TAGVAR([lt_cv_aix_libpath_], [$1])=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` + fi],[]) + if test -z "$_LT_TAGVAR([lt_cv_aix_libpath_], [$1])"; then + _LT_TAGVAR([lt_cv_aix_libpath_], [$1])="/usr/lib:/lib" + fi + ]) + aix_libpath=$_LT_TAGVAR([lt_cv_aix_libpath_], [$1]) +fi +])# _LT_SYS_MODULE_PATH_AIX + + +# _LT_SHELL_INIT(ARG) +# ------------------- +m4_define([_LT_SHELL_INIT], +[m4_divert_text([M4SH-INIT], [$1 +])])# _LT_SHELL_INIT + + + +# _LT_PROG_ECHO_BACKSLASH +# ----------------------- +# Find how we can fake an echo command that does not interpret backslash. +# In particular, with Autoconf 2.60 or later we add some code to the start +# of the generated configure script which will find a shell with a builtin +# printf (which we can use as an echo command). +m4_defun([_LT_PROG_ECHO_BACKSLASH], +[ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' +ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO +ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO$ECHO + +AC_MSG_CHECKING([how to print strings]) +# Test print first, because it will be a builtin if present. +if test "X`( print -r -- -n ) 2>/dev/null`" = X-n && \ + test "X`print -r -- $ECHO 2>/dev/null`" = "X$ECHO"; then + ECHO='print -r --' +elif test "X`printf %s $ECHO 2>/dev/null`" = "X$ECHO"; then + ECHO='printf %s\n' +else + # Use this function as a fallback that always works. + func_fallback_echo () + { + eval 'cat <<_LTECHO_EOF +$[]1 +_LTECHO_EOF' + } + ECHO='func_fallback_echo' +fi + +# func_echo_all arg... +# Invoke $ECHO with all args, space-separated. +func_echo_all () +{ + $ECHO "$*" +} + +case "$ECHO" in + printf*) AC_MSG_RESULT([printf]) ;; + print*) AC_MSG_RESULT([print -r]) ;; + *) AC_MSG_RESULT([cat]) ;; +esac + +m4_ifdef([_AS_DETECT_SUGGESTED], +[_AS_DETECT_SUGGESTED([ + test -n "${ZSH_VERSION+set}${BASH_VERSION+set}" || ( + ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' + ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO + ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO$ECHO + PATH=/empty FPATH=/empty; export PATH FPATH + test "X`printf %s $ECHO`" = "X$ECHO" \ + || test "X`print -r -- $ECHO`" = "X$ECHO" )])]) + +_LT_DECL([], [SHELL], [1], [Shell to use when invoking shell scripts]) +_LT_DECL([], [ECHO], [1], [An echo program that protects backslashes]) +])# _LT_PROG_ECHO_BACKSLASH + + +# _LT_WITH_SYSROOT +# ---------------- +AC_DEFUN([_LT_WITH_SYSROOT], +[AC_MSG_CHECKING([for sysroot]) +AC_ARG_WITH([sysroot], +[ --with-sysroot[=DIR] Search for dependent libraries within DIR + (or the compiler's sysroot if not specified).], +[], [with_sysroot=no]) + +dnl lt_sysroot will always be passed unquoted. We quote it here +dnl in case the user passed a directory name. +lt_sysroot= +case ${with_sysroot} in #( + yes) + if test "$GCC" = yes; then + lt_sysroot=`$CC --print-sysroot 2>/dev/null` + fi + ;; #( + /*) + lt_sysroot=`echo "$with_sysroot" | sed -e "$sed_quote_subst"` + ;; #( + no|'') + ;; #( + *) + AC_MSG_RESULT([${with_sysroot}]) + AC_MSG_ERROR([The sysroot must be an absolute path.]) + ;; +esac + + AC_MSG_RESULT([${lt_sysroot:-no}]) +_LT_DECL([], [lt_sysroot], [0], [The root where to search for ]dnl +[dependent libraries, and in which our libraries should be installed.])]) + +# _LT_ENABLE_LOCK +# --------------- +m4_defun([_LT_ENABLE_LOCK], +[AC_ARG_ENABLE([libtool-lock], + [AS_HELP_STRING([--disable-libtool-lock], + [avoid locking (might break parallel builds)])]) +test "x$enable_libtool_lock" != xno && enable_libtool_lock=yes + +# Some flags need to be propagated to the compiler or linker for good +# libtool support. +case $host in +ia64-*-hpux*) + # Find out which ABI we are using. + echo 'int i;' > conftest.$ac_ext + if AC_TRY_EVAL(ac_compile); then + case `/usr/bin/file conftest.$ac_objext` in + *ELF-32*) + HPUX_IA64_MODE="32" + ;; + *ELF-64*) + HPUX_IA64_MODE="64" + ;; + esac + fi + rm -rf conftest* + ;; +*-*-irix6*) + # Find out which ABI we are using. + echo '[#]line '$LINENO' "configure"' > conftest.$ac_ext + if AC_TRY_EVAL(ac_compile); then + if test "$lt_cv_prog_gnu_ld" = yes; then + case `/usr/bin/file conftest.$ac_objext` in + *32-bit*) + LD="${LD-ld} -melf32bsmip" + ;; + *N32*) + LD="${LD-ld} -melf32bmipn32" + ;; + *64-bit*) + LD="${LD-ld} -melf64bmip" + ;; + esac + else + case `/usr/bin/file conftest.$ac_objext` in + *32-bit*) + LD="${LD-ld} -32" + ;; + *N32*) + LD="${LD-ld} -n32" + ;; + *64-bit*) + LD="${LD-ld} -64" + ;; + esac + fi + fi + rm -rf conftest* + ;; + +x86_64-*kfreebsd*-gnu|x86_64-*linux*|ppc*-*linux*|powerpc*-*linux*| \ +s390*-*linux*|s390*-*tpf*|sparc*-*linux*) + # Find out which ABI we are using. + echo 'int i;' > conftest.$ac_ext + if AC_TRY_EVAL(ac_compile); then + case `/usr/bin/file conftest.o` in + *32-bit*) + case $host in + x86_64-*kfreebsd*-gnu) + LD="${LD-ld} -m elf_i386_fbsd" + ;; + x86_64-*linux*) + LD="${LD-ld} -m elf_i386" + ;; + ppc64-*linux*|powerpc64-*linux*) + LD="${LD-ld} -m elf32ppclinux" + ;; + s390x-*linux*) + LD="${LD-ld} -m elf_s390" + ;; + sparc64-*linux*) + LD="${LD-ld} -m elf32_sparc" + ;; + esac + ;; + *64-bit*) + case $host in + x86_64-*kfreebsd*-gnu) + LD="${LD-ld} -m elf_x86_64_fbsd" + ;; + x86_64-*linux*) + LD="${LD-ld} -m elf_x86_64" + ;; + ppc*-*linux*|powerpc*-*linux*) + LD="${LD-ld} -m elf64ppc" + ;; + s390*-*linux*|s390*-*tpf*) + LD="${LD-ld} -m elf64_s390" + ;; + sparc*-*linux*) + LD="${LD-ld} -m elf64_sparc" + ;; + esac + ;; + esac + fi + rm -rf conftest* + ;; + +*-*-sco3.2v5*) + # On SCO OpenServer 5, we need -belf to get full-featured binaries. + SAVE_CFLAGS="$CFLAGS" + CFLAGS="$CFLAGS -belf" + AC_CACHE_CHECK([whether the C compiler needs -belf], lt_cv_cc_needs_belf, + [AC_LANG_PUSH(C) + AC_LINK_IFELSE([AC_LANG_PROGRAM([[]],[[]])],[lt_cv_cc_needs_belf=yes],[lt_cv_cc_needs_belf=no]) + AC_LANG_POP]) + if test x"$lt_cv_cc_needs_belf" != x"yes"; then + # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf + CFLAGS="$SAVE_CFLAGS" + fi + ;; +*-*solaris*) + # Find out which ABI we are using. + echo 'int i;' > conftest.$ac_ext + if AC_TRY_EVAL(ac_compile); then + case `/usr/bin/file conftest.o` in + *64-bit*) + case $lt_cv_prog_gnu_ld in + yes*) + case $host in + i?86-*-solaris*) + LD="${LD-ld} -m elf_x86_64" + ;; + sparc*-*-solaris*) + LD="${LD-ld} -m elf64_sparc" + ;; + esac + # GNU ld 2.21 introduced _sol2 emulations. Use them if available. + if ${LD-ld} -V | grep _sol2 >/dev/null 2>&1; then + LD="${LD-ld}_sol2" + fi + ;; + *) + if ${LD-ld} -64 -r -o conftest2.o conftest.o >/dev/null 2>&1; then + LD="${LD-ld} -64" + fi + ;; + esac + ;; + esac + fi + rm -rf conftest* + ;; +esac + +need_locks="$enable_libtool_lock" +])# _LT_ENABLE_LOCK + + +# _LT_PROG_AR +# ----------- +m4_defun([_LT_PROG_AR], +[AC_CHECK_TOOLS(AR, [ar], false) +: ${AR=ar} +: ${AR_FLAGS=cru} +_LT_DECL([], [AR], [1], [The archiver]) +_LT_DECL([], [AR_FLAGS], [1], [Flags to create an archive]) + +AC_CACHE_CHECK([for archiver @FILE support], [lt_cv_ar_at_file], + [lt_cv_ar_at_file=no + AC_COMPILE_IFELSE([AC_LANG_PROGRAM], + [echo conftest.$ac_objext > conftest.lst + lt_ar_try='$AR $AR_FLAGS libconftest.a @conftest.lst >&AS_MESSAGE_LOG_FD' + AC_TRY_EVAL([lt_ar_try]) + if test "$ac_status" -eq 0; then + # Ensure the archiver fails upon bogus file names. + rm -f conftest.$ac_objext libconftest.a + AC_TRY_EVAL([lt_ar_try]) + if test "$ac_status" -ne 0; then + lt_cv_ar_at_file=@ + fi + fi + rm -f conftest.* libconftest.a + ]) + ]) + +if test "x$lt_cv_ar_at_file" = xno; then + archiver_list_spec= +else + archiver_list_spec=$lt_cv_ar_at_file +fi +_LT_DECL([], [archiver_list_spec], [1], + [How to feed a file listing to the archiver]) +])# _LT_PROG_AR + + +# _LT_CMD_OLD_ARCHIVE +# ------------------- +m4_defun([_LT_CMD_OLD_ARCHIVE], +[_LT_PROG_AR + +AC_CHECK_TOOL(STRIP, strip, :) +test -z "$STRIP" && STRIP=: +_LT_DECL([], [STRIP], [1], [A symbol stripping program]) + +AC_CHECK_TOOL(RANLIB, ranlib, :) +test -z "$RANLIB" && RANLIB=: +_LT_DECL([], [RANLIB], [1], + [Commands used to install an old-style archive]) + +# Determine commands to create old-style static archives. +old_archive_cmds='$AR $AR_FLAGS $oldlib$oldobjs' +old_postinstall_cmds='chmod 644 $oldlib' +old_postuninstall_cmds= + +if test -n "$RANLIB"; then + case $host_os in + openbsd*) + old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB -t \$tool_oldlib" + ;; + *) + old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB \$tool_oldlib" + ;; + esac + old_archive_cmds="$old_archive_cmds~\$RANLIB \$tool_oldlib" +fi + +case $host_os in + darwin*) + lock_old_archive_extraction=yes ;; + *) + lock_old_archive_extraction=no ;; +esac +_LT_DECL([], [old_postinstall_cmds], [2]) +_LT_DECL([], [old_postuninstall_cmds], [2]) +_LT_TAGDECL([], [old_archive_cmds], [2], + [Commands used to build an old-style archive]) +_LT_DECL([], [lock_old_archive_extraction], [0], + [Whether to use a lock for old archive extraction]) +])# _LT_CMD_OLD_ARCHIVE + + +# _LT_COMPILER_OPTION(MESSAGE, VARIABLE-NAME, FLAGS, +# [OUTPUT-FILE], [ACTION-SUCCESS], [ACTION-FAILURE]) +# ---------------------------------------------------------------- +# Check whether the given compiler option works +AC_DEFUN([_LT_COMPILER_OPTION], +[m4_require([_LT_FILEUTILS_DEFAULTS])dnl +m4_require([_LT_DECL_SED])dnl +AC_CACHE_CHECK([$1], [$2], + [$2=no + m4_if([$4], , [ac_outfile=conftest.$ac_objext], [ac_outfile=$4]) + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + lt_compiler_flag="$3" + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + # The option is referenced via a variable to avoid confusing sed. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ + -e 's: [[^ ]]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&AS_MESSAGE_LOG_FD) + (eval "$lt_compile" 2>conftest.err) + ac_status=$? + cat conftest.err >&AS_MESSAGE_LOG_FD + echo "$as_me:$LINENO: \$? = $ac_status" >&AS_MESSAGE_LOG_FD + if (exit $ac_status) && test -s "$ac_outfile"; then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings other than the usual output. + $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp + $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 + if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then + $2=yes + fi + fi + $RM conftest* +]) + +if test x"[$]$2" = xyes; then + m4_if([$5], , :, [$5]) +else + m4_if([$6], , :, [$6]) +fi +])# _LT_COMPILER_OPTION + +# Old name: +AU_ALIAS([AC_LIBTOOL_COMPILER_OPTION], [_LT_COMPILER_OPTION]) +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AC_LIBTOOL_COMPILER_OPTION], []) + + +# _LT_LINKER_OPTION(MESSAGE, VARIABLE-NAME, FLAGS, +# [ACTION-SUCCESS], [ACTION-FAILURE]) +# ---------------------------------------------------- +# Check whether the given linker option works +AC_DEFUN([_LT_LINKER_OPTION], +[m4_require([_LT_FILEUTILS_DEFAULTS])dnl +m4_require([_LT_DECL_SED])dnl +AC_CACHE_CHECK([$1], [$2], + [$2=no + save_LDFLAGS="$LDFLAGS" + LDFLAGS="$LDFLAGS $3" + echo "$lt_simple_link_test_code" > conftest.$ac_ext + if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then + # The linker can only warn and ignore the option if not recognized + # So say no if there are warnings + if test -s conftest.err; then + # Append any errors to the config.log. + cat conftest.err 1>&AS_MESSAGE_LOG_FD + $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp + $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 + if diff conftest.exp conftest.er2 >/dev/null; then + $2=yes + fi + else + $2=yes + fi + fi + $RM -r conftest* + LDFLAGS="$save_LDFLAGS" +]) + +if test x"[$]$2" = xyes; then + m4_if([$4], , :, [$4]) +else + m4_if([$5], , :, [$5]) +fi +])# _LT_LINKER_OPTION + +# Old name: +AU_ALIAS([AC_LIBTOOL_LINKER_OPTION], [_LT_LINKER_OPTION]) +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AC_LIBTOOL_LINKER_OPTION], []) + + +# LT_CMD_MAX_LEN +#--------------- +AC_DEFUN([LT_CMD_MAX_LEN], +[AC_REQUIRE([AC_CANONICAL_HOST])dnl +# find the maximum length of command line arguments +AC_MSG_CHECKING([the maximum length of command line arguments]) +AC_CACHE_VAL([lt_cv_sys_max_cmd_len], [dnl + i=0 + teststring="ABCD" + + case $build_os in + msdosdjgpp*) + # On DJGPP, this test can blow up pretty badly due to problems in libc + # (any single argument exceeding 2000 bytes causes a buffer overrun + # during glob expansion). Even if it were fixed, the result of this + # check would be larger than it should be. + lt_cv_sys_max_cmd_len=12288; # 12K is about right + ;; + + gnu*) + # Under GNU Hurd, this test is not required because there is + # no limit to the length of command line arguments. + # Libtool will interpret -1 as no limit whatsoever + lt_cv_sys_max_cmd_len=-1; + ;; + + cygwin* | mingw* | cegcc*) + # On Win9x/ME, this test blows up -- it succeeds, but takes + # about 5 minutes as the teststring grows exponentially. + # Worse, since 9x/ME are not pre-emptively multitasking, + # you end up with a "frozen" computer, even though with patience + # the test eventually succeeds (with a max line length of 256k). + # Instead, let's just punt: use the minimum linelength reported by + # all of the supported platforms: 8192 (on NT/2K/XP). + lt_cv_sys_max_cmd_len=8192; + ;; + + mint*) + # On MiNT this can take a long time and run out of memory. + lt_cv_sys_max_cmd_len=8192; + ;; + + amigaos*) + # On AmigaOS with pdksh, this test takes hours, literally. + # So we just punt and use a minimum line length of 8192. + lt_cv_sys_max_cmd_len=8192; + ;; + + netbsd* | freebsd* | openbsd* | darwin* | dragonfly*) + # This has been around since 386BSD, at least. Likely further. + if test -x /sbin/sysctl; then + lt_cv_sys_max_cmd_len=`/sbin/sysctl -n kern.argmax` + elif test -x /usr/sbin/sysctl; then + lt_cv_sys_max_cmd_len=`/usr/sbin/sysctl -n kern.argmax` + else + lt_cv_sys_max_cmd_len=65536 # usable default for all BSDs + fi + # And add a safety zone + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` + ;; + + interix*) + # We know the value 262144 and hardcode it with a safety zone (like BSD) + lt_cv_sys_max_cmd_len=196608 + ;; + + os2*) + # The test takes a long time on OS/2. + lt_cv_sys_max_cmd_len=8192 + ;; + + osf*) + # Dr. Hans Ekkehard Plesser reports seeing a kernel panic running configure + # due to this test when exec_disable_arg_limit is 1 on Tru64. It is not + # nice to cause kernel panics so lets avoid the loop below. + # First set a reasonable default. + lt_cv_sys_max_cmd_len=16384 + # + if test -x /sbin/sysconfig; then + case `/sbin/sysconfig -q proc exec_disable_arg_limit` in + *1*) lt_cv_sys_max_cmd_len=-1 ;; + esac + fi + ;; + sco3.2v5*) + lt_cv_sys_max_cmd_len=102400 + ;; + sysv5* | sco5v6* | sysv4.2uw2*) + kargmax=`grep ARG_MAX /etc/conf/cf.d/stune 2>/dev/null` + if test -n "$kargmax"; then + lt_cv_sys_max_cmd_len=`echo $kargmax | sed 's/.*[[ ]]//'` + else + lt_cv_sys_max_cmd_len=32768 + fi + ;; + *) + lt_cv_sys_max_cmd_len=`(getconf ARG_MAX) 2> /dev/null` + if test -n "$lt_cv_sys_max_cmd_len"; then + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` + else + # Make teststring a little bigger before we do anything with it. + # a 1K string should be a reasonable start. + for i in 1 2 3 4 5 6 7 8 ; do + teststring=$teststring$teststring + done + SHELL=${SHELL-${CONFIG_SHELL-/bin/sh}} + # If test is not a shell built-in, we'll probably end up computing a + # maximum length that is only half of the actual maximum length, but + # we can't tell. + while { test "X"`env echo "$teststring$teststring" 2>/dev/null` \ + = "X$teststring$teststring"; } >/dev/null 2>&1 && + test $i != 17 # 1/2 MB should be enough + do + i=`expr $i + 1` + teststring=$teststring$teststring + done + # Only check the string length outside the loop. + lt_cv_sys_max_cmd_len=`expr "X$teststring" : ".*" 2>&1` + teststring= + # Add a significant safety factor because C++ compilers can tack on + # massive amounts of additional arguments before passing them to the + # linker. It appears as though 1/2 is a usable value. + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 2` + fi + ;; + esac +]) +if test -n $lt_cv_sys_max_cmd_len ; then + AC_MSG_RESULT($lt_cv_sys_max_cmd_len) +else + AC_MSG_RESULT(none) +fi +max_cmd_len=$lt_cv_sys_max_cmd_len +_LT_DECL([], [max_cmd_len], [0], + [What is the maximum length of a command?]) +])# LT_CMD_MAX_LEN + +# Old name: +AU_ALIAS([AC_LIBTOOL_SYS_MAX_CMD_LEN], [LT_CMD_MAX_LEN]) +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AC_LIBTOOL_SYS_MAX_CMD_LEN], []) + + +# _LT_HEADER_DLFCN +# ---------------- +m4_defun([_LT_HEADER_DLFCN], +[AC_CHECK_HEADERS([dlfcn.h], [], [], [AC_INCLUDES_DEFAULT])dnl +])# _LT_HEADER_DLFCN + + +# _LT_TRY_DLOPEN_SELF (ACTION-IF-TRUE, ACTION-IF-TRUE-W-USCORE, +# ACTION-IF-FALSE, ACTION-IF-CROSS-COMPILING) +# ---------------------------------------------------------------- +m4_defun([_LT_TRY_DLOPEN_SELF], +[m4_require([_LT_HEADER_DLFCN])dnl +if test "$cross_compiling" = yes; then : + [$4] +else + lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 + lt_status=$lt_dlunknown + cat > conftest.$ac_ext <<_LT_EOF +[#line $LINENO "configure" +#include "confdefs.h" + +#if HAVE_DLFCN_H +#include +#endif + +#include + +#ifdef RTLD_GLOBAL +# define LT_DLGLOBAL RTLD_GLOBAL +#else +# ifdef DL_GLOBAL +# define LT_DLGLOBAL DL_GLOBAL +# else +# define LT_DLGLOBAL 0 +# endif +#endif + +/* We may have to define LT_DLLAZY_OR_NOW in the command line if we + find out it does not work in some platform. */ +#ifndef LT_DLLAZY_OR_NOW +# ifdef RTLD_LAZY +# define LT_DLLAZY_OR_NOW RTLD_LAZY +# else +# ifdef DL_LAZY +# define LT_DLLAZY_OR_NOW DL_LAZY +# else +# ifdef RTLD_NOW +# define LT_DLLAZY_OR_NOW RTLD_NOW +# else +# ifdef DL_NOW +# define LT_DLLAZY_OR_NOW DL_NOW +# else +# define LT_DLLAZY_OR_NOW 0 +# endif +# endif +# endif +# endif +#endif + +/* When -fvisbility=hidden is used, assume the code has been annotated + correspondingly for the symbols needed. */ +#if defined(__GNUC__) && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3)) +int fnord () __attribute__((visibility("default"))); +#endif + +int fnord () { return 42; } +int main () +{ + void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); + int status = $lt_dlunknown; + + if (self) + { + if (dlsym (self,"fnord")) status = $lt_dlno_uscore; + else + { + if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; + else puts (dlerror ()); + } + /* dlclose (self); */ + } + else + puts (dlerror ()); + + return status; +}] +_LT_EOF + if AC_TRY_EVAL(ac_link) && test -s conftest${ac_exeext} 2>/dev/null; then + (./conftest; exit; ) >&AS_MESSAGE_LOG_FD 2>/dev/null + lt_status=$? + case x$lt_status in + x$lt_dlno_uscore) $1 ;; + x$lt_dlneed_uscore) $2 ;; + x$lt_dlunknown|x*) $3 ;; + esac + else : + # compilation failed + $3 + fi +fi +rm -fr conftest* +])# _LT_TRY_DLOPEN_SELF + + +# LT_SYS_DLOPEN_SELF +# ------------------ +AC_DEFUN([LT_SYS_DLOPEN_SELF], +[m4_require([_LT_HEADER_DLFCN])dnl +if test "x$enable_dlopen" != xyes; then + enable_dlopen=unknown + enable_dlopen_self=unknown + enable_dlopen_self_static=unknown +else + lt_cv_dlopen=no + lt_cv_dlopen_libs= + + case $host_os in + beos*) + lt_cv_dlopen="load_add_on" + lt_cv_dlopen_libs= + lt_cv_dlopen_self=yes + ;; + + mingw* | pw32* | cegcc*) + lt_cv_dlopen="LoadLibrary" + lt_cv_dlopen_libs= + ;; + + cygwin*) + lt_cv_dlopen="dlopen" + lt_cv_dlopen_libs= + ;; + + darwin*) + # if libdl is installed we need to link against it + AC_CHECK_LIB([dl], [dlopen], + [lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl"],[ + lt_cv_dlopen="dyld" + lt_cv_dlopen_libs= + lt_cv_dlopen_self=yes + ]) + ;; + + *) + AC_CHECK_FUNC([shl_load], + [lt_cv_dlopen="shl_load"], + [AC_CHECK_LIB([dld], [shl_load], + [lt_cv_dlopen="shl_load" lt_cv_dlopen_libs="-ldld"], + [AC_CHECK_FUNC([dlopen], + [lt_cv_dlopen="dlopen"], + [AC_CHECK_LIB([dl], [dlopen], + [lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl"], + [AC_CHECK_LIB([svld], [dlopen], + [lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-lsvld"], + [AC_CHECK_LIB([dld], [dld_link], + [lt_cv_dlopen="dld_link" lt_cv_dlopen_libs="-ldld"]) + ]) + ]) + ]) + ]) + ]) + ;; + esac + + if test "x$lt_cv_dlopen" != xno; then + enable_dlopen=yes + else + enable_dlopen=no + fi + + case $lt_cv_dlopen in + dlopen) + save_CPPFLAGS="$CPPFLAGS" + test "x$ac_cv_header_dlfcn_h" = xyes && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H" + + save_LDFLAGS="$LDFLAGS" + wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\" + + save_LIBS="$LIBS" + LIBS="$lt_cv_dlopen_libs $LIBS" + + AC_CACHE_CHECK([whether a program can dlopen itself], + lt_cv_dlopen_self, [dnl + _LT_TRY_DLOPEN_SELF( + lt_cv_dlopen_self=yes, lt_cv_dlopen_self=yes, + lt_cv_dlopen_self=no, lt_cv_dlopen_self=cross) + ]) + + if test "x$lt_cv_dlopen_self" = xyes; then + wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $lt_prog_compiler_static\" + AC_CACHE_CHECK([whether a statically linked program can dlopen itself], + lt_cv_dlopen_self_static, [dnl + _LT_TRY_DLOPEN_SELF( + lt_cv_dlopen_self_static=yes, lt_cv_dlopen_self_static=yes, + lt_cv_dlopen_self_static=no, lt_cv_dlopen_self_static=cross) + ]) + fi + + CPPFLAGS="$save_CPPFLAGS" + LDFLAGS="$save_LDFLAGS" + LIBS="$save_LIBS" + ;; + esac + + case $lt_cv_dlopen_self in + yes|no) enable_dlopen_self=$lt_cv_dlopen_self ;; + *) enable_dlopen_self=unknown ;; + esac + + case $lt_cv_dlopen_self_static in + yes|no) enable_dlopen_self_static=$lt_cv_dlopen_self_static ;; + *) enable_dlopen_self_static=unknown ;; + esac +fi +_LT_DECL([dlopen_support], [enable_dlopen], [0], + [Whether dlopen is supported]) +_LT_DECL([dlopen_self], [enable_dlopen_self], [0], + [Whether dlopen of programs is supported]) +_LT_DECL([dlopen_self_static], [enable_dlopen_self_static], [0], + [Whether dlopen of statically linked programs is supported]) +])# LT_SYS_DLOPEN_SELF + +# Old name: +AU_ALIAS([AC_LIBTOOL_DLOPEN_SELF], [LT_SYS_DLOPEN_SELF]) +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AC_LIBTOOL_DLOPEN_SELF], []) + + +# _LT_COMPILER_C_O([TAGNAME]) +# --------------------------- +# Check to see if options -c and -o are simultaneously supported by compiler. +# This macro does not hard code the compiler like AC_PROG_CC_C_O. +m4_defun([_LT_COMPILER_C_O], +[m4_require([_LT_DECL_SED])dnl +m4_require([_LT_FILEUTILS_DEFAULTS])dnl +m4_require([_LT_TAG_COMPILER])dnl +AC_CACHE_CHECK([if $compiler supports -c -o file.$ac_objext], + [_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)], + [_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)=no + $RM -r conftest 2>/dev/null + mkdir conftest + cd conftest + mkdir out + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + + lt_compiler_flag="-o out/conftest2.$ac_objext" + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ + -e 's: [[^ ]]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&AS_MESSAGE_LOG_FD) + (eval "$lt_compile" 2>out/conftest.err) + ac_status=$? + cat out/conftest.err >&AS_MESSAGE_LOG_FD + echo "$as_me:$LINENO: \$? = $ac_status" >&AS_MESSAGE_LOG_FD + if (exit $ac_status) && test -s out/conftest2.$ac_objext + then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings + $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp + $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 + if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then + _LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)=yes + fi + fi + chmod u+w . 2>&AS_MESSAGE_LOG_FD + $RM conftest* + # SGI C++ compiler will create directory out/ii_files/ for + # template instantiation + test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files + $RM out/* && rmdir out + cd .. + $RM -r conftest + $RM conftest* +]) +_LT_TAGDECL([compiler_c_o], [lt_cv_prog_compiler_c_o], [1], + [Does compiler simultaneously support -c and -o options?]) +])# _LT_COMPILER_C_O + + +# _LT_COMPILER_FILE_LOCKS([TAGNAME]) +# ---------------------------------- +# Check to see if we can do hard links to lock some files if needed +m4_defun([_LT_COMPILER_FILE_LOCKS], +[m4_require([_LT_ENABLE_LOCK])dnl +m4_require([_LT_FILEUTILS_DEFAULTS])dnl +_LT_COMPILER_C_O([$1]) + +hard_links="nottested" +if test "$_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)" = no && test "$need_locks" != no; then + # do not overwrite the value of need_locks provided by the user + AC_MSG_CHECKING([if we can lock with hard links]) + hard_links=yes + $RM conftest* + ln conftest.a conftest.b 2>/dev/null && hard_links=no + touch conftest.a + ln conftest.a conftest.b 2>&5 || hard_links=no + ln conftest.a conftest.b 2>/dev/null && hard_links=no + AC_MSG_RESULT([$hard_links]) + if test "$hard_links" = no; then + AC_MSG_WARN([`$CC' does not support `-c -o', so `make -j' may be unsafe]) + need_locks=warn + fi +else + need_locks=no +fi +_LT_DECL([], [need_locks], [1], [Must we lock files when doing compilation?]) +])# _LT_COMPILER_FILE_LOCKS + + +# _LT_CHECK_OBJDIR +# ---------------- +m4_defun([_LT_CHECK_OBJDIR], +[AC_CACHE_CHECK([for objdir], [lt_cv_objdir], +[rm -f .libs 2>/dev/null +mkdir .libs 2>/dev/null +if test -d .libs; then + lt_cv_objdir=.libs +else + # MS-DOS does not allow filenames that begin with a dot. + lt_cv_objdir=_libs +fi +rmdir .libs 2>/dev/null]) +objdir=$lt_cv_objdir +_LT_DECL([], [objdir], [0], + [The name of the directory that contains temporary libtool files])dnl +m4_pattern_allow([LT_OBJDIR])dnl +AC_DEFINE_UNQUOTED(LT_OBJDIR, "$lt_cv_objdir/", + [Define to the sub-directory in which libtool stores uninstalled libraries.]) +])# _LT_CHECK_OBJDIR + + +# _LT_LINKER_HARDCODE_LIBPATH([TAGNAME]) +# -------------------------------------- +# Check hardcoding attributes. +m4_defun([_LT_LINKER_HARDCODE_LIBPATH], +[AC_MSG_CHECKING([how to hardcode library paths into programs]) +_LT_TAGVAR(hardcode_action, $1)= +if test -n "$_LT_TAGVAR(hardcode_libdir_flag_spec, $1)" || + test -n "$_LT_TAGVAR(runpath_var, $1)" || + test "X$_LT_TAGVAR(hardcode_automatic, $1)" = "Xyes" ; then + + # We can hardcode non-existent directories. + if test "$_LT_TAGVAR(hardcode_direct, $1)" != no && + # If the only mechanism to avoid hardcoding is shlibpath_var, we + # have to relink, otherwise we might link with an installed library + # when we should be linking with a yet-to-be-installed one + ## test "$_LT_TAGVAR(hardcode_shlibpath_var, $1)" != no && + test "$_LT_TAGVAR(hardcode_minus_L, $1)" != no; then + # Linking always hardcodes the temporary library directory. + _LT_TAGVAR(hardcode_action, $1)=relink + else + # We can link without hardcoding, and we can hardcode nonexisting dirs. + _LT_TAGVAR(hardcode_action, $1)=immediate + fi +else + # We cannot hardcode anything, or else we can only hardcode existing + # directories. + _LT_TAGVAR(hardcode_action, $1)=unsupported +fi +AC_MSG_RESULT([$_LT_TAGVAR(hardcode_action, $1)]) + +if test "$_LT_TAGVAR(hardcode_action, $1)" = relink || + test "$_LT_TAGVAR(inherit_rpath, $1)" = yes; then + # Fast installation is not supported + enable_fast_install=no +elif test "$shlibpath_overrides_runpath" = yes || + test "$enable_shared" = no; then + # Fast installation is not necessary + enable_fast_install=needless +fi +_LT_TAGDECL([], [hardcode_action], [0], + [How to hardcode a shared library path into an executable]) +])# _LT_LINKER_HARDCODE_LIBPATH + + +# _LT_CMD_STRIPLIB +# ---------------- +m4_defun([_LT_CMD_STRIPLIB], +[m4_require([_LT_DECL_EGREP]) +striplib= +old_striplib= +AC_MSG_CHECKING([whether stripping libraries is possible]) +if test -n "$STRIP" && $STRIP -V 2>&1 | $GREP "GNU strip" >/dev/null; then + test -z "$old_striplib" && old_striplib="$STRIP --strip-debug" + test -z "$striplib" && striplib="$STRIP --strip-unneeded" + AC_MSG_RESULT([yes]) +else +# FIXME - insert some real tests, host_os isn't really good enough + case $host_os in + darwin*) + if test -n "$STRIP" ; then + striplib="$STRIP -x" + old_striplib="$STRIP -S" + AC_MSG_RESULT([yes]) + else + AC_MSG_RESULT([no]) + fi + ;; + *) + AC_MSG_RESULT([no]) + ;; + esac +fi +_LT_DECL([], [old_striplib], [1], [Commands to strip libraries]) +_LT_DECL([], [striplib], [1]) +])# _LT_CMD_STRIPLIB + + +# _LT_SYS_DYNAMIC_LINKER([TAG]) +# ----------------------------- +# PORTME Fill in your ld.so characteristics +m4_defun([_LT_SYS_DYNAMIC_LINKER], +[AC_REQUIRE([AC_CANONICAL_HOST])dnl +m4_require([_LT_DECL_EGREP])dnl +m4_require([_LT_FILEUTILS_DEFAULTS])dnl +m4_require([_LT_DECL_OBJDUMP])dnl +m4_require([_LT_DECL_SED])dnl +m4_require([_LT_CHECK_SHELL_FEATURES])dnl +AC_MSG_CHECKING([dynamic linker characteristics]) +m4_if([$1], + [], [ +if test "$GCC" = yes; then + case $host_os in + darwin*) lt_awk_arg="/^libraries:/,/LR/" ;; + *) lt_awk_arg="/^libraries:/" ;; + esac + case $host_os in + mingw* | cegcc*) lt_sed_strip_eq="s,=\([[A-Za-z]]:\),\1,g" ;; + *) lt_sed_strip_eq="s,=/,/,g" ;; + esac + lt_search_path_spec=`$CC -print-search-dirs | awk $lt_awk_arg | $SED -e "s/^libraries://" -e $lt_sed_strip_eq` + case $lt_search_path_spec in + *\;*) + # if the path contains ";" then we assume it to be the separator + # otherwise default to the standard path separator (i.e. ":") - it is + # assumed that no part of a normal pathname contains ";" but that should + # okay in the real world where ";" in dirpaths is itself problematic. + lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED 's/;/ /g'` + ;; + *) + lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED "s/$PATH_SEPARATOR/ /g"` + ;; + esac + # Ok, now we have the path, separated by spaces, we can step through it + # and add multilib dir if necessary. + lt_tmp_lt_search_path_spec= + lt_multi_os_dir=`$CC $CPPFLAGS $CFLAGS $LDFLAGS -print-multi-os-directory 2>/dev/null` + for lt_sys_path in $lt_search_path_spec; do + if test -d "$lt_sys_path/$lt_multi_os_dir"; then + lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path/$lt_multi_os_dir" + else + test -d "$lt_sys_path" && \ + lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path" + fi + done + lt_search_path_spec=`$ECHO "$lt_tmp_lt_search_path_spec" | awk ' +BEGIN {RS=" "; FS="/|\n";} { + lt_foo=""; + lt_count=0; + for (lt_i = NF; lt_i > 0; lt_i--) { + if ($lt_i != "" && $lt_i != ".") { + if ($lt_i == "..") { + lt_count++; + } else { + if (lt_count == 0) { + lt_foo="/" $lt_i lt_foo; + } else { + lt_count--; + } + } + } + } + if (lt_foo != "") { lt_freq[[lt_foo]]++; } + if (lt_freq[[lt_foo]] == 1) { print lt_foo; } +}'` + # AWK program above erroneously prepends '/' to C:/dos/paths + # for these hosts. + case $host_os in + mingw* | cegcc*) lt_search_path_spec=`$ECHO "$lt_search_path_spec" |\ + $SED 's,/\([[A-Za-z]]:\),\1,g'` ;; + esac + sys_lib_search_path_spec=`$ECHO "$lt_search_path_spec" | $lt_NL2SP` +else + sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" +fi]) +library_names_spec= +libname_spec='lib$name' +soname_spec= +shrext_cmds=".so" +postinstall_cmds= +postuninstall_cmds= +finish_cmds= +finish_eval= +shlibpath_var= +shlibpath_overrides_runpath=unknown +version_type=none +dynamic_linker="$host_os ld.so" +sys_lib_dlsearch_path_spec="/lib /usr/lib" +need_lib_prefix=unknown +hardcode_into_libs=no + +# when you set need_version to no, make sure it does not cause -set_version +# flags to be left without arguments +need_version=unknown + +case $host_os in +aix3*) + version_type=linux # correct to gnu/linux during the next big refactor + library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a' + shlibpath_var=LIBPATH + + # AIX 3 has no versioning support, so we append a major version to the name. + soname_spec='${libname}${release}${shared_ext}$major' + ;; + +aix[[4-9]]*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + hardcode_into_libs=yes + if test "$host_cpu" = ia64; then + # AIX 5 supports IA64 + library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}' + shlibpath_var=LD_LIBRARY_PATH + else + # With GCC up to 2.95.x, collect2 would create an import file + # for dependence libraries. The import file would start with + # the line `#! .'. This would cause the generated library to + # depend on `.', always an invalid library. This was fixed in + # development snapshots of GCC prior to 3.0. + case $host_os in + aix4 | aix4.[[01]] | aix4.[[01]].*) + if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)' + echo ' yes ' + echo '#endif'; } | ${CC} -E - | $GREP yes > /dev/null; then + : + else + can_build_shared=no + fi + ;; + esac + # AIX (on Power*) has no versioning support, so currently we can not hardcode correct + # soname into executable. Probably we can add versioning support to + # collect2, so additional links can be useful in future. + if test "$aix_use_runtimelinking" = yes; then + # If using run time linking (on AIX 4.2 or later) use lib.so + # instead of lib.a to let people know that these are not + # typical AIX shared libraries. + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + else + # We preserve .a as extension for shared libraries through AIX4.2 + # and later when we are not doing run time linking. + library_names_spec='${libname}${release}.a $libname.a' + soname_spec='${libname}${release}${shared_ext}$major' + fi + shlibpath_var=LIBPATH + fi + ;; + +amigaos*) + case $host_cpu in + powerpc) + # Since July 2007 AmigaOS4 officially supports .so libraries. + # When compiling the executable, add -use-dynld -Lsobjs: to the compileline. + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + ;; + m68k) + library_names_spec='$libname.ixlibrary $libname.a' + # Create ${libname}_ixlibrary.a entries in /sys/libs. + finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`func_echo_all "$lib" | $SED '\''s%^.*/\([[^/]]*\)\.ixlibrary$%\1%'\''`; test $RM /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done' + ;; + esac + ;; + +beos*) + library_names_spec='${libname}${shared_ext}' + dynamic_linker="$host_os ld.so" + shlibpath_var=LIBRARY_PATH + ;; + +bsdi[[45]]*) + version_type=linux # correct to gnu/linux during the next big refactor + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir' + shlibpath_var=LD_LIBRARY_PATH + sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib" + sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib" + # the default ld.so.conf also contains /usr/contrib/lib and + # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow + # libtool to hard-code these into programs + ;; + +cygwin* | mingw* | pw32* | cegcc*) + version_type=windows + shrext_cmds=".dll" + need_version=no + need_lib_prefix=no + + case $GCC,$cc_basename in + yes,*) + # gcc + library_names_spec='$libname.dll.a' + # DLL is installed to $(libdir)/../bin by postinstall_cmds + postinstall_cmds='base_file=`basename \${file}`~ + dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~ + dldir=$destdir/`dirname \$dlpath`~ + test -d \$dldir || mkdir -p \$dldir~ + $install_prog $dir/$dlname \$dldir/$dlname~ + chmod a+x \$dldir/$dlname~ + if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then + eval '\''$striplib \$dldir/$dlname'\'' || exit \$?; + fi' + postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ + dlpath=$dir/\$dldll~ + $RM \$dlpath' + shlibpath_overrides_runpath=yes + + case $host_os in + cygwin*) + # Cygwin DLLs use 'cyg' prefix rather than 'lib' + soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}' +m4_if([$1], [],[ + sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/lib/w32api"]) + ;; + mingw* | cegcc*) + # MinGW DLLs use traditional 'lib' prefix + soname_spec='${libname}`echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}' + ;; + pw32*) + # pw32 DLLs use 'pw' prefix rather than 'lib' + library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}' + ;; + esac + dynamic_linker='Win32 ld.exe' + ;; + + *,cl*) + # Native MSVC + libname_spec='$name' + soname_spec='${libname}`echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}' + library_names_spec='${libname}.dll.lib' + + case $build_os in + mingw*) + sys_lib_search_path_spec= + lt_save_ifs=$IFS + IFS=';' + for lt_path in $LIB + do + IFS=$lt_save_ifs + # Let DOS variable expansion print the short 8.3 style file name. + lt_path=`cd "$lt_path" 2>/dev/null && cmd //C "for %i in (".") do @echo %~si"` + sys_lib_search_path_spec="$sys_lib_search_path_spec $lt_path" + done + IFS=$lt_save_ifs + # Convert to MSYS style. + sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | sed -e 's|\\\\|/|g' -e 's| \\([[a-zA-Z]]\\):| /\\1|g' -e 's|^ ||'` + ;; + cygwin*) + # Convert to unix form, then to dos form, then back to unix form + # but this time dos style (no spaces!) so that the unix form looks + # like /cygdrive/c/PROGRA~1:/cygdr... + sys_lib_search_path_spec=`cygpath --path --unix "$LIB"` + sys_lib_search_path_spec=`cygpath --path --dos "$sys_lib_search_path_spec" 2>/dev/null` + sys_lib_search_path_spec=`cygpath --path --unix "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` + ;; + *) + sys_lib_search_path_spec="$LIB" + if $ECHO "$sys_lib_search_path_spec" | [$GREP ';[c-zC-Z]:/' >/dev/null]; then + # It is most probably a Windows format PATH. + sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` + else + sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` + fi + # FIXME: find the short name or the path components, as spaces are + # common. (e.g. "Program Files" -> "PROGRA~1") + ;; + esac + + # DLL is installed to $(libdir)/../bin by postinstall_cmds + postinstall_cmds='base_file=`basename \${file}`~ + dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~ + dldir=$destdir/`dirname \$dlpath`~ + test -d \$dldir || mkdir -p \$dldir~ + $install_prog $dir/$dlname \$dldir/$dlname' + postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ + dlpath=$dir/\$dldll~ + $RM \$dlpath' + shlibpath_overrides_runpath=yes + dynamic_linker='Win32 link.exe' + ;; + + *) + # Assume MSVC wrapper + library_names_spec='${libname}`echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext} $libname.lib' + dynamic_linker='Win32 ld.exe' + ;; + esac + # FIXME: first we should search . and the directory the executable is in + shlibpath_var=PATH + ;; + +darwin* | rhapsody*) + dynamic_linker="$host_os dyld" + version_type=darwin + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${major}$shared_ext ${libname}$shared_ext' + soname_spec='${libname}${release}${major}$shared_ext' + shlibpath_overrides_runpath=yes + shlibpath_var=DYLD_LIBRARY_PATH + shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`' +m4_if([$1], [],[ + sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/local/lib"]) + sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib' + ;; + +dgux*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + ;; + +freebsd* | dragonfly*) + # DragonFly does not have aout. When/if they implement a new + # versioning mechanism, adjust this. + if test -x /usr/bin/objformat; then + objformat=`/usr/bin/objformat` + else + case $host_os in + freebsd[[23]].*) objformat=aout ;; + *) objformat=elf ;; + esac + fi + version_type=freebsd-$objformat + case $version_type in + freebsd-elf*) + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' + need_version=no + need_lib_prefix=no + ;; + freebsd-*) + library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix' + need_version=yes + ;; + esac + shlibpath_var=LD_LIBRARY_PATH + case $host_os in + freebsd2.*) + shlibpath_overrides_runpath=yes + ;; + freebsd3.[[01]]* | freebsdelf3.[[01]]*) + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + freebsd3.[[2-9]]* | freebsdelf3.[[2-9]]* | \ + freebsd4.[[0-5]] | freebsdelf4.[[0-5]] | freebsd4.1.1 | freebsdelf4.1.1) + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; + *) # from 4.6 on, and DragonFly + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + esac + ;; + +gnu*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; + +haiku*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + dynamic_linker="$host_os runtime_loader" + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LIBRARY_PATH + shlibpath_overrides_runpath=yes + sys_lib_dlsearch_path_spec='/boot/home/config/lib /boot/common/lib /boot/system/lib' + hardcode_into_libs=yes + ;; + +hpux9* | hpux10* | hpux11*) + # Give a soname corresponding to the major version so that dld.sl refuses to + # link against other versions. + version_type=sunos + need_lib_prefix=no + need_version=no + case $host_cpu in + ia64*) + shrext_cmds='.so' + hardcode_into_libs=yes + dynamic_linker="$host_os dld.so" + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + if test "X$HPUX_IA64_MODE" = X32; then + sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib" + else + sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64" + fi + sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec + ;; + hppa*64*) + shrext_cmds='.sl' + hardcode_into_libs=yes + dynamic_linker="$host_os dld.sl" + shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH + shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64" + sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec + ;; + *) + shrext_cmds='.sl' + dynamic_linker="$host_os dld.sl" + shlibpath_var=SHLIB_PATH + shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + ;; + esac + # HP-UX runs *really* slowly unless shared libraries are mode 555, ... + postinstall_cmds='chmod 555 $lib' + # or fails outright, so override atomically: + install_override_mode=555 + ;; + +interix[[3-9]]*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; + +irix5* | irix6* | nonstopux*) + case $host_os in + nonstopux*) version_type=nonstopux ;; + *) + if test "$lt_cv_prog_gnu_ld" = yes; then + version_type=linux # correct to gnu/linux during the next big refactor + else + version_type=irix + fi ;; + esac + need_lib_prefix=no + need_version=no + soname_spec='${libname}${release}${shared_ext}$major' + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}' + case $host_os in + irix5* | nonstopux*) + libsuff= shlibsuff= + ;; + *) + case $LD in # libtool.m4 will add one of these switches to LD + *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") + libsuff= shlibsuff= libmagic=32-bit;; + *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") + libsuff=32 shlibsuff=N32 libmagic=N32;; + *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") + libsuff=64 shlibsuff=64 libmagic=64-bit;; + *) libsuff= shlibsuff= libmagic=never-match;; + esac + ;; + esac + shlibpath_var=LD_LIBRARY${shlibsuff}_PATH + shlibpath_overrides_runpath=no + sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}" + sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}" + hardcode_into_libs=yes + ;; + +# No shared lib support for Linux oldld, aout, or coff. +linux*oldld* | linux*aout* | linux*coff*) + dynamic_linker=no + ;; + +# This must be glibc/ELF. +linux* | k*bsd*-gnu | kopensolaris*-gnu) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + + # Some binutils ld are patched to set DT_RUNPATH + AC_CACHE_VAL([lt_cv_shlibpath_overrides_runpath], + [lt_cv_shlibpath_overrides_runpath=no + save_LDFLAGS=$LDFLAGS + save_libdir=$libdir + eval "libdir=/foo; wl=\"$_LT_TAGVAR(lt_prog_compiler_wl, $1)\"; \ + LDFLAGS=\"\$LDFLAGS $_LT_TAGVAR(hardcode_libdir_flag_spec, $1)\"" + AC_LINK_IFELSE([AC_LANG_PROGRAM([],[])], + [AS_IF([ ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir" >/dev/null], + [lt_cv_shlibpath_overrides_runpath=yes])]) + LDFLAGS=$save_LDFLAGS + libdir=$save_libdir + ]) + shlibpath_overrides_runpath=$lt_cv_shlibpath_overrides_runpath + + # This implies no fast_install, which is unacceptable. + # Some rework will be needed to allow for fast_install + # before this can be enabled. + hardcode_into_libs=yes + + # Append ld.so.conf contents to the search path + if test -f /etc/ld.so.conf; then + lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \[$]2)); skip = 1; } { if (!skip) print \[$]0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[ ]*hwcap[ ]/d;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;s/"//g;/^$/d' | tr '\n' ' '` + sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra" + fi + + # We used to test for /lib/ld.so.1 and disable shared libraries on + # powerpc, because MkLinux only supported shared libraries with the + # GNU dynamic linker. Since this was broken with cross compilers, + # most powerpc-linux boxes support dynamic linking these days and + # people can always --disable-shared, the test was removed, and we + # assume the GNU/Linux dynamic linker is in use. + dynamic_linker='GNU/Linux ld.so' + ;; + +netbsdelf*-gnu) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + dynamic_linker='NetBSD ld.elf_so' + ;; + +netbsd*) + version_type=sunos + need_lib_prefix=no + need_version=no + if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' + dynamic_linker='NetBSD (a.out) ld.so' + else + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + dynamic_linker='NetBSD ld.elf_so' + fi + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + +newsos6) + version_type=linux # correct to gnu/linux during the next big refactor + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + ;; + +*nto* | *qnx*) + version_type=qnx + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + dynamic_linker='ldqnx.so' + ;; + +openbsd*) + version_type=sunos + sys_lib_dlsearch_path_spec="/usr/lib" + need_lib_prefix=no + # Some older versions of OpenBSD (3.3 at least) *do* need versioned libs. + case $host_os in + openbsd3.3 | openbsd3.3.*) need_version=yes ;; + *) need_version=no ;; + esac + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' + shlibpath_var=LD_LIBRARY_PATH + if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then + case $host_os in + openbsd2.[[89]] | openbsd2.[[89]].*) + shlibpath_overrides_runpath=no + ;; + *) + shlibpath_overrides_runpath=yes + ;; + esac + else + shlibpath_overrides_runpath=yes + fi + ;; + +os2*) + libname_spec='$name' + shrext_cmds=".dll" + need_lib_prefix=no + library_names_spec='$libname${shared_ext} $libname.a' + dynamic_linker='OS/2 ld.exe' + shlibpath_var=LIBPATH + ;; + +osf3* | osf4* | osf5*) + version_type=osf + need_lib_prefix=no + need_version=no + soname_spec='${libname}${release}${shared_ext}$major' + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + shlibpath_var=LD_LIBRARY_PATH + sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib" + sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec" + ;; + +rdos*) + dynamic_linker=no + ;; + +solaris*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + # ldd complains unless libraries are executable + postinstall_cmds='chmod +x $lib' + ;; + +sunos4*) + version_type=sunos + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' + finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + if test "$with_gnu_ld" = yes; then + need_lib_prefix=no + fi + need_version=yes + ;; + +sysv4 | sysv4.3*) + version_type=linux # correct to gnu/linux during the next big refactor + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + case $host_vendor in + sni) + shlibpath_overrides_runpath=no + need_lib_prefix=no + runpath_var=LD_RUN_PATH + ;; + siemens) + need_lib_prefix=no + ;; + motorola) + need_lib_prefix=no + need_version=no + shlibpath_overrides_runpath=no + sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib' + ;; + esac + ;; + +sysv4*MP*) + if test -d /usr/nec ;then + version_type=linux # correct to gnu/linux during the next big refactor + library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}' + soname_spec='$libname${shared_ext}.$major' + shlibpath_var=LD_LIBRARY_PATH + fi + ;; + +sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) + version_type=freebsd-elf + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + if test "$with_gnu_ld" = yes; then + sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib' + else + sys_lib_search_path_spec='/usr/ccs/lib /usr/lib' + case $host_os in + sco3.2v5*) + sys_lib_search_path_spec="$sys_lib_search_path_spec /lib" + ;; + esac + fi + sys_lib_dlsearch_path_spec='/usr/lib' + ;; + +tpf*) + # TPF is a cross-target only. Preferred cross-host = GNU/Linux. + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; + +uts4*) + version_type=linux # correct to gnu/linux during the next big refactor + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + ;; + +*) + dynamic_linker=no + ;; +esac +AC_MSG_RESULT([$dynamic_linker]) +test "$dynamic_linker" = no && can_build_shared=no + +variables_saved_for_relink="PATH $shlibpath_var $runpath_var" +if test "$GCC" = yes; then + variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" +fi + +if test "${lt_cv_sys_lib_search_path_spec+set}" = set; then + sys_lib_search_path_spec="$lt_cv_sys_lib_search_path_spec" +fi +if test "${lt_cv_sys_lib_dlsearch_path_spec+set}" = set; then + sys_lib_dlsearch_path_spec="$lt_cv_sys_lib_dlsearch_path_spec" +fi + +_LT_DECL([], [variables_saved_for_relink], [1], + [Variables whose values should be saved in libtool wrapper scripts and + restored at link time]) +_LT_DECL([], [need_lib_prefix], [0], + [Do we need the "lib" prefix for modules?]) +_LT_DECL([], [need_version], [0], [Do we need a version for libraries?]) +_LT_DECL([], [version_type], [0], [Library versioning type]) +_LT_DECL([], [runpath_var], [0], [Shared library runtime path variable]) +_LT_DECL([], [shlibpath_var], [0],[Shared library path variable]) +_LT_DECL([], [shlibpath_overrides_runpath], [0], + [Is shlibpath searched before the hard-coded library search path?]) +_LT_DECL([], [libname_spec], [1], [Format of library name prefix]) +_LT_DECL([], [library_names_spec], [1], + [[List of archive names. First name is the real one, the rest are links. + The last name is the one that the linker finds with -lNAME]]) +_LT_DECL([], [soname_spec], [1], + [[The coded name of the library, if different from the real name]]) +_LT_DECL([], [install_override_mode], [1], + [Permission mode override for installation of shared libraries]) +_LT_DECL([], [postinstall_cmds], [2], + [Command to use after installation of a shared archive]) +_LT_DECL([], [postuninstall_cmds], [2], + [Command to use after uninstallation of a shared archive]) +_LT_DECL([], [finish_cmds], [2], + [Commands used to finish a libtool library installation in a directory]) +_LT_DECL([], [finish_eval], [1], + [[As "finish_cmds", except a single script fragment to be evaled but + not shown]]) +_LT_DECL([], [hardcode_into_libs], [0], + [Whether we should hardcode library paths into libraries]) +_LT_DECL([], [sys_lib_search_path_spec], [2], + [Compile-time system search path for libraries]) +_LT_DECL([], [sys_lib_dlsearch_path_spec], [2], + [Run-time system search path for libraries]) +])# _LT_SYS_DYNAMIC_LINKER + + +# _LT_PATH_TOOL_PREFIX(TOOL) +# -------------------------- +# find a file program which can recognize shared library +AC_DEFUN([_LT_PATH_TOOL_PREFIX], +[m4_require([_LT_DECL_EGREP])dnl +AC_MSG_CHECKING([for $1]) +AC_CACHE_VAL(lt_cv_path_MAGIC_CMD, +[case $MAGIC_CMD in +[[\\/*] | ?:[\\/]*]) + lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path. + ;; +*) + lt_save_MAGIC_CMD="$MAGIC_CMD" + lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR +dnl $ac_dummy forces splitting on constant user-supplied paths. +dnl POSIX.2 word splitting is done only on the output of word expansions, +dnl not every word. This closes a longstanding sh security hole. + ac_dummy="m4_if([$2], , $PATH, [$2])" + for ac_dir in $ac_dummy; do + IFS="$lt_save_ifs" + test -z "$ac_dir" && ac_dir=. + if test -f $ac_dir/$1; then + lt_cv_path_MAGIC_CMD="$ac_dir/$1" + if test -n "$file_magic_test_file"; then + case $deplibs_check_method in + "file_magic "*) + file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"` + MAGIC_CMD="$lt_cv_path_MAGIC_CMD" + if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null | + $EGREP "$file_magic_regex" > /dev/null; then + : + else + cat <<_LT_EOF 1>&2 + +*** Warning: the command libtool uses to detect shared libraries, +*** $file_magic_cmd, produces output that libtool cannot recognize. +*** The result is that libtool may fail to recognize shared libraries +*** as such. This will affect the creation of libtool libraries that +*** depend on shared libraries, but programs linked with such libtool +*** libraries will work regardless of this problem. Nevertheless, you +*** may want to report the problem to your system manager and/or to +*** bug-libtool@gnu.org + +_LT_EOF + fi ;; + esac + fi + break + fi + done + IFS="$lt_save_ifs" + MAGIC_CMD="$lt_save_MAGIC_CMD" + ;; +esac]) +MAGIC_CMD="$lt_cv_path_MAGIC_CMD" +if test -n "$MAGIC_CMD"; then + AC_MSG_RESULT($MAGIC_CMD) +else + AC_MSG_RESULT(no) +fi +_LT_DECL([], [MAGIC_CMD], [0], + [Used to examine libraries when file_magic_cmd begins with "file"])dnl +])# _LT_PATH_TOOL_PREFIX + +# Old name: +AU_ALIAS([AC_PATH_TOOL_PREFIX], [_LT_PATH_TOOL_PREFIX]) +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AC_PATH_TOOL_PREFIX], []) + + +# _LT_PATH_MAGIC +# -------------- +# find a file program which can recognize a shared library +m4_defun([_LT_PATH_MAGIC], +[_LT_PATH_TOOL_PREFIX(${ac_tool_prefix}file, /usr/bin$PATH_SEPARATOR$PATH) +if test -z "$lt_cv_path_MAGIC_CMD"; then + if test -n "$ac_tool_prefix"; then + _LT_PATH_TOOL_PREFIX(file, /usr/bin$PATH_SEPARATOR$PATH) + else + MAGIC_CMD=: + fi +fi +])# _LT_PATH_MAGIC + + +# LT_PATH_LD +# ---------- +# find the pathname to the GNU or non-GNU linker +AC_DEFUN([LT_PATH_LD], +[AC_REQUIRE([AC_PROG_CC])dnl +AC_REQUIRE([AC_CANONICAL_HOST])dnl +AC_REQUIRE([AC_CANONICAL_BUILD])dnl +m4_require([_LT_DECL_SED])dnl +m4_require([_LT_DECL_EGREP])dnl +m4_require([_LT_PROG_ECHO_BACKSLASH])dnl + +AC_ARG_WITH([gnu-ld], + [AS_HELP_STRING([--with-gnu-ld], + [assume the C compiler uses GNU ld @<:@default=no@:>@])], + [test "$withval" = no || with_gnu_ld=yes], + [with_gnu_ld=no])dnl + +ac_prog=ld +if test "$GCC" = yes; then + # Check if gcc -print-prog-name=ld gives a path. + AC_MSG_CHECKING([for ld used by $CC]) + case $host in + *-*-mingw*) + # gcc leaves a trailing carriage return which upsets mingw + ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;; + *) + ac_prog=`($CC -print-prog-name=ld) 2>&5` ;; + esac + case $ac_prog in + # Accept absolute paths. + [[\\/]]* | ?:[[\\/]]*) + re_direlt='/[[^/]][[^/]]*/\.\./' + # Canonicalize the pathname of ld + ac_prog=`$ECHO "$ac_prog"| $SED 's%\\\\%/%g'` + while $ECHO "$ac_prog" | $GREP "$re_direlt" > /dev/null 2>&1; do + ac_prog=`$ECHO $ac_prog| $SED "s%$re_direlt%/%"` + done + test -z "$LD" && LD="$ac_prog" + ;; + "") + # If it fails, then pretend we aren't using GCC. + ac_prog=ld + ;; + *) + # If it is relative, then search for the first ld in PATH. + with_gnu_ld=unknown + ;; + esac +elif test "$with_gnu_ld" = yes; then + AC_MSG_CHECKING([for GNU ld]) +else + AC_MSG_CHECKING([for non-GNU ld]) +fi +AC_CACHE_VAL(lt_cv_path_LD, +[if test -z "$LD"; then + lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR + for ac_dir in $PATH; do + IFS="$lt_save_ifs" + test -z "$ac_dir" && ac_dir=. + if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then + lt_cv_path_LD="$ac_dir/$ac_prog" + # Check to see if the program is GNU ld. I'd rather use --version, + # but apparently some variants of GNU ld only accept -v. + # Break only if it was the GNU/non-GNU ld that we prefer. + case `"$lt_cv_path_LD" -v 2>&1 &1 /dev/null 2>&1; then + lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL' + lt_cv_file_magic_cmd='func_win32_libid' + else + # Keep this pattern in sync with the one in func_win32_libid. + lt_cv_deplibs_check_method='file_magic file format (pei*-i386(.*architecture: i386)?|pe-arm-wince|pe-x86-64)' + lt_cv_file_magic_cmd='$OBJDUMP -f' + fi + ;; + +cegcc*) + # use the weaker test based on 'objdump'. See mingw*. + lt_cv_deplibs_check_method='file_magic file format pe-arm-.*little(.*architecture: arm)?' + lt_cv_file_magic_cmd='$OBJDUMP -f' + ;; + +darwin* | rhapsody*) + lt_cv_deplibs_check_method=pass_all + ;; + +freebsd* | dragonfly*) + if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then + case $host_cpu in + i*86 ) + # Not sure whether the presence of OpenBSD here was a mistake. + # Let's accept both of them until this is cleared up. + lt_cv_deplibs_check_method='file_magic (FreeBSD|OpenBSD|DragonFly)/i[[3-9]]86 (compact )?demand paged shared library' + lt_cv_file_magic_cmd=/usr/bin/file + lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*` + ;; + esac + else + lt_cv_deplibs_check_method=pass_all + fi + ;; + +gnu*) + lt_cv_deplibs_check_method=pass_all + ;; + +haiku*) + lt_cv_deplibs_check_method=pass_all + ;; + +hpux10.20* | hpux11*) + lt_cv_file_magic_cmd=/usr/bin/file + case $host_cpu in + ia64*) + lt_cv_deplibs_check_method='file_magic (s[[0-9]][[0-9]][[0-9]]|ELF-[[0-9]][[0-9]]) shared object file - IA64' + lt_cv_file_magic_test_file=/usr/lib/hpux32/libc.so + ;; + hppa*64*) + [lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF[ -][0-9][0-9])(-bit)?( [LM]SB)? shared object( file)?[, -]* PA-RISC [0-9]\.[0-9]'] + lt_cv_file_magic_test_file=/usr/lib/pa20_64/libc.sl + ;; + *) + lt_cv_deplibs_check_method='file_magic (s[[0-9]][[0-9]][[0-9]]|PA-RISC[[0-9]]\.[[0-9]]) shared library' + lt_cv_file_magic_test_file=/usr/lib/libc.sl + ;; + esac + ;; + +interix[[3-9]]*) + # PIC code is broken on Interix 3.x, that's why |\.a not |_pic\.a here + lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so|\.a)$' + ;; + +irix5* | irix6* | nonstopux*) + case $LD in + *-32|*"-32 ") libmagic=32-bit;; + *-n32|*"-n32 ") libmagic=N32;; + *-64|*"-64 ") libmagic=64-bit;; + *) libmagic=never-match;; + esac + lt_cv_deplibs_check_method=pass_all + ;; + +# This must be glibc/ELF. +linux* | k*bsd*-gnu | kopensolaris*-gnu) + lt_cv_deplibs_check_method=pass_all + ;; + +netbsd* | netbsdelf*-gnu) + if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then + lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|_pic\.a)$' + else + lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so|_pic\.a)$' + fi + ;; + +newos6*) + lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (executable|dynamic lib)' + lt_cv_file_magic_cmd=/usr/bin/file + lt_cv_file_magic_test_file=/usr/lib/libnls.so + ;; + +*nto* | *qnx*) + lt_cv_deplibs_check_method=pass_all + ;; + +openbsd*) + if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then + lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|\.so|_pic\.a)$' + else + lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|_pic\.a)$' + fi + ;; + +osf3* | osf4* | osf5*) + lt_cv_deplibs_check_method=pass_all + ;; + +rdos*) + lt_cv_deplibs_check_method=pass_all + ;; + +solaris*) + lt_cv_deplibs_check_method=pass_all + ;; + +sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) + lt_cv_deplibs_check_method=pass_all + ;; + +sysv4 | sysv4.3*) + case $host_vendor in + motorola) + lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (shared object|dynamic lib) M[[0-9]][[0-9]]* Version [[0-9]]' + lt_cv_file_magic_test_file=`echo /usr/lib/libc.so*` + ;; + ncr) + lt_cv_deplibs_check_method=pass_all + ;; + sequent) + lt_cv_file_magic_cmd='/bin/file' + lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[LM]]SB (shared object|dynamic lib )' + ;; + sni) + lt_cv_file_magic_cmd='/bin/file' + lt_cv_deplibs_check_method="file_magic ELF [[0-9]][[0-9]]*-bit [[LM]]SB dynamic lib" + lt_cv_file_magic_test_file=/lib/libc.so + ;; + siemens) + lt_cv_deplibs_check_method=pass_all + ;; + pc) + lt_cv_deplibs_check_method=pass_all + ;; + esac + ;; + +tpf*) + lt_cv_deplibs_check_method=pass_all + ;; +esac +]) + +file_magic_glob= +want_nocaseglob=no +if test "$build" = "$host"; then + case $host_os in + mingw* | pw32*) + if ( shopt | grep nocaseglob ) >/dev/null 2>&1; then + want_nocaseglob=yes + else + file_magic_glob=`echo aAbBcCdDeEfFgGhHiIjJkKlLmMnNoOpPqQrRsStTuUvVwWxXyYzZ | $SED -e "s/\(..\)/s\/[[\1]]\/[[\1]]\/g;/g"` + fi + ;; + esac +fi + +file_magic_cmd=$lt_cv_file_magic_cmd +deplibs_check_method=$lt_cv_deplibs_check_method +test -z "$deplibs_check_method" && deplibs_check_method=unknown + +_LT_DECL([], [deplibs_check_method], [1], + [Method to check whether dependent libraries are shared objects]) +_LT_DECL([], [file_magic_cmd], [1], + [Command to use when deplibs_check_method = "file_magic"]) +_LT_DECL([], [file_magic_glob], [1], + [How to find potential files when deplibs_check_method = "file_magic"]) +_LT_DECL([], [want_nocaseglob], [1], + [Find potential files using nocaseglob when deplibs_check_method = "file_magic"]) +])# _LT_CHECK_MAGIC_METHOD + + +# LT_PATH_NM +# ---------- +# find the pathname to a BSD- or MS-compatible name lister +AC_DEFUN([LT_PATH_NM], +[AC_REQUIRE([AC_PROG_CC])dnl +AC_CACHE_CHECK([for BSD- or MS-compatible name lister (nm)], lt_cv_path_NM, +[if test -n "$NM"; then + # Let the user override the test. + lt_cv_path_NM="$NM" +else + lt_nm_to_check="${ac_tool_prefix}nm" + if test -n "$ac_tool_prefix" && test "$build" = "$host"; then + lt_nm_to_check="$lt_nm_to_check nm" + fi + for lt_tmp_nm in $lt_nm_to_check; do + lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR + for ac_dir in $PATH /usr/ccs/bin/elf /usr/ccs/bin /usr/ucb /bin; do + IFS="$lt_save_ifs" + test -z "$ac_dir" && ac_dir=. + tmp_nm="$ac_dir/$lt_tmp_nm" + if test -f "$tmp_nm" || test -f "$tmp_nm$ac_exeext" ; then + # Check to see if the nm accepts a BSD-compat flag. + # Adding the `sed 1q' prevents false positives on HP-UX, which says: + # nm: unknown option "B" ignored + # Tru64's nm complains that /dev/null is an invalid object file + case `"$tmp_nm" -B /dev/null 2>&1 | sed '1q'` in + */dev/null* | *'Invalid file or object type'*) + lt_cv_path_NM="$tmp_nm -B" + break + ;; + *) + case `"$tmp_nm" -p /dev/null 2>&1 | sed '1q'` in + */dev/null*) + lt_cv_path_NM="$tmp_nm -p" + break + ;; + *) + lt_cv_path_NM=${lt_cv_path_NM="$tmp_nm"} # keep the first match, but + continue # so that we can try to find one that supports BSD flags + ;; + esac + ;; + esac + fi + done + IFS="$lt_save_ifs" + done + : ${lt_cv_path_NM=no} +fi]) +if test "$lt_cv_path_NM" != "no"; then + NM="$lt_cv_path_NM" +else + # Didn't find any BSD compatible name lister, look for dumpbin. + if test -n "$DUMPBIN"; then : + # Let the user override the test. + else + AC_CHECK_TOOLS(DUMPBIN, [dumpbin "link -dump"], :) + case `$DUMPBIN -symbols /dev/null 2>&1 | sed '1q'` in + *COFF*) + DUMPBIN="$DUMPBIN -symbols" + ;; + *) + DUMPBIN=: + ;; + esac + fi + AC_SUBST([DUMPBIN]) + if test "$DUMPBIN" != ":"; then + NM="$DUMPBIN" + fi +fi +test -z "$NM" && NM=nm +AC_SUBST([NM]) +_LT_DECL([], [NM], [1], [A BSD- or MS-compatible name lister])dnl + +AC_CACHE_CHECK([the name lister ($NM) interface], [lt_cv_nm_interface], + [lt_cv_nm_interface="BSD nm" + echo "int some_variable = 0;" > conftest.$ac_ext + (eval echo "\"\$as_me:$LINENO: $ac_compile\"" >&AS_MESSAGE_LOG_FD) + (eval "$ac_compile" 2>conftest.err) + cat conftest.err >&AS_MESSAGE_LOG_FD + (eval echo "\"\$as_me:$LINENO: $NM \\\"conftest.$ac_objext\\\"\"" >&AS_MESSAGE_LOG_FD) + (eval "$NM \"conftest.$ac_objext\"" 2>conftest.err > conftest.out) + cat conftest.err >&AS_MESSAGE_LOG_FD + (eval echo "\"\$as_me:$LINENO: output\"" >&AS_MESSAGE_LOG_FD) + cat conftest.out >&AS_MESSAGE_LOG_FD + if $GREP 'External.*some_variable' conftest.out > /dev/null; then + lt_cv_nm_interface="MS dumpbin" + fi + rm -f conftest*]) +])# LT_PATH_NM + +# Old names: +AU_ALIAS([AM_PROG_NM], [LT_PATH_NM]) +AU_ALIAS([AC_PROG_NM], [LT_PATH_NM]) +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AM_PROG_NM], []) +dnl AC_DEFUN([AC_PROG_NM], []) + +# _LT_CHECK_SHAREDLIB_FROM_LINKLIB +# -------------------------------- +# how to determine the name of the shared library +# associated with a specific link library. +# -- PORTME fill in with the dynamic library characteristics +m4_defun([_LT_CHECK_SHAREDLIB_FROM_LINKLIB], +[m4_require([_LT_DECL_EGREP]) +m4_require([_LT_DECL_OBJDUMP]) +m4_require([_LT_DECL_DLLTOOL]) +AC_CACHE_CHECK([how to associate runtime and link libraries], +lt_cv_sharedlib_from_linklib_cmd, +[lt_cv_sharedlib_from_linklib_cmd='unknown' + +case $host_os in +cygwin* | mingw* | pw32* | cegcc*) + # two different shell functions defined in ltmain.sh + # decide which to use based on capabilities of $DLLTOOL + case `$DLLTOOL --help 2>&1` in + *--identify-strict*) + lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib + ;; + *) + lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib_fallback + ;; + esac + ;; +*) + # fallback: assume linklib IS sharedlib + lt_cv_sharedlib_from_linklib_cmd="$ECHO" + ;; +esac +]) +sharedlib_from_linklib_cmd=$lt_cv_sharedlib_from_linklib_cmd +test -z "$sharedlib_from_linklib_cmd" && sharedlib_from_linklib_cmd=$ECHO + +_LT_DECL([], [sharedlib_from_linklib_cmd], [1], + [Command to associate shared and link libraries]) +])# _LT_CHECK_SHAREDLIB_FROM_LINKLIB + + +# _LT_PATH_MANIFEST_TOOL +# ---------------------- +# locate the manifest tool +m4_defun([_LT_PATH_MANIFEST_TOOL], +[AC_CHECK_TOOL(MANIFEST_TOOL, mt, :) +test -z "$MANIFEST_TOOL" && MANIFEST_TOOL=mt +AC_CACHE_CHECK([if $MANIFEST_TOOL is a manifest tool], [lt_cv_path_mainfest_tool], + [lt_cv_path_mainfest_tool=no + echo "$as_me:$LINENO: $MANIFEST_TOOL '-?'" >&AS_MESSAGE_LOG_FD + $MANIFEST_TOOL '-?' 2>conftest.err > conftest.out + cat conftest.err >&AS_MESSAGE_LOG_FD + if $GREP 'Manifest Tool' conftest.out > /dev/null; then + lt_cv_path_mainfest_tool=yes + fi + rm -f conftest*]) +if test "x$lt_cv_path_mainfest_tool" != xyes; then + MANIFEST_TOOL=: +fi +_LT_DECL([], [MANIFEST_TOOL], [1], [Manifest tool])dnl +])# _LT_PATH_MANIFEST_TOOL + + +# LT_LIB_M +# -------- +# check for math library +AC_DEFUN([LT_LIB_M], +[AC_REQUIRE([AC_CANONICAL_HOST])dnl +LIBM= +case $host in +*-*-beos* | *-*-cegcc* | *-*-cygwin* | *-*-haiku* | *-*-pw32* | *-*-darwin*) + # These system don't have libm, or don't need it + ;; +*-ncr-sysv4.3*) + AC_CHECK_LIB(mw, _mwvalidcheckl, LIBM="-lmw") + AC_CHECK_LIB(m, cos, LIBM="$LIBM -lm") + ;; +*) + AC_CHECK_LIB(m, cos, LIBM="-lm") + ;; +esac +AC_SUBST([LIBM]) +])# LT_LIB_M + +# Old name: +AU_ALIAS([AC_CHECK_LIBM], [LT_LIB_M]) +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AC_CHECK_LIBM], []) + + +# _LT_COMPILER_NO_RTTI([TAGNAME]) +# ------------------------------- +m4_defun([_LT_COMPILER_NO_RTTI], +[m4_require([_LT_TAG_COMPILER])dnl + +_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)= + +if test "$GCC" = yes; then + case $cc_basename in + nvcc*) + _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -Xcompiler -fno-builtin' ;; + *) + _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -fno-builtin' ;; + esac + + _LT_COMPILER_OPTION([if $compiler supports -fno-rtti -fno-exceptions], + lt_cv_prog_compiler_rtti_exceptions, + [-fno-rtti -fno-exceptions], [], + [_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)="$_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1) -fno-rtti -fno-exceptions"]) +fi +_LT_TAGDECL([no_builtin_flag], [lt_prog_compiler_no_builtin_flag], [1], + [Compiler flag to turn off builtin functions]) +])# _LT_COMPILER_NO_RTTI + + +# _LT_CMD_GLOBAL_SYMBOLS +# ---------------------- +m4_defun([_LT_CMD_GLOBAL_SYMBOLS], +[AC_REQUIRE([AC_CANONICAL_HOST])dnl +AC_REQUIRE([AC_PROG_CC])dnl +AC_REQUIRE([AC_PROG_AWK])dnl +AC_REQUIRE([LT_PATH_NM])dnl +AC_REQUIRE([LT_PATH_LD])dnl +m4_require([_LT_DECL_SED])dnl +m4_require([_LT_DECL_EGREP])dnl +m4_require([_LT_TAG_COMPILER])dnl + +# Check for command to grab the raw symbol name followed by C symbol from nm. +AC_MSG_CHECKING([command to parse $NM output from $compiler object]) +AC_CACHE_VAL([lt_cv_sys_global_symbol_pipe], +[ +# These are sane defaults that work on at least a few old systems. +# [They come from Ultrix. What could be older than Ultrix?!! ;)] + +# Character class describing NM global symbol codes. +symcode='[[BCDEGRST]]' + +# Regexp to match symbols that can be accessed directly from C. +sympat='\([[_A-Za-z]][[_A-Za-z0-9]]*\)' + +# Define system-specific variables. +case $host_os in +aix*) + symcode='[[BCDT]]' + ;; +cygwin* | mingw* | pw32* | cegcc*) + symcode='[[ABCDGISTW]]' + ;; +hpux*) + if test "$host_cpu" = ia64; then + symcode='[[ABCDEGRST]]' + fi + ;; +irix* | nonstopux*) + symcode='[[BCDEGRST]]' + ;; +osf*) + symcode='[[BCDEGQRST]]' + ;; +solaris*) + symcode='[[BDRT]]' + ;; +sco3.2v5*) + symcode='[[DT]]' + ;; +sysv4.2uw2*) + symcode='[[DT]]' + ;; +sysv5* | sco5v6* | unixware* | OpenUNIX*) + symcode='[[ABDT]]' + ;; +sysv4) + symcode='[[DFNSTU]]' + ;; +esac + +# If we're using GNU nm, then use its standard symbol codes. +case `$NM -V 2>&1` in +*GNU* | *'with BFD'*) + symcode='[[ABCDGIRSTW]]' ;; +esac + +# Transform an extracted symbol line into a proper C declaration. +# Some systems (esp. on ia64) link data and code symbols differently, +# so use this general approach. +lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^T .* \(.*\)$/extern int \1();/p' -e 's/^$symcode* .* \(.*\)$/extern char \1;/p'" + +# Transform an extracted symbol line into symbol name and symbol address +lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([[^ ]]*\)[[ ]]*$/ {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([[^ ]]*\) \([[^ ]]*\)$/ {\"\2\", (void *) \&\2},/p'" +lt_cv_sys_global_symbol_to_c_name_address_lib_prefix="sed -n -e 's/^: \([[^ ]]*\)[[ ]]*$/ {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([[^ ]]*\) \(lib[[^ ]]*\)$/ {\"\2\", (void *) \&\2},/p' -e 's/^$symcode* \([[^ ]]*\) \([[^ ]]*\)$/ {\"lib\2\", (void *) \&\2},/p'" + +# Handle CRLF in mingw tool chain +opt_cr= +case $build_os in +mingw*) + opt_cr=`$ECHO 'x\{0,1\}' | tr x '\015'` # option cr in regexp + ;; +esac + +# Try without a prefix underscore, then with it. +for ac_symprfx in "" "_"; do + + # Transform symcode, sympat, and symprfx into a raw symbol and a C symbol. + symxfrm="\\1 $ac_symprfx\\2 \\2" + + # Write the raw and C identifiers. + if test "$lt_cv_nm_interface" = "MS dumpbin"; then + # Fake it for dumpbin and say T for any non-static function + # and D for any global variable. + # Also find C++ and __fastcall symbols from MSVC++, + # which start with @ or ?. + lt_cv_sys_global_symbol_pipe="$AWK ['"\ +" {last_section=section; section=\$ 3};"\ +" /^COFF SYMBOL TABLE/{for(i in hide) delete hide[i]};"\ +" /Section length .*#relocs.*(pick any)/{hide[last_section]=1};"\ +" \$ 0!~/External *\|/{next};"\ +" / 0+ UNDEF /{next}; / UNDEF \([^|]\)*()/{next};"\ +" {if(hide[section]) next};"\ +" {f=0}; \$ 0~/\(\).*\|/{f=1}; {printf f ? \"T \" : \"D \"};"\ +" {split(\$ 0, a, /\||\r/); split(a[2], s)};"\ +" s[1]~/^[@?]/{print s[1], s[1]; next};"\ +" s[1]~prfx {split(s[1],t,\"@\"); print t[1], substr(t[1],length(prfx))}"\ +" ' prfx=^$ac_symprfx]" + else + lt_cv_sys_global_symbol_pipe="sed -n -e 's/^.*[[ ]]\($symcode$symcode*\)[[ ]][[ ]]*$ac_symprfx$sympat$opt_cr$/$symxfrm/p'" + fi + lt_cv_sys_global_symbol_pipe="$lt_cv_sys_global_symbol_pipe | sed '/ __gnu_lto/d'" + + # Check to see that the pipe works correctly. + pipe_works=no + + rm -f conftest* + cat > conftest.$ac_ext <<_LT_EOF +#ifdef __cplusplus +extern "C" { +#endif +char nm_test_var; +void nm_test_func(void); +void nm_test_func(void){} +#ifdef __cplusplus +} +#endif +int main(){nm_test_var='a';nm_test_func();return(0);} +_LT_EOF + + if AC_TRY_EVAL(ac_compile); then + # Now try to grab the symbols. + nlist=conftest.nm + if AC_TRY_EVAL(NM conftest.$ac_objext \| "$lt_cv_sys_global_symbol_pipe" \> $nlist) && test -s "$nlist"; then + # Try sorting and uniquifying the output. + if sort "$nlist" | uniq > "$nlist"T; then + mv -f "$nlist"T "$nlist" + else + rm -f "$nlist"T + fi + + # Make sure that we snagged all the symbols we need. + if $GREP ' nm_test_var$' "$nlist" >/dev/null; then + if $GREP ' nm_test_func$' "$nlist" >/dev/null; then + cat <<_LT_EOF > conftest.$ac_ext +/* Keep this code in sync between libtool.m4, ltmain, lt_system.h, and tests. */ +#if defined(_WIN32) || defined(__CYGWIN__) || defined(_WIN32_WCE) +/* DATA imports from DLLs on WIN32 con't be const, because runtime + relocations are performed -- see ld's documentation on pseudo-relocs. */ +# define LT@&t@_DLSYM_CONST +#elif defined(__osf__) +/* This system does not cope well with relocations in const data. */ +# define LT@&t@_DLSYM_CONST +#else +# define LT@&t@_DLSYM_CONST const +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +_LT_EOF + # Now generate the symbol file. + eval "$lt_cv_sys_global_symbol_to_cdecl"' < "$nlist" | $GREP -v main >> conftest.$ac_ext' + + cat <<_LT_EOF >> conftest.$ac_ext + +/* The mapping between symbol names and symbols. */ +LT@&t@_DLSYM_CONST struct { + const char *name; + void *address; +} +lt__PROGRAM__LTX_preloaded_symbols[[]] = +{ + { "@PROGRAM@", (void *) 0 }, +_LT_EOF + $SED "s/^$symcode$symcode* \(.*\) \(.*\)$/ {\"\2\", (void *) \&\2},/" < "$nlist" | $GREP -v main >> conftest.$ac_ext + cat <<\_LT_EOF >> conftest.$ac_ext + {0, (void *) 0} +}; + +/* This works around a problem in FreeBSD linker */ +#ifdef FREEBSD_WORKAROUND +static const void *lt_preloaded_setup() { + return lt__PROGRAM__LTX_preloaded_symbols; +} +#endif + +#ifdef __cplusplus +} +#endif +_LT_EOF + # Now try linking the two files. + mv conftest.$ac_objext conftstm.$ac_objext + lt_globsym_save_LIBS=$LIBS + lt_globsym_save_CFLAGS=$CFLAGS + LIBS="conftstm.$ac_objext" + CFLAGS="$CFLAGS$_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)" + if AC_TRY_EVAL(ac_link) && test -s conftest${ac_exeext}; then + pipe_works=yes + fi + LIBS=$lt_globsym_save_LIBS + CFLAGS=$lt_globsym_save_CFLAGS + else + echo "cannot find nm_test_func in $nlist" >&AS_MESSAGE_LOG_FD + fi + else + echo "cannot find nm_test_var in $nlist" >&AS_MESSAGE_LOG_FD + fi + else + echo "cannot run $lt_cv_sys_global_symbol_pipe" >&AS_MESSAGE_LOG_FD + fi + else + echo "$progname: failed program was:" >&AS_MESSAGE_LOG_FD + cat conftest.$ac_ext >&5 + fi + rm -rf conftest* conftst* + + # Do not use the global_symbol_pipe unless it works. + if test "$pipe_works" = yes; then + break + else + lt_cv_sys_global_symbol_pipe= + fi +done +]) +if test -z "$lt_cv_sys_global_symbol_pipe"; then + lt_cv_sys_global_symbol_to_cdecl= +fi +if test -z "$lt_cv_sys_global_symbol_pipe$lt_cv_sys_global_symbol_to_cdecl"; then + AC_MSG_RESULT(failed) +else + AC_MSG_RESULT(ok) +fi + +# Response file support. +if test "$lt_cv_nm_interface" = "MS dumpbin"; then + nm_file_list_spec='@' +elif $NM --help 2>/dev/null | grep '[[@]]FILE' >/dev/null; then + nm_file_list_spec='@' +fi + +_LT_DECL([global_symbol_pipe], [lt_cv_sys_global_symbol_pipe], [1], + [Take the output of nm and produce a listing of raw symbols and C names]) +_LT_DECL([global_symbol_to_cdecl], [lt_cv_sys_global_symbol_to_cdecl], [1], + [Transform the output of nm in a proper C declaration]) +_LT_DECL([global_symbol_to_c_name_address], + [lt_cv_sys_global_symbol_to_c_name_address], [1], + [Transform the output of nm in a C name address pair]) +_LT_DECL([global_symbol_to_c_name_address_lib_prefix], + [lt_cv_sys_global_symbol_to_c_name_address_lib_prefix], [1], + [Transform the output of nm in a C name address pair when lib prefix is needed]) +_LT_DECL([], [nm_file_list_spec], [1], + [Specify filename containing input files for $NM]) +]) # _LT_CMD_GLOBAL_SYMBOLS + + +# _LT_COMPILER_PIC([TAGNAME]) +# --------------------------- +m4_defun([_LT_COMPILER_PIC], +[m4_require([_LT_TAG_COMPILER])dnl +_LT_TAGVAR(lt_prog_compiler_wl, $1)= +_LT_TAGVAR(lt_prog_compiler_pic, $1)= +_LT_TAGVAR(lt_prog_compiler_static, $1)= + +m4_if([$1], [CXX], [ + # C++ specific cases for pic, static, wl, etc. + if test "$GXX" = yes; then + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' + + case $host_os in + aix*) + # All AIX code is PIC. + if test "$host_cpu" = ia64; then + # AIX 5 now supports IA64 processor + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + fi + ;; + + amigaos*) + case $host_cpu in + powerpc) + # see comment about AmigaOS4 .so support + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + ;; + m68k) + # FIXME: we need at least 68020 code to build shared libraries, but + # adding the `-m68020' flag to GCC prevents building anything better, + # like `-m68040'. + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-m68020 -resident32 -malways-restore-a4' + ;; + esac + ;; + + beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) + # PIC is the default for these OSes. + ;; + mingw* | cygwin* | os2* | pw32* | cegcc*) + # This hack is so that the source file can tell whether it is being + # built for inclusion in a dll (and should export symbols for example). + # Although the cygwin gcc ignores -fPIC, still need this for old-style + # (--disable-auto-import) libraries + m4_if([$1], [GCJ], [], + [_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT']) + ;; + darwin* | rhapsody*) + # PIC is the default on this platform + # Common symbols not allowed in MH_DYLIB files + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fno-common' + ;; + *djgpp*) + # DJGPP does not support shared libraries at all + _LT_TAGVAR(lt_prog_compiler_pic, $1)= + ;; + haiku*) + # PIC is the default for Haiku. + # The "-static" flag exists, but is broken. + _LT_TAGVAR(lt_prog_compiler_static, $1)= + ;; + interix[[3-9]]*) + # Interix 3.x gcc -fpic/-fPIC options generate broken code. + # Instead, we relocate shared libraries at runtime. + ;; + sysv4*MP*) + if test -d /usr/nec; then + _LT_TAGVAR(lt_prog_compiler_pic, $1)=-Kconform_pic + fi + ;; + hpux*) + # PIC is the default for 64-bit PA HP-UX, but not for 32-bit + # PA HP-UX. On IA64 HP-UX, PIC is the default but the pic flag + # sets the default TLS model and affects inlining. + case $host_cpu in + hppa*64*) + ;; + *) + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + ;; + esac + ;; + *qnx* | *nto*) + # QNX uses GNU C++, but need to define -shared option too, otherwise + # it will coredump. + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared' + ;; + *) + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + ;; + esac + else + case $host_os in + aix[[4-9]]*) + # All AIX code is PIC. + if test "$host_cpu" = ia64; then + # AIX 5 now supports IA64 processor + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + else + _LT_TAGVAR(lt_prog_compiler_static, $1)='-bnso -bI:/lib/syscalls.exp' + fi + ;; + chorus*) + case $cc_basename in + cxch68*) + # Green Hills C++ Compiler + # _LT_TAGVAR(lt_prog_compiler_static, $1)="--no_auto_instantiation -u __main -u __premain -u _abort -r $COOL_DIR/lib/libOrb.a $MVME_DIR/lib/CC/libC.a $MVME_DIR/lib/classix/libcx.s.a" + ;; + esac + ;; + mingw* | cygwin* | os2* | pw32* | cegcc*) + # This hack is so that the source file can tell whether it is being + # built for inclusion in a dll (and should export symbols for example). + m4_if([$1], [GCJ], [], + [_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT']) + ;; + dgux*) + case $cc_basename in + ec++*) + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + ;; + ghcx*) + # Green Hills C++ Compiler + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' + ;; + *) + ;; + esac + ;; + freebsd* | dragonfly*) + # FreeBSD uses GNU C++ + ;; + hpux9* | hpux10* | hpux11*) + case $cc_basename in + CC*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_static, $1)='${wl}-a ${wl}archive' + if test "$host_cpu" != ia64; then + _LT_TAGVAR(lt_prog_compiler_pic, $1)='+Z' + fi + ;; + aCC*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_static, $1)='${wl}-a ${wl}archive' + case $host_cpu in + hppa*64*|ia64*) + # +Z the default + ;; + *) + _LT_TAGVAR(lt_prog_compiler_pic, $1)='+Z' + ;; + esac + ;; + *) + ;; + esac + ;; + interix*) + # This is c89, which is MS Visual C++ (no shared libs) + # Anyone wants to do a port? + ;; + irix5* | irix6* | nonstopux*) + case $cc_basename in + CC*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' + # CC pic flag -KPIC is the default. + ;; + *) + ;; + esac + ;; + linux* | k*bsd*-gnu | kopensolaris*-gnu) + case $cc_basename in + KCC*) + # KAI C++ Compiler + _LT_TAGVAR(lt_prog_compiler_wl, $1)='--backend -Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + ;; + ecpc* ) + # old Intel C++ for x86_64 which still supported -KPIC. + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' + ;; + icpc* ) + # Intel C++, used to be incompatible with GCC. + # ICC 10 doesn't accept -KPIC any more. + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' + ;; + pgCC* | pgcpp*) + # Portland Group C++ compiler + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fpic' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + cxx*) + # Compaq C++ + # Make sure the PIC flag is empty. It appears that all Alpha + # Linux and Compaq Tru64 Unix objects are PIC. + _LT_TAGVAR(lt_prog_compiler_pic, $1)= + _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' + ;; + xlc* | xlC* | bgxl[[cC]]* | mpixl[[cC]]*) + # IBM XL 8.0, 9.0 on PPC and BlueGene + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-qpic' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-qstaticlink' + ;; + *) + case `$CC -V 2>&1 | sed 5q` in + *Sun\ C*) + # Sun C++ 5.9 + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' + ;; + esac + ;; + esac + ;; + lynxos*) + ;; + m88k*) + ;; + mvs*) + case $cc_basename in + cxx*) + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-W c,exportall' + ;; + *) + ;; + esac + ;; + netbsd* | netbsdelf*-gnu) + ;; + *qnx* | *nto*) + # QNX uses GNU C++, but need to define -shared option too, otherwise + # it will coredump. + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared' + ;; + osf3* | osf4* | osf5*) + case $cc_basename in + KCC*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='--backend -Wl,' + ;; + RCC*) + # Rational C++ 2.4.1 + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' + ;; + cxx*) + # Digital/Compaq C++ + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + # Make sure the PIC flag is empty. It appears that all Alpha + # Linux and Compaq Tru64 Unix objects are PIC. + _LT_TAGVAR(lt_prog_compiler_pic, $1)= + _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' + ;; + *) + ;; + esac + ;; + psos*) + ;; + solaris*) + case $cc_basename in + CC* | sunCC*) + # Sun C++ 4.2, 5.x and Centerline C++ + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' + ;; + gcx*) + # Green Hills C++ Compiler + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC' + ;; + *) + ;; + esac + ;; + sunos4*) + case $cc_basename in + CC*) + # Sun C++ 4.x + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + lcc*) + # Lucid + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' + ;; + *) + ;; + esac + ;; + sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) + case $cc_basename in + CC*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + esac + ;; + tandem*) + case $cc_basename in + NCC*) + # NonStop-UX NCC 3.20 + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + ;; + *) + ;; + esac + ;; + vxworks*) + ;; + *) + _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no + ;; + esac + fi +], +[ + if test "$GCC" = yes; then + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' + + case $host_os in + aix*) + # All AIX code is PIC. + if test "$host_cpu" = ia64; then + # AIX 5 now supports IA64 processor + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + fi + ;; + + amigaos*) + case $host_cpu in + powerpc) + # see comment about AmigaOS4 .so support + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + ;; + m68k) + # FIXME: we need at least 68020 code to build shared libraries, but + # adding the `-m68020' flag to GCC prevents building anything better, + # like `-m68040'. + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-m68020 -resident32 -malways-restore-a4' + ;; + esac + ;; + + beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) + # PIC is the default for these OSes. + ;; + + mingw* | cygwin* | pw32* | os2* | cegcc*) + # This hack is so that the source file can tell whether it is being + # built for inclusion in a dll (and should export symbols for example). + # Although the cygwin gcc ignores -fPIC, still need this for old-style + # (--disable-auto-import) libraries + m4_if([$1], [GCJ], [], + [_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT']) + ;; + + darwin* | rhapsody*) + # PIC is the default on this platform + # Common symbols not allowed in MH_DYLIB files + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fno-common' + ;; + + haiku*) + # PIC is the default for Haiku. + # The "-static" flag exists, but is broken. + _LT_TAGVAR(lt_prog_compiler_static, $1)= + ;; + + hpux*) + # PIC is the default for 64-bit PA HP-UX, but not for 32-bit + # PA HP-UX. On IA64 HP-UX, PIC is the default but the pic flag + # sets the default TLS model and affects inlining. + case $host_cpu in + hppa*64*) + # +Z the default + ;; + *) + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + ;; + esac + ;; + + interix[[3-9]]*) + # Interix 3.x gcc -fpic/-fPIC options generate broken code. + # Instead, we relocate shared libraries at runtime. + ;; + + msdosdjgpp*) + # Just because we use GCC doesn't mean we suddenly get shared libraries + # on systems that don't support them. + _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no + enable_shared=no + ;; + + *nto* | *qnx*) + # QNX uses GNU C++, but need to define -shared option too, otherwise + # it will coredump. + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared' + ;; + + sysv4*MP*) + if test -d /usr/nec; then + _LT_TAGVAR(lt_prog_compiler_pic, $1)=-Kconform_pic + fi + ;; + + *) + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + ;; + esac + + case $cc_basename in + nvcc*) # Cuda Compiler Driver 2.2 + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Xlinker ' + if test -n "$_LT_TAGVAR(lt_prog_compiler_pic, $1)"; then + _LT_TAGVAR(lt_prog_compiler_pic, $1)="-Xcompiler $_LT_TAGVAR(lt_prog_compiler_pic, $1)" + fi + ;; + esac + else + # PORTME Check for flag to pass linker flags through the system compiler. + case $host_os in + aix*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + if test "$host_cpu" = ia64; then + # AIX 5 now supports IA64 processor + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + else + _LT_TAGVAR(lt_prog_compiler_static, $1)='-bnso -bI:/lib/syscalls.exp' + fi + ;; + + mingw* | cygwin* | pw32* | os2* | cegcc*) + # This hack is so that the source file can tell whether it is being + # built for inclusion in a dll (and should export symbols for example). + m4_if([$1], [GCJ], [], + [_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT']) + ;; + + hpux9* | hpux10* | hpux11*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but + # not for PA HP-UX. + case $host_cpu in + hppa*64*|ia64*) + # +Z the default + ;; + *) + _LT_TAGVAR(lt_prog_compiler_pic, $1)='+Z' + ;; + esac + # Is there a better lt_prog_compiler_static that works with the bundled CC? + _LT_TAGVAR(lt_prog_compiler_static, $1)='${wl}-a ${wl}archive' + ;; + + irix5* | irix6* | nonstopux*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + # PIC (with -KPIC) is the default. + _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' + ;; + + linux* | k*bsd*-gnu | kopensolaris*-gnu) + case $cc_basename in + # old Intel for x86_64 which still supported -KPIC. + ecc*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' + ;; + # icc used to be incompatible with GCC. + # ICC 10 doesn't accept -KPIC any more. + icc* | ifort*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' + ;; + # Lahey Fortran 8.1. + lf95*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='--shared' + _LT_TAGVAR(lt_prog_compiler_static, $1)='--static' + ;; + nagfor*) + # NAG Fortran compiler + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,-Wl,,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + pgcc* | pgf77* | pgf90* | pgf95* | pgfortran*) + # Portland Group compilers (*not* the Pentium gcc compiler, + # which looks to be a dead project) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fpic' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + ccc*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + # All Alpha code is PIC. + _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' + ;; + xl* | bgxl* | bgf* | mpixl*) + # IBM XL C 8.0/Fortran 10.1, 11.1 on PPC and BlueGene + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-qpic' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-qstaticlink' + ;; + *) + case `$CC -V 2>&1 | sed 5q` in + *Sun\ Ceres\ Fortran* | *Sun*Fortran*\ [[1-7]].* | *Sun*Fortran*\ 8.[[0-3]]*) + # Sun Fortran 8.3 passes all unrecognized flags to the linker + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + _LT_TAGVAR(lt_prog_compiler_wl, $1)='' + ;; + *Sun\ F* | *Sun*Fortran*) + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' + ;; + *Sun\ C*) + # Sun C 5.9 + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + ;; + *Intel*\ [[CF]]*Compiler*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' + ;; + *Portland\ Group*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fpic' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + esac + ;; + esac + ;; + + newsos6) + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + + *nto* | *qnx*) + # QNX uses GNU C++, but need to define -shared option too, otherwise + # it will coredump. + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared' + ;; + + osf3* | osf4* | osf5*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + # All OSF/1 code is PIC. + _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' + ;; + + rdos*) + _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' + ;; + + solaris*) + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + case $cc_basename in + f77* | f90* | f95* | sunf77* | sunf90* | sunf95*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ';; + *) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,';; + esac + ;; + + sunos4*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + + sysv4 | sysv4.2uw2* | sysv4.3*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + + sysv4*MP*) + if test -d /usr/nec ;then + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-Kconform_pic' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + fi + ;; + + sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + + unicos*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no + ;; + + uts4*) + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + + *) + _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no + ;; + esac + fi +]) +case $host_os in + # For platforms which do not support PIC, -DPIC is meaningless: + *djgpp*) + _LT_TAGVAR(lt_prog_compiler_pic, $1)= + ;; + *) + _LT_TAGVAR(lt_prog_compiler_pic, $1)="$_LT_TAGVAR(lt_prog_compiler_pic, $1)@&t@m4_if([$1],[],[ -DPIC],[m4_if([$1],[CXX],[ -DPIC],[])])" + ;; +esac + +AC_CACHE_CHECK([for $compiler option to produce PIC], + [_LT_TAGVAR(lt_cv_prog_compiler_pic, $1)], + [_LT_TAGVAR(lt_cv_prog_compiler_pic, $1)=$_LT_TAGVAR(lt_prog_compiler_pic, $1)]) +_LT_TAGVAR(lt_prog_compiler_pic, $1)=$_LT_TAGVAR(lt_cv_prog_compiler_pic, $1) + +# +# Check to make sure the PIC flag actually works. +# +if test -n "$_LT_TAGVAR(lt_prog_compiler_pic, $1)"; then + _LT_COMPILER_OPTION([if $compiler PIC flag $_LT_TAGVAR(lt_prog_compiler_pic, $1) works], + [_LT_TAGVAR(lt_cv_prog_compiler_pic_works, $1)], + [$_LT_TAGVAR(lt_prog_compiler_pic, $1)@&t@m4_if([$1],[],[ -DPIC],[m4_if([$1],[CXX],[ -DPIC],[])])], [], + [case $_LT_TAGVAR(lt_prog_compiler_pic, $1) in + "" | " "*) ;; + *) _LT_TAGVAR(lt_prog_compiler_pic, $1)=" $_LT_TAGVAR(lt_prog_compiler_pic, $1)" ;; + esac], + [_LT_TAGVAR(lt_prog_compiler_pic, $1)= + _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no]) +fi +_LT_TAGDECL([pic_flag], [lt_prog_compiler_pic], [1], + [Additional compiler flags for building library objects]) + +_LT_TAGDECL([wl], [lt_prog_compiler_wl], [1], + [How to pass a linker flag through the compiler]) +# +# Check to make sure the static flag actually works. +# +wl=$_LT_TAGVAR(lt_prog_compiler_wl, $1) eval lt_tmp_static_flag=\"$_LT_TAGVAR(lt_prog_compiler_static, $1)\" +_LT_LINKER_OPTION([if $compiler static flag $lt_tmp_static_flag works], + _LT_TAGVAR(lt_cv_prog_compiler_static_works, $1), + $lt_tmp_static_flag, + [], + [_LT_TAGVAR(lt_prog_compiler_static, $1)=]) +_LT_TAGDECL([link_static_flag], [lt_prog_compiler_static], [1], + [Compiler flag to prevent dynamic linking]) +])# _LT_COMPILER_PIC + + +# _LT_LINKER_SHLIBS([TAGNAME]) +# ---------------------------- +# See if the linker supports building shared libraries. +m4_defun([_LT_LINKER_SHLIBS], +[AC_REQUIRE([LT_PATH_LD])dnl +AC_REQUIRE([LT_PATH_NM])dnl +m4_require([_LT_PATH_MANIFEST_TOOL])dnl +m4_require([_LT_FILEUTILS_DEFAULTS])dnl +m4_require([_LT_DECL_EGREP])dnl +m4_require([_LT_DECL_SED])dnl +m4_require([_LT_CMD_GLOBAL_SYMBOLS])dnl +m4_require([_LT_TAG_COMPILER])dnl +AC_MSG_CHECKING([whether the $compiler linker ($LD) supports shared libraries]) +m4_if([$1], [CXX], [ + _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' + _LT_TAGVAR(exclude_expsyms, $1)=['_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*'] + case $host_os in + aix[[4-9]]*) + # If we're using GNU nm, then we don't want the "-C" option. + # -C means demangle to AIX nm, but means don't demangle with GNU nm + # Also, AIX nm treats weak defined symbols like other global defined + # symbols, whereas GNU nm marks them as "W". + if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then + _LT_TAGVAR(export_symbols_cmds, $1)='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && ([substr](\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' + else + _LT_TAGVAR(export_symbols_cmds, $1)='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && ([substr](\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' + fi + ;; + pw32*) + _LT_TAGVAR(export_symbols_cmds, $1)="$ltdll_cmds" + ;; + cygwin* | mingw* | cegcc*) + case $cc_basename in + cl*) + _LT_TAGVAR(exclude_expsyms, $1)='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*' + ;; + *) + _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\([[^ ]]*\)/\1 DATA/;s/^.*[[ ]]__nm__\([[^ ]]*\)[[ ]][[^ ]]*/\1 DATA/;/^I[[ ]]/d;/^[[AITW]][[ ]]/s/.* //'\'' | sort | uniq > $export_symbols' + _LT_TAGVAR(exclude_expsyms, $1)=['[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname'] + ;; + esac + ;; + linux* | k*bsd*-gnu | gnu*) + _LT_TAGVAR(link_all_deplibs, $1)=no + ;; + *) + _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' + ;; + esac +], [ + runpath_var= + _LT_TAGVAR(allow_undefined_flag, $1)= + _LT_TAGVAR(always_export_symbols, $1)=no + _LT_TAGVAR(archive_cmds, $1)= + _LT_TAGVAR(archive_expsym_cmds, $1)= + _LT_TAGVAR(compiler_needs_object, $1)=no + _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no + _LT_TAGVAR(export_dynamic_flag_spec, $1)= + _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' + _LT_TAGVAR(hardcode_automatic, $1)=no + _LT_TAGVAR(hardcode_direct, $1)=no + _LT_TAGVAR(hardcode_direct_absolute, $1)=no + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)= + _LT_TAGVAR(hardcode_libdir_separator, $1)= + _LT_TAGVAR(hardcode_minus_L, $1)=no + _LT_TAGVAR(hardcode_shlibpath_var, $1)=unsupported + _LT_TAGVAR(inherit_rpath, $1)=no + _LT_TAGVAR(link_all_deplibs, $1)=unknown + _LT_TAGVAR(module_cmds, $1)= + _LT_TAGVAR(module_expsym_cmds, $1)= + _LT_TAGVAR(old_archive_from_new_cmds, $1)= + _LT_TAGVAR(old_archive_from_expsyms_cmds, $1)= + _LT_TAGVAR(thread_safe_flag_spec, $1)= + _LT_TAGVAR(whole_archive_flag_spec, $1)= + # include_expsyms should be a list of space-separated symbols to be *always* + # included in the symbol list + _LT_TAGVAR(include_expsyms, $1)= + # exclude_expsyms can be an extended regexp of symbols to exclude + # it will be wrapped by ` (' and `)$', so one must not match beginning or + # end of line. Example: `a|bc|.*d.*' will exclude the symbols `a' and `bc', + # as well as any symbol that contains `d'. + _LT_TAGVAR(exclude_expsyms, $1)=['_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*'] + # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out + # platforms (ab)use it in PIC code, but their linkers get confused if + # the symbol is explicitly referenced. Since portable code cannot + # rely on this symbol name, it's probably fine to never include it in + # preloaded symbol tables. + # Exclude shared library initialization/finalization symbols. +dnl Note also adjust exclude_expsyms for C++ above. + extract_expsyms_cmds= + + case $host_os in + cygwin* | mingw* | pw32* | cegcc*) + # FIXME: the MSVC++ port hasn't been tested in a loooong time + # When not using gcc, we currently assume that we are using + # Microsoft Visual C++. + if test "$GCC" != yes; then + with_gnu_ld=no + fi + ;; + interix*) + # we just hope/assume this is gcc and not c89 (= MSVC++) + with_gnu_ld=yes + ;; + openbsd*) + with_gnu_ld=no + ;; + linux* | k*bsd*-gnu | gnu*) + _LT_TAGVAR(link_all_deplibs, $1)=no + ;; + esac + + _LT_TAGVAR(ld_shlibs, $1)=yes + + # On some targets, GNU ld is compatible enough with the native linker + # that we're better off using the native interface for both. + lt_use_gnu_ld_interface=no + if test "$with_gnu_ld" = yes; then + case $host_os in + aix*) + # The AIX port of GNU ld has always aspired to compatibility + # with the native linker. However, as the warning in the GNU ld + # block says, versions before 2.19.5* couldn't really create working + # shared libraries, regardless of the interface used. + case `$LD -v 2>&1` in + *\ \(GNU\ Binutils\)\ 2.19.5*) ;; + *\ \(GNU\ Binutils\)\ 2.[[2-9]]*) ;; + *\ \(GNU\ Binutils\)\ [[3-9]]*) ;; + *) + lt_use_gnu_ld_interface=yes + ;; + esac + ;; + *) + lt_use_gnu_ld_interface=yes + ;; + esac + fi + + if test "$lt_use_gnu_ld_interface" = yes; then + # If archive_cmds runs LD, not CC, wlarc should be empty + wlarc='${wl}' + + # Set some defaults for GNU ld with shared library support. These + # are reset later if shared libraries are not supported. Putting them + # here allows them to be overridden if necessary. + runpath_var=LD_RUN_PATH + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' + # ancient GNU ld didn't support --whole-archive et. al. + if $LD --help 2>&1 | $GREP 'no-whole-archive' > /dev/null; then + _LT_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' + else + _LT_TAGVAR(whole_archive_flag_spec, $1)= + fi + supports_anon_versioning=no + case `$LD -v 2>&1` in + *GNU\ gold*) supports_anon_versioning=yes ;; + *\ [[01]].* | *\ 2.[[0-9]].* | *\ 2.10.*) ;; # catch versions < 2.11 + *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ... + *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ... + *\ 2.11.*) ;; # other 2.11 versions + *) supports_anon_versioning=yes ;; + esac + + # See if GNU ld supports shared libraries. + case $host_os in + aix[[3-9]]*) + # On AIX/PPC, the GNU linker is very broken + if test "$host_cpu" != ia64; then + _LT_TAGVAR(ld_shlibs, $1)=no + cat <<_LT_EOF 1>&2 + +*** Warning: the GNU linker, at least up to release 2.19, is reported +*** to be unable to reliably create shared libraries on AIX. +*** Therefore, libtool is disabling shared libraries support. If you +*** really care for shared libraries, you may want to install binutils +*** 2.20 or above, or modify your PATH so that a non-GNU linker is found. +*** You will then need to restart the configuration process. + +_LT_EOF + fi + ;; + + amigaos*) + case $host_cpu in + powerpc) + # see comment about AmigaOS4 .so support + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='' + ;; + m68k) + _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_TAGVAR(hardcode_minus_L, $1)=yes + ;; + esac + ;; + + beos*) + if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then + _LT_TAGVAR(allow_undefined_flag, $1)=unsupported + # Joseph Beckenbach says some releases of gcc + # support --undefined. This deserves some investigation. FIXME + _LT_TAGVAR(archive_cmds, $1)='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + else + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + + cygwin* | mingw* | pw32* | cegcc*) + # _LT_TAGVAR(hardcode_libdir_flag_spec, $1) is actually meaningless, + # as there is no search path for DLLs. + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-all-symbols' + _LT_TAGVAR(allow_undefined_flag, $1)=unsupported + _LT_TAGVAR(always_export_symbols, $1)=no + _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes + _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\([[^ ]]*\)/\1 DATA/;s/^.*[[ ]]__nm__\([[^ ]]*\)[[ ]][[^ ]]*/\1 DATA/;/^I[[ ]]/d;/^[[AITW]][[ ]]/s/.* //'\'' | sort | uniq > $export_symbols' + _LT_TAGVAR(exclude_expsyms, $1)=['[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname'] + + if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' + # If the export-symbols file already is a .def file (1st line + # is EXPORTS), use it as is; otherwise, prepend... + _LT_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then + cp $export_symbols $output_objdir/$soname.def; + else + echo EXPORTS > $output_objdir/$soname.def; + cat $export_symbols >> $output_objdir/$soname.def; + fi~ + $CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' + else + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + + haiku*) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + _LT_TAGVAR(link_all_deplibs, $1)=yes + ;; + + interix[[3-9]]*) + _LT_TAGVAR(hardcode_direct, $1)=no + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' + # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. + # Instead, shared libraries are loaded at an image base (0x10000000 by + # default) and relocated if they conflict, which is a slow very memory + # consuming and fragmenting process. To avoid this, we pick a random, + # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link + # time. Moving up from 0x10000000 also allows more sbrk(2) space. + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' + ;; + + gnu* | linux* | tpf* | k*bsd*-gnu | kopensolaris*-gnu) + tmp_diet=no + if test "$host_os" = linux-dietlibc; then + case $cc_basename in + diet\ *) tmp_diet=yes;; # linux-dietlibc with static linking (!diet-dyn) + esac + fi + if $LD --help 2>&1 | $EGREP ': supported targets:.* elf' > /dev/null \ + && test "$tmp_diet" = no + then + tmp_addflag=' $pic_flag' + tmp_sharedflag='-shared' + case $cc_basename,$host_cpu in + pgcc*) # Portland Group C compiler + _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' + tmp_addflag=' $pic_flag' + ;; + pgf77* | pgf90* | pgf95* | pgfortran*) + # Portland Group f77 and f90 compilers + _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' + tmp_addflag=' $pic_flag -Mnomain' ;; + ecc*,ia64* | icc*,ia64*) # Intel C compiler on ia64 + tmp_addflag=' -i_dynamic' ;; + efc*,ia64* | ifort*,ia64*) # Intel Fortran compiler on ia64 + tmp_addflag=' -i_dynamic -nofor_main' ;; + ifc* | ifort*) # Intel Fortran compiler + tmp_addflag=' -nofor_main' ;; + lf95*) # Lahey Fortran 8.1 + _LT_TAGVAR(whole_archive_flag_spec, $1)= + tmp_sharedflag='--shared' ;; + xl[[cC]]* | bgxl[[cC]]* | mpixl[[cC]]*) # IBM XL C 8.0 on PPC (deal with xlf below) + tmp_sharedflag='-qmkshrobj' + tmp_addflag= ;; + nvcc*) # Cuda Compiler Driver 2.2 + _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' + _LT_TAGVAR(compiler_needs_object, $1)=yes + ;; + esac + case `$CC -V 2>&1 | sed 5q` in + *Sun\ C*) # Sun C 5.9 + _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' + _LT_TAGVAR(compiler_needs_object, $1)=yes + tmp_sharedflag='-G' ;; + *Sun\ F*) # Sun Fortran 8.3 + tmp_sharedflag='-G' ;; + esac + _LT_TAGVAR(archive_cmds, $1)='$CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + + if test "x$supports_anon_versioning" = xyes; then + _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $output_objdir/$libname.ver~ + cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ + echo "local: *; };" >> $output_objdir/$libname.ver~ + $CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib' + fi + + case $cc_basename in + xlf* | bgf* | bgxlf* | mpixlf*) + # IBM XL Fortran 10.1 on PPC cannot create shared libs itself + _LT_TAGVAR(whole_archive_flag_spec, $1)='--whole-archive$convenience --no-whole-archive' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' + _LT_TAGVAR(archive_cmds, $1)='$LD -shared $libobjs $deplibs $linker_flags -soname $soname -o $lib' + if test "x$supports_anon_versioning" = xyes; then + _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $output_objdir/$libname.ver~ + cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ + echo "local: *; };" >> $output_objdir/$libname.ver~ + $LD -shared $libobjs $deplibs $linker_flags -soname $soname -version-script $output_objdir/$libname.ver -o $lib' + fi + ;; + esac + else + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + + netbsd* | netbsdelf*-gnu) + if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then + _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib' + wlarc= + else + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + fi + ;; + + solaris*) + if $LD -v 2>&1 | $GREP 'BFD 2\.8' > /dev/null; then + _LT_TAGVAR(ld_shlibs, $1)=no + cat <<_LT_EOF 1>&2 + +*** Warning: The releases 2.8.* of the GNU linker cannot reliably +*** create shared libraries on Solaris systems. Therefore, libtool +*** is disabling shared libraries support. We urge you to upgrade GNU +*** binutils to release 2.9.1 or newer. Another option is to modify +*** your PATH or compiler configuration so that the native linker is +*** used, and then restart. + +_LT_EOF + elif $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + else + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + + sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*) + case `$LD -v 2>&1` in + *\ [[01]].* | *\ 2.[[0-9]].* | *\ 2.1[[0-5]].*) + _LT_TAGVAR(ld_shlibs, $1)=no + cat <<_LT_EOF 1>&2 + +*** Warning: Releases of the GNU linker prior to 2.16.91.0.3 can not +*** reliably create shared libraries on SCO systems. Therefore, libtool +*** is disabling shared libraries support. We urge you to upgrade GNU +*** binutils to release 2.16.91.0.3 or newer. Another option is to modify +*** your PATH or compiler configuration so that the native linker is +*** used, and then restart. + +_LT_EOF + ;; + *) + # For security reasons, it is highly recommended that you always + # use absolute paths for naming shared libraries, and exclude the + # DT_RUNPATH tag from executables and libraries. But doing so + # requires that you compile everything twice, which is a pain. + if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + else + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + esac + ;; + + sunos4*) + _LT_TAGVAR(archive_cmds, $1)='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags' + wlarc= + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + *) + if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + else + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + esac + + if test "$_LT_TAGVAR(ld_shlibs, $1)" = no; then + runpath_var= + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)= + _LT_TAGVAR(export_dynamic_flag_spec, $1)= + _LT_TAGVAR(whole_archive_flag_spec, $1)= + fi + else + # PORTME fill in a description of your system's linker (not GNU ld) + case $host_os in + aix3*) + _LT_TAGVAR(allow_undefined_flag, $1)=unsupported + _LT_TAGVAR(always_export_symbols, $1)=yes + _LT_TAGVAR(archive_expsym_cmds, $1)='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname' + # Note: this linker hardcodes the directories in LIBPATH if there + # are no directories specified by -L. + _LT_TAGVAR(hardcode_minus_L, $1)=yes + if test "$GCC" = yes && test -z "$lt_prog_compiler_static"; then + # Neither direct hardcoding nor static linking is supported with a + # broken collect2. + _LT_TAGVAR(hardcode_direct, $1)=unsupported + fi + ;; + + aix[[4-9]]*) + if test "$host_cpu" = ia64; then + # On IA64, the linker does run time linking by default, so we don't + # have to do anything special. + aix_use_runtimelinking=no + exp_sym_flag='-Bexport' + no_entry_flag="" + else + # If we're using GNU nm, then we don't want the "-C" option. + # -C means demangle to AIX nm, but means don't demangle with GNU nm + # Also, AIX nm treats weak defined symbols like other global + # defined symbols, whereas GNU nm marks them as "W". + if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then + _LT_TAGVAR(export_symbols_cmds, $1)='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && ([substr](\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' + else + _LT_TAGVAR(export_symbols_cmds, $1)='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && ([substr](\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' + fi + aix_use_runtimelinking=no + + # Test if we are trying to use run time linking or normal + # AIX style linking. If -brtl is somewhere in LDFLAGS, we + # need to do runtime linking. + case $host_os in aix4.[[23]]|aix4.[[23]].*|aix[[5-9]]*) + for ld_flag in $LDFLAGS; do + if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then + aix_use_runtimelinking=yes + break + fi + done + ;; + esac + + exp_sym_flag='-bexport' + no_entry_flag='-bnoentry' + fi + + # When large executables or shared objects are built, AIX ld can + # have problems creating the table of contents. If linking a library + # or program results in "error TOC overflow" add -mminimal-toc to + # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not + # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. + + _LT_TAGVAR(archive_cmds, $1)='' + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_direct_absolute, $1)=yes + _LT_TAGVAR(hardcode_libdir_separator, $1)=':' + _LT_TAGVAR(link_all_deplibs, $1)=yes + _LT_TAGVAR(file_list_spec, $1)='${wl}-f,' + + if test "$GCC" = yes; then + case $host_os in aix4.[[012]]|aix4.[[012]].*) + # We only want to do this on AIX 4.2 and lower, the check + # below for broken collect2 doesn't work under 4.3+ + collect2name=`${CC} -print-prog-name=collect2` + if test -f "$collect2name" && + strings "$collect2name" | $GREP resolve_lib_name >/dev/null + then + # We have reworked collect2 + : + else + # We have old collect2 + _LT_TAGVAR(hardcode_direct, $1)=unsupported + # It fails to find uninstalled libraries when the uninstalled + # path is not listed in the libpath. Setting hardcode_minus_L + # to unsupported forces relinking + _LT_TAGVAR(hardcode_minus_L, $1)=yes + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)= + fi + ;; + esac + shared_flag='-shared' + if test "$aix_use_runtimelinking" = yes; then + shared_flag="$shared_flag "'${wl}-G' + fi + _LT_TAGVAR(link_all_deplibs, $1)=no + else + # not using gcc + if test "$host_cpu" = ia64; then + # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release + # chokes on -Wl,-G. The following line is correct: + shared_flag='-G' + else + if test "$aix_use_runtimelinking" = yes; then + shared_flag='${wl}-G' + else + shared_flag='${wl}-bM:SRE' + fi + fi + fi + + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-bexpall' + # It seems that -bexpall does not export symbols beginning with + # underscore (_), so it is better to generate a list of symbols to export. + _LT_TAGVAR(always_export_symbols, $1)=yes + if test "$aix_use_runtimelinking" = yes; then + # Warning - without using the other runtime loading flags (-brtl), + # -berok will link without error, but may produce a broken library. + _LT_TAGVAR(allow_undefined_flag, $1)='-berok' + # Determine the default libpath from the value encoded in an + # empty executable. + _LT_SYS_MODULE_PATH_AIX([$1]) + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath" + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then func_echo_all "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag" + else + if test "$host_cpu" = ia64; then + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $libdir:/usr/lib:/lib' + _LT_TAGVAR(allow_undefined_flag, $1)="-z nodefs" + _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols" + else + # Determine the default libpath from the value encoded in an + # empty executable. + _LT_SYS_MODULE_PATH_AIX([$1]) + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath" + # Warning - without using the other run time loading flags, + # -berok will link without error, but may produce a broken library. + _LT_TAGVAR(no_undefined_flag, $1)=' ${wl}-bernotok' + _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-berok' + if test "$with_gnu_ld" = yes; then + # We only use this code for GNU lds that support --whole-archive. + _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive$convenience ${wl}--no-whole-archive' + else + # Exported symbols can be pulled into shared objects from archives + _LT_TAGVAR(whole_archive_flag_spec, $1)='$convenience' + fi + _LT_TAGVAR(archive_cmds_need_lc, $1)=yes + # This is similar to how AIX traditionally builds its shared libraries. + _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' + fi + fi + ;; + + amigaos*) + case $host_cpu in + powerpc) + # see comment about AmigaOS4 .so support + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='' + ;; + m68k) + _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_TAGVAR(hardcode_minus_L, $1)=yes + ;; + esac + ;; + + bsdi[[45]]*) + _LT_TAGVAR(export_dynamic_flag_spec, $1)=-rdynamic + ;; + + cygwin* | mingw* | pw32* | cegcc*) + # When not using gcc, we currently assume that we are using + # Microsoft Visual C++. + # hardcode_libdir_flag_spec is actually meaningless, as there is + # no search path for DLLs. + case $cc_basename in + cl*) + # Native MSVC + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=' ' + _LT_TAGVAR(allow_undefined_flag, $1)=unsupported + _LT_TAGVAR(always_export_symbols, $1)=yes + _LT_TAGVAR(file_list_spec, $1)='@' + # Tell ltmain to make .lib files, not .a files. + libext=lib + # Tell ltmain to make .dll files, not .so files. + shrext_cmds=".dll" + # FIXME: Setting linknames here is a bad hack. + _LT_TAGVAR(archive_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-dll~linknames=' + _LT_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then + sed -n -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' -e '1\\\!p' < $export_symbols > $output_objdir/$soname.exp; + else + sed -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' < $export_symbols > $output_objdir/$soname.exp; + fi~ + $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~ + linknames=' + # The linker will not automatically build a static lib if we build a DLL. + # _LT_TAGVAR(old_archive_from_new_cmds, $1)='true' + _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes + _LT_TAGVAR(exclude_expsyms, $1)='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*' + _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\([[^ ]]*\)/\1,DATA/'\'' | $SED -e '\''/^[[AITW]][[ ]]/s/.*[[ ]]//'\'' | sort | uniq > $export_symbols' + # Don't use ranlib + _LT_TAGVAR(old_postinstall_cmds, $1)='chmod 644 $oldlib' + _LT_TAGVAR(postlink_cmds, $1)='lt_outputfile="@OUTPUT@"~ + lt_tool_outputfile="@TOOL_OUTPUT@"~ + case $lt_outputfile in + *.exe|*.EXE) ;; + *) + lt_outputfile="$lt_outputfile.exe" + lt_tool_outputfile="$lt_tool_outputfile.exe" + ;; + esac~ + if test "$MANIFEST_TOOL" != ":" && test -f "$lt_outputfile.manifest"; then + $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1; + $RM "$lt_outputfile.manifest"; + fi' + ;; + *) + # Assume MSVC wrapper + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=' ' + _LT_TAGVAR(allow_undefined_flag, $1)=unsupported + # Tell ltmain to make .lib files, not .a files. + libext=lib + # Tell ltmain to make .dll files, not .so files. + shrext_cmds=".dll" + # FIXME: Setting linknames here is a bad hack. + _LT_TAGVAR(archive_cmds, $1)='$CC -o $lib $libobjs $compiler_flags `func_echo_all "$deplibs" | $SED '\''s/ -lc$//'\''` -link -dll~linknames=' + # The linker will automatically build a .lib file if we build a DLL. + _LT_TAGVAR(old_archive_from_new_cmds, $1)='true' + # FIXME: Should let the user specify the lib program. + _LT_TAGVAR(old_archive_cmds, $1)='lib -OUT:$oldlib$oldobjs$old_deplibs' + _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes + ;; + esac + ;; + + darwin* | rhapsody*) + _LT_DARWIN_LINKER_FEATURES($1) + ;; + + dgux*) + _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor + # support. Future versions do this automatically, but an explicit c++rt0.o + # does not break anything, and helps significantly (at the cost of a little + # extra space). + freebsd2.2*) + _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + # Unfortunately, older versions of FreeBSD 2 do not have this feature. + freebsd2.*) + _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_minus_L, $1)=yes + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + # FreeBSD 3 and greater uses gcc -shared to do shared libraries. + freebsd* | dragonfly*) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + hpux9*) + if test "$GCC" = yes; then + _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -shared $pic_flag ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' + else + _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' + fi + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + _LT_TAGVAR(hardcode_direct, $1)=yes + + # hardcode_minus_L: Not really in the search PATH, + # but as the default location of the library. + _LT_TAGVAR(hardcode_minus_L, $1)=yes + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' + ;; + + hpux10*) + if test "$GCC" = yes && test "$with_gnu_ld" = no; then + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' + else + _LT_TAGVAR(archive_cmds, $1)='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' + fi + if test "$with_gnu_ld" = no; then + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_direct_absolute, $1)=yes + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' + # hardcode_minus_L: Not really in the search PATH, + # but as the default location of the library. + _LT_TAGVAR(hardcode_minus_L, $1)=yes + fi + ;; + + hpux11*) + if test "$GCC" = yes && test "$with_gnu_ld" = no; then + case $host_cpu in + hppa*64*) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + ia64*) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' + ;; + *) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' + ;; + esac + else + case $host_cpu in + hppa*64*) + _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + ia64*) + _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' + ;; + *) + m4_if($1, [], [ + # Older versions of the 11.00 compiler do not understand -b yet + # (HP92453-01 A.11.01.20 doesn't, HP92453-01 B.11.X.35175-35176.GP does) + _LT_LINKER_OPTION([if $CC understands -b], + _LT_TAGVAR(lt_cv_prog_compiler__b, $1), [-b], + [_LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'], + [_LT_TAGVAR(archive_cmds, $1)='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags'])], + [_LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags']) + ;; + esac + fi + if test "$with_gnu_ld" = no; then + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + + case $host_cpu in + hppa*64*|ia64*) + _LT_TAGVAR(hardcode_direct, $1)=no + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + *) + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_direct_absolute, $1)=yes + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' + + # hardcode_minus_L: Not really in the search PATH, + # but as the default location of the library. + _LT_TAGVAR(hardcode_minus_L, $1)=yes + ;; + esac + fi + ;; + + irix5* | irix6* | nonstopux*) + if test "$GCC" = yes; then + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + # Try to use the -exported_symbol ld option, if it does not + # work, assume that -exports_file does not work either and + # implicitly export all symbols. + # This should be the same for all languages, so no per-tag cache variable. + AC_CACHE_CHECK([whether the $host_os linker accepts -exported_symbol], + [lt_cv_irix_exported_symbol], + [save_LDFLAGS="$LDFLAGS" + LDFLAGS="$LDFLAGS -shared ${wl}-exported_symbol ${wl}foo ${wl}-update_registry ${wl}/dev/null" + AC_LINK_IFELSE( + [AC_LANG_SOURCE( + [AC_LANG_CASE([C], [[int foo (void) { return 0; }]], + [C++], [[int foo (void) { return 0; }]], + [Fortran 77], [[ + subroutine foo + end]], + [Fortran], [[ + subroutine foo + end]])])], + [lt_cv_irix_exported_symbol=yes], + [lt_cv_irix_exported_symbol=no]) + LDFLAGS="$save_LDFLAGS"]) + if test "$lt_cv_irix_exported_symbol" = yes; then + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations ${wl}-exports_file ${wl}$export_symbols -o $lib' + fi + else + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -exports_file $export_symbols -o $lib' + fi + _LT_TAGVAR(archive_cmds_need_lc, $1)='no' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + _LT_TAGVAR(inherit_rpath, $1)=yes + _LT_TAGVAR(link_all_deplibs, $1)=yes + ;; + + netbsd* | netbsdelf*-gnu) + if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then + _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' # a.out + else + _LT_TAGVAR(archive_cmds, $1)='$LD -shared -o $lib $libobjs $deplibs $linker_flags' # ELF + fi + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + newsos6) + _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + *nto* | *qnx*) + ;; + + openbsd*) + if test -f /usr/libexec/ld.so; then + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + _LT_TAGVAR(hardcode_direct_absolute, $1)=yes + if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-retain-symbols-file,$export_symbols' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' + else + case $host_os in + openbsd[[01]].* | openbsd2.[[0-7]] | openbsd2.[[0-7]].*) + _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' + ;; + *) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' + ;; + esac + fi + else + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + + os2*) + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_TAGVAR(hardcode_minus_L, $1)=yes + _LT_TAGVAR(allow_undefined_flag, $1)=unsupported + _LT_TAGVAR(archive_cmds, $1)='$ECHO "LIBRARY $libname INITINSTANCE" > $output_objdir/$libname.def~$ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~echo DATA >> $output_objdir/$libname.def~echo " SINGLE NONSHARED" >> $output_objdir/$libname.def~echo EXPORTS >> $output_objdir/$libname.def~emxexp $libobjs >> $output_objdir/$libname.def~$CC -Zdll -Zcrtdll -o $lib $libobjs $deplibs $compiler_flags $output_objdir/$libname.def' + _LT_TAGVAR(old_archive_from_new_cmds, $1)='emximp -o $output_objdir/$libname.a $output_objdir/$libname.def' + ;; + + osf3*) + if test "$GCC" = yes; then + _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' + _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + else + _LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*' + _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' + fi + _LT_TAGVAR(archive_cmds_need_lc, $1)='no' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + ;; + + osf4* | osf5*) # as osf3* with the addition of -msym flag + if test "$GCC" = yes; then + _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' + _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $pic_flag $libobjs $deplibs $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' + else + _LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*' + _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; printf "%s\\n" "-hidden">> $lib.exp~ + $CC -shared${allow_undefined_flag} ${wl}-input ${wl}$lib.exp $compiler_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib~$RM $lib.exp' + + # Both c and cxx compiler support -rpath directly + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir' + fi + _LT_TAGVAR(archive_cmds_need_lc, $1)='no' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + ;; + + solaris*) + _LT_TAGVAR(no_undefined_flag, $1)=' -z defs' + if test "$GCC" = yes; then + wlarc='${wl}' + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag ${wl}-z ${wl}text ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ + $CC -shared $pic_flag ${wl}-z ${wl}text ${wl}-M ${wl}$lib.exp ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' + else + case `$CC -V 2>&1` in + *"Compilers 5.0"*) + wlarc='' + _LT_TAGVAR(archive_cmds, $1)='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ + $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$RM $lib.exp' + ;; + *) + wlarc='${wl}' + _LT_TAGVAR(archive_cmds, $1)='$CC -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ + $CC -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' + ;; + esac + fi + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + case $host_os in + solaris2.[[0-5]] | solaris2.[[0-5]].*) ;; + *) + # The compiler driver will combine and reorder linker options, + # but understands `-z linker_flag'. GCC discards it without `$wl', + # but is careful enough not to reorder. + # Supported since Solaris 2.6 (maybe 2.5.1?) + if test "$GCC" = yes; then + _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract' + else + _LT_TAGVAR(whole_archive_flag_spec, $1)='-z allextract$convenience -z defaultextract' + fi + ;; + esac + _LT_TAGVAR(link_all_deplibs, $1)=yes + ;; + + sunos4*) + if test "x$host_vendor" = xsequent; then + # Use $CC to link under sequent, because it throws in some extra .o + # files that make .init and .fini sections work. + _LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h $soname -o $lib $libobjs $deplibs $compiler_flags' + else + _LT_TAGVAR(archive_cmds, $1)='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags' + fi + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_minus_L, $1)=yes + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + sysv4) + case $host_vendor in + sni) + _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_TAGVAR(hardcode_direct, $1)=yes # is this really true??? + ;; + siemens) + ## LD is ld it makes a PLAMLIB + ## CC just makes a GrossModule. + _LT_TAGVAR(archive_cmds, $1)='$LD -G -o $lib $libobjs $deplibs $linker_flags' + _LT_TAGVAR(reload_cmds, $1)='$CC -r -o $output$reload_objs' + _LT_TAGVAR(hardcode_direct, $1)=no + ;; + motorola) + _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_TAGVAR(hardcode_direct, $1)=no #Motorola manual says yes, but my tests say they lie + ;; + esac + runpath_var='LD_RUN_PATH' + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + sysv4.3*) + _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + _LT_TAGVAR(export_dynamic_flag_spec, $1)='-Bexport' + ;; + + sysv4*MP*) + if test -d /usr/nec; then + _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + runpath_var=LD_RUN_PATH + hardcode_runpath_var=yes + _LT_TAGVAR(ld_shlibs, $1)=yes + fi + ;; + + sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[[01]].[[10]]* | unixware7* | sco3.2v5.0.[[024]]*) + _LT_TAGVAR(no_undefined_flag, $1)='${wl}-z,text' + _LT_TAGVAR(archive_cmds_need_lc, $1)=no + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + runpath_var='LD_RUN_PATH' + + if test "$GCC" = yes; then + _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + else + _LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + fi + ;; + + sysv5* | sco3.2v5* | sco5v6*) + # Note: We can NOT use -z defs as we might desire, because we do not + # link with -lc, and that would cause any symbols used from libc to + # always be unresolved, which means just about no library would + # ever link correctly. If we're not using GNU ld we use -z text + # though, which does catch some bad symbols but isn't as heavy-handed + # as -z defs. + _LT_TAGVAR(no_undefined_flag, $1)='${wl}-z,text' + _LT_TAGVAR(allow_undefined_flag, $1)='${wl}-z,nodefs' + _LT_TAGVAR(archive_cmds_need_lc, $1)=no + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R,$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=':' + _LT_TAGVAR(link_all_deplibs, $1)=yes + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-Bexport' + runpath_var='LD_RUN_PATH' + + if test "$GCC" = yes; then + _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + else + _LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + fi + ;; + + uts4*) + _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + *) + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + esac + + if test x$host_vendor = xsni; then + case $host in + sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-Blargedynsym' + ;; + esac + fi + fi +]) +AC_MSG_RESULT([$_LT_TAGVAR(ld_shlibs, $1)]) +test "$_LT_TAGVAR(ld_shlibs, $1)" = no && can_build_shared=no + +_LT_TAGVAR(with_gnu_ld, $1)=$with_gnu_ld + +_LT_DECL([], [libext], [0], [Old archive suffix (normally "a")])dnl +_LT_DECL([], [shrext_cmds], [1], [Shared library suffix (normally ".so")])dnl +_LT_DECL([], [extract_expsyms_cmds], [2], + [The commands to extract the exported symbol list from a shared archive]) + +# +# Do we need to explicitly link libc? +# +case "x$_LT_TAGVAR(archive_cmds_need_lc, $1)" in +x|xyes) + # Assume -lc should be added + _LT_TAGVAR(archive_cmds_need_lc, $1)=yes + + if test "$enable_shared" = yes && test "$GCC" = yes; then + case $_LT_TAGVAR(archive_cmds, $1) in + *'~'*) + # FIXME: we may have to deal with multi-command sequences. + ;; + '$CC '*) + # Test whether the compiler implicitly links with -lc since on some + # systems, -lgcc has to come before -lc. If gcc already passes -lc + # to ld, don't add -lc before -lgcc. + AC_CACHE_CHECK([whether -lc should be explicitly linked in], + [lt_cv_]_LT_TAGVAR(archive_cmds_need_lc, $1), + [$RM conftest* + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + + if AC_TRY_EVAL(ac_compile) 2>conftest.err; then + soname=conftest + lib=conftest + libobjs=conftest.$ac_objext + deplibs= + wl=$_LT_TAGVAR(lt_prog_compiler_wl, $1) + pic_flag=$_LT_TAGVAR(lt_prog_compiler_pic, $1) + compiler_flags=-v + linker_flags=-v + verstring= + output_objdir=. + libname=conftest + lt_save_allow_undefined_flag=$_LT_TAGVAR(allow_undefined_flag, $1) + _LT_TAGVAR(allow_undefined_flag, $1)= + if AC_TRY_EVAL(_LT_TAGVAR(archive_cmds, $1) 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1) + then + lt_cv_[]_LT_TAGVAR(archive_cmds_need_lc, $1)=no + else + lt_cv_[]_LT_TAGVAR(archive_cmds_need_lc, $1)=yes + fi + _LT_TAGVAR(allow_undefined_flag, $1)=$lt_save_allow_undefined_flag + else + cat conftest.err 1>&5 + fi + $RM conftest* + ]) + _LT_TAGVAR(archive_cmds_need_lc, $1)=$lt_cv_[]_LT_TAGVAR(archive_cmds_need_lc, $1) + ;; + esac + fi + ;; +esac + +_LT_TAGDECL([build_libtool_need_lc], [archive_cmds_need_lc], [0], + [Whether or not to add -lc for building shared libraries]) +_LT_TAGDECL([allow_libtool_libs_with_static_runtimes], + [enable_shared_with_static_runtimes], [0], + [Whether or not to disallow shared libs when runtime libs are static]) +_LT_TAGDECL([], [export_dynamic_flag_spec], [1], + [Compiler flag to allow reflexive dlopens]) +_LT_TAGDECL([], [whole_archive_flag_spec], [1], + [Compiler flag to generate shared objects directly from archives]) +_LT_TAGDECL([], [compiler_needs_object], [1], + [Whether the compiler copes with passing no objects directly]) +_LT_TAGDECL([], [old_archive_from_new_cmds], [2], + [Create an old-style archive from a shared archive]) +_LT_TAGDECL([], [old_archive_from_expsyms_cmds], [2], + [Create a temporary old-style archive to link instead of a shared archive]) +_LT_TAGDECL([], [archive_cmds], [2], [Commands used to build a shared archive]) +_LT_TAGDECL([], [archive_expsym_cmds], [2]) +_LT_TAGDECL([], [module_cmds], [2], + [Commands used to build a loadable module if different from building + a shared archive.]) +_LT_TAGDECL([], [module_expsym_cmds], [2]) +_LT_TAGDECL([], [with_gnu_ld], [1], + [Whether we are building with GNU ld or not]) +_LT_TAGDECL([], [allow_undefined_flag], [1], + [Flag that allows shared libraries with undefined symbols to be built]) +_LT_TAGDECL([], [no_undefined_flag], [1], + [Flag that enforces no undefined symbols]) +_LT_TAGDECL([], [hardcode_libdir_flag_spec], [1], + [Flag to hardcode $libdir into a binary during linking. + This must work even if $libdir does not exist]) +_LT_TAGDECL([], [hardcode_libdir_separator], [1], + [Whether we need a single "-rpath" flag with a separated argument]) +_LT_TAGDECL([], [hardcode_direct], [0], + [Set to "yes" if using DIR/libNAME${shared_ext} during linking hardcodes + DIR into the resulting binary]) +_LT_TAGDECL([], [hardcode_direct_absolute], [0], + [Set to "yes" if using DIR/libNAME${shared_ext} during linking hardcodes + DIR into the resulting binary and the resulting library dependency is + "absolute", i.e impossible to change by setting ${shlibpath_var} if the + library is relocated]) +_LT_TAGDECL([], [hardcode_minus_L], [0], + [Set to "yes" if using the -LDIR flag during linking hardcodes DIR + into the resulting binary]) +_LT_TAGDECL([], [hardcode_shlibpath_var], [0], + [Set to "yes" if using SHLIBPATH_VAR=DIR during linking hardcodes DIR + into the resulting binary]) +_LT_TAGDECL([], [hardcode_automatic], [0], + [Set to "yes" if building a shared library automatically hardcodes DIR + into the library and all subsequent libraries and executables linked + against it]) +_LT_TAGDECL([], [inherit_rpath], [0], + [Set to yes if linker adds runtime paths of dependent libraries + to runtime path list]) +_LT_TAGDECL([], [link_all_deplibs], [0], + [Whether libtool must link a program against all its dependency libraries]) +_LT_TAGDECL([], [always_export_symbols], [0], + [Set to "yes" if exported symbols are required]) +_LT_TAGDECL([], [export_symbols_cmds], [2], + [The commands to list exported symbols]) +_LT_TAGDECL([], [exclude_expsyms], [1], + [Symbols that should not be listed in the preloaded symbols]) +_LT_TAGDECL([], [include_expsyms], [1], + [Symbols that must always be exported]) +_LT_TAGDECL([], [prelink_cmds], [2], + [Commands necessary for linking programs (against libraries) with templates]) +_LT_TAGDECL([], [postlink_cmds], [2], + [Commands necessary for finishing linking programs]) +_LT_TAGDECL([], [file_list_spec], [1], + [Specify filename containing input files]) +dnl FIXME: Not yet implemented +dnl _LT_TAGDECL([], [thread_safe_flag_spec], [1], +dnl [Compiler flag to generate thread safe objects]) +])# _LT_LINKER_SHLIBS + + +# _LT_LANG_C_CONFIG([TAG]) +# ------------------------ +# Ensure that the configuration variables for a C compiler are suitably +# defined. These variables are subsequently used by _LT_CONFIG to write +# the compiler configuration to `libtool'. +m4_defun([_LT_LANG_C_CONFIG], +[m4_require([_LT_DECL_EGREP])dnl +lt_save_CC="$CC" +AC_LANG_PUSH(C) + +# Source file extension for C test sources. +ac_ext=c + +# Object file extension for compiled C test sources. +objext=o +_LT_TAGVAR(objext, $1)=$objext + +# Code to be used in simple compile tests +lt_simple_compile_test_code="int some_variable = 0;" + +# Code to be used in simple link tests +lt_simple_link_test_code='int main(){return(0);}' + +_LT_TAG_COMPILER +# Save the default compiler, since it gets overwritten when the other +# tags are being tested, and _LT_TAGVAR(compiler, []) is a NOP. +compiler_DEFAULT=$CC + +# save warnings/boilerplate of simple test code +_LT_COMPILER_BOILERPLATE +_LT_LINKER_BOILERPLATE + +if test -n "$compiler"; then + _LT_COMPILER_NO_RTTI($1) + _LT_COMPILER_PIC($1) + _LT_COMPILER_C_O($1) + _LT_COMPILER_FILE_LOCKS($1) + _LT_LINKER_SHLIBS($1) + _LT_SYS_DYNAMIC_LINKER($1) + _LT_LINKER_HARDCODE_LIBPATH($1) + LT_SYS_DLOPEN_SELF + _LT_CMD_STRIPLIB + + # Report which library types will actually be built + AC_MSG_CHECKING([if libtool supports shared libraries]) + AC_MSG_RESULT([$can_build_shared]) + + AC_MSG_CHECKING([whether to build shared libraries]) + test "$can_build_shared" = "no" && enable_shared=no + + # On AIX, shared libraries and static libraries use the same namespace, and + # are all built from PIC. + case $host_os in + aix3*) + test "$enable_shared" = yes && enable_static=no + if test -n "$RANLIB"; then + archive_cmds="$archive_cmds~\$RANLIB \$lib" + postinstall_cmds='$RANLIB $lib' + fi + ;; + + aix[[4-9]]*) + if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then + test "$enable_shared" = yes && enable_static=no + fi + ;; + esac + AC_MSG_RESULT([$enable_shared]) + + AC_MSG_CHECKING([whether to build static libraries]) + # Make sure either enable_shared or enable_static is yes. + test "$enable_shared" = yes || enable_static=yes + AC_MSG_RESULT([$enable_static]) + + _LT_CONFIG($1) +fi +AC_LANG_POP +CC="$lt_save_CC" +])# _LT_LANG_C_CONFIG + + +# _LT_LANG_CXX_CONFIG([TAG]) +# -------------------------- +# Ensure that the configuration variables for a C++ compiler are suitably +# defined. These variables are subsequently used by _LT_CONFIG to write +# the compiler configuration to `libtool'. +m4_defun([_LT_LANG_CXX_CONFIG], +[m4_require([_LT_FILEUTILS_DEFAULTS])dnl +m4_require([_LT_DECL_EGREP])dnl +m4_require([_LT_PATH_MANIFEST_TOOL])dnl +if test -n "$CXX" && ( test "X$CXX" != "Xno" && + ( (test "X$CXX" = "Xg++" && `g++ -v >/dev/null 2>&1` ) || + (test "X$CXX" != "Xg++"))) ; then + AC_PROG_CXXCPP +else + _lt_caught_CXX_error=yes +fi + +AC_LANG_PUSH(C++) +_LT_TAGVAR(archive_cmds_need_lc, $1)=no +_LT_TAGVAR(allow_undefined_flag, $1)= +_LT_TAGVAR(always_export_symbols, $1)=no +_LT_TAGVAR(archive_expsym_cmds, $1)= +_LT_TAGVAR(compiler_needs_object, $1)=no +_LT_TAGVAR(export_dynamic_flag_spec, $1)= +_LT_TAGVAR(hardcode_direct, $1)=no +_LT_TAGVAR(hardcode_direct_absolute, $1)=no +_LT_TAGVAR(hardcode_libdir_flag_spec, $1)= +_LT_TAGVAR(hardcode_libdir_separator, $1)= +_LT_TAGVAR(hardcode_minus_L, $1)=no +_LT_TAGVAR(hardcode_shlibpath_var, $1)=unsupported +_LT_TAGVAR(hardcode_automatic, $1)=no +_LT_TAGVAR(inherit_rpath, $1)=no +_LT_TAGVAR(module_cmds, $1)= +_LT_TAGVAR(module_expsym_cmds, $1)= +_LT_TAGVAR(link_all_deplibs, $1)=unknown +_LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds +_LT_TAGVAR(reload_flag, $1)=$reload_flag +_LT_TAGVAR(reload_cmds, $1)=$reload_cmds +_LT_TAGVAR(no_undefined_flag, $1)= +_LT_TAGVAR(whole_archive_flag_spec, $1)= +_LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no + +# Source file extension for C++ test sources. +ac_ext=cpp + +# Object file extension for compiled C++ test sources. +objext=o +_LT_TAGVAR(objext, $1)=$objext + +# No sense in running all these tests if we already determined that +# the CXX compiler isn't working. Some variables (like enable_shared) +# are currently assumed to apply to all compilers on this platform, +# and will be corrupted by setting them based on a non-working compiler. +if test "$_lt_caught_CXX_error" != yes; then + # Code to be used in simple compile tests + lt_simple_compile_test_code="int some_variable = 0;" + + # Code to be used in simple link tests + lt_simple_link_test_code='int main(int, char *[[]]) { return(0); }' + + # ltmain only uses $CC for tagged configurations so make sure $CC is set. + _LT_TAG_COMPILER + + # save warnings/boilerplate of simple test code + _LT_COMPILER_BOILERPLATE + _LT_LINKER_BOILERPLATE + + # Allow CC to be a program name with arguments. + lt_save_CC=$CC + lt_save_CFLAGS=$CFLAGS + lt_save_LD=$LD + lt_save_GCC=$GCC + GCC=$GXX + lt_save_with_gnu_ld=$with_gnu_ld + lt_save_path_LD=$lt_cv_path_LD + if test -n "${lt_cv_prog_gnu_ldcxx+set}"; then + lt_cv_prog_gnu_ld=$lt_cv_prog_gnu_ldcxx + else + $as_unset lt_cv_prog_gnu_ld + fi + if test -n "${lt_cv_path_LDCXX+set}"; then + lt_cv_path_LD=$lt_cv_path_LDCXX + else + $as_unset lt_cv_path_LD + fi + test -z "${LDCXX+set}" || LD=$LDCXX + CC=${CXX-"c++"} + CFLAGS=$CXXFLAGS + compiler=$CC + _LT_TAGVAR(compiler, $1)=$CC + _LT_CC_BASENAME([$compiler]) + + if test -n "$compiler"; then + # We don't want -fno-exception when compiling C++ code, so set the + # no_builtin_flag separately + if test "$GXX" = yes; then + _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -fno-builtin' + else + _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)= + fi + + if test "$GXX" = yes; then + # Set up default GNU C++ configuration + + LT_PATH_LD + + # Check if GNU C++ uses GNU ld as the underlying linker, since the + # archiving commands below assume that GNU ld is being used. + if test "$with_gnu_ld" = yes; then + _LT_TAGVAR(archive_cmds, $1)='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' + + # If archive_cmds runs LD, not CC, wlarc should be empty + # XXX I think wlarc can be eliminated in ltcf-cxx, but I need to + # investigate it a little bit more. (MM) + wlarc='${wl}' + + # ancient GNU ld didn't support --whole-archive et. al. + if eval "`$CC -print-prog-name=ld` --help 2>&1" | + $GREP 'no-whole-archive' > /dev/null; then + _LT_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' + else + _LT_TAGVAR(whole_archive_flag_spec, $1)= + fi + else + with_gnu_ld=no + wlarc= + + # A generic and very simple default shared library creation + # command for GNU C++ for the case where it uses the native + # linker, instead of GNU ld. If possible, this setting should + # overridden to take advantage of the native linker features on + # the platform it is being used on. + _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib' + fi + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' + + else + GXX=no + with_gnu_ld=no + wlarc= + fi + + # PORTME: fill in a description of your system's C++ link characteristics + AC_MSG_CHECKING([whether the $compiler linker ($LD) supports shared libraries]) + _LT_TAGVAR(ld_shlibs, $1)=yes + case $host_os in + aix3*) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + aix[[4-9]]*) + if test "$host_cpu" = ia64; then + # On IA64, the linker does run time linking by default, so we don't + # have to do anything special. + aix_use_runtimelinking=no + exp_sym_flag='-Bexport' + no_entry_flag="" + else + aix_use_runtimelinking=no + + # Test if we are trying to use run time linking or normal + # AIX style linking. If -brtl is somewhere in LDFLAGS, we + # need to do runtime linking. + case $host_os in aix4.[[23]]|aix4.[[23]].*|aix[[5-9]]*) + for ld_flag in $LDFLAGS; do + case $ld_flag in + *-brtl*) + aix_use_runtimelinking=yes + break + ;; + esac + done + ;; + esac + + exp_sym_flag='-bexport' + no_entry_flag='-bnoentry' + fi + + # When large executables or shared objects are built, AIX ld can + # have problems creating the table of contents. If linking a library + # or program results in "error TOC overflow" add -mminimal-toc to + # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not + # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. + + _LT_TAGVAR(archive_cmds, $1)='' + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_direct_absolute, $1)=yes + _LT_TAGVAR(hardcode_libdir_separator, $1)=':' + _LT_TAGVAR(link_all_deplibs, $1)=yes + _LT_TAGVAR(file_list_spec, $1)='${wl}-f,' + + if test "$GXX" = yes; then + case $host_os in aix4.[[012]]|aix4.[[012]].*) + # We only want to do this on AIX 4.2 and lower, the check + # below for broken collect2 doesn't work under 4.3+ + collect2name=`${CC} -print-prog-name=collect2` + if test -f "$collect2name" && + strings "$collect2name" | $GREP resolve_lib_name >/dev/null + then + # We have reworked collect2 + : + else + # We have old collect2 + _LT_TAGVAR(hardcode_direct, $1)=unsupported + # It fails to find uninstalled libraries when the uninstalled + # path is not listed in the libpath. Setting hardcode_minus_L + # to unsupported forces relinking + _LT_TAGVAR(hardcode_minus_L, $1)=yes + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)= + fi + esac + shared_flag='-shared' + if test "$aix_use_runtimelinking" = yes; then + shared_flag="$shared_flag "'${wl}-G' + fi + else + # not using gcc + if test "$host_cpu" = ia64; then + # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release + # chokes on -Wl,-G. The following line is correct: + shared_flag='-G' + else + if test "$aix_use_runtimelinking" = yes; then + shared_flag='${wl}-G' + else + shared_flag='${wl}-bM:SRE' + fi + fi + fi + + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-bexpall' + # It seems that -bexpall does not export symbols beginning with + # underscore (_), so it is better to generate a list of symbols to + # export. + _LT_TAGVAR(always_export_symbols, $1)=yes + if test "$aix_use_runtimelinking" = yes; then + # Warning - without using the other runtime loading flags (-brtl), + # -berok will link without error, but may produce a broken library. + _LT_TAGVAR(allow_undefined_flag, $1)='-berok' + # Determine the default libpath from the value encoded in an empty + # executable. + _LT_SYS_MODULE_PATH_AIX([$1]) + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath" + + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then func_echo_all "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag" + else + if test "$host_cpu" = ia64; then + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $libdir:/usr/lib:/lib' + _LT_TAGVAR(allow_undefined_flag, $1)="-z nodefs" + _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols" + else + # Determine the default libpath from the value encoded in an + # empty executable. + _LT_SYS_MODULE_PATH_AIX([$1]) + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath" + # Warning - without using the other run time loading flags, + # -berok will link without error, but may produce a broken library. + _LT_TAGVAR(no_undefined_flag, $1)=' ${wl}-bernotok' + _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-berok' + if test "$with_gnu_ld" = yes; then + # We only use this code for GNU lds that support --whole-archive. + _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive$convenience ${wl}--no-whole-archive' + else + # Exported symbols can be pulled into shared objects from archives + _LT_TAGVAR(whole_archive_flag_spec, $1)='$convenience' + fi + _LT_TAGVAR(archive_cmds_need_lc, $1)=yes + # This is similar to how AIX traditionally builds its shared + # libraries. + _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' + fi + fi + ;; + + beos*) + if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then + _LT_TAGVAR(allow_undefined_flag, $1)=unsupported + # Joseph Beckenbach says some releases of gcc + # support --undefined. This deserves some investigation. FIXME + _LT_TAGVAR(archive_cmds, $1)='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + else + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + + chorus*) + case $cc_basename in + *) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + esac + ;; + + cygwin* | mingw* | pw32* | cegcc*) + case $GXX,$cc_basename in + ,cl* | no,cl*) + # Native MSVC + # hardcode_libdir_flag_spec is actually meaningless, as there is + # no search path for DLLs. + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=' ' + _LT_TAGVAR(allow_undefined_flag, $1)=unsupported + _LT_TAGVAR(always_export_symbols, $1)=yes + _LT_TAGVAR(file_list_spec, $1)='@' + # Tell ltmain to make .lib files, not .a files. + libext=lib + # Tell ltmain to make .dll files, not .so files. + shrext_cmds=".dll" + # FIXME: Setting linknames here is a bad hack. + _LT_TAGVAR(archive_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-dll~linknames=' + _LT_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then + $SED -n -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' -e '1\\\!p' < $export_symbols > $output_objdir/$soname.exp; + else + $SED -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' < $export_symbols > $output_objdir/$soname.exp; + fi~ + $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~ + linknames=' + # The linker will not automatically build a static lib if we build a DLL. + # _LT_TAGVAR(old_archive_from_new_cmds, $1)='true' + _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes + # Don't use ranlib + _LT_TAGVAR(old_postinstall_cmds, $1)='chmod 644 $oldlib' + _LT_TAGVAR(postlink_cmds, $1)='lt_outputfile="@OUTPUT@"~ + lt_tool_outputfile="@TOOL_OUTPUT@"~ + case $lt_outputfile in + *.exe|*.EXE) ;; + *) + lt_outputfile="$lt_outputfile.exe" + lt_tool_outputfile="$lt_tool_outputfile.exe" + ;; + esac~ + func_to_tool_file "$lt_outputfile"~ + if test "$MANIFEST_TOOL" != ":" && test -f "$lt_outputfile.manifest"; then + $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1; + $RM "$lt_outputfile.manifest"; + fi' + ;; + *) + # g++ + # _LT_TAGVAR(hardcode_libdir_flag_spec, $1) is actually meaningless, + # as there is no search path for DLLs. + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-all-symbols' + _LT_TAGVAR(allow_undefined_flag, $1)=unsupported + _LT_TAGVAR(always_export_symbols, $1)=no + _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes + + if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then + _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' + # If the export-symbols file already is a .def file (1st line + # is EXPORTS), use it as is; otherwise, prepend... + _LT_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then + cp $export_symbols $output_objdir/$soname.def; + else + echo EXPORTS > $output_objdir/$soname.def; + cat $export_symbols >> $output_objdir/$soname.def; + fi~ + $CC -shared -nostdlib $output_objdir/$soname.def $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' + else + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + esac + ;; + darwin* | rhapsody*) + _LT_DARWIN_LINKER_FEATURES($1) + ;; + + dgux*) + case $cc_basename in + ec++*) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + ghcx*) + # Green Hills C++ Compiler + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + *) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + esac + ;; + + freebsd2.*) + # C++ shared libraries reported to be fairly broken before + # switch to ELF + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + + freebsd-elf*) + _LT_TAGVAR(archive_cmds_need_lc, $1)=no + ;; + + freebsd* | dragonfly*) + # FreeBSD 3 and later use GNU C++ and GNU ld with standard ELF + # conventions + _LT_TAGVAR(ld_shlibs, $1)=yes + ;; + + gnu*) + ;; + + haiku*) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + _LT_TAGVAR(link_all_deplibs, $1)=yes + ;; + + hpux9*) + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_minus_L, $1)=yes # Not in the search PATH, + # but as the default + # location of the library. + + case $cc_basename in + CC*) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + aCC*) + _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -b ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $EGREP "\-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' + ;; + *) + if test "$GXX" = yes; then + _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -shared -nostdlib $pic_flag ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' + else + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + esac + ;; + + hpux10*|hpux11*) + if test $with_gnu_ld = no; then + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + + case $host_cpu in + hppa*64*|ia64*) + ;; + *) + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' + ;; + esac + fi + case $host_cpu in + hppa*64*|ia64*) + _LT_TAGVAR(hardcode_direct, $1)=no + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + *) + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_direct_absolute, $1)=yes + _LT_TAGVAR(hardcode_minus_L, $1)=yes # Not in the search PATH, + # but as the default + # location of the library. + ;; + esac + + case $cc_basename in + CC*) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + aCC*) + case $host_cpu in + hppa*64*) + _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + ia64*) + _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + *) + _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + esac + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $GREP "\-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' + ;; + *) + if test "$GXX" = yes; then + if test $with_gnu_ld = no; then + case $host_cpu in + hppa*64*) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + ia64*) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $pic_flag ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + *) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + esac + fi + else + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + esac + ;; + + interix[[3-9]]*) + _LT_TAGVAR(hardcode_direct, $1)=no + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' + # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. + # Instead, shared libraries are loaded at an image base (0x10000000 by + # default) and relocated if they conflict, which is a slow very memory + # consuming and fragmenting process. To avoid this, we pick a random, + # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link + # time. Moving up from 0x10000000 also allows more sbrk(2) space. + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' + ;; + irix5* | irix6*) + case $cc_basename in + CC*) + # SGI C++ + _LT_TAGVAR(archive_cmds, $1)='$CC -shared -all -multigot $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' + + # Archives containing C++ object files must be created using + # "CC -ar", where "CC" is the IRIX C++ compiler. This is + # necessary to make sure instantiated templates are included + # in the archive. + _LT_TAGVAR(old_archive_cmds, $1)='$CC -ar -WR,-u -o $oldlib $oldobjs' + ;; + *) + if test "$GXX" = yes; then + if test "$with_gnu_ld" = no; then + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + else + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` -o $lib' + fi + fi + _LT_TAGVAR(link_all_deplibs, $1)=yes + ;; + esac + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + _LT_TAGVAR(inherit_rpath, $1)=yes + ;; + + linux* | k*bsd*-gnu | kopensolaris*-gnu) + case $cc_basename in + KCC*) + # Kuck and Associates, Inc. (KAI) C++ Compiler + + # KCC will only create a shared library if the output file + # ends with ".so" (or ".sl" for HP-UX), so rename the library + # to its proper name (with version) after linking. + _LT_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib ${wl}-retain-symbols-file,$export_symbols; mv \$templib $lib' + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`$CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 | $GREP "ld"`; rm -f libconftest$shared_ext; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' + + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' + + # Archives containing C++ object files must be created using + # "CC -Bstatic", where "CC" is the KAI C++ compiler. + _LT_TAGVAR(old_archive_cmds, $1)='$CC -Bstatic -o $oldlib $oldobjs' + ;; + icpc* | ecpc* ) + # Intel C++ + with_gnu_ld=yes + # version 8.0 and above of icpc choke on multiply defined symbols + # if we add $predep_objects and $postdep_objects, however 7.1 and + # earlier do not add the objects themselves. + case `$CC -V 2>&1` in + *"Version 7."*) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + ;; + *) # Version 8.0 or newer + tmp_idyn= + case $host_cpu in + ia64*) tmp_idyn=' -i_dynamic';; + esac + _LT_TAGVAR(archive_cmds, $1)='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + ;; + esac + _LT_TAGVAR(archive_cmds_need_lc, $1)=no + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' + _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive$convenience ${wl}--no-whole-archive' + ;; + pgCC* | pgcpp*) + # Portland Group C++ compiler + case `$CC -V` in + *pgCC\ [[1-5]].* | *pgcpp\ [[1-5]].*) + _LT_TAGVAR(prelink_cmds, $1)='tpldir=Template.dir~ + rm -rf $tpldir~ + $CC --prelink_objects --instantiation_dir $tpldir $objs $libobjs $compile_deplibs~ + compile_command="$compile_command `find $tpldir -name \*.o | sort | $NL2SP`"' + _LT_TAGVAR(old_archive_cmds, $1)='tpldir=Template.dir~ + rm -rf $tpldir~ + $CC --prelink_objects --instantiation_dir $tpldir $oldobjs$old_deplibs~ + $AR $AR_FLAGS $oldlib$oldobjs$old_deplibs `find $tpldir -name \*.o | sort | $NL2SP`~ + $RANLIB $oldlib' + _LT_TAGVAR(archive_cmds, $1)='tpldir=Template.dir~ + rm -rf $tpldir~ + $CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~ + $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='tpldir=Template.dir~ + rm -rf $tpldir~ + $CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~ + $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname ${wl}-retain-symbols-file ${wl}$export_symbols -o $lib' + ;; + *) # Version 6 and above use weak symbols + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname ${wl}-retain-symbols-file ${wl}$export_symbols -o $lib' + ;; + esac + + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}--rpath ${wl}$libdir' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' + _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' + ;; + cxx*) + # Compaq C++ + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib ${wl}-retain-symbols-file $wl$export_symbols' + + runpath_var=LD_RUN_PATH + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld"`; templist=`func_echo_all "$templist" | $SED "s/\(^.*ld.*\)\( .*ld .*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "X$list" | $Xsed' + ;; + xl* | mpixl* | bgxl*) + # IBM XL 8.0 on PPC, with GNU ld + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' + _LT_TAGVAR(archive_cmds, $1)='$CC -qmkshrobj $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + if test "x$supports_anon_versioning" = xyes; then + _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $output_objdir/$libname.ver~ + cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ + echo "local: *; };" >> $output_objdir/$libname.ver~ + $CC -qmkshrobj $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib' + fi + ;; + *) + case `$CC -V 2>&1 | sed 5q` in + *Sun\ C*) + # Sun C++ 5.9 + _LT_TAGVAR(no_undefined_flag, $1)=' -zdefs' + _LT_TAGVAR(archive_cmds, $1)='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file ${wl}$export_symbols' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' + _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' + _LT_TAGVAR(compiler_needs_object, $1)=yes + + # Not sure whether something based on + # $CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 + # would be better. + output_verbose_link_cmd='func_echo_all' + + # Archives containing C++ object files must be created using + # "CC -xar", where "CC" is the Sun C++ compiler. This is + # necessary to make sure instantiated templates are included + # in the archive. + _LT_TAGVAR(old_archive_cmds, $1)='$CC -xar -o $oldlib $oldobjs' + ;; + esac + ;; + esac + ;; + + lynxos*) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + + m88k*) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + + mvs*) + case $cc_basename in + cxx*) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + *) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + esac + ;; + + netbsd*) + if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then + _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $predep_objects $libobjs $deplibs $postdep_objects $linker_flags' + wlarc= + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + fi + # Workaround some broken pre-1.5 toolchains + output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP conftest.$objext | $SED -e "s:-lgcc -lc -lgcc::"' + ;; + + *nto* | *qnx*) + _LT_TAGVAR(ld_shlibs, $1)=yes + ;; + + openbsd2*) + # C++ shared libraries are fairly broken + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + + openbsd*) + if test -f /usr/libexec/ld.so; then + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + _LT_TAGVAR(hardcode_direct_absolute, $1)=yes + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' + if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file,$export_symbols -o $lib' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' + _LT_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' + fi + output_verbose_link_cmd=func_echo_all + else + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + + osf3* | osf4* | osf5*) + case $cc_basename in + KCC*) + # Kuck and Associates, Inc. (KAI) C++ Compiler + + # KCC will only create a shared library if the output file + # ends with ".so" (or ".sl" for HP-UX), so rename the library + # to its proper name (with version) after linking. + _LT_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo "$lib" | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' + + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + + # Archives containing C++ object files must be created using + # the KAI C++ compiler. + case $host in + osf3*) _LT_TAGVAR(old_archive_cmds, $1)='$CC -Bstatic -o $oldlib $oldobjs' ;; + *) _LT_TAGVAR(old_archive_cmds, $1)='$CC -o $oldlib $oldobjs' ;; + esac + ;; + RCC*) + # Rational C++ 2.4.1 + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + cxx*) + case $host in + osf3*) + _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' + _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $soname `test -n "$verstring" && func_echo_all "${wl}-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' + ;; + *) + _LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*' + _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done~ + echo "-hidden">> $lib.exp~ + $CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname ${wl}-input ${wl}$lib.exp `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib~ + $RM $lib.exp' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir' + ;; + esac + + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld" | $GREP -v "ld:"`; templist=`func_echo_all "$templist" | $SED "s/\(^.*ld.*\)\( .*ld.*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' + ;; + *) + if test "$GXX" = yes && test "$with_gnu_ld" = no; then + _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' + case $host in + osf3*) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + ;; + *) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + ;; + esac + + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' + + else + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + esac + ;; + + psos*) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + + sunos4*) + case $cc_basename in + CC*) + # Sun C++ 4.x + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + lcc*) + # Lucid + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + *) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + esac + ;; + + solaris*) + case $cc_basename in + CC* | sunCC*) + # Sun C++ 4.2, 5.x and Centerline C++ + _LT_TAGVAR(archive_cmds_need_lc,$1)=yes + _LT_TAGVAR(no_undefined_flag, $1)=' -zdefs' + _LT_TAGVAR(archive_cmds, $1)='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ + $CC -G${allow_undefined_flag} ${wl}-M ${wl}$lib.exp -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' + + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + case $host_os in + solaris2.[[0-5]] | solaris2.[[0-5]].*) ;; + *) + # The compiler driver will combine and reorder linker options, + # but understands `-z linker_flag'. + # Supported since Solaris 2.6 (maybe 2.5.1?) + _LT_TAGVAR(whole_archive_flag_spec, $1)='-z allextract$convenience -z defaultextract' + ;; + esac + _LT_TAGVAR(link_all_deplibs, $1)=yes + + output_verbose_link_cmd='func_echo_all' + + # Archives containing C++ object files must be created using + # "CC -xar", where "CC" is the Sun C++ compiler. This is + # necessary to make sure instantiated templates are included + # in the archive. + _LT_TAGVAR(old_archive_cmds, $1)='$CC -xar -o $oldlib $oldobjs' + ;; + gcx*) + # Green Hills C++ Compiler + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' + + # The C++ compiler must be used to create the archive. + _LT_TAGVAR(old_archive_cmds, $1)='$CC $LDFLAGS -archive -o $oldlib $oldobjs' + ;; + *) + # GNU C++ compiler with Solaris linker + if test "$GXX" = yes && test "$with_gnu_ld" = no; then + _LT_TAGVAR(no_undefined_flag, $1)=' ${wl}-z ${wl}defs' + if $CC --version | $GREP -v '^2\.7' > /dev/null; then + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ + $CC -shared $pic_flag -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' + else + # g++ 2.7 appears to require `-G' NOT `-shared' on this + # platform. + _LT_TAGVAR(archive_cmds, $1)='$CC -G -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ + $CC -G -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + output_verbose_link_cmd='$CC -G $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' + fi + + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $wl$libdir' + case $host_os in + solaris2.[[0-5]] | solaris2.[[0-5]].*) ;; + *) + _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract' + ;; + esac + fi + ;; + esac + ;; + + sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[[01]].[[10]]* | unixware7* | sco3.2v5.0.[[024]]*) + _LT_TAGVAR(no_undefined_flag, $1)='${wl}-z,text' + _LT_TAGVAR(archive_cmds_need_lc, $1)=no + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + runpath_var='LD_RUN_PATH' + + case $cc_basename in + CC*) + _LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + *) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + esac + ;; + + sysv5* | sco3.2v5* | sco5v6*) + # Note: We can NOT use -z defs as we might desire, because we do not + # link with -lc, and that would cause any symbols used from libc to + # always be unresolved, which means just about no library would + # ever link correctly. If we're not using GNU ld we use -z text + # though, which does catch some bad symbols but isn't as heavy-handed + # as -z defs. + _LT_TAGVAR(no_undefined_flag, $1)='${wl}-z,text' + _LT_TAGVAR(allow_undefined_flag, $1)='${wl}-z,nodefs' + _LT_TAGVAR(archive_cmds_need_lc, $1)=no + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R,$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=':' + _LT_TAGVAR(link_all_deplibs, $1)=yes + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-Bexport' + runpath_var='LD_RUN_PATH' + + case $cc_basename in + CC*) + _LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(old_archive_cmds, $1)='$CC -Tprelink_objects $oldobjs~ + '"$_LT_TAGVAR(old_archive_cmds, $1)" + _LT_TAGVAR(reload_cmds, $1)='$CC -Tprelink_objects $reload_objs~ + '"$_LT_TAGVAR(reload_cmds, $1)" + ;; + *) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + esac + ;; + + tandem*) + case $cc_basename in + NCC*) + # NonStop-UX NCC 3.20 + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + *) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + esac + ;; + + vxworks*) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + + *) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + esac + + AC_MSG_RESULT([$_LT_TAGVAR(ld_shlibs, $1)]) + test "$_LT_TAGVAR(ld_shlibs, $1)" = no && can_build_shared=no + + _LT_TAGVAR(GCC, $1)="$GXX" + _LT_TAGVAR(LD, $1)="$LD" + + ## CAVEAT EMPTOR: + ## There is no encapsulation within the following macros, do not change + ## the running order or otherwise move them around unless you know exactly + ## what you are doing... + _LT_SYS_HIDDEN_LIBDEPS($1) + _LT_COMPILER_PIC($1) + _LT_COMPILER_C_O($1) + _LT_COMPILER_FILE_LOCKS($1) + _LT_LINKER_SHLIBS($1) + _LT_SYS_DYNAMIC_LINKER($1) + _LT_LINKER_HARDCODE_LIBPATH($1) + + _LT_CONFIG($1) + fi # test -n "$compiler" + + CC=$lt_save_CC + CFLAGS=$lt_save_CFLAGS + LDCXX=$LD + LD=$lt_save_LD + GCC=$lt_save_GCC + with_gnu_ld=$lt_save_with_gnu_ld + lt_cv_path_LDCXX=$lt_cv_path_LD + lt_cv_path_LD=$lt_save_path_LD + lt_cv_prog_gnu_ldcxx=$lt_cv_prog_gnu_ld + lt_cv_prog_gnu_ld=$lt_save_with_gnu_ld +fi # test "$_lt_caught_CXX_error" != yes + +AC_LANG_POP +])# _LT_LANG_CXX_CONFIG + + +# _LT_FUNC_STRIPNAME_CNF +# ---------------------- +# func_stripname_cnf prefix suffix name +# strip PREFIX and SUFFIX off of NAME. +# PREFIX and SUFFIX must not contain globbing or regex special +# characters, hashes, percent signs, but SUFFIX may contain a leading +# dot (in which case that matches only a dot). +# +# This function is identical to the (non-XSI) version of func_stripname, +# except this one can be used by m4 code that may be executed by configure, +# rather than the libtool script. +m4_defun([_LT_FUNC_STRIPNAME_CNF],[dnl +AC_REQUIRE([_LT_DECL_SED]) +AC_REQUIRE([_LT_PROG_ECHO_BACKSLASH]) +func_stripname_cnf () +{ + case ${2} in + .*) func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%\\\\${2}\$%%"`;; + *) func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%${2}\$%%"`;; + esac +} # func_stripname_cnf +])# _LT_FUNC_STRIPNAME_CNF + +# _LT_SYS_HIDDEN_LIBDEPS([TAGNAME]) +# --------------------------------- +# Figure out "hidden" library dependencies from verbose +# compiler output when linking a shared library. +# Parse the compiler output and extract the necessary +# objects, libraries and library flags. +m4_defun([_LT_SYS_HIDDEN_LIBDEPS], +[m4_require([_LT_FILEUTILS_DEFAULTS])dnl +AC_REQUIRE([_LT_FUNC_STRIPNAME_CNF])dnl +# Dependencies to place before and after the object being linked: +_LT_TAGVAR(predep_objects, $1)= +_LT_TAGVAR(postdep_objects, $1)= +_LT_TAGVAR(predeps, $1)= +_LT_TAGVAR(postdeps, $1)= +_LT_TAGVAR(compiler_lib_search_path, $1)= + +dnl we can't use the lt_simple_compile_test_code here, +dnl because it contains code intended for an executable, +dnl not a library. It's possible we should let each +dnl tag define a new lt_????_link_test_code variable, +dnl but it's only used here... +m4_if([$1], [], [cat > conftest.$ac_ext <<_LT_EOF +int a; +void foo (void) { a = 0; } +_LT_EOF +], [$1], [CXX], [cat > conftest.$ac_ext <<_LT_EOF +class Foo +{ +public: + Foo (void) { a = 0; } +private: + int a; +}; +_LT_EOF +], [$1], [F77], [cat > conftest.$ac_ext <<_LT_EOF + subroutine foo + implicit none + integer*4 a + a=0 + return + end +_LT_EOF +], [$1], [FC], [cat > conftest.$ac_ext <<_LT_EOF + subroutine foo + implicit none + integer a + a=0 + return + end +_LT_EOF +], [$1], [GCJ], [cat > conftest.$ac_ext <<_LT_EOF +public class foo { + private int a; + public void bar (void) { + a = 0; + } +}; +_LT_EOF +], [$1], [GO], [cat > conftest.$ac_ext <<_LT_EOF +package foo +func foo() { +} +_LT_EOF +]) + +_lt_libdeps_save_CFLAGS=$CFLAGS +case "$CC $CFLAGS " in #( +*\ -flto*\ *) CFLAGS="$CFLAGS -fno-lto" ;; +*\ -fwhopr*\ *) CFLAGS="$CFLAGS -fno-whopr" ;; +*\ -fuse-linker-plugin*\ *) CFLAGS="$CFLAGS -fno-use-linker-plugin" ;; +esac + +dnl Parse the compiler output and extract the necessary +dnl objects, libraries and library flags. +if AC_TRY_EVAL(ac_compile); then + # Parse the compiler output and extract the necessary + # objects, libraries and library flags. + + # Sentinel used to keep track of whether or not we are before + # the conftest object file. + pre_test_object_deps_done=no + + for p in `eval "$output_verbose_link_cmd"`; do + case ${prev}${p} in + + -L* | -R* | -l*) + # Some compilers place space between "-{L,R}" and the path. + # Remove the space. + if test $p = "-L" || + test $p = "-R"; then + prev=$p + continue + fi + + # Expand the sysroot to ease extracting the directories later. + if test -z "$prev"; then + case $p in + -L*) func_stripname_cnf '-L' '' "$p"; prev=-L; p=$func_stripname_result ;; + -R*) func_stripname_cnf '-R' '' "$p"; prev=-R; p=$func_stripname_result ;; + -l*) func_stripname_cnf '-l' '' "$p"; prev=-l; p=$func_stripname_result ;; + esac + fi + case $p in + =*) func_stripname_cnf '=' '' "$p"; p=$lt_sysroot$func_stripname_result ;; + esac + if test "$pre_test_object_deps_done" = no; then + case ${prev} in + -L | -R) + # Internal compiler library paths should come after those + # provided the user. The postdeps already come after the + # user supplied libs so there is no need to process them. + if test -z "$_LT_TAGVAR(compiler_lib_search_path, $1)"; then + _LT_TAGVAR(compiler_lib_search_path, $1)="${prev}${p}" + else + _LT_TAGVAR(compiler_lib_search_path, $1)="${_LT_TAGVAR(compiler_lib_search_path, $1)} ${prev}${p}" + fi + ;; + # The "-l" case would never come before the object being + # linked, so don't bother handling this case. + esac + else + if test -z "$_LT_TAGVAR(postdeps, $1)"; then + _LT_TAGVAR(postdeps, $1)="${prev}${p}" + else + _LT_TAGVAR(postdeps, $1)="${_LT_TAGVAR(postdeps, $1)} ${prev}${p}" + fi + fi + prev= + ;; + + *.lto.$objext) ;; # Ignore GCC LTO objects + *.$objext) + # This assumes that the test object file only shows up + # once in the compiler output. + if test "$p" = "conftest.$objext"; then + pre_test_object_deps_done=yes + continue + fi + + if test "$pre_test_object_deps_done" = no; then + if test -z "$_LT_TAGVAR(predep_objects, $1)"; then + _LT_TAGVAR(predep_objects, $1)="$p" + else + _LT_TAGVAR(predep_objects, $1)="$_LT_TAGVAR(predep_objects, $1) $p" + fi + else + if test -z "$_LT_TAGVAR(postdep_objects, $1)"; then + _LT_TAGVAR(postdep_objects, $1)="$p" + else + _LT_TAGVAR(postdep_objects, $1)="$_LT_TAGVAR(postdep_objects, $1) $p" + fi + fi + ;; + + *) ;; # Ignore the rest. + + esac + done + + # Clean up. + rm -f a.out a.exe +else + echo "libtool.m4: error: problem compiling $1 test program" +fi + +$RM -f confest.$objext +CFLAGS=$_lt_libdeps_save_CFLAGS + +# PORTME: override above test on systems where it is broken +m4_if([$1], [CXX], +[case $host_os in +interix[[3-9]]*) + # Interix 3.5 installs completely hosed .la files for C++, so rather than + # hack all around it, let's just trust "g++" to DTRT. + _LT_TAGVAR(predep_objects,$1)= + _LT_TAGVAR(postdep_objects,$1)= + _LT_TAGVAR(postdeps,$1)= + ;; + +linux*) + case `$CC -V 2>&1 | sed 5q` in + *Sun\ C*) + # Sun C++ 5.9 + + # The more standards-conforming stlport4 library is + # incompatible with the Cstd library. Avoid specifying + # it if it's in CXXFLAGS. Ignore libCrun as + # -library=stlport4 depends on it. + case " $CXX $CXXFLAGS " in + *" -library=stlport4 "*) + solaris_use_stlport4=yes + ;; + esac + + if test "$solaris_use_stlport4" != yes; then + _LT_TAGVAR(postdeps,$1)='-library=Cstd -library=Crun' + fi + ;; + esac + ;; + +solaris*) + case $cc_basename in + CC* | sunCC*) + # The more standards-conforming stlport4 library is + # incompatible with the Cstd library. Avoid specifying + # it if it's in CXXFLAGS. Ignore libCrun as + # -library=stlport4 depends on it. + case " $CXX $CXXFLAGS " in + *" -library=stlport4 "*) + solaris_use_stlport4=yes + ;; + esac + + # Adding this requires a known-good setup of shared libraries for + # Sun compiler versions before 5.6, else PIC objects from an old + # archive will be linked into the output, leading to subtle bugs. + if test "$solaris_use_stlport4" != yes; then + _LT_TAGVAR(postdeps,$1)='-library=Cstd -library=Crun' + fi + ;; + esac + ;; +esac +]) + +case " $_LT_TAGVAR(postdeps, $1) " in +*" -lc "*) _LT_TAGVAR(archive_cmds_need_lc, $1)=no ;; +esac + _LT_TAGVAR(compiler_lib_search_dirs, $1)= +if test -n "${_LT_TAGVAR(compiler_lib_search_path, $1)}"; then + _LT_TAGVAR(compiler_lib_search_dirs, $1)=`echo " ${_LT_TAGVAR(compiler_lib_search_path, $1)}" | ${SED} -e 's! -L! !g' -e 's!^ !!'` +fi +_LT_TAGDECL([], [compiler_lib_search_dirs], [1], + [The directories searched by this compiler when creating a shared library]) +_LT_TAGDECL([], [predep_objects], [1], + [Dependencies to place before and after the objects being linked to + create a shared library]) +_LT_TAGDECL([], [postdep_objects], [1]) +_LT_TAGDECL([], [predeps], [1]) +_LT_TAGDECL([], [postdeps], [1]) +_LT_TAGDECL([], [compiler_lib_search_path], [1], + [The library search path used internally by the compiler when linking + a shared library]) +])# _LT_SYS_HIDDEN_LIBDEPS + + +# _LT_LANG_F77_CONFIG([TAG]) +# -------------------------- +# Ensure that the configuration variables for a Fortran 77 compiler are +# suitably defined. These variables are subsequently used by _LT_CONFIG +# to write the compiler configuration to `libtool'. +m4_defun([_LT_LANG_F77_CONFIG], +[AC_LANG_PUSH(Fortran 77) +if test -z "$F77" || test "X$F77" = "Xno"; then + _lt_disable_F77=yes +fi + +_LT_TAGVAR(archive_cmds_need_lc, $1)=no +_LT_TAGVAR(allow_undefined_flag, $1)= +_LT_TAGVAR(always_export_symbols, $1)=no +_LT_TAGVAR(archive_expsym_cmds, $1)= +_LT_TAGVAR(export_dynamic_flag_spec, $1)= +_LT_TAGVAR(hardcode_direct, $1)=no +_LT_TAGVAR(hardcode_direct_absolute, $1)=no +_LT_TAGVAR(hardcode_libdir_flag_spec, $1)= +_LT_TAGVAR(hardcode_libdir_separator, $1)= +_LT_TAGVAR(hardcode_minus_L, $1)=no +_LT_TAGVAR(hardcode_automatic, $1)=no +_LT_TAGVAR(inherit_rpath, $1)=no +_LT_TAGVAR(module_cmds, $1)= +_LT_TAGVAR(module_expsym_cmds, $1)= +_LT_TAGVAR(link_all_deplibs, $1)=unknown +_LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds +_LT_TAGVAR(reload_flag, $1)=$reload_flag +_LT_TAGVAR(reload_cmds, $1)=$reload_cmds +_LT_TAGVAR(no_undefined_flag, $1)= +_LT_TAGVAR(whole_archive_flag_spec, $1)= +_LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no + +# Source file extension for f77 test sources. +ac_ext=f + +# Object file extension for compiled f77 test sources. +objext=o +_LT_TAGVAR(objext, $1)=$objext + +# No sense in running all these tests if we already determined that +# the F77 compiler isn't working. Some variables (like enable_shared) +# are currently assumed to apply to all compilers on this platform, +# and will be corrupted by setting them based on a non-working compiler. +if test "$_lt_disable_F77" != yes; then + # Code to be used in simple compile tests + lt_simple_compile_test_code="\ + subroutine t + return + end +" + + # Code to be used in simple link tests + lt_simple_link_test_code="\ + program t + end +" + + # ltmain only uses $CC for tagged configurations so make sure $CC is set. + _LT_TAG_COMPILER + + # save warnings/boilerplate of simple test code + _LT_COMPILER_BOILERPLATE + _LT_LINKER_BOILERPLATE + + # Allow CC to be a program name with arguments. + lt_save_CC="$CC" + lt_save_GCC=$GCC + lt_save_CFLAGS=$CFLAGS + CC=${F77-"f77"} + CFLAGS=$FFLAGS + compiler=$CC + _LT_TAGVAR(compiler, $1)=$CC + _LT_CC_BASENAME([$compiler]) + GCC=$G77 + if test -n "$compiler"; then + AC_MSG_CHECKING([if libtool supports shared libraries]) + AC_MSG_RESULT([$can_build_shared]) + + AC_MSG_CHECKING([whether to build shared libraries]) + test "$can_build_shared" = "no" && enable_shared=no + + # On AIX, shared libraries and static libraries use the same namespace, and + # are all built from PIC. + case $host_os in + aix3*) + test "$enable_shared" = yes && enable_static=no + if test -n "$RANLIB"; then + archive_cmds="$archive_cmds~\$RANLIB \$lib" + postinstall_cmds='$RANLIB $lib' + fi + ;; + aix[[4-9]]*) + if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then + test "$enable_shared" = yes && enable_static=no + fi + ;; + esac + AC_MSG_RESULT([$enable_shared]) + + AC_MSG_CHECKING([whether to build static libraries]) + # Make sure either enable_shared or enable_static is yes. + test "$enable_shared" = yes || enable_static=yes + AC_MSG_RESULT([$enable_static]) + + _LT_TAGVAR(GCC, $1)="$G77" + _LT_TAGVAR(LD, $1)="$LD" + + ## CAVEAT EMPTOR: + ## There is no encapsulation within the following macros, do not change + ## the running order or otherwise move them around unless you know exactly + ## what you are doing... + _LT_COMPILER_PIC($1) + _LT_COMPILER_C_O($1) + _LT_COMPILER_FILE_LOCKS($1) + _LT_LINKER_SHLIBS($1) + _LT_SYS_DYNAMIC_LINKER($1) + _LT_LINKER_HARDCODE_LIBPATH($1) + + _LT_CONFIG($1) + fi # test -n "$compiler" + + GCC=$lt_save_GCC + CC="$lt_save_CC" + CFLAGS="$lt_save_CFLAGS" +fi # test "$_lt_disable_F77" != yes + +AC_LANG_POP +])# _LT_LANG_F77_CONFIG + + +# _LT_LANG_FC_CONFIG([TAG]) +# ------------------------- +# Ensure that the configuration variables for a Fortran compiler are +# suitably defined. These variables are subsequently used by _LT_CONFIG +# to write the compiler configuration to `libtool'. +m4_defun([_LT_LANG_FC_CONFIG], +[AC_LANG_PUSH(Fortran) + +if test -z "$FC" || test "X$FC" = "Xno"; then + _lt_disable_FC=yes +fi + +_LT_TAGVAR(archive_cmds_need_lc, $1)=no +_LT_TAGVAR(allow_undefined_flag, $1)= +_LT_TAGVAR(always_export_symbols, $1)=no +_LT_TAGVAR(archive_expsym_cmds, $1)= +_LT_TAGVAR(export_dynamic_flag_spec, $1)= +_LT_TAGVAR(hardcode_direct, $1)=no +_LT_TAGVAR(hardcode_direct_absolute, $1)=no +_LT_TAGVAR(hardcode_libdir_flag_spec, $1)= +_LT_TAGVAR(hardcode_libdir_separator, $1)= +_LT_TAGVAR(hardcode_minus_L, $1)=no +_LT_TAGVAR(hardcode_automatic, $1)=no +_LT_TAGVAR(inherit_rpath, $1)=no +_LT_TAGVAR(module_cmds, $1)= +_LT_TAGVAR(module_expsym_cmds, $1)= +_LT_TAGVAR(link_all_deplibs, $1)=unknown +_LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds +_LT_TAGVAR(reload_flag, $1)=$reload_flag +_LT_TAGVAR(reload_cmds, $1)=$reload_cmds +_LT_TAGVAR(no_undefined_flag, $1)= +_LT_TAGVAR(whole_archive_flag_spec, $1)= +_LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no + +# Source file extension for fc test sources. +ac_ext=${ac_fc_srcext-f} + +# Object file extension for compiled fc test sources. +objext=o +_LT_TAGVAR(objext, $1)=$objext + +# No sense in running all these tests if we already determined that +# the FC compiler isn't working. Some variables (like enable_shared) +# are currently assumed to apply to all compilers on this platform, +# and will be corrupted by setting them based on a non-working compiler. +if test "$_lt_disable_FC" != yes; then + # Code to be used in simple compile tests + lt_simple_compile_test_code="\ + subroutine t + return + end +" + + # Code to be used in simple link tests + lt_simple_link_test_code="\ + program t + end +" + + # ltmain only uses $CC for tagged configurations so make sure $CC is set. + _LT_TAG_COMPILER + + # save warnings/boilerplate of simple test code + _LT_COMPILER_BOILERPLATE + _LT_LINKER_BOILERPLATE + + # Allow CC to be a program name with arguments. + lt_save_CC="$CC" + lt_save_GCC=$GCC + lt_save_CFLAGS=$CFLAGS + CC=${FC-"f95"} + CFLAGS=$FCFLAGS + compiler=$CC + GCC=$ac_cv_fc_compiler_gnu + + _LT_TAGVAR(compiler, $1)=$CC + _LT_CC_BASENAME([$compiler]) + + if test -n "$compiler"; then + AC_MSG_CHECKING([if libtool supports shared libraries]) + AC_MSG_RESULT([$can_build_shared]) + + AC_MSG_CHECKING([whether to build shared libraries]) + test "$can_build_shared" = "no" && enable_shared=no + + # On AIX, shared libraries and static libraries use the same namespace, and + # are all built from PIC. + case $host_os in + aix3*) + test "$enable_shared" = yes && enable_static=no + if test -n "$RANLIB"; then + archive_cmds="$archive_cmds~\$RANLIB \$lib" + postinstall_cmds='$RANLIB $lib' + fi + ;; + aix[[4-9]]*) + if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then + test "$enable_shared" = yes && enable_static=no + fi + ;; + esac + AC_MSG_RESULT([$enable_shared]) + + AC_MSG_CHECKING([whether to build static libraries]) + # Make sure either enable_shared or enable_static is yes. + test "$enable_shared" = yes || enable_static=yes + AC_MSG_RESULT([$enable_static]) + + _LT_TAGVAR(GCC, $1)="$ac_cv_fc_compiler_gnu" + _LT_TAGVAR(LD, $1)="$LD" + + ## CAVEAT EMPTOR: + ## There is no encapsulation within the following macros, do not change + ## the running order or otherwise move them around unless you know exactly + ## what you are doing... + _LT_SYS_HIDDEN_LIBDEPS($1) + _LT_COMPILER_PIC($1) + _LT_COMPILER_C_O($1) + _LT_COMPILER_FILE_LOCKS($1) + _LT_LINKER_SHLIBS($1) + _LT_SYS_DYNAMIC_LINKER($1) + _LT_LINKER_HARDCODE_LIBPATH($1) + + _LT_CONFIG($1) + fi # test -n "$compiler" + + GCC=$lt_save_GCC + CC=$lt_save_CC + CFLAGS=$lt_save_CFLAGS +fi # test "$_lt_disable_FC" != yes + +AC_LANG_POP +])# _LT_LANG_FC_CONFIG + + +# _LT_LANG_GCJ_CONFIG([TAG]) +# -------------------------- +# Ensure that the configuration variables for the GNU Java Compiler compiler +# are suitably defined. These variables are subsequently used by _LT_CONFIG +# to write the compiler configuration to `libtool'. +m4_defun([_LT_LANG_GCJ_CONFIG], +[AC_REQUIRE([LT_PROG_GCJ])dnl +AC_LANG_SAVE + +# Source file extension for Java test sources. +ac_ext=java + +# Object file extension for compiled Java test sources. +objext=o +_LT_TAGVAR(objext, $1)=$objext + +# Code to be used in simple compile tests +lt_simple_compile_test_code="class foo {}" + +# Code to be used in simple link tests +lt_simple_link_test_code='public class conftest { public static void main(String[[]] argv) {}; }' + +# ltmain only uses $CC for tagged configurations so make sure $CC is set. +_LT_TAG_COMPILER + +# save warnings/boilerplate of simple test code +_LT_COMPILER_BOILERPLATE +_LT_LINKER_BOILERPLATE + +# Allow CC to be a program name with arguments. +lt_save_CC=$CC +lt_save_CFLAGS=$CFLAGS +lt_save_GCC=$GCC +GCC=yes +CC=${GCJ-"gcj"} +CFLAGS=$GCJFLAGS +compiler=$CC +_LT_TAGVAR(compiler, $1)=$CC +_LT_TAGVAR(LD, $1)="$LD" +_LT_CC_BASENAME([$compiler]) + +# GCJ did not exist at the time GCC didn't implicitly link libc in. +_LT_TAGVAR(archive_cmds_need_lc, $1)=no + +_LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds +_LT_TAGVAR(reload_flag, $1)=$reload_flag +_LT_TAGVAR(reload_cmds, $1)=$reload_cmds + +if test -n "$compiler"; then + _LT_COMPILER_NO_RTTI($1) + _LT_COMPILER_PIC($1) + _LT_COMPILER_C_O($1) + _LT_COMPILER_FILE_LOCKS($1) + _LT_LINKER_SHLIBS($1) + _LT_LINKER_HARDCODE_LIBPATH($1) + + _LT_CONFIG($1) +fi + +AC_LANG_RESTORE + +GCC=$lt_save_GCC +CC=$lt_save_CC +CFLAGS=$lt_save_CFLAGS +])# _LT_LANG_GCJ_CONFIG + + +# _LT_LANG_GO_CONFIG([TAG]) +# -------------------------- +# Ensure that the configuration variables for the GNU Go compiler +# are suitably defined. These variables are subsequently used by _LT_CONFIG +# to write the compiler configuration to `libtool'. +m4_defun([_LT_LANG_GO_CONFIG], +[AC_REQUIRE([LT_PROG_GO])dnl +AC_LANG_SAVE + +# Source file extension for Go test sources. +ac_ext=go + +# Object file extension for compiled Go test sources. +objext=o +_LT_TAGVAR(objext, $1)=$objext + +# Code to be used in simple compile tests +lt_simple_compile_test_code="package main; func main() { }" + +# Code to be used in simple link tests +lt_simple_link_test_code='package main; func main() { }' + +# ltmain only uses $CC for tagged configurations so make sure $CC is set. +_LT_TAG_COMPILER + +# save warnings/boilerplate of simple test code +_LT_COMPILER_BOILERPLATE +_LT_LINKER_BOILERPLATE + +# Allow CC to be a program name with arguments. +lt_save_CC=$CC +lt_save_CFLAGS=$CFLAGS +lt_save_GCC=$GCC +GCC=yes +CC=${GOC-"gccgo"} +CFLAGS=$GOFLAGS +compiler=$CC +_LT_TAGVAR(compiler, $1)=$CC +_LT_TAGVAR(LD, $1)="$LD" +_LT_CC_BASENAME([$compiler]) + +# Go did not exist at the time GCC didn't implicitly link libc in. +_LT_TAGVAR(archive_cmds_need_lc, $1)=no + +_LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds +_LT_TAGVAR(reload_flag, $1)=$reload_flag +_LT_TAGVAR(reload_cmds, $1)=$reload_cmds + +if test -n "$compiler"; then + _LT_COMPILER_NO_RTTI($1) + _LT_COMPILER_PIC($1) + _LT_COMPILER_C_O($1) + _LT_COMPILER_FILE_LOCKS($1) + _LT_LINKER_SHLIBS($1) + _LT_LINKER_HARDCODE_LIBPATH($1) + + _LT_CONFIG($1) +fi + +AC_LANG_RESTORE + +GCC=$lt_save_GCC +CC=$lt_save_CC +CFLAGS=$lt_save_CFLAGS +])# _LT_LANG_GO_CONFIG + + +# _LT_LANG_RC_CONFIG([TAG]) +# ------------------------- +# Ensure that the configuration variables for the Windows resource compiler +# are suitably defined. These variables are subsequently used by _LT_CONFIG +# to write the compiler configuration to `libtool'. +m4_defun([_LT_LANG_RC_CONFIG], +[AC_REQUIRE([LT_PROG_RC])dnl +AC_LANG_SAVE + +# Source file extension for RC test sources. +ac_ext=rc + +# Object file extension for compiled RC test sources. +objext=o +_LT_TAGVAR(objext, $1)=$objext + +# Code to be used in simple compile tests +lt_simple_compile_test_code='sample MENU { MENUITEM "&Soup", 100, CHECKED }' + +# Code to be used in simple link tests +lt_simple_link_test_code="$lt_simple_compile_test_code" + +# ltmain only uses $CC for tagged configurations so make sure $CC is set. +_LT_TAG_COMPILER + +# save warnings/boilerplate of simple test code +_LT_COMPILER_BOILERPLATE +_LT_LINKER_BOILERPLATE + +# Allow CC to be a program name with arguments. +lt_save_CC="$CC" +lt_save_CFLAGS=$CFLAGS +lt_save_GCC=$GCC +GCC= +CC=${RC-"windres"} +CFLAGS= +compiler=$CC +_LT_TAGVAR(compiler, $1)=$CC +_LT_CC_BASENAME([$compiler]) +_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)=yes + +if test -n "$compiler"; then + : + _LT_CONFIG($1) +fi + +GCC=$lt_save_GCC +AC_LANG_RESTORE +CC=$lt_save_CC +CFLAGS=$lt_save_CFLAGS +])# _LT_LANG_RC_CONFIG + + +# LT_PROG_GCJ +# ----------- +AC_DEFUN([LT_PROG_GCJ], +[m4_ifdef([AC_PROG_GCJ], [AC_PROG_GCJ], + [m4_ifdef([A][M_PROG_GCJ], [A][M_PROG_GCJ], + [AC_CHECK_TOOL(GCJ, gcj,) + test "x${GCJFLAGS+set}" = xset || GCJFLAGS="-g -O2" + AC_SUBST(GCJFLAGS)])])[]dnl +]) + +# Old name: +AU_ALIAS([LT_AC_PROG_GCJ], [LT_PROG_GCJ]) +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([LT_AC_PROG_GCJ], []) + + +# LT_PROG_GO +# ---------- +AC_DEFUN([LT_PROG_GO], +[AC_CHECK_TOOL(GOC, gccgo,) +]) + + +# LT_PROG_RC +# ---------- +AC_DEFUN([LT_PROG_RC], +[AC_CHECK_TOOL(RC, windres,) +]) + +# Old name: +AU_ALIAS([LT_AC_PROG_RC], [LT_PROG_RC]) +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([LT_AC_PROG_RC], []) + + +# _LT_DECL_EGREP +# -------------- +# If we don't have a new enough Autoconf to choose the best grep +# available, choose the one first in the user's PATH. +m4_defun([_LT_DECL_EGREP], +[AC_REQUIRE([AC_PROG_EGREP])dnl +AC_REQUIRE([AC_PROG_FGREP])dnl +test -z "$GREP" && GREP=grep +_LT_DECL([], [GREP], [1], [A grep program that handles long lines]) +_LT_DECL([], [EGREP], [1], [An ERE matcher]) +_LT_DECL([], [FGREP], [1], [A literal string matcher]) +dnl Non-bleeding-edge autoconf doesn't subst GREP, so do it here too +AC_SUBST([GREP]) +]) + + +# _LT_DECL_OBJDUMP +# -------------- +# If we don't have a new enough Autoconf to choose the best objdump +# available, choose the one first in the user's PATH. +m4_defun([_LT_DECL_OBJDUMP], +[AC_CHECK_TOOL(OBJDUMP, objdump, false) +test -z "$OBJDUMP" && OBJDUMP=objdump +_LT_DECL([], [OBJDUMP], [1], [An object symbol dumper]) +AC_SUBST([OBJDUMP]) +]) + +# _LT_DECL_DLLTOOL +# ---------------- +# Ensure DLLTOOL variable is set. +m4_defun([_LT_DECL_DLLTOOL], +[AC_CHECK_TOOL(DLLTOOL, dlltool, false) +test -z "$DLLTOOL" && DLLTOOL=dlltool +_LT_DECL([], [DLLTOOL], [1], [DLL creation program]) +AC_SUBST([DLLTOOL]) +]) + +# _LT_DECL_SED +# ------------ +# Check for a fully-functional sed program, that truncates +# as few characters as possible. Prefer GNU sed if found. +m4_defun([_LT_DECL_SED], +[AC_PROG_SED +test -z "$SED" && SED=sed +Xsed="$SED -e 1s/^X//" +_LT_DECL([], [SED], [1], [A sed program that does not truncate output]) +_LT_DECL([], [Xsed], ["\$SED -e 1s/^X//"], + [Sed that helps us avoid accidentally triggering echo(1) options like -n]) +])# _LT_DECL_SED + +m4_ifndef([AC_PROG_SED], [ +# NOTE: This macro has been submitted for inclusion into # +# GNU Autoconf as AC_PROG_SED. When it is available in # +# a released version of Autoconf we should remove this # +# macro and use it instead. # + +m4_defun([AC_PROG_SED], +[AC_MSG_CHECKING([for a sed that does not truncate output]) +AC_CACHE_VAL(lt_cv_path_SED, +[# Loop through the user's path and test for sed and gsed. +# Then use that list of sed's as ones to test for truncation. +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for lt_ac_prog in sed gsed; do + for ac_exec_ext in '' $ac_executable_extensions; do + if $as_executable_p "$as_dir/$lt_ac_prog$ac_exec_ext"; then + lt_ac_sed_list="$lt_ac_sed_list $as_dir/$lt_ac_prog$ac_exec_ext" + fi + done + done +done +IFS=$as_save_IFS +lt_ac_max=0 +lt_ac_count=0 +# Add /usr/xpg4/bin/sed as it is typically found on Solaris +# along with /bin/sed that truncates output. +for lt_ac_sed in $lt_ac_sed_list /usr/xpg4/bin/sed; do + test ! -f $lt_ac_sed && continue + cat /dev/null > conftest.in + lt_ac_count=0 + echo $ECHO_N "0123456789$ECHO_C" >conftest.in + # Check for GNU sed and select it if it is found. + if "$lt_ac_sed" --version 2>&1 < /dev/null | grep 'GNU' > /dev/null; then + lt_cv_path_SED=$lt_ac_sed + break + fi + while true; do + cat conftest.in conftest.in >conftest.tmp + mv conftest.tmp conftest.in + cp conftest.in conftest.nl + echo >>conftest.nl + $lt_ac_sed -e 's/a$//' < conftest.nl >conftest.out || break + cmp -s conftest.out conftest.nl || break + # 10000 chars as input seems more than enough + test $lt_ac_count -gt 10 && break + lt_ac_count=`expr $lt_ac_count + 1` + if test $lt_ac_count -gt $lt_ac_max; then + lt_ac_max=$lt_ac_count + lt_cv_path_SED=$lt_ac_sed + fi + done +done +]) +SED=$lt_cv_path_SED +AC_SUBST([SED]) +AC_MSG_RESULT([$SED]) +])#AC_PROG_SED +])#m4_ifndef + +# Old name: +AU_ALIAS([LT_AC_PROG_SED], [AC_PROG_SED]) +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([LT_AC_PROG_SED], []) + + +# _LT_CHECK_SHELL_FEATURES +# ------------------------ +# Find out whether the shell is Bourne or XSI compatible, +# or has some other useful features. +m4_defun([_LT_CHECK_SHELL_FEATURES], +[AC_MSG_CHECKING([whether the shell understands some XSI constructs]) +# Try some XSI features +xsi_shell=no +( _lt_dummy="a/b/c" + test "${_lt_dummy##*/},${_lt_dummy%/*},${_lt_dummy#??}"${_lt_dummy%"$_lt_dummy"}, \ + = c,a/b,b/c, \ + && eval 'test $(( 1 + 1 )) -eq 2 \ + && test "${#_lt_dummy}" -eq 5' ) >/dev/null 2>&1 \ + && xsi_shell=yes +AC_MSG_RESULT([$xsi_shell]) +_LT_CONFIG_LIBTOOL_INIT([xsi_shell='$xsi_shell']) + +AC_MSG_CHECKING([whether the shell understands "+="]) +lt_shell_append=no +( foo=bar; set foo baz; eval "$[1]+=\$[2]" && test "$foo" = barbaz ) \ + >/dev/null 2>&1 \ + && lt_shell_append=yes +AC_MSG_RESULT([$lt_shell_append]) +_LT_CONFIG_LIBTOOL_INIT([lt_shell_append='$lt_shell_append']) + +if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then + lt_unset=unset +else + lt_unset=false +fi +_LT_DECL([], [lt_unset], [0], [whether the shell understands "unset"])dnl + +# test EBCDIC or ASCII +case `echo X|tr X '\101'` in + A) # ASCII based system + # \n is not interpreted correctly by Solaris 8 /usr/ucb/tr + lt_SP2NL='tr \040 \012' + lt_NL2SP='tr \015\012 \040\040' + ;; + *) # EBCDIC based system + lt_SP2NL='tr \100 \n' + lt_NL2SP='tr \r\n \100\100' + ;; +esac +_LT_DECL([SP2NL], [lt_SP2NL], [1], [turn spaces into newlines])dnl +_LT_DECL([NL2SP], [lt_NL2SP], [1], [turn newlines into spaces])dnl +])# _LT_CHECK_SHELL_FEATURES + + +# _LT_PROG_FUNCTION_REPLACE (FUNCNAME, REPLACEMENT-BODY) +# ------------------------------------------------------ +# In `$cfgfile', look for function FUNCNAME delimited by `^FUNCNAME ()$' and +# '^} FUNCNAME ', and replace its body with REPLACEMENT-BODY. +m4_defun([_LT_PROG_FUNCTION_REPLACE], +[dnl { +sed -e '/^$1 ()$/,/^} # $1 /c\ +$1 ()\ +{\ +m4_bpatsubsts([$2], [$], [\\], [^\([ ]\)], [\\\1]) +} # Extended-shell $1 implementation' "$cfgfile" > $cfgfile.tmp \ + && mv -f "$cfgfile.tmp" "$cfgfile" \ + || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") +test 0 -eq $? || _lt_function_replace_fail=: +]) + + +# _LT_PROG_REPLACE_SHELLFNS +# ------------------------- +# Replace existing portable implementations of several shell functions with +# equivalent extended shell implementations where those features are available.. +m4_defun([_LT_PROG_REPLACE_SHELLFNS], +[if test x"$xsi_shell" = xyes; then + _LT_PROG_FUNCTION_REPLACE([func_dirname], [dnl + case ${1} in + */*) func_dirname_result="${1%/*}${2}" ;; + * ) func_dirname_result="${3}" ;; + esac]) + + _LT_PROG_FUNCTION_REPLACE([func_basename], [dnl + func_basename_result="${1##*/}"]) + + _LT_PROG_FUNCTION_REPLACE([func_dirname_and_basename], [dnl + case ${1} in + */*) func_dirname_result="${1%/*}${2}" ;; + * ) func_dirname_result="${3}" ;; + esac + func_basename_result="${1##*/}"]) + + _LT_PROG_FUNCTION_REPLACE([func_stripname], [dnl + # pdksh 5.2.14 does not do ${X%$Y} correctly if both X and Y are + # positional parameters, so assign one to ordinary parameter first. + func_stripname_result=${3} + func_stripname_result=${func_stripname_result#"${1}"} + func_stripname_result=${func_stripname_result%"${2}"}]) + + _LT_PROG_FUNCTION_REPLACE([func_split_long_opt], [dnl + func_split_long_opt_name=${1%%=*} + func_split_long_opt_arg=${1#*=}]) + + _LT_PROG_FUNCTION_REPLACE([func_split_short_opt], [dnl + func_split_short_opt_arg=${1#??} + func_split_short_opt_name=${1%"$func_split_short_opt_arg"}]) + + _LT_PROG_FUNCTION_REPLACE([func_lo2o], [dnl + case ${1} in + *.lo) func_lo2o_result=${1%.lo}.${objext} ;; + *) func_lo2o_result=${1} ;; + esac]) + + _LT_PROG_FUNCTION_REPLACE([func_xform], [ func_xform_result=${1%.*}.lo]) + + _LT_PROG_FUNCTION_REPLACE([func_arith], [ func_arith_result=$(( $[*] ))]) + + _LT_PROG_FUNCTION_REPLACE([func_len], [ func_len_result=${#1}]) +fi + +if test x"$lt_shell_append" = xyes; then + _LT_PROG_FUNCTION_REPLACE([func_append], [ eval "${1}+=\\${2}"]) + + _LT_PROG_FUNCTION_REPLACE([func_append_quoted], [dnl + func_quote_for_eval "${2}" +dnl m4 expansion turns \\\\ into \\, and then the shell eval turns that into \ + eval "${1}+=\\\\ \\$func_quote_for_eval_result"]) + + # Save a `func_append' function call where possible by direct use of '+=' + sed -e 's%func_append \([[a-zA-Z_]]\{1,\}\) "%\1+="%g' $cfgfile > $cfgfile.tmp \ + && mv -f "$cfgfile.tmp" "$cfgfile" \ + || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") + test 0 -eq $? || _lt_function_replace_fail=: +else + # Save a `func_append' function call even when '+=' is not available + sed -e 's%func_append \([[a-zA-Z_]]\{1,\}\) "%\1="$\1%g' $cfgfile > $cfgfile.tmp \ + && mv -f "$cfgfile.tmp" "$cfgfile" \ + || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") + test 0 -eq $? || _lt_function_replace_fail=: +fi + +if test x"$_lt_function_replace_fail" = x":"; then + AC_MSG_WARN([Unable to substitute extended shell functions in $ofile]) +fi +]) + +# _LT_PATH_CONVERSION_FUNCTIONS +# ----------------------------- +# Determine which file name conversion functions should be used by +# func_to_host_file (and, implicitly, by func_to_host_path). These are needed +# for certain cross-compile configurations and native mingw. +m4_defun([_LT_PATH_CONVERSION_FUNCTIONS], +[AC_REQUIRE([AC_CANONICAL_HOST])dnl +AC_REQUIRE([AC_CANONICAL_BUILD])dnl +AC_MSG_CHECKING([how to convert $build file names to $host format]) +AC_CACHE_VAL(lt_cv_to_host_file_cmd, +[case $host in + *-*-mingw* ) + case $build in + *-*-mingw* ) # actually msys + lt_cv_to_host_file_cmd=func_convert_file_msys_to_w32 + ;; + *-*-cygwin* ) + lt_cv_to_host_file_cmd=func_convert_file_cygwin_to_w32 + ;; + * ) # otherwise, assume *nix + lt_cv_to_host_file_cmd=func_convert_file_nix_to_w32 + ;; + esac + ;; + *-*-cygwin* ) + case $build in + *-*-mingw* ) # actually msys + lt_cv_to_host_file_cmd=func_convert_file_msys_to_cygwin + ;; + *-*-cygwin* ) + lt_cv_to_host_file_cmd=func_convert_file_noop + ;; + * ) # otherwise, assume *nix + lt_cv_to_host_file_cmd=func_convert_file_nix_to_cygwin + ;; + esac + ;; + * ) # unhandled hosts (and "normal" native builds) + lt_cv_to_host_file_cmd=func_convert_file_noop + ;; +esac +]) +to_host_file_cmd=$lt_cv_to_host_file_cmd +AC_MSG_RESULT([$lt_cv_to_host_file_cmd]) +_LT_DECL([to_host_file_cmd], [lt_cv_to_host_file_cmd], + [0], [convert $build file names to $host format])dnl + +AC_MSG_CHECKING([how to convert $build file names to toolchain format]) +AC_CACHE_VAL(lt_cv_to_tool_file_cmd, +[#assume ordinary cross tools, or native build. +lt_cv_to_tool_file_cmd=func_convert_file_noop +case $host in + *-*-mingw* ) + case $build in + *-*-mingw* ) # actually msys + lt_cv_to_tool_file_cmd=func_convert_file_msys_to_w32 + ;; + esac + ;; +esac +]) +to_tool_file_cmd=$lt_cv_to_tool_file_cmd +AC_MSG_RESULT([$lt_cv_to_tool_file_cmd]) +_LT_DECL([to_tool_file_cmd], [lt_cv_to_tool_file_cmd], + [0], [convert $build files to toolchain format])dnl +])# _LT_PATH_CONVERSION_FUNCTIONS + +# Helper functions for option handling. -*- Autoconf -*- +# +# Copyright (C) 2004, 2005, 2007, 2008, 2009 Free Software Foundation, +# Inc. +# Written by Gary V. Vaughan, 2004 +# +# This file is free software; the Free Software Foundation gives +# unlimited permission to copy and/or distribute it, with or without +# modifications, as long as this notice is preserved. + +# serial 7 ltoptions.m4 + +# This is to help aclocal find these macros, as it can't see m4_define. +AC_DEFUN([LTOPTIONS_VERSION], [m4_if([1])]) + + +# _LT_MANGLE_OPTION(MACRO-NAME, OPTION-NAME) +# ------------------------------------------ +m4_define([_LT_MANGLE_OPTION], +[[_LT_OPTION_]m4_bpatsubst($1__$2, [[^a-zA-Z0-9_]], [_])]) + + +# _LT_SET_OPTION(MACRO-NAME, OPTION-NAME) +# --------------------------------------- +# Set option OPTION-NAME for macro MACRO-NAME, and if there is a +# matching handler defined, dispatch to it. Other OPTION-NAMEs are +# saved as a flag. +m4_define([_LT_SET_OPTION], +[m4_define(_LT_MANGLE_OPTION([$1], [$2]))dnl +m4_ifdef(_LT_MANGLE_DEFUN([$1], [$2]), + _LT_MANGLE_DEFUN([$1], [$2]), + [m4_warning([Unknown $1 option `$2'])])[]dnl +]) + + +# _LT_IF_OPTION(MACRO-NAME, OPTION-NAME, IF-SET, [IF-NOT-SET]) +# ------------------------------------------------------------ +# Execute IF-SET if OPTION is set, IF-NOT-SET otherwise. +m4_define([_LT_IF_OPTION], +[m4_ifdef(_LT_MANGLE_OPTION([$1], [$2]), [$3], [$4])]) + + +# _LT_UNLESS_OPTIONS(MACRO-NAME, OPTION-LIST, IF-NOT-SET) +# ------------------------------------------------------- +# Execute IF-NOT-SET unless all options in OPTION-LIST for MACRO-NAME +# are set. +m4_define([_LT_UNLESS_OPTIONS], +[m4_foreach([_LT_Option], m4_split(m4_normalize([$2])), + [m4_ifdef(_LT_MANGLE_OPTION([$1], _LT_Option), + [m4_define([$0_found])])])[]dnl +m4_ifdef([$0_found], [m4_undefine([$0_found])], [$3 +])[]dnl +]) + + +# _LT_SET_OPTIONS(MACRO-NAME, OPTION-LIST) +# ---------------------------------------- +# OPTION-LIST is a space-separated list of Libtool options associated +# with MACRO-NAME. If any OPTION has a matching handler declared with +# LT_OPTION_DEFINE, dispatch to that macro; otherwise complain about +# the unknown option and exit. +m4_defun([_LT_SET_OPTIONS], +[# Set options +m4_foreach([_LT_Option], m4_split(m4_normalize([$2])), + [_LT_SET_OPTION([$1], _LT_Option)]) + +m4_if([$1],[LT_INIT],[ + dnl + dnl Simply set some default values (i.e off) if boolean options were not + dnl specified: + _LT_UNLESS_OPTIONS([LT_INIT], [dlopen], [enable_dlopen=no + ]) + _LT_UNLESS_OPTIONS([LT_INIT], [win32-dll], [enable_win32_dll=no + ]) + dnl + dnl If no reference was made to various pairs of opposing options, then + dnl we run the default mode handler for the pair. For example, if neither + dnl `shared' nor `disable-shared' was passed, we enable building of shared + dnl archives by default: + _LT_UNLESS_OPTIONS([LT_INIT], [shared disable-shared], [_LT_ENABLE_SHARED]) + _LT_UNLESS_OPTIONS([LT_INIT], [static disable-static], [_LT_ENABLE_STATIC]) + _LT_UNLESS_OPTIONS([LT_INIT], [pic-only no-pic], [_LT_WITH_PIC]) + _LT_UNLESS_OPTIONS([LT_INIT], [fast-install disable-fast-install], + [_LT_ENABLE_FAST_INSTALL]) + ]) +])# _LT_SET_OPTIONS + + + +# _LT_MANGLE_DEFUN(MACRO-NAME, OPTION-NAME) +# ----------------------------------------- +m4_define([_LT_MANGLE_DEFUN], +[[_LT_OPTION_DEFUN_]m4_bpatsubst(m4_toupper([$1__$2]), [[^A-Z0-9_]], [_])]) + + +# LT_OPTION_DEFINE(MACRO-NAME, OPTION-NAME, CODE) +# ----------------------------------------------- +m4_define([LT_OPTION_DEFINE], +[m4_define(_LT_MANGLE_DEFUN([$1], [$2]), [$3])[]dnl +])# LT_OPTION_DEFINE + + +# dlopen +# ------ +LT_OPTION_DEFINE([LT_INIT], [dlopen], [enable_dlopen=yes +]) + +AU_DEFUN([AC_LIBTOOL_DLOPEN], +[_LT_SET_OPTION([LT_INIT], [dlopen]) +AC_DIAGNOSE([obsolete], +[$0: Remove this warning and the call to _LT_SET_OPTION when you +put the `dlopen' option into LT_INIT's first parameter.]) +]) + +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AC_LIBTOOL_DLOPEN], []) + + +# win32-dll +# --------- +# Declare package support for building win32 dll's. +LT_OPTION_DEFINE([LT_INIT], [win32-dll], +[enable_win32_dll=yes + +case $host in +*-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-cegcc*) + AC_CHECK_TOOL(AS, as, false) + AC_CHECK_TOOL(DLLTOOL, dlltool, false) + AC_CHECK_TOOL(OBJDUMP, objdump, false) + ;; +esac + +test -z "$AS" && AS=as +_LT_DECL([], [AS], [1], [Assembler program])dnl + +test -z "$DLLTOOL" && DLLTOOL=dlltool +_LT_DECL([], [DLLTOOL], [1], [DLL creation program])dnl + +test -z "$OBJDUMP" && OBJDUMP=objdump +_LT_DECL([], [OBJDUMP], [1], [Object dumper program])dnl +])# win32-dll + +AU_DEFUN([AC_LIBTOOL_WIN32_DLL], +[AC_REQUIRE([AC_CANONICAL_HOST])dnl +_LT_SET_OPTION([LT_INIT], [win32-dll]) +AC_DIAGNOSE([obsolete], +[$0: Remove this warning and the call to _LT_SET_OPTION when you +put the `win32-dll' option into LT_INIT's first parameter.]) +]) + +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AC_LIBTOOL_WIN32_DLL], []) + + +# _LT_ENABLE_SHARED([DEFAULT]) +# ---------------------------- +# implement the --enable-shared flag, and supports the `shared' and +# `disable-shared' LT_INIT options. +# DEFAULT is either `yes' or `no'. If omitted, it defaults to `yes'. +m4_define([_LT_ENABLE_SHARED], +[m4_define([_LT_ENABLE_SHARED_DEFAULT], [m4_if($1, no, no, yes)])dnl +AC_ARG_ENABLE([shared], + [AS_HELP_STRING([--enable-shared@<:@=PKGS@:>@], + [build shared libraries @<:@default=]_LT_ENABLE_SHARED_DEFAULT[@:>@])], + [p=${PACKAGE-default} + case $enableval in + yes) enable_shared=yes ;; + no) enable_shared=no ;; + *) + enable_shared=no + # Look at the argument we got. We use all the common list separators. + lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," + for pkg in $enableval; do + IFS="$lt_save_ifs" + if test "X$pkg" = "X$p"; then + enable_shared=yes + fi + done + IFS="$lt_save_ifs" + ;; + esac], + [enable_shared=]_LT_ENABLE_SHARED_DEFAULT) + + _LT_DECL([build_libtool_libs], [enable_shared], [0], + [Whether or not to build shared libraries]) +])# _LT_ENABLE_SHARED + +LT_OPTION_DEFINE([LT_INIT], [shared], [_LT_ENABLE_SHARED([yes])]) +LT_OPTION_DEFINE([LT_INIT], [disable-shared], [_LT_ENABLE_SHARED([no])]) + +# Old names: +AC_DEFUN([AC_ENABLE_SHARED], +[_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[shared]) +]) + +AC_DEFUN([AC_DISABLE_SHARED], +[_LT_SET_OPTION([LT_INIT], [disable-shared]) +]) + +AU_DEFUN([AM_ENABLE_SHARED], [AC_ENABLE_SHARED($@)]) +AU_DEFUN([AM_DISABLE_SHARED], [AC_DISABLE_SHARED($@)]) + +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AM_ENABLE_SHARED], []) +dnl AC_DEFUN([AM_DISABLE_SHARED], []) + + + +# _LT_ENABLE_STATIC([DEFAULT]) +# ---------------------------- +# implement the --enable-static flag, and support the `static' and +# `disable-static' LT_INIT options. +# DEFAULT is either `yes' or `no'. If omitted, it defaults to `yes'. +m4_define([_LT_ENABLE_STATIC], +[m4_define([_LT_ENABLE_STATIC_DEFAULT], [m4_if($1, no, no, yes)])dnl +AC_ARG_ENABLE([static], + [AS_HELP_STRING([--enable-static@<:@=PKGS@:>@], + [build static libraries @<:@default=]_LT_ENABLE_STATIC_DEFAULT[@:>@])], + [p=${PACKAGE-default} + case $enableval in + yes) enable_static=yes ;; + no) enable_static=no ;; + *) + enable_static=no + # Look at the argument we got. We use all the common list separators. + lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," + for pkg in $enableval; do + IFS="$lt_save_ifs" + if test "X$pkg" = "X$p"; then + enable_static=yes + fi + done + IFS="$lt_save_ifs" + ;; + esac], + [enable_static=]_LT_ENABLE_STATIC_DEFAULT) + + _LT_DECL([build_old_libs], [enable_static], [0], + [Whether or not to build static libraries]) +])# _LT_ENABLE_STATIC + +LT_OPTION_DEFINE([LT_INIT], [static], [_LT_ENABLE_STATIC([yes])]) +LT_OPTION_DEFINE([LT_INIT], [disable-static], [_LT_ENABLE_STATIC([no])]) + +# Old names: +AC_DEFUN([AC_ENABLE_STATIC], +[_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[static]) +]) + +AC_DEFUN([AC_DISABLE_STATIC], +[_LT_SET_OPTION([LT_INIT], [disable-static]) +]) + +AU_DEFUN([AM_ENABLE_STATIC], [AC_ENABLE_STATIC($@)]) +AU_DEFUN([AM_DISABLE_STATIC], [AC_DISABLE_STATIC($@)]) + +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AM_ENABLE_STATIC], []) +dnl AC_DEFUN([AM_DISABLE_STATIC], []) + + + +# _LT_ENABLE_FAST_INSTALL([DEFAULT]) +# ---------------------------------- +# implement the --enable-fast-install flag, and support the `fast-install' +# and `disable-fast-install' LT_INIT options. +# DEFAULT is either `yes' or `no'. If omitted, it defaults to `yes'. +m4_define([_LT_ENABLE_FAST_INSTALL], +[m4_define([_LT_ENABLE_FAST_INSTALL_DEFAULT], [m4_if($1, no, no, yes)])dnl +AC_ARG_ENABLE([fast-install], + [AS_HELP_STRING([--enable-fast-install@<:@=PKGS@:>@], + [optimize for fast installation @<:@default=]_LT_ENABLE_FAST_INSTALL_DEFAULT[@:>@])], + [p=${PACKAGE-default} + case $enableval in + yes) enable_fast_install=yes ;; + no) enable_fast_install=no ;; + *) + enable_fast_install=no + # Look at the argument we got. We use all the common list separators. + lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," + for pkg in $enableval; do + IFS="$lt_save_ifs" + if test "X$pkg" = "X$p"; then + enable_fast_install=yes + fi + done + IFS="$lt_save_ifs" + ;; + esac], + [enable_fast_install=]_LT_ENABLE_FAST_INSTALL_DEFAULT) + +_LT_DECL([fast_install], [enable_fast_install], [0], + [Whether or not to optimize for fast installation])dnl +])# _LT_ENABLE_FAST_INSTALL + +LT_OPTION_DEFINE([LT_INIT], [fast-install], [_LT_ENABLE_FAST_INSTALL([yes])]) +LT_OPTION_DEFINE([LT_INIT], [disable-fast-install], [_LT_ENABLE_FAST_INSTALL([no])]) + +# Old names: +AU_DEFUN([AC_ENABLE_FAST_INSTALL], +[_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[fast-install]) +AC_DIAGNOSE([obsolete], +[$0: Remove this warning and the call to _LT_SET_OPTION when you put +the `fast-install' option into LT_INIT's first parameter.]) +]) + +AU_DEFUN([AC_DISABLE_FAST_INSTALL], +[_LT_SET_OPTION([LT_INIT], [disable-fast-install]) +AC_DIAGNOSE([obsolete], +[$0: Remove this warning and the call to _LT_SET_OPTION when you put +the `disable-fast-install' option into LT_INIT's first parameter.]) +]) + +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AC_ENABLE_FAST_INSTALL], []) +dnl AC_DEFUN([AM_DISABLE_FAST_INSTALL], []) + + +# _LT_WITH_PIC([MODE]) +# -------------------- +# implement the --with-pic flag, and support the `pic-only' and `no-pic' +# LT_INIT options. +# MODE is either `yes' or `no'. If omitted, it defaults to `both'. +m4_define([_LT_WITH_PIC], +[AC_ARG_WITH([pic], + [AS_HELP_STRING([--with-pic@<:@=PKGS@:>@], + [try to use only PIC/non-PIC objects @<:@default=use both@:>@])], + [lt_p=${PACKAGE-default} + case $withval in + yes|no) pic_mode=$withval ;; + *) + pic_mode=default + # Look at the argument we got. We use all the common list separators. + lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," + for lt_pkg in $withval; do + IFS="$lt_save_ifs" + if test "X$lt_pkg" = "X$lt_p"; then + pic_mode=yes + fi + done + IFS="$lt_save_ifs" + ;; + esac], + [pic_mode=default]) + +test -z "$pic_mode" && pic_mode=m4_default([$1], [default]) + +_LT_DECL([], [pic_mode], [0], [What type of objects to build])dnl +])# _LT_WITH_PIC + +LT_OPTION_DEFINE([LT_INIT], [pic-only], [_LT_WITH_PIC([yes])]) +LT_OPTION_DEFINE([LT_INIT], [no-pic], [_LT_WITH_PIC([no])]) + +# Old name: +AU_DEFUN([AC_LIBTOOL_PICMODE], +[_LT_SET_OPTION([LT_INIT], [pic-only]) +AC_DIAGNOSE([obsolete], +[$0: Remove this warning and the call to _LT_SET_OPTION when you +put the `pic-only' option into LT_INIT's first parameter.]) +]) + +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AC_LIBTOOL_PICMODE], []) + + +m4_define([_LTDL_MODE], []) +LT_OPTION_DEFINE([LTDL_INIT], [nonrecursive], + [m4_define([_LTDL_MODE], [nonrecursive])]) +LT_OPTION_DEFINE([LTDL_INIT], [recursive], + [m4_define([_LTDL_MODE], [recursive])]) +LT_OPTION_DEFINE([LTDL_INIT], [subproject], + [m4_define([_LTDL_MODE], [subproject])]) + +m4_define([_LTDL_TYPE], []) +LT_OPTION_DEFINE([LTDL_INIT], [installable], + [m4_define([_LTDL_TYPE], [installable])]) +LT_OPTION_DEFINE([LTDL_INIT], [convenience], + [m4_define([_LTDL_TYPE], [convenience])]) + +# ltsugar.m4 -- libtool m4 base layer. -*-Autoconf-*- +# +# Copyright (C) 2004, 2005, 2007, 2008 Free Software Foundation, Inc. +# Written by Gary V. Vaughan, 2004 +# +# This file is free software; the Free Software Foundation gives +# unlimited permission to copy and/or distribute it, with or without +# modifications, as long as this notice is preserved. + +# serial 6 ltsugar.m4 + +# This is to help aclocal find these macros, as it can't see m4_define. +AC_DEFUN([LTSUGAR_VERSION], [m4_if([0.1])]) + + +# lt_join(SEP, ARG1, [ARG2...]) +# ----------------------------- +# Produce ARG1SEPARG2...SEPARGn, omitting [] arguments and their +# associated separator. +# Needed until we can rely on m4_join from Autoconf 2.62, since all earlier +# versions in m4sugar had bugs. +m4_define([lt_join], +[m4_if([$#], [1], [], + [$#], [2], [[$2]], + [m4_if([$2], [], [], [[$2]_])$0([$1], m4_shift(m4_shift($@)))])]) +m4_define([_lt_join], +[m4_if([$#$2], [2], [], + [m4_if([$2], [], [], [[$1$2]])$0([$1], m4_shift(m4_shift($@)))])]) + + +# lt_car(LIST) +# lt_cdr(LIST) +# ------------ +# Manipulate m4 lists. +# These macros are necessary as long as will still need to support +# Autoconf-2.59 which quotes differently. +m4_define([lt_car], [[$1]]) +m4_define([lt_cdr], +[m4_if([$#], 0, [m4_fatal([$0: cannot be called without arguments])], + [$#], 1, [], + [m4_dquote(m4_shift($@))])]) +m4_define([lt_unquote], $1) + + +# lt_append(MACRO-NAME, STRING, [SEPARATOR]) +# ------------------------------------------ +# Redefine MACRO-NAME to hold its former content plus `SEPARATOR'`STRING'. +# Note that neither SEPARATOR nor STRING are expanded; they are appended +# to MACRO-NAME as is (leaving the expansion for when MACRO-NAME is invoked). +# No SEPARATOR is output if MACRO-NAME was previously undefined (different +# than defined and empty). +# +# This macro is needed until we can rely on Autoconf 2.62, since earlier +# versions of m4sugar mistakenly expanded SEPARATOR but not STRING. +m4_define([lt_append], +[m4_define([$1], + m4_ifdef([$1], [m4_defn([$1])[$3]])[$2])]) + + + +# lt_combine(SEP, PREFIX-LIST, INFIX, SUFFIX1, [SUFFIX2...]) +# ---------------------------------------------------------- +# Produce a SEP delimited list of all paired combinations of elements of +# PREFIX-LIST with SUFFIX1 through SUFFIXn. Each element of the list +# has the form PREFIXmINFIXSUFFIXn. +# Needed until we can rely on m4_combine added in Autoconf 2.62. +m4_define([lt_combine], +[m4_if(m4_eval([$# > 3]), [1], + [m4_pushdef([_Lt_sep], [m4_define([_Lt_sep], m4_defn([lt_car]))])]]dnl +[[m4_foreach([_Lt_prefix], [$2], + [m4_foreach([_Lt_suffix], + ]m4_dquote(m4_dquote(m4_shift(m4_shift(m4_shift($@)))))[, + [_Lt_sep([$1])[]m4_defn([_Lt_prefix])[$3]m4_defn([_Lt_suffix])])])])]) + + +# lt_if_append_uniq(MACRO-NAME, VARNAME, [SEPARATOR], [UNIQ], [NOT-UNIQ]) +# ----------------------------------------------------------------------- +# Iff MACRO-NAME does not yet contain VARNAME, then append it (delimited +# by SEPARATOR if supplied) and expand UNIQ, else NOT-UNIQ. +m4_define([lt_if_append_uniq], +[m4_ifdef([$1], + [m4_if(m4_index([$3]m4_defn([$1])[$3], [$3$2$3]), [-1], + [lt_append([$1], [$2], [$3])$4], + [$5])], + [lt_append([$1], [$2], [$3])$4])]) + + +# lt_dict_add(DICT, KEY, VALUE) +# ----------------------------- +m4_define([lt_dict_add], +[m4_define([$1($2)], [$3])]) + + +# lt_dict_add_subkey(DICT, KEY, SUBKEY, VALUE) +# -------------------------------------------- +m4_define([lt_dict_add_subkey], +[m4_define([$1($2:$3)], [$4])]) + + +# lt_dict_fetch(DICT, KEY, [SUBKEY]) +# ---------------------------------- +m4_define([lt_dict_fetch], +[m4_ifval([$3], + m4_ifdef([$1($2:$3)], [m4_defn([$1($2:$3)])]), + m4_ifdef([$1($2)], [m4_defn([$1($2)])]))]) + + +# lt_if_dict_fetch(DICT, KEY, [SUBKEY], VALUE, IF-TRUE, [IF-FALSE]) +# ----------------------------------------------------------------- +m4_define([lt_if_dict_fetch], +[m4_if(lt_dict_fetch([$1], [$2], [$3]), [$4], + [$5], + [$6])]) + + +# lt_dict_filter(DICT, [SUBKEY], VALUE, [SEPARATOR], KEY, [...]) +# -------------------------------------------------------------- +m4_define([lt_dict_filter], +[m4_if([$5], [], [], + [lt_join(m4_quote(m4_default([$4], [[, ]])), + lt_unquote(m4_split(m4_normalize(m4_foreach(_Lt_key, lt_car([m4_shiftn(4, $@)]), + [lt_if_dict_fetch([$1], _Lt_key, [$2], [$3], [_Lt_key ])])))))])[]dnl +]) + +# ltversion.m4 -- version numbers -*- Autoconf -*- +# +# Copyright (C) 2004 Free Software Foundation, Inc. +# Written by Scott James Remnant, 2004 +# +# This file is free software; the Free Software Foundation gives +# unlimited permission to copy and/or distribute it, with or without +# modifications, as long as this notice is preserved. + +# @configure_input@ + +# serial 3337 ltversion.m4 +# This file is part of GNU Libtool + +m4_define([LT_PACKAGE_VERSION], [2.4.2]) +m4_define([LT_PACKAGE_REVISION], [1.3337]) + +AC_DEFUN([LTVERSION_VERSION], +[macro_version='2.4.2' +macro_revision='1.3337' +_LT_DECL(, macro_version, 0, [Which release of libtool.m4 was used?]) +_LT_DECL(, macro_revision, 0) +]) + +# lt~obsolete.m4 -- aclocal satisfying obsolete definitions. -*-Autoconf-*- +# +# Copyright (C) 2004, 2005, 2007, 2009 Free Software Foundation, Inc. +# Written by Scott James Remnant, 2004. +# +# This file is free software; the Free Software Foundation gives +# unlimited permission to copy and/or distribute it, with or without +# modifications, as long as this notice is preserved. + +# serial 5 lt~obsolete.m4 + +# These exist entirely to fool aclocal when bootstrapping libtool. +# +# In the past libtool.m4 has provided macros via AC_DEFUN (or AU_DEFUN) +# which have later been changed to m4_define as they aren't part of the +# exported API, or moved to Autoconf or Automake where they belong. +# +# The trouble is, aclocal is a bit thick. It'll see the old AC_DEFUN +# in /usr/share/aclocal/libtool.m4 and remember it, then when it sees us +# using a macro with the same name in our local m4/libtool.m4 it'll +# pull the old libtool.m4 in (it doesn't see our shiny new m4_define +# and doesn't know about Autoconf macros at all.) +# +# So we provide this file, which has a silly filename so it's always +# included after everything else. This provides aclocal with the +# AC_DEFUNs it wants, but when m4 processes it, it doesn't do anything +# because those macros already exist, or will be overwritten later. +# We use AC_DEFUN over AU_DEFUN for compatibility with aclocal-1.6. +# +# Anytime we withdraw an AC_DEFUN or AU_DEFUN, remember to add it here. +# Yes, that means every name once taken will need to remain here until +# we give up compatibility with versions before 1.7, at which point +# we need to keep only those names which we still refer to. + +# This is to help aclocal find these macros, as it can't see m4_define. +AC_DEFUN([LTOBSOLETE_VERSION], [m4_if([1])]) + +m4_ifndef([AC_LIBTOOL_LINKER_OPTION], [AC_DEFUN([AC_LIBTOOL_LINKER_OPTION])]) +m4_ifndef([AC_PROG_EGREP], [AC_DEFUN([AC_PROG_EGREP])]) +m4_ifndef([_LT_AC_PROG_ECHO_BACKSLASH], [AC_DEFUN([_LT_AC_PROG_ECHO_BACKSLASH])]) +m4_ifndef([_LT_AC_SHELL_INIT], [AC_DEFUN([_LT_AC_SHELL_INIT])]) +m4_ifndef([_LT_AC_SYS_LIBPATH_AIX], [AC_DEFUN([_LT_AC_SYS_LIBPATH_AIX])]) +m4_ifndef([_LT_PROG_LTMAIN], [AC_DEFUN([_LT_PROG_LTMAIN])]) +m4_ifndef([_LT_AC_TAGVAR], [AC_DEFUN([_LT_AC_TAGVAR])]) +m4_ifndef([AC_LTDL_ENABLE_INSTALL], [AC_DEFUN([AC_LTDL_ENABLE_INSTALL])]) +m4_ifndef([AC_LTDL_PREOPEN], [AC_DEFUN([AC_LTDL_PREOPEN])]) +m4_ifndef([_LT_AC_SYS_COMPILER], [AC_DEFUN([_LT_AC_SYS_COMPILER])]) +m4_ifndef([_LT_AC_LOCK], [AC_DEFUN([_LT_AC_LOCK])]) +m4_ifndef([AC_LIBTOOL_SYS_OLD_ARCHIVE], [AC_DEFUN([AC_LIBTOOL_SYS_OLD_ARCHIVE])]) +m4_ifndef([_LT_AC_TRY_DLOPEN_SELF], [AC_DEFUN([_LT_AC_TRY_DLOPEN_SELF])]) +m4_ifndef([AC_LIBTOOL_PROG_CC_C_O], [AC_DEFUN([AC_LIBTOOL_PROG_CC_C_O])]) +m4_ifndef([AC_LIBTOOL_SYS_HARD_LINK_LOCKS], [AC_DEFUN([AC_LIBTOOL_SYS_HARD_LINK_LOCKS])]) +m4_ifndef([AC_LIBTOOL_OBJDIR], [AC_DEFUN([AC_LIBTOOL_OBJDIR])]) +m4_ifndef([AC_LTDL_OBJDIR], [AC_DEFUN([AC_LTDL_OBJDIR])]) +m4_ifndef([AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH], [AC_DEFUN([AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH])]) +m4_ifndef([AC_LIBTOOL_SYS_LIB_STRIP], [AC_DEFUN([AC_LIBTOOL_SYS_LIB_STRIP])]) +m4_ifndef([AC_PATH_MAGIC], [AC_DEFUN([AC_PATH_MAGIC])]) +m4_ifndef([AC_PROG_LD_GNU], [AC_DEFUN([AC_PROG_LD_GNU])]) +m4_ifndef([AC_PROG_LD_RELOAD_FLAG], [AC_DEFUN([AC_PROG_LD_RELOAD_FLAG])]) +m4_ifndef([AC_DEPLIBS_CHECK_METHOD], [AC_DEFUN([AC_DEPLIBS_CHECK_METHOD])]) +m4_ifndef([AC_LIBTOOL_PROG_COMPILER_NO_RTTI], [AC_DEFUN([AC_LIBTOOL_PROG_COMPILER_NO_RTTI])]) +m4_ifndef([AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE], [AC_DEFUN([AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE])]) +m4_ifndef([AC_LIBTOOL_PROG_COMPILER_PIC], [AC_DEFUN([AC_LIBTOOL_PROG_COMPILER_PIC])]) +m4_ifndef([AC_LIBTOOL_PROG_LD_SHLIBS], [AC_DEFUN([AC_LIBTOOL_PROG_LD_SHLIBS])]) +m4_ifndef([AC_LIBTOOL_POSTDEP_PREDEP], [AC_DEFUN([AC_LIBTOOL_POSTDEP_PREDEP])]) +m4_ifndef([LT_AC_PROG_EGREP], [AC_DEFUN([LT_AC_PROG_EGREP])]) +m4_ifndef([LT_AC_PROG_SED], [AC_DEFUN([LT_AC_PROG_SED])]) +m4_ifndef([_LT_CC_BASENAME], [AC_DEFUN([_LT_CC_BASENAME])]) +m4_ifndef([_LT_COMPILER_BOILERPLATE], [AC_DEFUN([_LT_COMPILER_BOILERPLATE])]) +m4_ifndef([_LT_LINKER_BOILERPLATE], [AC_DEFUN([_LT_LINKER_BOILERPLATE])]) +m4_ifndef([_AC_PROG_LIBTOOL], [AC_DEFUN([_AC_PROG_LIBTOOL])]) +m4_ifndef([AC_LIBTOOL_SETUP], [AC_DEFUN([AC_LIBTOOL_SETUP])]) +m4_ifndef([_LT_AC_CHECK_DLFCN], [AC_DEFUN([_LT_AC_CHECK_DLFCN])]) +m4_ifndef([AC_LIBTOOL_SYS_DYNAMIC_LINKER], [AC_DEFUN([AC_LIBTOOL_SYS_DYNAMIC_LINKER])]) +m4_ifndef([_LT_AC_TAGCONFIG], [AC_DEFUN([_LT_AC_TAGCONFIG])]) +m4_ifndef([AC_DISABLE_FAST_INSTALL], [AC_DEFUN([AC_DISABLE_FAST_INSTALL])]) +m4_ifndef([_LT_AC_LANG_CXX], [AC_DEFUN([_LT_AC_LANG_CXX])]) +m4_ifndef([_LT_AC_LANG_F77], [AC_DEFUN([_LT_AC_LANG_F77])]) +m4_ifndef([_LT_AC_LANG_GCJ], [AC_DEFUN([_LT_AC_LANG_GCJ])]) +m4_ifndef([AC_LIBTOOL_LANG_C_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_C_CONFIG])]) +m4_ifndef([_LT_AC_LANG_C_CONFIG], [AC_DEFUN([_LT_AC_LANG_C_CONFIG])]) +m4_ifndef([AC_LIBTOOL_LANG_CXX_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_CXX_CONFIG])]) +m4_ifndef([_LT_AC_LANG_CXX_CONFIG], [AC_DEFUN([_LT_AC_LANG_CXX_CONFIG])]) +m4_ifndef([AC_LIBTOOL_LANG_F77_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_F77_CONFIG])]) +m4_ifndef([_LT_AC_LANG_F77_CONFIG], [AC_DEFUN([_LT_AC_LANG_F77_CONFIG])]) +m4_ifndef([AC_LIBTOOL_LANG_GCJ_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_GCJ_CONFIG])]) +m4_ifndef([_LT_AC_LANG_GCJ_CONFIG], [AC_DEFUN([_LT_AC_LANG_GCJ_CONFIG])]) +m4_ifndef([AC_LIBTOOL_LANG_RC_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_RC_CONFIG])]) +m4_ifndef([_LT_AC_LANG_RC_CONFIG], [AC_DEFUN([_LT_AC_LANG_RC_CONFIG])]) +m4_ifndef([AC_LIBTOOL_CONFIG], [AC_DEFUN([AC_LIBTOOL_CONFIG])]) +m4_ifndef([_LT_AC_FILE_LTDLL_C], [AC_DEFUN([_LT_AC_FILE_LTDLL_C])]) +m4_ifndef([_LT_REQUIRED_DARWIN_CHECKS], [AC_DEFUN([_LT_REQUIRED_DARWIN_CHECKS])]) +m4_ifndef([_LT_AC_PROG_CXXCPP], [AC_DEFUN([_LT_AC_PROG_CXXCPP])]) +m4_ifndef([_LT_PREPARE_SED_QUOTE_VARS], [AC_DEFUN([_LT_PREPARE_SED_QUOTE_VARS])]) +m4_ifndef([_LT_PROG_ECHO_BACKSLASH], [AC_DEFUN([_LT_PROG_ECHO_BACKSLASH])]) +m4_ifndef([_LT_PROG_F77], [AC_DEFUN([_LT_PROG_F77])]) +m4_ifndef([_LT_PROG_FC], [AC_DEFUN([_LT_PROG_FC])]) +m4_ifndef([_LT_PROG_CXX], [AC_DEFUN([_LT_PROG_CXX])]) + +# Copyright (C) 2002, 2003, 2005, 2006, 2007, 2008, 2011 Free Software +# Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# serial 1 + +# AM_AUTOMAKE_VERSION(VERSION) +# ---------------------------- +# Automake X.Y traces this macro to ensure aclocal.m4 has been +# generated from the m4 files accompanying Automake X.Y. +# (This private macro should not be called outside this file.) +AC_DEFUN([AM_AUTOMAKE_VERSION], +[am__api_version='1.11' +dnl Some users find AM_AUTOMAKE_VERSION and mistake it for a way to +dnl require some minimum version. Point them to the right macro. +m4_if([$1], [1.11.6], [], + [AC_FATAL([Do not call $0, use AM_INIT_AUTOMAKE([$1]).])])dnl +]) + +# _AM_AUTOCONF_VERSION(VERSION) +# ----------------------------- +# aclocal traces this macro to find the Autoconf version. +# This is a private macro too. Using m4_define simplifies +# the logic in aclocal, which can simply ignore this definition. +m4_define([_AM_AUTOCONF_VERSION], []) + +# AM_SET_CURRENT_AUTOMAKE_VERSION +# ------------------------------- +# Call AM_AUTOMAKE_VERSION and AM_AUTOMAKE_VERSION so they can be traced. +# This function is AC_REQUIREd by AM_INIT_AUTOMAKE. +AC_DEFUN([AM_SET_CURRENT_AUTOMAKE_VERSION], +[AM_AUTOMAKE_VERSION([1.11.6])dnl +m4_ifndef([AC_AUTOCONF_VERSION], + [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl +_AM_AUTOCONF_VERSION(m4_defn([AC_AUTOCONF_VERSION]))]) + +# AM_AUX_DIR_EXPAND -*- Autoconf -*- + +# Copyright (C) 2001, 2003, 2005, 2011 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# serial 1 + +# For projects using AC_CONFIG_AUX_DIR([foo]), Autoconf sets +# $ac_aux_dir to `$srcdir/foo'. In other projects, it is set to +# `$srcdir', `$srcdir/..', or `$srcdir/../..'. +# +# Of course, Automake must honor this variable whenever it calls a +# tool from the auxiliary directory. The problem is that $srcdir (and +# therefore $ac_aux_dir as well) can be either absolute or relative, +# depending on how configure is run. This is pretty annoying, since +# it makes $ac_aux_dir quite unusable in subdirectories: in the top +# source directory, any form will work fine, but in subdirectories a +# relative path needs to be adjusted first. +# +# $ac_aux_dir/missing +# fails when called from a subdirectory if $ac_aux_dir is relative +# $top_srcdir/$ac_aux_dir/missing +# fails if $ac_aux_dir is absolute, +# fails when called from a subdirectory in a VPATH build with +# a relative $ac_aux_dir +# +# The reason of the latter failure is that $top_srcdir and $ac_aux_dir +# are both prefixed by $srcdir. In an in-source build this is usually +# harmless because $srcdir is `.', but things will broke when you +# start a VPATH build or use an absolute $srcdir. +# +# So we could use something similar to $top_srcdir/$ac_aux_dir/missing, +# iff we strip the leading $srcdir from $ac_aux_dir. That would be: +# am_aux_dir='\$(top_srcdir)/'`expr "$ac_aux_dir" : "$srcdir//*\(.*\)"` +# and then we would define $MISSING as +# MISSING="\${SHELL} $am_aux_dir/missing" +# This will work as long as MISSING is not called from configure, because +# unfortunately $(top_srcdir) has no meaning in configure. +# However there are other variables, like CC, which are often used in +# configure, and could therefore not use this "fixed" $ac_aux_dir. +# +# Another solution, used here, is to always expand $ac_aux_dir to an +# absolute PATH. The drawback is that using absolute paths prevent a +# configured tree to be moved without reconfiguration. + +AC_DEFUN([AM_AUX_DIR_EXPAND], +[dnl Rely on autoconf to set up CDPATH properly. +AC_PREREQ([2.50])dnl +# expand $ac_aux_dir to an absolute path +am_aux_dir=`cd $ac_aux_dir && pwd` +]) + +# AM_CONDITIONAL -*- Autoconf -*- + +# Copyright (C) 1997, 2000, 2001, 2003, 2004, 2005, 2006, 2008 +# Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# serial 9 + +# AM_CONDITIONAL(NAME, SHELL-CONDITION) +# ------------------------------------- +# Define a conditional. +AC_DEFUN([AM_CONDITIONAL], +[AC_PREREQ(2.52)dnl + ifelse([$1], [TRUE], [AC_FATAL([$0: invalid condition: $1])], + [$1], [FALSE], [AC_FATAL([$0: invalid condition: $1])])dnl +AC_SUBST([$1_TRUE])dnl +AC_SUBST([$1_FALSE])dnl +_AM_SUBST_NOTMAKE([$1_TRUE])dnl +_AM_SUBST_NOTMAKE([$1_FALSE])dnl +m4_define([_AM_COND_VALUE_$1], [$2])dnl +if $2; then + $1_TRUE= + $1_FALSE='#' +else + $1_TRUE='#' + $1_FALSE= +fi +AC_CONFIG_COMMANDS_PRE( +[if test -z "${$1_TRUE}" && test -z "${$1_FALSE}"; then + AC_MSG_ERROR([[conditional "$1" was never defined. +Usually this means the macro was only invoked conditionally.]]) +fi])]) + +# Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2009, +# 2010, 2011 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# serial 12 + +# There are a few dirty hacks below to avoid letting `AC_PROG_CC' be +# written in clear, in which case automake, when reading aclocal.m4, +# will think it sees a *use*, and therefore will trigger all it's +# C support machinery. Also note that it means that autoscan, seeing +# CC etc. in the Makefile, will ask for an AC_PROG_CC use... + + +# _AM_DEPENDENCIES(NAME) +# ---------------------- +# See how the compiler implements dependency checking. +# NAME is "CC", "CXX", "GCJ", or "OBJC". +# We try a few techniques and use that to set a single cache variable. +# +# We don't AC_REQUIRE the corresponding AC_PROG_CC since the latter was +# modified to invoke _AM_DEPENDENCIES(CC); we would have a circular +# dependency, and given that the user is not expected to run this macro, +# just rely on AC_PROG_CC. +AC_DEFUN([_AM_DEPENDENCIES], +[AC_REQUIRE([AM_SET_DEPDIR])dnl +AC_REQUIRE([AM_OUTPUT_DEPENDENCY_COMMANDS])dnl +AC_REQUIRE([AM_MAKE_INCLUDE])dnl +AC_REQUIRE([AM_DEP_TRACK])dnl + +ifelse([$1], CC, [depcc="$CC" am_compiler_list=], + [$1], CXX, [depcc="$CXX" am_compiler_list=], + [$1], OBJC, [depcc="$OBJC" am_compiler_list='gcc3 gcc'], + [$1], UPC, [depcc="$UPC" am_compiler_list=], + [$1], GCJ, [depcc="$GCJ" am_compiler_list='gcc3 gcc'], + [depcc="$$1" am_compiler_list=]) + +AC_CACHE_CHECK([dependency style of $depcc], + [am_cv_$1_dependencies_compiler_type], +[if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then + # We make a subdir and do the tests there. Otherwise we can end up + # making bogus files that we don't know about and never remove. For + # instance it was reported that on HP-UX the gcc test will end up + # making a dummy file named `D' -- because `-MD' means `put the output + # in D'. + rm -rf conftest.dir + mkdir conftest.dir + # Copy depcomp to subdir because otherwise we won't find it if we're + # using a relative directory. + cp "$am_depcomp" conftest.dir + cd conftest.dir + # We will build objects and dependencies in a subdirectory because + # it helps to detect inapplicable dependency modes. For instance + # both Tru64's cc and ICC support -MD to output dependencies as a + # side effect of compilation, but ICC will put the dependencies in + # the current directory while Tru64 will put them in the object + # directory. + mkdir sub + + am_cv_$1_dependencies_compiler_type=none + if test "$am_compiler_list" = ""; then + am_compiler_list=`sed -n ['s/^#*\([a-zA-Z0-9]*\))$/\1/p'] < ./depcomp` + fi + am__universal=false + m4_case([$1], [CC], + [case " $depcc " in #( + *\ -arch\ *\ -arch\ *) am__universal=true ;; + esac], + [CXX], + [case " $depcc " in #( + *\ -arch\ *\ -arch\ *) am__universal=true ;; + esac]) + + for depmode in $am_compiler_list; do + # Setup a source with many dependencies, because some compilers + # like to wrap large dependency lists on column 80 (with \), and + # we should not choose a depcomp mode which is confused by this. + # + # We need to recreate these files for each test, as the compiler may + # overwrite some of them when testing with obscure command lines. + # This happens at least with the AIX C compiler. + : > sub/conftest.c + for i in 1 2 3 4 5 6; do + echo '#include "conftst'$i'.h"' >> sub/conftest.c + # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with + # Solaris 8's {/usr,}/bin/sh. + touch sub/conftst$i.h + done + echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf + + # We check with `-c' and `-o' for the sake of the "dashmstdout" + # mode. It turns out that the SunPro C++ compiler does not properly + # handle `-M -o', and we need to detect this. Also, some Intel + # versions had trouble with output in subdirs + am__obj=sub/conftest.${OBJEXT-o} + am__minus_obj="-o $am__obj" + case $depmode in + gcc) + # This depmode causes a compiler race in universal mode. + test "$am__universal" = false || continue + ;; + nosideeffect) + # after this tag, mechanisms are not by side-effect, so they'll + # only be used when explicitly requested + if test "x$enable_dependency_tracking" = xyes; then + continue + else + break + fi + ;; + msvc7 | msvc7msys | msvisualcpp | msvcmsys) + # This compiler won't grok `-c -o', but also, the minuso test has + # not run yet. These depmodes are late enough in the game, and + # so weak that their functioning should not be impacted. + am__obj=conftest.${OBJEXT-o} + am__minus_obj= + ;; + none) break ;; + esac + if depmode=$depmode \ + source=sub/conftest.c object=$am__obj \ + depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ + $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ + >/dev/null 2>conftest.err && + grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && + grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && + grep $am__obj sub/conftest.Po > /dev/null 2>&1 && + ${MAKE-make} -s -f confmf > /dev/null 2>&1; then + # icc doesn't choke on unknown options, it will just issue warnings + # or remarks (even with -Werror). So we grep stderr for any message + # that says an option was ignored or not supported. + # When given -MP, icc 7.0 and 7.1 complain thusly: + # icc: Command line warning: ignoring option '-M'; no argument required + # The diagnosis changed in icc 8.0: + # icc: Command line remark: option '-MP' not supported + if (grep 'ignoring option' conftest.err || + grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else + am_cv_$1_dependencies_compiler_type=$depmode + break + fi + fi + done + + cd .. + rm -rf conftest.dir +else + am_cv_$1_dependencies_compiler_type=none +fi +]) +AC_SUBST([$1DEPMODE], [depmode=$am_cv_$1_dependencies_compiler_type]) +AM_CONDITIONAL([am__fastdep$1], [ + test "x$enable_dependency_tracking" != xno \ + && test "$am_cv_$1_dependencies_compiler_type" = gcc3]) +]) + + +# AM_SET_DEPDIR +# ------------- +# Choose a directory name for dependency files. +# This macro is AC_REQUIREd in _AM_DEPENDENCIES +AC_DEFUN([AM_SET_DEPDIR], +[AC_REQUIRE([AM_SET_LEADING_DOT])dnl +AC_SUBST([DEPDIR], ["${am__leading_dot}deps"])dnl +]) + + +# AM_DEP_TRACK +# ------------ +AC_DEFUN([AM_DEP_TRACK], +[AC_ARG_ENABLE(dependency-tracking, +[ --disable-dependency-tracking speeds up one-time build + --enable-dependency-tracking do not reject slow dependency extractors]) +if test "x$enable_dependency_tracking" != xno; then + am_depcomp="$ac_aux_dir/depcomp" + AMDEPBACKSLASH='\' + am__nodep='_no' +fi +AM_CONDITIONAL([AMDEP], [test "x$enable_dependency_tracking" != xno]) +AC_SUBST([AMDEPBACKSLASH])dnl +_AM_SUBST_NOTMAKE([AMDEPBACKSLASH])dnl +AC_SUBST([am__nodep])dnl +_AM_SUBST_NOTMAKE([am__nodep])dnl +]) + +# Generate code to set up dependency tracking. -*- Autoconf -*- + +# Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2008 +# Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +#serial 5 + +# _AM_OUTPUT_DEPENDENCY_COMMANDS +# ------------------------------ +AC_DEFUN([_AM_OUTPUT_DEPENDENCY_COMMANDS], +[{ + # Autoconf 2.62 quotes --file arguments for eval, but not when files + # are listed without --file. Let's play safe and only enable the eval + # if we detect the quoting. + case $CONFIG_FILES in + *\'*) eval set x "$CONFIG_FILES" ;; + *) set x $CONFIG_FILES ;; + esac + shift + for mf + do + # Strip MF so we end up with the name of the file. + mf=`echo "$mf" | sed -e 's/:.*$//'` + # Check whether this is an Automake generated Makefile or not. + # We used to match only the files named `Makefile.in', but + # some people rename them; so instead we look at the file content. + # Grep'ing the first line is not enough: some people post-process + # each Makefile.in and add a new line on top of each file to say so. + # Grep'ing the whole file is not good either: AIX grep has a line + # limit of 2048, but all sed's we know have understand at least 4000. + if sed -n 's,^#.*generated by automake.*,X,p' "$mf" | grep X >/dev/null 2>&1; then + dirpart=`AS_DIRNAME("$mf")` + else + continue + fi + # Extract the definition of DEPDIR, am__include, and am__quote + # from the Makefile without running `make'. + DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"` + test -z "$DEPDIR" && continue + am__include=`sed -n 's/^am__include = //p' < "$mf"` + test -z "am__include" && continue + am__quote=`sed -n 's/^am__quote = //p' < "$mf"` + # When using ansi2knr, U may be empty or an underscore; expand it + U=`sed -n 's/^U = //p' < "$mf"` + # Find all dependency output files, they are included files with + # $(DEPDIR) in their names. We invoke sed twice because it is the + # simplest approach to changing $(DEPDIR) to its actual value in the + # expansion. + for file in `sed -n " + s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \ + sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g' -e 's/\$U/'"$U"'/g'`; do + # Make sure the directory exists. + test -f "$dirpart/$file" && continue + fdir=`AS_DIRNAME(["$file"])` + AS_MKDIR_P([$dirpart/$fdir]) + # echo "creating $dirpart/$file" + echo '# dummy' > "$dirpart/$file" + done + done +} +])# _AM_OUTPUT_DEPENDENCY_COMMANDS + + +# AM_OUTPUT_DEPENDENCY_COMMANDS +# ----------------------------- +# This macro should only be invoked once -- use via AC_REQUIRE. +# +# This code is only required when automatic dependency tracking +# is enabled. FIXME. This creates each `.P' file that we will +# need in order to bootstrap the dependency handling code. +AC_DEFUN([AM_OUTPUT_DEPENDENCY_COMMANDS], +[AC_CONFIG_COMMANDS([depfiles], + [test x"$AMDEP_TRUE" != x"" || _AM_OUTPUT_DEPENDENCY_COMMANDS], + [AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir"]) +]) + +# Do all the work for Automake. -*- Autoconf -*- + +# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, +# 2005, 2006, 2008, 2009 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# serial 16 + +# This macro actually does too much. Some checks are only needed if +# your package does certain things. But this isn't really a big deal. + +# AM_INIT_AUTOMAKE(PACKAGE, VERSION, [NO-DEFINE]) +# AM_INIT_AUTOMAKE([OPTIONS]) +# ----------------------------------------------- +# The call with PACKAGE and VERSION arguments is the old style +# call (pre autoconf-2.50), which is being phased out. PACKAGE +# and VERSION should now be passed to AC_INIT and removed from +# the call to AM_INIT_AUTOMAKE. +# We support both call styles for the transition. After +# the next Automake release, Autoconf can make the AC_INIT +# arguments mandatory, and then we can depend on a new Autoconf +# release and drop the old call support. +AC_DEFUN([AM_INIT_AUTOMAKE], +[AC_PREREQ([2.62])dnl +dnl Autoconf wants to disallow AM_ names. We explicitly allow +dnl the ones we care about. +m4_pattern_allow([^AM_[A-Z]+FLAGS$])dnl +AC_REQUIRE([AM_SET_CURRENT_AUTOMAKE_VERSION])dnl +AC_REQUIRE([AC_PROG_INSTALL])dnl +if test "`cd $srcdir && pwd`" != "`pwd`"; then + # Use -I$(srcdir) only when $(srcdir) != ., so that make's output + # is not polluted with repeated "-I." + AC_SUBST([am__isrc], [' -I$(srcdir)'])_AM_SUBST_NOTMAKE([am__isrc])dnl + # test to see if srcdir already configured + if test -f $srcdir/config.status; then + AC_MSG_ERROR([source directory already configured; run "make distclean" there first]) + fi +fi + +# test whether we have cygpath +if test -z "$CYGPATH_W"; then + if (cygpath --version) >/dev/null 2>/dev/null; then + CYGPATH_W='cygpath -w' + else + CYGPATH_W=echo + fi +fi +AC_SUBST([CYGPATH_W]) + +# Define the identity of the package. +dnl Distinguish between old-style and new-style calls. +m4_ifval([$2], +[m4_ifval([$3], [_AM_SET_OPTION([no-define])])dnl + AC_SUBST([PACKAGE], [$1])dnl + AC_SUBST([VERSION], [$2])], +[_AM_SET_OPTIONS([$1])dnl +dnl Diagnose old-style AC_INIT with new-style AM_AUTOMAKE_INIT. +m4_if(m4_ifdef([AC_PACKAGE_NAME], 1)m4_ifdef([AC_PACKAGE_VERSION], 1), 11,, + [m4_fatal([AC_INIT should be called with package and version arguments])])dnl + AC_SUBST([PACKAGE], ['AC_PACKAGE_TARNAME'])dnl + AC_SUBST([VERSION], ['AC_PACKAGE_VERSION'])])dnl + +_AM_IF_OPTION([no-define],, +[AC_DEFINE_UNQUOTED(PACKAGE, "$PACKAGE", [Name of package]) + AC_DEFINE_UNQUOTED(VERSION, "$VERSION", [Version number of package])])dnl + +# Some tools Automake needs. +AC_REQUIRE([AM_SANITY_CHECK])dnl +AC_REQUIRE([AC_ARG_PROGRAM])dnl +AM_MISSING_PROG(ACLOCAL, aclocal-${am__api_version}) +AM_MISSING_PROG(AUTOCONF, autoconf) +AM_MISSING_PROG(AUTOMAKE, automake-${am__api_version}) +AM_MISSING_PROG(AUTOHEADER, autoheader) +AM_MISSING_PROG(MAKEINFO, makeinfo) +AC_REQUIRE([AM_PROG_INSTALL_SH])dnl +AC_REQUIRE([AM_PROG_INSTALL_STRIP])dnl +AC_REQUIRE([AM_PROG_MKDIR_P])dnl +# We need awk for the "check" target. The system "awk" is bad on +# some platforms. +AC_REQUIRE([AC_PROG_AWK])dnl +AC_REQUIRE([AC_PROG_MAKE_SET])dnl +AC_REQUIRE([AM_SET_LEADING_DOT])dnl +_AM_IF_OPTION([tar-ustar], [_AM_PROG_TAR([ustar])], + [_AM_IF_OPTION([tar-pax], [_AM_PROG_TAR([pax])], + [_AM_PROG_TAR([v7])])]) +_AM_IF_OPTION([no-dependencies],, +[AC_PROVIDE_IFELSE([AC_PROG_CC], + [_AM_DEPENDENCIES(CC)], + [define([AC_PROG_CC], + defn([AC_PROG_CC])[_AM_DEPENDENCIES(CC)])])dnl +AC_PROVIDE_IFELSE([AC_PROG_CXX], + [_AM_DEPENDENCIES(CXX)], + [define([AC_PROG_CXX], + defn([AC_PROG_CXX])[_AM_DEPENDENCIES(CXX)])])dnl +AC_PROVIDE_IFELSE([AC_PROG_OBJC], + [_AM_DEPENDENCIES(OBJC)], + [define([AC_PROG_OBJC], + defn([AC_PROG_OBJC])[_AM_DEPENDENCIES(OBJC)])])dnl +]) +_AM_IF_OPTION([silent-rules], [AC_REQUIRE([AM_SILENT_RULES])])dnl +dnl The `parallel-tests' driver may need to know about EXEEXT, so add the +dnl `am__EXEEXT' conditional if _AM_COMPILER_EXEEXT was seen. This macro +dnl is hooked onto _AC_COMPILER_EXEEXT early, see below. +AC_CONFIG_COMMANDS_PRE(dnl +[m4_provide_if([_AM_COMPILER_EXEEXT], + [AM_CONDITIONAL([am__EXEEXT], [test -n "$EXEEXT"])])])dnl +]) + +dnl Hook into `_AC_COMPILER_EXEEXT' early to learn its expansion. Do not +dnl add the conditional right here, as _AC_COMPILER_EXEEXT may be further +dnl mangled by Autoconf and run in a shell conditional statement. +m4_define([_AC_COMPILER_EXEEXT], +m4_defn([_AC_COMPILER_EXEEXT])[m4_provide([_AM_COMPILER_EXEEXT])]) + + +# When config.status generates a header, we must update the stamp-h file. +# This file resides in the same directory as the config header +# that is generated. The stamp files are numbered to have different names. + +# Autoconf calls _AC_AM_CONFIG_HEADER_HOOK (when defined) in the +# loop where config.status creates the headers, so we can generate +# our stamp files there. +AC_DEFUN([_AC_AM_CONFIG_HEADER_HOOK], +[# Compute $1's index in $config_headers. +_am_arg=$1 +_am_stamp_count=1 +for _am_header in $config_headers :; do + case $_am_header in + $_am_arg | $_am_arg:* ) + break ;; + * ) + _am_stamp_count=`expr $_am_stamp_count + 1` ;; + esac +done +echo "timestamp for $_am_arg" >`AS_DIRNAME(["$_am_arg"])`/stamp-h[]$_am_stamp_count]) + +# Copyright (C) 2001, 2003, 2005, 2008, 2011 Free Software Foundation, +# Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# serial 1 + +# AM_PROG_INSTALL_SH +# ------------------ +# Define $install_sh. +AC_DEFUN([AM_PROG_INSTALL_SH], +[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl +if test x"${install_sh}" != xset; then + case $am_aux_dir in + *\ * | *\ *) + install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;; + *) + install_sh="\${SHELL} $am_aux_dir/install-sh" + esac +fi +AC_SUBST(install_sh)]) + +# Copyright (C) 2003, 2005 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# serial 2 + +# Check whether the underlying file-system supports filenames +# with a leading dot. For instance MS-DOS doesn't. +AC_DEFUN([AM_SET_LEADING_DOT], +[rm -rf .tst 2>/dev/null +mkdir .tst 2>/dev/null +if test -d .tst; then + am__leading_dot=. +else + am__leading_dot=_ +fi +rmdir .tst 2>/dev/null +AC_SUBST([am__leading_dot])]) + +# Check to see how 'make' treats includes. -*- Autoconf -*- + +# Copyright (C) 2001, 2002, 2003, 2005, 2009 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# serial 4 + +# AM_MAKE_INCLUDE() +# ----------------- +# Check to see how make treats includes. +AC_DEFUN([AM_MAKE_INCLUDE], +[am_make=${MAKE-make} +cat > confinc << 'END' +am__doit: + @echo this is the am__doit target +.PHONY: am__doit +END +# If we don't find an include directive, just comment out the code. +AC_MSG_CHECKING([for style of include used by $am_make]) +am__include="#" +am__quote= +_am_result=none +# First try GNU make style include. +echo "include confinc" > confmf +# Ignore all kinds of additional output from `make'. +case `$am_make -s -f confmf 2> /dev/null` in #( +*the\ am__doit\ target*) + am__include=include + am__quote= + _am_result=GNU + ;; +esac +# Now try BSD make style include. +if test "$am__include" = "#"; then + echo '.include "confinc"' > confmf + case `$am_make -s -f confmf 2> /dev/null` in #( + *the\ am__doit\ target*) + am__include=.include + am__quote="\"" + _am_result=BSD + ;; + esac +fi +AC_SUBST([am__include]) +AC_SUBST([am__quote]) +AC_MSG_RESULT([$_am_result]) +rm -f confinc confmf +]) + +# Copyright (C) 1999, 2000, 2001, 2003, 2004, 2005, 2008 +# Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# serial 6 + +# AM_PROG_CC_C_O +# -------------- +# Like AC_PROG_CC_C_O, but changed for automake. +AC_DEFUN([AM_PROG_CC_C_O], +[AC_REQUIRE([AC_PROG_CC_C_O])dnl +AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl +AC_REQUIRE_AUX_FILE([compile])dnl +# FIXME: we rely on the cache variable name because +# there is no other way. +set dummy $CC +am_cc=`echo $[2] | sed ['s/[^a-zA-Z0-9_]/_/g;s/^[0-9]/_/']` +eval am_t=\$ac_cv_prog_cc_${am_cc}_c_o +if test "$am_t" != yes; then + # Losing compiler, so override with the script. + # FIXME: It is wrong to rewrite CC. + # But if we don't then we get into trouble of one sort or another. + # A longer-term fix would be to have automake use am__CC in this case, + # and then we could set am__CC="\$(top_srcdir)/compile \$(CC)" + CC="$am_aux_dir/compile $CC" +fi +dnl Make sure AC_PROG_CC is never called again, or it will override our +dnl setting of CC. +m4_define([AC_PROG_CC], + [m4_fatal([AC_PROG_CC cannot be called after AM_PROG_CC_C_O])]) +]) + +# Fake the existence of programs that GNU maintainers use. -*- Autoconf -*- + +# Copyright (C) 1997, 1999, 2000, 2001, 2003, 2004, 2005, 2008 +# Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# serial 6 + +# AM_MISSING_PROG(NAME, PROGRAM) +# ------------------------------ +AC_DEFUN([AM_MISSING_PROG], +[AC_REQUIRE([AM_MISSING_HAS_RUN]) +$1=${$1-"${am_missing_run}$2"} +AC_SUBST($1)]) + + +# AM_MISSING_HAS_RUN +# ------------------ +# Define MISSING if not defined so far and test if it supports --run. +# If it does, set am_missing_run to use it, otherwise, to nothing. +AC_DEFUN([AM_MISSING_HAS_RUN], +[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl +AC_REQUIRE_AUX_FILE([missing])dnl +if test x"${MISSING+set}" != xset; then + case $am_aux_dir in + *\ * | *\ *) + MISSING="\${SHELL} \"$am_aux_dir/missing\"" ;; + *) + MISSING="\${SHELL} $am_aux_dir/missing" ;; + esac +fi +# Use eval to expand $SHELL +if eval "$MISSING --run true"; then + am_missing_run="$MISSING --run " +else + am_missing_run= + AC_MSG_WARN([`missing' script is too old or missing]) +fi +]) + +# Copyright (C) 2003, 2004, 2005, 2006, 2011 Free Software Foundation, +# Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# serial 1 + +# AM_PROG_MKDIR_P +# --------------- +# Check for `mkdir -p'. +AC_DEFUN([AM_PROG_MKDIR_P], +[AC_PREREQ([2.60])dnl +AC_REQUIRE([AC_PROG_MKDIR_P])dnl +dnl Automake 1.8 to 1.9.6 used to define mkdir_p. We now use MKDIR_P, +dnl while keeping a definition of mkdir_p for backward compatibility. +dnl @MKDIR_P@ is magic: AC_OUTPUT adjusts its value for each Makefile. +dnl However we cannot define mkdir_p as $(MKDIR_P) for the sake of +dnl Makefile.ins that do not define MKDIR_P, so we do our own +dnl adjustment using top_builddir (which is defined more often than +dnl MKDIR_P). +AC_SUBST([mkdir_p], ["$MKDIR_P"])dnl +case $mkdir_p in + [[\\/$]]* | ?:[[\\/]]*) ;; + */*) mkdir_p="\$(top_builddir)/$mkdir_p" ;; +esac +]) + +# Helper functions for option handling. -*- Autoconf -*- + +# Copyright (C) 2001, 2002, 2003, 2005, 2008, 2010 Free Software +# Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# serial 5 + +# _AM_MANGLE_OPTION(NAME) +# ----------------------- +AC_DEFUN([_AM_MANGLE_OPTION], +[[_AM_OPTION_]m4_bpatsubst($1, [[^a-zA-Z0-9_]], [_])]) + +# _AM_SET_OPTION(NAME) +# -------------------- +# Set option NAME. Presently that only means defining a flag for this option. +AC_DEFUN([_AM_SET_OPTION], +[m4_define(_AM_MANGLE_OPTION([$1]), 1)]) + +# _AM_SET_OPTIONS(OPTIONS) +# ------------------------ +# OPTIONS is a space-separated list of Automake options. +AC_DEFUN([_AM_SET_OPTIONS], +[m4_foreach_w([_AM_Option], [$1], [_AM_SET_OPTION(_AM_Option)])]) + +# _AM_IF_OPTION(OPTION, IF-SET, [IF-NOT-SET]) +# ------------------------------------------- +# Execute IF-SET if OPTION is set, IF-NOT-SET otherwise. +AC_DEFUN([_AM_IF_OPTION], +[m4_ifset(_AM_MANGLE_OPTION([$1]), [$2], [$3])]) + +# Check to make sure that the build environment is sane. -*- Autoconf -*- + +# Copyright (C) 1996, 1997, 2000, 2001, 2003, 2005, 2008 +# Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# serial 5 + +# AM_SANITY_CHECK +# --------------- +AC_DEFUN([AM_SANITY_CHECK], +[AC_MSG_CHECKING([whether build environment is sane]) +# Just in case +sleep 1 +echo timestamp > conftest.file +# Reject unsafe characters in $srcdir or the absolute working directory +# name. Accept space and tab only in the latter. +am_lf=' +' +case `pwd` in + *[[\\\"\#\$\&\'\`$am_lf]]*) + AC_MSG_ERROR([unsafe absolute working directory name]);; +esac +case $srcdir in + *[[\\\"\#\$\&\'\`$am_lf\ \ ]]*) + AC_MSG_ERROR([unsafe srcdir value: `$srcdir']);; +esac + +# Do `set' in a subshell so we don't clobber the current shell's +# arguments. Must try -L first in case configure is actually a +# symlink; some systems play weird games with the mod time of symlinks +# (eg FreeBSD returns the mod time of the symlink's containing +# directory). +if ( + set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null` + if test "$[*]" = "X"; then + # -L didn't work. + set X `ls -t "$srcdir/configure" conftest.file` + fi + rm -f conftest.file + if test "$[*]" != "X $srcdir/configure conftest.file" \ + && test "$[*]" != "X conftest.file $srcdir/configure"; then + + # If neither matched, then we have a broken ls. This can happen + # if, for instance, CONFIG_SHELL is bash and it inherits a + # broken ls alias from the environment. This has actually + # happened. Such a system could not be considered "sane". + AC_MSG_ERROR([ls -t appears to fail. Make sure there is not a broken +alias in your environment]) + fi + + test "$[2]" = conftest.file + ) +then + # Ok. + : +else + AC_MSG_ERROR([newly created file is older than distributed files! +Check your system clock]) +fi +AC_MSG_RESULT(yes)]) + +# Copyright (C) 2001, 2003, 2005, 2011 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# serial 1 + +# AM_PROG_INSTALL_STRIP +# --------------------- +# One issue with vendor `install' (even GNU) is that you can't +# specify the program used to strip binaries. This is especially +# annoying in cross-compiling environments, where the build's strip +# is unlikely to handle the host's binaries. +# Fortunately install-sh will honor a STRIPPROG variable, so we +# always use install-sh in `make install-strip', and initialize +# STRIPPROG with the value of the STRIP variable (set by the user). +AC_DEFUN([AM_PROG_INSTALL_STRIP], +[AC_REQUIRE([AM_PROG_INSTALL_SH])dnl +# Installed binaries are usually stripped using `strip' when the user +# run `make install-strip'. However `strip' might not be the right +# tool to use in cross-compilation environments, therefore Automake +# will honor the `STRIP' environment variable to overrule this program. +dnl Don't test for $cross_compiling = yes, because it might be `maybe'. +if test "$cross_compiling" != no; then + AC_CHECK_TOOL([STRIP], [strip], :) +fi +INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s" +AC_SUBST([INSTALL_STRIP_PROGRAM])]) + +# Copyright (C) 2006, 2008, 2010 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# serial 3 + +# _AM_SUBST_NOTMAKE(VARIABLE) +# --------------------------- +# Prevent Automake from outputting VARIABLE = @VARIABLE@ in Makefile.in. +# This macro is traced by Automake. +AC_DEFUN([_AM_SUBST_NOTMAKE]) + +# AM_SUBST_NOTMAKE(VARIABLE) +# -------------------------- +# Public sister of _AM_SUBST_NOTMAKE. +AC_DEFUN([AM_SUBST_NOTMAKE], [_AM_SUBST_NOTMAKE($@)]) + +# Check how to create a tarball. -*- Autoconf -*- + +# Copyright (C) 2004, 2005, 2012 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# serial 2 + +# _AM_PROG_TAR(FORMAT) +# -------------------- +# Check how to create a tarball in format FORMAT. +# FORMAT should be one of `v7', `ustar', or `pax'. +# +# Substitute a variable $(am__tar) that is a command +# writing to stdout a FORMAT-tarball containing the directory +# $tardir. +# tardir=directory && $(am__tar) > result.tar +# +# Substitute a variable $(am__untar) that extract such +# a tarball read from stdin. +# $(am__untar) < result.tar +AC_DEFUN([_AM_PROG_TAR], +[# Always define AMTAR for backward compatibility. Yes, it's still used +# in the wild :-( We should find a proper way to deprecate it ... +AC_SUBST([AMTAR], ['$${TAR-tar}']) +m4_if([$1], [v7], + [am__tar='$${TAR-tar} chof - "$$tardir"' am__untar='$${TAR-tar} xf -'], + [m4_case([$1], [ustar],, [pax],, + [m4_fatal([Unknown tar format])]) +AC_MSG_CHECKING([how to create a $1 tar archive]) +# Loop over all known methods to create a tar archive until one works. +_am_tools='gnutar m4_if([$1], [ustar], [plaintar]) pax cpio none' +_am_tools=${am_cv_prog_tar_$1-$_am_tools} +# Do not fold the above two line into one, because Tru64 sh and +# Solaris sh will not grok spaces in the rhs of `-'. +for _am_tool in $_am_tools +do + case $_am_tool in + gnutar) + for _am_tar in tar gnutar gtar; + do + AM_RUN_LOG([$_am_tar --version]) && break + done + am__tar="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$$tardir"' + am__tar_="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$tardir"' + am__untar="$_am_tar -xf -" + ;; + plaintar) + # Must skip GNU tar: if it does not support --format= it doesn't create + # ustar tarball either. + (tar --version) >/dev/null 2>&1 && continue + am__tar='tar chf - "$$tardir"' + am__tar_='tar chf - "$tardir"' + am__untar='tar xf -' + ;; + pax) + am__tar='pax -L -x $1 -w "$$tardir"' + am__tar_='pax -L -x $1 -w "$tardir"' + am__untar='pax -r' + ;; + cpio) + am__tar='find "$$tardir" -print | cpio -o -H $1 -L' + am__tar_='find "$tardir" -print | cpio -o -H $1 -L' + am__untar='cpio -i -H $1 -d' + ;; + none) + am__tar=false + am__tar_=false + am__untar=false + ;; + esac + + # If the value was cached, stop now. We just wanted to have am__tar + # and am__untar set. + test -n "${am_cv_prog_tar_$1}" && break + + # tar/untar a dummy directory, and stop if the command works + rm -rf conftest.dir + mkdir conftest.dir + echo GrepMe > conftest.dir/file + AM_RUN_LOG([tardir=conftest.dir && eval $am__tar_ >conftest.tar]) + rm -rf conftest.dir + if test -s conftest.tar; then + AM_RUN_LOG([$am__untar /dev/null 2>&1 && break + fi +done +rm -rf conftest.dir + +AC_CACHE_VAL([am_cv_prog_tar_$1], [am_cv_prog_tar_$1=$_am_tool]) +AC_MSG_RESULT([$am_cv_prog_tar_$1])]) +AC_SUBST([am__tar]) +AC_SUBST([am__untar]) +]) # _AM_PROG_TAR + +m4_include([acinclude.m4]) diff --git a/pkg/registry/zookeeper-3.4.6/src/c/aminclude.am b/pkg/registry/zookeeper-3.4.6/src/c/aminclude.am new file mode 100644 index 000000000..420049eca --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/c/aminclude.am @@ -0,0 +1,186 @@ +# Copyright (C) 2004 Oren Ben-Kiki +# This file is distributed under the same terms as the Automake macro files. + +# Generate automatic documentation using Doxygen. Goals and variables values +# are controlled by the various DX_COND_??? conditionals set by autoconf. +# +# The provided goals are: +# doxygen-doc: Generate all doxygen documentation. +# doxygen-run: Run doxygen, which will generate some of the documentation +# (HTML, CHM, CHI, MAN, RTF, XML) but will not do the post +# processing required for the rest of it (PS, PDF, and some MAN). +# doxygen-man: Rename some doxygen generated man pages. +# doxygen-ps: Generate doxygen PostScript documentation. +# doxygen-pdf: Generate doxygen PDF documentation. +# +# Note that by default these are not integrated into the automake goals. If +# doxygen is used to generate man pages, you can achieve this integration by +# setting man3_MANS to the list of man pages generated and then adding the +# dependency: +# +# $(man3_MANS): doxygen-doc +# +# This will cause make to run doxygen and generate all the documentation. +# +# The following variable is intended for use in Makefile.am: +# +# DX_CLEANFILES = everything to clean. +# +# This is usually added to MOSTLYCLEANFILES. + +## --------------------------------- ## +## Format-independent Doxygen rules. ## +## --------------------------------- ## + +if DX_COND_doc + +## ------------------------------- ## +## Rules specific for HTML output. ## +## ------------------------------- ## + +if DX_COND_html + +DX_CLEAN_HTML = @DX_DOCDIR@/html + +endif DX_COND_html + +## ------------------------------ ## +## Rules specific for CHM output. ## +## ------------------------------ ## + +if DX_COND_chm + +DX_CLEAN_CHM = @DX_DOCDIR@/chm + +if DX_COND_chi + +DX_CLEAN_CHI = @DX_DOCDIR@/@PACKAGE@.chi + +endif DX_COND_chi + +endif DX_COND_chm + +## ------------------------------ ## +## Rules specific for MAN output. ## +## ------------------------------ ## + +if DX_COND_man + +DX_CLEAN_MAN = @DX_DOCDIR@/man + +endif DX_COND_man + +## ------------------------------ ## +## Rules specific for RTF output. ## +## ------------------------------ ## + +if DX_COND_rtf + +DX_CLEAN_RTF = @DX_DOCDIR@/rtf + +endif DX_COND_rtf + +## ------------------------------ ## +## Rules specific for XML output. ## +## ------------------------------ ## + +if DX_COND_xml + +DX_CLEAN_XML = @DX_DOCDIR@/xml + +endif DX_COND_xml + +## ----------------------------- ## +## Rules specific for PS output. ## +## ----------------------------- ## + +if DX_COND_ps + +DX_CLEAN_PS = @DX_DOCDIR@/@PACKAGE@.ps + +DX_PS_GOAL = doxygen-ps + +doxygen-ps: @DX_DOCDIR@/@PACKAGE@.ps + +@DX_DOCDIR@/@PACKAGE@.ps: @DX_DOCDIR@/@PACKAGE@.tag + cd @DX_DOCDIR@/latex; \ + rm -f *.aux *.toc *.idx *.ind *.ilg *.log *.out; \ + $(DX_LATEX) refman.tex; \ + $(MAKEINDEX_PATH) refman.idx; \ + $(DX_LATEX) refman.tex; \ + countdown=5; \ + while $(DX_EGREP) 'Rerun (LaTeX|to get cross-references right)' \ + refman.log > /dev/null 2>&1 \ + && test $$countdown -gt 0; do \ + $(DX_LATEX) refman.tex; \ + countdown=`expr $$countdown - 1`; \ + done; \ + $(DX_DVIPS) -o ../@PACKAGE@.ps refman.dvi + +endif DX_COND_ps + +## ------------------------------ ## +## Rules specific for PDF output. ## +## ------------------------------ ## + +if DX_COND_pdf + +DX_CLEAN_PDF = @DX_DOCDIR@/@PACKAGE@.pdf + +DX_PDF_GOAL = doxygen-pdf + +doxygen-pdf: @DX_DOCDIR@/@PACKAGE@.pdf + +@DX_DOCDIR@/@PACKAGE@.pdf: @DX_DOCDIR@/@PACKAGE@.tag + cd @DX_DOCDIR@/latex; \ + rm -f *.aux *.toc *.idx *.ind *.ilg *.log *.out; \ + $(DX_PDFLATEX) refman.tex; \ + $(DX_MAKEINDEX) refman.idx; \ + $(DX_PDFLATEX) refman.tex; \ + countdown=5; \ + while $(DX_EGREP) 'Rerun (LaTeX|to get cross-references right)' \ + refman.log > /dev/null 2>&1 \ + && test $$countdown -gt 0; do \ + $(DX_PDFLATEX) refman.tex; \ + countdown=`expr $$countdown - 1`; \ + done; \ + mv refman.pdf ../@PACKAGE@.pdf + +endif DX_COND_pdf + +## ------------------------------------------------- ## +## Rules specific for LaTeX (shared for PS and PDF). ## +## ------------------------------------------------- ## + +if DX_COND_latex + +DX_CLEAN_LATEX = @DX_DOCDIR@/latex + +endif DX_COND_latex + +.PHONY: doxygen-run doxygen-doc $(DX_PS_GOAL) $(DX_PDF_GOAL) + +.INTERMEDIATE: doxygen-run $(DX_PS_GOAL) $(DX_PDF_GOAL) + +doxygen-run: @DX_DOCDIR@/@PACKAGE@.tag + +doxygen-doc: doxygen-run $(DX_PS_GOAL) $(DX_PDF_GOAL) + +@DX_DOCDIR@/@PACKAGE@.tag: $(DX_CONFIG) $(pkginclude_HEADERS) + rm -rf @DX_DOCDIR@ + $(DX_ENV) $(DX_DOXYGEN) $(srcdir)/$(DX_CONFIG) + +DX_CLEANFILES = \ + @DX_DOCDIR@/@PACKAGE@.tag \ + -r \ + $(DX_CLEAN_HTML) \ + $(DX_CLEAN_CHM) \ + $(DX_CLEAN_CHI) \ + $(DX_CLEAN_MAN) \ + $(DX_CLEAN_RTF) \ + $(DX_CLEAN_XML) \ + $(DX_CLEAN_PS) \ + $(DX_CLEAN_PDF) \ + $(DX_CLEAN_LATEX) + +endif DX_COND_doc diff --git a/pkg/registry/zookeeper-3.4.6/src/c/autom4te.cache/output.0 b/pkg/registry/zookeeper-3.4.6/src/c/autom4te.cache/output.0 new file mode 100644 index 000000000..a7d5bac9e --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/c/autom4te.cache/output.0 @@ -0,0 +1,8641 @@ +@%:@! /bin/sh +@%:@ Guess values for system-dependent variables and create Makefiles. +@%:@ Generated by GNU Autoconf 2.69 for zookeeper C client 3.4.5. +@%:@ +@%:@ Report bugs to . +@%:@ +@%:@ +@%:@ Copyright (C) 1992-1996, 1998-2012 Free Software Foundation, Inc. +@%:@ +@%:@ +@%:@ This configure script is free software; the Free Software Foundation +@%:@ gives unlimited permission to copy, distribute and modify it. +## -------------------- ## +## M4sh Initialization. ## +## -------------------- ## + +# Be more Bourne compatible +DUALCASE=1; export DUALCASE # for MKS sh +if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : + emulate sh + NULLCMD=: + # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which + # is contrary to our usage. Disable this feature. + alias -g '${1+"$@"}'='"$@"' + setopt NO_GLOB_SUBST +else + case `(set -o) 2>/dev/null` in @%:@( + *posix*) : + set -o posix ;; @%:@( + *) : + ;; +esac +fi + + +as_nl=' +' +export as_nl +# Printing a long string crashes Solaris 7 /usr/bin/printf. +as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' +as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo +as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo +# Prefer a ksh shell builtin over an external printf program on Solaris, +# but without wasting forks for bash or zsh. +if test -z "$BASH_VERSION$ZSH_VERSION" \ + && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then + as_echo='print -r --' + as_echo_n='print -rn --' +elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then + as_echo='printf %s\n' + as_echo_n='printf %s' +else + if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then + as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' + as_echo_n='/usr/ucb/echo -n' + else + as_echo_body='eval expr "X$1" : "X\\(.*\\)"' + as_echo_n_body='eval + arg=$1; + case $arg in @%:@( + *"$as_nl"*) + expr "X$arg" : "X\\(.*\\)$as_nl"; + arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; + esac; + expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" + ' + export as_echo_n_body + as_echo_n='sh -c $as_echo_n_body as_echo' + fi + export as_echo_body + as_echo='sh -c $as_echo_body as_echo' +fi + +# The user is always right. +if test "${PATH_SEPARATOR+set}" != set; then + PATH_SEPARATOR=: + (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { + (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || + PATH_SEPARATOR=';' + } +fi + + +# IFS +# We need space, tab and new line, in precisely that order. Quoting is +# there to prevent editors from complaining about space-tab. +# (If _AS_PATH_WALK were called with IFS unset, it would disable word +# splitting by setting IFS to empty value.) +IFS=" "" $as_nl" + +# Find who we are. Look in the path if we contain no directory separator. +as_myself= +case $0 in @%:@(( + *[\\/]* ) as_myself=$0 ;; + *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break + done +IFS=$as_save_IFS + + ;; +esac +# We did not find ourselves, most probably we were run as `sh COMMAND' +# in which case we are not to be found in the path. +if test "x$as_myself" = x; then + as_myself=$0 +fi +if test ! -f "$as_myself"; then + $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 + exit 1 +fi + +# Unset variables that we do not need and which cause bugs (e.g. in +# pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" +# suppresses any "Segmentation fault" message there. '((' could +# trigger a bug in pdksh 5.2.14. +for as_var in BASH_ENV ENV MAIL MAILPATH +do eval test x\${$as_var+set} = xset \ + && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : +done +PS1='$ ' +PS2='> ' +PS4='+ ' + +# NLS nuisances. +LC_ALL=C +export LC_ALL +LANGUAGE=C +export LANGUAGE + +# CDPATH. +(unset CDPATH) >/dev/null 2>&1 && unset CDPATH + +# Use a proper internal environment variable to ensure we don't fall + # into an infinite loop, continuously re-executing ourselves. + if test x"${_as_can_reexec}" != xno && test "x$CONFIG_SHELL" != x; then + _as_can_reexec=no; export _as_can_reexec; + # We cannot yet assume a decent shell, so we have to provide a +# neutralization value for shells without unset; and this also +# works around shells that cannot unset nonexistent variables. +# Preserve -v and -x to the replacement shell. +BASH_ENV=/dev/null +ENV=/dev/null +(unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV +case $- in @%:@ (((( + *v*x* | *x*v* ) as_opts=-vx ;; + *v* ) as_opts=-v ;; + *x* ) as_opts=-x ;; + * ) as_opts= ;; +esac +exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} +# Admittedly, this is quite paranoid, since all the known shells bail +# out after a failed `exec'. +$as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2 +as_fn_exit 255 + fi + # We don't want this to propagate to other subprocesses. + { _as_can_reexec=; unset _as_can_reexec;} +if test "x$CONFIG_SHELL" = x; then + as_bourne_compatible="if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then : + emulate sh + NULLCMD=: + # Pre-4.2 versions of Zsh do word splitting on \${1+\"\$@\"}, which + # is contrary to our usage. Disable this feature. + alias -g '\${1+\"\$@\"}'='\"\$@\"' + setopt NO_GLOB_SUBST +else + case \`(set -o) 2>/dev/null\` in @%:@( + *posix*) : + set -o posix ;; @%:@( + *) : + ;; +esac +fi +" + as_required="as_fn_return () { (exit \$1); } +as_fn_success () { as_fn_return 0; } +as_fn_failure () { as_fn_return 1; } +as_fn_ret_success () { return 0; } +as_fn_ret_failure () { return 1; } + +exitcode=0 +as_fn_success || { exitcode=1; echo as_fn_success failed.; } +as_fn_failure && { exitcode=1; echo as_fn_failure succeeded.; } +as_fn_ret_success || { exitcode=1; echo as_fn_ret_success failed.; } +as_fn_ret_failure && { exitcode=1; echo as_fn_ret_failure succeeded.; } +if ( set x; as_fn_ret_success y && test x = \"\$1\" ); then : + +else + exitcode=1; echo positional parameters were not saved. +fi +test x\$exitcode = x0 || exit 1 +test -x / || exit 1" + as_suggested=" as_lineno_1=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_1a=\$LINENO + as_lineno_2=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_2a=\$LINENO + eval 'test \"x\$as_lineno_1'\$as_run'\" != \"x\$as_lineno_2'\$as_run'\" && + test \"x\`expr \$as_lineno_1'\$as_run' + 1\`\" = \"x\$as_lineno_2'\$as_run'\"' || exit 1 +test \$(( 1 + 1 )) = 2 || exit 1" + if (eval "$as_required") 2>/dev/null; then : + as_have_required=yes +else + as_have_required=no +fi + if test x$as_have_required = xyes && (eval "$as_suggested") 2>/dev/null; then : + +else + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +as_found=false +for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + as_found=: + case $as_dir in @%:@( + /*) + for as_base in sh bash ksh sh5; do + # Try only shells that exist, to save several forks. + as_shell=$as_dir/$as_base + if { test -f "$as_shell" || test -f "$as_shell.exe"; } && + { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$as_shell"; } 2>/dev/null; then : + CONFIG_SHELL=$as_shell as_have_required=yes + if { $as_echo "$as_bourne_compatible""$as_suggested" | as_run=a "$as_shell"; } 2>/dev/null; then : + break 2 +fi +fi + done;; + esac + as_found=false +done +$as_found || { if { test -f "$SHELL" || test -f "$SHELL.exe"; } && + { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$SHELL"; } 2>/dev/null; then : + CONFIG_SHELL=$SHELL as_have_required=yes +fi; } +IFS=$as_save_IFS + + + if test "x$CONFIG_SHELL" != x; then : + export CONFIG_SHELL + # We cannot yet assume a decent shell, so we have to provide a +# neutralization value for shells without unset; and this also +# works around shells that cannot unset nonexistent variables. +# Preserve -v and -x to the replacement shell. +BASH_ENV=/dev/null +ENV=/dev/null +(unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV +case $- in @%:@ (((( + *v*x* | *x*v* ) as_opts=-vx ;; + *v* ) as_opts=-v ;; + *x* ) as_opts=-x ;; + * ) as_opts= ;; +esac +exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} +# Admittedly, this is quite paranoid, since all the known shells bail +# out after a failed `exec'. +$as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2 +exit 255 +fi + + if test x$as_have_required = xno; then : + $as_echo "$0: This script requires a shell more modern than all" + $as_echo "$0: the shells that I found on your system." + if test x${ZSH_VERSION+set} = xset ; then + $as_echo "$0: In particular, zsh $ZSH_VERSION has bugs and should" + $as_echo "$0: be upgraded to zsh 4.3.4 or later." + else + $as_echo "$0: Please tell bug-autoconf@gnu.org and +$0: user@zookeeper.apache.org about your system, including +$0: any error possibly output before this message. Then +$0: install a modern shell, or manually run the script +$0: under such a shell if you do have one." + fi + exit 1 +fi +fi +fi +SHELL=${CONFIG_SHELL-/bin/sh} +export SHELL +# Unset more variables known to interfere with behavior of common tools. +CLICOLOR_FORCE= GREP_OPTIONS= +unset CLICOLOR_FORCE GREP_OPTIONS + +## --------------------- ## +## M4sh Shell Functions. ## +## --------------------- ## +@%:@ as_fn_unset VAR +@%:@ --------------- +@%:@ Portably unset VAR. +as_fn_unset () +{ + { eval $1=; unset $1;} +} +as_unset=as_fn_unset + +@%:@ as_fn_set_status STATUS +@%:@ ----------------------- +@%:@ Set @S|@? to STATUS, without forking. +as_fn_set_status () +{ + return $1 +} @%:@ as_fn_set_status + +@%:@ as_fn_exit STATUS +@%:@ ----------------- +@%:@ Exit the shell with STATUS, even in a "trap 0" or "set -e" context. +as_fn_exit () +{ + set +e + as_fn_set_status $1 + exit $1 +} @%:@ as_fn_exit + +@%:@ as_fn_mkdir_p +@%:@ ------------- +@%:@ Create "@S|@as_dir" as a directory, including parents if necessary. +as_fn_mkdir_p () +{ + + case $as_dir in #( + -*) as_dir=./$as_dir;; + esac + test -d "$as_dir" || eval $as_mkdir_p || { + as_dirs= + while :; do + case $as_dir in #( + *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( + *) as_qdir=$as_dir;; + esac + as_dirs="'$as_qdir' $as_dirs" + as_dir=`$as_dirname -- "$as_dir" || +$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$as_dir" : 'X\(//\)[^/]' \| \ + X"$as_dir" : 'X\(//\)$' \| \ + X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$as_dir" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + test -d "$as_dir" && break + done + test -z "$as_dirs" || eval "mkdir $as_dirs" + } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" + + +} @%:@ as_fn_mkdir_p + +@%:@ as_fn_executable_p FILE +@%:@ ----------------------- +@%:@ Test if FILE is an executable regular file. +as_fn_executable_p () +{ + test -f "$1" && test -x "$1" +} @%:@ as_fn_executable_p +@%:@ as_fn_append VAR VALUE +@%:@ ---------------------- +@%:@ Append the text in VALUE to the end of the definition contained in VAR. Take +@%:@ advantage of any shell optimizations that allow amortized linear growth over +@%:@ repeated appends, instead of the typical quadratic growth present in naive +@%:@ implementations. +if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : + eval 'as_fn_append () + { + eval $1+=\$2 + }' +else + as_fn_append () + { + eval $1=\$$1\$2 + } +fi # as_fn_append + +@%:@ as_fn_arith ARG... +@%:@ ------------------ +@%:@ Perform arithmetic evaluation on the ARGs, and store the result in the +@%:@ global @S|@as_val. Take advantage of shells that can avoid forks. The arguments +@%:@ must be portable across @S|@(()) and expr. +if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : + eval 'as_fn_arith () + { + as_val=$(( $* )) + }' +else + as_fn_arith () + { + as_val=`expr "$@" || test $? -eq 1` + } +fi # as_fn_arith + + +@%:@ as_fn_error STATUS ERROR [LINENO LOG_FD] +@%:@ ---------------------------------------- +@%:@ Output "`basename @S|@0`: error: ERROR" to stderr. If LINENO and LOG_FD are +@%:@ provided, also output the error to LOG_FD, referencing LINENO. Then exit the +@%:@ script with STATUS, using 1 if that was 0. +as_fn_error () +{ + as_status=$1; test $as_status -eq 0 && as_status=1 + if test "$4"; then + as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 + fi + $as_echo "$as_me: error: $2" >&2 + as_fn_exit $as_status +} @%:@ as_fn_error + +if expr a : '\(a\)' >/dev/null 2>&1 && + test "X`expr 00001 : '.*\(...\)'`" = X001; then + as_expr=expr +else + as_expr=false +fi + +if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then + as_basename=basename +else + as_basename=false +fi + +if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then + as_dirname=dirname +else + as_dirname=false +fi + +as_me=`$as_basename -- "$0" || +$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ + X"$0" : 'X\(//\)$' \| \ + X"$0" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X/"$0" | + sed '/^.*\/\([^/][^/]*\)\/*$/{ + s//\1/ + q + } + /^X\/\(\/\/\)$/{ + s//\1/ + q + } + /^X\/\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + +# Avoid depending upon Character Ranges. +as_cr_letters='abcdefghijklmnopqrstuvwxyz' +as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' +as_cr_Letters=$as_cr_letters$as_cr_LETTERS +as_cr_digits='0123456789' +as_cr_alnum=$as_cr_Letters$as_cr_digits + + + as_lineno_1=$LINENO as_lineno_1a=$LINENO + as_lineno_2=$LINENO as_lineno_2a=$LINENO + eval 'test "x$as_lineno_1'$as_run'" != "x$as_lineno_2'$as_run'" && + test "x`expr $as_lineno_1'$as_run' + 1`" = "x$as_lineno_2'$as_run'"' || { + # Blame Lee E. McMahon (1931-1989) for sed's syntax. :-) + sed -n ' + p + /[$]LINENO/= + ' <$as_myself | + sed ' + s/[$]LINENO.*/&-/ + t lineno + b + :lineno + N + :loop + s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/ + t loop + s/-\n.*// + ' >$as_me.lineno && + chmod +x "$as_me.lineno" || + { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; } + + # If we had to re-execute with $CONFIG_SHELL, we're ensured to have + # already done that, so ensure we don't try to do so again and fall + # in an infinite loop. This has already happened in practice. + _as_can_reexec=no; export _as_can_reexec + # Don't try to exec as it changes $[0], causing all sort of problems + # (the dirname of $[0] is not the place where we might find the + # original and so on. Autoconf is especially sensitive to this). + . "./$as_me.lineno" + # Exit status is that of the last command. + exit +} + +ECHO_C= ECHO_N= ECHO_T= +case `echo -n x` in @%:@((((( +-n*) + case `echo 'xy\c'` in + *c*) ECHO_T=' ';; # ECHO_T is single tab character. + xy) ECHO_C='\c';; + *) echo `echo ksh88 bug on AIX 6.1` > /dev/null + ECHO_T=' ';; + esac;; +*) + ECHO_N='-n';; +esac + +rm -f conf$$ conf$$.exe conf$$.file +if test -d conf$$.dir; then + rm -f conf$$.dir/conf$$.file +else + rm -f conf$$.dir + mkdir conf$$.dir 2>/dev/null +fi +if (echo >conf$$.file) 2>/dev/null; then + if ln -s conf$$.file conf$$ 2>/dev/null; then + as_ln_s='ln -s' + # ... but there are two gotchas: + # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. + # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. + # In both cases, we have to default to `cp -pR'. + ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || + as_ln_s='cp -pR' + elif ln conf$$.file conf$$ 2>/dev/null; then + as_ln_s=ln + else + as_ln_s='cp -pR' + fi +else + as_ln_s='cp -pR' +fi +rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file +rmdir conf$$.dir 2>/dev/null + +if mkdir -p . 2>/dev/null; then + as_mkdir_p='mkdir -p "$as_dir"' +else + test -d ./-p && rmdir ./-p + as_mkdir_p=false +fi + +as_test_x='test -x' +as_executable_p=as_fn_executable_p + +# Sed expression to map a string onto a valid CPP name. +as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" + +# Sed expression to map a string onto a valid variable name. +as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" + + +test -n "$DJDIR" || exec 7<&0 &1 + +# Name of the host. +# hostname on some systems (SVR3.2, old GNU/Linux) returns a bogus exit status, +# so uname gets run too. +ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q` + +# +# Initializations. +# +ac_default_prefix=/usr/local +ac_clean_files= +ac_config_libobj_dir=. +LIB@&t@OBJS= +cross_compiling=no +subdirs= +MFLAGS= +MAKEFLAGS= + +# Identity of this package. +PACKAGE_NAME='zookeeper C client' +PACKAGE_TARNAME='zookeeper' +PACKAGE_VERSION='3.4.5' +PACKAGE_STRING='zookeeper C client 3.4.5' +PACKAGE_BUGREPORT='user@zookeeper.apache.org' +PACKAGE_URL='' + +ac_unique_file="src/zookeeper.c" +# Factoring default headers for most tests. +ac_includes_default="\ +#include +#ifdef HAVE_SYS_TYPES_H +# include +#endif +#ifdef HAVE_SYS_STAT_H +# include +#endif +#ifdef STDC_HEADERS +# include +# include +#else +# ifdef HAVE_STDLIB_H +# include +# endif +#endif +#ifdef HAVE_STRING_H +# if !defined STDC_HEADERS && defined HAVE_MEMORY_H +# include +# endif +# include +#endif +#ifdef HAVE_STRINGS_H +# include +#endif +#ifdef HAVE_INTTYPES_H +# include +#endif +#ifdef HAVE_STDINT_H +# include +#endif +#ifdef HAVE_UNISTD_H +# include +#endif" + +ac_subst_vars='am__EXEEXT_FALSE +am__EXEEXT_TRUE +LTLIBOBJS +LIB@&t@OBJS +USEIPV6 +EGREP +GREP +CPP +WANT_SYNCAPI_FALSE +WANT_SYNCAPI_TRUE +LN_S +am__fastdepCXX_FALSE +am__fastdepCXX_TRUE +CXXDEPMODE +ac_ct_CXX +CXXFLAGS +CXX +am__fastdepCC_FALSE +am__fastdepCC_TRUE +CCDEPMODE +am__nodep +AMDEPBACKSLASH +AMDEP_FALSE +AMDEP_TRUE +am__quote +am__include +DEPDIR +OBJEXT +EXEEXT +ac_ct_CC +CPPFLAGS +LDFLAGS +CFLAGS +CC +CPPUNIT_CFLAGS +am__untar +am__tar +AMTAR +am__leading_dot +SET_MAKE +AWK +mkdir_p +MKDIR_P +INSTALL_STRIP_PROGRAM +STRIP +install_sh +MAKEINFO +AUTOHEADER +AUTOMAKE +AUTOCONF +ACLOCAL +VERSION +PACKAGE +CYGPATH_W +am__isrc +INSTALL_DATA +INSTALL_SCRIPT +INSTALL_PROGRAM +DOXYGEN_PAPER_SIZE +DX_COND_latex_FALSE +DX_COND_latex_TRUE +DX_COND_pdf_FALSE +DX_COND_pdf_TRUE +DX_PDFLATEX +DX_FLAG_pdf +DX_COND_ps_FALSE +DX_COND_ps_TRUE +DX_EGREP +DX_DVIPS +DX_MAKEINDEX +DX_LATEX +DX_FLAG_ps +DX_COND_html_FALSE +DX_COND_html_TRUE +DX_FLAG_html +DX_COND_chi_FALSE +DX_COND_chi_TRUE +DX_FLAG_chi +DX_COND_chm_FALSE +DX_COND_chm_TRUE +DX_HHC +DX_FLAG_chm +DX_COND_xml_FALSE +DX_COND_xml_TRUE +DX_FLAG_xml +DX_COND_rtf_FALSE +DX_COND_rtf_TRUE +DX_FLAG_rtf +DX_COND_man_FALSE +DX_COND_man_TRUE +DX_FLAG_man +DX_COND_dot_FALSE +DX_COND_dot_TRUE +DX_DOT +DX_FLAG_dot +DX_COND_doc_FALSE +DX_COND_doc_TRUE +DX_PERL +DX_DOXYGEN +DX_FLAG_doc +DX_ENV +DX_DOCDIR +DX_CONFIG +DX_PROJECT +target_alias +host_alias +build_alias +LIBS +ECHO_T +ECHO_N +ECHO_C +DEFS +mandir +localedir +libdir +psdir +pdfdir +dvidir +htmldir +infodir +docdir +oldincludedir +includedir +localstatedir +sharedstatedir +sysconfdir +datadir +datarootdir +libexecdir +sbindir +bindir +program_transform_name +prefix +exec_prefix +PACKAGE_URL +PACKAGE_BUGREPORT +PACKAGE_STRING +PACKAGE_VERSION +PACKAGE_TARNAME +PACKAGE_NAME +PATH_SEPARATOR +SHELL' +ac_subst_files='' +ac_user_opts=' +enable_option_checking +enable_doxygen_doc +enable_doxygen_dot +enable_doxygen_man +enable_doxygen_rtf +enable_doxygen_xml +enable_doxygen_chm +enable_doxygen_chi +enable_doxygen_html +enable_doxygen_ps +enable_doxygen_pdf +with_cppunit +enable_dependency_tracking +enable_debug +with_syncapi +' + ac_precious_vars='build_alias +host_alias +target_alias +DOXYGEN_PAPER_SIZE +CC +CFLAGS +LDFLAGS +LIBS +CPPFLAGS +CXX +CXXFLAGS +CCC +CPP' + + +# Initialize some variables set by options. +ac_init_help= +ac_init_version=false +ac_unrecognized_opts= +ac_unrecognized_sep= +# The variables have the same names as the options, with +# dashes changed to underlines. +cache_file=/dev/null +exec_prefix=NONE +no_create= +no_recursion= +prefix=NONE +program_prefix=NONE +program_suffix=NONE +program_transform_name=s,x,x, +silent= +site= +srcdir= +verbose= +x_includes=NONE +x_libraries=NONE + +# Installation directory options. +# These are left unexpanded so users can "make install exec_prefix=/foo" +# and all the variables that are supposed to be based on exec_prefix +# by default will actually change. +# Use braces instead of parens because sh, perl, etc. also accept them. +# (The list follows the same order as the GNU Coding Standards.) +bindir='${exec_prefix}/bin' +sbindir='${exec_prefix}/sbin' +libexecdir='${exec_prefix}/libexec' +datarootdir='${prefix}/share' +datadir='${datarootdir}' +sysconfdir='${prefix}/etc' +sharedstatedir='${prefix}/com' +localstatedir='${prefix}/var' +includedir='${prefix}/include' +oldincludedir='/usr/include' +docdir='${datarootdir}/doc/${PACKAGE_TARNAME}' +infodir='${datarootdir}/info' +htmldir='${docdir}' +dvidir='${docdir}' +pdfdir='${docdir}' +psdir='${docdir}' +libdir='${exec_prefix}/lib' +localedir='${datarootdir}/locale' +mandir='${datarootdir}/man' + +ac_prev= +ac_dashdash= +for ac_option +do + # If the previous option needs an argument, assign it. + if test -n "$ac_prev"; then + eval $ac_prev=\$ac_option + ac_prev= + continue + fi + + case $ac_option in + *=?*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;; + *=) ac_optarg= ;; + *) ac_optarg=yes ;; + esac + + # Accept the important Cygnus configure options, so we can diagnose typos. + + case $ac_dashdash$ac_option in + --) + ac_dashdash=yes ;; + + -bindir | --bindir | --bindi | --bind | --bin | --bi) + ac_prev=bindir ;; + -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*) + bindir=$ac_optarg ;; + + -build | --build | --buil | --bui | --bu) + ac_prev=build_alias ;; + -build=* | --build=* | --buil=* | --bui=* | --bu=*) + build_alias=$ac_optarg ;; + + -cache-file | --cache-file | --cache-fil | --cache-fi \ + | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c) + ac_prev=cache_file ;; + -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \ + | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*) + cache_file=$ac_optarg ;; + + --config-cache | -C) + cache_file=config.cache ;; + + -datadir | --datadir | --datadi | --datad) + ac_prev=datadir ;; + -datadir=* | --datadir=* | --datadi=* | --datad=*) + datadir=$ac_optarg ;; + + -datarootdir | --datarootdir | --datarootdi | --datarootd | --dataroot \ + | --dataroo | --dataro | --datar) + ac_prev=datarootdir ;; + -datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \ + | --dataroot=* | --dataroo=* | --dataro=* | --datar=*) + datarootdir=$ac_optarg ;; + + -disable-* | --disable-*) + ac_useropt=`expr "x$ac_option" : 'x-*disable-\(.*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && + as_fn_error $? "invalid feature name: $ac_useropt" + ac_useropt_orig=$ac_useropt + ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` + case $ac_user_opts in + *" +"enable_$ac_useropt" +"*) ;; + *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--disable-$ac_useropt_orig" + ac_unrecognized_sep=', ';; + esac + eval enable_$ac_useropt=no ;; + + -docdir | --docdir | --docdi | --doc | --do) + ac_prev=docdir ;; + -docdir=* | --docdir=* | --docdi=* | --doc=* | --do=*) + docdir=$ac_optarg ;; + + -dvidir | --dvidir | --dvidi | --dvid | --dvi | --dv) + ac_prev=dvidir ;; + -dvidir=* | --dvidir=* | --dvidi=* | --dvid=* | --dvi=* | --dv=*) + dvidir=$ac_optarg ;; + + -enable-* | --enable-*) + ac_useropt=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && + as_fn_error $? "invalid feature name: $ac_useropt" + ac_useropt_orig=$ac_useropt + ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` + case $ac_user_opts in + *" +"enable_$ac_useropt" +"*) ;; + *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--enable-$ac_useropt_orig" + ac_unrecognized_sep=', ';; + esac + eval enable_$ac_useropt=\$ac_optarg ;; + + -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \ + | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \ + | --exec | --exe | --ex) + ac_prev=exec_prefix ;; + -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \ + | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \ + | --exec=* | --exe=* | --ex=*) + exec_prefix=$ac_optarg ;; + + -gas | --gas | --ga | --g) + # Obsolete; use --with-gas. + with_gas=yes ;; + + -help | --help | --hel | --he | -h) + ac_init_help=long ;; + -help=r* | --help=r* | --hel=r* | --he=r* | -hr*) + ac_init_help=recursive ;; + -help=s* | --help=s* | --hel=s* | --he=s* | -hs*) + ac_init_help=short ;; + + -host | --host | --hos | --ho) + ac_prev=host_alias ;; + -host=* | --host=* | --hos=* | --ho=*) + host_alias=$ac_optarg ;; + + -htmldir | --htmldir | --htmldi | --htmld | --html | --htm | --ht) + ac_prev=htmldir ;; + -htmldir=* | --htmldir=* | --htmldi=* | --htmld=* | --html=* | --htm=* \ + | --ht=*) + htmldir=$ac_optarg ;; + + -includedir | --includedir | --includedi | --included | --include \ + | --includ | --inclu | --incl | --inc) + ac_prev=includedir ;; + -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \ + | --includ=* | --inclu=* | --incl=* | --inc=*) + includedir=$ac_optarg ;; + + -infodir | --infodir | --infodi | --infod | --info | --inf) + ac_prev=infodir ;; + -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*) + infodir=$ac_optarg ;; + + -libdir | --libdir | --libdi | --libd) + ac_prev=libdir ;; + -libdir=* | --libdir=* | --libdi=* | --libd=*) + libdir=$ac_optarg ;; + + -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \ + | --libexe | --libex | --libe) + ac_prev=libexecdir ;; + -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \ + | --libexe=* | --libex=* | --libe=*) + libexecdir=$ac_optarg ;; + + -localedir | --localedir | --localedi | --localed | --locale) + ac_prev=localedir ;; + -localedir=* | --localedir=* | --localedi=* | --localed=* | --locale=*) + localedir=$ac_optarg ;; + + -localstatedir | --localstatedir | --localstatedi | --localstated \ + | --localstate | --localstat | --localsta | --localst | --locals) + ac_prev=localstatedir ;; + -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \ + | --localstate=* | --localstat=* | --localsta=* | --localst=* | --locals=*) + localstatedir=$ac_optarg ;; + + -mandir | --mandir | --mandi | --mand | --man | --ma | --m) + ac_prev=mandir ;; + -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*) + mandir=$ac_optarg ;; + + -nfp | --nfp | --nf) + # Obsolete; use --without-fp. + with_fp=no ;; + + -no-create | --no-create | --no-creat | --no-crea | --no-cre \ + | --no-cr | --no-c | -n) + no_create=yes ;; + + -no-recursion | --no-recursion | --no-recursio | --no-recursi \ + | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) + no_recursion=yes ;; + + -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \ + | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \ + | --oldin | --oldi | --old | --ol | --o) + ac_prev=oldincludedir ;; + -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \ + | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \ + | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*) + oldincludedir=$ac_optarg ;; + + -prefix | --prefix | --prefi | --pref | --pre | --pr | --p) + ac_prev=prefix ;; + -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*) + prefix=$ac_optarg ;; + + -program-prefix | --program-prefix | --program-prefi | --program-pref \ + | --program-pre | --program-pr | --program-p) + ac_prev=program_prefix ;; + -program-prefix=* | --program-prefix=* | --program-prefi=* \ + | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*) + program_prefix=$ac_optarg ;; + + -program-suffix | --program-suffix | --program-suffi | --program-suff \ + | --program-suf | --program-su | --program-s) + ac_prev=program_suffix ;; + -program-suffix=* | --program-suffix=* | --program-suffi=* \ + | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*) + program_suffix=$ac_optarg ;; + + -program-transform-name | --program-transform-name \ + | --program-transform-nam | --program-transform-na \ + | --program-transform-n | --program-transform- \ + | --program-transform | --program-transfor \ + | --program-transfo | --program-transf \ + | --program-trans | --program-tran \ + | --progr-tra | --program-tr | --program-t) + ac_prev=program_transform_name ;; + -program-transform-name=* | --program-transform-name=* \ + | --program-transform-nam=* | --program-transform-na=* \ + | --program-transform-n=* | --program-transform-=* \ + | --program-transform=* | --program-transfor=* \ + | --program-transfo=* | --program-transf=* \ + | --program-trans=* | --program-tran=* \ + | --progr-tra=* | --program-tr=* | --program-t=*) + program_transform_name=$ac_optarg ;; + + -pdfdir | --pdfdir | --pdfdi | --pdfd | --pdf | --pd) + ac_prev=pdfdir ;; + -pdfdir=* | --pdfdir=* | --pdfdi=* | --pdfd=* | --pdf=* | --pd=*) + pdfdir=$ac_optarg ;; + + -psdir | --psdir | --psdi | --psd | --ps) + ac_prev=psdir ;; + -psdir=* | --psdir=* | --psdi=* | --psd=* | --ps=*) + psdir=$ac_optarg ;; + + -q | -quiet | --quiet | --quie | --qui | --qu | --q \ + | -silent | --silent | --silen | --sile | --sil) + silent=yes ;; + + -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb) + ac_prev=sbindir ;; + -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \ + | --sbi=* | --sb=*) + sbindir=$ac_optarg ;; + + -sharedstatedir | --sharedstatedir | --sharedstatedi \ + | --sharedstated | --sharedstate | --sharedstat | --sharedsta \ + | --sharedst | --shareds | --shared | --share | --shar \ + | --sha | --sh) + ac_prev=sharedstatedir ;; + -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \ + | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \ + | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \ + | --sha=* | --sh=*) + sharedstatedir=$ac_optarg ;; + + -site | --site | --sit) + ac_prev=site ;; + -site=* | --site=* | --sit=*) + site=$ac_optarg ;; + + -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) + ac_prev=srcdir ;; + -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) + srcdir=$ac_optarg ;; + + -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \ + | --syscon | --sysco | --sysc | --sys | --sy) + ac_prev=sysconfdir ;; + -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \ + | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*) + sysconfdir=$ac_optarg ;; + + -target | --target | --targe | --targ | --tar | --ta | --t) + ac_prev=target_alias ;; + -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*) + target_alias=$ac_optarg ;; + + -v | -verbose | --verbose | --verbos | --verbo | --verb) + verbose=yes ;; + + -version | --version | --versio | --versi | --vers | -V) + ac_init_version=: ;; + + -with-* | --with-*) + ac_useropt=`expr "x$ac_option" : 'x-*with-\([^=]*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && + as_fn_error $? "invalid package name: $ac_useropt" + ac_useropt_orig=$ac_useropt + ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` + case $ac_user_opts in + *" +"with_$ac_useropt" +"*) ;; + *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--with-$ac_useropt_orig" + ac_unrecognized_sep=', ';; + esac + eval with_$ac_useropt=\$ac_optarg ;; + + -without-* | --without-*) + ac_useropt=`expr "x$ac_option" : 'x-*without-\(.*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && + as_fn_error $? "invalid package name: $ac_useropt" + ac_useropt_orig=$ac_useropt + ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` + case $ac_user_opts in + *" +"with_$ac_useropt" +"*) ;; + *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--without-$ac_useropt_orig" + ac_unrecognized_sep=', ';; + esac + eval with_$ac_useropt=no ;; + + --x) + # Obsolete; use --with-x. + with_x=yes ;; + + -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \ + | --x-incl | --x-inc | --x-in | --x-i) + ac_prev=x_includes ;; + -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \ + | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*) + x_includes=$ac_optarg ;; + + -x-libraries | --x-libraries | --x-librarie | --x-librari \ + | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l) + ac_prev=x_libraries ;; + -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \ + | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*) + x_libraries=$ac_optarg ;; + + -*) as_fn_error $? "unrecognized option: \`$ac_option' +Try \`$0 --help' for more information" + ;; + + *=*) + ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='` + # Reject names that are not valid shell variable names. + case $ac_envvar in #( + '' | [0-9]* | *[!_$as_cr_alnum]* ) + as_fn_error $? "invalid variable name: \`$ac_envvar'" ;; + esac + eval $ac_envvar=\$ac_optarg + export $ac_envvar ;; + + *) + # FIXME: should be removed in autoconf 3.0. + $as_echo "$as_me: WARNING: you should use --build, --host, --target" >&2 + expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null && + $as_echo "$as_me: WARNING: invalid host type: $ac_option" >&2 + : "${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}" + ;; + + esac +done + +if test -n "$ac_prev"; then + ac_option=--`echo $ac_prev | sed 's/_/-/g'` + as_fn_error $? "missing argument to $ac_option" +fi + +if test -n "$ac_unrecognized_opts"; then + case $enable_option_checking in + no) ;; + fatal) as_fn_error $? "unrecognized options: $ac_unrecognized_opts" ;; + *) $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 ;; + esac +fi + +# Check all directory arguments for consistency. +for ac_var in exec_prefix prefix bindir sbindir libexecdir datarootdir \ + datadir sysconfdir sharedstatedir localstatedir includedir \ + oldincludedir docdir infodir htmldir dvidir pdfdir psdir \ + libdir localedir mandir +do + eval ac_val=\$$ac_var + # Remove trailing slashes. + case $ac_val in + */ ) + ac_val=`expr "X$ac_val" : 'X\(.*[^/]\)' \| "X$ac_val" : 'X\(.*\)'` + eval $ac_var=\$ac_val;; + esac + # Be sure to have absolute directory names. + case $ac_val in + [\\/$]* | ?:[\\/]* ) continue;; + NONE | '' ) case $ac_var in *prefix ) continue;; esac;; + esac + as_fn_error $? "expected an absolute directory name for --$ac_var: $ac_val" +done + +# There might be people who depend on the old broken behavior: `$host' +# used to hold the argument of --host etc. +# FIXME: To remove some day. +build=$build_alias +host=$host_alias +target=$target_alias + +# FIXME: To remove some day. +if test "x$host_alias" != x; then + if test "x$build_alias" = x; then + cross_compiling=maybe + elif test "x$build_alias" != "x$host_alias"; then + cross_compiling=yes + fi +fi + +ac_tool_prefix= +test -n "$host_alias" && ac_tool_prefix=$host_alias- + +test "$silent" = yes && exec 6>/dev/null + + +ac_pwd=`pwd` && test -n "$ac_pwd" && +ac_ls_di=`ls -di .` && +ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` || + as_fn_error $? "working directory cannot be determined" +test "X$ac_ls_di" = "X$ac_pwd_ls_di" || + as_fn_error $? "pwd does not report name of working directory" + + +# Find the source files, if location was not specified. +if test -z "$srcdir"; then + ac_srcdir_defaulted=yes + # Try the directory containing this script, then the parent directory. + ac_confdir=`$as_dirname -- "$as_myself" || +$as_expr X"$as_myself" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$as_myself" : 'X\(//\)[^/]' \| \ + X"$as_myself" : 'X\(//\)$' \| \ + X"$as_myself" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$as_myself" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + srcdir=$ac_confdir + if test ! -r "$srcdir/$ac_unique_file"; then + srcdir=.. + fi +else + ac_srcdir_defaulted=no +fi +if test ! -r "$srcdir/$ac_unique_file"; then + test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .." + as_fn_error $? "cannot find sources ($ac_unique_file) in $srcdir" +fi +ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work" +ac_abs_confdir=`( + cd "$srcdir" && test -r "./$ac_unique_file" || as_fn_error $? "$ac_msg" + pwd)` +# When building in place, set srcdir=. +if test "$ac_abs_confdir" = "$ac_pwd"; then + srcdir=. +fi +# Remove unnecessary trailing slashes from srcdir. +# Double slashes in file names in object file debugging info +# mess up M-x gdb in Emacs. +case $srcdir in +*/) srcdir=`expr "X$srcdir" : 'X\(.*[^/]\)' \| "X$srcdir" : 'X\(.*\)'`;; +esac +for ac_var in $ac_precious_vars; do + eval ac_env_${ac_var}_set=\${${ac_var}+set} + eval ac_env_${ac_var}_value=\$${ac_var} + eval ac_cv_env_${ac_var}_set=\${${ac_var}+set} + eval ac_cv_env_${ac_var}_value=\$${ac_var} +done + +# +# Report the --help message. +# +if test "$ac_init_help" = "long"; then + # Omit some internal or obsolete options to make the list less imposing. + # This message is too long to be a string in the A/UX 3.1 sh. + cat <<_ACEOF +\`configure' configures zookeeper C client 3.4.5 to adapt to many kinds of systems. + +Usage: $0 [OPTION]... [VAR=VALUE]... + +To assign environment variables (e.g., CC, CFLAGS...), specify them as +VAR=VALUE. See below for descriptions of some of the useful variables. + +Defaults for the options are specified in brackets. + +Configuration: + -h, --help display this help and exit + --help=short display options specific to this package + --help=recursive display the short help of all the included packages + -V, --version display version information and exit + -q, --quiet, --silent do not print \`checking ...' messages + --cache-file=FILE cache test results in FILE [disabled] + -C, --config-cache alias for \`--cache-file=config.cache' + -n, --no-create do not create output files + --srcdir=DIR find the sources in DIR [configure dir or \`..'] + +Installation directories: + --prefix=PREFIX install architecture-independent files in PREFIX + @<:@@S|@ac_default_prefix@:>@ + --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX + @<:@PREFIX@:>@ + +By default, \`make install' will install all the files in +\`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc. You can specify +an installation prefix other than \`$ac_default_prefix' using \`--prefix', +for instance \`--prefix=\$HOME'. + +For better control, use the options below. + +Fine tuning of the installation directories: + --bindir=DIR user executables [EPREFIX/bin] + --sbindir=DIR system admin executables [EPREFIX/sbin] + --libexecdir=DIR program executables [EPREFIX/libexec] + --sysconfdir=DIR read-only single-machine data [PREFIX/etc] + --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com] + --localstatedir=DIR modifiable single-machine data [PREFIX/var] + --libdir=DIR object code libraries [EPREFIX/lib] + --includedir=DIR C header files [PREFIX/include] + --oldincludedir=DIR C header files for non-gcc [/usr/include] + --datarootdir=DIR read-only arch.-independent data root [PREFIX/share] + --datadir=DIR read-only architecture-independent data [DATAROOTDIR] + --infodir=DIR info documentation [DATAROOTDIR/info] + --localedir=DIR locale-dependent data [DATAROOTDIR/locale] + --mandir=DIR man documentation [DATAROOTDIR/man] + --docdir=DIR documentation root @<:@DATAROOTDIR/doc/zookeeper@:>@ + --htmldir=DIR html documentation [DOCDIR] + --dvidir=DIR dvi documentation [DOCDIR] + --pdfdir=DIR pdf documentation [DOCDIR] + --psdir=DIR ps documentation [DOCDIR] +_ACEOF + + cat <<\_ACEOF + +Program names: + --program-prefix=PREFIX prepend PREFIX to installed program names + --program-suffix=SUFFIX append SUFFIX to installed program names + --program-transform-name=PROGRAM run sed PROGRAM on installed program names +_ACEOF +fi + +if test -n "$ac_init_help"; then + case $ac_init_help in + short | recursive ) echo "Configuration of zookeeper C client 3.4.5:";; + esac + cat <<\_ACEOF + +Optional Features: + --disable-option-checking ignore unrecognized --enable/--with options + --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) + --enable-FEATURE[=ARG] include FEATURE [ARG=yes] + --disable-doxygen-doc don't generate any doxygen documentation + --disable-doxygen-dot don't generate graphics for doxygen documentation + --enable-doxygen-man generate doxygen manual pages + --enable-doxygen-rtf generate doxygen RTF documentation + --enable-doxygen-xml generate doxygen XML documentation + --enable-doxygen-chm generate doxygen compressed HTML help documentation + --enable-doxygen-chi generate doxygen seperate compressed HTML help index + file + --disable-doxygen-html don't generate doxygen plain HTML documentation + --enable-doxygen-ps generate doxygen PostScript documentation + --enable-doxygen-pdf generate doxygen PDF documentation + --disable-dependency-tracking speeds up one-time build + --enable-dependency-tracking do not reject slow dependency extractors + --enable-debug enable debug build @<:@default=no@:>@ + +Optional Packages: + --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] + --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) + --without-cppunit do not use CPPUNIT + --with-syncapi build with support for SyncAPI @<:@default=yes@:>@ + +Some influential environment variables: + DOXYGEN_PAPER_SIZE + a4wide (default), a4, letter, legal or executive + CC C compiler command + CFLAGS C compiler flags + LDFLAGS linker flags, e.g. -L if you have libraries in a + nonstandard directory + LIBS libraries to pass to the linker, e.g. -l + CPPFLAGS (Objective) C/C++ preprocessor flags, e.g. -I if + you have headers in a nonstandard directory + CXX C++ compiler command + CXXFLAGS C++ compiler flags + CPP C preprocessor + +Use these variables to override the choices made by `configure' or to help +it to find libraries and programs with nonstandard names/locations. + +Report bugs to . +_ACEOF +ac_status=$? +fi + +if test "$ac_init_help" = "recursive"; then + # If there are subdirs, report their specific --help. + for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue + test -d "$ac_dir" || + { cd "$srcdir" && ac_pwd=`pwd` && srcdir=. && test -d "$ac_dir"; } || + continue + ac_builddir=. + +case "$ac_dir" in +.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; +*) + ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` + # A ".." for each directory in $ac_dir_suffix. + ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` + case $ac_top_builddir_sub in + "") ac_top_builddir_sub=. ac_top_build_prefix= ;; + *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; + esac ;; +esac +ac_abs_top_builddir=$ac_pwd +ac_abs_builddir=$ac_pwd$ac_dir_suffix +# for backward compatibility: +ac_top_builddir=$ac_top_build_prefix + +case $srcdir in + .) # We are building in place. + ac_srcdir=. + ac_top_srcdir=$ac_top_builddir_sub + ac_abs_top_srcdir=$ac_pwd ;; + [\\/]* | ?:[\\/]* ) # Absolute name. + ac_srcdir=$srcdir$ac_dir_suffix; + ac_top_srcdir=$srcdir + ac_abs_top_srcdir=$srcdir ;; + *) # Relative name. + ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix + ac_top_srcdir=$ac_top_build_prefix$srcdir + ac_abs_top_srcdir=$ac_pwd/$srcdir ;; +esac +ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix + + cd "$ac_dir" || { ac_status=$?; continue; } + # Check for guested configure. + if test -f "$ac_srcdir/configure.gnu"; then + echo && + $SHELL "$ac_srcdir/configure.gnu" --help=recursive + elif test -f "$ac_srcdir/configure"; then + echo && + $SHELL "$ac_srcdir/configure" --help=recursive + else + $as_echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2 + fi || ac_status=$? + cd "$ac_pwd" || { ac_status=$?; break; } + done +fi + +test -n "$ac_init_help" && exit $ac_status +if $ac_init_version; then + cat <<\_ACEOF +zookeeper C client configure 3.4.5 +generated by GNU Autoconf 2.69 + +Copyright (C) 2012 Free Software Foundation, Inc. +This configure script is free software; the Free Software Foundation +gives unlimited permission to copy, distribute and modify it. +_ACEOF + exit +fi + +## ------------------------ ## +## Autoconf initialization. ## +## ------------------------ ## + +@%:@ ac_fn_c_try_compile LINENO +@%:@ -------------------------- +@%:@ Try to compile conftest.@S|@ac_ext, and return whether this succeeded. +ac_fn_c_try_compile () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + rm -f conftest.$ac_objext + if { { ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_compile") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + grep -v '^ *+' conftest.err >conftest.er1 + cat conftest.er1 >&5 + mv -f conftest.er1 conftest.err + fi + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then : + ac_retval=0 +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_retval=1 +fi + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + as_fn_set_status $ac_retval + +} @%:@ ac_fn_c_try_compile + +@%:@ ac_fn_cxx_try_compile LINENO +@%:@ ---------------------------- +@%:@ Try to compile conftest.@S|@ac_ext, and return whether this succeeded. +ac_fn_cxx_try_compile () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + rm -f conftest.$ac_objext + if { { ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_compile") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + grep -v '^ *+' conftest.err >conftest.er1 + cat conftest.er1 >&5 + mv -f conftest.er1 conftest.err + fi + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then : + ac_retval=0 +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_retval=1 +fi + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + as_fn_set_status $ac_retval + +} @%:@ ac_fn_cxx_try_compile + +@%:@ ac_fn_c_try_link LINENO +@%:@ ----------------------- +@%:@ Try to link conftest.@S|@ac_ext, and return whether this succeeded. +ac_fn_c_try_link () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + rm -f conftest.$ac_objext conftest$ac_exeext + if { { ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_link") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + grep -v '^ *+' conftest.err >conftest.er1 + cat conftest.er1 >&5 + mv -f conftest.er1 conftest.err + fi + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && { + test "$cross_compiling" = yes || + test -x conftest$ac_exeext + }; then : + ac_retval=0 +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_retval=1 +fi + # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information + # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would + # interfere with the next link command; also delete a directory that is + # left behind by Apple's compiler. We do this before executing the actions. + rm -rf conftest.dSYM conftest_ipa8_conftest.oo + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + as_fn_set_status $ac_retval + +} @%:@ ac_fn_c_try_link + +@%:@ ac_fn_c_try_cpp LINENO +@%:@ ---------------------- +@%:@ Try to preprocess conftest.@S|@ac_ext, and return whether this succeeded. +ac_fn_c_try_cpp () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + if { { ac_try="$ac_cpp conftest.$ac_ext" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + grep -v '^ *+' conftest.err >conftest.er1 + cat conftest.er1 >&5 + mv -f conftest.er1 conftest.err + fi + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } > conftest.i && { + test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || + test ! -s conftest.err + }; then : + ac_retval=0 +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_retval=1 +fi + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + as_fn_set_status $ac_retval + +} @%:@ ac_fn_c_try_cpp + +@%:@ ac_fn_c_try_run LINENO +@%:@ ---------------------- +@%:@ Try to link conftest.@S|@ac_ext, and return whether this succeeded. Assumes +@%:@ that executables *can* be run. +ac_fn_c_try_run () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + if { { ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_link") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && { ac_try='./conftest$ac_exeext' + { { case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; }; then : + ac_retval=0 +else + $as_echo "$as_me: program exited with status $ac_status" >&5 + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_retval=$ac_status +fi + rm -rf conftest.dSYM conftest_ipa8_conftest.oo + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + as_fn_set_status $ac_retval + +} @%:@ ac_fn_c_try_run + +@%:@ ac_fn_c_check_header_mongrel LINENO HEADER VAR INCLUDES +@%:@ ------------------------------------------------------- +@%:@ Tests whether HEADER exists, giving a warning if it cannot be compiled using +@%:@ the include files in INCLUDES and setting the cache variable VAR +@%:@ accordingly. +ac_fn_c_check_header_mongrel () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + if eval \${$3+:} false; then : + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 +$as_echo_n "checking for $2... " >&6; } +if eval \${$3+:} false; then : + $as_echo_n "(cached) " >&6 +fi +eval ac_res=\$$3 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } +else + # Is the header compilable? +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 usability" >&5 +$as_echo_n "checking $2 usability... " >&6; } +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$4 +@%:@include <$2> +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_header_compiler=yes +else + ac_header_compiler=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_compiler" >&5 +$as_echo "$ac_header_compiler" >&6; } + +# Is the header present? +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 presence" >&5 +$as_echo_n "checking $2 presence... " >&6; } +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +@%:@include <$2> +_ACEOF +if ac_fn_c_try_cpp "$LINENO"; then : + ac_header_preproc=yes +else + ac_header_preproc=no +fi +rm -f conftest.err conftest.i conftest.$ac_ext +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_preproc" >&5 +$as_echo "$ac_header_preproc" >&6; } + +# So? What about this header? +case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in #(( + yes:no: ) + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&5 +$as_echo "$as_me: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 +$as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} + ;; + no:yes:* ) + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: present but cannot be compiled" >&5 +$as_echo "$as_me: WARNING: $2: present but cannot be compiled" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: check for missing prerequisite headers?" >&5 +$as_echo "$as_me: WARNING: $2: check for missing prerequisite headers?" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: see the Autoconf documentation" >&5 +$as_echo "$as_me: WARNING: $2: see the Autoconf documentation" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&5 +$as_echo "$as_me: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 +$as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} +( $as_echo "## ---------------------------------------- ## +## Report this to user@zookeeper.apache.org ## +## ---------------------------------------- ##" + ) | sed "s/^/$as_me: WARNING: /" >&2 + ;; +esac + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 +$as_echo_n "checking for $2... " >&6; } +if eval \${$3+:} false; then : + $as_echo_n "(cached) " >&6 +else + eval "$3=\$ac_header_compiler" +fi +eval ac_res=\$$3 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } +fi + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + +} @%:@ ac_fn_c_check_header_mongrel + +@%:@ ac_fn_c_check_header_compile LINENO HEADER VAR INCLUDES +@%:@ ------------------------------------------------------- +@%:@ Tests whether HEADER exists and can be compiled using the include files in +@%:@ INCLUDES, setting the cache variable VAR accordingly. +ac_fn_c_check_header_compile () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 +$as_echo_n "checking for $2... " >&6; } +if eval \${$3+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$4 +@%:@include <$2> +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + eval "$3=yes" +else + eval "$3=no" +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +eval ac_res=\$$3 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + +} @%:@ ac_fn_c_check_header_compile + +@%:@ ac_fn_c_check_type LINENO TYPE VAR INCLUDES +@%:@ ------------------------------------------- +@%:@ Tests whether TYPE exists after having included INCLUDES, setting cache +@%:@ variable VAR accordingly. +ac_fn_c_check_type () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 +$as_echo_n "checking for $2... " >&6; } +if eval \${$3+:} false; then : + $as_echo_n "(cached) " >&6 +else + eval "$3=no" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$4 +int +main () +{ +if (sizeof ($2)) + return 0; + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$4 +int +main () +{ +if (sizeof (($2))) + return 0; + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + +else + eval "$3=yes" +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +eval ac_res=\$$3 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + +} @%:@ ac_fn_c_check_type + +@%:@ ac_fn_c_check_func LINENO FUNC VAR +@%:@ ---------------------------------- +@%:@ Tests whether FUNC exists, setting the cache variable VAR accordingly +ac_fn_c_check_func () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 +$as_echo_n "checking for $2... " >&6; } +if eval \${$3+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +/* Define $2 to an innocuous variant, in case declares $2. + For example, HP-UX 11i declares gettimeofday. */ +#define $2 innocuous_$2 + +/* System header to define __stub macros and hopefully few prototypes, + which can conflict with char $2 (); below. + Prefer to if __STDC__ is defined, since + exists even on freestanding compilers. */ + +#ifdef __STDC__ +# include +#else +# include +#endif + +#undef $2 + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char $2 (); +/* The GNU C library defines this for functions which it implements + to always fail with ENOSYS. Some functions are actually named + something starting with __ and the normal name is an alias. */ +#if defined __stub_$2 || defined __stub___$2 +choke me +#endif + +int +main () +{ +return $2 (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + eval "$3=yes" +else + eval "$3=no" +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +fi +eval ac_res=\$$3 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + +} @%:@ ac_fn_c_check_func +cat >config.log <<_ACEOF +This file contains any messages produced by compilers while +running configure, to aid debugging if configure makes a mistake. + +It was created by zookeeper C client $as_me 3.4.5, which was +generated by GNU Autoconf 2.69. Invocation command line was + + $ $0 $@ + +_ACEOF +exec 5>>config.log +{ +cat <<_ASUNAME +## --------- ## +## Platform. ## +## --------- ## + +hostname = `(hostname || uname -n) 2>/dev/null | sed 1q` +uname -m = `(uname -m) 2>/dev/null || echo unknown` +uname -r = `(uname -r) 2>/dev/null || echo unknown` +uname -s = `(uname -s) 2>/dev/null || echo unknown` +uname -v = `(uname -v) 2>/dev/null || echo unknown` + +/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown` +/bin/uname -X = `(/bin/uname -X) 2>/dev/null || echo unknown` + +/bin/arch = `(/bin/arch) 2>/dev/null || echo unknown` +/usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null || echo unknown` +/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown` +/usr/bin/hostinfo = `(/usr/bin/hostinfo) 2>/dev/null || echo unknown` +/bin/machine = `(/bin/machine) 2>/dev/null || echo unknown` +/usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null || echo unknown` +/bin/universe = `(/bin/universe) 2>/dev/null || echo unknown` + +_ASUNAME + +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + $as_echo "PATH: $as_dir" + done +IFS=$as_save_IFS + +} >&5 + +cat >&5 <<_ACEOF + + +## ----------- ## +## Core tests. ## +## ----------- ## + +_ACEOF + + +# Keep a trace of the command line. +# Strip out --no-create and --no-recursion so they do not pile up. +# Strip out --silent because we don't want to record it for future runs. +# Also quote any args containing shell meta-characters. +# Make two passes to allow for proper duplicate-argument suppression. +ac_configure_args= +ac_configure_args0= +ac_configure_args1= +ac_must_keep_next=false +for ac_pass in 1 2 +do + for ac_arg + do + case $ac_arg in + -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;; + -q | -quiet | --quiet | --quie | --qui | --qu | --q \ + | -silent | --silent | --silen | --sile | --sil) + continue ;; + *\'*) + ac_arg=`$as_echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; + esac + case $ac_pass in + 1) as_fn_append ac_configure_args0 " '$ac_arg'" ;; + 2) + as_fn_append ac_configure_args1 " '$ac_arg'" + if test $ac_must_keep_next = true; then + ac_must_keep_next=false # Got value, back to normal. + else + case $ac_arg in + *=* | --config-cache | -C | -disable-* | --disable-* \ + | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \ + | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \ + | -with-* | --with-* | -without-* | --without-* | --x) + case "$ac_configure_args0 " in + "$ac_configure_args1"*" '$ac_arg' "* ) continue ;; + esac + ;; + -* ) ac_must_keep_next=true ;; + esac + fi + as_fn_append ac_configure_args " '$ac_arg'" + ;; + esac + done +done +{ ac_configure_args0=; unset ac_configure_args0;} +{ ac_configure_args1=; unset ac_configure_args1;} + +# When interrupted or exit'd, cleanup temporary files, and complete +# config.log. We remove comments because anyway the quotes in there +# would cause problems or look ugly. +# WARNING: Use '\'' to represent an apostrophe within the trap. +# WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug. +trap 'exit_status=$? + # Save into config.log some information that might help in debugging. + { + echo + + $as_echo "## ---------------- ## +## Cache variables. ## +## ---------------- ##" + echo + # The following way of writing the cache mishandles newlines in values, +( + for ac_var in `(set) 2>&1 | sed -n '\''s/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'\''`; do + eval ac_val=\$$ac_var + case $ac_val in #( + *${as_nl}*) + case $ac_var in #( + *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 +$as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; + esac + case $ac_var in #( + _ | IFS | as_nl) ;; #( + BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( + *) { eval $ac_var=; unset $ac_var;} ;; + esac ;; + esac + done + (set) 2>&1 | + case $as_nl`(ac_space='\'' '\''; set) 2>&1` in #( + *${as_nl}ac_space=\ *) + sed -n \ + "s/'\''/'\''\\\\'\'''\''/g; + s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\''\\2'\''/p" + ;; #( + *) + sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" + ;; + esac | + sort +) + echo + + $as_echo "## ----------------- ## +## Output variables. ## +## ----------------- ##" + echo + for ac_var in $ac_subst_vars + do + eval ac_val=\$$ac_var + case $ac_val in + *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; + esac + $as_echo "$ac_var='\''$ac_val'\''" + done | sort + echo + + if test -n "$ac_subst_files"; then + $as_echo "## ------------------- ## +## File substitutions. ## +## ------------------- ##" + echo + for ac_var in $ac_subst_files + do + eval ac_val=\$$ac_var + case $ac_val in + *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; + esac + $as_echo "$ac_var='\''$ac_val'\''" + done | sort + echo + fi + + if test -s confdefs.h; then + $as_echo "## ----------- ## +## confdefs.h. ## +## ----------- ##" + echo + cat confdefs.h + echo + fi + test "$ac_signal" != 0 && + $as_echo "$as_me: caught signal $ac_signal" + $as_echo "$as_me: exit $exit_status" + } >&5 + rm -f core *.core core.conftest.* && + rm -f -r conftest* confdefs* conf$$* $ac_clean_files && + exit $exit_status +' 0 +for ac_signal in 1 2 13 15; do + trap 'ac_signal='$ac_signal'; as_fn_exit 1' $ac_signal +done +ac_signal=0 + +# confdefs.h avoids OS command line length limits that DEFS can exceed. +rm -f -r conftest* confdefs.h + +$as_echo "/* confdefs.h */" > confdefs.h + +# Predefined preprocessor variables. + +cat >>confdefs.h <<_ACEOF +@%:@define PACKAGE_NAME "$PACKAGE_NAME" +_ACEOF + +cat >>confdefs.h <<_ACEOF +@%:@define PACKAGE_TARNAME "$PACKAGE_TARNAME" +_ACEOF + +cat >>confdefs.h <<_ACEOF +@%:@define PACKAGE_VERSION "$PACKAGE_VERSION" +_ACEOF + +cat >>confdefs.h <<_ACEOF +@%:@define PACKAGE_STRING "$PACKAGE_STRING" +_ACEOF + +cat >>confdefs.h <<_ACEOF +@%:@define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT" +_ACEOF + +cat >>confdefs.h <<_ACEOF +@%:@define PACKAGE_URL "$PACKAGE_URL" +_ACEOF + + +# Let the site file select an alternate cache file if it wants to. +# Prefer an explicitly selected file to automatically selected ones. +ac_site_file1=NONE +ac_site_file2=NONE +if test -n "$CONFIG_SITE"; then + # We do not want a PATH search for config.site. + case $CONFIG_SITE in @%:@(( + -*) ac_site_file1=./$CONFIG_SITE;; + */*) ac_site_file1=$CONFIG_SITE;; + *) ac_site_file1=./$CONFIG_SITE;; + esac +elif test "x$prefix" != xNONE; then + ac_site_file1=$prefix/share/config.site + ac_site_file2=$prefix/etc/config.site +else + ac_site_file1=$ac_default_prefix/share/config.site + ac_site_file2=$ac_default_prefix/etc/config.site +fi +for ac_site_file in "$ac_site_file1" "$ac_site_file2" +do + test "x$ac_site_file" = xNONE && continue + if test /dev/null != "$ac_site_file" && test -r "$ac_site_file"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: loading site script $ac_site_file" >&5 +$as_echo "$as_me: loading site script $ac_site_file" >&6;} + sed 's/^/| /' "$ac_site_file" >&5 + . "$ac_site_file" \ + || { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "failed to load site script $ac_site_file +See \`config.log' for more details" "$LINENO" 5; } + fi +done + +if test -r "$cache_file"; then + # Some versions of bash will fail to source /dev/null (special files + # actually), so we avoid doing that. DJGPP emulates it as a regular file. + if test /dev/null != "$cache_file" && test -f "$cache_file"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: loading cache $cache_file" >&5 +$as_echo "$as_me: loading cache $cache_file" >&6;} + case $cache_file in + [\\/]* | ?:[\\/]* ) . "$cache_file";; + *) . "./$cache_file";; + esac + fi +else + { $as_echo "$as_me:${as_lineno-$LINENO}: creating cache $cache_file" >&5 +$as_echo "$as_me: creating cache $cache_file" >&6;} + >$cache_file +fi + +# Check that the precious variables saved in the cache have kept the same +# value. +ac_cache_corrupted=false +for ac_var in $ac_precious_vars; do + eval ac_old_set=\$ac_cv_env_${ac_var}_set + eval ac_new_set=\$ac_env_${ac_var}_set + eval ac_old_val=\$ac_cv_env_${ac_var}_value + eval ac_new_val=\$ac_env_${ac_var}_value + case $ac_old_set,$ac_new_set in + set,) + { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5 +$as_echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;} + ac_cache_corrupted=: ;; + ,set) + { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was not set in the previous run" >&5 +$as_echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;} + ac_cache_corrupted=: ;; + ,);; + *) + if test "x$ac_old_val" != "x$ac_new_val"; then + # differences in whitespace do not lead to failure. + ac_old_val_w=`echo x $ac_old_val` + ac_new_val_w=`echo x $ac_new_val` + if test "$ac_old_val_w" != "$ac_new_val_w"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' has changed since the previous run:" >&5 +$as_echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;} + ac_cache_corrupted=: + else + { $as_echo "$as_me:${as_lineno-$LINENO}: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&5 +$as_echo "$as_me: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&2;} + eval $ac_var=\$ac_old_val + fi + { $as_echo "$as_me:${as_lineno-$LINENO}: former value: \`$ac_old_val'" >&5 +$as_echo "$as_me: former value: \`$ac_old_val'" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: current value: \`$ac_new_val'" >&5 +$as_echo "$as_me: current value: \`$ac_new_val'" >&2;} + fi;; + esac + # Pass precious variables to config.status. + if test "$ac_new_set" = set; then + case $ac_new_val in + *\'*) ac_arg=$ac_var=`$as_echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;; + *) ac_arg=$ac_var=$ac_new_val ;; + esac + case " $ac_configure_args " in + *" '$ac_arg' "*) ;; # Avoid dups. Use of quotes ensures accuracy. + *) as_fn_append ac_configure_args " '$ac_arg'" ;; + esac + fi +done +if $ac_cache_corrupted; then + { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build" >&5 +$as_echo "$as_me: error: changes in the environment can compromise the build" >&2;} + as_fn_error $? "run \`make distclean' and/or \`rm $cache_file' and start over" "$LINENO" 5 +fi +## -------------------- ## +## Main body of script. ## +## -------------------- ## + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + + + +# Save initial CFLAGS and CXXFLAGS values before AC_PROG_CC and AC_PROG_CXX +init_cflags="$CFLAGS" +init_cxxflags="$CXXFLAGS" + +# initialize Doxygen support + + + + + + + + + + +# Files: +DX_PROJECT=zookeeper + +DX_CONFIG=c-doc.Doxyfile + +DX_DOCDIR=docs + + +# Environment variables used inside doxygen.cfg: +DX_ENV="$DX_ENV SRCDIR='$srcdir'" + +DX_ENV="$DX_ENV PROJECT='$DX_PROJECT'" + +DX_ENV="$DX_ENV DOCDIR='$DX_DOCDIR'" + +DX_ENV="$DX_ENV VERSION='$PACKAGE_VERSION'" + + +# Doxygen itself: + + + + @%:@ Check whether --enable-doxygen-doc was given. +if test "${enable_doxygen_doc+set}" = set; then : + enableval=$enable_doxygen_doc; +case "$enableval" in +#( +y|Y|yes|Yes|YES) + DX_FLAG_doc=1 + + +;; #( +n|N|no|No|NO) + DX_FLAG_doc=0 + +;; #( +*) + as_fn_error $? "invalid value '$enableval' given to doxygen-doc" "$LINENO" 5 +;; +esac + +else + +DX_FLAG_doc=1 + + + +fi + +if test "$DX_FLAG_doc" = 1; then + +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}doxygen", so it can be a program name with args. +set dummy ${ac_tool_prefix}doxygen; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_path_DX_DOXYGEN+:} false; then : + $as_echo_n "(cached) " >&6 +else + case $DX_DOXYGEN in + [\\/]* | ?:[\\/]*) + ac_cv_path_DX_DOXYGEN="$DX_DOXYGEN" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_path_DX_DOXYGEN="$as_dir/$ac_word$ac_exec_ext" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + ;; +esac +fi +DX_DOXYGEN=$ac_cv_path_DX_DOXYGEN +if test -n "$DX_DOXYGEN"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DX_DOXYGEN" >&5 +$as_echo "$DX_DOXYGEN" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_path_DX_DOXYGEN"; then + ac_pt_DX_DOXYGEN=$DX_DOXYGEN + # Extract the first word of "doxygen", so it can be a program name with args. +set dummy doxygen; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_path_ac_pt_DX_DOXYGEN+:} false; then : + $as_echo_n "(cached) " >&6 +else + case $ac_pt_DX_DOXYGEN in + [\\/]* | ?:[\\/]*) + ac_cv_path_ac_pt_DX_DOXYGEN="$ac_pt_DX_DOXYGEN" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_path_ac_pt_DX_DOXYGEN="$as_dir/$ac_word$ac_exec_ext" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + ;; +esac +fi +ac_pt_DX_DOXYGEN=$ac_cv_path_ac_pt_DX_DOXYGEN +if test -n "$ac_pt_DX_DOXYGEN"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_pt_DX_DOXYGEN" >&5 +$as_echo "$ac_pt_DX_DOXYGEN" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_pt_DX_DOXYGEN" = x; then + DX_DOXYGEN="" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + DX_DOXYGEN=$ac_pt_DX_DOXYGEN + fi +else + DX_DOXYGEN="$ac_cv_path_DX_DOXYGEN" +fi + +if test "$DX_FLAG_$DX_CURRENT_FEATURE$DX_DOXYGEN" = 1; then + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: doxygen not found - will not generate any doxygen documentation" >&5 +$as_echo "$as_me: WARNING: doxygen not found - will not generate any doxygen documentation" >&2;} + DX_FLAG_doc=0 + +fi + + +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}perl", so it can be a program name with args. +set dummy ${ac_tool_prefix}perl; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_path_DX_PERL+:} false; then : + $as_echo_n "(cached) " >&6 +else + case $DX_PERL in + [\\/]* | ?:[\\/]*) + ac_cv_path_DX_PERL="$DX_PERL" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_path_DX_PERL="$as_dir/$ac_word$ac_exec_ext" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + ;; +esac +fi +DX_PERL=$ac_cv_path_DX_PERL +if test -n "$DX_PERL"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DX_PERL" >&5 +$as_echo "$DX_PERL" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_path_DX_PERL"; then + ac_pt_DX_PERL=$DX_PERL + # Extract the first word of "perl", so it can be a program name with args. +set dummy perl; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_path_ac_pt_DX_PERL+:} false; then : + $as_echo_n "(cached) " >&6 +else + case $ac_pt_DX_PERL in + [\\/]* | ?:[\\/]*) + ac_cv_path_ac_pt_DX_PERL="$ac_pt_DX_PERL" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_path_ac_pt_DX_PERL="$as_dir/$ac_word$ac_exec_ext" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + ;; +esac +fi +ac_pt_DX_PERL=$ac_cv_path_ac_pt_DX_PERL +if test -n "$ac_pt_DX_PERL"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_pt_DX_PERL" >&5 +$as_echo "$ac_pt_DX_PERL" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_pt_DX_PERL" = x; then + DX_PERL="" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + DX_PERL=$ac_pt_DX_PERL + fi +else + DX_PERL="$ac_cv_path_DX_PERL" +fi + +if test "$DX_FLAG_$DX_CURRENT_FEATURE$DX_PERL" = 1; then + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: perl not found - will not generate any doxygen documentation" >&5 +$as_echo "$as_me: WARNING: perl not found - will not generate any doxygen documentation" >&2;} + DX_FLAG_doc=0 + +fi + + : +fi +if test "$DX_FLAG_doc" = 1; then + if :; then + DX_COND_doc_TRUE= + DX_COND_doc_FALSE='#' +else + DX_COND_doc_TRUE='#' + DX_COND_doc_FALSE= +fi + + DX_ENV="$DX_ENV PERL_PATH='$DX_PERL'" + + : +else + if false; then + DX_COND_doc_TRUE= + DX_COND_doc_FALSE='#' +else + DX_COND_doc_TRUE='#' + DX_COND_doc_FALSE= +fi + + + : +fi + + +# Dot for graphics: + + + + @%:@ Check whether --enable-doxygen-dot was given. +if test "${enable_doxygen_dot+set}" = set; then : + enableval=$enable_doxygen_dot; +case "$enableval" in +#( +y|Y|yes|Yes|YES) + DX_FLAG_dot=1 + + +test "$DX_FLAG_doc" = "1" \ +|| as_fn_error $? "doxygen-dot requires doxygen-dot" "$LINENO" 5 + +;; #( +n|N|no|No|NO) + DX_FLAG_dot=0 + +;; #( +*) + as_fn_error $? "invalid value '$enableval' given to doxygen-dot" "$LINENO" 5 +;; +esac + +else + +DX_FLAG_dot=1 + + +test "$DX_FLAG_doc" = "1" || DX_FLAG_dot=0 + + + +fi + +if test "$DX_FLAG_dot" = 1; then + +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}dot", so it can be a program name with args. +set dummy ${ac_tool_prefix}dot; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_path_DX_DOT+:} false; then : + $as_echo_n "(cached) " >&6 +else + case $DX_DOT in + [\\/]* | ?:[\\/]*) + ac_cv_path_DX_DOT="$DX_DOT" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_path_DX_DOT="$as_dir/$ac_word$ac_exec_ext" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + ;; +esac +fi +DX_DOT=$ac_cv_path_DX_DOT +if test -n "$DX_DOT"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DX_DOT" >&5 +$as_echo "$DX_DOT" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_path_DX_DOT"; then + ac_pt_DX_DOT=$DX_DOT + # Extract the first word of "dot", so it can be a program name with args. +set dummy dot; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_path_ac_pt_DX_DOT+:} false; then : + $as_echo_n "(cached) " >&6 +else + case $ac_pt_DX_DOT in + [\\/]* | ?:[\\/]*) + ac_cv_path_ac_pt_DX_DOT="$ac_pt_DX_DOT" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_path_ac_pt_DX_DOT="$as_dir/$ac_word$ac_exec_ext" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + ;; +esac +fi +ac_pt_DX_DOT=$ac_cv_path_ac_pt_DX_DOT +if test -n "$ac_pt_DX_DOT"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_pt_DX_DOT" >&5 +$as_echo "$ac_pt_DX_DOT" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_pt_DX_DOT" = x; then + DX_DOT="" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + DX_DOT=$ac_pt_DX_DOT + fi +else + DX_DOT="$ac_cv_path_DX_DOT" +fi + +if test "$DX_FLAG_$DX_CURRENT_FEATURE$DX_DOT" = 1; then + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: dot not found - will not generate graphics for doxygen documentation" >&5 +$as_echo "$as_me: WARNING: dot not found - will not generate graphics for doxygen documentation" >&2;} + DX_FLAG_dot=0 + +fi + + : +fi +if test "$DX_FLAG_dot" = 1; then + if :; then + DX_COND_dot_TRUE= + DX_COND_dot_FALSE='#' +else + DX_COND_dot_TRUE='#' + DX_COND_dot_FALSE= +fi + + DX_ENV="$DX_ENV HAVE_DOT='YES'" + + DX_ENV="$DX_ENV DOT_PATH='`expr ".$DX_DOT" : '\(\.\)[^/]*$' \| "x$DX_DOT" : 'x\(.*\)/[^/]*$'`'" + + : +else + if false; then + DX_COND_dot_TRUE= + DX_COND_dot_FALSE='#' +else + DX_COND_dot_TRUE='#' + DX_COND_dot_FALSE= +fi + + DX_ENV="$DX_ENV HAVE_DOT='NO'" + + : +fi + + +# Man pages generation: + + + + @%:@ Check whether --enable-doxygen-man was given. +if test "${enable_doxygen_man+set}" = set; then : + enableval=$enable_doxygen_man; +case "$enableval" in +#( +y|Y|yes|Yes|YES) + DX_FLAG_man=1 + + +test "$DX_FLAG_doc" = "1" \ +|| as_fn_error $? "doxygen-man requires doxygen-man" "$LINENO" 5 + +;; #( +n|N|no|No|NO) + DX_FLAG_man=0 + +;; #( +*) + as_fn_error $? "invalid value '$enableval' given to doxygen-man" "$LINENO" 5 +;; +esac + +else + +DX_FLAG_man=0 + + +test "$DX_FLAG_doc" = "1" || DX_FLAG_man=0 + + + +fi + +if test "$DX_FLAG_man" = 1; then + + : +fi +if test "$DX_FLAG_man" = 1; then + if :; then + DX_COND_man_TRUE= + DX_COND_man_FALSE='#' +else + DX_COND_man_TRUE='#' + DX_COND_man_FALSE= +fi + + DX_ENV="$DX_ENV GENERATE_MAN='YES'" + + : +else + if false; then + DX_COND_man_TRUE= + DX_COND_man_FALSE='#' +else + DX_COND_man_TRUE='#' + DX_COND_man_FALSE= +fi + + DX_ENV="$DX_ENV GENERATE_MAN='NO'" + + : +fi + + +# RTF file generation: + + + + @%:@ Check whether --enable-doxygen-rtf was given. +if test "${enable_doxygen_rtf+set}" = set; then : + enableval=$enable_doxygen_rtf; +case "$enableval" in +#( +y|Y|yes|Yes|YES) + DX_FLAG_rtf=1 + + +test "$DX_FLAG_doc" = "1" \ +|| as_fn_error $? "doxygen-rtf requires doxygen-rtf" "$LINENO" 5 + +;; #( +n|N|no|No|NO) + DX_FLAG_rtf=0 + +;; #( +*) + as_fn_error $? "invalid value '$enableval' given to doxygen-rtf" "$LINENO" 5 +;; +esac + +else + +DX_FLAG_rtf=0 + + +test "$DX_FLAG_doc" = "1" || DX_FLAG_rtf=0 + + + +fi + +if test "$DX_FLAG_rtf" = 1; then + + : +fi +if test "$DX_FLAG_rtf" = 1; then + if :; then + DX_COND_rtf_TRUE= + DX_COND_rtf_FALSE='#' +else + DX_COND_rtf_TRUE='#' + DX_COND_rtf_FALSE= +fi + + DX_ENV="$DX_ENV GENERATE_RTF='YES'" + + : +else + if false; then + DX_COND_rtf_TRUE= + DX_COND_rtf_FALSE='#' +else + DX_COND_rtf_TRUE='#' + DX_COND_rtf_FALSE= +fi + + DX_ENV="$DX_ENV GENERATE_RTF='NO'" + + : +fi + + +# XML file generation: + + + + @%:@ Check whether --enable-doxygen-xml was given. +if test "${enable_doxygen_xml+set}" = set; then : + enableval=$enable_doxygen_xml; +case "$enableval" in +#( +y|Y|yes|Yes|YES) + DX_FLAG_xml=1 + + +test "$DX_FLAG_doc" = "1" \ +|| as_fn_error $? "doxygen-xml requires doxygen-xml" "$LINENO" 5 + +;; #( +n|N|no|No|NO) + DX_FLAG_xml=0 + +;; #( +*) + as_fn_error $? "invalid value '$enableval' given to doxygen-xml" "$LINENO" 5 +;; +esac + +else + +DX_FLAG_xml=0 + + +test "$DX_FLAG_doc" = "1" || DX_FLAG_xml=0 + + + +fi + +if test "$DX_FLAG_xml" = 1; then + + : +fi +if test "$DX_FLAG_xml" = 1; then + if :; then + DX_COND_xml_TRUE= + DX_COND_xml_FALSE='#' +else + DX_COND_xml_TRUE='#' + DX_COND_xml_FALSE= +fi + + DX_ENV="$DX_ENV GENERATE_XML='YES'" + + : +else + if false; then + DX_COND_xml_TRUE= + DX_COND_xml_FALSE='#' +else + DX_COND_xml_TRUE='#' + DX_COND_xml_FALSE= +fi + + DX_ENV="$DX_ENV GENERATE_XML='NO'" + + : +fi + + +# (Compressed) HTML help generation: + + + + @%:@ Check whether --enable-doxygen-chm was given. +if test "${enable_doxygen_chm+set}" = set; then : + enableval=$enable_doxygen_chm; +case "$enableval" in +#( +y|Y|yes|Yes|YES) + DX_FLAG_chm=1 + + +test "$DX_FLAG_doc" = "1" \ +|| as_fn_error $? "doxygen-chm requires doxygen-chm" "$LINENO" 5 + +;; #( +n|N|no|No|NO) + DX_FLAG_chm=0 + +;; #( +*) + as_fn_error $? "invalid value '$enableval' given to doxygen-chm" "$LINENO" 5 +;; +esac + +else + +DX_FLAG_chm=0 + + +test "$DX_FLAG_doc" = "1" || DX_FLAG_chm=0 + + + +fi + +if test "$DX_FLAG_chm" = 1; then + +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}hhc", so it can be a program name with args. +set dummy ${ac_tool_prefix}hhc; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_path_DX_HHC+:} false; then : + $as_echo_n "(cached) " >&6 +else + case $DX_HHC in + [\\/]* | ?:[\\/]*) + ac_cv_path_DX_HHC="$DX_HHC" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_path_DX_HHC="$as_dir/$ac_word$ac_exec_ext" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + ;; +esac +fi +DX_HHC=$ac_cv_path_DX_HHC +if test -n "$DX_HHC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DX_HHC" >&5 +$as_echo "$DX_HHC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_path_DX_HHC"; then + ac_pt_DX_HHC=$DX_HHC + # Extract the first word of "hhc", so it can be a program name with args. +set dummy hhc; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_path_ac_pt_DX_HHC+:} false; then : + $as_echo_n "(cached) " >&6 +else + case $ac_pt_DX_HHC in + [\\/]* | ?:[\\/]*) + ac_cv_path_ac_pt_DX_HHC="$ac_pt_DX_HHC" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_path_ac_pt_DX_HHC="$as_dir/$ac_word$ac_exec_ext" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + ;; +esac +fi +ac_pt_DX_HHC=$ac_cv_path_ac_pt_DX_HHC +if test -n "$ac_pt_DX_HHC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_pt_DX_HHC" >&5 +$as_echo "$ac_pt_DX_HHC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_pt_DX_HHC" = x; then + DX_HHC="" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + DX_HHC=$ac_pt_DX_HHC + fi +else + DX_HHC="$ac_cv_path_DX_HHC" +fi + +if test "$DX_FLAG_$DX_CURRENT_FEATURE$DX_HHC" = 1; then + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: hhc not found - will not generate doxygen compressed HTML help documentation" >&5 +$as_echo "$as_me: WARNING: hhc not found - will not generate doxygen compressed HTML help documentation" >&2;} + DX_FLAG_chm=0 + +fi + + : +fi +if test "$DX_FLAG_chm" = 1; then + if :; then + DX_COND_chm_TRUE= + DX_COND_chm_FALSE='#' +else + DX_COND_chm_TRUE='#' + DX_COND_chm_FALSE= +fi + + DX_ENV="$DX_ENV HHC_PATH='$DX_HHC'" + + DX_ENV="$DX_ENV GENERATE_HTML='YES'" + + DX_ENV="$DX_ENV GENERATE_HTMLHELP='YES'" + + : +else + if false; then + DX_COND_chm_TRUE= + DX_COND_chm_FALSE='#' +else + DX_COND_chm_TRUE='#' + DX_COND_chm_FALSE= +fi + + DX_ENV="$DX_ENV GENERATE_HTMLHELP='NO'" + + : +fi + + +# Seperate CHI file generation. + + + + @%:@ Check whether --enable-doxygen-chi was given. +if test "${enable_doxygen_chi+set}" = set; then : + enableval=$enable_doxygen_chi; +case "$enableval" in +#( +y|Y|yes|Yes|YES) + DX_FLAG_chi=1 + + +test "$DX_FLAG_chm" = "1" \ +|| as_fn_error $? "doxygen-chi requires doxygen-chi" "$LINENO" 5 + +;; #( +n|N|no|No|NO) + DX_FLAG_chi=0 + +;; #( +*) + as_fn_error $? "invalid value '$enableval' given to doxygen-chi" "$LINENO" 5 +;; +esac + +else + +DX_FLAG_chi=0 + + +test "$DX_FLAG_chm" = "1" || DX_FLAG_chi=0 + + + +fi + +if test "$DX_FLAG_chi" = 1; then + + : +fi +if test "$DX_FLAG_chi" = 1; then + if :; then + DX_COND_chi_TRUE= + DX_COND_chi_FALSE='#' +else + DX_COND_chi_TRUE='#' + DX_COND_chi_FALSE= +fi + + DX_ENV="$DX_ENV GENERATE_CHI='YES'" + + : +else + if false; then + DX_COND_chi_TRUE= + DX_COND_chi_FALSE='#' +else + DX_COND_chi_TRUE='#' + DX_COND_chi_FALSE= +fi + + DX_ENV="$DX_ENV GENERATE_CHI='NO'" + + : +fi + + +# Plain HTML pages generation: + + + + @%:@ Check whether --enable-doxygen-html was given. +if test "${enable_doxygen_html+set}" = set; then : + enableval=$enable_doxygen_html; +case "$enableval" in +#( +y|Y|yes|Yes|YES) + DX_FLAG_html=1 + + +test "$DX_FLAG_doc" = "1" \ +|| as_fn_error $? "doxygen-html requires doxygen-html" "$LINENO" 5 + +test "$DX_FLAG_chm" = "0" \ +|| as_fn_error $? "doxygen-html contradicts doxygen-html" "$LINENO" 5 + +;; #( +n|N|no|No|NO) + DX_FLAG_html=0 + +;; #( +*) + as_fn_error $? "invalid value '$enableval' given to doxygen-html" "$LINENO" 5 +;; +esac + +else + +DX_FLAG_html=1 + + +test "$DX_FLAG_doc" = "1" || DX_FLAG_html=0 + + +test "$DX_FLAG_chm" = "0" || DX_FLAG_html=0 + + + +fi + +if test "$DX_FLAG_html" = 1; then + + : +fi +if test "$DX_FLAG_html" = 1; then + if :; then + DX_COND_html_TRUE= + DX_COND_html_FALSE='#' +else + DX_COND_html_TRUE='#' + DX_COND_html_FALSE= +fi + + DX_ENV="$DX_ENV GENERATE_HTML='YES'" + + : +else + if false; then + DX_COND_html_TRUE= + DX_COND_html_FALSE='#' +else + DX_COND_html_TRUE='#' + DX_COND_html_FALSE= +fi + + test "$DX_FLAG_chm" = 1 || DX_ENV="$DX_ENV GENERATE_HTML='NO'" + + : +fi + + +# PostScript file generation: + + + + @%:@ Check whether --enable-doxygen-ps was given. +if test "${enable_doxygen_ps+set}" = set; then : + enableval=$enable_doxygen_ps; +case "$enableval" in +#( +y|Y|yes|Yes|YES) + DX_FLAG_ps=1 + + +test "$DX_FLAG_doc" = "1" \ +|| as_fn_error $? "doxygen-ps requires doxygen-ps" "$LINENO" 5 + +;; #( +n|N|no|No|NO) + DX_FLAG_ps=0 + +;; #( +*) + as_fn_error $? "invalid value '$enableval' given to doxygen-ps" "$LINENO" 5 +;; +esac + +else + +DX_FLAG_ps=0 + + +test "$DX_FLAG_doc" = "1" || DX_FLAG_ps=0 + + + +fi + +if test "$DX_FLAG_ps" = 1; then + +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}latex", so it can be a program name with args. +set dummy ${ac_tool_prefix}latex; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_path_DX_LATEX+:} false; then : + $as_echo_n "(cached) " >&6 +else + case $DX_LATEX in + [\\/]* | ?:[\\/]*) + ac_cv_path_DX_LATEX="$DX_LATEX" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_path_DX_LATEX="$as_dir/$ac_word$ac_exec_ext" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + ;; +esac +fi +DX_LATEX=$ac_cv_path_DX_LATEX +if test -n "$DX_LATEX"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DX_LATEX" >&5 +$as_echo "$DX_LATEX" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_path_DX_LATEX"; then + ac_pt_DX_LATEX=$DX_LATEX + # Extract the first word of "latex", so it can be a program name with args. +set dummy latex; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_path_ac_pt_DX_LATEX+:} false; then : + $as_echo_n "(cached) " >&6 +else + case $ac_pt_DX_LATEX in + [\\/]* | ?:[\\/]*) + ac_cv_path_ac_pt_DX_LATEX="$ac_pt_DX_LATEX" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_path_ac_pt_DX_LATEX="$as_dir/$ac_word$ac_exec_ext" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + ;; +esac +fi +ac_pt_DX_LATEX=$ac_cv_path_ac_pt_DX_LATEX +if test -n "$ac_pt_DX_LATEX"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_pt_DX_LATEX" >&5 +$as_echo "$ac_pt_DX_LATEX" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_pt_DX_LATEX" = x; then + DX_LATEX="" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + DX_LATEX=$ac_pt_DX_LATEX + fi +else + DX_LATEX="$ac_cv_path_DX_LATEX" +fi + +if test "$DX_FLAG_$DX_CURRENT_FEATURE$DX_LATEX" = 1; then + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: latex not found - will not generate doxygen PostScript documentation" >&5 +$as_echo "$as_me: WARNING: latex not found - will not generate doxygen PostScript documentation" >&2;} + DX_FLAG_ps=0 + +fi + + +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}makeindex", so it can be a program name with args. +set dummy ${ac_tool_prefix}makeindex; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_path_DX_MAKEINDEX+:} false; then : + $as_echo_n "(cached) " >&6 +else + case $DX_MAKEINDEX in + [\\/]* | ?:[\\/]*) + ac_cv_path_DX_MAKEINDEX="$DX_MAKEINDEX" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_path_DX_MAKEINDEX="$as_dir/$ac_word$ac_exec_ext" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + ;; +esac +fi +DX_MAKEINDEX=$ac_cv_path_DX_MAKEINDEX +if test -n "$DX_MAKEINDEX"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DX_MAKEINDEX" >&5 +$as_echo "$DX_MAKEINDEX" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_path_DX_MAKEINDEX"; then + ac_pt_DX_MAKEINDEX=$DX_MAKEINDEX + # Extract the first word of "makeindex", so it can be a program name with args. +set dummy makeindex; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_path_ac_pt_DX_MAKEINDEX+:} false; then : + $as_echo_n "(cached) " >&6 +else + case $ac_pt_DX_MAKEINDEX in + [\\/]* | ?:[\\/]*) + ac_cv_path_ac_pt_DX_MAKEINDEX="$ac_pt_DX_MAKEINDEX" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_path_ac_pt_DX_MAKEINDEX="$as_dir/$ac_word$ac_exec_ext" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + ;; +esac +fi +ac_pt_DX_MAKEINDEX=$ac_cv_path_ac_pt_DX_MAKEINDEX +if test -n "$ac_pt_DX_MAKEINDEX"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_pt_DX_MAKEINDEX" >&5 +$as_echo "$ac_pt_DX_MAKEINDEX" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_pt_DX_MAKEINDEX" = x; then + DX_MAKEINDEX="" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + DX_MAKEINDEX=$ac_pt_DX_MAKEINDEX + fi +else + DX_MAKEINDEX="$ac_cv_path_DX_MAKEINDEX" +fi + +if test "$DX_FLAG_$DX_CURRENT_FEATURE$DX_MAKEINDEX" = 1; then + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: makeindex not found - will not generate doxygen PostScript documentation" >&5 +$as_echo "$as_me: WARNING: makeindex not found - will not generate doxygen PostScript documentation" >&2;} + DX_FLAG_ps=0 + +fi + + +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}dvips", so it can be a program name with args. +set dummy ${ac_tool_prefix}dvips; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_path_DX_DVIPS+:} false; then : + $as_echo_n "(cached) " >&6 +else + case $DX_DVIPS in + [\\/]* | ?:[\\/]*) + ac_cv_path_DX_DVIPS="$DX_DVIPS" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_path_DX_DVIPS="$as_dir/$ac_word$ac_exec_ext" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + ;; +esac +fi +DX_DVIPS=$ac_cv_path_DX_DVIPS +if test -n "$DX_DVIPS"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DX_DVIPS" >&5 +$as_echo "$DX_DVIPS" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_path_DX_DVIPS"; then + ac_pt_DX_DVIPS=$DX_DVIPS + # Extract the first word of "dvips", so it can be a program name with args. +set dummy dvips; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_path_ac_pt_DX_DVIPS+:} false; then : + $as_echo_n "(cached) " >&6 +else + case $ac_pt_DX_DVIPS in + [\\/]* | ?:[\\/]*) + ac_cv_path_ac_pt_DX_DVIPS="$ac_pt_DX_DVIPS" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_path_ac_pt_DX_DVIPS="$as_dir/$ac_word$ac_exec_ext" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + ;; +esac +fi +ac_pt_DX_DVIPS=$ac_cv_path_ac_pt_DX_DVIPS +if test -n "$ac_pt_DX_DVIPS"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_pt_DX_DVIPS" >&5 +$as_echo "$ac_pt_DX_DVIPS" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_pt_DX_DVIPS" = x; then + DX_DVIPS="" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + DX_DVIPS=$ac_pt_DX_DVIPS + fi +else + DX_DVIPS="$ac_cv_path_DX_DVIPS" +fi + +if test "$DX_FLAG_$DX_CURRENT_FEATURE$DX_DVIPS" = 1; then + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: dvips not found - will not generate doxygen PostScript documentation" >&5 +$as_echo "$as_me: WARNING: dvips not found - will not generate doxygen PostScript documentation" >&2;} + DX_FLAG_ps=0 + +fi + + +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}egrep", so it can be a program name with args. +set dummy ${ac_tool_prefix}egrep; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_path_DX_EGREP+:} false; then : + $as_echo_n "(cached) " >&6 +else + case $DX_EGREP in + [\\/]* | ?:[\\/]*) + ac_cv_path_DX_EGREP="$DX_EGREP" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_path_DX_EGREP="$as_dir/$ac_word$ac_exec_ext" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + ;; +esac +fi +DX_EGREP=$ac_cv_path_DX_EGREP +if test -n "$DX_EGREP"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DX_EGREP" >&5 +$as_echo "$DX_EGREP" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_path_DX_EGREP"; then + ac_pt_DX_EGREP=$DX_EGREP + # Extract the first word of "egrep", so it can be a program name with args. +set dummy egrep; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_path_ac_pt_DX_EGREP+:} false; then : + $as_echo_n "(cached) " >&6 +else + case $ac_pt_DX_EGREP in + [\\/]* | ?:[\\/]*) + ac_cv_path_ac_pt_DX_EGREP="$ac_pt_DX_EGREP" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_path_ac_pt_DX_EGREP="$as_dir/$ac_word$ac_exec_ext" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + ;; +esac +fi +ac_pt_DX_EGREP=$ac_cv_path_ac_pt_DX_EGREP +if test -n "$ac_pt_DX_EGREP"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_pt_DX_EGREP" >&5 +$as_echo "$ac_pt_DX_EGREP" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_pt_DX_EGREP" = x; then + DX_EGREP="" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + DX_EGREP=$ac_pt_DX_EGREP + fi +else + DX_EGREP="$ac_cv_path_DX_EGREP" +fi + +if test "$DX_FLAG_$DX_CURRENT_FEATURE$DX_EGREP" = 1; then + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: egrep not found - will not generate doxygen PostScript documentation" >&5 +$as_echo "$as_me: WARNING: egrep not found - will not generate doxygen PostScript documentation" >&2;} + DX_FLAG_ps=0 + +fi + + : +fi +if test "$DX_FLAG_ps" = 1; then + if :; then + DX_COND_ps_TRUE= + DX_COND_ps_FALSE='#' +else + DX_COND_ps_TRUE='#' + DX_COND_ps_FALSE= +fi + + + : +else + if false; then + DX_COND_ps_TRUE= + DX_COND_ps_FALSE='#' +else + DX_COND_ps_TRUE='#' + DX_COND_ps_FALSE= +fi + + + : +fi + + +# PDF file generation: + + + + @%:@ Check whether --enable-doxygen-pdf was given. +if test "${enable_doxygen_pdf+set}" = set; then : + enableval=$enable_doxygen_pdf; +case "$enableval" in +#( +y|Y|yes|Yes|YES) + DX_FLAG_pdf=1 + + +test "$DX_FLAG_doc" = "1" \ +|| as_fn_error $? "doxygen-pdf requires doxygen-pdf" "$LINENO" 5 + +;; #( +n|N|no|No|NO) + DX_FLAG_pdf=0 + +;; #( +*) + as_fn_error $? "invalid value '$enableval' given to doxygen-pdf" "$LINENO" 5 +;; +esac + +else + +DX_FLAG_pdf=0 + + +test "$DX_FLAG_doc" = "1" || DX_FLAG_pdf=0 + + + +fi + +if test "$DX_FLAG_pdf" = 1; then + +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}pdflatex", so it can be a program name with args. +set dummy ${ac_tool_prefix}pdflatex; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_path_DX_PDFLATEX+:} false; then : + $as_echo_n "(cached) " >&6 +else + case $DX_PDFLATEX in + [\\/]* | ?:[\\/]*) + ac_cv_path_DX_PDFLATEX="$DX_PDFLATEX" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_path_DX_PDFLATEX="$as_dir/$ac_word$ac_exec_ext" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + ;; +esac +fi +DX_PDFLATEX=$ac_cv_path_DX_PDFLATEX +if test -n "$DX_PDFLATEX"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DX_PDFLATEX" >&5 +$as_echo "$DX_PDFLATEX" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_path_DX_PDFLATEX"; then + ac_pt_DX_PDFLATEX=$DX_PDFLATEX + # Extract the first word of "pdflatex", so it can be a program name with args. +set dummy pdflatex; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_path_ac_pt_DX_PDFLATEX+:} false; then : + $as_echo_n "(cached) " >&6 +else + case $ac_pt_DX_PDFLATEX in + [\\/]* | ?:[\\/]*) + ac_cv_path_ac_pt_DX_PDFLATEX="$ac_pt_DX_PDFLATEX" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_path_ac_pt_DX_PDFLATEX="$as_dir/$ac_word$ac_exec_ext" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + ;; +esac +fi +ac_pt_DX_PDFLATEX=$ac_cv_path_ac_pt_DX_PDFLATEX +if test -n "$ac_pt_DX_PDFLATEX"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_pt_DX_PDFLATEX" >&5 +$as_echo "$ac_pt_DX_PDFLATEX" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_pt_DX_PDFLATEX" = x; then + DX_PDFLATEX="" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + DX_PDFLATEX=$ac_pt_DX_PDFLATEX + fi +else + DX_PDFLATEX="$ac_cv_path_DX_PDFLATEX" +fi + +if test "$DX_FLAG_$DX_CURRENT_FEATURE$DX_PDFLATEX" = 1; then + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: pdflatex not found - will not generate doxygen PDF documentation" >&5 +$as_echo "$as_me: WARNING: pdflatex not found - will not generate doxygen PDF documentation" >&2;} + DX_FLAG_pdf=0 + +fi + + +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}makeindex", so it can be a program name with args. +set dummy ${ac_tool_prefix}makeindex; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_path_DX_MAKEINDEX+:} false; then : + $as_echo_n "(cached) " >&6 +else + case $DX_MAKEINDEX in + [\\/]* | ?:[\\/]*) + ac_cv_path_DX_MAKEINDEX="$DX_MAKEINDEX" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_path_DX_MAKEINDEX="$as_dir/$ac_word$ac_exec_ext" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + ;; +esac +fi +DX_MAKEINDEX=$ac_cv_path_DX_MAKEINDEX +if test -n "$DX_MAKEINDEX"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DX_MAKEINDEX" >&5 +$as_echo "$DX_MAKEINDEX" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_path_DX_MAKEINDEX"; then + ac_pt_DX_MAKEINDEX=$DX_MAKEINDEX + # Extract the first word of "makeindex", so it can be a program name with args. +set dummy makeindex; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_path_ac_pt_DX_MAKEINDEX+:} false; then : + $as_echo_n "(cached) " >&6 +else + case $ac_pt_DX_MAKEINDEX in + [\\/]* | ?:[\\/]*) + ac_cv_path_ac_pt_DX_MAKEINDEX="$ac_pt_DX_MAKEINDEX" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_path_ac_pt_DX_MAKEINDEX="$as_dir/$ac_word$ac_exec_ext" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + ;; +esac +fi +ac_pt_DX_MAKEINDEX=$ac_cv_path_ac_pt_DX_MAKEINDEX +if test -n "$ac_pt_DX_MAKEINDEX"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_pt_DX_MAKEINDEX" >&5 +$as_echo "$ac_pt_DX_MAKEINDEX" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_pt_DX_MAKEINDEX" = x; then + DX_MAKEINDEX="" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + DX_MAKEINDEX=$ac_pt_DX_MAKEINDEX + fi +else + DX_MAKEINDEX="$ac_cv_path_DX_MAKEINDEX" +fi + +if test "$DX_FLAG_$DX_CURRENT_FEATURE$DX_MAKEINDEX" = 1; then + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: makeindex not found - will not generate doxygen PDF documentation" >&5 +$as_echo "$as_me: WARNING: makeindex not found - will not generate doxygen PDF documentation" >&2;} + DX_FLAG_pdf=0 + +fi + + +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}egrep", so it can be a program name with args. +set dummy ${ac_tool_prefix}egrep; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_path_DX_EGREP+:} false; then : + $as_echo_n "(cached) " >&6 +else + case $DX_EGREP in + [\\/]* | ?:[\\/]*) + ac_cv_path_DX_EGREP="$DX_EGREP" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_path_DX_EGREP="$as_dir/$ac_word$ac_exec_ext" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + ;; +esac +fi +DX_EGREP=$ac_cv_path_DX_EGREP +if test -n "$DX_EGREP"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DX_EGREP" >&5 +$as_echo "$DX_EGREP" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_path_DX_EGREP"; then + ac_pt_DX_EGREP=$DX_EGREP + # Extract the first word of "egrep", so it can be a program name with args. +set dummy egrep; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_path_ac_pt_DX_EGREP+:} false; then : + $as_echo_n "(cached) " >&6 +else + case $ac_pt_DX_EGREP in + [\\/]* | ?:[\\/]*) + ac_cv_path_ac_pt_DX_EGREP="$ac_pt_DX_EGREP" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_path_ac_pt_DX_EGREP="$as_dir/$ac_word$ac_exec_ext" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + ;; +esac +fi +ac_pt_DX_EGREP=$ac_cv_path_ac_pt_DX_EGREP +if test -n "$ac_pt_DX_EGREP"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_pt_DX_EGREP" >&5 +$as_echo "$ac_pt_DX_EGREP" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_pt_DX_EGREP" = x; then + DX_EGREP="" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + DX_EGREP=$ac_pt_DX_EGREP + fi +else + DX_EGREP="$ac_cv_path_DX_EGREP" +fi + +if test "$DX_FLAG_$DX_CURRENT_FEATURE$DX_EGREP" = 1; then + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: egrep not found - will not generate doxygen PDF documentation" >&5 +$as_echo "$as_me: WARNING: egrep not found - will not generate doxygen PDF documentation" >&2;} + DX_FLAG_pdf=0 + +fi + + : +fi +if test "$DX_FLAG_pdf" = 1; then + if :; then + DX_COND_pdf_TRUE= + DX_COND_pdf_FALSE='#' +else + DX_COND_pdf_TRUE='#' + DX_COND_pdf_FALSE= +fi + + + : +else + if false; then + DX_COND_pdf_TRUE= + DX_COND_pdf_FALSE='#' +else + DX_COND_pdf_TRUE='#' + DX_COND_pdf_FALSE= +fi + + + : +fi + + +# LaTeX generation for PS and/or PDF: +if test "$DX_FLAG_ps" = 1 || test "$DX_FLAG_pdf" = 1; then + if :; then + DX_COND_latex_TRUE= + DX_COND_latex_FALSE='#' +else + DX_COND_latex_TRUE='#' + DX_COND_latex_FALSE= +fi + + DX_ENV="$DX_ENV GENERATE_LATEX='YES'" + +else + if false; then + DX_COND_latex_TRUE= + DX_COND_latex_FALSE='#' +else + DX_COND_latex_TRUE='#' + DX_COND_latex_FALSE= +fi + + DX_ENV="$DX_ENV GENERATE_LATEX='NO'" + +fi + +# Paper size for PS and/or PDF: + +case "$DOXYGEN_PAPER_SIZE" in +#( +"") + DOXYGEN_PAPER_SIZE="" + +;; #( +a4wide|a4|letter|legal|executive) + DX_ENV="$DX_ENV PAPER_SIZE='$DOXYGEN_PAPER_SIZE'" + +;; #( +*) + as_fn_error $? "unknown DOXYGEN_PAPER_SIZE='$DOXYGEN_PAPER_SIZE'" "$LINENO" 5 +;; +esac + +#For debugging: +#echo DX_FLAG_doc=$DX_FLAG_doc +#echo DX_FLAG_dot=$DX_FLAG_dot +#echo DX_FLAG_man=$DX_FLAG_man +#echo DX_FLAG_html=$DX_FLAG_html +#echo DX_FLAG_chm=$DX_FLAG_chm +#echo DX_FLAG_chi=$DX_FLAG_chi +#echo DX_FLAG_rtf=$DX_FLAG_rtf +#echo DX_FLAG_xml=$DX_FLAG_xml +#echo DX_FLAG_pdf=$DX_FLAG_pdf +#echo DX_FLAG_ps=$DX_FLAG_ps +#echo DX_ENV=$DX_ENV + + +# initialize automake +am__api_version='1.11' + +ac_aux_dir= +for ac_dir in "$srcdir" "$srcdir/.." "$srcdir/../.."; do + if test -f "$ac_dir/install-sh"; then + ac_aux_dir=$ac_dir + ac_install_sh="$ac_aux_dir/install-sh -c" + break + elif test -f "$ac_dir/install.sh"; then + ac_aux_dir=$ac_dir + ac_install_sh="$ac_aux_dir/install.sh -c" + break + elif test -f "$ac_dir/shtool"; then + ac_aux_dir=$ac_dir + ac_install_sh="$ac_aux_dir/shtool install -c" + break + fi +done +if test -z "$ac_aux_dir"; then + as_fn_error $? "cannot find install-sh, install.sh, or shtool in \"$srcdir\" \"$srcdir/..\" \"$srcdir/../..\"" "$LINENO" 5 +fi + +# These three variables are undocumented and unsupported, +# and are intended to be withdrawn in a future Autoconf release. +# They can cause serious problems if a builder's source tree is in a directory +# whose full name contains unusual characters. +ac_config_guess="$SHELL $ac_aux_dir/config.guess" # Please don't use this var. +ac_config_sub="$SHELL $ac_aux_dir/config.sub" # Please don't use this var. +ac_configure="$SHELL $ac_aux_dir/configure" # Please don't use this var. + + +# Find a good install program. We prefer a C program (faster), +# so one script is as good as another. But avoid the broken or +# incompatible versions: +# SysV /etc/install, /usr/sbin/install +# SunOS /usr/etc/install +# IRIX /sbin/install +# AIX /bin/install +# AmigaOS /C/install, which installs bootblocks on floppy discs +# AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag +# AFS /usr/afsws/bin/install, which mishandles nonexistent args +# SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff" +# OS/2's system install, which has a completely different semantic +# ./install, which can be erroneously created by make from ./install.sh. +# Reject install programs that cannot install multiple files. +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a BSD-compatible install" >&5 +$as_echo_n "checking for a BSD-compatible install... " >&6; } +if test -z "$INSTALL"; then +if ${ac_cv_path_install+:} false; then : + $as_echo_n "(cached) " >&6 +else + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + # Account for people who put trailing slashes in PATH elements. +case $as_dir/ in @%:@(( + ./ | .// | /[cC]/* | \ + /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \ + ?:[\\/]os2[\\/]install[\\/]* | ?:[\\/]OS2[\\/]INSTALL[\\/]* | \ + /usr/ucb/* ) ;; + *) + # OSF1 and SCO ODT 3.0 have their own names for install. + # Don't use installbsd from OSF since it installs stuff as root + # by default. + for ac_prog in ginstall scoinst install; do + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_prog$ac_exec_ext"; then + if test $ac_prog = install && + grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then + # AIX install. It has an incompatible calling convention. + : + elif test $ac_prog = install && + grep pwplus "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then + # program-specific install script used by HP pwplus--don't use. + : + else + rm -rf conftest.one conftest.two conftest.dir + echo one > conftest.one + echo two > conftest.two + mkdir conftest.dir + if "$as_dir/$ac_prog$ac_exec_ext" -c conftest.one conftest.two "`pwd`/conftest.dir" && + test -s conftest.one && test -s conftest.two && + test -s conftest.dir/conftest.one && + test -s conftest.dir/conftest.two + then + ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c" + break 3 + fi + fi + fi + done + done + ;; +esac + + done +IFS=$as_save_IFS + +rm -rf conftest.one conftest.two conftest.dir + +fi + if test "${ac_cv_path_install+set}" = set; then + INSTALL=$ac_cv_path_install + else + # As a last resort, use the slow shell script. Don't cache a + # value for INSTALL within a source directory, because that will + # break other packages using the cache if that directory is + # removed, or if the value is a relative name. + INSTALL=$ac_install_sh + fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $INSTALL" >&5 +$as_echo "$INSTALL" >&6; } + +# Use test -z because SunOS4 sh mishandles braces in ${var-val}. +# It thinks the first close brace ends the variable substitution. +test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}' + +test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}' + +test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644' + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether build environment is sane" >&5 +$as_echo_n "checking whether build environment is sane... " >&6; } +# Just in case +sleep 1 +echo timestamp > conftest.file +# Reject unsafe characters in $srcdir or the absolute working directory +# name. Accept space and tab only in the latter. +am_lf=' +' +case `pwd` in + *[\\\"\#\$\&\'\`$am_lf]*) + as_fn_error $? "unsafe absolute working directory name" "$LINENO" 5;; +esac +case $srcdir in + *[\\\"\#\$\&\'\`$am_lf\ \ ]*) + as_fn_error $? "unsafe srcdir value: \`$srcdir'" "$LINENO" 5;; +esac + +# Do `set' in a subshell so we don't clobber the current shell's +# arguments. Must try -L first in case configure is actually a +# symlink; some systems play weird games with the mod time of symlinks +# (eg FreeBSD returns the mod time of the symlink's containing +# directory). +if ( + set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null` + if test "$*" = "X"; then + # -L didn't work. + set X `ls -t "$srcdir/configure" conftest.file` + fi + rm -f conftest.file + if test "$*" != "X $srcdir/configure conftest.file" \ + && test "$*" != "X conftest.file $srcdir/configure"; then + + # If neither matched, then we have a broken ls. This can happen + # if, for instance, CONFIG_SHELL is bash and it inherits a + # broken ls alias from the environment. This has actually + # happened. Such a system could not be considered "sane". + as_fn_error $? "ls -t appears to fail. Make sure there is not a broken +alias in your environment" "$LINENO" 5 + fi + + test "$2" = conftest.file + ) +then + # Ok. + : +else + as_fn_error $? "newly created file is older than distributed files! +Check your system clock" "$LINENO" 5 +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } +test "$program_prefix" != NONE && + program_transform_name="s&^&$program_prefix&;$program_transform_name" +# Use a double $ so make ignores it. +test "$program_suffix" != NONE && + program_transform_name="s&\$&$program_suffix&;$program_transform_name" +# Double any \ or $. +# By default was `s,x,x', remove it if useless. +ac_script='s/[\\$]/&&/g;s/;s,x,x,$//' +program_transform_name=`$as_echo "$program_transform_name" | sed "$ac_script"` + +# expand $ac_aux_dir to an absolute path +am_aux_dir=`cd $ac_aux_dir && pwd` + +if test x"${MISSING+set}" != xset; then + case $am_aux_dir in + *\ * | *\ *) + MISSING="\${SHELL} \"$am_aux_dir/missing\"" ;; + *) + MISSING="\${SHELL} $am_aux_dir/missing" ;; + esac +fi +# Use eval to expand $SHELL +if eval "$MISSING --run true"; then + am_missing_run="$MISSING --run " +else + am_missing_run= + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: \`missing' script is too old or missing" >&5 +$as_echo "$as_me: WARNING: \`missing' script is too old or missing" >&2;} +fi + +if test x"${install_sh}" != xset; then + case $am_aux_dir in + *\ * | *\ *) + install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;; + *) + install_sh="\${SHELL} $am_aux_dir/install-sh" + esac +fi + +# Installed binaries are usually stripped using `strip' when the user +# run `make install-strip'. However `strip' might not be the right +# tool to use in cross-compilation environments, therefore Automake +# will honor the `STRIP' environment variable to overrule this program. +if test "$cross_compiling" != no; then + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args. +set dummy ${ac_tool_prefix}strip; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_STRIP+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$STRIP"; then + ac_cv_prog_STRIP="$STRIP" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_STRIP="${ac_tool_prefix}strip" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +STRIP=$ac_cv_prog_STRIP +if test -n "$STRIP"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $STRIP" >&5 +$as_echo "$STRIP" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_STRIP"; then + ac_ct_STRIP=$STRIP + # Extract the first word of "strip", so it can be a program name with args. +set dummy strip; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_STRIP+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_STRIP"; then + ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_STRIP="strip" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP +if test -n "$ac_ct_STRIP"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP" >&5 +$as_echo "$ac_ct_STRIP" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_STRIP" = x; then + STRIP=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + STRIP=$ac_ct_STRIP + fi +else + STRIP="$ac_cv_prog_STRIP" +fi + +fi +INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s" + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a thread-safe mkdir -p" >&5 +$as_echo_n "checking for a thread-safe mkdir -p... " >&6; } +if test -z "$MKDIR_P"; then + if ${ac_cv_path_mkdir+:} false; then : + $as_echo_n "(cached) " >&6 +else + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH$PATH_SEPARATOR/opt/sfw/bin +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_prog in mkdir gmkdir; do + for ac_exec_ext in '' $ac_executable_extensions; do + as_fn_executable_p "$as_dir/$ac_prog$ac_exec_ext" || continue + case `"$as_dir/$ac_prog$ac_exec_ext" --version 2>&1` in #( + 'mkdir (GNU coreutils) '* | \ + 'mkdir (coreutils) '* | \ + 'mkdir (fileutils) '4.1*) + ac_cv_path_mkdir=$as_dir/$ac_prog$ac_exec_ext + break 3;; + esac + done + done + done +IFS=$as_save_IFS + +fi + + test -d ./--version && rmdir ./--version + if test "${ac_cv_path_mkdir+set}" = set; then + MKDIR_P="$ac_cv_path_mkdir -p" + else + # As a last resort, use the slow shell script. Don't cache a + # value for MKDIR_P within a source directory, because that will + # break other packages using the cache if that directory is + # removed, or if the value is a relative name. + MKDIR_P="$ac_install_sh -d" + fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $MKDIR_P" >&5 +$as_echo "$MKDIR_P" >&6; } + +mkdir_p="$MKDIR_P" +case $mkdir_p in + [\\/$]* | ?:[\\/]*) ;; + */*) mkdir_p="\$(top_builddir)/$mkdir_p" ;; +esac + +for ac_prog in gawk mawk nawk awk +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_AWK+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$AWK"; then + ac_cv_prog_AWK="$AWK" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_AWK="$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +AWK=$ac_cv_prog_AWK +if test -n "$AWK"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AWK" >&5 +$as_echo "$AWK" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$AWK" && break +done + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} sets \$(MAKE)" >&5 +$as_echo_n "checking whether ${MAKE-make} sets \$(MAKE)... " >&6; } +set x ${MAKE-make} +ac_make=`$as_echo "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'` +if eval \${ac_cv_prog_make_${ac_make}_set+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat >conftest.make <<\_ACEOF +SHELL = /bin/sh +all: + @echo '@@@%%%=$(MAKE)=@@@%%%' +_ACEOF +# GNU make sometimes prints "make[1]: Entering ...", which would confuse us. +case `${MAKE-make} -f conftest.make 2>/dev/null` in + *@@@%%%=?*=@@@%%%*) + eval ac_cv_prog_make_${ac_make}_set=yes;; + *) + eval ac_cv_prog_make_${ac_make}_set=no;; +esac +rm -f conftest.make +fi +if eval test \$ac_cv_prog_make_${ac_make}_set = yes; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + SET_MAKE= +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + SET_MAKE="MAKE=${MAKE-make}" +fi + +rm -rf .tst 2>/dev/null +mkdir .tst 2>/dev/null +if test -d .tst; then + am__leading_dot=. +else + am__leading_dot=_ +fi +rmdir .tst 2>/dev/null + +if test "`cd $srcdir && pwd`" != "`pwd`"; then + # Use -I$(srcdir) only when $(srcdir) != ., so that make's output + # is not polluted with repeated "-I." + am__isrc=' -I$(srcdir)' + # test to see if srcdir already configured + if test -f $srcdir/config.status; then + as_fn_error $? "source directory already configured; run \"make distclean\" there first" "$LINENO" 5 + fi +fi + +# test whether we have cygpath +if test -z "$CYGPATH_W"; then + if (cygpath --version) >/dev/null 2>/dev/null; then + CYGPATH_W='cygpath -w' + else + CYGPATH_W=echo + fi +fi + + +# Define the identity of the package. + PACKAGE='zookeeper' + VERSION='3.4.5' + + +cat >>confdefs.h <<_ACEOF +@%:@define PACKAGE "$PACKAGE" +_ACEOF + + +cat >>confdefs.h <<_ACEOF +@%:@define VERSION "$VERSION" +_ACEOF + +# Some tools Automake needs. + +ACLOCAL=${ACLOCAL-"${am_missing_run}aclocal-${am__api_version}"} + + +AUTOCONF=${AUTOCONF-"${am_missing_run}autoconf"} + + +AUTOMAKE=${AUTOMAKE-"${am_missing_run}automake-${am__api_version}"} + + +AUTOHEADER=${AUTOHEADER-"${am_missing_run}autoheader"} + + +MAKEINFO=${MAKEINFO-"${am_missing_run}makeinfo"} + +# We need awk for the "check" target. The system "awk" is bad on +# some platforms. +# Always define AMTAR for backward compatibility. Yes, it's still used +# in the wild :-( We should find a proper way to deprecate it ... +AMTAR='$${TAR-tar}' + +am__tar='$${TAR-tar} chof - "$$tardir"' am__untar='$${TAR-tar} xf -' + + + + + +ac_config_headers="$ac_config_headers config.h" + + +# Checks for programs. + +@%:@ Check whether --with-cppunit was given. +if test "${with_cppunit+set}" = set; then : + withval=$with_cppunit; +fi + + +if test "$with_cppunit" = "no" ; then + CPPUNIT_PATH="No_CPPUNIT" + CPPUNIT_INCLUDE= + CPPUNIT_LIBS= +else + AM_PATH_CPPUNIT(1.10.2) +fi + +if test "$CALLER" = "ANT" ; then +CPPUNIT_CFLAGS="$CPPUNIT_CFLAGS -DZKSERVER_CMD=\"\\\"${base_dir}/src/c/tests/zkServer.sh\\\"\"" +else +CPPUNIT_CFLAGS="$CPPUNIT_CFLAGS -DZKSERVER_CMD=\"\\\"./tests/zkServer.sh\\\"\"" +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for generated/zookeeper.jute.c" >&5 +$as_echo_n "checking for generated/zookeeper.jute.c... " >&6; } +if ${ac_cv_file_generated_zookeeper_jute_c+:} false; then : + $as_echo_n "(cached) " >&6 +else + test "$cross_compiling" = yes && + as_fn_error $? "cannot check for file existence when cross compiling" "$LINENO" 5 +if test -r "generated/zookeeper.jute.c"; then + ac_cv_file_generated_zookeeper_jute_c=yes +else + ac_cv_file_generated_zookeeper_jute_c=no +fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_file_generated_zookeeper_jute_c" >&5 +$as_echo "$ac_cv_file_generated_zookeeper_jute_c" >&6; } +if test "x$ac_cv_file_generated_zookeeper_jute_c" = xyes; then : + +cat >>confdefs.h <<_ACEOF +@%:@define HAVE_GENERATED_ZOOKEEPER_JUTE_C 1 +_ACEOF + +else + as_fn_error $? "jute files are missing! Please run \"ant compile_jute\" while in the zookeeper top level directory." "$LINENO" 5 + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for generated/zookeeper.jute.h" >&5 +$as_echo_n "checking for generated/zookeeper.jute.h... " >&6; } +if ${ac_cv_file_generated_zookeeper_jute_h+:} false; then : + $as_echo_n "(cached) " >&6 +else + test "$cross_compiling" = yes && + as_fn_error $? "cannot check for file existence when cross compiling" "$LINENO" 5 +if test -r "generated/zookeeper.jute.h"; then + ac_cv_file_generated_zookeeper_jute_h=yes +else + ac_cv_file_generated_zookeeper_jute_h=no +fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_file_generated_zookeeper_jute_h" >&5 +$as_echo "$ac_cv_file_generated_zookeeper_jute_h" >&6; } +if test "x$ac_cv_file_generated_zookeeper_jute_h" = xyes; then : + +cat >>confdefs.h <<_ACEOF +@%:@define HAVE_GENERATED_ZOOKEEPER_JUTE_H 1 +_ACEOF + +else + as_fn_error $? "jute files are missing! Please run \"ant compile_jute\" while in the zookeeper top level directory." "$LINENO" 5 + +fi + +fi + + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args. +set dummy ${ac_tool_prefix}gcc; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_CC+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_CC="${ac_tool_prefix}gcc" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +$as_echo "$CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_CC"; then + ac_ct_CC=$CC + # Extract the first word of "gcc", so it can be a program name with args. +set dummy gcc; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_CC+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_CC"; then + ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_CC="gcc" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_CC=$ac_cv_prog_ac_ct_CC +if test -n "$ac_ct_CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 +$as_echo "$ac_ct_CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_CC" = x; then + CC="" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + CC=$ac_ct_CC + fi +else + CC="$ac_cv_prog_CC" +fi + +if test -z "$CC"; then + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args. +set dummy ${ac_tool_prefix}cc; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_CC+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_CC="${ac_tool_prefix}cc" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +$as_echo "$CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + fi +fi +if test -z "$CC"; then + # Extract the first word of "cc", so it can be a program name with args. +set dummy cc; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_CC+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else + ac_prog_rejected=no +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then + ac_prog_rejected=yes + continue + fi + ac_cv_prog_CC="cc" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +if test $ac_prog_rejected = yes; then + # We found a bogon in the path, so make sure we never use it. + set dummy $ac_cv_prog_CC + shift + if test $@%:@ != 0; then + # We chose a different compiler from the bogus one. + # However, it has the same basename, so the bogon will be chosen + # first if we set CC to just the basename; use the full file name. + shift + ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@" + fi +fi +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +$as_echo "$CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$CC"; then + if test -n "$ac_tool_prefix"; then + for ac_prog in cl.exe + do + # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. +set dummy $ac_tool_prefix$ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_CC+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_CC="$ac_tool_prefix$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +$as_echo "$CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$CC" && break + done +fi +if test -z "$CC"; then + ac_ct_CC=$CC + for ac_prog in cl.exe +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_CC+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_CC"; then + ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_CC="$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_CC=$ac_cv_prog_ac_ct_CC +if test -n "$ac_ct_CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 +$as_echo "$ac_ct_CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$ac_ct_CC" && break +done + + if test "x$ac_ct_CC" = x; then + CC="" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + CC=$ac_ct_CC + fi +fi + +fi + + +test -z "$CC" && { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "no acceptable C compiler found in \$PATH +See \`config.log' for more details" "$LINENO" 5; } + +# Provide some information about the compiler. +$as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5 +set X $ac_compile +ac_compiler=$2 +for ac_option in --version -v -V -qversion; do + { { ac_try="$ac_compiler $ac_option >&5" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_compiler $ac_option >&5") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + sed '10a\ +... rest of stderr output deleted ... + 10q' conftest.err >conftest.er1 + cat conftest.er1 >&5 + fi + rm -f conftest.er1 conftest.err + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } +done + +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +ac_clean_files_save=$ac_clean_files +ac_clean_files="$ac_clean_files a.out a.out.dSYM a.exe b.out" +# Try to create an executable without -o first, disregard a.out. +# It will help us diagnose broken compilers, and finding out an intuition +# of exeext. +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler works" >&5 +$as_echo_n "checking whether the C compiler works... " >&6; } +ac_link_default=`$as_echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'` + +# The possible output files: +ac_files="a.out conftest.exe conftest a.exe a_out.exe b.out conftest.*" + +ac_rmfiles= +for ac_file in $ac_files +do + case $ac_file in + *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; + * ) ac_rmfiles="$ac_rmfiles $ac_file";; + esac +done +rm -f $ac_rmfiles + +if { { ac_try="$ac_link_default" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_link_default") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then : + # Autoconf-2.13 could set the ac_cv_exeext variable to `no'. +# So ignore a value of `no', otherwise this would lead to `EXEEXT = no' +# in a Makefile. We should not override ac_cv_exeext if it was cached, +# so that the user can short-circuit this test for compilers unknown to +# Autoconf. +for ac_file in $ac_files '' +do + test -f "$ac_file" || continue + case $ac_file in + *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) + ;; + [ab].out ) + # We found the default executable, but exeext='' is most + # certainly right. + break;; + *.* ) + if test "${ac_cv_exeext+set}" = set && test "$ac_cv_exeext" != no; + then :; else + ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` + fi + # We set ac_cv_exeext here because the later test for it is not + # safe: cross compilers may not add the suffix if given an `-o' + # argument, so we may need to know it at that point already. + # Even if this section looks crufty: it has the advantage of + # actually working. + break;; + * ) + break;; + esac +done +test "$ac_cv_exeext" = no && ac_cv_exeext= + +else + ac_file='' +fi +if test -z "$ac_file"; then : + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +$as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error 77 "C compiler cannot create executables +See \`config.log' for more details" "$LINENO" 5; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler default output file name" >&5 +$as_echo_n "checking for C compiler default output file name... " >&6; } +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_file" >&5 +$as_echo "$ac_file" >&6; } +ac_exeext=$ac_cv_exeext + +rm -f -r a.out a.out.dSYM a.exe conftest$ac_cv_exeext b.out +ac_clean_files=$ac_clean_files_save +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of executables" >&5 +$as_echo_n "checking for suffix of executables... " >&6; } +if { { ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_link") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then : + # If both `conftest.exe' and `conftest' are `present' (well, observable) +# catch `conftest.exe'. For instance with Cygwin, `ls conftest' will +# work properly (i.e., refer to `conftest.exe'), while it won't with +# `rm'. +for ac_file in conftest.exe conftest conftest.*; do + test -f "$ac_file" || continue + case $ac_file in + *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; + *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` + break;; + * ) break;; + esac +done +else + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "cannot compute suffix of executables: cannot compile and link +See \`config.log' for more details" "$LINENO" 5; } +fi +rm -f conftest conftest$ac_cv_exeext +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_exeext" >&5 +$as_echo "$ac_cv_exeext" >&6; } + +rm -f conftest.$ac_ext +EXEEXT=$ac_cv_exeext +ac_exeext=$EXEEXT +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +@%:@include +int +main () +{ +FILE *f = fopen ("conftest.out", "w"); + return ferror (f) || fclose (f) != 0; + + ; + return 0; +} +_ACEOF +ac_clean_files="$ac_clean_files conftest.out" +# Check that the compiler produces executables we can run. If not, either +# the compiler is broken, or we cross compile. +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are cross compiling" >&5 +$as_echo_n "checking whether we are cross compiling... " >&6; } +if test "$cross_compiling" != yes; then + { { ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_link") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + if { ac_try='./conftest$ac_cv_exeext' + { { case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; }; then + cross_compiling=no + else + if test "$cross_compiling" = maybe; then + cross_compiling=yes + else + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "cannot run C compiled programs. +If you meant to cross compile, use \`--host'. +See \`config.log' for more details" "$LINENO" 5; } + fi + fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $cross_compiling" >&5 +$as_echo "$cross_compiling" >&6; } + +rm -f conftest.$ac_ext conftest$ac_cv_exeext conftest.out +ac_clean_files=$ac_clean_files_save +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of object files" >&5 +$as_echo_n "checking for suffix of object files... " >&6; } +if ${ac_cv_objext+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +rm -f conftest.o conftest.obj +if { { ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_compile") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then : + for ac_file in conftest.o conftest.obj conftest.*; do + test -f "$ac_file" || continue; + case $ac_file in + *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM ) ;; + *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'` + break;; + esac +done +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "cannot compute suffix of object files: cannot compile +See \`config.log' for more details" "$LINENO" 5; } +fi +rm -f conftest.$ac_cv_objext conftest.$ac_ext +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_objext" >&5 +$as_echo "$ac_cv_objext" >&6; } +OBJEXT=$ac_cv_objext +ac_objext=$OBJEXT +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C compiler" >&5 +$as_echo_n "checking whether we are using the GNU C compiler... " >&6; } +if ${ac_cv_c_compiler_gnu+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ +#ifndef __GNUC__ + choke me +#endif + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_compiler_gnu=yes +else + ac_compiler_gnu=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +ac_cv_c_compiler_gnu=$ac_compiler_gnu + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5 +$as_echo "$ac_cv_c_compiler_gnu" >&6; } +if test $ac_compiler_gnu = yes; then + GCC=yes +else + GCC= +fi +ac_test_CFLAGS=${CFLAGS+set} +ac_save_CFLAGS=$CFLAGS +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5 +$as_echo_n "checking whether $CC accepts -g... " >&6; } +if ${ac_cv_prog_cc_g+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_save_c_werror_flag=$ac_c_werror_flag + ac_c_werror_flag=yes + ac_cv_prog_cc_g=no + CFLAGS="-g" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_prog_cc_g=yes +else + CFLAGS="" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + +else + ac_c_werror_flag=$ac_save_c_werror_flag + CFLAGS="-g" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_prog_cc_g=yes +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + ac_c_werror_flag=$ac_save_c_werror_flag +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5 +$as_echo "$ac_cv_prog_cc_g" >&6; } +if test "$ac_test_CFLAGS" = set; then + CFLAGS=$ac_save_CFLAGS +elif test $ac_cv_prog_cc_g = yes; then + if test "$GCC" = yes; then + CFLAGS="-g -O2" + else + CFLAGS="-g" + fi +else + if test "$GCC" = yes; then + CFLAGS="-O2" + else + CFLAGS= + fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5 +$as_echo_n "checking for $CC option to accept ISO C89... " >&6; } +if ${ac_cv_prog_cc_c89+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_cv_prog_cc_c89=no +ac_save_CC=$CC +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +#include +struct stat; +/* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */ +struct buf { int x; }; +FILE * (*rcsopen) (struct buf *, struct stat *, int); +static char *e (p, i) + char **p; + int i; +{ + return p[i]; +} +static char *f (char * (*g) (char **, int), char **p, ...) +{ + char *s; + va_list v; + va_start (v,p); + s = g (p, va_arg (v,int)); + va_end (v); + return s; +} + +/* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has + function prototypes and stuff, but not '\xHH' hex character constants. + These don't provoke an error unfortunately, instead are silently treated + as 'x'. The following induces an error, until -std is added to get + proper ANSI mode. Curiously '\x00'!='x' always comes out true, for an + array size at least. It's necessary to write '\x00'==0 to get something + that's true only with -std. */ +int osf4_cc_array ['\x00' == 0 ? 1 : -1]; + +/* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters + inside strings and character constants. */ +#define FOO(x) 'x' +int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1]; + +int test (int i, double x); +struct s1 {int (*f) (int a);}; +struct s2 {int (*f) (double a);}; +int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int); +int argc; +char **argv; +int +main () +{ +return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]; + ; + return 0; +} +_ACEOF +for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \ + -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" +do + CC="$ac_save_CC $ac_arg" + if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_prog_cc_c89=$ac_arg +fi +rm -f core conftest.err conftest.$ac_objext + test "x$ac_cv_prog_cc_c89" != "xno" && break +done +rm -f conftest.$ac_ext +CC=$ac_save_CC + +fi +# AC_CACHE_VAL +case "x$ac_cv_prog_cc_c89" in + x) + { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 +$as_echo "none needed" >&6; } ;; + xno) + { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 +$as_echo "unsupported" >&6; } ;; + *) + CC="$CC $ac_cv_prog_cc_c89" + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5 +$as_echo "$ac_cv_prog_cc_c89" >&6; } ;; +esac +if test "x$ac_cv_prog_cc_c89" != xno; then : + +fi + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu +DEPDIR="${am__leading_dot}deps" + +ac_config_commands="$ac_config_commands depfiles" + + +am_make=${MAKE-make} +cat > confinc << 'END' +am__doit: + @echo this is the am__doit target +.PHONY: am__doit +END +# If we don't find an include directive, just comment out the code. +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for style of include used by $am_make" >&5 +$as_echo_n "checking for style of include used by $am_make... " >&6; } +am__include="#" +am__quote= +_am_result=none +# First try GNU make style include. +echo "include confinc" > confmf +# Ignore all kinds of additional output from `make'. +case `$am_make -s -f confmf 2> /dev/null` in #( +*the\ am__doit\ target*) + am__include=include + am__quote= + _am_result=GNU + ;; +esac +# Now try BSD make style include. +if test "$am__include" = "#"; then + echo '.include "confinc"' > confmf + case `$am_make -s -f confmf 2> /dev/null` in #( + *the\ am__doit\ target*) + am__include=.include + am__quote="\"" + _am_result=BSD + ;; + esac +fi + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $_am_result" >&5 +$as_echo "$_am_result" >&6; } +rm -f confinc confmf + +@%:@ Check whether --enable-dependency-tracking was given. +if test "${enable_dependency_tracking+set}" = set; then : + enableval=$enable_dependency_tracking; +fi + +if test "x$enable_dependency_tracking" != xno; then + am_depcomp="$ac_aux_dir/depcomp" + AMDEPBACKSLASH='\' + am__nodep='_no' +fi + if test "x$enable_dependency_tracking" != xno; then + AMDEP_TRUE= + AMDEP_FALSE='#' +else + AMDEP_TRUE='#' + AMDEP_FALSE= +fi + + + +depcc="$CC" am_compiler_list= + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5 +$as_echo_n "checking dependency style of $depcc... " >&6; } +if ${am_cv_CC_dependencies_compiler_type+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then + # We make a subdir and do the tests there. Otherwise we can end up + # making bogus files that we don't know about and never remove. For + # instance it was reported that on HP-UX the gcc test will end up + # making a dummy file named `D' -- because `-MD' means `put the output + # in D'. + rm -rf conftest.dir + mkdir conftest.dir + # Copy depcomp to subdir because otherwise we won't find it if we're + # using a relative directory. + cp "$am_depcomp" conftest.dir + cd conftest.dir + # We will build objects and dependencies in a subdirectory because + # it helps to detect inapplicable dependency modes. For instance + # both Tru64's cc and ICC support -MD to output dependencies as a + # side effect of compilation, but ICC will put the dependencies in + # the current directory while Tru64 will put them in the object + # directory. + mkdir sub + + am_cv_CC_dependencies_compiler_type=none + if test "$am_compiler_list" = ""; then + am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp` + fi + am__universal=false + case " $depcc " in #( + *\ -arch\ *\ -arch\ *) am__universal=true ;; + esac + + for depmode in $am_compiler_list; do + # Setup a source with many dependencies, because some compilers + # like to wrap large dependency lists on column 80 (with \), and + # we should not choose a depcomp mode which is confused by this. + # + # We need to recreate these files for each test, as the compiler may + # overwrite some of them when testing with obscure command lines. + # This happens at least with the AIX C compiler. + : > sub/conftest.c + for i in 1 2 3 4 5 6; do + echo '#include "conftst'$i'.h"' >> sub/conftest.c + # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with + # Solaris 8's {/usr,}/bin/sh. + touch sub/conftst$i.h + done + echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf + + # We check with `-c' and `-o' for the sake of the "dashmstdout" + # mode. It turns out that the SunPro C++ compiler does not properly + # handle `-M -o', and we need to detect this. Also, some Intel + # versions had trouble with output in subdirs + am__obj=sub/conftest.${OBJEXT-o} + am__minus_obj="-o $am__obj" + case $depmode in + gcc) + # This depmode causes a compiler race in universal mode. + test "$am__universal" = false || continue + ;; + nosideeffect) + # after this tag, mechanisms are not by side-effect, so they'll + # only be used when explicitly requested + if test "x$enable_dependency_tracking" = xyes; then + continue + else + break + fi + ;; + msvc7 | msvc7msys | msvisualcpp | msvcmsys) + # This compiler won't grok `-c -o', but also, the minuso test has + # not run yet. These depmodes are late enough in the game, and + # so weak that their functioning should not be impacted. + am__obj=conftest.${OBJEXT-o} + am__minus_obj= + ;; + none) break ;; + esac + if depmode=$depmode \ + source=sub/conftest.c object=$am__obj \ + depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ + $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ + >/dev/null 2>conftest.err && + grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && + grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && + grep $am__obj sub/conftest.Po > /dev/null 2>&1 && + ${MAKE-make} -s -f confmf > /dev/null 2>&1; then + # icc doesn't choke on unknown options, it will just issue warnings + # or remarks (even with -Werror). So we grep stderr for any message + # that says an option was ignored or not supported. + # When given -MP, icc 7.0 and 7.1 complain thusly: + # icc: Command line warning: ignoring option '-M'; no argument required + # The diagnosis changed in icc 8.0: + # icc: Command line remark: option '-MP' not supported + if (grep 'ignoring option' conftest.err || + grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else + am_cv_CC_dependencies_compiler_type=$depmode + break + fi + fi + done + + cd .. + rm -rf conftest.dir +else + am_cv_CC_dependencies_compiler_type=none +fi + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_CC_dependencies_compiler_type" >&5 +$as_echo "$am_cv_CC_dependencies_compiler_type" >&6; } +CCDEPMODE=depmode=$am_cv_CC_dependencies_compiler_type + + if + test "x$enable_dependency_tracking" != xno \ + && test "$am_cv_CC_dependencies_compiler_type" = gcc3; then + am__fastdepCC_TRUE= + am__fastdepCC_FALSE='#' +else + am__fastdepCC_TRUE='#' + am__fastdepCC_FALSE= +fi + + +if test "x$CC" != xcc; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC and cc understand -c and -o together" >&5 +$as_echo_n "checking whether $CC and cc understand -c and -o together... " >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether cc understands -c and -o together" >&5 +$as_echo_n "checking whether cc understands -c and -o together... " >&6; } +fi +set dummy $CC; ac_cc=`$as_echo "$2" | + sed 's/[^a-zA-Z0-9_]/_/g;s/^[0-9]/_/'` +if eval \${ac_cv_prog_cc_${ac_cc}_c_o+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +# Make sure it works both with $CC and with simple cc. +# We do the test twice because some compilers refuse to overwrite an +# existing .o file with -o, though they will create one. +ac_try='$CC -c conftest.$ac_ext -o conftest2.$ac_objext >&5' +rm -f conftest2.* +if { { case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && + test -f conftest2.$ac_objext && { { case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; +then + eval ac_cv_prog_cc_${ac_cc}_c_o=yes + if test "x$CC" != xcc; then + # Test first that cc exists at all. + if { ac_try='cc -c conftest.$ac_ext >&5' + { { case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; }; then + ac_try='cc -c conftest.$ac_ext -o conftest2.$ac_objext >&5' + rm -f conftest2.* + if { { case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && + test -f conftest2.$ac_objext && { { case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; + then + # cc works too. + : + else + # cc exists but doesn't like -o. + eval ac_cv_prog_cc_${ac_cc}_c_o=no + fi + fi + fi +else + eval ac_cv_prog_cc_${ac_cc}_c_o=no +fi +rm -f core conftest* + +fi +if eval test \$ac_cv_prog_cc_${ac_cc}_c_o = yes; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + +$as_echo "@%:@define NO_MINUS_C_MINUS_O 1" >>confdefs.h + +fi + +# FIXME: we rely on the cache variable name because +# there is no other way. +set dummy $CC +am_cc=`echo $2 | sed 's/[^a-zA-Z0-9_]/_/g;s/^[0-9]/_/'` +eval am_t=\$ac_cv_prog_cc_${am_cc}_c_o +if test "$am_t" != yes; then + # Losing compiler, so override with the script. + # FIXME: It is wrong to rewrite CC. + # But if we don't then we get into trouble of one sort or another. + # A longer-term fix would be to have automake use am__CC in this case, + # and then we could set am__CC="\$(top_srcdir)/compile \$(CC)" + CC="$am_aux_dir/compile $CC" +fi + + +ac_ext=cpp +ac_cpp='$CXXCPP $CPPFLAGS' +ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_cxx_compiler_gnu +if test -z "$CXX"; then + if test -n "$CCC"; then + CXX=$CCC + else + if test -n "$ac_tool_prefix"; then + for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC + do + # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. +set dummy $ac_tool_prefix$ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_CXX+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$CXX"; then + ac_cv_prog_CXX="$CXX" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_CXX="$ac_tool_prefix$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +CXX=$ac_cv_prog_CXX +if test -n "$CXX"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CXX" >&5 +$as_echo "$CXX" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$CXX" && break + done +fi +if test -z "$CXX"; then + ac_ct_CXX=$CXX + for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_CXX+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_CXX"; then + ac_cv_prog_ac_ct_CXX="$ac_ct_CXX" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_CXX="$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_CXX=$ac_cv_prog_ac_ct_CXX +if test -n "$ac_ct_CXX"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CXX" >&5 +$as_echo "$ac_ct_CXX" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$ac_ct_CXX" && break +done + + if test "x$ac_ct_CXX" = x; then + CXX="g++" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + CXX=$ac_ct_CXX + fi +fi + + fi +fi +# Provide some information about the compiler. +$as_echo "$as_me:${as_lineno-$LINENO}: checking for C++ compiler version" >&5 +set X $ac_compile +ac_compiler=$2 +for ac_option in --version -v -V -qversion; do + { { ac_try="$ac_compiler $ac_option >&5" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_compiler $ac_option >&5") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + sed '10a\ +... rest of stderr output deleted ... + 10q' conftest.err >conftest.er1 + cat conftest.er1 >&5 + fi + rm -f conftest.er1 conftest.err + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } +done + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C++ compiler" >&5 +$as_echo_n "checking whether we are using the GNU C++ compiler... " >&6; } +if ${ac_cv_cxx_compiler_gnu+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ +#ifndef __GNUC__ + choke me +#endif + + ; + return 0; +} +_ACEOF +if ac_fn_cxx_try_compile "$LINENO"; then : + ac_compiler_gnu=yes +else + ac_compiler_gnu=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +ac_cv_cxx_compiler_gnu=$ac_compiler_gnu + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_cxx_compiler_gnu" >&5 +$as_echo "$ac_cv_cxx_compiler_gnu" >&6; } +if test $ac_compiler_gnu = yes; then + GXX=yes +else + GXX= +fi +ac_test_CXXFLAGS=${CXXFLAGS+set} +ac_save_CXXFLAGS=$CXXFLAGS +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CXX accepts -g" >&5 +$as_echo_n "checking whether $CXX accepts -g... " >&6; } +if ${ac_cv_prog_cxx_g+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_save_cxx_werror_flag=$ac_cxx_werror_flag + ac_cxx_werror_flag=yes + ac_cv_prog_cxx_g=no + CXXFLAGS="-g" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_cxx_try_compile "$LINENO"; then : + ac_cv_prog_cxx_g=yes +else + CXXFLAGS="" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_cxx_try_compile "$LINENO"; then : + +else + ac_cxx_werror_flag=$ac_save_cxx_werror_flag + CXXFLAGS="-g" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_cxx_try_compile "$LINENO"; then : + ac_cv_prog_cxx_g=yes +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + ac_cxx_werror_flag=$ac_save_cxx_werror_flag +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cxx_g" >&5 +$as_echo "$ac_cv_prog_cxx_g" >&6; } +if test "$ac_test_CXXFLAGS" = set; then + CXXFLAGS=$ac_save_CXXFLAGS +elif test $ac_cv_prog_cxx_g = yes; then + if test "$GXX" = yes; then + CXXFLAGS="-g -O2" + else + CXXFLAGS="-g" + fi +else + if test "$GXX" = yes; then + CXXFLAGS="-O2" + else + CXXFLAGS= + fi +fi +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + +depcc="$CXX" am_compiler_list= + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5 +$as_echo_n "checking dependency style of $depcc... " >&6; } +if ${am_cv_CXX_dependencies_compiler_type+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then + # We make a subdir and do the tests there. Otherwise we can end up + # making bogus files that we don't know about and never remove. For + # instance it was reported that on HP-UX the gcc test will end up + # making a dummy file named `D' -- because `-MD' means `put the output + # in D'. + rm -rf conftest.dir + mkdir conftest.dir + # Copy depcomp to subdir because otherwise we won't find it if we're + # using a relative directory. + cp "$am_depcomp" conftest.dir + cd conftest.dir + # We will build objects and dependencies in a subdirectory because + # it helps to detect inapplicable dependency modes. For instance + # both Tru64's cc and ICC support -MD to output dependencies as a + # side effect of compilation, but ICC will put the dependencies in + # the current directory while Tru64 will put them in the object + # directory. + mkdir sub + + am_cv_CXX_dependencies_compiler_type=none + if test "$am_compiler_list" = ""; then + am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp` + fi + am__universal=false + case " $depcc " in #( + *\ -arch\ *\ -arch\ *) am__universal=true ;; + esac + + for depmode in $am_compiler_list; do + # Setup a source with many dependencies, because some compilers + # like to wrap large dependency lists on column 80 (with \), and + # we should not choose a depcomp mode which is confused by this. + # + # We need to recreate these files for each test, as the compiler may + # overwrite some of them when testing with obscure command lines. + # This happens at least with the AIX C compiler. + : > sub/conftest.c + for i in 1 2 3 4 5 6; do + echo '#include "conftst'$i'.h"' >> sub/conftest.c + # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with + # Solaris 8's {/usr,}/bin/sh. + touch sub/conftst$i.h + done + echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf + + # We check with `-c' and `-o' for the sake of the "dashmstdout" + # mode. It turns out that the SunPro C++ compiler does not properly + # handle `-M -o', and we need to detect this. Also, some Intel + # versions had trouble with output in subdirs + am__obj=sub/conftest.${OBJEXT-o} + am__minus_obj="-o $am__obj" + case $depmode in + gcc) + # This depmode causes a compiler race in universal mode. + test "$am__universal" = false || continue + ;; + nosideeffect) + # after this tag, mechanisms are not by side-effect, so they'll + # only be used when explicitly requested + if test "x$enable_dependency_tracking" = xyes; then + continue + else + break + fi + ;; + msvc7 | msvc7msys | msvisualcpp | msvcmsys) + # This compiler won't grok `-c -o', but also, the minuso test has + # not run yet. These depmodes are late enough in the game, and + # so weak that their functioning should not be impacted. + am__obj=conftest.${OBJEXT-o} + am__minus_obj= + ;; + none) break ;; + esac + if depmode=$depmode \ + source=sub/conftest.c object=$am__obj \ + depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ + $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ + >/dev/null 2>conftest.err && + grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && + grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && + grep $am__obj sub/conftest.Po > /dev/null 2>&1 && + ${MAKE-make} -s -f confmf > /dev/null 2>&1; then + # icc doesn't choke on unknown options, it will just issue warnings + # or remarks (even with -Werror). So we grep stderr for any message + # that says an option was ignored or not supported. + # When given -MP, icc 7.0 and 7.1 complain thusly: + # icc: Command line warning: ignoring option '-M'; no argument required + # The diagnosis changed in icc 8.0: + # icc: Command line remark: option '-MP' not supported + if (grep 'ignoring option' conftest.err || + grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else + am_cv_CXX_dependencies_compiler_type=$depmode + break + fi + fi + done + + cd .. + rm -rf conftest.dir +else + am_cv_CXX_dependencies_compiler_type=none +fi + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_CXX_dependencies_compiler_type" >&5 +$as_echo "$am_cv_CXX_dependencies_compiler_type" >&6; } +CXXDEPMODE=depmode=$am_cv_CXX_dependencies_compiler_type + + if + test "x$enable_dependency_tracking" != xno \ + && test "$am_cv_CXX_dependencies_compiler_type" = gcc3; then + am__fastdepCXX_TRUE= + am__fastdepCXX_FALSE='#' +else + am__fastdepCXX_TRUE='#' + am__fastdepCXX_FALSE= +fi + + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ln -s works" >&5 +$as_echo_n "checking whether ln -s works... " >&6; } +LN_S=$as_ln_s +if test "$LN_S" = "ln -s"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no, using $LN_S" >&5 +$as_echo "no, using $LN_S" >&6; } +fi + + +# AC_DISABLE_SHARED +AC_PROG_LIBTOOL + +#enable -D_GNU_SOURCE since the return code value of getaddrinfo +#ifdefed with __USE_GNU +#features.h header undef's __USE_GNU and defines it only if _GNU_SOURCE is defined +#hence this define for gcc +@%:@ Check whether --enable-debug was given. +if test "${enable_debug+set}" = set; then : + enableval=$enable_debug; +else + enable_debug=no +fi + + +if test "x$enable_debug" = xyes; then + if test "x$init_cflags" = x; then + CFLAGS="" + fi + CFLAGS="$CFLAGS -g -O0 -D_GNU_SOURCE" +else + if test "x$init_cflags" = x; then + CFLAGS="-g -O2 -D_GNU_SOURCE" + fi +fi + +if test "x$enable_debug" = xyes; then + if test "x$init_cxxflags" = x; then + CXXFLAGS="" + fi + CXXFLAGS="$CXXFLAGS -g -O0" +else + if test "x$init_cxxflags" = x; then + CXXFLAGS="-g -O2" + fi +fi + + +@%:@ Check whether --with-syncapi was given. +if test "${with_syncapi+set}" = set; then : + withval=$with_syncapi; +else + with_syncapi=yes +fi + + +# Checks for libraries. + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for pthread_mutex_lock in -lpthread" >&5 +$as_echo_n "checking for pthread_mutex_lock in -lpthread... " >&6; } +if ${ac_cv_lib_pthread_pthread_mutex_lock+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lpthread $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char pthread_mutex_lock (); +int +main () +{ +return pthread_mutex_lock (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_pthread_pthread_mutex_lock=yes +else + ac_cv_lib_pthread_pthread_mutex_lock=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_pthread_pthread_mutex_lock" >&5 +$as_echo "$ac_cv_lib_pthread_pthread_mutex_lock" >&6; } +if test "x$ac_cv_lib_pthread_pthread_mutex_lock" = xyes; then : + have_pthread=yes +else + have_pthread=no +fi + + +if test "x$with_syncapi" != xno && test "x$have_pthread" = xno; then + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cannot build SyncAPI -- pthread not found" >&5 +$as_echo "$as_me: WARNING: cannot build SyncAPI -- pthread not found" >&2;} + with_syncapi=no +fi +if test "x$with_syncapi" != xno; then + { $as_echo "$as_me:${as_lineno-$LINENO}: building with SyncAPI support" >&5 +$as_echo "$as_me: building with SyncAPI support" >&6;} +else + { $as_echo "$as_me:${as_lineno-$LINENO}: building without SyncAPI support" >&5 +$as_echo "$as_me: building without SyncAPI support" >&6;} +fi + + if test "x$with_syncapi" != xno; then + WANT_SYNCAPI_TRUE= + WANT_SYNCAPI_FALSE='#' +else + WANT_SYNCAPI_TRUE='#' + WANT_SYNCAPI_FALSE= +fi + + +# Checks for header files. +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C preprocessor" >&5 +$as_echo_n "checking how to run the C preprocessor... " >&6; } +# On Suns, sometimes $CPP names a directory. +if test -n "$CPP" && test -d "$CPP"; then + CPP= +fi +if test -z "$CPP"; then + if ${ac_cv_prog_CPP+:} false; then : + $as_echo_n "(cached) " >&6 +else + # Double quotes because CPP needs to be expanded + for CPP in "$CC -E" "$CC -E -traditional-cpp" "/lib/cpp" + do + ac_preproc_ok=false +for ac_c_preproc_warn_flag in '' yes +do + # Use a header file that comes with gcc, so configuring glibc + # with a fresh cross-compiler works. + # Prefer to if __STDC__ is defined, since + # exists even on freestanding compilers. + # On the NeXT, cc -E runs the code through the compiler's parser, + # not just through cpp. "Syntax error" is here to catch this case. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +@%:@ifdef __STDC__ +@%:@ include +@%:@else +@%:@ include +@%:@endif + Syntax error +_ACEOF +if ac_fn_c_try_cpp "$LINENO"; then : + +else + # Broken: fails on valid input. +continue +fi +rm -f conftest.err conftest.i conftest.$ac_ext + + # OK, works on sane cases. Now check whether nonexistent headers + # can be detected and how. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +@%:@include +_ACEOF +if ac_fn_c_try_cpp "$LINENO"; then : + # Broken: success on invalid input. +continue +else + # Passes both tests. +ac_preproc_ok=: +break +fi +rm -f conftest.err conftest.i conftest.$ac_ext + +done +# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. +rm -f conftest.i conftest.err conftest.$ac_ext +if $ac_preproc_ok; then : + break +fi + + done + ac_cv_prog_CPP=$CPP + +fi + CPP=$ac_cv_prog_CPP +else + ac_cv_prog_CPP=$CPP +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $CPP" >&5 +$as_echo "$CPP" >&6; } +ac_preproc_ok=false +for ac_c_preproc_warn_flag in '' yes +do + # Use a header file that comes with gcc, so configuring glibc + # with a fresh cross-compiler works. + # Prefer to if __STDC__ is defined, since + # exists even on freestanding compilers. + # On the NeXT, cc -E runs the code through the compiler's parser, + # not just through cpp. "Syntax error" is here to catch this case. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +@%:@ifdef __STDC__ +@%:@ include +@%:@else +@%:@ include +@%:@endif + Syntax error +_ACEOF +if ac_fn_c_try_cpp "$LINENO"; then : + +else + # Broken: fails on valid input. +continue +fi +rm -f conftest.err conftest.i conftest.$ac_ext + + # OK, works on sane cases. Now check whether nonexistent headers + # can be detected and how. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +@%:@include +_ACEOF +if ac_fn_c_try_cpp "$LINENO"; then : + # Broken: success on invalid input. +continue +else + # Passes both tests. +ac_preproc_ok=: +break +fi +rm -f conftest.err conftest.i conftest.$ac_ext + +done +# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. +rm -f conftest.i conftest.err conftest.$ac_ext +if $ac_preproc_ok; then : + +else + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "C preprocessor \"$CPP\" fails sanity check +See \`config.log' for more details" "$LINENO" 5; } +fi + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for grep that handles long lines and -e" >&5 +$as_echo_n "checking for grep that handles long lines and -e... " >&6; } +if ${ac_cv_path_GREP+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -z "$GREP"; then + ac_path_GREP_found=false + # Loop through the user's path and test for each of PROGNAME-LIST + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_prog in grep ggrep; do + for ac_exec_ext in '' $ac_executable_extensions; do + ac_path_GREP="$as_dir/$ac_prog$ac_exec_ext" + as_fn_executable_p "$ac_path_GREP" || continue +# Check for GNU ac_path_GREP and select it if it is found. + # Check for GNU $ac_path_GREP +case `"$ac_path_GREP" --version 2>&1` in +*GNU*) + ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_found=:;; +*) + ac_count=0 + $as_echo_n 0123456789 >"conftest.in" + while : + do + cat "conftest.in" "conftest.in" >"conftest.tmp" + mv "conftest.tmp" "conftest.in" + cp "conftest.in" "conftest.nl" + $as_echo 'GREP' >> "conftest.nl" + "$ac_path_GREP" -e 'GREP$' -e '-(cannot match)-' < "conftest.nl" >"conftest.out" 2>/dev/null || break + diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break + as_fn_arith $ac_count + 1 && ac_count=$as_val + if test $ac_count -gt ${ac_path_GREP_max-0}; then + # Best one so far, save it but keep looking for a better one + ac_cv_path_GREP="$ac_path_GREP" + ac_path_GREP_max=$ac_count + fi + # 10*(2^10) chars as input seems more than enough + test $ac_count -gt 10 && break + done + rm -f conftest.in conftest.tmp conftest.nl conftest.out;; +esac + + $ac_path_GREP_found && break 3 + done + done + done +IFS=$as_save_IFS + if test -z "$ac_cv_path_GREP"; then + as_fn_error $? "no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 + fi +else + ac_cv_path_GREP=$GREP +fi + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_GREP" >&5 +$as_echo "$ac_cv_path_GREP" >&6; } + GREP="$ac_cv_path_GREP" + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for egrep" >&5 +$as_echo_n "checking for egrep... " >&6; } +if ${ac_cv_path_EGREP+:} false; then : + $as_echo_n "(cached) " >&6 +else + if echo a | $GREP -E '(a|b)' >/dev/null 2>&1 + then ac_cv_path_EGREP="$GREP -E" + else + if test -z "$EGREP"; then + ac_path_EGREP_found=false + # Loop through the user's path and test for each of PROGNAME-LIST + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_prog in egrep; do + for ac_exec_ext in '' $ac_executable_extensions; do + ac_path_EGREP="$as_dir/$ac_prog$ac_exec_ext" + as_fn_executable_p "$ac_path_EGREP" || continue +# Check for GNU ac_path_EGREP and select it if it is found. + # Check for GNU $ac_path_EGREP +case `"$ac_path_EGREP" --version 2>&1` in +*GNU*) + ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_found=:;; +*) + ac_count=0 + $as_echo_n 0123456789 >"conftest.in" + while : + do + cat "conftest.in" "conftest.in" >"conftest.tmp" + mv "conftest.tmp" "conftest.in" + cp "conftest.in" "conftest.nl" + $as_echo 'EGREP' >> "conftest.nl" + "$ac_path_EGREP" 'EGREP$' < "conftest.nl" >"conftest.out" 2>/dev/null || break + diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break + as_fn_arith $ac_count + 1 && ac_count=$as_val + if test $ac_count -gt ${ac_path_EGREP_max-0}; then + # Best one so far, save it but keep looking for a better one + ac_cv_path_EGREP="$ac_path_EGREP" + ac_path_EGREP_max=$ac_count + fi + # 10*(2^10) chars as input seems more than enough + test $ac_count -gt 10 && break + done + rm -f conftest.in conftest.tmp conftest.nl conftest.out;; +esac + + $ac_path_EGREP_found && break 3 + done + done + done +IFS=$as_save_IFS + if test -z "$ac_cv_path_EGREP"; then + as_fn_error $? "no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 + fi +else + ac_cv_path_EGREP=$EGREP +fi + + fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_EGREP" >&5 +$as_echo "$ac_cv_path_EGREP" >&6; } + EGREP="$ac_cv_path_EGREP" + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header files" >&5 +$as_echo_n "checking for ANSI C header files... " >&6; } +if ${ac_cv_header_stdc+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +#include +#include +#include + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_header_stdc=yes +else + ac_cv_header_stdc=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + +if test $ac_cv_header_stdc = yes; then + # SunOS 4.x string.h does not declare mem*, contrary to ANSI. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include + +_ACEOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + $EGREP "memchr" >/dev/null 2>&1; then : + +else + ac_cv_header_stdc=no +fi +rm -f conftest* + +fi + +if test $ac_cv_header_stdc = yes; then + # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include + +_ACEOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + $EGREP "free" >/dev/null 2>&1; then : + +else + ac_cv_header_stdc=no +fi +rm -f conftest* + +fi + +if test $ac_cv_header_stdc = yes; then + # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi. + if test "$cross_compiling" = yes; then : + : +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +#include +#if ((' ' & 0x0FF) == 0x020) +# define ISLOWER(c) ('a' <= (c) && (c) <= 'z') +# define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c)) +#else +# define ISLOWER(c) \ + (('a' <= (c) && (c) <= 'i') \ + || ('j' <= (c) && (c) <= 'r') \ + || ('s' <= (c) && (c) <= 'z')) +# define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c)) +#endif + +#define XOR(e, f) (((e) && !(f)) || (!(e) && (f))) +int +main () +{ + int i; + for (i = 0; i < 256; i++) + if (XOR (islower (i), ISLOWER (i)) + || toupper (i) != TOUPPER (i)) + return 2; + return 0; +} +_ACEOF +if ac_fn_c_try_run "$LINENO"; then : + +else + ac_cv_header_stdc=no +fi +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ + conftest.$ac_objext conftest.beam conftest.$ac_ext +fi + +fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdc" >&5 +$as_echo "$ac_cv_header_stdc" >&6; } +if test $ac_cv_header_stdc = yes; then + +$as_echo "@%:@define STDC_HEADERS 1" >>confdefs.h + +fi + +# On IRIX 5.3, sys/types and inttypes.h are conflicting. +for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \ + inttypes.h stdint.h unistd.h +do : + as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` +ac_fn_c_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default +" +if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : + cat >>confdefs.h <<_ACEOF +@%:@define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 +_ACEOF + +fi + +done + + +for ac_header in arpa/inet.h fcntl.h netdb.h netinet/in.h stdlib.h string.h sys/socket.h sys/time.h unistd.h sys/utsname.h +do : + as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` +ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default" +if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : + cat >>confdefs.h <<_ACEOF +@%:@define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 +_ACEOF + +fi + +done + + +# Checks for typedefs, structures, and compiler characteristics. +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for an ANSI C-conforming const" >&5 +$as_echo_n "checking for an ANSI C-conforming const... " >&6; } +if ${ac_cv_c_const+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + +#ifndef __cplusplus + /* Ultrix mips cc rejects this sort of thing. */ + typedef int charset[2]; + const charset cs = { 0, 0 }; + /* SunOS 4.1.1 cc rejects this. */ + char const *const *pcpcc; + char **ppc; + /* NEC SVR4.0.2 mips cc rejects this. */ + struct point {int x, y;}; + static struct point const zero = {0,0}; + /* AIX XL C 1.02.0.0 rejects this. + It does not let you subtract one const X* pointer from another in + an arm of an if-expression whose if-part is not a constant + expression */ + const char *g = "string"; + pcpcc = &g + (g ? g-g : 0); + /* HPUX 7.0 cc rejects these. */ + ++pcpcc; + ppc = (char**) pcpcc; + pcpcc = (char const *const *) ppc; + { /* SCO 3.2v4 cc rejects this sort of thing. */ + char tx; + char *t = &tx; + char const *s = 0 ? (char *) 0 : (char const *) 0; + + *t++ = 0; + if (s) return 0; + } + { /* Someone thinks the Sun supposedly-ANSI compiler will reject this. */ + int x[] = {25, 17}; + const int *foo = &x[0]; + ++foo; + } + { /* Sun SC1.0 ANSI compiler rejects this -- but not the above. */ + typedef const int *iptr; + iptr p = 0; + ++p; + } + { /* AIX XL C 1.02.0.0 rejects this sort of thing, saying + "k.c", line 2.27: 1506-025 (S) Operand must be a modifiable lvalue. */ + struct s { int j; const int *ap[3]; } bx; + struct s *b = &bx; b->j = 5; + } + { /* ULTRIX-32 V3.1 (Rev 9) vcc rejects this */ + const int foo = 10; + if (!foo) return 0; + } + return !cs[0] && !zero.x; +#endif + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_c_const=yes +else + ac_cv_c_const=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_const" >&5 +$as_echo "$ac_cv_c_const" >&6; } +if test $ac_cv_c_const = no; then + +$as_echo "@%:@define const /**/" >>confdefs.h + +fi + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for inline" >&5 +$as_echo_n "checking for inline... " >&6; } +if ${ac_cv_c_inline+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_cv_c_inline=no +for ac_kw in inline __inline__ __inline; do + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#ifndef __cplusplus +typedef int foo_t; +static $ac_kw foo_t static_foo () {return 0; } +$ac_kw foo_t foo () {return 0; } +#endif + +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_c_inline=$ac_kw +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + test "$ac_cv_c_inline" != no && break +done + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_inline" >&5 +$as_echo "$ac_cv_c_inline" >&6; } + +case $ac_cv_c_inline in + inline | yes) ;; + *) + case $ac_cv_c_inline in + no) ac_val=;; + *) ac_val=$ac_cv_c_inline;; + esac + cat >>confdefs.h <<_ACEOF +#ifndef __cplusplus +#define inline $ac_val +#endif +_ACEOF + ;; +esac + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether time.h and sys/time.h may both be included" >&5 +$as_echo_n "checking whether time.h and sys/time.h may both be included... " >&6; } +if ${ac_cv_header_time+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +#include +#include + +int +main () +{ +if ((struct tm *) 0) +return 0; + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_header_time=yes +else + ac_cv_header_time=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_time" >&5 +$as_echo "$ac_cv_header_time" >&6; } +if test $ac_cv_header_time = yes; then + +$as_echo "@%:@define TIME_WITH_SYS_TIME 1" >>confdefs.h + +fi + +ac_fn_c_check_type "$LINENO" "nfds_t" "ac_cv_type_nfds_t" "#include +" +if test "x$ac_cv_type_nfds_t" = xyes; then : + +$as_echo "@%:@define POLL_NFDS_TYPE nfds_t" >>confdefs.h + +else + +$as_echo "@%:@define POLL_NFDS_TYPE unsigned int" >>confdefs.h + +fi + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to enable ipv6" >&5 +$as_echo_n "checking whether to enable ipv6... " >&6; } + +if test "$cross_compiling" = yes; then : + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + ipv6=no +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + /* is AF_INET6 available? */ +#include +#include +main() +{ + if (socket(AF_INET6, SOCK_STREAM, 0) < 0) + exit(1); + else + exit(0); +} + +_ACEOF +if ac_fn_c_try_run "$LINENO"; then : + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + ipv6=yes +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + ipv6=no +fi +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ + conftest.$ac_objext conftest.beam conftest.$ac_ext +fi + + +if test x"$ipv6" = xyes; then + USEIPV6="-DZOO_IPV6_ENABLED" + +fi + +# Checks for library functions. +for ac_func in getcwd gethostbyname gethostname getlogin getpwuid_r gettimeofday getuid memmove memset poll socket strchr strdup strerror strtol +do : + as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` +ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var" +if eval test \"x\$"$as_ac_var"\" = x"yes"; then : + cat >>confdefs.h <<_ACEOF +@%:@define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 +_ACEOF + +fi +done + + +ac_config_files="$ac_config_files Makefile" + +cat >confcache <<\_ACEOF +# This file is a shell script that caches the results of configure +# tests run on this system so they can be shared between configure +# scripts and configure runs, see configure's option --config-cache. +# It is not useful on other systems. If it contains results you don't +# want to keep, you may remove or edit it. +# +# config.status only pays attention to the cache file if you give it +# the --recheck option to rerun configure. +# +# `ac_cv_env_foo' variables (set or unset) will be overridden when +# loading this file, other *unset* `ac_cv_foo' will be assigned the +# following values. + +_ACEOF + +# The following way of writing the cache mishandles newlines in values, +# but we know of no workaround that is simple, portable, and efficient. +# So, we kill variables containing newlines. +# Ultrix sh set writes to stderr and can't be redirected directly, +# and sets the high bit in the cache file unless we assign to the vars. +( + for ac_var in `(set) 2>&1 | sed -n 's/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'`; do + eval ac_val=\$$ac_var + case $ac_val in #( + *${as_nl}*) + case $ac_var in #( + *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 +$as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; + esac + case $ac_var in #( + _ | IFS | as_nl) ;; #( + BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( + *) { eval $ac_var=; unset $ac_var;} ;; + esac ;; + esac + done + + (set) 2>&1 | + case $as_nl`(ac_space=' '; set) 2>&1` in #( + *${as_nl}ac_space=\ *) + # `set' does not quote correctly, so add quotes: double-quote + # substitution turns \\\\ into \\, and sed turns \\ into \. + sed -n \ + "s/'/'\\\\''/g; + s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p" + ;; #( + *) + # `set' quotes correctly as required by POSIX, so do not add quotes. + sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" + ;; + esac | + sort +) | + sed ' + /^ac_cv_env_/b end + t clear + :clear + s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/ + t end + s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/ + :end' >>confcache +if diff "$cache_file" confcache >/dev/null 2>&1; then :; else + if test -w "$cache_file"; then + if test "x$cache_file" != "x/dev/null"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5 +$as_echo "$as_me: updating cache $cache_file" >&6;} + if test ! -f "$cache_file" || test -h "$cache_file"; then + cat confcache >"$cache_file" + else + case $cache_file in #( + */* | ?:*) + mv -f confcache "$cache_file"$$ && + mv -f "$cache_file"$$ "$cache_file" ;; #( + *) + mv -f confcache "$cache_file" ;; + esac + fi + fi + else + { $as_echo "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5 +$as_echo "$as_me: not updating unwritable cache $cache_file" >&6;} + fi +fi +rm -f confcache + +test "x$prefix" = xNONE && prefix=$ac_default_prefix +# Let make expand exec_prefix. +test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' + +DEFS=-DHAVE_CONFIG_H + +ac_libobjs= +ac_ltlibobjs= +U= +for ac_i in : $LIB@&t@OBJS; do test "x$ac_i" = x: && continue + # 1. Remove the extension, and $U if already installed. + ac_script='s/\$U\././;s/\.o$//;s/\.obj$//' + ac_i=`$as_echo "$ac_i" | sed "$ac_script"` + # 2. Prepend LIBOBJDIR. When used with automake>=1.10 LIBOBJDIR + # will be set to the directory where LIBOBJS objects are built. + as_fn_append ac_libobjs " \${LIBOBJDIR}$ac_i\$U.$ac_objext" + as_fn_append ac_ltlibobjs " \${LIBOBJDIR}$ac_i"'$U.lo' +done +LIB@&t@OBJS=$ac_libobjs + +LTLIBOBJS=$ac_ltlibobjs + + +if test -z "${DX_COND_doc_TRUE}" && test -z "${DX_COND_doc_FALSE}"; then + as_fn_error $? "conditional \"DX_COND_doc\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${DX_COND_doc_TRUE}" && test -z "${DX_COND_doc_FALSE}"; then + as_fn_error $? "conditional \"DX_COND_doc\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${DX_COND_dot_TRUE}" && test -z "${DX_COND_dot_FALSE}"; then + as_fn_error $? "conditional \"DX_COND_dot\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${DX_COND_dot_TRUE}" && test -z "${DX_COND_dot_FALSE}"; then + as_fn_error $? "conditional \"DX_COND_dot\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${DX_COND_man_TRUE}" && test -z "${DX_COND_man_FALSE}"; then + as_fn_error $? "conditional \"DX_COND_man\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${DX_COND_man_TRUE}" && test -z "${DX_COND_man_FALSE}"; then + as_fn_error $? "conditional \"DX_COND_man\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${DX_COND_rtf_TRUE}" && test -z "${DX_COND_rtf_FALSE}"; then + as_fn_error $? "conditional \"DX_COND_rtf\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${DX_COND_rtf_TRUE}" && test -z "${DX_COND_rtf_FALSE}"; then + as_fn_error $? "conditional \"DX_COND_rtf\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${DX_COND_xml_TRUE}" && test -z "${DX_COND_xml_FALSE}"; then + as_fn_error $? "conditional \"DX_COND_xml\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${DX_COND_xml_TRUE}" && test -z "${DX_COND_xml_FALSE}"; then + as_fn_error $? "conditional \"DX_COND_xml\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${DX_COND_chm_TRUE}" && test -z "${DX_COND_chm_FALSE}"; then + as_fn_error $? "conditional \"DX_COND_chm\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${DX_COND_chm_TRUE}" && test -z "${DX_COND_chm_FALSE}"; then + as_fn_error $? "conditional \"DX_COND_chm\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${DX_COND_chi_TRUE}" && test -z "${DX_COND_chi_FALSE}"; then + as_fn_error $? "conditional \"DX_COND_chi\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${DX_COND_chi_TRUE}" && test -z "${DX_COND_chi_FALSE}"; then + as_fn_error $? "conditional \"DX_COND_chi\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${DX_COND_html_TRUE}" && test -z "${DX_COND_html_FALSE}"; then + as_fn_error $? "conditional \"DX_COND_html\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${DX_COND_html_TRUE}" && test -z "${DX_COND_html_FALSE}"; then + as_fn_error $? "conditional \"DX_COND_html\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${DX_COND_ps_TRUE}" && test -z "${DX_COND_ps_FALSE}"; then + as_fn_error $? "conditional \"DX_COND_ps\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${DX_COND_ps_TRUE}" && test -z "${DX_COND_ps_FALSE}"; then + as_fn_error $? "conditional \"DX_COND_ps\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${DX_COND_pdf_TRUE}" && test -z "${DX_COND_pdf_FALSE}"; then + as_fn_error $? "conditional \"DX_COND_pdf\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${DX_COND_pdf_TRUE}" && test -z "${DX_COND_pdf_FALSE}"; then + as_fn_error $? "conditional \"DX_COND_pdf\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${DX_COND_latex_TRUE}" && test -z "${DX_COND_latex_FALSE}"; then + as_fn_error $? "conditional \"DX_COND_latex\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${DX_COND_latex_TRUE}" && test -z "${DX_COND_latex_FALSE}"; then + as_fn_error $? "conditional \"DX_COND_latex\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi + if test -n "$EXEEXT"; then + am__EXEEXT_TRUE= + am__EXEEXT_FALSE='#' +else + am__EXEEXT_TRUE='#' + am__EXEEXT_FALSE= +fi + +if test -z "${AMDEP_TRUE}" && test -z "${AMDEP_FALSE}"; then + as_fn_error $? "conditional \"AMDEP\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${am__fastdepCC_TRUE}" && test -z "${am__fastdepCC_FALSE}"; then + as_fn_error $? "conditional \"am__fastdepCC\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${am__fastdepCXX_TRUE}" && test -z "${am__fastdepCXX_FALSE}"; then + as_fn_error $? "conditional \"am__fastdepCXX\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${WANT_SYNCAPI_TRUE}" && test -z "${WANT_SYNCAPI_FALSE}"; then + as_fn_error $? "conditional \"WANT_SYNCAPI\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi + +: "${CONFIG_STATUS=./config.status}" +ac_write_fail=0 +ac_clean_files_save=$ac_clean_files +ac_clean_files="$ac_clean_files $CONFIG_STATUS" +{ $as_echo "$as_me:${as_lineno-$LINENO}: creating $CONFIG_STATUS" >&5 +$as_echo "$as_me: creating $CONFIG_STATUS" >&6;} +as_write_fail=0 +cat >$CONFIG_STATUS <<_ASEOF || as_write_fail=1 +#! $SHELL +# Generated by $as_me. +# Run this file to recreate the current configuration. +# Compiler output produced by configure, useful for debugging +# configure, is in config.log if it exists. + +debug=false +ac_cs_recheck=false +ac_cs_silent=false + +SHELL=\${CONFIG_SHELL-$SHELL} +export SHELL +_ASEOF +cat >>$CONFIG_STATUS <<\_ASEOF || as_write_fail=1 +## -------------------- ## +## M4sh Initialization. ## +## -------------------- ## + +# Be more Bourne compatible +DUALCASE=1; export DUALCASE # for MKS sh +if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : + emulate sh + NULLCMD=: + # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which + # is contrary to our usage. Disable this feature. + alias -g '${1+"$@"}'='"$@"' + setopt NO_GLOB_SUBST +else + case `(set -o) 2>/dev/null` in @%:@( + *posix*) : + set -o posix ;; @%:@( + *) : + ;; +esac +fi + + +as_nl=' +' +export as_nl +# Printing a long string crashes Solaris 7 /usr/bin/printf. +as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' +as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo +as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo +# Prefer a ksh shell builtin over an external printf program on Solaris, +# but without wasting forks for bash or zsh. +if test -z "$BASH_VERSION$ZSH_VERSION" \ + && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then + as_echo='print -r --' + as_echo_n='print -rn --' +elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then + as_echo='printf %s\n' + as_echo_n='printf %s' +else + if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then + as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' + as_echo_n='/usr/ucb/echo -n' + else + as_echo_body='eval expr "X$1" : "X\\(.*\\)"' + as_echo_n_body='eval + arg=$1; + case $arg in @%:@( + *"$as_nl"*) + expr "X$arg" : "X\\(.*\\)$as_nl"; + arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; + esac; + expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" + ' + export as_echo_n_body + as_echo_n='sh -c $as_echo_n_body as_echo' + fi + export as_echo_body + as_echo='sh -c $as_echo_body as_echo' +fi + +# The user is always right. +if test "${PATH_SEPARATOR+set}" != set; then + PATH_SEPARATOR=: + (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { + (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || + PATH_SEPARATOR=';' + } +fi + + +# IFS +# We need space, tab and new line, in precisely that order. Quoting is +# there to prevent editors from complaining about space-tab. +# (If _AS_PATH_WALK were called with IFS unset, it would disable word +# splitting by setting IFS to empty value.) +IFS=" "" $as_nl" + +# Find who we are. Look in the path if we contain no directory separator. +as_myself= +case $0 in @%:@(( + *[\\/]* ) as_myself=$0 ;; + *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break + done +IFS=$as_save_IFS + + ;; +esac +# We did not find ourselves, most probably we were run as `sh COMMAND' +# in which case we are not to be found in the path. +if test "x$as_myself" = x; then + as_myself=$0 +fi +if test ! -f "$as_myself"; then + $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 + exit 1 +fi + +# Unset variables that we do not need and which cause bugs (e.g. in +# pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" +# suppresses any "Segmentation fault" message there. '((' could +# trigger a bug in pdksh 5.2.14. +for as_var in BASH_ENV ENV MAIL MAILPATH +do eval test x\${$as_var+set} = xset \ + && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : +done +PS1='$ ' +PS2='> ' +PS4='+ ' + +# NLS nuisances. +LC_ALL=C +export LC_ALL +LANGUAGE=C +export LANGUAGE + +# CDPATH. +(unset CDPATH) >/dev/null 2>&1 && unset CDPATH + + +@%:@ as_fn_error STATUS ERROR [LINENO LOG_FD] +@%:@ ---------------------------------------- +@%:@ Output "`basename @S|@0`: error: ERROR" to stderr. If LINENO and LOG_FD are +@%:@ provided, also output the error to LOG_FD, referencing LINENO. Then exit the +@%:@ script with STATUS, using 1 if that was 0. +as_fn_error () +{ + as_status=$1; test $as_status -eq 0 && as_status=1 + if test "$4"; then + as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 + fi + $as_echo "$as_me: error: $2" >&2 + as_fn_exit $as_status +} @%:@ as_fn_error + + +@%:@ as_fn_set_status STATUS +@%:@ ----------------------- +@%:@ Set @S|@? to STATUS, without forking. +as_fn_set_status () +{ + return $1 +} @%:@ as_fn_set_status + +@%:@ as_fn_exit STATUS +@%:@ ----------------- +@%:@ Exit the shell with STATUS, even in a "trap 0" or "set -e" context. +as_fn_exit () +{ + set +e + as_fn_set_status $1 + exit $1 +} @%:@ as_fn_exit + +@%:@ as_fn_unset VAR +@%:@ --------------- +@%:@ Portably unset VAR. +as_fn_unset () +{ + { eval $1=; unset $1;} +} +as_unset=as_fn_unset +@%:@ as_fn_append VAR VALUE +@%:@ ---------------------- +@%:@ Append the text in VALUE to the end of the definition contained in VAR. Take +@%:@ advantage of any shell optimizations that allow amortized linear growth over +@%:@ repeated appends, instead of the typical quadratic growth present in naive +@%:@ implementations. +if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : + eval 'as_fn_append () + { + eval $1+=\$2 + }' +else + as_fn_append () + { + eval $1=\$$1\$2 + } +fi # as_fn_append + +@%:@ as_fn_arith ARG... +@%:@ ------------------ +@%:@ Perform arithmetic evaluation on the ARGs, and store the result in the +@%:@ global @S|@as_val. Take advantage of shells that can avoid forks. The arguments +@%:@ must be portable across @S|@(()) and expr. +if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : + eval 'as_fn_arith () + { + as_val=$(( $* )) + }' +else + as_fn_arith () + { + as_val=`expr "$@" || test $? -eq 1` + } +fi # as_fn_arith + + +if expr a : '\(a\)' >/dev/null 2>&1 && + test "X`expr 00001 : '.*\(...\)'`" = X001; then + as_expr=expr +else + as_expr=false +fi + +if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then + as_basename=basename +else + as_basename=false +fi + +if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then + as_dirname=dirname +else + as_dirname=false +fi + +as_me=`$as_basename -- "$0" || +$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ + X"$0" : 'X\(//\)$' \| \ + X"$0" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X/"$0" | + sed '/^.*\/\([^/][^/]*\)\/*$/{ + s//\1/ + q + } + /^X\/\(\/\/\)$/{ + s//\1/ + q + } + /^X\/\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + +# Avoid depending upon Character Ranges. +as_cr_letters='abcdefghijklmnopqrstuvwxyz' +as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' +as_cr_Letters=$as_cr_letters$as_cr_LETTERS +as_cr_digits='0123456789' +as_cr_alnum=$as_cr_Letters$as_cr_digits + +ECHO_C= ECHO_N= ECHO_T= +case `echo -n x` in @%:@((((( +-n*) + case `echo 'xy\c'` in + *c*) ECHO_T=' ';; # ECHO_T is single tab character. + xy) ECHO_C='\c';; + *) echo `echo ksh88 bug on AIX 6.1` > /dev/null + ECHO_T=' ';; + esac;; +*) + ECHO_N='-n';; +esac + +rm -f conf$$ conf$$.exe conf$$.file +if test -d conf$$.dir; then + rm -f conf$$.dir/conf$$.file +else + rm -f conf$$.dir + mkdir conf$$.dir 2>/dev/null +fi +if (echo >conf$$.file) 2>/dev/null; then + if ln -s conf$$.file conf$$ 2>/dev/null; then + as_ln_s='ln -s' + # ... but there are two gotchas: + # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. + # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. + # In both cases, we have to default to `cp -pR'. + ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || + as_ln_s='cp -pR' + elif ln conf$$.file conf$$ 2>/dev/null; then + as_ln_s=ln + else + as_ln_s='cp -pR' + fi +else + as_ln_s='cp -pR' +fi +rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file +rmdir conf$$.dir 2>/dev/null + + +@%:@ as_fn_mkdir_p +@%:@ ------------- +@%:@ Create "@S|@as_dir" as a directory, including parents if necessary. +as_fn_mkdir_p () +{ + + case $as_dir in #( + -*) as_dir=./$as_dir;; + esac + test -d "$as_dir" || eval $as_mkdir_p || { + as_dirs= + while :; do + case $as_dir in #( + *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( + *) as_qdir=$as_dir;; + esac + as_dirs="'$as_qdir' $as_dirs" + as_dir=`$as_dirname -- "$as_dir" || +$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$as_dir" : 'X\(//\)[^/]' \| \ + X"$as_dir" : 'X\(//\)$' \| \ + X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$as_dir" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + test -d "$as_dir" && break + done + test -z "$as_dirs" || eval "mkdir $as_dirs" + } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" + + +} @%:@ as_fn_mkdir_p +if mkdir -p . 2>/dev/null; then + as_mkdir_p='mkdir -p "$as_dir"' +else + test -d ./-p && rmdir ./-p + as_mkdir_p=false +fi + + +@%:@ as_fn_executable_p FILE +@%:@ ----------------------- +@%:@ Test if FILE is an executable regular file. +as_fn_executable_p () +{ + test -f "$1" && test -x "$1" +} @%:@ as_fn_executable_p +as_test_x='test -x' +as_executable_p=as_fn_executable_p + +# Sed expression to map a string onto a valid CPP name. +as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" + +# Sed expression to map a string onto a valid variable name. +as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" + + +exec 6>&1 +## ----------------------------------- ## +## Main body of $CONFIG_STATUS script. ## +## ----------------------------------- ## +_ASEOF +test $as_write_fail = 0 && chmod +x $CONFIG_STATUS || ac_write_fail=1 + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +# Save the log message, to keep $0 and so on meaningful, and to +# report actual input values of CONFIG_FILES etc. instead of their +# values after options handling. +ac_log=" +This file was extended by zookeeper C client $as_me 3.4.5, which was +generated by GNU Autoconf 2.69. Invocation command line was + + CONFIG_FILES = $CONFIG_FILES + CONFIG_HEADERS = $CONFIG_HEADERS + CONFIG_LINKS = $CONFIG_LINKS + CONFIG_COMMANDS = $CONFIG_COMMANDS + $ $0 $@ + +on `(hostname || uname -n) 2>/dev/null | sed 1q` +" + +_ACEOF + +case $ac_config_files in *" +"*) set x $ac_config_files; shift; ac_config_files=$*;; +esac + +case $ac_config_headers in *" +"*) set x $ac_config_headers; shift; ac_config_headers=$*;; +esac + + +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +# Files that config.status was made for. +config_files="$ac_config_files" +config_headers="$ac_config_headers" +config_commands="$ac_config_commands" + +_ACEOF + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +ac_cs_usage="\ +\`$as_me' instantiates files and other configuration actions +from templates according to the current configuration. Unless the files +and actions are specified as TAGs, all are instantiated by default. + +Usage: $0 [OPTION]... [TAG]... + + -h, --help print this help, then exit + -V, --version print version number and configuration settings, then exit + --config print configuration, then exit + -q, --quiet, --silent + do not print progress messages + -d, --debug don't remove temporary files + --recheck update $as_me by reconfiguring in the same conditions + --file=FILE[:TEMPLATE] + instantiate the configuration file FILE + --header=FILE[:TEMPLATE] + instantiate the configuration header FILE + +Configuration files: +$config_files + +Configuration headers: +$config_headers + +Configuration commands: +$config_commands + +Report bugs to ." + +_ACEOF +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" +ac_cs_version="\\ +zookeeper C client config.status 3.4.5 +configured by $0, generated by GNU Autoconf 2.69, + with options \\"\$ac_cs_config\\" + +Copyright (C) 2012 Free Software Foundation, Inc. +This config.status script is free software; the Free Software Foundation +gives unlimited permission to copy, distribute and modify it." + +ac_pwd='$ac_pwd' +srcdir='$srcdir' +INSTALL='$INSTALL' +MKDIR_P='$MKDIR_P' +AWK='$AWK' +test -n "\$AWK" || AWK=awk +_ACEOF + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +# The default lists apply if the user does not specify any file. +ac_need_defaults=: +while test $# != 0 +do + case $1 in + --*=?*) + ac_option=`expr "X$1" : 'X\([^=]*\)='` + ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'` + ac_shift=: + ;; + --*=) + ac_option=`expr "X$1" : 'X\([^=]*\)='` + ac_optarg= + ac_shift=: + ;; + *) + ac_option=$1 + ac_optarg=$2 + ac_shift=shift + ;; + esac + + case $ac_option in + # Handling of the options. + -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) + ac_cs_recheck=: ;; + --version | --versio | --versi | --vers | --ver | --ve | --v | -V ) + $as_echo "$ac_cs_version"; exit ;; + --config | --confi | --conf | --con | --co | --c ) + $as_echo "$ac_cs_config"; exit ;; + --debug | --debu | --deb | --de | --d | -d ) + debug=: ;; + --file | --fil | --fi | --f ) + $ac_shift + case $ac_optarg in + *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; + '') as_fn_error $? "missing file argument" ;; + esac + as_fn_append CONFIG_FILES " '$ac_optarg'" + ac_need_defaults=false;; + --header | --heade | --head | --hea ) + $ac_shift + case $ac_optarg in + *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; + esac + as_fn_append CONFIG_HEADERS " '$ac_optarg'" + ac_need_defaults=false;; + --he | --h) + # Conflict between --help and --header + as_fn_error $? "ambiguous option: \`$1' +Try \`$0 --help' for more information.";; + --help | --hel | -h ) + $as_echo "$ac_cs_usage"; exit ;; + -q | -quiet | --quiet | --quie | --qui | --qu | --q \ + | -silent | --silent | --silen | --sile | --sil | --si | --s) + ac_cs_silent=: ;; + + # This is an error. + -*) as_fn_error $? "unrecognized option: \`$1' +Try \`$0 --help' for more information." ;; + + *) as_fn_append ac_config_targets " $1" + ac_need_defaults=false ;; + + esac + shift +done + +ac_configure_extra_args= + +if $ac_cs_silent; then + exec 6>/dev/null + ac_configure_extra_args="$ac_configure_extra_args --silent" +fi + +_ACEOF +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +if \$ac_cs_recheck; then + set X $SHELL '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion + shift + \$as_echo "running CONFIG_SHELL=$SHELL \$*" >&6 + CONFIG_SHELL='$SHELL' + export CONFIG_SHELL + exec "\$@" +fi + +_ACEOF +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +exec 5>>config.log +{ + echo + sed 'h;s/./-/g;s/^.../@%:@@%:@ /;s/...$/ @%:@@%:@/;p;x;p;x' <<_ASBOX +@%:@@%:@ Running $as_me. @%:@@%:@ +_ASBOX + $as_echo "$ac_log" +} >&5 + +_ACEOF +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +# +# INIT-COMMANDS +# +AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir" + +_ACEOF + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 + +# Handling of arguments. +for ac_config_target in $ac_config_targets +do + case $ac_config_target in + "config.h") CONFIG_HEADERS="$CONFIG_HEADERS config.h" ;; + "depfiles") CONFIG_COMMANDS="$CONFIG_COMMANDS depfiles" ;; + "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;; + + *) as_fn_error $? "invalid argument: \`$ac_config_target'" "$LINENO" 5;; + esac +done + + +# If the user did not use the arguments to specify the items to instantiate, +# then the envvar interface is used. Set only those that are not. +# We use the long form for the default assignment because of an extremely +# bizarre bug on SunOS 4.1.3. +if $ac_need_defaults; then + test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files + test "${CONFIG_HEADERS+set}" = set || CONFIG_HEADERS=$config_headers + test "${CONFIG_COMMANDS+set}" = set || CONFIG_COMMANDS=$config_commands +fi + +# Have a temporary directory for convenience. Make it in the build tree +# simply because there is no reason against having it here, and in addition, +# creating and moving files from /tmp can sometimes cause problems. +# Hook for its removal unless debugging. +# Note that there is a small window in which the directory will not be cleaned: +# after its creation but before its name has been assigned to `$tmp'. +$debug || +{ + tmp= ac_tmp= + trap 'exit_status=$? + : "${ac_tmp:=$tmp}" + { test ! -d "$ac_tmp" || rm -fr "$ac_tmp"; } && exit $exit_status +' 0 + trap 'as_fn_exit 1' 1 2 13 15 +} +# Create a (secure) tmp directory for tmp files. + +{ + tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` && + test -d "$tmp" +} || +{ + tmp=./conf$$-$RANDOM + (umask 077 && mkdir "$tmp") +} || as_fn_error $? "cannot create a temporary directory in ." "$LINENO" 5 +ac_tmp=$tmp + +# Set up the scripts for CONFIG_FILES section. +# No need to generate them if there are no CONFIG_FILES. +# This happens for instance with `./config.status config.h'. +if test -n "$CONFIG_FILES"; then + + +ac_cr=`echo X | tr X '\015'` +# On cygwin, bash can eat \r inside `` if the user requested igncr. +# But we know of no other shell where ac_cr would be empty at this +# point, so we can use a bashism as a fallback. +if test "x$ac_cr" = x; then + eval ac_cr=\$\'\\r\' +fi +ac_cs_awk_cr=`$AWK 'BEGIN { print "a\rb" }' /dev/null` +if test "$ac_cs_awk_cr" = "a${ac_cr}b"; then + ac_cs_awk_cr='\\r' +else + ac_cs_awk_cr=$ac_cr +fi + +echo 'BEGIN {' >"$ac_tmp/subs1.awk" && +_ACEOF + + +{ + echo "cat >conf$$subs.awk <<_ACEOF" && + echo "$ac_subst_vars" | sed 's/.*/&!$&$ac_delim/' && + echo "_ACEOF" +} >conf$$subs.sh || + as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 +ac_delim_num=`echo "$ac_subst_vars" | grep -c '^'` +ac_delim='%!_!# ' +for ac_last_try in false false false false false :; do + . ./conf$$subs.sh || + as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 + + ac_delim_n=`sed -n "s/.*$ac_delim\$/X/p" conf$$subs.awk | grep -c X` + if test $ac_delim_n = $ac_delim_num; then + break + elif $ac_last_try; then + as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 + else + ac_delim="$ac_delim!$ac_delim _$ac_delim!! " + fi +done +rm -f conf$$subs.sh + +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +cat >>"\$ac_tmp/subs1.awk" <<\\_ACAWK && +_ACEOF +sed -n ' +h +s/^/S["/; s/!.*/"]=/ +p +g +s/^[^!]*!// +:repl +t repl +s/'"$ac_delim"'$// +t delim +:nl +h +s/\(.\{148\}\)..*/\1/ +t more1 +s/["\\]/\\&/g; s/^/"/; s/$/\\n"\\/ +p +n +b repl +:more1 +s/["\\]/\\&/g; s/^/"/; s/$/"\\/ +p +g +s/.\{148\}// +t nl +:delim +h +s/\(.\{148\}\)..*/\1/ +t more2 +s/["\\]/\\&/g; s/^/"/; s/$/"/ +p +b +:more2 +s/["\\]/\\&/g; s/^/"/; s/$/"\\/ +p +g +s/.\{148\}// +t delim +' >$CONFIG_STATUS || ac_write_fail=1 +rm -f conf$$subs.awk +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +_ACAWK +cat >>"\$ac_tmp/subs1.awk" <<_ACAWK && + for (key in S) S_is_set[key] = 1 + FS = "" + +} +{ + line = $ 0 + nfields = split(line, field, "@") + substed = 0 + len = length(field[1]) + for (i = 2; i < nfields; i++) { + key = field[i] + keylen = length(key) + if (S_is_set[key]) { + value = S[key] + line = substr(line, 1, len) "" value "" substr(line, len + keylen + 3) + len += length(value) + length(field[++i]) + substed = 1 + } else + len += 1 + keylen + } + + print line +} + +_ACAWK +_ACEOF +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +if sed "s/$ac_cr//" < /dev/null > /dev/null 2>&1; then + sed "s/$ac_cr\$//; s/$ac_cr/$ac_cs_awk_cr/g" +else + cat +fi < "$ac_tmp/subs1.awk" > "$ac_tmp/subs.awk" \ + || as_fn_error $? "could not setup config files machinery" "$LINENO" 5 +_ACEOF + +# VPATH may cause trouble with some makes, so we remove sole $(srcdir), +# ${srcdir} and @srcdir@ entries from VPATH if srcdir is ".", strip leading and +# trailing colons and then remove the whole line if VPATH becomes empty +# (actually we leave an empty line to preserve line numbers). +if test "x$srcdir" = x.; then + ac_vpsub='/^[ ]*VPATH[ ]*=[ ]*/{ +h +s/// +s/^/:/ +s/[ ]*$/:/ +s/:\$(srcdir):/:/g +s/:\${srcdir}:/:/g +s/:@srcdir@:/:/g +s/^:*// +s/:*$// +x +s/\(=[ ]*\).*/\1/ +G +s/\n// +s/^[^=]*=[ ]*$// +}' +fi + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +fi # test -n "$CONFIG_FILES" + +# Set up the scripts for CONFIG_HEADERS section. +# No need to generate them if there are no CONFIG_HEADERS. +# This happens for instance with `./config.status Makefile'. +if test -n "$CONFIG_HEADERS"; then +cat >"$ac_tmp/defines.awk" <<\_ACAWK || +BEGIN { +_ACEOF + +# Transform confdefs.h into an awk script `defines.awk', embedded as +# here-document in config.status, that substitutes the proper values into +# config.h.in to produce config.h. + +# Create a delimiter string that does not exist in confdefs.h, to ease +# handling of long lines. +ac_delim='%!_!# ' +for ac_last_try in false false :; do + ac_tt=`sed -n "/$ac_delim/p" confdefs.h` + if test -z "$ac_tt"; then + break + elif $ac_last_try; then + as_fn_error $? "could not make $CONFIG_HEADERS" "$LINENO" 5 + else + ac_delim="$ac_delim!$ac_delim _$ac_delim!! " + fi +done + +# For the awk script, D is an array of macro values keyed by name, +# likewise P contains macro parameters if any. Preserve backslash +# newline sequences. + +ac_word_re=[_$as_cr_Letters][_$as_cr_alnum]* +sed -n ' +s/.\{148\}/&'"$ac_delim"'/g +t rset +:rset +s/^[ ]*#[ ]*define[ ][ ]*/ / +t def +d +:def +s/\\$// +t bsnl +s/["\\]/\\&/g +s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\ +D["\1"]=" \3"/p +s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2"/p +d +:bsnl +s/["\\]/\\&/g +s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\ +D["\1"]=" \3\\\\\\n"\\/p +t cont +s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2\\\\\\n"\\/p +t cont +d +:cont +n +s/.\{148\}/&'"$ac_delim"'/g +t clear +:clear +s/\\$// +t bsnlc +s/["\\]/\\&/g; s/^/"/; s/$/"/p +d +:bsnlc +s/["\\]/\\&/g; s/^/"/; s/$/\\\\\\n"\\/p +b cont +' >$CONFIG_STATUS || ac_write_fail=1 + +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 + for (key in D) D_is_set[key] = 1 + FS = "" +} +/^[\t ]*#[\t ]*(define|undef)[\t ]+$ac_word_re([\t (]|\$)/ { + line = \$ 0 + split(line, arg, " ") + if (arg[1] == "#") { + defundef = arg[2] + mac1 = arg[3] + } else { + defundef = substr(arg[1], 2) + mac1 = arg[2] + } + split(mac1, mac2, "(") #) + macro = mac2[1] + prefix = substr(line, 1, index(line, defundef) - 1) + if (D_is_set[macro]) { + # Preserve the white space surrounding the "#". + print prefix "define", macro P[macro] D[macro] + next + } else { + # Replace #undef with comments. This is necessary, for example, + # in the case of _POSIX_SOURCE, which is predefined and required + # on some systems where configure will not decide to define it. + if (defundef == "undef") { + print "/*", prefix defundef, macro, "*/" + next + } + } +} +{ print } +_ACAWK +_ACEOF +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 + as_fn_error $? "could not setup config headers machinery" "$LINENO" 5 +fi # test -n "$CONFIG_HEADERS" + + +eval set X " :F $CONFIG_FILES :H $CONFIG_HEADERS :C $CONFIG_COMMANDS" +shift +for ac_tag +do + case $ac_tag in + :[FHLC]) ac_mode=$ac_tag; continue;; + esac + case $ac_mode$ac_tag in + :[FHL]*:*);; + :L* | :C*:*) as_fn_error $? "invalid tag \`$ac_tag'" "$LINENO" 5;; + :[FH]-) ac_tag=-:-;; + :[FH]*) ac_tag=$ac_tag:$ac_tag.in;; + esac + ac_save_IFS=$IFS + IFS=: + set x $ac_tag + IFS=$ac_save_IFS + shift + ac_file=$1 + shift + + case $ac_mode in + :L) ac_source=$1;; + :[FH]) + ac_file_inputs= + for ac_f + do + case $ac_f in + -) ac_f="$ac_tmp/stdin";; + *) # Look for the file first in the build tree, then in the source tree + # (if the path is not absolute). The absolute path cannot be DOS-style, + # because $ac_f cannot contain `:'. + test -f "$ac_f" || + case $ac_f in + [\\/$]*) false;; + *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";; + esac || + as_fn_error 1 "cannot find input file: \`$ac_f'" "$LINENO" 5;; + esac + case $ac_f in *\'*) ac_f=`$as_echo "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac + as_fn_append ac_file_inputs " '$ac_f'" + done + + # Let's still pretend it is `configure' which instantiates (i.e., don't + # use $as_me), people would be surprised to read: + # /* config.h. Generated by config.status. */ + configure_input='Generated from '` + $as_echo "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g' + `' by configure.' + if test x"$ac_file" != x-; then + configure_input="$ac_file. $configure_input" + { $as_echo "$as_me:${as_lineno-$LINENO}: creating $ac_file" >&5 +$as_echo "$as_me: creating $ac_file" >&6;} + fi + # Neutralize special characters interpreted by sed in replacement strings. + case $configure_input in #( + *\&* | *\|* | *\\* ) + ac_sed_conf_input=`$as_echo "$configure_input" | + sed 's/[\\\\&|]/\\\\&/g'`;; #( + *) ac_sed_conf_input=$configure_input;; + esac + + case $ac_tag in + *:-:* | *:-) cat >"$ac_tmp/stdin" \ + || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; + esac + ;; + esac + + ac_dir=`$as_dirname -- "$ac_file" || +$as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$ac_file" : 'X\(//\)[^/]' \| \ + X"$ac_file" : 'X\(//\)$' \| \ + X"$ac_file" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$ac_file" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + as_dir="$ac_dir"; as_fn_mkdir_p + ac_builddir=. + +case "$ac_dir" in +.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; +*) + ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` + # A ".." for each directory in $ac_dir_suffix. + ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` + case $ac_top_builddir_sub in + "") ac_top_builddir_sub=. ac_top_build_prefix= ;; + *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; + esac ;; +esac +ac_abs_top_builddir=$ac_pwd +ac_abs_builddir=$ac_pwd$ac_dir_suffix +# for backward compatibility: +ac_top_builddir=$ac_top_build_prefix + +case $srcdir in + .) # We are building in place. + ac_srcdir=. + ac_top_srcdir=$ac_top_builddir_sub + ac_abs_top_srcdir=$ac_pwd ;; + [\\/]* | ?:[\\/]* ) # Absolute name. + ac_srcdir=$srcdir$ac_dir_suffix; + ac_top_srcdir=$srcdir + ac_abs_top_srcdir=$srcdir ;; + *) # Relative name. + ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix + ac_top_srcdir=$ac_top_build_prefix$srcdir + ac_abs_top_srcdir=$ac_pwd/$srcdir ;; +esac +ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix + + + case $ac_mode in + :F) + # + # CONFIG_FILE + # + + case $INSTALL in + [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;; + *) ac_INSTALL=$ac_top_build_prefix$INSTALL ;; + esac + ac_MKDIR_P=$MKDIR_P + case $MKDIR_P in + [\\/$]* | ?:[\\/]* ) ;; + */*) ac_MKDIR_P=$ac_top_build_prefix$MKDIR_P ;; + esac +_ACEOF + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +# If the template does not know about datarootdir, expand it. +# FIXME: This hack should be removed a few years after 2.60. +ac_datarootdir_hack=; ac_datarootdir_seen= +ac_sed_dataroot=' +/datarootdir/ { + p + q +} +/@datadir@/p +/@docdir@/p +/@infodir@/p +/@localedir@/p +/@mandir@/p' +case `eval "sed -n \"\$ac_sed_dataroot\" $ac_file_inputs"` in +*datarootdir*) ac_datarootdir_seen=yes;; +*@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*) + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5 +$as_echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;} +_ACEOF +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 + ac_datarootdir_hack=' + s&@datadir@&$datadir&g + s&@docdir@&$docdir&g + s&@infodir@&$infodir&g + s&@localedir@&$localedir&g + s&@mandir@&$mandir&g + s&\\\${datarootdir}&$datarootdir&g' ;; +esac +_ACEOF + +# Neutralize VPATH when `$srcdir' = `.'. +# Shell code in configure.ac might set extrasub. +# FIXME: do we really want to maintain this feature? +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +ac_sed_extra="$ac_vpsub +$extrasub +_ACEOF +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +:t +/@[a-zA-Z_][a-zA-Z_0-9]*@/!b +s|@configure_input@|$ac_sed_conf_input|;t t +s&@top_builddir@&$ac_top_builddir_sub&;t t +s&@top_build_prefix@&$ac_top_build_prefix&;t t +s&@srcdir@&$ac_srcdir&;t t +s&@abs_srcdir@&$ac_abs_srcdir&;t t +s&@top_srcdir@&$ac_top_srcdir&;t t +s&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t +s&@builddir@&$ac_builddir&;t t +s&@abs_builddir@&$ac_abs_builddir&;t t +s&@abs_top_builddir@&$ac_abs_top_builddir&;t t +s&@INSTALL@&$ac_INSTALL&;t t +s&@MKDIR_P@&$ac_MKDIR_P&;t t +$ac_datarootdir_hack +" +eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$ac_tmp/subs.awk" \ + >$ac_tmp/out || as_fn_error $? "could not create $ac_file" "$LINENO" 5 + +test -z "$ac_datarootdir_hack$ac_datarootdir_seen" && + { ac_out=`sed -n '/\${datarootdir}/p' "$ac_tmp/out"`; test -n "$ac_out"; } && + { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' \ + "$ac_tmp/out"`; test -z "$ac_out"; } && + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \`datarootdir' +which seems to be undefined. Please make sure it is defined" >&5 +$as_echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir' +which seems to be undefined. Please make sure it is defined" >&2;} + + rm -f "$ac_tmp/stdin" + case $ac_file in + -) cat "$ac_tmp/out" && rm -f "$ac_tmp/out";; + *) rm -f "$ac_file" && mv "$ac_tmp/out" "$ac_file";; + esac \ + || as_fn_error $? "could not create $ac_file" "$LINENO" 5 + ;; + :H) + # + # CONFIG_HEADER + # + if test x"$ac_file" != x-; then + { + $as_echo "/* $configure_input */" \ + && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" + } >"$ac_tmp/config.h" \ + || as_fn_error $? "could not create $ac_file" "$LINENO" 5 + if diff "$ac_file" "$ac_tmp/config.h" >/dev/null 2>&1; then + { $as_echo "$as_me:${as_lineno-$LINENO}: $ac_file is unchanged" >&5 +$as_echo "$as_me: $ac_file is unchanged" >&6;} + else + rm -f "$ac_file" + mv "$ac_tmp/config.h" "$ac_file" \ + || as_fn_error $? "could not create $ac_file" "$LINENO" 5 + fi + else + $as_echo "/* $configure_input */" \ + && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" \ + || as_fn_error $? "could not create -" "$LINENO" 5 + fi +# Compute "$ac_file"'s index in $config_headers. +_am_arg="$ac_file" +_am_stamp_count=1 +for _am_header in $config_headers :; do + case $_am_header in + $_am_arg | $_am_arg:* ) + break ;; + * ) + _am_stamp_count=`expr $_am_stamp_count + 1` ;; + esac +done +echo "timestamp for $_am_arg" >`$as_dirname -- "$_am_arg" || +$as_expr X"$_am_arg" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$_am_arg" : 'X\(//\)[^/]' \| \ + X"$_am_arg" : 'X\(//\)$' \| \ + X"$_am_arg" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$_am_arg" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'`/stamp-h$_am_stamp_count + ;; + + :C) { $as_echo "$as_me:${as_lineno-$LINENO}: executing $ac_file commands" >&5 +$as_echo "$as_me: executing $ac_file commands" >&6;} + ;; + esac + + + case $ac_file$ac_mode in + "depfiles":C) test x"$AMDEP_TRUE" != x"" || { + # Autoconf 2.62 quotes --file arguments for eval, but not when files + # are listed without --file. Let's play safe and only enable the eval + # if we detect the quoting. + case $CONFIG_FILES in + *\'*) eval set x "$CONFIG_FILES" ;; + *) set x $CONFIG_FILES ;; + esac + shift + for mf + do + # Strip MF so we end up with the name of the file. + mf=`echo "$mf" | sed -e 's/:.*$//'` + # Check whether this is an Automake generated Makefile or not. + # We used to match only the files named `Makefile.in', but + # some people rename them; so instead we look at the file content. + # Grep'ing the first line is not enough: some people post-process + # each Makefile.in and add a new line on top of each file to say so. + # Grep'ing the whole file is not good either: AIX grep has a line + # limit of 2048, but all sed's we know have understand at least 4000. + if sed -n 's,^#.*generated by automake.*,X,p' "$mf" | grep X >/dev/null 2>&1; then + dirpart=`$as_dirname -- "$mf" || +$as_expr X"$mf" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$mf" : 'X\(//\)[^/]' \| \ + X"$mf" : 'X\(//\)$' \| \ + X"$mf" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$mf" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + else + continue + fi + # Extract the definition of DEPDIR, am__include, and am__quote + # from the Makefile without running `make'. + DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"` + test -z "$DEPDIR" && continue + am__include=`sed -n 's/^am__include = //p' < "$mf"` + test -z "am__include" && continue + am__quote=`sed -n 's/^am__quote = //p' < "$mf"` + # When using ansi2knr, U may be empty or an underscore; expand it + U=`sed -n 's/^U = //p' < "$mf"` + # Find all dependency output files, they are included files with + # $(DEPDIR) in their names. We invoke sed twice because it is the + # simplest approach to changing $(DEPDIR) to its actual value in the + # expansion. + for file in `sed -n " + s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \ + sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g' -e 's/\$U/'"$U"'/g'`; do + # Make sure the directory exists. + test -f "$dirpart/$file" && continue + fdir=`$as_dirname -- "$file" || +$as_expr X"$file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$file" : 'X\(//\)[^/]' \| \ + X"$file" : 'X\(//\)$' \| \ + X"$file" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$file" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + as_dir=$dirpart/$fdir; as_fn_mkdir_p + # echo "creating $dirpart/$file" + echo '# dummy' > "$dirpart/$file" + done + done +} + ;; + + esac +done # for ac_tag + + +as_fn_exit 0 +_ACEOF +ac_clean_files=$ac_clean_files_save + +test $ac_write_fail = 0 || + as_fn_error $? "write failure creating $CONFIG_STATUS" "$LINENO" 5 + + +# configure is writing to config.log, and then calls config.status. +# config.status does its own redirection, appending to config.log. +# Unfortunately, on DOS this fails, as config.log is still kept open +# by configure, so config.status won't be able to write to it; its +# output is simply discarded. So we exec the FD to /dev/null, +# effectively closing config.log, so it can be properly (re)opened and +# appended to by config.status. When coming back to configure, we +# need to make the FD available again. +if test "$no_create" != yes; then + ac_cs_success=: + ac_config_status_args= + test "$silent" = yes && + ac_config_status_args="$ac_config_status_args --quiet" + exec 5>/dev/null + $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false + exec 5>>config.log + # Use ||, not &&, to avoid exiting from the if with $? = 1, which + # would make configure fail if this is the last instruction. + $ac_cs_success || as_fn_exit 1 +fi +if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5 +$as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;} +fi + diff --git a/pkg/registry/zookeeper-3.4.6/src/c/autom4te.cache/output.1 b/pkg/registry/zookeeper-3.4.6/src/c/autom4te.cache/output.1 new file mode 100644 index 000000000..3bc7b3c9e --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/c/autom4te.cache/output.1 @@ -0,0 +1,20613 @@ +@%:@! /bin/sh +@%:@ Guess values for system-dependent variables and create Makefiles. +@%:@ Generated by GNU Autoconf 2.69 for zookeeper C client 3.4.6. +@%:@ +@%:@ Report bugs to . +@%:@ +@%:@ +@%:@ Copyright (C) 1992-1996, 1998-2012 Free Software Foundation, Inc. +@%:@ +@%:@ +@%:@ This configure script is free software; the Free Software Foundation +@%:@ gives unlimited permission to copy, distribute and modify it. +## -------------------- ## +## M4sh Initialization. ## +## -------------------- ## + +# Be more Bourne compatible +DUALCASE=1; export DUALCASE # for MKS sh +if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : + emulate sh + NULLCMD=: + # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which + # is contrary to our usage. Disable this feature. + alias -g '${1+"$@"}'='"$@"' + setopt NO_GLOB_SUBST +else + case `(set -o) 2>/dev/null` in @%:@( + *posix*) : + set -o posix ;; @%:@( + *) : + ;; +esac +fi + + +as_nl=' +' +export as_nl +# Printing a long string crashes Solaris 7 /usr/bin/printf. +as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' +as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo +as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo +# Prefer a ksh shell builtin over an external printf program on Solaris, +# but without wasting forks for bash or zsh. +if test -z "$BASH_VERSION$ZSH_VERSION" \ + && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then + as_echo='print -r --' + as_echo_n='print -rn --' +elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then + as_echo='printf %s\n' + as_echo_n='printf %s' +else + if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then + as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' + as_echo_n='/usr/ucb/echo -n' + else + as_echo_body='eval expr "X$1" : "X\\(.*\\)"' + as_echo_n_body='eval + arg=$1; + case $arg in @%:@( + *"$as_nl"*) + expr "X$arg" : "X\\(.*\\)$as_nl"; + arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; + esac; + expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" + ' + export as_echo_n_body + as_echo_n='sh -c $as_echo_n_body as_echo' + fi + export as_echo_body + as_echo='sh -c $as_echo_body as_echo' +fi + +# The user is always right. +if test "${PATH_SEPARATOR+set}" != set; then + PATH_SEPARATOR=: + (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { + (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || + PATH_SEPARATOR=';' + } +fi + + +# IFS +# We need space, tab and new line, in precisely that order. Quoting is +# there to prevent editors from complaining about space-tab. +# (If _AS_PATH_WALK were called with IFS unset, it would disable word +# splitting by setting IFS to empty value.) +IFS=" "" $as_nl" + +# Find who we are. Look in the path if we contain no directory separator. +as_myself= +case $0 in @%:@(( + *[\\/]* ) as_myself=$0 ;; + *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break + done +IFS=$as_save_IFS + + ;; +esac +# We did not find ourselves, most probably we were run as `sh COMMAND' +# in which case we are not to be found in the path. +if test "x$as_myself" = x; then + as_myself=$0 +fi +if test ! -f "$as_myself"; then + $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 + exit 1 +fi + +# Unset variables that we do not need and which cause bugs (e.g. in +# pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" +# suppresses any "Segmentation fault" message there. '((' could +# trigger a bug in pdksh 5.2.14. +for as_var in BASH_ENV ENV MAIL MAILPATH +do eval test x\${$as_var+set} = xset \ + && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : +done +PS1='$ ' +PS2='> ' +PS4='+ ' + +# NLS nuisances. +LC_ALL=C +export LC_ALL +LANGUAGE=C +export LANGUAGE + +# CDPATH. +(unset CDPATH) >/dev/null 2>&1 && unset CDPATH + +# Use a proper internal environment variable to ensure we don't fall + # into an infinite loop, continuously re-executing ourselves. + if test x"${_as_can_reexec}" != xno && test "x$CONFIG_SHELL" != x; then + _as_can_reexec=no; export _as_can_reexec; + # We cannot yet assume a decent shell, so we have to provide a +# neutralization value for shells without unset; and this also +# works around shells that cannot unset nonexistent variables. +# Preserve -v and -x to the replacement shell. +BASH_ENV=/dev/null +ENV=/dev/null +(unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV +case $- in @%:@ (((( + *v*x* | *x*v* ) as_opts=-vx ;; + *v* ) as_opts=-v ;; + *x* ) as_opts=-x ;; + * ) as_opts= ;; +esac +exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} +# Admittedly, this is quite paranoid, since all the known shells bail +# out after a failed `exec'. +$as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2 +as_fn_exit 255 + fi + # We don't want this to propagate to other subprocesses. + { _as_can_reexec=; unset _as_can_reexec;} +if test "x$CONFIG_SHELL" = x; then + as_bourne_compatible="if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then : + emulate sh + NULLCMD=: + # Pre-4.2 versions of Zsh do word splitting on \${1+\"\$@\"}, which + # is contrary to our usage. Disable this feature. + alias -g '\${1+\"\$@\"}'='\"\$@\"' + setopt NO_GLOB_SUBST +else + case \`(set -o) 2>/dev/null\` in @%:@( + *posix*) : + set -o posix ;; @%:@( + *) : + ;; +esac +fi +" + as_required="as_fn_return () { (exit \$1); } +as_fn_success () { as_fn_return 0; } +as_fn_failure () { as_fn_return 1; } +as_fn_ret_success () { return 0; } +as_fn_ret_failure () { return 1; } + +exitcode=0 +as_fn_success || { exitcode=1; echo as_fn_success failed.; } +as_fn_failure && { exitcode=1; echo as_fn_failure succeeded.; } +as_fn_ret_success || { exitcode=1; echo as_fn_ret_success failed.; } +as_fn_ret_failure && { exitcode=1; echo as_fn_ret_failure succeeded.; } +if ( set x; as_fn_ret_success y && test x = \"\$1\" ); then : + +else + exitcode=1; echo positional parameters were not saved. +fi +test x\$exitcode = x0 || exit 1 +test -x / || exit 1" + as_suggested=" as_lineno_1=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_1a=\$LINENO + as_lineno_2=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_2a=\$LINENO + eval 'test \"x\$as_lineno_1'\$as_run'\" != \"x\$as_lineno_2'\$as_run'\" && + test \"x\`expr \$as_lineno_1'\$as_run' + 1\`\" = \"x\$as_lineno_2'\$as_run'\"' || exit 1 + + test -n \"\${ZSH_VERSION+set}\${BASH_VERSION+set}\" || ( + ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' + ECHO=\$ECHO\$ECHO\$ECHO\$ECHO\$ECHO + ECHO=\$ECHO\$ECHO\$ECHO\$ECHO\$ECHO\$ECHO + PATH=/empty FPATH=/empty; export PATH FPATH + test \"X\`printf %s \$ECHO\`\" = \"X\$ECHO\" \\ + || test \"X\`print -r -- \$ECHO\`\" = \"X\$ECHO\" ) || exit 1 +test \$(( 1 + 1 )) = 2 || exit 1" + if (eval "$as_required") 2>/dev/null; then : + as_have_required=yes +else + as_have_required=no +fi + if test x$as_have_required = xyes && (eval "$as_suggested") 2>/dev/null; then : + +else + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +as_found=false +for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + as_found=: + case $as_dir in @%:@( + /*) + for as_base in sh bash ksh sh5; do + # Try only shells that exist, to save several forks. + as_shell=$as_dir/$as_base + if { test -f "$as_shell" || test -f "$as_shell.exe"; } && + { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$as_shell"; } 2>/dev/null; then : + CONFIG_SHELL=$as_shell as_have_required=yes + if { $as_echo "$as_bourne_compatible""$as_suggested" | as_run=a "$as_shell"; } 2>/dev/null; then : + break 2 +fi +fi + done;; + esac + as_found=false +done +$as_found || { if { test -f "$SHELL" || test -f "$SHELL.exe"; } && + { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$SHELL"; } 2>/dev/null; then : + CONFIG_SHELL=$SHELL as_have_required=yes +fi; } +IFS=$as_save_IFS + + + if test "x$CONFIG_SHELL" != x; then : + export CONFIG_SHELL + # We cannot yet assume a decent shell, so we have to provide a +# neutralization value for shells without unset; and this also +# works around shells that cannot unset nonexistent variables. +# Preserve -v and -x to the replacement shell. +BASH_ENV=/dev/null +ENV=/dev/null +(unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV +case $- in @%:@ (((( + *v*x* | *x*v* ) as_opts=-vx ;; + *v* ) as_opts=-v ;; + *x* ) as_opts=-x ;; + * ) as_opts= ;; +esac +exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} +# Admittedly, this is quite paranoid, since all the known shells bail +# out after a failed `exec'. +$as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2 +exit 255 +fi + + if test x$as_have_required = xno; then : + $as_echo "$0: This script requires a shell more modern than all" + $as_echo "$0: the shells that I found on your system." + if test x${ZSH_VERSION+set} = xset ; then + $as_echo "$0: In particular, zsh $ZSH_VERSION has bugs and should" + $as_echo "$0: be upgraded to zsh 4.3.4 or later." + else + $as_echo "$0: Please tell bug-autoconf@gnu.org and +$0: user@zookeeper.apache.org about your system, including +$0: any error possibly output before this message. Then +$0: install a modern shell, or manually run the script +$0: under such a shell if you do have one." + fi + exit 1 +fi +fi +fi +SHELL=${CONFIG_SHELL-/bin/sh} +export SHELL +# Unset more variables known to interfere with behavior of common tools. +CLICOLOR_FORCE= GREP_OPTIONS= +unset CLICOLOR_FORCE GREP_OPTIONS + +## --------------------- ## +## M4sh Shell Functions. ## +## --------------------- ## +@%:@ as_fn_unset VAR +@%:@ --------------- +@%:@ Portably unset VAR. +as_fn_unset () +{ + { eval $1=; unset $1;} +} +as_unset=as_fn_unset + +@%:@ as_fn_set_status STATUS +@%:@ ----------------------- +@%:@ Set @S|@? to STATUS, without forking. +as_fn_set_status () +{ + return $1 +} @%:@ as_fn_set_status + +@%:@ as_fn_exit STATUS +@%:@ ----------------- +@%:@ Exit the shell with STATUS, even in a "trap 0" or "set -e" context. +as_fn_exit () +{ + set +e + as_fn_set_status $1 + exit $1 +} @%:@ as_fn_exit + +@%:@ as_fn_mkdir_p +@%:@ ------------- +@%:@ Create "@S|@as_dir" as a directory, including parents if necessary. +as_fn_mkdir_p () +{ + + case $as_dir in #( + -*) as_dir=./$as_dir;; + esac + test -d "$as_dir" || eval $as_mkdir_p || { + as_dirs= + while :; do + case $as_dir in #( + *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( + *) as_qdir=$as_dir;; + esac + as_dirs="'$as_qdir' $as_dirs" + as_dir=`$as_dirname -- "$as_dir" || +$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$as_dir" : 'X\(//\)[^/]' \| \ + X"$as_dir" : 'X\(//\)$' \| \ + X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$as_dir" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + test -d "$as_dir" && break + done + test -z "$as_dirs" || eval "mkdir $as_dirs" + } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" + + +} @%:@ as_fn_mkdir_p + +@%:@ as_fn_executable_p FILE +@%:@ ----------------------- +@%:@ Test if FILE is an executable regular file. +as_fn_executable_p () +{ + test -f "$1" && test -x "$1" +} @%:@ as_fn_executable_p +@%:@ as_fn_append VAR VALUE +@%:@ ---------------------- +@%:@ Append the text in VALUE to the end of the definition contained in VAR. Take +@%:@ advantage of any shell optimizations that allow amortized linear growth over +@%:@ repeated appends, instead of the typical quadratic growth present in naive +@%:@ implementations. +if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : + eval 'as_fn_append () + { + eval $1+=\$2 + }' +else + as_fn_append () + { + eval $1=\$$1\$2 + } +fi # as_fn_append + +@%:@ as_fn_arith ARG... +@%:@ ------------------ +@%:@ Perform arithmetic evaluation on the ARGs, and store the result in the +@%:@ global @S|@as_val. Take advantage of shells that can avoid forks. The arguments +@%:@ must be portable across @S|@(()) and expr. +if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : + eval 'as_fn_arith () + { + as_val=$(( $* )) + }' +else + as_fn_arith () + { + as_val=`expr "$@" || test $? -eq 1` + } +fi # as_fn_arith + + +@%:@ as_fn_error STATUS ERROR [LINENO LOG_FD] +@%:@ ---------------------------------------- +@%:@ Output "`basename @S|@0`: error: ERROR" to stderr. If LINENO and LOG_FD are +@%:@ provided, also output the error to LOG_FD, referencing LINENO. Then exit the +@%:@ script with STATUS, using 1 if that was 0. +as_fn_error () +{ + as_status=$1; test $as_status -eq 0 && as_status=1 + if test "$4"; then + as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 + fi + $as_echo "$as_me: error: $2" >&2 + as_fn_exit $as_status +} @%:@ as_fn_error + +if expr a : '\(a\)' >/dev/null 2>&1 && + test "X`expr 00001 : '.*\(...\)'`" = X001; then + as_expr=expr +else + as_expr=false +fi + +if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then + as_basename=basename +else + as_basename=false +fi + +if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then + as_dirname=dirname +else + as_dirname=false +fi + +as_me=`$as_basename -- "$0" || +$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ + X"$0" : 'X\(//\)$' \| \ + X"$0" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X/"$0" | + sed '/^.*\/\([^/][^/]*\)\/*$/{ + s//\1/ + q + } + /^X\/\(\/\/\)$/{ + s//\1/ + q + } + /^X\/\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + +# Avoid depending upon Character Ranges. +as_cr_letters='abcdefghijklmnopqrstuvwxyz' +as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' +as_cr_Letters=$as_cr_letters$as_cr_LETTERS +as_cr_digits='0123456789' +as_cr_alnum=$as_cr_Letters$as_cr_digits + + + as_lineno_1=$LINENO as_lineno_1a=$LINENO + as_lineno_2=$LINENO as_lineno_2a=$LINENO + eval 'test "x$as_lineno_1'$as_run'" != "x$as_lineno_2'$as_run'" && + test "x`expr $as_lineno_1'$as_run' + 1`" = "x$as_lineno_2'$as_run'"' || { + # Blame Lee E. McMahon (1931-1989) for sed's syntax. :-) + sed -n ' + p + /[$]LINENO/= + ' <$as_myself | + sed ' + s/[$]LINENO.*/&-/ + t lineno + b + :lineno + N + :loop + s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/ + t loop + s/-\n.*// + ' >$as_me.lineno && + chmod +x "$as_me.lineno" || + { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; } + + # If we had to re-execute with $CONFIG_SHELL, we're ensured to have + # already done that, so ensure we don't try to do so again and fall + # in an infinite loop. This has already happened in practice. + _as_can_reexec=no; export _as_can_reexec + # Don't try to exec as it changes $[0], causing all sort of problems + # (the dirname of $[0] is not the place where we might find the + # original and so on. Autoconf is especially sensitive to this). + . "./$as_me.lineno" + # Exit status is that of the last command. + exit +} + +ECHO_C= ECHO_N= ECHO_T= +case `echo -n x` in @%:@((((( +-n*) + case `echo 'xy\c'` in + *c*) ECHO_T=' ';; # ECHO_T is single tab character. + xy) ECHO_C='\c';; + *) echo `echo ksh88 bug on AIX 6.1` > /dev/null + ECHO_T=' ';; + esac;; +*) + ECHO_N='-n';; +esac + +rm -f conf$$ conf$$.exe conf$$.file +if test -d conf$$.dir; then + rm -f conf$$.dir/conf$$.file +else + rm -f conf$$.dir + mkdir conf$$.dir 2>/dev/null +fi +if (echo >conf$$.file) 2>/dev/null; then + if ln -s conf$$.file conf$$ 2>/dev/null; then + as_ln_s='ln -s' + # ... but there are two gotchas: + # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. + # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. + # In both cases, we have to default to `cp -pR'. + ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || + as_ln_s='cp -pR' + elif ln conf$$.file conf$$ 2>/dev/null; then + as_ln_s=ln + else + as_ln_s='cp -pR' + fi +else + as_ln_s='cp -pR' +fi +rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file +rmdir conf$$.dir 2>/dev/null + +if mkdir -p . 2>/dev/null; then + as_mkdir_p='mkdir -p "$as_dir"' +else + test -d ./-p && rmdir ./-p + as_mkdir_p=false +fi + +as_test_x='test -x' +as_executable_p=as_fn_executable_p + +# Sed expression to map a string onto a valid CPP name. +as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" + +# Sed expression to map a string onto a valid variable name. +as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" + +SHELL=${CONFIG_SHELL-/bin/sh} + + +test -n "$DJDIR" || exec 7<&0 &1 + +# Name of the host. +# hostname on some systems (SVR3.2, old GNU/Linux) returns a bogus exit status, +# so uname gets run too. +ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q` + +# +# Initializations. +# +ac_default_prefix=/usr/local +ac_clean_files= +ac_config_libobj_dir=. +LIB@&t@OBJS= +cross_compiling=no +subdirs= +MFLAGS= +MAKEFLAGS= + +# Identity of this package. +PACKAGE_NAME='zookeeper C client' +PACKAGE_TARNAME='zookeeper' +PACKAGE_VERSION='3.4.6' +PACKAGE_STRING='zookeeper C client 3.4.6' +PACKAGE_BUGREPORT='user@zookeeper.apache.org' +PACKAGE_URL='' + +ac_unique_file="src/zookeeper.c" +# Factoring default headers for most tests. +ac_includes_default="\ +#include +#ifdef HAVE_SYS_TYPES_H +# include +#endif +#ifdef HAVE_SYS_STAT_H +# include +#endif +#ifdef STDC_HEADERS +# include +# include +#else +# ifdef HAVE_STDLIB_H +# include +# endif +#endif +#ifdef HAVE_STRING_H +# if !defined STDC_HEADERS && defined HAVE_MEMORY_H +# include +# endif +# include +#endif +#ifdef HAVE_STRINGS_H +# include +#endif +#ifdef HAVE_INTTYPES_H +# include +#endif +#ifdef HAVE_STDINT_H +# include +#endif +#ifdef HAVE_UNISTD_H +# include +#endif" + +ac_subst_vars='am__EXEEXT_FALSE +am__EXEEXT_TRUE +LTLIBOBJS +LIB@&t@OBJS +USEIPV6 +WANT_SYNCAPI_FALSE +WANT_SYNCAPI_TRUE +CXXCPP +CPP +OTOOL64 +OTOOL +LIPO +NMEDIT +DSYMUTIL +MANIFEST_TOOL +RANLIB +ac_ct_AR +AR +DLLTOOL +OBJDUMP +NM +ac_ct_DUMPBIN +DUMPBIN +LD +FGREP +EGREP +GREP +SED +host_os +host_vendor +host_cpu +host +build_os +build_vendor +build_cpu +build +LIBTOOL +LN_S +am__fastdepCXX_FALSE +am__fastdepCXX_TRUE +CXXDEPMODE +ac_ct_CXX +CXXFLAGS +CXX +am__fastdepCC_FALSE +am__fastdepCC_TRUE +CCDEPMODE +am__nodep +AMDEPBACKSLASH +AMDEP_FALSE +AMDEP_TRUE +am__quote +am__include +DEPDIR +OBJEXT +EXEEXT +ac_ct_CC +CPPFLAGS +LDFLAGS +CFLAGS +CC +CPPUNIT_LIBS +CPPUNIT_CFLAGS +CPPUNIT_CONFIG +am__untar +am__tar +AMTAR +am__leading_dot +SET_MAKE +AWK +mkdir_p +MKDIR_P +INSTALL_STRIP_PROGRAM +STRIP +install_sh +MAKEINFO +AUTOHEADER +AUTOMAKE +AUTOCONF +ACLOCAL +VERSION +PACKAGE +CYGPATH_W +am__isrc +INSTALL_DATA +INSTALL_SCRIPT +INSTALL_PROGRAM +DOXYGEN_PAPER_SIZE +DX_COND_latex_FALSE +DX_COND_latex_TRUE +DX_COND_pdf_FALSE +DX_COND_pdf_TRUE +DX_PDFLATEX +DX_FLAG_pdf +DX_COND_ps_FALSE +DX_COND_ps_TRUE +DX_EGREP +DX_DVIPS +DX_MAKEINDEX +DX_LATEX +DX_FLAG_ps +DX_COND_html_FALSE +DX_COND_html_TRUE +DX_FLAG_html +DX_COND_chi_FALSE +DX_COND_chi_TRUE +DX_FLAG_chi +DX_COND_chm_FALSE +DX_COND_chm_TRUE +DX_HHC +DX_FLAG_chm +DX_COND_xml_FALSE +DX_COND_xml_TRUE +DX_FLAG_xml +DX_COND_rtf_FALSE +DX_COND_rtf_TRUE +DX_FLAG_rtf +DX_COND_man_FALSE +DX_COND_man_TRUE +DX_FLAG_man +DX_COND_dot_FALSE +DX_COND_dot_TRUE +DX_DOT +DX_FLAG_dot +DX_COND_doc_FALSE +DX_COND_doc_TRUE +DX_PERL +DX_DOXYGEN +DX_FLAG_doc +DX_ENV +DX_DOCDIR +DX_CONFIG +DX_PROJECT +target_alias +host_alias +build_alias +LIBS +ECHO_T +ECHO_N +ECHO_C +DEFS +mandir +localedir +libdir +psdir +pdfdir +dvidir +htmldir +infodir +docdir +oldincludedir +includedir +localstatedir +sharedstatedir +sysconfdir +datadir +datarootdir +libexecdir +sbindir +bindir +program_transform_name +prefix +exec_prefix +PACKAGE_URL +PACKAGE_BUGREPORT +PACKAGE_STRING +PACKAGE_VERSION +PACKAGE_TARNAME +PACKAGE_NAME +PATH_SEPARATOR +SHELL' +ac_subst_files='' +ac_user_opts=' +enable_option_checking +enable_doxygen_doc +enable_doxygen_dot +enable_doxygen_man +enable_doxygen_rtf +enable_doxygen_xml +enable_doxygen_chm +enable_doxygen_chi +enable_doxygen_html +enable_doxygen_ps +enable_doxygen_pdf +with_cppunit +with_cppunit_prefix +with_cppunit_exec_prefix +enable_dependency_tracking +enable_shared +enable_static +with_pic +enable_fast_install +with_gnu_ld +with_sysroot +enable_libtool_lock +enable_debug +with_syncapi +' + ac_precious_vars='build_alias +host_alias +target_alias +DOXYGEN_PAPER_SIZE +CC +CFLAGS +LDFLAGS +LIBS +CPPFLAGS +CXX +CXXFLAGS +CCC +CPP +CXXCPP' + + +# Initialize some variables set by options. +ac_init_help= +ac_init_version=false +ac_unrecognized_opts= +ac_unrecognized_sep= +# The variables have the same names as the options, with +# dashes changed to underlines. +cache_file=/dev/null +exec_prefix=NONE +no_create= +no_recursion= +prefix=NONE +program_prefix=NONE +program_suffix=NONE +program_transform_name=s,x,x, +silent= +site= +srcdir= +verbose= +x_includes=NONE +x_libraries=NONE + +# Installation directory options. +# These are left unexpanded so users can "make install exec_prefix=/foo" +# and all the variables that are supposed to be based on exec_prefix +# by default will actually change. +# Use braces instead of parens because sh, perl, etc. also accept them. +# (The list follows the same order as the GNU Coding Standards.) +bindir='${exec_prefix}/bin' +sbindir='${exec_prefix}/sbin' +libexecdir='${exec_prefix}/libexec' +datarootdir='${prefix}/share' +datadir='${datarootdir}' +sysconfdir='${prefix}/etc' +sharedstatedir='${prefix}/com' +localstatedir='${prefix}/var' +includedir='${prefix}/include' +oldincludedir='/usr/include' +docdir='${datarootdir}/doc/${PACKAGE_TARNAME}' +infodir='${datarootdir}/info' +htmldir='${docdir}' +dvidir='${docdir}' +pdfdir='${docdir}' +psdir='${docdir}' +libdir='${exec_prefix}/lib' +localedir='${datarootdir}/locale' +mandir='${datarootdir}/man' + +ac_prev= +ac_dashdash= +for ac_option +do + # If the previous option needs an argument, assign it. + if test -n "$ac_prev"; then + eval $ac_prev=\$ac_option + ac_prev= + continue + fi + + case $ac_option in + *=?*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;; + *=) ac_optarg= ;; + *) ac_optarg=yes ;; + esac + + # Accept the important Cygnus configure options, so we can diagnose typos. + + case $ac_dashdash$ac_option in + --) + ac_dashdash=yes ;; + + -bindir | --bindir | --bindi | --bind | --bin | --bi) + ac_prev=bindir ;; + -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*) + bindir=$ac_optarg ;; + + -build | --build | --buil | --bui | --bu) + ac_prev=build_alias ;; + -build=* | --build=* | --buil=* | --bui=* | --bu=*) + build_alias=$ac_optarg ;; + + -cache-file | --cache-file | --cache-fil | --cache-fi \ + | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c) + ac_prev=cache_file ;; + -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \ + | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*) + cache_file=$ac_optarg ;; + + --config-cache | -C) + cache_file=config.cache ;; + + -datadir | --datadir | --datadi | --datad) + ac_prev=datadir ;; + -datadir=* | --datadir=* | --datadi=* | --datad=*) + datadir=$ac_optarg ;; + + -datarootdir | --datarootdir | --datarootdi | --datarootd | --dataroot \ + | --dataroo | --dataro | --datar) + ac_prev=datarootdir ;; + -datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \ + | --dataroot=* | --dataroo=* | --dataro=* | --datar=*) + datarootdir=$ac_optarg ;; + + -disable-* | --disable-*) + ac_useropt=`expr "x$ac_option" : 'x-*disable-\(.*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && + as_fn_error $? "invalid feature name: $ac_useropt" + ac_useropt_orig=$ac_useropt + ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` + case $ac_user_opts in + *" +"enable_$ac_useropt" +"*) ;; + *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--disable-$ac_useropt_orig" + ac_unrecognized_sep=', ';; + esac + eval enable_$ac_useropt=no ;; + + -docdir | --docdir | --docdi | --doc | --do) + ac_prev=docdir ;; + -docdir=* | --docdir=* | --docdi=* | --doc=* | --do=*) + docdir=$ac_optarg ;; + + -dvidir | --dvidir | --dvidi | --dvid | --dvi | --dv) + ac_prev=dvidir ;; + -dvidir=* | --dvidir=* | --dvidi=* | --dvid=* | --dvi=* | --dv=*) + dvidir=$ac_optarg ;; + + -enable-* | --enable-*) + ac_useropt=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && + as_fn_error $? "invalid feature name: $ac_useropt" + ac_useropt_orig=$ac_useropt + ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` + case $ac_user_opts in + *" +"enable_$ac_useropt" +"*) ;; + *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--enable-$ac_useropt_orig" + ac_unrecognized_sep=', ';; + esac + eval enable_$ac_useropt=\$ac_optarg ;; + + -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \ + | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \ + | --exec | --exe | --ex) + ac_prev=exec_prefix ;; + -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \ + | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \ + | --exec=* | --exe=* | --ex=*) + exec_prefix=$ac_optarg ;; + + -gas | --gas | --ga | --g) + # Obsolete; use --with-gas. + with_gas=yes ;; + + -help | --help | --hel | --he | -h) + ac_init_help=long ;; + -help=r* | --help=r* | --hel=r* | --he=r* | -hr*) + ac_init_help=recursive ;; + -help=s* | --help=s* | --hel=s* | --he=s* | -hs*) + ac_init_help=short ;; + + -host | --host | --hos | --ho) + ac_prev=host_alias ;; + -host=* | --host=* | --hos=* | --ho=*) + host_alias=$ac_optarg ;; + + -htmldir | --htmldir | --htmldi | --htmld | --html | --htm | --ht) + ac_prev=htmldir ;; + -htmldir=* | --htmldir=* | --htmldi=* | --htmld=* | --html=* | --htm=* \ + | --ht=*) + htmldir=$ac_optarg ;; + + -includedir | --includedir | --includedi | --included | --include \ + | --includ | --inclu | --incl | --inc) + ac_prev=includedir ;; + -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \ + | --includ=* | --inclu=* | --incl=* | --inc=*) + includedir=$ac_optarg ;; + + -infodir | --infodir | --infodi | --infod | --info | --inf) + ac_prev=infodir ;; + -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*) + infodir=$ac_optarg ;; + + -libdir | --libdir | --libdi | --libd) + ac_prev=libdir ;; + -libdir=* | --libdir=* | --libdi=* | --libd=*) + libdir=$ac_optarg ;; + + -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \ + | --libexe | --libex | --libe) + ac_prev=libexecdir ;; + -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \ + | --libexe=* | --libex=* | --libe=*) + libexecdir=$ac_optarg ;; + + -localedir | --localedir | --localedi | --localed | --locale) + ac_prev=localedir ;; + -localedir=* | --localedir=* | --localedi=* | --localed=* | --locale=*) + localedir=$ac_optarg ;; + + -localstatedir | --localstatedir | --localstatedi | --localstated \ + | --localstate | --localstat | --localsta | --localst | --locals) + ac_prev=localstatedir ;; + -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \ + | --localstate=* | --localstat=* | --localsta=* | --localst=* | --locals=*) + localstatedir=$ac_optarg ;; + + -mandir | --mandir | --mandi | --mand | --man | --ma | --m) + ac_prev=mandir ;; + -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*) + mandir=$ac_optarg ;; + + -nfp | --nfp | --nf) + # Obsolete; use --without-fp. + with_fp=no ;; + + -no-create | --no-create | --no-creat | --no-crea | --no-cre \ + | --no-cr | --no-c | -n) + no_create=yes ;; + + -no-recursion | --no-recursion | --no-recursio | --no-recursi \ + | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) + no_recursion=yes ;; + + -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \ + | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \ + | --oldin | --oldi | --old | --ol | --o) + ac_prev=oldincludedir ;; + -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \ + | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \ + | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*) + oldincludedir=$ac_optarg ;; + + -prefix | --prefix | --prefi | --pref | --pre | --pr | --p) + ac_prev=prefix ;; + -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*) + prefix=$ac_optarg ;; + + -program-prefix | --program-prefix | --program-prefi | --program-pref \ + | --program-pre | --program-pr | --program-p) + ac_prev=program_prefix ;; + -program-prefix=* | --program-prefix=* | --program-prefi=* \ + | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*) + program_prefix=$ac_optarg ;; + + -program-suffix | --program-suffix | --program-suffi | --program-suff \ + | --program-suf | --program-su | --program-s) + ac_prev=program_suffix ;; + -program-suffix=* | --program-suffix=* | --program-suffi=* \ + | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*) + program_suffix=$ac_optarg ;; + + -program-transform-name | --program-transform-name \ + | --program-transform-nam | --program-transform-na \ + | --program-transform-n | --program-transform- \ + | --program-transform | --program-transfor \ + | --program-transfo | --program-transf \ + | --program-trans | --program-tran \ + | --progr-tra | --program-tr | --program-t) + ac_prev=program_transform_name ;; + -program-transform-name=* | --program-transform-name=* \ + | --program-transform-nam=* | --program-transform-na=* \ + | --program-transform-n=* | --program-transform-=* \ + | --program-transform=* | --program-transfor=* \ + | --program-transfo=* | --program-transf=* \ + | --program-trans=* | --program-tran=* \ + | --progr-tra=* | --program-tr=* | --program-t=*) + program_transform_name=$ac_optarg ;; + + -pdfdir | --pdfdir | --pdfdi | --pdfd | --pdf | --pd) + ac_prev=pdfdir ;; + -pdfdir=* | --pdfdir=* | --pdfdi=* | --pdfd=* | --pdf=* | --pd=*) + pdfdir=$ac_optarg ;; + + -psdir | --psdir | --psdi | --psd | --ps) + ac_prev=psdir ;; + -psdir=* | --psdir=* | --psdi=* | --psd=* | --ps=*) + psdir=$ac_optarg ;; + + -q | -quiet | --quiet | --quie | --qui | --qu | --q \ + | -silent | --silent | --silen | --sile | --sil) + silent=yes ;; + + -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb) + ac_prev=sbindir ;; + -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \ + | --sbi=* | --sb=*) + sbindir=$ac_optarg ;; + + -sharedstatedir | --sharedstatedir | --sharedstatedi \ + | --sharedstated | --sharedstate | --sharedstat | --sharedsta \ + | --sharedst | --shareds | --shared | --share | --shar \ + | --sha | --sh) + ac_prev=sharedstatedir ;; + -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \ + | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \ + | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \ + | --sha=* | --sh=*) + sharedstatedir=$ac_optarg ;; + + -site | --site | --sit) + ac_prev=site ;; + -site=* | --site=* | --sit=*) + site=$ac_optarg ;; + + -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) + ac_prev=srcdir ;; + -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) + srcdir=$ac_optarg ;; + + -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \ + | --syscon | --sysco | --sysc | --sys | --sy) + ac_prev=sysconfdir ;; + -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \ + | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*) + sysconfdir=$ac_optarg ;; + + -target | --target | --targe | --targ | --tar | --ta | --t) + ac_prev=target_alias ;; + -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*) + target_alias=$ac_optarg ;; + + -v | -verbose | --verbose | --verbos | --verbo | --verb) + verbose=yes ;; + + -version | --version | --versio | --versi | --vers | -V) + ac_init_version=: ;; + + -with-* | --with-*) + ac_useropt=`expr "x$ac_option" : 'x-*with-\([^=]*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && + as_fn_error $? "invalid package name: $ac_useropt" + ac_useropt_orig=$ac_useropt + ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` + case $ac_user_opts in + *" +"with_$ac_useropt" +"*) ;; + *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--with-$ac_useropt_orig" + ac_unrecognized_sep=', ';; + esac + eval with_$ac_useropt=\$ac_optarg ;; + + -without-* | --without-*) + ac_useropt=`expr "x$ac_option" : 'x-*without-\(.*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && + as_fn_error $? "invalid package name: $ac_useropt" + ac_useropt_orig=$ac_useropt + ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` + case $ac_user_opts in + *" +"with_$ac_useropt" +"*) ;; + *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--without-$ac_useropt_orig" + ac_unrecognized_sep=', ';; + esac + eval with_$ac_useropt=no ;; + + --x) + # Obsolete; use --with-x. + with_x=yes ;; + + -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \ + | --x-incl | --x-inc | --x-in | --x-i) + ac_prev=x_includes ;; + -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \ + | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*) + x_includes=$ac_optarg ;; + + -x-libraries | --x-libraries | --x-librarie | --x-librari \ + | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l) + ac_prev=x_libraries ;; + -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \ + | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*) + x_libraries=$ac_optarg ;; + + -*) as_fn_error $? "unrecognized option: \`$ac_option' +Try \`$0 --help' for more information" + ;; + + *=*) + ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='` + # Reject names that are not valid shell variable names. + case $ac_envvar in #( + '' | [0-9]* | *[!_$as_cr_alnum]* ) + as_fn_error $? "invalid variable name: \`$ac_envvar'" ;; + esac + eval $ac_envvar=\$ac_optarg + export $ac_envvar ;; + + *) + # FIXME: should be removed in autoconf 3.0. + $as_echo "$as_me: WARNING: you should use --build, --host, --target" >&2 + expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null && + $as_echo "$as_me: WARNING: invalid host type: $ac_option" >&2 + : "${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}" + ;; + + esac +done + +if test -n "$ac_prev"; then + ac_option=--`echo $ac_prev | sed 's/_/-/g'` + as_fn_error $? "missing argument to $ac_option" +fi + +if test -n "$ac_unrecognized_opts"; then + case $enable_option_checking in + no) ;; + fatal) as_fn_error $? "unrecognized options: $ac_unrecognized_opts" ;; + *) $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 ;; + esac +fi + +# Check all directory arguments for consistency. +for ac_var in exec_prefix prefix bindir sbindir libexecdir datarootdir \ + datadir sysconfdir sharedstatedir localstatedir includedir \ + oldincludedir docdir infodir htmldir dvidir pdfdir psdir \ + libdir localedir mandir +do + eval ac_val=\$$ac_var + # Remove trailing slashes. + case $ac_val in + */ ) + ac_val=`expr "X$ac_val" : 'X\(.*[^/]\)' \| "X$ac_val" : 'X\(.*\)'` + eval $ac_var=\$ac_val;; + esac + # Be sure to have absolute directory names. + case $ac_val in + [\\/$]* | ?:[\\/]* ) continue;; + NONE | '' ) case $ac_var in *prefix ) continue;; esac;; + esac + as_fn_error $? "expected an absolute directory name for --$ac_var: $ac_val" +done + +# There might be people who depend on the old broken behavior: `$host' +# used to hold the argument of --host etc. +# FIXME: To remove some day. +build=$build_alias +host=$host_alias +target=$target_alias + +# FIXME: To remove some day. +if test "x$host_alias" != x; then + if test "x$build_alias" = x; then + cross_compiling=maybe + elif test "x$build_alias" != "x$host_alias"; then + cross_compiling=yes + fi +fi + +ac_tool_prefix= +test -n "$host_alias" && ac_tool_prefix=$host_alias- + +test "$silent" = yes && exec 6>/dev/null + + +ac_pwd=`pwd` && test -n "$ac_pwd" && +ac_ls_di=`ls -di .` && +ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` || + as_fn_error $? "working directory cannot be determined" +test "X$ac_ls_di" = "X$ac_pwd_ls_di" || + as_fn_error $? "pwd does not report name of working directory" + + +# Find the source files, if location was not specified. +if test -z "$srcdir"; then + ac_srcdir_defaulted=yes + # Try the directory containing this script, then the parent directory. + ac_confdir=`$as_dirname -- "$as_myself" || +$as_expr X"$as_myself" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$as_myself" : 'X\(//\)[^/]' \| \ + X"$as_myself" : 'X\(//\)$' \| \ + X"$as_myself" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$as_myself" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + srcdir=$ac_confdir + if test ! -r "$srcdir/$ac_unique_file"; then + srcdir=.. + fi +else + ac_srcdir_defaulted=no +fi +if test ! -r "$srcdir/$ac_unique_file"; then + test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .." + as_fn_error $? "cannot find sources ($ac_unique_file) in $srcdir" +fi +ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work" +ac_abs_confdir=`( + cd "$srcdir" && test -r "./$ac_unique_file" || as_fn_error $? "$ac_msg" + pwd)` +# When building in place, set srcdir=. +if test "$ac_abs_confdir" = "$ac_pwd"; then + srcdir=. +fi +# Remove unnecessary trailing slashes from srcdir. +# Double slashes in file names in object file debugging info +# mess up M-x gdb in Emacs. +case $srcdir in +*/) srcdir=`expr "X$srcdir" : 'X\(.*[^/]\)' \| "X$srcdir" : 'X\(.*\)'`;; +esac +for ac_var in $ac_precious_vars; do + eval ac_env_${ac_var}_set=\${${ac_var}+set} + eval ac_env_${ac_var}_value=\$${ac_var} + eval ac_cv_env_${ac_var}_set=\${${ac_var}+set} + eval ac_cv_env_${ac_var}_value=\$${ac_var} +done + +# +# Report the --help message. +# +if test "$ac_init_help" = "long"; then + # Omit some internal or obsolete options to make the list less imposing. + # This message is too long to be a string in the A/UX 3.1 sh. + cat <<_ACEOF +\`configure' configures zookeeper C client 3.4.6 to adapt to many kinds of systems. + +Usage: $0 [OPTION]... [VAR=VALUE]... + +To assign environment variables (e.g., CC, CFLAGS...), specify them as +VAR=VALUE. See below for descriptions of some of the useful variables. + +Defaults for the options are specified in brackets. + +Configuration: + -h, --help display this help and exit + --help=short display options specific to this package + --help=recursive display the short help of all the included packages + -V, --version display version information and exit + -q, --quiet, --silent do not print \`checking ...' messages + --cache-file=FILE cache test results in FILE [disabled] + -C, --config-cache alias for \`--cache-file=config.cache' + -n, --no-create do not create output files + --srcdir=DIR find the sources in DIR [configure dir or \`..'] + +Installation directories: + --prefix=PREFIX install architecture-independent files in PREFIX + @<:@@S|@ac_default_prefix@:>@ + --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX + @<:@PREFIX@:>@ + +By default, \`make install' will install all the files in +\`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc. You can specify +an installation prefix other than \`$ac_default_prefix' using \`--prefix', +for instance \`--prefix=\$HOME'. + +For better control, use the options below. + +Fine tuning of the installation directories: + --bindir=DIR user executables [EPREFIX/bin] + --sbindir=DIR system admin executables [EPREFIX/sbin] + --libexecdir=DIR program executables [EPREFIX/libexec] + --sysconfdir=DIR read-only single-machine data [PREFIX/etc] + --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com] + --localstatedir=DIR modifiable single-machine data [PREFIX/var] + --libdir=DIR object code libraries [EPREFIX/lib] + --includedir=DIR C header files [PREFIX/include] + --oldincludedir=DIR C header files for non-gcc [/usr/include] + --datarootdir=DIR read-only arch.-independent data root [PREFIX/share] + --datadir=DIR read-only architecture-independent data [DATAROOTDIR] + --infodir=DIR info documentation [DATAROOTDIR/info] + --localedir=DIR locale-dependent data [DATAROOTDIR/locale] + --mandir=DIR man documentation [DATAROOTDIR/man] + --docdir=DIR documentation root @<:@DATAROOTDIR/doc/zookeeper@:>@ + --htmldir=DIR html documentation [DOCDIR] + --dvidir=DIR dvi documentation [DOCDIR] + --pdfdir=DIR pdf documentation [DOCDIR] + --psdir=DIR ps documentation [DOCDIR] +_ACEOF + + cat <<\_ACEOF + +Program names: + --program-prefix=PREFIX prepend PREFIX to installed program names + --program-suffix=SUFFIX append SUFFIX to installed program names + --program-transform-name=PROGRAM run sed PROGRAM on installed program names + +System types: + --build=BUILD configure for building on BUILD [guessed] + --host=HOST cross-compile to build programs to run on HOST [BUILD] +_ACEOF +fi + +if test -n "$ac_init_help"; then + case $ac_init_help in + short | recursive ) echo "Configuration of zookeeper C client 3.4.6:";; + esac + cat <<\_ACEOF + +Optional Features: + --disable-option-checking ignore unrecognized --enable/--with options + --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) + --enable-FEATURE[=ARG] include FEATURE [ARG=yes] + --disable-doxygen-doc don't generate any doxygen documentation + --disable-doxygen-dot don't generate graphics for doxygen documentation + --enable-doxygen-man generate doxygen manual pages + --enable-doxygen-rtf generate doxygen RTF documentation + --enable-doxygen-xml generate doxygen XML documentation + --enable-doxygen-chm generate doxygen compressed HTML help documentation + --enable-doxygen-chi generate doxygen seperate compressed HTML help index + file + --disable-doxygen-html don't generate doxygen plain HTML documentation + --enable-doxygen-ps generate doxygen PostScript documentation + --enable-doxygen-pdf generate doxygen PDF documentation + --disable-dependency-tracking speeds up one-time build + --enable-dependency-tracking do not reject slow dependency extractors + --enable-shared@<:@=PKGS@:>@ build shared libraries @<:@default=yes@:>@ + --enable-static@<:@=PKGS@:>@ build static libraries @<:@default=yes@:>@ + --enable-fast-install@<:@=PKGS@:>@ + optimize for fast installation @<:@default=yes@:>@ + --disable-libtool-lock avoid locking (might break parallel builds) + --enable-debug enable debug build @<:@default=no@:>@ + +Optional Packages: + --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] + --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) + --without-cppunit do not use CPPUNIT + --with-cppunit-prefix=PFX Prefix where CppUnit is installed (optional) + --with-cppunit-exec-prefix=PFX Exec prefix where CppUnit is installed (optional) + --with-pic@<:@=PKGS@:>@ try to use only PIC/non-PIC objects @<:@default=use + both@:>@ + --with-gnu-ld assume the C compiler uses GNU ld @<:@default=no@:>@ + --with-sysroot=DIR Search for dependent libraries within DIR + (or the compiler's sysroot if not specified). + --with-syncapi build with support for SyncAPI @<:@default=yes@:>@ + +Some influential environment variables: + DOXYGEN_PAPER_SIZE + a4wide (default), a4, letter, legal or executive + CC C compiler command + CFLAGS C compiler flags + LDFLAGS linker flags, e.g. -L if you have libraries in a + nonstandard directory + LIBS libraries to pass to the linker, e.g. -l + CPPFLAGS (Objective) C/C++ preprocessor flags, e.g. -I if + you have headers in a nonstandard directory + CXX C++ compiler command + CXXFLAGS C++ compiler flags + CPP C preprocessor + CXXCPP C++ preprocessor + +Use these variables to override the choices made by `configure' or to help +it to find libraries and programs with nonstandard names/locations. + +Report bugs to . +_ACEOF +ac_status=$? +fi + +if test "$ac_init_help" = "recursive"; then + # If there are subdirs, report their specific --help. + for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue + test -d "$ac_dir" || + { cd "$srcdir" && ac_pwd=`pwd` && srcdir=. && test -d "$ac_dir"; } || + continue + ac_builddir=. + +case "$ac_dir" in +.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; +*) + ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` + # A ".." for each directory in $ac_dir_suffix. + ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` + case $ac_top_builddir_sub in + "") ac_top_builddir_sub=. ac_top_build_prefix= ;; + *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; + esac ;; +esac +ac_abs_top_builddir=$ac_pwd +ac_abs_builddir=$ac_pwd$ac_dir_suffix +# for backward compatibility: +ac_top_builddir=$ac_top_build_prefix + +case $srcdir in + .) # We are building in place. + ac_srcdir=. + ac_top_srcdir=$ac_top_builddir_sub + ac_abs_top_srcdir=$ac_pwd ;; + [\\/]* | ?:[\\/]* ) # Absolute name. + ac_srcdir=$srcdir$ac_dir_suffix; + ac_top_srcdir=$srcdir + ac_abs_top_srcdir=$srcdir ;; + *) # Relative name. + ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix + ac_top_srcdir=$ac_top_build_prefix$srcdir + ac_abs_top_srcdir=$ac_pwd/$srcdir ;; +esac +ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix + + cd "$ac_dir" || { ac_status=$?; continue; } + # Check for guested configure. + if test -f "$ac_srcdir/configure.gnu"; then + echo && + $SHELL "$ac_srcdir/configure.gnu" --help=recursive + elif test -f "$ac_srcdir/configure"; then + echo && + $SHELL "$ac_srcdir/configure" --help=recursive + else + $as_echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2 + fi || ac_status=$? + cd "$ac_pwd" || { ac_status=$?; break; } + done +fi + +test -n "$ac_init_help" && exit $ac_status +if $ac_init_version; then + cat <<\_ACEOF +zookeeper C client configure 3.4.6 +generated by GNU Autoconf 2.69 + +Copyright (C) 2012 Free Software Foundation, Inc. +This configure script is free software; the Free Software Foundation +gives unlimited permission to copy, distribute and modify it. +_ACEOF + exit +fi + +## ------------------------ ## +## Autoconf initialization. ## +## ------------------------ ## + +@%:@ ac_fn_c_try_compile LINENO +@%:@ -------------------------- +@%:@ Try to compile conftest.@S|@ac_ext, and return whether this succeeded. +ac_fn_c_try_compile () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + rm -f conftest.$ac_objext + if { { ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_compile") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + grep -v '^ *+' conftest.err >conftest.er1 + cat conftest.er1 >&5 + mv -f conftest.er1 conftest.err + fi + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then : + ac_retval=0 +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_retval=1 +fi + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + as_fn_set_status $ac_retval + +} @%:@ ac_fn_c_try_compile + +@%:@ ac_fn_cxx_try_compile LINENO +@%:@ ---------------------------- +@%:@ Try to compile conftest.@S|@ac_ext, and return whether this succeeded. +ac_fn_cxx_try_compile () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + rm -f conftest.$ac_objext + if { { ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_compile") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + grep -v '^ *+' conftest.err >conftest.er1 + cat conftest.er1 >&5 + mv -f conftest.er1 conftest.err + fi + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then : + ac_retval=0 +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_retval=1 +fi + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + as_fn_set_status $ac_retval + +} @%:@ ac_fn_cxx_try_compile + +@%:@ ac_fn_c_try_link LINENO +@%:@ ----------------------- +@%:@ Try to link conftest.@S|@ac_ext, and return whether this succeeded. +ac_fn_c_try_link () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + rm -f conftest.$ac_objext conftest$ac_exeext + if { { ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_link") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + grep -v '^ *+' conftest.err >conftest.er1 + cat conftest.er1 >&5 + mv -f conftest.er1 conftest.err + fi + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && { + test "$cross_compiling" = yes || + test -x conftest$ac_exeext + }; then : + ac_retval=0 +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_retval=1 +fi + # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information + # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would + # interfere with the next link command; also delete a directory that is + # left behind by Apple's compiler. We do this before executing the actions. + rm -rf conftest.dSYM conftest_ipa8_conftest.oo + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + as_fn_set_status $ac_retval + +} @%:@ ac_fn_c_try_link + +@%:@ ac_fn_c_check_header_compile LINENO HEADER VAR INCLUDES +@%:@ ------------------------------------------------------- +@%:@ Tests whether HEADER exists and can be compiled using the include files in +@%:@ INCLUDES, setting the cache variable VAR accordingly. +ac_fn_c_check_header_compile () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 +$as_echo_n "checking for $2... " >&6; } +if eval \${$3+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$4 +@%:@include <$2> +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + eval "$3=yes" +else + eval "$3=no" +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +eval ac_res=\$$3 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + +} @%:@ ac_fn_c_check_header_compile + +@%:@ ac_fn_c_try_cpp LINENO +@%:@ ---------------------- +@%:@ Try to preprocess conftest.@S|@ac_ext, and return whether this succeeded. +ac_fn_c_try_cpp () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + if { { ac_try="$ac_cpp conftest.$ac_ext" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + grep -v '^ *+' conftest.err >conftest.er1 + cat conftest.er1 >&5 + mv -f conftest.er1 conftest.err + fi + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } > conftest.i && { + test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || + test ! -s conftest.err + }; then : + ac_retval=0 +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_retval=1 +fi + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + as_fn_set_status $ac_retval + +} @%:@ ac_fn_c_try_cpp + +@%:@ ac_fn_c_try_run LINENO +@%:@ ---------------------- +@%:@ Try to link conftest.@S|@ac_ext, and return whether this succeeded. Assumes +@%:@ that executables *can* be run. +ac_fn_c_try_run () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + if { { ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_link") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && { ac_try='./conftest$ac_exeext' + { { case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; }; then : + ac_retval=0 +else + $as_echo "$as_me: program exited with status $ac_status" >&5 + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_retval=$ac_status +fi + rm -rf conftest.dSYM conftest_ipa8_conftest.oo + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + as_fn_set_status $ac_retval + +} @%:@ ac_fn_c_try_run + +@%:@ ac_fn_c_check_func LINENO FUNC VAR +@%:@ ---------------------------------- +@%:@ Tests whether FUNC exists, setting the cache variable VAR accordingly +ac_fn_c_check_func () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 +$as_echo_n "checking for $2... " >&6; } +if eval \${$3+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +/* Define $2 to an innocuous variant, in case declares $2. + For example, HP-UX 11i declares gettimeofday. */ +#define $2 innocuous_$2 + +/* System header to define __stub macros and hopefully few prototypes, + which can conflict with char $2 (); below. + Prefer to if __STDC__ is defined, since + exists even on freestanding compilers. */ + +#ifdef __STDC__ +# include +#else +# include +#endif + +#undef $2 + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char $2 (); +/* The GNU C library defines this for functions which it implements + to always fail with ENOSYS. Some functions are actually named + something starting with __ and the normal name is an alias. */ +#if defined __stub_$2 || defined __stub___$2 +choke me +#endif + +int +main () +{ +return $2 (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + eval "$3=yes" +else + eval "$3=no" +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +fi +eval ac_res=\$$3 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + +} @%:@ ac_fn_c_check_func + +@%:@ ac_fn_cxx_try_cpp LINENO +@%:@ ------------------------ +@%:@ Try to preprocess conftest.@S|@ac_ext, and return whether this succeeded. +ac_fn_cxx_try_cpp () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + if { { ac_try="$ac_cpp conftest.$ac_ext" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + grep -v '^ *+' conftest.err >conftest.er1 + cat conftest.er1 >&5 + mv -f conftest.er1 conftest.err + fi + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } > conftest.i && { + test -z "$ac_cxx_preproc_warn_flag$ac_cxx_werror_flag" || + test ! -s conftest.err + }; then : + ac_retval=0 +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_retval=1 +fi + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + as_fn_set_status $ac_retval + +} @%:@ ac_fn_cxx_try_cpp + +@%:@ ac_fn_cxx_try_link LINENO +@%:@ ------------------------- +@%:@ Try to link conftest.@S|@ac_ext, and return whether this succeeded. +ac_fn_cxx_try_link () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + rm -f conftest.$ac_objext conftest$ac_exeext + if { { ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_link") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + grep -v '^ *+' conftest.err >conftest.er1 + cat conftest.er1 >&5 + mv -f conftest.er1 conftest.err + fi + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && { + test "$cross_compiling" = yes || + test -x conftest$ac_exeext + }; then : + ac_retval=0 +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_retval=1 +fi + # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information + # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would + # interfere with the next link command; also delete a directory that is + # left behind by Apple's compiler. We do this before executing the actions. + rm -rf conftest.dSYM conftest_ipa8_conftest.oo + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + as_fn_set_status $ac_retval + +} @%:@ ac_fn_cxx_try_link + +@%:@ ac_fn_c_check_header_mongrel LINENO HEADER VAR INCLUDES +@%:@ ------------------------------------------------------- +@%:@ Tests whether HEADER exists, giving a warning if it cannot be compiled using +@%:@ the include files in INCLUDES and setting the cache variable VAR +@%:@ accordingly. +ac_fn_c_check_header_mongrel () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + if eval \${$3+:} false; then : + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 +$as_echo_n "checking for $2... " >&6; } +if eval \${$3+:} false; then : + $as_echo_n "(cached) " >&6 +fi +eval ac_res=\$$3 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } +else + # Is the header compilable? +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 usability" >&5 +$as_echo_n "checking $2 usability... " >&6; } +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$4 +@%:@include <$2> +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_header_compiler=yes +else + ac_header_compiler=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_compiler" >&5 +$as_echo "$ac_header_compiler" >&6; } + +# Is the header present? +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 presence" >&5 +$as_echo_n "checking $2 presence... " >&6; } +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +@%:@include <$2> +_ACEOF +if ac_fn_c_try_cpp "$LINENO"; then : + ac_header_preproc=yes +else + ac_header_preproc=no +fi +rm -f conftest.err conftest.i conftest.$ac_ext +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_preproc" >&5 +$as_echo "$ac_header_preproc" >&6; } + +# So? What about this header? +case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in #(( + yes:no: ) + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&5 +$as_echo "$as_me: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 +$as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} + ;; + no:yes:* ) + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: present but cannot be compiled" >&5 +$as_echo "$as_me: WARNING: $2: present but cannot be compiled" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: check for missing prerequisite headers?" >&5 +$as_echo "$as_me: WARNING: $2: check for missing prerequisite headers?" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: see the Autoconf documentation" >&5 +$as_echo "$as_me: WARNING: $2: see the Autoconf documentation" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&5 +$as_echo "$as_me: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 +$as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} +( $as_echo "## ---------------------------------------- ## +## Report this to user@zookeeper.apache.org ## +## ---------------------------------------- ##" + ) | sed "s/^/$as_me: WARNING: /" >&2 + ;; +esac + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 +$as_echo_n "checking for $2... " >&6; } +if eval \${$3+:} false; then : + $as_echo_n "(cached) " >&6 +else + eval "$3=\$ac_header_compiler" +fi +eval ac_res=\$$3 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } +fi + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + +} @%:@ ac_fn_c_check_header_mongrel + +@%:@ ac_fn_c_check_type LINENO TYPE VAR INCLUDES +@%:@ ------------------------------------------- +@%:@ Tests whether TYPE exists after having included INCLUDES, setting cache +@%:@ variable VAR accordingly. +ac_fn_c_check_type () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 +$as_echo_n "checking for $2... " >&6; } +if eval \${$3+:} false; then : + $as_echo_n "(cached) " >&6 +else + eval "$3=no" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$4 +int +main () +{ +if (sizeof ($2)) + return 0; + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$4 +int +main () +{ +if (sizeof (($2))) + return 0; + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + +else + eval "$3=yes" +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +eval ac_res=\$$3 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + +} @%:@ ac_fn_c_check_type +cat >config.log <<_ACEOF +This file contains any messages produced by compilers while +running configure, to aid debugging if configure makes a mistake. + +It was created by zookeeper C client $as_me 3.4.6, which was +generated by GNU Autoconf 2.69. Invocation command line was + + $ $0 $@ + +_ACEOF +exec 5>>config.log +{ +cat <<_ASUNAME +## --------- ## +## Platform. ## +## --------- ## + +hostname = `(hostname || uname -n) 2>/dev/null | sed 1q` +uname -m = `(uname -m) 2>/dev/null || echo unknown` +uname -r = `(uname -r) 2>/dev/null || echo unknown` +uname -s = `(uname -s) 2>/dev/null || echo unknown` +uname -v = `(uname -v) 2>/dev/null || echo unknown` + +/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown` +/bin/uname -X = `(/bin/uname -X) 2>/dev/null || echo unknown` + +/bin/arch = `(/bin/arch) 2>/dev/null || echo unknown` +/usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null || echo unknown` +/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown` +/usr/bin/hostinfo = `(/usr/bin/hostinfo) 2>/dev/null || echo unknown` +/bin/machine = `(/bin/machine) 2>/dev/null || echo unknown` +/usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null || echo unknown` +/bin/universe = `(/bin/universe) 2>/dev/null || echo unknown` + +_ASUNAME + +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + $as_echo "PATH: $as_dir" + done +IFS=$as_save_IFS + +} >&5 + +cat >&5 <<_ACEOF + + +## ----------- ## +## Core tests. ## +## ----------- ## + +_ACEOF + + +# Keep a trace of the command line. +# Strip out --no-create and --no-recursion so they do not pile up. +# Strip out --silent because we don't want to record it for future runs. +# Also quote any args containing shell meta-characters. +# Make two passes to allow for proper duplicate-argument suppression. +ac_configure_args= +ac_configure_args0= +ac_configure_args1= +ac_must_keep_next=false +for ac_pass in 1 2 +do + for ac_arg + do + case $ac_arg in + -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;; + -q | -quiet | --quiet | --quie | --qui | --qu | --q \ + | -silent | --silent | --silen | --sile | --sil) + continue ;; + *\'*) + ac_arg=`$as_echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; + esac + case $ac_pass in + 1) as_fn_append ac_configure_args0 " '$ac_arg'" ;; + 2) + as_fn_append ac_configure_args1 " '$ac_arg'" + if test $ac_must_keep_next = true; then + ac_must_keep_next=false # Got value, back to normal. + else + case $ac_arg in + *=* | --config-cache | -C | -disable-* | --disable-* \ + | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \ + | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \ + | -with-* | --with-* | -without-* | --without-* | --x) + case "$ac_configure_args0 " in + "$ac_configure_args1"*" '$ac_arg' "* ) continue ;; + esac + ;; + -* ) ac_must_keep_next=true ;; + esac + fi + as_fn_append ac_configure_args " '$ac_arg'" + ;; + esac + done +done +{ ac_configure_args0=; unset ac_configure_args0;} +{ ac_configure_args1=; unset ac_configure_args1;} + +# When interrupted or exit'd, cleanup temporary files, and complete +# config.log. We remove comments because anyway the quotes in there +# would cause problems or look ugly. +# WARNING: Use '\'' to represent an apostrophe within the trap. +# WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug. +trap 'exit_status=$? + # Save into config.log some information that might help in debugging. + { + echo + + $as_echo "## ---------------- ## +## Cache variables. ## +## ---------------- ##" + echo + # The following way of writing the cache mishandles newlines in values, +( + for ac_var in `(set) 2>&1 | sed -n '\''s/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'\''`; do + eval ac_val=\$$ac_var + case $ac_val in #( + *${as_nl}*) + case $ac_var in #( + *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 +$as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; + esac + case $ac_var in #( + _ | IFS | as_nl) ;; #( + BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( + *) { eval $ac_var=; unset $ac_var;} ;; + esac ;; + esac + done + (set) 2>&1 | + case $as_nl`(ac_space='\'' '\''; set) 2>&1` in #( + *${as_nl}ac_space=\ *) + sed -n \ + "s/'\''/'\''\\\\'\'''\''/g; + s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\''\\2'\''/p" + ;; #( + *) + sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" + ;; + esac | + sort +) + echo + + $as_echo "## ----------------- ## +## Output variables. ## +## ----------------- ##" + echo + for ac_var in $ac_subst_vars + do + eval ac_val=\$$ac_var + case $ac_val in + *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; + esac + $as_echo "$ac_var='\''$ac_val'\''" + done | sort + echo + + if test -n "$ac_subst_files"; then + $as_echo "## ------------------- ## +## File substitutions. ## +## ------------------- ##" + echo + for ac_var in $ac_subst_files + do + eval ac_val=\$$ac_var + case $ac_val in + *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; + esac + $as_echo "$ac_var='\''$ac_val'\''" + done | sort + echo + fi + + if test -s confdefs.h; then + $as_echo "## ----------- ## +## confdefs.h. ## +## ----------- ##" + echo + cat confdefs.h + echo + fi + test "$ac_signal" != 0 && + $as_echo "$as_me: caught signal $ac_signal" + $as_echo "$as_me: exit $exit_status" + } >&5 + rm -f core *.core core.conftest.* && + rm -f -r conftest* confdefs* conf$$* $ac_clean_files && + exit $exit_status +' 0 +for ac_signal in 1 2 13 15; do + trap 'ac_signal='$ac_signal'; as_fn_exit 1' $ac_signal +done +ac_signal=0 + +# confdefs.h avoids OS command line length limits that DEFS can exceed. +rm -f -r conftest* confdefs.h + +$as_echo "/* confdefs.h */" > confdefs.h + +# Predefined preprocessor variables. + +cat >>confdefs.h <<_ACEOF +@%:@define PACKAGE_NAME "$PACKAGE_NAME" +_ACEOF + +cat >>confdefs.h <<_ACEOF +@%:@define PACKAGE_TARNAME "$PACKAGE_TARNAME" +_ACEOF + +cat >>confdefs.h <<_ACEOF +@%:@define PACKAGE_VERSION "$PACKAGE_VERSION" +_ACEOF + +cat >>confdefs.h <<_ACEOF +@%:@define PACKAGE_STRING "$PACKAGE_STRING" +_ACEOF + +cat >>confdefs.h <<_ACEOF +@%:@define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT" +_ACEOF + +cat >>confdefs.h <<_ACEOF +@%:@define PACKAGE_URL "$PACKAGE_URL" +_ACEOF + + +# Let the site file select an alternate cache file if it wants to. +# Prefer an explicitly selected file to automatically selected ones. +ac_site_file1=NONE +ac_site_file2=NONE +if test -n "$CONFIG_SITE"; then + # We do not want a PATH search for config.site. + case $CONFIG_SITE in @%:@(( + -*) ac_site_file1=./$CONFIG_SITE;; + */*) ac_site_file1=$CONFIG_SITE;; + *) ac_site_file1=./$CONFIG_SITE;; + esac +elif test "x$prefix" != xNONE; then + ac_site_file1=$prefix/share/config.site + ac_site_file2=$prefix/etc/config.site +else + ac_site_file1=$ac_default_prefix/share/config.site + ac_site_file2=$ac_default_prefix/etc/config.site +fi +for ac_site_file in "$ac_site_file1" "$ac_site_file2" +do + test "x$ac_site_file" = xNONE && continue + if test /dev/null != "$ac_site_file" && test -r "$ac_site_file"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: loading site script $ac_site_file" >&5 +$as_echo "$as_me: loading site script $ac_site_file" >&6;} + sed 's/^/| /' "$ac_site_file" >&5 + . "$ac_site_file" \ + || { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "failed to load site script $ac_site_file +See \`config.log' for more details" "$LINENO" 5; } + fi +done + +if test -r "$cache_file"; then + # Some versions of bash will fail to source /dev/null (special files + # actually), so we avoid doing that. DJGPP emulates it as a regular file. + if test /dev/null != "$cache_file" && test -f "$cache_file"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: loading cache $cache_file" >&5 +$as_echo "$as_me: loading cache $cache_file" >&6;} + case $cache_file in + [\\/]* | ?:[\\/]* ) . "$cache_file";; + *) . "./$cache_file";; + esac + fi +else + { $as_echo "$as_me:${as_lineno-$LINENO}: creating cache $cache_file" >&5 +$as_echo "$as_me: creating cache $cache_file" >&6;} + >$cache_file +fi + +# Check that the precious variables saved in the cache have kept the same +# value. +ac_cache_corrupted=false +for ac_var in $ac_precious_vars; do + eval ac_old_set=\$ac_cv_env_${ac_var}_set + eval ac_new_set=\$ac_env_${ac_var}_set + eval ac_old_val=\$ac_cv_env_${ac_var}_value + eval ac_new_val=\$ac_env_${ac_var}_value + case $ac_old_set,$ac_new_set in + set,) + { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5 +$as_echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;} + ac_cache_corrupted=: ;; + ,set) + { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was not set in the previous run" >&5 +$as_echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;} + ac_cache_corrupted=: ;; + ,);; + *) + if test "x$ac_old_val" != "x$ac_new_val"; then + # differences in whitespace do not lead to failure. + ac_old_val_w=`echo x $ac_old_val` + ac_new_val_w=`echo x $ac_new_val` + if test "$ac_old_val_w" != "$ac_new_val_w"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' has changed since the previous run:" >&5 +$as_echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;} + ac_cache_corrupted=: + else + { $as_echo "$as_me:${as_lineno-$LINENO}: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&5 +$as_echo "$as_me: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&2;} + eval $ac_var=\$ac_old_val + fi + { $as_echo "$as_me:${as_lineno-$LINENO}: former value: \`$ac_old_val'" >&5 +$as_echo "$as_me: former value: \`$ac_old_val'" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: current value: \`$ac_new_val'" >&5 +$as_echo "$as_me: current value: \`$ac_new_val'" >&2;} + fi;; + esac + # Pass precious variables to config.status. + if test "$ac_new_set" = set; then + case $ac_new_val in + *\'*) ac_arg=$ac_var=`$as_echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;; + *) ac_arg=$ac_var=$ac_new_val ;; + esac + case " $ac_configure_args " in + *" '$ac_arg' "*) ;; # Avoid dups. Use of quotes ensures accuracy. + *) as_fn_append ac_configure_args " '$ac_arg'" ;; + esac + fi +done +if $ac_cache_corrupted; then + { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build" >&5 +$as_echo "$as_me: error: changes in the environment can compromise the build" >&2;} + as_fn_error $? "run \`make distclean' and/or \`rm $cache_file' and start over" "$LINENO" 5 +fi +## -------------------- ## +## Main body of script. ## +## -------------------- ## + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + + + +# Save initial CFLAGS and CXXFLAGS values before AC_PROG_CC and AC_PROG_CXX +init_cflags="$CFLAGS" +init_cxxflags="$CXXFLAGS" + +# initialize Doxygen support + + + + + + + + + + +# Files: +DX_PROJECT=zookeeper + +DX_CONFIG=c-doc.Doxyfile + +DX_DOCDIR=docs + + +# Environment variables used inside doxygen.cfg: +DX_ENV="$DX_ENV SRCDIR='$srcdir'" + +DX_ENV="$DX_ENV PROJECT='$DX_PROJECT'" + +DX_ENV="$DX_ENV DOCDIR='$DX_DOCDIR'" + +DX_ENV="$DX_ENV VERSION='$PACKAGE_VERSION'" + + +# Doxygen itself: + + + + @%:@ Check whether --enable-doxygen-doc was given. +if test "${enable_doxygen_doc+set}" = set; then : + enableval=$enable_doxygen_doc; +case "$enableval" in +#( +y|Y|yes|Yes|YES) + DX_FLAG_doc=1 + + +;; #( +n|N|no|No|NO) + DX_FLAG_doc=0 + +;; #( +*) + as_fn_error $? "invalid value '$enableval' given to doxygen-doc" "$LINENO" 5 +;; +esac + +else + +DX_FLAG_doc=1 + + + +fi + +if test "$DX_FLAG_doc" = 1; then + +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}doxygen", so it can be a program name with args. +set dummy ${ac_tool_prefix}doxygen; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_path_DX_DOXYGEN+:} false; then : + $as_echo_n "(cached) " >&6 +else + case $DX_DOXYGEN in + [\\/]* | ?:[\\/]*) + ac_cv_path_DX_DOXYGEN="$DX_DOXYGEN" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_path_DX_DOXYGEN="$as_dir/$ac_word$ac_exec_ext" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + ;; +esac +fi +DX_DOXYGEN=$ac_cv_path_DX_DOXYGEN +if test -n "$DX_DOXYGEN"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DX_DOXYGEN" >&5 +$as_echo "$DX_DOXYGEN" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_path_DX_DOXYGEN"; then + ac_pt_DX_DOXYGEN=$DX_DOXYGEN + # Extract the first word of "doxygen", so it can be a program name with args. +set dummy doxygen; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_path_ac_pt_DX_DOXYGEN+:} false; then : + $as_echo_n "(cached) " >&6 +else + case $ac_pt_DX_DOXYGEN in + [\\/]* | ?:[\\/]*) + ac_cv_path_ac_pt_DX_DOXYGEN="$ac_pt_DX_DOXYGEN" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_path_ac_pt_DX_DOXYGEN="$as_dir/$ac_word$ac_exec_ext" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + ;; +esac +fi +ac_pt_DX_DOXYGEN=$ac_cv_path_ac_pt_DX_DOXYGEN +if test -n "$ac_pt_DX_DOXYGEN"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_pt_DX_DOXYGEN" >&5 +$as_echo "$ac_pt_DX_DOXYGEN" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_pt_DX_DOXYGEN" = x; then + DX_DOXYGEN="" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + DX_DOXYGEN=$ac_pt_DX_DOXYGEN + fi +else + DX_DOXYGEN="$ac_cv_path_DX_DOXYGEN" +fi + +if test "$DX_FLAG_$DX_CURRENT_FEATURE$DX_DOXYGEN" = 1; then + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: doxygen not found - will not generate any doxygen documentation" >&5 +$as_echo "$as_me: WARNING: doxygen not found - will not generate any doxygen documentation" >&2;} + DX_FLAG_doc=0 + +fi + + +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}perl", so it can be a program name with args. +set dummy ${ac_tool_prefix}perl; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_path_DX_PERL+:} false; then : + $as_echo_n "(cached) " >&6 +else + case $DX_PERL in + [\\/]* | ?:[\\/]*) + ac_cv_path_DX_PERL="$DX_PERL" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_path_DX_PERL="$as_dir/$ac_word$ac_exec_ext" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + ;; +esac +fi +DX_PERL=$ac_cv_path_DX_PERL +if test -n "$DX_PERL"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DX_PERL" >&5 +$as_echo "$DX_PERL" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_path_DX_PERL"; then + ac_pt_DX_PERL=$DX_PERL + # Extract the first word of "perl", so it can be a program name with args. +set dummy perl; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_path_ac_pt_DX_PERL+:} false; then : + $as_echo_n "(cached) " >&6 +else + case $ac_pt_DX_PERL in + [\\/]* | ?:[\\/]*) + ac_cv_path_ac_pt_DX_PERL="$ac_pt_DX_PERL" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_path_ac_pt_DX_PERL="$as_dir/$ac_word$ac_exec_ext" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + ;; +esac +fi +ac_pt_DX_PERL=$ac_cv_path_ac_pt_DX_PERL +if test -n "$ac_pt_DX_PERL"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_pt_DX_PERL" >&5 +$as_echo "$ac_pt_DX_PERL" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_pt_DX_PERL" = x; then + DX_PERL="" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + DX_PERL=$ac_pt_DX_PERL + fi +else + DX_PERL="$ac_cv_path_DX_PERL" +fi + +if test "$DX_FLAG_$DX_CURRENT_FEATURE$DX_PERL" = 1; then + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: perl not found - will not generate any doxygen documentation" >&5 +$as_echo "$as_me: WARNING: perl not found - will not generate any doxygen documentation" >&2;} + DX_FLAG_doc=0 + +fi + + : +fi +if test "$DX_FLAG_doc" = 1; then + if :; then + DX_COND_doc_TRUE= + DX_COND_doc_FALSE='#' +else + DX_COND_doc_TRUE='#' + DX_COND_doc_FALSE= +fi + + DX_ENV="$DX_ENV PERL_PATH='$DX_PERL'" + + : +else + if false; then + DX_COND_doc_TRUE= + DX_COND_doc_FALSE='#' +else + DX_COND_doc_TRUE='#' + DX_COND_doc_FALSE= +fi + + + : +fi + + +# Dot for graphics: + + + + @%:@ Check whether --enable-doxygen-dot was given. +if test "${enable_doxygen_dot+set}" = set; then : + enableval=$enable_doxygen_dot; +case "$enableval" in +#( +y|Y|yes|Yes|YES) + DX_FLAG_dot=1 + + +test "$DX_FLAG_doc" = "1" \ +|| as_fn_error $? "doxygen-dot requires doxygen-dot" "$LINENO" 5 + +;; #( +n|N|no|No|NO) + DX_FLAG_dot=0 + +;; #( +*) + as_fn_error $? "invalid value '$enableval' given to doxygen-dot" "$LINENO" 5 +;; +esac + +else + +DX_FLAG_dot=1 + + +test "$DX_FLAG_doc" = "1" || DX_FLAG_dot=0 + + + +fi + +if test "$DX_FLAG_dot" = 1; then + +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}dot", so it can be a program name with args. +set dummy ${ac_tool_prefix}dot; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_path_DX_DOT+:} false; then : + $as_echo_n "(cached) " >&6 +else + case $DX_DOT in + [\\/]* | ?:[\\/]*) + ac_cv_path_DX_DOT="$DX_DOT" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_path_DX_DOT="$as_dir/$ac_word$ac_exec_ext" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + ;; +esac +fi +DX_DOT=$ac_cv_path_DX_DOT +if test -n "$DX_DOT"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DX_DOT" >&5 +$as_echo "$DX_DOT" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_path_DX_DOT"; then + ac_pt_DX_DOT=$DX_DOT + # Extract the first word of "dot", so it can be a program name with args. +set dummy dot; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_path_ac_pt_DX_DOT+:} false; then : + $as_echo_n "(cached) " >&6 +else + case $ac_pt_DX_DOT in + [\\/]* | ?:[\\/]*) + ac_cv_path_ac_pt_DX_DOT="$ac_pt_DX_DOT" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_path_ac_pt_DX_DOT="$as_dir/$ac_word$ac_exec_ext" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + ;; +esac +fi +ac_pt_DX_DOT=$ac_cv_path_ac_pt_DX_DOT +if test -n "$ac_pt_DX_DOT"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_pt_DX_DOT" >&5 +$as_echo "$ac_pt_DX_DOT" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_pt_DX_DOT" = x; then + DX_DOT="" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + DX_DOT=$ac_pt_DX_DOT + fi +else + DX_DOT="$ac_cv_path_DX_DOT" +fi + +if test "$DX_FLAG_$DX_CURRENT_FEATURE$DX_DOT" = 1; then + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: dot not found - will not generate graphics for doxygen documentation" >&5 +$as_echo "$as_me: WARNING: dot not found - will not generate graphics for doxygen documentation" >&2;} + DX_FLAG_dot=0 + +fi + + : +fi +if test "$DX_FLAG_dot" = 1; then + if :; then + DX_COND_dot_TRUE= + DX_COND_dot_FALSE='#' +else + DX_COND_dot_TRUE='#' + DX_COND_dot_FALSE= +fi + + DX_ENV="$DX_ENV HAVE_DOT='YES'" + + DX_ENV="$DX_ENV DOT_PATH='`expr ".$DX_DOT" : '\(\.\)[^/]*$' \| "x$DX_DOT" : 'x\(.*\)/[^/]*$'`'" + + : +else + if false; then + DX_COND_dot_TRUE= + DX_COND_dot_FALSE='#' +else + DX_COND_dot_TRUE='#' + DX_COND_dot_FALSE= +fi + + DX_ENV="$DX_ENV HAVE_DOT='NO'" + + : +fi + + +# Man pages generation: + + + + @%:@ Check whether --enable-doxygen-man was given. +if test "${enable_doxygen_man+set}" = set; then : + enableval=$enable_doxygen_man; +case "$enableval" in +#( +y|Y|yes|Yes|YES) + DX_FLAG_man=1 + + +test "$DX_FLAG_doc" = "1" \ +|| as_fn_error $? "doxygen-man requires doxygen-man" "$LINENO" 5 + +;; #( +n|N|no|No|NO) + DX_FLAG_man=0 + +;; #( +*) + as_fn_error $? "invalid value '$enableval' given to doxygen-man" "$LINENO" 5 +;; +esac + +else + +DX_FLAG_man=0 + + +test "$DX_FLAG_doc" = "1" || DX_FLAG_man=0 + + + +fi + +if test "$DX_FLAG_man" = 1; then + + : +fi +if test "$DX_FLAG_man" = 1; then + if :; then + DX_COND_man_TRUE= + DX_COND_man_FALSE='#' +else + DX_COND_man_TRUE='#' + DX_COND_man_FALSE= +fi + + DX_ENV="$DX_ENV GENERATE_MAN='YES'" + + : +else + if false; then + DX_COND_man_TRUE= + DX_COND_man_FALSE='#' +else + DX_COND_man_TRUE='#' + DX_COND_man_FALSE= +fi + + DX_ENV="$DX_ENV GENERATE_MAN='NO'" + + : +fi + + +# RTF file generation: + + + + @%:@ Check whether --enable-doxygen-rtf was given. +if test "${enable_doxygen_rtf+set}" = set; then : + enableval=$enable_doxygen_rtf; +case "$enableval" in +#( +y|Y|yes|Yes|YES) + DX_FLAG_rtf=1 + + +test "$DX_FLAG_doc" = "1" \ +|| as_fn_error $? "doxygen-rtf requires doxygen-rtf" "$LINENO" 5 + +;; #( +n|N|no|No|NO) + DX_FLAG_rtf=0 + +;; #( +*) + as_fn_error $? "invalid value '$enableval' given to doxygen-rtf" "$LINENO" 5 +;; +esac + +else + +DX_FLAG_rtf=0 + + +test "$DX_FLAG_doc" = "1" || DX_FLAG_rtf=0 + + + +fi + +if test "$DX_FLAG_rtf" = 1; then + + : +fi +if test "$DX_FLAG_rtf" = 1; then + if :; then + DX_COND_rtf_TRUE= + DX_COND_rtf_FALSE='#' +else + DX_COND_rtf_TRUE='#' + DX_COND_rtf_FALSE= +fi + + DX_ENV="$DX_ENV GENERATE_RTF='YES'" + + : +else + if false; then + DX_COND_rtf_TRUE= + DX_COND_rtf_FALSE='#' +else + DX_COND_rtf_TRUE='#' + DX_COND_rtf_FALSE= +fi + + DX_ENV="$DX_ENV GENERATE_RTF='NO'" + + : +fi + + +# XML file generation: + + + + @%:@ Check whether --enable-doxygen-xml was given. +if test "${enable_doxygen_xml+set}" = set; then : + enableval=$enable_doxygen_xml; +case "$enableval" in +#( +y|Y|yes|Yes|YES) + DX_FLAG_xml=1 + + +test "$DX_FLAG_doc" = "1" \ +|| as_fn_error $? "doxygen-xml requires doxygen-xml" "$LINENO" 5 + +;; #( +n|N|no|No|NO) + DX_FLAG_xml=0 + +;; #( +*) + as_fn_error $? "invalid value '$enableval' given to doxygen-xml" "$LINENO" 5 +;; +esac + +else + +DX_FLAG_xml=0 + + +test "$DX_FLAG_doc" = "1" || DX_FLAG_xml=0 + + + +fi + +if test "$DX_FLAG_xml" = 1; then + + : +fi +if test "$DX_FLAG_xml" = 1; then + if :; then + DX_COND_xml_TRUE= + DX_COND_xml_FALSE='#' +else + DX_COND_xml_TRUE='#' + DX_COND_xml_FALSE= +fi + + DX_ENV="$DX_ENV GENERATE_XML='YES'" + + : +else + if false; then + DX_COND_xml_TRUE= + DX_COND_xml_FALSE='#' +else + DX_COND_xml_TRUE='#' + DX_COND_xml_FALSE= +fi + + DX_ENV="$DX_ENV GENERATE_XML='NO'" + + : +fi + + +# (Compressed) HTML help generation: + + + + @%:@ Check whether --enable-doxygen-chm was given. +if test "${enable_doxygen_chm+set}" = set; then : + enableval=$enable_doxygen_chm; +case "$enableval" in +#( +y|Y|yes|Yes|YES) + DX_FLAG_chm=1 + + +test "$DX_FLAG_doc" = "1" \ +|| as_fn_error $? "doxygen-chm requires doxygen-chm" "$LINENO" 5 + +;; #( +n|N|no|No|NO) + DX_FLAG_chm=0 + +;; #( +*) + as_fn_error $? "invalid value '$enableval' given to doxygen-chm" "$LINENO" 5 +;; +esac + +else + +DX_FLAG_chm=0 + + +test "$DX_FLAG_doc" = "1" || DX_FLAG_chm=0 + + + +fi + +if test "$DX_FLAG_chm" = 1; then + +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}hhc", so it can be a program name with args. +set dummy ${ac_tool_prefix}hhc; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_path_DX_HHC+:} false; then : + $as_echo_n "(cached) " >&6 +else + case $DX_HHC in + [\\/]* | ?:[\\/]*) + ac_cv_path_DX_HHC="$DX_HHC" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_path_DX_HHC="$as_dir/$ac_word$ac_exec_ext" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + ;; +esac +fi +DX_HHC=$ac_cv_path_DX_HHC +if test -n "$DX_HHC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DX_HHC" >&5 +$as_echo "$DX_HHC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_path_DX_HHC"; then + ac_pt_DX_HHC=$DX_HHC + # Extract the first word of "hhc", so it can be a program name with args. +set dummy hhc; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_path_ac_pt_DX_HHC+:} false; then : + $as_echo_n "(cached) " >&6 +else + case $ac_pt_DX_HHC in + [\\/]* | ?:[\\/]*) + ac_cv_path_ac_pt_DX_HHC="$ac_pt_DX_HHC" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_path_ac_pt_DX_HHC="$as_dir/$ac_word$ac_exec_ext" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + ;; +esac +fi +ac_pt_DX_HHC=$ac_cv_path_ac_pt_DX_HHC +if test -n "$ac_pt_DX_HHC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_pt_DX_HHC" >&5 +$as_echo "$ac_pt_DX_HHC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_pt_DX_HHC" = x; then + DX_HHC="" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + DX_HHC=$ac_pt_DX_HHC + fi +else + DX_HHC="$ac_cv_path_DX_HHC" +fi + +if test "$DX_FLAG_$DX_CURRENT_FEATURE$DX_HHC" = 1; then + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: hhc not found - will not generate doxygen compressed HTML help documentation" >&5 +$as_echo "$as_me: WARNING: hhc not found - will not generate doxygen compressed HTML help documentation" >&2;} + DX_FLAG_chm=0 + +fi + + : +fi +if test "$DX_FLAG_chm" = 1; then + if :; then + DX_COND_chm_TRUE= + DX_COND_chm_FALSE='#' +else + DX_COND_chm_TRUE='#' + DX_COND_chm_FALSE= +fi + + DX_ENV="$DX_ENV HHC_PATH='$DX_HHC'" + + DX_ENV="$DX_ENV GENERATE_HTML='YES'" + + DX_ENV="$DX_ENV GENERATE_HTMLHELP='YES'" + + : +else + if false; then + DX_COND_chm_TRUE= + DX_COND_chm_FALSE='#' +else + DX_COND_chm_TRUE='#' + DX_COND_chm_FALSE= +fi + + DX_ENV="$DX_ENV GENERATE_HTMLHELP='NO'" + + : +fi + + +# Seperate CHI file generation. + + + + @%:@ Check whether --enable-doxygen-chi was given. +if test "${enable_doxygen_chi+set}" = set; then : + enableval=$enable_doxygen_chi; +case "$enableval" in +#( +y|Y|yes|Yes|YES) + DX_FLAG_chi=1 + + +test "$DX_FLAG_chm" = "1" \ +|| as_fn_error $? "doxygen-chi requires doxygen-chi" "$LINENO" 5 + +;; #( +n|N|no|No|NO) + DX_FLAG_chi=0 + +;; #( +*) + as_fn_error $? "invalid value '$enableval' given to doxygen-chi" "$LINENO" 5 +;; +esac + +else + +DX_FLAG_chi=0 + + +test "$DX_FLAG_chm" = "1" || DX_FLAG_chi=0 + + + +fi + +if test "$DX_FLAG_chi" = 1; then + + : +fi +if test "$DX_FLAG_chi" = 1; then + if :; then + DX_COND_chi_TRUE= + DX_COND_chi_FALSE='#' +else + DX_COND_chi_TRUE='#' + DX_COND_chi_FALSE= +fi + + DX_ENV="$DX_ENV GENERATE_CHI='YES'" + + : +else + if false; then + DX_COND_chi_TRUE= + DX_COND_chi_FALSE='#' +else + DX_COND_chi_TRUE='#' + DX_COND_chi_FALSE= +fi + + DX_ENV="$DX_ENV GENERATE_CHI='NO'" + + : +fi + + +# Plain HTML pages generation: + + + + @%:@ Check whether --enable-doxygen-html was given. +if test "${enable_doxygen_html+set}" = set; then : + enableval=$enable_doxygen_html; +case "$enableval" in +#( +y|Y|yes|Yes|YES) + DX_FLAG_html=1 + + +test "$DX_FLAG_doc" = "1" \ +|| as_fn_error $? "doxygen-html requires doxygen-html" "$LINENO" 5 + +test "$DX_FLAG_chm" = "0" \ +|| as_fn_error $? "doxygen-html contradicts doxygen-html" "$LINENO" 5 + +;; #( +n|N|no|No|NO) + DX_FLAG_html=0 + +;; #( +*) + as_fn_error $? "invalid value '$enableval' given to doxygen-html" "$LINENO" 5 +;; +esac + +else + +DX_FLAG_html=1 + + +test "$DX_FLAG_doc" = "1" || DX_FLAG_html=0 + + +test "$DX_FLAG_chm" = "0" || DX_FLAG_html=0 + + + +fi + +if test "$DX_FLAG_html" = 1; then + + : +fi +if test "$DX_FLAG_html" = 1; then + if :; then + DX_COND_html_TRUE= + DX_COND_html_FALSE='#' +else + DX_COND_html_TRUE='#' + DX_COND_html_FALSE= +fi + + DX_ENV="$DX_ENV GENERATE_HTML='YES'" + + : +else + if false; then + DX_COND_html_TRUE= + DX_COND_html_FALSE='#' +else + DX_COND_html_TRUE='#' + DX_COND_html_FALSE= +fi + + test "$DX_FLAG_chm" = 1 || DX_ENV="$DX_ENV GENERATE_HTML='NO'" + + : +fi + + +# PostScript file generation: + + + + @%:@ Check whether --enable-doxygen-ps was given. +if test "${enable_doxygen_ps+set}" = set; then : + enableval=$enable_doxygen_ps; +case "$enableval" in +#( +y|Y|yes|Yes|YES) + DX_FLAG_ps=1 + + +test "$DX_FLAG_doc" = "1" \ +|| as_fn_error $? "doxygen-ps requires doxygen-ps" "$LINENO" 5 + +;; #( +n|N|no|No|NO) + DX_FLAG_ps=0 + +;; #( +*) + as_fn_error $? "invalid value '$enableval' given to doxygen-ps" "$LINENO" 5 +;; +esac + +else + +DX_FLAG_ps=0 + + +test "$DX_FLAG_doc" = "1" || DX_FLAG_ps=0 + + + +fi + +if test "$DX_FLAG_ps" = 1; then + +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}latex", so it can be a program name with args. +set dummy ${ac_tool_prefix}latex; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_path_DX_LATEX+:} false; then : + $as_echo_n "(cached) " >&6 +else + case $DX_LATEX in + [\\/]* | ?:[\\/]*) + ac_cv_path_DX_LATEX="$DX_LATEX" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_path_DX_LATEX="$as_dir/$ac_word$ac_exec_ext" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + ;; +esac +fi +DX_LATEX=$ac_cv_path_DX_LATEX +if test -n "$DX_LATEX"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DX_LATEX" >&5 +$as_echo "$DX_LATEX" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_path_DX_LATEX"; then + ac_pt_DX_LATEX=$DX_LATEX + # Extract the first word of "latex", so it can be a program name with args. +set dummy latex; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_path_ac_pt_DX_LATEX+:} false; then : + $as_echo_n "(cached) " >&6 +else + case $ac_pt_DX_LATEX in + [\\/]* | ?:[\\/]*) + ac_cv_path_ac_pt_DX_LATEX="$ac_pt_DX_LATEX" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_path_ac_pt_DX_LATEX="$as_dir/$ac_word$ac_exec_ext" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + ;; +esac +fi +ac_pt_DX_LATEX=$ac_cv_path_ac_pt_DX_LATEX +if test -n "$ac_pt_DX_LATEX"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_pt_DX_LATEX" >&5 +$as_echo "$ac_pt_DX_LATEX" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_pt_DX_LATEX" = x; then + DX_LATEX="" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + DX_LATEX=$ac_pt_DX_LATEX + fi +else + DX_LATEX="$ac_cv_path_DX_LATEX" +fi + +if test "$DX_FLAG_$DX_CURRENT_FEATURE$DX_LATEX" = 1; then + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: latex not found - will not generate doxygen PostScript documentation" >&5 +$as_echo "$as_me: WARNING: latex not found - will not generate doxygen PostScript documentation" >&2;} + DX_FLAG_ps=0 + +fi + + +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}makeindex", so it can be a program name with args. +set dummy ${ac_tool_prefix}makeindex; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_path_DX_MAKEINDEX+:} false; then : + $as_echo_n "(cached) " >&6 +else + case $DX_MAKEINDEX in + [\\/]* | ?:[\\/]*) + ac_cv_path_DX_MAKEINDEX="$DX_MAKEINDEX" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_path_DX_MAKEINDEX="$as_dir/$ac_word$ac_exec_ext" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + ;; +esac +fi +DX_MAKEINDEX=$ac_cv_path_DX_MAKEINDEX +if test -n "$DX_MAKEINDEX"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DX_MAKEINDEX" >&5 +$as_echo "$DX_MAKEINDEX" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_path_DX_MAKEINDEX"; then + ac_pt_DX_MAKEINDEX=$DX_MAKEINDEX + # Extract the first word of "makeindex", so it can be a program name with args. +set dummy makeindex; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_path_ac_pt_DX_MAKEINDEX+:} false; then : + $as_echo_n "(cached) " >&6 +else + case $ac_pt_DX_MAKEINDEX in + [\\/]* | ?:[\\/]*) + ac_cv_path_ac_pt_DX_MAKEINDEX="$ac_pt_DX_MAKEINDEX" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_path_ac_pt_DX_MAKEINDEX="$as_dir/$ac_word$ac_exec_ext" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + ;; +esac +fi +ac_pt_DX_MAKEINDEX=$ac_cv_path_ac_pt_DX_MAKEINDEX +if test -n "$ac_pt_DX_MAKEINDEX"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_pt_DX_MAKEINDEX" >&5 +$as_echo "$ac_pt_DX_MAKEINDEX" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_pt_DX_MAKEINDEX" = x; then + DX_MAKEINDEX="" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + DX_MAKEINDEX=$ac_pt_DX_MAKEINDEX + fi +else + DX_MAKEINDEX="$ac_cv_path_DX_MAKEINDEX" +fi + +if test "$DX_FLAG_$DX_CURRENT_FEATURE$DX_MAKEINDEX" = 1; then + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: makeindex not found - will not generate doxygen PostScript documentation" >&5 +$as_echo "$as_me: WARNING: makeindex not found - will not generate doxygen PostScript documentation" >&2;} + DX_FLAG_ps=0 + +fi + + +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}dvips", so it can be a program name with args. +set dummy ${ac_tool_prefix}dvips; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_path_DX_DVIPS+:} false; then : + $as_echo_n "(cached) " >&6 +else + case $DX_DVIPS in + [\\/]* | ?:[\\/]*) + ac_cv_path_DX_DVIPS="$DX_DVIPS" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_path_DX_DVIPS="$as_dir/$ac_word$ac_exec_ext" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + ;; +esac +fi +DX_DVIPS=$ac_cv_path_DX_DVIPS +if test -n "$DX_DVIPS"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DX_DVIPS" >&5 +$as_echo "$DX_DVIPS" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_path_DX_DVIPS"; then + ac_pt_DX_DVIPS=$DX_DVIPS + # Extract the first word of "dvips", so it can be a program name with args. +set dummy dvips; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_path_ac_pt_DX_DVIPS+:} false; then : + $as_echo_n "(cached) " >&6 +else + case $ac_pt_DX_DVIPS in + [\\/]* | ?:[\\/]*) + ac_cv_path_ac_pt_DX_DVIPS="$ac_pt_DX_DVIPS" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_path_ac_pt_DX_DVIPS="$as_dir/$ac_word$ac_exec_ext" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + ;; +esac +fi +ac_pt_DX_DVIPS=$ac_cv_path_ac_pt_DX_DVIPS +if test -n "$ac_pt_DX_DVIPS"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_pt_DX_DVIPS" >&5 +$as_echo "$ac_pt_DX_DVIPS" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_pt_DX_DVIPS" = x; then + DX_DVIPS="" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + DX_DVIPS=$ac_pt_DX_DVIPS + fi +else + DX_DVIPS="$ac_cv_path_DX_DVIPS" +fi + +if test "$DX_FLAG_$DX_CURRENT_FEATURE$DX_DVIPS" = 1; then + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: dvips not found - will not generate doxygen PostScript documentation" >&5 +$as_echo "$as_me: WARNING: dvips not found - will not generate doxygen PostScript documentation" >&2;} + DX_FLAG_ps=0 + +fi + + +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}egrep", so it can be a program name with args. +set dummy ${ac_tool_prefix}egrep; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_path_DX_EGREP+:} false; then : + $as_echo_n "(cached) " >&6 +else + case $DX_EGREP in + [\\/]* | ?:[\\/]*) + ac_cv_path_DX_EGREP="$DX_EGREP" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_path_DX_EGREP="$as_dir/$ac_word$ac_exec_ext" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + ;; +esac +fi +DX_EGREP=$ac_cv_path_DX_EGREP +if test -n "$DX_EGREP"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DX_EGREP" >&5 +$as_echo "$DX_EGREP" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_path_DX_EGREP"; then + ac_pt_DX_EGREP=$DX_EGREP + # Extract the first word of "egrep", so it can be a program name with args. +set dummy egrep; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_path_ac_pt_DX_EGREP+:} false; then : + $as_echo_n "(cached) " >&6 +else + case $ac_pt_DX_EGREP in + [\\/]* | ?:[\\/]*) + ac_cv_path_ac_pt_DX_EGREP="$ac_pt_DX_EGREP" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_path_ac_pt_DX_EGREP="$as_dir/$ac_word$ac_exec_ext" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + ;; +esac +fi +ac_pt_DX_EGREP=$ac_cv_path_ac_pt_DX_EGREP +if test -n "$ac_pt_DX_EGREP"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_pt_DX_EGREP" >&5 +$as_echo "$ac_pt_DX_EGREP" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_pt_DX_EGREP" = x; then + DX_EGREP="" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + DX_EGREP=$ac_pt_DX_EGREP + fi +else + DX_EGREP="$ac_cv_path_DX_EGREP" +fi + +if test "$DX_FLAG_$DX_CURRENT_FEATURE$DX_EGREP" = 1; then + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: egrep not found - will not generate doxygen PostScript documentation" >&5 +$as_echo "$as_me: WARNING: egrep not found - will not generate doxygen PostScript documentation" >&2;} + DX_FLAG_ps=0 + +fi + + : +fi +if test "$DX_FLAG_ps" = 1; then + if :; then + DX_COND_ps_TRUE= + DX_COND_ps_FALSE='#' +else + DX_COND_ps_TRUE='#' + DX_COND_ps_FALSE= +fi + + + : +else + if false; then + DX_COND_ps_TRUE= + DX_COND_ps_FALSE='#' +else + DX_COND_ps_TRUE='#' + DX_COND_ps_FALSE= +fi + + + : +fi + + +# PDF file generation: + + + + @%:@ Check whether --enable-doxygen-pdf was given. +if test "${enable_doxygen_pdf+set}" = set; then : + enableval=$enable_doxygen_pdf; +case "$enableval" in +#( +y|Y|yes|Yes|YES) + DX_FLAG_pdf=1 + + +test "$DX_FLAG_doc" = "1" \ +|| as_fn_error $? "doxygen-pdf requires doxygen-pdf" "$LINENO" 5 + +;; #( +n|N|no|No|NO) + DX_FLAG_pdf=0 + +;; #( +*) + as_fn_error $? "invalid value '$enableval' given to doxygen-pdf" "$LINENO" 5 +;; +esac + +else + +DX_FLAG_pdf=0 + + +test "$DX_FLAG_doc" = "1" || DX_FLAG_pdf=0 + + + +fi + +if test "$DX_FLAG_pdf" = 1; then + +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}pdflatex", so it can be a program name with args. +set dummy ${ac_tool_prefix}pdflatex; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_path_DX_PDFLATEX+:} false; then : + $as_echo_n "(cached) " >&6 +else + case $DX_PDFLATEX in + [\\/]* | ?:[\\/]*) + ac_cv_path_DX_PDFLATEX="$DX_PDFLATEX" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_path_DX_PDFLATEX="$as_dir/$ac_word$ac_exec_ext" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + ;; +esac +fi +DX_PDFLATEX=$ac_cv_path_DX_PDFLATEX +if test -n "$DX_PDFLATEX"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DX_PDFLATEX" >&5 +$as_echo "$DX_PDFLATEX" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_path_DX_PDFLATEX"; then + ac_pt_DX_PDFLATEX=$DX_PDFLATEX + # Extract the first word of "pdflatex", so it can be a program name with args. +set dummy pdflatex; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_path_ac_pt_DX_PDFLATEX+:} false; then : + $as_echo_n "(cached) " >&6 +else + case $ac_pt_DX_PDFLATEX in + [\\/]* | ?:[\\/]*) + ac_cv_path_ac_pt_DX_PDFLATEX="$ac_pt_DX_PDFLATEX" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_path_ac_pt_DX_PDFLATEX="$as_dir/$ac_word$ac_exec_ext" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + ;; +esac +fi +ac_pt_DX_PDFLATEX=$ac_cv_path_ac_pt_DX_PDFLATEX +if test -n "$ac_pt_DX_PDFLATEX"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_pt_DX_PDFLATEX" >&5 +$as_echo "$ac_pt_DX_PDFLATEX" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_pt_DX_PDFLATEX" = x; then + DX_PDFLATEX="" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + DX_PDFLATEX=$ac_pt_DX_PDFLATEX + fi +else + DX_PDFLATEX="$ac_cv_path_DX_PDFLATEX" +fi + +if test "$DX_FLAG_$DX_CURRENT_FEATURE$DX_PDFLATEX" = 1; then + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: pdflatex not found - will not generate doxygen PDF documentation" >&5 +$as_echo "$as_me: WARNING: pdflatex not found - will not generate doxygen PDF documentation" >&2;} + DX_FLAG_pdf=0 + +fi + + +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}makeindex", so it can be a program name with args. +set dummy ${ac_tool_prefix}makeindex; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_path_DX_MAKEINDEX+:} false; then : + $as_echo_n "(cached) " >&6 +else + case $DX_MAKEINDEX in + [\\/]* | ?:[\\/]*) + ac_cv_path_DX_MAKEINDEX="$DX_MAKEINDEX" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_path_DX_MAKEINDEX="$as_dir/$ac_word$ac_exec_ext" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + ;; +esac +fi +DX_MAKEINDEX=$ac_cv_path_DX_MAKEINDEX +if test -n "$DX_MAKEINDEX"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DX_MAKEINDEX" >&5 +$as_echo "$DX_MAKEINDEX" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_path_DX_MAKEINDEX"; then + ac_pt_DX_MAKEINDEX=$DX_MAKEINDEX + # Extract the first word of "makeindex", so it can be a program name with args. +set dummy makeindex; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_path_ac_pt_DX_MAKEINDEX+:} false; then : + $as_echo_n "(cached) " >&6 +else + case $ac_pt_DX_MAKEINDEX in + [\\/]* | ?:[\\/]*) + ac_cv_path_ac_pt_DX_MAKEINDEX="$ac_pt_DX_MAKEINDEX" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_path_ac_pt_DX_MAKEINDEX="$as_dir/$ac_word$ac_exec_ext" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + ;; +esac +fi +ac_pt_DX_MAKEINDEX=$ac_cv_path_ac_pt_DX_MAKEINDEX +if test -n "$ac_pt_DX_MAKEINDEX"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_pt_DX_MAKEINDEX" >&5 +$as_echo "$ac_pt_DX_MAKEINDEX" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_pt_DX_MAKEINDEX" = x; then + DX_MAKEINDEX="" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + DX_MAKEINDEX=$ac_pt_DX_MAKEINDEX + fi +else + DX_MAKEINDEX="$ac_cv_path_DX_MAKEINDEX" +fi + +if test "$DX_FLAG_$DX_CURRENT_FEATURE$DX_MAKEINDEX" = 1; then + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: makeindex not found - will not generate doxygen PDF documentation" >&5 +$as_echo "$as_me: WARNING: makeindex not found - will not generate doxygen PDF documentation" >&2;} + DX_FLAG_pdf=0 + +fi + + +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}egrep", so it can be a program name with args. +set dummy ${ac_tool_prefix}egrep; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_path_DX_EGREP+:} false; then : + $as_echo_n "(cached) " >&6 +else + case $DX_EGREP in + [\\/]* | ?:[\\/]*) + ac_cv_path_DX_EGREP="$DX_EGREP" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_path_DX_EGREP="$as_dir/$ac_word$ac_exec_ext" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + ;; +esac +fi +DX_EGREP=$ac_cv_path_DX_EGREP +if test -n "$DX_EGREP"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DX_EGREP" >&5 +$as_echo "$DX_EGREP" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_path_DX_EGREP"; then + ac_pt_DX_EGREP=$DX_EGREP + # Extract the first word of "egrep", so it can be a program name with args. +set dummy egrep; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_path_ac_pt_DX_EGREP+:} false; then : + $as_echo_n "(cached) " >&6 +else + case $ac_pt_DX_EGREP in + [\\/]* | ?:[\\/]*) + ac_cv_path_ac_pt_DX_EGREP="$ac_pt_DX_EGREP" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_path_ac_pt_DX_EGREP="$as_dir/$ac_word$ac_exec_ext" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + ;; +esac +fi +ac_pt_DX_EGREP=$ac_cv_path_ac_pt_DX_EGREP +if test -n "$ac_pt_DX_EGREP"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_pt_DX_EGREP" >&5 +$as_echo "$ac_pt_DX_EGREP" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_pt_DX_EGREP" = x; then + DX_EGREP="" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + DX_EGREP=$ac_pt_DX_EGREP + fi +else + DX_EGREP="$ac_cv_path_DX_EGREP" +fi + +if test "$DX_FLAG_$DX_CURRENT_FEATURE$DX_EGREP" = 1; then + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: egrep not found - will not generate doxygen PDF documentation" >&5 +$as_echo "$as_me: WARNING: egrep not found - will not generate doxygen PDF documentation" >&2;} + DX_FLAG_pdf=0 + +fi + + : +fi +if test "$DX_FLAG_pdf" = 1; then + if :; then + DX_COND_pdf_TRUE= + DX_COND_pdf_FALSE='#' +else + DX_COND_pdf_TRUE='#' + DX_COND_pdf_FALSE= +fi + + + : +else + if false; then + DX_COND_pdf_TRUE= + DX_COND_pdf_FALSE='#' +else + DX_COND_pdf_TRUE='#' + DX_COND_pdf_FALSE= +fi + + + : +fi + + +# LaTeX generation for PS and/or PDF: +if test "$DX_FLAG_ps" = 1 || test "$DX_FLAG_pdf" = 1; then + if :; then + DX_COND_latex_TRUE= + DX_COND_latex_FALSE='#' +else + DX_COND_latex_TRUE='#' + DX_COND_latex_FALSE= +fi + + DX_ENV="$DX_ENV GENERATE_LATEX='YES'" + +else + if false; then + DX_COND_latex_TRUE= + DX_COND_latex_FALSE='#' +else + DX_COND_latex_TRUE='#' + DX_COND_latex_FALSE= +fi + + DX_ENV="$DX_ENV GENERATE_LATEX='NO'" + +fi + +# Paper size for PS and/or PDF: + +case "$DOXYGEN_PAPER_SIZE" in +#( +"") + DOXYGEN_PAPER_SIZE="" + +;; #( +a4wide|a4|letter|legal|executive) + DX_ENV="$DX_ENV PAPER_SIZE='$DOXYGEN_PAPER_SIZE'" + +;; #( +*) + as_fn_error $? "unknown DOXYGEN_PAPER_SIZE='$DOXYGEN_PAPER_SIZE'" "$LINENO" 5 +;; +esac + +#For debugging: +#echo DX_FLAG_doc=$DX_FLAG_doc +#echo DX_FLAG_dot=$DX_FLAG_dot +#echo DX_FLAG_man=$DX_FLAG_man +#echo DX_FLAG_html=$DX_FLAG_html +#echo DX_FLAG_chm=$DX_FLAG_chm +#echo DX_FLAG_chi=$DX_FLAG_chi +#echo DX_FLAG_rtf=$DX_FLAG_rtf +#echo DX_FLAG_xml=$DX_FLAG_xml +#echo DX_FLAG_pdf=$DX_FLAG_pdf +#echo DX_FLAG_ps=$DX_FLAG_ps +#echo DX_ENV=$DX_ENV + + +# initialize automake +am__api_version='1.11' + +ac_aux_dir= +for ac_dir in "$srcdir" "$srcdir/.." "$srcdir/../.."; do + if test -f "$ac_dir/install-sh"; then + ac_aux_dir=$ac_dir + ac_install_sh="$ac_aux_dir/install-sh -c" + break + elif test -f "$ac_dir/install.sh"; then + ac_aux_dir=$ac_dir + ac_install_sh="$ac_aux_dir/install.sh -c" + break + elif test -f "$ac_dir/shtool"; then + ac_aux_dir=$ac_dir + ac_install_sh="$ac_aux_dir/shtool install -c" + break + fi +done +if test -z "$ac_aux_dir"; then + as_fn_error $? "cannot find install-sh, install.sh, or shtool in \"$srcdir\" \"$srcdir/..\" \"$srcdir/../..\"" "$LINENO" 5 +fi + +# These three variables are undocumented and unsupported, +# and are intended to be withdrawn in a future Autoconf release. +# They can cause serious problems if a builder's source tree is in a directory +# whose full name contains unusual characters. +ac_config_guess="$SHELL $ac_aux_dir/config.guess" # Please don't use this var. +ac_config_sub="$SHELL $ac_aux_dir/config.sub" # Please don't use this var. +ac_configure="$SHELL $ac_aux_dir/configure" # Please don't use this var. + + +# Find a good install program. We prefer a C program (faster), +# so one script is as good as another. But avoid the broken or +# incompatible versions: +# SysV /etc/install, /usr/sbin/install +# SunOS /usr/etc/install +# IRIX /sbin/install +# AIX /bin/install +# AmigaOS /C/install, which installs bootblocks on floppy discs +# AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag +# AFS /usr/afsws/bin/install, which mishandles nonexistent args +# SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff" +# OS/2's system install, which has a completely different semantic +# ./install, which can be erroneously created by make from ./install.sh. +# Reject install programs that cannot install multiple files. +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a BSD-compatible install" >&5 +$as_echo_n "checking for a BSD-compatible install... " >&6; } +if test -z "$INSTALL"; then +if ${ac_cv_path_install+:} false; then : + $as_echo_n "(cached) " >&6 +else + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + # Account for people who put trailing slashes in PATH elements. +case $as_dir/ in @%:@(( + ./ | .// | /[cC]/* | \ + /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \ + ?:[\\/]os2[\\/]install[\\/]* | ?:[\\/]OS2[\\/]INSTALL[\\/]* | \ + /usr/ucb/* ) ;; + *) + # OSF1 and SCO ODT 3.0 have their own names for install. + # Don't use installbsd from OSF since it installs stuff as root + # by default. + for ac_prog in ginstall scoinst install; do + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_prog$ac_exec_ext"; then + if test $ac_prog = install && + grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then + # AIX install. It has an incompatible calling convention. + : + elif test $ac_prog = install && + grep pwplus "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then + # program-specific install script used by HP pwplus--don't use. + : + else + rm -rf conftest.one conftest.two conftest.dir + echo one > conftest.one + echo two > conftest.two + mkdir conftest.dir + if "$as_dir/$ac_prog$ac_exec_ext" -c conftest.one conftest.two "`pwd`/conftest.dir" && + test -s conftest.one && test -s conftest.two && + test -s conftest.dir/conftest.one && + test -s conftest.dir/conftest.two + then + ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c" + break 3 + fi + fi + fi + done + done + ;; +esac + + done +IFS=$as_save_IFS + +rm -rf conftest.one conftest.two conftest.dir + +fi + if test "${ac_cv_path_install+set}" = set; then + INSTALL=$ac_cv_path_install + else + # As a last resort, use the slow shell script. Don't cache a + # value for INSTALL within a source directory, because that will + # break other packages using the cache if that directory is + # removed, or if the value is a relative name. + INSTALL=$ac_install_sh + fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $INSTALL" >&5 +$as_echo "$INSTALL" >&6; } + +# Use test -z because SunOS4 sh mishandles braces in ${var-val}. +# It thinks the first close brace ends the variable substitution. +test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}' + +test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}' + +test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644' + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether build environment is sane" >&5 +$as_echo_n "checking whether build environment is sane... " >&6; } +# Just in case +sleep 1 +echo timestamp > conftest.file +# Reject unsafe characters in $srcdir or the absolute working directory +# name. Accept space and tab only in the latter. +am_lf=' +' +case `pwd` in + *[\\\"\#\$\&\'\`$am_lf]*) + as_fn_error $? "unsafe absolute working directory name" "$LINENO" 5;; +esac +case $srcdir in + *[\\\"\#\$\&\'\`$am_lf\ \ ]*) + as_fn_error $? "unsafe srcdir value: \`$srcdir'" "$LINENO" 5;; +esac + +# Do `set' in a subshell so we don't clobber the current shell's +# arguments. Must try -L first in case configure is actually a +# symlink; some systems play weird games with the mod time of symlinks +# (eg FreeBSD returns the mod time of the symlink's containing +# directory). +if ( + set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null` + if test "$*" = "X"; then + # -L didn't work. + set X `ls -t "$srcdir/configure" conftest.file` + fi + rm -f conftest.file + if test "$*" != "X $srcdir/configure conftest.file" \ + && test "$*" != "X conftest.file $srcdir/configure"; then + + # If neither matched, then we have a broken ls. This can happen + # if, for instance, CONFIG_SHELL is bash and it inherits a + # broken ls alias from the environment. This has actually + # happened. Such a system could not be considered "sane". + as_fn_error $? "ls -t appears to fail. Make sure there is not a broken +alias in your environment" "$LINENO" 5 + fi + + test "$2" = conftest.file + ) +then + # Ok. + : +else + as_fn_error $? "newly created file is older than distributed files! +Check your system clock" "$LINENO" 5 +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } +test "$program_prefix" != NONE && + program_transform_name="s&^&$program_prefix&;$program_transform_name" +# Use a double $ so make ignores it. +test "$program_suffix" != NONE && + program_transform_name="s&\$&$program_suffix&;$program_transform_name" +# Double any \ or $. +# By default was `s,x,x', remove it if useless. +ac_script='s/[\\$]/&&/g;s/;s,x,x,$//' +program_transform_name=`$as_echo "$program_transform_name" | sed "$ac_script"` + +# expand $ac_aux_dir to an absolute path +am_aux_dir=`cd $ac_aux_dir && pwd` + +if test x"${MISSING+set}" != xset; then + case $am_aux_dir in + *\ * | *\ *) + MISSING="\${SHELL} \"$am_aux_dir/missing\"" ;; + *) + MISSING="\${SHELL} $am_aux_dir/missing" ;; + esac +fi +# Use eval to expand $SHELL +if eval "$MISSING --run true"; then + am_missing_run="$MISSING --run " +else + am_missing_run= + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: \`missing' script is too old or missing" >&5 +$as_echo "$as_me: WARNING: \`missing' script is too old or missing" >&2;} +fi + +if test x"${install_sh}" != xset; then + case $am_aux_dir in + *\ * | *\ *) + install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;; + *) + install_sh="\${SHELL} $am_aux_dir/install-sh" + esac +fi + +# Installed binaries are usually stripped using `strip' when the user +# run `make install-strip'. However `strip' might not be the right +# tool to use in cross-compilation environments, therefore Automake +# will honor the `STRIP' environment variable to overrule this program. +if test "$cross_compiling" != no; then + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args. +set dummy ${ac_tool_prefix}strip; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_STRIP+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$STRIP"; then + ac_cv_prog_STRIP="$STRIP" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_STRIP="${ac_tool_prefix}strip" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +STRIP=$ac_cv_prog_STRIP +if test -n "$STRIP"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $STRIP" >&5 +$as_echo "$STRIP" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_STRIP"; then + ac_ct_STRIP=$STRIP + # Extract the first word of "strip", so it can be a program name with args. +set dummy strip; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_STRIP+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_STRIP"; then + ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_STRIP="strip" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP +if test -n "$ac_ct_STRIP"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP" >&5 +$as_echo "$ac_ct_STRIP" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_STRIP" = x; then + STRIP=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + STRIP=$ac_ct_STRIP + fi +else + STRIP="$ac_cv_prog_STRIP" +fi + +fi +INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s" + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a thread-safe mkdir -p" >&5 +$as_echo_n "checking for a thread-safe mkdir -p... " >&6; } +if test -z "$MKDIR_P"; then + if ${ac_cv_path_mkdir+:} false; then : + $as_echo_n "(cached) " >&6 +else + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH$PATH_SEPARATOR/opt/sfw/bin +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_prog in mkdir gmkdir; do + for ac_exec_ext in '' $ac_executable_extensions; do + as_fn_executable_p "$as_dir/$ac_prog$ac_exec_ext" || continue + case `"$as_dir/$ac_prog$ac_exec_ext" --version 2>&1` in #( + 'mkdir (GNU coreutils) '* | \ + 'mkdir (coreutils) '* | \ + 'mkdir (fileutils) '4.1*) + ac_cv_path_mkdir=$as_dir/$ac_prog$ac_exec_ext + break 3;; + esac + done + done + done +IFS=$as_save_IFS + +fi + + test -d ./--version && rmdir ./--version + if test "${ac_cv_path_mkdir+set}" = set; then + MKDIR_P="$ac_cv_path_mkdir -p" + else + # As a last resort, use the slow shell script. Don't cache a + # value for MKDIR_P within a source directory, because that will + # break other packages using the cache if that directory is + # removed, or if the value is a relative name. + MKDIR_P="$ac_install_sh -d" + fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $MKDIR_P" >&5 +$as_echo "$MKDIR_P" >&6; } + +mkdir_p="$MKDIR_P" +case $mkdir_p in + [\\/$]* | ?:[\\/]*) ;; + */*) mkdir_p="\$(top_builddir)/$mkdir_p" ;; +esac + +for ac_prog in gawk mawk nawk awk +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_AWK+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$AWK"; then + ac_cv_prog_AWK="$AWK" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_AWK="$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +AWK=$ac_cv_prog_AWK +if test -n "$AWK"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AWK" >&5 +$as_echo "$AWK" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$AWK" && break +done + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} sets \$(MAKE)" >&5 +$as_echo_n "checking whether ${MAKE-make} sets \$(MAKE)... " >&6; } +set x ${MAKE-make} +ac_make=`$as_echo "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'` +if eval \${ac_cv_prog_make_${ac_make}_set+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat >conftest.make <<\_ACEOF +SHELL = /bin/sh +all: + @echo '@@@%%%=$(MAKE)=@@@%%%' +_ACEOF +# GNU make sometimes prints "make[1]: Entering ...", which would confuse us. +case `${MAKE-make} -f conftest.make 2>/dev/null` in + *@@@%%%=?*=@@@%%%*) + eval ac_cv_prog_make_${ac_make}_set=yes;; + *) + eval ac_cv_prog_make_${ac_make}_set=no;; +esac +rm -f conftest.make +fi +if eval test \$ac_cv_prog_make_${ac_make}_set = yes; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + SET_MAKE= +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + SET_MAKE="MAKE=${MAKE-make}" +fi + +rm -rf .tst 2>/dev/null +mkdir .tst 2>/dev/null +if test -d .tst; then + am__leading_dot=. +else + am__leading_dot=_ +fi +rmdir .tst 2>/dev/null + +if test "`cd $srcdir && pwd`" != "`pwd`"; then + # Use -I$(srcdir) only when $(srcdir) != ., so that make's output + # is not polluted with repeated "-I." + am__isrc=' -I$(srcdir)' + # test to see if srcdir already configured + if test -f $srcdir/config.status; then + as_fn_error $? "source directory already configured; run \"make distclean\" there first" "$LINENO" 5 + fi +fi + +# test whether we have cygpath +if test -z "$CYGPATH_W"; then + if (cygpath --version) >/dev/null 2>/dev/null; then + CYGPATH_W='cygpath -w' + else + CYGPATH_W=echo + fi +fi + + +# Define the identity of the package. + PACKAGE='zookeeper' + VERSION='3.4.6' + + +cat >>confdefs.h <<_ACEOF +@%:@define PACKAGE "$PACKAGE" +_ACEOF + + +cat >>confdefs.h <<_ACEOF +@%:@define VERSION "$VERSION" +_ACEOF + +# Some tools Automake needs. + +ACLOCAL=${ACLOCAL-"${am_missing_run}aclocal-${am__api_version}"} + + +AUTOCONF=${AUTOCONF-"${am_missing_run}autoconf"} + + +AUTOMAKE=${AUTOMAKE-"${am_missing_run}automake-${am__api_version}"} + + +AUTOHEADER=${AUTOHEADER-"${am_missing_run}autoheader"} + + +MAKEINFO=${MAKEINFO-"${am_missing_run}makeinfo"} + +# We need awk for the "check" target. The system "awk" is bad on +# some platforms. +# Always define AMTAR for backward compatibility. Yes, it's still used +# in the wild :-( We should find a proper way to deprecate it ... +AMTAR='$${TAR-tar}' + +am__tar='$${TAR-tar} chof - "$$tardir"' am__untar='$${TAR-tar} xf -' + + + + + +ac_config_headers="$ac_config_headers config.h" + + +# Checks for programs. + +@%:@ Check whether --with-cppunit was given. +if test "${with_cppunit+set}" = set; then : + withval=$with_cppunit; +fi + + +if test "$with_cppunit" = "no" ; then + CPPUNIT_PATH="No_CPPUNIT" + CPPUNIT_INCLUDE= + CPPUNIT_LIBS= +else + + + +@%:@ Check whether --with-cppunit-prefix was given. +if test "${with_cppunit_prefix+set}" = set; then : + withval=$with_cppunit_prefix; cppunit_config_prefix="$withval" +else + cppunit_config_prefix="" +fi + + +@%:@ Check whether --with-cppunit-exec-prefix was given. +if test "${with_cppunit_exec_prefix+set}" = set; then : + withval=$with_cppunit_exec_prefix; cppunit_config_exec_prefix="$withval" +else + cppunit_config_exec_prefix="" +fi + + + if test x$cppunit_config_exec_prefix != x ; then + cppunit_config_args="$cppunit_config_args --exec-prefix=$cppunit_config_exec_prefix" + if test x${CPPUNIT_CONFIG+set} != xset ; then + CPPUNIT_CONFIG=$cppunit_config_exec_prefix/bin/cppunit-config + fi + fi + if test x$cppunit_config_prefix != x ; then + cppunit_config_args="$cppunit_config_args --prefix=$cppunit_config_prefix" + if test x${CPPUNIT_CONFIG+set} != xset ; then + CPPUNIT_CONFIG=$cppunit_config_prefix/bin/cppunit-config + fi + fi + + # Extract the first word of "cppunit-config", so it can be a program name with args. +set dummy cppunit-config; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_path_CPPUNIT_CONFIG+:} false; then : + $as_echo_n "(cached) " >&6 +else + case $CPPUNIT_CONFIG in + [\\/]* | ?:[\\/]*) + ac_cv_path_CPPUNIT_CONFIG="$CPPUNIT_CONFIG" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_path_CPPUNIT_CONFIG="$as_dir/$ac_word$ac_exec_ext" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + test -z "$ac_cv_path_CPPUNIT_CONFIG" && ac_cv_path_CPPUNIT_CONFIG="no" + ;; +esac +fi +CPPUNIT_CONFIG=$ac_cv_path_CPPUNIT_CONFIG +if test -n "$CPPUNIT_CONFIG"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CPPUNIT_CONFIG" >&5 +$as_echo "$CPPUNIT_CONFIG" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + cppunit_version_min=1.10.2 + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Cppunit - version >= $cppunit_version_min" >&5 +$as_echo_n "checking for Cppunit - version >= $cppunit_version_min... " >&6; } + no_cppunit="" + if test "$CPPUNIT_CONFIG" = "no" ; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + no_cppunit=yes + else + CPPUNIT_CFLAGS=`$CPPUNIT_CONFIG --cflags` + CPPUNIT_LIBS=`$CPPUNIT_CONFIG --libs` + cppunit_version=`$CPPUNIT_CONFIG --version` + + cppunit_major_version=`echo $cppunit_version | \ + sed 's/\([0-9]*\).\([0-9]*\).\([0-9]*\)/\1/'` + cppunit_minor_version=`echo $cppunit_version | \ + sed 's/\([0-9]*\).\([0-9]*\).\([0-9]*\)/\2/'` + cppunit_micro_version=`echo $cppunit_version | \ + sed 's/\([0-9]*\).\([0-9]*\).\([0-9]*\)/\3/'` + + cppunit_major_min=`echo $cppunit_version_min | \ + sed 's/\([0-9]*\).\([0-9]*\).\([0-9]*\)/\1/'` + if test "x${cppunit_major_min}" = "x" ; then + cppunit_major_min=0 + fi + + cppunit_minor_min=`echo $cppunit_version_min | \ + sed 's/\([0-9]*\).\([0-9]*\).\([0-9]*\)/\2/'` + if test "x${cppunit_minor_min}" = "x" ; then + cppunit_minor_min=0 + fi + + cppunit_micro_min=`echo $cppunit_version_min | \ + sed 's/\([0-9]*\).\([0-9]*\).\([0-9]*\)/\3/'` + if test "x${cppunit_micro_min}" = "x" ; then + cppunit_micro_min=0 + fi + + cppunit_version_proper=`expr \ + $cppunit_major_version \> $cppunit_major_min \| \ + $cppunit_major_version \= $cppunit_major_min \& \ + $cppunit_minor_version \> $cppunit_minor_min \| \ + $cppunit_major_version \= $cppunit_major_min \& \ + $cppunit_minor_version \= $cppunit_minor_min \& \ + $cppunit_micro_version \>= $cppunit_micro_min ` + + if test "$cppunit_version_proper" = "1" ; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $cppunit_major_version.$cppunit_minor_version.$cppunit_micro_version" >&5 +$as_echo "$cppunit_major_version.$cppunit_minor_version.$cppunit_micro_version" >&6; } + else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + no_cppunit=yes + fi + fi + + if test "x$no_cppunit" = x ; then + : + else + CPPUNIT_CFLAGS="" + CPPUNIT_LIBS="" + : + fi + + + + +fi + +if test "$CALLER" = "ANT" ; then +CPPUNIT_CFLAGS="$CPPUNIT_CFLAGS -DZKSERVER_CMD=\"\\\"${base_dir}/src/c/tests/zkServer.sh\\\"\"" +else +CPPUNIT_CFLAGS="$CPPUNIT_CFLAGS -DZKSERVER_CMD=\"\\\"./tests/zkServer.sh\\\"\"" +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for generated/zookeeper.jute.c" >&5 +$as_echo_n "checking for generated/zookeeper.jute.c... " >&6; } +if ${ac_cv_file_generated_zookeeper_jute_c+:} false; then : + $as_echo_n "(cached) " >&6 +else + test "$cross_compiling" = yes && + as_fn_error $? "cannot check for file existence when cross compiling" "$LINENO" 5 +if test -r "generated/zookeeper.jute.c"; then + ac_cv_file_generated_zookeeper_jute_c=yes +else + ac_cv_file_generated_zookeeper_jute_c=no +fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_file_generated_zookeeper_jute_c" >&5 +$as_echo "$ac_cv_file_generated_zookeeper_jute_c" >&6; } +if test "x$ac_cv_file_generated_zookeeper_jute_c" = xyes; then : + +cat >>confdefs.h <<_ACEOF +@%:@define HAVE_GENERATED_ZOOKEEPER_JUTE_C 1 +_ACEOF + +else + as_fn_error $? "jute files are missing! Please run \"ant compile_jute\" while in the zookeeper top level directory." "$LINENO" 5 + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for generated/zookeeper.jute.h" >&5 +$as_echo_n "checking for generated/zookeeper.jute.h... " >&6; } +if ${ac_cv_file_generated_zookeeper_jute_h+:} false; then : + $as_echo_n "(cached) " >&6 +else + test "$cross_compiling" = yes && + as_fn_error $? "cannot check for file existence when cross compiling" "$LINENO" 5 +if test -r "generated/zookeeper.jute.h"; then + ac_cv_file_generated_zookeeper_jute_h=yes +else + ac_cv_file_generated_zookeeper_jute_h=no +fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_file_generated_zookeeper_jute_h" >&5 +$as_echo "$ac_cv_file_generated_zookeeper_jute_h" >&6; } +if test "x$ac_cv_file_generated_zookeeper_jute_h" = xyes; then : + +cat >>confdefs.h <<_ACEOF +@%:@define HAVE_GENERATED_ZOOKEEPER_JUTE_H 1 +_ACEOF + +else + as_fn_error $? "jute files are missing! Please run \"ant compile_jute\" while in the zookeeper top level directory." "$LINENO" 5 + +fi + +fi + + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args. +set dummy ${ac_tool_prefix}gcc; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_CC+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_CC="${ac_tool_prefix}gcc" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +$as_echo "$CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_CC"; then + ac_ct_CC=$CC + # Extract the first word of "gcc", so it can be a program name with args. +set dummy gcc; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_CC+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_CC"; then + ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_CC="gcc" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_CC=$ac_cv_prog_ac_ct_CC +if test -n "$ac_ct_CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 +$as_echo "$ac_ct_CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_CC" = x; then + CC="" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + CC=$ac_ct_CC + fi +else + CC="$ac_cv_prog_CC" +fi + +if test -z "$CC"; then + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args. +set dummy ${ac_tool_prefix}cc; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_CC+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_CC="${ac_tool_prefix}cc" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +$as_echo "$CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + fi +fi +if test -z "$CC"; then + # Extract the first word of "cc", so it can be a program name with args. +set dummy cc; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_CC+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else + ac_prog_rejected=no +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then + ac_prog_rejected=yes + continue + fi + ac_cv_prog_CC="cc" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +if test $ac_prog_rejected = yes; then + # We found a bogon in the path, so make sure we never use it. + set dummy $ac_cv_prog_CC + shift + if test $@%:@ != 0; then + # We chose a different compiler from the bogus one. + # However, it has the same basename, so the bogon will be chosen + # first if we set CC to just the basename; use the full file name. + shift + ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@" + fi +fi +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +$as_echo "$CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$CC"; then + if test -n "$ac_tool_prefix"; then + for ac_prog in cl.exe + do + # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. +set dummy $ac_tool_prefix$ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_CC+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_CC="$ac_tool_prefix$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +$as_echo "$CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$CC" && break + done +fi +if test -z "$CC"; then + ac_ct_CC=$CC + for ac_prog in cl.exe +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_CC+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_CC"; then + ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_CC="$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_CC=$ac_cv_prog_ac_ct_CC +if test -n "$ac_ct_CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 +$as_echo "$ac_ct_CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$ac_ct_CC" && break +done + + if test "x$ac_ct_CC" = x; then + CC="" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + CC=$ac_ct_CC + fi +fi + +fi + + +test -z "$CC" && { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "no acceptable C compiler found in \$PATH +See \`config.log' for more details" "$LINENO" 5; } + +# Provide some information about the compiler. +$as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5 +set X $ac_compile +ac_compiler=$2 +for ac_option in --version -v -V -qversion; do + { { ac_try="$ac_compiler $ac_option >&5" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_compiler $ac_option >&5") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + sed '10a\ +... rest of stderr output deleted ... + 10q' conftest.err >conftest.er1 + cat conftest.er1 >&5 + fi + rm -f conftest.er1 conftest.err + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } +done + +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +ac_clean_files_save=$ac_clean_files +ac_clean_files="$ac_clean_files a.out a.out.dSYM a.exe b.out" +# Try to create an executable without -o first, disregard a.out. +# It will help us diagnose broken compilers, and finding out an intuition +# of exeext. +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler works" >&5 +$as_echo_n "checking whether the C compiler works... " >&6; } +ac_link_default=`$as_echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'` + +# The possible output files: +ac_files="a.out conftest.exe conftest a.exe a_out.exe b.out conftest.*" + +ac_rmfiles= +for ac_file in $ac_files +do + case $ac_file in + *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; + * ) ac_rmfiles="$ac_rmfiles $ac_file";; + esac +done +rm -f $ac_rmfiles + +if { { ac_try="$ac_link_default" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_link_default") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then : + # Autoconf-2.13 could set the ac_cv_exeext variable to `no'. +# So ignore a value of `no', otherwise this would lead to `EXEEXT = no' +# in a Makefile. We should not override ac_cv_exeext if it was cached, +# so that the user can short-circuit this test for compilers unknown to +# Autoconf. +for ac_file in $ac_files '' +do + test -f "$ac_file" || continue + case $ac_file in + *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) + ;; + [ab].out ) + # We found the default executable, but exeext='' is most + # certainly right. + break;; + *.* ) + if test "${ac_cv_exeext+set}" = set && test "$ac_cv_exeext" != no; + then :; else + ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` + fi + # We set ac_cv_exeext here because the later test for it is not + # safe: cross compilers may not add the suffix if given an `-o' + # argument, so we may need to know it at that point already. + # Even if this section looks crufty: it has the advantage of + # actually working. + break;; + * ) + break;; + esac +done +test "$ac_cv_exeext" = no && ac_cv_exeext= + +else + ac_file='' +fi +if test -z "$ac_file"; then : + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +$as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error 77 "C compiler cannot create executables +See \`config.log' for more details" "$LINENO" 5; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler default output file name" >&5 +$as_echo_n "checking for C compiler default output file name... " >&6; } +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_file" >&5 +$as_echo "$ac_file" >&6; } +ac_exeext=$ac_cv_exeext + +rm -f -r a.out a.out.dSYM a.exe conftest$ac_cv_exeext b.out +ac_clean_files=$ac_clean_files_save +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of executables" >&5 +$as_echo_n "checking for suffix of executables... " >&6; } +if { { ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_link") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then : + # If both `conftest.exe' and `conftest' are `present' (well, observable) +# catch `conftest.exe'. For instance with Cygwin, `ls conftest' will +# work properly (i.e., refer to `conftest.exe'), while it won't with +# `rm'. +for ac_file in conftest.exe conftest conftest.*; do + test -f "$ac_file" || continue + case $ac_file in + *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; + *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` + break;; + * ) break;; + esac +done +else + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "cannot compute suffix of executables: cannot compile and link +See \`config.log' for more details" "$LINENO" 5; } +fi +rm -f conftest conftest$ac_cv_exeext +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_exeext" >&5 +$as_echo "$ac_cv_exeext" >&6; } + +rm -f conftest.$ac_ext +EXEEXT=$ac_cv_exeext +ac_exeext=$EXEEXT +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +@%:@include +int +main () +{ +FILE *f = fopen ("conftest.out", "w"); + return ferror (f) || fclose (f) != 0; + + ; + return 0; +} +_ACEOF +ac_clean_files="$ac_clean_files conftest.out" +# Check that the compiler produces executables we can run. If not, either +# the compiler is broken, or we cross compile. +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are cross compiling" >&5 +$as_echo_n "checking whether we are cross compiling... " >&6; } +if test "$cross_compiling" != yes; then + { { ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_link") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + if { ac_try='./conftest$ac_cv_exeext' + { { case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; }; then + cross_compiling=no + else + if test "$cross_compiling" = maybe; then + cross_compiling=yes + else + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "cannot run C compiled programs. +If you meant to cross compile, use \`--host'. +See \`config.log' for more details" "$LINENO" 5; } + fi + fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $cross_compiling" >&5 +$as_echo "$cross_compiling" >&6; } + +rm -f conftest.$ac_ext conftest$ac_cv_exeext conftest.out +ac_clean_files=$ac_clean_files_save +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of object files" >&5 +$as_echo_n "checking for suffix of object files... " >&6; } +if ${ac_cv_objext+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +rm -f conftest.o conftest.obj +if { { ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_compile") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then : + for ac_file in conftest.o conftest.obj conftest.*; do + test -f "$ac_file" || continue; + case $ac_file in + *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM ) ;; + *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'` + break;; + esac +done +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "cannot compute suffix of object files: cannot compile +See \`config.log' for more details" "$LINENO" 5; } +fi +rm -f conftest.$ac_cv_objext conftest.$ac_ext +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_objext" >&5 +$as_echo "$ac_cv_objext" >&6; } +OBJEXT=$ac_cv_objext +ac_objext=$OBJEXT +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C compiler" >&5 +$as_echo_n "checking whether we are using the GNU C compiler... " >&6; } +if ${ac_cv_c_compiler_gnu+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ +#ifndef __GNUC__ + choke me +#endif + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_compiler_gnu=yes +else + ac_compiler_gnu=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +ac_cv_c_compiler_gnu=$ac_compiler_gnu + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5 +$as_echo "$ac_cv_c_compiler_gnu" >&6; } +if test $ac_compiler_gnu = yes; then + GCC=yes +else + GCC= +fi +ac_test_CFLAGS=${CFLAGS+set} +ac_save_CFLAGS=$CFLAGS +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5 +$as_echo_n "checking whether $CC accepts -g... " >&6; } +if ${ac_cv_prog_cc_g+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_save_c_werror_flag=$ac_c_werror_flag + ac_c_werror_flag=yes + ac_cv_prog_cc_g=no + CFLAGS="-g" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_prog_cc_g=yes +else + CFLAGS="" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + +else + ac_c_werror_flag=$ac_save_c_werror_flag + CFLAGS="-g" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_prog_cc_g=yes +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + ac_c_werror_flag=$ac_save_c_werror_flag +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5 +$as_echo "$ac_cv_prog_cc_g" >&6; } +if test "$ac_test_CFLAGS" = set; then + CFLAGS=$ac_save_CFLAGS +elif test $ac_cv_prog_cc_g = yes; then + if test "$GCC" = yes; then + CFLAGS="-g -O2" + else + CFLAGS="-g" + fi +else + if test "$GCC" = yes; then + CFLAGS="-O2" + else + CFLAGS= + fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5 +$as_echo_n "checking for $CC option to accept ISO C89... " >&6; } +if ${ac_cv_prog_cc_c89+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_cv_prog_cc_c89=no +ac_save_CC=$CC +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +#include +struct stat; +/* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */ +struct buf { int x; }; +FILE * (*rcsopen) (struct buf *, struct stat *, int); +static char *e (p, i) + char **p; + int i; +{ + return p[i]; +} +static char *f (char * (*g) (char **, int), char **p, ...) +{ + char *s; + va_list v; + va_start (v,p); + s = g (p, va_arg (v,int)); + va_end (v); + return s; +} + +/* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has + function prototypes and stuff, but not '\xHH' hex character constants. + These don't provoke an error unfortunately, instead are silently treated + as 'x'. The following induces an error, until -std is added to get + proper ANSI mode. Curiously '\x00'!='x' always comes out true, for an + array size at least. It's necessary to write '\x00'==0 to get something + that's true only with -std. */ +int osf4_cc_array ['\x00' == 0 ? 1 : -1]; + +/* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters + inside strings and character constants. */ +#define FOO(x) 'x' +int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1]; + +int test (int i, double x); +struct s1 {int (*f) (int a);}; +struct s2 {int (*f) (double a);}; +int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int); +int argc; +char **argv; +int +main () +{ +return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]; + ; + return 0; +} +_ACEOF +for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \ + -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" +do + CC="$ac_save_CC $ac_arg" + if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_prog_cc_c89=$ac_arg +fi +rm -f core conftest.err conftest.$ac_objext + test "x$ac_cv_prog_cc_c89" != "xno" && break +done +rm -f conftest.$ac_ext +CC=$ac_save_CC + +fi +# AC_CACHE_VAL +case "x$ac_cv_prog_cc_c89" in + x) + { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 +$as_echo "none needed" >&6; } ;; + xno) + { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 +$as_echo "unsupported" >&6; } ;; + *) + CC="$CC $ac_cv_prog_cc_c89" + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5 +$as_echo "$ac_cv_prog_cc_c89" >&6; } ;; +esac +if test "x$ac_cv_prog_cc_c89" != xno; then : + +fi + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu +DEPDIR="${am__leading_dot}deps" + +ac_config_commands="$ac_config_commands depfiles" + + +am_make=${MAKE-make} +cat > confinc << 'END' +am__doit: + @echo this is the am__doit target +.PHONY: am__doit +END +# If we don't find an include directive, just comment out the code. +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for style of include used by $am_make" >&5 +$as_echo_n "checking for style of include used by $am_make... " >&6; } +am__include="#" +am__quote= +_am_result=none +# First try GNU make style include. +echo "include confinc" > confmf +# Ignore all kinds of additional output from `make'. +case `$am_make -s -f confmf 2> /dev/null` in #( +*the\ am__doit\ target*) + am__include=include + am__quote= + _am_result=GNU + ;; +esac +# Now try BSD make style include. +if test "$am__include" = "#"; then + echo '.include "confinc"' > confmf + case `$am_make -s -f confmf 2> /dev/null` in #( + *the\ am__doit\ target*) + am__include=.include + am__quote="\"" + _am_result=BSD + ;; + esac +fi + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $_am_result" >&5 +$as_echo "$_am_result" >&6; } +rm -f confinc confmf + +@%:@ Check whether --enable-dependency-tracking was given. +if test "${enable_dependency_tracking+set}" = set; then : + enableval=$enable_dependency_tracking; +fi + +if test "x$enable_dependency_tracking" != xno; then + am_depcomp="$ac_aux_dir/depcomp" + AMDEPBACKSLASH='\' + am__nodep='_no' +fi + if test "x$enable_dependency_tracking" != xno; then + AMDEP_TRUE= + AMDEP_FALSE='#' +else + AMDEP_TRUE='#' + AMDEP_FALSE= +fi + + + +depcc="$CC" am_compiler_list= + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5 +$as_echo_n "checking dependency style of $depcc... " >&6; } +if ${am_cv_CC_dependencies_compiler_type+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then + # We make a subdir and do the tests there. Otherwise we can end up + # making bogus files that we don't know about and never remove. For + # instance it was reported that on HP-UX the gcc test will end up + # making a dummy file named `D' -- because `-MD' means `put the output + # in D'. + rm -rf conftest.dir + mkdir conftest.dir + # Copy depcomp to subdir because otherwise we won't find it if we're + # using a relative directory. + cp "$am_depcomp" conftest.dir + cd conftest.dir + # We will build objects and dependencies in a subdirectory because + # it helps to detect inapplicable dependency modes. For instance + # both Tru64's cc and ICC support -MD to output dependencies as a + # side effect of compilation, but ICC will put the dependencies in + # the current directory while Tru64 will put them in the object + # directory. + mkdir sub + + am_cv_CC_dependencies_compiler_type=none + if test "$am_compiler_list" = ""; then + am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp` + fi + am__universal=false + case " $depcc " in #( + *\ -arch\ *\ -arch\ *) am__universal=true ;; + esac + + for depmode in $am_compiler_list; do + # Setup a source with many dependencies, because some compilers + # like to wrap large dependency lists on column 80 (with \), and + # we should not choose a depcomp mode which is confused by this. + # + # We need to recreate these files for each test, as the compiler may + # overwrite some of them when testing with obscure command lines. + # This happens at least with the AIX C compiler. + : > sub/conftest.c + for i in 1 2 3 4 5 6; do + echo '#include "conftst'$i'.h"' >> sub/conftest.c + # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with + # Solaris 8's {/usr,}/bin/sh. + touch sub/conftst$i.h + done + echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf + + # We check with `-c' and `-o' for the sake of the "dashmstdout" + # mode. It turns out that the SunPro C++ compiler does not properly + # handle `-M -o', and we need to detect this. Also, some Intel + # versions had trouble with output in subdirs + am__obj=sub/conftest.${OBJEXT-o} + am__minus_obj="-o $am__obj" + case $depmode in + gcc) + # This depmode causes a compiler race in universal mode. + test "$am__universal" = false || continue + ;; + nosideeffect) + # after this tag, mechanisms are not by side-effect, so they'll + # only be used when explicitly requested + if test "x$enable_dependency_tracking" = xyes; then + continue + else + break + fi + ;; + msvc7 | msvc7msys | msvisualcpp | msvcmsys) + # This compiler won't grok `-c -o', but also, the minuso test has + # not run yet. These depmodes are late enough in the game, and + # so weak that their functioning should not be impacted. + am__obj=conftest.${OBJEXT-o} + am__minus_obj= + ;; + none) break ;; + esac + if depmode=$depmode \ + source=sub/conftest.c object=$am__obj \ + depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ + $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ + >/dev/null 2>conftest.err && + grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && + grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && + grep $am__obj sub/conftest.Po > /dev/null 2>&1 && + ${MAKE-make} -s -f confmf > /dev/null 2>&1; then + # icc doesn't choke on unknown options, it will just issue warnings + # or remarks (even with -Werror). So we grep stderr for any message + # that says an option was ignored or not supported. + # When given -MP, icc 7.0 and 7.1 complain thusly: + # icc: Command line warning: ignoring option '-M'; no argument required + # The diagnosis changed in icc 8.0: + # icc: Command line remark: option '-MP' not supported + if (grep 'ignoring option' conftest.err || + grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else + am_cv_CC_dependencies_compiler_type=$depmode + break + fi + fi + done + + cd .. + rm -rf conftest.dir +else + am_cv_CC_dependencies_compiler_type=none +fi + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_CC_dependencies_compiler_type" >&5 +$as_echo "$am_cv_CC_dependencies_compiler_type" >&6; } +CCDEPMODE=depmode=$am_cv_CC_dependencies_compiler_type + + if + test "x$enable_dependency_tracking" != xno \ + && test "$am_cv_CC_dependencies_compiler_type" = gcc3; then + am__fastdepCC_TRUE= + am__fastdepCC_FALSE='#' +else + am__fastdepCC_TRUE='#' + am__fastdepCC_FALSE= +fi + + +if test "x$CC" != xcc; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC and cc understand -c and -o together" >&5 +$as_echo_n "checking whether $CC and cc understand -c and -o together... " >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether cc understands -c and -o together" >&5 +$as_echo_n "checking whether cc understands -c and -o together... " >&6; } +fi +set dummy $CC; ac_cc=`$as_echo "$2" | + sed 's/[^a-zA-Z0-9_]/_/g;s/^[0-9]/_/'` +if eval \${ac_cv_prog_cc_${ac_cc}_c_o+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +# Make sure it works both with $CC and with simple cc. +# We do the test twice because some compilers refuse to overwrite an +# existing .o file with -o, though they will create one. +ac_try='$CC -c conftest.$ac_ext -o conftest2.$ac_objext >&5' +rm -f conftest2.* +if { { case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && + test -f conftest2.$ac_objext && { { case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; +then + eval ac_cv_prog_cc_${ac_cc}_c_o=yes + if test "x$CC" != xcc; then + # Test first that cc exists at all. + if { ac_try='cc -c conftest.$ac_ext >&5' + { { case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; }; then + ac_try='cc -c conftest.$ac_ext -o conftest2.$ac_objext >&5' + rm -f conftest2.* + if { { case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && + test -f conftest2.$ac_objext && { { case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; + then + # cc works too. + : + else + # cc exists but doesn't like -o. + eval ac_cv_prog_cc_${ac_cc}_c_o=no + fi + fi + fi +else + eval ac_cv_prog_cc_${ac_cc}_c_o=no +fi +rm -f core conftest* + +fi +if eval test \$ac_cv_prog_cc_${ac_cc}_c_o = yes; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + +$as_echo "@%:@define NO_MINUS_C_MINUS_O 1" >>confdefs.h + +fi + +# FIXME: we rely on the cache variable name because +# there is no other way. +set dummy $CC +am_cc=`echo $2 | sed 's/[^a-zA-Z0-9_]/_/g;s/^[0-9]/_/'` +eval am_t=\$ac_cv_prog_cc_${am_cc}_c_o +if test "$am_t" != yes; then + # Losing compiler, so override with the script. + # FIXME: It is wrong to rewrite CC. + # But if we don't then we get into trouble of one sort or another. + # A longer-term fix would be to have automake use am__CC in this case, + # and then we could set am__CC="\$(top_srcdir)/compile \$(CC)" + CC="$am_aux_dir/compile $CC" +fi + + +ac_ext=cpp +ac_cpp='$CXXCPP $CPPFLAGS' +ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_cxx_compiler_gnu +if test -z "$CXX"; then + if test -n "$CCC"; then + CXX=$CCC + else + if test -n "$ac_tool_prefix"; then + for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC + do + # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. +set dummy $ac_tool_prefix$ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_CXX+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$CXX"; then + ac_cv_prog_CXX="$CXX" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_CXX="$ac_tool_prefix$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +CXX=$ac_cv_prog_CXX +if test -n "$CXX"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CXX" >&5 +$as_echo "$CXX" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$CXX" && break + done +fi +if test -z "$CXX"; then + ac_ct_CXX=$CXX + for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_CXX+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_CXX"; then + ac_cv_prog_ac_ct_CXX="$ac_ct_CXX" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_CXX="$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_CXX=$ac_cv_prog_ac_ct_CXX +if test -n "$ac_ct_CXX"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CXX" >&5 +$as_echo "$ac_ct_CXX" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$ac_ct_CXX" && break +done + + if test "x$ac_ct_CXX" = x; then + CXX="g++" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + CXX=$ac_ct_CXX + fi +fi + + fi +fi +# Provide some information about the compiler. +$as_echo "$as_me:${as_lineno-$LINENO}: checking for C++ compiler version" >&5 +set X $ac_compile +ac_compiler=$2 +for ac_option in --version -v -V -qversion; do + { { ac_try="$ac_compiler $ac_option >&5" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_compiler $ac_option >&5") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + sed '10a\ +... rest of stderr output deleted ... + 10q' conftest.err >conftest.er1 + cat conftest.er1 >&5 + fi + rm -f conftest.er1 conftest.err + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } +done + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C++ compiler" >&5 +$as_echo_n "checking whether we are using the GNU C++ compiler... " >&6; } +if ${ac_cv_cxx_compiler_gnu+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ +#ifndef __GNUC__ + choke me +#endif + + ; + return 0; +} +_ACEOF +if ac_fn_cxx_try_compile "$LINENO"; then : + ac_compiler_gnu=yes +else + ac_compiler_gnu=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +ac_cv_cxx_compiler_gnu=$ac_compiler_gnu + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_cxx_compiler_gnu" >&5 +$as_echo "$ac_cv_cxx_compiler_gnu" >&6; } +if test $ac_compiler_gnu = yes; then + GXX=yes +else + GXX= +fi +ac_test_CXXFLAGS=${CXXFLAGS+set} +ac_save_CXXFLAGS=$CXXFLAGS +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CXX accepts -g" >&5 +$as_echo_n "checking whether $CXX accepts -g... " >&6; } +if ${ac_cv_prog_cxx_g+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_save_cxx_werror_flag=$ac_cxx_werror_flag + ac_cxx_werror_flag=yes + ac_cv_prog_cxx_g=no + CXXFLAGS="-g" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_cxx_try_compile "$LINENO"; then : + ac_cv_prog_cxx_g=yes +else + CXXFLAGS="" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_cxx_try_compile "$LINENO"; then : + +else + ac_cxx_werror_flag=$ac_save_cxx_werror_flag + CXXFLAGS="-g" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_cxx_try_compile "$LINENO"; then : + ac_cv_prog_cxx_g=yes +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + ac_cxx_werror_flag=$ac_save_cxx_werror_flag +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cxx_g" >&5 +$as_echo "$ac_cv_prog_cxx_g" >&6; } +if test "$ac_test_CXXFLAGS" = set; then + CXXFLAGS=$ac_save_CXXFLAGS +elif test $ac_cv_prog_cxx_g = yes; then + if test "$GXX" = yes; then + CXXFLAGS="-g -O2" + else + CXXFLAGS="-g" + fi +else + if test "$GXX" = yes; then + CXXFLAGS="-O2" + else + CXXFLAGS= + fi +fi +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + +depcc="$CXX" am_compiler_list= + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5 +$as_echo_n "checking dependency style of $depcc... " >&6; } +if ${am_cv_CXX_dependencies_compiler_type+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then + # We make a subdir and do the tests there. Otherwise we can end up + # making bogus files that we don't know about and never remove. For + # instance it was reported that on HP-UX the gcc test will end up + # making a dummy file named `D' -- because `-MD' means `put the output + # in D'. + rm -rf conftest.dir + mkdir conftest.dir + # Copy depcomp to subdir because otherwise we won't find it if we're + # using a relative directory. + cp "$am_depcomp" conftest.dir + cd conftest.dir + # We will build objects and dependencies in a subdirectory because + # it helps to detect inapplicable dependency modes. For instance + # both Tru64's cc and ICC support -MD to output dependencies as a + # side effect of compilation, but ICC will put the dependencies in + # the current directory while Tru64 will put them in the object + # directory. + mkdir sub + + am_cv_CXX_dependencies_compiler_type=none + if test "$am_compiler_list" = ""; then + am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp` + fi + am__universal=false + case " $depcc " in #( + *\ -arch\ *\ -arch\ *) am__universal=true ;; + esac + + for depmode in $am_compiler_list; do + # Setup a source with many dependencies, because some compilers + # like to wrap large dependency lists on column 80 (with \), and + # we should not choose a depcomp mode which is confused by this. + # + # We need to recreate these files for each test, as the compiler may + # overwrite some of them when testing with obscure command lines. + # This happens at least with the AIX C compiler. + : > sub/conftest.c + for i in 1 2 3 4 5 6; do + echo '#include "conftst'$i'.h"' >> sub/conftest.c + # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with + # Solaris 8's {/usr,}/bin/sh. + touch sub/conftst$i.h + done + echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf + + # We check with `-c' and `-o' for the sake of the "dashmstdout" + # mode. It turns out that the SunPro C++ compiler does not properly + # handle `-M -o', and we need to detect this. Also, some Intel + # versions had trouble with output in subdirs + am__obj=sub/conftest.${OBJEXT-o} + am__minus_obj="-o $am__obj" + case $depmode in + gcc) + # This depmode causes a compiler race in universal mode. + test "$am__universal" = false || continue + ;; + nosideeffect) + # after this tag, mechanisms are not by side-effect, so they'll + # only be used when explicitly requested + if test "x$enable_dependency_tracking" = xyes; then + continue + else + break + fi + ;; + msvc7 | msvc7msys | msvisualcpp | msvcmsys) + # This compiler won't grok `-c -o', but also, the minuso test has + # not run yet. These depmodes are late enough in the game, and + # so weak that their functioning should not be impacted. + am__obj=conftest.${OBJEXT-o} + am__minus_obj= + ;; + none) break ;; + esac + if depmode=$depmode \ + source=sub/conftest.c object=$am__obj \ + depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ + $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ + >/dev/null 2>conftest.err && + grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && + grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && + grep $am__obj sub/conftest.Po > /dev/null 2>&1 && + ${MAKE-make} -s -f confmf > /dev/null 2>&1; then + # icc doesn't choke on unknown options, it will just issue warnings + # or remarks (even with -Werror). So we grep stderr for any message + # that says an option was ignored or not supported. + # When given -MP, icc 7.0 and 7.1 complain thusly: + # icc: Command line warning: ignoring option '-M'; no argument required + # The diagnosis changed in icc 8.0: + # icc: Command line remark: option '-MP' not supported + if (grep 'ignoring option' conftest.err || + grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else + am_cv_CXX_dependencies_compiler_type=$depmode + break + fi + fi + done + + cd .. + rm -rf conftest.dir +else + am_cv_CXX_dependencies_compiler_type=none +fi + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_CXX_dependencies_compiler_type" >&5 +$as_echo "$am_cv_CXX_dependencies_compiler_type" >&6; } +CXXDEPMODE=depmode=$am_cv_CXX_dependencies_compiler_type + + if + test "x$enable_dependency_tracking" != xno \ + && test "$am_cv_CXX_dependencies_compiler_type" = gcc3; then + am__fastdepCXX_TRUE= + am__fastdepCXX_FALSE='#' +else + am__fastdepCXX_TRUE='#' + am__fastdepCXX_FALSE= +fi + + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ln -s works" >&5 +$as_echo_n "checking whether ln -s works... " >&6; } +LN_S=$as_ln_s +if test "$LN_S" = "ln -s"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no, using $LN_S" >&5 +$as_echo "no, using $LN_S" >&6; } +fi + + +# AC_DISABLE_SHARED +case `pwd` in + *\ * | *\ *) + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Libtool does not cope well with whitespace in \`pwd\`" >&5 +$as_echo "$as_me: WARNING: Libtool does not cope well with whitespace in \`pwd\`" >&2;} ;; +esac + + + +macro_version='2.4.2' +macro_revision='1.3337' + + + + + + + + + + + + + +ltmain="$ac_aux_dir/ltmain.sh" + +# Make sure we can run config.sub. +$SHELL "$ac_aux_dir/config.sub" sun4 >/dev/null 2>&1 || + as_fn_error $? "cannot run $SHELL $ac_aux_dir/config.sub" "$LINENO" 5 + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking build system type" >&5 +$as_echo_n "checking build system type... " >&6; } +if ${ac_cv_build+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_build_alias=$build_alias +test "x$ac_build_alias" = x && + ac_build_alias=`$SHELL "$ac_aux_dir/config.guess"` +test "x$ac_build_alias" = x && + as_fn_error $? "cannot guess build type; you must specify one" "$LINENO" 5 +ac_cv_build=`$SHELL "$ac_aux_dir/config.sub" $ac_build_alias` || + as_fn_error $? "$SHELL $ac_aux_dir/config.sub $ac_build_alias failed" "$LINENO" 5 + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_build" >&5 +$as_echo "$ac_cv_build" >&6; } +case $ac_cv_build in +*-*-*) ;; +*) as_fn_error $? "invalid value of canonical build" "$LINENO" 5;; +esac +build=$ac_cv_build +ac_save_IFS=$IFS; IFS='-' +set x $ac_cv_build +shift +build_cpu=$1 +build_vendor=$2 +shift; shift +# Remember, the first character of IFS is used to create $*, +# except with old shells: +build_os=$* +IFS=$ac_save_IFS +case $build_os in *\ *) build_os=`echo "$build_os" | sed 's/ /-/g'`;; esac + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking host system type" >&5 +$as_echo_n "checking host system type... " >&6; } +if ${ac_cv_host+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test "x$host_alias" = x; then + ac_cv_host=$ac_cv_build +else + ac_cv_host=`$SHELL "$ac_aux_dir/config.sub" $host_alias` || + as_fn_error $? "$SHELL $ac_aux_dir/config.sub $host_alias failed" "$LINENO" 5 +fi + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_host" >&5 +$as_echo "$ac_cv_host" >&6; } +case $ac_cv_host in +*-*-*) ;; +*) as_fn_error $? "invalid value of canonical host" "$LINENO" 5;; +esac +host=$ac_cv_host +ac_save_IFS=$IFS; IFS='-' +set x $ac_cv_host +shift +host_cpu=$1 +host_vendor=$2 +shift; shift +# Remember, the first character of IFS is used to create $*, +# except with old shells: +host_os=$* +IFS=$ac_save_IFS +case $host_os in *\ *) host_os=`echo "$host_os" | sed 's/ /-/g'`;; esac + + +# Backslashify metacharacters that are still active within +# double-quoted strings. +sed_quote_subst='s/\(["`$\\]\)/\\\1/g' + +# Same as above, but do not quote variable references. +double_quote_subst='s/\(["`\\]\)/\\\1/g' + +# Sed substitution to delay expansion of an escaped shell variable in a +# double_quote_subst'ed string. +delay_variable_subst='s/\\\\\\\\\\\$/\\\\\\$/g' + +# Sed substitution to delay expansion of an escaped single quote. +delay_single_quote_subst='s/'\''/'\'\\\\\\\'\''/g' + +# Sed substitution to avoid accidental globbing in evaled expressions +no_glob_subst='s/\*/\\\*/g' + +ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' +ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO +ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO$ECHO + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to print strings" >&5 +$as_echo_n "checking how to print strings... " >&6; } +# Test print first, because it will be a builtin if present. +if test "X`( print -r -- -n ) 2>/dev/null`" = X-n && \ + test "X`print -r -- $ECHO 2>/dev/null`" = "X$ECHO"; then + ECHO='print -r --' +elif test "X`printf %s $ECHO 2>/dev/null`" = "X$ECHO"; then + ECHO='printf %s\n' +else + # Use this function as a fallback that always works. + func_fallback_echo () + { + eval 'cat <<_LTECHO_EOF +$1 +_LTECHO_EOF' + } + ECHO='func_fallback_echo' +fi + +# func_echo_all arg... +# Invoke $ECHO with all args, space-separated. +func_echo_all () +{ + $ECHO "" +} + +case "$ECHO" in + printf*) { $as_echo "$as_me:${as_lineno-$LINENO}: result: printf" >&5 +$as_echo "printf" >&6; } ;; + print*) { $as_echo "$as_me:${as_lineno-$LINENO}: result: print -r" >&5 +$as_echo "print -r" >&6; } ;; + *) { $as_echo "$as_me:${as_lineno-$LINENO}: result: cat" >&5 +$as_echo "cat" >&6; } ;; +esac + + + + + + + + + + + + + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a sed that does not truncate output" >&5 +$as_echo_n "checking for a sed that does not truncate output... " >&6; } +if ${ac_cv_path_SED+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_script=s/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb/ + for ac_i in 1 2 3 4 5 6 7; do + ac_script="$ac_script$as_nl$ac_script" + done + echo "$ac_script" 2>/dev/null | sed 99q >conftest.sed + { ac_script=; unset ac_script;} + if test -z "$SED"; then + ac_path_SED_found=false + # Loop through the user's path and test for each of PROGNAME-LIST + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_prog in sed gsed; do + for ac_exec_ext in '' $ac_executable_extensions; do + ac_path_SED="$as_dir/$ac_prog$ac_exec_ext" + as_fn_executable_p "$ac_path_SED" || continue +# Check for GNU ac_path_SED and select it if it is found. + # Check for GNU $ac_path_SED +case `"$ac_path_SED" --version 2>&1` in +*GNU*) + ac_cv_path_SED="$ac_path_SED" ac_path_SED_found=:;; +*) + ac_count=0 + $as_echo_n 0123456789 >"conftest.in" + while : + do + cat "conftest.in" "conftest.in" >"conftest.tmp" + mv "conftest.tmp" "conftest.in" + cp "conftest.in" "conftest.nl" + $as_echo '' >> "conftest.nl" + "$ac_path_SED" -f conftest.sed < "conftest.nl" >"conftest.out" 2>/dev/null || break + diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break + as_fn_arith $ac_count + 1 && ac_count=$as_val + if test $ac_count -gt ${ac_path_SED_max-0}; then + # Best one so far, save it but keep looking for a better one + ac_cv_path_SED="$ac_path_SED" + ac_path_SED_max=$ac_count + fi + # 10*(2^10) chars as input seems more than enough + test $ac_count -gt 10 && break + done + rm -f conftest.in conftest.tmp conftest.nl conftest.out;; +esac + + $ac_path_SED_found && break 3 + done + done + done +IFS=$as_save_IFS + if test -z "$ac_cv_path_SED"; then + as_fn_error $? "no acceptable sed could be found in \$PATH" "$LINENO" 5 + fi +else + ac_cv_path_SED=$SED +fi + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_SED" >&5 +$as_echo "$ac_cv_path_SED" >&6; } + SED="$ac_cv_path_SED" + rm -f conftest.sed + +test -z "$SED" && SED=sed +Xsed="$SED -e 1s/^X//" + + + + + + + + + + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for grep that handles long lines and -e" >&5 +$as_echo_n "checking for grep that handles long lines and -e... " >&6; } +if ${ac_cv_path_GREP+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -z "$GREP"; then + ac_path_GREP_found=false + # Loop through the user's path and test for each of PROGNAME-LIST + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_prog in grep ggrep; do + for ac_exec_ext in '' $ac_executable_extensions; do + ac_path_GREP="$as_dir/$ac_prog$ac_exec_ext" + as_fn_executable_p "$ac_path_GREP" || continue +# Check for GNU ac_path_GREP and select it if it is found. + # Check for GNU $ac_path_GREP +case `"$ac_path_GREP" --version 2>&1` in +*GNU*) + ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_found=:;; +*) + ac_count=0 + $as_echo_n 0123456789 >"conftest.in" + while : + do + cat "conftest.in" "conftest.in" >"conftest.tmp" + mv "conftest.tmp" "conftest.in" + cp "conftest.in" "conftest.nl" + $as_echo 'GREP' >> "conftest.nl" + "$ac_path_GREP" -e 'GREP$' -e '-(cannot match)-' < "conftest.nl" >"conftest.out" 2>/dev/null || break + diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break + as_fn_arith $ac_count + 1 && ac_count=$as_val + if test $ac_count -gt ${ac_path_GREP_max-0}; then + # Best one so far, save it but keep looking for a better one + ac_cv_path_GREP="$ac_path_GREP" + ac_path_GREP_max=$ac_count + fi + # 10*(2^10) chars as input seems more than enough + test $ac_count -gt 10 && break + done + rm -f conftest.in conftest.tmp conftest.nl conftest.out;; +esac + + $ac_path_GREP_found && break 3 + done + done + done +IFS=$as_save_IFS + if test -z "$ac_cv_path_GREP"; then + as_fn_error $? "no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 + fi +else + ac_cv_path_GREP=$GREP +fi + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_GREP" >&5 +$as_echo "$ac_cv_path_GREP" >&6; } + GREP="$ac_cv_path_GREP" + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for egrep" >&5 +$as_echo_n "checking for egrep... " >&6; } +if ${ac_cv_path_EGREP+:} false; then : + $as_echo_n "(cached) " >&6 +else + if echo a | $GREP -E '(a|b)' >/dev/null 2>&1 + then ac_cv_path_EGREP="$GREP -E" + else + if test -z "$EGREP"; then + ac_path_EGREP_found=false + # Loop through the user's path and test for each of PROGNAME-LIST + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_prog in egrep; do + for ac_exec_ext in '' $ac_executable_extensions; do + ac_path_EGREP="$as_dir/$ac_prog$ac_exec_ext" + as_fn_executable_p "$ac_path_EGREP" || continue +# Check for GNU ac_path_EGREP and select it if it is found. + # Check for GNU $ac_path_EGREP +case `"$ac_path_EGREP" --version 2>&1` in +*GNU*) + ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_found=:;; +*) + ac_count=0 + $as_echo_n 0123456789 >"conftest.in" + while : + do + cat "conftest.in" "conftest.in" >"conftest.tmp" + mv "conftest.tmp" "conftest.in" + cp "conftest.in" "conftest.nl" + $as_echo 'EGREP' >> "conftest.nl" + "$ac_path_EGREP" 'EGREP$' < "conftest.nl" >"conftest.out" 2>/dev/null || break + diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break + as_fn_arith $ac_count + 1 && ac_count=$as_val + if test $ac_count -gt ${ac_path_EGREP_max-0}; then + # Best one so far, save it but keep looking for a better one + ac_cv_path_EGREP="$ac_path_EGREP" + ac_path_EGREP_max=$ac_count + fi + # 10*(2^10) chars as input seems more than enough + test $ac_count -gt 10 && break + done + rm -f conftest.in conftest.tmp conftest.nl conftest.out;; +esac + + $ac_path_EGREP_found && break 3 + done + done + done +IFS=$as_save_IFS + if test -z "$ac_cv_path_EGREP"; then + as_fn_error $? "no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 + fi +else + ac_cv_path_EGREP=$EGREP +fi + + fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_EGREP" >&5 +$as_echo "$ac_cv_path_EGREP" >&6; } + EGREP="$ac_cv_path_EGREP" + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for fgrep" >&5 +$as_echo_n "checking for fgrep... " >&6; } +if ${ac_cv_path_FGREP+:} false; then : + $as_echo_n "(cached) " >&6 +else + if echo 'ab*c' | $GREP -F 'ab*c' >/dev/null 2>&1 + then ac_cv_path_FGREP="$GREP -F" + else + if test -z "$FGREP"; then + ac_path_FGREP_found=false + # Loop through the user's path and test for each of PROGNAME-LIST + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_prog in fgrep; do + for ac_exec_ext in '' $ac_executable_extensions; do + ac_path_FGREP="$as_dir/$ac_prog$ac_exec_ext" + as_fn_executable_p "$ac_path_FGREP" || continue +# Check for GNU ac_path_FGREP and select it if it is found. + # Check for GNU $ac_path_FGREP +case `"$ac_path_FGREP" --version 2>&1` in +*GNU*) + ac_cv_path_FGREP="$ac_path_FGREP" ac_path_FGREP_found=:;; +*) + ac_count=0 + $as_echo_n 0123456789 >"conftest.in" + while : + do + cat "conftest.in" "conftest.in" >"conftest.tmp" + mv "conftest.tmp" "conftest.in" + cp "conftest.in" "conftest.nl" + $as_echo 'FGREP' >> "conftest.nl" + "$ac_path_FGREP" FGREP < "conftest.nl" >"conftest.out" 2>/dev/null || break + diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break + as_fn_arith $ac_count + 1 && ac_count=$as_val + if test $ac_count -gt ${ac_path_FGREP_max-0}; then + # Best one so far, save it but keep looking for a better one + ac_cv_path_FGREP="$ac_path_FGREP" + ac_path_FGREP_max=$ac_count + fi + # 10*(2^10) chars as input seems more than enough + test $ac_count -gt 10 && break + done + rm -f conftest.in conftest.tmp conftest.nl conftest.out;; +esac + + $ac_path_FGREP_found && break 3 + done + done + done +IFS=$as_save_IFS + if test -z "$ac_cv_path_FGREP"; then + as_fn_error $? "no acceptable fgrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 + fi +else + ac_cv_path_FGREP=$FGREP +fi + + fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_FGREP" >&5 +$as_echo "$ac_cv_path_FGREP" >&6; } + FGREP="$ac_cv_path_FGREP" + + +test -z "$GREP" && GREP=grep + + + + + + + + + + + + + + + + + + + +@%:@ Check whether --with-gnu-ld was given. +if test "${with_gnu_ld+set}" = set; then : + withval=$with_gnu_ld; test "$withval" = no || with_gnu_ld=yes +else + with_gnu_ld=no +fi + +ac_prog=ld +if test "$GCC" = yes; then + # Check if gcc -print-prog-name=ld gives a path. + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ld used by $CC" >&5 +$as_echo_n "checking for ld used by $CC... " >&6; } + case $host in + *-*-mingw*) + # gcc leaves a trailing carriage return which upsets mingw + ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;; + *) + ac_prog=`($CC -print-prog-name=ld) 2>&5` ;; + esac + case $ac_prog in + # Accept absolute paths. + [\\/]* | ?:[\\/]*) + re_direlt='/[^/][^/]*/\.\./' + # Canonicalize the pathname of ld + ac_prog=`$ECHO "$ac_prog"| $SED 's%\\\\%/%g'` + while $ECHO "$ac_prog" | $GREP "$re_direlt" > /dev/null 2>&1; do + ac_prog=`$ECHO $ac_prog| $SED "s%$re_direlt%/%"` + done + test -z "$LD" && LD="$ac_prog" + ;; + "") + # If it fails, then pretend we aren't using GCC. + ac_prog=ld + ;; + *) + # If it is relative, then search for the first ld in PATH. + with_gnu_ld=unknown + ;; + esac +elif test "$with_gnu_ld" = yes; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU ld" >&5 +$as_echo_n "checking for GNU ld... " >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for non-GNU ld" >&5 +$as_echo_n "checking for non-GNU ld... " >&6; } +fi +if ${lt_cv_path_LD+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -z "$LD"; then + lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR + for ac_dir in $PATH; do + IFS="$lt_save_ifs" + test -z "$ac_dir" && ac_dir=. + if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then + lt_cv_path_LD="$ac_dir/$ac_prog" + # Check to see if the program is GNU ld. I'd rather use --version, + # but apparently some variants of GNU ld only accept -v. + # Break only if it was the GNU/non-GNU ld that we prefer. + case `"$lt_cv_path_LD" -v 2>&1 &5 +$as_echo "$LD" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi +test -z "$LD" && as_fn_error $? "no acceptable ld found in \$PATH" "$LINENO" 5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if the linker ($LD) is GNU ld" >&5 +$as_echo_n "checking if the linker ($LD) is GNU ld... " >&6; } +if ${lt_cv_prog_gnu_ld+:} false; then : + $as_echo_n "(cached) " >&6 +else + # I'd rather use --version here, but apparently some GNU lds only accept -v. +case `$LD -v 2>&1 &5 +$as_echo "$lt_cv_prog_gnu_ld" >&6; } +with_gnu_ld=$lt_cv_prog_gnu_ld + + + + + + + + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for BSD- or MS-compatible name lister (nm)" >&5 +$as_echo_n "checking for BSD- or MS-compatible name lister (nm)... " >&6; } +if ${lt_cv_path_NM+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$NM"; then + # Let the user override the test. + lt_cv_path_NM="$NM" +else + lt_nm_to_check="${ac_tool_prefix}nm" + if test -n "$ac_tool_prefix" && test "$build" = "$host"; then + lt_nm_to_check="$lt_nm_to_check nm" + fi + for lt_tmp_nm in $lt_nm_to_check; do + lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR + for ac_dir in $PATH /usr/ccs/bin/elf /usr/ccs/bin /usr/ucb /bin; do + IFS="$lt_save_ifs" + test -z "$ac_dir" && ac_dir=. + tmp_nm="$ac_dir/$lt_tmp_nm" + if test -f "$tmp_nm" || test -f "$tmp_nm$ac_exeext" ; then + # Check to see if the nm accepts a BSD-compat flag. + # Adding the `sed 1q' prevents false positives on HP-UX, which says: + # nm: unknown option "B" ignored + # Tru64's nm complains that /dev/null is an invalid object file + case `"$tmp_nm" -B /dev/null 2>&1 | sed '1q'` in + */dev/null* | *'Invalid file or object type'*) + lt_cv_path_NM="$tmp_nm -B" + break + ;; + *) + case `"$tmp_nm" -p /dev/null 2>&1 | sed '1q'` in + */dev/null*) + lt_cv_path_NM="$tmp_nm -p" + break + ;; + *) + lt_cv_path_NM=${lt_cv_path_NM="$tmp_nm"} # keep the first match, but + continue # so that we can try to find one that supports BSD flags + ;; + esac + ;; + esac + fi + done + IFS="$lt_save_ifs" + done + : ${lt_cv_path_NM=no} +fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_path_NM" >&5 +$as_echo "$lt_cv_path_NM" >&6; } +if test "$lt_cv_path_NM" != "no"; then + NM="$lt_cv_path_NM" +else + # Didn't find any BSD compatible name lister, look for dumpbin. + if test -n "$DUMPBIN"; then : + # Let the user override the test. + else + if test -n "$ac_tool_prefix"; then + for ac_prog in dumpbin "link -dump" + do + # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. +set dummy $ac_tool_prefix$ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_DUMPBIN+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$DUMPBIN"; then + ac_cv_prog_DUMPBIN="$DUMPBIN" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_DUMPBIN="$ac_tool_prefix$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +DUMPBIN=$ac_cv_prog_DUMPBIN +if test -n "$DUMPBIN"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DUMPBIN" >&5 +$as_echo "$DUMPBIN" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$DUMPBIN" && break + done +fi +if test -z "$DUMPBIN"; then + ac_ct_DUMPBIN=$DUMPBIN + for ac_prog in dumpbin "link -dump" +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_DUMPBIN+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_DUMPBIN"; then + ac_cv_prog_ac_ct_DUMPBIN="$ac_ct_DUMPBIN" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_DUMPBIN="$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_DUMPBIN=$ac_cv_prog_ac_ct_DUMPBIN +if test -n "$ac_ct_DUMPBIN"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DUMPBIN" >&5 +$as_echo "$ac_ct_DUMPBIN" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$ac_ct_DUMPBIN" && break +done + + if test "x$ac_ct_DUMPBIN" = x; then + DUMPBIN=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + DUMPBIN=$ac_ct_DUMPBIN + fi +fi + + case `$DUMPBIN -symbols /dev/null 2>&1 | sed '1q'` in + *COFF*) + DUMPBIN="$DUMPBIN -symbols" + ;; + *) + DUMPBIN=: + ;; + esac + fi + + if test "$DUMPBIN" != ":"; then + NM="$DUMPBIN" + fi +fi +test -z "$NM" && NM=nm + + + + + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking the name lister ($NM) interface" >&5 +$as_echo_n "checking the name lister ($NM) interface... " >&6; } +if ${lt_cv_nm_interface+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_nm_interface="BSD nm" + echo "int some_variable = 0;" > conftest.$ac_ext + (eval echo "\"\$as_me:$LINENO: $ac_compile\"" >&5) + (eval "$ac_compile" 2>conftest.err) + cat conftest.err >&5 + (eval echo "\"\$as_me:$LINENO: $NM \\\"conftest.$ac_objext\\\"\"" >&5) + (eval "$NM \"conftest.$ac_objext\"" 2>conftest.err > conftest.out) + cat conftest.err >&5 + (eval echo "\"\$as_me:$LINENO: output\"" >&5) + cat conftest.out >&5 + if $GREP 'External.*some_variable' conftest.out > /dev/null; then + lt_cv_nm_interface="MS dumpbin" + fi + rm -f conftest* +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_nm_interface" >&5 +$as_echo "$lt_cv_nm_interface" >&6; } + +# find the maximum length of command line arguments +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking the maximum length of command line arguments" >&5 +$as_echo_n "checking the maximum length of command line arguments... " >&6; } +if ${lt_cv_sys_max_cmd_len+:} false; then : + $as_echo_n "(cached) " >&6 +else + i=0 + teststring="ABCD" + + case $build_os in + msdosdjgpp*) + # On DJGPP, this test can blow up pretty badly due to problems in libc + # (any single argument exceeding 2000 bytes causes a buffer overrun + # during glob expansion). Even if it were fixed, the result of this + # check would be larger than it should be. + lt_cv_sys_max_cmd_len=12288; # 12K is about right + ;; + + gnu*) + # Under GNU Hurd, this test is not required because there is + # no limit to the length of command line arguments. + # Libtool will interpret -1 as no limit whatsoever + lt_cv_sys_max_cmd_len=-1; + ;; + + cygwin* | mingw* | cegcc*) + # On Win9x/ME, this test blows up -- it succeeds, but takes + # about 5 minutes as the teststring grows exponentially. + # Worse, since 9x/ME are not pre-emptively multitasking, + # you end up with a "frozen" computer, even though with patience + # the test eventually succeeds (with a max line length of 256k). + # Instead, let's just punt: use the minimum linelength reported by + # all of the supported platforms: 8192 (on NT/2K/XP). + lt_cv_sys_max_cmd_len=8192; + ;; + + mint*) + # On MiNT this can take a long time and run out of memory. + lt_cv_sys_max_cmd_len=8192; + ;; + + amigaos*) + # On AmigaOS with pdksh, this test takes hours, literally. + # So we just punt and use a minimum line length of 8192. + lt_cv_sys_max_cmd_len=8192; + ;; + + netbsd* | freebsd* | openbsd* | darwin* | dragonfly*) + # This has been around since 386BSD, at least. Likely further. + if test -x /sbin/sysctl; then + lt_cv_sys_max_cmd_len=`/sbin/sysctl -n kern.argmax` + elif test -x /usr/sbin/sysctl; then + lt_cv_sys_max_cmd_len=`/usr/sbin/sysctl -n kern.argmax` + else + lt_cv_sys_max_cmd_len=65536 # usable default for all BSDs + fi + # And add a safety zone + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` + ;; + + interix*) + # We know the value 262144 and hardcode it with a safety zone (like BSD) + lt_cv_sys_max_cmd_len=196608 + ;; + + os2*) + # The test takes a long time on OS/2. + lt_cv_sys_max_cmd_len=8192 + ;; + + osf*) + # Dr. Hans Ekkehard Plesser reports seeing a kernel panic running configure + # due to this test when exec_disable_arg_limit is 1 on Tru64. It is not + # nice to cause kernel panics so lets avoid the loop below. + # First set a reasonable default. + lt_cv_sys_max_cmd_len=16384 + # + if test -x /sbin/sysconfig; then + case `/sbin/sysconfig -q proc exec_disable_arg_limit` in + *1*) lt_cv_sys_max_cmd_len=-1 ;; + esac + fi + ;; + sco3.2v5*) + lt_cv_sys_max_cmd_len=102400 + ;; + sysv5* | sco5v6* | sysv4.2uw2*) + kargmax=`grep ARG_MAX /etc/conf/cf.d/stune 2>/dev/null` + if test -n "$kargmax"; then + lt_cv_sys_max_cmd_len=`echo $kargmax | sed 's/.*[ ]//'` + else + lt_cv_sys_max_cmd_len=32768 + fi + ;; + *) + lt_cv_sys_max_cmd_len=`(getconf ARG_MAX) 2> /dev/null` + if test -n "$lt_cv_sys_max_cmd_len"; then + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` + else + # Make teststring a little bigger before we do anything with it. + # a 1K string should be a reasonable start. + for i in 1 2 3 4 5 6 7 8 ; do + teststring=$teststring$teststring + done + SHELL=${SHELL-${CONFIG_SHELL-/bin/sh}} + # If test is not a shell built-in, we'll probably end up computing a + # maximum length that is only half of the actual maximum length, but + # we can't tell. + while { test "X"`env echo "$teststring$teststring" 2>/dev/null` \ + = "X$teststring$teststring"; } >/dev/null 2>&1 && + test $i != 17 # 1/2 MB should be enough + do + i=`expr $i + 1` + teststring=$teststring$teststring + done + # Only check the string length outside the loop. + lt_cv_sys_max_cmd_len=`expr "X$teststring" : ".*" 2>&1` + teststring= + # Add a significant safety factor because C++ compilers can tack on + # massive amounts of additional arguments before passing them to the + # linker. It appears as though 1/2 is a usable value. + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 2` + fi + ;; + esac + +fi + +if test -n $lt_cv_sys_max_cmd_len ; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_sys_max_cmd_len" >&5 +$as_echo "$lt_cv_sys_max_cmd_len" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: none" >&5 +$as_echo "none" >&6; } +fi +max_cmd_len=$lt_cv_sys_max_cmd_len + + + + + + +: ${CP="cp -f"} +: ${MV="mv -f"} +: ${RM="rm -f"} + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the shell understands some XSI constructs" >&5 +$as_echo_n "checking whether the shell understands some XSI constructs... " >&6; } +# Try some XSI features +xsi_shell=no +( _lt_dummy="a/b/c" + test "${_lt_dummy##*/},${_lt_dummy%/*},${_lt_dummy#??}"${_lt_dummy%"$_lt_dummy"}, \ + = c,a/b,b/c, \ + && eval 'test $(( 1 + 1 )) -eq 2 \ + && test "${#_lt_dummy}" -eq 5' ) >/dev/null 2>&1 \ + && xsi_shell=yes +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $xsi_shell" >&5 +$as_echo "$xsi_shell" >&6; } + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the shell understands \"+=\"" >&5 +$as_echo_n "checking whether the shell understands \"+=\"... " >&6; } +lt_shell_append=no +( foo=bar; set foo baz; eval "$1+=\$2" && test "$foo" = barbaz ) \ + >/dev/null 2>&1 \ + && lt_shell_append=yes +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_shell_append" >&5 +$as_echo "$lt_shell_append" >&6; } + + +if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then + lt_unset=unset +else + lt_unset=false +fi + + + + + +# test EBCDIC or ASCII +case `echo X|tr X '\101'` in + A) # ASCII based system + # \n is not interpreted correctly by Solaris 8 /usr/ucb/tr + lt_SP2NL='tr \040 \012' + lt_NL2SP='tr \015\012 \040\040' + ;; + *) # EBCDIC based system + lt_SP2NL='tr \100 \n' + lt_NL2SP='tr \r\n \100\100' + ;; +esac + + + + + + + + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to convert $build file names to $host format" >&5 +$as_echo_n "checking how to convert $build file names to $host format... " >&6; } +if ${lt_cv_to_host_file_cmd+:} false; then : + $as_echo_n "(cached) " >&6 +else + case $host in + *-*-mingw* ) + case $build in + *-*-mingw* ) # actually msys + lt_cv_to_host_file_cmd=func_convert_file_msys_to_w32 + ;; + *-*-cygwin* ) + lt_cv_to_host_file_cmd=func_convert_file_cygwin_to_w32 + ;; + * ) # otherwise, assume *nix + lt_cv_to_host_file_cmd=func_convert_file_nix_to_w32 + ;; + esac + ;; + *-*-cygwin* ) + case $build in + *-*-mingw* ) # actually msys + lt_cv_to_host_file_cmd=func_convert_file_msys_to_cygwin + ;; + *-*-cygwin* ) + lt_cv_to_host_file_cmd=func_convert_file_noop + ;; + * ) # otherwise, assume *nix + lt_cv_to_host_file_cmd=func_convert_file_nix_to_cygwin + ;; + esac + ;; + * ) # unhandled hosts (and "normal" native builds) + lt_cv_to_host_file_cmd=func_convert_file_noop + ;; +esac + +fi + +to_host_file_cmd=$lt_cv_to_host_file_cmd +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_to_host_file_cmd" >&5 +$as_echo "$lt_cv_to_host_file_cmd" >&6; } + + + + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to convert $build file names to toolchain format" >&5 +$as_echo_n "checking how to convert $build file names to toolchain format... " >&6; } +if ${lt_cv_to_tool_file_cmd+:} false; then : + $as_echo_n "(cached) " >&6 +else + #assume ordinary cross tools, or native build. +lt_cv_to_tool_file_cmd=func_convert_file_noop +case $host in + *-*-mingw* ) + case $build in + *-*-mingw* ) # actually msys + lt_cv_to_tool_file_cmd=func_convert_file_msys_to_w32 + ;; + esac + ;; +esac + +fi + +to_tool_file_cmd=$lt_cv_to_tool_file_cmd +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_to_tool_file_cmd" >&5 +$as_echo "$lt_cv_to_tool_file_cmd" >&6; } + + + + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $LD option to reload object files" >&5 +$as_echo_n "checking for $LD option to reload object files... " >&6; } +if ${lt_cv_ld_reload_flag+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_ld_reload_flag='-r' +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_reload_flag" >&5 +$as_echo "$lt_cv_ld_reload_flag" >&6; } +reload_flag=$lt_cv_ld_reload_flag +case $reload_flag in +"" | " "*) ;; +*) reload_flag=" $reload_flag" ;; +esac +reload_cmds='$LD$reload_flag -o $output$reload_objs' +case $host_os in + cygwin* | mingw* | pw32* | cegcc*) + if test "$GCC" != yes; then + reload_cmds=false + fi + ;; + darwin*) + if test "$GCC" = yes; then + reload_cmds='$LTCC $LTCFLAGS -nostdlib ${wl}-r -o $output$reload_objs' + else + reload_cmds='$LD$reload_flag -o $output$reload_objs' + fi + ;; +esac + + + + + + + + + +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}objdump", so it can be a program name with args. +set dummy ${ac_tool_prefix}objdump; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_OBJDUMP+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$OBJDUMP"; then + ac_cv_prog_OBJDUMP="$OBJDUMP" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_OBJDUMP="${ac_tool_prefix}objdump" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +OBJDUMP=$ac_cv_prog_OBJDUMP +if test -n "$OBJDUMP"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OBJDUMP" >&5 +$as_echo "$OBJDUMP" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_OBJDUMP"; then + ac_ct_OBJDUMP=$OBJDUMP + # Extract the first word of "objdump", so it can be a program name with args. +set dummy objdump; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_OBJDUMP+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_OBJDUMP"; then + ac_cv_prog_ac_ct_OBJDUMP="$ac_ct_OBJDUMP" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_OBJDUMP="objdump" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_OBJDUMP=$ac_cv_prog_ac_ct_OBJDUMP +if test -n "$ac_ct_OBJDUMP"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OBJDUMP" >&5 +$as_echo "$ac_ct_OBJDUMP" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_OBJDUMP" = x; then + OBJDUMP="false" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + OBJDUMP=$ac_ct_OBJDUMP + fi +else + OBJDUMP="$ac_cv_prog_OBJDUMP" +fi + +test -z "$OBJDUMP" && OBJDUMP=objdump + + + + + + + + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to recognize dependent libraries" >&5 +$as_echo_n "checking how to recognize dependent libraries... " >&6; } +if ${lt_cv_deplibs_check_method+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_file_magic_cmd='$MAGIC_CMD' +lt_cv_file_magic_test_file= +lt_cv_deplibs_check_method='unknown' +# Need to set the preceding variable on all platforms that support +# interlibrary dependencies. +# 'none' -- dependencies not supported. +# `unknown' -- same as none, but documents that we really don't know. +# 'pass_all' -- all dependencies passed with no checks. +# 'test_compile' -- check by making test program. +# 'file_magic [[regex]]' -- check by looking for files in library path +# which responds to the $file_magic_cmd with a given extended regex. +# If you have `file' or equivalent on your system and you're not sure +# whether `pass_all' will *always* work, you probably want this one. + +case $host_os in +aix[4-9]*) + lt_cv_deplibs_check_method=pass_all + ;; + +beos*) + lt_cv_deplibs_check_method=pass_all + ;; + +bsdi[45]*) + lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (shared object|dynamic lib)' + lt_cv_file_magic_cmd='/usr/bin/file -L' + lt_cv_file_magic_test_file=/shlib/libc.so + ;; + +cygwin*) + # func_win32_libid is a shell function defined in ltmain.sh + lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL' + lt_cv_file_magic_cmd='func_win32_libid' + ;; + +mingw* | pw32*) + # Base MSYS/MinGW do not provide the 'file' command needed by + # func_win32_libid shell function, so use a weaker test based on 'objdump', + # unless we find 'file', for example because we are cross-compiling. + # func_win32_libid assumes BSD nm, so disallow it if using MS dumpbin. + if ( test "$lt_cv_nm_interface" = "BSD nm" && file / ) >/dev/null 2>&1; then + lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL' + lt_cv_file_magic_cmd='func_win32_libid' + else + # Keep this pattern in sync with the one in func_win32_libid. + lt_cv_deplibs_check_method='file_magic file format (pei*-i386(.*architecture: i386)?|pe-arm-wince|pe-x86-64)' + lt_cv_file_magic_cmd='$OBJDUMP -f' + fi + ;; + +cegcc*) + # use the weaker test based on 'objdump'. See mingw*. + lt_cv_deplibs_check_method='file_magic file format pe-arm-.*little(.*architecture: arm)?' + lt_cv_file_magic_cmd='$OBJDUMP -f' + ;; + +darwin* | rhapsody*) + lt_cv_deplibs_check_method=pass_all + ;; + +freebsd* | dragonfly*) + if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then + case $host_cpu in + i*86 ) + # Not sure whether the presence of OpenBSD here was a mistake. + # Let's accept both of them until this is cleared up. + lt_cv_deplibs_check_method='file_magic (FreeBSD|OpenBSD|DragonFly)/i[3-9]86 (compact )?demand paged shared library' + lt_cv_file_magic_cmd=/usr/bin/file + lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*` + ;; + esac + else + lt_cv_deplibs_check_method=pass_all + fi + ;; + +gnu*) + lt_cv_deplibs_check_method=pass_all + ;; + +haiku*) + lt_cv_deplibs_check_method=pass_all + ;; + +hpux10.20* | hpux11*) + lt_cv_file_magic_cmd=/usr/bin/file + case $host_cpu in + ia64*) + lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF-[0-9][0-9]) shared object file - IA64' + lt_cv_file_magic_test_file=/usr/lib/hpux32/libc.so + ;; + hppa*64*) + lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF[ -][0-9][0-9])(-bit)?( [LM]SB)? shared object( file)?[, -]* PA-RISC [0-9]\.[0-9]' + lt_cv_file_magic_test_file=/usr/lib/pa20_64/libc.sl + ;; + *) + lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|PA-RISC[0-9]\.[0-9]) shared library' + lt_cv_file_magic_test_file=/usr/lib/libc.sl + ;; + esac + ;; + +interix[3-9]*) + # PIC code is broken on Interix 3.x, that's why |\.a not |_pic\.a here + lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so|\.a)$' + ;; + +irix5* | irix6* | nonstopux*) + case $LD in + *-32|*"-32 ") libmagic=32-bit;; + *-n32|*"-n32 ") libmagic=N32;; + *-64|*"-64 ") libmagic=64-bit;; + *) libmagic=never-match;; + esac + lt_cv_deplibs_check_method=pass_all + ;; + +# This must be glibc/ELF. +linux* | k*bsd*-gnu | kopensolaris*-gnu) + lt_cv_deplibs_check_method=pass_all + ;; + +netbsd* | netbsdelf*-gnu) + if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then + lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|_pic\.a)$' + else + lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so|_pic\.a)$' + fi + ;; + +newos6*) + lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (executable|dynamic lib)' + lt_cv_file_magic_cmd=/usr/bin/file + lt_cv_file_magic_test_file=/usr/lib/libnls.so + ;; + +*nto* | *qnx*) + lt_cv_deplibs_check_method=pass_all + ;; + +openbsd*) + if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then + lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|\.so|_pic\.a)$' + else + lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|_pic\.a)$' + fi + ;; + +osf3* | osf4* | osf5*) + lt_cv_deplibs_check_method=pass_all + ;; + +rdos*) + lt_cv_deplibs_check_method=pass_all + ;; + +solaris*) + lt_cv_deplibs_check_method=pass_all + ;; + +sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) + lt_cv_deplibs_check_method=pass_all + ;; + +sysv4 | sysv4.3*) + case $host_vendor in + motorola) + lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (shared object|dynamic lib) M[0-9][0-9]* Version [0-9]' + lt_cv_file_magic_test_file=`echo /usr/lib/libc.so*` + ;; + ncr) + lt_cv_deplibs_check_method=pass_all + ;; + sequent) + lt_cv_file_magic_cmd='/bin/file' + lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [LM]SB (shared object|dynamic lib )' + ;; + sni) + lt_cv_file_magic_cmd='/bin/file' + lt_cv_deplibs_check_method="file_magic ELF [0-9][0-9]*-bit [LM]SB dynamic lib" + lt_cv_file_magic_test_file=/lib/libc.so + ;; + siemens) + lt_cv_deplibs_check_method=pass_all + ;; + pc) + lt_cv_deplibs_check_method=pass_all + ;; + esac + ;; + +tpf*) + lt_cv_deplibs_check_method=pass_all + ;; +esac + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_deplibs_check_method" >&5 +$as_echo "$lt_cv_deplibs_check_method" >&6; } + +file_magic_glob= +want_nocaseglob=no +if test "$build" = "$host"; then + case $host_os in + mingw* | pw32*) + if ( shopt | grep nocaseglob ) >/dev/null 2>&1; then + want_nocaseglob=yes + else + file_magic_glob=`echo aAbBcCdDeEfFgGhHiIjJkKlLmMnNoOpPqQrRsStTuUvVwWxXyYzZ | $SED -e "s/\(..\)/s\/[\1]\/[\1]\/g;/g"` + fi + ;; + esac +fi + +file_magic_cmd=$lt_cv_file_magic_cmd +deplibs_check_method=$lt_cv_deplibs_check_method +test -z "$deplibs_check_method" && deplibs_check_method=unknown + + + + + + + + + + + + + + + + + + + + + + +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}dlltool", so it can be a program name with args. +set dummy ${ac_tool_prefix}dlltool; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_DLLTOOL+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$DLLTOOL"; then + ac_cv_prog_DLLTOOL="$DLLTOOL" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_DLLTOOL="${ac_tool_prefix}dlltool" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +DLLTOOL=$ac_cv_prog_DLLTOOL +if test -n "$DLLTOOL"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DLLTOOL" >&5 +$as_echo "$DLLTOOL" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_DLLTOOL"; then + ac_ct_DLLTOOL=$DLLTOOL + # Extract the first word of "dlltool", so it can be a program name with args. +set dummy dlltool; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_DLLTOOL+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_DLLTOOL"; then + ac_cv_prog_ac_ct_DLLTOOL="$ac_ct_DLLTOOL" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_DLLTOOL="dlltool" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_DLLTOOL=$ac_cv_prog_ac_ct_DLLTOOL +if test -n "$ac_ct_DLLTOOL"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DLLTOOL" >&5 +$as_echo "$ac_ct_DLLTOOL" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_DLLTOOL" = x; then + DLLTOOL="false" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + DLLTOOL=$ac_ct_DLLTOOL + fi +else + DLLTOOL="$ac_cv_prog_DLLTOOL" +fi + +test -z "$DLLTOOL" && DLLTOOL=dlltool + + + + + + + + + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to associate runtime and link libraries" >&5 +$as_echo_n "checking how to associate runtime and link libraries... " >&6; } +if ${lt_cv_sharedlib_from_linklib_cmd+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_sharedlib_from_linklib_cmd='unknown' + +case $host_os in +cygwin* | mingw* | pw32* | cegcc*) + # two different shell functions defined in ltmain.sh + # decide which to use based on capabilities of $DLLTOOL + case `$DLLTOOL --help 2>&1` in + *--identify-strict*) + lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib + ;; + *) + lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib_fallback + ;; + esac + ;; +*) + # fallback: assume linklib IS sharedlib + lt_cv_sharedlib_from_linklib_cmd="$ECHO" + ;; +esac + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_sharedlib_from_linklib_cmd" >&5 +$as_echo "$lt_cv_sharedlib_from_linklib_cmd" >&6; } +sharedlib_from_linklib_cmd=$lt_cv_sharedlib_from_linklib_cmd +test -z "$sharedlib_from_linklib_cmd" && sharedlib_from_linklib_cmd=$ECHO + + + + + + + + +if test -n "$ac_tool_prefix"; then + for ac_prog in ar + do + # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. +set dummy $ac_tool_prefix$ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_AR+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$AR"; then + ac_cv_prog_AR="$AR" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_AR="$ac_tool_prefix$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +AR=$ac_cv_prog_AR +if test -n "$AR"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AR" >&5 +$as_echo "$AR" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$AR" && break + done +fi +if test -z "$AR"; then + ac_ct_AR=$AR + for ac_prog in ar +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_AR+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_AR"; then + ac_cv_prog_ac_ct_AR="$ac_ct_AR" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_AR="$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_AR=$ac_cv_prog_ac_ct_AR +if test -n "$ac_ct_AR"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_AR" >&5 +$as_echo "$ac_ct_AR" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$ac_ct_AR" && break +done + + if test "x$ac_ct_AR" = x; then + AR="false" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + AR=$ac_ct_AR + fi +fi + +: ${AR=ar} +: ${AR_FLAGS=cru} + + + + + + + + + + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for archiver @FILE support" >&5 +$as_echo_n "checking for archiver @FILE support... " >&6; } +if ${lt_cv_ar_at_file+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_ar_at_file=no + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + echo conftest.$ac_objext > conftest.lst + lt_ar_try='$AR $AR_FLAGS libconftest.a @conftest.lst >&5' + { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$lt_ar_try\""; } >&5 + (eval $lt_ar_try) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + if test "$ac_status" -eq 0; then + # Ensure the archiver fails upon bogus file names. + rm -f conftest.$ac_objext libconftest.a + { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$lt_ar_try\""; } >&5 + (eval $lt_ar_try) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + if test "$ac_status" -ne 0; then + lt_cv_ar_at_file=@ + fi + fi + rm -f conftest.* libconftest.a + +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ar_at_file" >&5 +$as_echo "$lt_cv_ar_at_file" >&6; } + +if test "x$lt_cv_ar_at_file" = xno; then + archiver_list_spec= +else + archiver_list_spec=$lt_cv_ar_at_file +fi + + + + + + + +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args. +set dummy ${ac_tool_prefix}strip; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_STRIP+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$STRIP"; then + ac_cv_prog_STRIP="$STRIP" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_STRIP="${ac_tool_prefix}strip" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +STRIP=$ac_cv_prog_STRIP +if test -n "$STRIP"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $STRIP" >&5 +$as_echo "$STRIP" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_STRIP"; then + ac_ct_STRIP=$STRIP + # Extract the first word of "strip", so it can be a program name with args. +set dummy strip; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_STRIP+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_STRIP"; then + ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_STRIP="strip" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP +if test -n "$ac_ct_STRIP"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP" >&5 +$as_echo "$ac_ct_STRIP" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_STRIP" = x; then + STRIP=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + STRIP=$ac_ct_STRIP + fi +else + STRIP="$ac_cv_prog_STRIP" +fi + +test -z "$STRIP" && STRIP=: + + + + + + +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args. +set dummy ${ac_tool_prefix}ranlib; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_RANLIB+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$RANLIB"; then + ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +RANLIB=$ac_cv_prog_RANLIB +if test -n "$RANLIB"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $RANLIB" >&5 +$as_echo "$RANLIB" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_RANLIB"; then + ac_ct_RANLIB=$RANLIB + # Extract the first word of "ranlib", so it can be a program name with args. +set dummy ranlib; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_RANLIB+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_RANLIB"; then + ac_cv_prog_ac_ct_RANLIB="$ac_ct_RANLIB" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_RANLIB="ranlib" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_RANLIB=$ac_cv_prog_ac_ct_RANLIB +if test -n "$ac_ct_RANLIB"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_RANLIB" >&5 +$as_echo "$ac_ct_RANLIB" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_RANLIB" = x; then + RANLIB=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + RANLIB=$ac_ct_RANLIB + fi +else + RANLIB="$ac_cv_prog_RANLIB" +fi + +test -z "$RANLIB" && RANLIB=: + + + + + + +# Determine commands to create old-style static archives. +old_archive_cmds='$AR $AR_FLAGS $oldlib$oldobjs' +old_postinstall_cmds='chmod 644 $oldlib' +old_postuninstall_cmds= + +if test -n "$RANLIB"; then + case $host_os in + openbsd*) + old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB -t \$tool_oldlib" + ;; + *) + old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB \$tool_oldlib" + ;; + esac + old_archive_cmds="$old_archive_cmds~\$RANLIB \$tool_oldlib" +fi + +case $host_os in + darwin*) + lock_old_archive_extraction=yes ;; + *) + lock_old_archive_extraction=no ;; +esac + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +# If no C compiler was specified, use CC. +LTCC=${LTCC-"$CC"} + +# If no C compiler flags were specified, use CFLAGS. +LTCFLAGS=${LTCFLAGS-"$CFLAGS"} + +# Allow CC to be a program name with arguments. +compiler=$CC + + +# Check for command to grab the raw symbol name followed by C symbol from nm. +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking command to parse $NM output from $compiler object" >&5 +$as_echo_n "checking command to parse $NM output from $compiler object... " >&6; } +if ${lt_cv_sys_global_symbol_pipe+:} false; then : + $as_echo_n "(cached) " >&6 +else + +# These are sane defaults that work on at least a few old systems. +# [They come from Ultrix. What could be older than Ultrix?!! ;)] + +# Character class describing NM global symbol codes. +symcode='[BCDEGRST]' + +# Regexp to match symbols that can be accessed directly from C. +sympat='\([_A-Za-z][_A-Za-z0-9]*\)' + +# Define system-specific variables. +case $host_os in +aix*) + symcode='[BCDT]' + ;; +cygwin* | mingw* | pw32* | cegcc*) + symcode='[ABCDGISTW]' + ;; +hpux*) + if test "$host_cpu" = ia64; then + symcode='[ABCDEGRST]' + fi + ;; +irix* | nonstopux*) + symcode='[BCDEGRST]' + ;; +osf*) + symcode='[BCDEGQRST]' + ;; +solaris*) + symcode='[BDRT]' + ;; +sco3.2v5*) + symcode='[DT]' + ;; +sysv4.2uw2*) + symcode='[DT]' + ;; +sysv5* | sco5v6* | unixware* | OpenUNIX*) + symcode='[ABDT]' + ;; +sysv4) + symcode='[DFNSTU]' + ;; +esac + +# If we're using GNU nm, then use its standard symbol codes. +case `$NM -V 2>&1` in +*GNU* | *'with BFD'*) + symcode='[ABCDGIRSTW]' ;; +esac + +# Transform an extracted symbol line into a proper C declaration. +# Some systems (esp. on ia64) link data and code symbols differently, +# so use this general approach. +lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^T .* \(.*\)$/extern int \1();/p' -e 's/^$symcode* .* \(.*\)$/extern char \1;/p'" + +# Transform an extracted symbol line into symbol name and symbol address +lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([^ ]*\)[ ]*$/ {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([^ ]*\) \([^ ]*\)$/ {\"\2\", (void *) \&\2},/p'" +lt_cv_sys_global_symbol_to_c_name_address_lib_prefix="sed -n -e 's/^: \([^ ]*\)[ ]*$/ {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([^ ]*\) \(lib[^ ]*\)$/ {\"\2\", (void *) \&\2},/p' -e 's/^$symcode* \([^ ]*\) \([^ ]*\)$/ {\"lib\2\", (void *) \&\2},/p'" + +# Handle CRLF in mingw tool chain +opt_cr= +case $build_os in +mingw*) + opt_cr=`$ECHO 'x\{0,1\}' | tr x '\015'` # option cr in regexp + ;; +esac + +# Try without a prefix underscore, then with it. +for ac_symprfx in "" "_"; do + + # Transform symcode, sympat, and symprfx into a raw symbol and a C symbol. + symxfrm="\\1 $ac_symprfx\\2 \\2" + + # Write the raw and C identifiers. + if test "$lt_cv_nm_interface" = "MS dumpbin"; then + # Fake it for dumpbin and say T for any non-static function + # and D for any global variable. + # Also find C++ and __fastcall symbols from MSVC++, + # which start with @ or ?. + lt_cv_sys_global_symbol_pipe="$AWK '"\ +" {last_section=section; section=\$ 3};"\ +" /^COFF SYMBOL TABLE/{for(i in hide) delete hide[i]};"\ +" /Section length .*#relocs.*(pick any)/{hide[last_section]=1};"\ +" \$ 0!~/External *\|/{next};"\ +" / 0+ UNDEF /{next}; / UNDEF \([^|]\)*()/{next};"\ +" {if(hide[section]) next};"\ +" {f=0}; \$ 0~/\(\).*\|/{f=1}; {printf f ? \"T \" : \"D \"};"\ +" {split(\$ 0, a, /\||\r/); split(a[2], s)};"\ +" s[1]~/^[@?]/{print s[1], s[1]; next};"\ +" s[1]~prfx {split(s[1],t,\"@\"); print t[1], substr(t[1],length(prfx))}"\ +" ' prfx=^$ac_symprfx" + else + lt_cv_sys_global_symbol_pipe="sed -n -e 's/^.*[ ]\($symcode$symcode*\)[ ][ ]*$ac_symprfx$sympat$opt_cr$/$symxfrm/p'" + fi + lt_cv_sys_global_symbol_pipe="$lt_cv_sys_global_symbol_pipe | sed '/ __gnu_lto/d'" + + # Check to see that the pipe works correctly. + pipe_works=no + + rm -f conftest* + cat > conftest.$ac_ext <<_LT_EOF +#ifdef __cplusplus +extern "C" { +#endif +char nm_test_var; +void nm_test_func(void); +void nm_test_func(void){} +#ifdef __cplusplus +} +#endif +int main(){nm_test_var='a';nm_test_func();return(0);} +_LT_EOF + + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + # Now try to grab the symbols. + nlist=conftest.nm + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$NM conftest.$ac_objext \| "$lt_cv_sys_global_symbol_pipe" \> $nlist\""; } >&5 + (eval $NM conftest.$ac_objext \| "$lt_cv_sys_global_symbol_pipe" \> $nlist) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && test -s "$nlist"; then + # Try sorting and uniquifying the output. + if sort "$nlist" | uniq > "$nlist"T; then + mv -f "$nlist"T "$nlist" + else + rm -f "$nlist"T + fi + + # Make sure that we snagged all the symbols we need. + if $GREP ' nm_test_var$' "$nlist" >/dev/null; then + if $GREP ' nm_test_func$' "$nlist" >/dev/null; then + cat <<_LT_EOF > conftest.$ac_ext +/* Keep this code in sync between libtool.m4, ltmain, lt_system.h, and tests. */ +#if defined(_WIN32) || defined(__CYGWIN__) || defined(_WIN32_WCE) +/* DATA imports from DLLs on WIN32 con't be const, because runtime + relocations are performed -- see ld's documentation on pseudo-relocs. */ +# define LT@&t@_DLSYM_CONST +#elif defined(__osf__) +/* This system does not cope well with relocations in const data. */ +# define LT@&t@_DLSYM_CONST +#else +# define LT@&t@_DLSYM_CONST const +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +_LT_EOF + # Now generate the symbol file. + eval "$lt_cv_sys_global_symbol_to_cdecl"' < "$nlist" | $GREP -v main >> conftest.$ac_ext' + + cat <<_LT_EOF >> conftest.$ac_ext + +/* The mapping between symbol names and symbols. */ +LT@&t@_DLSYM_CONST struct { + const char *name; + void *address; +} +lt__PROGRAM__LTX_preloaded_symbols[] = +{ + { "@PROGRAM@", (void *) 0 }, +_LT_EOF + $SED "s/^$symcode$symcode* \(.*\) \(.*\)$/ {\"\2\", (void *) \&\2},/" < "$nlist" | $GREP -v main >> conftest.$ac_ext + cat <<\_LT_EOF >> conftest.$ac_ext + {0, (void *) 0} +}; + +/* This works around a problem in FreeBSD linker */ +#ifdef FREEBSD_WORKAROUND +static const void *lt_preloaded_setup() { + return lt__PROGRAM__LTX_preloaded_symbols; +} +#endif + +#ifdef __cplusplus +} +#endif +_LT_EOF + # Now try linking the two files. + mv conftest.$ac_objext conftstm.$ac_objext + lt_globsym_save_LIBS=$LIBS + lt_globsym_save_CFLAGS=$CFLAGS + LIBS="conftstm.$ac_objext" + CFLAGS="$CFLAGS$lt_prog_compiler_no_builtin_flag" + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5 + (eval $ac_link) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && test -s conftest${ac_exeext}; then + pipe_works=yes + fi + LIBS=$lt_globsym_save_LIBS + CFLAGS=$lt_globsym_save_CFLAGS + else + echo "cannot find nm_test_func in $nlist" >&5 + fi + else + echo "cannot find nm_test_var in $nlist" >&5 + fi + else + echo "cannot run $lt_cv_sys_global_symbol_pipe" >&5 + fi + else + echo "$progname: failed program was:" >&5 + cat conftest.$ac_ext >&5 + fi + rm -rf conftest* conftst* + + # Do not use the global_symbol_pipe unless it works. + if test "$pipe_works" = yes; then + break + else + lt_cv_sys_global_symbol_pipe= + fi +done + +fi + +if test -z "$lt_cv_sys_global_symbol_pipe"; then + lt_cv_sys_global_symbol_to_cdecl= +fi +if test -z "$lt_cv_sys_global_symbol_pipe$lt_cv_sys_global_symbol_to_cdecl"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: failed" >&5 +$as_echo "failed" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: ok" >&5 +$as_echo "ok" >&6; } +fi + +# Response file support. +if test "$lt_cv_nm_interface" = "MS dumpbin"; then + nm_file_list_spec='@' +elif $NM --help 2>/dev/null | grep '[@]FILE' >/dev/null; then + nm_file_list_spec='@' +fi + + + + + + + + + + + + + + + + + + + + + + + + + + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for sysroot" >&5 +$as_echo_n "checking for sysroot... " >&6; } + +@%:@ Check whether --with-sysroot was given. +if test "${with_sysroot+set}" = set; then : + withval=$with_sysroot; +else + with_sysroot=no +fi + + +lt_sysroot= +case ${with_sysroot} in #( + yes) + if test "$GCC" = yes; then + lt_sysroot=`$CC --print-sysroot 2>/dev/null` + fi + ;; #( + /*) + lt_sysroot=`echo "$with_sysroot" | sed -e "$sed_quote_subst"` + ;; #( + no|'') + ;; #( + *) + { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${with_sysroot}" >&5 +$as_echo "${with_sysroot}" >&6; } + as_fn_error $? "The sysroot must be an absolute path." "$LINENO" 5 + ;; +esac + + { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${lt_sysroot:-no}" >&5 +$as_echo "${lt_sysroot:-no}" >&6; } + + + + + +@%:@ Check whether --enable-libtool-lock was given. +if test "${enable_libtool_lock+set}" = set; then : + enableval=$enable_libtool_lock; +fi + +test "x$enable_libtool_lock" != xno && enable_libtool_lock=yes + +# Some flags need to be propagated to the compiler or linker for good +# libtool support. +case $host in +ia64-*-hpux*) + # Find out which ABI we are using. + echo 'int i;' > conftest.$ac_ext + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + case `/usr/bin/file conftest.$ac_objext` in + *ELF-32*) + HPUX_IA64_MODE="32" + ;; + *ELF-64*) + HPUX_IA64_MODE="64" + ;; + esac + fi + rm -rf conftest* + ;; +*-*-irix6*) + # Find out which ABI we are using. + echo '#line '$LINENO' "configure"' > conftest.$ac_ext + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + if test "$lt_cv_prog_gnu_ld" = yes; then + case `/usr/bin/file conftest.$ac_objext` in + *32-bit*) + LD="${LD-ld} -melf32bsmip" + ;; + *N32*) + LD="${LD-ld} -melf32bmipn32" + ;; + *64-bit*) + LD="${LD-ld} -melf64bmip" + ;; + esac + else + case `/usr/bin/file conftest.$ac_objext` in + *32-bit*) + LD="${LD-ld} -32" + ;; + *N32*) + LD="${LD-ld} -n32" + ;; + *64-bit*) + LD="${LD-ld} -64" + ;; + esac + fi + fi + rm -rf conftest* + ;; + +x86_64-*kfreebsd*-gnu|x86_64-*linux*|ppc*-*linux*|powerpc*-*linux*| \ +s390*-*linux*|s390*-*tpf*|sparc*-*linux*) + # Find out which ABI we are using. + echo 'int i;' > conftest.$ac_ext + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + case `/usr/bin/file conftest.o` in + *32-bit*) + case $host in + x86_64-*kfreebsd*-gnu) + LD="${LD-ld} -m elf_i386_fbsd" + ;; + x86_64-*linux*) + LD="${LD-ld} -m elf_i386" + ;; + ppc64-*linux*|powerpc64-*linux*) + LD="${LD-ld} -m elf32ppclinux" + ;; + s390x-*linux*) + LD="${LD-ld} -m elf_s390" + ;; + sparc64-*linux*) + LD="${LD-ld} -m elf32_sparc" + ;; + esac + ;; + *64-bit*) + case $host in + x86_64-*kfreebsd*-gnu) + LD="${LD-ld} -m elf_x86_64_fbsd" + ;; + x86_64-*linux*) + LD="${LD-ld} -m elf_x86_64" + ;; + ppc*-*linux*|powerpc*-*linux*) + LD="${LD-ld} -m elf64ppc" + ;; + s390*-*linux*|s390*-*tpf*) + LD="${LD-ld} -m elf64_s390" + ;; + sparc*-*linux*) + LD="${LD-ld} -m elf64_sparc" + ;; + esac + ;; + esac + fi + rm -rf conftest* + ;; + +*-*-sco3.2v5*) + # On SCO OpenServer 5, we need -belf to get full-featured binaries. + SAVE_CFLAGS="$CFLAGS" + CFLAGS="$CFLAGS -belf" + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler needs -belf" >&5 +$as_echo_n "checking whether the C compiler needs -belf... " >&6; } +if ${lt_cv_cc_needs_belf+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + lt_cv_cc_needs_belf=yes +else + lt_cv_cc_needs_belf=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_cc_needs_belf" >&5 +$as_echo "$lt_cv_cc_needs_belf" >&6; } + if test x"$lt_cv_cc_needs_belf" != x"yes"; then + # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf + CFLAGS="$SAVE_CFLAGS" + fi + ;; +*-*solaris*) + # Find out which ABI we are using. + echo 'int i;' > conftest.$ac_ext + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + case `/usr/bin/file conftest.o` in + *64-bit*) + case $lt_cv_prog_gnu_ld in + yes*) + case $host in + i?86-*-solaris*) + LD="${LD-ld} -m elf_x86_64" + ;; + sparc*-*-solaris*) + LD="${LD-ld} -m elf64_sparc" + ;; + esac + # GNU ld 2.21 introduced _sol2 emulations. Use them if available. + if ${LD-ld} -V | grep _sol2 >/dev/null 2>&1; then + LD="${LD-ld}_sol2" + fi + ;; + *) + if ${LD-ld} -64 -r -o conftest2.o conftest.o >/dev/null 2>&1; then + LD="${LD-ld} -64" + fi + ;; + esac + ;; + esac + fi + rm -rf conftest* + ;; +esac + +need_locks="$enable_libtool_lock" + +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}mt", so it can be a program name with args. +set dummy ${ac_tool_prefix}mt; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_MANIFEST_TOOL+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$MANIFEST_TOOL"; then + ac_cv_prog_MANIFEST_TOOL="$MANIFEST_TOOL" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_MANIFEST_TOOL="${ac_tool_prefix}mt" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +MANIFEST_TOOL=$ac_cv_prog_MANIFEST_TOOL +if test -n "$MANIFEST_TOOL"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MANIFEST_TOOL" >&5 +$as_echo "$MANIFEST_TOOL" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_MANIFEST_TOOL"; then + ac_ct_MANIFEST_TOOL=$MANIFEST_TOOL + # Extract the first word of "mt", so it can be a program name with args. +set dummy mt; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_MANIFEST_TOOL+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_MANIFEST_TOOL"; then + ac_cv_prog_ac_ct_MANIFEST_TOOL="$ac_ct_MANIFEST_TOOL" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_MANIFEST_TOOL="mt" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_MANIFEST_TOOL=$ac_cv_prog_ac_ct_MANIFEST_TOOL +if test -n "$ac_ct_MANIFEST_TOOL"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_MANIFEST_TOOL" >&5 +$as_echo "$ac_ct_MANIFEST_TOOL" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_MANIFEST_TOOL" = x; then + MANIFEST_TOOL=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + MANIFEST_TOOL=$ac_ct_MANIFEST_TOOL + fi +else + MANIFEST_TOOL="$ac_cv_prog_MANIFEST_TOOL" +fi + +test -z "$MANIFEST_TOOL" && MANIFEST_TOOL=mt +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if $MANIFEST_TOOL is a manifest tool" >&5 +$as_echo_n "checking if $MANIFEST_TOOL is a manifest tool... " >&6; } +if ${lt_cv_path_mainfest_tool+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_path_mainfest_tool=no + echo "$as_me:$LINENO: $MANIFEST_TOOL '-?'" >&5 + $MANIFEST_TOOL '-?' 2>conftest.err > conftest.out + cat conftest.err >&5 + if $GREP 'Manifest Tool' conftest.out > /dev/null; then + lt_cv_path_mainfest_tool=yes + fi + rm -f conftest* +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_path_mainfest_tool" >&5 +$as_echo "$lt_cv_path_mainfest_tool" >&6; } +if test "x$lt_cv_path_mainfest_tool" != xyes; then + MANIFEST_TOOL=: +fi + + + + + + + case $host_os in + rhapsody* | darwin*) + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}dsymutil", so it can be a program name with args. +set dummy ${ac_tool_prefix}dsymutil; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_DSYMUTIL+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$DSYMUTIL"; then + ac_cv_prog_DSYMUTIL="$DSYMUTIL" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_DSYMUTIL="${ac_tool_prefix}dsymutil" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +DSYMUTIL=$ac_cv_prog_DSYMUTIL +if test -n "$DSYMUTIL"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DSYMUTIL" >&5 +$as_echo "$DSYMUTIL" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_DSYMUTIL"; then + ac_ct_DSYMUTIL=$DSYMUTIL + # Extract the first word of "dsymutil", so it can be a program name with args. +set dummy dsymutil; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_DSYMUTIL+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_DSYMUTIL"; then + ac_cv_prog_ac_ct_DSYMUTIL="$ac_ct_DSYMUTIL" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_DSYMUTIL="dsymutil" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_DSYMUTIL=$ac_cv_prog_ac_ct_DSYMUTIL +if test -n "$ac_ct_DSYMUTIL"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DSYMUTIL" >&5 +$as_echo "$ac_ct_DSYMUTIL" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_DSYMUTIL" = x; then + DSYMUTIL=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + DSYMUTIL=$ac_ct_DSYMUTIL + fi +else + DSYMUTIL="$ac_cv_prog_DSYMUTIL" +fi + + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}nmedit", so it can be a program name with args. +set dummy ${ac_tool_prefix}nmedit; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_NMEDIT+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$NMEDIT"; then + ac_cv_prog_NMEDIT="$NMEDIT" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_NMEDIT="${ac_tool_prefix}nmedit" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +NMEDIT=$ac_cv_prog_NMEDIT +if test -n "$NMEDIT"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $NMEDIT" >&5 +$as_echo "$NMEDIT" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_NMEDIT"; then + ac_ct_NMEDIT=$NMEDIT + # Extract the first word of "nmedit", so it can be a program name with args. +set dummy nmedit; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_NMEDIT+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_NMEDIT"; then + ac_cv_prog_ac_ct_NMEDIT="$ac_ct_NMEDIT" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_NMEDIT="nmedit" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_NMEDIT=$ac_cv_prog_ac_ct_NMEDIT +if test -n "$ac_ct_NMEDIT"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_NMEDIT" >&5 +$as_echo "$ac_ct_NMEDIT" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_NMEDIT" = x; then + NMEDIT=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + NMEDIT=$ac_ct_NMEDIT + fi +else + NMEDIT="$ac_cv_prog_NMEDIT" +fi + + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}lipo", so it can be a program name with args. +set dummy ${ac_tool_prefix}lipo; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_LIPO+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$LIPO"; then + ac_cv_prog_LIPO="$LIPO" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_LIPO="${ac_tool_prefix}lipo" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +LIPO=$ac_cv_prog_LIPO +if test -n "$LIPO"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LIPO" >&5 +$as_echo "$LIPO" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_LIPO"; then + ac_ct_LIPO=$LIPO + # Extract the first word of "lipo", so it can be a program name with args. +set dummy lipo; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_LIPO+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_LIPO"; then + ac_cv_prog_ac_ct_LIPO="$ac_ct_LIPO" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_LIPO="lipo" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_LIPO=$ac_cv_prog_ac_ct_LIPO +if test -n "$ac_ct_LIPO"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_LIPO" >&5 +$as_echo "$ac_ct_LIPO" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_LIPO" = x; then + LIPO=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + LIPO=$ac_ct_LIPO + fi +else + LIPO="$ac_cv_prog_LIPO" +fi + + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}otool", so it can be a program name with args. +set dummy ${ac_tool_prefix}otool; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_OTOOL+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$OTOOL"; then + ac_cv_prog_OTOOL="$OTOOL" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_OTOOL="${ac_tool_prefix}otool" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +OTOOL=$ac_cv_prog_OTOOL +if test -n "$OTOOL"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OTOOL" >&5 +$as_echo "$OTOOL" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_OTOOL"; then + ac_ct_OTOOL=$OTOOL + # Extract the first word of "otool", so it can be a program name with args. +set dummy otool; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_OTOOL+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_OTOOL"; then + ac_cv_prog_ac_ct_OTOOL="$ac_ct_OTOOL" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_OTOOL="otool" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_OTOOL=$ac_cv_prog_ac_ct_OTOOL +if test -n "$ac_ct_OTOOL"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OTOOL" >&5 +$as_echo "$ac_ct_OTOOL" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_OTOOL" = x; then + OTOOL=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + OTOOL=$ac_ct_OTOOL + fi +else + OTOOL="$ac_cv_prog_OTOOL" +fi + + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}otool64", so it can be a program name with args. +set dummy ${ac_tool_prefix}otool64; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_OTOOL64+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$OTOOL64"; then + ac_cv_prog_OTOOL64="$OTOOL64" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_OTOOL64="${ac_tool_prefix}otool64" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +OTOOL64=$ac_cv_prog_OTOOL64 +if test -n "$OTOOL64"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OTOOL64" >&5 +$as_echo "$OTOOL64" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_OTOOL64"; then + ac_ct_OTOOL64=$OTOOL64 + # Extract the first word of "otool64", so it can be a program name with args. +set dummy otool64; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_OTOOL64+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_OTOOL64"; then + ac_cv_prog_ac_ct_OTOOL64="$ac_ct_OTOOL64" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_OTOOL64="otool64" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_OTOOL64=$ac_cv_prog_ac_ct_OTOOL64 +if test -n "$ac_ct_OTOOL64"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OTOOL64" >&5 +$as_echo "$ac_ct_OTOOL64" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_OTOOL64" = x; then + OTOOL64=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + OTOOL64=$ac_ct_OTOOL64 + fi +else + OTOOL64="$ac_cv_prog_OTOOL64" +fi + + + + + + + + + + + + + + + + + + + + + + + + + + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -single_module linker flag" >&5 +$as_echo_n "checking for -single_module linker flag... " >&6; } +if ${lt_cv_apple_cc_single_mod+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_apple_cc_single_mod=no + if test -z "${LT_MULTI_MODULE}"; then + # By default we will add the -single_module flag. You can override + # by either setting the environment variable LT_MULTI_MODULE + # non-empty at configure time, or by adding -multi_module to the + # link flags. + rm -rf libconftest.dylib* + echo "int foo(void){return 1;}" > conftest.c + echo "$LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \ +-dynamiclib -Wl,-single_module conftest.c" >&5 + $LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \ + -dynamiclib -Wl,-single_module conftest.c 2>conftest.err + _lt_result=$? + # If there is a non-empty error log, and "single_module" + # appears in it, assume the flag caused a linker warning + if test -s conftest.err && $GREP single_module conftest.err; then + cat conftest.err >&5 + # Otherwise, if the output was created with a 0 exit code from + # the compiler, it worked. + elif test -f libconftest.dylib && test $_lt_result -eq 0; then + lt_cv_apple_cc_single_mod=yes + else + cat conftest.err >&5 + fi + rm -rf libconftest.dylib* + rm -f conftest.* + fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_apple_cc_single_mod" >&5 +$as_echo "$lt_cv_apple_cc_single_mod" >&6; } + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -exported_symbols_list linker flag" >&5 +$as_echo_n "checking for -exported_symbols_list linker flag... " >&6; } +if ${lt_cv_ld_exported_symbols_list+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_ld_exported_symbols_list=no + save_LDFLAGS=$LDFLAGS + echo "_main" > conftest.sym + LDFLAGS="$LDFLAGS -Wl,-exported_symbols_list,conftest.sym" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + lt_cv_ld_exported_symbols_list=yes +else + lt_cv_ld_exported_symbols_list=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + LDFLAGS="$save_LDFLAGS" + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_exported_symbols_list" >&5 +$as_echo "$lt_cv_ld_exported_symbols_list" >&6; } + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -force_load linker flag" >&5 +$as_echo_n "checking for -force_load linker flag... " >&6; } +if ${lt_cv_ld_force_load+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_ld_force_load=no + cat > conftest.c << _LT_EOF +int forced_loaded() { return 2;} +_LT_EOF + echo "$LTCC $LTCFLAGS -c -o conftest.o conftest.c" >&5 + $LTCC $LTCFLAGS -c -o conftest.o conftest.c 2>&5 + echo "$AR cru libconftest.a conftest.o" >&5 + $AR cru libconftest.a conftest.o 2>&5 + echo "$RANLIB libconftest.a" >&5 + $RANLIB libconftest.a 2>&5 + cat > conftest.c << _LT_EOF +int main() { return 0;} +_LT_EOF + echo "$LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a" >&5 + $LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a 2>conftest.err + _lt_result=$? + if test -s conftest.err && $GREP force_load conftest.err; then + cat conftest.err >&5 + elif test -f conftest && test $_lt_result -eq 0 && $GREP forced_load conftest >/dev/null 2>&1 ; then + lt_cv_ld_force_load=yes + else + cat conftest.err >&5 + fi + rm -f conftest.err libconftest.a conftest conftest.c + rm -rf conftest.dSYM + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_force_load" >&5 +$as_echo "$lt_cv_ld_force_load" >&6; } + case $host_os in + rhapsody* | darwin1.[012]) + _lt_dar_allow_undefined='${wl}-undefined ${wl}suppress' ;; + darwin1.*) + _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;; + darwin*) # darwin 5.x on + # if running on 10.5 or later, the deployment target defaults + # to the OS version, if on x86, and 10.4, the deployment + # target defaults to 10.4. Don't you love it? + case ${MACOSX_DEPLOYMENT_TARGET-10.0},$host in + 10.0,*86*-darwin8*|10.0,*-darwin[91]*) + _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;; + 10.[012]*) + _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;; + 10.*) + _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;; + esac + ;; + esac + if test "$lt_cv_apple_cc_single_mod" = "yes"; then + _lt_dar_single_mod='$single_module' + fi + if test "$lt_cv_ld_exported_symbols_list" = "yes"; then + _lt_dar_export_syms=' ${wl}-exported_symbols_list,$output_objdir/${libname}-symbols.expsym' + else + _lt_dar_export_syms='~$NMEDIT -s $output_objdir/${libname}-symbols.expsym ${lib}' + fi + if test "$DSYMUTIL" != ":" && test "$lt_cv_ld_force_load" = "no"; then + _lt_dsymutil='~$DSYMUTIL $lib || :' + else + _lt_dsymutil= + fi + ;; + esac + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C preprocessor" >&5 +$as_echo_n "checking how to run the C preprocessor... " >&6; } +# On Suns, sometimes $CPP names a directory. +if test -n "$CPP" && test -d "$CPP"; then + CPP= +fi +if test -z "$CPP"; then + if ${ac_cv_prog_CPP+:} false; then : + $as_echo_n "(cached) " >&6 +else + # Double quotes because CPP needs to be expanded + for CPP in "$CC -E" "$CC -E -traditional-cpp" "/lib/cpp" + do + ac_preproc_ok=false +for ac_c_preproc_warn_flag in '' yes +do + # Use a header file that comes with gcc, so configuring glibc + # with a fresh cross-compiler works. + # Prefer to if __STDC__ is defined, since + # exists even on freestanding compilers. + # On the NeXT, cc -E runs the code through the compiler's parser, + # not just through cpp. "Syntax error" is here to catch this case. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +@%:@ifdef __STDC__ +@%:@ include +@%:@else +@%:@ include +@%:@endif + Syntax error +_ACEOF +if ac_fn_c_try_cpp "$LINENO"; then : + +else + # Broken: fails on valid input. +continue +fi +rm -f conftest.err conftest.i conftest.$ac_ext + + # OK, works on sane cases. Now check whether nonexistent headers + # can be detected and how. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +@%:@include +_ACEOF +if ac_fn_c_try_cpp "$LINENO"; then : + # Broken: success on invalid input. +continue +else + # Passes both tests. +ac_preproc_ok=: +break +fi +rm -f conftest.err conftest.i conftest.$ac_ext + +done +# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. +rm -f conftest.i conftest.err conftest.$ac_ext +if $ac_preproc_ok; then : + break +fi + + done + ac_cv_prog_CPP=$CPP + +fi + CPP=$ac_cv_prog_CPP +else + ac_cv_prog_CPP=$CPP +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $CPP" >&5 +$as_echo "$CPP" >&6; } +ac_preproc_ok=false +for ac_c_preproc_warn_flag in '' yes +do + # Use a header file that comes with gcc, so configuring glibc + # with a fresh cross-compiler works. + # Prefer to if __STDC__ is defined, since + # exists even on freestanding compilers. + # On the NeXT, cc -E runs the code through the compiler's parser, + # not just through cpp. "Syntax error" is here to catch this case. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +@%:@ifdef __STDC__ +@%:@ include +@%:@else +@%:@ include +@%:@endif + Syntax error +_ACEOF +if ac_fn_c_try_cpp "$LINENO"; then : + +else + # Broken: fails on valid input. +continue +fi +rm -f conftest.err conftest.i conftest.$ac_ext + + # OK, works on sane cases. Now check whether nonexistent headers + # can be detected and how. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +@%:@include +_ACEOF +if ac_fn_c_try_cpp "$LINENO"; then : + # Broken: success on invalid input. +continue +else + # Passes both tests. +ac_preproc_ok=: +break +fi +rm -f conftest.err conftest.i conftest.$ac_ext + +done +# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. +rm -f conftest.i conftest.err conftest.$ac_ext +if $ac_preproc_ok; then : + +else + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "C preprocessor \"$CPP\" fails sanity check +See \`config.log' for more details" "$LINENO" 5; } +fi + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header files" >&5 +$as_echo_n "checking for ANSI C header files... " >&6; } +if ${ac_cv_header_stdc+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +#include +#include +#include + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_header_stdc=yes +else + ac_cv_header_stdc=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + +if test $ac_cv_header_stdc = yes; then + # SunOS 4.x string.h does not declare mem*, contrary to ANSI. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include + +_ACEOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + $EGREP "memchr" >/dev/null 2>&1; then : + +else + ac_cv_header_stdc=no +fi +rm -f conftest* + +fi + +if test $ac_cv_header_stdc = yes; then + # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include + +_ACEOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + $EGREP "free" >/dev/null 2>&1; then : + +else + ac_cv_header_stdc=no +fi +rm -f conftest* + +fi + +if test $ac_cv_header_stdc = yes; then + # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi. + if test "$cross_compiling" = yes; then : + : +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +#include +#if ((' ' & 0x0FF) == 0x020) +# define ISLOWER(c) ('a' <= (c) && (c) <= 'z') +# define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c)) +#else +# define ISLOWER(c) \ + (('a' <= (c) && (c) <= 'i') \ + || ('j' <= (c) && (c) <= 'r') \ + || ('s' <= (c) && (c) <= 'z')) +# define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c)) +#endif + +#define XOR(e, f) (((e) && !(f)) || (!(e) && (f))) +int +main () +{ + int i; + for (i = 0; i < 256; i++) + if (XOR (islower (i), ISLOWER (i)) + || toupper (i) != TOUPPER (i)) + return 2; + return 0; +} +_ACEOF +if ac_fn_c_try_run "$LINENO"; then : + +else + ac_cv_header_stdc=no +fi +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ + conftest.$ac_objext conftest.beam conftest.$ac_ext +fi + +fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdc" >&5 +$as_echo "$ac_cv_header_stdc" >&6; } +if test $ac_cv_header_stdc = yes; then + +$as_echo "@%:@define STDC_HEADERS 1" >>confdefs.h + +fi + +# On IRIX 5.3, sys/types and inttypes.h are conflicting. +for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \ + inttypes.h stdint.h unistd.h +do : + as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` +ac_fn_c_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default +" +if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : + cat >>confdefs.h <<_ACEOF +@%:@define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 +_ACEOF + +fi + +done + + +for ac_header in dlfcn.h +do : + ac_fn_c_check_header_compile "$LINENO" "dlfcn.h" "ac_cv_header_dlfcn_h" "$ac_includes_default +" +if test "x$ac_cv_header_dlfcn_h" = xyes; then : + cat >>confdefs.h <<_ACEOF +@%:@define HAVE_DLFCN_H 1 +_ACEOF + +fi + +done + + + + +func_stripname_cnf () +{ + case ${2} in + .*) func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%\\\\${2}\$%%"`;; + *) func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%${2}\$%%"`;; + esac +} # func_stripname_cnf + + + + + +# Set options + + + + enable_dlopen=no + + + enable_win32_dll=no + + + @%:@ Check whether --enable-shared was given. +if test "${enable_shared+set}" = set; then : + enableval=$enable_shared; p=${PACKAGE-default} + case $enableval in + yes) enable_shared=yes ;; + no) enable_shared=no ;; + *) + enable_shared=no + # Look at the argument we got. We use all the common list separators. + lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," + for pkg in $enableval; do + IFS="$lt_save_ifs" + if test "X$pkg" = "X$p"; then + enable_shared=yes + fi + done + IFS="$lt_save_ifs" + ;; + esac +else + enable_shared=yes +fi + + + + + + + + + + @%:@ Check whether --enable-static was given. +if test "${enable_static+set}" = set; then : + enableval=$enable_static; p=${PACKAGE-default} + case $enableval in + yes) enable_static=yes ;; + no) enable_static=no ;; + *) + enable_static=no + # Look at the argument we got. We use all the common list separators. + lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," + for pkg in $enableval; do + IFS="$lt_save_ifs" + if test "X$pkg" = "X$p"; then + enable_static=yes + fi + done + IFS="$lt_save_ifs" + ;; + esac +else + enable_static=yes +fi + + + + + + + + + + +@%:@ Check whether --with-pic was given. +if test "${with_pic+set}" = set; then : + withval=$with_pic; lt_p=${PACKAGE-default} + case $withval in + yes|no) pic_mode=$withval ;; + *) + pic_mode=default + # Look at the argument we got. We use all the common list separators. + lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," + for lt_pkg in $withval; do + IFS="$lt_save_ifs" + if test "X$lt_pkg" = "X$lt_p"; then + pic_mode=yes + fi + done + IFS="$lt_save_ifs" + ;; + esac +else + pic_mode=default +fi + + +test -z "$pic_mode" && pic_mode=default + + + + + + + + @%:@ Check whether --enable-fast-install was given. +if test "${enable_fast_install+set}" = set; then : + enableval=$enable_fast_install; p=${PACKAGE-default} + case $enableval in + yes) enable_fast_install=yes ;; + no) enable_fast_install=no ;; + *) + enable_fast_install=no + # Look at the argument we got. We use all the common list separators. + lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," + for pkg in $enableval; do + IFS="$lt_save_ifs" + if test "X$pkg" = "X$p"; then + enable_fast_install=yes + fi + done + IFS="$lt_save_ifs" + ;; + esac +else + enable_fast_install=yes +fi + + + + + + + + + + + +# This can be used to rebuild libtool when needed +LIBTOOL_DEPS="$ltmain" + +# Always use our own libtool. +LIBTOOL='$(SHELL) $(top_builddir)/libtool' + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +test -z "$LN_S" && LN_S="ln -s" + + + + + + + + + + + + + + +if test -n "${ZSH_VERSION+set}" ; then + setopt NO_GLOB_SUBST +fi + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for objdir" >&5 +$as_echo_n "checking for objdir... " >&6; } +if ${lt_cv_objdir+:} false; then : + $as_echo_n "(cached) " >&6 +else + rm -f .libs 2>/dev/null +mkdir .libs 2>/dev/null +if test -d .libs; then + lt_cv_objdir=.libs +else + # MS-DOS does not allow filenames that begin with a dot. + lt_cv_objdir=_libs +fi +rmdir .libs 2>/dev/null +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_objdir" >&5 +$as_echo "$lt_cv_objdir" >&6; } +objdir=$lt_cv_objdir + + + + + +cat >>confdefs.h <<_ACEOF +@%:@define LT_OBJDIR "$lt_cv_objdir/" +_ACEOF + + + + +case $host_os in +aix3*) + # AIX sometimes has problems with the GCC collect2 program. For some + # reason, if we set the COLLECT_NAMES environment variable, the problems + # vanish in a puff of smoke. + if test "X${COLLECT_NAMES+set}" != Xset; then + COLLECT_NAMES= + export COLLECT_NAMES + fi + ;; +esac + +# Global variables: +ofile=libtool +can_build_shared=yes + +# All known linkers require a `.a' archive for static linking (except MSVC, +# which needs '.lib'). +libext=a + +with_gnu_ld="$lt_cv_prog_gnu_ld" + +old_CC="$CC" +old_CFLAGS="$CFLAGS" + +# Set sane defaults for various variables +test -z "$CC" && CC=cc +test -z "$LTCC" && LTCC=$CC +test -z "$LTCFLAGS" && LTCFLAGS=$CFLAGS +test -z "$LD" && LD=ld +test -z "$ac_objext" && ac_objext=o + +for cc_temp in $compiler""; do + case $cc_temp in + compile | *[\\/]compile | ccache | *[\\/]ccache ) ;; + distcc | *[\\/]distcc | purify | *[\\/]purify ) ;; + \-*) ;; + *) break;; + esac +done +cc_basename=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"` + + +# Only perform the check for file, if the check method requires it +test -z "$MAGIC_CMD" && MAGIC_CMD=file +case $deplibs_check_method in +file_magic*) + if test "$file_magic_cmd" = '$MAGIC_CMD'; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ${ac_tool_prefix}file" >&5 +$as_echo_n "checking for ${ac_tool_prefix}file... " >&6; } +if ${lt_cv_path_MAGIC_CMD+:} false; then : + $as_echo_n "(cached) " >&6 +else + case $MAGIC_CMD in +[\\/*] | ?:[\\/]*) + lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path. + ;; +*) + lt_save_MAGIC_CMD="$MAGIC_CMD" + lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR + ac_dummy="/usr/bin$PATH_SEPARATOR$PATH" + for ac_dir in $ac_dummy; do + IFS="$lt_save_ifs" + test -z "$ac_dir" && ac_dir=. + if test -f $ac_dir/${ac_tool_prefix}file; then + lt_cv_path_MAGIC_CMD="$ac_dir/${ac_tool_prefix}file" + if test -n "$file_magic_test_file"; then + case $deplibs_check_method in + "file_magic "*) + file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"` + MAGIC_CMD="$lt_cv_path_MAGIC_CMD" + if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null | + $EGREP "$file_magic_regex" > /dev/null; then + : + else + cat <<_LT_EOF 1>&2 + +*** Warning: the command libtool uses to detect shared libraries, +*** $file_magic_cmd, produces output that libtool cannot recognize. +*** The result is that libtool may fail to recognize shared libraries +*** as such. This will affect the creation of libtool libraries that +*** depend on shared libraries, but programs linked with such libtool +*** libraries will work regardless of this problem. Nevertheless, you +*** may want to report the problem to your system manager and/or to +*** bug-libtool@gnu.org + +_LT_EOF + fi ;; + esac + fi + break + fi + done + IFS="$lt_save_ifs" + MAGIC_CMD="$lt_save_MAGIC_CMD" + ;; +esac +fi + +MAGIC_CMD="$lt_cv_path_MAGIC_CMD" +if test -n "$MAGIC_CMD"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MAGIC_CMD" >&5 +$as_echo "$MAGIC_CMD" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + + + +if test -z "$lt_cv_path_MAGIC_CMD"; then + if test -n "$ac_tool_prefix"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for file" >&5 +$as_echo_n "checking for file... " >&6; } +if ${lt_cv_path_MAGIC_CMD+:} false; then : + $as_echo_n "(cached) " >&6 +else + case $MAGIC_CMD in +[\\/*] | ?:[\\/]*) + lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path. + ;; +*) + lt_save_MAGIC_CMD="$MAGIC_CMD" + lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR + ac_dummy="/usr/bin$PATH_SEPARATOR$PATH" + for ac_dir in $ac_dummy; do + IFS="$lt_save_ifs" + test -z "$ac_dir" && ac_dir=. + if test -f $ac_dir/file; then + lt_cv_path_MAGIC_CMD="$ac_dir/file" + if test -n "$file_magic_test_file"; then + case $deplibs_check_method in + "file_magic "*) + file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"` + MAGIC_CMD="$lt_cv_path_MAGIC_CMD" + if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null | + $EGREP "$file_magic_regex" > /dev/null; then + : + else + cat <<_LT_EOF 1>&2 + +*** Warning: the command libtool uses to detect shared libraries, +*** $file_magic_cmd, produces output that libtool cannot recognize. +*** The result is that libtool may fail to recognize shared libraries +*** as such. This will affect the creation of libtool libraries that +*** depend on shared libraries, but programs linked with such libtool +*** libraries will work regardless of this problem. Nevertheless, you +*** may want to report the problem to your system manager and/or to +*** bug-libtool@gnu.org + +_LT_EOF + fi ;; + esac + fi + break + fi + done + IFS="$lt_save_ifs" + MAGIC_CMD="$lt_save_MAGIC_CMD" + ;; +esac +fi + +MAGIC_CMD="$lt_cv_path_MAGIC_CMD" +if test -n "$MAGIC_CMD"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MAGIC_CMD" >&5 +$as_echo "$MAGIC_CMD" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + else + MAGIC_CMD=: + fi +fi + + fi + ;; +esac + +# Use C for the default configuration in the libtool script + +lt_save_CC="$CC" +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + +# Source file extension for C test sources. +ac_ext=c + +# Object file extension for compiled C test sources. +objext=o +objext=$objext + +# Code to be used in simple compile tests +lt_simple_compile_test_code="int some_variable = 0;" + +# Code to be used in simple link tests +lt_simple_link_test_code='int main(){return(0);}' + + + + + + + +# If no C compiler was specified, use CC. +LTCC=${LTCC-"$CC"} + +# If no C compiler flags were specified, use CFLAGS. +LTCFLAGS=${LTCFLAGS-"$CFLAGS"} + +# Allow CC to be a program name with arguments. +compiler=$CC + +# Save the default compiler, since it gets overwritten when the other +# tags are being tested, and _LT_TAGVAR(compiler, []) is a NOP. +compiler_DEFAULT=$CC + +# save warnings/boilerplate of simple test code +ac_outfile=conftest.$ac_objext +echo "$lt_simple_compile_test_code" >conftest.$ac_ext +eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err +_lt_compiler_boilerplate=`cat conftest.err` +$RM conftest* + +ac_outfile=conftest.$ac_objext +echo "$lt_simple_link_test_code" >conftest.$ac_ext +eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err +_lt_linker_boilerplate=`cat conftest.err` +$RM -r conftest* + + +if test -n "$compiler"; then + +lt_prog_compiler_no_builtin_flag= + +if test "$GCC" = yes; then + case $cc_basename in + nvcc*) + lt_prog_compiler_no_builtin_flag=' -Xcompiler -fno-builtin' ;; + *) + lt_prog_compiler_no_builtin_flag=' -fno-builtin' ;; + esac + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -fno-rtti -fno-exceptions" >&5 +$as_echo_n "checking if $compiler supports -fno-rtti -fno-exceptions... " >&6; } +if ${lt_cv_prog_compiler_rtti_exceptions+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_prog_compiler_rtti_exceptions=no + ac_outfile=conftest.$ac_objext + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + lt_compiler_flag="-fno-rtti -fno-exceptions" + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + # The option is referenced via a variable to avoid confusing sed. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ + -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) + (eval "$lt_compile" 2>conftest.err) + ac_status=$? + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + if (exit $ac_status) && test -s "$ac_outfile"; then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings other than the usual output. + $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp + $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 + if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then + lt_cv_prog_compiler_rtti_exceptions=yes + fi + fi + $RM conftest* + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_rtti_exceptions" >&5 +$as_echo "$lt_cv_prog_compiler_rtti_exceptions" >&6; } + +if test x"$lt_cv_prog_compiler_rtti_exceptions" = xyes; then + lt_prog_compiler_no_builtin_flag="$lt_prog_compiler_no_builtin_flag -fno-rtti -fno-exceptions" +else + : +fi + +fi + + + + + + + lt_prog_compiler_wl= +lt_prog_compiler_pic= +lt_prog_compiler_static= + + + if test "$GCC" = yes; then + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_static='-static' + + case $host_os in + aix*) + # All AIX code is PIC. + if test "$host_cpu" = ia64; then + # AIX 5 now supports IA64 processor + lt_prog_compiler_static='-Bstatic' + fi + ;; + + amigaos*) + case $host_cpu in + powerpc) + # see comment about AmigaOS4 .so support + lt_prog_compiler_pic='-fPIC' + ;; + m68k) + # FIXME: we need at least 68020 code to build shared libraries, but + # adding the `-m68020' flag to GCC prevents building anything better, + # like `-m68040'. + lt_prog_compiler_pic='-m68020 -resident32 -malways-restore-a4' + ;; + esac + ;; + + beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) + # PIC is the default for these OSes. + ;; + + mingw* | cygwin* | pw32* | os2* | cegcc*) + # This hack is so that the source file can tell whether it is being + # built for inclusion in a dll (and should export symbols for example). + # Although the cygwin gcc ignores -fPIC, still need this for old-style + # (--disable-auto-import) libraries + lt_prog_compiler_pic='-DDLL_EXPORT' + ;; + + darwin* | rhapsody*) + # PIC is the default on this platform + # Common symbols not allowed in MH_DYLIB files + lt_prog_compiler_pic='-fno-common' + ;; + + haiku*) + # PIC is the default for Haiku. + # The "-static" flag exists, but is broken. + lt_prog_compiler_static= + ;; + + hpux*) + # PIC is the default for 64-bit PA HP-UX, but not for 32-bit + # PA HP-UX. On IA64 HP-UX, PIC is the default but the pic flag + # sets the default TLS model and affects inlining. + case $host_cpu in + hppa*64*) + # +Z the default + ;; + *) + lt_prog_compiler_pic='-fPIC' + ;; + esac + ;; + + interix[3-9]*) + # Interix 3.x gcc -fpic/-fPIC options generate broken code. + # Instead, we relocate shared libraries at runtime. + ;; + + msdosdjgpp*) + # Just because we use GCC doesn't mean we suddenly get shared libraries + # on systems that don't support them. + lt_prog_compiler_can_build_shared=no + enable_shared=no + ;; + + *nto* | *qnx*) + # QNX uses GNU C++, but need to define -shared option too, otherwise + # it will coredump. + lt_prog_compiler_pic='-fPIC -shared' + ;; + + sysv4*MP*) + if test -d /usr/nec; then + lt_prog_compiler_pic=-Kconform_pic + fi + ;; + + *) + lt_prog_compiler_pic='-fPIC' + ;; + esac + + case $cc_basename in + nvcc*) # Cuda Compiler Driver 2.2 + lt_prog_compiler_wl='-Xlinker ' + if test -n "$lt_prog_compiler_pic"; then + lt_prog_compiler_pic="-Xcompiler $lt_prog_compiler_pic" + fi + ;; + esac + else + # PORTME Check for flag to pass linker flags through the system compiler. + case $host_os in + aix*) + lt_prog_compiler_wl='-Wl,' + if test "$host_cpu" = ia64; then + # AIX 5 now supports IA64 processor + lt_prog_compiler_static='-Bstatic' + else + lt_prog_compiler_static='-bnso -bI:/lib/syscalls.exp' + fi + ;; + + mingw* | cygwin* | pw32* | os2* | cegcc*) + # This hack is so that the source file can tell whether it is being + # built for inclusion in a dll (and should export symbols for example). + lt_prog_compiler_pic='-DDLL_EXPORT' + ;; + + hpux9* | hpux10* | hpux11*) + lt_prog_compiler_wl='-Wl,' + # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but + # not for PA HP-UX. + case $host_cpu in + hppa*64*|ia64*) + # +Z the default + ;; + *) + lt_prog_compiler_pic='+Z' + ;; + esac + # Is there a better lt_prog_compiler_static that works with the bundled CC? + lt_prog_compiler_static='${wl}-a ${wl}archive' + ;; + + irix5* | irix6* | nonstopux*) + lt_prog_compiler_wl='-Wl,' + # PIC (with -KPIC) is the default. + lt_prog_compiler_static='-non_shared' + ;; + + linux* | k*bsd*-gnu | kopensolaris*-gnu) + case $cc_basename in + # old Intel for x86_64 which still supported -KPIC. + ecc*) + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_pic='-KPIC' + lt_prog_compiler_static='-static' + ;; + # icc used to be incompatible with GCC. + # ICC 10 doesn't accept -KPIC any more. + icc* | ifort*) + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_pic='-fPIC' + lt_prog_compiler_static='-static' + ;; + # Lahey Fortran 8.1. + lf95*) + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_pic='--shared' + lt_prog_compiler_static='--static' + ;; + nagfor*) + # NAG Fortran compiler + lt_prog_compiler_wl='-Wl,-Wl,,' + lt_prog_compiler_pic='-PIC' + lt_prog_compiler_static='-Bstatic' + ;; + pgcc* | pgf77* | pgf90* | pgf95* | pgfortran*) + # Portland Group compilers (*not* the Pentium gcc compiler, + # which looks to be a dead project) + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_pic='-fpic' + lt_prog_compiler_static='-Bstatic' + ;; + ccc*) + lt_prog_compiler_wl='-Wl,' + # All Alpha code is PIC. + lt_prog_compiler_static='-non_shared' + ;; + xl* | bgxl* | bgf* | mpixl*) + # IBM XL C 8.0/Fortran 10.1, 11.1 on PPC and BlueGene + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_pic='-qpic' + lt_prog_compiler_static='-qstaticlink' + ;; + *) + case `$CC -V 2>&1 | sed 5q` in + *Sun\ Ceres\ Fortran* | *Sun*Fortran*\ [1-7].* | *Sun*Fortran*\ 8.[0-3]*) + # Sun Fortran 8.3 passes all unrecognized flags to the linker + lt_prog_compiler_pic='-KPIC' + lt_prog_compiler_static='-Bstatic' + lt_prog_compiler_wl='' + ;; + *Sun\ F* | *Sun*Fortran*) + lt_prog_compiler_pic='-KPIC' + lt_prog_compiler_static='-Bstatic' + lt_prog_compiler_wl='-Qoption ld ' + ;; + *Sun\ C*) + # Sun C 5.9 + lt_prog_compiler_pic='-KPIC' + lt_prog_compiler_static='-Bstatic' + lt_prog_compiler_wl='-Wl,' + ;; + *Intel*\ [CF]*Compiler*) + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_pic='-fPIC' + lt_prog_compiler_static='-static' + ;; + *Portland\ Group*) + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_pic='-fpic' + lt_prog_compiler_static='-Bstatic' + ;; + esac + ;; + esac + ;; + + newsos6) + lt_prog_compiler_pic='-KPIC' + lt_prog_compiler_static='-Bstatic' + ;; + + *nto* | *qnx*) + # QNX uses GNU C++, but need to define -shared option too, otherwise + # it will coredump. + lt_prog_compiler_pic='-fPIC -shared' + ;; + + osf3* | osf4* | osf5*) + lt_prog_compiler_wl='-Wl,' + # All OSF/1 code is PIC. + lt_prog_compiler_static='-non_shared' + ;; + + rdos*) + lt_prog_compiler_static='-non_shared' + ;; + + solaris*) + lt_prog_compiler_pic='-KPIC' + lt_prog_compiler_static='-Bstatic' + case $cc_basename in + f77* | f90* | f95* | sunf77* | sunf90* | sunf95*) + lt_prog_compiler_wl='-Qoption ld ';; + *) + lt_prog_compiler_wl='-Wl,';; + esac + ;; + + sunos4*) + lt_prog_compiler_wl='-Qoption ld ' + lt_prog_compiler_pic='-PIC' + lt_prog_compiler_static='-Bstatic' + ;; + + sysv4 | sysv4.2uw2* | sysv4.3*) + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_pic='-KPIC' + lt_prog_compiler_static='-Bstatic' + ;; + + sysv4*MP*) + if test -d /usr/nec ;then + lt_prog_compiler_pic='-Kconform_pic' + lt_prog_compiler_static='-Bstatic' + fi + ;; + + sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_pic='-KPIC' + lt_prog_compiler_static='-Bstatic' + ;; + + unicos*) + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_can_build_shared=no + ;; + + uts4*) + lt_prog_compiler_pic='-pic' + lt_prog_compiler_static='-Bstatic' + ;; + + *) + lt_prog_compiler_can_build_shared=no + ;; + esac + fi + +case $host_os in + # For platforms which do not support PIC, -DPIC is meaningless: + *djgpp*) + lt_prog_compiler_pic= + ;; + *) + lt_prog_compiler_pic="$lt_prog_compiler_pic@&t@ -DPIC" + ;; +esac + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $compiler option to produce PIC" >&5 +$as_echo_n "checking for $compiler option to produce PIC... " >&6; } +if ${lt_cv_prog_compiler_pic+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_prog_compiler_pic=$lt_prog_compiler_pic +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic" >&5 +$as_echo "$lt_cv_prog_compiler_pic" >&6; } +lt_prog_compiler_pic=$lt_cv_prog_compiler_pic + +# +# Check to make sure the PIC flag actually works. +# +if test -n "$lt_prog_compiler_pic"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler PIC flag $lt_prog_compiler_pic works" >&5 +$as_echo_n "checking if $compiler PIC flag $lt_prog_compiler_pic works... " >&6; } +if ${lt_cv_prog_compiler_pic_works+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_prog_compiler_pic_works=no + ac_outfile=conftest.$ac_objext + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + lt_compiler_flag="$lt_prog_compiler_pic@&t@ -DPIC" + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + # The option is referenced via a variable to avoid confusing sed. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ + -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) + (eval "$lt_compile" 2>conftest.err) + ac_status=$? + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + if (exit $ac_status) && test -s "$ac_outfile"; then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings other than the usual output. + $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp + $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 + if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then + lt_cv_prog_compiler_pic_works=yes + fi + fi + $RM conftest* + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic_works" >&5 +$as_echo "$lt_cv_prog_compiler_pic_works" >&6; } + +if test x"$lt_cv_prog_compiler_pic_works" = xyes; then + case $lt_prog_compiler_pic in + "" | " "*) ;; + *) lt_prog_compiler_pic=" $lt_prog_compiler_pic" ;; + esac +else + lt_prog_compiler_pic= + lt_prog_compiler_can_build_shared=no +fi + +fi + + + + + + + + + + + +# +# Check to make sure the static flag actually works. +# +wl=$lt_prog_compiler_wl eval lt_tmp_static_flag=\"$lt_prog_compiler_static\" +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler static flag $lt_tmp_static_flag works" >&5 +$as_echo_n "checking if $compiler static flag $lt_tmp_static_flag works... " >&6; } +if ${lt_cv_prog_compiler_static_works+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_prog_compiler_static_works=no + save_LDFLAGS="$LDFLAGS" + LDFLAGS="$LDFLAGS $lt_tmp_static_flag" + echo "$lt_simple_link_test_code" > conftest.$ac_ext + if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then + # The linker can only warn and ignore the option if not recognized + # So say no if there are warnings + if test -s conftest.err; then + # Append any errors to the config.log. + cat conftest.err 1>&5 + $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp + $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 + if diff conftest.exp conftest.er2 >/dev/null; then + lt_cv_prog_compiler_static_works=yes + fi + else + lt_cv_prog_compiler_static_works=yes + fi + fi + $RM -r conftest* + LDFLAGS="$save_LDFLAGS" + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_static_works" >&5 +$as_echo "$lt_cv_prog_compiler_static_works" >&6; } + +if test x"$lt_cv_prog_compiler_static_works" = xyes; then + : +else + lt_prog_compiler_static= +fi + + + + + + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5 +$as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; } +if ${lt_cv_prog_compiler_c_o+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_prog_compiler_c_o=no + $RM -r conftest 2>/dev/null + mkdir conftest + cd conftest + mkdir out + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + + lt_compiler_flag="-o out/conftest2.$ac_objext" + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ + -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) + (eval "$lt_compile" 2>out/conftest.err) + ac_status=$? + cat out/conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + if (exit $ac_status) && test -s out/conftest2.$ac_objext + then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings + $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp + $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 + if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then + lt_cv_prog_compiler_c_o=yes + fi + fi + chmod u+w . 2>&5 + $RM conftest* + # SGI C++ compiler will create directory out/ii_files/ for + # template instantiation + test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files + $RM out/* && rmdir out + cd .. + $RM -r conftest + $RM conftest* + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o" >&5 +$as_echo "$lt_cv_prog_compiler_c_o" >&6; } + + + + + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5 +$as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; } +if ${lt_cv_prog_compiler_c_o+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_prog_compiler_c_o=no + $RM -r conftest 2>/dev/null + mkdir conftest + cd conftest + mkdir out + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + + lt_compiler_flag="-o out/conftest2.$ac_objext" + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ + -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) + (eval "$lt_compile" 2>out/conftest.err) + ac_status=$? + cat out/conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + if (exit $ac_status) && test -s out/conftest2.$ac_objext + then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings + $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp + $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 + if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then + lt_cv_prog_compiler_c_o=yes + fi + fi + chmod u+w . 2>&5 + $RM conftest* + # SGI C++ compiler will create directory out/ii_files/ for + # template instantiation + test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files + $RM out/* && rmdir out + cd .. + $RM -r conftest + $RM conftest* + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o" >&5 +$as_echo "$lt_cv_prog_compiler_c_o" >&6; } + + + + +hard_links="nottested" +if test "$lt_cv_prog_compiler_c_o" = no && test "$need_locks" != no; then + # do not overwrite the value of need_locks provided by the user + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if we can lock with hard links" >&5 +$as_echo_n "checking if we can lock with hard links... " >&6; } + hard_links=yes + $RM conftest* + ln conftest.a conftest.b 2>/dev/null && hard_links=no + touch conftest.a + ln conftest.a conftest.b 2>&5 || hard_links=no + ln conftest.a conftest.b 2>/dev/null && hard_links=no + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $hard_links" >&5 +$as_echo "$hard_links" >&6; } + if test "$hard_links" = no; then + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&5 +$as_echo "$as_me: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&2;} + need_locks=warn + fi +else + need_locks=no +fi + + + + + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $compiler linker ($LD) supports shared libraries" >&5 +$as_echo_n "checking whether the $compiler linker ($LD) supports shared libraries... " >&6; } + + runpath_var= + allow_undefined_flag= + always_export_symbols=no + archive_cmds= + archive_expsym_cmds= + compiler_needs_object=no + enable_shared_with_static_runtimes=no + export_dynamic_flag_spec= + export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' + hardcode_automatic=no + hardcode_direct=no + hardcode_direct_absolute=no + hardcode_libdir_flag_spec= + hardcode_libdir_separator= + hardcode_minus_L=no + hardcode_shlibpath_var=unsupported + inherit_rpath=no + link_all_deplibs=unknown + module_cmds= + module_expsym_cmds= + old_archive_from_new_cmds= + old_archive_from_expsyms_cmds= + thread_safe_flag_spec= + whole_archive_flag_spec= + # include_expsyms should be a list of space-separated symbols to be *always* + # included in the symbol list + include_expsyms= + # exclude_expsyms can be an extended regexp of symbols to exclude + # it will be wrapped by ` (' and `)$', so one must not match beginning or + # end of line. Example: `a|bc|.*d.*' will exclude the symbols `a' and `bc', + # as well as any symbol that contains `d'. + exclude_expsyms='_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*' + # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out + # platforms (ab)use it in PIC code, but their linkers get confused if + # the symbol is explicitly referenced. Since portable code cannot + # rely on this symbol name, it's probably fine to never include it in + # preloaded symbol tables. + # Exclude shared library initialization/finalization symbols. + extract_expsyms_cmds= + + case $host_os in + cygwin* | mingw* | pw32* | cegcc*) + # FIXME: the MSVC++ port hasn't been tested in a loooong time + # When not using gcc, we currently assume that we are using + # Microsoft Visual C++. + if test "$GCC" != yes; then + with_gnu_ld=no + fi + ;; + interix*) + # we just hope/assume this is gcc and not c89 (= MSVC++) + with_gnu_ld=yes + ;; + openbsd*) + with_gnu_ld=no + ;; + linux* | k*bsd*-gnu | gnu*) + link_all_deplibs=no + ;; + esac + + ld_shlibs=yes + + # On some targets, GNU ld is compatible enough with the native linker + # that we're better off using the native interface for both. + lt_use_gnu_ld_interface=no + if test "$with_gnu_ld" = yes; then + case $host_os in + aix*) + # The AIX port of GNU ld has always aspired to compatibility + # with the native linker. However, as the warning in the GNU ld + # block says, versions before 2.19.5* couldn't really create working + # shared libraries, regardless of the interface used. + case `$LD -v 2>&1` in + *\ \(GNU\ Binutils\)\ 2.19.5*) ;; + *\ \(GNU\ Binutils\)\ 2.[2-9]*) ;; + *\ \(GNU\ Binutils\)\ [3-9]*) ;; + *) + lt_use_gnu_ld_interface=yes + ;; + esac + ;; + *) + lt_use_gnu_ld_interface=yes + ;; + esac + fi + + if test "$lt_use_gnu_ld_interface" = yes; then + # If archive_cmds runs LD, not CC, wlarc should be empty + wlarc='${wl}' + + # Set some defaults for GNU ld with shared library support. These + # are reset later if shared libraries are not supported. Putting them + # here allows them to be overridden if necessary. + runpath_var=LD_RUN_PATH + hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' + export_dynamic_flag_spec='${wl}--export-dynamic' + # ancient GNU ld didn't support --whole-archive et. al. + if $LD --help 2>&1 | $GREP 'no-whole-archive' > /dev/null; then + whole_archive_flag_spec="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' + else + whole_archive_flag_spec= + fi + supports_anon_versioning=no + case `$LD -v 2>&1` in + *GNU\ gold*) supports_anon_versioning=yes ;; + *\ [01].* | *\ 2.[0-9].* | *\ 2.10.*) ;; # catch versions < 2.11 + *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ... + *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ... + *\ 2.11.*) ;; # other 2.11 versions + *) supports_anon_versioning=yes ;; + esac + + # See if GNU ld supports shared libraries. + case $host_os in + aix[3-9]*) + # On AIX/PPC, the GNU linker is very broken + if test "$host_cpu" != ia64; then + ld_shlibs=no + cat <<_LT_EOF 1>&2 + +*** Warning: the GNU linker, at least up to release 2.19, is reported +*** to be unable to reliably create shared libraries on AIX. +*** Therefore, libtool is disabling shared libraries support. If you +*** really care for shared libraries, you may want to install binutils +*** 2.20 or above, or modify your PATH so that a non-GNU linker is found. +*** You will then need to restart the configuration process. + +_LT_EOF + fi + ;; + + amigaos*) + case $host_cpu in + powerpc) + # see comment about AmigaOS4 .so support + archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + archive_expsym_cmds='' + ;; + m68k) + archive_cmds='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' + hardcode_libdir_flag_spec='-L$libdir' + hardcode_minus_L=yes + ;; + esac + ;; + + beos*) + if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then + allow_undefined_flag=unsupported + # Joseph Beckenbach says some releases of gcc + # support --undefined. This deserves some investigation. FIXME + archive_cmds='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + else + ld_shlibs=no + fi + ;; + + cygwin* | mingw* | pw32* | cegcc*) + # _LT_TAGVAR(hardcode_libdir_flag_spec, ) is actually meaningless, + # as there is no search path for DLLs. + hardcode_libdir_flag_spec='-L$libdir' + export_dynamic_flag_spec='${wl}--export-all-symbols' + allow_undefined_flag=unsupported + always_export_symbols=no + enable_shared_with_static_runtimes=yes + export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1 DATA/;s/^.*[ ]__nm__\([^ ]*\)[ ][^ ]*/\1 DATA/;/^I[ ]/d;/^[AITW][ ]/s/.* //'\'' | sort | uniq > $export_symbols' + exclude_expsyms='[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname' + + if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then + archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' + # If the export-symbols file already is a .def file (1st line + # is EXPORTS), use it as is; otherwise, prepend... + archive_expsym_cmds='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then + cp $export_symbols $output_objdir/$soname.def; + else + echo EXPORTS > $output_objdir/$soname.def; + cat $export_symbols >> $output_objdir/$soname.def; + fi~ + $CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' + else + ld_shlibs=no + fi + ;; + + haiku*) + archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + link_all_deplibs=yes + ;; + + interix[3-9]*) + hardcode_direct=no + hardcode_shlibpath_var=no + hardcode_libdir_flag_spec='${wl}-rpath,$libdir' + export_dynamic_flag_spec='${wl}-E' + # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. + # Instead, shared libraries are loaded at an image base (0x10000000 by + # default) and relocated if they conflict, which is a slow very memory + # consuming and fragmenting process. To avoid this, we pick a random, + # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link + # time. Moving up from 0x10000000 also allows more sbrk(2) space. + archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' + archive_expsym_cmds='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' + ;; + + gnu* | linux* | tpf* | k*bsd*-gnu | kopensolaris*-gnu) + tmp_diet=no + if test "$host_os" = linux-dietlibc; then + case $cc_basename in + diet\ *) tmp_diet=yes;; # linux-dietlibc with static linking (!diet-dyn) + esac + fi + if $LD --help 2>&1 | $EGREP ': supported targets:.* elf' > /dev/null \ + && test "$tmp_diet" = no + then + tmp_addflag=' $pic_flag' + tmp_sharedflag='-shared' + case $cc_basename,$host_cpu in + pgcc*) # Portland Group C compiler + whole_archive_flag_spec='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' + tmp_addflag=' $pic_flag' + ;; + pgf77* | pgf90* | pgf95* | pgfortran*) + # Portland Group f77 and f90 compilers + whole_archive_flag_spec='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' + tmp_addflag=' $pic_flag -Mnomain' ;; + ecc*,ia64* | icc*,ia64*) # Intel C compiler on ia64 + tmp_addflag=' -i_dynamic' ;; + efc*,ia64* | ifort*,ia64*) # Intel Fortran compiler on ia64 + tmp_addflag=' -i_dynamic -nofor_main' ;; + ifc* | ifort*) # Intel Fortran compiler + tmp_addflag=' -nofor_main' ;; + lf95*) # Lahey Fortran 8.1 + whole_archive_flag_spec= + tmp_sharedflag='--shared' ;; + xl[cC]* | bgxl[cC]* | mpixl[cC]*) # IBM XL C 8.0 on PPC (deal with xlf below) + tmp_sharedflag='-qmkshrobj' + tmp_addflag= ;; + nvcc*) # Cuda Compiler Driver 2.2 + whole_archive_flag_spec='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' + compiler_needs_object=yes + ;; + esac + case `$CC -V 2>&1 | sed 5q` in + *Sun\ C*) # Sun C 5.9 + whole_archive_flag_spec='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' + compiler_needs_object=yes + tmp_sharedflag='-G' ;; + *Sun\ F*) # Sun Fortran 8.3 + tmp_sharedflag='-G' ;; + esac + archive_cmds='$CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + + if test "x$supports_anon_versioning" = xyes; then + archive_expsym_cmds='echo "{ global:" > $output_objdir/$libname.ver~ + cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ + echo "local: *; };" >> $output_objdir/$libname.ver~ + $CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib' + fi + + case $cc_basename in + xlf* | bgf* | bgxlf* | mpixlf*) + # IBM XL Fortran 10.1 on PPC cannot create shared libs itself + whole_archive_flag_spec='--whole-archive$convenience --no-whole-archive' + hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' + archive_cmds='$LD -shared $libobjs $deplibs $linker_flags -soname $soname -o $lib' + if test "x$supports_anon_versioning" = xyes; then + archive_expsym_cmds='echo "{ global:" > $output_objdir/$libname.ver~ + cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ + echo "local: *; };" >> $output_objdir/$libname.ver~ + $LD -shared $libobjs $deplibs $linker_flags -soname $soname -version-script $output_objdir/$libname.ver -o $lib' + fi + ;; + esac + else + ld_shlibs=no + fi + ;; + + netbsd* | netbsdelf*-gnu) + if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then + archive_cmds='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib' + wlarc= + else + archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + fi + ;; + + solaris*) + if $LD -v 2>&1 | $GREP 'BFD 2\.8' > /dev/null; then + ld_shlibs=no + cat <<_LT_EOF 1>&2 + +*** Warning: The releases 2.8.* of the GNU linker cannot reliably +*** create shared libraries on Solaris systems. Therefore, libtool +*** is disabling shared libraries support. We urge you to upgrade GNU +*** binutils to release 2.9.1 or newer. Another option is to modify +*** your PATH or compiler configuration so that the native linker is +*** used, and then restart. + +_LT_EOF + elif $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then + archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + else + ld_shlibs=no + fi + ;; + + sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*) + case `$LD -v 2>&1` in + *\ [01].* | *\ 2.[0-9].* | *\ 2.1[0-5].*) + ld_shlibs=no + cat <<_LT_EOF 1>&2 + +*** Warning: Releases of the GNU linker prior to 2.16.91.0.3 can not +*** reliably create shared libraries on SCO systems. Therefore, libtool +*** is disabling shared libraries support. We urge you to upgrade GNU +*** binutils to release 2.16.91.0.3 or newer. Another option is to modify +*** your PATH or compiler configuration so that the native linker is +*** used, and then restart. + +_LT_EOF + ;; + *) + # For security reasons, it is highly recommended that you always + # use absolute paths for naming shared libraries, and exclude the + # DT_RUNPATH tag from executables and libraries. But doing so + # requires that you compile everything twice, which is a pain. + if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then + hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' + archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + else + ld_shlibs=no + fi + ;; + esac + ;; + + sunos4*) + archive_cmds='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags' + wlarc= + hardcode_direct=yes + hardcode_shlibpath_var=no + ;; + + *) + if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then + archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + else + ld_shlibs=no + fi + ;; + esac + + if test "$ld_shlibs" = no; then + runpath_var= + hardcode_libdir_flag_spec= + export_dynamic_flag_spec= + whole_archive_flag_spec= + fi + else + # PORTME fill in a description of your system's linker (not GNU ld) + case $host_os in + aix3*) + allow_undefined_flag=unsupported + always_export_symbols=yes + archive_expsym_cmds='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname' + # Note: this linker hardcodes the directories in LIBPATH if there + # are no directories specified by -L. + hardcode_minus_L=yes + if test "$GCC" = yes && test -z "$lt_prog_compiler_static"; then + # Neither direct hardcoding nor static linking is supported with a + # broken collect2. + hardcode_direct=unsupported + fi + ;; + + aix[4-9]*) + if test "$host_cpu" = ia64; then + # On IA64, the linker does run time linking by default, so we don't + # have to do anything special. + aix_use_runtimelinking=no + exp_sym_flag='-Bexport' + no_entry_flag="" + else + # If we're using GNU nm, then we don't want the "-C" option. + # -C means demangle to AIX nm, but means don't demangle with GNU nm + # Also, AIX nm treats weak defined symbols like other global + # defined symbols, whereas GNU nm marks them as "W". + if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then + export_symbols_cmds='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && (substr(\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' + else + export_symbols_cmds='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && (substr(\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' + fi + aix_use_runtimelinking=no + + # Test if we are trying to use run time linking or normal + # AIX style linking. If -brtl is somewhere in LDFLAGS, we + # need to do runtime linking. + case $host_os in aix4.[23]|aix4.[23].*|aix[5-9]*) + for ld_flag in $LDFLAGS; do + if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then + aix_use_runtimelinking=yes + break + fi + done + ;; + esac + + exp_sym_flag='-bexport' + no_entry_flag='-bnoentry' + fi + + # When large executables or shared objects are built, AIX ld can + # have problems creating the table of contents. If linking a library + # or program results in "error TOC overflow" add -mminimal-toc to + # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not + # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. + + archive_cmds='' + hardcode_direct=yes + hardcode_direct_absolute=yes + hardcode_libdir_separator=':' + link_all_deplibs=yes + file_list_spec='${wl}-f,' + + if test "$GCC" = yes; then + case $host_os in aix4.[012]|aix4.[012].*) + # We only want to do this on AIX 4.2 and lower, the check + # below for broken collect2 doesn't work under 4.3+ + collect2name=`${CC} -print-prog-name=collect2` + if test -f "$collect2name" && + strings "$collect2name" | $GREP resolve_lib_name >/dev/null + then + # We have reworked collect2 + : + else + # We have old collect2 + hardcode_direct=unsupported + # It fails to find uninstalled libraries when the uninstalled + # path is not listed in the libpath. Setting hardcode_minus_L + # to unsupported forces relinking + hardcode_minus_L=yes + hardcode_libdir_flag_spec='-L$libdir' + hardcode_libdir_separator= + fi + ;; + esac + shared_flag='-shared' + if test "$aix_use_runtimelinking" = yes; then + shared_flag="$shared_flag "'${wl}-G' + fi + link_all_deplibs=no + else + # not using gcc + if test "$host_cpu" = ia64; then + # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release + # chokes on -Wl,-G. The following line is correct: + shared_flag='-G' + else + if test "$aix_use_runtimelinking" = yes; then + shared_flag='${wl}-G' + else + shared_flag='${wl}-bM:SRE' + fi + fi + fi + + export_dynamic_flag_spec='${wl}-bexpall' + # It seems that -bexpall does not export symbols beginning with + # underscore (_), so it is better to generate a list of symbols to export. + always_export_symbols=yes + if test "$aix_use_runtimelinking" = yes; then + # Warning - without using the other runtime loading flags (-brtl), + # -berok will link without error, but may produce a broken library. + allow_undefined_flag='-berok' + # Determine the default libpath from the value encoded in an + # empty executable. + if test "${lt_cv_aix_libpath+set}" = set; then + aix_libpath=$lt_cv_aix_libpath +else + if ${lt_cv_aix_libpath_+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + + lt_aix_libpath_sed=' + /Import File Strings/,/^$/ { + /^0/ { + s/^0 *\([^ ]*\) *$/\1/ + p + } + }' + lt_cv_aix_libpath_=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` + # Check for a 64-bit object if we didn't find anything. + if test -z "$lt_cv_aix_libpath_"; then + lt_cv_aix_libpath_=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` + fi +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + if test -z "$lt_cv_aix_libpath_"; then + lt_cv_aix_libpath_="/usr/lib:/lib" + fi + +fi + + aix_libpath=$lt_cv_aix_libpath_ +fi + + hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath" + archive_expsym_cmds='$CC -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then func_echo_all "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag" + else + if test "$host_cpu" = ia64; then + hardcode_libdir_flag_spec='${wl}-R $libdir:/usr/lib:/lib' + allow_undefined_flag="-z nodefs" + archive_expsym_cmds="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols" + else + # Determine the default libpath from the value encoded in an + # empty executable. + if test "${lt_cv_aix_libpath+set}" = set; then + aix_libpath=$lt_cv_aix_libpath +else + if ${lt_cv_aix_libpath_+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + + lt_aix_libpath_sed=' + /Import File Strings/,/^$/ { + /^0/ { + s/^0 *\([^ ]*\) *$/\1/ + p + } + }' + lt_cv_aix_libpath_=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` + # Check for a 64-bit object if we didn't find anything. + if test -z "$lt_cv_aix_libpath_"; then + lt_cv_aix_libpath_=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` + fi +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + if test -z "$lt_cv_aix_libpath_"; then + lt_cv_aix_libpath_="/usr/lib:/lib" + fi + +fi + + aix_libpath=$lt_cv_aix_libpath_ +fi + + hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath" + # Warning - without using the other run time loading flags, + # -berok will link without error, but may produce a broken library. + no_undefined_flag=' ${wl}-bernotok' + allow_undefined_flag=' ${wl}-berok' + if test "$with_gnu_ld" = yes; then + # We only use this code for GNU lds that support --whole-archive. + whole_archive_flag_spec='${wl}--whole-archive$convenience ${wl}--no-whole-archive' + else + # Exported symbols can be pulled into shared objects from archives + whole_archive_flag_spec='$convenience' + fi + archive_cmds_need_lc=yes + # This is similar to how AIX traditionally builds its shared libraries. + archive_expsym_cmds="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' + fi + fi + ;; + + amigaos*) + case $host_cpu in + powerpc) + # see comment about AmigaOS4 .so support + archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + archive_expsym_cmds='' + ;; + m68k) + archive_cmds='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' + hardcode_libdir_flag_spec='-L$libdir' + hardcode_minus_L=yes + ;; + esac + ;; + + bsdi[45]*) + export_dynamic_flag_spec=-rdynamic + ;; + + cygwin* | mingw* | pw32* | cegcc*) + # When not using gcc, we currently assume that we are using + # Microsoft Visual C++. + # hardcode_libdir_flag_spec is actually meaningless, as there is + # no search path for DLLs. + case $cc_basename in + cl*) + # Native MSVC + hardcode_libdir_flag_spec=' ' + allow_undefined_flag=unsupported + always_export_symbols=yes + file_list_spec='@' + # Tell ltmain to make .lib files, not .a files. + libext=lib + # Tell ltmain to make .dll files, not .so files. + shrext_cmds=".dll" + # FIXME: Setting linknames here is a bad hack. + archive_cmds='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-dll~linknames=' + archive_expsym_cmds='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then + sed -n -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' -e '1\\\!p' < $export_symbols > $output_objdir/$soname.exp; + else + sed -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' < $export_symbols > $output_objdir/$soname.exp; + fi~ + $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~ + linknames=' + # The linker will not automatically build a static lib if we build a DLL. + # _LT_TAGVAR(old_archive_from_new_cmds, )='true' + enable_shared_with_static_runtimes=yes + exclude_expsyms='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*' + export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1,DATA/'\'' | $SED -e '\''/^[AITW][ ]/s/.*[ ]//'\'' | sort | uniq > $export_symbols' + # Don't use ranlib + old_postinstall_cmds='chmod 644 $oldlib' + postlink_cmds='lt_outputfile="@OUTPUT@"~ + lt_tool_outputfile="@TOOL_OUTPUT@"~ + case $lt_outputfile in + *.exe|*.EXE) ;; + *) + lt_outputfile="$lt_outputfile.exe" + lt_tool_outputfile="$lt_tool_outputfile.exe" + ;; + esac~ + if test "$MANIFEST_TOOL" != ":" && test -f "$lt_outputfile.manifest"; then + $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1; + $RM "$lt_outputfile.manifest"; + fi' + ;; + *) + # Assume MSVC wrapper + hardcode_libdir_flag_spec=' ' + allow_undefined_flag=unsupported + # Tell ltmain to make .lib files, not .a files. + libext=lib + # Tell ltmain to make .dll files, not .so files. + shrext_cmds=".dll" + # FIXME: Setting linknames here is a bad hack. + archive_cmds='$CC -o $lib $libobjs $compiler_flags `func_echo_all "$deplibs" | $SED '\''s/ -lc$//'\''` -link -dll~linknames=' + # The linker will automatically build a .lib file if we build a DLL. + old_archive_from_new_cmds='true' + # FIXME: Should let the user specify the lib program. + old_archive_cmds='lib -OUT:$oldlib$oldobjs$old_deplibs' + enable_shared_with_static_runtimes=yes + ;; + esac + ;; + + darwin* | rhapsody*) + + + archive_cmds_need_lc=no + hardcode_direct=no + hardcode_automatic=yes + hardcode_shlibpath_var=unsupported + if test "$lt_cv_ld_force_load" = "yes"; then + whole_archive_flag_spec='`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience ${wl}-force_load,$conv\"; done; func_echo_all \"$new_convenience\"`' + + else + whole_archive_flag_spec='' + fi + link_all_deplibs=yes + allow_undefined_flag="$_lt_dar_allow_undefined" + case $cc_basename in + ifort*) _lt_dar_can_shared=yes ;; + *) _lt_dar_can_shared=$GCC ;; + esac + if test "$_lt_dar_can_shared" = "yes"; then + output_verbose_link_cmd=func_echo_all + archive_cmds="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod${_lt_dsymutil}" + module_cmds="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dsymutil}" + archive_expsym_cmds="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring ${_lt_dar_single_mod}${_lt_dar_export_syms}${_lt_dsymutil}" + module_expsym_cmds="sed -e 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dar_export_syms}${_lt_dsymutil}" + + else + ld_shlibs=no + fi + + ;; + + dgux*) + archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_libdir_flag_spec='-L$libdir' + hardcode_shlibpath_var=no + ;; + + # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor + # support. Future versions do this automatically, but an explicit c++rt0.o + # does not break anything, and helps significantly (at the cost of a little + # extra space). + freebsd2.2*) + archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o' + hardcode_libdir_flag_spec='-R$libdir' + hardcode_direct=yes + hardcode_shlibpath_var=no + ;; + + # Unfortunately, older versions of FreeBSD 2 do not have this feature. + freebsd2.*) + archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' + hardcode_direct=yes + hardcode_minus_L=yes + hardcode_shlibpath_var=no + ;; + + # FreeBSD 3 and greater uses gcc -shared to do shared libraries. + freebsd* | dragonfly*) + archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' + hardcode_libdir_flag_spec='-R$libdir' + hardcode_direct=yes + hardcode_shlibpath_var=no + ;; + + hpux9*) + if test "$GCC" = yes; then + archive_cmds='$RM $output_objdir/$soname~$CC -shared $pic_flag ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' + else + archive_cmds='$RM $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' + fi + hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' + hardcode_libdir_separator=: + hardcode_direct=yes + + # hardcode_minus_L: Not really in the search PATH, + # but as the default location of the library. + hardcode_minus_L=yes + export_dynamic_flag_spec='${wl}-E' + ;; + + hpux10*) + if test "$GCC" = yes && test "$with_gnu_ld" = no; then + archive_cmds='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' + else + archive_cmds='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' + fi + if test "$with_gnu_ld" = no; then + hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' + hardcode_libdir_separator=: + hardcode_direct=yes + hardcode_direct_absolute=yes + export_dynamic_flag_spec='${wl}-E' + # hardcode_minus_L: Not really in the search PATH, + # but as the default location of the library. + hardcode_minus_L=yes + fi + ;; + + hpux11*) + if test "$GCC" = yes && test "$with_gnu_ld" = no; then + case $host_cpu in + hppa*64*) + archive_cmds='$CC -shared ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + ia64*) + archive_cmds='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' + ;; + *) + archive_cmds='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' + ;; + esac + else + case $host_cpu in + hppa*64*) + archive_cmds='$CC -b ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + ia64*) + archive_cmds='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' + ;; + *) + + # Older versions of the 11.00 compiler do not understand -b yet + # (HP92453-01 A.11.01.20 doesn't, HP92453-01 B.11.X.35175-35176.GP does) + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $CC understands -b" >&5 +$as_echo_n "checking if $CC understands -b... " >&6; } +if ${lt_cv_prog_compiler__b+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_prog_compiler__b=no + save_LDFLAGS="$LDFLAGS" + LDFLAGS="$LDFLAGS -b" + echo "$lt_simple_link_test_code" > conftest.$ac_ext + if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then + # The linker can only warn and ignore the option if not recognized + # So say no if there are warnings + if test -s conftest.err; then + # Append any errors to the config.log. + cat conftest.err 1>&5 + $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp + $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 + if diff conftest.exp conftest.er2 >/dev/null; then + lt_cv_prog_compiler__b=yes + fi + else + lt_cv_prog_compiler__b=yes + fi + fi + $RM -r conftest* + LDFLAGS="$save_LDFLAGS" + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler__b" >&5 +$as_echo "$lt_cv_prog_compiler__b" >&6; } + +if test x"$lt_cv_prog_compiler__b" = xyes; then + archive_cmds='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' +else + archive_cmds='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' +fi + + ;; + esac + fi + if test "$with_gnu_ld" = no; then + hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' + hardcode_libdir_separator=: + + case $host_cpu in + hppa*64*|ia64*) + hardcode_direct=no + hardcode_shlibpath_var=no + ;; + *) + hardcode_direct=yes + hardcode_direct_absolute=yes + export_dynamic_flag_spec='${wl}-E' + + # hardcode_minus_L: Not really in the search PATH, + # but as the default location of the library. + hardcode_minus_L=yes + ;; + esac + fi + ;; + + irix5* | irix6* | nonstopux*) + if test "$GCC" = yes; then + archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + # Try to use the -exported_symbol ld option, if it does not + # work, assume that -exports_file does not work either and + # implicitly export all symbols. + # This should be the same for all languages, so no per-tag cache variable. + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $host_os linker accepts -exported_symbol" >&5 +$as_echo_n "checking whether the $host_os linker accepts -exported_symbol... " >&6; } +if ${lt_cv_irix_exported_symbol+:} false; then : + $as_echo_n "(cached) " >&6 +else + save_LDFLAGS="$LDFLAGS" + LDFLAGS="$LDFLAGS -shared ${wl}-exported_symbol ${wl}foo ${wl}-update_registry ${wl}/dev/null" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +int foo (void) { return 0; } +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + lt_cv_irix_exported_symbol=yes +else + lt_cv_irix_exported_symbol=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + LDFLAGS="$save_LDFLAGS" +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_irix_exported_symbol" >&5 +$as_echo "$lt_cv_irix_exported_symbol" >&6; } + if test "$lt_cv_irix_exported_symbol" = yes; then + archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations ${wl}-exports_file ${wl}$export_symbols -o $lib' + fi + else + archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' + archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -exports_file $export_symbols -o $lib' + fi + archive_cmds_need_lc='no' + hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' + hardcode_libdir_separator=: + inherit_rpath=yes + link_all_deplibs=yes + ;; + + netbsd* | netbsdelf*-gnu) + if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then + archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' # a.out + else + archive_cmds='$LD -shared -o $lib $libobjs $deplibs $linker_flags' # ELF + fi + hardcode_libdir_flag_spec='-R$libdir' + hardcode_direct=yes + hardcode_shlibpath_var=no + ;; + + newsos6) + archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_direct=yes + hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' + hardcode_libdir_separator=: + hardcode_shlibpath_var=no + ;; + + *nto* | *qnx*) + ;; + + openbsd*) + if test -f /usr/libexec/ld.so; then + hardcode_direct=yes + hardcode_shlibpath_var=no + hardcode_direct_absolute=yes + if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then + archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-retain-symbols-file,$export_symbols' + hardcode_libdir_flag_spec='${wl}-rpath,$libdir' + export_dynamic_flag_spec='${wl}-E' + else + case $host_os in + openbsd[01].* | openbsd2.[0-7] | openbsd2.[0-7].*) + archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' + hardcode_libdir_flag_spec='-R$libdir' + ;; + *) + archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' + hardcode_libdir_flag_spec='${wl}-rpath,$libdir' + ;; + esac + fi + else + ld_shlibs=no + fi + ;; + + os2*) + hardcode_libdir_flag_spec='-L$libdir' + hardcode_minus_L=yes + allow_undefined_flag=unsupported + archive_cmds='$ECHO "LIBRARY $libname INITINSTANCE" > $output_objdir/$libname.def~$ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~echo DATA >> $output_objdir/$libname.def~echo " SINGLE NONSHARED" >> $output_objdir/$libname.def~echo EXPORTS >> $output_objdir/$libname.def~emxexp $libobjs >> $output_objdir/$libname.def~$CC -Zdll -Zcrtdll -o $lib $libobjs $deplibs $compiler_flags $output_objdir/$libname.def' + old_archive_from_new_cmds='emximp -o $output_objdir/$libname.a $output_objdir/$libname.def' + ;; + + osf3*) + if test "$GCC" = yes; then + allow_undefined_flag=' ${wl}-expect_unresolved ${wl}\*' + archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + else + allow_undefined_flag=' -expect_unresolved \*' + archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' + fi + archive_cmds_need_lc='no' + hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' + hardcode_libdir_separator=: + ;; + + osf4* | osf5*) # as osf3* with the addition of -msym flag + if test "$GCC" = yes; then + allow_undefined_flag=' ${wl}-expect_unresolved ${wl}\*' + archive_cmds='$CC -shared${allow_undefined_flag} $pic_flag $libobjs $deplibs $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' + else + allow_undefined_flag=' -expect_unresolved \*' + archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' + archive_expsym_cmds='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; printf "%s\\n" "-hidden">> $lib.exp~ + $CC -shared${allow_undefined_flag} ${wl}-input ${wl}$lib.exp $compiler_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib~$RM $lib.exp' + + # Both c and cxx compiler support -rpath directly + hardcode_libdir_flag_spec='-rpath $libdir' + fi + archive_cmds_need_lc='no' + hardcode_libdir_separator=: + ;; + + solaris*) + no_undefined_flag=' -z defs' + if test "$GCC" = yes; then + wlarc='${wl}' + archive_cmds='$CC -shared $pic_flag ${wl}-z ${wl}text ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ + $CC -shared $pic_flag ${wl}-z ${wl}text ${wl}-M ${wl}$lib.exp ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' + else + case `$CC -V 2>&1` in + *"Compilers 5.0"*) + wlarc='' + archive_cmds='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags' + archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ + $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$RM $lib.exp' + ;; + *) + wlarc='${wl}' + archive_cmds='$CC -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ + $CC -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' + ;; + esac + fi + hardcode_libdir_flag_spec='-R$libdir' + hardcode_shlibpath_var=no + case $host_os in + solaris2.[0-5] | solaris2.[0-5].*) ;; + *) + # The compiler driver will combine and reorder linker options, + # but understands `-z linker_flag'. GCC discards it without `$wl', + # but is careful enough not to reorder. + # Supported since Solaris 2.6 (maybe 2.5.1?) + if test "$GCC" = yes; then + whole_archive_flag_spec='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract' + else + whole_archive_flag_spec='-z allextract$convenience -z defaultextract' + fi + ;; + esac + link_all_deplibs=yes + ;; + + sunos4*) + if test "x$host_vendor" = xsequent; then + # Use $CC to link under sequent, because it throws in some extra .o + # files that make .init and .fini sections work. + archive_cmds='$CC -G ${wl}-h $soname -o $lib $libobjs $deplibs $compiler_flags' + else + archive_cmds='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags' + fi + hardcode_libdir_flag_spec='-L$libdir' + hardcode_direct=yes + hardcode_minus_L=yes + hardcode_shlibpath_var=no + ;; + + sysv4) + case $host_vendor in + sni) + archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_direct=yes # is this really true??? + ;; + siemens) + ## LD is ld it makes a PLAMLIB + ## CC just makes a GrossModule. + archive_cmds='$LD -G -o $lib $libobjs $deplibs $linker_flags' + reload_cmds='$CC -r -o $output$reload_objs' + hardcode_direct=no + ;; + motorola) + archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_direct=no #Motorola manual says yes, but my tests say they lie + ;; + esac + runpath_var='LD_RUN_PATH' + hardcode_shlibpath_var=no + ;; + + sysv4.3*) + archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_shlibpath_var=no + export_dynamic_flag_spec='-Bexport' + ;; + + sysv4*MP*) + if test -d /usr/nec; then + archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_shlibpath_var=no + runpath_var=LD_RUN_PATH + hardcode_runpath_var=yes + ld_shlibs=yes + fi + ;; + + sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7* | sco3.2v5.0.[024]*) + no_undefined_flag='${wl}-z,text' + archive_cmds_need_lc=no + hardcode_shlibpath_var=no + runpath_var='LD_RUN_PATH' + + if test "$GCC" = yes; then + archive_cmds='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + else + archive_cmds='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + fi + ;; + + sysv5* | sco3.2v5* | sco5v6*) + # Note: We can NOT use -z defs as we might desire, because we do not + # link with -lc, and that would cause any symbols used from libc to + # always be unresolved, which means just about no library would + # ever link correctly. If we're not using GNU ld we use -z text + # though, which does catch some bad symbols but isn't as heavy-handed + # as -z defs. + no_undefined_flag='${wl}-z,text' + allow_undefined_flag='${wl}-z,nodefs' + archive_cmds_need_lc=no + hardcode_shlibpath_var=no + hardcode_libdir_flag_spec='${wl}-R,$libdir' + hardcode_libdir_separator=':' + link_all_deplibs=yes + export_dynamic_flag_spec='${wl}-Bexport' + runpath_var='LD_RUN_PATH' + + if test "$GCC" = yes; then + archive_cmds='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + else + archive_cmds='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + fi + ;; + + uts4*) + archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_libdir_flag_spec='-L$libdir' + hardcode_shlibpath_var=no + ;; + + *) + ld_shlibs=no + ;; + esac + + if test x$host_vendor = xsni; then + case $host in + sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) + export_dynamic_flag_spec='${wl}-Blargedynsym' + ;; + esac + fi + fi + +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ld_shlibs" >&5 +$as_echo "$ld_shlibs" >&6; } +test "$ld_shlibs" = no && can_build_shared=no + +with_gnu_ld=$with_gnu_ld + + + + + + + + + + + + + + + +# +# Do we need to explicitly link libc? +# +case "x$archive_cmds_need_lc" in +x|xyes) + # Assume -lc should be added + archive_cmds_need_lc=yes + + if test "$enable_shared" = yes && test "$GCC" = yes; then + case $archive_cmds in + *'~'*) + # FIXME: we may have to deal with multi-command sequences. + ;; + '$CC '*) + # Test whether the compiler implicitly links with -lc since on some + # systems, -lgcc has to come before -lc. If gcc already passes -lc + # to ld, don't add -lc before -lgcc. + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether -lc should be explicitly linked in" >&5 +$as_echo_n "checking whether -lc should be explicitly linked in... " >&6; } +if ${lt_cv_archive_cmds_need_lc+:} false; then : + $as_echo_n "(cached) " >&6 +else + $RM conftest* + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } 2>conftest.err; then + soname=conftest + lib=conftest + libobjs=conftest.$ac_objext + deplibs= + wl=$lt_prog_compiler_wl + pic_flag=$lt_prog_compiler_pic + compiler_flags=-v + linker_flags=-v + verstring= + output_objdir=. + libname=conftest + lt_save_allow_undefined_flag=$allow_undefined_flag + allow_undefined_flag= + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$archive_cmds 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1\""; } >&5 + (eval $archive_cmds 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + then + lt_cv_archive_cmds_need_lc=no + else + lt_cv_archive_cmds_need_lc=yes + fi + allow_undefined_flag=$lt_save_allow_undefined_flag + else + cat conftest.err 1>&5 + fi + $RM conftest* + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_archive_cmds_need_lc" >&5 +$as_echo "$lt_cv_archive_cmds_need_lc" >&6; } + archive_cmds_need_lc=$lt_cv_archive_cmds_need_lc + ;; + esac + fi + ;; +esac + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking dynamic linker characteristics" >&5 +$as_echo_n "checking dynamic linker characteristics... " >&6; } + +if test "$GCC" = yes; then + case $host_os in + darwin*) lt_awk_arg="/^libraries:/,/LR/" ;; + *) lt_awk_arg="/^libraries:/" ;; + esac + case $host_os in + mingw* | cegcc*) lt_sed_strip_eq="s,=\([A-Za-z]:\),\1,g" ;; + *) lt_sed_strip_eq="s,=/,/,g" ;; + esac + lt_search_path_spec=`$CC -print-search-dirs | awk $lt_awk_arg | $SED -e "s/^libraries://" -e $lt_sed_strip_eq` + case $lt_search_path_spec in + *\;*) + # if the path contains ";" then we assume it to be the separator + # otherwise default to the standard path separator (i.e. ":") - it is + # assumed that no part of a normal pathname contains ";" but that should + # okay in the real world where ";" in dirpaths is itself problematic. + lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED 's/;/ /g'` + ;; + *) + lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED "s/$PATH_SEPARATOR/ /g"` + ;; + esac + # Ok, now we have the path, separated by spaces, we can step through it + # and add multilib dir if necessary. + lt_tmp_lt_search_path_spec= + lt_multi_os_dir=`$CC $CPPFLAGS $CFLAGS $LDFLAGS -print-multi-os-directory 2>/dev/null` + for lt_sys_path in $lt_search_path_spec; do + if test -d "$lt_sys_path/$lt_multi_os_dir"; then + lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path/$lt_multi_os_dir" + else + test -d "$lt_sys_path" && \ + lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path" + fi + done + lt_search_path_spec=`$ECHO "$lt_tmp_lt_search_path_spec" | awk ' +BEGIN {RS=" "; FS="/|\n";} { + lt_foo=""; + lt_count=0; + for (lt_i = NF; lt_i > 0; lt_i--) { + if ($lt_i != "" && $lt_i != ".") { + if ($lt_i == "..") { + lt_count++; + } else { + if (lt_count == 0) { + lt_foo="/" $lt_i lt_foo; + } else { + lt_count--; + } + } + } + } + if (lt_foo != "") { lt_freq[lt_foo]++; } + if (lt_freq[lt_foo] == 1) { print lt_foo; } +}'` + # AWK program above erroneously prepends '/' to C:/dos/paths + # for these hosts. + case $host_os in + mingw* | cegcc*) lt_search_path_spec=`$ECHO "$lt_search_path_spec" |\ + $SED 's,/\([A-Za-z]:\),\1,g'` ;; + esac + sys_lib_search_path_spec=`$ECHO "$lt_search_path_spec" | $lt_NL2SP` +else + sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" +fi +library_names_spec= +libname_spec='lib$name' +soname_spec= +shrext_cmds=".so" +postinstall_cmds= +postuninstall_cmds= +finish_cmds= +finish_eval= +shlibpath_var= +shlibpath_overrides_runpath=unknown +version_type=none +dynamic_linker="$host_os ld.so" +sys_lib_dlsearch_path_spec="/lib /usr/lib" +need_lib_prefix=unknown +hardcode_into_libs=no + +# when you set need_version to no, make sure it does not cause -set_version +# flags to be left without arguments +need_version=unknown + +case $host_os in +aix3*) + version_type=linux # correct to gnu/linux during the next big refactor + library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a' + shlibpath_var=LIBPATH + + # AIX 3 has no versioning support, so we append a major version to the name. + soname_spec='${libname}${release}${shared_ext}$major' + ;; + +aix[4-9]*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + hardcode_into_libs=yes + if test "$host_cpu" = ia64; then + # AIX 5 supports IA64 + library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}' + shlibpath_var=LD_LIBRARY_PATH + else + # With GCC up to 2.95.x, collect2 would create an import file + # for dependence libraries. The import file would start with + # the line `#! .'. This would cause the generated library to + # depend on `.', always an invalid library. This was fixed in + # development snapshots of GCC prior to 3.0. + case $host_os in + aix4 | aix4.[01] | aix4.[01].*) + if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)' + echo ' yes ' + echo '#endif'; } | ${CC} -E - | $GREP yes > /dev/null; then + : + else + can_build_shared=no + fi + ;; + esac + # AIX (on Power*) has no versioning support, so currently we can not hardcode correct + # soname into executable. Probably we can add versioning support to + # collect2, so additional links can be useful in future. + if test "$aix_use_runtimelinking" = yes; then + # If using run time linking (on AIX 4.2 or later) use lib.so + # instead of lib.a to let people know that these are not + # typical AIX shared libraries. + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + else + # We preserve .a as extension for shared libraries through AIX4.2 + # and later when we are not doing run time linking. + library_names_spec='${libname}${release}.a $libname.a' + soname_spec='${libname}${release}${shared_ext}$major' + fi + shlibpath_var=LIBPATH + fi + ;; + +amigaos*) + case $host_cpu in + powerpc) + # Since July 2007 AmigaOS4 officially supports .so libraries. + # When compiling the executable, add -use-dynld -Lsobjs: to the compileline. + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + ;; + m68k) + library_names_spec='$libname.ixlibrary $libname.a' + # Create ${libname}_ixlibrary.a entries in /sys/libs. + finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`func_echo_all "$lib" | $SED '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; test $RM /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done' + ;; + esac + ;; + +beos*) + library_names_spec='${libname}${shared_ext}' + dynamic_linker="$host_os ld.so" + shlibpath_var=LIBRARY_PATH + ;; + +bsdi[45]*) + version_type=linux # correct to gnu/linux during the next big refactor + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir' + shlibpath_var=LD_LIBRARY_PATH + sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib" + sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib" + # the default ld.so.conf also contains /usr/contrib/lib and + # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow + # libtool to hard-code these into programs + ;; + +cygwin* | mingw* | pw32* | cegcc*) + version_type=windows + shrext_cmds=".dll" + need_version=no + need_lib_prefix=no + + case $GCC,$cc_basename in + yes,*) + # gcc + library_names_spec='$libname.dll.a' + # DLL is installed to $(libdir)/../bin by postinstall_cmds + postinstall_cmds='base_file=`basename \${file}`~ + dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~ + dldir=$destdir/`dirname \$dlpath`~ + test -d \$dldir || mkdir -p \$dldir~ + $install_prog $dir/$dlname \$dldir/$dlname~ + chmod a+x \$dldir/$dlname~ + if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then + eval '\''$striplib \$dldir/$dlname'\'' || exit \$?; + fi' + postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ + dlpath=$dir/\$dldll~ + $RM \$dlpath' + shlibpath_overrides_runpath=yes + + case $host_os in + cygwin*) + # Cygwin DLLs use 'cyg' prefix rather than 'lib' + soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' + + sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/lib/w32api" + ;; + mingw* | cegcc*) + # MinGW DLLs use traditional 'lib' prefix + soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' + ;; + pw32*) + # pw32 DLLs use 'pw' prefix rather than 'lib' + library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' + ;; + esac + dynamic_linker='Win32 ld.exe' + ;; + + *,cl*) + # Native MSVC + libname_spec='$name' + soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' + library_names_spec='${libname}.dll.lib' + + case $build_os in + mingw*) + sys_lib_search_path_spec= + lt_save_ifs=$IFS + IFS=';' + for lt_path in $LIB + do + IFS=$lt_save_ifs + # Let DOS variable expansion print the short 8.3 style file name. + lt_path=`cd "$lt_path" 2>/dev/null && cmd //C "for %i in (".") do @echo %~si"` + sys_lib_search_path_spec="$sys_lib_search_path_spec $lt_path" + done + IFS=$lt_save_ifs + # Convert to MSYS style. + sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | sed -e 's|\\\\|/|g' -e 's| \\([a-zA-Z]\\):| /\\1|g' -e 's|^ ||'` + ;; + cygwin*) + # Convert to unix form, then to dos form, then back to unix form + # but this time dos style (no spaces!) so that the unix form looks + # like /cygdrive/c/PROGRA~1:/cygdr... + sys_lib_search_path_spec=`cygpath --path --unix "$LIB"` + sys_lib_search_path_spec=`cygpath --path --dos "$sys_lib_search_path_spec" 2>/dev/null` + sys_lib_search_path_spec=`cygpath --path --unix "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` + ;; + *) + sys_lib_search_path_spec="$LIB" + if $ECHO "$sys_lib_search_path_spec" | $GREP ';[c-zC-Z]:/' >/dev/null; then + # It is most probably a Windows format PATH. + sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` + else + sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` + fi + # FIXME: find the short name or the path components, as spaces are + # common. (e.g. "Program Files" -> "PROGRA~1") + ;; + esac + + # DLL is installed to $(libdir)/../bin by postinstall_cmds + postinstall_cmds='base_file=`basename \${file}`~ + dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~ + dldir=$destdir/`dirname \$dlpath`~ + test -d \$dldir || mkdir -p \$dldir~ + $install_prog $dir/$dlname \$dldir/$dlname' + postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ + dlpath=$dir/\$dldll~ + $RM \$dlpath' + shlibpath_overrides_runpath=yes + dynamic_linker='Win32 link.exe' + ;; + + *) + # Assume MSVC wrapper + library_names_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext} $libname.lib' + dynamic_linker='Win32 ld.exe' + ;; + esac + # FIXME: first we should search . and the directory the executable is in + shlibpath_var=PATH + ;; + +darwin* | rhapsody*) + dynamic_linker="$host_os dyld" + version_type=darwin + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${major}$shared_ext ${libname}$shared_ext' + soname_spec='${libname}${release}${major}$shared_ext' + shlibpath_overrides_runpath=yes + shlibpath_var=DYLD_LIBRARY_PATH + shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`' + + sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/local/lib" + sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib' + ;; + +dgux*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + ;; + +freebsd* | dragonfly*) + # DragonFly does not have aout. When/if they implement a new + # versioning mechanism, adjust this. + if test -x /usr/bin/objformat; then + objformat=`/usr/bin/objformat` + else + case $host_os in + freebsd[23].*) objformat=aout ;; + *) objformat=elf ;; + esac + fi + version_type=freebsd-$objformat + case $version_type in + freebsd-elf*) + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' + need_version=no + need_lib_prefix=no + ;; + freebsd-*) + library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix' + need_version=yes + ;; + esac + shlibpath_var=LD_LIBRARY_PATH + case $host_os in + freebsd2.*) + shlibpath_overrides_runpath=yes + ;; + freebsd3.[01]* | freebsdelf3.[01]*) + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + freebsd3.[2-9]* | freebsdelf3.[2-9]* | \ + freebsd4.[0-5] | freebsdelf4.[0-5] | freebsd4.1.1 | freebsdelf4.1.1) + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; + *) # from 4.6 on, and DragonFly + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + esac + ;; + +gnu*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; + +haiku*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + dynamic_linker="$host_os runtime_loader" + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LIBRARY_PATH + shlibpath_overrides_runpath=yes + sys_lib_dlsearch_path_spec='/boot/home/config/lib /boot/common/lib /boot/system/lib' + hardcode_into_libs=yes + ;; + +hpux9* | hpux10* | hpux11*) + # Give a soname corresponding to the major version so that dld.sl refuses to + # link against other versions. + version_type=sunos + need_lib_prefix=no + need_version=no + case $host_cpu in + ia64*) + shrext_cmds='.so' + hardcode_into_libs=yes + dynamic_linker="$host_os dld.so" + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + if test "X$HPUX_IA64_MODE" = X32; then + sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib" + else + sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64" + fi + sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec + ;; + hppa*64*) + shrext_cmds='.sl' + hardcode_into_libs=yes + dynamic_linker="$host_os dld.sl" + shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH + shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64" + sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec + ;; + *) + shrext_cmds='.sl' + dynamic_linker="$host_os dld.sl" + shlibpath_var=SHLIB_PATH + shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + ;; + esac + # HP-UX runs *really* slowly unless shared libraries are mode 555, ... + postinstall_cmds='chmod 555 $lib' + # or fails outright, so override atomically: + install_override_mode=555 + ;; + +interix[3-9]*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; + +irix5* | irix6* | nonstopux*) + case $host_os in + nonstopux*) version_type=nonstopux ;; + *) + if test "$lt_cv_prog_gnu_ld" = yes; then + version_type=linux # correct to gnu/linux during the next big refactor + else + version_type=irix + fi ;; + esac + need_lib_prefix=no + need_version=no + soname_spec='${libname}${release}${shared_ext}$major' + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}' + case $host_os in + irix5* | nonstopux*) + libsuff= shlibsuff= + ;; + *) + case $LD in # libtool.m4 will add one of these switches to LD + *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") + libsuff= shlibsuff= libmagic=32-bit;; + *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") + libsuff=32 shlibsuff=N32 libmagic=N32;; + *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") + libsuff=64 shlibsuff=64 libmagic=64-bit;; + *) libsuff= shlibsuff= libmagic=never-match;; + esac + ;; + esac + shlibpath_var=LD_LIBRARY${shlibsuff}_PATH + shlibpath_overrides_runpath=no + sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}" + sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}" + hardcode_into_libs=yes + ;; + +# No shared lib support for Linux oldld, aout, or coff. +linux*oldld* | linux*aout* | linux*coff*) + dynamic_linker=no + ;; + +# This must be glibc/ELF. +linux* | k*bsd*-gnu | kopensolaris*-gnu) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + + # Some binutils ld are patched to set DT_RUNPATH + if ${lt_cv_shlibpath_overrides_runpath+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_shlibpath_overrides_runpath=no + save_LDFLAGS=$LDFLAGS + save_libdir=$libdir + eval "libdir=/foo; wl=\"$lt_prog_compiler_wl\"; \ + LDFLAGS=\"\$LDFLAGS $hardcode_libdir_flag_spec\"" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + if ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir" >/dev/null; then : + lt_cv_shlibpath_overrides_runpath=yes +fi +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + LDFLAGS=$save_LDFLAGS + libdir=$save_libdir + +fi + + shlibpath_overrides_runpath=$lt_cv_shlibpath_overrides_runpath + + # This implies no fast_install, which is unacceptable. + # Some rework will be needed to allow for fast_install + # before this can be enabled. + hardcode_into_libs=yes + + # Append ld.so.conf contents to the search path + if test -f /etc/ld.so.conf; then + lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \$2)); skip = 1; } { if (!skip) print \$0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[ ]*hwcap[ ]/d;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;s/"//g;/^$/d' | tr '\n' ' '` + sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra" + fi + + # We used to test for /lib/ld.so.1 and disable shared libraries on + # powerpc, because MkLinux only supported shared libraries with the + # GNU dynamic linker. Since this was broken with cross compilers, + # most powerpc-linux boxes support dynamic linking these days and + # people can always --disable-shared, the test was removed, and we + # assume the GNU/Linux dynamic linker is in use. + dynamic_linker='GNU/Linux ld.so' + ;; + +netbsdelf*-gnu) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + dynamic_linker='NetBSD ld.elf_so' + ;; + +netbsd*) + version_type=sunos + need_lib_prefix=no + need_version=no + if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' + dynamic_linker='NetBSD (a.out) ld.so' + else + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + dynamic_linker='NetBSD ld.elf_so' + fi + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + +newsos6) + version_type=linux # correct to gnu/linux during the next big refactor + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + ;; + +*nto* | *qnx*) + version_type=qnx + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + dynamic_linker='ldqnx.so' + ;; + +openbsd*) + version_type=sunos + sys_lib_dlsearch_path_spec="/usr/lib" + need_lib_prefix=no + # Some older versions of OpenBSD (3.3 at least) *do* need versioned libs. + case $host_os in + openbsd3.3 | openbsd3.3.*) need_version=yes ;; + *) need_version=no ;; + esac + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' + shlibpath_var=LD_LIBRARY_PATH + if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then + case $host_os in + openbsd2.[89] | openbsd2.[89].*) + shlibpath_overrides_runpath=no + ;; + *) + shlibpath_overrides_runpath=yes + ;; + esac + else + shlibpath_overrides_runpath=yes + fi + ;; + +os2*) + libname_spec='$name' + shrext_cmds=".dll" + need_lib_prefix=no + library_names_spec='$libname${shared_ext} $libname.a' + dynamic_linker='OS/2 ld.exe' + shlibpath_var=LIBPATH + ;; + +osf3* | osf4* | osf5*) + version_type=osf + need_lib_prefix=no + need_version=no + soname_spec='${libname}${release}${shared_ext}$major' + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + shlibpath_var=LD_LIBRARY_PATH + sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib" + sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec" + ;; + +rdos*) + dynamic_linker=no + ;; + +solaris*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + # ldd complains unless libraries are executable + postinstall_cmds='chmod +x $lib' + ;; + +sunos4*) + version_type=sunos + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' + finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + if test "$with_gnu_ld" = yes; then + need_lib_prefix=no + fi + need_version=yes + ;; + +sysv4 | sysv4.3*) + version_type=linux # correct to gnu/linux during the next big refactor + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + case $host_vendor in + sni) + shlibpath_overrides_runpath=no + need_lib_prefix=no + runpath_var=LD_RUN_PATH + ;; + siemens) + need_lib_prefix=no + ;; + motorola) + need_lib_prefix=no + need_version=no + shlibpath_overrides_runpath=no + sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib' + ;; + esac + ;; + +sysv4*MP*) + if test -d /usr/nec ;then + version_type=linux # correct to gnu/linux during the next big refactor + library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}' + soname_spec='$libname${shared_ext}.$major' + shlibpath_var=LD_LIBRARY_PATH + fi + ;; + +sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) + version_type=freebsd-elf + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + if test "$with_gnu_ld" = yes; then + sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib' + else + sys_lib_search_path_spec='/usr/ccs/lib /usr/lib' + case $host_os in + sco3.2v5*) + sys_lib_search_path_spec="$sys_lib_search_path_spec /lib" + ;; + esac + fi + sys_lib_dlsearch_path_spec='/usr/lib' + ;; + +tpf*) + # TPF is a cross-target only. Preferred cross-host = GNU/Linux. + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; + +uts4*) + version_type=linux # correct to gnu/linux during the next big refactor + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + ;; + +*) + dynamic_linker=no + ;; +esac +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $dynamic_linker" >&5 +$as_echo "$dynamic_linker" >&6; } +test "$dynamic_linker" = no && can_build_shared=no + +variables_saved_for_relink="PATH $shlibpath_var $runpath_var" +if test "$GCC" = yes; then + variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" +fi + +if test "${lt_cv_sys_lib_search_path_spec+set}" = set; then + sys_lib_search_path_spec="$lt_cv_sys_lib_search_path_spec" +fi +if test "${lt_cv_sys_lib_dlsearch_path_spec+set}" = set; then + sys_lib_dlsearch_path_spec="$lt_cv_sys_lib_dlsearch_path_spec" +fi + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to hardcode library paths into programs" >&5 +$as_echo_n "checking how to hardcode library paths into programs... " >&6; } +hardcode_action= +if test -n "$hardcode_libdir_flag_spec" || + test -n "$runpath_var" || + test "X$hardcode_automatic" = "Xyes" ; then + + # We can hardcode non-existent directories. + if test "$hardcode_direct" != no && + # If the only mechanism to avoid hardcoding is shlibpath_var, we + # have to relink, otherwise we might link with an installed library + # when we should be linking with a yet-to-be-installed one + ## test "$_LT_TAGVAR(hardcode_shlibpath_var, )" != no && + test "$hardcode_minus_L" != no; then + # Linking always hardcodes the temporary library directory. + hardcode_action=relink + else + # We can link without hardcoding, and we can hardcode nonexisting dirs. + hardcode_action=immediate + fi +else + # We cannot hardcode anything, or else we can only hardcode existing + # directories. + hardcode_action=unsupported +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $hardcode_action" >&5 +$as_echo "$hardcode_action" >&6; } + +if test "$hardcode_action" = relink || + test "$inherit_rpath" = yes; then + # Fast installation is not supported + enable_fast_install=no +elif test "$shlibpath_overrides_runpath" = yes || + test "$enable_shared" = no; then + # Fast installation is not necessary + enable_fast_install=needless +fi + + + + + + + if test "x$enable_dlopen" != xyes; then + enable_dlopen=unknown + enable_dlopen_self=unknown + enable_dlopen_self_static=unknown +else + lt_cv_dlopen=no + lt_cv_dlopen_libs= + + case $host_os in + beos*) + lt_cv_dlopen="load_add_on" + lt_cv_dlopen_libs= + lt_cv_dlopen_self=yes + ;; + + mingw* | pw32* | cegcc*) + lt_cv_dlopen="LoadLibrary" + lt_cv_dlopen_libs= + ;; + + cygwin*) + lt_cv_dlopen="dlopen" + lt_cv_dlopen_libs= + ;; + + darwin*) + # if libdl is installed we need to link against it + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5 +$as_echo_n "checking for dlopen in -ldl... " >&6; } +if ${ac_cv_lib_dl_dlopen+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-ldl $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char dlopen (); +int +main () +{ +return dlopen (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_dl_dlopen=yes +else + ac_cv_lib_dl_dlopen=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5 +$as_echo "$ac_cv_lib_dl_dlopen" >&6; } +if test "x$ac_cv_lib_dl_dlopen" = xyes; then : + lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl" +else + + lt_cv_dlopen="dyld" + lt_cv_dlopen_libs= + lt_cv_dlopen_self=yes + +fi + + ;; + + *) + ac_fn_c_check_func "$LINENO" "shl_load" "ac_cv_func_shl_load" +if test "x$ac_cv_func_shl_load" = xyes; then : + lt_cv_dlopen="shl_load" +else + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for shl_load in -ldld" >&5 +$as_echo_n "checking for shl_load in -ldld... " >&6; } +if ${ac_cv_lib_dld_shl_load+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-ldld $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char shl_load (); +int +main () +{ +return shl_load (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_dld_shl_load=yes +else + ac_cv_lib_dld_shl_load=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dld_shl_load" >&5 +$as_echo "$ac_cv_lib_dld_shl_load" >&6; } +if test "x$ac_cv_lib_dld_shl_load" = xyes; then : + lt_cv_dlopen="shl_load" lt_cv_dlopen_libs="-ldld" +else + ac_fn_c_check_func "$LINENO" "dlopen" "ac_cv_func_dlopen" +if test "x$ac_cv_func_dlopen" = xyes; then : + lt_cv_dlopen="dlopen" +else + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5 +$as_echo_n "checking for dlopen in -ldl... " >&6; } +if ${ac_cv_lib_dl_dlopen+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-ldl $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char dlopen (); +int +main () +{ +return dlopen (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_dl_dlopen=yes +else + ac_cv_lib_dl_dlopen=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5 +$as_echo "$ac_cv_lib_dl_dlopen" >&6; } +if test "x$ac_cv_lib_dl_dlopen" = xyes; then : + lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl" +else + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -lsvld" >&5 +$as_echo_n "checking for dlopen in -lsvld... " >&6; } +if ${ac_cv_lib_svld_dlopen+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lsvld $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char dlopen (); +int +main () +{ +return dlopen (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_svld_dlopen=yes +else + ac_cv_lib_svld_dlopen=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_svld_dlopen" >&5 +$as_echo "$ac_cv_lib_svld_dlopen" >&6; } +if test "x$ac_cv_lib_svld_dlopen" = xyes; then : + lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-lsvld" +else + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dld_link in -ldld" >&5 +$as_echo_n "checking for dld_link in -ldld... " >&6; } +if ${ac_cv_lib_dld_dld_link+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-ldld $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char dld_link (); +int +main () +{ +return dld_link (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_dld_dld_link=yes +else + ac_cv_lib_dld_dld_link=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dld_dld_link" >&5 +$as_echo "$ac_cv_lib_dld_dld_link" >&6; } +if test "x$ac_cv_lib_dld_dld_link" = xyes; then : + lt_cv_dlopen="dld_link" lt_cv_dlopen_libs="-ldld" +fi + + +fi + + +fi + + +fi + + +fi + + +fi + + ;; + esac + + if test "x$lt_cv_dlopen" != xno; then + enable_dlopen=yes + else + enable_dlopen=no + fi + + case $lt_cv_dlopen in + dlopen) + save_CPPFLAGS="$CPPFLAGS" + test "x$ac_cv_header_dlfcn_h" = xyes && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H" + + save_LDFLAGS="$LDFLAGS" + wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\" + + save_LIBS="$LIBS" + LIBS="$lt_cv_dlopen_libs $LIBS" + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether a program can dlopen itself" >&5 +$as_echo_n "checking whether a program can dlopen itself... " >&6; } +if ${lt_cv_dlopen_self+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test "$cross_compiling" = yes; then : + lt_cv_dlopen_self=cross +else + lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 + lt_status=$lt_dlunknown + cat > conftest.$ac_ext <<_LT_EOF +#line $LINENO "configure" +#include "confdefs.h" + +#if HAVE_DLFCN_H +#include +#endif + +#include + +#ifdef RTLD_GLOBAL +# define LT_DLGLOBAL RTLD_GLOBAL +#else +# ifdef DL_GLOBAL +# define LT_DLGLOBAL DL_GLOBAL +# else +# define LT_DLGLOBAL 0 +# endif +#endif + +/* We may have to define LT_DLLAZY_OR_NOW in the command line if we + find out it does not work in some platform. */ +#ifndef LT_DLLAZY_OR_NOW +# ifdef RTLD_LAZY +# define LT_DLLAZY_OR_NOW RTLD_LAZY +# else +# ifdef DL_LAZY +# define LT_DLLAZY_OR_NOW DL_LAZY +# else +# ifdef RTLD_NOW +# define LT_DLLAZY_OR_NOW RTLD_NOW +# else +# ifdef DL_NOW +# define LT_DLLAZY_OR_NOW DL_NOW +# else +# define LT_DLLAZY_OR_NOW 0 +# endif +# endif +# endif +# endif +#endif + +/* When -fvisbility=hidden is used, assume the code has been annotated + correspondingly for the symbols needed. */ +#if defined(__GNUC__) && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3)) +int fnord () __attribute__((visibility("default"))); +#endif + +int fnord () { return 42; } +int main () +{ + void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); + int status = $lt_dlunknown; + + if (self) + { + if (dlsym (self,"fnord")) status = $lt_dlno_uscore; + else + { + if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; + else puts (dlerror ()); + } + /* dlclose (self); */ + } + else + puts (dlerror ()); + + return status; +} +_LT_EOF + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5 + (eval $ac_link) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && test -s conftest${ac_exeext} 2>/dev/null; then + (./conftest; exit; ) >&5 2>/dev/null + lt_status=$? + case x$lt_status in + x$lt_dlno_uscore) lt_cv_dlopen_self=yes ;; + x$lt_dlneed_uscore) lt_cv_dlopen_self=yes ;; + x$lt_dlunknown|x*) lt_cv_dlopen_self=no ;; + esac + else : + # compilation failed + lt_cv_dlopen_self=no + fi +fi +rm -fr conftest* + + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_dlopen_self" >&5 +$as_echo "$lt_cv_dlopen_self" >&6; } + + if test "x$lt_cv_dlopen_self" = xyes; then + wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $lt_prog_compiler_static\" + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether a statically linked program can dlopen itself" >&5 +$as_echo_n "checking whether a statically linked program can dlopen itself... " >&6; } +if ${lt_cv_dlopen_self_static+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test "$cross_compiling" = yes; then : + lt_cv_dlopen_self_static=cross +else + lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 + lt_status=$lt_dlunknown + cat > conftest.$ac_ext <<_LT_EOF +#line $LINENO "configure" +#include "confdefs.h" + +#if HAVE_DLFCN_H +#include +#endif + +#include + +#ifdef RTLD_GLOBAL +# define LT_DLGLOBAL RTLD_GLOBAL +#else +# ifdef DL_GLOBAL +# define LT_DLGLOBAL DL_GLOBAL +# else +# define LT_DLGLOBAL 0 +# endif +#endif + +/* We may have to define LT_DLLAZY_OR_NOW in the command line if we + find out it does not work in some platform. */ +#ifndef LT_DLLAZY_OR_NOW +# ifdef RTLD_LAZY +# define LT_DLLAZY_OR_NOW RTLD_LAZY +# else +# ifdef DL_LAZY +# define LT_DLLAZY_OR_NOW DL_LAZY +# else +# ifdef RTLD_NOW +# define LT_DLLAZY_OR_NOW RTLD_NOW +# else +# ifdef DL_NOW +# define LT_DLLAZY_OR_NOW DL_NOW +# else +# define LT_DLLAZY_OR_NOW 0 +# endif +# endif +# endif +# endif +#endif + +/* When -fvisbility=hidden is used, assume the code has been annotated + correspondingly for the symbols needed. */ +#if defined(__GNUC__) && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3)) +int fnord () __attribute__((visibility("default"))); +#endif + +int fnord () { return 42; } +int main () +{ + void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); + int status = $lt_dlunknown; + + if (self) + { + if (dlsym (self,"fnord")) status = $lt_dlno_uscore; + else + { + if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; + else puts (dlerror ()); + } + /* dlclose (self); */ + } + else + puts (dlerror ()); + + return status; +} +_LT_EOF + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5 + (eval $ac_link) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && test -s conftest${ac_exeext} 2>/dev/null; then + (./conftest; exit; ) >&5 2>/dev/null + lt_status=$? + case x$lt_status in + x$lt_dlno_uscore) lt_cv_dlopen_self_static=yes ;; + x$lt_dlneed_uscore) lt_cv_dlopen_self_static=yes ;; + x$lt_dlunknown|x*) lt_cv_dlopen_self_static=no ;; + esac + else : + # compilation failed + lt_cv_dlopen_self_static=no + fi +fi +rm -fr conftest* + + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_dlopen_self_static" >&5 +$as_echo "$lt_cv_dlopen_self_static" >&6; } + fi + + CPPFLAGS="$save_CPPFLAGS" + LDFLAGS="$save_LDFLAGS" + LIBS="$save_LIBS" + ;; + esac + + case $lt_cv_dlopen_self in + yes|no) enable_dlopen_self=$lt_cv_dlopen_self ;; + *) enable_dlopen_self=unknown ;; + esac + + case $lt_cv_dlopen_self_static in + yes|no) enable_dlopen_self_static=$lt_cv_dlopen_self_static ;; + *) enable_dlopen_self_static=unknown ;; + esac +fi + + + + + + + + + + + + + + + + + +striplib= +old_striplib= +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether stripping libraries is possible" >&5 +$as_echo_n "checking whether stripping libraries is possible... " >&6; } +if test -n "$STRIP" && $STRIP -V 2>&1 | $GREP "GNU strip" >/dev/null; then + test -z "$old_striplib" && old_striplib="$STRIP --strip-debug" + test -z "$striplib" && striplib="$STRIP --strip-unneeded" + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } +else +# FIXME - insert some real tests, host_os isn't really good enough + case $host_os in + darwin*) + if test -n "$STRIP" ; then + striplib="$STRIP -x" + old_striplib="$STRIP -S" + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + fi + ;; + *) + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + ;; + esac +fi + + + + + + + + + + + + + # Report which library types will actually be built + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if libtool supports shared libraries" >&5 +$as_echo_n "checking if libtool supports shared libraries... " >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $can_build_shared" >&5 +$as_echo "$can_build_shared" >&6; } + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build shared libraries" >&5 +$as_echo_n "checking whether to build shared libraries... " >&6; } + test "$can_build_shared" = "no" && enable_shared=no + + # On AIX, shared libraries and static libraries use the same namespace, and + # are all built from PIC. + case $host_os in + aix3*) + test "$enable_shared" = yes && enable_static=no + if test -n "$RANLIB"; then + archive_cmds="$archive_cmds~\$RANLIB \$lib" + postinstall_cmds='$RANLIB $lib' + fi + ;; + + aix[4-9]*) + if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then + test "$enable_shared" = yes && enable_static=no + fi + ;; + esac + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_shared" >&5 +$as_echo "$enable_shared" >&6; } + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build static libraries" >&5 +$as_echo_n "checking whether to build static libraries... " >&6; } + # Make sure either enable_shared or enable_static is yes. + test "$enable_shared" = yes || enable_static=yes + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_static" >&5 +$as_echo "$enable_static" >&6; } + + + + +fi +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + +CC="$lt_save_CC" + + if test -n "$CXX" && ( test "X$CXX" != "Xno" && + ( (test "X$CXX" = "Xg++" && `g++ -v >/dev/null 2>&1` ) || + (test "X$CXX" != "Xg++"))) ; then + ac_ext=cpp +ac_cpp='$CXXCPP $CPPFLAGS' +ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_cxx_compiler_gnu +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C++ preprocessor" >&5 +$as_echo_n "checking how to run the C++ preprocessor... " >&6; } +if test -z "$CXXCPP"; then + if ${ac_cv_prog_CXXCPP+:} false; then : + $as_echo_n "(cached) " >&6 +else + # Double quotes because CXXCPP needs to be expanded + for CXXCPP in "$CXX -E" "/lib/cpp" + do + ac_preproc_ok=false +for ac_cxx_preproc_warn_flag in '' yes +do + # Use a header file that comes with gcc, so configuring glibc + # with a fresh cross-compiler works. + # Prefer to if __STDC__ is defined, since + # exists even on freestanding compilers. + # On the NeXT, cc -E runs the code through the compiler's parser, + # not just through cpp. "Syntax error" is here to catch this case. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +@%:@ifdef __STDC__ +@%:@ include +@%:@else +@%:@ include +@%:@endif + Syntax error +_ACEOF +if ac_fn_cxx_try_cpp "$LINENO"; then : + +else + # Broken: fails on valid input. +continue +fi +rm -f conftest.err conftest.i conftest.$ac_ext + + # OK, works on sane cases. Now check whether nonexistent headers + # can be detected and how. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +@%:@include +_ACEOF +if ac_fn_cxx_try_cpp "$LINENO"; then : + # Broken: success on invalid input. +continue +else + # Passes both tests. +ac_preproc_ok=: +break +fi +rm -f conftest.err conftest.i conftest.$ac_ext + +done +# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. +rm -f conftest.i conftest.err conftest.$ac_ext +if $ac_preproc_ok; then : + break +fi + + done + ac_cv_prog_CXXCPP=$CXXCPP + +fi + CXXCPP=$ac_cv_prog_CXXCPP +else + ac_cv_prog_CXXCPP=$CXXCPP +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $CXXCPP" >&5 +$as_echo "$CXXCPP" >&6; } +ac_preproc_ok=false +for ac_cxx_preproc_warn_flag in '' yes +do + # Use a header file that comes with gcc, so configuring glibc + # with a fresh cross-compiler works. + # Prefer to if __STDC__ is defined, since + # exists even on freestanding compilers. + # On the NeXT, cc -E runs the code through the compiler's parser, + # not just through cpp. "Syntax error" is here to catch this case. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +@%:@ifdef __STDC__ +@%:@ include +@%:@else +@%:@ include +@%:@endif + Syntax error +_ACEOF +if ac_fn_cxx_try_cpp "$LINENO"; then : + +else + # Broken: fails on valid input. +continue +fi +rm -f conftest.err conftest.i conftest.$ac_ext + + # OK, works on sane cases. Now check whether nonexistent headers + # can be detected and how. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +@%:@include +_ACEOF +if ac_fn_cxx_try_cpp "$LINENO"; then : + # Broken: success on invalid input. +continue +else + # Passes both tests. +ac_preproc_ok=: +break +fi +rm -f conftest.err conftest.i conftest.$ac_ext + +done +# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. +rm -f conftest.i conftest.err conftest.$ac_ext +if $ac_preproc_ok; then : + +else + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "C++ preprocessor \"$CXXCPP\" fails sanity check +See \`config.log' for more details" "$LINENO" 5; } +fi + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + +else + _lt_caught_CXX_error=yes +fi + +ac_ext=cpp +ac_cpp='$CXXCPP $CPPFLAGS' +ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_cxx_compiler_gnu + +archive_cmds_need_lc_CXX=no +allow_undefined_flag_CXX= +always_export_symbols_CXX=no +archive_expsym_cmds_CXX= +compiler_needs_object_CXX=no +export_dynamic_flag_spec_CXX= +hardcode_direct_CXX=no +hardcode_direct_absolute_CXX=no +hardcode_libdir_flag_spec_CXX= +hardcode_libdir_separator_CXX= +hardcode_minus_L_CXX=no +hardcode_shlibpath_var_CXX=unsupported +hardcode_automatic_CXX=no +inherit_rpath_CXX=no +module_cmds_CXX= +module_expsym_cmds_CXX= +link_all_deplibs_CXX=unknown +old_archive_cmds_CXX=$old_archive_cmds +reload_flag_CXX=$reload_flag +reload_cmds_CXX=$reload_cmds +no_undefined_flag_CXX= +whole_archive_flag_spec_CXX= +enable_shared_with_static_runtimes_CXX=no + +# Source file extension for C++ test sources. +ac_ext=cpp + +# Object file extension for compiled C++ test sources. +objext=o +objext_CXX=$objext + +# No sense in running all these tests if we already determined that +# the CXX compiler isn't working. Some variables (like enable_shared) +# are currently assumed to apply to all compilers on this platform, +# and will be corrupted by setting them based on a non-working compiler. +if test "$_lt_caught_CXX_error" != yes; then + # Code to be used in simple compile tests + lt_simple_compile_test_code="int some_variable = 0;" + + # Code to be used in simple link tests + lt_simple_link_test_code='int main(int, char *[]) { return(0); }' + + # ltmain only uses $CC for tagged configurations so make sure $CC is set. + + + + + + +# If no C compiler was specified, use CC. +LTCC=${LTCC-"$CC"} + +# If no C compiler flags were specified, use CFLAGS. +LTCFLAGS=${LTCFLAGS-"$CFLAGS"} + +# Allow CC to be a program name with arguments. +compiler=$CC + + + # save warnings/boilerplate of simple test code + ac_outfile=conftest.$ac_objext +echo "$lt_simple_compile_test_code" >conftest.$ac_ext +eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err +_lt_compiler_boilerplate=`cat conftest.err` +$RM conftest* + + ac_outfile=conftest.$ac_objext +echo "$lt_simple_link_test_code" >conftest.$ac_ext +eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err +_lt_linker_boilerplate=`cat conftest.err` +$RM -r conftest* + + + # Allow CC to be a program name with arguments. + lt_save_CC=$CC + lt_save_CFLAGS=$CFLAGS + lt_save_LD=$LD + lt_save_GCC=$GCC + GCC=$GXX + lt_save_with_gnu_ld=$with_gnu_ld + lt_save_path_LD=$lt_cv_path_LD + if test -n "${lt_cv_prog_gnu_ldcxx+set}"; then + lt_cv_prog_gnu_ld=$lt_cv_prog_gnu_ldcxx + else + $as_unset lt_cv_prog_gnu_ld + fi + if test -n "${lt_cv_path_LDCXX+set}"; then + lt_cv_path_LD=$lt_cv_path_LDCXX + else + $as_unset lt_cv_path_LD + fi + test -z "${LDCXX+set}" || LD=$LDCXX + CC=${CXX-"c++"} + CFLAGS=$CXXFLAGS + compiler=$CC + compiler_CXX=$CC + for cc_temp in $compiler""; do + case $cc_temp in + compile | *[\\/]compile | ccache | *[\\/]ccache ) ;; + distcc | *[\\/]distcc | purify | *[\\/]purify ) ;; + \-*) ;; + *) break;; + esac +done +cc_basename=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"` + + + if test -n "$compiler"; then + # We don't want -fno-exception when compiling C++ code, so set the + # no_builtin_flag separately + if test "$GXX" = yes; then + lt_prog_compiler_no_builtin_flag_CXX=' -fno-builtin' + else + lt_prog_compiler_no_builtin_flag_CXX= + fi + + if test "$GXX" = yes; then + # Set up default GNU C++ configuration + + + +@%:@ Check whether --with-gnu-ld was given. +if test "${with_gnu_ld+set}" = set; then : + withval=$with_gnu_ld; test "$withval" = no || with_gnu_ld=yes +else + with_gnu_ld=no +fi + +ac_prog=ld +if test "$GCC" = yes; then + # Check if gcc -print-prog-name=ld gives a path. + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ld used by $CC" >&5 +$as_echo_n "checking for ld used by $CC... " >&6; } + case $host in + *-*-mingw*) + # gcc leaves a trailing carriage return which upsets mingw + ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;; + *) + ac_prog=`($CC -print-prog-name=ld) 2>&5` ;; + esac + case $ac_prog in + # Accept absolute paths. + [\\/]* | ?:[\\/]*) + re_direlt='/[^/][^/]*/\.\./' + # Canonicalize the pathname of ld + ac_prog=`$ECHO "$ac_prog"| $SED 's%\\\\%/%g'` + while $ECHO "$ac_prog" | $GREP "$re_direlt" > /dev/null 2>&1; do + ac_prog=`$ECHO $ac_prog| $SED "s%$re_direlt%/%"` + done + test -z "$LD" && LD="$ac_prog" + ;; + "") + # If it fails, then pretend we aren't using GCC. + ac_prog=ld + ;; + *) + # If it is relative, then search for the first ld in PATH. + with_gnu_ld=unknown + ;; + esac +elif test "$with_gnu_ld" = yes; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU ld" >&5 +$as_echo_n "checking for GNU ld... " >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for non-GNU ld" >&5 +$as_echo_n "checking for non-GNU ld... " >&6; } +fi +if ${lt_cv_path_LD+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -z "$LD"; then + lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR + for ac_dir in $PATH; do + IFS="$lt_save_ifs" + test -z "$ac_dir" && ac_dir=. + if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then + lt_cv_path_LD="$ac_dir/$ac_prog" + # Check to see if the program is GNU ld. I'd rather use --version, + # but apparently some variants of GNU ld only accept -v. + # Break only if it was the GNU/non-GNU ld that we prefer. + case `"$lt_cv_path_LD" -v 2>&1 &5 +$as_echo "$LD" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi +test -z "$LD" && as_fn_error $? "no acceptable ld found in \$PATH" "$LINENO" 5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if the linker ($LD) is GNU ld" >&5 +$as_echo_n "checking if the linker ($LD) is GNU ld... " >&6; } +if ${lt_cv_prog_gnu_ld+:} false; then : + $as_echo_n "(cached) " >&6 +else + # I'd rather use --version here, but apparently some GNU lds only accept -v. +case `$LD -v 2>&1 &5 +$as_echo "$lt_cv_prog_gnu_ld" >&6; } +with_gnu_ld=$lt_cv_prog_gnu_ld + + + + + + + + # Check if GNU C++ uses GNU ld as the underlying linker, since the + # archiving commands below assume that GNU ld is being used. + if test "$with_gnu_ld" = yes; then + archive_cmds_CXX='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' + archive_expsym_cmds_CXX='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + + hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir' + export_dynamic_flag_spec_CXX='${wl}--export-dynamic' + + # If archive_cmds runs LD, not CC, wlarc should be empty + # XXX I think wlarc can be eliminated in ltcf-cxx, but I need to + # investigate it a little bit more. (MM) + wlarc='${wl}' + + # ancient GNU ld didn't support --whole-archive et. al. + if eval "`$CC -print-prog-name=ld` --help 2>&1" | + $GREP 'no-whole-archive' > /dev/null; then + whole_archive_flag_spec_CXX="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' + else + whole_archive_flag_spec_CXX= + fi + else + with_gnu_ld=no + wlarc= + + # A generic and very simple default shared library creation + # command for GNU C++ for the case where it uses the native + # linker, instead of GNU ld. If possible, this setting should + # overridden to take advantage of the native linker features on + # the platform it is being used on. + archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib' + fi + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' + + else + GXX=no + with_gnu_ld=no + wlarc= + fi + + # PORTME: fill in a description of your system's C++ link characteristics + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $compiler linker ($LD) supports shared libraries" >&5 +$as_echo_n "checking whether the $compiler linker ($LD) supports shared libraries... " >&6; } + ld_shlibs_CXX=yes + case $host_os in + aix3*) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + aix[4-9]*) + if test "$host_cpu" = ia64; then + # On IA64, the linker does run time linking by default, so we don't + # have to do anything special. + aix_use_runtimelinking=no + exp_sym_flag='-Bexport' + no_entry_flag="" + else + aix_use_runtimelinking=no + + # Test if we are trying to use run time linking or normal + # AIX style linking. If -brtl is somewhere in LDFLAGS, we + # need to do runtime linking. + case $host_os in aix4.[23]|aix4.[23].*|aix[5-9]*) + for ld_flag in $LDFLAGS; do + case $ld_flag in + *-brtl*) + aix_use_runtimelinking=yes + break + ;; + esac + done + ;; + esac + + exp_sym_flag='-bexport' + no_entry_flag='-bnoentry' + fi + + # When large executables or shared objects are built, AIX ld can + # have problems creating the table of contents. If linking a library + # or program results in "error TOC overflow" add -mminimal-toc to + # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not + # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. + + archive_cmds_CXX='' + hardcode_direct_CXX=yes + hardcode_direct_absolute_CXX=yes + hardcode_libdir_separator_CXX=':' + link_all_deplibs_CXX=yes + file_list_spec_CXX='${wl}-f,' + + if test "$GXX" = yes; then + case $host_os in aix4.[012]|aix4.[012].*) + # We only want to do this on AIX 4.2 and lower, the check + # below for broken collect2 doesn't work under 4.3+ + collect2name=`${CC} -print-prog-name=collect2` + if test -f "$collect2name" && + strings "$collect2name" | $GREP resolve_lib_name >/dev/null + then + # We have reworked collect2 + : + else + # We have old collect2 + hardcode_direct_CXX=unsupported + # It fails to find uninstalled libraries when the uninstalled + # path is not listed in the libpath. Setting hardcode_minus_L + # to unsupported forces relinking + hardcode_minus_L_CXX=yes + hardcode_libdir_flag_spec_CXX='-L$libdir' + hardcode_libdir_separator_CXX= + fi + esac + shared_flag='-shared' + if test "$aix_use_runtimelinking" = yes; then + shared_flag="$shared_flag "'${wl}-G' + fi + else + # not using gcc + if test "$host_cpu" = ia64; then + # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release + # chokes on -Wl,-G. The following line is correct: + shared_flag='-G' + else + if test "$aix_use_runtimelinking" = yes; then + shared_flag='${wl}-G' + else + shared_flag='${wl}-bM:SRE' + fi + fi + fi + + export_dynamic_flag_spec_CXX='${wl}-bexpall' + # It seems that -bexpall does not export symbols beginning with + # underscore (_), so it is better to generate a list of symbols to + # export. + always_export_symbols_CXX=yes + if test "$aix_use_runtimelinking" = yes; then + # Warning - without using the other runtime loading flags (-brtl), + # -berok will link without error, but may produce a broken library. + allow_undefined_flag_CXX='-berok' + # Determine the default libpath from the value encoded in an empty + # executable. + if test "${lt_cv_aix_libpath+set}" = set; then + aix_libpath=$lt_cv_aix_libpath +else + if ${lt_cv_aix_libpath__CXX+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_cxx_try_link "$LINENO"; then : + + lt_aix_libpath_sed=' + /Import File Strings/,/^$/ { + /^0/ { + s/^0 *\([^ ]*\) *$/\1/ + p + } + }' + lt_cv_aix_libpath__CXX=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` + # Check for a 64-bit object if we didn't find anything. + if test -z "$lt_cv_aix_libpath__CXX"; then + lt_cv_aix_libpath__CXX=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` + fi +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + if test -z "$lt_cv_aix_libpath__CXX"; then + lt_cv_aix_libpath__CXX="/usr/lib:/lib" + fi + +fi + + aix_libpath=$lt_cv_aix_libpath__CXX +fi + + hardcode_libdir_flag_spec_CXX='${wl}-blibpath:$libdir:'"$aix_libpath" + + archive_expsym_cmds_CXX='$CC -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then func_echo_all "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag" + else + if test "$host_cpu" = ia64; then + hardcode_libdir_flag_spec_CXX='${wl}-R $libdir:/usr/lib:/lib' + allow_undefined_flag_CXX="-z nodefs" + archive_expsym_cmds_CXX="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols" + else + # Determine the default libpath from the value encoded in an + # empty executable. + if test "${lt_cv_aix_libpath+set}" = set; then + aix_libpath=$lt_cv_aix_libpath +else + if ${lt_cv_aix_libpath__CXX+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_cxx_try_link "$LINENO"; then : + + lt_aix_libpath_sed=' + /Import File Strings/,/^$/ { + /^0/ { + s/^0 *\([^ ]*\) *$/\1/ + p + } + }' + lt_cv_aix_libpath__CXX=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` + # Check for a 64-bit object if we didn't find anything. + if test -z "$lt_cv_aix_libpath__CXX"; then + lt_cv_aix_libpath__CXX=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` + fi +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + if test -z "$lt_cv_aix_libpath__CXX"; then + lt_cv_aix_libpath__CXX="/usr/lib:/lib" + fi + +fi + + aix_libpath=$lt_cv_aix_libpath__CXX +fi + + hardcode_libdir_flag_spec_CXX='${wl}-blibpath:$libdir:'"$aix_libpath" + # Warning - without using the other run time loading flags, + # -berok will link without error, but may produce a broken library. + no_undefined_flag_CXX=' ${wl}-bernotok' + allow_undefined_flag_CXX=' ${wl}-berok' + if test "$with_gnu_ld" = yes; then + # We only use this code for GNU lds that support --whole-archive. + whole_archive_flag_spec_CXX='${wl}--whole-archive$convenience ${wl}--no-whole-archive' + else + # Exported symbols can be pulled into shared objects from archives + whole_archive_flag_spec_CXX='$convenience' + fi + archive_cmds_need_lc_CXX=yes + # This is similar to how AIX traditionally builds its shared + # libraries. + archive_expsym_cmds_CXX="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' + fi + fi + ;; + + beos*) + if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then + allow_undefined_flag_CXX=unsupported + # Joseph Beckenbach says some releases of gcc + # support --undefined. This deserves some investigation. FIXME + archive_cmds_CXX='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + else + ld_shlibs_CXX=no + fi + ;; + + chorus*) + case $cc_basename in + *) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + esac + ;; + + cygwin* | mingw* | pw32* | cegcc*) + case $GXX,$cc_basename in + ,cl* | no,cl*) + # Native MSVC + # hardcode_libdir_flag_spec is actually meaningless, as there is + # no search path for DLLs. + hardcode_libdir_flag_spec_CXX=' ' + allow_undefined_flag_CXX=unsupported + always_export_symbols_CXX=yes + file_list_spec_CXX='@' + # Tell ltmain to make .lib files, not .a files. + libext=lib + # Tell ltmain to make .dll files, not .so files. + shrext_cmds=".dll" + # FIXME: Setting linknames here is a bad hack. + archive_cmds_CXX='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-dll~linknames=' + archive_expsym_cmds_CXX='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then + $SED -n -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' -e '1\\\!p' < $export_symbols > $output_objdir/$soname.exp; + else + $SED -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' < $export_symbols > $output_objdir/$soname.exp; + fi~ + $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~ + linknames=' + # The linker will not automatically build a static lib if we build a DLL. + # _LT_TAGVAR(old_archive_from_new_cmds, CXX)='true' + enable_shared_with_static_runtimes_CXX=yes + # Don't use ranlib + old_postinstall_cmds_CXX='chmod 644 $oldlib' + postlink_cmds_CXX='lt_outputfile="@OUTPUT@"~ + lt_tool_outputfile="@TOOL_OUTPUT@"~ + case $lt_outputfile in + *.exe|*.EXE) ;; + *) + lt_outputfile="$lt_outputfile.exe" + lt_tool_outputfile="$lt_tool_outputfile.exe" + ;; + esac~ + func_to_tool_file "$lt_outputfile"~ + if test "$MANIFEST_TOOL" != ":" && test -f "$lt_outputfile.manifest"; then + $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1; + $RM "$lt_outputfile.manifest"; + fi' + ;; + *) + # g++ + # _LT_TAGVAR(hardcode_libdir_flag_spec, CXX) is actually meaningless, + # as there is no search path for DLLs. + hardcode_libdir_flag_spec_CXX='-L$libdir' + export_dynamic_flag_spec_CXX='${wl}--export-all-symbols' + allow_undefined_flag_CXX=unsupported + always_export_symbols_CXX=no + enable_shared_with_static_runtimes_CXX=yes + + if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then + archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' + # If the export-symbols file already is a .def file (1st line + # is EXPORTS), use it as is; otherwise, prepend... + archive_expsym_cmds_CXX='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then + cp $export_symbols $output_objdir/$soname.def; + else + echo EXPORTS > $output_objdir/$soname.def; + cat $export_symbols >> $output_objdir/$soname.def; + fi~ + $CC -shared -nostdlib $output_objdir/$soname.def $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' + else + ld_shlibs_CXX=no + fi + ;; + esac + ;; + darwin* | rhapsody*) + + + archive_cmds_need_lc_CXX=no + hardcode_direct_CXX=no + hardcode_automatic_CXX=yes + hardcode_shlibpath_var_CXX=unsupported + if test "$lt_cv_ld_force_load" = "yes"; then + whole_archive_flag_spec_CXX='`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience ${wl}-force_load,$conv\"; done; func_echo_all \"$new_convenience\"`' + + else + whole_archive_flag_spec_CXX='' + fi + link_all_deplibs_CXX=yes + allow_undefined_flag_CXX="$_lt_dar_allow_undefined" + case $cc_basename in + ifort*) _lt_dar_can_shared=yes ;; + *) _lt_dar_can_shared=$GCC ;; + esac + if test "$_lt_dar_can_shared" = "yes"; then + output_verbose_link_cmd=func_echo_all + archive_cmds_CXX="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod${_lt_dsymutil}" + module_cmds_CXX="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dsymutil}" + archive_expsym_cmds_CXX="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring ${_lt_dar_single_mod}${_lt_dar_export_syms}${_lt_dsymutil}" + module_expsym_cmds_CXX="sed -e 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dar_export_syms}${_lt_dsymutil}" + if test "$lt_cv_apple_cc_single_mod" != "yes"; then + archive_cmds_CXX="\$CC -r -keep_private_externs -nostdlib -o \${lib}-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \${lib}-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring${_lt_dsymutil}" + archive_expsym_cmds_CXX="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -r -keep_private_externs -nostdlib -o \${lib}-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \${lib}-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring${_lt_dar_export_syms}${_lt_dsymutil}" + fi + + else + ld_shlibs_CXX=no + fi + + ;; + + dgux*) + case $cc_basename in + ec++*) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + ghcx*) + # Green Hills C++ Compiler + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + *) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + esac + ;; + + freebsd2.*) + # C++ shared libraries reported to be fairly broken before + # switch to ELF + ld_shlibs_CXX=no + ;; + + freebsd-elf*) + archive_cmds_need_lc_CXX=no + ;; + + freebsd* | dragonfly*) + # FreeBSD 3 and later use GNU C++ and GNU ld with standard ELF + # conventions + ld_shlibs_CXX=yes + ;; + + gnu*) + ;; + + haiku*) + archive_cmds_CXX='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + link_all_deplibs_CXX=yes + ;; + + hpux9*) + hardcode_libdir_flag_spec_CXX='${wl}+b ${wl}$libdir' + hardcode_libdir_separator_CXX=: + export_dynamic_flag_spec_CXX='${wl}-E' + hardcode_direct_CXX=yes + hardcode_minus_L_CXX=yes # Not in the search PATH, + # but as the default + # location of the library. + + case $cc_basename in + CC*) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + aCC*) + archive_cmds_CXX='$RM $output_objdir/$soname~$CC -b ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $EGREP "\-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' + ;; + *) + if test "$GXX" = yes; then + archive_cmds_CXX='$RM $output_objdir/$soname~$CC -shared -nostdlib $pic_flag ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' + else + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + fi + ;; + esac + ;; + + hpux10*|hpux11*) + if test $with_gnu_ld = no; then + hardcode_libdir_flag_spec_CXX='${wl}+b ${wl}$libdir' + hardcode_libdir_separator_CXX=: + + case $host_cpu in + hppa*64*|ia64*) + ;; + *) + export_dynamic_flag_spec_CXX='${wl}-E' + ;; + esac + fi + case $host_cpu in + hppa*64*|ia64*) + hardcode_direct_CXX=no + hardcode_shlibpath_var_CXX=no + ;; + *) + hardcode_direct_CXX=yes + hardcode_direct_absolute_CXX=yes + hardcode_minus_L_CXX=yes # Not in the search PATH, + # but as the default + # location of the library. + ;; + esac + + case $cc_basename in + CC*) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + aCC*) + case $host_cpu in + hppa*64*) + archive_cmds_CXX='$CC -b ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + ia64*) + archive_cmds_CXX='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + *) + archive_cmds_CXX='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + esac + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $GREP "\-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' + ;; + *) + if test "$GXX" = yes; then + if test $with_gnu_ld = no; then + case $host_cpu in + hppa*64*) + archive_cmds_CXX='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + ia64*) + archive_cmds_CXX='$CC -shared -nostdlib $pic_flag ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + *) + archive_cmds_CXX='$CC -shared -nostdlib $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + esac + fi + else + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + fi + ;; + esac + ;; + + interix[3-9]*) + hardcode_direct_CXX=no + hardcode_shlibpath_var_CXX=no + hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir' + export_dynamic_flag_spec_CXX='${wl}-E' + # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. + # Instead, shared libraries are loaded at an image base (0x10000000 by + # default) and relocated if they conflict, which is a slow very memory + # consuming and fragmenting process. To avoid this, we pick a random, + # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link + # time. Moving up from 0x10000000 also allows more sbrk(2) space. + archive_cmds_CXX='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' + archive_expsym_cmds_CXX='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' + ;; + irix5* | irix6*) + case $cc_basename in + CC*) + # SGI C++ + archive_cmds_CXX='$CC -shared -all -multigot $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' + + # Archives containing C++ object files must be created using + # "CC -ar", where "CC" is the IRIX C++ compiler. This is + # necessary to make sure instantiated templates are included + # in the archive. + old_archive_cmds_CXX='$CC -ar -WR,-u -o $oldlib $oldobjs' + ;; + *) + if test "$GXX" = yes; then + if test "$with_gnu_ld" = no; then + archive_cmds_CXX='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + else + archive_cmds_CXX='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` -o $lib' + fi + fi + link_all_deplibs_CXX=yes + ;; + esac + hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir' + hardcode_libdir_separator_CXX=: + inherit_rpath_CXX=yes + ;; + + linux* | k*bsd*-gnu | kopensolaris*-gnu) + case $cc_basename in + KCC*) + # Kuck and Associates, Inc. (KAI) C++ Compiler + + # KCC will only create a shared library if the output file + # ends with ".so" (or ".sl" for HP-UX), so rename the library + # to its proper name (with version) after linking. + archive_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' + archive_expsym_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib ${wl}-retain-symbols-file,$export_symbols; mv \$templib $lib' + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`$CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 | $GREP "ld"`; rm -f libconftest$shared_ext; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' + + hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir' + export_dynamic_flag_spec_CXX='${wl}--export-dynamic' + + # Archives containing C++ object files must be created using + # "CC -Bstatic", where "CC" is the KAI C++ compiler. + old_archive_cmds_CXX='$CC -Bstatic -o $oldlib $oldobjs' + ;; + icpc* | ecpc* ) + # Intel C++ + with_gnu_ld=yes + # version 8.0 and above of icpc choke on multiply defined symbols + # if we add $predep_objects and $postdep_objects, however 7.1 and + # earlier do not add the objects themselves. + case `$CC -V 2>&1` in + *"Version 7."*) + archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' + archive_expsym_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + ;; + *) # Version 8.0 or newer + tmp_idyn= + case $host_cpu in + ia64*) tmp_idyn=' -i_dynamic';; + esac + archive_cmds_CXX='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + archive_expsym_cmds_CXX='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + ;; + esac + archive_cmds_need_lc_CXX=no + hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir' + export_dynamic_flag_spec_CXX='${wl}--export-dynamic' + whole_archive_flag_spec_CXX='${wl}--whole-archive$convenience ${wl}--no-whole-archive' + ;; + pgCC* | pgcpp*) + # Portland Group C++ compiler + case `$CC -V` in + *pgCC\ [1-5].* | *pgcpp\ [1-5].*) + prelink_cmds_CXX='tpldir=Template.dir~ + rm -rf $tpldir~ + $CC --prelink_objects --instantiation_dir $tpldir $objs $libobjs $compile_deplibs~ + compile_command="$compile_command `find $tpldir -name \*.o | sort | $NL2SP`"' + old_archive_cmds_CXX='tpldir=Template.dir~ + rm -rf $tpldir~ + $CC --prelink_objects --instantiation_dir $tpldir $oldobjs$old_deplibs~ + $AR $AR_FLAGS $oldlib$oldobjs$old_deplibs `find $tpldir -name \*.o | sort | $NL2SP`~ + $RANLIB $oldlib' + archive_cmds_CXX='tpldir=Template.dir~ + rm -rf $tpldir~ + $CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~ + $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname -o $lib' + archive_expsym_cmds_CXX='tpldir=Template.dir~ + rm -rf $tpldir~ + $CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~ + $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname ${wl}-retain-symbols-file ${wl}$export_symbols -o $lib' + ;; + *) # Version 6 and above use weak symbols + archive_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname -o $lib' + archive_expsym_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname ${wl}-retain-symbols-file ${wl}$export_symbols -o $lib' + ;; + esac + + hardcode_libdir_flag_spec_CXX='${wl}--rpath ${wl}$libdir' + export_dynamic_flag_spec_CXX='${wl}--export-dynamic' + whole_archive_flag_spec_CXX='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' + ;; + cxx*) + # Compaq C++ + archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' + archive_expsym_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib ${wl}-retain-symbols-file $wl$export_symbols' + + runpath_var=LD_RUN_PATH + hardcode_libdir_flag_spec_CXX='-rpath $libdir' + hardcode_libdir_separator_CXX=: + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld"`; templist=`func_echo_all "$templist" | $SED "s/\(^.*ld.*\)\( .*ld .*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "X$list" | $Xsed' + ;; + xl* | mpixl* | bgxl*) + # IBM XL 8.0 on PPC, with GNU ld + hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir' + export_dynamic_flag_spec_CXX='${wl}--export-dynamic' + archive_cmds_CXX='$CC -qmkshrobj $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + if test "x$supports_anon_versioning" = xyes; then + archive_expsym_cmds_CXX='echo "{ global:" > $output_objdir/$libname.ver~ + cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ + echo "local: *; };" >> $output_objdir/$libname.ver~ + $CC -qmkshrobj $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib' + fi + ;; + *) + case `$CC -V 2>&1 | sed 5q` in + *Sun\ C*) + # Sun C++ 5.9 + no_undefined_flag_CXX=' -zdefs' + archive_cmds_CXX='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + archive_expsym_cmds_CXX='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file ${wl}$export_symbols' + hardcode_libdir_flag_spec_CXX='-R$libdir' + whole_archive_flag_spec_CXX='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' + compiler_needs_object_CXX=yes + + # Not sure whether something based on + # $CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 + # would be better. + output_verbose_link_cmd='func_echo_all' + + # Archives containing C++ object files must be created using + # "CC -xar", where "CC" is the Sun C++ compiler. This is + # necessary to make sure instantiated templates are included + # in the archive. + old_archive_cmds_CXX='$CC -xar -o $oldlib $oldobjs' + ;; + esac + ;; + esac + ;; + + lynxos*) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + + m88k*) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + + mvs*) + case $cc_basename in + cxx*) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + *) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + esac + ;; + + netbsd*) + if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then + archive_cmds_CXX='$LD -Bshareable -o $lib $predep_objects $libobjs $deplibs $postdep_objects $linker_flags' + wlarc= + hardcode_libdir_flag_spec_CXX='-R$libdir' + hardcode_direct_CXX=yes + hardcode_shlibpath_var_CXX=no + fi + # Workaround some broken pre-1.5 toolchains + output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP conftest.$objext | $SED -e "s:-lgcc -lc -lgcc::"' + ;; + + *nto* | *qnx*) + ld_shlibs_CXX=yes + ;; + + openbsd2*) + # C++ shared libraries are fairly broken + ld_shlibs_CXX=no + ;; + + openbsd*) + if test -f /usr/libexec/ld.so; then + hardcode_direct_CXX=yes + hardcode_shlibpath_var_CXX=no + hardcode_direct_absolute_CXX=yes + archive_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib' + hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir' + if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then + archive_expsym_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file,$export_symbols -o $lib' + export_dynamic_flag_spec_CXX='${wl}-E' + whole_archive_flag_spec_CXX="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' + fi + output_verbose_link_cmd=func_echo_all + else + ld_shlibs_CXX=no + fi + ;; + + osf3* | osf4* | osf5*) + case $cc_basename in + KCC*) + # Kuck and Associates, Inc. (KAI) C++ Compiler + + # KCC will only create a shared library if the output file + # ends with ".so" (or ".sl" for HP-UX), so rename the library + # to its proper name (with version) after linking. + archive_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo "$lib" | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' + + hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir' + hardcode_libdir_separator_CXX=: + + # Archives containing C++ object files must be created using + # the KAI C++ compiler. + case $host in + osf3*) old_archive_cmds_CXX='$CC -Bstatic -o $oldlib $oldobjs' ;; + *) old_archive_cmds_CXX='$CC -o $oldlib $oldobjs' ;; + esac + ;; + RCC*) + # Rational C++ 2.4.1 + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + cxx*) + case $host in + osf3*) + allow_undefined_flag_CXX=' ${wl}-expect_unresolved ${wl}\*' + archive_cmds_CXX='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $soname `test -n "$verstring" && func_echo_all "${wl}-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' + hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir' + ;; + *) + allow_undefined_flag_CXX=' -expect_unresolved \*' + archive_cmds_CXX='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' + archive_expsym_cmds_CXX='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done~ + echo "-hidden">> $lib.exp~ + $CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname ${wl}-input ${wl}$lib.exp `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib~ + $RM $lib.exp' + hardcode_libdir_flag_spec_CXX='-rpath $libdir' + ;; + esac + + hardcode_libdir_separator_CXX=: + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld" | $GREP -v "ld:"`; templist=`func_echo_all "$templist" | $SED "s/\(^.*ld.*\)\( .*ld.*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' + ;; + *) + if test "$GXX" = yes && test "$with_gnu_ld" = no; then + allow_undefined_flag_CXX=' ${wl}-expect_unresolved ${wl}\*' + case $host in + osf3*) + archive_cmds_CXX='$CC -shared -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + ;; + *) + archive_cmds_CXX='$CC -shared $pic_flag -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + ;; + esac + + hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir' + hardcode_libdir_separator_CXX=: + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' + + else + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + fi + ;; + esac + ;; + + psos*) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + + sunos4*) + case $cc_basename in + CC*) + # Sun C++ 4.x + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + lcc*) + # Lucid + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + *) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + esac + ;; + + solaris*) + case $cc_basename in + CC* | sunCC*) + # Sun C++ 4.2, 5.x and Centerline C++ + archive_cmds_need_lc_CXX=yes + no_undefined_flag_CXX=' -zdefs' + archive_cmds_CXX='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + archive_expsym_cmds_CXX='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ + $CC -G${allow_undefined_flag} ${wl}-M ${wl}$lib.exp -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' + + hardcode_libdir_flag_spec_CXX='-R$libdir' + hardcode_shlibpath_var_CXX=no + case $host_os in + solaris2.[0-5] | solaris2.[0-5].*) ;; + *) + # The compiler driver will combine and reorder linker options, + # but understands `-z linker_flag'. + # Supported since Solaris 2.6 (maybe 2.5.1?) + whole_archive_flag_spec_CXX='-z allextract$convenience -z defaultextract' + ;; + esac + link_all_deplibs_CXX=yes + + output_verbose_link_cmd='func_echo_all' + + # Archives containing C++ object files must be created using + # "CC -xar", where "CC" is the Sun C++ compiler. This is + # necessary to make sure instantiated templates are included + # in the archive. + old_archive_cmds_CXX='$CC -xar -o $oldlib $oldobjs' + ;; + gcx*) + # Green Hills C++ Compiler + archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' + + # The C++ compiler must be used to create the archive. + old_archive_cmds_CXX='$CC $LDFLAGS -archive -o $oldlib $oldobjs' + ;; + *) + # GNU C++ compiler with Solaris linker + if test "$GXX" = yes && test "$with_gnu_ld" = no; then + no_undefined_flag_CXX=' ${wl}-z ${wl}defs' + if $CC --version | $GREP -v '^2\.7' > /dev/null; then + archive_cmds_CXX='$CC -shared $pic_flag -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' + archive_expsym_cmds_CXX='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ + $CC -shared $pic_flag -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' + else + # g++ 2.7 appears to require `-G' NOT `-shared' on this + # platform. + archive_cmds_CXX='$CC -G -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' + archive_expsym_cmds_CXX='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ + $CC -G -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + output_verbose_link_cmd='$CC -G $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' + fi + + hardcode_libdir_flag_spec_CXX='${wl}-R $wl$libdir' + case $host_os in + solaris2.[0-5] | solaris2.[0-5].*) ;; + *) + whole_archive_flag_spec_CXX='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract' + ;; + esac + fi + ;; + esac + ;; + + sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7* | sco3.2v5.0.[024]*) + no_undefined_flag_CXX='${wl}-z,text' + archive_cmds_need_lc_CXX=no + hardcode_shlibpath_var_CXX=no + runpath_var='LD_RUN_PATH' + + case $cc_basename in + CC*) + archive_cmds_CXX='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds_CXX='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + *) + archive_cmds_CXX='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds_CXX='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + esac + ;; + + sysv5* | sco3.2v5* | sco5v6*) + # Note: We can NOT use -z defs as we might desire, because we do not + # link with -lc, and that would cause any symbols used from libc to + # always be unresolved, which means just about no library would + # ever link correctly. If we're not using GNU ld we use -z text + # though, which does catch some bad symbols but isn't as heavy-handed + # as -z defs. + no_undefined_flag_CXX='${wl}-z,text' + allow_undefined_flag_CXX='${wl}-z,nodefs' + archive_cmds_need_lc_CXX=no + hardcode_shlibpath_var_CXX=no + hardcode_libdir_flag_spec_CXX='${wl}-R,$libdir' + hardcode_libdir_separator_CXX=':' + link_all_deplibs_CXX=yes + export_dynamic_flag_spec_CXX='${wl}-Bexport' + runpath_var='LD_RUN_PATH' + + case $cc_basename in + CC*) + archive_cmds_CXX='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds_CXX='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + old_archive_cmds_CXX='$CC -Tprelink_objects $oldobjs~ + '"$old_archive_cmds_CXX" + reload_cmds_CXX='$CC -Tprelink_objects $reload_objs~ + '"$reload_cmds_CXX" + ;; + *) + archive_cmds_CXX='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds_CXX='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + esac + ;; + + tandem*) + case $cc_basename in + NCC*) + # NonStop-UX NCC 3.20 + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + *) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + esac + ;; + + vxworks*) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + + *) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + esac + + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ld_shlibs_CXX" >&5 +$as_echo "$ld_shlibs_CXX" >&6; } + test "$ld_shlibs_CXX" = no && can_build_shared=no + + GCC_CXX="$GXX" + LD_CXX="$LD" + + ## CAVEAT EMPTOR: + ## There is no encapsulation within the following macros, do not change + ## the running order or otherwise move them around unless you know exactly + ## what you are doing... + # Dependencies to place before and after the object being linked: +predep_objects_CXX= +postdep_objects_CXX= +predeps_CXX= +postdeps_CXX= +compiler_lib_search_path_CXX= + +cat > conftest.$ac_ext <<_LT_EOF +class Foo +{ +public: + Foo (void) { a = 0; } +private: + int a; +}; +_LT_EOF + + +_lt_libdeps_save_CFLAGS=$CFLAGS +case "$CC $CFLAGS " in #( +*\ -flto*\ *) CFLAGS="$CFLAGS -fno-lto" ;; +*\ -fwhopr*\ *) CFLAGS="$CFLAGS -fno-whopr" ;; +*\ -fuse-linker-plugin*\ *) CFLAGS="$CFLAGS -fno-use-linker-plugin" ;; +esac + +if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + # Parse the compiler output and extract the necessary + # objects, libraries and library flags. + + # Sentinel used to keep track of whether or not we are before + # the conftest object file. + pre_test_object_deps_done=no + + for p in `eval "$output_verbose_link_cmd"`; do + case ${prev}${p} in + + -L* | -R* | -l*) + # Some compilers place space between "-{L,R}" and the path. + # Remove the space. + if test $p = "-L" || + test $p = "-R"; then + prev=$p + continue + fi + + # Expand the sysroot to ease extracting the directories later. + if test -z "$prev"; then + case $p in + -L*) func_stripname_cnf '-L' '' "$p"; prev=-L; p=$func_stripname_result ;; + -R*) func_stripname_cnf '-R' '' "$p"; prev=-R; p=$func_stripname_result ;; + -l*) func_stripname_cnf '-l' '' "$p"; prev=-l; p=$func_stripname_result ;; + esac + fi + case $p in + =*) func_stripname_cnf '=' '' "$p"; p=$lt_sysroot$func_stripname_result ;; + esac + if test "$pre_test_object_deps_done" = no; then + case ${prev} in + -L | -R) + # Internal compiler library paths should come after those + # provided the user. The postdeps already come after the + # user supplied libs so there is no need to process them. + if test -z "$compiler_lib_search_path_CXX"; then + compiler_lib_search_path_CXX="${prev}${p}" + else + compiler_lib_search_path_CXX="${compiler_lib_search_path_CXX} ${prev}${p}" + fi + ;; + # The "-l" case would never come before the object being + # linked, so don't bother handling this case. + esac + else + if test -z "$postdeps_CXX"; then + postdeps_CXX="${prev}${p}" + else + postdeps_CXX="${postdeps_CXX} ${prev}${p}" + fi + fi + prev= + ;; + + *.lto.$objext) ;; # Ignore GCC LTO objects + *.$objext) + # This assumes that the test object file only shows up + # once in the compiler output. + if test "$p" = "conftest.$objext"; then + pre_test_object_deps_done=yes + continue + fi + + if test "$pre_test_object_deps_done" = no; then + if test -z "$predep_objects_CXX"; then + predep_objects_CXX="$p" + else + predep_objects_CXX="$predep_objects_CXX $p" + fi + else + if test -z "$postdep_objects_CXX"; then + postdep_objects_CXX="$p" + else + postdep_objects_CXX="$postdep_objects_CXX $p" + fi + fi + ;; + + *) ;; # Ignore the rest. + + esac + done + + # Clean up. + rm -f a.out a.exe +else + echo "libtool.m4: error: problem compiling CXX test program" +fi + +$RM -f confest.$objext +CFLAGS=$_lt_libdeps_save_CFLAGS + +# PORTME: override above test on systems where it is broken +case $host_os in +interix[3-9]*) + # Interix 3.5 installs completely hosed .la files for C++, so rather than + # hack all around it, let's just trust "g++" to DTRT. + predep_objects_CXX= + postdep_objects_CXX= + postdeps_CXX= + ;; + +linux*) + case `$CC -V 2>&1 | sed 5q` in + *Sun\ C*) + # Sun C++ 5.9 + + # The more standards-conforming stlport4 library is + # incompatible with the Cstd library. Avoid specifying + # it if it's in CXXFLAGS. Ignore libCrun as + # -library=stlport4 depends on it. + case " $CXX $CXXFLAGS " in + *" -library=stlport4 "*) + solaris_use_stlport4=yes + ;; + esac + + if test "$solaris_use_stlport4" != yes; then + postdeps_CXX='-library=Cstd -library=Crun' + fi + ;; + esac + ;; + +solaris*) + case $cc_basename in + CC* | sunCC*) + # The more standards-conforming stlport4 library is + # incompatible with the Cstd library. Avoid specifying + # it if it's in CXXFLAGS. Ignore libCrun as + # -library=stlport4 depends on it. + case " $CXX $CXXFLAGS " in + *" -library=stlport4 "*) + solaris_use_stlport4=yes + ;; + esac + + # Adding this requires a known-good setup of shared libraries for + # Sun compiler versions before 5.6, else PIC objects from an old + # archive will be linked into the output, leading to subtle bugs. + if test "$solaris_use_stlport4" != yes; then + postdeps_CXX='-library=Cstd -library=Crun' + fi + ;; + esac + ;; +esac + + +case " $postdeps_CXX " in +*" -lc "*) archive_cmds_need_lc_CXX=no ;; +esac + compiler_lib_search_dirs_CXX= +if test -n "${compiler_lib_search_path_CXX}"; then + compiler_lib_search_dirs_CXX=`echo " ${compiler_lib_search_path_CXX}" | ${SED} -e 's! -L! !g' -e 's!^ !!'` +fi + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + lt_prog_compiler_wl_CXX= +lt_prog_compiler_pic_CXX= +lt_prog_compiler_static_CXX= + + + # C++ specific cases for pic, static, wl, etc. + if test "$GXX" = yes; then + lt_prog_compiler_wl_CXX='-Wl,' + lt_prog_compiler_static_CXX='-static' + + case $host_os in + aix*) + # All AIX code is PIC. + if test "$host_cpu" = ia64; then + # AIX 5 now supports IA64 processor + lt_prog_compiler_static_CXX='-Bstatic' + fi + ;; + + amigaos*) + case $host_cpu in + powerpc) + # see comment about AmigaOS4 .so support + lt_prog_compiler_pic_CXX='-fPIC' + ;; + m68k) + # FIXME: we need at least 68020 code to build shared libraries, but + # adding the `-m68020' flag to GCC prevents building anything better, + # like `-m68040'. + lt_prog_compiler_pic_CXX='-m68020 -resident32 -malways-restore-a4' + ;; + esac + ;; + + beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) + # PIC is the default for these OSes. + ;; + mingw* | cygwin* | os2* | pw32* | cegcc*) + # This hack is so that the source file can tell whether it is being + # built for inclusion in a dll (and should export symbols for example). + # Although the cygwin gcc ignores -fPIC, still need this for old-style + # (--disable-auto-import) libraries + lt_prog_compiler_pic_CXX='-DDLL_EXPORT' + ;; + darwin* | rhapsody*) + # PIC is the default on this platform + # Common symbols not allowed in MH_DYLIB files + lt_prog_compiler_pic_CXX='-fno-common' + ;; + *djgpp*) + # DJGPP does not support shared libraries at all + lt_prog_compiler_pic_CXX= + ;; + haiku*) + # PIC is the default for Haiku. + # The "-static" flag exists, but is broken. + lt_prog_compiler_static_CXX= + ;; + interix[3-9]*) + # Interix 3.x gcc -fpic/-fPIC options generate broken code. + # Instead, we relocate shared libraries at runtime. + ;; + sysv4*MP*) + if test -d /usr/nec; then + lt_prog_compiler_pic_CXX=-Kconform_pic + fi + ;; + hpux*) + # PIC is the default for 64-bit PA HP-UX, but not for 32-bit + # PA HP-UX. On IA64 HP-UX, PIC is the default but the pic flag + # sets the default TLS model and affects inlining. + case $host_cpu in + hppa*64*) + ;; + *) + lt_prog_compiler_pic_CXX='-fPIC' + ;; + esac + ;; + *qnx* | *nto*) + # QNX uses GNU C++, but need to define -shared option too, otherwise + # it will coredump. + lt_prog_compiler_pic_CXX='-fPIC -shared' + ;; + *) + lt_prog_compiler_pic_CXX='-fPIC' + ;; + esac + else + case $host_os in + aix[4-9]*) + # All AIX code is PIC. + if test "$host_cpu" = ia64; then + # AIX 5 now supports IA64 processor + lt_prog_compiler_static_CXX='-Bstatic' + else + lt_prog_compiler_static_CXX='-bnso -bI:/lib/syscalls.exp' + fi + ;; + chorus*) + case $cc_basename in + cxch68*) + # Green Hills C++ Compiler + # _LT_TAGVAR(lt_prog_compiler_static, CXX)="--no_auto_instantiation -u __main -u __premain -u _abort -r $COOL_DIR/lib/libOrb.a $MVME_DIR/lib/CC/libC.a $MVME_DIR/lib/classix/libcx.s.a" + ;; + esac + ;; + mingw* | cygwin* | os2* | pw32* | cegcc*) + # This hack is so that the source file can tell whether it is being + # built for inclusion in a dll (and should export symbols for example). + lt_prog_compiler_pic_CXX='-DDLL_EXPORT' + ;; + dgux*) + case $cc_basename in + ec++*) + lt_prog_compiler_pic_CXX='-KPIC' + ;; + ghcx*) + # Green Hills C++ Compiler + lt_prog_compiler_pic_CXX='-pic' + ;; + *) + ;; + esac + ;; + freebsd* | dragonfly*) + # FreeBSD uses GNU C++ + ;; + hpux9* | hpux10* | hpux11*) + case $cc_basename in + CC*) + lt_prog_compiler_wl_CXX='-Wl,' + lt_prog_compiler_static_CXX='${wl}-a ${wl}archive' + if test "$host_cpu" != ia64; then + lt_prog_compiler_pic_CXX='+Z' + fi + ;; + aCC*) + lt_prog_compiler_wl_CXX='-Wl,' + lt_prog_compiler_static_CXX='${wl}-a ${wl}archive' + case $host_cpu in + hppa*64*|ia64*) + # +Z the default + ;; + *) + lt_prog_compiler_pic_CXX='+Z' + ;; + esac + ;; + *) + ;; + esac + ;; + interix*) + # This is c89, which is MS Visual C++ (no shared libs) + # Anyone wants to do a port? + ;; + irix5* | irix6* | nonstopux*) + case $cc_basename in + CC*) + lt_prog_compiler_wl_CXX='-Wl,' + lt_prog_compiler_static_CXX='-non_shared' + # CC pic flag -KPIC is the default. + ;; + *) + ;; + esac + ;; + linux* | k*bsd*-gnu | kopensolaris*-gnu) + case $cc_basename in + KCC*) + # KAI C++ Compiler + lt_prog_compiler_wl_CXX='--backend -Wl,' + lt_prog_compiler_pic_CXX='-fPIC' + ;; + ecpc* ) + # old Intel C++ for x86_64 which still supported -KPIC. + lt_prog_compiler_wl_CXX='-Wl,' + lt_prog_compiler_pic_CXX='-KPIC' + lt_prog_compiler_static_CXX='-static' + ;; + icpc* ) + # Intel C++, used to be incompatible with GCC. + # ICC 10 doesn't accept -KPIC any more. + lt_prog_compiler_wl_CXX='-Wl,' + lt_prog_compiler_pic_CXX='-fPIC' + lt_prog_compiler_static_CXX='-static' + ;; + pgCC* | pgcpp*) + # Portland Group C++ compiler + lt_prog_compiler_wl_CXX='-Wl,' + lt_prog_compiler_pic_CXX='-fpic' + lt_prog_compiler_static_CXX='-Bstatic' + ;; + cxx*) + # Compaq C++ + # Make sure the PIC flag is empty. It appears that all Alpha + # Linux and Compaq Tru64 Unix objects are PIC. + lt_prog_compiler_pic_CXX= + lt_prog_compiler_static_CXX='-non_shared' + ;; + xlc* | xlC* | bgxl[cC]* | mpixl[cC]*) + # IBM XL 8.0, 9.0 on PPC and BlueGene + lt_prog_compiler_wl_CXX='-Wl,' + lt_prog_compiler_pic_CXX='-qpic' + lt_prog_compiler_static_CXX='-qstaticlink' + ;; + *) + case `$CC -V 2>&1 | sed 5q` in + *Sun\ C*) + # Sun C++ 5.9 + lt_prog_compiler_pic_CXX='-KPIC' + lt_prog_compiler_static_CXX='-Bstatic' + lt_prog_compiler_wl_CXX='-Qoption ld ' + ;; + esac + ;; + esac + ;; + lynxos*) + ;; + m88k*) + ;; + mvs*) + case $cc_basename in + cxx*) + lt_prog_compiler_pic_CXX='-W c,exportall' + ;; + *) + ;; + esac + ;; + netbsd* | netbsdelf*-gnu) + ;; + *qnx* | *nto*) + # QNX uses GNU C++, but need to define -shared option too, otherwise + # it will coredump. + lt_prog_compiler_pic_CXX='-fPIC -shared' + ;; + osf3* | osf4* | osf5*) + case $cc_basename in + KCC*) + lt_prog_compiler_wl_CXX='--backend -Wl,' + ;; + RCC*) + # Rational C++ 2.4.1 + lt_prog_compiler_pic_CXX='-pic' + ;; + cxx*) + # Digital/Compaq C++ + lt_prog_compiler_wl_CXX='-Wl,' + # Make sure the PIC flag is empty. It appears that all Alpha + # Linux and Compaq Tru64 Unix objects are PIC. + lt_prog_compiler_pic_CXX= + lt_prog_compiler_static_CXX='-non_shared' + ;; + *) + ;; + esac + ;; + psos*) + ;; + solaris*) + case $cc_basename in + CC* | sunCC*) + # Sun C++ 4.2, 5.x and Centerline C++ + lt_prog_compiler_pic_CXX='-KPIC' + lt_prog_compiler_static_CXX='-Bstatic' + lt_prog_compiler_wl_CXX='-Qoption ld ' + ;; + gcx*) + # Green Hills C++ Compiler + lt_prog_compiler_pic_CXX='-PIC' + ;; + *) + ;; + esac + ;; + sunos4*) + case $cc_basename in + CC*) + # Sun C++ 4.x + lt_prog_compiler_pic_CXX='-pic' + lt_prog_compiler_static_CXX='-Bstatic' + ;; + lcc*) + # Lucid + lt_prog_compiler_pic_CXX='-pic' + ;; + *) + ;; + esac + ;; + sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) + case $cc_basename in + CC*) + lt_prog_compiler_wl_CXX='-Wl,' + lt_prog_compiler_pic_CXX='-KPIC' + lt_prog_compiler_static_CXX='-Bstatic' + ;; + esac + ;; + tandem*) + case $cc_basename in + NCC*) + # NonStop-UX NCC 3.20 + lt_prog_compiler_pic_CXX='-KPIC' + ;; + *) + ;; + esac + ;; + vxworks*) + ;; + *) + lt_prog_compiler_can_build_shared_CXX=no + ;; + esac + fi + +case $host_os in + # For platforms which do not support PIC, -DPIC is meaningless: + *djgpp*) + lt_prog_compiler_pic_CXX= + ;; + *) + lt_prog_compiler_pic_CXX="$lt_prog_compiler_pic_CXX@&t@ -DPIC" + ;; +esac + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $compiler option to produce PIC" >&5 +$as_echo_n "checking for $compiler option to produce PIC... " >&6; } +if ${lt_cv_prog_compiler_pic_CXX+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_prog_compiler_pic_CXX=$lt_prog_compiler_pic_CXX +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic_CXX" >&5 +$as_echo "$lt_cv_prog_compiler_pic_CXX" >&6; } +lt_prog_compiler_pic_CXX=$lt_cv_prog_compiler_pic_CXX + +# +# Check to make sure the PIC flag actually works. +# +if test -n "$lt_prog_compiler_pic_CXX"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler PIC flag $lt_prog_compiler_pic_CXX works" >&5 +$as_echo_n "checking if $compiler PIC flag $lt_prog_compiler_pic_CXX works... " >&6; } +if ${lt_cv_prog_compiler_pic_works_CXX+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_prog_compiler_pic_works_CXX=no + ac_outfile=conftest.$ac_objext + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + lt_compiler_flag="$lt_prog_compiler_pic_CXX@&t@ -DPIC" + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + # The option is referenced via a variable to avoid confusing sed. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ + -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) + (eval "$lt_compile" 2>conftest.err) + ac_status=$? + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + if (exit $ac_status) && test -s "$ac_outfile"; then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings other than the usual output. + $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp + $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 + if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then + lt_cv_prog_compiler_pic_works_CXX=yes + fi + fi + $RM conftest* + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic_works_CXX" >&5 +$as_echo "$lt_cv_prog_compiler_pic_works_CXX" >&6; } + +if test x"$lt_cv_prog_compiler_pic_works_CXX" = xyes; then + case $lt_prog_compiler_pic_CXX in + "" | " "*) ;; + *) lt_prog_compiler_pic_CXX=" $lt_prog_compiler_pic_CXX" ;; + esac +else + lt_prog_compiler_pic_CXX= + lt_prog_compiler_can_build_shared_CXX=no +fi + +fi + + + + + +# +# Check to make sure the static flag actually works. +# +wl=$lt_prog_compiler_wl_CXX eval lt_tmp_static_flag=\"$lt_prog_compiler_static_CXX\" +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler static flag $lt_tmp_static_flag works" >&5 +$as_echo_n "checking if $compiler static flag $lt_tmp_static_flag works... " >&6; } +if ${lt_cv_prog_compiler_static_works_CXX+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_prog_compiler_static_works_CXX=no + save_LDFLAGS="$LDFLAGS" + LDFLAGS="$LDFLAGS $lt_tmp_static_flag" + echo "$lt_simple_link_test_code" > conftest.$ac_ext + if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then + # The linker can only warn and ignore the option if not recognized + # So say no if there are warnings + if test -s conftest.err; then + # Append any errors to the config.log. + cat conftest.err 1>&5 + $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp + $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 + if diff conftest.exp conftest.er2 >/dev/null; then + lt_cv_prog_compiler_static_works_CXX=yes + fi + else + lt_cv_prog_compiler_static_works_CXX=yes + fi + fi + $RM -r conftest* + LDFLAGS="$save_LDFLAGS" + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_static_works_CXX" >&5 +$as_echo "$lt_cv_prog_compiler_static_works_CXX" >&6; } + +if test x"$lt_cv_prog_compiler_static_works_CXX" = xyes; then + : +else + lt_prog_compiler_static_CXX= +fi + + + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5 +$as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; } +if ${lt_cv_prog_compiler_c_o_CXX+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_prog_compiler_c_o_CXX=no + $RM -r conftest 2>/dev/null + mkdir conftest + cd conftest + mkdir out + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + + lt_compiler_flag="-o out/conftest2.$ac_objext" + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ + -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) + (eval "$lt_compile" 2>out/conftest.err) + ac_status=$? + cat out/conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + if (exit $ac_status) && test -s out/conftest2.$ac_objext + then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings + $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp + $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 + if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then + lt_cv_prog_compiler_c_o_CXX=yes + fi + fi + chmod u+w . 2>&5 + $RM conftest* + # SGI C++ compiler will create directory out/ii_files/ for + # template instantiation + test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files + $RM out/* && rmdir out + cd .. + $RM -r conftest + $RM conftest* + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o_CXX" >&5 +$as_echo "$lt_cv_prog_compiler_c_o_CXX" >&6; } + + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5 +$as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; } +if ${lt_cv_prog_compiler_c_o_CXX+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_prog_compiler_c_o_CXX=no + $RM -r conftest 2>/dev/null + mkdir conftest + cd conftest + mkdir out + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + + lt_compiler_flag="-o out/conftest2.$ac_objext" + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ + -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) + (eval "$lt_compile" 2>out/conftest.err) + ac_status=$? + cat out/conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + if (exit $ac_status) && test -s out/conftest2.$ac_objext + then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings + $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp + $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 + if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then + lt_cv_prog_compiler_c_o_CXX=yes + fi + fi + chmod u+w . 2>&5 + $RM conftest* + # SGI C++ compiler will create directory out/ii_files/ for + # template instantiation + test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files + $RM out/* && rmdir out + cd .. + $RM -r conftest + $RM conftest* + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o_CXX" >&5 +$as_echo "$lt_cv_prog_compiler_c_o_CXX" >&6; } + + + + +hard_links="nottested" +if test "$lt_cv_prog_compiler_c_o_CXX" = no && test "$need_locks" != no; then + # do not overwrite the value of need_locks provided by the user + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if we can lock with hard links" >&5 +$as_echo_n "checking if we can lock with hard links... " >&6; } + hard_links=yes + $RM conftest* + ln conftest.a conftest.b 2>/dev/null && hard_links=no + touch conftest.a + ln conftest.a conftest.b 2>&5 || hard_links=no + ln conftest.a conftest.b 2>/dev/null && hard_links=no + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $hard_links" >&5 +$as_echo "$hard_links" >&6; } + if test "$hard_links" = no; then + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&5 +$as_echo "$as_me: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&2;} + need_locks=warn + fi +else + need_locks=no +fi + + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $compiler linker ($LD) supports shared libraries" >&5 +$as_echo_n "checking whether the $compiler linker ($LD) supports shared libraries... " >&6; } + + export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' + exclude_expsyms_CXX='_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*' + case $host_os in + aix[4-9]*) + # If we're using GNU nm, then we don't want the "-C" option. + # -C means demangle to AIX nm, but means don't demangle with GNU nm + # Also, AIX nm treats weak defined symbols like other global defined + # symbols, whereas GNU nm marks them as "W". + if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then + export_symbols_cmds_CXX='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && (substr(\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' + else + export_symbols_cmds_CXX='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && (substr(\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' + fi + ;; + pw32*) + export_symbols_cmds_CXX="$ltdll_cmds" + ;; + cygwin* | mingw* | cegcc*) + case $cc_basename in + cl*) + exclude_expsyms_CXX='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*' + ;; + *) + export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1 DATA/;s/^.*[ ]__nm__\([^ ]*\)[ ][^ ]*/\1 DATA/;/^I[ ]/d;/^[AITW][ ]/s/.* //'\'' | sort | uniq > $export_symbols' + exclude_expsyms_CXX='[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname' + ;; + esac + ;; + linux* | k*bsd*-gnu | gnu*) + link_all_deplibs_CXX=no + ;; + *) + export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' + ;; + esac + +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ld_shlibs_CXX" >&5 +$as_echo "$ld_shlibs_CXX" >&6; } +test "$ld_shlibs_CXX" = no && can_build_shared=no + +with_gnu_ld_CXX=$with_gnu_ld + + + + + + +# +# Do we need to explicitly link libc? +# +case "x$archive_cmds_need_lc_CXX" in +x|xyes) + # Assume -lc should be added + archive_cmds_need_lc_CXX=yes + + if test "$enable_shared" = yes && test "$GCC" = yes; then + case $archive_cmds_CXX in + *'~'*) + # FIXME: we may have to deal with multi-command sequences. + ;; + '$CC '*) + # Test whether the compiler implicitly links with -lc since on some + # systems, -lgcc has to come before -lc. If gcc already passes -lc + # to ld, don't add -lc before -lgcc. + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether -lc should be explicitly linked in" >&5 +$as_echo_n "checking whether -lc should be explicitly linked in... " >&6; } +if ${lt_cv_archive_cmds_need_lc_CXX+:} false; then : + $as_echo_n "(cached) " >&6 +else + $RM conftest* + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } 2>conftest.err; then + soname=conftest + lib=conftest + libobjs=conftest.$ac_objext + deplibs= + wl=$lt_prog_compiler_wl_CXX + pic_flag=$lt_prog_compiler_pic_CXX + compiler_flags=-v + linker_flags=-v + verstring= + output_objdir=. + libname=conftest + lt_save_allow_undefined_flag=$allow_undefined_flag_CXX + allow_undefined_flag_CXX= + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$archive_cmds_CXX 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1\""; } >&5 + (eval $archive_cmds_CXX 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + then + lt_cv_archive_cmds_need_lc_CXX=no + else + lt_cv_archive_cmds_need_lc_CXX=yes + fi + allow_undefined_flag_CXX=$lt_save_allow_undefined_flag + else + cat conftest.err 1>&5 + fi + $RM conftest* + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_archive_cmds_need_lc_CXX" >&5 +$as_echo "$lt_cv_archive_cmds_need_lc_CXX" >&6; } + archive_cmds_need_lc_CXX=$lt_cv_archive_cmds_need_lc_CXX + ;; + esac + fi + ;; +esac + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking dynamic linker characteristics" >&5 +$as_echo_n "checking dynamic linker characteristics... " >&6; } + +library_names_spec= +libname_spec='lib$name' +soname_spec= +shrext_cmds=".so" +postinstall_cmds= +postuninstall_cmds= +finish_cmds= +finish_eval= +shlibpath_var= +shlibpath_overrides_runpath=unknown +version_type=none +dynamic_linker="$host_os ld.so" +sys_lib_dlsearch_path_spec="/lib /usr/lib" +need_lib_prefix=unknown +hardcode_into_libs=no + +# when you set need_version to no, make sure it does not cause -set_version +# flags to be left without arguments +need_version=unknown + +case $host_os in +aix3*) + version_type=linux # correct to gnu/linux during the next big refactor + library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a' + shlibpath_var=LIBPATH + + # AIX 3 has no versioning support, so we append a major version to the name. + soname_spec='${libname}${release}${shared_ext}$major' + ;; + +aix[4-9]*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + hardcode_into_libs=yes + if test "$host_cpu" = ia64; then + # AIX 5 supports IA64 + library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}' + shlibpath_var=LD_LIBRARY_PATH + else + # With GCC up to 2.95.x, collect2 would create an import file + # for dependence libraries. The import file would start with + # the line `#! .'. This would cause the generated library to + # depend on `.', always an invalid library. This was fixed in + # development snapshots of GCC prior to 3.0. + case $host_os in + aix4 | aix4.[01] | aix4.[01].*) + if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)' + echo ' yes ' + echo '#endif'; } | ${CC} -E - | $GREP yes > /dev/null; then + : + else + can_build_shared=no + fi + ;; + esac + # AIX (on Power*) has no versioning support, so currently we can not hardcode correct + # soname into executable. Probably we can add versioning support to + # collect2, so additional links can be useful in future. + if test "$aix_use_runtimelinking" = yes; then + # If using run time linking (on AIX 4.2 or later) use lib.so + # instead of lib.a to let people know that these are not + # typical AIX shared libraries. + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + else + # We preserve .a as extension for shared libraries through AIX4.2 + # and later when we are not doing run time linking. + library_names_spec='${libname}${release}.a $libname.a' + soname_spec='${libname}${release}${shared_ext}$major' + fi + shlibpath_var=LIBPATH + fi + ;; + +amigaos*) + case $host_cpu in + powerpc) + # Since July 2007 AmigaOS4 officially supports .so libraries. + # When compiling the executable, add -use-dynld -Lsobjs: to the compileline. + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + ;; + m68k) + library_names_spec='$libname.ixlibrary $libname.a' + # Create ${libname}_ixlibrary.a entries in /sys/libs. + finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`func_echo_all "$lib" | $SED '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; test $RM /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done' + ;; + esac + ;; + +beos*) + library_names_spec='${libname}${shared_ext}' + dynamic_linker="$host_os ld.so" + shlibpath_var=LIBRARY_PATH + ;; + +bsdi[45]*) + version_type=linux # correct to gnu/linux during the next big refactor + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir' + shlibpath_var=LD_LIBRARY_PATH + sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib" + sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib" + # the default ld.so.conf also contains /usr/contrib/lib and + # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow + # libtool to hard-code these into programs + ;; + +cygwin* | mingw* | pw32* | cegcc*) + version_type=windows + shrext_cmds=".dll" + need_version=no + need_lib_prefix=no + + case $GCC,$cc_basename in + yes,*) + # gcc + library_names_spec='$libname.dll.a' + # DLL is installed to $(libdir)/../bin by postinstall_cmds + postinstall_cmds='base_file=`basename \${file}`~ + dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~ + dldir=$destdir/`dirname \$dlpath`~ + test -d \$dldir || mkdir -p \$dldir~ + $install_prog $dir/$dlname \$dldir/$dlname~ + chmod a+x \$dldir/$dlname~ + if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then + eval '\''$striplib \$dldir/$dlname'\'' || exit \$?; + fi' + postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ + dlpath=$dir/\$dldll~ + $RM \$dlpath' + shlibpath_overrides_runpath=yes + + case $host_os in + cygwin*) + # Cygwin DLLs use 'cyg' prefix rather than 'lib' + soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' + + ;; + mingw* | cegcc*) + # MinGW DLLs use traditional 'lib' prefix + soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' + ;; + pw32*) + # pw32 DLLs use 'pw' prefix rather than 'lib' + library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' + ;; + esac + dynamic_linker='Win32 ld.exe' + ;; + + *,cl*) + # Native MSVC + libname_spec='$name' + soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' + library_names_spec='${libname}.dll.lib' + + case $build_os in + mingw*) + sys_lib_search_path_spec= + lt_save_ifs=$IFS + IFS=';' + for lt_path in $LIB + do + IFS=$lt_save_ifs + # Let DOS variable expansion print the short 8.3 style file name. + lt_path=`cd "$lt_path" 2>/dev/null && cmd //C "for %i in (".") do @echo %~si"` + sys_lib_search_path_spec="$sys_lib_search_path_spec $lt_path" + done + IFS=$lt_save_ifs + # Convert to MSYS style. + sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | sed -e 's|\\\\|/|g' -e 's| \\([a-zA-Z]\\):| /\\1|g' -e 's|^ ||'` + ;; + cygwin*) + # Convert to unix form, then to dos form, then back to unix form + # but this time dos style (no spaces!) so that the unix form looks + # like /cygdrive/c/PROGRA~1:/cygdr... + sys_lib_search_path_spec=`cygpath --path --unix "$LIB"` + sys_lib_search_path_spec=`cygpath --path --dos "$sys_lib_search_path_spec" 2>/dev/null` + sys_lib_search_path_spec=`cygpath --path --unix "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` + ;; + *) + sys_lib_search_path_spec="$LIB" + if $ECHO "$sys_lib_search_path_spec" | $GREP ';[c-zC-Z]:/' >/dev/null; then + # It is most probably a Windows format PATH. + sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` + else + sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` + fi + # FIXME: find the short name or the path components, as spaces are + # common. (e.g. "Program Files" -> "PROGRA~1") + ;; + esac + + # DLL is installed to $(libdir)/../bin by postinstall_cmds + postinstall_cmds='base_file=`basename \${file}`~ + dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~ + dldir=$destdir/`dirname \$dlpath`~ + test -d \$dldir || mkdir -p \$dldir~ + $install_prog $dir/$dlname \$dldir/$dlname' + postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ + dlpath=$dir/\$dldll~ + $RM \$dlpath' + shlibpath_overrides_runpath=yes + dynamic_linker='Win32 link.exe' + ;; + + *) + # Assume MSVC wrapper + library_names_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext} $libname.lib' + dynamic_linker='Win32 ld.exe' + ;; + esac + # FIXME: first we should search . and the directory the executable is in + shlibpath_var=PATH + ;; + +darwin* | rhapsody*) + dynamic_linker="$host_os dyld" + version_type=darwin + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${major}$shared_ext ${libname}$shared_ext' + soname_spec='${libname}${release}${major}$shared_ext' + shlibpath_overrides_runpath=yes + shlibpath_var=DYLD_LIBRARY_PATH + shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`' + + sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib' + ;; + +dgux*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + ;; + +freebsd* | dragonfly*) + # DragonFly does not have aout. When/if they implement a new + # versioning mechanism, adjust this. + if test -x /usr/bin/objformat; then + objformat=`/usr/bin/objformat` + else + case $host_os in + freebsd[23].*) objformat=aout ;; + *) objformat=elf ;; + esac + fi + version_type=freebsd-$objformat + case $version_type in + freebsd-elf*) + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' + need_version=no + need_lib_prefix=no + ;; + freebsd-*) + library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix' + need_version=yes + ;; + esac + shlibpath_var=LD_LIBRARY_PATH + case $host_os in + freebsd2.*) + shlibpath_overrides_runpath=yes + ;; + freebsd3.[01]* | freebsdelf3.[01]*) + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + freebsd3.[2-9]* | freebsdelf3.[2-9]* | \ + freebsd4.[0-5] | freebsdelf4.[0-5] | freebsd4.1.1 | freebsdelf4.1.1) + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; + *) # from 4.6 on, and DragonFly + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + esac + ;; + +gnu*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; + +haiku*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + dynamic_linker="$host_os runtime_loader" + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LIBRARY_PATH + shlibpath_overrides_runpath=yes + sys_lib_dlsearch_path_spec='/boot/home/config/lib /boot/common/lib /boot/system/lib' + hardcode_into_libs=yes + ;; + +hpux9* | hpux10* | hpux11*) + # Give a soname corresponding to the major version so that dld.sl refuses to + # link against other versions. + version_type=sunos + need_lib_prefix=no + need_version=no + case $host_cpu in + ia64*) + shrext_cmds='.so' + hardcode_into_libs=yes + dynamic_linker="$host_os dld.so" + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + if test "X$HPUX_IA64_MODE" = X32; then + sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib" + else + sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64" + fi + sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec + ;; + hppa*64*) + shrext_cmds='.sl' + hardcode_into_libs=yes + dynamic_linker="$host_os dld.sl" + shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH + shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64" + sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec + ;; + *) + shrext_cmds='.sl' + dynamic_linker="$host_os dld.sl" + shlibpath_var=SHLIB_PATH + shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + ;; + esac + # HP-UX runs *really* slowly unless shared libraries are mode 555, ... + postinstall_cmds='chmod 555 $lib' + # or fails outright, so override atomically: + install_override_mode=555 + ;; + +interix[3-9]*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; + +irix5* | irix6* | nonstopux*) + case $host_os in + nonstopux*) version_type=nonstopux ;; + *) + if test "$lt_cv_prog_gnu_ld" = yes; then + version_type=linux # correct to gnu/linux during the next big refactor + else + version_type=irix + fi ;; + esac + need_lib_prefix=no + need_version=no + soname_spec='${libname}${release}${shared_ext}$major' + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}' + case $host_os in + irix5* | nonstopux*) + libsuff= shlibsuff= + ;; + *) + case $LD in # libtool.m4 will add one of these switches to LD + *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") + libsuff= shlibsuff= libmagic=32-bit;; + *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") + libsuff=32 shlibsuff=N32 libmagic=N32;; + *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") + libsuff=64 shlibsuff=64 libmagic=64-bit;; + *) libsuff= shlibsuff= libmagic=never-match;; + esac + ;; + esac + shlibpath_var=LD_LIBRARY${shlibsuff}_PATH + shlibpath_overrides_runpath=no + sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}" + sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}" + hardcode_into_libs=yes + ;; + +# No shared lib support for Linux oldld, aout, or coff. +linux*oldld* | linux*aout* | linux*coff*) + dynamic_linker=no + ;; + +# This must be glibc/ELF. +linux* | k*bsd*-gnu | kopensolaris*-gnu) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + + # Some binutils ld are patched to set DT_RUNPATH + if ${lt_cv_shlibpath_overrides_runpath+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_shlibpath_overrides_runpath=no + save_LDFLAGS=$LDFLAGS + save_libdir=$libdir + eval "libdir=/foo; wl=\"$lt_prog_compiler_wl_CXX\"; \ + LDFLAGS=\"\$LDFLAGS $hardcode_libdir_flag_spec_CXX\"" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_cxx_try_link "$LINENO"; then : + if ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir" >/dev/null; then : + lt_cv_shlibpath_overrides_runpath=yes +fi +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + LDFLAGS=$save_LDFLAGS + libdir=$save_libdir + +fi + + shlibpath_overrides_runpath=$lt_cv_shlibpath_overrides_runpath + + # This implies no fast_install, which is unacceptable. + # Some rework will be needed to allow for fast_install + # before this can be enabled. + hardcode_into_libs=yes + + # Append ld.so.conf contents to the search path + if test -f /etc/ld.so.conf; then + lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \$2)); skip = 1; } { if (!skip) print \$0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[ ]*hwcap[ ]/d;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;s/"//g;/^$/d' | tr '\n' ' '` + sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra" + fi + + # We used to test for /lib/ld.so.1 and disable shared libraries on + # powerpc, because MkLinux only supported shared libraries with the + # GNU dynamic linker. Since this was broken with cross compilers, + # most powerpc-linux boxes support dynamic linking these days and + # people can always --disable-shared, the test was removed, and we + # assume the GNU/Linux dynamic linker is in use. + dynamic_linker='GNU/Linux ld.so' + ;; + +netbsdelf*-gnu) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + dynamic_linker='NetBSD ld.elf_so' + ;; + +netbsd*) + version_type=sunos + need_lib_prefix=no + need_version=no + if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' + dynamic_linker='NetBSD (a.out) ld.so' + else + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + dynamic_linker='NetBSD ld.elf_so' + fi + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + +newsos6) + version_type=linux # correct to gnu/linux during the next big refactor + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + ;; + +*nto* | *qnx*) + version_type=qnx + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + dynamic_linker='ldqnx.so' + ;; + +openbsd*) + version_type=sunos + sys_lib_dlsearch_path_spec="/usr/lib" + need_lib_prefix=no + # Some older versions of OpenBSD (3.3 at least) *do* need versioned libs. + case $host_os in + openbsd3.3 | openbsd3.3.*) need_version=yes ;; + *) need_version=no ;; + esac + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' + shlibpath_var=LD_LIBRARY_PATH + if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then + case $host_os in + openbsd2.[89] | openbsd2.[89].*) + shlibpath_overrides_runpath=no + ;; + *) + shlibpath_overrides_runpath=yes + ;; + esac + else + shlibpath_overrides_runpath=yes + fi + ;; + +os2*) + libname_spec='$name' + shrext_cmds=".dll" + need_lib_prefix=no + library_names_spec='$libname${shared_ext} $libname.a' + dynamic_linker='OS/2 ld.exe' + shlibpath_var=LIBPATH + ;; + +osf3* | osf4* | osf5*) + version_type=osf + need_lib_prefix=no + need_version=no + soname_spec='${libname}${release}${shared_ext}$major' + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + shlibpath_var=LD_LIBRARY_PATH + sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib" + sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec" + ;; + +rdos*) + dynamic_linker=no + ;; + +solaris*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + # ldd complains unless libraries are executable + postinstall_cmds='chmod +x $lib' + ;; + +sunos4*) + version_type=sunos + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' + finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + if test "$with_gnu_ld" = yes; then + need_lib_prefix=no + fi + need_version=yes + ;; + +sysv4 | sysv4.3*) + version_type=linux # correct to gnu/linux during the next big refactor + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + case $host_vendor in + sni) + shlibpath_overrides_runpath=no + need_lib_prefix=no + runpath_var=LD_RUN_PATH + ;; + siemens) + need_lib_prefix=no + ;; + motorola) + need_lib_prefix=no + need_version=no + shlibpath_overrides_runpath=no + sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib' + ;; + esac + ;; + +sysv4*MP*) + if test -d /usr/nec ;then + version_type=linux # correct to gnu/linux during the next big refactor + library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}' + soname_spec='$libname${shared_ext}.$major' + shlibpath_var=LD_LIBRARY_PATH + fi + ;; + +sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) + version_type=freebsd-elf + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + if test "$with_gnu_ld" = yes; then + sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib' + else + sys_lib_search_path_spec='/usr/ccs/lib /usr/lib' + case $host_os in + sco3.2v5*) + sys_lib_search_path_spec="$sys_lib_search_path_spec /lib" + ;; + esac + fi + sys_lib_dlsearch_path_spec='/usr/lib' + ;; + +tpf*) + # TPF is a cross-target only. Preferred cross-host = GNU/Linux. + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; + +uts4*) + version_type=linux # correct to gnu/linux during the next big refactor + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + ;; + +*) + dynamic_linker=no + ;; +esac +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $dynamic_linker" >&5 +$as_echo "$dynamic_linker" >&6; } +test "$dynamic_linker" = no && can_build_shared=no + +variables_saved_for_relink="PATH $shlibpath_var $runpath_var" +if test "$GCC" = yes; then + variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" +fi + +if test "${lt_cv_sys_lib_search_path_spec+set}" = set; then + sys_lib_search_path_spec="$lt_cv_sys_lib_search_path_spec" +fi +if test "${lt_cv_sys_lib_dlsearch_path_spec+set}" = set; then + sys_lib_dlsearch_path_spec="$lt_cv_sys_lib_dlsearch_path_spec" +fi + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to hardcode library paths into programs" >&5 +$as_echo_n "checking how to hardcode library paths into programs... " >&6; } +hardcode_action_CXX= +if test -n "$hardcode_libdir_flag_spec_CXX" || + test -n "$runpath_var_CXX" || + test "X$hardcode_automatic_CXX" = "Xyes" ; then + + # We can hardcode non-existent directories. + if test "$hardcode_direct_CXX" != no && + # If the only mechanism to avoid hardcoding is shlibpath_var, we + # have to relink, otherwise we might link with an installed library + # when we should be linking with a yet-to-be-installed one + ## test "$_LT_TAGVAR(hardcode_shlibpath_var, CXX)" != no && + test "$hardcode_minus_L_CXX" != no; then + # Linking always hardcodes the temporary library directory. + hardcode_action_CXX=relink + else + # We can link without hardcoding, and we can hardcode nonexisting dirs. + hardcode_action_CXX=immediate + fi +else + # We cannot hardcode anything, or else we can only hardcode existing + # directories. + hardcode_action_CXX=unsupported +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $hardcode_action_CXX" >&5 +$as_echo "$hardcode_action_CXX" >&6; } + +if test "$hardcode_action_CXX" = relink || + test "$inherit_rpath_CXX" = yes; then + # Fast installation is not supported + enable_fast_install=no +elif test "$shlibpath_overrides_runpath" = yes || + test "$enable_shared" = no; then + # Fast installation is not necessary + enable_fast_install=needless +fi + + + + + + + + fi # test -n "$compiler" + + CC=$lt_save_CC + CFLAGS=$lt_save_CFLAGS + LDCXX=$LD + LD=$lt_save_LD + GCC=$lt_save_GCC + with_gnu_ld=$lt_save_with_gnu_ld + lt_cv_path_LDCXX=$lt_cv_path_LD + lt_cv_path_LD=$lt_save_path_LD + lt_cv_prog_gnu_ldcxx=$lt_cv_prog_gnu_ld + lt_cv_prog_gnu_ld=$lt_save_with_gnu_ld +fi # test "$_lt_caught_CXX_error" != yes + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + + + + + + + + + + + + + + + ac_config_commands="$ac_config_commands libtool" + + + + +# Only expand once: + + + +#enable -D_GNU_SOURCE since the return code value of getaddrinfo +#ifdefed with __USE_GNU +#features.h header undef's __USE_GNU and defines it only if _GNU_SOURCE is defined +#hence this define for gcc +@%:@ Check whether --enable-debug was given. +if test "${enable_debug+set}" = set; then : + enableval=$enable_debug; +else + enable_debug=no +fi + + +if test "x$enable_debug" = xyes; then + if test "x$init_cflags" = x; then + CFLAGS="" + fi + CFLAGS="$CFLAGS -g -O0 -D_GNU_SOURCE" +else + if test "x$init_cflags" = x; then + CFLAGS="-g -O2 -D_GNU_SOURCE" + fi +fi + +if test "x$enable_debug" = xyes; then + if test "x$init_cxxflags" = x; then + CXXFLAGS="" + fi + CXXFLAGS="$CXXFLAGS -g -O0" +else + if test "x$init_cxxflags" = x; then + CXXFLAGS="-g -O2" + fi +fi + + +@%:@ Check whether --with-syncapi was given. +if test "${with_syncapi+set}" = set; then : + withval=$with_syncapi; +else + with_syncapi=yes +fi + + +# Checks for libraries. +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for pthread_mutex_lock in -lpthread" >&5 +$as_echo_n "checking for pthread_mutex_lock in -lpthread... " >&6; } +if ${ac_cv_lib_pthread_pthread_mutex_lock+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lpthread $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char pthread_mutex_lock (); +int +main () +{ +return pthread_mutex_lock (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_pthread_pthread_mutex_lock=yes +else + ac_cv_lib_pthread_pthread_mutex_lock=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_pthread_pthread_mutex_lock" >&5 +$as_echo "$ac_cv_lib_pthread_pthread_mutex_lock" >&6; } +if test "x$ac_cv_lib_pthread_pthread_mutex_lock" = xyes; then : + have_pthread=yes +else + have_pthread=no +fi + + +if test "x$with_syncapi" != xno && test "x$have_pthread" = xno; then + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cannot build SyncAPI -- pthread not found" >&5 +$as_echo "$as_me: WARNING: cannot build SyncAPI -- pthread not found" >&2;} + with_syncapi=no +fi +if test "x$with_syncapi" != xno; then + { $as_echo "$as_me:${as_lineno-$LINENO}: building with SyncAPI support" >&5 +$as_echo "$as_me: building with SyncAPI support" >&6;} +else + { $as_echo "$as_me:${as_lineno-$LINENO}: building without SyncAPI support" >&5 +$as_echo "$as_me: building without SyncAPI support" >&6;} +fi + + if test "x$with_syncapi" != xno; then + WANT_SYNCAPI_TRUE= + WANT_SYNCAPI_FALSE='#' +else + WANT_SYNCAPI_TRUE='#' + WANT_SYNCAPI_FALSE= +fi + + +# Checks for header files. +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header files" >&5 +$as_echo_n "checking for ANSI C header files... " >&6; } +if ${ac_cv_header_stdc+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +#include +#include +#include + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_header_stdc=yes +else + ac_cv_header_stdc=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + +if test $ac_cv_header_stdc = yes; then + # SunOS 4.x string.h does not declare mem*, contrary to ANSI. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include + +_ACEOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + $EGREP "memchr" >/dev/null 2>&1; then : + +else + ac_cv_header_stdc=no +fi +rm -f conftest* + +fi + +if test $ac_cv_header_stdc = yes; then + # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include + +_ACEOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + $EGREP "free" >/dev/null 2>&1; then : + +else + ac_cv_header_stdc=no +fi +rm -f conftest* + +fi + +if test $ac_cv_header_stdc = yes; then + # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi. + if test "$cross_compiling" = yes; then : + : +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +#include +#if ((' ' & 0x0FF) == 0x020) +# define ISLOWER(c) ('a' <= (c) && (c) <= 'z') +# define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c)) +#else +# define ISLOWER(c) \ + (('a' <= (c) && (c) <= 'i') \ + || ('j' <= (c) && (c) <= 'r') \ + || ('s' <= (c) && (c) <= 'z')) +# define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c)) +#endif + +#define XOR(e, f) (((e) && !(f)) || (!(e) && (f))) +int +main () +{ + int i; + for (i = 0; i < 256; i++) + if (XOR (islower (i), ISLOWER (i)) + || toupper (i) != TOUPPER (i)) + return 2; + return 0; +} +_ACEOF +if ac_fn_c_try_run "$LINENO"; then : + +else + ac_cv_header_stdc=no +fi +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ + conftest.$ac_objext conftest.beam conftest.$ac_ext +fi + +fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdc" >&5 +$as_echo "$ac_cv_header_stdc" >&6; } +if test $ac_cv_header_stdc = yes; then + +$as_echo "@%:@define STDC_HEADERS 1" >>confdefs.h + +fi + +for ac_header in arpa/inet.h fcntl.h netdb.h netinet/in.h stdlib.h string.h sys/socket.h sys/time.h unistd.h sys/utsname.h +do : + as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` +ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default" +if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : + cat >>confdefs.h <<_ACEOF +@%:@define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 +_ACEOF + +fi + +done + + +# Checks for typedefs, structures, and compiler characteristics. +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for an ANSI C-conforming const" >&5 +$as_echo_n "checking for an ANSI C-conforming const... " >&6; } +if ${ac_cv_c_const+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + +#ifndef __cplusplus + /* Ultrix mips cc rejects this sort of thing. */ + typedef int charset[2]; + const charset cs = { 0, 0 }; + /* SunOS 4.1.1 cc rejects this. */ + char const *const *pcpcc; + char **ppc; + /* NEC SVR4.0.2 mips cc rejects this. */ + struct point {int x, y;}; + static struct point const zero = {0,0}; + /* AIX XL C 1.02.0.0 rejects this. + It does not let you subtract one const X* pointer from another in + an arm of an if-expression whose if-part is not a constant + expression */ + const char *g = "string"; + pcpcc = &g + (g ? g-g : 0); + /* HPUX 7.0 cc rejects these. */ + ++pcpcc; + ppc = (char**) pcpcc; + pcpcc = (char const *const *) ppc; + { /* SCO 3.2v4 cc rejects this sort of thing. */ + char tx; + char *t = &tx; + char const *s = 0 ? (char *) 0 : (char const *) 0; + + *t++ = 0; + if (s) return 0; + } + { /* Someone thinks the Sun supposedly-ANSI compiler will reject this. */ + int x[] = {25, 17}; + const int *foo = &x[0]; + ++foo; + } + { /* Sun SC1.0 ANSI compiler rejects this -- but not the above. */ + typedef const int *iptr; + iptr p = 0; + ++p; + } + { /* AIX XL C 1.02.0.0 rejects this sort of thing, saying + "k.c", line 2.27: 1506-025 (S) Operand must be a modifiable lvalue. */ + struct s { int j; const int *ap[3]; } bx; + struct s *b = &bx; b->j = 5; + } + { /* ULTRIX-32 V3.1 (Rev 9) vcc rejects this */ + const int foo = 10; + if (!foo) return 0; + } + return !cs[0] && !zero.x; +#endif + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_c_const=yes +else + ac_cv_c_const=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_const" >&5 +$as_echo "$ac_cv_c_const" >&6; } +if test $ac_cv_c_const = no; then + +$as_echo "@%:@define const /**/" >>confdefs.h + +fi + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for inline" >&5 +$as_echo_n "checking for inline... " >&6; } +if ${ac_cv_c_inline+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_cv_c_inline=no +for ac_kw in inline __inline__ __inline; do + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#ifndef __cplusplus +typedef int foo_t; +static $ac_kw foo_t static_foo () {return 0; } +$ac_kw foo_t foo () {return 0; } +#endif + +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_c_inline=$ac_kw +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + test "$ac_cv_c_inline" != no && break +done + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_inline" >&5 +$as_echo "$ac_cv_c_inline" >&6; } + +case $ac_cv_c_inline in + inline | yes) ;; + *) + case $ac_cv_c_inline in + no) ac_val=;; + *) ac_val=$ac_cv_c_inline;; + esac + cat >>confdefs.h <<_ACEOF +#ifndef __cplusplus +#define inline $ac_val +#endif +_ACEOF + ;; +esac + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether time.h and sys/time.h may both be included" >&5 +$as_echo_n "checking whether time.h and sys/time.h may both be included... " >&6; } +if ${ac_cv_header_time+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +#include +#include + +int +main () +{ +if ((struct tm *) 0) +return 0; + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_header_time=yes +else + ac_cv_header_time=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_time" >&5 +$as_echo "$ac_cv_header_time" >&6; } +if test $ac_cv_header_time = yes; then + +$as_echo "@%:@define TIME_WITH_SYS_TIME 1" >>confdefs.h + +fi + +ac_fn_c_check_type "$LINENO" "nfds_t" "ac_cv_type_nfds_t" "#include +" +if test "x$ac_cv_type_nfds_t" = xyes; then : + +$as_echo "@%:@define POLL_NFDS_TYPE nfds_t" >>confdefs.h + +else + +$as_echo "@%:@define POLL_NFDS_TYPE unsigned int" >>confdefs.h + +fi + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to enable ipv6" >&5 +$as_echo_n "checking whether to enable ipv6... " >&6; } + +if test "$cross_compiling" = yes; then : + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + ipv6=no +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + /* is AF_INET6 available? */ +#include +#include +main() +{ + if (socket(AF_INET6, SOCK_STREAM, 0) < 0) + exit(1); + else + exit(0); +} + +_ACEOF +if ac_fn_c_try_run "$LINENO"; then : + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + ipv6=yes +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + ipv6=no +fi +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ + conftest.$ac_objext conftest.beam conftest.$ac_ext +fi + + +if test x"$ipv6" = xyes; then + USEIPV6="-DZOO_IPV6_ENABLED" + +fi + +# Checks for library functions. +for ac_func in getcwd gethostbyname gethostname getlogin getpwuid_r gettimeofday getuid memmove memset poll socket strchr strdup strerror strtol +do : + as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` +ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var" +if eval test \"x\$"$as_ac_var"\" = x"yes"; then : + cat >>confdefs.h <<_ACEOF +@%:@define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 +_ACEOF + +fi +done + + +ac_config_files="$ac_config_files Makefile" + +cat >confcache <<\_ACEOF +# This file is a shell script that caches the results of configure +# tests run on this system so they can be shared between configure +# scripts and configure runs, see configure's option --config-cache. +# It is not useful on other systems. If it contains results you don't +# want to keep, you may remove or edit it. +# +# config.status only pays attention to the cache file if you give it +# the --recheck option to rerun configure. +# +# `ac_cv_env_foo' variables (set or unset) will be overridden when +# loading this file, other *unset* `ac_cv_foo' will be assigned the +# following values. + +_ACEOF + +# The following way of writing the cache mishandles newlines in values, +# but we know of no workaround that is simple, portable, and efficient. +# So, we kill variables containing newlines. +# Ultrix sh set writes to stderr and can't be redirected directly, +# and sets the high bit in the cache file unless we assign to the vars. +( + for ac_var in `(set) 2>&1 | sed -n 's/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'`; do + eval ac_val=\$$ac_var + case $ac_val in #( + *${as_nl}*) + case $ac_var in #( + *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 +$as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; + esac + case $ac_var in #( + _ | IFS | as_nl) ;; #( + BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( + *) { eval $ac_var=; unset $ac_var;} ;; + esac ;; + esac + done + + (set) 2>&1 | + case $as_nl`(ac_space=' '; set) 2>&1` in #( + *${as_nl}ac_space=\ *) + # `set' does not quote correctly, so add quotes: double-quote + # substitution turns \\\\ into \\, and sed turns \\ into \. + sed -n \ + "s/'/'\\\\''/g; + s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p" + ;; #( + *) + # `set' quotes correctly as required by POSIX, so do not add quotes. + sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" + ;; + esac | + sort +) | + sed ' + /^ac_cv_env_/b end + t clear + :clear + s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/ + t end + s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/ + :end' >>confcache +if diff "$cache_file" confcache >/dev/null 2>&1; then :; else + if test -w "$cache_file"; then + if test "x$cache_file" != "x/dev/null"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5 +$as_echo "$as_me: updating cache $cache_file" >&6;} + if test ! -f "$cache_file" || test -h "$cache_file"; then + cat confcache >"$cache_file" + else + case $cache_file in #( + */* | ?:*) + mv -f confcache "$cache_file"$$ && + mv -f "$cache_file"$$ "$cache_file" ;; #( + *) + mv -f confcache "$cache_file" ;; + esac + fi + fi + else + { $as_echo "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5 +$as_echo "$as_me: not updating unwritable cache $cache_file" >&6;} + fi +fi +rm -f confcache + +test "x$prefix" = xNONE && prefix=$ac_default_prefix +# Let make expand exec_prefix. +test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' + +DEFS=-DHAVE_CONFIG_H + +ac_libobjs= +ac_ltlibobjs= +U= +for ac_i in : $LIB@&t@OBJS; do test "x$ac_i" = x: && continue + # 1. Remove the extension, and $U if already installed. + ac_script='s/\$U\././;s/\.o$//;s/\.obj$//' + ac_i=`$as_echo "$ac_i" | sed "$ac_script"` + # 2. Prepend LIBOBJDIR. When used with automake>=1.10 LIBOBJDIR + # will be set to the directory where LIBOBJS objects are built. + as_fn_append ac_libobjs " \${LIBOBJDIR}$ac_i\$U.$ac_objext" + as_fn_append ac_ltlibobjs " \${LIBOBJDIR}$ac_i"'$U.lo' +done +LIB@&t@OBJS=$ac_libobjs + +LTLIBOBJS=$ac_ltlibobjs + + +if test -z "${DX_COND_doc_TRUE}" && test -z "${DX_COND_doc_FALSE}"; then + as_fn_error $? "conditional \"DX_COND_doc\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${DX_COND_doc_TRUE}" && test -z "${DX_COND_doc_FALSE}"; then + as_fn_error $? "conditional \"DX_COND_doc\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${DX_COND_dot_TRUE}" && test -z "${DX_COND_dot_FALSE}"; then + as_fn_error $? "conditional \"DX_COND_dot\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${DX_COND_dot_TRUE}" && test -z "${DX_COND_dot_FALSE}"; then + as_fn_error $? "conditional \"DX_COND_dot\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${DX_COND_man_TRUE}" && test -z "${DX_COND_man_FALSE}"; then + as_fn_error $? "conditional \"DX_COND_man\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${DX_COND_man_TRUE}" && test -z "${DX_COND_man_FALSE}"; then + as_fn_error $? "conditional \"DX_COND_man\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${DX_COND_rtf_TRUE}" && test -z "${DX_COND_rtf_FALSE}"; then + as_fn_error $? "conditional \"DX_COND_rtf\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${DX_COND_rtf_TRUE}" && test -z "${DX_COND_rtf_FALSE}"; then + as_fn_error $? "conditional \"DX_COND_rtf\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${DX_COND_xml_TRUE}" && test -z "${DX_COND_xml_FALSE}"; then + as_fn_error $? "conditional \"DX_COND_xml\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${DX_COND_xml_TRUE}" && test -z "${DX_COND_xml_FALSE}"; then + as_fn_error $? "conditional \"DX_COND_xml\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${DX_COND_chm_TRUE}" && test -z "${DX_COND_chm_FALSE}"; then + as_fn_error $? "conditional \"DX_COND_chm\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${DX_COND_chm_TRUE}" && test -z "${DX_COND_chm_FALSE}"; then + as_fn_error $? "conditional \"DX_COND_chm\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${DX_COND_chi_TRUE}" && test -z "${DX_COND_chi_FALSE}"; then + as_fn_error $? "conditional \"DX_COND_chi\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${DX_COND_chi_TRUE}" && test -z "${DX_COND_chi_FALSE}"; then + as_fn_error $? "conditional \"DX_COND_chi\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${DX_COND_html_TRUE}" && test -z "${DX_COND_html_FALSE}"; then + as_fn_error $? "conditional \"DX_COND_html\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${DX_COND_html_TRUE}" && test -z "${DX_COND_html_FALSE}"; then + as_fn_error $? "conditional \"DX_COND_html\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${DX_COND_ps_TRUE}" && test -z "${DX_COND_ps_FALSE}"; then + as_fn_error $? "conditional \"DX_COND_ps\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${DX_COND_ps_TRUE}" && test -z "${DX_COND_ps_FALSE}"; then + as_fn_error $? "conditional \"DX_COND_ps\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${DX_COND_pdf_TRUE}" && test -z "${DX_COND_pdf_FALSE}"; then + as_fn_error $? "conditional \"DX_COND_pdf\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${DX_COND_pdf_TRUE}" && test -z "${DX_COND_pdf_FALSE}"; then + as_fn_error $? "conditional \"DX_COND_pdf\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${DX_COND_latex_TRUE}" && test -z "${DX_COND_latex_FALSE}"; then + as_fn_error $? "conditional \"DX_COND_latex\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${DX_COND_latex_TRUE}" && test -z "${DX_COND_latex_FALSE}"; then + as_fn_error $? "conditional \"DX_COND_latex\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi + if test -n "$EXEEXT"; then + am__EXEEXT_TRUE= + am__EXEEXT_FALSE='#' +else + am__EXEEXT_TRUE='#' + am__EXEEXT_FALSE= +fi + +if test -z "${AMDEP_TRUE}" && test -z "${AMDEP_FALSE}"; then + as_fn_error $? "conditional \"AMDEP\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${am__fastdepCC_TRUE}" && test -z "${am__fastdepCC_FALSE}"; then + as_fn_error $? "conditional \"am__fastdepCC\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${am__fastdepCXX_TRUE}" && test -z "${am__fastdepCXX_FALSE}"; then + as_fn_error $? "conditional \"am__fastdepCXX\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${WANT_SYNCAPI_TRUE}" && test -z "${WANT_SYNCAPI_FALSE}"; then + as_fn_error $? "conditional \"WANT_SYNCAPI\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi + +: "${CONFIG_STATUS=./config.status}" +ac_write_fail=0 +ac_clean_files_save=$ac_clean_files +ac_clean_files="$ac_clean_files $CONFIG_STATUS" +{ $as_echo "$as_me:${as_lineno-$LINENO}: creating $CONFIG_STATUS" >&5 +$as_echo "$as_me: creating $CONFIG_STATUS" >&6;} +as_write_fail=0 +cat >$CONFIG_STATUS <<_ASEOF || as_write_fail=1 +#! $SHELL +# Generated by $as_me. +# Run this file to recreate the current configuration. +# Compiler output produced by configure, useful for debugging +# configure, is in config.log if it exists. + +debug=false +ac_cs_recheck=false +ac_cs_silent=false + +SHELL=\${CONFIG_SHELL-$SHELL} +export SHELL +_ASEOF +cat >>$CONFIG_STATUS <<\_ASEOF || as_write_fail=1 +## -------------------- ## +## M4sh Initialization. ## +## -------------------- ## + +# Be more Bourne compatible +DUALCASE=1; export DUALCASE # for MKS sh +if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : + emulate sh + NULLCMD=: + # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which + # is contrary to our usage. Disable this feature. + alias -g '${1+"$@"}'='"$@"' + setopt NO_GLOB_SUBST +else + case `(set -o) 2>/dev/null` in @%:@( + *posix*) : + set -o posix ;; @%:@( + *) : + ;; +esac +fi + + +as_nl=' +' +export as_nl +# Printing a long string crashes Solaris 7 /usr/bin/printf. +as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' +as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo +as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo +# Prefer a ksh shell builtin over an external printf program on Solaris, +# but without wasting forks for bash or zsh. +if test -z "$BASH_VERSION$ZSH_VERSION" \ + && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then + as_echo='print -r --' + as_echo_n='print -rn --' +elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then + as_echo='printf %s\n' + as_echo_n='printf %s' +else + if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then + as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' + as_echo_n='/usr/ucb/echo -n' + else + as_echo_body='eval expr "X$1" : "X\\(.*\\)"' + as_echo_n_body='eval + arg=$1; + case $arg in @%:@( + *"$as_nl"*) + expr "X$arg" : "X\\(.*\\)$as_nl"; + arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; + esac; + expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" + ' + export as_echo_n_body + as_echo_n='sh -c $as_echo_n_body as_echo' + fi + export as_echo_body + as_echo='sh -c $as_echo_body as_echo' +fi + +# The user is always right. +if test "${PATH_SEPARATOR+set}" != set; then + PATH_SEPARATOR=: + (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { + (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || + PATH_SEPARATOR=';' + } +fi + + +# IFS +# We need space, tab and new line, in precisely that order. Quoting is +# there to prevent editors from complaining about space-tab. +# (If _AS_PATH_WALK were called with IFS unset, it would disable word +# splitting by setting IFS to empty value.) +IFS=" "" $as_nl" + +# Find who we are. Look in the path if we contain no directory separator. +as_myself= +case $0 in @%:@(( + *[\\/]* ) as_myself=$0 ;; + *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break + done +IFS=$as_save_IFS + + ;; +esac +# We did not find ourselves, most probably we were run as `sh COMMAND' +# in which case we are not to be found in the path. +if test "x$as_myself" = x; then + as_myself=$0 +fi +if test ! -f "$as_myself"; then + $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 + exit 1 +fi + +# Unset variables that we do not need and which cause bugs (e.g. in +# pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" +# suppresses any "Segmentation fault" message there. '((' could +# trigger a bug in pdksh 5.2.14. +for as_var in BASH_ENV ENV MAIL MAILPATH +do eval test x\${$as_var+set} = xset \ + && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : +done +PS1='$ ' +PS2='> ' +PS4='+ ' + +# NLS nuisances. +LC_ALL=C +export LC_ALL +LANGUAGE=C +export LANGUAGE + +# CDPATH. +(unset CDPATH) >/dev/null 2>&1 && unset CDPATH + + +@%:@ as_fn_error STATUS ERROR [LINENO LOG_FD] +@%:@ ---------------------------------------- +@%:@ Output "`basename @S|@0`: error: ERROR" to stderr. If LINENO and LOG_FD are +@%:@ provided, also output the error to LOG_FD, referencing LINENO. Then exit the +@%:@ script with STATUS, using 1 if that was 0. +as_fn_error () +{ + as_status=$1; test $as_status -eq 0 && as_status=1 + if test "$4"; then + as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 + fi + $as_echo "$as_me: error: $2" >&2 + as_fn_exit $as_status +} @%:@ as_fn_error + + +@%:@ as_fn_set_status STATUS +@%:@ ----------------------- +@%:@ Set @S|@? to STATUS, without forking. +as_fn_set_status () +{ + return $1 +} @%:@ as_fn_set_status + +@%:@ as_fn_exit STATUS +@%:@ ----------------- +@%:@ Exit the shell with STATUS, even in a "trap 0" or "set -e" context. +as_fn_exit () +{ + set +e + as_fn_set_status $1 + exit $1 +} @%:@ as_fn_exit + +@%:@ as_fn_unset VAR +@%:@ --------------- +@%:@ Portably unset VAR. +as_fn_unset () +{ + { eval $1=; unset $1;} +} +as_unset=as_fn_unset +@%:@ as_fn_append VAR VALUE +@%:@ ---------------------- +@%:@ Append the text in VALUE to the end of the definition contained in VAR. Take +@%:@ advantage of any shell optimizations that allow amortized linear growth over +@%:@ repeated appends, instead of the typical quadratic growth present in naive +@%:@ implementations. +if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : + eval 'as_fn_append () + { + eval $1+=\$2 + }' +else + as_fn_append () + { + eval $1=\$$1\$2 + } +fi # as_fn_append + +@%:@ as_fn_arith ARG... +@%:@ ------------------ +@%:@ Perform arithmetic evaluation on the ARGs, and store the result in the +@%:@ global @S|@as_val. Take advantage of shells that can avoid forks. The arguments +@%:@ must be portable across @S|@(()) and expr. +if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : + eval 'as_fn_arith () + { + as_val=$(( $* )) + }' +else + as_fn_arith () + { + as_val=`expr "$@" || test $? -eq 1` + } +fi # as_fn_arith + + +if expr a : '\(a\)' >/dev/null 2>&1 && + test "X`expr 00001 : '.*\(...\)'`" = X001; then + as_expr=expr +else + as_expr=false +fi + +if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then + as_basename=basename +else + as_basename=false +fi + +if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then + as_dirname=dirname +else + as_dirname=false +fi + +as_me=`$as_basename -- "$0" || +$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ + X"$0" : 'X\(//\)$' \| \ + X"$0" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X/"$0" | + sed '/^.*\/\([^/][^/]*\)\/*$/{ + s//\1/ + q + } + /^X\/\(\/\/\)$/{ + s//\1/ + q + } + /^X\/\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + +# Avoid depending upon Character Ranges. +as_cr_letters='abcdefghijklmnopqrstuvwxyz' +as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' +as_cr_Letters=$as_cr_letters$as_cr_LETTERS +as_cr_digits='0123456789' +as_cr_alnum=$as_cr_Letters$as_cr_digits + +ECHO_C= ECHO_N= ECHO_T= +case `echo -n x` in @%:@((((( +-n*) + case `echo 'xy\c'` in + *c*) ECHO_T=' ';; # ECHO_T is single tab character. + xy) ECHO_C='\c';; + *) echo `echo ksh88 bug on AIX 6.1` > /dev/null + ECHO_T=' ';; + esac;; +*) + ECHO_N='-n';; +esac + +rm -f conf$$ conf$$.exe conf$$.file +if test -d conf$$.dir; then + rm -f conf$$.dir/conf$$.file +else + rm -f conf$$.dir + mkdir conf$$.dir 2>/dev/null +fi +if (echo >conf$$.file) 2>/dev/null; then + if ln -s conf$$.file conf$$ 2>/dev/null; then + as_ln_s='ln -s' + # ... but there are two gotchas: + # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. + # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. + # In both cases, we have to default to `cp -pR'. + ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || + as_ln_s='cp -pR' + elif ln conf$$.file conf$$ 2>/dev/null; then + as_ln_s=ln + else + as_ln_s='cp -pR' + fi +else + as_ln_s='cp -pR' +fi +rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file +rmdir conf$$.dir 2>/dev/null + + +@%:@ as_fn_mkdir_p +@%:@ ------------- +@%:@ Create "@S|@as_dir" as a directory, including parents if necessary. +as_fn_mkdir_p () +{ + + case $as_dir in #( + -*) as_dir=./$as_dir;; + esac + test -d "$as_dir" || eval $as_mkdir_p || { + as_dirs= + while :; do + case $as_dir in #( + *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( + *) as_qdir=$as_dir;; + esac + as_dirs="'$as_qdir' $as_dirs" + as_dir=`$as_dirname -- "$as_dir" || +$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$as_dir" : 'X\(//\)[^/]' \| \ + X"$as_dir" : 'X\(//\)$' \| \ + X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$as_dir" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + test -d "$as_dir" && break + done + test -z "$as_dirs" || eval "mkdir $as_dirs" + } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" + + +} @%:@ as_fn_mkdir_p +if mkdir -p . 2>/dev/null; then + as_mkdir_p='mkdir -p "$as_dir"' +else + test -d ./-p && rmdir ./-p + as_mkdir_p=false +fi + + +@%:@ as_fn_executable_p FILE +@%:@ ----------------------- +@%:@ Test if FILE is an executable regular file. +as_fn_executable_p () +{ + test -f "$1" && test -x "$1" +} @%:@ as_fn_executable_p +as_test_x='test -x' +as_executable_p=as_fn_executable_p + +# Sed expression to map a string onto a valid CPP name. +as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" + +# Sed expression to map a string onto a valid variable name. +as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" + + +exec 6>&1 +## ----------------------------------- ## +## Main body of $CONFIG_STATUS script. ## +## ----------------------------------- ## +_ASEOF +test $as_write_fail = 0 && chmod +x $CONFIG_STATUS || ac_write_fail=1 + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +# Save the log message, to keep $0 and so on meaningful, and to +# report actual input values of CONFIG_FILES etc. instead of their +# values after options handling. +ac_log=" +This file was extended by zookeeper C client $as_me 3.4.6, which was +generated by GNU Autoconf 2.69. Invocation command line was + + CONFIG_FILES = $CONFIG_FILES + CONFIG_HEADERS = $CONFIG_HEADERS + CONFIG_LINKS = $CONFIG_LINKS + CONFIG_COMMANDS = $CONFIG_COMMANDS + $ $0 $@ + +on `(hostname || uname -n) 2>/dev/null | sed 1q` +" + +_ACEOF + +case $ac_config_files in *" +"*) set x $ac_config_files; shift; ac_config_files=$*;; +esac + +case $ac_config_headers in *" +"*) set x $ac_config_headers; shift; ac_config_headers=$*;; +esac + + +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +# Files that config.status was made for. +config_files="$ac_config_files" +config_headers="$ac_config_headers" +config_commands="$ac_config_commands" + +_ACEOF + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +ac_cs_usage="\ +\`$as_me' instantiates files and other configuration actions +from templates according to the current configuration. Unless the files +and actions are specified as TAGs, all are instantiated by default. + +Usage: $0 [OPTION]... [TAG]... + + -h, --help print this help, then exit + -V, --version print version number and configuration settings, then exit + --config print configuration, then exit + -q, --quiet, --silent + do not print progress messages + -d, --debug don't remove temporary files + --recheck update $as_me by reconfiguring in the same conditions + --file=FILE[:TEMPLATE] + instantiate the configuration file FILE + --header=FILE[:TEMPLATE] + instantiate the configuration header FILE + +Configuration files: +$config_files + +Configuration headers: +$config_headers + +Configuration commands: +$config_commands + +Report bugs to ." + +_ACEOF +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" +ac_cs_version="\\ +zookeeper C client config.status 3.4.6 +configured by $0, generated by GNU Autoconf 2.69, + with options \\"\$ac_cs_config\\" + +Copyright (C) 2012 Free Software Foundation, Inc. +This config.status script is free software; the Free Software Foundation +gives unlimited permission to copy, distribute and modify it." + +ac_pwd='$ac_pwd' +srcdir='$srcdir' +INSTALL='$INSTALL' +MKDIR_P='$MKDIR_P' +AWK='$AWK' +test -n "\$AWK" || AWK=awk +_ACEOF + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +# The default lists apply if the user does not specify any file. +ac_need_defaults=: +while test $# != 0 +do + case $1 in + --*=?*) + ac_option=`expr "X$1" : 'X\([^=]*\)='` + ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'` + ac_shift=: + ;; + --*=) + ac_option=`expr "X$1" : 'X\([^=]*\)='` + ac_optarg= + ac_shift=: + ;; + *) + ac_option=$1 + ac_optarg=$2 + ac_shift=shift + ;; + esac + + case $ac_option in + # Handling of the options. + -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) + ac_cs_recheck=: ;; + --version | --versio | --versi | --vers | --ver | --ve | --v | -V ) + $as_echo "$ac_cs_version"; exit ;; + --config | --confi | --conf | --con | --co | --c ) + $as_echo "$ac_cs_config"; exit ;; + --debug | --debu | --deb | --de | --d | -d ) + debug=: ;; + --file | --fil | --fi | --f ) + $ac_shift + case $ac_optarg in + *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; + '') as_fn_error $? "missing file argument" ;; + esac + as_fn_append CONFIG_FILES " '$ac_optarg'" + ac_need_defaults=false;; + --header | --heade | --head | --hea ) + $ac_shift + case $ac_optarg in + *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; + esac + as_fn_append CONFIG_HEADERS " '$ac_optarg'" + ac_need_defaults=false;; + --he | --h) + # Conflict between --help and --header + as_fn_error $? "ambiguous option: \`$1' +Try \`$0 --help' for more information.";; + --help | --hel | -h ) + $as_echo "$ac_cs_usage"; exit ;; + -q | -quiet | --quiet | --quie | --qui | --qu | --q \ + | -silent | --silent | --silen | --sile | --sil | --si | --s) + ac_cs_silent=: ;; + + # This is an error. + -*) as_fn_error $? "unrecognized option: \`$1' +Try \`$0 --help' for more information." ;; + + *) as_fn_append ac_config_targets " $1" + ac_need_defaults=false ;; + + esac + shift +done + +ac_configure_extra_args= + +if $ac_cs_silent; then + exec 6>/dev/null + ac_configure_extra_args="$ac_configure_extra_args --silent" +fi + +_ACEOF +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +if \$ac_cs_recheck; then + set X $SHELL '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion + shift + \$as_echo "running CONFIG_SHELL=$SHELL \$*" >&6 + CONFIG_SHELL='$SHELL' + export CONFIG_SHELL + exec "\$@" +fi + +_ACEOF +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +exec 5>>config.log +{ + echo + sed 'h;s/./-/g;s/^.../@%:@@%:@ /;s/...$/ @%:@@%:@/;p;x;p;x' <<_ASBOX +@%:@@%:@ Running $as_me. @%:@@%:@ +_ASBOX + $as_echo "$ac_log" +} >&5 + +_ACEOF +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +# +# INIT-COMMANDS +# +AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir" + + +# The HP-UX ksh and POSIX shell print the target directory to stdout +# if CDPATH is set. +(unset CDPATH) >/dev/null 2>&1 && unset CDPATH + +sed_quote_subst='$sed_quote_subst' +double_quote_subst='$double_quote_subst' +delay_variable_subst='$delay_variable_subst' +macro_version='`$ECHO "$macro_version" | $SED "$delay_single_quote_subst"`' +macro_revision='`$ECHO "$macro_revision" | $SED "$delay_single_quote_subst"`' +enable_shared='`$ECHO "$enable_shared" | $SED "$delay_single_quote_subst"`' +enable_static='`$ECHO "$enable_static" | $SED "$delay_single_quote_subst"`' +pic_mode='`$ECHO "$pic_mode" | $SED "$delay_single_quote_subst"`' +enable_fast_install='`$ECHO "$enable_fast_install" | $SED "$delay_single_quote_subst"`' +SHELL='`$ECHO "$SHELL" | $SED "$delay_single_quote_subst"`' +ECHO='`$ECHO "$ECHO" | $SED "$delay_single_quote_subst"`' +PATH_SEPARATOR='`$ECHO "$PATH_SEPARATOR" | $SED "$delay_single_quote_subst"`' +host_alias='`$ECHO "$host_alias" | $SED "$delay_single_quote_subst"`' +host='`$ECHO "$host" | $SED "$delay_single_quote_subst"`' +host_os='`$ECHO "$host_os" | $SED "$delay_single_quote_subst"`' +build_alias='`$ECHO "$build_alias" | $SED "$delay_single_quote_subst"`' +build='`$ECHO "$build" | $SED "$delay_single_quote_subst"`' +build_os='`$ECHO "$build_os" | $SED "$delay_single_quote_subst"`' +SED='`$ECHO "$SED" | $SED "$delay_single_quote_subst"`' +Xsed='`$ECHO "$Xsed" | $SED "$delay_single_quote_subst"`' +GREP='`$ECHO "$GREP" | $SED "$delay_single_quote_subst"`' +EGREP='`$ECHO "$EGREP" | $SED "$delay_single_quote_subst"`' +FGREP='`$ECHO "$FGREP" | $SED "$delay_single_quote_subst"`' +LD='`$ECHO "$LD" | $SED "$delay_single_quote_subst"`' +NM='`$ECHO "$NM" | $SED "$delay_single_quote_subst"`' +LN_S='`$ECHO "$LN_S" | $SED "$delay_single_quote_subst"`' +max_cmd_len='`$ECHO "$max_cmd_len" | $SED "$delay_single_quote_subst"`' +ac_objext='`$ECHO "$ac_objext" | $SED "$delay_single_quote_subst"`' +exeext='`$ECHO "$exeext" | $SED "$delay_single_quote_subst"`' +lt_unset='`$ECHO "$lt_unset" | $SED "$delay_single_quote_subst"`' +lt_SP2NL='`$ECHO "$lt_SP2NL" | $SED "$delay_single_quote_subst"`' +lt_NL2SP='`$ECHO "$lt_NL2SP" | $SED "$delay_single_quote_subst"`' +lt_cv_to_host_file_cmd='`$ECHO "$lt_cv_to_host_file_cmd" | $SED "$delay_single_quote_subst"`' +lt_cv_to_tool_file_cmd='`$ECHO "$lt_cv_to_tool_file_cmd" | $SED "$delay_single_quote_subst"`' +reload_flag='`$ECHO "$reload_flag" | $SED "$delay_single_quote_subst"`' +reload_cmds='`$ECHO "$reload_cmds" | $SED "$delay_single_quote_subst"`' +OBJDUMP='`$ECHO "$OBJDUMP" | $SED "$delay_single_quote_subst"`' +deplibs_check_method='`$ECHO "$deplibs_check_method" | $SED "$delay_single_quote_subst"`' +file_magic_cmd='`$ECHO "$file_magic_cmd" | $SED "$delay_single_quote_subst"`' +file_magic_glob='`$ECHO "$file_magic_glob" | $SED "$delay_single_quote_subst"`' +want_nocaseglob='`$ECHO "$want_nocaseglob" | $SED "$delay_single_quote_subst"`' +DLLTOOL='`$ECHO "$DLLTOOL" | $SED "$delay_single_quote_subst"`' +sharedlib_from_linklib_cmd='`$ECHO "$sharedlib_from_linklib_cmd" | $SED "$delay_single_quote_subst"`' +AR='`$ECHO "$AR" | $SED "$delay_single_quote_subst"`' +AR_FLAGS='`$ECHO "$AR_FLAGS" | $SED "$delay_single_quote_subst"`' +archiver_list_spec='`$ECHO "$archiver_list_spec" | $SED "$delay_single_quote_subst"`' +STRIP='`$ECHO "$STRIP" | $SED "$delay_single_quote_subst"`' +RANLIB='`$ECHO "$RANLIB" | $SED "$delay_single_quote_subst"`' +old_postinstall_cmds='`$ECHO "$old_postinstall_cmds" | $SED "$delay_single_quote_subst"`' +old_postuninstall_cmds='`$ECHO "$old_postuninstall_cmds" | $SED "$delay_single_quote_subst"`' +old_archive_cmds='`$ECHO "$old_archive_cmds" | $SED "$delay_single_quote_subst"`' +lock_old_archive_extraction='`$ECHO "$lock_old_archive_extraction" | $SED "$delay_single_quote_subst"`' +CC='`$ECHO "$CC" | $SED "$delay_single_quote_subst"`' +CFLAGS='`$ECHO "$CFLAGS" | $SED "$delay_single_quote_subst"`' +compiler='`$ECHO "$compiler" | $SED "$delay_single_quote_subst"`' +GCC='`$ECHO "$GCC" | $SED "$delay_single_quote_subst"`' +lt_cv_sys_global_symbol_pipe='`$ECHO "$lt_cv_sys_global_symbol_pipe" | $SED "$delay_single_quote_subst"`' +lt_cv_sys_global_symbol_to_cdecl='`$ECHO "$lt_cv_sys_global_symbol_to_cdecl" | $SED "$delay_single_quote_subst"`' +lt_cv_sys_global_symbol_to_c_name_address='`$ECHO "$lt_cv_sys_global_symbol_to_c_name_address" | $SED "$delay_single_quote_subst"`' +lt_cv_sys_global_symbol_to_c_name_address_lib_prefix='`$ECHO "$lt_cv_sys_global_symbol_to_c_name_address_lib_prefix" | $SED "$delay_single_quote_subst"`' +nm_file_list_spec='`$ECHO "$nm_file_list_spec" | $SED "$delay_single_quote_subst"`' +lt_sysroot='`$ECHO "$lt_sysroot" | $SED "$delay_single_quote_subst"`' +objdir='`$ECHO "$objdir" | $SED "$delay_single_quote_subst"`' +MAGIC_CMD='`$ECHO "$MAGIC_CMD" | $SED "$delay_single_quote_subst"`' +lt_prog_compiler_no_builtin_flag='`$ECHO "$lt_prog_compiler_no_builtin_flag" | $SED "$delay_single_quote_subst"`' +lt_prog_compiler_pic='`$ECHO "$lt_prog_compiler_pic" | $SED "$delay_single_quote_subst"`' +lt_prog_compiler_wl='`$ECHO "$lt_prog_compiler_wl" | $SED "$delay_single_quote_subst"`' +lt_prog_compiler_static='`$ECHO "$lt_prog_compiler_static" | $SED "$delay_single_quote_subst"`' +lt_cv_prog_compiler_c_o='`$ECHO "$lt_cv_prog_compiler_c_o" | $SED "$delay_single_quote_subst"`' +need_locks='`$ECHO "$need_locks" | $SED "$delay_single_quote_subst"`' +MANIFEST_TOOL='`$ECHO "$MANIFEST_TOOL" | $SED "$delay_single_quote_subst"`' +DSYMUTIL='`$ECHO "$DSYMUTIL" | $SED "$delay_single_quote_subst"`' +NMEDIT='`$ECHO "$NMEDIT" | $SED "$delay_single_quote_subst"`' +LIPO='`$ECHO "$LIPO" | $SED "$delay_single_quote_subst"`' +OTOOL='`$ECHO "$OTOOL" | $SED "$delay_single_quote_subst"`' +OTOOL64='`$ECHO "$OTOOL64" | $SED "$delay_single_quote_subst"`' +libext='`$ECHO "$libext" | $SED "$delay_single_quote_subst"`' +shrext_cmds='`$ECHO "$shrext_cmds" | $SED "$delay_single_quote_subst"`' +extract_expsyms_cmds='`$ECHO "$extract_expsyms_cmds" | $SED "$delay_single_quote_subst"`' +archive_cmds_need_lc='`$ECHO "$archive_cmds_need_lc" | $SED "$delay_single_quote_subst"`' +enable_shared_with_static_runtimes='`$ECHO "$enable_shared_with_static_runtimes" | $SED "$delay_single_quote_subst"`' +export_dynamic_flag_spec='`$ECHO "$export_dynamic_flag_spec" | $SED "$delay_single_quote_subst"`' +whole_archive_flag_spec='`$ECHO "$whole_archive_flag_spec" | $SED "$delay_single_quote_subst"`' +compiler_needs_object='`$ECHO "$compiler_needs_object" | $SED "$delay_single_quote_subst"`' +old_archive_from_new_cmds='`$ECHO "$old_archive_from_new_cmds" | $SED "$delay_single_quote_subst"`' +old_archive_from_expsyms_cmds='`$ECHO "$old_archive_from_expsyms_cmds" | $SED "$delay_single_quote_subst"`' +archive_cmds='`$ECHO "$archive_cmds" | $SED "$delay_single_quote_subst"`' +archive_expsym_cmds='`$ECHO "$archive_expsym_cmds" | $SED "$delay_single_quote_subst"`' +module_cmds='`$ECHO "$module_cmds" | $SED "$delay_single_quote_subst"`' +module_expsym_cmds='`$ECHO "$module_expsym_cmds" | $SED "$delay_single_quote_subst"`' +with_gnu_ld='`$ECHO "$with_gnu_ld" | $SED "$delay_single_quote_subst"`' +allow_undefined_flag='`$ECHO "$allow_undefined_flag" | $SED "$delay_single_quote_subst"`' +no_undefined_flag='`$ECHO "$no_undefined_flag" | $SED "$delay_single_quote_subst"`' +hardcode_libdir_flag_spec='`$ECHO "$hardcode_libdir_flag_spec" | $SED "$delay_single_quote_subst"`' +hardcode_libdir_separator='`$ECHO "$hardcode_libdir_separator" | $SED "$delay_single_quote_subst"`' +hardcode_direct='`$ECHO "$hardcode_direct" | $SED "$delay_single_quote_subst"`' +hardcode_direct_absolute='`$ECHO "$hardcode_direct_absolute" | $SED "$delay_single_quote_subst"`' +hardcode_minus_L='`$ECHO "$hardcode_minus_L" | $SED "$delay_single_quote_subst"`' +hardcode_shlibpath_var='`$ECHO "$hardcode_shlibpath_var" | $SED "$delay_single_quote_subst"`' +hardcode_automatic='`$ECHO "$hardcode_automatic" | $SED "$delay_single_quote_subst"`' +inherit_rpath='`$ECHO "$inherit_rpath" | $SED "$delay_single_quote_subst"`' +link_all_deplibs='`$ECHO "$link_all_deplibs" | $SED "$delay_single_quote_subst"`' +always_export_symbols='`$ECHO "$always_export_symbols" | $SED "$delay_single_quote_subst"`' +export_symbols_cmds='`$ECHO "$export_symbols_cmds" | $SED "$delay_single_quote_subst"`' +exclude_expsyms='`$ECHO "$exclude_expsyms" | $SED "$delay_single_quote_subst"`' +include_expsyms='`$ECHO "$include_expsyms" | $SED "$delay_single_quote_subst"`' +prelink_cmds='`$ECHO "$prelink_cmds" | $SED "$delay_single_quote_subst"`' +postlink_cmds='`$ECHO "$postlink_cmds" | $SED "$delay_single_quote_subst"`' +file_list_spec='`$ECHO "$file_list_spec" | $SED "$delay_single_quote_subst"`' +variables_saved_for_relink='`$ECHO "$variables_saved_for_relink" | $SED "$delay_single_quote_subst"`' +need_lib_prefix='`$ECHO "$need_lib_prefix" | $SED "$delay_single_quote_subst"`' +need_version='`$ECHO "$need_version" | $SED "$delay_single_quote_subst"`' +version_type='`$ECHO "$version_type" | $SED "$delay_single_quote_subst"`' +runpath_var='`$ECHO "$runpath_var" | $SED "$delay_single_quote_subst"`' +shlibpath_var='`$ECHO "$shlibpath_var" | $SED "$delay_single_quote_subst"`' +shlibpath_overrides_runpath='`$ECHO "$shlibpath_overrides_runpath" | $SED "$delay_single_quote_subst"`' +libname_spec='`$ECHO "$libname_spec" | $SED "$delay_single_quote_subst"`' +library_names_spec='`$ECHO "$library_names_spec" | $SED "$delay_single_quote_subst"`' +soname_spec='`$ECHO "$soname_spec" | $SED "$delay_single_quote_subst"`' +install_override_mode='`$ECHO "$install_override_mode" | $SED "$delay_single_quote_subst"`' +postinstall_cmds='`$ECHO "$postinstall_cmds" | $SED "$delay_single_quote_subst"`' +postuninstall_cmds='`$ECHO "$postuninstall_cmds" | $SED "$delay_single_quote_subst"`' +finish_cmds='`$ECHO "$finish_cmds" | $SED "$delay_single_quote_subst"`' +finish_eval='`$ECHO "$finish_eval" | $SED "$delay_single_quote_subst"`' +hardcode_into_libs='`$ECHO "$hardcode_into_libs" | $SED "$delay_single_quote_subst"`' +sys_lib_search_path_spec='`$ECHO "$sys_lib_search_path_spec" | $SED "$delay_single_quote_subst"`' +sys_lib_dlsearch_path_spec='`$ECHO "$sys_lib_dlsearch_path_spec" | $SED "$delay_single_quote_subst"`' +hardcode_action='`$ECHO "$hardcode_action" | $SED "$delay_single_quote_subst"`' +enable_dlopen='`$ECHO "$enable_dlopen" | $SED "$delay_single_quote_subst"`' +enable_dlopen_self='`$ECHO "$enable_dlopen_self" | $SED "$delay_single_quote_subst"`' +enable_dlopen_self_static='`$ECHO "$enable_dlopen_self_static" | $SED "$delay_single_quote_subst"`' +old_striplib='`$ECHO "$old_striplib" | $SED "$delay_single_quote_subst"`' +striplib='`$ECHO "$striplib" | $SED "$delay_single_quote_subst"`' +compiler_lib_search_dirs='`$ECHO "$compiler_lib_search_dirs" | $SED "$delay_single_quote_subst"`' +predep_objects='`$ECHO "$predep_objects" | $SED "$delay_single_quote_subst"`' +postdep_objects='`$ECHO "$postdep_objects" | $SED "$delay_single_quote_subst"`' +predeps='`$ECHO "$predeps" | $SED "$delay_single_quote_subst"`' +postdeps='`$ECHO "$postdeps" | $SED "$delay_single_quote_subst"`' +compiler_lib_search_path='`$ECHO "$compiler_lib_search_path" | $SED "$delay_single_quote_subst"`' +LD_CXX='`$ECHO "$LD_CXX" | $SED "$delay_single_quote_subst"`' +reload_flag_CXX='`$ECHO "$reload_flag_CXX" | $SED "$delay_single_quote_subst"`' +reload_cmds_CXX='`$ECHO "$reload_cmds_CXX" | $SED "$delay_single_quote_subst"`' +old_archive_cmds_CXX='`$ECHO "$old_archive_cmds_CXX" | $SED "$delay_single_quote_subst"`' +compiler_CXX='`$ECHO "$compiler_CXX" | $SED "$delay_single_quote_subst"`' +GCC_CXX='`$ECHO "$GCC_CXX" | $SED "$delay_single_quote_subst"`' +lt_prog_compiler_no_builtin_flag_CXX='`$ECHO "$lt_prog_compiler_no_builtin_flag_CXX" | $SED "$delay_single_quote_subst"`' +lt_prog_compiler_pic_CXX='`$ECHO "$lt_prog_compiler_pic_CXX" | $SED "$delay_single_quote_subst"`' +lt_prog_compiler_wl_CXX='`$ECHO "$lt_prog_compiler_wl_CXX" | $SED "$delay_single_quote_subst"`' +lt_prog_compiler_static_CXX='`$ECHO "$lt_prog_compiler_static_CXX" | $SED "$delay_single_quote_subst"`' +lt_cv_prog_compiler_c_o_CXX='`$ECHO "$lt_cv_prog_compiler_c_o_CXX" | $SED "$delay_single_quote_subst"`' +archive_cmds_need_lc_CXX='`$ECHO "$archive_cmds_need_lc_CXX" | $SED "$delay_single_quote_subst"`' +enable_shared_with_static_runtimes_CXX='`$ECHO "$enable_shared_with_static_runtimes_CXX" | $SED "$delay_single_quote_subst"`' +export_dynamic_flag_spec_CXX='`$ECHO "$export_dynamic_flag_spec_CXX" | $SED "$delay_single_quote_subst"`' +whole_archive_flag_spec_CXX='`$ECHO "$whole_archive_flag_spec_CXX" | $SED "$delay_single_quote_subst"`' +compiler_needs_object_CXX='`$ECHO "$compiler_needs_object_CXX" | $SED "$delay_single_quote_subst"`' +old_archive_from_new_cmds_CXX='`$ECHO "$old_archive_from_new_cmds_CXX" | $SED "$delay_single_quote_subst"`' +old_archive_from_expsyms_cmds_CXX='`$ECHO "$old_archive_from_expsyms_cmds_CXX" | $SED "$delay_single_quote_subst"`' +archive_cmds_CXX='`$ECHO "$archive_cmds_CXX" | $SED "$delay_single_quote_subst"`' +archive_expsym_cmds_CXX='`$ECHO "$archive_expsym_cmds_CXX" | $SED "$delay_single_quote_subst"`' +module_cmds_CXX='`$ECHO "$module_cmds_CXX" | $SED "$delay_single_quote_subst"`' +module_expsym_cmds_CXX='`$ECHO "$module_expsym_cmds_CXX" | $SED "$delay_single_quote_subst"`' +with_gnu_ld_CXX='`$ECHO "$with_gnu_ld_CXX" | $SED "$delay_single_quote_subst"`' +allow_undefined_flag_CXX='`$ECHO "$allow_undefined_flag_CXX" | $SED "$delay_single_quote_subst"`' +no_undefined_flag_CXX='`$ECHO "$no_undefined_flag_CXX" | $SED "$delay_single_quote_subst"`' +hardcode_libdir_flag_spec_CXX='`$ECHO "$hardcode_libdir_flag_spec_CXX" | $SED "$delay_single_quote_subst"`' +hardcode_libdir_separator_CXX='`$ECHO "$hardcode_libdir_separator_CXX" | $SED "$delay_single_quote_subst"`' +hardcode_direct_CXX='`$ECHO "$hardcode_direct_CXX" | $SED "$delay_single_quote_subst"`' +hardcode_direct_absolute_CXX='`$ECHO "$hardcode_direct_absolute_CXX" | $SED "$delay_single_quote_subst"`' +hardcode_minus_L_CXX='`$ECHO "$hardcode_minus_L_CXX" | $SED "$delay_single_quote_subst"`' +hardcode_shlibpath_var_CXX='`$ECHO "$hardcode_shlibpath_var_CXX" | $SED "$delay_single_quote_subst"`' +hardcode_automatic_CXX='`$ECHO "$hardcode_automatic_CXX" | $SED "$delay_single_quote_subst"`' +inherit_rpath_CXX='`$ECHO "$inherit_rpath_CXX" | $SED "$delay_single_quote_subst"`' +link_all_deplibs_CXX='`$ECHO "$link_all_deplibs_CXX" | $SED "$delay_single_quote_subst"`' +always_export_symbols_CXX='`$ECHO "$always_export_symbols_CXX" | $SED "$delay_single_quote_subst"`' +export_symbols_cmds_CXX='`$ECHO "$export_symbols_cmds_CXX" | $SED "$delay_single_quote_subst"`' +exclude_expsyms_CXX='`$ECHO "$exclude_expsyms_CXX" | $SED "$delay_single_quote_subst"`' +include_expsyms_CXX='`$ECHO "$include_expsyms_CXX" | $SED "$delay_single_quote_subst"`' +prelink_cmds_CXX='`$ECHO "$prelink_cmds_CXX" | $SED "$delay_single_quote_subst"`' +postlink_cmds_CXX='`$ECHO "$postlink_cmds_CXX" | $SED "$delay_single_quote_subst"`' +file_list_spec_CXX='`$ECHO "$file_list_spec_CXX" | $SED "$delay_single_quote_subst"`' +hardcode_action_CXX='`$ECHO "$hardcode_action_CXX" | $SED "$delay_single_quote_subst"`' +compiler_lib_search_dirs_CXX='`$ECHO "$compiler_lib_search_dirs_CXX" | $SED "$delay_single_quote_subst"`' +predep_objects_CXX='`$ECHO "$predep_objects_CXX" | $SED "$delay_single_quote_subst"`' +postdep_objects_CXX='`$ECHO "$postdep_objects_CXX" | $SED "$delay_single_quote_subst"`' +predeps_CXX='`$ECHO "$predeps_CXX" | $SED "$delay_single_quote_subst"`' +postdeps_CXX='`$ECHO "$postdeps_CXX" | $SED "$delay_single_quote_subst"`' +compiler_lib_search_path_CXX='`$ECHO "$compiler_lib_search_path_CXX" | $SED "$delay_single_quote_subst"`' + +LTCC='$LTCC' +LTCFLAGS='$LTCFLAGS' +compiler='$compiler_DEFAULT' + +# A function that is used when there is no print builtin or printf. +func_fallback_echo () +{ + eval 'cat <<_LTECHO_EOF +\$1 +_LTECHO_EOF' +} + +# Quote evaled strings. +for var in SHELL \ +ECHO \ +PATH_SEPARATOR \ +SED \ +GREP \ +EGREP \ +FGREP \ +LD \ +NM \ +LN_S \ +lt_SP2NL \ +lt_NL2SP \ +reload_flag \ +OBJDUMP \ +deplibs_check_method \ +file_magic_cmd \ +file_magic_glob \ +want_nocaseglob \ +DLLTOOL \ +sharedlib_from_linklib_cmd \ +AR \ +AR_FLAGS \ +archiver_list_spec \ +STRIP \ +RANLIB \ +CC \ +CFLAGS \ +compiler \ +lt_cv_sys_global_symbol_pipe \ +lt_cv_sys_global_symbol_to_cdecl \ +lt_cv_sys_global_symbol_to_c_name_address \ +lt_cv_sys_global_symbol_to_c_name_address_lib_prefix \ +nm_file_list_spec \ +lt_prog_compiler_no_builtin_flag \ +lt_prog_compiler_pic \ +lt_prog_compiler_wl \ +lt_prog_compiler_static \ +lt_cv_prog_compiler_c_o \ +need_locks \ +MANIFEST_TOOL \ +DSYMUTIL \ +NMEDIT \ +LIPO \ +OTOOL \ +OTOOL64 \ +shrext_cmds \ +export_dynamic_flag_spec \ +whole_archive_flag_spec \ +compiler_needs_object \ +with_gnu_ld \ +allow_undefined_flag \ +no_undefined_flag \ +hardcode_libdir_flag_spec \ +hardcode_libdir_separator \ +exclude_expsyms \ +include_expsyms \ +file_list_spec \ +variables_saved_for_relink \ +libname_spec \ +library_names_spec \ +soname_spec \ +install_override_mode \ +finish_eval \ +old_striplib \ +striplib \ +compiler_lib_search_dirs \ +predep_objects \ +postdep_objects \ +predeps \ +postdeps \ +compiler_lib_search_path \ +LD_CXX \ +reload_flag_CXX \ +compiler_CXX \ +lt_prog_compiler_no_builtin_flag_CXX \ +lt_prog_compiler_pic_CXX \ +lt_prog_compiler_wl_CXX \ +lt_prog_compiler_static_CXX \ +lt_cv_prog_compiler_c_o_CXX \ +export_dynamic_flag_spec_CXX \ +whole_archive_flag_spec_CXX \ +compiler_needs_object_CXX \ +with_gnu_ld_CXX \ +allow_undefined_flag_CXX \ +no_undefined_flag_CXX \ +hardcode_libdir_flag_spec_CXX \ +hardcode_libdir_separator_CXX \ +exclude_expsyms_CXX \ +include_expsyms_CXX \ +file_list_spec_CXX \ +compiler_lib_search_dirs_CXX \ +predep_objects_CXX \ +postdep_objects_CXX \ +predeps_CXX \ +postdeps_CXX \ +compiler_lib_search_path_CXX; do + case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in + *[\\\\\\\`\\"\\\$]*) + eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED \\"\\\$sed_quote_subst\\"\\\`\\\\\\"" + ;; + *) + eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\"" + ;; + esac +done + +# Double-quote double-evaled strings. +for var in reload_cmds \ +old_postinstall_cmds \ +old_postuninstall_cmds \ +old_archive_cmds \ +extract_expsyms_cmds \ +old_archive_from_new_cmds \ +old_archive_from_expsyms_cmds \ +archive_cmds \ +archive_expsym_cmds \ +module_cmds \ +module_expsym_cmds \ +export_symbols_cmds \ +prelink_cmds \ +postlink_cmds \ +postinstall_cmds \ +postuninstall_cmds \ +finish_cmds \ +sys_lib_search_path_spec \ +sys_lib_dlsearch_path_spec \ +reload_cmds_CXX \ +old_archive_cmds_CXX \ +old_archive_from_new_cmds_CXX \ +old_archive_from_expsyms_cmds_CXX \ +archive_cmds_CXX \ +archive_expsym_cmds_CXX \ +module_cmds_CXX \ +module_expsym_cmds_CXX \ +export_symbols_cmds_CXX \ +prelink_cmds_CXX \ +postlink_cmds_CXX; do + case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in + *[\\\\\\\`\\"\\\$]*) + eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED -e \\"\\\$double_quote_subst\\" -e \\"\\\$sed_quote_subst\\" -e \\"\\\$delay_variable_subst\\"\\\`\\\\\\"" + ;; + *) + eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\"" + ;; + esac +done + +ac_aux_dir='$ac_aux_dir' +xsi_shell='$xsi_shell' +lt_shell_append='$lt_shell_append' + +# See if we are running on zsh, and set the options which allow our +# commands through without removal of \ escapes INIT. +if test -n "\${ZSH_VERSION+set}" ; then + setopt NO_GLOB_SUBST +fi + + + PACKAGE='$PACKAGE' + VERSION='$VERSION' + TIMESTAMP='$TIMESTAMP' + RM='$RM' + ofile='$ofile' + + + + + + +_ACEOF + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 + +# Handling of arguments. +for ac_config_target in $ac_config_targets +do + case $ac_config_target in + "config.h") CONFIG_HEADERS="$CONFIG_HEADERS config.h" ;; + "depfiles") CONFIG_COMMANDS="$CONFIG_COMMANDS depfiles" ;; + "libtool") CONFIG_COMMANDS="$CONFIG_COMMANDS libtool" ;; + "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;; + + *) as_fn_error $? "invalid argument: \`$ac_config_target'" "$LINENO" 5;; + esac +done + + +# If the user did not use the arguments to specify the items to instantiate, +# then the envvar interface is used. Set only those that are not. +# We use the long form for the default assignment because of an extremely +# bizarre bug on SunOS 4.1.3. +if $ac_need_defaults; then + test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files + test "${CONFIG_HEADERS+set}" = set || CONFIG_HEADERS=$config_headers + test "${CONFIG_COMMANDS+set}" = set || CONFIG_COMMANDS=$config_commands +fi + +# Have a temporary directory for convenience. Make it in the build tree +# simply because there is no reason against having it here, and in addition, +# creating and moving files from /tmp can sometimes cause problems. +# Hook for its removal unless debugging. +# Note that there is a small window in which the directory will not be cleaned: +# after its creation but before its name has been assigned to `$tmp'. +$debug || +{ + tmp= ac_tmp= + trap 'exit_status=$? + : "${ac_tmp:=$tmp}" + { test ! -d "$ac_tmp" || rm -fr "$ac_tmp"; } && exit $exit_status +' 0 + trap 'as_fn_exit 1' 1 2 13 15 +} +# Create a (secure) tmp directory for tmp files. + +{ + tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` && + test -d "$tmp" +} || +{ + tmp=./conf$$-$RANDOM + (umask 077 && mkdir "$tmp") +} || as_fn_error $? "cannot create a temporary directory in ." "$LINENO" 5 +ac_tmp=$tmp + +# Set up the scripts for CONFIG_FILES section. +# No need to generate them if there are no CONFIG_FILES. +# This happens for instance with `./config.status config.h'. +if test -n "$CONFIG_FILES"; then + + +ac_cr=`echo X | tr X '\015'` +# On cygwin, bash can eat \r inside `` if the user requested igncr. +# But we know of no other shell where ac_cr would be empty at this +# point, so we can use a bashism as a fallback. +if test "x$ac_cr" = x; then + eval ac_cr=\$\'\\r\' +fi +ac_cs_awk_cr=`$AWK 'BEGIN { print "a\rb" }' /dev/null` +if test "$ac_cs_awk_cr" = "a${ac_cr}b"; then + ac_cs_awk_cr='\\r' +else + ac_cs_awk_cr=$ac_cr +fi + +echo 'BEGIN {' >"$ac_tmp/subs1.awk" && +_ACEOF + + +{ + echo "cat >conf$$subs.awk <<_ACEOF" && + echo "$ac_subst_vars" | sed 's/.*/&!$&$ac_delim/' && + echo "_ACEOF" +} >conf$$subs.sh || + as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 +ac_delim_num=`echo "$ac_subst_vars" | grep -c '^'` +ac_delim='%!_!# ' +for ac_last_try in false false false false false :; do + . ./conf$$subs.sh || + as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 + + ac_delim_n=`sed -n "s/.*$ac_delim\$/X/p" conf$$subs.awk | grep -c X` + if test $ac_delim_n = $ac_delim_num; then + break + elif $ac_last_try; then + as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 + else + ac_delim="$ac_delim!$ac_delim _$ac_delim!! " + fi +done +rm -f conf$$subs.sh + +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +cat >>"\$ac_tmp/subs1.awk" <<\\_ACAWK && +_ACEOF +sed -n ' +h +s/^/S["/; s/!.*/"]=/ +p +g +s/^[^!]*!// +:repl +t repl +s/'"$ac_delim"'$// +t delim +:nl +h +s/\(.\{148\}\)..*/\1/ +t more1 +s/["\\]/\\&/g; s/^/"/; s/$/\\n"\\/ +p +n +b repl +:more1 +s/["\\]/\\&/g; s/^/"/; s/$/"\\/ +p +g +s/.\{148\}// +t nl +:delim +h +s/\(.\{148\}\)..*/\1/ +t more2 +s/["\\]/\\&/g; s/^/"/; s/$/"/ +p +b +:more2 +s/["\\]/\\&/g; s/^/"/; s/$/"\\/ +p +g +s/.\{148\}// +t delim +' >$CONFIG_STATUS || ac_write_fail=1 +rm -f conf$$subs.awk +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +_ACAWK +cat >>"\$ac_tmp/subs1.awk" <<_ACAWK && + for (key in S) S_is_set[key] = 1 + FS = "" + +} +{ + line = $ 0 + nfields = split(line, field, "@") + substed = 0 + len = length(field[1]) + for (i = 2; i < nfields; i++) { + key = field[i] + keylen = length(key) + if (S_is_set[key]) { + value = S[key] + line = substr(line, 1, len) "" value "" substr(line, len + keylen + 3) + len += length(value) + length(field[++i]) + substed = 1 + } else + len += 1 + keylen + } + + print line +} + +_ACAWK +_ACEOF +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +if sed "s/$ac_cr//" < /dev/null > /dev/null 2>&1; then + sed "s/$ac_cr\$//; s/$ac_cr/$ac_cs_awk_cr/g" +else + cat +fi < "$ac_tmp/subs1.awk" > "$ac_tmp/subs.awk" \ + || as_fn_error $? "could not setup config files machinery" "$LINENO" 5 +_ACEOF + +# VPATH may cause trouble with some makes, so we remove sole $(srcdir), +# ${srcdir} and @srcdir@ entries from VPATH if srcdir is ".", strip leading and +# trailing colons and then remove the whole line if VPATH becomes empty +# (actually we leave an empty line to preserve line numbers). +if test "x$srcdir" = x.; then + ac_vpsub='/^[ ]*VPATH[ ]*=[ ]*/{ +h +s/// +s/^/:/ +s/[ ]*$/:/ +s/:\$(srcdir):/:/g +s/:\${srcdir}:/:/g +s/:@srcdir@:/:/g +s/^:*// +s/:*$// +x +s/\(=[ ]*\).*/\1/ +G +s/\n// +s/^[^=]*=[ ]*$// +}' +fi + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +fi # test -n "$CONFIG_FILES" + +# Set up the scripts for CONFIG_HEADERS section. +# No need to generate them if there are no CONFIG_HEADERS. +# This happens for instance with `./config.status Makefile'. +if test -n "$CONFIG_HEADERS"; then +cat >"$ac_tmp/defines.awk" <<\_ACAWK || +BEGIN { +_ACEOF + +# Transform confdefs.h into an awk script `defines.awk', embedded as +# here-document in config.status, that substitutes the proper values into +# config.h.in to produce config.h. + +# Create a delimiter string that does not exist in confdefs.h, to ease +# handling of long lines. +ac_delim='%!_!# ' +for ac_last_try in false false :; do + ac_tt=`sed -n "/$ac_delim/p" confdefs.h` + if test -z "$ac_tt"; then + break + elif $ac_last_try; then + as_fn_error $? "could not make $CONFIG_HEADERS" "$LINENO" 5 + else + ac_delim="$ac_delim!$ac_delim _$ac_delim!! " + fi +done + +# For the awk script, D is an array of macro values keyed by name, +# likewise P contains macro parameters if any. Preserve backslash +# newline sequences. + +ac_word_re=[_$as_cr_Letters][_$as_cr_alnum]* +sed -n ' +s/.\{148\}/&'"$ac_delim"'/g +t rset +:rset +s/^[ ]*#[ ]*define[ ][ ]*/ / +t def +d +:def +s/\\$// +t bsnl +s/["\\]/\\&/g +s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\ +D["\1"]=" \3"/p +s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2"/p +d +:bsnl +s/["\\]/\\&/g +s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\ +D["\1"]=" \3\\\\\\n"\\/p +t cont +s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2\\\\\\n"\\/p +t cont +d +:cont +n +s/.\{148\}/&'"$ac_delim"'/g +t clear +:clear +s/\\$// +t bsnlc +s/["\\]/\\&/g; s/^/"/; s/$/"/p +d +:bsnlc +s/["\\]/\\&/g; s/^/"/; s/$/\\\\\\n"\\/p +b cont +' >$CONFIG_STATUS || ac_write_fail=1 + +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 + for (key in D) D_is_set[key] = 1 + FS = "" +} +/^[\t ]*#[\t ]*(define|undef)[\t ]+$ac_word_re([\t (]|\$)/ { + line = \$ 0 + split(line, arg, " ") + if (arg[1] == "#") { + defundef = arg[2] + mac1 = arg[3] + } else { + defundef = substr(arg[1], 2) + mac1 = arg[2] + } + split(mac1, mac2, "(") #) + macro = mac2[1] + prefix = substr(line, 1, index(line, defundef) - 1) + if (D_is_set[macro]) { + # Preserve the white space surrounding the "#". + print prefix "define", macro P[macro] D[macro] + next + } else { + # Replace #undef with comments. This is necessary, for example, + # in the case of _POSIX_SOURCE, which is predefined and required + # on some systems where configure will not decide to define it. + if (defundef == "undef") { + print "/*", prefix defundef, macro, "*/" + next + } + } +} +{ print } +_ACAWK +_ACEOF +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 + as_fn_error $? "could not setup config headers machinery" "$LINENO" 5 +fi # test -n "$CONFIG_HEADERS" + + +eval set X " :F $CONFIG_FILES :H $CONFIG_HEADERS :C $CONFIG_COMMANDS" +shift +for ac_tag +do + case $ac_tag in + :[FHLC]) ac_mode=$ac_tag; continue;; + esac + case $ac_mode$ac_tag in + :[FHL]*:*);; + :L* | :C*:*) as_fn_error $? "invalid tag \`$ac_tag'" "$LINENO" 5;; + :[FH]-) ac_tag=-:-;; + :[FH]*) ac_tag=$ac_tag:$ac_tag.in;; + esac + ac_save_IFS=$IFS + IFS=: + set x $ac_tag + IFS=$ac_save_IFS + shift + ac_file=$1 + shift + + case $ac_mode in + :L) ac_source=$1;; + :[FH]) + ac_file_inputs= + for ac_f + do + case $ac_f in + -) ac_f="$ac_tmp/stdin";; + *) # Look for the file first in the build tree, then in the source tree + # (if the path is not absolute). The absolute path cannot be DOS-style, + # because $ac_f cannot contain `:'. + test -f "$ac_f" || + case $ac_f in + [\\/$]*) false;; + *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";; + esac || + as_fn_error 1 "cannot find input file: \`$ac_f'" "$LINENO" 5;; + esac + case $ac_f in *\'*) ac_f=`$as_echo "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac + as_fn_append ac_file_inputs " '$ac_f'" + done + + # Let's still pretend it is `configure' which instantiates (i.e., don't + # use $as_me), people would be surprised to read: + # /* config.h. Generated by config.status. */ + configure_input='Generated from '` + $as_echo "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g' + `' by configure.' + if test x"$ac_file" != x-; then + configure_input="$ac_file. $configure_input" + { $as_echo "$as_me:${as_lineno-$LINENO}: creating $ac_file" >&5 +$as_echo "$as_me: creating $ac_file" >&6;} + fi + # Neutralize special characters interpreted by sed in replacement strings. + case $configure_input in #( + *\&* | *\|* | *\\* ) + ac_sed_conf_input=`$as_echo "$configure_input" | + sed 's/[\\\\&|]/\\\\&/g'`;; #( + *) ac_sed_conf_input=$configure_input;; + esac + + case $ac_tag in + *:-:* | *:-) cat >"$ac_tmp/stdin" \ + || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; + esac + ;; + esac + + ac_dir=`$as_dirname -- "$ac_file" || +$as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$ac_file" : 'X\(//\)[^/]' \| \ + X"$ac_file" : 'X\(//\)$' \| \ + X"$ac_file" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$ac_file" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + as_dir="$ac_dir"; as_fn_mkdir_p + ac_builddir=. + +case "$ac_dir" in +.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; +*) + ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` + # A ".." for each directory in $ac_dir_suffix. + ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` + case $ac_top_builddir_sub in + "") ac_top_builddir_sub=. ac_top_build_prefix= ;; + *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; + esac ;; +esac +ac_abs_top_builddir=$ac_pwd +ac_abs_builddir=$ac_pwd$ac_dir_suffix +# for backward compatibility: +ac_top_builddir=$ac_top_build_prefix + +case $srcdir in + .) # We are building in place. + ac_srcdir=. + ac_top_srcdir=$ac_top_builddir_sub + ac_abs_top_srcdir=$ac_pwd ;; + [\\/]* | ?:[\\/]* ) # Absolute name. + ac_srcdir=$srcdir$ac_dir_suffix; + ac_top_srcdir=$srcdir + ac_abs_top_srcdir=$srcdir ;; + *) # Relative name. + ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix + ac_top_srcdir=$ac_top_build_prefix$srcdir + ac_abs_top_srcdir=$ac_pwd/$srcdir ;; +esac +ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix + + + case $ac_mode in + :F) + # + # CONFIG_FILE + # + + case $INSTALL in + [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;; + *) ac_INSTALL=$ac_top_build_prefix$INSTALL ;; + esac + ac_MKDIR_P=$MKDIR_P + case $MKDIR_P in + [\\/$]* | ?:[\\/]* ) ;; + */*) ac_MKDIR_P=$ac_top_build_prefix$MKDIR_P ;; + esac +_ACEOF + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +# If the template does not know about datarootdir, expand it. +# FIXME: This hack should be removed a few years after 2.60. +ac_datarootdir_hack=; ac_datarootdir_seen= +ac_sed_dataroot=' +/datarootdir/ { + p + q +} +/@datadir@/p +/@docdir@/p +/@infodir@/p +/@localedir@/p +/@mandir@/p' +case `eval "sed -n \"\$ac_sed_dataroot\" $ac_file_inputs"` in +*datarootdir*) ac_datarootdir_seen=yes;; +*@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*) + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5 +$as_echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;} +_ACEOF +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 + ac_datarootdir_hack=' + s&@datadir@&$datadir&g + s&@docdir@&$docdir&g + s&@infodir@&$infodir&g + s&@localedir@&$localedir&g + s&@mandir@&$mandir&g + s&\\\${datarootdir}&$datarootdir&g' ;; +esac +_ACEOF + +# Neutralize VPATH when `$srcdir' = `.'. +# Shell code in configure.ac might set extrasub. +# FIXME: do we really want to maintain this feature? +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +ac_sed_extra="$ac_vpsub +$extrasub +_ACEOF +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +:t +/@[a-zA-Z_][a-zA-Z_0-9]*@/!b +s|@configure_input@|$ac_sed_conf_input|;t t +s&@top_builddir@&$ac_top_builddir_sub&;t t +s&@top_build_prefix@&$ac_top_build_prefix&;t t +s&@srcdir@&$ac_srcdir&;t t +s&@abs_srcdir@&$ac_abs_srcdir&;t t +s&@top_srcdir@&$ac_top_srcdir&;t t +s&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t +s&@builddir@&$ac_builddir&;t t +s&@abs_builddir@&$ac_abs_builddir&;t t +s&@abs_top_builddir@&$ac_abs_top_builddir&;t t +s&@INSTALL@&$ac_INSTALL&;t t +s&@MKDIR_P@&$ac_MKDIR_P&;t t +$ac_datarootdir_hack +" +eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$ac_tmp/subs.awk" \ + >$ac_tmp/out || as_fn_error $? "could not create $ac_file" "$LINENO" 5 + +test -z "$ac_datarootdir_hack$ac_datarootdir_seen" && + { ac_out=`sed -n '/\${datarootdir}/p' "$ac_tmp/out"`; test -n "$ac_out"; } && + { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' \ + "$ac_tmp/out"`; test -z "$ac_out"; } && + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \`datarootdir' +which seems to be undefined. Please make sure it is defined" >&5 +$as_echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir' +which seems to be undefined. Please make sure it is defined" >&2;} + + rm -f "$ac_tmp/stdin" + case $ac_file in + -) cat "$ac_tmp/out" && rm -f "$ac_tmp/out";; + *) rm -f "$ac_file" && mv "$ac_tmp/out" "$ac_file";; + esac \ + || as_fn_error $? "could not create $ac_file" "$LINENO" 5 + ;; + :H) + # + # CONFIG_HEADER + # + if test x"$ac_file" != x-; then + { + $as_echo "/* $configure_input */" \ + && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" + } >"$ac_tmp/config.h" \ + || as_fn_error $? "could not create $ac_file" "$LINENO" 5 + if diff "$ac_file" "$ac_tmp/config.h" >/dev/null 2>&1; then + { $as_echo "$as_me:${as_lineno-$LINENO}: $ac_file is unchanged" >&5 +$as_echo "$as_me: $ac_file is unchanged" >&6;} + else + rm -f "$ac_file" + mv "$ac_tmp/config.h" "$ac_file" \ + || as_fn_error $? "could not create $ac_file" "$LINENO" 5 + fi + else + $as_echo "/* $configure_input */" \ + && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" \ + || as_fn_error $? "could not create -" "$LINENO" 5 + fi +# Compute "$ac_file"'s index in $config_headers. +_am_arg="$ac_file" +_am_stamp_count=1 +for _am_header in $config_headers :; do + case $_am_header in + $_am_arg | $_am_arg:* ) + break ;; + * ) + _am_stamp_count=`expr $_am_stamp_count + 1` ;; + esac +done +echo "timestamp for $_am_arg" >`$as_dirname -- "$_am_arg" || +$as_expr X"$_am_arg" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$_am_arg" : 'X\(//\)[^/]' \| \ + X"$_am_arg" : 'X\(//\)$' \| \ + X"$_am_arg" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$_am_arg" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'`/stamp-h$_am_stamp_count + ;; + + :C) { $as_echo "$as_me:${as_lineno-$LINENO}: executing $ac_file commands" >&5 +$as_echo "$as_me: executing $ac_file commands" >&6;} + ;; + esac + + + case $ac_file$ac_mode in + "depfiles":C) test x"$AMDEP_TRUE" != x"" || { + # Autoconf 2.62 quotes --file arguments for eval, but not when files + # are listed without --file. Let's play safe and only enable the eval + # if we detect the quoting. + case $CONFIG_FILES in + *\'*) eval set x "$CONFIG_FILES" ;; + *) set x $CONFIG_FILES ;; + esac + shift + for mf + do + # Strip MF so we end up with the name of the file. + mf=`echo "$mf" | sed -e 's/:.*$//'` + # Check whether this is an Automake generated Makefile or not. + # We used to match only the files named `Makefile.in', but + # some people rename them; so instead we look at the file content. + # Grep'ing the first line is not enough: some people post-process + # each Makefile.in and add a new line on top of each file to say so. + # Grep'ing the whole file is not good either: AIX grep has a line + # limit of 2048, but all sed's we know have understand at least 4000. + if sed -n 's,^#.*generated by automake.*,X,p' "$mf" | grep X >/dev/null 2>&1; then + dirpart=`$as_dirname -- "$mf" || +$as_expr X"$mf" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$mf" : 'X\(//\)[^/]' \| \ + X"$mf" : 'X\(//\)$' \| \ + X"$mf" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$mf" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + else + continue + fi + # Extract the definition of DEPDIR, am__include, and am__quote + # from the Makefile without running `make'. + DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"` + test -z "$DEPDIR" && continue + am__include=`sed -n 's/^am__include = //p' < "$mf"` + test -z "am__include" && continue + am__quote=`sed -n 's/^am__quote = //p' < "$mf"` + # When using ansi2knr, U may be empty or an underscore; expand it + U=`sed -n 's/^U = //p' < "$mf"` + # Find all dependency output files, they are included files with + # $(DEPDIR) in their names. We invoke sed twice because it is the + # simplest approach to changing $(DEPDIR) to its actual value in the + # expansion. + for file in `sed -n " + s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \ + sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g' -e 's/\$U/'"$U"'/g'`; do + # Make sure the directory exists. + test -f "$dirpart/$file" && continue + fdir=`$as_dirname -- "$file" || +$as_expr X"$file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$file" : 'X\(//\)[^/]' \| \ + X"$file" : 'X\(//\)$' \| \ + X"$file" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$file" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + as_dir=$dirpart/$fdir; as_fn_mkdir_p + # echo "creating $dirpart/$file" + echo '# dummy' > "$dirpart/$file" + done + done +} + ;; + "libtool":C) + + # See if we are running on zsh, and set the options which allow our + # commands through without removal of \ escapes. + if test -n "${ZSH_VERSION+set}" ; then + setopt NO_GLOB_SUBST + fi + + cfgfile="${ofile}T" + trap "$RM \"$cfgfile\"; exit 1" 1 2 15 + $RM "$cfgfile" + + cat <<_LT_EOF >> "$cfgfile" +#! $SHELL + +# `$ECHO "$ofile" | sed 's%^.*/%%'` - Provide generalized library-building support services. +# Generated automatically by $as_me ($PACKAGE$TIMESTAMP) $VERSION +# Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`: +# NOTE: Changes made to this file will be lost: look at ltmain.sh. +# +# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005, +# 2006, 2007, 2008, 2009, 2010, 2011 Free Software +# Foundation, Inc. +# Written by Gordon Matzigkeit, 1996 +# +# This file is part of GNU Libtool. +# +# GNU Libtool is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License as +# published by the Free Software Foundation; either version 2 of +# the License, or (at your option) any later version. +# +# As a special exception to the GNU General Public License, +# if you distribute this file as part of a program or library that +# is built using GNU Libtool, you may include this file under the +# same distribution terms that you use for the rest of that program. +# +# GNU Libtool is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with GNU Libtool; see the file COPYING. If not, a copy +# can be downloaded from http://www.gnu.org/licenses/gpl.html, or +# obtained by writing to the Free Software Foundation, Inc., +# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + + +# The names of the tagged configurations supported by this script. +available_tags="CXX " + +# ### BEGIN LIBTOOL CONFIG + +# Which release of libtool.m4 was used? +macro_version=$macro_version +macro_revision=$macro_revision + +# Whether or not to build shared libraries. +build_libtool_libs=$enable_shared + +# Whether or not to build static libraries. +build_old_libs=$enable_static + +# What type of objects to build. +pic_mode=$pic_mode + +# Whether or not to optimize for fast installation. +fast_install=$enable_fast_install + +# Shell to use when invoking shell scripts. +SHELL=$lt_SHELL + +# An echo program that protects backslashes. +ECHO=$lt_ECHO + +# The PATH separator for the build system. +PATH_SEPARATOR=$lt_PATH_SEPARATOR + +# The host system. +host_alias=$host_alias +host=$host +host_os=$host_os + +# The build system. +build_alias=$build_alias +build=$build +build_os=$build_os + +# A sed program that does not truncate output. +SED=$lt_SED + +# Sed that helps us avoid accidentally triggering echo(1) options like -n. +Xsed="\$SED -e 1s/^X//" + +# A grep program that handles long lines. +GREP=$lt_GREP + +# An ERE matcher. +EGREP=$lt_EGREP + +# A literal string matcher. +FGREP=$lt_FGREP + +# A BSD- or MS-compatible name lister. +NM=$lt_NM + +# Whether we need soft or hard links. +LN_S=$lt_LN_S + +# What is the maximum length of a command? +max_cmd_len=$max_cmd_len + +# Object file suffix (normally "o"). +objext=$ac_objext + +# Executable file suffix (normally ""). +exeext=$exeext + +# whether the shell understands "unset". +lt_unset=$lt_unset + +# turn spaces into newlines. +SP2NL=$lt_lt_SP2NL + +# turn newlines into spaces. +NL2SP=$lt_lt_NL2SP + +# convert \$build file names to \$host format. +to_host_file_cmd=$lt_cv_to_host_file_cmd + +# convert \$build files to toolchain format. +to_tool_file_cmd=$lt_cv_to_tool_file_cmd + +# An object symbol dumper. +OBJDUMP=$lt_OBJDUMP + +# Method to check whether dependent libraries are shared objects. +deplibs_check_method=$lt_deplibs_check_method + +# Command to use when deplibs_check_method = "file_magic". +file_magic_cmd=$lt_file_magic_cmd + +# How to find potential files when deplibs_check_method = "file_magic". +file_magic_glob=$lt_file_magic_glob + +# Find potential files using nocaseglob when deplibs_check_method = "file_magic". +want_nocaseglob=$lt_want_nocaseglob + +# DLL creation program. +DLLTOOL=$lt_DLLTOOL + +# Command to associate shared and link libraries. +sharedlib_from_linklib_cmd=$lt_sharedlib_from_linklib_cmd + +# The archiver. +AR=$lt_AR + +# Flags to create an archive. +AR_FLAGS=$lt_AR_FLAGS + +# How to feed a file listing to the archiver. +archiver_list_spec=$lt_archiver_list_spec + +# A symbol stripping program. +STRIP=$lt_STRIP + +# Commands used to install an old-style archive. +RANLIB=$lt_RANLIB +old_postinstall_cmds=$lt_old_postinstall_cmds +old_postuninstall_cmds=$lt_old_postuninstall_cmds + +# Whether to use a lock for old archive extraction. +lock_old_archive_extraction=$lock_old_archive_extraction + +# A C compiler. +LTCC=$lt_CC + +# LTCC compiler flags. +LTCFLAGS=$lt_CFLAGS + +# Take the output of nm and produce a listing of raw symbols and C names. +global_symbol_pipe=$lt_lt_cv_sys_global_symbol_pipe + +# Transform the output of nm in a proper C declaration. +global_symbol_to_cdecl=$lt_lt_cv_sys_global_symbol_to_cdecl + +# Transform the output of nm in a C name address pair. +global_symbol_to_c_name_address=$lt_lt_cv_sys_global_symbol_to_c_name_address + +# Transform the output of nm in a C name address pair when lib prefix is needed. +global_symbol_to_c_name_address_lib_prefix=$lt_lt_cv_sys_global_symbol_to_c_name_address_lib_prefix + +# Specify filename containing input files for \$NM. +nm_file_list_spec=$lt_nm_file_list_spec + +# The root where to search for dependent libraries,and in which our libraries should be installed. +lt_sysroot=$lt_sysroot + +# The name of the directory that contains temporary libtool files. +objdir=$objdir + +# Used to examine libraries when file_magic_cmd begins with "file". +MAGIC_CMD=$MAGIC_CMD + +# Must we lock files when doing compilation? +need_locks=$lt_need_locks + +# Manifest tool. +MANIFEST_TOOL=$lt_MANIFEST_TOOL + +# Tool to manipulate archived DWARF debug symbol files on Mac OS X. +DSYMUTIL=$lt_DSYMUTIL + +# Tool to change global to local symbols on Mac OS X. +NMEDIT=$lt_NMEDIT + +# Tool to manipulate fat objects and archives on Mac OS X. +LIPO=$lt_LIPO + +# ldd/readelf like tool for Mach-O binaries on Mac OS X. +OTOOL=$lt_OTOOL + +# ldd/readelf like tool for 64 bit Mach-O binaries on Mac OS X 10.4. +OTOOL64=$lt_OTOOL64 + +# Old archive suffix (normally "a"). +libext=$libext + +# Shared library suffix (normally ".so"). +shrext_cmds=$lt_shrext_cmds + +# The commands to extract the exported symbol list from a shared archive. +extract_expsyms_cmds=$lt_extract_expsyms_cmds + +# Variables whose values should be saved in libtool wrapper scripts and +# restored at link time. +variables_saved_for_relink=$lt_variables_saved_for_relink + +# Do we need the "lib" prefix for modules? +need_lib_prefix=$need_lib_prefix + +# Do we need a version for libraries? +need_version=$need_version + +# Library versioning type. +version_type=$version_type + +# Shared library runtime path variable. +runpath_var=$runpath_var + +# Shared library path variable. +shlibpath_var=$shlibpath_var + +# Is shlibpath searched before the hard-coded library search path? +shlibpath_overrides_runpath=$shlibpath_overrides_runpath + +# Format of library name prefix. +libname_spec=$lt_libname_spec + +# List of archive names. First name is the real one, the rest are links. +# The last name is the one that the linker finds with -lNAME +library_names_spec=$lt_library_names_spec + +# The coded name of the library, if different from the real name. +soname_spec=$lt_soname_spec + +# Permission mode override for installation of shared libraries. +install_override_mode=$lt_install_override_mode + +# Command to use after installation of a shared archive. +postinstall_cmds=$lt_postinstall_cmds + +# Command to use after uninstallation of a shared archive. +postuninstall_cmds=$lt_postuninstall_cmds + +# Commands used to finish a libtool library installation in a directory. +finish_cmds=$lt_finish_cmds + +# As "finish_cmds", except a single script fragment to be evaled but +# not shown. +finish_eval=$lt_finish_eval + +# Whether we should hardcode library paths into libraries. +hardcode_into_libs=$hardcode_into_libs + +# Compile-time system search path for libraries. +sys_lib_search_path_spec=$lt_sys_lib_search_path_spec + +# Run-time system search path for libraries. +sys_lib_dlsearch_path_spec=$lt_sys_lib_dlsearch_path_spec + +# Whether dlopen is supported. +dlopen_support=$enable_dlopen + +# Whether dlopen of programs is supported. +dlopen_self=$enable_dlopen_self + +# Whether dlopen of statically linked programs is supported. +dlopen_self_static=$enable_dlopen_self_static + +# Commands to strip libraries. +old_striplib=$lt_old_striplib +striplib=$lt_striplib + + +# The linker used to build libraries. +LD=$lt_LD + +# How to create reloadable object files. +reload_flag=$lt_reload_flag +reload_cmds=$lt_reload_cmds + +# Commands used to build an old-style archive. +old_archive_cmds=$lt_old_archive_cmds + +# A language specific compiler. +CC=$lt_compiler + +# Is the compiler the GNU compiler? +with_gcc=$GCC + +# Compiler flag to turn off builtin functions. +no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag + +# Additional compiler flags for building library objects. +pic_flag=$lt_lt_prog_compiler_pic + +# How to pass a linker flag through the compiler. +wl=$lt_lt_prog_compiler_wl + +# Compiler flag to prevent dynamic linking. +link_static_flag=$lt_lt_prog_compiler_static + +# Does compiler simultaneously support -c and -o options? +compiler_c_o=$lt_lt_cv_prog_compiler_c_o + +# Whether or not to add -lc for building shared libraries. +build_libtool_need_lc=$archive_cmds_need_lc + +# Whether or not to disallow shared libs when runtime libs are static. +allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes + +# Compiler flag to allow reflexive dlopens. +export_dynamic_flag_spec=$lt_export_dynamic_flag_spec + +# Compiler flag to generate shared objects directly from archives. +whole_archive_flag_spec=$lt_whole_archive_flag_spec + +# Whether the compiler copes with passing no objects directly. +compiler_needs_object=$lt_compiler_needs_object + +# Create an old-style archive from a shared archive. +old_archive_from_new_cmds=$lt_old_archive_from_new_cmds + +# Create a temporary old-style archive to link instead of a shared archive. +old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds + +# Commands used to build a shared archive. +archive_cmds=$lt_archive_cmds +archive_expsym_cmds=$lt_archive_expsym_cmds + +# Commands used to build a loadable module if different from building +# a shared archive. +module_cmds=$lt_module_cmds +module_expsym_cmds=$lt_module_expsym_cmds + +# Whether we are building with GNU ld or not. +with_gnu_ld=$lt_with_gnu_ld + +# Flag that allows shared libraries with undefined symbols to be built. +allow_undefined_flag=$lt_allow_undefined_flag + +# Flag that enforces no undefined symbols. +no_undefined_flag=$lt_no_undefined_flag + +# Flag to hardcode \$libdir into a binary during linking. +# This must work even if \$libdir does not exist +hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec + +# Whether we need a single "-rpath" flag with a separated argument. +hardcode_libdir_separator=$lt_hardcode_libdir_separator + +# Set to "yes" if using DIR/libNAME\${shared_ext} during linking hardcodes +# DIR into the resulting binary. +hardcode_direct=$hardcode_direct + +# Set to "yes" if using DIR/libNAME\${shared_ext} during linking hardcodes +# DIR into the resulting binary and the resulting library dependency is +# "absolute",i.e impossible to change by setting \${shlibpath_var} if the +# library is relocated. +hardcode_direct_absolute=$hardcode_direct_absolute + +# Set to "yes" if using the -LDIR flag during linking hardcodes DIR +# into the resulting binary. +hardcode_minus_L=$hardcode_minus_L + +# Set to "yes" if using SHLIBPATH_VAR=DIR during linking hardcodes DIR +# into the resulting binary. +hardcode_shlibpath_var=$hardcode_shlibpath_var + +# Set to "yes" if building a shared library automatically hardcodes DIR +# into the library and all subsequent libraries and executables linked +# against it. +hardcode_automatic=$hardcode_automatic + +# Set to yes if linker adds runtime paths of dependent libraries +# to runtime path list. +inherit_rpath=$inherit_rpath + +# Whether libtool must link a program against all its dependency libraries. +link_all_deplibs=$link_all_deplibs + +# Set to "yes" if exported symbols are required. +always_export_symbols=$always_export_symbols + +# The commands to list exported symbols. +export_symbols_cmds=$lt_export_symbols_cmds + +# Symbols that should not be listed in the preloaded symbols. +exclude_expsyms=$lt_exclude_expsyms + +# Symbols that must always be exported. +include_expsyms=$lt_include_expsyms + +# Commands necessary for linking programs (against libraries) with templates. +prelink_cmds=$lt_prelink_cmds + +# Commands necessary for finishing linking programs. +postlink_cmds=$lt_postlink_cmds + +# Specify filename containing input files. +file_list_spec=$lt_file_list_spec + +# How to hardcode a shared library path into an executable. +hardcode_action=$hardcode_action + +# The directories searched by this compiler when creating a shared library. +compiler_lib_search_dirs=$lt_compiler_lib_search_dirs + +# Dependencies to place before and after the objects being linked to +# create a shared library. +predep_objects=$lt_predep_objects +postdep_objects=$lt_postdep_objects +predeps=$lt_predeps +postdeps=$lt_postdeps + +# The library search path used internally by the compiler when linking +# a shared library. +compiler_lib_search_path=$lt_compiler_lib_search_path + +# ### END LIBTOOL CONFIG + +_LT_EOF + + case $host_os in + aix3*) + cat <<\_LT_EOF >> "$cfgfile" +# AIX sometimes has problems with the GCC collect2 program. For some +# reason, if we set the COLLECT_NAMES environment variable, the problems +# vanish in a puff of smoke. +if test "X${COLLECT_NAMES+set}" != Xset; then + COLLECT_NAMES= + export COLLECT_NAMES +fi +_LT_EOF + ;; + esac + + +ltmain="$ac_aux_dir/ltmain.sh" + + + # We use sed instead of cat because bash on DJGPP gets confused if + # if finds mixed CR/LF and LF-only lines. Since sed operates in + # text mode, it properly converts lines to CR/LF. This bash problem + # is reportedly fixed, but why not run on old versions too? + sed '$q' "$ltmain" >> "$cfgfile" \ + || (rm -f "$cfgfile"; exit 1) + + if test x"$xsi_shell" = xyes; then + sed -e '/^func_dirname ()$/,/^} # func_dirname /c\ +func_dirname ()\ +{\ +\ case ${1} in\ +\ */*) func_dirname_result="${1%/*}${2}" ;;\ +\ * ) func_dirname_result="${3}" ;;\ +\ esac\ +} # Extended-shell func_dirname implementation' "$cfgfile" > $cfgfile.tmp \ + && mv -f "$cfgfile.tmp" "$cfgfile" \ + || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") +test 0 -eq $? || _lt_function_replace_fail=: + + + sed -e '/^func_basename ()$/,/^} # func_basename /c\ +func_basename ()\ +{\ +\ func_basename_result="${1##*/}"\ +} # Extended-shell func_basename implementation' "$cfgfile" > $cfgfile.tmp \ + && mv -f "$cfgfile.tmp" "$cfgfile" \ + || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") +test 0 -eq $? || _lt_function_replace_fail=: + + + sed -e '/^func_dirname_and_basename ()$/,/^} # func_dirname_and_basename /c\ +func_dirname_and_basename ()\ +{\ +\ case ${1} in\ +\ */*) func_dirname_result="${1%/*}${2}" ;;\ +\ * ) func_dirname_result="${3}" ;;\ +\ esac\ +\ func_basename_result="${1##*/}"\ +} # Extended-shell func_dirname_and_basename implementation' "$cfgfile" > $cfgfile.tmp \ + && mv -f "$cfgfile.tmp" "$cfgfile" \ + || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") +test 0 -eq $? || _lt_function_replace_fail=: + + + sed -e '/^func_stripname ()$/,/^} # func_stripname /c\ +func_stripname ()\ +{\ +\ # pdksh 5.2.14 does not do ${X%$Y} correctly if both X and Y are\ +\ # positional parameters, so assign one to ordinary parameter first.\ +\ func_stripname_result=${3}\ +\ func_stripname_result=${func_stripname_result#"${1}"}\ +\ func_stripname_result=${func_stripname_result%"${2}"}\ +} # Extended-shell func_stripname implementation' "$cfgfile" > $cfgfile.tmp \ + && mv -f "$cfgfile.tmp" "$cfgfile" \ + || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") +test 0 -eq $? || _lt_function_replace_fail=: + + + sed -e '/^func_split_long_opt ()$/,/^} # func_split_long_opt /c\ +func_split_long_opt ()\ +{\ +\ func_split_long_opt_name=${1%%=*}\ +\ func_split_long_opt_arg=${1#*=}\ +} # Extended-shell func_split_long_opt implementation' "$cfgfile" > $cfgfile.tmp \ + && mv -f "$cfgfile.tmp" "$cfgfile" \ + || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") +test 0 -eq $? || _lt_function_replace_fail=: + + + sed -e '/^func_split_short_opt ()$/,/^} # func_split_short_opt /c\ +func_split_short_opt ()\ +{\ +\ func_split_short_opt_arg=${1#??}\ +\ func_split_short_opt_name=${1%"$func_split_short_opt_arg"}\ +} # Extended-shell func_split_short_opt implementation' "$cfgfile" > $cfgfile.tmp \ + && mv -f "$cfgfile.tmp" "$cfgfile" \ + || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") +test 0 -eq $? || _lt_function_replace_fail=: + + + sed -e '/^func_lo2o ()$/,/^} # func_lo2o /c\ +func_lo2o ()\ +{\ +\ case ${1} in\ +\ *.lo) func_lo2o_result=${1%.lo}.${objext} ;;\ +\ *) func_lo2o_result=${1} ;;\ +\ esac\ +} # Extended-shell func_lo2o implementation' "$cfgfile" > $cfgfile.tmp \ + && mv -f "$cfgfile.tmp" "$cfgfile" \ + || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") +test 0 -eq $? || _lt_function_replace_fail=: + + + sed -e '/^func_xform ()$/,/^} # func_xform /c\ +func_xform ()\ +{\ + func_xform_result=${1%.*}.lo\ +} # Extended-shell func_xform implementation' "$cfgfile" > $cfgfile.tmp \ + && mv -f "$cfgfile.tmp" "$cfgfile" \ + || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") +test 0 -eq $? || _lt_function_replace_fail=: + + + sed -e '/^func_arith ()$/,/^} # func_arith /c\ +func_arith ()\ +{\ + func_arith_result=$(( $* ))\ +} # Extended-shell func_arith implementation' "$cfgfile" > $cfgfile.tmp \ + && mv -f "$cfgfile.tmp" "$cfgfile" \ + || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") +test 0 -eq $? || _lt_function_replace_fail=: + + + sed -e '/^func_len ()$/,/^} # func_len /c\ +func_len ()\ +{\ + func_len_result=${#1}\ +} # Extended-shell func_len implementation' "$cfgfile" > $cfgfile.tmp \ + && mv -f "$cfgfile.tmp" "$cfgfile" \ + || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") +test 0 -eq $? || _lt_function_replace_fail=: + +fi + +if test x"$lt_shell_append" = xyes; then + sed -e '/^func_append ()$/,/^} # func_append /c\ +func_append ()\ +{\ + eval "${1}+=\\${2}"\ +} # Extended-shell func_append implementation' "$cfgfile" > $cfgfile.tmp \ + && mv -f "$cfgfile.tmp" "$cfgfile" \ + || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") +test 0 -eq $? || _lt_function_replace_fail=: + + + sed -e '/^func_append_quoted ()$/,/^} # func_append_quoted /c\ +func_append_quoted ()\ +{\ +\ func_quote_for_eval "${2}"\ +\ eval "${1}+=\\\\ \\$func_quote_for_eval_result"\ +} # Extended-shell func_append_quoted implementation' "$cfgfile" > $cfgfile.tmp \ + && mv -f "$cfgfile.tmp" "$cfgfile" \ + || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") +test 0 -eq $? || _lt_function_replace_fail=: + + + # Save a `func_append' function call where possible by direct use of '+=' + sed -e 's%func_append \([a-zA-Z_]\{1,\}\) "%\1+="%g' $cfgfile > $cfgfile.tmp \ + && mv -f "$cfgfile.tmp" "$cfgfile" \ + || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") + test 0 -eq $? || _lt_function_replace_fail=: +else + # Save a `func_append' function call even when '+=' is not available + sed -e 's%func_append \([a-zA-Z_]\{1,\}\) "%\1="$\1%g' $cfgfile > $cfgfile.tmp \ + && mv -f "$cfgfile.tmp" "$cfgfile" \ + || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") + test 0 -eq $? || _lt_function_replace_fail=: +fi + +if test x"$_lt_function_replace_fail" = x":"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Unable to substitute extended shell functions in $ofile" >&5 +$as_echo "$as_me: WARNING: Unable to substitute extended shell functions in $ofile" >&2;} +fi + + + mv -f "$cfgfile" "$ofile" || + (rm -f "$ofile" && cp "$cfgfile" "$ofile" && rm -f "$cfgfile") + chmod +x "$ofile" + + + cat <<_LT_EOF >> "$ofile" + +# ### BEGIN LIBTOOL TAG CONFIG: CXX + +# The linker used to build libraries. +LD=$lt_LD_CXX + +# How to create reloadable object files. +reload_flag=$lt_reload_flag_CXX +reload_cmds=$lt_reload_cmds_CXX + +# Commands used to build an old-style archive. +old_archive_cmds=$lt_old_archive_cmds_CXX + +# A language specific compiler. +CC=$lt_compiler_CXX + +# Is the compiler the GNU compiler? +with_gcc=$GCC_CXX + +# Compiler flag to turn off builtin functions. +no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag_CXX + +# Additional compiler flags for building library objects. +pic_flag=$lt_lt_prog_compiler_pic_CXX + +# How to pass a linker flag through the compiler. +wl=$lt_lt_prog_compiler_wl_CXX + +# Compiler flag to prevent dynamic linking. +link_static_flag=$lt_lt_prog_compiler_static_CXX + +# Does compiler simultaneously support -c and -o options? +compiler_c_o=$lt_lt_cv_prog_compiler_c_o_CXX + +# Whether or not to add -lc for building shared libraries. +build_libtool_need_lc=$archive_cmds_need_lc_CXX + +# Whether or not to disallow shared libs when runtime libs are static. +allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes_CXX + +# Compiler flag to allow reflexive dlopens. +export_dynamic_flag_spec=$lt_export_dynamic_flag_spec_CXX + +# Compiler flag to generate shared objects directly from archives. +whole_archive_flag_spec=$lt_whole_archive_flag_spec_CXX + +# Whether the compiler copes with passing no objects directly. +compiler_needs_object=$lt_compiler_needs_object_CXX + +# Create an old-style archive from a shared archive. +old_archive_from_new_cmds=$lt_old_archive_from_new_cmds_CXX + +# Create a temporary old-style archive to link instead of a shared archive. +old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds_CXX + +# Commands used to build a shared archive. +archive_cmds=$lt_archive_cmds_CXX +archive_expsym_cmds=$lt_archive_expsym_cmds_CXX + +# Commands used to build a loadable module if different from building +# a shared archive. +module_cmds=$lt_module_cmds_CXX +module_expsym_cmds=$lt_module_expsym_cmds_CXX + +# Whether we are building with GNU ld or not. +with_gnu_ld=$lt_with_gnu_ld_CXX + +# Flag that allows shared libraries with undefined symbols to be built. +allow_undefined_flag=$lt_allow_undefined_flag_CXX + +# Flag that enforces no undefined symbols. +no_undefined_flag=$lt_no_undefined_flag_CXX + +# Flag to hardcode \$libdir into a binary during linking. +# This must work even if \$libdir does not exist +hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec_CXX + +# Whether we need a single "-rpath" flag with a separated argument. +hardcode_libdir_separator=$lt_hardcode_libdir_separator_CXX + +# Set to "yes" if using DIR/libNAME\${shared_ext} during linking hardcodes +# DIR into the resulting binary. +hardcode_direct=$hardcode_direct_CXX + +# Set to "yes" if using DIR/libNAME\${shared_ext} during linking hardcodes +# DIR into the resulting binary and the resulting library dependency is +# "absolute",i.e impossible to change by setting \${shlibpath_var} if the +# library is relocated. +hardcode_direct_absolute=$hardcode_direct_absolute_CXX + +# Set to "yes" if using the -LDIR flag during linking hardcodes DIR +# into the resulting binary. +hardcode_minus_L=$hardcode_minus_L_CXX + +# Set to "yes" if using SHLIBPATH_VAR=DIR during linking hardcodes DIR +# into the resulting binary. +hardcode_shlibpath_var=$hardcode_shlibpath_var_CXX + +# Set to "yes" if building a shared library automatically hardcodes DIR +# into the library and all subsequent libraries and executables linked +# against it. +hardcode_automatic=$hardcode_automatic_CXX + +# Set to yes if linker adds runtime paths of dependent libraries +# to runtime path list. +inherit_rpath=$inherit_rpath_CXX + +# Whether libtool must link a program against all its dependency libraries. +link_all_deplibs=$link_all_deplibs_CXX + +# Set to "yes" if exported symbols are required. +always_export_symbols=$always_export_symbols_CXX + +# The commands to list exported symbols. +export_symbols_cmds=$lt_export_symbols_cmds_CXX + +# Symbols that should not be listed in the preloaded symbols. +exclude_expsyms=$lt_exclude_expsyms_CXX + +# Symbols that must always be exported. +include_expsyms=$lt_include_expsyms_CXX + +# Commands necessary for linking programs (against libraries) with templates. +prelink_cmds=$lt_prelink_cmds_CXX + +# Commands necessary for finishing linking programs. +postlink_cmds=$lt_postlink_cmds_CXX + +# Specify filename containing input files. +file_list_spec=$lt_file_list_spec_CXX + +# How to hardcode a shared library path into an executable. +hardcode_action=$hardcode_action_CXX + +# The directories searched by this compiler when creating a shared library. +compiler_lib_search_dirs=$lt_compiler_lib_search_dirs_CXX + +# Dependencies to place before and after the objects being linked to +# create a shared library. +predep_objects=$lt_predep_objects_CXX +postdep_objects=$lt_postdep_objects_CXX +predeps=$lt_predeps_CXX +postdeps=$lt_postdeps_CXX + +# The library search path used internally by the compiler when linking +# a shared library. +compiler_lib_search_path=$lt_compiler_lib_search_path_CXX + +# ### END LIBTOOL TAG CONFIG: CXX +_LT_EOF + + ;; + + esac +done # for ac_tag + + +as_fn_exit 0 +_ACEOF +ac_clean_files=$ac_clean_files_save + +test $ac_write_fail = 0 || + as_fn_error $? "write failure creating $CONFIG_STATUS" "$LINENO" 5 + + +# configure is writing to config.log, and then calls config.status. +# config.status does its own redirection, appending to config.log. +# Unfortunately, on DOS this fails, as config.log is still kept open +# by configure, so config.status won't be able to write to it; its +# output is simply discarded. So we exec the FD to /dev/null, +# effectively closing config.log, so it can be properly (re)opened and +# appended to by config.status. When coming back to configure, we +# need to make the FD available again. +if test "$no_create" != yes; then + ac_cs_success=: + ac_config_status_args= + test "$silent" = yes && + ac_config_status_args="$ac_config_status_args --quiet" + exec 5>/dev/null + $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false + exec 5>>config.log + # Use ||, not &&, to avoid exiting from the if with $? = 1, which + # would make configure fail if this is the last instruction. + $ac_cs_success || as_fn_exit 1 +fi +if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5 +$as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;} +fi + diff --git a/pkg/registry/zookeeper-3.4.6/src/c/autom4te.cache/output.2 b/pkg/registry/zookeeper-3.4.6/src/c/autom4te.cache/output.2 new file mode 100644 index 000000000..b05991cdf --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/c/autom4te.cache/output.2 @@ -0,0 +1,20471 @@ +@%:@! /bin/sh +@%:@ Guess values for system-dependent variables and create Makefiles. +@%:@ Generated by GNU Autoconf 2.69 for zookeeper C client 3.4.5. +@%:@ +@%:@ Report bugs to . +@%:@ +@%:@ +@%:@ Copyright (C) 1992-1996, 1998-2012 Free Software Foundation, Inc. +@%:@ +@%:@ +@%:@ This configure script is free software; the Free Software Foundation +@%:@ gives unlimited permission to copy, distribute and modify it. +## -------------------- ## +## M4sh Initialization. ## +## -------------------- ## + +# Be more Bourne compatible +DUALCASE=1; export DUALCASE # for MKS sh +if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : + emulate sh + NULLCMD=: + # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which + # is contrary to our usage. Disable this feature. + alias -g '${1+"$@"}'='"$@"' + setopt NO_GLOB_SUBST +else + case `(set -o) 2>/dev/null` in @%:@( + *posix*) : + set -o posix ;; @%:@( + *) : + ;; +esac +fi + + +as_nl=' +' +export as_nl +# Printing a long string crashes Solaris 7 /usr/bin/printf. +as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' +as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo +as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo +# Prefer a ksh shell builtin over an external printf program on Solaris, +# but without wasting forks for bash or zsh. +if test -z "$BASH_VERSION$ZSH_VERSION" \ + && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then + as_echo='print -r --' + as_echo_n='print -rn --' +elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then + as_echo='printf %s\n' + as_echo_n='printf %s' +else + if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then + as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' + as_echo_n='/usr/ucb/echo -n' + else + as_echo_body='eval expr "X$1" : "X\\(.*\\)"' + as_echo_n_body='eval + arg=$1; + case $arg in @%:@( + *"$as_nl"*) + expr "X$arg" : "X\\(.*\\)$as_nl"; + arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; + esac; + expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" + ' + export as_echo_n_body + as_echo_n='sh -c $as_echo_n_body as_echo' + fi + export as_echo_body + as_echo='sh -c $as_echo_body as_echo' +fi + +# The user is always right. +if test "${PATH_SEPARATOR+set}" != set; then + PATH_SEPARATOR=: + (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { + (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || + PATH_SEPARATOR=';' + } +fi + + +# IFS +# We need space, tab and new line, in precisely that order. Quoting is +# there to prevent editors from complaining about space-tab. +# (If _AS_PATH_WALK were called with IFS unset, it would disable word +# splitting by setting IFS to empty value.) +IFS=" "" $as_nl" + +# Find who we are. Look in the path if we contain no directory separator. +as_myself= +case $0 in @%:@(( + *[\\/]* ) as_myself=$0 ;; + *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break + done +IFS=$as_save_IFS + + ;; +esac +# We did not find ourselves, most probably we were run as `sh COMMAND' +# in which case we are not to be found in the path. +if test "x$as_myself" = x; then + as_myself=$0 +fi +if test ! -f "$as_myself"; then + $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 + exit 1 +fi + +# Unset variables that we do not need and which cause bugs (e.g. in +# pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" +# suppresses any "Segmentation fault" message there. '((' could +# trigger a bug in pdksh 5.2.14. +for as_var in BASH_ENV ENV MAIL MAILPATH +do eval test x\${$as_var+set} = xset \ + && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : +done +PS1='$ ' +PS2='> ' +PS4='+ ' + +# NLS nuisances. +LC_ALL=C +export LC_ALL +LANGUAGE=C +export LANGUAGE + +# CDPATH. +(unset CDPATH) >/dev/null 2>&1 && unset CDPATH + +# Use a proper internal environment variable to ensure we don't fall + # into an infinite loop, continuously re-executing ourselves. + if test x"${_as_can_reexec}" != xno && test "x$CONFIG_SHELL" != x; then + _as_can_reexec=no; export _as_can_reexec; + # We cannot yet assume a decent shell, so we have to provide a +# neutralization value for shells without unset; and this also +# works around shells that cannot unset nonexistent variables. +# Preserve -v and -x to the replacement shell. +BASH_ENV=/dev/null +ENV=/dev/null +(unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV +case $- in @%:@ (((( + *v*x* | *x*v* ) as_opts=-vx ;; + *v* ) as_opts=-v ;; + *x* ) as_opts=-x ;; + * ) as_opts= ;; +esac +exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} +# Admittedly, this is quite paranoid, since all the known shells bail +# out after a failed `exec'. +$as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2 +as_fn_exit 255 + fi + # We don't want this to propagate to other subprocesses. + { _as_can_reexec=; unset _as_can_reexec;} +if test "x$CONFIG_SHELL" = x; then + as_bourne_compatible="if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then : + emulate sh + NULLCMD=: + # Pre-4.2 versions of Zsh do word splitting on \${1+\"\$@\"}, which + # is contrary to our usage. Disable this feature. + alias -g '\${1+\"\$@\"}'='\"\$@\"' + setopt NO_GLOB_SUBST +else + case \`(set -o) 2>/dev/null\` in @%:@( + *posix*) : + set -o posix ;; @%:@( + *) : + ;; +esac +fi +" + as_required="as_fn_return () { (exit \$1); } +as_fn_success () { as_fn_return 0; } +as_fn_failure () { as_fn_return 1; } +as_fn_ret_success () { return 0; } +as_fn_ret_failure () { return 1; } + +exitcode=0 +as_fn_success || { exitcode=1; echo as_fn_success failed.; } +as_fn_failure && { exitcode=1; echo as_fn_failure succeeded.; } +as_fn_ret_success || { exitcode=1; echo as_fn_ret_success failed.; } +as_fn_ret_failure && { exitcode=1; echo as_fn_ret_failure succeeded.; } +if ( set x; as_fn_ret_success y && test x = \"\$1\" ); then : + +else + exitcode=1; echo positional parameters were not saved. +fi +test x\$exitcode = x0 || exit 1 +test -x / || exit 1" + as_suggested=" as_lineno_1=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_1a=\$LINENO + as_lineno_2=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_2a=\$LINENO + eval 'test \"x\$as_lineno_1'\$as_run'\" != \"x\$as_lineno_2'\$as_run'\" && + test \"x\`expr \$as_lineno_1'\$as_run' + 1\`\" = \"x\$as_lineno_2'\$as_run'\"' || exit 1 + + test -n \"\${ZSH_VERSION+set}\${BASH_VERSION+set}\" || ( + ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' + ECHO=\$ECHO\$ECHO\$ECHO\$ECHO\$ECHO + ECHO=\$ECHO\$ECHO\$ECHO\$ECHO\$ECHO\$ECHO + PATH=/empty FPATH=/empty; export PATH FPATH + test \"X\`printf %s \$ECHO\`\" = \"X\$ECHO\" \\ + || test \"X\`print -r -- \$ECHO\`\" = \"X\$ECHO\" ) || exit 1 +test \$(( 1 + 1 )) = 2 || exit 1" + if (eval "$as_required") 2>/dev/null; then : + as_have_required=yes +else + as_have_required=no +fi + if test x$as_have_required = xyes && (eval "$as_suggested") 2>/dev/null; then : + +else + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +as_found=false +for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + as_found=: + case $as_dir in @%:@( + /*) + for as_base in sh bash ksh sh5; do + # Try only shells that exist, to save several forks. + as_shell=$as_dir/$as_base + if { test -f "$as_shell" || test -f "$as_shell.exe"; } && + { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$as_shell"; } 2>/dev/null; then : + CONFIG_SHELL=$as_shell as_have_required=yes + if { $as_echo "$as_bourne_compatible""$as_suggested" | as_run=a "$as_shell"; } 2>/dev/null; then : + break 2 +fi +fi + done;; + esac + as_found=false +done +$as_found || { if { test -f "$SHELL" || test -f "$SHELL.exe"; } && + { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$SHELL"; } 2>/dev/null; then : + CONFIG_SHELL=$SHELL as_have_required=yes +fi; } +IFS=$as_save_IFS + + + if test "x$CONFIG_SHELL" != x; then : + export CONFIG_SHELL + # We cannot yet assume a decent shell, so we have to provide a +# neutralization value for shells without unset; and this also +# works around shells that cannot unset nonexistent variables. +# Preserve -v and -x to the replacement shell. +BASH_ENV=/dev/null +ENV=/dev/null +(unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV +case $- in @%:@ (((( + *v*x* | *x*v* ) as_opts=-vx ;; + *v* ) as_opts=-v ;; + *x* ) as_opts=-x ;; + * ) as_opts= ;; +esac +exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} +# Admittedly, this is quite paranoid, since all the known shells bail +# out after a failed `exec'. +$as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2 +exit 255 +fi + + if test x$as_have_required = xno; then : + $as_echo "$0: This script requires a shell more modern than all" + $as_echo "$0: the shells that I found on your system." + if test x${ZSH_VERSION+set} = xset ; then + $as_echo "$0: In particular, zsh $ZSH_VERSION has bugs and should" + $as_echo "$0: be upgraded to zsh 4.3.4 or later." + else + $as_echo "$0: Please tell bug-autoconf@gnu.org and +$0: user@zookeeper.apache.org about your system, including +$0: any error possibly output before this message. Then +$0: install a modern shell, or manually run the script +$0: under such a shell if you do have one." + fi + exit 1 +fi +fi +fi +SHELL=${CONFIG_SHELL-/bin/sh} +export SHELL +# Unset more variables known to interfere with behavior of common tools. +CLICOLOR_FORCE= GREP_OPTIONS= +unset CLICOLOR_FORCE GREP_OPTIONS + +## --------------------- ## +## M4sh Shell Functions. ## +## --------------------- ## +@%:@ as_fn_unset VAR +@%:@ --------------- +@%:@ Portably unset VAR. +as_fn_unset () +{ + { eval $1=; unset $1;} +} +as_unset=as_fn_unset + +@%:@ as_fn_set_status STATUS +@%:@ ----------------------- +@%:@ Set @S|@? to STATUS, without forking. +as_fn_set_status () +{ + return $1 +} @%:@ as_fn_set_status + +@%:@ as_fn_exit STATUS +@%:@ ----------------- +@%:@ Exit the shell with STATUS, even in a "trap 0" or "set -e" context. +as_fn_exit () +{ + set +e + as_fn_set_status $1 + exit $1 +} @%:@ as_fn_exit + +@%:@ as_fn_mkdir_p +@%:@ ------------- +@%:@ Create "@S|@as_dir" as a directory, including parents if necessary. +as_fn_mkdir_p () +{ + + case $as_dir in #( + -*) as_dir=./$as_dir;; + esac + test -d "$as_dir" || eval $as_mkdir_p || { + as_dirs= + while :; do + case $as_dir in #( + *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( + *) as_qdir=$as_dir;; + esac + as_dirs="'$as_qdir' $as_dirs" + as_dir=`$as_dirname -- "$as_dir" || +$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$as_dir" : 'X\(//\)[^/]' \| \ + X"$as_dir" : 'X\(//\)$' \| \ + X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$as_dir" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + test -d "$as_dir" && break + done + test -z "$as_dirs" || eval "mkdir $as_dirs" + } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" + + +} @%:@ as_fn_mkdir_p + +@%:@ as_fn_executable_p FILE +@%:@ ----------------------- +@%:@ Test if FILE is an executable regular file. +as_fn_executable_p () +{ + test -f "$1" && test -x "$1" +} @%:@ as_fn_executable_p +@%:@ as_fn_append VAR VALUE +@%:@ ---------------------- +@%:@ Append the text in VALUE to the end of the definition contained in VAR. Take +@%:@ advantage of any shell optimizations that allow amortized linear growth over +@%:@ repeated appends, instead of the typical quadratic growth present in naive +@%:@ implementations. +if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : + eval 'as_fn_append () + { + eval $1+=\$2 + }' +else + as_fn_append () + { + eval $1=\$$1\$2 + } +fi # as_fn_append + +@%:@ as_fn_arith ARG... +@%:@ ------------------ +@%:@ Perform arithmetic evaluation on the ARGs, and store the result in the +@%:@ global @S|@as_val. Take advantage of shells that can avoid forks. The arguments +@%:@ must be portable across @S|@(()) and expr. +if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : + eval 'as_fn_arith () + { + as_val=$(( $* )) + }' +else + as_fn_arith () + { + as_val=`expr "$@" || test $? -eq 1` + } +fi # as_fn_arith + + +@%:@ as_fn_error STATUS ERROR [LINENO LOG_FD] +@%:@ ---------------------------------------- +@%:@ Output "`basename @S|@0`: error: ERROR" to stderr. If LINENO and LOG_FD are +@%:@ provided, also output the error to LOG_FD, referencing LINENO. Then exit the +@%:@ script with STATUS, using 1 if that was 0. +as_fn_error () +{ + as_status=$1; test $as_status -eq 0 && as_status=1 + if test "$4"; then + as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 + fi + $as_echo "$as_me: error: $2" >&2 + as_fn_exit $as_status +} @%:@ as_fn_error + +if expr a : '\(a\)' >/dev/null 2>&1 && + test "X`expr 00001 : '.*\(...\)'`" = X001; then + as_expr=expr +else + as_expr=false +fi + +if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then + as_basename=basename +else + as_basename=false +fi + +if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then + as_dirname=dirname +else + as_dirname=false +fi + +as_me=`$as_basename -- "$0" || +$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ + X"$0" : 'X\(//\)$' \| \ + X"$0" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X/"$0" | + sed '/^.*\/\([^/][^/]*\)\/*$/{ + s//\1/ + q + } + /^X\/\(\/\/\)$/{ + s//\1/ + q + } + /^X\/\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + +# Avoid depending upon Character Ranges. +as_cr_letters='abcdefghijklmnopqrstuvwxyz' +as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' +as_cr_Letters=$as_cr_letters$as_cr_LETTERS +as_cr_digits='0123456789' +as_cr_alnum=$as_cr_Letters$as_cr_digits + + + as_lineno_1=$LINENO as_lineno_1a=$LINENO + as_lineno_2=$LINENO as_lineno_2a=$LINENO + eval 'test "x$as_lineno_1'$as_run'" != "x$as_lineno_2'$as_run'" && + test "x`expr $as_lineno_1'$as_run' + 1`" = "x$as_lineno_2'$as_run'"' || { + # Blame Lee E. McMahon (1931-1989) for sed's syntax. :-) + sed -n ' + p + /[$]LINENO/= + ' <$as_myself | + sed ' + s/[$]LINENO.*/&-/ + t lineno + b + :lineno + N + :loop + s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/ + t loop + s/-\n.*// + ' >$as_me.lineno && + chmod +x "$as_me.lineno" || + { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; } + + # If we had to re-execute with $CONFIG_SHELL, we're ensured to have + # already done that, so ensure we don't try to do so again and fall + # in an infinite loop. This has already happened in practice. + _as_can_reexec=no; export _as_can_reexec + # Don't try to exec as it changes $[0], causing all sort of problems + # (the dirname of $[0] is not the place where we might find the + # original and so on. Autoconf is especially sensitive to this). + . "./$as_me.lineno" + # Exit status is that of the last command. + exit +} + +ECHO_C= ECHO_N= ECHO_T= +case `echo -n x` in @%:@((((( +-n*) + case `echo 'xy\c'` in + *c*) ECHO_T=' ';; # ECHO_T is single tab character. + xy) ECHO_C='\c';; + *) echo `echo ksh88 bug on AIX 6.1` > /dev/null + ECHO_T=' ';; + esac;; +*) + ECHO_N='-n';; +esac + +rm -f conf$$ conf$$.exe conf$$.file +if test -d conf$$.dir; then + rm -f conf$$.dir/conf$$.file +else + rm -f conf$$.dir + mkdir conf$$.dir 2>/dev/null +fi +if (echo >conf$$.file) 2>/dev/null; then + if ln -s conf$$.file conf$$ 2>/dev/null; then + as_ln_s='ln -s' + # ... but there are two gotchas: + # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. + # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. + # In both cases, we have to default to `cp -pR'. + ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || + as_ln_s='cp -pR' + elif ln conf$$.file conf$$ 2>/dev/null; then + as_ln_s=ln + else + as_ln_s='cp -pR' + fi +else + as_ln_s='cp -pR' +fi +rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file +rmdir conf$$.dir 2>/dev/null + +if mkdir -p . 2>/dev/null; then + as_mkdir_p='mkdir -p "$as_dir"' +else + test -d ./-p && rmdir ./-p + as_mkdir_p=false +fi + +as_test_x='test -x' +as_executable_p=as_fn_executable_p + +# Sed expression to map a string onto a valid CPP name. +as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" + +# Sed expression to map a string onto a valid variable name. +as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" + +SHELL=${CONFIG_SHELL-/bin/sh} + + +test -n "$DJDIR" || exec 7<&0 &1 + +# Name of the host. +# hostname on some systems (SVR3.2, old GNU/Linux) returns a bogus exit status, +# so uname gets run too. +ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q` + +# +# Initializations. +# +ac_default_prefix=/usr/local +ac_clean_files= +ac_config_libobj_dir=. +LIB@&t@OBJS= +cross_compiling=no +subdirs= +MFLAGS= +MAKEFLAGS= + +# Identity of this package. +PACKAGE_NAME='zookeeper C client' +PACKAGE_TARNAME='zookeeper' +PACKAGE_VERSION='3.4.5' +PACKAGE_STRING='zookeeper C client 3.4.5' +PACKAGE_BUGREPORT='user@zookeeper.apache.org' +PACKAGE_URL='' + +ac_unique_file="src/zookeeper.c" +# Factoring default headers for most tests. +ac_includes_default="\ +#include +#ifdef HAVE_SYS_TYPES_H +# include +#endif +#ifdef HAVE_SYS_STAT_H +# include +#endif +#ifdef STDC_HEADERS +# include +# include +#else +# ifdef HAVE_STDLIB_H +# include +# endif +#endif +#ifdef HAVE_STRING_H +# if !defined STDC_HEADERS && defined HAVE_MEMORY_H +# include +# endif +# include +#endif +#ifdef HAVE_STRINGS_H +# include +#endif +#ifdef HAVE_INTTYPES_H +# include +#endif +#ifdef HAVE_STDINT_H +# include +#endif +#ifdef HAVE_UNISTD_H +# include +#endif" + +ac_subst_vars='am__EXEEXT_FALSE +am__EXEEXT_TRUE +LTLIBOBJS +LIB@&t@OBJS +USEIPV6 +WANT_SYNCAPI_FALSE +WANT_SYNCAPI_TRUE +CXXCPP +CPP +OTOOL64 +OTOOL +LIPO +NMEDIT +DSYMUTIL +MANIFEST_TOOL +RANLIB +ac_ct_AR +AR +DLLTOOL +OBJDUMP +NM +ac_ct_DUMPBIN +DUMPBIN +LD +FGREP +EGREP +GREP +SED +host_os +host_vendor +host_cpu +host +build_os +build_vendor +build_cpu +build +LIBTOOL +LN_S +am__fastdepCXX_FALSE +am__fastdepCXX_TRUE +CXXDEPMODE +ac_ct_CXX +CXXFLAGS +CXX +am__fastdepCC_FALSE +am__fastdepCC_TRUE +CCDEPMODE +am__nodep +AMDEPBACKSLASH +AMDEP_FALSE +AMDEP_TRUE +am__quote +am__include +DEPDIR +OBJEXT +EXEEXT +ac_ct_CC +CPPFLAGS +LDFLAGS +CFLAGS +CC +CPPUNIT_CFLAGS +am__untar +am__tar +AMTAR +am__leading_dot +SET_MAKE +AWK +mkdir_p +MKDIR_P +INSTALL_STRIP_PROGRAM +STRIP +install_sh +MAKEINFO +AUTOHEADER +AUTOMAKE +AUTOCONF +ACLOCAL +VERSION +PACKAGE +CYGPATH_W +am__isrc +INSTALL_DATA +INSTALL_SCRIPT +INSTALL_PROGRAM +DOXYGEN_PAPER_SIZE +DX_COND_latex_FALSE +DX_COND_latex_TRUE +DX_COND_pdf_FALSE +DX_COND_pdf_TRUE +DX_PDFLATEX +DX_FLAG_pdf +DX_COND_ps_FALSE +DX_COND_ps_TRUE +DX_EGREP +DX_DVIPS +DX_MAKEINDEX +DX_LATEX +DX_FLAG_ps +DX_COND_html_FALSE +DX_COND_html_TRUE +DX_FLAG_html +DX_COND_chi_FALSE +DX_COND_chi_TRUE +DX_FLAG_chi +DX_COND_chm_FALSE +DX_COND_chm_TRUE +DX_HHC +DX_FLAG_chm +DX_COND_xml_FALSE +DX_COND_xml_TRUE +DX_FLAG_xml +DX_COND_rtf_FALSE +DX_COND_rtf_TRUE +DX_FLAG_rtf +DX_COND_man_FALSE +DX_COND_man_TRUE +DX_FLAG_man +DX_COND_dot_FALSE +DX_COND_dot_TRUE +DX_DOT +DX_FLAG_dot +DX_COND_doc_FALSE +DX_COND_doc_TRUE +DX_PERL +DX_DOXYGEN +DX_FLAG_doc +DX_ENV +DX_DOCDIR +DX_CONFIG +DX_PROJECT +target_alias +host_alias +build_alias +LIBS +ECHO_T +ECHO_N +ECHO_C +DEFS +mandir +localedir +libdir +psdir +pdfdir +dvidir +htmldir +infodir +docdir +oldincludedir +includedir +localstatedir +sharedstatedir +sysconfdir +datadir +datarootdir +libexecdir +sbindir +bindir +program_transform_name +prefix +exec_prefix +PACKAGE_URL +PACKAGE_BUGREPORT +PACKAGE_STRING +PACKAGE_VERSION +PACKAGE_TARNAME +PACKAGE_NAME +PATH_SEPARATOR +SHELL' +ac_subst_files='' +ac_user_opts=' +enable_option_checking +enable_doxygen_doc +enable_doxygen_dot +enable_doxygen_man +enable_doxygen_rtf +enable_doxygen_xml +enable_doxygen_chm +enable_doxygen_chi +enable_doxygen_html +enable_doxygen_ps +enable_doxygen_pdf +with_cppunit +enable_dependency_tracking +enable_shared +enable_static +with_pic +enable_fast_install +with_gnu_ld +with_sysroot +enable_libtool_lock +enable_debug +with_syncapi +' + ac_precious_vars='build_alias +host_alias +target_alias +DOXYGEN_PAPER_SIZE +CC +CFLAGS +LDFLAGS +LIBS +CPPFLAGS +CXX +CXXFLAGS +CCC +CPP +CXXCPP' + + +# Initialize some variables set by options. +ac_init_help= +ac_init_version=false +ac_unrecognized_opts= +ac_unrecognized_sep= +# The variables have the same names as the options, with +# dashes changed to underlines. +cache_file=/dev/null +exec_prefix=NONE +no_create= +no_recursion= +prefix=NONE +program_prefix=NONE +program_suffix=NONE +program_transform_name=s,x,x, +silent= +site= +srcdir= +verbose= +x_includes=NONE +x_libraries=NONE + +# Installation directory options. +# These are left unexpanded so users can "make install exec_prefix=/foo" +# and all the variables that are supposed to be based on exec_prefix +# by default will actually change. +# Use braces instead of parens because sh, perl, etc. also accept them. +# (The list follows the same order as the GNU Coding Standards.) +bindir='${exec_prefix}/bin' +sbindir='${exec_prefix}/sbin' +libexecdir='${exec_prefix}/libexec' +datarootdir='${prefix}/share' +datadir='${datarootdir}' +sysconfdir='${prefix}/etc' +sharedstatedir='${prefix}/com' +localstatedir='${prefix}/var' +includedir='${prefix}/include' +oldincludedir='/usr/include' +docdir='${datarootdir}/doc/${PACKAGE_TARNAME}' +infodir='${datarootdir}/info' +htmldir='${docdir}' +dvidir='${docdir}' +pdfdir='${docdir}' +psdir='${docdir}' +libdir='${exec_prefix}/lib' +localedir='${datarootdir}/locale' +mandir='${datarootdir}/man' + +ac_prev= +ac_dashdash= +for ac_option +do + # If the previous option needs an argument, assign it. + if test -n "$ac_prev"; then + eval $ac_prev=\$ac_option + ac_prev= + continue + fi + + case $ac_option in + *=?*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;; + *=) ac_optarg= ;; + *) ac_optarg=yes ;; + esac + + # Accept the important Cygnus configure options, so we can diagnose typos. + + case $ac_dashdash$ac_option in + --) + ac_dashdash=yes ;; + + -bindir | --bindir | --bindi | --bind | --bin | --bi) + ac_prev=bindir ;; + -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*) + bindir=$ac_optarg ;; + + -build | --build | --buil | --bui | --bu) + ac_prev=build_alias ;; + -build=* | --build=* | --buil=* | --bui=* | --bu=*) + build_alias=$ac_optarg ;; + + -cache-file | --cache-file | --cache-fil | --cache-fi \ + | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c) + ac_prev=cache_file ;; + -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \ + | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*) + cache_file=$ac_optarg ;; + + --config-cache | -C) + cache_file=config.cache ;; + + -datadir | --datadir | --datadi | --datad) + ac_prev=datadir ;; + -datadir=* | --datadir=* | --datadi=* | --datad=*) + datadir=$ac_optarg ;; + + -datarootdir | --datarootdir | --datarootdi | --datarootd | --dataroot \ + | --dataroo | --dataro | --datar) + ac_prev=datarootdir ;; + -datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \ + | --dataroot=* | --dataroo=* | --dataro=* | --datar=*) + datarootdir=$ac_optarg ;; + + -disable-* | --disable-*) + ac_useropt=`expr "x$ac_option" : 'x-*disable-\(.*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && + as_fn_error $? "invalid feature name: $ac_useropt" + ac_useropt_orig=$ac_useropt + ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` + case $ac_user_opts in + *" +"enable_$ac_useropt" +"*) ;; + *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--disable-$ac_useropt_orig" + ac_unrecognized_sep=', ';; + esac + eval enable_$ac_useropt=no ;; + + -docdir | --docdir | --docdi | --doc | --do) + ac_prev=docdir ;; + -docdir=* | --docdir=* | --docdi=* | --doc=* | --do=*) + docdir=$ac_optarg ;; + + -dvidir | --dvidir | --dvidi | --dvid | --dvi | --dv) + ac_prev=dvidir ;; + -dvidir=* | --dvidir=* | --dvidi=* | --dvid=* | --dvi=* | --dv=*) + dvidir=$ac_optarg ;; + + -enable-* | --enable-*) + ac_useropt=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && + as_fn_error $? "invalid feature name: $ac_useropt" + ac_useropt_orig=$ac_useropt + ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` + case $ac_user_opts in + *" +"enable_$ac_useropt" +"*) ;; + *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--enable-$ac_useropt_orig" + ac_unrecognized_sep=', ';; + esac + eval enable_$ac_useropt=\$ac_optarg ;; + + -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \ + | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \ + | --exec | --exe | --ex) + ac_prev=exec_prefix ;; + -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \ + | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \ + | --exec=* | --exe=* | --ex=*) + exec_prefix=$ac_optarg ;; + + -gas | --gas | --ga | --g) + # Obsolete; use --with-gas. + with_gas=yes ;; + + -help | --help | --hel | --he | -h) + ac_init_help=long ;; + -help=r* | --help=r* | --hel=r* | --he=r* | -hr*) + ac_init_help=recursive ;; + -help=s* | --help=s* | --hel=s* | --he=s* | -hs*) + ac_init_help=short ;; + + -host | --host | --hos | --ho) + ac_prev=host_alias ;; + -host=* | --host=* | --hos=* | --ho=*) + host_alias=$ac_optarg ;; + + -htmldir | --htmldir | --htmldi | --htmld | --html | --htm | --ht) + ac_prev=htmldir ;; + -htmldir=* | --htmldir=* | --htmldi=* | --htmld=* | --html=* | --htm=* \ + | --ht=*) + htmldir=$ac_optarg ;; + + -includedir | --includedir | --includedi | --included | --include \ + | --includ | --inclu | --incl | --inc) + ac_prev=includedir ;; + -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \ + | --includ=* | --inclu=* | --incl=* | --inc=*) + includedir=$ac_optarg ;; + + -infodir | --infodir | --infodi | --infod | --info | --inf) + ac_prev=infodir ;; + -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*) + infodir=$ac_optarg ;; + + -libdir | --libdir | --libdi | --libd) + ac_prev=libdir ;; + -libdir=* | --libdir=* | --libdi=* | --libd=*) + libdir=$ac_optarg ;; + + -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \ + | --libexe | --libex | --libe) + ac_prev=libexecdir ;; + -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \ + | --libexe=* | --libex=* | --libe=*) + libexecdir=$ac_optarg ;; + + -localedir | --localedir | --localedi | --localed | --locale) + ac_prev=localedir ;; + -localedir=* | --localedir=* | --localedi=* | --localed=* | --locale=*) + localedir=$ac_optarg ;; + + -localstatedir | --localstatedir | --localstatedi | --localstated \ + | --localstate | --localstat | --localsta | --localst | --locals) + ac_prev=localstatedir ;; + -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \ + | --localstate=* | --localstat=* | --localsta=* | --localst=* | --locals=*) + localstatedir=$ac_optarg ;; + + -mandir | --mandir | --mandi | --mand | --man | --ma | --m) + ac_prev=mandir ;; + -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*) + mandir=$ac_optarg ;; + + -nfp | --nfp | --nf) + # Obsolete; use --without-fp. + with_fp=no ;; + + -no-create | --no-create | --no-creat | --no-crea | --no-cre \ + | --no-cr | --no-c | -n) + no_create=yes ;; + + -no-recursion | --no-recursion | --no-recursio | --no-recursi \ + | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) + no_recursion=yes ;; + + -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \ + | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \ + | --oldin | --oldi | --old | --ol | --o) + ac_prev=oldincludedir ;; + -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \ + | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \ + | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*) + oldincludedir=$ac_optarg ;; + + -prefix | --prefix | --prefi | --pref | --pre | --pr | --p) + ac_prev=prefix ;; + -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*) + prefix=$ac_optarg ;; + + -program-prefix | --program-prefix | --program-prefi | --program-pref \ + | --program-pre | --program-pr | --program-p) + ac_prev=program_prefix ;; + -program-prefix=* | --program-prefix=* | --program-prefi=* \ + | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*) + program_prefix=$ac_optarg ;; + + -program-suffix | --program-suffix | --program-suffi | --program-suff \ + | --program-suf | --program-su | --program-s) + ac_prev=program_suffix ;; + -program-suffix=* | --program-suffix=* | --program-suffi=* \ + | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*) + program_suffix=$ac_optarg ;; + + -program-transform-name | --program-transform-name \ + | --program-transform-nam | --program-transform-na \ + | --program-transform-n | --program-transform- \ + | --program-transform | --program-transfor \ + | --program-transfo | --program-transf \ + | --program-trans | --program-tran \ + | --progr-tra | --program-tr | --program-t) + ac_prev=program_transform_name ;; + -program-transform-name=* | --program-transform-name=* \ + | --program-transform-nam=* | --program-transform-na=* \ + | --program-transform-n=* | --program-transform-=* \ + | --program-transform=* | --program-transfor=* \ + | --program-transfo=* | --program-transf=* \ + | --program-trans=* | --program-tran=* \ + | --progr-tra=* | --program-tr=* | --program-t=*) + program_transform_name=$ac_optarg ;; + + -pdfdir | --pdfdir | --pdfdi | --pdfd | --pdf | --pd) + ac_prev=pdfdir ;; + -pdfdir=* | --pdfdir=* | --pdfdi=* | --pdfd=* | --pdf=* | --pd=*) + pdfdir=$ac_optarg ;; + + -psdir | --psdir | --psdi | --psd | --ps) + ac_prev=psdir ;; + -psdir=* | --psdir=* | --psdi=* | --psd=* | --ps=*) + psdir=$ac_optarg ;; + + -q | -quiet | --quiet | --quie | --qui | --qu | --q \ + | -silent | --silent | --silen | --sile | --sil) + silent=yes ;; + + -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb) + ac_prev=sbindir ;; + -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \ + | --sbi=* | --sb=*) + sbindir=$ac_optarg ;; + + -sharedstatedir | --sharedstatedir | --sharedstatedi \ + | --sharedstated | --sharedstate | --sharedstat | --sharedsta \ + | --sharedst | --shareds | --shared | --share | --shar \ + | --sha | --sh) + ac_prev=sharedstatedir ;; + -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \ + | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \ + | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \ + | --sha=* | --sh=*) + sharedstatedir=$ac_optarg ;; + + -site | --site | --sit) + ac_prev=site ;; + -site=* | --site=* | --sit=*) + site=$ac_optarg ;; + + -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) + ac_prev=srcdir ;; + -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) + srcdir=$ac_optarg ;; + + -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \ + | --syscon | --sysco | --sysc | --sys | --sy) + ac_prev=sysconfdir ;; + -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \ + | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*) + sysconfdir=$ac_optarg ;; + + -target | --target | --targe | --targ | --tar | --ta | --t) + ac_prev=target_alias ;; + -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*) + target_alias=$ac_optarg ;; + + -v | -verbose | --verbose | --verbos | --verbo | --verb) + verbose=yes ;; + + -version | --version | --versio | --versi | --vers | -V) + ac_init_version=: ;; + + -with-* | --with-*) + ac_useropt=`expr "x$ac_option" : 'x-*with-\([^=]*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && + as_fn_error $? "invalid package name: $ac_useropt" + ac_useropt_orig=$ac_useropt + ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` + case $ac_user_opts in + *" +"with_$ac_useropt" +"*) ;; + *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--with-$ac_useropt_orig" + ac_unrecognized_sep=', ';; + esac + eval with_$ac_useropt=\$ac_optarg ;; + + -without-* | --without-*) + ac_useropt=`expr "x$ac_option" : 'x-*without-\(.*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && + as_fn_error $? "invalid package name: $ac_useropt" + ac_useropt_orig=$ac_useropt + ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` + case $ac_user_opts in + *" +"with_$ac_useropt" +"*) ;; + *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--without-$ac_useropt_orig" + ac_unrecognized_sep=', ';; + esac + eval with_$ac_useropt=no ;; + + --x) + # Obsolete; use --with-x. + with_x=yes ;; + + -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \ + | --x-incl | --x-inc | --x-in | --x-i) + ac_prev=x_includes ;; + -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \ + | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*) + x_includes=$ac_optarg ;; + + -x-libraries | --x-libraries | --x-librarie | --x-librari \ + | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l) + ac_prev=x_libraries ;; + -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \ + | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*) + x_libraries=$ac_optarg ;; + + -*) as_fn_error $? "unrecognized option: \`$ac_option' +Try \`$0 --help' for more information" + ;; + + *=*) + ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='` + # Reject names that are not valid shell variable names. + case $ac_envvar in #( + '' | [0-9]* | *[!_$as_cr_alnum]* ) + as_fn_error $? "invalid variable name: \`$ac_envvar'" ;; + esac + eval $ac_envvar=\$ac_optarg + export $ac_envvar ;; + + *) + # FIXME: should be removed in autoconf 3.0. + $as_echo "$as_me: WARNING: you should use --build, --host, --target" >&2 + expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null && + $as_echo "$as_me: WARNING: invalid host type: $ac_option" >&2 + : "${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}" + ;; + + esac +done + +if test -n "$ac_prev"; then + ac_option=--`echo $ac_prev | sed 's/_/-/g'` + as_fn_error $? "missing argument to $ac_option" +fi + +if test -n "$ac_unrecognized_opts"; then + case $enable_option_checking in + no) ;; + fatal) as_fn_error $? "unrecognized options: $ac_unrecognized_opts" ;; + *) $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 ;; + esac +fi + +# Check all directory arguments for consistency. +for ac_var in exec_prefix prefix bindir sbindir libexecdir datarootdir \ + datadir sysconfdir sharedstatedir localstatedir includedir \ + oldincludedir docdir infodir htmldir dvidir pdfdir psdir \ + libdir localedir mandir +do + eval ac_val=\$$ac_var + # Remove trailing slashes. + case $ac_val in + */ ) + ac_val=`expr "X$ac_val" : 'X\(.*[^/]\)' \| "X$ac_val" : 'X\(.*\)'` + eval $ac_var=\$ac_val;; + esac + # Be sure to have absolute directory names. + case $ac_val in + [\\/$]* | ?:[\\/]* ) continue;; + NONE | '' ) case $ac_var in *prefix ) continue;; esac;; + esac + as_fn_error $? "expected an absolute directory name for --$ac_var: $ac_val" +done + +# There might be people who depend on the old broken behavior: `$host' +# used to hold the argument of --host etc. +# FIXME: To remove some day. +build=$build_alias +host=$host_alias +target=$target_alias + +# FIXME: To remove some day. +if test "x$host_alias" != x; then + if test "x$build_alias" = x; then + cross_compiling=maybe + elif test "x$build_alias" != "x$host_alias"; then + cross_compiling=yes + fi +fi + +ac_tool_prefix= +test -n "$host_alias" && ac_tool_prefix=$host_alias- + +test "$silent" = yes && exec 6>/dev/null + + +ac_pwd=`pwd` && test -n "$ac_pwd" && +ac_ls_di=`ls -di .` && +ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` || + as_fn_error $? "working directory cannot be determined" +test "X$ac_ls_di" = "X$ac_pwd_ls_di" || + as_fn_error $? "pwd does not report name of working directory" + + +# Find the source files, if location was not specified. +if test -z "$srcdir"; then + ac_srcdir_defaulted=yes + # Try the directory containing this script, then the parent directory. + ac_confdir=`$as_dirname -- "$as_myself" || +$as_expr X"$as_myself" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$as_myself" : 'X\(//\)[^/]' \| \ + X"$as_myself" : 'X\(//\)$' \| \ + X"$as_myself" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$as_myself" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + srcdir=$ac_confdir + if test ! -r "$srcdir/$ac_unique_file"; then + srcdir=.. + fi +else + ac_srcdir_defaulted=no +fi +if test ! -r "$srcdir/$ac_unique_file"; then + test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .." + as_fn_error $? "cannot find sources ($ac_unique_file) in $srcdir" +fi +ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work" +ac_abs_confdir=`( + cd "$srcdir" && test -r "./$ac_unique_file" || as_fn_error $? "$ac_msg" + pwd)` +# When building in place, set srcdir=. +if test "$ac_abs_confdir" = "$ac_pwd"; then + srcdir=. +fi +# Remove unnecessary trailing slashes from srcdir. +# Double slashes in file names in object file debugging info +# mess up M-x gdb in Emacs. +case $srcdir in +*/) srcdir=`expr "X$srcdir" : 'X\(.*[^/]\)' \| "X$srcdir" : 'X\(.*\)'`;; +esac +for ac_var in $ac_precious_vars; do + eval ac_env_${ac_var}_set=\${${ac_var}+set} + eval ac_env_${ac_var}_value=\$${ac_var} + eval ac_cv_env_${ac_var}_set=\${${ac_var}+set} + eval ac_cv_env_${ac_var}_value=\$${ac_var} +done + +# +# Report the --help message. +# +if test "$ac_init_help" = "long"; then + # Omit some internal or obsolete options to make the list less imposing. + # This message is too long to be a string in the A/UX 3.1 sh. + cat <<_ACEOF +\`configure' configures zookeeper C client 3.4.5 to adapt to many kinds of systems. + +Usage: $0 [OPTION]... [VAR=VALUE]... + +To assign environment variables (e.g., CC, CFLAGS...), specify them as +VAR=VALUE. See below for descriptions of some of the useful variables. + +Defaults for the options are specified in brackets. + +Configuration: + -h, --help display this help and exit + --help=short display options specific to this package + --help=recursive display the short help of all the included packages + -V, --version display version information and exit + -q, --quiet, --silent do not print \`checking ...' messages + --cache-file=FILE cache test results in FILE [disabled] + -C, --config-cache alias for \`--cache-file=config.cache' + -n, --no-create do not create output files + --srcdir=DIR find the sources in DIR [configure dir or \`..'] + +Installation directories: + --prefix=PREFIX install architecture-independent files in PREFIX + @<:@@S|@ac_default_prefix@:>@ + --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX + @<:@PREFIX@:>@ + +By default, \`make install' will install all the files in +\`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc. You can specify +an installation prefix other than \`$ac_default_prefix' using \`--prefix', +for instance \`--prefix=\$HOME'. + +For better control, use the options below. + +Fine tuning of the installation directories: + --bindir=DIR user executables [EPREFIX/bin] + --sbindir=DIR system admin executables [EPREFIX/sbin] + --libexecdir=DIR program executables [EPREFIX/libexec] + --sysconfdir=DIR read-only single-machine data [PREFIX/etc] + --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com] + --localstatedir=DIR modifiable single-machine data [PREFIX/var] + --libdir=DIR object code libraries [EPREFIX/lib] + --includedir=DIR C header files [PREFIX/include] + --oldincludedir=DIR C header files for non-gcc [/usr/include] + --datarootdir=DIR read-only arch.-independent data root [PREFIX/share] + --datadir=DIR read-only architecture-independent data [DATAROOTDIR] + --infodir=DIR info documentation [DATAROOTDIR/info] + --localedir=DIR locale-dependent data [DATAROOTDIR/locale] + --mandir=DIR man documentation [DATAROOTDIR/man] + --docdir=DIR documentation root @<:@DATAROOTDIR/doc/zookeeper@:>@ + --htmldir=DIR html documentation [DOCDIR] + --dvidir=DIR dvi documentation [DOCDIR] + --pdfdir=DIR pdf documentation [DOCDIR] + --psdir=DIR ps documentation [DOCDIR] +_ACEOF + + cat <<\_ACEOF + +Program names: + --program-prefix=PREFIX prepend PREFIX to installed program names + --program-suffix=SUFFIX append SUFFIX to installed program names + --program-transform-name=PROGRAM run sed PROGRAM on installed program names + +System types: + --build=BUILD configure for building on BUILD [guessed] + --host=HOST cross-compile to build programs to run on HOST [BUILD] +_ACEOF +fi + +if test -n "$ac_init_help"; then + case $ac_init_help in + short | recursive ) echo "Configuration of zookeeper C client 3.4.5:";; + esac + cat <<\_ACEOF + +Optional Features: + --disable-option-checking ignore unrecognized --enable/--with options + --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) + --enable-FEATURE[=ARG] include FEATURE [ARG=yes] + --disable-doxygen-doc don't generate any doxygen documentation + --disable-doxygen-dot don't generate graphics for doxygen documentation + --enable-doxygen-man generate doxygen manual pages + --enable-doxygen-rtf generate doxygen RTF documentation + --enable-doxygen-xml generate doxygen XML documentation + --enable-doxygen-chm generate doxygen compressed HTML help documentation + --enable-doxygen-chi generate doxygen seperate compressed HTML help index + file + --disable-doxygen-html don't generate doxygen plain HTML documentation + --enable-doxygen-ps generate doxygen PostScript documentation + --enable-doxygen-pdf generate doxygen PDF documentation + --disable-dependency-tracking speeds up one-time build + --enable-dependency-tracking do not reject slow dependency extractors + --enable-shared@<:@=PKGS@:>@ build shared libraries @<:@default=yes@:>@ + --enable-static@<:@=PKGS@:>@ build static libraries @<:@default=yes@:>@ + --enable-fast-install@<:@=PKGS@:>@ + optimize for fast installation @<:@default=yes@:>@ + --disable-libtool-lock avoid locking (might break parallel builds) + --enable-debug enable debug build @<:@default=no@:>@ + +Optional Packages: + --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] + --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) + --without-cppunit do not use CPPUNIT + --with-pic@<:@=PKGS@:>@ try to use only PIC/non-PIC objects @<:@default=use + both@:>@ + --with-gnu-ld assume the C compiler uses GNU ld @<:@default=no@:>@ + --with-sysroot=DIR Search for dependent libraries within DIR + (or the compiler's sysroot if not specified). + --with-syncapi build with support for SyncAPI @<:@default=yes@:>@ + +Some influential environment variables: + DOXYGEN_PAPER_SIZE + a4wide (default), a4, letter, legal or executive + CC C compiler command + CFLAGS C compiler flags + LDFLAGS linker flags, e.g. -L if you have libraries in a + nonstandard directory + LIBS libraries to pass to the linker, e.g. -l + CPPFLAGS (Objective) C/C++ preprocessor flags, e.g. -I if + you have headers in a nonstandard directory + CXX C++ compiler command + CXXFLAGS C++ compiler flags + CPP C preprocessor + CXXCPP C++ preprocessor + +Use these variables to override the choices made by `configure' or to help +it to find libraries and programs with nonstandard names/locations. + +Report bugs to . +_ACEOF +ac_status=$? +fi + +if test "$ac_init_help" = "recursive"; then + # If there are subdirs, report their specific --help. + for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue + test -d "$ac_dir" || + { cd "$srcdir" && ac_pwd=`pwd` && srcdir=. && test -d "$ac_dir"; } || + continue + ac_builddir=. + +case "$ac_dir" in +.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; +*) + ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` + # A ".." for each directory in $ac_dir_suffix. + ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` + case $ac_top_builddir_sub in + "") ac_top_builddir_sub=. ac_top_build_prefix= ;; + *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; + esac ;; +esac +ac_abs_top_builddir=$ac_pwd +ac_abs_builddir=$ac_pwd$ac_dir_suffix +# for backward compatibility: +ac_top_builddir=$ac_top_build_prefix + +case $srcdir in + .) # We are building in place. + ac_srcdir=. + ac_top_srcdir=$ac_top_builddir_sub + ac_abs_top_srcdir=$ac_pwd ;; + [\\/]* | ?:[\\/]* ) # Absolute name. + ac_srcdir=$srcdir$ac_dir_suffix; + ac_top_srcdir=$srcdir + ac_abs_top_srcdir=$srcdir ;; + *) # Relative name. + ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix + ac_top_srcdir=$ac_top_build_prefix$srcdir + ac_abs_top_srcdir=$ac_pwd/$srcdir ;; +esac +ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix + + cd "$ac_dir" || { ac_status=$?; continue; } + # Check for guested configure. + if test -f "$ac_srcdir/configure.gnu"; then + echo && + $SHELL "$ac_srcdir/configure.gnu" --help=recursive + elif test -f "$ac_srcdir/configure"; then + echo && + $SHELL "$ac_srcdir/configure" --help=recursive + else + $as_echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2 + fi || ac_status=$? + cd "$ac_pwd" || { ac_status=$?; break; } + done +fi + +test -n "$ac_init_help" && exit $ac_status +if $ac_init_version; then + cat <<\_ACEOF +zookeeper C client configure 3.4.5 +generated by GNU Autoconf 2.69 + +Copyright (C) 2012 Free Software Foundation, Inc. +This configure script is free software; the Free Software Foundation +gives unlimited permission to copy, distribute and modify it. +_ACEOF + exit +fi + +## ------------------------ ## +## Autoconf initialization. ## +## ------------------------ ## + +@%:@ ac_fn_c_try_compile LINENO +@%:@ -------------------------- +@%:@ Try to compile conftest.@S|@ac_ext, and return whether this succeeded. +ac_fn_c_try_compile () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + rm -f conftest.$ac_objext + if { { ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_compile") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + grep -v '^ *+' conftest.err >conftest.er1 + cat conftest.er1 >&5 + mv -f conftest.er1 conftest.err + fi + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then : + ac_retval=0 +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_retval=1 +fi + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + as_fn_set_status $ac_retval + +} @%:@ ac_fn_c_try_compile + +@%:@ ac_fn_cxx_try_compile LINENO +@%:@ ---------------------------- +@%:@ Try to compile conftest.@S|@ac_ext, and return whether this succeeded. +ac_fn_cxx_try_compile () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + rm -f conftest.$ac_objext + if { { ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_compile") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + grep -v '^ *+' conftest.err >conftest.er1 + cat conftest.er1 >&5 + mv -f conftest.er1 conftest.err + fi + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then : + ac_retval=0 +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_retval=1 +fi + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + as_fn_set_status $ac_retval + +} @%:@ ac_fn_cxx_try_compile + +@%:@ ac_fn_c_try_link LINENO +@%:@ ----------------------- +@%:@ Try to link conftest.@S|@ac_ext, and return whether this succeeded. +ac_fn_c_try_link () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + rm -f conftest.$ac_objext conftest$ac_exeext + if { { ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_link") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + grep -v '^ *+' conftest.err >conftest.er1 + cat conftest.er1 >&5 + mv -f conftest.er1 conftest.err + fi + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && { + test "$cross_compiling" = yes || + test -x conftest$ac_exeext + }; then : + ac_retval=0 +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_retval=1 +fi + # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information + # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would + # interfere with the next link command; also delete a directory that is + # left behind by Apple's compiler. We do this before executing the actions. + rm -rf conftest.dSYM conftest_ipa8_conftest.oo + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + as_fn_set_status $ac_retval + +} @%:@ ac_fn_c_try_link + +@%:@ ac_fn_c_check_header_compile LINENO HEADER VAR INCLUDES +@%:@ ------------------------------------------------------- +@%:@ Tests whether HEADER exists and can be compiled using the include files in +@%:@ INCLUDES, setting the cache variable VAR accordingly. +ac_fn_c_check_header_compile () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 +$as_echo_n "checking for $2... " >&6; } +if eval \${$3+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$4 +@%:@include <$2> +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + eval "$3=yes" +else + eval "$3=no" +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +eval ac_res=\$$3 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + +} @%:@ ac_fn_c_check_header_compile + +@%:@ ac_fn_c_try_cpp LINENO +@%:@ ---------------------- +@%:@ Try to preprocess conftest.@S|@ac_ext, and return whether this succeeded. +ac_fn_c_try_cpp () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + if { { ac_try="$ac_cpp conftest.$ac_ext" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + grep -v '^ *+' conftest.err >conftest.er1 + cat conftest.er1 >&5 + mv -f conftest.er1 conftest.err + fi + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } > conftest.i && { + test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || + test ! -s conftest.err + }; then : + ac_retval=0 +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_retval=1 +fi + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + as_fn_set_status $ac_retval + +} @%:@ ac_fn_c_try_cpp + +@%:@ ac_fn_c_try_run LINENO +@%:@ ---------------------- +@%:@ Try to link conftest.@S|@ac_ext, and return whether this succeeded. Assumes +@%:@ that executables *can* be run. +ac_fn_c_try_run () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + if { { ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_link") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && { ac_try='./conftest$ac_exeext' + { { case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; }; then : + ac_retval=0 +else + $as_echo "$as_me: program exited with status $ac_status" >&5 + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_retval=$ac_status +fi + rm -rf conftest.dSYM conftest_ipa8_conftest.oo + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + as_fn_set_status $ac_retval + +} @%:@ ac_fn_c_try_run + +@%:@ ac_fn_c_check_func LINENO FUNC VAR +@%:@ ---------------------------------- +@%:@ Tests whether FUNC exists, setting the cache variable VAR accordingly +ac_fn_c_check_func () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 +$as_echo_n "checking for $2... " >&6; } +if eval \${$3+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +/* Define $2 to an innocuous variant, in case declares $2. + For example, HP-UX 11i declares gettimeofday. */ +#define $2 innocuous_$2 + +/* System header to define __stub macros and hopefully few prototypes, + which can conflict with char $2 (); below. + Prefer to if __STDC__ is defined, since + exists even on freestanding compilers. */ + +#ifdef __STDC__ +# include +#else +# include +#endif + +#undef $2 + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char $2 (); +/* The GNU C library defines this for functions which it implements + to always fail with ENOSYS. Some functions are actually named + something starting with __ and the normal name is an alias. */ +#if defined __stub_$2 || defined __stub___$2 +choke me +#endif + +int +main () +{ +return $2 (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + eval "$3=yes" +else + eval "$3=no" +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +fi +eval ac_res=\$$3 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + +} @%:@ ac_fn_c_check_func + +@%:@ ac_fn_cxx_try_cpp LINENO +@%:@ ------------------------ +@%:@ Try to preprocess conftest.@S|@ac_ext, and return whether this succeeded. +ac_fn_cxx_try_cpp () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + if { { ac_try="$ac_cpp conftest.$ac_ext" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + grep -v '^ *+' conftest.err >conftest.er1 + cat conftest.er1 >&5 + mv -f conftest.er1 conftest.err + fi + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } > conftest.i && { + test -z "$ac_cxx_preproc_warn_flag$ac_cxx_werror_flag" || + test ! -s conftest.err + }; then : + ac_retval=0 +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_retval=1 +fi + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + as_fn_set_status $ac_retval + +} @%:@ ac_fn_cxx_try_cpp + +@%:@ ac_fn_cxx_try_link LINENO +@%:@ ------------------------- +@%:@ Try to link conftest.@S|@ac_ext, and return whether this succeeded. +ac_fn_cxx_try_link () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + rm -f conftest.$ac_objext conftest$ac_exeext + if { { ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_link") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + grep -v '^ *+' conftest.err >conftest.er1 + cat conftest.er1 >&5 + mv -f conftest.er1 conftest.err + fi + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && { + test "$cross_compiling" = yes || + test -x conftest$ac_exeext + }; then : + ac_retval=0 +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_retval=1 +fi + # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information + # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would + # interfere with the next link command; also delete a directory that is + # left behind by Apple's compiler. We do this before executing the actions. + rm -rf conftest.dSYM conftest_ipa8_conftest.oo + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + as_fn_set_status $ac_retval + +} @%:@ ac_fn_cxx_try_link + +@%:@ ac_fn_c_check_header_mongrel LINENO HEADER VAR INCLUDES +@%:@ ------------------------------------------------------- +@%:@ Tests whether HEADER exists, giving a warning if it cannot be compiled using +@%:@ the include files in INCLUDES and setting the cache variable VAR +@%:@ accordingly. +ac_fn_c_check_header_mongrel () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + if eval \${$3+:} false; then : + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 +$as_echo_n "checking for $2... " >&6; } +if eval \${$3+:} false; then : + $as_echo_n "(cached) " >&6 +fi +eval ac_res=\$$3 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } +else + # Is the header compilable? +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 usability" >&5 +$as_echo_n "checking $2 usability... " >&6; } +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$4 +@%:@include <$2> +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_header_compiler=yes +else + ac_header_compiler=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_compiler" >&5 +$as_echo "$ac_header_compiler" >&6; } + +# Is the header present? +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 presence" >&5 +$as_echo_n "checking $2 presence... " >&6; } +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +@%:@include <$2> +_ACEOF +if ac_fn_c_try_cpp "$LINENO"; then : + ac_header_preproc=yes +else + ac_header_preproc=no +fi +rm -f conftest.err conftest.i conftest.$ac_ext +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_preproc" >&5 +$as_echo "$ac_header_preproc" >&6; } + +# So? What about this header? +case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in #(( + yes:no: ) + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&5 +$as_echo "$as_me: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 +$as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} + ;; + no:yes:* ) + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: present but cannot be compiled" >&5 +$as_echo "$as_me: WARNING: $2: present but cannot be compiled" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: check for missing prerequisite headers?" >&5 +$as_echo "$as_me: WARNING: $2: check for missing prerequisite headers?" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: see the Autoconf documentation" >&5 +$as_echo "$as_me: WARNING: $2: see the Autoconf documentation" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&5 +$as_echo "$as_me: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 +$as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} +( $as_echo "## ---------------------------------------- ## +## Report this to user@zookeeper.apache.org ## +## ---------------------------------------- ##" + ) | sed "s/^/$as_me: WARNING: /" >&2 + ;; +esac + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 +$as_echo_n "checking for $2... " >&6; } +if eval \${$3+:} false; then : + $as_echo_n "(cached) " >&6 +else + eval "$3=\$ac_header_compiler" +fi +eval ac_res=\$$3 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } +fi + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + +} @%:@ ac_fn_c_check_header_mongrel + +@%:@ ac_fn_c_check_type LINENO TYPE VAR INCLUDES +@%:@ ------------------------------------------- +@%:@ Tests whether TYPE exists after having included INCLUDES, setting cache +@%:@ variable VAR accordingly. +ac_fn_c_check_type () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 +$as_echo_n "checking for $2... " >&6; } +if eval \${$3+:} false; then : + $as_echo_n "(cached) " >&6 +else + eval "$3=no" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$4 +int +main () +{ +if (sizeof ($2)) + return 0; + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$4 +int +main () +{ +if (sizeof (($2))) + return 0; + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + +else + eval "$3=yes" +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +eval ac_res=\$$3 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + +} @%:@ ac_fn_c_check_type +cat >config.log <<_ACEOF +This file contains any messages produced by compilers while +running configure, to aid debugging if configure makes a mistake. + +It was created by zookeeper C client $as_me 3.4.5, which was +generated by GNU Autoconf 2.69. Invocation command line was + + $ $0 $@ + +_ACEOF +exec 5>>config.log +{ +cat <<_ASUNAME +## --------- ## +## Platform. ## +## --------- ## + +hostname = `(hostname || uname -n) 2>/dev/null | sed 1q` +uname -m = `(uname -m) 2>/dev/null || echo unknown` +uname -r = `(uname -r) 2>/dev/null || echo unknown` +uname -s = `(uname -s) 2>/dev/null || echo unknown` +uname -v = `(uname -v) 2>/dev/null || echo unknown` + +/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown` +/bin/uname -X = `(/bin/uname -X) 2>/dev/null || echo unknown` + +/bin/arch = `(/bin/arch) 2>/dev/null || echo unknown` +/usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null || echo unknown` +/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown` +/usr/bin/hostinfo = `(/usr/bin/hostinfo) 2>/dev/null || echo unknown` +/bin/machine = `(/bin/machine) 2>/dev/null || echo unknown` +/usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null || echo unknown` +/bin/universe = `(/bin/universe) 2>/dev/null || echo unknown` + +_ASUNAME + +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + $as_echo "PATH: $as_dir" + done +IFS=$as_save_IFS + +} >&5 + +cat >&5 <<_ACEOF + + +## ----------- ## +## Core tests. ## +## ----------- ## + +_ACEOF + + +# Keep a trace of the command line. +# Strip out --no-create and --no-recursion so they do not pile up. +# Strip out --silent because we don't want to record it for future runs. +# Also quote any args containing shell meta-characters. +# Make two passes to allow for proper duplicate-argument suppression. +ac_configure_args= +ac_configure_args0= +ac_configure_args1= +ac_must_keep_next=false +for ac_pass in 1 2 +do + for ac_arg + do + case $ac_arg in + -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;; + -q | -quiet | --quiet | --quie | --qui | --qu | --q \ + | -silent | --silent | --silen | --sile | --sil) + continue ;; + *\'*) + ac_arg=`$as_echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; + esac + case $ac_pass in + 1) as_fn_append ac_configure_args0 " '$ac_arg'" ;; + 2) + as_fn_append ac_configure_args1 " '$ac_arg'" + if test $ac_must_keep_next = true; then + ac_must_keep_next=false # Got value, back to normal. + else + case $ac_arg in + *=* | --config-cache | -C | -disable-* | --disable-* \ + | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \ + | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \ + | -with-* | --with-* | -without-* | --without-* | --x) + case "$ac_configure_args0 " in + "$ac_configure_args1"*" '$ac_arg' "* ) continue ;; + esac + ;; + -* ) ac_must_keep_next=true ;; + esac + fi + as_fn_append ac_configure_args " '$ac_arg'" + ;; + esac + done +done +{ ac_configure_args0=; unset ac_configure_args0;} +{ ac_configure_args1=; unset ac_configure_args1;} + +# When interrupted or exit'd, cleanup temporary files, and complete +# config.log. We remove comments because anyway the quotes in there +# would cause problems or look ugly. +# WARNING: Use '\'' to represent an apostrophe within the trap. +# WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug. +trap 'exit_status=$? + # Save into config.log some information that might help in debugging. + { + echo + + $as_echo "## ---------------- ## +## Cache variables. ## +## ---------------- ##" + echo + # The following way of writing the cache mishandles newlines in values, +( + for ac_var in `(set) 2>&1 | sed -n '\''s/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'\''`; do + eval ac_val=\$$ac_var + case $ac_val in #( + *${as_nl}*) + case $ac_var in #( + *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 +$as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; + esac + case $ac_var in #( + _ | IFS | as_nl) ;; #( + BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( + *) { eval $ac_var=; unset $ac_var;} ;; + esac ;; + esac + done + (set) 2>&1 | + case $as_nl`(ac_space='\'' '\''; set) 2>&1` in #( + *${as_nl}ac_space=\ *) + sed -n \ + "s/'\''/'\''\\\\'\'''\''/g; + s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\''\\2'\''/p" + ;; #( + *) + sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" + ;; + esac | + sort +) + echo + + $as_echo "## ----------------- ## +## Output variables. ## +## ----------------- ##" + echo + for ac_var in $ac_subst_vars + do + eval ac_val=\$$ac_var + case $ac_val in + *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; + esac + $as_echo "$ac_var='\''$ac_val'\''" + done | sort + echo + + if test -n "$ac_subst_files"; then + $as_echo "## ------------------- ## +## File substitutions. ## +## ------------------- ##" + echo + for ac_var in $ac_subst_files + do + eval ac_val=\$$ac_var + case $ac_val in + *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; + esac + $as_echo "$ac_var='\''$ac_val'\''" + done | sort + echo + fi + + if test -s confdefs.h; then + $as_echo "## ----------- ## +## confdefs.h. ## +## ----------- ##" + echo + cat confdefs.h + echo + fi + test "$ac_signal" != 0 && + $as_echo "$as_me: caught signal $ac_signal" + $as_echo "$as_me: exit $exit_status" + } >&5 + rm -f core *.core core.conftest.* && + rm -f -r conftest* confdefs* conf$$* $ac_clean_files && + exit $exit_status +' 0 +for ac_signal in 1 2 13 15; do + trap 'ac_signal='$ac_signal'; as_fn_exit 1' $ac_signal +done +ac_signal=0 + +# confdefs.h avoids OS command line length limits that DEFS can exceed. +rm -f -r conftest* confdefs.h + +$as_echo "/* confdefs.h */" > confdefs.h + +# Predefined preprocessor variables. + +cat >>confdefs.h <<_ACEOF +@%:@define PACKAGE_NAME "$PACKAGE_NAME" +_ACEOF + +cat >>confdefs.h <<_ACEOF +@%:@define PACKAGE_TARNAME "$PACKAGE_TARNAME" +_ACEOF + +cat >>confdefs.h <<_ACEOF +@%:@define PACKAGE_VERSION "$PACKAGE_VERSION" +_ACEOF + +cat >>confdefs.h <<_ACEOF +@%:@define PACKAGE_STRING "$PACKAGE_STRING" +_ACEOF + +cat >>confdefs.h <<_ACEOF +@%:@define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT" +_ACEOF + +cat >>confdefs.h <<_ACEOF +@%:@define PACKAGE_URL "$PACKAGE_URL" +_ACEOF + + +# Let the site file select an alternate cache file if it wants to. +# Prefer an explicitly selected file to automatically selected ones. +ac_site_file1=NONE +ac_site_file2=NONE +if test -n "$CONFIG_SITE"; then + # We do not want a PATH search for config.site. + case $CONFIG_SITE in @%:@(( + -*) ac_site_file1=./$CONFIG_SITE;; + */*) ac_site_file1=$CONFIG_SITE;; + *) ac_site_file1=./$CONFIG_SITE;; + esac +elif test "x$prefix" != xNONE; then + ac_site_file1=$prefix/share/config.site + ac_site_file2=$prefix/etc/config.site +else + ac_site_file1=$ac_default_prefix/share/config.site + ac_site_file2=$ac_default_prefix/etc/config.site +fi +for ac_site_file in "$ac_site_file1" "$ac_site_file2" +do + test "x$ac_site_file" = xNONE && continue + if test /dev/null != "$ac_site_file" && test -r "$ac_site_file"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: loading site script $ac_site_file" >&5 +$as_echo "$as_me: loading site script $ac_site_file" >&6;} + sed 's/^/| /' "$ac_site_file" >&5 + . "$ac_site_file" \ + || { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "failed to load site script $ac_site_file +See \`config.log' for more details" "$LINENO" 5; } + fi +done + +if test -r "$cache_file"; then + # Some versions of bash will fail to source /dev/null (special files + # actually), so we avoid doing that. DJGPP emulates it as a regular file. + if test /dev/null != "$cache_file" && test -f "$cache_file"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: loading cache $cache_file" >&5 +$as_echo "$as_me: loading cache $cache_file" >&6;} + case $cache_file in + [\\/]* | ?:[\\/]* ) . "$cache_file";; + *) . "./$cache_file";; + esac + fi +else + { $as_echo "$as_me:${as_lineno-$LINENO}: creating cache $cache_file" >&5 +$as_echo "$as_me: creating cache $cache_file" >&6;} + >$cache_file +fi + +# Check that the precious variables saved in the cache have kept the same +# value. +ac_cache_corrupted=false +for ac_var in $ac_precious_vars; do + eval ac_old_set=\$ac_cv_env_${ac_var}_set + eval ac_new_set=\$ac_env_${ac_var}_set + eval ac_old_val=\$ac_cv_env_${ac_var}_value + eval ac_new_val=\$ac_env_${ac_var}_value + case $ac_old_set,$ac_new_set in + set,) + { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5 +$as_echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;} + ac_cache_corrupted=: ;; + ,set) + { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was not set in the previous run" >&5 +$as_echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;} + ac_cache_corrupted=: ;; + ,);; + *) + if test "x$ac_old_val" != "x$ac_new_val"; then + # differences in whitespace do not lead to failure. + ac_old_val_w=`echo x $ac_old_val` + ac_new_val_w=`echo x $ac_new_val` + if test "$ac_old_val_w" != "$ac_new_val_w"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' has changed since the previous run:" >&5 +$as_echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;} + ac_cache_corrupted=: + else + { $as_echo "$as_me:${as_lineno-$LINENO}: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&5 +$as_echo "$as_me: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&2;} + eval $ac_var=\$ac_old_val + fi + { $as_echo "$as_me:${as_lineno-$LINENO}: former value: \`$ac_old_val'" >&5 +$as_echo "$as_me: former value: \`$ac_old_val'" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: current value: \`$ac_new_val'" >&5 +$as_echo "$as_me: current value: \`$ac_new_val'" >&2;} + fi;; + esac + # Pass precious variables to config.status. + if test "$ac_new_set" = set; then + case $ac_new_val in + *\'*) ac_arg=$ac_var=`$as_echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;; + *) ac_arg=$ac_var=$ac_new_val ;; + esac + case " $ac_configure_args " in + *" '$ac_arg' "*) ;; # Avoid dups. Use of quotes ensures accuracy. + *) as_fn_append ac_configure_args " '$ac_arg'" ;; + esac + fi +done +if $ac_cache_corrupted; then + { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build" >&5 +$as_echo "$as_me: error: changes in the environment can compromise the build" >&2;} + as_fn_error $? "run \`make distclean' and/or \`rm $cache_file' and start over" "$LINENO" 5 +fi +## -------------------- ## +## Main body of script. ## +## -------------------- ## + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + + + +# Save initial CFLAGS and CXXFLAGS values before AC_PROG_CC and AC_PROG_CXX +init_cflags="$CFLAGS" +init_cxxflags="$CXXFLAGS" + +# initialize Doxygen support + + + + + + + + + + +# Files: +DX_PROJECT=zookeeper + +DX_CONFIG=c-doc.Doxyfile + +DX_DOCDIR=docs + + +# Environment variables used inside doxygen.cfg: +DX_ENV="$DX_ENV SRCDIR='$srcdir'" + +DX_ENV="$DX_ENV PROJECT='$DX_PROJECT'" + +DX_ENV="$DX_ENV DOCDIR='$DX_DOCDIR'" + +DX_ENV="$DX_ENV VERSION='$PACKAGE_VERSION'" + + +# Doxygen itself: + + + + @%:@ Check whether --enable-doxygen-doc was given. +if test "${enable_doxygen_doc+set}" = set; then : + enableval=$enable_doxygen_doc; +case "$enableval" in +#( +y|Y|yes|Yes|YES) + DX_FLAG_doc=1 + + +;; #( +n|N|no|No|NO) + DX_FLAG_doc=0 + +;; #( +*) + as_fn_error $? "invalid value '$enableval' given to doxygen-doc" "$LINENO" 5 +;; +esac + +else + +DX_FLAG_doc=1 + + + +fi + +if test "$DX_FLAG_doc" = 1; then + +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}doxygen", so it can be a program name with args. +set dummy ${ac_tool_prefix}doxygen; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_path_DX_DOXYGEN+:} false; then : + $as_echo_n "(cached) " >&6 +else + case $DX_DOXYGEN in + [\\/]* | ?:[\\/]*) + ac_cv_path_DX_DOXYGEN="$DX_DOXYGEN" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_path_DX_DOXYGEN="$as_dir/$ac_word$ac_exec_ext" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + ;; +esac +fi +DX_DOXYGEN=$ac_cv_path_DX_DOXYGEN +if test -n "$DX_DOXYGEN"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DX_DOXYGEN" >&5 +$as_echo "$DX_DOXYGEN" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_path_DX_DOXYGEN"; then + ac_pt_DX_DOXYGEN=$DX_DOXYGEN + # Extract the first word of "doxygen", so it can be a program name with args. +set dummy doxygen; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_path_ac_pt_DX_DOXYGEN+:} false; then : + $as_echo_n "(cached) " >&6 +else + case $ac_pt_DX_DOXYGEN in + [\\/]* | ?:[\\/]*) + ac_cv_path_ac_pt_DX_DOXYGEN="$ac_pt_DX_DOXYGEN" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_path_ac_pt_DX_DOXYGEN="$as_dir/$ac_word$ac_exec_ext" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + ;; +esac +fi +ac_pt_DX_DOXYGEN=$ac_cv_path_ac_pt_DX_DOXYGEN +if test -n "$ac_pt_DX_DOXYGEN"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_pt_DX_DOXYGEN" >&5 +$as_echo "$ac_pt_DX_DOXYGEN" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_pt_DX_DOXYGEN" = x; then + DX_DOXYGEN="" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + DX_DOXYGEN=$ac_pt_DX_DOXYGEN + fi +else + DX_DOXYGEN="$ac_cv_path_DX_DOXYGEN" +fi + +if test "$DX_FLAG_$DX_CURRENT_FEATURE$DX_DOXYGEN" = 1; then + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: doxygen not found - will not generate any doxygen documentation" >&5 +$as_echo "$as_me: WARNING: doxygen not found - will not generate any doxygen documentation" >&2;} + DX_FLAG_doc=0 + +fi + + +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}perl", so it can be a program name with args. +set dummy ${ac_tool_prefix}perl; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_path_DX_PERL+:} false; then : + $as_echo_n "(cached) " >&6 +else + case $DX_PERL in + [\\/]* | ?:[\\/]*) + ac_cv_path_DX_PERL="$DX_PERL" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_path_DX_PERL="$as_dir/$ac_word$ac_exec_ext" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + ;; +esac +fi +DX_PERL=$ac_cv_path_DX_PERL +if test -n "$DX_PERL"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DX_PERL" >&5 +$as_echo "$DX_PERL" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_path_DX_PERL"; then + ac_pt_DX_PERL=$DX_PERL + # Extract the first word of "perl", so it can be a program name with args. +set dummy perl; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_path_ac_pt_DX_PERL+:} false; then : + $as_echo_n "(cached) " >&6 +else + case $ac_pt_DX_PERL in + [\\/]* | ?:[\\/]*) + ac_cv_path_ac_pt_DX_PERL="$ac_pt_DX_PERL" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_path_ac_pt_DX_PERL="$as_dir/$ac_word$ac_exec_ext" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + ;; +esac +fi +ac_pt_DX_PERL=$ac_cv_path_ac_pt_DX_PERL +if test -n "$ac_pt_DX_PERL"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_pt_DX_PERL" >&5 +$as_echo "$ac_pt_DX_PERL" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_pt_DX_PERL" = x; then + DX_PERL="" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + DX_PERL=$ac_pt_DX_PERL + fi +else + DX_PERL="$ac_cv_path_DX_PERL" +fi + +if test "$DX_FLAG_$DX_CURRENT_FEATURE$DX_PERL" = 1; then + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: perl not found - will not generate any doxygen documentation" >&5 +$as_echo "$as_me: WARNING: perl not found - will not generate any doxygen documentation" >&2;} + DX_FLAG_doc=0 + +fi + + : +fi +if test "$DX_FLAG_doc" = 1; then + if :; then + DX_COND_doc_TRUE= + DX_COND_doc_FALSE='#' +else + DX_COND_doc_TRUE='#' + DX_COND_doc_FALSE= +fi + + DX_ENV="$DX_ENV PERL_PATH='$DX_PERL'" + + : +else + if false; then + DX_COND_doc_TRUE= + DX_COND_doc_FALSE='#' +else + DX_COND_doc_TRUE='#' + DX_COND_doc_FALSE= +fi + + + : +fi + + +# Dot for graphics: + + + + @%:@ Check whether --enable-doxygen-dot was given. +if test "${enable_doxygen_dot+set}" = set; then : + enableval=$enable_doxygen_dot; +case "$enableval" in +#( +y|Y|yes|Yes|YES) + DX_FLAG_dot=1 + + +test "$DX_FLAG_doc" = "1" \ +|| as_fn_error $? "doxygen-dot requires doxygen-dot" "$LINENO" 5 + +;; #( +n|N|no|No|NO) + DX_FLAG_dot=0 + +;; #( +*) + as_fn_error $? "invalid value '$enableval' given to doxygen-dot" "$LINENO" 5 +;; +esac + +else + +DX_FLAG_dot=1 + + +test "$DX_FLAG_doc" = "1" || DX_FLAG_dot=0 + + + +fi + +if test "$DX_FLAG_dot" = 1; then + +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}dot", so it can be a program name with args. +set dummy ${ac_tool_prefix}dot; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_path_DX_DOT+:} false; then : + $as_echo_n "(cached) " >&6 +else + case $DX_DOT in + [\\/]* | ?:[\\/]*) + ac_cv_path_DX_DOT="$DX_DOT" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_path_DX_DOT="$as_dir/$ac_word$ac_exec_ext" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + ;; +esac +fi +DX_DOT=$ac_cv_path_DX_DOT +if test -n "$DX_DOT"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DX_DOT" >&5 +$as_echo "$DX_DOT" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_path_DX_DOT"; then + ac_pt_DX_DOT=$DX_DOT + # Extract the first word of "dot", so it can be a program name with args. +set dummy dot; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_path_ac_pt_DX_DOT+:} false; then : + $as_echo_n "(cached) " >&6 +else + case $ac_pt_DX_DOT in + [\\/]* | ?:[\\/]*) + ac_cv_path_ac_pt_DX_DOT="$ac_pt_DX_DOT" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_path_ac_pt_DX_DOT="$as_dir/$ac_word$ac_exec_ext" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + ;; +esac +fi +ac_pt_DX_DOT=$ac_cv_path_ac_pt_DX_DOT +if test -n "$ac_pt_DX_DOT"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_pt_DX_DOT" >&5 +$as_echo "$ac_pt_DX_DOT" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_pt_DX_DOT" = x; then + DX_DOT="" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + DX_DOT=$ac_pt_DX_DOT + fi +else + DX_DOT="$ac_cv_path_DX_DOT" +fi + +if test "$DX_FLAG_$DX_CURRENT_FEATURE$DX_DOT" = 1; then + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: dot not found - will not generate graphics for doxygen documentation" >&5 +$as_echo "$as_me: WARNING: dot not found - will not generate graphics for doxygen documentation" >&2;} + DX_FLAG_dot=0 + +fi + + : +fi +if test "$DX_FLAG_dot" = 1; then + if :; then + DX_COND_dot_TRUE= + DX_COND_dot_FALSE='#' +else + DX_COND_dot_TRUE='#' + DX_COND_dot_FALSE= +fi + + DX_ENV="$DX_ENV HAVE_DOT='YES'" + + DX_ENV="$DX_ENV DOT_PATH='`expr ".$DX_DOT" : '\(\.\)[^/]*$' \| "x$DX_DOT" : 'x\(.*\)/[^/]*$'`'" + + : +else + if false; then + DX_COND_dot_TRUE= + DX_COND_dot_FALSE='#' +else + DX_COND_dot_TRUE='#' + DX_COND_dot_FALSE= +fi + + DX_ENV="$DX_ENV HAVE_DOT='NO'" + + : +fi + + +# Man pages generation: + + + + @%:@ Check whether --enable-doxygen-man was given. +if test "${enable_doxygen_man+set}" = set; then : + enableval=$enable_doxygen_man; +case "$enableval" in +#( +y|Y|yes|Yes|YES) + DX_FLAG_man=1 + + +test "$DX_FLAG_doc" = "1" \ +|| as_fn_error $? "doxygen-man requires doxygen-man" "$LINENO" 5 + +;; #( +n|N|no|No|NO) + DX_FLAG_man=0 + +;; #( +*) + as_fn_error $? "invalid value '$enableval' given to doxygen-man" "$LINENO" 5 +;; +esac + +else + +DX_FLAG_man=0 + + +test "$DX_FLAG_doc" = "1" || DX_FLAG_man=0 + + + +fi + +if test "$DX_FLAG_man" = 1; then + + : +fi +if test "$DX_FLAG_man" = 1; then + if :; then + DX_COND_man_TRUE= + DX_COND_man_FALSE='#' +else + DX_COND_man_TRUE='#' + DX_COND_man_FALSE= +fi + + DX_ENV="$DX_ENV GENERATE_MAN='YES'" + + : +else + if false; then + DX_COND_man_TRUE= + DX_COND_man_FALSE='#' +else + DX_COND_man_TRUE='#' + DX_COND_man_FALSE= +fi + + DX_ENV="$DX_ENV GENERATE_MAN='NO'" + + : +fi + + +# RTF file generation: + + + + @%:@ Check whether --enable-doxygen-rtf was given. +if test "${enable_doxygen_rtf+set}" = set; then : + enableval=$enable_doxygen_rtf; +case "$enableval" in +#( +y|Y|yes|Yes|YES) + DX_FLAG_rtf=1 + + +test "$DX_FLAG_doc" = "1" \ +|| as_fn_error $? "doxygen-rtf requires doxygen-rtf" "$LINENO" 5 + +;; #( +n|N|no|No|NO) + DX_FLAG_rtf=0 + +;; #( +*) + as_fn_error $? "invalid value '$enableval' given to doxygen-rtf" "$LINENO" 5 +;; +esac + +else + +DX_FLAG_rtf=0 + + +test "$DX_FLAG_doc" = "1" || DX_FLAG_rtf=0 + + + +fi + +if test "$DX_FLAG_rtf" = 1; then + + : +fi +if test "$DX_FLAG_rtf" = 1; then + if :; then + DX_COND_rtf_TRUE= + DX_COND_rtf_FALSE='#' +else + DX_COND_rtf_TRUE='#' + DX_COND_rtf_FALSE= +fi + + DX_ENV="$DX_ENV GENERATE_RTF='YES'" + + : +else + if false; then + DX_COND_rtf_TRUE= + DX_COND_rtf_FALSE='#' +else + DX_COND_rtf_TRUE='#' + DX_COND_rtf_FALSE= +fi + + DX_ENV="$DX_ENV GENERATE_RTF='NO'" + + : +fi + + +# XML file generation: + + + + @%:@ Check whether --enable-doxygen-xml was given. +if test "${enable_doxygen_xml+set}" = set; then : + enableval=$enable_doxygen_xml; +case "$enableval" in +#( +y|Y|yes|Yes|YES) + DX_FLAG_xml=1 + + +test "$DX_FLAG_doc" = "1" \ +|| as_fn_error $? "doxygen-xml requires doxygen-xml" "$LINENO" 5 + +;; #( +n|N|no|No|NO) + DX_FLAG_xml=0 + +;; #( +*) + as_fn_error $? "invalid value '$enableval' given to doxygen-xml" "$LINENO" 5 +;; +esac + +else + +DX_FLAG_xml=0 + + +test "$DX_FLAG_doc" = "1" || DX_FLAG_xml=0 + + + +fi + +if test "$DX_FLAG_xml" = 1; then + + : +fi +if test "$DX_FLAG_xml" = 1; then + if :; then + DX_COND_xml_TRUE= + DX_COND_xml_FALSE='#' +else + DX_COND_xml_TRUE='#' + DX_COND_xml_FALSE= +fi + + DX_ENV="$DX_ENV GENERATE_XML='YES'" + + : +else + if false; then + DX_COND_xml_TRUE= + DX_COND_xml_FALSE='#' +else + DX_COND_xml_TRUE='#' + DX_COND_xml_FALSE= +fi + + DX_ENV="$DX_ENV GENERATE_XML='NO'" + + : +fi + + +# (Compressed) HTML help generation: + + + + @%:@ Check whether --enable-doxygen-chm was given. +if test "${enable_doxygen_chm+set}" = set; then : + enableval=$enable_doxygen_chm; +case "$enableval" in +#( +y|Y|yes|Yes|YES) + DX_FLAG_chm=1 + + +test "$DX_FLAG_doc" = "1" \ +|| as_fn_error $? "doxygen-chm requires doxygen-chm" "$LINENO" 5 + +;; #( +n|N|no|No|NO) + DX_FLAG_chm=0 + +;; #( +*) + as_fn_error $? "invalid value '$enableval' given to doxygen-chm" "$LINENO" 5 +;; +esac + +else + +DX_FLAG_chm=0 + + +test "$DX_FLAG_doc" = "1" || DX_FLAG_chm=0 + + + +fi + +if test "$DX_FLAG_chm" = 1; then + +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}hhc", so it can be a program name with args. +set dummy ${ac_tool_prefix}hhc; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_path_DX_HHC+:} false; then : + $as_echo_n "(cached) " >&6 +else + case $DX_HHC in + [\\/]* | ?:[\\/]*) + ac_cv_path_DX_HHC="$DX_HHC" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_path_DX_HHC="$as_dir/$ac_word$ac_exec_ext" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + ;; +esac +fi +DX_HHC=$ac_cv_path_DX_HHC +if test -n "$DX_HHC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DX_HHC" >&5 +$as_echo "$DX_HHC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_path_DX_HHC"; then + ac_pt_DX_HHC=$DX_HHC + # Extract the first word of "hhc", so it can be a program name with args. +set dummy hhc; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_path_ac_pt_DX_HHC+:} false; then : + $as_echo_n "(cached) " >&6 +else + case $ac_pt_DX_HHC in + [\\/]* | ?:[\\/]*) + ac_cv_path_ac_pt_DX_HHC="$ac_pt_DX_HHC" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_path_ac_pt_DX_HHC="$as_dir/$ac_word$ac_exec_ext" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + ;; +esac +fi +ac_pt_DX_HHC=$ac_cv_path_ac_pt_DX_HHC +if test -n "$ac_pt_DX_HHC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_pt_DX_HHC" >&5 +$as_echo "$ac_pt_DX_HHC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_pt_DX_HHC" = x; then + DX_HHC="" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + DX_HHC=$ac_pt_DX_HHC + fi +else + DX_HHC="$ac_cv_path_DX_HHC" +fi + +if test "$DX_FLAG_$DX_CURRENT_FEATURE$DX_HHC" = 1; then + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: hhc not found - will not generate doxygen compressed HTML help documentation" >&5 +$as_echo "$as_me: WARNING: hhc not found - will not generate doxygen compressed HTML help documentation" >&2;} + DX_FLAG_chm=0 + +fi + + : +fi +if test "$DX_FLAG_chm" = 1; then + if :; then + DX_COND_chm_TRUE= + DX_COND_chm_FALSE='#' +else + DX_COND_chm_TRUE='#' + DX_COND_chm_FALSE= +fi + + DX_ENV="$DX_ENV HHC_PATH='$DX_HHC'" + + DX_ENV="$DX_ENV GENERATE_HTML='YES'" + + DX_ENV="$DX_ENV GENERATE_HTMLHELP='YES'" + + : +else + if false; then + DX_COND_chm_TRUE= + DX_COND_chm_FALSE='#' +else + DX_COND_chm_TRUE='#' + DX_COND_chm_FALSE= +fi + + DX_ENV="$DX_ENV GENERATE_HTMLHELP='NO'" + + : +fi + + +# Seperate CHI file generation. + + + + @%:@ Check whether --enable-doxygen-chi was given. +if test "${enable_doxygen_chi+set}" = set; then : + enableval=$enable_doxygen_chi; +case "$enableval" in +#( +y|Y|yes|Yes|YES) + DX_FLAG_chi=1 + + +test "$DX_FLAG_chm" = "1" \ +|| as_fn_error $? "doxygen-chi requires doxygen-chi" "$LINENO" 5 + +;; #( +n|N|no|No|NO) + DX_FLAG_chi=0 + +;; #( +*) + as_fn_error $? "invalid value '$enableval' given to doxygen-chi" "$LINENO" 5 +;; +esac + +else + +DX_FLAG_chi=0 + + +test "$DX_FLAG_chm" = "1" || DX_FLAG_chi=0 + + + +fi + +if test "$DX_FLAG_chi" = 1; then + + : +fi +if test "$DX_FLAG_chi" = 1; then + if :; then + DX_COND_chi_TRUE= + DX_COND_chi_FALSE='#' +else + DX_COND_chi_TRUE='#' + DX_COND_chi_FALSE= +fi + + DX_ENV="$DX_ENV GENERATE_CHI='YES'" + + : +else + if false; then + DX_COND_chi_TRUE= + DX_COND_chi_FALSE='#' +else + DX_COND_chi_TRUE='#' + DX_COND_chi_FALSE= +fi + + DX_ENV="$DX_ENV GENERATE_CHI='NO'" + + : +fi + + +# Plain HTML pages generation: + + + + @%:@ Check whether --enable-doxygen-html was given. +if test "${enable_doxygen_html+set}" = set; then : + enableval=$enable_doxygen_html; +case "$enableval" in +#( +y|Y|yes|Yes|YES) + DX_FLAG_html=1 + + +test "$DX_FLAG_doc" = "1" \ +|| as_fn_error $? "doxygen-html requires doxygen-html" "$LINENO" 5 + +test "$DX_FLAG_chm" = "0" \ +|| as_fn_error $? "doxygen-html contradicts doxygen-html" "$LINENO" 5 + +;; #( +n|N|no|No|NO) + DX_FLAG_html=0 + +;; #( +*) + as_fn_error $? "invalid value '$enableval' given to doxygen-html" "$LINENO" 5 +;; +esac + +else + +DX_FLAG_html=1 + + +test "$DX_FLAG_doc" = "1" || DX_FLAG_html=0 + + +test "$DX_FLAG_chm" = "0" || DX_FLAG_html=0 + + + +fi + +if test "$DX_FLAG_html" = 1; then + + : +fi +if test "$DX_FLAG_html" = 1; then + if :; then + DX_COND_html_TRUE= + DX_COND_html_FALSE='#' +else + DX_COND_html_TRUE='#' + DX_COND_html_FALSE= +fi + + DX_ENV="$DX_ENV GENERATE_HTML='YES'" + + : +else + if false; then + DX_COND_html_TRUE= + DX_COND_html_FALSE='#' +else + DX_COND_html_TRUE='#' + DX_COND_html_FALSE= +fi + + test "$DX_FLAG_chm" = 1 || DX_ENV="$DX_ENV GENERATE_HTML='NO'" + + : +fi + + +# PostScript file generation: + + + + @%:@ Check whether --enable-doxygen-ps was given. +if test "${enable_doxygen_ps+set}" = set; then : + enableval=$enable_doxygen_ps; +case "$enableval" in +#( +y|Y|yes|Yes|YES) + DX_FLAG_ps=1 + + +test "$DX_FLAG_doc" = "1" \ +|| as_fn_error $? "doxygen-ps requires doxygen-ps" "$LINENO" 5 + +;; #( +n|N|no|No|NO) + DX_FLAG_ps=0 + +;; #( +*) + as_fn_error $? "invalid value '$enableval' given to doxygen-ps" "$LINENO" 5 +;; +esac + +else + +DX_FLAG_ps=0 + + +test "$DX_FLAG_doc" = "1" || DX_FLAG_ps=0 + + + +fi + +if test "$DX_FLAG_ps" = 1; then + +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}latex", so it can be a program name with args. +set dummy ${ac_tool_prefix}latex; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_path_DX_LATEX+:} false; then : + $as_echo_n "(cached) " >&6 +else + case $DX_LATEX in + [\\/]* | ?:[\\/]*) + ac_cv_path_DX_LATEX="$DX_LATEX" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_path_DX_LATEX="$as_dir/$ac_word$ac_exec_ext" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + ;; +esac +fi +DX_LATEX=$ac_cv_path_DX_LATEX +if test -n "$DX_LATEX"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DX_LATEX" >&5 +$as_echo "$DX_LATEX" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_path_DX_LATEX"; then + ac_pt_DX_LATEX=$DX_LATEX + # Extract the first word of "latex", so it can be a program name with args. +set dummy latex; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_path_ac_pt_DX_LATEX+:} false; then : + $as_echo_n "(cached) " >&6 +else + case $ac_pt_DX_LATEX in + [\\/]* | ?:[\\/]*) + ac_cv_path_ac_pt_DX_LATEX="$ac_pt_DX_LATEX" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_path_ac_pt_DX_LATEX="$as_dir/$ac_word$ac_exec_ext" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + ;; +esac +fi +ac_pt_DX_LATEX=$ac_cv_path_ac_pt_DX_LATEX +if test -n "$ac_pt_DX_LATEX"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_pt_DX_LATEX" >&5 +$as_echo "$ac_pt_DX_LATEX" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_pt_DX_LATEX" = x; then + DX_LATEX="" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + DX_LATEX=$ac_pt_DX_LATEX + fi +else + DX_LATEX="$ac_cv_path_DX_LATEX" +fi + +if test "$DX_FLAG_$DX_CURRENT_FEATURE$DX_LATEX" = 1; then + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: latex not found - will not generate doxygen PostScript documentation" >&5 +$as_echo "$as_me: WARNING: latex not found - will not generate doxygen PostScript documentation" >&2;} + DX_FLAG_ps=0 + +fi + + +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}makeindex", so it can be a program name with args. +set dummy ${ac_tool_prefix}makeindex; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_path_DX_MAKEINDEX+:} false; then : + $as_echo_n "(cached) " >&6 +else + case $DX_MAKEINDEX in + [\\/]* | ?:[\\/]*) + ac_cv_path_DX_MAKEINDEX="$DX_MAKEINDEX" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_path_DX_MAKEINDEX="$as_dir/$ac_word$ac_exec_ext" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + ;; +esac +fi +DX_MAKEINDEX=$ac_cv_path_DX_MAKEINDEX +if test -n "$DX_MAKEINDEX"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DX_MAKEINDEX" >&5 +$as_echo "$DX_MAKEINDEX" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_path_DX_MAKEINDEX"; then + ac_pt_DX_MAKEINDEX=$DX_MAKEINDEX + # Extract the first word of "makeindex", so it can be a program name with args. +set dummy makeindex; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_path_ac_pt_DX_MAKEINDEX+:} false; then : + $as_echo_n "(cached) " >&6 +else + case $ac_pt_DX_MAKEINDEX in + [\\/]* | ?:[\\/]*) + ac_cv_path_ac_pt_DX_MAKEINDEX="$ac_pt_DX_MAKEINDEX" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_path_ac_pt_DX_MAKEINDEX="$as_dir/$ac_word$ac_exec_ext" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + ;; +esac +fi +ac_pt_DX_MAKEINDEX=$ac_cv_path_ac_pt_DX_MAKEINDEX +if test -n "$ac_pt_DX_MAKEINDEX"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_pt_DX_MAKEINDEX" >&5 +$as_echo "$ac_pt_DX_MAKEINDEX" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_pt_DX_MAKEINDEX" = x; then + DX_MAKEINDEX="" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + DX_MAKEINDEX=$ac_pt_DX_MAKEINDEX + fi +else + DX_MAKEINDEX="$ac_cv_path_DX_MAKEINDEX" +fi + +if test "$DX_FLAG_$DX_CURRENT_FEATURE$DX_MAKEINDEX" = 1; then + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: makeindex not found - will not generate doxygen PostScript documentation" >&5 +$as_echo "$as_me: WARNING: makeindex not found - will not generate doxygen PostScript documentation" >&2;} + DX_FLAG_ps=0 + +fi + + +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}dvips", so it can be a program name with args. +set dummy ${ac_tool_prefix}dvips; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_path_DX_DVIPS+:} false; then : + $as_echo_n "(cached) " >&6 +else + case $DX_DVIPS in + [\\/]* | ?:[\\/]*) + ac_cv_path_DX_DVIPS="$DX_DVIPS" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_path_DX_DVIPS="$as_dir/$ac_word$ac_exec_ext" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + ;; +esac +fi +DX_DVIPS=$ac_cv_path_DX_DVIPS +if test -n "$DX_DVIPS"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DX_DVIPS" >&5 +$as_echo "$DX_DVIPS" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_path_DX_DVIPS"; then + ac_pt_DX_DVIPS=$DX_DVIPS + # Extract the first word of "dvips", so it can be a program name with args. +set dummy dvips; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_path_ac_pt_DX_DVIPS+:} false; then : + $as_echo_n "(cached) " >&6 +else + case $ac_pt_DX_DVIPS in + [\\/]* | ?:[\\/]*) + ac_cv_path_ac_pt_DX_DVIPS="$ac_pt_DX_DVIPS" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_path_ac_pt_DX_DVIPS="$as_dir/$ac_word$ac_exec_ext" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + ;; +esac +fi +ac_pt_DX_DVIPS=$ac_cv_path_ac_pt_DX_DVIPS +if test -n "$ac_pt_DX_DVIPS"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_pt_DX_DVIPS" >&5 +$as_echo "$ac_pt_DX_DVIPS" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_pt_DX_DVIPS" = x; then + DX_DVIPS="" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + DX_DVIPS=$ac_pt_DX_DVIPS + fi +else + DX_DVIPS="$ac_cv_path_DX_DVIPS" +fi + +if test "$DX_FLAG_$DX_CURRENT_FEATURE$DX_DVIPS" = 1; then + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: dvips not found - will not generate doxygen PostScript documentation" >&5 +$as_echo "$as_me: WARNING: dvips not found - will not generate doxygen PostScript documentation" >&2;} + DX_FLAG_ps=0 + +fi + + +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}egrep", so it can be a program name with args. +set dummy ${ac_tool_prefix}egrep; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_path_DX_EGREP+:} false; then : + $as_echo_n "(cached) " >&6 +else + case $DX_EGREP in + [\\/]* | ?:[\\/]*) + ac_cv_path_DX_EGREP="$DX_EGREP" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_path_DX_EGREP="$as_dir/$ac_word$ac_exec_ext" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + ;; +esac +fi +DX_EGREP=$ac_cv_path_DX_EGREP +if test -n "$DX_EGREP"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DX_EGREP" >&5 +$as_echo "$DX_EGREP" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_path_DX_EGREP"; then + ac_pt_DX_EGREP=$DX_EGREP + # Extract the first word of "egrep", so it can be a program name with args. +set dummy egrep; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_path_ac_pt_DX_EGREP+:} false; then : + $as_echo_n "(cached) " >&6 +else + case $ac_pt_DX_EGREP in + [\\/]* | ?:[\\/]*) + ac_cv_path_ac_pt_DX_EGREP="$ac_pt_DX_EGREP" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_path_ac_pt_DX_EGREP="$as_dir/$ac_word$ac_exec_ext" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + ;; +esac +fi +ac_pt_DX_EGREP=$ac_cv_path_ac_pt_DX_EGREP +if test -n "$ac_pt_DX_EGREP"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_pt_DX_EGREP" >&5 +$as_echo "$ac_pt_DX_EGREP" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_pt_DX_EGREP" = x; then + DX_EGREP="" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + DX_EGREP=$ac_pt_DX_EGREP + fi +else + DX_EGREP="$ac_cv_path_DX_EGREP" +fi + +if test "$DX_FLAG_$DX_CURRENT_FEATURE$DX_EGREP" = 1; then + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: egrep not found - will not generate doxygen PostScript documentation" >&5 +$as_echo "$as_me: WARNING: egrep not found - will not generate doxygen PostScript documentation" >&2;} + DX_FLAG_ps=0 + +fi + + : +fi +if test "$DX_FLAG_ps" = 1; then + if :; then + DX_COND_ps_TRUE= + DX_COND_ps_FALSE='#' +else + DX_COND_ps_TRUE='#' + DX_COND_ps_FALSE= +fi + + + : +else + if false; then + DX_COND_ps_TRUE= + DX_COND_ps_FALSE='#' +else + DX_COND_ps_TRUE='#' + DX_COND_ps_FALSE= +fi + + + : +fi + + +# PDF file generation: + + + + @%:@ Check whether --enable-doxygen-pdf was given. +if test "${enable_doxygen_pdf+set}" = set; then : + enableval=$enable_doxygen_pdf; +case "$enableval" in +#( +y|Y|yes|Yes|YES) + DX_FLAG_pdf=1 + + +test "$DX_FLAG_doc" = "1" \ +|| as_fn_error $? "doxygen-pdf requires doxygen-pdf" "$LINENO" 5 + +;; #( +n|N|no|No|NO) + DX_FLAG_pdf=0 + +;; #( +*) + as_fn_error $? "invalid value '$enableval' given to doxygen-pdf" "$LINENO" 5 +;; +esac + +else + +DX_FLAG_pdf=0 + + +test "$DX_FLAG_doc" = "1" || DX_FLAG_pdf=0 + + + +fi + +if test "$DX_FLAG_pdf" = 1; then + +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}pdflatex", so it can be a program name with args. +set dummy ${ac_tool_prefix}pdflatex; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_path_DX_PDFLATEX+:} false; then : + $as_echo_n "(cached) " >&6 +else + case $DX_PDFLATEX in + [\\/]* | ?:[\\/]*) + ac_cv_path_DX_PDFLATEX="$DX_PDFLATEX" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_path_DX_PDFLATEX="$as_dir/$ac_word$ac_exec_ext" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + ;; +esac +fi +DX_PDFLATEX=$ac_cv_path_DX_PDFLATEX +if test -n "$DX_PDFLATEX"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DX_PDFLATEX" >&5 +$as_echo "$DX_PDFLATEX" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_path_DX_PDFLATEX"; then + ac_pt_DX_PDFLATEX=$DX_PDFLATEX + # Extract the first word of "pdflatex", so it can be a program name with args. +set dummy pdflatex; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_path_ac_pt_DX_PDFLATEX+:} false; then : + $as_echo_n "(cached) " >&6 +else + case $ac_pt_DX_PDFLATEX in + [\\/]* | ?:[\\/]*) + ac_cv_path_ac_pt_DX_PDFLATEX="$ac_pt_DX_PDFLATEX" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_path_ac_pt_DX_PDFLATEX="$as_dir/$ac_word$ac_exec_ext" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + ;; +esac +fi +ac_pt_DX_PDFLATEX=$ac_cv_path_ac_pt_DX_PDFLATEX +if test -n "$ac_pt_DX_PDFLATEX"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_pt_DX_PDFLATEX" >&5 +$as_echo "$ac_pt_DX_PDFLATEX" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_pt_DX_PDFLATEX" = x; then + DX_PDFLATEX="" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + DX_PDFLATEX=$ac_pt_DX_PDFLATEX + fi +else + DX_PDFLATEX="$ac_cv_path_DX_PDFLATEX" +fi + +if test "$DX_FLAG_$DX_CURRENT_FEATURE$DX_PDFLATEX" = 1; then + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: pdflatex not found - will not generate doxygen PDF documentation" >&5 +$as_echo "$as_me: WARNING: pdflatex not found - will not generate doxygen PDF documentation" >&2;} + DX_FLAG_pdf=0 + +fi + + +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}makeindex", so it can be a program name with args. +set dummy ${ac_tool_prefix}makeindex; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_path_DX_MAKEINDEX+:} false; then : + $as_echo_n "(cached) " >&6 +else + case $DX_MAKEINDEX in + [\\/]* | ?:[\\/]*) + ac_cv_path_DX_MAKEINDEX="$DX_MAKEINDEX" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_path_DX_MAKEINDEX="$as_dir/$ac_word$ac_exec_ext" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + ;; +esac +fi +DX_MAKEINDEX=$ac_cv_path_DX_MAKEINDEX +if test -n "$DX_MAKEINDEX"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DX_MAKEINDEX" >&5 +$as_echo "$DX_MAKEINDEX" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_path_DX_MAKEINDEX"; then + ac_pt_DX_MAKEINDEX=$DX_MAKEINDEX + # Extract the first word of "makeindex", so it can be a program name with args. +set dummy makeindex; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_path_ac_pt_DX_MAKEINDEX+:} false; then : + $as_echo_n "(cached) " >&6 +else + case $ac_pt_DX_MAKEINDEX in + [\\/]* | ?:[\\/]*) + ac_cv_path_ac_pt_DX_MAKEINDEX="$ac_pt_DX_MAKEINDEX" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_path_ac_pt_DX_MAKEINDEX="$as_dir/$ac_word$ac_exec_ext" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + ;; +esac +fi +ac_pt_DX_MAKEINDEX=$ac_cv_path_ac_pt_DX_MAKEINDEX +if test -n "$ac_pt_DX_MAKEINDEX"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_pt_DX_MAKEINDEX" >&5 +$as_echo "$ac_pt_DX_MAKEINDEX" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_pt_DX_MAKEINDEX" = x; then + DX_MAKEINDEX="" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + DX_MAKEINDEX=$ac_pt_DX_MAKEINDEX + fi +else + DX_MAKEINDEX="$ac_cv_path_DX_MAKEINDEX" +fi + +if test "$DX_FLAG_$DX_CURRENT_FEATURE$DX_MAKEINDEX" = 1; then + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: makeindex not found - will not generate doxygen PDF documentation" >&5 +$as_echo "$as_me: WARNING: makeindex not found - will not generate doxygen PDF documentation" >&2;} + DX_FLAG_pdf=0 + +fi + + +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}egrep", so it can be a program name with args. +set dummy ${ac_tool_prefix}egrep; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_path_DX_EGREP+:} false; then : + $as_echo_n "(cached) " >&6 +else + case $DX_EGREP in + [\\/]* | ?:[\\/]*) + ac_cv_path_DX_EGREP="$DX_EGREP" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_path_DX_EGREP="$as_dir/$ac_word$ac_exec_ext" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + ;; +esac +fi +DX_EGREP=$ac_cv_path_DX_EGREP +if test -n "$DX_EGREP"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DX_EGREP" >&5 +$as_echo "$DX_EGREP" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_path_DX_EGREP"; then + ac_pt_DX_EGREP=$DX_EGREP + # Extract the first word of "egrep", so it can be a program name with args. +set dummy egrep; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_path_ac_pt_DX_EGREP+:} false; then : + $as_echo_n "(cached) " >&6 +else + case $ac_pt_DX_EGREP in + [\\/]* | ?:[\\/]*) + ac_cv_path_ac_pt_DX_EGREP="$ac_pt_DX_EGREP" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_path_ac_pt_DX_EGREP="$as_dir/$ac_word$ac_exec_ext" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + ;; +esac +fi +ac_pt_DX_EGREP=$ac_cv_path_ac_pt_DX_EGREP +if test -n "$ac_pt_DX_EGREP"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_pt_DX_EGREP" >&5 +$as_echo "$ac_pt_DX_EGREP" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_pt_DX_EGREP" = x; then + DX_EGREP="" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + DX_EGREP=$ac_pt_DX_EGREP + fi +else + DX_EGREP="$ac_cv_path_DX_EGREP" +fi + +if test "$DX_FLAG_$DX_CURRENT_FEATURE$DX_EGREP" = 1; then + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: egrep not found - will not generate doxygen PDF documentation" >&5 +$as_echo "$as_me: WARNING: egrep not found - will not generate doxygen PDF documentation" >&2;} + DX_FLAG_pdf=0 + +fi + + : +fi +if test "$DX_FLAG_pdf" = 1; then + if :; then + DX_COND_pdf_TRUE= + DX_COND_pdf_FALSE='#' +else + DX_COND_pdf_TRUE='#' + DX_COND_pdf_FALSE= +fi + + + : +else + if false; then + DX_COND_pdf_TRUE= + DX_COND_pdf_FALSE='#' +else + DX_COND_pdf_TRUE='#' + DX_COND_pdf_FALSE= +fi + + + : +fi + + +# LaTeX generation for PS and/or PDF: +if test "$DX_FLAG_ps" = 1 || test "$DX_FLAG_pdf" = 1; then + if :; then + DX_COND_latex_TRUE= + DX_COND_latex_FALSE='#' +else + DX_COND_latex_TRUE='#' + DX_COND_latex_FALSE= +fi + + DX_ENV="$DX_ENV GENERATE_LATEX='YES'" + +else + if false; then + DX_COND_latex_TRUE= + DX_COND_latex_FALSE='#' +else + DX_COND_latex_TRUE='#' + DX_COND_latex_FALSE= +fi + + DX_ENV="$DX_ENV GENERATE_LATEX='NO'" + +fi + +# Paper size for PS and/or PDF: + +case "$DOXYGEN_PAPER_SIZE" in +#( +"") + DOXYGEN_PAPER_SIZE="" + +;; #( +a4wide|a4|letter|legal|executive) + DX_ENV="$DX_ENV PAPER_SIZE='$DOXYGEN_PAPER_SIZE'" + +;; #( +*) + as_fn_error $? "unknown DOXYGEN_PAPER_SIZE='$DOXYGEN_PAPER_SIZE'" "$LINENO" 5 +;; +esac + +#For debugging: +#echo DX_FLAG_doc=$DX_FLAG_doc +#echo DX_FLAG_dot=$DX_FLAG_dot +#echo DX_FLAG_man=$DX_FLAG_man +#echo DX_FLAG_html=$DX_FLAG_html +#echo DX_FLAG_chm=$DX_FLAG_chm +#echo DX_FLAG_chi=$DX_FLAG_chi +#echo DX_FLAG_rtf=$DX_FLAG_rtf +#echo DX_FLAG_xml=$DX_FLAG_xml +#echo DX_FLAG_pdf=$DX_FLAG_pdf +#echo DX_FLAG_ps=$DX_FLAG_ps +#echo DX_ENV=$DX_ENV + + +# initialize automake +am__api_version='1.11' + +ac_aux_dir= +for ac_dir in "$srcdir" "$srcdir/.." "$srcdir/../.."; do + if test -f "$ac_dir/install-sh"; then + ac_aux_dir=$ac_dir + ac_install_sh="$ac_aux_dir/install-sh -c" + break + elif test -f "$ac_dir/install.sh"; then + ac_aux_dir=$ac_dir + ac_install_sh="$ac_aux_dir/install.sh -c" + break + elif test -f "$ac_dir/shtool"; then + ac_aux_dir=$ac_dir + ac_install_sh="$ac_aux_dir/shtool install -c" + break + fi +done +if test -z "$ac_aux_dir"; then + as_fn_error $? "cannot find install-sh, install.sh, or shtool in \"$srcdir\" \"$srcdir/..\" \"$srcdir/../..\"" "$LINENO" 5 +fi + +# These three variables are undocumented and unsupported, +# and are intended to be withdrawn in a future Autoconf release. +# They can cause serious problems if a builder's source tree is in a directory +# whose full name contains unusual characters. +ac_config_guess="$SHELL $ac_aux_dir/config.guess" # Please don't use this var. +ac_config_sub="$SHELL $ac_aux_dir/config.sub" # Please don't use this var. +ac_configure="$SHELL $ac_aux_dir/configure" # Please don't use this var. + + +# Find a good install program. We prefer a C program (faster), +# so one script is as good as another. But avoid the broken or +# incompatible versions: +# SysV /etc/install, /usr/sbin/install +# SunOS /usr/etc/install +# IRIX /sbin/install +# AIX /bin/install +# AmigaOS /C/install, which installs bootblocks on floppy discs +# AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag +# AFS /usr/afsws/bin/install, which mishandles nonexistent args +# SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff" +# OS/2's system install, which has a completely different semantic +# ./install, which can be erroneously created by make from ./install.sh. +# Reject install programs that cannot install multiple files. +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a BSD-compatible install" >&5 +$as_echo_n "checking for a BSD-compatible install... " >&6; } +if test -z "$INSTALL"; then +if ${ac_cv_path_install+:} false; then : + $as_echo_n "(cached) " >&6 +else + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + # Account for people who put trailing slashes in PATH elements. +case $as_dir/ in @%:@(( + ./ | .// | /[cC]/* | \ + /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \ + ?:[\\/]os2[\\/]install[\\/]* | ?:[\\/]OS2[\\/]INSTALL[\\/]* | \ + /usr/ucb/* ) ;; + *) + # OSF1 and SCO ODT 3.0 have their own names for install. + # Don't use installbsd from OSF since it installs stuff as root + # by default. + for ac_prog in ginstall scoinst install; do + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_prog$ac_exec_ext"; then + if test $ac_prog = install && + grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then + # AIX install. It has an incompatible calling convention. + : + elif test $ac_prog = install && + grep pwplus "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then + # program-specific install script used by HP pwplus--don't use. + : + else + rm -rf conftest.one conftest.two conftest.dir + echo one > conftest.one + echo two > conftest.two + mkdir conftest.dir + if "$as_dir/$ac_prog$ac_exec_ext" -c conftest.one conftest.two "`pwd`/conftest.dir" && + test -s conftest.one && test -s conftest.two && + test -s conftest.dir/conftest.one && + test -s conftest.dir/conftest.two + then + ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c" + break 3 + fi + fi + fi + done + done + ;; +esac + + done +IFS=$as_save_IFS + +rm -rf conftest.one conftest.two conftest.dir + +fi + if test "${ac_cv_path_install+set}" = set; then + INSTALL=$ac_cv_path_install + else + # As a last resort, use the slow shell script. Don't cache a + # value for INSTALL within a source directory, because that will + # break other packages using the cache if that directory is + # removed, or if the value is a relative name. + INSTALL=$ac_install_sh + fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $INSTALL" >&5 +$as_echo "$INSTALL" >&6; } + +# Use test -z because SunOS4 sh mishandles braces in ${var-val}. +# It thinks the first close brace ends the variable substitution. +test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}' + +test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}' + +test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644' + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether build environment is sane" >&5 +$as_echo_n "checking whether build environment is sane... " >&6; } +# Just in case +sleep 1 +echo timestamp > conftest.file +# Reject unsafe characters in $srcdir or the absolute working directory +# name. Accept space and tab only in the latter. +am_lf=' +' +case `pwd` in + *[\\\"\#\$\&\'\`$am_lf]*) + as_fn_error $? "unsafe absolute working directory name" "$LINENO" 5;; +esac +case $srcdir in + *[\\\"\#\$\&\'\`$am_lf\ \ ]*) + as_fn_error $? "unsafe srcdir value: \`$srcdir'" "$LINENO" 5;; +esac + +# Do `set' in a subshell so we don't clobber the current shell's +# arguments. Must try -L first in case configure is actually a +# symlink; some systems play weird games with the mod time of symlinks +# (eg FreeBSD returns the mod time of the symlink's containing +# directory). +if ( + set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null` + if test "$*" = "X"; then + # -L didn't work. + set X `ls -t "$srcdir/configure" conftest.file` + fi + rm -f conftest.file + if test "$*" != "X $srcdir/configure conftest.file" \ + && test "$*" != "X conftest.file $srcdir/configure"; then + + # If neither matched, then we have a broken ls. This can happen + # if, for instance, CONFIG_SHELL is bash and it inherits a + # broken ls alias from the environment. This has actually + # happened. Such a system could not be considered "sane". + as_fn_error $? "ls -t appears to fail. Make sure there is not a broken +alias in your environment" "$LINENO" 5 + fi + + test "$2" = conftest.file + ) +then + # Ok. + : +else + as_fn_error $? "newly created file is older than distributed files! +Check your system clock" "$LINENO" 5 +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } +test "$program_prefix" != NONE && + program_transform_name="s&^&$program_prefix&;$program_transform_name" +# Use a double $ so make ignores it. +test "$program_suffix" != NONE && + program_transform_name="s&\$&$program_suffix&;$program_transform_name" +# Double any \ or $. +# By default was `s,x,x', remove it if useless. +ac_script='s/[\\$]/&&/g;s/;s,x,x,$//' +program_transform_name=`$as_echo "$program_transform_name" | sed "$ac_script"` + +# expand $ac_aux_dir to an absolute path +am_aux_dir=`cd $ac_aux_dir && pwd` + +if test x"${MISSING+set}" != xset; then + case $am_aux_dir in + *\ * | *\ *) + MISSING="\${SHELL} \"$am_aux_dir/missing\"" ;; + *) + MISSING="\${SHELL} $am_aux_dir/missing" ;; + esac +fi +# Use eval to expand $SHELL +if eval "$MISSING --run true"; then + am_missing_run="$MISSING --run " +else + am_missing_run= + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: \`missing' script is too old or missing" >&5 +$as_echo "$as_me: WARNING: \`missing' script is too old or missing" >&2;} +fi + +if test x"${install_sh}" != xset; then + case $am_aux_dir in + *\ * | *\ *) + install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;; + *) + install_sh="\${SHELL} $am_aux_dir/install-sh" + esac +fi + +# Installed binaries are usually stripped using `strip' when the user +# run `make install-strip'. However `strip' might not be the right +# tool to use in cross-compilation environments, therefore Automake +# will honor the `STRIP' environment variable to overrule this program. +if test "$cross_compiling" != no; then + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args. +set dummy ${ac_tool_prefix}strip; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_STRIP+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$STRIP"; then + ac_cv_prog_STRIP="$STRIP" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_STRIP="${ac_tool_prefix}strip" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +STRIP=$ac_cv_prog_STRIP +if test -n "$STRIP"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $STRIP" >&5 +$as_echo "$STRIP" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_STRIP"; then + ac_ct_STRIP=$STRIP + # Extract the first word of "strip", so it can be a program name with args. +set dummy strip; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_STRIP+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_STRIP"; then + ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_STRIP="strip" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP +if test -n "$ac_ct_STRIP"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP" >&5 +$as_echo "$ac_ct_STRIP" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_STRIP" = x; then + STRIP=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + STRIP=$ac_ct_STRIP + fi +else + STRIP="$ac_cv_prog_STRIP" +fi + +fi +INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s" + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a thread-safe mkdir -p" >&5 +$as_echo_n "checking for a thread-safe mkdir -p... " >&6; } +if test -z "$MKDIR_P"; then + if ${ac_cv_path_mkdir+:} false; then : + $as_echo_n "(cached) " >&6 +else + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH$PATH_SEPARATOR/opt/sfw/bin +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_prog in mkdir gmkdir; do + for ac_exec_ext in '' $ac_executable_extensions; do + as_fn_executable_p "$as_dir/$ac_prog$ac_exec_ext" || continue + case `"$as_dir/$ac_prog$ac_exec_ext" --version 2>&1` in #( + 'mkdir (GNU coreutils) '* | \ + 'mkdir (coreutils) '* | \ + 'mkdir (fileutils) '4.1*) + ac_cv_path_mkdir=$as_dir/$ac_prog$ac_exec_ext + break 3;; + esac + done + done + done +IFS=$as_save_IFS + +fi + + test -d ./--version && rmdir ./--version + if test "${ac_cv_path_mkdir+set}" = set; then + MKDIR_P="$ac_cv_path_mkdir -p" + else + # As a last resort, use the slow shell script. Don't cache a + # value for MKDIR_P within a source directory, because that will + # break other packages using the cache if that directory is + # removed, or if the value is a relative name. + MKDIR_P="$ac_install_sh -d" + fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $MKDIR_P" >&5 +$as_echo "$MKDIR_P" >&6; } + +mkdir_p="$MKDIR_P" +case $mkdir_p in + [\\/$]* | ?:[\\/]*) ;; + */*) mkdir_p="\$(top_builddir)/$mkdir_p" ;; +esac + +for ac_prog in gawk mawk nawk awk +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_AWK+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$AWK"; then + ac_cv_prog_AWK="$AWK" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_AWK="$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +AWK=$ac_cv_prog_AWK +if test -n "$AWK"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AWK" >&5 +$as_echo "$AWK" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$AWK" && break +done + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} sets \$(MAKE)" >&5 +$as_echo_n "checking whether ${MAKE-make} sets \$(MAKE)... " >&6; } +set x ${MAKE-make} +ac_make=`$as_echo "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'` +if eval \${ac_cv_prog_make_${ac_make}_set+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat >conftest.make <<\_ACEOF +SHELL = /bin/sh +all: + @echo '@@@%%%=$(MAKE)=@@@%%%' +_ACEOF +# GNU make sometimes prints "make[1]: Entering ...", which would confuse us. +case `${MAKE-make} -f conftest.make 2>/dev/null` in + *@@@%%%=?*=@@@%%%*) + eval ac_cv_prog_make_${ac_make}_set=yes;; + *) + eval ac_cv_prog_make_${ac_make}_set=no;; +esac +rm -f conftest.make +fi +if eval test \$ac_cv_prog_make_${ac_make}_set = yes; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + SET_MAKE= +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + SET_MAKE="MAKE=${MAKE-make}" +fi + +rm -rf .tst 2>/dev/null +mkdir .tst 2>/dev/null +if test -d .tst; then + am__leading_dot=. +else + am__leading_dot=_ +fi +rmdir .tst 2>/dev/null + +if test "`cd $srcdir && pwd`" != "`pwd`"; then + # Use -I$(srcdir) only when $(srcdir) != ., so that make's output + # is not polluted with repeated "-I." + am__isrc=' -I$(srcdir)' + # test to see if srcdir already configured + if test -f $srcdir/config.status; then + as_fn_error $? "source directory already configured; run \"make distclean\" there first" "$LINENO" 5 + fi +fi + +# test whether we have cygpath +if test -z "$CYGPATH_W"; then + if (cygpath --version) >/dev/null 2>/dev/null; then + CYGPATH_W='cygpath -w' + else + CYGPATH_W=echo + fi +fi + + +# Define the identity of the package. + PACKAGE='zookeeper' + VERSION='3.4.5' + + +cat >>confdefs.h <<_ACEOF +@%:@define PACKAGE "$PACKAGE" +_ACEOF + + +cat >>confdefs.h <<_ACEOF +@%:@define VERSION "$VERSION" +_ACEOF + +# Some tools Automake needs. + +ACLOCAL=${ACLOCAL-"${am_missing_run}aclocal-${am__api_version}"} + + +AUTOCONF=${AUTOCONF-"${am_missing_run}autoconf"} + + +AUTOMAKE=${AUTOMAKE-"${am_missing_run}automake-${am__api_version}"} + + +AUTOHEADER=${AUTOHEADER-"${am_missing_run}autoheader"} + + +MAKEINFO=${MAKEINFO-"${am_missing_run}makeinfo"} + +# We need awk for the "check" target. The system "awk" is bad on +# some platforms. +# Always define AMTAR for backward compatibility. Yes, it's still used +# in the wild :-( We should find a proper way to deprecate it ... +AMTAR='$${TAR-tar}' + +am__tar='$${TAR-tar} chof - "$$tardir"' am__untar='$${TAR-tar} xf -' + + + + + +ac_config_headers="$ac_config_headers config.h" + + +# Checks for programs. + +@%:@ Check whether --with-cppunit was given. +if test "${with_cppunit+set}" = set; then : + withval=$with_cppunit; +fi + + +if test "$with_cppunit" = "no" ; then + CPPUNIT_PATH="No_CPPUNIT" + CPPUNIT_INCLUDE= + CPPUNIT_LIBS= +else + AM_PATH_CPPUNIT(1.10.2) +fi + +if test "$CALLER" = "ANT" ; then +CPPUNIT_CFLAGS="$CPPUNIT_CFLAGS -DZKSERVER_CMD=\"\\\"${base_dir}/src/c/tests/zkServer.sh\\\"\"" +else +CPPUNIT_CFLAGS="$CPPUNIT_CFLAGS -DZKSERVER_CMD=\"\\\"./tests/zkServer.sh\\\"\"" +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for generated/zookeeper.jute.c" >&5 +$as_echo_n "checking for generated/zookeeper.jute.c... " >&6; } +if ${ac_cv_file_generated_zookeeper_jute_c+:} false; then : + $as_echo_n "(cached) " >&6 +else + test "$cross_compiling" = yes && + as_fn_error $? "cannot check for file existence when cross compiling" "$LINENO" 5 +if test -r "generated/zookeeper.jute.c"; then + ac_cv_file_generated_zookeeper_jute_c=yes +else + ac_cv_file_generated_zookeeper_jute_c=no +fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_file_generated_zookeeper_jute_c" >&5 +$as_echo "$ac_cv_file_generated_zookeeper_jute_c" >&6; } +if test "x$ac_cv_file_generated_zookeeper_jute_c" = xyes; then : + +cat >>confdefs.h <<_ACEOF +@%:@define HAVE_GENERATED_ZOOKEEPER_JUTE_C 1 +_ACEOF + +else + as_fn_error $? "jute files are missing! Please run \"ant compile_jute\" while in the zookeeper top level directory." "$LINENO" 5 + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for generated/zookeeper.jute.h" >&5 +$as_echo_n "checking for generated/zookeeper.jute.h... " >&6; } +if ${ac_cv_file_generated_zookeeper_jute_h+:} false; then : + $as_echo_n "(cached) " >&6 +else + test "$cross_compiling" = yes && + as_fn_error $? "cannot check for file existence when cross compiling" "$LINENO" 5 +if test -r "generated/zookeeper.jute.h"; then + ac_cv_file_generated_zookeeper_jute_h=yes +else + ac_cv_file_generated_zookeeper_jute_h=no +fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_file_generated_zookeeper_jute_h" >&5 +$as_echo "$ac_cv_file_generated_zookeeper_jute_h" >&6; } +if test "x$ac_cv_file_generated_zookeeper_jute_h" = xyes; then : + +cat >>confdefs.h <<_ACEOF +@%:@define HAVE_GENERATED_ZOOKEEPER_JUTE_H 1 +_ACEOF + +else + as_fn_error $? "jute files are missing! Please run \"ant compile_jute\" while in the zookeeper top level directory." "$LINENO" 5 + +fi + +fi + + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args. +set dummy ${ac_tool_prefix}gcc; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_CC+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_CC="${ac_tool_prefix}gcc" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +$as_echo "$CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_CC"; then + ac_ct_CC=$CC + # Extract the first word of "gcc", so it can be a program name with args. +set dummy gcc; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_CC+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_CC"; then + ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_CC="gcc" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_CC=$ac_cv_prog_ac_ct_CC +if test -n "$ac_ct_CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 +$as_echo "$ac_ct_CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_CC" = x; then + CC="" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + CC=$ac_ct_CC + fi +else + CC="$ac_cv_prog_CC" +fi + +if test -z "$CC"; then + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args. +set dummy ${ac_tool_prefix}cc; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_CC+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_CC="${ac_tool_prefix}cc" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +$as_echo "$CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + fi +fi +if test -z "$CC"; then + # Extract the first word of "cc", so it can be a program name with args. +set dummy cc; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_CC+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else + ac_prog_rejected=no +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then + ac_prog_rejected=yes + continue + fi + ac_cv_prog_CC="cc" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +if test $ac_prog_rejected = yes; then + # We found a bogon in the path, so make sure we never use it. + set dummy $ac_cv_prog_CC + shift + if test $@%:@ != 0; then + # We chose a different compiler from the bogus one. + # However, it has the same basename, so the bogon will be chosen + # first if we set CC to just the basename; use the full file name. + shift + ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@" + fi +fi +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +$as_echo "$CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$CC"; then + if test -n "$ac_tool_prefix"; then + for ac_prog in cl.exe + do + # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. +set dummy $ac_tool_prefix$ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_CC+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_CC="$ac_tool_prefix$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +$as_echo "$CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$CC" && break + done +fi +if test -z "$CC"; then + ac_ct_CC=$CC + for ac_prog in cl.exe +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_CC+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_CC"; then + ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_CC="$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_CC=$ac_cv_prog_ac_ct_CC +if test -n "$ac_ct_CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 +$as_echo "$ac_ct_CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$ac_ct_CC" && break +done + + if test "x$ac_ct_CC" = x; then + CC="" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + CC=$ac_ct_CC + fi +fi + +fi + + +test -z "$CC" && { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "no acceptable C compiler found in \$PATH +See \`config.log' for more details" "$LINENO" 5; } + +# Provide some information about the compiler. +$as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5 +set X $ac_compile +ac_compiler=$2 +for ac_option in --version -v -V -qversion; do + { { ac_try="$ac_compiler $ac_option >&5" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_compiler $ac_option >&5") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + sed '10a\ +... rest of stderr output deleted ... + 10q' conftest.err >conftest.er1 + cat conftest.er1 >&5 + fi + rm -f conftest.er1 conftest.err + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } +done + +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +ac_clean_files_save=$ac_clean_files +ac_clean_files="$ac_clean_files a.out a.out.dSYM a.exe b.out" +# Try to create an executable without -o first, disregard a.out. +# It will help us diagnose broken compilers, and finding out an intuition +# of exeext. +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler works" >&5 +$as_echo_n "checking whether the C compiler works... " >&6; } +ac_link_default=`$as_echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'` + +# The possible output files: +ac_files="a.out conftest.exe conftest a.exe a_out.exe b.out conftest.*" + +ac_rmfiles= +for ac_file in $ac_files +do + case $ac_file in + *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; + * ) ac_rmfiles="$ac_rmfiles $ac_file";; + esac +done +rm -f $ac_rmfiles + +if { { ac_try="$ac_link_default" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_link_default") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then : + # Autoconf-2.13 could set the ac_cv_exeext variable to `no'. +# So ignore a value of `no', otherwise this would lead to `EXEEXT = no' +# in a Makefile. We should not override ac_cv_exeext if it was cached, +# so that the user can short-circuit this test for compilers unknown to +# Autoconf. +for ac_file in $ac_files '' +do + test -f "$ac_file" || continue + case $ac_file in + *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) + ;; + [ab].out ) + # We found the default executable, but exeext='' is most + # certainly right. + break;; + *.* ) + if test "${ac_cv_exeext+set}" = set && test "$ac_cv_exeext" != no; + then :; else + ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` + fi + # We set ac_cv_exeext here because the later test for it is not + # safe: cross compilers may not add the suffix if given an `-o' + # argument, so we may need to know it at that point already. + # Even if this section looks crufty: it has the advantage of + # actually working. + break;; + * ) + break;; + esac +done +test "$ac_cv_exeext" = no && ac_cv_exeext= + +else + ac_file='' +fi +if test -z "$ac_file"; then : + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +$as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error 77 "C compiler cannot create executables +See \`config.log' for more details" "$LINENO" 5; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler default output file name" >&5 +$as_echo_n "checking for C compiler default output file name... " >&6; } +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_file" >&5 +$as_echo "$ac_file" >&6; } +ac_exeext=$ac_cv_exeext + +rm -f -r a.out a.out.dSYM a.exe conftest$ac_cv_exeext b.out +ac_clean_files=$ac_clean_files_save +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of executables" >&5 +$as_echo_n "checking for suffix of executables... " >&6; } +if { { ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_link") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then : + # If both `conftest.exe' and `conftest' are `present' (well, observable) +# catch `conftest.exe'. For instance with Cygwin, `ls conftest' will +# work properly (i.e., refer to `conftest.exe'), while it won't with +# `rm'. +for ac_file in conftest.exe conftest conftest.*; do + test -f "$ac_file" || continue + case $ac_file in + *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; + *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` + break;; + * ) break;; + esac +done +else + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "cannot compute suffix of executables: cannot compile and link +See \`config.log' for more details" "$LINENO" 5; } +fi +rm -f conftest conftest$ac_cv_exeext +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_exeext" >&5 +$as_echo "$ac_cv_exeext" >&6; } + +rm -f conftest.$ac_ext +EXEEXT=$ac_cv_exeext +ac_exeext=$EXEEXT +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +@%:@include +int +main () +{ +FILE *f = fopen ("conftest.out", "w"); + return ferror (f) || fclose (f) != 0; + + ; + return 0; +} +_ACEOF +ac_clean_files="$ac_clean_files conftest.out" +# Check that the compiler produces executables we can run. If not, either +# the compiler is broken, or we cross compile. +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are cross compiling" >&5 +$as_echo_n "checking whether we are cross compiling... " >&6; } +if test "$cross_compiling" != yes; then + { { ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_link") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + if { ac_try='./conftest$ac_cv_exeext' + { { case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; }; then + cross_compiling=no + else + if test "$cross_compiling" = maybe; then + cross_compiling=yes + else + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "cannot run C compiled programs. +If you meant to cross compile, use \`--host'. +See \`config.log' for more details" "$LINENO" 5; } + fi + fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $cross_compiling" >&5 +$as_echo "$cross_compiling" >&6; } + +rm -f conftest.$ac_ext conftest$ac_cv_exeext conftest.out +ac_clean_files=$ac_clean_files_save +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of object files" >&5 +$as_echo_n "checking for suffix of object files... " >&6; } +if ${ac_cv_objext+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +rm -f conftest.o conftest.obj +if { { ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_compile") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then : + for ac_file in conftest.o conftest.obj conftest.*; do + test -f "$ac_file" || continue; + case $ac_file in + *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM ) ;; + *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'` + break;; + esac +done +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "cannot compute suffix of object files: cannot compile +See \`config.log' for more details" "$LINENO" 5; } +fi +rm -f conftest.$ac_cv_objext conftest.$ac_ext +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_objext" >&5 +$as_echo "$ac_cv_objext" >&6; } +OBJEXT=$ac_cv_objext +ac_objext=$OBJEXT +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C compiler" >&5 +$as_echo_n "checking whether we are using the GNU C compiler... " >&6; } +if ${ac_cv_c_compiler_gnu+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ +#ifndef __GNUC__ + choke me +#endif + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_compiler_gnu=yes +else + ac_compiler_gnu=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +ac_cv_c_compiler_gnu=$ac_compiler_gnu + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5 +$as_echo "$ac_cv_c_compiler_gnu" >&6; } +if test $ac_compiler_gnu = yes; then + GCC=yes +else + GCC= +fi +ac_test_CFLAGS=${CFLAGS+set} +ac_save_CFLAGS=$CFLAGS +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5 +$as_echo_n "checking whether $CC accepts -g... " >&6; } +if ${ac_cv_prog_cc_g+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_save_c_werror_flag=$ac_c_werror_flag + ac_c_werror_flag=yes + ac_cv_prog_cc_g=no + CFLAGS="-g" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_prog_cc_g=yes +else + CFLAGS="" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + +else + ac_c_werror_flag=$ac_save_c_werror_flag + CFLAGS="-g" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_prog_cc_g=yes +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + ac_c_werror_flag=$ac_save_c_werror_flag +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5 +$as_echo "$ac_cv_prog_cc_g" >&6; } +if test "$ac_test_CFLAGS" = set; then + CFLAGS=$ac_save_CFLAGS +elif test $ac_cv_prog_cc_g = yes; then + if test "$GCC" = yes; then + CFLAGS="-g -O2" + else + CFLAGS="-g" + fi +else + if test "$GCC" = yes; then + CFLAGS="-O2" + else + CFLAGS= + fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5 +$as_echo_n "checking for $CC option to accept ISO C89... " >&6; } +if ${ac_cv_prog_cc_c89+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_cv_prog_cc_c89=no +ac_save_CC=$CC +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +#include +struct stat; +/* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */ +struct buf { int x; }; +FILE * (*rcsopen) (struct buf *, struct stat *, int); +static char *e (p, i) + char **p; + int i; +{ + return p[i]; +} +static char *f (char * (*g) (char **, int), char **p, ...) +{ + char *s; + va_list v; + va_start (v,p); + s = g (p, va_arg (v,int)); + va_end (v); + return s; +} + +/* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has + function prototypes and stuff, but not '\xHH' hex character constants. + These don't provoke an error unfortunately, instead are silently treated + as 'x'. The following induces an error, until -std is added to get + proper ANSI mode. Curiously '\x00'!='x' always comes out true, for an + array size at least. It's necessary to write '\x00'==0 to get something + that's true only with -std. */ +int osf4_cc_array ['\x00' == 0 ? 1 : -1]; + +/* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters + inside strings and character constants. */ +#define FOO(x) 'x' +int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1]; + +int test (int i, double x); +struct s1 {int (*f) (int a);}; +struct s2 {int (*f) (double a);}; +int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int); +int argc; +char **argv; +int +main () +{ +return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]; + ; + return 0; +} +_ACEOF +for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \ + -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" +do + CC="$ac_save_CC $ac_arg" + if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_prog_cc_c89=$ac_arg +fi +rm -f core conftest.err conftest.$ac_objext + test "x$ac_cv_prog_cc_c89" != "xno" && break +done +rm -f conftest.$ac_ext +CC=$ac_save_CC + +fi +# AC_CACHE_VAL +case "x$ac_cv_prog_cc_c89" in + x) + { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 +$as_echo "none needed" >&6; } ;; + xno) + { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 +$as_echo "unsupported" >&6; } ;; + *) + CC="$CC $ac_cv_prog_cc_c89" + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5 +$as_echo "$ac_cv_prog_cc_c89" >&6; } ;; +esac +if test "x$ac_cv_prog_cc_c89" != xno; then : + +fi + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu +DEPDIR="${am__leading_dot}deps" + +ac_config_commands="$ac_config_commands depfiles" + + +am_make=${MAKE-make} +cat > confinc << 'END' +am__doit: + @echo this is the am__doit target +.PHONY: am__doit +END +# If we don't find an include directive, just comment out the code. +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for style of include used by $am_make" >&5 +$as_echo_n "checking for style of include used by $am_make... " >&6; } +am__include="#" +am__quote= +_am_result=none +# First try GNU make style include. +echo "include confinc" > confmf +# Ignore all kinds of additional output from `make'. +case `$am_make -s -f confmf 2> /dev/null` in #( +*the\ am__doit\ target*) + am__include=include + am__quote= + _am_result=GNU + ;; +esac +# Now try BSD make style include. +if test "$am__include" = "#"; then + echo '.include "confinc"' > confmf + case `$am_make -s -f confmf 2> /dev/null` in #( + *the\ am__doit\ target*) + am__include=.include + am__quote="\"" + _am_result=BSD + ;; + esac +fi + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $_am_result" >&5 +$as_echo "$_am_result" >&6; } +rm -f confinc confmf + +@%:@ Check whether --enable-dependency-tracking was given. +if test "${enable_dependency_tracking+set}" = set; then : + enableval=$enable_dependency_tracking; +fi + +if test "x$enable_dependency_tracking" != xno; then + am_depcomp="$ac_aux_dir/depcomp" + AMDEPBACKSLASH='\' + am__nodep='_no' +fi + if test "x$enable_dependency_tracking" != xno; then + AMDEP_TRUE= + AMDEP_FALSE='#' +else + AMDEP_TRUE='#' + AMDEP_FALSE= +fi + + + +depcc="$CC" am_compiler_list= + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5 +$as_echo_n "checking dependency style of $depcc... " >&6; } +if ${am_cv_CC_dependencies_compiler_type+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then + # We make a subdir and do the tests there. Otherwise we can end up + # making bogus files that we don't know about and never remove. For + # instance it was reported that on HP-UX the gcc test will end up + # making a dummy file named `D' -- because `-MD' means `put the output + # in D'. + rm -rf conftest.dir + mkdir conftest.dir + # Copy depcomp to subdir because otherwise we won't find it if we're + # using a relative directory. + cp "$am_depcomp" conftest.dir + cd conftest.dir + # We will build objects and dependencies in a subdirectory because + # it helps to detect inapplicable dependency modes. For instance + # both Tru64's cc and ICC support -MD to output dependencies as a + # side effect of compilation, but ICC will put the dependencies in + # the current directory while Tru64 will put them in the object + # directory. + mkdir sub + + am_cv_CC_dependencies_compiler_type=none + if test "$am_compiler_list" = ""; then + am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp` + fi + am__universal=false + case " $depcc " in #( + *\ -arch\ *\ -arch\ *) am__universal=true ;; + esac + + for depmode in $am_compiler_list; do + # Setup a source with many dependencies, because some compilers + # like to wrap large dependency lists on column 80 (with \), and + # we should not choose a depcomp mode which is confused by this. + # + # We need to recreate these files for each test, as the compiler may + # overwrite some of them when testing with obscure command lines. + # This happens at least with the AIX C compiler. + : > sub/conftest.c + for i in 1 2 3 4 5 6; do + echo '#include "conftst'$i'.h"' >> sub/conftest.c + # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with + # Solaris 8's {/usr,}/bin/sh. + touch sub/conftst$i.h + done + echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf + + # We check with `-c' and `-o' for the sake of the "dashmstdout" + # mode. It turns out that the SunPro C++ compiler does not properly + # handle `-M -o', and we need to detect this. Also, some Intel + # versions had trouble with output in subdirs + am__obj=sub/conftest.${OBJEXT-o} + am__minus_obj="-o $am__obj" + case $depmode in + gcc) + # This depmode causes a compiler race in universal mode. + test "$am__universal" = false || continue + ;; + nosideeffect) + # after this tag, mechanisms are not by side-effect, so they'll + # only be used when explicitly requested + if test "x$enable_dependency_tracking" = xyes; then + continue + else + break + fi + ;; + msvc7 | msvc7msys | msvisualcpp | msvcmsys) + # This compiler won't grok `-c -o', but also, the minuso test has + # not run yet. These depmodes are late enough in the game, and + # so weak that their functioning should not be impacted. + am__obj=conftest.${OBJEXT-o} + am__minus_obj= + ;; + none) break ;; + esac + if depmode=$depmode \ + source=sub/conftest.c object=$am__obj \ + depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ + $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ + >/dev/null 2>conftest.err && + grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && + grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && + grep $am__obj sub/conftest.Po > /dev/null 2>&1 && + ${MAKE-make} -s -f confmf > /dev/null 2>&1; then + # icc doesn't choke on unknown options, it will just issue warnings + # or remarks (even with -Werror). So we grep stderr for any message + # that says an option was ignored or not supported. + # When given -MP, icc 7.0 and 7.1 complain thusly: + # icc: Command line warning: ignoring option '-M'; no argument required + # The diagnosis changed in icc 8.0: + # icc: Command line remark: option '-MP' not supported + if (grep 'ignoring option' conftest.err || + grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else + am_cv_CC_dependencies_compiler_type=$depmode + break + fi + fi + done + + cd .. + rm -rf conftest.dir +else + am_cv_CC_dependencies_compiler_type=none +fi + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_CC_dependencies_compiler_type" >&5 +$as_echo "$am_cv_CC_dependencies_compiler_type" >&6; } +CCDEPMODE=depmode=$am_cv_CC_dependencies_compiler_type + + if + test "x$enable_dependency_tracking" != xno \ + && test "$am_cv_CC_dependencies_compiler_type" = gcc3; then + am__fastdepCC_TRUE= + am__fastdepCC_FALSE='#' +else + am__fastdepCC_TRUE='#' + am__fastdepCC_FALSE= +fi + + +if test "x$CC" != xcc; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC and cc understand -c and -o together" >&5 +$as_echo_n "checking whether $CC and cc understand -c and -o together... " >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether cc understands -c and -o together" >&5 +$as_echo_n "checking whether cc understands -c and -o together... " >&6; } +fi +set dummy $CC; ac_cc=`$as_echo "$2" | + sed 's/[^a-zA-Z0-9_]/_/g;s/^[0-9]/_/'` +if eval \${ac_cv_prog_cc_${ac_cc}_c_o+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +# Make sure it works both with $CC and with simple cc. +# We do the test twice because some compilers refuse to overwrite an +# existing .o file with -o, though they will create one. +ac_try='$CC -c conftest.$ac_ext -o conftest2.$ac_objext >&5' +rm -f conftest2.* +if { { case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && + test -f conftest2.$ac_objext && { { case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; +then + eval ac_cv_prog_cc_${ac_cc}_c_o=yes + if test "x$CC" != xcc; then + # Test first that cc exists at all. + if { ac_try='cc -c conftest.$ac_ext >&5' + { { case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; }; then + ac_try='cc -c conftest.$ac_ext -o conftest2.$ac_objext >&5' + rm -f conftest2.* + if { { case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && + test -f conftest2.$ac_objext && { { case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; + then + # cc works too. + : + else + # cc exists but doesn't like -o. + eval ac_cv_prog_cc_${ac_cc}_c_o=no + fi + fi + fi +else + eval ac_cv_prog_cc_${ac_cc}_c_o=no +fi +rm -f core conftest* + +fi +if eval test \$ac_cv_prog_cc_${ac_cc}_c_o = yes; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + +$as_echo "@%:@define NO_MINUS_C_MINUS_O 1" >>confdefs.h + +fi + +# FIXME: we rely on the cache variable name because +# there is no other way. +set dummy $CC +am_cc=`echo $2 | sed 's/[^a-zA-Z0-9_]/_/g;s/^[0-9]/_/'` +eval am_t=\$ac_cv_prog_cc_${am_cc}_c_o +if test "$am_t" != yes; then + # Losing compiler, so override with the script. + # FIXME: It is wrong to rewrite CC. + # But if we don't then we get into trouble of one sort or another. + # A longer-term fix would be to have automake use am__CC in this case, + # and then we could set am__CC="\$(top_srcdir)/compile \$(CC)" + CC="$am_aux_dir/compile $CC" +fi + + +ac_ext=cpp +ac_cpp='$CXXCPP $CPPFLAGS' +ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_cxx_compiler_gnu +if test -z "$CXX"; then + if test -n "$CCC"; then + CXX=$CCC + else + if test -n "$ac_tool_prefix"; then + for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC + do + # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. +set dummy $ac_tool_prefix$ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_CXX+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$CXX"; then + ac_cv_prog_CXX="$CXX" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_CXX="$ac_tool_prefix$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +CXX=$ac_cv_prog_CXX +if test -n "$CXX"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CXX" >&5 +$as_echo "$CXX" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$CXX" && break + done +fi +if test -z "$CXX"; then + ac_ct_CXX=$CXX + for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_CXX+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_CXX"; then + ac_cv_prog_ac_ct_CXX="$ac_ct_CXX" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_CXX="$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_CXX=$ac_cv_prog_ac_ct_CXX +if test -n "$ac_ct_CXX"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CXX" >&5 +$as_echo "$ac_ct_CXX" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$ac_ct_CXX" && break +done + + if test "x$ac_ct_CXX" = x; then + CXX="g++" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + CXX=$ac_ct_CXX + fi +fi + + fi +fi +# Provide some information about the compiler. +$as_echo "$as_me:${as_lineno-$LINENO}: checking for C++ compiler version" >&5 +set X $ac_compile +ac_compiler=$2 +for ac_option in --version -v -V -qversion; do + { { ac_try="$ac_compiler $ac_option >&5" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_compiler $ac_option >&5") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + sed '10a\ +... rest of stderr output deleted ... + 10q' conftest.err >conftest.er1 + cat conftest.er1 >&5 + fi + rm -f conftest.er1 conftest.err + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } +done + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C++ compiler" >&5 +$as_echo_n "checking whether we are using the GNU C++ compiler... " >&6; } +if ${ac_cv_cxx_compiler_gnu+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ +#ifndef __GNUC__ + choke me +#endif + + ; + return 0; +} +_ACEOF +if ac_fn_cxx_try_compile "$LINENO"; then : + ac_compiler_gnu=yes +else + ac_compiler_gnu=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +ac_cv_cxx_compiler_gnu=$ac_compiler_gnu + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_cxx_compiler_gnu" >&5 +$as_echo "$ac_cv_cxx_compiler_gnu" >&6; } +if test $ac_compiler_gnu = yes; then + GXX=yes +else + GXX= +fi +ac_test_CXXFLAGS=${CXXFLAGS+set} +ac_save_CXXFLAGS=$CXXFLAGS +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CXX accepts -g" >&5 +$as_echo_n "checking whether $CXX accepts -g... " >&6; } +if ${ac_cv_prog_cxx_g+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_save_cxx_werror_flag=$ac_cxx_werror_flag + ac_cxx_werror_flag=yes + ac_cv_prog_cxx_g=no + CXXFLAGS="-g" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_cxx_try_compile "$LINENO"; then : + ac_cv_prog_cxx_g=yes +else + CXXFLAGS="" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_cxx_try_compile "$LINENO"; then : + +else + ac_cxx_werror_flag=$ac_save_cxx_werror_flag + CXXFLAGS="-g" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_cxx_try_compile "$LINENO"; then : + ac_cv_prog_cxx_g=yes +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + ac_cxx_werror_flag=$ac_save_cxx_werror_flag +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cxx_g" >&5 +$as_echo "$ac_cv_prog_cxx_g" >&6; } +if test "$ac_test_CXXFLAGS" = set; then + CXXFLAGS=$ac_save_CXXFLAGS +elif test $ac_cv_prog_cxx_g = yes; then + if test "$GXX" = yes; then + CXXFLAGS="-g -O2" + else + CXXFLAGS="-g" + fi +else + if test "$GXX" = yes; then + CXXFLAGS="-O2" + else + CXXFLAGS= + fi +fi +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + +depcc="$CXX" am_compiler_list= + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5 +$as_echo_n "checking dependency style of $depcc... " >&6; } +if ${am_cv_CXX_dependencies_compiler_type+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then + # We make a subdir and do the tests there. Otherwise we can end up + # making bogus files that we don't know about and never remove. For + # instance it was reported that on HP-UX the gcc test will end up + # making a dummy file named `D' -- because `-MD' means `put the output + # in D'. + rm -rf conftest.dir + mkdir conftest.dir + # Copy depcomp to subdir because otherwise we won't find it if we're + # using a relative directory. + cp "$am_depcomp" conftest.dir + cd conftest.dir + # We will build objects and dependencies in a subdirectory because + # it helps to detect inapplicable dependency modes. For instance + # both Tru64's cc and ICC support -MD to output dependencies as a + # side effect of compilation, but ICC will put the dependencies in + # the current directory while Tru64 will put them in the object + # directory. + mkdir sub + + am_cv_CXX_dependencies_compiler_type=none + if test "$am_compiler_list" = ""; then + am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp` + fi + am__universal=false + case " $depcc " in #( + *\ -arch\ *\ -arch\ *) am__universal=true ;; + esac + + for depmode in $am_compiler_list; do + # Setup a source with many dependencies, because some compilers + # like to wrap large dependency lists on column 80 (with \), and + # we should not choose a depcomp mode which is confused by this. + # + # We need to recreate these files for each test, as the compiler may + # overwrite some of them when testing with obscure command lines. + # This happens at least with the AIX C compiler. + : > sub/conftest.c + for i in 1 2 3 4 5 6; do + echo '#include "conftst'$i'.h"' >> sub/conftest.c + # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with + # Solaris 8's {/usr,}/bin/sh. + touch sub/conftst$i.h + done + echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf + + # We check with `-c' and `-o' for the sake of the "dashmstdout" + # mode. It turns out that the SunPro C++ compiler does not properly + # handle `-M -o', and we need to detect this. Also, some Intel + # versions had trouble with output in subdirs + am__obj=sub/conftest.${OBJEXT-o} + am__minus_obj="-o $am__obj" + case $depmode in + gcc) + # This depmode causes a compiler race in universal mode. + test "$am__universal" = false || continue + ;; + nosideeffect) + # after this tag, mechanisms are not by side-effect, so they'll + # only be used when explicitly requested + if test "x$enable_dependency_tracking" = xyes; then + continue + else + break + fi + ;; + msvc7 | msvc7msys | msvisualcpp | msvcmsys) + # This compiler won't grok `-c -o', but also, the minuso test has + # not run yet. These depmodes are late enough in the game, and + # so weak that their functioning should not be impacted. + am__obj=conftest.${OBJEXT-o} + am__minus_obj= + ;; + none) break ;; + esac + if depmode=$depmode \ + source=sub/conftest.c object=$am__obj \ + depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ + $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ + >/dev/null 2>conftest.err && + grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && + grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && + grep $am__obj sub/conftest.Po > /dev/null 2>&1 && + ${MAKE-make} -s -f confmf > /dev/null 2>&1; then + # icc doesn't choke on unknown options, it will just issue warnings + # or remarks (even with -Werror). So we grep stderr for any message + # that says an option was ignored or not supported. + # When given -MP, icc 7.0 and 7.1 complain thusly: + # icc: Command line warning: ignoring option '-M'; no argument required + # The diagnosis changed in icc 8.0: + # icc: Command line remark: option '-MP' not supported + if (grep 'ignoring option' conftest.err || + grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else + am_cv_CXX_dependencies_compiler_type=$depmode + break + fi + fi + done + + cd .. + rm -rf conftest.dir +else + am_cv_CXX_dependencies_compiler_type=none +fi + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_CXX_dependencies_compiler_type" >&5 +$as_echo "$am_cv_CXX_dependencies_compiler_type" >&6; } +CXXDEPMODE=depmode=$am_cv_CXX_dependencies_compiler_type + + if + test "x$enable_dependency_tracking" != xno \ + && test "$am_cv_CXX_dependencies_compiler_type" = gcc3; then + am__fastdepCXX_TRUE= + am__fastdepCXX_FALSE='#' +else + am__fastdepCXX_TRUE='#' + am__fastdepCXX_FALSE= +fi + + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ln -s works" >&5 +$as_echo_n "checking whether ln -s works... " >&6; } +LN_S=$as_ln_s +if test "$LN_S" = "ln -s"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no, using $LN_S" >&5 +$as_echo "no, using $LN_S" >&6; } +fi + + +# AC_DISABLE_SHARED +case `pwd` in + *\ * | *\ *) + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Libtool does not cope well with whitespace in \`pwd\`" >&5 +$as_echo "$as_me: WARNING: Libtool does not cope well with whitespace in \`pwd\`" >&2;} ;; +esac + + + +macro_version='2.4.2' +macro_revision='1.3337' + + + + + + + + + + + + + +ltmain="$ac_aux_dir/ltmain.sh" + +# Make sure we can run config.sub. +$SHELL "$ac_aux_dir/config.sub" sun4 >/dev/null 2>&1 || + as_fn_error $? "cannot run $SHELL $ac_aux_dir/config.sub" "$LINENO" 5 + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking build system type" >&5 +$as_echo_n "checking build system type... " >&6; } +if ${ac_cv_build+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_build_alias=$build_alias +test "x$ac_build_alias" = x && + ac_build_alias=`$SHELL "$ac_aux_dir/config.guess"` +test "x$ac_build_alias" = x && + as_fn_error $? "cannot guess build type; you must specify one" "$LINENO" 5 +ac_cv_build=`$SHELL "$ac_aux_dir/config.sub" $ac_build_alias` || + as_fn_error $? "$SHELL $ac_aux_dir/config.sub $ac_build_alias failed" "$LINENO" 5 + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_build" >&5 +$as_echo "$ac_cv_build" >&6; } +case $ac_cv_build in +*-*-*) ;; +*) as_fn_error $? "invalid value of canonical build" "$LINENO" 5;; +esac +build=$ac_cv_build +ac_save_IFS=$IFS; IFS='-' +set x $ac_cv_build +shift +build_cpu=$1 +build_vendor=$2 +shift; shift +# Remember, the first character of IFS is used to create $*, +# except with old shells: +build_os=$* +IFS=$ac_save_IFS +case $build_os in *\ *) build_os=`echo "$build_os" | sed 's/ /-/g'`;; esac + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking host system type" >&5 +$as_echo_n "checking host system type... " >&6; } +if ${ac_cv_host+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test "x$host_alias" = x; then + ac_cv_host=$ac_cv_build +else + ac_cv_host=`$SHELL "$ac_aux_dir/config.sub" $host_alias` || + as_fn_error $? "$SHELL $ac_aux_dir/config.sub $host_alias failed" "$LINENO" 5 +fi + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_host" >&5 +$as_echo "$ac_cv_host" >&6; } +case $ac_cv_host in +*-*-*) ;; +*) as_fn_error $? "invalid value of canonical host" "$LINENO" 5;; +esac +host=$ac_cv_host +ac_save_IFS=$IFS; IFS='-' +set x $ac_cv_host +shift +host_cpu=$1 +host_vendor=$2 +shift; shift +# Remember, the first character of IFS is used to create $*, +# except with old shells: +host_os=$* +IFS=$ac_save_IFS +case $host_os in *\ *) host_os=`echo "$host_os" | sed 's/ /-/g'`;; esac + + +# Backslashify metacharacters that are still active within +# double-quoted strings. +sed_quote_subst='s/\(["`$\\]\)/\\\1/g' + +# Same as above, but do not quote variable references. +double_quote_subst='s/\(["`\\]\)/\\\1/g' + +# Sed substitution to delay expansion of an escaped shell variable in a +# double_quote_subst'ed string. +delay_variable_subst='s/\\\\\\\\\\\$/\\\\\\$/g' + +# Sed substitution to delay expansion of an escaped single quote. +delay_single_quote_subst='s/'\''/'\'\\\\\\\'\''/g' + +# Sed substitution to avoid accidental globbing in evaled expressions +no_glob_subst='s/\*/\\\*/g' + +ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' +ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO +ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO$ECHO + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to print strings" >&5 +$as_echo_n "checking how to print strings... " >&6; } +# Test print first, because it will be a builtin if present. +if test "X`( print -r -- -n ) 2>/dev/null`" = X-n && \ + test "X`print -r -- $ECHO 2>/dev/null`" = "X$ECHO"; then + ECHO='print -r --' +elif test "X`printf %s $ECHO 2>/dev/null`" = "X$ECHO"; then + ECHO='printf %s\n' +else + # Use this function as a fallback that always works. + func_fallback_echo () + { + eval 'cat <<_LTECHO_EOF +$1 +_LTECHO_EOF' + } + ECHO='func_fallback_echo' +fi + +# func_echo_all arg... +# Invoke $ECHO with all args, space-separated. +func_echo_all () +{ + $ECHO "" +} + +case "$ECHO" in + printf*) { $as_echo "$as_me:${as_lineno-$LINENO}: result: printf" >&5 +$as_echo "printf" >&6; } ;; + print*) { $as_echo "$as_me:${as_lineno-$LINENO}: result: print -r" >&5 +$as_echo "print -r" >&6; } ;; + *) { $as_echo "$as_me:${as_lineno-$LINENO}: result: cat" >&5 +$as_echo "cat" >&6; } ;; +esac + + + + + + + + + + + + + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a sed that does not truncate output" >&5 +$as_echo_n "checking for a sed that does not truncate output... " >&6; } +if ${ac_cv_path_SED+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_script=s/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb/ + for ac_i in 1 2 3 4 5 6 7; do + ac_script="$ac_script$as_nl$ac_script" + done + echo "$ac_script" 2>/dev/null | sed 99q >conftest.sed + { ac_script=; unset ac_script;} + if test -z "$SED"; then + ac_path_SED_found=false + # Loop through the user's path and test for each of PROGNAME-LIST + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_prog in sed gsed; do + for ac_exec_ext in '' $ac_executable_extensions; do + ac_path_SED="$as_dir/$ac_prog$ac_exec_ext" + as_fn_executable_p "$ac_path_SED" || continue +# Check for GNU ac_path_SED and select it if it is found. + # Check for GNU $ac_path_SED +case `"$ac_path_SED" --version 2>&1` in +*GNU*) + ac_cv_path_SED="$ac_path_SED" ac_path_SED_found=:;; +*) + ac_count=0 + $as_echo_n 0123456789 >"conftest.in" + while : + do + cat "conftest.in" "conftest.in" >"conftest.tmp" + mv "conftest.tmp" "conftest.in" + cp "conftest.in" "conftest.nl" + $as_echo '' >> "conftest.nl" + "$ac_path_SED" -f conftest.sed < "conftest.nl" >"conftest.out" 2>/dev/null || break + diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break + as_fn_arith $ac_count + 1 && ac_count=$as_val + if test $ac_count -gt ${ac_path_SED_max-0}; then + # Best one so far, save it but keep looking for a better one + ac_cv_path_SED="$ac_path_SED" + ac_path_SED_max=$ac_count + fi + # 10*(2^10) chars as input seems more than enough + test $ac_count -gt 10 && break + done + rm -f conftest.in conftest.tmp conftest.nl conftest.out;; +esac + + $ac_path_SED_found && break 3 + done + done + done +IFS=$as_save_IFS + if test -z "$ac_cv_path_SED"; then + as_fn_error $? "no acceptable sed could be found in \$PATH" "$LINENO" 5 + fi +else + ac_cv_path_SED=$SED +fi + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_SED" >&5 +$as_echo "$ac_cv_path_SED" >&6; } + SED="$ac_cv_path_SED" + rm -f conftest.sed + +test -z "$SED" && SED=sed +Xsed="$SED -e 1s/^X//" + + + + + + + + + + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for grep that handles long lines and -e" >&5 +$as_echo_n "checking for grep that handles long lines and -e... " >&6; } +if ${ac_cv_path_GREP+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -z "$GREP"; then + ac_path_GREP_found=false + # Loop through the user's path and test for each of PROGNAME-LIST + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_prog in grep ggrep; do + for ac_exec_ext in '' $ac_executable_extensions; do + ac_path_GREP="$as_dir/$ac_prog$ac_exec_ext" + as_fn_executable_p "$ac_path_GREP" || continue +# Check for GNU ac_path_GREP and select it if it is found. + # Check for GNU $ac_path_GREP +case `"$ac_path_GREP" --version 2>&1` in +*GNU*) + ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_found=:;; +*) + ac_count=0 + $as_echo_n 0123456789 >"conftest.in" + while : + do + cat "conftest.in" "conftest.in" >"conftest.tmp" + mv "conftest.tmp" "conftest.in" + cp "conftest.in" "conftest.nl" + $as_echo 'GREP' >> "conftest.nl" + "$ac_path_GREP" -e 'GREP$' -e '-(cannot match)-' < "conftest.nl" >"conftest.out" 2>/dev/null || break + diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break + as_fn_arith $ac_count + 1 && ac_count=$as_val + if test $ac_count -gt ${ac_path_GREP_max-0}; then + # Best one so far, save it but keep looking for a better one + ac_cv_path_GREP="$ac_path_GREP" + ac_path_GREP_max=$ac_count + fi + # 10*(2^10) chars as input seems more than enough + test $ac_count -gt 10 && break + done + rm -f conftest.in conftest.tmp conftest.nl conftest.out;; +esac + + $ac_path_GREP_found && break 3 + done + done + done +IFS=$as_save_IFS + if test -z "$ac_cv_path_GREP"; then + as_fn_error $? "no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 + fi +else + ac_cv_path_GREP=$GREP +fi + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_GREP" >&5 +$as_echo "$ac_cv_path_GREP" >&6; } + GREP="$ac_cv_path_GREP" + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for egrep" >&5 +$as_echo_n "checking for egrep... " >&6; } +if ${ac_cv_path_EGREP+:} false; then : + $as_echo_n "(cached) " >&6 +else + if echo a | $GREP -E '(a|b)' >/dev/null 2>&1 + then ac_cv_path_EGREP="$GREP -E" + else + if test -z "$EGREP"; then + ac_path_EGREP_found=false + # Loop through the user's path and test for each of PROGNAME-LIST + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_prog in egrep; do + for ac_exec_ext in '' $ac_executable_extensions; do + ac_path_EGREP="$as_dir/$ac_prog$ac_exec_ext" + as_fn_executable_p "$ac_path_EGREP" || continue +# Check for GNU ac_path_EGREP and select it if it is found. + # Check for GNU $ac_path_EGREP +case `"$ac_path_EGREP" --version 2>&1` in +*GNU*) + ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_found=:;; +*) + ac_count=0 + $as_echo_n 0123456789 >"conftest.in" + while : + do + cat "conftest.in" "conftest.in" >"conftest.tmp" + mv "conftest.tmp" "conftest.in" + cp "conftest.in" "conftest.nl" + $as_echo 'EGREP' >> "conftest.nl" + "$ac_path_EGREP" 'EGREP$' < "conftest.nl" >"conftest.out" 2>/dev/null || break + diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break + as_fn_arith $ac_count + 1 && ac_count=$as_val + if test $ac_count -gt ${ac_path_EGREP_max-0}; then + # Best one so far, save it but keep looking for a better one + ac_cv_path_EGREP="$ac_path_EGREP" + ac_path_EGREP_max=$ac_count + fi + # 10*(2^10) chars as input seems more than enough + test $ac_count -gt 10 && break + done + rm -f conftest.in conftest.tmp conftest.nl conftest.out;; +esac + + $ac_path_EGREP_found && break 3 + done + done + done +IFS=$as_save_IFS + if test -z "$ac_cv_path_EGREP"; then + as_fn_error $? "no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 + fi +else + ac_cv_path_EGREP=$EGREP +fi + + fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_EGREP" >&5 +$as_echo "$ac_cv_path_EGREP" >&6; } + EGREP="$ac_cv_path_EGREP" + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for fgrep" >&5 +$as_echo_n "checking for fgrep... " >&6; } +if ${ac_cv_path_FGREP+:} false; then : + $as_echo_n "(cached) " >&6 +else + if echo 'ab*c' | $GREP -F 'ab*c' >/dev/null 2>&1 + then ac_cv_path_FGREP="$GREP -F" + else + if test -z "$FGREP"; then + ac_path_FGREP_found=false + # Loop through the user's path and test for each of PROGNAME-LIST + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_prog in fgrep; do + for ac_exec_ext in '' $ac_executable_extensions; do + ac_path_FGREP="$as_dir/$ac_prog$ac_exec_ext" + as_fn_executable_p "$ac_path_FGREP" || continue +# Check for GNU ac_path_FGREP and select it if it is found. + # Check for GNU $ac_path_FGREP +case `"$ac_path_FGREP" --version 2>&1` in +*GNU*) + ac_cv_path_FGREP="$ac_path_FGREP" ac_path_FGREP_found=:;; +*) + ac_count=0 + $as_echo_n 0123456789 >"conftest.in" + while : + do + cat "conftest.in" "conftest.in" >"conftest.tmp" + mv "conftest.tmp" "conftest.in" + cp "conftest.in" "conftest.nl" + $as_echo 'FGREP' >> "conftest.nl" + "$ac_path_FGREP" FGREP < "conftest.nl" >"conftest.out" 2>/dev/null || break + diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break + as_fn_arith $ac_count + 1 && ac_count=$as_val + if test $ac_count -gt ${ac_path_FGREP_max-0}; then + # Best one so far, save it but keep looking for a better one + ac_cv_path_FGREP="$ac_path_FGREP" + ac_path_FGREP_max=$ac_count + fi + # 10*(2^10) chars as input seems more than enough + test $ac_count -gt 10 && break + done + rm -f conftest.in conftest.tmp conftest.nl conftest.out;; +esac + + $ac_path_FGREP_found && break 3 + done + done + done +IFS=$as_save_IFS + if test -z "$ac_cv_path_FGREP"; then + as_fn_error $? "no acceptable fgrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 + fi +else + ac_cv_path_FGREP=$FGREP +fi + + fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_FGREP" >&5 +$as_echo "$ac_cv_path_FGREP" >&6; } + FGREP="$ac_cv_path_FGREP" + + +test -z "$GREP" && GREP=grep + + + + + + + + + + + + + + + + + + + +@%:@ Check whether --with-gnu-ld was given. +if test "${with_gnu_ld+set}" = set; then : + withval=$with_gnu_ld; test "$withval" = no || with_gnu_ld=yes +else + with_gnu_ld=no +fi + +ac_prog=ld +if test "$GCC" = yes; then + # Check if gcc -print-prog-name=ld gives a path. + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ld used by $CC" >&5 +$as_echo_n "checking for ld used by $CC... " >&6; } + case $host in + *-*-mingw*) + # gcc leaves a trailing carriage return which upsets mingw + ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;; + *) + ac_prog=`($CC -print-prog-name=ld) 2>&5` ;; + esac + case $ac_prog in + # Accept absolute paths. + [\\/]* | ?:[\\/]*) + re_direlt='/[^/][^/]*/\.\./' + # Canonicalize the pathname of ld + ac_prog=`$ECHO "$ac_prog"| $SED 's%\\\\%/%g'` + while $ECHO "$ac_prog" | $GREP "$re_direlt" > /dev/null 2>&1; do + ac_prog=`$ECHO $ac_prog| $SED "s%$re_direlt%/%"` + done + test -z "$LD" && LD="$ac_prog" + ;; + "") + # If it fails, then pretend we aren't using GCC. + ac_prog=ld + ;; + *) + # If it is relative, then search for the first ld in PATH. + with_gnu_ld=unknown + ;; + esac +elif test "$with_gnu_ld" = yes; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU ld" >&5 +$as_echo_n "checking for GNU ld... " >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for non-GNU ld" >&5 +$as_echo_n "checking for non-GNU ld... " >&6; } +fi +if ${lt_cv_path_LD+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -z "$LD"; then + lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR + for ac_dir in $PATH; do + IFS="$lt_save_ifs" + test -z "$ac_dir" && ac_dir=. + if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then + lt_cv_path_LD="$ac_dir/$ac_prog" + # Check to see if the program is GNU ld. I'd rather use --version, + # but apparently some variants of GNU ld only accept -v. + # Break only if it was the GNU/non-GNU ld that we prefer. + case `"$lt_cv_path_LD" -v 2>&1 &5 +$as_echo "$LD" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi +test -z "$LD" && as_fn_error $? "no acceptable ld found in \$PATH" "$LINENO" 5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if the linker ($LD) is GNU ld" >&5 +$as_echo_n "checking if the linker ($LD) is GNU ld... " >&6; } +if ${lt_cv_prog_gnu_ld+:} false; then : + $as_echo_n "(cached) " >&6 +else + # I'd rather use --version here, but apparently some GNU lds only accept -v. +case `$LD -v 2>&1 &5 +$as_echo "$lt_cv_prog_gnu_ld" >&6; } +with_gnu_ld=$lt_cv_prog_gnu_ld + + + + + + + + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for BSD- or MS-compatible name lister (nm)" >&5 +$as_echo_n "checking for BSD- or MS-compatible name lister (nm)... " >&6; } +if ${lt_cv_path_NM+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$NM"; then + # Let the user override the test. + lt_cv_path_NM="$NM" +else + lt_nm_to_check="${ac_tool_prefix}nm" + if test -n "$ac_tool_prefix" && test "$build" = "$host"; then + lt_nm_to_check="$lt_nm_to_check nm" + fi + for lt_tmp_nm in $lt_nm_to_check; do + lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR + for ac_dir in $PATH /usr/ccs/bin/elf /usr/ccs/bin /usr/ucb /bin; do + IFS="$lt_save_ifs" + test -z "$ac_dir" && ac_dir=. + tmp_nm="$ac_dir/$lt_tmp_nm" + if test -f "$tmp_nm" || test -f "$tmp_nm$ac_exeext" ; then + # Check to see if the nm accepts a BSD-compat flag. + # Adding the `sed 1q' prevents false positives on HP-UX, which says: + # nm: unknown option "B" ignored + # Tru64's nm complains that /dev/null is an invalid object file + case `"$tmp_nm" -B /dev/null 2>&1 | sed '1q'` in + */dev/null* | *'Invalid file or object type'*) + lt_cv_path_NM="$tmp_nm -B" + break + ;; + *) + case `"$tmp_nm" -p /dev/null 2>&1 | sed '1q'` in + */dev/null*) + lt_cv_path_NM="$tmp_nm -p" + break + ;; + *) + lt_cv_path_NM=${lt_cv_path_NM="$tmp_nm"} # keep the first match, but + continue # so that we can try to find one that supports BSD flags + ;; + esac + ;; + esac + fi + done + IFS="$lt_save_ifs" + done + : ${lt_cv_path_NM=no} +fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_path_NM" >&5 +$as_echo "$lt_cv_path_NM" >&6; } +if test "$lt_cv_path_NM" != "no"; then + NM="$lt_cv_path_NM" +else + # Didn't find any BSD compatible name lister, look for dumpbin. + if test -n "$DUMPBIN"; then : + # Let the user override the test. + else + if test -n "$ac_tool_prefix"; then + for ac_prog in dumpbin "link -dump" + do + # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. +set dummy $ac_tool_prefix$ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_DUMPBIN+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$DUMPBIN"; then + ac_cv_prog_DUMPBIN="$DUMPBIN" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_DUMPBIN="$ac_tool_prefix$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +DUMPBIN=$ac_cv_prog_DUMPBIN +if test -n "$DUMPBIN"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DUMPBIN" >&5 +$as_echo "$DUMPBIN" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$DUMPBIN" && break + done +fi +if test -z "$DUMPBIN"; then + ac_ct_DUMPBIN=$DUMPBIN + for ac_prog in dumpbin "link -dump" +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_DUMPBIN+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_DUMPBIN"; then + ac_cv_prog_ac_ct_DUMPBIN="$ac_ct_DUMPBIN" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_DUMPBIN="$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_DUMPBIN=$ac_cv_prog_ac_ct_DUMPBIN +if test -n "$ac_ct_DUMPBIN"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DUMPBIN" >&5 +$as_echo "$ac_ct_DUMPBIN" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$ac_ct_DUMPBIN" && break +done + + if test "x$ac_ct_DUMPBIN" = x; then + DUMPBIN=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + DUMPBIN=$ac_ct_DUMPBIN + fi +fi + + case `$DUMPBIN -symbols /dev/null 2>&1 | sed '1q'` in + *COFF*) + DUMPBIN="$DUMPBIN -symbols" + ;; + *) + DUMPBIN=: + ;; + esac + fi + + if test "$DUMPBIN" != ":"; then + NM="$DUMPBIN" + fi +fi +test -z "$NM" && NM=nm + + + + + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking the name lister ($NM) interface" >&5 +$as_echo_n "checking the name lister ($NM) interface... " >&6; } +if ${lt_cv_nm_interface+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_nm_interface="BSD nm" + echo "int some_variable = 0;" > conftest.$ac_ext + (eval echo "\"\$as_me:$LINENO: $ac_compile\"" >&5) + (eval "$ac_compile" 2>conftest.err) + cat conftest.err >&5 + (eval echo "\"\$as_me:$LINENO: $NM \\\"conftest.$ac_objext\\\"\"" >&5) + (eval "$NM \"conftest.$ac_objext\"" 2>conftest.err > conftest.out) + cat conftest.err >&5 + (eval echo "\"\$as_me:$LINENO: output\"" >&5) + cat conftest.out >&5 + if $GREP 'External.*some_variable' conftest.out > /dev/null; then + lt_cv_nm_interface="MS dumpbin" + fi + rm -f conftest* +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_nm_interface" >&5 +$as_echo "$lt_cv_nm_interface" >&6; } + +# find the maximum length of command line arguments +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking the maximum length of command line arguments" >&5 +$as_echo_n "checking the maximum length of command line arguments... " >&6; } +if ${lt_cv_sys_max_cmd_len+:} false; then : + $as_echo_n "(cached) " >&6 +else + i=0 + teststring="ABCD" + + case $build_os in + msdosdjgpp*) + # On DJGPP, this test can blow up pretty badly due to problems in libc + # (any single argument exceeding 2000 bytes causes a buffer overrun + # during glob expansion). Even if it were fixed, the result of this + # check would be larger than it should be. + lt_cv_sys_max_cmd_len=12288; # 12K is about right + ;; + + gnu*) + # Under GNU Hurd, this test is not required because there is + # no limit to the length of command line arguments. + # Libtool will interpret -1 as no limit whatsoever + lt_cv_sys_max_cmd_len=-1; + ;; + + cygwin* | mingw* | cegcc*) + # On Win9x/ME, this test blows up -- it succeeds, but takes + # about 5 minutes as the teststring grows exponentially. + # Worse, since 9x/ME are not pre-emptively multitasking, + # you end up with a "frozen" computer, even though with patience + # the test eventually succeeds (with a max line length of 256k). + # Instead, let's just punt: use the minimum linelength reported by + # all of the supported platforms: 8192 (on NT/2K/XP). + lt_cv_sys_max_cmd_len=8192; + ;; + + mint*) + # On MiNT this can take a long time and run out of memory. + lt_cv_sys_max_cmd_len=8192; + ;; + + amigaos*) + # On AmigaOS with pdksh, this test takes hours, literally. + # So we just punt and use a minimum line length of 8192. + lt_cv_sys_max_cmd_len=8192; + ;; + + netbsd* | freebsd* | openbsd* | darwin* | dragonfly*) + # This has been around since 386BSD, at least. Likely further. + if test -x /sbin/sysctl; then + lt_cv_sys_max_cmd_len=`/sbin/sysctl -n kern.argmax` + elif test -x /usr/sbin/sysctl; then + lt_cv_sys_max_cmd_len=`/usr/sbin/sysctl -n kern.argmax` + else + lt_cv_sys_max_cmd_len=65536 # usable default for all BSDs + fi + # And add a safety zone + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` + ;; + + interix*) + # We know the value 262144 and hardcode it with a safety zone (like BSD) + lt_cv_sys_max_cmd_len=196608 + ;; + + os2*) + # The test takes a long time on OS/2. + lt_cv_sys_max_cmd_len=8192 + ;; + + osf*) + # Dr. Hans Ekkehard Plesser reports seeing a kernel panic running configure + # due to this test when exec_disable_arg_limit is 1 on Tru64. It is not + # nice to cause kernel panics so lets avoid the loop below. + # First set a reasonable default. + lt_cv_sys_max_cmd_len=16384 + # + if test -x /sbin/sysconfig; then + case `/sbin/sysconfig -q proc exec_disable_arg_limit` in + *1*) lt_cv_sys_max_cmd_len=-1 ;; + esac + fi + ;; + sco3.2v5*) + lt_cv_sys_max_cmd_len=102400 + ;; + sysv5* | sco5v6* | sysv4.2uw2*) + kargmax=`grep ARG_MAX /etc/conf/cf.d/stune 2>/dev/null` + if test -n "$kargmax"; then + lt_cv_sys_max_cmd_len=`echo $kargmax | sed 's/.*[ ]//'` + else + lt_cv_sys_max_cmd_len=32768 + fi + ;; + *) + lt_cv_sys_max_cmd_len=`(getconf ARG_MAX) 2> /dev/null` + if test -n "$lt_cv_sys_max_cmd_len"; then + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` + else + # Make teststring a little bigger before we do anything with it. + # a 1K string should be a reasonable start. + for i in 1 2 3 4 5 6 7 8 ; do + teststring=$teststring$teststring + done + SHELL=${SHELL-${CONFIG_SHELL-/bin/sh}} + # If test is not a shell built-in, we'll probably end up computing a + # maximum length that is only half of the actual maximum length, but + # we can't tell. + while { test "X"`env echo "$teststring$teststring" 2>/dev/null` \ + = "X$teststring$teststring"; } >/dev/null 2>&1 && + test $i != 17 # 1/2 MB should be enough + do + i=`expr $i + 1` + teststring=$teststring$teststring + done + # Only check the string length outside the loop. + lt_cv_sys_max_cmd_len=`expr "X$teststring" : ".*" 2>&1` + teststring= + # Add a significant safety factor because C++ compilers can tack on + # massive amounts of additional arguments before passing them to the + # linker. It appears as though 1/2 is a usable value. + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 2` + fi + ;; + esac + +fi + +if test -n $lt_cv_sys_max_cmd_len ; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_sys_max_cmd_len" >&5 +$as_echo "$lt_cv_sys_max_cmd_len" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: none" >&5 +$as_echo "none" >&6; } +fi +max_cmd_len=$lt_cv_sys_max_cmd_len + + + + + + +: ${CP="cp -f"} +: ${MV="mv -f"} +: ${RM="rm -f"} + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the shell understands some XSI constructs" >&5 +$as_echo_n "checking whether the shell understands some XSI constructs... " >&6; } +# Try some XSI features +xsi_shell=no +( _lt_dummy="a/b/c" + test "${_lt_dummy##*/},${_lt_dummy%/*},${_lt_dummy#??}"${_lt_dummy%"$_lt_dummy"}, \ + = c,a/b,b/c, \ + && eval 'test $(( 1 + 1 )) -eq 2 \ + && test "${#_lt_dummy}" -eq 5' ) >/dev/null 2>&1 \ + && xsi_shell=yes +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $xsi_shell" >&5 +$as_echo "$xsi_shell" >&6; } + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the shell understands \"+=\"" >&5 +$as_echo_n "checking whether the shell understands \"+=\"... " >&6; } +lt_shell_append=no +( foo=bar; set foo baz; eval "$1+=\$2" && test "$foo" = barbaz ) \ + >/dev/null 2>&1 \ + && lt_shell_append=yes +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_shell_append" >&5 +$as_echo "$lt_shell_append" >&6; } + + +if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then + lt_unset=unset +else + lt_unset=false +fi + + + + + +# test EBCDIC or ASCII +case `echo X|tr X '\101'` in + A) # ASCII based system + # \n is not interpreted correctly by Solaris 8 /usr/ucb/tr + lt_SP2NL='tr \040 \012' + lt_NL2SP='tr \015\012 \040\040' + ;; + *) # EBCDIC based system + lt_SP2NL='tr \100 \n' + lt_NL2SP='tr \r\n \100\100' + ;; +esac + + + + + + + + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to convert $build file names to $host format" >&5 +$as_echo_n "checking how to convert $build file names to $host format... " >&6; } +if ${lt_cv_to_host_file_cmd+:} false; then : + $as_echo_n "(cached) " >&6 +else + case $host in + *-*-mingw* ) + case $build in + *-*-mingw* ) # actually msys + lt_cv_to_host_file_cmd=func_convert_file_msys_to_w32 + ;; + *-*-cygwin* ) + lt_cv_to_host_file_cmd=func_convert_file_cygwin_to_w32 + ;; + * ) # otherwise, assume *nix + lt_cv_to_host_file_cmd=func_convert_file_nix_to_w32 + ;; + esac + ;; + *-*-cygwin* ) + case $build in + *-*-mingw* ) # actually msys + lt_cv_to_host_file_cmd=func_convert_file_msys_to_cygwin + ;; + *-*-cygwin* ) + lt_cv_to_host_file_cmd=func_convert_file_noop + ;; + * ) # otherwise, assume *nix + lt_cv_to_host_file_cmd=func_convert_file_nix_to_cygwin + ;; + esac + ;; + * ) # unhandled hosts (and "normal" native builds) + lt_cv_to_host_file_cmd=func_convert_file_noop + ;; +esac + +fi + +to_host_file_cmd=$lt_cv_to_host_file_cmd +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_to_host_file_cmd" >&5 +$as_echo "$lt_cv_to_host_file_cmd" >&6; } + + + + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to convert $build file names to toolchain format" >&5 +$as_echo_n "checking how to convert $build file names to toolchain format... " >&6; } +if ${lt_cv_to_tool_file_cmd+:} false; then : + $as_echo_n "(cached) " >&6 +else + #assume ordinary cross tools, or native build. +lt_cv_to_tool_file_cmd=func_convert_file_noop +case $host in + *-*-mingw* ) + case $build in + *-*-mingw* ) # actually msys + lt_cv_to_tool_file_cmd=func_convert_file_msys_to_w32 + ;; + esac + ;; +esac + +fi + +to_tool_file_cmd=$lt_cv_to_tool_file_cmd +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_to_tool_file_cmd" >&5 +$as_echo "$lt_cv_to_tool_file_cmd" >&6; } + + + + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $LD option to reload object files" >&5 +$as_echo_n "checking for $LD option to reload object files... " >&6; } +if ${lt_cv_ld_reload_flag+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_ld_reload_flag='-r' +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_reload_flag" >&5 +$as_echo "$lt_cv_ld_reload_flag" >&6; } +reload_flag=$lt_cv_ld_reload_flag +case $reload_flag in +"" | " "*) ;; +*) reload_flag=" $reload_flag" ;; +esac +reload_cmds='$LD$reload_flag -o $output$reload_objs' +case $host_os in + cygwin* | mingw* | pw32* | cegcc*) + if test "$GCC" != yes; then + reload_cmds=false + fi + ;; + darwin*) + if test "$GCC" = yes; then + reload_cmds='$LTCC $LTCFLAGS -nostdlib ${wl}-r -o $output$reload_objs' + else + reload_cmds='$LD$reload_flag -o $output$reload_objs' + fi + ;; +esac + + + + + + + + + +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}objdump", so it can be a program name with args. +set dummy ${ac_tool_prefix}objdump; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_OBJDUMP+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$OBJDUMP"; then + ac_cv_prog_OBJDUMP="$OBJDUMP" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_OBJDUMP="${ac_tool_prefix}objdump" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +OBJDUMP=$ac_cv_prog_OBJDUMP +if test -n "$OBJDUMP"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OBJDUMP" >&5 +$as_echo "$OBJDUMP" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_OBJDUMP"; then + ac_ct_OBJDUMP=$OBJDUMP + # Extract the first word of "objdump", so it can be a program name with args. +set dummy objdump; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_OBJDUMP+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_OBJDUMP"; then + ac_cv_prog_ac_ct_OBJDUMP="$ac_ct_OBJDUMP" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_OBJDUMP="objdump" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_OBJDUMP=$ac_cv_prog_ac_ct_OBJDUMP +if test -n "$ac_ct_OBJDUMP"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OBJDUMP" >&5 +$as_echo "$ac_ct_OBJDUMP" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_OBJDUMP" = x; then + OBJDUMP="false" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + OBJDUMP=$ac_ct_OBJDUMP + fi +else + OBJDUMP="$ac_cv_prog_OBJDUMP" +fi + +test -z "$OBJDUMP" && OBJDUMP=objdump + + + + + + + + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to recognize dependent libraries" >&5 +$as_echo_n "checking how to recognize dependent libraries... " >&6; } +if ${lt_cv_deplibs_check_method+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_file_magic_cmd='$MAGIC_CMD' +lt_cv_file_magic_test_file= +lt_cv_deplibs_check_method='unknown' +# Need to set the preceding variable on all platforms that support +# interlibrary dependencies. +# 'none' -- dependencies not supported. +# `unknown' -- same as none, but documents that we really don't know. +# 'pass_all' -- all dependencies passed with no checks. +# 'test_compile' -- check by making test program. +# 'file_magic [[regex]]' -- check by looking for files in library path +# which responds to the $file_magic_cmd with a given extended regex. +# If you have `file' or equivalent on your system and you're not sure +# whether `pass_all' will *always* work, you probably want this one. + +case $host_os in +aix[4-9]*) + lt_cv_deplibs_check_method=pass_all + ;; + +beos*) + lt_cv_deplibs_check_method=pass_all + ;; + +bsdi[45]*) + lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (shared object|dynamic lib)' + lt_cv_file_magic_cmd='/usr/bin/file -L' + lt_cv_file_magic_test_file=/shlib/libc.so + ;; + +cygwin*) + # func_win32_libid is a shell function defined in ltmain.sh + lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL' + lt_cv_file_magic_cmd='func_win32_libid' + ;; + +mingw* | pw32*) + # Base MSYS/MinGW do not provide the 'file' command needed by + # func_win32_libid shell function, so use a weaker test based on 'objdump', + # unless we find 'file', for example because we are cross-compiling. + # func_win32_libid assumes BSD nm, so disallow it if using MS dumpbin. + if ( test "$lt_cv_nm_interface" = "BSD nm" && file / ) >/dev/null 2>&1; then + lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL' + lt_cv_file_magic_cmd='func_win32_libid' + else + # Keep this pattern in sync with the one in func_win32_libid. + lt_cv_deplibs_check_method='file_magic file format (pei*-i386(.*architecture: i386)?|pe-arm-wince|pe-x86-64)' + lt_cv_file_magic_cmd='$OBJDUMP -f' + fi + ;; + +cegcc*) + # use the weaker test based on 'objdump'. See mingw*. + lt_cv_deplibs_check_method='file_magic file format pe-arm-.*little(.*architecture: arm)?' + lt_cv_file_magic_cmd='$OBJDUMP -f' + ;; + +darwin* | rhapsody*) + lt_cv_deplibs_check_method=pass_all + ;; + +freebsd* | dragonfly*) + if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then + case $host_cpu in + i*86 ) + # Not sure whether the presence of OpenBSD here was a mistake. + # Let's accept both of them until this is cleared up. + lt_cv_deplibs_check_method='file_magic (FreeBSD|OpenBSD|DragonFly)/i[3-9]86 (compact )?demand paged shared library' + lt_cv_file_magic_cmd=/usr/bin/file + lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*` + ;; + esac + else + lt_cv_deplibs_check_method=pass_all + fi + ;; + +gnu*) + lt_cv_deplibs_check_method=pass_all + ;; + +haiku*) + lt_cv_deplibs_check_method=pass_all + ;; + +hpux10.20* | hpux11*) + lt_cv_file_magic_cmd=/usr/bin/file + case $host_cpu in + ia64*) + lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF-[0-9][0-9]) shared object file - IA64' + lt_cv_file_magic_test_file=/usr/lib/hpux32/libc.so + ;; + hppa*64*) + lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF[ -][0-9][0-9])(-bit)?( [LM]SB)? shared object( file)?[, -]* PA-RISC [0-9]\.[0-9]' + lt_cv_file_magic_test_file=/usr/lib/pa20_64/libc.sl + ;; + *) + lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|PA-RISC[0-9]\.[0-9]) shared library' + lt_cv_file_magic_test_file=/usr/lib/libc.sl + ;; + esac + ;; + +interix[3-9]*) + # PIC code is broken on Interix 3.x, that's why |\.a not |_pic\.a here + lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so|\.a)$' + ;; + +irix5* | irix6* | nonstopux*) + case $LD in + *-32|*"-32 ") libmagic=32-bit;; + *-n32|*"-n32 ") libmagic=N32;; + *-64|*"-64 ") libmagic=64-bit;; + *) libmagic=never-match;; + esac + lt_cv_deplibs_check_method=pass_all + ;; + +# This must be glibc/ELF. +linux* | k*bsd*-gnu | kopensolaris*-gnu) + lt_cv_deplibs_check_method=pass_all + ;; + +netbsd* | netbsdelf*-gnu) + if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then + lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|_pic\.a)$' + else + lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so|_pic\.a)$' + fi + ;; + +newos6*) + lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (executable|dynamic lib)' + lt_cv_file_magic_cmd=/usr/bin/file + lt_cv_file_magic_test_file=/usr/lib/libnls.so + ;; + +*nto* | *qnx*) + lt_cv_deplibs_check_method=pass_all + ;; + +openbsd*) + if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then + lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|\.so|_pic\.a)$' + else + lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|_pic\.a)$' + fi + ;; + +osf3* | osf4* | osf5*) + lt_cv_deplibs_check_method=pass_all + ;; + +rdos*) + lt_cv_deplibs_check_method=pass_all + ;; + +solaris*) + lt_cv_deplibs_check_method=pass_all + ;; + +sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) + lt_cv_deplibs_check_method=pass_all + ;; + +sysv4 | sysv4.3*) + case $host_vendor in + motorola) + lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (shared object|dynamic lib) M[0-9][0-9]* Version [0-9]' + lt_cv_file_magic_test_file=`echo /usr/lib/libc.so*` + ;; + ncr) + lt_cv_deplibs_check_method=pass_all + ;; + sequent) + lt_cv_file_magic_cmd='/bin/file' + lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [LM]SB (shared object|dynamic lib )' + ;; + sni) + lt_cv_file_magic_cmd='/bin/file' + lt_cv_deplibs_check_method="file_magic ELF [0-9][0-9]*-bit [LM]SB dynamic lib" + lt_cv_file_magic_test_file=/lib/libc.so + ;; + siemens) + lt_cv_deplibs_check_method=pass_all + ;; + pc) + lt_cv_deplibs_check_method=pass_all + ;; + esac + ;; + +tpf*) + lt_cv_deplibs_check_method=pass_all + ;; +esac + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_deplibs_check_method" >&5 +$as_echo "$lt_cv_deplibs_check_method" >&6; } + +file_magic_glob= +want_nocaseglob=no +if test "$build" = "$host"; then + case $host_os in + mingw* | pw32*) + if ( shopt | grep nocaseglob ) >/dev/null 2>&1; then + want_nocaseglob=yes + else + file_magic_glob=`echo aAbBcCdDeEfFgGhHiIjJkKlLmMnNoOpPqQrRsStTuUvVwWxXyYzZ | $SED -e "s/\(..\)/s\/[\1]\/[\1]\/g;/g"` + fi + ;; + esac +fi + +file_magic_cmd=$lt_cv_file_magic_cmd +deplibs_check_method=$lt_cv_deplibs_check_method +test -z "$deplibs_check_method" && deplibs_check_method=unknown + + + + + + + + + + + + + + + + + + + + + + +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}dlltool", so it can be a program name with args. +set dummy ${ac_tool_prefix}dlltool; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_DLLTOOL+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$DLLTOOL"; then + ac_cv_prog_DLLTOOL="$DLLTOOL" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_DLLTOOL="${ac_tool_prefix}dlltool" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +DLLTOOL=$ac_cv_prog_DLLTOOL +if test -n "$DLLTOOL"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DLLTOOL" >&5 +$as_echo "$DLLTOOL" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_DLLTOOL"; then + ac_ct_DLLTOOL=$DLLTOOL + # Extract the first word of "dlltool", so it can be a program name with args. +set dummy dlltool; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_DLLTOOL+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_DLLTOOL"; then + ac_cv_prog_ac_ct_DLLTOOL="$ac_ct_DLLTOOL" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_DLLTOOL="dlltool" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_DLLTOOL=$ac_cv_prog_ac_ct_DLLTOOL +if test -n "$ac_ct_DLLTOOL"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DLLTOOL" >&5 +$as_echo "$ac_ct_DLLTOOL" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_DLLTOOL" = x; then + DLLTOOL="false" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + DLLTOOL=$ac_ct_DLLTOOL + fi +else + DLLTOOL="$ac_cv_prog_DLLTOOL" +fi + +test -z "$DLLTOOL" && DLLTOOL=dlltool + + + + + + + + + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to associate runtime and link libraries" >&5 +$as_echo_n "checking how to associate runtime and link libraries... " >&6; } +if ${lt_cv_sharedlib_from_linklib_cmd+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_sharedlib_from_linklib_cmd='unknown' + +case $host_os in +cygwin* | mingw* | pw32* | cegcc*) + # two different shell functions defined in ltmain.sh + # decide which to use based on capabilities of $DLLTOOL + case `$DLLTOOL --help 2>&1` in + *--identify-strict*) + lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib + ;; + *) + lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib_fallback + ;; + esac + ;; +*) + # fallback: assume linklib IS sharedlib + lt_cv_sharedlib_from_linklib_cmd="$ECHO" + ;; +esac + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_sharedlib_from_linklib_cmd" >&5 +$as_echo "$lt_cv_sharedlib_from_linklib_cmd" >&6; } +sharedlib_from_linklib_cmd=$lt_cv_sharedlib_from_linklib_cmd +test -z "$sharedlib_from_linklib_cmd" && sharedlib_from_linklib_cmd=$ECHO + + + + + + + + +if test -n "$ac_tool_prefix"; then + for ac_prog in ar + do + # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. +set dummy $ac_tool_prefix$ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_AR+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$AR"; then + ac_cv_prog_AR="$AR" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_AR="$ac_tool_prefix$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +AR=$ac_cv_prog_AR +if test -n "$AR"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AR" >&5 +$as_echo "$AR" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$AR" && break + done +fi +if test -z "$AR"; then + ac_ct_AR=$AR + for ac_prog in ar +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_AR+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_AR"; then + ac_cv_prog_ac_ct_AR="$ac_ct_AR" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_AR="$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_AR=$ac_cv_prog_ac_ct_AR +if test -n "$ac_ct_AR"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_AR" >&5 +$as_echo "$ac_ct_AR" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$ac_ct_AR" && break +done + + if test "x$ac_ct_AR" = x; then + AR="false" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + AR=$ac_ct_AR + fi +fi + +: ${AR=ar} +: ${AR_FLAGS=cru} + + + + + + + + + + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for archiver @FILE support" >&5 +$as_echo_n "checking for archiver @FILE support... " >&6; } +if ${lt_cv_ar_at_file+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_ar_at_file=no + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + echo conftest.$ac_objext > conftest.lst + lt_ar_try='$AR $AR_FLAGS libconftest.a @conftest.lst >&5' + { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$lt_ar_try\""; } >&5 + (eval $lt_ar_try) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + if test "$ac_status" -eq 0; then + # Ensure the archiver fails upon bogus file names. + rm -f conftest.$ac_objext libconftest.a + { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$lt_ar_try\""; } >&5 + (eval $lt_ar_try) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + if test "$ac_status" -ne 0; then + lt_cv_ar_at_file=@ + fi + fi + rm -f conftest.* libconftest.a + +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ar_at_file" >&5 +$as_echo "$lt_cv_ar_at_file" >&6; } + +if test "x$lt_cv_ar_at_file" = xno; then + archiver_list_spec= +else + archiver_list_spec=$lt_cv_ar_at_file +fi + + + + + + + +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args. +set dummy ${ac_tool_prefix}strip; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_STRIP+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$STRIP"; then + ac_cv_prog_STRIP="$STRIP" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_STRIP="${ac_tool_prefix}strip" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +STRIP=$ac_cv_prog_STRIP +if test -n "$STRIP"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $STRIP" >&5 +$as_echo "$STRIP" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_STRIP"; then + ac_ct_STRIP=$STRIP + # Extract the first word of "strip", so it can be a program name with args. +set dummy strip; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_STRIP+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_STRIP"; then + ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_STRIP="strip" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP +if test -n "$ac_ct_STRIP"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP" >&5 +$as_echo "$ac_ct_STRIP" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_STRIP" = x; then + STRIP=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + STRIP=$ac_ct_STRIP + fi +else + STRIP="$ac_cv_prog_STRIP" +fi + +test -z "$STRIP" && STRIP=: + + + + + + +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args. +set dummy ${ac_tool_prefix}ranlib; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_RANLIB+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$RANLIB"; then + ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +RANLIB=$ac_cv_prog_RANLIB +if test -n "$RANLIB"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $RANLIB" >&5 +$as_echo "$RANLIB" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_RANLIB"; then + ac_ct_RANLIB=$RANLIB + # Extract the first word of "ranlib", so it can be a program name with args. +set dummy ranlib; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_RANLIB+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_RANLIB"; then + ac_cv_prog_ac_ct_RANLIB="$ac_ct_RANLIB" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_RANLIB="ranlib" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_RANLIB=$ac_cv_prog_ac_ct_RANLIB +if test -n "$ac_ct_RANLIB"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_RANLIB" >&5 +$as_echo "$ac_ct_RANLIB" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_RANLIB" = x; then + RANLIB=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + RANLIB=$ac_ct_RANLIB + fi +else + RANLIB="$ac_cv_prog_RANLIB" +fi + +test -z "$RANLIB" && RANLIB=: + + + + + + +# Determine commands to create old-style static archives. +old_archive_cmds='$AR $AR_FLAGS $oldlib$oldobjs' +old_postinstall_cmds='chmod 644 $oldlib' +old_postuninstall_cmds= + +if test -n "$RANLIB"; then + case $host_os in + openbsd*) + old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB -t \$tool_oldlib" + ;; + *) + old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB \$tool_oldlib" + ;; + esac + old_archive_cmds="$old_archive_cmds~\$RANLIB \$tool_oldlib" +fi + +case $host_os in + darwin*) + lock_old_archive_extraction=yes ;; + *) + lock_old_archive_extraction=no ;; +esac + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +# If no C compiler was specified, use CC. +LTCC=${LTCC-"$CC"} + +# If no C compiler flags were specified, use CFLAGS. +LTCFLAGS=${LTCFLAGS-"$CFLAGS"} + +# Allow CC to be a program name with arguments. +compiler=$CC + + +# Check for command to grab the raw symbol name followed by C symbol from nm. +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking command to parse $NM output from $compiler object" >&5 +$as_echo_n "checking command to parse $NM output from $compiler object... " >&6; } +if ${lt_cv_sys_global_symbol_pipe+:} false; then : + $as_echo_n "(cached) " >&6 +else + +# These are sane defaults that work on at least a few old systems. +# [They come from Ultrix. What could be older than Ultrix?!! ;)] + +# Character class describing NM global symbol codes. +symcode='[BCDEGRST]' + +# Regexp to match symbols that can be accessed directly from C. +sympat='\([_A-Za-z][_A-Za-z0-9]*\)' + +# Define system-specific variables. +case $host_os in +aix*) + symcode='[BCDT]' + ;; +cygwin* | mingw* | pw32* | cegcc*) + symcode='[ABCDGISTW]' + ;; +hpux*) + if test "$host_cpu" = ia64; then + symcode='[ABCDEGRST]' + fi + ;; +irix* | nonstopux*) + symcode='[BCDEGRST]' + ;; +osf*) + symcode='[BCDEGQRST]' + ;; +solaris*) + symcode='[BDRT]' + ;; +sco3.2v5*) + symcode='[DT]' + ;; +sysv4.2uw2*) + symcode='[DT]' + ;; +sysv5* | sco5v6* | unixware* | OpenUNIX*) + symcode='[ABDT]' + ;; +sysv4) + symcode='[DFNSTU]' + ;; +esac + +# If we're using GNU nm, then use its standard symbol codes. +case `$NM -V 2>&1` in +*GNU* | *'with BFD'*) + symcode='[ABCDGIRSTW]' ;; +esac + +# Transform an extracted symbol line into a proper C declaration. +# Some systems (esp. on ia64) link data and code symbols differently, +# so use this general approach. +lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^T .* \(.*\)$/extern int \1();/p' -e 's/^$symcode* .* \(.*\)$/extern char \1;/p'" + +# Transform an extracted symbol line into symbol name and symbol address +lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([^ ]*\)[ ]*$/ {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([^ ]*\) \([^ ]*\)$/ {\"\2\", (void *) \&\2},/p'" +lt_cv_sys_global_symbol_to_c_name_address_lib_prefix="sed -n -e 's/^: \([^ ]*\)[ ]*$/ {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([^ ]*\) \(lib[^ ]*\)$/ {\"\2\", (void *) \&\2},/p' -e 's/^$symcode* \([^ ]*\) \([^ ]*\)$/ {\"lib\2\", (void *) \&\2},/p'" + +# Handle CRLF in mingw tool chain +opt_cr= +case $build_os in +mingw*) + opt_cr=`$ECHO 'x\{0,1\}' | tr x '\015'` # option cr in regexp + ;; +esac + +# Try without a prefix underscore, then with it. +for ac_symprfx in "" "_"; do + + # Transform symcode, sympat, and symprfx into a raw symbol and a C symbol. + symxfrm="\\1 $ac_symprfx\\2 \\2" + + # Write the raw and C identifiers. + if test "$lt_cv_nm_interface" = "MS dumpbin"; then + # Fake it for dumpbin and say T for any non-static function + # and D for any global variable. + # Also find C++ and __fastcall symbols from MSVC++, + # which start with @ or ?. + lt_cv_sys_global_symbol_pipe="$AWK '"\ +" {last_section=section; section=\$ 3};"\ +" /^COFF SYMBOL TABLE/{for(i in hide) delete hide[i]};"\ +" /Section length .*#relocs.*(pick any)/{hide[last_section]=1};"\ +" \$ 0!~/External *\|/{next};"\ +" / 0+ UNDEF /{next}; / UNDEF \([^|]\)*()/{next};"\ +" {if(hide[section]) next};"\ +" {f=0}; \$ 0~/\(\).*\|/{f=1}; {printf f ? \"T \" : \"D \"};"\ +" {split(\$ 0, a, /\||\r/); split(a[2], s)};"\ +" s[1]~/^[@?]/{print s[1], s[1]; next};"\ +" s[1]~prfx {split(s[1],t,\"@\"); print t[1], substr(t[1],length(prfx))}"\ +" ' prfx=^$ac_symprfx" + else + lt_cv_sys_global_symbol_pipe="sed -n -e 's/^.*[ ]\($symcode$symcode*\)[ ][ ]*$ac_symprfx$sympat$opt_cr$/$symxfrm/p'" + fi + lt_cv_sys_global_symbol_pipe="$lt_cv_sys_global_symbol_pipe | sed '/ __gnu_lto/d'" + + # Check to see that the pipe works correctly. + pipe_works=no + + rm -f conftest* + cat > conftest.$ac_ext <<_LT_EOF +#ifdef __cplusplus +extern "C" { +#endif +char nm_test_var; +void nm_test_func(void); +void nm_test_func(void){} +#ifdef __cplusplus +} +#endif +int main(){nm_test_var='a';nm_test_func();return(0);} +_LT_EOF + + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + # Now try to grab the symbols. + nlist=conftest.nm + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$NM conftest.$ac_objext \| "$lt_cv_sys_global_symbol_pipe" \> $nlist\""; } >&5 + (eval $NM conftest.$ac_objext \| "$lt_cv_sys_global_symbol_pipe" \> $nlist) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && test -s "$nlist"; then + # Try sorting and uniquifying the output. + if sort "$nlist" | uniq > "$nlist"T; then + mv -f "$nlist"T "$nlist" + else + rm -f "$nlist"T + fi + + # Make sure that we snagged all the symbols we need. + if $GREP ' nm_test_var$' "$nlist" >/dev/null; then + if $GREP ' nm_test_func$' "$nlist" >/dev/null; then + cat <<_LT_EOF > conftest.$ac_ext +/* Keep this code in sync between libtool.m4, ltmain, lt_system.h, and tests. */ +#if defined(_WIN32) || defined(__CYGWIN__) || defined(_WIN32_WCE) +/* DATA imports from DLLs on WIN32 con't be const, because runtime + relocations are performed -- see ld's documentation on pseudo-relocs. */ +# define LT@&t@_DLSYM_CONST +#elif defined(__osf__) +/* This system does not cope well with relocations in const data. */ +# define LT@&t@_DLSYM_CONST +#else +# define LT@&t@_DLSYM_CONST const +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +_LT_EOF + # Now generate the symbol file. + eval "$lt_cv_sys_global_symbol_to_cdecl"' < "$nlist" | $GREP -v main >> conftest.$ac_ext' + + cat <<_LT_EOF >> conftest.$ac_ext + +/* The mapping between symbol names and symbols. */ +LT@&t@_DLSYM_CONST struct { + const char *name; + void *address; +} +lt__PROGRAM__LTX_preloaded_symbols[] = +{ + { "@PROGRAM@", (void *) 0 }, +_LT_EOF + $SED "s/^$symcode$symcode* \(.*\) \(.*\)$/ {\"\2\", (void *) \&\2},/" < "$nlist" | $GREP -v main >> conftest.$ac_ext + cat <<\_LT_EOF >> conftest.$ac_ext + {0, (void *) 0} +}; + +/* This works around a problem in FreeBSD linker */ +#ifdef FREEBSD_WORKAROUND +static const void *lt_preloaded_setup() { + return lt__PROGRAM__LTX_preloaded_symbols; +} +#endif + +#ifdef __cplusplus +} +#endif +_LT_EOF + # Now try linking the two files. + mv conftest.$ac_objext conftstm.$ac_objext + lt_globsym_save_LIBS=$LIBS + lt_globsym_save_CFLAGS=$CFLAGS + LIBS="conftstm.$ac_objext" + CFLAGS="$CFLAGS$lt_prog_compiler_no_builtin_flag" + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5 + (eval $ac_link) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && test -s conftest${ac_exeext}; then + pipe_works=yes + fi + LIBS=$lt_globsym_save_LIBS + CFLAGS=$lt_globsym_save_CFLAGS + else + echo "cannot find nm_test_func in $nlist" >&5 + fi + else + echo "cannot find nm_test_var in $nlist" >&5 + fi + else + echo "cannot run $lt_cv_sys_global_symbol_pipe" >&5 + fi + else + echo "$progname: failed program was:" >&5 + cat conftest.$ac_ext >&5 + fi + rm -rf conftest* conftst* + + # Do not use the global_symbol_pipe unless it works. + if test "$pipe_works" = yes; then + break + else + lt_cv_sys_global_symbol_pipe= + fi +done + +fi + +if test -z "$lt_cv_sys_global_symbol_pipe"; then + lt_cv_sys_global_symbol_to_cdecl= +fi +if test -z "$lt_cv_sys_global_symbol_pipe$lt_cv_sys_global_symbol_to_cdecl"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: failed" >&5 +$as_echo "failed" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: ok" >&5 +$as_echo "ok" >&6; } +fi + +# Response file support. +if test "$lt_cv_nm_interface" = "MS dumpbin"; then + nm_file_list_spec='@' +elif $NM --help 2>/dev/null | grep '[@]FILE' >/dev/null; then + nm_file_list_spec='@' +fi + + + + + + + + + + + + + + + + + + + + + + + + + + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for sysroot" >&5 +$as_echo_n "checking for sysroot... " >&6; } + +@%:@ Check whether --with-sysroot was given. +if test "${with_sysroot+set}" = set; then : + withval=$with_sysroot; +else + with_sysroot=no +fi + + +lt_sysroot= +case ${with_sysroot} in #( + yes) + if test "$GCC" = yes; then + lt_sysroot=`$CC --print-sysroot 2>/dev/null` + fi + ;; #( + /*) + lt_sysroot=`echo "$with_sysroot" | sed -e "$sed_quote_subst"` + ;; #( + no|'') + ;; #( + *) + { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${with_sysroot}" >&5 +$as_echo "${with_sysroot}" >&6; } + as_fn_error $? "The sysroot must be an absolute path." "$LINENO" 5 + ;; +esac + + { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${lt_sysroot:-no}" >&5 +$as_echo "${lt_sysroot:-no}" >&6; } + + + + + +@%:@ Check whether --enable-libtool-lock was given. +if test "${enable_libtool_lock+set}" = set; then : + enableval=$enable_libtool_lock; +fi + +test "x$enable_libtool_lock" != xno && enable_libtool_lock=yes + +# Some flags need to be propagated to the compiler or linker for good +# libtool support. +case $host in +ia64-*-hpux*) + # Find out which ABI we are using. + echo 'int i;' > conftest.$ac_ext + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + case `/usr/bin/file conftest.$ac_objext` in + *ELF-32*) + HPUX_IA64_MODE="32" + ;; + *ELF-64*) + HPUX_IA64_MODE="64" + ;; + esac + fi + rm -rf conftest* + ;; +*-*-irix6*) + # Find out which ABI we are using. + echo '#line '$LINENO' "configure"' > conftest.$ac_ext + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + if test "$lt_cv_prog_gnu_ld" = yes; then + case `/usr/bin/file conftest.$ac_objext` in + *32-bit*) + LD="${LD-ld} -melf32bsmip" + ;; + *N32*) + LD="${LD-ld} -melf32bmipn32" + ;; + *64-bit*) + LD="${LD-ld} -melf64bmip" + ;; + esac + else + case `/usr/bin/file conftest.$ac_objext` in + *32-bit*) + LD="${LD-ld} -32" + ;; + *N32*) + LD="${LD-ld} -n32" + ;; + *64-bit*) + LD="${LD-ld} -64" + ;; + esac + fi + fi + rm -rf conftest* + ;; + +x86_64-*kfreebsd*-gnu|x86_64-*linux*|ppc*-*linux*|powerpc*-*linux*| \ +s390*-*linux*|s390*-*tpf*|sparc*-*linux*) + # Find out which ABI we are using. + echo 'int i;' > conftest.$ac_ext + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + case `/usr/bin/file conftest.o` in + *32-bit*) + case $host in + x86_64-*kfreebsd*-gnu) + LD="${LD-ld} -m elf_i386_fbsd" + ;; + x86_64-*linux*) + LD="${LD-ld} -m elf_i386" + ;; + ppc64-*linux*|powerpc64-*linux*) + LD="${LD-ld} -m elf32ppclinux" + ;; + s390x-*linux*) + LD="${LD-ld} -m elf_s390" + ;; + sparc64-*linux*) + LD="${LD-ld} -m elf32_sparc" + ;; + esac + ;; + *64-bit*) + case $host in + x86_64-*kfreebsd*-gnu) + LD="${LD-ld} -m elf_x86_64_fbsd" + ;; + x86_64-*linux*) + LD="${LD-ld} -m elf_x86_64" + ;; + ppc*-*linux*|powerpc*-*linux*) + LD="${LD-ld} -m elf64ppc" + ;; + s390*-*linux*|s390*-*tpf*) + LD="${LD-ld} -m elf64_s390" + ;; + sparc*-*linux*) + LD="${LD-ld} -m elf64_sparc" + ;; + esac + ;; + esac + fi + rm -rf conftest* + ;; + +*-*-sco3.2v5*) + # On SCO OpenServer 5, we need -belf to get full-featured binaries. + SAVE_CFLAGS="$CFLAGS" + CFLAGS="$CFLAGS -belf" + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler needs -belf" >&5 +$as_echo_n "checking whether the C compiler needs -belf... " >&6; } +if ${lt_cv_cc_needs_belf+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + lt_cv_cc_needs_belf=yes +else + lt_cv_cc_needs_belf=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_cc_needs_belf" >&5 +$as_echo "$lt_cv_cc_needs_belf" >&6; } + if test x"$lt_cv_cc_needs_belf" != x"yes"; then + # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf + CFLAGS="$SAVE_CFLAGS" + fi + ;; +*-*solaris*) + # Find out which ABI we are using. + echo 'int i;' > conftest.$ac_ext + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + case `/usr/bin/file conftest.o` in + *64-bit*) + case $lt_cv_prog_gnu_ld in + yes*) + case $host in + i?86-*-solaris*) + LD="${LD-ld} -m elf_x86_64" + ;; + sparc*-*-solaris*) + LD="${LD-ld} -m elf64_sparc" + ;; + esac + # GNU ld 2.21 introduced _sol2 emulations. Use them if available. + if ${LD-ld} -V | grep _sol2 >/dev/null 2>&1; then + LD="${LD-ld}_sol2" + fi + ;; + *) + if ${LD-ld} -64 -r -o conftest2.o conftest.o >/dev/null 2>&1; then + LD="${LD-ld} -64" + fi + ;; + esac + ;; + esac + fi + rm -rf conftest* + ;; +esac + +need_locks="$enable_libtool_lock" + +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}mt", so it can be a program name with args. +set dummy ${ac_tool_prefix}mt; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_MANIFEST_TOOL+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$MANIFEST_TOOL"; then + ac_cv_prog_MANIFEST_TOOL="$MANIFEST_TOOL" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_MANIFEST_TOOL="${ac_tool_prefix}mt" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +MANIFEST_TOOL=$ac_cv_prog_MANIFEST_TOOL +if test -n "$MANIFEST_TOOL"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MANIFEST_TOOL" >&5 +$as_echo "$MANIFEST_TOOL" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_MANIFEST_TOOL"; then + ac_ct_MANIFEST_TOOL=$MANIFEST_TOOL + # Extract the first word of "mt", so it can be a program name with args. +set dummy mt; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_MANIFEST_TOOL+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_MANIFEST_TOOL"; then + ac_cv_prog_ac_ct_MANIFEST_TOOL="$ac_ct_MANIFEST_TOOL" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_MANIFEST_TOOL="mt" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_MANIFEST_TOOL=$ac_cv_prog_ac_ct_MANIFEST_TOOL +if test -n "$ac_ct_MANIFEST_TOOL"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_MANIFEST_TOOL" >&5 +$as_echo "$ac_ct_MANIFEST_TOOL" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_MANIFEST_TOOL" = x; then + MANIFEST_TOOL=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + MANIFEST_TOOL=$ac_ct_MANIFEST_TOOL + fi +else + MANIFEST_TOOL="$ac_cv_prog_MANIFEST_TOOL" +fi + +test -z "$MANIFEST_TOOL" && MANIFEST_TOOL=mt +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if $MANIFEST_TOOL is a manifest tool" >&5 +$as_echo_n "checking if $MANIFEST_TOOL is a manifest tool... " >&6; } +if ${lt_cv_path_mainfest_tool+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_path_mainfest_tool=no + echo "$as_me:$LINENO: $MANIFEST_TOOL '-?'" >&5 + $MANIFEST_TOOL '-?' 2>conftest.err > conftest.out + cat conftest.err >&5 + if $GREP 'Manifest Tool' conftest.out > /dev/null; then + lt_cv_path_mainfest_tool=yes + fi + rm -f conftest* +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_path_mainfest_tool" >&5 +$as_echo "$lt_cv_path_mainfest_tool" >&6; } +if test "x$lt_cv_path_mainfest_tool" != xyes; then + MANIFEST_TOOL=: +fi + + + + + + + case $host_os in + rhapsody* | darwin*) + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}dsymutil", so it can be a program name with args. +set dummy ${ac_tool_prefix}dsymutil; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_DSYMUTIL+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$DSYMUTIL"; then + ac_cv_prog_DSYMUTIL="$DSYMUTIL" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_DSYMUTIL="${ac_tool_prefix}dsymutil" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +DSYMUTIL=$ac_cv_prog_DSYMUTIL +if test -n "$DSYMUTIL"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DSYMUTIL" >&5 +$as_echo "$DSYMUTIL" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_DSYMUTIL"; then + ac_ct_DSYMUTIL=$DSYMUTIL + # Extract the first word of "dsymutil", so it can be a program name with args. +set dummy dsymutil; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_DSYMUTIL+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_DSYMUTIL"; then + ac_cv_prog_ac_ct_DSYMUTIL="$ac_ct_DSYMUTIL" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_DSYMUTIL="dsymutil" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_DSYMUTIL=$ac_cv_prog_ac_ct_DSYMUTIL +if test -n "$ac_ct_DSYMUTIL"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DSYMUTIL" >&5 +$as_echo "$ac_ct_DSYMUTIL" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_DSYMUTIL" = x; then + DSYMUTIL=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + DSYMUTIL=$ac_ct_DSYMUTIL + fi +else + DSYMUTIL="$ac_cv_prog_DSYMUTIL" +fi + + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}nmedit", so it can be a program name with args. +set dummy ${ac_tool_prefix}nmedit; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_NMEDIT+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$NMEDIT"; then + ac_cv_prog_NMEDIT="$NMEDIT" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_NMEDIT="${ac_tool_prefix}nmedit" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +NMEDIT=$ac_cv_prog_NMEDIT +if test -n "$NMEDIT"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $NMEDIT" >&5 +$as_echo "$NMEDIT" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_NMEDIT"; then + ac_ct_NMEDIT=$NMEDIT + # Extract the first word of "nmedit", so it can be a program name with args. +set dummy nmedit; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_NMEDIT+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_NMEDIT"; then + ac_cv_prog_ac_ct_NMEDIT="$ac_ct_NMEDIT" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_NMEDIT="nmedit" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_NMEDIT=$ac_cv_prog_ac_ct_NMEDIT +if test -n "$ac_ct_NMEDIT"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_NMEDIT" >&5 +$as_echo "$ac_ct_NMEDIT" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_NMEDIT" = x; then + NMEDIT=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + NMEDIT=$ac_ct_NMEDIT + fi +else + NMEDIT="$ac_cv_prog_NMEDIT" +fi + + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}lipo", so it can be a program name with args. +set dummy ${ac_tool_prefix}lipo; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_LIPO+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$LIPO"; then + ac_cv_prog_LIPO="$LIPO" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_LIPO="${ac_tool_prefix}lipo" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +LIPO=$ac_cv_prog_LIPO +if test -n "$LIPO"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LIPO" >&5 +$as_echo "$LIPO" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_LIPO"; then + ac_ct_LIPO=$LIPO + # Extract the first word of "lipo", so it can be a program name with args. +set dummy lipo; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_LIPO+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_LIPO"; then + ac_cv_prog_ac_ct_LIPO="$ac_ct_LIPO" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_LIPO="lipo" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_LIPO=$ac_cv_prog_ac_ct_LIPO +if test -n "$ac_ct_LIPO"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_LIPO" >&5 +$as_echo "$ac_ct_LIPO" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_LIPO" = x; then + LIPO=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + LIPO=$ac_ct_LIPO + fi +else + LIPO="$ac_cv_prog_LIPO" +fi + + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}otool", so it can be a program name with args. +set dummy ${ac_tool_prefix}otool; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_OTOOL+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$OTOOL"; then + ac_cv_prog_OTOOL="$OTOOL" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_OTOOL="${ac_tool_prefix}otool" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +OTOOL=$ac_cv_prog_OTOOL +if test -n "$OTOOL"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OTOOL" >&5 +$as_echo "$OTOOL" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_OTOOL"; then + ac_ct_OTOOL=$OTOOL + # Extract the first word of "otool", so it can be a program name with args. +set dummy otool; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_OTOOL+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_OTOOL"; then + ac_cv_prog_ac_ct_OTOOL="$ac_ct_OTOOL" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_OTOOL="otool" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_OTOOL=$ac_cv_prog_ac_ct_OTOOL +if test -n "$ac_ct_OTOOL"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OTOOL" >&5 +$as_echo "$ac_ct_OTOOL" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_OTOOL" = x; then + OTOOL=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + OTOOL=$ac_ct_OTOOL + fi +else + OTOOL="$ac_cv_prog_OTOOL" +fi + + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}otool64", so it can be a program name with args. +set dummy ${ac_tool_prefix}otool64; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_OTOOL64+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$OTOOL64"; then + ac_cv_prog_OTOOL64="$OTOOL64" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_OTOOL64="${ac_tool_prefix}otool64" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +OTOOL64=$ac_cv_prog_OTOOL64 +if test -n "$OTOOL64"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OTOOL64" >&5 +$as_echo "$OTOOL64" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_OTOOL64"; then + ac_ct_OTOOL64=$OTOOL64 + # Extract the first word of "otool64", so it can be a program name with args. +set dummy otool64; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_OTOOL64+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_OTOOL64"; then + ac_cv_prog_ac_ct_OTOOL64="$ac_ct_OTOOL64" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_OTOOL64="otool64" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_OTOOL64=$ac_cv_prog_ac_ct_OTOOL64 +if test -n "$ac_ct_OTOOL64"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OTOOL64" >&5 +$as_echo "$ac_ct_OTOOL64" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_OTOOL64" = x; then + OTOOL64=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + OTOOL64=$ac_ct_OTOOL64 + fi +else + OTOOL64="$ac_cv_prog_OTOOL64" +fi + + + + + + + + + + + + + + + + + + + + + + + + + + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -single_module linker flag" >&5 +$as_echo_n "checking for -single_module linker flag... " >&6; } +if ${lt_cv_apple_cc_single_mod+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_apple_cc_single_mod=no + if test -z "${LT_MULTI_MODULE}"; then + # By default we will add the -single_module flag. You can override + # by either setting the environment variable LT_MULTI_MODULE + # non-empty at configure time, or by adding -multi_module to the + # link flags. + rm -rf libconftest.dylib* + echo "int foo(void){return 1;}" > conftest.c + echo "$LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \ +-dynamiclib -Wl,-single_module conftest.c" >&5 + $LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \ + -dynamiclib -Wl,-single_module conftest.c 2>conftest.err + _lt_result=$? + # If there is a non-empty error log, and "single_module" + # appears in it, assume the flag caused a linker warning + if test -s conftest.err && $GREP single_module conftest.err; then + cat conftest.err >&5 + # Otherwise, if the output was created with a 0 exit code from + # the compiler, it worked. + elif test -f libconftest.dylib && test $_lt_result -eq 0; then + lt_cv_apple_cc_single_mod=yes + else + cat conftest.err >&5 + fi + rm -rf libconftest.dylib* + rm -f conftest.* + fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_apple_cc_single_mod" >&5 +$as_echo "$lt_cv_apple_cc_single_mod" >&6; } + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -exported_symbols_list linker flag" >&5 +$as_echo_n "checking for -exported_symbols_list linker flag... " >&6; } +if ${lt_cv_ld_exported_symbols_list+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_ld_exported_symbols_list=no + save_LDFLAGS=$LDFLAGS + echo "_main" > conftest.sym + LDFLAGS="$LDFLAGS -Wl,-exported_symbols_list,conftest.sym" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + lt_cv_ld_exported_symbols_list=yes +else + lt_cv_ld_exported_symbols_list=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + LDFLAGS="$save_LDFLAGS" + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_exported_symbols_list" >&5 +$as_echo "$lt_cv_ld_exported_symbols_list" >&6; } + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -force_load linker flag" >&5 +$as_echo_n "checking for -force_load linker flag... " >&6; } +if ${lt_cv_ld_force_load+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_ld_force_load=no + cat > conftest.c << _LT_EOF +int forced_loaded() { return 2;} +_LT_EOF + echo "$LTCC $LTCFLAGS -c -o conftest.o conftest.c" >&5 + $LTCC $LTCFLAGS -c -o conftest.o conftest.c 2>&5 + echo "$AR cru libconftest.a conftest.o" >&5 + $AR cru libconftest.a conftest.o 2>&5 + echo "$RANLIB libconftest.a" >&5 + $RANLIB libconftest.a 2>&5 + cat > conftest.c << _LT_EOF +int main() { return 0;} +_LT_EOF + echo "$LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a" >&5 + $LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a 2>conftest.err + _lt_result=$? + if test -s conftest.err && $GREP force_load conftest.err; then + cat conftest.err >&5 + elif test -f conftest && test $_lt_result -eq 0 && $GREP forced_load conftest >/dev/null 2>&1 ; then + lt_cv_ld_force_load=yes + else + cat conftest.err >&5 + fi + rm -f conftest.err libconftest.a conftest conftest.c + rm -rf conftest.dSYM + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_force_load" >&5 +$as_echo "$lt_cv_ld_force_load" >&6; } + case $host_os in + rhapsody* | darwin1.[012]) + _lt_dar_allow_undefined='${wl}-undefined ${wl}suppress' ;; + darwin1.*) + _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;; + darwin*) # darwin 5.x on + # if running on 10.5 or later, the deployment target defaults + # to the OS version, if on x86, and 10.4, the deployment + # target defaults to 10.4. Don't you love it? + case ${MACOSX_DEPLOYMENT_TARGET-10.0},$host in + 10.0,*86*-darwin8*|10.0,*-darwin[91]*) + _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;; + 10.[012]*) + _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;; + 10.*) + _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;; + esac + ;; + esac + if test "$lt_cv_apple_cc_single_mod" = "yes"; then + _lt_dar_single_mod='$single_module' + fi + if test "$lt_cv_ld_exported_symbols_list" = "yes"; then + _lt_dar_export_syms=' ${wl}-exported_symbols_list,$output_objdir/${libname}-symbols.expsym' + else + _lt_dar_export_syms='~$NMEDIT -s $output_objdir/${libname}-symbols.expsym ${lib}' + fi + if test "$DSYMUTIL" != ":" && test "$lt_cv_ld_force_load" = "no"; then + _lt_dsymutil='~$DSYMUTIL $lib || :' + else + _lt_dsymutil= + fi + ;; + esac + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C preprocessor" >&5 +$as_echo_n "checking how to run the C preprocessor... " >&6; } +# On Suns, sometimes $CPP names a directory. +if test -n "$CPP" && test -d "$CPP"; then + CPP= +fi +if test -z "$CPP"; then + if ${ac_cv_prog_CPP+:} false; then : + $as_echo_n "(cached) " >&6 +else + # Double quotes because CPP needs to be expanded + for CPP in "$CC -E" "$CC -E -traditional-cpp" "/lib/cpp" + do + ac_preproc_ok=false +for ac_c_preproc_warn_flag in '' yes +do + # Use a header file that comes with gcc, so configuring glibc + # with a fresh cross-compiler works. + # Prefer to if __STDC__ is defined, since + # exists even on freestanding compilers. + # On the NeXT, cc -E runs the code through the compiler's parser, + # not just through cpp. "Syntax error" is here to catch this case. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +@%:@ifdef __STDC__ +@%:@ include +@%:@else +@%:@ include +@%:@endif + Syntax error +_ACEOF +if ac_fn_c_try_cpp "$LINENO"; then : + +else + # Broken: fails on valid input. +continue +fi +rm -f conftest.err conftest.i conftest.$ac_ext + + # OK, works on sane cases. Now check whether nonexistent headers + # can be detected and how. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +@%:@include +_ACEOF +if ac_fn_c_try_cpp "$LINENO"; then : + # Broken: success on invalid input. +continue +else + # Passes both tests. +ac_preproc_ok=: +break +fi +rm -f conftest.err conftest.i conftest.$ac_ext + +done +# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. +rm -f conftest.i conftest.err conftest.$ac_ext +if $ac_preproc_ok; then : + break +fi + + done + ac_cv_prog_CPP=$CPP + +fi + CPP=$ac_cv_prog_CPP +else + ac_cv_prog_CPP=$CPP +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $CPP" >&5 +$as_echo "$CPP" >&6; } +ac_preproc_ok=false +for ac_c_preproc_warn_flag in '' yes +do + # Use a header file that comes with gcc, so configuring glibc + # with a fresh cross-compiler works. + # Prefer to if __STDC__ is defined, since + # exists even on freestanding compilers. + # On the NeXT, cc -E runs the code through the compiler's parser, + # not just through cpp. "Syntax error" is here to catch this case. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +@%:@ifdef __STDC__ +@%:@ include +@%:@else +@%:@ include +@%:@endif + Syntax error +_ACEOF +if ac_fn_c_try_cpp "$LINENO"; then : + +else + # Broken: fails on valid input. +continue +fi +rm -f conftest.err conftest.i conftest.$ac_ext + + # OK, works on sane cases. Now check whether nonexistent headers + # can be detected and how. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +@%:@include +_ACEOF +if ac_fn_c_try_cpp "$LINENO"; then : + # Broken: success on invalid input. +continue +else + # Passes both tests. +ac_preproc_ok=: +break +fi +rm -f conftest.err conftest.i conftest.$ac_ext + +done +# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. +rm -f conftest.i conftest.err conftest.$ac_ext +if $ac_preproc_ok; then : + +else + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "C preprocessor \"$CPP\" fails sanity check +See \`config.log' for more details" "$LINENO" 5; } +fi + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header files" >&5 +$as_echo_n "checking for ANSI C header files... " >&6; } +if ${ac_cv_header_stdc+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +#include +#include +#include + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_header_stdc=yes +else + ac_cv_header_stdc=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + +if test $ac_cv_header_stdc = yes; then + # SunOS 4.x string.h does not declare mem*, contrary to ANSI. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include + +_ACEOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + $EGREP "memchr" >/dev/null 2>&1; then : + +else + ac_cv_header_stdc=no +fi +rm -f conftest* + +fi + +if test $ac_cv_header_stdc = yes; then + # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include + +_ACEOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + $EGREP "free" >/dev/null 2>&1; then : + +else + ac_cv_header_stdc=no +fi +rm -f conftest* + +fi + +if test $ac_cv_header_stdc = yes; then + # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi. + if test "$cross_compiling" = yes; then : + : +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +#include +#if ((' ' & 0x0FF) == 0x020) +# define ISLOWER(c) ('a' <= (c) && (c) <= 'z') +# define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c)) +#else +# define ISLOWER(c) \ + (('a' <= (c) && (c) <= 'i') \ + || ('j' <= (c) && (c) <= 'r') \ + || ('s' <= (c) && (c) <= 'z')) +# define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c)) +#endif + +#define XOR(e, f) (((e) && !(f)) || (!(e) && (f))) +int +main () +{ + int i; + for (i = 0; i < 256; i++) + if (XOR (islower (i), ISLOWER (i)) + || toupper (i) != TOUPPER (i)) + return 2; + return 0; +} +_ACEOF +if ac_fn_c_try_run "$LINENO"; then : + +else + ac_cv_header_stdc=no +fi +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ + conftest.$ac_objext conftest.beam conftest.$ac_ext +fi + +fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdc" >&5 +$as_echo "$ac_cv_header_stdc" >&6; } +if test $ac_cv_header_stdc = yes; then + +$as_echo "@%:@define STDC_HEADERS 1" >>confdefs.h + +fi + +# On IRIX 5.3, sys/types and inttypes.h are conflicting. +for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \ + inttypes.h stdint.h unistd.h +do : + as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` +ac_fn_c_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default +" +if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : + cat >>confdefs.h <<_ACEOF +@%:@define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 +_ACEOF + +fi + +done + + +for ac_header in dlfcn.h +do : + ac_fn_c_check_header_compile "$LINENO" "dlfcn.h" "ac_cv_header_dlfcn_h" "$ac_includes_default +" +if test "x$ac_cv_header_dlfcn_h" = xyes; then : + cat >>confdefs.h <<_ACEOF +@%:@define HAVE_DLFCN_H 1 +_ACEOF + +fi + +done + + + + +func_stripname_cnf () +{ + case ${2} in + .*) func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%\\\\${2}\$%%"`;; + *) func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%${2}\$%%"`;; + esac +} # func_stripname_cnf + + + + + +# Set options + + + + enable_dlopen=no + + + enable_win32_dll=no + + + @%:@ Check whether --enable-shared was given. +if test "${enable_shared+set}" = set; then : + enableval=$enable_shared; p=${PACKAGE-default} + case $enableval in + yes) enable_shared=yes ;; + no) enable_shared=no ;; + *) + enable_shared=no + # Look at the argument we got. We use all the common list separators. + lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," + for pkg in $enableval; do + IFS="$lt_save_ifs" + if test "X$pkg" = "X$p"; then + enable_shared=yes + fi + done + IFS="$lt_save_ifs" + ;; + esac +else + enable_shared=yes +fi + + + + + + + + + + @%:@ Check whether --enable-static was given. +if test "${enable_static+set}" = set; then : + enableval=$enable_static; p=${PACKAGE-default} + case $enableval in + yes) enable_static=yes ;; + no) enable_static=no ;; + *) + enable_static=no + # Look at the argument we got. We use all the common list separators. + lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," + for pkg in $enableval; do + IFS="$lt_save_ifs" + if test "X$pkg" = "X$p"; then + enable_static=yes + fi + done + IFS="$lt_save_ifs" + ;; + esac +else + enable_static=yes +fi + + + + + + + + + + +@%:@ Check whether --with-pic was given. +if test "${with_pic+set}" = set; then : + withval=$with_pic; lt_p=${PACKAGE-default} + case $withval in + yes|no) pic_mode=$withval ;; + *) + pic_mode=default + # Look at the argument we got. We use all the common list separators. + lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," + for lt_pkg in $withval; do + IFS="$lt_save_ifs" + if test "X$lt_pkg" = "X$lt_p"; then + pic_mode=yes + fi + done + IFS="$lt_save_ifs" + ;; + esac +else + pic_mode=default +fi + + +test -z "$pic_mode" && pic_mode=default + + + + + + + + @%:@ Check whether --enable-fast-install was given. +if test "${enable_fast_install+set}" = set; then : + enableval=$enable_fast_install; p=${PACKAGE-default} + case $enableval in + yes) enable_fast_install=yes ;; + no) enable_fast_install=no ;; + *) + enable_fast_install=no + # Look at the argument we got. We use all the common list separators. + lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," + for pkg in $enableval; do + IFS="$lt_save_ifs" + if test "X$pkg" = "X$p"; then + enable_fast_install=yes + fi + done + IFS="$lt_save_ifs" + ;; + esac +else + enable_fast_install=yes +fi + + + + + + + + + + + +# This can be used to rebuild libtool when needed +LIBTOOL_DEPS="$ltmain" + +# Always use our own libtool. +LIBTOOL='$(SHELL) $(top_builddir)/libtool' + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +test -z "$LN_S" && LN_S="ln -s" + + + + + + + + + + + + + + +if test -n "${ZSH_VERSION+set}" ; then + setopt NO_GLOB_SUBST +fi + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for objdir" >&5 +$as_echo_n "checking for objdir... " >&6; } +if ${lt_cv_objdir+:} false; then : + $as_echo_n "(cached) " >&6 +else + rm -f .libs 2>/dev/null +mkdir .libs 2>/dev/null +if test -d .libs; then + lt_cv_objdir=.libs +else + # MS-DOS does not allow filenames that begin with a dot. + lt_cv_objdir=_libs +fi +rmdir .libs 2>/dev/null +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_objdir" >&5 +$as_echo "$lt_cv_objdir" >&6; } +objdir=$lt_cv_objdir + + + + + +cat >>confdefs.h <<_ACEOF +@%:@define LT_OBJDIR "$lt_cv_objdir/" +_ACEOF + + + + +case $host_os in +aix3*) + # AIX sometimes has problems with the GCC collect2 program. For some + # reason, if we set the COLLECT_NAMES environment variable, the problems + # vanish in a puff of smoke. + if test "X${COLLECT_NAMES+set}" != Xset; then + COLLECT_NAMES= + export COLLECT_NAMES + fi + ;; +esac + +# Global variables: +ofile=libtool +can_build_shared=yes + +# All known linkers require a `.a' archive for static linking (except MSVC, +# which needs '.lib'). +libext=a + +with_gnu_ld="$lt_cv_prog_gnu_ld" + +old_CC="$CC" +old_CFLAGS="$CFLAGS" + +# Set sane defaults for various variables +test -z "$CC" && CC=cc +test -z "$LTCC" && LTCC=$CC +test -z "$LTCFLAGS" && LTCFLAGS=$CFLAGS +test -z "$LD" && LD=ld +test -z "$ac_objext" && ac_objext=o + +for cc_temp in $compiler""; do + case $cc_temp in + compile | *[\\/]compile | ccache | *[\\/]ccache ) ;; + distcc | *[\\/]distcc | purify | *[\\/]purify ) ;; + \-*) ;; + *) break;; + esac +done +cc_basename=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"` + + +# Only perform the check for file, if the check method requires it +test -z "$MAGIC_CMD" && MAGIC_CMD=file +case $deplibs_check_method in +file_magic*) + if test "$file_magic_cmd" = '$MAGIC_CMD'; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ${ac_tool_prefix}file" >&5 +$as_echo_n "checking for ${ac_tool_prefix}file... " >&6; } +if ${lt_cv_path_MAGIC_CMD+:} false; then : + $as_echo_n "(cached) " >&6 +else + case $MAGIC_CMD in +[\\/*] | ?:[\\/]*) + lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path. + ;; +*) + lt_save_MAGIC_CMD="$MAGIC_CMD" + lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR + ac_dummy="/usr/bin$PATH_SEPARATOR$PATH" + for ac_dir in $ac_dummy; do + IFS="$lt_save_ifs" + test -z "$ac_dir" && ac_dir=. + if test -f $ac_dir/${ac_tool_prefix}file; then + lt_cv_path_MAGIC_CMD="$ac_dir/${ac_tool_prefix}file" + if test -n "$file_magic_test_file"; then + case $deplibs_check_method in + "file_magic "*) + file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"` + MAGIC_CMD="$lt_cv_path_MAGIC_CMD" + if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null | + $EGREP "$file_magic_regex" > /dev/null; then + : + else + cat <<_LT_EOF 1>&2 + +*** Warning: the command libtool uses to detect shared libraries, +*** $file_magic_cmd, produces output that libtool cannot recognize. +*** The result is that libtool may fail to recognize shared libraries +*** as such. This will affect the creation of libtool libraries that +*** depend on shared libraries, but programs linked with such libtool +*** libraries will work regardless of this problem. Nevertheless, you +*** may want to report the problem to your system manager and/or to +*** bug-libtool@gnu.org + +_LT_EOF + fi ;; + esac + fi + break + fi + done + IFS="$lt_save_ifs" + MAGIC_CMD="$lt_save_MAGIC_CMD" + ;; +esac +fi + +MAGIC_CMD="$lt_cv_path_MAGIC_CMD" +if test -n "$MAGIC_CMD"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MAGIC_CMD" >&5 +$as_echo "$MAGIC_CMD" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + + + +if test -z "$lt_cv_path_MAGIC_CMD"; then + if test -n "$ac_tool_prefix"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for file" >&5 +$as_echo_n "checking for file... " >&6; } +if ${lt_cv_path_MAGIC_CMD+:} false; then : + $as_echo_n "(cached) " >&6 +else + case $MAGIC_CMD in +[\\/*] | ?:[\\/]*) + lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path. + ;; +*) + lt_save_MAGIC_CMD="$MAGIC_CMD" + lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR + ac_dummy="/usr/bin$PATH_SEPARATOR$PATH" + for ac_dir in $ac_dummy; do + IFS="$lt_save_ifs" + test -z "$ac_dir" && ac_dir=. + if test -f $ac_dir/file; then + lt_cv_path_MAGIC_CMD="$ac_dir/file" + if test -n "$file_magic_test_file"; then + case $deplibs_check_method in + "file_magic "*) + file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"` + MAGIC_CMD="$lt_cv_path_MAGIC_CMD" + if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null | + $EGREP "$file_magic_regex" > /dev/null; then + : + else + cat <<_LT_EOF 1>&2 + +*** Warning: the command libtool uses to detect shared libraries, +*** $file_magic_cmd, produces output that libtool cannot recognize. +*** The result is that libtool may fail to recognize shared libraries +*** as such. This will affect the creation of libtool libraries that +*** depend on shared libraries, but programs linked with such libtool +*** libraries will work regardless of this problem. Nevertheless, you +*** may want to report the problem to your system manager and/or to +*** bug-libtool@gnu.org + +_LT_EOF + fi ;; + esac + fi + break + fi + done + IFS="$lt_save_ifs" + MAGIC_CMD="$lt_save_MAGIC_CMD" + ;; +esac +fi + +MAGIC_CMD="$lt_cv_path_MAGIC_CMD" +if test -n "$MAGIC_CMD"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MAGIC_CMD" >&5 +$as_echo "$MAGIC_CMD" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + else + MAGIC_CMD=: + fi +fi + + fi + ;; +esac + +# Use C for the default configuration in the libtool script + +lt_save_CC="$CC" +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + +# Source file extension for C test sources. +ac_ext=c + +# Object file extension for compiled C test sources. +objext=o +objext=$objext + +# Code to be used in simple compile tests +lt_simple_compile_test_code="int some_variable = 0;" + +# Code to be used in simple link tests +lt_simple_link_test_code='int main(){return(0);}' + + + + + + + +# If no C compiler was specified, use CC. +LTCC=${LTCC-"$CC"} + +# If no C compiler flags were specified, use CFLAGS. +LTCFLAGS=${LTCFLAGS-"$CFLAGS"} + +# Allow CC to be a program name with arguments. +compiler=$CC + +# Save the default compiler, since it gets overwritten when the other +# tags are being tested, and _LT_TAGVAR(compiler, []) is a NOP. +compiler_DEFAULT=$CC + +# save warnings/boilerplate of simple test code +ac_outfile=conftest.$ac_objext +echo "$lt_simple_compile_test_code" >conftest.$ac_ext +eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err +_lt_compiler_boilerplate=`cat conftest.err` +$RM conftest* + +ac_outfile=conftest.$ac_objext +echo "$lt_simple_link_test_code" >conftest.$ac_ext +eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err +_lt_linker_boilerplate=`cat conftest.err` +$RM -r conftest* + + +## CAVEAT EMPTOR: +## There is no encapsulation within the following macros, do not change +## the running order or otherwise move them around unless you know exactly +## what you are doing... +if test -n "$compiler"; then + +lt_prog_compiler_no_builtin_flag= + +if test "$GCC" = yes; then + case $cc_basename in + nvcc*) + lt_prog_compiler_no_builtin_flag=' -Xcompiler -fno-builtin' ;; + *) + lt_prog_compiler_no_builtin_flag=' -fno-builtin' ;; + esac + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -fno-rtti -fno-exceptions" >&5 +$as_echo_n "checking if $compiler supports -fno-rtti -fno-exceptions... " >&6; } +if ${lt_cv_prog_compiler_rtti_exceptions+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_prog_compiler_rtti_exceptions=no + ac_outfile=conftest.$ac_objext + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + lt_compiler_flag="-fno-rtti -fno-exceptions" + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + # The option is referenced via a variable to avoid confusing sed. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ + -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) + (eval "$lt_compile" 2>conftest.err) + ac_status=$? + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + if (exit $ac_status) && test -s "$ac_outfile"; then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings other than the usual output. + $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp + $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 + if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then + lt_cv_prog_compiler_rtti_exceptions=yes + fi + fi + $RM conftest* + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_rtti_exceptions" >&5 +$as_echo "$lt_cv_prog_compiler_rtti_exceptions" >&6; } + +if test x"$lt_cv_prog_compiler_rtti_exceptions" = xyes; then + lt_prog_compiler_no_builtin_flag="$lt_prog_compiler_no_builtin_flag -fno-rtti -fno-exceptions" +else + : +fi + +fi + + + + + + + lt_prog_compiler_wl= +lt_prog_compiler_pic= +lt_prog_compiler_static= + + + if test "$GCC" = yes; then + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_static='-static' + + case $host_os in + aix*) + # All AIX code is PIC. + if test "$host_cpu" = ia64; then + # AIX 5 now supports IA64 processor + lt_prog_compiler_static='-Bstatic' + fi + ;; + + amigaos*) + case $host_cpu in + powerpc) + # see comment about AmigaOS4 .so support + lt_prog_compiler_pic='-fPIC' + ;; + m68k) + # FIXME: we need at least 68020 code to build shared libraries, but + # adding the `-m68020' flag to GCC prevents building anything better, + # like `-m68040'. + lt_prog_compiler_pic='-m68020 -resident32 -malways-restore-a4' + ;; + esac + ;; + + beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) + # PIC is the default for these OSes. + ;; + + mingw* | cygwin* | pw32* | os2* | cegcc*) + # This hack is so that the source file can tell whether it is being + # built for inclusion in a dll (and should export symbols for example). + # Although the cygwin gcc ignores -fPIC, still need this for old-style + # (--disable-auto-import) libraries + lt_prog_compiler_pic='-DDLL_EXPORT' + ;; + + darwin* | rhapsody*) + # PIC is the default on this platform + # Common symbols not allowed in MH_DYLIB files + lt_prog_compiler_pic='-fno-common' + ;; + + haiku*) + # PIC is the default for Haiku. + # The "-static" flag exists, but is broken. + lt_prog_compiler_static= + ;; + + hpux*) + # PIC is the default for 64-bit PA HP-UX, but not for 32-bit + # PA HP-UX. On IA64 HP-UX, PIC is the default but the pic flag + # sets the default TLS model and affects inlining. + case $host_cpu in + hppa*64*) + # +Z the default + ;; + *) + lt_prog_compiler_pic='-fPIC' + ;; + esac + ;; + + interix[3-9]*) + # Interix 3.x gcc -fpic/-fPIC options generate broken code. + # Instead, we relocate shared libraries at runtime. + ;; + + msdosdjgpp*) + # Just because we use GCC doesn't mean we suddenly get shared libraries + # on systems that don't support them. + lt_prog_compiler_can_build_shared=no + enable_shared=no + ;; + + *nto* | *qnx*) + # QNX uses GNU C++, but need to define -shared option too, otherwise + # it will coredump. + lt_prog_compiler_pic='-fPIC -shared' + ;; + + sysv4*MP*) + if test -d /usr/nec; then + lt_prog_compiler_pic=-Kconform_pic + fi + ;; + + *) + lt_prog_compiler_pic='-fPIC' + ;; + esac + + case $cc_basename in + nvcc*) # Cuda Compiler Driver 2.2 + lt_prog_compiler_wl='-Xlinker ' + if test -n "$lt_prog_compiler_pic"; then + lt_prog_compiler_pic="-Xcompiler $lt_prog_compiler_pic" + fi + ;; + esac + else + # PORTME Check for flag to pass linker flags through the system compiler. + case $host_os in + aix*) + lt_prog_compiler_wl='-Wl,' + if test "$host_cpu" = ia64; then + # AIX 5 now supports IA64 processor + lt_prog_compiler_static='-Bstatic' + else + lt_prog_compiler_static='-bnso -bI:/lib/syscalls.exp' + fi + ;; + + mingw* | cygwin* | pw32* | os2* | cegcc*) + # This hack is so that the source file can tell whether it is being + # built for inclusion in a dll (and should export symbols for example). + lt_prog_compiler_pic='-DDLL_EXPORT' + ;; + + hpux9* | hpux10* | hpux11*) + lt_prog_compiler_wl='-Wl,' + # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but + # not for PA HP-UX. + case $host_cpu in + hppa*64*|ia64*) + # +Z the default + ;; + *) + lt_prog_compiler_pic='+Z' + ;; + esac + # Is there a better lt_prog_compiler_static that works with the bundled CC? + lt_prog_compiler_static='${wl}-a ${wl}archive' + ;; + + irix5* | irix6* | nonstopux*) + lt_prog_compiler_wl='-Wl,' + # PIC (with -KPIC) is the default. + lt_prog_compiler_static='-non_shared' + ;; + + linux* | k*bsd*-gnu | kopensolaris*-gnu) + case $cc_basename in + # old Intel for x86_64 which still supported -KPIC. + ecc*) + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_pic='-KPIC' + lt_prog_compiler_static='-static' + ;; + # icc used to be incompatible with GCC. + # ICC 10 doesn't accept -KPIC any more. + icc* | ifort*) + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_pic='-fPIC' + lt_prog_compiler_static='-static' + ;; + # Lahey Fortran 8.1. + lf95*) + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_pic='--shared' + lt_prog_compiler_static='--static' + ;; + nagfor*) + # NAG Fortran compiler + lt_prog_compiler_wl='-Wl,-Wl,,' + lt_prog_compiler_pic='-PIC' + lt_prog_compiler_static='-Bstatic' + ;; + pgcc* | pgf77* | pgf90* | pgf95* | pgfortran*) + # Portland Group compilers (*not* the Pentium gcc compiler, + # which looks to be a dead project) + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_pic='-fpic' + lt_prog_compiler_static='-Bstatic' + ;; + ccc*) + lt_prog_compiler_wl='-Wl,' + # All Alpha code is PIC. + lt_prog_compiler_static='-non_shared' + ;; + xl* | bgxl* | bgf* | mpixl*) + # IBM XL C 8.0/Fortran 10.1, 11.1 on PPC and BlueGene + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_pic='-qpic' + lt_prog_compiler_static='-qstaticlink' + ;; + *) + case `$CC -V 2>&1 | sed 5q` in + *Sun\ Ceres\ Fortran* | *Sun*Fortran*\ [1-7].* | *Sun*Fortran*\ 8.[0-3]*) + # Sun Fortran 8.3 passes all unrecognized flags to the linker + lt_prog_compiler_pic='-KPIC' + lt_prog_compiler_static='-Bstatic' + lt_prog_compiler_wl='' + ;; + *Sun\ F* | *Sun*Fortran*) + lt_prog_compiler_pic='-KPIC' + lt_prog_compiler_static='-Bstatic' + lt_prog_compiler_wl='-Qoption ld ' + ;; + *Sun\ C*) + # Sun C 5.9 + lt_prog_compiler_pic='-KPIC' + lt_prog_compiler_static='-Bstatic' + lt_prog_compiler_wl='-Wl,' + ;; + *Intel*\ [CF]*Compiler*) + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_pic='-fPIC' + lt_prog_compiler_static='-static' + ;; + *Portland\ Group*) + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_pic='-fpic' + lt_prog_compiler_static='-Bstatic' + ;; + esac + ;; + esac + ;; + + newsos6) + lt_prog_compiler_pic='-KPIC' + lt_prog_compiler_static='-Bstatic' + ;; + + *nto* | *qnx*) + # QNX uses GNU C++, but need to define -shared option too, otherwise + # it will coredump. + lt_prog_compiler_pic='-fPIC -shared' + ;; + + osf3* | osf4* | osf5*) + lt_prog_compiler_wl='-Wl,' + # All OSF/1 code is PIC. + lt_prog_compiler_static='-non_shared' + ;; + + rdos*) + lt_prog_compiler_static='-non_shared' + ;; + + solaris*) + lt_prog_compiler_pic='-KPIC' + lt_prog_compiler_static='-Bstatic' + case $cc_basename in + f77* | f90* | f95* | sunf77* | sunf90* | sunf95*) + lt_prog_compiler_wl='-Qoption ld ';; + *) + lt_prog_compiler_wl='-Wl,';; + esac + ;; + + sunos4*) + lt_prog_compiler_wl='-Qoption ld ' + lt_prog_compiler_pic='-PIC' + lt_prog_compiler_static='-Bstatic' + ;; + + sysv4 | sysv4.2uw2* | sysv4.3*) + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_pic='-KPIC' + lt_prog_compiler_static='-Bstatic' + ;; + + sysv4*MP*) + if test -d /usr/nec ;then + lt_prog_compiler_pic='-Kconform_pic' + lt_prog_compiler_static='-Bstatic' + fi + ;; + + sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_pic='-KPIC' + lt_prog_compiler_static='-Bstatic' + ;; + + unicos*) + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_can_build_shared=no + ;; + + uts4*) + lt_prog_compiler_pic='-pic' + lt_prog_compiler_static='-Bstatic' + ;; + + *) + lt_prog_compiler_can_build_shared=no + ;; + esac + fi + +case $host_os in + # For platforms which do not support PIC, -DPIC is meaningless: + *djgpp*) + lt_prog_compiler_pic= + ;; + *) + lt_prog_compiler_pic="$lt_prog_compiler_pic@&t@ -DPIC" + ;; +esac + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $compiler option to produce PIC" >&5 +$as_echo_n "checking for $compiler option to produce PIC... " >&6; } +if ${lt_cv_prog_compiler_pic+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_prog_compiler_pic=$lt_prog_compiler_pic +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic" >&5 +$as_echo "$lt_cv_prog_compiler_pic" >&6; } +lt_prog_compiler_pic=$lt_cv_prog_compiler_pic + +# +# Check to make sure the PIC flag actually works. +# +if test -n "$lt_prog_compiler_pic"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler PIC flag $lt_prog_compiler_pic works" >&5 +$as_echo_n "checking if $compiler PIC flag $lt_prog_compiler_pic works... " >&6; } +if ${lt_cv_prog_compiler_pic_works+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_prog_compiler_pic_works=no + ac_outfile=conftest.$ac_objext + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + lt_compiler_flag="$lt_prog_compiler_pic@&t@ -DPIC" + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + # The option is referenced via a variable to avoid confusing sed. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ + -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) + (eval "$lt_compile" 2>conftest.err) + ac_status=$? + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + if (exit $ac_status) && test -s "$ac_outfile"; then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings other than the usual output. + $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp + $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 + if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then + lt_cv_prog_compiler_pic_works=yes + fi + fi + $RM conftest* + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic_works" >&5 +$as_echo "$lt_cv_prog_compiler_pic_works" >&6; } + +if test x"$lt_cv_prog_compiler_pic_works" = xyes; then + case $lt_prog_compiler_pic in + "" | " "*) ;; + *) lt_prog_compiler_pic=" $lt_prog_compiler_pic" ;; + esac +else + lt_prog_compiler_pic= + lt_prog_compiler_can_build_shared=no +fi + +fi + + + + + + + + + + + +# +# Check to make sure the static flag actually works. +# +wl=$lt_prog_compiler_wl eval lt_tmp_static_flag=\"$lt_prog_compiler_static\" +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler static flag $lt_tmp_static_flag works" >&5 +$as_echo_n "checking if $compiler static flag $lt_tmp_static_flag works... " >&6; } +if ${lt_cv_prog_compiler_static_works+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_prog_compiler_static_works=no + save_LDFLAGS="$LDFLAGS" + LDFLAGS="$LDFLAGS $lt_tmp_static_flag" + echo "$lt_simple_link_test_code" > conftest.$ac_ext + if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then + # The linker can only warn and ignore the option if not recognized + # So say no if there are warnings + if test -s conftest.err; then + # Append any errors to the config.log. + cat conftest.err 1>&5 + $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp + $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 + if diff conftest.exp conftest.er2 >/dev/null; then + lt_cv_prog_compiler_static_works=yes + fi + else + lt_cv_prog_compiler_static_works=yes + fi + fi + $RM -r conftest* + LDFLAGS="$save_LDFLAGS" + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_static_works" >&5 +$as_echo "$lt_cv_prog_compiler_static_works" >&6; } + +if test x"$lt_cv_prog_compiler_static_works" = xyes; then + : +else + lt_prog_compiler_static= +fi + + + + + + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5 +$as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; } +if ${lt_cv_prog_compiler_c_o+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_prog_compiler_c_o=no + $RM -r conftest 2>/dev/null + mkdir conftest + cd conftest + mkdir out + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + + lt_compiler_flag="-o out/conftest2.$ac_objext" + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ + -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) + (eval "$lt_compile" 2>out/conftest.err) + ac_status=$? + cat out/conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + if (exit $ac_status) && test -s out/conftest2.$ac_objext + then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings + $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp + $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 + if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then + lt_cv_prog_compiler_c_o=yes + fi + fi + chmod u+w . 2>&5 + $RM conftest* + # SGI C++ compiler will create directory out/ii_files/ for + # template instantiation + test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files + $RM out/* && rmdir out + cd .. + $RM -r conftest + $RM conftest* + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o" >&5 +$as_echo "$lt_cv_prog_compiler_c_o" >&6; } + + + + + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5 +$as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; } +if ${lt_cv_prog_compiler_c_o+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_prog_compiler_c_o=no + $RM -r conftest 2>/dev/null + mkdir conftest + cd conftest + mkdir out + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + + lt_compiler_flag="-o out/conftest2.$ac_objext" + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ + -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) + (eval "$lt_compile" 2>out/conftest.err) + ac_status=$? + cat out/conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + if (exit $ac_status) && test -s out/conftest2.$ac_objext + then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings + $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp + $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 + if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then + lt_cv_prog_compiler_c_o=yes + fi + fi + chmod u+w . 2>&5 + $RM conftest* + # SGI C++ compiler will create directory out/ii_files/ for + # template instantiation + test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files + $RM out/* && rmdir out + cd .. + $RM -r conftest + $RM conftest* + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o" >&5 +$as_echo "$lt_cv_prog_compiler_c_o" >&6; } + + + + +hard_links="nottested" +if test "$lt_cv_prog_compiler_c_o" = no && test "$need_locks" != no; then + # do not overwrite the value of need_locks provided by the user + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if we can lock with hard links" >&5 +$as_echo_n "checking if we can lock with hard links... " >&6; } + hard_links=yes + $RM conftest* + ln conftest.a conftest.b 2>/dev/null && hard_links=no + touch conftest.a + ln conftest.a conftest.b 2>&5 || hard_links=no + ln conftest.a conftest.b 2>/dev/null && hard_links=no + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $hard_links" >&5 +$as_echo "$hard_links" >&6; } + if test "$hard_links" = no; then + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&5 +$as_echo "$as_me: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&2;} + need_locks=warn + fi +else + need_locks=no +fi + + + + + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $compiler linker ($LD) supports shared libraries" >&5 +$as_echo_n "checking whether the $compiler linker ($LD) supports shared libraries... " >&6; } + + runpath_var= + allow_undefined_flag= + always_export_symbols=no + archive_cmds= + archive_expsym_cmds= + compiler_needs_object=no + enable_shared_with_static_runtimes=no + export_dynamic_flag_spec= + export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' + hardcode_automatic=no + hardcode_direct=no + hardcode_direct_absolute=no + hardcode_libdir_flag_spec= + hardcode_libdir_separator= + hardcode_minus_L=no + hardcode_shlibpath_var=unsupported + inherit_rpath=no + link_all_deplibs=unknown + module_cmds= + module_expsym_cmds= + old_archive_from_new_cmds= + old_archive_from_expsyms_cmds= + thread_safe_flag_spec= + whole_archive_flag_spec= + # include_expsyms should be a list of space-separated symbols to be *always* + # included in the symbol list + include_expsyms= + # exclude_expsyms can be an extended regexp of symbols to exclude + # it will be wrapped by ` (' and `)$', so one must not match beginning or + # end of line. Example: `a|bc|.*d.*' will exclude the symbols `a' and `bc', + # as well as any symbol that contains `d'. + exclude_expsyms='_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*' + # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out + # platforms (ab)use it in PIC code, but their linkers get confused if + # the symbol is explicitly referenced. Since portable code cannot + # rely on this symbol name, it's probably fine to never include it in + # preloaded symbol tables. + # Exclude shared library initialization/finalization symbols. + extract_expsyms_cmds= + + case $host_os in + cygwin* | mingw* | pw32* | cegcc*) + # FIXME: the MSVC++ port hasn't been tested in a loooong time + # When not using gcc, we currently assume that we are using + # Microsoft Visual C++. + if test "$GCC" != yes; then + with_gnu_ld=no + fi + ;; + interix*) + # we just hope/assume this is gcc and not c89 (= MSVC++) + with_gnu_ld=yes + ;; + openbsd*) + with_gnu_ld=no + ;; + linux* | k*bsd*-gnu | gnu*) + link_all_deplibs=no + ;; + esac + + ld_shlibs=yes + + # On some targets, GNU ld is compatible enough with the native linker + # that we're better off using the native interface for both. + lt_use_gnu_ld_interface=no + if test "$with_gnu_ld" = yes; then + case $host_os in + aix*) + # The AIX port of GNU ld has always aspired to compatibility + # with the native linker. However, as the warning in the GNU ld + # block says, versions before 2.19.5* couldn't really create working + # shared libraries, regardless of the interface used. + case `$LD -v 2>&1` in + *\ \(GNU\ Binutils\)\ 2.19.5*) ;; + *\ \(GNU\ Binutils\)\ 2.[2-9]*) ;; + *\ \(GNU\ Binutils\)\ [3-9]*) ;; + *) + lt_use_gnu_ld_interface=yes + ;; + esac + ;; + *) + lt_use_gnu_ld_interface=yes + ;; + esac + fi + + if test "$lt_use_gnu_ld_interface" = yes; then + # If archive_cmds runs LD, not CC, wlarc should be empty + wlarc='${wl}' + + # Set some defaults for GNU ld with shared library support. These + # are reset later if shared libraries are not supported. Putting them + # here allows them to be overridden if necessary. + runpath_var=LD_RUN_PATH + hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' + export_dynamic_flag_spec='${wl}--export-dynamic' + # ancient GNU ld didn't support --whole-archive et. al. + if $LD --help 2>&1 | $GREP 'no-whole-archive' > /dev/null; then + whole_archive_flag_spec="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' + else + whole_archive_flag_spec= + fi + supports_anon_versioning=no + case `$LD -v 2>&1` in + *GNU\ gold*) supports_anon_versioning=yes ;; + *\ [01].* | *\ 2.[0-9].* | *\ 2.10.*) ;; # catch versions < 2.11 + *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ... + *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ... + *\ 2.11.*) ;; # other 2.11 versions + *) supports_anon_versioning=yes ;; + esac + + # See if GNU ld supports shared libraries. + case $host_os in + aix[3-9]*) + # On AIX/PPC, the GNU linker is very broken + if test "$host_cpu" != ia64; then + ld_shlibs=no + cat <<_LT_EOF 1>&2 + +*** Warning: the GNU linker, at least up to release 2.19, is reported +*** to be unable to reliably create shared libraries on AIX. +*** Therefore, libtool is disabling shared libraries support. If you +*** really care for shared libraries, you may want to install binutils +*** 2.20 or above, or modify your PATH so that a non-GNU linker is found. +*** You will then need to restart the configuration process. + +_LT_EOF + fi + ;; + + amigaos*) + case $host_cpu in + powerpc) + # see comment about AmigaOS4 .so support + archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + archive_expsym_cmds='' + ;; + m68k) + archive_cmds='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' + hardcode_libdir_flag_spec='-L$libdir' + hardcode_minus_L=yes + ;; + esac + ;; + + beos*) + if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then + allow_undefined_flag=unsupported + # Joseph Beckenbach says some releases of gcc + # support --undefined. This deserves some investigation. FIXME + archive_cmds='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + else + ld_shlibs=no + fi + ;; + + cygwin* | mingw* | pw32* | cegcc*) + # _LT_TAGVAR(hardcode_libdir_flag_spec, ) is actually meaningless, + # as there is no search path for DLLs. + hardcode_libdir_flag_spec='-L$libdir' + export_dynamic_flag_spec='${wl}--export-all-symbols' + allow_undefined_flag=unsupported + always_export_symbols=no + enable_shared_with_static_runtimes=yes + export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1 DATA/;s/^.*[ ]__nm__\([^ ]*\)[ ][^ ]*/\1 DATA/;/^I[ ]/d;/^[AITW][ ]/s/.* //'\'' | sort | uniq > $export_symbols' + exclude_expsyms='[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname' + + if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then + archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' + # If the export-symbols file already is a .def file (1st line + # is EXPORTS), use it as is; otherwise, prepend... + archive_expsym_cmds='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then + cp $export_symbols $output_objdir/$soname.def; + else + echo EXPORTS > $output_objdir/$soname.def; + cat $export_symbols >> $output_objdir/$soname.def; + fi~ + $CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' + else + ld_shlibs=no + fi + ;; + + haiku*) + archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + link_all_deplibs=yes + ;; + + interix[3-9]*) + hardcode_direct=no + hardcode_shlibpath_var=no + hardcode_libdir_flag_spec='${wl}-rpath,$libdir' + export_dynamic_flag_spec='${wl}-E' + # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. + # Instead, shared libraries are loaded at an image base (0x10000000 by + # default) and relocated if they conflict, which is a slow very memory + # consuming and fragmenting process. To avoid this, we pick a random, + # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link + # time. Moving up from 0x10000000 also allows more sbrk(2) space. + archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' + archive_expsym_cmds='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' + ;; + + gnu* | linux* | tpf* | k*bsd*-gnu | kopensolaris*-gnu) + tmp_diet=no + if test "$host_os" = linux-dietlibc; then + case $cc_basename in + diet\ *) tmp_diet=yes;; # linux-dietlibc with static linking (!diet-dyn) + esac + fi + if $LD --help 2>&1 | $EGREP ': supported targets:.* elf' > /dev/null \ + && test "$tmp_diet" = no + then + tmp_addflag=' $pic_flag' + tmp_sharedflag='-shared' + case $cc_basename,$host_cpu in + pgcc*) # Portland Group C compiler + whole_archive_flag_spec='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' + tmp_addflag=' $pic_flag' + ;; + pgf77* | pgf90* | pgf95* | pgfortran*) + # Portland Group f77 and f90 compilers + whole_archive_flag_spec='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' + tmp_addflag=' $pic_flag -Mnomain' ;; + ecc*,ia64* | icc*,ia64*) # Intel C compiler on ia64 + tmp_addflag=' -i_dynamic' ;; + efc*,ia64* | ifort*,ia64*) # Intel Fortran compiler on ia64 + tmp_addflag=' -i_dynamic -nofor_main' ;; + ifc* | ifort*) # Intel Fortran compiler + tmp_addflag=' -nofor_main' ;; + lf95*) # Lahey Fortran 8.1 + whole_archive_flag_spec= + tmp_sharedflag='--shared' ;; + xl[cC]* | bgxl[cC]* | mpixl[cC]*) # IBM XL C 8.0 on PPC (deal with xlf below) + tmp_sharedflag='-qmkshrobj' + tmp_addflag= ;; + nvcc*) # Cuda Compiler Driver 2.2 + whole_archive_flag_spec='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' + compiler_needs_object=yes + ;; + esac + case `$CC -V 2>&1 | sed 5q` in + *Sun\ C*) # Sun C 5.9 + whole_archive_flag_spec='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' + compiler_needs_object=yes + tmp_sharedflag='-G' ;; + *Sun\ F*) # Sun Fortran 8.3 + tmp_sharedflag='-G' ;; + esac + archive_cmds='$CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + + if test "x$supports_anon_versioning" = xyes; then + archive_expsym_cmds='echo "{ global:" > $output_objdir/$libname.ver~ + cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ + echo "local: *; };" >> $output_objdir/$libname.ver~ + $CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib' + fi + + case $cc_basename in + xlf* | bgf* | bgxlf* | mpixlf*) + # IBM XL Fortran 10.1 on PPC cannot create shared libs itself + whole_archive_flag_spec='--whole-archive$convenience --no-whole-archive' + hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' + archive_cmds='$LD -shared $libobjs $deplibs $linker_flags -soname $soname -o $lib' + if test "x$supports_anon_versioning" = xyes; then + archive_expsym_cmds='echo "{ global:" > $output_objdir/$libname.ver~ + cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ + echo "local: *; };" >> $output_objdir/$libname.ver~ + $LD -shared $libobjs $deplibs $linker_flags -soname $soname -version-script $output_objdir/$libname.ver -o $lib' + fi + ;; + esac + else + ld_shlibs=no + fi + ;; + + netbsd* | netbsdelf*-gnu) + if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then + archive_cmds='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib' + wlarc= + else + archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + fi + ;; + + solaris*) + if $LD -v 2>&1 | $GREP 'BFD 2\.8' > /dev/null; then + ld_shlibs=no + cat <<_LT_EOF 1>&2 + +*** Warning: The releases 2.8.* of the GNU linker cannot reliably +*** create shared libraries on Solaris systems. Therefore, libtool +*** is disabling shared libraries support. We urge you to upgrade GNU +*** binutils to release 2.9.1 or newer. Another option is to modify +*** your PATH or compiler configuration so that the native linker is +*** used, and then restart. + +_LT_EOF + elif $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then + archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + else + ld_shlibs=no + fi + ;; + + sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*) + case `$LD -v 2>&1` in + *\ [01].* | *\ 2.[0-9].* | *\ 2.1[0-5].*) + ld_shlibs=no + cat <<_LT_EOF 1>&2 + +*** Warning: Releases of the GNU linker prior to 2.16.91.0.3 can not +*** reliably create shared libraries on SCO systems. Therefore, libtool +*** is disabling shared libraries support. We urge you to upgrade GNU +*** binutils to release 2.16.91.0.3 or newer. Another option is to modify +*** your PATH or compiler configuration so that the native linker is +*** used, and then restart. + +_LT_EOF + ;; + *) + # For security reasons, it is highly recommended that you always + # use absolute paths for naming shared libraries, and exclude the + # DT_RUNPATH tag from executables and libraries. But doing so + # requires that you compile everything twice, which is a pain. + if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then + hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' + archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + else + ld_shlibs=no + fi + ;; + esac + ;; + + sunos4*) + archive_cmds='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags' + wlarc= + hardcode_direct=yes + hardcode_shlibpath_var=no + ;; + + *) + if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then + archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + else + ld_shlibs=no + fi + ;; + esac + + if test "$ld_shlibs" = no; then + runpath_var= + hardcode_libdir_flag_spec= + export_dynamic_flag_spec= + whole_archive_flag_spec= + fi + else + # PORTME fill in a description of your system's linker (not GNU ld) + case $host_os in + aix3*) + allow_undefined_flag=unsupported + always_export_symbols=yes + archive_expsym_cmds='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname' + # Note: this linker hardcodes the directories in LIBPATH if there + # are no directories specified by -L. + hardcode_minus_L=yes + if test "$GCC" = yes && test -z "$lt_prog_compiler_static"; then + # Neither direct hardcoding nor static linking is supported with a + # broken collect2. + hardcode_direct=unsupported + fi + ;; + + aix[4-9]*) + if test "$host_cpu" = ia64; then + # On IA64, the linker does run time linking by default, so we don't + # have to do anything special. + aix_use_runtimelinking=no + exp_sym_flag='-Bexport' + no_entry_flag="" + else + # If we're using GNU nm, then we don't want the "-C" option. + # -C means demangle to AIX nm, but means don't demangle with GNU nm + # Also, AIX nm treats weak defined symbols like other global + # defined symbols, whereas GNU nm marks them as "W". + if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then + export_symbols_cmds='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && (substr(\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' + else + export_symbols_cmds='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && (substr(\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' + fi + aix_use_runtimelinking=no + + # Test if we are trying to use run time linking or normal + # AIX style linking. If -brtl is somewhere in LDFLAGS, we + # need to do runtime linking. + case $host_os in aix4.[23]|aix4.[23].*|aix[5-9]*) + for ld_flag in $LDFLAGS; do + if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then + aix_use_runtimelinking=yes + break + fi + done + ;; + esac + + exp_sym_flag='-bexport' + no_entry_flag='-bnoentry' + fi + + # When large executables or shared objects are built, AIX ld can + # have problems creating the table of contents. If linking a library + # or program results in "error TOC overflow" add -mminimal-toc to + # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not + # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. + + archive_cmds='' + hardcode_direct=yes + hardcode_direct_absolute=yes + hardcode_libdir_separator=':' + link_all_deplibs=yes + file_list_spec='${wl}-f,' + + if test "$GCC" = yes; then + case $host_os in aix4.[012]|aix4.[012].*) + # We only want to do this on AIX 4.2 and lower, the check + # below for broken collect2 doesn't work under 4.3+ + collect2name=`${CC} -print-prog-name=collect2` + if test -f "$collect2name" && + strings "$collect2name" | $GREP resolve_lib_name >/dev/null + then + # We have reworked collect2 + : + else + # We have old collect2 + hardcode_direct=unsupported + # It fails to find uninstalled libraries when the uninstalled + # path is not listed in the libpath. Setting hardcode_minus_L + # to unsupported forces relinking + hardcode_minus_L=yes + hardcode_libdir_flag_spec='-L$libdir' + hardcode_libdir_separator= + fi + ;; + esac + shared_flag='-shared' + if test "$aix_use_runtimelinking" = yes; then + shared_flag="$shared_flag "'${wl}-G' + fi + link_all_deplibs=no + else + # not using gcc + if test "$host_cpu" = ia64; then + # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release + # chokes on -Wl,-G. The following line is correct: + shared_flag='-G' + else + if test "$aix_use_runtimelinking" = yes; then + shared_flag='${wl}-G' + else + shared_flag='${wl}-bM:SRE' + fi + fi + fi + + export_dynamic_flag_spec='${wl}-bexpall' + # It seems that -bexpall does not export symbols beginning with + # underscore (_), so it is better to generate a list of symbols to export. + always_export_symbols=yes + if test "$aix_use_runtimelinking" = yes; then + # Warning - without using the other runtime loading flags (-brtl), + # -berok will link without error, but may produce a broken library. + allow_undefined_flag='-berok' + # Determine the default libpath from the value encoded in an + # empty executable. + if test "${lt_cv_aix_libpath+set}" = set; then + aix_libpath=$lt_cv_aix_libpath +else + if ${lt_cv_aix_libpath_+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + + lt_aix_libpath_sed=' + /Import File Strings/,/^$/ { + /^0/ { + s/^0 *\([^ ]*\) *$/\1/ + p + } + }' + lt_cv_aix_libpath_=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` + # Check for a 64-bit object if we didn't find anything. + if test -z "$lt_cv_aix_libpath_"; then + lt_cv_aix_libpath_=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` + fi +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + if test -z "$lt_cv_aix_libpath_"; then + lt_cv_aix_libpath_="/usr/lib:/lib" + fi + +fi + + aix_libpath=$lt_cv_aix_libpath_ +fi + + hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath" + archive_expsym_cmds='$CC -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then func_echo_all "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag" + else + if test "$host_cpu" = ia64; then + hardcode_libdir_flag_spec='${wl}-R $libdir:/usr/lib:/lib' + allow_undefined_flag="-z nodefs" + archive_expsym_cmds="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols" + else + # Determine the default libpath from the value encoded in an + # empty executable. + if test "${lt_cv_aix_libpath+set}" = set; then + aix_libpath=$lt_cv_aix_libpath +else + if ${lt_cv_aix_libpath_+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + + lt_aix_libpath_sed=' + /Import File Strings/,/^$/ { + /^0/ { + s/^0 *\([^ ]*\) *$/\1/ + p + } + }' + lt_cv_aix_libpath_=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` + # Check for a 64-bit object if we didn't find anything. + if test -z "$lt_cv_aix_libpath_"; then + lt_cv_aix_libpath_=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` + fi +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + if test -z "$lt_cv_aix_libpath_"; then + lt_cv_aix_libpath_="/usr/lib:/lib" + fi + +fi + + aix_libpath=$lt_cv_aix_libpath_ +fi + + hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath" + # Warning - without using the other run time loading flags, + # -berok will link without error, but may produce a broken library. + no_undefined_flag=' ${wl}-bernotok' + allow_undefined_flag=' ${wl}-berok' + if test "$with_gnu_ld" = yes; then + # We only use this code for GNU lds that support --whole-archive. + whole_archive_flag_spec='${wl}--whole-archive$convenience ${wl}--no-whole-archive' + else + # Exported symbols can be pulled into shared objects from archives + whole_archive_flag_spec='$convenience' + fi + archive_cmds_need_lc=yes + # This is similar to how AIX traditionally builds its shared libraries. + archive_expsym_cmds="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' + fi + fi + ;; + + amigaos*) + case $host_cpu in + powerpc) + # see comment about AmigaOS4 .so support + archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + archive_expsym_cmds='' + ;; + m68k) + archive_cmds='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' + hardcode_libdir_flag_spec='-L$libdir' + hardcode_minus_L=yes + ;; + esac + ;; + + bsdi[45]*) + export_dynamic_flag_spec=-rdynamic + ;; + + cygwin* | mingw* | pw32* | cegcc*) + # When not using gcc, we currently assume that we are using + # Microsoft Visual C++. + # hardcode_libdir_flag_spec is actually meaningless, as there is + # no search path for DLLs. + case $cc_basename in + cl*) + # Native MSVC + hardcode_libdir_flag_spec=' ' + allow_undefined_flag=unsupported + always_export_symbols=yes + file_list_spec='@' + # Tell ltmain to make .lib files, not .a files. + libext=lib + # Tell ltmain to make .dll files, not .so files. + shrext_cmds=".dll" + # FIXME: Setting linknames here is a bad hack. + archive_cmds='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-dll~linknames=' + archive_expsym_cmds='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then + sed -n -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' -e '1\\\!p' < $export_symbols > $output_objdir/$soname.exp; + else + sed -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' < $export_symbols > $output_objdir/$soname.exp; + fi~ + $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~ + linknames=' + # The linker will not automatically build a static lib if we build a DLL. + # _LT_TAGVAR(old_archive_from_new_cmds, )='true' + enable_shared_with_static_runtimes=yes + exclude_expsyms='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*' + export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1,DATA/'\'' | $SED -e '\''/^[AITW][ ]/s/.*[ ]//'\'' | sort | uniq > $export_symbols' + # Don't use ranlib + old_postinstall_cmds='chmod 644 $oldlib' + postlink_cmds='lt_outputfile="@OUTPUT@"~ + lt_tool_outputfile="@TOOL_OUTPUT@"~ + case $lt_outputfile in + *.exe|*.EXE) ;; + *) + lt_outputfile="$lt_outputfile.exe" + lt_tool_outputfile="$lt_tool_outputfile.exe" + ;; + esac~ + if test "$MANIFEST_TOOL" != ":" && test -f "$lt_outputfile.manifest"; then + $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1; + $RM "$lt_outputfile.manifest"; + fi' + ;; + *) + # Assume MSVC wrapper + hardcode_libdir_flag_spec=' ' + allow_undefined_flag=unsupported + # Tell ltmain to make .lib files, not .a files. + libext=lib + # Tell ltmain to make .dll files, not .so files. + shrext_cmds=".dll" + # FIXME: Setting linknames here is a bad hack. + archive_cmds='$CC -o $lib $libobjs $compiler_flags `func_echo_all "$deplibs" | $SED '\''s/ -lc$//'\''` -link -dll~linknames=' + # The linker will automatically build a .lib file if we build a DLL. + old_archive_from_new_cmds='true' + # FIXME: Should let the user specify the lib program. + old_archive_cmds='lib -OUT:$oldlib$oldobjs$old_deplibs' + enable_shared_with_static_runtimes=yes + ;; + esac + ;; + + darwin* | rhapsody*) + + + archive_cmds_need_lc=no + hardcode_direct=no + hardcode_automatic=yes + hardcode_shlibpath_var=unsupported + if test "$lt_cv_ld_force_load" = "yes"; then + whole_archive_flag_spec='`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience ${wl}-force_load,$conv\"; done; func_echo_all \"$new_convenience\"`' + + else + whole_archive_flag_spec='' + fi + link_all_deplibs=yes + allow_undefined_flag="$_lt_dar_allow_undefined" + case $cc_basename in + ifort*) _lt_dar_can_shared=yes ;; + *) _lt_dar_can_shared=$GCC ;; + esac + if test "$_lt_dar_can_shared" = "yes"; then + output_verbose_link_cmd=func_echo_all + archive_cmds="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod${_lt_dsymutil}" + module_cmds="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dsymutil}" + archive_expsym_cmds="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring ${_lt_dar_single_mod}${_lt_dar_export_syms}${_lt_dsymutil}" + module_expsym_cmds="sed -e 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dar_export_syms}${_lt_dsymutil}" + + else + ld_shlibs=no + fi + + ;; + + dgux*) + archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_libdir_flag_spec='-L$libdir' + hardcode_shlibpath_var=no + ;; + + # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor + # support. Future versions do this automatically, but an explicit c++rt0.o + # does not break anything, and helps significantly (at the cost of a little + # extra space). + freebsd2.2*) + archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o' + hardcode_libdir_flag_spec='-R$libdir' + hardcode_direct=yes + hardcode_shlibpath_var=no + ;; + + # Unfortunately, older versions of FreeBSD 2 do not have this feature. + freebsd2.*) + archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' + hardcode_direct=yes + hardcode_minus_L=yes + hardcode_shlibpath_var=no + ;; + + # FreeBSD 3 and greater uses gcc -shared to do shared libraries. + freebsd* | dragonfly*) + archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' + hardcode_libdir_flag_spec='-R$libdir' + hardcode_direct=yes + hardcode_shlibpath_var=no + ;; + + hpux9*) + if test "$GCC" = yes; then + archive_cmds='$RM $output_objdir/$soname~$CC -shared $pic_flag ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' + else + archive_cmds='$RM $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' + fi + hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' + hardcode_libdir_separator=: + hardcode_direct=yes + + # hardcode_minus_L: Not really in the search PATH, + # but as the default location of the library. + hardcode_minus_L=yes + export_dynamic_flag_spec='${wl}-E' + ;; + + hpux10*) + if test "$GCC" = yes && test "$with_gnu_ld" = no; then + archive_cmds='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' + else + archive_cmds='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' + fi + if test "$with_gnu_ld" = no; then + hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' + hardcode_libdir_separator=: + hardcode_direct=yes + hardcode_direct_absolute=yes + export_dynamic_flag_spec='${wl}-E' + # hardcode_minus_L: Not really in the search PATH, + # but as the default location of the library. + hardcode_minus_L=yes + fi + ;; + + hpux11*) + if test "$GCC" = yes && test "$with_gnu_ld" = no; then + case $host_cpu in + hppa*64*) + archive_cmds='$CC -shared ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + ia64*) + archive_cmds='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' + ;; + *) + archive_cmds='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' + ;; + esac + else + case $host_cpu in + hppa*64*) + archive_cmds='$CC -b ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + ia64*) + archive_cmds='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' + ;; + *) + + # Older versions of the 11.00 compiler do not understand -b yet + # (HP92453-01 A.11.01.20 doesn't, HP92453-01 B.11.X.35175-35176.GP does) + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $CC understands -b" >&5 +$as_echo_n "checking if $CC understands -b... " >&6; } +if ${lt_cv_prog_compiler__b+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_prog_compiler__b=no + save_LDFLAGS="$LDFLAGS" + LDFLAGS="$LDFLAGS -b" + echo "$lt_simple_link_test_code" > conftest.$ac_ext + if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then + # The linker can only warn and ignore the option if not recognized + # So say no if there are warnings + if test -s conftest.err; then + # Append any errors to the config.log. + cat conftest.err 1>&5 + $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp + $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 + if diff conftest.exp conftest.er2 >/dev/null; then + lt_cv_prog_compiler__b=yes + fi + else + lt_cv_prog_compiler__b=yes + fi + fi + $RM -r conftest* + LDFLAGS="$save_LDFLAGS" + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler__b" >&5 +$as_echo "$lt_cv_prog_compiler__b" >&6; } + +if test x"$lt_cv_prog_compiler__b" = xyes; then + archive_cmds='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' +else + archive_cmds='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' +fi + + ;; + esac + fi + if test "$with_gnu_ld" = no; then + hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' + hardcode_libdir_separator=: + + case $host_cpu in + hppa*64*|ia64*) + hardcode_direct=no + hardcode_shlibpath_var=no + ;; + *) + hardcode_direct=yes + hardcode_direct_absolute=yes + export_dynamic_flag_spec='${wl}-E' + + # hardcode_minus_L: Not really in the search PATH, + # but as the default location of the library. + hardcode_minus_L=yes + ;; + esac + fi + ;; + + irix5* | irix6* | nonstopux*) + if test "$GCC" = yes; then + archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + # Try to use the -exported_symbol ld option, if it does not + # work, assume that -exports_file does not work either and + # implicitly export all symbols. + # This should be the same for all languages, so no per-tag cache variable. + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $host_os linker accepts -exported_symbol" >&5 +$as_echo_n "checking whether the $host_os linker accepts -exported_symbol... " >&6; } +if ${lt_cv_irix_exported_symbol+:} false; then : + $as_echo_n "(cached) " >&6 +else + save_LDFLAGS="$LDFLAGS" + LDFLAGS="$LDFLAGS -shared ${wl}-exported_symbol ${wl}foo ${wl}-update_registry ${wl}/dev/null" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +int foo (void) { return 0; } +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + lt_cv_irix_exported_symbol=yes +else + lt_cv_irix_exported_symbol=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + LDFLAGS="$save_LDFLAGS" +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_irix_exported_symbol" >&5 +$as_echo "$lt_cv_irix_exported_symbol" >&6; } + if test "$lt_cv_irix_exported_symbol" = yes; then + archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations ${wl}-exports_file ${wl}$export_symbols -o $lib' + fi + else + archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' + archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -exports_file $export_symbols -o $lib' + fi + archive_cmds_need_lc='no' + hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' + hardcode_libdir_separator=: + inherit_rpath=yes + link_all_deplibs=yes + ;; + + netbsd* | netbsdelf*-gnu) + if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then + archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' # a.out + else + archive_cmds='$LD -shared -o $lib $libobjs $deplibs $linker_flags' # ELF + fi + hardcode_libdir_flag_spec='-R$libdir' + hardcode_direct=yes + hardcode_shlibpath_var=no + ;; + + newsos6) + archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_direct=yes + hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' + hardcode_libdir_separator=: + hardcode_shlibpath_var=no + ;; + + *nto* | *qnx*) + ;; + + openbsd*) + if test -f /usr/libexec/ld.so; then + hardcode_direct=yes + hardcode_shlibpath_var=no + hardcode_direct_absolute=yes + if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then + archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-retain-symbols-file,$export_symbols' + hardcode_libdir_flag_spec='${wl}-rpath,$libdir' + export_dynamic_flag_spec='${wl}-E' + else + case $host_os in + openbsd[01].* | openbsd2.[0-7] | openbsd2.[0-7].*) + archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' + hardcode_libdir_flag_spec='-R$libdir' + ;; + *) + archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' + hardcode_libdir_flag_spec='${wl}-rpath,$libdir' + ;; + esac + fi + else + ld_shlibs=no + fi + ;; + + os2*) + hardcode_libdir_flag_spec='-L$libdir' + hardcode_minus_L=yes + allow_undefined_flag=unsupported + archive_cmds='$ECHO "LIBRARY $libname INITINSTANCE" > $output_objdir/$libname.def~$ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~echo DATA >> $output_objdir/$libname.def~echo " SINGLE NONSHARED" >> $output_objdir/$libname.def~echo EXPORTS >> $output_objdir/$libname.def~emxexp $libobjs >> $output_objdir/$libname.def~$CC -Zdll -Zcrtdll -o $lib $libobjs $deplibs $compiler_flags $output_objdir/$libname.def' + old_archive_from_new_cmds='emximp -o $output_objdir/$libname.a $output_objdir/$libname.def' + ;; + + osf3*) + if test "$GCC" = yes; then + allow_undefined_flag=' ${wl}-expect_unresolved ${wl}\*' + archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + else + allow_undefined_flag=' -expect_unresolved \*' + archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' + fi + archive_cmds_need_lc='no' + hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' + hardcode_libdir_separator=: + ;; + + osf4* | osf5*) # as osf3* with the addition of -msym flag + if test "$GCC" = yes; then + allow_undefined_flag=' ${wl}-expect_unresolved ${wl}\*' + archive_cmds='$CC -shared${allow_undefined_flag} $pic_flag $libobjs $deplibs $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' + else + allow_undefined_flag=' -expect_unresolved \*' + archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' + archive_expsym_cmds='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; printf "%s\\n" "-hidden">> $lib.exp~ + $CC -shared${allow_undefined_flag} ${wl}-input ${wl}$lib.exp $compiler_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib~$RM $lib.exp' + + # Both c and cxx compiler support -rpath directly + hardcode_libdir_flag_spec='-rpath $libdir' + fi + archive_cmds_need_lc='no' + hardcode_libdir_separator=: + ;; + + solaris*) + no_undefined_flag=' -z defs' + if test "$GCC" = yes; then + wlarc='${wl}' + archive_cmds='$CC -shared $pic_flag ${wl}-z ${wl}text ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ + $CC -shared $pic_flag ${wl}-z ${wl}text ${wl}-M ${wl}$lib.exp ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' + else + case `$CC -V 2>&1` in + *"Compilers 5.0"*) + wlarc='' + archive_cmds='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags' + archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ + $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$RM $lib.exp' + ;; + *) + wlarc='${wl}' + archive_cmds='$CC -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ + $CC -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' + ;; + esac + fi + hardcode_libdir_flag_spec='-R$libdir' + hardcode_shlibpath_var=no + case $host_os in + solaris2.[0-5] | solaris2.[0-5].*) ;; + *) + # The compiler driver will combine and reorder linker options, + # but understands `-z linker_flag'. GCC discards it without `$wl', + # but is careful enough not to reorder. + # Supported since Solaris 2.6 (maybe 2.5.1?) + if test "$GCC" = yes; then + whole_archive_flag_spec='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract' + else + whole_archive_flag_spec='-z allextract$convenience -z defaultextract' + fi + ;; + esac + link_all_deplibs=yes + ;; + + sunos4*) + if test "x$host_vendor" = xsequent; then + # Use $CC to link under sequent, because it throws in some extra .o + # files that make .init and .fini sections work. + archive_cmds='$CC -G ${wl}-h $soname -o $lib $libobjs $deplibs $compiler_flags' + else + archive_cmds='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags' + fi + hardcode_libdir_flag_spec='-L$libdir' + hardcode_direct=yes + hardcode_minus_L=yes + hardcode_shlibpath_var=no + ;; + + sysv4) + case $host_vendor in + sni) + archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_direct=yes # is this really true??? + ;; + siemens) + ## LD is ld it makes a PLAMLIB + ## CC just makes a GrossModule. + archive_cmds='$LD -G -o $lib $libobjs $deplibs $linker_flags' + reload_cmds='$CC -r -o $output$reload_objs' + hardcode_direct=no + ;; + motorola) + archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_direct=no #Motorola manual says yes, but my tests say they lie + ;; + esac + runpath_var='LD_RUN_PATH' + hardcode_shlibpath_var=no + ;; + + sysv4.3*) + archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_shlibpath_var=no + export_dynamic_flag_spec='-Bexport' + ;; + + sysv4*MP*) + if test -d /usr/nec; then + archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_shlibpath_var=no + runpath_var=LD_RUN_PATH + hardcode_runpath_var=yes + ld_shlibs=yes + fi + ;; + + sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7* | sco3.2v5.0.[024]*) + no_undefined_flag='${wl}-z,text' + archive_cmds_need_lc=no + hardcode_shlibpath_var=no + runpath_var='LD_RUN_PATH' + + if test "$GCC" = yes; then + archive_cmds='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + else + archive_cmds='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + fi + ;; + + sysv5* | sco3.2v5* | sco5v6*) + # Note: We can NOT use -z defs as we might desire, because we do not + # link with -lc, and that would cause any symbols used from libc to + # always be unresolved, which means just about no library would + # ever link correctly. If we're not using GNU ld we use -z text + # though, which does catch some bad symbols but isn't as heavy-handed + # as -z defs. + no_undefined_flag='${wl}-z,text' + allow_undefined_flag='${wl}-z,nodefs' + archive_cmds_need_lc=no + hardcode_shlibpath_var=no + hardcode_libdir_flag_spec='${wl}-R,$libdir' + hardcode_libdir_separator=':' + link_all_deplibs=yes + export_dynamic_flag_spec='${wl}-Bexport' + runpath_var='LD_RUN_PATH' + + if test "$GCC" = yes; then + archive_cmds='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + else + archive_cmds='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + fi + ;; + + uts4*) + archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_libdir_flag_spec='-L$libdir' + hardcode_shlibpath_var=no + ;; + + *) + ld_shlibs=no + ;; + esac + + if test x$host_vendor = xsni; then + case $host in + sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) + export_dynamic_flag_spec='${wl}-Blargedynsym' + ;; + esac + fi + fi + +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ld_shlibs" >&5 +$as_echo "$ld_shlibs" >&6; } +test "$ld_shlibs" = no && can_build_shared=no + +with_gnu_ld=$with_gnu_ld + + + + + + + + + + + + + + + +# +# Do we need to explicitly link libc? +# +case "x$archive_cmds_need_lc" in +x|xyes) + # Assume -lc should be added + archive_cmds_need_lc=yes + + if test "$enable_shared" = yes && test "$GCC" = yes; then + case $archive_cmds in + *'~'*) + # FIXME: we may have to deal with multi-command sequences. + ;; + '$CC '*) + # Test whether the compiler implicitly links with -lc since on some + # systems, -lgcc has to come before -lc. If gcc already passes -lc + # to ld, don't add -lc before -lgcc. + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether -lc should be explicitly linked in" >&5 +$as_echo_n "checking whether -lc should be explicitly linked in... " >&6; } +if ${lt_cv_archive_cmds_need_lc+:} false; then : + $as_echo_n "(cached) " >&6 +else + $RM conftest* + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } 2>conftest.err; then + soname=conftest + lib=conftest + libobjs=conftest.$ac_objext + deplibs= + wl=$lt_prog_compiler_wl + pic_flag=$lt_prog_compiler_pic + compiler_flags=-v + linker_flags=-v + verstring= + output_objdir=. + libname=conftest + lt_save_allow_undefined_flag=$allow_undefined_flag + allow_undefined_flag= + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$archive_cmds 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1\""; } >&5 + (eval $archive_cmds 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + then + lt_cv_archive_cmds_need_lc=no + else + lt_cv_archive_cmds_need_lc=yes + fi + allow_undefined_flag=$lt_save_allow_undefined_flag + else + cat conftest.err 1>&5 + fi + $RM conftest* + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_archive_cmds_need_lc" >&5 +$as_echo "$lt_cv_archive_cmds_need_lc" >&6; } + archive_cmds_need_lc=$lt_cv_archive_cmds_need_lc + ;; + esac + fi + ;; +esac + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking dynamic linker characteristics" >&5 +$as_echo_n "checking dynamic linker characteristics... " >&6; } + +if test "$GCC" = yes; then + case $host_os in + darwin*) lt_awk_arg="/^libraries:/,/LR/" ;; + *) lt_awk_arg="/^libraries:/" ;; + esac + case $host_os in + mingw* | cegcc*) lt_sed_strip_eq="s,=\([A-Za-z]:\),\1,g" ;; + *) lt_sed_strip_eq="s,=/,/,g" ;; + esac + lt_search_path_spec=`$CC -print-search-dirs | awk $lt_awk_arg | $SED -e "s/^libraries://" -e $lt_sed_strip_eq` + case $lt_search_path_spec in + *\;*) + # if the path contains ";" then we assume it to be the separator + # otherwise default to the standard path separator (i.e. ":") - it is + # assumed that no part of a normal pathname contains ";" but that should + # okay in the real world where ";" in dirpaths is itself problematic. + lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED 's/;/ /g'` + ;; + *) + lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED "s/$PATH_SEPARATOR/ /g"` + ;; + esac + # Ok, now we have the path, separated by spaces, we can step through it + # and add multilib dir if necessary. + lt_tmp_lt_search_path_spec= + lt_multi_os_dir=`$CC $CPPFLAGS $CFLAGS $LDFLAGS -print-multi-os-directory 2>/dev/null` + for lt_sys_path in $lt_search_path_spec; do + if test -d "$lt_sys_path/$lt_multi_os_dir"; then + lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path/$lt_multi_os_dir" + else + test -d "$lt_sys_path" && \ + lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path" + fi + done + lt_search_path_spec=`$ECHO "$lt_tmp_lt_search_path_spec" | awk ' +BEGIN {RS=" "; FS="/|\n";} { + lt_foo=""; + lt_count=0; + for (lt_i = NF; lt_i > 0; lt_i--) { + if ($lt_i != "" && $lt_i != ".") { + if ($lt_i == "..") { + lt_count++; + } else { + if (lt_count == 0) { + lt_foo="/" $lt_i lt_foo; + } else { + lt_count--; + } + } + } + } + if (lt_foo != "") { lt_freq[lt_foo]++; } + if (lt_freq[lt_foo] == 1) { print lt_foo; } +}'` + # AWK program above erroneously prepends '/' to C:/dos/paths + # for these hosts. + case $host_os in + mingw* | cegcc*) lt_search_path_spec=`$ECHO "$lt_search_path_spec" |\ + $SED 's,/\([A-Za-z]:\),\1,g'` ;; + esac + sys_lib_search_path_spec=`$ECHO "$lt_search_path_spec" | $lt_NL2SP` +else + sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" +fi +library_names_spec= +libname_spec='lib$name' +soname_spec= +shrext_cmds=".so" +postinstall_cmds= +postuninstall_cmds= +finish_cmds= +finish_eval= +shlibpath_var= +shlibpath_overrides_runpath=unknown +version_type=none +dynamic_linker="$host_os ld.so" +sys_lib_dlsearch_path_spec="/lib /usr/lib" +need_lib_prefix=unknown +hardcode_into_libs=no + +# when you set need_version to no, make sure it does not cause -set_version +# flags to be left without arguments +need_version=unknown + +case $host_os in +aix3*) + version_type=linux # correct to gnu/linux during the next big refactor + library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a' + shlibpath_var=LIBPATH + + # AIX 3 has no versioning support, so we append a major version to the name. + soname_spec='${libname}${release}${shared_ext}$major' + ;; + +aix[4-9]*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + hardcode_into_libs=yes + if test "$host_cpu" = ia64; then + # AIX 5 supports IA64 + library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}' + shlibpath_var=LD_LIBRARY_PATH + else + # With GCC up to 2.95.x, collect2 would create an import file + # for dependence libraries. The import file would start with + # the line `#! .'. This would cause the generated library to + # depend on `.', always an invalid library. This was fixed in + # development snapshots of GCC prior to 3.0. + case $host_os in + aix4 | aix4.[01] | aix4.[01].*) + if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)' + echo ' yes ' + echo '#endif'; } | ${CC} -E - | $GREP yes > /dev/null; then + : + else + can_build_shared=no + fi + ;; + esac + # AIX (on Power*) has no versioning support, so currently we can not hardcode correct + # soname into executable. Probably we can add versioning support to + # collect2, so additional links can be useful in future. + if test "$aix_use_runtimelinking" = yes; then + # If using run time linking (on AIX 4.2 or later) use lib.so + # instead of lib.a to let people know that these are not + # typical AIX shared libraries. + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + else + # We preserve .a as extension for shared libraries through AIX4.2 + # and later when we are not doing run time linking. + library_names_spec='${libname}${release}.a $libname.a' + soname_spec='${libname}${release}${shared_ext}$major' + fi + shlibpath_var=LIBPATH + fi + ;; + +amigaos*) + case $host_cpu in + powerpc) + # Since July 2007 AmigaOS4 officially supports .so libraries. + # When compiling the executable, add -use-dynld -Lsobjs: to the compileline. + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + ;; + m68k) + library_names_spec='$libname.ixlibrary $libname.a' + # Create ${libname}_ixlibrary.a entries in /sys/libs. + finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`func_echo_all "$lib" | $SED '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; test $RM /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done' + ;; + esac + ;; + +beos*) + library_names_spec='${libname}${shared_ext}' + dynamic_linker="$host_os ld.so" + shlibpath_var=LIBRARY_PATH + ;; + +bsdi[45]*) + version_type=linux # correct to gnu/linux during the next big refactor + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir' + shlibpath_var=LD_LIBRARY_PATH + sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib" + sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib" + # the default ld.so.conf also contains /usr/contrib/lib and + # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow + # libtool to hard-code these into programs + ;; + +cygwin* | mingw* | pw32* | cegcc*) + version_type=windows + shrext_cmds=".dll" + need_version=no + need_lib_prefix=no + + case $GCC,$cc_basename in + yes,*) + # gcc + library_names_spec='$libname.dll.a' + # DLL is installed to $(libdir)/../bin by postinstall_cmds + postinstall_cmds='base_file=`basename \${file}`~ + dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~ + dldir=$destdir/`dirname \$dlpath`~ + test -d \$dldir || mkdir -p \$dldir~ + $install_prog $dir/$dlname \$dldir/$dlname~ + chmod a+x \$dldir/$dlname~ + if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then + eval '\''$striplib \$dldir/$dlname'\'' || exit \$?; + fi' + postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ + dlpath=$dir/\$dldll~ + $RM \$dlpath' + shlibpath_overrides_runpath=yes + + case $host_os in + cygwin*) + # Cygwin DLLs use 'cyg' prefix rather than 'lib' + soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' + + sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/lib/w32api" + ;; + mingw* | cegcc*) + # MinGW DLLs use traditional 'lib' prefix + soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' + ;; + pw32*) + # pw32 DLLs use 'pw' prefix rather than 'lib' + library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' + ;; + esac + dynamic_linker='Win32 ld.exe' + ;; + + *,cl*) + # Native MSVC + libname_spec='$name' + soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' + library_names_spec='${libname}.dll.lib' + + case $build_os in + mingw*) + sys_lib_search_path_spec= + lt_save_ifs=$IFS + IFS=';' + for lt_path in $LIB + do + IFS=$lt_save_ifs + # Let DOS variable expansion print the short 8.3 style file name. + lt_path=`cd "$lt_path" 2>/dev/null && cmd //C "for %i in (".") do @echo %~si"` + sys_lib_search_path_spec="$sys_lib_search_path_spec $lt_path" + done + IFS=$lt_save_ifs + # Convert to MSYS style. + sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | sed -e 's|\\\\|/|g' -e 's| \\([a-zA-Z]\\):| /\\1|g' -e 's|^ ||'` + ;; + cygwin*) + # Convert to unix form, then to dos form, then back to unix form + # but this time dos style (no spaces!) so that the unix form looks + # like /cygdrive/c/PROGRA~1:/cygdr... + sys_lib_search_path_spec=`cygpath --path --unix "$LIB"` + sys_lib_search_path_spec=`cygpath --path --dos "$sys_lib_search_path_spec" 2>/dev/null` + sys_lib_search_path_spec=`cygpath --path --unix "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` + ;; + *) + sys_lib_search_path_spec="$LIB" + if $ECHO "$sys_lib_search_path_spec" | $GREP ';[c-zC-Z]:/' >/dev/null; then + # It is most probably a Windows format PATH. + sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` + else + sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` + fi + # FIXME: find the short name or the path components, as spaces are + # common. (e.g. "Program Files" -> "PROGRA~1") + ;; + esac + + # DLL is installed to $(libdir)/../bin by postinstall_cmds + postinstall_cmds='base_file=`basename \${file}`~ + dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~ + dldir=$destdir/`dirname \$dlpath`~ + test -d \$dldir || mkdir -p \$dldir~ + $install_prog $dir/$dlname \$dldir/$dlname' + postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ + dlpath=$dir/\$dldll~ + $RM \$dlpath' + shlibpath_overrides_runpath=yes + dynamic_linker='Win32 link.exe' + ;; + + *) + # Assume MSVC wrapper + library_names_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext} $libname.lib' + dynamic_linker='Win32 ld.exe' + ;; + esac + # FIXME: first we should search . and the directory the executable is in + shlibpath_var=PATH + ;; + +darwin* | rhapsody*) + dynamic_linker="$host_os dyld" + version_type=darwin + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${major}$shared_ext ${libname}$shared_ext' + soname_spec='${libname}${release}${major}$shared_ext' + shlibpath_overrides_runpath=yes + shlibpath_var=DYLD_LIBRARY_PATH + shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`' + + sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/local/lib" + sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib' + ;; + +dgux*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + ;; + +freebsd* | dragonfly*) + # DragonFly does not have aout. When/if they implement a new + # versioning mechanism, adjust this. + if test -x /usr/bin/objformat; then + objformat=`/usr/bin/objformat` + else + case $host_os in + freebsd[23].*) objformat=aout ;; + *) objformat=elf ;; + esac + fi + version_type=freebsd-$objformat + case $version_type in + freebsd-elf*) + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' + need_version=no + need_lib_prefix=no + ;; + freebsd-*) + library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix' + need_version=yes + ;; + esac + shlibpath_var=LD_LIBRARY_PATH + case $host_os in + freebsd2.*) + shlibpath_overrides_runpath=yes + ;; + freebsd3.[01]* | freebsdelf3.[01]*) + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + freebsd3.[2-9]* | freebsdelf3.[2-9]* | \ + freebsd4.[0-5] | freebsdelf4.[0-5] | freebsd4.1.1 | freebsdelf4.1.1) + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; + *) # from 4.6 on, and DragonFly + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + esac + ;; + +gnu*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; + +haiku*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + dynamic_linker="$host_os runtime_loader" + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LIBRARY_PATH + shlibpath_overrides_runpath=yes + sys_lib_dlsearch_path_spec='/boot/home/config/lib /boot/common/lib /boot/system/lib' + hardcode_into_libs=yes + ;; + +hpux9* | hpux10* | hpux11*) + # Give a soname corresponding to the major version so that dld.sl refuses to + # link against other versions. + version_type=sunos + need_lib_prefix=no + need_version=no + case $host_cpu in + ia64*) + shrext_cmds='.so' + hardcode_into_libs=yes + dynamic_linker="$host_os dld.so" + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + if test "X$HPUX_IA64_MODE" = X32; then + sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib" + else + sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64" + fi + sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec + ;; + hppa*64*) + shrext_cmds='.sl' + hardcode_into_libs=yes + dynamic_linker="$host_os dld.sl" + shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH + shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64" + sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec + ;; + *) + shrext_cmds='.sl' + dynamic_linker="$host_os dld.sl" + shlibpath_var=SHLIB_PATH + shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + ;; + esac + # HP-UX runs *really* slowly unless shared libraries are mode 555, ... + postinstall_cmds='chmod 555 $lib' + # or fails outright, so override atomically: + install_override_mode=555 + ;; + +interix[3-9]*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; + +irix5* | irix6* | nonstopux*) + case $host_os in + nonstopux*) version_type=nonstopux ;; + *) + if test "$lt_cv_prog_gnu_ld" = yes; then + version_type=linux # correct to gnu/linux during the next big refactor + else + version_type=irix + fi ;; + esac + need_lib_prefix=no + need_version=no + soname_spec='${libname}${release}${shared_ext}$major' + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}' + case $host_os in + irix5* | nonstopux*) + libsuff= shlibsuff= + ;; + *) + case $LD in # libtool.m4 will add one of these switches to LD + *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") + libsuff= shlibsuff= libmagic=32-bit;; + *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") + libsuff=32 shlibsuff=N32 libmagic=N32;; + *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") + libsuff=64 shlibsuff=64 libmagic=64-bit;; + *) libsuff= shlibsuff= libmagic=never-match;; + esac + ;; + esac + shlibpath_var=LD_LIBRARY${shlibsuff}_PATH + shlibpath_overrides_runpath=no + sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}" + sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}" + hardcode_into_libs=yes + ;; + +# No shared lib support for Linux oldld, aout, or coff. +linux*oldld* | linux*aout* | linux*coff*) + dynamic_linker=no + ;; + +# This must be glibc/ELF. +linux* | k*bsd*-gnu | kopensolaris*-gnu) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + + # Some binutils ld are patched to set DT_RUNPATH + if ${lt_cv_shlibpath_overrides_runpath+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_shlibpath_overrides_runpath=no + save_LDFLAGS=$LDFLAGS + save_libdir=$libdir + eval "libdir=/foo; wl=\"$lt_prog_compiler_wl\"; \ + LDFLAGS=\"\$LDFLAGS $hardcode_libdir_flag_spec\"" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + if ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir" >/dev/null; then : + lt_cv_shlibpath_overrides_runpath=yes +fi +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + LDFLAGS=$save_LDFLAGS + libdir=$save_libdir + +fi + + shlibpath_overrides_runpath=$lt_cv_shlibpath_overrides_runpath + + # This implies no fast_install, which is unacceptable. + # Some rework will be needed to allow for fast_install + # before this can be enabled. + hardcode_into_libs=yes + + # Append ld.so.conf contents to the search path + if test -f /etc/ld.so.conf; then + lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \$2)); skip = 1; } { if (!skip) print \$0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[ ]*hwcap[ ]/d;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;s/"//g;/^$/d' | tr '\n' ' '` + sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra" + fi + + # We used to test for /lib/ld.so.1 and disable shared libraries on + # powerpc, because MkLinux only supported shared libraries with the + # GNU dynamic linker. Since this was broken with cross compilers, + # most powerpc-linux boxes support dynamic linking these days and + # people can always --disable-shared, the test was removed, and we + # assume the GNU/Linux dynamic linker is in use. + dynamic_linker='GNU/Linux ld.so' + ;; + +netbsdelf*-gnu) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + dynamic_linker='NetBSD ld.elf_so' + ;; + +netbsd*) + version_type=sunos + need_lib_prefix=no + need_version=no + if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' + dynamic_linker='NetBSD (a.out) ld.so' + else + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + dynamic_linker='NetBSD ld.elf_so' + fi + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + +newsos6) + version_type=linux # correct to gnu/linux during the next big refactor + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + ;; + +*nto* | *qnx*) + version_type=qnx + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + dynamic_linker='ldqnx.so' + ;; + +openbsd*) + version_type=sunos + sys_lib_dlsearch_path_spec="/usr/lib" + need_lib_prefix=no + # Some older versions of OpenBSD (3.3 at least) *do* need versioned libs. + case $host_os in + openbsd3.3 | openbsd3.3.*) need_version=yes ;; + *) need_version=no ;; + esac + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' + shlibpath_var=LD_LIBRARY_PATH + if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then + case $host_os in + openbsd2.[89] | openbsd2.[89].*) + shlibpath_overrides_runpath=no + ;; + *) + shlibpath_overrides_runpath=yes + ;; + esac + else + shlibpath_overrides_runpath=yes + fi + ;; + +os2*) + libname_spec='$name' + shrext_cmds=".dll" + need_lib_prefix=no + library_names_spec='$libname${shared_ext} $libname.a' + dynamic_linker='OS/2 ld.exe' + shlibpath_var=LIBPATH + ;; + +osf3* | osf4* | osf5*) + version_type=osf + need_lib_prefix=no + need_version=no + soname_spec='${libname}${release}${shared_ext}$major' + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + shlibpath_var=LD_LIBRARY_PATH + sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib" + sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec" + ;; + +rdos*) + dynamic_linker=no + ;; + +solaris*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + # ldd complains unless libraries are executable + postinstall_cmds='chmod +x $lib' + ;; + +sunos4*) + version_type=sunos + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' + finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + if test "$with_gnu_ld" = yes; then + need_lib_prefix=no + fi + need_version=yes + ;; + +sysv4 | sysv4.3*) + version_type=linux # correct to gnu/linux during the next big refactor + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + case $host_vendor in + sni) + shlibpath_overrides_runpath=no + need_lib_prefix=no + runpath_var=LD_RUN_PATH + ;; + siemens) + need_lib_prefix=no + ;; + motorola) + need_lib_prefix=no + need_version=no + shlibpath_overrides_runpath=no + sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib' + ;; + esac + ;; + +sysv4*MP*) + if test -d /usr/nec ;then + version_type=linux # correct to gnu/linux during the next big refactor + library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}' + soname_spec='$libname${shared_ext}.$major' + shlibpath_var=LD_LIBRARY_PATH + fi + ;; + +sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) + version_type=freebsd-elf + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + if test "$with_gnu_ld" = yes; then + sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib' + else + sys_lib_search_path_spec='/usr/ccs/lib /usr/lib' + case $host_os in + sco3.2v5*) + sys_lib_search_path_spec="$sys_lib_search_path_spec /lib" + ;; + esac + fi + sys_lib_dlsearch_path_spec='/usr/lib' + ;; + +tpf*) + # TPF is a cross-target only. Preferred cross-host = GNU/Linux. + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; + +uts4*) + version_type=linux # correct to gnu/linux during the next big refactor + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + ;; + +*) + dynamic_linker=no + ;; +esac +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $dynamic_linker" >&5 +$as_echo "$dynamic_linker" >&6; } +test "$dynamic_linker" = no && can_build_shared=no + +variables_saved_for_relink="PATH $shlibpath_var $runpath_var" +if test "$GCC" = yes; then + variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" +fi + +if test "${lt_cv_sys_lib_search_path_spec+set}" = set; then + sys_lib_search_path_spec="$lt_cv_sys_lib_search_path_spec" +fi +if test "${lt_cv_sys_lib_dlsearch_path_spec+set}" = set; then + sys_lib_dlsearch_path_spec="$lt_cv_sys_lib_dlsearch_path_spec" +fi + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to hardcode library paths into programs" >&5 +$as_echo_n "checking how to hardcode library paths into programs... " >&6; } +hardcode_action= +if test -n "$hardcode_libdir_flag_spec" || + test -n "$runpath_var" || + test "X$hardcode_automatic" = "Xyes" ; then + + # We can hardcode non-existent directories. + if test "$hardcode_direct" != no && + # If the only mechanism to avoid hardcoding is shlibpath_var, we + # have to relink, otherwise we might link with an installed library + # when we should be linking with a yet-to-be-installed one + ## test "$_LT_TAGVAR(hardcode_shlibpath_var, )" != no && + test "$hardcode_minus_L" != no; then + # Linking always hardcodes the temporary library directory. + hardcode_action=relink + else + # We can link without hardcoding, and we can hardcode nonexisting dirs. + hardcode_action=immediate + fi +else + # We cannot hardcode anything, or else we can only hardcode existing + # directories. + hardcode_action=unsupported +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $hardcode_action" >&5 +$as_echo "$hardcode_action" >&6; } + +if test "$hardcode_action" = relink || + test "$inherit_rpath" = yes; then + # Fast installation is not supported + enable_fast_install=no +elif test "$shlibpath_overrides_runpath" = yes || + test "$enable_shared" = no; then + # Fast installation is not necessary + enable_fast_install=needless +fi + + + + + + + if test "x$enable_dlopen" != xyes; then + enable_dlopen=unknown + enable_dlopen_self=unknown + enable_dlopen_self_static=unknown +else + lt_cv_dlopen=no + lt_cv_dlopen_libs= + + case $host_os in + beos*) + lt_cv_dlopen="load_add_on" + lt_cv_dlopen_libs= + lt_cv_dlopen_self=yes + ;; + + mingw* | pw32* | cegcc*) + lt_cv_dlopen="LoadLibrary" + lt_cv_dlopen_libs= + ;; + + cygwin*) + lt_cv_dlopen="dlopen" + lt_cv_dlopen_libs= + ;; + + darwin*) + # if libdl is installed we need to link against it + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5 +$as_echo_n "checking for dlopen in -ldl... " >&6; } +if ${ac_cv_lib_dl_dlopen+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-ldl $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char dlopen (); +int +main () +{ +return dlopen (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_dl_dlopen=yes +else + ac_cv_lib_dl_dlopen=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5 +$as_echo "$ac_cv_lib_dl_dlopen" >&6; } +if test "x$ac_cv_lib_dl_dlopen" = xyes; then : + lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl" +else + + lt_cv_dlopen="dyld" + lt_cv_dlopen_libs= + lt_cv_dlopen_self=yes + +fi + + ;; + + *) + ac_fn_c_check_func "$LINENO" "shl_load" "ac_cv_func_shl_load" +if test "x$ac_cv_func_shl_load" = xyes; then : + lt_cv_dlopen="shl_load" +else + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for shl_load in -ldld" >&5 +$as_echo_n "checking for shl_load in -ldld... " >&6; } +if ${ac_cv_lib_dld_shl_load+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-ldld $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char shl_load (); +int +main () +{ +return shl_load (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_dld_shl_load=yes +else + ac_cv_lib_dld_shl_load=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dld_shl_load" >&5 +$as_echo "$ac_cv_lib_dld_shl_load" >&6; } +if test "x$ac_cv_lib_dld_shl_load" = xyes; then : + lt_cv_dlopen="shl_load" lt_cv_dlopen_libs="-ldld" +else + ac_fn_c_check_func "$LINENO" "dlopen" "ac_cv_func_dlopen" +if test "x$ac_cv_func_dlopen" = xyes; then : + lt_cv_dlopen="dlopen" +else + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5 +$as_echo_n "checking for dlopen in -ldl... " >&6; } +if ${ac_cv_lib_dl_dlopen+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-ldl $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char dlopen (); +int +main () +{ +return dlopen (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_dl_dlopen=yes +else + ac_cv_lib_dl_dlopen=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5 +$as_echo "$ac_cv_lib_dl_dlopen" >&6; } +if test "x$ac_cv_lib_dl_dlopen" = xyes; then : + lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl" +else + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -lsvld" >&5 +$as_echo_n "checking for dlopen in -lsvld... " >&6; } +if ${ac_cv_lib_svld_dlopen+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lsvld $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char dlopen (); +int +main () +{ +return dlopen (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_svld_dlopen=yes +else + ac_cv_lib_svld_dlopen=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_svld_dlopen" >&5 +$as_echo "$ac_cv_lib_svld_dlopen" >&6; } +if test "x$ac_cv_lib_svld_dlopen" = xyes; then : + lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-lsvld" +else + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dld_link in -ldld" >&5 +$as_echo_n "checking for dld_link in -ldld... " >&6; } +if ${ac_cv_lib_dld_dld_link+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-ldld $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char dld_link (); +int +main () +{ +return dld_link (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_dld_dld_link=yes +else + ac_cv_lib_dld_dld_link=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dld_dld_link" >&5 +$as_echo "$ac_cv_lib_dld_dld_link" >&6; } +if test "x$ac_cv_lib_dld_dld_link" = xyes; then : + lt_cv_dlopen="dld_link" lt_cv_dlopen_libs="-ldld" +fi + + +fi + + +fi + + +fi + + +fi + + +fi + + ;; + esac + + if test "x$lt_cv_dlopen" != xno; then + enable_dlopen=yes + else + enable_dlopen=no + fi + + case $lt_cv_dlopen in + dlopen) + save_CPPFLAGS="$CPPFLAGS" + test "x$ac_cv_header_dlfcn_h" = xyes && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H" + + save_LDFLAGS="$LDFLAGS" + wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\" + + save_LIBS="$LIBS" + LIBS="$lt_cv_dlopen_libs $LIBS" + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether a program can dlopen itself" >&5 +$as_echo_n "checking whether a program can dlopen itself... " >&6; } +if ${lt_cv_dlopen_self+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test "$cross_compiling" = yes; then : + lt_cv_dlopen_self=cross +else + lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 + lt_status=$lt_dlunknown + cat > conftest.$ac_ext <<_LT_EOF +#line $LINENO "configure" +#include "confdefs.h" + +#if HAVE_DLFCN_H +#include +#endif + +#include + +#ifdef RTLD_GLOBAL +# define LT_DLGLOBAL RTLD_GLOBAL +#else +# ifdef DL_GLOBAL +# define LT_DLGLOBAL DL_GLOBAL +# else +# define LT_DLGLOBAL 0 +# endif +#endif + +/* We may have to define LT_DLLAZY_OR_NOW in the command line if we + find out it does not work in some platform. */ +#ifndef LT_DLLAZY_OR_NOW +# ifdef RTLD_LAZY +# define LT_DLLAZY_OR_NOW RTLD_LAZY +# else +# ifdef DL_LAZY +# define LT_DLLAZY_OR_NOW DL_LAZY +# else +# ifdef RTLD_NOW +# define LT_DLLAZY_OR_NOW RTLD_NOW +# else +# ifdef DL_NOW +# define LT_DLLAZY_OR_NOW DL_NOW +# else +# define LT_DLLAZY_OR_NOW 0 +# endif +# endif +# endif +# endif +#endif + +/* When -fvisbility=hidden is used, assume the code has been annotated + correspondingly for the symbols needed. */ +#if defined(__GNUC__) && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3)) +int fnord () __attribute__((visibility("default"))); +#endif + +int fnord () { return 42; } +int main () +{ + void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); + int status = $lt_dlunknown; + + if (self) + { + if (dlsym (self,"fnord")) status = $lt_dlno_uscore; + else + { + if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; + else puts (dlerror ()); + } + /* dlclose (self); */ + } + else + puts (dlerror ()); + + return status; +} +_LT_EOF + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5 + (eval $ac_link) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && test -s conftest${ac_exeext} 2>/dev/null; then + (./conftest; exit; ) >&5 2>/dev/null + lt_status=$? + case x$lt_status in + x$lt_dlno_uscore) lt_cv_dlopen_self=yes ;; + x$lt_dlneed_uscore) lt_cv_dlopen_self=yes ;; + x$lt_dlunknown|x*) lt_cv_dlopen_self=no ;; + esac + else : + # compilation failed + lt_cv_dlopen_self=no + fi +fi +rm -fr conftest* + + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_dlopen_self" >&5 +$as_echo "$lt_cv_dlopen_self" >&6; } + + if test "x$lt_cv_dlopen_self" = xyes; then + wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $lt_prog_compiler_static\" + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether a statically linked program can dlopen itself" >&5 +$as_echo_n "checking whether a statically linked program can dlopen itself... " >&6; } +if ${lt_cv_dlopen_self_static+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test "$cross_compiling" = yes; then : + lt_cv_dlopen_self_static=cross +else + lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 + lt_status=$lt_dlunknown + cat > conftest.$ac_ext <<_LT_EOF +#line $LINENO "configure" +#include "confdefs.h" + +#if HAVE_DLFCN_H +#include +#endif + +#include + +#ifdef RTLD_GLOBAL +# define LT_DLGLOBAL RTLD_GLOBAL +#else +# ifdef DL_GLOBAL +# define LT_DLGLOBAL DL_GLOBAL +# else +# define LT_DLGLOBAL 0 +# endif +#endif + +/* We may have to define LT_DLLAZY_OR_NOW in the command line if we + find out it does not work in some platform. */ +#ifndef LT_DLLAZY_OR_NOW +# ifdef RTLD_LAZY +# define LT_DLLAZY_OR_NOW RTLD_LAZY +# else +# ifdef DL_LAZY +# define LT_DLLAZY_OR_NOW DL_LAZY +# else +# ifdef RTLD_NOW +# define LT_DLLAZY_OR_NOW RTLD_NOW +# else +# ifdef DL_NOW +# define LT_DLLAZY_OR_NOW DL_NOW +# else +# define LT_DLLAZY_OR_NOW 0 +# endif +# endif +# endif +# endif +#endif + +/* When -fvisbility=hidden is used, assume the code has been annotated + correspondingly for the symbols needed. */ +#if defined(__GNUC__) && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3)) +int fnord () __attribute__((visibility("default"))); +#endif + +int fnord () { return 42; } +int main () +{ + void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); + int status = $lt_dlunknown; + + if (self) + { + if (dlsym (self,"fnord")) status = $lt_dlno_uscore; + else + { + if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; + else puts (dlerror ()); + } + /* dlclose (self); */ + } + else + puts (dlerror ()); + + return status; +} +_LT_EOF + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5 + (eval $ac_link) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && test -s conftest${ac_exeext} 2>/dev/null; then + (./conftest; exit; ) >&5 2>/dev/null + lt_status=$? + case x$lt_status in + x$lt_dlno_uscore) lt_cv_dlopen_self_static=yes ;; + x$lt_dlneed_uscore) lt_cv_dlopen_self_static=yes ;; + x$lt_dlunknown|x*) lt_cv_dlopen_self_static=no ;; + esac + else : + # compilation failed + lt_cv_dlopen_self_static=no + fi +fi +rm -fr conftest* + + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_dlopen_self_static" >&5 +$as_echo "$lt_cv_dlopen_self_static" >&6; } + fi + + CPPFLAGS="$save_CPPFLAGS" + LDFLAGS="$save_LDFLAGS" + LIBS="$save_LIBS" + ;; + esac + + case $lt_cv_dlopen_self in + yes|no) enable_dlopen_self=$lt_cv_dlopen_self ;; + *) enable_dlopen_self=unknown ;; + esac + + case $lt_cv_dlopen_self_static in + yes|no) enable_dlopen_self_static=$lt_cv_dlopen_self_static ;; + *) enable_dlopen_self_static=unknown ;; + esac +fi + + + + + + + + + + + + + + + + + +striplib= +old_striplib= +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether stripping libraries is possible" >&5 +$as_echo_n "checking whether stripping libraries is possible... " >&6; } +if test -n "$STRIP" && $STRIP -V 2>&1 | $GREP "GNU strip" >/dev/null; then + test -z "$old_striplib" && old_striplib="$STRIP --strip-debug" + test -z "$striplib" && striplib="$STRIP --strip-unneeded" + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } +else +# FIXME - insert some real tests, host_os isn't really good enough + case $host_os in + darwin*) + if test -n "$STRIP" ; then + striplib="$STRIP -x" + old_striplib="$STRIP -S" + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + fi + ;; + *) + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + ;; + esac +fi + + + + + + + + + + + + + # Report which library types will actually be built + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if libtool supports shared libraries" >&5 +$as_echo_n "checking if libtool supports shared libraries... " >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $can_build_shared" >&5 +$as_echo "$can_build_shared" >&6; } + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build shared libraries" >&5 +$as_echo_n "checking whether to build shared libraries... " >&6; } + test "$can_build_shared" = "no" && enable_shared=no + + # On AIX, shared libraries and static libraries use the same namespace, and + # are all built from PIC. + case $host_os in + aix3*) + test "$enable_shared" = yes && enable_static=no + if test -n "$RANLIB"; then + archive_cmds="$archive_cmds~\$RANLIB \$lib" + postinstall_cmds='$RANLIB $lib' + fi + ;; + + aix[4-9]*) + if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then + test "$enable_shared" = yes && enable_static=no + fi + ;; + esac + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_shared" >&5 +$as_echo "$enable_shared" >&6; } + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build static libraries" >&5 +$as_echo_n "checking whether to build static libraries... " >&6; } + # Make sure either enable_shared or enable_static is yes. + test "$enable_shared" = yes || enable_static=yes + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_static" >&5 +$as_echo "$enable_static" >&6; } + + + + +fi +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + +CC="$lt_save_CC" + + if test -n "$CXX" && ( test "X$CXX" != "Xno" && + ( (test "X$CXX" = "Xg++" && `g++ -v >/dev/null 2>&1` ) || + (test "X$CXX" != "Xg++"))) ; then + ac_ext=cpp +ac_cpp='$CXXCPP $CPPFLAGS' +ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_cxx_compiler_gnu +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C++ preprocessor" >&5 +$as_echo_n "checking how to run the C++ preprocessor... " >&6; } +if test -z "$CXXCPP"; then + if ${ac_cv_prog_CXXCPP+:} false; then : + $as_echo_n "(cached) " >&6 +else + # Double quotes because CXXCPP needs to be expanded + for CXXCPP in "$CXX -E" "/lib/cpp" + do + ac_preproc_ok=false +for ac_cxx_preproc_warn_flag in '' yes +do + # Use a header file that comes with gcc, so configuring glibc + # with a fresh cross-compiler works. + # Prefer to if __STDC__ is defined, since + # exists even on freestanding compilers. + # On the NeXT, cc -E runs the code through the compiler's parser, + # not just through cpp. "Syntax error" is here to catch this case. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +@%:@ifdef __STDC__ +@%:@ include +@%:@else +@%:@ include +@%:@endif + Syntax error +_ACEOF +if ac_fn_cxx_try_cpp "$LINENO"; then : + +else + # Broken: fails on valid input. +continue +fi +rm -f conftest.err conftest.i conftest.$ac_ext + + # OK, works on sane cases. Now check whether nonexistent headers + # can be detected and how. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +@%:@include +_ACEOF +if ac_fn_cxx_try_cpp "$LINENO"; then : + # Broken: success on invalid input. +continue +else + # Passes both tests. +ac_preproc_ok=: +break +fi +rm -f conftest.err conftest.i conftest.$ac_ext + +done +# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. +rm -f conftest.i conftest.err conftest.$ac_ext +if $ac_preproc_ok; then : + break +fi + + done + ac_cv_prog_CXXCPP=$CXXCPP + +fi + CXXCPP=$ac_cv_prog_CXXCPP +else + ac_cv_prog_CXXCPP=$CXXCPP +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $CXXCPP" >&5 +$as_echo "$CXXCPP" >&6; } +ac_preproc_ok=false +for ac_cxx_preproc_warn_flag in '' yes +do + # Use a header file that comes with gcc, so configuring glibc + # with a fresh cross-compiler works. + # Prefer to if __STDC__ is defined, since + # exists even on freestanding compilers. + # On the NeXT, cc -E runs the code through the compiler's parser, + # not just through cpp. "Syntax error" is here to catch this case. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +@%:@ifdef __STDC__ +@%:@ include +@%:@else +@%:@ include +@%:@endif + Syntax error +_ACEOF +if ac_fn_cxx_try_cpp "$LINENO"; then : + +else + # Broken: fails on valid input. +continue +fi +rm -f conftest.err conftest.i conftest.$ac_ext + + # OK, works on sane cases. Now check whether nonexistent headers + # can be detected and how. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +@%:@include +_ACEOF +if ac_fn_cxx_try_cpp "$LINENO"; then : + # Broken: success on invalid input. +continue +else + # Passes both tests. +ac_preproc_ok=: +break +fi +rm -f conftest.err conftest.i conftest.$ac_ext + +done +# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. +rm -f conftest.i conftest.err conftest.$ac_ext +if $ac_preproc_ok; then : + +else + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "C++ preprocessor \"$CXXCPP\" fails sanity check +See \`config.log' for more details" "$LINENO" 5; } +fi + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + +else + _lt_caught_CXX_error=yes +fi + +ac_ext=cpp +ac_cpp='$CXXCPP $CPPFLAGS' +ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_cxx_compiler_gnu + +archive_cmds_need_lc_CXX=no +allow_undefined_flag_CXX= +always_export_symbols_CXX=no +archive_expsym_cmds_CXX= +compiler_needs_object_CXX=no +export_dynamic_flag_spec_CXX= +hardcode_direct_CXX=no +hardcode_direct_absolute_CXX=no +hardcode_libdir_flag_spec_CXX= +hardcode_libdir_separator_CXX= +hardcode_minus_L_CXX=no +hardcode_shlibpath_var_CXX=unsupported +hardcode_automatic_CXX=no +inherit_rpath_CXX=no +module_cmds_CXX= +module_expsym_cmds_CXX= +link_all_deplibs_CXX=unknown +old_archive_cmds_CXX=$old_archive_cmds +reload_flag_CXX=$reload_flag +reload_cmds_CXX=$reload_cmds +no_undefined_flag_CXX= +whole_archive_flag_spec_CXX= +enable_shared_with_static_runtimes_CXX=no + +# Source file extension for C++ test sources. +ac_ext=cpp + +# Object file extension for compiled C++ test sources. +objext=o +objext_CXX=$objext + +# No sense in running all these tests if we already determined that +# the CXX compiler isn't working. Some variables (like enable_shared) +# are currently assumed to apply to all compilers on this platform, +# and will be corrupted by setting them based on a non-working compiler. +if test "$_lt_caught_CXX_error" != yes; then + # Code to be used in simple compile tests + lt_simple_compile_test_code="int some_variable = 0;" + + # Code to be used in simple link tests + lt_simple_link_test_code='int main(int, char *[]) { return(0); }' + + # ltmain only uses $CC for tagged configurations so make sure $CC is set. + + + + + + +# If no C compiler was specified, use CC. +LTCC=${LTCC-"$CC"} + +# If no C compiler flags were specified, use CFLAGS. +LTCFLAGS=${LTCFLAGS-"$CFLAGS"} + +# Allow CC to be a program name with arguments. +compiler=$CC + + + # save warnings/boilerplate of simple test code + ac_outfile=conftest.$ac_objext +echo "$lt_simple_compile_test_code" >conftest.$ac_ext +eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err +_lt_compiler_boilerplate=`cat conftest.err` +$RM conftest* + + ac_outfile=conftest.$ac_objext +echo "$lt_simple_link_test_code" >conftest.$ac_ext +eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err +_lt_linker_boilerplate=`cat conftest.err` +$RM -r conftest* + + + # Allow CC to be a program name with arguments. + lt_save_CC=$CC + lt_save_CFLAGS=$CFLAGS + lt_save_LD=$LD + lt_save_GCC=$GCC + GCC=$GXX + lt_save_with_gnu_ld=$with_gnu_ld + lt_save_path_LD=$lt_cv_path_LD + if test -n "${lt_cv_prog_gnu_ldcxx+set}"; then + lt_cv_prog_gnu_ld=$lt_cv_prog_gnu_ldcxx + else + $as_unset lt_cv_prog_gnu_ld + fi + if test -n "${lt_cv_path_LDCXX+set}"; then + lt_cv_path_LD=$lt_cv_path_LDCXX + else + $as_unset lt_cv_path_LD + fi + test -z "${LDCXX+set}" || LD=$LDCXX + CC=${CXX-"c++"} + CFLAGS=$CXXFLAGS + compiler=$CC + compiler_CXX=$CC + for cc_temp in $compiler""; do + case $cc_temp in + compile | *[\\/]compile | ccache | *[\\/]ccache ) ;; + distcc | *[\\/]distcc | purify | *[\\/]purify ) ;; + \-*) ;; + *) break;; + esac +done +cc_basename=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"` + + + if test -n "$compiler"; then + # We don't want -fno-exception when compiling C++ code, so set the + # no_builtin_flag separately + if test "$GXX" = yes; then + lt_prog_compiler_no_builtin_flag_CXX=' -fno-builtin' + else + lt_prog_compiler_no_builtin_flag_CXX= + fi + + if test "$GXX" = yes; then + # Set up default GNU C++ configuration + + + +@%:@ Check whether --with-gnu-ld was given. +if test "${with_gnu_ld+set}" = set; then : + withval=$with_gnu_ld; test "$withval" = no || with_gnu_ld=yes +else + with_gnu_ld=no +fi + +ac_prog=ld +if test "$GCC" = yes; then + # Check if gcc -print-prog-name=ld gives a path. + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ld used by $CC" >&5 +$as_echo_n "checking for ld used by $CC... " >&6; } + case $host in + *-*-mingw*) + # gcc leaves a trailing carriage return which upsets mingw + ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;; + *) + ac_prog=`($CC -print-prog-name=ld) 2>&5` ;; + esac + case $ac_prog in + # Accept absolute paths. + [\\/]* | ?:[\\/]*) + re_direlt='/[^/][^/]*/\.\./' + # Canonicalize the pathname of ld + ac_prog=`$ECHO "$ac_prog"| $SED 's%\\\\%/%g'` + while $ECHO "$ac_prog" | $GREP "$re_direlt" > /dev/null 2>&1; do + ac_prog=`$ECHO $ac_prog| $SED "s%$re_direlt%/%"` + done + test -z "$LD" && LD="$ac_prog" + ;; + "") + # If it fails, then pretend we aren't using GCC. + ac_prog=ld + ;; + *) + # If it is relative, then search for the first ld in PATH. + with_gnu_ld=unknown + ;; + esac +elif test "$with_gnu_ld" = yes; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU ld" >&5 +$as_echo_n "checking for GNU ld... " >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for non-GNU ld" >&5 +$as_echo_n "checking for non-GNU ld... " >&6; } +fi +if ${lt_cv_path_LD+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -z "$LD"; then + lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR + for ac_dir in $PATH; do + IFS="$lt_save_ifs" + test -z "$ac_dir" && ac_dir=. + if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then + lt_cv_path_LD="$ac_dir/$ac_prog" + # Check to see if the program is GNU ld. I'd rather use --version, + # but apparently some variants of GNU ld only accept -v. + # Break only if it was the GNU/non-GNU ld that we prefer. + case `"$lt_cv_path_LD" -v 2>&1 &5 +$as_echo "$LD" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi +test -z "$LD" && as_fn_error $? "no acceptable ld found in \$PATH" "$LINENO" 5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if the linker ($LD) is GNU ld" >&5 +$as_echo_n "checking if the linker ($LD) is GNU ld... " >&6; } +if ${lt_cv_prog_gnu_ld+:} false; then : + $as_echo_n "(cached) " >&6 +else + # I'd rather use --version here, but apparently some GNU lds only accept -v. +case `$LD -v 2>&1 &5 +$as_echo "$lt_cv_prog_gnu_ld" >&6; } +with_gnu_ld=$lt_cv_prog_gnu_ld + + + + + + + + # Check if GNU C++ uses GNU ld as the underlying linker, since the + # archiving commands below assume that GNU ld is being used. + if test "$with_gnu_ld" = yes; then + archive_cmds_CXX='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' + archive_expsym_cmds_CXX='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + + hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir' + export_dynamic_flag_spec_CXX='${wl}--export-dynamic' + + # If archive_cmds runs LD, not CC, wlarc should be empty + # XXX I think wlarc can be eliminated in ltcf-cxx, but I need to + # investigate it a little bit more. (MM) + wlarc='${wl}' + + # ancient GNU ld didn't support --whole-archive et. al. + if eval "`$CC -print-prog-name=ld` --help 2>&1" | + $GREP 'no-whole-archive' > /dev/null; then + whole_archive_flag_spec_CXX="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' + else + whole_archive_flag_spec_CXX= + fi + else + with_gnu_ld=no + wlarc= + + # A generic and very simple default shared library creation + # command for GNU C++ for the case where it uses the native + # linker, instead of GNU ld. If possible, this setting should + # overridden to take advantage of the native linker features on + # the platform it is being used on. + archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib' + fi + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' + + else + GXX=no + with_gnu_ld=no + wlarc= + fi + + # PORTME: fill in a description of your system's C++ link characteristics + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $compiler linker ($LD) supports shared libraries" >&5 +$as_echo_n "checking whether the $compiler linker ($LD) supports shared libraries... " >&6; } + ld_shlibs_CXX=yes + case $host_os in + aix3*) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + aix[4-9]*) + if test "$host_cpu" = ia64; then + # On IA64, the linker does run time linking by default, so we don't + # have to do anything special. + aix_use_runtimelinking=no + exp_sym_flag='-Bexport' + no_entry_flag="" + else + aix_use_runtimelinking=no + + # Test if we are trying to use run time linking or normal + # AIX style linking. If -brtl is somewhere in LDFLAGS, we + # need to do runtime linking. + case $host_os in aix4.[23]|aix4.[23].*|aix[5-9]*) + for ld_flag in $LDFLAGS; do + case $ld_flag in + *-brtl*) + aix_use_runtimelinking=yes + break + ;; + esac + done + ;; + esac + + exp_sym_flag='-bexport' + no_entry_flag='-bnoentry' + fi + + # When large executables or shared objects are built, AIX ld can + # have problems creating the table of contents. If linking a library + # or program results in "error TOC overflow" add -mminimal-toc to + # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not + # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. + + archive_cmds_CXX='' + hardcode_direct_CXX=yes + hardcode_direct_absolute_CXX=yes + hardcode_libdir_separator_CXX=':' + link_all_deplibs_CXX=yes + file_list_spec_CXX='${wl}-f,' + + if test "$GXX" = yes; then + case $host_os in aix4.[012]|aix4.[012].*) + # We only want to do this on AIX 4.2 and lower, the check + # below for broken collect2 doesn't work under 4.3+ + collect2name=`${CC} -print-prog-name=collect2` + if test -f "$collect2name" && + strings "$collect2name" | $GREP resolve_lib_name >/dev/null + then + # We have reworked collect2 + : + else + # We have old collect2 + hardcode_direct_CXX=unsupported + # It fails to find uninstalled libraries when the uninstalled + # path is not listed in the libpath. Setting hardcode_minus_L + # to unsupported forces relinking + hardcode_minus_L_CXX=yes + hardcode_libdir_flag_spec_CXX='-L$libdir' + hardcode_libdir_separator_CXX= + fi + esac + shared_flag='-shared' + if test "$aix_use_runtimelinking" = yes; then + shared_flag="$shared_flag "'${wl}-G' + fi + else + # not using gcc + if test "$host_cpu" = ia64; then + # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release + # chokes on -Wl,-G. The following line is correct: + shared_flag='-G' + else + if test "$aix_use_runtimelinking" = yes; then + shared_flag='${wl}-G' + else + shared_flag='${wl}-bM:SRE' + fi + fi + fi + + export_dynamic_flag_spec_CXX='${wl}-bexpall' + # It seems that -bexpall does not export symbols beginning with + # underscore (_), so it is better to generate a list of symbols to + # export. + always_export_symbols_CXX=yes + if test "$aix_use_runtimelinking" = yes; then + # Warning - without using the other runtime loading flags (-brtl), + # -berok will link without error, but may produce a broken library. + allow_undefined_flag_CXX='-berok' + # Determine the default libpath from the value encoded in an empty + # executable. + if test "${lt_cv_aix_libpath+set}" = set; then + aix_libpath=$lt_cv_aix_libpath +else + if ${lt_cv_aix_libpath__CXX+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_cxx_try_link "$LINENO"; then : + + lt_aix_libpath_sed=' + /Import File Strings/,/^$/ { + /^0/ { + s/^0 *\([^ ]*\) *$/\1/ + p + } + }' + lt_cv_aix_libpath__CXX=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` + # Check for a 64-bit object if we didn't find anything. + if test -z "$lt_cv_aix_libpath__CXX"; then + lt_cv_aix_libpath__CXX=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` + fi +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + if test -z "$lt_cv_aix_libpath__CXX"; then + lt_cv_aix_libpath__CXX="/usr/lib:/lib" + fi + +fi + + aix_libpath=$lt_cv_aix_libpath__CXX +fi + + hardcode_libdir_flag_spec_CXX='${wl}-blibpath:$libdir:'"$aix_libpath" + + archive_expsym_cmds_CXX='$CC -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then func_echo_all "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag" + else + if test "$host_cpu" = ia64; then + hardcode_libdir_flag_spec_CXX='${wl}-R $libdir:/usr/lib:/lib' + allow_undefined_flag_CXX="-z nodefs" + archive_expsym_cmds_CXX="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols" + else + # Determine the default libpath from the value encoded in an + # empty executable. + if test "${lt_cv_aix_libpath+set}" = set; then + aix_libpath=$lt_cv_aix_libpath +else + if ${lt_cv_aix_libpath__CXX+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_cxx_try_link "$LINENO"; then : + + lt_aix_libpath_sed=' + /Import File Strings/,/^$/ { + /^0/ { + s/^0 *\([^ ]*\) *$/\1/ + p + } + }' + lt_cv_aix_libpath__CXX=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` + # Check for a 64-bit object if we didn't find anything. + if test -z "$lt_cv_aix_libpath__CXX"; then + lt_cv_aix_libpath__CXX=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` + fi +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + if test -z "$lt_cv_aix_libpath__CXX"; then + lt_cv_aix_libpath__CXX="/usr/lib:/lib" + fi + +fi + + aix_libpath=$lt_cv_aix_libpath__CXX +fi + + hardcode_libdir_flag_spec_CXX='${wl}-blibpath:$libdir:'"$aix_libpath" + # Warning - without using the other run time loading flags, + # -berok will link without error, but may produce a broken library. + no_undefined_flag_CXX=' ${wl}-bernotok' + allow_undefined_flag_CXX=' ${wl}-berok' + if test "$with_gnu_ld" = yes; then + # We only use this code for GNU lds that support --whole-archive. + whole_archive_flag_spec_CXX='${wl}--whole-archive$convenience ${wl}--no-whole-archive' + else + # Exported symbols can be pulled into shared objects from archives + whole_archive_flag_spec_CXX='$convenience' + fi + archive_cmds_need_lc_CXX=yes + # This is similar to how AIX traditionally builds its shared + # libraries. + archive_expsym_cmds_CXX="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' + fi + fi + ;; + + beos*) + if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then + allow_undefined_flag_CXX=unsupported + # Joseph Beckenbach says some releases of gcc + # support --undefined. This deserves some investigation. FIXME + archive_cmds_CXX='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + else + ld_shlibs_CXX=no + fi + ;; + + chorus*) + case $cc_basename in + *) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + esac + ;; + + cygwin* | mingw* | pw32* | cegcc*) + case $GXX,$cc_basename in + ,cl* | no,cl*) + # Native MSVC + # hardcode_libdir_flag_spec is actually meaningless, as there is + # no search path for DLLs. + hardcode_libdir_flag_spec_CXX=' ' + allow_undefined_flag_CXX=unsupported + always_export_symbols_CXX=yes + file_list_spec_CXX='@' + # Tell ltmain to make .lib files, not .a files. + libext=lib + # Tell ltmain to make .dll files, not .so files. + shrext_cmds=".dll" + # FIXME: Setting linknames here is a bad hack. + archive_cmds_CXX='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-dll~linknames=' + archive_expsym_cmds_CXX='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then + $SED -n -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' -e '1\\\!p' < $export_symbols > $output_objdir/$soname.exp; + else + $SED -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' < $export_symbols > $output_objdir/$soname.exp; + fi~ + $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~ + linknames=' + # The linker will not automatically build a static lib if we build a DLL. + # _LT_TAGVAR(old_archive_from_new_cmds, CXX)='true' + enable_shared_with_static_runtimes_CXX=yes + # Don't use ranlib + old_postinstall_cmds_CXX='chmod 644 $oldlib' + postlink_cmds_CXX='lt_outputfile="@OUTPUT@"~ + lt_tool_outputfile="@TOOL_OUTPUT@"~ + case $lt_outputfile in + *.exe|*.EXE) ;; + *) + lt_outputfile="$lt_outputfile.exe" + lt_tool_outputfile="$lt_tool_outputfile.exe" + ;; + esac~ + func_to_tool_file "$lt_outputfile"~ + if test "$MANIFEST_TOOL" != ":" && test -f "$lt_outputfile.manifest"; then + $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1; + $RM "$lt_outputfile.manifest"; + fi' + ;; + *) + # g++ + # _LT_TAGVAR(hardcode_libdir_flag_spec, CXX) is actually meaningless, + # as there is no search path for DLLs. + hardcode_libdir_flag_spec_CXX='-L$libdir' + export_dynamic_flag_spec_CXX='${wl}--export-all-symbols' + allow_undefined_flag_CXX=unsupported + always_export_symbols_CXX=no + enable_shared_with_static_runtimes_CXX=yes + + if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then + archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' + # If the export-symbols file already is a .def file (1st line + # is EXPORTS), use it as is; otherwise, prepend... + archive_expsym_cmds_CXX='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then + cp $export_symbols $output_objdir/$soname.def; + else + echo EXPORTS > $output_objdir/$soname.def; + cat $export_symbols >> $output_objdir/$soname.def; + fi~ + $CC -shared -nostdlib $output_objdir/$soname.def $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' + else + ld_shlibs_CXX=no + fi + ;; + esac + ;; + darwin* | rhapsody*) + + + archive_cmds_need_lc_CXX=no + hardcode_direct_CXX=no + hardcode_automatic_CXX=yes + hardcode_shlibpath_var_CXX=unsupported + if test "$lt_cv_ld_force_load" = "yes"; then + whole_archive_flag_spec_CXX='`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience ${wl}-force_load,$conv\"; done; func_echo_all \"$new_convenience\"`' + + else + whole_archive_flag_spec_CXX='' + fi + link_all_deplibs_CXX=yes + allow_undefined_flag_CXX="$_lt_dar_allow_undefined" + case $cc_basename in + ifort*) _lt_dar_can_shared=yes ;; + *) _lt_dar_can_shared=$GCC ;; + esac + if test "$_lt_dar_can_shared" = "yes"; then + output_verbose_link_cmd=func_echo_all + archive_cmds_CXX="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod${_lt_dsymutil}" + module_cmds_CXX="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dsymutil}" + archive_expsym_cmds_CXX="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring ${_lt_dar_single_mod}${_lt_dar_export_syms}${_lt_dsymutil}" + module_expsym_cmds_CXX="sed -e 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dar_export_syms}${_lt_dsymutil}" + if test "$lt_cv_apple_cc_single_mod" != "yes"; then + archive_cmds_CXX="\$CC -r -keep_private_externs -nostdlib -o \${lib}-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \${lib}-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring${_lt_dsymutil}" + archive_expsym_cmds_CXX="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -r -keep_private_externs -nostdlib -o \${lib}-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \${lib}-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring${_lt_dar_export_syms}${_lt_dsymutil}" + fi + + else + ld_shlibs_CXX=no + fi + + ;; + + dgux*) + case $cc_basename in + ec++*) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + ghcx*) + # Green Hills C++ Compiler + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + *) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + esac + ;; + + freebsd2.*) + # C++ shared libraries reported to be fairly broken before + # switch to ELF + ld_shlibs_CXX=no + ;; + + freebsd-elf*) + archive_cmds_need_lc_CXX=no + ;; + + freebsd* | dragonfly*) + # FreeBSD 3 and later use GNU C++ and GNU ld with standard ELF + # conventions + ld_shlibs_CXX=yes + ;; + + gnu*) + ;; + + haiku*) + archive_cmds_CXX='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + link_all_deplibs_CXX=yes + ;; + + hpux9*) + hardcode_libdir_flag_spec_CXX='${wl}+b ${wl}$libdir' + hardcode_libdir_separator_CXX=: + export_dynamic_flag_spec_CXX='${wl}-E' + hardcode_direct_CXX=yes + hardcode_minus_L_CXX=yes # Not in the search PATH, + # but as the default + # location of the library. + + case $cc_basename in + CC*) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + aCC*) + archive_cmds_CXX='$RM $output_objdir/$soname~$CC -b ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $EGREP "\-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' + ;; + *) + if test "$GXX" = yes; then + archive_cmds_CXX='$RM $output_objdir/$soname~$CC -shared -nostdlib $pic_flag ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' + else + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + fi + ;; + esac + ;; + + hpux10*|hpux11*) + if test $with_gnu_ld = no; then + hardcode_libdir_flag_spec_CXX='${wl}+b ${wl}$libdir' + hardcode_libdir_separator_CXX=: + + case $host_cpu in + hppa*64*|ia64*) + ;; + *) + export_dynamic_flag_spec_CXX='${wl}-E' + ;; + esac + fi + case $host_cpu in + hppa*64*|ia64*) + hardcode_direct_CXX=no + hardcode_shlibpath_var_CXX=no + ;; + *) + hardcode_direct_CXX=yes + hardcode_direct_absolute_CXX=yes + hardcode_minus_L_CXX=yes # Not in the search PATH, + # but as the default + # location of the library. + ;; + esac + + case $cc_basename in + CC*) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + aCC*) + case $host_cpu in + hppa*64*) + archive_cmds_CXX='$CC -b ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + ia64*) + archive_cmds_CXX='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + *) + archive_cmds_CXX='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + esac + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $GREP "\-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' + ;; + *) + if test "$GXX" = yes; then + if test $with_gnu_ld = no; then + case $host_cpu in + hppa*64*) + archive_cmds_CXX='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + ia64*) + archive_cmds_CXX='$CC -shared -nostdlib $pic_flag ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + *) + archive_cmds_CXX='$CC -shared -nostdlib $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + esac + fi + else + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + fi + ;; + esac + ;; + + interix[3-9]*) + hardcode_direct_CXX=no + hardcode_shlibpath_var_CXX=no + hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir' + export_dynamic_flag_spec_CXX='${wl}-E' + # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. + # Instead, shared libraries are loaded at an image base (0x10000000 by + # default) and relocated if they conflict, which is a slow very memory + # consuming and fragmenting process. To avoid this, we pick a random, + # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link + # time. Moving up from 0x10000000 also allows more sbrk(2) space. + archive_cmds_CXX='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' + archive_expsym_cmds_CXX='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' + ;; + irix5* | irix6*) + case $cc_basename in + CC*) + # SGI C++ + archive_cmds_CXX='$CC -shared -all -multigot $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' + + # Archives containing C++ object files must be created using + # "CC -ar", where "CC" is the IRIX C++ compiler. This is + # necessary to make sure instantiated templates are included + # in the archive. + old_archive_cmds_CXX='$CC -ar -WR,-u -o $oldlib $oldobjs' + ;; + *) + if test "$GXX" = yes; then + if test "$with_gnu_ld" = no; then + archive_cmds_CXX='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + else + archive_cmds_CXX='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` -o $lib' + fi + fi + link_all_deplibs_CXX=yes + ;; + esac + hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir' + hardcode_libdir_separator_CXX=: + inherit_rpath_CXX=yes + ;; + + linux* | k*bsd*-gnu | kopensolaris*-gnu) + case $cc_basename in + KCC*) + # Kuck and Associates, Inc. (KAI) C++ Compiler + + # KCC will only create a shared library if the output file + # ends with ".so" (or ".sl" for HP-UX), so rename the library + # to its proper name (with version) after linking. + archive_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' + archive_expsym_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib ${wl}-retain-symbols-file,$export_symbols; mv \$templib $lib' + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`$CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 | $GREP "ld"`; rm -f libconftest$shared_ext; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' + + hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir' + export_dynamic_flag_spec_CXX='${wl}--export-dynamic' + + # Archives containing C++ object files must be created using + # "CC -Bstatic", where "CC" is the KAI C++ compiler. + old_archive_cmds_CXX='$CC -Bstatic -o $oldlib $oldobjs' + ;; + icpc* | ecpc* ) + # Intel C++ + with_gnu_ld=yes + # version 8.0 and above of icpc choke on multiply defined symbols + # if we add $predep_objects and $postdep_objects, however 7.1 and + # earlier do not add the objects themselves. + case `$CC -V 2>&1` in + *"Version 7."*) + archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' + archive_expsym_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + ;; + *) # Version 8.0 or newer + tmp_idyn= + case $host_cpu in + ia64*) tmp_idyn=' -i_dynamic';; + esac + archive_cmds_CXX='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + archive_expsym_cmds_CXX='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + ;; + esac + archive_cmds_need_lc_CXX=no + hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir' + export_dynamic_flag_spec_CXX='${wl}--export-dynamic' + whole_archive_flag_spec_CXX='${wl}--whole-archive$convenience ${wl}--no-whole-archive' + ;; + pgCC* | pgcpp*) + # Portland Group C++ compiler + case `$CC -V` in + *pgCC\ [1-5].* | *pgcpp\ [1-5].*) + prelink_cmds_CXX='tpldir=Template.dir~ + rm -rf $tpldir~ + $CC --prelink_objects --instantiation_dir $tpldir $objs $libobjs $compile_deplibs~ + compile_command="$compile_command `find $tpldir -name \*.o | sort | $NL2SP`"' + old_archive_cmds_CXX='tpldir=Template.dir~ + rm -rf $tpldir~ + $CC --prelink_objects --instantiation_dir $tpldir $oldobjs$old_deplibs~ + $AR $AR_FLAGS $oldlib$oldobjs$old_deplibs `find $tpldir -name \*.o | sort | $NL2SP`~ + $RANLIB $oldlib' + archive_cmds_CXX='tpldir=Template.dir~ + rm -rf $tpldir~ + $CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~ + $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname -o $lib' + archive_expsym_cmds_CXX='tpldir=Template.dir~ + rm -rf $tpldir~ + $CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~ + $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname ${wl}-retain-symbols-file ${wl}$export_symbols -o $lib' + ;; + *) # Version 6 and above use weak symbols + archive_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname -o $lib' + archive_expsym_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname ${wl}-retain-symbols-file ${wl}$export_symbols -o $lib' + ;; + esac + + hardcode_libdir_flag_spec_CXX='${wl}--rpath ${wl}$libdir' + export_dynamic_flag_spec_CXX='${wl}--export-dynamic' + whole_archive_flag_spec_CXX='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' + ;; + cxx*) + # Compaq C++ + archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' + archive_expsym_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib ${wl}-retain-symbols-file $wl$export_symbols' + + runpath_var=LD_RUN_PATH + hardcode_libdir_flag_spec_CXX='-rpath $libdir' + hardcode_libdir_separator_CXX=: + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld"`; templist=`func_echo_all "$templist" | $SED "s/\(^.*ld.*\)\( .*ld .*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "X$list" | $Xsed' + ;; + xl* | mpixl* | bgxl*) + # IBM XL 8.0 on PPC, with GNU ld + hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir' + export_dynamic_flag_spec_CXX='${wl}--export-dynamic' + archive_cmds_CXX='$CC -qmkshrobj $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + if test "x$supports_anon_versioning" = xyes; then + archive_expsym_cmds_CXX='echo "{ global:" > $output_objdir/$libname.ver~ + cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ + echo "local: *; };" >> $output_objdir/$libname.ver~ + $CC -qmkshrobj $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib' + fi + ;; + *) + case `$CC -V 2>&1 | sed 5q` in + *Sun\ C*) + # Sun C++ 5.9 + no_undefined_flag_CXX=' -zdefs' + archive_cmds_CXX='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + archive_expsym_cmds_CXX='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file ${wl}$export_symbols' + hardcode_libdir_flag_spec_CXX='-R$libdir' + whole_archive_flag_spec_CXX='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' + compiler_needs_object_CXX=yes + + # Not sure whether something based on + # $CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 + # would be better. + output_verbose_link_cmd='func_echo_all' + + # Archives containing C++ object files must be created using + # "CC -xar", where "CC" is the Sun C++ compiler. This is + # necessary to make sure instantiated templates are included + # in the archive. + old_archive_cmds_CXX='$CC -xar -o $oldlib $oldobjs' + ;; + esac + ;; + esac + ;; + + lynxos*) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + + m88k*) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + + mvs*) + case $cc_basename in + cxx*) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + *) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + esac + ;; + + netbsd*) + if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then + archive_cmds_CXX='$LD -Bshareable -o $lib $predep_objects $libobjs $deplibs $postdep_objects $linker_flags' + wlarc= + hardcode_libdir_flag_spec_CXX='-R$libdir' + hardcode_direct_CXX=yes + hardcode_shlibpath_var_CXX=no + fi + # Workaround some broken pre-1.5 toolchains + output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP conftest.$objext | $SED -e "s:-lgcc -lc -lgcc::"' + ;; + + *nto* | *qnx*) + ld_shlibs_CXX=yes + ;; + + openbsd2*) + # C++ shared libraries are fairly broken + ld_shlibs_CXX=no + ;; + + openbsd*) + if test -f /usr/libexec/ld.so; then + hardcode_direct_CXX=yes + hardcode_shlibpath_var_CXX=no + hardcode_direct_absolute_CXX=yes + archive_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib' + hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir' + if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then + archive_expsym_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file,$export_symbols -o $lib' + export_dynamic_flag_spec_CXX='${wl}-E' + whole_archive_flag_spec_CXX="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' + fi + output_verbose_link_cmd=func_echo_all + else + ld_shlibs_CXX=no + fi + ;; + + osf3* | osf4* | osf5*) + case $cc_basename in + KCC*) + # Kuck and Associates, Inc. (KAI) C++ Compiler + + # KCC will only create a shared library if the output file + # ends with ".so" (or ".sl" for HP-UX), so rename the library + # to its proper name (with version) after linking. + archive_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo "$lib" | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' + + hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir' + hardcode_libdir_separator_CXX=: + + # Archives containing C++ object files must be created using + # the KAI C++ compiler. + case $host in + osf3*) old_archive_cmds_CXX='$CC -Bstatic -o $oldlib $oldobjs' ;; + *) old_archive_cmds_CXX='$CC -o $oldlib $oldobjs' ;; + esac + ;; + RCC*) + # Rational C++ 2.4.1 + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + cxx*) + case $host in + osf3*) + allow_undefined_flag_CXX=' ${wl}-expect_unresolved ${wl}\*' + archive_cmds_CXX='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $soname `test -n "$verstring" && func_echo_all "${wl}-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' + hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir' + ;; + *) + allow_undefined_flag_CXX=' -expect_unresolved \*' + archive_cmds_CXX='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' + archive_expsym_cmds_CXX='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done~ + echo "-hidden">> $lib.exp~ + $CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname ${wl}-input ${wl}$lib.exp `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib~ + $RM $lib.exp' + hardcode_libdir_flag_spec_CXX='-rpath $libdir' + ;; + esac + + hardcode_libdir_separator_CXX=: + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld" | $GREP -v "ld:"`; templist=`func_echo_all "$templist" | $SED "s/\(^.*ld.*\)\( .*ld.*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' + ;; + *) + if test "$GXX" = yes && test "$with_gnu_ld" = no; then + allow_undefined_flag_CXX=' ${wl}-expect_unresolved ${wl}\*' + case $host in + osf3*) + archive_cmds_CXX='$CC -shared -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + ;; + *) + archive_cmds_CXX='$CC -shared $pic_flag -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + ;; + esac + + hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir' + hardcode_libdir_separator_CXX=: + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' + + else + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + fi + ;; + esac + ;; + + psos*) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + + sunos4*) + case $cc_basename in + CC*) + # Sun C++ 4.x + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + lcc*) + # Lucid + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + *) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + esac + ;; + + solaris*) + case $cc_basename in + CC* | sunCC*) + # Sun C++ 4.2, 5.x and Centerline C++ + archive_cmds_need_lc_CXX=yes + no_undefined_flag_CXX=' -zdefs' + archive_cmds_CXX='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + archive_expsym_cmds_CXX='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ + $CC -G${allow_undefined_flag} ${wl}-M ${wl}$lib.exp -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' + + hardcode_libdir_flag_spec_CXX='-R$libdir' + hardcode_shlibpath_var_CXX=no + case $host_os in + solaris2.[0-5] | solaris2.[0-5].*) ;; + *) + # The compiler driver will combine and reorder linker options, + # but understands `-z linker_flag'. + # Supported since Solaris 2.6 (maybe 2.5.1?) + whole_archive_flag_spec_CXX='-z allextract$convenience -z defaultextract' + ;; + esac + link_all_deplibs_CXX=yes + + output_verbose_link_cmd='func_echo_all' + + # Archives containing C++ object files must be created using + # "CC -xar", where "CC" is the Sun C++ compiler. This is + # necessary to make sure instantiated templates are included + # in the archive. + old_archive_cmds_CXX='$CC -xar -o $oldlib $oldobjs' + ;; + gcx*) + # Green Hills C++ Compiler + archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' + + # The C++ compiler must be used to create the archive. + old_archive_cmds_CXX='$CC $LDFLAGS -archive -o $oldlib $oldobjs' + ;; + *) + # GNU C++ compiler with Solaris linker + if test "$GXX" = yes && test "$with_gnu_ld" = no; then + no_undefined_flag_CXX=' ${wl}-z ${wl}defs' + if $CC --version | $GREP -v '^2\.7' > /dev/null; then + archive_cmds_CXX='$CC -shared $pic_flag -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' + archive_expsym_cmds_CXX='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ + $CC -shared $pic_flag -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' + else + # g++ 2.7 appears to require `-G' NOT `-shared' on this + # platform. + archive_cmds_CXX='$CC -G -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' + archive_expsym_cmds_CXX='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ + $CC -G -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + output_verbose_link_cmd='$CC -G $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' + fi + + hardcode_libdir_flag_spec_CXX='${wl}-R $wl$libdir' + case $host_os in + solaris2.[0-5] | solaris2.[0-5].*) ;; + *) + whole_archive_flag_spec_CXX='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract' + ;; + esac + fi + ;; + esac + ;; + + sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7* | sco3.2v5.0.[024]*) + no_undefined_flag_CXX='${wl}-z,text' + archive_cmds_need_lc_CXX=no + hardcode_shlibpath_var_CXX=no + runpath_var='LD_RUN_PATH' + + case $cc_basename in + CC*) + archive_cmds_CXX='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds_CXX='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + *) + archive_cmds_CXX='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds_CXX='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + esac + ;; + + sysv5* | sco3.2v5* | sco5v6*) + # Note: We can NOT use -z defs as we might desire, because we do not + # link with -lc, and that would cause any symbols used from libc to + # always be unresolved, which means just about no library would + # ever link correctly. If we're not using GNU ld we use -z text + # though, which does catch some bad symbols but isn't as heavy-handed + # as -z defs. + no_undefined_flag_CXX='${wl}-z,text' + allow_undefined_flag_CXX='${wl}-z,nodefs' + archive_cmds_need_lc_CXX=no + hardcode_shlibpath_var_CXX=no + hardcode_libdir_flag_spec_CXX='${wl}-R,$libdir' + hardcode_libdir_separator_CXX=':' + link_all_deplibs_CXX=yes + export_dynamic_flag_spec_CXX='${wl}-Bexport' + runpath_var='LD_RUN_PATH' + + case $cc_basename in + CC*) + archive_cmds_CXX='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds_CXX='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + old_archive_cmds_CXX='$CC -Tprelink_objects $oldobjs~ + '"$old_archive_cmds_CXX" + reload_cmds_CXX='$CC -Tprelink_objects $reload_objs~ + '"$reload_cmds_CXX" + ;; + *) + archive_cmds_CXX='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds_CXX='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + esac + ;; + + tandem*) + case $cc_basename in + NCC*) + # NonStop-UX NCC 3.20 + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + *) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + esac + ;; + + vxworks*) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + + *) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + esac + + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ld_shlibs_CXX" >&5 +$as_echo "$ld_shlibs_CXX" >&6; } + test "$ld_shlibs_CXX" = no && can_build_shared=no + + GCC_CXX="$GXX" + LD_CXX="$LD" + + ## CAVEAT EMPTOR: + ## There is no encapsulation within the following macros, do not change + ## the running order or otherwise move them around unless you know exactly + ## what you are doing... + # Dependencies to place before and after the object being linked: +predep_objects_CXX= +postdep_objects_CXX= +predeps_CXX= +postdeps_CXX= +compiler_lib_search_path_CXX= + +cat > conftest.$ac_ext <<_LT_EOF +class Foo +{ +public: + Foo (void) { a = 0; } +private: + int a; +}; +_LT_EOF + + +_lt_libdeps_save_CFLAGS=$CFLAGS +case "$CC $CFLAGS " in #( +*\ -flto*\ *) CFLAGS="$CFLAGS -fno-lto" ;; +*\ -fwhopr*\ *) CFLAGS="$CFLAGS -fno-whopr" ;; +*\ -fuse-linker-plugin*\ *) CFLAGS="$CFLAGS -fno-use-linker-plugin" ;; +esac + +if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + # Parse the compiler output and extract the necessary + # objects, libraries and library flags. + + # Sentinel used to keep track of whether or not we are before + # the conftest object file. + pre_test_object_deps_done=no + + for p in `eval "$output_verbose_link_cmd"`; do + case ${prev}${p} in + + -L* | -R* | -l*) + # Some compilers place space between "-{L,R}" and the path. + # Remove the space. + if test $p = "-L" || + test $p = "-R"; then + prev=$p + continue + fi + + # Expand the sysroot to ease extracting the directories later. + if test -z "$prev"; then + case $p in + -L*) func_stripname_cnf '-L' '' "$p"; prev=-L; p=$func_stripname_result ;; + -R*) func_stripname_cnf '-R' '' "$p"; prev=-R; p=$func_stripname_result ;; + -l*) func_stripname_cnf '-l' '' "$p"; prev=-l; p=$func_stripname_result ;; + esac + fi + case $p in + =*) func_stripname_cnf '=' '' "$p"; p=$lt_sysroot$func_stripname_result ;; + esac + if test "$pre_test_object_deps_done" = no; then + case ${prev} in + -L | -R) + # Internal compiler library paths should come after those + # provided the user. The postdeps already come after the + # user supplied libs so there is no need to process them. + if test -z "$compiler_lib_search_path_CXX"; then + compiler_lib_search_path_CXX="${prev}${p}" + else + compiler_lib_search_path_CXX="${compiler_lib_search_path_CXX} ${prev}${p}" + fi + ;; + # The "-l" case would never come before the object being + # linked, so don't bother handling this case. + esac + else + if test -z "$postdeps_CXX"; then + postdeps_CXX="${prev}${p}" + else + postdeps_CXX="${postdeps_CXX} ${prev}${p}" + fi + fi + prev= + ;; + + *.lto.$objext) ;; # Ignore GCC LTO objects + *.$objext) + # This assumes that the test object file only shows up + # once in the compiler output. + if test "$p" = "conftest.$objext"; then + pre_test_object_deps_done=yes + continue + fi + + if test "$pre_test_object_deps_done" = no; then + if test -z "$predep_objects_CXX"; then + predep_objects_CXX="$p" + else + predep_objects_CXX="$predep_objects_CXX $p" + fi + else + if test -z "$postdep_objects_CXX"; then + postdep_objects_CXX="$p" + else + postdep_objects_CXX="$postdep_objects_CXX $p" + fi + fi + ;; + + *) ;; # Ignore the rest. + + esac + done + + # Clean up. + rm -f a.out a.exe +else + echo "libtool.m4: error: problem compiling CXX test program" +fi + +$RM -f confest.$objext +CFLAGS=$_lt_libdeps_save_CFLAGS + +# PORTME: override above test on systems where it is broken +case $host_os in +interix[3-9]*) + # Interix 3.5 installs completely hosed .la files for C++, so rather than + # hack all around it, let's just trust "g++" to DTRT. + predep_objects_CXX= + postdep_objects_CXX= + postdeps_CXX= + ;; + +linux*) + case `$CC -V 2>&1 | sed 5q` in + *Sun\ C*) + # Sun C++ 5.9 + + # The more standards-conforming stlport4 library is + # incompatible with the Cstd library. Avoid specifying + # it if it's in CXXFLAGS. Ignore libCrun as + # -library=stlport4 depends on it. + case " $CXX $CXXFLAGS " in + *" -library=stlport4 "*) + solaris_use_stlport4=yes + ;; + esac + + if test "$solaris_use_stlport4" != yes; then + postdeps_CXX='-library=Cstd -library=Crun' + fi + ;; + esac + ;; + +solaris*) + case $cc_basename in + CC* | sunCC*) + # The more standards-conforming stlport4 library is + # incompatible with the Cstd library. Avoid specifying + # it if it's in CXXFLAGS. Ignore libCrun as + # -library=stlport4 depends on it. + case " $CXX $CXXFLAGS " in + *" -library=stlport4 "*) + solaris_use_stlport4=yes + ;; + esac + + # Adding this requires a known-good setup of shared libraries for + # Sun compiler versions before 5.6, else PIC objects from an old + # archive will be linked into the output, leading to subtle bugs. + if test "$solaris_use_stlport4" != yes; then + postdeps_CXX='-library=Cstd -library=Crun' + fi + ;; + esac + ;; +esac + + +case " $postdeps_CXX " in +*" -lc "*) archive_cmds_need_lc_CXX=no ;; +esac + compiler_lib_search_dirs_CXX= +if test -n "${compiler_lib_search_path_CXX}"; then + compiler_lib_search_dirs_CXX=`echo " ${compiler_lib_search_path_CXX}" | ${SED} -e 's! -L! !g' -e 's!^ !!'` +fi + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + lt_prog_compiler_wl_CXX= +lt_prog_compiler_pic_CXX= +lt_prog_compiler_static_CXX= + + + # C++ specific cases for pic, static, wl, etc. + if test "$GXX" = yes; then + lt_prog_compiler_wl_CXX='-Wl,' + lt_prog_compiler_static_CXX='-static' + + case $host_os in + aix*) + # All AIX code is PIC. + if test "$host_cpu" = ia64; then + # AIX 5 now supports IA64 processor + lt_prog_compiler_static_CXX='-Bstatic' + fi + ;; + + amigaos*) + case $host_cpu in + powerpc) + # see comment about AmigaOS4 .so support + lt_prog_compiler_pic_CXX='-fPIC' + ;; + m68k) + # FIXME: we need at least 68020 code to build shared libraries, but + # adding the `-m68020' flag to GCC prevents building anything better, + # like `-m68040'. + lt_prog_compiler_pic_CXX='-m68020 -resident32 -malways-restore-a4' + ;; + esac + ;; + + beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) + # PIC is the default for these OSes. + ;; + mingw* | cygwin* | os2* | pw32* | cegcc*) + # This hack is so that the source file can tell whether it is being + # built for inclusion in a dll (and should export symbols for example). + # Although the cygwin gcc ignores -fPIC, still need this for old-style + # (--disable-auto-import) libraries + lt_prog_compiler_pic_CXX='-DDLL_EXPORT' + ;; + darwin* | rhapsody*) + # PIC is the default on this platform + # Common symbols not allowed in MH_DYLIB files + lt_prog_compiler_pic_CXX='-fno-common' + ;; + *djgpp*) + # DJGPP does not support shared libraries at all + lt_prog_compiler_pic_CXX= + ;; + haiku*) + # PIC is the default for Haiku. + # The "-static" flag exists, but is broken. + lt_prog_compiler_static_CXX= + ;; + interix[3-9]*) + # Interix 3.x gcc -fpic/-fPIC options generate broken code. + # Instead, we relocate shared libraries at runtime. + ;; + sysv4*MP*) + if test -d /usr/nec; then + lt_prog_compiler_pic_CXX=-Kconform_pic + fi + ;; + hpux*) + # PIC is the default for 64-bit PA HP-UX, but not for 32-bit + # PA HP-UX. On IA64 HP-UX, PIC is the default but the pic flag + # sets the default TLS model and affects inlining. + case $host_cpu in + hppa*64*) + ;; + *) + lt_prog_compiler_pic_CXX='-fPIC' + ;; + esac + ;; + *qnx* | *nto*) + # QNX uses GNU C++, but need to define -shared option too, otherwise + # it will coredump. + lt_prog_compiler_pic_CXX='-fPIC -shared' + ;; + *) + lt_prog_compiler_pic_CXX='-fPIC' + ;; + esac + else + case $host_os in + aix[4-9]*) + # All AIX code is PIC. + if test "$host_cpu" = ia64; then + # AIX 5 now supports IA64 processor + lt_prog_compiler_static_CXX='-Bstatic' + else + lt_prog_compiler_static_CXX='-bnso -bI:/lib/syscalls.exp' + fi + ;; + chorus*) + case $cc_basename in + cxch68*) + # Green Hills C++ Compiler + # _LT_TAGVAR(lt_prog_compiler_static, CXX)="--no_auto_instantiation -u __main -u __premain -u _abort -r $COOL_DIR/lib/libOrb.a $MVME_DIR/lib/CC/libC.a $MVME_DIR/lib/classix/libcx.s.a" + ;; + esac + ;; + mingw* | cygwin* | os2* | pw32* | cegcc*) + # This hack is so that the source file can tell whether it is being + # built for inclusion in a dll (and should export symbols for example). + lt_prog_compiler_pic_CXX='-DDLL_EXPORT' + ;; + dgux*) + case $cc_basename in + ec++*) + lt_prog_compiler_pic_CXX='-KPIC' + ;; + ghcx*) + # Green Hills C++ Compiler + lt_prog_compiler_pic_CXX='-pic' + ;; + *) + ;; + esac + ;; + freebsd* | dragonfly*) + # FreeBSD uses GNU C++ + ;; + hpux9* | hpux10* | hpux11*) + case $cc_basename in + CC*) + lt_prog_compiler_wl_CXX='-Wl,' + lt_prog_compiler_static_CXX='${wl}-a ${wl}archive' + if test "$host_cpu" != ia64; then + lt_prog_compiler_pic_CXX='+Z' + fi + ;; + aCC*) + lt_prog_compiler_wl_CXX='-Wl,' + lt_prog_compiler_static_CXX='${wl}-a ${wl}archive' + case $host_cpu in + hppa*64*|ia64*) + # +Z the default + ;; + *) + lt_prog_compiler_pic_CXX='+Z' + ;; + esac + ;; + *) + ;; + esac + ;; + interix*) + # This is c89, which is MS Visual C++ (no shared libs) + # Anyone wants to do a port? + ;; + irix5* | irix6* | nonstopux*) + case $cc_basename in + CC*) + lt_prog_compiler_wl_CXX='-Wl,' + lt_prog_compiler_static_CXX='-non_shared' + # CC pic flag -KPIC is the default. + ;; + *) + ;; + esac + ;; + linux* | k*bsd*-gnu | kopensolaris*-gnu) + case $cc_basename in + KCC*) + # KAI C++ Compiler + lt_prog_compiler_wl_CXX='--backend -Wl,' + lt_prog_compiler_pic_CXX='-fPIC' + ;; + ecpc* ) + # old Intel C++ for x86_64 which still supported -KPIC. + lt_prog_compiler_wl_CXX='-Wl,' + lt_prog_compiler_pic_CXX='-KPIC' + lt_prog_compiler_static_CXX='-static' + ;; + icpc* ) + # Intel C++, used to be incompatible with GCC. + # ICC 10 doesn't accept -KPIC any more. + lt_prog_compiler_wl_CXX='-Wl,' + lt_prog_compiler_pic_CXX='-fPIC' + lt_prog_compiler_static_CXX='-static' + ;; + pgCC* | pgcpp*) + # Portland Group C++ compiler + lt_prog_compiler_wl_CXX='-Wl,' + lt_prog_compiler_pic_CXX='-fpic' + lt_prog_compiler_static_CXX='-Bstatic' + ;; + cxx*) + # Compaq C++ + # Make sure the PIC flag is empty. It appears that all Alpha + # Linux and Compaq Tru64 Unix objects are PIC. + lt_prog_compiler_pic_CXX= + lt_prog_compiler_static_CXX='-non_shared' + ;; + xlc* | xlC* | bgxl[cC]* | mpixl[cC]*) + # IBM XL 8.0, 9.0 on PPC and BlueGene + lt_prog_compiler_wl_CXX='-Wl,' + lt_prog_compiler_pic_CXX='-qpic' + lt_prog_compiler_static_CXX='-qstaticlink' + ;; + *) + case `$CC -V 2>&1 | sed 5q` in + *Sun\ C*) + # Sun C++ 5.9 + lt_prog_compiler_pic_CXX='-KPIC' + lt_prog_compiler_static_CXX='-Bstatic' + lt_prog_compiler_wl_CXX='-Qoption ld ' + ;; + esac + ;; + esac + ;; + lynxos*) + ;; + m88k*) + ;; + mvs*) + case $cc_basename in + cxx*) + lt_prog_compiler_pic_CXX='-W c,exportall' + ;; + *) + ;; + esac + ;; + netbsd* | netbsdelf*-gnu) + ;; + *qnx* | *nto*) + # QNX uses GNU C++, but need to define -shared option too, otherwise + # it will coredump. + lt_prog_compiler_pic_CXX='-fPIC -shared' + ;; + osf3* | osf4* | osf5*) + case $cc_basename in + KCC*) + lt_prog_compiler_wl_CXX='--backend -Wl,' + ;; + RCC*) + # Rational C++ 2.4.1 + lt_prog_compiler_pic_CXX='-pic' + ;; + cxx*) + # Digital/Compaq C++ + lt_prog_compiler_wl_CXX='-Wl,' + # Make sure the PIC flag is empty. It appears that all Alpha + # Linux and Compaq Tru64 Unix objects are PIC. + lt_prog_compiler_pic_CXX= + lt_prog_compiler_static_CXX='-non_shared' + ;; + *) + ;; + esac + ;; + psos*) + ;; + solaris*) + case $cc_basename in + CC* | sunCC*) + # Sun C++ 4.2, 5.x and Centerline C++ + lt_prog_compiler_pic_CXX='-KPIC' + lt_prog_compiler_static_CXX='-Bstatic' + lt_prog_compiler_wl_CXX='-Qoption ld ' + ;; + gcx*) + # Green Hills C++ Compiler + lt_prog_compiler_pic_CXX='-PIC' + ;; + *) + ;; + esac + ;; + sunos4*) + case $cc_basename in + CC*) + # Sun C++ 4.x + lt_prog_compiler_pic_CXX='-pic' + lt_prog_compiler_static_CXX='-Bstatic' + ;; + lcc*) + # Lucid + lt_prog_compiler_pic_CXX='-pic' + ;; + *) + ;; + esac + ;; + sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) + case $cc_basename in + CC*) + lt_prog_compiler_wl_CXX='-Wl,' + lt_prog_compiler_pic_CXX='-KPIC' + lt_prog_compiler_static_CXX='-Bstatic' + ;; + esac + ;; + tandem*) + case $cc_basename in + NCC*) + # NonStop-UX NCC 3.20 + lt_prog_compiler_pic_CXX='-KPIC' + ;; + *) + ;; + esac + ;; + vxworks*) + ;; + *) + lt_prog_compiler_can_build_shared_CXX=no + ;; + esac + fi + +case $host_os in + # For platforms which do not support PIC, -DPIC is meaningless: + *djgpp*) + lt_prog_compiler_pic_CXX= + ;; + *) + lt_prog_compiler_pic_CXX="$lt_prog_compiler_pic_CXX@&t@ -DPIC" + ;; +esac + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $compiler option to produce PIC" >&5 +$as_echo_n "checking for $compiler option to produce PIC... " >&6; } +if ${lt_cv_prog_compiler_pic_CXX+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_prog_compiler_pic_CXX=$lt_prog_compiler_pic_CXX +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic_CXX" >&5 +$as_echo "$lt_cv_prog_compiler_pic_CXX" >&6; } +lt_prog_compiler_pic_CXX=$lt_cv_prog_compiler_pic_CXX + +# +# Check to make sure the PIC flag actually works. +# +if test -n "$lt_prog_compiler_pic_CXX"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler PIC flag $lt_prog_compiler_pic_CXX works" >&5 +$as_echo_n "checking if $compiler PIC flag $lt_prog_compiler_pic_CXX works... " >&6; } +if ${lt_cv_prog_compiler_pic_works_CXX+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_prog_compiler_pic_works_CXX=no + ac_outfile=conftest.$ac_objext + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + lt_compiler_flag="$lt_prog_compiler_pic_CXX@&t@ -DPIC" + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + # The option is referenced via a variable to avoid confusing sed. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ + -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) + (eval "$lt_compile" 2>conftest.err) + ac_status=$? + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + if (exit $ac_status) && test -s "$ac_outfile"; then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings other than the usual output. + $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp + $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 + if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then + lt_cv_prog_compiler_pic_works_CXX=yes + fi + fi + $RM conftest* + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic_works_CXX" >&5 +$as_echo "$lt_cv_prog_compiler_pic_works_CXX" >&6; } + +if test x"$lt_cv_prog_compiler_pic_works_CXX" = xyes; then + case $lt_prog_compiler_pic_CXX in + "" | " "*) ;; + *) lt_prog_compiler_pic_CXX=" $lt_prog_compiler_pic_CXX" ;; + esac +else + lt_prog_compiler_pic_CXX= + lt_prog_compiler_can_build_shared_CXX=no +fi + +fi + + + + + +# +# Check to make sure the static flag actually works. +# +wl=$lt_prog_compiler_wl_CXX eval lt_tmp_static_flag=\"$lt_prog_compiler_static_CXX\" +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler static flag $lt_tmp_static_flag works" >&5 +$as_echo_n "checking if $compiler static flag $lt_tmp_static_flag works... " >&6; } +if ${lt_cv_prog_compiler_static_works_CXX+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_prog_compiler_static_works_CXX=no + save_LDFLAGS="$LDFLAGS" + LDFLAGS="$LDFLAGS $lt_tmp_static_flag" + echo "$lt_simple_link_test_code" > conftest.$ac_ext + if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then + # The linker can only warn and ignore the option if not recognized + # So say no if there are warnings + if test -s conftest.err; then + # Append any errors to the config.log. + cat conftest.err 1>&5 + $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp + $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 + if diff conftest.exp conftest.er2 >/dev/null; then + lt_cv_prog_compiler_static_works_CXX=yes + fi + else + lt_cv_prog_compiler_static_works_CXX=yes + fi + fi + $RM -r conftest* + LDFLAGS="$save_LDFLAGS" + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_static_works_CXX" >&5 +$as_echo "$lt_cv_prog_compiler_static_works_CXX" >&6; } + +if test x"$lt_cv_prog_compiler_static_works_CXX" = xyes; then + : +else + lt_prog_compiler_static_CXX= +fi + + + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5 +$as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; } +if ${lt_cv_prog_compiler_c_o_CXX+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_prog_compiler_c_o_CXX=no + $RM -r conftest 2>/dev/null + mkdir conftest + cd conftest + mkdir out + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + + lt_compiler_flag="-o out/conftest2.$ac_objext" + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ + -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) + (eval "$lt_compile" 2>out/conftest.err) + ac_status=$? + cat out/conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + if (exit $ac_status) && test -s out/conftest2.$ac_objext + then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings + $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp + $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 + if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then + lt_cv_prog_compiler_c_o_CXX=yes + fi + fi + chmod u+w . 2>&5 + $RM conftest* + # SGI C++ compiler will create directory out/ii_files/ for + # template instantiation + test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files + $RM out/* && rmdir out + cd .. + $RM -r conftest + $RM conftest* + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o_CXX" >&5 +$as_echo "$lt_cv_prog_compiler_c_o_CXX" >&6; } + + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5 +$as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; } +if ${lt_cv_prog_compiler_c_o_CXX+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_prog_compiler_c_o_CXX=no + $RM -r conftest 2>/dev/null + mkdir conftest + cd conftest + mkdir out + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + + lt_compiler_flag="-o out/conftest2.$ac_objext" + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ + -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) + (eval "$lt_compile" 2>out/conftest.err) + ac_status=$? + cat out/conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + if (exit $ac_status) && test -s out/conftest2.$ac_objext + then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings + $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp + $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 + if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then + lt_cv_prog_compiler_c_o_CXX=yes + fi + fi + chmod u+w . 2>&5 + $RM conftest* + # SGI C++ compiler will create directory out/ii_files/ for + # template instantiation + test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files + $RM out/* && rmdir out + cd .. + $RM -r conftest + $RM conftest* + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o_CXX" >&5 +$as_echo "$lt_cv_prog_compiler_c_o_CXX" >&6; } + + + + +hard_links="nottested" +if test "$lt_cv_prog_compiler_c_o_CXX" = no && test "$need_locks" != no; then + # do not overwrite the value of need_locks provided by the user + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if we can lock with hard links" >&5 +$as_echo_n "checking if we can lock with hard links... " >&6; } + hard_links=yes + $RM conftest* + ln conftest.a conftest.b 2>/dev/null && hard_links=no + touch conftest.a + ln conftest.a conftest.b 2>&5 || hard_links=no + ln conftest.a conftest.b 2>/dev/null && hard_links=no + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $hard_links" >&5 +$as_echo "$hard_links" >&6; } + if test "$hard_links" = no; then + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&5 +$as_echo "$as_me: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&2;} + need_locks=warn + fi +else + need_locks=no +fi + + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $compiler linker ($LD) supports shared libraries" >&5 +$as_echo_n "checking whether the $compiler linker ($LD) supports shared libraries... " >&6; } + + export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' + exclude_expsyms_CXX='_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*' + case $host_os in + aix[4-9]*) + # If we're using GNU nm, then we don't want the "-C" option. + # -C means demangle to AIX nm, but means don't demangle with GNU nm + # Also, AIX nm treats weak defined symbols like other global defined + # symbols, whereas GNU nm marks them as "W". + if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then + export_symbols_cmds_CXX='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && (substr(\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' + else + export_symbols_cmds_CXX='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && (substr(\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' + fi + ;; + pw32*) + export_symbols_cmds_CXX="$ltdll_cmds" + ;; + cygwin* | mingw* | cegcc*) + case $cc_basename in + cl*) + exclude_expsyms_CXX='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*' + ;; + *) + export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1 DATA/;s/^.*[ ]__nm__\([^ ]*\)[ ][^ ]*/\1 DATA/;/^I[ ]/d;/^[AITW][ ]/s/.* //'\'' | sort | uniq > $export_symbols' + exclude_expsyms_CXX='[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname' + ;; + esac + ;; + linux* | k*bsd*-gnu | gnu*) + link_all_deplibs_CXX=no + ;; + *) + export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' + ;; + esac + +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ld_shlibs_CXX" >&5 +$as_echo "$ld_shlibs_CXX" >&6; } +test "$ld_shlibs_CXX" = no && can_build_shared=no + +with_gnu_ld_CXX=$with_gnu_ld + + + + + + +# +# Do we need to explicitly link libc? +# +case "x$archive_cmds_need_lc_CXX" in +x|xyes) + # Assume -lc should be added + archive_cmds_need_lc_CXX=yes + + if test "$enable_shared" = yes && test "$GCC" = yes; then + case $archive_cmds_CXX in + *'~'*) + # FIXME: we may have to deal with multi-command sequences. + ;; + '$CC '*) + # Test whether the compiler implicitly links with -lc since on some + # systems, -lgcc has to come before -lc. If gcc already passes -lc + # to ld, don't add -lc before -lgcc. + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether -lc should be explicitly linked in" >&5 +$as_echo_n "checking whether -lc should be explicitly linked in... " >&6; } +if ${lt_cv_archive_cmds_need_lc_CXX+:} false; then : + $as_echo_n "(cached) " >&6 +else + $RM conftest* + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } 2>conftest.err; then + soname=conftest + lib=conftest + libobjs=conftest.$ac_objext + deplibs= + wl=$lt_prog_compiler_wl_CXX + pic_flag=$lt_prog_compiler_pic_CXX + compiler_flags=-v + linker_flags=-v + verstring= + output_objdir=. + libname=conftest + lt_save_allow_undefined_flag=$allow_undefined_flag_CXX + allow_undefined_flag_CXX= + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$archive_cmds_CXX 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1\""; } >&5 + (eval $archive_cmds_CXX 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + then + lt_cv_archive_cmds_need_lc_CXX=no + else + lt_cv_archive_cmds_need_lc_CXX=yes + fi + allow_undefined_flag_CXX=$lt_save_allow_undefined_flag + else + cat conftest.err 1>&5 + fi + $RM conftest* + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_archive_cmds_need_lc_CXX" >&5 +$as_echo "$lt_cv_archive_cmds_need_lc_CXX" >&6; } + archive_cmds_need_lc_CXX=$lt_cv_archive_cmds_need_lc_CXX + ;; + esac + fi + ;; +esac + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking dynamic linker characteristics" >&5 +$as_echo_n "checking dynamic linker characteristics... " >&6; } + +library_names_spec= +libname_spec='lib$name' +soname_spec= +shrext_cmds=".so" +postinstall_cmds= +postuninstall_cmds= +finish_cmds= +finish_eval= +shlibpath_var= +shlibpath_overrides_runpath=unknown +version_type=none +dynamic_linker="$host_os ld.so" +sys_lib_dlsearch_path_spec="/lib /usr/lib" +need_lib_prefix=unknown +hardcode_into_libs=no + +# when you set need_version to no, make sure it does not cause -set_version +# flags to be left without arguments +need_version=unknown + +case $host_os in +aix3*) + version_type=linux # correct to gnu/linux during the next big refactor + library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a' + shlibpath_var=LIBPATH + + # AIX 3 has no versioning support, so we append a major version to the name. + soname_spec='${libname}${release}${shared_ext}$major' + ;; + +aix[4-9]*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + hardcode_into_libs=yes + if test "$host_cpu" = ia64; then + # AIX 5 supports IA64 + library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}' + shlibpath_var=LD_LIBRARY_PATH + else + # With GCC up to 2.95.x, collect2 would create an import file + # for dependence libraries. The import file would start with + # the line `#! .'. This would cause the generated library to + # depend on `.', always an invalid library. This was fixed in + # development snapshots of GCC prior to 3.0. + case $host_os in + aix4 | aix4.[01] | aix4.[01].*) + if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)' + echo ' yes ' + echo '#endif'; } | ${CC} -E - | $GREP yes > /dev/null; then + : + else + can_build_shared=no + fi + ;; + esac + # AIX (on Power*) has no versioning support, so currently we can not hardcode correct + # soname into executable. Probably we can add versioning support to + # collect2, so additional links can be useful in future. + if test "$aix_use_runtimelinking" = yes; then + # If using run time linking (on AIX 4.2 or later) use lib.so + # instead of lib.a to let people know that these are not + # typical AIX shared libraries. + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + else + # We preserve .a as extension for shared libraries through AIX4.2 + # and later when we are not doing run time linking. + library_names_spec='${libname}${release}.a $libname.a' + soname_spec='${libname}${release}${shared_ext}$major' + fi + shlibpath_var=LIBPATH + fi + ;; + +amigaos*) + case $host_cpu in + powerpc) + # Since July 2007 AmigaOS4 officially supports .so libraries. + # When compiling the executable, add -use-dynld -Lsobjs: to the compileline. + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + ;; + m68k) + library_names_spec='$libname.ixlibrary $libname.a' + # Create ${libname}_ixlibrary.a entries in /sys/libs. + finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`func_echo_all "$lib" | $SED '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; test $RM /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done' + ;; + esac + ;; + +beos*) + library_names_spec='${libname}${shared_ext}' + dynamic_linker="$host_os ld.so" + shlibpath_var=LIBRARY_PATH + ;; + +bsdi[45]*) + version_type=linux # correct to gnu/linux during the next big refactor + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir' + shlibpath_var=LD_LIBRARY_PATH + sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib" + sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib" + # the default ld.so.conf also contains /usr/contrib/lib and + # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow + # libtool to hard-code these into programs + ;; + +cygwin* | mingw* | pw32* | cegcc*) + version_type=windows + shrext_cmds=".dll" + need_version=no + need_lib_prefix=no + + case $GCC,$cc_basename in + yes,*) + # gcc + library_names_spec='$libname.dll.a' + # DLL is installed to $(libdir)/../bin by postinstall_cmds + postinstall_cmds='base_file=`basename \${file}`~ + dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~ + dldir=$destdir/`dirname \$dlpath`~ + test -d \$dldir || mkdir -p \$dldir~ + $install_prog $dir/$dlname \$dldir/$dlname~ + chmod a+x \$dldir/$dlname~ + if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then + eval '\''$striplib \$dldir/$dlname'\'' || exit \$?; + fi' + postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ + dlpath=$dir/\$dldll~ + $RM \$dlpath' + shlibpath_overrides_runpath=yes + + case $host_os in + cygwin*) + # Cygwin DLLs use 'cyg' prefix rather than 'lib' + soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' + + ;; + mingw* | cegcc*) + # MinGW DLLs use traditional 'lib' prefix + soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' + ;; + pw32*) + # pw32 DLLs use 'pw' prefix rather than 'lib' + library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' + ;; + esac + dynamic_linker='Win32 ld.exe' + ;; + + *,cl*) + # Native MSVC + libname_spec='$name' + soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' + library_names_spec='${libname}.dll.lib' + + case $build_os in + mingw*) + sys_lib_search_path_spec= + lt_save_ifs=$IFS + IFS=';' + for lt_path in $LIB + do + IFS=$lt_save_ifs + # Let DOS variable expansion print the short 8.3 style file name. + lt_path=`cd "$lt_path" 2>/dev/null && cmd //C "for %i in (".") do @echo %~si"` + sys_lib_search_path_spec="$sys_lib_search_path_spec $lt_path" + done + IFS=$lt_save_ifs + # Convert to MSYS style. + sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | sed -e 's|\\\\|/|g' -e 's| \\([a-zA-Z]\\):| /\\1|g' -e 's|^ ||'` + ;; + cygwin*) + # Convert to unix form, then to dos form, then back to unix form + # but this time dos style (no spaces!) so that the unix form looks + # like /cygdrive/c/PROGRA~1:/cygdr... + sys_lib_search_path_spec=`cygpath --path --unix "$LIB"` + sys_lib_search_path_spec=`cygpath --path --dos "$sys_lib_search_path_spec" 2>/dev/null` + sys_lib_search_path_spec=`cygpath --path --unix "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` + ;; + *) + sys_lib_search_path_spec="$LIB" + if $ECHO "$sys_lib_search_path_spec" | $GREP ';[c-zC-Z]:/' >/dev/null; then + # It is most probably a Windows format PATH. + sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` + else + sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` + fi + # FIXME: find the short name or the path components, as spaces are + # common. (e.g. "Program Files" -> "PROGRA~1") + ;; + esac + + # DLL is installed to $(libdir)/../bin by postinstall_cmds + postinstall_cmds='base_file=`basename \${file}`~ + dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~ + dldir=$destdir/`dirname \$dlpath`~ + test -d \$dldir || mkdir -p \$dldir~ + $install_prog $dir/$dlname \$dldir/$dlname' + postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ + dlpath=$dir/\$dldll~ + $RM \$dlpath' + shlibpath_overrides_runpath=yes + dynamic_linker='Win32 link.exe' + ;; + + *) + # Assume MSVC wrapper + library_names_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext} $libname.lib' + dynamic_linker='Win32 ld.exe' + ;; + esac + # FIXME: first we should search . and the directory the executable is in + shlibpath_var=PATH + ;; + +darwin* | rhapsody*) + dynamic_linker="$host_os dyld" + version_type=darwin + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${major}$shared_ext ${libname}$shared_ext' + soname_spec='${libname}${release}${major}$shared_ext' + shlibpath_overrides_runpath=yes + shlibpath_var=DYLD_LIBRARY_PATH + shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`' + + sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib' + ;; + +dgux*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + ;; + +freebsd* | dragonfly*) + # DragonFly does not have aout. When/if they implement a new + # versioning mechanism, adjust this. + if test -x /usr/bin/objformat; then + objformat=`/usr/bin/objformat` + else + case $host_os in + freebsd[23].*) objformat=aout ;; + *) objformat=elf ;; + esac + fi + version_type=freebsd-$objformat + case $version_type in + freebsd-elf*) + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' + need_version=no + need_lib_prefix=no + ;; + freebsd-*) + library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix' + need_version=yes + ;; + esac + shlibpath_var=LD_LIBRARY_PATH + case $host_os in + freebsd2.*) + shlibpath_overrides_runpath=yes + ;; + freebsd3.[01]* | freebsdelf3.[01]*) + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + freebsd3.[2-9]* | freebsdelf3.[2-9]* | \ + freebsd4.[0-5] | freebsdelf4.[0-5] | freebsd4.1.1 | freebsdelf4.1.1) + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; + *) # from 4.6 on, and DragonFly + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + esac + ;; + +gnu*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; + +haiku*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + dynamic_linker="$host_os runtime_loader" + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LIBRARY_PATH + shlibpath_overrides_runpath=yes + sys_lib_dlsearch_path_spec='/boot/home/config/lib /boot/common/lib /boot/system/lib' + hardcode_into_libs=yes + ;; + +hpux9* | hpux10* | hpux11*) + # Give a soname corresponding to the major version so that dld.sl refuses to + # link against other versions. + version_type=sunos + need_lib_prefix=no + need_version=no + case $host_cpu in + ia64*) + shrext_cmds='.so' + hardcode_into_libs=yes + dynamic_linker="$host_os dld.so" + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + if test "X$HPUX_IA64_MODE" = X32; then + sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib" + else + sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64" + fi + sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec + ;; + hppa*64*) + shrext_cmds='.sl' + hardcode_into_libs=yes + dynamic_linker="$host_os dld.sl" + shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH + shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64" + sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec + ;; + *) + shrext_cmds='.sl' + dynamic_linker="$host_os dld.sl" + shlibpath_var=SHLIB_PATH + shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + ;; + esac + # HP-UX runs *really* slowly unless shared libraries are mode 555, ... + postinstall_cmds='chmod 555 $lib' + # or fails outright, so override atomically: + install_override_mode=555 + ;; + +interix[3-9]*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; + +irix5* | irix6* | nonstopux*) + case $host_os in + nonstopux*) version_type=nonstopux ;; + *) + if test "$lt_cv_prog_gnu_ld" = yes; then + version_type=linux # correct to gnu/linux during the next big refactor + else + version_type=irix + fi ;; + esac + need_lib_prefix=no + need_version=no + soname_spec='${libname}${release}${shared_ext}$major' + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}' + case $host_os in + irix5* | nonstopux*) + libsuff= shlibsuff= + ;; + *) + case $LD in # libtool.m4 will add one of these switches to LD + *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") + libsuff= shlibsuff= libmagic=32-bit;; + *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") + libsuff=32 shlibsuff=N32 libmagic=N32;; + *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") + libsuff=64 shlibsuff=64 libmagic=64-bit;; + *) libsuff= shlibsuff= libmagic=never-match;; + esac + ;; + esac + shlibpath_var=LD_LIBRARY${shlibsuff}_PATH + shlibpath_overrides_runpath=no + sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}" + sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}" + hardcode_into_libs=yes + ;; + +# No shared lib support for Linux oldld, aout, or coff. +linux*oldld* | linux*aout* | linux*coff*) + dynamic_linker=no + ;; + +# This must be glibc/ELF. +linux* | k*bsd*-gnu | kopensolaris*-gnu) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + + # Some binutils ld are patched to set DT_RUNPATH + if ${lt_cv_shlibpath_overrides_runpath+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_shlibpath_overrides_runpath=no + save_LDFLAGS=$LDFLAGS + save_libdir=$libdir + eval "libdir=/foo; wl=\"$lt_prog_compiler_wl_CXX\"; \ + LDFLAGS=\"\$LDFLAGS $hardcode_libdir_flag_spec_CXX\"" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_cxx_try_link "$LINENO"; then : + if ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir" >/dev/null; then : + lt_cv_shlibpath_overrides_runpath=yes +fi +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + LDFLAGS=$save_LDFLAGS + libdir=$save_libdir + +fi + + shlibpath_overrides_runpath=$lt_cv_shlibpath_overrides_runpath + + # This implies no fast_install, which is unacceptable. + # Some rework will be needed to allow for fast_install + # before this can be enabled. + hardcode_into_libs=yes + + # Append ld.so.conf contents to the search path + if test -f /etc/ld.so.conf; then + lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \$2)); skip = 1; } { if (!skip) print \$0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[ ]*hwcap[ ]/d;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;s/"//g;/^$/d' | tr '\n' ' '` + sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra" + fi + + # We used to test for /lib/ld.so.1 and disable shared libraries on + # powerpc, because MkLinux only supported shared libraries with the + # GNU dynamic linker. Since this was broken with cross compilers, + # most powerpc-linux boxes support dynamic linking these days and + # people can always --disable-shared, the test was removed, and we + # assume the GNU/Linux dynamic linker is in use. + dynamic_linker='GNU/Linux ld.so' + ;; + +netbsdelf*-gnu) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + dynamic_linker='NetBSD ld.elf_so' + ;; + +netbsd*) + version_type=sunos + need_lib_prefix=no + need_version=no + if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' + dynamic_linker='NetBSD (a.out) ld.so' + else + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + dynamic_linker='NetBSD ld.elf_so' + fi + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + +newsos6) + version_type=linux # correct to gnu/linux during the next big refactor + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + ;; + +*nto* | *qnx*) + version_type=qnx + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + dynamic_linker='ldqnx.so' + ;; + +openbsd*) + version_type=sunos + sys_lib_dlsearch_path_spec="/usr/lib" + need_lib_prefix=no + # Some older versions of OpenBSD (3.3 at least) *do* need versioned libs. + case $host_os in + openbsd3.3 | openbsd3.3.*) need_version=yes ;; + *) need_version=no ;; + esac + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' + shlibpath_var=LD_LIBRARY_PATH + if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then + case $host_os in + openbsd2.[89] | openbsd2.[89].*) + shlibpath_overrides_runpath=no + ;; + *) + shlibpath_overrides_runpath=yes + ;; + esac + else + shlibpath_overrides_runpath=yes + fi + ;; + +os2*) + libname_spec='$name' + shrext_cmds=".dll" + need_lib_prefix=no + library_names_spec='$libname${shared_ext} $libname.a' + dynamic_linker='OS/2 ld.exe' + shlibpath_var=LIBPATH + ;; + +osf3* | osf4* | osf5*) + version_type=osf + need_lib_prefix=no + need_version=no + soname_spec='${libname}${release}${shared_ext}$major' + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + shlibpath_var=LD_LIBRARY_PATH + sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib" + sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec" + ;; + +rdos*) + dynamic_linker=no + ;; + +solaris*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + # ldd complains unless libraries are executable + postinstall_cmds='chmod +x $lib' + ;; + +sunos4*) + version_type=sunos + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' + finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + if test "$with_gnu_ld" = yes; then + need_lib_prefix=no + fi + need_version=yes + ;; + +sysv4 | sysv4.3*) + version_type=linux # correct to gnu/linux during the next big refactor + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + case $host_vendor in + sni) + shlibpath_overrides_runpath=no + need_lib_prefix=no + runpath_var=LD_RUN_PATH + ;; + siemens) + need_lib_prefix=no + ;; + motorola) + need_lib_prefix=no + need_version=no + shlibpath_overrides_runpath=no + sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib' + ;; + esac + ;; + +sysv4*MP*) + if test -d /usr/nec ;then + version_type=linux # correct to gnu/linux during the next big refactor + library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}' + soname_spec='$libname${shared_ext}.$major' + shlibpath_var=LD_LIBRARY_PATH + fi + ;; + +sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) + version_type=freebsd-elf + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + if test "$with_gnu_ld" = yes; then + sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib' + else + sys_lib_search_path_spec='/usr/ccs/lib /usr/lib' + case $host_os in + sco3.2v5*) + sys_lib_search_path_spec="$sys_lib_search_path_spec /lib" + ;; + esac + fi + sys_lib_dlsearch_path_spec='/usr/lib' + ;; + +tpf*) + # TPF is a cross-target only. Preferred cross-host = GNU/Linux. + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; + +uts4*) + version_type=linux # correct to gnu/linux during the next big refactor + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + ;; + +*) + dynamic_linker=no + ;; +esac +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $dynamic_linker" >&5 +$as_echo "$dynamic_linker" >&6; } +test "$dynamic_linker" = no && can_build_shared=no + +variables_saved_for_relink="PATH $shlibpath_var $runpath_var" +if test "$GCC" = yes; then + variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" +fi + +if test "${lt_cv_sys_lib_search_path_spec+set}" = set; then + sys_lib_search_path_spec="$lt_cv_sys_lib_search_path_spec" +fi +if test "${lt_cv_sys_lib_dlsearch_path_spec+set}" = set; then + sys_lib_dlsearch_path_spec="$lt_cv_sys_lib_dlsearch_path_spec" +fi + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to hardcode library paths into programs" >&5 +$as_echo_n "checking how to hardcode library paths into programs... " >&6; } +hardcode_action_CXX= +if test -n "$hardcode_libdir_flag_spec_CXX" || + test -n "$runpath_var_CXX" || + test "X$hardcode_automatic_CXX" = "Xyes" ; then + + # We can hardcode non-existent directories. + if test "$hardcode_direct_CXX" != no && + # If the only mechanism to avoid hardcoding is shlibpath_var, we + # have to relink, otherwise we might link with an installed library + # when we should be linking with a yet-to-be-installed one + ## test "$_LT_TAGVAR(hardcode_shlibpath_var, CXX)" != no && + test "$hardcode_minus_L_CXX" != no; then + # Linking always hardcodes the temporary library directory. + hardcode_action_CXX=relink + else + # We can link without hardcoding, and we can hardcode nonexisting dirs. + hardcode_action_CXX=immediate + fi +else + # We cannot hardcode anything, or else we can only hardcode existing + # directories. + hardcode_action_CXX=unsupported +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $hardcode_action_CXX" >&5 +$as_echo "$hardcode_action_CXX" >&6; } + +if test "$hardcode_action_CXX" = relink || + test "$inherit_rpath_CXX" = yes; then + # Fast installation is not supported + enable_fast_install=no +elif test "$shlibpath_overrides_runpath" = yes || + test "$enable_shared" = no; then + # Fast installation is not necessary + enable_fast_install=needless +fi + + + + + + + + fi # test -n "$compiler" + + CC=$lt_save_CC + CFLAGS=$lt_save_CFLAGS + LDCXX=$LD + LD=$lt_save_LD + GCC=$lt_save_GCC + with_gnu_ld=$lt_save_with_gnu_ld + lt_cv_path_LDCXX=$lt_cv_path_LD + lt_cv_path_LD=$lt_save_path_LD + lt_cv_prog_gnu_ldcxx=$lt_cv_prog_gnu_ld + lt_cv_prog_gnu_ld=$lt_save_with_gnu_ld +fi # test "$_lt_caught_CXX_error" != yes + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + + + + + + + + + + + + + + + ac_config_commands="$ac_config_commands libtool" + + + + +# Only expand once: + + + +#enable -D_GNU_SOURCE since the return code value of getaddrinfo +#ifdefed with __USE_GNU +#features.h header undef's __USE_GNU and defines it only if _GNU_SOURCE is defined +#hence this define for gcc +@%:@ Check whether --enable-debug was given. +if test "${enable_debug+set}" = set; then : + enableval=$enable_debug; +else + enable_debug=no +fi + + +if test "x$enable_debug" = xyes; then + if test "x$init_cflags" = x; then + CFLAGS="" + fi + CFLAGS="$CFLAGS -g -O0 -D_GNU_SOURCE" +else + if test "x$init_cflags" = x; then + CFLAGS="-g -O2 -D_GNU_SOURCE" + fi +fi + +if test "x$enable_debug" = xyes; then + if test "x$init_cxxflags" = x; then + CXXFLAGS="" + fi + CXXFLAGS="$CXXFLAGS -g -O0" +else + if test "x$init_cxxflags" = x; then + CXXFLAGS="-g -O2" + fi +fi + + +@%:@ Check whether --with-syncapi was given. +if test "${with_syncapi+set}" = set; then : + withval=$with_syncapi; +else + with_syncapi=yes +fi + + +# Checks for libraries. +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for pthread_mutex_lock in -lpthread" >&5 +$as_echo_n "checking for pthread_mutex_lock in -lpthread... " >&6; } +if ${ac_cv_lib_pthread_pthread_mutex_lock+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lpthread $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char pthread_mutex_lock (); +int +main () +{ +return pthread_mutex_lock (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_pthread_pthread_mutex_lock=yes +else + ac_cv_lib_pthread_pthread_mutex_lock=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_pthread_pthread_mutex_lock" >&5 +$as_echo "$ac_cv_lib_pthread_pthread_mutex_lock" >&6; } +if test "x$ac_cv_lib_pthread_pthread_mutex_lock" = xyes; then : + have_pthread=yes +else + have_pthread=no +fi + + +if test "x$with_syncapi" != xno && test "x$have_pthread" = xno; then + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cannot build SyncAPI -- pthread not found" >&5 +$as_echo "$as_me: WARNING: cannot build SyncAPI -- pthread not found" >&2;} + with_syncapi=no +fi +if test "x$with_syncapi" != xno; then + { $as_echo "$as_me:${as_lineno-$LINENO}: building with SyncAPI support" >&5 +$as_echo "$as_me: building with SyncAPI support" >&6;} +else + { $as_echo "$as_me:${as_lineno-$LINENO}: building without SyncAPI support" >&5 +$as_echo "$as_me: building without SyncAPI support" >&6;} +fi + + if test "x$with_syncapi" != xno; then + WANT_SYNCAPI_TRUE= + WANT_SYNCAPI_FALSE='#' +else + WANT_SYNCAPI_TRUE='#' + WANT_SYNCAPI_FALSE= +fi + + +# Checks for header files. +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header files" >&5 +$as_echo_n "checking for ANSI C header files... " >&6; } +if ${ac_cv_header_stdc+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +#include +#include +#include + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_header_stdc=yes +else + ac_cv_header_stdc=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + +if test $ac_cv_header_stdc = yes; then + # SunOS 4.x string.h does not declare mem*, contrary to ANSI. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include + +_ACEOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + $EGREP "memchr" >/dev/null 2>&1; then : + +else + ac_cv_header_stdc=no +fi +rm -f conftest* + +fi + +if test $ac_cv_header_stdc = yes; then + # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include + +_ACEOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + $EGREP "free" >/dev/null 2>&1; then : + +else + ac_cv_header_stdc=no +fi +rm -f conftest* + +fi + +if test $ac_cv_header_stdc = yes; then + # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi. + if test "$cross_compiling" = yes; then : + : +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +#include +#if ((' ' & 0x0FF) == 0x020) +# define ISLOWER(c) ('a' <= (c) && (c) <= 'z') +# define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c)) +#else +# define ISLOWER(c) \ + (('a' <= (c) && (c) <= 'i') \ + || ('j' <= (c) && (c) <= 'r') \ + || ('s' <= (c) && (c) <= 'z')) +# define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c)) +#endif + +#define XOR(e, f) (((e) && !(f)) || (!(e) && (f))) +int +main () +{ + int i; + for (i = 0; i < 256; i++) + if (XOR (islower (i), ISLOWER (i)) + || toupper (i) != TOUPPER (i)) + return 2; + return 0; +} +_ACEOF +if ac_fn_c_try_run "$LINENO"; then : + +else + ac_cv_header_stdc=no +fi +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ + conftest.$ac_objext conftest.beam conftest.$ac_ext +fi + +fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdc" >&5 +$as_echo "$ac_cv_header_stdc" >&6; } +if test $ac_cv_header_stdc = yes; then + +$as_echo "@%:@define STDC_HEADERS 1" >>confdefs.h + +fi + +for ac_header in arpa/inet.h fcntl.h netdb.h netinet/in.h stdlib.h string.h sys/socket.h sys/time.h unistd.h sys/utsname.h +do : + as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` +ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default" +if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : + cat >>confdefs.h <<_ACEOF +@%:@define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 +_ACEOF + +fi + +done + + +# Checks for typedefs, structures, and compiler characteristics. +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for an ANSI C-conforming const" >&5 +$as_echo_n "checking for an ANSI C-conforming const... " >&6; } +if ${ac_cv_c_const+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + +#ifndef __cplusplus + /* Ultrix mips cc rejects this sort of thing. */ + typedef int charset[2]; + const charset cs = { 0, 0 }; + /* SunOS 4.1.1 cc rejects this. */ + char const *const *pcpcc; + char **ppc; + /* NEC SVR4.0.2 mips cc rejects this. */ + struct point {int x, y;}; + static struct point const zero = {0,0}; + /* AIX XL C 1.02.0.0 rejects this. + It does not let you subtract one const X* pointer from another in + an arm of an if-expression whose if-part is not a constant + expression */ + const char *g = "string"; + pcpcc = &g + (g ? g-g : 0); + /* HPUX 7.0 cc rejects these. */ + ++pcpcc; + ppc = (char**) pcpcc; + pcpcc = (char const *const *) ppc; + { /* SCO 3.2v4 cc rejects this sort of thing. */ + char tx; + char *t = &tx; + char const *s = 0 ? (char *) 0 : (char const *) 0; + + *t++ = 0; + if (s) return 0; + } + { /* Someone thinks the Sun supposedly-ANSI compiler will reject this. */ + int x[] = {25, 17}; + const int *foo = &x[0]; + ++foo; + } + { /* Sun SC1.0 ANSI compiler rejects this -- but not the above. */ + typedef const int *iptr; + iptr p = 0; + ++p; + } + { /* AIX XL C 1.02.0.0 rejects this sort of thing, saying + "k.c", line 2.27: 1506-025 (S) Operand must be a modifiable lvalue. */ + struct s { int j; const int *ap[3]; } bx; + struct s *b = &bx; b->j = 5; + } + { /* ULTRIX-32 V3.1 (Rev 9) vcc rejects this */ + const int foo = 10; + if (!foo) return 0; + } + return !cs[0] && !zero.x; +#endif + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_c_const=yes +else + ac_cv_c_const=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_const" >&5 +$as_echo "$ac_cv_c_const" >&6; } +if test $ac_cv_c_const = no; then + +$as_echo "@%:@define const /**/" >>confdefs.h + +fi + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for inline" >&5 +$as_echo_n "checking for inline... " >&6; } +if ${ac_cv_c_inline+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_cv_c_inline=no +for ac_kw in inline __inline__ __inline; do + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#ifndef __cplusplus +typedef int foo_t; +static $ac_kw foo_t static_foo () {return 0; } +$ac_kw foo_t foo () {return 0; } +#endif + +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_c_inline=$ac_kw +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + test "$ac_cv_c_inline" != no && break +done + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_inline" >&5 +$as_echo "$ac_cv_c_inline" >&6; } + +case $ac_cv_c_inline in + inline | yes) ;; + *) + case $ac_cv_c_inline in + no) ac_val=;; + *) ac_val=$ac_cv_c_inline;; + esac + cat >>confdefs.h <<_ACEOF +#ifndef __cplusplus +#define inline $ac_val +#endif +_ACEOF + ;; +esac + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether time.h and sys/time.h may both be included" >&5 +$as_echo_n "checking whether time.h and sys/time.h may both be included... " >&6; } +if ${ac_cv_header_time+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +#include +#include + +int +main () +{ +if ((struct tm *) 0) +return 0; + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_header_time=yes +else + ac_cv_header_time=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_time" >&5 +$as_echo "$ac_cv_header_time" >&6; } +if test $ac_cv_header_time = yes; then + +$as_echo "@%:@define TIME_WITH_SYS_TIME 1" >>confdefs.h + +fi + +ac_fn_c_check_type "$LINENO" "nfds_t" "ac_cv_type_nfds_t" "#include +" +if test "x$ac_cv_type_nfds_t" = xyes; then : + +$as_echo "@%:@define POLL_NFDS_TYPE nfds_t" >>confdefs.h + +else + +$as_echo "@%:@define POLL_NFDS_TYPE unsigned int" >>confdefs.h + +fi + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to enable ipv6" >&5 +$as_echo_n "checking whether to enable ipv6... " >&6; } + +if test "$cross_compiling" = yes; then : + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + ipv6=no +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + /* is AF_INET6 available? */ +#include +#include +main() +{ + if (socket(AF_INET6, SOCK_STREAM, 0) < 0) + exit(1); + else + exit(0); +} + +_ACEOF +if ac_fn_c_try_run "$LINENO"; then : + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + ipv6=yes +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + ipv6=no +fi +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ + conftest.$ac_objext conftest.beam conftest.$ac_ext +fi + + +if test x"$ipv6" = xyes; then + USEIPV6="-DZOO_IPV6_ENABLED" + +fi + +# Checks for library functions. +for ac_func in getcwd gethostbyname gethostname getlogin getpwuid_r gettimeofday getuid memmove memset poll socket strchr strdup strerror strtol +do : + as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` +ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var" +if eval test \"x\$"$as_ac_var"\" = x"yes"; then : + cat >>confdefs.h <<_ACEOF +@%:@define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 +_ACEOF + +fi +done + + +ac_config_files="$ac_config_files Makefile" + +cat >confcache <<\_ACEOF +# This file is a shell script that caches the results of configure +# tests run on this system so they can be shared between configure +# scripts and configure runs, see configure's option --config-cache. +# It is not useful on other systems. If it contains results you don't +# want to keep, you may remove or edit it. +# +# config.status only pays attention to the cache file if you give it +# the --recheck option to rerun configure. +# +# `ac_cv_env_foo' variables (set or unset) will be overridden when +# loading this file, other *unset* `ac_cv_foo' will be assigned the +# following values. + +_ACEOF + +# The following way of writing the cache mishandles newlines in values, +# but we know of no workaround that is simple, portable, and efficient. +# So, we kill variables containing newlines. +# Ultrix sh set writes to stderr and can't be redirected directly, +# and sets the high bit in the cache file unless we assign to the vars. +( + for ac_var in `(set) 2>&1 | sed -n 's/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'`; do + eval ac_val=\$$ac_var + case $ac_val in #( + *${as_nl}*) + case $ac_var in #( + *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 +$as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; + esac + case $ac_var in #( + _ | IFS | as_nl) ;; #( + BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( + *) { eval $ac_var=; unset $ac_var;} ;; + esac ;; + esac + done + + (set) 2>&1 | + case $as_nl`(ac_space=' '; set) 2>&1` in #( + *${as_nl}ac_space=\ *) + # `set' does not quote correctly, so add quotes: double-quote + # substitution turns \\\\ into \\, and sed turns \\ into \. + sed -n \ + "s/'/'\\\\''/g; + s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p" + ;; #( + *) + # `set' quotes correctly as required by POSIX, so do not add quotes. + sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" + ;; + esac | + sort +) | + sed ' + /^ac_cv_env_/b end + t clear + :clear + s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/ + t end + s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/ + :end' >>confcache +if diff "$cache_file" confcache >/dev/null 2>&1; then :; else + if test -w "$cache_file"; then + if test "x$cache_file" != "x/dev/null"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5 +$as_echo "$as_me: updating cache $cache_file" >&6;} + if test ! -f "$cache_file" || test -h "$cache_file"; then + cat confcache >"$cache_file" + else + case $cache_file in #( + */* | ?:*) + mv -f confcache "$cache_file"$$ && + mv -f "$cache_file"$$ "$cache_file" ;; #( + *) + mv -f confcache "$cache_file" ;; + esac + fi + fi + else + { $as_echo "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5 +$as_echo "$as_me: not updating unwritable cache $cache_file" >&6;} + fi +fi +rm -f confcache + +test "x$prefix" = xNONE && prefix=$ac_default_prefix +# Let make expand exec_prefix. +test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' + +DEFS=-DHAVE_CONFIG_H + +ac_libobjs= +ac_ltlibobjs= +U= +for ac_i in : $LIB@&t@OBJS; do test "x$ac_i" = x: && continue + # 1. Remove the extension, and $U if already installed. + ac_script='s/\$U\././;s/\.o$//;s/\.obj$//' + ac_i=`$as_echo "$ac_i" | sed "$ac_script"` + # 2. Prepend LIBOBJDIR. When used with automake>=1.10 LIBOBJDIR + # will be set to the directory where LIBOBJS objects are built. + as_fn_append ac_libobjs " \${LIBOBJDIR}$ac_i\$U.$ac_objext" + as_fn_append ac_ltlibobjs " \${LIBOBJDIR}$ac_i"'$U.lo' +done +LIB@&t@OBJS=$ac_libobjs + +LTLIBOBJS=$ac_ltlibobjs + + +if test -z "${DX_COND_doc_TRUE}" && test -z "${DX_COND_doc_FALSE}"; then + as_fn_error $? "conditional \"DX_COND_doc\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${DX_COND_doc_TRUE}" && test -z "${DX_COND_doc_FALSE}"; then + as_fn_error $? "conditional \"DX_COND_doc\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${DX_COND_dot_TRUE}" && test -z "${DX_COND_dot_FALSE}"; then + as_fn_error $? "conditional \"DX_COND_dot\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${DX_COND_dot_TRUE}" && test -z "${DX_COND_dot_FALSE}"; then + as_fn_error $? "conditional \"DX_COND_dot\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${DX_COND_man_TRUE}" && test -z "${DX_COND_man_FALSE}"; then + as_fn_error $? "conditional \"DX_COND_man\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${DX_COND_man_TRUE}" && test -z "${DX_COND_man_FALSE}"; then + as_fn_error $? "conditional \"DX_COND_man\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${DX_COND_rtf_TRUE}" && test -z "${DX_COND_rtf_FALSE}"; then + as_fn_error $? "conditional \"DX_COND_rtf\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${DX_COND_rtf_TRUE}" && test -z "${DX_COND_rtf_FALSE}"; then + as_fn_error $? "conditional \"DX_COND_rtf\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${DX_COND_xml_TRUE}" && test -z "${DX_COND_xml_FALSE}"; then + as_fn_error $? "conditional \"DX_COND_xml\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${DX_COND_xml_TRUE}" && test -z "${DX_COND_xml_FALSE}"; then + as_fn_error $? "conditional \"DX_COND_xml\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${DX_COND_chm_TRUE}" && test -z "${DX_COND_chm_FALSE}"; then + as_fn_error $? "conditional \"DX_COND_chm\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${DX_COND_chm_TRUE}" && test -z "${DX_COND_chm_FALSE}"; then + as_fn_error $? "conditional \"DX_COND_chm\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${DX_COND_chi_TRUE}" && test -z "${DX_COND_chi_FALSE}"; then + as_fn_error $? "conditional \"DX_COND_chi\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${DX_COND_chi_TRUE}" && test -z "${DX_COND_chi_FALSE}"; then + as_fn_error $? "conditional \"DX_COND_chi\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${DX_COND_html_TRUE}" && test -z "${DX_COND_html_FALSE}"; then + as_fn_error $? "conditional \"DX_COND_html\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${DX_COND_html_TRUE}" && test -z "${DX_COND_html_FALSE}"; then + as_fn_error $? "conditional \"DX_COND_html\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${DX_COND_ps_TRUE}" && test -z "${DX_COND_ps_FALSE}"; then + as_fn_error $? "conditional \"DX_COND_ps\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${DX_COND_ps_TRUE}" && test -z "${DX_COND_ps_FALSE}"; then + as_fn_error $? "conditional \"DX_COND_ps\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${DX_COND_pdf_TRUE}" && test -z "${DX_COND_pdf_FALSE}"; then + as_fn_error $? "conditional \"DX_COND_pdf\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${DX_COND_pdf_TRUE}" && test -z "${DX_COND_pdf_FALSE}"; then + as_fn_error $? "conditional \"DX_COND_pdf\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${DX_COND_latex_TRUE}" && test -z "${DX_COND_latex_FALSE}"; then + as_fn_error $? "conditional \"DX_COND_latex\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${DX_COND_latex_TRUE}" && test -z "${DX_COND_latex_FALSE}"; then + as_fn_error $? "conditional \"DX_COND_latex\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi + if test -n "$EXEEXT"; then + am__EXEEXT_TRUE= + am__EXEEXT_FALSE='#' +else + am__EXEEXT_TRUE='#' + am__EXEEXT_FALSE= +fi + +if test -z "${AMDEP_TRUE}" && test -z "${AMDEP_FALSE}"; then + as_fn_error $? "conditional \"AMDEP\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${am__fastdepCC_TRUE}" && test -z "${am__fastdepCC_FALSE}"; then + as_fn_error $? "conditional \"am__fastdepCC\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${am__fastdepCXX_TRUE}" && test -z "${am__fastdepCXX_FALSE}"; then + as_fn_error $? "conditional \"am__fastdepCXX\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${WANT_SYNCAPI_TRUE}" && test -z "${WANT_SYNCAPI_FALSE}"; then + as_fn_error $? "conditional \"WANT_SYNCAPI\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi + +: "${CONFIG_STATUS=./config.status}" +ac_write_fail=0 +ac_clean_files_save=$ac_clean_files +ac_clean_files="$ac_clean_files $CONFIG_STATUS" +{ $as_echo "$as_me:${as_lineno-$LINENO}: creating $CONFIG_STATUS" >&5 +$as_echo "$as_me: creating $CONFIG_STATUS" >&6;} +as_write_fail=0 +cat >$CONFIG_STATUS <<_ASEOF || as_write_fail=1 +#! $SHELL +# Generated by $as_me. +# Run this file to recreate the current configuration. +# Compiler output produced by configure, useful for debugging +# configure, is in config.log if it exists. + +debug=false +ac_cs_recheck=false +ac_cs_silent=false + +SHELL=\${CONFIG_SHELL-$SHELL} +export SHELL +_ASEOF +cat >>$CONFIG_STATUS <<\_ASEOF || as_write_fail=1 +## -------------------- ## +## M4sh Initialization. ## +## -------------------- ## + +# Be more Bourne compatible +DUALCASE=1; export DUALCASE # for MKS sh +if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : + emulate sh + NULLCMD=: + # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which + # is contrary to our usage. Disable this feature. + alias -g '${1+"$@"}'='"$@"' + setopt NO_GLOB_SUBST +else + case `(set -o) 2>/dev/null` in @%:@( + *posix*) : + set -o posix ;; @%:@( + *) : + ;; +esac +fi + + +as_nl=' +' +export as_nl +# Printing a long string crashes Solaris 7 /usr/bin/printf. +as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' +as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo +as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo +# Prefer a ksh shell builtin over an external printf program on Solaris, +# but without wasting forks for bash or zsh. +if test -z "$BASH_VERSION$ZSH_VERSION" \ + && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then + as_echo='print -r --' + as_echo_n='print -rn --' +elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then + as_echo='printf %s\n' + as_echo_n='printf %s' +else + if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then + as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' + as_echo_n='/usr/ucb/echo -n' + else + as_echo_body='eval expr "X$1" : "X\\(.*\\)"' + as_echo_n_body='eval + arg=$1; + case $arg in @%:@( + *"$as_nl"*) + expr "X$arg" : "X\\(.*\\)$as_nl"; + arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; + esac; + expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" + ' + export as_echo_n_body + as_echo_n='sh -c $as_echo_n_body as_echo' + fi + export as_echo_body + as_echo='sh -c $as_echo_body as_echo' +fi + +# The user is always right. +if test "${PATH_SEPARATOR+set}" != set; then + PATH_SEPARATOR=: + (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { + (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || + PATH_SEPARATOR=';' + } +fi + + +# IFS +# We need space, tab and new line, in precisely that order. Quoting is +# there to prevent editors from complaining about space-tab. +# (If _AS_PATH_WALK were called with IFS unset, it would disable word +# splitting by setting IFS to empty value.) +IFS=" "" $as_nl" + +# Find who we are. Look in the path if we contain no directory separator. +as_myself= +case $0 in @%:@(( + *[\\/]* ) as_myself=$0 ;; + *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break + done +IFS=$as_save_IFS + + ;; +esac +# We did not find ourselves, most probably we were run as `sh COMMAND' +# in which case we are not to be found in the path. +if test "x$as_myself" = x; then + as_myself=$0 +fi +if test ! -f "$as_myself"; then + $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 + exit 1 +fi + +# Unset variables that we do not need and which cause bugs (e.g. in +# pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" +# suppresses any "Segmentation fault" message there. '((' could +# trigger a bug in pdksh 5.2.14. +for as_var in BASH_ENV ENV MAIL MAILPATH +do eval test x\${$as_var+set} = xset \ + && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : +done +PS1='$ ' +PS2='> ' +PS4='+ ' + +# NLS nuisances. +LC_ALL=C +export LC_ALL +LANGUAGE=C +export LANGUAGE + +# CDPATH. +(unset CDPATH) >/dev/null 2>&1 && unset CDPATH + + +@%:@ as_fn_error STATUS ERROR [LINENO LOG_FD] +@%:@ ---------------------------------------- +@%:@ Output "`basename @S|@0`: error: ERROR" to stderr. If LINENO and LOG_FD are +@%:@ provided, also output the error to LOG_FD, referencing LINENO. Then exit the +@%:@ script with STATUS, using 1 if that was 0. +as_fn_error () +{ + as_status=$1; test $as_status -eq 0 && as_status=1 + if test "$4"; then + as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 + fi + $as_echo "$as_me: error: $2" >&2 + as_fn_exit $as_status +} @%:@ as_fn_error + + +@%:@ as_fn_set_status STATUS +@%:@ ----------------------- +@%:@ Set @S|@? to STATUS, without forking. +as_fn_set_status () +{ + return $1 +} @%:@ as_fn_set_status + +@%:@ as_fn_exit STATUS +@%:@ ----------------- +@%:@ Exit the shell with STATUS, even in a "trap 0" or "set -e" context. +as_fn_exit () +{ + set +e + as_fn_set_status $1 + exit $1 +} @%:@ as_fn_exit + +@%:@ as_fn_unset VAR +@%:@ --------------- +@%:@ Portably unset VAR. +as_fn_unset () +{ + { eval $1=; unset $1;} +} +as_unset=as_fn_unset +@%:@ as_fn_append VAR VALUE +@%:@ ---------------------- +@%:@ Append the text in VALUE to the end of the definition contained in VAR. Take +@%:@ advantage of any shell optimizations that allow amortized linear growth over +@%:@ repeated appends, instead of the typical quadratic growth present in naive +@%:@ implementations. +if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : + eval 'as_fn_append () + { + eval $1+=\$2 + }' +else + as_fn_append () + { + eval $1=\$$1\$2 + } +fi # as_fn_append + +@%:@ as_fn_arith ARG... +@%:@ ------------------ +@%:@ Perform arithmetic evaluation on the ARGs, and store the result in the +@%:@ global @S|@as_val. Take advantage of shells that can avoid forks. The arguments +@%:@ must be portable across @S|@(()) and expr. +if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : + eval 'as_fn_arith () + { + as_val=$(( $* )) + }' +else + as_fn_arith () + { + as_val=`expr "$@" || test $? -eq 1` + } +fi # as_fn_arith + + +if expr a : '\(a\)' >/dev/null 2>&1 && + test "X`expr 00001 : '.*\(...\)'`" = X001; then + as_expr=expr +else + as_expr=false +fi + +if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then + as_basename=basename +else + as_basename=false +fi + +if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then + as_dirname=dirname +else + as_dirname=false +fi + +as_me=`$as_basename -- "$0" || +$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ + X"$0" : 'X\(//\)$' \| \ + X"$0" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X/"$0" | + sed '/^.*\/\([^/][^/]*\)\/*$/{ + s//\1/ + q + } + /^X\/\(\/\/\)$/{ + s//\1/ + q + } + /^X\/\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + +# Avoid depending upon Character Ranges. +as_cr_letters='abcdefghijklmnopqrstuvwxyz' +as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' +as_cr_Letters=$as_cr_letters$as_cr_LETTERS +as_cr_digits='0123456789' +as_cr_alnum=$as_cr_Letters$as_cr_digits + +ECHO_C= ECHO_N= ECHO_T= +case `echo -n x` in @%:@((((( +-n*) + case `echo 'xy\c'` in + *c*) ECHO_T=' ';; # ECHO_T is single tab character. + xy) ECHO_C='\c';; + *) echo `echo ksh88 bug on AIX 6.1` > /dev/null + ECHO_T=' ';; + esac;; +*) + ECHO_N='-n';; +esac + +rm -f conf$$ conf$$.exe conf$$.file +if test -d conf$$.dir; then + rm -f conf$$.dir/conf$$.file +else + rm -f conf$$.dir + mkdir conf$$.dir 2>/dev/null +fi +if (echo >conf$$.file) 2>/dev/null; then + if ln -s conf$$.file conf$$ 2>/dev/null; then + as_ln_s='ln -s' + # ... but there are two gotchas: + # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. + # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. + # In both cases, we have to default to `cp -pR'. + ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || + as_ln_s='cp -pR' + elif ln conf$$.file conf$$ 2>/dev/null; then + as_ln_s=ln + else + as_ln_s='cp -pR' + fi +else + as_ln_s='cp -pR' +fi +rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file +rmdir conf$$.dir 2>/dev/null + + +@%:@ as_fn_mkdir_p +@%:@ ------------- +@%:@ Create "@S|@as_dir" as a directory, including parents if necessary. +as_fn_mkdir_p () +{ + + case $as_dir in #( + -*) as_dir=./$as_dir;; + esac + test -d "$as_dir" || eval $as_mkdir_p || { + as_dirs= + while :; do + case $as_dir in #( + *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( + *) as_qdir=$as_dir;; + esac + as_dirs="'$as_qdir' $as_dirs" + as_dir=`$as_dirname -- "$as_dir" || +$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$as_dir" : 'X\(//\)[^/]' \| \ + X"$as_dir" : 'X\(//\)$' \| \ + X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$as_dir" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + test -d "$as_dir" && break + done + test -z "$as_dirs" || eval "mkdir $as_dirs" + } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" + + +} @%:@ as_fn_mkdir_p +if mkdir -p . 2>/dev/null; then + as_mkdir_p='mkdir -p "$as_dir"' +else + test -d ./-p && rmdir ./-p + as_mkdir_p=false +fi + + +@%:@ as_fn_executable_p FILE +@%:@ ----------------------- +@%:@ Test if FILE is an executable regular file. +as_fn_executable_p () +{ + test -f "$1" && test -x "$1" +} @%:@ as_fn_executable_p +as_test_x='test -x' +as_executable_p=as_fn_executable_p + +# Sed expression to map a string onto a valid CPP name. +as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" + +# Sed expression to map a string onto a valid variable name. +as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" + + +exec 6>&1 +## ----------------------------------- ## +## Main body of $CONFIG_STATUS script. ## +## ----------------------------------- ## +_ASEOF +test $as_write_fail = 0 && chmod +x $CONFIG_STATUS || ac_write_fail=1 + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +# Save the log message, to keep $0 and so on meaningful, and to +# report actual input values of CONFIG_FILES etc. instead of their +# values after options handling. +ac_log=" +This file was extended by zookeeper C client $as_me 3.4.5, which was +generated by GNU Autoconf 2.69. Invocation command line was + + CONFIG_FILES = $CONFIG_FILES + CONFIG_HEADERS = $CONFIG_HEADERS + CONFIG_LINKS = $CONFIG_LINKS + CONFIG_COMMANDS = $CONFIG_COMMANDS + $ $0 $@ + +on `(hostname || uname -n) 2>/dev/null | sed 1q` +" + +_ACEOF + +case $ac_config_files in *" +"*) set x $ac_config_files; shift; ac_config_files=$*;; +esac + +case $ac_config_headers in *" +"*) set x $ac_config_headers; shift; ac_config_headers=$*;; +esac + + +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +# Files that config.status was made for. +config_files="$ac_config_files" +config_headers="$ac_config_headers" +config_commands="$ac_config_commands" + +_ACEOF + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +ac_cs_usage="\ +\`$as_me' instantiates files and other configuration actions +from templates according to the current configuration. Unless the files +and actions are specified as TAGs, all are instantiated by default. + +Usage: $0 [OPTION]... [TAG]... + + -h, --help print this help, then exit + -V, --version print version number and configuration settings, then exit + --config print configuration, then exit + -q, --quiet, --silent + do not print progress messages + -d, --debug don't remove temporary files + --recheck update $as_me by reconfiguring in the same conditions + --file=FILE[:TEMPLATE] + instantiate the configuration file FILE + --header=FILE[:TEMPLATE] + instantiate the configuration header FILE + +Configuration files: +$config_files + +Configuration headers: +$config_headers + +Configuration commands: +$config_commands + +Report bugs to ." + +_ACEOF +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" +ac_cs_version="\\ +zookeeper C client config.status 3.4.5 +configured by $0, generated by GNU Autoconf 2.69, + with options \\"\$ac_cs_config\\" + +Copyright (C) 2012 Free Software Foundation, Inc. +This config.status script is free software; the Free Software Foundation +gives unlimited permission to copy, distribute and modify it." + +ac_pwd='$ac_pwd' +srcdir='$srcdir' +INSTALL='$INSTALL' +MKDIR_P='$MKDIR_P' +AWK='$AWK' +test -n "\$AWK" || AWK=awk +_ACEOF + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +# The default lists apply if the user does not specify any file. +ac_need_defaults=: +while test $# != 0 +do + case $1 in + --*=?*) + ac_option=`expr "X$1" : 'X\([^=]*\)='` + ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'` + ac_shift=: + ;; + --*=) + ac_option=`expr "X$1" : 'X\([^=]*\)='` + ac_optarg= + ac_shift=: + ;; + *) + ac_option=$1 + ac_optarg=$2 + ac_shift=shift + ;; + esac + + case $ac_option in + # Handling of the options. + -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) + ac_cs_recheck=: ;; + --version | --versio | --versi | --vers | --ver | --ve | --v | -V ) + $as_echo "$ac_cs_version"; exit ;; + --config | --confi | --conf | --con | --co | --c ) + $as_echo "$ac_cs_config"; exit ;; + --debug | --debu | --deb | --de | --d | -d ) + debug=: ;; + --file | --fil | --fi | --f ) + $ac_shift + case $ac_optarg in + *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; + '') as_fn_error $? "missing file argument" ;; + esac + as_fn_append CONFIG_FILES " '$ac_optarg'" + ac_need_defaults=false;; + --header | --heade | --head | --hea ) + $ac_shift + case $ac_optarg in + *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; + esac + as_fn_append CONFIG_HEADERS " '$ac_optarg'" + ac_need_defaults=false;; + --he | --h) + # Conflict between --help and --header + as_fn_error $? "ambiguous option: \`$1' +Try \`$0 --help' for more information.";; + --help | --hel | -h ) + $as_echo "$ac_cs_usage"; exit ;; + -q | -quiet | --quiet | --quie | --qui | --qu | --q \ + | -silent | --silent | --silen | --sile | --sil | --si | --s) + ac_cs_silent=: ;; + + # This is an error. + -*) as_fn_error $? "unrecognized option: \`$1' +Try \`$0 --help' for more information." ;; + + *) as_fn_append ac_config_targets " $1" + ac_need_defaults=false ;; + + esac + shift +done + +ac_configure_extra_args= + +if $ac_cs_silent; then + exec 6>/dev/null + ac_configure_extra_args="$ac_configure_extra_args --silent" +fi + +_ACEOF +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +if \$ac_cs_recheck; then + set X $SHELL '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion + shift + \$as_echo "running CONFIG_SHELL=$SHELL \$*" >&6 + CONFIG_SHELL='$SHELL' + export CONFIG_SHELL + exec "\$@" +fi + +_ACEOF +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +exec 5>>config.log +{ + echo + sed 'h;s/./-/g;s/^.../@%:@@%:@ /;s/...$/ @%:@@%:@/;p;x;p;x' <<_ASBOX +@%:@@%:@ Running $as_me. @%:@@%:@ +_ASBOX + $as_echo "$ac_log" +} >&5 + +_ACEOF +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +# +# INIT-COMMANDS +# +AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir" + + +# The HP-UX ksh and POSIX shell print the target directory to stdout +# if CDPATH is set. +(unset CDPATH) >/dev/null 2>&1 && unset CDPATH + +sed_quote_subst='$sed_quote_subst' +double_quote_subst='$double_quote_subst' +delay_variable_subst='$delay_variable_subst' +macro_version='`$ECHO "$macro_version" | $SED "$delay_single_quote_subst"`' +macro_revision='`$ECHO "$macro_revision" | $SED "$delay_single_quote_subst"`' +enable_shared='`$ECHO "$enable_shared" | $SED "$delay_single_quote_subst"`' +enable_static='`$ECHO "$enable_static" | $SED "$delay_single_quote_subst"`' +pic_mode='`$ECHO "$pic_mode" | $SED "$delay_single_quote_subst"`' +enable_fast_install='`$ECHO "$enable_fast_install" | $SED "$delay_single_quote_subst"`' +SHELL='`$ECHO "$SHELL" | $SED "$delay_single_quote_subst"`' +ECHO='`$ECHO "$ECHO" | $SED "$delay_single_quote_subst"`' +PATH_SEPARATOR='`$ECHO "$PATH_SEPARATOR" | $SED "$delay_single_quote_subst"`' +host_alias='`$ECHO "$host_alias" | $SED "$delay_single_quote_subst"`' +host='`$ECHO "$host" | $SED "$delay_single_quote_subst"`' +host_os='`$ECHO "$host_os" | $SED "$delay_single_quote_subst"`' +build_alias='`$ECHO "$build_alias" | $SED "$delay_single_quote_subst"`' +build='`$ECHO "$build" | $SED "$delay_single_quote_subst"`' +build_os='`$ECHO "$build_os" | $SED "$delay_single_quote_subst"`' +SED='`$ECHO "$SED" | $SED "$delay_single_quote_subst"`' +Xsed='`$ECHO "$Xsed" | $SED "$delay_single_quote_subst"`' +GREP='`$ECHO "$GREP" | $SED "$delay_single_quote_subst"`' +EGREP='`$ECHO "$EGREP" | $SED "$delay_single_quote_subst"`' +FGREP='`$ECHO "$FGREP" | $SED "$delay_single_quote_subst"`' +LD='`$ECHO "$LD" | $SED "$delay_single_quote_subst"`' +NM='`$ECHO "$NM" | $SED "$delay_single_quote_subst"`' +LN_S='`$ECHO "$LN_S" | $SED "$delay_single_quote_subst"`' +max_cmd_len='`$ECHO "$max_cmd_len" | $SED "$delay_single_quote_subst"`' +ac_objext='`$ECHO "$ac_objext" | $SED "$delay_single_quote_subst"`' +exeext='`$ECHO "$exeext" | $SED "$delay_single_quote_subst"`' +lt_unset='`$ECHO "$lt_unset" | $SED "$delay_single_quote_subst"`' +lt_SP2NL='`$ECHO "$lt_SP2NL" | $SED "$delay_single_quote_subst"`' +lt_NL2SP='`$ECHO "$lt_NL2SP" | $SED "$delay_single_quote_subst"`' +lt_cv_to_host_file_cmd='`$ECHO "$lt_cv_to_host_file_cmd" | $SED "$delay_single_quote_subst"`' +lt_cv_to_tool_file_cmd='`$ECHO "$lt_cv_to_tool_file_cmd" | $SED "$delay_single_quote_subst"`' +reload_flag='`$ECHO "$reload_flag" | $SED "$delay_single_quote_subst"`' +reload_cmds='`$ECHO "$reload_cmds" | $SED "$delay_single_quote_subst"`' +OBJDUMP='`$ECHO "$OBJDUMP" | $SED "$delay_single_quote_subst"`' +deplibs_check_method='`$ECHO "$deplibs_check_method" | $SED "$delay_single_quote_subst"`' +file_magic_cmd='`$ECHO "$file_magic_cmd" | $SED "$delay_single_quote_subst"`' +file_magic_glob='`$ECHO "$file_magic_glob" | $SED "$delay_single_quote_subst"`' +want_nocaseglob='`$ECHO "$want_nocaseglob" | $SED "$delay_single_quote_subst"`' +DLLTOOL='`$ECHO "$DLLTOOL" | $SED "$delay_single_quote_subst"`' +sharedlib_from_linklib_cmd='`$ECHO "$sharedlib_from_linklib_cmd" | $SED "$delay_single_quote_subst"`' +AR='`$ECHO "$AR" | $SED "$delay_single_quote_subst"`' +AR_FLAGS='`$ECHO "$AR_FLAGS" | $SED "$delay_single_quote_subst"`' +archiver_list_spec='`$ECHO "$archiver_list_spec" | $SED "$delay_single_quote_subst"`' +STRIP='`$ECHO "$STRIP" | $SED "$delay_single_quote_subst"`' +RANLIB='`$ECHO "$RANLIB" | $SED "$delay_single_quote_subst"`' +old_postinstall_cmds='`$ECHO "$old_postinstall_cmds" | $SED "$delay_single_quote_subst"`' +old_postuninstall_cmds='`$ECHO "$old_postuninstall_cmds" | $SED "$delay_single_quote_subst"`' +old_archive_cmds='`$ECHO "$old_archive_cmds" | $SED "$delay_single_quote_subst"`' +lock_old_archive_extraction='`$ECHO "$lock_old_archive_extraction" | $SED "$delay_single_quote_subst"`' +CC='`$ECHO "$CC" | $SED "$delay_single_quote_subst"`' +CFLAGS='`$ECHO "$CFLAGS" | $SED "$delay_single_quote_subst"`' +compiler='`$ECHO "$compiler" | $SED "$delay_single_quote_subst"`' +GCC='`$ECHO "$GCC" | $SED "$delay_single_quote_subst"`' +lt_cv_sys_global_symbol_pipe='`$ECHO "$lt_cv_sys_global_symbol_pipe" | $SED "$delay_single_quote_subst"`' +lt_cv_sys_global_symbol_to_cdecl='`$ECHO "$lt_cv_sys_global_symbol_to_cdecl" | $SED "$delay_single_quote_subst"`' +lt_cv_sys_global_symbol_to_c_name_address='`$ECHO "$lt_cv_sys_global_symbol_to_c_name_address" | $SED "$delay_single_quote_subst"`' +lt_cv_sys_global_symbol_to_c_name_address_lib_prefix='`$ECHO "$lt_cv_sys_global_symbol_to_c_name_address_lib_prefix" | $SED "$delay_single_quote_subst"`' +nm_file_list_spec='`$ECHO "$nm_file_list_spec" | $SED "$delay_single_quote_subst"`' +lt_sysroot='`$ECHO "$lt_sysroot" | $SED "$delay_single_quote_subst"`' +objdir='`$ECHO "$objdir" | $SED "$delay_single_quote_subst"`' +MAGIC_CMD='`$ECHO "$MAGIC_CMD" | $SED "$delay_single_quote_subst"`' +lt_prog_compiler_no_builtin_flag='`$ECHO "$lt_prog_compiler_no_builtin_flag" | $SED "$delay_single_quote_subst"`' +lt_prog_compiler_pic='`$ECHO "$lt_prog_compiler_pic" | $SED "$delay_single_quote_subst"`' +lt_prog_compiler_wl='`$ECHO "$lt_prog_compiler_wl" | $SED "$delay_single_quote_subst"`' +lt_prog_compiler_static='`$ECHO "$lt_prog_compiler_static" | $SED "$delay_single_quote_subst"`' +lt_cv_prog_compiler_c_o='`$ECHO "$lt_cv_prog_compiler_c_o" | $SED "$delay_single_quote_subst"`' +need_locks='`$ECHO "$need_locks" | $SED "$delay_single_quote_subst"`' +MANIFEST_TOOL='`$ECHO "$MANIFEST_TOOL" | $SED "$delay_single_quote_subst"`' +DSYMUTIL='`$ECHO "$DSYMUTIL" | $SED "$delay_single_quote_subst"`' +NMEDIT='`$ECHO "$NMEDIT" | $SED "$delay_single_quote_subst"`' +LIPO='`$ECHO "$LIPO" | $SED "$delay_single_quote_subst"`' +OTOOL='`$ECHO "$OTOOL" | $SED "$delay_single_quote_subst"`' +OTOOL64='`$ECHO "$OTOOL64" | $SED "$delay_single_quote_subst"`' +libext='`$ECHO "$libext" | $SED "$delay_single_quote_subst"`' +shrext_cmds='`$ECHO "$shrext_cmds" | $SED "$delay_single_quote_subst"`' +extract_expsyms_cmds='`$ECHO "$extract_expsyms_cmds" | $SED "$delay_single_quote_subst"`' +archive_cmds_need_lc='`$ECHO "$archive_cmds_need_lc" | $SED "$delay_single_quote_subst"`' +enable_shared_with_static_runtimes='`$ECHO "$enable_shared_with_static_runtimes" | $SED "$delay_single_quote_subst"`' +export_dynamic_flag_spec='`$ECHO "$export_dynamic_flag_spec" | $SED "$delay_single_quote_subst"`' +whole_archive_flag_spec='`$ECHO "$whole_archive_flag_spec" | $SED "$delay_single_quote_subst"`' +compiler_needs_object='`$ECHO "$compiler_needs_object" | $SED "$delay_single_quote_subst"`' +old_archive_from_new_cmds='`$ECHO "$old_archive_from_new_cmds" | $SED "$delay_single_quote_subst"`' +old_archive_from_expsyms_cmds='`$ECHO "$old_archive_from_expsyms_cmds" | $SED "$delay_single_quote_subst"`' +archive_cmds='`$ECHO "$archive_cmds" | $SED "$delay_single_quote_subst"`' +archive_expsym_cmds='`$ECHO "$archive_expsym_cmds" | $SED "$delay_single_quote_subst"`' +module_cmds='`$ECHO "$module_cmds" | $SED "$delay_single_quote_subst"`' +module_expsym_cmds='`$ECHO "$module_expsym_cmds" | $SED "$delay_single_quote_subst"`' +with_gnu_ld='`$ECHO "$with_gnu_ld" | $SED "$delay_single_quote_subst"`' +allow_undefined_flag='`$ECHO "$allow_undefined_flag" | $SED "$delay_single_quote_subst"`' +no_undefined_flag='`$ECHO "$no_undefined_flag" | $SED "$delay_single_quote_subst"`' +hardcode_libdir_flag_spec='`$ECHO "$hardcode_libdir_flag_spec" | $SED "$delay_single_quote_subst"`' +hardcode_libdir_separator='`$ECHO "$hardcode_libdir_separator" | $SED "$delay_single_quote_subst"`' +hardcode_direct='`$ECHO "$hardcode_direct" | $SED "$delay_single_quote_subst"`' +hardcode_direct_absolute='`$ECHO "$hardcode_direct_absolute" | $SED "$delay_single_quote_subst"`' +hardcode_minus_L='`$ECHO "$hardcode_minus_L" | $SED "$delay_single_quote_subst"`' +hardcode_shlibpath_var='`$ECHO "$hardcode_shlibpath_var" | $SED "$delay_single_quote_subst"`' +hardcode_automatic='`$ECHO "$hardcode_automatic" | $SED "$delay_single_quote_subst"`' +inherit_rpath='`$ECHO "$inherit_rpath" | $SED "$delay_single_quote_subst"`' +link_all_deplibs='`$ECHO "$link_all_deplibs" | $SED "$delay_single_quote_subst"`' +always_export_symbols='`$ECHO "$always_export_symbols" | $SED "$delay_single_quote_subst"`' +export_symbols_cmds='`$ECHO "$export_symbols_cmds" | $SED "$delay_single_quote_subst"`' +exclude_expsyms='`$ECHO "$exclude_expsyms" | $SED "$delay_single_quote_subst"`' +include_expsyms='`$ECHO "$include_expsyms" | $SED "$delay_single_quote_subst"`' +prelink_cmds='`$ECHO "$prelink_cmds" | $SED "$delay_single_quote_subst"`' +postlink_cmds='`$ECHO "$postlink_cmds" | $SED "$delay_single_quote_subst"`' +file_list_spec='`$ECHO "$file_list_spec" | $SED "$delay_single_quote_subst"`' +variables_saved_for_relink='`$ECHO "$variables_saved_for_relink" | $SED "$delay_single_quote_subst"`' +need_lib_prefix='`$ECHO "$need_lib_prefix" | $SED "$delay_single_quote_subst"`' +need_version='`$ECHO "$need_version" | $SED "$delay_single_quote_subst"`' +version_type='`$ECHO "$version_type" | $SED "$delay_single_quote_subst"`' +runpath_var='`$ECHO "$runpath_var" | $SED "$delay_single_quote_subst"`' +shlibpath_var='`$ECHO "$shlibpath_var" | $SED "$delay_single_quote_subst"`' +shlibpath_overrides_runpath='`$ECHO "$shlibpath_overrides_runpath" | $SED "$delay_single_quote_subst"`' +libname_spec='`$ECHO "$libname_spec" | $SED "$delay_single_quote_subst"`' +library_names_spec='`$ECHO "$library_names_spec" | $SED "$delay_single_quote_subst"`' +soname_spec='`$ECHO "$soname_spec" | $SED "$delay_single_quote_subst"`' +install_override_mode='`$ECHO "$install_override_mode" | $SED "$delay_single_quote_subst"`' +postinstall_cmds='`$ECHO "$postinstall_cmds" | $SED "$delay_single_quote_subst"`' +postuninstall_cmds='`$ECHO "$postuninstall_cmds" | $SED "$delay_single_quote_subst"`' +finish_cmds='`$ECHO "$finish_cmds" | $SED "$delay_single_quote_subst"`' +finish_eval='`$ECHO "$finish_eval" | $SED "$delay_single_quote_subst"`' +hardcode_into_libs='`$ECHO "$hardcode_into_libs" | $SED "$delay_single_quote_subst"`' +sys_lib_search_path_spec='`$ECHO "$sys_lib_search_path_spec" | $SED "$delay_single_quote_subst"`' +sys_lib_dlsearch_path_spec='`$ECHO "$sys_lib_dlsearch_path_spec" | $SED "$delay_single_quote_subst"`' +hardcode_action='`$ECHO "$hardcode_action" | $SED "$delay_single_quote_subst"`' +enable_dlopen='`$ECHO "$enable_dlopen" | $SED "$delay_single_quote_subst"`' +enable_dlopen_self='`$ECHO "$enable_dlopen_self" | $SED "$delay_single_quote_subst"`' +enable_dlopen_self_static='`$ECHO "$enable_dlopen_self_static" | $SED "$delay_single_quote_subst"`' +old_striplib='`$ECHO "$old_striplib" | $SED "$delay_single_quote_subst"`' +striplib='`$ECHO "$striplib" | $SED "$delay_single_quote_subst"`' +compiler_lib_search_dirs='`$ECHO "$compiler_lib_search_dirs" | $SED "$delay_single_quote_subst"`' +predep_objects='`$ECHO "$predep_objects" | $SED "$delay_single_quote_subst"`' +postdep_objects='`$ECHO "$postdep_objects" | $SED "$delay_single_quote_subst"`' +predeps='`$ECHO "$predeps" | $SED "$delay_single_quote_subst"`' +postdeps='`$ECHO "$postdeps" | $SED "$delay_single_quote_subst"`' +compiler_lib_search_path='`$ECHO "$compiler_lib_search_path" | $SED "$delay_single_quote_subst"`' +LD_CXX='`$ECHO "$LD_CXX" | $SED "$delay_single_quote_subst"`' +reload_flag_CXX='`$ECHO "$reload_flag_CXX" | $SED "$delay_single_quote_subst"`' +reload_cmds_CXX='`$ECHO "$reload_cmds_CXX" | $SED "$delay_single_quote_subst"`' +old_archive_cmds_CXX='`$ECHO "$old_archive_cmds_CXX" | $SED "$delay_single_quote_subst"`' +compiler_CXX='`$ECHO "$compiler_CXX" | $SED "$delay_single_quote_subst"`' +GCC_CXX='`$ECHO "$GCC_CXX" | $SED "$delay_single_quote_subst"`' +lt_prog_compiler_no_builtin_flag_CXX='`$ECHO "$lt_prog_compiler_no_builtin_flag_CXX" | $SED "$delay_single_quote_subst"`' +lt_prog_compiler_pic_CXX='`$ECHO "$lt_prog_compiler_pic_CXX" | $SED "$delay_single_quote_subst"`' +lt_prog_compiler_wl_CXX='`$ECHO "$lt_prog_compiler_wl_CXX" | $SED "$delay_single_quote_subst"`' +lt_prog_compiler_static_CXX='`$ECHO "$lt_prog_compiler_static_CXX" | $SED "$delay_single_quote_subst"`' +lt_cv_prog_compiler_c_o_CXX='`$ECHO "$lt_cv_prog_compiler_c_o_CXX" | $SED "$delay_single_quote_subst"`' +archive_cmds_need_lc_CXX='`$ECHO "$archive_cmds_need_lc_CXX" | $SED "$delay_single_quote_subst"`' +enable_shared_with_static_runtimes_CXX='`$ECHO "$enable_shared_with_static_runtimes_CXX" | $SED "$delay_single_quote_subst"`' +export_dynamic_flag_spec_CXX='`$ECHO "$export_dynamic_flag_spec_CXX" | $SED "$delay_single_quote_subst"`' +whole_archive_flag_spec_CXX='`$ECHO "$whole_archive_flag_spec_CXX" | $SED "$delay_single_quote_subst"`' +compiler_needs_object_CXX='`$ECHO "$compiler_needs_object_CXX" | $SED "$delay_single_quote_subst"`' +old_archive_from_new_cmds_CXX='`$ECHO "$old_archive_from_new_cmds_CXX" | $SED "$delay_single_quote_subst"`' +old_archive_from_expsyms_cmds_CXX='`$ECHO "$old_archive_from_expsyms_cmds_CXX" | $SED "$delay_single_quote_subst"`' +archive_cmds_CXX='`$ECHO "$archive_cmds_CXX" | $SED "$delay_single_quote_subst"`' +archive_expsym_cmds_CXX='`$ECHO "$archive_expsym_cmds_CXX" | $SED "$delay_single_quote_subst"`' +module_cmds_CXX='`$ECHO "$module_cmds_CXX" | $SED "$delay_single_quote_subst"`' +module_expsym_cmds_CXX='`$ECHO "$module_expsym_cmds_CXX" | $SED "$delay_single_quote_subst"`' +with_gnu_ld_CXX='`$ECHO "$with_gnu_ld_CXX" | $SED "$delay_single_quote_subst"`' +allow_undefined_flag_CXX='`$ECHO "$allow_undefined_flag_CXX" | $SED "$delay_single_quote_subst"`' +no_undefined_flag_CXX='`$ECHO "$no_undefined_flag_CXX" | $SED "$delay_single_quote_subst"`' +hardcode_libdir_flag_spec_CXX='`$ECHO "$hardcode_libdir_flag_spec_CXX" | $SED "$delay_single_quote_subst"`' +hardcode_libdir_separator_CXX='`$ECHO "$hardcode_libdir_separator_CXX" | $SED "$delay_single_quote_subst"`' +hardcode_direct_CXX='`$ECHO "$hardcode_direct_CXX" | $SED "$delay_single_quote_subst"`' +hardcode_direct_absolute_CXX='`$ECHO "$hardcode_direct_absolute_CXX" | $SED "$delay_single_quote_subst"`' +hardcode_minus_L_CXX='`$ECHO "$hardcode_minus_L_CXX" | $SED "$delay_single_quote_subst"`' +hardcode_shlibpath_var_CXX='`$ECHO "$hardcode_shlibpath_var_CXX" | $SED "$delay_single_quote_subst"`' +hardcode_automatic_CXX='`$ECHO "$hardcode_automatic_CXX" | $SED "$delay_single_quote_subst"`' +inherit_rpath_CXX='`$ECHO "$inherit_rpath_CXX" | $SED "$delay_single_quote_subst"`' +link_all_deplibs_CXX='`$ECHO "$link_all_deplibs_CXX" | $SED "$delay_single_quote_subst"`' +always_export_symbols_CXX='`$ECHO "$always_export_symbols_CXX" | $SED "$delay_single_quote_subst"`' +export_symbols_cmds_CXX='`$ECHO "$export_symbols_cmds_CXX" | $SED "$delay_single_quote_subst"`' +exclude_expsyms_CXX='`$ECHO "$exclude_expsyms_CXX" | $SED "$delay_single_quote_subst"`' +include_expsyms_CXX='`$ECHO "$include_expsyms_CXX" | $SED "$delay_single_quote_subst"`' +prelink_cmds_CXX='`$ECHO "$prelink_cmds_CXX" | $SED "$delay_single_quote_subst"`' +postlink_cmds_CXX='`$ECHO "$postlink_cmds_CXX" | $SED "$delay_single_quote_subst"`' +file_list_spec_CXX='`$ECHO "$file_list_spec_CXX" | $SED "$delay_single_quote_subst"`' +hardcode_action_CXX='`$ECHO "$hardcode_action_CXX" | $SED "$delay_single_quote_subst"`' +compiler_lib_search_dirs_CXX='`$ECHO "$compiler_lib_search_dirs_CXX" | $SED "$delay_single_quote_subst"`' +predep_objects_CXX='`$ECHO "$predep_objects_CXX" | $SED "$delay_single_quote_subst"`' +postdep_objects_CXX='`$ECHO "$postdep_objects_CXX" | $SED "$delay_single_quote_subst"`' +predeps_CXX='`$ECHO "$predeps_CXX" | $SED "$delay_single_quote_subst"`' +postdeps_CXX='`$ECHO "$postdeps_CXX" | $SED "$delay_single_quote_subst"`' +compiler_lib_search_path_CXX='`$ECHO "$compiler_lib_search_path_CXX" | $SED "$delay_single_quote_subst"`' + +LTCC='$LTCC' +LTCFLAGS='$LTCFLAGS' +compiler='$compiler_DEFAULT' + +# A function that is used when there is no print builtin or printf. +func_fallback_echo () +{ + eval 'cat <<_LTECHO_EOF +\$1 +_LTECHO_EOF' +} + +# Quote evaled strings. +for var in SHELL \ +ECHO \ +PATH_SEPARATOR \ +SED \ +GREP \ +EGREP \ +FGREP \ +LD \ +NM \ +LN_S \ +lt_SP2NL \ +lt_NL2SP \ +reload_flag \ +OBJDUMP \ +deplibs_check_method \ +file_magic_cmd \ +file_magic_glob \ +want_nocaseglob \ +DLLTOOL \ +sharedlib_from_linklib_cmd \ +AR \ +AR_FLAGS \ +archiver_list_spec \ +STRIP \ +RANLIB \ +CC \ +CFLAGS \ +compiler \ +lt_cv_sys_global_symbol_pipe \ +lt_cv_sys_global_symbol_to_cdecl \ +lt_cv_sys_global_symbol_to_c_name_address \ +lt_cv_sys_global_symbol_to_c_name_address_lib_prefix \ +nm_file_list_spec \ +lt_prog_compiler_no_builtin_flag \ +lt_prog_compiler_pic \ +lt_prog_compiler_wl \ +lt_prog_compiler_static \ +lt_cv_prog_compiler_c_o \ +need_locks \ +MANIFEST_TOOL \ +DSYMUTIL \ +NMEDIT \ +LIPO \ +OTOOL \ +OTOOL64 \ +shrext_cmds \ +export_dynamic_flag_spec \ +whole_archive_flag_spec \ +compiler_needs_object \ +with_gnu_ld \ +allow_undefined_flag \ +no_undefined_flag \ +hardcode_libdir_flag_spec \ +hardcode_libdir_separator \ +exclude_expsyms \ +include_expsyms \ +file_list_spec \ +variables_saved_for_relink \ +libname_spec \ +library_names_spec \ +soname_spec \ +install_override_mode \ +finish_eval \ +old_striplib \ +striplib \ +compiler_lib_search_dirs \ +predep_objects \ +postdep_objects \ +predeps \ +postdeps \ +compiler_lib_search_path \ +LD_CXX \ +reload_flag_CXX \ +compiler_CXX \ +lt_prog_compiler_no_builtin_flag_CXX \ +lt_prog_compiler_pic_CXX \ +lt_prog_compiler_wl_CXX \ +lt_prog_compiler_static_CXX \ +lt_cv_prog_compiler_c_o_CXX \ +export_dynamic_flag_spec_CXX \ +whole_archive_flag_spec_CXX \ +compiler_needs_object_CXX \ +with_gnu_ld_CXX \ +allow_undefined_flag_CXX \ +no_undefined_flag_CXX \ +hardcode_libdir_flag_spec_CXX \ +hardcode_libdir_separator_CXX \ +exclude_expsyms_CXX \ +include_expsyms_CXX \ +file_list_spec_CXX \ +compiler_lib_search_dirs_CXX \ +predep_objects_CXX \ +postdep_objects_CXX \ +predeps_CXX \ +postdeps_CXX \ +compiler_lib_search_path_CXX; do + case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in + *[\\\\\\\`\\"\\\$]*) + eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED \\"\\\$sed_quote_subst\\"\\\`\\\\\\"" + ;; + *) + eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\"" + ;; + esac +done + +# Double-quote double-evaled strings. +for var in reload_cmds \ +old_postinstall_cmds \ +old_postuninstall_cmds \ +old_archive_cmds \ +extract_expsyms_cmds \ +old_archive_from_new_cmds \ +old_archive_from_expsyms_cmds \ +archive_cmds \ +archive_expsym_cmds \ +module_cmds \ +module_expsym_cmds \ +export_symbols_cmds \ +prelink_cmds \ +postlink_cmds \ +postinstall_cmds \ +postuninstall_cmds \ +finish_cmds \ +sys_lib_search_path_spec \ +sys_lib_dlsearch_path_spec \ +reload_cmds_CXX \ +old_archive_cmds_CXX \ +old_archive_from_new_cmds_CXX \ +old_archive_from_expsyms_cmds_CXX \ +archive_cmds_CXX \ +archive_expsym_cmds_CXX \ +module_cmds_CXX \ +module_expsym_cmds_CXX \ +export_symbols_cmds_CXX \ +prelink_cmds_CXX \ +postlink_cmds_CXX; do + case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in + *[\\\\\\\`\\"\\\$]*) + eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED -e \\"\\\$double_quote_subst\\" -e \\"\\\$sed_quote_subst\\" -e \\"\\\$delay_variable_subst\\"\\\`\\\\\\"" + ;; + *) + eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\"" + ;; + esac +done + +ac_aux_dir='$ac_aux_dir' +xsi_shell='$xsi_shell' +lt_shell_append='$lt_shell_append' + +# See if we are running on zsh, and set the options which allow our +# commands through without removal of \ escapes INIT. +if test -n "\${ZSH_VERSION+set}" ; then + setopt NO_GLOB_SUBST +fi + + + PACKAGE='$PACKAGE' + VERSION='$VERSION' + TIMESTAMP='$TIMESTAMP' + RM='$RM' + ofile='$ofile' + + + + + + +_ACEOF + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 + +# Handling of arguments. +for ac_config_target in $ac_config_targets +do + case $ac_config_target in + "config.h") CONFIG_HEADERS="$CONFIG_HEADERS config.h" ;; + "depfiles") CONFIG_COMMANDS="$CONFIG_COMMANDS depfiles" ;; + "libtool") CONFIG_COMMANDS="$CONFIG_COMMANDS libtool" ;; + "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;; + + *) as_fn_error $? "invalid argument: \`$ac_config_target'" "$LINENO" 5;; + esac +done + + +# If the user did not use the arguments to specify the items to instantiate, +# then the envvar interface is used. Set only those that are not. +# We use the long form for the default assignment because of an extremely +# bizarre bug on SunOS 4.1.3. +if $ac_need_defaults; then + test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files + test "${CONFIG_HEADERS+set}" = set || CONFIG_HEADERS=$config_headers + test "${CONFIG_COMMANDS+set}" = set || CONFIG_COMMANDS=$config_commands +fi + +# Have a temporary directory for convenience. Make it in the build tree +# simply because there is no reason against having it here, and in addition, +# creating and moving files from /tmp can sometimes cause problems. +# Hook for its removal unless debugging. +# Note that there is a small window in which the directory will not be cleaned: +# after its creation but before its name has been assigned to `$tmp'. +$debug || +{ + tmp= ac_tmp= + trap 'exit_status=$? + : "${ac_tmp:=$tmp}" + { test ! -d "$ac_tmp" || rm -fr "$ac_tmp"; } && exit $exit_status +' 0 + trap 'as_fn_exit 1' 1 2 13 15 +} +# Create a (secure) tmp directory for tmp files. + +{ + tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` && + test -d "$tmp" +} || +{ + tmp=./conf$$-$RANDOM + (umask 077 && mkdir "$tmp") +} || as_fn_error $? "cannot create a temporary directory in ." "$LINENO" 5 +ac_tmp=$tmp + +# Set up the scripts for CONFIG_FILES section. +# No need to generate them if there are no CONFIG_FILES. +# This happens for instance with `./config.status config.h'. +if test -n "$CONFIG_FILES"; then + + +ac_cr=`echo X | tr X '\015'` +# On cygwin, bash can eat \r inside `` if the user requested igncr. +# But we know of no other shell where ac_cr would be empty at this +# point, so we can use a bashism as a fallback. +if test "x$ac_cr" = x; then + eval ac_cr=\$\'\\r\' +fi +ac_cs_awk_cr=`$AWK 'BEGIN { print "a\rb" }' /dev/null` +if test "$ac_cs_awk_cr" = "a${ac_cr}b"; then + ac_cs_awk_cr='\\r' +else + ac_cs_awk_cr=$ac_cr +fi + +echo 'BEGIN {' >"$ac_tmp/subs1.awk" && +_ACEOF + + +{ + echo "cat >conf$$subs.awk <<_ACEOF" && + echo "$ac_subst_vars" | sed 's/.*/&!$&$ac_delim/' && + echo "_ACEOF" +} >conf$$subs.sh || + as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 +ac_delim_num=`echo "$ac_subst_vars" | grep -c '^'` +ac_delim='%!_!# ' +for ac_last_try in false false false false false :; do + . ./conf$$subs.sh || + as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 + + ac_delim_n=`sed -n "s/.*$ac_delim\$/X/p" conf$$subs.awk | grep -c X` + if test $ac_delim_n = $ac_delim_num; then + break + elif $ac_last_try; then + as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 + else + ac_delim="$ac_delim!$ac_delim _$ac_delim!! " + fi +done +rm -f conf$$subs.sh + +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +cat >>"\$ac_tmp/subs1.awk" <<\\_ACAWK && +_ACEOF +sed -n ' +h +s/^/S["/; s/!.*/"]=/ +p +g +s/^[^!]*!// +:repl +t repl +s/'"$ac_delim"'$// +t delim +:nl +h +s/\(.\{148\}\)..*/\1/ +t more1 +s/["\\]/\\&/g; s/^/"/; s/$/\\n"\\/ +p +n +b repl +:more1 +s/["\\]/\\&/g; s/^/"/; s/$/"\\/ +p +g +s/.\{148\}// +t nl +:delim +h +s/\(.\{148\}\)..*/\1/ +t more2 +s/["\\]/\\&/g; s/^/"/; s/$/"/ +p +b +:more2 +s/["\\]/\\&/g; s/^/"/; s/$/"\\/ +p +g +s/.\{148\}// +t delim +' >$CONFIG_STATUS || ac_write_fail=1 +rm -f conf$$subs.awk +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +_ACAWK +cat >>"\$ac_tmp/subs1.awk" <<_ACAWK && + for (key in S) S_is_set[key] = 1 + FS = "" + +} +{ + line = $ 0 + nfields = split(line, field, "@") + substed = 0 + len = length(field[1]) + for (i = 2; i < nfields; i++) { + key = field[i] + keylen = length(key) + if (S_is_set[key]) { + value = S[key] + line = substr(line, 1, len) "" value "" substr(line, len + keylen + 3) + len += length(value) + length(field[++i]) + substed = 1 + } else + len += 1 + keylen + } + + print line +} + +_ACAWK +_ACEOF +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +if sed "s/$ac_cr//" < /dev/null > /dev/null 2>&1; then + sed "s/$ac_cr\$//; s/$ac_cr/$ac_cs_awk_cr/g" +else + cat +fi < "$ac_tmp/subs1.awk" > "$ac_tmp/subs.awk" \ + || as_fn_error $? "could not setup config files machinery" "$LINENO" 5 +_ACEOF + +# VPATH may cause trouble with some makes, so we remove sole $(srcdir), +# ${srcdir} and @srcdir@ entries from VPATH if srcdir is ".", strip leading and +# trailing colons and then remove the whole line if VPATH becomes empty +# (actually we leave an empty line to preserve line numbers). +if test "x$srcdir" = x.; then + ac_vpsub='/^[ ]*VPATH[ ]*=[ ]*/{ +h +s/// +s/^/:/ +s/[ ]*$/:/ +s/:\$(srcdir):/:/g +s/:\${srcdir}:/:/g +s/:@srcdir@:/:/g +s/^:*// +s/:*$// +x +s/\(=[ ]*\).*/\1/ +G +s/\n// +s/^[^=]*=[ ]*$// +}' +fi + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +fi # test -n "$CONFIG_FILES" + +# Set up the scripts for CONFIG_HEADERS section. +# No need to generate them if there are no CONFIG_HEADERS. +# This happens for instance with `./config.status Makefile'. +if test -n "$CONFIG_HEADERS"; then +cat >"$ac_tmp/defines.awk" <<\_ACAWK || +BEGIN { +_ACEOF + +# Transform confdefs.h into an awk script `defines.awk', embedded as +# here-document in config.status, that substitutes the proper values into +# config.h.in to produce config.h. + +# Create a delimiter string that does not exist in confdefs.h, to ease +# handling of long lines. +ac_delim='%!_!# ' +for ac_last_try in false false :; do + ac_tt=`sed -n "/$ac_delim/p" confdefs.h` + if test -z "$ac_tt"; then + break + elif $ac_last_try; then + as_fn_error $? "could not make $CONFIG_HEADERS" "$LINENO" 5 + else + ac_delim="$ac_delim!$ac_delim _$ac_delim!! " + fi +done + +# For the awk script, D is an array of macro values keyed by name, +# likewise P contains macro parameters if any. Preserve backslash +# newline sequences. + +ac_word_re=[_$as_cr_Letters][_$as_cr_alnum]* +sed -n ' +s/.\{148\}/&'"$ac_delim"'/g +t rset +:rset +s/^[ ]*#[ ]*define[ ][ ]*/ / +t def +d +:def +s/\\$// +t bsnl +s/["\\]/\\&/g +s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\ +D["\1"]=" \3"/p +s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2"/p +d +:bsnl +s/["\\]/\\&/g +s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\ +D["\1"]=" \3\\\\\\n"\\/p +t cont +s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2\\\\\\n"\\/p +t cont +d +:cont +n +s/.\{148\}/&'"$ac_delim"'/g +t clear +:clear +s/\\$// +t bsnlc +s/["\\]/\\&/g; s/^/"/; s/$/"/p +d +:bsnlc +s/["\\]/\\&/g; s/^/"/; s/$/\\\\\\n"\\/p +b cont +' >$CONFIG_STATUS || ac_write_fail=1 + +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 + for (key in D) D_is_set[key] = 1 + FS = "" +} +/^[\t ]*#[\t ]*(define|undef)[\t ]+$ac_word_re([\t (]|\$)/ { + line = \$ 0 + split(line, arg, " ") + if (arg[1] == "#") { + defundef = arg[2] + mac1 = arg[3] + } else { + defundef = substr(arg[1], 2) + mac1 = arg[2] + } + split(mac1, mac2, "(") #) + macro = mac2[1] + prefix = substr(line, 1, index(line, defundef) - 1) + if (D_is_set[macro]) { + # Preserve the white space surrounding the "#". + print prefix "define", macro P[macro] D[macro] + next + } else { + # Replace #undef with comments. This is necessary, for example, + # in the case of _POSIX_SOURCE, which is predefined and required + # on some systems where configure will not decide to define it. + if (defundef == "undef") { + print "/*", prefix defundef, macro, "*/" + next + } + } +} +{ print } +_ACAWK +_ACEOF +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 + as_fn_error $? "could not setup config headers machinery" "$LINENO" 5 +fi # test -n "$CONFIG_HEADERS" + + +eval set X " :F $CONFIG_FILES :H $CONFIG_HEADERS :C $CONFIG_COMMANDS" +shift +for ac_tag +do + case $ac_tag in + :[FHLC]) ac_mode=$ac_tag; continue;; + esac + case $ac_mode$ac_tag in + :[FHL]*:*);; + :L* | :C*:*) as_fn_error $? "invalid tag \`$ac_tag'" "$LINENO" 5;; + :[FH]-) ac_tag=-:-;; + :[FH]*) ac_tag=$ac_tag:$ac_tag.in;; + esac + ac_save_IFS=$IFS + IFS=: + set x $ac_tag + IFS=$ac_save_IFS + shift + ac_file=$1 + shift + + case $ac_mode in + :L) ac_source=$1;; + :[FH]) + ac_file_inputs= + for ac_f + do + case $ac_f in + -) ac_f="$ac_tmp/stdin";; + *) # Look for the file first in the build tree, then in the source tree + # (if the path is not absolute). The absolute path cannot be DOS-style, + # because $ac_f cannot contain `:'. + test -f "$ac_f" || + case $ac_f in + [\\/$]*) false;; + *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";; + esac || + as_fn_error 1 "cannot find input file: \`$ac_f'" "$LINENO" 5;; + esac + case $ac_f in *\'*) ac_f=`$as_echo "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac + as_fn_append ac_file_inputs " '$ac_f'" + done + + # Let's still pretend it is `configure' which instantiates (i.e., don't + # use $as_me), people would be surprised to read: + # /* config.h. Generated by config.status. */ + configure_input='Generated from '` + $as_echo "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g' + `' by configure.' + if test x"$ac_file" != x-; then + configure_input="$ac_file. $configure_input" + { $as_echo "$as_me:${as_lineno-$LINENO}: creating $ac_file" >&5 +$as_echo "$as_me: creating $ac_file" >&6;} + fi + # Neutralize special characters interpreted by sed in replacement strings. + case $configure_input in #( + *\&* | *\|* | *\\* ) + ac_sed_conf_input=`$as_echo "$configure_input" | + sed 's/[\\\\&|]/\\\\&/g'`;; #( + *) ac_sed_conf_input=$configure_input;; + esac + + case $ac_tag in + *:-:* | *:-) cat >"$ac_tmp/stdin" \ + || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; + esac + ;; + esac + + ac_dir=`$as_dirname -- "$ac_file" || +$as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$ac_file" : 'X\(//\)[^/]' \| \ + X"$ac_file" : 'X\(//\)$' \| \ + X"$ac_file" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$ac_file" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + as_dir="$ac_dir"; as_fn_mkdir_p + ac_builddir=. + +case "$ac_dir" in +.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; +*) + ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` + # A ".." for each directory in $ac_dir_suffix. + ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` + case $ac_top_builddir_sub in + "") ac_top_builddir_sub=. ac_top_build_prefix= ;; + *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; + esac ;; +esac +ac_abs_top_builddir=$ac_pwd +ac_abs_builddir=$ac_pwd$ac_dir_suffix +# for backward compatibility: +ac_top_builddir=$ac_top_build_prefix + +case $srcdir in + .) # We are building in place. + ac_srcdir=. + ac_top_srcdir=$ac_top_builddir_sub + ac_abs_top_srcdir=$ac_pwd ;; + [\\/]* | ?:[\\/]* ) # Absolute name. + ac_srcdir=$srcdir$ac_dir_suffix; + ac_top_srcdir=$srcdir + ac_abs_top_srcdir=$srcdir ;; + *) # Relative name. + ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix + ac_top_srcdir=$ac_top_build_prefix$srcdir + ac_abs_top_srcdir=$ac_pwd/$srcdir ;; +esac +ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix + + + case $ac_mode in + :F) + # + # CONFIG_FILE + # + + case $INSTALL in + [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;; + *) ac_INSTALL=$ac_top_build_prefix$INSTALL ;; + esac + ac_MKDIR_P=$MKDIR_P + case $MKDIR_P in + [\\/$]* | ?:[\\/]* ) ;; + */*) ac_MKDIR_P=$ac_top_build_prefix$MKDIR_P ;; + esac +_ACEOF + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +# If the template does not know about datarootdir, expand it. +# FIXME: This hack should be removed a few years after 2.60. +ac_datarootdir_hack=; ac_datarootdir_seen= +ac_sed_dataroot=' +/datarootdir/ { + p + q +} +/@datadir@/p +/@docdir@/p +/@infodir@/p +/@localedir@/p +/@mandir@/p' +case `eval "sed -n \"\$ac_sed_dataroot\" $ac_file_inputs"` in +*datarootdir*) ac_datarootdir_seen=yes;; +*@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*) + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5 +$as_echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;} +_ACEOF +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 + ac_datarootdir_hack=' + s&@datadir@&$datadir&g + s&@docdir@&$docdir&g + s&@infodir@&$infodir&g + s&@localedir@&$localedir&g + s&@mandir@&$mandir&g + s&\\\${datarootdir}&$datarootdir&g' ;; +esac +_ACEOF + +# Neutralize VPATH when `$srcdir' = `.'. +# Shell code in configure.ac might set extrasub. +# FIXME: do we really want to maintain this feature? +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +ac_sed_extra="$ac_vpsub +$extrasub +_ACEOF +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +:t +/@[a-zA-Z_][a-zA-Z_0-9]*@/!b +s|@configure_input@|$ac_sed_conf_input|;t t +s&@top_builddir@&$ac_top_builddir_sub&;t t +s&@top_build_prefix@&$ac_top_build_prefix&;t t +s&@srcdir@&$ac_srcdir&;t t +s&@abs_srcdir@&$ac_abs_srcdir&;t t +s&@top_srcdir@&$ac_top_srcdir&;t t +s&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t +s&@builddir@&$ac_builddir&;t t +s&@abs_builddir@&$ac_abs_builddir&;t t +s&@abs_top_builddir@&$ac_abs_top_builddir&;t t +s&@INSTALL@&$ac_INSTALL&;t t +s&@MKDIR_P@&$ac_MKDIR_P&;t t +$ac_datarootdir_hack +" +eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$ac_tmp/subs.awk" \ + >$ac_tmp/out || as_fn_error $? "could not create $ac_file" "$LINENO" 5 + +test -z "$ac_datarootdir_hack$ac_datarootdir_seen" && + { ac_out=`sed -n '/\${datarootdir}/p' "$ac_tmp/out"`; test -n "$ac_out"; } && + { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' \ + "$ac_tmp/out"`; test -z "$ac_out"; } && + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \`datarootdir' +which seems to be undefined. Please make sure it is defined" >&5 +$as_echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir' +which seems to be undefined. Please make sure it is defined" >&2;} + + rm -f "$ac_tmp/stdin" + case $ac_file in + -) cat "$ac_tmp/out" && rm -f "$ac_tmp/out";; + *) rm -f "$ac_file" && mv "$ac_tmp/out" "$ac_file";; + esac \ + || as_fn_error $? "could not create $ac_file" "$LINENO" 5 + ;; + :H) + # + # CONFIG_HEADER + # + if test x"$ac_file" != x-; then + { + $as_echo "/* $configure_input */" \ + && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" + } >"$ac_tmp/config.h" \ + || as_fn_error $? "could not create $ac_file" "$LINENO" 5 + if diff "$ac_file" "$ac_tmp/config.h" >/dev/null 2>&1; then + { $as_echo "$as_me:${as_lineno-$LINENO}: $ac_file is unchanged" >&5 +$as_echo "$as_me: $ac_file is unchanged" >&6;} + else + rm -f "$ac_file" + mv "$ac_tmp/config.h" "$ac_file" \ + || as_fn_error $? "could not create $ac_file" "$LINENO" 5 + fi + else + $as_echo "/* $configure_input */" \ + && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" \ + || as_fn_error $? "could not create -" "$LINENO" 5 + fi +# Compute "$ac_file"'s index in $config_headers. +_am_arg="$ac_file" +_am_stamp_count=1 +for _am_header in $config_headers :; do + case $_am_header in + $_am_arg | $_am_arg:* ) + break ;; + * ) + _am_stamp_count=`expr $_am_stamp_count + 1` ;; + esac +done +echo "timestamp for $_am_arg" >`$as_dirname -- "$_am_arg" || +$as_expr X"$_am_arg" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$_am_arg" : 'X\(//\)[^/]' \| \ + X"$_am_arg" : 'X\(//\)$' \| \ + X"$_am_arg" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$_am_arg" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'`/stamp-h$_am_stamp_count + ;; + + :C) { $as_echo "$as_me:${as_lineno-$LINENO}: executing $ac_file commands" >&5 +$as_echo "$as_me: executing $ac_file commands" >&6;} + ;; + esac + + + case $ac_file$ac_mode in + "depfiles":C) test x"$AMDEP_TRUE" != x"" || { + # Autoconf 2.62 quotes --file arguments for eval, but not when files + # are listed without --file. Let's play safe and only enable the eval + # if we detect the quoting. + case $CONFIG_FILES in + *\'*) eval set x "$CONFIG_FILES" ;; + *) set x $CONFIG_FILES ;; + esac + shift + for mf + do + # Strip MF so we end up with the name of the file. + mf=`echo "$mf" | sed -e 's/:.*$//'` + # Check whether this is an Automake generated Makefile or not. + # We used to match only the files named `Makefile.in', but + # some people rename them; so instead we look at the file content. + # Grep'ing the first line is not enough: some people post-process + # each Makefile.in and add a new line on top of each file to say so. + # Grep'ing the whole file is not good either: AIX grep has a line + # limit of 2048, but all sed's we know have understand at least 4000. + if sed -n 's,^#.*generated by automake.*,X,p' "$mf" | grep X >/dev/null 2>&1; then + dirpart=`$as_dirname -- "$mf" || +$as_expr X"$mf" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$mf" : 'X\(//\)[^/]' \| \ + X"$mf" : 'X\(//\)$' \| \ + X"$mf" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$mf" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + else + continue + fi + # Extract the definition of DEPDIR, am__include, and am__quote + # from the Makefile without running `make'. + DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"` + test -z "$DEPDIR" && continue + am__include=`sed -n 's/^am__include = //p' < "$mf"` + test -z "am__include" && continue + am__quote=`sed -n 's/^am__quote = //p' < "$mf"` + # When using ansi2knr, U may be empty or an underscore; expand it + U=`sed -n 's/^U = //p' < "$mf"` + # Find all dependency output files, they are included files with + # $(DEPDIR) in their names. We invoke sed twice because it is the + # simplest approach to changing $(DEPDIR) to its actual value in the + # expansion. + for file in `sed -n " + s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \ + sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g' -e 's/\$U/'"$U"'/g'`; do + # Make sure the directory exists. + test -f "$dirpart/$file" && continue + fdir=`$as_dirname -- "$file" || +$as_expr X"$file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$file" : 'X\(//\)[^/]' \| \ + X"$file" : 'X\(//\)$' \| \ + X"$file" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$file" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + as_dir=$dirpart/$fdir; as_fn_mkdir_p + # echo "creating $dirpart/$file" + echo '# dummy' > "$dirpart/$file" + done + done +} + ;; + "libtool":C) + + # See if we are running on zsh, and set the options which allow our + # commands through without removal of \ escapes. + if test -n "${ZSH_VERSION+set}" ; then + setopt NO_GLOB_SUBST + fi + + cfgfile="${ofile}T" + trap "$RM \"$cfgfile\"; exit 1" 1 2 15 + $RM "$cfgfile" + + cat <<_LT_EOF >> "$cfgfile" +#! $SHELL + +# `$ECHO "$ofile" | sed 's%^.*/%%'` - Provide generalized library-building support services. +# Generated automatically by $as_me ($PACKAGE$TIMESTAMP) $VERSION +# Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`: +# NOTE: Changes made to this file will be lost: look at ltmain.sh. +# +# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005, +# 2006, 2007, 2008, 2009, 2010, 2011 Free Software +# Foundation, Inc. +# Written by Gordon Matzigkeit, 1996 +# +# This file is part of GNU Libtool. +# +# GNU Libtool is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License as +# published by the Free Software Foundation; either version 2 of +# the License, or (at your option) any later version. +# +# As a special exception to the GNU General Public License, +# if you distribute this file as part of a program or library that +# is built using GNU Libtool, you may include this file under the +# same distribution terms that you use for the rest of that program. +# +# GNU Libtool is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with GNU Libtool; see the file COPYING. If not, a copy +# can be downloaded from http://www.gnu.org/licenses/gpl.html, or +# obtained by writing to the Free Software Foundation, Inc., +# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + + +# The names of the tagged configurations supported by this script. +available_tags="CXX " + +# ### BEGIN LIBTOOL CONFIG + +# Which release of libtool.m4 was used? +macro_version=$macro_version +macro_revision=$macro_revision + +# Whether or not to build shared libraries. +build_libtool_libs=$enable_shared + +# Whether or not to build static libraries. +build_old_libs=$enable_static + +# What type of objects to build. +pic_mode=$pic_mode + +# Whether or not to optimize for fast installation. +fast_install=$enable_fast_install + +# Shell to use when invoking shell scripts. +SHELL=$lt_SHELL + +# An echo program that protects backslashes. +ECHO=$lt_ECHO + +# The PATH separator for the build system. +PATH_SEPARATOR=$lt_PATH_SEPARATOR + +# The host system. +host_alias=$host_alias +host=$host +host_os=$host_os + +# The build system. +build_alias=$build_alias +build=$build +build_os=$build_os + +# A sed program that does not truncate output. +SED=$lt_SED + +# Sed that helps us avoid accidentally triggering echo(1) options like -n. +Xsed="\$SED -e 1s/^X//" + +# A grep program that handles long lines. +GREP=$lt_GREP + +# An ERE matcher. +EGREP=$lt_EGREP + +# A literal string matcher. +FGREP=$lt_FGREP + +# A BSD- or MS-compatible name lister. +NM=$lt_NM + +# Whether we need soft or hard links. +LN_S=$lt_LN_S + +# What is the maximum length of a command? +max_cmd_len=$max_cmd_len + +# Object file suffix (normally "o"). +objext=$ac_objext + +# Executable file suffix (normally ""). +exeext=$exeext + +# whether the shell understands "unset". +lt_unset=$lt_unset + +# turn spaces into newlines. +SP2NL=$lt_lt_SP2NL + +# turn newlines into spaces. +NL2SP=$lt_lt_NL2SP + +# convert \$build file names to \$host format. +to_host_file_cmd=$lt_cv_to_host_file_cmd + +# convert \$build files to toolchain format. +to_tool_file_cmd=$lt_cv_to_tool_file_cmd + +# An object symbol dumper. +OBJDUMP=$lt_OBJDUMP + +# Method to check whether dependent libraries are shared objects. +deplibs_check_method=$lt_deplibs_check_method + +# Command to use when deplibs_check_method = "file_magic". +file_magic_cmd=$lt_file_magic_cmd + +# How to find potential files when deplibs_check_method = "file_magic". +file_magic_glob=$lt_file_magic_glob + +# Find potential files using nocaseglob when deplibs_check_method = "file_magic". +want_nocaseglob=$lt_want_nocaseglob + +# DLL creation program. +DLLTOOL=$lt_DLLTOOL + +# Command to associate shared and link libraries. +sharedlib_from_linklib_cmd=$lt_sharedlib_from_linklib_cmd + +# The archiver. +AR=$lt_AR + +# Flags to create an archive. +AR_FLAGS=$lt_AR_FLAGS + +# How to feed a file listing to the archiver. +archiver_list_spec=$lt_archiver_list_spec + +# A symbol stripping program. +STRIP=$lt_STRIP + +# Commands used to install an old-style archive. +RANLIB=$lt_RANLIB +old_postinstall_cmds=$lt_old_postinstall_cmds +old_postuninstall_cmds=$lt_old_postuninstall_cmds + +# Whether to use a lock for old archive extraction. +lock_old_archive_extraction=$lock_old_archive_extraction + +# A C compiler. +LTCC=$lt_CC + +# LTCC compiler flags. +LTCFLAGS=$lt_CFLAGS + +# Take the output of nm and produce a listing of raw symbols and C names. +global_symbol_pipe=$lt_lt_cv_sys_global_symbol_pipe + +# Transform the output of nm in a proper C declaration. +global_symbol_to_cdecl=$lt_lt_cv_sys_global_symbol_to_cdecl + +# Transform the output of nm in a C name address pair. +global_symbol_to_c_name_address=$lt_lt_cv_sys_global_symbol_to_c_name_address + +# Transform the output of nm in a C name address pair when lib prefix is needed. +global_symbol_to_c_name_address_lib_prefix=$lt_lt_cv_sys_global_symbol_to_c_name_address_lib_prefix + +# Specify filename containing input files for \$NM. +nm_file_list_spec=$lt_nm_file_list_spec + +# The root where to search for dependent libraries,and in which our libraries should be installed. +lt_sysroot=$lt_sysroot + +# The name of the directory that contains temporary libtool files. +objdir=$objdir + +# Used to examine libraries when file_magic_cmd begins with "file". +MAGIC_CMD=$MAGIC_CMD + +# Must we lock files when doing compilation? +need_locks=$lt_need_locks + +# Manifest tool. +MANIFEST_TOOL=$lt_MANIFEST_TOOL + +# Tool to manipulate archived DWARF debug symbol files on Mac OS X. +DSYMUTIL=$lt_DSYMUTIL + +# Tool to change global to local symbols on Mac OS X. +NMEDIT=$lt_NMEDIT + +# Tool to manipulate fat objects and archives on Mac OS X. +LIPO=$lt_LIPO + +# ldd/readelf like tool for Mach-O binaries on Mac OS X. +OTOOL=$lt_OTOOL + +# ldd/readelf like tool for 64 bit Mach-O binaries on Mac OS X 10.4. +OTOOL64=$lt_OTOOL64 + +# Old archive suffix (normally "a"). +libext=$libext + +# Shared library suffix (normally ".so"). +shrext_cmds=$lt_shrext_cmds + +# The commands to extract the exported symbol list from a shared archive. +extract_expsyms_cmds=$lt_extract_expsyms_cmds + +# Variables whose values should be saved in libtool wrapper scripts and +# restored at link time. +variables_saved_for_relink=$lt_variables_saved_for_relink + +# Do we need the "lib" prefix for modules? +need_lib_prefix=$need_lib_prefix + +# Do we need a version for libraries? +need_version=$need_version + +# Library versioning type. +version_type=$version_type + +# Shared library runtime path variable. +runpath_var=$runpath_var + +# Shared library path variable. +shlibpath_var=$shlibpath_var + +# Is shlibpath searched before the hard-coded library search path? +shlibpath_overrides_runpath=$shlibpath_overrides_runpath + +# Format of library name prefix. +libname_spec=$lt_libname_spec + +# List of archive names. First name is the real one, the rest are links. +# The last name is the one that the linker finds with -lNAME +library_names_spec=$lt_library_names_spec + +# The coded name of the library, if different from the real name. +soname_spec=$lt_soname_spec + +# Permission mode override for installation of shared libraries. +install_override_mode=$lt_install_override_mode + +# Command to use after installation of a shared archive. +postinstall_cmds=$lt_postinstall_cmds + +# Command to use after uninstallation of a shared archive. +postuninstall_cmds=$lt_postuninstall_cmds + +# Commands used to finish a libtool library installation in a directory. +finish_cmds=$lt_finish_cmds + +# As "finish_cmds", except a single script fragment to be evaled but +# not shown. +finish_eval=$lt_finish_eval + +# Whether we should hardcode library paths into libraries. +hardcode_into_libs=$hardcode_into_libs + +# Compile-time system search path for libraries. +sys_lib_search_path_spec=$lt_sys_lib_search_path_spec + +# Run-time system search path for libraries. +sys_lib_dlsearch_path_spec=$lt_sys_lib_dlsearch_path_spec + +# Whether dlopen is supported. +dlopen_support=$enable_dlopen + +# Whether dlopen of programs is supported. +dlopen_self=$enable_dlopen_self + +# Whether dlopen of statically linked programs is supported. +dlopen_self_static=$enable_dlopen_self_static + +# Commands to strip libraries. +old_striplib=$lt_old_striplib +striplib=$lt_striplib + + +# The linker used to build libraries. +LD=$lt_LD + +# How to create reloadable object files. +reload_flag=$lt_reload_flag +reload_cmds=$lt_reload_cmds + +# Commands used to build an old-style archive. +old_archive_cmds=$lt_old_archive_cmds + +# A language specific compiler. +CC=$lt_compiler + +# Is the compiler the GNU compiler? +with_gcc=$GCC + +# Compiler flag to turn off builtin functions. +no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag + +# Additional compiler flags for building library objects. +pic_flag=$lt_lt_prog_compiler_pic + +# How to pass a linker flag through the compiler. +wl=$lt_lt_prog_compiler_wl + +# Compiler flag to prevent dynamic linking. +link_static_flag=$lt_lt_prog_compiler_static + +# Does compiler simultaneously support -c and -o options? +compiler_c_o=$lt_lt_cv_prog_compiler_c_o + +# Whether or not to add -lc for building shared libraries. +build_libtool_need_lc=$archive_cmds_need_lc + +# Whether or not to disallow shared libs when runtime libs are static. +allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes + +# Compiler flag to allow reflexive dlopens. +export_dynamic_flag_spec=$lt_export_dynamic_flag_spec + +# Compiler flag to generate shared objects directly from archives. +whole_archive_flag_spec=$lt_whole_archive_flag_spec + +# Whether the compiler copes with passing no objects directly. +compiler_needs_object=$lt_compiler_needs_object + +# Create an old-style archive from a shared archive. +old_archive_from_new_cmds=$lt_old_archive_from_new_cmds + +# Create a temporary old-style archive to link instead of a shared archive. +old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds + +# Commands used to build a shared archive. +archive_cmds=$lt_archive_cmds +archive_expsym_cmds=$lt_archive_expsym_cmds + +# Commands used to build a loadable module if different from building +# a shared archive. +module_cmds=$lt_module_cmds +module_expsym_cmds=$lt_module_expsym_cmds + +# Whether we are building with GNU ld or not. +with_gnu_ld=$lt_with_gnu_ld + +# Flag that allows shared libraries with undefined symbols to be built. +allow_undefined_flag=$lt_allow_undefined_flag + +# Flag that enforces no undefined symbols. +no_undefined_flag=$lt_no_undefined_flag + +# Flag to hardcode \$libdir into a binary during linking. +# This must work even if \$libdir does not exist +hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec + +# Whether we need a single "-rpath" flag with a separated argument. +hardcode_libdir_separator=$lt_hardcode_libdir_separator + +# Set to "yes" if using DIR/libNAME\${shared_ext} during linking hardcodes +# DIR into the resulting binary. +hardcode_direct=$hardcode_direct + +# Set to "yes" if using DIR/libNAME\${shared_ext} during linking hardcodes +# DIR into the resulting binary and the resulting library dependency is +# "absolute",i.e impossible to change by setting \${shlibpath_var} if the +# library is relocated. +hardcode_direct_absolute=$hardcode_direct_absolute + +# Set to "yes" if using the -LDIR flag during linking hardcodes DIR +# into the resulting binary. +hardcode_minus_L=$hardcode_minus_L + +# Set to "yes" if using SHLIBPATH_VAR=DIR during linking hardcodes DIR +# into the resulting binary. +hardcode_shlibpath_var=$hardcode_shlibpath_var + +# Set to "yes" if building a shared library automatically hardcodes DIR +# into the library and all subsequent libraries and executables linked +# against it. +hardcode_automatic=$hardcode_automatic + +# Set to yes if linker adds runtime paths of dependent libraries +# to runtime path list. +inherit_rpath=$inherit_rpath + +# Whether libtool must link a program against all its dependency libraries. +link_all_deplibs=$link_all_deplibs + +# Set to "yes" if exported symbols are required. +always_export_symbols=$always_export_symbols + +# The commands to list exported symbols. +export_symbols_cmds=$lt_export_symbols_cmds + +# Symbols that should not be listed in the preloaded symbols. +exclude_expsyms=$lt_exclude_expsyms + +# Symbols that must always be exported. +include_expsyms=$lt_include_expsyms + +# Commands necessary for linking programs (against libraries) with templates. +prelink_cmds=$lt_prelink_cmds + +# Commands necessary for finishing linking programs. +postlink_cmds=$lt_postlink_cmds + +# Specify filename containing input files. +file_list_spec=$lt_file_list_spec + +# How to hardcode a shared library path into an executable. +hardcode_action=$hardcode_action + +# The directories searched by this compiler when creating a shared library. +compiler_lib_search_dirs=$lt_compiler_lib_search_dirs + +# Dependencies to place before and after the objects being linked to +# create a shared library. +predep_objects=$lt_predep_objects +postdep_objects=$lt_postdep_objects +predeps=$lt_predeps +postdeps=$lt_postdeps + +# The library search path used internally by the compiler when linking +# a shared library. +compiler_lib_search_path=$lt_compiler_lib_search_path + +# ### END LIBTOOL CONFIG + +_LT_EOF + + case $host_os in + aix3*) + cat <<\_LT_EOF >> "$cfgfile" +# AIX sometimes has problems with the GCC collect2 program. For some +# reason, if we set the COLLECT_NAMES environment variable, the problems +# vanish in a puff of smoke. +if test "X${COLLECT_NAMES+set}" != Xset; then + COLLECT_NAMES= + export COLLECT_NAMES +fi +_LT_EOF + ;; + esac + + +ltmain="$ac_aux_dir/ltmain.sh" + + + # We use sed instead of cat because bash on DJGPP gets confused if + # if finds mixed CR/LF and LF-only lines. Since sed operates in + # text mode, it properly converts lines to CR/LF. This bash problem + # is reportedly fixed, but why not run on old versions too? + sed '$q' "$ltmain" >> "$cfgfile" \ + || (rm -f "$cfgfile"; exit 1) + + if test x"$xsi_shell" = xyes; then + sed -e '/^func_dirname ()$/,/^} # func_dirname /c\ +func_dirname ()\ +{\ +\ case ${1} in\ +\ */*) func_dirname_result="${1%/*}${2}" ;;\ +\ * ) func_dirname_result="${3}" ;;\ +\ esac\ +} # Extended-shell func_dirname implementation' "$cfgfile" > $cfgfile.tmp \ + && mv -f "$cfgfile.tmp" "$cfgfile" \ + || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") +test 0 -eq $? || _lt_function_replace_fail=: + + + sed -e '/^func_basename ()$/,/^} # func_basename /c\ +func_basename ()\ +{\ +\ func_basename_result="${1##*/}"\ +} # Extended-shell func_basename implementation' "$cfgfile" > $cfgfile.tmp \ + && mv -f "$cfgfile.tmp" "$cfgfile" \ + || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") +test 0 -eq $? || _lt_function_replace_fail=: + + + sed -e '/^func_dirname_and_basename ()$/,/^} # func_dirname_and_basename /c\ +func_dirname_and_basename ()\ +{\ +\ case ${1} in\ +\ */*) func_dirname_result="${1%/*}${2}" ;;\ +\ * ) func_dirname_result="${3}" ;;\ +\ esac\ +\ func_basename_result="${1##*/}"\ +} # Extended-shell func_dirname_and_basename implementation' "$cfgfile" > $cfgfile.tmp \ + && mv -f "$cfgfile.tmp" "$cfgfile" \ + || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") +test 0 -eq $? || _lt_function_replace_fail=: + + + sed -e '/^func_stripname ()$/,/^} # func_stripname /c\ +func_stripname ()\ +{\ +\ # pdksh 5.2.14 does not do ${X%$Y} correctly if both X and Y are\ +\ # positional parameters, so assign one to ordinary parameter first.\ +\ func_stripname_result=${3}\ +\ func_stripname_result=${func_stripname_result#"${1}"}\ +\ func_stripname_result=${func_stripname_result%"${2}"}\ +} # Extended-shell func_stripname implementation' "$cfgfile" > $cfgfile.tmp \ + && mv -f "$cfgfile.tmp" "$cfgfile" \ + || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") +test 0 -eq $? || _lt_function_replace_fail=: + + + sed -e '/^func_split_long_opt ()$/,/^} # func_split_long_opt /c\ +func_split_long_opt ()\ +{\ +\ func_split_long_opt_name=${1%%=*}\ +\ func_split_long_opt_arg=${1#*=}\ +} # Extended-shell func_split_long_opt implementation' "$cfgfile" > $cfgfile.tmp \ + && mv -f "$cfgfile.tmp" "$cfgfile" \ + || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") +test 0 -eq $? || _lt_function_replace_fail=: + + + sed -e '/^func_split_short_opt ()$/,/^} # func_split_short_opt /c\ +func_split_short_opt ()\ +{\ +\ func_split_short_opt_arg=${1#??}\ +\ func_split_short_opt_name=${1%"$func_split_short_opt_arg"}\ +} # Extended-shell func_split_short_opt implementation' "$cfgfile" > $cfgfile.tmp \ + && mv -f "$cfgfile.tmp" "$cfgfile" \ + || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") +test 0 -eq $? || _lt_function_replace_fail=: + + + sed -e '/^func_lo2o ()$/,/^} # func_lo2o /c\ +func_lo2o ()\ +{\ +\ case ${1} in\ +\ *.lo) func_lo2o_result=${1%.lo}.${objext} ;;\ +\ *) func_lo2o_result=${1} ;;\ +\ esac\ +} # Extended-shell func_lo2o implementation' "$cfgfile" > $cfgfile.tmp \ + && mv -f "$cfgfile.tmp" "$cfgfile" \ + || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") +test 0 -eq $? || _lt_function_replace_fail=: + + + sed -e '/^func_xform ()$/,/^} # func_xform /c\ +func_xform ()\ +{\ + func_xform_result=${1%.*}.lo\ +} # Extended-shell func_xform implementation' "$cfgfile" > $cfgfile.tmp \ + && mv -f "$cfgfile.tmp" "$cfgfile" \ + || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") +test 0 -eq $? || _lt_function_replace_fail=: + + + sed -e '/^func_arith ()$/,/^} # func_arith /c\ +func_arith ()\ +{\ + func_arith_result=$(( $* ))\ +} # Extended-shell func_arith implementation' "$cfgfile" > $cfgfile.tmp \ + && mv -f "$cfgfile.tmp" "$cfgfile" \ + || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") +test 0 -eq $? || _lt_function_replace_fail=: + + + sed -e '/^func_len ()$/,/^} # func_len /c\ +func_len ()\ +{\ + func_len_result=${#1}\ +} # Extended-shell func_len implementation' "$cfgfile" > $cfgfile.tmp \ + && mv -f "$cfgfile.tmp" "$cfgfile" \ + || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") +test 0 -eq $? || _lt_function_replace_fail=: + +fi + +if test x"$lt_shell_append" = xyes; then + sed -e '/^func_append ()$/,/^} # func_append /c\ +func_append ()\ +{\ + eval "${1}+=\\${2}"\ +} # Extended-shell func_append implementation' "$cfgfile" > $cfgfile.tmp \ + && mv -f "$cfgfile.tmp" "$cfgfile" \ + || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") +test 0 -eq $? || _lt_function_replace_fail=: + + + sed -e '/^func_append_quoted ()$/,/^} # func_append_quoted /c\ +func_append_quoted ()\ +{\ +\ func_quote_for_eval "${2}"\ +\ eval "${1}+=\\\\ \\$func_quote_for_eval_result"\ +} # Extended-shell func_append_quoted implementation' "$cfgfile" > $cfgfile.tmp \ + && mv -f "$cfgfile.tmp" "$cfgfile" \ + || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") +test 0 -eq $? || _lt_function_replace_fail=: + + + # Save a `func_append' function call where possible by direct use of '+=' + sed -e 's%func_append \([a-zA-Z_]\{1,\}\) "%\1+="%g' $cfgfile > $cfgfile.tmp \ + && mv -f "$cfgfile.tmp" "$cfgfile" \ + || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") + test 0 -eq $? || _lt_function_replace_fail=: +else + # Save a `func_append' function call even when '+=' is not available + sed -e 's%func_append \([a-zA-Z_]\{1,\}\) "%\1="$\1%g' $cfgfile > $cfgfile.tmp \ + && mv -f "$cfgfile.tmp" "$cfgfile" \ + || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") + test 0 -eq $? || _lt_function_replace_fail=: +fi + +if test x"$_lt_function_replace_fail" = x":"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Unable to substitute extended shell functions in $ofile" >&5 +$as_echo "$as_me: WARNING: Unable to substitute extended shell functions in $ofile" >&2;} +fi + + + mv -f "$cfgfile" "$ofile" || + (rm -f "$ofile" && cp "$cfgfile" "$ofile" && rm -f "$cfgfile") + chmod +x "$ofile" + + + cat <<_LT_EOF >> "$ofile" + +# ### BEGIN LIBTOOL TAG CONFIG: CXX + +# The linker used to build libraries. +LD=$lt_LD_CXX + +# How to create reloadable object files. +reload_flag=$lt_reload_flag_CXX +reload_cmds=$lt_reload_cmds_CXX + +# Commands used to build an old-style archive. +old_archive_cmds=$lt_old_archive_cmds_CXX + +# A language specific compiler. +CC=$lt_compiler_CXX + +# Is the compiler the GNU compiler? +with_gcc=$GCC_CXX + +# Compiler flag to turn off builtin functions. +no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag_CXX + +# Additional compiler flags for building library objects. +pic_flag=$lt_lt_prog_compiler_pic_CXX + +# How to pass a linker flag through the compiler. +wl=$lt_lt_prog_compiler_wl_CXX + +# Compiler flag to prevent dynamic linking. +link_static_flag=$lt_lt_prog_compiler_static_CXX + +# Does compiler simultaneously support -c and -o options? +compiler_c_o=$lt_lt_cv_prog_compiler_c_o_CXX + +# Whether or not to add -lc for building shared libraries. +build_libtool_need_lc=$archive_cmds_need_lc_CXX + +# Whether or not to disallow shared libs when runtime libs are static. +allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes_CXX + +# Compiler flag to allow reflexive dlopens. +export_dynamic_flag_spec=$lt_export_dynamic_flag_spec_CXX + +# Compiler flag to generate shared objects directly from archives. +whole_archive_flag_spec=$lt_whole_archive_flag_spec_CXX + +# Whether the compiler copes with passing no objects directly. +compiler_needs_object=$lt_compiler_needs_object_CXX + +# Create an old-style archive from a shared archive. +old_archive_from_new_cmds=$lt_old_archive_from_new_cmds_CXX + +# Create a temporary old-style archive to link instead of a shared archive. +old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds_CXX + +# Commands used to build a shared archive. +archive_cmds=$lt_archive_cmds_CXX +archive_expsym_cmds=$lt_archive_expsym_cmds_CXX + +# Commands used to build a loadable module if different from building +# a shared archive. +module_cmds=$lt_module_cmds_CXX +module_expsym_cmds=$lt_module_expsym_cmds_CXX + +# Whether we are building with GNU ld or not. +with_gnu_ld=$lt_with_gnu_ld_CXX + +# Flag that allows shared libraries with undefined symbols to be built. +allow_undefined_flag=$lt_allow_undefined_flag_CXX + +# Flag that enforces no undefined symbols. +no_undefined_flag=$lt_no_undefined_flag_CXX + +# Flag to hardcode \$libdir into a binary during linking. +# This must work even if \$libdir does not exist +hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec_CXX + +# Whether we need a single "-rpath" flag with a separated argument. +hardcode_libdir_separator=$lt_hardcode_libdir_separator_CXX + +# Set to "yes" if using DIR/libNAME\${shared_ext} during linking hardcodes +# DIR into the resulting binary. +hardcode_direct=$hardcode_direct_CXX + +# Set to "yes" if using DIR/libNAME\${shared_ext} during linking hardcodes +# DIR into the resulting binary and the resulting library dependency is +# "absolute",i.e impossible to change by setting \${shlibpath_var} if the +# library is relocated. +hardcode_direct_absolute=$hardcode_direct_absolute_CXX + +# Set to "yes" if using the -LDIR flag during linking hardcodes DIR +# into the resulting binary. +hardcode_minus_L=$hardcode_minus_L_CXX + +# Set to "yes" if using SHLIBPATH_VAR=DIR during linking hardcodes DIR +# into the resulting binary. +hardcode_shlibpath_var=$hardcode_shlibpath_var_CXX + +# Set to "yes" if building a shared library automatically hardcodes DIR +# into the library and all subsequent libraries and executables linked +# against it. +hardcode_automatic=$hardcode_automatic_CXX + +# Set to yes if linker adds runtime paths of dependent libraries +# to runtime path list. +inherit_rpath=$inherit_rpath_CXX + +# Whether libtool must link a program against all its dependency libraries. +link_all_deplibs=$link_all_deplibs_CXX + +# Set to "yes" if exported symbols are required. +always_export_symbols=$always_export_symbols_CXX + +# The commands to list exported symbols. +export_symbols_cmds=$lt_export_symbols_cmds_CXX + +# Symbols that should not be listed in the preloaded symbols. +exclude_expsyms=$lt_exclude_expsyms_CXX + +# Symbols that must always be exported. +include_expsyms=$lt_include_expsyms_CXX + +# Commands necessary for linking programs (against libraries) with templates. +prelink_cmds=$lt_prelink_cmds_CXX + +# Commands necessary for finishing linking programs. +postlink_cmds=$lt_postlink_cmds_CXX + +# Specify filename containing input files. +file_list_spec=$lt_file_list_spec_CXX + +# How to hardcode a shared library path into an executable. +hardcode_action=$hardcode_action_CXX + +# The directories searched by this compiler when creating a shared library. +compiler_lib_search_dirs=$lt_compiler_lib_search_dirs_CXX + +# Dependencies to place before and after the objects being linked to +# create a shared library. +predep_objects=$lt_predep_objects_CXX +postdep_objects=$lt_postdep_objects_CXX +predeps=$lt_predeps_CXX +postdeps=$lt_postdeps_CXX + +# The library search path used internally by the compiler when linking +# a shared library. +compiler_lib_search_path=$lt_compiler_lib_search_path_CXX + +# ### END LIBTOOL TAG CONFIG: CXX +_LT_EOF + + ;; + + esac +done # for ac_tag + + +as_fn_exit 0 +_ACEOF +ac_clean_files=$ac_clean_files_save + +test $ac_write_fail = 0 || + as_fn_error $? "write failure creating $CONFIG_STATUS" "$LINENO" 5 + + +# configure is writing to config.log, and then calls config.status. +# config.status does its own redirection, appending to config.log. +# Unfortunately, on DOS this fails, as config.log is still kept open +# by configure, so config.status won't be able to write to it; its +# output is simply discarded. So we exec the FD to /dev/null, +# effectively closing config.log, so it can be properly (re)opened and +# appended to by config.status. When coming back to configure, we +# need to make the FD available again. +if test "$no_create" != yes; then + ac_cs_success=: + ac_config_status_args= + test "$silent" = yes && + ac_config_status_args="$ac_config_status_args --quiet" + exec 5>/dev/null + $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false + exec 5>>config.log + # Use ||, not &&, to avoid exiting from the if with $? = 1, which + # would make configure fail if this is the last instruction. + $ac_cs_success || as_fn_exit 1 +fi +if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5 +$as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;} +fi + diff --git a/pkg/registry/zookeeper-3.4.6/src/c/autom4te.cache/output.3 b/pkg/registry/zookeeper-3.4.6/src/c/autom4te.cache/output.3 new file mode 100644 index 000000000..2ec15cfb8 --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/c/autom4te.cache/output.3 @@ -0,0 +1,20617 @@ +@%:@! /bin/sh +@%:@ Guess values for system-dependent variables and create Makefiles. +@%:@ Generated by GNU Autoconf 2.69 for zookeeper C client 3.4.6. +@%:@ +@%:@ Report bugs to . +@%:@ +@%:@ +@%:@ Copyright (C) 1992-1996, 1998-2012 Free Software Foundation, Inc. +@%:@ +@%:@ +@%:@ This configure script is free software; the Free Software Foundation +@%:@ gives unlimited permission to copy, distribute and modify it. +## -------------------- ## +## M4sh Initialization. ## +## -------------------- ## + +# Be more Bourne compatible +DUALCASE=1; export DUALCASE # for MKS sh +if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : + emulate sh + NULLCMD=: + # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which + # is contrary to our usage. Disable this feature. + alias -g '${1+"$@"}'='"$@"' + setopt NO_GLOB_SUBST +else + case `(set -o) 2>/dev/null` in @%:@( + *posix*) : + set -o posix ;; @%:@( + *) : + ;; +esac +fi + + +as_nl=' +' +export as_nl +# Printing a long string crashes Solaris 7 /usr/bin/printf. +as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' +as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo +as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo +# Prefer a ksh shell builtin over an external printf program on Solaris, +# but without wasting forks for bash or zsh. +if test -z "$BASH_VERSION$ZSH_VERSION" \ + && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then + as_echo='print -r --' + as_echo_n='print -rn --' +elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then + as_echo='printf %s\n' + as_echo_n='printf %s' +else + if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then + as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' + as_echo_n='/usr/ucb/echo -n' + else + as_echo_body='eval expr "X$1" : "X\\(.*\\)"' + as_echo_n_body='eval + arg=$1; + case $arg in @%:@( + *"$as_nl"*) + expr "X$arg" : "X\\(.*\\)$as_nl"; + arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; + esac; + expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" + ' + export as_echo_n_body + as_echo_n='sh -c $as_echo_n_body as_echo' + fi + export as_echo_body + as_echo='sh -c $as_echo_body as_echo' +fi + +# The user is always right. +if test "${PATH_SEPARATOR+set}" != set; then + PATH_SEPARATOR=: + (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { + (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || + PATH_SEPARATOR=';' + } +fi + + +# IFS +# We need space, tab and new line, in precisely that order. Quoting is +# there to prevent editors from complaining about space-tab. +# (If _AS_PATH_WALK were called with IFS unset, it would disable word +# splitting by setting IFS to empty value.) +IFS=" "" $as_nl" + +# Find who we are. Look in the path if we contain no directory separator. +as_myself= +case $0 in @%:@(( + *[\\/]* ) as_myself=$0 ;; + *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break + done +IFS=$as_save_IFS + + ;; +esac +# We did not find ourselves, most probably we were run as `sh COMMAND' +# in which case we are not to be found in the path. +if test "x$as_myself" = x; then + as_myself=$0 +fi +if test ! -f "$as_myself"; then + $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 + exit 1 +fi + +# Unset variables that we do not need and which cause bugs (e.g. in +# pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" +# suppresses any "Segmentation fault" message there. '((' could +# trigger a bug in pdksh 5.2.14. +for as_var in BASH_ENV ENV MAIL MAILPATH +do eval test x\${$as_var+set} = xset \ + && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : +done +PS1='$ ' +PS2='> ' +PS4='+ ' + +# NLS nuisances. +LC_ALL=C +export LC_ALL +LANGUAGE=C +export LANGUAGE + +# CDPATH. +(unset CDPATH) >/dev/null 2>&1 && unset CDPATH + +# Use a proper internal environment variable to ensure we don't fall + # into an infinite loop, continuously re-executing ourselves. + if test x"${_as_can_reexec}" != xno && test "x$CONFIG_SHELL" != x; then + _as_can_reexec=no; export _as_can_reexec; + # We cannot yet assume a decent shell, so we have to provide a +# neutralization value for shells without unset; and this also +# works around shells that cannot unset nonexistent variables. +# Preserve -v and -x to the replacement shell. +BASH_ENV=/dev/null +ENV=/dev/null +(unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV +case $- in @%:@ (((( + *v*x* | *x*v* ) as_opts=-vx ;; + *v* ) as_opts=-v ;; + *x* ) as_opts=-x ;; + * ) as_opts= ;; +esac +exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} +# Admittedly, this is quite paranoid, since all the known shells bail +# out after a failed `exec'. +$as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2 +as_fn_exit 255 + fi + # We don't want this to propagate to other subprocesses. + { _as_can_reexec=; unset _as_can_reexec;} +if test "x$CONFIG_SHELL" = x; then + as_bourne_compatible="if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then : + emulate sh + NULLCMD=: + # Pre-4.2 versions of Zsh do word splitting on \${1+\"\$@\"}, which + # is contrary to our usage. Disable this feature. + alias -g '\${1+\"\$@\"}'='\"\$@\"' + setopt NO_GLOB_SUBST +else + case \`(set -o) 2>/dev/null\` in @%:@( + *posix*) : + set -o posix ;; @%:@( + *) : + ;; +esac +fi +" + as_required="as_fn_return () { (exit \$1); } +as_fn_success () { as_fn_return 0; } +as_fn_failure () { as_fn_return 1; } +as_fn_ret_success () { return 0; } +as_fn_ret_failure () { return 1; } + +exitcode=0 +as_fn_success || { exitcode=1; echo as_fn_success failed.; } +as_fn_failure && { exitcode=1; echo as_fn_failure succeeded.; } +as_fn_ret_success || { exitcode=1; echo as_fn_ret_success failed.; } +as_fn_ret_failure && { exitcode=1; echo as_fn_ret_failure succeeded.; } +if ( set x; as_fn_ret_success y && test x = \"\$1\" ); then : + +else + exitcode=1; echo positional parameters were not saved. +fi +test x\$exitcode = x0 || exit 1 +test -x / || exit 1" + as_suggested=" as_lineno_1=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_1a=\$LINENO + as_lineno_2=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_2a=\$LINENO + eval 'test \"x\$as_lineno_1'\$as_run'\" != \"x\$as_lineno_2'\$as_run'\" && + test \"x\`expr \$as_lineno_1'\$as_run' + 1\`\" = \"x\$as_lineno_2'\$as_run'\"' || exit 1 + + test -n \"\${ZSH_VERSION+set}\${BASH_VERSION+set}\" || ( + ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' + ECHO=\$ECHO\$ECHO\$ECHO\$ECHO\$ECHO + ECHO=\$ECHO\$ECHO\$ECHO\$ECHO\$ECHO\$ECHO + PATH=/empty FPATH=/empty; export PATH FPATH + test \"X\`printf %s \$ECHO\`\" = \"X\$ECHO\" \\ + || test \"X\`print -r -- \$ECHO\`\" = \"X\$ECHO\" ) || exit 1 +test \$(( 1 + 1 )) = 2 || exit 1" + if (eval "$as_required") 2>/dev/null; then : + as_have_required=yes +else + as_have_required=no +fi + if test x$as_have_required = xyes && (eval "$as_suggested") 2>/dev/null; then : + +else + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +as_found=false +for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + as_found=: + case $as_dir in @%:@( + /*) + for as_base in sh bash ksh sh5; do + # Try only shells that exist, to save several forks. + as_shell=$as_dir/$as_base + if { test -f "$as_shell" || test -f "$as_shell.exe"; } && + { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$as_shell"; } 2>/dev/null; then : + CONFIG_SHELL=$as_shell as_have_required=yes + if { $as_echo "$as_bourne_compatible""$as_suggested" | as_run=a "$as_shell"; } 2>/dev/null; then : + break 2 +fi +fi + done;; + esac + as_found=false +done +$as_found || { if { test -f "$SHELL" || test -f "$SHELL.exe"; } && + { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$SHELL"; } 2>/dev/null; then : + CONFIG_SHELL=$SHELL as_have_required=yes +fi; } +IFS=$as_save_IFS + + + if test "x$CONFIG_SHELL" != x; then : + export CONFIG_SHELL + # We cannot yet assume a decent shell, so we have to provide a +# neutralization value for shells without unset; and this also +# works around shells that cannot unset nonexistent variables. +# Preserve -v and -x to the replacement shell. +BASH_ENV=/dev/null +ENV=/dev/null +(unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV +case $- in @%:@ (((( + *v*x* | *x*v* ) as_opts=-vx ;; + *v* ) as_opts=-v ;; + *x* ) as_opts=-x ;; + * ) as_opts= ;; +esac +exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} +# Admittedly, this is quite paranoid, since all the known shells bail +# out after a failed `exec'. +$as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2 +exit 255 +fi + + if test x$as_have_required = xno; then : + $as_echo "$0: This script requires a shell more modern than all" + $as_echo "$0: the shells that I found on your system." + if test x${ZSH_VERSION+set} = xset ; then + $as_echo "$0: In particular, zsh $ZSH_VERSION has bugs and should" + $as_echo "$0: be upgraded to zsh 4.3.4 or later." + else + $as_echo "$0: Please tell bug-autoconf@gnu.org and +$0: user@zookeeper.apache.org about your system, including +$0: any error possibly output before this message. Then +$0: install a modern shell, or manually run the script +$0: under such a shell if you do have one." + fi + exit 1 +fi +fi +fi +SHELL=${CONFIG_SHELL-/bin/sh} +export SHELL +# Unset more variables known to interfere with behavior of common tools. +CLICOLOR_FORCE= GREP_OPTIONS= +unset CLICOLOR_FORCE GREP_OPTIONS + +## --------------------- ## +## M4sh Shell Functions. ## +## --------------------- ## +@%:@ as_fn_unset VAR +@%:@ --------------- +@%:@ Portably unset VAR. +as_fn_unset () +{ + { eval $1=; unset $1;} +} +as_unset=as_fn_unset + +@%:@ as_fn_set_status STATUS +@%:@ ----------------------- +@%:@ Set @S|@? to STATUS, without forking. +as_fn_set_status () +{ + return $1 +} @%:@ as_fn_set_status + +@%:@ as_fn_exit STATUS +@%:@ ----------------- +@%:@ Exit the shell with STATUS, even in a "trap 0" or "set -e" context. +as_fn_exit () +{ + set +e + as_fn_set_status $1 + exit $1 +} @%:@ as_fn_exit + +@%:@ as_fn_mkdir_p +@%:@ ------------- +@%:@ Create "@S|@as_dir" as a directory, including parents if necessary. +as_fn_mkdir_p () +{ + + case $as_dir in #( + -*) as_dir=./$as_dir;; + esac + test -d "$as_dir" || eval $as_mkdir_p || { + as_dirs= + while :; do + case $as_dir in #( + *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( + *) as_qdir=$as_dir;; + esac + as_dirs="'$as_qdir' $as_dirs" + as_dir=`$as_dirname -- "$as_dir" || +$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$as_dir" : 'X\(//\)[^/]' \| \ + X"$as_dir" : 'X\(//\)$' \| \ + X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$as_dir" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + test -d "$as_dir" && break + done + test -z "$as_dirs" || eval "mkdir $as_dirs" + } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" + + +} @%:@ as_fn_mkdir_p + +@%:@ as_fn_executable_p FILE +@%:@ ----------------------- +@%:@ Test if FILE is an executable regular file. +as_fn_executable_p () +{ + test -f "$1" && test -x "$1" +} @%:@ as_fn_executable_p +@%:@ as_fn_append VAR VALUE +@%:@ ---------------------- +@%:@ Append the text in VALUE to the end of the definition contained in VAR. Take +@%:@ advantage of any shell optimizations that allow amortized linear growth over +@%:@ repeated appends, instead of the typical quadratic growth present in naive +@%:@ implementations. +if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : + eval 'as_fn_append () + { + eval $1+=\$2 + }' +else + as_fn_append () + { + eval $1=\$$1\$2 + } +fi # as_fn_append + +@%:@ as_fn_arith ARG... +@%:@ ------------------ +@%:@ Perform arithmetic evaluation on the ARGs, and store the result in the +@%:@ global @S|@as_val. Take advantage of shells that can avoid forks. The arguments +@%:@ must be portable across @S|@(()) and expr. +if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : + eval 'as_fn_arith () + { + as_val=$(( $* )) + }' +else + as_fn_arith () + { + as_val=`expr "$@" || test $? -eq 1` + } +fi # as_fn_arith + + +@%:@ as_fn_error STATUS ERROR [LINENO LOG_FD] +@%:@ ---------------------------------------- +@%:@ Output "`basename @S|@0`: error: ERROR" to stderr. If LINENO and LOG_FD are +@%:@ provided, also output the error to LOG_FD, referencing LINENO. Then exit the +@%:@ script with STATUS, using 1 if that was 0. +as_fn_error () +{ + as_status=$1; test $as_status -eq 0 && as_status=1 + if test "$4"; then + as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 + fi + $as_echo "$as_me: error: $2" >&2 + as_fn_exit $as_status +} @%:@ as_fn_error + +if expr a : '\(a\)' >/dev/null 2>&1 && + test "X`expr 00001 : '.*\(...\)'`" = X001; then + as_expr=expr +else + as_expr=false +fi + +if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then + as_basename=basename +else + as_basename=false +fi + +if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then + as_dirname=dirname +else + as_dirname=false +fi + +as_me=`$as_basename -- "$0" || +$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ + X"$0" : 'X\(//\)$' \| \ + X"$0" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X/"$0" | + sed '/^.*\/\([^/][^/]*\)\/*$/{ + s//\1/ + q + } + /^X\/\(\/\/\)$/{ + s//\1/ + q + } + /^X\/\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + +# Avoid depending upon Character Ranges. +as_cr_letters='abcdefghijklmnopqrstuvwxyz' +as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' +as_cr_Letters=$as_cr_letters$as_cr_LETTERS +as_cr_digits='0123456789' +as_cr_alnum=$as_cr_Letters$as_cr_digits + + + as_lineno_1=$LINENO as_lineno_1a=$LINENO + as_lineno_2=$LINENO as_lineno_2a=$LINENO + eval 'test "x$as_lineno_1'$as_run'" != "x$as_lineno_2'$as_run'" && + test "x`expr $as_lineno_1'$as_run' + 1`" = "x$as_lineno_2'$as_run'"' || { + # Blame Lee E. McMahon (1931-1989) for sed's syntax. :-) + sed -n ' + p + /[$]LINENO/= + ' <$as_myself | + sed ' + s/[$]LINENO.*/&-/ + t lineno + b + :lineno + N + :loop + s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/ + t loop + s/-\n.*// + ' >$as_me.lineno && + chmod +x "$as_me.lineno" || + { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; } + + # If we had to re-execute with $CONFIG_SHELL, we're ensured to have + # already done that, so ensure we don't try to do so again and fall + # in an infinite loop. This has already happened in practice. + _as_can_reexec=no; export _as_can_reexec + # Don't try to exec as it changes $[0], causing all sort of problems + # (the dirname of $[0] is not the place where we might find the + # original and so on. Autoconf is especially sensitive to this). + . "./$as_me.lineno" + # Exit status is that of the last command. + exit +} + +ECHO_C= ECHO_N= ECHO_T= +case `echo -n x` in @%:@((((( +-n*) + case `echo 'xy\c'` in + *c*) ECHO_T=' ';; # ECHO_T is single tab character. + xy) ECHO_C='\c';; + *) echo `echo ksh88 bug on AIX 6.1` > /dev/null + ECHO_T=' ';; + esac;; +*) + ECHO_N='-n';; +esac + +rm -f conf$$ conf$$.exe conf$$.file +if test -d conf$$.dir; then + rm -f conf$$.dir/conf$$.file +else + rm -f conf$$.dir + mkdir conf$$.dir 2>/dev/null +fi +if (echo >conf$$.file) 2>/dev/null; then + if ln -s conf$$.file conf$$ 2>/dev/null; then + as_ln_s='ln -s' + # ... but there are two gotchas: + # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. + # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. + # In both cases, we have to default to `cp -pR'. + ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || + as_ln_s='cp -pR' + elif ln conf$$.file conf$$ 2>/dev/null; then + as_ln_s=ln + else + as_ln_s='cp -pR' + fi +else + as_ln_s='cp -pR' +fi +rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file +rmdir conf$$.dir 2>/dev/null + +if mkdir -p . 2>/dev/null; then + as_mkdir_p='mkdir -p "$as_dir"' +else + test -d ./-p && rmdir ./-p + as_mkdir_p=false +fi + +as_test_x='test -x' +as_executable_p=as_fn_executable_p + +# Sed expression to map a string onto a valid CPP name. +as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" + +# Sed expression to map a string onto a valid variable name. +as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" + +SHELL=${CONFIG_SHELL-/bin/sh} + + +test -n "$DJDIR" || exec 7<&0 &1 + +# Name of the host. +# hostname on some systems (SVR3.2, old GNU/Linux) returns a bogus exit status, +# so uname gets run too. +ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q` + +# +# Initializations. +# +ac_default_prefix=/usr/local +ac_clean_files= +ac_config_libobj_dir=. +LIB@&t@OBJS= +cross_compiling=no +subdirs= +MFLAGS= +MAKEFLAGS= + +# Identity of this package. +PACKAGE_NAME='zookeeper C client' +PACKAGE_TARNAME='zookeeper' +PACKAGE_VERSION='3.4.6' +PACKAGE_STRING='zookeeper C client 3.4.6' +PACKAGE_BUGREPORT='user@zookeeper.apache.org' +PACKAGE_URL='' + +ac_unique_file="src/zookeeper.c" +# Factoring default headers for most tests. +ac_includes_default="\ +#include +#ifdef HAVE_SYS_TYPES_H +# include +#endif +#ifdef HAVE_SYS_STAT_H +# include +#endif +#ifdef STDC_HEADERS +# include +# include +#else +# ifdef HAVE_STDLIB_H +# include +# endif +#endif +#ifdef HAVE_STRING_H +# if !defined STDC_HEADERS && defined HAVE_MEMORY_H +# include +# endif +# include +#endif +#ifdef HAVE_STRINGS_H +# include +#endif +#ifdef HAVE_INTTYPES_H +# include +#endif +#ifdef HAVE_STDINT_H +# include +#endif +#ifdef HAVE_UNISTD_H +# include +#endif" + +ac_subst_vars='am__EXEEXT_FALSE +am__EXEEXT_TRUE +LTLIBOBJS +LIB@&t@OBJS +USEIPV6 +WANT_SYNCAPI_FALSE +WANT_SYNCAPI_TRUE +CXXCPP +CPP +OTOOL64 +OTOOL +LIPO +NMEDIT +DSYMUTIL +MANIFEST_TOOL +RANLIB +ac_ct_AR +AR +DLLTOOL +OBJDUMP +NM +ac_ct_DUMPBIN +DUMPBIN +LD +FGREP +EGREP +GREP +SED +host_os +host_vendor +host_cpu +host +build_os +build_vendor +build_cpu +build +LIBTOOL +LN_S +am__fastdepCXX_FALSE +am__fastdepCXX_TRUE +CXXDEPMODE +ac_ct_CXX +CXXFLAGS +CXX +am__fastdepCC_FALSE +am__fastdepCC_TRUE +CCDEPMODE +am__nodep +AMDEPBACKSLASH +AMDEP_FALSE +AMDEP_TRUE +am__quote +am__include +DEPDIR +OBJEXT +EXEEXT +ac_ct_CC +CPPFLAGS +LDFLAGS +CFLAGS +CC +CPPUNIT_LIBS +CPPUNIT_CFLAGS +CPPUNIT_CONFIG +am__untar +am__tar +AMTAR +am__leading_dot +SET_MAKE +AWK +mkdir_p +MKDIR_P +INSTALL_STRIP_PROGRAM +STRIP +install_sh +MAKEINFO +AUTOHEADER +AUTOMAKE +AUTOCONF +ACLOCAL +VERSION +PACKAGE +CYGPATH_W +am__isrc +INSTALL_DATA +INSTALL_SCRIPT +INSTALL_PROGRAM +DOXYGEN_PAPER_SIZE +DX_COND_latex_FALSE +DX_COND_latex_TRUE +DX_COND_pdf_FALSE +DX_COND_pdf_TRUE +DX_PDFLATEX +DX_FLAG_pdf +DX_COND_ps_FALSE +DX_COND_ps_TRUE +DX_EGREP +DX_DVIPS +DX_MAKEINDEX +DX_LATEX +DX_FLAG_ps +DX_COND_html_FALSE +DX_COND_html_TRUE +DX_FLAG_html +DX_COND_chi_FALSE +DX_COND_chi_TRUE +DX_FLAG_chi +DX_COND_chm_FALSE +DX_COND_chm_TRUE +DX_HHC +DX_FLAG_chm +DX_COND_xml_FALSE +DX_COND_xml_TRUE +DX_FLAG_xml +DX_COND_rtf_FALSE +DX_COND_rtf_TRUE +DX_FLAG_rtf +DX_COND_man_FALSE +DX_COND_man_TRUE +DX_FLAG_man +DX_COND_dot_FALSE +DX_COND_dot_TRUE +DX_DOT +DX_FLAG_dot +DX_COND_doc_FALSE +DX_COND_doc_TRUE +DX_PERL +DX_DOXYGEN +DX_FLAG_doc +DX_ENV +DX_DOCDIR +DX_CONFIG +DX_PROJECT +target_alias +host_alias +build_alias +LIBS +ECHO_T +ECHO_N +ECHO_C +DEFS +mandir +localedir +libdir +psdir +pdfdir +dvidir +htmldir +infodir +docdir +oldincludedir +includedir +localstatedir +sharedstatedir +sysconfdir +datadir +datarootdir +libexecdir +sbindir +bindir +program_transform_name +prefix +exec_prefix +PACKAGE_URL +PACKAGE_BUGREPORT +PACKAGE_STRING +PACKAGE_VERSION +PACKAGE_TARNAME +PACKAGE_NAME +PATH_SEPARATOR +SHELL' +ac_subst_files='' +ac_user_opts=' +enable_option_checking +enable_doxygen_doc +enable_doxygen_dot +enable_doxygen_man +enable_doxygen_rtf +enable_doxygen_xml +enable_doxygen_chm +enable_doxygen_chi +enable_doxygen_html +enable_doxygen_ps +enable_doxygen_pdf +with_cppunit +with_cppunit_prefix +with_cppunit_exec_prefix +enable_dependency_tracking +enable_shared +enable_static +with_pic +enable_fast_install +with_gnu_ld +with_sysroot +enable_libtool_lock +enable_debug +with_syncapi +' + ac_precious_vars='build_alias +host_alias +target_alias +DOXYGEN_PAPER_SIZE +CC +CFLAGS +LDFLAGS +LIBS +CPPFLAGS +CXX +CXXFLAGS +CCC +CPP +CXXCPP' + + +# Initialize some variables set by options. +ac_init_help= +ac_init_version=false +ac_unrecognized_opts= +ac_unrecognized_sep= +# The variables have the same names as the options, with +# dashes changed to underlines. +cache_file=/dev/null +exec_prefix=NONE +no_create= +no_recursion= +prefix=NONE +program_prefix=NONE +program_suffix=NONE +program_transform_name=s,x,x, +silent= +site= +srcdir= +verbose= +x_includes=NONE +x_libraries=NONE + +# Installation directory options. +# These are left unexpanded so users can "make install exec_prefix=/foo" +# and all the variables that are supposed to be based on exec_prefix +# by default will actually change. +# Use braces instead of parens because sh, perl, etc. also accept them. +# (The list follows the same order as the GNU Coding Standards.) +bindir='${exec_prefix}/bin' +sbindir='${exec_prefix}/sbin' +libexecdir='${exec_prefix}/libexec' +datarootdir='${prefix}/share' +datadir='${datarootdir}' +sysconfdir='${prefix}/etc' +sharedstatedir='${prefix}/com' +localstatedir='${prefix}/var' +includedir='${prefix}/include' +oldincludedir='/usr/include' +docdir='${datarootdir}/doc/${PACKAGE_TARNAME}' +infodir='${datarootdir}/info' +htmldir='${docdir}' +dvidir='${docdir}' +pdfdir='${docdir}' +psdir='${docdir}' +libdir='${exec_prefix}/lib' +localedir='${datarootdir}/locale' +mandir='${datarootdir}/man' + +ac_prev= +ac_dashdash= +for ac_option +do + # If the previous option needs an argument, assign it. + if test -n "$ac_prev"; then + eval $ac_prev=\$ac_option + ac_prev= + continue + fi + + case $ac_option in + *=?*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;; + *=) ac_optarg= ;; + *) ac_optarg=yes ;; + esac + + # Accept the important Cygnus configure options, so we can diagnose typos. + + case $ac_dashdash$ac_option in + --) + ac_dashdash=yes ;; + + -bindir | --bindir | --bindi | --bind | --bin | --bi) + ac_prev=bindir ;; + -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*) + bindir=$ac_optarg ;; + + -build | --build | --buil | --bui | --bu) + ac_prev=build_alias ;; + -build=* | --build=* | --buil=* | --bui=* | --bu=*) + build_alias=$ac_optarg ;; + + -cache-file | --cache-file | --cache-fil | --cache-fi \ + | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c) + ac_prev=cache_file ;; + -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \ + | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*) + cache_file=$ac_optarg ;; + + --config-cache | -C) + cache_file=config.cache ;; + + -datadir | --datadir | --datadi | --datad) + ac_prev=datadir ;; + -datadir=* | --datadir=* | --datadi=* | --datad=*) + datadir=$ac_optarg ;; + + -datarootdir | --datarootdir | --datarootdi | --datarootd | --dataroot \ + | --dataroo | --dataro | --datar) + ac_prev=datarootdir ;; + -datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \ + | --dataroot=* | --dataroo=* | --dataro=* | --datar=*) + datarootdir=$ac_optarg ;; + + -disable-* | --disable-*) + ac_useropt=`expr "x$ac_option" : 'x-*disable-\(.*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && + as_fn_error $? "invalid feature name: $ac_useropt" + ac_useropt_orig=$ac_useropt + ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` + case $ac_user_opts in + *" +"enable_$ac_useropt" +"*) ;; + *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--disable-$ac_useropt_orig" + ac_unrecognized_sep=', ';; + esac + eval enable_$ac_useropt=no ;; + + -docdir | --docdir | --docdi | --doc | --do) + ac_prev=docdir ;; + -docdir=* | --docdir=* | --docdi=* | --doc=* | --do=*) + docdir=$ac_optarg ;; + + -dvidir | --dvidir | --dvidi | --dvid | --dvi | --dv) + ac_prev=dvidir ;; + -dvidir=* | --dvidir=* | --dvidi=* | --dvid=* | --dvi=* | --dv=*) + dvidir=$ac_optarg ;; + + -enable-* | --enable-*) + ac_useropt=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && + as_fn_error $? "invalid feature name: $ac_useropt" + ac_useropt_orig=$ac_useropt + ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` + case $ac_user_opts in + *" +"enable_$ac_useropt" +"*) ;; + *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--enable-$ac_useropt_orig" + ac_unrecognized_sep=', ';; + esac + eval enable_$ac_useropt=\$ac_optarg ;; + + -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \ + | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \ + | --exec | --exe | --ex) + ac_prev=exec_prefix ;; + -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \ + | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \ + | --exec=* | --exe=* | --ex=*) + exec_prefix=$ac_optarg ;; + + -gas | --gas | --ga | --g) + # Obsolete; use --with-gas. + with_gas=yes ;; + + -help | --help | --hel | --he | -h) + ac_init_help=long ;; + -help=r* | --help=r* | --hel=r* | --he=r* | -hr*) + ac_init_help=recursive ;; + -help=s* | --help=s* | --hel=s* | --he=s* | -hs*) + ac_init_help=short ;; + + -host | --host | --hos | --ho) + ac_prev=host_alias ;; + -host=* | --host=* | --hos=* | --ho=*) + host_alias=$ac_optarg ;; + + -htmldir | --htmldir | --htmldi | --htmld | --html | --htm | --ht) + ac_prev=htmldir ;; + -htmldir=* | --htmldir=* | --htmldi=* | --htmld=* | --html=* | --htm=* \ + | --ht=*) + htmldir=$ac_optarg ;; + + -includedir | --includedir | --includedi | --included | --include \ + | --includ | --inclu | --incl | --inc) + ac_prev=includedir ;; + -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \ + | --includ=* | --inclu=* | --incl=* | --inc=*) + includedir=$ac_optarg ;; + + -infodir | --infodir | --infodi | --infod | --info | --inf) + ac_prev=infodir ;; + -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*) + infodir=$ac_optarg ;; + + -libdir | --libdir | --libdi | --libd) + ac_prev=libdir ;; + -libdir=* | --libdir=* | --libdi=* | --libd=*) + libdir=$ac_optarg ;; + + -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \ + | --libexe | --libex | --libe) + ac_prev=libexecdir ;; + -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \ + | --libexe=* | --libex=* | --libe=*) + libexecdir=$ac_optarg ;; + + -localedir | --localedir | --localedi | --localed | --locale) + ac_prev=localedir ;; + -localedir=* | --localedir=* | --localedi=* | --localed=* | --locale=*) + localedir=$ac_optarg ;; + + -localstatedir | --localstatedir | --localstatedi | --localstated \ + | --localstate | --localstat | --localsta | --localst | --locals) + ac_prev=localstatedir ;; + -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \ + | --localstate=* | --localstat=* | --localsta=* | --localst=* | --locals=*) + localstatedir=$ac_optarg ;; + + -mandir | --mandir | --mandi | --mand | --man | --ma | --m) + ac_prev=mandir ;; + -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*) + mandir=$ac_optarg ;; + + -nfp | --nfp | --nf) + # Obsolete; use --without-fp. + with_fp=no ;; + + -no-create | --no-create | --no-creat | --no-crea | --no-cre \ + | --no-cr | --no-c | -n) + no_create=yes ;; + + -no-recursion | --no-recursion | --no-recursio | --no-recursi \ + | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) + no_recursion=yes ;; + + -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \ + | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \ + | --oldin | --oldi | --old | --ol | --o) + ac_prev=oldincludedir ;; + -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \ + | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \ + | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*) + oldincludedir=$ac_optarg ;; + + -prefix | --prefix | --prefi | --pref | --pre | --pr | --p) + ac_prev=prefix ;; + -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*) + prefix=$ac_optarg ;; + + -program-prefix | --program-prefix | --program-prefi | --program-pref \ + | --program-pre | --program-pr | --program-p) + ac_prev=program_prefix ;; + -program-prefix=* | --program-prefix=* | --program-prefi=* \ + | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*) + program_prefix=$ac_optarg ;; + + -program-suffix | --program-suffix | --program-suffi | --program-suff \ + | --program-suf | --program-su | --program-s) + ac_prev=program_suffix ;; + -program-suffix=* | --program-suffix=* | --program-suffi=* \ + | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*) + program_suffix=$ac_optarg ;; + + -program-transform-name | --program-transform-name \ + | --program-transform-nam | --program-transform-na \ + | --program-transform-n | --program-transform- \ + | --program-transform | --program-transfor \ + | --program-transfo | --program-transf \ + | --program-trans | --program-tran \ + | --progr-tra | --program-tr | --program-t) + ac_prev=program_transform_name ;; + -program-transform-name=* | --program-transform-name=* \ + | --program-transform-nam=* | --program-transform-na=* \ + | --program-transform-n=* | --program-transform-=* \ + | --program-transform=* | --program-transfor=* \ + | --program-transfo=* | --program-transf=* \ + | --program-trans=* | --program-tran=* \ + | --progr-tra=* | --program-tr=* | --program-t=*) + program_transform_name=$ac_optarg ;; + + -pdfdir | --pdfdir | --pdfdi | --pdfd | --pdf | --pd) + ac_prev=pdfdir ;; + -pdfdir=* | --pdfdir=* | --pdfdi=* | --pdfd=* | --pdf=* | --pd=*) + pdfdir=$ac_optarg ;; + + -psdir | --psdir | --psdi | --psd | --ps) + ac_prev=psdir ;; + -psdir=* | --psdir=* | --psdi=* | --psd=* | --ps=*) + psdir=$ac_optarg ;; + + -q | -quiet | --quiet | --quie | --qui | --qu | --q \ + | -silent | --silent | --silen | --sile | --sil) + silent=yes ;; + + -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb) + ac_prev=sbindir ;; + -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \ + | --sbi=* | --sb=*) + sbindir=$ac_optarg ;; + + -sharedstatedir | --sharedstatedir | --sharedstatedi \ + | --sharedstated | --sharedstate | --sharedstat | --sharedsta \ + | --sharedst | --shareds | --shared | --share | --shar \ + | --sha | --sh) + ac_prev=sharedstatedir ;; + -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \ + | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \ + | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \ + | --sha=* | --sh=*) + sharedstatedir=$ac_optarg ;; + + -site | --site | --sit) + ac_prev=site ;; + -site=* | --site=* | --sit=*) + site=$ac_optarg ;; + + -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) + ac_prev=srcdir ;; + -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) + srcdir=$ac_optarg ;; + + -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \ + | --syscon | --sysco | --sysc | --sys | --sy) + ac_prev=sysconfdir ;; + -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \ + | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*) + sysconfdir=$ac_optarg ;; + + -target | --target | --targe | --targ | --tar | --ta | --t) + ac_prev=target_alias ;; + -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*) + target_alias=$ac_optarg ;; + + -v | -verbose | --verbose | --verbos | --verbo | --verb) + verbose=yes ;; + + -version | --version | --versio | --versi | --vers | -V) + ac_init_version=: ;; + + -with-* | --with-*) + ac_useropt=`expr "x$ac_option" : 'x-*with-\([^=]*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && + as_fn_error $? "invalid package name: $ac_useropt" + ac_useropt_orig=$ac_useropt + ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` + case $ac_user_opts in + *" +"with_$ac_useropt" +"*) ;; + *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--with-$ac_useropt_orig" + ac_unrecognized_sep=', ';; + esac + eval with_$ac_useropt=\$ac_optarg ;; + + -without-* | --without-*) + ac_useropt=`expr "x$ac_option" : 'x-*without-\(.*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && + as_fn_error $? "invalid package name: $ac_useropt" + ac_useropt_orig=$ac_useropt + ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` + case $ac_user_opts in + *" +"with_$ac_useropt" +"*) ;; + *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--without-$ac_useropt_orig" + ac_unrecognized_sep=', ';; + esac + eval with_$ac_useropt=no ;; + + --x) + # Obsolete; use --with-x. + with_x=yes ;; + + -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \ + | --x-incl | --x-inc | --x-in | --x-i) + ac_prev=x_includes ;; + -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \ + | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*) + x_includes=$ac_optarg ;; + + -x-libraries | --x-libraries | --x-librarie | --x-librari \ + | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l) + ac_prev=x_libraries ;; + -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \ + | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*) + x_libraries=$ac_optarg ;; + + -*) as_fn_error $? "unrecognized option: \`$ac_option' +Try \`$0 --help' for more information" + ;; + + *=*) + ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='` + # Reject names that are not valid shell variable names. + case $ac_envvar in #( + '' | [0-9]* | *[!_$as_cr_alnum]* ) + as_fn_error $? "invalid variable name: \`$ac_envvar'" ;; + esac + eval $ac_envvar=\$ac_optarg + export $ac_envvar ;; + + *) + # FIXME: should be removed in autoconf 3.0. + $as_echo "$as_me: WARNING: you should use --build, --host, --target" >&2 + expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null && + $as_echo "$as_me: WARNING: invalid host type: $ac_option" >&2 + : "${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}" + ;; + + esac +done + +if test -n "$ac_prev"; then + ac_option=--`echo $ac_prev | sed 's/_/-/g'` + as_fn_error $? "missing argument to $ac_option" +fi + +if test -n "$ac_unrecognized_opts"; then + case $enable_option_checking in + no) ;; + fatal) as_fn_error $? "unrecognized options: $ac_unrecognized_opts" ;; + *) $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 ;; + esac +fi + +# Check all directory arguments for consistency. +for ac_var in exec_prefix prefix bindir sbindir libexecdir datarootdir \ + datadir sysconfdir sharedstatedir localstatedir includedir \ + oldincludedir docdir infodir htmldir dvidir pdfdir psdir \ + libdir localedir mandir +do + eval ac_val=\$$ac_var + # Remove trailing slashes. + case $ac_val in + */ ) + ac_val=`expr "X$ac_val" : 'X\(.*[^/]\)' \| "X$ac_val" : 'X\(.*\)'` + eval $ac_var=\$ac_val;; + esac + # Be sure to have absolute directory names. + case $ac_val in + [\\/$]* | ?:[\\/]* ) continue;; + NONE | '' ) case $ac_var in *prefix ) continue;; esac;; + esac + as_fn_error $? "expected an absolute directory name for --$ac_var: $ac_val" +done + +# There might be people who depend on the old broken behavior: `$host' +# used to hold the argument of --host etc. +# FIXME: To remove some day. +build=$build_alias +host=$host_alias +target=$target_alias + +# FIXME: To remove some day. +if test "x$host_alias" != x; then + if test "x$build_alias" = x; then + cross_compiling=maybe + elif test "x$build_alias" != "x$host_alias"; then + cross_compiling=yes + fi +fi + +ac_tool_prefix= +test -n "$host_alias" && ac_tool_prefix=$host_alias- + +test "$silent" = yes && exec 6>/dev/null + + +ac_pwd=`pwd` && test -n "$ac_pwd" && +ac_ls_di=`ls -di .` && +ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` || + as_fn_error $? "working directory cannot be determined" +test "X$ac_ls_di" = "X$ac_pwd_ls_di" || + as_fn_error $? "pwd does not report name of working directory" + + +# Find the source files, if location was not specified. +if test -z "$srcdir"; then + ac_srcdir_defaulted=yes + # Try the directory containing this script, then the parent directory. + ac_confdir=`$as_dirname -- "$as_myself" || +$as_expr X"$as_myself" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$as_myself" : 'X\(//\)[^/]' \| \ + X"$as_myself" : 'X\(//\)$' \| \ + X"$as_myself" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$as_myself" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + srcdir=$ac_confdir + if test ! -r "$srcdir/$ac_unique_file"; then + srcdir=.. + fi +else + ac_srcdir_defaulted=no +fi +if test ! -r "$srcdir/$ac_unique_file"; then + test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .." + as_fn_error $? "cannot find sources ($ac_unique_file) in $srcdir" +fi +ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work" +ac_abs_confdir=`( + cd "$srcdir" && test -r "./$ac_unique_file" || as_fn_error $? "$ac_msg" + pwd)` +# When building in place, set srcdir=. +if test "$ac_abs_confdir" = "$ac_pwd"; then + srcdir=. +fi +# Remove unnecessary trailing slashes from srcdir. +# Double slashes in file names in object file debugging info +# mess up M-x gdb in Emacs. +case $srcdir in +*/) srcdir=`expr "X$srcdir" : 'X\(.*[^/]\)' \| "X$srcdir" : 'X\(.*\)'`;; +esac +for ac_var in $ac_precious_vars; do + eval ac_env_${ac_var}_set=\${${ac_var}+set} + eval ac_env_${ac_var}_value=\$${ac_var} + eval ac_cv_env_${ac_var}_set=\${${ac_var}+set} + eval ac_cv_env_${ac_var}_value=\$${ac_var} +done + +# +# Report the --help message. +# +if test "$ac_init_help" = "long"; then + # Omit some internal or obsolete options to make the list less imposing. + # This message is too long to be a string in the A/UX 3.1 sh. + cat <<_ACEOF +\`configure' configures zookeeper C client 3.4.6 to adapt to many kinds of systems. + +Usage: $0 [OPTION]... [VAR=VALUE]... + +To assign environment variables (e.g., CC, CFLAGS...), specify them as +VAR=VALUE. See below for descriptions of some of the useful variables. + +Defaults for the options are specified in brackets. + +Configuration: + -h, --help display this help and exit + --help=short display options specific to this package + --help=recursive display the short help of all the included packages + -V, --version display version information and exit + -q, --quiet, --silent do not print \`checking ...' messages + --cache-file=FILE cache test results in FILE [disabled] + -C, --config-cache alias for \`--cache-file=config.cache' + -n, --no-create do not create output files + --srcdir=DIR find the sources in DIR [configure dir or \`..'] + +Installation directories: + --prefix=PREFIX install architecture-independent files in PREFIX + @<:@@S|@ac_default_prefix@:>@ + --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX + @<:@PREFIX@:>@ + +By default, \`make install' will install all the files in +\`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc. You can specify +an installation prefix other than \`$ac_default_prefix' using \`--prefix', +for instance \`--prefix=\$HOME'. + +For better control, use the options below. + +Fine tuning of the installation directories: + --bindir=DIR user executables [EPREFIX/bin] + --sbindir=DIR system admin executables [EPREFIX/sbin] + --libexecdir=DIR program executables [EPREFIX/libexec] + --sysconfdir=DIR read-only single-machine data [PREFIX/etc] + --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com] + --localstatedir=DIR modifiable single-machine data [PREFIX/var] + --libdir=DIR object code libraries [EPREFIX/lib] + --includedir=DIR C header files [PREFIX/include] + --oldincludedir=DIR C header files for non-gcc [/usr/include] + --datarootdir=DIR read-only arch.-independent data root [PREFIX/share] + --datadir=DIR read-only architecture-independent data [DATAROOTDIR] + --infodir=DIR info documentation [DATAROOTDIR/info] + --localedir=DIR locale-dependent data [DATAROOTDIR/locale] + --mandir=DIR man documentation [DATAROOTDIR/man] + --docdir=DIR documentation root @<:@DATAROOTDIR/doc/zookeeper@:>@ + --htmldir=DIR html documentation [DOCDIR] + --dvidir=DIR dvi documentation [DOCDIR] + --pdfdir=DIR pdf documentation [DOCDIR] + --psdir=DIR ps documentation [DOCDIR] +_ACEOF + + cat <<\_ACEOF + +Program names: + --program-prefix=PREFIX prepend PREFIX to installed program names + --program-suffix=SUFFIX append SUFFIX to installed program names + --program-transform-name=PROGRAM run sed PROGRAM on installed program names + +System types: + --build=BUILD configure for building on BUILD [guessed] + --host=HOST cross-compile to build programs to run on HOST [BUILD] +_ACEOF +fi + +if test -n "$ac_init_help"; then + case $ac_init_help in + short | recursive ) echo "Configuration of zookeeper C client 3.4.6:";; + esac + cat <<\_ACEOF + +Optional Features: + --disable-option-checking ignore unrecognized --enable/--with options + --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) + --enable-FEATURE[=ARG] include FEATURE [ARG=yes] + --disable-doxygen-doc don't generate any doxygen documentation + --disable-doxygen-dot don't generate graphics for doxygen documentation + --enable-doxygen-man generate doxygen manual pages + --enable-doxygen-rtf generate doxygen RTF documentation + --enable-doxygen-xml generate doxygen XML documentation + --enable-doxygen-chm generate doxygen compressed HTML help documentation + --enable-doxygen-chi generate doxygen seperate compressed HTML help index + file + --disable-doxygen-html don't generate doxygen plain HTML documentation + --enable-doxygen-ps generate doxygen PostScript documentation + --enable-doxygen-pdf generate doxygen PDF documentation + --disable-dependency-tracking speeds up one-time build + --enable-dependency-tracking do not reject slow dependency extractors + --enable-shared@<:@=PKGS@:>@ build shared libraries @<:@default=yes@:>@ + --enable-static@<:@=PKGS@:>@ build static libraries @<:@default=yes@:>@ + --enable-fast-install@<:@=PKGS@:>@ + optimize for fast installation @<:@default=yes@:>@ + --disable-libtool-lock avoid locking (might break parallel builds) + --enable-debug enable debug build @<:@default=no@:>@ + +Optional Packages: + --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] + --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) + --without-cppunit do not use CPPUNIT + --with-cppunit-prefix=PFX Prefix where CppUnit is installed (optional) + --with-cppunit-exec-prefix=PFX Exec prefix where CppUnit is installed (optional) + --with-pic@<:@=PKGS@:>@ try to use only PIC/non-PIC objects @<:@default=use + both@:>@ + --with-gnu-ld assume the C compiler uses GNU ld @<:@default=no@:>@ + --with-sysroot=DIR Search for dependent libraries within DIR + (or the compiler's sysroot if not specified). + --with-syncapi build with support for SyncAPI @<:@default=yes@:>@ + +Some influential environment variables: + DOXYGEN_PAPER_SIZE + a4wide (default), a4, letter, legal or executive + CC C compiler command + CFLAGS C compiler flags + LDFLAGS linker flags, e.g. -L if you have libraries in a + nonstandard directory + LIBS libraries to pass to the linker, e.g. -l + CPPFLAGS (Objective) C/C++ preprocessor flags, e.g. -I if + you have headers in a nonstandard directory + CXX C++ compiler command + CXXFLAGS C++ compiler flags + CPP C preprocessor + CXXCPP C++ preprocessor + +Use these variables to override the choices made by `configure' or to help +it to find libraries and programs with nonstandard names/locations. + +Report bugs to . +_ACEOF +ac_status=$? +fi + +if test "$ac_init_help" = "recursive"; then + # If there are subdirs, report their specific --help. + for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue + test -d "$ac_dir" || + { cd "$srcdir" && ac_pwd=`pwd` && srcdir=. && test -d "$ac_dir"; } || + continue + ac_builddir=. + +case "$ac_dir" in +.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; +*) + ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` + # A ".." for each directory in $ac_dir_suffix. + ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` + case $ac_top_builddir_sub in + "") ac_top_builddir_sub=. ac_top_build_prefix= ;; + *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; + esac ;; +esac +ac_abs_top_builddir=$ac_pwd +ac_abs_builddir=$ac_pwd$ac_dir_suffix +# for backward compatibility: +ac_top_builddir=$ac_top_build_prefix + +case $srcdir in + .) # We are building in place. + ac_srcdir=. + ac_top_srcdir=$ac_top_builddir_sub + ac_abs_top_srcdir=$ac_pwd ;; + [\\/]* | ?:[\\/]* ) # Absolute name. + ac_srcdir=$srcdir$ac_dir_suffix; + ac_top_srcdir=$srcdir + ac_abs_top_srcdir=$srcdir ;; + *) # Relative name. + ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix + ac_top_srcdir=$ac_top_build_prefix$srcdir + ac_abs_top_srcdir=$ac_pwd/$srcdir ;; +esac +ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix + + cd "$ac_dir" || { ac_status=$?; continue; } + # Check for guested configure. + if test -f "$ac_srcdir/configure.gnu"; then + echo && + $SHELL "$ac_srcdir/configure.gnu" --help=recursive + elif test -f "$ac_srcdir/configure"; then + echo && + $SHELL "$ac_srcdir/configure" --help=recursive + else + $as_echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2 + fi || ac_status=$? + cd "$ac_pwd" || { ac_status=$?; break; } + done +fi + +test -n "$ac_init_help" && exit $ac_status +if $ac_init_version; then + cat <<\_ACEOF +zookeeper C client configure 3.4.6 +generated by GNU Autoconf 2.69 + +Copyright (C) 2012 Free Software Foundation, Inc. +This configure script is free software; the Free Software Foundation +gives unlimited permission to copy, distribute and modify it. +_ACEOF + exit +fi + +## ------------------------ ## +## Autoconf initialization. ## +## ------------------------ ## + +@%:@ ac_fn_c_try_compile LINENO +@%:@ -------------------------- +@%:@ Try to compile conftest.@S|@ac_ext, and return whether this succeeded. +ac_fn_c_try_compile () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + rm -f conftest.$ac_objext + if { { ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_compile") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + grep -v '^ *+' conftest.err >conftest.er1 + cat conftest.er1 >&5 + mv -f conftest.er1 conftest.err + fi + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then : + ac_retval=0 +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_retval=1 +fi + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + as_fn_set_status $ac_retval + +} @%:@ ac_fn_c_try_compile + +@%:@ ac_fn_cxx_try_compile LINENO +@%:@ ---------------------------- +@%:@ Try to compile conftest.@S|@ac_ext, and return whether this succeeded. +ac_fn_cxx_try_compile () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + rm -f conftest.$ac_objext + if { { ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_compile") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + grep -v '^ *+' conftest.err >conftest.er1 + cat conftest.er1 >&5 + mv -f conftest.er1 conftest.err + fi + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then : + ac_retval=0 +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_retval=1 +fi + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + as_fn_set_status $ac_retval + +} @%:@ ac_fn_cxx_try_compile + +@%:@ ac_fn_c_try_link LINENO +@%:@ ----------------------- +@%:@ Try to link conftest.@S|@ac_ext, and return whether this succeeded. +ac_fn_c_try_link () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + rm -f conftest.$ac_objext conftest$ac_exeext + if { { ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_link") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + grep -v '^ *+' conftest.err >conftest.er1 + cat conftest.er1 >&5 + mv -f conftest.er1 conftest.err + fi + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && { + test "$cross_compiling" = yes || + test -x conftest$ac_exeext + }; then : + ac_retval=0 +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_retval=1 +fi + # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information + # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would + # interfere with the next link command; also delete a directory that is + # left behind by Apple's compiler. We do this before executing the actions. + rm -rf conftest.dSYM conftest_ipa8_conftest.oo + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + as_fn_set_status $ac_retval + +} @%:@ ac_fn_c_try_link + +@%:@ ac_fn_c_check_header_compile LINENO HEADER VAR INCLUDES +@%:@ ------------------------------------------------------- +@%:@ Tests whether HEADER exists and can be compiled using the include files in +@%:@ INCLUDES, setting the cache variable VAR accordingly. +ac_fn_c_check_header_compile () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 +$as_echo_n "checking for $2... " >&6; } +if eval \${$3+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$4 +@%:@include <$2> +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + eval "$3=yes" +else + eval "$3=no" +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +eval ac_res=\$$3 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + +} @%:@ ac_fn_c_check_header_compile + +@%:@ ac_fn_c_try_cpp LINENO +@%:@ ---------------------- +@%:@ Try to preprocess conftest.@S|@ac_ext, and return whether this succeeded. +ac_fn_c_try_cpp () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + if { { ac_try="$ac_cpp conftest.$ac_ext" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + grep -v '^ *+' conftest.err >conftest.er1 + cat conftest.er1 >&5 + mv -f conftest.er1 conftest.err + fi + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } > conftest.i && { + test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || + test ! -s conftest.err + }; then : + ac_retval=0 +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_retval=1 +fi + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + as_fn_set_status $ac_retval + +} @%:@ ac_fn_c_try_cpp + +@%:@ ac_fn_c_try_run LINENO +@%:@ ---------------------- +@%:@ Try to link conftest.@S|@ac_ext, and return whether this succeeded. Assumes +@%:@ that executables *can* be run. +ac_fn_c_try_run () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + if { { ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_link") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && { ac_try='./conftest$ac_exeext' + { { case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; }; then : + ac_retval=0 +else + $as_echo "$as_me: program exited with status $ac_status" >&5 + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_retval=$ac_status +fi + rm -rf conftest.dSYM conftest_ipa8_conftest.oo + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + as_fn_set_status $ac_retval + +} @%:@ ac_fn_c_try_run + +@%:@ ac_fn_c_check_func LINENO FUNC VAR +@%:@ ---------------------------------- +@%:@ Tests whether FUNC exists, setting the cache variable VAR accordingly +ac_fn_c_check_func () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 +$as_echo_n "checking for $2... " >&6; } +if eval \${$3+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +/* Define $2 to an innocuous variant, in case declares $2. + For example, HP-UX 11i declares gettimeofday. */ +#define $2 innocuous_$2 + +/* System header to define __stub macros and hopefully few prototypes, + which can conflict with char $2 (); below. + Prefer to if __STDC__ is defined, since + exists even on freestanding compilers. */ + +#ifdef __STDC__ +# include +#else +# include +#endif + +#undef $2 + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char $2 (); +/* The GNU C library defines this for functions which it implements + to always fail with ENOSYS. Some functions are actually named + something starting with __ and the normal name is an alias. */ +#if defined __stub_$2 || defined __stub___$2 +choke me +#endif + +int +main () +{ +return $2 (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + eval "$3=yes" +else + eval "$3=no" +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +fi +eval ac_res=\$$3 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + +} @%:@ ac_fn_c_check_func + +@%:@ ac_fn_cxx_try_cpp LINENO +@%:@ ------------------------ +@%:@ Try to preprocess conftest.@S|@ac_ext, and return whether this succeeded. +ac_fn_cxx_try_cpp () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + if { { ac_try="$ac_cpp conftest.$ac_ext" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + grep -v '^ *+' conftest.err >conftest.er1 + cat conftest.er1 >&5 + mv -f conftest.er1 conftest.err + fi + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } > conftest.i && { + test -z "$ac_cxx_preproc_warn_flag$ac_cxx_werror_flag" || + test ! -s conftest.err + }; then : + ac_retval=0 +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_retval=1 +fi + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + as_fn_set_status $ac_retval + +} @%:@ ac_fn_cxx_try_cpp + +@%:@ ac_fn_cxx_try_link LINENO +@%:@ ------------------------- +@%:@ Try to link conftest.@S|@ac_ext, and return whether this succeeded. +ac_fn_cxx_try_link () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + rm -f conftest.$ac_objext conftest$ac_exeext + if { { ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_link") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + grep -v '^ *+' conftest.err >conftest.er1 + cat conftest.er1 >&5 + mv -f conftest.er1 conftest.err + fi + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && { + test "$cross_compiling" = yes || + test -x conftest$ac_exeext + }; then : + ac_retval=0 +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_retval=1 +fi + # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information + # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would + # interfere with the next link command; also delete a directory that is + # left behind by Apple's compiler. We do this before executing the actions. + rm -rf conftest.dSYM conftest_ipa8_conftest.oo + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + as_fn_set_status $ac_retval + +} @%:@ ac_fn_cxx_try_link + +@%:@ ac_fn_c_check_header_mongrel LINENO HEADER VAR INCLUDES +@%:@ ------------------------------------------------------- +@%:@ Tests whether HEADER exists, giving a warning if it cannot be compiled using +@%:@ the include files in INCLUDES and setting the cache variable VAR +@%:@ accordingly. +ac_fn_c_check_header_mongrel () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + if eval \${$3+:} false; then : + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 +$as_echo_n "checking for $2... " >&6; } +if eval \${$3+:} false; then : + $as_echo_n "(cached) " >&6 +fi +eval ac_res=\$$3 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } +else + # Is the header compilable? +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 usability" >&5 +$as_echo_n "checking $2 usability... " >&6; } +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$4 +@%:@include <$2> +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_header_compiler=yes +else + ac_header_compiler=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_compiler" >&5 +$as_echo "$ac_header_compiler" >&6; } + +# Is the header present? +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 presence" >&5 +$as_echo_n "checking $2 presence... " >&6; } +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +@%:@include <$2> +_ACEOF +if ac_fn_c_try_cpp "$LINENO"; then : + ac_header_preproc=yes +else + ac_header_preproc=no +fi +rm -f conftest.err conftest.i conftest.$ac_ext +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_preproc" >&5 +$as_echo "$ac_header_preproc" >&6; } + +# So? What about this header? +case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in #(( + yes:no: ) + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&5 +$as_echo "$as_me: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 +$as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} + ;; + no:yes:* ) + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: present but cannot be compiled" >&5 +$as_echo "$as_me: WARNING: $2: present but cannot be compiled" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: check for missing prerequisite headers?" >&5 +$as_echo "$as_me: WARNING: $2: check for missing prerequisite headers?" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: see the Autoconf documentation" >&5 +$as_echo "$as_me: WARNING: $2: see the Autoconf documentation" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&5 +$as_echo "$as_me: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 +$as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} +( $as_echo "## ---------------------------------------- ## +## Report this to user@zookeeper.apache.org ## +## ---------------------------------------- ##" + ) | sed "s/^/$as_me: WARNING: /" >&2 + ;; +esac + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 +$as_echo_n "checking for $2... " >&6; } +if eval \${$3+:} false; then : + $as_echo_n "(cached) " >&6 +else + eval "$3=\$ac_header_compiler" +fi +eval ac_res=\$$3 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } +fi + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + +} @%:@ ac_fn_c_check_header_mongrel + +@%:@ ac_fn_c_check_type LINENO TYPE VAR INCLUDES +@%:@ ------------------------------------------- +@%:@ Tests whether TYPE exists after having included INCLUDES, setting cache +@%:@ variable VAR accordingly. +ac_fn_c_check_type () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 +$as_echo_n "checking for $2... " >&6; } +if eval \${$3+:} false; then : + $as_echo_n "(cached) " >&6 +else + eval "$3=no" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$4 +int +main () +{ +if (sizeof ($2)) + return 0; + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$4 +int +main () +{ +if (sizeof (($2))) + return 0; + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + +else + eval "$3=yes" +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +eval ac_res=\$$3 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + +} @%:@ ac_fn_c_check_type +cat >config.log <<_ACEOF +This file contains any messages produced by compilers while +running configure, to aid debugging if configure makes a mistake. + +It was created by zookeeper C client $as_me 3.4.6, which was +generated by GNU Autoconf 2.69. Invocation command line was + + $ $0 $@ + +_ACEOF +exec 5>>config.log +{ +cat <<_ASUNAME +## --------- ## +## Platform. ## +## --------- ## + +hostname = `(hostname || uname -n) 2>/dev/null | sed 1q` +uname -m = `(uname -m) 2>/dev/null || echo unknown` +uname -r = `(uname -r) 2>/dev/null || echo unknown` +uname -s = `(uname -s) 2>/dev/null || echo unknown` +uname -v = `(uname -v) 2>/dev/null || echo unknown` + +/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown` +/bin/uname -X = `(/bin/uname -X) 2>/dev/null || echo unknown` + +/bin/arch = `(/bin/arch) 2>/dev/null || echo unknown` +/usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null || echo unknown` +/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown` +/usr/bin/hostinfo = `(/usr/bin/hostinfo) 2>/dev/null || echo unknown` +/bin/machine = `(/bin/machine) 2>/dev/null || echo unknown` +/usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null || echo unknown` +/bin/universe = `(/bin/universe) 2>/dev/null || echo unknown` + +_ASUNAME + +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + $as_echo "PATH: $as_dir" + done +IFS=$as_save_IFS + +} >&5 + +cat >&5 <<_ACEOF + + +## ----------- ## +## Core tests. ## +## ----------- ## + +_ACEOF + + +# Keep a trace of the command line. +# Strip out --no-create and --no-recursion so they do not pile up. +# Strip out --silent because we don't want to record it for future runs. +# Also quote any args containing shell meta-characters. +# Make two passes to allow for proper duplicate-argument suppression. +ac_configure_args= +ac_configure_args0= +ac_configure_args1= +ac_must_keep_next=false +for ac_pass in 1 2 +do + for ac_arg + do + case $ac_arg in + -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;; + -q | -quiet | --quiet | --quie | --qui | --qu | --q \ + | -silent | --silent | --silen | --sile | --sil) + continue ;; + *\'*) + ac_arg=`$as_echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; + esac + case $ac_pass in + 1) as_fn_append ac_configure_args0 " '$ac_arg'" ;; + 2) + as_fn_append ac_configure_args1 " '$ac_arg'" + if test $ac_must_keep_next = true; then + ac_must_keep_next=false # Got value, back to normal. + else + case $ac_arg in + *=* | --config-cache | -C | -disable-* | --disable-* \ + | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \ + | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \ + | -with-* | --with-* | -without-* | --without-* | --x) + case "$ac_configure_args0 " in + "$ac_configure_args1"*" '$ac_arg' "* ) continue ;; + esac + ;; + -* ) ac_must_keep_next=true ;; + esac + fi + as_fn_append ac_configure_args " '$ac_arg'" + ;; + esac + done +done +{ ac_configure_args0=; unset ac_configure_args0;} +{ ac_configure_args1=; unset ac_configure_args1;} + +# When interrupted or exit'd, cleanup temporary files, and complete +# config.log. We remove comments because anyway the quotes in there +# would cause problems or look ugly. +# WARNING: Use '\'' to represent an apostrophe within the trap. +# WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug. +trap 'exit_status=$? + # Save into config.log some information that might help in debugging. + { + echo + + $as_echo "## ---------------- ## +## Cache variables. ## +## ---------------- ##" + echo + # The following way of writing the cache mishandles newlines in values, +( + for ac_var in `(set) 2>&1 | sed -n '\''s/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'\''`; do + eval ac_val=\$$ac_var + case $ac_val in #( + *${as_nl}*) + case $ac_var in #( + *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 +$as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; + esac + case $ac_var in #( + _ | IFS | as_nl) ;; #( + BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( + *) { eval $ac_var=; unset $ac_var;} ;; + esac ;; + esac + done + (set) 2>&1 | + case $as_nl`(ac_space='\'' '\''; set) 2>&1` in #( + *${as_nl}ac_space=\ *) + sed -n \ + "s/'\''/'\''\\\\'\'''\''/g; + s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\''\\2'\''/p" + ;; #( + *) + sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" + ;; + esac | + sort +) + echo + + $as_echo "## ----------------- ## +## Output variables. ## +## ----------------- ##" + echo + for ac_var in $ac_subst_vars + do + eval ac_val=\$$ac_var + case $ac_val in + *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; + esac + $as_echo "$ac_var='\''$ac_val'\''" + done | sort + echo + + if test -n "$ac_subst_files"; then + $as_echo "## ------------------- ## +## File substitutions. ## +## ------------------- ##" + echo + for ac_var in $ac_subst_files + do + eval ac_val=\$$ac_var + case $ac_val in + *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; + esac + $as_echo "$ac_var='\''$ac_val'\''" + done | sort + echo + fi + + if test -s confdefs.h; then + $as_echo "## ----------- ## +## confdefs.h. ## +## ----------- ##" + echo + cat confdefs.h + echo + fi + test "$ac_signal" != 0 && + $as_echo "$as_me: caught signal $ac_signal" + $as_echo "$as_me: exit $exit_status" + } >&5 + rm -f core *.core core.conftest.* && + rm -f -r conftest* confdefs* conf$$* $ac_clean_files && + exit $exit_status +' 0 +for ac_signal in 1 2 13 15; do + trap 'ac_signal='$ac_signal'; as_fn_exit 1' $ac_signal +done +ac_signal=0 + +# confdefs.h avoids OS command line length limits that DEFS can exceed. +rm -f -r conftest* confdefs.h + +$as_echo "/* confdefs.h */" > confdefs.h + +# Predefined preprocessor variables. + +cat >>confdefs.h <<_ACEOF +@%:@define PACKAGE_NAME "$PACKAGE_NAME" +_ACEOF + +cat >>confdefs.h <<_ACEOF +@%:@define PACKAGE_TARNAME "$PACKAGE_TARNAME" +_ACEOF + +cat >>confdefs.h <<_ACEOF +@%:@define PACKAGE_VERSION "$PACKAGE_VERSION" +_ACEOF + +cat >>confdefs.h <<_ACEOF +@%:@define PACKAGE_STRING "$PACKAGE_STRING" +_ACEOF + +cat >>confdefs.h <<_ACEOF +@%:@define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT" +_ACEOF + +cat >>confdefs.h <<_ACEOF +@%:@define PACKAGE_URL "$PACKAGE_URL" +_ACEOF + + +# Let the site file select an alternate cache file if it wants to. +# Prefer an explicitly selected file to automatically selected ones. +ac_site_file1=NONE +ac_site_file2=NONE +if test -n "$CONFIG_SITE"; then + # We do not want a PATH search for config.site. + case $CONFIG_SITE in @%:@(( + -*) ac_site_file1=./$CONFIG_SITE;; + */*) ac_site_file1=$CONFIG_SITE;; + *) ac_site_file1=./$CONFIG_SITE;; + esac +elif test "x$prefix" != xNONE; then + ac_site_file1=$prefix/share/config.site + ac_site_file2=$prefix/etc/config.site +else + ac_site_file1=$ac_default_prefix/share/config.site + ac_site_file2=$ac_default_prefix/etc/config.site +fi +for ac_site_file in "$ac_site_file1" "$ac_site_file2" +do + test "x$ac_site_file" = xNONE && continue + if test /dev/null != "$ac_site_file" && test -r "$ac_site_file"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: loading site script $ac_site_file" >&5 +$as_echo "$as_me: loading site script $ac_site_file" >&6;} + sed 's/^/| /' "$ac_site_file" >&5 + . "$ac_site_file" \ + || { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "failed to load site script $ac_site_file +See \`config.log' for more details" "$LINENO" 5; } + fi +done + +if test -r "$cache_file"; then + # Some versions of bash will fail to source /dev/null (special files + # actually), so we avoid doing that. DJGPP emulates it as a regular file. + if test /dev/null != "$cache_file" && test -f "$cache_file"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: loading cache $cache_file" >&5 +$as_echo "$as_me: loading cache $cache_file" >&6;} + case $cache_file in + [\\/]* | ?:[\\/]* ) . "$cache_file";; + *) . "./$cache_file";; + esac + fi +else + { $as_echo "$as_me:${as_lineno-$LINENO}: creating cache $cache_file" >&5 +$as_echo "$as_me: creating cache $cache_file" >&6;} + >$cache_file +fi + +# Check that the precious variables saved in the cache have kept the same +# value. +ac_cache_corrupted=false +for ac_var in $ac_precious_vars; do + eval ac_old_set=\$ac_cv_env_${ac_var}_set + eval ac_new_set=\$ac_env_${ac_var}_set + eval ac_old_val=\$ac_cv_env_${ac_var}_value + eval ac_new_val=\$ac_env_${ac_var}_value + case $ac_old_set,$ac_new_set in + set,) + { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5 +$as_echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;} + ac_cache_corrupted=: ;; + ,set) + { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was not set in the previous run" >&5 +$as_echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;} + ac_cache_corrupted=: ;; + ,);; + *) + if test "x$ac_old_val" != "x$ac_new_val"; then + # differences in whitespace do not lead to failure. + ac_old_val_w=`echo x $ac_old_val` + ac_new_val_w=`echo x $ac_new_val` + if test "$ac_old_val_w" != "$ac_new_val_w"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' has changed since the previous run:" >&5 +$as_echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;} + ac_cache_corrupted=: + else + { $as_echo "$as_me:${as_lineno-$LINENO}: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&5 +$as_echo "$as_me: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&2;} + eval $ac_var=\$ac_old_val + fi + { $as_echo "$as_me:${as_lineno-$LINENO}: former value: \`$ac_old_val'" >&5 +$as_echo "$as_me: former value: \`$ac_old_val'" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: current value: \`$ac_new_val'" >&5 +$as_echo "$as_me: current value: \`$ac_new_val'" >&2;} + fi;; + esac + # Pass precious variables to config.status. + if test "$ac_new_set" = set; then + case $ac_new_val in + *\'*) ac_arg=$ac_var=`$as_echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;; + *) ac_arg=$ac_var=$ac_new_val ;; + esac + case " $ac_configure_args " in + *" '$ac_arg' "*) ;; # Avoid dups. Use of quotes ensures accuracy. + *) as_fn_append ac_configure_args " '$ac_arg'" ;; + esac + fi +done +if $ac_cache_corrupted; then + { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build" >&5 +$as_echo "$as_me: error: changes in the environment can compromise the build" >&2;} + as_fn_error $? "run \`make distclean' and/or \`rm $cache_file' and start over" "$LINENO" 5 +fi +## -------------------- ## +## Main body of script. ## +## -------------------- ## + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + + + +# Save initial CFLAGS and CXXFLAGS values before AC_PROG_CC and AC_PROG_CXX +init_cflags="$CFLAGS" +init_cxxflags="$CXXFLAGS" + +# initialize Doxygen support + + + + + + + + + + +# Files: +DX_PROJECT=zookeeper + +DX_CONFIG=c-doc.Doxyfile + +DX_DOCDIR=docs + + +# Environment variables used inside doxygen.cfg: +DX_ENV="$DX_ENV SRCDIR='$srcdir'" + +DX_ENV="$DX_ENV PROJECT='$DX_PROJECT'" + +DX_ENV="$DX_ENV DOCDIR='$DX_DOCDIR'" + +DX_ENV="$DX_ENV VERSION='$PACKAGE_VERSION'" + + +# Doxygen itself: + + + + @%:@ Check whether --enable-doxygen-doc was given. +if test "${enable_doxygen_doc+set}" = set; then : + enableval=$enable_doxygen_doc; +case "$enableval" in +#( +y|Y|yes|Yes|YES) + DX_FLAG_doc=1 + + +;; #( +n|N|no|No|NO) + DX_FLAG_doc=0 + +;; #( +*) + as_fn_error $? "invalid value '$enableval' given to doxygen-doc" "$LINENO" 5 +;; +esac + +else + +DX_FLAG_doc=1 + + + +fi + +if test "$DX_FLAG_doc" = 1; then + +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}doxygen", so it can be a program name with args. +set dummy ${ac_tool_prefix}doxygen; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_path_DX_DOXYGEN+:} false; then : + $as_echo_n "(cached) " >&6 +else + case $DX_DOXYGEN in + [\\/]* | ?:[\\/]*) + ac_cv_path_DX_DOXYGEN="$DX_DOXYGEN" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_path_DX_DOXYGEN="$as_dir/$ac_word$ac_exec_ext" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + ;; +esac +fi +DX_DOXYGEN=$ac_cv_path_DX_DOXYGEN +if test -n "$DX_DOXYGEN"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DX_DOXYGEN" >&5 +$as_echo "$DX_DOXYGEN" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_path_DX_DOXYGEN"; then + ac_pt_DX_DOXYGEN=$DX_DOXYGEN + # Extract the first word of "doxygen", so it can be a program name with args. +set dummy doxygen; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_path_ac_pt_DX_DOXYGEN+:} false; then : + $as_echo_n "(cached) " >&6 +else + case $ac_pt_DX_DOXYGEN in + [\\/]* | ?:[\\/]*) + ac_cv_path_ac_pt_DX_DOXYGEN="$ac_pt_DX_DOXYGEN" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_path_ac_pt_DX_DOXYGEN="$as_dir/$ac_word$ac_exec_ext" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + ;; +esac +fi +ac_pt_DX_DOXYGEN=$ac_cv_path_ac_pt_DX_DOXYGEN +if test -n "$ac_pt_DX_DOXYGEN"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_pt_DX_DOXYGEN" >&5 +$as_echo "$ac_pt_DX_DOXYGEN" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_pt_DX_DOXYGEN" = x; then + DX_DOXYGEN="" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + DX_DOXYGEN=$ac_pt_DX_DOXYGEN + fi +else + DX_DOXYGEN="$ac_cv_path_DX_DOXYGEN" +fi + +if test "$DX_FLAG_$DX_CURRENT_FEATURE$DX_DOXYGEN" = 1; then + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: doxygen not found - will not generate any doxygen documentation" >&5 +$as_echo "$as_me: WARNING: doxygen not found - will not generate any doxygen documentation" >&2;} + DX_FLAG_doc=0 + +fi + + +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}perl", so it can be a program name with args. +set dummy ${ac_tool_prefix}perl; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_path_DX_PERL+:} false; then : + $as_echo_n "(cached) " >&6 +else + case $DX_PERL in + [\\/]* | ?:[\\/]*) + ac_cv_path_DX_PERL="$DX_PERL" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_path_DX_PERL="$as_dir/$ac_word$ac_exec_ext" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + ;; +esac +fi +DX_PERL=$ac_cv_path_DX_PERL +if test -n "$DX_PERL"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DX_PERL" >&5 +$as_echo "$DX_PERL" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_path_DX_PERL"; then + ac_pt_DX_PERL=$DX_PERL + # Extract the first word of "perl", so it can be a program name with args. +set dummy perl; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_path_ac_pt_DX_PERL+:} false; then : + $as_echo_n "(cached) " >&6 +else + case $ac_pt_DX_PERL in + [\\/]* | ?:[\\/]*) + ac_cv_path_ac_pt_DX_PERL="$ac_pt_DX_PERL" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_path_ac_pt_DX_PERL="$as_dir/$ac_word$ac_exec_ext" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + ;; +esac +fi +ac_pt_DX_PERL=$ac_cv_path_ac_pt_DX_PERL +if test -n "$ac_pt_DX_PERL"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_pt_DX_PERL" >&5 +$as_echo "$ac_pt_DX_PERL" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_pt_DX_PERL" = x; then + DX_PERL="" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + DX_PERL=$ac_pt_DX_PERL + fi +else + DX_PERL="$ac_cv_path_DX_PERL" +fi + +if test "$DX_FLAG_$DX_CURRENT_FEATURE$DX_PERL" = 1; then + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: perl not found - will not generate any doxygen documentation" >&5 +$as_echo "$as_me: WARNING: perl not found - will not generate any doxygen documentation" >&2;} + DX_FLAG_doc=0 + +fi + + : +fi +if test "$DX_FLAG_doc" = 1; then + if :; then + DX_COND_doc_TRUE= + DX_COND_doc_FALSE='#' +else + DX_COND_doc_TRUE='#' + DX_COND_doc_FALSE= +fi + + DX_ENV="$DX_ENV PERL_PATH='$DX_PERL'" + + : +else + if false; then + DX_COND_doc_TRUE= + DX_COND_doc_FALSE='#' +else + DX_COND_doc_TRUE='#' + DX_COND_doc_FALSE= +fi + + + : +fi + + +# Dot for graphics: + + + + @%:@ Check whether --enable-doxygen-dot was given. +if test "${enable_doxygen_dot+set}" = set; then : + enableval=$enable_doxygen_dot; +case "$enableval" in +#( +y|Y|yes|Yes|YES) + DX_FLAG_dot=1 + + +test "$DX_FLAG_doc" = "1" \ +|| as_fn_error $? "doxygen-dot requires doxygen-dot" "$LINENO" 5 + +;; #( +n|N|no|No|NO) + DX_FLAG_dot=0 + +;; #( +*) + as_fn_error $? "invalid value '$enableval' given to doxygen-dot" "$LINENO" 5 +;; +esac + +else + +DX_FLAG_dot=1 + + +test "$DX_FLAG_doc" = "1" || DX_FLAG_dot=0 + + + +fi + +if test "$DX_FLAG_dot" = 1; then + +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}dot", so it can be a program name with args. +set dummy ${ac_tool_prefix}dot; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_path_DX_DOT+:} false; then : + $as_echo_n "(cached) " >&6 +else + case $DX_DOT in + [\\/]* | ?:[\\/]*) + ac_cv_path_DX_DOT="$DX_DOT" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_path_DX_DOT="$as_dir/$ac_word$ac_exec_ext" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + ;; +esac +fi +DX_DOT=$ac_cv_path_DX_DOT +if test -n "$DX_DOT"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DX_DOT" >&5 +$as_echo "$DX_DOT" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_path_DX_DOT"; then + ac_pt_DX_DOT=$DX_DOT + # Extract the first word of "dot", so it can be a program name with args. +set dummy dot; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_path_ac_pt_DX_DOT+:} false; then : + $as_echo_n "(cached) " >&6 +else + case $ac_pt_DX_DOT in + [\\/]* | ?:[\\/]*) + ac_cv_path_ac_pt_DX_DOT="$ac_pt_DX_DOT" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_path_ac_pt_DX_DOT="$as_dir/$ac_word$ac_exec_ext" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + ;; +esac +fi +ac_pt_DX_DOT=$ac_cv_path_ac_pt_DX_DOT +if test -n "$ac_pt_DX_DOT"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_pt_DX_DOT" >&5 +$as_echo "$ac_pt_DX_DOT" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_pt_DX_DOT" = x; then + DX_DOT="" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + DX_DOT=$ac_pt_DX_DOT + fi +else + DX_DOT="$ac_cv_path_DX_DOT" +fi + +if test "$DX_FLAG_$DX_CURRENT_FEATURE$DX_DOT" = 1; then + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: dot not found - will not generate graphics for doxygen documentation" >&5 +$as_echo "$as_me: WARNING: dot not found - will not generate graphics for doxygen documentation" >&2;} + DX_FLAG_dot=0 + +fi + + : +fi +if test "$DX_FLAG_dot" = 1; then + if :; then + DX_COND_dot_TRUE= + DX_COND_dot_FALSE='#' +else + DX_COND_dot_TRUE='#' + DX_COND_dot_FALSE= +fi + + DX_ENV="$DX_ENV HAVE_DOT='YES'" + + DX_ENV="$DX_ENV DOT_PATH='`expr ".$DX_DOT" : '\(\.\)[^/]*$' \| "x$DX_DOT" : 'x\(.*\)/[^/]*$'`'" + + : +else + if false; then + DX_COND_dot_TRUE= + DX_COND_dot_FALSE='#' +else + DX_COND_dot_TRUE='#' + DX_COND_dot_FALSE= +fi + + DX_ENV="$DX_ENV HAVE_DOT='NO'" + + : +fi + + +# Man pages generation: + + + + @%:@ Check whether --enable-doxygen-man was given. +if test "${enable_doxygen_man+set}" = set; then : + enableval=$enable_doxygen_man; +case "$enableval" in +#( +y|Y|yes|Yes|YES) + DX_FLAG_man=1 + + +test "$DX_FLAG_doc" = "1" \ +|| as_fn_error $? "doxygen-man requires doxygen-man" "$LINENO" 5 + +;; #( +n|N|no|No|NO) + DX_FLAG_man=0 + +;; #( +*) + as_fn_error $? "invalid value '$enableval' given to doxygen-man" "$LINENO" 5 +;; +esac + +else + +DX_FLAG_man=0 + + +test "$DX_FLAG_doc" = "1" || DX_FLAG_man=0 + + + +fi + +if test "$DX_FLAG_man" = 1; then + + : +fi +if test "$DX_FLAG_man" = 1; then + if :; then + DX_COND_man_TRUE= + DX_COND_man_FALSE='#' +else + DX_COND_man_TRUE='#' + DX_COND_man_FALSE= +fi + + DX_ENV="$DX_ENV GENERATE_MAN='YES'" + + : +else + if false; then + DX_COND_man_TRUE= + DX_COND_man_FALSE='#' +else + DX_COND_man_TRUE='#' + DX_COND_man_FALSE= +fi + + DX_ENV="$DX_ENV GENERATE_MAN='NO'" + + : +fi + + +# RTF file generation: + + + + @%:@ Check whether --enable-doxygen-rtf was given. +if test "${enable_doxygen_rtf+set}" = set; then : + enableval=$enable_doxygen_rtf; +case "$enableval" in +#( +y|Y|yes|Yes|YES) + DX_FLAG_rtf=1 + + +test "$DX_FLAG_doc" = "1" \ +|| as_fn_error $? "doxygen-rtf requires doxygen-rtf" "$LINENO" 5 + +;; #( +n|N|no|No|NO) + DX_FLAG_rtf=0 + +;; #( +*) + as_fn_error $? "invalid value '$enableval' given to doxygen-rtf" "$LINENO" 5 +;; +esac + +else + +DX_FLAG_rtf=0 + + +test "$DX_FLAG_doc" = "1" || DX_FLAG_rtf=0 + + + +fi + +if test "$DX_FLAG_rtf" = 1; then + + : +fi +if test "$DX_FLAG_rtf" = 1; then + if :; then + DX_COND_rtf_TRUE= + DX_COND_rtf_FALSE='#' +else + DX_COND_rtf_TRUE='#' + DX_COND_rtf_FALSE= +fi + + DX_ENV="$DX_ENV GENERATE_RTF='YES'" + + : +else + if false; then + DX_COND_rtf_TRUE= + DX_COND_rtf_FALSE='#' +else + DX_COND_rtf_TRUE='#' + DX_COND_rtf_FALSE= +fi + + DX_ENV="$DX_ENV GENERATE_RTF='NO'" + + : +fi + + +# XML file generation: + + + + @%:@ Check whether --enable-doxygen-xml was given. +if test "${enable_doxygen_xml+set}" = set; then : + enableval=$enable_doxygen_xml; +case "$enableval" in +#( +y|Y|yes|Yes|YES) + DX_FLAG_xml=1 + + +test "$DX_FLAG_doc" = "1" \ +|| as_fn_error $? "doxygen-xml requires doxygen-xml" "$LINENO" 5 + +;; #( +n|N|no|No|NO) + DX_FLAG_xml=0 + +;; #( +*) + as_fn_error $? "invalid value '$enableval' given to doxygen-xml" "$LINENO" 5 +;; +esac + +else + +DX_FLAG_xml=0 + + +test "$DX_FLAG_doc" = "1" || DX_FLAG_xml=0 + + + +fi + +if test "$DX_FLAG_xml" = 1; then + + : +fi +if test "$DX_FLAG_xml" = 1; then + if :; then + DX_COND_xml_TRUE= + DX_COND_xml_FALSE='#' +else + DX_COND_xml_TRUE='#' + DX_COND_xml_FALSE= +fi + + DX_ENV="$DX_ENV GENERATE_XML='YES'" + + : +else + if false; then + DX_COND_xml_TRUE= + DX_COND_xml_FALSE='#' +else + DX_COND_xml_TRUE='#' + DX_COND_xml_FALSE= +fi + + DX_ENV="$DX_ENV GENERATE_XML='NO'" + + : +fi + + +# (Compressed) HTML help generation: + + + + @%:@ Check whether --enable-doxygen-chm was given. +if test "${enable_doxygen_chm+set}" = set; then : + enableval=$enable_doxygen_chm; +case "$enableval" in +#( +y|Y|yes|Yes|YES) + DX_FLAG_chm=1 + + +test "$DX_FLAG_doc" = "1" \ +|| as_fn_error $? "doxygen-chm requires doxygen-chm" "$LINENO" 5 + +;; #( +n|N|no|No|NO) + DX_FLAG_chm=0 + +;; #( +*) + as_fn_error $? "invalid value '$enableval' given to doxygen-chm" "$LINENO" 5 +;; +esac + +else + +DX_FLAG_chm=0 + + +test "$DX_FLAG_doc" = "1" || DX_FLAG_chm=0 + + + +fi + +if test "$DX_FLAG_chm" = 1; then + +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}hhc", so it can be a program name with args. +set dummy ${ac_tool_prefix}hhc; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_path_DX_HHC+:} false; then : + $as_echo_n "(cached) " >&6 +else + case $DX_HHC in + [\\/]* | ?:[\\/]*) + ac_cv_path_DX_HHC="$DX_HHC" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_path_DX_HHC="$as_dir/$ac_word$ac_exec_ext" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + ;; +esac +fi +DX_HHC=$ac_cv_path_DX_HHC +if test -n "$DX_HHC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DX_HHC" >&5 +$as_echo "$DX_HHC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_path_DX_HHC"; then + ac_pt_DX_HHC=$DX_HHC + # Extract the first word of "hhc", so it can be a program name with args. +set dummy hhc; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_path_ac_pt_DX_HHC+:} false; then : + $as_echo_n "(cached) " >&6 +else + case $ac_pt_DX_HHC in + [\\/]* | ?:[\\/]*) + ac_cv_path_ac_pt_DX_HHC="$ac_pt_DX_HHC" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_path_ac_pt_DX_HHC="$as_dir/$ac_word$ac_exec_ext" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + ;; +esac +fi +ac_pt_DX_HHC=$ac_cv_path_ac_pt_DX_HHC +if test -n "$ac_pt_DX_HHC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_pt_DX_HHC" >&5 +$as_echo "$ac_pt_DX_HHC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_pt_DX_HHC" = x; then + DX_HHC="" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + DX_HHC=$ac_pt_DX_HHC + fi +else + DX_HHC="$ac_cv_path_DX_HHC" +fi + +if test "$DX_FLAG_$DX_CURRENT_FEATURE$DX_HHC" = 1; then + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: hhc not found - will not generate doxygen compressed HTML help documentation" >&5 +$as_echo "$as_me: WARNING: hhc not found - will not generate doxygen compressed HTML help documentation" >&2;} + DX_FLAG_chm=0 + +fi + + : +fi +if test "$DX_FLAG_chm" = 1; then + if :; then + DX_COND_chm_TRUE= + DX_COND_chm_FALSE='#' +else + DX_COND_chm_TRUE='#' + DX_COND_chm_FALSE= +fi + + DX_ENV="$DX_ENV HHC_PATH='$DX_HHC'" + + DX_ENV="$DX_ENV GENERATE_HTML='YES'" + + DX_ENV="$DX_ENV GENERATE_HTMLHELP='YES'" + + : +else + if false; then + DX_COND_chm_TRUE= + DX_COND_chm_FALSE='#' +else + DX_COND_chm_TRUE='#' + DX_COND_chm_FALSE= +fi + + DX_ENV="$DX_ENV GENERATE_HTMLHELP='NO'" + + : +fi + + +# Seperate CHI file generation. + + + + @%:@ Check whether --enable-doxygen-chi was given. +if test "${enable_doxygen_chi+set}" = set; then : + enableval=$enable_doxygen_chi; +case "$enableval" in +#( +y|Y|yes|Yes|YES) + DX_FLAG_chi=1 + + +test "$DX_FLAG_chm" = "1" \ +|| as_fn_error $? "doxygen-chi requires doxygen-chi" "$LINENO" 5 + +;; #( +n|N|no|No|NO) + DX_FLAG_chi=0 + +;; #( +*) + as_fn_error $? "invalid value '$enableval' given to doxygen-chi" "$LINENO" 5 +;; +esac + +else + +DX_FLAG_chi=0 + + +test "$DX_FLAG_chm" = "1" || DX_FLAG_chi=0 + + + +fi + +if test "$DX_FLAG_chi" = 1; then + + : +fi +if test "$DX_FLAG_chi" = 1; then + if :; then + DX_COND_chi_TRUE= + DX_COND_chi_FALSE='#' +else + DX_COND_chi_TRUE='#' + DX_COND_chi_FALSE= +fi + + DX_ENV="$DX_ENV GENERATE_CHI='YES'" + + : +else + if false; then + DX_COND_chi_TRUE= + DX_COND_chi_FALSE='#' +else + DX_COND_chi_TRUE='#' + DX_COND_chi_FALSE= +fi + + DX_ENV="$DX_ENV GENERATE_CHI='NO'" + + : +fi + + +# Plain HTML pages generation: + + + + @%:@ Check whether --enable-doxygen-html was given. +if test "${enable_doxygen_html+set}" = set; then : + enableval=$enable_doxygen_html; +case "$enableval" in +#( +y|Y|yes|Yes|YES) + DX_FLAG_html=1 + + +test "$DX_FLAG_doc" = "1" \ +|| as_fn_error $? "doxygen-html requires doxygen-html" "$LINENO" 5 + +test "$DX_FLAG_chm" = "0" \ +|| as_fn_error $? "doxygen-html contradicts doxygen-html" "$LINENO" 5 + +;; #( +n|N|no|No|NO) + DX_FLAG_html=0 + +;; #( +*) + as_fn_error $? "invalid value '$enableval' given to doxygen-html" "$LINENO" 5 +;; +esac + +else + +DX_FLAG_html=1 + + +test "$DX_FLAG_doc" = "1" || DX_FLAG_html=0 + + +test "$DX_FLAG_chm" = "0" || DX_FLAG_html=0 + + + +fi + +if test "$DX_FLAG_html" = 1; then + + : +fi +if test "$DX_FLAG_html" = 1; then + if :; then + DX_COND_html_TRUE= + DX_COND_html_FALSE='#' +else + DX_COND_html_TRUE='#' + DX_COND_html_FALSE= +fi + + DX_ENV="$DX_ENV GENERATE_HTML='YES'" + + : +else + if false; then + DX_COND_html_TRUE= + DX_COND_html_FALSE='#' +else + DX_COND_html_TRUE='#' + DX_COND_html_FALSE= +fi + + test "$DX_FLAG_chm" = 1 || DX_ENV="$DX_ENV GENERATE_HTML='NO'" + + : +fi + + +# PostScript file generation: + + + + @%:@ Check whether --enable-doxygen-ps was given. +if test "${enable_doxygen_ps+set}" = set; then : + enableval=$enable_doxygen_ps; +case "$enableval" in +#( +y|Y|yes|Yes|YES) + DX_FLAG_ps=1 + + +test "$DX_FLAG_doc" = "1" \ +|| as_fn_error $? "doxygen-ps requires doxygen-ps" "$LINENO" 5 + +;; #( +n|N|no|No|NO) + DX_FLAG_ps=0 + +;; #( +*) + as_fn_error $? "invalid value '$enableval' given to doxygen-ps" "$LINENO" 5 +;; +esac + +else + +DX_FLAG_ps=0 + + +test "$DX_FLAG_doc" = "1" || DX_FLAG_ps=0 + + + +fi + +if test "$DX_FLAG_ps" = 1; then + +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}latex", so it can be a program name with args. +set dummy ${ac_tool_prefix}latex; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_path_DX_LATEX+:} false; then : + $as_echo_n "(cached) " >&6 +else + case $DX_LATEX in + [\\/]* | ?:[\\/]*) + ac_cv_path_DX_LATEX="$DX_LATEX" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_path_DX_LATEX="$as_dir/$ac_word$ac_exec_ext" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + ;; +esac +fi +DX_LATEX=$ac_cv_path_DX_LATEX +if test -n "$DX_LATEX"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DX_LATEX" >&5 +$as_echo "$DX_LATEX" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_path_DX_LATEX"; then + ac_pt_DX_LATEX=$DX_LATEX + # Extract the first word of "latex", so it can be a program name with args. +set dummy latex; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_path_ac_pt_DX_LATEX+:} false; then : + $as_echo_n "(cached) " >&6 +else + case $ac_pt_DX_LATEX in + [\\/]* | ?:[\\/]*) + ac_cv_path_ac_pt_DX_LATEX="$ac_pt_DX_LATEX" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_path_ac_pt_DX_LATEX="$as_dir/$ac_word$ac_exec_ext" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + ;; +esac +fi +ac_pt_DX_LATEX=$ac_cv_path_ac_pt_DX_LATEX +if test -n "$ac_pt_DX_LATEX"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_pt_DX_LATEX" >&5 +$as_echo "$ac_pt_DX_LATEX" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_pt_DX_LATEX" = x; then + DX_LATEX="" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + DX_LATEX=$ac_pt_DX_LATEX + fi +else + DX_LATEX="$ac_cv_path_DX_LATEX" +fi + +if test "$DX_FLAG_$DX_CURRENT_FEATURE$DX_LATEX" = 1; then + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: latex not found - will not generate doxygen PostScript documentation" >&5 +$as_echo "$as_me: WARNING: latex not found - will not generate doxygen PostScript documentation" >&2;} + DX_FLAG_ps=0 + +fi + + +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}makeindex", so it can be a program name with args. +set dummy ${ac_tool_prefix}makeindex; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_path_DX_MAKEINDEX+:} false; then : + $as_echo_n "(cached) " >&6 +else + case $DX_MAKEINDEX in + [\\/]* | ?:[\\/]*) + ac_cv_path_DX_MAKEINDEX="$DX_MAKEINDEX" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_path_DX_MAKEINDEX="$as_dir/$ac_word$ac_exec_ext" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + ;; +esac +fi +DX_MAKEINDEX=$ac_cv_path_DX_MAKEINDEX +if test -n "$DX_MAKEINDEX"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DX_MAKEINDEX" >&5 +$as_echo "$DX_MAKEINDEX" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_path_DX_MAKEINDEX"; then + ac_pt_DX_MAKEINDEX=$DX_MAKEINDEX + # Extract the first word of "makeindex", so it can be a program name with args. +set dummy makeindex; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_path_ac_pt_DX_MAKEINDEX+:} false; then : + $as_echo_n "(cached) " >&6 +else + case $ac_pt_DX_MAKEINDEX in + [\\/]* | ?:[\\/]*) + ac_cv_path_ac_pt_DX_MAKEINDEX="$ac_pt_DX_MAKEINDEX" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_path_ac_pt_DX_MAKEINDEX="$as_dir/$ac_word$ac_exec_ext" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + ;; +esac +fi +ac_pt_DX_MAKEINDEX=$ac_cv_path_ac_pt_DX_MAKEINDEX +if test -n "$ac_pt_DX_MAKEINDEX"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_pt_DX_MAKEINDEX" >&5 +$as_echo "$ac_pt_DX_MAKEINDEX" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_pt_DX_MAKEINDEX" = x; then + DX_MAKEINDEX="" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + DX_MAKEINDEX=$ac_pt_DX_MAKEINDEX + fi +else + DX_MAKEINDEX="$ac_cv_path_DX_MAKEINDEX" +fi + +if test "$DX_FLAG_$DX_CURRENT_FEATURE$DX_MAKEINDEX" = 1; then + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: makeindex not found - will not generate doxygen PostScript documentation" >&5 +$as_echo "$as_me: WARNING: makeindex not found - will not generate doxygen PostScript documentation" >&2;} + DX_FLAG_ps=0 + +fi + + +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}dvips", so it can be a program name with args. +set dummy ${ac_tool_prefix}dvips; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_path_DX_DVIPS+:} false; then : + $as_echo_n "(cached) " >&6 +else + case $DX_DVIPS in + [\\/]* | ?:[\\/]*) + ac_cv_path_DX_DVIPS="$DX_DVIPS" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_path_DX_DVIPS="$as_dir/$ac_word$ac_exec_ext" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + ;; +esac +fi +DX_DVIPS=$ac_cv_path_DX_DVIPS +if test -n "$DX_DVIPS"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DX_DVIPS" >&5 +$as_echo "$DX_DVIPS" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_path_DX_DVIPS"; then + ac_pt_DX_DVIPS=$DX_DVIPS + # Extract the first word of "dvips", so it can be a program name with args. +set dummy dvips; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_path_ac_pt_DX_DVIPS+:} false; then : + $as_echo_n "(cached) " >&6 +else + case $ac_pt_DX_DVIPS in + [\\/]* | ?:[\\/]*) + ac_cv_path_ac_pt_DX_DVIPS="$ac_pt_DX_DVIPS" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_path_ac_pt_DX_DVIPS="$as_dir/$ac_word$ac_exec_ext" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + ;; +esac +fi +ac_pt_DX_DVIPS=$ac_cv_path_ac_pt_DX_DVIPS +if test -n "$ac_pt_DX_DVIPS"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_pt_DX_DVIPS" >&5 +$as_echo "$ac_pt_DX_DVIPS" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_pt_DX_DVIPS" = x; then + DX_DVIPS="" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + DX_DVIPS=$ac_pt_DX_DVIPS + fi +else + DX_DVIPS="$ac_cv_path_DX_DVIPS" +fi + +if test "$DX_FLAG_$DX_CURRENT_FEATURE$DX_DVIPS" = 1; then + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: dvips not found - will not generate doxygen PostScript documentation" >&5 +$as_echo "$as_me: WARNING: dvips not found - will not generate doxygen PostScript documentation" >&2;} + DX_FLAG_ps=0 + +fi + + +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}egrep", so it can be a program name with args. +set dummy ${ac_tool_prefix}egrep; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_path_DX_EGREP+:} false; then : + $as_echo_n "(cached) " >&6 +else + case $DX_EGREP in + [\\/]* | ?:[\\/]*) + ac_cv_path_DX_EGREP="$DX_EGREP" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_path_DX_EGREP="$as_dir/$ac_word$ac_exec_ext" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + ;; +esac +fi +DX_EGREP=$ac_cv_path_DX_EGREP +if test -n "$DX_EGREP"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DX_EGREP" >&5 +$as_echo "$DX_EGREP" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_path_DX_EGREP"; then + ac_pt_DX_EGREP=$DX_EGREP + # Extract the first word of "egrep", so it can be a program name with args. +set dummy egrep; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_path_ac_pt_DX_EGREP+:} false; then : + $as_echo_n "(cached) " >&6 +else + case $ac_pt_DX_EGREP in + [\\/]* | ?:[\\/]*) + ac_cv_path_ac_pt_DX_EGREP="$ac_pt_DX_EGREP" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_path_ac_pt_DX_EGREP="$as_dir/$ac_word$ac_exec_ext" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + ;; +esac +fi +ac_pt_DX_EGREP=$ac_cv_path_ac_pt_DX_EGREP +if test -n "$ac_pt_DX_EGREP"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_pt_DX_EGREP" >&5 +$as_echo "$ac_pt_DX_EGREP" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_pt_DX_EGREP" = x; then + DX_EGREP="" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + DX_EGREP=$ac_pt_DX_EGREP + fi +else + DX_EGREP="$ac_cv_path_DX_EGREP" +fi + +if test "$DX_FLAG_$DX_CURRENT_FEATURE$DX_EGREP" = 1; then + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: egrep not found - will not generate doxygen PostScript documentation" >&5 +$as_echo "$as_me: WARNING: egrep not found - will not generate doxygen PostScript documentation" >&2;} + DX_FLAG_ps=0 + +fi + + : +fi +if test "$DX_FLAG_ps" = 1; then + if :; then + DX_COND_ps_TRUE= + DX_COND_ps_FALSE='#' +else + DX_COND_ps_TRUE='#' + DX_COND_ps_FALSE= +fi + + + : +else + if false; then + DX_COND_ps_TRUE= + DX_COND_ps_FALSE='#' +else + DX_COND_ps_TRUE='#' + DX_COND_ps_FALSE= +fi + + + : +fi + + +# PDF file generation: + + + + @%:@ Check whether --enable-doxygen-pdf was given. +if test "${enable_doxygen_pdf+set}" = set; then : + enableval=$enable_doxygen_pdf; +case "$enableval" in +#( +y|Y|yes|Yes|YES) + DX_FLAG_pdf=1 + + +test "$DX_FLAG_doc" = "1" \ +|| as_fn_error $? "doxygen-pdf requires doxygen-pdf" "$LINENO" 5 + +;; #( +n|N|no|No|NO) + DX_FLAG_pdf=0 + +;; #( +*) + as_fn_error $? "invalid value '$enableval' given to doxygen-pdf" "$LINENO" 5 +;; +esac + +else + +DX_FLAG_pdf=0 + + +test "$DX_FLAG_doc" = "1" || DX_FLAG_pdf=0 + + + +fi + +if test "$DX_FLAG_pdf" = 1; then + +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}pdflatex", so it can be a program name with args. +set dummy ${ac_tool_prefix}pdflatex; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_path_DX_PDFLATEX+:} false; then : + $as_echo_n "(cached) " >&6 +else + case $DX_PDFLATEX in + [\\/]* | ?:[\\/]*) + ac_cv_path_DX_PDFLATEX="$DX_PDFLATEX" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_path_DX_PDFLATEX="$as_dir/$ac_word$ac_exec_ext" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + ;; +esac +fi +DX_PDFLATEX=$ac_cv_path_DX_PDFLATEX +if test -n "$DX_PDFLATEX"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DX_PDFLATEX" >&5 +$as_echo "$DX_PDFLATEX" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_path_DX_PDFLATEX"; then + ac_pt_DX_PDFLATEX=$DX_PDFLATEX + # Extract the first word of "pdflatex", so it can be a program name with args. +set dummy pdflatex; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_path_ac_pt_DX_PDFLATEX+:} false; then : + $as_echo_n "(cached) " >&6 +else + case $ac_pt_DX_PDFLATEX in + [\\/]* | ?:[\\/]*) + ac_cv_path_ac_pt_DX_PDFLATEX="$ac_pt_DX_PDFLATEX" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_path_ac_pt_DX_PDFLATEX="$as_dir/$ac_word$ac_exec_ext" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + ;; +esac +fi +ac_pt_DX_PDFLATEX=$ac_cv_path_ac_pt_DX_PDFLATEX +if test -n "$ac_pt_DX_PDFLATEX"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_pt_DX_PDFLATEX" >&5 +$as_echo "$ac_pt_DX_PDFLATEX" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_pt_DX_PDFLATEX" = x; then + DX_PDFLATEX="" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + DX_PDFLATEX=$ac_pt_DX_PDFLATEX + fi +else + DX_PDFLATEX="$ac_cv_path_DX_PDFLATEX" +fi + +if test "$DX_FLAG_$DX_CURRENT_FEATURE$DX_PDFLATEX" = 1; then + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: pdflatex not found - will not generate doxygen PDF documentation" >&5 +$as_echo "$as_me: WARNING: pdflatex not found - will not generate doxygen PDF documentation" >&2;} + DX_FLAG_pdf=0 + +fi + + +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}makeindex", so it can be a program name with args. +set dummy ${ac_tool_prefix}makeindex; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_path_DX_MAKEINDEX+:} false; then : + $as_echo_n "(cached) " >&6 +else + case $DX_MAKEINDEX in + [\\/]* | ?:[\\/]*) + ac_cv_path_DX_MAKEINDEX="$DX_MAKEINDEX" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_path_DX_MAKEINDEX="$as_dir/$ac_word$ac_exec_ext" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + ;; +esac +fi +DX_MAKEINDEX=$ac_cv_path_DX_MAKEINDEX +if test -n "$DX_MAKEINDEX"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DX_MAKEINDEX" >&5 +$as_echo "$DX_MAKEINDEX" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_path_DX_MAKEINDEX"; then + ac_pt_DX_MAKEINDEX=$DX_MAKEINDEX + # Extract the first word of "makeindex", so it can be a program name with args. +set dummy makeindex; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_path_ac_pt_DX_MAKEINDEX+:} false; then : + $as_echo_n "(cached) " >&6 +else + case $ac_pt_DX_MAKEINDEX in + [\\/]* | ?:[\\/]*) + ac_cv_path_ac_pt_DX_MAKEINDEX="$ac_pt_DX_MAKEINDEX" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_path_ac_pt_DX_MAKEINDEX="$as_dir/$ac_word$ac_exec_ext" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + ;; +esac +fi +ac_pt_DX_MAKEINDEX=$ac_cv_path_ac_pt_DX_MAKEINDEX +if test -n "$ac_pt_DX_MAKEINDEX"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_pt_DX_MAKEINDEX" >&5 +$as_echo "$ac_pt_DX_MAKEINDEX" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_pt_DX_MAKEINDEX" = x; then + DX_MAKEINDEX="" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + DX_MAKEINDEX=$ac_pt_DX_MAKEINDEX + fi +else + DX_MAKEINDEX="$ac_cv_path_DX_MAKEINDEX" +fi + +if test "$DX_FLAG_$DX_CURRENT_FEATURE$DX_MAKEINDEX" = 1; then + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: makeindex not found - will not generate doxygen PDF documentation" >&5 +$as_echo "$as_me: WARNING: makeindex not found - will not generate doxygen PDF documentation" >&2;} + DX_FLAG_pdf=0 + +fi + + +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}egrep", so it can be a program name with args. +set dummy ${ac_tool_prefix}egrep; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_path_DX_EGREP+:} false; then : + $as_echo_n "(cached) " >&6 +else + case $DX_EGREP in + [\\/]* | ?:[\\/]*) + ac_cv_path_DX_EGREP="$DX_EGREP" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_path_DX_EGREP="$as_dir/$ac_word$ac_exec_ext" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + ;; +esac +fi +DX_EGREP=$ac_cv_path_DX_EGREP +if test -n "$DX_EGREP"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DX_EGREP" >&5 +$as_echo "$DX_EGREP" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_path_DX_EGREP"; then + ac_pt_DX_EGREP=$DX_EGREP + # Extract the first word of "egrep", so it can be a program name with args. +set dummy egrep; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_path_ac_pt_DX_EGREP+:} false; then : + $as_echo_n "(cached) " >&6 +else + case $ac_pt_DX_EGREP in + [\\/]* | ?:[\\/]*) + ac_cv_path_ac_pt_DX_EGREP="$ac_pt_DX_EGREP" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_path_ac_pt_DX_EGREP="$as_dir/$ac_word$ac_exec_ext" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + ;; +esac +fi +ac_pt_DX_EGREP=$ac_cv_path_ac_pt_DX_EGREP +if test -n "$ac_pt_DX_EGREP"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_pt_DX_EGREP" >&5 +$as_echo "$ac_pt_DX_EGREP" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_pt_DX_EGREP" = x; then + DX_EGREP="" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + DX_EGREP=$ac_pt_DX_EGREP + fi +else + DX_EGREP="$ac_cv_path_DX_EGREP" +fi + +if test "$DX_FLAG_$DX_CURRENT_FEATURE$DX_EGREP" = 1; then + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: egrep not found - will not generate doxygen PDF documentation" >&5 +$as_echo "$as_me: WARNING: egrep not found - will not generate doxygen PDF documentation" >&2;} + DX_FLAG_pdf=0 + +fi + + : +fi +if test "$DX_FLAG_pdf" = 1; then + if :; then + DX_COND_pdf_TRUE= + DX_COND_pdf_FALSE='#' +else + DX_COND_pdf_TRUE='#' + DX_COND_pdf_FALSE= +fi + + + : +else + if false; then + DX_COND_pdf_TRUE= + DX_COND_pdf_FALSE='#' +else + DX_COND_pdf_TRUE='#' + DX_COND_pdf_FALSE= +fi + + + : +fi + + +# LaTeX generation for PS and/or PDF: +if test "$DX_FLAG_ps" = 1 || test "$DX_FLAG_pdf" = 1; then + if :; then + DX_COND_latex_TRUE= + DX_COND_latex_FALSE='#' +else + DX_COND_latex_TRUE='#' + DX_COND_latex_FALSE= +fi + + DX_ENV="$DX_ENV GENERATE_LATEX='YES'" + +else + if false; then + DX_COND_latex_TRUE= + DX_COND_latex_FALSE='#' +else + DX_COND_latex_TRUE='#' + DX_COND_latex_FALSE= +fi + + DX_ENV="$DX_ENV GENERATE_LATEX='NO'" + +fi + +# Paper size for PS and/or PDF: + +case "$DOXYGEN_PAPER_SIZE" in +#( +"") + DOXYGEN_PAPER_SIZE="" + +;; #( +a4wide|a4|letter|legal|executive) + DX_ENV="$DX_ENV PAPER_SIZE='$DOXYGEN_PAPER_SIZE'" + +;; #( +*) + as_fn_error $? "unknown DOXYGEN_PAPER_SIZE='$DOXYGEN_PAPER_SIZE'" "$LINENO" 5 +;; +esac + +#For debugging: +#echo DX_FLAG_doc=$DX_FLAG_doc +#echo DX_FLAG_dot=$DX_FLAG_dot +#echo DX_FLAG_man=$DX_FLAG_man +#echo DX_FLAG_html=$DX_FLAG_html +#echo DX_FLAG_chm=$DX_FLAG_chm +#echo DX_FLAG_chi=$DX_FLAG_chi +#echo DX_FLAG_rtf=$DX_FLAG_rtf +#echo DX_FLAG_xml=$DX_FLAG_xml +#echo DX_FLAG_pdf=$DX_FLAG_pdf +#echo DX_FLAG_ps=$DX_FLAG_ps +#echo DX_ENV=$DX_ENV + + +# initialize automake +am__api_version='1.11' + +ac_aux_dir= +for ac_dir in "$srcdir" "$srcdir/.." "$srcdir/../.."; do + if test -f "$ac_dir/install-sh"; then + ac_aux_dir=$ac_dir + ac_install_sh="$ac_aux_dir/install-sh -c" + break + elif test -f "$ac_dir/install.sh"; then + ac_aux_dir=$ac_dir + ac_install_sh="$ac_aux_dir/install.sh -c" + break + elif test -f "$ac_dir/shtool"; then + ac_aux_dir=$ac_dir + ac_install_sh="$ac_aux_dir/shtool install -c" + break + fi +done +if test -z "$ac_aux_dir"; then + as_fn_error $? "cannot find install-sh, install.sh, or shtool in \"$srcdir\" \"$srcdir/..\" \"$srcdir/../..\"" "$LINENO" 5 +fi + +# These three variables are undocumented and unsupported, +# and are intended to be withdrawn in a future Autoconf release. +# They can cause serious problems if a builder's source tree is in a directory +# whose full name contains unusual characters. +ac_config_guess="$SHELL $ac_aux_dir/config.guess" # Please don't use this var. +ac_config_sub="$SHELL $ac_aux_dir/config.sub" # Please don't use this var. +ac_configure="$SHELL $ac_aux_dir/configure" # Please don't use this var. + + +# Find a good install program. We prefer a C program (faster), +# so one script is as good as another. But avoid the broken or +# incompatible versions: +# SysV /etc/install, /usr/sbin/install +# SunOS /usr/etc/install +# IRIX /sbin/install +# AIX /bin/install +# AmigaOS /C/install, which installs bootblocks on floppy discs +# AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag +# AFS /usr/afsws/bin/install, which mishandles nonexistent args +# SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff" +# OS/2's system install, which has a completely different semantic +# ./install, which can be erroneously created by make from ./install.sh. +# Reject install programs that cannot install multiple files. +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a BSD-compatible install" >&5 +$as_echo_n "checking for a BSD-compatible install... " >&6; } +if test -z "$INSTALL"; then +if ${ac_cv_path_install+:} false; then : + $as_echo_n "(cached) " >&6 +else + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + # Account for people who put trailing slashes in PATH elements. +case $as_dir/ in @%:@(( + ./ | .// | /[cC]/* | \ + /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \ + ?:[\\/]os2[\\/]install[\\/]* | ?:[\\/]OS2[\\/]INSTALL[\\/]* | \ + /usr/ucb/* ) ;; + *) + # OSF1 and SCO ODT 3.0 have their own names for install. + # Don't use installbsd from OSF since it installs stuff as root + # by default. + for ac_prog in ginstall scoinst install; do + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_prog$ac_exec_ext"; then + if test $ac_prog = install && + grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then + # AIX install. It has an incompatible calling convention. + : + elif test $ac_prog = install && + grep pwplus "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then + # program-specific install script used by HP pwplus--don't use. + : + else + rm -rf conftest.one conftest.two conftest.dir + echo one > conftest.one + echo two > conftest.two + mkdir conftest.dir + if "$as_dir/$ac_prog$ac_exec_ext" -c conftest.one conftest.two "`pwd`/conftest.dir" && + test -s conftest.one && test -s conftest.two && + test -s conftest.dir/conftest.one && + test -s conftest.dir/conftest.two + then + ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c" + break 3 + fi + fi + fi + done + done + ;; +esac + + done +IFS=$as_save_IFS + +rm -rf conftest.one conftest.two conftest.dir + +fi + if test "${ac_cv_path_install+set}" = set; then + INSTALL=$ac_cv_path_install + else + # As a last resort, use the slow shell script. Don't cache a + # value for INSTALL within a source directory, because that will + # break other packages using the cache if that directory is + # removed, or if the value is a relative name. + INSTALL=$ac_install_sh + fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $INSTALL" >&5 +$as_echo "$INSTALL" >&6; } + +# Use test -z because SunOS4 sh mishandles braces in ${var-val}. +# It thinks the first close brace ends the variable substitution. +test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}' + +test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}' + +test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644' + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether build environment is sane" >&5 +$as_echo_n "checking whether build environment is sane... " >&6; } +# Just in case +sleep 1 +echo timestamp > conftest.file +# Reject unsafe characters in $srcdir or the absolute working directory +# name. Accept space and tab only in the latter. +am_lf=' +' +case `pwd` in + *[\\\"\#\$\&\'\`$am_lf]*) + as_fn_error $? "unsafe absolute working directory name" "$LINENO" 5;; +esac +case $srcdir in + *[\\\"\#\$\&\'\`$am_lf\ \ ]*) + as_fn_error $? "unsafe srcdir value: \`$srcdir'" "$LINENO" 5;; +esac + +# Do `set' in a subshell so we don't clobber the current shell's +# arguments. Must try -L first in case configure is actually a +# symlink; some systems play weird games with the mod time of symlinks +# (eg FreeBSD returns the mod time of the symlink's containing +# directory). +if ( + set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null` + if test "$*" = "X"; then + # -L didn't work. + set X `ls -t "$srcdir/configure" conftest.file` + fi + rm -f conftest.file + if test "$*" != "X $srcdir/configure conftest.file" \ + && test "$*" != "X conftest.file $srcdir/configure"; then + + # If neither matched, then we have a broken ls. This can happen + # if, for instance, CONFIG_SHELL is bash and it inherits a + # broken ls alias from the environment. This has actually + # happened. Such a system could not be considered "sane". + as_fn_error $? "ls -t appears to fail. Make sure there is not a broken +alias in your environment" "$LINENO" 5 + fi + + test "$2" = conftest.file + ) +then + # Ok. + : +else + as_fn_error $? "newly created file is older than distributed files! +Check your system clock" "$LINENO" 5 +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } +test "$program_prefix" != NONE && + program_transform_name="s&^&$program_prefix&;$program_transform_name" +# Use a double $ so make ignores it. +test "$program_suffix" != NONE && + program_transform_name="s&\$&$program_suffix&;$program_transform_name" +# Double any \ or $. +# By default was `s,x,x', remove it if useless. +ac_script='s/[\\$]/&&/g;s/;s,x,x,$//' +program_transform_name=`$as_echo "$program_transform_name" | sed "$ac_script"` + +# expand $ac_aux_dir to an absolute path +am_aux_dir=`cd $ac_aux_dir && pwd` + +if test x"${MISSING+set}" != xset; then + case $am_aux_dir in + *\ * | *\ *) + MISSING="\${SHELL} \"$am_aux_dir/missing\"" ;; + *) + MISSING="\${SHELL} $am_aux_dir/missing" ;; + esac +fi +# Use eval to expand $SHELL +if eval "$MISSING --run true"; then + am_missing_run="$MISSING --run " +else + am_missing_run= + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: \`missing' script is too old or missing" >&5 +$as_echo "$as_me: WARNING: \`missing' script is too old or missing" >&2;} +fi + +if test x"${install_sh}" != xset; then + case $am_aux_dir in + *\ * | *\ *) + install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;; + *) + install_sh="\${SHELL} $am_aux_dir/install-sh" + esac +fi + +# Installed binaries are usually stripped using `strip' when the user +# run `make install-strip'. However `strip' might not be the right +# tool to use in cross-compilation environments, therefore Automake +# will honor the `STRIP' environment variable to overrule this program. +if test "$cross_compiling" != no; then + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args. +set dummy ${ac_tool_prefix}strip; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_STRIP+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$STRIP"; then + ac_cv_prog_STRIP="$STRIP" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_STRIP="${ac_tool_prefix}strip" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +STRIP=$ac_cv_prog_STRIP +if test -n "$STRIP"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $STRIP" >&5 +$as_echo "$STRIP" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_STRIP"; then + ac_ct_STRIP=$STRIP + # Extract the first word of "strip", so it can be a program name with args. +set dummy strip; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_STRIP+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_STRIP"; then + ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_STRIP="strip" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP +if test -n "$ac_ct_STRIP"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP" >&5 +$as_echo "$ac_ct_STRIP" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_STRIP" = x; then + STRIP=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + STRIP=$ac_ct_STRIP + fi +else + STRIP="$ac_cv_prog_STRIP" +fi + +fi +INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s" + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a thread-safe mkdir -p" >&5 +$as_echo_n "checking for a thread-safe mkdir -p... " >&6; } +if test -z "$MKDIR_P"; then + if ${ac_cv_path_mkdir+:} false; then : + $as_echo_n "(cached) " >&6 +else + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH$PATH_SEPARATOR/opt/sfw/bin +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_prog in mkdir gmkdir; do + for ac_exec_ext in '' $ac_executable_extensions; do + as_fn_executable_p "$as_dir/$ac_prog$ac_exec_ext" || continue + case `"$as_dir/$ac_prog$ac_exec_ext" --version 2>&1` in #( + 'mkdir (GNU coreutils) '* | \ + 'mkdir (coreutils) '* | \ + 'mkdir (fileutils) '4.1*) + ac_cv_path_mkdir=$as_dir/$ac_prog$ac_exec_ext + break 3;; + esac + done + done + done +IFS=$as_save_IFS + +fi + + test -d ./--version && rmdir ./--version + if test "${ac_cv_path_mkdir+set}" = set; then + MKDIR_P="$ac_cv_path_mkdir -p" + else + # As a last resort, use the slow shell script. Don't cache a + # value for MKDIR_P within a source directory, because that will + # break other packages using the cache if that directory is + # removed, or if the value is a relative name. + MKDIR_P="$ac_install_sh -d" + fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $MKDIR_P" >&5 +$as_echo "$MKDIR_P" >&6; } + +mkdir_p="$MKDIR_P" +case $mkdir_p in + [\\/$]* | ?:[\\/]*) ;; + */*) mkdir_p="\$(top_builddir)/$mkdir_p" ;; +esac + +for ac_prog in gawk mawk nawk awk +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_AWK+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$AWK"; then + ac_cv_prog_AWK="$AWK" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_AWK="$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +AWK=$ac_cv_prog_AWK +if test -n "$AWK"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AWK" >&5 +$as_echo "$AWK" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$AWK" && break +done + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} sets \$(MAKE)" >&5 +$as_echo_n "checking whether ${MAKE-make} sets \$(MAKE)... " >&6; } +set x ${MAKE-make} +ac_make=`$as_echo "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'` +if eval \${ac_cv_prog_make_${ac_make}_set+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat >conftest.make <<\_ACEOF +SHELL = /bin/sh +all: + @echo '@@@%%%=$(MAKE)=@@@%%%' +_ACEOF +# GNU make sometimes prints "make[1]: Entering ...", which would confuse us. +case `${MAKE-make} -f conftest.make 2>/dev/null` in + *@@@%%%=?*=@@@%%%*) + eval ac_cv_prog_make_${ac_make}_set=yes;; + *) + eval ac_cv_prog_make_${ac_make}_set=no;; +esac +rm -f conftest.make +fi +if eval test \$ac_cv_prog_make_${ac_make}_set = yes; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + SET_MAKE= +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + SET_MAKE="MAKE=${MAKE-make}" +fi + +rm -rf .tst 2>/dev/null +mkdir .tst 2>/dev/null +if test -d .tst; then + am__leading_dot=. +else + am__leading_dot=_ +fi +rmdir .tst 2>/dev/null + +if test "`cd $srcdir && pwd`" != "`pwd`"; then + # Use -I$(srcdir) only when $(srcdir) != ., so that make's output + # is not polluted with repeated "-I." + am__isrc=' -I$(srcdir)' + # test to see if srcdir already configured + if test -f $srcdir/config.status; then + as_fn_error $? "source directory already configured; run \"make distclean\" there first" "$LINENO" 5 + fi +fi + +# test whether we have cygpath +if test -z "$CYGPATH_W"; then + if (cygpath --version) >/dev/null 2>/dev/null; then + CYGPATH_W='cygpath -w' + else + CYGPATH_W=echo + fi +fi + + +# Define the identity of the package. + PACKAGE='zookeeper' + VERSION='3.4.6' + + +cat >>confdefs.h <<_ACEOF +@%:@define PACKAGE "$PACKAGE" +_ACEOF + + +cat >>confdefs.h <<_ACEOF +@%:@define VERSION "$VERSION" +_ACEOF + +# Some tools Automake needs. + +ACLOCAL=${ACLOCAL-"${am_missing_run}aclocal-${am__api_version}"} + + +AUTOCONF=${AUTOCONF-"${am_missing_run}autoconf"} + + +AUTOMAKE=${AUTOMAKE-"${am_missing_run}automake-${am__api_version}"} + + +AUTOHEADER=${AUTOHEADER-"${am_missing_run}autoheader"} + + +MAKEINFO=${MAKEINFO-"${am_missing_run}makeinfo"} + +# We need awk for the "check" target. The system "awk" is bad on +# some platforms. +# Always define AMTAR for backward compatibility. Yes, it's still used +# in the wild :-( We should find a proper way to deprecate it ... +AMTAR='$${TAR-tar}' + +am__tar='$${TAR-tar} chof - "$$tardir"' am__untar='$${TAR-tar} xf -' + + + + + +ac_config_headers="$ac_config_headers config.h" + + +# Checks for programs. + +@%:@ Check whether --with-cppunit was given. +if test "${with_cppunit+set}" = set; then : + withval=$with_cppunit; +fi + + +if test "$with_cppunit" = "no" ; then + CPPUNIT_PATH="No_CPPUNIT" + CPPUNIT_INCLUDE= + CPPUNIT_LIBS= +else + + + +@%:@ Check whether --with-cppunit-prefix was given. +if test "${with_cppunit_prefix+set}" = set; then : + withval=$with_cppunit_prefix; cppunit_config_prefix="$withval" +else + cppunit_config_prefix="" +fi + + +@%:@ Check whether --with-cppunit-exec-prefix was given. +if test "${with_cppunit_exec_prefix+set}" = set; then : + withval=$with_cppunit_exec_prefix; cppunit_config_exec_prefix="$withval" +else + cppunit_config_exec_prefix="" +fi + + + if test x$cppunit_config_exec_prefix != x ; then + cppunit_config_args="$cppunit_config_args --exec-prefix=$cppunit_config_exec_prefix" + if test x${CPPUNIT_CONFIG+set} != xset ; then + CPPUNIT_CONFIG=$cppunit_config_exec_prefix/bin/cppunit-config + fi + fi + if test x$cppunit_config_prefix != x ; then + cppunit_config_args="$cppunit_config_args --prefix=$cppunit_config_prefix" + if test x${CPPUNIT_CONFIG+set} != xset ; then + CPPUNIT_CONFIG=$cppunit_config_prefix/bin/cppunit-config + fi + fi + + # Extract the first word of "cppunit-config", so it can be a program name with args. +set dummy cppunit-config; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_path_CPPUNIT_CONFIG+:} false; then : + $as_echo_n "(cached) " >&6 +else + case $CPPUNIT_CONFIG in + [\\/]* | ?:[\\/]*) + ac_cv_path_CPPUNIT_CONFIG="$CPPUNIT_CONFIG" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_path_CPPUNIT_CONFIG="$as_dir/$ac_word$ac_exec_ext" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + test -z "$ac_cv_path_CPPUNIT_CONFIG" && ac_cv_path_CPPUNIT_CONFIG="no" + ;; +esac +fi +CPPUNIT_CONFIG=$ac_cv_path_CPPUNIT_CONFIG +if test -n "$CPPUNIT_CONFIG"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CPPUNIT_CONFIG" >&5 +$as_echo "$CPPUNIT_CONFIG" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + cppunit_version_min=1.10.2 + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Cppunit - version >= $cppunit_version_min" >&5 +$as_echo_n "checking for Cppunit - version >= $cppunit_version_min... " >&6; } + no_cppunit="" + if test "$CPPUNIT_CONFIG" = "no" ; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + no_cppunit=yes + else + CPPUNIT_CFLAGS=`$CPPUNIT_CONFIG --cflags` + CPPUNIT_LIBS=`$CPPUNIT_CONFIG --libs` + cppunit_version=`$CPPUNIT_CONFIG --version` + + cppunit_major_version=`echo $cppunit_version | \ + sed 's/\([0-9]*\).\([0-9]*\).\([0-9]*\)/\1/'` + cppunit_minor_version=`echo $cppunit_version | \ + sed 's/\([0-9]*\).\([0-9]*\).\([0-9]*\)/\2/'` + cppunit_micro_version=`echo $cppunit_version | \ + sed 's/\([0-9]*\).\([0-9]*\).\([0-9]*\)/\3/'` + + cppunit_major_min=`echo $cppunit_version_min | \ + sed 's/\([0-9]*\).\([0-9]*\).\([0-9]*\)/\1/'` + if test "x${cppunit_major_min}" = "x" ; then + cppunit_major_min=0 + fi + + cppunit_minor_min=`echo $cppunit_version_min | \ + sed 's/\([0-9]*\).\([0-9]*\).\([0-9]*\)/\2/'` + if test "x${cppunit_minor_min}" = "x" ; then + cppunit_minor_min=0 + fi + + cppunit_micro_min=`echo $cppunit_version_min | \ + sed 's/\([0-9]*\).\([0-9]*\).\([0-9]*\)/\3/'` + if test "x${cppunit_micro_min}" = "x" ; then + cppunit_micro_min=0 + fi + + cppunit_version_proper=`expr \ + $cppunit_major_version \> $cppunit_major_min \| \ + $cppunit_major_version \= $cppunit_major_min \& \ + $cppunit_minor_version \> $cppunit_minor_min \| \ + $cppunit_major_version \= $cppunit_major_min \& \ + $cppunit_minor_version \= $cppunit_minor_min \& \ + $cppunit_micro_version \>= $cppunit_micro_min ` + + if test "$cppunit_version_proper" = "1" ; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $cppunit_major_version.$cppunit_minor_version.$cppunit_micro_version" >&5 +$as_echo "$cppunit_major_version.$cppunit_minor_version.$cppunit_micro_version" >&6; } + else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + no_cppunit=yes + fi + fi + + if test "x$no_cppunit" = x ; then + : + else + CPPUNIT_CFLAGS="" + CPPUNIT_LIBS="" + : + fi + + + + +fi + +if test "$CALLER" = "ANT" ; then +CPPUNIT_CFLAGS="$CPPUNIT_CFLAGS -DZKSERVER_CMD=\"\\\"${base_dir}/src/c/tests/zkServer.sh\\\"\"" +else +CPPUNIT_CFLAGS="$CPPUNIT_CFLAGS -DZKSERVER_CMD=\"\\\"./tests/zkServer.sh\\\"\"" +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for generated/zookeeper.jute.c" >&5 +$as_echo_n "checking for generated/zookeeper.jute.c... " >&6; } +if ${ac_cv_file_generated_zookeeper_jute_c+:} false; then : + $as_echo_n "(cached) " >&6 +else + test "$cross_compiling" = yes && + as_fn_error $? "cannot check for file existence when cross compiling" "$LINENO" 5 +if test -r "generated/zookeeper.jute.c"; then + ac_cv_file_generated_zookeeper_jute_c=yes +else + ac_cv_file_generated_zookeeper_jute_c=no +fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_file_generated_zookeeper_jute_c" >&5 +$as_echo "$ac_cv_file_generated_zookeeper_jute_c" >&6; } +if test "x$ac_cv_file_generated_zookeeper_jute_c" = xyes; then : + +cat >>confdefs.h <<_ACEOF +@%:@define HAVE_GENERATED_ZOOKEEPER_JUTE_C 1 +_ACEOF + +else + as_fn_error $? "jute files are missing! Please run \"ant compile_jute\" while in the zookeeper top level directory." "$LINENO" 5 + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for generated/zookeeper.jute.h" >&5 +$as_echo_n "checking for generated/zookeeper.jute.h... " >&6; } +if ${ac_cv_file_generated_zookeeper_jute_h+:} false; then : + $as_echo_n "(cached) " >&6 +else + test "$cross_compiling" = yes && + as_fn_error $? "cannot check for file existence when cross compiling" "$LINENO" 5 +if test -r "generated/zookeeper.jute.h"; then + ac_cv_file_generated_zookeeper_jute_h=yes +else + ac_cv_file_generated_zookeeper_jute_h=no +fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_file_generated_zookeeper_jute_h" >&5 +$as_echo "$ac_cv_file_generated_zookeeper_jute_h" >&6; } +if test "x$ac_cv_file_generated_zookeeper_jute_h" = xyes; then : + +cat >>confdefs.h <<_ACEOF +@%:@define HAVE_GENERATED_ZOOKEEPER_JUTE_H 1 +_ACEOF + +else + as_fn_error $? "jute files are missing! Please run \"ant compile_jute\" while in the zookeeper top level directory." "$LINENO" 5 + +fi + +fi + + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args. +set dummy ${ac_tool_prefix}gcc; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_CC+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_CC="${ac_tool_prefix}gcc" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +$as_echo "$CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_CC"; then + ac_ct_CC=$CC + # Extract the first word of "gcc", so it can be a program name with args. +set dummy gcc; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_CC+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_CC"; then + ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_CC="gcc" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_CC=$ac_cv_prog_ac_ct_CC +if test -n "$ac_ct_CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 +$as_echo "$ac_ct_CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_CC" = x; then + CC="" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + CC=$ac_ct_CC + fi +else + CC="$ac_cv_prog_CC" +fi + +if test -z "$CC"; then + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args. +set dummy ${ac_tool_prefix}cc; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_CC+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_CC="${ac_tool_prefix}cc" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +$as_echo "$CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + fi +fi +if test -z "$CC"; then + # Extract the first word of "cc", so it can be a program name with args. +set dummy cc; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_CC+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else + ac_prog_rejected=no +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then + ac_prog_rejected=yes + continue + fi + ac_cv_prog_CC="cc" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +if test $ac_prog_rejected = yes; then + # We found a bogon in the path, so make sure we never use it. + set dummy $ac_cv_prog_CC + shift + if test $@%:@ != 0; then + # We chose a different compiler from the bogus one. + # However, it has the same basename, so the bogon will be chosen + # first if we set CC to just the basename; use the full file name. + shift + ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@" + fi +fi +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +$as_echo "$CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$CC"; then + if test -n "$ac_tool_prefix"; then + for ac_prog in cl.exe + do + # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. +set dummy $ac_tool_prefix$ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_CC+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_CC="$ac_tool_prefix$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +$as_echo "$CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$CC" && break + done +fi +if test -z "$CC"; then + ac_ct_CC=$CC + for ac_prog in cl.exe +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_CC+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_CC"; then + ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_CC="$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_CC=$ac_cv_prog_ac_ct_CC +if test -n "$ac_ct_CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 +$as_echo "$ac_ct_CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$ac_ct_CC" && break +done + + if test "x$ac_ct_CC" = x; then + CC="" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + CC=$ac_ct_CC + fi +fi + +fi + + +test -z "$CC" && { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "no acceptable C compiler found in \$PATH +See \`config.log' for more details" "$LINENO" 5; } + +# Provide some information about the compiler. +$as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5 +set X $ac_compile +ac_compiler=$2 +for ac_option in --version -v -V -qversion; do + { { ac_try="$ac_compiler $ac_option >&5" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_compiler $ac_option >&5") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + sed '10a\ +... rest of stderr output deleted ... + 10q' conftest.err >conftest.er1 + cat conftest.er1 >&5 + fi + rm -f conftest.er1 conftest.err + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } +done + +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +ac_clean_files_save=$ac_clean_files +ac_clean_files="$ac_clean_files a.out a.out.dSYM a.exe b.out" +# Try to create an executable without -o first, disregard a.out. +# It will help us diagnose broken compilers, and finding out an intuition +# of exeext. +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler works" >&5 +$as_echo_n "checking whether the C compiler works... " >&6; } +ac_link_default=`$as_echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'` + +# The possible output files: +ac_files="a.out conftest.exe conftest a.exe a_out.exe b.out conftest.*" + +ac_rmfiles= +for ac_file in $ac_files +do + case $ac_file in + *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; + * ) ac_rmfiles="$ac_rmfiles $ac_file";; + esac +done +rm -f $ac_rmfiles + +if { { ac_try="$ac_link_default" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_link_default") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then : + # Autoconf-2.13 could set the ac_cv_exeext variable to `no'. +# So ignore a value of `no', otherwise this would lead to `EXEEXT = no' +# in a Makefile. We should not override ac_cv_exeext if it was cached, +# so that the user can short-circuit this test for compilers unknown to +# Autoconf. +for ac_file in $ac_files '' +do + test -f "$ac_file" || continue + case $ac_file in + *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) + ;; + [ab].out ) + # We found the default executable, but exeext='' is most + # certainly right. + break;; + *.* ) + if test "${ac_cv_exeext+set}" = set && test "$ac_cv_exeext" != no; + then :; else + ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` + fi + # We set ac_cv_exeext here because the later test for it is not + # safe: cross compilers may not add the suffix if given an `-o' + # argument, so we may need to know it at that point already. + # Even if this section looks crufty: it has the advantage of + # actually working. + break;; + * ) + break;; + esac +done +test "$ac_cv_exeext" = no && ac_cv_exeext= + +else + ac_file='' +fi +if test -z "$ac_file"; then : + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +$as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error 77 "C compiler cannot create executables +See \`config.log' for more details" "$LINENO" 5; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler default output file name" >&5 +$as_echo_n "checking for C compiler default output file name... " >&6; } +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_file" >&5 +$as_echo "$ac_file" >&6; } +ac_exeext=$ac_cv_exeext + +rm -f -r a.out a.out.dSYM a.exe conftest$ac_cv_exeext b.out +ac_clean_files=$ac_clean_files_save +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of executables" >&5 +$as_echo_n "checking for suffix of executables... " >&6; } +if { { ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_link") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then : + # If both `conftest.exe' and `conftest' are `present' (well, observable) +# catch `conftest.exe'. For instance with Cygwin, `ls conftest' will +# work properly (i.e., refer to `conftest.exe'), while it won't with +# `rm'. +for ac_file in conftest.exe conftest conftest.*; do + test -f "$ac_file" || continue + case $ac_file in + *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; + *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` + break;; + * ) break;; + esac +done +else + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "cannot compute suffix of executables: cannot compile and link +See \`config.log' for more details" "$LINENO" 5; } +fi +rm -f conftest conftest$ac_cv_exeext +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_exeext" >&5 +$as_echo "$ac_cv_exeext" >&6; } + +rm -f conftest.$ac_ext +EXEEXT=$ac_cv_exeext +ac_exeext=$EXEEXT +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +@%:@include +int +main () +{ +FILE *f = fopen ("conftest.out", "w"); + return ferror (f) || fclose (f) != 0; + + ; + return 0; +} +_ACEOF +ac_clean_files="$ac_clean_files conftest.out" +# Check that the compiler produces executables we can run. If not, either +# the compiler is broken, or we cross compile. +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are cross compiling" >&5 +$as_echo_n "checking whether we are cross compiling... " >&6; } +if test "$cross_compiling" != yes; then + { { ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_link") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + if { ac_try='./conftest$ac_cv_exeext' + { { case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; }; then + cross_compiling=no + else + if test "$cross_compiling" = maybe; then + cross_compiling=yes + else + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "cannot run C compiled programs. +If you meant to cross compile, use \`--host'. +See \`config.log' for more details" "$LINENO" 5; } + fi + fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $cross_compiling" >&5 +$as_echo "$cross_compiling" >&6; } + +rm -f conftest.$ac_ext conftest$ac_cv_exeext conftest.out +ac_clean_files=$ac_clean_files_save +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of object files" >&5 +$as_echo_n "checking for suffix of object files... " >&6; } +if ${ac_cv_objext+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +rm -f conftest.o conftest.obj +if { { ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_compile") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then : + for ac_file in conftest.o conftest.obj conftest.*; do + test -f "$ac_file" || continue; + case $ac_file in + *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM ) ;; + *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'` + break;; + esac +done +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "cannot compute suffix of object files: cannot compile +See \`config.log' for more details" "$LINENO" 5; } +fi +rm -f conftest.$ac_cv_objext conftest.$ac_ext +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_objext" >&5 +$as_echo "$ac_cv_objext" >&6; } +OBJEXT=$ac_cv_objext +ac_objext=$OBJEXT +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C compiler" >&5 +$as_echo_n "checking whether we are using the GNU C compiler... " >&6; } +if ${ac_cv_c_compiler_gnu+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ +#ifndef __GNUC__ + choke me +#endif + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_compiler_gnu=yes +else + ac_compiler_gnu=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +ac_cv_c_compiler_gnu=$ac_compiler_gnu + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5 +$as_echo "$ac_cv_c_compiler_gnu" >&6; } +if test $ac_compiler_gnu = yes; then + GCC=yes +else + GCC= +fi +ac_test_CFLAGS=${CFLAGS+set} +ac_save_CFLAGS=$CFLAGS +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5 +$as_echo_n "checking whether $CC accepts -g... " >&6; } +if ${ac_cv_prog_cc_g+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_save_c_werror_flag=$ac_c_werror_flag + ac_c_werror_flag=yes + ac_cv_prog_cc_g=no + CFLAGS="-g" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_prog_cc_g=yes +else + CFLAGS="" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + +else + ac_c_werror_flag=$ac_save_c_werror_flag + CFLAGS="-g" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_prog_cc_g=yes +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + ac_c_werror_flag=$ac_save_c_werror_flag +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5 +$as_echo "$ac_cv_prog_cc_g" >&6; } +if test "$ac_test_CFLAGS" = set; then + CFLAGS=$ac_save_CFLAGS +elif test $ac_cv_prog_cc_g = yes; then + if test "$GCC" = yes; then + CFLAGS="-g -O2" + else + CFLAGS="-g" + fi +else + if test "$GCC" = yes; then + CFLAGS="-O2" + else + CFLAGS= + fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5 +$as_echo_n "checking for $CC option to accept ISO C89... " >&6; } +if ${ac_cv_prog_cc_c89+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_cv_prog_cc_c89=no +ac_save_CC=$CC +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +#include +struct stat; +/* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */ +struct buf { int x; }; +FILE * (*rcsopen) (struct buf *, struct stat *, int); +static char *e (p, i) + char **p; + int i; +{ + return p[i]; +} +static char *f (char * (*g) (char **, int), char **p, ...) +{ + char *s; + va_list v; + va_start (v,p); + s = g (p, va_arg (v,int)); + va_end (v); + return s; +} + +/* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has + function prototypes and stuff, but not '\xHH' hex character constants. + These don't provoke an error unfortunately, instead are silently treated + as 'x'. The following induces an error, until -std is added to get + proper ANSI mode. Curiously '\x00'!='x' always comes out true, for an + array size at least. It's necessary to write '\x00'==0 to get something + that's true only with -std. */ +int osf4_cc_array ['\x00' == 0 ? 1 : -1]; + +/* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters + inside strings and character constants. */ +#define FOO(x) 'x' +int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1]; + +int test (int i, double x); +struct s1 {int (*f) (int a);}; +struct s2 {int (*f) (double a);}; +int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int); +int argc; +char **argv; +int +main () +{ +return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]; + ; + return 0; +} +_ACEOF +for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \ + -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" +do + CC="$ac_save_CC $ac_arg" + if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_prog_cc_c89=$ac_arg +fi +rm -f core conftest.err conftest.$ac_objext + test "x$ac_cv_prog_cc_c89" != "xno" && break +done +rm -f conftest.$ac_ext +CC=$ac_save_CC + +fi +# AC_CACHE_VAL +case "x$ac_cv_prog_cc_c89" in + x) + { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 +$as_echo "none needed" >&6; } ;; + xno) + { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 +$as_echo "unsupported" >&6; } ;; + *) + CC="$CC $ac_cv_prog_cc_c89" + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5 +$as_echo "$ac_cv_prog_cc_c89" >&6; } ;; +esac +if test "x$ac_cv_prog_cc_c89" != xno; then : + +fi + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu +DEPDIR="${am__leading_dot}deps" + +ac_config_commands="$ac_config_commands depfiles" + + +am_make=${MAKE-make} +cat > confinc << 'END' +am__doit: + @echo this is the am__doit target +.PHONY: am__doit +END +# If we don't find an include directive, just comment out the code. +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for style of include used by $am_make" >&5 +$as_echo_n "checking for style of include used by $am_make... " >&6; } +am__include="#" +am__quote= +_am_result=none +# First try GNU make style include. +echo "include confinc" > confmf +# Ignore all kinds of additional output from `make'. +case `$am_make -s -f confmf 2> /dev/null` in #( +*the\ am__doit\ target*) + am__include=include + am__quote= + _am_result=GNU + ;; +esac +# Now try BSD make style include. +if test "$am__include" = "#"; then + echo '.include "confinc"' > confmf + case `$am_make -s -f confmf 2> /dev/null` in #( + *the\ am__doit\ target*) + am__include=.include + am__quote="\"" + _am_result=BSD + ;; + esac +fi + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $_am_result" >&5 +$as_echo "$_am_result" >&6; } +rm -f confinc confmf + +@%:@ Check whether --enable-dependency-tracking was given. +if test "${enable_dependency_tracking+set}" = set; then : + enableval=$enable_dependency_tracking; +fi + +if test "x$enable_dependency_tracking" != xno; then + am_depcomp="$ac_aux_dir/depcomp" + AMDEPBACKSLASH='\' + am__nodep='_no' +fi + if test "x$enable_dependency_tracking" != xno; then + AMDEP_TRUE= + AMDEP_FALSE='#' +else + AMDEP_TRUE='#' + AMDEP_FALSE= +fi + + + +depcc="$CC" am_compiler_list= + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5 +$as_echo_n "checking dependency style of $depcc... " >&6; } +if ${am_cv_CC_dependencies_compiler_type+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then + # We make a subdir and do the tests there. Otherwise we can end up + # making bogus files that we don't know about and never remove. For + # instance it was reported that on HP-UX the gcc test will end up + # making a dummy file named `D' -- because `-MD' means `put the output + # in D'. + rm -rf conftest.dir + mkdir conftest.dir + # Copy depcomp to subdir because otherwise we won't find it if we're + # using a relative directory. + cp "$am_depcomp" conftest.dir + cd conftest.dir + # We will build objects and dependencies in a subdirectory because + # it helps to detect inapplicable dependency modes. For instance + # both Tru64's cc and ICC support -MD to output dependencies as a + # side effect of compilation, but ICC will put the dependencies in + # the current directory while Tru64 will put them in the object + # directory. + mkdir sub + + am_cv_CC_dependencies_compiler_type=none + if test "$am_compiler_list" = ""; then + am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp` + fi + am__universal=false + case " $depcc " in #( + *\ -arch\ *\ -arch\ *) am__universal=true ;; + esac + + for depmode in $am_compiler_list; do + # Setup a source with many dependencies, because some compilers + # like to wrap large dependency lists on column 80 (with \), and + # we should not choose a depcomp mode which is confused by this. + # + # We need to recreate these files for each test, as the compiler may + # overwrite some of them when testing with obscure command lines. + # This happens at least with the AIX C compiler. + : > sub/conftest.c + for i in 1 2 3 4 5 6; do + echo '#include "conftst'$i'.h"' >> sub/conftest.c + # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with + # Solaris 8's {/usr,}/bin/sh. + touch sub/conftst$i.h + done + echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf + + # We check with `-c' and `-o' for the sake of the "dashmstdout" + # mode. It turns out that the SunPro C++ compiler does not properly + # handle `-M -o', and we need to detect this. Also, some Intel + # versions had trouble with output in subdirs + am__obj=sub/conftest.${OBJEXT-o} + am__minus_obj="-o $am__obj" + case $depmode in + gcc) + # This depmode causes a compiler race in universal mode. + test "$am__universal" = false || continue + ;; + nosideeffect) + # after this tag, mechanisms are not by side-effect, so they'll + # only be used when explicitly requested + if test "x$enable_dependency_tracking" = xyes; then + continue + else + break + fi + ;; + msvc7 | msvc7msys | msvisualcpp | msvcmsys) + # This compiler won't grok `-c -o', but also, the minuso test has + # not run yet. These depmodes are late enough in the game, and + # so weak that their functioning should not be impacted. + am__obj=conftest.${OBJEXT-o} + am__minus_obj= + ;; + none) break ;; + esac + if depmode=$depmode \ + source=sub/conftest.c object=$am__obj \ + depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ + $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ + >/dev/null 2>conftest.err && + grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && + grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && + grep $am__obj sub/conftest.Po > /dev/null 2>&1 && + ${MAKE-make} -s -f confmf > /dev/null 2>&1; then + # icc doesn't choke on unknown options, it will just issue warnings + # or remarks (even with -Werror). So we grep stderr for any message + # that says an option was ignored or not supported. + # When given -MP, icc 7.0 and 7.1 complain thusly: + # icc: Command line warning: ignoring option '-M'; no argument required + # The diagnosis changed in icc 8.0: + # icc: Command line remark: option '-MP' not supported + if (grep 'ignoring option' conftest.err || + grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else + am_cv_CC_dependencies_compiler_type=$depmode + break + fi + fi + done + + cd .. + rm -rf conftest.dir +else + am_cv_CC_dependencies_compiler_type=none +fi + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_CC_dependencies_compiler_type" >&5 +$as_echo "$am_cv_CC_dependencies_compiler_type" >&6; } +CCDEPMODE=depmode=$am_cv_CC_dependencies_compiler_type + + if + test "x$enable_dependency_tracking" != xno \ + && test "$am_cv_CC_dependencies_compiler_type" = gcc3; then + am__fastdepCC_TRUE= + am__fastdepCC_FALSE='#' +else + am__fastdepCC_TRUE='#' + am__fastdepCC_FALSE= +fi + + +if test "x$CC" != xcc; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC and cc understand -c and -o together" >&5 +$as_echo_n "checking whether $CC and cc understand -c and -o together... " >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether cc understands -c and -o together" >&5 +$as_echo_n "checking whether cc understands -c and -o together... " >&6; } +fi +set dummy $CC; ac_cc=`$as_echo "$2" | + sed 's/[^a-zA-Z0-9_]/_/g;s/^[0-9]/_/'` +if eval \${ac_cv_prog_cc_${ac_cc}_c_o+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +# Make sure it works both with $CC and with simple cc. +# We do the test twice because some compilers refuse to overwrite an +# existing .o file with -o, though they will create one. +ac_try='$CC -c conftest.$ac_ext -o conftest2.$ac_objext >&5' +rm -f conftest2.* +if { { case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && + test -f conftest2.$ac_objext && { { case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; +then + eval ac_cv_prog_cc_${ac_cc}_c_o=yes + if test "x$CC" != xcc; then + # Test first that cc exists at all. + if { ac_try='cc -c conftest.$ac_ext >&5' + { { case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; }; then + ac_try='cc -c conftest.$ac_ext -o conftest2.$ac_objext >&5' + rm -f conftest2.* + if { { case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && + test -f conftest2.$ac_objext && { { case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; + then + # cc works too. + : + else + # cc exists but doesn't like -o. + eval ac_cv_prog_cc_${ac_cc}_c_o=no + fi + fi + fi +else + eval ac_cv_prog_cc_${ac_cc}_c_o=no +fi +rm -f core conftest* + +fi +if eval test \$ac_cv_prog_cc_${ac_cc}_c_o = yes; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + +$as_echo "@%:@define NO_MINUS_C_MINUS_O 1" >>confdefs.h + +fi + +# FIXME: we rely on the cache variable name because +# there is no other way. +set dummy $CC +am_cc=`echo $2 | sed 's/[^a-zA-Z0-9_]/_/g;s/^[0-9]/_/'` +eval am_t=\$ac_cv_prog_cc_${am_cc}_c_o +if test "$am_t" != yes; then + # Losing compiler, so override with the script. + # FIXME: It is wrong to rewrite CC. + # But if we don't then we get into trouble of one sort or another. + # A longer-term fix would be to have automake use am__CC in this case, + # and then we could set am__CC="\$(top_srcdir)/compile \$(CC)" + CC="$am_aux_dir/compile $CC" +fi + + +ac_ext=cpp +ac_cpp='$CXXCPP $CPPFLAGS' +ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_cxx_compiler_gnu +if test -z "$CXX"; then + if test -n "$CCC"; then + CXX=$CCC + else + if test -n "$ac_tool_prefix"; then + for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC + do + # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. +set dummy $ac_tool_prefix$ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_CXX+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$CXX"; then + ac_cv_prog_CXX="$CXX" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_CXX="$ac_tool_prefix$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +CXX=$ac_cv_prog_CXX +if test -n "$CXX"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CXX" >&5 +$as_echo "$CXX" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$CXX" && break + done +fi +if test -z "$CXX"; then + ac_ct_CXX=$CXX + for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_CXX+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_CXX"; then + ac_cv_prog_ac_ct_CXX="$ac_ct_CXX" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_CXX="$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_CXX=$ac_cv_prog_ac_ct_CXX +if test -n "$ac_ct_CXX"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CXX" >&5 +$as_echo "$ac_ct_CXX" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$ac_ct_CXX" && break +done + + if test "x$ac_ct_CXX" = x; then + CXX="g++" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + CXX=$ac_ct_CXX + fi +fi + + fi +fi +# Provide some information about the compiler. +$as_echo "$as_me:${as_lineno-$LINENO}: checking for C++ compiler version" >&5 +set X $ac_compile +ac_compiler=$2 +for ac_option in --version -v -V -qversion; do + { { ac_try="$ac_compiler $ac_option >&5" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_compiler $ac_option >&5") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + sed '10a\ +... rest of stderr output deleted ... + 10q' conftest.err >conftest.er1 + cat conftest.er1 >&5 + fi + rm -f conftest.er1 conftest.err + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } +done + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C++ compiler" >&5 +$as_echo_n "checking whether we are using the GNU C++ compiler... " >&6; } +if ${ac_cv_cxx_compiler_gnu+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ +#ifndef __GNUC__ + choke me +#endif + + ; + return 0; +} +_ACEOF +if ac_fn_cxx_try_compile "$LINENO"; then : + ac_compiler_gnu=yes +else + ac_compiler_gnu=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +ac_cv_cxx_compiler_gnu=$ac_compiler_gnu + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_cxx_compiler_gnu" >&5 +$as_echo "$ac_cv_cxx_compiler_gnu" >&6; } +if test $ac_compiler_gnu = yes; then + GXX=yes +else + GXX= +fi +ac_test_CXXFLAGS=${CXXFLAGS+set} +ac_save_CXXFLAGS=$CXXFLAGS +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CXX accepts -g" >&5 +$as_echo_n "checking whether $CXX accepts -g... " >&6; } +if ${ac_cv_prog_cxx_g+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_save_cxx_werror_flag=$ac_cxx_werror_flag + ac_cxx_werror_flag=yes + ac_cv_prog_cxx_g=no + CXXFLAGS="-g" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_cxx_try_compile "$LINENO"; then : + ac_cv_prog_cxx_g=yes +else + CXXFLAGS="" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_cxx_try_compile "$LINENO"; then : + +else + ac_cxx_werror_flag=$ac_save_cxx_werror_flag + CXXFLAGS="-g" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_cxx_try_compile "$LINENO"; then : + ac_cv_prog_cxx_g=yes +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + ac_cxx_werror_flag=$ac_save_cxx_werror_flag +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cxx_g" >&5 +$as_echo "$ac_cv_prog_cxx_g" >&6; } +if test "$ac_test_CXXFLAGS" = set; then + CXXFLAGS=$ac_save_CXXFLAGS +elif test $ac_cv_prog_cxx_g = yes; then + if test "$GXX" = yes; then + CXXFLAGS="-g -O2" + else + CXXFLAGS="-g" + fi +else + if test "$GXX" = yes; then + CXXFLAGS="-O2" + else + CXXFLAGS= + fi +fi +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + +depcc="$CXX" am_compiler_list= + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5 +$as_echo_n "checking dependency style of $depcc... " >&6; } +if ${am_cv_CXX_dependencies_compiler_type+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then + # We make a subdir and do the tests there. Otherwise we can end up + # making bogus files that we don't know about and never remove. For + # instance it was reported that on HP-UX the gcc test will end up + # making a dummy file named `D' -- because `-MD' means `put the output + # in D'. + rm -rf conftest.dir + mkdir conftest.dir + # Copy depcomp to subdir because otherwise we won't find it if we're + # using a relative directory. + cp "$am_depcomp" conftest.dir + cd conftest.dir + # We will build objects and dependencies in a subdirectory because + # it helps to detect inapplicable dependency modes. For instance + # both Tru64's cc and ICC support -MD to output dependencies as a + # side effect of compilation, but ICC will put the dependencies in + # the current directory while Tru64 will put them in the object + # directory. + mkdir sub + + am_cv_CXX_dependencies_compiler_type=none + if test "$am_compiler_list" = ""; then + am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp` + fi + am__universal=false + case " $depcc " in #( + *\ -arch\ *\ -arch\ *) am__universal=true ;; + esac + + for depmode in $am_compiler_list; do + # Setup a source with many dependencies, because some compilers + # like to wrap large dependency lists on column 80 (with \), and + # we should not choose a depcomp mode which is confused by this. + # + # We need to recreate these files for each test, as the compiler may + # overwrite some of them when testing with obscure command lines. + # This happens at least with the AIX C compiler. + : > sub/conftest.c + for i in 1 2 3 4 5 6; do + echo '#include "conftst'$i'.h"' >> sub/conftest.c + # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with + # Solaris 8's {/usr,}/bin/sh. + touch sub/conftst$i.h + done + echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf + + # We check with `-c' and `-o' for the sake of the "dashmstdout" + # mode. It turns out that the SunPro C++ compiler does not properly + # handle `-M -o', and we need to detect this. Also, some Intel + # versions had trouble with output in subdirs + am__obj=sub/conftest.${OBJEXT-o} + am__minus_obj="-o $am__obj" + case $depmode in + gcc) + # This depmode causes a compiler race in universal mode. + test "$am__universal" = false || continue + ;; + nosideeffect) + # after this tag, mechanisms are not by side-effect, so they'll + # only be used when explicitly requested + if test "x$enable_dependency_tracking" = xyes; then + continue + else + break + fi + ;; + msvc7 | msvc7msys | msvisualcpp | msvcmsys) + # This compiler won't grok `-c -o', but also, the minuso test has + # not run yet. These depmodes are late enough in the game, and + # so weak that their functioning should not be impacted. + am__obj=conftest.${OBJEXT-o} + am__minus_obj= + ;; + none) break ;; + esac + if depmode=$depmode \ + source=sub/conftest.c object=$am__obj \ + depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ + $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ + >/dev/null 2>conftest.err && + grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && + grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && + grep $am__obj sub/conftest.Po > /dev/null 2>&1 && + ${MAKE-make} -s -f confmf > /dev/null 2>&1; then + # icc doesn't choke on unknown options, it will just issue warnings + # or remarks (even with -Werror). So we grep stderr for any message + # that says an option was ignored or not supported. + # When given -MP, icc 7.0 and 7.1 complain thusly: + # icc: Command line warning: ignoring option '-M'; no argument required + # The diagnosis changed in icc 8.0: + # icc: Command line remark: option '-MP' not supported + if (grep 'ignoring option' conftest.err || + grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else + am_cv_CXX_dependencies_compiler_type=$depmode + break + fi + fi + done + + cd .. + rm -rf conftest.dir +else + am_cv_CXX_dependencies_compiler_type=none +fi + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_CXX_dependencies_compiler_type" >&5 +$as_echo "$am_cv_CXX_dependencies_compiler_type" >&6; } +CXXDEPMODE=depmode=$am_cv_CXX_dependencies_compiler_type + + if + test "x$enable_dependency_tracking" != xno \ + && test "$am_cv_CXX_dependencies_compiler_type" = gcc3; then + am__fastdepCXX_TRUE= + am__fastdepCXX_FALSE='#' +else + am__fastdepCXX_TRUE='#' + am__fastdepCXX_FALSE= +fi + + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ln -s works" >&5 +$as_echo_n "checking whether ln -s works... " >&6; } +LN_S=$as_ln_s +if test "$LN_S" = "ln -s"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no, using $LN_S" >&5 +$as_echo "no, using $LN_S" >&6; } +fi + + +# AC_DISABLE_SHARED +case `pwd` in + *\ * | *\ *) + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Libtool does not cope well with whitespace in \`pwd\`" >&5 +$as_echo "$as_me: WARNING: Libtool does not cope well with whitespace in \`pwd\`" >&2;} ;; +esac + + + +macro_version='2.4.2' +macro_revision='1.3337' + + + + + + + + + + + + + +ltmain="$ac_aux_dir/ltmain.sh" + +# Make sure we can run config.sub. +$SHELL "$ac_aux_dir/config.sub" sun4 >/dev/null 2>&1 || + as_fn_error $? "cannot run $SHELL $ac_aux_dir/config.sub" "$LINENO" 5 + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking build system type" >&5 +$as_echo_n "checking build system type... " >&6; } +if ${ac_cv_build+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_build_alias=$build_alias +test "x$ac_build_alias" = x && + ac_build_alias=`$SHELL "$ac_aux_dir/config.guess"` +test "x$ac_build_alias" = x && + as_fn_error $? "cannot guess build type; you must specify one" "$LINENO" 5 +ac_cv_build=`$SHELL "$ac_aux_dir/config.sub" $ac_build_alias` || + as_fn_error $? "$SHELL $ac_aux_dir/config.sub $ac_build_alias failed" "$LINENO" 5 + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_build" >&5 +$as_echo "$ac_cv_build" >&6; } +case $ac_cv_build in +*-*-*) ;; +*) as_fn_error $? "invalid value of canonical build" "$LINENO" 5;; +esac +build=$ac_cv_build +ac_save_IFS=$IFS; IFS='-' +set x $ac_cv_build +shift +build_cpu=$1 +build_vendor=$2 +shift; shift +# Remember, the first character of IFS is used to create $*, +# except with old shells: +build_os=$* +IFS=$ac_save_IFS +case $build_os in *\ *) build_os=`echo "$build_os" | sed 's/ /-/g'`;; esac + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking host system type" >&5 +$as_echo_n "checking host system type... " >&6; } +if ${ac_cv_host+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test "x$host_alias" = x; then + ac_cv_host=$ac_cv_build +else + ac_cv_host=`$SHELL "$ac_aux_dir/config.sub" $host_alias` || + as_fn_error $? "$SHELL $ac_aux_dir/config.sub $host_alias failed" "$LINENO" 5 +fi + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_host" >&5 +$as_echo "$ac_cv_host" >&6; } +case $ac_cv_host in +*-*-*) ;; +*) as_fn_error $? "invalid value of canonical host" "$LINENO" 5;; +esac +host=$ac_cv_host +ac_save_IFS=$IFS; IFS='-' +set x $ac_cv_host +shift +host_cpu=$1 +host_vendor=$2 +shift; shift +# Remember, the first character of IFS is used to create $*, +# except with old shells: +host_os=$* +IFS=$ac_save_IFS +case $host_os in *\ *) host_os=`echo "$host_os" | sed 's/ /-/g'`;; esac + + +# Backslashify metacharacters that are still active within +# double-quoted strings. +sed_quote_subst='s/\(["`$\\]\)/\\\1/g' + +# Same as above, but do not quote variable references. +double_quote_subst='s/\(["`\\]\)/\\\1/g' + +# Sed substitution to delay expansion of an escaped shell variable in a +# double_quote_subst'ed string. +delay_variable_subst='s/\\\\\\\\\\\$/\\\\\\$/g' + +# Sed substitution to delay expansion of an escaped single quote. +delay_single_quote_subst='s/'\''/'\'\\\\\\\'\''/g' + +# Sed substitution to avoid accidental globbing in evaled expressions +no_glob_subst='s/\*/\\\*/g' + +ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' +ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO +ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO$ECHO + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to print strings" >&5 +$as_echo_n "checking how to print strings... " >&6; } +# Test print first, because it will be a builtin if present. +if test "X`( print -r -- -n ) 2>/dev/null`" = X-n && \ + test "X`print -r -- $ECHO 2>/dev/null`" = "X$ECHO"; then + ECHO='print -r --' +elif test "X`printf %s $ECHO 2>/dev/null`" = "X$ECHO"; then + ECHO='printf %s\n' +else + # Use this function as a fallback that always works. + func_fallback_echo () + { + eval 'cat <<_LTECHO_EOF +$1 +_LTECHO_EOF' + } + ECHO='func_fallback_echo' +fi + +# func_echo_all arg... +# Invoke $ECHO with all args, space-separated. +func_echo_all () +{ + $ECHO "" +} + +case "$ECHO" in + printf*) { $as_echo "$as_me:${as_lineno-$LINENO}: result: printf" >&5 +$as_echo "printf" >&6; } ;; + print*) { $as_echo "$as_me:${as_lineno-$LINENO}: result: print -r" >&5 +$as_echo "print -r" >&6; } ;; + *) { $as_echo "$as_me:${as_lineno-$LINENO}: result: cat" >&5 +$as_echo "cat" >&6; } ;; +esac + + + + + + + + + + + + + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a sed that does not truncate output" >&5 +$as_echo_n "checking for a sed that does not truncate output... " >&6; } +if ${ac_cv_path_SED+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_script=s/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb/ + for ac_i in 1 2 3 4 5 6 7; do + ac_script="$ac_script$as_nl$ac_script" + done + echo "$ac_script" 2>/dev/null | sed 99q >conftest.sed + { ac_script=; unset ac_script;} + if test -z "$SED"; then + ac_path_SED_found=false + # Loop through the user's path and test for each of PROGNAME-LIST + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_prog in sed gsed; do + for ac_exec_ext in '' $ac_executable_extensions; do + ac_path_SED="$as_dir/$ac_prog$ac_exec_ext" + as_fn_executable_p "$ac_path_SED" || continue +# Check for GNU ac_path_SED and select it if it is found. + # Check for GNU $ac_path_SED +case `"$ac_path_SED" --version 2>&1` in +*GNU*) + ac_cv_path_SED="$ac_path_SED" ac_path_SED_found=:;; +*) + ac_count=0 + $as_echo_n 0123456789 >"conftest.in" + while : + do + cat "conftest.in" "conftest.in" >"conftest.tmp" + mv "conftest.tmp" "conftest.in" + cp "conftest.in" "conftest.nl" + $as_echo '' >> "conftest.nl" + "$ac_path_SED" -f conftest.sed < "conftest.nl" >"conftest.out" 2>/dev/null || break + diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break + as_fn_arith $ac_count + 1 && ac_count=$as_val + if test $ac_count -gt ${ac_path_SED_max-0}; then + # Best one so far, save it but keep looking for a better one + ac_cv_path_SED="$ac_path_SED" + ac_path_SED_max=$ac_count + fi + # 10*(2^10) chars as input seems more than enough + test $ac_count -gt 10 && break + done + rm -f conftest.in conftest.tmp conftest.nl conftest.out;; +esac + + $ac_path_SED_found && break 3 + done + done + done +IFS=$as_save_IFS + if test -z "$ac_cv_path_SED"; then + as_fn_error $? "no acceptable sed could be found in \$PATH" "$LINENO" 5 + fi +else + ac_cv_path_SED=$SED +fi + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_SED" >&5 +$as_echo "$ac_cv_path_SED" >&6; } + SED="$ac_cv_path_SED" + rm -f conftest.sed + +test -z "$SED" && SED=sed +Xsed="$SED -e 1s/^X//" + + + + + + + + + + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for grep that handles long lines and -e" >&5 +$as_echo_n "checking for grep that handles long lines and -e... " >&6; } +if ${ac_cv_path_GREP+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -z "$GREP"; then + ac_path_GREP_found=false + # Loop through the user's path and test for each of PROGNAME-LIST + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_prog in grep ggrep; do + for ac_exec_ext in '' $ac_executable_extensions; do + ac_path_GREP="$as_dir/$ac_prog$ac_exec_ext" + as_fn_executable_p "$ac_path_GREP" || continue +# Check for GNU ac_path_GREP and select it if it is found. + # Check for GNU $ac_path_GREP +case `"$ac_path_GREP" --version 2>&1` in +*GNU*) + ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_found=:;; +*) + ac_count=0 + $as_echo_n 0123456789 >"conftest.in" + while : + do + cat "conftest.in" "conftest.in" >"conftest.tmp" + mv "conftest.tmp" "conftest.in" + cp "conftest.in" "conftest.nl" + $as_echo 'GREP' >> "conftest.nl" + "$ac_path_GREP" -e 'GREP$' -e '-(cannot match)-' < "conftest.nl" >"conftest.out" 2>/dev/null || break + diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break + as_fn_arith $ac_count + 1 && ac_count=$as_val + if test $ac_count -gt ${ac_path_GREP_max-0}; then + # Best one so far, save it but keep looking for a better one + ac_cv_path_GREP="$ac_path_GREP" + ac_path_GREP_max=$ac_count + fi + # 10*(2^10) chars as input seems more than enough + test $ac_count -gt 10 && break + done + rm -f conftest.in conftest.tmp conftest.nl conftest.out;; +esac + + $ac_path_GREP_found && break 3 + done + done + done +IFS=$as_save_IFS + if test -z "$ac_cv_path_GREP"; then + as_fn_error $? "no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 + fi +else + ac_cv_path_GREP=$GREP +fi + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_GREP" >&5 +$as_echo "$ac_cv_path_GREP" >&6; } + GREP="$ac_cv_path_GREP" + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for egrep" >&5 +$as_echo_n "checking for egrep... " >&6; } +if ${ac_cv_path_EGREP+:} false; then : + $as_echo_n "(cached) " >&6 +else + if echo a | $GREP -E '(a|b)' >/dev/null 2>&1 + then ac_cv_path_EGREP="$GREP -E" + else + if test -z "$EGREP"; then + ac_path_EGREP_found=false + # Loop through the user's path and test for each of PROGNAME-LIST + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_prog in egrep; do + for ac_exec_ext in '' $ac_executable_extensions; do + ac_path_EGREP="$as_dir/$ac_prog$ac_exec_ext" + as_fn_executable_p "$ac_path_EGREP" || continue +# Check for GNU ac_path_EGREP and select it if it is found. + # Check for GNU $ac_path_EGREP +case `"$ac_path_EGREP" --version 2>&1` in +*GNU*) + ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_found=:;; +*) + ac_count=0 + $as_echo_n 0123456789 >"conftest.in" + while : + do + cat "conftest.in" "conftest.in" >"conftest.tmp" + mv "conftest.tmp" "conftest.in" + cp "conftest.in" "conftest.nl" + $as_echo 'EGREP' >> "conftest.nl" + "$ac_path_EGREP" 'EGREP$' < "conftest.nl" >"conftest.out" 2>/dev/null || break + diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break + as_fn_arith $ac_count + 1 && ac_count=$as_val + if test $ac_count -gt ${ac_path_EGREP_max-0}; then + # Best one so far, save it but keep looking for a better one + ac_cv_path_EGREP="$ac_path_EGREP" + ac_path_EGREP_max=$ac_count + fi + # 10*(2^10) chars as input seems more than enough + test $ac_count -gt 10 && break + done + rm -f conftest.in conftest.tmp conftest.nl conftest.out;; +esac + + $ac_path_EGREP_found && break 3 + done + done + done +IFS=$as_save_IFS + if test -z "$ac_cv_path_EGREP"; then + as_fn_error $? "no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 + fi +else + ac_cv_path_EGREP=$EGREP +fi + + fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_EGREP" >&5 +$as_echo "$ac_cv_path_EGREP" >&6; } + EGREP="$ac_cv_path_EGREP" + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for fgrep" >&5 +$as_echo_n "checking for fgrep... " >&6; } +if ${ac_cv_path_FGREP+:} false; then : + $as_echo_n "(cached) " >&6 +else + if echo 'ab*c' | $GREP -F 'ab*c' >/dev/null 2>&1 + then ac_cv_path_FGREP="$GREP -F" + else + if test -z "$FGREP"; then + ac_path_FGREP_found=false + # Loop through the user's path and test for each of PROGNAME-LIST + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_prog in fgrep; do + for ac_exec_ext in '' $ac_executable_extensions; do + ac_path_FGREP="$as_dir/$ac_prog$ac_exec_ext" + as_fn_executable_p "$ac_path_FGREP" || continue +# Check for GNU ac_path_FGREP and select it if it is found. + # Check for GNU $ac_path_FGREP +case `"$ac_path_FGREP" --version 2>&1` in +*GNU*) + ac_cv_path_FGREP="$ac_path_FGREP" ac_path_FGREP_found=:;; +*) + ac_count=0 + $as_echo_n 0123456789 >"conftest.in" + while : + do + cat "conftest.in" "conftest.in" >"conftest.tmp" + mv "conftest.tmp" "conftest.in" + cp "conftest.in" "conftest.nl" + $as_echo 'FGREP' >> "conftest.nl" + "$ac_path_FGREP" FGREP < "conftest.nl" >"conftest.out" 2>/dev/null || break + diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break + as_fn_arith $ac_count + 1 && ac_count=$as_val + if test $ac_count -gt ${ac_path_FGREP_max-0}; then + # Best one so far, save it but keep looking for a better one + ac_cv_path_FGREP="$ac_path_FGREP" + ac_path_FGREP_max=$ac_count + fi + # 10*(2^10) chars as input seems more than enough + test $ac_count -gt 10 && break + done + rm -f conftest.in conftest.tmp conftest.nl conftest.out;; +esac + + $ac_path_FGREP_found && break 3 + done + done + done +IFS=$as_save_IFS + if test -z "$ac_cv_path_FGREP"; then + as_fn_error $? "no acceptable fgrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 + fi +else + ac_cv_path_FGREP=$FGREP +fi + + fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_FGREP" >&5 +$as_echo "$ac_cv_path_FGREP" >&6; } + FGREP="$ac_cv_path_FGREP" + + +test -z "$GREP" && GREP=grep + + + + + + + + + + + + + + + + + + + +@%:@ Check whether --with-gnu-ld was given. +if test "${with_gnu_ld+set}" = set; then : + withval=$with_gnu_ld; test "$withval" = no || with_gnu_ld=yes +else + with_gnu_ld=no +fi + +ac_prog=ld +if test "$GCC" = yes; then + # Check if gcc -print-prog-name=ld gives a path. + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ld used by $CC" >&5 +$as_echo_n "checking for ld used by $CC... " >&6; } + case $host in + *-*-mingw*) + # gcc leaves a trailing carriage return which upsets mingw + ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;; + *) + ac_prog=`($CC -print-prog-name=ld) 2>&5` ;; + esac + case $ac_prog in + # Accept absolute paths. + [\\/]* | ?:[\\/]*) + re_direlt='/[^/][^/]*/\.\./' + # Canonicalize the pathname of ld + ac_prog=`$ECHO "$ac_prog"| $SED 's%\\\\%/%g'` + while $ECHO "$ac_prog" | $GREP "$re_direlt" > /dev/null 2>&1; do + ac_prog=`$ECHO $ac_prog| $SED "s%$re_direlt%/%"` + done + test -z "$LD" && LD="$ac_prog" + ;; + "") + # If it fails, then pretend we aren't using GCC. + ac_prog=ld + ;; + *) + # If it is relative, then search for the first ld in PATH. + with_gnu_ld=unknown + ;; + esac +elif test "$with_gnu_ld" = yes; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU ld" >&5 +$as_echo_n "checking for GNU ld... " >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for non-GNU ld" >&5 +$as_echo_n "checking for non-GNU ld... " >&6; } +fi +if ${lt_cv_path_LD+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -z "$LD"; then + lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR + for ac_dir in $PATH; do + IFS="$lt_save_ifs" + test -z "$ac_dir" && ac_dir=. + if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then + lt_cv_path_LD="$ac_dir/$ac_prog" + # Check to see if the program is GNU ld. I'd rather use --version, + # but apparently some variants of GNU ld only accept -v. + # Break only if it was the GNU/non-GNU ld that we prefer. + case `"$lt_cv_path_LD" -v 2>&1 &5 +$as_echo "$LD" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi +test -z "$LD" && as_fn_error $? "no acceptable ld found in \$PATH" "$LINENO" 5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if the linker ($LD) is GNU ld" >&5 +$as_echo_n "checking if the linker ($LD) is GNU ld... " >&6; } +if ${lt_cv_prog_gnu_ld+:} false; then : + $as_echo_n "(cached) " >&6 +else + # I'd rather use --version here, but apparently some GNU lds only accept -v. +case `$LD -v 2>&1 &5 +$as_echo "$lt_cv_prog_gnu_ld" >&6; } +with_gnu_ld=$lt_cv_prog_gnu_ld + + + + + + + + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for BSD- or MS-compatible name lister (nm)" >&5 +$as_echo_n "checking for BSD- or MS-compatible name lister (nm)... " >&6; } +if ${lt_cv_path_NM+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$NM"; then + # Let the user override the test. + lt_cv_path_NM="$NM" +else + lt_nm_to_check="${ac_tool_prefix}nm" + if test -n "$ac_tool_prefix" && test "$build" = "$host"; then + lt_nm_to_check="$lt_nm_to_check nm" + fi + for lt_tmp_nm in $lt_nm_to_check; do + lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR + for ac_dir in $PATH /usr/ccs/bin/elf /usr/ccs/bin /usr/ucb /bin; do + IFS="$lt_save_ifs" + test -z "$ac_dir" && ac_dir=. + tmp_nm="$ac_dir/$lt_tmp_nm" + if test -f "$tmp_nm" || test -f "$tmp_nm$ac_exeext" ; then + # Check to see if the nm accepts a BSD-compat flag. + # Adding the `sed 1q' prevents false positives on HP-UX, which says: + # nm: unknown option "B" ignored + # Tru64's nm complains that /dev/null is an invalid object file + case `"$tmp_nm" -B /dev/null 2>&1 | sed '1q'` in + */dev/null* | *'Invalid file or object type'*) + lt_cv_path_NM="$tmp_nm -B" + break + ;; + *) + case `"$tmp_nm" -p /dev/null 2>&1 | sed '1q'` in + */dev/null*) + lt_cv_path_NM="$tmp_nm -p" + break + ;; + *) + lt_cv_path_NM=${lt_cv_path_NM="$tmp_nm"} # keep the first match, but + continue # so that we can try to find one that supports BSD flags + ;; + esac + ;; + esac + fi + done + IFS="$lt_save_ifs" + done + : ${lt_cv_path_NM=no} +fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_path_NM" >&5 +$as_echo "$lt_cv_path_NM" >&6; } +if test "$lt_cv_path_NM" != "no"; then + NM="$lt_cv_path_NM" +else + # Didn't find any BSD compatible name lister, look for dumpbin. + if test -n "$DUMPBIN"; then : + # Let the user override the test. + else + if test -n "$ac_tool_prefix"; then + for ac_prog in dumpbin "link -dump" + do + # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. +set dummy $ac_tool_prefix$ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_DUMPBIN+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$DUMPBIN"; then + ac_cv_prog_DUMPBIN="$DUMPBIN" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_DUMPBIN="$ac_tool_prefix$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +DUMPBIN=$ac_cv_prog_DUMPBIN +if test -n "$DUMPBIN"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DUMPBIN" >&5 +$as_echo "$DUMPBIN" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$DUMPBIN" && break + done +fi +if test -z "$DUMPBIN"; then + ac_ct_DUMPBIN=$DUMPBIN + for ac_prog in dumpbin "link -dump" +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_DUMPBIN+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_DUMPBIN"; then + ac_cv_prog_ac_ct_DUMPBIN="$ac_ct_DUMPBIN" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_DUMPBIN="$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_DUMPBIN=$ac_cv_prog_ac_ct_DUMPBIN +if test -n "$ac_ct_DUMPBIN"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DUMPBIN" >&5 +$as_echo "$ac_ct_DUMPBIN" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$ac_ct_DUMPBIN" && break +done + + if test "x$ac_ct_DUMPBIN" = x; then + DUMPBIN=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + DUMPBIN=$ac_ct_DUMPBIN + fi +fi + + case `$DUMPBIN -symbols /dev/null 2>&1 | sed '1q'` in + *COFF*) + DUMPBIN="$DUMPBIN -symbols" + ;; + *) + DUMPBIN=: + ;; + esac + fi + + if test "$DUMPBIN" != ":"; then + NM="$DUMPBIN" + fi +fi +test -z "$NM" && NM=nm + + + + + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking the name lister ($NM) interface" >&5 +$as_echo_n "checking the name lister ($NM) interface... " >&6; } +if ${lt_cv_nm_interface+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_nm_interface="BSD nm" + echo "int some_variable = 0;" > conftest.$ac_ext + (eval echo "\"\$as_me:$LINENO: $ac_compile\"" >&5) + (eval "$ac_compile" 2>conftest.err) + cat conftest.err >&5 + (eval echo "\"\$as_me:$LINENO: $NM \\\"conftest.$ac_objext\\\"\"" >&5) + (eval "$NM \"conftest.$ac_objext\"" 2>conftest.err > conftest.out) + cat conftest.err >&5 + (eval echo "\"\$as_me:$LINENO: output\"" >&5) + cat conftest.out >&5 + if $GREP 'External.*some_variable' conftest.out > /dev/null; then + lt_cv_nm_interface="MS dumpbin" + fi + rm -f conftest* +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_nm_interface" >&5 +$as_echo "$lt_cv_nm_interface" >&6; } + +# find the maximum length of command line arguments +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking the maximum length of command line arguments" >&5 +$as_echo_n "checking the maximum length of command line arguments... " >&6; } +if ${lt_cv_sys_max_cmd_len+:} false; then : + $as_echo_n "(cached) " >&6 +else + i=0 + teststring="ABCD" + + case $build_os in + msdosdjgpp*) + # On DJGPP, this test can blow up pretty badly due to problems in libc + # (any single argument exceeding 2000 bytes causes a buffer overrun + # during glob expansion). Even if it were fixed, the result of this + # check would be larger than it should be. + lt_cv_sys_max_cmd_len=12288; # 12K is about right + ;; + + gnu*) + # Under GNU Hurd, this test is not required because there is + # no limit to the length of command line arguments. + # Libtool will interpret -1 as no limit whatsoever + lt_cv_sys_max_cmd_len=-1; + ;; + + cygwin* | mingw* | cegcc*) + # On Win9x/ME, this test blows up -- it succeeds, but takes + # about 5 minutes as the teststring grows exponentially. + # Worse, since 9x/ME are not pre-emptively multitasking, + # you end up with a "frozen" computer, even though with patience + # the test eventually succeeds (with a max line length of 256k). + # Instead, let's just punt: use the minimum linelength reported by + # all of the supported platforms: 8192 (on NT/2K/XP). + lt_cv_sys_max_cmd_len=8192; + ;; + + mint*) + # On MiNT this can take a long time and run out of memory. + lt_cv_sys_max_cmd_len=8192; + ;; + + amigaos*) + # On AmigaOS with pdksh, this test takes hours, literally. + # So we just punt and use a minimum line length of 8192. + lt_cv_sys_max_cmd_len=8192; + ;; + + netbsd* | freebsd* | openbsd* | darwin* | dragonfly*) + # This has been around since 386BSD, at least. Likely further. + if test -x /sbin/sysctl; then + lt_cv_sys_max_cmd_len=`/sbin/sysctl -n kern.argmax` + elif test -x /usr/sbin/sysctl; then + lt_cv_sys_max_cmd_len=`/usr/sbin/sysctl -n kern.argmax` + else + lt_cv_sys_max_cmd_len=65536 # usable default for all BSDs + fi + # And add a safety zone + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` + ;; + + interix*) + # We know the value 262144 and hardcode it with a safety zone (like BSD) + lt_cv_sys_max_cmd_len=196608 + ;; + + os2*) + # The test takes a long time on OS/2. + lt_cv_sys_max_cmd_len=8192 + ;; + + osf*) + # Dr. Hans Ekkehard Plesser reports seeing a kernel panic running configure + # due to this test when exec_disable_arg_limit is 1 on Tru64. It is not + # nice to cause kernel panics so lets avoid the loop below. + # First set a reasonable default. + lt_cv_sys_max_cmd_len=16384 + # + if test -x /sbin/sysconfig; then + case `/sbin/sysconfig -q proc exec_disable_arg_limit` in + *1*) lt_cv_sys_max_cmd_len=-1 ;; + esac + fi + ;; + sco3.2v5*) + lt_cv_sys_max_cmd_len=102400 + ;; + sysv5* | sco5v6* | sysv4.2uw2*) + kargmax=`grep ARG_MAX /etc/conf/cf.d/stune 2>/dev/null` + if test -n "$kargmax"; then + lt_cv_sys_max_cmd_len=`echo $kargmax | sed 's/.*[ ]//'` + else + lt_cv_sys_max_cmd_len=32768 + fi + ;; + *) + lt_cv_sys_max_cmd_len=`(getconf ARG_MAX) 2> /dev/null` + if test -n "$lt_cv_sys_max_cmd_len"; then + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` + else + # Make teststring a little bigger before we do anything with it. + # a 1K string should be a reasonable start. + for i in 1 2 3 4 5 6 7 8 ; do + teststring=$teststring$teststring + done + SHELL=${SHELL-${CONFIG_SHELL-/bin/sh}} + # If test is not a shell built-in, we'll probably end up computing a + # maximum length that is only half of the actual maximum length, but + # we can't tell. + while { test "X"`env echo "$teststring$teststring" 2>/dev/null` \ + = "X$teststring$teststring"; } >/dev/null 2>&1 && + test $i != 17 # 1/2 MB should be enough + do + i=`expr $i + 1` + teststring=$teststring$teststring + done + # Only check the string length outside the loop. + lt_cv_sys_max_cmd_len=`expr "X$teststring" : ".*" 2>&1` + teststring= + # Add a significant safety factor because C++ compilers can tack on + # massive amounts of additional arguments before passing them to the + # linker. It appears as though 1/2 is a usable value. + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 2` + fi + ;; + esac + +fi + +if test -n $lt_cv_sys_max_cmd_len ; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_sys_max_cmd_len" >&5 +$as_echo "$lt_cv_sys_max_cmd_len" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: none" >&5 +$as_echo "none" >&6; } +fi +max_cmd_len=$lt_cv_sys_max_cmd_len + + + + + + +: ${CP="cp -f"} +: ${MV="mv -f"} +: ${RM="rm -f"} + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the shell understands some XSI constructs" >&5 +$as_echo_n "checking whether the shell understands some XSI constructs... " >&6; } +# Try some XSI features +xsi_shell=no +( _lt_dummy="a/b/c" + test "${_lt_dummy##*/},${_lt_dummy%/*},${_lt_dummy#??}"${_lt_dummy%"$_lt_dummy"}, \ + = c,a/b,b/c, \ + && eval 'test $(( 1 + 1 )) -eq 2 \ + && test "${#_lt_dummy}" -eq 5' ) >/dev/null 2>&1 \ + && xsi_shell=yes +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $xsi_shell" >&5 +$as_echo "$xsi_shell" >&6; } + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the shell understands \"+=\"" >&5 +$as_echo_n "checking whether the shell understands \"+=\"... " >&6; } +lt_shell_append=no +( foo=bar; set foo baz; eval "$1+=\$2" && test "$foo" = barbaz ) \ + >/dev/null 2>&1 \ + && lt_shell_append=yes +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_shell_append" >&5 +$as_echo "$lt_shell_append" >&6; } + + +if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then + lt_unset=unset +else + lt_unset=false +fi + + + + + +# test EBCDIC or ASCII +case `echo X|tr X '\101'` in + A) # ASCII based system + # \n is not interpreted correctly by Solaris 8 /usr/ucb/tr + lt_SP2NL='tr \040 \012' + lt_NL2SP='tr \015\012 \040\040' + ;; + *) # EBCDIC based system + lt_SP2NL='tr \100 \n' + lt_NL2SP='tr \r\n \100\100' + ;; +esac + + + + + + + + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to convert $build file names to $host format" >&5 +$as_echo_n "checking how to convert $build file names to $host format... " >&6; } +if ${lt_cv_to_host_file_cmd+:} false; then : + $as_echo_n "(cached) " >&6 +else + case $host in + *-*-mingw* ) + case $build in + *-*-mingw* ) # actually msys + lt_cv_to_host_file_cmd=func_convert_file_msys_to_w32 + ;; + *-*-cygwin* ) + lt_cv_to_host_file_cmd=func_convert_file_cygwin_to_w32 + ;; + * ) # otherwise, assume *nix + lt_cv_to_host_file_cmd=func_convert_file_nix_to_w32 + ;; + esac + ;; + *-*-cygwin* ) + case $build in + *-*-mingw* ) # actually msys + lt_cv_to_host_file_cmd=func_convert_file_msys_to_cygwin + ;; + *-*-cygwin* ) + lt_cv_to_host_file_cmd=func_convert_file_noop + ;; + * ) # otherwise, assume *nix + lt_cv_to_host_file_cmd=func_convert_file_nix_to_cygwin + ;; + esac + ;; + * ) # unhandled hosts (and "normal" native builds) + lt_cv_to_host_file_cmd=func_convert_file_noop + ;; +esac + +fi + +to_host_file_cmd=$lt_cv_to_host_file_cmd +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_to_host_file_cmd" >&5 +$as_echo "$lt_cv_to_host_file_cmd" >&6; } + + + + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to convert $build file names to toolchain format" >&5 +$as_echo_n "checking how to convert $build file names to toolchain format... " >&6; } +if ${lt_cv_to_tool_file_cmd+:} false; then : + $as_echo_n "(cached) " >&6 +else + #assume ordinary cross tools, or native build. +lt_cv_to_tool_file_cmd=func_convert_file_noop +case $host in + *-*-mingw* ) + case $build in + *-*-mingw* ) # actually msys + lt_cv_to_tool_file_cmd=func_convert_file_msys_to_w32 + ;; + esac + ;; +esac + +fi + +to_tool_file_cmd=$lt_cv_to_tool_file_cmd +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_to_tool_file_cmd" >&5 +$as_echo "$lt_cv_to_tool_file_cmd" >&6; } + + + + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $LD option to reload object files" >&5 +$as_echo_n "checking for $LD option to reload object files... " >&6; } +if ${lt_cv_ld_reload_flag+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_ld_reload_flag='-r' +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_reload_flag" >&5 +$as_echo "$lt_cv_ld_reload_flag" >&6; } +reload_flag=$lt_cv_ld_reload_flag +case $reload_flag in +"" | " "*) ;; +*) reload_flag=" $reload_flag" ;; +esac +reload_cmds='$LD$reload_flag -o $output$reload_objs' +case $host_os in + cygwin* | mingw* | pw32* | cegcc*) + if test "$GCC" != yes; then + reload_cmds=false + fi + ;; + darwin*) + if test "$GCC" = yes; then + reload_cmds='$LTCC $LTCFLAGS -nostdlib ${wl}-r -o $output$reload_objs' + else + reload_cmds='$LD$reload_flag -o $output$reload_objs' + fi + ;; +esac + + + + + + + + + +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}objdump", so it can be a program name with args. +set dummy ${ac_tool_prefix}objdump; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_OBJDUMP+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$OBJDUMP"; then + ac_cv_prog_OBJDUMP="$OBJDUMP" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_OBJDUMP="${ac_tool_prefix}objdump" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +OBJDUMP=$ac_cv_prog_OBJDUMP +if test -n "$OBJDUMP"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OBJDUMP" >&5 +$as_echo "$OBJDUMP" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_OBJDUMP"; then + ac_ct_OBJDUMP=$OBJDUMP + # Extract the first word of "objdump", so it can be a program name with args. +set dummy objdump; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_OBJDUMP+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_OBJDUMP"; then + ac_cv_prog_ac_ct_OBJDUMP="$ac_ct_OBJDUMP" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_OBJDUMP="objdump" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_OBJDUMP=$ac_cv_prog_ac_ct_OBJDUMP +if test -n "$ac_ct_OBJDUMP"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OBJDUMP" >&5 +$as_echo "$ac_ct_OBJDUMP" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_OBJDUMP" = x; then + OBJDUMP="false" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + OBJDUMP=$ac_ct_OBJDUMP + fi +else + OBJDUMP="$ac_cv_prog_OBJDUMP" +fi + +test -z "$OBJDUMP" && OBJDUMP=objdump + + + + + + + + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to recognize dependent libraries" >&5 +$as_echo_n "checking how to recognize dependent libraries... " >&6; } +if ${lt_cv_deplibs_check_method+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_file_magic_cmd='$MAGIC_CMD' +lt_cv_file_magic_test_file= +lt_cv_deplibs_check_method='unknown' +# Need to set the preceding variable on all platforms that support +# interlibrary dependencies. +# 'none' -- dependencies not supported. +# `unknown' -- same as none, but documents that we really don't know. +# 'pass_all' -- all dependencies passed with no checks. +# 'test_compile' -- check by making test program. +# 'file_magic [[regex]]' -- check by looking for files in library path +# which responds to the $file_magic_cmd with a given extended regex. +# If you have `file' or equivalent on your system and you're not sure +# whether `pass_all' will *always* work, you probably want this one. + +case $host_os in +aix[4-9]*) + lt_cv_deplibs_check_method=pass_all + ;; + +beos*) + lt_cv_deplibs_check_method=pass_all + ;; + +bsdi[45]*) + lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (shared object|dynamic lib)' + lt_cv_file_magic_cmd='/usr/bin/file -L' + lt_cv_file_magic_test_file=/shlib/libc.so + ;; + +cygwin*) + # func_win32_libid is a shell function defined in ltmain.sh + lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL' + lt_cv_file_magic_cmd='func_win32_libid' + ;; + +mingw* | pw32*) + # Base MSYS/MinGW do not provide the 'file' command needed by + # func_win32_libid shell function, so use a weaker test based on 'objdump', + # unless we find 'file', for example because we are cross-compiling. + # func_win32_libid assumes BSD nm, so disallow it if using MS dumpbin. + if ( test "$lt_cv_nm_interface" = "BSD nm" && file / ) >/dev/null 2>&1; then + lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL' + lt_cv_file_magic_cmd='func_win32_libid' + else + # Keep this pattern in sync with the one in func_win32_libid. + lt_cv_deplibs_check_method='file_magic file format (pei*-i386(.*architecture: i386)?|pe-arm-wince|pe-x86-64)' + lt_cv_file_magic_cmd='$OBJDUMP -f' + fi + ;; + +cegcc*) + # use the weaker test based on 'objdump'. See mingw*. + lt_cv_deplibs_check_method='file_magic file format pe-arm-.*little(.*architecture: arm)?' + lt_cv_file_magic_cmd='$OBJDUMP -f' + ;; + +darwin* | rhapsody*) + lt_cv_deplibs_check_method=pass_all + ;; + +freebsd* | dragonfly*) + if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then + case $host_cpu in + i*86 ) + # Not sure whether the presence of OpenBSD here was a mistake. + # Let's accept both of them until this is cleared up. + lt_cv_deplibs_check_method='file_magic (FreeBSD|OpenBSD|DragonFly)/i[3-9]86 (compact )?demand paged shared library' + lt_cv_file_magic_cmd=/usr/bin/file + lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*` + ;; + esac + else + lt_cv_deplibs_check_method=pass_all + fi + ;; + +gnu*) + lt_cv_deplibs_check_method=pass_all + ;; + +haiku*) + lt_cv_deplibs_check_method=pass_all + ;; + +hpux10.20* | hpux11*) + lt_cv_file_magic_cmd=/usr/bin/file + case $host_cpu in + ia64*) + lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF-[0-9][0-9]) shared object file - IA64' + lt_cv_file_magic_test_file=/usr/lib/hpux32/libc.so + ;; + hppa*64*) + lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF[ -][0-9][0-9])(-bit)?( [LM]SB)? shared object( file)?[, -]* PA-RISC [0-9]\.[0-9]' + lt_cv_file_magic_test_file=/usr/lib/pa20_64/libc.sl + ;; + *) + lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|PA-RISC[0-9]\.[0-9]) shared library' + lt_cv_file_magic_test_file=/usr/lib/libc.sl + ;; + esac + ;; + +interix[3-9]*) + # PIC code is broken on Interix 3.x, that's why |\.a not |_pic\.a here + lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so|\.a)$' + ;; + +irix5* | irix6* | nonstopux*) + case $LD in + *-32|*"-32 ") libmagic=32-bit;; + *-n32|*"-n32 ") libmagic=N32;; + *-64|*"-64 ") libmagic=64-bit;; + *) libmagic=never-match;; + esac + lt_cv_deplibs_check_method=pass_all + ;; + +# This must be glibc/ELF. +linux* | k*bsd*-gnu | kopensolaris*-gnu) + lt_cv_deplibs_check_method=pass_all + ;; + +netbsd* | netbsdelf*-gnu) + if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then + lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|_pic\.a)$' + else + lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so|_pic\.a)$' + fi + ;; + +newos6*) + lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (executable|dynamic lib)' + lt_cv_file_magic_cmd=/usr/bin/file + lt_cv_file_magic_test_file=/usr/lib/libnls.so + ;; + +*nto* | *qnx*) + lt_cv_deplibs_check_method=pass_all + ;; + +openbsd*) + if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then + lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|\.so|_pic\.a)$' + else + lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|_pic\.a)$' + fi + ;; + +osf3* | osf4* | osf5*) + lt_cv_deplibs_check_method=pass_all + ;; + +rdos*) + lt_cv_deplibs_check_method=pass_all + ;; + +solaris*) + lt_cv_deplibs_check_method=pass_all + ;; + +sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) + lt_cv_deplibs_check_method=pass_all + ;; + +sysv4 | sysv4.3*) + case $host_vendor in + motorola) + lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (shared object|dynamic lib) M[0-9][0-9]* Version [0-9]' + lt_cv_file_magic_test_file=`echo /usr/lib/libc.so*` + ;; + ncr) + lt_cv_deplibs_check_method=pass_all + ;; + sequent) + lt_cv_file_magic_cmd='/bin/file' + lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [LM]SB (shared object|dynamic lib )' + ;; + sni) + lt_cv_file_magic_cmd='/bin/file' + lt_cv_deplibs_check_method="file_magic ELF [0-9][0-9]*-bit [LM]SB dynamic lib" + lt_cv_file_magic_test_file=/lib/libc.so + ;; + siemens) + lt_cv_deplibs_check_method=pass_all + ;; + pc) + lt_cv_deplibs_check_method=pass_all + ;; + esac + ;; + +tpf*) + lt_cv_deplibs_check_method=pass_all + ;; +esac + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_deplibs_check_method" >&5 +$as_echo "$lt_cv_deplibs_check_method" >&6; } + +file_magic_glob= +want_nocaseglob=no +if test "$build" = "$host"; then + case $host_os in + mingw* | pw32*) + if ( shopt | grep nocaseglob ) >/dev/null 2>&1; then + want_nocaseglob=yes + else + file_magic_glob=`echo aAbBcCdDeEfFgGhHiIjJkKlLmMnNoOpPqQrRsStTuUvVwWxXyYzZ | $SED -e "s/\(..\)/s\/[\1]\/[\1]\/g;/g"` + fi + ;; + esac +fi + +file_magic_cmd=$lt_cv_file_magic_cmd +deplibs_check_method=$lt_cv_deplibs_check_method +test -z "$deplibs_check_method" && deplibs_check_method=unknown + + + + + + + + + + + + + + + + + + + + + + +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}dlltool", so it can be a program name with args. +set dummy ${ac_tool_prefix}dlltool; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_DLLTOOL+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$DLLTOOL"; then + ac_cv_prog_DLLTOOL="$DLLTOOL" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_DLLTOOL="${ac_tool_prefix}dlltool" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +DLLTOOL=$ac_cv_prog_DLLTOOL +if test -n "$DLLTOOL"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DLLTOOL" >&5 +$as_echo "$DLLTOOL" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_DLLTOOL"; then + ac_ct_DLLTOOL=$DLLTOOL + # Extract the first word of "dlltool", so it can be a program name with args. +set dummy dlltool; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_DLLTOOL+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_DLLTOOL"; then + ac_cv_prog_ac_ct_DLLTOOL="$ac_ct_DLLTOOL" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_DLLTOOL="dlltool" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_DLLTOOL=$ac_cv_prog_ac_ct_DLLTOOL +if test -n "$ac_ct_DLLTOOL"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DLLTOOL" >&5 +$as_echo "$ac_ct_DLLTOOL" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_DLLTOOL" = x; then + DLLTOOL="false" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + DLLTOOL=$ac_ct_DLLTOOL + fi +else + DLLTOOL="$ac_cv_prog_DLLTOOL" +fi + +test -z "$DLLTOOL" && DLLTOOL=dlltool + + + + + + + + + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to associate runtime and link libraries" >&5 +$as_echo_n "checking how to associate runtime and link libraries... " >&6; } +if ${lt_cv_sharedlib_from_linklib_cmd+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_sharedlib_from_linklib_cmd='unknown' + +case $host_os in +cygwin* | mingw* | pw32* | cegcc*) + # two different shell functions defined in ltmain.sh + # decide which to use based on capabilities of $DLLTOOL + case `$DLLTOOL --help 2>&1` in + *--identify-strict*) + lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib + ;; + *) + lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib_fallback + ;; + esac + ;; +*) + # fallback: assume linklib IS sharedlib + lt_cv_sharedlib_from_linklib_cmd="$ECHO" + ;; +esac + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_sharedlib_from_linklib_cmd" >&5 +$as_echo "$lt_cv_sharedlib_from_linklib_cmd" >&6; } +sharedlib_from_linklib_cmd=$lt_cv_sharedlib_from_linklib_cmd +test -z "$sharedlib_from_linklib_cmd" && sharedlib_from_linklib_cmd=$ECHO + + + + + + + + +if test -n "$ac_tool_prefix"; then + for ac_prog in ar + do + # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. +set dummy $ac_tool_prefix$ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_AR+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$AR"; then + ac_cv_prog_AR="$AR" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_AR="$ac_tool_prefix$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +AR=$ac_cv_prog_AR +if test -n "$AR"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AR" >&5 +$as_echo "$AR" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$AR" && break + done +fi +if test -z "$AR"; then + ac_ct_AR=$AR + for ac_prog in ar +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_AR+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_AR"; then + ac_cv_prog_ac_ct_AR="$ac_ct_AR" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_AR="$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_AR=$ac_cv_prog_ac_ct_AR +if test -n "$ac_ct_AR"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_AR" >&5 +$as_echo "$ac_ct_AR" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$ac_ct_AR" && break +done + + if test "x$ac_ct_AR" = x; then + AR="false" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + AR=$ac_ct_AR + fi +fi + +: ${AR=ar} +: ${AR_FLAGS=cru} + + + + + + + + + + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for archiver @FILE support" >&5 +$as_echo_n "checking for archiver @FILE support... " >&6; } +if ${lt_cv_ar_at_file+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_ar_at_file=no + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + echo conftest.$ac_objext > conftest.lst + lt_ar_try='$AR $AR_FLAGS libconftest.a @conftest.lst >&5' + { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$lt_ar_try\""; } >&5 + (eval $lt_ar_try) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + if test "$ac_status" -eq 0; then + # Ensure the archiver fails upon bogus file names. + rm -f conftest.$ac_objext libconftest.a + { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$lt_ar_try\""; } >&5 + (eval $lt_ar_try) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + if test "$ac_status" -ne 0; then + lt_cv_ar_at_file=@ + fi + fi + rm -f conftest.* libconftest.a + +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ar_at_file" >&5 +$as_echo "$lt_cv_ar_at_file" >&6; } + +if test "x$lt_cv_ar_at_file" = xno; then + archiver_list_spec= +else + archiver_list_spec=$lt_cv_ar_at_file +fi + + + + + + + +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args. +set dummy ${ac_tool_prefix}strip; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_STRIP+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$STRIP"; then + ac_cv_prog_STRIP="$STRIP" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_STRIP="${ac_tool_prefix}strip" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +STRIP=$ac_cv_prog_STRIP +if test -n "$STRIP"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $STRIP" >&5 +$as_echo "$STRIP" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_STRIP"; then + ac_ct_STRIP=$STRIP + # Extract the first word of "strip", so it can be a program name with args. +set dummy strip; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_STRIP+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_STRIP"; then + ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_STRIP="strip" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP +if test -n "$ac_ct_STRIP"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP" >&5 +$as_echo "$ac_ct_STRIP" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_STRIP" = x; then + STRIP=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + STRIP=$ac_ct_STRIP + fi +else + STRIP="$ac_cv_prog_STRIP" +fi + +test -z "$STRIP" && STRIP=: + + + + + + +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args. +set dummy ${ac_tool_prefix}ranlib; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_RANLIB+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$RANLIB"; then + ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +RANLIB=$ac_cv_prog_RANLIB +if test -n "$RANLIB"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $RANLIB" >&5 +$as_echo "$RANLIB" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_RANLIB"; then + ac_ct_RANLIB=$RANLIB + # Extract the first word of "ranlib", so it can be a program name with args. +set dummy ranlib; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_RANLIB+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_RANLIB"; then + ac_cv_prog_ac_ct_RANLIB="$ac_ct_RANLIB" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_RANLIB="ranlib" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_RANLIB=$ac_cv_prog_ac_ct_RANLIB +if test -n "$ac_ct_RANLIB"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_RANLIB" >&5 +$as_echo "$ac_ct_RANLIB" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_RANLIB" = x; then + RANLIB=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + RANLIB=$ac_ct_RANLIB + fi +else + RANLIB="$ac_cv_prog_RANLIB" +fi + +test -z "$RANLIB" && RANLIB=: + + + + + + +# Determine commands to create old-style static archives. +old_archive_cmds='$AR $AR_FLAGS $oldlib$oldobjs' +old_postinstall_cmds='chmod 644 $oldlib' +old_postuninstall_cmds= + +if test -n "$RANLIB"; then + case $host_os in + openbsd*) + old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB -t \$tool_oldlib" + ;; + *) + old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB \$tool_oldlib" + ;; + esac + old_archive_cmds="$old_archive_cmds~\$RANLIB \$tool_oldlib" +fi + +case $host_os in + darwin*) + lock_old_archive_extraction=yes ;; + *) + lock_old_archive_extraction=no ;; +esac + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +# If no C compiler was specified, use CC. +LTCC=${LTCC-"$CC"} + +# If no C compiler flags were specified, use CFLAGS. +LTCFLAGS=${LTCFLAGS-"$CFLAGS"} + +# Allow CC to be a program name with arguments. +compiler=$CC + + +# Check for command to grab the raw symbol name followed by C symbol from nm. +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking command to parse $NM output from $compiler object" >&5 +$as_echo_n "checking command to parse $NM output from $compiler object... " >&6; } +if ${lt_cv_sys_global_symbol_pipe+:} false; then : + $as_echo_n "(cached) " >&6 +else + +# These are sane defaults that work on at least a few old systems. +# [They come from Ultrix. What could be older than Ultrix?!! ;)] + +# Character class describing NM global symbol codes. +symcode='[BCDEGRST]' + +# Regexp to match symbols that can be accessed directly from C. +sympat='\([_A-Za-z][_A-Za-z0-9]*\)' + +# Define system-specific variables. +case $host_os in +aix*) + symcode='[BCDT]' + ;; +cygwin* | mingw* | pw32* | cegcc*) + symcode='[ABCDGISTW]' + ;; +hpux*) + if test "$host_cpu" = ia64; then + symcode='[ABCDEGRST]' + fi + ;; +irix* | nonstopux*) + symcode='[BCDEGRST]' + ;; +osf*) + symcode='[BCDEGQRST]' + ;; +solaris*) + symcode='[BDRT]' + ;; +sco3.2v5*) + symcode='[DT]' + ;; +sysv4.2uw2*) + symcode='[DT]' + ;; +sysv5* | sco5v6* | unixware* | OpenUNIX*) + symcode='[ABDT]' + ;; +sysv4) + symcode='[DFNSTU]' + ;; +esac + +# If we're using GNU nm, then use its standard symbol codes. +case `$NM -V 2>&1` in +*GNU* | *'with BFD'*) + symcode='[ABCDGIRSTW]' ;; +esac + +# Transform an extracted symbol line into a proper C declaration. +# Some systems (esp. on ia64) link data and code symbols differently, +# so use this general approach. +lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^T .* \(.*\)$/extern int \1();/p' -e 's/^$symcode* .* \(.*\)$/extern char \1;/p'" + +# Transform an extracted symbol line into symbol name and symbol address +lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([^ ]*\)[ ]*$/ {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([^ ]*\) \([^ ]*\)$/ {\"\2\", (void *) \&\2},/p'" +lt_cv_sys_global_symbol_to_c_name_address_lib_prefix="sed -n -e 's/^: \([^ ]*\)[ ]*$/ {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([^ ]*\) \(lib[^ ]*\)$/ {\"\2\", (void *) \&\2},/p' -e 's/^$symcode* \([^ ]*\) \([^ ]*\)$/ {\"lib\2\", (void *) \&\2},/p'" + +# Handle CRLF in mingw tool chain +opt_cr= +case $build_os in +mingw*) + opt_cr=`$ECHO 'x\{0,1\}' | tr x '\015'` # option cr in regexp + ;; +esac + +# Try without a prefix underscore, then with it. +for ac_symprfx in "" "_"; do + + # Transform symcode, sympat, and symprfx into a raw symbol and a C symbol. + symxfrm="\\1 $ac_symprfx\\2 \\2" + + # Write the raw and C identifiers. + if test "$lt_cv_nm_interface" = "MS dumpbin"; then + # Fake it for dumpbin and say T for any non-static function + # and D for any global variable. + # Also find C++ and __fastcall symbols from MSVC++, + # which start with @ or ?. + lt_cv_sys_global_symbol_pipe="$AWK '"\ +" {last_section=section; section=\$ 3};"\ +" /^COFF SYMBOL TABLE/{for(i in hide) delete hide[i]};"\ +" /Section length .*#relocs.*(pick any)/{hide[last_section]=1};"\ +" \$ 0!~/External *\|/{next};"\ +" / 0+ UNDEF /{next}; / UNDEF \([^|]\)*()/{next};"\ +" {if(hide[section]) next};"\ +" {f=0}; \$ 0~/\(\).*\|/{f=1}; {printf f ? \"T \" : \"D \"};"\ +" {split(\$ 0, a, /\||\r/); split(a[2], s)};"\ +" s[1]~/^[@?]/{print s[1], s[1]; next};"\ +" s[1]~prfx {split(s[1],t,\"@\"); print t[1], substr(t[1],length(prfx))}"\ +" ' prfx=^$ac_symprfx" + else + lt_cv_sys_global_symbol_pipe="sed -n -e 's/^.*[ ]\($symcode$symcode*\)[ ][ ]*$ac_symprfx$sympat$opt_cr$/$symxfrm/p'" + fi + lt_cv_sys_global_symbol_pipe="$lt_cv_sys_global_symbol_pipe | sed '/ __gnu_lto/d'" + + # Check to see that the pipe works correctly. + pipe_works=no + + rm -f conftest* + cat > conftest.$ac_ext <<_LT_EOF +#ifdef __cplusplus +extern "C" { +#endif +char nm_test_var; +void nm_test_func(void); +void nm_test_func(void){} +#ifdef __cplusplus +} +#endif +int main(){nm_test_var='a';nm_test_func();return(0);} +_LT_EOF + + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + # Now try to grab the symbols. + nlist=conftest.nm + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$NM conftest.$ac_objext \| "$lt_cv_sys_global_symbol_pipe" \> $nlist\""; } >&5 + (eval $NM conftest.$ac_objext \| "$lt_cv_sys_global_symbol_pipe" \> $nlist) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && test -s "$nlist"; then + # Try sorting and uniquifying the output. + if sort "$nlist" | uniq > "$nlist"T; then + mv -f "$nlist"T "$nlist" + else + rm -f "$nlist"T + fi + + # Make sure that we snagged all the symbols we need. + if $GREP ' nm_test_var$' "$nlist" >/dev/null; then + if $GREP ' nm_test_func$' "$nlist" >/dev/null; then + cat <<_LT_EOF > conftest.$ac_ext +/* Keep this code in sync between libtool.m4, ltmain, lt_system.h, and tests. */ +#if defined(_WIN32) || defined(__CYGWIN__) || defined(_WIN32_WCE) +/* DATA imports from DLLs on WIN32 con't be const, because runtime + relocations are performed -- see ld's documentation on pseudo-relocs. */ +# define LT@&t@_DLSYM_CONST +#elif defined(__osf__) +/* This system does not cope well with relocations in const data. */ +# define LT@&t@_DLSYM_CONST +#else +# define LT@&t@_DLSYM_CONST const +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +_LT_EOF + # Now generate the symbol file. + eval "$lt_cv_sys_global_symbol_to_cdecl"' < "$nlist" | $GREP -v main >> conftest.$ac_ext' + + cat <<_LT_EOF >> conftest.$ac_ext + +/* The mapping between symbol names and symbols. */ +LT@&t@_DLSYM_CONST struct { + const char *name; + void *address; +} +lt__PROGRAM__LTX_preloaded_symbols[] = +{ + { "@PROGRAM@", (void *) 0 }, +_LT_EOF + $SED "s/^$symcode$symcode* \(.*\) \(.*\)$/ {\"\2\", (void *) \&\2},/" < "$nlist" | $GREP -v main >> conftest.$ac_ext + cat <<\_LT_EOF >> conftest.$ac_ext + {0, (void *) 0} +}; + +/* This works around a problem in FreeBSD linker */ +#ifdef FREEBSD_WORKAROUND +static const void *lt_preloaded_setup() { + return lt__PROGRAM__LTX_preloaded_symbols; +} +#endif + +#ifdef __cplusplus +} +#endif +_LT_EOF + # Now try linking the two files. + mv conftest.$ac_objext conftstm.$ac_objext + lt_globsym_save_LIBS=$LIBS + lt_globsym_save_CFLAGS=$CFLAGS + LIBS="conftstm.$ac_objext" + CFLAGS="$CFLAGS$lt_prog_compiler_no_builtin_flag" + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5 + (eval $ac_link) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && test -s conftest${ac_exeext}; then + pipe_works=yes + fi + LIBS=$lt_globsym_save_LIBS + CFLAGS=$lt_globsym_save_CFLAGS + else + echo "cannot find nm_test_func in $nlist" >&5 + fi + else + echo "cannot find nm_test_var in $nlist" >&5 + fi + else + echo "cannot run $lt_cv_sys_global_symbol_pipe" >&5 + fi + else + echo "$progname: failed program was:" >&5 + cat conftest.$ac_ext >&5 + fi + rm -rf conftest* conftst* + + # Do not use the global_symbol_pipe unless it works. + if test "$pipe_works" = yes; then + break + else + lt_cv_sys_global_symbol_pipe= + fi +done + +fi + +if test -z "$lt_cv_sys_global_symbol_pipe"; then + lt_cv_sys_global_symbol_to_cdecl= +fi +if test -z "$lt_cv_sys_global_symbol_pipe$lt_cv_sys_global_symbol_to_cdecl"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: failed" >&5 +$as_echo "failed" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: ok" >&5 +$as_echo "ok" >&6; } +fi + +# Response file support. +if test "$lt_cv_nm_interface" = "MS dumpbin"; then + nm_file_list_spec='@' +elif $NM --help 2>/dev/null | grep '[@]FILE' >/dev/null; then + nm_file_list_spec='@' +fi + + + + + + + + + + + + + + + + + + + + + + + + + + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for sysroot" >&5 +$as_echo_n "checking for sysroot... " >&6; } + +@%:@ Check whether --with-sysroot was given. +if test "${with_sysroot+set}" = set; then : + withval=$with_sysroot; +else + with_sysroot=no +fi + + +lt_sysroot= +case ${with_sysroot} in #( + yes) + if test "$GCC" = yes; then + lt_sysroot=`$CC --print-sysroot 2>/dev/null` + fi + ;; #( + /*) + lt_sysroot=`echo "$with_sysroot" | sed -e "$sed_quote_subst"` + ;; #( + no|'') + ;; #( + *) + { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${with_sysroot}" >&5 +$as_echo "${with_sysroot}" >&6; } + as_fn_error $? "The sysroot must be an absolute path." "$LINENO" 5 + ;; +esac + + { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${lt_sysroot:-no}" >&5 +$as_echo "${lt_sysroot:-no}" >&6; } + + + + + +@%:@ Check whether --enable-libtool-lock was given. +if test "${enable_libtool_lock+set}" = set; then : + enableval=$enable_libtool_lock; +fi + +test "x$enable_libtool_lock" != xno && enable_libtool_lock=yes + +# Some flags need to be propagated to the compiler or linker for good +# libtool support. +case $host in +ia64-*-hpux*) + # Find out which ABI we are using. + echo 'int i;' > conftest.$ac_ext + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + case `/usr/bin/file conftest.$ac_objext` in + *ELF-32*) + HPUX_IA64_MODE="32" + ;; + *ELF-64*) + HPUX_IA64_MODE="64" + ;; + esac + fi + rm -rf conftest* + ;; +*-*-irix6*) + # Find out which ABI we are using. + echo '#line '$LINENO' "configure"' > conftest.$ac_ext + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + if test "$lt_cv_prog_gnu_ld" = yes; then + case `/usr/bin/file conftest.$ac_objext` in + *32-bit*) + LD="${LD-ld} -melf32bsmip" + ;; + *N32*) + LD="${LD-ld} -melf32bmipn32" + ;; + *64-bit*) + LD="${LD-ld} -melf64bmip" + ;; + esac + else + case `/usr/bin/file conftest.$ac_objext` in + *32-bit*) + LD="${LD-ld} -32" + ;; + *N32*) + LD="${LD-ld} -n32" + ;; + *64-bit*) + LD="${LD-ld} -64" + ;; + esac + fi + fi + rm -rf conftest* + ;; + +x86_64-*kfreebsd*-gnu|x86_64-*linux*|ppc*-*linux*|powerpc*-*linux*| \ +s390*-*linux*|s390*-*tpf*|sparc*-*linux*) + # Find out which ABI we are using. + echo 'int i;' > conftest.$ac_ext + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + case `/usr/bin/file conftest.o` in + *32-bit*) + case $host in + x86_64-*kfreebsd*-gnu) + LD="${LD-ld} -m elf_i386_fbsd" + ;; + x86_64-*linux*) + LD="${LD-ld} -m elf_i386" + ;; + ppc64-*linux*|powerpc64-*linux*) + LD="${LD-ld} -m elf32ppclinux" + ;; + s390x-*linux*) + LD="${LD-ld} -m elf_s390" + ;; + sparc64-*linux*) + LD="${LD-ld} -m elf32_sparc" + ;; + esac + ;; + *64-bit*) + case $host in + x86_64-*kfreebsd*-gnu) + LD="${LD-ld} -m elf_x86_64_fbsd" + ;; + x86_64-*linux*) + LD="${LD-ld} -m elf_x86_64" + ;; + ppc*-*linux*|powerpc*-*linux*) + LD="${LD-ld} -m elf64ppc" + ;; + s390*-*linux*|s390*-*tpf*) + LD="${LD-ld} -m elf64_s390" + ;; + sparc*-*linux*) + LD="${LD-ld} -m elf64_sparc" + ;; + esac + ;; + esac + fi + rm -rf conftest* + ;; + +*-*-sco3.2v5*) + # On SCO OpenServer 5, we need -belf to get full-featured binaries. + SAVE_CFLAGS="$CFLAGS" + CFLAGS="$CFLAGS -belf" + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler needs -belf" >&5 +$as_echo_n "checking whether the C compiler needs -belf... " >&6; } +if ${lt_cv_cc_needs_belf+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + lt_cv_cc_needs_belf=yes +else + lt_cv_cc_needs_belf=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_cc_needs_belf" >&5 +$as_echo "$lt_cv_cc_needs_belf" >&6; } + if test x"$lt_cv_cc_needs_belf" != x"yes"; then + # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf + CFLAGS="$SAVE_CFLAGS" + fi + ;; +*-*solaris*) + # Find out which ABI we are using. + echo 'int i;' > conftest.$ac_ext + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + case `/usr/bin/file conftest.o` in + *64-bit*) + case $lt_cv_prog_gnu_ld in + yes*) + case $host in + i?86-*-solaris*) + LD="${LD-ld} -m elf_x86_64" + ;; + sparc*-*-solaris*) + LD="${LD-ld} -m elf64_sparc" + ;; + esac + # GNU ld 2.21 introduced _sol2 emulations. Use them if available. + if ${LD-ld} -V | grep _sol2 >/dev/null 2>&1; then + LD="${LD-ld}_sol2" + fi + ;; + *) + if ${LD-ld} -64 -r -o conftest2.o conftest.o >/dev/null 2>&1; then + LD="${LD-ld} -64" + fi + ;; + esac + ;; + esac + fi + rm -rf conftest* + ;; +esac + +need_locks="$enable_libtool_lock" + +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}mt", so it can be a program name with args. +set dummy ${ac_tool_prefix}mt; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_MANIFEST_TOOL+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$MANIFEST_TOOL"; then + ac_cv_prog_MANIFEST_TOOL="$MANIFEST_TOOL" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_MANIFEST_TOOL="${ac_tool_prefix}mt" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +MANIFEST_TOOL=$ac_cv_prog_MANIFEST_TOOL +if test -n "$MANIFEST_TOOL"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MANIFEST_TOOL" >&5 +$as_echo "$MANIFEST_TOOL" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_MANIFEST_TOOL"; then + ac_ct_MANIFEST_TOOL=$MANIFEST_TOOL + # Extract the first word of "mt", so it can be a program name with args. +set dummy mt; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_MANIFEST_TOOL+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_MANIFEST_TOOL"; then + ac_cv_prog_ac_ct_MANIFEST_TOOL="$ac_ct_MANIFEST_TOOL" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_MANIFEST_TOOL="mt" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_MANIFEST_TOOL=$ac_cv_prog_ac_ct_MANIFEST_TOOL +if test -n "$ac_ct_MANIFEST_TOOL"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_MANIFEST_TOOL" >&5 +$as_echo "$ac_ct_MANIFEST_TOOL" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_MANIFEST_TOOL" = x; then + MANIFEST_TOOL=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + MANIFEST_TOOL=$ac_ct_MANIFEST_TOOL + fi +else + MANIFEST_TOOL="$ac_cv_prog_MANIFEST_TOOL" +fi + +test -z "$MANIFEST_TOOL" && MANIFEST_TOOL=mt +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if $MANIFEST_TOOL is a manifest tool" >&5 +$as_echo_n "checking if $MANIFEST_TOOL is a manifest tool... " >&6; } +if ${lt_cv_path_mainfest_tool+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_path_mainfest_tool=no + echo "$as_me:$LINENO: $MANIFEST_TOOL '-?'" >&5 + $MANIFEST_TOOL '-?' 2>conftest.err > conftest.out + cat conftest.err >&5 + if $GREP 'Manifest Tool' conftest.out > /dev/null; then + lt_cv_path_mainfest_tool=yes + fi + rm -f conftest* +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_path_mainfest_tool" >&5 +$as_echo "$lt_cv_path_mainfest_tool" >&6; } +if test "x$lt_cv_path_mainfest_tool" != xyes; then + MANIFEST_TOOL=: +fi + + + + + + + case $host_os in + rhapsody* | darwin*) + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}dsymutil", so it can be a program name with args. +set dummy ${ac_tool_prefix}dsymutil; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_DSYMUTIL+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$DSYMUTIL"; then + ac_cv_prog_DSYMUTIL="$DSYMUTIL" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_DSYMUTIL="${ac_tool_prefix}dsymutil" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +DSYMUTIL=$ac_cv_prog_DSYMUTIL +if test -n "$DSYMUTIL"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DSYMUTIL" >&5 +$as_echo "$DSYMUTIL" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_DSYMUTIL"; then + ac_ct_DSYMUTIL=$DSYMUTIL + # Extract the first word of "dsymutil", so it can be a program name with args. +set dummy dsymutil; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_DSYMUTIL+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_DSYMUTIL"; then + ac_cv_prog_ac_ct_DSYMUTIL="$ac_ct_DSYMUTIL" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_DSYMUTIL="dsymutil" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_DSYMUTIL=$ac_cv_prog_ac_ct_DSYMUTIL +if test -n "$ac_ct_DSYMUTIL"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DSYMUTIL" >&5 +$as_echo "$ac_ct_DSYMUTIL" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_DSYMUTIL" = x; then + DSYMUTIL=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + DSYMUTIL=$ac_ct_DSYMUTIL + fi +else + DSYMUTIL="$ac_cv_prog_DSYMUTIL" +fi + + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}nmedit", so it can be a program name with args. +set dummy ${ac_tool_prefix}nmedit; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_NMEDIT+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$NMEDIT"; then + ac_cv_prog_NMEDIT="$NMEDIT" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_NMEDIT="${ac_tool_prefix}nmedit" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +NMEDIT=$ac_cv_prog_NMEDIT +if test -n "$NMEDIT"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $NMEDIT" >&5 +$as_echo "$NMEDIT" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_NMEDIT"; then + ac_ct_NMEDIT=$NMEDIT + # Extract the first word of "nmedit", so it can be a program name with args. +set dummy nmedit; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_NMEDIT+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_NMEDIT"; then + ac_cv_prog_ac_ct_NMEDIT="$ac_ct_NMEDIT" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_NMEDIT="nmedit" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_NMEDIT=$ac_cv_prog_ac_ct_NMEDIT +if test -n "$ac_ct_NMEDIT"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_NMEDIT" >&5 +$as_echo "$ac_ct_NMEDIT" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_NMEDIT" = x; then + NMEDIT=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + NMEDIT=$ac_ct_NMEDIT + fi +else + NMEDIT="$ac_cv_prog_NMEDIT" +fi + + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}lipo", so it can be a program name with args. +set dummy ${ac_tool_prefix}lipo; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_LIPO+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$LIPO"; then + ac_cv_prog_LIPO="$LIPO" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_LIPO="${ac_tool_prefix}lipo" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +LIPO=$ac_cv_prog_LIPO +if test -n "$LIPO"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LIPO" >&5 +$as_echo "$LIPO" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_LIPO"; then + ac_ct_LIPO=$LIPO + # Extract the first word of "lipo", so it can be a program name with args. +set dummy lipo; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_LIPO+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_LIPO"; then + ac_cv_prog_ac_ct_LIPO="$ac_ct_LIPO" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_LIPO="lipo" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_LIPO=$ac_cv_prog_ac_ct_LIPO +if test -n "$ac_ct_LIPO"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_LIPO" >&5 +$as_echo "$ac_ct_LIPO" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_LIPO" = x; then + LIPO=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + LIPO=$ac_ct_LIPO + fi +else + LIPO="$ac_cv_prog_LIPO" +fi + + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}otool", so it can be a program name with args. +set dummy ${ac_tool_prefix}otool; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_OTOOL+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$OTOOL"; then + ac_cv_prog_OTOOL="$OTOOL" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_OTOOL="${ac_tool_prefix}otool" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +OTOOL=$ac_cv_prog_OTOOL +if test -n "$OTOOL"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OTOOL" >&5 +$as_echo "$OTOOL" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_OTOOL"; then + ac_ct_OTOOL=$OTOOL + # Extract the first word of "otool", so it can be a program name with args. +set dummy otool; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_OTOOL+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_OTOOL"; then + ac_cv_prog_ac_ct_OTOOL="$ac_ct_OTOOL" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_OTOOL="otool" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_OTOOL=$ac_cv_prog_ac_ct_OTOOL +if test -n "$ac_ct_OTOOL"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OTOOL" >&5 +$as_echo "$ac_ct_OTOOL" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_OTOOL" = x; then + OTOOL=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + OTOOL=$ac_ct_OTOOL + fi +else + OTOOL="$ac_cv_prog_OTOOL" +fi + + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}otool64", so it can be a program name with args. +set dummy ${ac_tool_prefix}otool64; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_OTOOL64+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$OTOOL64"; then + ac_cv_prog_OTOOL64="$OTOOL64" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_OTOOL64="${ac_tool_prefix}otool64" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +OTOOL64=$ac_cv_prog_OTOOL64 +if test -n "$OTOOL64"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OTOOL64" >&5 +$as_echo "$OTOOL64" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_OTOOL64"; then + ac_ct_OTOOL64=$OTOOL64 + # Extract the first word of "otool64", so it can be a program name with args. +set dummy otool64; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_OTOOL64+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_OTOOL64"; then + ac_cv_prog_ac_ct_OTOOL64="$ac_ct_OTOOL64" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_OTOOL64="otool64" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_OTOOL64=$ac_cv_prog_ac_ct_OTOOL64 +if test -n "$ac_ct_OTOOL64"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OTOOL64" >&5 +$as_echo "$ac_ct_OTOOL64" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_OTOOL64" = x; then + OTOOL64=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + OTOOL64=$ac_ct_OTOOL64 + fi +else + OTOOL64="$ac_cv_prog_OTOOL64" +fi + + + + + + + + + + + + + + + + + + + + + + + + + + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -single_module linker flag" >&5 +$as_echo_n "checking for -single_module linker flag... " >&6; } +if ${lt_cv_apple_cc_single_mod+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_apple_cc_single_mod=no + if test -z "${LT_MULTI_MODULE}"; then + # By default we will add the -single_module flag. You can override + # by either setting the environment variable LT_MULTI_MODULE + # non-empty at configure time, or by adding -multi_module to the + # link flags. + rm -rf libconftest.dylib* + echo "int foo(void){return 1;}" > conftest.c + echo "$LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \ +-dynamiclib -Wl,-single_module conftest.c" >&5 + $LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \ + -dynamiclib -Wl,-single_module conftest.c 2>conftest.err + _lt_result=$? + # If there is a non-empty error log, and "single_module" + # appears in it, assume the flag caused a linker warning + if test -s conftest.err && $GREP single_module conftest.err; then + cat conftest.err >&5 + # Otherwise, if the output was created with a 0 exit code from + # the compiler, it worked. + elif test -f libconftest.dylib && test $_lt_result -eq 0; then + lt_cv_apple_cc_single_mod=yes + else + cat conftest.err >&5 + fi + rm -rf libconftest.dylib* + rm -f conftest.* + fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_apple_cc_single_mod" >&5 +$as_echo "$lt_cv_apple_cc_single_mod" >&6; } + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -exported_symbols_list linker flag" >&5 +$as_echo_n "checking for -exported_symbols_list linker flag... " >&6; } +if ${lt_cv_ld_exported_symbols_list+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_ld_exported_symbols_list=no + save_LDFLAGS=$LDFLAGS + echo "_main" > conftest.sym + LDFLAGS="$LDFLAGS -Wl,-exported_symbols_list,conftest.sym" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + lt_cv_ld_exported_symbols_list=yes +else + lt_cv_ld_exported_symbols_list=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + LDFLAGS="$save_LDFLAGS" + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_exported_symbols_list" >&5 +$as_echo "$lt_cv_ld_exported_symbols_list" >&6; } + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -force_load linker flag" >&5 +$as_echo_n "checking for -force_load linker flag... " >&6; } +if ${lt_cv_ld_force_load+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_ld_force_load=no + cat > conftest.c << _LT_EOF +int forced_loaded() { return 2;} +_LT_EOF + echo "$LTCC $LTCFLAGS -c -o conftest.o conftest.c" >&5 + $LTCC $LTCFLAGS -c -o conftest.o conftest.c 2>&5 + echo "$AR cru libconftest.a conftest.o" >&5 + $AR cru libconftest.a conftest.o 2>&5 + echo "$RANLIB libconftest.a" >&5 + $RANLIB libconftest.a 2>&5 + cat > conftest.c << _LT_EOF +int main() { return 0;} +_LT_EOF + echo "$LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a" >&5 + $LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a 2>conftest.err + _lt_result=$? + if test -s conftest.err && $GREP force_load conftest.err; then + cat conftest.err >&5 + elif test -f conftest && test $_lt_result -eq 0 && $GREP forced_load conftest >/dev/null 2>&1 ; then + lt_cv_ld_force_load=yes + else + cat conftest.err >&5 + fi + rm -f conftest.err libconftest.a conftest conftest.c + rm -rf conftest.dSYM + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_force_load" >&5 +$as_echo "$lt_cv_ld_force_load" >&6; } + case $host_os in + rhapsody* | darwin1.[012]) + _lt_dar_allow_undefined='${wl}-undefined ${wl}suppress' ;; + darwin1.*) + _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;; + darwin*) # darwin 5.x on + # if running on 10.5 or later, the deployment target defaults + # to the OS version, if on x86, and 10.4, the deployment + # target defaults to 10.4. Don't you love it? + case ${MACOSX_DEPLOYMENT_TARGET-10.0},$host in + 10.0,*86*-darwin8*|10.0,*-darwin[91]*) + _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;; + 10.[012]*) + _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;; + 10.*) + _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;; + esac + ;; + esac + if test "$lt_cv_apple_cc_single_mod" = "yes"; then + _lt_dar_single_mod='$single_module' + fi + if test "$lt_cv_ld_exported_symbols_list" = "yes"; then + _lt_dar_export_syms=' ${wl}-exported_symbols_list,$output_objdir/${libname}-symbols.expsym' + else + _lt_dar_export_syms='~$NMEDIT -s $output_objdir/${libname}-symbols.expsym ${lib}' + fi + if test "$DSYMUTIL" != ":" && test "$lt_cv_ld_force_load" = "no"; then + _lt_dsymutil='~$DSYMUTIL $lib || :' + else + _lt_dsymutil= + fi + ;; + esac + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C preprocessor" >&5 +$as_echo_n "checking how to run the C preprocessor... " >&6; } +# On Suns, sometimes $CPP names a directory. +if test -n "$CPP" && test -d "$CPP"; then + CPP= +fi +if test -z "$CPP"; then + if ${ac_cv_prog_CPP+:} false; then : + $as_echo_n "(cached) " >&6 +else + # Double quotes because CPP needs to be expanded + for CPP in "$CC -E" "$CC -E -traditional-cpp" "/lib/cpp" + do + ac_preproc_ok=false +for ac_c_preproc_warn_flag in '' yes +do + # Use a header file that comes with gcc, so configuring glibc + # with a fresh cross-compiler works. + # Prefer to if __STDC__ is defined, since + # exists even on freestanding compilers. + # On the NeXT, cc -E runs the code through the compiler's parser, + # not just through cpp. "Syntax error" is here to catch this case. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +@%:@ifdef __STDC__ +@%:@ include +@%:@else +@%:@ include +@%:@endif + Syntax error +_ACEOF +if ac_fn_c_try_cpp "$LINENO"; then : + +else + # Broken: fails on valid input. +continue +fi +rm -f conftest.err conftest.i conftest.$ac_ext + + # OK, works on sane cases. Now check whether nonexistent headers + # can be detected and how. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +@%:@include +_ACEOF +if ac_fn_c_try_cpp "$LINENO"; then : + # Broken: success on invalid input. +continue +else + # Passes both tests. +ac_preproc_ok=: +break +fi +rm -f conftest.err conftest.i conftest.$ac_ext + +done +# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. +rm -f conftest.i conftest.err conftest.$ac_ext +if $ac_preproc_ok; then : + break +fi + + done + ac_cv_prog_CPP=$CPP + +fi + CPP=$ac_cv_prog_CPP +else + ac_cv_prog_CPP=$CPP +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $CPP" >&5 +$as_echo "$CPP" >&6; } +ac_preproc_ok=false +for ac_c_preproc_warn_flag in '' yes +do + # Use a header file that comes with gcc, so configuring glibc + # with a fresh cross-compiler works. + # Prefer to if __STDC__ is defined, since + # exists even on freestanding compilers. + # On the NeXT, cc -E runs the code through the compiler's parser, + # not just through cpp. "Syntax error" is here to catch this case. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +@%:@ifdef __STDC__ +@%:@ include +@%:@else +@%:@ include +@%:@endif + Syntax error +_ACEOF +if ac_fn_c_try_cpp "$LINENO"; then : + +else + # Broken: fails on valid input. +continue +fi +rm -f conftest.err conftest.i conftest.$ac_ext + + # OK, works on sane cases. Now check whether nonexistent headers + # can be detected and how. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +@%:@include +_ACEOF +if ac_fn_c_try_cpp "$LINENO"; then : + # Broken: success on invalid input. +continue +else + # Passes both tests. +ac_preproc_ok=: +break +fi +rm -f conftest.err conftest.i conftest.$ac_ext + +done +# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. +rm -f conftest.i conftest.err conftest.$ac_ext +if $ac_preproc_ok; then : + +else + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "C preprocessor \"$CPP\" fails sanity check +See \`config.log' for more details" "$LINENO" 5; } +fi + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header files" >&5 +$as_echo_n "checking for ANSI C header files... " >&6; } +if ${ac_cv_header_stdc+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +#include +#include +#include + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_header_stdc=yes +else + ac_cv_header_stdc=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + +if test $ac_cv_header_stdc = yes; then + # SunOS 4.x string.h does not declare mem*, contrary to ANSI. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include + +_ACEOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + $EGREP "memchr" >/dev/null 2>&1; then : + +else + ac_cv_header_stdc=no +fi +rm -f conftest* + +fi + +if test $ac_cv_header_stdc = yes; then + # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include + +_ACEOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + $EGREP "free" >/dev/null 2>&1; then : + +else + ac_cv_header_stdc=no +fi +rm -f conftest* + +fi + +if test $ac_cv_header_stdc = yes; then + # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi. + if test "$cross_compiling" = yes; then : + : +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +#include +#if ((' ' & 0x0FF) == 0x020) +# define ISLOWER(c) ('a' <= (c) && (c) <= 'z') +# define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c)) +#else +# define ISLOWER(c) \ + (('a' <= (c) && (c) <= 'i') \ + || ('j' <= (c) && (c) <= 'r') \ + || ('s' <= (c) && (c) <= 'z')) +# define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c)) +#endif + +#define XOR(e, f) (((e) && !(f)) || (!(e) && (f))) +int +main () +{ + int i; + for (i = 0; i < 256; i++) + if (XOR (islower (i), ISLOWER (i)) + || toupper (i) != TOUPPER (i)) + return 2; + return 0; +} +_ACEOF +if ac_fn_c_try_run "$LINENO"; then : + +else + ac_cv_header_stdc=no +fi +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ + conftest.$ac_objext conftest.beam conftest.$ac_ext +fi + +fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdc" >&5 +$as_echo "$ac_cv_header_stdc" >&6; } +if test $ac_cv_header_stdc = yes; then + +$as_echo "@%:@define STDC_HEADERS 1" >>confdefs.h + +fi + +# On IRIX 5.3, sys/types and inttypes.h are conflicting. +for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \ + inttypes.h stdint.h unistd.h +do : + as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` +ac_fn_c_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default +" +if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : + cat >>confdefs.h <<_ACEOF +@%:@define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 +_ACEOF + +fi + +done + + +for ac_header in dlfcn.h +do : + ac_fn_c_check_header_compile "$LINENO" "dlfcn.h" "ac_cv_header_dlfcn_h" "$ac_includes_default +" +if test "x$ac_cv_header_dlfcn_h" = xyes; then : + cat >>confdefs.h <<_ACEOF +@%:@define HAVE_DLFCN_H 1 +_ACEOF + +fi + +done + + + + +func_stripname_cnf () +{ + case ${2} in + .*) func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%\\\\${2}\$%%"`;; + *) func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%${2}\$%%"`;; + esac +} # func_stripname_cnf + + + + + +# Set options + + + + enable_dlopen=no + + + enable_win32_dll=no + + + @%:@ Check whether --enable-shared was given. +if test "${enable_shared+set}" = set; then : + enableval=$enable_shared; p=${PACKAGE-default} + case $enableval in + yes) enable_shared=yes ;; + no) enable_shared=no ;; + *) + enable_shared=no + # Look at the argument we got. We use all the common list separators. + lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," + for pkg in $enableval; do + IFS="$lt_save_ifs" + if test "X$pkg" = "X$p"; then + enable_shared=yes + fi + done + IFS="$lt_save_ifs" + ;; + esac +else + enable_shared=yes +fi + + + + + + + + + + @%:@ Check whether --enable-static was given. +if test "${enable_static+set}" = set; then : + enableval=$enable_static; p=${PACKAGE-default} + case $enableval in + yes) enable_static=yes ;; + no) enable_static=no ;; + *) + enable_static=no + # Look at the argument we got. We use all the common list separators. + lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," + for pkg in $enableval; do + IFS="$lt_save_ifs" + if test "X$pkg" = "X$p"; then + enable_static=yes + fi + done + IFS="$lt_save_ifs" + ;; + esac +else + enable_static=yes +fi + + + + + + + + + + +@%:@ Check whether --with-pic was given. +if test "${with_pic+set}" = set; then : + withval=$with_pic; lt_p=${PACKAGE-default} + case $withval in + yes|no) pic_mode=$withval ;; + *) + pic_mode=default + # Look at the argument we got. We use all the common list separators. + lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," + for lt_pkg in $withval; do + IFS="$lt_save_ifs" + if test "X$lt_pkg" = "X$lt_p"; then + pic_mode=yes + fi + done + IFS="$lt_save_ifs" + ;; + esac +else + pic_mode=default +fi + + +test -z "$pic_mode" && pic_mode=default + + + + + + + + @%:@ Check whether --enable-fast-install was given. +if test "${enable_fast_install+set}" = set; then : + enableval=$enable_fast_install; p=${PACKAGE-default} + case $enableval in + yes) enable_fast_install=yes ;; + no) enable_fast_install=no ;; + *) + enable_fast_install=no + # Look at the argument we got. We use all the common list separators. + lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," + for pkg in $enableval; do + IFS="$lt_save_ifs" + if test "X$pkg" = "X$p"; then + enable_fast_install=yes + fi + done + IFS="$lt_save_ifs" + ;; + esac +else + enable_fast_install=yes +fi + + + + + + + + + + + +# This can be used to rebuild libtool when needed +LIBTOOL_DEPS="$ltmain" + +# Always use our own libtool. +LIBTOOL='$(SHELL) $(top_builddir)/libtool' + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +test -z "$LN_S" && LN_S="ln -s" + + + + + + + + + + + + + + +if test -n "${ZSH_VERSION+set}" ; then + setopt NO_GLOB_SUBST +fi + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for objdir" >&5 +$as_echo_n "checking for objdir... " >&6; } +if ${lt_cv_objdir+:} false; then : + $as_echo_n "(cached) " >&6 +else + rm -f .libs 2>/dev/null +mkdir .libs 2>/dev/null +if test -d .libs; then + lt_cv_objdir=.libs +else + # MS-DOS does not allow filenames that begin with a dot. + lt_cv_objdir=_libs +fi +rmdir .libs 2>/dev/null +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_objdir" >&5 +$as_echo "$lt_cv_objdir" >&6; } +objdir=$lt_cv_objdir + + + + + +cat >>confdefs.h <<_ACEOF +@%:@define LT_OBJDIR "$lt_cv_objdir/" +_ACEOF + + + + +case $host_os in +aix3*) + # AIX sometimes has problems with the GCC collect2 program. For some + # reason, if we set the COLLECT_NAMES environment variable, the problems + # vanish in a puff of smoke. + if test "X${COLLECT_NAMES+set}" != Xset; then + COLLECT_NAMES= + export COLLECT_NAMES + fi + ;; +esac + +# Global variables: +ofile=libtool +can_build_shared=yes + +# All known linkers require a `.a' archive for static linking (except MSVC, +# which needs '.lib'). +libext=a + +with_gnu_ld="$lt_cv_prog_gnu_ld" + +old_CC="$CC" +old_CFLAGS="$CFLAGS" + +# Set sane defaults for various variables +test -z "$CC" && CC=cc +test -z "$LTCC" && LTCC=$CC +test -z "$LTCFLAGS" && LTCFLAGS=$CFLAGS +test -z "$LD" && LD=ld +test -z "$ac_objext" && ac_objext=o + +for cc_temp in $compiler""; do + case $cc_temp in + compile | *[\\/]compile | ccache | *[\\/]ccache ) ;; + distcc | *[\\/]distcc | purify | *[\\/]purify ) ;; + \-*) ;; + *) break;; + esac +done +cc_basename=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"` + + +# Only perform the check for file, if the check method requires it +test -z "$MAGIC_CMD" && MAGIC_CMD=file +case $deplibs_check_method in +file_magic*) + if test "$file_magic_cmd" = '$MAGIC_CMD'; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ${ac_tool_prefix}file" >&5 +$as_echo_n "checking for ${ac_tool_prefix}file... " >&6; } +if ${lt_cv_path_MAGIC_CMD+:} false; then : + $as_echo_n "(cached) " >&6 +else + case $MAGIC_CMD in +[\\/*] | ?:[\\/]*) + lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path. + ;; +*) + lt_save_MAGIC_CMD="$MAGIC_CMD" + lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR + ac_dummy="/usr/bin$PATH_SEPARATOR$PATH" + for ac_dir in $ac_dummy; do + IFS="$lt_save_ifs" + test -z "$ac_dir" && ac_dir=. + if test -f $ac_dir/${ac_tool_prefix}file; then + lt_cv_path_MAGIC_CMD="$ac_dir/${ac_tool_prefix}file" + if test -n "$file_magic_test_file"; then + case $deplibs_check_method in + "file_magic "*) + file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"` + MAGIC_CMD="$lt_cv_path_MAGIC_CMD" + if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null | + $EGREP "$file_magic_regex" > /dev/null; then + : + else + cat <<_LT_EOF 1>&2 + +*** Warning: the command libtool uses to detect shared libraries, +*** $file_magic_cmd, produces output that libtool cannot recognize. +*** The result is that libtool may fail to recognize shared libraries +*** as such. This will affect the creation of libtool libraries that +*** depend on shared libraries, but programs linked with such libtool +*** libraries will work regardless of this problem. Nevertheless, you +*** may want to report the problem to your system manager and/or to +*** bug-libtool@gnu.org + +_LT_EOF + fi ;; + esac + fi + break + fi + done + IFS="$lt_save_ifs" + MAGIC_CMD="$lt_save_MAGIC_CMD" + ;; +esac +fi + +MAGIC_CMD="$lt_cv_path_MAGIC_CMD" +if test -n "$MAGIC_CMD"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MAGIC_CMD" >&5 +$as_echo "$MAGIC_CMD" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + + + +if test -z "$lt_cv_path_MAGIC_CMD"; then + if test -n "$ac_tool_prefix"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for file" >&5 +$as_echo_n "checking for file... " >&6; } +if ${lt_cv_path_MAGIC_CMD+:} false; then : + $as_echo_n "(cached) " >&6 +else + case $MAGIC_CMD in +[\\/*] | ?:[\\/]*) + lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path. + ;; +*) + lt_save_MAGIC_CMD="$MAGIC_CMD" + lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR + ac_dummy="/usr/bin$PATH_SEPARATOR$PATH" + for ac_dir in $ac_dummy; do + IFS="$lt_save_ifs" + test -z "$ac_dir" && ac_dir=. + if test -f $ac_dir/file; then + lt_cv_path_MAGIC_CMD="$ac_dir/file" + if test -n "$file_magic_test_file"; then + case $deplibs_check_method in + "file_magic "*) + file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"` + MAGIC_CMD="$lt_cv_path_MAGIC_CMD" + if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null | + $EGREP "$file_magic_regex" > /dev/null; then + : + else + cat <<_LT_EOF 1>&2 + +*** Warning: the command libtool uses to detect shared libraries, +*** $file_magic_cmd, produces output that libtool cannot recognize. +*** The result is that libtool may fail to recognize shared libraries +*** as such. This will affect the creation of libtool libraries that +*** depend on shared libraries, but programs linked with such libtool +*** libraries will work regardless of this problem. Nevertheless, you +*** may want to report the problem to your system manager and/or to +*** bug-libtool@gnu.org + +_LT_EOF + fi ;; + esac + fi + break + fi + done + IFS="$lt_save_ifs" + MAGIC_CMD="$lt_save_MAGIC_CMD" + ;; +esac +fi + +MAGIC_CMD="$lt_cv_path_MAGIC_CMD" +if test -n "$MAGIC_CMD"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MAGIC_CMD" >&5 +$as_echo "$MAGIC_CMD" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + else + MAGIC_CMD=: + fi +fi + + fi + ;; +esac + +# Use C for the default configuration in the libtool script + +lt_save_CC="$CC" +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + +# Source file extension for C test sources. +ac_ext=c + +# Object file extension for compiled C test sources. +objext=o +objext=$objext + +# Code to be used in simple compile tests +lt_simple_compile_test_code="int some_variable = 0;" + +# Code to be used in simple link tests +lt_simple_link_test_code='int main(){return(0);}' + + + + + + + +# If no C compiler was specified, use CC. +LTCC=${LTCC-"$CC"} + +# If no C compiler flags were specified, use CFLAGS. +LTCFLAGS=${LTCFLAGS-"$CFLAGS"} + +# Allow CC to be a program name with arguments. +compiler=$CC + +# Save the default compiler, since it gets overwritten when the other +# tags are being tested, and _LT_TAGVAR(compiler, []) is a NOP. +compiler_DEFAULT=$CC + +# save warnings/boilerplate of simple test code +ac_outfile=conftest.$ac_objext +echo "$lt_simple_compile_test_code" >conftest.$ac_ext +eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err +_lt_compiler_boilerplate=`cat conftest.err` +$RM conftest* + +ac_outfile=conftest.$ac_objext +echo "$lt_simple_link_test_code" >conftest.$ac_ext +eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err +_lt_linker_boilerplate=`cat conftest.err` +$RM -r conftest* + + +## CAVEAT EMPTOR: +## There is no encapsulation within the following macros, do not change +## the running order or otherwise move them around unless you know exactly +## what you are doing... +if test -n "$compiler"; then + +lt_prog_compiler_no_builtin_flag= + +if test "$GCC" = yes; then + case $cc_basename in + nvcc*) + lt_prog_compiler_no_builtin_flag=' -Xcompiler -fno-builtin' ;; + *) + lt_prog_compiler_no_builtin_flag=' -fno-builtin' ;; + esac + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -fno-rtti -fno-exceptions" >&5 +$as_echo_n "checking if $compiler supports -fno-rtti -fno-exceptions... " >&6; } +if ${lt_cv_prog_compiler_rtti_exceptions+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_prog_compiler_rtti_exceptions=no + ac_outfile=conftest.$ac_objext + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + lt_compiler_flag="-fno-rtti -fno-exceptions" + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + # The option is referenced via a variable to avoid confusing sed. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ + -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) + (eval "$lt_compile" 2>conftest.err) + ac_status=$? + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + if (exit $ac_status) && test -s "$ac_outfile"; then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings other than the usual output. + $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp + $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 + if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then + lt_cv_prog_compiler_rtti_exceptions=yes + fi + fi + $RM conftest* + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_rtti_exceptions" >&5 +$as_echo "$lt_cv_prog_compiler_rtti_exceptions" >&6; } + +if test x"$lt_cv_prog_compiler_rtti_exceptions" = xyes; then + lt_prog_compiler_no_builtin_flag="$lt_prog_compiler_no_builtin_flag -fno-rtti -fno-exceptions" +else + : +fi + +fi + + + + + + + lt_prog_compiler_wl= +lt_prog_compiler_pic= +lt_prog_compiler_static= + + + if test "$GCC" = yes; then + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_static='-static' + + case $host_os in + aix*) + # All AIX code is PIC. + if test "$host_cpu" = ia64; then + # AIX 5 now supports IA64 processor + lt_prog_compiler_static='-Bstatic' + fi + ;; + + amigaos*) + case $host_cpu in + powerpc) + # see comment about AmigaOS4 .so support + lt_prog_compiler_pic='-fPIC' + ;; + m68k) + # FIXME: we need at least 68020 code to build shared libraries, but + # adding the `-m68020' flag to GCC prevents building anything better, + # like `-m68040'. + lt_prog_compiler_pic='-m68020 -resident32 -malways-restore-a4' + ;; + esac + ;; + + beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) + # PIC is the default for these OSes. + ;; + + mingw* | cygwin* | pw32* | os2* | cegcc*) + # This hack is so that the source file can tell whether it is being + # built for inclusion in a dll (and should export symbols for example). + # Although the cygwin gcc ignores -fPIC, still need this for old-style + # (--disable-auto-import) libraries + lt_prog_compiler_pic='-DDLL_EXPORT' + ;; + + darwin* | rhapsody*) + # PIC is the default on this platform + # Common symbols not allowed in MH_DYLIB files + lt_prog_compiler_pic='-fno-common' + ;; + + haiku*) + # PIC is the default for Haiku. + # The "-static" flag exists, but is broken. + lt_prog_compiler_static= + ;; + + hpux*) + # PIC is the default for 64-bit PA HP-UX, but not for 32-bit + # PA HP-UX. On IA64 HP-UX, PIC is the default but the pic flag + # sets the default TLS model and affects inlining. + case $host_cpu in + hppa*64*) + # +Z the default + ;; + *) + lt_prog_compiler_pic='-fPIC' + ;; + esac + ;; + + interix[3-9]*) + # Interix 3.x gcc -fpic/-fPIC options generate broken code. + # Instead, we relocate shared libraries at runtime. + ;; + + msdosdjgpp*) + # Just because we use GCC doesn't mean we suddenly get shared libraries + # on systems that don't support them. + lt_prog_compiler_can_build_shared=no + enable_shared=no + ;; + + *nto* | *qnx*) + # QNX uses GNU C++, but need to define -shared option too, otherwise + # it will coredump. + lt_prog_compiler_pic='-fPIC -shared' + ;; + + sysv4*MP*) + if test -d /usr/nec; then + lt_prog_compiler_pic=-Kconform_pic + fi + ;; + + *) + lt_prog_compiler_pic='-fPIC' + ;; + esac + + case $cc_basename in + nvcc*) # Cuda Compiler Driver 2.2 + lt_prog_compiler_wl='-Xlinker ' + if test -n "$lt_prog_compiler_pic"; then + lt_prog_compiler_pic="-Xcompiler $lt_prog_compiler_pic" + fi + ;; + esac + else + # PORTME Check for flag to pass linker flags through the system compiler. + case $host_os in + aix*) + lt_prog_compiler_wl='-Wl,' + if test "$host_cpu" = ia64; then + # AIX 5 now supports IA64 processor + lt_prog_compiler_static='-Bstatic' + else + lt_prog_compiler_static='-bnso -bI:/lib/syscalls.exp' + fi + ;; + + mingw* | cygwin* | pw32* | os2* | cegcc*) + # This hack is so that the source file can tell whether it is being + # built for inclusion in a dll (and should export symbols for example). + lt_prog_compiler_pic='-DDLL_EXPORT' + ;; + + hpux9* | hpux10* | hpux11*) + lt_prog_compiler_wl='-Wl,' + # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but + # not for PA HP-UX. + case $host_cpu in + hppa*64*|ia64*) + # +Z the default + ;; + *) + lt_prog_compiler_pic='+Z' + ;; + esac + # Is there a better lt_prog_compiler_static that works with the bundled CC? + lt_prog_compiler_static='${wl}-a ${wl}archive' + ;; + + irix5* | irix6* | nonstopux*) + lt_prog_compiler_wl='-Wl,' + # PIC (with -KPIC) is the default. + lt_prog_compiler_static='-non_shared' + ;; + + linux* | k*bsd*-gnu | kopensolaris*-gnu) + case $cc_basename in + # old Intel for x86_64 which still supported -KPIC. + ecc*) + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_pic='-KPIC' + lt_prog_compiler_static='-static' + ;; + # icc used to be incompatible with GCC. + # ICC 10 doesn't accept -KPIC any more. + icc* | ifort*) + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_pic='-fPIC' + lt_prog_compiler_static='-static' + ;; + # Lahey Fortran 8.1. + lf95*) + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_pic='--shared' + lt_prog_compiler_static='--static' + ;; + nagfor*) + # NAG Fortran compiler + lt_prog_compiler_wl='-Wl,-Wl,,' + lt_prog_compiler_pic='-PIC' + lt_prog_compiler_static='-Bstatic' + ;; + pgcc* | pgf77* | pgf90* | pgf95* | pgfortran*) + # Portland Group compilers (*not* the Pentium gcc compiler, + # which looks to be a dead project) + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_pic='-fpic' + lt_prog_compiler_static='-Bstatic' + ;; + ccc*) + lt_prog_compiler_wl='-Wl,' + # All Alpha code is PIC. + lt_prog_compiler_static='-non_shared' + ;; + xl* | bgxl* | bgf* | mpixl*) + # IBM XL C 8.0/Fortran 10.1, 11.1 on PPC and BlueGene + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_pic='-qpic' + lt_prog_compiler_static='-qstaticlink' + ;; + *) + case `$CC -V 2>&1 | sed 5q` in + *Sun\ Ceres\ Fortran* | *Sun*Fortran*\ [1-7].* | *Sun*Fortran*\ 8.[0-3]*) + # Sun Fortran 8.3 passes all unrecognized flags to the linker + lt_prog_compiler_pic='-KPIC' + lt_prog_compiler_static='-Bstatic' + lt_prog_compiler_wl='' + ;; + *Sun\ F* | *Sun*Fortran*) + lt_prog_compiler_pic='-KPIC' + lt_prog_compiler_static='-Bstatic' + lt_prog_compiler_wl='-Qoption ld ' + ;; + *Sun\ C*) + # Sun C 5.9 + lt_prog_compiler_pic='-KPIC' + lt_prog_compiler_static='-Bstatic' + lt_prog_compiler_wl='-Wl,' + ;; + *Intel*\ [CF]*Compiler*) + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_pic='-fPIC' + lt_prog_compiler_static='-static' + ;; + *Portland\ Group*) + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_pic='-fpic' + lt_prog_compiler_static='-Bstatic' + ;; + esac + ;; + esac + ;; + + newsos6) + lt_prog_compiler_pic='-KPIC' + lt_prog_compiler_static='-Bstatic' + ;; + + *nto* | *qnx*) + # QNX uses GNU C++, but need to define -shared option too, otherwise + # it will coredump. + lt_prog_compiler_pic='-fPIC -shared' + ;; + + osf3* | osf4* | osf5*) + lt_prog_compiler_wl='-Wl,' + # All OSF/1 code is PIC. + lt_prog_compiler_static='-non_shared' + ;; + + rdos*) + lt_prog_compiler_static='-non_shared' + ;; + + solaris*) + lt_prog_compiler_pic='-KPIC' + lt_prog_compiler_static='-Bstatic' + case $cc_basename in + f77* | f90* | f95* | sunf77* | sunf90* | sunf95*) + lt_prog_compiler_wl='-Qoption ld ';; + *) + lt_prog_compiler_wl='-Wl,';; + esac + ;; + + sunos4*) + lt_prog_compiler_wl='-Qoption ld ' + lt_prog_compiler_pic='-PIC' + lt_prog_compiler_static='-Bstatic' + ;; + + sysv4 | sysv4.2uw2* | sysv4.3*) + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_pic='-KPIC' + lt_prog_compiler_static='-Bstatic' + ;; + + sysv4*MP*) + if test -d /usr/nec ;then + lt_prog_compiler_pic='-Kconform_pic' + lt_prog_compiler_static='-Bstatic' + fi + ;; + + sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_pic='-KPIC' + lt_prog_compiler_static='-Bstatic' + ;; + + unicos*) + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_can_build_shared=no + ;; + + uts4*) + lt_prog_compiler_pic='-pic' + lt_prog_compiler_static='-Bstatic' + ;; + + *) + lt_prog_compiler_can_build_shared=no + ;; + esac + fi + +case $host_os in + # For platforms which do not support PIC, -DPIC is meaningless: + *djgpp*) + lt_prog_compiler_pic= + ;; + *) + lt_prog_compiler_pic="$lt_prog_compiler_pic@&t@ -DPIC" + ;; +esac + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $compiler option to produce PIC" >&5 +$as_echo_n "checking for $compiler option to produce PIC... " >&6; } +if ${lt_cv_prog_compiler_pic+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_prog_compiler_pic=$lt_prog_compiler_pic +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic" >&5 +$as_echo "$lt_cv_prog_compiler_pic" >&6; } +lt_prog_compiler_pic=$lt_cv_prog_compiler_pic + +# +# Check to make sure the PIC flag actually works. +# +if test -n "$lt_prog_compiler_pic"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler PIC flag $lt_prog_compiler_pic works" >&5 +$as_echo_n "checking if $compiler PIC flag $lt_prog_compiler_pic works... " >&6; } +if ${lt_cv_prog_compiler_pic_works+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_prog_compiler_pic_works=no + ac_outfile=conftest.$ac_objext + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + lt_compiler_flag="$lt_prog_compiler_pic@&t@ -DPIC" + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + # The option is referenced via a variable to avoid confusing sed. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ + -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) + (eval "$lt_compile" 2>conftest.err) + ac_status=$? + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + if (exit $ac_status) && test -s "$ac_outfile"; then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings other than the usual output. + $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp + $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 + if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then + lt_cv_prog_compiler_pic_works=yes + fi + fi + $RM conftest* + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic_works" >&5 +$as_echo "$lt_cv_prog_compiler_pic_works" >&6; } + +if test x"$lt_cv_prog_compiler_pic_works" = xyes; then + case $lt_prog_compiler_pic in + "" | " "*) ;; + *) lt_prog_compiler_pic=" $lt_prog_compiler_pic" ;; + esac +else + lt_prog_compiler_pic= + lt_prog_compiler_can_build_shared=no +fi + +fi + + + + + + + + + + + +# +# Check to make sure the static flag actually works. +# +wl=$lt_prog_compiler_wl eval lt_tmp_static_flag=\"$lt_prog_compiler_static\" +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler static flag $lt_tmp_static_flag works" >&5 +$as_echo_n "checking if $compiler static flag $lt_tmp_static_flag works... " >&6; } +if ${lt_cv_prog_compiler_static_works+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_prog_compiler_static_works=no + save_LDFLAGS="$LDFLAGS" + LDFLAGS="$LDFLAGS $lt_tmp_static_flag" + echo "$lt_simple_link_test_code" > conftest.$ac_ext + if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then + # The linker can only warn and ignore the option if not recognized + # So say no if there are warnings + if test -s conftest.err; then + # Append any errors to the config.log. + cat conftest.err 1>&5 + $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp + $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 + if diff conftest.exp conftest.er2 >/dev/null; then + lt_cv_prog_compiler_static_works=yes + fi + else + lt_cv_prog_compiler_static_works=yes + fi + fi + $RM -r conftest* + LDFLAGS="$save_LDFLAGS" + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_static_works" >&5 +$as_echo "$lt_cv_prog_compiler_static_works" >&6; } + +if test x"$lt_cv_prog_compiler_static_works" = xyes; then + : +else + lt_prog_compiler_static= +fi + + + + + + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5 +$as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; } +if ${lt_cv_prog_compiler_c_o+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_prog_compiler_c_o=no + $RM -r conftest 2>/dev/null + mkdir conftest + cd conftest + mkdir out + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + + lt_compiler_flag="-o out/conftest2.$ac_objext" + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ + -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) + (eval "$lt_compile" 2>out/conftest.err) + ac_status=$? + cat out/conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + if (exit $ac_status) && test -s out/conftest2.$ac_objext + then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings + $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp + $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 + if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then + lt_cv_prog_compiler_c_o=yes + fi + fi + chmod u+w . 2>&5 + $RM conftest* + # SGI C++ compiler will create directory out/ii_files/ for + # template instantiation + test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files + $RM out/* && rmdir out + cd .. + $RM -r conftest + $RM conftest* + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o" >&5 +$as_echo "$lt_cv_prog_compiler_c_o" >&6; } + + + + + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5 +$as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; } +if ${lt_cv_prog_compiler_c_o+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_prog_compiler_c_o=no + $RM -r conftest 2>/dev/null + mkdir conftest + cd conftest + mkdir out + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + + lt_compiler_flag="-o out/conftest2.$ac_objext" + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ + -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) + (eval "$lt_compile" 2>out/conftest.err) + ac_status=$? + cat out/conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + if (exit $ac_status) && test -s out/conftest2.$ac_objext + then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings + $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp + $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 + if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then + lt_cv_prog_compiler_c_o=yes + fi + fi + chmod u+w . 2>&5 + $RM conftest* + # SGI C++ compiler will create directory out/ii_files/ for + # template instantiation + test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files + $RM out/* && rmdir out + cd .. + $RM -r conftest + $RM conftest* + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o" >&5 +$as_echo "$lt_cv_prog_compiler_c_o" >&6; } + + + + +hard_links="nottested" +if test "$lt_cv_prog_compiler_c_o" = no && test "$need_locks" != no; then + # do not overwrite the value of need_locks provided by the user + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if we can lock with hard links" >&5 +$as_echo_n "checking if we can lock with hard links... " >&6; } + hard_links=yes + $RM conftest* + ln conftest.a conftest.b 2>/dev/null && hard_links=no + touch conftest.a + ln conftest.a conftest.b 2>&5 || hard_links=no + ln conftest.a conftest.b 2>/dev/null && hard_links=no + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $hard_links" >&5 +$as_echo "$hard_links" >&6; } + if test "$hard_links" = no; then + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&5 +$as_echo "$as_me: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&2;} + need_locks=warn + fi +else + need_locks=no +fi + + + + + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $compiler linker ($LD) supports shared libraries" >&5 +$as_echo_n "checking whether the $compiler linker ($LD) supports shared libraries... " >&6; } + + runpath_var= + allow_undefined_flag= + always_export_symbols=no + archive_cmds= + archive_expsym_cmds= + compiler_needs_object=no + enable_shared_with_static_runtimes=no + export_dynamic_flag_spec= + export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' + hardcode_automatic=no + hardcode_direct=no + hardcode_direct_absolute=no + hardcode_libdir_flag_spec= + hardcode_libdir_separator= + hardcode_minus_L=no + hardcode_shlibpath_var=unsupported + inherit_rpath=no + link_all_deplibs=unknown + module_cmds= + module_expsym_cmds= + old_archive_from_new_cmds= + old_archive_from_expsyms_cmds= + thread_safe_flag_spec= + whole_archive_flag_spec= + # include_expsyms should be a list of space-separated symbols to be *always* + # included in the symbol list + include_expsyms= + # exclude_expsyms can be an extended regexp of symbols to exclude + # it will be wrapped by ` (' and `)$', so one must not match beginning or + # end of line. Example: `a|bc|.*d.*' will exclude the symbols `a' and `bc', + # as well as any symbol that contains `d'. + exclude_expsyms='_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*' + # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out + # platforms (ab)use it in PIC code, but their linkers get confused if + # the symbol is explicitly referenced. Since portable code cannot + # rely on this symbol name, it's probably fine to never include it in + # preloaded symbol tables. + # Exclude shared library initialization/finalization symbols. + extract_expsyms_cmds= + + case $host_os in + cygwin* | mingw* | pw32* | cegcc*) + # FIXME: the MSVC++ port hasn't been tested in a loooong time + # When not using gcc, we currently assume that we are using + # Microsoft Visual C++. + if test "$GCC" != yes; then + with_gnu_ld=no + fi + ;; + interix*) + # we just hope/assume this is gcc and not c89 (= MSVC++) + with_gnu_ld=yes + ;; + openbsd*) + with_gnu_ld=no + ;; + linux* | k*bsd*-gnu | gnu*) + link_all_deplibs=no + ;; + esac + + ld_shlibs=yes + + # On some targets, GNU ld is compatible enough with the native linker + # that we're better off using the native interface for both. + lt_use_gnu_ld_interface=no + if test "$with_gnu_ld" = yes; then + case $host_os in + aix*) + # The AIX port of GNU ld has always aspired to compatibility + # with the native linker. However, as the warning in the GNU ld + # block says, versions before 2.19.5* couldn't really create working + # shared libraries, regardless of the interface used. + case `$LD -v 2>&1` in + *\ \(GNU\ Binutils\)\ 2.19.5*) ;; + *\ \(GNU\ Binutils\)\ 2.[2-9]*) ;; + *\ \(GNU\ Binutils\)\ [3-9]*) ;; + *) + lt_use_gnu_ld_interface=yes + ;; + esac + ;; + *) + lt_use_gnu_ld_interface=yes + ;; + esac + fi + + if test "$lt_use_gnu_ld_interface" = yes; then + # If archive_cmds runs LD, not CC, wlarc should be empty + wlarc='${wl}' + + # Set some defaults for GNU ld with shared library support. These + # are reset later if shared libraries are not supported. Putting them + # here allows them to be overridden if necessary. + runpath_var=LD_RUN_PATH + hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' + export_dynamic_flag_spec='${wl}--export-dynamic' + # ancient GNU ld didn't support --whole-archive et. al. + if $LD --help 2>&1 | $GREP 'no-whole-archive' > /dev/null; then + whole_archive_flag_spec="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' + else + whole_archive_flag_spec= + fi + supports_anon_versioning=no + case `$LD -v 2>&1` in + *GNU\ gold*) supports_anon_versioning=yes ;; + *\ [01].* | *\ 2.[0-9].* | *\ 2.10.*) ;; # catch versions < 2.11 + *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ... + *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ... + *\ 2.11.*) ;; # other 2.11 versions + *) supports_anon_versioning=yes ;; + esac + + # See if GNU ld supports shared libraries. + case $host_os in + aix[3-9]*) + # On AIX/PPC, the GNU linker is very broken + if test "$host_cpu" != ia64; then + ld_shlibs=no + cat <<_LT_EOF 1>&2 + +*** Warning: the GNU linker, at least up to release 2.19, is reported +*** to be unable to reliably create shared libraries on AIX. +*** Therefore, libtool is disabling shared libraries support. If you +*** really care for shared libraries, you may want to install binutils +*** 2.20 or above, or modify your PATH so that a non-GNU linker is found. +*** You will then need to restart the configuration process. + +_LT_EOF + fi + ;; + + amigaos*) + case $host_cpu in + powerpc) + # see comment about AmigaOS4 .so support + archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + archive_expsym_cmds='' + ;; + m68k) + archive_cmds='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' + hardcode_libdir_flag_spec='-L$libdir' + hardcode_minus_L=yes + ;; + esac + ;; + + beos*) + if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then + allow_undefined_flag=unsupported + # Joseph Beckenbach says some releases of gcc + # support --undefined. This deserves some investigation. FIXME + archive_cmds='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + else + ld_shlibs=no + fi + ;; + + cygwin* | mingw* | pw32* | cegcc*) + # _LT_TAGVAR(hardcode_libdir_flag_spec, ) is actually meaningless, + # as there is no search path for DLLs. + hardcode_libdir_flag_spec='-L$libdir' + export_dynamic_flag_spec='${wl}--export-all-symbols' + allow_undefined_flag=unsupported + always_export_symbols=no + enable_shared_with_static_runtimes=yes + export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1 DATA/;s/^.*[ ]__nm__\([^ ]*\)[ ][^ ]*/\1 DATA/;/^I[ ]/d;/^[AITW][ ]/s/.* //'\'' | sort | uniq > $export_symbols' + exclude_expsyms='[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname' + + if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then + archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' + # If the export-symbols file already is a .def file (1st line + # is EXPORTS), use it as is; otherwise, prepend... + archive_expsym_cmds='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then + cp $export_symbols $output_objdir/$soname.def; + else + echo EXPORTS > $output_objdir/$soname.def; + cat $export_symbols >> $output_objdir/$soname.def; + fi~ + $CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' + else + ld_shlibs=no + fi + ;; + + haiku*) + archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + link_all_deplibs=yes + ;; + + interix[3-9]*) + hardcode_direct=no + hardcode_shlibpath_var=no + hardcode_libdir_flag_spec='${wl}-rpath,$libdir' + export_dynamic_flag_spec='${wl}-E' + # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. + # Instead, shared libraries are loaded at an image base (0x10000000 by + # default) and relocated if they conflict, which is a slow very memory + # consuming and fragmenting process. To avoid this, we pick a random, + # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link + # time. Moving up from 0x10000000 also allows more sbrk(2) space. + archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' + archive_expsym_cmds='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' + ;; + + gnu* | linux* | tpf* | k*bsd*-gnu | kopensolaris*-gnu) + tmp_diet=no + if test "$host_os" = linux-dietlibc; then + case $cc_basename in + diet\ *) tmp_diet=yes;; # linux-dietlibc with static linking (!diet-dyn) + esac + fi + if $LD --help 2>&1 | $EGREP ': supported targets:.* elf' > /dev/null \ + && test "$tmp_diet" = no + then + tmp_addflag=' $pic_flag' + tmp_sharedflag='-shared' + case $cc_basename,$host_cpu in + pgcc*) # Portland Group C compiler + whole_archive_flag_spec='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' + tmp_addflag=' $pic_flag' + ;; + pgf77* | pgf90* | pgf95* | pgfortran*) + # Portland Group f77 and f90 compilers + whole_archive_flag_spec='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' + tmp_addflag=' $pic_flag -Mnomain' ;; + ecc*,ia64* | icc*,ia64*) # Intel C compiler on ia64 + tmp_addflag=' -i_dynamic' ;; + efc*,ia64* | ifort*,ia64*) # Intel Fortran compiler on ia64 + tmp_addflag=' -i_dynamic -nofor_main' ;; + ifc* | ifort*) # Intel Fortran compiler + tmp_addflag=' -nofor_main' ;; + lf95*) # Lahey Fortran 8.1 + whole_archive_flag_spec= + tmp_sharedflag='--shared' ;; + xl[cC]* | bgxl[cC]* | mpixl[cC]*) # IBM XL C 8.0 on PPC (deal with xlf below) + tmp_sharedflag='-qmkshrobj' + tmp_addflag= ;; + nvcc*) # Cuda Compiler Driver 2.2 + whole_archive_flag_spec='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' + compiler_needs_object=yes + ;; + esac + case `$CC -V 2>&1 | sed 5q` in + *Sun\ C*) # Sun C 5.9 + whole_archive_flag_spec='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' + compiler_needs_object=yes + tmp_sharedflag='-G' ;; + *Sun\ F*) # Sun Fortran 8.3 + tmp_sharedflag='-G' ;; + esac + archive_cmds='$CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + + if test "x$supports_anon_versioning" = xyes; then + archive_expsym_cmds='echo "{ global:" > $output_objdir/$libname.ver~ + cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ + echo "local: *; };" >> $output_objdir/$libname.ver~ + $CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib' + fi + + case $cc_basename in + xlf* | bgf* | bgxlf* | mpixlf*) + # IBM XL Fortran 10.1 on PPC cannot create shared libs itself + whole_archive_flag_spec='--whole-archive$convenience --no-whole-archive' + hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' + archive_cmds='$LD -shared $libobjs $deplibs $linker_flags -soname $soname -o $lib' + if test "x$supports_anon_versioning" = xyes; then + archive_expsym_cmds='echo "{ global:" > $output_objdir/$libname.ver~ + cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ + echo "local: *; };" >> $output_objdir/$libname.ver~ + $LD -shared $libobjs $deplibs $linker_flags -soname $soname -version-script $output_objdir/$libname.ver -o $lib' + fi + ;; + esac + else + ld_shlibs=no + fi + ;; + + netbsd* | netbsdelf*-gnu) + if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then + archive_cmds='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib' + wlarc= + else + archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + fi + ;; + + solaris*) + if $LD -v 2>&1 | $GREP 'BFD 2\.8' > /dev/null; then + ld_shlibs=no + cat <<_LT_EOF 1>&2 + +*** Warning: The releases 2.8.* of the GNU linker cannot reliably +*** create shared libraries on Solaris systems. Therefore, libtool +*** is disabling shared libraries support. We urge you to upgrade GNU +*** binutils to release 2.9.1 or newer. Another option is to modify +*** your PATH or compiler configuration so that the native linker is +*** used, and then restart. + +_LT_EOF + elif $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then + archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + else + ld_shlibs=no + fi + ;; + + sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*) + case `$LD -v 2>&1` in + *\ [01].* | *\ 2.[0-9].* | *\ 2.1[0-5].*) + ld_shlibs=no + cat <<_LT_EOF 1>&2 + +*** Warning: Releases of the GNU linker prior to 2.16.91.0.3 can not +*** reliably create shared libraries on SCO systems. Therefore, libtool +*** is disabling shared libraries support. We urge you to upgrade GNU +*** binutils to release 2.16.91.0.3 or newer. Another option is to modify +*** your PATH or compiler configuration so that the native linker is +*** used, and then restart. + +_LT_EOF + ;; + *) + # For security reasons, it is highly recommended that you always + # use absolute paths for naming shared libraries, and exclude the + # DT_RUNPATH tag from executables and libraries. But doing so + # requires that you compile everything twice, which is a pain. + if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then + hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' + archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + else + ld_shlibs=no + fi + ;; + esac + ;; + + sunos4*) + archive_cmds='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags' + wlarc= + hardcode_direct=yes + hardcode_shlibpath_var=no + ;; + + *) + if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then + archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + else + ld_shlibs=no + fi + ;; + esac + + if test "$ld_shlibs" = no; then + runpath_var= + hardcode_libdir_flag_spec= + export_dynamic_flag_spec= + whole_archive_flag_spec= + fi + else + # PORTME fill in a description of your system's linker (not GNU ld) + case $host_os in + aix3*) + allow_undefined_flag=unsupported + always_export_symbols=yes + archive_expsym_cmds='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname' + # Note: this linker hardcodes the directories in LIBPATH if there + # are no directories specified by -L. + hardcode_minus_L=yes + if test "$GCC" = yes && test -z "$lt_prog_compiler_static"; then + # Neither direct hardcoding nor static linking is supported with a + # broken collect2. + hardcode_direct=unsupported + fi + ;; + + aix[4-9]*) + if test "$host_cpu" = ia64; then + # On IA64, the linker does run time linking by default, so we don't + # have to do anything special. + aix_use_runtimelinking=no + exp_sym_flag='-Bexport' + no_entry_flag="" + else + # If we're using GNU nm, then we don't want the "-C" option. + # -C means demangle to AIX nm, but means don't demangle with GNU nm + # Also, AIX nm treats weak defined symbols like other global + # defined symbols, whereas GNU nm marks them as "W". + if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then + export_symbols_cmds='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && (substr(\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' + else + export_symbols_cmds='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && (substr(\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' + fi + aix_use_runtimelinking=no + + # Test if we are trying to use run time linking or normal + # AIX style linking. If -brtl is somewhere in LDFLAGS, we + # need to do runtime linking. + case $host_os in aix4.[23]|aix4.[23].*|aix[5-9]*) + for ld_flag in $LDFLAGS; do + if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then + aix_use_runtimelinking=yes + break + fi + done + ;; + esac + + exp_sym_flag='-bexport' + no_entry_flag='-bnoentry' + fi + + # When large executables or shared objects are built, AIX ld can + # have problems creating the table of contents. If linking a library + # or program results in "error TOC overflow" add -mminimal-toc to + # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not + # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. + + archive_cmds='' + hardcode_direct=yes + hardcode_direct_absolute=yes + hardcode_libdir_separator=':' + link_all_deplibs=yes + file_list_spec='${wl}-f,' + + if test "$GCC" = yes; then + case $host_os in aix4.[012]|aix4.[012].*) + # We only want to do this on AIX 4.2 and lower, the check + # below for broken collect2 doesn't work under 4.3+ + collect2name=`${CC} -print-prog-name=collect2` + if test -f "$collect2name" && + strings "$collect2name" | $GREP resolve_lib_name >/dev/null + then + # We have reworked collect2 + : + else + # We have old collect2 + hardcode_direct=unsupported + # It fails to find uninstalled libraries when the uninstalled + # path is not listed in the libpath. Setting hardcode_minus_L + # to unsupported forces relinking + hardcode_minus_L=yes + hardcode_libdir_flag_spec='-L$libdir' + hardcode_libdir_separator= + fi + ;; + esac + shared_flag='-shared' + if test "$aix_use_runtimelinking" = yes; then + shared_flag="$shared_flag "'${wl}-G' + fi + link_all_deplibs=no + else + # not using gcc + if test "$host_cpu" = ia64; then + # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release + # chokes on -Wl,-G. The following line is correct: + shared_flag='-G' + else + if test "$aix_use_runtimelinking" = yes; then + shared_flag='${wl}-G' + else + shared_flag='${wl}-bM:SRE' + fi + fi + fi + + export_dynamic_flag_spec='${wl}-bexpall' + # It seems that -bexpall does not export symbols beginning with + # underscore (_), so it is better to generate a list of symbols to export. + always_export_symbols=yes + if test "$aix_use_runtimelinking" = yes; then + # Warning - without using the other runtime loading flags (-brtl), + # -berok will link without error, but may produce a broken library. + allow_undefined_flag='-berok' + # Determine the default libpath from the value encoded in an + # empty executable. + if test "${lt_cv_aix_libpath+set}" = set; then + aix_libpath=$lt_cv_aix_libpath +else + if ${lt_cv_aix_libpath_+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + + lt_aix_libpath_sed=' + /Import File Strings/,/^$/ { + /^0/ { + s/^0 *\([^ ]*\) *$/\1/ + p + } + }' + lt_cv_aix_libpath_=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` + # Check for a 64-bit object if we didn't find anything. + if test -z "$lt_cv_aix_libpath_"; then + lt_cv_aix_libpath_=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` + fi +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + if test -z "$lt_cv_aix_libpath_"; then + lt_cv_aix_libpath_="/usr/lib:/lib" + fi + +fi + + aix_libpath=$lt_cv_aix_libpath_ +fi + + hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath" + archive_expsym_cmds='$CC -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then func_echo_all "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag" + else + if test "$host_cpu" = ia64; then + hardcode_libdir_flag_spec='${wl}-R $libdir:/usr/lib:/lib' + allow_undefined_flag="-z nodefs" + archive_expsym_cmds="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols" + else + # Determine the default libpath from the value encoded in an + # empty executable. + if test "${lt_cv_aix_libpath+set}" = set; then + aix_libpath=$lt_cv_aix_libpath +else + if ${lt_cv_aix_libpath_+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + + lt_aix_libpath_sed=' + /Import File Strings/,/^$/ { + /^0/ { + s/^0 *\([^ ]*\) *$/\1/ + p + } + }' + lt_cv_aix_libpath_=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` + # Check for a 64-bit object if we didn't find anything. + if test -z "$lt_cv_aix_libpath_"; then + lt_cv_aix_libpath_=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` + fi +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + if test -z "$lt_cv_aix_libpath_"; then + lt_cv_aix_libpath_="/usr/lib:/lib" + fi + +fi + + aix_libpath=$lt_cv_aix_libpath_ +fi + + hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath" + # Warning - without using the other run time loading flags, + # -berok will link without error, but may produce a broken library. + no_undefined_flag=' ${wl}-bernotok' + allow_undefined_flag=' ${wl}-berok' + if test "$with_gnu_ld" = yes; then + # We only use this code for GNU lds that support --whole-archive. + whole_archive_flag_spec='${wl}--whole-archive$convenience ${wl}--no-whole-archive' + else + # Exported symbols can be pulled into shared objects from archives + whole_archive_flag_spec='$convenience' + fi + archive_cmds_need_lc=yes + # This is similar to how AIX traditionally builds its shared libraries. + archive_expsym_cmds="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' + fi + fi + ;; + + amigaos*) + case $host_cpu in + powerpc) + # see comment about AmigaOS4 .so support + archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + archive_expsym_cmds='' + ;; + m68k) + archive_cmds='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' + hardcode_libdir_flag_spec='-L$libdir' + hardcode_minus_L=yes + ;; + esac + ;; + + bsdi[45]*) + export_dynamic_flag_spec=-rdynamic + ;; + + cygwin* | mingw* | pw32* | cegcc*) + # When not using gcc, we currently assume that we are using + # Microsoft Visual C++. + # hardcode_libdir_flag_spec is actually meaningless, as there is + # no search path for DLLs. + case $cc_basename in + cl*) + # Native MSVC + hardcode_libdir_flag_spec=' ' + allow_undefined_flag=unsupported + always_export_symbols=yes + file_list_spec='@' + # Tell ltmain to make .lib files, not .a files. + libext=lib + # Tell ltmain to make .dll files, not .so files. + shrext_cmds=".dll" + # FIXME: Setting linknames here is a bad hack. + archive_cmds='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-dll~linknames=' + archive_expsym_cmds='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then + sed -n -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' -e '1\\\!p' < $export_symbols > $output_objdir/$soname.exp; + else + sed -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' < $export_symbols > $output_objdir/$soname.exp; + fi~ + $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~ + linknames=' + # The linker will not automatically build a static lib if we build a DLL. + # _LT_TAGVAR(old_archive_from_new_cmds, )='true' + enable_shared_with_static_runtimes=yes + exclude_expsyms='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*' + export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1,DATA/'\'' | $SED -e '\''/^[AITW][ ]/s/.*[ ]//'\'' | sort | uniq > $export_symbols' + # Don't use ranlib + old_postinstall_cmds='chmod 644 $oldlib' + postlink_cmds='lt_outputfile="@OUTPUT@"~ + lt_tool_outputfile="@TOOL_OUTPUT@"~ + case $lt_outputfile in + *.exe|*.EXE) ;; + *) + lt_outputfile="$lt_outputfile.exe" + lt_tool_outputfile="$lt_tool_outputfile.exe" + ;; + esac~ + if test "$MANIFEST_TOOL" != ":" && test -f "$lt_outputfile.manifest"; then + $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1; + $RM "$lt_outputfile.manifest"; + fi' + ;; + *) + # Assume MSVC wrapper + hardcode_libdir_flag_spec=' ' + allow_undefined_flag=unsupported + # Tell ltmain to make .lib files, not .a files. + libext=lib + # Tell ltmain to make .dll files, not .so files. + shrext_cmds=".dll" + # FIXME: Setting linknames here is a bad hack. + archive_cmds='$CC -o $lib $libobjs $compiler_flags `func_echo_all "$deplibs" | $SED '\''s/ -lc$//'\''` -link -dll~linknames=' + # The linker will automatically build a .lib file if we build a DLL. + old_archive_from_new_cmds='true' + # FIXME: Should let the user specify the lib program. + old_archive_cmds='lib -OUT:$oldlib$oldobjs$old_deplibs' + enable_shared_with_static_runtimes=yes + ;; + esac + ;; + + darwin* | rhapsody*) + + + archive_cmds_need_lc=no + hardcode_direct=no + hardcode_automatic=yes + hardcode_shlibpath_var=unsupported + if test "$lt_cv_ld_force_load" = "yes"; then + whole_archive_flag_spec='`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience ${wl}-force_load,$conv\"; done; func_echo_all \"$new_convenience\"`' + + else + whole_archive_flag_spec='' + fi + link_all_deplibs=yes + allow_undefined_flag="$_lt_dar_allow_undefined" + case $cc_basename in + ifort*) _lt_dar_can_shared=yes ;; + *) _lt_dar_can_shared=$GCC ;; + esac + if test "$_lt_dar_can_shared" = "yes"; then + output_verbose_link_cmd=func_echo_all + archive_cmds="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod${_lt_dsymutil}" + module_cmds="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dsymutil}" + archive_expsym_cmds="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring ${_lt_dar_single_mod}${_lt_dar_export_syms}${_lt_dsymutil}" + module_expsym_cmds="sed -e 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dar_export_syms}${_lt_dsymutil}" + + else + ld_shlibs=no + fi + + ;; + + dgux*) + archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_libdir_flag_spec='-L$libdir' + hardcode_shlibpath_var=no + ;; + + # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor + # support. Future versions do this automatically, but an explicit c++rt0.o + # does not break anything, and helps significantly (at the cost of a little + # extra space). + freebsd2.2*) + archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o' + hardcode_libdir_flag_spec='-R$libdir' + hardcode_direct=yes + hardcode_shlibpath_var=no + ;; + + # Unfortunately, older versions of FreeBSD 2 do not have this feature. + freebsd2.*) + archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' + hardcode_direct=yes + hardcode_minus_L=yes + hardcode_shlibpath_var=no + ;; + + # FreeBSD 3 and greater uses gcc -shared to do shared libraries. + freebsd* | dragonfly*) + archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' + hardcode_libdir_flag_spec='-R$libdir' + hardcode_direct=yes + hardcode_shlibpath_var=no + ;; + + hpux9*) + if test "$GCC" = yes; then + archive_cmds='$RM $output_objdir/$soname~$CC -shared $pic_flag ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' + else + archive_cmds='$RM $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' + fi + hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' + hardcode_libdir_separator=: + hardcode_direct=yes + + # hardcode_minus_L: Not really in the search PATH, + # but as the default location of the library. + hardcode_minus_L=yes + export_dynamic_flag_spec='${wl}-E' + ;; + + hpux10*) + if test "$GCC" = yes && test "$with_gnu_ld" = no; then + archive_cmds='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' + else + archive_cmds='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' + fi + if test "$with_gnu_ld" = no; then + hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' + hardcode_libdir_separator=: + hardcode_direct=yes + hardcode_direct_absolute=yes + export_dynamic_flag_spec='${wl}-E' + # hardcode_minus_L: Not really in the search PATH, + # but as the default location of the library. + hardcode_minus_L=yes + fi + ;; + + hpux11*) + if test "$GCC" = yes && test "$with_gnu_ld" = no; then + case $host_cpu in + hppa*64*) + archive_cmds='$CC -shared ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + ia64*) + archive_cmds='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' + ;; + *) + archive_cmds='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' + ;; + esac + else + case $host_cpu in + hppa*64*) + archive_cmds='$CC -b ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + ia64*) + archive_cmds='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' + ;; + *) + + # Older versions of the 11.00 compiler do not understand -b yet + # (HP92453-01 A.11.01.20 doesn't, HP92453-01 B.11.X.35175-35176.GP does) + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $CC understands -b" >&5 +$as_echo_n "checking if $CC understands -b... " >&6; } +if ${lt_cv_prog_compiler__b+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_prog_compiler__b=no + save_LDFLAGS="$LDFLAGS" + LDFLAGS="$LDFLAGS -b" + echo "$lt_simple_link_test_code" > conftest.$ac_ext + if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then + # The linker can only warn and ignore the option if not recognized + # So say no if there are warnings + if test -s conftest.err; then + # Append any errors to the config.log. + cat conftest.err 1>&5 + $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp + $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 + if diff conftest.exp conftest.er2 >/dev/null; then + lt_cv_prog_compiler__b=yes + fi + else + lt_cv_prog_compiler__b=yes + fi + fi + $RM -r conftest* + LDFLAGS="$save_LDFLAGS" + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler__b" >&5 +$as_echo "$lt_cv_prog_compiler__b" >&6; } + +if test x"$lt_cv_prog_compiler__b" = xyes; then + archive_cmds='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' +else + archive_cmds='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' +fi + + ;; + esac + fi + if test "$with_gnu_ld" = no; then + hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' + hardcode_libdir_separator=: + + case $host_cpu in + hppa*64*|ia64*) + hardcode_direct=no + hardcode_shlibpath_var=no + ;; + *) + hardcode_direct=yes + hardcode_direct_absolute=yes + export_dynamic_flag_spec='${wl}-E' + + # hardcode_minus_L: Not really in the search PATH, + # but as the default location of the library. + hardcode_minus_L=yes + ;; + esac + fi + ;; + + irix5* | irix6* | nonstopux*) + if test "$GCC" = yes; then + archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + # Try to use the -exported_symbol ld option, if it does not + # work, assume that -exports_file does not work either and + # implicitly export all symbols. + # This should be the same for all languages, so no per-tag cache variable. + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $host_os linker accepts -exported_symbol" >&5 +$as_echo_n "checking whether the $host_os linker accepts -exported_symbol... " >&6; } +if ${lt_cv_irix_exported_symbol+:} false; then : + $as_echo_n "(cached) " >&6 +else + save_LDFLAGS="$LDFLAGS" + LDFLAGS="$LDFLAGS -shared ${wl}-exported_symbol ${wl}foo ${wl}-update_registry ${wl}/dev/null" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +int foo (void) { return 0; } +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + lt_cv_irix_exported_symbol=yes +else + lt_cv_irix_exported_symbol=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + LDFLAGS="$save_LDFLAGS" +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_irix_exported_symbol" >&5 +$as_echo "$lt_cv_irix_exported_symbol" >&6; } + if test "$lt_cv_irix_exported_symbol" = yes; then + archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations ${wl}-exports_file ${wl}$export_symbols -o $lib' + fi + else + archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' + archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -exports_file $export_symbols -o $lib' + fi + archive_cmds_need_lc='no' + hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' + hardcode_libdir_separator=: + inherit_rpath=yes + link_all_deplibs=yes + ;; + + netbsd* | netbsdelf*-gnu) + if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then + archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' # a.out + else + archive_cmds='$LD -shared -o $lib $libobjs $deplibs $linker_flags' # ELF + fi + hardcode_libdir_flag_spec='-R$libdir' + hardcode_direct=yes + hardcode_shlibpath_var=no + ;; + + newsos6) + archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_direct=yes + hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' + hardcode_libdir_separator=: + hardcode_shlibpath_var=no + ;; + + *nto* | *qnx*) + ;; + + openbsd*) + if test -f /usr/libexec/ld.so; then + hardcode_direct=yes + hardcode_shlibpath_var=no + hardcode_direct_absolute=yes + if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then + archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-retain-symbols-file,$export_symbols' + hardcode_libdir_flag_spec='${wl}-rpath,$libdir' + export_dynamic_flag_spec='${wl}-E' + else + case $host_os in + openbsd[01].* | openbsd2.[0-7] | openbsd2.[0-7].*) + archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' + hardcode_libdir_flag_spec='-R$libdir' + ;; + *) + archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' + hardcode_libdir_flag_spec='${wl}-rpath,$libdir' + ;; + esac + fi + else + ld_shlibs=no + fi + ;; + + os2*) + hardcode_libdir_flag_spec='-L$libdir' + hardcode_minus_L=yes + allow_undefined_flag=unsupported + archive_cmds='$ECHO "LIBRARY $libname INITINSTANCE" > $output_objdir/$libname.def~$ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~echo DATA >> $output_objdir/$libname.def~echo " SINGLE NONSHARED" >> $output_objdir/$libname.def~echo EXPORTS >> $output_objdir/$libname.def~emxexp $libobjs >> $output_objdir/$libname.def~$CC -Zdll -Zcrtdll -o $lib $libobjs $deplibs $compiler_flags $output_objdir/$libname.def' + old_archive_from_new_cmds='emximp -o $output_objdir/$libname.a $output_objdir/$libname.def' + ;; + + osf3*) + if test "$GCC" = yes; then + allow_undefined_flag=' ${wl}-expect_unresolved ${wl}\*' + archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + else + allow_undefined_flag=' -expect_unresolved \*' + archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' + fi + archive_cmds_need_lc='no' + hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' + hardcode_libdir_separator=: + ;; + + osf4* | osf5*) # as osf3* with the addition of -msym flag + if test "$GCC" = yes; then + allow_undefined_flag=' ${wl}-expect_unresolved ${wl}\*' + archive_cmds='$CC -shared${allow_undefined_flag} $pic_flag $libobjs $deplibs $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' + else + allow_undefined_flag=' -expect_unresolved \*' + archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' + archive_expsym_cmds='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; printf "%s\\n" "-hidden">> $lib.exp~ + $CC -shared${allow_undefined_flag} ${wl}-input ${wl}$lib.exp $compiler_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib~$RM $lib.exp' + + # Both c and cxx compiler support -rpath directly + hardcode_libdir_flag_spec='-rpath $libdir' + fi + archive_cmds_need_lc='no' + hardcode_libdir_separator=: + ;; + + solaris*) + no_undefined_flag=' -z defs' + if test "$GCC" = yes; then + wlarc='${wl}' + archive_cmds='$CC -shared $pic_flag ${wl}-z ${wl}text ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ + $CC -shared $pic_flag ${wl}-z ${wl}text ${wl}-M ${wl}$lib.exp ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' + else + case `$CC -V 2>&1` in + *"Compilers 5.0"*) + wlarc='' + archive_cmds='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags' + archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ + $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$RM $lib.exp' + ;; + *) + wlarc='${wl}' + archive_cmds='$CC -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ + $CC -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' + ;; + esac + fi + hardcode_libdir_flag_spec='-R$libdir' + hardcode_shlibpath_var=no + case $host_os in + solaris2.[0-5] | solaris2.[0-5].*) ;; + *) + # The compiler driver will combine and reorder linker options, + # but understands `-z linker_flag'. GCC discards it without `$wl', + # but is careful enough not to reorder. + # Supported since Solaris 2.6 (maybe 2.5.1?) + if test "$GCC" = yes; then + whole_archive_flag_spec='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract' + else + whole_archive_flag_spec='-z allextract$convenience -z defaultextract' + fi + ;; + esac + link_all_deplibs=yes + ;; + + sunos4*) + if test "x$host_vendor" = xsequent; then + # Use $CC to link under sequent, because it throws in some extra .o + # files that make .init and .fini sections work. + archive_cmds='$CC -G ${wl}-h $soname -o $lib $libobjs $deplibs $compiler_flags' + else + archive_cmds='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags' + fi + hardcode_libdir_flag_spec='-L$libdir' + hardcode_direct=yes + hardcode_minus_L=yes + hardcode_shlibpath_var=no + ;; + + sysv4) + case $host_vendor in + sni) + archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_direct=yes # is this really true??? + ;; + siemens) + ## LD is ld it makes a PLAMLIB + ## CC just makes a GrossModule. + archive_cmds='$LD -G -o $lib $libobjs $deplibs $linker_flags' + reload_cmds='$CC -r -o $output$reload_objs' + hardcode_direct=no + ;; + motorola) + archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_direct=no #Motorola manual says yes, but my tests say they lie + ;; + esac + runpath_var='LD_RUN_PATH' + hardcode_shlibpath_var=no + ;; + + sysv4.3*) + archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_shlibpath_var=no + export_dynamic_flag_spec='-Bexport' + ;; + + sysv4*MP*) + if test -d /usr/nec; then + archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_shlibpath_var=no + runpath_var=LD_RUN_PATH + hardcode_runpath_var=yes + ld_shlibs=yes + fi + ;; + + sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7* | sco3.2v5.0.[024]*) + no_undefined_flag='${wl}-z,text' + archive_cmds_need_lc=no + hardcode_shlibpath_var=no + runpath_var='LD_RUN_PATH' + + if test "$GCC" = yes; then + archive_cmds='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + else + archive_cmds='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + fi + ;; + + sysv5* | sco3.2v5* | sco5v6*) + # Note: We can NOT use -z defs as we might desire, because we do not + # link with -lc, and that would cause any symbols used from libc to + # always be unresolved, which means just about no library would + # ever link correctly. If we're not using GNU ld we use -z text + # though, which does catch some bad symbols but isn't as heavy-handed + # as -z defs. + no_undefined_flag='${wl}-z,text' + allow_undefined_flag='${wl}-z,nodefs' + archive_cmds_need_lc=no + hardcode_shlibpath_var=no + hardcode_libdir_flag_spec='${wl}-R,$libdir' + hardcode_libdir_separator=':' + link_all_deplibs=yes + export_dynamic_flag_spec='${wl}-Bexport' + runpath_var='LD_RUN_PATH' + + if test "$GCC" = yes; then + archive_cmds='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + else + archive_cmds='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + fi + ;; + + uts4*) + archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_libdir_flag_spec='-L$libdir' + hardcode_shlibpath_var=no + ;; + + *) + ld_shlibs=no + ;; + esac + + if test x$host_vendor = xsni; then + case $host in + sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) + export_dynamic_flag_spec='${wl}-Blargedynsym' + ;; + esac + fi + fi + +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ld_shlibs" >&5 +$as_echo "$ld_shlibs" >&6; } +test "$ld_shlibs" = no && can_build_shared=no + +with_gnu_ld=$with_gnu_ld + + + + + + + + + + + + + + + +# +# Do we need to explicitly link libc? +# +case "x$archive_cmds_need_lc" in +x|xyes) + # Assume -lc should be added + archive_cmds_need_lc=yes + + if test "$enable_shared" = yes && test "$GCC" = yes; then + case $archive_cmds in + *'~'*) + # FIXME: we may have to deal with multi-command sequences. + ;; + '$CC '*) + # Test whether the compiler implicitly links with -lc since on some + # systems, -lgcc has to come before -lc. If gcc already passes -lc + # to ld, don't add -lc before -lgcc. + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether -lc should be explicitly linked in" >&5 +$as_echo_n "checking whether -lc should be explicitly linked in... " >&6; } +if ${lt_cv_archive_cmds_need_lc+:} false; then : + $as_echo_n "(cached) " >&6 +else + $RM conftest* + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } 2>conftest.err; then + soname=conftest + lib=conftest + libobjs=conftest.$ac_objext + deplibs= + wl=$lt_prog_compiler_wl + pic_flag=$lt_prog_compiler_pic + compiler_flags=-v + linker_flags=-v + verstring= + output_objdir=. + libname=conftest + lt_save_allow_undefined_flag=$allow_undefined_flag + allow_undefined_flag= + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$archive_cmds 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1\""; } >&5 + (eval $archive_cmds 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + then + lt_cv_archive_cmds_need_lc=no + else + lt_cv_archive_cmds_need_lc=yes + fi + allow_undefined_flag=$lt_save_allow_undefined_flag + else + cat conftest.err 1>&5 + fi + $RM conftest* + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_archive_cmds_need_lc" >&5 +$as_echo "$lt_cv_archive_cmds_need_lc" >&6; } + archive_cmds_need_lc=$lt_cv_archive_cmds_need_lc + ;; + esac + fi + ;; +esac + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking dynamic linker characteristics" >&5 +$as_echo_n "checking dynamic linker characteristics... " >&6; } + +if test "$GCC" = yes; then + case $host_os in + darwin*) lt_awk_arg="/^libraries:/,/LR/" ;; + *) lt_awk_arg="/^libraries:/" ;; + esac + case $host_os in + mingw* | cegcc*) lt_sed_strip_eq="s,=\([A-Za-z]:\),\1,g" ;; + *) lt_sed_strip_eq="s,=/,/,g" ;; + esac + lt_search_path_spec=`$CC -print-search-dirs | awk $lt_awk_arg | $SED -e "s/^libraries://" -e $lt_sed_strip_eq` + case $lt_search_path_spec in + *\;*) + # if the path contains ";" then we assume it to be the separator + # otherwise default to the standard path separator (i.e. ":") - it is + # assumed that no part of a normal pathname contains ";" but that should + # okay in the real world where ";" in dirpaths is itself problematic. + lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED 's/;/ /g'` + ;; + *) + lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED "s/$PATH_SEPARATOR/ /g"` + ;; + esac + # Ok, now we have the path, separated by spaces, we can step through it + # and add multilib dir if necessary. + lt_tmp_lt_search_path_spec= + lt_multi_os_dir=`$CC $CPPFLAGS $CFLAGS $LDFLAGS -print-multi-os-directory 2>/dev/null` + for lt_sys_path in $lt_search_path_spec; do + if test -d "$lt_sys_path/$lt_multi_os_dir"; then + lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path/$lt_multi_os_dir" + else + test -d "$lt_sys_path" && \ + lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path" + fi + done + lt_search_path_spec=`$ECHO "$lt_tmp_lt_search_path_spec" | awk ' +BEGIN {RS=" "; FS="/|\n";} { + lt_foo=""; + lt_count=0; + for (lt_i = NF; lt_i > 0; lt_i--) { + if ($lt_i != "" && $lt_i != ".") { + if ($lt_i == "..") { + lt_count++; + } else { + if (lt_count == 0) { + lt_foo="/" $lt_i lt_foo; + } else { + lt_count--; + } + } + } + } + if (lt_foo != "") { lt_freq[lt_foo]++; } + if (lt_freq[lt_foo] == 1) { print lt_foo; } +}'` + # AWK program above erroneously prepends '/' to C:/dos/paths + # for these hosts. + case $host_os in + mingw* | cegcc*) lt_search_path_spec=`$ECHO "$lt_search_path_spec" |\ + $SED 's,/\([A-Za-z]:\),\1,g'` ;; + esac + sys_lib_search_path_spec=`$ECHO "$lt_search_path_spec" | $lt_NL2SP` +else + sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" +fi +library_names_spec= +libname_spec='lib$name' +soname_spec= +shrext_cmds=".so" +postinstall_cmds= +postuninstall_cmds= +finish_cmds= +finish_eval= +shlibpath_var= +shlibpath_overrides_runpath=unknown +version_type=none +dynamic_linker="$host_os ld.so" +sys_lib_dlsearch_path_spec="/lib /usr/lib" +need_lib_prefix=unknown +hardcode_into_libs=no + +# when you set need_version to no, make sure it does not cause -set_version +# flags to be left without arguments +need_version=unknown + +case $host_os in +aix3*) + version_type=linux # correct to gnu/linux during the next big refactor + library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a' + shlibpath_var=LIBPATH + + # AIX 3 has no versioning support, so we append a major version to the name. + soname_spec='${libname}${release}${shared_ext}$major' + ;; + +aix[4-9]*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + hardcode_into_libs=yes + if test "$host_cpu" = ia64; then + # AIX 5 supports IA64 + library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}' + shlibpath_var=LD_LIBRARY_PATH + else + # With GCC up to 2.95.x, collect2 would create an import file + # for dependence libraries. The import file would start with + # the line `#! .'. This would cause the generated library to + # depend on `.', always an invalid library. This was fixed in + # development snapshots of GCC prior to 3.0. + case $host_os in + aix4 | aix4.[01] | aix4.[01].*) + if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)' + echo ' yes ' + echo '#endif'; } | ${CC} -E - | $GREP yes > /dev/null; then + : + else + can_build_shared=no + fi + ;; + esac + # AIX (on Power*) has no versioning support, so currently we can not hardcode correct + # soname into executable. Probably we can add versioning support to + # collect2, so additional links can be useful in future. + if test "$aix_use_runtimelinking" = yes; then + # If using run time linking (on AIX 4.2 or later) use lib.so + # instead of lib.a to let people know that these are not + # typical AIX shared libraries. + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + else + # We preserve .a as extension for shared libraries through AIX4.2 + # and later when we are not doing run time linking. + library_names_spec='${libname}${release}.a $libname.a' + soname_spec='${libname}${release}${shared_ext}$major' + fi + shlibpath_var=LIBPATH + fi + ;; + +amigaos*) + case $host_cpu in + powerpc) + # Since July 2007 AmigaOS4 officially supports .so libraries. + # When compiling the executable, add -use-dynld -Lsobjs: to the compileline. + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + ;; + m68k) + library_names_spec='$libname.ixlibrary $libname.a' + # Create ${libname}_ixlibrary.a entries in /sys/libs. + finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`func_echo_all "$lib" | $SED '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; test $RM /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done' + ;; + esac + ;; + +beos*) + library_names_spec='${libname}${shared_ext}' + dynamic_linker="$host_os ld.so" + shlibpath_var=LIBRARY_PATH + ;; + +bsdi[45]*) + version_type=linux # correct to gnu/linux during the next big refactor + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir' + shlibpath_var=LD_LIBRARY_PATH + sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib" + sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib" + # the default ld.so.conf also contains /usr/contrib/lib and + # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow + # libtool to hard-code these into programs + ;; + +cygwin* | mingw* | pw32* | cegcc*) + version_type=windows + shrext_cmds=".dll" + need_version=no + need_lib_prefix=no + + case $GCC,$cc_basename in + yes,*) + # gcc + library_names_spec='$libname.dll.a' + # DLL is installed to $(libdir)/../bin by postinstall_cmds + postinstall_cmds='base_file=`basename \${file}`~ + dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~ + dldir=$destdir/`dirname \$dlpath`~ + test -d \$dldir || mkdir -p \$dldir~ + $install_prog $dir/$dlname \$dldir/$dlname~ + chmod a+x \$dldir/$dlname~ + if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then + eval '\''$striplib \$dldir/$dlname'\'' || exit \$?; + fi' + postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ + dlpath=$dir/\$dldll~ + $RM \$dlpath' + shlibpath_overrides_runpath=yes + + case $host_os in + cygwin*) + # Cygwin DLLs use 'cyg' prefix rather than 'lib' + soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' + + sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/lib/w32api" + ;; + mingw* | cegcc*) + # MinGW DLLs use traditional 'lib' prefix + soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' + ;; + pw32*) + # pw32 DLLs use 'pw' prefix rather than 'lib' + library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' + ;; + esac + dynamic_linker='Win32 ld.exe' + ;; + + *,cl*) + # Native MSVC + libname_spec='$name' + soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' + library_names_spec='${libname}.dll.lib' + + case $build_os in + mingw*) + sys_lib_search_path_spec= + lt_save_ifs=$IFS + IFS=';' + for lt_path in $LIB + do + IFS=$lt_save_ifs + # Let DOS variable expansion print the short 8.3 style file name. + lt_path=`cd "$lt_path" 2>/dev/null && cmd //C "for %i in (".") do @echo %~si"` + sys_lib_search_path_spec="$sys_lib_search_path_spec $lt_path" + done + IFS=$lt_save_ifs + # Convert to MSYS style. + sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | sed -e 's|\\\\|/|g' -e 's| \\([a-zA-Z]\\):| /\\1|g' -e 's|^ ||'` + ;; + cygwin*) + # Convert to unix form, then to dos form, then back to unix form + # but this time dos style (no spaces!) so that the unix form looks + # like /cygdrive/c/PROGRA~1:/cygdr... + sys_lib_search_path_spec=`cygpath --path --unix "$LIB"` + sys_lib_search_path_spec=`cygpath --path --dos "$sys_lib_search_path_spec" 2>/dev/null` + sys_lib_search_path_spec=`cygpath --path --unix "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` + ;; + *) + sys_lib_search_path_spec="$LIB" + if $ECHO "$sys_lib_search_path_spec" | $GREP ';[c-zC-Z]:/' >/dev/null; then + # It is most probably a Windows format PATH. + sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` + else + sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` + fi + # FIXME: find the short name or the path components, as spaces are + # common. (e.g. "Program Files" -> "PROGRA~1") + ;; + esac + + # DLL is installed to $(libdir)/../bin by postinstall_cmds + postinstall_cmds='base_file=`basename \${file}`~ + dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~ + dldir=$destdir/`dirname \$dlpath`~ + test -d \$dldir || mkdir -p \$dldir~ + $install_prog $dir/$dlname \$dldir/$dlname' + postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ + dlpath=$dir/\$dldll~ + $RM \$dlpath' + shlibpath_overrides_runpath=yes + dynamic_linker='Win32 link.exe' + ;; + + *) + # Assume MSVC wrapper + library_names_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext} $libname.lib' + dynamic_linker='Win32 ld.exe' + ;; + esac + # FIXME: first we should search . and the directory the executable is in + shlibpath_var=PATH + ;; + +darwin* | rhapsody*) + dynamic_linker="$host_os dyld" + version_type=darwin + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${major}$shared_ext ${libname}$shared_ext' + soname_spec='${libname}${release}${major}$shared_ext' + shlibpath_overrides_runpath=yes + shlibpath_var=DYLD_LIBRARY_PATH + shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`' + + sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/local/lib" + sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib' + ;; + +dgux*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + ;; + +freebsd* | dragonfly*) + # DragonFly does not have aout. When/if they implement a new + # versioning mechanism, adjust this. + if test -x /usr/bin/objformat; then + objformat=`/usr/bin/objformat` + else + case $host_os in + freebsd[23].*) objformat=aout ;; + *) objformat=elf ;; + esac + fi + version_type=freebsd-$objformat + case $version_type in + freebsd-elf*) + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' + need_version=no + need_lib_prefix=no + ;; + freebsd-*) + library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix' + need_version=yes + ;; + esac + shlibpath_var=LD_LIBRARY_PATH + case $host_os in + freebsd2.*) + shlibpath_overrides_runpath=yes + ;; + freebsd3.[01]* | freebsdelf3.[01]*) + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + freebsd3.[2-9]* | freebsdelf3.[2-9]* | \ + freebsd4.[0-5] | freebsdelf4.[0-5] | freebsd4.1.1 | freebsdelf4.1.1) + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; + *) # from 4.6 on, and DragonFly + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + esac + ;; + +gnu*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; + +haiku*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + dynamic_linker="$host_os runtime_loader" + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LIBRARY_PATH + shlibpath_overrides_runpath=yes + sys_lib_dlsearch_path_spec='/boot/home/config/lib /boot/common/lib /boot/system/lib' + hardcode_into_libs=yes + ;; + +hpux9* | hpux10* | hpux11*) + # Give a soname corresponding to the major version so that dld.sl refuses to + # link against other versions. + version_type=sunos + need_lib_prefix=no + need_version=no + case $host_cpu in + ia64*) + shrext_cmds='.so' + hardcode_into_libs=yes + dynamic_linker="$host_os dld.so" + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + if test "X$HPUX_IA64_MODE" = X32; then + sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib" + else + sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64" + fi + sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec + ;; + hppa*64*) + shrext_cmds='.sl' + hardcode_into_libs=yes + dynamic_linker="$host_os dld.sl" + shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH + shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64" + sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec + ;; + *) + shrext_cmds='.sl' + dynamic_linker="$host_os dld.sl" + shlibpath_var=SHLIB_PATH + shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + ;; + esac + # HP-UX runs *really* slowly unless shared libraries are mode 555, ... + postinstall_cmds='chmod 555 $lib' + # or fails outright, so override atomically: + install_override_mode=555 + ;; + +interix[3-9]*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; + +irix5* | irix6* | nonstopux*) + case $host_os in + nonstopux*) version_type=nonstopux ;; + *) + if test "$lt_cv_prog_gnu_ld" = yes; then + version_type=linux # correct to gnu/linux during the next big refactor + else + version_type=irix + fi ;; + esac + need_lib_prefix=no + need_version=no + soname_spec='${libname}${release}${shared_ext}$major' + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}' + case $host_os in + irix5* | nonstopux*) + libsuff= shlibsuff= + ;; + *) + case $LD in # libtool.m4 will add one of these switches to LD + *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") + libsuff= shlibsuff= libmagic=32-bit;; + *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") + libsuff=32 shlibsuff=N32 libmagic=N32;; + *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") + libsuff=64 shlibsuff=64 libmagic=64-bit;; + *) libsuff= shlibsuff= libmagic=never-match;; + esac + ;; + esac + shlibpath_var=LD_LIBRARY${shlibsuff}_PATH + shlibpath_overrides_runpath=no + sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}" + sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}" + hardcode_into_libs=yes + ;; + +# No shared lib support for Linux oldld, aout, or coff. +linux*oldld* | linux*aout* | linux*coff*) + dynamic_linker=no + ;; + +# This must be glibc/ELF. +linux* | k*bsd*-gnu | kopensolaris*-gnu) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + + # Some binutils ld are patched to set DT_RUNPATH + if ${lt_cv_shlibpath_overrides_runpath+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_shlibpath_overrides_runpath=no + save_LDFLAGS=$LDFLAGS + save_libdir=$libdir + eval "libdir=/foo; wl=\"$lt_prog_compiler_wl\"; \ + LDFLAGS=\"\$LDFLAGS $hardcode_libdir_flag_spec\"" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + if ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir" >/dev/null; then : + lt_cv_shlibpath_overrides_runpath=yes +fi +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + LDFLAGS=$save_LDFLAGS + libdir=$save_libdir + +fi + + shlibpath_overrides_runpath=$lt_cv_shlibpath_overrides_runpath + + # This implies no fast_install, which is unacceptable. + # Some rework will be needed to allow for fast_install + # before this can be enabled. + hardcode_into_libs=yes + + # Append ld.so.conf contents to the search path + if test -f /etc/ld.so.conf; then + lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \$2)); skip = 1; } { if (!skip) print \$0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[ ]*hwcap[ ]/d;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;s/"//g;/^$/d' | tr '\n' ' '` + sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra" + fi + + # We used to test for /lib/ld.so.1 and disable shared libraries on + # powerpc, because MkLinux only supported shared libraries with the + # GNU dynamic linker. Since this was broken with cross compilers, + # most powerpc-linux boxes support dynamic linking these days and + # people can always --disable-shared, the test was removed, and we + # assume the GNU/Linux dynamic linker is in use. + dynamic_linker='GNU/Linux ld.so' + ;; + +netbsdelf*-gnu) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + dynamic_linker='NetBSD ld.elf_so' + ;; + +netbsd*) + version_type=sunos + need_lib_prefix=no + need_version=no + if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' + dynamic_linker='NetBSD (a.out) ld.so' + else + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + dynamic_linker='NetBSD ld.elf_so' + fi + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + +newsos6) + version_type=linux # correct to gnu/linux during the next big refactor + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + ;; + +*nto* | *qnx*) + version_type=qnx + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + dynamic_linker='ldqnx.so' + ;; + +openbsd*) + version_type=sunos + sys_lib_dlsearch_path_spec="/usr/lib" + need_lib_prefix=no + # Some older versions of OpenBSD (3.3 at least) *do* need versioned libs. + case $host_os in + openbsd3.3 | openbsd3.3.*) need_version=yes ;; + *) need_version=no ;; + esac + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' + shlibpath_var=LD_LIBRARY_PATH + if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then + case $host_os in + openbsd2.[89] | openbsd2.[89].*) + shlibpath_overrides_runpath=no + ;; + *) + shlibpath_overrides_runpath=yes + ;; + esac + else + shlibpath_overrides_runpath=yes + fi + ;; + +os2*) + libname_spec='$name' + shrext_cmds=".dll" + need_lib_prefix=no + library_names_spec='$libname${shared_ext} $libname.a' + dynamic_linker='OS/2 ld.exe' + shlibpath_var=LIBPATH + ;; + +osf3* | osf4* | osf5*) + version_type=osf + need_lib_prefix=no + need_version=no + soname_spec='${libname}${release}${shared_ext}$major' + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + shlibpath_var=LD_LIBRARY_PATH + sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib" + sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec" + ;; + +rdos*) + dynamic_linker=no + ;; + +solaris*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + # ldd complains unless libraries are executable + postinstall_cmds='chmod +x $lib' + ;; + +sunos4*) + version_type=sunos + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' + finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + if test "$with_gnu_ld" = yes; then + need_lib_prefix=no + fi + need_version=yes + ;; + +sysv4 | sysv4.3*) + version_type=linux # correct to gnu/linux during the next big refactor + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + case $host_vendor in + sni) + shlibpath_overrides_runpath=no + need_lib_prefix=no + runpath_var=LD_RUN_PATH + ;; + siemens) + need_lib_prefix=no + ;; + motorola) + need_lib_prefix=no + need_version=no + shlibpath_overrides_runpath=no + sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib' + ;; + esac + ;; + +sysv4*MP*) + if test -d /usr/nec ;then + version_type=linux # correct to gnu/linux during the next big refactor + library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}' + soname_spec='$libname${shared_ext}.$major' + shlibpath_var=LD_LIBRARY_PATH + fi + ;; + +sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) + version_type=freebsd-elf + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + if test "$with_gnu_ld" = yes; then + sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib' + else + sys_lib_search_path_spec='/usr/ccs/lib /usr/lib' + case $host_os in + sco3.2v5*) + sys_lib_search_path_spec="$sys_lib_search_path_spec /lib" + ;; + esac + fi + sys_lib_dlsearch_path_spec='/usr/lib' + ;; + +tpf*) + # TPF is a cross-target only. Preferred cross-host = GNU/Linux. + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; + +uts4*) + version_type=linux # correct to gnu/linux during the next big refactor + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + ;; + +*) + dynamic_linker=no + ;; +esac +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $dynamic_linker" >&5 +$as_echo "$dynamic_linker" >&6; } +test "$dynamic_linker" = no && can_build_shared=no + +variables_saved_for_relink="PATH $shlibpath_var $runpath_var" +if test "$GCC" = yes; then + variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" +fi + +if test "${lt_cv_sys_lib_search_path_spec+set}" = set; then + sys_lib_search_path_spec="$lt_cv_sys_lib_search_path_spec" +fi +if test "${lt_cv_sys_lib_dlsearch_path_spec+set}" = set; then + sys_lib_dlsearch_path_spec="$lt_cv_sys_lib_dlsearch_path_spec" +fi + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to hardcode library paths into programs" >&5 +$as_echo_n "checking how to hardcode library paths into programs... " >&6; } +hardcode_action= +if test -n "$hardcode_libdir_flag_spec" || + test -n "$runpath_var" || + test "X$hardcode_automatic" = "Xyes" ; then + + # We can hardcode non-existent directories. + if test "$hardcode_direct" != no && + # If the only mechanism to avoid hardcoding is shlibpath_var, we + # have to relink, otherwise we might link with an installed library + # when we should be linking with a yet-to-be-installed one + ## test "$_LT_TAGVAR(hardcode_shlibpath_var, )" != no && + test "$hardcode_minus_L" != no; then + # Linking always hardcodes the temporary library directory. + hardcode_action=relink + else + # We can link without hardcoding, and we can hardcode nonexisting dirs. + hardcode_action=immediate + fi +else + # We cannot hardcode anything, or else we can only hardcode existing + # directories. + hardcode_action=unsupported +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $hardcode_action" >&5 +$as_echo "$hardcode_action" >&6; } + +if test "$hardcode_action" = relink || + test "$inherit_rpath" = yes; then + # Fast installation is not supported + enable_fast_install=no +elif test "$shlibpath_overrides_runpath" = yes || + test "$enable_shared" = no; then + # Fast installation is not necessary + enable_fast_install=needless +fi + + + + + + + if test "x$enable_dlopen" != xyes; then + enable_dlopen=unknown + enable_dlopen_self=unknown + enable_dlopen_self_static=unknown +else + lt_cv_dlopen=no + lt_cv_dlopen_libs= + + case $host_os in + beos*) + lt_cv_dlopen="load_add_on" + lt_cv_dlopen_libs= + lt_cv_dlopen_self=yes + ;; + + mingw* | pw32* | cegcc*) + lt_cv_dlopen="LoadLibrary" + lt_cv_dlopen_libs= + ;; + + cygwin*) + lt_cv_dlopen="dlopen" + lt_cv_dlopen_libs= + ;; + + darwin*) + # if libdl is installed we need to link against it + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5 +$as_echo_n "checking for dlopen in -ldl... " >&6; } +if ${ac_cv_lib_dl_dlopen+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-ldl $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char dlopen (); +int +main () +{ +return dlopen (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_dl_dlopen=yes +else + ac_cv_lib_dl_dlopen=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5 +$as_echo "$ac_cv_lib_dl_dlopen" >&6; } +if test "x$ac_cv_lib_dl_dlopen" = xyes; then : + lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl" +else + + lt_cv_dlopen="dyld" + lt_cv_dlopen_libs= + lt_cv_dlopen_self=yes + +fi + + ;; + + *) + ac_fn_c_check_func "$LINENO" "shl_load" "ac_cv_func_shl_load" +if test "x$ac_cv_func_shl_load" = xyes; then : + lt_cv_dlopen="shl_load" +else + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for shl_load in -ldld" >&5 +$as_echo_n "checking for shl_load in -ldld... " >&6; } +if ${ac_cv_lib_dld_shl_load+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-ldld $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char shl_load (); +int +main () +{ +return shl_load (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_dld_shl_load=yes +else + ac_cv_lib_dld_shl_load=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dld_shl_load" >&5 +$as_echo "$ac_cv_lib_dld_shl_load" >&6; } +if test "x$ac_cv_lib_dld_shl_load" = xyes; then : + lt_cv_dlopen="shl_load" lt_cv_dlopen_libs="-ldld" +else + ac_fn_c_check_func "$LINENO" "dlopen" "ac_cv_func_dlopen" +if test "x$ac_cv_func_dlopen" = xyes; then : + lt_cv_dlopen="dlopen" +else + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5 +$as_echo_n "checking for dlopen in -ldl... " >&6; } +if ${ac_cv_lib_dl_dlopen+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-ldl $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char dlopen (); +int +main () +{ +return dlopen (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_dl_dlopen=yes +else + ac_cv_lib_dl_dlopen=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5 +$as_echo "$ac_cv_lib_dl_dlopen" >&6; } +if test "x$ac_cv_lib_dl_dlopen" = xyes; then : + lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl" +else + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -lsvld" >&5 +$as_echo_n "checking for dlopen in -lsvld... " >&6; } +if ${ac_cv_lib_svld_dlopen+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lsvld $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char dlopen (); +int +main () +{ +return dlopen (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_svld_dlopen=yes +else + ac_cv_lib_svld_dlopen=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_svld_dlopen" >&5 +$as_echo "$ac_cv_lib_svld_dlopen" >&6; } +if test "x$ac_cv_lib_svld_dlopen" = xyes; then : + lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-lsvld" +else + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dld_link in -ldld" >&5 +$as_echo_n "checking for dld_link in -ldld... " >&6; } +if ${ac_cv_lib_dld_dld_link+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-ldld $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char dld_link (); +int +main () +{ +return dld_link (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_dld_dld_link=yes +else + ac_cv_lib_dld_dld_link=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dld_dld_link" >&5 +$as_echo "$ac_cv_lib_dld_dld_link" >&6; } +if test "x$ac_cv_lib_dld_dld_link" = xyes; then : + lt_cv_dlopen="dld_link" lt_cv_dlopen_libs="-ldld" +fi + + +fi + + +fi + + +fi + + +fi + + +fi + + ;; + esac + + if test "x$lt_cv_dlopen" != xno; then + enable_dlopen=yes + else + enable_dlopen=no + fi + + case $lt_cv_dlopen in + dlopen) + save_CPPFLAGS="$CPPFLAGS" + test "x$ac_cv_header_dlfcn_h" = xyes && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H" + + save_LDFLAGS="$LDFLAGS" + wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\" + + save_LIBS="$LIBS" + LIBS="$lt_cv_dlopen_libs $LIBS" + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether a program can dlopen itself" >&5 +$as_echo_n "checking whether a program can dlopen itself... " >&6; } +if ${lt_cv_dlopen_self+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test "$cross_compiling" = yes; then : + lt_cv_dlopen_self=cross +else + lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 + lt_status=$lt_dlunknown + cat > conftest.$ac_ext <<_LT_EOF +#line $LINENO "configure" +#include "confdefs.h" + +#if HAVE_DLFCN_H +#include +#endif + +#include + +#ifdef RTLD_GLOBAL +# define LT_DLGLOBAL RTLD_GLOBAL +#else +# ifdef DL_GLOBAL +# define LT_DLGLOBAL DL_GLOBAL +# else +# define LT_DLGLOBAL 0 +# endif +#endif + +/* We may have to define LT_DLLAZY_OR_NOW in the command line if we + find out it does not work in some platform. */ +#ifndef LT_DLLAZY_OR_NOW +# ifdef RTLD_LAZY +# define LT_DLLAZY_OR_NOW RTLD_LAZY +# else +# ifdef DL_LAZY +# define LT_DLLAZY_OR_NOW DL_LAZY +# else +# ifdef RTLD_NOW +# define LT_DLLAZY_OR_NOW RTLD_NOW +# else +# ifdef DL_NOW +# define LT_DLLAZY_OR_NOW DL_NOW +# else +# define LT_DLLAZY_OR_NOW 0 +# endif +# endif +# endif +# endif +#endif + +/* When -fvisbility=hidden is used, assume the code has been annotated + correspondingly for the symbols needed. */ +#if defined(__GNUC__) && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3)) +int fnord () __attribute__((visibility("default"))); +#endif + +int fnord () { return 42; } +int main () +{ + void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); + int status = $lt_dlunknown; + + if (self) + { + if (dlsym (self,"fnord")) status = $lt_dlno_uscore; + else + { + if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; + else puts (dlerror ()); + } + /* dlclose (self); */ + } + else + puts (dlerror ()); + + return status; +} +_LT_EOF + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5 + (eval $ac_link) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && test -s conftest${ac_exeext} 2>/dev/null; then + (./conftest; exit; ) >&5 2>/dev/null + lt_status=$? + case x$lt_status in + x$lt_dlno_uscore) lt_cv_dlopen_self=yes ;; + x$lt_dlneed_uscore) lt_cv_dlopen_self=yes ;; + x$lt_dlunknown|x*) lt_cv_dlopen_self=no ;; + esac + else : + # compilation failed + lt_cv_dlopen_self=no + fi +fi +rm -fr conftest* + + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_dlopen_self" >&5 +$as_echo "$lt_cv_dlopen_self" >&6; } + + if test "x$lt_cv_dlopen_self" = xyes; then + wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $lt_prog_compiler_static\" + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether a statically linked program can dlopen itself" >&5 +$as_echo_n "checking whether a statically linked program can dlopen itself... " >&6; } +if ${lt_cv_dlopen_self_static+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test "$cross_compiling" = yes; then : + lt_cv_dlopen_self_static=cross +else + lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 + lt_status=$lt_dlunknown + cat > conftest.$ac_ext <<_LT_EOF +#line $LINENO "configure" +#include "confdefs.h" + +#if HAVE_DLFCN_H +#include +#endif + +#include + +#ifdef RTLD_GLOBAL +# define LT_DLGLOBAL RTLD_GLOBAL +#else +# ifdef DL_GLOBAL +# define LT_DLGLOBAL DL_GLOBAL +# else +# define LT_DLGLOBAL 0 +# endif +#endif + +/* We may have to define LT_DLLAZY_OR_NOW in the command line if we + find out it does not work in some platform. */ +#ifndef LT_DLLAZY_OR_NOW +# ifdef RTLD_LAZY +# define LT_DLLAZY_OR_NOW RTLD_LAZY +# else +# ifdef DL_LAZY +# define LT_DLLAZY_OR_NOW DL_LAZY +# else +# ifdef RTLD_NOW +# define LT_DLLAZY_OR_NOW RTLD_NOW +# else +# ifdef DL_NOW +# define LT_DLLAZY_OR_NOW DL_NOW +# else +# define LT_DLLAZY_OR_NOW 0 +# endif +# endif +# endif +# endif +#endif + +/* When -fvisbility=hidden is used, assume the code has been annotated + correspondingly for the symbols needed. */ +#if defined(__GNUC__) && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3)) +int fnord () __attribute__((visibility("default"))); +#endif + +int fnord () { return 42; } +int main () +{ + void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); + int status = $lt_dlunknown; + + if (self) + { + if (dlsym (self,"fnord")) status = $lt_dlno_uscore; + else + { + if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; + else puts (dlerror ()); + } + /* dlclose (self); */ + } + else + puts (dlerror ()); + + return status; +} +_LT_EOF + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5 + (eval $ac_link) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && test -s conftest${ac_exeext} 2>/dev/null; then + (./conftest; exit; ) >&5 2>/dev/null + lt_status=$? + case x$lt_status in + x$lt_dlno_uscore) lt_cv_dlopen_self_static=yes ;; + x$lt_dlneed_uscore) lt_cv_dlopen_self_static=yes ;; + x$lt_dlunknown|x*) lt_cv_dlopen_self_static=no ;; + esac + else : + # compilation failed + lt_cv_dlopen_self_static=no + fi +fi +rm -fr conftest* + + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_dlopen_self_static" >&5 +$as_echo "$lt_cv_dlopen_self_static" >&6; } + fi + + CPPFLAGS="$save_CPPFLAGS" + LDFLAGS="$save_LDFLAGS" + LIBS="$save_LIBS" + ;; + esac + + case $lt_cv_dlopen_self in + yes|no) enable_dlopen_self=$lt_cv_dlopen_self ;; + *) enable_dlopen_self=unknown ;; + esac + + case $lt_cv_dlopen_self_static in + yes|no) enable_dlopen_self_static=$lt_cv_dlopen_self_static ;; + *) enable_dlopen_self_static=unknown ;; + esac +fi + + + + + + + + + + + + + + + + + +striplib= +old_striplib= +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether stripping libraries is possible" >&5 +$as_echo_n "checking whether stripping libraries is possible... " >&6; } +if test -n "$STRIP" && $STRIP -V 2>&1 | $GREP "GNU strip" >/dev/null; then + test -z "$old_striplib" && old_striplib="$STRIP --strip-debug" + test -z "$striplib" && striplib="$STRIP --strip-unneeded" + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } +else +# FIXME - insert some real tests, host_os isn't really good enough + case $host_os in + darwin*) + if test -n "$STRIP" ; then + striplib="$STRIP -x" + old_striplib="$STRIP -S" + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + fi + ;; + *) + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + ;; + esac +fi + + + + + + + + + + + + + # Report which library types will actually be built + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if libtool supports shared libraries" >&5 +$as_echo_n "checking if libtool supports shared libraries... " >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $can_build_shared" >&5 +$as_echo "$can_build_shared" >&6; } + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build shared libraries" >&5 +$as_echo_n "checking whether to build shared libraries... " >&6; } + test "$can_build_shared" = "no" && enable_shared=no + + # On AIX, shared libraries and static libraries use the same namespace, and + # are all built from PIC. + case $host_os in + aix3*) + test "$enable_shared" = yes && enable_static=no + if test -n "$RANLIB"; then + archive_cmds="$archive_cmds~\$RANLIB \$lib" + postinstall_cmds='$RANLIB $lib' + fi + ;; + + aix[4-9]*) + if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then + test "$enable_shared" = yes && enable_static=no + fi + ;; + esac + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_shared" >&5 +$as_echo "$enable_shared" >&6; } + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build static libraries" >&5 +$as_echo_n "checking whether to build static libraries... " >&6; } + # Make sure either enable_shared or enable_static is yes. + test "$enable_shared" = yes || enable_static=yes + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_static" >&5 +$as_echo "$enable_static" >&6; } + + + + +fi +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + +CC="$lt_save_CC" + + if test -n "$CXX" && ( test "X$CXX" != "Xno" && + ( (test "X$CXX" = "Xg++" && `g++ -v >/dev/null 2>&1` ) || + (test "X$CXX" != "Xg++"))) ; then + ac_ext=cpp +ac_cpp='$CXXCPP $CPPFLAGS' +ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_cxx_compiler_gnu +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C++ preprocessor" >&5 +$as_echo_n "checking how to run the C++ preprocessor... " >&6; } +if test -z "$CXXCPP"; then + if ${ac_cv_prog_CXXCPP+:} false; then : + $as_echo_n "(cached) " >&6 +else + # Double quotes because CXXCPP needs to be expanded + for CXXCPP in "$CXX -E" "/lib/cpp" + do + ac_preproc_ok=false +for ac_cxx_preproc_warn_flag in '' yes +do + # Use a header file that comes with gcc, so configuring glibc + # with a fresh cross-compiler works. + # Prefer to if __STDC__ is defined, since + # exists even on freestanding compilers. + # On the NeXT, cc -E runs the code through the compiler's parser, + # not just through cpp. "Syntax error" is here to catch this case. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +@%:@ifdef __STDC__ +@%:@ include +@%:@else +@%:@ include +@%:@endif + Syntax error +_ACEOF +if ac_fn_cxx_try_cpp "$LINENO"; then : + +else + # Broken: fails on valid input. +continue +fi +rm -f conftest.err conftest.i conftest.$ac_ext + + # OK, works on sane cases. Now check whether nonexistent headers + # can be detected and how. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +@%:@include +_ACEOF +if ac_fn_cxx_try_cpp "$LINENO"; then : + # Broken: success on invalid input. +continue +else + # Passes both tests. +ac_preproc_ok=: +break +fi +rm -f conftest.err conftest.i conftest.$ac_ext + +done +# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. +rm -f conftest.i conftest.err conftest.$ac_ext +if $ac_preproc_ok; then : + break +fi + + done + ac_cv_prog_CXXCPP=$CXXCPP + +fi + CXXCPP=$ac_cv_prog_CXXCPP +else + ac_cv_prog_CXXCPP=$CXXCPP +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $CXXCPP" >&5 +$as_echo "$CXXCPP" >&6; } +ac_preproc_ok=false +for ac_cxx_preproc_warn_flag in '' yes +do + # Use a header file that comes with gcc, so configuring glibc + # with a fresh cross-compiler works. + # Prefer to if __STDC__ is defined, since + # exists even on freestanding compilers. + # On the NeXT, cc -E runs the code through the compiler's parser, + # not just through cpp. "Syntax error" is here to catch this case. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +@%:@ifdef __STDC__ +@%:@ include +@%:@else +@%:@ include +@%:@endif + Syntax error +_ACEOF +if ac_fn_cxx_try_cpp "$LINENO"; then : + +else + # Broken: fails on valid input. +continue +fi +rm -f conftest.err conftest.i conftest.$ac_ext + + # OK, works on sane cases. Now check whether nonexistent headers + # can be detected and how. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +@%:@include +_ACEOF +if ac_fn_cxx_try_cpp "$LINENO"; then : + # Broken: success on invalid input. +continue +else + # Passes both tests. +ac_preproc_ok=: +break +fi +rm -f conftest.err conftest.i conftest.$ac_ext + +done +# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. +rm -f conftest.i conftest.err conftest.$ac_ext +if $ac_preproc_ok; then : + +else + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "C++ preprocessor \"$CXXCPP\" fails sanity check +See \`config.log' for more details" "$LINENO" 5; } +fi + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + +else + _lt_caught_CXX_error=yes +fi + +ac_ext=cpp +ac_cpp='$CXXCPP $CPPFLAGS' +ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_cxx_compiler_gnu + +archive_cmds_need_lc_CXX=no +allow_undefined_flag_CXX= +always_export_symbols_CXX=no +archive_expsym_cmds_CXX= +compiler_needs_object_CXX=no +export_dynamic_flag_spec_CXX= +hardcode_direct_CXX=no +hardcode_direct_absolute_CXX=no +hardcode_libdir_flag_spec_CXX= +hardcode_libdir_separator_CXX= +hardcode_minus_L_CXX=no +hardcode_shlibpath_var_CXX=unsupported +hardcode_automatic_CXX=no +inherit_rpath_CXX=no +module_cmds_CXX= +module_expsym_cmds_CXX= +link_all_deplibs_CXX=unknown +old_archive_cmds_CXX=$old_archive_cmds +reload_flag_CXX=$reload_flag +reload_cmds_CXX=$reload_cmds +no_undefined_flag_CXX= +whole_archive_flag_spec_CXX= +enable_shared_with_static_runtimes_CXX=no + +# Source file extension for C++ test sources. +ac_ext=cpp + +# Object file extension for compiled C++ test sources. +objext=o +objext_CXX=$objext + +# No sense in running all these tests if we already determined that +# the CXX compiler isn't working. Some variables (like enable_shared) +# are currently assumed to apply to all compilers on this platform, +# and will be corrupted by setting them based on a non-working compiler. +if test "$_lt_caught_CXX_error" != yes; then + # Code to be used in simple compile tests + lt_simple_compile_test_code="int some_variable = 0;" + + # Code to be used in simple link tests + lt_simple_link_test_code='int main(int, char *[]) { return(0); }' + + # ltmain only uses $CC for tagged configurations so make sure $CC is set. + + + + + + +# If no C compiler was specified, use CC. +LTCC=${LTCC-"$CC"} + +# If no C compiler flags were specified, use CFLAGS. +LTCFLAGS=${LTCFLAGS-"$CFLAGS"} + +# Allow CC to be a program name with arguments. +compiler=$CC + + + # save warnings/boilerplate of simple test code + ac_outfile=conftest.$ac_objext +echo "$lt_simple_compile_test_code" >conftest.$ac_ext +eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err +_lt_compiler_boilerplate=`cat conftest.err` +$RM conftest* + + ac_outfile=conftest.$ac_objext +echo "$lt_simple_link_test_code" >conftest.$ac_ext +eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err +_lt_linker_boilerplate=`cat conftest.err` +$RM -r conftest* + + + # Allow CC to be a program name with arguments. + lt_save_CC=$CC + lt_save_CFLAGS=$CFLAGS + lt_save_LD=$LD + lt_save_GCC=$GCC + GCC=$GXX + lt_save_with_gnu_ld=$with_gnu_ld + lt_save_path_LD=$lt_cv_path_LD + if test -n "${lt_cv_prog_gnu_ldcxx+set}"; then + lt_cv_prog_gnu_ld=$lt_cv_prog_gnu_ldcxx + else + $as_unset lt_cv_prog_gnu_ld + fi + if test -n "${lt_cv_path_LDCXX+set}"; then + lt_cv_path_LD=$lt_cv_path_LDCXX + else + $as_unset lt_cv_path_LD + fi + test -z "${LDCXX+set}" || LD=$LDCXX + CC=${CXX-"c++"} + CFLAGS=$CXXFLAGS + compiler=$CC + compiler_CXX=$CC + for cc_temp in $compiler""; do + case $cc_temp in + compile | *[\\/]compile | ccache | *[\\/]ccache ) ;; + distcc | *[\\/]distcc | purify | *[\\/]purify ) ;; + \-*) ;; + *) break;; + esac +done +cc_basename=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"` + + + if test -n "$compiler"; then + # We don't want -fno-exception when compiling C++ code, so set the + # no_builtin_flag separately + if test "$GXX" = yes; then + lt_prog_compiler_no_builtin_flag_CXX=' -fno-builtin' + else + lt_prog_compiler_no_builtin_flag_CXX= + fi + + if test "$GXX" = yes; then + # Set up default GNU C++ configuration + + + +@%:@ Check whether --with-gnu-ld was given. +if test "${with_gnu_ld+set}" = set; then : + withval=$with_gnu_ld; test "$withval" = no || with_gnu_ld=yes +else + with_gnu_ld=no +fi + +ac_prog=ld +if test "$GCC" = yes; then + # Check if gcc -print-prog-name=ld gives a path. + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ld used by $CC" >&5 +$as_echo_n "checking for ld used by $CC... " >&6; } + case $host in + *-*-mingw*) + # gcc leaves a trailing carriage return which upsets mingw + ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;; + *) + ac_prog=`($CC -print-prog-name=ld) 2>&5` ;; + esac + case $ac_prog in + # Accept absolute paths. + [\\/]* | ?:[\\/]*) + re_direlt='/[^/][^/]*/\.\./' + # Canonicalize the pathname of ld + ac_prog=`$ECHO "$ac_prog"| $SED 's%\\\\%/%g'` + while $ECHO "$ac_prog" | $GREP "$re_direlt" > /dev/null 2>&1; do + ac_prog=`$ECHO $ac_prog| $SED "s%$re_direlt%/%"` + done + test -z "$LD" && LD="$ac_prog" + ;; + "") + # If it fails, then pretend we aren't using GCC. + ac_prog=ld + ;; + *) + # If it is relative, then search for the first ld in PATH. + with_gnu_ld=unknown + ;; + esac +elif test "$with_gnu_ld" = yes; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU ld" >&5 +$as_echo_n "checking for GNU ld... " >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for non-GNU ld" >&5 +$as_echo_n "checking for non-GNU ld... " >&6; } +fi +if ${lt_cv_path_LD+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -z "$LD"; then + lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR + for ac_dir in $PATH; do + IFS="$lt_save_ifs" + test -z "$ac_dir" && ac_dir=. + if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then + lt_cv_path_LD="$ac_dir/$ac_prog" + # Check to see if the program is GNU ld. I'd rather use --version, + # but apparently some variants of GNU ld only accept -v. + # Break only if it was the GNU/non-GNU ld that we prefer. + case `"$lt_cv_path_LD" -v 2>&1 &5 +$as_echo "$LD" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi +test -z "$LD" && as_fn_error $? "no acceptable ld found in \$PATH" "$LINENO" 5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if the linker ($LD) is GNU ld" >&5 +$as_echo_n "checking if the linker ($LD) is GNU ld... " >&6; } +if ${lt_cv_prog_gnu_ld+:} false; then : + $as_echo_n "(cached) " >&6 +else + # I'd rather use --version here, but apparently some GNU lds only accept -v. +case `$LD -v 2>&1 &5 +$as_echo "$lt_cv_prog_gnu_ld" >&6; } +with_gnu_ld=$lt_cv_prog_gnu_ld + + + + + + + + # Check if GNU C++ uses GNU ld as the underlying linker, since the + # archiving commands below assume that GNU ld is being used. + if test "$with_gnu_ld" = yes; then + archive_cmds_CXX='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' + archive_expsym_cmds_CXX='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + + hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir' + export_dynamic_flag_spec_CXX='${wl}--export-dynamic' + + # If archive_cmds runs LD, not CC, wlarc should be empty + # XXX I think wlarc can be eliminated in ltcf-cxx, but I need to + # investigate it a little bit more. (MM) + wlarc='${wl}' + + # ancient GNU ld didn't support --whole-archive et. al. + if eval "`$CC -print-prog-name=ld` --help 2>&1" | + $GREP 'no-whole-archive' > /dev/null; then + whole_archive_flag_spec_CXX="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' + else + whole_archive_flag_spec_CXX= + fi + else + with_gnu_ld=no + wlarc= + + # A generic and very simple default shared library creation + # command for GNU C++ for the case where it uses the native + # linker, instead of GNU ld. If possible, this setting should + # overridden to take advantage of the native linker features on + # the platform it is being used on. + archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib' + fi + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' + + else + GXX=no + with_gnu_ld=no + wlarc= + fi + + # PORTME: fill in a description of your system's C++ link characteristics + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $compiler linker ($LD) supports shared libraries" >&5 +$as_echo_n "checking whether the $compiler linker ($LD) supports shared libraries... " >&6; } + ld_shlibs_CXX=yes + case $host_os in + aix3*) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + aix[4-9]*) + if test "$host_cpu" = ia64; then + # On IA64, the linker does run time linking by default, so we don't + # have to do anything special. + aix_use_runtimelinking=no + exp_sym_flag='-Bexport' + no_entry_flag="" + else + aix_use_runtimelinking=no + + # Test if we are trying to use run time linking or normal + # AIX style linking. If -brtl is somewhere in LDFLAGS, we + # need to do runtime linking. + case $host_os in aix4.[23]|aix4.[23].*|aix[5-9]*) + for ld_flag in $LDFLAGS; do + case $ld_flag in + *-brtl*) + aix_use_runtimelinking=yes + break + ;; + esac + done + ;; + esac + + exp_sym_flag='-bexport' + no_entry_flag='-bnoentry' + fi + + # When large executables or shared objects are built, AIX ld can + # have problems creating the table of contents. If linking a library + # or program results in "error TOC overflow" add -mminimal-toc to + # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not + # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. + + archive_cmds_CXX='' + hardcode_direct_CXX=yes + hardcode_direct_absolute_CXX=yes + hardcode_libdir_separator_CXX=':' + link_all_deplibs_CXX=yes + file_list_spec_CXX='${wl}-f,' + + if test "$GXX" = yes; then + case $host_os in aix4.[012]|aix4.[012].*) + # We only want to do this on AIX 4.2 and lower, the check + # below for broken collect2 doesn't work under 4.3+ + collect2name=`${CC} -print-prog-name=collect2` + if test -f "$collect2name" && + strings "$collect2name" | $GREP resolve_lib_name >/dev/null + then + # We have reworked collect2 + : + else + # We have old collect2 + hardcode_direct_CXX=unsupported + # It fails to find uninstalled libraries when the uninstalled + # path is not listed in the libpath. Setting hardcode_minus_L + # to unsupported forces relinking + hardcode_minus_L_CXX=yes + hardcode_libdir_flag_spec_CXX='-L$libdir' + hardcode_libdir_separator_CXX= + fi + esac + shared_flag='-shared' + if test "$aix_use_runtimelinking" = yes; then + shared_flag="$shared_flag "'${wl}-G' + fi + else + # not using gcc + if test "$host_cpu" = ia64; then + # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release + # chokes on -Wl,-G. The following line is correct: + shared_flag='-G' + else + if test "$aix_use_runtimelinking" = yes; then + shared_flag='${wl}-G' + else + shared_flag='${wl}-bM:SRE' + fi + fi + fi + + export_dynamic_flag_spec_CXX='${wl}-bexpall' + # It seems that -bexpall does not export symbols beginning with + # underscore (_), so it is better to generate a list of symbols to + # export. + always_export_symbols_CXX=yes + if test "$aix_use_runtimelinking" = yes; then + # Warning - without using the other runtime loading flags (-brtl), + # -berok will link without error, but may produce a broken library. + allow_undefined_flag_CXX='-berok' + # Determine the default libpath from the value encoded in an empty + # executable. + if test "${lt_cv_aix_libpath+set}" = set; then + aix_libpath=$lt_cv_aix_libpath +else + if ${lt_cv_aix_libpath__CXX+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_cxx_try_link "$LINENO"; then : + + lt_aix_libpath_sed=' + /Import File Strings/,/^$/ { + /^0/ { + s/^0 *\([^ ]*\) *$/\1/ + p + } + }' + lt_cv_aix_libpath__CXX=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` + # Check for a 64-bit object if we didn't find anything. + if test -z "$lt_cv_aix_libpath__CXX"; then + lt_cv_aix_libpath__CXX=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` + fi +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + if test -z "$lt_cv_aix_libpath__CXX"; then + lt_cv_aix_libpath__CXX="/usr/lib:/lib" + fi + +fi + + aix_libpath=$lt_cv_aix_libpath__CXX +fi + + hardcode_libdir_flag_spec_CXX='${wl}-blibpath:$libdir:'"$aix_libpath" + + archive_expsym_cmds_CXX='$CC -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then func_echo_all "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag" + else + if test "$host_cpu" = ia64; then + hardcode_libdir_flag_spec_CXX='${wl}-R $libdir:/usr/lib:/lib' + allow_undefined_flag_CXX="-z nodefs" + archive_expsym_cmds_CXX="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols" + else + # Determine the default libpath from the value encoded in an + # empty executable. + if test "${lt_cv_aix_libpath+set}" = set; then + aix_libpath=$lt_cv_aix_libpath +else + if ${lt_cv_aix_libpath__CXX+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_cxx_try_link "$LINENO"; then : + + lt_aix_libpath_sed=' + /Import File Strings/,/^$/ { + /^0/ { + s/^0 *\([^ ]*\) *$/\1/ + p + } + }' + lt_cv_aix_libpath__CXX=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` + # Check for a 64-bit object if we didn't find anything. + if test -z "$lt_cv_aix_libpath__CXX"; then + lt_cv_aix_libpath__CXX=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` + fi +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + if test -z "$lt_cv_aix_libpath__CXX"; then + lt_cv_aix_libpath__CXX="/usr/lib:/lib" + fi + +fi + + aix_libpath=$lt_cv_aix_libpath__CXX +fi + + hardcode_libdir_flag_spec_CXX='${wl}-blibpath:$libdir:'"$aix_libpath" + # Warning - without using the other run time loading flags, + # -berok will link without error, but may produce a broken library. + no_undefined_flag_CXX=' ${wl}-bernotok' + allow_undefined_flag_CXX=' ${wl}-berok' + if test "$with_gnu_ld" = yes; then + # We only use this code for GNU lds that support --whole-archive. + whole_archive_flag_spec_CXX='${wl}--whole-archive$convenience ${wl}--no-whole-archive' + else + # Exported symbols can be pulled into shared objects from archives + whole_archive_flag_spec_CXX='$convenience' + fi + archive_cmds_need_lc_CXX=yes + # This is similar to how AIX traditionally builds its shared + # libraries. + archive_expsym_cmds_CXX="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' + fi + fi + ;; + + beos*) + if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then + allow_undefined_flag_CXX=unsupported + # Joseph Beckenbach says some releases of gcc + # support --undefined. This deserves some investigation. FIXME + archive_cmds_CXX='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + else + ld_shlibs_CXX=no + fi + ;; + + chorus*) + case $cc_basename in + *) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + esac + ;; + + cygwin* | mingw* | pw32* | cegcc*) + case $GXX,$cc_basename in + ,cl* | no,cl*) + # Native MSVC + # hardcode_libdir_flag_spec is actually meaningless, as there is + # no search path for DLLs. + hardcode_libdir_flag_spec_CXX=' ' + allow_undefined_flag_CXX=unsupported + always_export_symbols_CXX=yes + file_list_spec_CXX='@' + # Tell ltmain to make .lib files, not .a files. + libext=lib + # Tell ltmain to make .dll files, not .so files. + shrext_cmds=".dll" + # FIXME: Setting linknames here is a bad hack. + archive_cmds_CXX='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-dll~linknames=' + archive_expsym_cmds_CXX='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then + $SED -n -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' -e '1\\\!p' < $export_symbols > $output_objdir/$soname.exp; + else + $SED -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' < $export_symbols > $output_objdir/$soname.exp; + fi~ + $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~ + linknames=' + # The linker will not automatically build a static lib if we build a DLL. + # _LT_TAGVAR(old_archive_from_new_cmds, CXX)='true' + enable_shared_with_static_runtimes_CXX=yes + # Don't use ranlib + old_postinstall_cmds_CXX='chmod 644 $oldlib' + postlink_cmds_CXX='lt_outputfile="@OUTPUT@"~ + lt_tool_outputfile="@TOOL_OUTPUT@"~ + case $lt_outputfile in + *.exe|*.EXE) ;; + *) + lt_outputfile="$lt_outputfile.exe" + lt_tool_outputfile="$lt_tool_outputfile.exe" + ;; + esac~ + func_to_tool_file "$lt_outputfile"~ + if test "$MANIFEST_TOOL" != ":" && test -f "$lt_outputfile.manifest"; then + $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1; + $RM "$lt_outputfile.manifest"; + fi' + ;; + *) + # g++ + # _LT_TAGVAR(hardcode_libdir_flag_spec, CXX) is actually meaningless, + # as there is no search path for DLLs. + hardcode_libdir_flag_spec_CXX='-L$libdir' + export_dynamic_flag_spec_CXX='${wl}--export-all-symbols' + allow_undefined_flag_CXX=unsupported + always_export_symbols_CXX=no + enable_shared_with_static_runtimes_CXX=yes + + if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then + archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' + # If the export-symbols file already is a .def file (1st line + # is EXPORTS), use it as is; otherwise, prepend... + archive_expsym_cmds_CXX='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then + cp $export_symbols $output_objdir/$soname.def; + else + echo EXPORTS > $output_objdir/$soname.def; + cat $export_symbols >> $output_objdir/$soname.def; + fi~ + $CC -shared -nostdlib $output_objdir/$soname.def $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' + else + ld_shlibs_CXX=no + fi + ;; + esac + ;; + darwin* | rhapsody*) + + + archive_cmds_need_lc_CXX=no + hardcode_direct_CXX=no + hardcode_automatic_CXX=yes + hardcode_shlibpath_var_CXX=unsupported + if test "$lt_cv_ld_force_load" = "yes"; then + whole_archive_flag_spec_CXX='`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience ${wl}-force_load,$conv\"; done; func_echo_all \"$new_convenience\"`' + + else + whole_archive_flag_spec_CXX='' + fi + link_all_deplibs_CXX=yes + allow_undefined_flag_CXX="$_lt_dar_allow_undefined" + case $cc_basename in + ifort*) _lt_dar_can_shared=yes ;; + *) _lt_dar_can_shared=$GCC ;; + esac + if test "$_lt_dar_can_shared" = "yes"; then + output_verbose_link_cmd=func_echo_all + archive_cmds_CXX="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod${_lt_dsymutil}" + module_cmds_CXX="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dsymutil}" + archive_expsym_cmds_CXX="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring ${_lt_dar_single_mod}${_lt_dar_export_syms}${_lt_dsymutil}" + module_expsym_cmds_CXX="sed -e 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dar_export_syms}${_lt_dsymutil}" + if test "$lt_cv_apple_cc_single_mod" != "yes"; then + archive_cmds_CXX="\$CC -r -keep_private_externs -nostdlib -o \${lib}-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \${lib}-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring${_lt_dsymutil}" + archive_expsym_cmds_CXX="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -r -keep_private_externs -nostdlib -o \${lib}-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \${lib}-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring${_lt_dar_export_syms}${_lt_dsymutil}" + fi + + else + ld_shlibs_CXX=no + fi + + ;; + + dgux*) + case $cc_basename in + ec++*) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + ghcx*) + # Green Hills C++ Compiler + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + *) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + esac + ;; + + freebsd2.*) + # C++ shared libraries reported to be fairly broken before + # switch to ELF + ld_shlibs_CXX=no + ;; + + freebsd-elf*) + archive_cmds_need_lc_CXX=no + ;; + + freebsd* | dragonfly*) + # FreeBSD 3 and later use GNU C++ and GNU ld with standard ELF + # conventions + ld_shlibs_CXX=yes + ;; + + gnu*) + ;; + + haiku*) + archive_cmds_CXX='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + link_all_deplibs_CXX=yes + ;; + + hpux9*) + hardcode_libdir_flag_spec_CXX='${wl}+b ${wl}$libdir' + hardcode_libdir_separator_CXX=: + export_dynamic_flag_spec_CXX='${wl}-E' + hardcode_direct_CXX=yes + hardcode_minus_L_CXX=yes # Not in the search PATH, + # but as the default + # location of the library. + + case $cc_basename in + CC*) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + aCC*) + archive_cmds_CXX='$RM $output_objdir/$soname~$CC -b ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $EGREP "\-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' + ;; + *) + if test "$GXX" = yes; then + archive_cmds_CXX='$RM $output_objdir/$soname~$CC -shared -nostdlib $pic_flag ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' + else + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + fi + ;; + esac + ;; + + hpux10*|hpux11*) + if test $with_gnu_ld = no; then + hardcode_libdir_flag_spec_CXX='${wl}+b ${wl}$libdir' + hardcode_libdir_separator_CXX=: + + case $host_cpu in + hppa*64*|ia64*) + ;; + *) + export_dynamic_flag_spec_CXX='${wl}-E' + ;; + esac + fi + case $host_cpu in + hppa*64*|ia64*) + hardcode_direct_CXX=no + hardcode_shlibpath_var_CXX=no + ;; + *) + hardcode_direct_CXX=yes + hardcode_direct_absolute_CXX=yes + hardcode_minus_L_CXX=yes # Not in the search PATH, + # but as the default + # location of the library. + ;; + esac + + case $cc_basename in + CC*) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + aCC*) + case $host_cpu in + hppa*64*) + archive_cmds_CXX='$CC -b ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + ia64*) + archive_cmds_CXX='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + *) + archive_cmds_CXX='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + esac + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $GREP "\-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' + ;; + *) + if test "$GXX" = yes; then + if test $with_gnu_ld = no; then + case $host_cpu in + hppa*64*) + archive_cmds_CXX='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + ia64*) + archive_cmds_CXX='$CC -shared -nostdlib $pic_flag ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + *) + archive_cmds_CXX='$CC -shared -nostdlib $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + esac + fi + else + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + fi + ;; + esac + ;; + + interix[3-9]*) + hardcode_direct_CXX=no + hardcode_shlibpath_var_CXX=no + hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir' + export_dynamic_flag_spec_CXX='${wl}-E' + # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. + # Instead, shared libraries are loaded at an image base (0x10000000 by + # default) and relocated if they conflict, which is a slow very memory + # consuming and fragmenting process. To avoid this, we pick a random, + # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link + # time. Moving up from 0x10000000 also allows more sbrk(2) space. + archive_cmds_CXX='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' + archive_expsym_cmds_CXX='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' + ;; + irix5* | irix6*) + case $cc_basename in + CC*) + # SGI C++ + archive_cmds_CXX='$CC -shared -all -multigot $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' + + # Archives containing C++ object files must be created using + # "CC -ar", where "CC" is the IRIX C++ compiler. This is + # necessary to make sure instantiated templates are included + # in the archive. + old_archive_cmds_CXX='$CC -ar -WR,-u -o $oldlib $oldobjs' + ;; + *) + if test "$GXX" = yes; then + if test "$with_gnu_ld" = no; then + archive_cmds_CXX='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + else + archive_cmds_CXX='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` -o $lib' + fi + fi + link_all_deplibs_CXX=yes + ;; + esac + hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir' + hardcode_libdir_separator_CXX=: + inherit_rpath_CXX=yes + ;; + + linux* | k*bsd*-gnu | kopensolaris*-gnu) + case $cc_basename in + KCC*) + # Kuck and Associates, Inc. (KAI) C++ Compiler + + # KCC will only create a shared library if the output file + # ends with ".so" (or ".sl" for HP-UX), so rename the library + # to its proper name (with version) after linking. + archive_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' + archive_expsym_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib ${wl}-retain-symbols-file,$export_symbols; mv \$templib $lib' + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`$CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 | $GREP "ld"`; rm -f libconftest$shared_ext; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' + + hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir' + export_dynamic_flag_spec_CXX='${wl}--export-dynamic' + + # Archives containing C++ object files must be created using + # "CC -Bstatic", where "CC" is the KAI C++ compiler. + old_archive_cmds_CXX='$CC -Bstatic -o $oldlib $oldobjs' + ;; + icpc* | ecpc* ) + # Intel C++ + with_gnu_ld=yes + # version 8.0 and above of icpc choke on multiply defined symbols + # if we add $predep_objects and $postdep_objects, however 7.1 and + # earlier do not add the objects themselves. + case `$CC -V 2>&1` in + *"Version 7."*) + archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' + archive_expsym_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + ;; + *) # Version 8.0 or newer + tmp_idyn= + case $host_cpu in + ia64*) tmp_idyn=' -i_dynamic';; + esac + archive_cmds_CXX='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + archive_expsym_cmds_CXX='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + ;; + esac + archive_cmds_need_lc_CXX=no + hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir' + export_dynamic_flag_spec_CXX='${wl}--export-dynamic' + whole_archive_flag_spec_CXX='${wl}--whole-archive$convenience ${wl}--no-whole-archive' + ;; + pgCC* | pgcpp*) + # Portland Group C++ compiler + case `$CC -V` in + *pgCC\ [1-5].* | *pgcpp\ [1-5].*) + prelink_cmds_CXX='tpldir=Template.dir~ + rm -rf $tpldir~ + $CC --prelink_objects --instantiation_dir $tpldir $objs $libobjs $compile_deplibs~ + compile_command="$compile_command `find $tpldir -name \*.o | sort | $NL2SP`"' + old_archive_cmds_CXX='tpldir=Template.dir~ + rm -rf $tpldir~ + $CC --prelink_objects --instantiation_dir $tpldir $oldobjs$old_deplibs~ + $AR $AR_FLAGS $oldlib$oldobjs$old_deplibs `find $tpldir -name \*.o | sort | $NL2SP`~ + $RANLIB $oldlib' + archive_cmds_CXX='tpldir=Template.dir~ + rm -rf $tpldir~ + $CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~ + $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname -o $lib' + archive_expsym_cmds_CXX='tpldir=Template.dir~ + rm -rf $tpldir~ + $CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~ + $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname ${wl}-retain-symbols-file ${wl}$export_symbols -o $lib' + ;; + *) # Version 6 and above use weak symbols + archive_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname -o $lib' + archive_expsym_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname ${wl}-retain-symbols-file ${wl}$export_symbols -o $lib' + ;; + esac + + hardcode_libdir_flag_spec_CXX='${wl}--rpath ${wl}$libdir' + export_dynamic_flag_spec_CXX='${wl}--export-dynamic' + whole_archive_flag_spec_CXX='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' + ;; + cxx*) + # Compaq C++ + archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' + archive_expsym_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib ${wl}-retain-symbols-file $wl$export_symbols' + + runpath_var=LD_RUN_PATH + hardcode_libdir_flag_spec_CXX='-rpath $libdir' + hardcode_libdir_separator_CXX=: + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld"`; templist=`func_echo_all "$templist" | $SED "s/\(^.*ld.*\)\( .*ld .*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "X$list" | $Xsed' + ;; + xl* | mpixl* | bgxl*) + # IBM XL 8.0 on PPC, with GNU ld + hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir' + export_dynamic_flag_spec_CXX='${wl}--export-dynamic' + archive_cmds_CXX='$CC -qmkshrobj $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + if test "x$supports_anon_versioning" = xyes; then + archive_expsym_cmds_CXX='echo "{ global:" > $output_objdir/$libname.ver~ + cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ + echo "local: *; };" >> $output_objdir/$libname.ver~ + $CC -qmkshrobj $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib' + fi + ;; + *) + case `$CC -V 2>&1 | sed 5q` in + *Sun\ C*) + # Sun C++ 5.9 + no_undefined_flag_CXX=' -zdefs' + archive_cmds_CXX='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + archive_expsym_cmds_CXX='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file ${wl}$export_symbols' + hardcode_libdir_flag_spec_CXX='-R$libdir' + whole_archive_flag_spec_CXX='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' + compiler_needs_object_CXX=yes + + # Not sure whether something based on + # $CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 + # would be better. + output_verbose_link_cmd='func_echo_all' + + # Archives containing C++ object files must be created using + # "CC -xar", where "CC" is the Sun C++ compiler. This is + # necessary to make sure instantiated templates are included + # in the archive. + old_archive_cmds_CXX='$CC -xar -o $oldlib $oldobjs' + ;; + esac + ;; + esac + ;; + + lynxos*) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + + m88k*) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + + mvs*) + case $cc_basename in + cxx*) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + *) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + esac + ;; + + netbsd*) + if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then + archive_cmds_CXX='$LD -Bshareable -o $lib $predep_objects $libobjs $deplibs $postdep_objects $linker_flags' + wlarc= + hardcode_libdir_flag_spec_CXX='-R$libdir' + hardcode_direct_CXX=yes + hardcode_shlibpath_var_CXX=no + fi + # Workaround some broken pre-1.5 toolchains + output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP conftest.$objext | $SED -e "s:-lgcc -lc -lgcc::"' + ;; + + *nto* | *qnx*) + ld_shlibs_CXX=yes + ;; + + openbsd2*) + # C++ shared libraries are fairly broken + ld_shlibs_CXX=no + ;; + + openbsd*) + if test -f /usr/libexec/ld.so; then + hardcode_direct_CXX=yes + hardcode_shlibpath_var_CXX=no + hardcode_direct_absolute_CXX=yes + archive_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib' + hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir' + if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then + archive_expsym_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file,$export_symbols -o $lib' + export_dynamic_flag_spec_CXX='${wl}-E' + whole_archive_flag_spec_CXX="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' + fi + output_verbose_link_cmd=func_echo_all + else + ld_shlibs_CXX=no + fi + ;; + + osf3* | osf4* | osf5*) + case $cc_basename in + KCC*) + # Kuck and Associates, Inc. (KAI) C++ Compiler + + # KCC will only create a shared library if the output file + # ends with ".so" (or ".sl" for HP-UX), so rename the library + # to its proper name (with version) after linking. + archive_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo "$lib" | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' + + hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir' + hardcode_libdir_separator_CXX=: + + # Archives containing C++ object files must be created using + # the KAI C++ compiler. + case $host in + osf3*) old_archive_cmds_CXX='$CC -Bstatic -o $oldlib $oldobjs' ;; + *) old_archive_cmds_CXX='$CC -o $oldlib $oldobjs' ;; + esac + ;; + RCC*) + # Rational C++ 2.4.1 + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + cxx*) + case $host in + osf3*) + allow_undefined_flag_CXX=' ${wl}-expect_unresolved ${wl}\*' + archive_cmds_CXX='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $soname `test -n "$verstring" && func_echo_all "${wl}-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' + hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir' + ;; + *) + allow_undefined_flag_CXX=' -expect_unresolved \*' + archive_cmds_CXX='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' + archive_expsym_cmds_CXX='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done~ + echo "-hidden">> $lib.exp~ + $CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname ${wl}-input ${wl}$lib.exp `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib~ + $RM $lib.exp' + hardcode_libdir_flag_spec_CXX='-rpath $libdir' + ;; + esac + + hardcode_libdir_separator_CXX=: + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld" | $GREP -v "ld:"`; templist=`func_echo_all "$templist" | $SED "s/\(^.*ld.*\)\( .*ld.*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' + ;; + *) + if test "$GXX" = yes && test "$with_gnu_ld" = no; then + allow_undefined_flag_CXX=' ${wl}-expect_unresolved ${wl}\*' + case $host in + osf3*) + archive_cmds_CXX='$CC -shared -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + ;; + *) + archive_cmds_CXX='$CC -shared $pic_flag -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + ;; + esac + + hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir' + hardcode_libdir_separator_CXX=: + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' + + else + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + fi + ;; + esac + ;; + + psos*) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + + sunos4*) + case $cc_basename in + CC*) + # Sun C++ 4.x + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + lcc*) + # Lucid + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + *) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + esac + ;; + + solaris*) + case $cc_basename in + CC* | sunCC*) + # Sun C++ 4.2, 5.x and Centerline C++ + archive_cmds_need_lc_CXX=yes + no_undefined_flag_CXX=' -zdefs' + archive_cmds_CXX='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + archive_expsym_cmds_CXX='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ + $CC -G${allow_undefined_flag} ${wl}-M ${wl}$lib.exp -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' + + hardcode_libdir_flag_spec_CXX='-R$libdir' + hardcode_shlibpath_var_CXX=no + case $host_os in + solaris2.[0-5] | solaris2.[0-5].*) ;; + *) + # The compiler driver will combine and reorder linker options, + # but understands `-z linker_flag'. + # Supported since Solaris 2.6 (maybe 2.5.1?) + whole_archive_flag_spec_CXX='-z allextract$convenience -z defaultextract' + ;; + esac + link_all_deplibs_CXX=yes + + output_verbose_link_cmd='func_echo_all' + + # Archives containing C++ object files must be created using + # "CC -xar", where "CC" is the Sun C++ compiler. This is + # necessary to make sure instantiated templates are included + # in the archive. + old_archive_cmds_CXX='$CC -xar -o $oldlib $oldobjs' + ;; + gcx*) + # Green Hills C++ Compiler + archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' + + # The C++ compiler must be used to create the archive. + old_archive_cmds_CXX='$CC $LDFLAGS -archive -o $oldlib $oldobjs' + ;; + *) + # GNU C++ compiler with Solaris linker + if test "$GXX" = yes && test "$with_gnu_ld" = no; then + no_undefined_flag_CXX=' ${wl}-z ${wl}defs' + if $CC --version | $GREP -v '^2\.7' > /dev/null; then + archive_cmds_CXX='$CC -shared $pic_flag -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' + archive_expsym_cmds_CXX='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ + $CC -shared $pic_flag -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' + else + # g++ 2.7 appears to require `-G' NOT `-shared' on this + # platform. + archive_cmds_CXX='$CC -G -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' + archive_expsym_cmds_CXX='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ + $CC -G -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + output_verbose_link_cmd='$CC -G $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' + fi + + hardcode_libdir_flag_spec_CXX='${wl}-R $wl$libdir' + case $host_os in + solaris2.[0-5] | solaris2.[0-5].*) ;; + *) + whole_archive_flag_spec_CXX='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract' + ;; + esac + fi + ;; + esac + ;; + + sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7* | sco3.2v5.0.[024]*) + no_undefined_flag_CXX='${wl}-z,text' + archive_cmds_need_lc_CXX=no + hardcode_shlibpath_var_CXX=no + runpath_var='LD_RUN_PATH' + + case $cc_basename in + CC*) + archive_cmds_CXX='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds_CXX='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + *) + archive_cmds_CXX='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds_CXX='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + esac + ;; + + sysv5* | sco3.2v5* | sco5v6*) + # Note: We can NOT use -z defs as we might desire, because we do not + # link with -lc, and that would cause any symbols used from libc to + # always be unresolved, which means just about no library would + # ever link correctly. If we're not using GNU ld we use -z text + # though, which does catch some bad symbols but isn't as heavy-handed + # as -z defs. + no_undefined_flag_CXX='${wl}-z,text' + allow_undefined_flag_CXX='${wl}-z,nodefs' + archive_cmds_need_lc_CXX=no + hardcode_shlibpath_var_CXX=no + hardcode_libdir_flag_spec_CXX='${wl}-R,$libdir' + hardcode_libdir_separator_CXX=':' + link_all_deplibs_CXX=yes + export_dynamic_flag_spec_CXX='${wl}-Bexport' + runpath_var='LD_RUN_PATH' + + case $cc_basename in + CC*) + archive_cmds_CXX='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds_CXX='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + old_archive_cmds_CXX='$CC -Tprelink_objects $oldobjs~ + '"$old_archive_cmds_CXX" + reload_cmds_CXX='$CC -Tprelink_objects $reload_objs~ + '"$reload_cmds_CXX" + ;; + *) + archive_cmds_CXX='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds_CXX='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + esac + ;; + + tandem*) + case $cc_basename in + NCC*) + # NonStop-UX NCC 3.20 + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + *) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + esac + ;; + + vxworks*) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + + *) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + esac + + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ld_shlibs_CXX" >&5 +$as_echo "$ld_shlibs_CXX" >&6; } + test "$ld_shlibs_CXX" = no && can_build_shared=no + + GCC_CXX="$GXX" + LD_CXX="$LD" + + ## CAVEAT EMPTOR: + ## There is no encapsulation within the following macros, do not change + ## the running order or otherwise move them around unless you know exactly + ## what you are doing... + # Dependencies to place before and after the object being linked: +predep_objects_CXX= +postdep_objects_CXX= +predeps_CXX= +postdeps_CXX= +compiler_lib_search_path_CXX= + +cat > conftest.$ac_ext <<_LT_EOF +class Foo +{ +public: + Foo (void) { a = 0; } +private: + int a; +}; +_LT_EOF + + +_lt_libdeps_save_CFLAGS=$CFLAGS +case "$CC $CFLAGS " in #( +*\ -flto*\ *) CFLAGS="$CFLAGS -fno-lto" ;; +*\ -fwhopr*\ *) CFLAGS="$CFLAGS -fno-whopr" ;; +*\ -fuse-linker-plugin*\ *) CFLAGS="$CFLAGS -fno-use-linker-plugin" ;; +esac + +if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + # Parse the compiler output and extract the necessary + # objects, libraries and library flags. + + # Sentinel used to keep track of whether or not we are before + # the conftest object file. + pre_test_object_deps_done=no + + for p in `eval "$output_verbose_link_cmd"`; do + case ${prev}${p} in + + -L* | -R* | -l*) + # Some compilers place space between "-{L,R}" and the path. + # Remove the space. + if test $p = "-L" || + test $p = "-R"; then + prev=$p + continue + fi + + # Expand the sysroot to ease extracting the directories later. + if test -z "$prev"; then + case $p in + -L*) func_stripname_cnf '-L' '' "$p"; prev=-L; p=$func_stripname_result ;; + -R*) func_stripname_cnf '-R' '' "$p"; prev=-R; p=$func_stripname_result ;; + -l*) func_stripname_cnf '-l' '' "$p"; prev=-l; p=$func_stripname_result ;; + esac + fi + case $p in + =*) func_stripname_cnf '=' '' "$p"; p=$lt_sysroot$func_stripname_result ;; + esac + if test "$pre_test_object_deps_done" = no; then + case ${prev} in + -L | -R) + # Internal compiler library paths should come after those + # provided the user. The postdeps already come after the + # user supplied libs so there is no need to process them. + if test -z "$compiler_lib_search_path_CXX"; then + compiler_lib_search_path_CXX="${prev}${p}" + else + compiler_lib_search_path_CXX="${compiler_lib_search_path_CXX} ${prev}${p}" + fi + ;; + # The "-l" case would never come before the object being + # linked, so don't bother handling this case. + esac + else + if test -z "$postdeps_CXX"; then + postdeps_CXX="${prev}${p}" + else + postdeps_CXX="${postdeps_CXX} ${prev}${p}" + fi + fi + prev= + ;; + + *.lto.$objext) ;; # Ignore GCC LTO objects + *.$objext) + # This assumes that the test object file only shows up + # once in the compiler output. + if test "$p" = "conftest.$objext"; then + pre_test_object_deps_done=yes + continue + fi + + if test "$pre_test_object_deps_done" = no; then + if test -z "$predep_objects_CXX"; then + predep_objects_CXX="$p" + else + predep_objects_CXX="$predep_objects_CXX $p" + fi + else + if test -z "$postdep_objects_CXX"; then + postdep_objects_CXX="$p" + else + postdep_objects_CXX="$postdep_objects_CXX $p" + fi + fi + ;; + + *) ;; # Ignore the rest. + + esac + done + + # Clean up. + rm -f a.out a.exe +else + echo "libtool.m4: error: problem compiling CXX test program" +fi + +$RM -f confest.$objext +CFLAGS=$_lt_libdeps_save_CFLAGS + +# PORTME: override above test on systems where it is broken +case $host_os in +interix[3-9]*) + # Interix 3.5 installs completely hosed .la files for C++, so rather than + # hack all around it, let's just trust "g++" to DTRT. + predep_objects_CXX= + postdep_objects_CXX= + postdeps_CXX= + ;; + +linux*) + case `$CC -V 2>&1 | sed 5q` in + *Sun\ C*) + # Sun C++ 5.9 + + # The more standards-conforming stlport4 library is + # incompatible with the Cstd library. Avoid specifying + # it if it's in CXXFLAGS. Ignore libCrun as + # -library=stlport4 depends on it. + case " $CXX $CXXFLAGS " in + *" -library=stlport4 "*) + solaris_use_stlport4=yes + ;; + esac + + if test "$solaris_use_stlport4" != yes; then + postdeps_CXX='-library=Cstd -library=Crun' + fi + ;; + esac + ;; + +solaris*) + case $cc_basename in + CC* | sunCC*) + # The more standards-conforming stlport4 library is + # incompatible with the Cstd library. Avoid specifying + # it if it's in CXXFLAGS. Ignore libCrun as + # -library=stlport4 depends on it. + case " $CXX $CXXFLAGS " in + *" -library=stlport4 "*) + solaris_use_stlport4=yes + ;; + esac + + # Adding this requires a known-good setup of shared libraries for + # Sun compiler versions before 5.6, else PIC objects from an old + # archive will be linked into the output, leading to subtle bugs. + if test "$solaris_use_stlport4" != yes; then + postdeps_CXX='-library=Cstd -library=Crun' + fi + ;; + esac + ;; +esac + + +case " $postdeps_CXX " in +*" -lc "*) archive_cmds_need_lc_CXX=no ;; +esac + compiler_lib_search_dirs_CXX= +if test -n "${compiler_lib_search_path_CXX}"; then + compiler_lib_search_dirs_CXX=`echo " ${compiler_lib_search_path_CXX}" | ${SED} -e 's! -L! !g' -e 's!^ !!'` +fi + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + lt_prog_compiler_wl_CXX= +lt_prog_compiler_pic_CXX= +lt_prog_compiler_static_CXX= + + + # C++ specific cases for pic, static, wl, etc. + if test "$GXX" = yes; then + lt_prog_compiler_wl_CXX='-Wl,' + lt_prog_compiler_static_CXX='-static' + + case $host_os in + aix*) + # All AIX code is PIC. + if test "$host_cpu" = ia64; then + # AIX 5 now supports IA64 processor + lt_prog_compiler_static_CXX='-Bstatic' + fi + ;; + + amigaos*) + case $host_cpu in + powerpc) + # see comment about AmigaOS4 .so support + lt_prog_compiler_pic_CXX='-fPIC' + ;; + m68k) + # FIXME: we need at least 68020 code to build shared libraries, but + # adding the `-m68020' flag to GCC prevents building anything better, + # like `-m68040'. + lt_prog_compiler_pic_CXX='-m68020 -resident32 -malways-restore-a4' + ;; + esac + ;; + + beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) + # PIC is the default for these OSes. + ;; + mingw* | cygwin* | os2* | pw32* | cegcc*) + # This hack is so that the source file can tell whether it is being + # built for inclusion in a dll (and should export symbols for example). + # Although the cygwin gcc ignores -fPIC, still need this for old-style + # (--disable-auto-import) libraries + lt_prog_compiler_pic_CXX='-DDLL_EXPORT' + ;; + darwin* | rhapsody*) + # PIC is the default on this platform + # Common symbols not allowed in MH_DYLIB files + lt_prog_compiler_pic_CXX='-fno-common' + ;; + *djgpp*) + # DJGPP does not support shared libraries at all + lt_prog_compiler_pic_CXX= + ;; + haiku*) + # PIC is the default for Haiku. + # The "-static" flag exists, but is broken. + lt_prog_compiler_static_CXX= + ;; + interix[3-9]*) + # Interix 3.x gcc -fpic/-fPIC options generate broken code. + # Instead, we relocate shared libraries at runtime. + ;; + sysv4*MP*) + if test -d /usr/nec; then + lt_prog_compiler_pic_CXX=-Kconform_pic + fi + ;; + hpux*) + # PIC is the default for 64-bit PA HP-UX, but not for 32-bit + # PA HP-UX. On IA64 HP-UX, PIC is the default but the pic flag + # sets the default TLS model and affects inlining. + case $host_cpu in + hppa*64*) + ;; + *) + lt_prog_compiler_pic_CXX='-fPIC' + ;; + esac + ;; + *qnx* | *nto*) + # QNX uses GNU C++, but need to define -shared option too, otherwise + # it will coredump. + lt_prog_compiler_pic_CXX='-fPIC -shared' + ;; + *) + lt_prog_compiler_pic_CXX='-fPIC' + ;; + esac + else + case $host_os in + aix[4-9]*) + # All AIX code is PIC. + if test "$host_cpu" = ia64; then + # AIX 5 now supports IA64 processor + lt_prog_compiler_static_CXX='-Bstatic' + else + lt_prog_compiler_static_CXX='-bnso -bI:/lib/syscalls.exp' + fi + ;; + chorus*) + case $cc_basename in + cxch68*) + # Green Hills C++ Compiler + # _LT_TAGVAR(lt_prog_compiler_static, CXX)="--no_auto_instantiation -u __main -u __premain -u _abort -r $COOL_DIR/lib/libOrb.a $MVME_DIR/lib/CC/libC.a $MVME_DIR/lib/classix/libcx.s.a" + ;; + esac + ;; + mingw* | cygwin* | os2* | pw32* | cegcc*) + # This hack is so that the source file can tell whether it is being + # built for inclusion in a dll (and should export symbols for example). + lt_prog_compiler_pic_CXX='-DDLL_EXPORT' + ;; + dgux*) + case $cc_basename in + ec++*) + lt_prog_compiler_pic_CXX='-KPIC' + ;; + ghcx*) + # Green Hills C++ Compiler + lt_prog_compiler_pic_CXX='-pic' + ;; + *) + ;; + esac + ;; + freebsd* | dragonfly*) + # FreeBSD uses GNU C++ + ;; + hpux9* | hpux10* | hpux11*) + case $cc_basename in + CC*) + lt_prog_compiler_wl_CXX='-Wl,' + lt_prog_compiler_static_CXX='${wl}-a ${wl}archive' + if test "$host_cpu" != ia64; then + lt_prog_compiler_pic_CXX='+Z' + fi + ;; + aCC*) + lt_prog_compiler_wl_CXX='-Wl,' + lt_prog_compiler_static_CXX='${wl}-a ${wl}archive' + case $host_cpu in + hppa*64*|ia64*) + # +Z the default + ;; + *) + lt_prog_compiler_pic_CXX='+Z' + ;; + esac + ;; + *) + ;; + esac + ;; + interix*) + # This is c89, which is MS Visual C++ (no shared libs) + # Anyone wants to do a port? + ;; + irix5* | irix6* | nonstopux*) + case $cc_basename in + CC*) + lt_prog_compiler_wl_CXX='-Wl,' + lt_prog_compiler_static_CXX='-non_shared' + # CC pic flag -KPIC is the default. + ;; + *) + ;; + esac + ;; + linux* | k*bsd*-gnu | kopensolaris*-gnu) + case $cc_basename in + KCC*) + # KAI C++ Compiler + lt_prog_compiler_wl_CXX='--backend -Wl,' + lt_prog_compiler_pic_CXX='-fPIC' + ;; + ecpc* ) + # old Intel C++ for x86_64 which still supported -KPIC. + lt_prog_compiler_wl_CXX='-Wl,' + lt_prog_compiler_pic_CXX='-KPIC' + lt_prog_compiler_static_CXX='-static' + ;; + icpc* ) + # Intel C++, used to be incompatible with GCC. + # ICC 10 doesn't accept -KPIC any more. + lt_prog_compiler_wl_CXX='-Wl,' + lt_prog_compiler_pic_CXX='-fPIC' + lt_prog_compiler_static_CXX='-static' + ;; + pgCC* | pgcpp*) + # Portland Group C++ compiler + lt_prog_compiler_wl_CXX='-Wl,' + lt_prog_compiler_pic_CXX='-fpic' + lt_prog_compiler_static_CXX='-Bstatic' + ;; + cxx*) + # Compaq C++ + # Make sure the PIC flag is empty. It appears that all Alpha + # Linux and Compaq Tru64 Unix objects are PIC. + lt_prog_compiler_pic_CXX= + lt_prog_compiler_static_CXX='-non_shared' + ;; + xlc* | xlC* | bgxl[cC]* | mpixl[cC]*) + # IBM XL 8.0, 9.0 on PPC and BlueGene + lt_prog_compiler_wl_CXX='-Wl,' + lt_prog_compiler_pic_CXX='-qpic' + lt_prog_compiler_static_CXX='-qstaticlink' + ;; + *) + case `$CC -V 2>&1 | sed 5q` in + *Sun\ C*) + # Sun C++ 5.9 + lt_prog_compiler_pic_CXX='-KPIC' + lt_prog_compiler_static_CXX='-Bstatic' + lt_prog_compiler_wl_CXX='-Qoption ld ' + ;; + esac + ;; + esac + ;; + lynxos*) + ;; + m88k*) + ;; + mvs*) + case $cc_basename in + cxx*) + lt_prog_compiler_pic_CXX='-W c,exportall' + ;; + *) + ;; + esac + ;; + netbsd* | netbsdelf*-gnu) + ;; + *qnx* | *nto*) + # QNX uses GNU C++, but need to define -shared option too, otherwise + # it will coredump. + lt_prog_compiler_pic_CXX='-fPIC -shared' + ;; + osf3* | osf4* | osf5*) + case $cc_basename in + KCC*) + lt_prog_compiler_wl_CXX='--backend -Wl,' + ;; + RCC*) + # Rational C++ 2.4.1 + lt_prog_compiler_pic_CXX='-pic' + ;; + cxx*) + # Digital/Compaq C++ + lt_prog_compiler_wl_CXX='-Wl,' + # Make sure the PIC flag is empty. It appears that all Alpha + # Linux and Compaq Tru64 Unix objects are PIC. + lt_prog_compiler_pic_CXX= + lt_prog_compiler_static_CXX='-non_shared' + ;; + *) + ;; + esac + ;; + psos*) + ;; + solaris*) + case $cc_basename in + CC* | sunCC*) + # Sun C++ 4.2, 5.x and Centerline C++ + lt_prog_compiler_pic_CXX='-KPIC' + lt_prog_compiler_static_CXX='-Bstatic' + lt_prog_compiler_wl_CXX='-Qoption ld ' + ;; + gcx*) + # Green Hills C++ Compiler + lt_prog_compiler_pic_CXX='-PIC' + ;; + *) + ;; + esac + ;; + sunos4*) + case $cc_basename in + CC*) + # Sun C++ 4.x + lt_prog_compiler_pic_CXX='-pic' + lt_prog_compiler_static_CXX='-Bstatic' + ;; + lcc*) + # Lucid + lt_prog_compiler_pic_CXX='-pic' + ;; + *) + ;; + esac + ;; + sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) + case $cc_basename in + CC*) + lt_prog_compiler_wl_CXX='-Wl,' + lt_prog_compiler_pic_CXX='-KPIC' + lt_prog_compiler_static_CXX='-Bstatic' + ;; + esac + ;; + tandem*) + case $cc_basename in + NCC*) + # NonStop-UX NCC 3.20 + lt_prog_compiler_pic_CXX='-KPIC' + ;; + *) + ;; + esac + ;; + vxworks*) + ;; + *) + lt_prog_compiler_can_build_shared_CXX=no + ;; + esac + fi + +case $host_os in + # For platforms which do not support PIC, -DPIC is meaningless: + *djgpp*) + lt_prog_compiler_pic_CXX= + ;; + *) + lt_prog_compiler_pic_CXX="$lt_prog_compiler_pic_CXX@&t@ -DPIC" + ;; +esac + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $compiler option to produce PIC" >&5 +$as_echo_n "checking for $compiler option to produce PIC... " >&6; } +if ${lt_cv_prog_compiler_pic_CXX+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_prog_compiler_pic_CXX=$lt_prog_compiler_pic_CXX +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic_CXX" >&5 +$as_echo "$lt_cv_prog_compiler_pic_CXX" >&6; } +lt_prog_compiler_pic_CXX=$lt_cv_prog_compiler_pic_CXX + +# +# Check to make sure the PIC flag actually works. +# +if test -n "$lt_prog_compiler_pic_CXX"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler PIC flag $lt_prog_compiler_pic_CXX works" >&5 +$as_echo_n "checking if $compiler PIC flag $lt_prog_compiler_pic_CXX works... " >&6; } +if ${lt_cv_prog_compiler_pic_works_CXX+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_prog_compiler_pic_works_CXX=no + ac_outfile=conftest.$ac_objext + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + lt_compiler_flag="$lt_prog_compiler_pic_CXX@&t@ -DPIC" + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + # The option is referenced via a variable to avoid confusing sed. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ + -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) + (eval "$lt_compile" 2>conftest.err) + ac_status=$? + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + if (exit $ac_status) && test -s "$ac_outfile"; then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings other than the usual output. + $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp + $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 + if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then + lt_cv_prog_compiler_pic_works_CXX=yes + fi + fi + $RM conftest* + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic_works_CXX" >&5 +$as_echo "$lt_cv_prog_compiler_pic_works_CXX" >&6; } + +if test x"$lt_cv_prog_compiler_pic_works_CXX" = xyes; then + case $lt_prog_compiler_pic_CXX in + "" | " "*) ;; + *) lt_prog_compiler_pic_CXX=" $lt_prog_compiler_pic_CXX" ;; + esac +else + lt_prog_compiler_pic_CXX= + lt_prog_compiler_can_build_shared_CXX=no +fi + +fi + + + + + +# +# Check to make sure the static flag actually works. +# +wl=$lt_prog_compiler_wl_CXX eval lt_tmp_static_flag=\"$lt_prog_compiler_static_CXX\" +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler static flag $lt_tmp_static_flag works" >&5 +$as_echo_n "checking if $compiler static flag $lt_tmp_static_flag works... " >&6; } +if ${lt_cv_prog_compiler_static_works_CXX+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_prog_compiler_static_works_CXX=no + save_LDFLAGS="$LDFLAGS" + LDFLAGS="$LDFLAGS $lt_tmp_static_flag" + echo "$lt_simple_link_test_code" > conftest.$ac_ext + if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then + # The linker can only warn and ignore the option if not recognized + # So say no if there are warnings + if test -s conftest.err; then + # Append any errors to the config.log. + cat conftest.err 1>&5 + $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp + $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 + if diff conftest.exp conftest.er2 >/dev/null; then + lt_cv_prog_compiler_static_works_CXX=yes + fi + else + lt_cv_prog_compiler_static_works_CXX=yes + fi + fi + $RM -r conftest* + LDFLAGS="$save_LDFLAGS" + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_static_works_CXX" >&5 +$as_echo "$lt_cv_prog_compiler_static_works_CXX" >&6; } + +if test x"$lt_cv_prog_compiler_static_works_CXX" = xyes; then + : +else + lt_prog_compiler_static_CXX= +fi + + + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5 +$as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; } +if ${lt_cv_prog_compiler_c_o_CXX+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_prog_compiler_c_o_CXX=no + $RM -r conftest 2>/dev/null + mkdir conftest + cd conftest + mkdir out + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + + lt_compiler_flag="-o out/conftest2.$ac_objext" + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ + -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) + (eval "$lt_compile" 2>out/conftest.err) + ac_status=$? + cat out/conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + if (exit $ac_status) && test -s out/conftest2.$ac_objext + then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings + $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp + $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 + if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then + lt_cv_prog_compiler_c_o_CXX=yes + fi + fi + chmod u+w . 2>&5 + $RM conftest* + # SGI C++ compiler will create directory out/ii_files/ for + # template instantiation + test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files + $RM out/* && rmdir out + cd .. + $RM -r conftest + $RM conftest* + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o_CXX" >&5 +$as_echo "$lt_cv_prog_compiler_c_o_CXX" >&6; } + + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5 +$as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; } +if ${lt_cv_prog_compiler_c_o_CXX+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_prog_compiler_c_o_CXX=no + $RM -r conftest 2>/dev/null + mkdir conftest + cd conftest + mkdir out + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + + lt_compiler_flag="-o out/conftest2.$ac_objext" + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ + -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) + (eval "$lt_compile" 2>out/conftest.err) + ac_status=$? + cat out/conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + if (exit $ac_status) && test -s out/conftest2.$ac_objext + then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings + $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp + $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 + if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then + lt_cv_prog_compiler_c_o_CXX=yes + fi + fi + chmod u+w . 2>&5 + $RM conftest* + # SGI C++ compiler will create directory out/ii_files/ for + # template instantiation + test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files + $RM out/* && rmdir out + cd .. + $RM -r conftest + $RM conftest* + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o_CXX" >&5 +$as_echo "$lt_cv_prog_compiler_c_o_CXX" >&6; } + + + + +hard_links="nottested" +if test "$lt_cv_prog_compiler_c_o_CXX" = no && test "$need_locks" != no; then + # do not overwrite the value of need_locks provided by the user + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if we can lock with hard links" >&5 +$as_echo_n "checking if we can lock with hard links... " >&6; } + hard_links=yes + $RM conftest* + ln conftest.a conftest.b 2>/dev/null && hard_links=no + touch conftest.a + ln conftest.a conftest.b 2>&5 || hard_links=no + ln conftest.a conftest.b 2>/dev/null && hard_links=no + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $hard_links" >&5 +$as_echo "$hard_links" >&6; } + if test "$hard_links" = no; then + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&5 +$as_echo "$as_me: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&2;} + need_locks=warn + fi +else + need_locks=no +fi + + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $compiler linker ($LD) supports shared libraries" >&5 +$as_echo_n "checking whether the $compiler linker ($LD) supports shared libraries... " >&6; } + + export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' + exclude_expsyms_CXX='_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*' + case $host_os in + aix[4-9]*) + # If we're using GNU nm, then we don't want the "-C" option. + # -C means demangle to AIX nm, but means don't demangle with GNU nm + # Also, AIX nm treats weak defined symbols like other global defined + # symbols, whereas GNU nm marks them as "W". + if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then + export_symbols_cmds_CXX='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && (substr(\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' + else + export_symbols_cmds_CXX='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && (substr(\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' + fi + ;; + pw32*) + export_symbols_cmds_CXX="$ltdll_cmds" + ;; + cygwin* | mingw* | cegcc*) + case $cc_basename in + cl*) + exclude_expsyms_CXX='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*' + ;; + *) + export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1 DATA/;s/^.*[ ]__nm__\([^ ]*\)[ ][^ ]*/\1 DATA/;/^I[ ]/d;/^[AITW][ ]/s/.* //'\'' | sort | uniq > $export_symbols' + exclude_expsyms_CXX='[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname' + ;; + esac + ;; + linux* | k*bsd*-gnu | gnu*) + link_all_deplibs_CXX=no + ;; + *) + export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' + ;; + esac + +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ld_shlibs_CXX" >&5 +$as_echo "$ld_shlibs_CXX" >&6; } +test "$ld_shlibs_CXX" = no && can_build_shared=no + +with_gnu_ld_CXX=$with_gnu_ld + + + + + + +# +# Do we need to explicitly link libc? +# +case "x$archive_cmds_need_lc_CXX" in +x|xyes) + # Assume -lc should be added + archive_cmds_need_lc_CXX=yes + + if test "$enable_shared" = yes && test "$GCC" = yes; then + case $archive_cmds_CXX in + *'~'*) + # FIXME: we may have to deal with multi-command sequences. + ;; + '$CC '*) + # Test whether the compiler implicitly links with -lc since on some + # systems, -lgcc has to come before -lc. If gcc already passes -lc + # to ld, don't add -lc before -lgcc. + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether -lc should be explicitly linked in" >&5 +$as_echo_n "checking whether -lc should be explicitly linked in... " >&6; } +if ${lt_cv_archive_cmds_need_lc_CXX+:} false; then : + $as_echo_n "(cached) " >&6 +else + $RM conftest* + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } 2>conftest.err; then + soname=conftest + lib=conftest + libobjs=conftest.$ac_objext + deplibs= + wl=$lt_prog_compiler_wl_CXX + pic_flag=$lt_prog_compiler_pic_CXX + compiler_flags=-v + linker_flags=-v + verstring= + output_objdir=. + libname=conftest + lt_save_allow_undefined_flag=$allow_undefined_flag_CXX + allow_undefined_flag_CXX= + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$archive_cmds_CXX 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1\""; } >&5 + (eval $archive_cmds_CXX 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + then + lt_cv_archive_cmds_need_lc_CXX=no + else + lt_cv_archive_cmds_need_lc_CXX=yes + fi + allow_undefined_flag_CXX=$lt_save_allow_undefined_flag + else + cat conftest.err 1>&5 + fi + $RM conftest* + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_archive_cmds_need_lc_CXX" >&5 +$as_echo "$lt_cv_archive_cmds_need_lc_CXX" >&6; } + archive_cmds_need_lc_CXX=$lt_cv_archive_cmds_need_lc_CXX + ;; + esac + fi + ;; +esac + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking dynamic linker characteristics" >&5 +$as_echo_n "checking dynamic linker characteristics... " >&6; } + +library_names_spec= +libname_spec='lib$name' +soname_spec= +shrext_cmds=".so" +postinstall_cmds= +postuninstall_cmds= +finish_cmds= +finish_eval= +shlibpath_var= +shlibpath_overrides_runpath=unknown +version_type=none +dynamic_linker="$host_os ld.so" +sys_lib_dlsearch_path_spec="/lib /usr/lib" +need_lib_prefix=unknown +hardcode_into_libs=no + +# when you set need_version to no, make sure it does not cause -set_version +# flags to be left without arguments +need_version=unknown + +case $host_os in +aix3*) + version_type=linux # correct to gnu/linux during the next big refactor + library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a' + shlibpath_var=LIBPATH + + # AIX 3 has no versioning support, so we append a major version to the name. + soname_spec='${libname}${release}${shared_ext}$major' + ;; + +aix[4-9]*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + hardcode_into_libs=yes + if test "$host_cpu" = ia64; then + # AIX 5 supports IA64 + library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}' + shlibpath_var=LD_LIBRARY_PATH + else + # With GCC up to 2.95.x, collect2 would create an import file + # for dependence libraries. The import file would start with + # the line `#! .'. This would cause the generated library to + # depend on `.', always an invalid library. This was fixed in + # development snapshots of GCC prior to 3.0. + case $host_os in + aix4 | aix4.[01] | aix4.[01].*) + if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)' + echo ' yes ' + echo '#endif'; } | ${CC} -E - | $GREP yes > /dev/null; then + : + else + can_build_shared=no + fi + ;; + esac + # AIX (on Power*) has no versioning support, so currently we can not hardcode correct + # soname into executable. Probably we can add versioning support to + # collect2, so additional links can be useful in future. + if test "$aix_use_runtimelinking" = yes; then + # If using run time linking (on AIX 4.2 or later) use lib.so + # instead of lib.a to let people know that these are not + # typical AIX shared libraries. + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + else + # We preserve .a as extension for shared libraries through AIX4.2 + # and later when we are not doing run time linking. + library_names_spec='${libname}${release}.a $libname.a' + soname_spec='${libname}${release}${shared_ext}$major' + fi + shlibpath_var=LIBPATH + fi + ;; + +amigaos*) + case $host_cpu in + powerpc) + # Since July 2007 AmigaOS4 officially supports .so libraries. + # When compiling the executable, add -use-dynld -Lsobjs: to the compileline. + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + ;; + m68k) + library_names_spec='$libname.ixlibrary $libname.a' + # Create ${libname}_ixlibrary.a entries in /sys/libs. + finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`func_echo_all "$lib" | $SED '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; test $RM /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done' + ;; + esac + ;; + +beos*) + library_names_spec='${libname}${shared_ext}' + dynamic_linker="$host_os ld.so" + shlibpath_var=LIBRARY_PATH + ;; + +bsdi[45]*) + version_type=linux # correct to gnu/linux during the next big refactor + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir' + shlibpath_var=LD_LIBRARY_PATH + sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib" + sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib" + # the default ld.so.conf also contains /usr/contrib/lib and + # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow + # libtool to hard-code these into programs + ;; + +cygwin* | mingw* | pw32* | cegcc*) + version_type=windows + shrext_cmds=".dll" + need_version=no + need_lib_prefix=no + + case $GCC,$cc_basename in + yes,*) + # gcc + library_names_spec='$libname.dll.a' + # DLL is installed to $(libdir)/../bin by postinstall_cmds + postinstall_cmds='base_file=`basename \${file}`~ + dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~ + dldir=$destdir/`dirname \$dlpath`~ + test -d \$dldir || mkdir -p \$dldir~ + $install_prog $dir/$dlname \$dldir/$dlname~ + chmod a+x \$dldir/$dlname~ + if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then + eval '\''$striplib \$dldir/$dlname'\'' || exit \$?; + fi' + postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ + dlpath=$dir/\$dldll~ + $RM \$dlpath' + shlibpath_overrides_runpath=yes + + case $host_os in + cygwin*) + # Cygwin DLLs use 'cyg' prefix rather than 'lib' + soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' + + ;; + mingw* | cegcc*) + # MinGW DLLs use traditional 'lib' prefix + soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' + ;; + pw32*) + # pw32 DLLs use 'pw' prefix rather than 'lib' + library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' + ;; + esac + dynamic_linker='Win32 ld.exe' + ;; + + *,cl*) + # Native MSVC + libname_spec='$name' + soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' + library_names_spec='${libname}.dll.lib' + + case $build_os in + mingw*) + sys_lib_search_path_spec= + lt_save_ifs=$IFS + IFS=';' + for lt_path in $LIB + do + IFS=$lt_save_ifs + # Let DOS variable expansion print the short 8.3 style file name. + lt_path=`cd "$lt_path" 2>/dev/null && cmd //C "for %i in (".") do @echo %~si"` + sys_lib_search_path_spec="$sys_lib_search_path_spec $lt_path" + done + IFS=$lt_save_ifs + # Convert to MSYS style. + sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | sed -e 's|\\\\|/|g' -e 's| \\([a-zA-Z]\\):| /\\1|g' -e 's|^ ||'` + ;; + cygwin*) + # Convert to unix form, then to dos form, then back to unix form + # but this time dos style (no spaces!) so that the unix form looks + # like /cygdrive/c/PROGRA~1:/cygdr... + sys_lib_search_path_spec=`cygpath --path --unix "$LIB"` + sys_lib_search_path_spec=`cygpath --path --dos "$sys_lib_search_path_spec" 2>/dev/null` + sys_lib_search_path_spec=`cygpath --path --unix "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` + ;; + *) + sys_lib_search_path_spec="$LIB" + if $ECHO "$sys_lib_search_path_spec" | $GREP ';[c-zC-Z]:/' >/dev/null; then + # It is most probably a Windows format PATH. + sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` + else + sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` + fi + # FIXME: find the short name or the path components, as spaces are + # common. (e.g. "Program Files" -> "PROGRA~1") + ;; + esac + + # DLL is installed to $(libdir)/../bin by postinstall_cmds + postinstall_cmds='base_file=`basename \${file}`~ + dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~ + dldir=$destdir/`dirname \$dlpath`~ + test -d \$dldir || mkdir -p \$dldir~ + $install_prog $dir/$dlname \$dldir/$dlname' + postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ + dlpath=$dir/\$dldll~ + $RM \$dlpath' + shlibpath_overrides_runpath=yes + dynamic_linker='Win32 link.exe' + ;; + + *) + # Assume MSVC wrapper + library_names_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext} $libname.lib' + dynamic_linker='Win32 ld.exe' + ;; + esac + # FIXME: first we should search . and the directory the executable is in + shlibpath_var=PATH + ;; + +darwin* | rhapsody*) + dynamic_linker="$host_os dyld" + version_type=darwin + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${major}$shared_ext ${libname}$shared_ext' + soname_spec='${libname}${release}${major}$shared_ext' + shlibpath_overrides_runpath=yes + shlibpath_var=DYLD_LIBRARY_PATH + shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`' + + sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib' + ;; + +dgux*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + ;; + +freebsd* | dragonfly*) + # DragonFly does not have aout. When/if they implement a new + # versioning mechanism, adjust this. + if test -x /usr/bin/objformat; then + objformat=`/usr/bin/objformat` + else + case $host_os in + freebsd[23].*) objformat=aout ;; + *) objformat=elf ;; + esac + fi + version_type=freebsd-$objformat + case $version_type in + freebsd-elf*) + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' + need_version=no + need_lib_prefix=no + ;; + freebsd-*) + library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix' + need_version=yes + ;; + esac + shlibpath_var=LD_LIBRARY_PATH + case $host_os in + freebsd2.*) + shlibpath_overrides_runpath=yes + ;; + freebsd3.[01]* | freebsdelf3.[01]*) + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + freebsd3.[2-9]* | freebsdelf3.[2-9]* | \ + freebsd4.[0-5] | freebsdelf4.[0-5] | freebsd4.1.1 | freebsdelf4.1.1) + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; + *) # from 4.6 on, and DragonFly + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + esac + ;; + +gnu*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; + +haiku*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + dynamic_linker="$host_os runtime_loader" + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LIBRARY_PATH + shlibpath_overrides_runpath=yes + sys_lib_dlsearch_path_spec='/boot/home/config/lib /boot/common/lib /boot/system/lib' + hardcode_into_libs=yes + ;; + +hpux9* | hpux10* | hpux11*) + # Give a soname corresponding to the major version so that dld.sl refuses to + # link against other versions. + version_type=sunos + need_lib_prefix=no + need_version=no + case $host_cpu in + ia64*) + shrext_cmds='.so' + hardcode_into_libs=yes + dynamic_linker="$host_os dld.so" + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + if test "X$HPUX_IA64_MODE" = X32; then + sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib" + else + sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64" + fi + sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec + ;; + hppa*64*) + shrext_cmds='.sl' + hardcode_into_libs=yes + dynamic_linker="$host_os dld.sl" + shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH + shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64" + sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec + ;; + *) + shrext_cmds='.sl' + dynamic_linker="$host_os dld.sl" + shlibpath_var=SHLIB_PATH + shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + ;; + esac + # HP-UX runs *really* slowly unless shared libraries are mode 555, ... + postinstall_cmds='chmod 555 $lib' + # or fails outright, so override atomically: + install_override_mode=555 + ;; + +interix[3-9]*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; + +irix5* | irix6* | nonstopux*) + case $host_os in + nonstopux*) version_type=nonstopux ;; + *) + if test "$lt_cv_prog_gnu_ld" = yes; then + version_type=linux # correct to gnu/linux during the next big refactor + else + version_type=irix + fi ;; + esac + need_lib_prefix=no + need_version=no + soname_spec='${libname}${release}${shared_ext}$major' + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}' + case $host_os in + irix5* | nonstopux*) + libsuff= shlibsuff= + ;; + *) + case $LD in # libtool.m4 will add one of these switches to LD + *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") + libsuff= shlibsuff= libmagic=32-bit;; + *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") + libsuff=32 shlibsuff=N32 libmagic=N32;; + *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") + libsuff=64 shlibsuff=64 libmagic=64-bit;; + *) libsuff= shlibsuff= libmagic=never-match;; + esac + ;; + esac + shlibpath_var=LD_LIBRARY${shlibsuff}_PATH + shlibpath_overrides_runpath=no + sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}" + sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}" + hardcode_into_libs=yes + ;; + +# No shared lib support for Linux oldld, aout, or coff. +linux*oldld* | linux*aout* | linux*coff*) + dynamic_linker=no + ;; + +# This must be glibc/ELF. +linux* | k*bsd*-gnu | kopensolaris*-gnu) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + + # Some binutils ld are patched to set DT_RUNPATH + if ${lt_cv_shlibpath_overrides_runpath+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_shlibpath_overrides_runpath=no + save_LDFLAGS=$LDFLAGS + save_libdir=$libdir + eval "libdir=/foo; wl=\"$lt_prog_compiler_wl_CXX\"; \ + LDFLAGS=\"\$LDFLAGS $hardcode_libdir_flag_spec_CXX\"" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_cxx_try_link "$LINENO"; then : + if ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir" >/dev/null; then : + lt_cv_shlibpath_overrides_runpath=yes +fi +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + LDFLAGS=$save_LDFLAGS + libdir=$save_libdir + +fi + + shlibpath_overrides_runpath=$lt_cv_shlibpath_overrides_runpath + + # This implies no fast_install, which is unacceptable. + # Some rework will be needed to allow for fast_install + # before this can be enabled. + hardcode_into_libs=yes + + # Append ld.so.conf contents to the search path + if test -f /etc/ld.so.conf; then + lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \$2)); skip = 1; } { if (!skip) print \$0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[ ]*hwcap[ ]/d;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;s/"//g;/^$/d' | tr '\n' ' '` + sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra" + fi + + # We used to test for /lib/ld.so.1 and disable shared libraries on + # powerpc, because MkLinux only supported shared libraries with the + # GNU dynamic linker. Since this was broken with cross compilers, + # most powerpc-linux boxes support dynamic linking these days and + # people can always --disable-shared, the test was removed, and we + # assume the GNU/Linux dynamic linker is in use. + dynamic_linker='GNU/Linux ld.so' + ;; + +netbsdelf*-gnu) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + dynamic_linker='NetBSD ld.elf_so' + ;; + +netbsd*) + version_type=sunos + need_lib_prefix=no + need_version=no + if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' + dynamic_linker='NetBSD (a.out) ld.so' + else + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + dynamic_linker='NetBSD ld.elf_so' + fi + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + +newsos6) + version_type=linux # correct to gnu/linux during the next big refactor + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + ;; + +*nto* | *qnx*) + version_type=qnx + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + dynamic_linker='ldqnx.so' + ;; + +openbsd*) + version_type=sunos + sys_lib_dlsearch_path_spec="/usr/lib" + need_lib_prefix=no + # Some older versions of OpenBSD (3.3 at least) *do* need versioned libs. + case $host_os in + openbsd3.3 | openbsd3.3.*) need_version=yes ;; + *) need_version=no ;; + esac + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' + shlibpath_var=LD_LIBRARY_PATH + if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then + case $host_os in + openbsd2.[89] | openbsd2.[89].*) + shlibpath_overrides_runpath=no + ;; + *) + shlibpath_overrides_runpath=yes + ;; + esac + else + shlibpath_overrides_runpath=yes + fi + ;; + +os2*) + libname_spec='$name' + shrext_cmds=".dll" + need_lib_prefix=no + library_names_spec='$libname${shared_ext} $libname.a' + dynamic_linker='OS/2 ld.exe' + shlibpath_var=LIBPATH + ;; + +osf3* | osf4* | osf5*) + version_type=osf + need_lib_prefix=no + need_version=no + soname_spec='${libname}${release}${shared_ext}$major' + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + shlibpath_var=LD_LIBRARY_PATH + sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib" + sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec" + ;; + +rdos*) + dynamic_linker=no + ;; + +solaris*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + # ldd complains unless libraries are executable + postinstall_cmds='chmod +x $lib' + ;; + +sunos4*) + version_type=sunos + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' + finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + if test "$with_gnu_ld" = yes; then + need_lib_prefix=no + fi + need_version=yes + ;; + +sysv4 | sysv4.3*) + version_type=linux # correct to gnu/linux during the next big refactor + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + case $host_vendor in + sni) + shlibpath_overrides_runpath=no + need_lib_prefix=no + runpath_var=LD_RUN_PATH + ;; + siemens) + need_lib_prefix=no + ;; + motorola) + need_lib_prefix=no + need_version=no + shlibpath_overrides_runpath=no + sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib' + ;; + esac + ;; + +sysv4*MP*) + if test -d /usr/nec ;then + version_type=linux # correct to gnu/linux during the next big refactor + library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}' + soname_spec='$libname${shared_ext}.$major' + shlibpath_var=LD_LIBRARY_PATH + fi + ;; + +sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) + version_type=freebsd-elf + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + if test "$with_gnu_ld" = yes; then + sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib' + else + sys_lib_search_path_spec='/usr/ccs/lib /usr/lib' + case $host_os in + sco3.2v5*) + sys_lib_search_path_spec="$sys_lib_search_path_spec /lib" + ;; + esac + fi + sys_lib_dlsearch_path_spec='/usr/lib' + ;; + +tpf*) + # TPF is a cross-target only. Preferred cross-host = GNU/Linux. + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; + +uts4*) + version_type=linux # correct to gnu/linux during the next big refactor + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + ;; + +*) + dynamic_linker=no + ;; +esac +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $dynamic_linker" >&5 +$as_echo "$dynamic_linker" >&6; } +test "$dynamic_linker" = no && can_build_shared=no + +variables_saved_for_relink="PATH $shlibpath_var $runpath_var" +if test "$GCC" = yes; then + variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" +fi + +if test "${lt_cv_sys_lib_search_path_spec+set}" = set; then + sys_lib_search_path_spec="$lt_cv_sys_lib_search_path_spec" +fi +if test "${lt_cv_sys_lib_dlsearch_path_spec+set}" = set; then + sys_lib_dlsearch_path_spec="$lt_cv_sys_lib_dlsearch_path_spec" +fi + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to hardcode library paths into programs" >&5 +$as_echo_n "checking how to hardcode library paths into programs... " >&6; } +hardcode_action_CXX= +if test -n "$hardcode_libdir_flag_spec_CXX" || + test -n "$runpath_var_CXX" || + test "X$hardcode_automatic_CXX" = "Xyes" ; then + + # We can hardcode non-existent directories. + if test "$hardcode_direct_CXX" != no && + # If the only mechanism to avoid hardcoding is shlibpath_var, we + # have to relink, otherwise we might link with an installed library + # when we should be linking with a yet-to-be-installed one + ## test "$_LT_TAGVAR(hardcode_shlibpath_var, CXX)" != no && + test "$hardcode_minus_L_CXX" != no; then + # Linking always hardcodes the temporary library directory. + hardcode_action_CXX=relink + else + # We can link without hardcoding, and we can hardcode nonexisting dirs. + hardcode_action_CXX=immediate + fi +else + # We cannot hardcode anything, or else we can only hardcode existing + # directories. + hardcode_action_CXX=unsupported +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $hardcode_action_CXX" >&5 +$as_echo "$hardcode_action_CXX" >&6; } + +if test "$hardcode_action_CXX" = relink || + test "$inherit_rpath_CXX" = yes; then + # Fast installation is not supported + enable_fast_install=no +elif test "$shlibpath_overrides_runpath" = yes || + test "$enable_shared" = no; then + # Fast installation is not necessary + enable_fast_install=needless +fi + + + + + + + + fi # test -n "$compiler" + + CC=$lt_save_CC + CFLAGS=$lt_save_CFLAGS + LDCXX=$LD + LD=$lt_save_LD + GCC=$lt_save_GCC + with_gnu_ld=$lt_save_with_gnu_ld + lt_cv_path_LDCXX=$lt_cv_path_LD + lt_cv_path_LD=$lt_save_path_LD + lt_cv_prog_gnu_ldcxx=$lt_cv_prog_gnu_ld + lt_cv_prog_gnu_ld=$lt_save_with_gnu_ld +fi # test "$_lt_caught_CXX_error" != yes + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + + + + + + + + + + + + + + + ac_config_commands="$ac_config_commands libtool" + + + + +# Only expand once: + + + +#enable -D_GNU_SOURCE since the return code value of getaddrinfo +#ifdefed with __USE_GNU +#features.h header undef's __USE_GNU and defines it only if _GNU_SOURCE is defined +#hence this define for gcc +@%:@ Check whether --enable-debug was given. +if test "${enable_debug+set}" = set; then : + enableval=$enable_debug; +else + enable_debug=no +fi + + +if test "x$enable_debug" = xyes; then + if test "x$init_cflags" = x; then + CFLAGS="" + fi + CFLAGS="$CFLAGS -g -O0 -D_GNU_SOURCE" +else + if test "x$init_cflags" = x; then + CFLAGS="-g -O2 -D_GNU_SOURCE" + fi +fi + +if test "x$enable_debug" = xyes; then + if test "x$init_cxxflags" = x; then + CXXFLAGS="" + fi + CXXFLAGS="$CXXFLAGS -g -O0" +else + if test "x$init_cxxflags" = x; then + CXXFLAGS="-g -O2" + fi +fi + + +@%:@ Check whether --with-syncapi was given. +if test "${with_syncapi+set}" = set; then : + withval=$with_syncapi; +else + with_syncapi=yes +fi + + +# Checks for libraries. +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for pthread_mutex_lock in -lpthread" >&5 +$as_echo_n "checking for pthread_mutex_lock in -lpthread... " >&6; } +if ${ac_cv_lib_pthread_pthread_mutex_lock+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lpthread $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char pthread_mutex_lock (); +int +main () +{ +return pthread_mutex_lock (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_pthread_pthread_mutex_lock=yes +else + ac_cv_lib_pthread_pthread_mutex_lock=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_pthread_pthread_mutex_lock" >&5 +$as_echo "$ac_cv_lib_pthread_pthread_mutex_lock" >&6; } +if test "x$ac_cv_lib_pthread_pthread_mutex_lock" = xyes; then : + have_pthread=yes +else + have_pthread=no +fi + + +if test "x$with_syncapi" != xno && test "x$have_pthread" = xno; then + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cannot build SyncAPI -- pthread not found" >&5 +$as_echo "$as_me: WARNING: cannot build SyncAPI -- pthread not found" >&2;} + with_syncapi=no +fi +if test "x$with_syncapi" != xno; then + { $as_echo "$as_me:${as_lineno-$LINENO}: building with SyncAPI support" >&5 +$as_echo "$as_me: building with SyncAPI support" >&6;} +else + { $as_echo "$as_me:${as_lineno-$LINENO}: building without SyncAPI support" >&5 +$as_echo "$as_me: building without SyncAPI support" >&6;} +fi + + if test "x$with_syncapi" != xno; then + WANT_SYNCAPI_TRUE= + WANT_SYNCAPI_FALSE='#' +else + WANT_SYNCAPI_TRUE='#' + WANT_SYNCAPI_FALSE= +fi + + +# Checks for header files. +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header files" >&5 +$as_echo_n "checking for ANSI C header files... " >&6; } +if ${ac_cv_header_stdc+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +#include +#include +#include + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_header_stdc=yes +else + ac_cv_header_stdc=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + +if test $ac_cv_header_stdc = yes; then + # SunOS 4.x string.h does not declare mem*, contrary to ANSI. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include + +_ACEOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + $EGREP "memchr" >/dev/null 2>&1; then : + +else + ac_cv_header_stdc=no +fi +rm -f conftest* + +fi + +if test $ac_cv_header_stdc = yes; then + # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include + +_ACEOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + $EGREP "free" >/dev/null 2>&1; then : + +else + ac_cv_header_stdc=no +fi +rm -f conftest* + +fi + +if test $ac_cv_header_stdc = yes; then + # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi. + if test "$cross_compiling" = yes; then : + : +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +#include +#if ((' ' & 0x0FF) == 0x020) +# define ISLOWER(c) ('a' <= (c) && (c) <= 'z') +# define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c)) +#else +# define ISLOWER(c) \ + (('a' <= (c) && (c) <= 'i') \ + || ('j' <= (c) && (c) <= 'r') \ + || ('s' <= (c) && (c) <= 'z')) +# define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c)) +#endif + +#define XOR(e, f) (((e) && !(f)) || (!(e) && (f))) +int +main () +{ + int i; + for (i = 0; i < 256; i++) + if (XOR (islower (i), ISLOWER (i)) + || toupper (i) != TOUPPER (i)) + return 2; + return 0; +} +_ACEOF +if ac_fn_c_try_run "$LINENO"; then : + +else + ac_cv_header_stdc=no +fi +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ + conftest.$ac_objext conftest.beam conftest.$ac_ext +fi + +fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdc" >&5 +$as_echo "$ac_cv_header_stdc" >&6; } +if test $ac_cv_header_stdc = yes; then + +$as_echo "@%:@define STDC_HEADERS 1" >>confdefs.h + +fi + +for ac_header in arpa/inet.h fcntl.h netdb.h netinet/in.h stdlib.h string.h sys/socket.h sys/time.h unistd.h sys/utsname.h +do : + as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` +ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default" +if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : + cat >>confdefs.h <<_ACEOF +@%:@define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 +_ACEOF + +fi + +done + + +# Checks for typedefs, structures, and compiler characteristics. +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for an ANSI C-conforming const" >&5 +$as_echo_n "checking for an ANSI C-conforming const... " >&6; } +if ${ac_cv_c_const+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + +#ifndef __cplusplus + /* Ultrix mips cc rejects this sort of thing. */ + typedef int charset[2]; + const charset cs = { 0, 0 }; + /* SunOS 4.1.1 cc rejects this. */ + char const *const *pcpcc; + char **ppc; + /* NEC SVR4.0.2 mips cc rejects this. */ + struct point {int x, y;}; + static struct point const zero = {0,0}; + /* AIX XL C 1.02.0.0 rejects this. + It does not let you subtract one const X* pointer from another in + an arm of an if-expression whose if-part is not a constant + expression */ + const char *g = "string"; + pcpcc = &g + (g ? g-g : 0); + /* HPUX 7.0 cc rejects these. */ + ++pcpcc; + ppc = (char**) pcpcc; + pcpcc = (char const *const *) ppc; + { /* SCO 3.2v4 cc rejects this sort of thing. */ + char tx; + char *t = &tx; + char const *s = 0 ? (char *) 0 : (char const *) 0; + + *t++ = 0; + if (s) return 0; + } + { /* Someone thinks the Sun supposedly-ANSI compiler will reject this. */ + int x[] = {25, 17}; + const int *foo = &x[0]; + ++foo; + } + { /* Sun SC1.0 ANSI compiler rejects this -- but not the above. */ + typedef const int *iptr; + iptr p = 0; + ++p; + } + { /* AIX XL C 1.02.0.0 rejects this sort of thing, saying + "k.c", line 2.27: 1506-025 (S) Operand must be a modifiable lvalue. */ + struct s { int j; const int *ap[3]; } bx; + struct s *b = &bx; b->j = 5; + } + { /* ULTRIX-32 V3.1 (Rev 9) vcc rejects this */ + const int foo = 10; + if (!foo) return 0; + } + return !cs[0] && !zero.x; +#endif + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_c_const=yes +else + ac_cv_c_const=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_const" >&5 +$as_echo "$ac_cv_c_const" >&6; } +if test $ac_cv_c_const = no; then + +$as_echo "@%:@define const /**/" >>confdefs.h + +fi + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for inline" >&5 +$as_echo_n "checking for inline... " >&6; } +if ${ac_cv_c_inline+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_cv_c_inline=no +for ac_kw in inline __inline__ __inline; do + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#ifndef __cplusplus +typedef int foo_t; +static $ac_kw foo_t static_foo () {return 0; } +$ac_kw foo_t foo () {return 0; } +#endif + +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_c_inline=$ac_kw +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + test "$ac_cv_c_inline" != no && break +done + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_inline" >&5 +$as_echo "$ac_cv_c_inline" >&6; } + +case $ac_cv_c_inline in + inline | yes) ;; + *) + case $ac_cv_c_inline in + no) ac_val=;; + *) ac_val=$ac_cv_c_inline;; + esac + cat >>confdefs.h <<_ACEOF +#ifndef __cplusplus +#define inline $ac_val +#endif +_ACEOF + ;; +esac + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether time.h and sys/time.h may both be included" >&5 +$as_echo_n "checking whether time.h and sys/time.h may both be included... " >&6; } +if ${ac_cv_header_time+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +#include +#include + +int +main () +{ +if ((struct tm *) 0) +return 0; + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_header_time=yes +else + ac_cv_header_time=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_time" >&5 +$as_echo "$ac_cv_header_time" >&6; } +if test $ac_cv_header_time = yes; then + +$as_echo "@%:@define TIME_WITH_SYS_TIME 1" >>confdefs.h + +fi + +ac_fn_c_check_type "$LINENO" "nfds_t" "ac_cv_type_nfds_t" "#include +" +if test "x$ac_cv_type_nfds_t" = xyes; then : + +$as_echo "@%:@define POLL_NFDS_TYPE nfds_t" >>confdefs.h + +else + +$as_echo "@%:@define POLL_NFDS_TYPE unsigned int" >>confdefs.h + +fi + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to enable ipv6" >&5 +$as_echo_n "checking whether to enable ipv6... " >&6; } + +if test "$cross_compiling" = yes; then : + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + ipv6=no +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + /* is AF_INET6 available? */ +#include +#include +main() +{ + if (socket(AF_INET6, SOCK_STREAM, 0) < 0) + exit(1); + else + exit(0); +} + +_ACEOF +if ac_fn_c_try_run "$LINENO"; then : + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + ipv6=yes +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + ipv6=no +fi +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ + conftest.$ac_objext conftest.beam conftest.$ac_ext +fi + + +if test x"$ipv6" = xyes; then + USEIPV6="-DZOO_IPV6_ENABLED" + +fi + +# Checks for library functions. +for ac_func in getcwd gethostbyname gethostname getlogin getpwuid_r gettimeofday getuid memmove memset poll socket strchr strdup strerror strtol +do : + as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` +ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var" +if eval test \"x\$"$as_ac_var"\" = x"yes"; then : + cat >>confdefs.h <<_ACEOF +@%:@define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 +_ACEOF + +fi +done + + +ac_config_files="$ac_config_files Makefile" + +cat >confcache <<\_ACEOF +# This file is a shell script that caches the results of configure +# tests run on this system so they can be shared between configure +# scripts and configure runs, see configure's option --config-cache. +# It is not useful on other systems. If it contains results you don't +# want to keep, you may remove or edit it. +# +# config.status only pays attention to the cache file if you give it +# the --recheck option to rerun configure. +# +# `ac_cv_env_foo' variables (set or unset) will be overridden when +# loading this file, other *unset* `ac_cv_foo' will be assigned the +# following values. + +_ACEOF + +# The following way of writing the cache mishandles newlines in values, +# but we know of no workaround that is simple, portable, and efficient. +# So, we kill variables containing newlines. +# Ultrix sh set writes to stderr and can't be redirected directly, +# and sets the high bit in the cache file unless we assign to the vars. +( + for ac_var in `(set) 2>&1 | sed -n 's/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'`; do + eval ac_val=\$$ac_var + case $ac_val in #( + *${as_nl}*) + case $ac_var in #( + *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 +$as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; + esac + case $ac_var in #( + _ | IFS | as_nl) ;; #( + BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( + *) { eval $ac_var=; unset $ac_var;} ;; + esac ;; + esac + done + + (set) 2>&1 | + case $as_nl`(ac_space=' '; set) 2>&1` in #( + *${as_nl}ac_space=\ *) + # `set' does not quote correctly, so add quotes: double-quote + # substitution turns \\\\ into \\, and sed turns \\ into \. + sed -n \ + "s/'/'\\\\''/g; + s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p" + ;; #( + *) + # `set' quotes correctly as required by POSIX, so do not add quotes. + sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" + ;; + esac | + sort +) | + sed ' + /^ac_cv_env_/b end + t clear + :clear + s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/ + t end + s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/ + :end' >>confcache +if diff "$cache_file" confcache >/dev/null 2>&1; then :; else + if test -w "$cache_file"; then + if test "x$cache_file" != "x/dev/null"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5 +$as_echo "$as_me: updating cache $cache_file" >&6;} + if test ! -f "$cache_file" || test -h "$cache_file"; then + cat confcache >"$cache_file" + else + case $cache_file in #( + */* | ?:*) + mv -f confcache "$cache_file"$$ && + mv -f "$cache_file"$$ "$cache_file" ;; #( + *) + mv -f confcache "$cache_file" ;; + esac + fi + fi + else + { $as_echo "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5 +$as_echo "$as_me: not updating unwritable cache $cache_file" >&6;} + fi +fi +rm -f confcache + +test "x$prefix" = xNONE && prefix=$ac_default_prefix +# Let make expand exec_prefix. +test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' + +DEFS=-DHAVE_CONFIG_H + +ac_libobjs= +ac_ltlibobjs= +U= +for ac_i in : $LIB@&t@OBJS; do test "x$ac_i" = x: && continue + # 1. Remove the extension, and $U if already installed. + ac_script='s/\$U\././;s/\.o$//;s/\.obj$//' + ac_i=`$as_echo "$ac_i" | sed "$ac_script"` + # 2. Prepend LIBOBJDIR. When used with automake>=1.10 LIBOBJDIR + # will be set to the directory where LIBOBJS objects are built. + as_fn_append ac_libobjs " \${LIBOBJDIR}$ac_i\$U.$ac_objext" + as_fn_append ac_ltlibobjs " \${LIBOBJDIR}$ac_i"'$U.lo' +done +LIB@&t@OBJS=$ac_libobjs + +LTLIBOBJS=$ac_ltlibobjs + + +if test -z "${DX_COND_doc_TRUE}" && test -z "${DX_COND_doc_FALSE}"; then + as_fn_error $? "conditional \"DX_COND_doc\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${DX_COND_doc_TRUE}" && test -z "${DX_COND_doc_FALSE}"; then + as_fn_error $? "conditional \"DX_COND_doc\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${DX_COND_dot_TRUE}" && test -z "${DX_COND_dot_FALSE}"; then + as_fn_error $? "conditional \"DX_COND_dot\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${DX_COND_dot_TRUE}" && test -z "${DX_COND_dot_FALSE}"; then + as_fn_error $? "conditional \"DX_COND_dot\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${DX_COND_man_TRUE}" && test -z "${DX_COND_man_FALSE}"; then + as_fn_error $? "conditional \"DX_COND_man\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${DX_COND_man_TRUE}" && test -z "${DX_COND_man_FALSE}"; then + as_fn_error $? "conditional \"DX_COND_man\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${DX_COND_rtf_TRUE}" && test -z "${DX_COND_rtf_FALSE}"; then + as_fn_error $? "conditional \"DX_COND_rtf\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${DX_COND_rtf_TRUE}" && test -z "${DX_COND_rtf_FALSE}"; then + as_fn_error $? "conditional \"DX_COND_rtf\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${DX_COND_xml_TRUE}" && test -z "${DX_COND_xml_FALSE}"; then + as_fn_error $? "conditional \"DX_COND_xml\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${DX_COND_xml_TRUE}" && test -z "${DX_COND_xml_FALSE}"; then + as_fn_error $? "conditional \"DX_COND_xml\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${DX_COND_chm_TRUE}" && test -z "${DX_COND_chm_FALSE}"; then + as_fn_error $? "conditional \"DX_COND_chm\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${DX_COND_chm_TRUE}" && test -z "${DX_COND_chm_FALSE}"; then + as_fn_error $? "conditional \"DX_COND_chm\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${DX_COND_chi_TRUE}" && test -z "${DX_COND_chi_FALSE}"; then + as_fn_error $? "conditional \"DX_COND_chi\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${DX_COND_chi_TRUE}" && test -z "${DX_COND_chi_FALSE}"; then + as_fn_error $? "conditional \"DX_COND_chi\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${DX_COND_html_TRUE}" && test -z "${DX_COND_html_FALSE}"; then + as_fn_error $? "conditional \"DX_COND_html\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${DX_COND_html_TRUE}" && test -z "${DX_COND_html_FALSE}"; then + as_fn_error $? "conditional \"DX_COND_html\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${DX_COND_ps_TRUE}" && test -z "${DX_COND_ps_FALSE}"; then + as_fn_error $? "conditional \"DX_COND_ps\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${DX_COND_ps_TRUE}" && test -z "${DX_COND_ps_FALSE}"; then + as_fn_error $? "conditional \"DX_COND_ps\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${DX_COND_pdf_TRUE}" && test -z "${DX_COND_pdf_FALSE}"; then + as_fn_error $? "conditional \"DX_COND_pdf\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${DX_COND_pdf_TRUE}" && test -z "${DX_COND_pdf_FALSE}"; then + as_fn_error $? "conditional \"DX_COND_pdf\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${DX_COND_latex_TRUE}" && test -z "${DX_COND_latex_FALSE}"; then + as_fn_error $? "conditional \"DX_COND_latex\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${DX_COND_latex_TRUE}" && test -z "${DX_COND_latex_FALSE}"; then + as_fn_error $? "conditional \"DX_COND_latex\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi + if test -n "$EXEEXT"; then + am__EXEEXT_TRUE= + am__EXEEXT_FALSE='#' +else + am__EXEEXT_TRUE='#' + am__EXEEXT_FALSE= +fi + +if test -z "${AMDEP_TRUE}" && test -z "${AMDEP_FALSE}"; then + as_fn_error $? "conditional \"AMDEP\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${am__fastdepCC_TRUE}" && test -z "${am__fastdepCC_FALSE}"; then + as_fn_error $? "conditional \"am__fastdepCC\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${am__fastdepCXX_TRUE}" && test -z "${am__fastdepCXX_FALSE}"; then + as_fn_error $? "conditional \"am__fastdepCXX\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${WANT_SYNCAPI_TRUE}" && test -z "${WANT_SYNCAPI_FALSE}"; then + as_fn_error $? "conditional \"WANT_SYNCAPI\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi + +: "${CONFIG_STATUS=./config.status}" +ac_write_fail=0 +ac_clean_files_save=$ac_clean_files +ac_clean_files="$ac_clean_files $CONFIG_STATUS" +{ $as_echo "$as_me:${as_lineno-$LINENO}: creating $CONFIG_STATUS" >&5 +$as_echo "$as_me: creating $CONFIG_STATUS" >&6;} +as_write_fail=0 +cat >$CONFIG_STATUS <<_ASEOF || as_write_fail=1 +#! $SHELL +# Generated by $as_me. +# Run this file to recreate the current configuration. +# Compiler output produced by configure, useful for debugging +# configure, is in config.log if it exists. + +debug=false +ac_cs_recheck=false +ac_cs_silent=false + +SHELL=\${CONFIG_SHELL-$SHELL} +export SHELL +_ASEOF +cat >>$CONFIG_STATUS <<\_ASEOF || as_write_fail=1 +## -------------------- ## +## M4sh Initialization. ## +## -------------------- ## + +# Be more Bourne compatible +DUALCASE=1; export DUALCASE # for MKS sh +if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : + emulate sh + NULLCMD=: + # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which + # is contrary to our usage. Disable this feature. + alias -g '${1+"$@"}'='"$@"' + setopt NO_GLOB_SUBST +else + case `(set -o) 2>/dev/null` in @%:@( + *posix*) : + set -o posix ;; @%:@( + *) : + ;; +esac +fi + + +as_nl=' +' +export as_nl +# Printing a long string crashes Solaris 7 /usr/bin/printf. +as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' +as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo +as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo +# Prefer a ksh shell builtin over an external printf program on Solaris, +# but without wasting forks for bash or zsh. +if test -z "$BASH_VERSION$ZSH_VERSION" \ + && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then + as_echo='print -r --' + as_echo_n='print -rn --' +elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then + as_echo='printf %s\n' + as_echo_n='printf %s' +else + if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then + as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' + as_echo_n='/usr/ucb/echo -n' + else + as_echo_body='eval expr "X$1" : "X\\(.*\\)"' + as_echo_n_body='eval + arg=$1; + case $arg in @%:@( + *"$as_nl"*) + expr "X$arg" : "X\\(.*\\)$as_nl"; + arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; + esac; + expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" + ' + export as_echo_n_body + as_echo_n='sh -c $as_echo_n_body as_echo' + fi + export as_echo_body + as_echo='sh -c $as_echo_body as_echo' +fi + +# The user is always right. +if test "${PATH_SEPARATOR+set}" != set; then + PATH_SEPARATOR=: + (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { + (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || + PATH_SEPARATOR=';' + } +fi + + +# IFS +# We need space, tab and new line, in precisely that order. Quoting is +# there to prevent editors from complaining about space-tab. +# (If _AS_PATH_WALK were called with IFS unset, it would disable word +# splitting by setting IFS to empty value.) +IFS=" "" $as_nl" + +# Find who we are. Look in the path if we contain no directory separator. +as_myself= +case $0 in @%:@(( + *[\\/]* ) as_myself=$0 ;; + *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break + done +IFS=$as_save_IFS + + ;; +esac +# We did not find ourselves, most probably we were run as `sh COMMAND' +# in which case we are not to be found in the path. +if test "x$as_myself" = x; then + as_myself=$0 +fi +if test ! -f "$as_myself"; then + $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 + exit 1 +fi + +# Unset variables that we do not need and which cause bugs (e.g. in +# pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" +# suppresses any "Segmentation fault" message there. '((' could +# trigger a bug in pdksh 5.2.14. +for as_var in BASH_ENV ENV MAIL MAILPATH +do eval test x\${$as_var+set} = xset \ + && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : +done +PS1='$ ' +PS2='> ' +PS4='+ ' + +# NLS nuisances. +LC_ALL=C +export LC_ALL +LANGUAGE=C +export LANGUAGE + +# CDPATH. +(unset CDPATH) >/dev/null 2>&1 && unset CDPATH + + +@%:@ as_fn_error STATUS ERROR [LINENO LOG_FD] +@%:@ ---------------------------------------- +@%:@ Output "`basename @S|@0`: error: ERROR" to stderr. If LINENO and LOG_FD are +@%:@ provided, also output the error to LOG_FD, referencing LINENO. Then exit the +@%:@ script with STATUS, using 1 if that was 0. +as_fn_error () +{ + as_status=$1; test $as_status -eq 0 && as_status=1 + if test "$4"; then + as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 + fi + $as_echo "$as_me: error: $2" >&2 + as_fn_exit $as_status +} @%:@ as_fn_error + + +@%:@ as_fn_set_status STATUS +@%:@ ----------------------- +@%:@ Set @S|@? to STATUS, without forking. +as_fn_set_status () +{ + return $1 +} @%:@ as_fn_set_status + +@%:@ as_fn_exit STATUS +@%:@ ----------------- +@%:@ Exit the shell with STATUS, even in a "trap 0" or "set -e" context. +as_fn_exit () +{ + set +e + as_fn_set_status $1 + exit $1 +} @%:@ as_fn_exit + +@%:@ as_fn_unset VAR +@%:@ --------------- +@%:@ Portably unset VAR. +as_fn_unset () +{ + { eval $1=; unset $1;} +} +as_unset=as_fn_unset +@%:@ as_fn_append VAR VALUE +@%:@ ---------------------- +@%:@ Append the text in VALUE to the end of the definition contained in VAR. Take +@%:@ advantage of any shell optimizations that allow amortized linear growth over +@%:@ repeated appends, instead of the typical quadratic growth present in naive +@%:@ implementations. +if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : + eval 'as_fn_append () + { + eval $1+=\$2 + }' +else + as_fn_append () + { + eval $1=\$$1\$2 + } +fi # as_fn_append + +@%:@ as_fn_arith ARG... +@%:@ ------------------ +@%:@ Perform arithmetic evaluation on the ARGs, and store the result in the +@%:@ global @S|@as_val. Take advantage of shells that can avoid forks. The arguments +@%:@ must be portable across @S|@(()) and expr. +if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : + eval 'as_fn_arith () + { + as_val=$(( $* )) + }' +else + as_fn_arith () + { + as_val=`expr "$@" || test $? -eq 1` + } +fi # as_fn_arith + + +if expr a : '\(a\)' >/dev/null 2>&1 && + test "X`expr 00001 : '.*\(...\)'`" = X001; then + as_expr=expr +else + as_expr=false +fi + +if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then + as_basename=basename +else + as_basename=false +fi + +if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then + as_dirname=dirname +else + as_dirname=false +fi + +as_me=`$as_basename -- "$0" || +$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ + X"$0" : 'X\(//\)$' \| \ + X"$0" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X/"$0" | + sed '/^.*\/\([^/][^/]*\)\/*$/{ + s//\1/ + q + } + /^X\/\(\/\/\)$/{ + s//\1/ + q + } + /^X\/\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + +# Avoid depending upon Character Ranges. +as_cr_letters='abcdefghijklmnopqrstuvwxyz' +as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' +as_cr_Letters=$as_cr_letters$as_cr_LETTERS +as_cr_digits='0123456789' +as_cr_alnum=$as_cr_Letters$as_cr_digits + +ECHO_C= ECHO_N= ECHO_T= +case `echo -n x` in @%:@((((( +-n*) + case `echo 'xy\c'` in + *c*) ECHO_T=' ';; # ECHO_T is single tab character. + xy) ECHO_C='\c';; + *) echo `echo ksh88 bug on AIX 6.1` > /dev/null + ECHO_T=' ';; + esac;; +*) + ECHO_N='-n';; +esac + +rm -f conf$$ conf$$.exe conf$$.file +if test -d conf$$.dir; then + rm -f conf$$.dir/conf$$.file +else + rm -f conf$$.dir + mkdir conf$$.dir 2>/dev/null +fi +if (echo >conf$$.file) 2>/dev/null; then + if ln -s conf$$.file conf$$ 2>/dev/null; then + as_ln_s='ln -s' + # ... but there are two gotchas: + # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. + # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. + # In both cases, we have to default to `cp -pR'. + ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || + as_ln_s='cp -pR' + elif ln conf$$.file conf$$ 2>/dev/null; then + as_ln_s=ln + else + as_ln_s='cp -pR' + fi +else + as_ln_s='cp -pR' +fi +rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file +rmdir conf$$.dir 2>/dev/null + + +@%:@ as_fn_mkdir_p +@%:@ ------------- +@%:@ Create "@S|@as_dir" as a directory, including parents if necessary. +as_fn_mkdir_p () +{ + + case $as_dir in #( + -*) as_dir=./$as_dir;; + esac + test -d "$as_dir" || eval $as_mkdir_p || { + as_dirs= + while :; do + case $as_dir in #( + *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( + *) as_qdir=$as_dir;; + esac + as_dirs="'$as_qdir' $as_dirs" + as_dir=`$as_dirname -- "$as_dir" || +$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$as_dir" : 'X\(//\)[^/]' \| \ + X"$as_dir" : 'X\(//\)$' \| \ + X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$as_dir" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + test -d "$as_dir" && break + done + test -z "$as_dirs" || eval "mkdir $as_dirs" + } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" + + +} @%:@ as_fn_mkdir_p +if mkdir -p . 2>/dev/null; then + as_mkdir_p='mkdir -p "$as_dir"' +else + test -d ./-p && rmdir ./-p + as_mkdir_p=false +fi + + +@%:@ as_fn_executable_p FILE +@%:@ ----------------------- +@%:@ Test if FILE is an executable regular file. +as_fn_executable_p () +{ + test -f "$1" && test -x "$1" +} @%:@ as_fn_executable_p +as_test_x='test -x' +as_executable_p=as_fn_executable_p + +# Sed expression to map a string onto a valid CPP name. +as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" + +# Sed expression to map a string onto a valid variable name. +as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" + + +exec 6>&1 +## ----------------------------------- ## +## Main body of $CONFIG_STATUS script. ## +## ----------------------------------- ## +_ASEOF +test $as_write_fail = 0 && chmod +x $CONFIG_STATUS || ac_write_fail=1 + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +# Save the log message, to keep $0 and so on meaningful, and to +# report actual input values of CONFIG_FILES etc. instead of their +# values after options handling. +ac_log=" +This file was extended by zookeeper C client $as_me 3.4.6, which was +generated by GNU Autoconf 2.69. Invocation command line was + + CONFIG_FILES = $CONFIG_FILES + CONFIG_HEADERS = $CONFIG_HEADERS + CONFIG_LINKS = $CONFIG_LINKS + CONFIG_COMMANDS = $CONFIG_COMMANDS + $ $0 $@ + +on `(hostname || uname -n) 2>/dev/null | sed 1q` +" + +_ACEOF + +case $ac_config_files in *" +"*) set x $ac_config_files; shift; ac_config_files=$*;; +esac + +case $ac_config_headers in *" +"*) set x $ac_config_headers; shift; ac_config_headers=$*;; +esac + + +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +# Files that config.status was made for. +config_files="$ac_config_files" +config_headers="$ac_config_headers" +config_commands="$ac_config_commands" + +_ACEOF + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +ac_cs_usage="\ +\`$as_me' instantiates files and other configuration actions +from templates according to the current configuration. Unless the files +and actions are specified as TAGs, all are instantiated by default. + +Usage: $0 [OPTION]... [TAG]... + + -h, --help print this help, then exit + -V, --version print version number and configuration settings, then exit + --config print configuration, then exit + -q, --quiet, --silent + do not print progress messages + -d, --debug don't remove temporary files + --recheck update $as_me by reconfiguring in the same conditions + --file=FILE[:TEMPLATE] + instantiate the configuration file FILE + --header=FILE[:TEMPLATE] + instantiate the configuration header FILE + +Configuration files: +$config_files + +Configuration headers: +$config_headers + +Configuration commands: +$config_commands + +Report bugs to ." + +_ACEOF +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" +ac_cs_version="\\ +zookeeper C client config.status 3.4.6 +configured by $0, generated by GNU Autoconf 2.69, + with options \\"\$ac_cs_config\\" + +Copyright (C) 2012 Free Software Foundation, Inc. +This config.status script is free software; the Free Software Foundation +gives unlimited permission to copy, distribute and modify it." + +ac_pwd='$ac_pwd' +srcdir='$srcdir' +INSTALL='$INSTALL' +MKDIR_P='$MKDIR_P' +AWK='$AWK' +test -n "\$AWK" || AWK=awk +_ACEOF + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +# The default lists apply if the user does not specify any file. +ac_need_defaults=: +while test $# != 0 +do + case $1 in + --*=?*) + ac_option=`expr "X$1" : 'X\([^=]*\)='` + ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'` + ac_shift=: + ;; + --*=) + ac_option=`expr "X$1" : 'X\([^=]*\)='` + ac_optarg= + ac_shift=: + ;; + *) + ac_option=$1 + ac_optarg=$2 + ac_shift=shift + ;; + esac + + case $ac_option in + # Handling of the options. + -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) + ac_cs_recheck=: ;; + --version | --versio | --versi | --vers | --ver | --ve | --v | -V ) + $as_echo "$ac_cs_version"; exit ;; + --config | --confi | --conf | --con | --co | --c ) + $as_echo "$ac_cs_config"; exit ;; + --debug | --debu | --deb | --de | --d | -d ) + debug=: ;; + --file | --fil | --fi | --f ) + $ac_shift + case $ac_optarg in + *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; + '') as_fn_error $? "missing file argument" ;; + esac + as_fn_append CONFIG_FILES " '$ac_optarg'" + ac_need_defaults=false;; + --header | --heade | --head | --hea ) + $ac_shift + case $ac_optarg in + *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; + esac + as_fn_append CONFIG_HEADERS " '$ac_optarg'" + ac_need_defaults=false;; + --he | --h) + # Conflict between --help and --header + as_fn_error $? "ambiguous option: \`$1' +Try \`$0 --help' for more information.";; + --help | --hel | -h ) + $as_echo "$ac_cs_usage"; exit ;; + -q | -quiet | --quiet | --quie | --qui | --qu | --q \ + | -silent | --silent | --silen | --sile | --sil | --si | --s) + ac_cs_silent=: ;; + + # This is an error. + -*) as_fn_error $? "unrecognized option: \`$1' +Try \`$0 --help' for more information." ;; + + *) as_fn_append ac_config_targets " $1" + ac_need_defaults=false ;; + + esac + shift +done + +ac_configure_extra_args= + +if $ac_cs_silent; then + exec 6>/dev/null + ac_configure_extra_args="$ac_configure_extra_args --silent" +fi + +_ACEOF +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +if \$ac_cs_recheck; then + set X $SHELL '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion + shift + \$as_echo "running CONFIG_SHELL=$SHELL \$*" >&6 + CONFIG_SHELL='$SHELL' + export CONFIG_SHELL + exec "\$@" +fi + +_ACEOF +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +exec 5>>config.log +{ + echo + sed 'h;s/./-/g;s/^.../@%:@@%:@ /;s/...$/ @%:@@%:@/;p;x;p;x' <<_ASBOX +@%:@@%:@ Running $as_me. @%:@@%:@ +_ASBOX + $as_echo "$ac_log" +} >&5 + +_ACEOF +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +# +# INIT-COMMANDS +# +AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir" + + +# The HP-UX ksh and POSIX shell print the target directory to stdout +# if CDPATH is set. +(unset CDPATH) >/dev/null 2>&1 && unset CDPATH + +sed_quote_subst='$sed_quote_subst' +double_quote_subst='$double_quote_subst' +delay_variable_subst='$delay_variable_subst' +macro_version='`$ECHO "$macro_version" | $SED "$delay_single_quote_subst"`' +macro_revision='`$ECHO "$macro_revision" | $SED "$delay_single_quote_subst"`' +enable_shared='`$ECHO "$enable_shared" | $SED "$delay_single_quote_subst"`' +enable_static='`$ECHO "$enable_static" | $SED "$delay_single_quote_subst"`' +pic_mode='`$ECHO "$pic_mode" | $SED "$delay_single_quote_subst"`' +enable_fast_install='`$ECHO "$enable_fast_install" | $SED "$delay_single_quote_subst"`' +SHELL='`$ECHO "$SHELL" | $SED "$delay_single_quote_subst"`' +ECHO='`$ECHO "$ECHO" | $SED "$delay_single_quote_subst"`' +PATH_SEPARATOR='`$ECHO "$PATH_SEPARATOR" | $SED "$delay_single_quote_subst"`' +host_alias='`$ECHO "$host_alias" | $SED "$delay_single_quote_subst"`' +host='`$ECHO "$host" | $SED "$delay_single_quote_subst"`' +host_os='`$ECHO "$host_os" | $SED "$delay_single_quote_subst"`' +build_alias='`$ECHO "$build_alias" | $SED "$delay_single_quote_subst"`' +build='`$ECHO "$build" | $SED "$delay_single_quote_subst"`' +build_os='`$ECHO "$build_os" | $SED "$delay_single_quote_subst"`' +SED='`$ECHO "$SED" | $SED "$delay_single_quote_subst"`' +Xsed='`$ECHO "$Xsed" | $SED "$delay_single_quote_subst"`' +GREP='`$ECHO "$GREP" | $SED "$delay_single_quote_subst"`' +EGREP='`$ECHO "$EGREP" | $SED "$delay_single_quote_subst"`' +FGREP='`$ECHO "$FGREP" | $SED "$delay_single_quote_subst"`' +LD='`$ECHO "$LD" | $SED "$delay_single_quote_subst"`' +NM='`$ECHO "$NM" | $SED "$delay_single_quote_subst"`' +LN_S='`$ECHO "$LN_S" | $SED "$delay_single_quote_subst"`' +max_cmd_len='`$ECHO "$max_cmd_len" | $SED "$delay_single_quote_subst"`' +ac_objext='`$ECHO "$ac_objext" | $SED "$delay_single_quote_subst"`' +exeext='`$ECHO "$exeext" | $SED "$delay_single_quote_subst"`' +lt_unset='`$ECHO "$lt_unset" | $SED "$delay_single_quote_subst"`' +lt_SP2NL='`$ECHO "$lt_SP2NL" | $SED "$delay_single_quote_subst"`' +lt_NL2SP='`$ECHO "$lt_NL2SP" | $SED "$delay_single_quote_subst"`' +lt_cv_to_host_file_cmd='`$ECHO "$lt_cv_to_host_file_cmd" | $SED "$delay_single_quote_subst"`' +lt_cv_to_tool_file_cmd='`$ECHO "$lt_cv_to_tool_file_cmd" | $SED "$delay_single_quote_subst"`' +reload_flag='`$ECHO "$reload_flag" | $SED "$delay_single_quote_subst"`' +reload_cmds='`$ECHO "$reload_cmds" | $SED "$delay_single_quote_subst"`' +OBJDUMP='`$ECHO "$OBJDUMP" | $SED "$delay_single_quote_subst"`' +deplibs_check_method='`$ECHO "$deplibs_check_method" | $SED "$delay_single_quote_subst"`' +file_magic_cmd='`$ECHO "$file_magic_cmd" | $SED "$delay_single_quote_subst"`' +file_magic_glob='`$ECHO "$file_magic_glob" | $SED "$delay_single_quote_subst"`' +want_nocaseglob='`$ECHO "$want_nocaseglob" | $SED "$delay_single_quote_subst"`' +DLLTOOL='`$ECHO "$DLLTOOL" | $SED "$delay_single_quote_subst"`' +sharedlib_from_linklib_cmd='`$ECHO "$sharedlib_from_linklib_cmd" | $SED "$delay_single_quote_subst"`' +AR='`$ECHO "$AR" | $SED "$delay_single_quote_subst"`' +AR_FLAGS='`$ECHO "$AR_FLAGS" | $SED "$delay_single_quote_subst"`' +archiver_list_spec='`$ECHO "$archiver_list_spec" | $SED "$delay_single_quote_subst"`' +STRIP='`$ECHO "$STRIP" | $SED "$delay_single_quote_subst"`' +RANLIB='`$ECHO "$RANLIB" | $SED "$delay_single_quote_subst"`' +old_postinstall_cmds='`$ECHO "$old_postinstall_cmds" | $SED "$delay_single_quote_subst"`' +old_postuninstall_cmds='`$ECHO "$old_postuninstall_cmds" | $SED "$delay_single_quote_subst"`' +old_archive_cmds='`$ECHO "$old_archive_cmds" | $SED "$delay_single_quote_subst"`' +lock_old_archive_extraction='`$ECHO "$lock_old_archive_extraction" | $SED "$delay_single_quote_subst"`' +CC='`$ECHO "$CC" | $SED "$delay_single_quote_subst"`' +CFLAGS='`$ECHO "$CFLAGS" | $SED "$delay_single_quote_subst"`' +compiler='`$ECHO "$compiler" | $SED "$delay_single_quote_subst"`' +GCC='`$ECHO "$GCC" | $SED "$delay_single_quote_subst"`' +lt_cv_sys_global_symbol_pipe='`$ECHO "$lt_cv_sys_global_symbol_pipe" | $SED "$delay_single_quote_subst"`' +lt_cv_sys_global_symbol_to_cdecl='`$ECHO "$lt_cv_sys_global_symbol_to_cdecl" | $SED "$delay_single_quote_subst"`' +lt_cv_sys_global_symbol_to_c_name_address='`$ECHO "$lt_cv_sys_global_symbol_to_c_name_address" | $SED "$delay_single_quote_subst"`' +lt_cv_sys_global_symbol_to_c_name_address_lib_prefix='`$ECHO "$lt_cv_sys_global_symbol_to_c_name_address_lib_prefix" | $SED "$delay_single_quote_subst"`' +nm_file_list_spec='`$ECHO "$nm_file_list_spec" | $SED "$delay_single_quote_subst"`' +lt_sysroot='`$ECHO "$lt_sysroot" | $SED "$delay_single_quote_subst"`' +objdir='`$ECHO "$objdir" | $SED "$delay_single_quote_subst"`' +MAGIC_CMD='`$ECHO "$MAGIC_CMD" | $SED "$delay_single_quote_subst"`' +lt_prog_compiler_no_builtin_flag='`$ECHO "$lt_prog_compiler_no_builtin_flag" | $SED "$delay_single_quote_subst"`' +lt_prog_compiler_pic='`$ECHO "$lt_prog_compiler_pic" | $SED "$delay_single_quote_subst"`' +lt_prog_compiler_wl='`$ECHO "$lt_prog_compiler_wl" | $SED "$delay_single_quote_subst"`' +lt_prog_compiler_static='`$ECHO "$lt_prog_compiler_static" | $SED "$delay_single_quote_subst"`' +lt_cv_prog_compiler_c_o='`$ECHO "$lt_cv_prog_compiler_c_o" | $SED "$delay_single_quote_subst"`' +need_locks='`$ECHO "$need_locks" | $SED "$delay_single_quote_subst"`' +MANIFEST_TOOL='`$ECHO "$MANIFEST_TOOL" | $SED "$delay_single_quote_subst"`' +DSYMUTIL='`$ECHO "$DSYMUTIL" | $SED "$delay_single_quote_subst"`' +NMEDIT='`$ECHO "$NMEDIT" | $SED "$delay_single_quote_subst"`' +LIPO='`$ECHO "$LIPO" | $SED "$delay_single_quote_subst"`' +OTOOL='`$ECHO "$OTOOL" | $SED "$delay_single_quote_subst"`' +OTOOL64='`$ECHO "$OTOOL64" | $SED "$delay_single_quote_subst"`' +libext='`$ECHO "$libext" | $SED "$delay_single_quote_subst"`' +shrext_cmds='`$ECHO "$shrext_cmds" | $SED "$delay_single_quote_subst"`' +extract_expsyms_cmds='`$ECHO "$extract_expsyms_cmds" | $SED "$delay_single_quote_subst"`' +archive_cmds_need_lc='`$ECHO "$archive_cmds_need_lc" | $SED "$delay_single_quote_subst"`' +enable_shared_with_static_runtimes='`$ECHO "$enable_shared_with_static_runtimes" | $SED "$delay_single_quote_subst"`' +export_dynamic_flag_spec='`$ECHO "$export_dynamic_flag_spec" | $SED "$delay_single_quote_subst"`' +whole_archive_flag_spec='`$ECHO "$whole_archive_flag_spec" | $SED "$delay_single_quote_subst"`' +compiler_needs_object='`$ECHO "$compiler_needs_object" | $SED "$delay_single_quote_subst"`' +old_archive_from_new_cmds='`$ECHO "$old_archive_from_new_cmds" | $SED "$delay_single_quote_subst"`' +old_archive_from_expsyms_cmds='`$ECHO "$old_archive_from_expsyms_cmds" | $SED "$delay_single_quote_subst"`' +archive_cmds='`$ECHO "$archive_cmds" | $SED "$delay_single_quote_subst"`' +archive_expsym_cmds='`$ECHO "$archive_expsym_cmds" | $SED "$delay_single_quote_subst"`' +module_cmds='`$ECHO "$module_cmds" | $SED "$delay_single_quote_subst"`' +module_expsym_cmds='`$ECHO "$module_expsym_cmds" | $SED "$delay_single_quote_subst"`' +with_gnu_ld='`$ECHO "$with_gnu_ld" | $SED "$delay_single_quote_subst"`' +allow_undefined_flag='`$ECHO "$allow_undefined_flag" | $SED "$delay_single_quote_subst"`' +no_undefined_flag='`$ECHO "$no_undefined_flag" | $SED "$delay_single_quote_subst"`' +hardcode_libdir_flag_spec='`$ECHO "$hardcode_libdir_flag_spec" | $SED "$delay_single_quote_subst"`' +hardcode_libdir_separator='`$ECHO "$hardcode_libdir_separator" | $SED "$delay_single_quote_subst"`' +hardcode_direct='`$ECHO "$hardcode_direct" | $SED "$delay_single_quote_subst"`' +hardcode_direct_absolute='`$ECHO "$hardcode_direct_absolute" | $SED "$delay_single_quote_subst"`' +hardcode_minus_L='`$ECHO "$hardcode_minus_L" | $SED "$delay_single_quote_subst"`' +hardcode_shlibpath_var='`$ECHO "$hardcode_shlibpath_var" | $SED "$delay_single_quote_subst"`' +hardcode_automatic='`$ECHO "$hardcode_automatic" | $SED "$delay_single_quote_subst"`' +inherit_rpath='`$ECHO "$inherit_rpath" | $SED "$delay_single_quote_subst"`' +link_all_deplibs='`$ECHO "$link_all_deplibs" | $SED "$delay_single_quote_subst"`' +always_export_symbols='`$ECHO "$always_export_symbols" | $SED "$delay_single_quote_subst"`' +export_symbols_cmds='`$ECHO "$export_symbols_cmds" | $SED "$delay_single_quote_subst"`' +exclude_expsyms='`$ECHO "$exclude_expsyms" | $SED "$delay_single_quote_subst"`' +include_expsyms='`$ECHO "$include_expsyms" | $SED "$delay_single_quote_subst"`' +prelink_cmds='`$ECHO "$prelink_cmds" | $SED "$delay_single_quote_subst"`' +postlink_cmds='`$ECHO "$postlink_cmds" | $SED "$delay_single_quote_subst"`' +file_list_spec='`$ECHO "$file_list_spec" | $SED "$delay_single_quote_subst"`' +variables_saved_for_relink='`$ECHO "$variables_saved_for_relink" | $SED "$delay_single_quote_subst"`' +need_lib_prefix='`$ECHO "$need_lib_prefix" | $SED "$delay_single_quote_subst"`' +need_version='`$ECHO "$need_version" | $SED "$delay_single_quote_subst"`' +version_type='`$ECHO "$version_type" | $SED "$delay_single_quote_subst"`' +runpath_var='`$ECHO "$runpath_var" | $SED "$delay_single_quote_subst"`' +shlibpath_var='`$ECHO "$shlibpath_var" | $SED "$delay_single_quote_subst"`' +shlibpath_overrides_runpath='`$ECHO "$shlibpath_overrides_runpath" | $SED "$delay_single_quote_subst"`' +libname_spec='`$ECHO "$libname_spec" | $SED "$delay_single_quote_subst"`' +library_names_spec='`$ECHO "$library_names_spec" | $SED "$delay_single_quote_subst"`' +soname_spec='`$ECHO "$soname_spec" | $SED "$delay_single_quote_subst"`' +install_override_mode='`$ECHO "$install_override_mode" | $SED "$delay_single_quote_subst"`' +postinstall_cmds='`$ECHO "$postinstall_cmds" | $SED "$delay_single_quote_subst"`' +postuninstall_cmds='`$ECHO "$postuninstall_cmds" | $SED "$delay_single_quote_subst"`' +finish_cmds='`$ECHO "$finish_cmds" | $SED "$delay_single_quote_subst"`' +finish_eval='`$ECHO "$finish_eval" | $SED "$delay_single_quote_subst"`' +hardcode_into_libs='`$ECHO "$hardcode_into_libs" | $SED "$delay_single_quote_subst"`' +sys_lib_search_path_spec='`$ECHO "$sys_lib_search_path_spec" | $SED "$delay_single_quote_subst"`' +sys_lib_dlsearch_path_spec='`$ECHO "$sys_lib_dlsearch_path_spec" | $SED "$delay_single_quote_subst"`' +hardcode_action='`$ECHO "$hardcode_action" | $SED "$delay_single_quote_subst"`' +enable_dlopen='`$ECHO "$enable_dlopen" | $SED "$delay_single_quote_subst"`' +enable_dlopen_self='`$ECHO "$enable_dlopen_self" | $SED "$delay_single_quote_subst"`' +enable_dlopen_self_static='`$ECHO "$enable_dlopen_self_static" | $SED "$delay_single_quote_subst"`' +old_striplib='`$ECHO "$old_striplib" | $SED "$delay_single_quote_subst"`' +striplib='`$ECHO "$striplib" | $SED "$delay_single_quote_subst"`' +compiler_lib_search_dirs='`$ECHO "$compiler_lib_search_dirs" | $SED "$delay_single_quote_subst"`' +predep_objects='`$ECHO "$predep_objects" | $SED "$delay_single_quote_subst"`' +postdep_objects='`$ECHO "$postdep_objects" | $SED "$delay_single_quote_subst"`' +predeps='`$ECHO "$predeps" | $SED "$delay_single_quote_subst"`' +postdeps='`$ECHO "$postdeps" | $SED "$delay_single_quote_subst"`' +compiler_lib_search_path='`$ECHO "$compiler_lib_search_path" | $SED "$delay_single_quote_subst"`' +LD_CXX='`$ECHO "$LD_CXX" | $SED "$delay_single_quote_subst"`' +reload_flag_CXX='`$ECHO "$reload_flag_CXX" | $SED "$delay_single_quote_subst"`' +reload_cmds_CXX='`$ECHO "$reload_cmds_CXX" | $SED "$delay_single_quote_subst"`' +old_archive_cmds_CXX='`$ECHO "$old_archive_cmds_CXX" | $SED "$delay_single_quote_subst"`' +compiler_CXX='`$ECHO "$compiler_CXX" | $SED "$delay_single_quote_subst"`' +GCC_CXX='`$ECHO "$GCC_CXX" | $SED "$delay_single_quote_subst"`' +lt_prog_compiler_no_builtin_flag_CXX='`$ECHO "$lt_prog_compiler_no_builtin_flag_CXX" | $SED "$delay_single_quote_subst"`' +lt_prog_compiler_pic_CXX='`$ECHO "$lt_prog_compiler_pic_CXX" | $SED "$delay_single_quote_subst"`' +lt_prog_compiler_wl_CXX='`$ECHO "$lt_prog_compiler_wl_CXX" | $SED "$delay_single_quote_subst"`' +lt_prog_compiler_static_CXX='`$ECHO "$lt_prog_compiler_static_CXX" | $SED "$delay_single_quote_subst"`' +lt_cv_prog_compiler_c_o_CXX='`$ECHO "$lt_cv_prog_compiler_c_o_CXX" | $SED "$delay_single_quote_subst"`' +archive_cmds_need_lc_CXX='`$ECHO "$archive_cmds_need_lc_CXX" | $SED "$delay_single_quote_subst"`' +enable_shared_with_static_runtimes_CXX='`$ECHO "$enable_shared_with_static_runtimes_CXX" | $SED "$delay_single_quote_subst"`' +export_dynamic_flag_spec_CXX='`$ECHO "$export_dynamic_flag_spec_CXX" | $SED "$delay_single_quote_subst"`' +whole_archive_flag_spec_CXX='`$ECHO "$whole_archive_flag_spec_CXX" | $SED "$delay_single_quote_subst"`' +compiler_needs_object_CXX='`$ECHO "$compiler_needs_object_CXX" | $SED "$delay_single_quote_subst"`' +old_archive_from_new_cmds_CXX='`$ECHO "$old_archive_from_new_cmds_CXX" | $SED "$delay_single_quote_subst"`' +old_archive_from_expsyms_cmds_CXX='`$ECHO "$old_archive_from_expsyms_cmds_CXX" | $SED "$delay_single_quote_subst"`' +archive_cmds_CXX='`$ECHO "$archive_cmds_CXX" | $SED "$delay_single_quote_subst"`' +archive_expsym_cmds_CXX='`$ECHO "$archive_expsym_cmds_CXX" | $SED "$delay_single_quote_subst"`' +module_cmds_CXX='`$ECHO "$module_cmds_CXX" | $SED "$delay_single_quote_subst"`' +module_expsym_cmds_CXX='`$ECHO "$module_expsym_cmds_CXX" | $SED "$delay_single_quote_subst"`' +with_gnu_ld_CXX='`$ECHO "$with_gnu_ld_CXX" | $SED "$delay_single_quote_subst"`' +allow_undefined_flag_CXX='`$ECHO "$allow_undefined_flag_CXX" | $SED "$delay_single_quote_subst"`' +no_undefined_flag_CXX='`$ECHO "$no_undefined_flag_CXX" | $SED "$delay_single_quote_subst"`' +hardcode_libdir_flag_spec_CXX='`$ECHO "$hardcode_libdir_flag_spec_CXX" | $SED "$delay_single_quote_subst"`' +hardcode_libdir_separator_CXX='`$ECHO "$hardcode_libdir_separator_CXX" | $SED "$delay_single_quote_subst"`' +hardcode_direct_CXX='`$ECHO "$hardcode_direct_CXX" | $SED "$delay_single_quote_subst"`' +hardcode_direct_absolute_CXX='`$ECHO "$hardcode_direct_absolute_CXX" | $SED "$delay_single_quote_subst"`' +hardcode_minus_L_CXX='`$ECHO "$hardcode_minus_L_CXX" | $SED "$delay_single_quote_subst"`' +hardcode_shlibpath_var_CXX='`$ECHO "$hardcode_shlibpath_var_CXX" | $SED "$delay_single_quote_subst"`' +hardcode_automatic_CXX='`$ECHO "$hardcode_automatic_CXX" | $SED "$delay_single_quote_subst"`' +inherit_rpath_CXX='`$ECHO "$inherit_rpath_CXX" | $SED "$delay_single_quote_subst"`' +link_all_deplibs_CXX='`$ECHO "$link_all_deplibs_CXX" | $SED "$delay_single_quote_subst"`' +always_export_symbols_CXX='`$ECHO "$always_export_symbols_CXX" | $SED "$delay_single_quote_subst"`' +export_symbols_cmds_CXX='`$ECHO "$export_symbols_cmds_CXX" | $SED "$delay_single_quote_subst"`' +exclude_expsyms_CXX='`$ECHO "$exclude_expsyms_CXX" | $SED "$delay_single_quote_subst"`' +include_expsyms_CXX='`$ECHO "$include_expsyms_CXX" | $SED "$delay_single_quote_subst"`' +prelink_cmds_CXX='`$ECHO "$prelink_cmds_CXX" | $SED "$delay_single_quote_subst"`' +postlink_cmds_CXX='`$ECHO "$postlink_cmds_CXX" | $SED "$delay_single_quote_subst"`' +file_list_spec_CXX='`$ECHO "$file_list_spec_CXX" | $SED "$delay_single_quote_subst"`' +hardcode_action_CXX='`$ECHO "$hardcode_action_CXX" | $SED "$delay_single_quote_subst"`' +compiler_lib_search_dirs_CXX='`$ECHO "$compiler_lib_search_dirs_CXX" | $SED "$delay_single_quote_subst"`' +predep_objects_CXX='`$ECHO "$predep_objects_CXX" | $SED "$delay_single_quote_subst"`' +postdep_objects_CXX='`$ECHO "$postdep_objects_CXX" | $SED "$delay_single_quote_subst"`' +predeps_CXX='`$ECHO "$predeps_CXX" | $SED "$delay_single_quote_subst"`' +postdeps_CXX='`$ECHO "$postdeps_CXX" | $SED "$delay_single_quote_subst"`' +compiler_lib_search_path_CXX='`$ECHO "$compiler_lib_search_path_CXX" | $SED "$delay_single_quote_subst"`' + +LTCC='$LTCC' +LTCFLAGS='$LTCFLAGS' +compiler='$compiler_DEFAULT' + +# A function that is used when there is no print builtin or printf. +func_fallback_echo () +{ + eval 'cat <<_LTECHO_EOF +\$1 +_LTECHO_EOF' +} + +# Quote evaled strings. +for var in SHELL \ +ECHO \ +PATH_SEPARATOR \ +SED \ +GREP \ +EGREP \ +FGREP \ +LD \ +NM \ +LN_S \ +lt_SP2NL \ +lt_NL2SP \ +reload_flag \ +OBJDUMP \ +deplibs_check_method \ +file_magic_cmd \ +file_magic_glob \ +want_nocaseglob \ +DLLTOOL \ +sharedlib_from_linklib_cmd \ +AR \ +AR_FLAGS \ +archiver_list_spec \ +STRIP \ +RANLIB \ +CC \ +CFLAGS \ +compiler \ +lt_cv_sys_global_symbol_pipe \ +lt_cv_sys_global_symbol_to_cdecl \ +lt_cv_sys_global_symbol_to_c_name_address \ +lt_cv_sys_global_symbol_to_c_name_address_lib_prefix \ +nm_file_list_spec \ +lt_prog_compiler_no_builtin_flag \ +lt_prog_compiler_pic \ +lt_prog_compiler_wl \ +lt_prog_compiler_static \ +lt_cv_prog_compiler_c_o \ +need_locks \ +MANIFEST_TOOL \ +DSYMUTIL \ +NMEDIT \ +LIPO \ +OTOOL \ +OTOOL64 \ +shrext_cmds \ +export_dynamic_flag_spec \ +whole_archive_flag_spec \ +compiler_needs_object \ +with_gnu_ld \ +allow_undefined_flag \ +no_undefined_flag \ +hardcode_libdir_flag_spec \ +hardcode_libdir_separator \ +exclude_expsyms \ +include_expsyms \ +file_list_spec \ +variables_saved_for_relink \ +libname_spec \ +library_names_spec \ +soname_spec \ +install_override_mode \ +finish_eval \ +old_striplib \ +striplib \ +compiler_lib_search_dirs \ +predep_objects \ +postdep_objects \ +predeps \ +postdeps \ +compiler_lib_search_path \ +LD_CXX \ +reload_flag_CXX \ +compiler_CXX \ +lt_prog_compiler_no_builtin_flag_CXX \ +lt_prog_compiler_pic_CXX \ +lt_prog_compiler_wl_CXX \ +lt_prog_compiler_static_CXX \ +lt_cv_prog_compiler_c_o_CXX \ +export_dynamic_flag_spec_CXX \ +whole_archive_flag_spec_CXX \ +compiler_needs_object_CXX \ +with_gnu_ld_CXX \ +allow_undefined_flag_CXX \ +no_undefined_flag_CXX \ +hardcode_libdir_flag_spec_CXX \ +hardcode_libdir_separator_CXX \ +exclude_expsyms_CXX \ +include_expsyms_CXX \ +file_list_spec_CXX \ +compiler_lib_search_dirs_CXX \ +predep_objects_CXX \ +postdep_objects_CXX \ +predeps_CXX \ +postdeps_CXX \ +compiler_lib_search_path_CXX; do + case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in + *[\\\\\\\`\\"\\\$]*) + eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED \\"\\\$sed_quote_subst\\"\\\`\\\\\\"" + ;; + *) + eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\"" + ;; + esac +done + +# Double-quote double-evaled strings. +for var in reload_cmds \ +old_postinstall_cmds \ +old_postuninstall_cmds \ +old_archive_cmds \ +extract_expsyms_cmds \ +old_archive_from_new_cmds \ +old_archive_from_expsyms_cmds \ +archive_cmds \ +archive_expsym_cmds \ +module_cmds \ +module_expsym_cmds \ +export_symbols_cmds \ +prelink_cmds \ +postlink_cmds \ +postinstall_cmds \ +postuninstall_cmds \ +finish_cmds \ +sys_lib_search_path_spec \ +sys_lib_dlsearch_path_spec \ +reload_cmds_CXX \ +old_archive_cmds_CXX \ +old_archive_from_new_cmds_CXX \ +old_archive_from_expsyms_cmds_CXX \ +archive_cmds_CXX \ +archive_expsym_cmds_CXX \ +module_cmds_CXX \ +module_expsym_cmds_CXX \ +export_symbols_cmds_CXX \ +prelink_cmds_CXX \ +postlink_cmds_CXX; do + case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in + *[\\\\\\\`\\"\\\$]*) + eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED -e \\"\\\$double_quote_subst\\" -e \\"\\\$sed_quote_subst\\" -e \\"\\\$delay_variable_subst\\"\\\`\\\\\\"" + ;; + *) + eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\"" + ;; + esac +done + +ac_aux_dir='$ac_aux_dir' +xsi_shell='$xsi_shell' +lt_shell_append='$lt_shell_append' + +# See if we are running on zsh, and set the options which allow our +# commands through without removal of \ escapes INIT. +if test -n "\${ZSH_VERSION+set}" ; then + setopt NO_GLOB_SUBST +fi + + + PACKAGE='$PACKAGE' + VERSION='$VERSION' + TIMESTAMP='$TIMESTAMP' + RM='$RM' + ofile='$ofile' + + + + + + +_ACEOF + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 + +# Handling of arguments. +for ac_config_target in $ac_config_targets +do + case $ac_config_target in + "config.h") CONFIG_HEADERS="$CONFIG_HEADERS config.h" ;; + "depfiles") CONFIG_COMMANDS="$CONFIG_COMMANDS depfiles" ;; + "libtool") CONFIG_COMMANDS="$CONFIG_COMMANDS libtool" ;; + "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;; + + *) as_fn_error $? "invalid argument: \`$ac_config_target'" "$LINENO" 5;; + esac +done + + +# If the user did not use the arguments to specify the items to instantiate, +# then the envvar interface is used. Set only those that are not. +# We use the long form for the default assignment because of an extremely +# bizarre bug on SunOS 4.1.3. +if $ac_need_defaults; then + test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files + test "${CONFIG_HEADERS+set}" = set || CONFIG_HEADERS=$config_headers + test "${CONFIG_COMMANDS+set}" = set || CONFIG_COMMANDS=$config_commands +fi + +# Have a temporary directory for convenience. Make it in the build tree +# simply because there is no reason against having it here, and in addition, +# creating and moving files from /tmp can sometimes cause problems. +# Hook for its removal unless debugging. +# Note that there is a small window in which the directory will not be cleaned: +# after its creation but before its name has been assigned to `$tmp'. +$debug || +{ + tmp= ac_tmp= + trap 'exit_status=$? + : "${ac_tmp:=$tmp}" + { test ! -d "$ac_tmp" || rm -fr "$ac_tmp"; } && exit $exit_status +' 0 + trap 'as_fn_exit 1' 1 2 13 15 +} +# Create a (secure) tmp directory for tmp files. + +{ + tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` && + test -d "$tmp" +} || +{ + tmp=./conf$$-$RANDOM + (umask 077 && mkdir "$tmp") +} || as_fn_error $? "cannot create a temporary directory in ." "$LINENO" 5 +ac_tmp=$tmp + +# Set up the scripts for CONFIG_FILES section. +# No need to generate them if there are no CONFIG_FILES. +# This happens for instance with `./config.status config.h'. +if test -n "$CONFIG_FILES"; then + + +ac_cr=`echo X | tr X '\015'` +# On cygwin, bash can eat \r inside `` if the user requested igncr. +# But we know of no other shell where ac_cr would be empty at this +# point, so we can use a bashism as a fallback. +if test "x$ac_cr" = x; then + eval ac_cr=\$\'\\r\' +fi +ac_cs_awk_cr=`$AWK 'BEGIN { print "a\rb" }' /dev/null` +if test "$ac_cs_awk_cr" = "a${ac_cr}b"; then + ac_cs_awk_cr='\\r' +else + ac_cs_awk_cr=$ac_cr +fi + +echo 'BEGIN {' >"$ac_tmp/subs1.awk" && +_ACEOF + + +{ + echo "cat >conf$$subs.awk <<_ACEOF" && + echo "$ac_subst_vars" | sed 's/.*/&!$&$ac_delim/' && + echo "_ACEOF" +} >conf$$subs.sh || + as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 +ac_delim_num=`echo "$ac_subst_vars" | grep -c '^'` +ac_delim='%!_!# ' +for ac_last_try in false false false false false :; do + . ./conf$$subs.sh || + as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 + + ac_delim_n=`sed -n "s/.*$ac_delim\$/X/p" conf$$subs.awk | grep -c X` + if test $ac_delim_n = $ac_delim_num; then + break + elif $ac_last_try; then + as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 + else + ac_delim="$ac_delim!$ac_delim _$ac_delim!! " + fi +done +rm -f conf$$subs.sh + +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +cat >>"\$ac_tmp/subs1.awk" <<\\_ACAWK && +_ACEOF +sed -n ' +h +s/^/S["/; s/!.*/"]=/ +p +g +s/^[^!]*!// +:repl +t repl +s/'"$ac_delim"'$// +t delim +:nl +h +s/\(.\{148\}\)..*/\1/ +t more1 +s/["\\]/\\&/g; s/^/"/; s/$/\\n"\\/ +p +n +b repl +:more1 +s/["\\]/\\&/g; s/^/"/; s/$/"\\/ +p +g +s/.\{148\}// +t nl +:delim +h +s/\(.\{148\}\)..*/\1/ +t more2 +s/["\\]/\\&/g; s/^/"/; s/$/"/ +p +b +:more2 +s/["\\]/\\&/g; s/^/"/; s/$/"\\/ +p +g +s/.\{148\}// +t delim +' >$CONFIG_STATUS || ac_write_fail=1 +rm -f conf$$subs.awk +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +_ACAWK +cat >>"\$ac_tmp/subs1.awk" <<_ACAWK && + for (key in S) S_is_set[key] = 1 + FS = "" + +} +{ + line = $ 0 + nfields = split(line, field, "@") + substed = 0 + len = length(field[1]) + for (i = 2; i < nfields; i++) { + key = field[i] + keylen = length(key) + if (S_is_set[key]) { + value = S[key] + line = substr(line, 1, len) "" value "" substr(line, len + keylen + 3) + len += length(value) + length(field[++i]) + substed = 1 + } else + len += 1 + keylen + } + + print line +} + +_ACAWK +_ACEOF +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +if sed "s/$ac_cr//" < /dev/null > /dev/null 2>&1; then + sed "s/$ac_cr\$//; s/$ac_cr/$ac_cs_awk_cr/g" +else + cat +fi < "$ac_tmp/subs1.awk" > "$ac_tmp/subs.awk" \ + || as_fn_error $? "could not setup config files machinery" "$LINENO" 5 +_ACEOF + +# VPATH may cause trouble with some makes, so we remove sole $(srcdir), +# ${srcdir} and @srcdir@ entries from VPATH if srcdir is ".", strip leading and +# trailing colons and then remove the whole line if VPATH becomes empty +# (actually we leave an empty line to preserve line numbers). +if test "x$srcdir" = x.; then + ac_vpsub='/^[ ]*VPATH[ ]*=[ ]*/{ +h +s/// +s/^/:/ +s/[ ]*$/:/ +s/:\$(srcdir):/:/g +s/:\${srcdir}:/:/g +s/:@srcdir@:/:/g +s/^:*// +s/:*$// +x +s/\(=[ ]*\).*/\1/ +G +s/\n// +s/^[^=]*=[ ]*$// +}' +fi + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +fi # test -n "$CONFIG_FILES" + +# Set up the scripts for CONFIG_HEADERS section. +# No need to generate them if there are no CONFIG_HEADERS. +# This happens for instance with `./config.status Makefile'. +if test -n "$CONFIG_HEADERS"; then +cat >"$ac_tmp/defines.awk" <<\_ACAWK || +BEGIN { +_ACEOF + +# Transform confdefs.h into an awk script `defines.awk', embedded as +# here-document in config.status, that substitutes the proper values into +# config.h.in to produce config.h. + +# Create a delimiter string that does not exist in confdefs.h, to ease +# handling of long lines. +ac_delim='%!_!# ' +for ac_last_try in false false :; do + ac_tt=`sed -n "/$ac_delim/p" confdefs.h` + if test -z "$ac_tt"; then + break + elif $ac_last_try; then + as_fn_error $? "could not make $CONFIG_HEADERS" "$LINENO" 5 + else + ac_delim="$ac_delim!$ac_delim _$ac_delim!! " + fi +done + +# For the awk script, D is an array of macro values keyed by name, +# likewise P contains macro parameters if any. Preserve backslash +# newline sequences. + +ac_word_re=[_$as_cr_Letters][_$as_cr_alnum]* +sed -n ' +s/.\{148\}/&'"$ac_delim"'/g +t rset +:rset +s/^[ ]*#[ ]*define[ ][ ]*/ / +t def +d +:def +s/\\$// +t bsnl +s/["\\]/\\&/g +s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\ +D["\1"]=" \3"/p +s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2"/p +d +:bsnl +s/["\\]/\\&/g +s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\ +D["\1"]=" \3\\\\\\n"\\/p +t cont +s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2\\\\\\n"\\/p +t cont +d +:cont +n +s/.\{148\}/&'"$ac_delim"'/g +t clear +:clear +s/\\$// +t bsnlc +s/["\\]/\\&/g; s/^/"/; s/$/"/p +d +:bsnlc +s/["\\]/\\&/g; s/^/"/; s/$/\\\\\\n"\\/p +b cont +' >$CONFIG_STATUS || ac_write_fail=1 + +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 + for (key in D) D_is_set[key] = 1 + FS = "" +} +/^[\t ]*#[\t ]*(define|undef)[\t ]+$ac_word_re([\t (]|\$)/ { + line = \$ 0 + split(line, arg, " ") + if (arg[1] == "#") { + defundef = arg[2] + mac1 = arg[3] + } else { + defundef = substr(arg[1], 2) + mac1 = arg[2] + } + split(mac1, mac2, "(") #) + macro = mac2[1] + prefix = substr(line, 1, index(line, defundef) - 1) + if (D_is_set[macro]) { + # Preserve the white space surrounding the "#". + print prefix "define", macro P[macro] D[macro] + next + } else { + # Replace #undef with comments. This is necessary, for example, + # in the case of _POSIX_SOURCE, which is predefined and required + # on some systems where configure will not decide to define it. + if (defundef == "undef") { + print "/*", prefix defundef, macro, "*/" + next + } + } +} +{ print } +_ACAWK +_ACEOF +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 + as_fn_error $? "could not setup config headers machinery" "$LINENO" 5 +fi # test -n "$CONFIG_HEADERS" + + +eval set X " :F $CONFIG_FILES :H $CONFIG_HEADERS :C $CONFIG_COMMANDS" +shift +for ac_tag +do + case $ac_tag in + :[FHLC]) ac_mode=$ac_tag; continue;; + esac + case $ac_mode$ac_tag in + :[FHL]*:*);; + :L* | :C*:*) as_fn_error $? "invalid tag \`$ac_tag'" "$LINENO" 5;; + :[FH]-) ac_tag=-:-;; + :[FH]*) ac_tag=$ac_tag:$ac_tag.in;; + esac + ac_save_IFS=$IFS + IFS=: + set x $ac_tag + IFS=$ac_save_IFS + shift + ac_file=$1 + shift + + case $ac_mode in + :L) ac_source=$1;; + :[FH]) + ac_file_inputs= + for ac_f + do + case $ac_f in + -) ac_f="$ac_tmp/stdin";; + *) # Look for the file first in the build tree, then in the source tree + # (if the path is not absolute). The absolute path cannot be DOS-style, + # because $ac_f cannot contain `:'. + test -f "$ac_f" || + case $ac_f in + [\\/$]*) false;; + *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";; + esac || + as_fn_error 1 "cannot find input file: \`$ac_f'" "$LINENO" 5;; + esac + case $ac_f in *\'*) ac_f=`$as_echo "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac + as_fn_append ac_file_inputs " '$ac_f'" + done + + # Let's still pretend it is `configure' which instantiates (i.e., don't + # use $as_me), people would be surprised to read: + # /* config.h. Generated by config.status. */ + configure_input='Generated from '` + $as_echo "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g' + `' by configure.' + if test x"$ac_file" != x-; then + configure_input="$ac_file. $configure_input" + { $as_echo "$as_me:${as_lineno-$LINENO}: creating $ac_file" >&5 +$as_echo "$as_me: creating $ac_file" >&6;} + fi + # Neutralize special characters interpreted by sed in replacement strings. + case $configure_input in #( + *\&* | *\|* | *\\* ) + ac_sed_conf_input=`$as_echo "$configure_input" | + sed 's/[\\\\&|]/\\\\&/g'`;; #( + *) ac_sed_conf_input=$configure_input;; + esac + + case $ac_tag in + *:-:* | *:-) cat >"$ac_tmp/stdin" \ + || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; + esac + ;; + esac + + ac_dir=`$as_dirname -- "$ac_file" || +$as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$ac_file" : 'X\(//\)[^/]' \| \ + X"$ac_file" : 'X\(//\)$' \| \ + X"$ac_file" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$ac_file" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + as_dir="$ac_dir"; as_fn_mkdir_p + ac_builddir=. + +case "$ac_dir" in +.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; +*) + ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` + # A ".." for each directory in $ac_dir_suffix. + ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` + case $ac_top_builddir_sub in + "") ac_top_builddir_sub=. ac_top_build_prefix= ;; + *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; + esac ;; +esac +ac_abs_top_builddir=$ac_pwd +ac_abs_builddir=$ac_pwd$ac_dir_suffix +# for backward compatibility: +ac_top_builddir=$ac_top_build_prefix + +case $srcdir in + .) # We are building in place. + ac_srcdir=. + ac_top_srcdir=$ac_top_builddir_sub + ac_abs_top_srcdir=$ac_pwd ;; + [\\/]* | ?:[\\/]* ) # Absolute name. + ac_srcdir=$srcdir$ac_dir_suffix; + ac_top_srcdir=$srcdir + ac_abs_top_srcdir=$srcdir ;; + *) # Relative name. + ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix + ac_top_srcdir=$ac_top_build_prefix$srcdir + ac_abs_top_srcdir=$ac_pwd/$srcdir ;; +esac +ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix + + + case $ac_mode in + :F) + # + # CONFIG_FILE + # + + case $INSTALL in + [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;; + *) ac_INSTALL=$ac_top_build_prefix$INSTALL ;; + esac + ac_MKDIR_P=$MKDIR_P + case $MKDIR_P in + [\\/$]* | ?:[\\/]* ) ;; + */*) ac_MKDIR_P=$ac_top_build_prefix$MKDIR_P ;; + esac +_ACEOF + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +# If the template does not know about datarootdir, expand it. +# FIXME: This hack should be removed a few years after 2.60. +ac_datarootdir_hack=; ac_datarootdir_seen= +ac_sed_dataroot=' +/datarootdir/ { + p + q +} +/@datadir@/p +/@docdir@/p +/@infodir@/p +/@localedir@/p +/@mandir@/p' +case `eval "sed -n \"\$ac_sed_dataroot\" $ac_file_inputs"` in +*datarootdir*) ac_datarootdir_seen=yes;; +*@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*) + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5 +$as_echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;} +_ACEOF +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 + ac_datarootdir_hack=' + s&@datadir@&$datadir&g + s&@docdir@&$docdir&g + s&@infodir@&$infodir&g + s&@localedir@&$localedir&g + s&@mandir@&$mandir&g + s&\\\${datarootdir}&$datarootdir&g' ;; +esac +_ACEOF + +# Neutralize VPATH when `$srcdir' = `.'. +# Shell code in configure.ac might set extrasub. +# FIXME: do we really want to maintain this feature? +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +ac_sed_extra="$ac_vpsub +$extrasub +_ACEOF +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +:t +/@[a-zA-Z_][a-zA-Z_0-9]*@/!b +s|@configure_input@|$ac_sed_conf_input|;t t +s&@top_builddir@&$ac_top_builddir_sub&;t t +s&@top_build_prefix@&$ac_top_build_prefix&;t t +s&@srcdir@&$ac_srcdir&;t t +s&@abs_srcdir@&$ac_abs_srcdir&;t t +s&@top_srcdir@&$ac_top_srcdir&;t t +s&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t +s&@builddir@&$ac_builddir&;t t +s&@abs_builddir@&$ac_abs_builddir&;t t +s&@abs_top_builddir@&$ac_abs_top_builddir&;t t +s&@INSTALL@&$ac_INSTALL&;t t +s&@MKDIR_P@&$ac_MKDIR_P&;t t +$ac_datarootdir_hack +" +eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$ac_tmp/subs.awk" \ + >$ac_tmp/out || as_fn_error $? "could not create $ac_file" "$LINENO" 5 + +test -z "$ac_datarootdir_hack$ac_datarootdir_seen" && + { ac_out=`sed -n '/\${datarootdir}/p' "$ac_tmp/out"`; test -n "$ac_out"; } && + { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' \ + "$ac_tmp/out"`; test -z "$ac_out"; } && + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \`datarootdir' +which seems to be undefined. Please make sure it is defined" >&5 +$as_echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir' +which seems to be undefined. Please make sure it is defined" >&2;} + + rm -f "$ac_tmp/stdin" + case $ac_file in + -) cat "$ac_tmp/out" && rm -f "$ac_tmp/out";; + *) rm -f "$ac_file" && mv "$ac_tmp/out" "$ac_file";; + esac \ + || as_fn_error $? "could not create $ac_file" "$LINENO" 5 + ;; + :H) + # + # CONFIG_HEADER + # + if test x"$ac_file" != x-; then + { + $as_echo "/* $configure_input */" \ + && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" + } >"$ac_tmp/config.h" \ + || as_fn_error $? "could not create $ac_file" "$LINENO" 5 + if diff "$ac_file" "$ac_tmp/config.h" >/dev/null 2>&1; then + { $as_echo "$as_me:${as_lineno-$LINENO}: $ac_file is unchanged" >&5 +$as_echo "$as_me: $ac_file is unchanged" >&6;} + else + rm -f "$ac_file" + mv "$ac_tmp/config.h" "$ac_file" \ + || as_fn_error $? "could not create $ac_file" "$LINENO" 5 + fi + else + $as_echo "/* $configure_input */" \ + && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" \ + || as_fn_error $? "could not create -" "$LINENO" 5 + fi +# Compute "$ac_file"'s index in $config_headers. +_am_arg="$ac_file" +_am_stamp_count=1 +for _am_header in $config_headers :; do + case $_am_header in + $_am_arg | $_am_arg:* ) + break ;; + * ) + _am_stamp_count=`expr $_am_stamp_count + 1` ;; + esac +done +echo "timestamp for $_am_arg" >`$as_dirname -- "$_am_arg" || +$as_expr X"$_am_arg" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$_am_arg" : 'X\(//\)[^/]' \| \ + X"$_am_arg" : 'X\(//\)$' \| \ + X"$_am_arg" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$_am_arg" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'`/stamp-h$_am_stamp_count + ;; + + :C) { $as_echo "$as_me:${as_lineno-$LINENO}: executing $ac_file commands" >&5 +$as_echo "$as_me: executing $ac_file commands" >&6;} + ;; + esac + + + case $ac_file$ac_mode in + "depfiles":C) test x"$AMDEP_TRUE" != x"" || { + # Autoconf 2.62 quotes --file arguments for eval, but not when files + # are listed without --file. Let's play safe and only enable the eval + # if we detect the quoting. + case $CONFIG_FILES in + *\'*) eval set x "$CONFIG_FILES" ;; + *) set x $CONFIG_FILES ;; + esac + shift + for mf + do + # Strip MF so we end up with the name of the file. + mf=`echo "$mf" | sed -e 's/:.*$//'` + # Check whether this is an Automake generated Makefile or not. + # We used to match only the files named `Makefile.in', but + # some people rename them; so instead we look at the file content. + # Grep'ing the first line is not enough: some people post-process + # each Makefile.in and add a new line on top of each file to say so. + # Grep'ing the whole file is not good either: AIX grep has a line + # limit of 2048, but all sed's we know have understand at least 4000. + if sed -n 's,^#.*generated by automake.*,X,p' "$mf" | grep X >/dev/null 2>&1; then + dirpart=`$as_dirname -- "$mf" || +$as_expr X"$mf" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$mf" : 'X\(//\)[^/]' \| \ + X"$mf" : 'X\(//\)$' \| \ + X"$mf" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$mf" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + else + continue + fi + # Extract the definition of DEPDIR, am__include, and am__quote + # from the Makefile without running `make'. + DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"` + test -z "$DEPDIR" && continue + am__include=`sed -n 's/^am__include = //p' < "$mf"` + test -z "am__include" && continue + am__quote=`sed -n 's/^am__quote = //p' < "$mf"` + # When using ansi2knr, U may be empty or an underscore; expand it + U=`sed -n 's/^U = //p' < "$mf"` + # Find all dependency output files, they are included files with + # $(DEPDIR) in their names. We invoke sed twice because it is the + # simplest approach to changing $(DEPDIR) to its actual value in the + # expansion. + for file in `sed -n " + s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \ + sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g' -e 's/\$U/'"$U"'/g'`; do + # Make sure the directory exists. + test -f "$dirpart/$file" && continue + fdir=`$as_dirname -- "$file" || +$as_expr X"$file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$file" : 'X\(//\)[^/]' \| \ + X"$file" : 'X\(//\)$' \| \ + X"$file" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$file" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + as_dir=$dirpart/$fdir; as_fn_mkdir_p + # echo "creating $dirpart/$file" + echo '# dummy' > "$dirpart/$file" + done + done +} + ;; + "libtool":C) + + # See if we are running on zsh, and set the options which allow our + # commands through without removal of \ escapes. + if test -n "${ZSH_VERSION+set}" ; then + setopt NO_GLOB_SUBST + fi + + cfgfile="${ofile}T" + trap "$RM \"$cfgfile\"; exit 1" 1 2 15 + $RM "$cfgfile" + + cat <<_LT_EOF >> "$cfgfile" +#! $SHELL + +# `$ECHO "$ofile" | sed 's%^.*/%%'` - Provide generalized library-building support services. +# Generated automatically by $as_me ($PACKAGE$TIMESTAMP) $VERSION +# Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`: +# NOTE: Changes made to this file will be lost: look at ltmain.sh. +# +# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005, +# 2006, 2007, 2008, 2009, 2010, 2011 Free Software +# Foundation, Inc. +# Written by Gordon Matzigkeit, 1996 +# +# This file is part of GNU Libtool. +# +# GNU Libtool is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License as +# published by the Free Software Foundation; either version 2 of +# the License, or (at your option) any later version. +# +# As a special exception to the GNU General Public License, +# if you distribute this file as part of a program or library that +# is built using GNU Libtool, you may include this file under the +# same distribution terms that you use for the rest of that program. +# +# GNU Libtool is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with GNU Libtool; see the file COPYING. If not, a copy +# can be downloaded from http://www.gnu.org/licenses/gpl.html, or +# obtained by writing to the Free Software Foundation, Inc., +# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + + +# The names of the tagged configurations supported by this script. +available_tags="CXX " + +# ### BEGIN LIBTOOL CONFIG + +# Which release of libtool.m4 was used? +macro_version=$macro_version +macro_revision=$macro_revision + +# Whether or not to build shared libraries. +build_libtool_libs=$enable_shared + +# Whether or not to build static libraries. +build_old_libs=$enable_static + +# What type of objects to build. +pic_mode=$pic_mode + +# Whether or not to optimize for fast installation. +fast_install=$enable_fast_install + +# Shell to use when invoking shell scripts. +SHELL=$lt_SHELL + +# An echo program that protects backslashes. +ECHO=$lt_ECHO + +# The PATH separator for the build system. +PATH_SEPARATOR=$lt_PATH_SEPARATOR + +# The host system. +host_alias=$host_alias +host=$host +host_os=$host_os + +# The build system. +build_alias=$build_alias +build=$build +build_os=$build_os + +# A sed program that does not truncate output. +SED=$lt_SED + +# Sed that helps us avoid accidentally triggering echo(1) options like -n. +Xsed="\$SED -e 1s/^X//" + +# A grep program that handles long lines. +GREP=$lt_GREP + +# An ERE matcher. +EGREP=$lt_EGREP + +# A literal string matcher. +FGREP=$lt_FGREP + +# A BSD- or MS-compatible name lister. +NM=$lt_NM + +# Whether we need soft or hard links. +LN_S=$lt_LN_S + +# What is the maximum length of a command? +max_cmd_len=$max_cmd_len + +# Object file suffix (normally "o"). +objext=$ac_objext + +# Executable file suffix (normally ""). +exeext=$exeext + +# whether the shell understands "unset". +lt_unset=$lt_unset + +# turn spaces into newlines. +SP2NL=$lt_lt_SP2NL + +# turn newlines into spaces. +NL2SP=$lt_lt_NL2SP + +# convert \$build file names to \$host format. +to_host_file_cmd=$lt_cv_to_host_file_cmd + +# convert \$build files to toolchain format. +to_tool_file_cmd=$lt_cv_to_tool_file_cmd + +# An object symbol dumper. +OBJDUMP=$lt_OBJDUMP + +# Method to check whether dependent libraries are shared objects. +deplibs_check_method=$lt_deplibs_check_method + +# Command to use when deplibs_check_method = "file_magic". +file_magic_cmd=$lt_file_magic_cmd + +# How to find potential files when deplibs_check_method = "file_magic". +file_magic_glob=$lt_file_magic_glob + +# Find potential files using nocaseglob when deplibs_check_method = "file_magic". +want_nocaseglob=$lt_want_nocaseglob + +# DLL creation program. +DLLTOOL=$lt_DLLTOOL + +# Command to associate shared and link libraries. +sharedlib_from_linklib_cmd=$lt_sharedlib_from_linklib_cmd + +# The archiver. +AR=$lt_AR + +# Flags to create an archive. +AR_FLAGS=$lt_AR_FLAGS + +# How to feed a file listing to the archiver. +archiver_list_spec=$lt_archiver_list_spec + +# A symbol stripping program. +STRIP=$lt_STRIP + +# Commands used to install an old-style archive. +RANLIB=$lt_RANLIB +old_postinstall_cmds=$lt_old_postinstall_cmds +old_postuninstall_cmds=$lt_old_postuninstall_cmds + +# Whether to use a lock for old archive extraction. +lock_old_archive_extraction=$lock_old_archive_extraction + +# A C compiler. +LTCC=$lt_CC + +# LTCC compiler flags. +LTCFLAGS=$lt_CFLAGS + +# Take the output of nm and produce a listing of raw symbols and C names. +global_symbol_pipe=$lt_lt_cv_sys_global_symbol_pipe + +# Transform the output of nm in a proper C declaration. +global_symbol_to_cdecl=$lt_lt_cv_sys_global_symbol_to_cdecl + +# Transform the output of nm in a C name address pair. +global_symbol_to_c_name_address=$lt_lt_cv_sys_global_symbol_to_c_name_address + +# Transform the output of nm in a C name address pair when lib prefix is needed. +global_symbol_to_c_name_address_lib_prefix=$lt_lt_cv_sys_global_symbol_to_c_name_address_lib_prefix + +# Specify filename containing input files for \$NM. +nm_file_list_spec=$lt_nm_file_list_spec + +# The root where to search for dependent libraries,and in which our libraries should be installed. +lt_sysroot=$lt_sysroot + +# The name of the directory that contains temporary libtool files. +objdir=$objdir + +# Used to examine libraries when file_magic_cmd begins with "file". +MAGIC_CMD=$MAGIC_CMD + +# Must we lock files when doing compilation? +need_locks=$lt_need_locks + +# Manifest tool. +MANIFEST_TOOL=$lt_MANIFEST_TOOL + +# Tool to manipulate archived DWARF debug symbol files on Mac OS X. +DSYMUTIL=$lt_DSYMUTIL + +# Tool to change global to local symbols on Mac OS X. +NMEDIT=$lt_NMEDIT + +# Tool to manipulate fat objects and archives on Mac OS X. +LIPO=$lt_LIPO + +# ldd/readelf like tool for Mach-O binaries on Mac OS X. +OTOOL=$lt_OTOOL + +# ldd/readelf like tool for 64 bit Mach-O binaries on Mac OS X 10.4. +OTOOL64=$lt_OTOOL64 + +# Old archive suffix (normally "a"). +libext=$libext + +# Shared library suffix (normally ".so"). +shrext_cmds=$lt_shrext_cmds + +# The commands to extract the exported symbol list from a shared archive. +extract_expsyms_cmds=$lt_extract_expsyms_cmds + +# Variables whose values should be saved in libtool wrapper scripts and +# restored at link time. +variables_saved_for_relink=$lt_variables_saved_for_relink + +# Do we need the "lib" prefix for modules? +need_lib_prefix=$need_lib_prefix + +# Do we need a version for libraries? +need_version=$need_version + +# Library versioning type. +version_type=$version_type + +# Shared library runtime path variable. +runpath_var=$runpath_var + +# Shared library path variable. +shlibpath_var=$shlibpath_var + +# Is shlibpath searched before the hard-coded library search path? +shlibpath_overrides_runpath=$shlibpath_overrides_runpath + +# Format of library name prefix. +libname_spec=$lt_libname_spec + +# List of archive names. First name is the real one, the rest are links. +# The last name is the one that the linker finds with -lNAME +library_names_spec=$lt_library_names_spec + +# The coded name of the library, if different from the real name. +soname_spec=$lt_soname_spec + +# Permission mode override for installation of shared libraries. +install_override_mode=$lt_install_override_mode + +# Command to use after installation of a shared archive. +postinstall_cmds=$lt_postinstall_cmds + +# Command to use after uninstallation of a shared archive. +postuninstall_cmds=$lt_postuninstall_cmds + +# Commands used to finish a libtool library installation in a directory. +finish_cmds=$lt_finish_cmds + +# As "finish_cmds", except a single script fragment to be evaled but +# not shown. +finish_eval=$lt_finish_eval + +# Whether we should hardcode library paths into libraries. +hardcode_into_libs=$hardcode_into_libs + +# Compile-time system search path for libraries. +sys_lib_search_path_spec=$lt_sys_lib_search_path_spec + +# Run-time system search path for libraries. +sys_lib_dlsearch_path_spec=$lt_sys_lib_dlsearch_path_spec + +# Whether dlopen is supported. +dlopen_support=$enable_dlopen + +# Whether dlopen of programs is supported. +dlopen_self=$enable_dlopen_self + +# Whether dlopen of statically linked programs is supported. +dlopen_self_static=$enable_dlopen_self_static + +# Commands to strip libraries. +old_striplib=$lt_old_striplib +striplib=$lt_striplib + + +# The linker used to build libraries. +LD=$lt_LD + +# How to create reloadable object files. +reload_flag=$lt_reload_flag +reload_cmds=$lt_reload_cmds + +# Commands used to build an old-style archive. +old_archive_cmds=$lt_old_archive_cmds + +# A language specific compiler. +CC=$lt_compiler + +# Is the compiler the GNU compiler? +with_gcc=$GCC + +# Compiler flag to turn off builtin functions. +no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag + +# Additional compiler flags for building library objects. +pic_flag=$lt_lt_prog_compiler_pic + +# How to pass a linker flag through the compiler. +wl=$lt_lt_prog_compiler_wl + +# Compiler flag to prevent dynamic linking. +link_static_flag=$lt_lt_prog_compiler_static + +# Does compiler simultaneously support -c and -o options? +compiler_c_o=$lt_lt_cv_prog_compiler_c_o + +# Whether or not to add -lc for building shared libraries. +build_libtool_need_lc=$archive_cmds_need_lc + +# Whether or not to disallow shared libs when runtime libs are static. +allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes + +# Compiler flag to allow reflexive dlopens. +export_dynamic_flag_spec=$lt_export_dynamic_flag_spec + +# Compiler flag to generate shared objects directly from archives. +whole_archive_flag_spec=$lt_whole_archive_flag_spec + +# Whether the compiler copes with passing no objects directly. +compiler_needs_object=$lt_compiler_needs_object + +# Create an old-style archive from a shared archive. +old_archive_from_new_cmds=$lt_old_archive_from_new_cmds + +# Create a temporary old-style archive to link instead of a shared archive. +old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds + +# Commands used to build a shared archive. +archive_cmds=$lt_archive_cmds +archive_expsym_cmds=$lt_archive_expsym_cmds + +# Commands used to build a loadable module if different from building +# a shared archive. +module_cmds=$lt_module_cmds +module_expsym_cmds=$lt_module_expsym_cmds + +# Whether we are building with GNU ld or not. +with_gnu_ld=$lt_with_gnu_ld + +# Flag that allows shared libraries with undefined symbols to be built. +allow_undefined_flag=$lt_allow_undefined_flag + +# Flag that enforces no undefined symbols. +no_undefined_flag=$lt_no_undefined_flag + +# Flag to hardcode \$libdir into a binary during linking. +# This must work even if \$libdir does not exist +hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec + +# Whether we need a single "-rpath" flag with a separated argument. +hardcode_libdir_separator=$lt_hardcode_libdir_separator + +# Set to "yes" if using DIR/libNAME\${shared_ext} during linking hardcodes +# DIR into the resulting binary. +hardcode_direct=$hardcode_direct + +# Set to "yes" if using DIR/libNAME\${shared_ext} during linking hardcodes +# DIR into the resulting binary and the resulting library dependency is +# "absolute",i.e impossible to change by setting \${shlibpath_var} if the +# library is relocated. +hardcode_direct_absolute=$hardcode_direct_absolute + +# Set to "yes" if using the -LDIR flag during linking hardcodes DIR +# into the resulting binary. +hardcode_minus_L=$hardcode_minus_L + +# Set to "yes" if using SHLIBPATH_VAR=DIR during linking hardcodes DIR +# into the resulting binary. +hardcode_shlibpath_var=$hardcode_shlibpath_var + +# Set to "yes" if building a shared library automatically hardcodes DIR +# into the library and all subsequent libraries and executables linked +# against it. +hardcode_automatic=$hardcode_automatic + +# Set to yes if linker adds runtime paths of dependent libraries +# to runtime path list. +inherit_rpath=$inherit_rpath + +# Whether libtool must link a program against all its dependency libraries. +link_all_deplibs=$link_all_deplibs + +# Set to "yes" if exported symbols are required. +always_export_symbols=$always_export_symbols + +# The commands to list exported symbols. +export_symbols_cmds=$lt_export_symbols_cmds + +# Symbols that should not be listed in the preloaded symbols. +exclude_expsyms=$lt_exclude_expsyms + +# Symbols that must always be exported. +include_expsyms=$lt_include_expsyms + +# Commands necessary for linking programs (against libraries) with templates. +prelink_cmds=$lt_prelink_cmds + +# Commands necessary for finishing linking programs. +postlink_cmds=$lt_postlink_cmds + +# Specify filename containing input files. +file_list_spec=$lt_file_list_spec + +# How to hardcode a shared library path into an executable. +hardcode_action=$hardcode_action + +# The directories searched by this compiler when creating a shared library. +compiler_lib_search_dirs=$lt_compiler_lib_search_dirs + +# Dependencies to place before and after the objects being linked to +# create a shared library. +predep_objects=$lt_predep_objects +postdep_objects=$lt_postdep_objects +predeps=$lt_predeps +postdeps=$lt_postdeps + +# The library search path used internally by the compiler when linking +# a shared library. +compiler_lib_search_path=$lt_compiler_lib_search_path + +# ### END LIBTOOL CONFIG + +_LT_EOF + + case $host_os in + aix3*) + cat <<\_LT_EOF >> "$cfgfile" +# AIX sometimes has problems with the GCC collect2 program. For some +# reason, if we set the COLLECT_NAMES environment variable, the problems +# vanish in a puff of smoke. +if test "X${COLLECT_NAMES+set}" != Xset; then + COLLECT_NAMES= + export COLLECT_NAMES +fi +_LT_EOF + ;; + esac + + +ltmain="$ac_aux_dir/ltmain.sh" + + + # We use sed instead of cat because bash on DJGPP gets confused if + # if finds mixed CR/LF and LF-only lines. Since sed operates in + # text mode, it properly converts lines to CR/LF. This bash problem + # is reportedly fixed, but why not run on old versions too? + sed '$q' "$ltmain" >> "$cfgfile" \ + || (rm -f "$cfgfile"; exit 1) + + if test x"$xsi_shell" = xyes; then + sed -e '/^func_dirname ()$/,/^} # func_dirname /c\ +func_dirname ()\ +{\ +\ case ${1} in\ +\ */*) func_dirname_result="${1%/*}${2}" ;;\ +\ * ) func_dirname_result="${3}" ;;\ +\ esac\ +} # Extended-shell func_dirname implementation' "$cfgfile" > $cfgfile.tmp \ + && mv -f "$cfgfile.tmp" "$cfgfile" \ + || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") +test 0 -eq $? || _lt_function_replace_fail=: + + + sed -e '/^func_basename ()$/,/^} # func_basename /c\ +func_basename ()\ +{\ +\ func_basename_result="${1##*/}"\ +} # Extended-shell func_basename implementation' "$cfgfile" > $cfgfile.tmp \ + && mv -f "$cfgfile.tmp" "$cfgfile" \ + || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") +test 0 -eq $? || _lt_function_replace_fail=: + + + sed -e '/^func_dirname_and_basename ()$/,/^} # func_dirname_and_basename /c\ +func_dirname_and_basename ()\ +{\ +\ case ${1} in\ +\ */*) func_dirname_result="${1%/*}${2}" ;;\ +\ * ) func_dirname_result="${3}" ;;\ +\ esac\ +\ func_basename_result="${1##*/}"\ +} # Extended-shell func_dirname_and_basename implementation' "$cfgfile" > $cfgfile.tmp \ + && mv -f "$cfgfile.tmp" "$cfgfile" \ + || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") +test 0 -eq $? || _lt_function_replace_fail=: + + + sed -e '/^func_stripname ()$/,/^} # func_stripname /c\ +func_stripname ()\ +{\ +\ # pdksh 5.2.14 does not do ${X%$Y} correctly if both X and Y are\ +\ # positional parameters, so assign one to ordinary parameter first.\ +\ func_stripname_result=${3}\ +\ func_stripname_result=${func_stripname_result#"${1}"}\ +\ func_stripname_result=${func_stripname_result%"${2}"}\ +} # Extended-shell func_stripname implementation' "$cfgfile" > $cfgfile.tmp \ + && mv -f "$cfgfile.tmp" "$cfgfile" \ + || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") +test 0 -eq $? || _lt_function_replace_fail=: + + + sed -e '/^func_split_long_opt ()$/,/^} # func_split_long_opt /c\ +func_split_long_opt ()\ +{\ +\ func_split_long_opt_name=${1%%=*}\ +\ func_split_long_opt_arg=${1#*=}\ +} # Extended-shell func_split_long_opt implementation' "$cfgfile" > $cfgfile.tmp \ + && mv -f "$cfgfile.tmp" "$cfgfile" \ + || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") +test 0 -eq $? || _lt_function_replace_fail=: + + + sed -e '/^func_split_short_opt ()$/,/^} # func_split_short_opt /c\ +func_split_short_opt ()\ +{\ +\ func_split_short_opt_arg=${1#??}\ +\ func_split_short_opt_name=${1%"$func_split_short_opt_arg"}\ +} # Extended-shell func_split_short_opt implementation' "$cfgfile" > $cfgfile.tmp \ + && mv -f "$cfgfile.tmp" "$cfgfile" \ + || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") +test 0 -eq $? || _lt_function_replace_fail=: + + + sed -e '/^func_lo2o ()$/,/^} # func_lo2o /c\ +func_lo2o ()\ +{\ +\ case ${1} in\ +\ *.lo) func_lo2o_result=${1%.lo}.${objext} ;;\ +\ *) func_lo2o_result=${1} ;;\ +\ esac\ +} # Extended-shell func_lo2o implementation' "$cfgfile" > $cfgfile.tmp \ + && mv -f "$cfgfile.tmp" "$cfgfile" \ + || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") +test 0 -eq $? || _lt_function_replace_fail=: + + + sed -e '/^func_xform ()$/,/^} # func_xform /c\ +func_xform ()\ +{\ + func_xform_result=${1%.*}.lo\ +} # Extended-shell func_xform implementation' "$cfgfile" > $cfgfile.tmp \ + && mv -f "$cfgfile.tmp" "$cfgfile" \ + || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") +test 0 -eq $? || _lt_function_replace_fail=: + + + sed -e '/^func_arith ()$/,/^} # func_arith /c\ +func_arith ()\ +{\ + func_arith_result=$(( $* ))\ +} # Extended-shell func_arith implementation' "$cfgfile" > $cfgfile.tmp \ + && mv -f "$cfgfile.tmp" "$cfgfile" \ + || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") +test 0 -eq $? || _lt_function_replace_fail=: + + + sed -e '/^func_len ()$/,/^} # func_len /c\ +func_len ()\ +{\ + func_len_result=${#1}\ +} # Extended-shell func_len implementation' "$cfgfile" > $cfgfile.tmp \ + && mv -f "$cfgfile.tmp" "$cfgfile" \ + || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") +test 0 -eq $? || _lt_function_replace_fail=: + +fi + +if test x"$lt_shell_append" = xyes; then + sed -e '/^func_append ()$/,/^} # func_append /c\ +func_append ()\ +{\ + eval "${1}+=\\${2}"\ +} # Extended-shell func_append implementation' "$cfgfile" > $cfgfile.tmp \ + && mv -f "$cfgfile.tmp" "$cfgfile" \ + || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") +test 0 -eq $? || _lt_function_replace_fail=: + + + sed -e '/^func_append_quoted ()$/,/^} # func_append_quoted /c\ +func_append_quoted ()\ +{\ +\ func_quote_for_eval "${2}"\ +\ eval "${1}+=\\\\ \\$func_quote_for_eval_result"\ +} # Extended-shell func_append_quoted implementation' "$cfgfile" > $cfgfile.tmp \ + && mv -f "$cfgfile.tmp" "$cfgfile" \ + || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") +test 0 -eq $? || _lt_function_replace_fail=: + + + # Save a `func_append' function call where possible by direct use of '+=' + sed -e 's%func_append \([a-zA-Z_]\{1,\}\) "%\1+="%g' $cfgfile > $cfgfile.tmp \ + && mv -f "$cfgfile.tmp" "$cfgfile" \ + || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") + test 0 -eq $? || _lt_function_replace_fail=: +else + # Save a `func_append' function call even when '+=' is not available + sed -e 's%func_append \([a-zA-Z_]\{1,\}\) "%\1="$\1%g' $cfgfile > $cfgfile.tmp \ + && mv -f "$cfgfile.tmp" "$cfgfile" \ + || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") + test 0 -eq $? || _lt_function_replace_fail=: +fi + +if test x"$_lt_function_replace_fail" = x":"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Unable to substitute extended shell functions in $ofile" >&5 +$as_echo "$as_me: WARNING: Unable to substitute extended shell functions in $ofile" >&2;} +fi + + + mv -f "$cfgfile" "$ofile" || + (rm -f "$ofile" && cp "$cfgfile" "$ofile" && rm -f "$cfgfile") + chmod +x "$ofile" + + + cat <<_LT_EOF >> "$ofile" + +# ### BEGIN LIBTOOL TAG CONFIG: CXX + +# The linker used to build libraries. +LD=$lt_LD_CXX + +# How to create reloadable object files. +reload_flag=$lt_reload_flag_CXX +reload_cmds=$lt_reload_cmds_CXX + +# Commands used to build an old-style archive. +old_archive_cmds=$lt_old_archive_cmds_CXX + +# A language specific compiler. +CC=$lt_compiler_CXX + +# Is the compiler the GNU compiler? +with_gcc=$GCC_CXX + +# Compiler flag to turn off builtin functions. +no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag_CXX + +# Additional compiler flags for building library objects. +pic_flag=$lt_lt_prog_compiler_pic_CXX + +# How to pass a linker flag through the compiler. +wl=$lt_lt_prog_compiler_wl_CXX + +# Compiler flag to prevent dynamic linking. +link_static_flag=$lt_lt_prog_compiler_static_CXX + +# Does compiler simultaneously support -c and -o options? +compiler_c_o=$lt_lt_cv_prog_compiler_c_o_CXX + +# Whether or not to add -lc for building shared libraries. +build_libtool_need_lc=$archive_cmds_need_lc_CXX + +# Whether or not to disallow shared libs when runtime libs are static. +allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes_CXX + +# Compiler flag to allow reflexive dlopens. +export_dynamic_flag_spec=$lt_export_dynamic_flag_spec_CXX + +# Compiler flag to generate shared objects directly from archives. +whole_archive_flag_spec=$lt_whole_archive_flag_spec_CXX + +# Whether the compiler copes with passing no objects directly. +compiler_needs_object=$lt_compiler_needs_object_CXX + +# Create an old-style archive from a shared archive. +old_archive_from_new_cmds=$lt_old_archive_from_new_cmds_CXX + +# Create a temporary old-style archive to link instead of a shared archive. +old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds_CXX + +# Commands used to build a shared archive. +archive_cmds=$lt_archive_cmds_CXX +archive_expsym_cmds=$lt_archive_expsym_cmds_CXX + +# Commands used to build a loadable module if different from building +# a shared archive. +module_cmds=$lt_module_cmds_CXX +module_expsym_cmds=$lt_module_expsym_cmds_CXX + +# Whether we are building with GNU ld or not. +with_gnu_ld=$lt_with_gnu_ld_CXX + +# Flag that allows shared libraries with undefined symbols to be built. +allow_undefined_flag=$lt_allow_undefined_flag_CXX + +# Flag that enforces no undefined symbols. +no_undefined_flag=$lt_no_undefined_flag_CXX + +# Flag to hardcode \$libdir into a binary during linking. +# This must work even if \$libdir does not exist +hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec_CXX + +# Whether we need a single "-rpath" flag with a separated argument. +hardcode_libdir_separator=$lt_hardcode_libdir_separator_CXX + +# Set to "yes" if using DIR/libNAME\${shared_ext} during linking hardcodes +# DIR into the resulting binary. +hardcode_direct=$hardcode_direct_CXX + +# Set to "yes" if using DIR/libNAME\${shared_ext} during linking hardcodes +# DIR into the resulting binary and the resulting library dependency is +# "absolute",i.e impossible to change by setting \${shlibpath_var} if the +# library is relocated. +hardcode_direct_absolute=$hardcode_direct_absolute_CXX + +# Set to "yes" if using the -LDIR flag during linking hardcodes DIR +# into the resulting binary. +hardcode_minus_L=$hardcode_minus_L_CXX + +# Set to "yes" if using SHLIBPATH_VAR=DIR during linking hardcodes DIR +# into the resulting binary. +hardcode_shlibpath_var=$hardcode_shlibpath_var_CXX + +# Set to "yes" if building a shared library automatically hardcodes DIR +# into the library and all subsequent libraries and executables linked +# against it. +hardcode_automatic=$hardcode_automatic_CXX + +# Set to yes if linker adds runtime paths of dependent libraries +# to runtime path list. +inherit_rpath=$inherit_rpath_CXX + +# Whether libtool must link a program against all its dependency libraries. +link_all_deplibs=$link_all_deplibs_CXX + +# Set to "yes" if exported symbols are required. +always_export_symbols=$always_export_symbols_CXX + +# The commands to list exported symbols. +export_symbols_cmds=$lt_export_symbols_cmds_CXX + +# Symbols that should not be listed in the preloaded symbols. +exclude_expsyms=$lt_exclude_expsyms_CXX + +# Symbols that must always be exported. +include_expsyms=$lt_include_expsyms_CXX + +# Commands necessary for linking programs (against libraries) with templates. +prelink_cmds=$lt_prelink_cmds_CXX + +# Commands necessary for finishing linking programs. +postlink_cmds=$lt_postlink_cmds_CXX + +# Specify filename containing input files. +file_list_spec=$lt_file_list_spec_CXX + +# How to hardcode a shared library path into an executable. +hardcode_action=$hardcode_action_CXX + +# The directories searched by this compiler when creating a shared library. +compiler_lib_search_dirs=$lt_compiler_lib_search_dirs_CXX + +# Dependencies to place before and after the objects being linked to +# create a shared library. +predep_objects=$lt_predep_objects_CXX +postdep_objects=$lt_postdep_objects_CXX +predeps=$lt_predeps_CXX +postdeps=$lt_postdeps_CXX + +# The library search path used internally by the compiler when linking +# a shared library. +compiler_lib_search_path=$lt_compiler_lib_search_path_CXX + +# ### END LIBTOOL TAG CONFIG: CXX +_LT_EOF + + ;; + + esac +done # for ac_tag + + +as_fn_exit 0 +_ACEOF +ac_clean_files=$ac_clean_files_save + +test $ac_write_fail = 0 || + as_fn_error $? "write failure creating $CONFIG_STATUS" "$LINENO" 5 + + +# configure is writing to config.log, and then calls config.status. +# config.status does its own redirection, appending to config.log. +# Unfortunately, on DOS this fails, as config.log is still kept open +# by configure, so config.status won't be able to write to it; its +# output is simply discarded. So we exec the FD to /dev/null, +# effectively closing config.log, so it can be properly (re)opened and +# appended to by config.status. When coming back to configure, we +# need to make the FD available again. +if test "$no_create" != yes; then + ac_cs_success=: + ac_config_status_args= + test "$silent" = yes && + ac_config_status_args="$ac_config_status_args --quiet" + exec 5>/dev/null + $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false + exec 5>>config.log + # Use ||, not &&, to avoid exiting from the if with $? = 1, which + # would make configure fail if this is the last instruction. + $ac_cs_success || as_fn_exit 1 +fi +if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5 +$as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;} +fi + diff --git a/pkg/registry/zookeeper-3.4.6/src/c/autom4te.cache/requests b/pkg/registry/zookeeper-3.4.6/src/c/autom4te.cache/requests new file mode 100644 index 000000000..2c72da71d --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/c/autom4te.cache/requests @@ -0,0 +1,673 @@ +# This file was generated by Autom4te Sat May 26 18:17:46 UTC 2012. +# It contains the lists of macros which have been traced. +# It can be safely removed. + +@request = ( + bless( [ + '0', + 1, + [ + '/usr/share/autoconf' + ], + [ + '/usr/share/autoconf/autoconf/autoconf.m4f', + '/usr/share/aclocal-1.11/amversion.m4', + '/usr/share/aclocal-1.11/auxdir.m4', + '/usr/share/aclocal-1.11/cond.m4', + '/usr/share/aclocal-1.11/depend.m4', + '/usr/share/aclocal-1.11/depout.m4', + '/usr/share/aclocal-1.11/init.m4', + '/usr/share/aclocal-1.11/install-sh.m4', + '/usr/share/aclocal-1.11/lead-dot.m4', + '/usr/share/aclocal-1.11/make.m4', + '/usr/share/aclocal-1.11/minuso.m4', + '/usr/share/aclocal-1.11/missing.m4', + '/usr/share/aclocal-1.11/mkdirp.m4', + '/usr/share/aclocal-1.11/options.m4', + '/usr/share/aclocal-1.11/runlog.m4', + '/usr/share/aclocal-1.11/sanity.m4', + '/usr/share/aclocal-1.11/silent.m4', + '/usr/share/aclocal-1.11/strip.m4', + '/usr/share/aclocal-1.11/substnot.m4', + '/usr/share/aclocal-1.11/tar.m4', + 'acinclude.m4', + 'configure.ac' + ], + { + 'DX_RTF_FEATURE' => 1, + 'm4_pattern_forbid' => 1, + 'AC_DEFUN' => 1, + 'AM_PROG_MKDIR_P' => 1, + 'DX_IF_FEATURE' => 1, + 'DX_FEATURE_chi' => 1, + 'DX_CHM_FEATURE' => 1, + 'DX_FEATURE_doc' => 1, + 'AM_AUTOMAKE_VERSION' => 1, + 'DX_PDF_FEATURE' => 1, + 'AM_MISSING_HAS_RUN' => 1, + 'AM_SUBST_NOTMAKE' => 1, + 'AM_MISSING_PROG' => 1, + 'AM_PROG_INSTALL_STRIP' => 1, + '_m4_warn' => 1, + 'AM_SANITY_CHECK' => 1, + 'DX_CHI_FEATURE' => 1, + '_AM_PROG_TAR' => 1, + 'DX_CURRENT_FEATURE' => 1, + 'AM_DEP_TRACK' => 1, + 'DX_CLEAR_DEPEND' => 1, + '_AM_IF_OPTION' => 1, + 'DX_HTML_FEATURE' => 1, + '_AM_SUBST_NOTMAKE' => 1, + 'm4_pattern_allow' => 1, + '_AM_AUTOCONF_VERSION' => 1, + 'AM_SET_LEADING_DOT' => 1, + '_AM_DEPENDENCIES' => 1, + 'DX_DIRNAME_EXPR' => 1, + 'DX_FEATURE_man' => 1, + 'DX_DOXYGEN_FEATURE' => 1, + 'DX_PS_FEATURE' => 1, + 'AU_DEFUN' => 1, + 'AM_SET_CURRENT_AUTOMAKE_VERSION' => 1, + 'DX_MAN_FEATURE' => 1, + '_AM_SET_OPTION' => 1, + 'DX_FEATURE_chm' => 1, + 'AM_INIT_AUTOMAKE' => 1, + 'DX_FEATURE_rtf' => 1, + 'DX_INIT_DOXYGEN' => 1, + 'AM_OUTPUT_DEPENDENCY_COMMANDS' => 1, + 'AC_DEFUN_ONCE' => 1, + 'DX_XML_FEATURE' => 1, + 'DX_TEST_FEATURE' => 1, + 'DX_ENV_APPEND' => 1, + 'AM_SILENT_RULES' => 1, + 'DX_CHECK_DEPEND' => 1, + 'DX_FEATURE_pdf' => 1, + 'DX_REQUIRE_PROG' => 1, + 'DX_ARG_ABLE' => 1, + 'include' => 1, + 'DX_FEATURE_html' => 1, + 'AM_AUX_DIR_EXPAND' => 1, + 'DX_CURRENT_DESCRIPTION' => 1, + '_AM_SET_OPTIONS' => 1, + 'AM_RUN_LOG' => 1, + '_AM_OUTPUT_DEPENDENCY_COMMANDS' => 1, + 'AM_PROG_CC_C_O' => 1, + '_AM_MANGLE_OPTION' => 1, + 'AM_CONDITIONAL' => 1, + 'DX_FEATURE_xml' => 1, + 'AM_SET_DEPDIR' => 1, + 'DX_FEATURE_dot' => 1, + 'AM_PROG_INSTALL_SH' => 1, + 'm4_include' => 1, + 'DX_FEATURE_ps' => 1, + '_AC_AM_CONFIG_HEADER_HOOK' => 1, + 'AM_MAKE_INCLUDE' => 1 + } + ], 'Autom4te::Request' ), + bless( [ + '1', + 1, + [ + '/usr/share/autoconf' + ], + [ + '/usr/share/autoconf/autoconf/autoconf.m4f', + 'aclocal.m4', + 'configure.ac' + ], + { + '_LT_AC_TAGCONFIG' => 1, + 'AM_PROG_F77_C_O' => 1, + 'm4_pattern_forbid' => 1, + 'AC_INIT' => 1, + '_AM_COND_IF' => 1, + 'AC_CANONICAL_TARGET' => 1, + 'AC_SUBST' => 1, + 'AC_CONFIG_LIBOBJ_DIR' => 1, + 'AC_FC_SRCEXT' => 1, + 'AC_CANONICAL_HOST' => 1, + 'AC_PROG_LIBTOOL' => 1, + 'AM_INIT_AUTOMAKE' => 1, + 'AM_PATH_GUILE' => 1, + 'AC_CONFIG_SUBDIRS' => 1, + 'AM_AUTOMAKE_VERSION' => 1, + 'LT_CONFIG_LTDL_DIR' => 1, + 'AC_REQUIRE_AUX_FILE' => 1, + 'AC_CONFIG_LINKS' => 1, + 'm4_sinclude' => 1, + 'LT_SUPPORTED_TAG' => 1, + 'AM_MAINTAINER_MODE' => 1, + 'AM_NLS' => 1, + 'AC_FC_PP_DEFINE' => 1, + 'AM_GNU_GETTEXT_INTL_SUBDIR' => 1, + 'AM_MAKEFILE_INCLUDE' => 1, + '_m4_warn' => 1, + 'AM_PROG_CXX_C_O' => 1, + '_AM_COND_ENDIF' => 1, + '_AM_MAKEFILE_INCLUDE' => 1, + 'AM_ENABLE_MULTILIB' => 1, + 'AM_SILENT_RULES' => 1, + 'AM_PROG_MOC' => 1, + 'AC_CONFIG_FILES' => 1, + 'LT_INIT' => 1, + 'include' => 1, + 'AM_PROG_AR' => 1, + 'AM_GNU_GETTEXT' => 1, + 'AC_LIBSOURCE' => 1, + 'AM_PROG_FC_C_O' => 1, + 'AC_CANONICAL_BUILD' => 1, + 'AC_FC_FREEFORM' => 1, + 'AH_OUTPUT' => 1, + 'AC_FC_PP_SRCEXT' => 1, + '_AM_SUBST_NOTMAKE' => 1, + 'AC_CONFIG_AUX_DIR' => 1, + 'sinclude' => 1, + 'AM_PROG_CC_C_O' => 1, + 'm4_pattern_allow' => 1, + 'AM_XGETTEXT_OPTION' => 1, + 'AC_CANONICAL_SYSTEM' => 1, + 'AM_CONDITIONAL' => 1, + 'AC_CONFIG_HEADERS' => 1, + 'AC_DEFINE_TRACE_LITERAL' => 1, + 'AM_POT_TOOLS' => 1, + 'm4_include' => 1, + '_AM_COND_ELSE' => 1, + 'AC_SUBST_TRACE' => 1 + } + ], 'Autom4te::Request' ), + bless( [ + '2', + 1, + [ + '/usr/share/autoconf' + ], + [ + '/usr/share/autoconf/autoconf/autoconf.m4f', + '/usr/share/aclocal/argz.m4', + '/usr/share/aclocal/libtool.m4', + '/usr/share/aclocal/ltdl.m4', + '/usr/share/aclocal/ltoptions.m4', + '/usr/share/aclocal/ltsugar.m4', + '/usr/share/aclocal/ltversion.m4', + '/usr/share/aclocal/lt~obsolete.m4', + '/usr/share/aclocal-1.11/amversion.m4', + '/usr/share/aclocal-1.11/auxdir.m4', + '/usr/share/aclocal-1.11/cond.m4', + '/usr/share/aclocal-1.11/depend.m4', + '/usr/share/aclocal-1.11/depout.m4', + '/usr/share/aclocal-1.11/init.m4', + '/usr/share/aclocal-1.11/install-sh.m4', + '/usr/share/aclocal-1.11/lead-dot.m4', + '/usr/share/aclocal-1.11/make.m4', + '/usr/share/aclocal-1.11/minuso.m4', + '/usr/share/aclocal-1.11/missing.m4', + '/usr/share/aclocal-1.11/mkdirp.m4', + '/usr/share/aclocal-1.11/options.m4', + '/usr/share/aclocal-1.11/runlog.m4', + '/usr/share/aclocal-1.11/sanity.m4', + '/usr/share/aclocal-1.11/silent.m4', + '/usr/share/aclocal-1.11/strip.m4', + '/usr/share/aclocal-1.11/substnot.m4', + '/usr/share/aclocal-1.11/tar.m4', + 'acinclude.m4', + 'configure.ac' + ], + { + 'AM_ENABLE_STATIC' => 1, + 'AC_LIBTOOL_LANG_RC_CONFIG' => 1, + '_LT_AC_SHELL_INIT' => 1, + 'AC_DEFUN' => 1, + 'AC_PROG_LIBTOOL' => 1, + '_LT_AC_LANG_CXX_CONFIG' => 1, + 'AM_PROG_MKDIR_P' => 1, + 'DX_IF_FEATURE' => 1, + 'DX_FEATURE_doc' => 1, + 'DX_CHM_FEATURE' => 1, + 'AM_AUTOMAKE_VERSION' => 1, + 'DX_PDF_FEATURE' => 1, + 'AM_SUBST_NOTMAKE' => 1, + 'AM_MISSING_PROG' => 1, + 'AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH' => 1, + '_LT_AC_LANG_C_CONFIG' => 1, + 'AM_PROG_INSTALL_STRIP' => 1, + '_m4_warn' => 1, + 'AC_LIBTOOL_OBJDIR' => 1, + 'gl_FUNC_ARGZ' => 1, + 'AM_SANITY_CHECK' => 1, + 'LTOBSOLETE_VERSION' => 1, + 'AC_LIBTOOL_LANG_GCJ_CONFIG' => 1, + 'AC_LIBTOOL_PROG_COMPILER_PIC' => 1, + 'LT_LIB_M' => 1, + '_LT_AC_CHECK_DLFCN' => 1, + 'AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE' => 1, + 'LTSUGAR_VERSION' => 1, + '_LT_PROG_LTMAIN' => 1, + '_AM_PROG_TAR' => 1, + 'LT_SYS_SYMBOL_USCORE' => 1, + 'AC_LIBTOOL_GCJ' => 1, + 'DX_CLEAR_DEPEND' => 1, + '_LT_WITH_SYSROOT' => 1, + 'LT_FUNC_DLSYM_USCORE' => 1, + 'LT_SYS_DLOPEN_DEPLIBS' => 1, + '_LT_AC_LANG_F77' => 1, + 'AC_LIBTOOL_CONFIG' => 1, + '_AM_SUBST_NOTMAKE' => 1, + 'AC_LTDL_DLLIB' => 1, + '_AM_AUTOCONF_VERSION' => 1, + 'AM_DISABLE_SHARED' => 1, + '_LT_PROG_ECHO_BACKSLASH' => 1, + '_LTDL_SETUP' => 1, + '_LT_AC_LANG_CXX' => 1, + 'AM_PROG_LIBTOOL' => 1, + 'AC_LIB_LTDL' => 1, + '_LT_AC_FILE_LTDLL_C' => 1, + 'AM_PROG_LD' => 1, + 'DX_DOXYGEN_FEATURE' => 1, + 'AU_DEFUN' => 1, + 'AC_PROG_NM' => 1, + 'AC_LIBTOOL_DLOPEN' => 1, + 'AC_PROG_LD' => 1, + 'AC_PROG_LD_GNU' => 1, + 'AC_ENABLE_FAST_INSTALL' => 1, + 'AC_LIBTOOL_FC' => 1, + 'DX_MAN_FEATURE' => 1, + 'LTDL_CONVENIENCE' => 1, + '_AM_SET_OPTION' => 1, + 'AC_LTDL_PREOPEN' => 1, + '_LT_LINKER_BOILERPLATE' => 1, + '_LT_PREPARE_SED_QUOTE_VARS' => 1, + 'AC_LIBTOOL_LANG_CXX_CONFIG' => 1, + 'AC_LIBTOOL_PROG_CC_C_O' => 1, + 'gl_PREREQ_ARGZ' => 1, + 'AM_OUTPUT_DEPENDENCY_COMMANDS' => 1, + 'LT_SUPPORTED_TAG' => 1, + 'LT_SYS_MODULE_EXT' => 1, + 'LT_PROG_RC' => 1, + 'AC_DEFUN_ONCE' => 1, + 'DX_XML_FEATURE' => 1, + '_LT_AC_LANG_GCJ' => 1, + 'AC_LTDL_OBJDIR' => 1, + 'DX_TEST_FEATURE' => 1, + '_LT_PATH_TOOL_PREFIX' => 1, + 'AC_LIBTOOL_RC' => 1, + 'AM_SILENT_RULES' => 1, + 'AC_DISABLE_FAST_INSTALL' => 1, + '_LT_AC_PROG_ECHO_BACKSLASH' => 1, + 'DX_CHECK_DEPEND' => 1, + 'DX_FEATURE_pdf' => 1, + 'DX_REQUIRE_PROG' => 1, + '_LT_AC_SYS_LIBPATH_AIX' => 1, + '_LT_AC_TRY_DLOPEN_SELF' => 1, + 'include' => 1, + 'LT_AC_PROG_SED' => 1, + 'AM_ENABLE_SHARED' => 1, + 'DX_FEATURE_html' => 1, + 'LTDL_INSTALLABLE' => 1, + 'DX_CURRENT_DESCRIPTION' => 1, + '_LT_AC_LANG_GCJ_CONFIG' => 1, + 'AC_ENABLE_SHARED' => 1, + 'AC_ENABLE_STATIC' => 1, + 'AC_LIBTOOL_SYS_HARD_LINK_LOCKS' => 1, + '_LT_REQUIRED_DARWIN_CHECKS' => 1, + 'AM_PROG_CC_C_O' => 1, + '_LT_AC_TAGVAR' => 1, + 'AC_LIBTOOL_LANG_F77_CONFIG' => 1, + 'AM_CONDITIONAL' => 1, + 'LT_LIB_DLLOAD' => 1, + 'DX_FEATURE_dot' => 1, + 'LTDL_INIT' => 1, + '_LT_PROG_F77' => 1, + '_LT_PROG_CXX' => 1, + 'LTVERSION_VERSION' => 1, + 'AM_PROG_INSTALL_SH' => 1, + 'm4_include' => 1, + 'AC_PROG_EGREP' => 1, + '_AC_AM_CONFIG_HEADER_HOOK' => 1, + 'AC_PATH_MAGIC' => 1, + 'AC_LTDL_SYSSEARCHPATH' => 1, + 'AM_MAKE_INCLUDE' => 1, + 'LT_CMD_MAX_LEN' => 1, + '_LT_AC_TAGCONFIG' => 1, + 'DX_RTF_FEATURE' => 1, + 'm4_pattern_forbid' => 1, + '_LT_LINKER_OPTION' => 1, + 'AC_LIBTOOL_COMPILER_OPTION' => 1, + 'AC_DISABLE_SHARED' => 1, + '_LT_COMPILER_BOILERPLATE' => 1, + 'AC_LIBTOOL_SETUP' => 1, + 'AC_LIBTOOL_WIN32_DLL' => 1, + 'AC_PROG_LD_RELOAD_FLAG' => 1, + 'DX_FEATURE_chi' => 1, + 'AC_LTDL_DLSYM_USCORE' => 1, + 'AM_MISSING_HAS_RUN' => 1, + 'LT_LANG' => 1, + 'LT_SYS_DLSEARCH_PATH' => 1, + 'LT_CONFIG_LTDL_DIR' => 1, + 'LT_OUTPUT' => 1, + 'AC_LIBTOOL_DLOPEN_SELF' => 1, + 'AC_LIBTOOL_PROG_LD_SHLIBS' => 1, + 'AC_LIBTOOL_LINKER_OPTION' => 1, + 'AC_WITH_LTDL' => 1, + 'DX_CHI_FEATURE' => 1, + 'AC_LIBTOOL_CXX' => 1, + 'LT_AC_PROG_RC' => 1, + 'LT_INIT' => 1, + 'LT_SYS_DLOPEN_SELF' => 1, + 'LT_AC_PROG_GCJ' => 1, + 'DX_CURRENT_FEATURE' => 1, + 'AM_DISABLE_STATIC' => 1, + 'AM_DEP_TRACK' => 1, + '_LT_AC_PROG_CXXCPP' => 1, + '_AC_PROG_LIBTOOL' => 1, + '_AM_IF_OPTION' => 1, + 'DX_HTML_FEATURE' => 1, + 'AC_PATH_TOOL_PREFIX' => 1, + 'AC_LIBTOOL_F77' => 1, + 'm4_pattern_allow' => 1, + 'AM_SET_LEADING_DOT' => 1, + 'LT_AC_PROG_EGREP' => 1, + '_LT_PROG_FC' => 1, + '_AM_DEPENDENCIES' => 1, + 'DX_DIRNAME_EXPR' => 1, + 'AC_LIBTOOL_LANG_C_CONFIG' => 1, + 'LTOPTIONS_VERSION' => 1, + '_LT_AC_SYS_COMPILER' => 1, + 'DX_FEATURE_man' => 1, + 'AM_PROG_NM' => 1, + 'DX_PS_FEATURE' => 1, + 'AC_LIBLTDL_CONVENIENCE' => 1, + 'AC_DEPLIBS_CHECK_METHOD' => 1, + 'AC_LIBLTDL_INSTALLABLE' => 1, + 'AM_SET_CURRENT_AUTOMAKE_VERSION' => 1, + 'AC_LTDL_ENABLE_INSTALL' => 1, + 'AC_LIBTOOL_SYS_DYNAMIC_LINKER' => 1, + 'LT_PROG_GCJ' => 1, + 'DX_FEATURE_chm' => 1, + 'AM_INIT_AUTOMAKE' => 1, + 'DX_FEATURE_rtf' => 1, + 'DX_INIT_DOXYGEN' => 1, + 'AC_DISABLE_STATIC' => 1, + 'LT_PATH_NM' => 1, + 'AC_LTDL_SHLIBEXT' => 1, + '_LT_AC_LOCK' => 1, + '_LT_AC_LANG_RC_CONFIG' => 1, + 'LT_PROG_GO' => 1, + 'LT_SYS_MODULE_PATH' => 1, + 'DX_ENV_APPEND' => 1, + 'LT_WITH_LTDL' => 1, + 'AC_LIBTOOL_POSTDEP_PREDEP' => 1, + 'AC_LTDL_SHLIBPATH' => 1, + 'DX_ARG_ABLE' => 1, + 'AM_AUX_DIR_EXPAND' => 1, + 'AC_LIBTOOL_PROG_COMPILER_NO_RTTI' => 1, + '_LT_AC_LANG_F77_CONFIG' => 1, + '_AM_SET_OPTIONS' => 1, + '_LT_COMPILER_OPTION' => 1, + 'AM_RUN_LOG' => 1, + '_AM_OUTPUT_DEPENDENCY_COMMANDS' => 1, + 'AC_LIBTOOL_SYS_OLD_ARCHIVE' => 1, + 'AC_LTDL_SYS_DLOPEN_DEPLIBS' => 1, + 'AC_LIBTOOL_PICMODE' => 1, + 'LT_PATH_LD' => 1, + 'AC_CHECK_LIBM' => 1, + 'AC_LIBTOOL_SYS_LIB_STRIP' => 1, + '_AM_MANGLE_OPTION' => 1, + 'AC_LTDL_SYMBOL_USCORE' => 1, + 'DX_FEATURE_xml' => 1, + 'AC_LIBTOOL_SYS_MAX_CMD_LEN' => 1, + 'AM_SET_DEPDIR' => 1, + '_LT_CC_BASENAME' => 1, + 'DX_FEATURE_ps' => 1, + '_LT_LIBOBJ' => 1 + } + ], 'Autom4te::Request' ), + bless( [ + '3', + 1, + [ + '/usr/share/autoconf' + ], + [ + '/usr/share/autoconf/autoconf/autoconf.m4f', + '/usr/share/aclocal/argz.m4', + '/usr/share/aclocal/cppunit.m4', + '/usr/share/aclocal/libtool.m4', + '/usr/share/aclocal/ltdl.m4', + '/usr/share/aclocal/ltoptions.m4', + '/usr/share/aclocal/ltsugar.m4', + '/usr/share/aclocal/ltversion.m4', + '/usr/share/aclocal/lt~obsolete.m4', + '/usr/share/aclocal-1.11/amversion.m4', + '/usr/share/aclocal-1.11/auxdir.m4', + '/usr/share/aclocal-1.11/cond.m4', + '/usr/share/aclocal-1.11/depend.m4', + '/usr/share/aclocal-1.11/depout.m4', + '/usr/share/aclocal-1.11/init.m4', + '/usr/share/aclocal-1.11/install-sh.m4', + '/usr/share/aclocal-1.11/lead-dot.m4', + '/usr/share/aclocal-1.11/make.m4', + '/usr/share/aclocal-1.11/minuso.m4', + '/usr/share/aclocal-1.11/missing.m4', + '/usr/share/aclocal-1.11/mkdirp.m4', + '/usr/share/aclocal-1.11/options.m4', + '/usr/share/aclocal-1.11/runlog.m4', + '/usr/share/aclocal-1.11/sanity.m4', + '/usr/share/aclocal-1.11/silent.m4', + '/usr/share/aclocal-1.11/strip.m4', + '/usr/share/aclocal-1.11/substnot.m4', + '/usr/share/aclocal-1.11/tar.m4', + 'acinclude.m4', + 'configure.ac' + ], + { + 'AM_ENABLE_STATIC' => 1, + 'AC_LIBTOOL_LANG_RC_CONFIG' => 1, + '_LT_AC_SHELL_INIT' => 1, + 'AC_DEFUN' => 1, + 'AC_PROG_LIBTOOL' => 1, + '_LT_AC_LANG_CXX_CONFIG' => 1, + 'AM_PROG_MKDIR_P' => 1, + 'DX_IF_FEATURE' => 1, + 'DX_FEATURE_doc' => 1, + 'DX_CHM_FEATURE' => 1, + 'AM_AUTOMAKE_VERSION' => 1, + 'DX_PDF_FEATURE' => 1, + 'AM_SUBST_NOTMAKE' => 1, + 'AM_MISSING_PROG' => 1, + 'AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH' => 1, + '_LT_AC_LANG_C_CONFIG' => 1, + 'AM_PROG_INSTALL_STRIP' => 1, + '_m4_warn' => 1, + 'AC_LIBTOOL_OBJDIR' => 1, + 'gl_FUNC_ARGZ' => 1, + 'AM_SANITY_CHECK' => 1, + 'LTOBSOLETE_VERSION' => 1, + 'AC_LIBTOOL_LANG_GCJ_CONFIG' => 1, + 'AC_LIBTOOL_PROG_COMPILER_PIC' => 1, + 'LT_LIB_M' => 1, + '_LT_AC_CHECK_DLFCN' => 1, + 'AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE' => 1, + 'LTSUGAR_VERSION' => 1, + '_LT_PROG_LTMAIN' => 1, + '_AM_PROG_TAR' => 1, + 'LT_SYS_SYMBOL_USCORE' => 1, + 'AC_LIBTOOL_GCJ' => 1, + 'DX_CLEAR_DEPEND' => 1, + '_LT_WITH_SYSROOT' => 1, + 'LT_FUNC_DLSYM_USCORE' => 1, + 'LT_SYS_DLOPEN_DEPLIBS' => 1, + '_LT_AC_LANG_F77' => 1, + 'AC_LIBTOOL_CONFIG' => 1, + '_AM_SUBST_NOTMAKE' => 1, + 'AC_LTDL_DLLIB' => 1, + '_AM_AUTOCONF_VERSION' => 1, + 'AM_DISABLE_SHARED' => 1, + '_LT_PROG_ECHO_BACKSLASH' => 1, + '_LTDL_SETUP' => 1, + '_LT_AC_LANG_CXX' => 1, + 'AM_PROG_LIBTOOL' => 1, + 'AC_LIB_LTDL' => 1, + '_LT_AC_FILE_LTDLL_C' => 1, + 'AM_PROG_LD' => 1, + 'DX_DOXYGEN_FEATURE' => 1, + 'AU_DEFUN' => 1, + 'AC_PROG_NM' => 1, + 'AC_LIBTOOL_DLOPEN' => 1, + 'AC_PROG_LD' => 1, + 'AM_PATH_CPPUNIT' => 1, + 'AC_PROG_LD_GNU' => 1, + 'AC_ENABLE_FAST_INSTALL' => 1, + 'AC_LIBTOOL_FC' => 1, + 'DX_MAN_FEATURE' => 1, + 'LTDL_CONVENIENCE' => 1, + '_AM_SET_OPTION' => 1, + 'AC_LTDL_PREOPEN' => 1, + '_LT_LINKER_BOILERPLATE' => 1, + 'AC_LIBTOOL_LANG_CXX_CONFIG' => 1, + 'AC_LIBTOOL_PROG_CC_C_O' => 1, + '_LT_PREPARE_SED_QUOTE_VARS' => 1, + 'gl_PREREQ_ARGZ' => 1, + 'AM_OUTPUT_DEPENDENCY_COMMANDS' => 1, + 'LT_SUPPORTED_TAG' => 1, + 'LT_SYS_MODULE_EXT' => 1, + 'LT_PROG_RC' => 1, + 'AC_DEFUN_ONCE' => 1, + 'DX_XML_FEATURE' => 1, + '_LT_AC_LANG_GCJ' => 1, + 'AC_LTDL_OBJDIR' => 1, + 'DX_TEST_FEATURE' => 1, + '_LT_PATH_TOOL_PREFIX' => 1, + 'AC_LIBTOOL_RC' => 1, + 'AM_SILENT_RULES' => 1, + 'AC_DISABLE_FAST_INSTALL' => 1, + '_LT_AC_PROG_ECHO_BACKSLASH' => 1, + 'DX_CHECK_DEPEND' => 1, + 'DX_FEATURE_pdf' => 1, + 'DX_REQUIRE_PROG' => 1, + '_LT_AC_SYS_LIBPATH_AIX' => 1, + '_LT_AC_TRY_DLOPEN_SELF' => 1, + 'include' => 1, + 'LT_AC_PROG_SED' => 1, + 'AM_ENABLE_SHARED' => 1, + 'DX_FEATURE_html' => 1, + 'LTDL_INSTALLABLE' => 1, + 'DX_CURRENT_DESCRIPTION' => 1, + '_LT_AC_LANG_GCJ_CONFIG' => 1, + 'AC_ENABLE_SHARED' => 1, + 'AC_ENABLE_STATIC' => 1, + 'AC_LIBTOOL_SYS_HARD_LINK_LOCKS' => 1, + '_LT_REQUIRED_DARWIN_CHECKS' => 1, + 'AM_PROG_CC_C_O' => 1, + '_LT_AC_TAGVAR' => 1, + 'AC_LIBTOOL_LANG_F77_CONFIG' => 1, + 'AM_CONDITIONAL' => 1, + 'LT_LIB_DLLOAD' => 1, + 'DX_FEATURE_dot' => 1, + 'LTDL_INIT' => 1, + '_LT_PROG_F77' => 1, + '_LT_PROG_CXX' => 1, + 'LTVERSION_VERSION' => 1, + 'AM_PROG_INSTALL_SH' => 1, + 'm4_include' => 1, + 'AC_PROG_EGREP' => 1, + '_AC_AM_CONFIG_HEADER_HOOK' => 1, + 'AC_PATH_MAGIC' => 1, + 'AC_LTDL_SYSSEARCHPATH' => 1, + 'AM_MAKE_INCLUDE' => 1, + 'LT_CMD_MAX_LEN' => 1, + '_LT_AC_TAGCONFIG' => 1, + 'DX_RTF_FEATURE' => 1, + 'm4_pattern_forbid' => 1, + '_LT_LINKER_OPTION' => 1, + 'AC_LIBTOOL_COMPILER_OPTION' => 1, + 'AC_DISABLE_SHARED' => 1, + '_LT_COMPILER_BOILERPLATE' => 1, + 'AC_LIBTOOL_SETUP' => 1, + 'AC_LIBTOOL_WIN32_DLL' => 1, + 'AC_PROG_LD_RELOAD_FLAG' => 1, + 'DX_FEATURE_chi' => 1, + 'AC_LTDL_DLSYM_USCORE' => 1, + 'LT_LANG' => 1, + 'AM_MISSING_HAS_RUN' => 1, + 'LT_SYS_DLSEARCH_PATH' => 1, + 'LT_CONFIG_LTDL_DIR' => 1, + 'LT_OUTPUT' => 1, + 'AC_LIBTOOL_DLOPEN_SELF' => 1, + 'AC_LIBTOOL_PROG_LD_SHLIBS' => 1, + 'AC_LIBTOOL_LINKER_OPTION' => 1, + 'AC_WITH_LTDL' => 1, + 'DX_CHI_FEATURE' => 1, + 'AC_LIBTOOL_CXX' => 1, + 'LT_AC_PROG_RC' => 1, + 'LT_INIT' => 1, + 'LT_SYS_DLOPEN_SELF' => 1, + 'LT_AC_PROG_GCJ' => 1, + 'DX_CURRENT_FEATURE' => 1, + 'AM_DISABLE_STATIC' => 1, + 'AM_DEP_TRACK' => 1, + '_LT_AC_PROG_CXXCPP' => 1, + '_AC_PROG_LIBTOOL' => 1, + '_AM_IF_OPTION' => 1, + 'DX_HTML_FEATURE' => 1, + 'AC_PATH_TOOL_PREFIX' => 1, + 'AC_LIBTOOL_F77' => 1, + 'm4_pattern_allow' => 1, + 'AM_SET_LEADING_DOT' => 1, + 'LT_AC_PROG_EGREP' => 1, + '_LT_PROG_FC' => 1, + '_AM_DEPENDENCIES' => 1, + 'DX_DIRNAME_EXPR' => 1, + 'AC_LIBTOOL_LANG_C_CONFIG' => 1, + 'LTOPTIONS_VERSION' => 1, + '_LT_AC_SYS_COMPILER' => 1, + 'DX_FEATURE_man' => 1, + 'AM_PROG_NM' => 1, + 'DX_PS_FEATURE' => 1, + 'AC_LIBLTDL_CONVENIENCE' => 1, + 'AC_DEPLIBS_CHECK_METHOD' => 1, + 'AC_LIBLTDL_INSTALLABLE' => 1, + 'AM_SET_CURRENT_AUTOMAKE_VERSION' => 1, + 'AC_LTDL_ENABLE_INSTALL' => 1, + 'AC_LIBTOOL_SYS_DYNAMIC_LINKER' => 1, + 'LT_PROG_GCJ' => 1, + 'DX_FEATURE_chm' => 1, + 'AM_INIT_AUTOMAKE' => 1, + 'DX_FEATURE_rtf' => 1, + 'DX_INIT_DOXYGEN' => 1, + 'AC_DISABLE_STATIC' => 1, + 'LT_PATH_NM' => 1, + 'AC_LTDL_SHLIBEXT' => 1, + '_LT_AC_LOCK' => 1, + '_LT_AC_LANG_RC_CONFIG' => 1, + 'LT_PROG_GO' => 1, + 'LT_SYS_MODULE_PATH' => 1, + 'DX_ENV_APPEND' => 1, + 'LT_WITH_LTDL' => 1, + 'AC_LIBTOOL_POSTDEP_PREDEP' => 1, + 'AC_LTDL_SHLIBPATH' => 1, + 'DX_ARG_ABLE' => 1, + 'AM_AUX_DIR_EXPAND' => 1, + 'AC_LIBTOOL_PROG_COMPILER_NO_RTTI' => 1, + '_LT_AC_LANG_F77_CONFIG' => 1, + '_AM_SET_OPTIONS' => 1, + '_LT_COMPILER_OPTION' => 1, + 'AM_RUN_LOG' => 1, + '_AM_OUTPUT_DEPENDENCY_COMMANDS' => 1, + 'AC_LIBTOOL_SYS_OLD_ARCHIVE' => 1, + 'AC_LTDL_SYS_DLOPEN_DEPLIBS' => 1, + 'AC_LIBTOOL_PICMODE' => 1, + 'LT_PATH_LD' => 1, + 'AC_CHECK_LIBM' => 1, + 'AC_LIBTOOL_SYS_LIB_STRIP' => 1, + '_AM_MANGLE_OPTION' => 1, + 'AC_LTDL_SYMBOL_USCORE' => 1, + 'DX_FEATURE_xml' => 1, + 'AC_LIBTOOL_SYS_MAX_CMD_LEN' => 1, + 'AM_SET_DEPDIR' => 1, + '_LT_CC_BASENAME' => 1, + 'DX_FEATURE_ps' => 1, + '_LT_LIBOBJ' => 1 + } + ], 'Autom4te::Request' ) + ); + diff --git a/pkg/registry/zookeeper-3.4.6/src/c/autom4te.cache/traces.0 b/pkg/registry/zookeeper-3.4.6/src/c/autom4te.cache/traces.0 new file mode 100644 index 000000000..b1370fc45 --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/c/autom4te.cache/traces.0 @@ -0,0 +1,1523 @@ +m4trace:/usr/share/aclocal-1.11/amversion.m4:17: -1- AC_DEFUN([AM_AUTOMAKE_VERSION], [am__api_version='1.11' +dnl Some users find AM_AUTOMAKE_VERSION and mistake it for a way to +dnl require some minimum version. Point them to the right macro. +m4_if([$1], [1.11.6], [], + [AC_FATAL([Do not call $0, use AM_INIT_AUTOMAKE([$1]).])])dnl +]) +m4trace:/usr/share/aclocal-1.11/amversion.m4:36: -1- AC_DEFUN([AM_SET_CURRENT_AUTOMAKE_VERSION], [AM_AUTOMAKE_VERSION([1.11.6])dnl +m4_ifndef([AC_AUTOCONF_VERSION], + [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl +_AM_AUTOCONF_VERSION(m4_defn([AC_AUTOCONF_VERSION]))]) +m4trace:/usr/share/aclocal-1.11/auxdir.m4:49: -1- AC_DEFUN([AM_AUX_DIR_EXPAND], [dnl Rely on autoconf to set up CDPATH properly. +AC_PREREQ([2.50])dnl +# expand $ac_aux_dir to an absolute path +am_aux_dir=`cd $ac_aux_dir && pwd` +]) +m4trace:/usr/share/aclocal-1.11/cond.m4:15: -1- AC_DEFUN([AM_CONDITIONAL], [AC_PREREQ(2.52)dnl + ifelse([$1], [TRUE], [AC_FATAL([$0: invalid condition: $1])], + [$1], [FALSE], [AC_FATAL([$0: invalid condition: $1])])dnl +AC_SUBST([$1_TRUE])dnl +AC_SUBST([$1_FALSE])dnl +_AM_SUBST_NOTMAKE([$1_TRUE])dnl +_AM_SUBST_NOTMAKE([$1_FALSE])dnl +m4_define([_AM_COND_VALUE_$1], [$2])dnl +if $2; then + $1_TRUE= + $1_FALSE='#' +else + $1_TRUE='#' + $1_FALSE= +fi +AC_CONFIG_COMMANDS_PRE( +[if test -z "${$1_TRUE}" && test -z "${$1_FALSE}"; then + AC_MSG_ERROR([[conditional "$1" was never defined. +Usually this means the macro was only invoked conditionally.]]) +fi])]) +m4trace:/usr/share/aclocal-1.11/depend.m4:28: -1- AC_DEFUN([_AM_DEPENDENCIES], [AC_REQUIRE([AM_SET_DEPDIR])dnl +AC_REQUIRE([AM_OUTPUT_DEPENDENCY_COMMANDS])dnl +AC_REQUIRE([AM_MAKE_INCLUDE])dnl +AC_REQUIRE([AM_DEP_TRACK])dnl + +ifelse([$1], CC, [depcc="$CC" am_compiler_list=], + [$1], CXX, [depcc="$CXX" am_compiler_list=], + [$1], OBJC, [depcc="$OBJC" am_compiler_list='gcc3 gcc'], + [$1], UPC, [depcc="$UPC" am_compiler_list=], + [$1], GCJ, [depcc="$GCJ" am_compiler_list='gcc3 gcc'], + [depcc="$$1" am_compiler_list=]) + +AC_CACHE_CHECK([dependency style of $depcc], + [am_cv_$1_dependencies_compiler_type], +[if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then + # We make a subdir and do the tests there. Otherwise we can end up + # making bogus files that we don't know about and never remove. For + # instance it was reported that on HP-UX the gcc test will end up + # making a dummy file named `D' -- because `-MD' means `put the output + # in D'. + rm -rf conftest.dir + mkdir conftest.dir + # Copy depcomp to subdir because otherwise we won't find it if we're + # using a relative directory. + cp "$am_depcomp" conftest.dir + cd conftest.dir + # We will build objects and dependencies in a subdirectory because + # it helps to detect inapplicable dependency modes. For instance + # both Tru64's cc and ICC support -MD to output dependencies as a + # side effect of compilation, but ICC will put the dependencies in + # the current directory while Tru64 will put them in the object + # directory. + mkdir sub + + am_cv_$1_dependencies_compiler_type=none + if test "$am_compiler_list" = ""; then + am_compiler_list=`sed -n ['s/^#*\([a-zA-Z0-9]*\))$/\1/p'] < ./depcomp` + fi + am__universal=false + m4_case([$1], [CC], + [case " $depcc " in #( + *\ -arch\ *\ -arch\ *) am__universal=true ;; + esac], + [CXX], + [case " $depcc " in #( + *\ -arch\ *\ -arch\ *) am__universal=true ;; + esac]) + + for depmode in $am_compiler_list; do + # Setup a source with many dependencies, because some compilers + # like to wrap large dependency lists on column 80 (with \), and + # we should not choose a depcomp mode which is confused by this. + # + # We need to recreate these files for each test, as the compiler may + # overwrite some of them when testing with obscure command lines. + # This happens at least with the AIX C compiler. + : > sub/conftest.c + for i in 1 2 3 4 5 6; do + echo '#include "conftst'$i'.h"' >> sub/conftest.c + # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with + # Solaris 8's {/usr,}/bin/sh. + touch sub/conftst$i.h + done + echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf + + # We check with `-c' and `-o' for the sake of the "dashmstdout" + # mode. It turns out that the SunPro C++ compiler does not properly + # handle `-M -o', and we need to detect this. Also, some Intel + # versions had trouble with output in subdirs + am__obj=sub/conftest.${OBJEXT-o} + am__minus_obj="-o $am__obj" + case $depmode in + gcc) + # This depmode causes a compiler race in universal mode. + test "$am__universal" = false || continue + ;; + nosideeffect) + # after this tag, mechanisms are not by side-effect, so they'll + # only be used when explicitly requested + if test "x$enable_dependency_tracking" = xyes; then + continue + else + break + fi + ;; + msvc7 | msvc7msys | msvisualcpp | msvcmsys) + # This compiler won't grok `-c -o', but also, the minuso test has + # not run yet. These depmodes are late enough in the game, and + # so weak that their functioning should not be impacted. + am__obj=conftest.${OBJEXT-o} + am__minus_obj= + ;; + none) break ;; + esac + if depmode=$depmode \ + source=sub/conftest.c object=$am__obj \ + depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ + $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ + >/dev/null 2>conftest.err && + grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && + grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && + grep $am__obj sub/conftest.Po > /dev/null 2>&1 && + ${MAKE-make} -s -f confmf > /dev/null 2>&1; then + # icc doesn't choke on unknown options, it will just issue warnings + # or remarks (even with -Werror). So we grep stderr for any message + # that says an option was ignored or not supported. + # When given -MP, icc 7.0 and 7.1 complain thusly: + # icc: Command line warning: ignoring option '-M'; no argument required + # The diagnosis changed in icc 8.0: + # icc: Command line remark: option '-MP' not supported + if (grep 'ignoring option' conftest.err || + grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else + am_cv_$1_dependencies_compiler_type=$depmode + break + fi + fi + done + + cd .. + rm -rf conftest.dir +else + am_cv_$1_dependencies_compiler_type=none +fi +]) +AC_SUBST([$1DEPMODE], [depmode=$am_cv_$1_dependencies_compiler_type]) +AM_CONDITIONAL([am__fastdep$1], [ + test "x$enable_dependency_tracking" != xno \ + && test "$am_cv_$1_dependencies_compiler_type" = gcc3]) +]) +m4trace:/usr/share/aclocal-1.11/depend.m4:164: -1- AC_DEFUN([AM_SET_DEPDIR], [AC_REQUIRE([AM_SET_LEADING_DOT])dnl +AC_SUBST([DEPDIR], ["${am__leading_dot}deps"])dnl +]) +m4trace:/usr/share/aclocal-1.11/depend.m4:172: -1- AC_DEFUN([AM_DEP_TRACK], [AC_ARG_ENABLE(dependency-tracking, +[ --disable-dependency-tracking speeds up one-time build + --enable-dependency-tracking do not reject slow dependency extractors]) +if test "x$enable_dependency_tracking" != xno; then + am_depcomp="$ac_aux_dir/depcomp" + AMDEPBACKSLASH='\' + am__nodep='_no' +fi +AM_CONDITIONAL([AMDEP], [test "x$enable_dependency_tracking" != xno]) +AC_SUBST([AMDEPBACKSLASH])dnl +_AM_SUBST_NOTMAKE([AMDEPBACKSLASH])dnl +AC_SUBST([am__nodep])dnl +_AM_SUBST_NOTMAKE([am__nodep])dnl +]) +m4trace:/usr/share/aclocal-1.11/depout.m4:14: -1- AC_DEFUN([_AM_OUTPUT_DEPENDENCY_COMMANDS], [{ + # Autoconf 2.62 quotes --file arguments for eval, but not when files + # are listed without --file. Let's play safe and only enable the eval + # if we detect the quoting. + case $CONFIG_FILES in + *\'*) eval set x "$CONFIG_FILES" ;; + *) set x $CONFIG_FILES ;; + esac + shift + for mf + do + # Strip MF so we end up with the name of the file. + mf=`echo "$mf" | sed -e 's/:.*$//'` + # Check whether this is an Automake generated Makefile or not. + # We used to match only the files named `Makefile.in', but + # some people rename them; so instead we look at the file content. + # Grep'ing the first line is not enough: some people post-process + # each Makefile.in and add a new line on top of each file to say so. + # Grep'ing the whole file is not good either: AIX grep has a line + # limit of 2048, but all sed's we know have understand at least 4000. + if sed -n 's,^#.*generated by automake.*,X,p' "$mf" | grep X >/dev/null 2>&1; then + dirpart=`AS_DIRNAME("$mf")` + else + continue + fi + # Extract the definition of DEPDIR, am__include, and am__quote + # from the Makefile without running `make'. + DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"` + test -z "$DEPDIR" && continue + am__include=`sed -n 's/^am__include = //p' < "$mf"` + test -z "am__include" && continue + am__quote=`sed -n 's/^am__quote = //p' < "$mf"` + # When using ansi2knr, U may be empty or an underscore; expand it + U=`sed -n 's/^U = //p' < "$mf"` + # Find all dependency output files, they are included files with + # $(DEPDIR) in their names. We invoke sed twice because it is the + # simplest approach to changing $(DEPDIR) to its actual value in the + # expansion. + for file in `sed -n " + s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \ + sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g' -e 's/\$U/'"$U"'/g'`; do + # Make sure the directory exists. + test -f "$dirpart/$file" && continue + fdir=`AS_DIRNAME(["$file"])` + AS_MKDIR_P([$dirpart/$fdir]) + # echo "creating $dirpart/$file" + echo '# dummy' > "$dirpart/$file" + done + done +} +]) +m4trace:/usr/share/aclocal-1.11/depout.m4:75: -1- AC_DEFUN([AM_OUTPUT_DEPENDENCY_COMMANDS], [AC_CONFIG_COMMANDS([depfiles], + [test x"$AMDEP_TRUE" != x"" || _AM_OUTPUT_DEPENDENCY_COMMANDS], + [AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir"]) +]) +m4trace:/usr/share/aclocal-1.11/init.m4:26: -1- AC_DEFUN([AM_INIT_AUTOMAKE], [AC_PREREQ([2.62])dnl +dnl Autoconf wants to disallow AM_ names. We explicitly allow +dnl the ones we care about. +m4_pattern_allow([^AM_[A-Z]+FLAGS$])dnl +AC_REQUIRE([AM_SET_CURRENT_AUTOMAKE_VERSION])dnl +AC_REQUIRE([AC_PROG_INSTALL])dnl +if test "`cd $srcdir && pwd`" != "`pwd`"; then + # Use -I$(srcdir) only when $(srcdir) != ., so that make's output + # is not polluted with repeated "-I." + AC_SUBST([am__isrc], [' -I$(srcdir)'])_AM_SUBST_NOTMAKE([am__isrc])dnl + # test to see if srcdir already configured + if test -f $srcdir/config.status; then + AC_MSG_ERROR([source directory already configured; run "make distclean" there first]) + fi +fi + +# test whether we have cygpath +if test -z "$CYGPATH_W"; then + if (cygpath --version) >/dev/null 2>/dev/null; then + CYGPATH_W='cygpath -w' + else + CYGPATH_W=echo + fi +fi +AC_SUBST([CYGPATH_W]) + +# Define the identity of the package. +dnl Distinguish between old-style and new-style calls. +m4_ifval([$2], +[m4_ifval([$3], [_AM_SET_OPTION([no-define])])dnl + AC_SUBST([PACKAGE], [$1])dnl + AC_SUBST([VERSION], [$2])], +[_AM_SET_OPTIONS([$1])dnl +dnl Diagnose old-style AC_INIT with new-style AM_AUTOMAKE_INIT. +m4_if(m4_ifdef([AC_PACKAGE_NAME], 1)m4_ifdef([AC_PACKAGE_VERSION], 1), 11,, + [m4_fatal([AC_INIT should be called with package and version arguments])])dnl + AC_SUBST([PACKAGE], ['AC_PACKAGE_TARNAME'])dnl + AC_SUBST([VERSION], ['AC_PACKAGE_VERSION'])])dnl + +_AM_IF_OPTION([no-define],, +[AC_DEFINE_UNQUOTED(PACKAGE, "$PACKAGE", [Name of package]) + AC_DEFINE_UNQUOTED(VERSION, "$VERSION", [Version number of package])])dnl + +# Some tools Automake needs. +AC_REQUIRE([AM_SANITY_CHECK])dnl +AC_REQUIRE([AC_ARG_PROGRAM])dnl +AM_MISSING_PROG(ACLOCAL, aclocal-${am__api_version}) +AM_MISSING_PROG(AUTOCONF, autoconf) +AM_MISSING_PROG(AUTOMAKE, automake-${am__api_version}) +AM_MISSING_PROG(AUTOHEADER, autoheader) +AM_MISSING_PROG(MAKEINFO, makeinfo) +AC_REQUIRE([AM_PROG_INSTALL_SH])dnl +AC_REQUIRE([AM_PROG_INSTALL_STRIP])dnl +AC_REQUIRE([AM_PROG_MKDIR_P])dnl +# We need awk for the "check" target. The system "awk" is bad on +# some platforms. +AC_REQUIRE([AC_PROG_AWK])dnl +AC_REQUIRE([AC_PROG_MAKE_SET])dnl +AC_REQUIRE([AM_SET_LEADING_DOT])dnl +_AM_IF_OPTION([tar-ustar], [_AM_PROG_TAR([ustar])], + [_AM_IF_OPTION([tar-pax], [_AM_PROG_TAR([pax])], + [_AM_PROG_TAR([v7])])]) +_AM_IF_OPTION([no-dependencies],, +[AC_PROVIDE_IFELSE([AC_PROG_CC], + [_AM_DEPENDENCIES(CC)], + [define([AC_PROG_CC], + defn([AC_PROG_CC])[_AM_DEPENDENCIES(CC)])])dnl +AC_PROVIDE_IFELSE([AC_PROG_CXX], + [_AM_DEPENDENCIES(CXX)], + [define([AC_PROG_CXX], + defn([AC_PROG_CXX])[_AM_DEPENDENCIES(CXX)])])dnl +AC_PROVIDE_IFELSE([AC_PROG_OBJC], + [_AM_DEPENDENCIES(OBJC)], + [define([AC_PROG_OBJC], + defn([AC_PROG_OBJC])[_AM_DEPENDENCIES(OBJC)])])dnl +]) +_AM_IF_OPTION([silent-rules], [AC_REQUIRE([AM_SILENT_RULES])])dnl +dnl The `parallel-tests' driver may need to know about EXEEXT, so add the +dnl `am__EXEEXT' conditional if _AM_COMPILER_EXEEXT was seen. This macro +dnl is hooked onto _AC_COMPILER_EXEEXT early, see below. +AC_CONFIG_COMMANDS_PRE(dnl +[m4_provide_if([_AM_COMPILER_EXEEXT], + [AM_CONDITIONAL([am__EXEEXT], [test -n "$EXEEXT"])])])dnl +]) +m4trace:/usr/share/aclocal-1.11/init.m4:126: -1- AC_DEFUN([_AC_AM_CONFIG_HEADER_HOOK], [# Compute $1's index in $config_headers. +_am_arg=$1 +_am_stamp_count=1 +for _am_header in $config_headers :; do + case $_am_header in + $_am_arg | $_am_arg:* ) + break ;; + * ) + _am_stamp_count=`expr $_am_stamp_count + 1` ;; + esac +done +echo "timestamp for $_am_arg" >`AS_DIRNAME(["$_am_arg"])`/stamp-h[]$_am_stamp_count]) +m4trace:/usr/share/aclocal-1.11/install-sh.m4:14: -1- AC_DEFUN([AM_PROG_INSTALL_SH], [AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl +if test x"${install_sh}" != xset; then + case $am_aux_dir in + *\ * | *\ *) + install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;; + *) + install_sh="\${SHELL} $am_aux_dir/install-sh" + esac +fi +AC_SUBST(install_sh)]) +m4trace:/usr/share/aclocal-1.11/lead-dot.m4:12: -1- AC_DEFUN([AM_SET_LEADING_DOT], [rm -rf .tst 2>/dev/null +mkdir .tst 2>/dev/null +if test -d .tst; then + am__leading_dot=. +else + am__leading_dot=_ +fi +rmdir .tst 2>/dev/null +AC_SUBST([am__leading_dot])]) +m4trace:/usr/share/aclocal-1.11/make.m4:14: -1- AC_DEFUN([AM_MAKE_INCLUDE], [am_make=${MAKE-make} +cat > confinc << 'END' +am__doit: + @echo this is the am__doit target +.PHONY: am__doit +END +# If we don't find an include directive, just comment out the code. +AC_MSG_CHECKING([for style of include used by $am_make]) +am__include="#" +am__quote= +_am_result=none +# First try GNU make style include. +echo "include confinc" > confmf +# Ignore all kinds of additional output from `make'. +case `$am_make -s -f confmf 2> /dev/null` in #( +*the\ am__doit\ target*) + am__include=include + am__quote= + _am_result=GNU + ;; +esac +# Now try BSD make style include. +if test "$am__include" = "#"; then + echo '.include "confinc"' > confmf + case `$am_make -s -f confmf 2> /dev/null` in #( + *the\ am__doit\ target*) + am__include=.include + am__quote="\"" + _am_result=BSD + ;; + esac +fi +AC_SUBST([am__include]) +AC_SUBST([am__quote]) +AC_MSG_RESULT([$_am_result]) +rm -f confinc confmf +]) +m4trace:/usr/share/aclocal-1.11/minuso.m4:14: -1- AC_DEFUN([AM_PROG_CC_C_O], [AC_REQUIRE([AC_PROG_CC_C_O])dnl +AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl +AC_REQUIRE_AUX_FILE([compile])dnl +# FIXME: we rely on the cache variable name because +# there is no other way. +set dummy $CC +am_cc=`echo $[2] | sed ['s/[^a-zA-Z0-9_]/_/g;s/^[0-9]/_/']` +eval am_t=\$ac_cv_prog_cc_${am_cc}_c_o +if test "$am_t" != yes; then + # Losing compiler, so override with the script. + # FIXME: It is wrong to rewrite CC. + # But if we don't then we get into trouble of one sort or another. + # A longer-term fix would be to have automake use am__CC in this case, + # and then we could set am__CC="\$(top_srcdir)/compile \$(CC)" + CC="$am_aux_dir/compile $CC" +fi +dnl Make sure AC_PROG_CC is never called again, or it will override our +dnl setting of CC. +m4_define([AC_PROG_CC], + [m4_fatal([AC_PROG_CC cannot be called after AM_PROG_CC_C_O])]) +]) +m4trace:/usr/share/aclocal-1.11/missing.m4:14: -1- AC_DEFUN([AM_MISSING_PROG], [AC_REQUIRE([AM_MISSING_HAS_RUN]) +$1=${$1-"${am_missing_run}$2"} +AC_SUBST($1)]) +m4trace:/usr/share/aclocal-1.11/missing.m4:24: -1- AC_DEFUN([AM_MISSING_HAS_RUN], [AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl +AC_REQUIRE_AUX_FILE([missing])dnl +if test x"${MISSING+set}" != xset; then + case $am_aux_dir in + *\ * | *\ *) + MISSING="\${SHELL} \"$am_aux_dir/missing\"" ;; + *) + MISSING="\${SHELL} $am_aux_dir/missing" ;; + esac +fi +# Use eval to expand $SHELL +if eval "$MISSING --run true"; then + am_missing_run="$MISSING --run " +else + am_missing_run= + AC_MSG_WARN([`missing' script is too old or missing]) +fi +]) +m4trace:/usr/share/aclocal-1.11/mkdirp.m4:14: -1- AC_DEFUN([AM_PROG_MKDIR_P], [AC_PREREQ([2.60])dnl +AC_REQUIRE([AC_PROG_MKDIR_P])dnl +dnl Automake 1.8 to 1.9.6 used to define mkdir_p. We now use MKDIR_P, +dnl while keeping a definition of mkdir_p for backward compatibility. +dnl @MKDIR_P@ is magic: AC_OUTPUT adjusts its value for each Makefile. +dnl However we cannot define mkdir_p as $(MKDIR_P) for the sake of +dnl Makefile.ins that do not define MKDIR_P, so we do our own +dnl adjustment using top_builddir (which is defined more often than +dnl MKDIR_P). +AC_SUBST([mkdir_p], ["$MKDIR_P"])dnl +case $mkdir_p in + [[\\/$]]* | ?:[[\\/]]*) ;; + */*) mkdir_p="\$(top_builddir)/$mkdir_p" ;; +esac +]) +m4trace:/usr/share/aclocal-1.11/options.m4:14: -1- AC_DEFUN([_AM_MANGLE_OPTION], [[_AM_OPTION_]m4_bpatsubst($1, [[^a-zA-Z0-9_]], [_])]) +m4trace:/usr/share/aclocal-1.11/options.m4:20: -1- AC_DEFUN([_AM_SET_OPTION], [m4_define(_AM_MANGLE_OPTION([$1]), 1)]) +m4trace:/usr/share/aclocal-1.11/options.m4:26: -1- AC_DEFUN([_AM_SET_OPTIONS], [m4_foreach_w([_AM_Option], [$1], [_AM_SET_OPTION(_AM_Option)])]) +m4trace:/usr/share/aclocal-1.11/options.m4:32: -1- AC_DEFUN([_AM_IF_OPTION], [m4_ifset(_AM_MANGLE_OPTION([$1]), [$2], [$3])]) +m4trace:/usr/share/aclocal-1.11/runlog.m4:14: -1- AC_DEFUN([AM_RUN_LOG], [{ echo "$as_me:$LINENO: $1" >&AS_MESSAGE_LOG_FD + ($1) >&AS_MESSAGE_LOG_FD 2>&AS_MESSAGE_LOG_FD + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&AS_MESSAGE_LOG_FD + (exit $ac_status); }]) +m4trace:/usr/share/aclocal-1.11/sanity.m4:14: -1- AC_DEFUN([AM_SANITY_CHECK], [AC_MSG_CHECKING([whether build environment is sane]) +# Just in case +sleep 1 +echo timestamp > conftest.file +# Reject unsafe characters in $srcdir or the absolute working directory +# name. Accept space and tab only in the latter. +am_lf=' +' +case `pwd` in + *[[\\\"\#\$\&\'\`$am_lf]]*) + AC_MSG_ERROR([unsafe absolute working directory name]);; +esac +case $srcdir in + *[[\\\"\#\$\&\'\`$am_lf\ \ ]]*) + AC_MSG_ERROR([unsafe srcdir value: `$srcdir']);; +esac + +# Do `set' in a subshell so we don't clobber the current shell's +# arguments. Must try -L first in case configure is actually a +# symlink; some systems play weird games with the mod time of symlinks +# (eg FreeBSD returns the mod time of the symlink's containing +# directory). +if ( + set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null` + if test "$[*]" = "X"; then + # -L didn't work. + set X `ls -t "$srcdir/configure" conftest.file` + fi + rm -f conftest.file + if test "$[*]" != "X $srcdir/configure conftest.file" \ + && test "$[*]" != "X conftest.file $srcdir/configure"; then + + # If neither matched, then we have a broken ls. This can happen + # if, for instance, CONFIG_SHELL is bash and it inherits a + # broken ls alias from the environment. This has actually + # happened. Such a system could not be considered "sane". + AC_MSG_ERROR([ls -t appears to fail. Make sure there is not a broken +alias in your environment]) + fi + + test "$[2]" = conftest.file + ) +then + # Ok. + : +else + AC_MSG_ERROR([newly created file is older than distributed files! +Check your system clock]) +fi +AC_MSG_RESULT(yes)]) +m4trace:/usr/share/aclocal-1.11/silent.m4:14: -1- AC_DEFUN([AM_SILENT_RULES], [AC_ARG_ENABLE([silent-rules], +[ --enable-silent-rules less verbose build output (undo: `make V=1') + --disable-silent-rules verbose build output (undo: `make V=0')]) +case $enable_silent_rules in +yes) AM_DEFAULT_VERBOSITY=0;; +no) AM_DEFAULT_VERBOSITY=1;; +*) AM_DEFAULT_VERBOSITY=m4_if([$1], [yes], [0], [1]);; +esac +dnl +dnl A few `make' implementations (e.g., NonStop OS and NextStep) +dnl do not support nested variable expansions. +dnl See automake bug#9928 and bug#10237. +am_make=${MAKE-make} +AC_CACHE_CHECK([whether $am_make supports nested variables], + [am_cv_make_support_nested_variables], + [if AS_ECHO([['TRUE=$(BAR$(V)) +BAR0=false +BAR1=true +V=1 +am__doit: + @$(TRUE) +.PHONY: am__doit']]) | $am_make -f - >/dev/null 2>&1; then + am_cv_make_support_nested_variables=yes +else + am_cv_make_support_nested_variables=no +fi]) +if test $am_cv_make_support_nested_variables = yes; then + dnl Using `$V' instead of `$(V)' breaks IRIX make. + AM_V='$(V)' + AM_DEFAULT_V='$(AM_DEFAULT_VERBOSITY)' +else + AM_V=$AM_DEFAULT_VERBOSITY + AM_DEFAULT_V=$AM_DEFAULT_VERBOSITY +fi +AC_SUBST([AM_V])dnl +AM_SUBST_NOTMAKE([AM_V])dnl +AC_SUBST([AM_DEFAULT_V])dnl +AM_SUBST_NOTMAKE([AM_DEFAULT_V])dnl +AC_SUBST([AM_DEFAULT_VERBOSITY])dnl +AM_BACKSLASH='\' +AC_SUBST([AM_BACKSLASH])dnl +_AM_SUBST_NOTMAKE([AM_BACKSLASH])dnl +]) +m4trace:/usr/share/aclocal-1.11/strip.m4:19: -1- AC_DEFUN([AM_PROG_INSTALL_STRIP], [AC_REQUIRE([AM_PROG_INSTALL_SH])dnl +# Installed binaries are usually stripped using `strip' when the user +# run `make install-strip'. However `strip' might not be the right +# tool to use in cross-compilation environments, therefore Automake +# will honor the `STRIP' environment variable to overrule this program. +dnl Don't test for $cross_compiling = yes, because it might be `maybe'. +if test "$cross_compiling" != no; then + AC_CHECK_TOOL([STRIP], [strip], :) +fi +INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s" +AC_SUBST([INSTALL_STRIP_PROGRAM])]) +m4trace:/usr/share/aclocal-1.11/substnot.m4:14: -1- AC_DEFUN([_AM_SUBST_NOTMAKE]) +m4trace:/usr/share/aclocal-1.11/substnot.m4:19: -1- AC_DEFUN([AM_SUBST_NOTMAKE], [_AM_SUBST_NOTMAKE($@)]) +m4trace:/usr/share/aclocal-1.11/tar.m4:24: -1- AC_DEFUN([_AM_PROG_TAR], [# Always define AMTAR for backward compatibility. Yes, it's still used +# in the wild :-( We should find a proper way to deprecate it ... +AC_SUBST([AMTAR], ['$${TAR-tar}']) +m4_if([$1], [v7], + [am__tar='$${TAR-tar} chof - "$$tardir"' am__untar='$${TAR-tar} xf -'], + [m4_case([$1], [ustar],, [pax],, + [m4_fatal([Unknown tar format])]) +AC_MSG_CHECKING([how to create a $1 tar archive]) +# Loop over all known methods to create a tar archive until one works. +_am_tools='gnutar m4_if([$1], [ustar], [plaintar]) pax cpio none' +_am_tools=${am_cv_prog_tar_$1-$_am_tools} +# Do not fold the above two line into one, because Tru64 sh and +# Solaris sh will not grok spaces in the rhs of `-'. +for _am_tool in $_am_tools +do + case $_am_tool in + gnutar) + for _am_tar in tar gnutar gtar; + do + AM_RUN_LOG([$_am_tar --version]) && break + done + am__tar="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$$tardir"' + am__tar_="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$tardir"' + am__untar="$_am_tar -xf -" + ;; + plaintar) + # Must skip GNU tar: if it does not support --format= it doesn't create + # ustar tarball either. + (tar --version) >/dev/null 2>&1 && continue + am__tar='tar chf - "$$tardir"' + am__tar_='tar chf - "$tardir"' + am__untar='tar xf -' + ;; + pax) + am__tar='pax -L -x $1 -w "$$tardir"' + am__tar_='pax -L -x $1 -w "$tardir"' + am__untar='pax -r' + ;; + cpio) + am__tar='find "$$tardir" -print | cpio -o -H $1 -L' + am__tar_='find "$tardir" -print | cpio -o -H $1 -L' + am__untar='cpio -i -H $1 -d' + ;; + none) + am__tar=false + am__tar_=false + am__untar=false + ;; + esac + + # If the value was cached, stop now. We just wanted to have am__tar + # and am__untar set. + test -n "${am_cv_prog_tar_$1}" && break + + # tar/untar a dummy directory, and stop if the command works + rm -rf conftest.dir + mkdir conftest.dir + echo GrepMe > conftest.dir/file + AM_RUN_LOG([tardir=conftest.dir && eval $am__tar_ >conftest.tar]) + rm -rf conftest.dir + if test -s conftest.tar; then + AM_RUN_LOG([$am__untar /dev/null 2>&1 && break + fi +done +rm -rf conftest.dir + +AC_CACHE_VAL([am_cv_prog_tar_$1], [am_cv_prog_tar_$1=$_am_tool]) +AC_MSG_RESULT([$am_cv_prog_tar_$1])]) +AC_SUBST([am__tar]) +AC_SUBST([am__untar]) +]) +m4trace:acinclude.m4:43: -1- AC_DEFUN([DX_FEATURE_doc], [ON]) +m4trace:acinclude.m4:44: -1- AC_DEFUN([DX_FEATURE_dot], [ON]) +m4trace:acinclude.m4:45: -1- AC_DEFUN([DX_FEATURE_man], [OFF]) +m4trace:acinclude.m4:46: -1- AC_DEFUN([DX_FEATURE_html], [ON]) +m4trace:acinclude.m4:47: -1- AC_DEFUN([DX_FEATURE_chm], [OFF]) +m4trace:acinclude.m4:48: -1- AC_DEFUN([DX_FEATURE_chi], [OFF]) +m4trace:acinclude.m4:49: -1- AC_DEFUN([DX_FEATURE_rtf], [OFF]) +m4trace:acinclude.m4:50: -1- AC_DEFUN([DX_FEATURE_xml], [OFF]) +m4trace:acinclude.m4:51: -1- AC_DEFUN([DX_FEATURE_pdf], [ON]) +m4trace:acinclude.m4:52: -1- AC_DEFUN([DX_FEATURE_ps], [ON]) +m4trace:acinclude.m4:61: -1- AC_DEFUN([DX_ENV_APPEND], [AC_SUBST([DX_ENV], ["$DX_ENV $1='$2'"])]) +m4trace:acinclude.m4:66: -1- AC_DEFUN([DX_DIRNAME_EXPR], [[expr ".$1" : '\(\.\)[^/]*$' \| "x$1" : 'x\(.*\)/[^/]*$']]) +m4trace:acinclude.m4:72: -1- AC_DEFUN([DX_IF_FEATURE], [ifelse(DX_FEATURE_$1, ON, [$2], [$3])]) +m4trace:acinclude.m4:77: -1- AC_DEFUN([DX_REQUIRE_PROG], [ +AC_PATH_TOOL([$1], [$2]) +if test "$DX_FLAG_$[DX_CURRENT_FEATURE$$1]" = 1; then + AC_MSG_WARN([$2 not found - will not DX_CURRENT_DESCRIPTION]) + AC_SUBST([DX_FLAG_]DX_CURRENT_FEATURE, 0) +fi +]) +m4trace:acinclude.m4:88: -1- AC_DEFUN([DX_TEST_FEATURE], [test "$DX_FLAG_$1" = 1]) +m4trace:acinclude.m4:94: -1- AC_DEFUN([DX_CHECK_DEPEND], [ +test "$DX_FLAG_$1" = "$2" \ +|| AC_MSG_ERROR([doxygen-DX_CURRENT_FEATURE ifelse([$2], 1, + requires, contradicts) doxygen-DX_CURRENT_FEATURE]) +]) +m4trace:acinclude.m4:103: -1- AC_DEFUN([DX_CLEAR_DEPEND], [ +test "$DX_FLAG_$1" = "$2" || AC_SUBST([DX_FLAG_]DX_CURRENT_FEATURE, 0) +]) +m4trace:acinclude.m4:117: -1- AC_DEFUN([DX_ARG_ABLE], [ + AC_DEFUN([DX_CURRENT_FEATURE], [$1]) + AC_DEFUN([DX_CURRENT_DESCRIPTION], [$2]) + AC_ARG_ENABLE(doxygen-$1, + [AS_HELP_STRING(DX_IF_FEATURE([$1], [--disable-doxygen-$1], + [--enable-doxygen-$1]), + DX_IF_FEATURE([$1], [don't $2], [$2]))], + [ +case "$enableval" in +#( +y|Y|yes|Yes|YES) + AC_SUBST([DX_FLAG_$1], 1) + $3 +;; #( +n|N|no|No|NO) + AC_SUBST([DX_FLAG_$1], 0) +;; #( +*) + AC_MSG_ERROR([invalid value '$enableval' given to doxygen-$1]) +;; +esac +], [ +AC_SUBST([DX_FLAG_$1], [DX_IF_FEATURE([$1], 1, 0)]) +$4 +]) +if DX_TEST_FEATURE([$1]); then + $5 + : +fi +if DX_TEST_FEATURE([$1]); then + AM_CONDITIONAL(DX_COND_$1, :) + $6 + : +else + AM_CONDITIONAL(DX_COND_$1, false) + $7 + : +fi +]) +m4trace:acinclude.m4:163: -1- AC_DEFUN([DX_DOXYGEN_FEATURE], [AC_DEFUN([DX_FEATURE_doc], [$1])]) +m4trace:acinclude.m4:164: -1- AC_DEFUN([DX_MAN_FEATURE], [AC_DEFUN([DX_FEATURE_man], [$1])]) +m4trace:acinclude.m4:165: -1- AC_DEFUN([DX_HTML_FEATURE], [AC_DEFUN([DX_FEATURE_html], [$1])]) +m4trace:acinclude.m4:166: -1- AC_DEFUN([DX_CHM_FEATURE], [AC_DEFUN([DX_FEATURE_chm], [$1])]) +m4trace:acinclude.m4:167: -1- AC_DEFUN([DX_CHI_FEATURE], [AC_DEFUN([DX_FEATURE_chi], [$1])]) +m4trace:acinclude.m4:168: -1- AC_DEFUN([DX_RTF_FEATURE], [AC_DEFUN([DX_FEATURE_rtf], [$1])]) +m4trace:acinclude.m4:169: -1- AC_DEFUN([DX_XML_FEATURE], [AC_DEFUN([DX_FEATURE_xml], [$1])]) +m4trace:acinclude.m4:170: -1- AC_DEFUN([DX_XML_FEATURE], [AC_DEFUN([DX_FEATURE_xml], [$1])]) +m4trace:acinclude.m4:171: -1- AC_DEFUN([DX_PDF_FEATURE], [AC_DEFUN([DX_FEATURE_pdf], [$1])]) +m4trace:acinclude.m4:172: -1- AC_DEFUN([DX_PS_FEATURE], [AC_DEFUN([DX_FEATURE_ps], [$1])]) +m4trace:acinclude.m4:178: -1- AC_DEFUN([DX_INIT_DOXYGEN], [ + +# Files: +AC_SUBST([DX_PROJECT], [$1]) +AC_SUBST([DX_CONFIG], [ifelse([$2], [], Doxyfile, [$2])]) +AC_SUBST([DX_DOCDIR], [ifelse([$3], [], doxygen-doc, [$3])]) + +# Environment variables used inside doxygen.cfg: +DX_ENV_APPEND(SRCDIR, $srcdir) +DX_ENV_APPEND(PROJECT, $DX_PROJECT) +DX_ENV_APPEND(DOCDIR, $DX_DOCDIR) +DX_ENV_APPEND(VERSION, $PACKAGE_VERSION) + +# Doxygen itself: +DX_ARG_ABLE(doc, [generate any doxygen documentation], + [], + [], + [DX_REQUIRE_PROG([DX_DOXYGEN], doxygen) + DX_REQUIRE_PROG([DX_PERL], perl)], + [DX_ENV_APPEND(PERL_PATH, $DX_PERL)]) + +# Dot for graphics: +DX_ARG_ABLE(dot, [generate graphics for doxygen documentation], + [DX_CHECK_DEPEND(doc, 1)], + [DX_CLEAR_DEPEND(doc, 1)], + [DX_REQUIRE_PROG([DX_DOT], dot)], + [DX_ENV_APPEND(HAVE_DOT, YES) + DX_ENV_APPEND(DOT_PATH, [`DX_DIRNAME_EXPR($DX_DOT)`])], + [DX_ENV_APPEND(HAVE_DOT, NO)]) + +# Man pages generation: +DX_ARG_ABLE(man, [generate doxygen manual pages], + [DX_CHECK_DEPEND(doc, 1)], + [DX_CLEAR_DEPEND(doc, 1)], + [], + [DX_ENV_APPEND(GENERATE_MAN, YES)], + [DX_ENV_APPEND(GENERATE_MAN, NO)]) + +# RTF file generation: +DX_ARG_ABLE(rtf, [generate doxygen RTF documentation], + [DX_CHECK_DEPEND(doc, 1)], + [DX_CLEAR_DEPEND(doc, 1)], + [], + [DX_ENV_APPEND(GENERATE_RTF, YES)], + [DX_ENV_APPEND(GENERATE_RTF, NO)]) + +# XML file generation: +DX_ARG_ABLE(xml, [generate doxygen XML documentation], + [DX_CHECK_DEPEND(doc, 1)], + [DX_CLEAR_DEPEND(doc, 1)], + [], + [DX_ENV_APPEND(GENERATE_XML, YES)], + [DX_ENV_APPEND(GENERATE_XML, NO)]) + +# (Compressed) HTML help generation: +DX_ARG_ABLE(chm, [generate doxygen compressed HTML help documentation], + [DX_CHECK_DEPEND(doc, 1)], + [DX_CLEAR_DEPEND(doc, 1)], + [DX_REQUIRE_PROG([DX_HHC], hhc)], + [DX_ENV_APPEND(HHC_PATH, $DX_HHC) + DX_ENV_APPEND(GENERATE_HTML, YES) + DX_ENV_APPEND(GENERATE_HTMLHELP, YES)], + [DX_ENV_APPEND(GENERATE_HTMLHELP, NO)]) + +# Seperate CHI file generation. +DX_ARG_ABLE(chi, [generate doxygen seperate compressed HTML help index file], + [DX_CHECK_DEPEND(chm, 1)], + [DX_CLEAR_DEPEND(chm, 1)], + [], + [DX_ENV_APPEND(GENERATE_CHI, YES)], + [DX_ENV_APPEND(GENERATE_CHI, NO)]) + +# Plain HTML pages generation: +DX_ARG_ABLE(html, [generate doxygen plain HTML documentation], + [DX_CHECK_DEPEND(doc, 1) DX_CHECK_DEPEND(chm, 0)], + [DX_CLEAR_DEPEND(doc, 1) DX_CLEAR_DEPEND(chm, 0)], + [], + [DX_ENV_APPEND(GENERATE_HTML, YES)], + [DX_TEST_FEATURE(chm) || DX_ENV_APPEND(GENERATE_HTML, NO)]) + +# PostScript file generation: +DX_ARG_ABLE(ps, [generate doxygen PostScript documentation], + [DX_CHECK_DEPEND(doc, 1)], + [DX_CLEAR_DEPEND(doc, 1)], + [DX_REQUIRE_PROG([DX_LATEX], latex) + DX_REQUIRE_PROG([DX_MAKEINDEX], makeindex) + DX_REQUIRE_PROG([DX_DVIPS], dvips) + DX_REQUIRE_PROG([DX_EGREP], egrep)]) + +# PDF file generation: +DX_ARG_ABLE(pdf, [generate doxygen PDF documentation], + [DX_CHECK_DEPEND(doc, 1)], + [DX_CLEAR_DEPEND(doc, 1)], + [DX_REQUIRE_PROG([DX_PDFLATEX], pdflatex) + DX_REQUIRE_PROG([DX_MAKEINDEX], makeindex) + DX_REQUIRE_PROG([DX_EGREP], egrep)]) + +# LaTeX generation for PS and/or PDF: +if DX_TEST_FEATURE(ps) || DX_TEST_FEATURE(pdf); then + AM_CONDITIONAL(DX_COND_latex, :) + DX_ENV_APPEND(GENERATE_LATEX, YES) +else + AM_CONDITIONAL(DX_COND_latex, false) + DX_ENV_APPEND(GENERATE_LATEX, NO) +fi + +# Paper size for PS and/or PDF: +AC_ARG_VAR(DOXYGEN_PAPER_SIZE, + [a4wide (default), a4, letter, legal or executive]) +case "$DOXYGEN_PAPER_SIZE" in +#( +"") + AC_SUBST(DOXYGEN_PAPER_SIZE, "") +;; #( +a4wide|a4|letter|legal|executive) + DX_ENV_APPEND(PAPER_SIZE, $DOXYGEN_PAPER_SIZE) +;; #( +*) + AC_MSG_ERROR([unknown DOXYGEN_PAPER_SIZE='$DOXYGEN_PAPER_SIZE']) +;; +esac + +#For debugging: +#echo DX_FLAG_doc=$DX_FLAG_doc +#echo DX_FLAG_dot=$DX_FLAG_dot +#echo DX_FLAG_man=$DX_FLAG_man +#echo DX_FLAG_html=$DX_FLAG_html +#echo DX_FLAG_chm=$DX_FLAG_chm +#echo DX_FLAG_chi=$DX_FLAG_chi +#echo DX_FLAG_rtf=$DX_FLAG_rtf +#echo DX_FLAG_xml=$DX_FLAG_xml +#echo DX_FLAG_pdf=$DX_FLAG_pdf +#echo DX_FLAG_ps=$DX_FLAG_ps +#echo DX_ENV=$DX_ENV +]) +m4trace:configure.ac:6: -1- m4_pattern_forbid([^_?A[CHUM]_]) +m4trace:configure.ac:6: -1- m4_pattern_forbid([_AC_]) +m4trace:configure.ac:6: -1- m4_pattern_forbid([^LIBOBJS$], [do not use LIBOBJS directly, use AC_LIBOBJ (see section `AC_LIBOBJ vs LIBOBJS']) +m4trace:configure.ac:6: -1- m4_pattern_allow([^AS_FLAGS$]) +m4trace:configure.ac:6: -1- m4_pattern_forbid([^_?m4_]) +m4trace:configure.ac:6: -1- m4_pattern_forbid([^dnl$]) +m4trace:configure.ac:6: -1- m4_pattern_forbid([^_?AS_]) +m4trace:configure.ac:6: -1- m4_pattern_allow([^SHELL$]) +m4trace:configure.ac:6: -1- m4_pattern_allow([^PATH_SEPARATOR$]) +m4trace:configure.ac:6: -1- m4_pattern_allow([^PACKAGE_NAME$]) +m4trace:configure.ac:6: -1- m4_pattern_allow([^PACKAGE_TARNAME$]) +m4trace:configure.ac:6: -1- m4_pattern_allow([^PACKAGE_VERSION$]) +m4trace:configure.ac:6: -1- m4_pattern_allow([^PACKAGE_STRING$]) +m4trace:configure.ac:6: -1- m4_pattern_allow([^PACKAGE_BUGREPORT$]) +m4trace:configure.ac:6: -1- m4_pattern_allow([^PACKAGE_URL$]) +m4trace:configure.ac:6: -1- m4_pattern_allow([^exec_prefix$]) +m4trace:configure.ac:6: -1- m4_pattern_allow([^prefix$]) +m4trace:configure.ac:6: -1- m4_pattern_allow([^program_transform_name$]) +m4trace:configure.ac:6: -1- m4_pattern_allow([^bindir$]) +m4trace:configure.ac:6: -1- m4_pattern_allow([^sbindir$]) +m4trace:configure.ac:6: -1- m4_pattern_allow([^libexecdir$]) +m4trace:configure.ac:6: -1- m4_pattern_allow([^datarootdir$]) +m4trace:configure.ac:6: -1- m4_pattern_allow([^datadir$]) +m4trace:configure.ac:6: -1- m4_pattern_allow([^sysconfdir$]) +m4trace:configure.ac:6: -1- m4_pattern_allow([^sharedstatedir$]) +m4trace:configure.ac:6: -1- m4_pattern_allow([^localstatedir$]) +m4trace:configure.ac:6: -1- m4_pattern_allow([^includedir$]) +m4trace:configure.ac:6: -1- m4_pattern_allow([^oldincludedir$]) +m4trace:configure.ac:6: -1- m4_pattern_allow([^docdir$]) +m4trace:configure.ac:6: -1- m4_pattern_allow([^infodir$]) +m4trace:configure.ac:6: -1- m4_pattern_allow([^htmldir$]) +m4trace:configure.ac:6: -1- m4_pattern_allow([^dvidir$]) +m4trace:configure.ac:6: -1- m4_pattern_allow([^pdfdir$]) +m4trace:configure.ac:6: -1- m4_pattern_allow([^psdir$]) +m4trace:configure.ac:6: -1- m4_pattern_allow([^libdir$]) +m4trace:configure.ac:6: -1- m4_pattern_allow([^localedir$]) +m4trace:configure.ac:6: -1- m4_pattern_allow([^mandir$]) +m4trace:configure.ac:6: -1- m4_pattern_allow([^PACKAGE_NAME$]) +m4trace:configure.ac:6: -1- m4_pattern_allow([^PACKAGE_TARNAME$]) +m4trace:configure.ac:6: -1- m4_pattern_allow([^PACKAGE_VERSION$]) +m4trace:configure.ac:6: -1- m4_pattern_allow([^PACKAGE_STRING$]) +m4trace:configure.ac:6: -1- m4_pattern_allow([^PACKAGE_BUGREPORT$]) +m4trace:configure.ac:6: -1- m4_pattern_allow([^PACKAGE_URL$]) +m4trace:configure.ac:6: -1- m4_pattern_allow([^DEFS$]) +m4trace:configure.ac:6: -1- m4_pattern_allow([^ECHO_C$]) +m4trace:configure.ac:6: -1- m4_pattern_allow([^ECHO_N$]) +m4trace:configure.ac:6: -1- m4_pattern_allow([^ECHO_T$]) +m4trace:configure.ac:6: -1- m4_pattern_allow([^LIBS$]) +m4trace:configure.ac:6: -1- m4_pattern_allow([^build_alias$]) +m4trace:configure.ac:6: -1- m4_pattern_allow([^host_alias$]) +m4trace:configure.ac:6: -1- m4_pattern_allow([^target_alias$]) +m4trace:configure.ac:14: -1- DX_HTML_FEATURE([ON]) +m4trace:configure.ac:14: -1- AC_DEFUN([DX_FEATURE_html], [ON]) +m4trace:configure.ac:15: -1- DX_CHM_FEATURE([OFF]) +m4trace:configure.ac:15: -1- AC_DEFUN([DX_FEATURE_chm], [OFF]) +m4trace:configure.ac:16: -1- DX_CHI_FEATURE([OFF]) +m4trace:configure.ac:16: -1- AC_DEFUN([DX_FEATURE_chi], [OFF]) +m4trace:configure.ac:17: -1- DX_MAN_FEATURE([OFF]) +m4trace:configure.ac:17: -1- AC_DEFUN([DX_FEATURE_man], [OFF]) +m4trace:configure.ac:18: -1- DX_RTF_FEATURE([OFF]) +m4trace:configure.ac:18: -1- AC_DEFUN([DX_FEATURE_rtf], [OFF]) +m4trace:configure.ac:19: -1- DX_XML_FEATURE([OFF]) +m4trace:configure.ac:19: -1- AC_DEFUN([DX_FEATURE_xml], [OFF]) +m4trace:configure.ac:20: -1- DX_PDF_FEATURE([OFF]) +m4trace:configure.ac:20: -1- AC_DEFUN([DX_FEATURE_pdf], [OFF]) +m4trace:configure.ac:21: -1- DX_PS_FEATURE([OFF]) +m4trace:configure.ac:21: -1- AC_DEFUN([DX_FEATURE_ps], [OFF]) +m4trace:configure.ac:22: -1- DX_INIT_DOXYGEN([zookeeper], [c-doc.Doxyfile], [docs]) +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_PROJECT$]) +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_CONFIG$]) +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_DOCDIR$]) +m4trace:configure.ac:22: -1- DX_ENV_APPEND([SRCDIR], [$srcdir]) +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_ENV$]) +m4trace:configure.ac:22: -1- DX_ENV_APPEND([PROJECT], [$DX_PROJECT]) +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_ENV$]) +m4trace:configure.ac:22: -1- DX_ENV_APPEND([DOCDIR], [$DX_DOCDIR]) +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_ENV$]) +m4trace:configure.ac:22: -1- DX_ENV_APPEND([VERSION], [$PACKAGE_VERSION]) +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_ENV$]) +m4trace:configure.ac:22: -1- DX_ARG_ABLE([doc], [generate any doxygen documentation], [], [], [DX_REQUIRE_PROG([DX_DOXYGEN], doxygen) + DX_REQUIRE_PROG([DX_PERL], perl)], [DX_ENV_APPEND(PERL_PATH, $DX_PERL)]) +m4trace:configure.ac:22: -1- AC_DEFUN([DX_CURRENT_FEATURE], [doc]) +m4trace:configure.ac:22: -1- AC_DEFUN([DX_CURRENT_DESCRIPTION], [generate any doxygen documentation]) +m4trace:configure.ac:22: -2- DX_IF_FEATURE([doc], [--disable-doxygen-doc], [--enable-doxygen-doc]) +m4trace:configure.ac:22: -3- DX_FEATURE_doc +m4trace:configure.ac:22: -2- DX_IF_FEATURE([doc], [don't generate any doxygen documentation], [generate any doxygen documentation]) +m4trace:configure.ac:22: -3- DX_FEATURE_doc +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_FLAG_doc$]) +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_FLAG_doc$]) +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_FLAG_doc$]) +m4trace:configure.ac:22: -1- DX_IF_FEATURE([doc], [1], [0]) +m4trace:configure.ac:22: -2- DX_FEATURE_doc +m4trace:configure.ac:22: -1- DX_TEST_FEATURE([doc]) +m4trace:configure.ac:22: -1- DX_REQUIRE_PROG([DX_DOXYGEN], [doxygen]) +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_DOXYGEN$]) +m4trace:configure.ac:22: -1- DX_CURRENT_DESCRIPTION +m4trace:configure.ac:22: -1- DX_CURRENT_DESCRIPTION +m4trace:configure.ac:22: -2- DX_CURRENT_FEATURE +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_FLAG_doc$]) +m4trace:configure.ac:22: -1- DX_REQUIRE_PROG([DX_PERL], [perl]) +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_PERL$]) +m4trace:configure.ac:22: -1- DX_CURRENT_DESCRIPTION +m4trace:configure.ac:22: -1- DX_CURRENT_DESCRIPTION +m4trace:configure.ac:22: -2- DX_CURRENT_FEATURE +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_FLAG_doc$]) +m4trace:configure.ac:22: -1- DX_TEST_FEATURE([doc]) +m4trace:configure.ac:22: -1- AM_CONDITIONAL([DX_COND_doc], [:]) +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_COND_doc_TRUE$]) +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_COND_doc_FALSE$]) +m4trace:configure.ac:22: -1- _AM_SUBST_NOTMAKE([DX_COND_doc_TRUE]) +m4trace:configure.ac:22: -1- _AM_SUBST_NOTMAKE([DX_COND_doc_FALSE]) +m4trace:configure.ac:22: -1- DX_ENV_APPEND([PERL_PATH], [$DX_PERL]) +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_ENV$]) +m4trace:configure.ac:22: -1- AM_CONDITIONAL([DX_COND_doc], [false]) +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_COND_doc_TRUE$]) +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_COND_doc_FALSE$]) +m4trace:configure.ac:22: -1- _AM_SUBST_NOTMAKE([DX_COND_doc_TRUE]) +m4trace:configure.ac:22: -1- _AM_SUBST_NOTMAKE([DX_COND_doc_FALSE]) +m4trace:configure.ac:22: -1- DX_ARG_ABLE([dot], [generate graphics for doxygen documentation], [DX_CHECK_DEPEND(doc, 1)], [DX_CLEAR_DEPEND(doc, 1)], [DX_REQUIRE_PROG([DX_DOT], dot)], [DX_ENV_APPEND(HAVE_DOT, YES) + DX_ENV_APPEND(DOT_PATH, [`DX_DIRNAME_EXPR($DX_DOT)`])], [DX_ENV_APPEND(HAVE_DOT, NO)]) +m4trace:configure.ac:22: -1- AC_DEFUN([DX_CURRENT_FEATURE], [dot]) +m4trace:configure.ac:22: -1- AC_DEFUN([DX_CURRENT_DESCRIPTION], [generate graphics for doxygen documentation]) +m4trace:configure.ac:22: -2- DX_IF_FEATURE([dot], [--disable-doxygen-dot], [--enable-doxygen-dot]) +m4trace:configure.ac:22: -3- DX_FEATURE_dot +m4trace:configure.ac:22: -2- DX_IF_FEATURE([dot], [don't generate graphics for doxygen documentation], [generate graphics for doxygen documentation]) +m4trace:configure.ac:22: -3- DX_FEATURE_dot +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_FLAG_dot$]) +m4trace:configure.ac:22: -1- DX_CHECK_DEPEND([doc], [1]) +m4trace:configure.ac:22: -1- DX_CURRENT_FEATURE +m4trace:configure.ac:22: -1- DX_CURRENT_FEATURE +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_FLAG_dot$]) +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_FLAG_dot$]) +m4trace:configure.ac:22: -1- DX_IF_FEATURE([dot], [1], [0]) +m4trace:configure.ac:22: -2- DX_FEATURE_dot +m4trace:configure.ac:22: -1- DX_CLEAR_DEPEND([doc], [1]) +m4trace:configure.ac:22: -2- DX_CURRENT_FEATURE +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_FLAG_dot$]) +m4trace:configure.ac:22: -1- DX_TEST_FEATURE([dot]) +m4trace:configure.ac:22: -1- DX_REQUIRE_PROG([DX_DOT], [dot]) +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_DOT$]) +m4trace:configure.ac:22: -1- DX_CURRENT_DESCRIPTION +m4trace:configure.ac:22: -1- DX_CURRENT_DESCRIPTION +m4trace:configure.ac:22: -2- DX_CURRENT_FEATURE +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_FLAG_dot$]) +m4trace:configure.ac:22: -1- DX_TEST_FEATURE([dot]) +m4trace:configure.ac:22: -1- AM_CONDITIONAL([DX_COND_dot], [:]) +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_COND_dot_TRUE$]) +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_COND_dot_FALSE$]) +m4trace:configure.ac:22: -1- _AM_SUBST_NOTMAKE([DX_COND_dot_TRUE]) +m4trace:configure.ac:22: -1- _AM_SUBST_NOTMAKE([DX_COND_dot_FALSE]) +m4trace:configure.ac:22: -1- DX_ENV_APPEND([HAVE_DOT], [YES]) +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_ENV$]) +m4trace:configure.ac:22: -1- DX_ENV_APPEND([DOT_PATH], [`DX_DIRNAME_EXPR($DX_DOT)`]) +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_ENV$]) +m4trace:configure.ac:22: -1- DX_DIRNAME_EXPR([$DX_DOT]) +m4trace:configure.ac:22: -1- AM_CONDITIONAL([DX_COND_dot], [false]) +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_COND_dot_TRUE$]) +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_COND_dot_FALSE$]) +m4trace:configure.ac:22: -1- _AM_SUBST_NOTMAKE([DX_COND_dot_TRUE]) +m4trace:configure.ac:22: -1- _AM_SUBST_NOTMAKE([DX_COND_dot_FALSE]) +m4trace:configure.ac:22: -1- DX_ENV_APPEND([HAVE_DOT], [NO]) +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_ENV$]) +m4trace:configure.ac:22: -1- DX_ARG_ABLE([man], [generate doxygen manual pages], [DX_CHECK_DEPEND(doc, 1)], [DX_CLEAR_DEPEND(doc, 1)], [], [DX_ENV_APPEND(GENERATE_MAN, YES)], [DX_ENV_APPEND(GENERATE_MAN, NO)]) +m4trace:configure.ac:22: -1- AC_DEFUN([DX_CURRENT_FEATURE], [man]) +m4trace:configure.ac:22: -1- AC_DEFUN([DX_CURRENT_DESCRIPTION], [generate doxygen manual pages]) +m4trace:configure.ac:22: -2- DX_IF_FEATURE([man], [--disable-doxygen-man], [--enable-doxygen-man]) +m4trace:configure.ac:22: -3- DX_FEATURE_man +m4trace:configure.ac:22: -2- DX_IF_FEATURE([man], [don't generate doxygen manual pages], [generate doxygen manual pages]) +m4trace:configure.ac:22: -3- DX_FEATURE_man +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_FLAG_man$]) +m4trace:configure.ac:22: -1- DX_CHECK_DEPEND([doc], [1]) +m4trace:configure.ac:22: -1- DX_CURRENT_FEATURE +m4trace:configure.ac:22: -1- DX_CURRENT_FEATURE +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_FLAG_man$]) +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_FLAG_man$]) +m4trace:configure.ac:22: -1- DX_IF_FEATURE([man], [1], [0]) +m4trace:configure.ac:22: -2- DX_FEATURE_man +m4trace:configure.ac:22: -1- DX_CLEAR_DEPEND([doc], [1]) +m4trace:configure.ac:22: -2- DX_CURRENT_FEATURE +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_FLAG_man$]) +m4trace:configure.ac:22: -1- DX_TEST_FEATURE([man]) +m4trace:configure.ac:22: -1- DX_TEST_FEATURE([man]) +m4trace:configure.ac:22: -1- AM_CONDITIONAL([DX_COND_man], [:]) +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_COND_man_TRUE$]) +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_COND_man_FALSE$]) +m4trace:configure.ac:22: -1- _AM_SUBST_NOTMAKE([DX_COND_man_TRUE]) +m4trace:configure.ac:22: -1- _AM_SUBST_NOTMAKE([DX_COND_man_FALSE]) +m4trace:configure.ac:22: -1- DX_ENV_APPEND([GENERATE_MAN], [YES]) +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_ENV$]) +m4trace:configure.ac:22: -1- AM_CONDITIONAL([DX_COND_man], [false]) +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_COND_man_TRUE$]) +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_COND_man_FALSE$]) +m4trace:configure.ac:22: -1- _AM_SUBST_NOTMAKE([DX_COND_man_TRUE]) +m4trace:configure.ac:22: -1- _AM_SUBST_NOTMAKE([DX_COND_man_FALSE]) +m4trace:configure.ac:22: -1- DX_ENV_APPEND([GENERATE_MAN], [NO]) +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_ENV$]) +m4trace:configure.ac:22: -1- DX_ARG_ABLE([rtf], [generate doxygen RTF documentation], [DX_CHECK_DEPEND(doc, 1)], [DX_CLEAR_DEPEND(doc, 1)], [], [DX_ENV_APPEND(GENERATE_RTF, YES)], [DX_ENV_APPEND(GENERATE_RTF, NO)]) +m4trace:configure.ac:22: -1- AC_DEFUN([DX_CURRENT_FEATURE], [rtf]) +m4trace:configure.ac:22: -1- AC_DEFUN([DX_CURRENT_DESCRIPTION], [generate doxygen RTF documentation]) +m4trace:configure.ac:22: -2- DX_IF_FEATURE([rtf], [--disable-doxygen-rtf], [--enable-doxygen-rtf]) +m4trace:configure.ac:22: -3- DX_FEATURE_rtf +m4trace:configure.ac:22: -2- DX_IF_FEATURE([rtf], [don't generate doxygen RTF documentation], [generate doxygen RTF documentation]) +m4trace:configure.ac:22: -3- DX_FEATURE_rtf +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_FLAG_rtf$]) +m4trace:configure.ac:22: -1- DX_CHECK_DEPEND([doc], [1]) +m4trace:configure.ac:22: -1- DX_CURRENT_FEATURE +m4trace:configure.ac:22: -1- DX_CURRENT_FEATURE +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_FLAG_rtf$]) +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_FLAG_rtf$]) +m4trace:configure.ac:22: -1- DX_IF_FEATURE([rtf], [1], [0]) +m4trace:configure.ac:22: -2- DX_FEATURE_rtf +m4trace:configure.ac:22: -1- DX_CLEAR_DEPEND([doc], [1]) +m4trace:configure.ac:22: -2- DX_CURRENT_FEATURE +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_FLAG_rtf$]) +m4trace:configure.ac:22: -1- DX_TEST_FEATURE([rtf]) +m4trace:configure.ac:22: -1- DX_TEST_FEATURE([rtf]) +m4trace:configure.ac:22: -1- AM_CONDITIONAL([DX_COND_rtf], [:]) +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_COND_rtf_TRUE$]) +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_COND_rtf_FALSE$]) +m4trace:configure.ac:22: -1- _AM_SUBST_NOTMAKE([DX_COND_rtf_TRUE]) +m4trace:configure.ac:22: -1- _AM_SUBST_NOTMAKE([DX_COND_rtf_FALSE]) +m4trace:configure.ac:22: -1- DX_ENV_APPEND([GENERATE_RTF], [YES]) +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_ENV$]) +m4trace:configure.ac:22: -1- AM_CONDITIONAL([DX_COND_rtf], [false]) +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_COND_rtf_TRUE$]) +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_COND_rtf_FALSE$]) +m4trace:configure.ac:22: -1- _AM_SUBST_NOTMAKE([DX_COND_rtf_TRUE]) +m4trace:configure.ac:22: -1- _AM_SUBST_NOTMAKE([DX_COND_rtf_FALSE]) +m4trace:configure.ac:22: -1- DX_ENV_APPEND([GENERATE_RTF], [NO]) +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_ENV$]) +m4trace:configure.ac:22: -1- DX_ARG_ABLE([xml], [generate doxygen XML documentation], [DX_CHECK_DEPEND(doc, 1)], [DX_CLEAR_DEPEND(doc, 1)], [], [DX_ENV_APPEND(GENERATE_XML, YES)], [DX_ENV_APPEND(GENERATE_XML, NO)]) +m4trace:configure.ac:22: -1- AC_DEFUN([DX_CURRENT_FEATURE], [xml]) +m4trace:configure.ac:22: -1- AC_DEFUN([DX_CURRENT_DESCRIPTION], [generate doxygen XML documentation]) +m4trace:configure.ac:22: -2- DX_IF_FEATURE([xml], [--disable-doxygen-xml], [--enable-doxygen-xml]) +m4trace:configure.ac:22: -3- DX_FEATURE_xml +m4trace:configure.ac:22: -2- DX_IF_FEATURE([xml], [don't generate doxygen XML documentation], [generate doxygen XML documentation]) +m4trace:configure.ac:22: -3- DX_FEATURE_xml +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_FLAG_xml$]) +m4trace:configure.ac:22: -1- DX_CHECK_DEPEND([doc], [1]) +m4trace:configure.ac:22: -1- DX_CURRENT_FEATURE +m4trace:configure.ac:22: -1- DX_CURRENT_FEATURE +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_FLAG_xml$]) +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_FLAG_xml$]) +m4trace:configure.ac:22: -1- DX_IF_FEATURE([xml], [1], [0]) +m4trace:configure.ac:22: -2- DX_FEATURE_xml +m4trace:configure.ac:22: -1- DX_CLEAR_DEPEND([doc], [1]) +m4trace:configure.ac:22: -2- DX_CURRENT_FEATURE +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_FLAG_xml$]) +m4trace:configure.ac:22: -1- DX_TEST_FEATURE([xml]) +m4trace:configure.ac:22: -1- DX_TEST_FEATURE([xml]) +m4trace:configure.ac:22: -1- AM_CONDITIONAL([DX_COND_xml], [:]) +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_COND_xml_TRUE$]) +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_COND_xml_FALSE$]) +m4trace:configure.ac:22: -1- _AM_SUBST_NOTMAKE([DX_COND_xml_TRUE]) +m4trace:configure.ac:22: -1- _AM_SUBST_NOTMAKE([DX_COND_xml_FALSE]) +m4trace:configure.ac:22: -1- DX_ENV_APPEND([GENERATE_XML], [YES]) +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_ENV$]) +m4trace:configure.ac:22: -1- AM_CONDITIONAL([DX_COND_xml], [false]) +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_COND_xml_TRUE$]) +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_COND_xml_FALSE$]) +m4trace:configure.ac:22: -1- _AM_SUBST_NOTMAKE([DX_COND_xml_TRUE]) +m4trace:configure.ac:22: -1- _AM_SUBST_NOTMAKE([DX_COND_xml_FALSE]) +m4trace:configure.ac:22: -1- DX_ENV_APPEND([GENERATE_XML], [NO]) +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_ENV$]) +m4trace:configure.ac:22: -1- DX_ARG_ABLE([chm], [generate doxygen compressed HTML help documentation], [DX_CHECK_DEPEND(doc, 1)], [DX_CLEAR_DEPEND(doc, 1)], [DX_REQUIRE_PROG([DX_HHC], hhc)], [DX_ENV_APPEND(HHC_PATH, $DX_HHC) + DX_ENV_APPEND(GENERATE_HTML, YES) + DX_ENV_APPEND(GENERATE_HTMLHELP, YES)], [DX_ENV_APPEND(GENERATE_HTMLHELP, NO)]) +m4trace:configure.ac:22: -1- AC_DEFUN([DX_CURRENT_FEATURE], [chm]) +m4trace:configure.ac:22: -1- AC_DEFUN([DX_CURRENT_DESCRIPTION], [generate doxygen compressed HTML help documentation]) +m4trace:configure.ac:22: -2- DX_IF_FEATURE([chm], [--disable-doxygen-chm], [--enable-doxygen-chm]) +m4trace:configure.ac:22: -3- DX_FEATURE_chm +m4trace:configure.ac:22: -2- DX_IF_FEATURE([chm], [don't generate doxygen compressed HTML help documentation], [generate doxygen compressed HTML help documentation]) +m4trace:configure.ac:22: -3- DX_FEATURE_chm +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_FLAG_chm$]) +m4trace:configure.ac:22: -1- DX_CHECK_DEPEND([doc], [1]) +m4trace:configure.ac:22: -1- DX_CURRENT_FEATURE +m4trace:configure.ac:22: -1- DX_CURRENT_FEATURE +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_FLAG_chm$]) +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_FLAG_chm$]) +m4trace:configure.ac:22: -1- DX_IF_FEATURE([chm], [1], [0]) +m4trace:configure.ac:22: -2- DX_FEATURE_chm +m4trace:configure.ac:22: -1- DX_CLEAR_DEPEND([doc], [1]) +m4trace:configure.ac:22: -2- DX_CURRENT_FEATURE +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_FLAG_chm$]) +m4trace:configure.ac:22: -1- DX_TEST_FEATURE([chm]) +m4trace:configure.ac:22: -1- DX_REQUIRE_PROG([DX_HHC], [hhc]) +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_HHC$]) +m4trace:configure.ac:22: -1- DX_CURRENT_DESCRIPTION +m4trace:configure.ac:22: -1- DX_CURRENT_DESCRIPTION +m4trace:configure.ac:22: -2- DX_CURRENT_FEATURE +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_FLAG_chm$]) +m4trace:configure.ac:22: -1- DX_TEST_FEATURE([chm]) +m4trace:configure.ac:22: -1- AM_CONDITIONAL([DX_COND_chm], [:]) +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_COND_chm_TRUE$]) +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_COND_chm_FALSE$]) +m4trace:configure.ac:22: -1- _AM_SUBST_NOTMAKE([DX_COND_chm_TRUE]) +m4trace:configure.ac:22: -1- _AM_SUBST_NOTMAKE([DX_COND_chm_FALSE]) +m4trace:configure.ac:22: -1- DX_ENV_APPEND([HHC_PATH], [$DX_HHC]) +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_ENV$]) +m4trace:configure.ac:22: -1- DX_ENV_APPEND([GENERATE_HTML], [YES]) +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_ENV$]) +m4trace:configure.ac:22: -1- DX_ENV_APPEND([GENERATE_HTMLHELP], [YES]) +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_ENV$]) +m4trace:configure.ac:22: -1- AM_CONDITIONAL([DX_COND_chm], [false]) +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_COND_chm_TRUE$]) +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_COND_chm_FALSE$]) +m4trace:configure.ac:22: -1- _AM_SUBST_NOTMAKE([DX_COND_chm_TRUE]) +m4trace:configure.ac:22: -1- _AM_SUBST_NOTMAKE([DX_COND_chm_FALSE]) +m4trace:configure.ac:22: -1- DX_ENV_APPEND([GENERATE_HTMLHELP], [NO]) +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_ENV$]) +m4trace:configure.ac:22: -1- DX_ARG_ABLE([chi], [generate doxygen seperate compressed HTML help index file], [DX_CHECK_DEPEND(chm, 1)], [DX_CLEAR_DEPEND(chm, 1)], [], [DX_ENV_APPEND(GENERATE_CHI, YES)], [DX_ENV_APPEND(GENERATE_CHI, NO)]) +m4trace:configure.ac:22: -1- AC_DEFUN([DX_CURRENT_FEATURE], [chi]) +m4trace:configure.ac:22: -1- AC_DEFUN([DX_CURRENT_DESCRIPTION], [generate doxygen seperate compressed HTML help index file]) +m4trace:configure.ac:22: -2- DX_IF_FEATURE([chi], [--disable-doxygen-chi], [--enable-doxygen-chi]) +m4trace:configure.ac:22: -3- DX_FEATURE_chi +m4trace:configure.ac:22: -2- DX_IF_FEATURE([chi], [don't generate doxygen seperate compressed HTML help index file], [generate doxygen seperate compressed HTML help index file]) +m4trace:configure.ac:22: -3- DX_FEATURE_chi +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_FLAG_chi$]) +m4trace:configure.ac:22: -1- DX_CHECK_DEPEND([chm], [1]) +m4trace:configure.ac:22: -1- DX_CURRENT_FEATURE +m4trace:configure.ac:22: -1- DX_CURRENT_FEATURE +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_FLAG_chi$]) +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_FLAG_chi$]) +m4trace:configure.ac:22: -1- DX_IF_FEATURE([chi], [1], [0]) +m4trace:configure.ac:22: -2- DX_FEATURE_chi +m4trace:configure.ac:22: -1- DX_CLEAR_DEPEND([chm], [1]) +m4trace:configure.ac:22: -2- DX_CURRENT_FEATURE +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_FLAG_chi$]) +m4trace:configure.ac:22: -1- DX_TEST_FEATURE([chi]) +m4trace:configure.ac:22: -1- DX_TEST_FEATURE([chi]) +m4trace:configure.ac:22: -1- AM_CONDITIONAL([DX_COND_chi], [:]) +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_COND_chi_TRUE$]) +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_COND_chi_FALSE$]) +m4trace:configure.ac:22: -1- _AM_SUBST_NOTMAKE([DX_COND_chi_TRUE]) +m4trace:configure.ac:22: -1- _AM_SUBST_NOTMAKE([DX_COND_chi_FALSE]) +m4trace:configure.ac:22: -1- DX_ENV_APPEND([GENERATE_CHI], [YES]) +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_ENV$]) +m4trace:configure.ac:22: -1- AM_CONDITIONAL([DX_COND_chi], [false]) +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_COND_chi_TRUE$]) +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_COND_chi_FALSE$]) +m4trace:configure.ac:22: -1- _AM_SUBST_NOTMAKE([DX_COND_chi_TRUE]) +m4trace:configure.ac:22: -1- _AM_SUBST_NOTMAKE([DX_COND_chi_FALSE]) +m4trace:configure.ac:22: -1- DX_ENV_APPEND([GENERATE_CHI], [NO]) +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_ENV$]) +m4trace:configure.ac:22: -1- DX_ARG_ABLE([html], [generate doxygen plain HTML documentation], [DX_CHECK_DEPEND(doc, 1) DX_CHECK_DEPEND(chm, 0)], [DX_CLEAR_DEPEND(doc, 1) DX_CLEAR_DEPEND(chm, 0)], [], [DX_ENV_APPEND(GENERATE_HTML, YES)], [DX_TEST_FEATURE(chm) || DX_ENV_APPEND(GENERATE_HTML, NO)]) +m4trace:configure.ac:22: -1- AC_DEFUN([DX_CURRENT_FEATURE], [html]) +m4trace:configure.ac:22: -1- AC_DEFUN([DX_CURRENT_DESCRIPTION], [generate doxygen plain HTML documentation]) +m4trace:configure.ac:22: -2- DX_IF_FEATURE([html], [--disable-doxygen-html], [--enable-doxygen-html]) +m4trace:configure.ac:22: -3- DX_FEATURE_html +m4trace:configure.ac:22: -2- DX_IF_FEATURE([html], [don't generate doxygen plain HTML documentation], [generate doxygen plain HTML documentation]) +m4trace:configure.ac:22: -3- DX_FEATURE_html +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_FLAG_html$]) +m4trace:configure.ac:22: -1- DX_CHECK_DEPEND([doc], [1]) +m4trace:configure.ac:22: -1- DX_CURRENT_FEATURE +m4trace:configure.ac:22: -1- DX_CURRENT_FEATURE +m4trace:configure.ac:22: -1- DX_CHECK_DEPEND([chm], [0]) +m4trace:configure.ac:22: -1- DX_CURRENT_FEATURE +m4trace:configure.ac:22: -1- DX_CURRENT_FEATURE +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_FLAG_html$]) +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_FLAG_html$]) +m4trace:configure.ac:22: -1- DX_IF_FEATURE([html], [1], [0]) +m4trace:configure.ac:22: -2- DX_FEATURE_html +m4trace:configure.ac:22: -1- DX_CLEAR_DEPEND([doc], [1]) +m4trace:configure.ac:22: -2- DX_CURRENT_FEATURE +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_FLAG_html$]) +m4trace:configure.ac:22: -1- DX_CLEAR_DEPEND([chm], [0]) +m4trace:configure.ac:22: -2- DX_CURRENT_FEATURE +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_FLAG_html$]) +m4trace:configure.ac:22: -1- DX_TEST_FEATURE([html]) +m4trace:configure.ac:22: -1- DX_TEST_FEATURE([html]) +m4trace:configure.ac:22: -1- AM_CONDITIONAL([DX_COND_html], [:]) +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_COND_html_TRUE$]) +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_COND_html_FALSE$]) +m4trace:configure.ac:22: -1- _AM_SUBST_NOTMAKE([DX_COND_html_TRUE]) +m4trace:configure.ac:22: -1- _AM_SUBST_NOTMAKE([DX_COND_html_FALSE]) +m4trace:configure.ac:22: -1- DX_ENV_APPEND([GENERATE_HTML], [YES]) +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_ENV$]) +m4trace:configure.ac:22: -1- AM_CONDITIONAL([DX_COND_html], [false]) +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_COND_html_TRUE$]) +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_COND_html_FALSE$]) +m4trace:configure.ac:22: -1- _AM_SUBST_NOTMAKE([DX_COND_html_TRUE]) +m4trace:configure.ac:22: -1- _AM_SUBST_NOTMAKE([DX_COND_html_FALSE]) +m4trace:configure.ac:22: -1- DX_TEST_FEATURE([chm]) +m4trace:configure.ac:22: -1- DX_ENV_APPEND([GENERATE_HTML], [NO]) +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_ENV$]) +m4trace:configure.ac:22: -1- DX_ARG_ABLE([ps], [generate doxygen PostScript documentation], [DX_CHECK_DEPEND(doc, 1)], [DX_CLEAR_DEPEND(doc, 1)], [DX_REQUIRE_PROG([DX_LATEX], latex) + DX_REQUIRE_PROG([DX_MAKEINDEX], makeindex) + DX_REQUIRE_PROG([DX_DVIPS], dvips) + DX_REQUIRE_PROG([DX_EGREP], egrep)]) +m4trace:configure.ac:22: -1- AC_DEFUN([DX_CURRENT_FEATURE], [ps]) +m4trace:configure.ac:22: -1- AC_DEFUN([DX_CURRENT_DESCRIPTION], [generate doxygen PostScript documentation]) +m4trace:configure.ac:22: -2- DX_IF_FEATURE([ps], [--disable-doxygen-ps], [--enable-doxygen-ps]) +m4trace:configure.ac:22: -3- DX_FEATURE_ps +m4trace:configure.ac:22: -2- DX_IF_FEATURE([ps], [don't generate doxygen PostScript documentation], [generate doxygen PostScript documentation]) +m4trace:configure.ac:22: -3- DX_FEATURE_ps +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_FLAG_ps$]) +m4trace:configure.ac:22: -1- DX_CHECK_DEPEND([doc], [1]) +m4trace:configure.ac:22: -1- DX_CURRENT_FEATURE +m4trace:configure.ac:22: -1- DX_CURRENT_FEATURE +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_FLAG_ps$]) +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_FLAG_ps$]) +m4trace:configure.ac:22: -1- DX_IF_FEATURE([ps], [1], [0]) +m4trace:configure.ac:22: -2- DX_FEATURE_ps +m4trace:configure.ac:22: -1- DX_CLEAR_DEPEND([doc], [1]) +m4trace:configure.ac:22: -2- DX_CURRENT_FEATURE +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_FLAG_ps$]) +m4trace:configure.ac:22: -1- DX_TEST_FEATURE([ps]) +m4trace:configure.ac:22: -1- DX_REQUIRE_PROG([DX_LATEX], [latex]) +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_LATEX$]) +m4trace:configure.ac:22: -1- DX_CURRENT_DESCRIPTION +m4trace:configure.ac:22: -1- DX_CURRENT_DESCRIPTION +m4trace:configure.ac:22: -2- DX_CURRENT_FEATURE +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_FLAG_ps$]) +m4trace:configure.ac:22: -1- DX_REQUIRE_PROG([DX_MAKEINDEX], [makeindex]) +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_MAKEINDEX$]) +m4trace:configure.ac:22: -1- DX_CURRENT_DESCRIPTION +m4trace:configure.ac:22: -1- DX_CURRENT_DESCRIPTION +m4trace:configure.ac:22: -2- DX_CURRENT_FEATURE +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_FLAG_ps$]) +m4trace:configure.ac:22: -1- DX_REQUIRE_PROG([DX_DVIPS], [dvips]) +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_DVIPS$]) +m4trace:configure.ac:22: -1- DX_CURRENT_DESCRIPTION +m4trace:configure.ac:22: -1- DX_CURRENT_DESCRIPTION +m4trace:configure.ac:22: -2- DX_CURRENT_FEATURE +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_FLAG_ps$]) +m4trace:configure.ac:22: -1- DX_REQUIRE_PROG([DX_EGREP], [egrep]) +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_EGREP$]) +m4trace:configure.ac:22: -1- DX_CURRENT_DESCRIPTION +m4trace:configure.ac:22: -1- DX_CURRENT_DESCRIPTION +m4trace:configure.ac:22: -2- DX_CURRENT_FEATURE +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_FLAG_ps$]) +m4trace:configure.ac:22: -1- DX_TEST_FEATURE([ps]) +m4trace:configure.ac:22: -1- AM_CONDITIONAL([DX_COND_ps], [:]) +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_COND_ps_TRUE$]) +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_COND_ps_FALSE$]) +m4trace:configure.ac:22: -1- _AM_SUBST_NOTMAKE([DX_COND_ps_TRUE]) +m4trace:configure.ac:22: -1- _AM_SUBST_NOTMAKE([DX_COND_ps_FALSE]) +m4trace:configure.ac:22: -1- AM_CONDITIONAL([DX_COND_ps], [false]) +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_COND_ps_TRUE$]) +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_COND_ps_FALSE$]) +m4trace:configure.ac:22: -1- _AM_SUBST_NOTMAKE([DX_COND_ps_TRUE]) +m4trace:configure.ac:22: -1- _AM_SUBST_NOTMAKE([DX_COND_ps_FALSE]) +m4trace:configure.ac:22: -1- DX_ARG_ABLE([pdf], [generate doxygen PDF documentation], [DX_CHECK_DEPEND(doc, 1)], [DX_CLEAR_DEPEND(doc, 1)], [DX_REQUIRE_PROG([DX_PDFLATEX], pdflatex) + DX_REQUIRE_PROG([DX_MAKEINDEX], makeindex) + DX_REQUIRE_PROG([DX_EGREP], egrep)]) +m4trace:configure.ac:22: -1- AC_DEFUN([DX_CURRENT_FEATURE], [pdf]) +m4trace:configure.ac:22: -1- AC_DEFUN([DX_CURRENT_DESCRIPTION], [generate doxygen PDF documentation]) +m4trace:configure.ac:22: -2- DX_IF_FEATURE([pdf], [--disable-doxygen-pdf], [--enable-doxygen-pdf]) +m4trace:configure.ac:22: -3- DX_FEATURE_pdf +m4trace:configure.ac:22: -2- DX_IF_FEATURE([pdf], [don't generate doxygen PDF documentation], [generate doxygen PDF documentation]) +m4trace:configure.ac:22: -3- DX_FEATURE_pdf +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_FLAG_pdf$]) +m4trace:configure.ac:22: -1- DX_CHECK_DEPEND([doc], [1]) +m4trace:configure.ac:22: -1- DX_CURRENT_FEATURE +m4trace:configure.ac:22: -1- DX_CURRENT_FEATURE +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_FLAG_pdf$]) +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_FLAG_pdf$]) +m4trace:configure.ac:22: -1- DX_IF_FEATURE([pdf], [1], [0]) +m4trace:configure.ac:22: -2- DX_FEATURE_pdf +m4trace:configure.ac:22: -1- DX_CLEAR_DEPEND([doc], [1]) +m4trace:configure.ac:22: -2- DX_CURRENT_FEATURE +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_FLAG_pdf$]) +m4trace:configure.ac:22: -1- DX_TEST_FEATURE([pdf]) +m4trace:configure.ac:22: -1- DX_REQUIRE_PROG([DX_PDFLATEX], [pdflatex]) +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_PDFLATEX$]) +m4trace:configure.ac:22: -1- DX_CURRENT_DESCRIPTION +m4trace:configure.ac:22: -1- DX_CURRENT_DESCRIPTION +m4trace:configure.ac:22: -2- DX_CURRENT_FEATURE +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_FLAG_pdf$]) +m4trace:configure.ac:22: -1- DX_REQUIRE_PROG([DX_MAKEINDEX], [makeindex]) +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_MAKEINDEX$]) +m4trace:configure.ac:22: -1- DX_CURRENT_DESCRIPTION +m4trace:configure.ac:22: -1- DX_CURRENT_DESCRIPTION +m4trace:configure.ac:22: -2- DX_CURRENT_FEATURE +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_FLAG_pdf$]) +m4trace:configure.ac:22: -1- DX_REQUIRE_PROG([DX_EGREP], [egrep]) +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_EGREP$]) +m4trace:configure.ac:22: -1- DX_CURRENT_DESCRIPTION +m4trace:configure.ac:22: -1- DX_CURRENT_DESCRIPTION +m4trace:configure.ac:22: -2- DX_CURRENT_FEATURE +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_FLAG_pdf$]) +m4trace:configure.ac:22: -1- DX_TEST_FEATURE([pdf]) +m4trace:configure.ac:22: -1- AM_CONDITIONAL([DX_COND_pdf], [:]) +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_COND_pdf_TRUE$]) +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_COND_pdf_FALSE$]) +m4trace:configure.ac:22: -1- _AM_SUBST_NOTMAKE([DX_COND_pdf_TRUE]) +m4trace:configure.ac:22: -1- _AM_SUBST_NOTMAKE([DX_COND_pdf_FALSE]) +m4trace:configure.ac:22: -1- AM_CONDITIONAL([DX_COND_pdf], [false]) +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_COND_pdf_TRUE$]) +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_COND_pdf_FALSE$]) +m4trace:configure.ac:22: -1- _AM_SUBST_NOTMAKE([DX_COND_pdf_TRUE]) +m4trace:configure.ac:22: -1- _AM_SUBST_NOTMAKE([DX_COND_pdf_FALSE]) +m4trace:configure.ac:22: -1- DX_TEST_FEATURE([ps]) +m4trace:configure.ac:22: -1- DX_TEST_FEATURE([pdf]) +m4trace:configure.ac:22: -1- AM_CONDITIONAL([DX_COND_latex], [:]) +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_COND_latex_TRUE$]) +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_COND_latex_FALSE$]) +m4trace:configure.ac:22: -1- _AM_SUBST_NOTMAKE([DX_COND_latex_TRUE]) +m4trace:configure.ac:22: -1- _AM_SUBST_NOTMAKE([DX_COND_latex_FALSE]) +m4trace:configure.ac:22: -1- DX_ENV_APPEND([GENERATE_LATEX], [YES]) +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_ENV$]) +m4trace:configure.ac:22: -1- AM_CONDITIONAL([DX_COND_latex], [false]) +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_COND_latex_TRUE$]) +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_COND_latex_FALSE$]) +m4trace:configure.ac:22: -1- _AM_SUBST_NOTMAKE([DX_COND_latex_TRUE]) +m4trace:configure.ac:22: -1- _AM_SUBST_NOTMAKE([DX_COND_latex_FALSE]) +m4trace:configure.ac:22: -1- DX_ENV_APPEND([GENERATE_LATEX], [NO]) +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_ENV$]) +m4trace:configure.ac:22: -1- m4_pattern_allow([^DOXYGEN_PAPER_SIZE$]) +m4trace:configure.ac:22: -1- m4_pattern_allow([^DOXYGEN_PAPER_SIZE$]) +m4trace:configure.ac:22: -1- DX_ENV_APPEND([PAPER_SIZE], [$DOXYGEN_PAPER_SIZE]) +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_ENV$]) +m4trace:configure.ac:25: -1- AM_INIT_AUTOMAKE([-Wall foreign]) +m4trace:configure.ac:25: -1- m4_pattern_allow([^AM_[A-Z]+FLAGS$]) +m4trace:configure.ac:25: -1- AM_SET_CURRENT_AUTOMAKE_VERSION +m4trace:configure.ac:25: -1- AM_AUTOMAKE_VERSION([1.11.6]) +m4trace:configure.ac:25: -1- _AM_AUTOCONF_VERSION([2.69]) +m4trace:configure.ac:25: -1- m4_pattern_allow([^INSTALL_PROGRAM$]) +m4trace:configure.ac:25: -1- m4_pattern_allow([^INSTALL_SCRIPT$]) +m4trace:configure.ac:25: -1- m4_pattern_allow([^INSTALL_DATA$]) +m4trace:configure.ac:25: -1- m4_pattern_allow([^am__isrc$]) +m4trace:configure.ac:25: -1- _AM_SUBST_NOTMAKE([am__isrc]) +m4trace:configure.ac:25: -1- m4_pattern_allow([^CYGPATH_W$]) +m4trace:configure.ac:25: -1- _AM_SET_OPTIONS([-Wall foreign]) +m4trace:configure.ac:25: -1- _AM_SET_OPTION([-Wall]) +m4trace:configure.ac:25: -2- _AM_MANGLE_OPTION([-Wall]) +m4trace:configure.ac:25: -1- _AM_SET_OPTION([foreign]) +m4trace:configure.ac:25: -2- _AM_MANGLE_OPTION([foreign]) +m4trace:configure.ac:25: -1- m4_pattern_allow([^PACKAGE$]) +m4trace:configure.ac:25: -1- m4_pattern_allow([^VERSION$]) +m4trace:configure.ac:25: -1- _AM_IF_OPTION([no-define], [], [AC_DEFINE_UNQUOTED(PACKAGE, "$PACKAGE", [Name of package]) + AC_DEFINE_UNQUOTED(VERSION, "$VERSION", [Version number of package])]) +m4trace:configure.ac:25: -2- _AM_MANGLE_OPTION([no-define]) +m4trace:configure.ac:25: -1- m4_pattern_allow([^PACKAGE$]) +m4trace:configure.ac:25: -1- m4_pattern_allow([^VERSION$]) +m4trace:configure.ac:25: -1- AM_SANITY_CHECK +m4trace:configure.ac:25: -1- AM_MISSING_PROG([ACLOCAL], [aclocal-${am__api_version}]) +m4trace:configure.ac:25: -1- AM_MISSING_HAS_RUN +m4trace:configure.ac:25: -1- AM_AUX_DIR_EXPAND +m4trace:configure.ac:25: -1- m4_pattern_allow([^ACLOCAL$]) +m4trace:configure.ac:25: -1- AM_MISSING_PROG([AUTOCONF], [autoconf]) +m4trace:configure.ac:25: -1- m4_pattern_allow([^AUTOCONF$]) +m4trace:configure.ac:25: -1- AM_MISSING_PROG([AUTOMAKE], [automake-${am__api_version}]) +m4trace:configure.ac:25: -1- m4_pattern_allow([^AUTOMAKE$]) +m4trace:configure.ac:25: -1- AM_MISSING_PROG([AUTOHEADER], [autoheader]) +m4trace:configure.ac:25: -1- m4_pattern_allow([^AUTOHEADER$]) +m4trace:configure.ac:25: -1- AM_MISSING_PROG([MAKEINFO], [makeinfo]) +m4trace:configure.ac:25: -1- m4_pattern_allow([^MAKEINFO$]) +m4trace:configure.ac:25: -1- AM_PROG_INSTALL_SH +m4trace:configure.ac:25: -1- m4_pattern_allow([^install_sh$]) +m4trace:configure.ac:25: -1- AM_PROG_INSTALL_STRIP +m4trace:configure.ac:25: -1- m4_pattern_allow([^STRIP$]) +m4trace:configure.ac:25: -1- m4_pattern_allow([^INSTALL_STRIP_PROGRAM$]) +m4trace:configure.ac:25: -1- AM_PROG_MKDIR_P +m4trace:configure.ac:25: -1- m4_pattern_allow([^MKDIR_P$]) +m4trace:configure.ac:25: -1- m4_pattern_allow([^mkdir_p$]) +m4trace:configure.ac:25: -1- m4_pattern_allow([^AWK$]) +m4trace:configure.ac:25: -1- m4_pattern_allow([^SET_MAKE$]) +m4trace:configure.ac:25: -1- AM_SET_LEADING_DOT +m4trace:configure.ac:25: -1- m4_pattern_allow([^am__leading_dot$]) +m4trace:configure.ac:25: -1- _AM_IF_OPTION([tar-ustar], [_AM_PROG_TAR([ustar])], [_AM_IF_OPTION([tar-pax], [_AM_PROG_TAR([pax])], + [_AM_PROG_TAR([v7])])]) +m4trace:configure.ac:25: -2- _AM_MANGLE_OPTION([tar-ustar]) +m4trace:configure.ac:25: -1- _AM_IF_OPTION([tar-pax], [_AM_PROG_TAR([pax])], [_AM_PROG_TAR([v7])]) +m4trace:configure.ac:25: -2- _AM_MANGLE_OPTION([tar-pax]) +m4trace:configure.ac:25: -1- _AM_PROG_TAR([v7]) +m4trace:configure.ac:25: -1- m4_pattern_allow([^AMTAR$]) +m4trace:configure.ac:25: -1- m4_pattern_allow([^am__tar$]) +m4trace:configure.ac:25: -1- m4_pattern_allow([^am__untar$]) +m4trace:configure.ac:25: -1- _AM_IF_OPTION([no-dependencies], [], [AC_PROVIDE_IFELSE([AC_PROG_CC], + [_AM_DEPENDENCIES(CC)], + [define([AC_PROG_CC], + defn([AC_PROG_CC])[_AM_DEPENDENCIES(CC)])])dnl +AC_PROVIDE_IFELSE([AC_PROG_CXX], + [_AM_DEPENDENCIES(CXX)], + [define([AC_PROG_CXX], + defn([AC_PROG_CXX])[_AM_DEPENDENCIES(CXX)])])dnl +AC_PROVIDE_IFELSE([AC_PROG_OBJC], + [_AM_DEPENDENCIES(OBJC)], + [define([AC_PROG_OBJC], + defn([AC_PROG_OBJC])[_AM_DEPENDENCIES(OBJC)])])dnl +]) +m4trace:configure.ac:25: -2- _AM_MANGLE_OPTION([no-dependencies]) +m4trace:configure.ac:25: -1- _AM_IF_OPTION([silent-rules], [AC_REQUIRE([AM_SILENT_RULES])]) +m4trace:configure.ac:25: -2- _AM_MANGLE_OPTION([silent-rules]) +m4trace:configure.ac:44: -1- _m4_warn([cross], [cannot check for file existence when cross compiling], [../../lib/autoconf/general.m4:2777: AC_CHECK_FILE is expanded from... +../../lib/autoconf/general.m4:2808: AC_CHECK_FILES is expanded from... +configure.ac:44: the top level]) +m4trace:configure.ac:44: -1- m4_pattern_allow([^HAVE_GENERATED_ZOOKEEPER_JUTE_C$]) +m4trace:configure.ac:44: -1- _m4_warn([cross], [cannot check for file existence when cross compiling], [../../lib/autoconf/general.m4:2777: AC_CHECK_FILE is expanded from... +../../lib/autoconf/general.m4:2808: AC_CHECK_FILES is expanded from... +configure.ac:44: the top level]) +m4trace:configure.ac:44: -1- m4_pattern_allow([^HAVE_GENERATED_ZOOKEEPER_JUTE_H$]) +m4trace:configure.ac:48: -1- m4_pattern_allow([^CPPUNIT_CFLAGS$]) +m4trace:configure.ac:50: -1- m4_pattern_allow([^CC$]) +m4trace:configure.ac:50: -1- m4_pattern_allow([^CFLAGS$]) +m4trace:configure.ac:50: -1- m4_pattern_allow([^LDFLAGS$]) +m4trace:configure.ac:50: -1- m4_pattern_allow([^LIBS$]) +m4trace:configure.ac:50: -1- m4_pattern_allow([^CPPFLAGS$]) +m4trace:configure.ac:50: -1- m4_pattern_allow([^CC$]) +m4trace:configure.ac:50: -1- m4_pattern_allow([^CC$]) +m4trace:configure.ac:50: -1- m4_pattern_allow([^CC$]) +m4trace:configure.ac:50: -1- m4_pattern_allow([^CC$]) +m4trace:configure.ac:50: -1- m4_pattern_allow([^ac_ct_CC$]) +m4trace:configure.ac:50: -1- m4_pattern_allow([^EXEEXT$]) +m4trace:configure.ac:50: -1- m4_pattern_allow([^OBJEXT$]) +m4trace:configure.ac:50: -1- _AM_DEPENDENCIES([CC]) +m4trace:configure.ac:50: -1- AM_SET_DEPDIR +m4trace:configure.ac:50: -1- m4_pattern_allow([^DEPDIR$]) +m4trace:configure.ac:50: -1- AM_OUTPUT_DEPENDENCY_COMMANDS +m4trace:configure.ac:50: -1- AM_MAKE_INCLUDE +m4trace:configure.ac:50: -1- m4_pattern_allow([^am__include$]) +m4trace:configure.ac:50: -1- m4_pattern_allow([^am__quote$]) +m4trace:configure.ac:50: -1- AM_DEP_TRACK +m4trace:configure.ac:50: -1- AM_CONDITIONAL([AMDEP], [test "x$enable_dependency_tracking" != xno]) +m4trace:configure.ac:50: -1- m4_pattern_allow([^AMDEP_TRUE$]) +m4trace:configure.ac:50: -1- m4_pattern_allow([^AMDEP_FALSE$]) +m4trace:configure.ac:50: -1- _AM_SUBST_NOTMAKE([AMDEP_TRUE]) +m4trace:configure.ac:50: -1- _AM_SUBST_NOTMAKE([AMDEP_FALSE]) +m4trace:configure.ac:50: -1- m4_pattern_allow([^AMDEPBACKSLASH$]) +m4trace:configure.ac:50: -1- _AM_SUBST_NOTMAKE([AMDEPBACKSLASH]) +m4trace:configure.ac:50: -1- m4_pattern_allow([^am__nodep$]) +m4trace:configure.ac:50: -1- _AM_SUBST_NOTMAKE([am__nodep]) +m4trace:configure.ac:50: -1- m4_pattern_allow([^CCDEPMODE$]) +m4trace:configure.ac:50: -1- AM_CONDITIONAL([am__fastdepCC], [ + test "x$enable_dependency_tracking" != xno \ + && test "$am_cv_CC_dependencies_compiler_type" = gcc3]) +m4trace:configure.ac:50: -1- m4_pattern_allow([^am__fastdepCC_TRUE$]) +m4trace:configure.ac:50: -1- m4_pattern_allow([^am__fastdepCC_FALSE$]) +m4trace:configure.ac:50: -1- _AM_SUBST_NOTMAKE([am__fastdepCC_TRUE]) +m4trace:configure.ac:50: -1- _AM_SUBST_NOTMAKE([am__fastdepCC_FALSE]) +m4trace:configure.ac:51: -1- AM_PROG_CC_C_O +m4trace:configure.ac:51: -1- m4_pattern_allow([^NO_MINUS_C_MINUS_O$]) +m4trace:configure.ac:52: -1- m4_pattern_allow([^CXX$]) +m4trace:configure.ac:52: -1- m4_pattern_allow([^CXXFLAGS$]) +m4trace:configure.ac:52: -1- m4_pattern_allow([^LDFLAGS$]) +m4trace:configure.ac:52: -1- m4_pattern_allow([^LIBS$]) +m4trace:configure.ac:52: -1- m4_pattern_allow([^CPPFLAGS$]) +m4trace:configure.ac:52: -1- m4_pattern_allow([^CXX$]) +m4trace:configure.ac:52: -1- m4_pattern_allow([^ac_ct_CXX$]) +m4trace:configure.ac:52: -1- _AM_DEPENDENCIES([CXX]) +m4trace:configure.ac:52: -1- m4_pattern_allow([^CXXDEPMODE$]) +m4trace:configure.ac:52: -1- AM_CONDITIONAL([am__fastdepCXX], [ + test "x$enable_dependency_tracking" != xno \ + && test "$am_cv_CXX_dependencies_compiler_type" = gcc3]) +m4trace:configure.ac:52: -1- m4_pattern_allow([^am__fastdepCXX_TRUE$]) +m4trace:configure.ac:52: -1- m4_pattern_allow([^am__fastdepCXX_FALSE$]) +m4trace:configure.ac:52: -1- _AM_SUBST_NOTMAKE([am__fastdepCXX_TRUE]) +m4trace:configure.ac:52: -1- _AM_SUBST_NOTMAKE([am__fastdepCXX_FALSE]) +m4trace:configure.ac:54: -1- m4_pattern_allow([^LN_S$]) +m4trace:configure.ac:106: -1- AM_CONDITIONAL([WANT_SYNCAPI], [test "x$with_syncapi" != xno]) +m4trace:configure.ac:106: -1- m4_pattern_allow([^WANT_SYNCAPI_TRUE$]) +m4trace:configure.ac:106: -1- m4_pattern_allow([^WANT_SYNCAPI_FALSE$]) +m4trace:configure.ac:106: -1- _AM_SUBST_NOTMAKE([WANT_SYNCAPI_TRUE]) +m4trace:configure.ac:106: -1- _AM_SUBST_NOTMAKE([WANT_SYNCAPI_FALSE]) +m4trace:configure.ac:109: -1- m4_pattern_allow([^CPP$]) +m4trace:configure.ac:109: -1- m4_pattern_allow([^CPPFLAGS$]) +m4trace:configure.ac:109: -1- m4_pattern_allow([^CPP$]) +m4trace:configure.ac:109: -1- m4_pattern_allow([^GREP$]) +m4trace:configure.ac:109: -1- m4_pattern_allow([^EGREP$]) +m4trace:configure.ac:109: -1- m4_pattern_allow([^STDC_HEADERS$]) +m4trace:configure.ac:113: -1- m4_pattern_allow([^const$]) +m4trace:configure.ac:115: -1- m4_pattern_allow([^TIME_WITH_SYS_TIME$]) +m4trace:configure.ac:116: -1- m4_pattern_allow([^POLL_NFDS_TYPE$]) +m4trace:configure.ac:116: -1- m4_pattern_allow([^POLL_NFDS_TYPE$]) +m4trace:configure.ac:123: -1- _m4_warn([obsolete], [The macro `AC_TRY_RUN' is obsolete. +You should run autoupdate.], [../../lib/autoconf/general.m4:2764: AC_TRY_RUN is expanded from... +configure.ac:123: the top level]) +m4trace:configure.ac:142: -1- m4_pattern_allow([^USEIPV6$]) +m4trace:configure.ac:149: -1- m4_pattern_allow([^LIB@&t@OBJS$]) +m4trace:configure.ac:149: -1- m4_pattern_allow([^LTLIBOBJS$]) +m4trace:configure.ac:149: -1- AM_CONDITIONAL([am__EXEEXT], [test -n "$EXEEXT"]) +m4trace:configure.ac:149: -1- m4_pattern_allow([^am__EXEEXT_TRUE$]) +m4trace:configure.ac:149: -1- m4_pattern_allow([^am__EXEEXT_FALSE$]) +m4trace:configure.ac:149: -1- _AM_SUBST_NOTMAKE([am__EXEEXT_TRUE]) +m4trace:configure.ac:149: -1- _AM_SUBST_NOTMAKE([am__EXEEXT_FALSE]) +m4trace:configure.ac:149: -1- _AC_AM_CONFIG_HEADER_HOOK(["$ac_file"]) +m4trace:configure.ac:149: -1- _AM_OUTPUT_DEPENDENCY_COMMANDS diff --git a/pkg/registry/zookeeper-3.4.6/src/c/autom4te.cache/traces.1 b/pkg/registry/zookeeper-3.4.6/src/c/autom4te.cache/traces.1 new file mode 100644 index 000000000..95df0a39f --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/c/autom4te.cache/traces.1 @@ -0,0 +1,1138 @@ +m4trace:aclocal.m4:9706: -1- m4_include([acinclude.m4]) +m4trace:configure.ac:6: -1- AC_INIT([zookeeper C client], [3.4.6], [user@zookeeper.apache.org], [zookeeper]) +m4trace:configure.ac:6: -1- m4_pattern_forbid([^_?A[CHUM]_]) +m4trace:configure.ac:6: -1- m4_pattern_forbid([_AC_]) +m4trace:configure.ac:6: -1- m4_pattern_forbid([^LIBOBJS$], [do not use LIBOBJS directly, use AC_LIBOBJ (see section `AC_LIBOBJ vs LIBOBJS']) +m4trace:configure.ac:6: -1- m4_pattern_allow([^AS_FLAGS$]) +m4trace:configure.ac:6: -1- m4_pattern_forbid([^_?m4_]) +m4trace:configure.ac:6: -1- m4_pattern_forbid([^dnl$]) +m4trace:configure.ac:6: -1- m4_pattern_forbid([^_?AS_]) +m4trace:configure.ac:6: -1- AC_SUBST([SHELL]) +m4trace:configure.ac:6: -1- AC_SUBST_TRACE([SHELL]) +m4trace:configure.ac:6: -1- m4_pattern_allow([^SHELL$]) +m4trace:configure.ac:6: -1- AC_SUBST([PATH_SEPARATOR]) +m4trace:configure.ac:6: -1- AC_SUBST_TRACE([PATH_SEPARATOR]) +m4trace:configure.ac:6: -1- m4_pattern_allow([^PATH_SEPARATOR$]) +m4trace:configure.ac:6: -1- AC_SUBST([PACKAGE_NAME], [m4_ifdef([AC_PACKAGE_NAME], ['AC_PACKAGE_NAME'])]) +m4trace:configure.ac:6: -1- AC_SUBST_TRACE([PACKAGE_NAME]) +m4trace:configure.ac:6: -1- m4_pattern_allow([^PACKAGE_NAME$]) +m4trace:configure.ac:6: -1- AC_SUBST([PACKAGE_TARNAME], [m4_ifdef([AC_PACKAGE_TARNAME], ['AC_PACKAGE_TARNAME'])]) +m4trace:configure.ac:6: -1- AC_SUBST_TRACE([PACKAGE_TARNAME]) +m4trace:configure.ac:6: -1- m4_pattern_allow([^PACKAGE_TARNAME$]) +m4trace:configure.ac:6: -1- AC_SUBST([PACKAGE_VERSION], [m4_ifdef([AC_PACKAGE_VERSION], ['AC_PACKAGE_VERSION'])]) +m4trace:configure.ac:6: -1- AC_SUBST_TRACE([PACKAGE_VERSION]) +m4trace:configure.ac:6: -1- m4_pattern_allow([^PACKAGE_VERSION$]) +m4trace:configure.ac:6: -1- AC_SUBST([PACKAGE_STRING], [m4_ifdef([AC_PACKAGE_STRING], ['AC_PACKAGE_STRING'])]) +m4trace:configure.ac:6: -1- AC_SUBST_TRACE([PACKAGE_STRING]) +m4trace:configure.ac:6: -1- m4_pattern_allow([^PACKAGE_STRING$]) +m4trace:configure.ac:6: -1- AC_SUBST([PACKAGE_BUGREPORT], [m4_ifdef([AC_PACKAGE_BUGREPORT], ['AC_PACKAGE_BUGREPORT'])]) +m4trace:configure.ac:6: -1- AC_SUBST_TRACE([PACKAGE_BUGREPORT]) +m4trace:configure.ac:6: -1- m4_pattern_allow([^PACKAGE_BUGREPORT$]) +m4trace:configure.ac:6: -1- AC_SUBST([PACKAGE_URL], [m4_ifdef([AC_PACKAGE_URL], ['AC_PACKAGE_URL'])]) +m4trace:configure.ac:6: -1- AC_SUBST_TRACE([PACKAGE_URL]) +m4trace:configure.ac:6: -1- m4_pattern_allow([^PACKAGE_URL$]) +m4trace:configure.ac:6: -1- AC_SUBST([exec_prefix], [NONE]) +m4trace:configure.ac:6: -1- AC_SUBST_TRACE([exec_prefix]) +m4trace:configure.ac:6: -1- m4_pattern_allow([^exec_prefix$]) +m4trace:configure.ac:6: -1- AC_SUBST([prefix], [NONE]) +m4trace:configure.ac:6: -1- AC_SUBST_TRACE([prefix]) +m4trace:configure.ac:6: -1- m4_pattern_allow([^prefix$]) +m4trace:configure.ac:6: -1- AC_SUBST([program_transform_name], [s,x,x,]) +m4trace:configure.ac:6: -1- AC_SUBST_TRACE([program_transform_name]) +m4trace:configure.ac:6: -1- m4_pattern_allow([^program_transform_name$]) +m4trace:configure.ac:6: -1- AC_SUBST([bindir], ['${exec_prefix}/bin']) +m4trace:configure.ac:6: -1- AC_SUBST_TRACE([bindir]) +m4trace:configure.ac:6: -1- m4_pattern_allow([^bindir$]) +m4trace:configure.ac:6: -1- AC_SUBST([sbindir], ['${exec_prefix}/sbin']) +m4trace:configure.ac:6: -1- AC_SUBST_TRACE([sbindir]) +m4trace:configure.ac:6: -1- m4_pattern_allow([^sbindir$]) +m4trace:configure.ac:6: -1- AC_SUBST([libexecdir], ['${exec_prefix}/libexec']) +m4trace:configure.ac:6: -1- AC_SUBST_TRACE([libexecdir]) +m4trace:configure.ac:6: -1- m4_pattern_allow([^libexecdir$]) +m4trace:configure.ac:6: -1- AC_SUBST([datarootdir], ['${prefix}/share']) +m4trace:configure.ac:6: -1- AC_SUBST_TRACE([datarootdir]) +m4trace:configure.ac:6: -1- m4_pattern_allow([^datarootdir$]) +m4trace:configure.ac:6: -1- AC_SUBST([datadir], ['${datarootdir}']) +m4trace:configure.ac:6: -1- AC_SUBST_TRACE([datadir]) +m4trace:configure.ac:6: -1- m4_pattern_allow([^datadir$]) +m4trace:configure.ac:6: -1- AC_SUBST([sysconfdir], ['${prefix}/etc']) +m4trace:configure.ac:6: -1- AC_SUBST_TRACE([sysconfdir]) +m4trace:configure.ac:6: -1- m4_pattern_allow([^sysconfdir$]) +m4trace:configure.ac:6: -1- AC_SUBST([sharedstatedir], ['${prefix}/com']) +m4trace:configure.ac:6: -1- AC_SUBST_TRACE([sharedstatedir]) +m4trace:configure.ac:6: -1- m4_pattern_allow([^sharedstatedir$]) +m4trace:configure.ac:6: -1- AC_SUBST([localstatedir], ['${prefix}/var']) +m4trace:configure.ac:6: -1- AC_SUBST_TRACE([localstatedir]) +m4trace:configure.ac:6: -1- m4_pattern_allow([^localstatedir$]) +m4trace:configure.ac:6: -1- AC_SUBST([includedir], ['${prefix}/include']) +m4trace:configure.ac:6: -1- AC_SUBST_TRACE([includedir]) +m4trace:configure.ac:6: -1- m4_pattern_allow([^includedir$]) +m4trace:configure.ac:6: -1- AC_SUBST([oldincludedir], ['/usr/include']) +m4trace:configure.ac:6: -1- AC_SUBST_TRACE([oldincludedir]) +m4trace:configure.ac:6: -1- m4_pattern_allow([^oldincludedir$]) +m4trace:configure.ac:6: -1- AC_SUBST([docdir], [m4_ifset([AC_PACKAGE_TARNAME], + ['${datarootdir}/doc/${PACKAGE_TARNAME}'], + ['${datarootdir}/doc/${PACKAGE}'])]) +m4trace:configure.ac:6: -1- AC_SUBST_TRACE([docdir]) +m4trace:configure.ac:6: -1- m4_pattern_allow([^docdir$]) +m4trace:configure.ac:6: -1- AC_SUBST([infodir], ['${datarootdir}/info']) +m4trace:configure.ac:6: -1- AC_SUBST_TRACE([infodir]) +m4trace:configure.ac:6: -1- m4_pattern_allow([^infodir$]) +m4trace:configure.ac:6: -1- AC_SUBST([htmldir], ['${docdir}']) +m4trace:configure.ac:6: -1- AC_SUBST_TRACE([htmldir]) +m4trace:configure.ac:6: -1- m4_pattern_allow([^htmldir$]) +m4trace:configure.ac:6: -1- AC_SUBST([dvidir], ['${docdir}']) +m4trace:configure.ac:6: -1- AC_SUBST_TRACE([dvidir]) +m4trace:configure.ac:6: -1- m4_pattern_allow([^dvidir$]) +m4trace:configure.ac:6: -1- AC_SUBST([pdfdir], ['${docdir}']) +m4trace:configure.ac:6: -1- AC_SUBST_TRACE([pdfdir]) +m4trace:configure.ac:6: -1- m4_pattern_allow([^pdfdir$]) +m4trace:configure.ac:6: -1- AC_SUBST([psdir], ['${docdir}']) +m4trace:configure.ac:6: -1- AC_SUBST_TRACE([psdir]) +m4trace:configure.ac:6: -1- m4_pattern_allow([^psdir$]) +m4trace:configure.ac:6: -1- AC_SUBST([libdir], ['${exec_prefix}/lib']) +m4trace:configure.ac:6: -1- AC_SUBST_TRACE([libdir]) +m4trace:configure.ac:6: -1- m4_pattern_allow([^libdir$]) +m4trace:configure.ac:6: -1- AC_SUBST([localedir], ['${datarootdir}/locale']) +m4trace:configure.ac:6: -1- AC_SUBST_TRACE([localedir]) +m4trace:configure.ac:6: -1- m4_pattern_allow([^localedir$]) +m4trace:configure.ac:6: -1- AC_SUBST([mandir], ['${datarootdir}/man']) +m4trace:configure.ac:6: -1- AC_SUBST_TRACE([mandir]) +m4trace:configure.ac:6: -1- m4_pattern_allow([^mandir$]) +m4trace:configure.ac:6: -1- AC_DEFINE_TRACE_LITERAL([PACKAGE_NAME]) +m4trace:configure.ac:6: -1- m4_pattern_allow([^PACKAGE_NAME$]) +m4trace:configure.ac:6: -1- AH_OUTPUT([PACKAGE_NAME], [/* Define to the full name of this package. */ +@%:@undef PACKAGE_NAME]) +m4trace:configure.ac:6: -1- AC_DEFINE_TRACE_LITERAL([PACKAGE_TARNAME]) +m4trace:configure.ac:6: -1- m4_pattern_allow([^PACKAGE_TARNAME$]) +m4trace:configure.ac:6: -1- AH_OUTPUT([PACKAGE_TARNAME], [/* Define to the one symbol short name of this package. */ +@%:@undef PACKAGE_TARNAME]) +m4trace:configure.ac:6: -1- AC_DEFINE_TRACE_LITERAL([PACKAGE_VERSION]) +m4trace:configure.ac:6: -1- m4_pattern_allow([^PACKAGE_VERSION$]) +m4trace:configure.ac:6: -1- AH_OUTPUT([PACKAGE_VERSION], [/* Define to the version of this package. */ +@%:@undef PACKAGE_VERSION]) +m4trace:configure.ac:6: -1- AC_DEFINE_TRACE_LITERAL([PACKAGE_STRING]) +m4trace:configure.ac:6: -1- m4_pattern_allow([^PACKAGE_STRING$]) +m4trace:configure.ac:6: -1- AH_OUTPUT([PACKAGE_STRING], [/* Define to the full name and version of this package. */ +@%:@undef PACKAGE_STRING]) +m4trace:configure.ac:6: -1- AC_DEFINE_TRACE_LITERAL([PACKAGE_BUGREPORT]) +m4trace:configure.ac:6: -1- m4_pattern_allow([^PACKAGE_BUGREPORT$]) +m4trace:configure.ac:6: -1- AH_OUTPUT([PACKAGE_BUGREPORT], [/* Define to the address where bug reports for this package should be sent. */ +@%:@undef PACKAGE_BUGREPORT]) +m4trace:configure.ac:6: -1- AC_DEFINE_TRACE_LITERAL([PACKAGE_URL]) +m4trace:configure.ac:6: -1- m4_pattern_allow([^PACKAGE_URL$]) +m4trace:configure.ac:6: -1- AH_OUTPUT([PACKAGE_URL], [/* Define to the home page for this package. */ +@%:@undef PACKAGE_URL]) +m4trace:configure.ac:6: -1- AC_SUBST([DEFS]) +m4trace:configure.ac:6: -1- AC_SUBST_TRACE([DEFS]) +m4trace:configure.ac:6: -1- m4_pattern_allow([^DEFS$]) +m4trace:configure.ac:6: -1- AC_SUBST([ECHO_C]) +m4trace:configure.ac:6: -1- AC_SUBST_TRACE([ECHO_C]) +m4trace:configure.ac:6: -1- m4_pattern_allow([^ECHO_C$]) +m4trace:configure.ac:6: -1- AC_SUBST([ECHO_N]) +m4trace:configure.ac:6: -1- AC_SUBST_TRACE([ECHO_N]) +m4trace:configure.ac:6: -1- m4_pattern_allow([^ECHO_N$]) +m4trace:configure.ac:6: -1- AC_SUBST([ECHO_T]) +m4trace:configure.ac:6: -1- AC_SUBST_TRACE([ECHO_T]) +m4trace:configure.ac:6: -1- m4_pattern_allow([^ECHO_T$]) +m4trace:configure.ac:6: -1- AC_SUBST([LIBS]) +m4trace:configure.ac:6: -1- AC_SUBST_TRACE([LIBS]) +m4trace:configure.ac:6: -1- m4_pattern_allow([^LIBS$]) +m4trace:configure.ac:6: -1- AC_SUBST([build_alias]) +m4trace:configure.ac:6: -1- AC_SUBST_TRACE([build_alias]) +m4trace:configure.ac:6: -1- m4_pattern_allow([^build_alias$]) +m4trace:configure.ac:6: -1- AC_SUBST([host_alias]) +m4trace:configure.ac:6: -1- AC_SUBST_TRACE([host_alias]) +m4trace:configure.ac:6: -1- m4_pattern_allow([^host_alias$]) +m4trace:configure.ac:6: -1- AC_SUBST([target_alias]) +m4trace:configure.ac:6: -1- AC_SUBST_TRACE([target_alias]) +m4trace:configure.ac:6: -1- m4_pattern_allow([^target_alias$]) +m4trace:configure.ac:22: -1- AC_SUBST([DX_PROJECT], [zookeeper]) +m4trace:configure.ac:22: -1- AC_SUBST_TRACE([DX_PROJECT]) +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_PROJECT$]) +m4trace:configure.ac:22: -1- AC_SUBST([DX_CONFIG], [ifelse([c-doc.Doxyfile], [], Doxyfile, [c-doc.Doxyfile])]) +m4trace:configure.ac:22: -1- AC_SUBST_TRACE([DX_CONFIG]) +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_CONFIG$]) +m4trace:configure.ac:22: -1- AC_SUBST([DX_DOCDIR], [ifelse([docs], [], doxygen-doc, [docs])]) +m4trace:configure.ac:22: -1- AC_SUBST_TRACE([DX_DOCDIR]) +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_DOCDIR$]) +m4trace:configure.ac:22: -1- AC_SUBST([DX_ENV], ["$DX_ENV SRCDIR='$srcdir'"]) +m4trace:configure.ac:22: -1- AC_SUBST_TRACE([DX_ENV]) +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_ENV$]) +m4trace:configure.ac:22: -1- AC_SUBST([DX_ENV], ["$DX_ENV PROJECT='$DX_PROJECT'"]) +m4trace:configure.ac:22: -1- AC_SUBST_TRACE([DX_ENV]) +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_ENV$]) +m4trace:configure.ac:22: -1- AC_SUBST([DX_ENV], ["$DX_ENV DOCDIR='$DX_DOCDIR'"]) +m4trace:configure.ac:22: -1- AC_SUBST_TRACE([DX_ENV]) +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_ENV$]) +m4trace:configure.ac:22: -1- AC_SUBST([DX_ENV], ["$DX_ENV VERSION='$PACKAGE_VERSION'"]) +m4trace:configure.ac:22: -1- AC_SUBST_TRACE([DX_ENV]) +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_ENV$]) +m4trace:configure.ac:22: -1- AC_SUBST([DX_FLAG_doc], [1]) +m4trace:configure.ac:22: -1- AC_SUBST_TRACE([DX_FLAG_doc]) +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_FLAG_doc$]) +m4trace:configure.ac:22: -1- AC_SUBST([DX_FLAG_doc], [0]) +m4trace:configure.ac:22: -1- AC_SUBST_TRACE([DX_FLAG_doc]) +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_FLAG_doc$]) +m4trace:configure.ac:22: -1- AC_SUBST([DX_FLAG_doc], [DX_IF_FEATURE([doc], 1, 0)]) +m4trace:configure.ac:22: -1- AC_SUBST_TRACE([DX_FLAG_doc]) +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_FLAG_doc$]) +m4trace:configure.ac:22: -1- AC_SUBST([DX_DOXYGEN]) +m4trace:configure.ac:22: -1- AC_SUBST_TRACE([DX_DOXYGEN]) +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_DOXYGEN$]) +m4trace:configure.ac:22: -1- AC_SUBST([DX_FLAG_doc], [0]) +m4trace:configure.ac:22: -1- AC_SUBST_TRACE([DX_FLAG_doc]) +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_FLAG_doc$]) +m4trace:configure.ac:22: -1- AC_SUBST([DX_PERL]) +m4trace:configure.ac:22: -1- AC_SUBST_TRACE([DX_PERL]) +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_PERL$]) +m4trace:configure.ac:22: -1- AC_SUBST([DX_FLAG_doc], [0]) +m4trace:configure.ac:22: -1- AC_SUBST_TRACE([DX_FLAG_doc]) +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_FLAG_doc$]) +m4trace:configure.ac:22: -1- AM_CONDITIONAL([DX_COND_doc], [:]) +m4trace:configure.ac:22: -1- AC_SUBST([DX_COND_doc_TRUE]) +m4trace:configure.ac:22: -1- AC_SUBST_TRACE([DX_COND_doc_TRUE]) +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_COND_doc_TRUE$]) +m4trace:configure.ac:22: -1- AC_SUBST([DX_COND_doc_FALSE]) +m4trace:configure.ac:22: -1- AC_SUBST_TRACE([DX_COND_doc_FALSE]) +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_COND_doc_FALSE$]) +m4trace:configure.ac:22: -1- _AM_SUBST_NOTMAKE([DX_COND_doc_TRUE]) +m4trace:configure.ac:22: -1- _AM_SUBST_NOTMAKE([DX_COND_doc_FALSE]) +m4trace:configure.ac:22: -1- AC_SUBST([DX_ENV], ["$DX_ENV PERL_PATH='$DX_PERL'"]) +m4trace:configure.ac:22: -1- AC_SUBST_TRACE([DX_ENV]) +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_ENV$]) +m4trace:configure.ac:22: -1- AM_CONDITIONAL([DX_COND_doc], [false]) +m4trace:configure.ac:22: -1- AC_SUBST([DX_COND_doc_TRUE]) +m4trace:configure.ac:22: -1- AC_SUBST_TRACE([DX_COND_doc_TRUE]) +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_COND_doc_TRUE$]) +m4trace:configure.ac:22: -1- AC_SUBST([DX_COND_doc_FALSE]) +m4trace:configure.ac:22: -1- AC_SUBST_TRACE([DX_COND_doc_FALSE]) +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_COND_doc_FALSE$]) +m4trace:configure.ac:22: -1- _AM_SUBST_NOTMAKE([DX_COND_doc_TRUE]) +m4trace:configure.ac:22: -1- _AM_SUBST_NOTMAKE([DX_COND_doc_FALSE]) +m4trace:configure.ac:22: -1- AC_SUBST([DX_FLAG_dot], [1]) +m4trace:configure.ac:22: -1- AC_SUBST_TRACE([DX_FLAG_dot]) +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_FLAG_dot$]) +m4trace:configure.ac:22: -1- AC_SUBST([DX_FLAG_dot], [0]) +m4trace:configure.ac:22: -1- AC_SUBST_TRACE([DX_FLAG_dot]) +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_FLAG_dot$]) +m4trace:configure.ac:22: -1- AC_SUBST([DX_FLAG_dot], [DX_IF_FEATURE([dot], 1, 0)]) +m4trace:configure.ac:22: -1- AC_SUBST_TRACE([DX_FLAG_dot]) +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_FLAG_dot$]) +m4trace:configure.ac:22: -1- AC_SUBST([DX_FLAG_dot], [0]) +m4trace:configure.ac:22: -1- AC_SUBST_TRACE([DX_FLAG_dot]) +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_FLAG_dot$]) +m4trace:configure.ac:22: -1- AC_SUBST([DX_DOT]) +m4trace:configure.ac:22: -1- AC_SUBST_TRACE([DX_DOT]) +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_DOT$]) +m4trace:configure.ac:22: -1- AC_SUBST([DX_FLAG_dot], [0]) +m4trace:configure.ac:22: -1- AC_SUBST_TRACE([DX_FLAG_dot]) +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_FLAG_dot$]) +m4trace:configure.ac:22: -1- AM_CONDITIONAL([DX_COND_dot], [:]) +m4trace:configure.ac:22: -1- AC_SUBST([DX_COND_dot_TRUE]) +m4trace:configure.ac:22: -1- AC_SUBST_TRACE([DX_COND_dot_TRUE]) +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_COND_dot_TRUE$]) +m4trace:configure.ac:22: -1- AC_SUBST([DX_COND_dot_FALSE]) +m4trace:configure.ac:22: -1- AC_SUBST_TRACE([DX_COND_dot_FALSE]) +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_COND_dot_FALSE$]) +m4trace:configure.ac:22: -1- _AM_SUBST_NOTMAKE([DX_COND_dot_TRUE]) +m4trace:configure.ac:22: -1- _AM_SUBST_NOTMAKE([DX_COND_dot_FALSE]) +m4trace:configure.ac:22: -1- AC_SUBST([DX_ENV], ["$DX_ENV HAVE_DOT='YES'"]) +m4trace:configure.ac:22: -1- AC_SUBST_TRACE([DX_ENV]) +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_ENV$]) +m4trace:configure.ac:22: -1- AC_SUBST([DX_ENV], ["$DX_ENV DOT_PATH='`DX_DIRNAME_EXPR($DX_DOT)`'"]) +m4trace:configure.ac:22: -1- AC_SUBST_TRACE([DX_ENV]) +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_ENV$]) +m4trace:configure.ac:22: -1- AM_CONDITIONAL([DX_COND_dot], [false]) +m4trace:configure.ac:22: -1- AC_SUBST([DX_COND_dot_TRUE]) +m4trace:configure.ac:22: -1- AC_SUBST_TRACE([DX_COND_dot_TRUE]) +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_COND_dot_TRUE$]) +m4trace:configure.ac:22: -1- AC_SUBST([DX_COND_dot_FALSE]) +m4trace:configure.ac:22: -1- AC_SUBST_TRACE([DX_COND_dot_FALSE]) +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_COND_dot_FALSE$]) +m4trace:configure.ac:22: -1- _AM_SUBST_NOTMAKE([DX_COND_dot_TRUE]) +m4trace:configure.ac:22: -1- _AM_SUBST_NOTMAKE([DX_COND_dot_FALSE]) +m4trace:configure.ac:22: -1- AC_SUBST([DX_ENV], ["$DX_ENV HAVE_DOT='NO'"]) +m4trace:configure.ac:22: -1- AC_SUBST_TRACE([DX_ENV]) +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_ENV$]) +m4trace:configure.ac:22: -1- AC_SUBST([DX_FLAG_man], [1]) +m4trace:configure.ac:22: -1- AC_SUBST_TRACE([DX_FLAG_man]) +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_FLAG_man$]) +m4trace:configure.ac:22: -1- AC_SUBST([DX_FLAG_man], [0]) +m4trace:configure.ac:22: -1- AC_SUBST_TRACE([DX_FLAG_man]) +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_FLAG_man$]) +m4trace:configure.ac:22: -1- AC_SUBST([DX_FLAG_man], [DX_IF_FEATURE([man], 1, 0)]) +m4trace:configure.ac:22: -1- AC_SUBST_TRACE([DX_FLAG_man]) +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_FLAG_man$]) +m4trace:configure.ac:22: -1- AC_SUBST([DX_FLAG_man], [0]) +m4trace:configure.ac:22: -1- AC_SUBST_TRACE([DX_FLAG_man]) +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_FLAG_man$]) +m4trace:configure.ac:22: -1- AM_CONDITIONAL([DX_COND_man], [:]) +m4trace:configure.ac:22: -1- AC_SUBST([DX_COND_man_TRUE]) +m4trace:configure.ac:22: -1- AC_SUBST_TRACE([DX_COND_man_TRUE]) +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_COND_man_TRUE$]) +m4trace:configure.ac:22: -1- AC_SUBST([DX_COND_man_FALSE]) +m4trace:configure.ac:22: -1- AC_SUBST_TRACE([DX_COND_man_FALSE]) +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_COND_man_FALSE$]) +m4trace:configure.ac:22: -1- _AM_SUBST_NOTMAKE([DX_COND_man_TRUE]) +m4trace:configure.ac:22: -1- _AM_SUBST_NOTMAKE([DX_COND_man_FALSE]) +m4trace:configure.ac:22: -1- AC_SUBST([DX_ENV], ["$DX_ENV GENERATE_MAN='YES'"]) +m4trace:configure.ac:22: -1- AC_SUBST_TRACE([DX_ENV]) +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_ENV$]) +m4trace:configure.ac:22: -1- AM_CONDITIONAL([DX_COND_man], [false]) +m4trace:configure.ac:22: -1- AC_SUBST([DX_COND_man_TRUE]) +m4trace:configure.ac:22: -1- AC_SUBST_TRACE([DX_COND_man_TRUE]) +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_COND_man_TRUE$]) +m4trace:configure.ac:22: -1- AC_SUBST([DX_COND_man_FALSE]) +m4trace:configure.ac:22: -1- AC_SUBST_TRACE([DX_COND_man_FALSE]) +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_COND_man_FALSE$]) +m4trace:configure.ac:22: -1- _AM_SUBST_NOTMAKE([DX_COND_man_TRUE]) +m4trace:configure.ac:22: -1- _AM_SUBST_NOTMAKE([DX_COND_man_FALSE]) +m4trace:configure.ac:22: -1- AC_SUBST([DX_ENV], ["$DX_ENV GENERATE_MAN='NO'"]) +m4trace:configure.ac:22: -1- AC_SUBST_TRACE([DX_ENV]) +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_ENV$]) +m4trace:configure.ac:22: -1- AC_SUBST([DX_FLAG_rtf], [1]) +m4trace:configure.ac:22: -1- AC_SUBST_TRACE([DX_FLAG_rtf]) +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_FLAG_rtf$]) +m4trace:configure.ac:22: -1- AC_SUBST([DX_FLAG_rtf], [0]) +m4trace:configure.ac:22: -1- AC_SUBST_TRACE([DX_FLAG_rtf]) +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_FLAG_rtf$]) +m4trace:configure.ac:22: -1- AC_SUBST([DX_FLAG_rtf], [DX_IF_FEATURE([rtf], 1, 0)]) +m4trace:configure.ac:22: -1- AC_SUBST_TRACE([DX_FLAG_rtf]) +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_FLAG_rtf$]) +m4trace:configure.ac:22: -1- AC_SUBST([DX_FLAG_rtf], [0]) +m4trace:configure.ac:22: -1- AC_SUBST_TRACE([DX_FLAG_rtf]) +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_FLAG_rtf$]) +m4trace:configure.ac:22: -1- AM_CONDITIONAL([DX_COND_rtf], [:]) +m4trace:configure.ac:22: -1- AC_SUBST([DX_COND_rtf_TRUE]) +m4trace:configure.ac:22: -1- AC_SUBST_TRACE([DX_COND_rtf_TRUE]) +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_COND_rtf_TRUE$]) +m4trace:configure.ac:22: -1- AC_SUBST([DX_COND_rtf_FALSE]) +m4trace:configure.ac:22: -1- AC_SUBST_TRACE([DX_COND_rtf_FALSE]) +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_COND_rtf_FALSE$]) +m4trace:configure.ac:22: -1- _AM_SUBST_NOTMAKE([DX_COND_rtf_TRUE]) +m4trace:configure.ac:22: -1- _AM_SUBST_NOTMAKE([DX_COND_rtf_FALSE]) +m4trace:configure.ac:22: -1- AC_SUBST([DX_ENV], ["$DX_ENV GENERATE_RTF='YES'"]) +m4trace:configure.ac:22: -1- AC_SUBST_TRACE([DX_ENV]) +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_ENV$]) +m4trace:configure.ac:22: -1- AM_CONDITIONAL([DX_COND_rtf], [false]) +m4trace:configure.ac:22: -1- AC_SUBST([DX_COND_rtf_TRUE]) +m4trace:configure.ac:22: -1- AC_SUBST_TRACE([DX_COND_rtf_TRUE]) +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_COND_rtf_TRUE$]) +m4trace:configure.ac:22: -1- AC_SUBST([DX_COND_rtf_FALSE]) +m4trace:configure.ac:22: -1- AC_SUBST_TRACE([DX_COND_rtf_FALSE]) +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_COND_rtf_FALSE$]) +m4trace:configure.ac:22: -1- _AM_SUBST_NOTMAKE([DX_COND_rtf_TRUE]) +m4trace:configure.ac:22: -1- _AM_SUBST_NOTMAKE([DX_COND_rtf_FALSE]) +m4trace:configure.ac:22: -1- AC_SUBST([DX_ENV], ["$DX_ENV GENERATE_RTF='NO'"]) +m4trace:configure.ac:22: -1- AC_SUBST_TRACE([DX_ENV]) +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_ENV$]) +m4trace:configure.ac:22: -1- AC_SUBST([DX_FLAG_xml], [1]) +m4trace:configure.ac:22: -1- AC_SUBST_TRACE([DX_FLAG_xml]) +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_FLAG_xml$]) +m4trace:configure.ac:22: -1- AC_SUBST([DX_FLAG_xml], [0]) +m4trace:configure.ac:22: -1- AC_SUBST_TRACE([DX_FLAG_xml]) +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_FLAG_xml$]) +m4trace:configure.ac:22: -1- AC_SUBST([DX_FLAG_xml], [DX_IF_FEATURE([xml], 1, 0)]) +m4trace:configure.ac:22: -1- AC_SUBST_TRACE([DX_FLAG_xml]) +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_FLAG_xml$]) +m4trace:configure.ac:22: -1- AC_SUBST([DX_FLAG_xml], [0]) +m4trace:configure.ac:22: -1- AC_SUBST_TRACE([DX_FLAG_xml]) +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_FLAG_xml$]) +m4trace:configure.ac:22: -1- AM_CONDITIONAL([DX_COND_xml], [:]) +m4trace:configure.ac:22: -1- AC_SUBST([DX_COND_xml_TRUE]) +m4trace:configure.ac:22: -1- AC_SUBST_TRACE([DX_COND_xml_TRUE]) +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_COND_xml_TRUE$]) +m4trace:configure.ac:22: -1- AC_SUBST([DX_COND_xml_FALSE]) +m4trace:configure.ac:22: -1- AC_SUBST_TRACE([DX_COND_xml_FALSE]) +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_COND_xml_FALSE$]) +m4trace:configure.ac:22: -1- _AM_SUBST_NOTMAKE([DX_COND_xml_TRUE]) +m4trace:configure.ac:22: -1- _AM_SUBST_NOTMAKE([DX_COND_xml_FALSE]) +m4trace:configure.ac:22: -1- AC_SUBST([DX_ENV], ["$DX_ENV GENERATE_XML='YES'"]) +m4trace:configure.ac:22: -1- AC_SUBST_TRACE([DX_ENV]) +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_ENV$]) +m4trace:configure.ac:22: -1- AM_CONDITIONAL([DX_COND_xml], [false]) +m4trace:configure.ac:22: -1- AC_SUBST([DX_COND_xml_TRUE]) +m4trace:configure.ac:22: -1- AC_SUBST_TRACE([DX_COND_xml_TRUE]) +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_COND_xml_TRUE$]) +m4trace:configure.ac:22: -1- AC_SUBST([DX_COND_xml_FALSE]) +m4trace:configure.ac:22: -1- AC_SUBST_TRACE([DX_COND_xml_FALSE]) +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_COND_xml_FALSE$]) +m4trace:configure.ac:22: -1- _AM_SUBST_NOTMAKE([DX_COND_xml_TRUE]) +m4trace:configure.ac:22: -1- _AM_SUBST_NOTMAKE([DX_COND_xml_FALSE]) +m4trace:configure.ac:22: -1- AC_SUBST([DX_ENV], ["$DX_ENV GENERATE_XML='NO'"]) +m4trace:configure.ac:22: -1- AC_SUBST_TRACE([DX_ENV]) +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_ENV$]) +m4trace:configure.ac:22: -1- AC_SUBST([DX_FLAG_chm], [1]) +m4trace:configure.ac:22: -1- AC_SUBST_TRACE([DX_FLAG_chm]) +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_FLAG_chm$]) +m4trace:configure.ac:22: -1- AC_SUBST([DX_FLAG_chm], [0]) +m4trace:configure.ac:22: -1- AC_SUBST_TRACE([DX_FLAG_chm]) +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_FLAG_chm$]) +m4trace:configure.ac:22: -1- AC_SUBST([DX_FLAG_chm], [DX_IF_FEATURE([chm], 1, 0)]) +m4trace:configure.ac:22: -1- AC_SUBST_TRACE([DX_FLAG_chm]) +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_FLAG_chm$]) +m4trace:configure.ac:22: -1- AC_SUBST([DX_FLAG_chm], [0]) +m4trace:configure.ac:22: -1- AC_SUBST_TRACE([DX_FLAG_chm]) +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_FLAG_chm$]) +m4trace:configure.ac:22: -1- AC_SUBST([DX_HHC]) +m4trace:configure.ac:22: -1- AC_SUBST_TRACE([DX_HHC]) +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_HHC$]) +m4trace:configure.ac:22: -1- AC_SUBST([DX_FLAG_chm], [0]) +m4trace:configure.ac:22: -1- AC_SUBST_TRACE([DX_FLAG_chm]) +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_FLAG_chm$]) +m4trace:configure.ac:22: -1- AM_CONDITIONAL([DX_COND_chm], [:]) +m4trace:configure.ac:22: -1- AC_SUBST([DX_COND_chm_TRUE]) +m4trace:configure.ac:22: -1- AC_SUBST_TRACE([DX_COND_chm_TRUE]) +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_COND_chm_TRUE$]) +m4trace:configure.ac:22: -1- AC_SUBST([DX_COND_chm_FALSE]) +m4trace:configure.ac:22: -1- AC_SUBST_TRACE([DX_COND_chm_FALSE]) +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_COND_chm_FALSE$]) +m4trace:configure.ac:22: -1- _AM_SUBST_NOTMAKE([DX_COND_chm_TRUE]) +m4trace:configure.ac:22: -1- _AM_SUBST_NOTMAKE([DX_COND_chm_FALSE]) +m4trace:configure.ac:22: -1- AC_SUBST([DX_ENV], ["$DX_ENV HHC_PATH='$DX_HHC'"]) +m4trace:configure.ac:22: -1- AC_SUBST_TRACE([DX_ENV]) +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_ENV$]) +m4trace:configure.ac:22: -1- AC_SUBST([DX_ENV], ["$DX_ENV GENERATE_HTML='YES'"]) +m4trace:configure.ac:22: -1- AC_SUBST_TRACE([DX_ENV]) +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_ENV$]) +m4trace:configure.ac:22: -1- AC_SUBST([DX_ENV], ["$DX_ENV GENERATE_HTMLHELP='YES'"]) +m4trace:configure.ac:22: -1- AC_SUBST_TRACE([DX_ENV]) +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_ENV$]) +m4trace:configure.ac:22: -1- AM_CONDITIONAL([DX_COND_chm], [false]) +m4trace:configure.ac:22: -1- AC_SUBST([DX_COND_chm_TRUE]) +m4trace:configure.ac:22: -1- AC_SUBST_TRACE([DX_COND_chm_TRUE]) +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_COND_chm_TRUE$]) +m4trace:configure.ac:22: -1- AC_SUBST([DX_COND_chm_FALSE]) +m4trace:configure.ac:22: -1- AC_SUBST_TRACE([DX_COND_chm_FALSE]) +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_COND_chm_FALSE$]) +m4trace:configure.ac:22: -1- _AM_SUBST_NOTMAKE([DX_COND_chm_TRUE]) +m4trace:configure.ac:22: -1- _AM_SUBST_NOTMAKE([DX_COND_chm_FALSE]) +m4trace:configure.ac:22: -1- AC_SUBST([DX_ENV], ["$DX_ENV GENERATE_HTMLHELP='NO'"]) +m4trace:configure.ac:22: -1- AC_SUBST_TRACE([DX_ENV]) +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_ENV$]) +m4trace:configure.ac:22: -1- AC_SUBST([DX_FLAG_chi], [1]) +m4trace:configure.ac:22: -1- AC_SUBST_TRACE([DX_FLAG_chi]) +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_FLAG_chi$]) +m4trace:configure.ac:22: -1- AC_SUBST([DX_FLAG_chi], [0]) +m4trace:configure.ac:22: -1- AC_SUBST_TRACE([DX_FLAG_chi]) +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_FLAG_chi$]) +m4trace:configure.ac:22: -1- AC_SUBST([DX_FLAG_chi], [DX_IF_FEATURE([chi], 1, 0)]) +m4trace:configure.ac:22: -1- AC_SUBST_TRACE([DX_FLAG_chi]) +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_FLAG_chi$]) +m4trace:configure.ac:22: -1- AC_SUBST([DX_FLAG_chi], [0]) +m4trace:configure.ac:22: -1- AC_SUBST_TRACE([DX_FLAG_chi]) +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_FLAG_chi$]) +m4trace:configure.ac:22: -1- AM_CONDITIONAL([DX_COND_chi], [:]) +m4trace:configure.ac:22: -1- AC_SUBST([DX_COND_chi_TRUE]) +m4trace:configure.ac:22: -1- AC_SUBST_TRACE([DX_COND_chi_TRUE]) +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_COND_chi_TRUE$]) +m4trace:configure.ac:22: -1- AC_SUBST([DX_COND_chi_FALSE]) +m4trace:configure.ac:22: -1- AC_SUBST_TRACE([DX_COND_chi_FALSE]) +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_COND_chi_FALSE$]) +m4trace:configure.ac:22: -1- _AM_SUBST_NOTMAKE([DX_COND_chi_TRUE]) +m4trace:configure.ac:22: -1- _AM_SUBST_NOTMAKE([DX_COND_chi_FALSE]) +m4trace:configure.ac:22: -1- AC_SUBST([DX_ENV], ["$DX_ENV GENERATE_CHI='YES'"]) +m4trace:configure.ac:22: -1- AC_SUBST_TRACE([DX_ENV]) +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_ENV$]) +m4trace:configure.ac:22: -1- AM_CONDITIONAL([DX_COND_chi], [false]) +m4trace:configure.ac:22: -1- AC_SUBST([DX_COND_chi_TRUE]) +m4trace:configure.ac:22: -1- AC_SUBST_TRACE([DX_COND_chi_TRUE]) +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_COND_chi_TRUE$]) +m4trace:configure.ac:22: -1- AC_SUBST([DX_COND_chi_FALSE]) +m4trace:configure.ac:22: -1- AC_SUBST_TRACE([DX_COND_chi_FALSE]) +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_COND_chi_FALSE$]) +m4trace:configure.ac:22: -1- _AM_SUBST_NOTMAKE([DX_COND_chi_TRUE]) +m4trace:configure.ac:22: -1- _AM_SUBST_NOTMAKE([DX_COND_chi_FALSE]) +m4trace:configure.ac:22: -1- AC_SUBST([DX_ENV], ["$DX_ENV GENERATE_CHI='NO'"]) +m4trace:configure.ac:22: -1- AC_SUBST_TRACE([DX_ENV]) +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_ENV$]) +m4trace:configure.ac:22: -1- AC_SUBST([DX_FLAG_html], [1]) +m4trace:configure.ac:22: -1- AC_SUBST_TRACE([DX_FLAG_html]) +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_FLAG_html$]) +m4trace:configure.ac:22: -1- AC_SUBST([DX_FLAG_html], [0]) +m4trace:configure.ac:22: -1- AC_SUBST_TRACE([DX_FLAG_html]) +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_FLAG_html$]) +m4trace:configure.ac:22: -1- AC_SUBST([DX_FLAG_html], [DX_IF_FEATURE([html], 1, 0)]) +m4trace:configure.ac:22: -1- AC_SUBST_TRACE([DX_FLAG_html]) +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_FLAG_html$]) +m4trace:configure.ac:22: -1- AC_SUBST([DX_FLAG_html], [0]) +m4trace:configure.ac:22: -1- AC_SUBST_TRACE([DX_FLAG_html]) +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_FLAG_html$]) +m4trace:configure.ac:22: -1- AC_SUBST([DX_FLAG_html], [0]) +m4trace:configure.ac:22: -1- AC_SUBST_TRACE([DX_FLAG_html]) +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_FLAG_html$]) +m4trace:configure.ac:22: -1- AM_CONDITIONAL([DX_COND_html], [:]) +m4trace:configure.ac:22: -1- AC_SUBST([DX_COND_html_TRUE]) +m4trace:configure.ac:22: -1- AC_SUBST_TRACE([DX_COND_html_TRUE]) +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_COND_html_TRUE$]) +m4trace:configure.ac:22: -1- AC_SUBST([DX_COND_html_FALSE]) +m4trace:configure.ac:22: -1- AC_SUBST_TRACE([DX_COND_html_FALSE]) +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_COND_html_FALSE$]) +m4trace:configure.ac:22: -1- _AM_SUBST_NOTMAKE([DX_COND_html_TRUE]) +m4trace:configure.ac:22: -1- _AM_SUBST_NOTMAKE([DX_COND_html_FALSE]) +m4trace:configure.ac:22: -1- AC_SUBST([DX_ENV], ["$DX_ENV GENERATE_HTML='YES'"]) +m4trace:configure.ac:22: -1- AC_SUBST_TRACE([DX_ENV]) +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_ENV$]) +m4trace:configure.ac:22: -1- AM_CONDITIONAL([DX_COND_html], [false]) +m4trace:configure.ac:22: -1- AC_SUBST([DX_COND_html_TRUE]) +m4trace:configure.ac:22: -1- AC_SUBST_TRACE([DX_COND_html_TRUE]) +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_COND_html_TRUE$]) +m4trace:configure.ac:22: -1- AC_SUBST([DX_COND_html_FALSE]) +m4trace:configure.ac:22: -1- AC_SUBST_TRACE([DX_COND_html_FALSE]) +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_COND_html_FALSE$]) +m4trace:configure.ac:22: -1- _AM_SUBST_NOTMAKE([DX_COND_html_TRUE]) +m4trace:configure.ac:22: -1- _AM_SUBST_NOTMAKE([DX_COND_html_FALSE]) +m4trace:configure.ac:22: -1- AC_SUBST([DX_ENV], ["$DX_ENV GENERATE_HTML='NO'"]) +m4trace:configure.ac:22: -1- AC_SUBST_TRACE([DX_ENV]) +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_ENV$]) +m4trace:configure.ac:22: -1- AC_SUBST([DX_FLAG_ps], [1]) +m4trace:configure.ac:22: -1- AC_SUBST_TRACE([DX_FLAG_ps]) +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_FLAG_ps$]) +m4trace:configure.ac:22: -1- AC_SUBST([DX_FLAG_ps], [0]) +m4trace:configure.ac:22: -1- AC_SUBST_TRACE([DX_FLAG_ps]) +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_FLAG_ps$]) +m4trace:configure.ac:22: -1- AC_SUBST([DX_FLAG_ps], [DX_IF_FEATURE([ps], 1, 0)]) +m4trace:configure.ac:22: -1- AC_SUBST_TRACE([DX_FLAG_ps]) +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_FLAG_ps$]) +m4trace:configure.ac:22: -1- AC_SUBST([DX_FLAG_ps], [0]) +m4trace:configure.ac:22: -1- AC_SUBST_TRACE([DX_FLAG_ps]) +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_FLAG_ps$]) +m4trace:configure.ac:22: -1- AC_SUBST([DX_LATEX]) +m4trace:configure.ac:22: -1- AC_SUBST_TRACE([DX_LATEX]) +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_LATEX$]) +m4trace:configure.ac:22: -1- AC_SUBST([DX_FLAG_ps], [0]) +m4trace:configure.ac:22: -1- AC_SUBST_TRACE([DX_FLAG_ps]) +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_FLAG_ps$]) +m4trace:configure.ac:22: -1- AC_SUBST([DX_MAKEINDEX]) +m4trace:configure.ac:22: -1- AC_SUBST_TRACE([DX_MAKEINDEX]) +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_MAKEINDEX$]) +m4trace:configure.ac:22: -1- AC_SUBST([DX_FLAG_ps], [0]) +m4trace:configure.ac:22: -1- AC_SUBST_TRACE([DX_FLAG_ps]) +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_FLAG_ps$]) +m4trace:configure.ac:22: -1- AC_SUBST([DX_DVIPS]) +m4trace:configure.ac:22: -1- AC_SUBST_TRACE([DX_DVIPS]) +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_DVIPS$]) +m4trace:configure.ac:22: -1- AC_SUBST([DX_FLAG_ps], [0]) +m4trace:configure.ac:22: -1- AC_SUBST_TRACE([DX_FLAG_ps]) +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_FLAG_ps$]) +m4trace:configure.ac:22: -1- AC_SUBST([DX_EGREP]) +m4trace:configure.ac:22: -1- AC_SUBST_TRACE([DX_EGREP]) +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_EGREP$]) +m4trace:configure.ac:22: -1- AC_SUBST([DX_FLAG_ps], [0]) +m4trace:configure.ac:22: -1- AC_SUBST_TRACE([DX_FLAG_ps]) +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_FLAG_ps$]) +m4trace:configure.ac:22: -1- AM_CONDITIONAL([DX_COND_ps], [:]) +m4trace:configure.ac:22: -1- AC_SUBST([DX_COND_ps_TRUE]) +m4trace:configure.ac:22: -1- AC_SUBST_TRACE([DX_COND_ps_TRUE]) +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_COND_ps_TRUE$]) +m4trace:configure.ac:22: -1- AC_SUBST([DX_COND_ps_FALSE]) +m4trace:configure.ac:22: -1- AC_SUBST_TRACE([DX_COND_ps_FALSE]) +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_COND_ps_FALSE$]) +m4trace:configure.ac:22: -1- _AM_SUBST_NOTMAKE([DX_COND_ps_TRUE]) +m4trace:configure.ac:22: -1- _AM_SUBST_NOTMAKE([DX_COND_ps_FALSE]) +m4trace:configure.ac:22: -1- AM_CONDITIONAL([DX_COND_ps], [false]) +m4trace:configure.ac:22: -1- AC_SUBST([DX_COND_ps_TRUE]) +m4trace:configure.ac:22: -1- AC_SUBST_TRACE([DX_COND_ps_TRUE]) +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_COND_ps_TRUE$]) +m4trace:configure.ac:22: -1- AC_SUBST([DX_COND_ps_FALSE]) +m4trace:configure.ac:22: -1- AC_SUBST_TRACE([DX_COND_ps_FALSE]) +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_COND_ps_FALSE$]) +m4trace:configure.ac:22: -1- _AM_SUBST_NOTMAKE([DX_COND_ps_TRUE]) +m4trace:configure.ac:22: -1- _AM_SUBST_NOTMAKE([DX_COND_ps_FALSE]) +m4trace:configure.ac:22: -1- AC_SUBST([DX_FLAG_pdf], [1]) +m4trace:configure.ac:22: -1- AC_SUBST_TRACE([DX_FLAG_pdf]) +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_FLAG_pdf$]) +m4trace:configure.ac:22: -1- AC_SUBST([DX_FLAG_pdf], [0]) +m4trace:configure.ac:22: -1- AC_SUBST_TRACE([DX_FLAG_pdf]) +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_FLAG_pdf$]) +m4trace:configure.ac:22: -1- AC_SUBST([DX_FLAG_pdf], [DX_IF_FEATURE([pdf], 1, 0)]) +m4trace:configure.ac:22: -1- AC_SUBST_TRACE([DX_FLAG_pdf]) +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_FLAG_pdf$]) +m4trace:configure.ac:22: -1- AC_SUBST([DX_FLAG_pdf], [0]) +m4trace:configure.ac:22: -1- AC_SUBST_TRACE([DX_FLAG_pdf]) +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_FLAG_pdf$]) +m4trace:configure.ac:22: -1- AC_SUBST([DX_PDFLATEX]) +m4trace:configure.ac:22: -1- AC_SUBST_TRACE([DX_PDFLATEX]) +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_PDFLATEX$]) +m4trace:configure.ac:22: -1- AC_SUBST([DX_FLAG_pdf], [0]) +m4trace:configure.ac:22: -1- AC_SUBST_TRACE([DX_FLAG_pdf]) +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_FLAG_pdf$]) +m4trace:configure.ac:22: -1- AC_SUBST([DX_MAKEINDEX]) +m4trace:configure.ac:22: -1- AC_SUBST_TRACE([DX_MAKEINDEX]) +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_MAKEINDEX$]) +m4trace:configure.ac:22: -1- AC_SUBST([DX_FLAG_pdf], [0]) +m4trace:configure.ac:22: -1- AC_SUBST_TRACE([DX_FLAG_pdf]) +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_FLAG_pdf$]) +m4trace:configure.ac:22: -1- AC_SUBST([DX_EGREP]) +m4trace:configure.ac:22: -1- AC_SUBST_TRACE([DX_EGREP]) +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_EGREP$]) +m4trace:configure.ac:22: -1- AC_SUBST([DX_FLAG_pdf], [0]) +m4trace:configure.ac:22: -1- AC_SUBST_TRACE([DX_FLAG_pdf]) +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_FLAG_pdf$]) +m4trace:configure.ac:22: -1- AM_CONDITIONAL([DX_COND_pdf], [:]) +m4trace:configure.ac:22: -1- AC_SUBST([DX_COND_pdf_TRUE]) +m4trace:configure.ac:22: -1- AC_SUBST_TRACE([DX_COND_pdf_TRUE]) +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_COND_pdf_TRUE$]) +m4trace:configure.ac:22: -1- AC_SUBST([DX_COND_pdf_FALSE]) +m4trace:configure.ac:22: -1- AC_SUBST_TRACE([DX_COND_pdf_FALSE]) +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_COND_pdf_FALSE$]) +m4trace:configure.ac:22: -1- _AM_SUBST_NOTMAKE([DX_COND_pdf_TRUE]) +m4trace:configure.ac:22: -1- _AM_SUBST_NOTMAKE([DX_COND_pdf_FALSE]) +m4trace:configure.ac:22: -1- AM_CONDITIONAL([DX_COND_pdf], [false]) +m4trace:configure.ac:22: -1- AC_SUBST([DX_COND_pdf_TRUE]) +m4trace:configure.ac:22: -1- AC_SUBST_TRACE([DX_COND_pdf_TRUE]) +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_COND_pdf_TRUE$]) +m4trace:configure.ac:22: -1- AC_SUBST([DX_COND_pdf_FALSE]) +m4trace:configure.ac:22: -1- AC_SUBST_TRACE([DX_COND_pdf_FALSE]) +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_COND_pdf_FALSE$]) +m4trace:configure.ac:22: -1- _AM_SUBST_NOTMAKE([DX_COND_pdf_TRUE]) +m4trace:configure.ac:22: -1- _AM_SUBST_NOTMAKE([DX_COND_pdf_FALSE]) +m4trace:configure.ac:22: -1- AM_CONDITIONAL([DX_COND_latex], [:]) +m4trace:configure.ac:22: -1- AC_SUBST([DX_COND_latex_TRUE]) +m4trace:configure.ac:22: -1- AC_SUBST_TRACE([DX_COND_latex_TRUE]) +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_COND_latex_TRUE$]) +m4trace:configure.ac:22: -1- AC_SUBST([DX_COND_latex_FALSE]) +m4trace:configure.ac:22: -1- AC_SUBST_TRACE([DX_COND_latex_FALSE]) +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_COND_latex_FALSE$]) +m4trace:configure.ac:22: -1- _AM_SUBST_NOTMAKE([DX_COND_latex_TRUE]) +m4trace:configure.ac:22: -1- _AM_SUBST_NOTMAKE([DX_COND_latex_FALSE]) +m4trace:configure.ac:22: -1- AC_SUBST([DX_ENV], ["$DX_ENV GENERATE_LATEX='YES'"]) +m4trace:configure.ac:22: -1- AC_SUBST_TRACE([DX_ENV]) +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_ENV$]) +m4trace:configure.ac:22: -1- AM_CONDITIONAL([DX_COND_latex], [false]) +m4trace:configure.ac:22: -1- AC_SUBST([DX_COND_latex_TRUE]) +m4trace:configure.ac:22: -1- AC_SUBST_TRACE([DX_COND_latex_TRUE]) +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_COND_latex_TRUE$]) +m4trace:configure.ac:22: -1- AC_SUBST([DX_COND_latex_FALSE]) +m4trace:configure.ac:22: -1- AC_SUBST_TRACE([DX_COND_latex_FALSE]) +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_COND_latex_FALSE$]) +m4trace:configure.ac:22: -1- _AM_SUBST_NOTMAKE([DX_COND_latex_TRUE]) +m4trace:configure.ac:22: -1- _AM_SUBST_NOTMAKE([DX_COND_latex_FALSE]) +m4trace:configure.ac:22: -1- AC_SUBST([DX_ENV], ["$DX_ENV GENERATE_LATEX='NO'"]) +m4trace:configure.ac:22: -1- AC_SUBST_TRACE([DX_ENV]) +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_ENV$]) +m4trace:configure.ac:22: -1- AC_SUBST([DOXYGEN_PAPER_SIZE]) +m4trace:configure.ac:22: -1- AC_SUBST_TRACE([DOXYGEN_PAPER_SIZE]) +m4trace:configure.ac:22: -1- m4_pattern_allow([^DOXYGEN_PAPER_SIZE$]) +m4trace:configure.ac:22: -1- AC_SUBST([DOXYGEN_PAPER_SIZE], [""]) +m4trace:configure.ac:22: -1- AC_SUBST_TRACE([DOXYGEN_PAPER_SIZE]) +m4trace:configure.ac:22: -1- m4_pattern_allow([^DOXYGEN_PAPER_SIZE$]) +m4trace:configure.ac:22: -1- AC_SUBST([DX_ENV], ["$DX_ENV PAPER_SIZE='$DOXYGEN_PAPER_SIZE'"]) +m4trace:configure.ac:22: -1- AC_SUBST_TRACE([DX_ENV]) +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_ENV$]) +m4trace:configure.ac:25: -1- AM_INIT_AUTOMAKE([-Wall foreign]) +m4trace:configure.ac:25: -1- m4_pattern_allow([^AM_[A-Z]+FLAGS$]) +m4trace:configure.ac:25: -1- AM_AUTOMAKE_VERSION([1.11.6]) +m4trace:configure.ac:25: -1- AC_REQUIRE_AUX_FILE([install-sh]) +m4trace:configure.ac:25: -1- AC_SUBST([INSTALL_PROGRAM]) +m4trace:configure.ac:25: -1- AC_SUBST_TRACE([INSTALL_PROGRAM]) +m4trace:configure.ac:25: -1- m4_pattern_allow([^INSTALL_PROGRAM$]) +m4trace:configure.ac:25: -1- AC_SUBST([INSTALL_SCRIPT]) +m4trace:configure.ac:25: -1- AC_SUBST_TRACE([INSTALL_SCRIPT]) +m4trace:configure.ac:25: -1- m4_pattern_allow([^INSTALL_SCRIPT$]) +m4trace:configure.ac:25: -1- AC_SUBST([INSTALL_DATA]) +m4trace:configure.ac:25: -1- AC_SUBST_TRACE([INSTALL_DATA]) +m4trace:configure.ac:25: -1- m4_pattern_allow([^INSTALL_DATA$]) +m4trace:configure.ac:25: -1- AC_SUBST([am__isrc], [' -I$(srcdir)']) +m4trace:configure.ac:25: -1- AC_SUBST_TRACE([am__isrc]) +m4trace:configure.ac:25: -1- m4_pattern_allow([^am__isrc$]) +m4trace:configure.ac:25: -1- _AM_SUBST_NOTMAKE([am__isrc]) +m4trace:configure.ac:25: -1- AC_SUBST([CYGPATH_W]) +m4trace:configure.ac:25: -1- AC_SUBST_TRACE([CYGPATH_W]) +m4trace:configure.ac:25: -1- m4_pattern_allow([^CYGPATH_W$]) +m4trace:configure.ac:25: -1- AC_SUBST([PACKAGE], ['AC_PACKAGE_TARNAME']) +m4trace:configure.ac:25: -1- AC_SUBST_TRACE([PACKAGE]) +m4trace:configure.ac:25: -1- m4_pattern_allow([^PACKAGE$]) +m4trace:configure.ac:25: -1- AC_SUBST([VERSION], ['AC_PACKAGE_VERSION']) +m4trace:configure.ac:25: -1- AC_SUBST_TRACE([VERSION]) +m4trace:configure.ac:25: -1- m4_pattern_allow([^VERSION$]) +m4trace:configure.ac:25: -1- AC_DEFINE_TRACE_LITERAL([PACKAGE]) +m4trace:configure.ac:25: -1- m4_pattern_allow([^PACKAGE$]) +m4trace:configure.ac:25: -1- AH_OUTPUT([PACKAGE], [/* Name of package */ +@%:@undef PACKAGE]) +m4trace:configure.ac:25: -1- AC_DEFINE_TRACE_LITERAL([VERSION]) +m4trace:configure.ac:25: -1- m4_pattern_allow([^VERSION$]) +m4trace:configure.ac:25: -1- AH_OUTPUT([VERSION], [/* Version number of package */ +@%:@undef VERSION]) +m4trace:configure.ac:25: -1- AC_REQUIRE_AUX_FILE([missing]) +m4trace:configure.ac:25: -1- AC_SUBST([ACLOCAL]) +m4trace:configure.ac:25: -1- AC_SUBST_TRACE([ACLOCAL]) +m4trace:configure.ac:25: -1- m4_pattern_allow([^ACLOCAL$]) +m4trace:configure.ac:25: -1- AC_SUBST([AUTOCONF]) +m4trace:configure.ac:25: -1- AC_SUBST_TRACE([AUTOCONF]) +m4trace:configure.ac:25: -1- m4_pattern_allow([^AUTOCONF$]) +m4trace:configure.ac:25: -1- AC_SUBST([AUTOMAKE]) +m4trace:configure.ac:25: -1- AC_SUBST_TRACE([AUTOMAKE]) +m4trace:configure.ac:25: -1- m4_pattern_allow([^AUTOMAKE$]) +m4trace:configure.ac:25: -1- AC_SUBST([AUTOHEADER]) +m4trace:configure.ac:25: -1- AC_SUBST_TRACE([AUTOHEADER]) +m4trace:configure.ac:25: -1- m4_pattern_allow([^AUTOHEADER$]) +m4trace:configure.ac:25: -1- AC_SUBST([MAKEINFO]) +m4trace:configure.ac:25: -1- AC_SUBST_TRACE([MAKEINFO]) +m4trace:configure.ac:25: -1- m4_pattern_allow([^MAKEINFO$]) +m4trace:configure.ac:25: -1- AC_SUBST([install_sh]) +m4trace:configure.ac:25: -1- AC_SUBST_TRACE([install_sh]) +m4trace:configure.ac:25: -1- m4_pattern_allow([^install_sh$]) +m4trace:configure.ac:25: -1- AC_SUBST([STRIP]) +m4trace:configure.ac:25: -1- AC_SUBST_TRACE([STRIP]) +m4trace:configure.ac:25: -1- m4_pattern_allow([^STRIP$]) +m4trace:configure.ac:25: -1- AC_SUBST([INSTALL_STRIP_PROGRAM]) +m4trace:configure.ac:25: -1- AC_SUBST_TRACE([INSTALL_STRIP_PROGRAM]) +m4trace:configure.ac:25: -1- m4_pattern_allow([^INSTALL_STRIP_PROGRAM$]) +m4trace:configure.ac:25: -1- AC_REQUIRE_AUX_FILE([install-sh]) +m4trace:configure.ac:25: -1- AC_SUBST([MKDIR_P]) +m4trace:configure.ac:25: -1- AC_SUBST_TRACE([MKDIR_P]) +m4trace:configure.ac:25: -1- m4_pattern_allow([^MKDIR_P$]) +m4trace:configure.ac:25: -1- AC_SUBST([mkdir_p], ["$MKDIR_P"]) +m4trace:configure.ac:25: -1- AC_SUBST_TRACE([mkdir_p]) +m4trace:configure.ac:25: -1- m4_pattern_allow([^mkdir_p$]) +m4trace:configure.ac:25: -1- AC_SUBST([AWK]) +m4trace:configure.ac:25: -1- AC_SUBST_TRACE([AWK]) +m4trace:configure.ac:25: -1- m4_pattern_allow([^AWK$]) +m4trace:configure.ac:25: -1- AC_SUBST([SET_MAKE]) +m4trace:configure.ac:25: -1- AC_SUBST_TRACE([SET_MAKE]) +m4trace:configure.ac:25: -1- m4_pattern_allow([^SET_MAKE$]) +m4trace:configure.ac:25: -1- AC_SUBST([am__leading_dot]) +m4trace:configure.ac:25: -1- AC_SUBST_TRACE([am__leading_dot]) +m4trace:configure.ac:25: -1- m4_pattern_allow([^am__leading_dot$]) +m4trace:configure.ac:25: -1- AC_SUBST([AMTAR], ['$${TAR-tar}']) +m4trace:configure.ac:25: -1- AC_SUBST_TRACE([AMTAR]) +m4trace:configure.ac:25: -1- m4_pattern_allow([^AMTAR$]) +m4trace:configure.ac:25: -1- AC_SUBST([am__tar]) +m4trace:configure.ac:25: -1- AC_SUBST_TRACE([am__tar]) +m4trace:configure.ac:25: -1- m4_pattern_allow([^am__tar$]) +m4trace:configure.ac:25: -1- AC_SUBST([am__untar]) +m4trace:configure.ac:25: -1- AC_SUBST_TRACE([am__untar]) +m4trace:configure.ac:25: -1- m4_pattern_allow([^am__untar$]) +m4trace:configure.ac:26: -1- AC_CONFIG_HEADERS([config.h]) +m4trace:configure.ac:37: -1- AC_SUBST([CPPUNIT_CONFIG]) +m4trace:configure.ac:37: -1- AC_SUBST_TRACE([CPPUNIT_CONFIG]) +m4trace:configure.ac:37: -1- m4_pattern_allow([^CPPUNIT_CONFIG$]) +m4trace:configure.ac:37: -1- AC_SUBST([CPPUNIT_CFLAGS]) +m4trace:configure.ac:37: -1- AC_SUBST_TRACE([CPPUNIT_CFLAGS]) +m4trace:configure.ac:37: -1- m4_pattern_allow([^CPPUNIT_CFLAGS$]) +m4trace:configure.ac:37: -1- AC_SUBST([CPPUNIT_LIBS]) +m4trace:configure.ac:37: -1- AC_SUBST_TRACE([CPPUNIT_LIBS]) +m4trace:configure.ac:37: -1- m4_pattern_allow([^CPPUNIT_LIBS$]) +m4trace:configure.ac:44: -1- _m4_warn([cross], [cannot check for file existence when cross compiling], [../../lib/autoconf/general.m4:2777: AC_CHECK_FILE is expanded from... +../../lib/autoconf/general.m4:2808: AC_CHECK_FILES is expanded from... +configure.ac:44: the top level]) +m4trace:configure.ac:44: -1- AC_DEFINE_TRACE_LITERAL([HAVE_GENERATED_ZOOKEEPER_JUTE_C]) +m4trace:configure.ac:44: -1- m4_pattern_allow([^HAVE_GENERATED_ZOOKEEPER_JUTE_C$]) +m4trace:configure.ac:44: -1- AH_OUTPUT([HAVE_GENERATED_ZOOKEEPER_JUTE_C], [/* Define to 1 if you have the file `generated/zookeeper.jute.c\'. */ +@%:@undef HAVE_GENERATED_ZOOKEEPER_JUTE_C]) +m4trace:configure.ac:44: -1- _m4_warn([cross], [cannot check for file existence when cross compiling], [../../lib/autoconf/general.m4:2777: AC_CHECK_FILE is expanded from... +../../lib/autoconf/general.m4:2808: AC_CHECK_FILES is expanded from... +configure.ac:44: the top level]) +m4trace:configure.ac:44: -1- AC_DEFINE_TRACE_LITERAL([HAVE_GENERATED_ZOOKEEPER_JUTE_H]) +m4trace:configure.ac:44: -1- m4_pattern_allow([^HAVE_GENERATED_ZOOKEEPER_JUTE_H$]) +m4trace:configure.ac:44: -1- AH_OUTPUT([HAVE_GENERATED_ZOOKEEPER_JUTE_H], [/* Define to 1 if you have the file `generated/zookeeper.jute.h\'. */ +@%:@undef HAVE_GENERATED_ZOOKEEPER_JUTE_H]) +m4trace:configure.ac:48: -1- AC_SUBST([CPPUNIT_CFLAGS]) +m4trace:configure.ac:48: -1- AC_SUBST_TRACE([CPPUNIT_CFLAGS]) +m4trace:configure.ac:48: -1- m4_pattern_allow([^CPPUNIT_CFLAGS$]) +m4trace:configure.ac:50: -1- AC_SUBST([CC]) +m4trace:configure.ac:50: -1- AC_SUBST_TRACE([CC]) +m4trace:configure.ac:50: -1- m4_pattern_allow([^CC$]) +m4trace:configure.ac:50: -1- AC_SUBST([CFLAGS]) +m4trace:configure.ac:50: -1- AC_SUBST_TRACE([CFLAGS]) +m4trace:configure.ac:50: -1- m4_pattern_allow([^CFLAGS$]) +m4trace:configure.ac:50: -1- AC_SUBST([LDFLAGS]) +m4trace:configure.ac:50: -1- AC_SUBST_TRACE([LDFLAGS]) +m4trace:configure.ac:50: -1- m4_pattern_allow([^LDFLAGS$]) +m4trace:configure.ac:50: -1- AC_SUBST([LIBS]) +m4trace:configure.ac:50: -1- AC_SUBST_TRACE([LIBS]) +m4trace:configure.ac:50: -1- m4_pattern_allow([^LIBS$]) +m4trace:configure.ac:50: -1- AC_SUBST([CPPFLAGS]) +m4trace:configure.ac:50: -1- AC_SUBST_TRACE([CPPFLAGS]) +m4trace:configure.ac:50: -1- m4_pattern_allow([^CPPFLAGS$]) +m4trace:configure.ac:50: -1- AC_SUBST([CC]) +m4trace:configure.ac:50: -1- AC_SUBST_TRACE([CC]) +m4trace:configure.ac:50: -1- m4_pattern_allow([^CC$]) +m4trace:configure.ac:50: -1- AC_SUBST([CC]) +m4trace:configure.ac:50: -1- AC_SUBST_TRACE([CC]) +m4trace:configure.ac:50: -1- m4_pattern_allow([^CC$]) +m4trace:configure.ac:50: -1- AC_SUBST([CC]) +m4trace:configure.ac:50: -1- AC_SUBST_TRACE([CC]) +m4trace:configure.ac:50: -1- m4_pattern_allow([^CC$]) +m4trace:configure.ac:50: -1- AC_SUBST([CC]) +m4trace:configure.ac:50: -1- AC_SUBST_TRACE([CC]) +m4trace:configure.ac:50: -1- m4_pattern_allow([^CC$]) +m4trace:configure.ac:50: -1- AC_SUBST([ac_ct_CC]) +m4trace:configure.ac:50: -1- AC_SUBST_TRACE([ac_ct_CC]) +m4trace:configure.ac:50: -1- m4_pattern_allow([^ac_ct_CC$]) +m4trace:configure.ac:50: -1- AC_SUBST([EXEEXT], [$ac_cv_exeext]) +m4trace:configure.ac:50: -1- AC_SUBST_TRACE([EXEEXT]) +m4trace:configure.ac:50: -1- m4_pattern_allow([^EXEEXT$]) +m4trace:configure.ac:50: -1- AC_SUBST([OBJEXT], [$ac_cv_objext]) +m4trace:configure.ac:50: -1- AC_SUBST_TRACE([OBJEXT]) +m4trace:configure.ac:50: -1- m4_pattern_allow([^OBJEXT$]) +m4trace:configure.ac:50: -1- AC_SUBST([DEPDIR], ["${am__leading_dot}deps"]) +m4trace:configure.ac:50: -1- AC_SUBST_TRACE([DEPDIR]) +m4trace:configure.ac:50: -1- m4_pattern_allow([^DEPDIR$]) +m4trace:configure.ac:50: -1- AC_SUBST([am__include]) +m4trace:configure.ac:50: -1- AC_SUBST_TRACE([am__include]) +m4trace:configure.ac:50: -1- m4_pattern_allow([^am__include$]) +m4trace:configure.ac:50: -1- AC_SUBST([am__quote]) +m4trace:configure.ac:50: -1- AC_SUBST_TRACE([am__quote]) +m4trace:configure.ac:50: -1- m4_pattern_allow([^am__quote$]) +m4trace:configure.ac:50: -1- AM_CONDITIONAL([AMDEP], [test "x$enable_dependency_tracking" != xno]) +m4trace:configure.ac:50: -1- AC_SUBST([AMDEP_TRUE]) +m4trace:configure.ac:50: -1- AC_SUBST_TRACE([AMDEP_TRUE]) +m4trace:configure.ac:50: -1- m4_pattern_allow([^AMDEP_TRUE$]) +m4trace:configure.ac:50: -1- AC_SUBST([AMDEP_FALSE]) +m4trace:configure.ac:50: -1- AC_SUBST_TRACE([AMDEP_FALSE]) +m4trace:configure.ac:50: -1- m4_pattern_allow([^AMDEP_FALSE$]) +m4trace:configure.ac:50: -1- _AM_SUBST_NOTMAKE([AMDEP_TRUE]) +m4trace:configure.ac:50: -1- _AM_SUBST_NOTMAKE([AMDEP_FALSE]) +m4trace:configure.ac:50: -1- AC_SUBST([AMDEPBACKSLASH]) +m4trace:configure.ac:50: -1- AC_SUBST_TRACE([AMDEPBACKSLASH]) +m4trace:configure.ac:50: -1- m4_pattern_allow([^AMDEPBACKSLASH$]) +m4trace:configure.ac:50: -1- _AM_SUBST_NOTMAKE([AMDEPBACKSLASH]) +m4trace:configure.ac:50: -1- AC_SUBST([am__nodep]) +m4trace:configure.ac:50: -1- AC_SUBST_TRACE([am__nodep]) +m4trace:configure.ac:50: -1- m4_pattern_allow([^am__nodep$]) +m4trace:configure.ac:50: -1- _AM_SUBST_NOTMAKE([am__nodep]) +m4trace:configure.ac:50: -1- AC_SUBST([CCDEPMODE], [depmode=$am_cv_CC_dependencies_compiler_type]) +m4trace:configure.ac:50: -1- AC_SUBST_TRACE([CCDEPMODE]) +m4trace:configure.ac:50: -1- m4_pattern_allow([^CCDEPMODE$]) +m4trace:configure.ac:50: -1- AM_CONDITIONAL([am__fastdepCC], [ + test "x$enable_dependency_tracking" != xno \ + && test "$am_cv_CC_dependencies_compiler_type" = gcc3]) +m4trace:configure.ac:50: -1- AC_SUBST([am__fastdepCC_TRUE]) +m4trace:configure.ac:50: -1- AC_SUBST_TRACE([am__fastdepCC_TRUE]) +m4trace:configure.ac:50: -1- m4_pattern_allow([^am__fastdepCC_TRUE$]) +m4trace:configure.ac:50: -1- AC_SUBST([am__fastdepCC_FALSE]) +m4trace:configure.ac:50: -1- AC_SUBST_TRACE([am__fastdepCC_FALSE]) +m4trace:configure.ac:50: -1- m4_pattern_allow([^am__fastdepCC_FALSE$]) +m4trace:configure.ac:50: -1- _AM_SUBST_NOTMAKE([am__fastdepCC_TRUE]) +m4trace:configure.ac:50: -1- _AM_SUBST_NOTMAKE([am__fastdepCC_FALSE]) +m4trace:configure.ac:51: -1- AM_PROG_CC_C_O +m4trace:configure.ac:51: -1- AC_DEFINE_TRACE_LITERAL([NO_MINUS_C_MINUS_O]) +m4trace:configure.ac:51: -1- m4_pattern_allow([^NO_MINUS_C_MINUS_O$]) +m4trace:configure.ac:51: -1- AH_OUTPUT([NO_MINUS_C_MINUS_O], [/* Define to 1 if your C compiler doesn\'t accept -c and -o together. */ +@%:@undef NO_MINUS_C_MINUS_O]) +m4trace:configure.ac:51: -1- AC_REQUIRE_AUX_FILE([compile]) +m4trace:configure.ac:52: -1- AC_SUBST([CXX]) +m4trace:configure.ac:52: -1- AC_SUBST_TRACE([CXX]) +m4trace:configure.ac:52: -1- m4_pattern_allow([^CXX$]) +m4trace:configure.ac:52: -1- AC_SUBST([CXXFLAGS]) +m4trace:configure.ac:52: -1- AC_SUBST_TRACE([CXXFLAGS]) +m4trace:configure.ac:52: -1- m4_pattern_allow([^CXXFLAGS$]) +m4trace:configure.ac:52: -1- AC_SUBST([LDFLAGS]) +m4trace:configure.ac:52: -1- AC_SUBST_TRACE([LDFLAGS]) +m4trace:configure.ac:52: -1- m4_pattern_allow([^LDFLAGS$]) +m4trace:configure.ac:52: -1- AC_SUBST([LIBS]) +m4trace:configure.ac:52: -1- AC_SUBST_TRACE([LIBS]) +m4trace:configure.ac:52: -1- m4_pattern_allow([^LIBS$]) +m4trace:configure.ac:52: -1- AC_SUBST([CPPFLAGS]) +m4trace:configure.ac:52: -1- AC_SUBST_TRACE([CPPFLAGS]) +m4trace:configure.ac:52: -1- m4_pattern_allow([^CPPFLAGS$]) +m4trace:configure.ac:52: -1- AC_SUBST([CXX]) +m4trace:configure.ac:52: -1- AC_SUBST_TRACE([CXX]) +m4trace:configure.ac:52: -1- m4_pattern_allow([^CXX$]) +m4trace:configure.ac:52: -1- AC_SUBST([ac_ct_CXX]) +m4trace:configure.ac:52: -1- AC_SUBST_TRACE([ac_ct_CXX]) +m4trace:configure.ac:52: -1- m4_pattern_allow([^ac_ct_CXX$]) +m4trace:configure.ac:52: -1- AC_SUBST([CXXDEPMODE], [depmode=$am_cv_CXX_dependencies_compiler_type]) +m4trace:configure.ac:52: -1- AC_SUBST_TRACE([CXXDEPMODE]) +m4trace:configure.ac:52: -1- m4_pattern_allow([^CXXDEPMODE$]) +m4trace:configure.ac:52: -1- AM_CONDITIONAL([am__fastdepCXX], [ + test "x$enable_dependency_tracking" != xno \ + && test "$am_cv_CXX_dependencies_compiler_type" = gcc3]) +m4trace:configure.ac:52: -1- AC_SUBST([am__fastdepCXX_TRUE]) +m4trace:configure.ac:52: -1- AC_SUBST_TRACE([am__fastdepCXX_TRUE]) +m4trace:configure.ac:52: -1- m4_pattern_allow([^am__fastdepCXX_TRUE$]) +m4trace:configure.ac:52: -1- AC_SUBST([am__fastdepCXX_FALSE]) +m4trace:configure.ac:52: -1- AC_SUBST_TRACE([am__fastdepCXX_FALSE]) +m4trace:configure.ac:52: -1- m4_pattern_allow([^am__fastdepCXX_FALSE$]) +m4trace:configure.ac:52: -1- _AM_SUBST_NOTMAKE([am__fastdepCXX_TRUE]) +m4trace:configure.ac:52: -1- _AM_SUBST_NOTMAKE([am__fastdepCXX_FALSE]) +m4trace:configure.ac:54: -1- AC_SUBST([LN_S], [$as_ln_s]) +m4trace:configure.ac:54: -1- AC_SUBST_TRACE([LN_S]) +m4trace:configure.ac:54: -1- m4_pattern_allow([^LN_S$]) +m4trace:configure.ac:57: -1- AC_PROG_LIBTOOL +m4trace:configure.ac:57: -1- _m4_warn([obsolete], [The macro `AC_PROG_LIBTOOL' is obsolete. +You should run autoupdate.], [aclocal.m4:222: AC_PROG_LIBTOOL is expanded from... +configure.ac:57: the top level]) +m4trace:configure.ac:57: -1- LT_INIT +m4trace:configure.ac:57: -1- m4_pattern_forbid([^_?LT_[A-Z_]+$]) +m4trace:configure.ac:57: -1- m4_pattern_allow([^(_LT_EOF|LT_DLGLOBAL|LT_DLLAZY_OR_NOW|LT_MULTI_MODULE)$]) +m4trace:configure.ac:57: -1- AC_REQUIRE_AUX_FILE([ltmain.sh]) +m4trace:configure.ac:57: -1- AC_SUBST([LIBTOOL]) +m4trace:configure.ac:57: -1- AC_SUBST_TRACE([LIBTOOL]) +m4trace:configure.ac:57: -1- m4_pattern_allow([^LIBTOOL$]) +m4trace:configure.ac:57: -1- AC_CANONICAL_HOST +m4trace:configure.ac:57: -1- AC_CANONICAL_BUILD +m4trace:configure.ac:57: -1- AC_REQUIRE_AUX_FILE([config.sub]) +m4trace:configure.ac:57: -1- AC_REQUIRE_AUX_FILE([config.guess]) +m4trace:configure.ac:57: -1- AC_SUBST([build], [$ac_cv_build]) +m4trace:configure.ac:57: -1- AC_SUBST_TRACE([build]) +m4trace:configure.ac:57: -1- m4_pattern_allow([^build$]) +m4trace:configure.ac:57: -1- AC_SUBST([build_cpu], [$[1]]) +m4trace:configure.ac:57: -1- AC_SUBST_TRACE([build_cpu]) +m4trace:configure.ac:57: -1- m4_pattern_allow([^build_cpu$]) +m4trace:configure.ac:57: -1- AC_SUBST([build_vendor], [$[2]]) +m4trace:configure.ac:57: -1- AC_SUBST_TRACE([build_vendor]) +m4trace:configure.ac:57: -1- m4_pattern_allow([^build_vendor$]) +m4trace:configure.ac:57: -1- AC_SUBST([build_os]) +m4trace:configure.ac:57: -1- AC_SUBST_TRACE([build_os]) +m4trace:configure.ac:57: -1- m4_pattern_allow([^build_os$]) +m4trace:configure.ac:57: -1- AC_SUBST([host], [$ac_cv_host]) +m4trace:configure.ac:57: -1- AC_SUBST_TRACE([host]) +m4trace:configure.ac:57: -1- m4_pattern_allow([^host$]) +m4trace:configure.ac:57: -1- AC_SUBST([host_cpu], [$[1]]) +m4trace:configure.ac:57: -1- AC_SUBST_TRACE([host_cpu]) +m4trace:configure.ac:57: -1- m4_pattern_allow([^host_cpu$]) +m4trace:configure.ac:57: -1- AC_SUBST([host_vendor], [$[2]]) +m4trace:configure.ac:57: -1- AC_SUBST_TRACE([host_vendor]) +m4trace:configure.ac:57: -1- m4_pattern_allow([^host_vendor$]) +m4trace:configure.ac:57: -1- AC_SUBST([host_os]) +m4trace:configure.ac:57: -1- AC_SUBST_TRACE([host_os]) +m4trace:configure.ac:57: -1- m4_pattern_allow([^host_os$]) +m4trace:configure.ac:57: -1- AC_SUBST([SED]) +m4trace:configure.ac:57: -1- AC_SUBST_TRACE([SED]) +m4trace:configure.ac:57: -1- m4_pattern_allow([^SED$]) +m4trace:configure.ac:57: -1- AC_SUBST([GREP]) +m4trace:configure.ac:57: -1- AC_SUBST_TRACE([GREP]) +m4trace:configure.ac:57: -1- m4_pattern_allow([^GREP$]) +m4trace:configure.ac:57: -1- AC_SUBST([EGREP]) +m4trace:configure.ac:57: -1- AC_SUBST_TRACE([EGREP]) +m4trace:configure.ac:57: -1- m4_pattern_allow([^EGREP$]) +m4trace:configure.ac:57: -1- AC_SUBST([FGREP]) +m4trace:configure.ac:57: -1- AC_SUBST_TRACE([FGREP]) +m4trace:configure.ac:57: -1- m4_pattern_allow([^FGREP$]) +m4trace:configure.ac:57: -1- AC_SUBST([GREP]) +m4trace:configure.ac:57: -1- AC_SUBST_TRACE([GREP]) +m4trace:configure.ac:57: -1- m4_pattern_allow([^GREP$]) +m4trace:configure.ac:57: -1- AC_SUBST([LD]) +m4trace:configure.ac:57: -1- AC_SUBST_TRACE([LD]) +m4trace:configure.ac:57: -1- m4_pattern_allow([^LD$]) +m4trace:configure.ac:57: -1- AC_SUBST([DUMPBIN]) +m4trace:configure.ac:57: -1- AC_SUBST_TRACE([DUMPBIN]) +m4trace:configure.ac:57: -1- m4_pattern_allow([^DUMPBIN$]) +m4trace:configure.ac:57: -1- AC_SUBST([ac_ct_DUMPBIN]) +m4trace:configure.ac:57: -1- AC_SUBST_TRACE([ac_ct_DUMPBIN]) +m4trace:configure.ac:57: -1- m4_pattern_allow([^ac_ct_DUMPBIN$]) +m4trace:configure.ac:57: -1- AC_SUBST([DUMPBIN]) +m4trace:configure.ac:57: -1- AC_SUBST_TRACE([DUMPBIN]) +m4trace:configure.ac:57: -1- m4_pattern_allow([^DUMPBIN$]) +m4trace:configure.ac:57: -1- AC_SUBST([NM]) +m4trace:configure.ac:57: -1- AC_SUBST_TRACE([NM]) +m4trace:configure.ac:57: -1- m4_pattern_allow([^NM$]) +m4trace:configure.ac:57: -1- AC_SUBST([OBJDUMP]) +m4trace:configure.ac:57: -1- AC_SUBST_TRACE([OBJDUMP]) +m4trace:configure.ac:57: -1- m4_pattern_allow([^OBJDUMP$]) +m4trace:configure.ac:57: -1- AC_SUBST([OBJDUMP]) +m4trace:configure.ac:57: -1- AC_SUBST_TRACE([OBJDUMP]) +m4trace:configure.ac:57: -1- m4_pattern_allow([^OBJDUMP$]) +m4trace:configure.ac:57: -1- AC_SUBST([DLLTOOL]) +m4trace:configure.ac:57: -1- AC_SUBST_TRACE([DLLTOOL]) +m4trace:configure.ac:57: -1- m4_pattern_allow([^DLLTOOL$]) +m4trace:configure.ac:57: -1- AC_SUBST([DLLTOOL]) +m4trace:configure.ac:57: -1- AC_SUBST_TRACE([DLLTOOL]) +m4trace:configure.ac:57: -1- m4_pattern_allow([^DLLTOOL$]) +m4trace:configure.ac:57: -1- AC_SUBST([AR]) +m4trace:configure.ac:57: -1- AC_SUBST_TRACE([AR]) +m4trace:configure.ac:57: -1- m4_pattern_allow([^AR$]) +m4trace:configure.ac:57: -1- AC_SUBST([ac_ct_AR]) +m4trace:configure.ac:57: -1- AC_SUBST_TRACE([ac_ct_AR]) +m4trace:configure.ac:57: -1- m4_pattern_allow([^ac_ct_AR$]) +m4trace:configure.ac:57: -1- AC_SUBST([STRIP]) +m4trace:configure.ac:57: -1- AC_SUBST_TRACE([STRIP]) +m4trace:configure.ac:57: -1- m4_pattern_allow([^STRIP$]) +m4trace:configure.ac:57: -1- AC_SUBST([RANLIB]) +m4trace:configure.ac:57: -1- AC_SUBST_TRACE([RANLIB]) +m4trace:configure.ac:57: -1- m4_pattern_allow([^RANLIB$]) +m4trace:configure.ac:57: -1- m4_pattern_allow([LT_OBJDIR]) +m4trace:configure.ac:57: -1- AC_DEFINE_TRACE_LITERAL([LT_OBJDIR]) +m4trace:configure.ac:57: -1- m4_pattern_allow([^LT_OBJDIR$]) +m4trace:configure.ac:57: -1- AH_OUTPUT([LT_OBJDIR], [/* Define to the sub-directory in which libtool stores uninstalled libraries. + */ +@%:@undef LT_OBJDIR]) +m4trace:configure.ac:57: -1- LT_SUPPORTED_TAG([CC]) +m4trace:configure.ac:57: -1- AC_SUBST([MANIFEST_TOOL]) +m4trace:configure.ac:57: -1- AC_SUBST_TRACE([MANIFEST_TOOL]) +m4trace:configure.ac:57: -1- m4_pattern_allow([^MANIFEST_TOOL$]) +m4trace:configure.ac:57: -1- AC_SUBST([DSYMUTIL]) +m4trace:configure.ac:57: -1- AC_SUBST_TRACE([DSYMUTIL]) +m4trace:configure.ac:57: -1- m4_pattern_allow([^DSYMUTIL$]) +m4trace:configure.ac:57: -1- AC_SUBST([NMEDIT]) +m4trace:configure.ac:57: -1- AC_SUBST_TRACE([NMEDIT]) +m4trace:configure.ac:57: -1- m4_pattern_allow([^NMEDIT$]) +m4trace:configure.ac:57: -1- AC_SUBST([LIPO]) +m4trace:configure.ac:57: -1- AC_SUBST_TRACE([LIPO]) +m4trace:configure.ac:57: -1- m4_pattern_allow([^LIPO$]) +m4trace:configure.ac:57: -1- AC_SUBST([OTOOL]) +m4trace:configure.ac:57: -1- AC_SUBST_TRACE([OTOOL]) +m4trace:configure.ac:57: -1- m4_pattern_allow([^OTOOL$]) +m4trace:configure.ac:57: -1- AC_SUBST([OTOOL64]) +m4trace:configure.ac:57: -1- AC_SUBST_TRACE([OTOOL64]) +m4trace:configure.ac:57: -1- m4_pattern_allow([^OTOOL64$]) +m4trace:configure.ac:57: -1- AH_OUTPUT([HAVE_DLFCN_H], [/* Define to 1 if you have the header file. */ +@%:@undef HAVE_DLFCN_H]) +m4trace:configure.ac:57: -1- AC_SUBST([CPP]) +m4trace:configure.ac:57: -1- AC_SUBST_TRACE([CPP]) +m4trace:configure.ac:57: -1- m4_pattern_allow([^CPP$]) +m4trace:configure.ac:57: -1- AC_SUBST([CPPFLAGS]) +m4trace:configure.ac:57: -1- AC_SUBST_TRACE([CPPFLAGS]) +m4trace:configure.ac:57: -1- m4_pattern_allow([^CPPFLAGS$]) +m4trace:configure.ac:57: -1- AC_SUBST([CPP]) +m4trace:configure.ac:57: -1- AC_SUBST_TRACE([CPP]) +m4trace:configure.ac:57: -1- m4_pattern_allow([^CPP$]) +m4trace:configure.ac:57: -1- AC_DEFINE_TRACE_LITERAL([STDC_HEADERS]) +m4trace:configure.ac:57: -1- m4_pattern_allow([^STDC_HEADERS$]) +m4trace:configure.ac:57: -1- AH_OUTPUT([STDC_HEADERS], [/* Define to 1 if you have the ANSI C header files. */ +@%:@undef STDC_HEADERS]) +m4trace:configure.ac:57: -1- AH_OUTPUT([HAVE_SYS_TYPES_H], [/* Define to 1 if you have the header file. */ +@%:@undef HAVE_SYS_TYPES_H]) +m4trace:configure.ac:57: -1- AH_OUTPUT([HAVE_SYS_STAT_H], [/* Define to 1 if you have the header file. */ +@%:@undef HAVE_SYS_STAT_H]) +m4trace:configure.ac:57: -1- AH_OUTPUT([HAVE_STDLIB_H], [/* Define to 1 if you have the header file. */ +@%:@undef HAVE_STDLIB_H]) +m4trace:configure.ac:57: -1- AH_OUTPUT([HAVE_STRING_H], [/* Define to 1 if you have the header file. */ +@%:@undef HAVE_STRING_H]) +m4trace:configure.ac:57: -1- AH_OUTPUT([HAVE_MEMORY_H], [/* Define to 1 if you have the header file. */ +@%:@undef HAVE_MEMORY_H]) +m4trace:configure.ac:57: -1- AH_OUTPUT([HAVE_STRINGS_H], [/* Define to 1 if you have the header file. */ +@%:@undef HAVE_STRINGS_H]) +m4trace:configure.ac:57: -1- AH_OUTPUT([HAVE_INTTYPES_H], [/* Define to 1 if you have the header file. */ +@%:@undef HAVE_INTTYPES_H]) +m4trace:configure.ac:57: -1- AH_OUTPUT([HAVE_STDINT_H], [/* Define to 1 if you have the header file. */ +@%:@undef HAVE_STDINT_H]) +m4trace:configure.ac:57: -1- AH_OUTPUT([HAVE_UNISTD_H], [/* Define to 1 if you have the header file. */ +@%:@undef HAVE_UNISTD_H]) +m4trace:configure.ac:57: -1- AC_DEFINE_TRACE_LITERAL([HAVE_DLFCN_H]) +m4trace:configure.ac:57: -1- m4_pattern_allow([^HAVE_DLFCN_H$]) +m4trace:configure.ac:57: -1- LT_SUPPORTED_TAG([CXX]) +m4trace:configure.ac:57: -1- AC_SUBST([CXXCPP]) +m4trace:configure.ac:57: -1- AC_SUBST_TRACE([CXXCPP]) +m4trace:configure.ac:57: -1- m4_pattern_allow([^CXXCPP$]) +m4trace:configure.ac:57: -1- AC_SUBST([CPPFLAGS]) +m4trace:configure.ac:57: -1- AC_SUBST_TRACE([CPPFLAGS]) +m4trace:configure.ac:57: -1- m4_pattern_allow([^CPPFLAGS$]) +m4trace:configure.ac:57: -1- AC_SUBST([CXXCPP]) +m4trace:configure.ac:57: -1- AC_SUBST_TRACE([CXXCPP]) +m4trace:configure.ac:57: -1- m4_pattern_allow([^CXXCPP$]) +m4trace:configure.ac:57: -1- AC_SUBST([LD]) +m4trace:configure.ac:57: -1- AC_SUBST_TRACE([LD]) +m4trace:configure.ac:57: -1- m4_pattern_allow([^LD$]) +m4trace:configure.ac:106: -1- AM_CONDITIONAL([WANT_SYNCAPI], [test "x$with_syncapi" != xno]) +m4trace:configure.ac:106: -1- AC_SUBST([WANT_SYNCAPI_TRUE]) +m4trace:configure.ac:106: -1- AC_SUBST_TRACE([WANT_SYNCAPI_TRUE]) +m4trace:configure.ac:106: -1- m4_pattern_allow([^WANT_SYNCAPI_TRUE$]) +m4trace:configure.ac:106: -1- AC_SUBST([WANT_SYNCAPI_FALSE]) +m4trace:configure.ac:106: -1- AC_SUBST_TRACE([WANT_SYNCAPI_FALSE]) +m4trace:configure.ac:106: -1- m4_pattern_allow([^WANT_SYNCAPI_FALSE$]) +m4trace:configure.ac:106: -1- _AM_SUBST_NOTMAKE([WANT_SYNCAPI_TRUE]) +m4trace:configure.ac:106: -1- _AM_SUBST_NOTMAKE([WANT_SYNCAPI_FALSE]) +m4trace:configure.ac:109: -1- AC_DEFINE_TRACE_LITERAL([STDC_HEADERS]) +m4trace:configure.ac:109: -1- m4_pattern_allow([^STDC_HEADERS$]) +m4trace:configure.ac:109: -1- AH_OUTPUT([STDC_HEADERS], [/* Define to 1 if you have the ANSI C header files. */ +@%:@undef STDC_HEADERS]) +m4trace:configure.ac:110: -1- AH_OUTPUT([HAVE_ARPA_INET_H], [/* Define to 1 if you have the header file. */ +@%:@undef HAVE_ARPA_INET_H]) +m4trace:configure.ac:110: -1- AH_OUTPUT([HAVE_FCNTL_H], [/* Define to 1 if you have the header file. */ +@%:@undef HAVE_FCNTL_H]) +m4trace:configure.ac:110: -1- AH_OUTPUT([HAVE_NETDB_H], [/* Define to 1 if you have the header file. */ +@%:@undef HAVE_NETDB_H]) +m4trace:configure.ac:110: -1- AH_OUTPUT([HAVE_NETINET_IN_H], [/* Define to 1 if you have the header file. */ +@%:@undef HAVE_NETINET_IN_H]) +m4trace:configure.ac:110: -1- AH_OUTPUT([HAVE_STDLIB_H], [/* Define to 1 if you have the header file. */ +@%:@undef HAVE_STDLIB_H]) +m4trace:configure.ac:110: -1- AH_OUTPUT([HAVE_STRING_H], [/* Define to 1 if you have the header file. */ +@%:@undef HAVE_STRING_H]) +m4trace:configure.ac:110: -1- AH_OUTPUT([HAVE_SYS_SOCKET_H], [/* Define to 1 if you have the header file. */ +@%:@undef HAVE_SYS_SOCKET_H]) +m4trace:configure.ac:110: -1- AH_OUTPUT([HAVE_SYS_TIME_H], [/* Define to 1 if you have the header file. */ +@%:@undef HAVE_SYS_TIME_H]) +m4trace:configure.ac:110: -1- AH_OUTPUT([HAVE_UNISTD_H], [/* Define to 1 if you have the header file. */ +@%:@undef HAVE_UNISTD_H]) +m4trace:configure.ac:110: -1- AH_OUTPUT([HAVE_SYS_UTSNAME_H], [/* Define to 1 if you have the header file. */ +@%:@undef HAVE_SYS_UTSNAME_H]) +m4trace:configure.ac:113: -1- AC_DEFINE_TRACE_LITERAL([const]) +m4trace:configure.ac:113: -1- m4_pattern_allow([^const$]) +m4trace:configure.ac:113: -1- AH_OUTPUT([const], [/* Define to empty if `const\' does not conform to ANSI C. */ +@%:@undef const]) +m4trace:configure.ac:114: -1- AH_OUTPUT([inline], [/* Define to `__inline__\' or `__inline\' if that\'s what the C compiler + calls it, or to nothing if \'inline\' is not supported under any name. */ +#ifndef __cplusplus +#undef inline +#endif]) +m4trace:configure.ac:115: -1- AC_DEFINE_TRACE_LITERAL([TIME_WITH_SYS_TIME]) +m4trace:configure.ac:115: -1- m4_pattern_allow([^TIME_WITH_SYS_TIME$]) +m4trace:configure.ac:115: -1- AH_OUTPUT([TIME_WITH_SYS_TIME], [/* Define to 1 if you can safely include both and . */ +@%:@undef TIME_WITH_SYS_TIME]) +m4trace:configure.ac:116: -1- AC_DEFINE_TRACE_LITERAL([POLL_NFDS_TYPE]) +m4trace:configure.ac:116: -1- m4_pattern_allow([^POLL_NFDS_TYPE$]) +m4trace:configure.ac:116: -1- AH_OUTPUT([POLL_NFDS_TYPE], [/* poll() second argument type */ +@%:@undef POLL_NFDS_TYPE]) +m4trace:configure.ac:116: -1- AC_DEFINE_TRACE_LITERAL([POLL_NFDS_TYPE]) +m4trace:configure.ac:116: -1- m4_pattern_allow([^POLL_NFDS_TYPE$]) +m4trace:configure.ac:116: -1- AH_OUTPUT([POLL_NFDS_TYPE], [/* poll() second argument type */ +@%:@undef POLL_NFDS_TYPE]) +m4trace:configure.ac:123: -1- _m4_warn([obsolete], [The macro `AC_TRY_RUN' is obsolete. +You should run autoupdate.], [../../lib/autoconf/general.m4:2764: AC_TRY_RUN is expanded from... +configure.ac:123: the top level]) +m4trace:configure.ac:142: -1- AC_SUBST([USEIPV6]) +m4trace:configure.ac:142: -1- AC_SUBST_TRACE([USEIPV6]) +m4trace:configure.ac:142: -1- m4_pattern_allow([^USEIPV6$]) +m4trace:configure.ac:146: -1- AH_OUTPUT([HAVE_GETCWD], [/* Define to 1 if you have the `getcwd\' function. */ +@%:@undef HAVE_GETCWD]) +m4trace:configure.ac:146: -1- AH_OUTPUT([HAVE_GETHOSTBYNAME], [/* Define to 1 if you have the `gethostbyname\' function. */ +@%:@undef HAVE_GETHOSTBYNAME]) +m4trace:configure.ac:146: -1- AH_OUTPUT([HAVE_GETHOSTNAME], [/* Define to 1 if you have the `gethostname\' function. */ +@%:@undef HAVE_GETHOSTNAME]) +m4trace:configure.ac:146: -1- AH_OUTPUT([HAVE_GETLOGIN], [/* Define to 1 if you have the `getlogin\' function. */ +@%:@undef HAVE_GETLOGIN]) +m4trace:configure.ac:146: -1- AH_OUTPUT([HAVE_GETPWUID_R], [/* Define to 1 if you have the `getpwuid_r\' function. */ +@%:@undef HAVE_GETPWUID_R]) +m4trace:configure.ac:146: -1- AH_OUTPUT([HAVE_GETTIMEOFDAY], [/* Define to 1 if you have the `gettimeofday\' function. */ +@%:@undef HAVE_GETTIMEOFDAY]) +m4trace:configure.ac:146: -1- AH_OUTPUT([HAVE_GETUID], [/* Define to 1 if you have the `getuid\' function. */ +@%:@undef HAVE_GETUID]) +m4trace:configure.ac:146: -1- AH_OUTPUT([HAVE_MEMMOVE], [/* Define to 1 if you have the `memmove\' function. */ +@%:@undef HAVE_MEMMOVE]) +m4trace:configure.ac:146: -1- AH_OUTPUT([HAVE_MEMSET], [/* Define to 1 if you have the `memset\' function. */ +@%:@undef HAVE_MEMSET]) +m4trace:configure.ac:146: -1- AH_OUTPUT([HAVE_POLL], [/* Define to 1 if you have the `poll\' function. */ +@%:@undef HAVE_POLL]) +m4trace:configure.ac:146: -1- AH_OUTPUT([HAVE_SOCKET], [/* Define to 1 if you have the `socket\' function. */ +@%:@undef HAVE_SOCKET]) +m4trace:configure.ac:146: -1- AH_OUTPUT([HAVE_STRCHR], [/* Define to 1 if you have the `strchr\' function. */ +@%:@undef HAVE_STRCHR]) +m4trace:configure.ac:146: -1- AH_OUTPUT([HAVE_STRDUP], [/* Define to 1 if you have the `strdup\' function. */ +@%:@undef HAVE_STRDUP]) +m4trace:configure.ac:146: -1- AH_OUTPUT([HAVE_STRERROR], [/* Define to 1 if you have the `strerror\' function. */ +@%:@undef HAVE_STRERROR]) +m4trace:configure.ac:146: -1- AH_OUTPUT([HAVE_STRTOL], [/* Define to 1 if you have the `strtol\' function. */ +@%:@undef HAVE_STRTOL]) +m4trace:configure.ac:148: -1- AC_CONFIG_FILES([Makefile]) +m4trace:configure.ac:149: -1- AC_SUBST([LIB@&t@OBJS], [$ac_libobjs]) +m4trace:configure.ac:149: -1- AC_SUBST_TRACE([LIB@&t@OBJS]) +m4trace:configure.ac:149: -1- m4_pattern_allow([^LIB@&t@OBJS$]) +m4trace:configure.ac:149: -1- AC_SUBST([LTLIBOBJS], [$ac_ltlibobjs]) +m4trace:configure.ac:149: -1- AC_SUBST_TRACE([LTLIBOBJS]) +m4trace:configure.ac:149: -1- m4_pattern_allow([^LTLIBOBJS$]) +m4trace:configure.ac:149: -1- AM_CONDITIONAL([am__EXEEXT], [test -n "$EXEEXT"]) +m4trace:configure.ac:149: -1- AC_SUBST([am__EXEEXT_TRUE]) +m4trace:configure.ac:149: -1- AC_SUBST_TRACE([am__EXEEXT_TRUE]) +m4trace:configure.ac:149: -1- m4_pattern_allow([^am__EXEEXT_TRUE$]) +m4trace:configure.ac:149: -1- AC_SUBST([am__EXEEXT_FALSE]) +m4trace:configure.ac:149: -1- AC_SUBST_TRACE([am__EXEEXT_FALSE]) +m4trace:configure.ac:149: -1- m4_pattern_allow([^am__EXEEXT_FALSE$]) +m4trace:configure.ac:149: -1- _AM_SUBST_NOTMAKE([am__EXEEXT_TRUE]) +m4trace:configure.ac:149: -1- _AM_SUBST_NOTMAKE([am__EXEEXT_FALSE]) +m4trace:configure.ac:149: -1- AC_SUBST_TRACE([top_builddir]) +m4trace:configure.ac:149: -1- AC_SUBST_TRACE([top_build_prefix]) +m4trace:configure.ac:149: -1- AC_SUBST_TRACE([srcdir]) +m4trace:configure.ac:149: -1- AC_SUBST_TRACE([abs_srcdir]) +m4trace:configure.ac:149: -1- AC_SUBST_TRACE([top_srcdir]) +m4trace:configure.ac:149: -1- AC_SUBST_TRACE([abs_top_srcdir]) +m4trace:configure.ac:149: -1- AC_SUBST_TRACE([builddir]) +m4trace:configure.ac:149: -1- AC_SUBST_TRACE([abs_builddir]) +m4trace:configure.ac:149: -1- AC_SUBST_TRACE([abs_top_builddir]) +m4trace:configure.ac:149: -1- AC_SUBST_TRACE([INSTALL]) +m4trace:configure.ac:149: -1- AC_SUBST_TRACE([MKDIR_P]) +m4trace:configure.ac:149: -1- AC_REQUIRE_AUX_FILE([ltmain.sh]) diff --git a/pkg/registry/zookeeper-3.4.6/src/c/autom4te.cache/traces.2 b/pkg/registry/zookeeper-3.4.6/src/c/autom4te.cache/traces.2 new file mode 100644 index 000000000..15b795dcd --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/c/autom4te.cache/traces.2 @@ -0,0 +1,3183 @@ +m4trace:/usr/share/aclocal/argz.m4:12: -1- AC_DEFUN([gl_FUNC_ARGZ], [gl_PREREQ_ARGZ + +AC_CHECK_HEADERS([argz.h], [], [], [AC_INCLUDES_DEFAULT]) + +AC_CHECK_TYPES([error_t], + [], + [AC_DEFINE([error_t], [int], + [Define to a type to use for `error_t' if it is not otherwise available.]) + AC_DEFINE([__error_t_defined], [1], [Define so that glibc/gnulib argp.h + does not typedef error_t.])], + [#if defined(HAVE_ARGZ_H) +# include +#endif]) + +ARGZ_H= +AC_CHECK_FUNCS([argz_add argz_append argz_count argz_create_sep argz_insert \ + argz_next argz_stringify], [], [ARGZ_H=argz.h; AC_LIBOBJ([argz])]) + +dnl if have system argz functions, allow forced use of +dnl libltdl-supplied implementation (and default to do so +dnl on "known bad" systems). Could use a runtime check, but +dnl (a) detecting malloc issues is notoriously unreliable +dnl (b) only known system that declares argz functions, +dnl provides them, yet they are broken, is cygwin +dnl releases prior to 16-Mar-2007 (1.5.24 and earlier) +dnl So, it's more straightforward simply to special case +dnl this for known bad systems. +AS_IF([test -z "$ARGZ_H"], + [AC_CACHE_CHECK( + [if argz actually works], + [lt_cv_sys_argz_works], + [[case $host_os in #( + *cygwin*) + lt_cv_sys_argz_works=no + if test "$cross_compiling" != no; then + lt_cv_sys_argz_works="guessing no" + else + lt_sed_extract_leading_digits='s/^\([0-9\.]*\).*/\1/' + save_IFS=$IFS + IFS=-. + set x `uname -r | sed -e "$lt_sed_extract_leading_digits"` + IFS=$save_IFS + lt_os_major=${2-0} + lt_os_minor=${3-0} + lt_os_micro=${4-0} + if test "$lt_os_major" -gt 1 \ + || { test "$lt_os_major" -eq 1 \ + && { test "$lt_os_minor" -gt 5 \ + || { test "$lt_os_minor" -eq 5 \ + && test "$lt_os_micro" -gt 24; }; }; }; then + lt_cv_sys_argz_works=yes + fi + fi + ;; #( + *) lt_cv_sys_argz_works=yes ;; + esac]]) + AS_IF([test "$lt_cv_sys_argz_works" = yes], + [AC_DEFINE([HAVE_WORKING_ARGZ], 1, + [This value is set to 1 to indicate that the system argz facility works])], + [ARGZ_H=argz.h + AC_LIBOBJ([argz])])]) + +AC_SUBST([ARGZ_H]) +]) +m4trace:/usr/share/aclocal/argz.m4:79: -1- AC_DEFUN([gl_PREREQ_ARGZ], [:]) +m4trace:/usr/share/aclocal/libtool.m4:69: -1- AC_DEFUN([LT_INIT], [AC_PREREQ([2.58])dnl We use AC_INCLUDES_DEFAULT +AC_REQUIRE([AC_CONFIG_AUX_DIR_DEFAULT])dnl +AC_BEFORE([$0], [LT_LANG])dnl +AC_BEFORE([$0], [LT_OUTPUT])dnl +AC_BEFORE([$0], [LTDL_INIT])dnl +m4_require([_LT_CHECK_BUILDDIR])dnl + +dnl Autoconf doesn't catch unexpanded LT_ macros by default: +m4_pattern_forbid([^_?LT_[A-Z_]+$])dnl +m4_pattern_allow([^(_LT_EOF|LT_DLGLOBAL|LT_DLLAZY_OR_NOW|LT_MULTI_MODULE)$])dnl +dnl aclocal doesn't pull ltoptions.m4, ltsugar.m4, or ltversion.m4 +dnl unless we require an AC_DEFUNed macro: +AC_REQUIRE([LTOPTIONS_VERSION])dnl +AC_REQUIRE([LTSUGAR_VERSION])dnl +AC_REQUIRE([LTVERSION_VERSION])dnl +AC_REQUIRE([LTOBSOLETE_VERSION])dnl +m4_require([_LT_PROG_LTMAIN])dnl + +_LT_SHELL_INIT([SHELL=${CONFIG_SHELL-/bin/sh}]) + +dnl Parse OPTIONS +_LT_SET_OPTIONS([$0], [$1]) + +# This can be used to rebuild libtool when needed +LIBTOOL_DEPS="$ltmain" + +# Always use our own libtool. +LIBTOOL='$(SHELL) $(top_builddir)/libtool' +AC_SUBST(LIBTOOL)dnl + +_LT_SETUP + +# Only expand once: +m4_define([LT_INIT]) +]) +m4trace:/usr/share/aclocal/libtool.m4:107: -1- AU_DEFUN([AC_PROG_LIBTOOL], [m4_if($#, 0, [LT_INIT], [LT_INIT($@)])]) +m4trace:/usr/share/aclocal/libtool.m4:107: -1- AC_DEFUN([AC_PROG_LIBTOOL], [AC_DIAGNOSE([obsolete], [The macro `AC_PROG_LIBTOOL' is obsolete. +You should run autoupdate.])dnl +m4_if($#, 0, [LT_INIT], [LT_INIT($@)])]) +m4trace:/usr/share/aclocal/libtool.m4:108: -1- AU_DEFUN([AM_PROG_LIBTOOL], [m4_if($#, 0, [LT_INIT], [LT_INIT($@)])]) +m4trace:/usr/share/aclocal/libtool.m4:108: -1- AC_DEFUN([AM_PROG_LIBTOOL], [AC_DIAGNOSE([obsolete], [The macro `AM_PROG_LIBTOOL' is obsolete. +You should run autoupdate.])dnl +m4_if($#, 0, [LT_INIT], [LT_INIT($@)])]) +m4trace:/usr/share/aclocal/libtool.m4:609: -1- AC_DEFUN([LT_OUTPUT], [: ${CONFIG_LT=./config.lt} +AC_MSG_NOTICE([creating $CONFIG_LT]) +_LT_GENERATED_FILE_INIT(["$CONFIG_LT"], +[# Run this file to recreate a libtool stub with the current configuration.]) + +cat >>"$CONFIG_LT" <<\_LTEOF +lt_cl_silent=false +exec AS_MESSAGE_LOG_FD>>config.log +{ + echo + AS_BOX([Running $as_me.]) +} >&AS_MESSAGE_LOG_FD + +lt_cl_help="\ +\`$as_me' creates a local libtool stub from the current configuration, +for use in further configure time tests before the real libtool is +generated. + +Usage: $[0] [[OPTIONS]] + + -h, --help print this help, then exit + -V, --version print version number, then exit + -q, --quiet do not print progress messages + -d, --debug don't remove temporary files + +Report bugs to ." + +lt_cl_version="\ +m4_ifset([AC_PACKAGE_NAME], [AC_PACKAGE_NAME ])config.lt[]dnl +m4_ifset([AC_PACKAGE_VERSION], [ AC_PACKAGE_VERSION]) +configured by $[0], generated by m4_PACKAGE_STRING. + +Copyright (C) 2011 Free Software Foundation, Inc. +This config.lt script is free software; the Free Software Foundation +gives unlimited permision to copy, distribute and modify it." + +while test $[#] != 0 +do + case $[1] in + --version | --v* | -V ) + echo "$lt_cl_version"; exit 0 ;; + --help | --h* | -h ) + echo "$lt_cl_help"; exit 0 ;; + --debug | --d* | -d ) + debug=: ;; + --quiet | --q* | --silent | --s* | -q ) + lt_cl_silent=: ;; + + -*) AC_MSG_ERROR([unrecognized option: $[1] +Try \`$[0] --help' for more information.]) ;; + + *) AC_MSG_ERROR([unrecognized argument: $[1] +Try \`$[0] --help' for more information.]) ;; + esac + shift +done + +if $lt_cl_silent; then + exec AS_MESSAGE_FD>/dev/null +fi +_LTEOF + +cat >>"$CONFIG_LT" <<_LTEOF +_LT_OUTPUT_LIBTOOL_COMMANDS_INIT +_LTEOF + +cat >>"$CONFIG_LT" <<\_LTEOF +AC_MSG_NOTICE([creating $ofile]) +_LT_OUTPUT_LIBTOOL_COMMANDS +AS_EXIT(0) +_LTEOF +chmod +x "$CONFIG_LT" + +# configure is writing to config.log, but config.lt does its own redirection, +# appending to config.log, which fails on DOS, as config.log is still kept +# open by configure. Here we exec the FD to /dev/null, effectively closing +# config.log, so it can be properly (re)opened and appended to by config.lt. +lt_cl_success=: +test "$silent" = yes && + lt_config_lt_args="$lt_config_lt_args --quiet" +exec AS_MESSAGE_LOG_FD>/dev/null +$SHELL "$CONFIG_LT" $lt_config_lt_args || lt_cl_success=false +exec AS_MESSAGE_LOG_FD>>config.log +$lt_cl_success || AS_EXIT(1) +]) +m4trace:/usr/share/aclocal/libtool.m4:790: -1- AC_DEFUN([LT_SUPPORTED_TAG], []) +m4trace:/usr/share/aclocal/libtool.m4:801: -1- AC_DEFUN([LT_LANG], [AC_BEFORE([$0], [LT_OUTPUT])dnl +m4_case([$1], + [C], [_LT_LANG(C)], + [C++], [_LT_LANG(CXX)], + [Go], [_LT_LANG(GO)], + [Java], [_LT_LANG(GCJ)], + [Fortran 77], [_LT_LANG(F77)], + [Fortran], [_LT_LANG(FC)], + [Windows Resource], [_LT_LANG(RC)], + [m4_ifdef([_LT_LANG_]$1[_CONFIG], + [_LT_LANG($1)], + [m4_fatal([$0: unsupported language: "$1"])])])dnl +]) +m4trace:/usr/share/aclocal/libtool.m4:893: -1- AU_DEFUN([AC_LIBTOOL_CXX], [LT_LANG(C++)]) +m4trace:/usr/share/aclocal/libtool.m4:893: -1- AC_DEFUN([AC_LIBTOOL_CXX], [AC_DIAGNOSE([obsolete], [The macro `AC_LIBTOOL_CXX' is obsolete. +You should run autoupdate.])dnl +LT_LANG(C++)]) +m4trace:/usr/share/aclocal/libtool.m4:894: -1- AU_DEFUN([AC_LIBTOOL_F77], [LT_LANG(Fortran 77)]) +m4trace:/usr/share/aclocal/libtool.m4:894: -1- AC_DEFUN([AC_LIBTOOL_F77], [AC_DIAGNOSE([obsolete], [The macro `AC_LIBTOOL_F77' is obsolete. +You should run autoupdate.])dnl +LT_LANG(Fortran 77)]) +m4trace:/usr/share/aclocal/libtool.m4:895: -1- AU_DEFUN([AC_LIBTOOL_FC], [LT_LANG(Fortran)]) +m4trace:/usr/share/aclocal/libtool.m4:895: -1- AC_DEFUN([AC_LIBTOOL_FC], [AC_DIAGNOSE([obsolete], [The macro `AC_LIBTOOL_FC' is obsolete. +You should run autoupdate.])dnl +LT_LANG(Fortran)]) +m4trace:/usr/share/aclocal/libtool.m4:896: -1- AU_DEFUN([AC_LIBTOOL_GCJ], [LT_LANG(Java)]) +m4trace:/usr/share/aclocal/libtool.m4:896: -1- AC_DEFUN([AC_LIBTOOL_GCJ], [AC_DIAGNOSE([obsolete], [The macro `AC_LIBTOOL_GCJ' is obsolete. +You should run autoupdate.])dnl +LT_LANG(Java)]) +m4trace:/usr/share/aclocal/libtool.m4:897: -1- AU_DEFUN([AC_LIBTOOL_RC], [LT_LANG(Windows Resource)]) +m4trace:/usr/share/aclocal/libtool.m4:897: -1- AC_DEFUN([AC_LIBTOOL_RC], [AC_DIAGNOSE([obsolete], [The macro `AC_LIBTOOL_RC' is obsolete. +You should run autoupdate.])dnl +LT_LANG(Windows Resource)]) +m4trace:/usr/share/aclocal/libtool.m4:1225: -1- AC_DEFUN([_LT_WITH_SYSROOT], [AC_MSG_CHECKING([for sysroot]) +AC_ARG_WITH([sysroot], +[ --with-sysroot[=DIR] Search for dependent libraries within DIR + (or the compiler's sysroot if not specified).], +[], [with_sysroot=no]) + +dnl lt_sysroot will always be passed unquoted. We quote it here +dnl in case the user passed a directory name. +lt_sysroot= +case ${with_sysroot} in #( + yes) + if test "$GCC" = yes; then + lt_sysroot=`$CC --print-sysroot 2>/dev/null` + fi + ;; #( + /*) + lt_sysroot=`echo "$with_sysroot" | sed -e "$sed_quote_subst"` + ;; #( + no|'') + ;; #( + *) + AC_MSG_RESULT([${with_sysroot}]) + AC_MSG_ERROR([The sysroot must be an absolute path.]) + ;; +esac + + AC_MSG_RESULT([${lt_sysroot:-no}]) +_LT_DECL([], [lt_sysroot], [0], [The root where to search for ]dnl +[dependent libraries, and in which our libraries should be installed.])]) +m4trace:/usr/share/aclocal/libtool.m4:1502: -1- AC_DEFUN([_LT_COMPILER_OPTION], [m4_require([_LT_FILEUTILS_DEFAULTS])dnl +m4_require([_LT_DECL_SED])dnl +AC_CACHE_CHECK([$1], [$2], + [$2=no + m4_if([$4], , [ac_outfile=conftest.$ac_objext], [ac_outfile=$4]) + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + lt_compiler_flag="$3" + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + # The option is referenced via a variable to avoid confusing sed. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ + -e 's: [[^ ]]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&AS_MESSAGE_LOG_FD) + (eval "$lt_compile" 2>conftest.err) + ac_status=$? + cat conftest.err >&AS_MESSAGE_LOG_FD + echo "$as_me:$LINENO: \$? = $ac_status" >&AS_MESSAGE_LOG_FD + if (exit $ac_status) && test -s "$ac_outfile"; then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings other than the usual output. + $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp + $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 + if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then + $2=yes + fi + fi + $RM conftest* +]) + +if test x"[$]$2" = xyes; then + m4_if([$5], , :, [$5]) +else + m4_if([$6], , :, [$6]) +fi +]) +m4trace:/usr/share/aclocal/libtool.m4:1544: -1- AU_DEFUN([AC_LIBTOOL_COMPILER_OPTION], [m4_if($#, 0, [_LT_COMPILER_OPTION], [_LT_COMPILER_OPTION($@)])]) +m4trace:/usr/share/aclocal/libtool.m4:1544: -1- AC_DEFUN([AC_LIBTOOL_COMPILER_OPTION], [AC_DIAGNOSE([obsolete], [The macro `AC_LIBTOOL_COMPILER_OPTION' is obsolete. +You should run autoupdate.])dnl +m4_if($#, 0, [_LT_COMPILER_OPTION], [_LT_COMPILER_OPTION($@)])]) +m4trace:/usr/share/aclocal/libtool.m4:1553: -1- AC_DEFUN([_LT_LINKER_OPTION], [m4_require([_LT_FILEUTILS_DEFAULTS])dnl +m4_require([_LT_DECL_SED])dnl +AC_CACHE_CHECK([$1], [$2], + [$2=no + save_LDFLAGS="$LDFLAGS" + LDFLAGS="$LDFLAGS $3" + echo "$lt_simple_link_test_code" > conftest.$ac_ext + if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then + # The linker can only warn and ignore the option if not recognized + # So say no if there are warnings + if test -s conftest.err; then + # Append any errors to the config.log. + cat conftest.err 1>&AS_MESSAGE_LOG_FD + $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp + $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 + if diff conftest.exp conftest.er2 >/dev/null; then + $2=yes + fi + else + $2=yes + fi + fi + $RM -r conftest* + LDFLAGS="$save_LDFLAGS" +]) + +if test x"[$]$2" = xyes; then + m4_if([$4], , :, [$4]) +else + m4_if([$5], , :, [$5]) +fi +]) +m4trace:/usr/share/aclocal/libtool.m4:1588: -1- AU_DEFUN([AC_LIBTOOL_LINKER_OPTION], [m4_if($#, 0, [_LT_LINKER_OPTION], [_LT_LINKER_OPTION($@)])]) +m4trace:/usr/share/aclocal/libtool.m4:1588: -1- AC_DEFUN([AC_LIBTOOL_LINKER_OPTION], [AC_DIAGNOSE([obsolete], [The macro `AC_LIBTOOL_LINKER_OPTION' is obsolete. +You should run autoupdate.])dnl +m4_if($#, 0, [_LT_LINKER_OPTION], [_LT_LINKER_OPTION($@)])]) +m4trace:/usr/share/aclocal/libtool.m4:1595: -1- AC_DEFUN([LT_CMD_MAX_LEN], [AC_REQUIRE([AC_CANONICAL_HOST])dnl +# find the maximum length of command line arguments +AC_MSG_CHECKING([the maximum length of command line arguments]) +AC_CACHE_VAL([lt_cv_sys_max_cmd_len], [dnl + i=0 + teststring="ABCD" + + case $build_os in + msdosdjgpp*) + # On DJGPP, this test can blow up pretty badly due to problems in libc + # (any single argument exceeding 2000 bytes causes a buffer overrun + # during glob expansion). Even if it were fixed, the result of this + # check would be larger than it should be. + lt_cv_sys_max_cmd_len=12288; # 12K is about right + ;; + + gnu*) + # Under GNU Hurd, this test is not required because there is + # no limit to the length of command line arguments. + # Libtool will interpret -1 as no limit whatsoever + lt_cv_sys_max_cmd_len=-1; + ;; + + cygwin* | mingw* | cegcc*) + # On Win9x/ME, this test blows up -- it succeeds, but takes + # about 5 minutes as the teststring grows exponentially. + # Worse, since 9x/ME are not pre-emptively multitasking, + # you end up with a "frozen" computer, even though with patience + # the test eventually succeeds (with a max line length of 256k). + # Instead, let's just punt: use the minimum linelength reported by + # all of the supported platforms: 8192 (on NT/2K/XP). + lt_cv_sys_max_cmd_len=8192; + ;; + + mint*) + # On MiNT this can take a long time and run out of memory. + lt_cv_sys_max_cmd_len=8192; + ;; + + amigaos*) + # On AmigaOS with pdksh, this test takes hours, literally. + # So we just punt and use a minimum line length of 8192. + lt_cv_sys_max_cmd_len=8192; + ;; + + netbsd* | freebsd* | openbsd* | darwin* | dragonfly*) + # This has been around since 386BSD, at least. Likely further. + if test -x /sbin/sysctl; then + lt_cv_sys_max_cmd_len=`/sbin/sysctl -n kern.argmax` + elif test -x /usr/sbin/sysctl; then + lt_cv_sys_max_cmd_len=`/usr/sbin/sysctl -n kern.argmax` + else + lt_cv_sys_max_cmd_len=65536 # usable default for all BSDs + fi + # And add a safety zone + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` + ;; + + interix*) + # We know the value 262144 and hardcode it with a safety zone (like BSD) + lt_cv_sys_max_cmd_len=196608 + ;; + + os2*) + # The test takes a long time on OS/2. + lt_cv_sys_max_cmd_len=8192 + ;; + + osf*) + # Dr. Hans Ekkehard Plesser reports seeing a kernel panic running configure + # due to this test when exec_disable_arg_limit is 1 on Tru64. It is not + # nice to cause kernel panics so lets avoid the loop below. + # First set a reasonable default. + lt_cv_sys_max_cmd_len=16384 + # + if test -x /sbin/sysconfig; then + case `/sbin/sysconfig -q proc exec_disable_arg_limit` in + *1*) lt_cv_sys_max_cmd_len=-1 ;; + esac + fi + ;; + sco3.2v5*) + lt_cv_sys_max_cmd_len=102400 + ;; + sysv5* | sco5v6* | sysv4.2uw2*) + kargmax=`grep ARG_MAX /etc/conf/cf.d/stune 2>/dev/null` + if test -n "$kargmax"; then + lt_cv_sys_max_cmd_len=`echo $kargmax | sed 's/.*[[ ]]//'` + else + lt_cv_sys_max_cmd_len=32768 + fi + ;; + *) + lt_cv_sys_max_cmd_len=`(getconf ARG_MAX) 2> /dev/null` + if test -n "$lt_cv_sys_max_cmd_len"; then + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` + else + # Make teststring a little bigger before we do anything with it. + # a 1K string should be a reasonable start. + for i in 1 2 3 4 5 6 7 8 ; do + teststring=$teststring$teststring + done + SHELL=${SHELL-${CONFIG_SHELL-/bin/sh}} + # If test is not a shell built-in, we'll probably end up computing a + # maximum length that is only half of the actual maximum length, but + # we can't tell. + while { test "X"`env echo "$teststring$teststring" 2>/dev/null` \ + = "X$teststring$teststring"; } >/dev/null 2>&1 && + test $i != 17 # 1/2 MB should be enough + do + i=`expr $i + 1` + teststring=$teststring$teststring + done + # Only check the string length outside the loop. + lt_cv_sys_max_cmd_len=`expr "X$teststring" : ".*" 2>&1` + teststring= + # Add a significant safety factor because C++ compilers can tack on + # massive amounts of additional arguments before passing them to the + # linker. It appears as though 1/2 is a usable value. + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 2` + fi + ;; + esac +]) +if test -n $lt_cv_sys_max_cmd_len ; then + AC_MSG_RESULT($lt_cv_sys_max_cmd_len) +else + AC_MSG_RESULT(none) +fi +max_cmd_len=$lt_cv_sys_max_cmd_len +_LT_DECL([], [max_cmd_len], [0], + [What is the maximum length of a command?]) +]) +m4trace:/usr/share/aclocal/libtool.m4:1733: -1- AU_DEFUN([AC_LIBTOOL_SYS_MAX_CMD_LEN], [m4_if($#, 0, [LT_CMD_MAX_LEN], [LT_CMD_MAX_LEN($@)])]) +m4trace:/usr/share/aclocal/libtool.m4:1733: -1- AC_DEFUN([AC_LIBTOOL_SYS_MAX_CMD_LEN], [AC_DIAGNOSE([obsolete], [The macro `AC_LIBTOOL_SYS_MAX_CMD_LEN' is obsolete. +You should run autoupdate.])dnl +m4_if($#, 0, [LT_CMD_MAX_LEN], [LT_CMD_MAX_LEN($@)])]) +m4trace:/usr/share/aclocal/libtool.m4:1844: -1- AC_DEFUN([LT_SYS_DLOPEN_SELF], [m4_require([_LT_HEADER_DLFCN])dnl +if test "x$enable_dlopen" != xyes; then + enable_dlopen=unknown + enable_dlopen_self=unknown + enable_dlopen_self_static=unknown +else + lt_cv_dlopen=no + lt_cv_dlopen_libs= + + case $host_os in + beos*) + lt_cv_dlopen="load_add_on" + lt_cv_dlopen_libs= + lt_cv_dlopen_self=yes + ;; + + mingw* | pw32* | cegcc*) + lt_cv_dlopen="LoadLibrary" + lt_cv_dlopen_libs= + ;; + + cygwin*) + lt_cv_dlopen="dlopen" + lt_cv_dlopen_libs= + ;; + + darwin*) + # if libdl is installed we need to link against it + AC_CHECK_LIB([dl], [dlopen], + [lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl"],[ + lt_cv_dlopen="dyld" + lt_cv_dlopen_libs= + lt_cv_dlopen_self=yes + ]) + ;; + + *) + AC_CHECK_FUNC([shl_load], + [lt_cv_dlopen="shl_load"], + [AC_CHECK_LIB([dld], [shl_load], + [lt_cv_dlopen="shl_load" lt_cv_dlopen_libs="-ldld"], + [AC_CHECK_FUNC([dlopen], + [lt_cv_dlopen="dlopen"], + [AC_CHECK_LIB([dl], [dlopen], + [lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl"], + [AC_CHECK_LIB([svld], [dlopen], + [lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-lsvld"], + [AC_CHECK_LIB([dld], [dld_link], + [lt_cv_dlopen="dld_link" lt_cv_dlopen_libs="-ldld"]) + ]) + ]) + ]) + ]) + ]) + ;; + esac + + if test "x$lt_cv_dlopen" != xno; then + enable_dlopen=yes + else + enable_dlopen=no + fi + + case $lt_cv_dlopen in + dlopen) + save_CPPFLAGS="$CPPFLAGS" + test "x$ac_cv_header_dlfcn_h" = xyes && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H" + + save_LDFLAGS="$LDFLAGS" + wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\" + + save_LIBS="$LIBS" + LIBS="$lt_cv_dlopen_libs $LIBS" + + AC_CACHE_CHECK([whether a program can dlopen itself], + lt_cv_dlopen_self, [dnl + _LT_TRY_DLOPEN_SELF( + lt_cv_dlopen_self=yes, lt_cv_dlopen_self=yes, + lt_cv_dlopen_self=no, lt_cv_dlopen_self=cross) + ]) + + if test "x$lt_cv_dlopen_self" = xyes; then + wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $lt_prog_compiler_static\" + AC_CACHE_CHECK([whether a statically linked program can dlopen itself], + lt_cv_dlopen_self_static, [dnl + _LT_TRY_DLOPEN_SELF( + lt_cv_dlopen_self_static=yes, lt_cv_dlopen_self_static=yes, + lt_cv_dlopen_self_static=no, lt_cv_dlopen_self_static=cross) + ]) + fi + + CPPFLAGS="$save_CPPFLAGS" + LDFLAGS="$save_LDFLAGS" + LIBS="$save_LIBS" + ;; + esac + + case $lt_cv_dlopen_self in + yes|no) enable_dlopen_self=$lt_cv_dlopen_self ;; + *) enable_dlopen_self=unknown ;; + esac + + case $lt_cv_dlopen_self_static in + yes|no) enable_dlopen_self_static=$lt_cv_dlopen_self_static ;; + *) enable_dlopen_self_static=unknown ;; + esac +fi +_LT_DECL([dlopen_support], [enable_dlopen], [0], + [Whether dlopen is supported]) +_LT_DECL([dlopen_self], [enable_dlopen_self], [0], + [Whether dlopen of programs is supported]) +_LT_DECL([dlopen_self_static], [enable_dlopen_self_static], [0], + [Whether dlopen of statically linked programs is supported]) +]) +m4trace:/usr/share/aclocal/libtool.m4:1961: -1- AU_DEFUN([AC_LIBTOOL_DLOPEN_SELF], [m4_if($#, 0, [LT_SYS_DLOPEN_SELF], [LT_SYS_DLOPEN_SELF($@)])]) +m4trace:/usr/share/aclocal/libtool.m4:1961: -1- AC_DEFUN([AC_LIBTOOL_DLOPEN_SELF], [AC_DIAGNOSE([obsolete], [The macro `AC_LIBTOOL_DLOPEN_SELF' is obsolete. +You should run autoupdate.])dnl +m4_if($#, 0, [LT_SYS_DLOPEN_SELF], [LT_SYS_DLOPEN_SELF($@)])]) +m4trace:/usr/share/aclocal/libtool.m4:2942: -1- AC_DEFUN([_LT_PATH_TOOL_PREFIX], [m4_require([_LT_DECL_EGREP])dnl +AC_MSG_CHECKING([for $1]) +AC_CACHE_VAL(lt_cv_path_MAGIC_CMD, +[case $MAGIC_CMD in +[[\\/*] | ?:[\\/]*]) + lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path. + ;; +*) + lt_save_MAGIC_CMD="$MAGIC_CMD" + lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR +dnl $ac_dummy forces splitting on constant user-supplied paths. +dnl POSIX.2 word splitting is done only on the output of word expansions, +dnl not every word. This closes a longstanding sh security hole. + ac_dummy="m4_if([$2], , $PATH, [$2])" + for ac_dir in $ac_dummy; do + IFS="$lt_save_ifs" + test -z "$ac_dir" && ac_dir=. + if test -f $ac_dir/$1; then + lt_cv_path_MAGIC_CMD="$ac_dir/$1" + if test -n "$file_magic_test_file"; then + case $deplibs_check_method in + "file_magic "*) + file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"` + MAGIC_CMD="$lt_cv_path_MAGIC_CMD" + if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null | + $EGREP "$file_magic_regex" > /dev/null; then + : + else + cat <<_LT_EOF 1>&2 + +*** Warning: the command libtool uses to detect shared libraries, +*** $file_magic_cmd, produces output that libtool cannot recognize. +*** The result is that libtool may fail to recognize shared libraries +*** as such. This will affect the creation of libtool libraries that +*** depend on shared libraries, but programs linked with such libtool +*** libraries will work regardless of this problem. Nevertheless, you +*** may want to report the problem to your system manager and/or to +*** bug-libtool@gnu.org + +_LT_EOF + fi ;; + esac + fi + break + fi + done + IFS="$lt_save_ifs" + MAGIC_CMD="$lt_save_MAGIC_CMD" + ;; +esac]) +MAGIC_CMD="$lt_cv_path_MAGIC_CMD" +if test -n "$MAGIC_CMD"; then + AC_MSG_RESULT($MAGIC_CMD) +else + AC_MSG_RESULT(no) +fi +_LT_DECL([], [MAGIC_CMD], [0], + [Used to examine libraries when file_magic_cmd begins with "file"])dnl +]) +m4trace:/usr/share/aclocal/libtool.m4:3004: -1- AU_DEFUN([AC_PATH_TOOL_PREFIX], [m4_if($#, 0, [_LT_PATH_TOOL_PREFIX], [_LT_PATH_TOOL_PREFIX($@)])]) +m4trace:/usr/share/aclocal/libtool.m4:3004: -1- AC_DEFUN([AC_PATH_TOOL_PREFIX], [AC_DIAGNOSE([obsolete], [The macro `AC_PATH_TOOL_PREFIX' is obsolete. +You should run autoupdate.])dnl +m4_if($#, 0, [_LT_PATH_TOOL_PREFIX], [_LT_PATH_TOOL_PREFIX($@)])]) +m4trace:/usr/share/aclocal/libtool.m4:3027: -1- AC_DEFUN([LT_PATH_LD], [AC_REQUIRE([AC_PROG_CC])dnl +AC_REQUIRE([AC_CANONICAL_HOST])dnl +AC_REQUIRE([AC_CANONICAL_BUILD])dnl +m4_require([_LT_DECL_SED])dnl +m4_require([_LT_DECL_EGREP])dnl +m4_require([_LT_PROG_ECHO_BACKSLASH])dnl + +AC_ARG_WITH([gnu-ld], + [AS_HELP_STRING([--with-gnu-ld], + [assume the C compiler uses GNU ld @<:@default=no@:>@])], + [test "$withval" = no || with_gnu_ld=yes], + [with_gnu_ld=no])dnl + +ac_prog=ld +if test "$GCC" = yes; then + # Check if gcc -print-prog-name=ld gives a path. + AC_MSG_CHECKING([for ld used by $CC]) + case $host in + *-*-mingw*) + # gcc leaves a trailing carriage return which upsets mingw + ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;; + *) + ac_prog=`($CC -print-prog-name=ld) 2>&5` ;; + esac + case $ac_prog in + # Accept absolute paths. + [[\\/]]* | ?:[[\\/]]*) + re_direlt='/[[^/]][[^/]]*/\.\./' + # Canonicalize the pathname of ld + ac_prog=`$ECHO "$ac_prog"| $SED 's%\\\\%/%g'` + while $ECHO "$ac_prog" | $GREP "$re_direlt" > /dev/null 2>&1; do + ac_prog=`$ECHO $ac_prog| $SED "s%$re_direlt%/%"` + done + test -z "$LD" && LD="$ac_prog" + ;; + "") + # If it fails, then pretend we aren't using GCC. + ac_prog=ld + ;; + *) + # If it is relative, then search for the first ld in PATH. + with_gnu_ld=unknown + ;; + esac +elif test "$with_gnu_ld" = yes; then + AC_MSG_CHECKING([for GNU ld]) +else + AC_MSG_CHECKING([for non-GNU ld]) +fi +AC_CACHE_VAL(lt_cv_path_LD, +[if test -z "$LD"; then + lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR + for ac_dir in $PATH; do + IFS="$lt_save_ifs" + test -z "$ac_dir" && ac_dir=. + if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then + lt_cv_path_LD="$ac_dir/$ac_prog" + # Check to see if the program is GNU ld. I'd rather use --version, + # but apparently some variants of GNU ld only accept -v. + # Break only if it was the GNU/non-GNU ld that we prefer. + case `"$lt_cv_path_LD" -v 2>&1 &1 | sed '1q'` in + */dev/null* | *'Invalid file or object type'*) + lt_cv_path_NM="$tmp_nm -B" + break + ;; + *) + case `"$tmp_nm" -p /dev/null 2>&1 | sed '1q'` in + */dev/null*) + lt_cv_path_NM="$tmp_nm -p" + break + ;; + *) + lt_cv_path_NM=${lt_cv_path_NM="$tmp_nm"} # keep the first match, but + continue # so that we can try to find one that supports BSD flags + ;; + esac + ;; + esac + fi + done + IFS="$lt_save_ifs" + done + : ${lt_cv_path_NM=no} +fi]) +if test "$lt_cv_path_NM" != "no"; then + NM="$lt_cv_path_NM" +else + # Didn't find any BSD compatible name lister, look for dumpbin. + if test -n "$DUMPBIN"; then : + # Let the user override the test. + else + AC_CHECK_TOOLS(DUMPBIN, [dumpbin "link -dump"], :) + case `$DUMPBIN -symbols /dev/null 2>&1 | sed '1q'` in + *COFF*) + DUMPBIN="$DUMPBIN -symbols" + ;; + *) + DUMPBIN=: + ;; + esac + fi + AC_SUBST([DUMPBIN]) + if test "$DUMPBIN" != ":"; then + NM="$DUMPBIN" + fi +fi +test -z "$NM" && NM=nm +AC_SUBST([NM]) +_LT_DECL([], [NM], [1], [A BSD- or MS-compatible name lister])dnl + +AC_CACHE_CHECK([the name lister ($NM) interface], [lt_cv_nm_interface], + [lt_cv_nm_interface="BSD nm" + echo "int some_variable = 0;" > conftest.$ac_ext + (eval echo "\"\$as_me:$LINENO: $ac_compile\"" >&AS_MESSAGE_LOG_FD) + (eval "$ac_compile" 2>conftest.err) + cat conftest.err >&AS_MESSAGE_LOG_FD + (eval echo "\"\$as_me:$LINENO: $NM \\\"conftest.$ac_objext\\\"\"" >&AS_MESSAGE_LOG_FD) + (eval "$NM \"conftest.$ac_objext\"" 2>conftest.err > conftest.out) + cat conftest.err >&AS_MESSAGE_LOG_FD + (eval echo "\"\$as_me:$LINENO: output\"" >&AS_MESSAGE_LOG_FD) + cat conftest.out >&AS_MESSAGE_LOG_FD + if $GREP 'External.*some_variable' conftest.out > /dev/null; then + lt_cv_nm_interface="MS dumpbin" + fi + rm -f conftest*]) +]) +m4trace:/usr/share/aclocal/libtool.m4:3501: -1- AU_DEFUN([AM_PROG_NM], [m4_if($#, 0, [LT_PATH_NM], [LT_PATH_NM($@)])]) +m4trace:/usr/share/aclocal/libtool.m4:3501: -1- AC_DEFUN([AM_PROG_NM], [AC_DIAGNOSE([obsolete], [The macro `AM_PROG_NM' is obsolete. +You should run autoupdate.])dnl +m4_if($#, 0, [LT_PATH_NM], [LT_PATH_NM($@)])]) +m4trace:/usr/share/aclocal/libtool.m4:3502: -1- AU_DEFUN([AC_PROG_NM], [m4_if($#, 0, [LT_PATH_NM], [LT_PATH_NM($@)])]) +m4trace:/usr/share/aclocal/libtool.m4:3502: -1- AC_DEFUN([AC_PROG_NM], [AC_DIAGNOSE([obsolete], [The macro `AC_PROG_NM' is obsolete. +You should run autoupdate.])dnl +m4_if($#, 0, [LT_PATH_NM], [LT_PATH_NM($@)])]) +m4trace:/usr/share/aclocal/libtool.m4:3572: -1- AC_DEFUN([LT_LIB_M], [AC_REQUIRE([AC_CANONICAL_HOST])dnl +LIBM= +case $host in +*-*-beos* | *-*-cegcc* | *-*-cygwin* | *-*-haiku* | *-*-pw32* | *-*-darwin*) + # These system don't have libm, or don't need it + ;; +*-ncr-sysv4.3*) + AC_CHECK_LIB(mw, _mwvalidcheckl, LIBM="-lmw") + AC_CHECK_LIB(m, cos, LIBM="$LIBM -lm") + ;; +*) + AC_CHECK_LIB(m, cos, LIBM="-lm") + ;; +esac +AC_SUBST([LIBM]) +]) +m4trace:/usr/share/aclocal/libtool.m4:3591: -1- AU_DEFUN([AC_CHECK_LIBM], [m4_if($#, 0, [LT_LIB_M], [LT_LIB_M($@)])]) +m4trace:/usr/share/aclocal/libtool.m4:3591: -1- AC_DEFUN([AC_CHECK_LIBM], [AC_DIAGNOSE([obsolete], [The macro `AC_CHECK_LIBM' is obsolete. +You should run autoupdate.])dnl +m4_if($#, 0, [LT_LIB_M], [LT_LIB_M($@)])]) +m4trace:/usr/share/aclocal/libtool.m4:7641: -1- AC_DEFUN([LT_PROG_GCJ], [m4_ifdef([AC_PROG_GCJ], [AC_PROG_GCJ], + [m4_ifdef([A][M_PROG_GCJ], [A][M_PROG_GCJ], + [AC_CHECK_TOOL(GCJ, gcj,) + test "x${GCJFLAGS+set}" = xset || GCJFLAGS="-g -O2" + AC_SUBST(GCJFLAGS)])])[]dnl +]) +m4trace:/usr/share/aclocal/libtool.m4:7650: -1- AU_DEFUN([LT_AC_PROG_GCJ], [m4_if($#, 0, [LT_PROG_GCJ], [LT_PROG_GCJ($@)])]) +m4trace:/usr/share/aclocal/libtool.m4:7650: -1- AC_DEFUN([LT_AC_PROG_GCJ], [AC_DIAGNOSE([obsolete], [The macro `LT_AC_PROG_GCJ' is obsolete. +You should run autoupdate.])dnl +m4_if($#, 0, [LT_PROG_GCJ], [LT_PROG_GCJ($@)])]) +m4trace:/usr/share/aclocal/libtool.m4:7657: -1- AC_DEFUN([LT_PROG_GO], [AC_CHECK_TOOL(GOC, gccgo,) +]) +m4trace:/usr/share/aclocal/libtool.m4:7664: -1- AC_DEFUN([LT_PROG_RC], [AC_CHECK_TOOL(RC, windres,) +]) +m4trace:/usr/share/aclocal/libtool.m4:7669: -1- AU_DEFUN([LT_AC_PROG_RC], [m4_if($#, 0, [LT_PROG_RC], [LT_PROG_RC($@)])]) +m4trace:/usr/share/aclocal/libtool.m4:7669: -1- AC_DEFUN([LT_AC_PROG_RC], [AC_DIAGNOSE([obsolete], [The macro `LT_AC_PROG_RC' is obsolete. +You should run autoupdate.])dnl +m4_if($#, 0, [LT_PROG_RC], [LT_PROG_RC($@)])]) +m4trace:/usr/share/aclocal/libtool.m4:7789: -1- AU_DEFUN([LT_AC_PROG_SED], [m4_if($#, 0, [AC_PROG_SED], [AC_PROG_SED($@)])]) +m4trace:/usr/share/aclocal/libtool.m4:7789: -1- AC_DEFUN([LT_AC_PROG_SED], [AC_DIAGNOSE([obsolete], [The macro `LT_AC_PROG_SED' is obsolete. +You should run autoupdate.])dnl +m4_if($#, 0, [AC_PROG_SED], [AC_PROG_SED($@)])]) +m4trace:/usr/share/aclocal/ltdl.m4:16: -1- AC_DEFUN([LT_CONFIG_LTDL_DIR], [AC_BEFORE([$0], [LTDL_INIT]) +_$0($*) +]) +m4trace:/usr/share/aclocal/ltdl.m4:68: -1- AC_DEFUN([LTDL_CONVENIENCE], [AC_BEFORE([$0], [LTDL_INIT])dnl +dnl Although the argument is deprecated and no longer documented, +dnl LTDL_CONVENIENCE used to take a DIRECTORY orgument, if we have one +dnl here make sure it is the same as any other declaration of libltdl's +dnl location! This also ensures lt_ltdl_dir is set when configure.ac is +dnl not yet using an explicit LT_CONFIG_LTDL_DIR. +m4_ifval([$1], [_LT_CONFIG_LTDL_DIR([$1])])dnl +_$0() +]) +m4trace:/usr/share/aclocal/ltdl.m4:81: -1- AU_DEFUN([AC_LIBLTDL_CONVENIENCE], [_LT_CONFIG_LTDL_DIR([m4_default([$1], [libltdl])]) +_LTDL_CONVENIENCE]) +m4trace:/usr/share/aclocal/ltdl.m4:81: -1- AC_DEFUN([AC_LIBLTDL_CONVENIENCE], [AC_DIAGNOSE([obsolete], [The macro `AC_LIBLTDL_CONVENIENCE' is obsolete. +You should run autoupdate.])dnl +_LT_CONFIG_LTDL_DIR([m4_default([$1], [libltdl])]) +_LTDL_CONVENIENCE]) +m4trace:/usr/share/aclocal/ltdl.m4:124: -1- AC_DEFUN([LTDL_INSTALLABLE], [AC_BEFORE([$0], [LTDL_INIT])dnl +dnl Although the argument is deprecated and no longer documented, +dnl LTDL_INSTALLABLE used to take a DIRECTORY orgument, if we have one +dnl here make sure it is the same as any other declaration of libltdl's +dnl location! This also ensures lt_ltdl_dir is set when configure.ac is +dnl not yet using an explicit LT_CONFIG_LTDL_DIR. +m4_ifval([$1], [_LT_CONFIG_LTDL_DIR([$1])])dnl +_$0() +]) +m4trace:/usr/share/aclocal/ltdl.m4:137: -1- AU_DEFUN([AC_LIBLTDL_INSTALLABLE], [_LT_CONFIG_LTDL_DIR([m4_default([$1], [libltdl])]) +_LTDL_INSTALLABLE]) +m4trace:/usr/share/aclocal/ltdl.m4:137: -1- AC_DEFUN([AC_LIBLTDL_INSTALLABLE], [AC_DIAGNOSE([obsolete], [The macro `AC_LIBLTDL_INSTALLABLE' is obsolete. +You should run autoupdate.])dnl +_LT_CONFIG_LTDL_DIR([m4_default([$1], [libltdl])]) +_LTDL_INSTALLABLE]) +m4trace:/usr/share/aclocal/ltdl.m4:213: -1- AC_DEFUN([_LT_LIBOBJ], [ + m4_pattern_allow([^_LT_LIBOBJS$]) + _LT_LIBOBJS="$_LT_LIBOBJS $1.$ac_objext" +]) +m4trace:/usr/share/aclocal/ltdl.m4:226: -1- AC_DEFUN([LTDL_INIT], [dnl Parse OPTIONS +_LT_SET_OPTIONS([$0], [$1]) + +dnl We need to keep our own list of libobjs separate from our parent project, +dnl and the easiest way to do that is redefine the AC_LIBOBJs macro while +dnl we look for our own LIBOBJs. +m4_pushdef([AC_LIBOBJ], m4_defn([_LT_LIBOBJ])) +m4_pushdef([AC_LIBSOURCES]) + +dnl If not otherwise defined, default to the 1.5.x compatible subproject mode: +m4_if(_LTDL_MODE, [], + [m4_define([_LTDL_MODE], m4_default([$2], [subproject])) + m4_if([-1], [m4_bregexp(_LTDL_MODE, [\(subproject\|\(non\)?recursive\)])], + [m4_fatal([unknown libltdl mode: ]_LTDL_MODE)])]) + +AC_ARG_WITH([included_ltdl], + [AS_HELP_STRING([--with-included-ltdl], + [use the GNU ltdl sources included here])]) + +if test "x$with_included_ltdl" != xyes; then + # We are not being forced to use the included libltdl sources, so + # decide whether there is a useful installed version we can use. + AC_CHECK_HEADER([ltdl.h], + [AC_CHECK_DECL([lt_dlinterface_register], + [AC_CHECK_LIB([ltdl], [lt_dladvise_preload], + [with_included_ltdl=no], + [with_included_ltdl=yes])], + [with_included_ltdl=yes], + [AC_INCLUDES_DEFAULT + #include ])], + [with_included_ltdl=yes], + [AC_INCLUDES_DEFAULT] + ) +fi + +dnl If neither LT_CONFIG_LTDL_DIR, LTDL_CONVENIENCE nor LTDL_INSTALLABLE +dnl was called yet, then for old times' sake, we assume libltdl is in an +dnl eponymous directory: +AC_PROVIDE_IFELSE([LT_CONFIG_LTDL_DIR], [], [_LT_CONFIG_LTDL_DIR([libltdl])]) + +AC_ARG_WITH([ltdl_include], + [AS_HELP_STRING([--with-ltdl-include=DIR], + [use the ltdl headers installed in DIR])]) + +if test -n "$with_ltdl_include"; then + if test -f "$with_ltdl_include/ltdl.h"; then : + else + AC_MSG_ERROR([invalid ltdl include directory: `$with_ltdl_include']) + fi +else + with_ltdl_include=no +fi + +AC_ARG_WITH([ltdl_lib], + [AS_HELP_STRING([--with-ltdl-lib=DIR], + [use the libltdl.la installed in DIR])]) + +if test -n "$with_ltdl_lib"; then + if test -f "$with_ltdl_lib/libltdl.la"; then : + else + AC_MSG_ERROR([invalid ltdl library directory: `$with_ltdl_lib']) + fi +else + with_ltdl_lib=no +fi + +case ,$with_included_ltdl,$with_ltdl_include,$with_ltdl_lib, in + ,yes,no,no,) + m4_case(m4_default(_LTDL_TYPE, [convenience]), + [convenience], [_LTDL_CONVENIENCE], + [installable], [_LTDL_INSTALLABLE], + [m4_fatal([unknown libltdl build type: ]_LTDL_TYPE)]) + ;; + ,no,no,no,) + # If the included ltdl is not to be used, then use the + # preinstalled libltdl we found. + AC_DEFINE([HAVE_LTDL], [1], + [Define this if a modern libltdl is already installed]) + LIBLTDL=-lltdl + LTDLDEPS= + LTDLINCL= + ;; + ,no*,no,*) + AC_MSG_ERROR([`--with-ltdl-include' and `--with-ltdl-lib' options must be used together]) + ;; + *) with_included_ltdl=no + LIBLTDL="-L$with_ltdl_lib -lltdl" + LTDLDEPS= + LTDLINCL="-I$with_ltdl_include" + ;; +esac +INCLTDL="$LTDLINCL" + +# Report our decision... +AC_MSG_CHECKING([where to find libltdl headers]) +AC_MSG_RESULT([$LTDLINCL]) +AC_MSG_CHECKING([where to find libltdl library]) +AC_MSG_RESULT([$LIBLTDL]) + +_LTDL_SETUP + +dnl restore autoconf definition. +m4_popdef([AC_LIBOBJ]) +m4_popdef([AC_LIBSOURCES]) + +AC_CONFIG_COMMANDS_PRE([ + _ltdl_libobjs= + _ltdl_ltlibobjs= + if test -n "$_LT_LIBOBJS"; then + # Remove the extension. + _lt_sed_drop_objext='s/\.o$//;s/\.obj$//' + for i in `for i in $_LT_LIBOBJS; do echo "$i"; done | sed "$_lt_sed_drop_objext" | sort -u`; do + _ltdl_libobjs="$_ltdl_libobjs $lt_libobj_prefix$i.$ac_objext" + _ltdl_ltlibobjs="$_ltdl_ltlibobjs $lt_libobj_prefix$i.lo" + done + fi + AC_SUBST([ltdl_LIBOBJS], [$_ltdl_libobjs]) + AC_SUBST([ltdl_LTLIBOBJS], [$_ltdl_ltlibobjs]) +]) + +# Only expand once: +m4_define([LTDL_INIT]) +]) +m4trace:/usr/share/aclocal/ltdl.m4:352: -1- AU_DEFUN([AC_LIB_LTDL], [LTDL_INIT($@)]) +m4trace:/usr/share/aclocal/ltdl.m4:352: -1- AC_DEFUN([AC_LIB_LTDL], [AC_DIAGNOSE([obsolete], [The macro `AC_LIB_LTDL' is obsolete. +You should run autoupdate.])dnl +LTDL_INIT($@)]) +m4trace:/usr/share/aclocal/ltdl.m4:353: -1- AU_DEFUN([AC_WITH_LTDL], [LTDL_INIT($@)]) +m4trace:/usr/share/aclocal/ltdl.m4:353: -1- AC_DEFUN([AC_WITH_LTDL], [AC_DIAGNOSE([obsolete], [The macro `AC_WITH_LTDL' is obsolete. +You should run autoupdate.])dnl +LTDL_INIT($@)]) +m4trace:/usr/share/aclocal/ltdl.m4:354: -1- AU_DEFUN([LT_WITH_LTDL], [LTDL_INIT($@)]) +m4trace:/usr/share/aclocal/ltdl.m4:354: -1- AC_DEFUN([LT_WITH_LTDL], [AC_DIAGNOSE([obsolete], [The macro `LT_WITH_LTDL' is obsolete. +You should run autoupdate.])dnl +LTDL_INIT($@)]) +m4trace:/usr/share/aclocal/ltdl.m4:367: -1- AC_DEFUN([_LTDL_SETUP], [AC_REQUIRE([AC_PROG_CC])dnl +AC_REQUIRE([LT_SYS_MODULE_EXT])dnl +AC_REQUIRE([LT_SYS_MODULE_PATH])dnl +AC_REQUIRE([LT_SYS_DLSEARCH_PATH])dnl +AC_REQUIRE([LT_LIB_DLLOAD])dnl +AC_REQUIRE([LT_SYS_SYMBOL_USCORE])dnl +AC_REQUIRE([LT_FUNC_DLSYM_USCORE])dnl +AC_REQUIRE([LT_SYS_DLOPEN_DEPLIBS])dnl +AC_REQUIRE([gl_FUNC_ARGZ])dnl + +m4_require([_LT_CHECK_OBJDIR])dnl +m4_require([_LT_HEADER_DLFCN])dnl +m4_require([_LT_CHECK_DLPREOPEN])dnl +m4_require([_LT_DECL_SED])dnl + +dnl Don't require this, or it will be expanded earlier than the code +dnl that sets the variables it relies on: +_LT_ENABLE_INSTALL + +dnl _LTDL_MODE specific code must be called at least once: +_LTDL_MODE_DISPATCH + +# In order that ltdl.c can compile, find out the first AC_CONFIG_HEADERS +# the user used. This is so that ltdl.h can pick up the parent projects +# config.h file, The first file in AC_CONFIG_HEADERS must contain the +# definitions required by ltdl.c. +# FIXME: Remove use of undocumented AC_LIST_HEADERS (2.59 compatibility). +AC_CONFIG_COMMANDS_PRE([dnl +m4_pattern_allow([^LT_CONFIG_H$])dnl +m4_ifset([AH_HEADER], + [LT_CONFIG_H=AH_HEADER], + [m4_ifset([AC_LIST_HEADERS], + [LT_CONFIG_H=`echo "AC_LIST_HEADERS" | $SED 's,^[[ ]]*,,;s,[[ :]].*$,,'`], + [])])]) +AC_SUBST([LT_CONFIG_H]) + +AC_CHECK_HEADERS([unistd.h dl.h sys/dl.h dld.h mach-o/dyld.h dirent.h], + [], [], [AC_INCLUDES_DEFAULT]) + +AC_CHECK_FUNCS([closedir opendir readdir], [], [AC_LIBOBJ([lt__dirent])]) +AC_CHECK_FUNCS([strlcat strlcpy], [], [AC_LIBOBJ([lt__strl])]) + +m4_pattern_allow([LT_LIBEXT])dnl +AC_DEFINE_UNQUOTED([LT_LIBEXT],["$libext"],[The archive extension]) + +name= +eval "lt_libprefix=\"$libname_spec\"" +m4_pattern_allow([LT_LIBPREFIX])dnl +AC_DEFINE_UNQUOTED([LT_LIBPREFIX],["$lt_libprefix"],[The archive prefix]) + +name=ltdl +eval "LTDLOPEN=\"$libname_spec\"" +AC_SUBST([LTDLOPEN]) +]) +m4trace:/usr/share/aclocal/ltdl.m4:443: -1- AC_DEFUN([LT_SYS_DLOPEN_DEPLIBS], [AC_REQUIRE([AC_CANONICAL_HOST])dnl +AC_CACHE_CHECK([whether deplibs are loaded by dlopen], + [lt_cv_sys_dlopen_deplibs], + [# PORTME does your system automatically load deplibs for dlopen? + # or its logical equivalent (e.g. shl_load for HP-UX < 11) + # For now, we just catch OSes we know something about -- in the + # future, we'll try test this programmatically. + lt_cv_sys_dlopen_deplibs=unknown + case $host_os in + aix3*|aix4.1.*|aix4.2.*) + # Unknown whether this is true for these versions of AIX, but + # we want this `case' here to explicitly catch those versions. + lt_cv_sys_dlopen_deplibs=unknown + ;; + aix[[4-9]]*) + lt_cv_sys_dlopen_deplibs=yes + ;; + amigaos*) + case $host_cpu in + powerpc) + lt_cv_sys_dlopen_deplibs=no + ;; + esac + ;; + darwin*) + # Assuming the user has installed a libdl from somewhere, this is true + # If you are looking for one http://www.opendarwin.org/projects/dlcompat + lt_cv_sys_dlopen_deplibs=yes + ;; + freebsd* | dragonfly*) + lt_cv_sys_dlopen_deplibs=yes + ;; + gnu* | linux* | k*bsd*-gnu | kopensolaris*-gnu) + # GNU and its variants, using gnu ld.so (Glibc) + lt_cv_sys_dlopen_deplibs=yes + ;; + hpux10*|hpux11*) + lt_cv_sys_dlopen_deplibs=yes + ;; + interix*) + lt_cv_sys_dlopen_deplibs=yes + ;; + irix[[12345]]*|irix6.[[01]]*) + # Catch all versions of IRIX before 6.2, and indicate that we don't + # know how it worked for any of those versions. + lt_cv_sys_dlopen_deplibs=unknown + ;; + irix*) + # The case above catches anything before 6.2, and it's known that + # at 6.2 and later dlopen does load deplibs. + lt_cv_sys_dlopen_deplibs=yes + ;; + netbsd* | netbsdelf*-gnu) + lt_cv_sys_dlopen_deplibs=yes + ;; + openbsd*) + lt_cv_sys_dlopen_deplibs=yes + ;; + osf[[1234]]*) + # dlopen did load deplibs (at least at 4.x), but until the 5.x series, + # it did *not* use an RPATH in a shared library to find objects the + # library depends on, so we explicitly say `no'. + lt_cv_sys_dlopen_deplibs=no + ;; + osf5.0|osf5.0a|osf5.1) + # dlopen *does* load deplibs and with the right loader patch applied + # it even uses RPATH in a shared library to search for shared objects + # that the library depends on, but there's no easy way to know if that + # patch is installed. Since this is the case, all we can really + # say is unknown -- it depends on the patch being installed. If + # it is, this changes to `yes'. Without it, it would be `no'. + lt_cv_sys_dlopen_deplibs=unknown + ;; + osf*) + # the two cases above should catch all versions of osf <= 5.1. Read + # the comments above for what we know about them. + # At > 5.1, deplibs are loaded *and* any RPATH in a shared library + # is used to find them so we can finally say `yes'. + lt_cv_sys_dlopen_deplibs=yes + ;; + qnx*) + lt_cv_sys_dlopen_deplibs=yes + ;; + solaris*) + lt_cv_sys_dlopen_deplibs=yes + ;; + sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) + libltdl_cv_sys_dlopen_deplibs=yes + ;; + esac + ]) +if test "$lt_cv_sys_dlopen_deplibs" != yes; then + AC_DEFINE([LTDL_DLOPEN_DEPLIBS], [1], + [Define if the OS needs help to load dependent libraries for dlopen().]) +fi +]) +m4trace:/usr/share/aclocal/ltdl.m4:542: -1- AU_DEFUN([AC_LTDL_SYS_DLOPEN_DEPLIBS], [m4_if($#, 0, [LT_SYS_DLOPEN_DEPLIBS], [LT_SYS_DLOPEN_DEPLIBS($@)])]) +m4trace:/usr/share/aclocal/ltdl.m4:542: -1- AC_DEFUN([AC_LTDL_SYS_DLOPEN_DEPLIBS], [AC_DIAGNOSE([obsolete], [The macro `AC_LTDL_SYS_DLOPEN_DEPLIBS' is obsolete. +You should run autoupdate.])dnl +m4_if($#, 0, [LT_SYS_DLOPEN_DEPLIBS], [LT_SYS_DLOPEN_DEPLIBS($@)])]) +m4trace:/usr/share/aclocal/ltdl.m4:549: -1- AC_DEFUN([LT_SYS_MODULE_EXT], [m4_require([_LT_SYS_DYNAMIC_LINKER])dnl +AC_CACHE_CHECK([which extension is used for runtime loadable modules], + [libltdl_cv_shlibext], +[ +module=yes +eval libltdl_cv_shlibext=$shrext_cmds +module=no +eval libltdl_cv_shrext=$shrext_cmds + ]) +if test -n "$libltdl_cv_shlibext"; then + m4_pattern_allow([LT_MODULE_EXT])dnl + AC_DEFINE_UNQUOTED([LT_MODULE_EXT], ["$libltdl_cv_shlibext"], + [Define to the extension used for runtime loadable modules, say, ".so".]) +fi +if test "$libltdl_cv_shrext" != "$libltdl_cv_shlibext"; then + m4_pattern_allow([LT_SHARED_EXT])dnl + AC_DEFINE_UNQUOTED([LT_SHARED_EXT], ["$libltdl_cv_shrext"], + [Define to the shared library suffix, say, ".dylib".]) +fi +]) +m4trace:/usr/share/aclocal/ltdl.m4:572: -1- AU_DEFUN([AC_LTDL_SHLIBEXT], [m4_if($#, 0, [LT_SYS_MODULE_EXT], [LT_SYS_MODULE_EXT($@)])]) +m4trace:/usr/share/aclocal/ltdl.m4:572: -1- AC_DEFUN([AC_LTDL_SHLIBEXT], [AC_DIAGNOSE([obsolete], [The macro `AC_LTDL_SHLIBEXT' is obsolete. +You should run autoupdate.])dnl +m4_if($#, 0, [LT_SYS_MODULE_EXT], [LT_SYS_MODULE_EXT($@)])]) +m4trace:/usr/share/aclocal/ltdl.m4:579: -1- AC_DEFUN([LT_SYS_MODULE_PATH], [m4_require([_LT_SYS_DYNAMIC_LINKER])dnl +AC_CACHE_CHECK([which variable specifies run-time module search path], + [lt_cv_module_path_var], [lt_cv_module_path_var="$shlibpath_var"]) +if test -n "$lt_cv_module_path_var"; then + m4_pattern_allow([LT_MODULE_PATH_VAR])dnl + AC_DEFINE_UNQUOTED([LT_MODULE_PATH_VAR], ["$lt_cv_module_path_var"], + [Define to the name of the environment variable that determines the run-time module search path.]) +fi +]) +m4trace:/usr/share/aclocal/ltdl.m4:591: -1- AU_DEFUN([AC_LTDL_SHLIBPATH], [m4_if($#, 0, [LT_SYS_MODULE_PATH], [LT_SYS_MODULE_PATH($@)])]) +m4trace:/usr/share/aclocal/ltdl.m4:591: -1- AC_DEFUN([AC_LTDL_SHLIBPATH], [AC_DIAGNOSE([obsolete], [The macro `AC_LTDL_SHLIBPATH' is obsolete. +You should run autoupdate.])dnl +m4_if($#, 0, [LT_SYS_MODULE_PATH], [LT_SYS_MODULE_PATH($@)])]) +m4trace:/usr/share/aclocal/ltdl.m4:598: -1- AC_DEFUN([LT_SYS_DLSEARCH_PATH], [m4_require([_LT_SYS_DYNAMIC_LINKER])dnl +AC_CACHE_CHECK([for the default library search path], + [lt_cv_sys_dlsearch_path], + [lt_cv_sys_dlsearch_path="$sys_lib_dlsearch_path_spec"]) +if test -n "$lt_cv_sys_dlsearch_path"; then + sys_dlsearch_path= + for dir in $lt_cv_sys_dlsearch_path; do + if test -z "$sys_dlsearch_path"; then + sys_dlsearch_path="$dir" + else + sys_dlsearch_path="$sys_dlsearch_path$PATH_SEPARATOR$dir" + fi + done + m4_pattern_allow([LT_DLSEARCH_PATH])dnl + AC_DEFINE_UNQUOTED([LT_DLSEARCH_PATH], ["$sys_dlsearch_path"], + [Define to the system default library search path.]) +fi +]) +m4trace:/usr/share/aclocal/ltdl.m4:619: -1- AU_DEFUN([AC_LTDL_SYSSEARCHPATH], [m4_if($#, 0, [LT_SYS_DLSEARCH_PATH], [LT_SYS_DLSEARCH_PATH($@)])]) +m4trace:/usr/share/aclocal/ltdl.m4:619: -1- AC_DEFUN([AC_LTDL_SYSSEARCHPATH], [AC_DIAGNOSE([obsolete], [The macro `AC_LTDL_SYSSEARCHPATH' is obsolete. +You should run autoupdate.])dnl +m4_if($#, 0, [LT_SYS_DLSEARCH_PATH], [LT_SYS_DLSEARCH_PATH($@)])]) +m4trace:/usr/share/aclocal/ltdl.m4:645: -1- AC_DEFUN([LT_LIB_DLLOAD], [m4_pattern_allow([^LT_DLLOADERS$]) +LT_DLLOADERS= +AC_SUBST([LT_DLLOADERS]) + +AC_LANG_PUSH([C]) + +LIBADD_DLOPEN= +AC_SEARCH_LIBS([dlopen], [dl], + [AC_DEFINE([HAVE_LIBDL], [1], + [Define if you have the libdl library or equivalent.]) + if test "$ac_cv_search_dlopen" != "none required" ; then + LIBADD_DLOPEN="-ldl" + fi + libltdl_cv_lib_dl_dlopen="yes" + LT_DLLOADERS="$LT_DLLOADERS ${lt_dlopen_dir+$lt_dlopen_dir/}dlopen.la"], + [AC_LINK_IFELSE([AC_LANG_PROGRAM([[#if HAVE_DLFCN_H +# include +#endif + ]], [[dlopen(0, 0);]])], + [AC_DEFINE([HAVE_LIBDL], [1], + [Define if you have the libdl library or equivalent.]) + libltdl_cv_func_dlopen="yes" + LT_DLLOADERS="$LT_DLLOADERS ${lt_dlopen_dir+$lt_dlopen_dir/}dlopen.la"], + [AC_CHECK_LIB([svld], [dlopen], + [AC_DEFINE([HAVE_LIBDL], [1], + [Define if you have the libdl library or equivalent.]) + LIBADD_DLOPEN="-lsvld" libltdl_cv_func_dlopen="yes" + LT_DLLOADERS="$LT_DLLOADERS ${lt_dlopen_dir+$lt_dlopen_dir/}dlopen.la"])])]) +if test x"$libltdl_cv_func_dlopen" = xyes || test x"$libltdl_cv_lib_dl_dlopen" = xyes +then + lt_save_LIBS="$LIBS" + LIBS="$LIBS $LIBADD_DLOPEN" + AC_CHECK_FUNCS([dlerror]) + LIBS="$lt_save_LIBS" +fi +AC_SUBST([LIBADD_DLOPEN]) + +LIBADD_SHL_LOAD= +AC_CHECK_FUNC([shl_load], + [AC_DEFINE([HAVE_SHL_LOAD], [1], + [Define if you have the shl_load function.]) + LT_DLLOADERS="$LT_DLLOADERS ${lt_dlopen_dir+$lt_dlopen_dir/}shl_load.la"], + [AC_CHECK_LIB([dld], [shl_load], + [AC_DEFINE([HAVE_SHL_LOAD], [1], + [Define if you have the shl_load function.]) + LT_DLLOADERS="$LT_DLLOADERS ${lt_dlopen_dir+$lt_dlopen_dir/}shl_load.la" + LIBADD_SHL_LOAD="-ldld"])]) +AC_SUBST([LIBADD_SHL_LOAD]) + +case $host_os in +darwin[[1567]].*) +# We only want this for pre-Mac OS X 10.4. + AC_CHECK_FUNC([_dyld_func_lookup], + [AC_DEFINE([HAVE_DYLD], [1], + [Define if you have the _dyld_func_lookup function.]) + LT_DLLOADERS="$LT_DLLOADERS ${lt_dlopen_dir+$lt_dlopen_dir/}dyld.la"]) + ;; +beos*) + LT_DLLOADERS="$LT_DLLOADERS ${lt_dlopen_dir+$lt_dlopen_dir/}load_add_on.la" + ;; +cygwin* | mingw* | os2* | pw32*) + AC_CHECK_DECLS([cygwin_conv_path], [], [], [[#include ]]) + LT_DLLOADERS="$LT_DLLOADERS ${lt_dlopen_dir+$lt_dlopen_dir/}loadlibrary.la" + ;; +esac + +AC_CHECK_LIB([dld], [dld_link], + [AC_DEFINE([HAVE_DLD], [1], + [Define if you have the GNU dld library.]) + LT_DLLOADERS="$LT_DLLOADERS ${lt_dlopen_dir+$lt_dlopen_dir/}dld_link.la"]) +AC_SUBST([LIBADD_DLD_LINK]) + +m4_pattern_allow([^LT_DLPREOPEN$]) +LT_DLPREOPEN= +if test -n "$LT_DLLOADERS" +then + for lt_loader in $LT_DLLOADERS; do + LT_DLPREOPEN="$LT_DLPREOPEN-dlpreopen $lt_loader " + done + AC_DEFINE([HAVE_LIBDLLOADER], [1], + [Define if libdlloader will be built on this platform]) +fi +AC_SUBST([LT_DLPREOPEN]) + +dnl This isn't used anymore, but set it for backwards compatibility +LIBADD_DL="$LIBADD_DLOPEN $LIBADD_SHL_LOAD" +AC_SUBST([LIBADD_DL]) + +AC_LANG_POP +]) +m4trace:/usr/share/aclocal/ltdl.m4:738: -1- AU_DEFUN([AC_LTDL_DLLIB], [m4_if($#, 0, [LT_LIB_DLLOAD], [LT_LIB_DLLOAD($@)])]) +m4trace:/usr/share/aclocal/ltdl.m4:738: -1- AC_DEFUN([AC_LTDL_DLLIB], [AC_DIAGNOSE([obsolete], [The macro `AC_LTDL_DLLIB' is obsolete. +You should run autoupdate.])dnl +m4_if($#, 0, [LT_LIB_DLLOAD], [LT_LIB_DLLOAD($@)])]) +m4trace:/usr/share/aclocal/ltdl.m4:746: -1- AC_DEFUN([LT_SYS_SYMBOL_USCORE], [m4_require([_LT_CMD_GLOBAL_SYMBOLS])dnl +AC_CACHE_CHECK([for _ prefix in compiled symbols], + [lt_cv_sys_symbol_underscore], + [lt_cv_sys_symbol_underscore=no + cat > conftest.$ac_ext <<_LT_EOF +void nm_test_func(){} +int main(){nm_test_func;return 0;} +_LT_EOF + if AC_TRY_EVAL(ac_compile); then + # Now try to grab the symbols. + ac_nlist=conftest.nm + if AC_TRY_EVAL(NM conftest.$ac_objext \| $lt_cv_sys_global_symbol_pipe \> $ac_nlist) && test -s "$ac_nlist"; then + # See whether the symbols have a leading underscore. + if grep '^. _nm_test_func' "$ac_nlist" >/dev/null; then + lt_cv_sys_symbol_underscore=yes + else + if grep '^. nm_test_func ' "$ac_nlist" >/dev/null; then + : + else + echo "configure: cannot find nm_test_func in $ac_nlist" >&AS_MESSAGE_LOG_FD + fi + fi + else + echo "configure: cannot run $lt_cv_sys_global_symbol_pipe" >&AS_MESSAGE_LOG_FD + fi + else + echo "configure: failed program was:" >&AS_MESSAGE_LOG_FD + cat conftest.c >&AS_MESSAGE_LOG_FD + fi + rm -rf conftest* + ]) + sys_symbol_underscore=$lt_cv_sys_symbol_underscore + AC_SUBST([sys_symbol_underscore]) +]) +m4trace:/usr/share/aclocal/ltdl.m4:783: -1- AU_DEFUN([AC_LTDL_SYMBOL_USCORE], [m4_if($#, 0, [LT_SYS_SYMBOL_USCORE], [LT_SYS_SYMBOL_USCORE($@)])]) +m4trace:/usr/share/aclocal/ltdl.m4:783: -1- AC_DEFUN([AC_LTDL_SYMBOL_USCORE], [AC_DIAGNOSE([obsolete], [The macro `AC_LTDL_SYMBOL_USCORE' is obsolete. +You should run autoupdate.])dnl +m4_if($#, 0, [LT_SYS_SYMBOL_USCORE], [LT_SYS_SYMBOL_USCORE($@)])]) +m4trace:/usr/share/aclocal/ltdl.m4:790: -1- AC_DEFUN([LT_FUNC_DLSYM_USCORE], [AC_REQUIRE([LT_SYS_SYMBOL_USCORE])dnl +if test x"$lt_cv_sys_symbol_underscore" = xyes; then + if test x"$libltdl_cv_func_dlopen" = xyes || + test x"$libltdl_cv_lib_dl_dlopen" = xyes ; then + AC_CACHE_CHECK([whether we have to add an underscore for dlsym], + [libltdl_cv_need_uscore], + [libltdl_cv_need_uscore=unknown + save_LIBS="$LIBS" + LIBS="$LIBS $LIBADD_DLOPEN" + _LT_TRY_DLOPEN_SELF( + [libltdl_cv_need_uscore=no], [libltdl_cv_need_uscore=yes], + [], [libltdl_cv_need_uscore=cross]) + LIBS="$save_LIBS" + ]) + fi +fi + +if test x"$libltdl_cv_need_uscore" = xyes; then + AC_DEFINE([NEED_USCORE], [1], + [Define if dlsym() requires a leading underscore in symbol names.]) +fi +]) +m4trace:/usr/share/aclocal/ltdl.m4:815: -1- AU_DEFUN([AC_LTDL_DLSYM_USCORE], [m4_if($#, 0, [LT_FUNC_DLSYM_USCORE], [LT_FUNC_DLSYM_USCORE($@)])]) +m4trace:/usr/share/aclocal/ltdl.m4:815: -1- AC_DEFUN([AC_LTDL_DLSYM_USCORE], [AC_DIAGNOSE([obsolete], [The macro `AC_LTDL_DLSYM_USCORE' is obsolete. +You should run autoupdate.])dnl +m4_if($#, 0, [LT_FUNC_DLSYM_USCORE], [LT_FUNC_DLSYM_USCORE($@)])]) +m4trace:/usr/share/aclocal/ltoptions.m4:14: -1- AC_DEFUN([LTOPTIONS_VERSION], [m4_if([1])]) +m4trace:/usr/share/aclocal/ltoptions.m4:111: -1- AU_DEFUN([AC_LIBTOOL_DLOPEN], [_LT_SET_OPTION([LT_INIT], [dlopen]) +AC_DIAGNOSE([obsolete], +[$0: Remove this warning and the call to _LT_SET_OPTION when you +put the `dlopen' option into LT_INIT's first parameter.]) +]) +m4trace:/usr/share/aclocal/ltoptions.m4:111: -1- AC_DEFUN([AC_LIBTOOL_DLOPEN], [AC_DIAGNOSE([obsolete], [The macro `AC_LIBTOOL_DLOPEN' is obsolete. +You should run autoupdate.])dnl +_LT_SET_OPTION([LT_INIT], [dlopen]) +AC_DIAGNOSE([obsolete], +[$0: Remove this warning and the call to _LT_SET_OPTION when you +put the `dlopen' option into LT_INIT's first parameter.]) +]) +m4trace:/usr/share/aclocal/ltoptions.m4:146: -1- AU_DEFUN([AC_LIBTOOL_WIN32_DLL], [AC_REQUIRE([AC_CANONICAL_HOST])dnl +_LT_SET_OPTION([LT_INIT], [win32-dll]) +AC_DIAGNOSE([obsolete], +[$0: Remove this warning and the call to _LT_SET_OPTION when you +put the `win32-dll' option into LT_INIT's first parameter.]) +]) +m4trace:/usr/share/aclocal/ltoptions.m4:146: -1- AC_DEFUN([AC_LIBTOOL_WIN32_DLL], [AC_DIAGNOSE([obsolete], [The macro `AC_LIBTOOL_WIN32_DLL' is obsolete. +You should run autoupdate.])dnl +AC_REQUIRE([AC_CANONICAL_HOST])dnl +_LT_SET_OPTION([LT_INIT], [win32-dll]) +AC_DIAGNOSE([obsolete], +[$0: Remove this warning and the call to _LT_SET_OPTION when you +put the `win32-dll' option into LT_INIT's first parameter.]) +]) +m4trace:/usr/share/aclocal/ltoptions.m4:195: -1- AC_DEFUN([AC_ENABLE_SHARED], [_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[shared]) +]) +m4trace:/usr/share/aclocal/ltoptions.m4:199: -1- AC_DEFUN([AC_DISABLE_SHARED], [_LT_SET_OPTION([LT_INIT], [disable-shared]) +]) +m4trace:/usr/share/aclocal/ltoptions.m4:203: -1- AU_DEFUN([AM_ENABLE_SHARED], [AC_ENABLE_SHARED($@)]) +m4trace:/usr/share/aclocal/ltoptions.m4:203: -1- AC_DEFUN([AM_ENABLE_SHARED], [AC_DIAGNOSE([obsolete], [The macro `AM_ENABLE_SHARED' is obsolete. +You should run autoupdate.])dnl +AC_ENABLE_SHARED($@)]) +m4trace:/usr/share/aclocal/ltoptions.m4:204: -1- AU_DEFUN([AM_DISABLE_SHARED], [AC_DISABLE_SHARED($@)]) +m4trace:/usr/share/aclocal/ltoptions.m4:204: -1- AC_DEFUN([AM_DISABLE_SHARED], [AC_DIAGNOSE([obsolete], [The macro `AM_DISABLE_SHARED' is obsolete. +You should run autoupdate.])dnl +AC_DISABLE_SHARED($@)]) +m4trace:/usr/share/aclocal/ltoptions.m4:249: -1- AC_DEFUN([AC_ENABLE_STATIC], [_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[static]) +]) +m4trace:/usr/share/aclocal/ltoptions.m4:253: -1- AC_DEFUN([AC_DISABLE_STATIC], [_LT_SET_OPTION([LT_INIT], [disable-static]) +]) +m4trace:/usr/share/aclocal/ltoptions.m4:257: -1- AU_DEFUN([AM_ENABLE_STATIC], [AC_ENABLE_STATIC($@)]) +m4trace:/usr/share/aclocal/ltoptions.m4:257: -1- AC_DEFUN([AM_ENABLE_STATIC], [AC_DIAGNOSE([obsolete], [The macro `AM_ENABLE_STATIC' is obsolete. +You should run autoupdate.])dnl +AC_ENABLE_STATIC($@)]) +m4trace:/usr/share/aclocal/ltoptions.m4:258: -1- AU_DEFUN([AM_DISABLE_STATIC], [AC_DISABLE_STATIC($@)]) +m4trace:/usr/share/aclocal/ltoptions.m4:258: -1- AC_DEFUN([AM_DISABLE_STATIC], [AC_DIAGNOSE([obsolete], [The macro `AM_DISABLE_STATIC' is obsolete. +You should run autoupdate.])dnl +AC_DISABLE_STATIC($@)]) +m4trace:/usr/share/aclocal/ltoptions.m4:303: -1- AU_DEFUN([AC_ENABLE_FAST_INSTALL], [_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[fast-install]) +AC_DIAGNOSE([obsolete], +[$0: Remove this warning and the call to _LT_SET_OPTION when you put +the `fast-install' option into LT_INIT's first parameter.]) +]) +m4trace:/usr/share/aclocal/ltoptions.m4:303: -1- AC_DEFUN([AC_ENABLE_FAST_INSTALL], [AC_DIAGNOSE([obsolete], [The macro `AC_ENABLE_FAST_INSTALL' is obsolete. +You should run autoupdate.])dnl +_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[fast-install]) +AC_DIAGNOSE([obsolete], +[$0: Remove this warning and the call to _LT_SET_OPTION when you put +the `fast-install' option into LT_INIT's first parameter.]) +]) +m4trace:/usr/share/aclocal/ltoptions.m4:310: -1- AU_DEFUN([AC_DISABLE_FAST_INSTALL], [_LT_SET_OPTION([LT_INIT], [disable-fast-install]) +AC_DIAGNOSE([obsolete], +[$0: Remove this warning and the call to _LT_SET_OPTION when you put +the `disable-fast-install' option into LT_INIT's first parameter.]) +]) +m4trace:/usr/share/aclocal/ltoptions.m4:310: -1- AC_DEFUN([AC_DISABLE_FAST_INSTALL], [AC_DIAGNOSE([obsolete], [The macro `AC_DISABLE_FAST_INSTALL' is obsolete. +You should run autoupdate.])dnl +_LT_SET_OPTION([LT_INIT], [disable-fast-install]) +AC_DIAGNOSE([obsolete], +[$0: Remove this warning and the call to _LT_SET_OPTION when you put +the `disable-fast-install' option into LT_INIT's first parameter.]) +]) +m4trace:/usr/share/aclocal/ltoptions.m4:358: -1- AU_DEFUN([AC_LIBTOOL_PICMODE], [_LT_SET_OPTION([LT_INIT], [pic-only]) +AC_DIAGNOSE([obsolete], +[$0: Remove this warning and the call to _LT_SET_OPTION when you +put the `pic-only' option into LT_INIT's first parameter.]) +]) +m4trace:/usr/share/aclocal/ltoptions.m4:358: -1- AC_DEFUN([AC_LIBTOOL_PICMODE], [AC_DIAGNOSE([obsolete], [The macro `AC_LIBTOOL_PICMODE' is obsolete. +You should run autoupdate.])dnl +_LT_SET_OPTION([LT_INIT], [pic-only]) +AC_DIAGNOSE([obsolete], +[$0: Remove this warning and the call to _LT_SET_OPTION when you +put the `pic-only' option into LT_INIT's first parameter.]) +]) +m4trace:/usr/share/aclocal/ltsugar.m4:13: -1- AC_DEFUN([LTSUGAR_VERSION], [m4_if([0.1])]) +m4trace:/usr/share/aclocal/ltversion.m4:18: -1- AC_DEFUN([LTVERSION_VERSION], [macro_version='2.4.2' +macro_revision='1.3337' +_LT_DECL(, macro_version, 0, [Which release of libtool.m4 was used?]) +_LT_DECL(, macro_revision, 0) +]) +m4trace:/usr/share/aclocal/lt~obsolete.m4:36: -1- AC_DEFUN([LTOBSOLETE_VERSION], [m4_if([1])]) +m4trace:/usr/share/aclocal/lt~obsolete.m4:40: -1- AC_DEFUN([_LT_AC_PROG_ECHO_BACKSLASH]) +m4trace:/usr/share/aclocal/lt~obsolete.m4:41: -1- AC_DEFUN([_LT_AC_SHELL_INIT]) +m4trace:/usr/share/aclocal/lt~obsolete.m4:42: -1- AC_DEFUN([_LT_AC_SYS_LIBPATH_AIX]) +m4trace:/usr/share/aclocal/lt~obsolete.m4:44: -1- AC_DEFUN([_LT_AC_TAGVAR]) +m4trace:/usr/share/aclocal/lt~obsolete.m4:45: -1- AC_DEFUN([AC_LTDL_ENABLE_INSTALL]) +m4trace:/usr/share/aclocal/lt~obsolete.m4:46: -1- AC_DEFUN([AC_LTDL_PREOPEN]) +m4trace:/usr/share/aclocal/lt~obsolete.m4:47: -1- AC_DEFUN([_LT_AC_SYS_COMPILER]) +m4trace:/usr/share/aclocal/lt~obsolete.m4:48: -1- AC_DEFUN([_LT_AC_LOCK]) +m4trace:/usr/share/aclocal/lt~obsolete.m4:49: -1- AC_DEFUN([AC_LIBTOOL_SYS_OLD_ARCHIVE]) +m4trace:/usr/share/aclocal/lt~obsolete.m4:50: -1- AC_DEFUN([_LT_AC_TRY_DLOPEN_SELF]) +m4trace:/usr/share/aclocal/lt~obsolete.m4:51: -1- AC_DEFUN([AC_LIBTOOL_PROG_CC_C_O]) +m4trace:/usr/share/aclocal/lt~obsolete.m4:52: -1- AC_DEFUN([AC_LIBTOOL_SYS_HARD_LINK_LOCKS]) +m4trace:/usr/share/aclocal/lt~obsolete.m4:53: -1- AC_DEFUN([AC_LIBTOOL_OBJDIR]) +m4trace:/usr/share/aclocal/lt~obsolete.m4:54: -1- AC_DEFUN([AC_LTDL_OBJDIR]) +m4trace:/usr/share/aclocal/lt~obsolete.m4:55: -1- AC_DEFUN([AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH]) +m4trace:/usr/share/aclocal/lt~obsolete.m4:56: -1- AC_DEFUN([AC_LIBTOOL_SYS_LIB_STRIP]) +m4trace:/usr/share/aclocal/lt~obsolete.m4:57: -1- AC_DEFUN([AC_PATH_MAGIC]) +m4trace:/usr/share/aclocal/lt~obsolete.m4:58: -1- AC_DEFUN([AC_PROG_LD_GNU]) +m4trace:/usr/share/aclocal/lt~obsolete.m4:59: -1- AC_DEFUN([AC_PROG_LD_RELOAD_FLAG]) +m4trace:/usr/share/aclocal/lt~obsolete.m4:60: -1- AC_DEFUN([AC_DEPLIBS_CHECK_METHOD]) +m4trace:/usr/share/aclocal/lt~obsolete.m4:61: -1- AC_DEFUN([AC_LIBTOOL_PROG_COMPILER_NO_RTTI]) +m4trace:/usr/share/aclocal/lt~obsolete.m4:62: -1- AC_DEFUN([AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE]) +m4trace:/usr/share/aclocal/lt~obsolete.m4:63: -1- AC_DEFUN([AC_LIBTOOL_PROG_COMPILER_PIC]) +m4trace:/usr/share/aclocal/lt~obsolete.m4:64: -1- AC_DEFUN([AC_LIBTOOL_PROG_LD_SHLIBS]) +m4trace:/usr/share/aclocal/lt~obsolete.m4:65: -1- AC_DEFUN([AC_LIBTOOL_POSTDEP_PREDEP]) +m4trace:/usr/share/aclocal/lt~obsolete.m4:66: -1- AC_DEFUN([LT_AC_PROG_EGREP]) +m4trace:/usr/share/aclocal/lt~obsolete.m4:71: -1- AC_DEFUN([_AC_PROG_LIBTOOL]) +m4trace:/usr/share/aclocal/lt~obsolete.m4:72: -1- AC_DEFUN([AC_LIBTOOL_SETUP]) +m4trace:/usr/share/aclocal/lt~obsolete.m4:73: -1- AC_DEFUN([_LT_AC_CHECK_DLFCN]) +m4trace:/usr/share/aclocal/lt~obsolete.m4:74: -1- AC_DEFUN([AC_LIBTOOL_SYS_DYNAMIC_LINKER]) +m4trace:/usr/share/aclocal/lt~obsolete.m4:75: -1- AC_DEFUN([_LT_AC_TAGCONFIG]) +m4trace:/usr/share/aclocal/lt~obsolete.m4:77: -1- AC_DEFUN([_LT_AC_LANG_CXX]) +m4trace:/usr/share/aclocal/lt~obsolete.m4:78: -1- AC_DEFUN([_LT_AC_LANG_F77]) +m4trace:/usr/share/aclocal/lt~obsolete.m4:79: -1- AC_DEFUN([_LT_AC_LANG_GCJ]) +m4trace:/usr/share/aclocal/lt~obsolete.m4:80: -1- AC_DEFUN([AC_LIBTOOL_LANG_C_CONFIG]) +m4trace:/usr/share/aclocal/lt~obsolete.m4:81: -1- AC_DEFUN([_LT_AC_LANG_C_CONFIG]) +m4trace:/usr/share/aclocal/lt~obsolete.m4:82: -1- AC_DEFUN([AC_LIBTOOL_LANG_CXX_CONFIG]) +m4trace:/usr/share/aclocal/lt~obsolete.m4:83: -1- AC_DEFUN([_LT_AC_LANG_CXX_CONFIG]) +m4trace:/usr/share/aclocal/lt~obsolete.m4:84: -1- AC_DEFUN([AC_LIBTOOL_LANG_F77_CONFIG]) +m4trace:/usr/share/aclocal/lt~obsolete.m4:85: -1- AC_DEFUN([_LT_AC_LANG_F77_CONFIG]) +m4trace:/usr/share/aclocal/lt~obsolete.m4:86: -1- AC_DEFUN([AC_LIBTOOL_LANG_GCJ_CONFIG]) +m4trace:/usr/share/aclocal/lt~obsolete.m4:87: -1- AC_DEFUN([_LT_AC_LANG_GCJ_CONFIG]) +m4trace:/usr/share/aclocal/lt~obsolete.m4:88: -1- AC_DEFUN([AC_LIBTOOL_LANG_RC_CONFIG]) +m4trace:/usr/share/aclocal/lt~obsolete.m4:89: -1- AC_DEFUN([_LT_AC_LANG_RC_CONFIG]) +m4trace:/usr/share/aclocal/lt~obsolete.m4:90: -1- AC_DEFUN([AC_LIBTOOL_CONFIG]) +m4trace:/usr/share/aclocal/lt~obsolete.m4:91: -1- AC_DEFUN([_LT_AC_FILE_LTDLL_C]) +m4trace:/usr/share/aclocal/lt~obsolete.m4:93: -1- AC_DEFUN([_LT_AC_PROG_CXXCPP]) +m4trace:/usr/share/aclocal/lt~obsolete.m4:96: -1- AC_DEFUN([_LT_PROG_F77]) +m4trace:/usr/share/aclocal/lt~obsolete.m4:97: -1- AC_DEFUN([_LT_PROG_FC]) +m4trace:/usr/share/aclocal/lt~obsolete.m4:98: -1- AC_DEFUN([_LT_PROG_CXX]) +m4trace:/usr/share/aclocal-1.11/amversion.m4:17: -1- AC_DEFUN([AM_AUTOMAKE_VERSION], [am__api_version='1.11' +dnl Some users find AM_AUTOMAKE_VERSION and mistake it for a way to +dnl require some minimum version. Point them to the right macro. +m4_if([$1], [1.11.6], [], + [AC_FATAL([Do not call $0, use AM_INIT_AUTOMAKE([$1]).])])dnl +]) +m4trace:/usr/share/aclocal-1.11/amversion.m4:36: -1- AC_DEFUN([AM_SET_CURRENT_AUTOMAKE_VERSION], [AM_AUTOMAKE_VERSION([1.11.6])dnl +m4_ifndef([AC_AUTOCONF_VERSION], + [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl +_AM_AUTOCONF_VERSION(m4_defn([AC_AUTOCONF_VERSION]))]) +m4trace:/usr/share/aclocal-1.11/auxdir.m4:49: -1- AC_DEFUN([AM_AUX_DIR_EXPAND], [dnl Rely on autoconf to set up CDPATH properly. +AC_PREREQ([2.50])dnl +# expand $ac_aux_dir to an absolute path +am_aux_dir=`cd $ac_aux_dir && pwd` +]) +m4trace:/usr/share/aclocal-1.11/cond.m4:15: -1- AC_DEFUN([AM_CONDITIONAL], [AC_PREREQ(2.52)dnl + ifelse([$1], [TRUE], [AC_FATAL([$0: invalid condition: $1])], + [$1], [FALSE], [AC_FATAL([$0: invalid condition: $1])])dnl +AC_SUBST([$1_TRUE])dnl +AC_SUBST([$1_FALSE])dnl +_AM_SUBST_NOTMAKE([$1_TRUE])dnl +_AM_SUBST_NOTMAKE([$1_FALSE])dnl +m4_define([_AM_COND_VALUE_$1], [$2])dnl +if $2; then + $1_TRUE= + $1_FALSE='#' +else + $1_TRUE='#' + $1_FALSE= +fi +AC_CONFIG_COMMANDS_PRE( +[if test -z "${$1_TRUE}" && test -z "${$1_FALSE}"; then + AC_MSG_ERROR([[conditional "$1" was never defined. +Usually this means the macro was only invoked conditionally.]]) +fi])]) +m4trace:/usr/share/aclocal-1.11/depend.m4:28: -1- AC_DEFUN([_AM_DEPENDENCIES], [AC_REQUIRE([AM_SET_DEPDIR])dnl +AC_REQUIRE([AM_OUTPUT_DEPENDENCY_COMMANDS])dnl +AC_REQUIRE([AM_MAKE_INCLUDE])dnl +AC_REQUIRE([AM_DEP_TRACK])dnl + +ifelse([$1], CC, [depcc="$CC" am_compiler_list=], + [$1], CXX, [depcc="$CXX" am_compiler_list=], + [$1], OBJC, [depcc="$OBJC" am_compiler_list='gcc3 gcc'], + [$1], UPC, [depcc="$UPC" am_compiler_list=], + [$1], GCJ, [depcc="$GCJ" am_compiler_list='gcc3 gcc'], + [depcc="$$1" am_compiler_list=]) + +AC_CACHE_CHECK([dependency style of $depcc], + [am_cv_$1_dependencies_compiler_type], +[if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then + # We make a subdir and do the tests there. Otherwise we can end up + # making bogus files that we don't know about and never remove. For + # instance it was reported that on HP-UX the gcc test will end up + # making a dummy file named `D' -- because `-MD' means `put the output + # in D'. + rm -rf conftest.dir + mkdir conftest.dir + # Copy depcomp to subdir because otherwise we won't find it if we're + # using a relative directory. + cp "$am_depcomp" conftest.dir + cd conftest.dir + # We will build objects and dependencies in a subdirectory because + # it helps to detect inapplicable dependency modes. For instance + # both Tru64's cc and ICC support -MD to output dependencies as a + # side effect of compilation, but ICC will put the dependencies in + # the current directory while Tru64 will put them in the object + # directory. + mkdir sub + + am_cv_$1_dependencies_compiler_type=none + if test "$am_compiler_list" = ""; then + am_compiler_list=`sed -n ['s/^#*\([a-zA-Z0-9]*\))$/\1/p'] < ./depcomp` + fi + am__universal=false + m4_case([$1], [CC], + [case " $depcc " in #( + *\ -arch\ *\ -arch\ *) am__universal=true ;; + esac], + [CXX], + [case " $depcc " in #( + *\ -arch\ *\ -arch\ *) am__universal=true ;; + esac]) + + for depmode in $am_compiler_list; do + # Setup a source with many dependencies, because some compilers + # like to wrap large dependency lists on column 80 (with \), and + # we should not choose a depcomp mode which is confused by this. + # + # We need to recreate these files for each test, as the compiler may + # overwrite some of them when testing with obscure command lines. + # This happens at least with the AIX C compiler. + : > sub/conftest.c + for i in 1 2 3 4 5 6; do + echo '#include "conftst'$i'.h"' >> sub/conftest.c + # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with + # Solaris 8's {/usr,}/bin/sh. + touch sub/conftst$i.h + done + echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf + + # We check with `-c' and `-o' for the sake of the "dashmstdout" + # mode. It turns out that the SunPro C++ compiler does not properly + # handle `-M -o', and we need to detect this. Also, some Intel + # versions had trouble with output in subdirs + am__obj=sub/conftest.${OBJEXT-o} + am__minus_obj="-o $am__obj" + case $depmode in + gcc) + # This depmode causes a compiler race in universal mode. + test "$am__universal" = false || continue + ;; + nosideeffect) + # after this tag, mechanisms are not by side-effect, so they'll + # only be used when explicitly requested + if test "x$enable_dependency_tracking" = xyes; then + continue + else + break + fi + ;; + msvc7 | msvc7msys | msvisualcpp | msvcmsys) + # This compiler won't grok `-c -o', but also, the minuso test has + # not run yet. These depmodes are late enough in the game, and + # so weak that their functioning should not be impacted. + am__obj=conftest.${OBJEXT-o} + am__minus_obj= + ;; + none) break ;; + esac + if depmode=$depmode \ + source=sub/conftest.c object=$am__obj \ + depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ + $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ + >/dev/null 2>conftest.err && + grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && + grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && + grep $am__obj sub/conftest.Po > /dev/null 2>&1 && + ${MAKE-make} -s -f confmf > /dev/null 2>&1; then + # icc doesn't choke on unknown options, it will just issue warnings + # or remarks (even with -Werror). So we grep stderr for any message + # that says an option was ignored or not supported. + # When given -MP, icc 7.0 and 7.1 complain thusly: + # icc: Command line warning: ignoring option '-M'; no argument required + # The diagnosis changed in icc 8.0: + # icc: Command line remark: option '-MP' not supported + if (grep 'ignoring option' conftest.err || + grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else + am_cv_$1_dependencies_compiler_type=$depmode + break + fi + fi + done + + cd .. + rm -rf conftest.dir +else + am_cv_$1_dependencies_compiler_type=none +fi +]) +AC_SUBST([$1DEPMODE], [depmode=$am_cv_$1_dependencies_compiler_type]) +AM_CONDITIONAL([am__fastdep$1], [ + test "x$enable_dependency_tracking" != xno \ + && test "$am_cv_$1_dependencies_compiler_type" = gcc3]) +]) +m4trace:/usr/share/aclocal-1.11/depend.m4:164: -1- AC_DEFUN([AM_SET_DEPDIR], [AC_REQUIRE([AM_SET_LEADING_DOT])dnl +AC_SUBST([DEPDIR], ["${am__leading_dot}deps"])dnl +]) +m4trace:/usr/share/aclocal-1.11/depend.m4:172: -1- AC_DEFUN([AM_DEP_TRACK], [AC_ARG_ENABLE(dependency-tracking, +[ --disable-dependency-tracking speeds up one-time build + --enable-dependency-tracking do not reject slow dependency extractors]) +if test "x$enable_dependency_tracking" != xno; then + am_depcomp="$ac_aux_dir/depcomp" + AMDEPBACKSLASH='\' + am__nodep='_no' +fi +AM_CONDITIONAL([AMDEP], [test "x$enable_dependency_tracking" != xno]) +AC_SUBST([AMDEPBACKSLASH])dnl +_AM_SUBST_NOTMAKE([AMDEPBACKSLASH])dnl +AC_SUBST([am__nodep])dnl +_AM_SUBST_NOTMAKE([am__nodep])dnl +]) +m4trace:/usr/share/aclocal-1.11/depout.m4:14: -1- AC_DEFUN([_AM_OUTPUT_DEPENDENCY_COMMANDS], [{ + # Autoconf 2.62 quotes --file arguments for eval, but not when files + # are listed without --file. Let's play safe and only enable the eval + # if we detect the quoting. + case $CONFIG_FILES in + *\'*) eval set x "$CONFIG_FILES" ;; + *) set x $CONFIG_FILES ;; + esac + shift + for mf + do + # Strip MF so we end up with the name of the file. + mf=`echo "$mf" | sed -e 's/:.*$//'` + # Check whether this is an Automake generated Makefile or not. + # We used to match only the files named `Makefile.in', but + # some people rename them; so instead we look at the file content. + # Grep'ing the first line is not enough: some people post-process + # each Makefile.in and add a new line on top of each file to say so. + # Grep'ing the whole file is not good either: AIX grep has a line + # limit of 2048, but all sed's we know have understand at least 4000. + if sed -n 's,^#.*generated by automake.*,X,p' "$mf" | grep X >/dev/null 2>&1; then + dirpart=`AS_DIRNAME("$mf")` + else + continue + fi + # Extract the definition of DEPDIR, am__include, and am__quote + # from the Makefile without running `make'. + DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"` + test -z "$DEPDIR" && continue + am__include=`sed -n 's/^am__include = //p' < "$mf"` + test -z "am__include" && continue + am__quote=`sed -n 's/^am__quote = //p' < "$mf"` + # When using ansi2knr, U may be empty or an underscore; expand it + U=`sed -n 's/^U = //p' < "$mf"` + # Find all dependency output files, they are included files with + # $(DEPDIR) in their names. We invoke sed twice because it is the + # simplest approach to changing $(DEPDIR) to its actual value in the + # expansion. + for file in `sed -n " + s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \ + sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g' -e 's/\$U/'"$U"'/g'`; do + # Make sure the directory exists. + test -f "$dirpart/$file" && continue + fdir=`AS_DIRNAME(["$file"])` + AS_MKDIR_P([$dirpart/$fdir]) + # echo "creating $dirpart/$file" + echo '# dummy' > "$dirpart/$file" + done + done +} +]) +m4trace:/usr/share/aclocal-1.11/depout.m4:75: -1- AC_DEFUN([AM_OUTPUT_DEPENDENCY_COMMANDS], [AC_CONFIG_COMMANDS([depfiles], + [test x"$AMDEP_TRUE" != x"" || _AM_OUTPUT_DEPENDENCY_COMMANDS], + [AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir"]) +]) +m4trace:/usr/share/aclocal-1.11/init.m4:26: -1- AC_DEFUN([AM_INIT_AUTOMAKE], [AC_PREREQ([2.62])dnl +dnl Autoconf wants to disallow AM_ names. We explicitly allow +dnl the ones we care about. +m4_pattern_allow([^AM_[A-Z]+FLAGS$])dnl +AC_REQUIRE([AM_SET_CURRENT_AUTOMAKE_VERSION])dnl +AC_REQUIRE([AC_PROG_INSTALL])dnl +if test "`cd $srcdir && pwd`" != "`pwd`"; then + # Use -I$(srcdir) only when $(srcdir) != ., so that make's output + # is not polluted with repeated "-I." + AC_SUBST([am__isrc], [' -I$(srcdir)'])_AM_SUBST_NOTMAKE([am__isrc])dnl + # test to see if srcdir already configured + if test -f $srcdir/config.status; then + AC_MSG_ERROR([source directory already configured; run "make distclean" there first]) + fi +fi + +# test whether we have cygpath +if test -z "$CYGPATH_W"; then + if (cygpath --version) >/dev/null 2>/dev/null; then + CYGPATH_W='cygpath -w' + else + CYGPATH_W=echo + fi +fi +AC_SUBST([CYGPATH_W]) + +# Define the identity of the package. +dnl Distinguish between old-style and new-style calls. +m4_ifval([$2], +[m4_ifval([$3], [_AM_SET_OPTION([no-define])])dnl + AC_SUBST([PACKAGE], [$1])dnl + AC_SUBST([VERSION], [$2])], +[_AM_SET_OPTIONS([$1])dnl +dnl Diagnose old-style AC_INIT with new-style AM_AUTOMAKE_INIT. +m4_if(m4_ifdef([AC_PACKAGE_NAME], 1)m4_ifdef([AC_PACKAGE_VERSION], 1), 11,, + [m4_fatal([AC_INIT should be called with package and version arguments])])dnl + AC_SUBST([PACKAGE], ['AC_PACKAGE_TARNAME'])dnl + AC_SUBST([VERSION], ['AC_PACKAGE_VERSION'])])dnl + +_AM_IF_OPTION([no-define],, +[AC_DEFINE_UNQUOTED(PACKAGE, "$PACKAGE", [Name of package]) + AC_DEFINE_UNQUOTED(VERSION, "$VERSION", [Version number of package])])dnl + +# Some tools Automake needs. +AC_REQUIRE([AM_SANITY_CHECK])dnl +AC_REQUIRE([AC_ARG_PROGRAM])dnl +AM_MISSING_PROG(ACLOCAL, aclocal-${am__api_version}) +AM_MISSING_PROG(AUTOCONF, autoconf) +AM_MISSING_PROG(AUTOMAKE, automake-${am__api_version}) +AM_MISSING_PROG(AUTOHEADER, autoheader) +AM_MISSING_PROG(MAKEINFO, makeinfo) +AC_REQUIRE([AM_PROG_INSTALL_SH])dnl +AC_REQUIRE([AM_PROG_INSTALL_STRIP])dnl +AC_REQUIRE([AM_PROG_MKDIR_P])dnl +# We need awk for the "check" target. The system "awk" is bad on +# some platforms. +AC_REQUIRE([AC_PROG_AWK])dnl +AC_REQUIRE([AC_PROG_MAKE_SET])dnl +AC_REQUIRE([AM_SET_LEADING_DOT])dnl +_AM_IF_OPTION([tar-ustar], [_AM_PROG_TAR([ustar])], + [_AM_IF_OPTION([tar-pax], [_AM_PROG_TAR([pax])], + [_AM_PROG_TAR([v7])])]) +_AM_IF_OPTION([no-dependencies],, +[AC_PROVIDE_IFELSE([AC_PROG_CC], + [_AM_DEPENDENCIES(CC)], + [define([AC_PROG_CC], + defn([AC_PROG_CC])[_AM_DEPENDENCIES(CC)])])dnl +AC_PROVIDE_IFELSE([AC_PROG_CXX], + [_AM_DEPENDENCIES(CXX)], + [define([AC_PROG_CXX], + defn([AC_PROG_CXX])[_AM_DEPENDENCIES(CXX)])])dnl +AC_PROVIDE_IFELSE([AC_PROG_OBJC], + [_AM_DEPENDENCIES(OBJC)], + [define([AC_PROG_OBJC], + defn([AC_PROG_OBJC])[_AM_DEPENDENCIES(OBJC)])])dnl +]) +_AM_IF_OPTION([silent-rules], [AC_REQUIRE([AM_SILENT_RULES])])dnl +dnl The `parallel-tests' driver may need to know about EXEEXT, so add the +dnl `am__EXEEXT' conditional if _AM_COMPILER_EXEEXT was seen. This macro +dnl is hooked onto _AC_COMPILER_EXEEXT early, see below. +AC_CONFIG_COMMANDS_PRE(dnl +[m4_provide_if([_AM_COMPILER_EXEEXT], + [AM_CONDITIONAL([am__EXEEXT], [test -n "$EXEEXT"])])])dnl +]) +m4trace:/usr/share/aclocal-1.11/init.m4:126: -1- AC_DEFUN([_AC_AM_CONFIG_HEADER_HOOK], [# Compute $1's index in $config_headers. +_am_arg=$1 +_am_stamp_count=1 +for _am_header in $config_headers :; do + case $_am_header in + $_am_arg | $_am_arg:* ) + break ;; + * ) + _am_stamp_count=`expr $_am_stamp_count + 1` ;; + esac +done +echo "timestamp for $_am_arg" >`AS_DIRNAME(["$_am_arg"])`/stamp-h[]$_am_stamp_count]) +m4trace:/usr/share/aclocal-1.11/install-sh.m4:14: -1- AC_DEFUN([AM_PROG_INSTALL_SH], [AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl +if test x"${install_sh}" != xset; then + case $am_aux_dir in + *\ * | *\ *) + install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;; + *) + install_sh="\${SHELL} $am_aux_dir/install-sh" + esac +fi +AC_SUBST(install_sh)]) +m4trace:/usr/share/aclocal-1.11/lead-dot.m4:12: -1- AC_DEFUN([AM_SET_LEADING_DOT], [rm -rf .tst 2>/dev/null +mkdir .tst 2>/dev/null +if test -d .tst; then + am__leading_dot=. +else + am__leading_dot=_ +fi +rmdir .tst 2>/dev/null +AC_SUBST([am__leading_dot])]) +m4trace:/usr/share/aclocal-1.11/make.m4:14: -1- AC_DEFUN([AM_MAKE_INCLUDE], [am_make=${MAKE-make} +cat > confinc << 'END' +am__doit: + @echo this is the am__doit target +.PHONY: am__doit +END +# If we don't find an include directive, just comment out the code. +AC_MSG_CHECKING([for style of include used by $am_make]) +am__include="#" +am__quote= +_am_result=none +# First try GNU make style include. +echo "include confinc" > confmf +# Ignore all kinds of additional output from `make'. +case `$am_make -s -f confmf 2> /dev/null` in #( +*the\ am__doit\ target*) + am__include=include + am__quote= + _am_result=GNU + ;; +esac +# Now try BSD make style include. +if test "$am__include" = "#"; then + echo '.include "confinc"' > confmf + case `$am_make -s -f confmf 2> /dev/null` in #( + *the\ am__doit\ target*) + am__include=.include + am__quote="\"" + _am_result=BSD + ;; + esac +fi +AC_SUBST([am__include]) +AC_SUBST([am__quote]) +AC_MSG_RESULT([$_am_result]) +rm -f confinc confmf +]) +m4trace:/usr/share/aclocal-1.11/minuso.m4:14: -1- AC_DEFUN([AM_PROG_CC_C_O], [AC_REQUIRE([AC_PROG_CC_C_O])dnl +AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl +AC_REQUIRE_AUX_FILE([compile])dnl +# FIXME: we rely on the cache variable name because +# there is no other way. +set dummy $CC +am_cc=`echo $[2] | sed ['s/[^a-zA-Z0-9_]/_/g;s/^[0-9]/_/']` +eval am_t=\$ac_cv_prog_cc_${am_cc}_c_o +if test "$am_t" != yes; then + # Losing compiler, so override with the script. + # FIXME: It is wrong to rewrite CC. + # But if we don't then we get into trouble of one sort or another. + # A longer-term fix would be to have automake use am__CC in this case, + # and then we could set am__CC="\$(top_srcdir)/compile \$(CC)" + CC="$am_aux_dir/compile $CC" +fi +dnl Make sure AC_PROG_CC is never called again, or it will override our +dnl setting of CC. +m4_define([AC_PROG_CC], + [m4_fatal([AC_PROG_CC cannot be called after AM_PROG_CC_C_O])]) +]) +m4trace:/usr/share/aclocal-1.11/missing.m4:14: -1- AC_DEFUN([AM_MISSING_PROG], [AC_REQUIRE([AM_MISSING_HAS_RUN]) +$1=${$1-"${am_missing_run}$2"} +AC_SUBST($1)]) +m4trace:/usr/share/aclocal-1.11/missing.m4:24: -1- AC_DEFUN([AM_MISSING_HAS_RUN], [AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl +AC_REQUIRE_AUX_FILE([missing])dnl +if test x"${MISSING+set}" != xset; then + case $am_aux_dir in + *\ * | *\ *) + MISSING="\${SHELL} \"$am_aux_dir/missing\"" ;; + *) + MISSING="\${SHELL} $am_aux_dir/missing" ;; + esac +fi +# Use eval to expand $SHELL +if eval "$MISSING --run true"; then + am_missing_run="$MISSING --run " +else + am_missing_run= + AC_MSG_WARN([`missing' script is too old or missing]) +fi +]) +m4trace:/usr/share/aclocal-1.11/mkdirp.m4:14: -1- AC_DEFUN([AM_PROG_MKDIR_P], [AC_PREREQ([2.60])dnl +AC_REQUIRE([AC_PROG_MKDIR_P])dnl +dnl Automake 1.8 to 1.9.6 used to define mkdir_p. We now use MKDIR_P, +dnl while keeping a definition of mkdir_p for backward compatibility. +dnl @MKDIR_P@ is magic: AC_OUTPUT adjusts its value for each Makefile. +dnl However we cannot define mkdir_p as $(MKDIR_P) for the sake of +dnl Makefile.ins that do not define MKDIR_P, so we do our own +dnl adjustment using top_builddir (which is defined more often than +dnl MKDIR_P). +AC_SUBST([mkdir_p], ["$MKDIR_P"])dnl +case $mkdir_p in + [[\\/$]]* | ?:[[\\/]]*) ;; + */*) mkdir_p="\$(top_builddir)/$mkdir_p" ;; +esac +]) +m4trace:/usr/share/aclocal-1.11/options.m4:14: -1- AC_DEFUN([_AM_MANGLE_OPTION], [[_AM_OPTION_]m4_bpatsubst($1, [[^a-zA-Z0-9_]], [_])]) +m4trace:/usr/share/aclocal-1.11/options.m4:20: -1- AC_DEFUN([_AM_SET_OPTION], [m4_define(_AM_MANGLE_OPTION([$1]), 1)]) +m4trace:/usr/share/aclocal-1.11/options.m4:26: -1- AC_DEFUN([_AM_SET_OPTIONS], [m4_foreach_w([_AM_Option], [$1], [_AM_SET_OPTION(_AM_Option)])]) +m4trace:/usr/share/aclocal-1.11/options.m4:32: -1- AC_DEFUN([_AM_IF_OPTION], [m4_ifset(_AM_MANGLE_OPTION([$1]), [$2], [$3])]) +m4trace:/usr/share/aclocal-1.11/runlog.m4:14: -1- AC_DEFUN([AM_RUN_LOG], [{ echo "$as_me:$LINENO: $1" >&AS_MESSAGE_LOG_FD + ($1) >&AS_MESSAGE_LOG_FD 2>&AS_MESSAGE_LOG_FD + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&AS_MESSAGE_LOG_FD + (exit $ac_status); }]) +m4trace:/usr/share/aclocal-1.11/sanity.m4:14: -1- AC_DEFUN([AM_SANITY_CHECK], [AC_MSG_CHECKING([whether build environment is sane]) +# Just in case +sleep 1 +echo timestamp > conftest.file +# Reject unsafe characters in $srcdir or the absolute working directory +# name. Accept space and tab only in the latter. +am_lf=' +' +case `pwd` in + *[[\\\"\#\$\&\'\`$am_lf]]*) + AC_MSG_ERROR([unsafe absolute working directory name]);; +esac +case $srcdir in + *[[\\\"\#\$\&\'\`$am_lf\ \ ]]*) + AC_MSG_ERROR([unsafe srcdir value: `$srcdir']);; +esac + +# Do `set' in a subshell so we don't clobber the current shell's +# arguments. Must try -L first in case configure is actually a +# symlink; some systems play weird games with the mod time of symlinks +# (eg FreeBSD returns the mod time of the symlink's containing +# directory). +if ( + set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null` + if test "$[*]" = "X"; then + # -L didn't work. + set X `ls -t "$srcdir/configure" conftest.file` + fi + rm -f conftest.file + if test "$[*]" != "X $srcdir/configure conftest.file" \ + && test "$[*]" != "X conftest.file $srcdir/configure"; then + + # If neither matched, then we have a broken ls. This can happen + # if, for instance, CONFIG_SHELL is bash and it inherits a + # broken ls alias from the environment. This has actually + # happened. Such a system could not be considered "sane". + AC_MSG_ERROR([ls -t appears to fail. Make sure there is not a broken +alias in your environment]) + fi + + test "$[2]" = conftest.file + ) +then + # Ok. + : +else + AC_MSG_ERROR([newly created file is older than distributed files! +Check your system clock]) +fi +AC_MSG_RESULT(yes)]) +m4trace:/usr/share/aclocal-1.11/silent.m4:14: -1- AC_DEFUN([AM_SILENT_RULES], [AC_ARG_ENABLE([silent-rules], +[ --enable-silent-rules less verbose build output (undo: `make V=1') + --disable-silent-rules verbose build output (undo: `make V=0')]) +case $enable_silent_rules in +yes) AM_DEFAULT_VERBOSITY=0;; +no) AM_DEFAULT_VERBOSITY=1;; +*) AM_DEFAULT_VERBOSITY=m4_if([$1], [yes], [0], [1]);; +esac +dnl +dnl A few `make' implementations (e.g., NonStop OS and NextStep) +dnl do not support nested variable expansions. +dnl See automake bug#9928 and bug#10237. +am_make=${MAKE-make} +AC_CACHE_CHECK([whether $am_make supports nested variables], + [am_cv_make_support_nested_variables], + [if AS_ECHO([['TRUE=$(BAR$(V)) +BAR0=false +BAR1=true +V=1 +am__doit: + @$(TRUE) +.PHONY: am__doit']]) | $am_make -f - >/dev/null 2>&1; then + am_cv_make_support_nested_variables=yes +else + am_cv_make_support_nested_variables=no +fi]) +if test $am_cv_make_support_nested_variables = yes; then + dnl Using `$V' instead of `$(V)' breaks IRIX make. + AM_V='$(V)' + AM_DEFAULT_V='$(AM_DEFAULT_VERBOSITY)' +else + AM_V=$AM_DEFAULT_VERBOSITY + AM_DEFAULT_V=$AM_DEFAULT_VERBOSITY +fi +AC_SUBST([AM_V])dnl +AM_SUBST_NOTMAKE([AM_V])dnl +AC_SUBST([AM_DEFAULT_V])dnl +AM_SUBST_NOTMAKE([AM_DEFAULT_V])dnl +AC_SUBST([AM_DEFAULT_VERBOSITY])dnl +AM_BACKSLASH='\' +AC_SUBST([AM_BACKSLASH])dnl +_AM_SUBST_NOTMAKE([AM_BACKSLASH])dnl +]) +m4trace:/usr/share/aclocal-1.11/strip.m4:19: -1- AC_DEFUN([AM_PROG_INSTALL_STRIP], [AC_REQUIRE([AM_PROG_INSTALL_SH])dnl +# Installed binaries are usually stripped using `strip' when the user +# run `make install-strip'. However `strip' might not be the right +# tool to use in cross-compilation environments, therefore Automake +# will honor the `STRIP' environment variable to overrule this program. +dnl Don't test for $cross_compiling = yes, because it might be `maybe'. +if test "$cross_compiling" != no; then + AC_CHECK_TOOL([STRIP], [strip], :) +fi +INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s" +AC_SUBST([INSTALL_STRIP_PROGRAM])]) +m4trace:/usr/share/aclocal-1.11/substnot.m4:14: -1- AC_DEFUN([_AM_SUBST_NOTMAKE]) +m4trace:/usr/share/aclocal-1.11/substnot.m4:19: -1- AC_DEFUN([AM_SUBST_NOTMAKE], [_AM_SUBST_NOTMAKE($@)]) +m4trace:/usr/share/aclocal-1.11/tar.m4:24: -1- AC_DEFUN([_AM_PROG_TAR], [# Always define AMTAR for backward compatibility. Yes, it's still used +# in the wild :-( We should find a proper way to deprecate it ... +AC_SUBST([AMTAR], ['$${TAR-tar}']) +m4_if([$1], [v7], + [am__tar='$${TAR-tar} chof - "$$tardir"' am__untar='$${TAR-tar} xf -'], + [m4_case([$1], [ustar],, [pax],, + [m4_fatal([Unknown tar format])]) +AC_MSG_CHECKING([how to create a $1 tar archive]) +# Loop over all known methods to create a tar archive until one works. +_am_tools='gnutar m4_if([$1], [ustar], [plaintar]) pax cpio none' +_am_tools=${am_cv_prog_tar_$1-$_am_tools} +# Do not fold the above two line into one, because Tru64 sh and +# Solaris sh will not grok spaces in the rhs of `-'. +for _am_tool in $_am_tools +do + case $_am_tool in + gnutar) + for _am_tar in tar gnutar gtar; + do + AM_RUN_LOG([$_am_tar --version]) && break + done + am__tar="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$$tardir"' + am__tar_="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$tardir"' + am__untar="$_am_tar -xf -" + ;; + plaintar) + # Must skip GNU tar: if it does not support --format= it doesn't create + # ustar tarball either. + (tar --version) >/dev/null 2>&1 && continue + am__tar='tar chf - "$$tardir"' + am__tar_='tar chf - "$tardir"' + am__untar='tar xf -' + ;; + pax) + am__tar='pax -L -x $1 -w "$$tardir"' + am__tar_='pax -L -x $1 -w "$tardir"' + am__untar='pax -r' + ;; + cpio) + am__tar='find "$$tardir" -print | cpio -o -H $1 -L' + am__tar_='find "$tardir" -print | cpio -o -H $1 -L' + am__untar='cpio -i -H $1 -d' + ;; + none) + am__tar=false + am__tar_=false + am__untar=false + ;; + esac + + # If the value was cached, stop now. We just wanted to have am__tar + # and am__untar set. + test -n "${am_cv_prog_tar_$1}" && break + + # tar/untar a dummy directory, and stop if the command works + rm -rf conftest.dir + mkdir conftest.dir + echo GrepMe > conftest.dir/file + AM_RUN_LOG([tardir=conftest.dir && eval $am__tar_ >conftest.tar]) + rm -rf conftest.dir + if test -s conftest.tar; then + AM_RUN_LOG([$am__untar /dev/null 2>&1 && break + fi +done +rm -rf conftest.dir + +AC_CACHE_VAL([am_cv_prog_tar_$1], [am_cv_prog_tar_$1=$_am_tool]) +AC_MSG_RESULT([$am_cv_prog_tar_$1])]) +AC_SUBST([am__tar]) +AC_SUBST([am__untar]) +]) +m4trace:acinclude.m4:43: -1- AC_DEFUN([DX_FEATURE_doc], [ON]) +m4trace:acinclude.m4:44: -1- AC_DEFUN([DX_FEATURE_dot], [ON]) +m4trace:acinclude.m4:45: -1- AC_DEFUN([DX_FEATURE_man], [OFF]) +m4trace:acinclude.m4:46: -1- AC_DEFUN([DX_FEATURE_html], [ON]) +m4trace:acinclude.m4:47: -1- AC_DEFUN([DX_FEATURE_chm], [OFF]) +m4trace:acinclude.m4:48: -1- AC_DEFUN([DX_FEATURE_chi], [OFF]) +m4trace:acinclude.m4:49: -1- AC_DEFUN([DX_FEATURE_rtf], [OFF]) +m4trace:acinclude.m4:50: -1- AC_DEFUN([DX_FEATURE_xml], [OFF]) +m4trace:acinclude.m4:51: -1- AC_DEFUN([DX_FEATURE_pdf], [ON]) +m4trace:acinclude.m4:52: -1- AC_DEFUN([DX_FEATURE_ps], [ON]) +m4trace:acinclude.m4:61: -1- AC_DEFUN([DX_ENV_APPEND], [AC_SUBST([DX_ENV], ["$DX_ENV $1='$2'"])]) +m4trace:acinclude.m4:66: -1- AC_DEFUN([DX_DIRNAME_EXPR], [[expr ".$1" : '\(\.\)[^/]*$' \| "x$1" : 'x\(.*\)/[^/]*$']]) +m4trace:acinclude.m4:72: -1- AC_DEFUN([DX_IF_FEATURE], [ifelse(DX_FEATURE_$1, ON, [$2], [$3])]) +m4trace:acinclude.m4:77: -1- AC_DEFUN([DX_REQUIRE_PROG], [ +AC_PATH_TOOL([$1], [$2]) +if test "$DX_FLAG_$[DX_CURRENT_FEATURE$$1]" = 1; then + AC_MSG_WARN([$2 not found - will not DX_CURRENT_DESCRIPTION]) + AC_SUBST([DX_FLAG_]DX_CURRENT_FEATURE, 0) +fi +]) +m4trace:acinclude.m4:88: -1- AC_DEFUN([DX_TEST_FEATURE], [test "$DX_FLAG_$1" = 1]) +m4trace:acinclude.m4:94: -1- AC_DEFUN([DX_CHECK_DEPEND], [ +test "$DX_FLAG_$1" = "$2" \ +|| AC_MSG_ERROR([doxygen-DX_CURRENT_FEATURE ifelse([$2], 1, + requires, contradicts) doxygen-DX_CURRENT_FEATURE]) +]) +m4trace:acinclude.m4:103: -1- AC_DEFUN([DX_CLEAR_DEPEND], [ +test "$DX_FLAG_$1" = "$2" || AC_SUBST([DX_FLAG_]DX_CURRENT_FEATURE, 0) +]) +m4trace:acinclude.m4:117: -1- AC_DEFUN([DX_ARG_ABLE], [ + AC_DEFUN([DX_CURRENT_FEATURE], [$1]) + AC_DEFUN([DX_CURRENT_DESCRIPTION], [$2]) + AC_ARG_ENABLE(doxygen-$1, + [AS_HELP_STRING(DX_IF_FEATURE([$1], [--disable-doxygen-$1], + [--enable-doxygen-$1]), + DX_IF_FEATURE([$1], [don't $2], [$2]))], + [ +case "$enableval" in +#( +y|Y|yes|Yes|YES) + AC_SUBST([DX_FLAG_$1], 1) + $3 +;; #( +n|N|no|No|NO) + AC_SUBST([DX_FLAG_$1], 0) +;; #( +*) + AC_MSG_ERROR([invalid value '$enableval' given to doxygen-$1]) +;; +esac +], [ +AC_SUBST([DX_FLAG_$1], [DX_IF_FEATURE([$1], 1, 0)]) +$4 +]) +if DX_TEST_FEATURE([$1]); then + $5 + : +fi +if DX_TEST_FEATURE([$1]); then + AM_CONDITIONAL(DX_COND_$1, :) + $6 + : +else + AM_CONDITIONAL(DX_COND_$1, false) + $7 + : +fi +]) +m4trace:acinclude.m4:163: -1- AC_DEFUN([DX_DOXYGEN_FEATURE], [AC_DEFUN([DX_FEATURE_doc], [$1])]) +m4trace:acinclude.m4:164: -1- AC_DEFUN([DX_MAN_FEATURE], [AC_DEFUN([DX_FEATURE_man], [$1])]) +m4trace:acinclude.m4:165: -1- AC_DEFUN([DX_HTML_FEATURE], [AC_DEFUN([DX_FEATURE_html], [$1])]) +m4trace:acinclude.m4:166: -1- AC_DEFUN([DX_CHM_FEATURE], [AC_DEFUN([DX_FEATURE_chm], [$1])]) +m4trace:acinclude.m4:167: -1- AC_DEFUN([DX_CHI_FEATURE], [AC_DEFUN([DX_FEATURE_chi], [$1])]) +m4trace:acinclude.m4:168: -1- AC_DEFUN([DX_RTF_FEATURE], [AC_DEFUN([DX_FEATURE_rtf], [$1])]) +m4trace:acinclude.m4:169: -1- AC_DEFUN([DX_XML_FEATURE], [AC_DEFUN([DX_FEATURE_xml], [$1])]) +m4trace:acinclude.m4:170: -1- AC_DEFUN([DX_XML_FEATURE], [AC_DEFUN([DX_FEATURE_xml], [$1])]) +m4trace:acinclude.m4:171: -1- AC_DEFUN([DX_PDF_FEATURE], [AC_DEFUN([DX_FEATURE_pdf], [$1])]) +m4trace:acinclude.m4:172: -1- AC_DEFUN([DX_PS_FEATURE], [AC_DEFUN([DX_FEATURE_ps], [$1])]) +m4trace:acinclude.m4:178: -1- AC_DEFUN([DX_INIT_DOXYGEN], [ + +# Files: +AC_SUBST([DX_PROJECT], [$1]) +AC_SUBST([DX_CONFIG], [ifelse([$2], [], Doxyfile, [$2])]) +AC_SUBST([DX_DOCDIR], [ifelse([$3], [], doxygen-doc, [$3])]) + +# Environment variables used inside doxygen.cfg: +DX_ENV_APPEND(SRCDIR, $srcdir) +DX_ENV_APPEND(PROJECT, $DX_PROJECT) +DX_ENV_APPEND(DOCDIR, $DX_DOCDIR) +DX_ENV_APPEND(VERSION, $PACKAGE_VERSION) + +# Doxygen itself: +DX_ARG_ABLE(doc, [generate any doxygen documentation], + [], + [], + [DX_REQUIRE_PROG([DX_DOXYGEN], doxygen) + DX_REQUIRE_PROG([DX_PERL], perl)], + [DX_ENV_APPEND(PERL_PATH, $DX_PERL)]) + +# Dot for graphics: +DX_ARG_ABLE(dot, [generate graphics for doxygen documentation], + [DX_CHECK_DEPEND(doc, 1)], + [DX_CLEAR_DEPEND(doc, 1)], + [DX_REQUIRE_PROG([DX_DOT], dot)], + [DX_ENV_APPEND(HAVE_DOT, YES) + DX_ENV_APPEND(DOT_PATH, [`DX_DIRNAME_EXPR($DX_DOT)`])], + [DX_ENV_APPEND(HAVE_DOT, NO)]) + +# Man pages generation: +DX_ARG_ABLE(man, [generate doxygen manual pages], + [DX_CHECK_DEPEND(doc, 1)], + [DX_CLEAR_DEPEND(doc, 1)], + [], + [DX_ENV_APPEND(GENERATE_MAN, YES)], + [DX_ENV_APPEND(GENERATE_MAN, NO)]) + +# RTF file generation: +DX_ARG_ABLE(rtf, [generate doxygen RTF documentation], + [DX_CHECK_DEPEND(doc, 1)], + [DX_CLEAR_DEPEND(doc, 1)], + [], + [DX_ENV_APPEND(GENERATE_RTF, YES)], + [DX_ENV_APPEND(GENERATE_RTF, NO)]) + +# XML file generation: +DX_ARG_ABLE(xml, [generate doxygen XML documentation], + [DX_CHECK_DEPEND(doc, 1)], + [DX_CLEAR_DEPEND(doc, 1)], + [], + [DX_ENV_APPEND(GENERATE_XML, YES)], + [DX_ENV_APPEND(GENERATE_XML, NO)]) + +# (Compressed) HTML help generation: +DX_ARG_ABLE(chm, [generate doxygen compressed HTML help documentation], + [DX_CHECK_DEPEND(doc, 1)], + [DX_CLEAR_DEPEND(doc, 1)], + [DX_REQUIRE_PROG([DX_HHC], hhc)], + [DX_ENV_APPEND(HHC_PATH, $DX_HHC) + DX_ENV_APPEND(GENERATE_HTML, YES) + DX_ENV_APPEND(GENERATE_HTMLHELP, YES)], + [DX_ENV_APPEND(GENERATE_HTMLHELP, NO)]) + +# Seperate CHI file generation. +DX_ARG_ABLE(chi, [generate doxygen seperate compressed HTML help index file], + [DX_CHECK_DEPEND(chm, 1)], + [DX_CLEAR_DEPEND(chm, 1)], + [], + [DX_ENV_APPEND(GENERATE_CHI, YES)], + [DX_ENV_APPEND(GENERATE_CHI, NO)]) + +# Plain HTML pages generation: +DX_ARG_ABLE(html, [generate doxygen plain HTML documentation], + [DX_CHECK_DEPEND(doc, 1) DX_CHECK_DEPEND(chm, 0)], + [DX_CLEAR_DEPEND(doc, 1) DX_CLEAR_DEPEND(chm, 0)], + [], + [DX_ENV_APPEND(GENERATE_HTML, YES)], + [DX_TEST_FEATURE(chm) || DX_ENV_APPEND(GENERATE_HTML, NO)]) + +# PostScript file generation: +DX_ARG_ABLE(ps, [generate doxygen PostScript documentation], + [DX_CHECK_DEPEND(doc, 1)], + [DX_CLEAR_DEPEND(doc, 1)], + [DX_REQUIRE_PROG([DX_LATEX], latex) + DX_REQUIRE_PROG([DX_MAKEINDEX], makeindex) + DX_REQUIRE_PROG([DX_DVIPS], dvips) + DX_REQUIRE_PROG([DX_EGREP], egrep)]) + +# PDF file generation: +DX_ARG_ABLE(pdf, [generate doxygen PDF documentation], + [DX_CHECK_DEPEND(doc, 1)], + [DX_CLEAR_DEPEND(doc, 1)], + [DX_REQUIRE_PROG([DX_PDFLATEX], pdflatex) + DX_REQUIRE_PROG([DX_MAKEINDEX], makeindex) + DX_REQUIRE_PROG([DX_EGREP], egrep)]) + +# LaTeX generation for PS and/or PDF: +if DX_TEST_FEATURE(ps) || DX_TEST_FEATURE(pdf); then + AM_CONDITIONAL(DX_COND_latex, :) + DX_ENV_APPEND(GENERATE_LATEX, YES) +else + AM_CONDITIONAL(DX_COND_latex, false) + DX_ENV_APPEND(GENERATE_LATEX, NO) +fi + +# Paper size for PS and/or PDF: +AC_ARG_VAR(DOXYGEN_PAPER_SIZE, + [a4wide (default), a4, letter, legal or executive]) +case "$DOXYGEN_PAPER_SIZE" in +#( +"") + AC_SUBST(DOXYGEN_PAPER_SIZE, "") +;; #( +a4wide|a4|letter|legal|executive) + DX_ENV_APPEND(PAPER_SIZE, $DOXYGEN_PAPER_SIZE) +;; #( +*) + AC_MSG_ERROR([unknown DOXYGEN_PAPER_SIZE='$DOXYGEN_PAPER_SIZE']) +;; +esac + +#For debugging: +#echo DX_FLAG_doc=$DX_FLAG_doc +#echo DX_FLAG_dot=$DX_FLAG_dot +#echo DX_FLAG_man=$DX_FLAG_man +#echo DX_FLAG_html=$DX_FLAG_html +#echo DX_FLAG_chm=$DX_FLAG_chm +#echo DX_FLAG_chi=$DX_FLAG_chi +#echo DX_FLAG_rtf=$DX_FLAG_rtf +#echo DX_FLAG_xml=$DX_FLAG_xml +#echo DX_FLAG_pdf=$DX_FLAG_pdf +#echo DX_FLAG_ps=$DX_FLAG_ps +#echo DX_ENV=$DX_ENV +]) +m4trace:configure.ac:6: -1- m4_pattern_forbid([^_?A[CHUM]_]) +m4trace:configure.ac:6: -1- m4_pattern_forbid([_AC_]) +m4trace:configure.ac:6: -1- m4_pattern_forbid([^LIBOBJS$], [do not use LIBOBJS directly, use AC_LIBOBJ (see section `AC_LIBOBJ vs LIBOBJS']) +m4trace:configure.ac:6: -1- m4_pattern_allow([^AS_FLAGS$]) +m4trace:configure.ac:6: -1- m4_pattern_forbid([^_?m4_]) +m4trace:configure.ac:6: -1- m4_pattern_forbid([^dnl$]) +m4trace:configure.ac:6: -1- m4_pattern_forbid([^_?AS_]) +m4trace:configure.ac:6: -1- m4_pattern_allow([^SHELL$]) +m4trace:configure.ac:6: -1- m4_pattern_allow([^PATH_SEPARATOR$]) +m4trace:configure.ac:6: -1- m4_pattern_allow([^PACKAGE_NAME$]) +m4trace:configure.ac:6: -1- m4_pattern_allow([^PACKAGE_TARNAME$]) +m4trace:configure.ac:6: -1- m4_pattern_allow([^PACKAGE_VERSION$]) +m4trace:configure.ac:6: -1- m4_pattern_allow([^PACKAGE_STRING$]) +m4trace:configure.ac:6: -1- m4_pattern_allow([^PACKAGE_BUGREPORT$]) +m4trace:configure.ac:6: -1- m4_pattern_allow([^PACKAGE_URL$]) +m4trace:configure.ac:6: -1- m4_pattern_allow([^exec_prefix$]) +m4trace:configure.ac:6: -1- m4_pattern_allow([^prefix$]) +m4trace:configure.ac:6: -1- m4_pattern_allow([^program_transform_name$]) +m4trace:configure.ac:6: -1- m4_pattern_allow([^bindir$]) +m4trace:configure.ac:6: -1- m4_pattern_allow([^sbindir$]) +m4trace:configure.ac:6: -1- m4_pattern_allow([^libexecdir$]) +m4trace:configure.ac:6: -1- m4_pattern_allow([^datarootdir$]) +m4trace:configure.ac:6: -1- m4_pattern_allow([^datadir$]) +m4trace:configure.ac:6: -1- m4_pattern_allow([^sysconfdir$]) +m4trace:configure.ac:6: -1- m4_pattern_allow([^sharedstatedir$]) +m4trace:configure.ac:6: -1- m4_pattern_allow([^localstatedir$]) +m4trace:configure.ac:6: -1- m4_pattern_allow([^includedir$]) +m4trace:configure.ac:6: -1- m4_pattern_allow([^oldincludedir$]) +m4trace:configure.ac:6: -1- m4_pattern_allow([^docdir$]) +m4trace:configure.ac:6: -1- m4_pattern_allow([^infodir$]) +m4trace:configure.ac:6: -1- m4_pattern_allow([^htmldir$]) +m4trace:configure.ac:6: -1- m4_pattern_allow([^dvidir$]) +m4trace:configure.ac:6: -1- m4_pattern_allow([^pdfdir$]) +m4trace:configure.ac:6: -1- m4_pattern_allow([^psdir$]) +m4trace:configure.ac:6: -1- m4_pattern_allow([^libdir$]) +m4trace:configure.ac:6: -1- m4_pattern_allow([^localedir$]) +m4trace:configure.ac:6: -1- m4_pattern_allow([^mandir$]) +m4trace:configure.ac:6: -1- m4_pattern_allow([^PACKAGE_NAME$]) +m4trace:configure.ac:6: -1- m4_pattern_allow([^PACKAGE_TARNAME$]) +m4trace:configure.ac:6: -1- m4_pattern_allow([^PACKAGE_VERSION$]) +m4trace:configure.ac:6: -1- m4_pattern_allow([^PACKAGE_STRING$]) +m4trace:configure.ac:6: -1- m4_pattern_allow([^PACKAGE_BUGREPORT$]) +m4trace:configure.ac:6: -1- m4_pattern_allow([^PACKAGE_URL$]) +m4trace:configure.ac:6: -1- m4_pattern_allow([^DEFS$]) +m4trace:configure.ac:6: -1- m4_pattern_allow([^ECHO_C$]) +m4trace:configure.ac:6: -1- m4_pattern_allow([^ECHO_N$]) +m4trace:configure.ac:6: -1- m4_pattern_allow([^ECHO_T$]) +m4trace:configure.ac:6: -1- m4_pattern_allow([^LIBS$]) +m4trace:configure.ac:6: -1- m4_pattern_allow([^build_alias$]) +m4trace:configure.ac:6: -1- m4_pattern_allow([^host_alias$]) +m4trace:configure.ac:6: -1- m4_pattern_allow([^target_alias$]) +m4trace:configure.ac:14: -1- DX_HTML_FEATURE([ON]) +m4trace:configure.ac:14: -1- AC_DEFUN([DX_FEATURE_html], [ON]) +m4trace:configure.ac:15: -1- DX_CHM_FEATURE([OFF]) +m4trace:configure.ac:15: -1- AC_DEFUN([DX_FEATURE_chm], [OFF]) +m4trace:configure.ac:16: -1- DX_CHI_FEATURE([OFF]) +m4trace:configure.ac:16: -1- AC_DEFUN([DX_FEATURE_chi], [OFF]) +m4trace:configure.ac:17: -1- DX_MAN_FEATURE([OFF]) +m4trace:configure.ac:17: -1- AC_DEFUN([DX_FEATURE_man], [OFF]) +m4trace:configure.ac:18: -1- DX_RTF_FEATURE([OFF]) +m4trace:configure.ac:18: -1- AC_DEFUN([DX_FEATURE_rtf], [OFF]) +m4trace:configure.ac:19: -1- DX_XML_FEATURE([OFF]) +m4trace:configure.ac:19: -1- AC_DEFUN([DX_FEATURE_xml], [OFF]) +m4trace:configure.ac:20: -1- DX_PDF_FEATURE([OFF]) +m4trace:configure.ac:20: -1- AC_DEFUN([DX_FEATURE_pdf], [OFF]) +m4trace:configure.ac:21: -1- DX_PS_FEATURE([OFF]) +m4trace:configure.ac:21: -1- AC_DEFUN([DX_FEATURE_ps], [OFF]) +m4trace:configure.ac:22: -1- DX_INIT_DOXYGEN([zookeeper], [c-doc.Doxyfile], [docs]) +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_PROJECT$]) +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_CONFIG$]) +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_DOCDIR$]) +m4trace:configure.ac:22: -1- DX_ENV_APPEND([SRCDIR], [$srcdir]) +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_ENV$]) +m4trace:configure.ac:22: -1- DX_ENV_APPEND([PROJECT], [$DX_PROJECT]) +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_ENV$]) +m4trace:configure.ac:22: -1- DX_ENV_APPEND([DOCDIR], [$DX_DOCDIR]) +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_ENV$]) +m4trace:configure.ac:22: -1- DX_ENV_APPEND([VERSION], [$PACKAGE_VERSION]) +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_ENV$]) +m4trace:configure.ac:22: -1- DX_ARG_ABLE([doc], [generate any doxygen documentation], [], [], [DX_REQUIRE_PROG([DX_DOXYGEN], doxygen) + DX_REQUIRE_PROG([DX_PERL], perl)], [DX_ENV_APPEND(PERL_PATH, $DX_PERL)]) +m4trace:configure.ac:22: -1- AC_DEFUN([DX_CURRENT_FEATURE], [doc]) +m4trace:configure.ac:22: -1- AC_DEFUN([DX_CURRENT_DESCRIPTION], [generate any doxygen documentation]) +m4trace:configure.ac:22: -2- DX_IF_FEATURE([doc], [--disable-doxygen-doc], [--enable-doxygen-doc]) +m4trace:configure.ac:22: -3- DX_FEATURE_doc +m4trace:configure.ac:22: -2- DX_IF_FEATURE([doc], [don't generate any doxygen documentation], [generate any doxygen documentation]) +m4trace:configure.ac:22: -3- DX_FEATURE_doc +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_FLAG_doc$]) +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_FLAG_doc$]) +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_FLAG_doc$]) +m4trace:configure.ac:22: -1- DX_IF_FEATURE([doc], [1], [0]) +m4trace:configure.ac:22: -2- DX_FEATURE_doc +m4trace:configure.ac:22: -1- DX_TEST_FEATURE([doc]) +m4trace:configure.ac:22: -1- DX_REQUIRE_PROG([DX_DOXYGEN], [doxygen]) +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_DOXYGEN$]) +m4trace:configure.ac:22: -1- DX_CURRENT_DESCRIPTION +m4trace:configure.ac:22: -1- DX_CURRENT_DESCRIPTION +m4trace:configure.ac:22: -2- DX_CURRENT_FEATURE +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_FLAG_doc$]) +m4trace:configure.ac:22: -1- DX_REQUIRE_PROG([DX_PERL], [perl]) +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_PERL$]) +m4trace:configure.ac:22: -1- DX_CURRENT_DESCRIPTION +m4trace:configure.ac:22: -1- DX_CURRENT_DESCRIPTION +m4trace:configure.ac:22: -2- DX_CURRENT_FEATURE +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_FLAG_doc$]) +m4trace:configure.ac:22: -1- DX_TEST_FEATURE([doc]) +m4trace:configure.ac:22: -1- AM_CONDITIONAL([DX_COND_doc], [:]) +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_COND_doc_TRUE$]) +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_COND_doc_FALSE$]) +m4trace:configure.ac:22: -1- _AM_SUBST_NOTMAKE([DX_COND_doc_TRUE]) +m4trace:configure.ac:22: -1- _AM_SUBST_NOTMAKE([DX_COND_doc_FALSE]) +m4trace:configure.ac:22: -1- DX_ENV_APPEND([PERL_PATH], [$DX_PERL]) +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_ENV$]) +m4trace:configure.ac:22: -1- AM_CONDITIONAL([DX_COND_doc], [false]) +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_COND_doc_TRUE$]) +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_COND_doc_FALSE$]) +m4trace:configure.ac:22: -1- _AM_SUBST_NOTMAKE([DX_COND_doc_TRUE]) +m4trace:configure.ac:22: -1- _AM_SUBST_NOTMAKE([DX_COND_doc_FALSE]) +m4trace:configure.ac:22: -1- DX_ARG_ABLE([dot], [generate graphics for doxygen documentation], [DX_CHECK_DEPEND(doc, 1)], [DX_CLEAR_DEPEND(doc, 1)], [DX_REQUIRE_PROG([DX_DOT], dot)], [DX_ENV_APPEND(HAVE_DOT, YES) + DX_ENV_APPEND(DOT_PATH, [`DX_DIRNAME_EXPR($DX_DOT)`])], [DX_ENV_APPEND(HAVE_DOT, NO)]) +m4trace:configure.ac:22: -1- AC_DEFUN([DX_CURRENT_FEATURE], [dot]) +m4trace:configure.ac:22: -1- AC_DEFUN([DX_CURRENT_DESCRIPTION], [generate graphics for doxygen documentation]) +m4trace:configure.ac:22: -2- DX_IF_FEATURE([dot], [--disable-doxygen-dot], [--enable-doxygen-dot]) +m4trace:configure.ac:22: -3- DX_FEATURE_dot +m4trace:configure.ac:22: -2- DX_IF_FEATURE([dot], [don't generate graphics for doxygen documentation], [generate graphics for doxygen documentation]) +m4trace:configure.ac:22: -3- DX_FEATURE_dot +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_FLAG_dot$]) +m4trace:configure.ac:22: -1- DX_CHECK_DEPEND([doc], [1]) +m4trace:configure.ac:22: -1- DX_CURRENT_FEATURE +m4trace:configure.ac:22: -1- DX_CURRENT_FEATURE +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_FLAG_dot$]) +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_FLAG_dot$]) +m4trace:configure.ac:22: -1- DX_IF_FEATURE([dot], [1], [0]) +m4trace:configure.ac:22: -2- DX_FEATURE_dot +m4trace:configure.ac:22: -1- DX_CLEAR_DEPEND([doc], [1]) +m4trace:configure.ac:22: -2- DX_CURRENT_FEATURE +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_FLAG_dot$]) +m4trace:configure.ac:22: -1- DX_TEST_FEATURE([dot]) +m4trace:configure.ac:22: -1- DX_REQUIRE_PROG([DX_DOT], [dot]) +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_DOT$]) +m4trace:configure.ac:22: -1- DX_CURRENT_DESCRIPTION +m4trace:configure.ac:22: -1- DX_CURRENT_DESCRIPTION +m4trace:configure.ac:22: -2- DX_CURRENT_FEATURE +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_FLAG_dot$]) +m4trace:configure.ac:22: -1- DX_TEST_FEATURE([dot]) +m4trace:configure.ac:22: -1- AM_CONDITIONAL([DX_COND_dot], [:]) +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_COND_dot_TRUE$]) +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_COND_dot_FALSE$]) +m4trace:configure.ac:22: -1- _AM_SUBST_NOTMAKE([DX_COND_dot_TRUE]) +m4trace:configure.ac:22: -1- _AM_SUBST_NOTMAKE([DX_COND_dot_FALSE]) +m4trace:configure.ac:22: -1- DX_ENV_APPEND([HAVE_DOT], [YES]) +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_ENV$]) +m4trace:configure.ac:22: -1- DX_ENV_APPEND([DOT_PATH], [`DX_DIRNAME_EXPR($DX_DOT)`]) +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_ENV$]) +m4trace:configure.ac:22: -1- DX_DIRNAME_EXPR([$DX_DOT]) +m4trace:configure.ac:22: -1- AM_CONDITIONAL([DX_COND_dot], [false]) +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_COND_dot_TRUE$]) +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_COND_dot_FALSE$]) +m4trace:configure.ac:22: -1- _AM_SUBST_NOTMAKE([DX_COND_dot_TRUE]) +m4trace:configure.ac:22: -1- _AM_SUBST_NOTMAKE([DX_COND_dot_FALSE]) +m4trace:configure.ac:22: -1- DX_ENV_APPEND([HAVE_DOT], [NO]) +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_ENV$]) +m4trace:configure.ac:22: -1- DX_ARG_ABLE([man], [generate doxygen manual pages], [DX_CHECK_DEPEND(doc, 1)], [DX_CLEAR_DEPEND(doc, 1)], [], [DX_ENV_APPEND(GENERATE_MAN, YES)], [DX_ENV_APPEND(GENERATE_MAN, NO)]) +m4trace:configure.ac:22: -1- AC_DEFUN([DX_CURRENT_FEATURE], [man]) +m4trace:configure.ac:22: -1- AC_DEFUN([DX_CURRENT_DESCRIPTION], [generate doxygen manual pages]) +m4trace:configure.ac:22: -2- DX_IF_FEATURE([man], [--disable-doxygen-man], [--enable-doxygen-man]) +m4trace:configure.ac:22: -3- DX_FEATURE_man +m4trace:configure.ac:22: -2- DX_IF_FEATURE([man], [don't generate doxygen manual pages], [generate doxygen manual pages]) +m4trace:configure.ac:22: -3- DX_FEATURE_man +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_FLAG_man$]) +m4trace:configure.ac:22: -1- DX_CHECK_DEPEND([doc], [1]) +m4trace:configure.ac:22: -1- DX_CURRENT_FEATURE +m4trace:configure.ac:22: -1- DX_CURRENT_FEATURE +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_FLAG_man$]) +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_FLAG_man$]) +m4trace:configure.ac:22: -1- DX_IF_FEATURE([man], [1], [0]) +m4trace:configure.ac:22: -2- DX_FEATURE_man +m4trace:configure.ac:22: -1- DX_CLEAR_DEPEND([doc], [1]) +m4trace:configure.ac:22: -2- DX_CURRENT_FEATURE +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_FLAG_man$]) +m4trace:configure.ac:22: -1- DX_TEST_FEATURE([man]) +m4trace:configure.ac:22: -1- DX_TEST_FEATURE([man]) +m4trace:configure.ac:22: -1- AM_CONDITIONAL([DX_COND_man], [:]) +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_COND_man_TRUE$]) +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_COND_man_FALSE$]) +m4trace:configure.ac:22: -1- _AM_SUBST_NOTMAKE([DX_COND_man_TRUE]) +m4trace:configure.ac:22: -1- _AM_SUBST_NOTMAKE([DX_COND_man_FALSE]) +m4trace:configure.ac:22: -1- DX_ENV_APPEND([GENERATE_MAN], [YES]) +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_ENV$]) +m4trace:configure.ac:22: -1- AM_CONDITIONAL([DX_COND_man], [false]) +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_COND_man_TRUE$]) +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_COND_man_FALSE$]) +m4trace:configure.ac:22: -1- _AM_SUBST_NOTMAKE([DX_COND_man_TRUE]) +m4trace:configure.ac:22: -1- _AM_SUBST_NOTMAKE([DX_COND_man_FALSE]) +m4trace:configure.ac:22: -1- DX_ENV_APPEND([GENERATE_MAN], [NO]) +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_ENV$]) +m4trace:configure.ac:22: -1- DX_ARG_ABLE([rtf], [generate doxygen RTF documentation], [DX_CHECK_DEPEND(doc, 1)], [DX_CLEAR_DEPEND(doc, 1)], [], [DX_ENV_APPEND(GENERATE_RTF, YES)], [DX_ENV_APPEND(GENERATE_RTF, NO)]) +m4trace:configure.ac:22: -1- AC_DEFUN([DX_CURRENT_FEATURE], [rtf]) +m4trace:configure.ac:22: -1- AC_DEFUN([DX_CURRENT_DESCRIPTION], [generate doxygen RTF documentation]) +m4trace:configure.ac:22: -2- DX_IF_FEATURE([rtf], [--disable-doxygen-rtf], [--enable-doxygen-rtf]) +m4trace:configure.ac:22: -3- DX_FEATURE_rtf +m4trace:configure.ac:22: -2- DX_IF_FEATURE([rtf], [don't generate doxygen RTF documentation], [generate doxygen RTF documentation]) +m4trace:configure.ac:22: -3- DX_FEATURE_rtf +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_FLAG_rtf$]) +m4trace:configure.ac:22: -1- DX_CHECK_DEPEND([doc], [1]) +m4trace:configure.ac:22: -1- DX_CURRENT_FEATURE +m4trace:configure.ac:22: -1- DX_CURRENT_FEATURE +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_FLAG_rtf$]) +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_FLAG_rtf$]) +m4trace:configure.ac:22: -1- DX_IF_FEATURE([rtf], [1], [0]) +m4trace:configure.ac:22: -2- DX_FEATURE_rtf +m4trace:configure.ac:22: -1- DX_CLEAR_DEPEND([doc], [1]) +m4trace:configure.ac:22: -2- DX_CURRENT_FEATURE +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_FLAG_rtf$]) +m4trace:configure.ac:22: -1- DX_TEST_FEATURE([rtf]) +m4trace:configure.ac:22: -1- DX_TEST_FEATURE([rtf]) +m4trace:configure.ac:22: -1- AM_CONDITIONAL([DX_COND_rtf], [:]) +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_COND_rtf_TRUE$]) +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_COND_rtf_FALSE$]) +m4trace:configure.ac:22: -1- _AM_SUBST_NOTMAKE([DX_COND_rtf_TRUE]) +m4trace:configure.ac:22: -1- _AM_SUBST_NOTMAKE([DX_COND_rtf_FALSE]) +m4trace:configure.ac:22: -1- DX_ENV_APPEND([GENERATE_RTF], [YES]) +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_ENV$]) +m4trace:configure.ac:22: -1- AM_CONDITIONAL([DX_COND_rtf], [false]) +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_COND_rtf_TRUE$]) +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_COND_rtf_FALSE$]) +m4trace:configure.ac:22: -1- _AM_SUBST_NOTMAKE([DX_COND_rtf_TRUE]) +m4trace:configure.ac:22: -1- _AM_SUBST_NOTMAKE([DX_COND_rtf_FALSE]) +m4trace:configure.ac:22: -1- DX_ENV_APPEND([GENERATE_RTF], [NO]) +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_ENV$]) +m4trace:configure.ac:22: -1- DX_ARG_ABLE([xml], [generate doxygen XML documentation], [DX_CHECK_DEPEND(doc, 1)], [DX_CLEAR_DEPEND(doc, 1)], [], [DX_ENV_APPEND(GENERATE_XML, YES)], [DX_ENV_APPEND(GENERATE_XML, NO)]) +m4trace:configure.ac:22: -1- AC_DEFUN([DX_CURRENT_FEATURE], [xml]) +m4trace:configure.ac:22: -1- AC_DEFUN([DX_CURRENT_DESCRIPTION], [generate doxygen XML documentation]) +m4trace:configure.ac:22: -2- DX_IF_FEATURE([xml], [--disable-doxygen-xml], [--enable-doxygen-xml]) +m4trace:configure.ac:22: -3- DX_FEATURE_xml +m4trace:configure.ac:22: -2- DX_IF_FEATURE([xml], [don't generate doxygen XML documentation], [generate doxygen XML documentation]) +m4trace:configure.ac:22: -3- DX_FEATURE_xml +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_FLAG_xml$]) +m4trace:configure.ac:22: -1- DX_CHECK_DEPEND([doc], [1]) +m4trace:configure.ac:22: -1- DX_CURRENT_FEATURE +m4trace:configure.ac:22: -1- DX_CURRENT_FEATURE +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_FLAG_xml$]) +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_FLAG_xml$]) +m4trace:configure.ac:22: -1- DX_IF_FEATURE([xml], [1], [0]) +m4trace:configure.ac:22: -2- DX_FEATURE_xml +m4trace:configure.ac:22: -1- DX_CLEAR_DEPEND([doc], [1]) +m4trace:configure.ac:22: -2- DX_CURRENT_FEATURE +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_FLAG_xml$]) +m4trace:configure.ac:22: -1- DX_TEST_FEATURE([xml]) +m4trace:configure.ac:22: -1- DX_TEST_FEATURE([xml]) +m4trace:configure.ac:22: -1- AM_CONDITIONAL([DX_COND_xml], [:]) +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_COND_xml_TRUE$]) +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_COND_xml_FALSE$]) +m4trace:configure.ac:22: -1- _AM_SUBST_NOTMAKE([DX_COND_xml_TRUE]) +m4trace:configure.ac:22: -1- _AM_SUBST_NOTMAKE([DX_COND_xml_FALSE]) +m4trace:configure.ac:22: -1- DX_ENV_APPEND([GENERATE_XML], [YES]) +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_ENV$]) +m4trace:configure.ac:22: -1- AM_CONDITIONAL([DX_COND_xml], [false]) +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_COND_xml_TRUE$]) +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_COND_xml_FALSE$]) +m4trace:configure.ac:22: -1- _AM_SUBST_NOTMAKE([DX_COND_xml_TRUE]) +m4trace:configure.ac:22: -1- _AM_SUBST_NOTMAKE([DX_COND_xml_FALSE]) +m4trace:configure.ac:22: -1- DX_ENV_APPEND([GENERATE_XML], [NO]) +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_ENV$]) +m4trace:configure.ac:22: -1- DX_ARG_ABLE([chm], [generate doxygen compressed HTML help documentation], [DX_CHECK_DEPEND(doc, 1)], [DX_CLEAR_DEPEND(doc, 1)], [DX_REQUIRE_PROG([DX_HHC], hhc)], [DX_ENV_APPEND(HHC_PATH, $DX_HHC) + DX_ENV_APPEND(GENERATE_HTML, YES) + DX_ENV_APPEND(GENERATE_HTMLHELP, YES)], [DX_ENV_APPEND(GENERATE_HTMLHELP, NO)]) +m4trace:configure.ac:22: -1- AC_DEFUN([DX_CURRENT_FEATURE], [chm]) +m4trace:configure.ac:22: -1- AC_DEFUN([DX_CURRENT_DESCRIPTION], [generate doxygen compressed HTML help documentation]) +m4trace:configure.ac:22: -2- DX_IF_FEATURE([chm], [--disable-doxygen-chm], [--enable-doxygen-chm]) +m4trace:configure.ac:22: -3- DX_FEATURE_chm +m4trace:configure.ac:22: -2- DX_IF_FEATURE([chm], [don't generate doxygen compressed HTML help documentation], [generate doxygen compressed HTML help documentation]) +m4trace:configure.ac:22: -3- DX_FEATURE_chm +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_FLAG_chm$]) +m4trace:configure.ac:22: -1- DX_CHECK_DEPEND([doc], [1]) +m4trace:configure.ac:22: -1- DX_CURRENT_FEATURE +m4trace:configure.ac:22: -1- DX_CURRENT_FEATURE +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_FLAG_chm$]) +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_FLAG_chm$]) +m4trace:configure.ac:22: -1- DX_IF_FEATURE([chm], [1], [0]) +m4trace:configure.ac:22: -2- DX_FEATURE_chm +m4trace:configure.ac:22: -1- DX_CLEAR_DEPEND([doc], [1]) +m4trace:configure.ac:22: -2- DX_CURRENT_FEATURE +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_FLAG_chm$]) +m4trace:configure.ac:22: -1- DX_TEST_FEATURE([chm]) +m4trace:configure.ac:22: -1- DX_REQUIRE_PROG([DX_HHC], [hhc]) +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_HHC$]) +m4trace:configure.ac:22: -1- DX_CURRENT_DESCRIPTION +m4trace:configure.ac:22: -1- DX_CURRENT_DESCRIPTION +m4trace:configure.ac:22: -2- DX_CURRENT_FEATURE +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_FLAG_chm$]) +m4trace:configure.ac:22: -1- DX_TEST_FEATURE([chm]) +m4trace:configure.ac:22: -1- AM_CONDITIONAL([DX_COND_chm], [:]) +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_COND_chm_TRUE$]) +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_COND_chm_FALSE$]) +m4trace:configure.ac:22: -1- _AM_SUBST_NOTMAKE([DX_COND_chm_TRUE]) +m4trace:configure.ac:22: -1- _AM_SUBST_NOTMAKE([DX_COND_chm_FALSE]) +m4trace:configure.ac:22: -1- DX_ENV_APPEND([HHC_PATH], [$DX_HHC]) +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_ENV$]) +m4trace:configure.ac:22: -1- DX_ENV_APPEND([GENERATE_HTML], [YES]) +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_ENV$]) +m4trace:configure.ac:22: -1- DX_ENV_APPEND([GENERATE_HTMLHELP], [YES]) +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_ENV$]) +m4trace:configure.ac:22: -1- AM_CONDITIONAL([DX_COND_chm], [false]) +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_COND_chm_TRUE$]) +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_COND_chm_FALSE$]) +m4trace:configure.ac:22: -1- _AM_SUBST_NOTMAKE([DX_COND_chm_TRUE]) +m4trace:configure.ac:22: -1- _AM_SUBST_NOTMAKE([DX_COND_chm_FALSE]) +m4trace:configure.ac:22: -1- DX_ENV_APPEND([GENERATE_HTMLHELP], [NO]) +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_ENV$]) +m4trace:configure.ac:22: -1- DX_ARG_ABLE([chi], [generate doxygen seperate compressed HTML help index file], [DX_CHECK_DEPEND(chm, 1)], [DX_CLEAR_DEPEND(chm, 1)], [], [DX_ENV_APPEND(GENERATE_CHI, YES)], [DX_ENV_APPEND(GENERATE_CHI, NO)]) +m4trace:configure.ac:22: -1- AC_DEFUN([DX_CURRENT_FEATURE], [chi]) +m4trace:configure.ac:22: -1- AC_DEFUN([DX_CURRENT_DESCRIPTION], [generate doxygen seperate compressed HTML help index file]) +m4trace:configure.ac:22: -2- DX_IF_FEATURE([chi], [--disable-doxygen-chi], [--enable-doxygen-chi]) +m4trace:configure.ac:22: -3- DX_FEATURE_chi +m4trace:configure.ac:22: -2- DX_IF_FEATURE([chi], [don't generate doxygen seperate compressed HTML help index file], [generate doxygen seperate compressed HTML help index file]) +m4trace:configure.ac:22: -3- DX_FEATURE_chi +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_FLAG_chi$]) +m4trace:configure.ac:22: -1- DX_CHECK_DEPEND([chm], [1]) +m4trace:configure.ac:22: -1- DX_CURRENT_FEATURE +m4trace:configure.ac:22: -1- DX_CURRENT_FEATURE +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_FLAG_chi$]) +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_FLAG_chi$]) +m4trace:configure.ac:22: -1- DX_IF_FEATURE([chi], [1], [0]) +m4trace:configure.ac:22: -2- DX_FEATURE_chi +m4trace:configure.ac:22: -1- DX_CLEAR_DEPEND([chm], [1]) +m4trace:configure.ac:22: -2- DX_CURRENT_FEATURE +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_FLAG_chi$]) +m4trace:configure.ac:22: -1- DX_TEST_FEATURE([chi]) +m4trace:configure.ac:22: -1- DX_TEST_FEATURE([chi]) +m4trace:configure.ac:22: -1- AM_CONDITIONAL([DX_COND_chi], [:]) +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_COND_chi_TRUE$]) +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_COND_chi_FALSE$]) +m4trace:configure.ac:22: -1- _AM_SUBST_NOTMAKE([DX_COND_chi_TRUE]) +m4trace:configure.ac:22: -1- _AM_SUBST_NOTMAKE([DX_COND_chi_FALSE]) +m4trace:configure.ac:22: -1- DX_ENV_APPEND([GENERATE_CHI], [YES]) +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_ENV$]) +m4trace:configure.ac:22: -1- AM_CONDITIONAL([DX_COND_chi], [false]) +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_COND_chi_TRUE$]) +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_COND_chi_FALSE$]) +m4trace:configure.ac:22: -1- _AM_SUBST_NOTMAKE([DX_COND_chi_TRUE]) +m4trace:configure.ac:22: -1- _AM_SUBST_NOTMAKE([DX_COND_chi_FALSE]) +m4trace:configure.ac:22: -1- DX_ENV_APPEND([GENERATE_CHI], [NO]) +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_ENV$]) +m4trace:configure.ac:22: -1- DX_ARG_ABLE([html], [generate doxygen plain HTML documentation], [DX_CHECK_DEPEND(doc, 1) DX_CHECK_DEPEND(chm, 0)], [DX_CLEAR_DEPEND(doc, 1) DX_CLEAR_DEPEND(chm, 0)], [], [DX_ENV_APPEND(GENERATE_HTML, YES)], [DX_TEST_FEATURE(chm) || DX_ENV_APPEND(GENERATE_HTML, NO)]) +m4trace:configure.ac:22: -1- AC_DEFUN([DX_CURRENT_FEATURE], [html]) +m4trace:configure.ac:22: -1- AC_DEFUN([DX_CURRENT_DESCRIPTION], [generate doxygen plain HTML documentation]) +m4trace:configure.ac:22: -2- DX_IF_FEATURE([html], [--disable-doxygen-html], [--enable-doxygen-html]) +m4trace:configure.ac:22: -3- DX_FEATURE_html +m4trace:configure.ac:22: -2- DX_IF_FEATURE([html], [don't generate doxygen plain HTML documentation], [generate doxygen plain HTML documentation]) +m4trace:configure.ac:22: -3- DX_FEATURE_html +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_FLAG_html$]) +m4trace:configure.ac:22: -1- DX_CHECK_DEPEND([doc], [1]) +m4trace:configure.ac:22: -1- DX_CURRENT_FEATURE +m4trace:configure.ac:22: -1- DX_CURRENT_FEATURE +m4trace:configure.ac:22: -1- DX_CHECK_DEPEND([chm], [0]) +m4trace:configure.ac:22: -1- DX_CURRENT_FEATURE +m4trace:configure.ac:22: -1- DX_CURRENT_FEATURE +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_FLAG_html$]) +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_FLAG_html$]) +m4trace:configure.ac:22: -1- DX_IF_FEATURE([html], [1], [0]) +m4trace:configure.ac:22: -2- DX_FEATURE_html +m4trace:configure.ac:22: -1- DX_CLEAR_DEPEND([doc], [1]) +m4trace:configure.ac:22: -2- DX_CURRENT_FEATURE +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_FLAG_html$]) +m4trace:configure.ac:22: -1- DX_CLEAR_DEPEND([chm], [0]) +m4trace:configure.ac:22: -2- DX_CURRENT_FEATURE +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_FLAG_html$]) +m4trace:configure.ac:22: -1- DX_TEST_FEATURE([html]) +m4trace:configure.ac:22: -1- DX_TEST_FEATURE([html]) +m4trace:configure.ac:22: -1- AM_CONDITIONAL([DX_COND_html], [:]) +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_COND_html_TRUE$]) +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_COND_html_FALSE$]) +m4trace:configure.ac:22: -1- _AM_SUBST_NOTMAKE([DX_COND_html_TRUE]) +m4trace:configure.ac:22: -1- _AM_SUBST_NOTMAKE([DX_COND_html_FALSE]) +m4trace:configure.ac:22: -1- DX_ENV_APPEND([GENERATE_HTML], [YES]) +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_ENV$]) +m4trace:configure.ac:22: -1- AM_CONDITIONAL([DX_COND_html], [false]) +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_COND_html_TRUE$]) +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_COND_html_FALSE$]) +m4trace:configure.ac:22: -1- _AM_SUBST_NOTMAKE([DX_COND_html_TRUE]) +m4trace:configure.ac:22: -1- _AM_SUBST_NOTMAKE([DX_COND_html_FALSE]) +m4trace:configure.ac:22: -1- DX_TEST_FEATURE([chm]) +m4trace:configure.ac:22: -1- DX_ENV_APPEND([GENERATE_HTML], [NO]) +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_ENV$]) +m4trace:configure.ac:22: -1- DX_ARG_ABLE([ps], [generate doxygen PostScript documentation], [DX_CHECK_DEPEND(doc, 1)], [DX_CLEAR_DEPEND(doc, 1)], [DX_REQUIRE_PROG([DX_LATEX], latex) + DX_REQUIRE_PROG([DX_MAKEINDEX], makeindex) + DX_REQUIRE_PROG([DX_DVIPS], dvips) + DX_REQUIRE_PROG([DX_EGREP], egrep)]) +m4trace:configure.ac:22: -1- AC_DEFUN([DX_CURRENT_FEATURE], [ps]) +m4trace:configure.ac:22: -1- AC_DEFUN([DX_CURRENT_DESCRIPTION], [generate doxygen PostScript documentation]) +m4trace:configure.ac:22: -2- DX_IF_FEATURE([ps], [--disable-doxygen-ps], [--enable-doxygen-ps]) +m4trace:configure.ac:22: -3- DX_FEATURE_ps +m4trace:configure.ac:22: -2- DX_IF_FEATURE([ps], [don't generate doxygen PostScript documentation], [generate doxygen PostScript documentation]) +m4trace:configure.ac:22: -3- DX_FEATURE_ps +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_FLAG_ps$]) +m4trace:configure.ac:22: -1- DX_CHECK_DEPEND([doc], [1]) +m4trace:configure.ac:22: -1- DX_CURRENT_FEATURE +m4trace:configure.ac:22: -1- DX_CURRENT_FEATURE +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_FLAG_ps$]) +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_FLAG_ps$]) +m4trace:configure.ac:22: -1- DX_IF_FEATURE([ps], [1], [0]) +m4trace:configure.ac:22: -2- DX_FEATURE_ps +m4trace:configure.ac:22: -1- DX_CLEAR_DEPEND([doc], [1]) +m4trace:configure.ac:22: -2- DX_CURRENT_FEATURE +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_FLAG_ps$]) +m4trace:configure.ac:22: -1- DX_TEST_FEATURE([ps]) +m4trace:configure.ac:22: -1- DX_REQUIRE_PROG([DX_LATEX], [latex]) +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_LATEX$]) +m4trace:configure.ac:22: -1- DX_CURRENT_DESCRIPTION +m4trace:configure.ac:22: -1- DX_CURRENT_DESCRIPTION +m4trace:configure.ac:22: -2- DX_CURRENT_FEATURE +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_FLAG_ps$]) +m4trace:configure.ac:22: -1- DX_REQUIRE_PROG([DX_MAKEINDEX], [makeindex]) +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_MAKEINDEX$]) +m4trace:configure.ac:22: -1- DX_CURRENT_DESCRIPTION +m4trace:configure.ac:22: -1- DX_CURRENT_DESCRIPTION +m4trace:configure.ac:22: -2- DX_CURRENT_FEATURE +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_FLAG_ps$]) +m4trace:configure.ac:22: -1- DX_REQUIRE_PROG([DX_DVIPS], [dvips]) +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_DVIPS$]) +m4trace:configure.ac:22: -1- DX_CURRENT_DESCRIPTION +m4trace:configure.ac:22: -1- DX_CURRENT_DESCRIPTION +m4trace:configure.ac:22: -2- DX_CURRENT_FEATURE +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_FLAG_ps$]) +m4trace:configure.ac:22: -1- DX_REQUIRE_PROG([DX_EGREP], [egrep]) +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_EGREP$]) +m4trace:configure.ac:22: -1- DX_CURRENT_DESCRIPTION +m4trace:configure.ac:22: -1- DX_CURRENT_DESCRIPTION +m4trace:configure.ac:22: -2- DX_CURRENT_FEATURE +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_FLAG_ps$]) +m4trace:configure.ac:22: -1- DX_TEST_FEATURE([ps]) +m4trace:configure.ac:22: -1- AM_CONDITIONAL([DX_COND_ps], [:]) +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_COND_ps_TRUE$]) +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_COND_ps_FALSE$]) +m4trace:configure.ac:22: -1- _AM_SUBST_NOTMAKE([DX_COND_ps_TRUE]) +m4trace:configure.ac:22: -1- _AM_SUBST_NOTMAKE([DX_COND_ps_FALSE]) +m4trace:configure.ac:22: -1- AM_CONDITIONAL([DX_COND_ps], [false]) +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_COND_ps_TRUE$]) +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_COND_ps_FALSE$]) +m4trace:configure.ac:22: -1- _AM_SUBST_NOTMAKE([DX_COND_ps_TRUE]) +m4trace:configure.ac:22: -1- _AM_SUBST_NOTMAKE([DX_COND_ps_FALSE]) +m4trace:configure.ac:22: -1- DX_ARG_ABLE([pdf], [generate doxygen PDF documentation], [DX_CHECK_DEPEND(doc, 1)], [DX_CLEAR_DEPEND(doc, 1)], [DX_REQUIRE_PROG([DX_PDFLATEX], pdflatex) + DX_REQUIRE_PROG([DX_MAKEINDEX], makeindex) + DX_REQUIRE_PROG([DX_EGREP], egrep)]) +m4trace:configure.ac:22: -1- AC_DEFUN([DX_CURRENT_FEATURE], [pdf]) +m4trace:configure.ac:22: -1- AC_DEFUN([DX_CURRENT_DESCRIPTION], [generate doxygen PDF documentation]) +m4trace:configure.ac:22: -2- DX_IF_FEATURE([pdf], [--disable-doxygen-pdf], [--enable-doxygen-pdf]) +m4trace:configure.ac:22: -3- DX_FEATURE_pdf +m4trace:configure.ac:22: -2- DX_IF_FEATURE([pdf], [don't generate doxygen PDF documentation], [generate doxygen PDF documentation]) +m4trace:configure.ac:22: -3- DX_FEATURE_pdf +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_FLAG_pdf$]) +m4trace:configure.ac:22: -1- DX_CHECK_DEPEND([doc], [1]) +m4trace:configure.ac:22: -1- DX_CURRENT_FEATURE +m4trace:configure.ac:22: -1- DX_CURRENT_FEATURE +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_FLAG_pdf$]) +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_FLAG_pdf$]) +m4trace:configure.ac:22: -1- DX_IF_FEATURE([pdf], [1], [0]) +m4trace:configure.ac:22: -2- DX_FEATURE_pdf +m4trace:configure.ac:22: -1- DX_CLEAR_DEPEND([doc], [1]) +m4trace:configure.ac:22: -2- DX_CURRENT_FEATURE +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_FLAG_pdf$]) +m4trace:configure.ac:22: -1- DX_TEST_FEATURE([pdf]) +m4trace:configure.ac:22: -1- DX_REQUIRE_PROG([DX_PDFLATEX], [pdflatex]) +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_PDFLATEX$]) +m4trace:configure.ac:22: -1- DX_CURRENT_DESCRIPTION +m4trace:configure.ac:22: -1- DX_CURRENT_DESCRIPTION +m4trace:configure.ac:22: -2- DX_CURRENT_FEATURE +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_FLAG_pdf$]) +m4trace:configure.ac:22: -1- DX_REQUIRE_PROG([DX_MAKEINDEX], [makeindex]) +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_MAKEINDEX$]) +m4trace:configure.ac:22: -1- DX_CURRENT_DESCRIPTION +m4trace:configure.ac:22: -1- DX_CURRENT_DESCRIPTION +m4trace:configure.ac:22: -2- DX_CURRENT_FEATURE +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_FLAG_pdf$]) +m4trace:configure.ac:22: -1- DX_REQUIRE_PROG([DX_EGREP], [egrep]) +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_EGREP$]) +m4trace:configure.ac:22: -1- DX_CURRENT_DESCRIPTION +m4trace:configure.ac:22: -1- DX_CURRENT_DESCRIPTION +m4trace:configure.ac:22: -2- DX_CURRENT_FEATURE +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_FLAG_pdf$]) +m4trace:configure.ac:22: -1- DX_TEST_FEATURE([pdf]) +m4trace:configure.ac:22: -1- AM_CONDITIONAL([DX_COND_pdf], [:]) +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_COND_pdf_TRUE$]) +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_COND_pdf_FALSE$]) +m4trace:configure.ac:22: -1- _AM_SUBST_NOTMAKE([DX_COND_pdf_TRUE]) +m4trace:configure.ac:22: -1- _AM_SUBST_NOTMAKE([DX_COND_pdf_FALSE]) +m4trace:configure.ac:22: -1- AM_CONDITIONAL([DX_COND_pdf], [false]) +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_COND_pdf_TRUE$]) +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_COND_pdf_FALSE$]) +m4trace:configure.ac:22: -1- _AM_SUBST_NOTMAKE([DX_COND_pdf_TRUE]) +m4trace:configure.ac:22: -1- _AM_SUBST_NOTMAKE([DX_COND_pdf_FALSE]) +m4trace:configure.ac:22: -1- DX_TEST_FEATURE([ps]) +m4trace:configure.ac:22: -1- DX_TEST_FEATURE([pdf]) +m4trace:configure.ac:22: -1- AM_CONDITIONAL([DX_COND_latex], [:]) +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_COND_latex_TRUE$]) +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_COND_latex_FALSE$]) +m4trace:configure.ac:22: -1- _AM_SUBST_NOTMAKE([DX_COND_latex_TRUE]) +m4trace:configure.ac:22: -1- _AM_SUBST_NOTMAKE([DX_COND_latex_FALSE]) +m4trace:configure.ac:22: -1- DX_ENV_APPEND([GENERATE_LATEX], [YES]) +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_ENV$]) +m4trace:configure.ac:22: -1- AM_CONDITIONAL([DX_COND_latex], [false]) +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_COND_latex_TRUE$]) +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_COND_latex_FALSE$]) +m4trace:configure.ac:22: -1- _AM_SUBST_NOTMAKE([DX_COND_latex_TRUE]) +m4trace:configure.ac:22: -1- _AM_SUBST_NOTMAKE([DX_COND_latex_FALSE]) +m4trace:configure.ac:22: -1- DX_ENV_APPEND([GENERATE_LATEX], [NO]) +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_ENV$]) +m4trace:configure.ac:22: -1- m4_pattern_allow([^DOXYGEN_PAPER_SIZE$]) +m4trace:configure.ac:22: -1- m4_pattern_allow([^DOXYGEN_PAPER_SIZE$]) +m4trace:configure.ac:22: -1- DX_ENV_APPEND([PAPER_SIZE], [$DOXYGEN_PAPER_SIZE]) +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_ENV$]) +m4trace:configure.ac:25: -1- AM_INIT_AUTOMAKE([-Wall foreign]) +m4trace:configure.ac:25: -1- m4_pattern_allow([^AM_[A-Z]+FLAGS$]) +m4trace:configure.ac:25: -1- AM_SET_CURRENT_AUTOMAKE_VERSION +m4trace:configure.ac:25: -1- AM_AUTOMAKE_VERSION([1.11.6]) +m4trace:configure.ac:25: -1- _AM_AUTOCONF_VERSION([2.69]) +m4trace:configure.ac:25: -1- m4_pattern_allow([^INSTALL_PROGRAM$]) +m4trace:configure.ac:25: -1- m4_pattern_allow([^INSTALL_SCRIPT$]) +m4trace:configure.ac:25: -1- m4_pattern_allow([^INSTALL_DATA$]) +m4trace:configure.ac:25: -1- m4_pattern_allow([^am__isrc$]) +m4trace:configure.ac:25: -1- _AM_SUBST_NOTMAKE([am__isrc]) +m4trace:configure.ac:25: -1- m4_pattern_allow([^CYGPATH_W$]) +m4trace:configure.ac:25: -1- _AM_SET_OPTIONS([-Wall foreign]) +m4trace:configure.ac:25: -1- _AM_SET_OPTION([-Wall]) +m4trace:configure.ac:25: -2- _AM_MANGLE_OPTION([-Wall]) +m4trace:configure.ac:25: -1- _AM_SET_OPTION([foreign]) +m4trace:configure.ac:25: -2- _AM_MANGLE_OPTION([foreign]) +m4trace:configure.ac:25: -1- m4_pattern_allow([^PACKAGE$]) +m4trace:configure.ac:25: -1- m4_pattern_allow([^VERSION$]) +m4trace:configure.ac:25: -1- _AM_IF_OPTION([no-define], [], [AC_DEFINE_UNQUOTED(PACKAGE, "$PACKAGE", [Name of package]) + AC_DEFINE_UNQUOTED(VERSION, "$VERSION", [Version number of package])]) +m4trace:configure.ac:25: -2- _AM_MANGLE_OPTION([no-define]) +m4trace:configure.ac:25: -1- m4_pattern_allow([^PACKAGE$]) +m4trace:configure.ac:25: -1- m4_pattern_allow([^VERSION$]) +m4trace:configure.ac:25: -1- AM_SANITY_CHECK +m4trace:configure.ac:25: -1- AM_MISSING_PROG([ACLOCAL], [aclocal-${am__api_version}]) +m4trace:configure.ac:25: -1- AM_MISSING_HAS_RUN +m4trace:configure.ac:25: -1- AM_AUX_DIR_EXPAND +m4trace:configure.ac:25: -1- m4_pattern_allow([^ACLOCAL$]) +m4trace:configure.ac:25: -1- AM_MISSING_PROG([AUTOCONF], [autoconf]) +m4trace:configure.ac:25: -1- m4_pattern_allow([^AUTOCONF$]) +m4trace:configure.ac:25: -1- AM_MISSING_PROG([AUTOMAKE], [automake-${am__api_version}]) +m4trace:configure.ac:25: -1- m4_pattern_allow([^AUTOMAKE$]) +m4trace:configure.ac:25: -1- AM_MISSING_PROG([AUTOHEADER], [autoheader]) +m4trace:configure.ac:25: -1- m4_pattern_allow([^AUTOHEADER$]) +m4trace:configure.ac:25: -1- AM_MISSING_PROG([MAKEINFO], [makeinfo]) +m4trace:configure.ac:25: -1- m4_pattern_allow([^MAKEINFO$]) +m4trace:configure.ac:25: -1- AM_PROG_INSTALL_SH +m4trace:configure.ac:25: -1- m4_pattern_allow([^install_sh$]) +m4trace:configure.ac:25: -1- AM_PROG_INSTALL_STRIP +m4trace:configure.ac:25: -1- m4_pattern_allow([^STRIP$]) +m4trace:configure.ac:25: -1- m4_pattern_allow([^INSTALL_STRIP_PROGRAM$]) +m4trace:configure.ac:25: -1- AM_PROG_MKDIR_P +m4trace:configure.ac:25: -1- m4_pattern_allow([^MKDIR_P$]) +m4trace:configure.ac:25: -1- m4_pattern_allow([^mkdir_p$]) +m4trace:configure.ac:25: -1- m4_pattern_allow([^AWK$]) +m4trace:configure.ac:25: -1- m4_pattern_allow([^SET_MAKE$]) +m4trace:configure.ac:25: -1- AM_SET_LEADING_DOT +m4trace:configure.ac:25: -1- m4_pattern_allow([^am__leading_dot$]) +m4trace:configure.ac:25: -1- _AM_IF_OPTION([tar-ustar], [_AM_PROG_TAR([ustar])], [_AM_IF_OPTION([tar-pax], [_AM_PROG_TAR([pax])], + [_AM_PROG_TAR([v7])])]) +m4trace:configure.ac:25: -2- _AM_MANGLE_OPTION([tar-ustar]) +m4trace:configure.ac:25: -1- _AM_IF_OPTION([tar-pax], [_AM_PROG_TAR([pax])], [_AM_PROG_TAR([v7])]) +m4trace:configure.ac:25: -2- _AM_MANGLE_OPTION([tar-pax]) +m4trace:configure.ac:25: -1- _AM_PROG_TAR([v7]) +m4trace:configure.ac:25: -1- m4_pattern_allow([^AMTAR$]) +m4trace:configure.ac:25: -1- m4_pattern_allow([^am__tar$]) +m4trace:configure.ac:25: -1- m4_pattern_allow([^am__untar$]) +m4trace:configure.ac:25: -1- _AM_IF_OPTION([no-dependencies], [], [AC_PROVIDE_IFELSE([AC_PROG_CC], + [_AM_DEPENDENCIES(CC)], + [define([AC_PROG_CC], + defn([AC_PROG_CC])[_AM_DEPENDENCIES(CC)])])dnl +AC_PROVIDE_IFELSE([AC_PROG_CXX], + [_AM_DEPENDENCIES(CXX)], + [define([AC_PROG_CXX], + defn([AC_PROG_CXX])[_AM_DEPENDENCIES(CXX)])])dnl +AC_PROVIDE_IFELSE([AC_PROG_OBJC], + [_AM_DEPENDENCIES(OBJC)], + [define([AC_PROG_OBJC], + defn([AC_PROG_OBJC])[_AM_DEPENDENCIES(OBJC)])])dnl +]) +m4trace:configure.ac:25: -2- _AM_MANGLE_OPTION([no-dependencies]) +m4trace:configure.ac:25: -1- _AM_IF_OPTION([silent-rules], [AC_REQUIRE([AM_SILENT_RULES])]) +m4trace:configure.ac:25: -2- _AM_MANGLE_OPTION([silent-rules]) +m4trace:configure.ac:44: -1- _m4_warn([cross], [cannot check for file existence when cross compiling], [../../lib/autoconf/general.m4:2777: AC_CHECK_FILE is expanded from... +../../lib/autoconf/general.m4:2808: AC_CHECK_FILES is expanded from... +configure.ac:44: the top level]) +m4trace:configure.ac:44: -1- m4_pattern_allow([^HAVE_GENERATED_ZOOKEEPER_JUTE_C$]) +m4trace:configure.ac:44: -1- _m4_warn([cross], [cannot check for file existence when cross compiling], [../../lib/autoconf/general.m4:2777: AC_CHECK_FILE is expanded from... +../../lib/autoconf/general.m4:2808: AC_CHECK_FILES is expanded from... +configure.ac:44: the top level]) +m4trace:configure.ac:44: -1- m4_pattern_allow([^HAVE_GENERATED_ZOOKEEPER_JUTE_H$]) +m4trace:configure.ac:48: -1- m4_pattern_allow([^CPPUNIT_CFLAGS$]) +m4trace:configure.ac:50: -1- m4_pattern_allow([^CC$]) +m4trace:configure.ac:50: -1- m4_pattern_allow([^CFLAGS$]) +m4trace:configure.ac:50: -1- m4_pattern_allow([^LDFLAGS$]) +m4trace:configure.ac:50: -1- m4_pattern_allow([^LIBS$]) +m4trace:configure.ac:50: -1- m4_pattern_allow([^CPPFLAGS$]) +m4trace:configure.ac:50: -1- m4_pattern_allow([^CC$]) +m4trace:configure.ac:50: -1- m4_pattern_allow([^CC$]) +m4trace:configure.ac:50: -1- m4_pattern_allow([^CC$]) +m4trace:configure.ac:50: -1- m4_pattern_allow([^CC$]) +m4trace:configure.ac:50: -1- m4_pattern_allow([^ac_ct_CC$]) +m4trace:configure.ac:50: -1- m4_pattern_allow([^EXEEXT$]) +m4trace:configure.ac:50: -1- m4_pattern_allow([^OBJEXT$]) +m4trace:configure.ac:50: -1- _AM_DEPENDENCIES([CC]) +m4trace:configure.ac:50: -1- AM_SET_DEPDIR +m4trace:configure.ac:50: -1- m4_pattern_allow([^DEPDIR$]) +m4trace:configure.ac:50: -1- AM_OUTPUT_DEPENDENCY_COMMANDS +m4trace:configure.ac:50: -1- AM_MAKE_INCLUDE +m4trace:configure.ac:50: -1- m4_pattern_allow([^am__include$]) +m4trace:configure.ac:50: -1- m4_pattern_allow([^am__quote$]) +m4trace:configure.ac:50: -1- AM_DEP_TRACK +m4trace:configure.ac:50: -1- AM_CONDITIONAL([AMDEP], [test "x$enable_dependency_tracking" != xno]) +m4trace:configure.ac:50: -1- m4_pattern_allow([^AMDEP_TRUE$]) +m4trace:configure.ac:50: -1- m4_pattern_allow([^AMDEP_FALSE$]) +m4trace:configure.ac:50: -1- _AM_SUBST_NOTMAKE([AMDEP_TRUE]) +m4trace:configure.ac:50: -1- _AM_SUBST_NOTMAKE([AMDEP_FALSE]) +m4trace:configure.ac:50: -1- m4_pattern_allow([^AMDEPBACKSLASH$]) +m4trace:configure.ac:50: -1- _AM_SUBST_NOTMAKE([AMDEPBACKSLASH]) +m4trace:configure.ac:50: -1- m4_pattern_allow([^am__nodep$]) +m4trace:configure.ac:50: -1- _AM_SUBST_NOTMAKE([am__nodep]) +m4trace:configure.ac:50: -1- m4_pattern_allow([^CCDEPMODE$]) +m4trace:configure.ac:50: -1- AM_CONDITIONAL([am__fastdepCC], [ + test "x$enable_dependency_tracking" != xno \ + && test "$am_cv_CC_dependencies_compiler_type" = gcc3]) +m4trace:configure.ac:50: -1- m4_pattern_allow([^am__fastdepCC_TRUE$]) +m4trace:configure.ac:50: -1- m4_pattern_allow([^am__fastdepCC_FALSE$]) +m4trace:configure.ac:50: -1- _AM_SUBST_NOTMAKE([am__fastdepCC_TRUE]) +m4trace:configure.ac:50: -1- _AM_SUBST_NOTMAKE([am__fastdepCC_FALSE]) +m4trace:configure.ac:51: -1- AM_PROG_CC_C_O +m4trace:configure.ac:51: -1- m4_pattern_allow([^NO_MINUS_C_MINUS_O$]) +m4trace:configure.ac:52: -1- m4_pattern_allow([^CXX$]) +m4trace:configure.ac:52: -1- m4_pattern_allow([^CXXFLAGS$]) +m4trace:configure.ac:52: -1- m4_pattern_allow([^LDFLAGS$]) +m4trace:configure.ac:52: -1- m4_pattern_allow([^LIBS$]) +m4trace:configure.ac:52: -1- m4_pattern_allow([^CPPFLAGS$]) +m4trace:configure.ac:52: -1- m4_pattern_allow([^CXX$]) +m4trace:configure.ac:52: -1- m4_pattern_allow([^ac_ct_CXX$]) +m4trace:configure.ac:52: -1- _AM_DEPENDENCIES([CXX]) +m4trace:configure.ac:52: -1- m4_pattern_allow([^CXXDEPMODE$]) +m4trace:configure.ac:52: -1- AM_CONDITIONAL([am__fastdepCXX], [ + test "x$enable_dependency_tracking" != xno \ + && test "$am_cv_CXX_dependencies_compiler_type" = gcc3]) +m4trace:configure.ac:52: -1- m4_pattern_allow([^am__fastdepCXX_TRUE$]) +m4trace:configure.ac:52: -1- m4_pattern_allow([^am__fastdepCXX_FALSE$]) +m4trace:configure.ac:52: -1- _AM_SUBST_NOTMAKE([am__fastdepCXX_TRUE]) +m4trace:configure.ac:52: -1- _AM_SUBST_NOTMAKE([am__fastdepCXX_FALSE]) +m4trace:configure.ac:54: -1- m4_pattern_allow([^LN_S$]) +m4trace:configure.ac:57: -1- AC_PROG_LIBTOOL +m4trace:configure.ac:57: -1- _m4_warn([obsolete], [The macro `AC_PROG_LIBTOOL' is obsolete. +You should run autoupdate.], [/usr/share/aclocal/libtool.m4:107: AC_PROG_LIBTOOL is expanded from... +configure.ac:57: the top level]) +m4trace:configure.ac:57: -1- LT_INIT +m4trace:configure.ac:57: -1- m4_pattern_forbid([^_?LT_[A-Z_]+$]) +m4trace:configure.ac:57: -1- m4_pattern_allow([^(_LT_EOF|LT_DLGLOBAL|LT_DLLAZY_OR_NOW|LT_MULTI_MODULE)$]) +m4trace:configure.ac:57: -1- LTOPTIONS_VERSION +m4trace:configure.ac:57: -1- LTSUGAR_VERSION +m4trace:configure.ac:57: -1- LTVERSION_VERSION +m4trace:configure.ac:57: -1- LTOBSOLETE_VERSION +m4trace:configure.ac:57: -1- _LT_PROG_LTMAIN +m4trace:configure.ac:57: -1- m4_pattern_allow([^LIBTOOL$]) +m4trace:configure.ac:57: -1- m4_pattern_allow([^build$]) +m4trace:configure.ac:57: -1- m4_pattern_allow([^build_cpu$]) +m4trace:configure.ac:57: -1- m4_pattern_allow([^build_vendor$]) +m4trace:configure.ac:57: -1- m4_pattern_allow([^build_os$]) +m4trace:configure.ac:57: -1- m4_pattern_allow([^host$]) +m4trace:configure.ac:57: -1- m4_pattern_allow([^host_cpu$]) +m4trace:configure.ac:57: -1- m4_pattern_allow([^host_vendor$]) +m4trace:configure.ac:57: -1- m4_pattern_allow([^host_os$]) +m4trace:configure.ac:57: -1- _LT_PREPARE_SED_QUOTE_VARS +m4trace:configure.ac:57: -1- _LT_PROG_ECHO_BACKSLASH +m4trace:configure.ac:57: -1- LT_PATH_LD +m4trace:configure.ac:57: -1- m4_pattern_allow([^SED$]) +m4trace:configure.ac:57: -1- AC_PROG_EGREP +m4trace:configure.ac:57: -1- m4_pattern_allow([^GREP$]) +m4trace:configure.ac:57: -1- m4_pattern_allow([^EGREP$]) +m4trace:configure.ac:57: -1- m4_pattern_allow([^FGREP$]) +m4trace:configure.ac:57: -1- m4_pattern_allow([^GREP$]) +m4trace:configure.ac:57: -1- m4_pattern_allow([^LD$]) +m4trace:configure.ac:57: -1- LT_PATH_NM +m4trace:configure.ac:57: -1- m4_pattern_allow([^DUMPBIN$]) +m4trace:configure.ac:57: -1- m4_pattern_allow([^ac_ct_DUMPBIN$]) +m4trace:configure.ac:57: -1- m4_pattern_allow([^DUMPBIN$]) +m4trace:configure.ac:57: -1- m4_pattern_allow([^NM$]) +m4trace:configure.ac:57: -1- LT_CMD_MAX_LEN +m4trace:configure.ac:57: -1- m4_pattern_allow([^OBJDUMP$]) +m4trace:configure.ac:57: -1- m4_pattern_allow([^OBJDUMP$]) +m4trace:configure.ac:57: -1- m4_pattern_allow([^DLLTOOL$]) +m4trace:configure.ac:57: -1- m4_pattern_allow([^DLLTOOL$]) +m4trace:configure.ac:57: -1- m4_pattern_allow([^AR$]) +m4trace:configure.ac:57: -1- m4_pattern_allow([^ac_ct_AR$]) +m4trace:configure.ac:57: -1- m4_pattern_allow([^STRIP$]) +m4trace:configure.ac:57: -1- m4_pattern_allow([^RANLIB$]) +m4trace:configure.ac:57: -1- _LT_WITH_SYSROOT +m4trace:configure.ac:57: -1- m4_pattern_allow([LT_OBJDIR]) +m4trace:configure.ac:57: -1- m4_pattern_allow([^LT_OBJDIR$]) +m4trace:configure.ac:57: -1- _LT_CC_BASENAME([$compiler]) +m4trace:configure.ac:57: -1- _LT_PATH_TOOL_PREFIX([${ac_tool_prefix}file], [/usr/bin$PATH_SEPARATOR$PATH]) +m4trace:configure.ac:57: -1- _LT_PATH_TOOL_PREFIX([file], [/usr/bin$PATH_SEPARATOR$PATH]) +m4trace:configure.ac:57: -1- LT_SUPPORTED_TAG([CC]) +m4trace:configure.ac:57: -1- _LT_COMPILER_BOILERPLATE +m4trace:configure.ac:57: -1- _LT_LINKER_BOILERPLATE +m4trace:configure.ac:57: -1- _LT_COMPILER_OPTION([if $compiler supports -fno-rtti -fno-exceptions], [lt_cv_prog_compiler_rtti_exceptions], [-fno-rtti -fno-exceptions], [], [_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, )="$_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, ) -fno-rtti -fno-exceptions"]) +m4trace:configure.ac:57: -1- _LT_COMPILER_OPTION([if $compiler PIC flag $_LT_TAGVAR(lt_prog_compiler_pic, ) works], [_LT_TAGVAR(lt_cv_prog_compiler_pic_works, )], [$_LT_TAGVAR(lt_prog_compiler_pic, )@&t@m4_if([],[],[ -DPIC],[m4_if([],[CXX],[ -DPIC],[])])], [], [case $_LT_TAGVAR(lt_prog_compiler_pic, ) in + "" | " "*) ;; + *) _LT_TAGVAR(lt_prog_compiler_pic, )=" $_LT_TAGVAR(lt_prog_compiler_pic, )" ;; + esac], [_LT_TAGVAR(lt_prog_compiler_pic, )= + _LT_TAGVAR(lt_prog_compiler_can_build_shared, )=no]) +m4trace:configure.ac:57: -1- _LT_LINKER_OPTION([if $compiler static flag $lt_tmp_static_flag works], [lt_cv_prog_compiler_static_works], [$lt_tmp_static_flag], [], [_LT_TAGVAR(lt_prog_compiler_static, )=]) +m4trace:configure.ac:57: -1- m4_pattern_allow([^MANIFEST_TOOL$]) +m4trace:configure.ac:57: -1- _LT_REQUIRED_DARWIN_CHECKS +m4trace:configure.ac:57: -1- m4_pattern_allow([^DSYMUTIL$]) +m4trace:configure.ac:57: -1- m4_pattern_allow([^NMEDIT$]) +m4trace:configure.ac:57: -1- m4_pattern_allow([^LIPO$]) +m4trace:configure.ac:57: -1- m4_pattern_allow([^OTOOL$]) +m4trace:configure.ac:57: -1- m4_pattern_allow([^OTOOL64$]) +m4trace:configure.ac:57: -1- _LT_LINKER_OPTION([if $CC understands -b], [lt_cv_prog_compiler__b], [-b], [_LT_TAGVAR(archive_cmds, )='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'], [_LT_TAGVAR(archive_cmds, )='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags']) +m4trace:configure.ac:57: -1- LT_SYS_DLOPEN_SELF +m4trace:configure.ac:57: -1- m4_pattern_allow([^CPP$]) +m4trace:configure.ac:57: -1- m4_pattern_allow([^CPPFLAGS$]) +m4trace:configure.ac:57: -1- m4_pattern_allow([^CPP$]) +m4trace:configure.ac:57: -1- m4_pattern_allow([^STDC_HEADERS$]) +m4trace:configure.ac:57: -1- m4_pattern_allow([^HAVE_DLFCN_H$]) +m4trace:configure.ac:57: -1- LT_LANG([CXX]) +m4trace:configure.ac:57: -1- LT_SUPPORTED_TAG([CXX]) +m4trace:configure.ac:57: -1- m4_pattern_allow([^CXXCPP$]) +m4trace:configure.ac:57: -1- m4_pattern_allow([^CPPFLAGS$]) +m4trace:configure.ac:57: -1- m4_pattern_allow([^CXXCPP$]) +m4trace:configure.ac:57: -1- _LT_COMPILER_BOILERPLATE +m4trace:configure.ac:57: -1- _LT_LINKER_BOILERPLATE +m4trace:configure.ac:57: -1- _LT_CC_BASENAME([$compiler]) +m4trace:configure.ac:57: -1- LT_PATH_LD +m4trace:configure.ac:57: -1- m4_pattern_allow([^LD$]) +m4trace:configure.ac:57: -1- _LT_COMPILER_OPTION([if $compiler PIC flag $_LT_TAGVAR(lt_prog_compiler_pic, CXX) works], [_LT_TAGVAR(lt_cv_prog_compiler_pic_works, CXX)], [$_LT_TAGVAR(lt_prog_compiler_pic, CXX)@&t@m4_if([CXX],[],[ -DPIC],[m4_if([CXX],[CXX],[ -DPIC],[])])], [], [case $_LT_TAGVAR(lt_prog_compiler_pic, CXX) in + "" | " "*) ;; + *) _LT_TAGVAR(lt_prog_compiler_pic, CXX)=" $_LT_TAGVAR(lt_prog_compiler_pic, CXX)" ;; + esac], [_LT_TAGVAR(lt_prog_compiler_pic, CXX)= + _LT_TAGVAR(lt_prog_compiler_can_build_shared, CXX)=no]) +m4trace:configure.ac:57: -1- _LT_LINKER_OPTION([if $compiler static flag $lt_tmp_static_flag works], [lt_cv_prog_compiler_static_works_CXX], [$lt_tmp_static_flag], [], [_LT_TAGVAR(lt_prog_compiler_static, CXX)=]) +m4trace:configure.ac:106: -1- AM_CONDITIONAL([WANT_SYNCAPI], [test "x$with_syncapi" != xno]) +m4trace:configure.ac:106: -1- m4_pattern_allow([^WANT_SYNCAPI_TRUE$]) +m4trace:configure.ac:106: -1- m4_pattern_allow([^WANT_SYNCAPI_FALSE$]) +m4trace:configure.ac:106: -1- _AM_SUBST_NOTMAKE([WANT_SYNCAPI_TRUE]) +m4trace:configure.ac:106: -1- _AM_SUBST_NOTMAKE([WANT_SYNCAPI_FALSE]) +m4trace:configure.ac:109: -1- m4_pattern_allow([^STDC_HEADERS$]) +m4trace:configure.ac:113: -1- m4_pattern_allow([^const$]) +m4trace:configure.ac:115: -1- m4_pattern_allow([^TIME_WITH_SYS_TIME$]) +m4trace:configure.ac:116: -1- m4_pattern_allow([^POLL_NFDS_TYPE$]) +m4trace:configure.ac:116: -1- m4_pattern_allow([^POLL_NFDS_TYPE$]) +m4trace:configure.ac:123: -1- _m4_warn([obsolete], [The macro `AC_TRY_RUN' is obsolete. +You should run autoupdate.], [../../lib/autoconf/general.m4:2764: AC_TRY_RUN is expanded from... +configure.ac:123: the top level]) +m4trace:configure.ac:142: -1- m4_pattern_allow([^USEIPV6$]) +m4trace:configure.ac:149: -1- m4_pattern_allow([^LIB@&t@OBJS$]) +m4trace:configure.ac:149: -1- m4_pattern_allow([^LTLIBOBJS$]) +m4trace:configure.ac:149: -1- AM_CONDITIONAL([am__EXEEXT], [test -n "$EXEEXT"]) +m4trace:configure.ac:149: -1- m4_pattern_allow([^am__EXEEXT_TRUE$]) +m4trace:configure.ac:149: -1- m4_pattern_allow([^am__EXEEXT_FALSE$]) +m4trace:configure.ac:149: -1- _AM_SUBST_NOTMAKE([am__EXEEXT_TRUE]) +m4trace:configure.ac:149: -1- _AM_SUBST_NOTMAKE([am__EXEEXT_FALSE]) +m4trace:configure.ac:149: -1- _AC_AM_CONFIG_HEADER_HOOK(["$ac_file"]) +m4trace:configure.ac:149: -1- _AM_OUTPUT_DEPENDENCY_COMMANDS +m4trace:configure.ac:149: -1- _LT_PROG_LTMAIN diff --git a/pkg/registry/zookeeper-3.4.6/src/c/autom4te.cache/traces.3 b/pkg/registry/zookeeper-3.4.6/src/c/autom4te.cache/traces.3 new file mode 100644 index 000000000..2d2d182e3 --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/c/autom4te.cache/traces.3 @@ -0,0 +1,3272 @@ +m4trace:/usr/share/aclocal/argz.m4:12: -1- AC_DEFUN([gl_FUNC_ARGZ], [gl_PREREQ_ARGZ + +AC_CHECK_HEADERS([argz.h], [], [], [AC_INCLUDES_DEFAULT]) + +AC_CHECK_TYPES([error_t], + [], + [AC_DEFINE([error_t], [int], + [Define to a type to use for `error_t' if it is not otherwise available.]) + AC_DEFINE([__error_t_defined], [1], [Define so that glibc/gnulib argp.h + does not typedef error_t.])], + [#if defined(HAVE_ARGZ_H) +# include +#endif]) + +ARGZ_H= +AC_CHECK_FUNCS([argz_add argz_append argz_count argz_create_sep argz_insert \ + argz_next argz_stringify], [], [ARGZ_H=argz.h; AC_LIBOBJ([argz])]) + +dnl if have system argz functions, allow forced use of +dnl libltdl-supplied implementation (and default to do so +dnl on "known bad" systems). Could use a runtime check, but +dnl (a) detecting malloc issues is notoriously unreliable +dnl (b) only known system that declares argz functions, +dnl provides them, yet they are broken, is cygwin +dnl releases prior to 16-Mar-2007 (1.5.24 and earlier) +dnl So, it's more straightforward simply to special case +dnl this for known bad systems. +AS_IF([test -z "$ARGZ_H"], + [AC_CACHE_CHECK( + [if argz actually works], + [lt_cv_sys_argz_works], + [[case $host_os in #( + *cygwin*) + lt_cv_sys_argz_works=no + if test "$cross_compiling" != no; then + lt_cv_sys_argz_works="guessing no" + else + lt_sed_extract_leading_digits='s/^\([0-9\.]*\).*/\1/' + save_IFS=$IFS + IFS=-. + set x `uname -r | sed -e "$lt_sed_extract_leading_digits"` + IFS=$save_IFS + lt_os_major=${2-0} + lt_os_minor=${3-0} + lt_os_micro=${4-0} + if test "$lt_os_major" -gt 1 \ + || { test "$lt_os_major" -eq 1 \ + && { test "$lt_os_minor" -gt 5 \ + || { test "$lt_os_minor" -eq 5 \ + && test "$lt_os_micro" -gt 24; }; }; }; then + lt_cv_sys_argz_works=yes + fi + fi + ;; #( + *) lt_cv_sys_argz_works=yes ;; + esac]]) + AS_IF([test "$lt_cv_sys_argz_works" = yes], + [AC_DEFINE([HAVE_WORKING_ARGZ], 1, + [This value is set to 1 to indicate that the system argz facility works])], + [ARGZ_H=argz.h + AC_LIBOBJ([argz])])]) + +AC_SUBST([ARGZ_H]) +]) +m4trace:/usr/share/aclocal/argz.m4:79: -1- AC_DEFUN([gl_PREREQ_ARGZ], [:]) +m4trace:/usr/share/aclocal/cppunit.m4:4: -1- AC_DEFUN([AM_PATH_CPPUNIT], [ + +AC_ARG_WITH(cppunit-prefix,[ --with-cppunit-prefix=PFX Prefix where CppUnit is installed (optional)], + cppunit_config_prefix="$withval", cppunit_config_prefix="") +AC_ARG_WITH(cppunit-exec-prefix,[ --with-cppunit-exec-prefix=PFX Exec prefix where CppUnit is installed (optional)], + cppunit_config_exec_prefix="$withval", cppunit_config_exec_prefix="") + + if test x$cppunit_config_exec_prefix != x ; then + cppunit_config_args="$cppunit_config_args --exec-prefix=$cppunit_config_exec_prefix" + if test x${CPPUNIT_CONFIG+set} != xset ; then + CPPUNIT_CONFIG=$cppunit_config_exec_prefix/bin/cppunit-config + fi + fi + if test x$cppunit_config_prefix != x ; then + cppunit_config_args="$cppunit_config_args --prefix=$cppunit_config_prefix" + if test x${CPPUNIT_CONFIG+set} != xset ; then + CPPUNIT_CONFIG=$cppunit_config_prefix/bin/cppunit-config + fi + fi + + AC_PATH_PROG(CPPUNIT_CONFIG, cppunit-config, no) + cppunit_version_min=$1 + + AC_MSG_CHECKING(for Cppunit - version >= $cppunit_version_min) + no_cppunit="" + if test "$CPPUNIT_CONFIG" = "no" ; then + AC_MSG_RESULT(no) + no_cppunit=yes + else + CPPUNIT_CFLAGS=`$CPPUNIT_CONFIG --cflags` + CPPUNIT_LIBS=`$CPPUNIT_CONFIG --libs` + cppunit_version=`$CPPUNIT_CONFIG --version` + + cppunit_major_version=`echo $cppunit_version | \ + sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\1/'` + cppunit_minor_version=`echo $cppunit_version | \ + sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\2/'` + cppunit_micro_version=`echo $cppunit_version | \ + sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\3/'` + + cppunit_major_min=`echo $cppunit_version_min | \ + sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\1/'` + if test "x${cppunit_major_min}" = "x" ; then + cppunit_major_min=0 + fi + + cppunit_minor_min=`echo $cppunit_version_min | \ + sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\2/'` + if test "x${cppunit_minor_min}" = "x" ; then + cppunit_minor_min=0 + fi + + cppunit_micro_min=`echo $cppunit_version_min | \ + sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\3/'` + if test "x${cppunit_micro_min}" = "x" ; then + cppunit_micro_min=0 + fi + + cppunit_version_proper=`expr \ + $cppunit_major_version \> $cppunit_major_min \| \ + $cppunit_major_version \= $cppunit_major_min \& \ + $cppunit_minor_version \> $cppunit_minor_min \| \ + $cppunit_major_version \= $cppunit_major_min \& \ + $cppunit_minor_version \= $cppunit_minor_min \& \ + $cppunit_micro_version \>= $cppunit_micro_min ` + + if test "$cppunit_version_proper" = "1" ; then + AC_MSG_RESULT([$cppunit_major_version.$cppunit_minor_version.$cppunit_micro_version]) + else + AC_MSG_RESULT(no) + no_cppunit=yes + fi + fi + + if test "x$no_cppunit" = x ; then + ifelse([$2], , :, [$2]) + else + CPPUNIT_CFLAGS="" + CPPUNIT_LIBS="" + ifelse([$3], , :, [$3]) + fi + + AC_SUBST(CPPUNIT_CFLAGS) + AC_SUBST(CPPUNIT_LIBS) +]) +m4trace:/usr/share/aclocal/libtool.m4:69: -1- AC_DEFUN([LT_INIT], [AC_PREREQ([2.58])dnl We use AC_INCLUDES_DEFAULT +AC_REQUIRE([AC_CONFIG_AUX_DIR_DEFAULT])dnl +AC_BEFORE([$0], [LT_LANG])dnl +AC_BEFORE([$0], [LT_OUTPUT])dnl +AC_BEFORE([$0], [LTDL_INIT])dnl +m4_require([_LT_CHECK_BUILDDIR])dnl + +dnl Autoconf doesn't catch unexpanded LT_ macros by default: +m4_pattern_forbid([^_?LT_[A-Z_]+$])dnl +m4_pattern_allow([^(_LT_EOF|LT_DLGLOBAL|LT_DLLAZY_OR_NOW|LT_MULTI_MODULE)$])dnl +dnl aclocal doesn't pull ltoptions.m4, ltsugar.m4, or ltversion.m4 +dnl unless we require an AC_DEFUNed macro: +AC_REQUIRE([LTOPTIONS_VERSION])dnl +AC_REQUIRE([LTSUGAR_VERSION])dnl +AC_REQUIRE([LTVERSION_VERSION])dnl +AC_REQUIRE([LTOBSOLETE_VERSION])dnl +m4_require([_LT_PROG_LTMAIN])dnl + +_LT_SHELL_INIT([SHELL=${CONFIG_SHELL-/bin/sh}]) + +dnl Parse OPTIONS +_LT_SET_OPTIONS([$0], [$1]) + +# This can be used to rebuild libtool when needed +LIBTOOL_DEPS="$ltmain" + +# Always use our own libtool. +LIBTOOL='$(SHELL) $(top_builddir)/libtool' +AC_SUBST(LIBTOOL)dnl + +_LT_SETUP + +# Only expand once: +m4_define([LT_INIT]) +]) +m4trace:/usr/share/aclocal/libtool.m4:107: -1- AU_DEFUN([AC_PROG_LIBTOOL], [m4_if($#, 0, [LT_INIT], [LT_INIT($@)])]) +m4trace:/usr/share/aclocal/libtool.m4:107: -1- AC_DEFUN([AC_PROG_LIBTOOL], [AC_DIAGNOSE([obsolete], [The macro `AC_PROG_LIBTOOL' is obsolete. +You should run autoupdate.])dnl +m4_if($#, 0, [LT_INIT], [LT_INIT($@)])]) +m4trace:/usr/share/aclocal/libtool.m4:108: -1- AU_DEFUN([AM_PROG_LIBTOOL], [m4_if($#, 0, [LT_INIT], [LT_INIT($@)])]) +m4trace:/usr/share/aclocal/libtool.m4:108: -1- AC_DEFUN([AM_PROG_LIBTOOL], [AC_DIAGNOSE([obsolete], [The macro `AM_PROG_LIBTOOL' is obsolete. +You should run autoupdate.])dnl +m4_if($#, 0, [LT_INIT], [LT_INIT($@)])]) +m4trace:/usr/share/aclocal/libtool.m4:609: -1- AC_DEFUN([LT_OUTPUT], [: ${CONFIG_LT=./config.lt} +AC_MSG_NOTICE([creating $CONFIG_LT]) +_LT_GENERATED_FILE_INIT(["$CONFIG_LT"], +[# Run this file to recreate a libtool stub with the current configuration.]) + +cat >>"$CONFIG_LT" <<\_LTEOF +lt_cl_silent=false +exec AS_MESSAGE_LOG_FD>>config.log +{ + echo + AS_BOX([Running $as_me.]) +} >&AS_MESSAGE_LOG_FD + +lt_cl_help="\ +\`$as_me' creates a local libtool stub from the current configuration, +for use in further configure time tests before the real libtool is +generated. + +Usage: $[0] [[OPTIONS]] + + -h, --help print this help, then exit + -V, --version print version number, then exit + -q, --quiet do not print progress messages + -d, --debug don't remove temporary files + +Report bugs to ." + +lt_cl_version="\ +m4_ifset([AC_PACKAGE_NAME], [AC_PACKAGE_NAME ])config.lt[]dnl +m4_ifset([AC_PACKAGE_VERSION], [ AC_PACKAGE_VERSION]) +configured by $[0], generated by m4_PACKAGE_STRING. + +Copyright (C) 2011 Free Software Foundation, Inc. +This config.lt script is free software; the Free Software Foundation +gives unlimited permision to copy, distribute and modify it." + +while test $[#] != 0 +do + case $[1] in + --version | --v* | -V ) + echo "$lt_cl_version"; exit 0 ;; + --help | --h* | -h ) + echo "$lt_cl_help"; exit 0 ;; + --debug | --d* | -d ) + debug=: ;; + --quiet | --q* | --silent | --s* | -q ) + lt_cl_silent=: ;; + + -*) AC_MSG_ERROR([unrecognized option: $[1] +Try \`$[0] --help' for more information.]) ;; + + *) AC_MSG_ERROR([unrecognized argument: $[1] +Try \`$[0] --help' for more information.]) ;; + esac + shift +done + +if $lt_cl_silent; then + exec AS_MESSAGE_FD>/dev/null +fi +_LTEOF + +cat >>"$CONFIG_LT" <<_LTEOF +_LT_OUTPUT_LIBTOOL_COMMANDS_INIT +_LTEOF + +cat >>"$CONFIG_LT" <<\_LTEOF +AC_MSG_NOTICE([creating $ofile]) +_LT_OUTPUT_LIBTOOL_COMMANDS +AS_EXIT(0) +_LTEOF +chmod +x "$CONFIG_LT" + +# configure is writing to config.log, but config.lt does its own redirection, +# appending to config.log, which fails on DOS, as config.log is still kept +# open by configure. Here we exec the FD to /dev/null, effectively closing +# config.log, so it can be properly (re)opened and appended to by config.lt. +lt_cl_success=: +test "$silent" = yes && + lt_config_lt_args="$lt_config_lt_args --quiet" +exec AS_MESSAGE_LOG_FD>/dev/null +$SHELL "$CONFIG_LT" $lt_config_lt_args || lt_cl_success=false +exec AS_MESSAGE_LOG_FD>>config.log +$lt_cl_success || AS_EXIT(1) +]) +m4trace:/usr/share/aclocal/libtool.m4:790: -1- AC_DEFUN([LT_SUPPORTED_TAG], []) +m4trace:/usr/share/aclocal/libtool.m4:801: -1- AC_DEFUN([LT_LANG], [AC_BEFORE([$0], [LT_OUTPUT])dnl +m4_case([$1], + [C], [_LT_LANG(C)], + [C++], [_LT_LANG(CXX)], + [Go], [_LT_LANG(GO)], + [Java], [_LT_LANG(GCJ)], + [Fortran 77], [_LT_LANG(F77)], + [Fortran], [_LT_LANG(FC)], + [Windows Resource], [_LT_LANG(RC)], + [m4_ifdef([_LT_LANG_]$1[_CONFIG], + [_LT_LANG($1)], + [m4_fatal([$0: unsupported language: "$1"])])])dnl +]) +m4trace:/usr/share/aclocal/libtool.m4:893: -1- AU_DEFUN([AC_LIBTOOL_CXX], [LT_LANG(C++)]) +m4trace:/usr/share/aclocal/libtool.m4:893: -1- AC_DEFUN([AC_LIBTOOL_CXX], [AC_DIAGNOSE([obsolete], [The macro `AC_LIBTOOL_CXX' is obsolete. +You should run autoupdate.])dnl +LT_LANG(C++)]) +m4trace:/usr/share/aclocal/libtool.m4:894: -1- AU_DEFUN([AC_LIBTOOL_F77], [LT_LANG(Fortran 77)]) +m4trace:/usr/share/aclocal/libtool.m4:894: -1- AC_DEFUN([AC_LIBTOOL_F77], [AC_DIAGNOSE([obsolete], [The macro `AC_LIBTOOL_F77' is obsolete. +You should run autoupdate.])dnl +LT_LANG(Fortran 77)]) +m4trace:/usr/share/aclocal/libtool.m4:895: -1- AU_DEFUN([AC_LIBTOOL_FC], [LT_LANG(Fortran)]) +m4trace:/usr/share/aclocal/libtool.m4:895: -1- AC_DEFUN([AC_LIBTOOL_FC], [AC_DIAGNOSE([obsolete], [The macro `AC_LIBTOOL_FC' is obsolete. +You should run autoupdate.])dnl +LT_LANG(Fortran)]) +m4trace:/usr/share/aclocal/libtool.m4:896: -1- AU_DEFUN([AC_LIBTOOL_GCJ], [LT_LANG(Java)]) +m4trace:/usr/share/aclocal/libtool.m4:896: -1- AC_DEFUN([AC_LIBTOOL_GCJ], [AC_DIAGNOSE([obsolete], [The macro `AC_LIBTOOL_GCJ' is obsolete. +You should run autoupdate.])dnl +LT_LANG(Java)]) +m4trace:/usr/share/aclocal/libtool.m4:897: -1- AU_DEFUN([AC_LIBTOOL_RC], [LT_LANG(Windows Resource)]) +m4trace:/usr/share/aclocal/libtool.m4:897: -1- AC_DEFUN([AC_LIBTOOL_RC], [AC_DIAGNOSE([obsolete], [The macro `AC_LIBTOOL_RC' is obsolete. +You should run autoupdate.])dnl +LT_LANG(Windows Resource)]) +m4trace:/usr/share/aclocal/libtool.m4:1225: -1- AC_DEFUN([_LT_WITH_SYSROOT], [AC_MSG_CHECKING([for sysroot]) +AC_ARG_WITH([sysroot], +[ --with-sysroot[=DIR] Search for dependent libraries within DIR + (or the compiler's sysroot if not specified).], +[], [with_sysroot=no]) + +dnl lt_sysroot will always be passed unquoted. We quote it here +dnl in case the user passed a directory name. +lt_sysroot= +case ${with_sysroot} in #( + yes) + if test "$GCC" = yes; then + lt_sysroot=`$CC --print-sysroot 2>/dev/null` + fi + ;; #( + /*) + lt_sysroot=`echo "$with_sysroot" | sed -e "$sed_quote_subst"` + ;; #( + no|'') + ;; #( + *) + AC_MSG_RESULT([${with_sysroot}]) + AC_MSG_ERROR([The sysroot must be an absolute path.]) + ;; +esac + + AC_MSG_RESULT([${lt_sysroot:-no}]) +_LT_DECL([], [lt_sysroot], [0], [The root where to search for ]dnl +[dependent libraries, and in which our libraries should be installed.])]) +m4trace:/usr/share/aclocal/libtool.m4:1502: -1- AC_DEFUN([_LT_COMPILER_OPTION], [m4_require([_LT_FILEUTILS_DEFAULTS])dnl +m4_require([_LT_DECL_SED])dnl +AC_CACHE_CHECK([$1], [$2], + [$2=no + m4_if([$4], , [ac_outfile=conftest.$ac_objext], [ac_outfile=$4]) + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + lt_compiler_flag="$3" + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + # The option is referenced via a variable to avoid confusing sed. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ + -e 's: [[^ ]]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&AS_MESSAGE_LOG_FD) + (eval "$lt_compile" 2>conftest.err) + ac_status=$? + cat conftest.err >&AS_MESSAGE_LOG_FD + echo "$as_me:$LINENO: \$? = $ac_status" >&AS_MESSAGE_LOG_FD + if (exit $ac_status) && test -s "$ac_outfile"; then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings other than the usual output. + $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp + $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 + if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then + $2=yes + fi + fi + $RM conftest* +]) + +if test x"[$]$2" = xyes; then + m4_if([$5], , :, [$5]) +else + m4_if([$6], , :, [$6]) +fi +]) +m4trace:/usr/share/aclocal/libtool.m4:1544: -1- AU_DEFUN([AC_LIBTOOL_COMPILER_OPTION], [m4_if($#, 0, [_LT_COMPILER_OPTION], [_LT_COMPILER_OPTION($@)])]) +m4trace:/usr/share/aclocal/libtool.m4:1544: -1- AC_DEFUN([AC_LIBTOOL_COMPILER_OPTION], [AC_DIAGNOSE([obsolete], [The macro `AC_LIBTOOL_COMPILER_OPTION' is obsolete. +You should run autoupdate.])dnl +m4_if($#, 0, [_LT_COMPILER_OPTION], [_LT_COMPILER_OPTION($@)])]) +m4trace:/usr/share/aclocal/libtool.m4:1553: -1- AC_DEFUN([_LT_LINKER_OPTION], [m4_require([_LT_FILEUTILS_DEFAULTS])dnl +m4_require([_LT_DECL_SED])dnl +AC_CACHE_CHECK([$1], [$2], + [$2=no + save_LDFLAGS="$LDFLAGS" + LDFLAGS="$LDFLAGS $3" + echo "$lt_simple_link_test_code" > conftest.$ac_ext + if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then + # The linker can only warn and ignore the option if not recognized + # So say no if there are warnings + if test -s conftest.err; then + # Append any errors to the config.log. + cat conftest.err 1>&AS_MESSAGE_LOG_FD + $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp + $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 + if diff conftest.exp conftest.er2 >/dev/null; then + $2=yes + fi + else + $2=yes + fi + fi + $RM -r conftest* + LDFLAGS="$save_LDFLAGS" +]) + +if test x"[$]$2" = xyes; then + m4_if([$4], , :, [$4]) +else + m4_if([$5], , :, [$5]) +fi +]) +m4trace:/usr/share/aclocal/libtool.m4:1588: -1- AU_DEFUN([AC_LIBTOOL_LINKER_OPTION], [m4_if($#, 0, [_LT_LINKER_OPTION], [_LT_LINKER_OPTION($@)])]) +m4trace:/usr/share/aclocal/libtool.m4:1588: -1- AC_DEFUN([AC_LIBTOOL_LINKER_OPTION], [AC_DIAGNOSE([obsolete], [The macro `AC_LIBTOOL_LINKER_OPTION' is obsolete. +You should run autoupdate.])dnl +m4_if($#, 0, [_LT_LINKER_OPTION], [_LT_LINKER_OPTION($@)])]) +m4trace:/usr/share/aclocal/libtool.m4:1595: -1- AC_DEFUN([LT_CMD_MAX_LEN], [AC_REQUIRE([AC_CANONICAL_HOST])dnl +# find the maximum length of command line arguments +AC_MSG_CHECKING([the maximum length of command line arguments]) +AC_CACHE_VAL([lt_cv_sys_max_cmd_len], [dnl + i=0 + teststring="ABCD" + + case $build_os in + msdosdjgpp*) + # On DJGPP, this test can blow up pretty badly due to problems in libc + # (any single argument exceeding 2000 bytes causes a buffer overrun + # during glob expansion). Even if it were fixed, the result of this + # check would be larger than it should be. + lt_cv_sys_max_cmd_len=12288; # 12K is about right + ;; + + gnu*) + # Under GNU Hurd, this test is not required because there is + # no limit to the length of command line arguments. + # Libtool will interpret -1 as no limit whatsoever + lt_cv_sys_max_cmd_len=-1; + ;; + + cygwin* | mingw* | cegcc*) + # On Win9x/ME, this test blows up -- it succeeds, but takes + # about 5 minutes as the teststring grows exponentially. + # Worse, since 9x/ME are not pre-emptively multitasking, + # you end up with a "frozen" computer, even though with patience + # the test eventually succeeds (with a max line length of 256k). + # Instead, let's just punt: use the minimum linelength reported by + # all of the supported platforms: 8192 (on NT/2K/XP). + lt_cv_sys_max_cmd_len=8192; + ;; + + mint*) + # On MiNT this can take a long time and run out of memory. + lt_cv_sys_max_cmd_len=8192; + ;; + + amigaos*) + # On AmigaOS with pdksh, this test takes hours, literally. + # So we just punt and use a minimum line length of 8192. + lt_cv_sys_max_cmd_len=8192; + ;; + + netbsd* | freebsd* | openbsd* | darwin* | dragonfly*) + # This has been around since 386BSD, at least. Likely further. + if test -x /sbin/sysctl; then + lt_cv_sys_max_cmd_len=`/sbin/sysctl -n kern.argmax` + elif test -x /usr/sbin/sysctl; then + lt_cv_sys_max_cmd_len=`/usr/sbin/sysctl -n kern.argmax` + else + lt_cv_sys_max_cmd_len=65536 # usable default for all BSDs + fi + # And add a safety zone + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` + ;; + + interix*) + # We know the value 262144 and hardcode it with a safety zone (like BSD) + lt_cv_sys_max_cmd_len=196608 + ;; + + os2*) + # The test takes a long time on OS/2. + lt_cv_sys_max_cmd_len=8192 + ;; + + osf*) + # Dr. Hans Ekkehard Plesser reports seeing a kernel panic running configure + # due to this test when exec_disable_arg_limit is 1 on Tru64. It is not + # nice to cause kernel panics so lets avoid the loop below. + # First set a reasonable default. + lt_cv_sys_max_cmd_len=16384 + # + if test -x /sbin/sysconfig; then + case `/sbin/sysconfig -q proc exec_disable_arg_limit` in + *1*) lt_cv_sys_max_cmd_len=-1 ;; + esac + fi + ;; + sco3.2v5*) + lt_cv_sys_max_cmd_len=102400 + ;; + sysv5* | sco5v6* | sysv4.2uw2*) + kargmax=`grep ARG_MAX /etc/conf/cf.d/stune 2>/dev/null` + if test -n "$kargmax"; then + lt_cv_sys_max_cmd_len=`echo $kargmax | sed 's/.*[[ ]]//'` + else + lt_cv_sys_max_cmd_len=32768 + fi + ;; + *) + lt_cv_sys_max_cmd_len=`(getconf ARG_MAX) 2> /dev/null` + if test -n "$lt_cv_sys_max_cmd_len"; then + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` + else + # Make teststring a little bigger before we do anything with it. + # a 1K string should be a reasonable start. + for i in 1 2 3 4 5 6 7 8 ; do + teststring=$teststring$teststring + done + SHELL=${SHELL-${CONFIG_SHELL-/bin/sh}} + # If test is not a shell built-in, we'll probably end up computing a + # maximum length that is only half of the actual maximum length, but + # we can't tell. + while { test "X"`env echo "$teststring$teststring" 2>/dev/null` \ + = "X$teststring$teststring"; } >/dev/null 2>&1 && + test $i != 17 # 1/2 MB should be enough + do + i=`expr $i + 1` + teststring=$teststring$teststring + done + # Only check the string length outside the loop. + lt_cv_sys_max_cmd_len=`expr "X$teststring" : ".*" 2>&1` + teststring= + # Add a significant safety factor because C++ compilers can tack on + # massive amounts of additional arguments before passing them to the + # linker. It appears as though 1/2 is a usable value. + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 2` + fi + ;; + esac +]) +if test -n $lt_cv_sys_max_cmd_len ; then + AC_MSG_RESULT($lt_cv_sys_max_cmd_len) +else + AC_MSG_RESULT(none) +fi +max_cmd_len=$lt_cv_sys_max_cmd_len +_LT_DECL([], [max_cmd_len], [0], + [What is the maximum length of a command?]) +]) +m4trace:/usr/share/aclocal/libtool.m4:1733: -1- AU_DEFUN([AC_LIBTOOL_SYS_MAX_CMD_LEN], [m4_if($#, 0, [LT_CMD_MAX_LEN], [LT_CMD_MAX_LEN($@)])]) +m4trace:/usr/share/aclocal/libtool.m4:1733: -1- AC_DEFUN([AC_LIBTOOL_SYS_MAX_CMD_LEN], [AC_DIAGNOSE([obsolete], [The macro `AC_LIBTOOL_SYS_MAX_CMD_LEN' is obsolete. +You should run autoupdate.])dnl +m4_if($#, 0, [LT_CMD_MAX_LEN], [LT_CMD_MAX_LEN($@)])]) +m4trace:/usr/share/aclocal/libtool.m4:1844: -1- AC_DEFUN([LT_SYS_DLOPEN_SELF], [m4_require([_LT_HEADER_DLFCN])dnl +if test "x$enable_dlopen" != xyes; then + enable_dlopen=unknown + enable_dlopen_self=unknown + enable_dlopen_self_static=unknown +else + lt_cv_dlopen=no + lt_cv_dlopen_libs= + + case $host_os in + beos*) + lt_cv_dlopen="load_add_on" + lt_cv_dlopen_libs= + lt_cv_dlopen_self=yes + ;; + + mingw* | pw32* | cegcc*) + lt_cv_dlopen="LoadLibrary" + lt_cv_dlopen_libs= + ;; + + cygwin*) + lt_cv_dlopen="dlopen" + lt_cv_dlopen_libs= + ;; + + darwin*) + # if libdl is installed we need to link against it + AC_CHECK_LIB([dl], [dlopen], + [lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl"],[ + lt_cv_dlopen="dyld" + lt_cv_dlopen_libs= + lt_cv_dlopen_self=yes + ]) + ;; + + *) + AC_CHECK_FUNC([shl_load], + [lt_cv_dlopen="shl_load"], + [AC_CHECK_LIB([dld], [shl_load], + [lt_cv_dlopen="shl_load" lt_cv_dlopen_libs="-ldld"], + [AC_CHECK_FUNC([dlopen], + [lt_cv_dlopen="dlopen"], + [AC_CHECK_LIB([dl], [dlopen], + [lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl"], + [AC_CHECK_LIB([svld], [dlopen], + [lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-lsvld"], + [AC_CHECK_LIB([dld], [dld_link], + [lt_cv_dlopen="dld_link" lt_cv_dlopen_libs="-ldld"]) + ]) + ]) + ]) + ]) + ]) + ;; + esac + + if test "x$lt_cv_dlopen" != xno; then + enable_dlopen=yes + else + enable_dlopen=no + fi + + case $lt_cv_dlopen in + dlopen) + save_CPPFLAGS="$CPPFLAGS" + test "x$ac_cv_header_dlfcn_h" = xyes && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H" + + save_LDFLAGS="$LDFLAGS" + wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\" + + save_LIBS="$LIBS" + LIBS="$lt_cv_dlopen_libs $LIBS" + + AC_CACHE_CHECK([whether a program can dlopen itself], + lt_cv_dlopen_self, [dnl + _LT_TRY_DLOPEN_SELF( + lt_cv_dlopen_self=yes, lt_cv_dlopen_self=yes, + lt_cv_dlopen_self=no, lt_cv_dlopen_self=cross) + ]) + + if test "x$lt_cv_dlopen_self" = xyes; then + wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $lt_prog_compiler_static\" + AC_CACHE_CHECK([whether a statically linked program can dlopen itself], + lt_cv_dlopen_self_static, [dnl + _LT_TRY_DLOPEN_SELF( + lt_cv_dlopen_self_static=yes, lt_cv_dlopen_self_static=yes, + lt_cv_dlopen_self_static=no, lt_cv_dlopen_self_static=cross) + ]) + fi + + CPPFLAGS="$save_CPPFLAGS" + LDFLAGS="$save_LDFLAGS" + LIBS="$save_LIBS" + ;; + esac + + case $lt_cv_dlopen_self in + yes|no) enable_dlopen_self=$lt_cv_dlopen_self ;; + *) enable_dlopen_self=unknown ;; + esac + + case $lt_cv_dlopen_self_static in + yes|no) enable_dlopen_self_static=$lt_cv_dlopen_self_static ;; + *) enable_dlopen_self_static=unknown ;; + esac +fi +_LT_DECL([dlopen_support], [enable_dlopen], [0], + [Whether dlopen is supported]) +_LT_DECL([dlopen_self], [enable_dlopen_self], [0], + [Whether dlopen of programs is supported]) +_LT_DECL([dlopen_self_static], [enable_dlopen_self_static], [0], + [Whether dlopen of statically linked programs is supported]) +]) +m4trace:/usr/share/aclocal/libtool.m4:1961: -1- AU_DEFUN([AC_LIBTOOL_DLOPEN_SELF], [m4_if($#, 0, [LT_SYS_DLOPEN_SELF], [LT_SYS_DLOPEN_SELF($@)])]) +m4trace:/usr/share/aclocal/libtool.m4:1961: -1- AC_DEFUN([AC_LIBTOOL_DLOPEN_SELF], [AC_DIAGNOSE([obsolete], [The macro `AC_LIBTOOL_DLOPEN_SELF' is obsolete. +You should run autoupdate.])dnl +m4_if($#, 0, [LT_SYS_DLOPEN_SELF], [LT_SYS_DLOPEN_SELF($@)])]) +m4trace:/usr/share/aclocal/libtool.m4:2942: -1- AC_DEFUN([_LT_PATH_TOOL_PREFIX], [m4_require([_LT_DECL_EGREP])dnl +AC_MSG_CHECKING([for $1]) +AC_CACHE_VAL(lt_cv_path_MAGIC_CMD, +[case $MAGIC_CMD in +[[\\/*] | ?:[\\/]*]) + lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path. + ;; +*) + lt_save_MAGIC_CMD="$MAGIC_CMD" + lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR +dnl $ac_dummy forces splitting on constant user-supplied paths. +dnl POSIX.2 word splitting is done only on the output of word expansions, +dnl not every word. This closes a longstanding sh security hole. + ac_dummy="m4_if([$2], , $PATH, [$2])" + for ac_dir in $ac_dummy; do + IFS="$lt_save_ifs" + test -z "$ac_dir" && ac_dir=. + if test -f $ac_dir/$1; then + lt_cv_path_MAGIC_CMD="$ac_dir/$1" + if test -n "$file_magic_test_file"; then + case $deplibs_check_method in + "file_magic "*) + file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"` + MAGIC_CMD="$lt_cv_path_MAGIC_CMD" + if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null | + $EGREP "$file_magic_regex" > /dev/null; then + : + else + cat <<_LT_EOF 1>&2 + +*** Warning: the command libtool uses to detect shared libraries, +*** $file_magic_cmd, produces output that libtool cannot recognize. +*** The result is that libtool may fail to recognize shared libraries +*** as such. This will affect the creation of libtool libraries that +*** depend on shared libraries, but programs linked with such libtool +*** libraries will work regardless of this problem. Nevertheless, you +*** may want to report the problem to your system manager and/or to +*** bug-libtool@gnu.org + +_LT_EOF + fi ;; + esac + fi + break + fi + done + IFS="$lt_save_ifs" + MAGIC_CMD="$lt_save_MAGIC_CMD" + ;; +esac]) +MAGIC_CMD="$lt_cv_path_MAGIC_CMD" +if test -n "$MAGIC_CMD"; then + AC_MSG_RESULT($MAGIC_CMD) +else + AC_MSG_RESULT(no) +fi +_LT_DECL([], [MAGIC_CMD], [0], + [Used to examine libraries when file_magic_cmd begins with "file"])dnl +]) +m4trace:/usr/share/aclocal/libtool.m4:3004: -1- AU_DEFUN([AC_PATH_TOOL_PREFIX], [m4_if($#, 0, [_LT_PATH_TOOL_PREFIX], [_LT_PATH_TOOL_PREFIX($@)])]) +m4trace:/usr/share/aclocal/libtool.m4:3004: -1- AC_DEFUN([AC_PATH_TOOL_PREFIX], [AC_DIAGNOSE([obsolete], [The macro `AC_PATH_TOOL_PREFIX' is obsolete. +You should run autoupdate.])dnl +m4_if($#, 0, [_LT_PATH_TOOL_PREFIX], [_LT_PATH_TOOL_PREFIX($@)])]) +m4trace:/usr/share/aclocal/libtool.m4:3027: -1- AC_DEFUN([LT_PATH_LD], [AC_REQUIRE([AC_PROG_CC])dnl +AC_REQUIRE([AC_CANONICAL_HOST])dnl +AC_REQUIRE([AC_CANONICAL_BUILD])dnl +m4_require([_LT_DECL_SED])dnl +m4_require([_LT_DECL_EGREP])dnl +m4_require([_LT_PROG_ECHO_BACKSLASH])dnl + +AC_ARG_WITH([gnu-ld], + [AS_HELP_STRING([--with-gnu-ld], + [assume the C compiler uses GNU ld @<:@default=no@:>@])], + [test "$withval" = no || with_gnu_ld=yes], + [with_gnu_ld=no])dnl + +ac_prog=ld +if test "$GCC" = yes; then + # Check if gcc -print-prog-name=ld gives a path. + AC_MSG_CHECKING([for ld used by $CC]) + case $host in + *-*-mingw*) + # gcc leaves a trailing carriage return which upsets mingw + ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;; + *) + ac_prog=`($CC -print-prog-name=ld) 2>&5` ;; + esac + case $ac_prog in + # Accept absolute paths. + [[\\/]]* | ?:[[\\/]]*) + re_direlt='/[[^/]][[^/]]*/\.\./' + # Canonicalize the pathname of ld + ac_prog=`$ECHO "$ac_prog"| $SED 's%\\\\%/%g'` + while $ECHO "$ac_prog" | $GREP "$re_direlt" > /dev/null 2>&1; do + ac_prog=`$ECHO $ac_prog| $SED "s%$re_direlt%/%"` + done + test -z "$LD" && LD="$ac_prog" + ;; + "") + # If it fails, then pretend we aren't using GCC. + ac_prog=ld + ;; + *) + # If it is relative, then search for the first ld in PATH. + with_gnu_ld=unknown + ;; + esac +elif test "$with_gnu_ld" = yes; then + AC_MSG_CHECKING([for GNU ld]) +else + AC_MSG_CHECKING([for non-GNU ld]) +fi +AC_CACHE_VAL(lt_cv_path_LD, +[if test -z "$LD"; then + lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR + for ac_dir in $PATH; do + IFS="$lt_save_ifs" + test -z "$ac_dir" && ac_dir=. + if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then + lt_cv_path_LD="$ac_dir/$ac_prog" + # Check to see if the program is GNU ld. I'd rather use --version, + # but apparently some variants of GNU ld only accept -v. + # Break only if it was the GNU/non-GNU ld that we prefer. + case `"$lt_cv_path_LD" -v 2>&1 &1 | sed '1q'` in + */dev/null* | *'Invalid file or object type'*) + lt_cv_path_NM="$tmp_nm -B" + break + ;; + *) + case `"$tmp_nm" -p /dev/null 2>&1 | sed '1q'` in + */dev/null*) + lt_cv_path_NM="$tmp_nm -p" + break + ;; + *) + lt_cv_path_NM=${lt_cv_path_NM="$tmp_nm"} # keep the first match, but + continue # so that we can try to find one that supports BSD flags + ;; + esac + ;; + esac + fi + done + IFS="$lt_save_ifs" + done + : ${lt_cv_path_NM=no} +fi]) +if test "$lt_cv_path_NM" != "no"; then + NM="$lt_cv_path_NM" +else + # Didn't find any BSD compatible name lister, look for dumpbin. + if test -n "$DUMPBIN"; then : + # Let the user override the test. + else + AC_CHECK_TOOLS(DUMPBIN, [dumpbin "link -dump"], :) + case `$DUMPBIN -symbols /dev/null 2>&1 | sed '1q'` in + *COFF*) + DUMPBIN="$DUMPBIN -symbols" + ;; + *) + DUMPBIN=: + ;; + esac + fi + AC_SUBST([DUMPBIN]) + if test "$DUMPBIN" != ":"; then + NM="$DUMPBIN" + fi +fi +test -z "$NM" && NM=nm +AC_SUBST([NM]) +_LT_DECL([], [NM], [1], [A BSD- or MS-compatible name lister])dnl + +AC_CACHE_CHECK([the name lister ($NM) interface], [lt_cv_nm_interface], + [lt_cv_nm_interface="BSD nm" + echo "int some_variable = 0;" > conftest.$ac_ext + (eval echo "\"\$as_me:$LINENO: $ac_compile\"" >&AS_MESSAGE_LOG_FD) + (eval "$ac_compile" 2>conftest.err) + cat conftest.err >&AS_MESSAGE_LOG_FD + (eval echo "\"\$as_me:$LINENO: $NM \\\"conftest.$ac_objext\\\"\"" >&AS_MESSAGE_LOG_FD) + (eval "$NM \"conftest.$ac_objext\"" 2>conftest.err > conftest.out) + cat conftest.err >&AS_MESSAGE_LOG_FD + (eval echo "\"\$as_me:$LINENO: output\"" >&AS_MESSAGE_LOG_FD) + cat conftest.out >&AS_MESSAGE_LOG_FD + if $GREP 'External.*some_variable' conftest.out > /dev/null; then + lt_cv_nm_interface="MS dumpbin" + fi + rm -f conftest*]) +]) +m4trace:/usr/share/aclocal/libtool.m4:3501: -1- AU_DEFUN([AM_PROG_NM], [m4_if($#, 0, [LT_PATH_NM], [LT_PATH_NM($@)])]) +m4trace:/usr/share/aclocal/libtool.m4:3501: -1- AC_DEFUN([AM_PROG_NM], [AC_DIAGNOSE([obsolete], [The macro `AM_PROG_NM' is obsolete. +You should run autoupdate.])dnl +m4_if($#, 0, [LT_PATH_NM], [LT_PATH_NM($@)])]) +m4trace:/usr/share/aclocal/libtool.m4:3502: -1- AU_DEFUN([AC_PROG_NM], [m4_if($#, 0, [LT_PATH_NM], [LT_PATH_NM($@)])]) +m4trace:/usr/share/aclocal/libtool.m4:3502: -1- AC_DEFUN([AC_PROG_NM], [AC_DIAGNOSE([obsolete], [The macro `AC_PROG_NM' is obsolete. +You should run autoupdate.])dnl +m4_if($#, 0, [LT_PATH_NM], [LT_PATH_NM($@)])]) +m4trace:/usr/share/aclocal/libtool.m4:3572: -1- AC_DEFUN([LT_LIB_M], [AC_REQUIRE([AC_CANONICAL_HOST])dnl +LIBM= +case $host in +*-*-beos* | *-*-cegcc* | *-*-cygwin* | *-*-haiku* | *-*-pw32* | *-*-darwin*) + # These system don't have libm, or don't need it + ;; +*-ncr-sysv4.3*) + AC_CHECK_LIB(mw, _mwvalidcheckl, LIBM="-lmw") + AC_CHECK_LIB(m, cos, LIBM="$LIBM -lm") + ;; +*) + AC_CHECK_LIB(m, cos, LIBM="-lm") + ;; +esac +AC_SUBST([LIBM]) +]) +m4trace:/usr/share/aclocal/libtool.m4:3591: -1- AU_DEFUN([AC_CHECK_LIBM], [m4_if($#, 0, [LT_LIB_M], [LT_LIB_M($@)])]) +m4trace:/usr/share/aclocal/libtool.m4:3591: -1- AC_DEFUN([AC_CHECK_LIBM], [AC_DIAGNOSE([obsolete], [The macro `AC_CHECK_LIBM' is obsolete. +You should run autoupdate.])dnl +m4_if($#, 0, [LT_LIB_M], [LT_LIB_M($@)])]) +m4trace:/usr/share/aclocal/libtool.m4:7641: -1- AC_DEFUN([LT_PROG_GCJ], [m4_ifdef([AC_PROG_GCJ], [AC_PROG_GCJ], + [m4_ifdef([A][M_PROG_GCJ], [A][M_PROG_GCJ], + [AC_CHECK_TOOL(GCJ, gcj,) + test "x${GCJFLAGS+set}" = xset || GCJFLAGS="-g -O2" + AC_SUBST(GCJFLAGS)])])[]dnl +]) +m4trace:/usr/share/aclocal/libtool.m4:7650: -1- AU_DEFUN([LT_AC_PROG_GCJ], [m4_if($#, 0, [LT_PROG_GCJ], [LT_PROG_GCJ($@)])]) +m4trace:/usr/share/aclocal/libtool.m4:7650: -1- AC_DEFUN([LT_AC_PROG_GCJ], [AC_DIAGNOSE([obsolete], [The macro `LT_AC_PROG_GCJ' is obsolete. +You should run autoupdate.])dnl +m4_if($#, 0, [LT_PROG_GCJ], [LT_PROG_GCJ($@)])]) +m4trace:/usr/share/aclocal/libtool.m4:7657: -1- AC_DEFUN([LT_PROG_GO], [AC_CHECK_TOOL(GOC, gccgo,) +]) +m4trace:/usr/share/aclocal/libtool.m4:7664: -1- AC_DEFUN([LT_PROG_RC], [AC_CHECK_TOOL(RC, windres,) +]) +m4trace:/usr/share/aclocal/libtool.m4:7669: -1- AU_DEFUN([LT_AC_PROG_RC], [m4_if($#, 0, [LT_PROG_RC], [LT_PROG_RC($@)])]) +m4trace:/usr/share/aclocal/libtool.m4:7669: -1- AC_DEFUN([LT_AC_PROG_RC], [AC_DIAGNOSE([obsolete], [The macro `LT_AC_PROG_RC' is obsolete. +You should run autoupdate.])dnl +m4_if($#, 0, [LT_PROG_RC], [LT_PROG_RC($@)])]) +m4trace:/usr/share/aclocal/libtool.m4:7789: -1- AU_DEFUN([LT_AC_PROG_SED], [m4_if($#, 0, [AC_PROG_SED], [AC_PROG_SED($@)])]) +m4trace:/usr/share/aclocal/libtool.m4:7789: -1- AC_DEFUN([LT_AC_PROG_SED], [AC_DIAGNOSE([obsolete], [The macro `LT_AC_PROG_SED' is obsolete. +You should run autoupdate.])dnl +m4_if($#, 0, [AC_PROG_SED], [AC_PROG_SED($@)])]) +m4trace:/usr/share/aclocal/ltdl.m4:16: -1- AC_DEFUN([LT_CONFIG_LTDL_DIR], [AC_BEFORE([$0], [LTDL_INIT]) +_$0($*) +]) +m4trace:/usr/share/aclocal/ltdl.m4:68: -1- AC_DEFUN([LTDL_CONVENIENCE], [AC_BEFORE([$0], [LTDL_INIT])dnl +dnl Although the argument is deprecated and no longer documented, +dnl LTDL_CONVENIENCE used to take a DIRECTORY orgument, if we have one +dnl here make sure it is the same as any other declaration of libltdl's +dnl location! This also ensures lt_ltdl_dir is set when configure.ac is +dnl not yet using an explicit LT_CONFIG_LTDL_DIR. +m4_ifval([$1], [_LT_CONFIG_LTDL_DIR([$1])])dnl +_$0() +]) +m4trace:/usr/share/aclocal/ltdl.m4:81: -1- AU_DEFUN([AC_LIBLTDL_CONVENIENCE], [_LT_CONFIG_LTDL_DIR([m4_default([$1], [libltdl])]) +_LTDL_CONVENIENCE]) +m4trace:/usr/share/aclocal/ltdl.m4:81: -1- AC_DEFUN([AC_LIBLTDL_CONVENIENCE], [AC_DIAGNOSE([obsolete], [The macro `AC_LIBLTDL_CONVENIENCE' is obsolete. +You should run autoupdate.])dnl +_LT_CONFIG_LTDL_DIR([m4_default([$1], [libltdl])]) +_LTDL_CONVENIENCE]) +m4trace:/usr/share/aclocal/ltdl.m4:124: -1- AC_DEFUN([LTDL_INSTALLABLE], [AC_BEFORE([$0], [LTDL_INIT])dnl +dnl Although the argument is deprecated and no longer documented, +dnl LTDL_INSTALLABLE used to take a DIRECTORY orgument, if we have one +dnl here make sure it is the same as any other declaration of libltdl's +dnl location! This also ensures lt_ltdl_dir is set when configure.ac is +dnl not yet using an explicit LT_CONFIG_LTDL_DIR. +m4_ifval([$1], [_LT_CONFIG_LTDL_DIR([$1])])dnl +_$0() +]) +m4trace:/usr/share/aclocal/ltdl.m4:137: -1- AU_DEFUN([AC_LIBLTDL_INSTALLABLE], [_LT_CONFIG_LTDL_DIR([m4_default([$1], [libltdl])]) +_LTDL_INSTALLABLE]) +m4trace:/usr/share/aclocal/ltdl.m4:137: -1- AC_DEFUN([AC_LIBLTDL_INSTALLABLE], [AC_DIAGNOSE([obsolete], [The macro `AC_LIBLTDL_INSTALLABLE' is obsolete. +You should run autoupdate.])dnl +_LT_CONFIG_LTDL_DIR([m4_default([$1], [libltdl])]) +_LTDL_INSTALLABLE]) +m4trace:/usr/share/aclocal/ltdl.m4:213: -1- AC_DEFUN([_LT_LIBOBJ], [ + m4_pattern_allow([^_LT_LIBOBJS$]) + _LT_LIBOBJS="$_LT_LIBOBJS $1.$ac_objext" +]) +m4trace:/usr/share/aclocal/ltdl.m4:226: -1- AC_DEFUN([LTDL_INIT], [dnl Parse OPTIONS +_LT_SET_OPTIONS([$0], [$1]) + +dnl We need to keep our own list of libobjs separate from our parent project, +dnl and the easiest way to do that is redefine the AC_LIBOBJs macro while +dnl we look for our own LIBOBJs. +m4_pushdef([AC_LIBOBJ], m4_defn([_LT_LIBOBJ])) +m4_pushdef([AC_LIBSOURCES]) + +dnl If not otherwise defined, default to the 1.5.x compatible subproject mode: +m4_if(_LTDL_MODE, [], + [m4_define([_LTDL_MODE], m4_default([$2], [subproject])) + m4_if([-1], [m4_bregexp(_LTDL_MODE, [\(subproject\|\(non\)?recursive\)])], + [m4_fatal([unknown libltdl mode: ]_LTDL_MODE)])]) + +AC_ARG_WITH([included_ltdl], + [AS_HELP_STRING([--with-included-ltdl], + [use the GNU ltdl sources included here])]) + +if test "x$with_included_ltdl" != xyes; then + # We are not being forced to use the included libltdl sources, so + # decide whether there is a useful installed version we can use. + AC_CHECK_HEADER([ltdl.h], + [AC_CHECK_DECL([lt_dlinterface_register], + [AC_CHECK_LIB([ltdl], [lt_dladvise_preload], + [with_included_ltdl=no], + [with_included_ltdl=yes])], + [with_included_ltdl=yes], + [AC_INCLUDES_DEFAULT + #include ])], + [with_included_ltdl=yes], + [AC_INCLUDES_DEFAULT] + ) +fi + +dnl If neither LT_CONFIG_LTDL_DIR, LTDL_CONVENIENCE nor LTDL_INSTALLABLE +dnl was called yet, then for old times' sake, we assume libltdl is in an +dnl eponymous directory: +AC_PROVIDE_IFELSE([LT_CONFIG_LTDL_DIR], [], [_LT_CONFIG_LTDL_DIR([libltdl])]) + +AC_ARG_WITH([ltdl_include], + [AS_HELP_STRING([--with-ltdl-include=DIR], + [use the ltdl headers installed in DIR])]) + +if test -n "$with_ltdl_include"; then + if test -f "$with_ltdl_include/ltdl.h"; then : + else + AC_MSG_ERROR([invalid ltdl include directory: `$with_ltdl_include']) + fi +else + with_ltdl_include=no +fi + +AC_ARG_WITH([ltdl_lib], + [AS_HELP_STRING([--with-ltdl-lib=DIR], + [use the libltdl.la installed in DIR])]) + +if test -n "$with_ltdl_lib"; then + if test -f "$with_ltdl_lib/libltdl.la"; then : + else + AC_MSG_ERROR([invalid ltdl library directory: `$with_ltdl_lib']) + fi +else + with_ltdl_lib=no +fi + +case ,$with_included_ltdl,$with_ltdl_include,$with_ltdl_lib, in + ,yes,no,no,) + m4_case(m4_default(_LTDL_TYPE, [convenience]), + [convenience], [_LTDL_CONVENIENCE], + [installable], [_LTDL_INSTALLABLE], + [m4_fatal([unknown libltdl build type: ]_LTDL_TYPE)]) + ;; + ,no,no,no,) + # If the included ltdl is not to be used, then use the + # preinstalled libltdl we found. + AC_DEFINE([HAVE_LTDL], [1], + [Define this if a modern libltdl is already installed]) + LIBLTDL=-lltdl + LTDLDEPS= + LTDLINCL= + ;; + ,no*,no,*) + AC_MSG_ERROR([`--with-ltdl-include' and `--with-ltdl-lib' options must be used together]) + ;; + *) with_included_ltdl=no + LIBLTDL="-L$with_ltdl_lib -lltdl" + LTDLDEPS= + LTDLINCL="-I$with_ltdl_include" + ;; +esac +INCLTDL="$LTDLINCL" + +# Report our decision... +AC_MSG_CHECKING([where to find libltdl headers]) +AC_MSG_RESULT([$LTDLINCL]) +AC_MSG_CHECKING([where to find libltdl library]) +AC_MSG_RESULT([$LIBLTDL]) + +_LTDL_SETUP + +dnl restore autoconf definition. +m4_popdef([AC_LIBOBJ]) +m4_popdef([AC_LIBSOURCES]) + +AC_CONFIG_COMMANDS_PRE([ + _ltdl_libobjs= + _ltdl_ltlibobjs= + if test -n "$_LT_LIBOBJS"; then + # Remove the extension. + _lt_sed_drop_objext='s/\.o$//;s/\.obj$//' + for i in `for i in $_LT_LIBOBJS; do echo "$i"; done | sed "$_lt_sed_drop_objext" | sort -u`; do + _ltdl_libobjs="$_ltdl_libobjs $lt_libobj_prefix$i.$ac_objext" + _ltdl_ltlibobjs="$_ltdl_ltlibobjs $lt_libobj_prefix$i.lo" + done + fi + AC_SUBST([ltdl_LIBOBJS], [$_ltdl_libobjs]) + AC_SUBST([ltdl_LTLIBOBJS], [$_ltdl_ltlibobjs]) +]) + +# Only expand once: +m4_define([LTDL_INIT]) +]) +m4trace:/usr/share/aclocal/ltdl.m4:352: -1- AU_DEFUN([AC_LIB_LTDL], [LTDL_INIT($@)]) +m4trace:/usr/share/aclocal/ltdl.m4:352: -1- AC_DEFUN([AC_LIB_LTDL], [AC_DIAGNOSE([obsolete], [The macro `AC_LIB_LTDL' is obsolete. +You should run autoupdate.])dnl +LTDL_INIT($@)]) +m4trace:/usr/share/aclocal/ltdl.m4:353: -1- AU_DEFUN([AC_WITH_LTDL], [LTDL_INIT($@)]) +m4trace:/usr/share/aclocal/ltdl.m4:353: -1- AC_DEFUN([AC_WITH_LTDL], [AC_DIAGNOSE([obsolete], [The macro `AC_WITH_LTDL' is obsolete. +You should run autoupdate.])dnl +LTDL_INIT($@)]) +m4trace:/usr/share/aclocal/ltdl.m4:354: -1- AU_DEFUN([LT_WITH_LTDL], [LTDL_INIT($@)]) +m4trace:/usr/share/aclocal/ltdl.m4:354: -1- AC_DEFUN([LT_WITH_LTDL], [AC_DIAGNOSE([obsolete], [The macro `LT_WITH_LTDL' is obsolete. +You should run autoupdate.])dnl +LTDL_INIT($@)]) +m4trace:/usr/share/aclocal/ltdl.m4:367: -1- AC_DEFUN([_LTDL_SETUP], [AC_REQUIRE([AC_PROG_CC])dnl +AC_REQUIRE([LT_SYS_MODULE_EXT])dnl +AC_REQUIRE([LT_SYS_MODULE_PATH])dnl +AC_REQUIRE([LT_SYS_DLSEARCH_PATH])dnl +AC_REQUIRE([LT_LIB_DLLOAD])dnl +AC_REQUIRE([LT_SYS_SYMBOL_USCORE])dnl +AC_REQUIRE([LT_FUNC_DLSYM_USCORE])dnl +AC_REQUIRE([LT_SYS_DLOPEN_DEPLIBS])dnl +AC_REQUIRE([gl_FUNC_ARGZ])dnl + +m4_require([_LT_CHECK_OBJDIR])dnl +m4_require([_LT_HEADER_DLFCN])dnl +m4_require([_LT_CHECK_DLPREOPEN])dnl +m4_require([_LT_DECL_SED])dnl + +dnl Don't require this, or it will be expanded earlier than the code +dnl that sets the variables it relies on: +_LT_ENABLE_INSTALL + +dnl _LTDL_MODE specific code must be called at least once: +_LTDL_MODE_DISPATCH + +# In order that ltdl.c can compile, find out the first AC_CONFIG_HEADERS +# the user used. This is so that ltdl.h can pick up the parent projects +# config.h file, The first file in AC_CONFIG_HEADERS must contain the +# definitions required by ltdl.c. +# FIXME: Remove use of undocumented AC_LIST_HEADERS (2.59 compatibility). +AC_CONFIG_COMMANDS_PRE([dnl +m4_pattern_allow([^LT_CONFIG_H$])dnl +m4_ifset([AH_HEADER], + [LT_CONFIG_H=AH_HEADER], + [m4_ifset([AC_LIST_HEADERS], + [LT_CONFIG_H=`echo "AC_LIST_HEADERS" | $SED 's,^[[ ]]*,,;s,[[ :]].*$,,'`], + [])])]) +AC_SUBST([LT_CONFIG_H]) + +AC_CHECK_HEADERS([unistd.h dl.h sys/dl.h dld.h mach-o/dyld.h dirent.h], + [], [], [AC_INCLUDES_DEFAULT]) + +AC_CHECK_FUNCS([closedir opendir readdir], [], [AC_LIBOBJ([lt__dirent])]) +AC_CHECK_FUNCS([strlcat strlcpy], [], [AC_LIBOBJ([lt__strl])]) + +m4_pattern_allow([LT_LIBEXT])dnl +AC_DEFINE_UNQUOTED([LT_LIBEXT],["$libext"],[The archive extension]) + +name= +eval "lt_libprefix=\"$libname_spec\"" +m4_pattern_allow([LT_LIBPREFIX])dnl +AC_DEFINE_UNQUOTED([LT_LIBPREFIX],["$lt_libprefix"],[The archive prefix]) + +name=ltdl +eval "LTDLOPEN=\"$libname_spec\"" +AC_SUBST([LTDLOPEN]) +]) +m4trace:/usr/share/aclocal/ltdl.m4:443: -1- AC_DEFUN([LT_SYS_DLOPEN_DEPLIBS], [AC_REQUIRE([AC_CANONICAL_HOST])dnl +AC_CACHE_CHECK([whether deplibs are loaded by dlopen], + [lt_cv_sys_dlopen_deplibs], + [# PORTME does your system automatically load deplibs for dlopen? + # or its logical equivalent (e.g. shl_load for HP-UX < 11) + # For now, we just catch OSes we know something about -- in the + # future, we'll try test this programmatically. + lt_cv_sys_dlopen_deplibs=unknown + case $host_os in + aix3*|aix4.1.*|aix4.2.*) + # Unknown whether this is true for these versions of AIX, but + # we want this `case' here to explicitly catch those versions. + lt_cv_sys_dlopen_deplibs=unknown + ;; + aix[[4-9]]*) + lt_cv_sys_dlopen_deplibs=yes + ;; + amigaos*) + case $host_cpu in + powerpc) + lt_cv_sys_dlopen_deplibs=no + ;; + esac + ;; + darwin*) + # Assuming the user has installed a libdl from somewhere, this is true + # If you are looking for one http://www.opendarwin.org/projects/dlcompat + lt_cv_sys_dlopen_deplibs=yes + ;; + freebsd* | dragonfly*) + lt_cv_sys_dlopen_deplibs=yes + ;; + gnu* | linux* | k*bsd*-gnu | kopensolaris*-gnu) + # GNU and its variants, using gnu ld.so (Glibc) + lt_cv_sys_dlopen_deplibs=yes + ;; + hpux10*|hpux11*) + lt_cv_sys_dlopen_deplibs=yes + ;; + interix*) + lt_cv_sys_dlopen_deplibs=yes + ;; + irix[[12345]]*|irix6.[[01]]*) + # Catch all versions of IRIX before 6.2, and indicate that we don't + # know how it worked for any of those versions. + lt_cv_sys_dlopen_deplibs=unknown + ;; + irix*) + # The case above catches anything before 6.2, and it's known that + # at 6.2 and later dlopen does load deplibs. + lt_cv_sys_dlopen_deplibs=yes + ;; + netbsd* | netbsdelf*-gnu) + lt_cv_sys_dlopen_deplibs=yes + ;; + openbsd*) + lt_cv_sys_dlopen_deplibs=yes + ;; + osf[[1234]]*) + # dlopen did load deplibs (at least at 4.x), but until the 5.x series, + # it did *not* use an RPATH in a shared library to find objects the + # library depends on, so we explicitly say `no'. + lt_cv_sys_dlopen_deplibs=no + ;; + osf5.0|osf5.0a|osf5.1) + # dlopen *does* load deplibs and with the right loader patch applied + # it even uses RPATH in a shared library to search for shared objects + # that the library depends on, but there's no easy way to know if that + # patch is installed. Since this is the case, all we can really + # say is unknown -- it depends on the patch being installed. If + # it is, this changes to `yes'. Without it, it would be `no'. + lt_cv_sys_dlopen_deplibs=unknown + ;; + osf*) + # the two cases above should catch all versions of osf <= 5.1. Read + # the comments above for what we know about them. + # At > 5.1, deplibs are loaded *and* any RPATH in a shared library + # is used to find them so we can finally say `yes'. + lt_cv_sys_dlopen_deplibs=yes + ;; + qnx*) + lt_cv_sys_dlopen_deplibs=yes + ;; + solaris*) + lt_cv_sys_dlopen_deplibs=yes + ;; + sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) + libltdl_cv_sys_dlopen_deplibs=yes + ;; + esac + ]) +if test "$lt_cv_sys_dlopen_deplibs" != yes; then + AC_DEFINE([LTDL_DLOPEN_DEPLIBS], [1], + [Define if the OS needs help to load dependent libraries for dlopen().]) +fi +]) +m4trace:/usr/share/aclocal/ltdl.m4:542: -1- AU_DEFUN([AC_LTDL_SYS_DLOPEN_DEPLIBS], [m4_if($#, 0, [LT_SYS_DLOPEN_DEPLIBS], [LT_SYS_DLOPEN_DEPLIBS($@)])]) +m4trace:/usr/share/aclocal/ltdl.m4:542: -1- AC_DEFUN([AC_LTDL_SYS_DLOPEN_DEPLIBS], [AC_DIAGNOSE([obsolete], [The macro `AC_LTDL_SYS_DLOPEN_DEPLIBS' is obsolete. +You should run autoupdate.])dnl +m4_if($#, 0, [LT_SYS_DLOPEN_DEPLIBS], [LT_SYS_DLOPEN_DEPLIBS($@)])]) +m4trace:/usr/share/aclocal/ltdl.m4:549: -1- AC_DEFUN([LT_SYS_MODULE_EXT], [m4_require([_LT_SYS_DYNAMIC_LINKER])dnl +AC_CACHE_CHECK([which extension is used for runtime loadable modules], + [libltdl_cv_shlibext], +[ +module=yes +eval libltdl_cv_shlibext=$shrext_cmds +module=no +eval libltdl_cv_shrext=$shrext_cmds + ]) +if test -n "$libltdl_cv_shlibext"; then + m4_pattern_allow([LT_MODULE_EXT])dnl + AC_DEFINE_UNQUOTED([LT_MODULE_EXT], ["$libltdl_cv_shlibext"], + [Define to the extension used for runtime loadable modules, say, ".so".]) +fi +if test "$libltdl_cv_shrext" != "$libltdl_cv_shlibext"; then + m4_pattern_allow([LT_SHARED_EXT])dnl + AC_DEFINE_UNQUOTED([LT_SHARED_EXT], ["$libltdl_cv_shrext"], + [Define to the shared library suffix, say, ".dylib".]) +fi +]) +m4trace:/usr/share/aclocal/ltdl.m4:572: -1- AU_DEFUN([AC_LTDL_SHLIBEXT], [m4_if($#, 0, [LT_SYS_MODULE_EXT], [LT_SYS_MODULE_EXT($@)])]) +m4trace:/usr/share/aclocal/ltdl.m4:572: -1- AC_DEFUN([AC_LTDL_SHLIBEXT], [AC_DIAGNOSE([obsolete], [The macro `AC_LTDL_SHLIBEXT' is obsolete. +You should run autoupdate.])dnl +m4_if($#, 0, [LT_SYS_MODULE_EXT], [LT_SYS_MODULE_EXT($@)])]) +m4trace:/usr/share/aclocal/ltdl.m4:579: -1- AC_DEFUN([LT_SYS_MODULE_PATH], [m4_require([_LT_SYS_DYNAMIC_LINKER])dnl +AC_CACHE_CHECK([which variable specifies run-time module search path], + [lt_cv_module_path_var], [lt_cv_module_path_var="$shlibpath_var"]) +if test -n "$lt_cv_module_path_var"; then + m4_pattern_allow([LT_MODULE_PATH_VAR])dnl + AC_DEFINE_UNQUOTED([LT_MODULE_PATH_VAR], ["$lt_cv_module_path_var"], + [Define to the name of the environment variable that determines the run-time module search path.]) +fi +]) +m4trace:/usr/share/aclocal/ltdl.m4:591: -1- AU_DEFUN([AC_LTDL_SHLIBPATH], [m4_if($#, 0, [LT_SYS_MODULE_PATH], [LT_SYS_MODULE_PATH($@)])]) +m4trace:/usr/share/aclocal/ltdl.m4:591: -1- AC_DEFUN([AC_LTDL_SHLIBPATH], [AC_DIAGNOSE([obsolete], [The macro `AC_LTDL_SHLIBPATH' is obsolete. +You should run autoupdate.])dnl +m4_if($#, 0, [LT_SYS_MODULE_PATH], [LT_SYS_MODULE_PATH($@)])]) +m4trace:/usr/share/aclocal/ltdl.m4:598: -1- AC_DEFUN([LT_SYS_DLSEARCH_PATH], [m4_require([_LT_SYS_DYNAMIC_LINKER])dnl +AC_CACHE_CHECK([for the default library search path], + [lt_cv_sys_dlsearch_path], + [lt_cv_sys_dlsearch_path="$sys_lib_dlsearch_path_spec"]) +if test -n "$lt_cv_sys_dlsearch_path"; then + sys_dlsearch_path= + for dir in $lt_cv_sys_dlsearch_path; do + if test -z "$sys_dlsearch_path"; then + sys_dlsearch_path="$dir" + else + sys_dlsearch_path="$sys_dlsearch_path$PATH_SEPARATOR$dir" + fi + done + m4_pattern_allow([LT_DLSEARCH_PATH])dnl + AC_DEFINE_UNQUOTED([LT_DLSEARCH_PATH], ["$sys_dlsearch_path"], + [Define to the system default library search path.]) +fi +]) +m4trace:/usr/share/aclocal/ltdl.m4:619: -1- AU_DEFUN([AC_LTDL_SYSSEARCHPATH], [m4_if($#, 0, [LT_SYS_DLSEARCH_PATH], [LT_SYS_DLSEARCH_PATH($@)])]) +m4trace:/usr/share/aclocal/ltdl.m4:619: -1- AC_DEFUN([AC_LTDL_SYSSEARCHPATH], [AC_DIAGNOSE([obsolete], [The macro `AC_LTDL_SYSSEARCHPATH' is obsolete. +You should run autoupdate.])dnl +m4_if($#, 0, [LT_SYS_DLSEARCH_PATH], [LT_SYS_DLSEARCH_PATH($@)])]) +m4trace:/usr/share/aclocal/ltdl.m4:645: -1- AC_DEFUN([LT_LIB_DLLOAD], [m4_pattern_allow([^LT_DLLOADERS$]) +LT_DLLOADERS= +AC_SUBST([LT_DLLOADERS]) + +AC_LANG_PUSH([C]) + +LIBADD_DLOPEN= +AC_SEARCH_LIBS([dlopen], [dl], + [AC_DEFINE([HAVE_LIBDL], [1], + [Define if you have the libdl library or equivalent.]) + if test "$ac_cv_search_dlopen" != "none required" ; then + LIBADD_DLOPEN="-ldl" + fi + libltdl_cv_lib_dl_dlopen="yes" + LT_DLLOADERS="$LT_DLLOADERS ${lt_dlopen_dir+$lt_dlopen_dir/}dlopen.la"], + [AC_LINK_IFELSE([AC_LANG_PROGRAM([[#if HAVE_DLFCN_H +# include +#endif + ]], [[dlopen(0, 0);]])], + [AC_DEFINE([HAVE_LIBDL], [1], + [Define if you have the libdl library or equivalent.]) + libltdl_cv_func_dlopen="yes" + LT_DLLOADERS="$LT_DLLOADERS ${lt_dlopen_dir+$lt_dlopen_dir/}dlopen.la"], + [AC_CHECK_LIB([svld], [dlopen], + [AC_DEFINE([HAVE_LIBDL], [1], + [Define if you have the libdl library or equivalent.]) + LIBADD_DLOPEN="-lsvld" libltdl_cv_func_dlopen="yes" + LT_DLLOADERS="$LT_DLLOADERS ${lt_dlopen_dir+$lt_dlopen_dir/}dlopen.la"])])]) +if test x"$libltdl_cv_func_dlopen" = xyes || test x"$libltdl_cv_lib_dl_dlopen" = xyes +then + lt_save_LIBS="$LIBS" + LIBS="$LIBS $LIBADD_DLOPEN" + AC_CHECK_FUNCS([dlerror]) + LIBS="$lt_save_LIBS" +fi +AC_SUBST([LIBADD_DLOPEN]) + +LIBADD_SHL_LOAD= +AC_CHECK_FUNC([shl_load], + [AC_DEFINE([HAVE_SHL_LOAD], [1], + [Define if you have the shl_load function.]) + LT_DLLOADERS="$LT_DLLOADERS ${lt_dlopen_dir+$lt_dlopen_dir/}shl_load.la"], + [AC_CHECK_LIB([dld], [shl_load], + [AC_DEFINE([HAVE_SHL_LOAD], [1], + [Define if you have the shl_load function.]) + LT_DLLOADERS="$LT_DLLOADERS ${lt_dlopen_dir+$lt_dlopen_dir/}shl_load.la" + LIBADD_SHL_LOAD="-ldld"])]) +AC_SUBST([LIBADD_SHL_LOAD]) + +case $host_os in +darwin[[1567]].*) +# We only want this for pre-Mac OS X 10.4. + AC_CHECK_FUNC([_dyld_func_lookup], + [AC_DEFINE([HAVE_DYLD], [1], + [Define if you have the _dyld_func_lookup function.]) + LT_DLLOADERS="$LT_DLLOADERS ${lt_dlopen_dir+$lt_dlopen_dir/}dyld.la"]) + ;; +beos*) + LT_DLLOADERS="$LT_DLLOADERS ${lt_dlopen_dir+$lt_dlopen_dir/}load_add_on.la" + ;; +cygwin* | mingw* | os2* | pw32*) + AC_CHECK_DECLS([cygwin_conv_path], [], [], [[#include ]]) + LT_DLLOADERS="$LT_DLLOADERS ${lt_dlopen_dir+$lt_dlopen_dir/}loadlibrary.la" + ;; +esac + +AC_CHECK_LIB([dld], [dld_link], + [AC_DEFINE([HAVE_DLD], [1], + [Define if you have the GNU dld library.]) + LT_DLLOADERS="$LT_DLLOADERS ${lt_dlopen_dir+$lt_dlopen_dir/}dld_link.la"]) +AC_SUBST([LIBADD_DLD_LINK]) + +m4_pattern_allow([^LT_DLPREOPEN$]) +LT_DLPREOPEN= +if test -n "$LT_DLLOADERS" +then + for lt_loader in $LT_DLLOADERS; do + LT_DLPREOPEN="$LT_DLPREOPEN-dlpreopen $lt_loader " + done + AC_DEFINE([HAVE_LIBDLLOADER], [1], + [Define if libdlloader will be built on this platform]) +fi +AC_SUBST([LT_DLPREOPEN]) + +dnl This isn't used anymore, but set it for backwards compatibility +LIBADD_DL="$LIBADD_DLOPEN $LIBADD_SHL_LOAD" +AC_SUBST([LIBADD_DL]) + +AC_LANG_POP +]) +m4trace:/usr/share/aclocal/ltdl.m4:738: -1- AU_DEFUN([AC_LTDL_DLLIB], [m4_if($#, 0, [LT_LIB_DLLOAD], [LT_LIB_DLLOAD($@)])]) +m4trace:/usr/share/aclocal/ltdl.m4:738: -1- AC_DEFUN([AC_LTDL_DLLIB], [AC_DIAGNOSE([obsolete], [The macro `AC_LTDL_DLLIB' is obsolete. +You should run autoupdate.])dnl +m4_if($#, 0, [LT_LIB_DLLOAD], [LT_LIB_DLLOAD($@)])]) +m4trace:/usr/share/aclocal/ltdl.m4:746: -1- AC_DEFUN([LT_SYS_SYMBOL_USCORE], [m4_require([_LT_CMD_GLOBAL_SYMBOLS])dnl +AC_CACHE_CHECK([for _ prefix in compiled symbols], + [lt_cv_sys_symbol_underscore], + [lt_cv_sys_symbol_underscore=no + cat > conftest.$ac_ext <<_LT_EOF +void nm_test_func(){} +int main(){nm_test_func;return 0;} +_LT_EOF + if AC_TRY_EVAL(ac_compile); then + # Now try to grab the symbols. + ac_nlist=conftest.nm + if AC_TRY_EVAL(NM conftest.$ac_objext \| $lt_cv_sys_global_symbol_pipe \> $ac_nlist) && test -s "$ac_nlist"; then + # See whether the symbols have a leading underscore. + if grep '^. _nm_test_func' "$ac_nlist" >/dev/null; then + lt_cv_sys_symbol_underscore=yes + else + if grep '^. nm_test_func ' "$ac_nlist" >/dev/null; then + : + else + echo "configure: cannot find nm_test_func in $ac_nlist" >&AS_MESSAGE_LOG_FD + fi + fi + else + echo "configure: cannot run $lt_cv_sys_global_symbol_pipe" >&AS_MESSAGE_LOG_FD + fi + else + echo "configure: failed program was:" >&AS_MESSAGE_LOG_FD + cat conftest.c >&AS_MESSAGE_LOG_FD + fi + rm -rf conftest* + ]) + sys_symbol_underscore=$lt_cv_sys_symbol_underscore + AC_SUBST([sys_symbol_underscore]) +]) +m4trace:/usr/share/aclocal/ltdl.m4:783: -1- AU_DEFUN([AC_LTDL_SYMBOL_USCORE], [m4_if($#, 0, [LT_SYS_SYMBOL_USCORE], [LT_SYS_SYMBOL_USCORE($@)])]) +m4trace:/usr/share/aclocal/ltdl.m4:783: -1- AC_DEFUN([AC_LTDL_SYMBOL_USCORE], [AC_DIAGNOSE([obsolete], [The macro `AC_LTDL_SYMBOL_USCORE' is obsolete. +You should run autoupdate.])dnl +m4_if($#, 0, [LT_SYS_SYMBOL_USCORE], [LT_SYS_SYMBOL_USCORE($@)])]) +m4trace:/usr/share/aclocal/ltdl.m4:790: -1- AC_DEFUN([LT_FUNC_DLSYM_USCORE], [AC_REQUIRE([LT_SYS_SYMBOL_USCORE])dnl +if test x"$lt_cv_sys_symbol_underscore" = xyes; then + if test x"$libltdl_cv_func_dlopen" = xyes || + test x"$libltdl_cv_lib_dl_dlopen" = xyes ; then + AC_CACHE_CHECK([whether we have to add an underscore for dlsym], + [libltdl_cv_need_uscore], + [libltdl_cv_need_uscore=unknown + save_LIBS="$LIBS" + LIBS="$LIBS $LIBADD_DLOPEN" + _LT_TRY_DLOPEN_SELF( + [libltdl_cv_need_uscore=no], [libltdl_cv_need_uscore=yes], + [], [libltdl_cv_need_uscore=cross]) + LIBS="$save_LIBS" + ]) + fi +fi + +if test x"$libltdl_cv_need_uscore" = xyes; then + AC_DEFINE([NEED_USCORE], [1], + [Define if dlsym() requires a leading underscore in symbol names.]) +fi +]) +m4trace:/usr/share/aclocal/ltdl.m4:815: -1- AU_DEFUN([AC_LTDL_DLSYM_USCORE], [m4_if($#, 0, [LT_FUNC_DLSYM_USCORE], [LT_FUNC_DLSYM_USCORE($@)])]) +m4trace:/usr/share/aclocal/ltdl.m4:815: -1- AC_DEFUN([AC_LTDL_DLSYM_USCORE], [AC_DIAGNOSE([obsolete], [The macro `AC_LTDL_DLSYM_USCORE' is obsolete. +You should run autoupdate.])dnl +m4_if($#, 0, [LT_FUNC_DLSYM_USCORE], [LT_FUNC_DLSYM_USCORE($@)])]) +m4trace:/usr/share/aclocal/ltoptions.m4:14: -1- AC_DEFUN([LTOPTIONS_VERSION], [m4_if([1])]) +m4trace:/usr/share/aclocal/ltoptions.m4:111: -1- AU_DEFUN([AC_LIBTOOL_DLOPEN], [_LT_SET_OPTION([LT_INIT], [dlopen]) +AC_DIAGNOSE([obsolete], +[$0: Remove this warning and the call to _LT_SET_OPTION when you +put the `dlopen' option into LT_INIT's first parameter.]) +]) +m4trace:/usr/share/aclocal/ltoptions.m4:111: -1- AC_DEFUN([AC_LIBTOOL_DLOPEN], [AC_DIAGNOSE([obsolete], [The macro `AC_LIBTOOL_DLOPEN' is obsolete. +You should run autoupdate.])dnl +_LT_SET_OPTION([LT_INIT], [dlopen]) +AC_DIAGNOSE([obsolete], +[$0: Remove this warning and the call to _LT_SET_OPTION when you +put the `dlopen' option into LT_INIT's first parameter.]) +]) +m4trace:/usr/share/aclocal/ltoptions.m4:146: -1- AU_DEFUN([AC_LIBTOOL_WIN32_DLL], [AC_REQUIRE([AC_CANONICAL_HOST])dnl +_LT_SET_OPTION([LT_INIT], [win32-dll]) +AC_DIAGNOSE([obsolete], +[$0: Remove this warning and the call to _LT_SET_OPTION when you +put the `win32-dll' option into LT_INIT's first parameter.]) +]) +m4trace:/usr/share/aclocal/ltoptions.m4:146: -1- AC_DEFUN([AC_LIBTOOL_WIN32_DLL], [AC_DIAGNOSE([obsolete], [The macro `AC_LIBTOOL_WIN32_DLL' is obsolete. +You should run autoupdate.])dnl +AC_REQUIRE([AC_CANONICAL_HOST])dnl +_LT_SET_OPTION([LT_INIT], [win32-dll]) +AC_DIAGNOSE([obsolete], +[$0: Remove this warning and the call to _LT_SET_OPTION when you +put the `win32-dll' option into LT_INIT's first parameter.]) +]) +m4trace:/usr/share/aclocal/ltoptions.m4:195: -1- AC_DEFUN([AC_ENABLE_SHARED], [_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[shared]) +]) +m4trace:/usr/share/aclocal/ltoptions.m4:199: -1- AC_DEFUN([AC_DISABLE_SHARED], [_LT_SET_OPTION([LT_INIT], [disable-shared]) +]) +m4trace:/usr/share/aclocal/ltoptions.m4:203: -1- AU_DEFUN([AM_ENABLE_SHARED], [AC_ENABLE_SHARED($@)]) +m4trace:/usr/share/aclocal/ltoptions.m4:203: -1- AC_DEFUN([AM_ENABLE_SHARED], [AC_DIAGNOSE([obsolete], [The macro `AM_ENABLE_SHARED' is obsolete. +You should run autoupdate.])dnl +AC_ENABLE_SHARED($@)]) +m4trace:/usr/share/aclocal/ltoptions.m4:204: -1- AU_DEFUN([AM_DISABLE_SHARED], [AC_DISABLE_SHARED($@)]) +m4trace:/usr/share/aclocal/ltoptions.m4:204: -1- AC_DEFUN([AM_DISABLE_SHARED], [AC_DIAGNOSE([obsolete], [The macro `AM_DISABLE_SHARED' is obsolete. +You should run autoupdate.])dnl +AC_DISABLE_SHARED($@)]) +m4trace:/usr/share/aclocal/ltoptions.m4:249: -1- AC_DEFUN([AC_ENABLE_STATIC], [_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[static]) +]) +m4trace:/usr/share/aclocal/ltoptions.m4:253: -1- AC_DEFUN([AC_DISABLE_STATIC], [_LT_SET_OPTION([LT_INIT], [disable-static]) +]) +m4trace:/usr/share/aclocal/ltoptions.m4:257: -1- AU_DEFUN([AM_ENABLE_STATIC], [AC_ENABLE_STATIC($@)]) +m4trace:/usr/share/aclocal/ltoptions.m4:257: -1- AC_DEFUN([AM_ENABLE_STATIC], [AC_DIAGNOSE([obsolete], [The macro `AM_ENABLE_STATIC' is obsolete. +You should run autoupdate.])dnl +AC_ENABLE_STATIC($@)]) +m4trace:/usr/share/aclocal/ltoptions.m4:258: -1- AU_DEFUN([AM_DISABLE_STATIC], [AC_DISABLE_STATIC($@)]) +m4trace:/usr/share/aclocal/ltoptions.m4:258: -1- AC_DEFUN([AM_DISABLE_STATIC], [AC_DIAGNOSE([obsolete], [The macro `AM_DISABLE_STATIC' is obsolete. +You should run autoupdate.])dnl +AC_DISABLE_STATIC($@)]) +m4trace:/usr/share/aclocal/ltoptions.m4:303: -1- AU_DEFUN([AC_ENABLE_FAST_INSTALL], [_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[fast-install]) +AC_DIAGNOSE([obsolete], +[$0: Remove this warning and the call to _LT_SET_OPTION when you put +the `fast-install' option into LT_INIT's first parameter.]) +]) +m4trace:/usr/share/aclocal/ltoptions.m4:303: -1- AC_DEFUN([AC_ENABLE_FAST_INSTALL], [AC_DIAGNOSE([obsolete], [The macro `AC_ENABLE_FAST_INSTALL' is obsolete. +You should run autoupdate.])dnl +_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[fast-install]) +AC_DIAGNOSE([obsolete], +[$0: Remove this warning and the call to _LT_SET_OPTION when you put +the `fast-install' option into LT_INIT's first parameter.]) +]) +m4trace:/usr/share/aclocal/ltoptions.m4:310: -1- AU_DEFUN([AC_DISABLE_FAST_INSTALL], [_LT_SET_OPTION([LT_INIT], [disable-fast-install]) +AC_DIAGNOSE([obsolete], +[$0: Remove this warning and the call to _LT_SET_OPTION when you put +the `disable-fast-install' option into LT_INIT's first parameter.]) +]) +m4trace:/usr/share/aclocal/ltoptions.m4:310: -1- AC_DEFUN([AC_DISABLE_FAST_INSTALL], [AC_DIAGNOSE([obsolete], [The macro `AC_DISABLE_FAST_INSTALL' is obsolete. +You should run autoupdate.])dnl +_LT_SET_OPTION([LT_INIT], [disable-fast-install]) +AC_DIAGNOSE([obsolete], +[$0: Remove this warning and the call to _LT_SET_OPTION when you put +the `disable-fast-install' option into LT_INIT's first parameter.]) +]) +m4trace:/usr/share/aclocal/ltoptions.m4:358: -1- AU_DEFUN([AC_LIBTOOL_PICMODE], [_LT_SET_OPTION([LT_INIT], [pic-only]) +AC_DIAGNOSE([obsolete], +[$0: Remove this warning and the call to _LT_SET_OPTION when you +put the `pic-only' option into LT_INIT's first parameter.]) +]) +m4trace:/usr/share/aclocal/ltoptions.m4:358: -1- AC_DEFUN([AC_LIBTOOL_PICMODE], [AC_DIAGNOSE([obsolete], [The macro `AC_LIBTOOL_PICMODE' is obsolete. +You should run autoupdate.])dnl +_LT_SET_OPTION([LT_INIT], [pic-only]) +AC_DIAGNOSE([obsolete], +[$0: Remove this warning and the call to _LT_SET_OPTION when you +put the `pic-only' option into LT_INIT's first parameter.]) +]) +m4trace:/usr/share/aclocal/ltsugar.m4:13: -1- AC_DEFUN([LTSUGAR_VERSION], [m4_if([0.1])]) +m4trace:/usr/share/aclocal/ltversion.m4:18: -1- AC_DEFUN([LTVERSION_VERSION], [macro_version='2.4.2' +macro_revision='1.3337' +_LT_DECL(, macro_version, 0, [Which release of libtool.m4 was used?]) +_LT_DECL(, macro_revision, 0) +]) +m4trace:/usr/share/aclocal/lt~obsolete.m4:36: -1- AC_DEFUN([LTOBSOLETE_VERSION], [m4_if([1])]) +m4trace:/usr/share/aclocal/lt~obsolete.m4:40: -1- AC_DEFUN([_LT_AC_PROG_ECHO_BACKSLASH]) +m4trace:/usr/share/aclocal/lt~obsolete.m4:41: -1- AC_DEFUN([_LT_AC_SHELL_INIT]) +m4trace:/usr/share/aclocal/lt~obsolete.m4:42: -1- AC_DEFUN([_LT_AC_SYS_LIBPATH_AIX]) +m4trace:/usr/share/aclocal/lt~obsolete.m4:44: -1- AC_DEFUN([_LT_AC_TAGVAR]) +m4trace:/usr/share/aclocal/lt~obsolete.m4:45: -1- AC_DEFUN([AC_LTDL_ENABLE_INSTALL]) +m4trace:/usr/share/aclocal/lt~obsolete.m4:46: -1- AC_DEFUN([AC_LTDL_PREOPEN]) +m4trace:/usr/share/aclocal/lt~obsolete.m4:47: -1- AC_DEFUN([_LT_AC_SYS_COMPILER]) +m4trace:/usr/share/aclocal/lt~obsolete.m4:48: -1- AC_DEFUN([_LT_AC_LOCK]) +m4trace:/usr/share/aclocal/lt~obsolete.m4:49: -1- AC_DEFUN([AC_LIBTOOL_SYS_OLD_ARCHIVE]) +m4trace:/usr/share/aclocal/lt~obsolete.m4:50: -1- AC_DEFUN([_LT_AC_TRY_DLOPEN_SELF]) +m4trace:/usr/share/aclocal/lt~obsolete.m4:51: -1- AC_DEFUN([AC_LIBTOOL_PROG_CC_C_O]) +m4trace:/usr/share/aclocal/lt~obsolete.m4:52: -1- AC_DEFUN([AC_LIBTOOL_SYS_HARD_LINK_LOCKS]) +m4trace:/usr/share/aclocal/lt~obsolete.m4:53: -1- AC_DEFUN([AC_LIBTOOL_OBJDIR]) +m4trace:/usr/share/aclocal/lt~obsolete.m4:54: -1- AC_DEFUN([AC_LTDL_OBJDIR]) +m4trace:/usr/share/aclocal/lt~obsolete.m4:55: -1- AC_DEFUN([AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH]) +m4trace:/usr/share/aclocal/lt~obsolete.m4:56: -1- AC_DEFUN([AC_LIBTOOL_SYS_LIB_STRIP]) +m4trace:/usr/share/aclocal/lt~obsolete.m4:57: -1- AC_DEFUN([AC_PATH_MAGIC]) +m4trace:/usr/share/aclocal/lt~obsolete.m4:58: -1- AC_DEFUN([AC_PROG_LD_GNU]) +m4trace:/usr/share/aclocal/lt~obsolete.m4:59: -1- AC_DEFUN([AC_PROG_LD_RELOAD_FLAG]) +m4trace:/usr/share/aclocal/lt~obsolete.m4:60: -1- AC_DEFUN([AC_DEPLIBS_CHECK_METHOD]) +m4trace:/usr/share/aclocal/lt~obsolete.m4:61: -1- AC_DEFUN([AC_LIBTOOL_PROG_COMPILER_NO_RTTI]) +m4trace:/usr/share/aclocal/lt~obsolete.m4:62: -1- AC_DEFUN([AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE]) +m4trace:/usr/share/aclocal/lt~obsolete.m4:63: -1- AC_DEFUN([AC_LIBTOOL_PROG_COMPILER_PIC]) +m4trace:/usr/share/aclocal/lt~obsolete.m4:64: -1- AC_DEFUN([AC_LIBTOOL_PROG_LD_SHLIBS]) +m4trace:/usr/share/aclocal/lt~obsolete.m4:65: -1- AC_DEFUN([AC_LIBTOOL_POSTDEP_PREDEP]) +m4trace:/usr/share/aclocal/lt~obsolete.m4:66: -1- AC_DEFUN([LT_AC_PROG_EGREP]) +m4trace:/usr/share/aclocal/lt~obsolete.m4:71: -1- AC_DEFUN([_AC_PROG_LIBTOOL]) +m4trace:/usr/share/aclocal/lt~obsolete.m4:72: -1- AC_DEFUN([AC_LIBTOOL_SETUP]) +m4trace:/usr/share/aclocal/lt~obsolete.m4:73: -1- AC_DEFUN([_LT_AC_CHECK_DLFCN]) +m4trace:/usr/share/aclocal/lt~obsolete.m4:74: -1- AC_DEFUN([AC_LIBTOOL_SYS_DYNAMIC_LINKER]) +m4trace:/usr/share/aclocal/lt~obsolete.m4:75: -1- AC_DEFUN([_LT_AC_TAGCONFIG]) +m4trace:/usr/share/aclocal/lt~obsolete.m4:77: -1- AC_DEFUN([_LT_AC_LANG_CXX]) +m4trace:/usr/share/aclocal/lt~obsolete.m4:78: -1- AC_DEFUN([_LT_AC_LANG_F77]) +m4trace:/usr/share/aclocal/lt~obsolete.m4:79: -1- AC_DEFUN([_LT_AC_LANG_GCJ]) +m4trace:/usr/share/aclocal/lt~obsolete.m4:80: -1- AC_DEFUN([AC_LIBTOOL_LANG_C_CONFIG]) +m4trace:/usr/share/aclocal/lt~obsolete.m4:81: -1- AC_DEFUN([_LT_AC_LANG_C_CONFIG]) +m4trace:/usr/share/aclocal/lt~obsolete.m4:82: -1- AC_DEFUN([AC_LIBTOOL_LANG_CXX_CONFIG]) +m4trace:/usr/share/aclocal/lt~obsolete.m4:83: -1- AC_DEFUN([_LT_AC_LANG_CXX_CONFIG]) +m4trace:/usr/share/aclocal/lt~obsolete.m4:84: -1- AC_DEFUN([AC_LIBTOOL_LANG_F77_CONFIG]) +m4trace:/usr/share/aclocal/lt~obsolete.m4:85: -1- AC_DEFUN([_LT_AC_LANG_F77_CONFIG]) +m4trace:/usr/share/aclocal/lt~obsolete.m4:86: -1- AC_DEFUN([AC_LIBTOOL_LANG_GCJ_CONFIG]) +m4trace:/usr/share/aclocal/lt~obsolete.m4:87: -1- AC_DEFUN([_LT_AC_LANG_GCJ_CONFIG]) +m4trace:/usr/share/aclocal/lt~obsolete.m4:88: -1- AC_DEFUN([AC_LIBTOOL_LANG_RC_CONFIG]) +m4trace:/usr/share/aclocal/lt~obsolete.m4:89: -1- AC_DEFUN([_LT_AC_LANG_RC_CONFIG]) +m4trace:/usr/share/aclocal/lt~obsolete.m4:90: -1- AC_DEFUN([AC_LIBTOOL_CONFIG]) +m4trace:/usr/share/aclocal/lt~obsolete.m4:91: -1- AC_DEFUN([_LT_AC_FILE_LTDLL_C]) +m4trace:/usr/share/aclocal/lt~obsolete.m4:93: -1- AC_DEFUN([_LT_AC_PROG_CXXCPP]) +m4trace:/usr/share/aclocal/lt~obsolete.m4:96: -1- AC_DEFUN([_LT_PROG_F77]) +m4trace:/usr/share/aclocal/lt~obsolete.m4:97: -1- AC_DEFUN([_LT_PROG_FC]) +m4trace:/usr/share/aclocal/lt~obsolete.m4:98: -1- AC_DEFUN([_LT_PROG_CXX]) +m4trace:/usr/share/aclocal-1.11/amversion.m4:17: -1- AC_DEFUN([AM_AUTOMAKE_VERSION], [am__api_version='1.11' +dnl Some users find AM_AUTOMAKE_VERSION and mistake it for a way to +dnl require some minimum version. Point them to the right macro. +m4_if([$1], [1.11.6], [], + [AC_FATAL([Do not call $0, use AM_INIT_AUTOMAKE([$1]).])])dnl +]) +m4trace:/usr/share/aclocal-1.11/amversion.m4:36: -1- AC_DEFUN([AM_SET_CURRENT_AUTOMAKE_VERSION], [AM_AUTOMAKE_VERSION([1.11.6])dnl +m4_ifndef([AC_AUTOCONF_VERSION], + [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl +_AM_AUTOCONF_VERSION(m4_defn([AC_AUTOCONF_VERSION]))]) +m4trace:/usr/share/aclocal-1.11/auxdir.m4:49: -1- AC_DEFUN([AM_AUX_DIR_EXPAND], [dnl Rely on autoconf to set up CDPATH properly. +AC_PREREQ([2.50])dnl +# expand $ac_aux_dir to an absolute path +am_aux_dir=`cd $ac_aux_dir && pwd` +]) +m4trace:/usr/share/aclocal-1.11/cond.m4:15: -1- AC_DEFUN([AM_CONDITIONAL], [AC_PREREQ(2.52)dnl + ifelse([$1], [TRUE], [AC_FATAL([$0: invalid condition: $1])], + [$1], [FALSE], [AC_FATAL([$0: invalid condition: $1])])dnl +AC_SUBST([$1_TRUE])dnl +AC_SUBST([$1_FALSE])dnl +_AM_SUBST_NOTMAKE([$1_TRUE])dnl +_AM_SUBST_NOTMAKE([$1_FALSE])dnl +m4_define([_AM_COND_VALUE_$1], [$2])dnl +if $2; then + $1_TRUE= + $1_FALSE='#' +else + $1_TRUE='#' + $1_FALSE= +fi +AC_CONFIG_COMMANDS_PRE( +[if test -z "${$1_TRUE}" && test -z "${$1_FALSE}"; then + AC_MSG_ERROR([[conditional "$1" was never defined. +Usually this means the macro was only invoked conditionally.]]) +fi])]) +m4trace:/usr/share/aclocal-1.11/depend.m4:28: -1- AC_DEFUN([_AM_DEPENDENCIES], [AC_REQUIRE([AM_SET_DEPDIR])dnl +AC_REQUIRE([AM_OUTPUT_DEPENDENCY_COMMANDS])dnl +AC_REQUIRE([AM_MAKE_INCLUDE])dnl +AC_REQUIRE([AM_DEP_TRACK])dnl + +ifelse([$1], CC, [depcc="$CC" am_compiler_list=], + [$1], CXX, [depcc="$CXX" am_compiler_list=], + [$1], OBJC, [depcc="$OBJC" am_compiler_list='gcc3 gcc'], + [$1], UPC, [depcc="$UPC" am_compiler_list=], + [$1], GCJ, [depcc="$GCJ" am_compiler_list='gcc3 gcc'], + [depcc="$$1" am_compiler_list=]) + +AC_CACHE_CHECK([dependency style of $depcc], + [am_cv_$1_dependencies_compiler_type], +[if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then + # We make a subdir and do the tests there. Otherwise we can end up + # making bogus files that we don't know about and never remove. For + # instance it was reported that on HP-UX the gcc test will end up + # making a dummy file named `D' -- because `-MD' means `put the output + # in D'. + rm -rf conftest.dir + mkdir conftest.dir + # Copy depcomp to subdir because otherwise we won't find it if we're + # using a relative directory. + cp "$am_depcomp" conftest.dir + cd conftest.dir + # We will build objects and dependencies in a subdirectory because + # it helps to detect inapplicable dependency modes. For instance + # both Tru64's cc and ICC support -MD to output dependencies as a + # side effect of compilation, but ICC will put the dependencies in + # the current directory while Tru64 will put them in the object + # directory. + mkdir sub + + am_cv_$1_dependencies_compiler_type=none + if test "$am_compiler_list" = ""; then + am_compiler_list=`sed -n ['s/^#*\([a-zA-Z0-9]*\))$/\1/p'] < ./depcomp` + fi + am__universal=false + m4_case([$1], [CC], + [case " $depcc " in #( + *\ -arch\ *\ -arch\ *) am__universal=true ;; + esac], + [CXX], + [case " $depcc " in #( + *\ -arch\ *\ -arch\ *) am__universal=true ;; + esac]) + + for depmode in $am_compiler_list; do + # Setup a source with many dependencies, because some compilers + # like to wrap large dependency lists on column 80 (with \), and + # we should not choose a depcomp mode which is confused by this. + # + # We need to recreate these files for each test, as the compiler may + # overwrite some of them when testing with obscure command lines. + # This happens at least with the AIX C compiler. + : > sub/conftest.c + for i in 1 2 3 4 5 6; do + echo '#include "conftst'$i'.h"' >> sub/conftest.c + # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with + # Solaris 8's {/usr,}/bin/sh. + touch sub/conftst$i.h + done + echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf + + # We check with `-c' and `-o' for the sake of the "dashmstdout" + # mode. It turns out that the SunPro C++ compiler does not properly + # handle `-M -o', and we need to detect this. Also, some Intel + # versions had trouble with output in subdirs + am__obj=sub/conftest.${OBJEXT-o} + am__minus_obj="-o $am__obj" + case $depmode in + gcc) + # This depmode causes a compiler race in universal mode. + test "$am__universal" = false || continue + ;; + nosideeffect) + # after this tag, mechanisms are not by side-effect, so they'll + # only be used when explicitly requested + if test "x$enable_dependency_tracking" = xyes; then + continue + else + break + fi + ;; + msvc7 | msvc7msys | msvisualcpp | msvcmsys) + # This compiler won't grok `-c -o', but also, the minuso test has + # not run yet. These depmodes are late enough in the game, and + # so weak that their functioning should not be impacted. + am__obj=conftest.${OBJEXT-o} + am__minus_obj= + ;; + none) break ;; + esac + if depmode=$depmode \ + source=sub/conftest.c object=$am__obj \ + depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ + $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ + >/dev/null 2>conftest.err && + grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && + grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && + grep $am__obj sub/conftest.Po > /dev/null 2>&1 && + ${MAKE-make} -s -f confmf > /dev/null 2>&1; then + # icc doesn't choke on unknown options, it will just issue warnings + # or remarks (even with -Werror). So we grep stderr for any message + # that says an option was ignored or not supported. + # When given -MP, icc 7.0 and 7.1 complain thusly: + # icc: Command line warning: ignoring option '-M'; no argument required + # The diagnosis changed in icc 8.0: + # icc: Command line remark: option '-MP' not supported + if (grep 'ignoring option' conftest.err || + grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else + am_cv_$1_dependencies_compiler_type=$depmode + break + fi + fi + done + + cd .. + rm -rf conftest.dir +else + am_cv_$1_dependencies_compiler_type=none +fi +]) +AC_SUBST([$1DEPMODE], [depmode=$am_cv_$1_dependencies_compiler_type]) +AM_CONDITIONAL([am__fastdep$1], [ + test "x$enable_dependency_tracking" != xno \ + && test "$am_cv_$1_dependencies_compiler_type" = gcc3]) +]) +m4trace:/usr/share/aclocal-1.11/depend.m4:164: -1- AC_DEFUN([AM_SET_DEPDIR], [AC_REQUIRE([AM_SET_LEADING_DOT])dnl +AC_SUBST([DEPDIR], ["${am__leading_dot}deps"])dnl +]) +m4trace:/usr/share/aclocal-1.11/depend.m4:172: -1- AC_DEFUN([AM_DEP_TRACK], [AC_ARG_ENABLE(dependency-tracking, +[ --disable-dependency-tracking speeds up one-time build + --enable-dependency-tracking do not reject slow dependency extractors]) +if test "x$enable_dependency_tracking" != xno; then + am_depcomp="$ac_aux_dir/depcomp" + AMDEPBACKSLASH='\' + am__nodep='_no' +fi +AM_CONDITIONAL([AMDEP], [test "x$enable_dependency_tracking" != xno]) +AC_SUBST([AMDEPBACKSLASH])dnl +_AM_SUBST_NOTMAKE([AMDEPBACKSLASH])dnl +AC_SUBST([am__nodep])dnl +_AM_SUBST_NOTMAKE([am__nodep])dnl +]) +m4trace:/usr/share/aclocal-1.11/depout.m4:14: -1- AC_DEFUN([_AM_OUTPUT_DEPENDENCY_COMMANDS], [{ + # Autoconf 2.62 quotes --file arguments for eval, but not when files + # are listed without --file. Let's play safe and only enable the eval + # if we detect the quoting. + case $CONFIG_FILES in + *\'*) eval set x "$CONFIG_FILES" ;; + *) set x $CONFIG_FILES ;; + esac + shift + for mf + do + # Strip MF so we end up with the name of the file. + mf=`echo "$mf" | sed -e 's/:.*$//'` + # Check whether this is an Automake generated Makefile or not. + # We used to match only the files named `Makefile.in', but + # some people rename them; so instead we look at the file content. + # Grep'ing the first line is not enough: some people post-process + # each Makefile.in and add a new line on top of each file to say so. + # Grep'ing the whole file is not good either: AIX grep has a line + # limit of 2048, but all sed's we know have understand at least 4000. + if sed -n 's,^#.*generated by automake.*,X,p' "$mf" | grep X >/dev/null 2>&1; then + dirpart=`AS_DIRNAME("$mf")` + else + continue + fi + # Extract the definition of DEPDIR, am__include, and am__quote + # from the Makefile without running `make'. + DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"` + test -z "$DEPDIR" && continue + am__include=`sed -n 's/^am__include = //p' < "$mf"` + test -z "am__include" && continue + am__quote=`sed -n 's/^am__quote = //p' < "$mf"` + # When using ansi2knr, U may be empty or an underscore; expand it + U=`sed -n 's/^U = //p' < "$mf"` + # Find all dependency output files, they are included files with + # $(DEPDIR) in their names. We invoke sed twice because it is the + # simplest approach to changing $(DEPDIR) to its actual value in the + # expansion. + for file in `sed -n " + s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \ + sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g' -e 's/\$U/'"$U"'/g'`; do + # Make sure the directory exists. + test -f "$dirpart/$file" && continue + fdir=`AS_DIRNAME(["$file"])` + AS_MKDIR_P([$dirpart/$fdir]) + # echo "creating $dirpart/$file" + echo '# dummy' > "$dirpart/$file" + done + done +} +]) +m4trace:/usr/share/aclocal-1.11/depout.m4:75: -1- AC_DEFUN([AM_OUTPUT_DEPENDENCY_COMMANDS], [AC_CONFIG_COMMANDS([depfiles], + [test x"$AMDEP_TRUE" != x"" || _AM_OUTPUT_DEPENDENCY_COMMANDS], + [AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir"]) +]) +m4trace:/usr/share/aclocal-1.11/init.m4:26: -1- AC_DEFUN([AM_INIT_AUTOMAKE], [AC_PREREQ([2.62])dnl +dnl Autoconf wants to disallow AM_ names. We explicitly allow +dnl the ones we care about. +m4_pattern_allow([^AM_[A-Z]+FLAGS$])dnl +AC_REQUIRE([AM_SET_CURRENT_AUTOMAKE_VERSION])dnl +AC_REQUIRE([AC_PROG_INSTALL])dnl +if test "`cd $srcdir && pwd`" != "`pwd`"; then + # Use -I$(srcdir) only when $(srcdir) != ., so that make's output + # is not polluted with repeated "-I." + AC_SUBST([am__isrc], [' -I$(srcdir)'])_AM_SUBST_NOTMAKE([am__isrc])dnl + # test to see if srcdir already configured + if test -f $srcdir/config.status; then + AC_MSG_ERROR([source directory already configured; run "make distclean" there first]) + fi +fi + +# test whether we have cygpath +if test -z "$CYGPATH_W"; then + if (cygpath --version) >/dev/null 2>/dev/null; then + CYGPATH_W='cygpath -w' + else + CYGPATH_W=echo + fi +fi +AC_SUBST([CYGPATH_W]) + +# Define the identity of the package. +dnl Distinguish between old-style and new-style calls. +m4_ifval([$2], +[m4_ifval([$3], [_AM_SET_OPTION([no-define])])dnl + AC_SUBST([PACKAGE], [$1])dnl + AC_SUBST([VERSION], [$2])], +[_AM_SET_OPTIONS([$1])dnl +dnl Diagnose old-style AC_INIT with new-style AM_AUTOMAKE_INIT. +m4_if(m4_ifdef([AC_PACKAGE_NAME], 1)m4_ifdef([AC_PACKAGE_VERSION], 1), 11,, + [m4_fatal([AC_INIT should be called with package and version arguments])])dnl + AC_SUBST([PACKAGE], ['AC_PACKAGE_TARNAME'])dnl + AC_SUBST([VERSION], ['AC_PACKAGE_VERSION'])])dnl + +_AM_IF_OPTION([no-define],, +[AC_DEFINE_UNQUOTED(PACKAGE, "$PACKAGE", [Name of package]) + AC_DEFINE_UNQUOTED(VERSION, "$VERSION", [Version number of package])])dnl + +# Some tools Automake needs. +AC_REQUIRE([AM_SANITY_CHECK])dnl +AC_REQUIRE([AC_ARG_PROGRAM])dnl +AM_MISSING_PROG(ACLOCAL, aclocal-${am__api_version}) +AM_MISSING_PROG(AUTOCONF, autoconf) +AM_MISSING_PROG(AUTOMAKE, automake-${am__api_version}) +AM_MISSING_PROG(AUTOHEADER, autoheader) +AM_MISSING_PROG(MAKEINFO, makeinfo) +AC_REQUIRE([AM_PROG_INSTALL_SH])dnl +AC_REQUIRE([AM_PROG_INSTALL_STRIP])dnl +AC_REQUIRE([AM_PROG_MKDIR_P])dnl +# We need awk for the "check" target. The system "awk" is bad on +# some platforms. +AC_REQUIRE([AC_PROG_AWK])dnl +AC_REQUIRE([AC_PROG_MAKE_SET])dnl +AC_REQUIRE([AM_SET_LEADING_DOT])dnl +_AM_IF_OPTION([tar-ustar], [_AM_PROG_TAR([ustar])], + [_AM_IF_OPTION([tar-pax], [_AM_PROG_TAR([pax])], + [_AM_PROG_TAR([v7])])]) +_AM_IF_OPTION([no-dependencies],, +[AC_PROVIDE_IFELSE([AC_PROG_CC], + [_AM_DEPENDENCIES(CC)], + [define([AC_PROG_CC], + defn([AC_PROG_CC])[_AM_DEPENDENCIES(CC)])])dnl +AC_PROVIDE_IFELSE([AC_PROG_CXX], + [_AM_DEPENDENCIES(CXX)], + [define([AC_PROG_CXX], + defn([AC_PROG_CXX])[_AM_DEPENDENCIES(CXX)])])dnl +AC_PROVIDE_IFELSE([AC_PROG_OBJC], + [_AM_DEPENDENCIES(OBJC)], + [define([AC_PROG_OBJC], + defn([AC_PROG_OBJC])[_AM_DEPENDENCIES(OBJC)])])dnl +]) +_AM_IF_OPTION([silent-rules], [AC_REQUIRE([AM_SILENT_RULES])])dnl +dnl The `parallel-tests' driver may need to know about EXEEXT, so add the +dnl `am__EXEEXT' conditional if _AM_COMPILER_EXEEXT was seen. This macro +dnl is hooked onto _AC_COMPILER_EXEEXT early, see below. +AC_CONFIG_COMMANDS_PRE(dnl +[m4_provide_if([_AM_COMPILER_EXEEXT], + [AM_CONDITIONAL([am__EXEEXT], [test -n "$EXEEXT"])])])dnl +]) +m4trace:/usr/share/aclocal-1.11/init.m4:126: -1- AC_DEFUN([_AC_AM_CONFIG_HEADER_HOOK], [# Compute $1's index in $config_headers. +_am_arg=$1 +_am_stamp_count=1 +for _am_header in $config_headers :; do + case $_am_header in + $_am_arg | $_am_arg:* ) + break ;; + * ) + _am_stamp_count=`expr $_am_stamp_count + 1` ;; + esac +done +echo "timestamp for $_am_arg" >`AS_DIRNAME(["$_am_arg"])`/stamp-h[]$_am_stamp_count]) +m4trace:/usr/share/aclocal-1.11/install-sh.m4:14: -1- AC_DEFUN([AM_PROG_INSTALL_SH], [AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl +if test x"${install_sh}" != xset; then + case $am_aux_dir in + *\ * | *\ *) + install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;; + *) + install_sh="\${SHELL} $am_aux_dir/install-sh" + esac +fi +AC_SUBST(install_sh)]) +m4trace:/usr/share/aclocal-1.11/lead-dot.m4:12: -1- AC_DEFUN([AM_SET_LEADING_DOT], [rm -rf .tst 2>/dev/null +mkdir .tst 2>/dev/null +if test -d .tst; then + am__leading_dot=. +else + am__leading_dot=_ +fi +rmdir .tst 2>/dev/null +AC_SUBST([am__leading_dot])]) +m4trace:/usr/share/aclocal-1.11/make.m4:14: -1- AC_DEFUN([AM_MAKE_INCLUDE], [am_make=${MAKE-make} +cat > confinc << 'END' +am__doit: + @echo this is the am__doit target +.PHONY: am__doit +END +# If we don't find an include directive, just comment out the code. +AC_MSG_CHECKING([for style of include used by $am_make]) +am__include="#" +am__quote= +_am_result=none +# First try GNU make style include. +echo "include confinc" > confmf +# Ignore all kinds of additional output from `make'. +case `$am_make -s -f confmf 2> /dev/null` in #( +*the\ am__doit\ target*) + am__include=include + am__quote= + _am_result=GNU + ;; +esac +# Now try BSD make style include. +if test "$am__include" = "#"; then + echo '.include "confinc"' > confmf + case `$am_make -s -f confmf 2> /dev/null` in #( + *the\ am__doit\ target*) + am__include=.include + am__quote="\"" + _am_result=BSD + ;; + esac +fi +AC_SUBST([am__include]) +AC_SUBST([am__quote]) +AC_MSG_RESULT([$_am_result]) +rm -f confinc confmf +]) +m4trace:/usr/share/aclocal-1.11/minuso.m4:14: -1- AC_DEFUN([AM_PROG_CC_C_O], [AC_REQUIRE([AC_PROG_CC_C_O])dnl +AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl +AC_REQUIRE_AUX_FILE([compile])dnl +# FIXME: we rely on the cache variable name because +# there is no other way. +set dummy $CC +am_cc=`echo $[2] | sed ['s/[^a-zA-Z0-9_]/_/g;s/^[0-9]/_/']` +eval am_t=\$ac_cv_prog_cc_${am_cc}_c_o +if test "$am_t" != yes; then + # Losing compiler, so override with the script. + # FIXME: It is wrong to rewrite CC. + # But if we don't then we get into trouble of one sort or another. + # A longer-term fix would be to have automake use am__CC in this case, + # and then we could set am__CC="\$(top_srcdir)/compile \$(CC)" + CC="$am_aux_dir/compile $CC" +fi +dnl Make sure AC_PROG_CC is never called again, or it will override our +dnl setting of CC. +m4_define([AC_PROG_CC], + [m4_fatal([AC_PROG_CC cannot be called after AM_PROG_CC_C_O])]) +]) +m4trace:/usr/share/aclocal-1.11/missing.m4:14: -1- AC_DEFUN([AM_MISSING_PROG], [AC_REQUIRE([AM_MISSING_HAS_RUN]) +$1=${$1-"${am_missing_run}$2"} +AC_SUBST($1)]) +m4trace:/usr/share/aclocal-1.11/missing.m4:24: -1- AC_DEFUN([AM_MISSING_HAS_RUN], [AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl +AC_REQUIRE_AUX_FILE([missing])dnl +if test x"${MISSING+set}" != xset; then + case $am_aux_dir in + *\ * | *\ *) + MISSING="\${SHELL} \"$am_aux_dir/missing\"" ;; + *) + MISSING="\${SHELL} $am_aux_dir/missing" ;; + esac +fi +# Use eval to expand $SHELL +if eval "$MISSING --run true"; then + am_missing_run="$MISSING --run " +else + am_missing_run= + AC_MSG_WARN([`missing' script is too old or missing]) +fi +]) +m4trace:/usr/share/aclocal-1.11/mkdirp.m4:14: -1- AC_DEFUN([AM_PROG_MKDIR_P], [AC_PREREQ([2.60])dnl +AC_REQUIRE([AC_PROG_MKDIR_P])dnl +dnl Automake 1.8 to 1.9.6 used to define mkdir_p. We now use MKDIR_P, +dnl while keeping a definition of mkdir_p for backward compatibility. +dnl @MKDIR_P@ is magic: AC_OUTPUT adjusts its value for each Makefile. +dnl However we cannot define mkdir_p as $(MKDIR_P) for the sake of +dnl Makefile.ins that do not define MKDIR_P, so we do our own +dnl adjustment using top_builddir (which is defined more often than +dnl MKDIR_P). +AC_SUBST([mkdir_p], ["$MKDIR_P"])dnl +case $mkdir_p in + [[\\/$]]* | ?:[[\\/]]*) ;; + */*) mkdir_p="\$(top_builddir)/$mkdir_p" ;; +esac +]) +m4trace:/usr/share/aclocal-1.11/options.m4:14: -1- AC_DEFUN([_AM_MANGLE_OPTION], [[_AM_OPTION_]m4_bpatsubst($1, [[^a-zA-Z0-9_]], [_])]) +m4trace:/usr/share/aclocal-1.11/options.m4:20: -1- AC_DEFUN([_AM_SET_OPTION], [m4_define(_AM_MANGLE_OPTION([$1]), 1)]) +m4trace:/usr/share/aclocal-1.11/options.m4:26: -1- AC_DEFUN([_AM_SET_OPTIONS], [m4_foreach_w([_AM_Option], [$1], [_AM_SET_OPTION(_AM_Option)])]) +m4trace:/usr/share/aclocal-1.11/options.m4:32: -1- AC_DEFUN([_AM_IF_OPTION], [m4_ifset(_AM_MANGLE_OPTION([$1]), [$2], [$3])]) +m4trace:/usr/share/aclocal-1.11/runlog.m4:14: -1- AC_DEFUN([AM_RUN_LOG], [{ echo "$as_me:$LINENO: $1" >&AS_MESSAGE_LOG_FD + ($1) >&AS_MESSAGE_LOG_FD 2>&AS_MESSAGE_LOG_FD + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&AS_MESSAGE_LOG_FD + (exit $ac_status); }]) +m4trace:/usr/share/aclocal-1.11/sanity.m4:14: -1- AC_DEFUN([AM_SANITY_CHECK], [AC_MSG_CHECKING([whether build environment is sane]) +# Just in case +sleep 1 +echo timestamp > conftest.file +# Reject unsafe characters in $srcdir or the absolute working directory +# name. Accept space and tab only in the latter. +am_lf=' +' +case `pwd` in + *[[\\\"\#\$\&\'\`$am_lf]]*) + AC_MSG_ERROR([unsafe absolute working directory name]);; +esac +case $srcdir in + *[[\\\"\#\$\&\'\`$am_lf\ \ ]]*) + AC_MSG_ERROR([unsafe srcdir value: `$srcdir']);; +esac + +# Do `set' in a subshell so we don't clobber the current shell's +# arguments. Must try -L first in case configure is actually a +# symlink; some systems play weird games with the mod time of symlinks +# (eg FreeBSD returns the mod time of the symlink's containing +# directory). +if ( + set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null` + if test "$[*]" = "X"; then + # -L didn't work. + set X `ls -t "$srcdir/configure" conftest.file` + fi + rm -f conftest.file + if test "$[*]" != "X $srcdir/configure conftest.file" \ + && test "$[*]" != "X conftest.file $srcdir/configure"; then + + # If neither matched, then we have a broken ls. This can happen + # if, for instance, CONFIG_SHELL is bash and it inherits a + # broken ls alias from the environment. This has actually + # happened. Such a system could not be considered "sane". + AC_MSG_ERROR([ls -t appears to fail. Make sure there is not a broken +alias in your environment]) + fi + + test "$[2]" = conftest.file + ) +then + # Ok. + : +else + AC_MSG_ERROR([newly created file is older than distributed files! +Check your system clock]) +fi +AC_MSG_RESULT(yes)]) +m4trace:/usr/share/aclocal-1.11/silent.m4:14: -1- AC_DEFUN([AM_SILENT_RULES], [AC_ARG_ENABLE([silent-rules], +[ --enable-silent-rules less verbose build output (undo: `make V=1') + --disable-silent-rules verbose build output (undo: `make V=0')]) +case $enable_silent_rules in +yes) AM_DEFAULT_VERBOSITY=0;; +no) AM_DEFAULT_VERBOSITY=1;; +*) AM_DEFAULT_VERBOSITY=m4_if([$1], [yes], [0], [1]);; +esac +dnl +dnl A few `make' implementations (e.g., NonStop OS and NextStep) +dnl do not support nested variable expansions. +dnl See automake bug#9928 and bug#10237. +am_make=${MAKE-make} +AC_CACHE_CHECK([whether $am_make supports nested variables], + [am_cv_make_support_nested_variables], + [if AS_ECHO([['TRUE=$(BAR$(V)) +BAR0=false +BAR1=true +V=1 +am__doit: + @$(TRUE) +.PHONY: am__doit']]) | $am_make -f - >/dev/null 2>&1; then + am_cv_make_support_nested_variables=yes +else + am_cv_make_support_nested_variables=no +fi]) +if test $am_cv_make_support_nested_variables = yes; then + dnl Using `$V' instead of `$(V)' breaks IRIX make. + AM_V='$(V)' + AM_DEFAULT_V='$(AM_DEFAULT_VERBOSITY)' +else + AM_V=$AM_DEFAULT_VERBOSITY + AM_DEFAULT_V=$AM_DEFAULT_VERBOSITY +fi +AC_SUBST([AM_V])dnl +AM_SUBST_NOTMAKE([AM_V])dnl +AC_SUBST([AM_DEFAULT_V])dnl +AM_SUBST_NOTMAKE([AM_DEFAULT_V])dnl +AC_SUBST([AM_DEFAULT_VERBOSITY])dnl +AM_BACKSLASH='\' +AC_SUBST([AM_BACKSLASH])dnl +_AM_SUBST_NOTMAKE([AM_BACKSLASH])dnl +]) +m4trace:/usr/share/aclocal-1.11/strip.m4:19: -1- AC_DEFUN([AM_PROG_INSTALL_STRIP], [AC_REQUIRE([AM_PROG_INSTALL_SH])dnl +# Installed binaries are usually stripped using `strip' when the user +# run `make install-strip'. However `strip' might not be the right +# tool to use in cross-compilation environments, therefore Automake +# will honor the `STRIP' environment variable to overrule this program. +dnl Don't test for $cross_compiling = yes, because it might be `maybe'. +if test "$cross_compiling" != no; then + AC_CHECK_TOOL([STRIP], [strip], :) +fi +INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s" +AC_SUBST([INSTALL_STRIP_PROGRAM])]) +m4trace:/usr/share/aclocal-1.11/substnot.m4:14: -1- AC_DEFUN([_AM_SUBST_NOTMAKE]) +m4trace:/usr/share/aclocal-1.11/substnot.m4:19: -1- AC_DEFUN([AM_SUBST_NOTMAKE], [_AM_SUBST_NOTMAKE($@)]) +m4trace:/usr/share/aclocal-1.11/tar.m4:24: -1- AC_DEFUN([_AM_PROG_TAR], [# Always define AMTAR for backward compatibility. Yes, it's still used +# in the wild :-( We should find a proper way to deprecate it ... +AC_SUBST([AMTAR], ['$${TAR-tar}']) +m4_if([$1], [v7], + [am__tar='$${TAR-tar} chof - "$$tardir"' am__untar='$${TAR-tar} xf -'], + [m4_case([$1], [ustar],, [pax],, + [m4_fatal([Unknown tar format])]) +AC_MSG_CHECKING([how to create a $1 tar archive]) +# Loop over all known methods to create a tar archive until one works. +_am_tools='gnutar m4_if([$1], [ustar], [plaintar]) pax cpio none' +_am_tools=${am_cv_prog_tar_$1-$_am_tools} +# Do not fold the above two line into one, because Tru64 sh and +# Solaris sh will not grok spaces in the rhs of `-'. +for _am_tool in $_am_tools +do + case $_am_tool in + gnutar) + for _am_tar in tar gnutar gtar; + do + AM_RUN_LOG([$_am_tar --version]) && break + done + am__tar="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$$tardir"' + am__tar_="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$tardir"' + am__untar="$_am_tar -xf -" + ;; + plaintar) + # Must skip GNU tar: if it does not support --format= it doesn't create + # ustar tarball either. + (tar --version) >/dev/null 2>&1 && continue + am__tar='tar chf - "$$tardir"' + am__tar_='tar chf - "$tardir"' + am__untar='tar xf -' + ;; + pax) + am__tar='pax -L -x $1 -w "$$tardir"' + am__tar_='pax -L -x $1 -w "$tardir"' + am__untar='pax -r' + ;; + cpio) + am__tar='find "$$tardir" -print | cpio -o -H $1 -L' + am__tar_='find "$tardir" -print | cpio -o -H $1 -L' + am__untar='cpio -i -H $1 -d' + ;; + none) + am__tar=false + am__tar_=false + am__untar=false + ;; + esac + + # If the value was cached, stop now. We just wanted to have am__tar + # and am__untar set. + test -n "${am_cv_prog_tar_$1}" && break + + # tar/untar a dummy directory, and stop if the command works + rm -rf conftest.dir + mkdir conftest.dir + echo GrepMe > conftest.dir/file + AM_RUN_LOG([tardir=conftest.dir && eval $am__tar_ >conftest.tar]) + rm -rf conftest.dir + if test -s conftest.tar; then + AM_RUN_LOG([$am__untar /dev/null 2>&1 && break + fi +done +rm -rf conftest.dir + +AC_CACHE_VAL([am_cv_prog_tar_$1], [am_cv_prog_tar_$1=$_am_tool]) +AC_MSG_RESULT([$am_cv_prog_tar_$1])]) +AC_SUBST([am__tar]) +AC_SUBST([am__untar]) +]) +m4trace:acinclude.m4:43: -1- AC_DEFUN([DX_FEATURE_doc], [ON]) +m4trace:acinclude.m4:44: -1- AC_DEFUN([DX_FEATURE_dot], [ON]) +m4trace:acinclude.m4:45: -1- AC_DEFUN([DX_FEATURE_man], [OFF]) +m4trace:acinclude.m4:46: -1- AC_DEFUN([DX_FEATURE_html], [ON]) +m4trace:acinclude.m4:47: -1- AC_DEFUN([DX_FEATURE_chm], [OFF]) +m4trace:acinclude.m4:48: -1- AC_DEFUN([DX_FEATURE_chi], [OFF]) +m4trace:acinclude.m4:49: -1- AC_DEFUN([DX_FEATURE_rtf], [OFF]) +m4trace:acinclude.m4:50: -1- AC_DEFUN([DX_FEATURE_xml], [OFF]) +m4trace:acinclude.m4:51: -1- AC_DEFUN([DX_FEATURE_pdf], [ON]) +m4trace:acinclude.m4:52: -1- AC_DEFUN([DX_FEATURE_ps], [ON]) +m4trace:acinclude.m4:61: -1- AC_DEFUN([DX_ENV_APPEND], [AC_SUBST([DX_ENV], ["$DX_ENV $1='$2'"])]) +m4trace:acinclude.m4:66: -1- AC_DEFUN([DX_DIRNAME_EXPR], [[expr ".$1" : '\(\.\)[^/]*$' \| "x$1" : 'x\(.*\)/[^/]*$']]) +m4trace:acinclude.m4:72: -1- AC_DEFUN([DX_IF_FEATURE], [ifelse(DX_FEATURE_$1, ON, [$2], [$3])]) +m4trace:acinclude.m4:77: -1- AC_DEFUN([DX_REQUIRE_PROG], [ +AC_PATH_TOOL([$1], [$2]) +if test "$DX_FLAG_$[DX_CURRENT_FEATURE$$1]" = 1; then + AC_MSG_WARN([$2 not found - will not DX_CURRENT_DESCRIPTION]) + AC_SUBST([DX_FLAG_]DX_CURRENT_FEATURE, 0) +fi +]) +m4trace:acinclude.m4:88: -1- AC_DEFUN([DX_TEST_FEATURE], [test "$DX_FLAG_$1" = 1]) +m4trace:acinclude.m4:94: -1- AC_DEFUN([DX_CHECK_DEPEND], [ +test "$DX_FLAG_$1" = "$2" \ +|| AC_MSG_ERROR([doxygen-DX_CURRENT_FEATURE ifelse([$2], 1, + requires, contradicts) doxygen-DX_CURRENT_FEATURE]) +]) +m4trace:acinclude.m4:103: -1- AC_DEFUN([DX_CLEAR_DEPEND], [ +test "$DX_FLAG_$1" = "$2" || AC_SUBST([DX_FLAG_]DX_CURRENT_FEATURE, 0) +]) +m4trace:acinclude.m4:117: -1- AC_DEFUN([DX_ARG_ABLE], [ + AC_DEFUN([DX_CURRENT_FEATURE], [$1]) + AC_DEFUN([DX_CURRENT_DESCRIPTION], [$2]) + AC_ARG_ENABLE(doxygen-$1, + [AS_HELP_STRING(DX_IF_FEATURE([$1], [--disable-doxygen-$1], + [--enable-doxygen-$1]), + DX_IF_FEATURE([$1], [don't $2], [$2]))], + [ +case "$enableval" in +#( +y|Y|yes|Yes|YES) + AC_SUBST([DX_FLAG_$1], 1) + $3 +;; #( +n|N|no|No|NO) + AC_SUBST([DX_FLAG_$1], 0) +;; #( +*) + AC_MSG_ERROR([invalid value '$enableval' given to doxygen-$1]) +;; +esac +], [ +AC_SUBST([DX_FLAG_$1], [DX_IF_FEATURE([$1], 1, 0)]) +$4 +]) +if DX_TEST_FEATURE([$1]); then + $5 + : +fi +if DX_TEST_FEATURE([$1]); then + AM_CONDITIONAL(DX_COND_$1, :) + $6 + : +else + AM_CONDITIONAL(DX_COND_$1, false) + $7 + : +fi +]) +m4trace:acinclude.m4:163: -1- AC_DEFUN([DX_DOXYGEN_FEATURE], [AC_DEFUN([DX_FEATURE_doc], [$1])]) +m4trace:acinclude.m4:164: -1- AC_DEFUN([DX_MAN_FEATURE], [AC_DEFUN([DX_FEATURE_man], [$1])]) +m4trace:acinclude.m4:165: -1- AC_DEFUN([DX_HTML_FEATURE], [AC_DEFUN([DX_FEATURE_html], [$1])]) +m4trace:acinclude.m4:166: -1- AC_DEFUN([DX_CHM_FEATURE], [AC_DEFUN([DX_FEATURE_chm], [$1])]) +m4trace:acinclude.m4:167: -1- AC_DEFUN([DX_CHI_FEATURE], [AC_DEFUN([DX_FEATURE_chi], [$1])]) +m4trace:acinclude.m4:168: -1- AC_DEFUN([DX_RTF_FEATURE], [AC_DEFUN([DX_FEATURE_rtf], [$1])]) +m4trace:acinclude.m4:169: -1- AC_DEFUN([DX_XML_FEATURE], [AC_DEFUN([DX_FEATURE_xml], [$1])]) +m4trace:acinclude.m4:170: -1- AC_DEFUN([DX_XML_FEATURE], [AC_DEFUN([DX_FEATURE_xml], [$1])]) +m4trace:acinclude.m4:171: -1- AC_DEFUN([DX_PDF_FEATURE], [AC_DEFUN([DX_FEATURE_pdf], [$1])]) +m4trace:acinclude.m4:172: -1- AC_DEFUN([DX_PS_FEATURE], [AC_DEFUN([DX_FEATURE_ps], [$1])]) +m4trace:acinclude.m4:178: -1- AC_DEFUN([DX_INIT_DOXYGEN], [ + +# Files: +AC_SUBST([DX_PROJECT], [$1]) +AC_SUBST([DX_CONFIG], [ifelse([$2], [], Doxyfile, [$2])]) +AC_SUBST([DX_DOCDIR], [ifelse([$3], [], doxygen-doc, [$3])]) + +# Environment variables used inside doxygen.cfg: +DX_ENV_APPEND(SRCDIR, $srcdir) +DX_ENV_APPEND(PROJECT, $DX_PROJECT) +DX_ENV_APPEND(DOCDIR, $DX_DOCDIR) +DX_ENV_APPEND(VERSION, $PACKAGE_VERSION) + +# Doxygen itself: +DX_ARG_ABLE(doc, [generate any doxygen documentation], + [], + [], + [DX_REQUIRE_PROG([DX_DOXYGEN], doxygen) + DX_REQUIRE_PROG([DX_PERL], perl)], + [DX_ENV_APPEND(PERL_PATH, $DX_PERL)]) + +# Dot for graphics: +DX_ARG_ABLE(dot, [generate graphics for doxygen documentation], + [DX_CHECK_DEPEND(doc, 1)], + [DX_CLEAR_DEPEND(doc, 1)], + [DX_REQUIRE_PROG([DX_DOT], dot)], + [DX_ENV_APPEND(HAVE_DOT, YES) + DX_ENV_APPEND(DOT_PATH, [`DX_DIRNAME_EXPR($DX_DOT)`])], + [DX_ENV_APPEND(HAVE_DOT, NO)]) + +# Man pages generation: +DX_ARG_ABLE(man, [generate doxygen manual pages], + [DX_CHECK_DEPEND(doc, 1)], + [DX_CLEAR_DEPEND(doc, 1)], + [], + [DX_ENV_APPEND(GENERATE_MAN, YES)], + [DX_ENV_APPEND(GENERATE_MAN, NO)]) + +# RTF file generation: +DX_ARG_ABLE(rtf, [generate doxygen RTF documentation], + [DX_CHECK_DEPEND(doc, 1)], + [DX_CLEAR_DEPEND(doc, 1)], + [], + [DX_ENV_APPEND(GENERATE_RTF, YES)], + [DX_ENV_APPEND(GENERATE_RTF, NO)]) + +# XML file generation: +DX_ARG_ABLE(xml, [generate doxygen XML documentation], + [DX_CHECK_DEPEND(doc, 1)], + [DX_CLEAR_DEPEND(doc, 1)], + [], + [DX_ENV_APPEND(GENERATE_XML, YES)], + [DX_ENV_APPEND(GENERATE_XML, NO)]) + +# (Compressed) HTML help generation: +DX_ARG_ABLE(chm, [generate doxygen compressed HTML help documentation], + [DX_CHECK_DEPEND(doc, 1)], + [DX_CLEAR_DEPEND(doc, 1)], + [DX_REQUIRE_PROG([DX_HHC], hhc)], + [DX_ENV_APPEND(HHC_PATH, $DX_HHC) + DX_ENV_APPEND(GENERATE_HTML, YES) + DX_ENV_APPEND(GENERATE_HTMLHELP, YES)], + [DX_ENV_APPEND(GENERATE_HTMLHELP, NO)]) + +# Seperate CHI file generation. +DX_ARG_ABLE(chi, [generate doxygen seperate compressed HTML help index file], + [DX_CHECK_DEPEND(chm, 1)], + [DX_CLEAR_DEPEND(chm, 1)], + [], + [DX_ENV_APPEND(GENERATE_CHI, YES)], + [DX_ENV_APPEND(GENERATE_CHI, NO)]) + +# Plain HTML pages generation: +DX_ARG_ABLE(html, [generate doxygen plain HTML documentation], + [DX_CHECK_DEPEND(doc, 1) DX_CHECK_DEPEND(chm, 0)], + [DX_CLEAR_DEPEND(doc, 1) DX_CLEAR_DEPEND(chm, 0)], + [], + [DX_ENV_APPEND(GENERATE_HTML, YES)], + [DX_TEST_FEATURE(chm) || DX_ENV_APPEND(GENERATE_HTML, NO)]) + +# PostScript file generation: +DX_ARG_ABLE(ps, [generate doxygen PostScript documentation], + [DX_CHECK_DEPEND(doc, 1)], + [DX_CLEAR_DEPEND(doc, 1)], + [DX_REQUIRE_PROG([DX_LATEX], latex) + DX_REQUIRE_PROG([DX_MAKEINDEX], makeindex) + DX_REQUIRE_PROG([DX_DVIPS], dvips) + DX_REQUIRE_PROG([DX_EGREP], egrep)]) + +# PDF file generation: +DX_ARG_ABLE(pdf, [generate doxygen PDF documentation], + [DX_CHECK_DEPEND(doc, 1)], + [DX_CLEAR_DEPEND(doc, 1)], + [DX_REQUIRE_PROG([DX_PDFLATEX], pdflatex) + DX_REQUIRE_PROG([DX_MAKEINDEX], makeindex) + DX_REQUIRE_PROG([DX_EGREP], egrep)]) + +# LaTeX generation for PS and/or PDF: +if DX_TEST_FEATURE(ps) || DX_TEST_FEATURE(pdf); then + AM_CONDITIONAL(DX_COND_latex, :) + DX_ENV_APPEND(GENERATE_LATEX, YES) +else + AM_CONDITIONAL(DX_COND_latex, false) + DX_ENV_APPEND(GENERATE_LATEX, NO) +fi + +# Paper size for PS and/or PDF: +AC_ARG_VAR(DOXYGEN_PAPER_SIZE, + [a4wide (default), a4, letter, legal or executive]) +case "$DOXYGEN_PAPER_SIZE" in +#( +"") + AC_SUBST(DOXYGEN_PAPER_SIZE, "") +;; #( +a4wide|a4|letter|legal|executive) + DX_ENV_APPEND(PAPER_SIZE, $DOXYGEN_PAPER_SIZE) +;; #( +*) + AC_MSG_ERROR([unknown DOXYGEN_PAPER_SIZE='$DOXYGEN_PAPER_SIZE']) +;; +esac + +#For debugging: +#echo DX_FLAG_doc=$DX_FLAG_doc +#echo DX_FLAG_dot=$DX_FLAG_dot +#echo DX_FLAG_man=$DX_FLAG_man +#echo DX_FLAG_html=$DX_FLAG_html +#echo DX_FLAG_chm=$DX_FLAG_chm +#echo DX_FLAG_chi=$DX_FLAG_chi +#echo DX_FLAG_rtf=$DX_FLAG_rtf +#echo DX_FLAG_xml=$DX_FLAG_xml +#echo DX_FLAG_pdf=$DX_FLAG_pdf +#echo DX_FLAG_ps=$DX_FLAG_ps +#echo DX_ENV=$DX_ENV +]) +m4trace:configure.ac:6: -1- m4_pattern_forbid([^_?A[CHUM]_]) +m4trace:configure.ac:6: -1- m4_pattern_forbid([_AC_]) +m4trace:configure.ac:6: -1- m4_pattern_forbid([^LIBOBJS$], [do not use LIBOBJS directly, use AC_LIBOBJ (see section `AC_LIBOBJ vs LIBOBJS']) +m4trace:configure.ac:6: -1- m4_pattern_allow([^AS_FLAGS$]) +m4trace:configure.ac:6: -1- m4_pattern_forbid([^_?m4_]) +m4trace:configure.ac:6: -1- m4_pattern_forbid([^dnl$]) +m4trace:configure.ac:6: -1- m4_pattern_forbid([^_?AS_]) +m4trace:configure.ac:6: -1- m4_pattern_allow([^SHELL$]) +m4trace:configure.ac:6: -1- m4_pattern_allow([^PATH_SEPARATOR$]) +m4trace:configure.ac:6: -1- m4_pattern_allow([^PACKAGE_NAME$]) +m4trace:configure.ac:6: -1- m4_pattern_allow([^PACKAGE_TARNAME$]) +m4trace:configure.ac:6: -1- m4_pattern_allow([^PACKAGE_VERSION$]) +m4trace:configure.ac:6: -1- m4_pattern_allow([^PACKAGE_STRING$]) +m4trace:configure.ac:6: -1- m4_pattern_allow([^PACKAGE_BUGREPORT$]) +m4trace:configure.ac:6: -1- m4_pattern_allow([^PACKAGE_URL$]) +m4trace:configure.ac:6: -1- m4_pattern_allow([^exec_prefix$]) +m4trace:configure.ac:6: -1- m4_pattern_allow([^prefix$]) +m4trace:configure.ac:6: -1- m4_pattern_allow([^program_transform_name$]) +m4trace:configure.ac:6: -1- m4_pattern_allow([^bindir$]) +m4trace:configure.ac:6: -1- m4_pattern_allow([^sbindir$]) +m4trace:configure.ac:6: -1- m4_pattern_allow([^libexecdir$]) +m4trace:configure.ac:6: -1- m4_pattern_allow([^datarootdir$]) +m4trace:configure.ac:6: -1- m4_pattern_allow([^datadir$]) +m4trace:configure.ac:6: -1- m4_pattern_allow([^sysconfdir$]) +m4trace:configure.ac:6: -1- m4_pattern_allow([^sharedstatedir$]) +m4trace:configure.ac:6: -1- m4_pattern_allow([^localstatedir$]) +m4trace:configure.ac:6: -1- m4_pattern_allow([^includedir$]) +m4trace:configure.ac:6: -1- m4_pattern_allow([^oldincludedir$]) +m4trace:configure.ac:6: -1- m4_pattern_allow([^docdir$]) +m4trace:configure.ac:6: -1- m4_pattern_allow([^infodir$]) +m4trace:configure.ac:6: -1- m4_pattern_allow([^htmldir$]) +m4trace:configure.ac:6: -1- m4_pattern_allow([^dvidir$]) +m4trace:configure.ac:6: -1- m4_pattern_allow([^pdfdir$]) +m4trace:configure.ac:6: -1- m4_pattern_allow([^psdir$]) +m4trace:configure.ac:6: -1- m4_pattern_allow([^libdir$]) +m4trace:configure.ac:6: -1- m4_pattern_allow([^localedir$]) +m4trace:configure.ac:6: -1- m4_pattern_allow([^mandir$]) +m4trace:configure.ac:6: -1- m4_pattern_allow([^PACKAGE_NAME$]) +m4trace:configure.ac:6: -1- m4_pattern_allow([^PACKAGE_TARNAME$]) +m4trace:configure.ac:6: -1- m4_pattern_allow([^PACKAGE_VERSION$]) +m4trace:configure.ac:6: -1- m4_pattern_allow([^PACKAGE_STRING$]) +m4trace:configure.ac:6: -1- m4_pattern_allow([^PACKAGE_BUGREPORT$]) +m4trace:configure.ac:6: -1- m4_pattern_allow([^PACKAGE_URL$]) +m4trace:configure.ac:6: -1- m4_pattern_allow([^DEFS$]) +m4trace:configure.ac:6: -1- m4_pattern_allow([^ECHO_C$]) +m4trace:configure.ac:6: -1- m4_pattern_allow([^ECHO_N$]) +m4trace:configure.ac:6: -1- m4_pattern_allow([^ECHO_T$]) +m4trace:configure.ac:6: -1- m4_pattern_allow([^LIBS$]) +m4trace:configure.ac:6: -1- m4_pattern_allow([^build_alias$]) +m4trace:configure.ac:6: -1- m4_pattern_allow([^host_alias$]) +m4trace:configure.ac:6: -1- m4_pattern_allow([^target_alias$]) +m4trace:configure.ac:14: -1- DX_HTML_FEATURE([ON]) +m4trace:configure.ac:14: -1- AC_DEFUN([DX_FEATURE_html], [ON]) +m4trace:configure.ac:15: -1- DX_CHM_FEATURE([OFF]) +m4trace:configure.ac:15: -1- AC_DEFUN([DX_FEATURE_chm], [OFF]) +m4trace:configure.ac:16: -1- DX_CHI_FEATURE([OFF]) +m4trace:configure.ac:16: -1- AC_DEFUN([DX_FEATURE_chi], [OFF]) +m4trace:configure.ac:17: -1- DX_MAN_FEATURE([OFF]) +m4trace:configure.ac:17: -1- AC_DEFUN([DX_FEATURE_man], [OFF]) +m4trace:configure.ac:18: -1- DX_RTF_FEATURE([OFF]) +m4trace:configure.ac:18: -1- AC_DEFUN([DX_FEATURE_rtf], [OFF]) +m4trace:configure.ac:19: -1- DX_XML_FEATURE([OFF]) +m4trace:configure.ac:19: -1- AC_DEFUN([DX_FEATURE_xml], [OFF]) +m4trace:configure.ac:20: -1- DX_PDF_FEATURE([OFF]) +m4trace:configure.ac:20: -1- AC_DEFUN([DX_FEATURE_pdf], [OFF]) +m4trace:configure.ac:21: -1- DX_PS_FEATURE([OFF]) +m4trace:configure.ac:21: -1- AC_DEFUN([DX_FEATURE_ps], [OFF]) +m4trace:configure.ac:22: -1- DX_INIT_DOXYGEN([zookeeper], [c-doc.Doxyfile], [docs]) +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_PROJECT$]) +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_CONFIG$]) +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_DOCDIR$]) +m4trace:configure.ac:22: -1- DX_ENV_APPEND([SRCDIR], [$srcdir]) +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_ENV$]) +m4trace:configure.ac:22: -1- DX_ENV_APPEND([PROJECT], [$DX_PROJECT]) +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_ENV$]) +m4trace:configure.ac:22: -1- DX_ENV_APPEND([DOCDIR], [$DX_DOCDIR]) +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_ENV$]) +m4trace:configure.ac:22: -1- DX_ENV_APPEND([VERSION], [$PACKAGE_VERSION]) +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_ENV$]) +m4trace:configure.ac:22: -1- DX_ARG_ABLE([doc], [generate any doxygen documentation], [], [], [DX_REQUIRE_PROG([DX_DOXYGEN], doxygen) + DX_REQUIRE_PROG([DX_PERL], perl)], [DX_ENV_APPEND(PERL_PATH, $DX_PERL)]) +m4trace:configure.ac:22: -1- AC_DEFUN([DX_CURRENT_FEATURE], [doc]) +m4trace:configure.ac:22: -1- AC_DEFUN([DX_CURRENT_DESCRIPTION], [generate any doxygen documentation]) +m4trace:configure.ac:22: -2- DX_IF_FEATURE([doc], [--disable-doxygen-doc], [--enable-doxygen-doc]) +m4trace:configure.ac:22: -3- DX_FEATURE_doc +m4trace:configure.ac:22: -2- DX_IF_FEATURE([doc], [don't generate any doxygen documentation], [generate any doxygen documentation]) +m4trace:configure.ac:22: -3- DX_FEATURE_doc +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_FLAG_doc$]) +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_FLAG_doc$]) +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_FLAG_doc$]) +m4trace:configure.ac:22: -1- DX_IF_FEATURE([doc], [1], [0]) +m4trace:configure.ac:22: -2- DX_FEATURE_doc +m4trace:configure.ac:22: -1- DX_TEST_FEATURE([doc]) +m4trace:configure.ac:22: -1- DX_REQUIRE_PROG([DX_DOXYGEN], [doxygen]) +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_DOXYGEN$]) +m4trace:configure.ac:22: -1- DX_CURRENT_DESCRIPTION +m4trace:configure.ac:22: -1- DX_CURRENT_DESCRIPTION +m4trace:configure.ac:22: -2- DX_CURRENT_FEATURE +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_FLAG_doc$]) +m4trace:configure.ac:22: -1- DX_REQUIRE_PROG([DX_PERL], [perl]) +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_PERL$]) +m4trace:configure.ac:22: -1- DX_CURRENT_DESCRIPTION +m4trace:configure.ac:22: -1- DX_CURRENT_DESCRIPTION +m4trace:configure.ac:22: -2- DX_CURRENT_FEATURE +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_FLAG_doc$]) +m4trace:configure.ac:22: -1- DX_TEST_FEATURE([doc]) +m4trace:configure.ac:22: -1- AM_CONDITIONAL([DX_COND_doc], [:]) +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_COND_doc_TRUE$]) +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_COND_doc_FALSE$]) +m4trace:configure.ac:22: -1- _AM_SUBST_NOTMAKE([DX_COND_doc_TRUE]) +m4trace:configure.ac:22: -1- _AM_SUBST_NOTMAKE([DX_COND_doc_FALSE]) +m4trace:configure.ac:22: -1- DX_ENV_APPEND([PERL_PATH], [$DX_PERL]) +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_ENV$]) +m4trace:configure.ac:22: -1- AM_CONDITIONAL([DX_COND_doc], [false]) +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_COND_doc_TRUE$]) +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_COND_doc_FALSE$]) +m4trace:configure.ac:22: -1- _AM_SUBST_NOTMAKE([DX_COND_doc_TRUE]) +m4trace:configure.ac:22: -1- _AM_SUBST_NOTMAKE([DX_COND_doc_FALSE]) +m4trace:configure.ac:22: -1- DX_ARG_ABLE([dot], [generate graphics for doxygen documentation], [DX_CHECK_DEPEND(doc, 1)], [DX_CLEAR_DEPEND(doc, 1)], [DX_REQUIRE_PROG([DX_DOT], dot)], [DX_ENV_APPEND(HAVE_DOT, YES) + DX_ENV_APPEND(DOT_PATH, [`DX_DIRNAME_EXPR($DX_DOT)`])], [DX_ENV_APPEND(HAVE_DOT, NO)]) +m4trace:configure.ac:22: -1- AC_DEFUN([DX_CURRENT_FEATURE], [dot]) +m4trace:configure.ac:22: -1- AC_DEFUN([DX_CURRENT_DESCRIPTION], [generate graphics for doxygen documentation]) +m4trace:configure.ac:22: -2- DX_IF_FEATURE([dot], [--disable-doxygen-dot], [--enable-doxygen-dot]) +m4trace:configure.ac:22: -3- DX_FEATURE_dot +m4trace:configure.ac:22: -2- DX_IF_FEATURE([dot], [don't generate graphics for doxygen documentation], [generate graphics for doxygen documentation]) +m4trace:configure.ac:22: -3- DX_FEATURE_dot +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_FLAG_dot$]) +m4trace:configure.ac:22: -1- DX_CHECK_DEPEND([doc], [1]) +m4trace:configure.ac:22: -1- DX_CURRENT_FEATURE +m4trace:configure.ac:22: -1- DX_CURRENT_FEATURE +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_FLAG_dot$]) +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_FLAG_dot$]) +m4trace:configure.ac:22: -1- DX_IF_FEATURE([dot], [1], [0]) +m4trace:configure.ac:22: -2- DX_FEATURE_dot +m4trace:configure.ac:22: -1- DX_CLEAR_DEPEND([doc], [1]) +m4trace:configure.ac:22: -2- DX_CURRENT_FEATURE +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_FLAG_dot$]) +m4trace:configure.ac:22: -1- DX_TEST_FEATURE([dot]) +m4trace:configure.ac:22: -1- DX_REQUIRE_PROG([DX_DOT], [dot]) +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_DOT$]) +m4trace:configure.ac:22: -1- DX_CURRENT_DESCRIPTION +m4trace:configure.ac:22: -1- DX_CURRENT_DESCRIPTION +m4trace:configure.ac:22: -2- DX_CURRENT_FEATURE +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_FLAG_dot$]) +m4trace:configure.ac:22: -1- DX_TEST_FEATURE([dot]) +m4trace:configure.ac:22: -1- AM_CONDITIONAL([DX_COND_dot], [:]) +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_COND_dot_TRUE$]) +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_COND_dot_FALSE$]) +m4trace:configure.ac:22: -1- _AM_SUBST_NOTMAKE([DX_COND_dot_TRUE]) +m4trace:configure.ac:22: -1- _AM_SUBST_NOTMAKE([DX_COND_dot_FALSE]) +m4trace:configure.ac:22: -1- DX_ENV_APPEND([HAVE_DOT], [YES]) +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_ENV$]) +m4trace:configure.ac:22: -1- DX_ENV_APPEND([DOT_PATH], [`DX_DIRNAME_EXPR($DX_DOT)`]) +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_ENV$]) +m4trace:configure.ac:22: -1- DX_DIRNAME_EXPR([$DX_DOT]) +m4trace:configure.ac:22: -1- AM_CONDITIONAL([DX_COND_dot], [false]) +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_COND_dot_TRUE$]) +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_COND_dot_FALSE$]) +m4trace:configure.ac:22: -1- _AM_SUBST_NOTMAKE([DX_COND_dot_TRUE]) +m4trace:configure.ac:22: -1- _AM_SUBST_NOTMAKE([DX_COND_dot_FALSE]) +m4trace:configure.ac:22: -1- DX_ENV_APPEND([HAVE_DOT], [NO]) +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_ENV$]) +m4trace:configure.ac:22: -1- DX_ARG_ABLE([man], [generate doxygen manual pages], [DX_CHECK_DEPEND(doc, 1)], [DX_CLEAR_DEPEND(doc, 1)], [], [DX_ENV_APPEND(GENERATE_MAN, YES)], [DX_ENV_APPEND(GENERATE_MAN, NO)]) +m4trace:configure.ac:22: -1- AC_DEFUN([DX_CURRENT_FEATURE], [man]) +m4trace:configure.ac:22: -1- AC_DEFUN([DX_CURRENT_DESCRIPTION], [generate doxygen manual pages]) +m4trace:configure.ac:22: -2- DX_IF_FEATURE([man], [--disable-doxygen-man], [--enable-doxygen-man]) +m4trace:configure.ac:22: -3- DX_FEATURE_man +m4trace:configure.ac:22: -2- DX_IF_FEATURE([man], [don't generate doxygen manual pages], [generate doxygen manual pages]) +m4trace:configure.ac:22: -3- DX_FEATURE_man +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_FLAG_man$]) +m4trace:configure.ac:22: -1- DX_CHECK_DEPEND([doc], [1]) +m4trace:configure.ac:22: -1- DX_CURRENT_FEATURE +m4trace:configure.ac:22: -1- DX_CURRENT_FEATURE +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_FLAG_man$]) +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_FLAG_man$]) +m4trace:configure.ac:22: -1- DX_IF_FEATURE([man], [1], [0]) +m4trace:configure.ac:22: -2- DX_FEATURE_man +m4trace:configure.ac:22: -1- DX_CLEAR_DEPEND([doc], [1]) +m4trace:configure.ac:22: -2- DX_CURRENT_FEATURE +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_FLAG_man$]) +m4trace:configure.ac:22: -1- DX_TEST_FEATURE([man]) +m4trace:configure.ac:22: -1- DX_TEST_FEATURE([man]) +m4trace:configure.ac:22: -1- AM_CONDITIONAL([DX_COND_man], [:]) +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_COND_man_TRUE$]) +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_COND_man_FALSE$]) +m4trace:configure.ac:22: -1- _AM_SUBST_NOTMAKE([DX_COND_man_TRUE]) +m4trace:configure.ac:22: -1- _AM_SUBST_NOTMAKE([DX_COND_man_FALSE]) +m4trace:configure.ac:22: -1- DX_ENV_APPEND([GENERATE_MAN], [YES]) +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_ENV$]) +m4trace:configure.ac:22: -1- AM_CONDITIONAL([DX_COND_man], [false]) +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_COND_man_TRUE$]) +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_COND_man_FALSE$]) +m4trace:configure.ac:22: -1- _AM_SUBST_NOTMAKE([DX_COND_man_TRUE]) +m4trace:configure.ac:22: -1- _AM_SUBST_NOTMAKE([DX_COND_man_FALSE]) +m4trace:configure.ac:22: -1- DX_ENV_APPEND([GENERATE_MAN], [NO]) +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_ENV$]) +m4trace:configure.ac:22: -1- DX_ARG_ABLE([rtf], [generate doxygen RTF documentation], [DX_CHECK_DEPEND(doc, 1)], [DX_CLEAR_DEPEND(doc, 1)], [], [DX_ENV_APPEND(GENERATE_RTF, YES)], [DX_ENV_APPEND(GENERATE_RTF, NO)]) +m4trace:configure.ac:22: -1- AC_DEFUN([DX_CURRENT_FEATURE], [rtf]) +m4trace:configure.ac:22: -1- AC_DEFUN([DX_CURRENT_DESCRIPTION], [generate doxygen RTF documentation]) +m4trace:configure.ac:22: -2- DX_IF_FEATURE([rtf], [--disable-doxygen-rtf], [--enable-doxygen-rtf]) +m4trace:configure.ac:22: -3- DX_FEATURE_rtf +m4trace:configure.ac:22: -2- DX_IF_FEATURE([rtf], [don't generate doxygen RTF documentation], [generate doxygen RTF documentation]) +m4trace:configure.ac:22: -3- DX_FEATURE_rtf +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_FLAG_rtf$]) +m4trace:configure.ac:22: -1- DX_CHECK_DEPEND([doc], [1]) +m4trace:configure.ac:22: -1- DX_CURRENT_FEATURE +m4trace:configure.ac:22: -1- DX_CURRENT_FEATURE +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_FLAG_rtf$]) +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_FLAG_rtf$]) +m4trace:configure.ac:22: -1- DX_IF_FEATURE([rtf], [1], [0]) +m4trace:configure.ac:22: -2- DX_FEATURE_rtf +m4trace:configure.ac:22: -1- DX_CLEAR_DEPEND([doc], [1]) +m4trace:configure.ac:22: -2- DX_CURRENT_FEATURE +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_FLAG_rtf$]) +m4trace:configure.ac:22: -1- DX_TEST_FEATURE([rtf]) +m4trace:configure.ac:22: -1- DX_TEST_FEATURE([rtf]) +m4trace:configure.ac:22: -1- AM_CONDITIONAL([DX_COND_rtf], [:]) +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_COND_rtf_TRUE$]) +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_COND_rtf_FALSE$]) +m4trace:configure.ac:22: -1- _AM_SUBST_NOTMAKE([DX_COND_rtf_TRUE]) +m4trace:configure.ac:22: -1- _AM_SUBST_NOTMAKE([DX_COND_rtf_FALSE]) +m4trace:configure.ac:22: -1- DX_ENV_APPEND([GENERATE_RTF], [YES]) +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_ENV$]) +m4trace:configure.ac:22: -1- AM_CONDITIONAL([DX_COND_rtf], [false]) +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_COND_rtf_TRUE$]) +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_COND_rtf_FALSE$]) +m4trace:configure.ac:22: -1- _AM_SUBST_NOTMAKE([DX_COND_rtf_TRUE]) +m4trace:configure.ac:22: -1- _AM_SUBST_NOTMAKE([DX_COND_rtf_FALSE]) +m4trace:configure.ac:22: -1- DX_ENV_APPEND([GENERATE_RTF], [NO]) +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_ENV$]) +m4trace:configure.ac:22: -1- DX_ARG_ABLE([xml], [generate doxygen XML documentation], [DX_CHECK_DEPEND(doc, 1)], [DX_CLEAR_DEPEND(doc, 1)], [], [DX_ENV_APPEND(GENERATE_XML, YES)], [DX_ENV_APPEND(GENERATE_XML, NO)]) +m4trace:configure.ac:22: -1- AC_DEFUN([DX_CURRENT_FEATURE], [xml]) +m4trace:configure.ac:22: -1- AC_DEFUN([DX_CURRENT_DESCRIPTION], [generate doxygen XML documentation]) +m4trace:configure.ac:22: -2- DX_IF_FEATURE([xml], [--disable-doxygen-xml], [--enable-doxygen-xml]) +m4trace:configure.ac:22: -3- DX_FEATURE_xml +m4trace:configure.ac:22: -2- DX_IF_FEATURE([xml], [don't generate doxygen XML documentation], [generate doxygen XML documentation]) +m4trace:configure.ac:22: -3- DX_FEATURE_xml +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_FLAG_xml$]) +m4trace:configure.ac:22: -1- DX_CHECK_DEPEND([doc], [1]) +m4trace:configure.ac:22: -1- DX_CURRENT_FEATURE +m4trace:configure.ac:22: -1- DX_CURRENT_FEATURE +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_FLAG_xml$]) +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_FLAG_xml$]) +m4trace:configure.ac:22: -1- DX_IF_FEATURE([xml], [1], [0]) +m4trace:configure.ac:22: -2- DX_FEATURE_xml +m4trace:configure.ac:22: -1- DX_CLEAR_DEPEND([doc], [1]) +m4trace:configure.ac:22: -2- DX_CURRENT_FEATURE +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_FLAG_xml$]) +m4trace:configure.ac:22: -1- DX_TEST_FEATURE([xml]) +m4trace:configure.ac:22: -1- DX_TEST_FEATURE([xml]) +m4trace:configure.ac:22: -1- AM_CONDITIONAL([DX_COND_xml], [:]) +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_COND_xml_TRUE$]) +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_COND_xml_FALSE$]) +m4trace:configure.ac:22: -1- _AM_SUBST_NOTMAKE([DX_COND_xml_TRUE]) +m4trace:configure.ac:22: -1- _AM_SUBST_NOTMAKE([DX_COND_xml_FALSE]) +m4trace:configure.ac:22: -1- DX_ENV_APPEND([GENERATE_XML], [YES]) +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_ENV$]) +m4trace:configure.ac:22: -1- AM_CONDITIONAL([DX_COND_xml], [false]) +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_COND_xml_TRUE$]) +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_COND_xml_FALSE$]) +m4trace:configure.ac:22: -1- _AM_SUBST_NOTMAKE([DX_COND_xml_TRUE]) +m4trace:configure.ac:22: -1- _AM_SUBST_NOTMAKE([DX_COND_xml_FALSE]) +m4trace:configure.ac:22: -1- DX_ENV_APPEND([GENERATE_XML], [NO]) +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_ENV$]) +m4trace:configure.ac:22: -1- DX_ARG_ABLE([chm], [generate doxygen compressed HTML help documentation], [DX_CHECK_DEPEND(doc, 1)], [DX_CLEAR_DEPEND(doc, 1)], [DX_REQUIRE_PROG([DX_HHC], hhc)], [DX_ENV_APPEND(HHC_PATH, $DX_HHC) + DX_ENV_APPEND(GENERATE_HTML, YES) + DX_ENV_APPEND(GENERATE_HTMLHELP, YES)], [DX_ENV_APPEND(GENERATE_HTMLHELP, NO)]) +m4trace:configure.ac:22: -1- AC_DEFUN([DX_CURRENT_FEATURE], [chm]) +m4trace:configure.ac:22: -1- AC_DEFUN([DX_CURRENT_DESCRIPTION], [generate doxygen compressed HTML help documentation]) +m4trace:configure.ac:22: -2- DX_IF_FEATURE([chm], [--disable-doxygen-chm], [--enable-doxygen-chm]) +m4trace:configure.ac:22: -3- DX_FEATURE_chm +m4trace:configure.ac:22: -2- DX_IF_FEATURE([chm], [don't generate doxygen compressed HTML help documentation], [generate doxygen compressed HTML help documentation]) +m4trace:configure.ac:22: -3- DX_FEATURE_chm +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_FLAG_chm$]) +m4trace:configure.ac:22: -1- DX_CHECK_DEPEND([doc], [1]) +m4trace:configure.ac:22: -1- DX_CURRENT_FEATURE +m4trace:configure.ac:22: -1- DX_CURRENT_FEATURE +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_FLAG_chm$]) +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_FLAG_chm$]) +m4trace:configure.ac:22: -1- DX_IF_FEATURE([chm], [1], [0]) +m4trace:configure.ac:22: -2- DX_FEATURE_chm +m4trace:configure.ac:22: -1- DX_CLEAR_DEPEND([doc], [1]) +m4trace:configure.ac:22: -2- DX_CURRENT_FEATURE +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_FLAG_chm$]) +m4trace:configure.ac:22: -1- DX_TEST_FEATURE([chm]) +m4trace:configure.ac:22: -1- DX_REQUIRE_PROG([DX_HHC], [hhc]) +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_HHC$]) +m4trace:configure.ac:22: -1- DX_CURRENT_DESCRIPTION +m4trace:configure.ac:22: -1- DX_CURRENT_DESCRIPTION +m4trace:configure.ac:22: -2- DX_CURRENT_FEATURE +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_FLAG_chm$]) +m4trace:configure.ac:22: -1- DX_TEST_FEATURE([chm]) +m4trace:configure.ac:22: -1- AM_CONDITIONAL([DX_COND_chm], [:]) +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_COND_chm_TRUE$]) +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_COND_chm_FALSE$]) +m4trace:configure.ac:22: -1- _AM_SUBST_NOTMAKE([DX_COND_chm_TRUE]) +m4trace:configure.ac:22: -1- _AM_SUBST_NOTMAKE([DX_COND_chm_FALSE]) +m4trace:configure.ac:22: -1- DX_ENV_APPEND([HHC_PATH], [$DX_HHC]) +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_ENV$]) +m4trace:configure.ac:22: -1- DX_ENV_APPEND([GENERATE_HTML], [YES]) +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_ENV$]) +m4trace:configure.ac:22: -1- DX_ENV_APPEND([GENERATE_HTMLHELP], [YES]) +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_ENV$]) +m4trace:configure.ac:22: -1- AM_CONDITIONAL([DX_COND_chm], [false]) +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_COND_chm_TRUE$]) +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_COND_chm_FALSE$]) +m4trace:configure.ac:22: -1- _AM_SUBST_NOTMAKE([DX_COND_chm_TRUE]) +m4trace:configure.ac:22: -1- _AM_SUBST_NOTMAKE([DX_COND_chm_FALSE]) +m4trace:configure.ac:22: -1- DX_ENV_APPEND([GENERATE_HTMLHELP], [NO]) +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_ENV$]) +m4trace:configure.ac:22: -1- DX_ARG_ABLE([chi], [generate doxygen seperate compressed HTML help index file], [DX_CHECK_DEPEND(chm, 1)], [DX_CLEAR_DEPEND(chm, 1)], [], [DX_ENV_APPEND(GENERATE_CHI, YES)], [DX_ENV_APPEND(GENERATE_CHI, NO)]) +m4trace:configure.ac:22: -1- AC_DEFUN([DX_CURRENT_FEATURE], [chi]) +m4trace:configure.ac:22: -1- AC_DEFUN([DX_CURRENT_DESCRIPTION], [generate doxygen seperate compressed HTML help index file]) +m4trace:configure.ac:22: -2- DX_IF_FEATURE([chi], [--disable-doxygen-chi], [--enable-doxygen-chi]) +m4trace:configure.ac:22: -3- DX_FEATURE_chi +m4trace:configure.ac:22: -2- DX_IF_FEATURE([chi], [don't generate doxygen seperate compressed HTML help index file], [generate doxygen seperate compressed HTML help index file]) +m4trace:configure.ac:22: -3- DX_FEATURE_chi +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_FLAG_chi$]) +m4trace:configure.ac:22: -1- DX_CHECK_DEPEND([chm], [1]) +m4trace:configure.ac:22: -1- DX_CURRENT_FEATURE +m4trace:configure.ac:22: -1- DX_CURRENT_FEATURE +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_FLAG_chi$]) +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_FLAG_chi$]) +m4trace:configure.ac:22: -1- DX_IF_FEATURE([chi], [1], [0]) +m4trace:configure.ac:22: -2- DX_FEATURE_chi +m4trace:configure.ac:22: -1- DX_CLEAR_DEPEND([chm], [1]) +m4trace:configure.ac:22: -2- DX_CURRENT_FEATURE +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_FLAG_chi$]) +m4trace:configure.ac:22: -1- DX_TEST_FEATURE([chi]) +m4trace:configure.ac:22: -1- DX_TEST_FEATURE([chi]) +m4trace:configure.ac:22: -1- AM_CONDITIONAL([DX_COND_chi], [:]) +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_COND_chi_TRUE$]) +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_COND_chi_FALSE$]) +m4trace:configure.ac:22: -1- _AM_SUBST_NOTMAKE([DX_COND_chi_TRUE]) +m4trace:configure.ac:22: -1- _AM_SUBST_NOTMAKE([DX_COND_chi_FALSE]) +m4trace:configure.ac:22: -1- DX_ENV_APPEND([GENERATE_CHI], [YES]) +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_ENV$]) +m4trace:configure.ac:22: -1- AM_CONDITIONAL([DX_COND_chi], [false]) +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_COND_chi_TRUE$]) +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_COND_chi_FALSE$]) +m4trace:configure.ac:22: -1- _AM_SUBST_NOTMAKE([DX_COND_chi_TRUE]) +m4trace:configure.ac:22: -1- _AM_SUBST_NOTMAKE([DX_COND_chi_FALSE]) +m4trace:configure.ac:22: -1- DX_ENV_APPEND([GENERATE_CHI], [NO]) +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_ENV$]) +m4trace:configure.ac:22: -1- DX_ARG_ABLE([html], [generate doxygen plain HTML documentation], [DX_CHECK_DEPEND(doc, 1) DX_CHECK_DEPEND(chm, 0)], [DX_CLEAR_DEPEND(doc, 1) DX_CLEAR_DEPEND(chm, 0)], [], [DX_ENV_APPEND(GENERATE_HTML, YES)], [DX_TEST_FEATURE(chm) || DX_ENV_APPEND(GENERATE_HTML, NO)]) +m4trace:configure.ac:22: -1- AC_DEFUN([DX_CURRENT_FEATURE], [html]) +m4trace:configure.ac:22: -1- AC_DEFUN([DX_CURRENT_DESCRIPTION], [generate doxygen plain HTML documentation]) +m4trace:configure.ac:22: -2- DX_IF_FEATURE([html], [--disable-doxygen-html], [--enable-doxygen-html]) +m4trace:configure.ac:22: -3- DX_FEATURE_html +m4trace:configure.ac:22: -2- DX_IF_FEATURE([html], [don't generate doxygen plain HTML documentation], [generate doxygen plain HTML documentation]) +m4trace:configure.ac:22: -3- DX_FEATURE_html +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_FLAG_html$]) +m4trace:configure.ac:22: -1- DX_CHECK_DEPEND([doc], [1]) +m4trace:configure.ac:22: -1- DX_CURRENT_FEATURE +m4trace:configure.ac:22: -1- DX_CURRENT_FEATURE +m4trace:configure.ac:22: -1- DX_CHECK_DEPEND([chm], [0]) +m4trace:configure.ac:22: -1- DX_CURRENT_FEATURE +m4trace:configure.ac:22: -1- DX_CURRENT_FEATURE +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_FLAG_html$]) +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_FLAG_html$]) +m4trace:configure.ac:22: -1- DX_IF_FEATURE([html], [1], [0]) +m4trace:configure.ac:22: -2- DX_FEATURE_html +m4trace:configure.ac:22: -1- DX_CLEAR_DEPEND([doc], [1]) +m4trace:configure.ac:22: -2- DX_CURRENT_FEATURE +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_FLAG_html$]) +m4trace:configure.ac:22: -1- DX_CLEAR_DEPEND([chm], [0]) +m4trace:configure.ac:22: -2- DX_CURRENT_FEATURE +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_FLAG_html$]) +m4trace:configure.ac:22: -1- DX_TEST_FEATURE([html]) +m4trace:configure.ac:22: -1- DX_TEST_FEATURE([html]) +m4trace:configure.ac:22: -1- AM_CONDITIONAL([DX_COND_html], [:]) +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_COND_html_TRUE$]) +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_COND_html_FALSE$]) +m4trace:configure.ac:22: -1- _AM_SUBST_NOTMAKE([DX_COND_html_TRUE]) +m4trace:configure.ac:22: -1- _AM_SUBST_NOTMAKE([DX_COND_html_FALSE]) +m4trace:configure.ac:22: -1- DX_ENV_APPEND([GENERATE_HTML], [YES]) +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_ENV$]) +m4trace:configure.ac:22: -1- AM_CONDITIONAL([DX_COND_html], [false]) +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_COND_html_TRUE$]) +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_COND_html_FALSE$]) +m4trace:configure.ac:22: -1- _AM_SUBST_NOTMAKE([DX_COND_html_TRUE]) +m4trace:configure.ac:22: -1- _AM_SUBST_NOTMAKE([DX_COND_html_FALSE]) +m4trace:configure.ac:22: -1- DX_TEST_FEATURE([chm]) +m4trace:configure.ac:22: -1- DX_ENV_APPEND([GENERATE_HTML], [NO]) +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_ENV$]) +m4trace:configure.ac:22: -1- DX_ARG_ABLE([ps], [generate doxygen PostScript documentation], [DX_CHECK_DEPEND(doc, 1)], [DX_CLEAR_DEPEND(doc, 1)], [DX_REQUIRE_PROG([DX_LATEX], latex) + DX_REQUIRE_PROG([DX_MAKEINDEX], makeindex) + DX_REQUIRE_PROG([DX_DVIPS], dvips) + DX_REQUIRE_PROG([DX_EGREP], egrep)]) +m4trace:configure.ac:22: -1- AC_DEFUN([DX_CURRENT_FEATURE], [ps]) +m4trace:configure.ac:22: -1- AC_DEFUN([DX_CURRENT_DESCRIPTION], [generate doxygen PostScript documentation]) +m4trace:configure.ac:22: -2- DX_IF_FEATURE([ps], [--disable-doxygen-ps], [--enable-doxygen-ps]) +m4trace:configure.ac:22: -3- DX_FEATURE_ps +m4trace:configure.ac:22: -2- DX_IF_FEATURE([ps], [don't generate doxygen PostScript documentation], [generate doxygen PostScript documentation]) +m4trace:configure.ac:22: -3- DX_FEATURE_ps +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_FLAG_ps$]) +m4trace:configure.ac:22: -1- DX_CHECK_DEPEND([doc], [1]) +m4trace:configure.ac:22: -1- DX_CURRENT_FEATURE +m4trace:configure.ac:22: -1- DX_CURRENT_FEATURE +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_FLAG_ps$]) +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_FLAG_ps$]) +m4trace:configure.ac:22: -1- DX_IF_FEATURE([ps], [1], [0]) +m4trace:configure.ac:22: -2- DX_FEATURE_ps +m4trace:configure.ac:22: -1- DX_CLEAR_DEPEND([doc], [1]) +m4trace:configure.ac:22: -2- DX_CURRENT_FEATURE +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_FLAG_ps$]) +m4trace:configure.ac:22: -1- DX_TEST_FEATURE([ps]) +m4trace:configure.ac:22: -1- DX_REQUIRE_PROG([DX_LATEX], [latex]) +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_LATEX$]) +m4trace:configure.ac:22: -1- DX_CURRENT_DESCRIPTION +m4trace:configure.ac:22: -1- DX_CURRENT_DESCRIPTION +m4trace:configure.ac:22: -2- DX_CURRENT_FEATURE +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_FLAG_ps$]) +m4trace:configure.ac:22: -1- DX_REQUIRE_PROG([DX_MAKEINDEX], [makeindex]) +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_MAKEINDEX$]) +m4trace:configure.ac:22: -1- DX_CURRENT_DESCRIPTION +m4trace:configure.ac:22: -1- DX_CURRENT_DESCRIPTION +m4trace:configure.ac:22: -2- DX_CURRENT_FEATURE +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_FLAG_ps$]) +m4trace:configure.ac:22: -1- DX_REQUIRE_PROG([DX_DVIPS], [dvips]) +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_DVIPS$]) +m4trace:configure.ac:22: -1- DX_CURRENT_DESCRIPTION +m4trace:configure.ac:22: -1- DX_CURRENT_DESCRIPTION +m4trace:configure.ac:22: -2- DX_CURRENT_FEATURE +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_FLAG_ps$]) +m4trace:configure.ac:22: -1- DX_REQUIRE_PROG([DX_EGREP], [egrep]) +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_EGREP$]) +m4trace:configure.ac:22: -1- DX_CURRENT_DESCRIPTION +m4trace:configure.ac:22: -1- DX_CURRENT_DESCRIPTION +m4trace:configure.ac:22: -2- DX_CURRENT_FEATURE +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_FLAG_ps$]) +m4trace:configure.ac:22: -1- DX_TEST_FEATURE([ps]) +m4trace:configure.ac:22: -1- AM_CONDITIONAL([DX_COND_ps], [:]) +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_COND_ps_TRUE$]) +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_COND_ps_FALSE$]) +m4trace:configure.ac:22: -1- _AM_SUBST_NOTMAKE([DX_COND_ps_TRUE]) +m4trace:configure.ac:22: -1- _AM_SUBST_NOTMAKE([DX_COND_ps_FALSE]) +m4trace:configure.ac:22: -1- AM_CONDITIONAL([DX_COND_ps], [false]) +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_COND_ps_TRUE$]) +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_COND_ps_FALSE$]) +m4trace:configure.ac:22: -1- _AM_SUBST_NOTMAKE([DX_COND_ps_TRUE]) +m4trace:configure.ac:22: -1- _AM_SUBST_NOTMAKE([DX_COND_ps_FALSE]) +m4trace:configure.ac:22: -1- DX_ARG_ABLE([pdf], [generate doxygen PDF documentation], [DX_CHECK_DEPEND(doc, 1)], [DX_CLEAR_DEPEND(doc, 1)], [DX_REQUIRE_PROG([DX_PDFLATEX], pdflatex) + DX_REQUIRE_PROG([DX_MAKEINDEX], makeindex) + DX_REQUIRE_PROG([DX_EGREP], egrep)]) +m4trace:configure.ac:22: -1- AC_DEFUN([DX_CURRENT_FEATURE], [pdf]) +m4trace:configure.ac:22: -1- AC_DEFUN([DX_CURRENT_DESCRIPTION], [generate doxygen PDF documentation]) +m4trace:configure.ac:22: -2- DX_IF_FEATURE([pdf], [--disable-doxygen-pdf], [--enable-doxygen-pdf]) +m4trace:configure.ac:22: -3- DX_FEATURE_pdf +m4trace:configure.ac:22: -2- DX_IF_FEATURE([pdf], [don't generate doxygen PDF documentation], [generate doxygen PDF documentation]) +m4trace:configure.ac:22: -3- DX_FEATURE_pdf +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_FLAG_pdf$]) +m4trace:configure.ac:22: -1- DX_CHECK_DEPEND([doc], [1]) +m4trace:configure.ac:22: -1- DX_CURRENT_FEATURE +m4trace:configure.ac:22: -1- DX_CURRENT_FEATURE +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_FLAG_pdf$]) +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_FLAG_pdf$]) +m4trace:configure.ac:22: -1- DX_IF_FEATURE([pdf], [1], [0]) +m4trace:configure.ac:22: -2- DX_FEATURE_pdf +m4trace:configure.ac:22: -1- DX_CLEAR_DEPEND([doc], [1]) +m4trace:configure.ac:22: -2- DX_CURRENT_FEATURE +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_FLAG_pdf$]) +m4trace:configure.ac:22: -1- DX_TEST_FEATURE([pdf]) +m4trace:configure.ac:22: -1- DX_REQUIRE_PROG([DX_PDFLATEX], [pdflatex]) +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_PDFLATEX$]) +m4trace:configure.ac:22: -1- DX_CURRENT_DESCRIPTION +m4trace:configure.ac:22: -1- DX_CURRENT_DESCRIPTION +m4trace:configure.ac:22: -2- DX_CURRENT_FEATURE +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_FLAG_pdf$]) +m4trace:configure.ac:22: -1- DX_REQUIRE_PROG([DX_MAKEINDEX], [makeindex]) +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_MAKEINDEX$]) +m4trace:configure.ac:22: -1- DX_CURRENT_DESCRIPTION +m4trace:configure.ac:22: -1- DX_CURRENT_DESCRIPTION +m4trace:configure.ac:22: -2- DX_CURRENT_FEATURE +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_FLAG_pdf$]) +m4trace:configure.ac:22: -1- DX_REQUIRE_PROG([DX_EGREP], [egrep]) +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_EGREP$]) +m4trace:configure.ac:22: -1- DX_CURRENT_DESCRIPTION +m4trace:configure.ac:22: -1- DX_CURRENT_DESCRIPTION +m4trace:configure.ac:22: -2- DX_CURRENT_FEATURE +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_FLAG_pdf$]) +m4trace:configure.ac:22: -1- DX_TEST_FEATURE([pdf]) +m4trace:configure.ac:22: -1- AM_CONDITIONAL([DX_COND_pdf], [:]) +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_COND_pdf_TRUE$]) +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_COND_pdf_FALSE$]) +m4trace:configure.ac:22: -1- _AM_SUBST_NOTMAKE([DX_COND_pdf_TRUE]) +m4trace:configure.ac:22: -1- _AM_SUBST_NOTMAKE([DX_COND_pdf_FALSE]) +m4trace:configure.ac:22: -1- AM_CONDITIONAL([DX_COND_pdf], [false]) +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_COND_pdf_TRUE$]) +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_COND_pdf_FALSE$]) +m4trace:configure.ac:22: -1- _AM_SUBST_NOTMAKE([DX_COND_pdf_TRUE]) +m4trace:configure.ac:22: -1- _AM_SUBST_NOTMAKE([DX_COND_pdf_FALSE]) +m4trace:configure.ac:22: -1- DX_TEST_FEATURE([ps]) +m4trace:configure.ac:22: -1- DX_TEST_FEATURE([pdf]) +m4trace:configure.ac:22: -1- AM_CONDITIONAL([DX_COND_latex], [:]) +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_COND_latex_TRUE$]) +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_COND_latex_FALSE$]) +m4trace:configure.ac:22: -1- _AM_SUBST_NOTMAKE([DX_COND_latex_TRUE]) +m4trace:configure.ac:22: -1- _AM_SUBST_NOTMAKE([DX_COND_latex_FALSE]) +m4trace:configure.ac:22: -1- DX_ENV_APPEND([GENERATE_LATEX], [YES]) +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_ENV$]) +m4trace:configure.ac:22: -1- AM_CONDITIONAL([DX_COND_latex], [false]) +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_COND_latex_TRUE$]) +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_COND_latex_FALSE$]) +m4trace:configure.ac:22: -1- _AM_SUBST_NOTMAKE([DX_COND_latex_TRUE]) +m4trace:configure.ac:22: -1- _AM_SUBST_NOTMAKE([DX_COND_latex_FALSE]) +m4trace:configure.ac:22: -1- DX_ENV_APPEND([GENERATE_LATEX], [NO]) +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_ENV$]) +m4trace:configure.ac:22: -1- m4_pattern_allow([^DOXYGEN_PAPER_SIZE$]) +m4trace:configure.ac:22: -1- m4_pattern_allow([^DOXYGEN_PAPER_SIZE$]) +m4trace:configure.ac:22: -1- DX_ENV_APPEND([PAPER_SIZE], [$DOXYGEN_PAPER_SIZE]) +m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_ENV$]) +m4trace:configure.ac:25: -1- AM_INIT_AUTOMAKE([-Wall foreign]) +m4trace:configure.ac:25: -1- m4_pattern_allow([^AM_[A-Z]+FLAGS$]) +m4trace:configure.ac:25: -1- AM_SET_CURRENT_AUTOMAKE_VERSION +m4trace:configure.ac:25: -1- AM_AUTOMAKE_VERSION([1.11.6]) +m4trace:configure.ac:25: -1- _AM_AUTOCONF_VERSION([2.69]) +m4trace:configure.ac:25: -1- m4_pattern_allow([^INSTALL_PROGRAM$]) +m4trace:configure.ac:25: -1- m4_pattern_allow([^INSTALL_SCRIPT$]) +m4trace:configure.ac:25: -1- m4_pattern_allow([^INSTALL_DATA$]) +m4trace:configure.ac:25: -1- m4_pattern_allow([^am__isrc$]) +m4trace:configure.ac:25: -1- _AM_SUBST_NOTMAKE([am__isrc]) +m4trace:configure.ac:25: -1- m4_pattern_allow([^CYGPATH_W$]) +m4trace:configure.ac:25: -1- _AM_SET_OPTIONS([-Wall foreign]) +m4trace:configure.ac:25: -1- _AM_SET_OPTION([-Wall]) +m4trace:configure.ac:25: -2- _AM_MANGLE_OPTION([-Wall]) +m4trace:configure.ac:25: -1- _AM_SET_OPTION([foreign]) +m4trace:configure.ac:25: -2- _AM_MANGLE_OPTION([foreign]) +m4trace:configure.ac:25: -1- m4_pattern_allow([^PACKAGE$]) +m4trace:configure.ac:25: -1- m4_pattern_allow([^VERSION$]) +m4trace:configure.ac:25: -1- _AM_IF_OPTION([no-define], [], [AC_DEFINE_UNQUOTED(PACKAGE, "$PACKAGE", [Name of package]) + AC_DEFINE_UNQUOTED(VERSION, "$VERSION", [Version number of package])]) +m4trace:configure.ac:25: -2- _AM_MANGLE_OPTION([no-define]) +m4trace:configure.ac:25: -1- m4_pattern_allow([^PACKAGE$]) +m4trace:configure.ac:25: -1- m4_pattern_allow([^VERSION$]) +m4trace:configure.ac:25: -1- AM_SANITY_CHECK +m4trace:configure.ac:25: -1- AM_MISSING_PROG([ACLOCAL], [aclocal-${am__api_version}]) +m4trace:configure.ac:25: -1- AM_MISSING_HAS_RUN +m4trace:configure.ac:25: -1- AM_AUX_DIR_EXPAND +m4trace:configure.ac:25: -1- m4_pattern_allow([^ACLOCAL$]) +m4trace:configure.ac:25: -1- AM_MISSING_PROG([AUTOCONF], [autoconf]) +m4trace:configure.ac:25: -1- m4_pattern_allow([^AUTOCONF$]) +m4trace:configure.ac:25: -1- AM_MISSING_PROG([AUTOMAKE], [automake-${am__api_version}]) +m4trace:configure.ac:25: -1- m4_pattern_allow([^AUTOMAKE$]) +m4trace:configure.ac:25: -1- AM_MISSING_PROG([AUTOHEADER], [autoheader]) +m4trace:configure.ac:25: -1- m4_pattern_allow([^AUTOHEADER$]) +m4trace:configure.ac:25: -1- AM_MISSING_PROG([MAKEINFO], [makeinfo]) +m4trace:configure.ac:25: -1- m4_pattern_allow([^MAKEINFO$]) +m4trace:configure.ac:25: -1- AM_PROG_INSTALL_SH +m4trace:configure.ac:25: -1- m4_pattern_allow([^install_sh$]) +m4trace:configure.ac:25: -1- AM_PROG_INSTALL_STRIP +m4trace:configure.ac:25: -1- m4_pattern_allow([^STRIP$]) +m4trace:configure.ac:25: -1- m4_pattern_allow([^INSTALL_STRIP_PROGRAM$]) +m4trace:configure.ac:25: -1- AM_PROG_MKDIR_P +m4trace:configure.ac:25: -1- m4_pattern_allow([^MKDIR_P$]) +m4trace:configure.ac:25: -1- m4_pattern_allow([^mkdir_p$]) +m4trace:configure.ac:25: -1- m4_pattern_allow([^AWK$]) +m4trace:configure.ac:25: -1- m4_pattern_allow([^SET_MAKE$]) +m4trace:configure.ac:25: -1- AM_SET_LEADING_DOT +m4trace:configure.ac:25: -1- m4_pattern_allow([^am__leading_dot$]) +m4trace:configure.ac:25: -1- _AM_IF_OPTION([tar-ustar], [_AM_PROG_TAR([ustar])], [_AM_IF_OPTION([tar-pax], [_AM_PROG_TAR([pax])], + [_AM_PROG_TAR([v7])])]) +m4trace:configure.ac:25: -2- _AM_MANGLE_OPTION([tar-ustar]) +m4trace:configure.ac:25: -1- _AM_IF_OPTION([tar-pax], [_AM_PROG_TAR([pax])], [_AM_PROG_TAR([v7])]) +m4trace:configure.ac:25: -2- _AM_MANGLE_OPTION([tar-pax]) +m4trace:configure.ac:25: -1- _AM_PROG_TAR([v7]) +m4trace:configure.ac:25: -1- m4_pattern_allow([^AMTAR$]) +m4trace:configure.ac:25: -1- m4_pattern_allow([^am__tar$]) +m4trace:configure.ac:25: -1- m4_pattern_allow([^am__untar$]) +m4trace:configure.ac:25: -1- _AM_IF_OPTION([no-dependencies], [], [AC_PROVIDE_IFELSE([AC_PROG_CC], + [_AM_DEPENDENCIES(CC)], + [define([AC_PROG_CC], + defn([AC_PROG_CC])[_AM_DEPENDENCIES(CC)])])dnl +AC_PROVIDE_IFELSE([AC_PROG_CXX], + [_AM_DEPENDENCIES(CXX)], + [define([AC_PROG_CXX], + defn([AC_PROG_CXX])[_AM_DEPENDENCIES(CXX)])])dnl +AC_PROVIDE_IFELSE([AC_PROG_OBJC], + [_AM_DEPENDENCIES(OBJC)], + [define([AC_PROG_OBJC], + defn([AC_PROG_OBJC])[_AM_DEPENDENCIES(OBJC)])])dnl +]) +m4trace:configure.ac:25: -2- _AM_MANGLE_OPTION([no-dependencies]) +m4trace:configure.ac:25: -1- _AM_IF_OPTION([silent-rules], [AC_REQUIRE([AM_SILENT_RULES])]) +m4trace:configure.ac:25: -2- _AM_MANGLE_OPTION([silent-rules]) +m4trace:configure.ac:37: -1- AM_PATH_CPPUNIT([1.10.2]) +m4trace:configure.ac:37: -1- m4_pattern_allow([^CPPUNIT_CONFIG$]) +m4trace:configure.ac:37: -1- m4_pattern_allow([^CPPUNIT_CFLAGS$]) +m4trace:configure.ac:37: -1- m4_pattern_allow([^CPPUNIT_LIBS$]) +m4trace:configure.ac:44: -1- _m4_warn([cross], [cannot check for file existence when cross compiling], [../../lib/autoconf/general.m4:2777: AC_CHECK_FILE is expanded from... +../../lib/autoconf/general.m4:2808: AC_CHECK_FILES is expanded from... +configure.ac:44: the top level]) +m4trace:configure.ac:44: -1- m4_pattern_allow([^HAVE_GENERATED_ZOOKEEPER_JUTE_C$]) +m4trace:configure.ac:44: -1- _m4_warn([cross], [cannot check for file existence when cross compiling], [../../lib/autoconf/general.m4:2777: AC_CHECK_FILE is expanded from... +../../lib/autoconf/general.m4:2808: AC_CHECK_FILES is expanded from... +configure.ac:44: the top level]) +m4trace:configure.ac:44: -1- m4_pattern_allow([^HAVE_GENERATED_ZOOKEEPER_JUTE_H$]) +m4trace:configure.ac:48: -1- m4_pattern_allow([^CPPUNIT_CFLAGS$]) +m4trace:configure.ac:50: -1- m4_pattern_allow([^CC$]) +m4trace:configure.ac:50: -1- m4_pattern_allow([^CFLAGS$]) +m4trace:configure.ac:50: -1- m4_pattern_allow([^LDFLAGS$]) +m4trace:configure.ac:50: -1- m4_pattern_allow([^LIBS$]) +m4trace:configure.ac:50: -1- m4_pattern_allow([^CPPFLAGS$]) +m4trace:configure.ac:50: -1- m4_pattern_allow([^CC$]) +m4trace:configure.ac:50: -1- m4_pattern_allow([^CC$]) +m4trace:configure.ac:50: -1- m4_pattern_allow([^CC$]) +m4trace:configure.ac:50: -1- m4_pattern_allow([^CC$]) +m4trace:configure.ac:50: -1- m4_pattern_allow([^ac_ct_CC$]) +m4trace:configure.ac:50: -1- m4_pattern_allow([^EXEEXT$]) +m4trace:configure.ac:50: -1- m4_pattern_allow([^OBJEXT$]) +m4trace:configure.ac:50: -1- _AM_DEPENDENCIES([CC]) +m4trace:configure.ac:50: -1- AM_SET_DEPDIR +m4trace:configure.ac:50: -1- m4_pattern_allow([^DEPDIR$]) +m4trace:configure.ac:50: -1- AM_OUTPUT_DEPENDENCY_COMMANDS +m4trace:configure.ac:50: -1- AM_MAKE_INCLUDE +m4trace:configure.ac:50: -1- m4_pattern_allow([^am__include$]) +m4trace:configure.ac:50: -1- m4_pattern_allow([^am__quote$]) +m4trace:configure.ac:50: -1- AM_DEP_TRACK +m4trace:configure.ac:50: -1- AM_CONDITIONAL([AMDEP], [test "x$enable_dependency_tracking" != xno]) +m4trace:configure.ac:50: -1- m4_pattern_allow([^AMDEP_TRUE$]) +m4trace:configure.ac:50: -1- m4_pattern_allow([^AMDEP_FALSE$]) +m4trace:configure.ac:50: -1- _AM_SUBST_NOTMAKE([AMDEP_TRUE]) +m4trace:configure.ac:50: -1- _AM_SUBST_NOTMAKE([AMDEP_FALSE]) +m4trace:configure.ac:50: -1- m4_pattern_allow([^AMDEPBACKSLASH$]) +m4trace:configure.ac:50: -1- _AM_SUBST_NOTMAKE([AMDEPBACKSLASH]) +m4trace:configure.ac:50: -1- m4_pattern_allow([^am__nodep$]) +m4trace:configure.ac:50: -1- _AM_SUBST_NOTMAKE([am__nodep]) +m4trace:configure.ac:50: -1- m4_pattern_allow([^CCDEPMODE$]) +m4trace:configure.ac:50: -1- AM_CONDITIONAL([am__fastdepCC], [ + test "x$enable_dependency_tracking" != xno \ + && test "$am_cv_CC_dependencies_compiler_type" = gcc3]) +m4trace:configure.ac:50: -1- m4_pattern_allow([^am__fastdepCC_TRUE$]) +m4trace:configure.ac:50: -1- m4_pattern_allow([^am__fastdepCC_FALSE$]) +m4trace:configure.ac:50: -1- _AM_SUBST_NOTMAKE([am__fastdepCC_TRUE]) +m4trace:configure.ac:50: -1- _AM_SUBST_NOTMAKE([am__fastdepCC_FALSE]) +m4trace:configure.ac:51: -1- AM_PROG_CC_C_O +m4trace:configure.ac:51: -1- m4_pattern_allow([^NO_MINUS_C_MINUS_O$]) +m4trace:configure.ac:52: -1- m4_pattern_allow([^CXX$]) +m4trace:configure.ac:52: -1- m4_pattern_allow([^CXXFLAGS$]) +m4trace:configure.ac:52: -1- m4_pattern_allow([^LDFLAGS$]) +m4trace:configure.ac:52: -1- m4_pattern_allow([^LIBS$]) +m4trace:configure.ac:52: -1- m4_pattern_allow([^CPPFLAGS$]) +m4trace:configure.ac:52: -1- m4_pattern_allow([^CXX$]) +m4trace:configure.ac:52: -1- m4_pattern_allow([^ac_ct_CXX$]) +m4trace:configure.ac:52: -1- _AM_DEPENDENCIES([CXX]) +m4trace:configure.ac:52: -1- m4_pattern_allow([^CXXDEPMODE$]) +m4trace:configure.ac:52: -1- AM_CONDITIONAL([am__fastdepCXX], [ + test "x$enable_dependency_tracking" != xno \ + && test "$am_cv_CXX_dependencies_compiler_type" = gcc3]) +m4trace:configure.ac:52: -1- m4_pattern_allow([^am__fastdepCXX_TRUE$]) +m4trace:configure.ac:52: -1- m4_pattern_allow([^am__fastdepCXX_FALSE$]) +m4trace:configure.ac:52: -1- _AM_SUBST_NOTMAKE([am__fastdepCXX_TRUE]) +m4trace:configure.ac:52: -1- _AM_SUBST_NOTMAKE([am__fastdepCXX_FALSE]) +m4trace:configure.ac:54: -1- m4_pattern_allow([^LN_S$]) +m4trace:configure.ac:57: -1- AC_PROG_LIBTOOL +m4trace:configure.ac:57: -1- _m4_warn([obsolete], [The macro `AC_PROG_LIBTOOL' is obsolete. +You should run autoupdate.], [/usr/share/aclocal/libtool.m4:107: AC_PROG_LIBTOOL is expanded from... +configure.ac:57: the top level]) +m4trace:configure.ac:57: -1- LT_INIT +m4trace:configure.ac:57: -1- m4_pattern_forbid([^_?LT_[A-Z_]+$]) +m4trace:configure.ac:57: -1- m4_pattern_allow([^(_LT_EOF|LT_DLGLOBAL|LT_DLLAZY_OR_NOW|LT_MULTI_MODULE)$]) +m4trace:configure.ac:57: -1- LTOPTIONS_VERSION +m4trace:configure.ac:57: -1- LTSUGAR_VERSION +m4trace:configure.ac:57: -1- LTVERSION_VERSION +m4trace:configure.ac:57: -1- LTOBSOLETE_VERSION +m4trace:configure.ac:57: -1- _LT_PROG_LTMAIN +m4trace:configure.ac:57: -1- m4_pattern_allow([^LIBTOOL$]) +m4trace:configure.ac:57: -1- m4_pattern_allow([^build$]) +m4trace:configure.ac:57: -1- m4_pattern_allow([^build_cpu$]) +m4trace:configure.ac:57: -1- m4_pattern_allow([^build_vendor$]) +m4trace:configure.ac:57: -1- m4_pattern_allow([^build_os$]) +m4trace:configure.ac:57: -1- m4_pattern_allow([^host$]) +m4trace:configure.ac:57: -1- m4_pattern_allow([^host_cpu$]) +m4trace:configure.ac:57: -1- m4_pattern_allow([^host_vendor$]) +m4trace:configure.ac:57: -1- m4_pattern_allow([^host_os$]) +m4trace:configure.ac:57: -1- _LT_PREPARE_SED_QUOTE_VARS +m4trace:configure.ac:57: -1- _LT_PROG_ECHO_BACKSLASH +m4trace:configure.ac:57: -1- LT_PATH_LD +m4trace:configure.ac:57: -1- m4_pattern_allow([^SED$]) +m4trace:configure.ac:57: -1- AC_PROG_EGREP +m4trace:configure.ac:57: -1- m4_pattern_allow([^GREP$]) +m4trace:configure.ac:57: -1- m4_pattern_allow([^EGREP$]) +m4trace:configure.ac:57: -1- m4_pattern_allow([^FGREP$]) +m4trace:configure.ac:57: -1- m4_pattern_allow([^GREP$]) +m4trace:configure.ac:57: -1- m4_pattern_allow([^LD$]) +m4trace:configure.ac:57: -1- LT_PATH_NM +m4trace:configure.ac:57: -1- m4_pattern_allow([^DUMPBIN$]) +m4trace:configure.ac:57: -1- m4_pattern_allow([^ac_ct_DUMPBIN$]) +m4trace:configure.ac:57: -1- m4_pattern_allow([^DUMPBIN$]) +m4trace:configure.ac:57: -1- m4_pattern_allow([^NM$]) +m4trace:configure.ac:57: -1- LT_CMD_MAX_LEN +m4trace:configure.ac:57: -1- m4_pattern_allow([^OBJDUMP$]) +m4trace:configure.ac:57: -1- m4_pattern_allow([^OBJDUMP$]) +m4trace:configure.ac:57: -1- m4_pattern_allow([^DLLTOOL$]) +m4trace:configure.ac:57: -1- m4_pattern_allow([^DLLTOOL$]) +m4trace:configure.ac:57: -1- m4_pattern_allow([^AR$]) +m4trace:configure.ac:57: -1- m4_pattern_allow([^ac_ct_AR$]) +m4trace:configure.ac:57: -1- m4_pattern_allow([^STRIP$]) +m4trace:configure.ac:57: -1- m4_pattern_allow([^RANLIB$]) +m4trace:configure.ac:57: -1- _LT_WITH_SYSROOT +m4trace:configure.ac:57: -1- m4_pattern_allow([LT_OBJDIR]) +m4trace:configure.ac:57: -1- m4_pattern_allow([^LT_OBJDIR$]) +m4trace:configure.ac:57: -1- _LT_CC_BASENAME([$compiler]) +m4trace:configure.ac:57: -1- _LT_PATH_TOOL_PREFIX([${ac_tool_prefix}file], [/usr/bin$PATH_SEPARATOR$PATH]) +m4trace:configure.ac:57: -1- _LT_PATH_TOOL_PREFIX([file], [/usr/bin$PATH_SEPARATOR$PATH]) +m4trace:configure.ac:57: -1- LT_SUPPORTED_TAG([CC]) +m4trace:configure.ac:57: -1- _LT_COMPILER_BOILERPLATE +m4trace:configure.ac:57: -1- _LT_LINKER_BOILERPLATE +m4trace:configure.ac:57: -1- _LT_COMPILER_OPTION([if $compiler supports -fno-rtti -fno-exceptions], [lt_cv_prog_compiler_rtti_exceptions], [-fno-rtti -fno-exceptions], [], [_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, )="$_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, ) -fno-rtti -fno-exceptions"]) +m4trace:configure.ac:57: -1- _LT_COMPILER_OPTION([if $compiler PIC flag $_LT_TAGVAR(lt_prog_compiler_pic, ) works], [_LT_TAGVAR(lt_cv_prog_compiler_pic_works, )], [$_LT_TAGVAR(lt_prog_compiler_pic, )@&t@m4_if([],[],[ -DPIC],[m4_if([],[CXX],[ -DPIC],[])])], [], [case $_LT_TAGVAR(lt_prog_compiler_pic, ) in + "" | " "*) ;; + *) _LT_TAGVAR(lt_prog_compiler_pic, )=" $_LT_TAGVAR(lt_prog_compiler_pic, )" ;; + esac], [_LT_TAGVAR(lt_prog_compiler_pic, )= + _LT_TAGVAR(lt_prog_compiler_can_build_shared, )=no]) +m4trace:configure.ac:57: -1- _LT_LINKER_OPTION([if $compiler static flag $lt_tmp_static_flag works], [lt_cv_prog_compiler_static_works], [$lt_tmp_static_flag], [], [_LT_TAGVAR(lt_prog_compiler_static, )=]) +m4trace:configure.ac:57: -1- m4_pattern_allow([^MANIFEST_TOOL$]) +m4trace:configure.ac:57: -1- _LT_REQUIRED_DARWIN_CHECKS +m4trace:configure.ac:57: -1- m4_pattern_allow([^DSYMUTIL$]) +m4trace:configure.ac:57: -1- m4_pattern_allow([^NMEDIT$]) +m4trace:configure.ac:57: -1- m4_pattern_allow([^LIPO$]) +m4trace:configure.ac:57: -1- m4_pattern_allow([^OTOOL$]) +m4trace:configure.ac:57: -1- m4_pattern_allow([^OTOOL64$]) +m4trace:configure.ac:57: -1- _LT_LINKER_OPTION([if $CC understands -b], [lt_cv_prog_compiler__b], [-b], [_LT_TAGVAR(archive_cmds, )='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'], [_LT_TAGVAR(archive_cmds, )='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags']) +m4trace:configure.ac:57: -1- LT_SYS_DLOPEN_SELF +m4trace:configure.ac:57: -1- m4_pattern_allow([^CPP$]) +m4trace:configure.ac:57: -1- m4_pattern_allow([^CPPFLAGS$]) +m4trace:configure.ac:57: -1- m4_pattern_allow([^CPP$]) +m4trace:configure.ac:57: -1- m4_pattern_allow([^STDC_HEADERS$]) +m4trace:configure.ac:57: -1- m4_pattern_allow([^HAVE_DLFCN_H$]) +m4trace:configure.ac:57: -1- LT_LANG([CXX]) +m4trace:configure.ac:57: -1- LT_SUPPORTED_TAG([CXX]) +m4trace:configure.ac:57: -1- m4_pattern_allow([^CXXCPP$]) +m4trace:configure.ac:57: -1- m4_pattern_allow([^CPPFLAGS$]) +m4trace:configure.ac:57: -1- m4_pattern_allow([^CXXCPP$]) +m4trace:configure.ac:57: -1- _LT_COMPILER_BOILERPLATE +m4trace:configure.ac:57: -1- _LT_LINKER_BOILERPLATE +m4trace:configure.ac:57: -1- _LT_CC_BASENAME([$compiler]) +m4trace:configure.ac:57: -1- LT_PATH_LD +m4trace:configure.ac:57: -1- m4_pattern_allow([^LD$]) +m4trace:configure.ac:57: -1- _LT_COMPILER_OPTION([if $compiler PIC flag $_LT_TAGVAR(lt_prog_compiler_pic, CXX) works], [_LT_TAGVAR(lt_cv_prog_compiler_pic_works, CXX)], [$_LT_TAGVAR(lt_prog_compiler_pic, CXX)@&t@m4_if([CXX],[],[ -DPIC],[m4_if([CXX],[CXX],[ -DPIC],[])])], [], [case $_LT_TAGVAR(lt_prog_compiler_pic, CXX) in + "" | " "*) ;; + *) _LT_TAGVAR(lt_prog_compiler_pic, CXX)=" $_LT_TAGVAR(lt_prog_compiler_pic, CXX)" ;; + esac], [_LT_TAGVAR(lt_prog_compiler_pic, CXX)= + _LT_TAGVAR(lt_prog_compiler_can_build_shared, CXX)=no]) +m4trace:configure.ac:57: -1- _LT_LINKER_OPTION([if $compiler static flag $lt_tmp_static_flag works], [lt_cv_prog_compiler_static_works_CXX], [$lt_tmp_static_flag], [], [_LT_TAGVAR(lt_prog_compiler_static, CXX)=]) +m4trace:configure.ac:106: -1- AM_CONDITIONAL([WANT_SYNCAPI], [test "x$with_syncapi" != xno]) +m4trace:configure.ac:106: -1- m4_pattern_allow([^WANT_SYNCAPI_TRUE$]) +m4trace:configure.ac:106: -1- m4_pattern_allow([^WANT_SYNCAPI_FALSE$]) +m4trace:configure.ac:106: -1- _AM_SUBST_NOTMAKE([WANT_SYNCAPI_TRUE]) +m4trace:configure.ac:106: -1- _AM_SUBST_NOTMAKE([WANT_SYNCAPI_FALSE]) +m4trace:configure.ac:109: -1- m4_pattern_allow([^STDC_HEADERS$]) +m4trace:configure.ac:113: -1- m4_pattern_allow([^const$]) +m4trace:configure.ac:115: -1- m4_pattern_allow([^TIME_WITH_SYS_TIME$]) +m4trace:configure.ac:116: -1- m4_pattern_allow([^POLL_NFDS_TYPE$]) +m4trace:configure.ac:116: -1- m4_pattern_allow([^POLL_NFDS_TYPE$]) +m4trace:configure.ac:123: -1- _m4_warn([obsolete], [The macro `AC_TRY_RUN' is obsolete. +You should run autoupdate.], [../../lib/autoconf/general.m4:2764: AC_TRY_RUN is expanded from... +configure.ac:123: the top level]) +m4trace:configure.ac:142: -1- m4_pattern_allow([^USEIPV6$]) +m4trace:configure.ac:149: -1- m4_pattern_allow([^LIB@&t@OBJS$]) +m4trace:configure.ac:149: -1- m4_pattern_allow([^LTLIBOBJS$]) +m4trace:configure.ac:149: -1- AM_CONDITIONAL([am__EXEEXT], [test -n "$EXEEXT"]) +m4trace:configure.ac:149: -1- m4_pattern_allow([^am__EXEEXT_TRUE$]) +m4trace:configure.ac:149: -1- m4_pattern_allow([^am__EXEEXT_FALSE$]) +m4trace:configure.ac:149: -1- _AM_SUBST_NOTMAKE([am__EXEEXT_TRUE]) +m4trace:configure.ac:149: -1- _AM_SUBST_NOTMAKE([am__EXEEXT_FALSE]) +m4trace:configure.ac:149: -1- _AC_AM_CONFIG_HEADER_HOOK(["$ac_file"]) +m4trace:configure.ac:149: -1- _AM_OUTPUT_DEPENDENCY_COMMANDS +m4trace:configure.ac:149: -1- _LT_PROG_LTMAIN diff --git a/pkg/registry/zookeeper-3.4.6/src/c/c-doc.Doxyfile b/pkg/registry/zookeeper-3.4.6/src/c/c-doc.Doxyfile new file mode 100644 index 000000000..e9029cb17 --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/c/c-doc.Doxyfile @@ -0,0 +1,1252 @@ +# Doxyfile 1.4.7 + +# 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 (" ") + +#--------------------------------------------------------------------------- +# Project related 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 = $(PROJECT)-$(VERSION) + +# 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 = $(DOCDIR) + +# If the CREATE_SUBDIRS tag is set to YES, then doxygen will create +# 4096 sub-directories (in 2 levels) under the output directory of each output +# format and will distribute the generated files over these directories. +# Enabling this option can be useful when feeding doxygen a huge amount of +# source files, where putting all generated files in the same directory would +# otherwise cause performance problems for the file system. + +CREATE_SUBDIRS = NO + +# 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, Korean-en, Norwegian, +# Polish, Portuguese, Romanian, Russian, Serbian, Slovak, Slovene, Spanish, +# Swedish, and Ukrainian. + +OUTPUT_LANGUAGE = English + +# This tag can be used to specify the encoding used in the generated output. +# The encoding is not always determined by the language that is chosen, +# but also whether or not the output is meant for Windows or non-Windows users. +# In case there is a difference, setting the USE_WINDOWS_ENCODING tag to YES +# forces the Windows encoding (this is the default for the Windows binary), +# whereas setting the tag to NO uses a Unix-style encoding (the default for +# all platforms other than Windows). + +USE_WINDOWS_ENCODING = 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 + +# This tag implements a quasi-intelligent brief description abbreviator +# that is used to form the text in various listings. Each string +# in this list, if found as the leading text of the brief description, will be +# stripped from the text and the result after processing the whole list, is +# used as the annotated text. Otherwise, the brief description is used as-is. +# If left blank, the following values are used ("$name" is automatically +# replaced with the name of the entity): "The $name class" "The $name widget" +# "The $name file" "is" "provides" "specifies" "contains" +# "represents" "a" "an" "the" + +ABBREVIATE_BRIEF = + +# 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 = YES + +# 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. The tag can be used to show relative paths in the file list. +# If left blank the directory from which doxygen is run is used as the +# path to strip. + +STRIP_FROM_PATH = + +# The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of +# the path mentioned in the documentation of a class, which tells +# the reader which header file to include in order to use a class. +# If left blank only the name of the header file containing the class +# definition is used. Otherwise one should specify the include paths that +# are normally passed to the compiler using the -I flag. + +STRIP_FROM_INC_PATH = + +# 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 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 +# explicit @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 +# re-implements. + +INHERIT_DOCS = YES + +# If the SEPARATE_MEMBER_PAGES tag is set to YES, then doxygen will produce +# a new page for each member. If set to NO, the documentation of a member will +# be part of the file/class/namespace that contains it. + +SEPARATE_MEMBER_PAGES = 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 + +# 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 = + +# 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 + +# If you use STL classes (i.e. std::string, std::vector, etc.) but do not want to +# include (a tag file for) the STL sources as input, then you should +# set this tag to YES in order to let doxygen match functions declarations and +# definitions whose arguments contain STL classes (e.g. func(std::string); v.s. +# func(std::string) {}). This also make the inheritance and collaboration +# diagrams that involve STL classes more complete and accurate. + +BUILTIN_STL_SUPPORT = NO + +# 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 + +# Set the SUBGROUPING tag to YES (the default) to allow class member groups of +# the same type (for instance a group of public functions) to be put as a +# subgroup of that type (e.g. under the Public Functions section). Set it to +# NO to prevent subgrouping. Alternatively, this can be done per class using +# the \nosubgrouping command. + +SUBGROUPING = YES + +#--------------------------------------------------------------------------- +# Build related configuration options +#--------------------------------------------------------------------------- + +# 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 = NO + +# 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 = YES + +# 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 = YES + +# This flag is only useful for Objective-C code. When set to YES local +# methods, which are defined in the implementation section but not in +# the interface are included in the documentation. +# If set to NO (the default) only methods in the interface are included. + +EXTRACT_LOCAL_METHODS = 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 classes 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 HIDE_IN_BODY_DOCS tag is set to YES, Doxygen will hide any +# documentation blocks found inside the body of a function. +# If set to NO (the default) these blocks will be appended to the +# function's detailed documentation block. + +HIDE_IN_BODY_DOCS = NO + +# 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 + +# 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 +# and Mac users are advised to set this option to NO. + +CASE_SENSE_NAMES = YES + +# 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 SHOW_INCLUDE_FILES tag is set to YES (the default) then Doxygen +# will put a list of the files that are included by a file in the documentation +# of that file. + +SHOW_INCLUDE_FILES = NO + +# 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 the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the +# brief documentation of file, namespace and class members alphabetically +# by member name. If set to NO (the default) the members will appear in +# declaration order. + +SORT_BRIEF_DOCS = NO + +# If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be +# sorted by fully-qualified names, including namespaces. If set to +# NO (the default), the class list will be sorted only by class name, +# not including the namespace part. +# Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES. +# Note: This option applies only to the class list, not to the +# alphabetical list. + +SORT_BY_SCOPE_NAME = NO + +# 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 + +# 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 consists 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 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 = YES + +# If the sources in your project are distributed over multiple directories +# then setting the SHOW_DIRECTORIES tag to YES will show the directory hierarchy +# in the documentation. The default is NO. + +SHOW_DIRECTORIES = NO + +# The FILE_VERSION_FILTER tag can be used to specify a program or script that +# doxygen should invoke to get the current version for each file (typically from the +# version control system). Doxygen will invoke the program by executing (via +# popen()) the command , where is the value of +# the FILE_VERSION_FILTER tag, and is the name of an input file +# provided by doxygen. Whatever the program writes to standard output +# is used as the file version. See the manual for examples. + +FILE_VERSION_FILTER = + +#--------------------------------------------------------------------------- +# 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 + +# If WARN_IF_DOC_ERROR is set to YES, doxygen will generate warnings for +# potential errors in the documentation, such as not documenting some +# parameters in a documented function, or documenting parameters that +# don't exist or using markup commands wrongly. + +WARN_IF_DOC_ERROR = YES + +# This WARN_NO_PARAMDOC option can be abled to get warnings for +# functions that are documented, but have no documentation for their parameters +# or return value. If set to NO (the default) doxygen will only warn about +# wrong or incomplete parameter documentation, but not about the absence of +# documentation. + +WARN_NO_PARAMDOC = NO + +# 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. Optionally the format may contain +# $version, which will be replaced by the version of the file (if it could +# be obtained via FILE_VERSION_FILTER) + +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 = include/zookeeper.h + +# 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 *.cs *.php *.php3 *.inc *.m *.mm *.py + +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. Note that the wildcards are matched +# against the file with absolute path, so to exclude all test directories +# for example use the pattern */test/* + +EXCLUDE_PATTERNS = + +# The EXAMPLE_PATH tag can be used to specify one or more files or +# directories that contain example code fragments that are included (see +# the \include command). + +EXAMPLE_PATH = + +# If the value of the EXAMPLE_PATH tag contains directories, you can use the +# EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp +# and *.h) to filter out the source-files in the directories. If left +# blank all files are included. + +EXAMPLE_PATTERNS = + +# If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be +# searched for input files to be used with the \include or \dontinclude +# commands irrespective of the value of the RECURSIVE tag. +# Possible values are YES and NO. If left blank NO is used. + +EXAMPLE_RECURSIVE = NO + +# The IMAGE_PATH tag can be used to specify one or more files or +# directories that contain image that are included in the documentation (see +# the \image command). + +IMAGE_PATH = + +# The INPUT_FILTER tag can be used to specify a program that doxygen should +# invoke to filter for each input file. Doxygen will invoke the filter program +# by executing (via popen()) the command , where +# is the value of the INPUT_FILTER tag, and is the name of an +# input file. Doxygen will then use the output that the filter program writes +# to standard output. If FILTER_PATTERNS is specified, this tag will be +# ignored. + +INPUT_FILTER = + +# The FILTER_PATTERNS tag can be used to specify filters on a per file pattern +# basis. Doxygen will compare the file name with each pattern and apply the +# filter if there is a match. The filters are a list of the form: +# pattern=filter (like *.cpp=my_cpp_filter). See INPUT_FILTER for further +# info on how filters are used. If FILTER_PATTERNS is empty, INPUT_FILTER +# is applied to all files. + +FILTER_PATTERNS = + +# 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. +# Note: To get rid of all source code in the generated output, make sure also +# VERBATIM_HEADERS is set to NO. + +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 + +# 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 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 = YES + +# 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 = YES + +# If the REFERENCES_LINK_SOURCE tag is set to YES (the default) +# and SOURCE_BROWSER tag is set to YES, then the hyperlinks from +# functions in REFERENCES_RELATION and REFERENCED_BY_RELATION lists will +# link to the source code. Otherwise they will link to the documentstion. + +REFERENCES_LINK_SOURCE = YES + +# If the USE_HTAGS tag is set to YES then the references to source code +# will point to the HTML generated by the htags(1) tool instead of doxygen +# built-in source browser. The htags tool is part of GNU's global source +# tagging system (see http://www.gnu.org/software/global/global.html). You +# will need version 4.8.6 or higher. + +USE_HTAGS = 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 + +#--------------------------------------------------------------------------- +# 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 = NO + +# 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 = $(GENERATE_HTML) + +# 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 = html + +# 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. Note that doxygen will try to copy +# the style sheet file to the HTML output directory, so don't put your own +# stylesheet in the HTML output directory as well, or it will be erased! + +HTML_STYLESHEET = + +# 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 = $(GENERATE_HTMLHELP) + +# 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 directory. + +CHM_FILE = ../$(PROJECT).chm + +# 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 = $(HHC_PATH) + +# 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 = $(GENERATE_CHI) + +# 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 = NO + +# 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, DHTML, CSS and frames is required (for instance Mozilla 1.0+, +# Netscape 6.0+, Internet explorer 5.0+, or Konqueror). 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 = $(GENERATE_LATEX) + +# 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 = $(PAPER_SIZE) + +# 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 = $(GENERATE_PDF) + +# 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 + +# If LATEX_HIDE_INDICES is set to YES then doxygen will not +# include the index chapters (such as File Index, Compound Index, etc.) +# in the output. + +LATEX_HIDE_INDICES = 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 optimized for Word 97 and may not look very pretty with +# other RTF readers or editors. + +GENERATE_RTF = $(GENERATE_RTF) + +# 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 assignments. 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 = $(GENERATE_MAN) + +# 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. + +GENERATE_XML = $(GENERATE_XML) + +# The XML_OUTPUT tag is used to specify where the XML 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 `xml' will be used as the default path. + +XML_OUTPUT = xml + +# 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 = + +# If the XML_PROGRAMLISTING tag is set to YES Doxygen will +# dump the program listings (including syntax highlighting +# and cross-referencing information) to the XML output. Note that +# enabling this will significantly increase the size of the XML output. + +XML_PROGRAMLISTING = YES + +#--------------------------------------------------------------------------- +# 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 Perl module output +#--------------------------------------------------------------------------- + +# If the GENERATE_PERLMOD tag is set to YES Doxygen will +# generate a Perl module file that captures the structure of +# the code including all documentation. Note that this +# feature is still experimental and incomplete at the +# moment. + +GENERATE_PERLMOD = NO + +# If the PERLMOD_LATEX tag is set to YES Doxygen will generate +# the necessary Makefile rules, Perl scripts and LaTeX code to be able +# to generate PDF and DVI output from the Perl module output. + +PERLMOD_LATEX = NO + +# If the PERLMOD_PRETTY tag is set to YES the Perl module output will be +# nicely formatted so it can be parsed by a human reader. This is useful +# if you want to understand what is going on. On the other hand, if this +# tag is set to NO the size of the Perl module output will be much smaller +# and Perl will parse it just the same. + +PERLMOD_PRETTY = YES + +# The names of the make variables in the generated doxyrules.make file +# are prefixed with the string contained in PERLMOD_MAKEVAR_PREFIX. +# This is useful so different doxyrules.make files included by the same +# Makefile don't overwrite each other's variables. + +PERLMOD_MAKEVAR_PREFIX = + +#--------------------------------------------------------------------------- +# 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 = YES + +# 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_DEFINED 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. To prevent a macro definition from being +# undefined via #undef or recursively expanded use the := operator +# instead of the = operator. + +PREDEFINED = + +# If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF 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::additions related to external references +#--------------------------------------------------------------------------- + +# The TAGFILES option can be used to specify one or more tagfiles. +# Optionally an initial location of the external documentation +# can be added for each tagfile. The format of a tag file without +# this location is as follows: +# TAGFILES = file1 file2 ... +# Adding location for the tag files is done as follows: +# TAGFILES = file1=loc1 "file2 = loc2" ... +# where "loc1" and "loc2" can be relative or absolute paths or +# URLs. If a location is present for each tag, the installdox tool +# does not have to be run to correct the links. +# Note that each tag file must have a unique name +# (where the name does NOT include the path) +# If a tag file is not located in the directory in which doxygen +# is run, you must also specify the path to the tagfile here. + +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 = $(DOCDIR)/$(PROJECT).tag + +# 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 superseded by the HAVE_DOT option below. This is only a +# fallback. It is recommended to install and use dot, since it yields 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 = $(HAVE_DOT) + +# 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 the GROUP_GRAPHS and HAVE_DOT tags are set to YES then doxygen +# will generate a graph for groups, showing the direct groups dependencies + +GROUP_GRAPHS = YES + +# If the UML_LOOK tag is set to YES doxygen will generate inheritance and +# collaboration diagrams in a style similar to the OMG's Unified Modeling +# Language. + +UML_LOOK = NO + +# If set to YES, the inheritance and collaboration graphs will show the +# relations between templates and their instances. + +TEMPLATE_RELATIONS = NO + +# 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 CALL_GRAPH and HAVE_DOT tags are set to YES then doxygen will +# generate a call dependency graph for every global function or class method. +# Note that enabling this option will significantly increase the time of a run. +# So in most cases it will be better to enable call graphs for selected +# functions only using the \callgraph command. + +CALL_GRAPH = NO + +# If the CALLER_GRAPH and HAVE_DOT tags are set to YES then doxygen will +# generate a caller dependency graph for every global function or class method. +# Note that enabling this option will significantly increase the time of a run. +# So in most cases it will be better to enable caller graphs for selected +# functions only using the \callergraph command. + +CALLER_GRAPH = NO + +# 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 + +# If the DIRECTORY_GRAPH, SHOW_DIRECTORIES and HAVE_DOT tags are set to YES +# then doxygen will show the dependencies a directory has on other directories +# in a graphical way. The dependency relations are determined by the #include +# relations between the files in the directories. + +DIRECTORY_GRAPH = 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 in the path. + +DOT_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 + +# The MAX_DOT_GRAPH_DEPTH tag can be used to set the maximum depth of the +# graphs generated by dot. A depth value of 3 means that only nodes reachable +# from the root by following a path via at most 3 edges will be shown. Nodes +# that lay further from the root node will be omitted. Note that setting this +# option to 1 or 2 may greatly reduce the computation time needed for large +# code bases. Also note that a graph may be further truncated if the graph's +# image dimensions are not sufficient to fit the graph (see MAX_DOT_GRAPH_WIDTH +# and MAX_DOT_GRAPH_HEIGHT). If 0 is used for the depth value (the default), +# the graph is not depth-constrained. + +MAX_DOT_GRAPH_DEPTH = 0 + +# Set the DOT_TRANSPARENT tag to YES to generate images with a transparent +# background. This is disabled by default, which results in a white background. +# Warning: Depending on the platform used, enabling this option may lead to +# badly anti-aliased labels on the edges of a graph (i.e. they become hard to +# read). + +DOT_TRANSPARENT = NO + +# Set the DOT_MULTI_TARGETS tag to YES allow dot to generate multiple output +# files in one run (i.e. multiple -o and -T options on the command line). This +# makes dot run faster, but since only newer versions of dot (>1.8.10) +# support this, this feature is disabled by default. + +DOT_MULTI_TARGETS = NO + +# 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 intermediate dot files that are used to generate +# the various graphs. + +DOT_CLEANUP = YES + +#--------------------------------------------------------------------------- +# Configuration::additions 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 diff --git a/pkg/registry/zookeeper-3.4.6/src/c/compile b/pkg/registry/zookeeper-3.4.6/src/c/compile new file mode 100755 index 000000000..862a14e8c --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/c/compile @@ -0,0 +1,343 @@ +#! /bin/sh +# Wrapper for compilers which do not understand '-c -o'. + +scriptversion=2012-03-05.13; # UTC + +# Copyright (C) 1999, 2000, 2003, 2004, 2005, 2009, 2010, 2012 Free +# Software Foundation, Inc. +# Written by Tom Tromey . +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2, or (at your option) +# any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program that contains a +# configuration script generated by Autoconf, you may include it under +# the same distribution terms that you use for the rest of that program. + +# This file is maintained in Automake, please report +# bugs to or send patches to +# . + +nl=' +' + +# We need space, tab and new line, in precisely that order. Quoting is +# there to prevent tools from complaining about whitespace usage. +IFS=" "" $nl" + +file_conv= + +# func_file_conv build_file lazy +# Convert a $build file to $host form and store it in $file +# Currently only supports Windows hosts. If the determined conversion +# type is listed in (the comma separated) LAZY, no conversion will +# take place. +func_file_conv () +{ + file=$1 + case $file in + / | /[!/]*) # absolute file, and not a UNC file + if test -z "$file_conv"; then + # lazily determine how to convert abs files + case `uname -s` in + MINGW*) + file_conv=mingw + ;; + CYGWIN*) + file_conv=cygwin + ;; + *) + file_conv=wine + ;; + esac + fi + case $file_conv/,$2, in + *,$file_conv,*) + ;; + mingw/*) + file=`cmd //C echo "$file " | sed -e 's/"\(.*\) " *$/\1/'` + ;; + cygwin/*) + file=`cygpath -m "$file" || echo "$file"` + ;; + wine/*) + file=`winepath -w "$file" || echo "$file"` + ;; + esac + ;; + esac +} + +# func_cl_dashL linkdir +# Make cl look for libraries in LINKDIR +func_cl_dashL () +{ + func_file_conv "$1" + if test -z "$lib_path"; then + lib_path=$file + else + lib_path="$lib_path;$file" + fi + linker_opts="$linker_opts -LIBPATH:$file" +} + +# func_cl_dashl library +# Do a library search-path lookup for cl +func_cl_dashl () +{ + lib=$1 + found=no + save_IFS=$IFS + IFS=';' + for dir in $lib_path $LIB + do + IFS=$save_IFS + if $shared && test -f "$dir/$lib.dll.lib"; then + found=yes + lib=$dir/$lib.dll.lib + break + fi + if test -f "$dir/$lib.lib"; then + found=yes + lib=$dir/$lib.lib + break + fi + done + IFS=$save_IFS + + if test "$found" != yes; then + lib=$lib.lib + fi +} + +# func_cl_wrapper cl arg... +# Adjust compile command to suit cl +func_cl_wrapper () +{ + # Assume a capable shell + lib_path= + shared=: + linker_opts= + for arg + do + if test -n "$eat"; then + eat= + else + case $1 in + -o) + # configure might choose to run compile as 'compile cc -o foo foo.c'. + eat=1 + case $2 in + *.o | *.[oO][bB][jJ]) + func_file_conv "$2" + set x "$@" -Fo"$file" + shift + ;; + *) + func_file_conv "$2" + set x "$@" -Fe"$file" + shift + ;; + esac + ;; + -I) + eat=1 + func_file_conv "$2" mingw + set x "$@" -I"$file" + shift + ;; + -I*) + func_file_conv "${1#-I}" mingw + set x "$@" -I"$file" + shift + ;; + -l) + eat=1 + func_cl_dashl "$2" + set x "$@" "$lib" + shift + ;; + -l*) + func_cl_dashl "${1#-l}" + set x "$@" "$lib" + shift + ;; + -L) + eat=1 + func_cl_dashL "$2" + ;; + -L*) + func_cl_dashL "${1#-L}" + ;; + -static) + shared=false + ;; + -Wl,*) + arg=${1#-Wl,} + save_ifs="$IFS"; IFS=',' + for flag in $arg; do + IFS="$save_ifs" + linker_opts="$linker_opts $flag" + done + IFS="$save_ifs" + ;; + -Xlinker) + eat=1 + linker_opts="$linker_opts $2" + ;; + -*) + set x "$@" "$1" + shift + ;; + *.cc | *.CC | *.cxx | *.CXX | *.[cC]++) + func_file_conv "$1" + set x "$@" -Tp"$file" + shift + ;; + *.c | *.cpp | *.CPP | *.lib | *.LIB | *.Lib | *.OBJ | *.obj | *.[oO]) + func_file_conv "$1" mingw + set x "$@" "$file" + shift + ;; + *) + set x "$@" "$1" + shift + ;; + esac + fi + shift + done + if test -n "$linker_opts"; then + linker_opts="-link$linker_opts" + fi + exec "$@" $linker_opts + exit 1 +} + +eat= + +case $1 in + '') + echo "$0: No command. Try '$0 --help' for more information." 1>&2 + exit 1; + ;; + -h | --h*) + cat <<\EOF +Usage: compile [--help] [--version] PROGRAM [ARGS] + +Wrapper for compilers which do not understand '-c -o'. +Remove '-o dest.o' from ARGS, run PROGRAM with the remaining +arguments, and rename the output as expected. + +If you are trying to build a whole package this is not the +right script to run: please start by reading the file 'INSTALL'. + +Report bugs to . +EOF + exit $? + ;; + -v | --v*) + echo "compile $scriptversion" + exit $? + ;; + cl | *[/\\]cl | cl.exe | *[/\\]cl.exe ) + func_cl_wrapper "$@" # Doesn't return... + ;; +esac + +ofile= +cfile= + +for arg +do + if test -n "$eat"; then + eat= + else + case $1 in + -o) + # configure might choose to run compile as 'compile cc -o foo foo.c'. + # So we strip '-o arg' only if arg is an object. + eat=1 + case $2 in + *.o | *.obj) + ofile=$2 + ;; + *) + set x "$@" -o "$2" + shift + ;; + esac + ;; + *.c) + cfile=$1 + set x "$@" "$1" + shift + ;; + *) + set x "$@" "$1" + shift + ;; + esac + fi + shift +done + +if test -z "$ofile" || test -z "$cfile"; then + # If no '-o' option was seen then we might have been invoked from a + # pattern rule where we don't need one. That is ok -- this is a + # normal compilation that the losing compiler can handle. If no + # '.c' file was seen then we are probably linking. That is also + # ok. + exec "$@" +fi + +# Name of file we expect compiler to create. +cofile=`echo "$cfile" | sed 's|^.*[\\/]||; s|^[a-zA-Z]:||; s/\.c$/.o/'` + +# Create the lock directory. +# Note: use '[/\\:.-]' here to ensure that we don't use the same name +# that we are using for the .o file. Also, base the name on the expected +# object file name, since that is what matters with a parallel build. +lockdir=`echo "$cofile" | sed -e 's|[/\\:.-]|_|g'`.d +while true; do + if mkdir "$lockdir" >/dev/null 2>&1; then + break + fi + sleep 1 +done +# FIXME: race condition here if user kills between mkdir and trap. +trap "rmdir '$lockdir'; exit 1" 1 2 15 + +# Run the compile. +"$@" +ret=$? + +if test -f "$cofile"; then + test "$cofile" = "$ofile" || mv "$cofile" "$ofile" +elif test -f "${cofile}bj"; then + test "${cofile}bj" = "$ofile" || mv "${cofile}bj" "$ofile" +fi + +rmdir "$lockdir" +exit $ret + +# Local Variables: +# mode: shell-script +# sh-indentation: 2 +# eval: (add-hook 'write-file-hooks 'time-stamp) +# time-stamp-start: "scriptversion=" +# time-stamp-format: "%:y-%02m-%02d.%02H" +# time-stamp-time-zone: "UTC" +# time-stamp-end: "; # UTC" +# End: diff --git a/pkg/registry/zookeeper-3.4.6/src/c/config.guess b/pkg/registry/zookeeper-3.4.6/src/c/config.guess new file mode 100755 index 000000000..d622a44e5 --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/c/config.guess @@ -0,0 +1,1530 @@ +#! /bin/sh +# Attempt to guess a canonical system name. +# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, +# 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, +# 2011, 2012 Free Software Foundation, Inc. + +timestamp='2012-02-10' + +# This file is free software; you can redistribute it and/or modify it +# under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, see . +# +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program that contains a +# configuration script generated by Autoconf, you may include it under +# the same distribution terms that you use for the rest of that program. + + +# Originally written by Per Bothner. Please send patches (context +# diff format) to and include a ChangeLog +# entry. +# +# This script attempts to guess a canonical system name similar to +# config.sub. If it succeeds, it prints the system name on stdout, and +# exits with 0. Otherwise, it exits with 1. +# +# You can get the latest version of this script from: +# http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess;hb=HEAD + +me=`echo "$0" | sed -e 's,.*/,,'` + +usage="\ +Usage: $0 [OPTION] + +Output the configuration name of the system \`$me' is run on. + +Operation modes: + -h, --help print this help, then exit + -t, --time-stamp print date of last modification, then exit + -v, --version print version number, then exit + +Report bugs and patches to ." + +version="\ +GNU config.guess ($timestamp) + +Originally written by Per Bothner. +Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, +2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012 +Free Software Foundation, Inc. + +This is free software; see the source for copying conditions. There is NO +warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." + +help=" +Try \`$me --help' for more information." + +# Parse command line +while test $# -gt 0 ; do + case $1 in + --time-stamp | --time* | -t ) + echo "$timestamp" ; exit ;; + --version | -v ) + echo "$version" ; exit ;; + --help | --h* | -h ) + echo "$usage"; exit ;; + -- ) # Stop option processing + shift; break ;; + - ) # Use stdin as input. + break ;; + -* ) + echo "$me: invalid option $1$help" >&2 + exit 1 ;; + * ) + break ;; + esac +done + +if test $# != 0; then + echo "$me: too many arguments$help" >&2 + exit 1 +fi + +trap 'exit 1' 1 2 15 + +# CC_FOR_BUILD -- compiler used by this script. Note that the use of a +# compiler to aid in system detection is discouraged as it requires +# temporary files to be created and, as you can see below, it is a +# headache to deal with in a portable fashion. + +# Historically, `CC_FOR_BUILD' used to be named `HOST_CC'. We still +# use `HOST_CC' if defined, but it is deprecated. + +# Portable tmp directory creation inspired by the Autoconf team. + +set_cc_for_build=' +trap "exitcode=\$?; (rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null) && exit \$exitcode" 0 ; +trap "rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null; exit 1" 1 2 13 15 ; +: ${TMPDIR=/tmp} ; + { tmp=`(umask 077 && mktemp -d "$TMPDIR/cgXXXXXX") 2>/dev/null` && test -n "$tmp" && test -d "$tmp" ; } || + { test -n "$RANDOM" && tmp=$TMPDIR/cg$$-$RANDOM && (umask 077 && mkdir $tmp) ; } || + { tmp=$TMPDIR/cg-$$ && (umask 077 && mkdir $tmp) && echo "Warning: creating insecure temp directory" >&2 ; } || + { echo "$me: cannot create a temporary directory in $TMPDIR" >&2 ; exit 1 ; } ; +dummy=$tmp/dummy ; +tmpfiles="$dummy.c $dummy.o $dummy.rel $dummy" ; +case $CC_FOR_BUILD,$HOST_CC,$CC in + ,,) echo "int x;" > $dummy.c ; + for c in cc gcc c89 c99 ; do + if ($c -c -o $dummy.o $dummy.c) >/dev/null 2>&1 ; then + CC_FOR_BUILD="$c"; break ; + fi ; + done ; + if test x"$CC_FOR_BUILD" = x ; then + CC_FOR_BUILD=no_compiler_found ; + fi + ;; + ,,*) CC_FOR_BUILD=$CC ;; + ,*,*) CC_FOR_BUILD=$HOST_CC ;; +esac ; set_cc_for_build= ;' + +# This is needed to find uname on a Pyramid OSx when run in the BSD universe. +# (ghazi@noc.rutgers.edu 1994-08-24) +if (test -f /.attbin/uname) >/dev/null 2>&1 ; then + PATH=$PATH:/.attbin ; export PATH +fi + +UNAME_MACHINE=`(uname -m) 2>/dev/null` || UNAME_MACHINE=unknown +UNAME_RELEASE=`(uname -r) 2>/dev/null` || UNAME_RELEASE=unknown +UNAME_SYSTEM=`(uname -s) 2>/dev/null` || UNAME_SYSTEM=unknown +UNAME_VERSION=`(uname -v) 2>/dev/null` || UNAME_VERSION=unknown + +# Note: order is significant - the case branches are not exclusive. + +case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in + *:NetBSD:*:*) + # NetBSD (nbsd) targets should (where applicable) match one or + # more of the tuples: *-*-netbsdelf*, *-*-netbsdaout*, + # *-*-netbsdecoff* and *-*-netbsd*. For targets that recently + # switched to ELF, *-*-netbsd* would select the old + # object file format. This provides both forward + # compatibility and a consistent mechanism for selecting the + # object file format. + # + # Note: NetBSD doesn't particularly care about the vendor + # portion of the name. We always set it to "unknown". + sysctl="sysctl -n hw.machine_arch" + UNAME_MACHINE_ARCH=`(/sbin/$sysctl 2>/dev/null || \ + /usr/sbin/$sysctl 2>/dev/null || echo unknown)` + case "${UNAME_MACHINE_ARCH}" in + armeb) machine=armeb-unknown ;; + arm*) machine=arm-unknown ;; + sh3el) machine=shl-unknown ;; + sh3eb) machine=sh-unknown ;; + sh5el) machine=sh5le-unknown ;; + *) machine=${UNAME_MACHINE_ARCH}-unknown ;; + esac + # The Operating System including object format, if it has switched + # to ELF recently, or will in the future. + case "${UNAME_MACHINE_ARCH}" in + arm*|i386|m68k|ns32k|sh3*|sparc|vax) + eval $set_cc_for_build + if echo __ELF__ | $CC_FOR_BUILD -E - 2>/dev/null \ + | grep -q __ELF__ + then + # Once all utilities can be ECOFF (netbsdecoff) or a.out (netbsdaout). + # Return netbsd for either. FIX? + os=netbsd + else + os=netbsdelf + fi + ;; + *) + os=netbsd + ;; + esac + # The OS release + # Debian GNU/NetBSD machines have a different userland, and + # thus, need a distinct triplet. However, they do not need + # kernel version information, so it can be replaced with a + # suitable tag, in the style of linux-gnu. + case "${UNAME_VERSION}" in + Debian*) + release='-gnu' + ;; + *) + release=`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'` + ;; + esac + # Since CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM: + # contains redundant information, the shorter form: + # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM is used. + echo "${machine}-${os}${release}" + exit ;; + *:OpenBSD:*:*) + UNAME_MACHINE_ARCH=`arch | sed 's/OpenBSD.//'` + echo ${UNAME_MACHINE_ARCH}-unknown-openbsd${UNAME_RELEASE} + exit ;; + *:ekkoBSD:*:*) + echo ${UNAME_MACHINE}-unknown-ekkobsd${UNAME_RELEASE} + exit ;; + *:SolidBSD:*:*) + echo ${UNAME_MACHINE}-unknown-solidbsd${UNAME_RELEASE} + exit ;; + macppc:MirBSD:*:*) + echo powerpc-unknown-mirbsd${UNAME_RELEASE} + exit ;; + *:MirBSD:*:*) + echo ${UNAME_MACHINE}-unknown-mirbsd${UNAME_RELEASE} + exit ;; + alpha:OSF1:*:*) + case $UNAME_RELEASE in + *4.0) + UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $3}'` + ;; + *5.*) + UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $4}'` + ;; + esac + # According to Compaq, /usr/sbin/psrinfo has been available on + # OSF/1 and Tru64 systems produced since 1995. I hope that + # covers most systems running today. This code pipes the CPU + # types through head -n 1, so we only detect the type of CPU 0. + ALPHA_CPU_TYPE=`/usr/sbin/psrinfo -v | sed -n -e 's/^ The alpha \(.*\) processor.*$/\1/p' | head -n 1` + case "$ALPHA_CPU_TYPE" in + "EV4 (21064)") + UNAME_MACHINE="alpha" ;; + "EV4.5 (21064)") + UNAME_MACHINE="alpha" ;; + "LCA4 (21066/21068)") + UNAME_MACHINE="alpha" ;; + "EV5 (21164)") + UNAME_MACHINE="alphaev5" ;; + "EV5.6 (21164A)") + UNAME_MACHINE="alphaev56" ;; + "EV5.6 (21164PC)") + UNAME_MACHINE="alphapca56" ;; + "EV5.7 (21164PC)") + UNAME_MACHINE="alphapca57" ;; + "EV6 (21264)") + UNAME_MACHINE="alphaev6" ;; + "EV6.7 (21264A)") + UNAME_MACHINE="alphaev67" ;; + "EV6.8CB (21264C)") + UNAME_MACHINE="alphaev68" ;; + "EV6.8AL (21264B)") + UNAME_MACHINE="alphaev68" ;; + "EV6.8CX (21264D)") + UNAME_MACHINE="alphaev68" ;; + "EV6.9A (21264/EV69A)") + UNAME_MACHINE="alphaev69" ;; + "EV7 (21364)") + UNAME_MACHINE="alphaev7" ;; + "EV7.9 (21364A)") + UNAME_MACHINE="alphaev79" ;; + esac + # A Pn.n version is a patched version. + # A Vn.n version is a released version. + # A Tn.n version is a released field test version. + # A Xn.n version is an unreleased experimental baselevel. + # 1.2 uses "1.2" for uname -r. + echo ${UNAME_MACHINE}-dec-osf`echo ${UNAME_RELEASE} | sed -e 's/^[PVTX]//' | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` + # Reset EXIT trap before exiting to avoid spurious non-zero exit code. + exitcode=$? + trap '' 0 + exit $exitcode ;; + Alpha\ *:Windows_NT*:*) + # How do we know it's Interix rather than the generic POSIX subsystem? + # Should we change UNAME_MACHINE based on the output of uname instead + # of the specific Alpha model? + echo alpha-pc-interix + exit ;; + 21064:Windows_NT:50:3) + echo alpha-dec-winnt3.5 + exit ;; + Amiga*:UNIX_System_V:4.0:*) + echo m68k-unknown-sysv4 + exit ;; + *:[Aa]miga[Oo][Ss]:*:*) + echo ${UNAME_MACHINE}-unknown-amigaos + exit ;; + *:[Mm]orph[Oo][Ss]:*:*) + echo ${UNAME_MACHINE}-unknown-morphos + exit ;; + *:OS/390:*:*) + echo i370-ibm-openedition + exit ;; + *:z/VM:*:*) + echo s390-ibm-zvmoe + exit ;; + *:OS400:*:*) + echo powerpc-ibm-os400 + exit ;; + arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*) + echo arm-acorn-riscix${UNAME_RELEASE} + exit ;; + arm:riscos:*:*|arm:RISCOS:*:*) + echo arm-unknown-riscos + exit ;; + SR2?01:HI-UX/MPP:*:* | SR8000:HI-UX/MPP:*:*) + echo hppa1.1-hitachi-hiuxmpp + exit ;; + Pyramid*:OSx*:*:* | MIS*:OSx*:*:* | MIS*:SMP_DC-OSx*:*:*) + # akee@wpdis03.wpafb.af.mil (Earle F. Ake) contributed MIS and NILE. + if test "`(/bin/universe) 2>/dev/null`" = att ; then + echo pyramid-pyramid-sysv3 + else + echo pyramid-pyramid-bsd + fi + exit ;; + NILE*:*:*:dcosx) + echo pyramid-pyramid-svr4 + exit ;; + DRS?6000:unix:4.0:6*) + echo sparc-icl-nx6 + exit ;; + DRS?6000:UNIX_SV:4.2*:7* | DRS?6000:isis:4.2*:7*) + case `/usr/bin/uname -p` in + sparc) echo sparc-icl-nx7; exit ;; + esac ;; + s390x:SunOS:*:*) + echo ${UNAME_MACHINE}-ibm-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` + exit ;; + sun4H:SunOS:5.*:*) + echo sparc-hal-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` + exit ;; + sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*) + echo sparc-sun-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` + exit ;; + i86pc:AuroraUX:5.*:* | i86xen:AuroraUX:5.*:*) + echo i386-pc-auroraux${UNAME_RELEASE} + exit ;; + i86pc:SunOS:5.*:* | i86xen:SunOS:5.*:*) + eval $set_cc_for_build + SUN_ARCH="i386" + # If there is a compiler, see if it is configured for 64-bit objects. + # Note that the Sun cc does not turn __LP64__ into 1 like gcc does. + # This test works for both compilers. + if [ "$CC_FOR_BUILD" != 'no_compiler_found' ]; then + if (echo '#ifdef __amd64'; echo IS_64BIT_ARCH; echo '#endif') | \ + (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | \ + grep IS_64BIT_ARCH >/dev/null + then + SUN_ARCH="x86_64" + fi + fi + echo ${SUN_ARCH}-pc-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` + exit ;; + sun4*:SunOS:6*:*) + # According to config.sub, this is the proper way to canonicalize + # SunOS6. Hard to guess exactly what SunOS6 will be like, but + # it's likely to be more like Solaris than SunOS4. + echo sparc-sun-solaris3`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` + exit ;; + sun4*:SunOS:*:*) + case "`/usr/bin/arch -k`" in + Series*|S4*) + UNAME_RELEASE=`uname -v` + ;; + esac + # Japanese Language versions have a version number like `4.1.3-JL'. + echo sparc-sun-sunos`echo ${UNAME_RELEASE}|sed -e 's/-/_/'` + exit ;; + sun3*:SunOS:*:*) + echo m68k-sun-sunos${UNAME_RELEASE} + exit ;; + sun*:*:4.2BSD:*) + UNAME_RELEASE=`(sed 1q /etc/motd | awk '{print substr($5,1,3)}') 2>/dev/null` + test "x${UNAME_RELEASE}" = "x" && UNAME_RELEASE=3 + case "`/bin/arch`" in + sun3) + echo m68k-sun-sunos${UNAME_RELEASE} + ;; + sun4) + echo sparc-sun-sunos${UNAME_RELEASE} + ;; + esac + exit ;; + aushp:SunOS:*:*) + echo sparc-auspex-sunos${UNAME_RELEASE} + exit ;; + # The situation for MiNT is a little confusing. The machine name + # can be virtually everything (everything which is not + # "atarist" or "atariste" at least should have a processor + # > m68000). The system name ranges from "MiNT" over "FreeMiNT" + # to the lowercase version "mint" (or "freemint"). Finally + # the system name "TOS" denotes a system which is actually not + # MiNT. But MiNT is downward compatible to TOS, so this should + # be no problem. + atarist[e]:*MiNT:*:* | atarist[e]:*mint:*:* | atarist[e]:*TOS:*:*) + echo m68k-atari-mint${UNAME_RELEASE} + exit ;; + atari*:*MiNT:*:* | atari*:*mint:*:* | atarist[e]:*TOS:*:*) + echo m68k-atari-mint${UNAME_RELEASE} + exit ;; + *falcon*:*MiNT:*:* | *falcon*:*mint:*:* | *falcon*:*TOS:*:*) + echo m68k-atari-mint${UNAME_RELEASE} + exit ;; + milan*:*MiNT:*:* | milan*:*mint:*:* | *milan*:*TOS:*:*) + echo m68k-milan-mint${UNAME_RELEASE} + exit ;; + hades*:*MiNT:*:* | hades*:*mint:*:* | *hades*:*TOS:*:*) + echo m68k-hades-mint${UNAME_RELEASE} + exit ;; + *:*MiNT:*:* | *:*mint:*:* | *:*TOS:*:*) + echo m68k-unknown-mint${UNAME_RELEASE} + exit ;; + m68k:machten:*:*) + echo m68k-apple-machten${UNAME_RELEASE} + exit ;; + powerpc:machten:*:*) + echo powerpc-apple-machten${UNAME_RELEASE} + exit ;; + RISC*:Mach:*:*) + echo mips-dec-mach_bsd4.3 + exit ;; + RISC*:ULTRIX:*:*) + echo mips-dec-ultrix${UNAME_RELEASE} + exit ;; + VAX*:ULTRIX*:*:*) + echo vax-dec-ultrix${UNAME_RELEASE} + exit ;; + 2020:CLIX:*:* | 2430:CLIX:*:*) + echo clipper-intergraph-clix${UNAME_RELEASE} + exit ;; + mips:*:*:UMIPS | mips:*:*:RISCos) + eval $set_cc_for_build + sed 's/^ //' << EOF >$dummy.c +#ifdef __cplusplus +#include /* for printf() prototype */ + int main (int argc, char *argv[]) { +#else + int main (argc, argv) int argc; char *argv[]; { +#endif + #if defined (host_mips) && defined (MIPSEB) + #if defined (SYSTYPE_SYSV) + printf ("mips-mips-riscos%ssysv\n", argv[1]); exit (0); + #endif + #if defined (SYSTYPE_SVR4) + printf ("mips-mips-riscos%ssvr4\n", argv[1]); exit (0); + #endif + #if defined (SYSTYPE_BSD43) || defined(SYSTYPE_BSD) + printf ("mips-mips-riscos%sbsd\n", argv[1]); exit (0); + #endif + #endif + exit (-1); + } +EOF + $CC_FOR_BUILD -o $dummy $dummy.c && + dummyarg=`echo "${UNAME_RELEASE}" | sed -n 's/\([0-9]*\).*/\1/p'` && + SYSTEM_NAME=`$dummy $dummyarg` && + { echo "$SYSTEM_NAME"; exit; } + echo mips-mips-riscos${UNAME_RELEASE} + exit ;; + Motorola:PowerMAX_OS:*:*) + echo powerpc-motorola-powermax + exit ;; + Motorola:*:4.3:PL8-*) + echo powerpc-harris-powermax + exit ;; + Night_Hawk:*:*:PowerMAX_OS | Synergy:PowerMAX_OS:*:*) + echo powerpc-harris-powermax + exit ;; + Night_Hawk:Power_UNIX:*:*) + echo powerpc-harris-powerunix + exit ;; + m88k:CX/UX:7*:*) + echo m88k-harris-cxux7 + exit ;; + m88k:*:4*:R4*) + echo m88k-motorola-sysv4 + exit ;; + m88k:*:3*:R3*) + echo m88k-motorola-sysv3 + exit ;; + AViiON:dgux:*:*) + # DG/UX returns AViiON for all architectures + UNAME_PROCESSOR=`/usr/bin/uname -p` + if [ $UNAME_PROCESSOR = mc88100 ] || [ $UNAME_PROCESSOR = mc88110 ] + then + if [ ${TARGET_BINARY_INTERFACE}x = m88kdguxelfx ] || \ + [ ${TARGET_BINARY_INTERFACE}x = x ] + then + echo m88k-dg-dgux${UNAME_RELEASE} + else + echo m88k-dg-dguxbcs${UNAME_RELEASE} + fi + else + echo i586-dg-dgux${UNAME_RELEASE} + fi + exit ;; + M88*:DolphinOS:*:*) # DolphinOS (SVR3) + echo m88k-dolphin-sysv3 + exit ;; + M88*:*:R3*:*) + # Delta 88k system running SVR3 + echo m88k-motorola-sysv3 + exit ;; + XD88*:*:*:*) # Tektronix XD88 system running UTekV (SVR3) + echo m88k-tektronix-sysv3 + exit ;; + Tek43[0-9][0-9]:UTek:*:*) # Tektronix 4300 system running UTek (BSD) + echo m68k-tektronix-bsd + exit ;; + *:IRIX*:*:*) + echo mips-sgi-irix`echo ${UNAME_RELEASE}|sed -e 's/-/_/g'` + exit ;; + ????????:AIX?:[12].1:2) # AIX 2.2.1 or AIX 2.1.1 is RT/PC AIX. + echo romp-ibm-aix # uname -m gives an 8 hex-code CPU id + exit ;; # Note that: echo "'`uname -s`'" gives 'AIX ' + i*86:AIX:*:*) + echo i386-ibm-aix + exit ;; + ia64:AIX:*:*) + if [ -x /usr/bin/oslevel ] ; then + IBM_REV=`/usr/bin/oslevel` + else + IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE} + fi + echo ${UNAME_MACHINE}-ibm-aix${IBM_REV} + exit ;; + *:AIX:2:3) + if grep bos325 /usr/include/stdio.h >/dev/null 2>&1; then + eval $set_cc_for_build + sed 's/^ //' << EOF >$dummy.c + #include + + main() + { + if (!__power_pc()) + exit(1); + puts("powerpc-ibm-aix3.2.5"); + exit(0); + } +EOF + if $CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy` + then + echo "$SYSTEM_NAME" + else + echo rs6000-ibm-aix3.2.5 + fi + elif grep bos324 /usr/include/stdio.h >/dev/null 2>&1; then + echo rs6000-ibm-aix3.2.4 + else + echo rs6000-ibm-aix3.2 + fi + exit ;; + *:AIX:*:[4567]) + IBM_CPU_ID=`/usr/sbin/lsdev -C -c processor -S available | sed 1q | awk '{ print $1 }'` + if /usr/sbin/lsattr -El ${IBM_CPU_ID} | grep ' POWER' >/dev/null 2>&1; then + IBM_ARCH=rs6000 + else + IBM_ARCH=powerpc + fi + if [ -x /usr/bin/oslevel ] ; then + IBM_REV=`/usr/bin/oslevel` + else + IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE} + fi + echo ${IBM_ARCH}-ibm-aix${IBM_REV} + exit ;; + *:AIX:*:*) + echo rs6000-ibm-aix + exit ;; + ibmrt:4.4BSD:*|romp-ibm:BSD:*) + echo romp-ibm-bsd4.4 + exit ;; + ibmrt:*BSD:*|romp-ibm:BSD:*) # covers RT/PC BSD and + echo romp-ibm-bsd${UNAME_RELEASE} # 4.3 with uname added to + exit ;; # report: romp-ibm BSD 4.3 + *:BOSX:*:*) + echo rs6000-bull-bosx + exit ;; + DPX/2?00:B.O.S.:*:*) + echo m68k-bull-sysv3 + exit ;; + 9000/[34]??:4.3bsd:1.*:*) + echo m68k-hp-bsd + exit ;; + hp300:4.4BSD:*:* | 9000/[34]??:4.3bsd:2.*:*) + echo m68k-hp-bsd4.4 + exit ;; + 9000/[34678]??:HP-UX:*:*) + HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'` + case "${UNAME_MACHINE}" in + 9000/31? ) HP_ARCH=m68000 ;; + 9000/[34]?? ) HP_ARCH=m68k ;; + 9000/[678][0-9][0-9]) + if [ -x /usr/bin/getconf ]; then + sc_cpu_version=`/usr/bin/getconf SC_CPU_VERSION 2>/dev/null` + sc_kernel_bits=`/usr/bin/getconf SC_KERNEL_BITS 2>/dev/null` + case "${sc_cpu_version}" in + 523) HP_ARCH="hppa1.0" ;; # CPU_PA_RISC1_0 + 528) HP_ARCH="hppa1.1" ;; # CPU_PA_RISC1_1 + 532) # CPU_PA_RISC2_0 + case "${sc_kernel_bits}" in + 32) HP_ARCH="hppa2.0n" ;; + 64) HP_ARCH="hppa2.0w" ;; + '') HP_ARCH="hppa2.0" ;; # HP-UX 10.20 + esac ;; + esac + fi + if [ "${HP_ARCH}" = "" ]; then + eval $set_cc_for_build + sed 's/^ //' << EOF >$dummy.c + + #define _HPUX_SOURCE + #include + #include + + int main () + { + #if defined(_SC_KERNEL_BITS) + long bits = sysconf(_SC_KERNEL_BITS); + #endif + long cpu = sysconf (_SC_CPU_VERSION); + + switch (cpu) + { + case CPU_PA_RISC1_0: puts ("hppa1.0"); break; + case CPU_PA_RISC1_1: puts ("hppa1.1"); break; + case CPU_PA_RISC2_0: + #if defined(_SC_KERNEL_BITS) + switch (bits) + { + case 64: puts ("hppa2.0w"); break; + case 32: puts ("hppa2.0n"); break; + default: puts ("hppa2.0"); break; + } break; + #else /* !defined(_SC_KERNEL_BITS) */ + puts ("hppa2.0"); break; + #endif + default: puts ("hppa1.0"); break; + } + exit (0); + } +EOF + (CCOPTS= $CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null) && HP_ARCH=`$dummy` + test -z "$HP_ARCH" && HP_ARCH=hppa + fi ;; + esac + if [ ${HP_ARCH} = "hppa2.0w" ] + then + eval $set_cc_for_build + + # hppa2.0w-hp-hpux* has a 64-bit kernel and a compiler generating + # 32-bit code. hppa64-hp-hpux* has the same kernel and a compiler + # generating 64-bit code. GNU and HP use different nomenclature: + # + # $ CC_FOR_BUILD=cc ./config.guess + # => hppa2.0w-hp-hpux11.23 + # $ CC_FOR_BUILD="cc +DA2.0w" ./config.guess + # => hppa64-hp-hpux11.23 + + if echo __LP64__ | (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | + grep -q __LP64__ + then + HP_ARCH="hppa2.0w" + else + HP_ARCH="hppa64" + fi + fi + echo ${HP_ARCH}-hp-hpux${HPUX_REV} + exit ;; + ia64:HP-UX:*:*) + HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'` + echo ia64-hp-hpux${HPUX_REV} + exit ;; + 3050*:HI-UX:*:*) + eval $set_cc_for_build + sed 's/^ //' << EOF >$dummy.c + #include + int + main () + { + long cpu = sysconf (_SC_CPU_VERSION); + /* The order matters, because CPU_IS_HP_MC68K erroneously returns + true for CPU_PA_RISC1_0. CPU_IS_PA_RISC returns correct + results, however. */ + if (CPU_IS_PA_RISC (cpu)) + { + switch (cpu) + { + case CPU_PA_RISC1_0: puts ("hppa1.0-hitachi-hiuxwe2"); break; + case CPU_PA_RISC1_1: puts ("hppa1.1-hitachi-hiuxwe2"); break; + case CPU_PA_RISC2_0: puts ("hppa2.0-hitachi-hiuxwe2"); break; + default: puts ("hppa-hitachi-hiuxwe2"); break; + } + } + else if (CPU_IS_HP_MC68K (cpu)) + puts ("m68k-hitachi-hiuxwe2"); + else puts ("unknown-hitachi-hiuxwe2"); + exit (0); + } +EOF + $CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy` && + { echo "$SYSTEM_NAME"; exit; } + echo unknown-hitachi-hiuxwe2 + exit ;; + 9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:* ) + echo hppa1.1-hp-bsd + exit ;; + 9000/8??:4.3bsd:*:*) + echo hppa1.0-hp-bsd + exit ;; + *9??*:MPE/iX:*:* | *3000*:MPE/iX:*:*) + echo hppa1.0-hp-mpeix + exit ;; + hp7??:OSF1:*:* | hp8?[79]:OSF1:*:* ) + echo hppa1.1-hp-osf + exit ;; + hp8??:OSF1:*:*) + echo hppa1.0-hp-osf + exit ;; + i*86:OSF1:*:*) + if [ -x /usr/sbin/sysversion ] ; then + echo ${UNAME_MACHINE}-unknown-osf1mk + else + echo ${UNAME_MACHINE}-unknown-osf1 + fi + exit ;; + parisc*:Lites*:*:*) + echo hppa1.1-hp-lites + exit ;; + C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*) + echo c1-convex-bsd + exit ;; + C2*:ConvexOS:*:* | convex:ConvexOS:C2*:*) + if getsysinfo -f scalar_acc + then echo c32-convex-bsd + else echo c2-convex-bsd + fi + exit ;; + C34*:ConvexOS:*:* | convex:ConvexOS:C34*:*) + echo c34-convex-bsd + exit ;; + C38*:ConvexOS:*:* | convex:ConvexOS:C38*:*) + echo c38-convex-bsd + exit ;; + C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*) + echo c4-convex-bsd + exit ;; + CRAY*Y-MP:*:*:*) + echo ymp-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' + exit ;; + CRAY*[A-Z]90:*:*:*) + echo ${UNAME_MACHINE}-cray-unicos${UNAME_RELEASE} \ + | sed -e 's/CRAY.*\([A-Z]90\)/\1/' \ + -e y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/ \ + -e 's/\.[^.]*$/.X/' + exit ;; + CRAY*TS:*:*:*) + echo t90-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' + exit ;; + CRAY*T3E:*:*:*) + echo alphaev5-cray-unicosmk${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' + exit ;; + CRAY*SV1:*:*:*) + echo sv1-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' + exit ;; + *:UNICOS/mp:*:*) + echo craynv-cray-unicosmp${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' + exit ;; + F30[01]:UNIX_System_V:*:* | F700:UNIX_System_V:*:*) + FUJITSU_PROC=`uname -m | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` + FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'` + FUJITSU_REL=`echo ${UNAME_RELEASE} | sed -e 's/ /_/'` + echo "${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" + exit ;; + 5000:UNIX_System_V:4.*:*) + FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'` + FUJITSU_REL=`echo ${UNAME_RELEASE} | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/ /_/'` + echo "sparc-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" + exit ;; + i*86:BSD/386:*:* | i*86:BSD/OS:*:* | *:Ascend\ Embedded/OS:*:*) + echo ${UNAME_MACHINE}-pc-bsdi${UNAME_RELEASE} + exit ;; + sparc*:BSD/OS:*:*) + echo sparc-unknown-bsdi${UNAME_RELEASE} + exit ;; + *:BSD/OS:*:*) + echo ${UNAME_MACHINE}-unknown-bsdi${UNAME_RELEASE} + exit ;; + *:FreeBSD:*:*) + UNAME_PROCESSOR=`/usr/bin/uname -p` + case ${UNAME_PROCESSOR} in + amd64) + echo x86_64-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;; + *) + echo ${UNAME_PROCESSOR}-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;; + esac + exit ;; + i*:CYGWIN*:*) + echo ${UNAME_MACHINE}-pc-cygwin + exit ;; + *:MINGW*:*) + echo ${UNAME_MACHINE}-pc-mingw32 + exit ;; + i*:MSYS*:*) + echo ${UNAME_MACHINE}-pc-msys + exit ;; + i*:windows32*:*) + # uname -m includes "-pc" on this system. + echo ${UNAME_MACHINE}-mingw32 + exit ;; + i*:PW*:*) + echo ${UNAME_MACHINE}-pc-pw32 + exit ;; + *:Interix*:*) + case ${UNAME_MACHINE} in + x86) + echo i586-pc-interix${UNAME_RELEASE} + exit ;; + authenticamd | genuineintel | EM64T) + echo x86_64-unknown-interix${UNAME_RELEASE} + exit ;; + IA64) + echo ia64-unknown-interix${UNAME_RELEASE} + exit ;; + esac ;; + [345]86:Windows_95:* | [345]86:Windows_98:* | [345]86:Windows_NT:*) + echo i${UNAME_MACHINE}-pc-mks + exit ;; + 8664:Windows_NT:*) + echo x86_64-pc-mks + exit ;; + i*:Windows_NT*:* | Pentium*:Windows_NT*:*) + # How do we know it's Interix rather than the generic POSIX subsystem? + # It also conflicts with pre-2.0 versions of AT&T UWIN. Should we + # UNAME_MACHINE based on the output of uname instead of i386? + echo i586-pc-interix + exit ;; + i*:UWIN*:*) + echo ${UNAME_MACHINE}-pc-uwin + exit ;; + amd64:CYGWIN*:*:* | x86_64:CYGWIN*:*:*) + echo x86_64-unknown-cygwin + exit ;; + p*:CYGWIN*:*) + echo powerpcle-unknown-cygwin + exit ;; + prep*:SunOS:5.*:*) + echo powerpcle-unknown-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` + exit ;; + *:GNU:*:*) + # the GNU system + echo `echo ${UNAME_MACHINE}|sed -e 's,[-/].*$,,'`-unknown-gnu`echo ${UNAME_RELEASE}|sed -e 's,/.*$,,'` + exit ;; + *:GNU/*:*:*) + # other systems with GNU libc and userland + echo ${UNAME_MACHINE}-unknown-`echo ${UNAME_SYSTEM} | sed 's,^[^/]*/,,' | tr '[A-Z]' '[a-z]'``echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`-gnu + exit ;; + i*86:Minix:*:*) + echo ${UNAME_MACHINE}-pc-minix + exit ;; + aarch64:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-gnu + exit ;; + aarch64_be:Linux:*:*) + UNAME_MACHINE=aarch64_be + echo ${UNAME_MACHINE}-unknown-linux-gnu + exit ;; + alpha:Linux:*:*) + case `sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' < /proc/cpuinfo` in + EV5) UNAME_MACHINE=alphaev5 ;; + EV56) UNAME_MACHINE=alphaev56 ;; + PCA56) UNAME_MACHINE=alphapca56 ;; + PCA57) UNAME_MACHINE=alphapca56 ;; + EV6) UNAME_MACHINE=alphaev6 ;; + EV67) UNAME_MACHINE=alphaev67 ;; + EV68*) UNAME_MACHINE=alphaev68 ;; + esac + objdump --private-headers /bin/sh | grep -q ld.so.1 + if test "$?" = 0 ; then LIBC="libc1" ; else LIBC="" ; fi + echo ${UNAME_MACHINE}-unknown-linux-gnu${LIBC} + exit ;; + arm*:Linux:*:*) + eval $set_cc_for_build + if echo __ARM_EABI__ | $CC_FOR_BUILD -E - 2>/dev/null \ + | grep -q __ARM_EABI__ + then + echo ${UNAME_MACHINE}-unknown-linux-gnu + else + if echo __ARM_PCS_VFP | $CC_FOR_BUILD -E - 2>/dev/null \ + | grep -q __ARM_PCS_VFP + then + echo ${UNAME_MACHINE}-unknown-linux-gnueabi + else + echo ${UNAME_MACHINE}-unknown-linux-gnueabihf + fi + fi + exit ;; + avr32*:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-gnu + exit ;; + cris:Linux:*:*) + echo ${UNAME_MACHINE}-axis-linux-gnu + exit ;; + crisv32:Linux:*:*) + echo ${UNAME_MACHINE}-axis-linux-gnu + exit ;; + frv:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-gnu + exit ;; + hexagon:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-gnu + exit ;; + i*86:Linux:*:*) + LIBC=gnu + eval $set_cc_for_build + sed 's/^ //' << EOF >$dummy.c + #ifdef __dietlibc__ + LIBC=dietlibc + #endif +EOF + eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^LIBC'` + echo "${UNAME_MACHINE}-pc-linux-${LIBC}" + exit ;; + ia64:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-gnu + exit ;; + m32r*:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-gnu + exit ;; + m68*:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-gnu + exit ;; + mips:Linux:*:* | mips64:Linux:*:*) + eval $set_cc_for_build + sed 's/^ //' << EOF >$dummy.c + #undef CPU + #undef ${UNAME_MACHINE} + #undef ${UNAME_MACHINE}el + #if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL) + CPU=${UNAME_MACHINE}el + #else + #if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB) + CPU=${UNAME_MACHINE} + #else + CPU= + #endif + #endif +EOF + eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^CPU'` + test x"${CPU}" != x && { echo "${CPU}-unknown-linux-gnu"; exit; } + ;; + or32:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-gnu + exit ;; + padre:Linux:*:*) + echo sparc-unknown-linux-gnu + exit ;; + parisc64:Linux:*:* | hppa64:Linux:*:*) + echo hppa64-unknown-linux-gnu + exit ;; + parisc:Linux:*:* | hppa:Linux:*:*) + # Look for CPU level + case `grep '^cpu[^a-z]*:' /proc/cpuinfo 2>/dev/null | cut -d' ' -f2` in + PA7*) echo hppa1.1-unknown-linux-gnu ;; + PA8*) echo hppa2.0-unknown-linux-gnu ;; + *) echo hppa-unknown-linux-gnu ;; + esac + exit ;; + ppc64:Linux:*:*) + echo powerpc64-unknown-linux-gnu + exit ;; + ppc:Linux:*:*) + echo powerpc-unknown-linux-gnu + exit ;; + s390:Linux:*:* | s390x:Linux:*:*) + echo ${UNAME_MACHINE}-ibm-linux + exit ;; + sh64*:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-gnu + exit ;; + sh*:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-gnu + exit ;; + sparc:Linux:*:* | sparc64:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-gnu + exit ;; + tile*:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-gnu + exit ;; + vax:Linux:*:*) + echo ${UNAME_MACHINE}-dec-linux-gnu + exit ;; + x86_64:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-gnu + exit ;; + xtensa*:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-gnu + exit ;; + i*86:DYNIX/ptx:4*:*) + # ptx 4.0 does uname -s correctly, with DYNIX/ptx in there. + # earlier versions are messed up and put the nodename in both + # sysname and nodename. + echo i386-sequent-sysv4 + exit ;; + i*86:UNIX_SV:4.2MP:2.*) + # Unixware is an offshoot of SVR4, but it has its own version + # number series starting with 2... + # I am not positive that other SVR4 systems won't match this, + # I just have to hope. -- rms. + # Use sysv4.2uw... so that sysv4* matches it. + echo ${UNAME_MACHINE}-pc-sysv4.2uw${UNAME_VERSION} + exit ;; + i*86:OS/2:*:*) + # If we were able to find `uname', then EMX Unix compatibility + # is probably installed. + echo ${UNAME_MACHINE}-pc-os2-emx + exit ;; + i*86:XTS-300:*:STOP) + echo ${UNAME_MACHINE}-unknown-stop + exit ;; + i*86:atheos:*:*) + echo ${UNAME_MACHINE}-unknown-atheos + exit ;; + i*86:syllable:*:*) + echo ${UNAME_MACHINE}-pc-syllable + exit ;; + i*86:LynxOS:2.*:* | i*86:LynxOS:3.[01]*:* | i*86:LynxOS:4.[02]*:*) + echo i386-unknown-lynxos${UNAME_RELEASE} + exit ;; + i*86:*DOS:*:*) + echo ${UNAME_MACHINE}-pc-msdosdjgpp + exit ;; + i*86:*:4.*:* | i*86:SYSTEM_V:4.*:*) + UNAME_REL=`echo ${UNAME_RELEASE} | sed 's/\/MP$//'` + if grep Novell /usr/include/link.h >/dev/null 2>/dev/null; then + echo ${UNAME_MACHINE}-univel-sysv${UNAME_REL} + else + echo ${UNAME_MACHINE}-pc-sysv${UNAME_REL} + fi + exit ;; + i*86:*:5:[678]*) + # UnixWare 7.x, OpenUNIX and OpenServer 6. + case `/bin/uname -X | grep "^Machine"` in + *486*) UNAME_MACHINE=i486 ;; + *Pentium) UNAME_MACHINE=i586 ;; + *Pent*|*Celeron) UNAME_MACHINE=i686 ;; + esac + echo ${UNAME_MACHINE}-unknown-sysv${UNAME_RELEASE}${UNAME_SYSTEM}${UNAME_VERSION} + exit ;; + i*86:*:3.2:*) + if test -f /usr/options/cb.name; then + UNAME_REL=`sed -n 's/.*Version //p' /dev/null >/dev/null ; then + UNAME_REL=`(/bin/uname -X|grep Release|sed -e 's/.*= //')` + (/bin/uname -X|grep i80486 >/dev/null) && UNAME_MACHINE=i486 + (/bin/uname -X|grep '^Machine.*Pentium' >/dev/null) \ + && UNAME_MACHINE=i586 + (/bin/uname -X|grep '^Machine.*Pent *II' >/dev/null) \ + && UNAME_MACHINE=i686 + (/bin/uname -X|grep '^Machine.*Pentium Pro' >/dev/null) \ + && UNAME_MACHINE=i686 + echo ${UNAME_MACHINE}-pc-sco$UNAME_REL + else + echo ${UNAME_MACHINE}-pc-sysv32 + fi + exit ;; + pc:*:*:*) + # Left here for compatibility: + # uname -m prints for DJGPP always 'pc', but it prints nothing about + # the processor, so we play safe by assuming i586. + # Note: whatever this is, it MUST be the same as what config.sub + # prints for the "djgpp" host, or else GDB configury will decide that + # this is a cross-build. + echo i586-pc-msdosdjgpp + exit ;; + Intel:Mach:3*:*) + echo i386-pc-mach3 + exit ;; + paragon:*:*:*) + echo i860-intel-osf1 + exit ;; + i860:*:4.*:*) # i860-SVR4 + if grep Stardent /usr/include/sys/uadmin.h >/dev/null 2>&1 ; then + echo i860-stardent-sysv${UNAME_RELEASE} # Stardent Vistra i860-SVR4 + else # Add other i860-SVR4 vendors below as they are discovered. + echo i860-unknown-sysv${UNAME_RELEASE} # Unknown i860-SVR4 + fi + exit ;; + mini*:CTIX:SYS*5:*) + # "miniframe" + echo m68010-convergent-sysv + exit ;; + mc68k:UNIX:SYSTEM5:3.51m) + echo m68k-convergent-sysv + exit ;; + M680?0:D-NIX:5.3:*) + echo m68k-diab-dnix + exit ;; + M68*:*:R3V[5678]*:*) + test -r /sysV68 && { echo 'm68k-motorola-sysv'; exit; } ;; + 3[345]??:*:4.0:3.0 | 3[34]??A:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0 | 3[34]??/*:*:4.0:3.0 | 4400:*:4.0:3.0 | 4850:*:4.0:3.0 | SKA40:*:4.0:3.0 | SDS2:*:4.0:3.0 | SHG2:*:4.0:3.0 | S7501*:*:4.0:3.0) + OS_REL='' + test -r /etc/.relid \ + && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid` + /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ + && { echo i486-ncr-sysv4.3${OS_REL}; exit; } + /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \ + && { echo i586-ncr-sysv4.3${OS_REL}; exit; } ;; + 3[34]??:*:4.0:* | 3[34]??,*:*:4.0:*) + /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ + && { echo i486-ncr-sysv4; exit; } ;; + NCR*:*:4.2:* | MPRAS*:*:4.2:*) + OS_REL='.3' + test -r /etc/.relid \ + && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid` + /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ + && { echo i486-ncr-sysv4.3${OS_REL}; exit; } + /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \ + && { echo i586-ncr-sysv4.3${OS_REL}; exit; } + /bin/uname -p 2>/dev/null | /bin/grep pteron >/dev/null \ + && { echo i586-ncr-sysv4.3${OS_REL}; exit; } ;; + m68*:LynxOS:2.*:* | m68*:LynxOS:3.0*:*) + echo m68k-unknown-lynxos${UNAME_RELEASE} + exit ;; + mc68030:UNIX_System_V:4.*:*) + echo m68k-atari-sysv4 + exit ;; + TSUNAMI:LynxOS:2.*:*) + echo sparc-unknown-lynxos${UNAME_RELEASE} + exit ;; + rs6000:LynxOS:2.*:*) + echo rs6000-unknown-lynxos${UNAME_RELEASE} + exit ;; + PowerPC:LynxOS:2.*:* | PowerPC:LynxOS:3.[01]*:* | PowerPC:LynxOS:4.[02]*:*) + echo powerpc-unknown-lynxos${UNAME_RELEASE} + exit ;; + SM[BE]S:UNIX_SV:*:*) + echo mips-dde-sysv${UNAME_RELEASE} + exit ;; + RM*:ReliantUNIX-*:*:*) + echo mips-sni-sysv4 + exit ;; + RM*:SINIX-*:*:*) + echo mips-sni-sysv4 + exit ;; + *:SINIX-*:*:*) + if uname -p 2>/dev/null >/dev/null ; then + UNAME_MACHINE=`(uname -p) 2>/dev/null` + echo ${UNAME_MACHINE}-sni-sysv4 + else + echo ns32k-sni-sysv + fi + exit ;; + PENTIUM:*:4.0*:*) # Unisys `ClearPath HMP IX 4000' SVR4/MP effort + # says + echo i586-unisys-sysv4 + exit ;; + *:UNIX_System_V:4*:FTX*) + # From Gerald Hewes . + # How about differentiating between stratus architectures? -djm + echo hppa1.1-stratus-sysv4 + exit ;; + *:*:*:FTX*) + # From seanf@swdc.stratus.com. + echo i860-stratus-sysv4 + exit ;; + i*86:VOS:*:*) + # From Paul.Green@stratus.com. + echo ${UNAME_MACHINE}-stratus-vos + exit ;; + *:VOS:*:*) + # From Paul.Green@stratus.com. + echo hppa1.1-stratus-vos + exit ;; + mc68*:A/UX:*:*) + echo m68k-apple-aux${UNAME_RELEASE} + exit ;; + news*:NEWS-OS:6*:*) + echo mips-sony-newsos6 + exit ;; + R[34]000:*System_V*:*:* | R4000:UNIX_SYSV:*:* | R*000:UNIX_SV:*:*) + if [ -d /usr/nec ]; then + echo mips-nec-sysv${UNAME_RELEASE} + else + echo mips-unknown-sysv${UNAME_RELEASE} + fi + exit ;; + BeBox:BeOS:*:*) # BeOS running on hardware made by Be, PPC only. + echo powerpc-be-beos + exit ;; + BeMac:BeOS:*:*) # BeOS running on Mac or Mac clone, PPC only. + echo powerpc-apple-beos + exit ;; + BePC:BeOS:*:*) # BeOS running on Intel PC compatible. + echo i586-pc-beos + exit ;; + BePC:Haiku:*:*) # Haiku running on Intel PC compatible. + echo i586-pc-haiku + exit ;; + SX-4:SUPER-UX:*:*) + echo sx4-nec-superux${UNAME_RELEASE} + exit ;; + SX-5:SUPER-UX:*:*) + echo sx5-nec-superux${UNAME_RELEASE} + exit ;; + SX-6:SUPER-UX:*:*) + echo sx6-nec-superux${UNAME_RELEASE} + exit ;; + SX-7:SUPER-UX:*:*) + echo sx7-nec-superux${UNAME_RELEASE} + exit ;; + SX-8:SUPER-UX:*:*) + echo sx8-nec-superux${UNAME_RELEASE} + exit ;; + SX-8R:SUPER-UX:*:*) + echo sx8r-nec-superux${UNAME_RELEASE} + exit ;; + Power*:Rhapsody:*:*) + echo powerpc-apple-rhapsody${UNAME_RELEASE} + exit ;; + *:Rhapsody:*:*) + echo ${UNAME_MACHINE}-apple-rhapsody${UNAME_RELEASE} + exit ;; + *:Darwin:*:*) + UNAME_PROCESSOR=`uname -p` || UNAME_PROCESSOR=unknown + case $UNAME_PROCESSOR in + i386) + eval $set_cc_for_build + if [ "$CC_FOR_BUILD" != 'no_compiler_found' ]; then + if (echo '#ifdef __LP64__'; echo IS_64BIT_ARCH; echo '#endif') | \ + (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | \ + grep IS_64BIT_ARCH >/dev/null + then + UNAME_PROCESSOR="x86_64" + fi + fi ;; + unknown) UNAME_PROCESSOR=powerpc ;; + esac + echo ${UNAME_PROCESSOR}-apple-darwin${UNAME_RELEASE} + exit ;; + *:procnto*:*:* | *:QNX:[0123456789]*:*) + UNAME_PROCESSOR=`uname -p` + if test "$UNAME_PROCESSOR" = "x86"; then + UNAME_PROCESSOR=i386 + UNAME_MACHINE=pc + fi + echo ${UNAME_PROCESSOR}-${UNAME_MACHINE}-nto-qnx${UNAME_RELEASE} + exit ;; + *:QNX:*:4*) + echo i386-pc-qnx + exit ;; + NEO-?:NONSTOP_KERNEL:*:*) + echo neo-tandem-nsk${UNAME_RELEASE} + exit ;; + NSE-?:NONSTOP_KERNEL:*:*) + echo nse-tandem-nsk${UNAME_RELEASE} + exit ;; + NSR-?:NONSTOP_KERNEL:*:*) + echo nsr-tandem-nsk${UNAME_RELEASE} + exit ;; + *:NonStop-UX:*:*) + echo mips-compaq-nonstopux + exit ;; + BS2000:POSIX*:*:*) + echo bs2000-siemens-sysv + exit ;; + DS/*:UNIX_System_V:*:*) + echo ${UNAME_MACHINE}-${UNAME_SYSTEM}-${UNAME_RELEASE} + exit ;; + *:Plan9:*:*) + # "uname -m" is not consistent, so use $cputype instead. 386 + # is converted to i386 for consistency with other x86 + # operating systems. + if test "$cputype" = "386"; then + UNAME_MACHINE=i386 + else + UNAME_MACHINE="$cputype" + fi + echo ${UNAME_MACHINE}-unknown-plan9 + exit ;; + *:TOPS-10:*:*) + echo pdp10-unknown-tops10 + exit ;; + *:TENEX:*:*) + echo pdp10-unknown-tenex + exit ;; + KS10:TOPS-20:*:* | KL10:TOPS-20:*:* | TYPE4:TOPS-20:*:*) + echo pdp10-dec-tops20 + exit ;; + XKL-1:TOPS-20:*:* | TYPE5:TOPS-20:*:*) + echo pdp10-xkl-tops20 + exit ;; + *:TOPS-20:*:*) + echo pdp10-unknown-tops20 + exit ;; + *:ITS:*:*) + echo pdp10-unknown-its + exit ;; + SEI:*:*:SEIUX) + echo mips-sei-seiux${UNAME_RELEASE} + exit ;; + *:DragonFly:*:*) + echo ${UNAME_MACHINE}-unknown-dragonfly`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` + exit ;; + *:*VMS:*:*) + UNAME_MACHINE=`(uname -p) 2>/dev/null` + case "${UNAME_MACHINE}" in + A*) echo alpha-dec-vms ; exit ;; + I*) echo ia64-dec-vms ; exit ;; + V*) echo vax-dec-vms ; exit ;; + esac ;; + *:XENIX:*:SysV) + echo i386-pc-xenix + exit ;; + i*86:skyos:*:*) + echo ${UNAME_MACHINE}-pc-skyos`echo ${UNAME_RELEASE}` | sed -e 's/ .*$//' + exit ;; + i*86:rdos:*:*) + echo ${UNAME_MACHINE}-pc-rdos + exit ;; + i*86:AROS:*:*) + echo ${UNAME_MACHINE}-pc-aros + exit ;; + x86_64:VMkernel:*:*) + echo ${UNAME_MACHINE}-unknown-esx + exit ;; +esac + +#echo '(No uname command or uname output not recognized.)' 1>&2 +#echo "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" 1>&2 + +eval $set_cc_for_build +cat >$dummy.c < +# include +#endif +main () +{ +#if defined (sony) +#if defined (MIPSEB) + /* BFD wants "bsd" instead of "newsos". Perhaps BFD should be changed, + I don't know.... */ + printf ("mips-sony-bsd\n"); exit (0); +#else +#include + printf ("m68k-sony-newsos%s\n", +#ifdef NEWSOS4 + "4" +#else + "" +#endif + ); exit (0); +#endif +#endif + +#if defined (__arm) && defined (__acorn) && defined (__unix) + printf ("arm-acorn-riscix\n"); exit (0); +#endif + +#if defined (hp300) && !defined (hpux) + printf ("m68k-hp-bsd\n"); exit (0); +#endif + +#if defined (NeXT) +#if !defined (__ARCHITECTURE__) +#define __ARCHITECTURE__ "m68k" +#endif + int version; + version=`(hostinfo | sed -n 's/.*NeXT Mach \([0-9]*\).*/\1/p') 2>/dev/null`; + if (version < 4) + printf ("%s-next-nextstep%d\n", __ARCHITECTURE__, version); + else + printf ("%s-next-openstep%d\n", __ARCHITECTURE__, version); + exit (0); +#endif + +#if defined (MULTIMAX) || defined (n16) +#if defined (UMAXV) + printf ("ns32k-encore-sysv\n"); exit (0); +#else +#if defined (CMU) + printf ("ns32k-encore-mach\n"); exit (0); +#else + printf ("ns32k-encore-bsd\n"); exit (0); +#endif +#endif +#endif + +#if defined (__386BSD__) + printf ("i386-pc-bsd\n"); exit (0); +#endif + +#if defined (sequent) +#if defined (i386) + printf ("i386-sequent-dynix\n"); exit (0); +#endif +#if defined (ns32000) + printf ("ns32k-sequent-dynix\n"); exit (0); +#endif +#endif + +#if defined (_SEQUENT_) + struct utsname un; + + uname(&un); + + if (strncmp(un.version, "V2", 2) == 0) { + printf ("i386-sequent-ptx2\n"); exit (0); + } + if (strncmp(un.version, "V1", 2) == 0) { /* XXX is V1 correct? */ + printf ("i386-sequent-ptx1\n"); exit (0); + } + printf ("i386-sequent-ptx\n"); exit (0); + +#endif + +#if defined (vax) +# if !defined (ultrix) +# include +# if defined (BSD) +# if BSD == 43 + printf ("vax-dec-bsd4.3\n"); exit (0); +# else +# if BSD == 199006 + printf ("vax-dec-bsd4.3reno\n"); exit (0); +# else + printf ("vax-dec-bsd\n"); exit (0); +# endif +# endif +# else + printf ("vax-dec-bsd\n"); exit (0); +# endif +# else + printf ("vax-dec-ultrix\n"); exit (0); +# endif +#endif + +#if defined (alliant) && defined (i860) + printf ("i860-alliant-bsd\n"); exit (0); +#endif + + exit (1); +} +EOF + +$CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null && SYSTEM_NAME=`$dummy` && + { echo "$SYSTEM_NAME"; exit; } + +# Apollos put the system type in the environment. + +test -d /usr/apollo && { echo ${ISP}-apollo-${SYSTYPE}; exit; } + +# Convex versions that predate uname can use getsysinfo(1) + +if [ -x /usr/convex/getsysinfo ] +then + case `getsysinfo -f cpu_type` in + c1*) + echo c1-convex-bsd + exit ;; + c2*) + if getsysinfo -f scalar_acc + then echo c32-convex-bsd + else echo c2-convex-bsd + fi + exit ;; + c34*) + echo c34-convex-bsd + exit ;; + c38*) + echo c38-convex-bsd + exit ;; + c4*) + echo c4-convex-bsd + exit ;; + esac +fi + +cat >&2 < in order to provide the needed +information to handle your system. + +config.guess timestamp = $timestamp + +uname -m = `(uname -m) 2>/dev/null || echo unknown` +uname -r = `(uname -r) 2>/dev/null || echo unknown` +uname -s = `(uname -s) 2>/dev/null || echo unknown` +uname -v = `(uname -v) 2>/dev/null || echo unknown` + +/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null` +/bin/uname -X = `(/bin/uname -X) 2>/dev/null` + +hostinfo = `(hostinfo) 2>/dev/null` +/bin/universe = `(/bin/universe) 2>/dev/null` +/usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null` +/bin/arch = `(/bin/arch) 2>/dev/null` +/usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null` +/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null` + +UNAME_MACHINE = ${UNAME_MACHINE} +UNAME_RELEASE = ${UNAME_RELEASE} +UNAME_SYSTEM = ${UNAME_SYSTEM} +UNAME_VERSION = ${UNAME_VERSION} +EOF + +exit 1 + +# Local variables: +# eval: (add-hook 'write-file-hooks 'time-stamp) +# time-stamp-start: "timestamp='" +# time-stamp-format: "%:y-%02m-%02d" +# time-stamp-end: "'" +# End: diff --git a/pkg/registry/zookeeper-3.4.6/src/c/config.h.in b/pkg/registry/zookeeper-3.4.6/src/c/config.h.in new file mode 100644 index 000000000..1716980d7 --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/c/config.h.in @@ -0,0 +1,152 @@ +/* config.h.in. Generated from configure.ac by autoheader. */ + +/* Define to 1 if you have the header file. */ +#undef HAVE_ARPA_INET_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_DLFCN_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_FCNTL_H + +/* Define to 1 if you have the file `generated/zookeeper.jute.c'. */ +#undef HAVE_GENERATED_ZOOKEEPER_JUTE_C + +/* Define to 1 if you have the file `generated/zookeeper.jute.h'. */ +#undef HAVE_GENERATED_ZOOKEEPER_JUTE_H + +/* Define to 1 if you have the `getcwd' function. */ +#undef HAVE_GETCWD + +/* Define to 1 if you have the `gethostbyname' function. */ +#undef HAVE_GETHOSTBYNAME + +/* Define to 1 if you have the `gethostname' function. */ +#undef HAVE_GETHOSTNAME + +/* Define to 1 if you have the `getlogin' function. */ +#undef HAVE_GETLOGIN + +/* Define to 1 if you have the `getpwuid_r' function. */ +#undef HAVE_GETPWUID_R + +/* Define to 1 if you have the `gettimeofday' function. */ +#undef HAVE_GETTIMEOFDAY + +/* Define to 1 if you have the `getuid' function. */ +#undef HAVE_GETUID + +/* Define to 1 if you have the header file. */ +#undef HAVE_INTTYPES_H + +/* Define to 1 if you have the `memmove' function. */ +#undef HAVE_MEMMOVE + +/* Define to 1 if you have the header file. */ +#undef HAVE_MEMORY_H + +/* Define to 1 if you have the `memset' function. */ +#undef HAVE_MEMSET + +/* Define to 1 if you have the header file. */ +#undef HAVE_NETDB_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_NETINET_IN_H + +/* Define to 1 if you have the `poll' function. */ +#undef HAVE_POLL + +/* Define to 1 if you have the `socket' function. */ +#undef HAVE_SOCKET + +/* Define to 1 if you have the header file. */ +#undef HAVE_STDINT_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_STDLIB_H + +/* Define to 1 if you have the `strchr' function. */ +#undef HAVE_STRCHR + +/* Define to 1 if you have the `strdup' function. */ +#undef HAVE_STRDUP + +/* Define to 1 if you have the `strerror' function. */ +#undef HAVE_STRERROR + +/* Define to 1 if you have the header file. */ +#undef HAVE_STRINGS_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_STRING_H + +/* Define to 1 if you have the `strtol' function. */ +#undef HAVE_STRTOL + +/* Define to 1 if you have the header file. */ +#undef HAVE_SYS_SOCKET_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_SYS_STAT_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_SYS_TIME_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_SYS_TYPES_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_SYS_UTSNAME_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_UNISTD_H + +/* Define to the sub-directory in which libtool stores uninstalled libraries. + */ +#undef LT_OBJDIR + +/* Define to 1 if your C compiler doesn't accept -c and -o together. */ +#undef NO_MINUS_C_MINUS_O + +/* Name of package */ +#undef PACKAGE + +/* Define to the address where bug reports for this package should be sent. */ +#undef PACKAGE_BUGREPORT + +/* Define to the full name of this package. */ +#undef PACKAGE_NAME + +/* Define to the full name and version of this package. */ +#undef PACKAGE_STRING + +/* Define to the one symbol short name of this package. */ +#undef PACKAGE_TARNAME + +/* Define to the home page for this package. */ +#undef PACKAGE_URL + +/* Define to the version of this package. */ +#undef PACKAGE_VERSION + +/* poll() second argument type */ +#undef POLL_NFDS_TYPE + +/* Define to 1 if you have the ANSI C header files. */ +#undef STDC_HEADERS + +/* Define to 1 if you can safely include both and . */ +#undef TIME_WITH_SYS_TIME + +/* Version number of package */ +#undef VERSION + +/* Define to empty if `const' does not conform to ANSI C. */ +#undef const + +/* Define to `__inline__' or `__inline' if that's what the C compiler + calls it, or to nothing if 'inline' is not supported under any name. */ +#ifndef __cplusplus +#undef inline +#endif diff --git a/pkg/registry/zookeeper-3.4.6/src/c/config.sub b/pkg/registry/zookeeper-3.4.6/src/c/config.sub new file mode 100755 index 000000000..6205f8423 --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/c/config.sub @@ -0,0 +1,1782 @@ +#! /bin/sh +# Configuration validation subroutine script. +# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, +# 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, +# 2011, 2012 Free Software Foundation, Inc. + +timestamp='2012-04-18' + +# This file is (in principle) common to ALL GNU software. +# The presence of a machine in this file suggests that SOME GNU software +# can handle that machine. It does not imply ALL GNU software can. +# +# This file is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, see . +# +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program that contains a +# configuration script generated by Autoconf, you may include it under +# the same distribution terms that you use for the rest of that program. + + +# Please send patches to . Submit a context +# diff and a properly formatted GNU ChangeLog entry. +# +# Configuration subroutine to validate and canonicalize a configuration type. +# Supply the specified configuration type as an argument. +# If it is invalid, we print an error message on stderr and exit with code 1. +# Otherwise, we print the canonical config type on stdout and succeed. + +# You can get the latest version of this script from: +# http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub;hb=HEAD + +# This file is supposed to be the same for all GNU packages +# and recognize all the CPU types, system types and aliases +# that are meaningful with *any* GNU software. +# Each package is responsible for reporting which valid configurations +# it does not support. The user should be able to distinguish +# a failure to support a valid configuration from a meaningless +# configuration. + +# The goal of this file is to map all the various variations of a given +# machine specification into a single specification in the form: +# CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM +# or in some cases, the newer four-part form: +# CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM +# It is wrong to echo any other type of specification. + +me=`echo "$0" | sed -e 's,.*/,,'` + +usage="\ +Usage: $0 [OPTION] CPU-MFR-OPSYS + $0 [OPTION] ALIAS + +Canonicalize a configuration name. + +Operation modes: + -h, --help print this help, then exit + -t, --time-stamp print date of last modification, then exit + -v, --version print version number, then exit + +Report bugs and patches to ." + +version="\ +GNU config.sub ($timestamp) + +Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, +2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012 +Free Software Foundation, Inc. + +This is free software; see the source for copying conditions. There is NO +warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." + +help=" +Try \`$me --help' for more information." + +# Parse command line +while test $# -gt 0 ; do + case $1 in + --time-stamp | --time* | -t ) + echo "$timestamp" ; exit ;; + --version | -v ) + echo "$version" ; exit ;; + --help | --h* | -h ) + echo "$usage"; exit ;; + -- ) # Stop option processing + shift; break ;; + - ) # Use stdin as input. + break ;; + -* ) + echo "$me: invalid option $1$help" + exit 1 ;; + + *local*) + # First pass through any local machine types. + echo $1 + exit ;; + + * ) + break ;; + esac +done + +case $# in + 0) echo "$me: missing argument$help" >&2 + exit 1;; + 1) ;; + *) echo "$me: too many arguments$help" >&2 + exit 1;; +esac + +# Separate what the user gave into CPU-COMPANY and OS or KERNEL-OS (if any). +# Here we must recognize all the valid KERNEL-OS combinations. +maybe_os=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'` +case $maybe_os in + nto-qnx* | linux-gnu* | linux-android* | linux-dietlibc | linux-newlib* | \ + linux-uclibc* | uclinux-uclibc* | uclinux-gnu* | kfreebsd*-gnu* | \ + knetbsd*-gnu* | netbsd*-gnu* | \ + kopensolaris*-gnu* | \ + storm-chaos* | os2-emx* | rtmk-nova*) + os=-$maybe_os + basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'` + ;; + android-linux) + os=-linux-android + basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'`-unknown + ;; + *) + basic_machine=`echo $1 | sed 's/-[^-]*$//'` + if [ $basic_machine != $1 ] + then os=`echo $1 | sed 's/.*-/-/'` + else os=; fi + ;; +esac + +### Let's recognize common machines as not being operating systems so +### that things like config.sub decstation-3100 work. We also +### recognize some manufacturers as not being operating systems, so we +### can provide default operating systems below. +case $os in + -sun*os*) + # Prevent following clause from handling this invalid input. + ;; + -dec* | -mips* | -sequent* | -encore* | -pc532* | -sgi* | -sony* | \ + -att* | -7300* | -3300* | -delta* | -motorola* | -sun[234]* | \ + -unicom* | -ibm* | -next | -hp | -isi* | -apollo | -altos* | \ + -convergent* | -ncr* | -news | -32* | -3600* | -3100* | -hitachi* |\ + -c[123]* | -convex* | -sun | -crds | -omron* | -dg | -ultra | -tti* | \ + -harris | -dolphin | -highlevel | -gould | -cbm | -ns | -masscomp | \ + -apple | -axis | -knuth | -cray | -microblaze) + os= + basic_machine=$1 + ;; + -bluegene*) + os=-cnk + ;; + -sim | -cisco | -oki | -wec | -winbond) + os= + basic_machine=$1 + ;; + -scout) + ;; + -wrs) + os=-vxworks + basic_machine=$1 + ;; + -chorusos*) + os=-chorusos + basic_machine=$1 + ;; + -chorusrdb) + os=-chorusrdb + basic_machine=$1 + ;; + -hiux*) + os=-hiuxwe2 + ;; + -sco6) + os=-sco5v6 + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -sco5) + os=-sco3.2v5 + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -sco4) + os=-sco3.2v4 + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -sco3.2.[4-9]*) + os=`echo $os | sed -e 's/sco3.2./sco3.2v/'` + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -sco3.2v[4-9]*) + # Don't forget version if it is 3.2v4 or newer. + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -sco5v6*) + # Don't forget version if it is 3.2v4 or newer. + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -sco*) + os=-sco3.2v2 + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -udk*) + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -isc) + os=-isc2.2 + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -clix*) + basic_machine=clipper-intergraph + ;; + -isc*) + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -lynx*178) + os=-lynxos178 + ;; + -lynx*5) + os=-lynxos5 + ;; + -lynx*) + os=-lynxos + ;; + -ptx*) + basic_machine=`echo $1 | sed -e 's/86-.*/86-sequent/'` + ;; + -windowsnt*) + os=`echo $os | sed -e 's/windowsnt/winnt/'` + ;; + -psos*) + os=-psos + ;; + -mint | -mint[0-9]*) + basic_machine=m68k-atari + os=-mint + ;; +esac + +# Decode aliases for certain CPU-COMPANY combinations. +case $basic_machine in + # Recognize the basic CPU types without company name. + # Some are omitted here because they have special meanings below. + 1750a | 580 \ + | a29k \ + | aarch64 | aarch64_be \ + | alpha | alphaev[4-8] | alphaev56 | alphaev6[78] | alphapca5[67] \ + | alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] | alpha64pca5[67] \ + | am33_2.0 \ + | arc | arm | arm[bl]e | arme[lb] | armv[2345] | armv[345][lb] | avr | avr32 \ + | be32 | be64 \ + | bfin \ + | c4x | clipper \ + | d10v | d30v | dlx | dsp16xx \ + | epiphany \ + | fido | fr30 | frv \ + | h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \ + | hexagon \ + | i370 | i860 | i960 | ia64 \ + | ip2k | iq2000 \ + | le32 | le64 \ + | lm32 \ + | m32c | m32r | m32rle | m68000 | m68k | m88k \ + | maxq | mb | microblaze | mcore | mep | metag \ + | mips | mipsbe | mipseb | mipsel | mipsle \ + | mips16 \ + | mips64 | mips64el \ + | mips64octeon | mips64octeonel \ + | mips64orion | mips64orionel \ + | mips64r5900 | mips64r5900el \ + | mips64vr | mips64vrel \ + | mips64vr4100 | mips64vr4100el \ + | mips64vr4300 | mips64vr4300el \ + | mips64vr5000 | mips64vr5000el \ + | mips64vr5900 | mips64vr5900el \ + | mipsisa32 | mipsisa32el \ + | mipsisa32r2 | mipsisa32r2el \ + | mipsisa64 | mipsisa64el \ + | mipsisa64r2 | mipsisa64r2el \ + | mipsisa64sb1 | mipsisa64sb1el \ + | mipsisa64sr71k | mipsisa64sr71kel \ + | mipstx39 | mipstx39el \ + | mn10200 | mn10300 \ + | moxie \ + | mt \ + | msp430 \ + | nds32 | nds32le | nds32be \ + | nios | nios2 \ + | ns16k | ns32k \ + | open8 \ + | or32 \ + | pdp10 | pdp11 | pj | pjl \ + | powerpc | powerpc64 | powerpc64le | powerpcle \ + | pyramid \ + | rl78 | rx \ + | score \ + | sh | sh[1234] | sh[24]a | sh[24]aeb | sh[23]e | sh[34]eb | sheb | shbe | shle | sh[1234]le | sh3ele \ + | sh64 | sh64le \ + | sparc | sparc64 | sparc64b | sparc64v | sparc86x | sparclet | sparclite \ + | sparcv8 | sparcv9 | sparcv9b | sparcv9v \ + | spu \ + | tahoe | tic4x | tic54x | tic55x | tic6x | tic80 | tron \ + | ubicom32 \ + | v850 | v850e | v850e1 | v850e2 | v850es | v850e2v3 \ + | we32k \ + | x86 | xc16x | xstormy16 | xtensa \ + | z8k | z80) + basic_machine=$basic_machine-unknown + ;; + c54x) + basic_machine=tic54x-unknown + ;; + c55x) + basic_machine=tic55x-unknown + ;; + c6x) + basic_machine=tic6x-unknown + ;; + m6811 | m68hc11 | m6812 | m68hc12 | m68hcs12x | picochip) + basic_machine=$basic_machine-unknown + os=-none + ;; + m88110 | m680[12346]0 | m683?2 | m68360 | m5200 | v70 | w65 | z8k) + ;; + ms1) + basic_machine=mt-unknown + ;; + + strongarm | thumb | xscale) + basic_machine=arm-unknown + ;; + xgate) + basic_machine=$basic_machine-unknown + os=-none + ;; + xscaleeb) + basic_machine=armeb-unknown + ;; + + xscaleel) + basic_machine=armel-unknown + ;; + + # We use `pc' rather than `unknown' + # because (1) that's what they normally are, and + # (2) the word "unknown" tends to confuse beginning users. + i*86 | x86_64) + basic_machine=$basic_machine-pc + ;; + # Object if more than one company name word. + *-*-*) + echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2 + exit 1 + ;; + # Recognize the basic CPU types with company name. + 580-* \ + | a29k-* \ + | aarch64-* | aarch64_be-* \ + | alpha-* | alphaev[4-8]-* | alphaev56-* | alphaev6[78]-* \ + | alpha64-* | alpha64ev[4-8]-* | alpha64ev56-* | alpha64ev6[78]-* \ + | alphapca5[67]-* | alpha64pca5[67]-* | arc-* \ + | arm-* | armbe-* | armle-* | armeb-* | armv*-* \ + | avr-* | avr32-* \ + | be32-* | be64-* \ + | bfin-* | bs2000-* \ + | c[123]* | c30-* | [cjt]90-* | c4x-* \ + | clipper-* | craynv-* | cydra-* \ + | d10v-* | d30v-* | dlx-* \ + | elxsi-* \ + | f30[01]-* | f700-* | fido-* | fr30-* | frv-* | fx80-* \ + | h8300-* | h8500-* \ + | hppa-* | hppa1.[01]-* | hppa2.0-* | hppa2.0[nw]-* | hppa64-* \ + | hexagon-* \ + | i*86-* | i860-* | i960-* | ia64-* \ + | ip2k-* | iq2000-* \ + | le32-* | le64-* \ + | lm32-* \ + | m32c-* | m32r-* | m32rle-* \ + | m68000-* | m680[012346]0-* | m68360-* | m683?2-* | m68k-* \ + | m88110-* | m88k-* | maxq-* | mcore-* | metag-* | microblaze-* \ + | mips-* | mipsbe-* | mipseb-* | mipsel-* | mipsle-* \ + | mips16-* \ + | mips64-* | mips64el-* \ + | mips64octeon-* | mips64octeonel-* \ + | mips64orion-* | mips64orionel-* \ + | mips64r5900-* | mips64r5900el-* \ + | mips64vr-* | mips64vrel-* \ + | mips64vr4100-* | mips64vr4100el-* \ + | mips64vr4300-* | mips64vr4300el-* \ + | mips64vr5000-* | mips64vr5000el-* \ + | mips64vr5900-* | mips64vr5900el-* \ + | mipsisa32-* | mipsisa32el-* \ + | mipsisa32r2-* | mipsisa32r2el-* \ + | mipsisa64-* | mipsisa64el-* \ + | mipsisa64r2-* | mipsisa64r2el-* \ + | mipsisa64sb1-* | mipsisa64sb1el-* \ + | mipsisa64sr71k-* | mipsisa64sr71kel-* \ + | mipstx39-* | mipstx39el-* \ + | mmix-* \ + | mt-* \ + | msp430-* \ + | nds32-* | nds32le-* | nds32be-* \ + | nios-* | nios2-* \ + | none-* | np1-* | ns16k-* | ns32k-* \ + | open8-* \ + | orion-* \ + | pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \ + | powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* \ + | pyramid-* \ + | rl78-* | romp-* | rs6000-* | rx-* \ + | sh-* | sh[1234]-* | sh[24]a-* | sh[24]aeb-* | sh[23]e-* | sh[34]eb-* | sheb-* | shbe-* \ + | shle-* | sh[1234]le-* | sh3ele-* | sh64-* | sh64le-* \ + | sparc-* | sparc64-* | sparc64b-* | sparc64v-* | sparc86x-* | sparclet-* \ + | sparclite-* \ + | sparcv8-* | sparcv9-* | sparcv9b-* | sparcv9v-* | sv1-* | sx?-* \ + | tahoe-* \ + | tic30-* | tic4x-* | tic54x-* | tic55x-* | tic6x-* | tic80-* \ + | tile*-* \ + | tron-* \ + | ubicom32-* \ + | v850-* | v850e-* | v850e1-* | v850es-* | v850e2-* | v850e2v3-* \ + | vax-* \ + | we32k-* \ + | x86-* | x86_64-* | xc16x-* | xps100-* \ + | xstormy16-* | xtensa*-* \ + | ymp-* \ + | z8k-* | z80-*) + ;; + # Recognize the basic CPU types without company name, with glob match. + xtensa*) + basic_machine=$basic_machine-unknown + ;; + # Recognize the various machine names and aliases which stand + # for a CPU type and a company and sometimes even an OS. + 386bsd) + basic_machine=i386-unknown + os=-bsd + ;; + 3b1 | 7300 | 7300-att | att-7300 | pc7300 | safari | unixpc) + basic_machine=m68000-att + ;; + 3b*) + basic_machine=we32k-att + ;; + a29khif) + basic_machine=a29k-amd + os=-udi + ;; + abacus) + basic_machine=abacus-unknown + ;; + adobe68k) + basic_machine=m68010-adobe + os=-scout + ;; + alliant | fx80) + basic_machine=fx80-alliant + ;; + altos | altos3068) + basic_machine=m68k-altos + ;; + am29k) + basic_machine=a29k-none + os=-bsd + ;; + amd64) + basic_machine=x86_64-pc + ;; + amd64-*) + basic_machine=x86_64-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + amdahl) + basic_machine=580-amdahl + os=-sysv + ;; + amiga | amiga-*) + basic_machine=m68k-unknown + ;; + amigaos | amigados) + basic_machine=m68k-unknown + os=-amigaos + ;; + amigaunix | amix) + basic_machine=m68k-unknown + os=-sysv4 + ;; + apollo68) + basic_machine=m68k-apollo + os=-sysv + ;; + apollo68bsd) + basic_machine=m68k-apollo + os=-bsd + ;; + aros) + basic_machine=i386-pc + os=-aros + ;; + aux) + basic_machine=m68k-apple + os=-aux + ;; + balance) + basic_machine=ns32k-sequent + os=-dynix + ;; + blackfin) + basic_machine=bfin-unknown + os=-linux + ;; + blackfin-*) + basic_machine=bfin-`echo $basic_machine | sed 's/^[^-]*-//'` + os=-linux + ;; + bluegene*) + basic_machine=powerpc-ibm + os=-cnk + ;; + c54x-*) + basic_machine=tic54x-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + c55x-*) + basic_machine=tic55x-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + c6x-*) + basic_machine=tic6x-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + c90) + basic_machine=c90-cray + os=-unicos + ;; + cegcc) + basic_machine=arm-unknown + os=-cegcc + ;; + convex-c1) + basic_machine=c1-convex + os=-bsd + ;; + convex-c2) + basic_machine=c2-convex + os=-bsd + ;; + convex-c32) + basic_machine=c32-convex + os=-bsd + ;; + convex-c34) + basic_machine=c34-convex + os=-bsd + ;; + convex-c38) + basic_machine=c38-convex + os=-bsd + ;; + cray | j90) + basic_machine=j90-cray + os=-unicos + ;; + craynv) + basic_machine=craynv-cray + os=-unicosmp + ;; + cr16 | cr16-*) + basic_machine=cr16-unknown + os=-elf + ;; + crds | unos) + basic_machine=m68k-crds + ;; + crisv32 | crisv32-* | etraxfs*) + basic_machine=crisv32-axis + ;; + cris | cris-* | etrax*) + basic_machine=cris-axis + ;; + crx) + basic_machine=crx-unknown + os=-elf + ;; + da30 | da30-*) + basic_machine=m68k-da30 + ;; + decstation | decstation-3100 | pmax | pmax-* | pmin | dec3100 | decstatn) + basic_machine=mips-dec + ;; + decsystem10* | dec10*) + basic_machine=pdp10-dec + os=-tops10 + ;; + decsystem20* | dec20*) + basic_machine=pdp10-dec + os=-tops20 + ;; + delta | 3300 | motorola-3300 | motorola-delta \ + | 3300-motorola | delta-motorola) + basic_machine=m68k-motorola + ;; + delta88) + basic_machine=m88k-motorola + os=-sysv3 + ;; + dicos) + basic_machine=i686-pc + os=-dicos + ;; + djgpp) + basic_machine=i586-pc + os=-msdosdjgpp + ;; + dpx20 | dpx20-*) + basic_machine=rs6000-bull + os=-bosx + ;; + dpx2* | dpx2*-bull) + basic_machine=m68k-bull + os=-sysv3 + ;; + ebmon29k) + basic_machine=a29k-amd + os=-ebmon + ;; + elxsi) + basic_machine=elxsi-elxsi + os=-bsd + ;; + encore | umax | mmax) + basic_machine=ns32k-encore + ;; + es1800 | OSE68k | ose68k | ose | OSE) + basic_machine=m68k-ericsson + os=-ose + ;; + fx2800) + basic_machine=i860-alliant + ;; + genix) + basic_machine=ns32k-ns + ;; + gmicro) + basic_machine=tron-gmicro + os=-sysv + ;; + go32) + basic_machine=i386-pc + os=-go32 + ;; + h3050r* | hiux*) + basic_machine=hppa1.1-hitachi + os=-hiuxwe2 + ;; + h8300hms) + basic_machine=h8300-hitachi + os=-hms + ;; + h8300xray) + basic_machine=h8300-hitachi + os=-xray + ;; + h8500hms) + basic_machine=h8500-hitachi + os=-hms + ;; + harris) + basic_machine=m88k-harris + os=-sysv3 + ;; + hp300-*) + basic_machine=m68k-hp + ;; + hp300bsd) + basic_machine=m68k-hp + os=-bsd + ;; + hp300hpux) + basic_machine=m68k-hp + os=-hpux + ;; + hp3k9[0-9][0-9] | hp9[0-9][0-9]) + basic_machine=hppa1.0-hp + ;; + hp9k2[0-9][0-9] | hp9k31[0-9]) + basic_machine=m68000-hp + ;; + hp9k3[2-9][0-9]) + basic_machine=m68k-hp + ;; + hp9k6[0-9][0-9] | hp6[0-9][0-9]) + basic_machine=hppa1.0-hp + ;; + hp9k7[0-79][0-9] | hp7[0-79][0-9]) + basic_machine=hppa1.1-hp + ;; + hp9k78[0-9] | hp78[0-9]) + # FIXME: really hppa2.0-hp + basic_machine=hppa1.1-hp + ;; + hp9k8[67]1 | hp8[67]1 | hp9k80[24] | hp80[24] | hp9k8[78]9 | hp8[78]9 | hp9k893 | hp893) + # FIXME: really hppa2.0-hp + basic_machine=hppa1.1-hp + ;; + hp9k8[0-9][13679] | hp8[0-9][13679]) + basic_machine=hppa1.1-hp + ;; + hp9k8[0-9][0-9] | hp8[0-9][0-9]) + basic_machine=hppa1.0-hp + ;; + hppa-next) + os=-nextstep3 + ;; + hppaosf) + basic_machine=hppa1.1-hp + os=-osf + ;; + hppro) + basic_machine=hppa1.1-hp + os=-proelf + ;; + i370-ibm* | ibm*) + basic_machine=i370-ibm + ;; + i*86v32) + basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` + os=-sysv32 + ;; + i*86v4*) + basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` + os=-sysv4 + ;; + i*86v) + basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` + os=-sysv + ;; + i*86sol2) + basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` + os=-solaris2 + ;; + i386mach) + basic_machine=i386-mach + os=-mach + ;; + i386-vsta | vsta) + basic_machine=i386-unknown + os=-vsta + ;; + iris | iris4d) + basic_machine=mips-sgi + case $os in + -irix*) + ;; + *) + os=-irix4 + ;; + esac + ;; + isi68 | isi) + basic_machine=m68k-isi + os=-sysv + ;; + m68knommu) + basic_machine=m68k-unknown + os=-linux + ;; + m68knommu-*) + basic_machine=m68k-`echo $basic_machine | sed 's/^[^-]*-//'` + os=-linux + ;; + m88k-omron*) + basic_machine=m88k-omron + ;; + magnum | m3230) + basic_machine=mips-mips + os=-sysv + ;; + merlin) + basic_machine=ns32k-utek + os=-sysv + ;; + microblaze) + basic_machine=microblaze-xilinx + ;; + mingw32) + basic_machine=i386-pc + os=-mingw32 + ;; + mingw32ce) + basic_machine=arm-unknown + os=-mingw32ce + ;; + miniframe) + basic_machine=m68000-convergent + ;; + *mint | -mint[0-9]* | *MiNT | *MiNT[0-9]*) + basic_machine=m68k-atari + os=-mint + ;; + mips3*-*) + basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'` + ;; + mips3*) + basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`-unknown + ;; + monitor) + basic_machine=m68k-rom68k + os=-coff + ;; + morphos) + basic_machine=powerpc-unknown + os=-morphos + ;; + msdos) + basic_machine=i386-pc + os=-msdos + ;; + ms1-*) + basic_machine=`echo $basic_machine | sed -e 's/ms1-/mt-/'` + ;; + msys) + basic_machine=i386-pc + os=-msys + ;; + mvs) + basic_machine=i370-ibm + os=-mvs + ;; + nacl) + basic_machine=le32-unknown + os=-nacl + ;; + ncr3000) + basic_machine=i486-ncr + os=-sysv4 + ;; + netbsd386) + basic_machine=i386-unknown + os=-netbsd + ;; + netwinder) + basic_machine=armv4l-rebel + os=-linux + ;; + news | news700 | news800 | news900) + basic_machine=m68k-sony + os=-newsos + ;; + news1000) + basic_machine=m68030-sony + os=-newsos + ;; + news-3600 | risc-news) + basic_machine=mips-sony + os=-newsos + ;; + necv70) + basic_machine=v70-nec + os=-sysv + ;; + next | m*-next ) + basic_machine=m68k-next + case $os in + -nextstep* ) + ;; + -ns2*) + os=-nextstep2 + ;; + *) + os=-nextstep3 + ;; + esac + ;; + nh3000) + basic_machine=m68k-harris + os=-cxux + ;; + nh[45]000) + basic_machine=m88k-harris + os=-cxux + ;; + nindy960) + basic_machine=i960-intel + os=-nindy + ;; + mon960) + basic_machine=i960-intel + os=-mon960 + ;; + nonstopux) + basic_machine=mips-compaq + os=-nonstopux + ;; + np1) + basic_machine=np1-gould + ;; + neo-tandem) + basic_machine=neo-tandem + ;; + nse-tandem) + basic_machine=nse-tandem + ;; + nsr-tandem) + basic_machine=nsr-tandem + ;; + op50n-* | op60c-*) + basic_machine=hppa1.1-oki + os=-proelf + ;; + openrisc | openrisc-*) + basic_machine=or32-unknown + ;; + os400) + basic_machine=powerpc-ibm + os=-os400 + ;; + OSE68000 | ose68000) + basic_machine=m68000-ericsson + os=-ose + ;; + os68k) + basic_machine=m68k-none + os=-os68k + ;; + pa-hitachi) + basic_machine=hppa1.1-hitachi + os=-hiuxwe2 + ;; + paragon) + basic_machine=i860-intel + os=-osf + ;; + parisc) + basic_machine=hppa-unknown + os=-linux + ;; + parisc-*) + basic_machine=hppa-`echo $basic_machine | sed 's/^[^-]*-//'` + os=-linux + ;; + pbd) + basic_machine=sparc-tti + ;; + pbb) + basic_machine=m68k-tti + ;; + pc532 | pc532-*) + basic_machine=ns32k-pc532 + ;; + pc98) + basic_machine=i386-pc + ;; + pc98-*) + basic_machine=i386-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + pentium | p5 | k5 | k6 | nexgen | viac3) + basic_machine=i586-pc + ;; + pentiumpro | p6 | 6x86 | athlon | athlon_*) + basic_machine=i686-pc + ;; + pentiumii | pentium2 | pentiumiii | pentium3) + basic_machine=i686-pc + ;; + pentium4) + basic_machine=i786-pc + ;; + pentium-* | p5-* | k5-* | k6-* | nexgen-* | viac3-*) + basic_machine=i586-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + pentiumpro-* | p6-* | 6x86-* | athlon-*) + basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + pentiumii-* | pentium2-* | pentiumiii-* | pentium3-*) + basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + pentium4-*) + basic_machine=i786-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + pn) + basic_machine=pn-gould + ;; + power) basic_machine=power-ibm + ;; + ppc | ppcbe) basic_machine=powerpc-unknown + ;; + ppc-* | ppcbe-*) + basic_machine=powerpc-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + ppcle | powerpclittle | ppc-le | powerpc-little) + basic_machine=powerpcle-unknown + ;; + ppcle-* | powerpclittle-*) + basic_machine=powerpcle-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + ppc64) basic_machine=powerpc64-unknown + ;; + ppc64-*) basic_machine=powerpc64-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + ppc64le | powerpc64little | ppc64-le | powerpc64-little) + basic_machine=powerpc64le-unknown + ;; + ppc64le-* | powerpc64little-*) + basic_machine=powerpc64le-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + ps2) + basic_machine=i386-ibm + ;; + pw32) + basic_machine=i586-unknown + os=-pw32 + ;; + rdos) + basic_machine=i386-pc + os=-rdos + ;; + rom68k) + basic_machine=m68k-rom68k + os=-coff + ;; + rm[46]00) + basic_machine=mips-siemens + ;; + rtpc | rtpc-*) + basic_machine=romp-ibm + ;; + s390 | s390-*) + basic_machine=s390-ibm + ;; + s390x | s390x-*) + basic_machine=s390x-ibm + ;; + sa29200) + basic_machine=a29k-amd + os=-udi + ;; + sb1) + basic_machine=mipsisa64sb1-unknown + ;; + sb1el) + basic_machine=mipsisa64sb1el-unknown + ;; + sde) + basic_machine=mipsisa32-sde + os=-elf + ;; + sei) + basic_machine=mips-sei + os=-seiux + ;; + sequent) + basic_machine=i386-sequent + ;; + sh) + basic_machine=sh-hitachi + os=-hms + ;; + sh5el) + basic_machine=sh5le-unknown + ;; + sh64) + basic_machine=sh64-unknown + ;; + sparclite-wrs | simso-wrs) + basic_machine=sparclite-wrs + os=-vxworks + ;; + sps7) + basic_machine=m68k-bull + os=-sysv2 + ;; + spur) + basic_machine=spur-unknown + ;; + st2000) + basic_machine=m68k-tandem + ;; + stratus) + basic_machine=i860-stratus + os=-sysv4 + ;; + strongarm-* | thumb-*) + basic_machine=arm-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + sun2) + basic_machine=m68000-sun + ;; + sun2os3) + basic_machine=m68000-sun + os=-sunos3 + ;; + sun2os4) + basic_machine=m68000-sun + os=-sunos4 + ;; + sun3os3) + basic_machine=m68k-sun + os=-sunos3 + ;; + sun3os4) + basic_machine=m68k-sun + os=-sunos4 + ;; + sun4os3) + basic_machine=sparc-sun + os=-sunos3 + ;; + sun4os4) + basic_machine=sparc-sun + os=-sunos4 + ;; + sun4sol2) + basic_machine=sparc-sun + os=-solaris2 + ;; + sun3 | sun3-*) + basic_machine=m68k-sun + ;; + sun4) + basic_machine=sparc-sun + ;; + sun386 | sun386i | roadrunner) + basic_machine=i386-sun + ;; + sv1) + basic_machine=sv1-cray + os=-unicos + ;; + symmetry) + basic_machine=i386-sequent + os=-dynix + ;; + t3e) + basic_machine=alphaev5-cray + os=-unicos + ;; + t90) + basic_machine=t90-cray + os=-unicos + ;; + tile*) + basic_machine=$basic_machine-unknown + os=-linux-gnu + ;; + tx39) + basic_machine=mipstx39-unknown + ;; + tx39el) + basic_machine=mipstx39el-unknown + ;; + toad1) + basic_machine=pdp10-xkl + os=-tops20 + ;; + tower | tower-32) + basic_machine=m68k-ncr + ;; + tpf) + basic_machine=s390x-ibm + os=-tpf + ;; + udi29k) + basic_machine=a29k-amd + os=-udi + ;; + ultra3) + basic_machine=a29k-nyu + os=-sym1 + ;; + v810 | necv810) + basic_machine=v810-nec + os=-none + ;; + vaxv) + basic_machine=vax-dec + os=-sysv + ;; + vms) + basic_machine=vax-dec + os=-vms + ;; + vpp*|vx|vx-*) + basic_machine=f301-fujitsu + ;; + vxworks960) + basic_machine=i960-wrs + os=-vxworks + ;; + vxworks68) + basic_machine=m68k-wrs + os=-vxworks + ;; + vxworks29k) + basic_machine=a29k-wrs + os=-vxworks + ;; + w65*) + basic_machine=w65-wdc + os=-none + ;; + w89k-*) + basic_machine=hppa1.1-winbond + os=-proelf + ;; + xbox) + basic_machine=i686-pc + os=-mingw32 + ;; + xps | xps100) + basic_machine=xps100-honeywell + ;; + xscale-* | xscalee[bl]-*) + basic_machine=`echo $basic_machine | sed 's/^xscale/arm/'` + ;; + ymp) + basic_machine=ymp-cray + os=-unicos + ;; + z8k-*-coff) + basic_machine=z8k-unknown + os=-sim + ;; + z80-*-coff) + basic_machine=z80-unknown + os=-sim + ;; + none) + basic_machine=none-none + os=-none + ;; + +# Here we handle the default manufacturer of certain CPU types. It is in +# some cases the only manufacturer, in others, it is the most popular. + w89k) + basic_machine=hppa1.1-winbond + ;; + op50n) + basic_machine=hppa1.1-oki + ;; + op60c) + basic_machine=hppa1.1-oki + ;; + romp) + basic_machine=romp-ibm + ;; + mmix) + basic_machine=mmix-knuth + ;; + rs6000) + basic_machine=rs6000-ibm + ;; + vax) + basic_machine=vax-dec + ;; + pdp10) + # there are many clones, so DEC is not a safe bet + basic_machine=pdp10-unknown + ;; + pdp11) + basic_machine=pdp11-dec + ;; + we32k) + basic_machine=we32k-att + ;; + sh[1234] | sh[24]a | sh[24]aeb | sh[34]eb | sh[1234]le | sh[23]ele) + basic_machine=sh-unknown + ;; + sparc | sparcv8 | sparcv9 | sparcv9b | sparcv9v) + basic_machine=sparc-sun + ;; + cydra) + basic_machine=cydra-cydrome + ;; + orion) + basic_machine=orion-highlevel + ;; + orion105) + basic_machine=clipper-highlevel + ;; + mac | mpw | mac-mpw) + basic_machine=m68k-apple + ;; + pmac | pmac-mpw) + basic_machine=powerpc-apple + ;; + *-unknown) + # Make sure to match an already-canonicalized machine name. + ;; + *) + echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2 + exit 1 + ;; +esac + +# Here we canonicalize certain aliases for manufacturers. +case $basic_machine in + *-digital*) + basic_machine=`echo $basic_machine | sed 's/digital.*/dec/'` + ;; + *-commodore*) + basic_machine=`echo $basic_machine | sed 's/commodore.*/cbm/'` + ;; + *) + ;; +esac + +# Decode manufacturer-specific aliases for certain operating systems. + +if [ x"$os" != x"" ] +then +case $os in + # First match some system type aliases + # that might get confused with valid system types. + # -solaris* is a basic system type, with this one exception. + -auroraux) + os=-auroraux + ;; + -solaris1 | -solaris1.*) + os=`echo $os | sed -e 's|solaris1|sunos4|'` + ;; + -solaris) + os=-solaris2 + ;; + -svr4*) + os=-sysv4 + ;; + -unixware*) + os=-sysv4.2uw + ;; + -gnu/linux*) + os=`echo $os | sed -e 's|gnu/linux|linux-gnu|'` + ;; + # First accept the basic system types. + # The portable systems comes first. + # Each alternative MUST END IN A *, to match a version number. + # -sysv* is not here because it comes later, after sysvr4. + -gnu* | -bsd* | -mach* | -minix* | -genix* | -ultrix* | -irix* \ + | -*vms* | -sco* | -esix* | -isc* | -aix* | -cnk* | -sunos | -sunos[34]*\ + | -hpux* | -unos* | -osf* | -luna* | -dgux* | -auroraux* | -solaris* \ + | -sym* | -kopensolaris* \ + | -amigaos* | -amigados* | -msdos* | -newsos* | -unicos* | -aof* \ + | -aos* | -aros* \ + | -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \ + | -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \ + | -hiux* | -386bsd* | -knetbsd* | -mirbsd* | -netbsd* \ + | -openbsd* | -solidbsd* \ + | -ekkobsd* | -kfreebsd* | -freebsd* | -riscix* | -lynxos* \ + | -bosx* | -nextstep* | -cxux* | -aout* | -elf* | -oabi* \ + | -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \ + | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \ + | -chorusos* | -chorusrdb* | -cegcc* \ + | -cygwin* | -msys* | -pe* | -psos* | -moss* | -proelf* | -rtems* \ + | -mingw32* | -linux-gnu* | -linux-android* \ + | -linux-newlib* | -linux-uclibc* \ + | -uxpv* | -beos* | -mpeix* | -udk* \ + | -interix* | -uwin* | -mks* | -rhapsody* | -darwin* | -opened* \ + | -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \ + | -storm-chaos* | -tops10* | -tenex* | -tops20* | -its* \ + | -os2* | -vos* | -palmos* | -uclinux* | -nucleus* \ + | -morphos* | -superux* | -rtmk* | -rtmk-nova* | -windiss* \ + | -powermax* | -dnix* | -nx6 | -nx7 | -sei* | -dragonfly* \ + | -skyos* | -haiku* | -rdos* | -toppers* | -drops* | -es*) + # Remember, each alternative MUST END IN *, to match a version number. + ;; + -qnx*) + case $basic_machine in + x86-* | i*86-*) + ;; + *) + os=-nto$os + ;; + esac + ;; + -nto-qnx*) + ;; + -nto*) + os=`echo $os | sed -e 's|nto|nto-qnx|'` + ;; + -sim | -es1800* | -hms* | -xray | -os68k* | -none* | -v88r* \ + | -windows* | -osx | -abug | -netware* | -os9* | -beos* | -haiku* \ + | -macos* | -mpw* | -magic* | -mmixware* | -mon960* | -lnews*) + ;; + -mac*) + os=`echo $os | sed -e 's|mac|macos|'` + ;; + -linux-dietlibc) + os=-linux-dietlibc + ;; + -linux*) + os=`echo $os | sed -e 's|linux|linux-gnu|'` + ;; + -sunos5*) + os=`echo $os | sed -e 's|sunos5|solaris2|'` + ;; + -sunos6*) + os=`echo $os | sed -e 's|sunos6|solaris3|'` + ;; + -opened*) + os=-openedition + ;; + -os400*) + os=-os400 + ;; + -wince*) + os=-wince + ;; + -osfrose*) + os=-osfrose + ;; + -osf*) + os=-osf + ;; + -utek*) + os=-bsd + ;; + -dynix*) + os=-bsd + ;; + -acis*) + os=-aos + ;; + -atheos*) + os=-atheos + ;; + -syllable*) + os=-syllable + ;; + -386bsd) + os=-bsd + ;; + -ctix* | -uts*) + os=-sysv + ;; + -nova*) + os=-rtmk-nova + ;; + -ns2 ) + os=-nextstep2 + ;; + -nsk*) + os=-nsk + ;; + # Preserve the version number of sinix5. + -sinix5.*) + os=`echo $os | sed -e 's|sinix|sysv|'` + ;; + -sinix*) + os=-sysv4 + ;; + -tpf*) + os=-tpf + ;; + -triton*) + os=-sysv3 + ;; + -oss*) + os=-sysv3 + ;; + -svr4) + os=-sysv4 + ;; + -svr3) + os=-sysv3 + ;; + -sysvr4) + os=-sysv4 + ;; + # This must come after -sysvr4. + -sysv*) + ;; + -ose*) + os=-ose + ;; + -es1800*) + os=-ose + ;; + -xenix) + os=-xenix + ;; + -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*) + os=-mint + ;; + -aros*) + os=-aros + ;; + -kaos*) + os=-kaos + ;; + -zvmoe) + os=-zvmoe + ;; + -dicos*) + os=-dicos + ;; + -nacl*) + ;; + -none) + ;; + *) + # Get rid of the `-' at the beginning of $os. + os=`echo $os | sed 's/[^-]*-//'` + echo Invalid configuration \`$1\': system \`$os\' not recognized 1>&2 + exit 1 + ;; +esac +else + +# Here we handle the default operating systems that come with various machines. +# The value should be what the vendor currently ships out the door with their +# machine or put another way, the most popular os provided with the machine. + +# Note that if you're going to try to match "-MANUFACTURER" here (say, +# "-sun"), then you have to tell the case statement up towards the top +# that MANUFACTURER isn't an operating system. Otherwise, code above +# will signal an error saying that MANUFACTURER isn't an operating +# system, and we'll never get to this point. + +case $basic_machine in + score-*) + os=-elf + ;; + spu-*) + os=-elf + ;; + *-acorn) + os=-riscix1.2 + ;; + arm*-rebel) + os=-linux + ;; + arm*-semi) + os=-aout + ;; + c4x-* | tic4x-*) + os=-coff + ;; + hexagon-*) + os=-elf + ;; + tic54x-*) + os=-coff + ;; + tic55x-*) + os=-coff + ;; + tic6x-*) + os=-coff + ;; + # This must come before the *-dec entry. + pdp10-*) + os=-tops20 + ;; + pdp11-*) + os=-none + ;; + *-dec | vax-*) + os=-ultrix4.2 + ;; + m68*-apollo) + os=-domain + ;; + i386-sun) + os=-sunos4.0.2 + ;; + m68000-sun) + os=-sunos3 + ;; + m68*-cisco) + os=-aout + ;; + mep-*) + os=-elf + ;; + mips*-cisco) + os=-elf + ;; + mips*-*) + os=-elf + ;; + or32-*) + os=-coff + ;; + *-tti) # must be before sparc entry or we get the wrong os. + os=-sysv3 + ;; + sparc-* | *-sun) + os=-sunos4.1.1 + ;; + *-be) + os=-beos + ;; + *-haiku) + os=-haiku + ;; + *-ibm) + os=-aix + ;; + *-knuth) + os=-mmixware + ;; + *-wec) + os=-proelf + ;; + *-winbond) + os=-proelf + ;; + *-oki) + os=-proelf + ;; + *-hp) + os=-hpux + ;; + *-hitachi) + os=-hiux + ;; + i860-* | *-att | *-ncr | *-altos | *-motorola | *-convergent) + os=-sysv + ;; + *-cbm) + os=-amigaos + ;; + *-dg) + os=-dgux + ;; + *-dolphin) + os=-sysv3 + ;; + m68k-ccur) + os=-rtu + ;; + m88k-omron*) + os=-luna + ;; + *-next ) + os=-nextstep + ;; + *-sequent) + os=-ptx + ;; + *-crds) + os=-unos + ;; + *-ns) + os=-genix + ;; + i370-*) + os=-mvs + ;; + *-next) + os=-nextstep3 + ;; + *-gould) + os=-sysv + ;; + *-highlevel) + os=-bsd + ;; + *-encore) + os=-bsd + ;; + *-sgi) + os=-irix + ;; + *-siemens) + os=-sysv4 + ;; + *-masscomp) + os=-rtu + ;; + f30[01]-fujitsu | f700-fujitsu) + os=-uxpv + ;; + *-rom68k) + os=-coff + ;; + *-*bug) + os=-coff + ;; + *-apple) + os=-macos + ;; + *-atari*) + os=-mint + ;; + *) + os=-none + ;; +esac +fi + +# Here we handle the case where we know the os, and the CPU type, but not the +# manufacturer. We pick the logical manufacturer. +vendor=unknown +case $basic_machine in + *-unknown) + case $os in + -riscix*) + vendor=acorn + ;; + -sunos*) + vendor=sun + ;; + -cnk*|-aix*) + vendor=ibm + ;; + -beos*) + vendor=be + ;; + -hpux*) + vendor=hp + ;; + -mpeix*) + vendor=hp + ;; + -hiux*) + vendor=hitachi + ;; + -unos*) + vendor=crds + ;; + -dgux*) + vendor=dg + ;; + -luna*) + vendor=omron + ;; + -genix*) + vendor=ns + ;; + -mvs* | -opened*) + vendor=ibm + ;; + -os400*) + vendor=ibm + ;; + -ptx*) + vendor=sequent + ;; + -tpf*) + vendor=ibm + ;; + -vxsim* | -vxworks* | -windiss*) + vendor=wrs + ;; + -aux*) + vendor=apple + ;; + -hms*) + vendor=hitachi + ;; + -mpw* | -macos*) + vendor=apple + ;; + -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*) + vendor=atari + ;; + -vos*) + vendor=stratus + ;; + esac + basic_machine=`echo $basic_machine | sed "s/unknown/$vendor/"` + ;; +esac + +echo $basic_machine$os +exit + +# Local variables: +# eval: (add-hook 'write-file-hooks 'time-stamp) +# time-stamp-start: "timestamp='" +# time-stamp-format: "%:y-%02m-%02d" +# time-stamp-end: "'" +# End: diff --git a/pkg/registry/zookeeper-3.4.6/src/c/configure b/pkg/registry/zookeeper-3.4.6/src/c/configure new file mode 100755 index 000000000..cbaf13e8c --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/c/configure @@ -0,0 +1,20613 @@ +#! /bin/sh +# Guess values for system-dependent variables and create Makefiles. +# Generated by GNU Autoconf 2.69 for zookeeper C client 3.4.6. +# +# Report bugs to . +# +# +# Copyright (C) 1992-1996, 1998-2012 Free Software Foundation, Inc. +# +# +# This configure script is free software; the Free Software Foundation +# gives unlimited permission to copy, distribute and modify it. +## -------------------- ## +## M4sh Initialization. ## +## -------------------- ## + +# Be more Bourne compatible +DUALCASE=1; export DUALCASE # for MKS sh +if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : + emulate sh + NULLCMD=: + # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which + # is contrary to our usage. Disable this feature. + alias -g '${1+"$@"}'='"$@"' + setopt NO_GLOB_SUBST +else + case `(set -o) 2>/dev/null` in #( + *posix*) : + set -o posix ;; #( + *) : + ;; +esac +fi + + +as_nl=' +' +export as_nl +# Printing a long string crashes Solaris 7 /usr/bin/printf. +as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' +as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo +as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo +# Prefer a ksh shell builtin over an external printf program on Solaris, +# but without wasting forks for bash or zsh. +if test -z "$BASH_VERSION$ZSH_VERSION" \ + && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then + as_echo='print -r --' + as_echo_n='print -rn --' +elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then + as_echo='printf %s\n' + as_echo_n='printf %s' +else + if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then + as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' + as_echo_n='/usr/ucb/echo -n' + else + as_echo_body='eval expr "X$1" : "X\\(.*\\)"' + as_echo_n_body='eval + arg=$1; + case $arg in #( + *"$as_nl"*) + expr "X$arg" : "X\\(.*\\)$as_nl"; + arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; + esac; + expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" + ' + export as_echo_n_body + as_echo_n='sh -c $as_echo_n_body as_echo' + fi + export as_echo_body + as_echo='sh -c $as_echo_body as_echo' +fi + +# The user is always right. +if test "${PATH_SEPARATOR+set}" != set; then + PATH_SEPARATOR=: + (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { + (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || + PATH_SEPARATOR=';' + } +fi + + +# IFS +# We need space, tab and new line, in precisely that order. Quoting is +# there to prevent editors from complaining about space-tab. +# (If _AS_PATH_WALK were called with IFS unset, it would disable word +# splitting by setting IFS to empty value.) +IFS=" "" $as_nl" + +# Find who we are. Look in the path if we contain no directory separator. +as_myself= +case $0 in #(( + *[\\/]* ) as_myself=$0 ;; + *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break + done +IFS=$as_save_IFS + + ;; +esac +# We did not find ourselves, most probably we were run as `sh COMMAND' +# in which case we are not to be found in the path. +if test "x$as_myself" = x; then + as_myself=$0 +fi +if test ! -f "$as_myself"; then + $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 + exit 1 +fi + +# Unset variables that we do not need and which cause bugs (e.g. in +# pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" +# suppresses any "Segmentation fault" message there. '((' could +# trigger a bug in pdksh 5.2.14. +for as_var in BASH_ENV ENV MAIL MAILPATH +do eval test x\${$as_var+set} = xset \ + && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : +done +PS1='$ ' +PS2='> ' +PS4='+ ' + +# NLS nuisances. +LC_ALL=C +export LC_ALL +LANGUAGE=C +export LANGUAGE + +# CDPATH. +(unset CDPATH) >/dev/null 2>&1 && unset CDPATH + +# Use a proper internal environment variable to ensure we don't fall + # into an infinite loop, continuously re-executing ourselves. + if test x"${_as_can_reexec}" != xno && test "x$CONFIG_SHELL" != x; then + _as_can_reexec=no; export _as_can_reexec; + # We cannot yet assume a decent shell, so we have to provide a +# neutralization value for shells without unset; and this also +# works around shells that cannot unset nonexistent variables. +# Preserve -v and -x to the replacement shell. +BASH_ENV=/dev/null +ENV=/dev/null +(unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV +case $- in # (((( + *v*x* | *x*v* ) as_opts=-vx ;; + *v* ) as_opts=-v ;; + *x* ) as_opts=-x ;; + * ) as_opts= ;; +esac +exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} +# Admittedly, this is quite paranoid, since all the known shells bail +# out after a failed `exec'. +$as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2 +as_fn_exit 255 + fi + # We don't want this to propagate to other subprocesses. + { _as_can_reexec=; unset _as_can_reexec;} +if test "x$CONFIG_SHELL" = x; then + as_bourne_compatible="if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then : + emulate sh + NULLCMD=: + # Pre-4.2 versions of Zsh do word splitting on \${1+\"\$@\"}, which + # is contrary to our usage. Disable this feature. + alias -g '\${1+\"\$@\"}'='\"\$@\"' + setopt NO_GLOB_SUBST +else + case \`(set -o) 2>/dev/null\` in #( + *posix*) : + set -o posix ;; #( + *) : + ;; +esac +fi +" + as_required="as_fn_return () { (exit \$1); } +as_fn_success () { as_fn_return 0; } +as_fn_failure () { as_fn_return 1; } +as_fn_ret_success () { return 0; } +as_fn_ret_failure () { return 1; } + +exitcode=0 +as_fn_success || { exitcode=1; echo as_fn_success failed.; } +as_fn_failure && { exitcode=1; echo as_fn_failure succeeded.; } +as_fn_ret_success || { exitcode=1; echo as_fn_ret_success failed.; } +as_fn_ret_failure && { exitcode=1; echo as_fn_ret_failure succeeded.; } +if ( set x; as_fn_ret_success y && test x = \"\$1\" ); then : + +else + exitcode=1; echo positional parameters were not saved. +fi +test x\$exitcode = x0 || exit 1 +test -x / || exit 1" + as_suggested=" as_lineno_1=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_1a=\$LINENO + as_lineno_2=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_2a=\$LINENO + eval 'test \"x\$as_lineno_1'\$as_run'\" != \"x\$as_lineno_2'\$as_run'\" && + test \"x\`expr \$as_lineno_1'\$as_run' + 1\`\" = \"x\$as_lineno_2'\$as_run'\"' || exit 1 + + test -n \"\${ZSH_VERSION+set}\${BASH_VERSION+set}\" || ( + ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' + ECHO=\$ECHO\$ECHO\$ECHO\$ECHO\$ECHO + ECHO=\$ECHO\$ECHO\$ECHO\$ECHO\$ECHO\$ECHO + PATH=/empty FPATH=/empty; export PATH FPATH + test \"X\`printf %s \$ECHO\`\" = \"X\$ECHO\" \\ + || test \"X\`print -r -- \$ECHO\`\" = \"X\$ECHO\" ) || exit 1 +test \$(( 1 + 1 )) = 2 || exit 1" + if (eval "$as_required") 2>/dev/null; then : + as_have_required=yes +else + as_have_required=no +fi + if test x$as_have_required = xyes && (eval "$as_suggested") 2>/dev/null; then : + +else + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +as_found=false +for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + as_found=: + case $as_dir in #( + /*) + for as_base in sh bash ksh sh5; do + # Try only shells that exist, to save several forks. + as_shell=$as_dir/$as_base + if { test -f "$as_shell" || test -f "$as_shell.exe"; } && + { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$as_shell"; } 2>/dev/null; then : + CONFIG_SHELL=$as_shell as_have_required=yes + if { $as_echo "$as_bourne_compatible""$as_suggested" | as_run=a "$as_shell"; } 2>/dev/null; then : + break 2 +fi +fi + done;; + esac + as_found=false +done +$as_found || { if { test -f "$SHELL" || test -f "$SHELL.exe"; } && + { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$SHELL"; } 2>/dev/null; then : + CONFIG_SHELL=$SHELL as_have_required=yes +fi; } +IFS=$as_save_IFS + + + if test "x$CONFIG_SHELL" != x; then : + export CONFIG_SHELL + # We cannot yet assume a decent shell, so we have to provide a +# neutralization value for shells without unset; and this also +# works around shells that cannot unset nonexistent variables. +# Preserve -v and -x to the replacement shell. +BASH_ENV=/dev/null +ENV=/dev/null +(unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV +case $- in # (((( + *v*x* | *x*v* ) as_opts=-vx ;; + *v* ) as_opts=-v ;; + *x* ) as_opts=-x ;; + * ) as_opts= ;; +esac +exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} +# Admittedly, this is quite paranoid, since all the known shells bail +# out after a failed `exec'. +$as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2 +exit 255 +fi + + if test x$as_have_required = xno; then : + $as_echo "$0: This script requires a shell more modern than all" + $as_echo "$0: the shells that I found on your system." + if test x${ZSH_VERSION+set} = xset ; then + $as_echo "$0: In particular, zsh $ZSH_VERSION has bugs and should" + $as_echo "$0: be upgraded to zsh 4.3.4 or later." + else + $as_echo "$0: Please tell bug-autoconf@gnu.org and +$0: user@zookeeper.apache.org about your system, including +$0: any error possibly output before this message. Then +$0: install a modern shell, or manually run the script +$0: under such a shell if you do have one." + fi + exit 1 +fi +fi +fi +SHELL=${CONFIG_SHELL-/bin/sh} +export SHELL +# Unset more variables known to interfere with behavior of common tools. +CLICOLOR_FORCE= GREP_OPTIONS= +unset CLICOLOR_FORCE GREP_OPTIONS + +## --------------------- ## +## M4sh Shell Functions. ## +## --------------------- ## +# as_fn_unset VAR +# --------------- +# Portably unset VAR. +as_fn_unset () +{ + { eval $1=; unset $1;} +} +as_unset=as_fn_unset + +# as_fn_set_status STATUS +# ----------------------- +# Set $? to STATUS, without forking. +as_fn_set_status () +{ + return $1 +} # as_fn_set_status + +# as_fn_exit STATUS +# ----------------- +# Exit the shell with STATUS, even in a "trap 0" or "set -e" context. +as_fn_exit () +{ + set +e + as_fn_set_status $1 + exit $1 +} # as_fn_exit + +# as_fn_mkdir_p +# ------------- +# Create "$as_dir" as a directory, including parents if necessary. +as_fn_mkdir_p () +{ + + case $as_dir in #( + -*) as_dir=./$as_dir;; + esac + test -d "$as_dir" || eval $as_mkdir_p || { + as_dirs= + while :; do + case $as_dir in #( + *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( + *) as_qdir=$as_dir;; + esac + as_dirs="'$as_qdir' $as_dirs" + as_dir=`$as_dirname -- "$as_dir" || +$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$as_dir" : 'X\(//\)[^/]' \| \ + X"$as_dir" : 'X\(//\)$' \| \ + X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$as_dir" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + test -d "$as_dir" && break + done + test -z "$as_dirs" || eval "mkdir $as_dirs" + } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" + + +} # as_fn_mkdir_p + +# as_fn_executable_p FILE +# ----------------------- +# Test if FILE is an executable regular file. +as_fn_executable_p () +{ + test -f "$1" && test -x "$1" +} # as_fn_executable_p +# as_fn_append VAR VALUE +# ---------------------- +# Append the text in VALUE to the end of the definition contained in VAR. Take +# advantage of any shell optimizations that allow amortized linear growth over +# repeated appends, instead of the typical quadratic growth present in naive +# implementations. +if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : + eval 'as_fn_append () + { + eval $1+=\$2 + }' +else + as_fn_append () + { + eval $1=\$$1\$2 + } +fi # as_fn_append + +# as_fn_arith ARG... +# ------------------ +# Perform arithmetic evaluation on the ARGs, and store the result in the +# global $as_val. Take advantage of shells that can avoid forks. The arguments +# must be portable across $(()) and expr. +if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : + eval 'as_fn_arith () + { + as_val=$(( $* )) + }' +else + as_fn_arith () + { + as_val=`expr "$@" || test $? -eq 1` + } +fi # as_fn_arith + + +# as_fn_error STATUS ERROR [LINENO LOG_FD] +# ---------------------------------------- +# Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are +# provided, also output the error to LOG_FD, referencing LINENO. Then exit the +# script with STATUS, using 1 if that was 0. +as_fn_error () +{ + as_status=$1; test $as_status -eq 0 && as_status=1 + if test "$4"; then + as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 + fi + $as_echo "$as_me: error: $2" >&2 + as_fn_exit $as_status +} # as_fn_error + +if expr a : '\(a\)' >/dev/null 2>&1 && + test "X`expr 00001 : '.*\(...\)'`" = X001; then + as_expr=expr +else + as_expr=false +fi + +if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then + as_basename=basename +else + as_basename=false +fi + +if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then + as_dirname=dirname +else + as_dirname=false +fi + +as_me=`$as_basename -- "$0" || +$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ + X"$0" : 'X\(//\)$' \| \ + X"$0" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X/"$0" | + sed '/^.*\/\([^/][^/]*\)\/*$/{ + s//\1/ + q + } + /^X\/\(\/\/\)$/{ + s//\1/ + q + } + /^X\/\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + +# Avoid depending upon Character Ranges. +as_cr_letters='abcdefghijklmnopqrstuvwxyz' +as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' +as_cr_Letters=$as_cr_letters$as_cr_LETTERS +as_cr_digits='0123456789' +as_cr_alnum=$as_cr_Letters$as_cr_digits + + + as_lineno_1=$LINENO as_lineno_1a=$LINENO + as_lineno_2=$LINENO as_lineno_2a=$LINENO + eval 'test "x$as_lineno_1'$as_run'" != "x$as_lineno_2'$as_run'" && + test "x`expr $as_lineno_1'$as_run' + 1`" = "x$as_lineno_2'$as_run'"' || { + # Blame Lee E. McMahon (1931-1989) for sed's syntax. :-) + sed -n ' + p + /[$]LINENO/= + ' <$as_myself | + sed ' + s/[$]LINENO.*/&-/ + t lineno + b + :lineno + N + :loop + s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/ + t loop + s/-\n.*// + ' >$as_me.lineno && + chmod +x "$as_me.lineno" || + { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; } + + # If we had to re-execute with $CONFIG_SHELL, we're ensured to have + # already done that, so ensure we don't try to do so again and fall + # in an infinite loop. This has already happened in practice. + _as_can_reexec=no; export _as_can_reexec + # Don't try to exec as it changes $[0], causing all sort of problems + # (the dirname of $[0] is not the place where we might find the + # original and so on. Autoconf is especially sensitive to this). + . "./$as_me.lineno" + # Exit status is that of the last command. + exit +} + +ECHO_C= ECHO_N= ECHO_T= +case `echo -n x` in #((((( +-n*) + case `echo 'xy\c'` in + *c*) ECHO_T=' ';; # ECHO_T is single tab character. + xy) ECHO_C='\c';; + *) echo `echo ksh88 bug on AIX 6.1` > /dev/null + ECHO_T=' ';; + esac;; +*) + ECHO_N='-n';; +esac + +rm -f conf$$ conf$$.exe conf$$.file +if test -d conf$$.dir; then + rm -f conf$$.dir/conf$$.file +else + rm -f conf$$.dir + mkdir conf$$.dir 2>/dev/null +fi +if (echo >conf$$.file) 2>/dev/null; then + if ln -s conf$$.file conf$$ 2>/dev/null; then + as_ln_s='ln -s' + # ... but there are two gotchas: + # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. + # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. + # In both cases, we have to default to `cp -pR'. + ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || + as_ln_s='cp -pR' + elif ln conf$$.file conf$$ 2>/dev/null; then + as_ln_s=ln + else + as_ln_s='cp -pR' + fi +else + as_ln_s='cp -pR' +fi +rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file +rmdir conf$$.dir 2>/dev/null + +if mkdir -p . 2>/dev/null; then + as_mkdir_p='mkdir -p "$as_dir"' +else + test -d ./-p && rmdir ./-p + as_mkdir_p=false +fi + +as_test_x='test -x' +as_executable_p=as_fn_executable_p + +# Sed expression to map a string onto a valid CPP name. +as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" + +# Sed expression to map a string onto a valid variable name. +as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" + +SHELL=${CONFIG_SHELL-/bin/sh} + + +test -n "$DJDIR" || exec 7<&0 &1 + +# Name of the host. +# hostname on some systems (SVR3.2, old GNU/Linux) returns a bogus exit status, +# so uname gets run too. +ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q` + +# +# Initializations. +# +ac_default_prefix=/usr/local +ac_clean_files= +ac_config_libobj_dir=. +LIBOBJS= +cross_compiling=no +subdirs= +MFLAGS= +MAKEFLAGS= + +# Identity of this package. +PACKAGE_NAME='zookeeper C client' +PACKAGE_TARNAME='zookeeper' +PACKAGE_VERSION='3.4.6' +PACKAGE_STRING='zookeeper C client 3.4.6' +PACKAGE_BUGREPORT='user@zookeeper.apache.org' +PACKAGE_URL='' + +ac_unique_file="src/zookeeper.c" +# Factoring default headers for most tests. +ac_includes_default="\ +#include +#ifdef HAVE_SYS_TYPES_H +# include +#endif +#ifdef HAVE_SYS_STAT_H +# include +#endif +#ifdef STDC_HEADERS +# include +# include +#else +# ifdef HAVE_STDLIB_H +# include +# endif +#endif +#ifdef HAVE_STRING_H +# if !defined STDC_HEADERS && defined HAVE_MEMORY_H +# include +# endif +# include +#endif +#ifdef HAVE_STRINGS_H +# include +#endif +#ifdef HAVE_INTTYPES_H +# include +#endif +#ifdef HAVE_STDINT_H +# include +#endif +#ifdef HAVE_UNISTD_H +# include +#endif" + +ac_subst_vars='am__EXEEXT_FALSE +am__EXEEXT_TRUE +LTLIBOBJS +LIBOBJS +USEIPV6 +WANT_SYNCAPI_FALSE +WANT_SYNCAPI_TRUE +CXXCPP +CPP +OTOOL64 +OTOOL +LIPO +NMEDIT +DSYMUTIL +MANIFEST_TOOL +RANLIB +ac_ct_AR +AR +DLLTOOL +OBJDUMP +NM +ac_ct_DUMPBIN +DUMPBIN +LD +FGREP +EGREP +GREP +SED +host_os +host_vendor +host_cpu +host +build_os +build_vendor +build_cpu +build +LIBTOOL +LN_S +am__fastdepCXX_FALSE +am__fastdepCXX_TRUE +CXXDEPMODE +ac_ct_CXX +CXXFLAGS +CXX +am__fastdepCC_FALSE +am__fastdepCC_TRUE +CCDEPMODE +am__nodep +AMDEPBACKSLASH +AMDEP_FALSE +AMDEP_TRUE +am__quote +am__include +DEPDIR +OBJEXT +EXEEXT +ac_ct_CC +CPPFLAGS +LDFLAGS +CFLAGS +CC +CPPUNIT_LIBS +CPPUNIT_CFLAGS +CPPUNIT_CONFIG +am__untar +am__tar +AMTAR +am__leading_dot +SET_MAKE +AWK +mkdir_p +MKDIR_P +INSTALL_STRIP_PROGRAM +STRIP +install_sh +MAKEINFO +AUTOHEADER +AUTOMAKE +AUTOCONF +ACLOCAL +VERSION +PACKAGE +CYGPATH_W +am__isrc +INSTALL_DATA +INSTALL_SCRIPT +INSTALL_PROGRAM +DOXYGEN_PAPER_SIZE +DX_COND_latex_FALSE +DX_COND_latex_TRUE +DX_COND_pdf_FALSE +DX_COND_pdf_TRUE +DX_PDFLATEX +DX_FLAG_pdf +DX_COND_ps_FALSE +DX_COND_ps_TRUE +DX_EGREP +DX_DVIPS +DX_MAKEINDEX +DX_LATEX +DX_FLAG_ps +DX_COND_html_FALSE +DX_COND_html_TRUE +DX_FLAG_html +DX_COND_chi_FALSE +DX_COND_chi_TRUE +DX_FLAG_chi +DX_COND_chm_FALSE +DX_COND_chm_TRUE +DX_HHC +DX_FLAG_chm +DX_COND_xml_FALSE +DX_COND_xml_TRUE +DX_FLAG_xml +DX_COND_rtf_FALSE +DX_COND_rtf_TRUE +DX_FLAG_rtf +DX_COND_man_FALSE +DX_COND_man_TRUE +DX_FLAG_man +DX_COND_dot_FALSE +DX_COND_dot_TRUE +DX_DOT +DX_FLAG_dot +DX_COND_doc_FALSE +DX_COND_doc_TRUE +DX_PERL +DX_DOXYGEN +DX_FLAG_doc +DX_ENV +DX_DOCDIR +DX_CONFIG +DX_PROJECT +target_alias +host_alias +build_alias +LIBS +ECHO_T +ECHO_N +ECHO_C +DEFS +mandir +localedir +libdir +psdir +pdfdir +dvidir +htmldir +infodir +docdir +oldincludedir +includedir +localstatedir +sharedstatedir +sysconfdir +datadir +datarootdir +libexecdir +sbindir +bindir +program_transform_name +prefix +exec_prefix +PACKAGE_URL +PACKAGE_BUGREPORT +PACKAGE_STRING +PACKAGE_VERSION +PACKAGE_TARNAME +PACKAGE_NAME +PATH_SEPARATOR +SHELL' +ac_subst_files='' +ac_user_opts=' +enable_option_checking +enable_doxygen_doc +enable_doxygen_dot +enable_doxygen_man +enable_doxygen_rtf +enable_doxygen_xml +enable_doxygen_chm +enable_doxygen_chi +enable_doxygen_html +enable_doxygen_ps +enable_doxygen_pdf +with_cppunit +with_cppunit_prefix +with_cppunit_exec_prefix +enable_dependency_tracking +enable_shared +enable_static +with_pic +enable_fast_install +with_gnu_ld +with_sysroot +enable_libtool_lock +enable_debug +with_syncapi +' + ac_precious_vars='build_alias +host_alias +target_alias +DOXYGEN_PAPER_SIZE +CC +CFLAGS +LDFLAGS +LIBS +CPPFLAGS +CXX +CXXFLAGS +CCC +CPP +CXXCPP' + + +# Initialize some variables set by options. +ac_init_help= +ac_init_version=false +ac_unrecognized_opts= +ac_unrecognized_sep= +# The variables have the same names as the options, with +# dashes changed to underlines. +cache_file=/dev/null +exec_prefix=NONE +no_create= +no_recursion= +prefix=NONE +program_prefix=NONE +program_suffix=NONE +program_transform_name=s,x,x, +silent= +site= +srcdir= +verbose= +x_includes=NONE +x_libraries=NONE + +# Installation directory options. +# These are left unexpanded so users can "make install exec_prefix=/foo" +# and all the variables that are supposed to be based on exec_prefix +# by default will actually change. +# Use braces instead of parens because sh, perl, etc. also accept them. +# (The list follows the same order as the GNU Coding Standards.) +bindir='${exec_prefix}/bin' +sbindir='${exec_prefix}/sbin' +libexecdir='${exec_prefix}/libexec' +datarootdir='${prefix}/share' +datadir='${datarootdir}' +sysconfdir='${prefix}/etc' +sharedstatedir='${prefix}/com' +localstatedir='${prefix}/var' +includedir='${prefix}/include' +oldincludedir='/usr/include' +docdir='${datarootdir}/doc/${PACKAGE_TARNAME}' +infodir='${datarootdir}/info' +htmldir='${docdir}' +dvidir='${docdir}' +pdfdir='${docdir}' +psdir='${docdir}' +libdir='${exec_prefix}/lib' +localedir='${datarootdir}/locale' +mandir='${datarootdir}/man' + +ac_prev= +ac_dashdash= +for ac_option +do + # If the previous option needs an argument, assign it. + if test -n "$ac_prev"; then + eval $ac_prev=\$ac_option + ac_prev= + continue + fi + + case $ac_option in + *=?*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;; + *=) ac_optarg= ;; + *) ac_optarg=yes ;; + esac + + # Accept the important Cygnus configure options, so we can diagnose typos. + + case $ac_dashdash$ac_option in + --) + ac_dashdash=yes ;; + + -bindir | --bindir | --bindi | --bind | --bin | --bi) + ac_prev=bindir ;; + -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*) + bindir=$ac_optarg ;; + + -build | --build | --buil | --bui | --bu) + ac_prev=build_alias ;; + -build=* | --build=* | --buil=* | --bui=* | --bu=*) + build_alias=$ac_optarg ;; + + -cache-file | --cache-file | --cache-fil | --cache-fi \ + | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c) + ac_prev=cache_file ;; + -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \ + | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*) + cache_file=$ac_optarg ;; + + --config-cache | -C) + cache_file=config.cache ;; + + -datadir | --datadir | --datadi | --datad) + ac_prev=datadir ;; + -datadir=* | --datadir=* | --datadi=* | --datad=*) + datadir=$ac_optarg ;; + + -datarootdir | --datarootdir | --datarootdi | --datarootd | --dataroot \ + | --dataroo | --dataro | --datar) + ac_prev=datarootdir ;; + -datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \ + | --dataroot=* | --dataroo=* | --dataro=* | --datar=*) + datarootdir=$ac_optarg ;; + + -disable-* | --disable-*) + ac_useropt=`expr "x$ac_option" : 'x-*disable-\(.*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && + as_fn_error $? "invalid feature name: $ac_useropt" + ac_useropt_orig=$ac_useropt + ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` + case $ac_user_opts in + *" +"enable_$ac_useropt" +"*) ;; + *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--disable-$ac_useropt_orig" + ac_unrecognized_sep=', ';; + esac + eval enable_$ac_useropt=no ;; + + -docdir | --docdir | --docdi | --doc | --do) + ac_prev=docdir ;; + -docdir=* | --docdir=* | --docdi=* | --doc=* | --do=*) + docdir=$ac_optarg ;; + + -dvidir | --dvidir | --dvidi | --dvid | --dvi | --dv) + ac_prev=dvidir ;; + -dvidir=* | --dvidir=* | --dvidi=* | --dvid=* | --dvi=* | --dv=*) + dvidir=$ac_optarg ;; + + -enable-* | --enable-*) + ac_useropt=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && + as_fn_error $? "invalid feature name: $ac_useropt" + ac_useropt_orig=$ac_useropt + ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` + case $ac_user_opts in + *" +"enable_$ac_useropt" +"*) ;; + *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--enable-$ac_useropt_orig" + ac_unrecognized_sep=', ';; + esac + eval enable_$ac_useropt=\$ac_optarg ;; + + -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \ + | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \ + | --exec | --exe | --ex) + ac_prev=exec_prefix ;; + -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \ + | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \ + | --exec=* | --exe=* | --ex=*) + exec_prefix=$ac_optarg ;; + + -gas | --gas | --ga | --g) + # Obsolete; use --with-gas. + with_gas=yes ;; + + -help | --help | --hel | --he | -h) + ac_init_help=long ;; + -help=r* | --help=r* | --hel=r* | --he=r* | -hr*) + ac_init_help=recursive ;; + -help=s* | --help=s* | --hel=s* | --he=s* | -hs*) + ac_init_help=short ;; + + -host | --host | --hos | --ho) + ac_prev=host_alias ;; + -host=* | --host=* | --hos=* | --ho=*) + host_alias=$ac_optarg ;; + + -htmldir | --htmldir | --htmldi | --htmld | --html | --htm | --ht) + ac_prev=htmldir ;; + -htmldir=* | --htmldir=* | --htmldi=* | --htmld=* | --html=* | --htm=* \ + | --ht=*) + htmldir=$ac_optarg ;; + + -includedir | --includedir | --includedi | --included | --include \ + | --includ | --inclu | --incl | --inc) + ac_prev=includedir ;; + -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \ + | --includ=* | --inclu=* | --incl=* | --inc=*) + includedir=$ac_optarg ;; + + -infodir | --infodir | --infodi | --infod | --info | --inf) + ac_prev=infodir ;; + -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*) + infodir=$ac_optarg ;; + + -libdir | --libdir | --libdi | --libd) + ac_prev=libdir ;; + -libdir=* | --libdir=* | --libdi=* | --libd=*) + libdir=$ac_optarg ;; + + -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \ + | --libexe | --libex | --libe) + ac_prev=libexecdir ;; + -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \ + | --libexe=* | --libex=* | --libe=*) + libexecdir=$ac_optarg ;; + + -localedir | --localedir | --localedi | --localed | --locale) + ac_prev=localedir ;; + -localedir=* | --localedir=* | --localedi=* | --localed=* | --locale=*) + localedir=$ac_optarg ;; + + -localstatedir | --localstatedir | --localstatedi | --localstated \ + | --localstate | --localstat | --localsta | --localst | --locals) + ac_prev=localstatedir ;; + -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \ + | --localstate=* | --localstat=* | --localsta=* | --localst=* | --locals=*) + localstatedir=$ac_optarg ;; + + -mandir | --mandir | --mandi | --mand | --man | --ma | --m) + ac_prev=mandir ;; + -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*) + mandir=$ac_optarg ;; + + -nfp | --nfp | --nf) + # Obsolete; use --without-fp. + with_fp=no ;; + + -no-create | --no-create | --no-creat | --no-crea | --no-cre \ + | --no-cr | --no-c | -n) + no_create=yes ;; + + -no-recursion | --no-recursion | --no-recursio | --no-recursi \ + | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) + no_recursion=yes ;; + + -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \ + | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \ + | --oldin | --oldi | --old | --ol | --o) + ac_prev=oldincludedir ;; + -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \ + | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \ + | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*) + oldincludedir=$ac_optarg ;; + + -prefix | --prefix | --prefi | --pref | --pre | --pr | --p) + ac_prev=prefix ;; + -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*) + prefix=$ac_optarg ;; + + -program-prefix | --program-prefix | --program-prefi | --program-pref \ + | --program-pre | --program-pr | --program-p) + ac_prev=program_prefix ;; + -program-prefix=* | --program-prefix=* | --program-prefi=* \ + | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*) + program_prefix=$ac_optarg ;; + + -program-suffix | --program-suffix | --program-suffi | --program-suff \ + | --program-suf | --program-su | --program-s) + ac_prev=program_suffix ;; + -program-suffix=* | --program-suffix=* | --program-suffi=* \ + | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*) + program_suffix=$ac_optarg ;; + + -program-transform-name | --program-transform-name \ + | --program-transform-nam | --program-transform-na \ + | --program-transform-n | --program-transform- \ + | --program-transform | --program-transfor \ + | --program-transfo | --program-transf \ + | --program-trans | --program-tran \ + | --progr-tra | --program-tr | --program-t) + ac_prev=program_transform_name ;; + -program-transform-name=* | --program-transform-name=* \ + | --program-transform-nam=* | --program-transform-na=* \ + | --program-transform-n=* | --program-transform-=* \ + | --program-transform=* | --program-transfor=* \ + | --program-transfo=* | --program-transf=* \ + | --program-trans=* | --program-tran=* \ + | --progr-tra=* | --program-tr=* | --program-t=*) + program_transform_name=$ac_optarg ;; + + -pdfdir | --pdfdir | --pdfdi | --pdfd | --pdf | --pd) + ac_prev=pdfdir ;; + -pdfdir=* | --pdfdir=* | --pdfdi=* | --pdfd=* | --pdf=* | --pd=*) + pdfdir=$ac_optarg ;; + + -psdir | --psdir | --psdi | --psd | --ps) + ac_prev=psdir ;; + -psdir=* | --psdir=* | --psdi=* | --psd=* | --ps=*) + psdir=$ac_optarg ;; + + -q | -quiet | --quiet | --quie | --qui | --qu | --q \ + | -silent | --silent | --silen | --sile | --sil) + silent=yes ;; + + -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb) + ac_prev=sbindir ;; + -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \ + | --sbi=* | --sb=*) + sbindir=$ac_optarg ;; + + -sharedstatedir | --sharedstatedir | --sharedstatedi \ + | --sharedstated | --sharedstate | --sharedstat | --sharedsta \ + | --sharedst | --shareds | --shared | --share | --shar \ + | --sha | --sh) + ac_prev=sharedstatedir ;; + -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \ + | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \ + | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \ + | --sha=* | --sh=*) + sharedstatedir=$ac_optarg ;; + + -site | --site | --sit) + ac_prev=site ;; + -site=* | --site=* | --sit=*) + site=$ac_optarg ;; + + -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) + ac_prev=srcdir ;; + -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) + srcdir=$ac_optarg ;; + + -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \ + | --syscon | --sysco | --sysc | --sys | --sy) + ac_prev=sysconfdir ;; + -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \ + | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*) + sysconfdir=$ac_optarg ;; + + -target | --target | --targe | --targ | --tar | --ta | --t) + ac_prev=target_alias ;; + -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*) + target_alias=$ac_optarg ;; + + -v | -verbose | --verbose | --verbos | --verbo | --verb) + verbose=yes ;; + + -version | --version | --versio | --versi | --vers | -V) + ac_init_version=: ;; + + -with-* | --with-*) + ac_useropt=`expr "x$ac_option" : 'x-*with-\([^=]*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && + as_fn_error $? "invalid package name: $ac_useropt" + ac_useropt_orig=$ac_useropt + ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` + case $ac_user_opts in + *" +"with_$ac_useropt" +"*) ;; + *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--with-$ac_useropt_orig" + ac_unrecognized_sep=', ';; + esac + eval with_$ac_useropt=\$ac_optarg ;; + + -without-* | --without-*) + ac_useropt=`expr "x$ac_option" : 'x-*without-\(.*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && + as_fn_error $? "invalid package name: $ac_useropt" + ac_useropt_orig=$ac_useropt + ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` + case $ac_user_opts in + *" +"with_$ac_useropt" +"*) ;; + *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--without-$ac_useropt_orig" + ac_unrecognized_sep=', ';; + esac + eval with_$ac_useropt=no ;; + + --x) + # Obsolete; use --with-x. + with_x=yes ;; + + -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \ + | --x-incl | --x-inc | --x-in | --x-i) + ac_prev=x_includes ;; + -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \ + | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*) + x_includes=$ac_optarg ;; + + -x-libraries | --x-libraries | --x-librarie | --x-librari \ + | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l) + ac_prev=x_libraries ;; + -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \ + | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*) + x_libraries=$ac_optarg ;; + + -*) as_fn_error $? "unrecognized option: \`$ac_option' +Try \`$0 --help' for more information" + ;; + + *=*) + ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='` + # Reject names that are not valid shell variable names. + case $ac_envvar in #( + '' | [0-9]* | *[!_$as_cr_alnum]* ) + as_fn_error $? "invalid variable name: \`$ac_envvar'" ;; + esac + eval $ac_envvar=\$ac_optarg + export $ac_envvar ;; + + *) + # FIXME: should be removed in autoconf 3.0. + $as_echo "$as_me: WARNING: you should use --build, --host, --target" >&2 + expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null && + $as_echo "$as_me: WARNING: invalid host type: $ac_option" >&2 + : "${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}" + ;; + + esac +done + +if test -n "$ac_prev"; then + ac_option=--`echo $ac_prev | sed 's/_/-/g'` + as_fn_error $? "missing argument to $ac_option" +fi + +if test -n "$ac_unrecognized_opts"; then + case $enable_option_checking in + no) ;; + fatal) as_fn_error $? "unrecognized options: $ac_unrecognized_opts" ;; + *) $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 ;; + esac +fi + +# Check all directory arguments for consistency. +for ac_var in exec_prefix prefix bindir sbindir libexecdir datarootdir \ + datadir sysconfdir sharedstatedir localstatedir includedir \ + oldincludedir docdir infodir htmldir dvidir pdfdir psdir \ + libdir localedir mandir +do + eval ac_val=\$$ac_var + # Remove trailing slashes. + case $ac_val in + */ ) + ac_val=`expr "X$ac_val" : 'X\(.*[^/]\)' \| "X$ac_val" : 'X\(.*\)'` + eval $ac_var=\$ac_val;; + esac + # Be sure to have absolute directory names. + case $ac_val in + [\\/$]* | ?:[\\/]* ) continue;; + NONE | '' ) case $ac_var in *prefix ) continue;; esac;; + esac + as_fn_error $? "expected an absolute directory name for --$ac_var: $ac_val" +done + +# There might be people who depend on the old broken behavior: `$host' +# used to hold the argument of --host etc. +# FIXME: To remove some day. +build=$build_alias +host=$host_alias +target=$target_alias + +# FIXME: To remove some day. +if test "x$host_alias" != x; then + if test "x$build_alias" = x; then + cross_compiling=maybe + elif test "x$build_alias" != "x$host_alias"; then + cross_compiling=yes + fi +fi + +ac_tool_prefix= +test -n "$host_alias" && ac_tool_prefix=$host_alias- + +test "$silent" = yes && exec 6>/dev/null + + +ac_pwd=`pwd` && test -n "$ac_pwd" && +ac_ls_di=`ls -di .` && +ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` || + as_fn_error $? "working directory cannot be determined" +test "X$ac_ls_di" = "X$ac_pwd_ls_di" || + as_fn_error $? "pwd does not report name of working directory" + + +# Find the source files, if location was not specified. +if test -z "$srcdir"; then + ac_srcdir_defaulted=yes + # Try the directory containing this script, then the parent directory. + ac_confdir=`$as_dirname -- "$as_myself" || +$as_expr X"$as_myself" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$as_myself" : 'X\(//\)[^/]' \| \ + X"$as_myself" : 'X\(//\)$' \| \ + X"$as_myself" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$as_myself" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + srcdir=$ac_confdir + if test ! -r "$srcdir/$ac_unique_file"; then + srcdir=.. + fi +else + ac_srcdir_defaulted=no +fi +if test ! -r "$srcdir/$ac_unique_file"; then + test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .." + as_fn_error $? "cannot find sources ($ac_unique_file) in $srcdir" +fi +ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work" +ac_abs_confdir=`( + cd "$srcdir" && test -r "./$ac_unique_file" || as_fn_error $? "$ac_msg" + pwd)` +# When building in place, set srcdir=. +if test "$ac_abs_confdir" = "$ac_pwd"; then + srcdir=. +fi +# Remove unnecessary trailing slashes from srcdir. +# Double slashes in file names in object file debugging info +# mess up M-x gdb in Emacs. +case $srcdir in +*/) srcdir=`expr "X$srcdir" : 'X\(.*[^/]\)' \| "X$srcdir" : 'X\(.*\)'`;; +esac +for ac_var in $ac_precious_vars; do + eval ac_env_${ac_var}_set=\${${ac_var}+set} + eval ac_env_${ac_var}_value=\$${ac_var} + eval ac_cv_env_${ac_var}_set=\${${ac_var}+set} + eval ac_cv_env_${ac_var}_value=\$${ac_var} +done + +# +# Report the --help message. +# +if test "$ac_init_help" = "long"; then + # Omit some internal or obsolete options to make the list less imposing. + # This message is too long to be a string in the A/UX 3.1 sh. + cat <<_ACEOF +\`configure' configures zookeeper C client 3.4.6 to adapt to many kinds of systems. + +Usage: $0 [OPTION]... [VAR=VALUE]... + +To assign environment variables (e.g., CC, CFLAGS...), specify them as +VAR=VALUE. See below for descriptions of some of the useful variables. + +Defaults for the options are specified in brackets. + +Configuration: + -h, --help display this help and exit + --help=short display options specific to this package + --help=recursive display the short help of all the included packages + -V, --version display version information and exit + -q, --quiet, --silent do not print \`checking ...' messages + --cache-file=FILE cache test results in FILE [disabled] + -C, --config-cache alias for \`--cache-file=config.cache' + -n, --no-create do not create output files + --srcdir=DIR find the sources in DIR [configure dir or \`..'] + +Installation directories: + --prefix=PREFIX install architecture-independent files in PREFIX + [$ac_default_prefix] + --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX + [PREFIX] + +By default, \`make install' will install all the files in +\`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc. You can specify +an installation prefix other than \`$ac_default_prefix' using \`--prefix', +for instance \`--prefix=\$HOME'. + +For better control, use the options below. + +Fine tuning of the installation directories: + --bindir=DIR user executables [EPREFIX/bin] + --sbindir=DIR system admin executables [EPREFIX/sbin] + --libexecdir=DIR program executables [EPREFIX/libexec] + --sysconfdir=DIR read-only single-machine data [PREFIX/etc] + --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com] + --localstatedir=DIR modifiable single-machine data [PREFIX/var] + --libdir=DIR object code libraries [EPREFIX/lib] + --includedir=DIR C header files [PREFIX/include] + --oldincludedir=DIR C header files for non-gcc [/usr/include] + --datarootdir=DIR read-only arch.-independent data root [PREFIX/share] + --datadir=DIR read-only architecture-independent data [DATAROOTDIR] + --infodir=DIR info documentation [DATAROOTDIR/info] + --localedir=DIR locale-dependent data [DATAROOTDIR/locale] + --mandir=DIR man documentation [DATAROOTDIR/man] + --docdir=DIR documentation root [DATAROOTDIR/doc/zookeeper] + --htmldir=DIR html documentation [DOCDIR] + --dvidir=DIR dvi documentation [DOCDIR] + --pdfdir=DIR pdf documentation [DOCDIR] + --psdir=DIR ps documentation [DOCDIR] +_ACEOF + + cat <<\_ACEOF + +Program names: + --program-prefix=PREFIX prepend PREFIX to installed program names + --program-suffix=SUFFIX append SUFFIX to installed program names + --program-transform-name=PROGRAM run sed PROGRAM on installed program names + +System types: + --build=BUILD configure for building on BUILD [guessed] + --host=HOST cross-compile to build programs to run on HOST [BUILD] +_ACEOF +fi + +if test -n "$ac_init_help"; then + case $ac_init_help in + short | recursive ) echo "Configuration of zookeeper C client 3.4.6:";; + esac + cat <<\_ACEOF + +Optional Features: + --disable-option-checking ignore unrecognized --enable/--with options + --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) + --enable-FEATURE[=ARG] include FEATURE [ARG=yes] + --disable-doxygen-doc don't generate any doxygen documentation + --disable-doxygen-dot don't generate graphics for doxygen documentation + --enable-doxygen-man generate doxygen manual pages + --enable-doxygen-rtf generate doxygen RTF documentation + --enable-doxygen-xml generate doxygen XML documentation + --enable-doxygen-chm generate doxygen compressed HTML help documentation + --enable-doxygen-chi generate doxygen seperate compressed HTML help index + file + --disable-doxygen-html don't generate doxygen plain HTML documentation + --enable-doxygen-ps generate doxygen PostScript documentation + --enable-doxygen-pdf generate doxygen PDF documentation + --disable-dependency-tracking speeds up one-time build + --enable-dependency-tracking do not reject slow dependency extractors + --enable-shared[=PKGS] build shared libraries [default=yes] + --enable-static[=PKGS] build static libraries [default=yes] + --enable-fast-install[=PKGS] + optimize for fast installation [default=yes] + --disable-libtool-lock avoid locking (might break parallel builds) + --enable-debug enable debug build [default=no] + +Optional Packages: + --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] + --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) + --without-cppunit do not use CPPUNIT + --with-cppunit-prefix=PFX Prefix where CppUnit is installed (optional) + --with-cppunit-exec-prefix=PFX Exec prefix where CppUnit is installed (optional) + --with-pic[=PKGS] try to use only PIC/non-PIC objects [default=use + both] + --with-gnu-ld assume the C compiler uses GNU ld [default=no] + --with-sysroot=DIR Search for dependent libraries within DIR + (or the compiler's sysroot if not specified). + --with-syncapi build with support for SyncAPI [default=yes] + +Some influential environment variables: + DOXYGEN_PAPER_SIZE + a4wide (default), a4, letter, legal or executive + CC C compiler command + CFLAGS C compiler flags + LDFLAGS linker flags, e.g. -L if you have libraries in a + nonstandard directory + LIBS libraries to pass to the linker, e.g. -l + CPPFLAGS (Objective) C/C++ preprocessor flags, e.g. -I if + you have headers in a nonstandard directory + CXX C++ compiler command + CXXFLAGS C++ compiler flags + CPP C preprocessor + CXXCPP C++ preprocessor + +Use these variables to override the choices made by `configure' or to help +it to find libraries and programs with nonstandard names/locations. + +Report bugs to . +_ACEOF +ac_status=$? +fi + +if test "$ac_init_help" = "recursive"; then + # If there are subdirs, report their specific --help. + for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue + test -d "$ac_dir" || + { cd "$srcdir" && ac_pwd=`pwd` && srcdir=. && test -d "$ac_dir"; } || + continue + ac_builddir=. + +case "$ac_dir" in +.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; +*) + ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` + # A ".." for each directory in $ac_dir_suffix. + ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` + case $ac_top_builddir_sub in + "") ac_top_builddir_sub=. ac_top_build_prefix= ;; + *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; + esac ;; +esac +ac_abs_top_builddir=$ac_pwd +ac_abs_builddir=$ac_pwd$ac_dir_suffix +# for backward compatibility: +ac_top_builddir=$ac_top_build_prefix + +case $srcdir in + .) # We are building in place. + ac_srcdir=. + ac_top_srcdir=$ac_top_builddir_sub + ac_abs_top_srcdir=$ac_pwd ;; + [\\/]* | ?:[\\/]* ) # Absolute name. + ac_srcdir=$srcdir$ac_dir_suffix; + ac_top_srcdir=$srcdir + ac_abs_top_srcdir=$srcdir ;; + *) # Relative name. + ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix + ac_top_srcdir=$ac_top_build_prefix$srcdir + ac_abs_top_srcdir=$ac_pwd/$srcdir ;; +esac +ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix + + cd "$ac_dir" || { ac_status=$?; continue; } + # Check for guested configure. + if test -f "$ac_srcdir/configure.gnu"; then + echo && + $SHELL "$ac_srcdir/configure.gnu" --help=recursive + elif test -f "$ac_srcdir/configure"; then + echo && + $SHELL "$ac_srcdir/configure" --help=recursive + else + $as_echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2 + fi || ac_status=$? + cd "$ac_pwd" || { ac_status=$?; break; } + done +fi + +test -n "$ac_init_help" && exit $ac_status +if $ac_init_version; then + cat <<\_ACEOF +zookeeper C client configure 3.4.6 +generated by GNU Autoconf 2.69 + +Copyright (C) 2012 Free Software Foundation, Inc. +This configure script is free software; the Free Software Foundation +gives unlimited permission to copy, distribute and modify it. +_ACEOF + exit +fi + +## ------------------------ ## +## Autoconf initialization. ## +## ------------------------ ## + +# ac_fn_c_try_compile LINENO +# -------------------------- +# Try to compile conftest.$ac_ext, and return whether this succeeded. +ac_fn_c_try_compile () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + rm -f conftest.$ac_objext + if { { ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_compile") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + grep -v '^ *+' conftest.err >conftest.er1 + cat conftest.er1 >&5 + mv -f conftest.er1 conftest.err + fi + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then : + ac_retval=0 +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_retval=1 +fi + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + as_fn_set_status $ac_retval + +} # ac_fn_c_try_compile + +# ac_fn_cxx_try_compile LINENO +# ---------------------------- +# Try to compile conftest.$ac_ext, and return whether this succeeded. +ac_fn_cxx_try_compile () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + rm -f conftest.$ac_objext + if { { ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_compile") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + grep -v '^ *+' conftest.err >conftest.er1 + cat conftest.er1 >&5 + mv -f conftest.er1 conftest.err + fi + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then : + ac_retval=0 +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_retval=1 +fi + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + as_fn_set_status $ac_retval + +} # ac_fn_cxx_try_compile + +# ac_fn_c_try_link LINENO +# ----------------------- +# Try to link conftest.$ac_ext, and return whether this succeeded. +ac_fn_c_try_link () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + rm -f conftest.$ac_objext conftest$ac_exeext + if { { ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_link") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + grep -v '^ *+' conftest.err >conftest.er1 + cat conftest.er1 >&5 + mv -f conftest.er1 conftest.err + fi + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && { + test "$cross_compiling" = yes || + test -x conftest$ac_exeext + }; then : + ac_retval=0 +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_retval=1 +fi + # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information + # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would + # interfere with the next link command; also delete a directory that is + # left behind by Apple's compiler. We do this before executing the actions. + rm -rf conftest.dSYM conftest_ipa8_conftest.oo + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + as_fn_set_status $ac_retval + +} # ac_fn_c_try_link + +# ac_fn_c_check_header_compile LINENO HEADER VAR INCLUDES +# ------------------------------------------------------- +# Tests whether HEADER exists and can be compiled using the include files in +# INCLUDES, setting the cache variable VAR accordingly. +ac_fn_c_check_header_compile () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 +$as_echo_n "checking for $2... " >&6; } +if eval \${$3+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$4 +#include <$2> +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + eval "$3=yes" +else + eval "$3=no" +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +eval ac_res=\$$3 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + +} # ac_fn_c_check_header_compile + +# ac_fn_c_try_cpp LINENO +# ---------------------- +# Try to preprocess conftest.$ac_ext, and return whether this succeeded. +ac_fn_c_try_cpp () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + if { { ac_try="$ac_cpp conftest.$ac_ext" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + grep -v '^ *+' conftest.err >conftest.er1 + cat conftest.er1 >&5 + mv -f conftest.er1 conftest.err + fi + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } > conftest.i && { + test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || + test ! -s conftest.err + }; then : + ac_retval=0 +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_retval=1 +fi + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + as_fn_set_status $ac_retval + +} # ac_fn_c_try_cpp + +# ac_fn_c_try_run LINENO +# ---------------------- +# Try to link conftest.$ac_ext, and return whether this succeeded. Assumes +# that executables *can* be run. +ac_fn_c_try_run () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + if { { ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_link") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && { ac_try='./conftest$ac_exeext' + { { case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; }; then : + ac_retval=0 +else + $as_echo "$as_me: program exited with status $ac_status" >&5 + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_retval=$ac_status +fi + rm -rf conftest.dSYM conftest_ipa8_conftest.oo + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + as_fn_set_status $ac_retval + +} # ac_fn_c_try_run + +# ac_fn_c_check_func LINENO FUNC VAR +# ---------------------------------- +# Tests whether FUNC exists, setting the cache variable VAR accordingly +ac_fn_c_check_func () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 +$as_echo_n "checking for $2... " >&6; } +if eval \${$3+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +/* Define $2 to an innocuous variant, in case declares $2. + For example, HP-UX 11i declares gettimeofday. */ +#define $2 innocuous_$2 + +/* System header to define __stub macros and hopefully few prototypes, + which can conflict with char $2 (); below. + Prefer to if __STDC__ is defined, since + exists even on freestanding compilers. */ + +#ifdef __STDC__ +# include +#else +# include +#endif + +#undef $2 + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char $2 (); +/* The GNU C library defines this for functions which it implements + to always fail with ENOSYS. Some functions are actually named + something starting with __ and the normal name is an alias. */ +#if defined __stub_$2 || defined __stub___$2 +choke me +#endif + +int +main () +{ +return $2 (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + eval "$3=yes" +else + eval "$3=no" +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +fi +eval ac_res=\$$3 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + +} # ac_fn_c_check_func + +# ac_fn_cxx_try_cpp LINENO +# ------------------------ +# Try to preprocess conftest.$ac_ext, and return whether this succeeded. +ac_fn_cxx_try_cpp () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + if { { ac_try="$ac_cpp conftest.$ac_ext" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + grep -v '^ *+' conftest.err >conftest.er1 + cat conftest.er1 >&5 + mv -f conftest.er1 conftest.err + fi + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } > conftest.i && { + test -z "$ac_cxx_preproc_warn_flag$ac_cxx_werror_flag" || + test ! -s conftest.err + }; then : + ac_retval=0 +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_retval=1 +fi + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + as_fn_set_status $ac_retval + +} # ac_fn_cxx_try_cpp + +# ac_fn_cxx_try_link LINENO +# ------------------------- +# Try to link conftest.$ac_ext, and return whether this succeeded. +ac_fn_cxx_try_link () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + rm -f conftest.$ac_objext conftest$ac_exeext + if { { ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_link") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + grep -v '^ *+' conftest.err >conftest.er1 + cat conftest.er1 >&5 + mv -f conftest.er1 conftest.err + fi + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && { + test "$cross_compiling" = yes || + test -x conftest$ac_exeext + }; then : + ac_retval=0 +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_retval=1 +fi + # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information + # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would + # interfere with the next link command; also delete a directory that is + # left behind by Apple's compiler. We do this before executing the actions. + rm -rf conftest.dSYM conftest_ipa8_conftest.oo + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + as_fn_set_status $ac_retval + +} # ac_fn_cxx_try_link + +# ac_fn_c_check_header_mongrel LINENO HEADER VAR INCLUDES +# ------------------------------------------------------- +# Tests whether HEADER exists, giving a warning if it cannot be compiled using +# the include files in INCLUDES and setting the cache variable VAR +# accordingly. +ac_fn_c_check_header_mongrel () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + if eval \${$3+:} false; then : + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 +$as_echo_n "checking for $2... " >&6; } +if eval \${$3+:} false; then : + $as_echo_n "(cached) " >&6 +fi +eval ac_res=\$$3 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } +else + # Is the header compilable? +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 usability" >&5 +$as_echo_n "checking $2 usability... " >&6; } +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$4 +#include <$2> +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_header_compiler=yes +else + ac_header_compiler=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_compiler" >&5 +$as_echo "$ac_header_compiler" >&6; } + +# Is the header present? +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 presence" >&5 +$as_echo_n "checking $2 presence... " >&6; } +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include <$2> +_ACEOF +if ac_fn_c_try_cpp "$LINENO"; then : + ac_header_preproc=yes +else + ac_header_preproc=no +fi +rm -f conftest.err conftest.i conftest.$ac_ext +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_preproc" >&5 +$as_echo "$ac_header_preproc" >&6; } + +# So? What about this header? +case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in #(( + yes:no: ) + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&5 +$as_echo "$as_me: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 +$as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} + ;; + no:yes:* ) + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: present but cannot be compiled" >&5 +$as_echo "$as_me: WARNING: $2: present but cannot be compiled" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: check for missing prerequisite headers?" >&5 +$as_echo "$as_me: WARNING: $2: check for missing prerequisite headers?" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: see the Autoconf documentation" >&5 +$as_echo "$as_me: WARNING: $2: see the Autoconf documentation" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&5 +$as_echo "$as_me: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 +$as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} +( $as_echo "## ---------------------------------------- ## +## Report this to user@zookeeper.apache.org ## +## ---------------------------------------- ##" + ) | sed "s/^/$as_me: WARNING: /" >&2 + ;; +esac + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 +$as_echo_n "checking for $2... " >&6; } +if eval \${$3+:} false; then : + $as_echo_n "(cached) " >&6 +else + eval "$3=\$ac_header_compiler" +fi +eval ac_res=\$$3 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } +fi + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + +} # ac_fn_c_check_header_mongrel + +# ac_fn_c_check_type LINENO TYPE VAR INCLUDES +# ------------------------------------------- +# Tests whether TYPE exists after having included INCLUDES, setting cache +# variable VAR accordingly. +ac_fn_c_check_type () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 +$as_echo_n "checking for $2... " >&6; } +if eval \${$3+:} false; then : + $as_echo_n "(cached) " >&6 +else + eval "$3=no" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$4 +int +main () +{ +if (sizeof ($2)) + return 0; + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$4 +int +main () +{ +if (sizeof (($2))) + return 0; + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + +else + eval "$3=yes" +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +eval ac_res=\$$3 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + +} # ac_fn_c_check_type +cat >config.log <<_ACEOF +This file contains any messages produced by compilers while +running configure, to aid debugging if configure makes a mistake. + +It was created by zookeeper C client $as_me 3.4.6, which was +generated by GNU Autoconf 2.69. Invocation command line was + + $ $0 $@ + +_ACEOF +exec 5>>config.log +{ +cat <<_ASUNAME +## --------- ## +## Platform. ## +## --------- ## + +hostname = `(hostname || uname -n) 2>/dev/null | sed 1q` +uname -m = `(uname -m) 2>/dev/null || echo unknown` +uname -r = `(uname -r) 2>/dev/null || echo unknown` +uname -s = `(uname -s) 2>/dev/null || echo unknown` +uname -v = `(uname -v) 2>/dev/null || echo unknown` + +/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown` +/bin/uname -X = `(/bin/uname -X) 2>/dev/null || echo unknown` + +/bin/arch = `(/bin/arch) 2>/dev/null || echo unknown` +/usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null || echo unknown` +/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown` +/usr/bin/hostinfo = `(/usr/bin/hostinfo) 2>/dev/null || echo unknown` +/bin/machine = `(/bin/machine) 2>/dev/null || echo unknown` +/usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null || echo unknown` +/bin/universe = `(/bin/universe) 2>/dev/null || echo unknown` + +_ASUNAME + +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + $as_echo "PATH: $as_dir" + done +IFS=$as_save_IFS + +} >&5 + +cat >&5 <<_ACEOF + + +## ----------- ## +## Core tests. ## +## ----------- ## + +_ACEOF + + +# Keep a trace of the command line. +# Strip out --no-create and --no-recursion so they do not pile up. +# Strip out --silent because we don't want to record it for future runs. +# Also quote any args containing shell meta-characters. +# Make two passes to allow for proper duplicate-argument suppression. +ac_configure_args= +ac_configure_args0= +ac_configure_args1= +ac_must_keep_next=false +for ac_pass in 1 2 +do + for ac_arg + do + case $ac_arg in + -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;; + -q | -quiet | --quiet | --quie | --qui | --qu | --q \ + | -silent | --silent | --silen | --sile | --sil) + continue ;; + *\'*) + ac_arg=`$as_echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; + esac + case $ac_pass in + 1) as_fn_append ac_configure_args0 " '$ac_arg'" ;; + 2) + as_fn_append ac_configure_args1 " '$ac_arg'" + if test $ac_must_keep_next = true; then + ac_must_keep_next=false # Got value, back to normal. + else + case $ac_arg in + *=* | --config-cache | -C | -disable-* | --disable-* \ + | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \ + | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \ + | -with-* | --with-* | -without-* | --without-* | --x) + case "$ac_configure_args0 " in + "$ac_configure_args1"*" '$ac_arg' "* ) continue ;; + esac + ;; + -* ) ac_must_keep_next=true ;; + esac + fi + as_fn_append ac_configure_args " '$ac_arg'" + ;; + esac + done +done +{ ac_configure_args0=; unset ac_configure_args0;} +{ ac_configure_args1=; unset ac_configure_args1;} + +# When interrupted or exit'd, cleanup temporary files, and complete +# config.log. We remove comments because anyway the quotes in there +# would cause problems or look ugly. +# WARNING: Use '\'' to represent an apostrophe within the trap. +# WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug. +trap 'exit_status=$? + # Save into config.log some information that might help in debugging. + { + echo + + $as_echo "## ---------------- ## +## Cache variables. ## +## ---------------- ##" + echo + # The following way of writing the cache mishandles newlines in values, +( + for ac_var in `(set) 2>&1 | sed -n '\''s/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'\''`; do + eval ac_val=\$$ac_var + case $ac_val in #( + *${as_nl}*) + case $ac_var in #( + *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 +$as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; + esac + case $ac_var in #( + _ | IFS | as_nl) ;; #( + BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( + *) { eval $ac_var=; unset $ac_var;} ;; + esac ;; + esac + done + (set) 2>&1 | + case $as_nl`(ac_space='\'' '\''; set) 2>&1` in #( + *${as_nl}ac_space=\ *) + sed -n \ + "s/'\''/'\''\\\\'\'''\''/g; + s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\''\\2'\''/p" + ;; #( + *) + sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" + ;; + esac | + sort +) + echo + + $as_echo "## ----------------- ## +## Output variables. ## +## ----------------- ##" + echo + for ac_var in $ac_subst_vars + do + eval ac_val=\$$ac_var + case $ac_val in + *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; + esac + $as_echo "$ac_var='\''$ac_val'\''" + done | sort + echo + + if test -n "$ac_subst_files"; then + $as_echo "## ------------------- ## +## File substitutions. ## +## ------------------- ##" + echo + for ac_var in $ac_subst_files + do + eval ac_val=\$$ac_var + case $ac_val in + *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; + esac + $as_echo "$ac_var='\''$ac_val'\''" + done | sort + echo + fi + + if test -s confdefs.h; then + $as_echo "## ----------- ## +## confdefs.h. ## +## ----------- ##" + echo + cat confdefs.h + echo + fi + test "$ac_signal" != 0 && + $as_echo "$as_me: caught signal $ac_signal" + $as_echo "$as_me: exit $exit_status" + } >&5 + rm -f core *.core core.conftest.* && + rm -f -r conftest* confdefs* conf$$* $ac_clean_files && + exit $exit_status +' 0 +for ac_signal in 1 2 13 15; do + trap 'ac_signal='$ac_signal'; as_fn_exit 1' $ac_signal +done +ac_signal=0 + +# confdefs.h avoids OS command line length limits that DEFS can exceed. +rm -f -r conftest* confdefs.h + +$as_echo "/* confdefs.h */" > confdefs.h + +# Predefined preprocessor variables. + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_NAME "$PACKAGE_NAME" +_ACEOF + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_TARNAME "$PACKAGE_TARNAME" +_ACEOF + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_VERSION "$PACKAGE_VERSION" +_ACEOF + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_STRING "$PACKAGE_STRING" +_ACEOF + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT" +_ACEOF + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_URL "$PACKAGE_URL" +_ACEOF + + +# Let the site file select an alternate cache file if it wants to. +# Prefer an explicitly selected file to automatically selected ones. +ac_site_file1=NONE +ac_site_file2=NONE +if test -n "$CONFIG_SITE"; then + # We do not want a PATH search for config.site. + case $CONFIG_SITE in #(( + -*) ac_site_file1=./$CONFIG_SITE;; + */*) ac_site_file1=$CONFIG_SITE;; + *) ac_site_file1=./$CONFIG_SITE;; + esac +elif test "x$prefix" != xNONE; then + ac_site_file1=$prefix/share/config.site + ac_site_file2=$prefix/etc/config.site +else + ac_site_file1=$ac_default_prefix/share/config.site + ac_site_file2=$ac_default_prefix/etc/config.site +fi +for ac_site_file in "$ac_site_file1" "$ac_site_file2" +do + test "x$ac_site_file" = xNONE && continue + if test /dev/null != "$ac_site_file" && test -r "$ac_site_file"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: loading site script $ac_site_file" >&5 +$as_echo "$as_me: loading site script $ac_site_file" >&6;} + sed 's/^/| /' "$ac_site_file" >&5 + . "$ac_site_file" \ + || { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "failed to load site script $ac_site_file +See \`config.log' for more details" "$LINENO" 5; } + fi +done + +if test -r "$cache_file"; then + # Some versions of bash will fail to source /dev/null (special files + # actually), so we avoid doing that. DJGPP emulates it as a regular file. + if test /dev/null != "$cache_file" && test -f "$cache_file"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: loading cache $cache_file" >&5 +$as_echo "$as_me: loading cache $cache_file" >&6;} + case $cache_file in + [\\/]* | ?:[\\/]* ) . "$cache_file";; + *) . "./$cache_file";; + esac + fi +else + { $as_echo "$as_me:${as_lineno-$LINENO}: creating cache $cache_file" >&5 +$as_echo "$as_me: creating cache $cache_file" >&6;} + >$cache_file +fi + +# Check that the precious variables saved in the cache have kept the same +# value. +ac_cache_corrupted=false +for ac_var in $ac_precious_vars; do + eval ac_old_set=\$ac_cv_env_${ac_var}_set + eval ac_new_set=\$ac_env_${ac_var}_set + eval ac_old_val=\$ac_cv_env_${ac_var}_value + eval ac_new_val=\$ac_env_${ac_var}_value + case $ac_old_set,$ac_new_set in + set,) + { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5 +$as_echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;} + ac_cache_corrupted=: ;; + ,set) + { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was not set in the previous run" >&5 +$as_echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;} + ac_cache_corrupted=: ;; + ,);; + *) + if test "x$ac_old_val" != "x$ac_new_val"; then + # differences in whitespace do not lead to failure. + ac_old_val_w=`echo x $ac_old_val` + ac_new_val_w=`echo x $ac_new_val` + if test "$ac_old_val_w" != "$ac_new_val_w"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' has changed since the previous run:" >&5 +$as_echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;} + ac_cache_corrupted=: + else + { $as_echo "$as_me:${as_lineno-$LINENO}: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&5 +$as_echo "$as_me: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&2;} + eval $ac_var=\$ac_old_val + fi + { $as_echo "$as_me:${as_lineno-$LINENO}: former value: \`$ac_old_val'" >&5 +$as_echo "$as_me: former value: \`$ac_old_val'" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: current value: \`$ac_new_val'" >&5 +$as_echo "$as_me: current value: \`$ac_new_val'" >&2;} + fi;; + esac + # Pass precious variables to config.status. + if test "$ac_new_set" = set; then + case $ac_new_val in + *\'*) ac_arg=$ac_var=`$as_echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;; + *) ac_arg=$ac_var=$ac_new_val ;; + esac + case " $ac_configure_args " in + *" '$ac_arg' "*) ;; # Avoid dups. Use of quotes ensures accuracy. + *) as_fn_append ac_configure_args " '$ac_arg'" ;; + esac + fi +done +if $ac_cache_corrupted; then + { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build" >&5 +$as_echo "$as_me: error: changes in the environment can compromise the build" >&2;} + as_fn_error $? "run \`make distclean' and/or \`rm $cache_file' and start over" "$LINENO" 5 +fi +## -------------------- ## +## Main body of script. ## +## -------------------- ## + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + + + +# Save initial CFLAGS and CXXFLAGS values before AC_PROG_CC and AC_PROG_CXX +init_cflags="$CFLAGS" +init_cxxflags="$CXXFLAGS" + +# initialize Doxygen support + + + + + + + + + + +# Files: +DX_PROJECT=zookeeper + +DX_CONFIG=c-doc.Doxyfile + +DX_DOCDIR=docs + + +# Environment variables used inside doxygen.cfg: +DX_ENV="$DX_ENV SRCDIR='$srcdir'" + +DX_ENV="$DX_ENV PROJECT='$DX_PROJECT'" + +DX_ENV="$DX_ENV DOCDIR='$DX_DOCDIR'" + +DX_ENV="$DX_ENV VERSION='$PACKAGE_VERSION'" + + +# Doxygen itself: + + + + # Check whether --enable-doxygen-doc was given. +if test "${enable_doxygen_doc+set}" = set; then : + enableval=$enable_doxygen_doc; +case "$enableval" in +#( +y|Y|yes|Yes|YES) + DX_FLAG_doc=1 + + +;; #( +n|N|no|No|NO) + DX_FLAG_doc=0 + +;; #( +*) + as_fn_error $? "invalid value '$enableval' given to doxygen-doc" "$LINENO" 5 +;; +esac + +else + +DX_FLAG_doc=1 + + + +fi + +if test "$DX_FLAG_doc" = 1; then + +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}doxygen", so it can be a program name with args. +set dummy ${ac_tool_prefix}doxygen; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_path_DX_DOXYGEN+:} false; then : + $as_echo_n "(cached) " >&6 +else + case $DX_DOXYGEN in + [\\/]* | ?:[\\/]*) + ac_cv_path_DX_DOXYGEN="$DX_DOXYGEN" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_path_DX_DOXYGEN="$as_dir/$ac_word$ac_exec_ext" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + ;; +esac +fi +DX_DOXYGEN=$ac_cv_path_DX_DOXYGEN +if test -n "$DX_DOXYGEN"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DX_DOXYGEN" >&5 +$as_echo "$DX_DOXYGEN" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_path_DX_DOXYGEN"; then + ac_pt_DX_DOXYGEN=$DX_DOXYGEN + # Extract the first word of "doxygen", so it can be a program name with args. +set dummy doxygen; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_path_ac_pt_DX_DOXYGEN+:} false; then : + $as_echo_n "(cached) " >&6 +else + case $ac_pt_DX_DOXYGEN in + [\\/]* | ?:[\\/]*) + ac_cv_path_ac_pt_DX_DOXYGEN="$ac_pt_DX_DOXYGEN" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_path_ac_pt_DX_DOXYGEN="$as_dir/$ac_word$ac_exec_ext" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + ;; +esac +fi +ac_pt_DX_DOXYGEN=$ac_cv_path_ac_pt_DX_DOXYGEN +if test -n "$ac_pt_DX_DOXYGEN"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_pt_DX_DOXYGEN" >&5 +$as_echo "$ac_pt_DX_DOXYGEN" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_pt_DX_DOXYGEN" = x; then + DX_DOXYGEN="" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + DX_DOXYGEN=$ac_pt_DX_DOXYGEN + fi +else + DX_DOXYGEN="$ac_cv_path_DX_DOXYGEN" +fi + +if test "$DX_FLAG_$DX_CURRENT_FEATURE$DX_DOXYGEN" = 1; then + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: doxygen not found - will not generate any doxygen documentation" >&5 +$as_echo "$as_me: WARNING: doxygen not found - will not generate any doxygen documentation" >&2;} + DX_FLAG_doc=0 + +fi + + +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}perl", so it can be a program name with args. +set dummy ${ac_tool_prefix}perl; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_path_DX_PERL+:} false; then : + $as_echo_n "(cached) " >&6 +else + case $DX_PERL in + [\\/]* | ?:[\\/]*) + ac_cv_path_DX_PERL="$DX_PERL" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_path_DX_PERL="$as_dir/$ac_word$ac_exec_ext" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + ;; +esac +fi +DX_PERL=$ac_cv_path_DX_PERL +if test -n "$DX_PERL"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DX_PERL" >&5 +$as_echo "$DX_PERL" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_path_DX_PERL"; then + ac_pt_DX_PERL=$DX_PERL + # Extract the first word of "perl", so it can be a program name with args. +set dummy perl; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_path_ac_pt_DX_PERL+:} false; then : + $as_echo_n "(cached) " >&6 +else + case $ac_pt_DX_PERL in + [\\/]* | ?:[\\/]*) + ac_cv_path_ac_pt_DX_PERL="$ac_pt_DX_PERL" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_path_ac_pt_DX_PERL="$as_dir/$ac_word$ac_exec_ext" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + ;; +esac +fi +ac_pt_DX_PERL=$ac_cv_path_ac_pt_DX_PERL +if test -n "$ac_pt_DX_PERL"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_pt_DX_PERL" >&5 +$as_echo "$ac_pt_DX_PERL" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_pt_DX_PERL" = x; then + DX_PERL="" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + DX_PERL=$ac_pt_DX_PERL + fi +else + DX_PERL="$ac_cv_path_DX_PERL" +fi + +if test "$DX_FLAG_$DX_CURRENT_FEATURE$DX_PERL" = 1; then + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: perl not found - will not generate any doxygen documentation" >&5 +$as_echo "$as_me: WARNING: perl not found - will not generate any doxygen documentation" >&2;} + DX_FLAG_doc=0 + +fi + + : +fi +if test "$DX_FLAG_doc" = 1; then + if :; then + DX_COND_doc_TRUE= + DX_COND_doc_FALSE='#' +else + DX_COND_doc_TRUE='#' + DX_COND_doc_FALSE= +fi + + DX_ENV="$DX_ENV PERL_PATH='$DX_PERL'" + + : +else + if false; then + DX_COND_doc_TRUE= + DX_COND_doc_FALSE='#' +else + DX_COND_doc_TRUE='#' + DX_COND_doc_FALSE= +fi + + + : +fi + + +# Dot for graphics: + + + + # Check whether --enable-doxygen-dot was given. +if test "${enable_doxygen_dot+set}" = set; then : + enableval=$enable_doxygen_dot; +case "$enableval" in +#( +y|Y|yes|Yes|YES) + DX_FLAG_dot=1 + + +test "$DX_FLAG_doc" = "1" \ +|| as_fn_error $? "doxygen-dot requires doxygen-dot" "$LINENO" 5 + +;; #( +n|N|no|No|NO) + DX_FLAG_dot=0 + +;; #( +*) + as_fn_error $? "invalid value '$enableval' given to doxygen-dot" "$LINENO" 5 +;; +esac + +else + +DX_FLAG_dot=1 + + +test "$DX_FLAG_doc" = "1" || DX_FLAG_dot=0 + + + +fi + +if test "$DX_FLAG_dot" = 1; then + +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}dot", so it can be a program name with args. +set dummy ${ac_tool_prefix}dot; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_path_DX_DOT+:} false; then : + $as_echo_n "(cached) " >&6 +else + case $DX_DOT in + [\\/]* | ?:[\\/]*) + ac_cv_path_DX_DOT="$DX_DOT" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_path_DX_DOT="$as_dir/$ac_word$ac_exec_ext" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + ;; +esac +fi +DX_DOT=$ac_cv_path_DX_DOT +if test -n "$DX_DOT"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DX_DOT" >&5 +$as_echo "$DX_DOT" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_path_DX_DOT"; then + ac_pt_DX_DOT=$DX_DOT + # Extract the first word of "dot", so it can be a program name with args. +set dummy dot; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_path_ac_pt_DX_DOT+:} false; then : + $as_echo_n "(cached) " >&6 +else + case $ac_pt_DX_DOT in + [\\/]* | ?:[\\/]*) + ac_cv_path_ac_pt_DX_DOT="$ac_pt_DX_DOT" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_path_ac_pt_DX_DOT="$as_dir/$ac_word$ac_exec_ext" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + ;; +esac +fi +ac_pt_DX_DOT=$ac_cv_path_ac_pt_DX_DOT +if test -n "$ac_pt_DX_DOT"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_pt_DX_DOT" >&5 +$as_echo "$ac_pt_DX_DOT" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_pt_DX_DOT" = x; then + DX_DOT="" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + DX_DOT=$ac_pt_DX_DOT + fi +else + DX_DOT="$ac_cv_path_DX_DOT" +fi + +if test "$DX_FLAG_$DX_CURRENT_FEATURE$DX_DOT" = 1; then + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: dot not found - will not generate graphics for doxygen documentation" >&5 +$as_echo "$as_me: WARNING: dot not found - will not generate graphics for doxygen documentation" >&2;} + DX_FLAG_dot=0 + +fi + + : +fi +if test "$DX_FLAG_dot" = 1; then + if :; then + DX_COND_dot_TRUE= + DX_COND_dot_FALSE='#' +else + DX_COND_dot_TRUE='#' + DX_COND_dot_FALSE= +fi + + DX_ENV="$DX_ENV HAVE_DOT='YES'" + + DX_ENV="$DX_ENV DOT_PATH='`expr ".$DX_DOT" : '\(\.\)[^/]*$' \| "x$DX_DOT" : 'x\(.*\)/[^/]*$'`'" + + : +else + if false; then + DX_COND_dot_TRUE= + DX_COND_dot_FALSE='#' +else + DX_COND_dot_TRUE='#' + DX_COND_dot_FALSE= +fi + + DX_ENV="$DX_ENV HAVE_DOT='NO'" + + : +fi + + +# Man pages generation: + + + + # Check whether --enable-doxygen-man was given. +if test "${enable_doxygen_man+set}" = set; then : + enableval=$enable_doxygen_man; +case "$enableval" in +#( +y|Y|yes|Yes|YES) + DX_FLAG_man=1 + + +test "$DX_FLAG_doc" = "1" \ +|| as_fn_error $? "doxygen-man requires doxygen-man" "$LINENO" 5 + +;; #( +n|N|no|No|NO) + DX_FLAG_man=0 + +;; #( +*) + as_fn_error $? "invalid value '$enableval' given to doxygen-man" "$LINENO" 5 +;; +esac + +else + +DX_FLAG_man=0 + + +test "$DX_FLAG_doc" = "1" || DX_FLAG_man=0 + + + +fi + +if test "$DX_FLAG_man" = 1; then + + : +fi +if test "$DX_FLAG_man" = 1; then + if :; then + DX_COND_man_TRUE= + DX_COND_man_FALSE='#' +else + DX_COND_man_TRUE='#' + DX_COND_man_FALSE= +fi + + DX_ENV="$DX_ENV GENERATE_MAN='YES'" + + : +else + if false; then + DX_COND_man_TRUE= + DX_COND_man_FALSE='#' +else + DX_COND_man_TRUE='#' + DX_COND_man_FALSE= +fi + + DX_ENV="$DX_ENV GENERATE_MAN='NO'" + + : +fi + + +# RTF file generation: + + + + # Check whether --enable-doxygen-rtf was given. +if test "${enable_doxygen_rtf+set}" = set; then : + enableval=$enable_doxygen_rtf; +case "$enableval" in +#( +y|Y|yes|Yes|YES) + DX_FLAG_rtf=1 + + +test "$DX_FLAG_doc" = "1" \ +|| as_fn_error $? "doxygen-rtf requires doxygen-rtf" "$LINENO" 5 + +;; #( +n|N|no|No|NO) + DX_FLAG_rtf=0 + +;; #( +*) + as_fn_error $? "invalid value '$enableval' given to doxygen-rtf" "$LINENO" 5 +;; +esac + +else + +DX_FLAG_rtf=0 + + +test "$DX_FLAG_doc" = "1" || DX_FLAG_rtf=0 + + + +fi + +if test "$DX_FLAG_rtf" = 1; then + + : +fi +if test "$DX_FLAG_rtf" = 1; then + if :; then + DX_COND_rtf_TRUE= + DX_COND_rtf_FALSE='#' +else + DX_COND_rtf_TRUE='#' + DX_COND_rtf_FALSE= +fi + + DX_ENV="$DX_ENV GENERATE_RTF='YES'" + + : +else + if false; then + DX_COND_rtf_TRUE= + DX_COND_rtf_FALSE='#' +else + DX_COND_rtf_TRUE='#' + DX_COND_rtf_FALSE= +fi + + DX_ENV="$DX_ENV GENERATE_RTF='NO'" + + : +fi + + +# XML file generation: + + + + # Check whether --enable-doxygen-xml was given. +if test "${enable_doxygen_xml+set}" = set; then : + enableval=$enable_doxygen_xml; +case "$enableval" in +#( +y|Y|yes|Yes|YES) + DX_FLAG_xml=1 + + +test "$DX_FLAG_doc" = "1" \ +|| as_fn_error $? "doxygen-xml requires doxygen-xml" "$LINENO" 5 + +;; #( +n|N|no|No|NO) + DX_FLAG_xml=0 + +;; #( +*) + as_fn_error $? "invalid value '$enableval' given to doxygen-xml" "$LINENO" 5 +;; +esac + +else + +DX_FLAG_xml=0 + + +test "$DX_FLAG_doc" = "1" || DX_FLAG_xml=0 + + + +fi + +if test "$DX_FLAG_xml" = 1; then + + : +fi +if test "$DX_FLAG_xml" = 1; then + if :; then + DX_COND_xml_TRUE= + DX_COND_xml_FALSE='#' +else + DX_COND_xml_TRUE='#' + DX_COND_xml_FALSE= +fi + + DX_ENV="$DX_ENV GENERATE_XML='YES'" + + : +else + if false; then + DX_COND_xml_TRUE= + DX_COND_xml_FALSE='#' +else + DX_COND_xml_TRUE='#' + DX_COND_xml_FALSE= +fi + + DX_ENV="$DX_ENV GENERATE_XML='NO'" + + : +fi + + +# (Compressed) HTML help generation: + + + + # Check whether --enable-doxygen-chm was given. +if test "${enable_doxygen_chm+set}" = set; then : + enableval=$enable_doxygen_chm; +case "$enableval" in +#( +y|Y|yes|Yes|YES) + DX_FLAG_chm=1 + + +test "$DX_FLAG_doc" = "1" \ +|| as_fn_error $? "doxygen-chm requires doxygen-chm" "$LINENO" 5 + +;; #( +n|N|no|No|NO) + DX_FLAG_chm=0 + +;; #( +*) + as_fn_error $? "invalid value '$enableval' given to doxygen-chm" "$LINENO" 5 +;; +esac + +else + +DX_FLAG_chm=0 + + +test "$DX_FLAG_doc" = "1" || DX_FLAG_chm=0 + + + +fi + +if test "$DX_FLAG_chm" = 1; then + +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}hhc", so it can be a program name with args. +set dummy ${ac_tool_prefix}hhc; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_path_DX_HHC+:} false; then : + $as_echo_n "(cached) " >&6 +else + case $DX_HHC in + [\\/]* | ?:[\\/]*) + ac_cv_path_DX_HHC="$DX_HHC" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_path_DX_HHC="$as_dir/$ac_word$ac_exec_ext" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + ;; +esac +fi +DX_HHC=$ac_cv_path_DX_HHC +if test -n "$DX_HHC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DX_HHC" >&5 +$as_echo "$DX_HHC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_path_DX_HHC"; then + ac_pt_DX_HHC=$DX_HHC + # Extract the first word of "hhc", so it can be a program name with args. +set dummy hhc; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_path_ac_pt_DX_HHC+:} false; then : + $as_echo_n "(cached) " >&6 +else + case $ac_pt_DX_HHC in + [\\/]* | ?:[\\/]*) + ac_cv_path_ac_pt_DX_HHC="$ac_pt_DX_HHC" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_path_ac_pt_DX_HHC="$as_dir/$ac_word$ac_exec_ext" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + ;; +esac +fi +ac_pt_DX_HHC=$ac_cv_path_ac_pt_DX_HHC +if test -n "$ac_pt_DX_HHC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_pt_DX_HHC" >&5 +$as_echo "$ac_pt_DX_HHC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_pt_DX_HHC" = x; then + DX_HHC="" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + DX_HHC=$ac_pt_DX_HHC + fi +else + DX_HHC="$ac_cv_path_DX_HHC" +fi + +if test "$DX_FLAG_$DX_CURRENT_FEATURE$DX_HHC" = 1; then + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: hhc not found - will not generate doxygen compressed HTML help documentation" >&5 +$as_echo "$as_me: WARNING: hhc not found - will not generate doxygen compressed HTML help documentation" >&2;} + DX_FLAG_chm=0 + +fi + + : +fi +if test "$DX_FLAG_chm" = 1; then + if :; then + DX_COND_chm_TRUE= + DX_COND_chm_FALSE='#' +else + DX_COND_chm_TRUE='#' + DX_COND_chm_FALSE= +fi + + DX_ENV="$DX_ENV HHC_PATH='$DX_HHC'" + + DX_ENV="$DX_ENV GENERATE_HTML='YES'" + + DX_ENV="$DX_ENV GENERATE_HTMLHELP='YES'" + + : +else + if false; then + DX_COND_chm_TRUE= + DX_COND_chm_FALSE='#' +else + DX_COND_chm_TRUE='#' + DX_COND_chm_FALSE= +fi + + DX_ENV="$DX_ENV GENERATE_HTMLHELP='NO'" + + : +fi + + +# Seperate CHI file generation. + + + + # Check whether --enable-doxygen-chi was given. +if test "${enable_doxygen_chi+set}" = set; then : + enableval=$enable_doxygen_chi; +case "$enableval" in +#( +y|Y|yes|Yes|YES) + DX_FLAG_chi=1 + + +test "$DX_FLAG_chm" = "1" \ +|| as_fn_error $? "doxygen-chi requires doxygen-chi" "$LINENO" 5 + +;; #( +n|N|no|No|NO) + DX_FLAG_chi=0 + +;; #( +*) + as_fn_error $? "invalid value '$enableval' given to doxygen-chi" "$LINENO" 5 +;; +esac + +else + +DX_FLAG_chi=0 + + +test "$DX_FLAG_chm" = "1" || DX_FLAG_chi=0 + + + +fi + +if test "$DX_FLAG_chi" = 1; then + + : +fi +if test "$DX_FLAG_chi" = 1; then + if :; then + DX_COND_chi_TRUE= + DX_COND_chi_FALSE='#' +else + DX_COND_chi_TRUE='#' + DX_COND_chi_FALSE= +fi + + DX_ENV="$DX_ENV GENERATE_CHI='YES'" + + : +else + if false; then + DX_COND_chi_TRUE= + DX_COND_chi_FALSE='#' +else + DX_COND_chi_TRUE='#' + DX_COND_chi_FALSE= +fi + + DX_ENV="$DX_ENV GENERATE_CHI='NO'" + + : +fi + + +# Plain HTML pages generation: + + + + # Check whether --enable-doxygen-html was given. +if test "${enable_doxygen_html+set}" = set; then : + enableval=$enable_doxygen_html; +case "$enableval" in +#( +y|Y|yes|Yes|YES) + DX_FLAG_html=1 + + +test "$DX_FLAG_doc" = "1" \ +|| as_fn_error $? "doxygen-html requires doxygen-html" "$LINENO" 5 + +test "$DX_FLAG_chm" = "0" \ +|| as_fn_error $? "doxygen-html contradicts doxygen-html" "$LINENO" 5 + +;; #( +n|N|no|No|NO) + DX_FLAG_html=0 + +;; #( +*) + as_fn_error $? "invalid value '$enableval' given to doxygen-html" "$LINENO" 5 +;; +esac + +else + +DX_FLAG_html=1 + + +test "$DX_FLAG_doc" = "1" || DX_FLAG_html=0 + + +test "$DX_FLAG_chm" = "0" || DX_FLAG_html=0 + + + +fi + +if test "$DX_FLAG_html" = 1; then + + : +fi +if test "$DX_FLAG_html" = 1; then + if :; then + DX_COND_html_TRUE= + DX_COND_html_FALSE='#' +else + DX_COND_html_TRUE='#' + DX_COND_html_FALSE= +fi + + DX_ENV="$DX_ENV GENERATE_HTML='YES'" + + : +else + if false; then + DX_COND_html_TRUE= + DX_COND_html_FALSE='#' +else + DX_COND_html_TRUE='#' + DX_COND_html_FALSE= +fi + + test "$DX_FLAG_chm" = 1 || DX_ENV="$DX_ENV GENERATE_HTML='NO'" + + : +fi + + +# PostScript file generation: + + + + # Check whether --enable-doxygen-ps was given. +if test "${enable_doxygen_ps+set}" = set; then : + enableval=$enable_doxygen_ps; +case "$enableval" in +#( +y|Y|yes|Yes|YES) + DX_FLAG_ps=1 + + +test "$DX_FLAG_doc" = "1" \ +|| as_fn_error $? "doxygen-ps requires doxygen-ps" "$LINENO" 5 + +;; #( +n|N|no|No|NO) + DX_FLAG_ps=0 + +;; #( +*) + as_fn_error $? "invalid value '$enableval' given to doxygen-ps" "$LINENO" 5 +;; +esac + +else + +DX_FLAG_ps=0 + + +test "$DX_FLAG_doc" = "1" || DX_FLAG_ps=0 + + + +fi + +if test "$DX_FLAG_ps" = 1; then + +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}latex", so it can be a program name with args. +set dummy ${ac_tool_prefix}latex; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_path_DX_LATEX+:} false; then : + $as_echo_n "(cached) " >&6 +else + case $DX_LATEX in + [\\/]* | ?:[\\/]*) + ac_cv_path_DX_LATEX="$DX_LATEX" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_path_DX_LATEX="$as_dir/$ac_word$ac_exec_ext" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + ;; +esac +fi +DX_LATEX=$ac_cv_path_DX_LATEX +if test -n "$DX_LATEX"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DX_LATEX" >&5 +$as_echo "$DX_LATEX" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_path_DX_LATEX"; then + ac_pt_DX_LATEX=$DX_LATEX + # Extract the first word of "latex", so it can be a program name with args. +set dummy latex; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_path_ac_pt_DX_LATEX+:} false; then : + $as_echo_n "(cached) " >&6 +else + case $ac_pt_DX_LATEX in + [\\/]* | ?:[\\/]*) + ac_cv_path_ac_pt_DX_LATEX="$ac_pt_DX_LATEX" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_path_ac_pt_DX_LATEX="$as_dir/$ac_word$ac_exec_ext" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + ;; +esac +fi +ac_pt_DX_LATEX=$ac_cv_path_ac_pt_DX_LATEX +if test -n "$ac_pt_DX_LATEX"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_pt_DX_LATEX" >&5 +$as_echo "$ac_pt_DX_LATEX" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_pt_DX_LATEX" = x; then + DX_LATEX="" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + DX_LATEX=$ac_pt_DX_LATEX + fi +else + DX_LATEX="$ac_cv_path_DX_LATEX" +fi + +if test "$DX_FLAG_$DX_CURRENT_FEATURE$DX_LATEX" = 1; then + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: latex not found - will not generate doxygen PostScript documentation" >&5 +$as_echo "$as_me: WARNING: latex not found - will not generate doxygen PostScript documentation" >&2;} + DX_FLAG_ps=0 + +fi + + +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}makeindex", so it can be a program name with args. +set dummy ${ac_tool_prefix}makeindex; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_path_DX_MAKEINDEX+:} false; then : + $as_echo_n "(cached) " >&6 +else + case $DX_MAKEINDEX in + [\\/]* | ?:[\\/]*) + ac_cv_path_DX_MAKEINDEX="$DX_MAKEINDEX" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_path_DX_MAKEINDEX="$as_dir/$ac_word$ac_exec_ext" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + ;; +esac +fi +DX_MAKEINDEX=$ac_cv_path_DX_MAKEINDEX +if test -n "$DX_MAKEINDEX"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DX_MAKEINDEX" >&5 +$as_echo "$DX_MAKEINDEX" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_path_DX_MAKEINDEX"; then + ac_pt_DX_MAKEINDEX=$DX_MAKEINDEX + # Extract the first word of "makeindex", so it can be a program name with args. +set dummy makeindex; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_path_ac_pt_DX_MAKEINDEX+:} false; then : + $as_echo_n "(cached) " >&6 +else + case $ac_pt_DX_MAKEINDEX in + [\\/]* | ?:[\\/]*) + ac_cv_path_ac_pt_DX_MAKEINDEX="$ac_pt_DX_MAKEINDEX" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_path_ac_pt_DX_MAKEINDEX="$as_dir/$ac_word$ac_exec_ext" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + ;; +esac +fi +ac_pt_DX_MAKEINDEX=$ac_cv_path_ac_pt_DX_MAKEINDEX +if test -n "$ac_pt_DX_MAKEINDEX"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_pt_DX_MAKEINDEX" >&5 +$as_echo "$ac_pt_DX_MAKEINDEX" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_pt_DX_MAKEINDEX" = x; then + DX_MAKEINDEX="" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + DX_MAKEINDEX=$ac_pt_DX_MAKEINDEX + fi +else + DX_MAKEINDEX="$ac_cv_path_DX_MAKEINDEX" +fi + +if test "$DX_FLAG_$DX_CURRENT_FEATURE$DX_MAKEINDEX" = 1; then + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: makeindex not found - will not generate doxygen PostScript documentation" >&5 +$as_echo "$as_me: WARNING: makeindex not found - will not generate doxygen PostScript documentation" >&2;} + DX_FLAG_ps=0 + +fi + + +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}dvips", so it can be a program name with args. +set dummy ${ac_tool_prefix}dvips; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_path_DX_DVIPS+:} false; then : + $as_echo_n "(cached) " >&6 +else + case $DX_DVIPS in + [\\/]* | ?:[\\/]*) + ac_cv_path_DX_DVIPS="$DX_DVIPS" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_path_DX_DVIPS="$as_dir/$ac_word$ac_exec_ext" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + ;; +esac +fi +DX_DVIPS=$ac_cv_path_DX_DVIPS +if test -n "$DX_DVIPS"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DX_DVIPS" >&5 +$as_echo "$DX_DVIPS" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_path_DX_DVIPS"; then + ac_pt_DX_DVIPS=$DX_DVIPS + # Extract the first word of "dvips", so it can be a program name with args. +set dummy dvips; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_path_ac_pt_DX_DVIPS+:} false; then : + $as_echo_n "(cached) " >&6 +else + case $ac_pt_DX_DVIPS in + [\\/]* | ?:[\\/]*) + ac_cv_path_ac_pt_DX_DVIPS="$ac_pt_DX_DVIPS" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_path_ac_pt_DX_DVIPS="$as_dir/$ac_word$ac_exec_ext" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + ;; +esac +fi +ac_pt_DX_DVIPS=$ac_cv_path_ac_pt_DX_DVIPS +if test -n "$ac_pt_DX_DVIPS"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_pt_DX_DVIPS" >&5 +$as_echo "$ac_pt_DX_DVIPS" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_pt_DX_DVIPS" = x; then + DX_DVIPS="" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + DX_DVIPS=$ac_pt_DX_DVIPS + fi +else + DX_DVIPS="$ac_cv_path_DX_DVIPS" +fi + +if test "$DX_FLAG_$DX_CURRENT_FEATURE$DX_DVIPS" = 1; then + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: dvips not found - will not generate doxygen PostScript documentation" >&5 +$as_echo "$as_me: WARNING: dvips not found - will not generate doxygen PostScript documentation" >&2;} + DX_FLAG_ps=0 + +fi + + +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}egrep", so it can be a program name with args. +set dummy ${ac_tool_prefix}egrep; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_path_DX_EGREP+:} false; then : + $as_echo_n "(cached) " >&6 +else + case $DX_EGREP in + [\\/]* | ?:[\\/]*) + ac_cv_path_DX_EGREP="$DX_EGREP" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_path_DX_EGREP="$as_dir/$ac_word$ac_exec_ext" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + ;; +esac +fi +DX_EGREP=$ac_cv_path_DX_EGREP +if test -n "$DX_EGREP"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DX_EGREP" >&5 +$as_echo "$DX_EGREP" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_path_DX_EGREP"; then + ac_pt_DX_EGREP=$DX_EGREP + # Extract the first word of "egrep", so it can be a program name with args. +set dummy egrep; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_path_ac_pt_DX_EGREP+:} false; then : + $as_echo_n "(cached) " >&6 +else + case $ac_pt_DX_EGREP in + [\\/]* | ?:[\\/]*) + ac_cv_path_ac_pt_DX_EGREP="$ac_pt_DX_EGREP" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_path_ac_pt_DX_EGREP="$as_dir/$ac_word$ac_exec_ext" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + ;; +esac +fi +ac_pt_DX_EGREP=$ac_cv_path_ac_pt_DX_EGREP +if test -n "$ac_pt_DX_EGREP"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_pt_DX_EGREP" >&5 +$as_echo "$ac_pt_DX_EGREP" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_pt_DX_EGREP" = x; then + DX_EGREP="" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + DX_EGREP=$ac_pt_DX_EGREP + fi +else + DX_EGREP="$ac_cv_path_DX_EGREP" +fi + +if test "$DX_FLAG_$DX_CURRENT_FEATURE$DX_EGREP" = 1; then + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: egrep not found - will not generate doxygen PostScript documentation" >&5 +$as_echo "$as_me: WARNING: egrep not found - will not generate doxygen PostScript documentation" >&2;} + DX_FLAG_ps=0 + +fi + + : +fi +if test "$DX_FLAG_ps" = 1; then + if :; then + DX_COND_ps_TRUE= + DX_COND_ps_FALSE='#' +else + DX_COND_ps_TRUE='#' + DX_COND_ps_FALSE= +fi + + + : +else + if false; then + DX_COND_ps_TRUE= + DX_COND_ps_FALSE='#' +else + DX_COND_ps_TRUE='#' + DX_COND_ps_FALSE= +fi + + + : +fi + + +# PDF file generation: + + + + # Check whether --enable-doxygen-pdf was given. +if test "${enable_doxygen_pdf+set}" = set; then : + enableval=$enable_doxygen_pdf; +case "$enableval" in +#( +y|Y|yes|Yes|YES) + DX_FLAG_pdf=1 + + +test "$DX_FLAG_doc" = "1" \ +|| as_fn_error $? "doxygen-pdf requires doxygen-pdf" "$LINENO" 5 + +;; #( +n|N|no|No|NO) + DX_FLAG_pdf=0 + +;; #( +*) + as_fn_error $? "invalid value '$enableval' given to doxygen-pdf" "$LINENO" 5 +;; +esac + +else + +DX_FLAG_pdf=0 + + +test "$DX_FLAG_doc" = "1" || DX_FLAG_pdf=0 + + + +fi + +if test "$DX_FLAG_pdf" = 1; then + +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}pdflatex", so it can be a program name with args. +set dummy ${ac_tool_prefix}pdflatex; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_path_DX_PDFLATEX+:} false; then : + $as_echo_n "(cached) " >&6 +else + case $DX_PDFLATEX in + [\\/]* | ?:[\\/]*) + ac_cv_path_DX_PDFLATEX="$DX_PDFLATEX" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_path_DX_PDFLATEX="$as_dir/$ac_word$ac_exec_ext" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + ;; +esac +fi +DX_PDFLATEX=$ac_cv_path_DX_PDFLATEX +if test -n "$DX_PDFLATEX"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DX_PDFLATEX" >&5 +$as_echo "$DX_PDFLATEX" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_path_DX_PDFLATEX"; then + ac_pt_DX_PDFLATEX=$DX_PDFLATEX + # Extract the first word of "pdflatex", so it can be a program name with args. +set dummy pdflatex; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_path_ac_pt_DX_PDFLATEX+:} false; then : + $as_echo_n "(cached) " >&6 +else + case $ac_pt_DX_PDFLATEX in + [\\/]* | ?:[\\/]*) + ac_cv_path_ac_pt_DX_PDFLATEX="$ac_pt_DX_PDFLATEX" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_path_ac_pt_DX_PDFLATEX="$as_dir/$ac_word$ac_exec_ext" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + ;; +esac +fi +ac_pt_DX_PDFLATEX=$ac_cv_path_ac_pt_DX_PDFLATEX +if test -n "$ac_pt_DX_PDFLATEX"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_pt_DX_PDFLATEX" >&5 +$as_echo "$ac_pt_DX_PDFLATEX" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_pt_DX_PDFLATEX" = x; then + DX_PDFLATEX="" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + DX_PDFLATEX=$ac_pt_DX_PDFLATEX + fi +else + DX_PDFLATEX="$ac_cv_path_DX_PDFLATEX" +fi + +if test "$DX_FLAG_$DX_CURRENT_FEATURE$DX_PDFLATEX" = 1; then + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: pdflatex not found - will not generate doxygen PDF documentation" >&5 +$as_echo "$as_me: WARNING: pdflatex not found - will not generate doxygen PDF documentation" >&2;} + DX_FLAG_pdf=0 + +fi + + +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}makeindex", so it can be a program name with args. +set dummy ${ac_tool_prefix}makeindex; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_path_DX_MAKEINDEX+:} false; then : + $as_echo_n "(cached) " >&6 +else + case $DX_MAKEINDEX in + [\\/]* | ?:[\\/]*) + ac_cv_path_DX_MAKEINDEX="$DX_MAKEINDEX" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_path_DX_MAKEINDEX="$as_dir/$ac_word$ac_exec_ext" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + ;; +esac +fi +DX_MAKEINDEX=$ac_cv_path_DX_MAKEINDEX +if test -n "$DX_MAKEINDEX"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DX_MAKEINDEX" >&5 +$as_echo "$DX_MAKEINDEX" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_path_DX_MAKEINDEX"; then + ac_pt_DX_MAKEINDEX=$DX_MAKEINDEX + # Extract the first word of "makeindex", so it can be a program name with args. +set dummy makeindex; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_path_ac_pt_DX_MAKEINDEX+:} false; then : + $as_echo_n "(cached) " >&6 +else + case $ac_pt_DX_MAKEINDEX in + [\\/]* | ?:[\\/]*) + ac_cv_path_ac_pt_DX_MAKEINDEX="$ac_pt_DX_MAKEINDEX" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_path_ac_pt_DX_MAKEINDEX="$as_dir/$ac_word$ac_exec_ext" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + ;; +esac +fi +ac_pt_DX_MAKEINDEX=$ac_cv_path_ac_pt_DX_MAKEINDEX +if test -n "$ac_pt_DX_MAKEINDEX"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_pt_DX_MAKEINDEX" >&5 +$as_echo "$ac_pt_DX_MAKEINDEX" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_pt_DX_MAKEINDEX" = x; then + DX_MAKEINDEX="" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + DX_MAKEINDEX=$ac_pt_DX_MAKEINDEX + fi +else + DX_MAKEINDEX="$ac_cv_path_DX_MAKEINDEX" +fi + +if test "$DX_FLAG_$DX_CURRENT_FEATURE$DX_MAKEINDEX" = 1; then + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: makeindex not found - will not generate doxygen PDF documentation" >&5 +$as_echo "$as_me: WARNING: makeindex not found - will not generate doxygen PDF documentation" >&2;} + DX_FLAG_pdf=0 + +fi + + +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}egrep", so it can be a program name with args. +set dummy ${ac_tool_prefix}egrep; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_path_DX_EGREP+:} false; then : + $as_echo_n "(cached) " >&6 +else + case $DX_EGREP in + [\\/]* | ?:[\\/]*) + ac_cv_path_DX_EGREP="$DX_EGREP" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_path_DX_EGREP="$as_dir/$ac_word$ac_exec_ext" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + ;; +esac +fi +DX_EGREP=$ac_cv_path_DX_EGREP +if test -n "$DX_EGREP"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DX_EGREP" >&5 +$as_echo "$DX_EGREP" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_path_DX_EGREP"; then + ac_pt_DX_EGREP=$DX_EGREP + # Extract the first word of "egrep", so it can be a program name with args. +set dummy egrep; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_path_ac_pt_DX_EGREP+:} false; then : + $as_echo_n "(cached) " >&6 +else + case $ac_pt_DX_EGREP in + [\\/]* | ?:[\\/]*) + ac_cv_path_ac_pt_DX_EGREP="$ac_pt_DX_EGREP" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_path_ac_pt_DX_EGREP="$as_dir/$ac_word$ac_exec_ext" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + ;; +esac +fi +ac_pt_DX_EGREP=$ac_cv_path_ac_pt_DX_EGREP +if test -n "$ac_pt_DX_EGREP"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_pt_DX_EGREP" >&5 +$as_echo "$ac_pt_DX_EGREP" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_pt_DX_EGREP" = x; then + DX_EGREP="" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + DX_EGREP=$ac_pt_DX_EGREP + fi +else + DX_EGREP="$ac_cv_path_DX_EGREP" +fi + +if test "$DX_FLAG_$DX_CURRENT_FEATURE$DX_EGREP" = 1; then + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: egrep not found - will not generate doxygen PDF documentation" >&5 +$as_echo "$as_me: WARNING: egrep not found - will not generate doxygen PDF documentation" >&2;} + DX_FLAG_pdf=0 + +fi + + : +fi +if test "$DX_FLAG_pdf" = 1; then + if :; then + DX_COND_pdf_TRUE= + DX_COND_pdf_FALSE='#' +else + DX_COND_pdf_TRUE='#' + DX_COND_pdf_FALSE= +fi + + + : +else + if false; then + DX_COND_pdf_TRUE= + DX_COND_pdf_FALSE='#' +else + DX_COND_pdf_TRUE='#' + DX_COND_pdf_FALSE= +fi + + + : +fi + + +# LaTeX generation for PS and/or PDF: +if test "$DX_FLAG_ps" = 1 || test "$DX_FLAG_pdf" = 1; then + if :; then + DX_COND_latex_TRUE= + DX_COND_latex_FALSE='#' +else + DX_COND_latex_TRUE='#' + DX_COND_latex_FALSE= +fi + + DX_ENV="$DX_ENV GENERATE_LATEX='YES'" + +else + if false; then + DX_COND_latex_TRUE= + DX_COND_latex_FALSE='#' +else + DX_COND_latex_TRUE='#' + DX_COND_latex_FALSE= +fi + + DX_ENV="$DX_ENV GENERATE_LATEX='NO'" + +fi + +# Paper size for PS and/or PDF: + +case "$DOXYGEN_PAPER_SIZE" in +#( +"") + DOXYGEN_PAPER_SIZE="" + +;; #( +a4wide|a4|letter|legal|executive) + DX_ENV="$DX_ENV PAPER_SIZE='$DOXYGEN_PAPER_SIZE'" + +;; #( +*) + as_fn_error $? "unknown DOXYGEN_PAPER_SIZE='$DOXYGEN_PAPER_SIZE'" "$LINENO" 5 +;; +esac + +#For debugging: +#echo DX_FLAG_doc=$DX_FLAG_doc +#echo DX_FLAG_dot=$DX_FLAG_dot +#echo DX_FLAG_man=$DX_FLAG_man +#echo DX_FLAG_html=$DX_FLAG_html +#echo DX_FLAG_chm=$DX_FLAG_chm +#echo DX_FLAG_chi=$DX_FLAG_chi +#echo DX_FLAG_rtf=$DX_FLAG_rtf +#echo DX_FLAG_xml=$DX_FLAG_xml +#echo DX_FLAG_pdf=$DX_FLAG_pdf +#echo DX_FLAG_ps=$DX_FLAG_ps +#echo DX_ENV=$DX_ENV + + +# initialize automake +am__api_version='1.11' + +ac_aux_dir= +for ac_dir in "$srcdir" "$srcdir/.." "$srcdir/../.."; do + if test -f "$ac_dir/install-sh"; then + ac_aux_dir=$ac_dir + ac_install_sh="$ac_aux_dir/install-sh -c" + break + elif test -f "$ac_dir/install.sh"; then + ac_aux_dir=$ac_dir + ac_install_sh="$ac_aux_dir/install.sh -c" + break + elif test -f "$ac_dir/shtool"; then + ac_aux_dir=$ac_dir + ac_install_sh="$ac_aux_dir/shtool install -c" + break + fi +done +if test -z "$ac_aux_dir"; then + as_fn_error $? "cannot find install-sh, install.sh, or shtool in \"$srcdir\" \"$srcdir/..\" \"$srcdir/../..\"" "$LINENO" 5 +fi + +# These three variables are undocumented and unsupported, +# and are intended to be withdrawn in a future Autoconf release. +# They can cause serious problems if a builder's source tree is in a directory +# whose full name contains unusual characters. +ac_config_guess="$SHELL $ac_aux_dir/config.guess" # Please don't use this var. +ac_config_sub="$SHELL $ac_aux_dir/config.sub" # Please don't use this var. +ac_configure="$SHELL $ac_aux_dir/configure" # Please don't use this var. + + +# Find a good install program. We prefer a C program (faster), +# so one script is as good as another. But avoid the broken or +# incompatible versions: +# SysV /etc/install, /usr/sbin/install +# SunOS /usr/etc/install +# IRIX /sbin/install +# AIX /bin/install +# AmigaOS /C/install, which installs bootblocks on floppy discs +# AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag +# AFS /usr/afsws/bin/install, which mishandles nonexistent args +# SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff" +# OS/2's system install, which has a completely different semantic +# ./install, which can be erroneously created by make from ./install.sh. +# Reject install programs that cannot install multiple files. +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a BSD-compatible install" >&5 +$as_echo_n "checking for a BSD-compatible install... " >&6; } +if test -z "$INSTALL"; then +if ${ac_cv_path_install+:} false; then : + $as_echo_n "(cached) " >&6 +else + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + # Account for people who put trailing slashes in PATH elements. +case $as_dir/ in #(( + ./ | .// | /[cC]/* | \ + /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \ + ?:[\\/]os2[\\/]install[\\/]* | ?:[\\/]OS2[\\/]INSTALL[\\/]* | \ + /usr/ucb/* ) ;; + *) + # OSF1 and SCO ODT 3.0 have their own names for install. + # Don't use installbsd from OSF since it installs stuff as root + # by default. + for ac_prog in ginstall scoinst install; do + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_prog$ac_exec_ext"; then + if test $ac_prog = install && + grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then + # AIX install. It has an incompatible calling convention. + : + elif test $ac_prog = install && + grep pwplus "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then + # program-specific install script used by HP pwplus--don't use. + : + else + rm -rf conftest.one conftest.two conftest.dir + echo one > conftest.one + echo two > conftest.two + mkdir conftest.dir + if "$as_dir/$ac_prog$ac_exec_ext" -c conftest.one conftest.two "`pwd`/conftest.dir" && + test -s conftest.one && test -s conftest.two && + test -s conftest.dir/conftest.one && + test -s conftest.dir/conftest.two + then + ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c" + break 3 + fi + fi + fi + done + done + ;; +esac + + done +IFS=$as_save_IFS + +rm -rf conftest.one conftest.two conftest.dir + +fi + if test "${ac_cv_path_install+set}" = set; then + INSTALL=$ac_cv_path_install + else + # As a last resort, use the slow shell script. Don't cache a + # value for INSTALL within a source directory, because that will + # break other packages using the cache if that directory is + # removed, or if the value is a relative name. + INSTALL=$ac_install_sh + fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $INSTALL" >&5 +$as_echo "$INSTALL" >&6; } + +# Use test -z because SunOS4 sh mishandles braces in ${var-val}. +# It thinks the first close brace ends the variable substitution. +test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}' + +test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}' + +test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644' + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether build environment is sane" >&5 +$as_echo_n "checking whether build environment is sane... " >&6; } +# Just in case +sleep 1 +echo timestamp > conftest.file +# Reject unsafe characters in $srcdir or the absolute working directory +# name. Accept space and tab only in the latter. +am_lf=' +' +case `pwd` in + *[\\\"\#\$\&\'\`$am_lf]*) + as_fn_error $? "unsafe absolute working directory name" "$LINENO" 5;; +esac +case $srcdir in + *[\\\"\#\$\&\'\`$am_lf\ \ ]*) + as_fn_error $? "unsafe srcdir value: \`$srcdir'" "$LINENO" 5;; +esac + +# Do `set' in a subshell so we don't clobber the current shell's +# arguments. Must try -L first in case configure is actually a +# symlink; some systems play weird games with the mod time of symlinks +# (eg FreeBSD returns the mod time of the symlink's containing +# directory). +if ( + set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null` + if test "$*" = "X"; then + # -L didn't work. + set X `ls -t "$srcdir/configure" conftest.file` + fi + rm -f conftest.file + if test "$*" != "X $srcdir/configure conftest.file" \ + && test "$*" != "X conftest.file $srcdir/configure"; then + + # If neither matched, then we have a broken ls. This can happen + # if, for instance, CONFIG_SHELL is bash and it inherits a + # broken ls alias from the environment. This has actually + # happened. Such a system could not be considered "sane". + as_fn_error $? "ls -t appears to fail. Make sure there is not a broken +alias in your environment" "$LINENO" 5 + fi + + test "$2" = conftest.file + ) +then + # Ok. + : +else + as_fn_error $? "newly created file is older than distributed files! +Check your system clock" "$LINENO" 5 +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } +test "$program_prefix" != NONE && + program_transform_name="s&^&$program_prefix&;$program_transform_name" +# Use a double $ so make ignores it. +test "$program_suffix" != NONE && + program_transform_name="s&\$&$program_suffix&;$program_transform_name" +# Double any \ or $. +# By default was `s,x,x', remove it if useless. +ac_script='s/[\\$]/&&/g;s/;s,x,x,$//' +program_transform_name=`$as_echo "$program_transform_name" | sed "$ac_script"` + +# expand $ac_aux_dir to an absolute path +am_aux_dir=`cd $ac_aux_dir && pwd` + +if test x"${MISSING+set}" != xset; then + case $am_aux_dir in + *\ * | *\ *) + MISSING="\${SHELL} \"$am_aux_dir/missing\"" ;; + *) + MISSING="\${SHELL} $am_aux_dir/missing" ;; + esac +fi +# Use eval to expand $SHELL +if eval "$MISSING --run true"; then + am_missing_run="$MISSING --run " +else + am_missing_run= + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: \`missing' script is too old or missing" >&5 +$as_echo "$as_me: WARNING: \`missing' script is too old or missing" >&2;} +fi + +if test x"${install_sh}" != xset; then + case $am_aux_dir in + *\ * | *\ *) + install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;; + *) + install_sh="\${SHELL} $am_aux_dir/install-sh" + esac +fi + +# Installed binaries are usually stripped using `strip' when the user +# run `make install-strip'. However `strip' might not be the right +# tool to use in cross-compilation environments, therefore Automake +# will honor the `STRIP' environment variable to overrule this program. +if test "$cross_compiling" != no; then + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args. +set dummy ${ac_tool_prefix}strip; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_STRIP+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$STRIP"; then + ac_cv_prog_STRIP="$STRIP" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_STRIP="${ac_tool_prefix}strip" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +STRIP=$ac_cv_prog_STRIP +if test -n "$STRIP"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $STRIP" >&5 +$as_echo "$STRIP" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_STRIP"; then + ac_ct_STRIP=$STRIP + # Extract the first word of "strip", so it can be a program name with args. +set dummy strip; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_STRIP+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_STRIP"; then + ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_STRIP="strip" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP +if test -n "$ac_ct_STRIP"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP" >&5 +$as_echo "$ac_ct_STRIP" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_STRIP" = x; then + STRIP=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + STRIP=$ac_ct_STRIP + fi +else + STRIP="$ac_cv_prog_STRIP" +fi + +fi +INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s" + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a thread-safe mkdir -p" >&5 +$as_echo_n "checking for a thread-safe mkdir -p... " >&6; } +if test -z "$MKDIR_P"; then + if ${ac_cv_path_mkdir+:} false; then : + $as_echo_n "(cached) " >&6 +else + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH$PATH_SEPARATOR/opt/sfw/bin +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_prog in mkdir gmkdir; do + for ac_exec_ext in '' $ac_executable_extensions; do + as_fn_executable_p "$as_dir/$ac_prog$ac_exec_ext" || continue + case `"$as_dir/$ac_prog$ac_exec_ext" --version 2>&1` in #( + 'mkdir (GNU coreutils) '* | \ + 'mkdir (coreutils) '* | \ + 'mkdir (fileutils) '4.1*) + ac_cv_path_mkdir=$as_dir/$ac_prog$ac_exec_ext + break 3;; + esac + done + done + done +IFS=$as_save_IFS + +fi + + test -d ./--version && rmdir ./--version + if test "${ac_cv_path_mkdir+set}" = set; then + MKDIR_P="$ac_cv_path_mkdir -p" + else + # As a last resort, use the slow shell script. Don't cache a + # value for MKDIR_P within a source directory, because that will + # break other packages using the cache if that directory is + # removed, or if the value is a relative name. + MKDIR_P="$ac_install_sh -d" + fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $MKDIR_P" >&5 +$as_echo "$MKDIR_P" >&6; } + +mkdir_p="$MKDIR_P" +case $mkdir_p in + [\\/$]* | ?:[\\/]*) ;; + */*) mkdir_p="\$(top_builddir)/$mkdir_p" ;; +esac + +for ac_prog in gawk mawk nawk awk +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_AWK+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$AWK"; then + ac_cv_prog_AWK="$AWK" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_AWK="$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +AWK=$ac_cv_prog_AWK +if test -n "$AWK"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AWK" >&5 +$as_echo "$AWK" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$AWK" && break +done + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} sets \$(MAKE)" >&5 +$as_echo_n "checking whether ${MAKE-make} sets \$(MAKE)... " >&6; } +set x ${MAKE-make} +ac_make=`$as_echo "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'` +if eval \${ac_cv_prog_make_${ac_make}_set+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat >conftest.make <<\_ACEOF +SHELL = /bin/sh +all: + @echo '@@@%%%=$(MAKE)=@@@%%%' +_ACEOF +# GNU make sometimes prints "make[1]: Entering ...", which would confuse us. +case `${MAKE-make} -f conftest.make 2>/dev/null` in + *@@@%%%=?*=@@@%%%*) + eval ac_cv_prog_make_${ac_make}_set=yes;; + *) + eval ac_cv_prog_make_${ac_make}_set=no;; +esac +rm -f conftest.make +fi +if eval test \$ac_cv_prog_make_${ac_make}_set = yes; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + SET_MAKE= +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + SET_MAKE="MAKE=${MAKE-make}" +fi + +rm -rf .tst 2>/dev/null +mkdir .tst 2>/dev/null +if test -d .tst; then + am__leading_dot=. +else + am__leading_dot=_ +fi +rmdir .tst 2>/dev/null + +if test "`cd $srcdir && pwd`" != "`pwd`"; then + # Use -I$(srcdir) only when $(srcdir) != ., so that make's output + # is not polluted with repeated "-I." + am__isrc=' -I$(srcdir)' + # test to see if srcdir already configured + if test -f $srcdir/config.status; then + as_fn_error $? "source directory already configured; run \"make distclean\" there first" "$LINENO" 5 + fi +fi + +# test whether we have cygpath +if test -z "$CYGPATH_W"; then + if (cygpath --version) >/dev/null 2>/dev/null; then + CYGPATH_W='cygpath -w' + else + CYGPATH_W=echo + fi +fi + + +# Define the identity of the package. + PACKAGE='zookeeper' + VERSION='3.4.6' + + +cat >>confdefs.h <<_ACEOF +#define PACKAGE "$PACKAGE" +_ACEOF + + +cat >>confdefs.h <<_ACEOF +#define VERSION "$VERSION" +_ACEOF + +# Some tools Automake needs. + +ACLOCAL=${ACLOCAL-"${am_missing_run}aclocal-${am__api_version}"} + + +AUTOCONF=${AUTOCONF-"${am_missing_run}autoconf"} + + +AUTOMAKE=${AUTOMAKE-"${am_missing_run}automake-${am__api_version}"} + + +AUTOHEADER=${AUTOHEADER-"${am_missing_run}autoheader"} + + +MAKEINFO=${MAKEINFO-"${am_missing_run}makeinfo"} + +# We need awk for the "check" target. The system "awk" is bad on +# some platforms. +# Always define AMTAR for backward compatibility. Yes, it's still used +# in the wild :-( We should find a proper way to deprecate it ... +AMTAR='$${TAR-tar}' + +am__tar='$${TAR-tar} chof - "$$tardir"' am__untar='$${TAR-tar} xf -' + + + + + +ac_config_headers="$ac_config_headers config.h" + + +# Checks for programs. + +# Check whether --with-cppunit was given. +if test "${with_cppunit+set}" = set; then : + withval=$with_cppunit; +fi + + +if test "$with_cppunit" = "no" ; then + CPPUNIT_PATH="No_CPPUNIT" + CPPUNIT_INCLUDE= + CPPUNIT_LIBS= +else + + + +# Check whether --with-cppunit-prefix was given. +if test "${with_cppunit_prefix+set}" = set; then : + withval=$with_cppunit_prefix; cppunit_config_prefix="$withval" +else + cppunit_config_prefix="" +fi + + +# Check whether --with-cppunit-exec-prefix was given. +if test "${with_cppunit_exec_prefix+set}" = set; then : + withval=$with_cppunit_exec_prefix; cppunit_config_exec_prefix="$withval" +else + cppunit_config_exec_prefix="" +fi + + + if test x$cppunit_config_exec_prefix != x ; then + cppunit_config_args="$cppunit_config_args --exec-prefix=$cppunit_config_exec_prefix" + if test x${CPPUNIT_CONFIG+set} != xset ; then + CPPUNIT_CONFIG=$cppunit_config_exec_prefix/bin/cppunit-config + fi + fi + if test x$cppunit_config_prefix != x ; then + cppunit_config_args="$cppunit_config_args --prefix=$cppunit_config_prefix" + if test x${CPPUNIT_CONFIG+set} != xset ; then + CPPUNIT_CONFIG=$cppunit_config_prefix/bin/cppunit-config + fi + fi + + # Extract the first word of "cppunit-config", so it can be a program name with args. +set dummy cppunit-config; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_path_CPPUNIT_CONFIG+:} false; then : + $as_echo_n "(cached) " >&6 +else + case $CPPUNIT_CONFIG in + [\\/]* | ?:[\\/]*) + ac_cv_path_CPPUNIT_CONFIG="$CPPUNIT_CONFIG" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_path_CPPUNIT_CONFIG="$as_dir/$ac_word$ac_exec_ext" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + test -z "$ac_cv_path_CPPUNIT_CONFIG" && ac_cv_path_CPPUNIT_CONFIG="no" + ;; +esac +fi +CPPUNIT_CONFIG=$ac_cv_path_CPPUNIT_CONFIG +if test -n "$CPPUNIT_CONFIG"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CPPUNIT_CONFIG" >&5 +$as_echo "$CPPUNIT_CONFIG" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + cppunit_version_min=1.10.2 + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Cppunit - version >= $cppunit_version_min" >&5 +$as_echo_n "checking for Cppunit - version >= $cppunit_version_min... " >&6; } + no_cppunit="" + if test "$CPPUNIT_CONFIG" = "no" ; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + no_cppunit=yes + else + CPPUNIT_CFLAGS=`$CPPUNIT_CONFIG --cflags` + CPPUNIT_LIBS=`$CPPUNIT_CONFIG --libs` + cppunit_version=`$CPPUNIT_CONFIG --version` + + cppunit_major_version=`echo $cppunit_version | \ + sed 's/\([0-9]*\).\([0-9]*\).\([0-9]*\)/\1/'` + cppunit_minor_version=`echo $cppunit_version | \ + sed 's/\([0-9]*\).\([0-9]*\).\([0-9]*\)/\2/'` + cppunit_micro_version=`echo $cppunit_version | \ + sed 's/\([0-9]*\).\([0-9]*\).\([0-9]*\)/\3/'` + + cppunit_major_min=`echo $cppunit_version_min | \ + sed 's/\([0-9]*\).\([0-9]*\).\([0-9]*\)/\1/'` + if test "x${cppunit_major_min}" = "x" ; then + cppunit_major_min=0 + fi + + cppunit_minor_min=`echo $cppunit_version_min | \ + sed 's/\([0-9]*\).\([0-9]*\).\([0-9]*\)/\2/'` + if test "x${cppunit_minor_min}" = "x" ; then + cppunit_minor_min=0 + fi + + cppunit_micro_min=`echo $cppunit_version_min | \ + sed 's/\([0-9]*\).\([0-9]*\).\([0-9]*\)/\3/'` + if test "x${cppunit_micro_min}" = "x" ; then + cppunit_micro_min=0 + fi + + cppunit_version_proper=`expr \ + $cppunit_major_version \> $cppunit_major_min \| \ + $cppunit_major_version \= $cppunit_major_min \& \ + $cppunit_minor_version \> $cppunit_minor_min \| \ + $cppunit_major_version \= $cppunit_major_min \& \ + $cppunit_minor_version \= $cppunit_minor_min \& \ + $cppunit_micro_version \>= $cppunit_micro_min ` + + if test "$cppunit_version_proper" = "1" ; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $cppunit_major_version.$cppunit_minor_version.$cppunit_micro_version" >&5 +$as_echo "$cppunit_major_version.$cppunit_minor_version.$cppunit_micro_version" >&6; } + else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + no_cppunit=yes + fi + fi + + if test "x$no_cppunit" = x ; then + : + else + CPPUNIT_CFLAGS="" + CPPUNIT_LIBS="" + : + fi + + + + +fi + +if test "$CALLER" = "ANT" ; then +CPPUNIT_CFLAGS="$CPPUNIT_CFLAGS -DZKSERVER_CMD=\"\\\"${base_dir}/src/c/tests/zkServer.sh\\\"\"" +else +CPPUNIT_CFLAGS="$CPPUNIT_CFLAGS -DZKSERVER_CMD=\"\\\"./tests/zkServer.sh\\\"\"" +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for generated/zookeeper.jute.c" >&5 +$as_echo_n "checking for generated/zookeeper.jute.c... " >&6; } +if ${ac_cv_file_generated_zookeeper_jute_c+:} false; then : + $as_echo_n "(cached) " >&6 +else + test "$cross_compiling" = yes && + as_fn_error $? "cannot check for file existence when cross compiling" "$LINENO" 5 +if test -r "generated/zookeeper.jute.c"; then + ac_cv_file_generated_zookeeper_jute_c=yes +else + ac_cv_file_generated_zookeeper_jute_c=no +fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_file_generated_zookeeper_jute_c" >&5 +$as_echo "$ac_cv_file_generated_zookeeper_jute_c" >&6; } +if test "x$ac_cv_file_generated_zookeeper_jute_c" = xyes; then : + +cat >>confdefs.h <<_ACEOF +#define HAVE_GENERATED_ZOOKEEPER_JUTE_C 1 +_ACEOF + +else + as_fn_error $? "jute files are missing! Please run \"ant compile_jute\" while in the zookeeper top level directory." "$LINENO" 5 + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for generated/zookeeper.jute.h" >&5 +$as_echo_n "checking for generated/zookeeper.jute.h... " >&6; } +if ${ac_cv_file_generated_zookeeper_jute_h+:} false; then : + $as_echo_n "(cached) " >&6 +else + test "$cross_compiling" = yes && + as_fn_error $? "cannot check for file existence when cross compiling" "$LINENO" 5 +if test -r "generated/zookeeper.jute.h"; then + ac_cv_file_generated_zookeeper_jute_h=yes +else + ac_cv_file_generated_zookeeper_jute_h=no +fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_file_generated_zookeeper_jute_h" >&5 +$as_echo "$ac_cv_file_generated_zookeeper_jute_h" >&6; } +if test "x$ac_cv_file_generated_zookeeper_jute_h" = xyes; then : + +cat >>confdefs.h <<_ACEOF +#define HAVE_GENERATED_ZOOKEEPER_JUTE_H 1 +_ACEOF + +else + as_fn_error $? "jute files are missing! Please run \"ant compile_jute\" while in the zookeeper top level directory." "$LINENO" 5 + +fi + +fi + + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args. +set dummy ${ac_tool_prefix}gcc; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_CC+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_CC="${ac_tool_prefix}gcc" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +$as_echo "$CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_CC"; then + ac_ct_CC=$CC + # Extract the first word of "gcc", so it can be a program name with args. +set dummy gcc; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_CC+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_CC"; then + ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_CC="gcc" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_CC=$ac_cv_prog_ac_ct_CC +if test -n "$ac_ct_CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 +$as_echo "$ac_ct_CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_CC" = x; then + CC="" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + CC=$ac_ct_CC + fi +else + CC="$ac_cv_prog_CC" +fi + +if test -z "$CC"; then + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args. +set dummy ${ac_tool_prefix}cc; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_CC+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_CC="${ac_tool_prefix}cc" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +$as_echo "$CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + fi +fi +if test -z "$CC"; then + # Extract the first word of "cc", so it can be a program name with args. +set dummy cc; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_CC+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else + ac_prog_rejected=no +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then + ac_prog_rejected=yes + continue + fi + ac_cv_prog_CC="cc" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +if test $ac_prog_rejected = yes; then + # We found a bogon in the path, so make sure we never use it. + set dummy $ac_cv_prog_CC + shift + if test $# != 0; then + # We chose a different compiler from the bogus one. + # However, it has the same basename, so the bogon will be chosen + # first if we set CC to just the basename; use the full file name. + shift + ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@" + fi +fi +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +$as_echo "$CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$CC"; then + if test -n "$ac_tool_prefix"; then + for ac_prog in cl.exe + do + # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. +set dummy $ac_tool_prefix$ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_CC+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_CC="$ac_tool_prefix$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +$as_echo "$CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$CC" && break + done +fi +if test -z "$CC"; then + ac_ct_CC=$CC + for ac_prog in cl.exe +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_CC+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_CC"; then + ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_CC="$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_CC=$ac_cv_prog_ac_ct_CC +if test -n "$ac_ct_CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 +$as_echo "$ac_ct_CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$ac_ct_CC" && break +done + + if test "x$ac_ct_CC" = x; then + CC="" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + CC=$ac_ct_CC + fi +fi + +fi + + +test -z "$CC" && { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "no acceptable C compiler found in \$PATH +See \`config.log' for more details" "$LINENO" 5; } + +# Provide some information about the compiler. +$as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5 +set X $ac_compile +ac_compiler=$2 +for ac_option in --version -v -V -qversion; do + { { ac_try="$ac_compiler $ac_option >&5" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_compiler $ac_option >&5") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + sed '10a\ +... rest of stderr output deleted ... + 10q' conftest.err >conftest.er1 + cat conftest.er1 >&5 + fi + rm -f conftest.er1 conftest.err + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } +done + +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +ac_clean_files_save=$ac_clean_files +ac_clean_files="$ac_clean_files a.out a.out.dSYM a.exe b.out" +# Try to create an executable without -o first, disregard a.out. +# It will help us diagnose broken compilers, and finding out an intuition +# of exeext. +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler works" >&5 +$as_echo_n "checking whether the C compiler works... " >&6; } +ac_link_default=`$as_echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'` + +# The possible output files: +ac_files="a.out conftest.exe conftest a.exe a_out.exe b.out conftest.*" + +ac_rmfiles= +for ac_file in $ac_files +do + case $ac_file in + *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; + * ) ac_rmfiles="$ac_rmfiles $ac_file";; + esac +done +rm -f $ac_rmfiles + +if { { ac_try="$ac_link_default" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_link_default") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then : + # Autoconf-2.13 could set the ac_cv_exeext variable to `no'. +# So ignore a value of `no', otherwise this would lead to `EXEEXT = no' +# in a Makefile. We should not override ac_cv_exeext if it was cached, +# so that the user can short-circuit this test for compilers unknown to +# Autoconf. +for ac_file in $ac_files '' +do + test -f "$ac_file" || continue + case $ac_file in + *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) + ;; + [ab].out ) + # We found the default executable, but exeext='' is most + # certainly right. + break;; + *.* ) + if test "${ac_cv_exeext+set}" = set && test "$ac_cv_exeext" != no; + then :; else + ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` + fi + # We set ac_cv_exeext here because the later test for it is not + # safe: cross compilers may not add the suffix if given an `-o' + # argument, so we may need to know it at that point already. + # Even if this section looks crufty: it has the advantage of + # actually working. + break;; + * ) + break;; + esac +done +test "$ac_cv_exeext" = no && ac_cv_exeext= + +else + ac_file='' +fi +if test -z "$ac_file"; then : + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +$as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error 77 "C compiler cannot create executables +See \`config.log' for more details" "$LINENO" 5; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler default output file name" >&5 +$as_echo_n "checking for C compiler default output file name... " >&6; } +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_file" >&5 +$as_echo "$ac_file" >&6; } +ac_exeext=$ac_cv_exeext + +rm -f -r a.out a.out.dSYM a.exe conftest$ac_cv_exeext b.out +ac_clean_files=$ac_clean_files_save +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of executables" >&5 +$as_echo_n "checking for suffix of executables... " >&6; } +if { { ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_link") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then : + # If both `conftest.exe' and `conftest' are `present' (well, observable) +# catch `conftest.exe'. For instance with Cygwin, `ls conftest' will +# work properly (i.e., refer to `conftest.exe'), while it won't with +# `rm'. +for ac_file in conftest.exe conftest conftest.*; do + test -f "$ac_file" || continue + case $ac_file in + *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; + *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` + break;; + * ) break;; + esac +done +else + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "cannot compute suffix of executables: cannot compile and link +See \`config.log' for more details" "$LINENO" 5; } +fi +rm -f conftest conftest$ac_cv_exeext +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_exeext" >&5 +$as_echo "$ac_cv_exeext" >&6; } + +rm -f conftest.$ac_ext +EXEEXT=$ac_cv_exeext +ac_exeext=$EXEEXT +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +int +main () +{ +FILE *f = fopen ("conftest.out", "w"); + return ferror (f) || fclose (f) != 0; + + ; + return 0; +} +_ACEOF +ac_clean_files="$ac_clean_files conftest.out" +# Check that the compiler produces executables we can run. If not, either +# the compiler is broken, or we cross compile. +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are cross compiling" >&5 +$as_echo_n "checking whether we are cross compiling... " >&6; } +if test "$cross_compiling" != yes; then + { { ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_link") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + if { ac_try='./conftest$ac_cv_exeext' + { { case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; }; then + cross_compiling=no + else + if test "$cross_compiling" = maybe; then + cross_compiling=yes + else + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "cannot run C compiled programs. +If you meant to cross compile, use \`--host'. +See \`config.log' for more details" "$LINENO" 5; } + fi + fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $cross_compiling" >&5 +$as_echo "$cross_compiling" >&6; } + +rm -f conftest.$ac_ext conftest$ac_cv_exeext conftest.out +ac_clean_files=$ac_clean_files_save +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of object files" >&5 +$as_echo_n "checking for suffix of object files... " >&6; } +if ${ac_cv_objext+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +rm -f conftest.o conftest.obj +if { { ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_compile") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then : + for ac_file in conftest.o conftest.obj conftest.*; do + test -f "$ac_file" || continue; + case $ac_file in + *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM ) ;; + *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'` + break;; + esac +done +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "cannot compute suffix of object files: cannot compile +See \`config.log' for more details" "$LINENO" 5; } +fi +rm -f conftest.$ac_cv_objext conftest.$ac_ext +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_objext" >&5 +$as_echo "$ac_cv_objext" >&6; } +OBJEXT=$ac_cv_objext +ac_objext=$OBJEXT +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C compiler" >&5 +$as_echo_n "checking whether we are using the GNU C compiler... " >&6; } +if ${ac_cv_c_compiler_gnu+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ +#ifndef __GNUC__ + choke me +#endif + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_compiler_gnu=yes +else + ac_compiler_gnu=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +ac_cv_c_compiler_gnu=$ac_compiler_gnu + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5 +$as_echo "$ac_cv_c_compiler_gnu" >&6; } +if test $ac_compiler_gnu = yes; then + GCC=yes +else + GCC= +fi +ac_test_CFLAGS=${CFLAGS+set} +ac_save_CFLAGS=$CFLAGS +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5 +$as_echo_n "checking whether $CC accepts -g... " >&6; } +if ${ac_cv_prog_cc_g+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_save_c_werror_flag=$ac_c_werror_flag + ac_c_werror_flag=yes + ac_cv_prog_cc_g=no + CFLAGS="-g" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_prog_cc_g=yes +else + CFLAGS="" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + +else + ac_c_werror_flag=$ac_save_c_werror_flag + CFLAGS="-g" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_prog_cc_g=yes +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + ac_c_werror_flag=$ac_save_c_werror_flag +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5 +$as_echo "$ac_cv_prog_cc_g" >&6; } +if test "$ac_test_CFLAGS" = set; then + CFLAGS=$ac_save_CFLAGS +elif test $ac_cv_prog_cc_g = yes; then + if test "$GCC" = yes; then + CFLAGS="-g -O2" + else + CFLAGS="-g" + fi +else + if test "$GCC" = yes; then + CFLAGS="-O2" + else + CFLAGS= + fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5 +$as_echo_n "checking for $CC option to accept ISO C89... " >&6; } +if ${ac_cv_prog_cc_c89+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_cv_prog_cc_c89=no +ac_save_CC=$CC +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +#include +struct stat; +/* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */ +struct buf { int x; }; +FILE * (*rcsopen) (struct buf *, struct stat *, int); +static char *e (p, i) + char **p; + int i; +{ + return p[i]; +} +static char *f (char * (*g) (char **, int), char **p, ...) +{ + char *s; + va_list v; + va_start (v,p); + s = g (p, va_arg (v,int)); + va_end (v); + return s; +} + +/* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has + function prototypes and stuff, but not '\xHH' hex character constants. + These don't provoke an error unfortunately, instead are silently treated + as 'x'. The following induces an error, until -std is added to get + proper ANSI mode. Curiously '\x00'!='x' always comes out true, for an + array size at least. It's necessary to write '\x00'==0 to get something + that's true only with -std. */ +int osf4_cc_array ['\x00' == 0 ? 1 : -1]; + +/* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters + inside strings and character constants. */ +#define FOO(x) 'x' +int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1]; + +int test (int i, double x); +struct s1 {int (*f) (int a);}; +struct s2 {int (*f) (double a);}; +int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int); +int argc; +char **argv; +int +main () +{ +return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]; + ; + return 0; +} +_ACEOF +for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \ + -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" +do + CC="$ac_save_CC $ac_arg" + if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_prog_cc_c89=$ac_arg +fi +rm -f core conftest.err conftest.$ac_objext + test "x$ac_cv_prog_cc_c89" != "xno" && break +done +rm -f conftest.$ac_ext +CC=$ac_save_CC + +fi +# AC_CACHE_VAL +case "x$ac_cv_prog_cc_c89" in + x) + { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 +$as_echo "none needed" >&6; } ;; + xno) + { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 +$as_echo "unsupported" >&6; } ;; + *) + CC="$CC $ac_cv_prog_cc_c89" + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5 +$as_echo "$ac_cv_prog_cc_c89" >&6; } ;; +esac +if test "x$ac_cv_prog_cc_c89" != xno; then : + +fi + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu +DEPDIR="${am__leading_dot}deps" + +ac_config_commands="$ac_config_commands depfiles" + + +am_make=${MAKE-make} +cat > confinc << 'END' +am__doit: + @echo this is the am__doit target +.PHONY: am__doit +END +# If we don't find an include directive, just comment out the code. +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for style of include used by $am_make" >&5 +$as_echo_n "checking for style of include used by $am_make... " >&6; } +am__include="#" +am__quote= +_am_result=none +# First try GNU make style include. +echo "include confinc" > confmf +# Ignore all kinds of additional output from `make'. +case `$am_make -s -f confmf 2> /dev/null` in #( +*the\ am__doit\ target*) + am__include=include + am__quote= + _am_result=GNU + ;; +esac +# Now try BSD make style include. +if test "$am__include" = "#"; then + echo '.include "confinc"' > confmf + case `$am_make -s -f confmf 2> /dev/null` in #( + *the\ am__doit\ target*) + am__include=.include + am__quote="\"" + _am_result=BSD + ;; + esac +fi + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $_am_result" >&5 +$as_echo "$_am_result" >&6; } +rm -f confinc confmf + +# Check whether --enable-dependency-tracking was given. +if test "${enable_dependency_tracking+set}" = set; then : + enableval=$enable_dependency_tracking; +fi + +if test "x$enable_dependency_tracking" != xno; then + am_depcomp="$ac_aux_dir/depcomp" + AMDEPBACKSLASH='\' + am__nodep='_no' +fi + if test "x$enable_dependency_tracking" != xno; then + AMDEP_TRUE= + AMDEP_FALSE='#' +else + AMDEP_TRUE='#' + AMDEP_FALSE= +fi + + + +depcc="$CC" am_compiler_list= + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5 +$as_echo_n "checking dependency style of $depcc... " >&6; } +if ${am_cv_CC_dependencies_compiler_type+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then + # We make a subdir and do the tests there. Otherwise we can end up + # making bogus files that we don't know about and never remove. For + # instance it was reported that on HP-UX the gcc test will end up + # making a dummy file named `D' -- because `-MD' means `put the output + # in D'. + rm -rf conftest.dir + mkdir conftest.dir + # Copy depcomp to subdir because otherwise we won't find it if we're + # using a relative directory. + cp "$am_depcomp" conftest.dir + cd conftest.dir + # We will build objects and dependencies in a subdirectory because + # it helps to detect inapplicable dependency modes. For instance + # both Tru64's cc and ICC support -MD to output dependencies as a + # side effect of compilation, but ICC will put the dependencies in + # the current directory while Tru64 will put them in the object + # directory. + mkdir sub + + am_cv_CC_dependencies_compiler_type=none + if test "$am_compiler_list" = ""; then + am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp` + fi + am__universal=false + case " $depcc " in #( + *\ -arch\ *\ -arch\ *) am__universal=true ;; + esac + + for depmode in $am_compiler_list; do + # Setup a source with many dependencies, because some compilers + # like to wrap large dependency lists on column 80 (with \), and + # we should not choose a depcomp mode which is confused by this. + # + # We need to recreate these files for each test, as the compiler may + # overwrite some of them when testing with obscure command lines. + # This happens at least with the AIX C compiler. + : > sub/conftest.c + for i in 1 2 3 4 5 6; do + echo '#include "conftst'$i'.h"' >> sub/conftest.c + # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with + # Solaris 8's {/usr,}/bin/sh. + touch sub/conftst$i.h + done + echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf + + # We check with `-c' and `-o' for the sake of the "dashmstdout" + # mode. It turns out that the SunPro C++ compiler does not properly + # handle `-M -o', and we need to detect this. Also, some Intel + # versions had trouble with output in subdirs + am__obj=sub/conftest.${OBJEXT-o} + am__minus_obj="-o $am__obj" + case $depmode in + gcc) + # This depmode causes a compiler race in universal mode. + test "$am__universal" = false || continue + ;; + nosideeffect) + # after this tag, mechanisms are not by side-effect, so they'll + # only be used when explicitly requested + if test "x$enable_dependency_tracking" = xyes; then + continue + else + break + fi + ;; + msvc7 | msvc7msys | msvisualcpp | msvcmsys) + # This compiler won't grok `-c -o', but also, the minuso test has + # not run yet. These depmodes are late enough in the game, and + # so weak that their functioning should not be impacted. + am__obj=conftest.${OBJEXT-o} + am__minus_obj= + ;; + none) break ;; + esac + if depmode=$depmode \ + source=sub/conftest.c object=$am__obj \ + depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ + $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ + >/dev/null 2>conftest.err && + grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && + grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && + grep $am__obj sub/conftest.Po > /dev/null 2>&1 && + ${MAKE-make} -s -f confmf > /dev/null 2>&1; then + # icc doesn't choke on unknown options, it will just issue warnings + # or remarks (even with -Werror). So we grep stderr for any message + # that says an option was ignored or not supported. + # When given -MP, icc 7.0 and 7.1 complain thusly: + # icc: Command line warning: ignoring option '-M'; no argument required + # The diagnosis changed in icc 8.0: + # icc: Command line remark: option '-MP' not supported + if (grep 'ignoring option' conftest.err || + grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else + am_cv_CC_dependencies_compiler_type=$depmode + break + fi + fi + done + + cd .. + rm -rf conftest.dir +else + am_cv_CC_dependencies_compiler_type=none +fi + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_CC_dependencies_compiler_type" >&5 +$as_echo "$am_cv_CC_dependencies_compiler_type" >&6; } +CCDEPMODE=depmode=$am_cv_CC_dependencies_compiler_type + + if + test "x$enable_dependency_tracking" != xno \ + && test "$am_cv_CC_dependencies_compiler_type" = gcc3; then + am__fastdepCC_TRUE= + am__fastdepCC_FALSE='#' +else + am__fastdepCC_TRUE='#' + am__fastdepCC_FALSE= +fi + + +if test "x$CC" != xcc; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC and cc understand -c and -o together" >&5 +$as_echo_n "checking whether $CC and cc understand -c and -o together... " >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether cc understands -c and -o together" >&5 +$as_echo_n "checking whether cc understands -c and -o together... " >&6; } +fi +set dummy $CC; ac_cc=`$as_echo "$2" | + sed 's/[^a-zA-Z0-9_]/_/g;s/^[0-9]/_/'` +if eval \${ac_cv_prog_cc_${ac_cc}_c_o+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +# Make sure it works both with $CC and with simple cc. +# We do the test twice because some compilers refuse to overwrite an +# existing .o file with -o, though they will create one. +ac_try='$CC -c conftest.$ac_ext -o conftest2.$ac_objext >&5' +rm -f conftest2.* +if { { case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && + test -f conftest2.$ac_objext && { { case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; +then + eval ac_cv_prog_cc_${ac_cc}_c_o=yes + if test "x$CC" != xcc; then + # Test first that cc exists at all. + if { ac_try='cc -c conftest.$ac_ext >&5' + { { case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; }; then + ac_try='cc -c conftest.$ac_ext -o conftest2.$ac_objext >&5' + rm -f conftest2.* + if { { case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && + test -f conftest2.$ac_objext && { { case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; + then + # cc works too. + : + else + # cc exists but doesn't like -o. + eval ac_cv_prog_cc_${ac_cc}_c_o=no + fi + fi + fi +else + eval ac_cv_prog_cc_${ac_cc}_c_o=no +fi +rm -f core conftest* + +fi +if eval test \$ac_cv_prog_cc_${ac_cc}_c_o = yes; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + +$as_echo "#define NO_MINUS_C_MINUS_O 1" >>confdefs.h + +fi + +# FIXME: we rely on the cache variable name because +# there is no other way. +set dummy $CC +am_cc=`echo $2 | sed 's/[^a-zA-Z0-9_]/_/g;s/^[0-9]/_/'` +eval am_t=\$ac_cv_prog_cc_${am_cc}_c_o +if test "$am_t" != yes; then + # Losing compiler, so override with the script. + # FIXME: It is wrong to rewrite CC. + # But if we don't then we get into trouble of one sort or another. + # A longer-term fix would be to have automake use am__CC in this case, + # and then we could set am__CC="\$(top_srcdir)/compile \$(CC)" + CC="$am_aux_dir/compile $CC" +fi + + +ac_ext=cpp +ac_cpp='$CXXCPP $CPPFLAGS' +ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_cxx_compiler_gnu +if test -z "$CXX"; then + if test -n "$CCC"; then + CXX=$CCC + else + if test -n "$ac_tool_prefix"; then + for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC + do + # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. +set dummy $ac_tool_prefix$ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_CXX+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$CXX"; then + ac_cv_prog_CXX="$CXX" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_CXX="$ac_tool_prefix$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +CXX=$ac_cv_prog_CXX +if test -n "$CXX"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CXX" >&5 +$as_echo "$CXX" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$CXX" && break + done +fi +if test -z "$CXX"; then + ac_ct_CXX=$CXX + for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_CXX+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_CXX"; then + ac_cv_prog_ac_ct_CXX="$ac_ct_CXX" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_CXX="$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_CXX=$ac_cv_prog_ac_ct_CXX +if test -n "$ac_ct_CXX"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CXX" >&5 +$as_echo "$ac_ct_CXX" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$ac_ct_CXX" && break +done + + if test "x$ac_ct_CXX" = x; then + CXX="g++" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + CXX=$ac_ct_CXX + fi +fi + + fi +fi +# Provide some information about the compiler. +$as_echo "$as_me:${as_lineno-$LINENO}: checking for C++ compiler version" >&5 +set X $ac_compile +ac_compiler=$2 +for ac_option in --version -v -V -qversion; do + { { ac_try="$ac_compiler $ac_option >&5" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_compiler $ac_option >&5") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + sed '10a\ +... rest of stderr output deleted ... + 10q' conftest.err >conftest.er1 + cat conftest.er1 >&5 + fi + rm -f conftest.er1 conftest.err + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } +done + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C++ compiler" >&5 +$as_echo_n "checking whether we are using the GNU C++ compiler... " >&6; } +if ${ac_cv_cxx_compiler_gnu+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ +#ifndef __GNUC__ + choke me +#endif + + ; + return 0; +} +_ACEOF +if ac_fn_cxx_try_compile "$LINENO"; then : + ac_compiler_gnu=yes +else + ac_compiler_gnu=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +ac_cv_cxx_compiler_gnu=$ac_compiler_gnu + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_cxx_compiler_gnu" >&5 +$as_echo "$ac_cv_cxx_compiler_gnu" >&6; } +if test $ac_compiler_gnu = yes; then + GXX=yes +else + GXX= +fi +ac_test_CXXFLAGS=${CXXFLAGS+set} +ac_save_CXXFLAGS=$CXXFLAGS +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CXX accepts -g" >&5 +$as_echo_n "checking whether $CXX accepts -g... " >&6; } +if ${ac_cv_prog_cxx_g+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_save_cxx_werror_flag=$ac_cxx_werror_flag + ac_cxx_werror_flag=yes + ac_cv_prog_cxx_g=no + CXXFLAGS="-g" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_cxx_try_compile "$LINENO"; then : + ac_cv_prog_cxx_g=yes +else + CXXFLAGS="" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_cxx_try_compile "$LINENO"; then : + +else + ac_cxx_werror_flag=$ac_save_cxx_werror_flag + CXXFLAGS="-g" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_cxx_try_compile "$LINENO"; then : + ac_cv_prog_cxx_g=yes +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + ac_cxx_werror_flag=$ac_save_cxx_werror_flag +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cxx_g" >&5 +$as_echo "$ac_cv_prog_cxx_g" >&6; } +if test "$ac_test_CXXFLAGS" = set; then + CXXFLAGS=$ac_save_CXXFLAGS +elif test $ac_cv_prog_cxx_g = yes; then + if test "$GXX" = yes; then + CXXFLAGS="-g -O2" + else + CXXFLAGS="-g" + fi +else + if test "$GXX" = yes; then + CXXFLAGS="-O2" + else + CXXFLAGS= + fi +fi +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + +depcc="$CXX" am_compiler_list= + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5 +$as_echo_n "checking dependency style of $depcc... " >&6; } +if ${am_cv_CXX_dependencies_compiler_type+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then + # We make a subdir and do the tests there. Otherwise we can end up + # making bogus files that we don't know about and never remove. For + # instance it was reported that on HP-UX the gcc test will end up + # making a dummy file named `D' -- because `-MD' means `put the output + # in D'. + rm -rf conftest.dir + mkdir conftest.dir + # Copy depcomp to subdir because otherwise we won't find it if we're + # using a relative directory. + cp "$am_depcomp" conftest.dir + cd conftest.dir + # We will build objects and dependencies in a subdirectory because + # it helps to detect inapplicable dependency modes. For instance + # both Tru64's cc and ICC support -MD to output dependencies as a + # side effect of compilation, but ICC will put the dependencies in + # the current directory while Tru64 will put them in the object + # directory. + mkdir sub + + am_cv_CXX_dependencies_compiler_type=none + if test "$am_compiler_list" = ""; then + am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp` + fi + am__universal=false + case " $depcc " in #( + *\ -arch\ *\ -arch\ *) am__universal=true ;; + esac + + for depmode in $am_compiler_list; do + # Setup a source with many dependencies, because some compilers + # like to wrap large dependency lists on column 80 (with \), and + # we should not choose a depcomp mode which is confused by this. + # + # We need to recreate these files for each test, as the compiler may + # overwrite some of them when testing with obscure command lines. + # This happens at least with the AIX C compiler. + : > sub/conftest.c + for i in 1 2 3 4 5 6; do + echo '#include "conftst'$i'.h"' >> sub/conftest.c + # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with + # Solaris 8's {/usr,}/bin/sh. + touch sub/conftst$i.h + done + echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf + + # We check with `-c' and `-o' for the sake of the "dashmstdout" + # mode. It turns out that the SunPro C++ compiler does not properly + # handle `-M -o', and we need to detect this. Also, some Intel + # versions had trouble with output in subdirs + am__obj=sub/conftest.${OBJEXT-o} + am__minus_obj="-o $am__obj" + case $depmode in + gcc) + # This depmode causes a compiler race in universal mode. + test "$am__universal" = false || continue + ;; + nosideeffect) + # after this tag, mechanisms are not by side-effect, so they'll + # only be used when explicitly requested + if test "x$enable_dependency_tracking" = xyes; then + continue + else + break + fi + ;; + msvc7 | msvc7msys | msvisualcpp | msvcmsys) + # This compiler won't grok `-c -o', but also, the minuso test has + # not run yet. These depmodes are late enough in the game, and + # so weak that their functioning should not be impacted. + am__obj=conftest.${OBJEXT-o} + am__minus_obj= + ;; + none) break ;; + esac + if depmode=$depmode \ + source=sub/conftest.c object=$am__obj \ + depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ + $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ + >/dev/null 2>conftest.err && + grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && + grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && + grep $am__obj sub/conftest.Po > /dev/null 2>&1 && + ${MAKE-make} -s -f confmf > /dev/null 2>&1; then + # icc doesn't choke on unknown options, it will just issue warnings + # or remarks (even with -Werror). So we grep stderr for any message + # that says an option was ignored or not supported. + # When given -MP, icc 7.0 and 7.1 complain thusly: + # icc: Command line warning: ignoring option '-M'; no argument required + # The diagnosis changed in icc 8.0: + # icc: Command line remark: option '-MP' not supported + if (grep 'ignoring option' conftest.err || + grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else + am_cv_CXX_dependencies_compiler_type=$depmode + break + fi + fi + done + + cd .. + rm -rf conftest.dir +else + am_cv_CXX_dependencies_compiler_type=none +fi + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_CXX_dependencies_compiler_type" >&5 +$as_echo "$am_cv_CXX_dependencies_compiler_type" >&6; } +CXXDEPMODE=depmode=$am_cv_CXX_dependencies_compiler_type + + if + test "x$enable_dependency_tracking" != xno \ + && test "$am_cv_CXX_dependencies_compiler_type" = gcc3; then + am__fastdepCXX_TRUE= + am__fastdepCXX_FALSE='#' +else + am__fastdepCXX_TRUE='#' + am__fastdepCXX_FALSE= +fi + + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ln -s works" >&5 +$as_echo_n "checking whether ln -s works... " >&6; } +LN_S=$as_ln_s +if test "$LN_S" = "ln -s"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no, using $LN_S" >&5 +$as_echo "no, using $LN_S" >&6; } +fi + + +# AC_DISABLE_SHARED +case `pwd` in + *\ * | *\ *) + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Libtool does not cope well with whitespace in \`pwd\`" >&5 +$as_echo "$as_me: WARNING: Libtool does not cope well with whitespace in \`pwd\`" >&2;} ;; +esac + + + +macro_version='2.4.2' +macro_revision='1.3337' + + + + + + + + + + + + + +ltmain="$ac_aux_dir/ltmain.sh" + +# Make sure we can run config.sub. +$SHELL "$ac_aux_dir/config.sub" sun4 >/dev/null 2>&1 || + as_fn_error $? "cannot run $SHELL $ac_aux_dir/config.sub" "$LINENO" 5 + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking build system type" >&5 +$as_echo_n "checking build system type... " >&6; } +if ${ac_cv_build+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_build_alias=$build_alias +test "x$ac_build_alias" = x && + ac_build_alias=`$SHELL "$ac_aux_dir/config.guess"` +test "x$ac_build_alias" = x && + as_fn_error $? "cannot guess build type; you must specify one" "$LINENO" 5 +ac_cv_build=`$SHELL "$ac_aux_dir/config.sub" $ac_build_alias` || + as_fn_error $? "$SHELL $ac_aux_dir/config.sub $ac_build_alias failed" "$LINENO" 5 + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_build" >&5 +$as_echo "$ac_cv_build" >&6; } +case $ac_cv_build in +*-*-*) ;; +*) as_fn_error $? "invalid value of canonical build" "$LINENO" 5;; +esac +build=$ac_cv_build +ac_save_IFS=$IFS; IFS='-' +set x $ac_cv_build +shift +build_cpu=$1 +build_vendor=$2 +shift; shift +# Remember, the first character of IFS is used to create $*, +# except with old shells: +build_os=$* +IFS=$ac_save_IFS +case $build_os in *\ *) build_os=`echo "$build_os" | sed 's/ /-/g'`;; esac + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking host system type" >&5 +$as_echo_n "checking host system type... " >&6; } +if ${ac_cv_host+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test "x$host_alias" = x; then + ac_cv_host=$ac_cv_build +else + ac_cv_host=`$SHELL "$ac_aux_dir/config.sub" $host_alias` || + as_fn_error $? "$SHELL $ac_aux_dir/config.sub $host_alias failed" "$LINENO" 5 +fi + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_host" >&5 +$as_echo "$ac_cv_host" >&6; } +case $ac_cv_host in +*-*-*) ;; +*) as_fn_error $? "invalid value of canonical host" "$LINENO" 5;; +esac +host=$ac_cv_host +ac_save_IFS=$IFS; IFS='-' +set x $ac_cv_host +shift +host_cpu=$1 +host_vendor=$2 +shift; shift +# Remember, the first character of IFS is used to create $*, +# except with old shells: +host_os=$* +IFS=$ac_save_IFS +case $host_os in *\ *) host_os=`echo "$host_os" | sed 's/ /-/g'`;; esac + + +# Backslashify metacharacters that are still active within +# double-quoted strings. +sed_quote_subst='s/\(["`$\\]\)/\\\1/g' + +# Same as above, but do not quote variable references. +double_quote_subst='s/\(["`\\]\)/\\\1/g' + +# Sed substitution to delay expansion of an escaped shell variable in a +# double_quote_subst'ed string. +delay_variable_subst='s/\\\\\\\\\\\$/\\\\\\$/g' + +# Sed substitution to delay expansion of an escaped single quote. +delay_single_quote_subst='s/'\''/'\'\\\\\\\'\''/g' + +# Sed substitution to avoid accidental globbing in evaled expressions +no_glob_subst='s/\*/\\\*/g' + +ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' +ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO +ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO$ECHO + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to print strings" >&5 +$as_echo_n "checking how to print strings... " >&6; } +# Test print first, because it will be a builtin if present. +if test "X`( print -r -- -n ) 2>/dev/null`" = X-n && \ + test "X`print -r -- $ECHO 2>/dev/null`" = "X$ECHO"; then + ECHO='print -r --' +elif test "X`printf %s $ECHO 2>/dev/null`" = "X$ECHO"; then + ECHO='printf %s\n' +else + # Use this function as a fallback that always works. + func_fallback_echo () + { + eval 'cat <<_LTECHO_EOF +$1 +_LTECHO_EOF' + } + ECHO='func_fallback_echo' +fi + +# func_echo_all arg... +# Invoke $ECHO with all args, space-separated. +func_echo_all () +{ + $ECHO "" +} + +case "$ECHO" in + printf*) { $as_echo "$as_me:${as_lineno-$LINENO}: result: printf" >&5 +$as_echo "printf" >&6; } ;; + print*) { $as_echo "$as_me:${as_lineno-$LINENO}: result: print -r" >&5 +$as_echo "print -r" >&6; } ;; + *) { $as_echo "$as_me:${as_lineno-$LINENO}: result: cat" >&5 +$as_echo "cat" >&6; } ;; +esac + + + + + + + + + + + + + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a sed that does not truncate output" >&5 +$as_echo_n "checking for a sed that does not truncate output... " >&6; } +if ${ac_cv_path_SED+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_script=s/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb/ + for ac_i in 1 2 3 4 5 6 7; do + ac_script="$ac_script$as_nl$ac_script" + done + echo "$ac_script" 2>/dev/null | sed 99q >conftest.sed + { ac_script=; unset ac_script;} + if test -z "$SED"; then + ac_path_SED_found=false + # Loop through the user's path and test for each of PROGNAME-LIST + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_prog in sed gsed; do + for ac_exec_ext in '' $ac_executable_extensions; do + ac_path_SED="$as_dir/$ac_prog$ac_exec_ext" + as_fn_executable_p "$ac_path_SED" || continue +# Check for GNU ac_path_SED and select it if it is found. + # Check for GNU $ac_path_SED +case `"$ac_path_SED" --version 2>&1` in +*GNU*) + ac_cv_path_SED="$ac_path_SED" ac_path_SED_found=:;; +*) + ac_count=0 + $as_echo_n 0123456789 >"conftest.in" + while : + do + cat "conftest.in" "conftest.in" >"conftest.tmp" + mv "conftest.tmp" "conftest.in" + cp "conftest.in" "conftest.nl" + $as_echo '' >> "conftest.nl" + "$ac_path_SED" -f conftest.sed < "conftest.nl" >"conftest.out" 2>/dev/null || break + diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break + as_fn_arith $ac_count + 1 && ac_count=$as_val + if test $ac_count -gt ${ac_path_SED_max-0}; then + # Best one so far, save it but keep looking for a better one + ac_cv_path_SED="$ac_path_SED" + ac_path_SED_max=$ac_count + fi + # 10*(2^10) chars as input seems more than enough + test $ac_count -gt 10 && break + done + rm -f conftest.in conftest.tmp conftest.nl conftest.out;; +esac + + $ac_path_SED_found && break 3 + done + done + done +IFS=$as_save_IFS + if test -z "$ac_cv_path_SED"; then + as_fn_error $? "no acceptable sed could be found in \$PATH" "$LINENO" 5 + fi +else + ac_cv_path_SED=$SED +fi + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_SED" >&5 +$as_echo "$ac_cv_path_SED" >&6; } + SED="$ac_cv_path_SED" + rm -f conftest.sed + +test -z "$SED" && SED=sed +Xsed="$SED -e 1s/^X//" + + + + + + + + + + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for grep that handles long lines and -e" >&5 +$as_echo_n "checking for grep that handles long lines and -e... " >&6; } +if ${ac_cv_path_GREP+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -z "$GREP"; then + ac_path_GREP_found=false + # Loop through the user's path and test for each of PROGNAME-LIST + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_prog in grep ggrep; do + for ac_exec_ext in '' $ac_executable_extensions; do + ac_path_GREP="$as_dir/$ac_prog$ac_exec_ext" + as_fn_executable_p "$ac_path_GREP" || continue +# Check for GNU ac_path_GREP and select it if it is found. + # Check for GNU $ac_path_GREP +case `"$ac_path_GREP" --version 2>&1` in +*GNU*) + ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_found=:;; +*) + ac_count=0 + $as_echo_n 0123456789 >"conftest.in" + while : + do + cat "conftest.in" "conftest.in" >"conftest.tmp" + mv "conftest.tmp" "conftest.in" + cp "conftest.in" "conftest.nl" + $as_echo 'GREP' >> "conftest.nl" + "$ac_path_GREP" -e 'GREP$' -e '-(cannot match)-' < "conftest.nl" >"conftest.out" 2>/dev/null || break + diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break + as_fn_arith $ac_count + 1 && ac_count=$as_val + if test $ac_count -gt ${ac_path_GREP_max-0}; then + # Best one so far, save it but keep looking for a better one + ac_cv_path_GREP="$ac_path_GREP" + ac_path_GREP_max=$ac_count + fi + # 10*(2^10) chars as input seems more than enough + test $ac_count -gt 10 && break + done + rm -f conftest.in conftest.tmp conftest.nl conftest.out;; +esac + + $ac_path_GREP_found && break 3 + done + done + done +IFS=$as_save_IFS + if test -z "$ac_cv_path_GREP"; then + as_fn_error $? "no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 + fi +else + ac_cv_path_GREP=$GREP +fi + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_GREP" >&5 +$as_echo "$ac_cv_path_GREP" >&6; } + GREP="$ac_cv_path_GREP" + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for egrep" >&5 +$as_echo_n "checking for egrep... " >&6; } +if ${ac_cv_path_EGREP+:} false; then : + $as_echo_n "(cached) " >&6 +else + if echo a | $GREP -E '(a|b)' >/dev/null 2>&1 + then ac_cv_path_EGREP="$GREP -E" + else + if test -z "$EGREP"; then + ac_path_EGREP_found=false + # Loop through the user's path and test for each of PROGNAME-LIST + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_prog in egrep; do + for ac_exec_ext in '' $ac_executable_extensions; do + ac_path_EGREP="$as_dir/$ac_prog$ac_exec_ext" + as_fn_executable_p "$ac_path_EGREP" || continue +# Check for GNU ac_path_EGREP and select it if it is found. + # Check for GNU $ac_path_EGREP +case `"$ac_path_EGREP" --version 2>&1` in +*GNU*) + ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_found=:;; +*) + ac_count=0 + $as_echo_n 0123456789 >"conftest.in" + while : + do + cat "conftest.in" "conftest.in" >"conftest.tmp" + mv "conftest.tmp" "conftest.in" + cp "conftest.in" "conftest.nl" + $as_echo 'EGREP' >> "conftest.nl" + "$ac_path_EGREP" 'EGREP$' < "conftest.nl" >"conftest.out" 2>/dev/null || break + diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break + as_fn_arith $ac_count + 1 && ac_count=$as_val + if test $ac_count -gt ${ac_path_EGREP_max-0}; then + # Best one so far, save it but keep looking for a better one + ac_cv_path_EGREP="$ac_path_EGREP" + ac_path_EGREP_max=$ac_count + fi + # 10*(2^10) chars as input seems more than enough + test $ac_count -gt 10 && break + done + rm -f conftest.in conftest.tmp conftest.nl conftest.out;; +esac + + $ac_path_EGREP_found && break 3 + done + done + done +IFS=$as_save_IFS + if test -z "$ac_cv_path_EGREP"; then + as_fn_error $? "no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 + fi +else + ac_cv_path_EGREP=$EGREP +fi + + fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_EGREP" >&5 +$as_echo "$ac_cv_path_EGREP" >&6; } + EGREP="$ac_cv_path_EGREP" + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for fgrep" >&5 +$as_echo_n "checking for fgrep... " >&6; } +if ${ac_cv_path_FGREP+:} false; then : + $as_echo_n "(cached) " >&6 +else + if echo 'ab*c' | $GREP -F 'ab*c' >/dev/null 2>&1 + then ac_cv_path_FGREP="$GREP -F" + else + if test -z "$FGREP"; then + ac_path_FGREP_found=false + # Loop through the user's path and test for each of PROGNAME-LIST + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_prog in fgrep; do + for ac_exec_ext in '' $ac_executable_extensions; do + ac_path_FGREP="$as_dir/$ac_prog$ac_exec_ext" + as_fn_executable_p "$ac_path_FGREP" || continue +# Check for GNU ac_path_FGREP and select it if it is found. + # Check for GNU $ac_path_FGREP +case `"$ac_path_FGREP" --version 2>&1` in +*GNU*) + ac_cv_path_FGREP="$ac_path_FGREP" ac_path_FGREP_found=:;; +*) + ac_count=0 + $as_echo_n 0123456789 >"conftest.in" + while : + do + cat "conftest.in" "conftest.in" >"conftest.tmp" + mv "conftest.tmp" "conftest.in" + cp "conftest.in" "conftest.nl" + $as_echo 'FGREP' >> "conftest.nl" + "$ac_path_FGREP" FGREP < "conftest.nl" >"conftest.out" 2>/dev/null || break + diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break + as_fn_arith $ac_count + 1 && ac_count=$as_val + if test $ac_count -gt ${ac_path_FGREP_max-0}; then + # Best one so far, save it but keep looking for a better one + ac_cv_path_FGREP="$ac_path_FGREP" + ac_path_FGREP_max=$ac_count + fi + # 10*(2^10) chars as input seems more than enough + test $ac_count -gt 10 && break + done + rm -f conftest.in conftest.tmp conftest.nl conftest.out;; +esac + + $ac_path_FGREP_found && break 3 + done + done + done +IFS=$as_save_IFS + if test -z "$ac_cv_path_FGREP"; then + as_fn_error $? "no acceptable fgrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 + fi +else + ac_cv_path_FGREP=$FGREP +fi + + fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_FGREP" >&5 +$as_echo "$ac_cv_path_FGREP" >&6; } + FGREP="$ac_cv_path_FGREP" + + +test -z "$GREP" && GREP=grep + + + + + + + + + + + + + + + + + + + +# Check whether --with-gnu-ld was given. +if test "${with_gnu_ld+set}" = set; then : + withval=$with_gnu_ld; test "$withval" = no || with_gnu_ld=yes +else + with_gnu_ld=no +fi + +ac_prog=ld +if test "$GCC" = yes; then + # Check if gcc -print-prog-name=ld gives a path. + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ld used by $CC" >&5 +$as_echo_n "checking for ld used by $CC... " >&6; } + case $host in + *-*-mingw*) + # gcc leaves a trailing carriage return which upsets mingw + ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;; + *) + ac_prog=`($CC -print-prog-name=ld) 2>&5` ;; + esac + case $ac_prog in + # Accept absolute paths. + [\\/]* | ?:[\\/]*) + re_direlt='/[^/][^/]*/\.\./' + # Canonicalize the pathname of ld + ac_prog=`$ECHO "$ac_prog"| $SED 's%\\\\%/%g'` + while $ECHO "$ac_prog" | $GREP "$re_direlt" > /dev/null 2>&1; do + ac_prog=`$ECHO $ac_prog| $SED "s%$re_direlt%/%"` + done + test -z "$LD" && LD="$ac_prog" + ;; + "") + # If it fails, then pretend we aren't using GCC. + ac_prog=ld + ;; + *) + # If it is relative, then search for the first ld in PATH. + with_gnu_ld=unknown + ;; + esac +elif test "$with_gnu_ld" = yes; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU ld" >&5 +$as_echo_n "checking for GNU ld... " >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for non-GNU ld" >&5 +$as_echo_n "checking for non-GNU ld... " >&6; } +fi +if ${lt_cv_path_LD+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -z "$LD"; then + lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR + for ac_dir in $PATH; do + IFS="$lt_save_ifs" + test -z "$ac_dir" && ac_dir=. + if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then + lt_cv_path_LD="$ac_dir/$ac_prog" + # Check to see if the program is GNU ld. I'd rather use --version, + # but apparently some variants of GNU ld only accept -v. + # Break only if it was the GNU/non-GNU ld that we prefer. + case `"$lt_cv_path_LD" -v 2>&1 &5 +$as_echo "$LD" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi +test -z "$LD" && as_fn_error $? "no acceptable ld found in \$PATH" "$LINENO" 5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if the linker ($LD) is GNU ld" >&5 +$as_echo_n "checking if the linker ($LD) is GNU ld... " >&6; } +if ${lt_cv_prog_gnu_ld+:} false; then : + $as_echo_n "(cached) " >&6 +else + # I'd rather use --version here, but apparently some GNU lds only accept -v. +case `$LD -v 2>&1 &5 +$as_echo "$lt_cv_prog_gnu_ld" >&6; } +with_gnu_ld=$lt_cv_prog_gnu_ld + + + + + + + + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for BSD- or MS-compatible name lister (nm)" >&5 +$as_echo_n "checking for BSD- or MS-compatible name lister (nm)... " >&6; } +if ${lt_cv_path_NM+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$NM"; then + # Let the user override the test. + lt_cv_path_NM="$NM" +else + lt_nm_to_check="${ac_tool_prefix}nm" + if test -n "$ac_tool_prefix" && test "$build" = "$host"; then + lt_nm_to_check="$lt_nm_to_check nm" + fi + for lt_tmp_nm in $lt_nm_to_check; do + lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR + for ac_dir in $PATH /usr/ccs/bin/elf /usr/ccs/bin /usr/ucb /bin; do + IFS="$lt_save_ifs" + test -z "$ac_dir" && ac_dir=. + tmp_nm="$ac_dir/$lt_tmp_nm" + if test -f "$tmp_nm" || test -f "$tmp_nm$ac_exeext" ; then + # Check to see if the nm accepts a BSD-compat flag. + # Adding the `sed 1q' prevents false positives on HP-UX, which says: + # nm: unknown option "B" ignored + # Tru64's nm complains that /dev/null is an invalid object file + case `"$tmp_nm" -B /dev/null 2>&1 | sed '1q'` in + */dev/null* | *'Invalid file or object type'*) + lt_cv_path_NM="$tmp_nm -B" + break + ;; + *) + case `"$tmp_nm" -p /dev/null 2>&1 | sed '1q'` in + */dev/null*) + lt_cv_path_NM="$tmp_nm -p" + break + ;; + *) + lt_cv_path_NM=${lt_cv_path_NM="$tmp_nm"} # keep the first match, but + continue # so that we can try to find one that supports BSD flags + ;; + esac + ;; + esac + fi + done + IFS="$lt_save_ifs" + done + : ${lt_cv_path_NM=no} +fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_path_NM" >&5 +$as_echo "$lt_cv_path_NM" >&6; } +if test "$lt_cv_path_NM" != "no"; then + NM="$lt_cv_path_NM" +else + # Didn't find any BSD compatible name lister, look for dumpbin. + if test -n "$DUMPBIN"; then : + # Let the user override the test. + else + if test -n "$ac_tool_prefix"; then + for ac_prog in dumpbin "link -dump" + do + # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. +set dummy $ac_tool_prefix$ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_DUMPBIN+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$DUMPBIN"; then + ac_cv_prog_DUMPBIN="$DUMPBIN" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_DUMPBIN="$ac_tool_prefix$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +DUMPBIN=$ac_cv_prog_DUMPBIN +if test -n "$DUMPBIN"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DUMPBIN" >&5 +$as_echo "$DUMPBIN" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$DUMPBIN" && break + done +fi +if test -z "$DUMPBIN"; then + ac_ct_DUMPBIN=$DUMPBIN + for ac_prog in dumpbin "link -dump" +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_DUMPBIN+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_DUMPBIN"; then + ac_cv_prog_ac_ct_DUMPBIN="$ac_ct_DUMPBIN" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_DUMPBIN="$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_DUMPBIN=$ac_cv_prog_ac_ct_DUMPBIN +if test -n "$ac_ct_DUMPBIN"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DUMPBIN" >&5 +$as_echo "$ac_ct_DUMPBIN" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$ac_ct_DUMPBIN" && break +done + + if test "x$ac_ct_DUMPBIN" = x; then + DUMPBIN=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + DUMPBIN=$ac_ct_DUMPBIN + fi +fi + + case `$DUMPBIN -symbols /dev/null 2>&1 | sed '1q'` in + *COFF*) + DUMPBIN="$DUMPBIN -symbols" + ;; + *) + DUMPBIN=: + ;; + esac + fi + + if test "$DUMPBIN" != ":"; then + NM="$DUMPBIN" + fi +fi +test -z "$NM" && NM=nm + + + + + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking the name lister ($NM) interface" >&5 +$as_echo_n "checking the name lister ($NM) interface... " >&6; } +if ${lt_cv_nm_interface+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_nm_interface="BSD nm" + echo "int some_variable = 0;" > conftest.$ac_ext + (eval echo "\"\$as_me:$LINENO: $ac_compile\"" >&5) + (eval "$ac_compile" 2>conftest.err) + cat conftest.err >&5 + (eval echo "\"\$as_me:$LINENO: $NM \\\"conftest.$ac_objext\\\"\"" >&5) + (eval "$NM \"conftest.$ac_objext\"" 2>conftest.err > conftest.out) + cat conftest.err >&5 + (eval echo "\"\$as_me:$LINENO: output\"" >&5) + cat conftest.out >&5 + if $GREP 'External.*some_variable' conftest.out > /dev/null; then + lt_cv_nm_interface="MS dumpbin" + fi + rm -f conftest* +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_nm_interface" >&5 +$as_echo "$lt_cv_nm_interface" >&6; } + +# find the maximum length of command line arguments +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking the maximum length of command line arguments" >&5 +$as_echo_n "checking the maximum length of command line arguments... " >&6; } +if ${lt_cv_sys_max_cmd_len+:} false; then : + $as_echo_n "(cached) " >&6 +else + i=0 + teststring="ABCD" + + case $build_os in + msdosdjgpp*) + # On DJGPP, this test can blow up pretty badly due to problems in libc + # (any single argument exceeding 2000 bytes causes a buffer overrun + # during glob expansion). Even if it were fixed, the result of this + # check would be larger than it should be. + lt_cv_sys_max_cmd_len=12288; # 12K is about right + ;; + + gnu*) + # Under GNU Hurd, this test is not required because there is + # no limit to the length of command line arguments. + # Libtool will interpret -1 as no limit whatsoever + lt_cv_sys_max_cmd_len=-1; + ;; + + cygwin* | mingw* | cegcc*) + # On Win9x/ME, this test blows up -- it succeeds, but takes + # about 5 minutes as the teststring grows exponentially. + # Worse, since 9x/ME are not pre-emptively multitasking, + # you end up with a "frozen" computer, even though with patience + # the test eventually succeeds (with a max line length of 256k). + # Instead, let's just punt: use the minimum linelength reported by + # all of the supported platforms: 8192 (on NT/2K/XP). + lt_cv_sys_max_cmd_len=8192; + ;; + + mint*) + # On MiNT this can take a long time and run out of memory. + lt_cv_sys_max_cmd_len=8192; + ;; + + amigaos*) + # On AmigaOS with pdksh, this test takes hours, literally. + # So we just punt and use a minimum line length of 8192. + lt_cv_sys_max_cmd_len=8192; + ;; + + netbsd* | freebsd* | openbsd* | darwin* | dragonfly*) + # This has been around since 386BSD, at least. Likely further. + if test -x /sbin/sysctl; then + lt_cv_sys_max_cmd_len=`/sbin/sysctl -n kern.argmax` + elif test -x /usr/sbin/sysctl; then + lt_cv_sys_max_cmd_len=`/usr/sbin/sysctl -n kern.argmax` + else + lt_cv_sys_max_cmd_len=65536 # usable default for all BSDs + fi + # And add a safety zone + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` + ;; + + interix*) + # We know the value 262144 and hardcode it with a safety zone (like BSD) + lt_cv_sys_max_cmd_len=196608 + ;; + + os2*) + # The test takes a long time on OS/2. + lt_cv_sys_max_cmd_len=8192 + ;; + + osf*) + # Dr. Hans Ekkehard Plesser reports seeing a kernel panic running configure + # due to this test when exec_disable_arg_limit is 1 on Tru64. It is not + # nice to cause kernel panics so lets avoid the loop below. + # First set a reasonable default. + lt_cv_sys_max_cmd_len=16384 + # + if test -x /sbin/sysconfig; then + case `/sbin/sysconfig -q proc exec_disable_arg_limit` in + *1*) lt_cv_sys_max_cmd_len=-1 ;; + esac + fi + ;; + sco3.2v5*) + lt_cv_sys_max_cmd_len=102400 + ;; + sysv5* | sco5v6* | sysv4.2uw2*) + kargmax=`grep ARG_MAX /etc/conf/cf.d/stune 2>/dev/null` + if test -n "$kargmax"; then + lt_cv_sys_max_cmd_len=`echo $kargmax | sed 's/.*[ ]//'` + else + lt_cv_sys_max_cmd_len=32768 + fi + ;; + *) + lt_cv_sys_max_cmd_len=`(getconf ARG_MAX) 2> /dev/null` + if test -n "$lt_cv_sys_max_cmd_len"; then + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` + else + # Make teststring a little bigger before we do anything with it. + # a 1K string should be a reasonable start. + for i in 1 2 3 4 5 6 7 8 ; do + teststring=$teststring$teststring + done + SHELL=${SHELL-${CONFIG_SHELL-/bin/sh}} + # If test is not a shell built-in, we'll probably end up computing a + # maximum length that is only half of the actual maximum length, but + # we can't tell. + while { test "X"`env echo "$teststring$teststring" 2>/dev/null` \ + = "X$teststring$teststring"; } >/dev/null 2>&1 && + test $i != 17 # 1/2 MB should be enough + do + i=`expr $i + 1` + teststring=$teststring$teststring + done + # Only check the string length outside the loop. + lt_cv_sys_max_cmd_len=`expr "X$teststring" : ".*" 2>&1` + teststring= + # Add a significant safety factor because C++ compilers can tack on + # massive amounts of additional arguments before passing them to the + # linker. It appears as though 1/2 is a usable value. + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 2` + fi + ;; + esac + +fi + +if test -n $lt_cv_sys_max_cmd_len ; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_sys_max_cmd_len" >&5 +$as_echo "$lt_cv_sys_max_cmd_len" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: none" >&5 +$as_echo "none" >&6; } +fi +max_cmd_len=$lt_cv_sys_max_cmd_len + + + + + + +: ${CP="cp -f"} +: ${MV="mv -f"} +: ${RM="rm -f"} + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the shell understands some XSI constructs" >&5 +$as_echo_n "checking whether the shell understands some XSI constructs... " >&6; } +# Try some XSI features +xsi_shell=no +( _lt_dummy="a/b/c" + test "${_lt_dummy##*/},${_lt_dummy%/*},${_lt_dummy#??}"${_lt_dummy%"$_lt_dummy"}, \ + = c,a/b,b/c, \ + && eval 'test $(( 1 + 1 )) -eq 2 \ + && test "${#_lt_dummy}" -eq 5' ) >/dev/null 2>&1 \ + && xsi_shell=yes +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $xsi_shell" >&5 +$as_echo "$xsi_shell" >&6; } + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the shell understands \"+=\"" >&5 +$as_echo_n "checking whether the shell understands \"+=\"... " >&6; } +lt_shell_append=no +( foo=bar; set foo baz; eval "$1+=\$2" && test "$foo" = barbaz ) \ + >/dev/null 2>&1 \ + && lt_shell_append=yes +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_shell_append" >&5 +$as_echo "$lt_shell_append" >&6; } + + +if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then + lt_unset=unset +else + lt_unset=false +fi + + + + + +# test EBCDIC or ASCII +case `echo X|tr X '\101'` in + A) # ASCII based system + # \n is not interpreted correctly by Solaris 8 /usr/ucb/tr + lt_SP2NL='tr \040 \012' + lt_NL2SP='tr \015\012 \040\040' + ;; + *) # EBCDIC based system + lt_SP2NL='tr \100 \n' + lt_NL2SP='tr \r\n \100\100' + ;; +esac + + + + + + + + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to convert $build file names to $host format" >&5 +$as_echo_n "checking how to convert $build file names to $host format... " >&6; } +if ${lt_cv_to_host_file_cmd+:} false; then : + $as_echo_n "(cached) " >&6 +else + case $host in + *-*-mingw* ) + case $build in + *-*-mingw* ) # actually msys + lt_cv_to_host_file_cmd=func_convert_file_msys_to_w32 + ;; + *-*-cygwin* ) + lt_cv_to_host_file_cmd=func_convert_file_cygwin_to_w32 + ;; + * ) # otherwise, assume *nix + lt_cv_to_host_file_cmd=func_convert_file_nix_to_w32 + ;; + esac + ;; + *-*-cygwin* ) + case $build in + *-*-mingw* ) # actually msys + lt_cv_to_host_file_cmd=func_convert_file_msys_to_cygwin + ;; + *-*-cygwin* ) + lt_cv_to_host_file_cmd=func_convert_file_noop + ;; + * ) # otherwise, assume *nix + lt_cv_to_host_file_cmd=func_convert_file_nix_to_cygwin + ;; + esac + ;; + * ) # unhandled hosts (and "normal" native builds) + lt_cv_to_host_file_cmd=func_convert_file_noop + ;; +esac + +fi + +to_host_file_cmd=$lt_cv_to_host_file_cmd +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_to_host_file_cmd" >&5 +$as_echo "$lt_cv_to_host_file_cmd" >&6; } + + + + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to convert $build file names to toolchain format" >&5 +$as_echo_n "checking how to convert $build file names to toolchain format... " >&6; } +if ${lt_cv_to_tool_file_cmd+:} false; then : + $as_echo_n "(cached) " >&6 +else + #assume ordinary cross tools, or native build. +lt_cv_to_tool_file_cmd=func_convert_file_noop +case $host in + *-*-mingw* ) + case $build in + *-*-mingw* ) # actually msys + lt_cv_to_tool_file_cmd=func_convert_file_msys_to_w32 + ;; + esac + ;; +esac + +fi + +to_tool_file_cmd=$lt_cv_to_tool_file_cmd +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_to_tool_file_cmd" >&5 +$as_echo "$lt_cv_to_tool_file_cmd" >&6; } + + + + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $LD option to reload object files" >&5 +$as_echo_n "checking for $LD option to reload object files... " >&6; } +if ${lt_cv_ld_reload_flag+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_ld_reload_flag='-r' +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_reload_flag" >&5 +$as_echo "$lt_cv_ld_reload_flag" >&6; } +reload_flag=$lt_cv_ld_reload_flag +case $reload_flag in +"" | " "*) ;; +*) reload_flag=" $reload_flag" ;; +esac +reload_cmds='$LD$reload_flag -o $output$reload_objs' +case $host_os in + cygwin* | mingw* | pw32* | cegcc*) + if test "$GCC" != yes; then + reload_cmds=false + fi + ;; + darwin*) + if test "$GCC" = yes; then + reload_cmds='$LTCC $LTCFLAGS -nostdlib ${wl}-r -o $output$reload_objs' + else + reload_cmds='$LD$reload_flag -o $output$reload_objs' + fi + ;; +esac + + + + + + + + + +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}objdump", so it can be a program name with args. +set dummy ${ac_tool_prefix}objdump; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_OBJDUMP+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$OBJDUMP"; then + ac_cv_prog_OBJDUMP="$OBJDUMP" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_OBJDUMP="${ac_tool_prefix}objdump" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +OBJDUMP=$ac_cv_prog_OBJDUMP +if test -n "$OBJDUMP"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OBJDUMP" >&5 +$as_echo "$OBJDUMP" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_OBJDUMP"; then + ac_ct_OBJDUMP=$OBJDUMP + # Extract the first word of "objdump", so it can be a program name with args. +set dummy objdump; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_OBJDUMP+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_OBJDUMP"; then + ac_cv_prog_ac_ct_OBJDUMP="$ac_ct_OBJDUMP" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_OBJDUMP="objdump" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_OBJDUMP=$ac_cv_prog_ac_ct_OBJDUMP +if test -n "$ac_ct_OBJDUMP"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OBJDUMP" >&5 +$as_echo "$ac_ct_OBJDUMP" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_OBJDUMP" = x; then + OBJDUMP="false" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + OBJDUMP=$ac_ct_OBJDUMP + fi +else + OBJDUMP="$ac_cv_prog_OBJDUMP" +fi + +test -z "$OBJDUMP" && OBJDUMP=objdump + + + + + + + + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to recognize dependent libraries" >&5 +$as_echo_n "checking how to recognize dependent libraries... " >&6; } +if ${lt_cv_deplibs_check_method+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_file_magic_cmd='$MAGIC_CMD' +lt_cv_file_magic_test_file= +lt_cv_deplibs_check_method='unknown' +# Need to set the preceding variable on all platforms that support +# interlibrary dependencies. +# 'none' -- dependencies not supported. +# `unknown' -- same as none, but documents that we really don't know. +# 'pass_all' -- all dependencies passed with no checks. +# 'test_compile' -- check by making test program. +# 'file_magic [[regex]]' -- check by looking for files in library path +# which responds to the $file_magic_cmd with a given extended regex. +# If you have `file' or equivalent on your system and you're not sure +# whether `pass_all' will *always* work, you probably want this one. + +case $host_os in +aix[4-9]*) + lt_cv_deplibs_check_method=pass_all + ;; + +beos*) + lt_cv_deplibs_check_method=pass_all + ;; + +bsdi[45]*) + lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (shared object|dynamic lib)' + lt_cv_file_magic_cmd='/usr/bin/file -L' + lt_cv_file_magic_test_file=/shlib/libc.so + ;; + +cygwin*) + # func_win32_libid is a shell function defined in ltmain.sh + lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL' + lt_cv_file_magic_cmd='func_win32_libid' + ;; + +mingw* | pw32*) + # Base MSYS/MinGW do not provide the 'file' command needed by + # func_win32_libid shell function, so use a weaker test based on 'objdump', + # unless we find 'file', for example because we are cross-compiling. + # func_win32_libid assumes BSD nm, so disallow it if using MS dumpbin. + if ( test "$lt_cv_nm_interface" = "BSD nm" && file / ) >/dev/null 2>&1; then + lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL' + lt_cv_file_magic_cmd='func_win32_libid' + else + # Keep this pattern in sync with the one in func_win32_libid. + lt_cv_deplibs_check_method='file_magic file format (pei*-i386(.*architecture: i386)?|pe-arm-wince|pe-x86-64)' + lt_cv_file_magic_cmd='$OBJDUMP -f' + fi + ;; + +cegcc*) + # use the weaker test based on 'objdump'. See mingw*. + lt_cv_deplibs_check_method='file_magic file format pe-arm-.*little(.*architecture: arm)?' + lt_cv_file_magic_cmd='$OBJDUMP -f' + ;; + +darwin* | rhapsody*) + lt_cv_deplibs_check_method=pass_all + ;; + +freebsd* | dragonfly*) + if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then + case $host_cpu in + i*86 ) + # Not sure whether the presence of OpenBSD here was a mistake. + # Let's accept both of them until this is cleared up. + lt_cv_deplibs_check_method='file_magic (FreeBSD|OpenBSD|DragonFly)/i[3-9]86 (compact )?demand paged shared library' + lt_cv_file_magic_cmd=/usr/bin/file + lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*` + ;; + esac + else + lt_cv_deplibs_check_method=pass_all + fi + ;; + +gnu*) + lt_cv_deplibs_check_method=pass_all + ;; + +haiku*) + lt_cv_deplibs_check_method=pass_all + ;; + +hpux10.20* | hpux11*) + lt_cv_file_magic_cmd=/usr/bin/file + case $host_cpu in + ia64*) + lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF-[0-9][0-9]) shared object file - IA64' + lt_cv_file_magic_test_file=/usr/lib/hpux32/libc.so + ;; + hppa*64*) + lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF[ -][0-9][0-9])(-bit)?( [LM]SB)? shared object( file)?[, -]* PA-RISC [0-9]\.[0-9]' + lt_cv_file_magic_test_file=/usr/lib/pa20_64/libc.sl + ;; + *) + lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|PA-RISC[0-9]\.[0-9]) shared library' + lt_cv_file_magic_test_file=/usr/lib/libc.sl + ;; + esac + ;; + +interix[3-9]*) + # PIC code is broken on Interix 3.x, that's why |\.a not |_pic\.a here + lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so|\.a)$' + ;; + +irix5* | irix6* | nonstopux*) + case $LD in + *-32|*"-32 ") libmagic=32-bit;; + *-n32|*"-n32 ") libmagic=N32;; + *-64|*"-64 ") libmagic=64-bit;; + *) libmagic=never-match;; + esac + lt_cv_deplibs_check_method=pass_all + ;; + +# This must be glibc/ELF. +linux* | k*bsd*-gnu | kopensolaris*-gnu) + lt_cv_deplibs_check_method=pass_all + ;; + +netbsd* | netbsdelf*-gnu) + if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then + lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|_pic\.a)$' + else + lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so|_pic\.a)$' + fi + ;; + +newos6*) + lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (executable|dynamic lib)' + lt_cv_file_magic_cmd=/usr/bin/file + lt_cv_file_magic_test_file=/usr/lib/libnls.so + ;; + +*nto* | *qnx*) + lt_cv_deplibs_check_method=pass_all + ;; + +openbsd*) + if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then + lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|\.so|_pic\.a)$' + else + lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|_pic\.a)$' + fi + ;; + +osf3* | osf4* | osf5*) + lt_cv_deplibs_check_method=pass_all + ;; + +rdos*) + lt_cv_deplibs_check_method=pass_all + ;; + +solaris*) + lt_cv_deplibs_check_method=pass_all + ;; + +sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) + lt_cv_deplibs_check_method=pass_all + ;; + +sysv4 | sysv4.3*) + case $host_vendor in + motorola) + lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (shared object|dynamic lib) M[0-9][0-9]* Version [0-9]' + lt_cv_file_magic_test_file=`echo /usr/lib/libc.so*` + ;; + ncr) + lt_cv_deplibs_check_method=pass_all + ;; + sequent) + lt_cv_file_magic_cmd='/bin/file' + lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [LM]SB (shared object|dynamic lib )' + ;; + sni) + lt_cv_file_magic_cmd='/bin/file' + lt_cv_deplibs_check_method="file_magic ELF [0-9][0-9]*-bit [LM]SB dynamic lib" + lt_cv_file_magic_test_file=/lib/libc.so + ;; + siemens) + lt_cv_deplibs_check_method=pass_all + ;; + pc) + lt_cv_deplibs_check_method=pass_all + ;; + esac + ;; + +tpf*) + lt_cv_deplibs_check_method=pass_all + ;; +esac + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_deplibs_check_method" >&5 +$as_echo "$lt_cv_deplibs_check_method" >&6; } + +file_magic_glob= +want_nocaseglob=no +if test "$build" = "$host"; then + case $host_os in + mingw* | pw32*) + if ( shopt | grep nocaseglob ) >/dev/null 2>&1; then + want_nocaseglob=yes + else + file_magic_glob=`echo aAbBcCdDeEfFgGhHiIjJkKlLmMnNoOpPqQrRsStTuUvVwWxXyYzZ | $SED -e "s/\(..\)/s\/[\1]\/[\1]\/g;/g"` + fi + ;; + esac +fi + +file_magic_cmd=$lt_cv_file_magic_cmd +deplibs_check_method=$lt_cv_deplibs_check_method +test -z "$deplibs_check_method" && deplibs_check_method=unknown + + + + + + + + + + + + + + + + + + + + + + +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}dlltool", so it can be a program name with args. +set dummy ${ac_tool_prefix}dlltool; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_DLLTOOL+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$DLLTOOL"; then + ac_cv_prog_DLLTOOL="$DLLTOOL" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_DLLTOOL="${ac_tool_prefix}dlltool" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +DLLTOOL=$ac_cv_prog_DLLTOOL +if test -n "$DLLTOOL"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DLLTOOL" >&5 +$as_echo "$DLLTOOL" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_DLLTOOL"; then + ac_ct_DLLTOOL=$DLLTOOL + # Extract the first word of "dlltool", so it can be a program name with args. +set dummy dlltool; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_DLLTOOL+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_DLLTOOL"; then + ac_cv_prog_ac_ct_DLLTOOL="$ac_ct_DLLTOOL" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_DLLTOOL="dlltool" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_DLLTOOL=$ac_cv_prog_ac_ct_DLLTOOL +if test -n "$ac_ct_DLLTOOL"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DLLTOOL" >&5 +$as_echo "$ac_ct_DLLTOOL" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_DLLTOOL" = x; then + DLLTOOL="false" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + DLLTOOL=$ac_ct_DLLTOOL + fi +else + DLLTOOL="$ac_cv_prog_DLLTOOL" +fi + +test -z "$DLLTOOL" && DLLTOOL=dlltool + + + + + + + + + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to associate runtime and link libraries" >&5 +$as_echo_n "checking how to associate runtime and link libraries... " >&6; } +if ${lt_cv_sharedlib_from_linklib_cmd+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_sharedlib_from_linklib_cmd='unknown' + +case $host_os in +cygwin* | mingw* | pw32* | cegcc*) + # two different shell functions defined in ltmain.sh + # decide which to use based on capabilities of $DLLTOOL + case `$DLLTOOL --help 2>&1` in + *--identify-strict*) + lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib + ;; + *) + lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib_fallback + ;; + esac + ;; +*) + # fallback: assume linklib IS sharedlib + lt_cv_sharedlib_from_linklib_cmd="$ECHO" + ;; +esac + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_sharedlib_from_linklib_cmd" >&5 +$as_echo "$lt_cv_sharedlib_from_linklib_cmd" >&6; } +sharedlib_from_linklib_cmd=$lt_cv_sharedlib_from_linklib_cmd +test -z "$sharedlib_from_linklib_cmd" && sharedlib_from_linklib_cmd=$ECHO + + + + + + + + +if test -n "$ac_tool_prefix"; then + for ac_prog in ar + do + # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. +set dummy $ac_tool_prefix$ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_AR+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$AR"; then + ac_cv_prog_AR="$AR" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_AR="$ac_tool_prefix$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +AR=$ac_cv_prog_AR +if test -n "$AR"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AR" >&5 +$as_echo "$AR" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$AR" && break + done +fi +if test -z "$AR"; then + ac_ct_AR=$AR + for ac_prog in ar +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_AR+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_AR"; then + ac_cv_prog_ac_ct_AR="$ac_ct_AR" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_AR="$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_AR=$ac_cv_prog_ac_ct_AR +if test -n "$ac_ct_AR"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_AR" >&5 +$as_echo "$ac_ct_AR" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$ac_ct_AR" && break +done + + if test "x$ac_ct_AR" = x; then + AR="false" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + AR=$ac_ct_AR + fi +fi + +: ${AR=ar} +: ${AR_FLAGS=cru} + + + + + + + + + + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for archiver @FILE support" >&5 +$as_echo_n "checking for archiver @FILE support... " >&6; } +if ${lt_cv_ar_at_file+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_ar_at_file=no + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + echo conftest.$ac_objext > conftest.lst + lt_ar_try='$AR $AR_FLAGS libconftest.a @conftest.lst >&5' + { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$lt_ar_try\""; } >&5 + (eval $lt_ar_try) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + if test "$ac_status" -eq 0; then + # Ensure the archiver fails upon bogus file names. + rm -f conftest.$ac_objext libconftest.a + { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$lt_ar_try\""; } >&5 + (eval $lt_ar_try) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + if test "$ac_status" -ne 0; then + lt_cv_ar_at_file=@ + fi + fi + rm -f conftest.* libconftest.a + +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ar_at_file" >&5 +$as_echo "$lt_cv_ar_at_file" >&6; } + +if test "x$lt_cv_ar_at_file" = xno; then + archiver_list_spec= +else + archiver_list_spec=$lt_cv_ar_at_file +fi + + + + + + + +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args. +set dummy ${ac_tool_prefix}strip; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_STRIP+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$STRIP"; then + ac_cv_prog_STRIP="$STRIP" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_STRIP="${ac_tool_prefix}strip" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +STRIP=$ac_cv_prog_STRIP +if test -n "$STRIP"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $STRIP" >&5 +$as_echo "$STRIP" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_STRIP"; then + ac_ct_STRIP=$STRIP + # Extract the first word of "strip", so it can be a program name with args. +set dummy strip; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_STRIP+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_STRIP"; then + ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_STRIP="strip" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP +if test -n "$ac_ct_STRIP"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP" >&5 +$as_echo "$ac_ct_STRIP" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_STRIP" = x; then + STRIP=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + STRIP=$ac_ct_STRIP + fi +else + STRIP="$ac_cv_prog_STRIP" +fi + +test -z "$STRIP" && STRIP=: + + + + + + +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args. +set dummy ${ac_tool_prefix}ranlib; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_RANLIB+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$RANLIB"; then + ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +RANLIB=$ac_cv_prog_RANLIB +if test -n "$RANLIB"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $RANLIB" >&5 +$as_echo "$RANLIB" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_RANLIB"; then + ac_ct_RANLIB=$RANLIB + # Extract the first word of "ranlib", so it can be a program name with args. +set dummy ranlib; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_RANLIB+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_RANLIB"; then + ac_cv_prog_ac_ct_RANLIB="$ac_ct_RANLIB" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_RANLIB="ranlib" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_RANLIB=$ac_cv_prog_ac_ct_RANLIB +if test -n "$ac_ct_RANLIB"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_RANLIB" >&5 +$as_echo "$ac_ct_RANLIB" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_RANLIB" = x; then + RANLIB=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + RANLIB=$ac_ct_RANLIB + fi +else + RANLIB="$ac_cv_prog_RANLIB" +fi + +test -z "$RANLIB" && RANLIB=: + + + + + + +# Determine commands to create old-style static archives. +old_archive_cmds='$AR $AR_FLAGS $oldlib$oldobjs' +old_postinstall_cmds='chmod 644 $oldlib' +old_postuninstall_cmds= + +if test -n "$RANLIB"; then + case $host_os in + openbsd*) + old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB -t \$tool_oldlib" + ;; + *) + old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB \$tool_oldlib" + ;; + esac + old_archive_cmds="$old_archive_cmds~\$RANLIB \$tool_oldlib" +fi + +case $host_os in + darwin*) + lock_old_archive_extraction=yes ;; + *) + lock_old_archive_extraction=no ;; +esac + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +# If no C compiler was specified, use CC. +LTCC=${LTCC-"$CC"} + +# If no C compiler flags were specified, use CFLAGS. +LTCFLAGS=${LTCFLAGS-"$CFLAGS"} + +# Allow CC to be a program name with arguments. +compiler=$CC + + +# Check for command to grab the raw symbol name followed by C symbol from nm. +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking command to parse $NM output from $compiler object" >&5 +$as_echo_n "checking command to parse $NM output from $compiler object... " >&6; } +if ${lt_cv_sys_global_symbol_pipe+:} false; then : + $as_echo_n "(cached) " >&6 +else + +# These are sane defaults that work on at least a few old systems. +# [They come from Ultrix. What could be older than Ultrix?!! ;)] + +# Character class describing NM global symbol codes. +symcode='[BCDEGRST]' + +# Regexp to match symbols that can be accessed directly from C. +sympat='\([_A-Za-z][_A-Za-z0-9]*\)' + +# Define system-specific variables. +case $host_os in +aix*) + symcode='[BCDT]' + ;; +cygwin* | mingw* | pw32* | cegcc*) + symcode='[ABCDGISTW]' + ;; +hpux*) + if test "$host_cpu" = ia64; then + symcode='[ABCDEGRST]' + fi + ;; +irix* | nonstopux*) + symcode='[BCDEGRST]' + ;; +osf*) + symcode='[BCDEGQRST]' + ;; +solaris*) + symcode='[BDRT]' + ;; +sco3.2v5*) + symcode='[DT]' + ;; +sysv4.2uw2*) + symcode='[DT]' + ;; +sysv5* | sco5v6* | unixware* | OpenUNIX*) + symcode='[ABDT]' + ;; +sysv4) + symcode='[DFNSTU]' + ;; +esac + +# If we're using GNU nm, then use its standard symbol codes. +case `$NM -V 2>&1` in +*GNU* | *'with BFD'*) + symcode='[ABCDGIRSTW]' ;; +esac + +# Transform an extracted symbol line into a proper C declaration. +# Some systems (esp. on ia64) link data and code symbols differently, +# so use this general approach. +lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^T .* \(.*\)$/extern int \1();/p' -e 's/^$symcode* .* \(.*\)$/extern char \1;/p'" + +# Transform an extracted symbol line into symbol name and symbol address +lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([^ ]*\)[ ]*$/ {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([^ ]*\) \([^ ]*\)$/ {\"\2\", (void *) \&\2},/p'" +lt_cv_sys_global_symbol_to_c_name_address_lib_prefix="sed -n -e 's/^: \([^ ]*\)[ ]*$/ {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([^ ]*\) \(lib[^ ]*\)$/ {\"\2\", (void *) \&\2},/p' -e 's/^$symcode* \([^ ]*\) \([^ ]*\)$/ {\"lib\2\", (void *) \&\2},/p'" + +# Handle CRLF in mingw tool chain +opt_cr= +case $build_os in +mingw*) + opt_cr=`$ECHO 'x\{0,1\}' | tr x '\015'` # option cr in regexp + ;; +esac + +# Try without a prefix underscore, then with it. +for ac_symprfx in "" "_"; do + + # Transform symcode, sympat, and symprfx into a raw symbol and a C symbol. + symxfrm="\\1 $ac_symprfx\\2 \\2" + + # Write the raw and C identifiers. + if test "$lt_cv_nm_interface" = "MS dumpbin"; then + # Fake it for dumpbin and say T for any non-static function + # and D for any global variable. + # Also find C++ and __fastcall symbols from MSVC++, + # which start with @ or ?. + lt_cv_sys_global_symbol_pipe="$AWK '"\ +" {last_section=section; section=\$ 3};"\ +" /^COFF SYMBOL TABLE/{for(i in hide) delete hide[i]};"\ +" /Section length .*#relocs.*(pick any)/{hide[last_section]=1};"\ +" \$ 0!~/External *\|/{next};"\ +" / 0+ UNDEF /{next}; / UNDEF \([^|]\)*()/{next};"\ +" {if(hide[section]) next};"\ +" {f=0}; \$ 0~/\(\).*\|/{f=1}; {printf f ? \"T \" : \"D \"};"\ +" {split(\$ 0, a, /\||\r/); split(a[2], s)};"\ +" s[1]~/^[@?]/{print s[1], s[1]; next};"\ +" s[1]~prfx {split(s[1],t,\"@\"); print t[1], substr(t[1],length(prfx))}"\ +" ' prfx=^$ac_symprfx" + else + lt_cv_sys_global_symbol_pipe="sed -n -e 's/^.*[ ]\($symcode$symcode*\)[ ][ ]*$ac_symprfx$sympat$opt_cr$/$symxfrm/p'" + fi + lt_cv_sys_global_symbol_pipe="$lt_cv_sys_global_symbol_pipe | sed '/ __gnu_lto/d'" + + # Check to see that the pipe works correctly. + pipe_works=no + + rm -f conftest* + cat > conftest.$ac_ext <<_LT_EOF +#ifdef __cplusplus +extern "C" { +#endif +char nm_test_var; +void nm_test_func(void); +void nm_test_func(void){} +#ifdef __cplusplus +} +#endif +int main(){nm_test_var='a';nm_test_func();return(0);} +_LT_EOF + + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + # Now try to grab the symbols. + nlist=conftest.nm + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$NM conftest.$ac_objext \| "$lt_cv_sys_global_symbol_pipe" \> $nlist\""; } >&5 + (eval $NM conftest.$ac_objext \| "$lt_cv_sys_global_symbol_pipe" \> $nlist) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && test -s "$nlist"; then + # Try sorting and uniquifying the output. + if sort "$nlist" | uniq > "$nlist"T; then + mv -f "$nlist"T "$nlist" + else + rm -f "$nlist"T + fi + + # Make sure that we snagged all the symbols we need. + if $GREP ' nm_test_var$' "$nlist" >/dev/null; then + if $GREP ' nm_test_func$' "$nlist" >/dev/null; then + cat <<_LT_EOF > conftest.$ac_ext +/* Keep this code in sync between libtool.m4, ltmain, lt_system.h, and tests. */ +#if defined(_WIN32) || defined(__CYGWIN__) || defined(_WIN32_WCE) +/* DATA imports from DLLs on WIN32 con't be const, because runtime + relocations are performed -- see ld's documentation on pseudo-relocs. */ +# define LT_DLSYM_CONST +#elif defined(__osf__) +/* This system does not cope well with relocations in const data. */ +# define LT_DLSYM_CONST +#else +# define LT_DLSYM_CONST const +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +_LT_EOF + # Now generate the symbol file. + eval "$lt_cv_sys_global_symbol_to_cdecl"' < "$nlist" | $GREP -v main >> conftest.$ac_ext' + + cat <<_LT_EOF >> conftest.$ac_ext + +/* The mapping between symbol names and symbols. */ +LT_DLSYM_CONST struct { + const char *name; + void *address; +} +lt__PROGRAM__LTX_preloaded_symbols[] = +{ + { "@PROGRAM@", (void *) 0 }, +_LT_EOF + $SED "s/^$symcode$symcode* \(.*\) \(.*\)$/ {\"\2\", (void *) \&\2},/" < "$nlist" | $GREP -v main >> conftest.$ac_ext + cat <<\_LT_EOF >> conftest.$ac_ext + {0, (void *) 0} +}; + +/* This works around a problem in FreeBSD linker */ +#ifdef FREEBSD_WORKAROUND +static const void *lt_preloaded_setup() { + return lt__PROGRAM__LTX_preloaded_symbols; +} +#endif + +#ifdef __cplusplus +} +#endif +_LT_EOF + # Now try linking the two files. + mv conftest.$ac_objext conftstm.$ac_objext + lt_globsym_save_LIBS=$LIBS + lt_globsym_save_CFLAGS=$CFLAGS + LIBS="conftstm.$ac_objext" + CFLAGS="$CFLAGS$lt_prog_compiler_no_builtin_flag" + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5 + (eval $ac_link) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && test -s conftest${ac_exeext}; then + pipe_works=yes + fi + LIBS=$lt_globsym_save_LIBS + CFLAGS=$lt_globsym_save_CFLAGS + else + echo "cannot find nm_test_func in $nlist" >&5 + fi + else + echo "cannot find nm_test_var in $nlist" >&5 + fi + else + echo "cannot run $lt_cv_sys_global_symbol_pipe" >&5 + fi + else + echo "$progname: failed program was:" >&5 + cat conftest.$ac_ext >&5 + fi + rm -rf conftest* conftst* + + # Do not use the global_symbol_pipe unless it works. + if test "$pipe_works" = yes; then + break + else + lt_cv_sys_global_symbol_pipe= + fi +done + +fi + +if test -z "$lt_cv_sys_global_symbol_pipe"; then + lt_cv_sys_global_symbol_to_cdecl= +fi +if test -z "$lt_cv_sys_global_symbol_pipe$lt_cv_sys_global_symbol_to_cdecl"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: failed" >&5 +$as_echo "failed" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: ok" >&5 +$as_echo "ok" >&6; } +fi + +# Response file support. +if test "$lt_cv_nm_interface" = "MS dumpbin"; then + nm_file_list_spec='@' +elif $NM --help 2>/dev/null | grep '[@]FILE' >/dev/null; then + nm_file_list_spec='@' +fi + + + + + + + + + + + + + + + + + + + + + + + + + + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for sysroot" >&5 +$as_echo_n "checking for sysroot... " >&6; } + +# Check whether --with-sysroot was given. +if test "${with_sysroot+set}" = set; then : + withval=$with_sysroot; +else + with_sysroot=no +fi + + +lt_sysroot= +case ${with_sysroot} in #( + yes) + if test "$GCC" = yes; then + lt_sysroot=`$CC --print-sysroot 2>/dev/null` + fi + ;; #( + /*) + lt_sysroot=`echo "$with_sysroot" | sed -e "$sed_quote_subst"` + ;; #( + no|'') + ;; #( + *) + { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${with_sysroot}" >&5 +$as_echo "${with_sysroot}" >&6; } + as_fn_error $? "The sysroot must be an absolute path." "$LINENO" 5 + ;; +esac + + { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${lt_sysroot:-no}" >&5 +$as_echo "${lt_sysroot:-no}" >&6; } + + + + + +# Check whether --enable-libtool-lock was given. +if test "${enable_libtool_lock+set}" = set; then : + enableval=$enable_libtool_lock; +fi + +test "x$enable_libtool_lock" != xno && enable_libtool_lock=yes + +# Some flags need to be propagated to the compiler or linker for good +# libtool support. +case $host in +ia64-*-hpux*) + # Find out which ABI we are using. + echo 'int i;' > conftest.$ac_ext + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + case `/usr/bin/file conftest.$ac_objext` in + *ELF-32*) + HPUX_IA64_MODE="32" + ;; + *ELF-64*) + HPUX_IA64_MODE="64" + ;; + esac + fi + rm -rf conftest* + ;; +*-*-irix6*) + # Find out which ABI we are using. + echo '#line '$LINENO' "configure"' > conftest.$ac_ext + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + if test "$lt_cv_prog_gnu_ld" = yes; then + case `/usr/bin/file conftest.$ac_objext` in + *32-bit*) + LD="${LD-ld} -melf32bsmip" + ;; + *N32*) + LD="${LD-ld} -melf32bmipn32" + ;; + *64-bit*) + LD="${LD-ld} -melf64bmip" + ;; + esac + else + case `/usr/bin/file conftest.$ac_objext` in + *32-bit*) + LD="${LD-ld} -32" + ;; + *N32*) + LD="${LD-ld} -n32" + ;; + *64-bit*) + LD="${LD-ld} -64" + ;; + esac + fi + fi + rm -rf conftest* + ;; + +x86_64-*kfreebsd*-gnu|x86_64-*linux*|ppc*-*linux*|powerpc*-*linux*| \ +s390*-*linux*|s390*-*tpf*|sparc*-*linux*) + # Find out which ABI we are using. + echo 'int i;' > conftest.$ac_ext + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + case `/usr/bin/file conftest.o` in + *32-bit*) + case $host in + x86_64-*kfreebsd*-gnu) + LD="${LD-ld} -m elf_i386_fbsd" + ;; + x86_64-*linux*) + LD="${LD-ld} -m elf_i386" + ;; + ppc64-*linux*|powerpc64-*linux*) + LD="${LD-ld} -m elf32ppclinux" + ;; + s390x-*linux*) + LD="${LD-ld} -m elf_s390" + ;; + sparc64-*linux*) + LD="${LD-ld} -m elf32_sparc" + ;; + esac + ;; + *64-bit*) + case $host in + x86_64-*kfreebsd*-gnu) + LD="${LD-ld} -m elf_x86_64_fbsd" + ;; + x86_64-*linux*) + LD="${LD-ld} -m elf_x86_64" + ;; + ppc*-*linux*|powerpc*-*linux*) + LD="${LD-ld} -m elf64ppc" + ;; + s390*-*linux*|s390*-*tpf*) + LD="${LD-ld} -m elf64_s390" + ;; + sparc*-*linux*) + LD="${LD-ld} -m elf64_sparc" + ;; + esac + ;; + esac + fi + rm -rf conftest* + ;; + +*-*-sco3.2v5*) + # On SCO OpenServer 5, we need -belf to get full-featured binaries. + SAVE_CFLAGS="$CFLAGS" + CFLAGS="$CFLAGS -belf" + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler needs -belf" >&5 +$as_echo_n "checking whether the C compiler needs -belf... " >&6; } +if ${lt_cv_cc_needs_belf+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + lt_cv_cc_needs_belf=yes +else + lt_cv_cc_needs_belf=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_cc_needs_belf" >&5 +$as_echo "$lt_cv_cc_needs_belf" >&6; } + if test x"$lt_cv_cc_needs_belf" != x"yes"; then + # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf + CFLAGS="$SAVE_CFLAGS" + fi + ;; +*-*solaris*) + # Find out which ABI we are using. + echo 'int i;' > conftest.$ac_ext + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + case `/usr/bin/file conftest.o` in + *64-bit*) + case $lt_cv_prog_gnu_ld in + yes*) + case $host in + i?86-*-solaris*) + LD="${LD-ld} -m elf_x86_64" + ;; + sparc*-*-solaris*) + LD="${LD-ld} -m elf64_sparc" + ;; + esac + # GNU ld 2.21 introduced _sol2 emulations. Use them if available. + if ${LD-ld} -V | grep _sol2 >/dev/null 2>&1; then + LD="${LD-ld}_sol2" + fi + ;; + *) + if ${LD-ld} -64 -r -o conftest2.o conftest.o >/dev/null 2>&1; then + LD="${LD-ld} -64" + fi + ;; + esac + ;; + esac + fi + rm -rf conftest* + ;; +esac + +need_locks="$enable_libtool_lock" + +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}mt", so it can be a program name with args. +set dummy ${ac_tool_prefix}mt; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_MANIFEST_TOOL+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$MANIFEST_TOOL"; then + ac_cv_prog_MANIFEST_TOOL="$MANIFEST_TOOL" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_MANIFEST_TOOL="${ac_tool_prefix}mt" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +MANIFEST_TOOL=$ac_cv_prog_MANIFEST_TOOL +if test -n "$MANIFEST_TOOL"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MANIFEST_TOOL" >&5 +$as_echo "$MANIFEST_TOOL" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_MANIFEST_TOOL"; then + ac_ct_MANIFEST_TOOL=$MANIFEST_TOOL + # Extract the first word of "mt", so it can be a program name with args. +set dummy mt; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_MANIFEST_TOOL+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_MANIFEST_TOOL"; then + ac_cv_prog_ac_ct_MANIFEST_TOOL="$ac_ct_MANIFEST_TOOL" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_MANIFEST_TOOL="mt" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_MANIFEST_TOOL=$ac_cv_prog_ac_ct_MANIFEST_TOOL +if test -n "$ac_ct_MANIFEST_TOOL"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_MANIFEST_TOOL" >&5 +$as_echo "$ac_ct_MANIFEST_TOOL" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_MANIFEST_TOOL" = x; then + MANIFEST_TOOL=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + MANIFEST_TOOL=$ac_ct_MANIFEST_TOOL + fi +else + MANIFEST_TOOL="$ac_cv_prog_MANIFEST_TOOL" +fi + +test -z "$MANIFEST_TOOL" && MANIFEST_TOOL=mt +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if $MANIFEST_TOOL is a manifest tool" >&5 +$as_echo_n "checking if $MANIFEST_TOOL is a manifest tool... " >&6; } +if ${lt_cv_path_mainfest_tool+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_path_mainfest_tool=no + echo "$as_me:$LINENO: $MANIFEST_TOOL '-?'" >&5 + $MANIFEST_TOOL '-?' 2>conftest.err > conftest.out + cat conftest.err >&5 + if $GREP 'Manifest Tool' conftest.out > /dev/null; then + lt_cv_path_mainfest_tool=yes + fi + rm -f conftest* +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_path_mainfest_tool" >&5 +$as_echo "$lt_cv_path_mainfest_tool" >&6; } +if test "x$lt_cv_path_mainfest_tool" != xyes; then + MANIFEST_TOOL=: +fi + + + + + + + case $host_os in + rhapsody* | darwin*) + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}dsymutil", so it can be a program name with args. +set dummy ${ac_tool_prefix}dsymutil; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_DSYMUTIL+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$DSYMUTIL"; then + ac_cv_prog_DSYMUTIL="$DSYMUTIL" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_DSYMUTIL="${ac_tool_prefix}dsymutil" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +DSYMUTIL=$ac_cv_prog_DSYMUTIL +if test -n "$DSYMUTIL"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DSYMUTIL" >&5 +$as_echo "$DSYMUTIL" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_DSYMUTIL"; then + ac_ct_DSYMUTIL=$DSYMUTIL + # Extract the first word of "dsymutil", so it can be a program name with args. +set dummy dsymutil; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_DSYMUTIL+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_DSYMUTIL"; then + ac_cv_prog_ac_ct_DSYMUTIL="$ac_ct_DSYMUTIL" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_DSYMUTIL="dsymutil" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_DSYMUTIL=$ac_cv_prog_ac_ct_DSYMUTIL +if test -n "$ac_ct_DSYMUTIL"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DSYMUTIL" >&5 +$as_echo "$ac_ct_DSYMUTIL" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_DSYMUTIL" = x; then + DSYMUTIL=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + DSYMUTIL=$ac_ct_DSYMUTIL + fi +else + DSYMUTIL="$ac_cv_prog_DSYMUTIL" +fi + + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}nmedit", so it can be a program name with args. +set dummy ${ac_tool_prefix}nmedit; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_NMEDIT+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$NMEDIT"; then + ac_cv_prog_NMEDIT="$NMEDIT" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_NMEDIT="${ac_tool_prefix}nmedit" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +NMEDIT=$ac_cv_prog_NMEDIT +if test -n "$NMEDIT"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $NMEDIT" >&5 +$as_echo "$NMEDIT" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_NMEDIT"; then + ac_ct_NMEDIT=$NMEDIT + # Extract the first word of "nmedit", so it can be a program name with args. +set dummy nmedit; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_NMEDIT+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_NMEDIT"; then + ac_cv_prog_ac_ct_NMEDIT="$ac_ct_NMEDIT" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_NMEDIT="nmedit" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_NMEDIT=$ac_cv_prog_ac_ct_NMEDIT +if test -n "$ac_ct_NMEDIT"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_NMEDIT" >&5 +$as_echo "$ac_ct_NMEDIT" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_NMEDIT" = x; then + NMEDIT=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + NMEDIT=$ac_ct_NMEDIT + fi +else + NMEDIT="$ac_cv_prog_NMEDIT" +fi + + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}lipo", so it can be a program name with args. +set dummy ${ac_tool_prefix}lipo; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_LIPO+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$LIPO"; then + ac_cv_prog_LIPO="$LIPO" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_LIPO="${ac_tool_prefix}lipo" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +LIPO=$ac_cv_prog_LIPO +if test -n "$LIPO"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LIPO" >&5 +$as_echo "$LIPO" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_LIPO"; then + ac_ct_LIPO=$LIPO + # Extract the first word of "lipo", so it can be a program name with args. +set dummy lipo; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_LIPO+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_LIPO"; then + ac_cv_prog_ac_ct_LIPO="$ac_ct_LIPO" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_LIPO="lipo" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_LIPO=$ac_cv_prog_ac_ct_LIPO +if test -n "$ac_ct_LIPO"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_LIPO" >&5 +$as_echo "$ac_ct_LIPO" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_LIPO" = x; then + LIPO=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + LIPO=$ac_ct_LIPO + fi +else + LIPO="$ac_cv_prog_LIPO" +fi + + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}otool", so it can be a program name with args. +set dummy ${ac_tool_prefix}otool; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_OTOOL+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$OTOOL"; then + ac_cv_prog_OTOOL="$OTOOL" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_OTOOL="${ac_tool_prefix}otool" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +OTOOL=$ac_cv_prog_OTOOL +if test -n "$OTOOL"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OTOOL" >&5 +$as_echo "$OTOOL" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_OTOOL"; then + ac_ct_OTOOL=$OTOOL + # Extract the first word of "otool", so it can be a program name with args. +set dummy otool; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_OTOOL+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_OTOOL"; then + ac_cv_prog_ac_ct_OTOOL="$ac_ct_OTOOL" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_OTOOL="otool" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_OTOOL=$ac_cv_prog_ac_ct_OTOOL +if test -n "$ac_ct_OTOOL"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OTOOL" >&5 +$as_echo "$ac_ct_OTOOL" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_OTOOL" = x; then + OTOOL=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + OTOOL=$ac_ct_OTOOL + fi +else + OTOOL="$ac_cv_prog_OTOOL" +fi + + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}otool64", so it can be a program name with args. +set dummy ${ac_tool_prefix}otool64; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_OTOOL64+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$OTOOL64"; then + ac_cv_prog_OTOOL64="$OTOOL64" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_OTOOL64="${ac_tool_prefix}otool64" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +OTOOL64=$ac_cv_prog_OTOOL64 +if test -n "$OTOOL64"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OTOOL64" >&5 +$as_echo "$OTOOL64" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_OTOOL64"; then + ac_ct_OTOOL64=$OTOOL64 + # Extract the first word of "otool64", so it can be a program name with args. +set dummy otool64; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_OTOOL64+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_OTOOL64"; then + ac_cv_prog_ac_ct_OTOOL64="$ac_ct_OTOOL64" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_OTOOL64="otool64" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_OTOOL64=$ac_cv_prog_ac_ct_OTOOL64 +if test -n "$ac_ct_OTOOL64"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OTOOL64" >&5 +$as_echo "$ac_ct_OTOOL64" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_OTOOL64" = x; then + OTOOL64=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + OTOOL64=$ac_ct_OTOOL64 + fi +else + OTOOL64="$ac_cv_prog_OTOOL64" +fi + + + + + + + + + + + + + + + + + + + + + + + + + + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -single_module linker flag" >&5 +$as_echo_n "checking for -single_module linker flag... " >&6; } +if ${lt_cv_apple_cc_single_mod+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_apple_cc_single_mod=no + if test -z "${LT_MULTI_MODULE}"; then + # By default we will add the -single_module flag. You can override + # by either setting the environment variable LT_MULTI_MODULE + # non-empty at configure time, or by adding -multi_module to the + # link flags. + rm -rf libconftest.dylib* + echo "int foo(void){return 1;}" > conftest.c + echo "$LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \ +-dynamiclib -Wl,-single_module conftest.c" >&5 + $LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \ + -dynamiclib -Wl,-single_module conftest.c 2>conftest.err + _lt_result=$? + # If there is a non-empty error log, and "single_module" + # appears in it, assume the flag caused a linker warning + if test -s conftest.err && $GREP single_module conftest.err; then + cat conftest.err >&5 + # Otherwise, if the output was created with a 0 exit code from + # the compiler, it worked. + elif test -f libconftest.dylib && test $_lt_result -eq 0; then + lt_cv_apple_cc_single_mod=yes + else + cat conftest.err >&5 + fi + rm -rf libconftest.dylib* + rm -f conftest.* + fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_apple_cc_single_mod" >&5 +$as_echo "$lt_cv_apple_cc_single_mod" >&6; } + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -exported_symbols_list linker flag" >&5 +$as_echo_n "checking for -exported_symbols_list linker flag... " >&6; } +if ${lt_cv_ld_exported_symbols_list+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_ld_exported_symbols_list=no + save_LDFLAGS=$LDFLAGS + echo "_main" > conftest.sym + LDFLAGS="$LDFLAGS -Wl,-exported_symbols_list,conftest.sym" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + lt_cv_ld_exported_symbols_list=yes +else + lt_cv_ld_exported_symbols_list=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + LDFLAGS="$save_LDFLAGS" + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_exported_symbols_list" >&5 +$as_echo "$lt_cv_ld_exported_symbols_list" >&6; } + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -force_load linker flag" >&5 +$as_echo_n "checking for -force_load linker flag... " >&6; } +if ${lt_cv_ld_force_load+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_ld_force_load=no + cat > conftest.c << _LT_EOF +int forced_loaded() { return 2;} +_LT_EOF + echo "$LTCC $LTCFLAGS -c -o conftest.o conftest.c" >&5 + $LTCC $LTCFLAGS -c -o conftest.o conftest.c 2>&5 + echo "$AR cru libconftest.a conftest.o" >&5 + $AR cru libconftest.a conftest.o 2>&5 + echo "$RANLIB libconftest.a" >&5 + $RANLIB libconftest.a 2>&5 + cat > conftest.c << _LT_EOF +int main() { return 0;} +_LT_EOF + echo "$LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a" >&5 + $LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a 2>conftest.err + _lt_result=$? + if test -s conftest.err && $GREP force_load conftest.err; then + cat conftest.err >&5 + elif test -f conftest && test $_lt_result -eq 0 && $GREP forced_load conftest >/dev/null 2>&1 ; then + lt_cv_ld_force_load=yes + else + cat conftest.err >&5 + fi + rm -f conftest.err libconftest.a conftest conftest.c + rm -rf conftest.dSYM + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_force_load" >&5 +$as_echo "$lt_cv_ld_force_load" >&6; } + case $host_os in + rhapsody* | darwin1.[012]) + _lt_dar_allow_undefined='${wl}-undefined ${wl}suppress' ;; + darwin1.*) + _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;; + darwin*) # darwin 5.x on + # if running on 10.5 or later, the deployment target defaults + # to the OS version, if on x86, and 10.4, the deployment + # target defaults to 10.4. Don't you love it? + case ${MACOSX_DEPLOYMENT_TARGET-10.0},$host in + 10.0,*86*-darwin8*|10.0,*-darwin[91]*) + _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;; + 10.[012]*) + _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;; + 10.*) + _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;; + esac + ;; + esac + if test "$lt_cv_apple_cc_single_mod" = "yes"; then + _lt_dar_single_mod='$single_module' + fi + if test "$lt_cv_ld_exported_symbols_list" = "yes"; then + _lt_dar_export_syms=' ${wl}-exported_symbols_list,$output_objdir/${libname}-symbols.expsym' + else + _lt_dar_export_syms='~$NMEDIT -s $output_objdir/${libname}-symbols.expsym ${lib}' + fi + if test "$DSYMUTIL" != ":" && test "$lt_cv_ld_force_load" = "no"; then + _lt_dsymutil='~$DSYMUTIL $lib || :' + else + _lt_dsymutil= + fi + ;; + esac + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C preprocessor" >&5 +$as_echo_n "checking how to run the C preprocessor... " >&6; } +# On Suns, sometimes $CPP names a directory. +if test -n "$CPP" && test -d "$CPP"; then + CPP= +fi +if test -z "$CPP"; then + if ${ac_cv_prog_CPP+:} false; then : + $as_echo_n "(cached) " >&6 +else + # Double quotes because CPP needs to be expanded + for CPP in "$CC -E" "$CC -E -traditional-cpp" "/lib/cpp" + do + ac_preproc_ok=false +for ac_c_preproc_warn_flag in '' yes +do + # Use a header file that comes with gcc, so configuring glibc + # with a fresh cross-compiler works. + # Prefer to if __STDC__ is defined, since + # exists even on freestanding compilers. + # On the NeXT, cc -E runs the code through the compiler's parser, + # not just through cpp. "Syntax error" is here to catch this case. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#ifdef __STDC__ +# include +#else +# include +#endif + Syntax error +_ACEOF +if ac_fn_c_try_cpp "$LINENO"; then : + +else + # Broken: fails on valid input. +continue +fi +rm -f conftest.err conftest.i conftest.$ac_ext + + # OK, works on sane cases. Now check whether nonexistent headers + # can be detected and how. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +_ACEOF +if ac_fn_c_try_cpp "$LINENO"; then : + # Broken: success on invalid input. +continue +else + # Passes both tests. +ac_preproc_ok=: +break +fi +rm -f conftest.err conftest.i conftest.$ac_ext + +done +# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. +rm -f conftest.i conftest.err conftest.$ac_ext +if $ac_preproc_ok; then : + break +fi + + done + ac_cv_prog_CPP=$CPP + +fi + CPP=$ac_cv_prog_CPP +else + ac_cv_prog_CPP=$CPP +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $CPP" >&5 +$as_echo "$CPP" >&6; } +ac_preproc_ok=false +for ac_c_preproc_warn_flag in '' yes +do + # Use a header file that comes with gcc, so configuring glibc + # with a fresh cross-compiler works. + # Prefer to if __STDC__ is defined, since + # exists even on freestanding compilers. + # On the NeXT, cc -E runs the code through the compiler's parser, + # not just through cpp. "Syntax error" is here to catch this case. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#ifdef __STDC__ +# include +#else +# include +#endif + Syntax error +_ACEOF +if ac_fn_c_try_cpp "$LINENO"; then : + +else + # Broken: fails on valid input. +continue +fi +rm -f conftest.err conftest.i conftest.$ac_ext + + # OK, works on sane cases. Now check whether nonexistent headers + # can be detected and how. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +_ACEOF +if ac_fn_c_try_cpp "$LINENO"; then : + # Broken: success on invalid input. +continue +else + # Passes both tests. +ac_preproc_ok=: +break +fi +rm -f conftest.err conftest.i conftest.$ac_ext + +done +# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. +rm -f conftest.i conftest.err conftest.$ac_ext +if $ac_preproc_ok; then : + +else + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "C preprocessor \"$CPP\" fails sanity check +See \`config.log' for more details" "$LINENO" 5; } +fi + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header files" >&5 +$as_echo_n "checking for ANSI C header files... " >&6; } +if ${ac_cv_header_stdc+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +#include +#include +#include + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_header_stdc=yes +else + ac_cv_header_stdc=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + +if test $ac_cv_header_stdc = yes; then + # SunOS 4.x string.h does not declare mem*, contrary to ANSI. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include + +_ACEOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + $EGREP "memchr" >/dev/null 2>&1; then : + +else + ac_cv_header_stdc=no +fi +rm -f conftest* + +fi + +if test $ac_cv_header_stdc = yes; then + # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include + +_ACEOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + $EGREP "free" >/dev/null 2>&1; then : + +else + ac_cv_header_stdc=no +fi +rm -f conftest* + +fi + +if test $ac_cv_header_stdc = yes; then + # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi. + if test "$cross_compiling" = yes; then : + : +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +#include +#if ((' ' & 0x0FF) == 0x020) +# define ISLOWER(c) ('a' <= (c) && (c) <= 'z') +# define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c)) +#else +# define ISLOWER(c) \ + (('a' <= (c) && (c) <= 'i') \ + || ('j' <= (c) && (c) <= 'r') \ + || ('s' <= (c) && (c) <= 'z')) +# define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c)) +#endif + +#define XOR(e, f) (((e) && !(f)) || (!(e) && (f))) +int +main () +{ + int i; + for (i = 0; i < 256; i++) + if (XOR (islower (i), ISLOWER (i)) + || toupper (i) != TOUPPER (i)) + return 2; + return 0; +} +_ACEOF +if ac_fn_c_try_run "$LINENO"; then : + +else + ac_cv_header_stdc=no +fi +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ + conftest.$ac_objext conftest.beam conftest.$ac_ext +fi + +fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdc" >&5 +$as_echo "$ac_cv_header_stdc" >&6; } +if test $ac_cv_header_stdc = yes; then + +$as_echo "#define STDC_HEADERS 1" >>confdefs.h + +fi + +# On IRIX 5.3, sys/types and inttypes.h are conflicting. +for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \ + inttypes.h stdint.h unistd.h +do : + as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` +ac_fn_c_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default +" +if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : + cat >>confdefs.h <<_ACEOF +#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 +_ACEOF + +fi + +done + + +for ac_header in dlfcn.h +do : + ac_fn_c_check_header_compile "$LINENO" "dlfcn.h" "ac_cv_header_dlfcn_h" "$ac_includes_default +" +if test "x$ac_cv_header_dlfcn_h" = xyes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_DLFCN_H 1 +_ACEOF + +fi + +done + + + + +func_stripname_cnf () +{ + case ${2} in + .*) func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%\\\\${2}\$%%"`;; + *) func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%${2}\$%%"`;; + esac +} # func_stripname_cnf + + + + + +# Set options + + + + enable_dlopen=no + + + enable_win32_dll=no + + + # Check whether --enable-shared was given. +if test "${enable_shared+set}" = set; then : + enableval=$enable_shared; p=${PACKAGE-default} + case $enableval in + yes) enable_shared=yes ;; + no) enable_shared=no ;; + *) + enable_shared=no + # Look at the argument we got. We use all the common list separators. + lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," + for pkg in $enableval; do + IFS="$lt_save_ifs" + if test "X$pkg" = "X$p"; then + enable_shared=yes + fi + done + IFS="$lt_save_ifs" + ;; + esac +else + enable_shared=yes +fi + + + + + + + + + + # Check whether --enable-static was given. +if test "${enable_static+set}" = set; then : + enableval=$enable_static; p=${PACKAGE-default} + case $enableval in + yes) enable_static=yes ;; + no) enable_static=no ;; + *) + enable_static=no + # Look at the argument we got. We use all the common list separators. + lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," + for pkg in $enableval; do + IFS="$lt_save_ifs" + if test "X$pkg" = "X$p"; then + enable_static=yes + fi + done + IFS="$lt_save_ifs" + ;; + esac +else + enable_static=yes +fi + + + + + + + + + + +# Check whether --with-pic was given. +if test "${with_pic+set}" = set; then : + withval=$with_pic; lt_p=${PACKAGE-default} + case $withval in + yes|no) pic_mode=$withval ;; + *) + pic_mode=default + # Look at the argument we got. We use all the common list separators. + lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," + for lt_pkg in $withval; do + IFS="$lt_save_ifs" + if test "X$lt_pkg" = "X$lt_p"; then + pic_mode=yes + fi + done + IFS="$lt_save_ifs" + ;; + esac +else + pic_mode=default +fi + + +test -z "$pic_mode" && pic_mode=default + + + + + + + + # Check whether --enable-fast-install was given. +if test "${enable_fast_install+set}" = set; then : + enableval=$enable_fast_install; p=${PACKAGE-default} + case $enableval in + yes) enable_fast_install=yes ;; + no) enable_fast_install=no ;; + *) + enable_fast_install=no + # Look at the argument we got. We use all the common list separators. + lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," + for pkg in $enableval; do + IFS="$lt_save_ifs" + if test "X$pkg" = "X$p"; then + enable_fast_install=yes + fi + done + IFS="$lt_save_ifs" + ;; + esac +else + enable_fast_install=yes +fi + + + + + + + + + + + +# This can be used to rebuild libtool when needed +LIBTOOL_DEPS="$ltmain" + +# Always use our own libtool. +LIBTOOL='$(SHELL) $(top_builddir)/libtool' + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +test -z "$LN_S" && LN_S="ln -s" + + + + + + + + + + + + + + +if test -n "${ZSH_VERSION+set}" ; then + setopt NO_GLOB_SUBST +fi + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for objdir" >&5 +$as_echo_n "checking for objdir... " >&6; } +if ${lt_cv_objdir+:} false; then : + $as_echo_n "(cached) " >&6 +else + rm -f .libs 2>/dev/null +mkdir .libs 2>/dev/null +if test -d .libs; then + lt_cv_objdir=.libs +else + # MS-DOS does not allow filenames that begin with a dot. + lt_cv_objdir=_libs +fi +rmdir .libs 2>/dev/null +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_objdir" >&5 +$as_echo "$lt_cv_objdir" >&6; } +objdir=$lt_cv_objdir + + + + + +cat >>confdefs.h <<_ACEOF +#define LT_OBJDIR "$lt_cv_objdir/" +_ACEOF + + + + +case $host_os in +aix3*) + # AIX sometimes has problems with the GCC collect2 program. For some + # reason, if we set the COLLECT_NAMES environment variable, the problems + # vanish in a puff of smoke. + if test "X${COLLECT_NAMES+set}" != Xset; then + COLLECT_NAMES= + export COLLECT_NAMES + fi + ;; +esac + +# Global variables: +ofile=libtool +can_build_shared=yes + +# All known linkers require a `.a' archive for static linking (except MSVC, +# which needs '.lib'). +libext=a + +with_gnu_ld="$lt_cv_prog_gnu_ld" + +old_CC="$CC" +old_CFLAGS="$CFLAGS" + +# Set sane defaults for various variables +test -z "$CC" && CC=cc +test -z "$LTCC" && LTCC=$CC +test -z "$LTCFLAGS" && LTCFLAGS=$CFLAGS +test -z "$LD" && LD=ld +test -z "$ac_objext" && ac_objext=o + +for cc_temp in $compiler""; do + case $cc_temp in + compile | *[\\/]compile | ccache | *[\\/]ccache ) ;; + distcc | *[\\/]distcc | purify | *[\\/]purify ) ;; + \-*) ;; + *) break;; + esac +done +cc_basename=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"` + + +# Only perform the check for file, if the check method requires it +test -z "$MAGIC_CMD" && MAGIC_CMD=file +case $deplibs_check_method in +file_magic*) + if test "$file_magic_cmd" = '$MAGIC_CMD'; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ${ac_tool_prefix}file" >&5 +$as_echo_n "checking for ${ac_tool_prefix}file... " >&6; } +if ${lt_cv_path_MAGIC_CMD+:} false; then : + $as_echo_n "(cached) " >&6 +else + case $MAGIC_CMD in +[\\/*] | ?:[\\/]*) + lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path. + ;; +*) + lt_save_MAGIC_CMD="$MAGIC_CMD" + lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR + ac_dummy="/usr/bin$PATH_SEPARATOR$PATH" + for ac_dir in $ac_dummy; do + IFS="$lt_save_ifs" + test -z "$ac_dir" && ac_dir=. + if test -f $ac_dir/${ac_tool_prefix}file; then + lt_cv_path_MAGIC_CMD="$ac_dir/${ac_tool_prefix}file" + if test -n "$file_magic_test_file"; then + case $deplibs_check_method in + "file_magic "*) + file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"` + MAGIC_CMD="$lt_cv_path_MAGIC_CMD" + if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null | + $EGREP "$file_magic_regex" > /dev/null; then + : + else + cat <<_LT_EOF 1>&2 + +*** Warning: the command libtool uses to detect shared libraries, +*** $file_magic_cmd, produces output that libtool cannot recognize. +*** The result is that libtool may fail to recognize shared libraries +*** as such. This will affect the creation of libtool libraries that +*** depend on shared libraries, but programs linked with such libtool +*** libraries will work regardless of this problem. Nevertheless, you +*** may want to report the problem to your system manager and/or to +*** bug-libtool@gnu.org + +_LT_EOF + fi ;; + esac + fi + break + fi + done + IFS="$lt_save_ifs" + MAGIC_CMD="$lt_save_MAGIC_CMD" + ;; +esac +fi + +MAGIC_CMD="$lt_cv_path_MAGIC_CMD" +if test -n "$MAGIC_CMD"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MAGIC_CMD" >&5 +$as_echo "$MAGIC_CMD" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + + + +if test -z "$lt_cv_path_MAGIC_CMD"; then + if test -n "$ac_tool_prefix"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for file" >&5 +$as_echo_n "checking for file... " >&6; } +if ${lt_cv_path_MAGIC_CMD+:} false; then : + $as_echo_n "(cached) " >&6 +else + case $MAGIC_CMD in +[\\/*] | ?:[\\/]*) + lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path. + ;; +*) + lt_save_MAGIC_CMD="$MAGIC_CMD" + lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR + ac_dummy="/usr/bin$PATH_SEPARATOR$PATH" + for ac_dir in $ac_dummy; do + IFS="$lt_save_ifs" + test -z "$ac_dir" && ac_dir=. + if test -f $ac_dir/file; then + lt_cv_path_MAGIC_CMD="$ac_dir/file" + if test -n "$file_magic_test_file"; then + case $deplibs_check_method in + "file_magic "*) + file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"` + MAGIC_CMD="$lt_cv_path_MAGIC_CMD" + if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null | + $EGREP "$file_magic_regex" > /dev/null; then + : + else + cat <<_LT_EOF 1>&2 + +*** Warning: the command libtool uses to detect shared libraries, +*** $file_magic_cmd, produces output that libtool cannot recognize. +*** The result is that libtool may fail to recognize shared libraries +*** as such. This will affect the creation of libtool libraries that +*** depend on shared libraries, but programs linked with such libtool +*** libraries will work regardless of this problem. Nevertheless, you +*** may want to report the problem to your system manager and/or to +*** bug-libtool@gnu.org + +_LT_EOF + fi ;; + esac + fi + break + fi + done + IFS="$lt_save_ifs" + MAGIC_CMD="$lt_save_MAGIC_CMD" + ;; +esac +fi + +MAGIC_CMD="$lt_cv_path_MAGIC_CMD" +if test -n "$MAGIC_CMD"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MAGIC_CMD" >&5 +$as_echo "$MAGIC_CMD" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + else + MAGIC_CMD=: + fi +fi + + fi + ;; +esac + +# Use C for the default configuration in the libtool script + +lt_save_CC="$CC" +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + +# Source file extension for C test sources. +ac_ext=c + +# Object file extension for compiled C test sources. +objext=o +objext=$objext + +# Code to be used in simple compile tests +lt_simple_compile_test_code="int some_variable = 0;" + +# Code to be used in simple link tests +lt_simple_link_test_code='int main(){return(0);}' + + + + + + + +# If no C compiler was specified, use CC. +LTCC=${LTCC-"$CC"} + +# If no C compiler flags were specified, use CFLAGS. +LTCFLAGS=${LTCFLAGS-"$CFLAGS"} + +# Allow CC to be a program name with arguments. +compiler=$CC + +# Save the default compiler, since it gets overwritten when the other +# tags are being tested, and _LT_TAGVAR(compiler, []) is a NOP. +compiler_DEFAULT=$CC + +# save warnings/boilerplate of simple test code +ac_outfile=conftest.$ac_objext +echo "$lt_simple_compile_test_code" >conftest.$ac_ext +eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err +_lt_compiler_boilerplate=`cat conftest.err` +$RM conftest* + +ac_outfile=conftest.$ac_objext +echo "$lt_simple_link_test_code" >conftest.$ac_ext +eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err +_lt_linker_boilerplate=`cat conftest.err` +$RM -r conftest* + + +if test -n "$compiler"; then + +lt_prog_compiler_no_builtin_flag= + +if test "$GCC" = yes; then + case $cc_basename in + nvcc*) + lt_prog_compiler_no_builtin_flag=' -Xcompiler -fno-builtin' ;; + *) + lt_prog_compiler_no_builtin_flag=' -fno-builtin' ;; + esac + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -fno-rtti -fno-exceptions" >&5 +$as_echo_n "checking if $compiler supports -fno-rtti -fno-exceptions... " >&6; } +if ${lt_cv_prog_compiler_rtti_exceptions+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_prog_compiler_rtti_exceptions=no + ac_outfile=conftest.$ac_objext + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + lt_compiler_flag="-fno-rtti -fno-exceptions" + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + # The option is referenced via a variable to avoid confusing sed. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ + -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) + (eval "$lt_compile" 2>conftest.err) + ac_status=$? + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + if (exit $ac_status) && test -s "$ac_outfile"; then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings other than the usual output. + $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp + $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 + if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then + lt_cv_prog_compiler_rtti_exceptions=yes + fi + fi + $RM conftest* + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_rtti_exceptions" >&5 +$as_echo "$lt_cv_prog_compiler_rtti_exceptions" >&6; } + +if test x"$lt_cv_prog_compiler_rtti_exceptions" = xyes; then + lt_prog_compiler_no_builtin_flag="$lt_prog_compiler_no_builtin_flag -fno-rtti -fno-exceptions" +else + : +fi + +fi + + + + + + + lt_prog_compiler_wl= +lt_prog_compiler_pic= +lt_prog_compiler_static= + + + if test "$GCC" = yes; then + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_static='-static' + + case $host_os in + aix*) + # All AIX code is PIC. + if test "$host_cpu" = ia64; then + # AIX 5 now supports IA64 processor + lt_prog_compiler_static='-Bstatic' + fi + ;; + + amigaos*) + case $host_cpu in + powerpc) + # see comment about AmigaOS4 .so support + lt_prog_compiler_pic='-fPIC' + ;; + m68k) + # FIXME: we need at least 68020 code to build shared libraries, but + # adding the `-m68020' flag to GCC prevents building anything better, + # like `-m68040'. + lt_prog_compiler_pic='-m68020 -resident32 -malways-restore-a4' + ;; + esac + ;; + + beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) + # PIC is the default for these OSes. + ;; + + mingw* | cygwin* | pw32* | os2* | cegcc*) + # This hack is so that the source file can tell whether it is being + # built for inclusion in a dll (and should export symbols for example). + # Although the cygwin gcc ignores -fPIC, still need this for old-style + # (--disable-auto-import) libraries + lt_prog_compiler_pic='-DDLL_EXPORT' + ;; + + darwin* | rhapsody*) + # PIC is the default on this platform + # Common symbols not allowed in MH_DYLIB files + lt_prog_compiler_pic='-fno-common' + ;; + + haiku*) + # PIC is the default for Haiku. + # The "-static" flag exists, but is broken. + lt_prog_compiler_static= + ;; + + hpux*) + # PIC is the default for 64-bit PA HP-UX, but not for 32-bit + # PA HP-UX. On IA64 HP-UX, PIC is the default but the pic flag + # sets the default TLS model and affects inlining. + case $host_cpu in + hppa*64*) + # +Z the default + ;; + *) + lt_prog_compiler_pic='-fPIC' + ;; + esac + ;; + + interix[3-9]*) + # Interix 3.x gcc -fpic/-fPIC options generate broken code. + # Instead, we relocate shared libraries at runtime. + ;; + + msdosdjgpp*) + # Just because we use GCC doesn't mean we suddenly get shared libraries + # on systems that don't support them. + lt_prog_compiler_can_build_shared=no + enable_shared=no + ;; + + *nto* | *qnx*) + # QNX uses GNU C++, but need to define -shared option too, otherwise + # it will coredump. + lt_prog_compiler_pic='-fPIC -shared' + ;; + + sysv4*MP*) + if test -d /usr/nec; then + lt_prog_compiler_pic=-Kconform_pic + fi + ;; + + *) + lt_prog_compiler_pic='-fPIC' + ;; + esac + + case $cc_basename in + nvcc*) # Cuda Compiler Driver 2.2 + lt_prog_compiler_wl='-Xlinker ' + if test -n "$lt_prog_compiler_pic"; then + lt_prog_compiler_pic="-Xcompiler $lt_prog_compiler_pic" + fi + ;; + esac + else + # PORTME Check for flag to pass linker flags through the system compiler. + case $host_os in + aix*) + lt_prog_compiler_wl='-Wl,' + if test "$host_cpu" = ia64; then + # AIX 5 now supports IA64 processor + lt_prog_compiler_static='-Bstatic' + else + lt_prog_compiler_static='-bnso -bI:/lib/syscalls.exp' + fi + ;; + + mingw* | cygwin* | pw32* | os2* | cegcc*) + # This hack is so that the source file can tell whether it is being + # built for inclusion in a dll (and should export symbols for example). + lt_prog_compiler_pic='-DDLL_EXPORT' + ;; + + hpux9* | hpux10* | hpux11*) + lt_prog_compiler_wl='-Wl,' + # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but + # not for PA HP-UX. + case $host_cpu in + hppa*64*|ia64*) + # +Z the default + ;; + *) + lt_prog_compiler_pic='+Z' + ;; + esac + # Is there a better lt_prog_compiler_static that works with the bundled CC? + lt_prog_compiler_static='${wl}-a ${wl}archive' + ;; + + irix5* | irix6* | nonstopux*) + lt_prog_compiler_wl='-Wl,' + # PIC (with -KPIC) is the default. + lt_prog_compiler_static='-non_shared' + ;; + + linux* | k*bsd*-gnu | kopensolaris*-gnu) + case $cc_basename in + # old Intel for x86_64 which still supported -KPIC. + ecc*) + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_pic='-KPIC' + lt_prog_compiler_static='-static' + ;; + # icc used to be incompatible with GCC. + # ICC 10 doesn't accept -KPIC any more. + icc* | ifort*) + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_pic='-fPIC' + lt_prog_compiler_static='-static' + ;; + # Lahey Fortran 8.1. + lf95*) + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_pic='--shared' + lt_prog_compiler_static='--static' + ;; + nagfor*) + # NAG Fortran compiler + lt_prog_compiler_wl='-Wl,-Wl,,' + lt_prog_compiler_pic='-PIC' + lt_prog_compiler_static='-Bstatic' + ;; + pgcc* | pgf77* | pgf90* | pgf95* | pgfortran*) + # Portland Group compilers (*not* the Pentium gcc compiler, + # which looks to be a dead project) + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_pic='-fpic' + lt_prog_compiler_static='-Bstatic' + ;; + ccc*) + lt_prog_compiler_wl='-Wl,' + # All Alpha code is PIC. + lt_prog_compiler_static='-non_shared' + ;; + xl* | bgxl* | bgf* | mpixl*) + # IBM XL C 8.0/Fortran 10.1, 11.1 on PPC and BlueGene + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_pic='-qpic' + lt_prog_compiler_static='-qstaticlink' + ;; + *) + case `$CC -V 2>&1 | sed 5q` in + *Sun\ Ceres\ Fortran* | *Sun*Fortran*\ [1-7].* | *Sun*Fortran*\ 8.[0-3]*) + # Sun Fortran 8.3 passes all unrecognized flags to the linker + lt_prog_compiler_pic='-KPIC' + lt_prog_compiler_static='-Bstatic' + lt_prog_compiler_wl='' + ;; + *Sun\ F* | *Sun*Fortran*) + lt_prog_compiler_pic='-KPIC' + lt_prog_compiler_static='-Bstatic' + lt_prog_compiler_wl='-Qoption ld ' + ;; + *Sun\ C*) + # Sun C 5.9 + lt_prog_compiler_pic='-KPIC' + lt_prog_compiler_static='-Bstatic' + lt_prog_compiler_wl='-Wl,' + ;; + *Intel*\ [CF]*Compiler*) + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_pic='-fPIC' + lt_prog_compiler_static='-static' + ;; + *Portland\ Group*) + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_pic='-fpic' + lt_prog_compiler_static='-Bstatic' + ;; + esac + ;; + esac + ;; + + newsos6) + lt_prog_compiler_pic='-KPIC' + lt_prog_compiler_static='-Bstatic' + ;; + + *nto* | *qnx*) + # QNX uses GNU C++, but need to define -shared option too, otherwise + # it will coredump. + lt_prog_compiler_pic='-fPIC -shared' + ;; + + osf3* | osf4* | osf5*) + lt_prog_compiler_wl='-Wl,' + # All OSF/1 code is PIC. + lt_prog_compiler_static='-non_shared' + ;; + + rdos*) + lt_prog_compiler_static='-non_shared' + ;; + + solaris*) + lt_prog_compiler_pic='-KPIC' + lt_prog_compiler_static='-Bstatic' + case $cc_basename in + f77* | f90* | f95* | sunf77* | sunf90* | sunf95*) + lt_prog_compiler_wl='-Qoption ld ';; + *) + lt_prog_compiler_wl='-Wl,';; + esac + ;; + + sunos4*) + lt_prog_compiler_wl='-Qoption ld ' + lt_prog_compiler_pic='-PIC' + lt_prog_compiler_static='-Bstatic' + ;; + + sysv4 | sysv4.2uw2* | sysv4.3*) + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_pic='-KPIC' + lt_prog_compiler_static='-Bstatic' + ;; + + sysv4*MP*) + if test -d /usr/nec ;then + lt_prog_compiler_pic='-Kconform_pic' + lt_prog_compiler_static='-Bstatic' + fi + ;; + + sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_pic='-KPIC' + lt_prog_compiler_static='-Bstatic' + ;; + + unicos*) + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_can_build_shared=no + ;; + + uts4*) + lt_prog_compiler_pic='-pic' + lt_prog_compiler_static='-Bstatic' + ;; + + *) + lt_prog_compiler_can_build_shared=no + ;; + esac + fi + +case $host_os in + # For platforms which do not support PIC, -DPIC is meaningless: + *djgpp*) + lt_prog_compiler_pic= + ;; + *) + lt_prog_compiler_pic="$lt_prog_compiler_pic -DPIC" + ;; +esac + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $compiler option to produce PIC" >&5 +$as_echo_n "checking for $compiler option to produce PIC... " >&6; } +if ${lt_cv_prog_compiler_pic+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_prog_compiler_pic=$lt_prog_compiler_pic +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic" >&5 +$as_echo "$lt_cv_prog_compiler_pic" >&6; } +lt_prog_compiler_pic=$lt_cv_prog_compiler_pic + +# +# Check to make sure the PIC flag actually works. +# +if test -n "$lt_prog_compiler_pic"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler PIC flag $lt_prog_compiler_pic works" >&5 +$as_echo_n "checking if $compiler PIC flag $lt_prog_compiler_pic works... " >&6; } +if ${lt_cv_prog_compiler_pic_works+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_prog_compiler_pic_works=no + ac_outfile=conftest.$ac_objext + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + lt_compiler_flag="$lt_prog_compiler_pic -DPIC" + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + # The option is referenced via a variable to avoid confusing sed. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ + -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) + (eval "$lt_compile" 2>conftest.err) + ac_status=$? + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + if (exit $ac_status) && test -s "$ac_outfile"; then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings other than the usual output. + $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp + $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 + if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then + lt_cv_prog_compiler_pic_works=yes + fi + fi + $RM conftest* + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic_works" >&5 +$as_echo "$lt_cv_prog_compiler_pic_works" >&6; } + +if test x"$lt_cv_prog_compiler_pic_works" = xyes; then + case $lt_prog_compiler_pic in + "" | " "*) ;; + *) lt_prog_compiler_pic=" $lt_prog_compiler_pic" ;; + esac +else + lt_prog_compiler_pic= + lt_prog_compiler_can_build_shared=no +fi + +fi + + + + + + + + + + + +# +# Check to make sure the static flag actually works. +# +wl=$lt_prog_compiler_wl eval lt_tmp_static_flag=\"$lt_prog_compiler_static\" +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler static flag $lt_tmp_static_flag works" >&5 +$as_echo_n "checking if $compiler static flag $lt_tmp_static_flag works... " >&6; } +if ${lt_cv_prog_compiler_static_works+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_prog_compiler_static_works=no + save_LDFLAGS="$LDFLAGS" + LDFLAGS="$LDFLAGS $lt_tmp_static_flag" + echo "$lt_simple_link_test_code" > conftest.$ac_ext + if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then + # The linker can only warn and ignore the option if not recognized + # So say no if there are warnings + if test -s conftest.err; then + # Append any errors to the config.log. + cat conftest.err 1>&5 + $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp + $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 + if diff conftest.exp conftest.er2 >/dev/null; then + lt_cv_prog_compiler_static_works=yes + fi + else + lt_cv_prog_compiler_static_works=yes + fi + fi + $RM -r conftest* + LDFLAGS="$save_LDFLAGS" + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_static_works" >&5 +$as_echo "$lt_cv_prog_compiler_static_works" >&6; } + +if test x"$lt_cv_prog_compiler_static_works" = xyes; then + : +else + lt_prog_compiler_static= +fi + + + + + + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5 +$as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; } +if ${lt_cv_prog_compiler_c_o+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_prog_compiler_c_o=no + $RM -r conftest 2>/dev/null + mkdir conftest + cd conftest + mkdir out + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + + lt_compiler_flag="-o out/conftest2.$ac_objext" + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ + -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) + (eval "$lt_compile" 2>out/conftest.err) + ac_status=$? + cat out/conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + if (exit $ac_status) && test -s out/conftest2.$ac_objext + then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings + $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp + $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 + if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then + lt_cv_prog_compiler_c_o=yes + fi + fi + chmod u+w . 2>&5 + $RM conftest* + # SGI C++ compiler will create directory out/ii_files/ for + # template instantiation + test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files + $RM out/* && rmdir out + cd .. + $RM -r conftest + $RM conftest* + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o" >&5 +$as_echo "$lt_cv_prog_compiler_c_o" >&6; } + + + + + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5 +$as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; } +if ${lt_cv_prog_compiler_c_o+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_prog_compiler_c_o=no + $RM -r conftest 2>/dev/null + mkdir conftest + cd conftest + mkdir out + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + + lt_compiler_flag="-o out/conftest2.$ac_objext" + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ + -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) + (eval "$lt_compile" 2>out/conftest.err) + ac_status=$? + cat out/conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + if (exit $ac_status) && test -s out/conftest2.$ac_objext + then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings + $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp + $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 + if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then + lt_cv_prog_compiler_c_o=yes + fi + fi + chmod u+w . 2>&5 + $RM conftest* + # SGI C++ compiler will create directory out/ii_files/ for + # template instantiation + test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files + $RM out/* && rmdir out + cd .. + $RM -r conftest + $RM conftest* + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o" >&5 +$as_echo "$lt_cv_prog_compiler_c_o" >&6; } + + + + +hard_links="nottested" +if test "$lt_cv_prog_compiler_c_o" = no && test "$need_locks" != no; then + # do not overwrite the value of need_locks provided by the user + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if we can lock with hard links" >&5 +$as_echo_n "checking if we can lock with hard links... " >&6; } + hard_links=yes + $RM conftest* + ln conftest.a conftest.b 2>/dev/null && hard_links=no + touch conftest.a + ln conftest.a conftest.b 2>&5 || hard_links=no + ln conftest.a conftest.b 2>/dev/null && hard_links=no + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $hard_links" >&5 +$as_echo "$hard_links" >&6; } + if test "$hard_links" = no; then + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&5 +$as_echo "$as_me: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&2;} + need_locks=warn + fi +else + need_locks=no +fi + + + + + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $compiler linker ($LD) supports shared libraries" >&5 +$as_echo_n "checking whether the $compiler linker ($LD) supports shared libraries... " >&6; } + + runpath_var= + allow_undefined_flag= + always_export_symbols=no + archive_cmds= + archive_expsym_cmds= + compiler_needs_object=no + enable_shared_with_static_runtimes=no + export_dynamic_flag_spec= + export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' + hardcode_automatic=no + hardcode_direct=no + hardcode_direct_absolute=no + hardcode_libdir_flag_spec= + hardcode_libdir_separator= + hardcode_minus_L=no + hardcode_shlibpath_var=unsupported + inherit_rpath=no + link_all_deplibs=unknown + module_cmds= + module_expsym_cmds= + old_archive_from_new_cmds= + old_archive_from_expsyms_cmds= + thread_safe_flag_spec= + whole_archive_flag_spec= + # include_expsyms should be a list of space-separated symbols to be *always* + # included in the symbol list + include_expsyms= + # exclude_expsyms can be an extended regexp of symbols to exclude + # it will be wrapped by ` (' and `)$', so one must not match beginning or + # end of line. Example: `a|bc|.*d.*' will exclude the symbols `a' and `bc', + # as well as any symbol that contains `d'. + exclude_expsyms='_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*' + # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out + # platforms (ab)use it in PIC code, but their linkers get confused if + # the symbol is explicitly referenced. Since portable code cannot + # rely on this symbol name, it's probably fine to never include it in + # preloaded symbol tables. + # Exclude shared library initialization/finalization symbols. + extract_expsyms_cmds= + + case $host_os in + cygwin* | mingw* | pw32* | cegcc*) + # FIXME: the MSVC++ port hasn't been tested in a loooong time + # When not using gcc, we currently assume that we are using + # Microsoft Visual C++. + if test "$GCC" != yes; then + with_gnu_ld=no + fi + ;; + interix*) + # we just hope/assume this is gcc and not c89 (= MSVC++) + with_gnu_ld=yes + ;; + openbsd*) + with_gnu_ld=no + ;; + linux* | k*bsd*-gnu | gnu*) + link_all_deplibs=no + ;; + esac + + ld_shlibs=yes + + # On some targets, GNU ld is compatible enough with the native linker + # that we're better off using the native interface for both. + lt_use_gnu_ld_interface=no + if test "$with_gnu_ld" = yes; then + case $host_os in + aix*) + # The AIX port of GNU ld has always aspired to compatibility + # with the native linker. However, as the warning in the GNU ld + # block says, versions before 2.19.5* couldn't really create working + # shared libraries, regardless of the interface used. + case `$LD -v 2>&1` in + *\ \(GNU\ Binutils\)\ 2.19.5*) ;; + *\ \(GNU\ Binutils\)\ 2.[2-9]*) ;; + *\ \(GNU\ Binutils\)\ [3-9]*) ;; + *) + lt_use_gnu_ld_interface=yes + ;; + esac + ;; + *) + lt_use_gnu_ld_interface=yes + ;; + esac + fi + + if test "$lt_use_gnu_ld_interface" = yes; then + # If archive_cmds runs LD, not CC, wlarc should be empty + wlarc='${wl}' + + # Set some defaults for GNU ld with shared library support. These + # are reset later if shared libraries are not supported. Putting them + # here allows them to be overridden if necessary. + runpath_var=LD_RUN_PATH + hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' + export_dynamic_flag_spec='${wl}--export-dynamic' + # ancient GNU ld didn't support --whole-archive et. al. + if $LD --help 2>&1 | $GREP 'no-whole-archive' > /dev/null; then + whole_archive_flag_spec="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' + else + whole_archive_flag_spec= + fi + supports_anon_versioning=no + case `$LD -v 2>&1` in + *GNU\ gold*) supports_anon_versioning=yes ;; + *\ [01].* | *\ 2.[0-9].* | *\ 2.10.*) ;; # catch versions < 2.11 + *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ... + *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ... + *\ 2.11.*) ;; # other 2.11 versions + *) supports_anon_versioning=yes ;; + esac + + # See if GNU ld supports shared libraries. + case $host_os in + aix[3-9]*) + # On AIX/PPC, the GNU linker is very broken + if test "$host_cpu" != ia64; then + ld_shlibs=no + cat <<_LT_EOF 1>&2 + +*** Warning: the GNU linker, at least up to release 2.19, is reported +*** to be unable to reliably create shared libraries on AIX. +*** Therefore, libtool is disabling shared libraries support. If you +*** really care for shared libraries, you may want to install binutils +*** 2.20 or above, or modify your PATH so that a non-GNU linker is found. +*** You will then need to restart the configuration process. + +_LT_EOF + fi + ;; + + amigaos*) + case $host_cpu in + powerpc) + # see comment about AmigaOS4 .so support + archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + archive_expsym_cmds='' + ;; + m68k) + archive_cmds='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' + hardcode_libdir_flag_spec='-L$libdir' + hardcode_minus_L=yes + ;; + esac + ;; + + beos*) + if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then + allow_undefined_flag=unsupported + # Joseph Beckenbach says some releases of gcc + # support --undefined. This deserves some investigation. FIXME + archive_cmds='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + else + ld_shlibs=no + fi + ;; + + cygwin* | mingw* | pw32* | cegcc*) + # _LT_TAGVAR(hardcode_libdir_flag_spec, ) is actually meaningless, + # as there is no search path for DLLs. + hardcode_libdir_flag_spec='-L$libdir' + export_dynamic_flag_spec='${wl}--export-all-symbols' + allow_undefined_flag=unsupported + always_export_symbols=no + enable_shared_with_static_runtimes=yes + export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1 DATA/;s/^.*[ ]__nm__\([^ ]*\)[ ][^ ]*/\1 DATA/;/^I[ ]/d;/^[AITW][ ]/s/.* //'\'' | sort | uniq > $export_symbols' + exclude_expsyms='[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname' + + if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then + archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' + # If the export-symbols file already is a .def file (1st line + # is EXPORTS), use it as is; otherwise, prepend... + archive_expsym_cmds='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then + cp $export_symbols $output_objdir/$soname.def; + else + echo EXPORTS > $output_objdir/$soname.def; + cat $export_symbols >> $output_objdir/$soname.def; + fi~ + $CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' + else + ld_shlibs=no + fi + ;; + + haiku*) + archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + link_all_deplibs=yes + ;; + + interix[3-9]*) + hardcode_direct=no + hardcode_shlibpath_var=no + hardcode_libdir_flag_spec='${wl}-rpath,$libdir' + export_dynamic_flag_spec='${wl}-E' + # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. + # Instead, shared libraries are loaded at an image base (0x10000000 by + # default) and relocated if they conflict, which is a slow very memory + # consuming and fragmenting process. To avoid this, we pick a random, + # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link + # time. Moving up from 0x10000000 also allows more sbrk(2) space. + archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' + archive_expsym_cmds='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' + ;; + + gnu* | linux* | tpf* | k*bsd*-gnu | kopensolaris*-gnu) + tmp_diet=no + if test "$host_os" = linux-dietlibc; then + case $cc_basename in + diet\ *) tmp_diet=yes;; # linux-dietlibc with static linking (!diet-dyn) + esac + fi + if $LD --help 2>&1 | $EGREP ': supported targets:.* elf' > /dev/null \ + && test "$tmp_diet" = no + then + tmp_addflag=' $pic_flag' + tmp_sharedflag='-shared' + case $cc_basename,$host_cpu in + pgcc*) # Portland Group C compiler + whole_archive_flag_spec='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' + tmp_addflag=' $pic_flag' + ;; + pgf77* | pgf90* | pgf95* | pgfortran*) + # Portland Group f77 and f90 compilers + whole_archive_flag_spec='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' + tmp_addflag=' $pic_flag -Mnomain' ;; + ecc*,ia64* | icc*,ia64*) # Intel C compiler on ia64 + tmp_addflag=' -i_dynamic' ;; + efc*,ia64* | ifort*,ia64*) # Intel Fortran compiler on ia64 + tmp_addflag=' -i_dynamic -nofor_main' ;; + ifc* | ifort*) # Intel Fortran compiler + tmp_addflag=' -nofor_main' ;; + lf95*) # Lahey Fortran 8.1 + whole_archive_flag_spec= + tmp_sharedflag='--shared' ;; + xl[cC]* | bgxl[cC]* | mpixl[cC]*) # IBM XL C 8.0 on PPC (deal with xlf below) + tmp_sharedflag='-qmkshrobj' + tmp_addflag= ;; + nvcc*) # Cuda Compiler Driver 2.2 + whole_archive_flag_spec='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' + compiler_needs_object=yes + ;; + esac + case `$CC -V 2>&1 | sed 5q` in + *Sun\ C*) # Sun C 5.9 + whole_archive_flag_spec='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' + compiler_needs_object=yes + tmp_sharedflag='-G' ;; + *Sun\ F*) # Sun Fortran 8.3 + tmp_sharedflag='-G' ;; + esac + archive_cmds='$CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + + if test "x$supports_anon_versioning" = xyes; then + archive_expsym_cmds='echo "{ global:" > $output_objdir/$libname.ver~ + cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ + echo "local: *; };" >> $output_objdir/$libname.ver~ + $CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib' + fi + + case $cc_basename in + xlf* | bgf* | bgxlf* | mpixlf*) + # IBM XL Fortran 10.1 on PPC cannot create shared libs itself + whole_archive_flag_spec='--whole-archive$convenience --no-whole-archive' + hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' + archive_cmds='$LD -shared $libobjs $deplibs $linker_flags -soname $soname -o $lib' + if test "x$supports_anon_versioning" = xyes; then + archive_expsym_cmds='echo "{ global:" > $output_objdir/$libname.ver~ + cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ + echo "local: *; };" >> $output_objdir/$libname.ver~ + $LD -shared $libobjs $deplibs $linker_flags -soname $soname -version-script $output_objdir/$libname.ver -o $lib' + fi + ;; + esac + else + ld_shlibs=no + fi + ;; + + netbsd* | netbsdelf*-gnu) + if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then + archive_cmds='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib' + wlarc= + else + archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + fi + ;; + + solaris*) + if $LD -v 2>&1 | $GREP 'BFD 2\.8' > /dev/null; then + ld_shlibs=no + cat <<_LT_EOF 1>&2 + +*** Warning: The releases 2.8.* of the GNU linker cannot reliably +*** create shared libraries on Solaris systems. Therefore, libtool +*** is disabling shared libraries support. We urge you to upgrade GNU +*** binutils to release 2.9.1 or newer. Another option is to modify +*** your PATH or compiler configuration so that the native linker is +*** used, and then restart. + +_LT_EOF + elif $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then + archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + else + ld_shlibs=no + fi + ;; + + sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*) + case `$LD -v 2>&1` in + *\ [01].* | *\ 2.[0-9].* | *\ 2.1[0-5].*) + ld_shlibs=no + cat <<_LT_EOF 1>&2 + +*** Warning: Releases of the GNU linker prior to 2.16.91.0.3 can not +*** reliably create shared libraries on SCO systems. Therefore, libtool +*** is disabling shared libraries support. We urge you to upgrade GNU +*** binutils to release 2.16.91.0.3 or newer. Another option is to modify +*** your PATH or compiler configuration so that the native linker is +*** used, and then restart. + +_LT_EOF + ;; + *) + # For security reasons, it is highly recommended that you always + # use absolute paths for naming shared libraries, and exclude the + # DT_RUNPATH tag from executables and libraries. But doing so + # requires that you compile everything twice, which is a pain. + if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then + hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' + archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + else + ld_shlibs=no + fi + ;; + esac + ;; + + sunos4*) + archive_cmds='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags' + wlarc= + hardcode_direct=yes + hardcode_shlibpath_var=no + ;; + + *) + if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then + archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + else + ld_shlibs=no + fi + ;; + esac + + if test "$ld_shlibs" = no; then + runpath_var= + hardcode_libdir_flag_spec= + export_dynamic_flag_spec= + whole_archive_flag_spec= + fi + else + # PORTME fill in a description of your system's linker (not GNU ld) + case $host_os in + aix3*) + allow_undefined_flag=unsupported + always_export_symbols=yes + archive_expsym_cmds='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname' + # Note: this linker hardcodes the directories in LIBPATH if there + # are no directories specified by -L. + hardcode_minus_L=yes + if test "$GCC" = yes && test -z "$lt_prog_compiler_static"; then + # Neither direct hardcoding nor static linking is supported with a + # broken collect2. + hardcode_direct=unsupported + fi + ;; + + aix[4-9]*) + if test "$host_cpu" = ia64; then + # On IA64, the linker does run time linking by default, so we don't + # have to do anything special. + aix_use_runtimelinking=no + exp_sym_flag='-Bexport' + no_entry_flag="" + else + # If we're using GNU nm, then we don't want the "-C" option. + # -C means demangle to AIX nm, but means don't demangle with GNU nm + # Also, AIX nm treats weak defined symbols like other global + # defined symbols, whereas GNU nm marks them as "W". + if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then + export_symbols_cmds='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && (substr(\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' + else + export_symbols_cmds='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && (substr(\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' + fi + aix_use_runtimelinking=no + + # Test if we are trying to use run time linking or normal + # AIX style linking. If -brtl is somewhere in LDFLAGS, we + # need to do runtime linking. + case $host_os in aix4.[23]|aix4.[23].*|aix[5-9]*) + for ld_flag in $LDFLAGS; do + if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then + aix_use_runtimelinking=yes + break + fi + done + ;; + esac + + exp_sym_flag='-bexport' + no_entry_flag='-bnoentry' + fi + + # When large executables or shared objects are built, AIX ld can + # have problems creating the table of contents. If linking a library + # or program results in "error TOC overflow" add -mminimal-toc to + # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not + # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. + + archive_cmds='' + hardcode_direct=yes + hardcode_direct_absolute=yes + hardcode_libdir_separator=':' + link_all_deplibs=yes + file_list_spec='${wl}-f,' + + if test "$GCC" = yes; then + case $host_os in aix4.[012]|aix4.[012].*) + # We only want to do this on AIX 4.2 and lower, the check + # below for broken collect2 doesn't work under 4.3+ + collect2name=`${CC} -print-prog-name=collect2` + if test -f "$collect2name" && + strings "$collect2name" | $GREP resolve_lib_name >/dev/null + then + # We have reworked collect2 + : + else + # We have old collect2 + hardcode_direct=unsupported + # It fails to find uninstalled libraries when the uninstalled + # path is not listed in the libpath. Setting hardcode_minus_L + # to unsupported forces relinking + hardcode_minus_L=yes + hardcode_libdir_flag_spec='-L$libdir' + hardcode_libdir_separator= + fi + ;; + esac + shared_flag='-shared' + if test "$aix_use_runtimelinking" = yes; then + shared_flag="$shared_flag "'${wl}-G' + fi + link_all_deplibs=no + else + # not using gcc + if test "$host_cpu" = ia64; then + # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release + # chokes on -Wl,-G. The following line is correct: + shared_flag='-G' + else + if test "$aix_use_runtimelinking" = yes; then + shared_flag='${wl}-G' + else + shared_flag='${wl}-bM:SRE' + fi + fi + fi + + export_dynamic_flag_spec='${wl}-bexpall' + # It seems that -bexpall does not export symbols beginning with + # underscore (_), so it is better to generate a list of symbols to export. + always_export_symbols=yes + if test "$aix_use_runtimelinking" = yes; then + # Warning - without using the other runtime loading flags (-brtl), + # -berok will link without error, but may produce a broken library. + allow_undefined_flag='-berok' + # Determine the default libpath from the value encoded in an + # empty executable. + if test "${lt_cv_aix_libpath+set}" = set; then + aix_libpath=$lt_cv_aix_libpath +else + if ${lt_cv_aix_libpath_+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + + lt_aix_libpath_sed=' + /Import File Strings/,/^$/ { + /^0/ { + s/^0 *\([^ ]*\) *$/\1/ + p + } + }' + lt_cv_aix_libpath_=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` + # Check for a 64-bit object if we didn't find anything. + if test -z "$lt_cv_aix_libpath_"; then + lt_cv_aix_libpath_=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` + fi +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + if test -z "$lt_cv_aix_libpath_"; then + lt_cv_aix_libpath_="/usr/lib:/lib" + fi + +fi + + aix_libpath=$lt_cv_aix_libpath_ +fi + + hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath" + archive_expsym_cmds='$CC -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then func_echo_all "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag" + else + if test "$host_cpu" = ia64; then + hardcode_libdir_flag_spec='${wl}-R $libdir:/usr/lib:/lib' + allow_undefined_flag="-z nodefs" + archive_expsym_cmds="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols" + else + # Determine the default libpath from the value encoded in an + # empty executable. + if test "${lt_cv_aix_libpath+set}" = set; then + aix_libpath=$lt_cv_aix_libpath +else + if ${lt_cv_aix_libpath_+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + + lt_aix_libpath_sed=' + /Import File Strings/,/^$/ { + /^0/ { + s/^0 *\([^ ]*\) *$/\1/ + p + } + }' + lt_cv_aix_libpath_=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` + # Check for a 64-bit object if we didn't find anything. + if test -z "$lt_cv_aix_libpath_"; then + lt_cv_aix_libpath_=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` + fi +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + if test -z "$lt_cv_aix_libpath_"; then + lt_cv_aix_libpath_="/usr/lib:/lib" + fi + +fi + + aix_libpath=$lt_cv_aix_libpath_ +fi + + hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath" + # Warning - without using the other run time loading flags, + # -berok will link without error, but may produce a broken library. + no_undefined_flag=' ${wl}-bernotok' + allow_undefined_flag=' ${wl}-berok' + if test "$with_gnu_ld" = yes; then + # We only use this code for GNU lds that support --whole-archive. + whole_archive_flag_spec='${wl}--whole-archive$convenience ${wl}--no-whole-archive' + else + # Exported symbols can be pulled into shared objects from archives + whole_archive_flag_spec='$convenience' + fi + archive_cmds_need_lc=yes + # This is similar to how AIX traditionally builds its shared libraries. + archive_expsym_cmds="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' + fi + fi + ;; + + amigaos*) + case $host_cpu in + powerpc) + # see comment about AmigaOS4 .so support + archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + archive_expsym_cmds='' + ;; + m68k) + archive_cmds='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' + hardcode_libdir_flag_spec='-L$libdir' + hardcode_minus_L=yes + ;; + esac + ;; + + bsdi[45]*) + export_dynamic_flag_spec=-rdynamic + ;; + + cygwin* | mingw* | pw32* | cegcc*) + # When not using gcc, we currently assume that we are using + # Microsoft Visual C++. + # hardcode_libdir_flag_spec is actually meaningless, as there is + # no search path for DLLs. + case $cc_basename in + cl*) + # Native MSVC + hardcode_libdir_flag_spec=' ' + allow_undefined_flag=unsupported + always_export_symbols=yes + file_list_spec='@' + # Tell ltmain to make .lib files, not .a files. + libext=lib + # Tell ltmain to make .dll files, not .so files. + shrext_cmds=".dll" + # FIXME: Setting linknames here is a bad hack. + archive_cmds='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-dll~linknames=' + archive_expsym_cmds='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then + sed -n -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' -e '1\\\!p' < $export_symbols > $output_objdir/$soname.exp; + else + sed -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' < $export_symbols > $output_objdir/$soname.exp; + fi~ + $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~ + linknames=' + # The linker will not automatically build a static lib if we build a DLL. + # _LT_TAGVAR(old_archive_from_new_cmds, )='true' + enable_shared_with_static_runtimes=yes + exclude_expsyms='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*' + export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1,DATA/'\'' | $SED -e '\''/^[AITW][ ]/s/.*[ ]//'\'' | sort | uniq > $export_symbols' + # Don't use ranlib + old_postinstall_cmds='chmod 644 $oldlib' + postlink_cmds='lt_outputfile="@OUTPUT@"~ + lt_tool_outputfile="@TOOL_OUTPUT@"~ + case $lt_outputfile in + *.exe|*.EXE) ;; + *) + lt_outputfile="$lt_outputfile.exe" + lt_tool_outputfile="$lt_tool_outputfile.exe" + ;; + esac~ + if test "$MANIFEST_TOOL" != ":" && test -f "$lt_outputfile.manifest"; then + $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1; + $RM "$lt_outputfile.manifest"; + fi' + ;; + *) + # Assume MSVC wrapper + hardcode_libdir_flag_spec=' ' + allow_undefined_flag=unsupported + # Tell ltmain to make .lib files, not .a files. + libext=lib + # Tell ltmain to make .dll files, not .so files. + shrext_cmds=".dll" + # FIXME: Setting linknames here is a bad hack. + archive_cmds='$CC -o $lib $libobjs $compiler_flags `func_echo_all "$deplibs" | $SED '\''s/ -lc$//'\''` -link -dll~linknames=' + # The linker will automatically build a .lib file if we build a DLL. + old_archive_from_new_cmds='true' + # FIXME: Should let the user specify the lib program. + old_archive_cmds='lib -OUT:$oldlib$oldobjs$old_deplibs' + enable_shared_with_static_runtimes=yes + ;; + esac + ;; + + darwin* | rhapsody*) + + + archive_cmds_need_lc=no + hardcode_direct=no + hardcode_automatic=yes + hardcode_shlibpath_var=unsupported + if test "$lt_cv_ld_force_load" = "yes"; then + whole_archive_flag_spec='`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience ${wl}-force_load,$conv\"; done; func_echo_all \"$new_convenience\"`' + + else + whole_archive_flag_spec='' + fi + link_all_deplibs=yes + allow_undefined_flag="$_lt_dar_allow_undefined" + case $cc_basename in + ifort*) _lt_dar_can_shared=yes ;; + *) _lt_dar_can_shared=$GCC ;; + esac + if test "$_lt_dar_can_shared" = "yes"; then + output_verbose_link_cmd=func_echo_all + archive_cmds="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod${_lt_dsymutil}" + module_cmds="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dsymutil}" + archive_expsym_cmds="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring ${_lt_dar_single_mod}${_lt_dar_export_syms}${_lt_dsymutil}" + module_expsym_cmds="sed -e 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dar_export_syms}${_lt_dsymutil}" + + else + ld_shlibs=no + fi + + ;; + + dgux*) + archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_libdir_flag_spec='-L$libdir' + hardcode_shlibpath_var=no + ;; + + # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor + # support. Future versions do this automatically, but an explicit c++rt0.o + # does not break anything, and helps significantly (at the cost of a little + # extra space). + freebsd2.2*) + archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o' + hardcode_libdir_flag_spec='-R$libdir' + hardcode_direct=yes + hardcode_shlibpath_var=no + ;; + + # Unfortunately, older versions of FreeBSD 2 do not have this feature. + freebsd2.*) + archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' + hardcode_direct=yes + hardcode_minus_L=yes + hardcode_shlibpath_var=no + ;; + + # FreeBSD 3 and greater uses gcc -shared to do shared libraries. + freebsd* | dragonfly*) + archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' + hardcode_libdir_flag_spec='-R$libdir' + hardcode_direct=yes + hardcode_shlibpath_var=no + ;; + + hpux9*) + if test "$GCC" = yes; then + archive_cmds='$RM $output_objdir/$soname~$CC -shared $pic_flag ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' + else + archive_cmds='$RM $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' + fi + hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' + hardcode_libdir_separator=: + hardcode_direct=yes + + # hardcode_minus_L: Not really in the search PATH, + # but as the default location of the library. + hardcode_minus_L=yes + export_dynamic_flag_spec='${wl}-E' + ;; + + hpux10*) + if test "$GCC" = yes && test "$with_gnu_ld" = no; then + archive_cmds='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' + else + archive_cmds='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' + fi + if test "$with_gnu_ld" = no; then + hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' + hardcode_libdir_separator=: + hardcode_direct=yes + hardcode_direct_absolute=yes + export_dynamic_flag_spec='${wl}-E' + # hardcode_minus_L: Not really in the search PATH, + # but as the default location of the library. + hardcode_minus_L=yes + fi + ;; + + hpux11*) + if test "$GCC" = yes && test "$with_gnu_ld" = no; then + case $host_cpu in + hppa*64*) + archive_cmds='$CC -shared ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + ia64*) + archive_cmds='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' + ;; + *) + archive_cmds='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' + ;; + esac + else + case $host_cpu in + hppa*64*) + archive_cmds='$CC -b ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + ia64*) + archive_cmds='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' + ;; + *) + + # Older versions of the 11.00 compiler do not understand -b yet + # (HP92453-01 A.11.01.20 doesn't, HP92453-01 B.11.X.35175-35176.GP does) + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $CC understands -b" >&5 +$as_echo_n "checking if $CC understands -b... " >&6; } +if ${lt_cv_prog_compiler__b+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_prog_compiler__b=no + save_LDFLAGS="$LDFLAGS" + LDFLAGS="$LDFLAGS -b" + echo "$lt_simple_link_test_code" > conftest.$ac_ext + if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then + # The linker can only warn and ignore the option if not recognized + # So say no if there are warnings + if test -s conftest.err; then + # Append any errors to the config.log. + cat conftest.err 1>&5 + $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp + $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 + if diff conftest.exp conftest.er2 >/dev/null; then + lt_cv_prog_compiler__b=yes + fi + else + lt_cv_prog_compiler__b=yes + fi + fi + $RM -r conftest* + LDFLAGS="$save_LDFLAGS" + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler__b" >&5 +$as_echo "$lt_cv_prog_compiler__b" >&6; } + +if test x"$lt_cv_prog_compiler__b" = xyes; then + archive_cmds='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' +else + archive_cmds='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' +fi + + ;; + esac + fi + if test "$with_gnu_ld" = no; then + hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' + hardcode_libdir_separator=: + + case $host_cpu in + hppa*64*|ia64*) + hardcode_direct=no + hardcode_shlibpath_var=no + ;; + *) + hardcode_direct=yes + hardcode_direct_absolute=yes + export_dynamic_flag_spec='${wl}-E' + + # hardcode_minus_L: Not really in the search PATH, + # but as the default location of the library. + hardcode_minus_L=yes + ;; + esac + fi + ;; + + irix5* | irix6* | nonstopux*) + if test "$GCC" = yes; then + archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + # Try to use the -exported_symbol ld option, if it does not + # work, assume that -exports_file does not work either and + # implicitly export all symbols. + # This should be the same for all languages, so no per-tag cache variable. + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $host_os linker accepts -exported_symbol" >&5 +$as_echo_n "checking whether the $host_os linker accepts -exported_symbol... " >&6; } +if ${lt_cv_irix_exported_symbol+:} false; then : + $as_echo_n "(cached) " >&6 +else + save_LDFLAGS="$LDFLAGS" + LDFLAGS="$LDFLAGS -shared ${wl}-exported_symbol ${wl}foo ${wl}-update_registry ${wl}/dev/null" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +int foo (void) { return 0; } +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + lt_cv_irix_exported_symbol=yes +else + lt_cv_irix_exported_symbol=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + LDFLAGS="$save_LDFLAGS" +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_irix_exported_symbol" >&5 +$as_echo "$lt_cv_irix_exported_symbol" >&6; } + if test "$lt_cv_irix_exported_symbol" = yes; then + archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations ${wl}-exports_file ${wl}$export_symbols -o $lib' + fi + else + archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' + archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -exports_file $export_symbols -o $lib' + fi + archive_cmds_need_lc='no' + hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' + hardcode_libdir_separator=: + inherit_rpath=yes + link_all_deplibs=yes + ;; + + netbsd* | netbsdelf*-gnu) + if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then + archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' # a.out + else + archive_cmds='$LD -shared -o $lib $libobjs $deplibs $linker_flags' # ELF + fi + hardcode_libdir_flag_spec='-R$libdir' + hardcode_direct=yes + hardcode_shlibpath_var=no + ;; + + newsos6) + archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_direct=yes + hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' + hardcode_libdir_separator=: + hardcode_shlibpath_var=no + ;; + + *nto* | *qnx*) + ;; + + openbsd*) + if test -f /usr/libexec/ld.so; then + hardcode_direct=yes + hardcode_shlibpath_var=no + hardcode_direct_absolute=yes + if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then + archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-retain-symbols-file,$export_symbols' + hardcode_libdir_flag_spec='${wl}-rpath,$libdir' + export_dynamic_flag_spec='${wl}-E' + else + case $host_os in + openbsd[01].* | openbsd2.[0-7] | openbsd2.[0-7].*) + archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' + hardcode_libdir_flag_spec='-R$libdir' + ;; + *) + archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' + hardcode_libdir_flag_spec='${wl}-rpath,$libdir' + ;; + esac + fi + else + ld_shlibs=no + fi + ;; + + os2*) + hardcode_libdir_flag_spec='-L$libdir' + hardcode_minus_L=yes + allow_undefined_flag=unsupported + archive_cmds='$ECHO "LIBRARY $libname INITINSTANCE" > $output_objdir/$libname.def~$ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~echo DATA >> $output_objdir/$libname.def~echo " SINGLE NONSHARED" >> $output_objdir/$libname.def~echo EXPORTS >> $output_objdir/$libname.def~emxexp $libobjs >> $output_objdir/$libname.def~$CC -Zdll -Zcrtdll -o $lib $libobjs $deplibs $compiler_flags $output_objdir/$libname.def' + old_archive_from_new_cmds='emximp -o $output_objdir/$libname.a $output_objdir/$libname.def' + ;; + + osf3*) + if test "$GCC" = yes; then + allow_undefined_flag=' ${wl}-expect_unresolved ${wl}\*' + archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + else + allow_undefined_flag=' -expect_unresolved \*' + archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' + fi + archive_cmds_need_lc='no' + hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' + hardcode_libdir_separator=: + ;; + + osf4* | osf5*) # as osf3* with the addition of -msym flag + if test "$GCC" = yes; then + allow_undefined_flag=' ${wl}-expect_unresolved ${wl}\*' + archive_cmds='$CC -shared${allow_undefined_flag} $pic_flag $libobjs $deplibs $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' + else + allow_undefined_flag=' -expect_unresolved \*' + archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' + archive_expsym_cmds='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; printf "%s\\n" "-hidden">> $lib.exp~ + $CC -shared${allow_undefined_flag} ${wl}-input ${wl}$lib.exp $compiler_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib~$RM $lib.exp' + + # Both c and cxx compiler support -rpath directly + hardcode_libdir_flag_spec='-rpath $libdir' + fi + archive_cmds_need_lc='no' + hardcode_libdir_separator=: + ;; + + solaris*) + no_undefined_flag=' -z defs' + if test "$GCC" = yes; then + wlarc='${wl}' + archive_cmds='$CC -shared $pic_flag ${wl}-z ${wl}text ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ + $CC -shared $pic_flag ${wl}-z ${wl}text ${wl}-M ${wl}$lib.exp ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' + else + case `$CC -V 2>&1` in + *"Compilers 5.0"*) + wlarc='' + archive_cmds='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags' + archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ + $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$RM $lib.exp' + ;; + *) + wlarc='${wl}' + archive_cmds='$CC -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ + $CC -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' + ;; + esac + fi + hardcode_libdir_flag_spec='-R$libdir' + hardcode_shlibpath_var=no + case $host_os in + solaris2.[0-5] | solaris2.[0-5].*) ;; + *) + # The compiler driver will combine and reorder linker options, + # but understands `-z linker_flag'. GCC discards it without `$wl', + # but is careful enough not to reorder. + # Supported since Solaris 2.6 (maybe 2.5.1?) + if test "$GCC" = yes; then + whole_archive_flag_spec='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract' + else + whole_archive_flag_spec='-z allextract$convenience -z defaultextract' + fi + ;; + esac + link_all_deplibs=yes + ;; + + sunos4*) + if test "x$host_vendor" = xsequent; then + # Use $CC to link under sequent, because it throws in some extra .o + # files that make .init and .fini sections work. + archive_cmds='$CC -G ${wl}-h $soname -o $lib $libobjs $deplibs $compiler_flags' + else + archive_cmds='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags' + fi + hardcode_libdir_flag_spec='-L$libdir' + hardcode_direct=yes + hardcode_minus_L=yes + hardcode_shlibpath_var=no + ;; + + sysv4) + case $host_vendor in + sni) + archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_direct=yes # is this really true??? + ;; + siemens) + ## LD is ld it makes a PLAMLIB + ## CC just makes a GrossModule. + archive_cmds='$LD -G -o $lib $libobjs $deplibs $linker_flags' + reload_cmds='$CC -r -o $output$reload_objs' + hardcode_direct=no + ;; + motorola) + archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_direct=no #Motorola manual says yes, but my tests say they lie + ;; + esac + runpath_var='LD_RUN_PATH' + hardcode_shlibpath_var=no + ;; + + sysv4.3*) + archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_shlibpath_var=no + export_dynamic_flag_spec='-Bexport' + ;; + + sysv4*MP*) + if test -d /usr/nec; then + archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_shlibpath_var=no + runpath_var=LD_RUN_PATH + hardcode_runpath_var=yes + ld_shlibs=yes + fi + ;; + + sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7* | sco3.2v5.0.[024]*) + no_undefined_flag='${wl}-z,text' + archive_cmds_need_lc=no + hardcode_shlibpath_var=no + runpath_var='LD_RUN_PATH' + + if test "$GCC" = yes; then + archive_cmds='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + else + archive_cmds='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + fi + ;; + + sysv5* | sco3.2v5* | sco5v6*) + # Note: We can NOT use -z defs as we might desire, because we do not + # link with -lc, and that would cause any symbols used from libc to + # always be unresolved, which means just about no library would + # ever link correctly. If we're not using GNU ld we use -z text + # though, which does catch some bad symbols but isn't as heavy-handed + # as -z defs. + no_undefined_flag='${wl}-z,text' + allow_undefined_flag='${wl}-z,nodefs' + archive_cmds_need_lc=no + hardcode_shlibpath_var=no + hardcode_libdir_flag_spec='${wl}-R,$libdir' + hardcode_libdir_separator=':' + link_all_deplibs=yes + export_dynamic_flag_spec='${wl}-Bexport' + runpath_var='LD_RUN_PATH' + + if test "$GCC" = yes; then + archive_cmds='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + else + archive_cmds='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + fi + ;; + + uts4*) + archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_libdir_flag_spec='-L$libdir' + hardcode_shlibpath_var=no + ;; + + *) + ld_shlibs=no + ;; + esac + + if test x$host_vendor = xsni; then + case $host in + sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) + export_dynamic_flag_spec='${wl}-Blargedynsym' + ;; + esac + fi + fi + +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ld_shlibs" >&5 +$as_echo "$ld_shlibs" >&6; } +test "$ld_shlibs" = no && can_build_shared=no + +with_gnu_ld=$with_gnu_ld + + + + + + + + + + + + + + + +# +# Do we need to explicitly link libc? +# +case "x$archive_cmds_need_lc" in +x|xyes) + # Assume -lc should be added + archive_cmds_need_lc=yes + + if test "$enable_shared" = yes && test "$GCC" = yes; then + case $archive_cmds in + *'~'*) + # FIXME: we may have to deal with multi-command sequences. + ;; + '$CC '*) + # Test whether the compiler implicitly links with -lc since on some + # systems, -lgcc has to come before -lc. If gcc already passes -lc + # to ld, don't add -lc before -lgcc. + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether -lc should be explicitly linked in" >&5 +$as_echo_n "checking whether -lc should be explicitly linked in... " >&6; } +if ${lt_cv_archive_cmds_need_lc+:} false; then : + $as_echo_n "(cached) " >&6 +else + $RM conftest* + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } 2>conftest.err; then + soname=conftest + lib=conftest + libobjs=conftest.$ac_objext + deplibs= + wl=$lt_prog_compiler_wl + pic_flag=$lt_prog_compiler_pic + compiler_flags=-v + linker_flags=-v + verstring= + output_objdir=. + libname=conftest + lt_save_allow_undefined_flag=$allow_undefined_flag + allow_undefined_flag= + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$archive_cmds 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1\""; } >&5 + (eval $archive_cmds 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + then + lt_cv_archive_cmds_need_lc=no + else + lt_cv_archive_cmds_need_lc=yes + fi + allow_undefined_flag=$lt_save_allow_undefined_flag + else + cat conftest.err 1>&5 + fi + $RM conftest* + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_archive_cmds_need_lc" >&5 +$as_echo "$lt_cv_archive_cmds_need_lc" >&6; } + archive_cmds_need_lc=$lt_cv_archive_cmds_need_lc + ;; + esac + fi + ;; +esac + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking dynamic linker characteristics" >&5 +$as_echo_n "checking dynamic linker characteristics... " >&6; } + +if test "$GCC" = yes; then + case $host_os in + darwin*) lt_awk_arg="/^libraries:/,/LR/" ;; + *) lt_awk_arg="/^libraries:/" ;; + esac + case $host_os in + mingw* | cegcc*) lt_sed_strip_eq="s,=\([A-Za-z]:\),\1,g" ;; + *) lt_sed_strip_eq="s,=/,/,g" ;; + esac + lt_search_path_spec=`$CC -print-search-dirs | awk $lt_awk_arg | $SED -e "s/^libraries://" -e $lt_sed_strip_eq` + case $lt_search_path_spec in + *\;*) + # if the path contains ";" then we assume it to be the separator + # otherwise default to the standard path separator (i.e. ":") - it is + # assumed that no part of a normal pathname contains ";" but that should + # okay in the real world where ";" in dirpaths is itself problematic. + lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED 's/;/ /g'` + ;; + *) + lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED "s/$PATH_SEPARATOR/ /g"` + ;; + esac + # Ok, now we have the path, separated by spaces, we can step through it + # and add multilib dir if necessary. + lt_tmp_lt_search_path_spec= + lt_multi_os_dir=`$CC $CPPFLAGS $CFLAGS $LDFLAGS -print-multi-os-directory 2>/dev/null` + for lt_sys_path in $lt_search_path_spec; do + if test -d "$lt_sys_path/$lt_multi_os_dir"; then + lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path/$lt_multi_os_dir" + else + test -d "$lt_sys_path" && \ + lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path" + fi + done + lt_search_path_spec=`$ECHO "$lt_tmp_lt_search_path_spec" | awk ' +BEGIN {RS=" "; FS="/|\n";} { + lt_foo=""; + lt_count=0; + for (lt_i = NF; lt_i > 0; lt_i--) { + if ($lt_i != "" && $lt_i != ".") { + if ($lt_i == "..") { + lt_count++; + } else { + if (lt_count == 0) { + lt_foo="/" $lt_i lt_foo; + } else { + lt_count--; + } + } + } + } + if (lt_foo != "") { lt_freq[lt_foo]++; } + if (lt_freq[lt_foo] == 1) { print lt_foo; } +}'` + # AWK program above erroneously prepends '/' to C:/dos/paths + # for these hosts. + case $host_os in + mingw* | cegcc*) lt_search_path_spec=`$ECHO "$lt_search_path_spec" |\ + $SED 's,/\([A-Za-z]:\),\1,g'` ;; + esac + sys_lib_search_path_spec=`$ECHO "$lt_search_path_spec" | $lt_NL2SP` +else + sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" +fi +library_names_spec= +libname_spec='lib$name' +soname_spec= +shrext_cmds=".so" +postinstall_cmds= +postuninstall_cmds= +finish_cmds= +finish_eval= +shlibpath_var= +shlibpath_overrides_runpath=unknown +version_type=none +dynamic_linker="$host_os ld.so" +sys_lib_dlsearch_path_spec="/lib /usr/lib" +need_lib_prefix=unknown +hardcode_into_libs=no + +# when you set need_version to no, make sure it does not cause -set_version +# flags to be left without arguments +need_version=unknown + +case $host_os in +aix3*) + version_type=linux # correct to gnu/linux during the next big refactor + library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a' + shlibpath_var=LIBPATH + + # AIX 3 has no versioning support, so we append a major version to the name. + soname_spec='${libname}${release}${shared_ext}$major' + ;; + +aix[4-9]*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + hardcode_into_libs=yes + if test "$host_cpu" = ia64; then + # AIX 5 supports IA64 + library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}' + shlibpath_var=LD_LIBRARY_PATH + else + # With GCC up to 2.95.x, collect2 would create an import file + # for dependence libraries. The import file would start with + # the line `#! .'. This would cause the generated library to + # depend on `.', always an invalid library. This was fixed in + # development snapshots of GCC prior to 3.0. + case $host_os in + aix4 | aix4.[01] | aix4.[01].*) + if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)' + echo ' yes ' + echo '#endif'; } | ${CC} -E - | $GREP yes > /dev/null; then + : + else + can_build_shared=no + fi + ;; + esac + # AIX (on Power*) has no versioning support, so currently we can not hardcode correct + # soname into executable. Probably we can add versioning support to + # collect2, so additional links can be useful in future. + if test "$aix_use_runtimelinking" = yes; then + # If using run time linking (on AIX 4.2 or later) use lib.so + # instead of lib.a to let people know that these are not + # typical AIX shared libraries. + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + else + # We preserve .a as extension for shared libraries through AIX4.2 + # and later when we are not doing run time linking. + library_names_spec='${libname}${release}.a $libname.a' + soname_spec='${libname}${release}${shared_ext}$major' + fi + shlibpath_var=LIBPATH + fi + ;; + +amigaos*) + case $host_cpu in + powerpc) + # Since July 2007 AmigaOS4 officially supports .so libraries. + # When compiling the executable, add -use-dynld -Lsobjs: to the compileline. + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + ;; + m68k) + library_names_spec='$libname.ixlibrary $libname.a' + # Create ${libname}_ixlibrary.a entries in /sys/libs. + finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`func_echo_all "$lib" | $SED '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; test $RM /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done' + ;; + esac + ;; + +beos*) + library_names_spec='${libname}${shared_ext}' + dynamic_linker="$host_os ld.so" + shlibpath_var=LIBRARY_PATH + ;; + +bsdi[45]*) + version_type=linux # correct to gnu/linux during the next big refactor + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir' + shlibpath_var=LD_LIBRARY_PATH + sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib" + sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib" + # the default ld.so.conf also contains /usr/contrib/lib and + # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow + # libtool to hard-code these into programs + ;; + +cygwin* | mingw* | pw32* | cegcc*) + version_type=windows + shrext_cmds=".dll" + need_version=no + need_lib_prefix=no + + case $GCC,$cc_basename in + yes,*) + # gcc + library_names_spec='$libname.dll.a' + # DLL is installed to $(libdir)/../bin by postinstall_cmds + postinstall_cmds='base_file=`basename \${file}`~ + dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~ + dldir=$destdir/`dirname \$dlpath`~ + test -d \$dldir || mkdir -p \$dldir~ + $install_prog $dir/$dlname \$dldir/$dlname~ + chmod a+x \$dldir/$dlname~ + if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then + eval '\''$striplib \$dldir/$dlname'\'' || exit \$?; + fi' + postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ + dlpath=$dir/\$dldll~ + $RM \$dlpath' + shlibpath_overrides_runpath=yes + + case $host_os in + cygwin*) + # Cygwin DLLs use 'cyg' prefix rather than 'lib' + soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' + + sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/lib/w32api" + ;; + mingw* | cegcc*) + # MinGW DLLs use traditional 'lib' prefix + soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' + ;; + pw32*) + # pw32 DLLs use 'pw' prefix rather than 'lib' + library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' + ;; + esac + dynamic_linker='Win32 ld.exe' + ;; + + *,cl*) + # Native MSVC + libname_spec='$name' + soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' + library_names_spec='${libname}.dll.lib' + + case $build_os in + mingw*) + sys_lib_search_path_spec= + lt_save_ifs=$IFS + IFS=';' + for lt_path in $LIB + do + IFS=$lt_save_ifs + # Let DOS variable expansion print the short 8.3 style file name. + lt_path=`cd "$lt_path" 2>/dev/null && cmd //C "for %i in (".") do @echo %~si"` + sys_lib_search_path_spec="$sys_lib_search_path_spec $lt_path" + done + IFS=$lt_save_ifs + # Convert to MSYS style. + sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | sed -e 's|\\\\|/|g' -e 's| \\([a-zA-Z]\\):| /\\1|g' -e 's|^ ||'` + ;; + cygwin*) + # Convert to unix form, then to dos form, then back to unix form + # but this time dos style (no spaces!) so that the unix form looks + # like /cygdrive/c/PROGRA~1:/cygdr... + sys_lib_search_path_spec=`cygpath --path --unix "$LIB"` + sys_lib_search_path_spec=`cygpath --path --dos "$sys_lib_search_path_spec" 2>/dev/null` + sys_lib_search_path_spec=`cygpath --path --unix "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` + ;; + *) + sys_lib_search_path_spec="$LIB" + if $ECHO "$sys_lib_search_path_spec" | $GREP ';[c-zC-Z]:/' >/dev/null; then + # It is most probably a Windows format PATH. + sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` + else + sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` + fi + # FIXME: find the short name or the path components, as spaces are + # common. (e.g. "Program Files" -> "PROGRA~1") + ;; + esac + + # DLL is installed to $(libdir)/../bin by postinstall_cmds + postinstall_cmds='base_file=`basename \${file}`~ + dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~ + dldir=$destdir/`dirname \$dlpath`~ + test -d \$dldir || mkdir -p \$dldir~ + $install_prog $dir/$dlname \$dldir/$dlname' + postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ + dlpath=$dir/\$dldll~ + $RM \$dlpath' + shlibpath_overrides_runpath=yes + dynamic_linker='Win32 link.exe' + ;; + + *) + # Assume MSVC wrapper + library_names_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext} $libname.lib' + dynamic_linker='Win32 ld.exe' + ;; + esac + # FIXME: first we should search . and the directory the executable is in + shlibpath_var=PATH + ;; + +darwin* | rhapsody*) + dynamic_linker="$host_os dyld" + version_type=darwin + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${major}$shared_ext ${libname}$shared_ext' + soname_spec='${libname}${release}${major}$shared_ext' + shlibpath_overrides_runpath=yes + shlibpath_var=DYLD_LIBRARY_PATH + shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`' + + sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/local/lib" + sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib' + ;; + +dgux*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + ;; + +freebsd* | dragonfly*) + # DragonFly does not have aout. When/if they implement a new + # versioning mechanism, adjust this. + if test -x /usr/bin/objformat; then + objformat=`/usr/bin/objformat` + else + case $host_os in + freebsd[23].*) objformat=aout ;; + *) objformat=elf ;; + esac + fi + version_type=freebsd-$objformat + case $version_type in + freebsd-elf*) + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' + need_version=no + need_lib_prefix=no + ;; + freebsd-*) + library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix' + need_version=yes + ;; + esac + shlibpath_var=LD_LIBRARY_PATH + case $host_os in + freebsd2.*) + shlibpath_overrides_runpath=yes + ;; + freebsd3.[01]* | freebsdelf3.[01]*) + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + freebsd3.[2-9]* | freebsdelf3.[2-9]* | \ + freebsd4.[0-5] | freebsdelf4.[0-5] | freebsd4.1.1 | freebsdelf4.1.1) + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; + *) # from 4.6 on, and DragonFly + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + esac + ;; + +gnu*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; + +haiku*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + dynamic_linker="$host_os runtime_loader" + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LIBRARY_PATH + shlibpath_overrides_runpath=yes + sys_lib_dlsearch_path_spec='/boot/home/config/lib /boot/common/lib /boot/system/lib' + hardcode_into_libs=yes + ;; + +hpux9* | hpux10* | hpux11*) + # Give a soname corresponding to the major version so that dld.sl refuses to + # link against other versions. + version_type=sunos + need_lib_prefix=no + need_version=no + case $host_cpu in + ia64*) + shrext_cmds='.so' + hardcode_into_libs=yes + dynamic_linker="$host_os dld.so" + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + if test "X$HPUX_IA64_MODE" = X32; then + sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib" + else + sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64" + fi + sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec + ;; + hppa*64*) + shrext_cmds='.sl' + hardcode_into_libs=yes + dynamic_linker="$host_os dld.sl" + shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH + shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64" + sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec + ;; + *) + shrext_cmds='.sl' + dynamic_linker="$host_os dld.sl" + shlibpath_var=SHLIB_PATH + shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + ;; + esac + # HP-UX runs *really* slowly unless shared libraries are mode 555, ... + postinstall_cmds='chmod 555 $lib' + # or fails outright, so override atomically: + install_override_mode=555 + ;; + +interix[3-9]*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; + +irix5* | irix6* | nonstopux*) + case $host_os in + nonstopux*) version_type=nonstopux ;; + *) + if test "$lt_cv_prog_gnu_ld" = yes; then + version_type=linux # correct to gnu/linux during the next big refactor + else + version_type=irix + fi ;; + esac + need_lib_prefix=no + need_version=no + soname_spec='${libname}${release}${shared_ext}$major' + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}' + case $host_os in + irix5* | nonstopux*) + libsuff= shlibsuff= + ;; + *) + case $LD in # libtool.m4 will add one of these switches to LD + *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") + libsuff= shlibsuff= libmagic=32-bit;; + *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") + libsuff=32 shlibsuff=N32 libmagic=N32;; + *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") + libsuff=64 shlibsuff=64 libmagic=64-bit;; + *) libsuff= shlibsuff= libmagic=never-match;; + esac + ;; + esac + shlibpath_var=LD_LIBRARY${shlibsuff}_PATH + shlibpath_overrides_runpath=no + sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}" + sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}" + hardcode_into_libs=yes + ;; + +# No shared lib support for Linux oldld, aout, or coff. +linux*oldld* | linux*aout* | linux*coff*) + dynamic_linker=no + ;; + +# This must be glibc/ELF. +linux* | k*bsd*-gnu | kopensolaris*-gnu) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + + # Some binutils ld are patched to set DT_RUNPATH + if ${lt_cv_shlibpath_overrides_runpath+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_shlibpath_overrides_runpath=no + save_LDFLAGS=$LDFLAGS + save_libdir=$libdir + eval "libdir=/foo; wl=\"$lt_prog_compiler_wl\"; \ + LDFLAGS=\"\$LDFLAGS $hardcode_libdir_flag_spec\"" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + if ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir" >/dev/null; then : + lt_cv_shlibpath_overrides_runpath=yes +fi +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + LDFLAGS=$save_LDFLAGS + libdir=$save_libdir + +fi + + shlibpath_overrides_runpath=$lt_cv_shlibpath_overrides_runpath + + # This implies no fast_install, which is unacceptable. + # Some rework will be needed to allow for fast_install + # before this can be enabled. + hardcode_into_libs=yes + + # Append ld.so.conf contents to the search path + if test -f /etc/ld.so.conf; then + lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \$2)); skip = 1; } { if (!skip) print \$0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[ ]*hwcap[ ]/d;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;s/"//g;/^$/d' | tr '\n' ' '` + sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra" + fi + + # We used to test for /lib/ld.so.1 and disable shared libraries on + # powerpc, because MkLinux only supported shared libraries with the + # GNU dynamic linker. Since this was broken with cross compilers, + # most powerpc-linux boxes support dynamic linking these days and + # people can always --disable-shared, the test was removed, and we + # assume the GNU/Linux dynamic linker is in use. + dynamic_linker='GNU/Linux ld.so' + ;; + +netbsdelf*-gnu) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + dynamic_linker='NetBSD ld.elf_so' + ;; + +netbsd*) + version_type=sunos + need_lib_prefix=no + need_version=no + if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' + dynamic_linker='NetBSD (a.out) ld.so' + else + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + dynamic_linker='NetBSD ld.elf_so' + fi + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + +newsos6) + version_type=linux # correct to gnu/linux during the next big refactor + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + ;; + +*nto* | *qnx*) + version_type=qnx + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + dynamic_linker='ldqnx.so' + ;; + +openbsd*) + version_type=sunos + sys_lib_dlsearch_path_spec="/usr/lib" + need_lib_prefix=no + # Some older versions of OpenBSD (3.3 at least) *do* need versioned libs. + case $host_os in + openbsd3.3 | openbsd3.3.*) need_version=yes ;; + *) need_version=no ;; + esac + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' + shlibpath_var=LD_LIBRARY_PATH + if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then + case $host_os in + openbsd2.[89] | openbsd2.[89].*) + shlibpath_overrides_runpath=no + ;; + *) + shlibpath_overrides_runpath=yes + ;; + esac + else + shlibpath_overrides_runpath=yes + fi + ;; + +os2*) + libname_spec='$name' + shrext_cmds=".dll" + need_lib_prefix=no + library_names_spec='$libname${shared_ext} $libname.a' + dynamic_linker='OS/2 ld.exe' + shlibpath_var=LIBPATH + ;; + +osf3* | osf4* | osf5*) + version_type=osf + need_lib_prefix=no + need_version=no + soname_spec='${libname}${release}${shared_ext}$major' + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + shlibpath_var=LD_LIBRARY_PATH + sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib" + sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec" + ;; + +rdos*) + dynamic_linker=no + ;; + +solaris*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + # ldd complains unless libraries are executable + postinstall_cmds='chmod +x $lib' + ;; + +sunos4*) + version_type=sunos + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' + finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + if test "$with_gnu_ld" = yes; then + need_lib_prefix=no + fi + need_version=yes + ;; + +sysv4 | sysv4.3*) + version_type=linux # correct to gnu/linux during the next big refactor + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + case $host_vendor in + sni) + shlibpath_overrides_runpath=no + need_lib_prefix=no + runpath_var=LD_RUN_PATH + ;; + siemens) + need_lib_prefix=no + ;; + motorola) + need_lib_prefix=no + need_version=no + shlibpath_overrides_runpath=no + sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib' + ;; + esac + ;; + +sysv4*MP*) + if test -d /usr/nec ;then + version_type=linux # correct to gnu/linux during the next big refactor + library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}' + soname_spec='$libname${shared_ext}.$major' + shlibpath_var=LD_LIBRARY_PATH + fi + ;; + +sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) + version_type=freebsd-elf + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + if test "$with_gnu_ld" = yes; then + sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib' + else + sys_lib_search_path_spec='/usr/ccs/lib /usr/lib' + case $host_os in + sco3.2v5*) + sys_lib_search_path_spec="$sys_lib_search_path_spec /lib" + ;; + esac + fi + sys_lib_dlsearch_path_spec='/usr/lib' + ;; + +tpf*) + # TPF is a cross-target only. Preferred cross-host = GNU/Linux. + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; + +uts4*) + version_type=linux # correct to gnu/linux during the next big refactor + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + ;; + +*) + dynamic_linker=no + ;; +esac +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $dynamic_linker" >&5 +$as_echo "$dynamic_linker" >&6; } +test "$dynamic_linker" = no && can_build_shared=no + +variables_saved_for_relink="PATH $shlibpath_var $runpath_var" +if test "$GCC" = yes; then + variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" +fi + +if test "${lt_cv_sys_lib_search_path_spec+set}" = set; then + sys_lib_search_path_spec="$lt_cv_sys_lib_search_path_spec" +fi +if test "${lt_cv_sys_lib_dlsearch_path_spec+set}" = set; then + sys_lib_dlsearch_path_spec="$lt_cv_sys_lib_dlsearch_path_spec" +fi + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to hardcode library paths into programs" >&5 +$as_echo_n "checking how to hardcode library paths into programs... " >&6; } +hardcode_action= +if test -n "$hardcode_libdir_flag_spec" || + test -n "$runpath_var" || + test "X$hardcode_automatic" = "Xyes" ; then + + # We can hardcode non-existent directories. + if test "$hardcode_direct" != no && + # If the only mechanism to avoid hardcoding is shlibpath_var, we + # have to relink, otherwise we might link with an installed library + # when we should be linking with a yet-to-be-installed one + ## test "$_LT_TAGVAR(hardcode_shlibpath_var, )" != no && + test "$hardcode_minus_L" != no; then + # Linking always hardcodes the temporary library directory. + hardcode_action=relink + else + # We can link without hardcoding, and we can hardcode nonexisting dirs. + hardcode_action=immediate + fi +else + # We cannot hardcode anything, or else we can only hardcode existing + # directories. + hardcode_action=unsupported +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $hardcode_action" >&5 +$as_echo "$hardcode_action" >&6; } + +if test "$hardcode_action" = relink || + test "$inherit_rpath" = yes; then + # Fast installation is not supported + enable_fast_install=no +elif test "$shlibpath_overrides_runpath" = yes || + test "$enable_shared" = no; then + # Fast installation is not necessary + enable_fast_install=needless +fi + + + + + + + if test "x$enable_dlopen" != xyes; then + enable_dlopen=unknown + enable_dlopen_self=unknown + enable_dlopen_self_static=unknown +else + lt_cv_dlopen=no + lt_cv_dlopen_libs= + + case $host_os in + beos*) + lt_cv_dlopen="load_add_on" + lt_cv_dlopen_libs= + lt_cv_dlopen_self=yes + ;; + + mingw* | pw32* | cegcc*) + lt_cv_dlopen="LoadLibrary" + lt_cv_dlopen_libs= + ;; + + cygwin*) + lt_cv_dlopen="dlopen" + lt_cv_dlopen_libs= + ;; + + darwin*) + # if libdl is installed we need to link against it + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5 +$as_echo_n "checking for dlopen in -ldl... " >&6; } +if ${ac_cv_lib_dl_dlopen+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-ldl $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char dlopen (); +int +main () +{ +return dlopen (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_dl_dlopen=yes +else + ac_cv_lib_dl_dlopen=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5 +$as_echo "$ac_cv_lib_dl_dlopen" >&6; } +if test "x$ac_cv_lib_dl_dlopen" = xyes; then : + lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl" +else + + lt_cv_dlopen="dyld" + lt_cv_dlopen_libs= + lt_cv_dlopen_self=yes + +fi + + ;; + + *) + ac_fn_c_check_func "$LINENO" "shl_load" "ac_cv_func_shl_load" +if test "x$ac_cv_func_shl_load" = xyes; then : + lt_cv_dlopen="shl_load" +else + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for shl_load in -ldld" >&5 +$as_echo_n "checking for shl_load in -ldld... " >&6; } +if ${ac_cv_lib_dld_shl_load+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-ldld $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char shl_load (); +int +main () +{ +return shl_load (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_dld_shl_load=yes +else + ac_cv_lib_dld_shl_load=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dld_shl_load" >&5 +$as_echo "$ac_cv_lib_dld_shl_load" >&6; } +if test "x$ac_cv_lib_dld_shl_load" = xyes; then : + lt_cv_dlopen="shl_load" lt_cv_dlopen_libs="-ldld" +else + ac_fn_c_check_func "$LINENO" "dlopen" "ac_cv_func_dlopen" +if test "x$ac_cv_func_dlopen" = xyes; then : + lt_cv_dlopen="dlopen" +else + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5 +$as_echo_n "checking for dlopen in -ldl... " >&6; } +if ${ac_cv_lib_dl_dlopen+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-ldl $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char dlopen (); +int +main () +{ +return dlopen (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_dl_dlopen=yes +else + ac_cv_lib_dl_dlopen=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5 +$as_echo "$ac_cv_lib_dl_dlopen" >&6; } +if test "x$ac_cv_lib_dl_dlopen" = xyes; then : + lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl" +else + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -lsvld" >&5 +$as_echo_n "checking for dlopen in -lsvld... " >&6; } +if ${ac_cv_lib_svld_dlopen+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lsvld $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char dlopen (); +int +main () +{ +return dlopen (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_svld_dlopen=yes +else + ac_cv_lib_svld_dlopen=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_svld_dlopen" >&5 +$as_echo "$ac_cv_lib_svld_dlopen" >&6; } +if test "x$ac_cv_lib_svld_dlopen" = xyes; then : + lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-lsvld" +else + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dld_link in -ldld" >&5 +$as_echo_n "checking for dld_link in -ldld... " >&6; } +if ${ac_cv_lib_dld_dld_link+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-ldld $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char dld_link (); +int +main () +{ +return dld_link (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_dld_dld_link=yes +else + ac_cv_lib_dld_dld_link=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dld_dld_link" >&5 +$as_echo "$ac_cv_lib_dld_dld_link" >&6; } +if test "x$ac_cv_lib_dld_dld_link" = xyes; then : + lt_cv_dlopen="dld_link" lt_cv_dlopen_libs="-ldld" +fi + + +fi + + +fi + + +fi + + +fi + + +fi + + ;; + esac + + if test "x$lt_cv_dlopen" != xno; then + enable_dlopen=yes + else + enable_dlopen=no + fi + + case $lt_cv_dlopen in + dlopen) + save_CPPFLAGS="$CPPFLAGS" + test "x$ac_cv_header_dlfcn_h" = xyes && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H" + + save_LDFLAGS="$LDFLAGS" + wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\" + + save_LIBS="$LIBS" + LIBS="$lt_cv_dlopen_libs $LIBS" + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether a program can dlopen itself" >&5 +$as_echo_n "checking whether a program can dlopen itself... " >&6; } +if ${lt_cv_dlopen_self+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test "$cross_compiling" = yes; then : + lt_cv_dlopen_self=cross +else + lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 + lt_status=$lt_dlunknown + cat > conftest.$ac_ext <<_LT_EOF +#line $LINENO "configure" +#include "confdefs.h" + +#if HAVE_DLFCN_H +#include +#endif + +#include + +#ifdef RTLD_GLOBAL +# define LT_DLGLOBAL RTLD_GLOBAL +#else +# ifdef DL_GLOBAL +# define LT_DLGLOBAL DL_GLOBAL +# else +# define LT_DLGLOBAL 0 +# endif +#endif + +/* We may have to define LT_DLLAZY_OR_NOW in the command line if we + find out it does not work in some platform. */ +#ifndef LT_DLLAZY_OR_NOW +# ifdef RTLD_LAZY +# define LT_DLLAZY_OR_NOW RTLD_LAZY +# else +# ifdef DL_LAZY +# define LT_DLLAZY_OR_NOW DL_LAZY +# else +# ifdef RTLD_NOW +# define LT_DLLAZY_OR_NOW RTLD_NOW +# else +# ifdef DL_NOW +# define LT_DLLAZY_OR_NOW DL_NOW +# else +# define LT_DLLAZY_OR_NOW 0 +# endif +# endif +# endif +# endif +#endif + +/* When -fvisbility=hidden is used, assume the code has been annotated + correspondingly for the symbols needed. */ +#if defined(__GNUC__) && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3)) +int fnord () __attribute__((visibility("default"))); +#endif + +int fnord () { return 42; } +int main () +{ + void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); + int status = $lt_dlunknown; + + if (self) + { + if (dlsym (self,"fnord")) status = $lt_dlno_uscore; + else + { + if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; + else puts (dlerror ()); + } + /* dlclose (self); */ + } + else + puts (dlerror ()); + + return status; +} +_LT_EOF + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5 + (eval $ac_link) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && test -s conftest${ac_exeext} 2>/dev/null; then + (./conftest; exit; ) >&5 2>/dev/null + lt_status=$? + case x$lt_status in + x$lt_dlno_uscore) lt_cv_dlopen_self=yes ;; + x$lt_dlneed_uscore) lt_cv_dlopen_self=yes ;; + x$lt_dlunknown|x*) lt_cv_dlopen_self=no ;; + esac + else : + # compilation failed + lt_cv_dlopen_self=no + fi +fi +rm -fr conftest* + + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_dlopen_self" >&5 +$as_echo "$lt_cv_dlopen_self" >&6; } + + if test "x$lt_cv_dlopen_self" = xyes; then + wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $lt_prog_compiler_static\" + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether a statically linked program can dlopen itself" >&5 +$as_echo_n "checking whether a statically linked program can dlopen itself... " >&6; } +if ${lt_cv_dlopen_self_static+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test "$cross_compiling" = yes; then : + lt_cv_dlopen_self_static=cross +else + lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 + lt_status=$lt_dlunknown + cat > conftest.$ac_ext <<_LT_EOF +#line $LINENO "configure" +#include "confdefs.h" + +#if HAVE_DLFCN_H +#include +#endif + +#include + +#ifdef RTLD_GLOBAL +# define LT_DLGLOBAL RTLD_GLOBAL +#else +# ifdef DL_GLOBAL +# define LT_DLGLOBAL DL_GLOBAL +# else +# define LT_DLGLOBAL 0 +# endif +#endif + +/* We may have to define LT_DLLAZY_OR_NOW in the command line if we + find out it does not work in some platform. */ +#ifndef LT_DLLAZY_OR_NOW +# ifdef RTLD_LAZY +# define LT_DLLAZY_OR_NOW RTLD_LAZY +# else +# ifdef DL_LAZY +# define LT_DLLAZY_OR_NOW DL_LAZY +# else +# ifdef RTLD_NOW +# define LT_DLLAZY_OR_NOW RTLD_NOW +# else +# ifdef DL_NOW +# define LT_DLLAZY_OR_NOW DL_NOW +# else +# define LT_DLLAZY_OR_NOW 0 +# endif +# endif +# endif +# endif +#endif + +/* When -fvisbility=hidden is used, assume the code has been annotated + correspondingly for the symbols needed. */ +#if defined(__GNUC__) && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3)) +int fnord () __attribute__((visibility("default"))); +#endif + +int fnord () { return 42; } +int main () +{ + void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); + int status = $lt_dlunknown; + + if (self) + { + if (dlsym (self,"fnord")) status = $lt_dlno_uscore; + else + { + if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; + else puts (dlerror ()); + } + /* dlclose (self); */ + } + else + puts (dlerror ()); + + return status; +} +_LT_EOF + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5 + (eval $ac_link) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && test -s conftest${ac_exeext} 2>/dev/null; then + (./conftest; exit; ) >&5 2>/dev/null + lt_status=$? + case x$lt_status in + x$lt_dlno_uscore) lt_cv_dlopen_self_static=yes ;; + x$lt_dlneed_uscore) lt_cv_dlopen_self_static=yes ;; + x$lt_dlunknown|x*) lt_cv_dlopen_self_static=no ;; + esac + else : + # compilation failed + lt_cv_dlopen_self_static=no + fi +fi +rm -fr conftest* + + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_dlopen_self_static" >&5 +$as_echo "$lt_cv_dlopen_self_static" >&6; } + fi + + CPPFLAGS="$save_CPPFLAGS" + LDFLAGS="$save_LDFLAGS" + LIBS="$save_LIBS" + ;; + esac + + case $lt_cv_dlopen_self in + yes|no) enable_dlopen_self=$lt_cv_dlopen_self ;; + *) enable_dlopen_self=unknown ;; + esac + + case $lt_cv_dlopen_self_static in + yes|no) enable_dlopen_self_static=$lt_cv_dlopen_self_static ;; + *) enable_dlopen_self_static=unknown ;; + esac +fi + + + + + + + + + + + + + + + + + +striplib= +old_striplib= +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether stripping libraries is possible" >&5 +$as_echo_n "checking whether stripping libraries is possible... " >&6; } +if test -n "$STRIP" && $STRIP -V 2>&1 | $GREP "GNU strip" >/dev/null; then + test -z "$old_striplib" && old_striplib="$STRIP --strip-debug" + test -z "$striplib" && striplib="$STRIP --strip-unneeded" + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } +else +# FIXME - insert some real tests, host_os isn't really good enough + case $host_os in + darwin*) + if test -n "$STRIP" ; then + striplib="$STRIP -x" + old_striplib="$STRIP -S" + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + fi + ;; + *) + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + ;; + esac +fi + + + + + + + + + + + + + # Report which library types will actually be built + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if libtool supports shared libraries" >&5 +$as_echo_n "checking if libtool supports shared libraries... " >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $can_build_shared" >&5 +$as_echo "$can_build_shared" >&6; } + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build shared libraries" >&5 +$as_echo_n "checking whether to build shared libraries... " >&6; } + test "$can_build_shared" = "no" && enable_shared=no + + # On AIX, shared libraries and static libraries use the same namespace, and + # are all built from PIC. + case $host_os in + aix3*) + test "$enable_shared" = yes && enable_static=no + if test -n "$RANLIB"; then + archive_cmds="$archive_cmds~\$RANLIB \$lib" + postinstall_cmds='$RANLIB $lib' + fi + ;; + + aix[4-9]*) + if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then + test "$enable_shared" = yes && enable_static=no + fi + ;; + esac + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_shared" >&5 +$as_echo "$enable_shared" >&6; } + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build static libraries" >&5 +$as_echo_n "checking whether to build static libraries... " >&6; } + # Make sure either enable_shared or enable_static is yes. + test "$enable_shared" = yes || enable_static=yes + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_static" >&5 +$as_echo "$enable_static" >&6; } + + + + +fi +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + +CC="$lt_save_CC" + + if test -n "$CXX" && ( test "X$CXX" != "Xno" && + ( (test "X$CXX" = "Xg++" && `g++ -v >/dev/null 2>&1` ) || + (test "X$CXX" != "Xg++"))) ; then + ac_ext=cpp +ac_cpp='$CXXCPP $CPPFLAGS' +ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_cxx_compiler_gnu +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C++ preprocessor" >&5 +$as_echo_n "checking how to run the C++ preprocessor... " >&6; } +if test -z "$CXXCPP"; then + if ${ac_cv_prog_CXXCPP+:} false; then : + $as_echo_n "(cached) " >&6 +else + # Double quotes because CXXCPP needs to be expanded + for CXXCPP in "$CXX -E" "/lib/cpp" + do + ac_preproc_ok=false +for ac_cxx_preproc_warn_flag in '' yes +do + # Use a header file that comes with gcc, so configuring glibc + # with a fresh cross-compiler works. + # Prefer to if __STDC__ is defined, since + # exists even on freestanding compilers. + # On the NeXT, cc -E runs the code through the compiler's parser, + # not just through cpp. "Syntax error" is here to catch this case. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#ifdef __STDC__ +# include +#else +# include +#endif + Syntax error +_ACEOF +if ac_fn_cxx_try_cpp "$LINENO"; then : + +else + # Broken: fails on valid input. +continue +fi +rm -f conftest.err conftest.i conftest.$ac_ext + + # OK, works on sane cases. Now check whether nonexistent headers + # can be detected and how. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +_ACEOF +if ac_fn_cxx_try_cpp "$LINENO"; then : + # Broken: success on invalid input. +continue +else + # Passes both tests. +ac_preproc_ok=: +break +fi +rm -f conftest.err conftest.i conftest.$ac_ext + +done +# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. +rm -f conftest.i conftest.err conftest.$ac_ext +if $ac_preproc_ok; then : + break +fi + + done + ac_cv_prog_CXXCPP=$CXXCPP + +fi + CXXCPP=$ac_cv_prog_CXXCPP +else + ac_cv_prog_CXXCPP=$CXXCPP +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $CXXCPP" >&5 +$as_echo "$CXXCPP" >&6; } +ac_preproc_ok=false +for ac_cxx_preproc_warn_flag in '' yes +do + # Use a header file that comes with gcc, so configuring glibc + # with a fresh cross-compiler works. + # Prefer to if __STDC__ is defined, since + # exists even on freestanding compilers. + # On the NeXT, cc -E runs the code through the compiler's parser, + # not just through cpp. "Syntax error" is here to catch this case. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#ifdef __STDC__ +# include +#else +# include +#endif + Syntax error +_ACEOF +if ac_fn_cxx_try_cpp "$LINENO"; then : + +else + # Broken: fails on valid input. +continue +fi +rm -f conftest.err conftest.i conftest.$ac_ext + + # OK, works on sane cases. Now check whether nonexistent headers + # can be detected and how. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +_ACEOF +if ac_fn_cxx_try_cpp "$LINENO"; then : + # Broken: success on invalid input. +continue +else + # Passes both tests. +ac_preproc_ok=: +break +fi +rm -f conftest.err conftest.i conftest.$ac_ext + +done +# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. +rm -f conftest.i conftest.err conftest.$ac_ext +if $ac_preproc_ok; then : + +else + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "C++ preprocessor \"$CXXCPP\" fails sanity check +See \`config.log' for more details" "$LINENO" 5; } +fi + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + +else + _lt_caught_CXX_error=yes +fi + +ac_ext=cpp +ac_cpp='$CXXCPP $CPPFLAGS' +ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_cxx_compiler_gnu + +archive_cmds_need_lc_CXX=no +allow_undefined_flag_CXX= +always_export_symbols_CXX=no +archive_expsym_cmds_CXX= +compiler_needs_object_CXX=no +export_dynamic_flag_spec_CXX= +hardcode_direct_CXX=no +hardcode_direct_absolute_CXX=no +hardcode_libdir_flag_spec_CXX= +hardcode_libdir_separator_CXX= +hardcode_minus_L_CXX=no +hardcode_shlibpath_var_CXX=unsupported +hardcode_automatic_CXX=no +inherit_rpath_CXX=no +module_cmds_CXX= +module_expsym_cmds_CXX= +link_all_deplibs_CXX=unknown +old_archive_cmds_CXX=$old_archive_cmds +reload_flag_CXX=$reload_flag +reload_cmds_CXX=$reload_cmds +no_undefined_flag_CXX= +whole_archive_flag_spec_CXX= +enable_shared_with_static_runtimes_CXX=no + +# Source file extension for C++ test sources. +ac_ext=cpp + +# Object file extension for compiled C++ test sources. +objext=o +objext_CXX=$objext + +# No sense in running all these tests if we already determined that +# the CXX compiler isn't working. Some variables (like enable_shared) +# are currently assumed to apply to all compilers on this platform, +# and will be corrupted by setting them based on a non-working compiler. +if test "$_lt_caught_CXX_error" != yes; then + # Code to be used in simple compile tests + lt_simple_compile_test_code="int some_variable = 0;" + + # Code to be used in simple link tests + lt_simple_link_test_code='int main(int, char *[]) { return(0); }' + + # ltmain only uses $CC for tagged configurations so make sure $CC is set. + + + + + + +# If no C compiler was specified, use CC. +LTCC=${LTCC-"$CC"} + +# If no C compiler flags were specified, use CFLAGS. +LTCFLAGS=${LTCFLAGS-"$CFLAGS"} + +# Allow CC to be a program name with arguments. +compiler=$CC + + + # save warnings/boilerplate of simple test code + ac_outfile=conftest.$ac_objext +echo "$lt_simple_compile_test_code" >conftest.$ac_ext +eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err +_lt_compiler_boilerplate=`cat conftest.err` +$RM conftest* + + ac_outfile=conftest.$ac_objext +echo "$lt_simple_link_test_code" >conftest.$ac_ext +eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err +_lt_linker_boilerplate=`cat conftest.err` +$RM -r conftest* + + + # Allow CC to be a program name with arguments. + lt_save_CC=$CC + lt_save_CFLAGS=$CFLAGS + lt_save_LD=$LD + lt_save_GCC=$GCC + GCC=$GXX + lt_save_with_gnu_ld=$with_gnu_ld + lt_save_path_LD=$lt_cv_path_LD + if test -n "${lt_cv_prog_gnu_ldcxx+set}"; then + lt_cv_prog_gnu_ld=$lt_cv_prog_gnu_ldcxx + else + $as_unset lt_cv_prog_gnu_ld + fi + if test -n "${lt_cv_path_LDCXX+set}"; then + lt_cv_path_LD=$lt_cv_path_LDCXX + else + $as_unset lt_cv_path_LD + fi + test -z "${LDCXX+set}" || LD=$LDCXX + CC=${CXX-"c++"} + CFLAGS=$CXXFLAGS + compiler=$CC + compiler_CXX=$CC + for cc_temp in $compiler""; do + case $cc_temp in + compile | *[\\/]compile | ccache | *[\\/]ccache ) ;; + distcc | *[\\/]distcc | purify | *[\\/]purify ) ;; + \-*) ;; + *) break;; + esac +done +cc_basename=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"` + + + if test -n "$compiler"; then + # We don't want -fno-exception when compiling C++ code, so set the + # no_builtin_flag separately + if test "$GXX" = yes; then + lt_prog_compiler_no_builtin_flag_CXX=' -fno-builtin' + else + lt_prog_compiler_no_builtin_flag_CXX= + fi + + if test "$GXX" = yes; then + # Set up default GNU C++ configuration + + + +# Check whether --with-gnu-ld was given. +if test "${with_gnu_ld+set}" = set; then : + withval=$with_gnu_ld; test "$withval" = no || with_gnu_ld=yes +else + with_gnu_ld=no +fi + +ac_prog=ld +if test "$GCC" = yes; then + # Check if gcc -print-prog-name=ld gives a path. + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ld used by $CC" >&5 +$as_echo_n "checking for ld used by $CC... " >&6; } + case $host in + *-*-mingw*) + # gcc leaves a trailing carriage return which upsets mingw + ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;; + *) + ac_prog=`($CC -print-prog-name=ld) 2>&5` ;; + esac + case $ac_prog in + # Accept absolute paths. + [\\/]* | ?:[\\/]*) + re_direlt='/[^/][^/]*/\.\./' + # Canonicalize the pathname of ld + ac_prog=`$ECHO "$ac_prog"| $SED 's%\\\\%/%g'` + while $ECHO "$ac_prog" | $GREP "$re_direlt" > /dev/null 2>&1; do + ac_prog=`$ECHO $ac_prog| $SED "s%$re_direlt%/%"` + done + test -z "$LD" && LD="$ac_prog" + ;; + "") + # If it fails, then pretend we aren't using GCC. + ac_prog=ld + ;; + *) + # If it is relative, then search for the first ld in PATH. + with_gnu_ld=unknown + ;; + esac +elif test "$with_gnu_ld" = yes; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU ld" >&5 +$as_echo_n "checking for GNU ld... " >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for non-GNU ld" >&5 +$as_echo_n "checking for non-GNU ld... " >&6; } +fi +if ${lt_cv_path_LD+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -z "$LD"; then + lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR + for ac_dir in $PATH; do + IFS="$lt_save_ifs" + test -z "$ac_dir" && ac_dir=. + if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then + lt_cv_path_LD="$ac_dir/$ac_prog" + # Check to see if the program is GNU ld. I'd rather use --version, + # but apparently some variants of GNU ld only accept -v. + # Break only if it was the GNU/non-GNU ld that we prefer. + case `"$lt_cv_path_LD" -v 2>&1 &5 +$as_echo "$LD" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi +test -z "$LD" && as_fn_error $? "no acceptable ld found in \$PATH" "$LINENO" 5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if the linker ($LD) is GNU ld" >&5 +$as_echo_n "checking if the linker ($LD) is GNU ld... " >&6; } +if ${lt_cv_prog_gnu_ld+:} false; then : + $as_echo_n "(cached) " >&6 +else + # I'd rather use --version here, but apparently some GNU lds only accept -v. +case `$LD -v 2>&1 &5 +$as_echo "$lt_cv_prog_gnu_ld" >&6; } +with_gnu_ld=$lt_cv_prog_gnu_ld + + + + + + + + # Check if GNU C++ uses GNU ld as the underlying linker, since the + # archiving commands below assume that GNU ld is being used. + if test "$with_gnu_ld" = yes; then + archive_cmds_CXX='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' + archive_expsym_cmds_CXX='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + + hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir' + export_dynamic_flag_spec_CXX='${wl}--export-dynamic' + + # If archive_cmds runs LD, not CC, wlarc should be empty + # XXX I think wlarc can be eliminated in ltcf-cxx, but I need to + # investigate it a little bit more. (MM) + wlarc='${wl}' + + # ancient GNU ld didn't support --whole-archive et. al. + if eval "`$CC -print-prog-name=ld` --help 2>&1" | + $GREP 'no-whole-archive' > /dev/null; then + whole_archive_flag_spec_CXX="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' + else + whole_archive_flag_spec_CXX= + fi + else + with_gnu_ld=no + wlarc= + + # A generic and very simple default shared library creation + # command for GNU C++ for the case where it uses the native + # linker, instead of GNU ld. If possible, this setting should + # overridden to take advantage of the native linker features on + # the platform it is being used on. + archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib' + fi + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' + + else + GXX=no + with_gnu_ld=no + wlarc= + fi + + # PORTME: fill in a description of your system's C++ link characteristics + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $compiler linker ($LD) supports shared libraries" >&5 +$as_echo_n "checking whether the $compiler linker ($LD) supports shared libraries... " >&6; } + ld_shlibs_CXX=yes + case $host_os in + aix3*) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + aix[4-9]*) + if test "$host_cpu" = ia64; then + # On IA64, the linker does run time linking by default, so we don't + # have to do anything special. + aix_use_runtimelinking=no + exp_sym_flag='-Bexport' + no_entry_flag="" + else + aix_use_runtimelinking=no + + # Test if we are trying to use run time linking or normal + # AIX style linking. If -brtl is somewhere in LDFLAGS, we + # need to do runtime linking. + case $host_os in aix4.[23]|aix4.[23].*|aix[5-9]*) + for ld_flag in $LDFLAGS; do + case $ld_flag in + *-brtl*) + aix_use_runtimelinking=yes + break + ;; + esac + done + ;; + esac + + exp_sym_flag='-bexport' + no_entry_flag='-bnoentry' + fi + + # When large executables or shared objects are built, AIX ld can + # have problems creating the table of contents. If linking a library + # or program results in "error TOC overflow" add -mminimal-toc to + # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not + # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. + + archive_cmds_CXX='' + hardcode_direct_CXX=yes + hardcode_direct_absolute_CXX=yes + hardcode_libdir_separator_CXX=':' + link_all_deplibs_CXX=yes + file_list_spec_CXX='${wl}-f,' + + if test "$GXX" = yes; then + case $host_os in aix4.[012]|aix4.[012].*) + # We only want to do this on AIX 4.2 and lower, the check + # below for broken collect2 doesn't work under 4.3+ + collect2name=`${CC} -print-prog-name=collect2` + if test -f "$collect2name" && + strings "$collect2name" | $GREP resolve_lib_name >/dev/null + then + # We have reworked collect2 + : + else + # We have old collect2 + hardcode_direct_CXX=unsupported + # It fails to find uninstalled libraries when the uninstalled + # path is not listed in the libpath. Setting hardcode_minus_L + # to unsupported forces relinking + hardcode_minus_L_CXX=yes + hardcode_libdir_flag_spec_CXX='-L$libdir' + hardcode_libdir_separator_CXX= + fi + esac + shared_flag='-shared' + if test "$aix_use_runtimelinking" = yes; then + shared_flag="$shared_flag "'${wl}-G' + fi + else + # not using gcc + if test "$host_cpu" = ia64; then + # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release + # chokes on -Wl,-G. The following line is correct: + shared_flag='-G' + else + if test "$aix_use_runtimelinking" = yes; then + shared_flag='${wl}-G' + else + shared_flag='${wl}-bM:SRE' + fi + fi + fi + + export_dynamic_flag_spec_CXX='${wl}-bexpall' + # It seems that -bexpall does not export symbols beginning with + # underscore (_), so it is better to generate a list of symbols to + # export. + always_export_symbols_CXX=yes + if test "$aix_use_runtimelinking" = yes; then + # Warning - without using the other runtime loading flags (-brtl), + # -berok will link without error, but may produce a broken library. + allow_undefined_flag_CXX='-berok' + # Determine the default libpath from the value encoded in an empty + # executable. + if test "${lt_cv_aix_libpath+set}" = set; then + aix_libpath=$lt_cv_aix_libpath +else + if ${lt_cv_aix_libpath__CXX+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_cxx_try_link "$LINENO"; then : + + lt_aix_libpath_sed=' + /Import File Strings/,/^$/ { + /^0/ { + s/^0 *\([^ ]*\) *$/\1/ + p + } + }' + lt_cv_aix_libpath__CXX=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` + # Check for a 64-bit object if we didn't find anything. + if test -z "$lt_cv_aix_libpath__CXX"; then + lt_cv_aix_libpath__CXX=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` + fi +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + if test -z "$lt_cv_aix_libpath__CXX"; then + lt_cv_aix_libpath__CXX="/usr/lib:/lib" + fi + +fi + + aix_libpath=$lt_cv_aix_libpath__CXX +fi + + hardcode_libdir_flag_spec_CXX='${wl}-blibpath:$libdir:'"$aix_libpath" + + archive_expsym_cmds_CXX='$CC -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then func_echo_all "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag" + else + if test "$host_cpu" = ia64; then + hardcode_libdir_flag_spec_CXX='${wl}-R $libdir:/usr/lib:/lib' + allow_undefined_flag_CXX="-z nodefs" + archive_expsym_cmds_CXX="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols" + else + # Determine the default libpath from the value encoded in an + # empty executable. + if test "${lt_cv_aix_libpath+set}" = set; then + aix_libpath=$lt_cv_aix_libpath +else + if ${lt_cv_aix_libpath__CXX+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_cxx_try_link "$LINENO"; then : + + lt_aix_libpath_sed=' + /Import File Strings/,/^$/ { + /^0/ { + s/^0 *\([^ ]*\) *$/\1/ + p + } + }' + lt_cv_aix_libpath__CXX=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` + # Check for a 64-bit object if we didn't find anything. + if test -z "$lt_cv_aix_libpath__CXX"; then + lt_cv_aix_libpath__CXX=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` + fi +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + if test -z "$lt_cv_aix_libpath__CXX"; then + lt_cv_aix_libpath__CXX="/usr/lib:/lib" + fi + +fi + + aix_libpath=$lt_cv_aix_libpath__CXX +fi + + hardcode_libdir_flag_spec_CXX='${wl}-blibpath:$libdir:'"$aix_libpath" + # Warning - without using the other run time loading flags, + # -berok will link without error, but may produce a broken library. + no_undefined_flag_CXX=' ${wl}-bernotok' + allow_undefined_flag_CXX=' ${wl}-berok' + if test "$with_gnu_ld" = yes; then + # We only use this code for GNU lds that support --whole-archive. + whole_archive_flag_spec_CXX='${wl}--whole-archive$convenience ${wl}--no-whole-archive' + else + # Exported symbols can be pulled into shared objects from archives + whole_archive_flag_spec_CXX='$convenience' + fi + archive_cmds_need_lc_CXX=yes + # This is similar to how AIX traditionally builds its shared + # libraries. + archive_expsym_cmds_CXX="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' + fi + fi + ;; + + beos*) + if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then + allow_undefined_flag_CXX=unsupported + # Joseph Beckenbach says some releases of gcc + # support --undefined. This deserves some investigation. FIXME + archive_cmds_CXX='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + else + ld_shlibs_CXX=no + fi + ;; + + chorus*) + case $cc_basename in + *) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + esac + ;; + + cygwin* | mingw* | pw32* | cegcc*) + case $GXX,$cc_basename in + ,cl* | no,cl*) + # Native MSVC + # hardcode_libdir_flag_spec is actually meaningless, as there is + # no search path for DLLs. + hardcode_libdir_flag_spec_CXX=' ' + allow_undefined_flag_CXX=unsupported + always_export_symbols_CXX=yes + file_list_spec_CXX='@' + # Tell ltmain to make .lib files, not .a files. + libext=lib + # Tell ltmain to make .dll files, not .so files. + shrext_cmds=".dll" + # FIXME: Setting linknames here is a bad hack. + archive_cmds_CXX='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-dll~linknames=' + archive_expsym_cmds_CXX='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then + $SED -n -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' -e '1\\\!p' < $export_symbols > $output_objdir/$soname.exp; + else + $SED -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' < $export_symbols > $output_objdir/$soname.exp; + fi~ + $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~ + linknames=' + # The linker will not automatically build a static lib if we build a DLL. + # _LT_TAGVAR(old_archive_from_new_cmds, CXX)='true' + enable_shared_with_static_runtimes_CXX=yes + # Don't use ranlib + old_postinstall_cmds_CXX='chmod 644 $oldlib' + postlink_cmds_CXX='lt_outputfile="@OUTPUT@"~ + lt_tool_outputfile="@TOOL_OUTPUT@"~ + case $lt_outputfile in + *.exe|*.EXE) ;; + *) + lt_outputfile="$lt_outputfile.exe" + lt_tool_outputfile="$lt_tool_outputfile.exe" + ;; + esac~ + func_to_tool_file "$lt_outputfile"~ + if test "$MANIFEST_TOOL" != ":" && test -f "$lt_outputfile.manifest"; then + $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1; + $RM "$lt_outputfile.manifest"; + fi' + ;; + *) + # g++ + # _LT_TAGVAR(hardcode_libdir_flag_spec, CXX) is actually meaningless, + # as there is no search path for DLLs. + hardcode_libdir_flag_spec_CXX='-L$libdir' + export_dynamic_flag_spec_CXX='${wl}--export-all-symbols' + allow_undefined_flag_CXX=unsupported + always_export_symbols_CXX=no + enable_shared_with_static_runtimes_CXX=yes + + if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then + archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' + # If the export-symbols file already is a .def file (1st line + # is EXPORTS), use it as is; otherwise, prepend... + archive_expsym_cmds_CXX='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then + cp $export_symbols $output_objdir/$soname.def; + else + echo EXPORTS > $output_objdir/$soname.def; + cat $export_symbols >> $output_objdir/$soname.def; + fi~ + $CC -shared -nostdlib $output_objdir/$soname.def $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' + else + ld_shlibs_CXX=no + fi + ;; + esac + ;; + darwin* | rhapsody*) + + + archive_cmds_need_lc_CXX=no + hardcode_direct_CXX=no + hardcode_automatic_CXX=yes + hardcode_shlibpath_var_CXX=unsupported + if test "$lt_cv_ld_force_load" = "yes"; then + whole_archive_flag_spec_CXX='`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience ${wl}-force_load,$conv\"; done; func_echo_all \"$new_convenience\"`' + + else + whole_archive_flag_spec_CXX='' + fi + link_all_deplibs_CXX=yes + allow_undefined_flag_CXX="$_lt_dar_allow_undefined" + case $cc_basename in + ifort*) _lt_dar_can_shared=yes ;; + *) _lt_dar_can_shared=$GCC ;; + esac + if test "$_lt_dar_can_shared" = "yes"; then + output_verbose_link_cmd=func_echo_all + archive_cmds_CXX="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod${_lt_dsymutil}" + module_cmds_CXX="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dsymutil}" + archive_expsym_cmds_CXX="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring ${_lt_dar_single_mod}${_lt_dar_export_syms}${_lt_dsymutil}" + module_expsym_cmds_CXX="sed -e 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dar_export_syms}${_lt_dsymutil}" + if test "$lt_cv_apple_cc_single_mod" != "yes"; then + archive_cmds_CXX="\$CC -r -keep_private_externs -nostdlib -o \${lib}-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \${lib}-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring${_lt_dsymutil}" + archive_expsym_cmds_CXX="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -r -keep_private_externs -nostdlib -o \${lib}-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \${lib}-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring${_lt_dar_export_syms}${_lt_dsymutil}" + fi + + else + ld_shlibs_CXX=no + fi + + ;; + + dgux*) + case $cc_basename in + ec++*) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + ghcx*) + # Green Hills C++ Compiler + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + *) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + esac + ;; + + freebsd2.*) + # C++ shared libraries reported to be fairly broken before + # switch to ELF + ld_shlibs_CXX=no + ;; + + freebsd-elf*) + archive_cmds_need_lc_CXX=no + ;; + + freebsd* | dragonfly*) + # FreeBSD 3 and later use GNU C++ and GNU ld with standard ELF + # conventions + ld_shlibs_CXX=yes + ;; + + gnu*) + ;; + + haiku*) + archive_cmds_CXX='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + link_all_deplibs_CXX=yes + ;; + + hpux9*) + hardcode_libdir_flag_spec_CXX='${wl}+b ${wl}$libdir' + hardcode_libdir_separator_CXX=: + export_dynamic_flag_spec_CXX='${wl}-E' + hardcode_direct_CXX=yes + hardcode_minus_L_CXX=yes # Not in the search PATH, + # but as the default + # location of the library. + + case $cc_basename in + CC*) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + aCC*) + archive_cmds_CXX='$RM $output_objdir/$soname~$CC -b ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $EGREP "\-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' + ;; + *) + if test "$GXX" = yes; then + archive_cmds_CXX='$RM $output_objdir/$soname~$CC -shared -nostdlib $pic_flag ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' + else + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + fi + ;; + esac + ;; + + hpux10*|hpux11*) + if test $with_gnu_ld = no; then + hardcode_libdir_flag_spec_CXX='${wl}+b ${wl}$libdir' + hardcode_libdir_separator_CXX=: + + case $host_cpu in + hppa*64*|ia64*) + ;; + *) + export_dynamic_flag_spec_CXX='${wl}-E' + ;; + esac + fi + case $host_cpu in + hppa*64*|ia64*) + hardcode_direct_CXX=no + hardcode_shlibpath_var_CXX=no + ;; + *) + hardcode_direct_CXX=yes + hardcode_direct_absolute_CXX=yes + hardcode_minus_L_CXX=yes # Not in the search PATH, + # but as the default + # location of the library. + ;; + esac + + case $cc_basename in + CC*) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + aCC*) + case $host_cpu in + hppa*64*) + archive_cmds_CXX='$CC -b ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + ia64*) + archive_cmds_CXX='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + *) + archive_cmds_CXX='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + esac + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $GREP "\-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' + ;; + *) + if test "$GXX" = yes; then + if test $with_gnu_ld = no; then + case $host_cpu in + hppa*64*) + archive_cmds_CXX='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + ia64*) + archive_cmds_CXX='$CC -shared -nostdlib $pic_flag ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + *) + archive_cmds_CXX='$CC -shared -nostdlib $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + esac + fi + else + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + fi + ;; + esac + ;; + + interix[3-9]*) + hardcode_direct_CXX=no + hardcode_shlibpath_var_CXX=no + hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir' + export_dynamic_flag_spec_CXX='${wl}-E' + # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. + # Instead, shared libraries are loaded at an image base (0x10000000 by + # default) and relocated if they conflict, which is a slow very memory + # consuming and fragmenting process. To avoid this, we pick a random, + # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link + # time. Moving up from 0x10000000 also allows more sbrk(2) space. + archive_cmds_CXX='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' + archive_expsym_cmds_CXX='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' + ;; + irix5* | irix6*) + case $cc_basename in + CC*) + # SGI C++ + archive_cmds_CXX='$CC -shared -all -multigot $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' + + # Archives containing C++ object files must be created using + # "CC -ar", where "CC" is the IRIX C++ compiler. This is + # necessary to make sure instantiated templates are included + # in the archive. + old_archive_cmds_CXX='$CC -ar -WR,-u -o $oldlib $oldobjs' + ;; + *) + if test "$GXX" = yes; then + if test "$with_gnu_ld" = no; then + archive_cmds_CXX='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + else + archive_cmds_CXX='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` -o $lib' + fi + fi + link_all_deplibs_CXX=yes + ;; + esac + hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir' + hardcode_libdir_separator_CXX=: + inherit_rpath_CXX=yes + ;; + + linux* | k*bsd*-gnu | kopensolaris*-gnu) + case $cc_basename in + KCC*) + # Kuck and Associates, Inc. (KAI) C++ Compiler + + # KCC will only create a shared library if the output file + # ends with ".so" (or ".sl" for HP-UX), so rename the library + # to its proper name (with version) after linking. + archive_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' + archive_expsym_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib ${wl}-retain-symbols-file,$export_symbols; mv \$templib $lib' + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`$CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 | $GREP "ld"`; rm -f libconftest$shared_ext; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' + + hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir' + export_dynamic_flag_spec_CXX='${wl}--export-dynamic' + + # Archives containing C++ object files must be created using + # "CC -Bstatic", where "CC" is the KAI C++ compiler. + old_archive_cmds_CXX='$CC -Bstatic -o $oldlib $oldobjs' + ;; + icpc* | ecpc* ) + # Intel C++ + with_gnu_ld=yes + # version 8.0 and above of icpc choke on multiply defined symbols + # if we add $predep_objects and $postdep_objects, however 7.1 and + # earlier do not add the objects themselves. + case `$CC -V 2>&1` in + *"Version 7."*) + archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' + archive_expsym_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + ;; + *) # Version 8.0 or newer + tmp_idyn= + case $host_cpu in + ia64*) tmp_idyn=' -i_dynamic';; + esac + archive_cmds_CXX='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + archive_expsym_cmds_CXX='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + ;; + esac + archive_cmds_need_lc_CXX=no + hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir' + export_dynamic_flag_spec_CXX='${wl}--export-dynamic' + whole_archive_flag_spec_CXX='${wl}--whole-archive$convenience ${wl}--no-whole-archive' + ;; + pgCC* | pgcpp*) + # Portland Group C++ compiler + case `$CC -V` in + *pgCC\ [1-5].* | *pgcpp\ [1-5].*) + prelink_cmds_CXX='tpldir=Template.dir~ + rm -rf $tpldir~ + $CC --prelink_objects --instantiation_dir $tpldir $objs $libobjs $compile_deplibs~ + compile_command="$compile_command `find $tpldir -name \*.o | sort | $NL2SP`"' + old_archive_cmds_CXX='tpldir=Template.dir~ + rm -rf $tpldir~ + $CC --prelink_objects --instantiation_dir $tpldir $oldobjs$old_deplibs~ + $AR $AR_FLAGS $oldlib$oldobjs$old_deplibs `find $tpldir -name \*.o | sort | $NL2SP`~ + $RANLIB $oldlib' + archive_cmds_CXX='tpldir=Template.dir~ + rm -rf $tpldir~ + $CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~ + $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname -o $lib' + archive_expsym_cmds_CXX='tpldir=Template.dir~ + rm -rf $tpldir~ + $CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~ + $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname ${wl}-retain-symbols-file ${wl}$export_symbols -o $lib' + ;; + *) # Version 6 and above use weak symbols + archive_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname -o $lib' + archive_expsym_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname ${wl}-retain-symbols-file ${wl}$export_symbols -o $lib' + ;; + esac + + hardcode_libdir_flag_spec_CXX='${wl}--rpath ${wl}$libdir' + export_dynamic_flag_spec_CXX='${wl}--export-dynamic' + whole_archive_flag_spec_CXX='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' + ;; + cxx*) + # Compaq C++ + archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' + archive_expsym_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib ${wl}-retain-symbols-file $wl$export_symbols' + + runpath_var=LD_RUN_PATH + hardcode_libdir_flag_spec_CXX='-rpath $libdir' + hardcode_libdir_separator_CXX=: + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld"`; templist=`func_echo_all "$templist" | $SED "s/\(^.*ld.*\)\( .*ld .*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "X$list" | $Xsed' + ;; + xl* | mpixl* | bgxl*) + # IBM XL 8.0 on PPC, with GNU ld + hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir' + export_dynamic_flag_spec_CXX='${wl}--export-dynamic' + archive_cmds_CXX='$CC -qmkshrobj $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + if test "x$supports_anon_versioning" = xyes; then + archive_expsym_cmds_CXX='echo "{ global:" > $output_objdir/$libname.ver~ + cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ + echo "local: *; };" >> $output_objdir/$libname.ver~ + $CC -qmkshrobj $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib' + fi + ;; + *) + case `$CC -V 2>&1 | sed 5q` in + *Sun\ C*) + # Sun C++ 5.9 + no_undefined_flag_CXX=' -zdefs' + archive_cmds_CXX='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + archive_expsym_cmds_CXX='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file ${wl}$export_symbols' + hardcode_libdir_flag_spec_CXX='-R$libdir' + whole_archive_flag_spec_CXX='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' + compiler_needs_object_CXX=yes + + # Not sure whether something based on + # $CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 + # would be better. + output_verbose_link_cmd='func_echo_all' + + # Archives containing C++ object files must be created using + # "CC -xar", where "CC" is the Sun C++ compiler. This is + # necessary to make sure instantiated templates are included + # in the archive. + old_archive_cmds_CXX='$CC -xar -o $oldlib $oldobjs' + ;; + esac + ;; + esac + ;; + + lynxos*) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + + m88k*) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + + mvs*) + case $cc_basename in + cxx*) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + *) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + esac + ;; + + netbsd*) + if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then + archive_cmds_CXX='$LD -Bshareable -o $lib $predep_objects $libobjs $deplibs $postdep_objects $linker_flags' + wlarc= + hardcode_libdir_flag_spec_CXX='-R$libdir' + hardcode_direct_CXX=yes + hardcode_shlibpath_var_CXX=no + fi + # Workaround some broken pre-1.5 toolchains + output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP conftest.$objext | $SED -e "s:-lgcc -lc -lgcc::"' + ;; + + *nto* | *qnx*) + ld_shlibs_CXX=yes + ;; + + openbsd2*) + # C++ shared libraries are fairly broken + ld_shlibs_CXX=no + ;; + + openbsd*) + if test -f /usr/libexec/ld.so; then + hardcode_direct_CXX=yes + hardcode_shlibpath_var_CXX=no + hardcode_direct_absolute_CXX=yes + archive_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib' + hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir' + if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then + archive_expsym_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file,$export_symbols -o $lib' + export_dynamic_flag_spec_CXX='${wl}-E' + whole_archive_flag_spec_CXX="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' + fi + output_verbose_link_cmd=func_echo_all + else + ld_shlibs_CXX=no + fi + ;; + + osf3* | osf4* | osf5*) + case $cc_basename in + KCC*) + # Kuck and Associates, Inc. (KAI) C++ Compiler + + # KCC will only create a shared library if the output file + # ends with ".so" (or ".sl" for HP-UX), so rename the library + # to its proper name (with version) after linking. + archive_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo "$lib" | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' + + hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir' + hardcode_libdir_separator_CXX=: + + # Archives containing C++ object files must be created using + # the KAI C++ compiler. + case $host in + osf3*) old_archive_cmds_CXX='$CC -Bstatic -o $oldlib $oldobjs' ;; + *) old_archive_cmds_CXX='$CC -o $oldlib $oldobjs' ;; + esac + ;; + RCC*) + # Rational C++ 2.4.1 + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + cxx*) + case $host in + osf3*) + allow_undefined_flag_CXX=' ${wl}-expect_unresolved ${wl}\*' + archive_cmds_CXX='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $soname `test -n "$verstring" && func_echo_all "${wl}-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' + hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir' + ;; + *) + allow_undefined_flag_CXX=' -expect_unresolved \*' + archive_cmds_CXX='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' + archive_expsym_cmds_CXX='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done~ + echo "-hidden">> $lib.exp~ + $CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname ${wl}-input ${wl}$lib.exp `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib~ + $RM $lib.exp' + hardcode_libdir_flag_spec_CXX='-rpath $libdir' + ;; + esac + + hardcode_libdir_separator_CXX=: + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld" | $GREP -v "ld:"`; templist=`func_echo_all "$templist" | $SED "s/\(^.*ld.*\)\( .*ld.*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' + ;; + *) + if test "$GXX" = yes && test "$with_gnu_ld" = no; then + allow_undefined_flag_CXX=' ${wl}-expect_unresolved ${wl}\*' + case $host in + osf3*) + archive_cmds_CXX='$CC -shared -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + ;; + *) + archive_cmds_CXX='$CC -shared $pic_flag -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + ;; + esac + + hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir' + hardcode_libdir_separator_CXX=: + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' + + else + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + fi + ;; + esac + ;; + + psos*) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + + sunos4*) + case $cc_basename in + CC*) + # Sun C++ 4.x + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + lcc*) + # Lucid + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + *) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + esac + ;; + + solaris*) + case $cc_basename in + CC* | sunCC*) + # Sun C++ 4.2, 5.x and Centerline C++ + archive_cmds_need_lc_CXX=yes + no_undefined_flag_CXX=' -zdefs' + archive_cmds_CXX='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + archive_expsym_cmds_CXX='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ + $CC -G${allow_undefined_flag} ${wl}-M ${wl}$lib.exp -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' + + hardcode_libdir_flag_spec_CXX='-R$libdir' + hardcode_shlibpath_var_CXX=no + case $host_os in + solaris2.[0-5] | solaris2.[0-5].*) ;; + *) + # The compiler driver will combine and reorder linker options, + # but understands `-z linker_flag'. + # Supported since Solaris 2.6 (maybe 2.5.1?) + whole_archive_flag_spec_CXX='-z allextract$convenience -z defaultextract' + ;; + esac + link_all_deplibs_CXX=yes + + output_verbose_link_cmd='func_echo_all' + + # Archives containing C++ object files must be created using + # "CC -xar", where "CC" is the Sun C++ compiler. This is + # necessary to make sure instantiated templates are included + # in the archive. + old_archive_cmds_CXX='$CC -xar -o $oldlib $oldobjs' + ;; + gcx*) + # Green Hills C++ Compiler + archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' + + # The C++ compiler must be used to create the archive. + old_archive_cmds_CXX='$CC $LDFLAGS -archive -o $oldlib $oldobjs' + ;; + *) + # GNU C++ compiler with Solaris linker + if test "$GXX" = yes && test "$with_gnu_ld" = no; then + no_undefined_flag_CXX=' ${wl}-z ${wl}defs' + if $CC --version | $GREP -v '^2\.7' > /dev/null; then + archive_cmds_CXX='$CC -shared $pic_flag -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' + archive_expsym_cmds_CXX='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ + $CC -shared $pic_flag -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' + else + # g++ 2.7 appears to require `-G' NOT `-shared' on this + # platform. + archive_cmds_CXX='$CC -G -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' + archive_expsym_cmds_CXX='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ + $CC -G -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + output_verbose_link_cmd='$CC -G $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' + fi + + hardcode_libdir_flag_spec_CXX='${wl}-R $wl$libdir' + case $host_os in + solaris2.[0-5] | solaris2.[0-5].*) ;; + *) + whole_archive_flag_spec_CXX='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract' + ;; + esac + fi + ;; + esac + ;; + + sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7* | sco3.2v5.0.[024]*) + no_undefined_flag_CXX='${wl}-z,text' + archive_cmds_need_lc_CXX=no + hardcode_shlibpath_var_CXX=no + runpath_var='LD_RUN_PATH' + + case $cc_basename in + CC*) + archive_cmds_CXX='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds_CXX='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + *) + archive_cmds_CXX='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds_CXX='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + esac + ;; + + sysv5* | sco3.2v5* | sco5v6*) + # Note: We can NOT use -z defs as we might desire, because we do not + # link with -lc, and that would cause any symbols used from libc to + # always be unresolved, which means just about no library would + # ever link correctly. If we're not using GNU ld we use -z text + # though, which does catch some bad symbols but isn't as heavy-handed + # as -z defs. + no_undefined_flag_CXX='${wl}-z,text' + allow_undefined_flag_CXX='${wl}-z,nodefs' + archive_cmds_need_lc_CXX=no + hardcode_shlibpath_var_CXX=no + hardcode_libdir_flag_spec_CXX='${wl}-R,$libdir' + hardcode_libdir_separator_CXX=':' + link_all_deplibs_CXX=yes + export_dynamic_flag_spec_CXX='${wl}-Bexport' + runpath_var='LD_RUN_PATH' + + case $cc_basename in + CC*) + archive_cmds_CXX='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds_CXX='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + old_archive_cmds_CXX='$CC -Tprelink_objects $oldobjs~ + '"$old_archive_cmds_CXX" + reload_cmds_CXX='$CC -Tprelink_objects $reload_objs~ + '"$reload_cmds_CXX" + ;; + *) + archive_cmds_CXX='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds_CXX='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + esac + ;; + + tandem*) + case $cc_basename in + NCC*) + # NonStop-UX NCC 3.20 + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + *) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + esac + ;; + + vxworks*) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + + *) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + esac + + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ld_shlibs_CXX" >&5 +$as_echo "$ld_shlibs_CXX" >&6; } + test "$ld_shlibs_CXX" = no && can_build_shared=no + + GCC_CXX="$GXX" + LD_CXX="$LD" + + ## CAVEAT EMPTOR: + ## There is no encapsulation within the following macros, do not change + ## the running order or otherwise move them around unless you know exactly + ## what you are doing... + # Dependencies to place before and after the object being linked: +predep_objects_CXX= +postdep_objects_CXX= +predeps_CXX= +postdeps_CXX= +compiler_lib_search_path_CXX= + +cat > conftest.$ac_ext <<_LT_EOF +class Foo +{ +public: + Foo (void) { a = 0; } +private: + int a; +}; +_LT_EOF + + +_lt_libdeps_save_CFLAGS=$CFLAGS +case "$CC $CFLAGS " in #( +*\ -flto*\ *) CFLAGS="$CFLAGS -fno-lto" ;; +*\ -fwhopr*\ *) CFLAGS="$CFLAGS -fno-whopr" ;; +*\ -fuse-linker-plugin*\ *) CFLAGS="$CFLAGS -fno-use-linker-plugin" ;; +esac + +if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + # Parse the compiler output and extract the necessary + # objects, libraries and library flags. + + # Sentinel used to keep track of whether or not we are before + # the conftest object file. + pre_test_object_deps_done=no + + for p in `eval "$output_verbose_link_cmd"`; do + case ${prev}${p} in + + -L* | -R* | -l*) + # Some compilers place space between "-{L,R}" and the path. + # Remove the space. + if test $p = "-L" || + test $p = "-R"; then + prev=$p + continue + fi + + # Expand the sysroot to ease extracting the directories later. + if test -z "$prev"; then + case $p in + -L*) func_stripname_cnf '-L' '' "$p"; prev=-L; p=$func_stripname_result ;; + -R*) func_stripname_cnf '-R' '' "$p"; prev=-R; p=$func_stripname_result ;; + -l*) func_stripname_cnf '-l' '' "$p"; prev=-l; p=$func_stripname_result ;; + esac + fi + case $p in + =*) func_stripname_cnf '=' '' "$p"; p=$lt_sysroot$func_stripname_result ;; + esac + if test "$pre_test_object_deps_done" = no; then + case ${prev} in + -L | -R) + # Internal compiler library paths should come after those + # provided the user. The postdeps already come after the + # user supplied libs so there is no need to process them. + if test -z "$compiler_lib_search_path_CXX"; then + compiler_lib_search_path_CXX="${prev}${p}" + else + compiler_lib_search_path_CXX="${compiler_lib_search_path_CXX} ${prev}${p}" + fi + ;; + # The "-l" case would never come before the object being + # linked, so don't bother handling this case. + esac + else + if test -z "$postdeps_CXX"; then + postdeps_CXX="${prev}${p}" + else + postdeps_CXX="${postdeps_CXX} ${prev}${p}" + fi + fi + prev= + ;; + + *.lto.$objext) ;; # Ignore GCC LTO objects + *.$objext) + # This assumes that the test object file only shows up + # once in the compiler output. + if test "$p" = "conftest.$objext"; then + pre_test_object_deps_done=yes + continue + fi + + if test "$pre_test_object_deps_done" = no; then + if test -z "$predep_objects_CXX"; then + predep_objects_CXX="$p" + else + predep_objects_CXX="$predep_objects_CXX $p" + fi + else + if test -z "$postdep_objects_CXX"; then + postdep_objects_CXX="$p" + else + postdep_objects_CXX="$postdep_objects_CXX $p" + fi + fi + ;; + + *) ;; # Ignore the rest. + + esac + done + + # Clean up. + rm -f a.out a.exe +else + echo "libtool.m4: error: problem compiling CXX test program" +fi + +$RM -f confest.$objext +CFLAGS=$_lt_libdeps_save_CFLAGS + +# PORTME: override above test on systems where it is broken +case $host_os in +interix[3-9]*) + # Interix 3.5 installs completely hosed .la files for C++, so rather than + # hack all around it, let's just trust "g++" to DTRT. + predep_objects_CXX= + postdep_objects_CXX= + postdeps_CXX= + ;; + +linux*) + case `$CC -V 2>&1 | sed 5q` in + *Sun\ C*) + # Sun C++ 5.9 + + # The more standards-conforming stlport4 library is + # incompatible with the Cstd library. Avoid specifying + # it if it's in CXXFLAGS. Ignore libCrun as + # -library=stlport4 depends on it. + case " $CXX $CXXFLAGS " in + *" -library=stlport4 "*) + solaris_use_stlport4=yes + ;; + esac + + if test "$solaris_use_stlport4" != yes; then + postdeps_CXX='-library=Cstd -library=Crun' + fi + ;; + esac + ;; + +solaris*) + case $cc_basename in + CC* | sunCC*) + # The more standards-conforming stlport4 library is + # incompatible with the Cstd library. Avoid specifying + # it if it's in CXXFLAGS. Ignore libCrun as + # -library=stlport4 depends on it. + case " $CXX $CXXFLAGS " in + *" -library=stlport4 "*) + solaris_use_stlport4=yes + ;; + esac + + # Adding this requires a known-good setup of shared libraries for + # Sun compiler versions before 5.6, else PIC objects from an old + # archive will be linked into the output, leading to subtle bugs. + if test "$solaris_use_stlport4" != yes; then + postdeps_CXX='-library=Cstd -library=Crun' + fi + ;; + esac + ;; +esac + + +case " $postdeps_CXX " in +*" -lc "*) archive_cmds_need_lc_CXX=no ;; +esac + compiler_lib_search_dirs_CXX= +if test -n "${compiler_lib_search_path_CXX}"; then + compiler_lib_search_dirs_CXX=`echo " ${compiler_lib_search_path_CXX}" | ${SED} -e 's! -L! !g' -e 's!^ !!'` +fi + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + lt_prog_compiler_wl_CXX= +lt_prog_compiler_pic_CXX= +lt_prog_compiler_static_CXX= + + + # C++ specific cases for pic, static, wl, etc. + if test "$GXX" = yes; then + lt_prog_compiler_wl_CXX='-Wl,' + lt_prog_compiler_static_CXX='-static' + + case $host_os in + aix*) + # All AIX code is PIC. + if test "$host_cpu" = ia64; then + # AIX 5 now supports IA64 processor + lt_prog_compiler_static_CXX='-Bstatic' + fi + ;; + + amigaos*) + case $host_cpu in + powerpc) + # see comment about AmigaOS4 .so support + lt_prog_compiler_pic_CXX='-fPIC' + ;; + m68k) + # FIXME: we need at least 68020 code to build shared libraries, but + # adding the `-m68020' flag to GCC prevents building anything better, + # like `-m68040'. + lt_prog_compiler_pic_CXX='-m68020 -resident32 -malways-restore-a4' + ;; + esac + ;; + + beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) + # PIC is the default for these OSes. + ;; + mingw* | cygwin* | os2* | pw32* | cegcc*) + # This hack is so that the source file can tell whether it is being + # built for inclusion in a dll (and should export symbols for example). + # Although the cygwin gcc ignores -fPIC, still need this for old-style + # (--disable-auto-import) libraries + lt_prog_compiler_pic_CXX='-DDLL_EXPORT' + ;; + darwin* | rhapsody*) + # PIC is the default on this platform + # Common symbols not allowed in MH_DYLIB files + lt_prog_compiler_pic_CXX='-fno-common' + ;; + *djgpp*) + # DJGPP does not support shared libraries at all + lt_prog_compiler_pic_CXX= + ;; + haiku*) + # PIC is the default for Haiku. + # The "-static" flag exists, but is broken. + lt_prog_compiler_static_CXX= + ;; + interix[3-9]*) + # Interix 3.x gcc -fpic/-fPIC options generate broken code. + # Instead, we relocate shared libraries at runtime. + ;; + sysv4*MP*) + if test -d /usr/nec; then + lt_prog_compiler_pic_CXX=-Kconform_pic + fi + ;; + hpux*) + # PIC is the default for 64-bit PA HP-UX, but not for 32-bit + # PA HP-UX. On IA64 HP-UX, PIC is the default but the pic flag + # sets the default TLS model and affects inlining. + case $host_cpu in + hppa*64*) + ;; + *) + lt_prog_compiler_pic_CXX='-fPIC' + ;; + esac + ;; + *qnx* | *nto*) + # QNX uses GNU C++, but need to define -shared option too, otherwise + # it will coredump. + lt_prog_compiler_pic_CXX='-fPIC -shared' + ;; + *) + lt_prog_compiler_pic_CXX='-fPIC' + ;; + esac + else + case $host_os in + aix[4-9]*) + # All AIX code is PIC. + if test "$host_cpu" = ia64; then + # AIX 5 now supports IA64 processor + lt_prog_compiler_static_CXX='-Bstatic' + else + lt_prog_compiler_static_CXX='-bnso -bI:/lib/syscalls.exp' + fi + ;; + chorus*) + case $cc_basename in + cxch68*) + # Green Hills C++ Compiler + # _LT_TAGVAR(lt_prog_compiler_static, CXX)="--no_auto_instantiation -u __main -u __premain -u _abort -r $COOL_DIR/lib/libOrb.a $MVME_DIR/lib/CC/libC.a $MVME_DIR/lib/classix/libcx.s.a" + ;; + esac + ;; + mingw* | cygwin* | os2* | pw32* | cegcc*) + # This hack is so that the source file can tell whether it is being + # built for inclusion in a dll (and should export symbols for example). + lt_prog_compiler_pic_CXX='-DDLL_EXPORT' + ;; + dgux*) + case $cc_basename in + ec++*) + lt_prog_compiler_pic_CXX='-KPIC' + ;; + ghcx*) + # Green Hills C++ Compiler + lt_prog_compiler_pic_CXX='-pic' + ;; + *) + ;; + esac + ;; + freebsd* | dragonfly*) + # FreeBSD uses GNU C++ + ;; + hpux9* | hpux10* | hpux11*) + case $cc_basename in + CC*) + lt_prog_compiler_wl_CXX='-Wl,' + lt_prog_compiler_static_CXX='${wl}-a ${wl}archive' + if test "$host_cpu" != ia64; then + lt_prog_compiler_pic_CXX='+Z' + fi + ;; + aCC*) + lt_prog_compiler_wl_CXX='-Wl,' + lt_prog_compiler_static_CXX='${wl}-a ${wl}archive' + case $host_cpu in + hppa*64*|ia64*) + # +Z the default + ;; + *) + lt_prog_compiler_pic_CXX='+Z' + ;; + esac + ;; + *) + ;; + esac + ;; + interix*) + # This is c89, which is MS Visual C++ (no shared libs) + # Anyone wants to do a port? + ;; + irix5* | irix6* | nonstopux*) + case $cc_basename in + CC*) + lt_prog_compiler_wl_CXX='-Wl,' + lt_prog_compiler_static_CXX='-non_shared' + # CC pic flag -KPIC is the default. + ;; + *) + ;; + esac + ;; + linux* | k*bsd*-gnu | kopensolaris*-gnu) + case $cc_basename in + KCC*) + # KAI C++ Compiler + lt_prog_compiler_wl_CXX='--backend -Wl,' + lt_prog_compiler_pic_CXX='-fPIC' + ;; + ecpc* ) + # old Intel C++ for x86_64 which still supported -KPIC. + lt_prog_compiler_wl_CXX='-Wl,' + lt_prog_compiler_pic_CXX='-KPIC' + lt_prog_compiler_static_CXX='-static' + ;; + icpc* ) + # Intel C++, used to be incompatible with GCC. + # ICC 10 doesn't accept -KPIC any more. + lt_prog_compiler_wl_CXX='-Wl,' + lt_prog_compiler_pic_CXX='-fPIC' + lt_prog_compiler_static_CXX='-static' + ;; + pgCC* | pgcpp*) + # Portland Group C++ compiler + lt_prog_compiler_wl_CXX='-Wl,' + lt_prog_compiler_pic_CXX='-fpic' + lt_prog_compiler_static_CXX='-Bstatic' + ;; + cxx*) + # Compaq C++ + # Make sure the PIC flag is empty. It appears that all Alpha + # Linux and Compaq Tru64 Unix objects are PIC. + lt_prog_compiler_pic_CXX= + lt_prog_compiler_static_CXX='-non_shared' + ;; + xlc* | xlC* | bgxl[cC]* | mpixl[cC]*) + # IBM XL 8.0, 9.0 on PPC and BlueGene + lt_prog_compiler_wl_CXX='-Wl,' + lt_prog_compiler_pic_CXX='-qpic' + lt_prog_compiler_static_CXX='-qstaticlink' + ;; + *) + case `$CC -V 2>&1 | sed 5q` in + *Sun\ C*) + # Sun C++ 5.9 + lt_prog_compiler_pic_CXX='-KPIC' + lt_prog_compiler_static_CXX='-Bstatic' + lt_prog_compiler_wl_CXX='-Qoption ld ' + ;; + esac + ;; + esac + ;; + lynxos*) + ;; + m88k*) + ;; + mvs*) + case $cc_basename in + cxx*) + lt_prog_compiler_pic_CXX='-W c,exportall' + ;; + *) + ;; + esac + ;; + netbsd* | netbsdelf*-gnu) + ;; + *qnx* | *nto*) + # QNX uses GNU C++, but need to define -shared option too, otherwise + # it will coredump. + lt_prog_compiler_pic_CXX='-fPIC -shared' + ;; + osf3* | osf4* | osf5*) + case $cc_basename in + KCC*) + lt_prog_compiler_wl_CXX='--backend -Wl,' + ;; + RCC*) + # Rational C++ 2.4.1 + lt_prog_compiler_pic_CXX='-pic' + ;; + cxx*) + # Digital/Compaq C++ + lt_prog_compiler_wl_CXX='-Wl,' + # Make sure the PIC flag is empty. It appears that all Alpha + # Linux and Compaq Tru64 Unix objects are PIC. + lt_prog_compiler_pic_CXX= + lt_prog_compiler_static_CXX='-non_shared' + ;; + *) + ;; + esac + ;; + psos*) + ;; + solaris*) + case $cc_basename in + CC* | sunCC*) + # Sun C++ 4.2, 5.x and Centerline C++ + lt_prog_compiler_pic_CXX='-KPIC' + lt_prog_compiler_static_CXX='-Bstatic' + lt_prog_compiler_wl_CXX='-Qoption ld ' + ;; + gcx*) + # Green Hills C++ Compiler + lt_prog_compiler_pic_CXX='-PIC' + ;; + *) + ;; + esac + ;; + sunos4*) + case $cc_basename in + CC*) + # Sun C++ 4.x + lt_prog_compiler_pic_CXX='-pic' + lt_prog_compiler_static_CXX='-Bstatic' + ;; + lcc*) + # Lucid + lt_prog_compiler_pic_CXX='-pic' + ;; + *) + ;; + esac + ;; + sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) + case $cc_basename in + CC*) + lt_prog_compiler_wl_CXX='-Wl,' + lt_prog_compiler_pic_CXX='-KPIC' + lt_prog_compiler_static_CXX='-Bstatic' + ;; + esac + ;; + tandem*) + case $cc_basename in + NCC*) + # NonStop-UX NCC 3.20 + lt_prog_compiler_pic_CXX='-KPIC' + ;; + *) + ;; + esac + ;; + vxworks*) + ;; + *) + lt_prog_compiler_can_build_shared_CXX=no + ;; + esac + fi + +case $host_os in + # For platforms which do not support PIC, -DPIC is meaningless: + *djgpp*) + lt_prog_compiler_pic_CXX= + ;; + *) + lt_prog_compiler_pic_CXX="$lt_prog_compiler_pic_CXX -DPIC" + ;; +esac + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $compiler option to produce PIC" >&5 +$as_echo_n "checking for $compiler option to produce PIC... " >&6; } +if ${lt_cv_prog_compiler_pic_CXX+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_prog_compiler_pic_CXX=$lt_prog_compiler_pic_CXX +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic_CXX" >&5 +$as_echo "$lt_cv_prog_compiler_pic_CXX" >&6; } +lt_prog_compiler_pic_CXX=$lt_cv_prog_compiler_pic_CXX + +# +# Check to make sure the PIC flag actually works. +# +if test -n "$lt_prog_compiler_pic_CXX"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler PIC flag $lt_prog_compiler_pic_CXX works" >&5 +$as_echo_n "checking if $compiler PIC flag $lt_prog_compiler_pic_CXX works... " >&6; } +if ${lt_cv_prog_compiler_pic_works_CXX+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_prog_compiler_pic_works_CXX=no + ac_outfile=conftest.$ac_objext + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + lt_compiler_flag="$lt_prog_compiler_pic_CXX -DPIC" + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + # The option is referenced via a variable to avoid confusing sed. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ + -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) + (eval "$lt_compile" 2>conftest.err) + ac_status=$? + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + if (exit $ac_status) && test -s "$ac_outfile"; then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings other than the usual output. + $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp + $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 + if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then + lt_cv_prog_compiler_pic_works_CXX=yes + fi + fi + $RM conftest* + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic_works_CXX" >&5 +$as_echo "$lt_cv_prog_compiler_pic_works_CXX" >&6; } + +if test x"$lt_cv_prog_compiler_pic_works_CXX" = xyes; then + case $lt_prog_compiler_pic_CXX in + "" | " "*) ;; + *) lt_prog_compiler_pic_CXX=" $lt_prog_compiler_pic_CXX" ;; + esac +else + lt_prog_compiler_pic_CXX= + lt_prog_compiler_can_build_shared_CXX=no +fi + +fi + + + + + +# +# Check to make sure the static flag actually works. +# +wl=$lt_prog_compiler_wl_CXX eval lt_tmp_static_flag=\"$lt_prog_compiler_static_CXX\" +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler static flag $lt_tmp_static_flag works" >&5 +$as_echo_n "checking if $compiler static flag $lt_tmp_static_flag works... " >&6; } +if ${lt_cv_prog_compiler_static_works_CXX+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_prog_compiler_static_works_CXX=no + save_LDFLAGS="$LDFLAGS" + LDFLAGS="$LDFLAGS $lt_tmp_static_flag" + echo "$lt_simple_link_test_code" > conftest.$ac_ext + if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then + # The linker can only warn and ignore the option if not recognized + # So say no if there are warnings + if test -s conftest.err; then + # Append any errors to the config.log. + cat conftest.err 1>&5 + $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp + $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 + if diff conftest.exp conftest.er2 >/dev/null; then + lt_cv_prog_compiler_static_works_CXX=yes + fi + else + lt_cv_prog_compiler_static_works_CXX=yes + fi + fi + $RM -r conftest* + LDFLAGS="$save_LDFLAGS" + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_static_works_CXX" >&5 +$as_echo "$lt_cv_prog_compiler_static_works_CXX" >&6; } + +if test x"$lt_cv_prog_compiler_static_works_CXX" = xyes; then + : +else + lt_prog_compiler_static_CXX= +fi + + + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5 +$as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; } +if ${lt_cv_prog_compiler_c_o_CXX+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_prog_compiler_c_o_CXX=no + $RM -r conftest 2>/dev/null + mkdir conftest + cd conftest + mkdir out + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + + lt_compiler_flag="-o out/conftest2.$ac_objext" + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ + -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) + (eval "$lt_compile" 2>out/conftest.err) + ac_status=$? + cat out/conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + if (exit $ac_status) && test -s out/conftest2.$ac_objext + then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings + $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp + $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 + if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then + lt_cv_prog_compiler_c_o_CXX=yes + fi + fi + chmod u+w . 2>&5 + $RM conftest* + # SGI C++ compiler will create directory out/ii_files/ for + # template instantiation + test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files + $RM out/* && rmdir out + cd .. + $RM -r conftest + $RM conftest* + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o_CXX" >&5 +$as_echo "$lt_cv_prog_compiler_c_o_CXX" >&6; } + + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5 +$as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; } +if ${lt_cv_prog_compiler_c_o_CXX+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_prog_compiler_c_o_CXX=no + $RM -r conftest 2>/dev/null + mkdir conftest + cd conftest + mkdir out + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + + lt_compiler_flag="-o out/conftest2.$ac_objext" + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ + -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) + (eval "$lt_compile" 2>out/conftest.err) + ac_status=$? + cat out/conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + if (exit $ac_status) && test -s out/conftest2.$ac_objext + then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings + $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp + $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 + if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then + lt_cv_prog_compiler_c_o_CXX=yes + fi + fi + chmod u+w . 2>&5 + $RM conftest* + # SGI C++ compiler will create directory out/ii_files/ for + # template instantiation + test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files + $RM out/* && rmdir out + cd .. + $RM -r conftest + $RM conftest* + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o_CXX" >&5 +$as_echo "$lt_cv_prog_compiler_c_o_CXX" >&6; } + + + + +hard_links="nottested" +if test "$lt_cv_prog_compiler_c_o_CXX" = no && test "$need_locks" != no; then + # do not overwrite the value of need_locks provided by the user + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if we can lock with hard links" >&5 +$as_echo_n "checking if we can lock with hard links... " >&6; } + hard_links=yes + $RM conftest* + ln conftest.a conftest.b 2>/dev/null && hard_links=no + touch conftest.a + ln conftest.a conftest.b 2>&5 || hard_links=no + ln conftest.a conftest.b 2>/dev/null && hard_links=no + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $hard_links" >&5 +$as_echo "$hard_links" >&6; } + if test "$hard_links" = no; then + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&5 +$as_echo "$as_me: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&2;} + need_locks=warn + fi +else + need_locks=no +fi + + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $compiler linker ($LD) supports shared libraries" >&5 +$as_echo_n "checking whether the $compiler linker ($LD) supports shared libraries... " >&6; } + + export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' + exclude_expsyms_CXX='_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*' + case $host_os in + aix[4-9]*) + # If we're using GNU nm, then we don't want the "-C" option. + # -C means demangle to AIX nm, but means don't demangle with GNU nm + # Also, AIX nm treats weak defined symbols like other global defined + # symbols, whereas GNU nm marks them as "W". + if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then + export_symbols_cmds_CXX='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && (substr(\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' + else + export_symbols_cmds_CXX='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && (substr(\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' + fi + ;; + pw32*) + export_symbols_cmds_CXX="$ltdll_cmds" + ;; + cygwin* | mingw* | cegcc*) + case $cc_basename in + cl*) + exclude_expsyms_CXX='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*' + ;; + *) + export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1 DATA/;s/^.*[ ]__nm__\([^ ]*\)[ ][^ ]*/\1 DATA/;/^I[ ]/d;/^[AITW][ ]/s/.* //'\'' | sort | uniq > $export_symbols' + exclude_expsyms_CXX='[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname' + ;; + esac + ;; + linux* | k*bsd*-gnu | gnu*) + link_all_deplibs_CXX=no + ;; + *) + export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' + ;; + esac + +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ld_shlibs_CXX" >&5 +$as_echo "$ld_shlibs_CXX" >&6; } +test "$ld_shlibs_CXX" = no && can_build_shared=no + +with_gnu_ld_CXX=$with_gnu_ld + + + + + + +# +# Do we need to explicitly link libc? +# +case "x$archive_cmds_need_lc_CXX" in +x|xyes) + # Assume -lc should be added + archive_cmds_need_lc_CXX=yes + + if test "$enable_shared" = yes && test "$GCC" = yes; then + case $archive_cmds_CXX in + *'~'*) + # FIXME: we may have to deal with multi-command sequences. + ;; + '$CC '*) + # Test whether the compiler implicitly links with -lc since on some + # systems, -lgcc has to come before -lc. If gcc already passes -lc + # to ld, don't add -lc before -lgcc. + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether -lc should be explicitly linked in" >&5 +$as_echo_n "checking whether -lc should be explicitly linked in... " >&6; } +if ${lt_cv_archive_cmds_need_lc_CXX+:} false; then : + $as_echo_n "(cached) " >&6 +else + $RM conftest* + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } 2>conftest.err; then + soname=conftest + lib=conftest + libobjs=conftest.$ac_objext + deplibs= + wl=$lt_prog_compiler_wl_CXX + pic_flag=$lt_prog_compiler_pic_CXX + compiler_flags=-v + linker_flags=-v + verstring= + output_objdir=. + libname=conftest + lt_save_allow_undefined_flag=$allow_undefined_flag_CXX + allow_undefined_flag_CXX= + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$archive_cmds_CXX 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1\""; } >&5 + (eval $archive_cmds_CXX 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + then + lt_cv_archive_cmds_need_lc_CXX=no + else + lt_cv_archive_cmds_need_lc_CXX=yes + fi + allow_undefined_flag_CXX=$lt_save_allow_undefined_flag + else + cat conftest.err 1>&5 + fi + $RM conftest* + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_archive_cmds_need_lc_CXX" >&5 +$as_echo "$lt_cv_archive_cmds_need_lc_CXX" >&6; } + archive_cmds_need_lc_CXX=$lt_cv_archive_cmds_need_lc_CXX + ;; + esac + fi + ;; +esac + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking dynamic linker characteristics" >&5 +$as_echo_n "checking dynamic linker characteristics... " >&6; } + +library_names_spec= +libname_spec='lib$name' +soname_spec= +shrext_cmds=".so" +postinstall_cmds= +postuninstall_cmds= +finish_cmds= +finish_eval= +shlibpath_var= +shlibpath_overrides_runpath=unknown +version_type=none +dynamic_linker="$host_os ld.so" +sys_lib_dlsearch_path_spec="/lib /usr/lib" +need_lib_prefix=unknown +hardcode_into_libs=no + +# when you set need_version to no, make sure it does not cause -set_version +# flags to be left without arguments +need_version=unknown + +case $host_os in +aix3*) + version_type=linux # correct to gnu/linux during the next big refactor + library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a' + shlibpath_var=LIBPATH + + # AIX 3 has no versioning support, so we append a major version to the name. + soname_spec='${libname}${release}${shared_ext}$major' + ;; + +aix[4-9]*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + hardcode_into_libs=yes + if test "$host_cpu" = ia64; then + # AIX 5 supports IA64 + library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}' + shlibpath_var=LD_LIBRARY_PATH + else + # With GCC up to 2.95.x, collect2 would create an import file + # for dependence libraries. The import file would start with + # the line `#! .'. This would cause the generated library to + # depend on `.', always an invalid library. This was fixed in + # development snapshots of GCC prior to 3.0. + case $host_os in + aix4 | aix4.[01] | aix4.[01].*) + if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)' + echo ' yes ' + echo '#endif'; } | ${CC} -E - | $GREP yes > /dev/null; then + : + else + can_build_shared=no + fi + ;; + esac + # AIX (on Power*) has no versioning support, so currently we can not hardcode correct + # soname into executable. Probably we can add versioning support to + # collect2, so additional links can be useful in future. + if test "$aix_use_runtimelinking" = yes; then + # If using run time linking (on AIX 4.2 or later) use lib.so + # instead of lib.a to let people know that these are not + # typical AIX shared libraries. + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + else + # We preserve .a as extension for shared libraries through AIX4.2 + # and later when we are not doing run time linking. + library_names_spec='${libname}${release}.a $libname.a' + soname_spec='${libname}${release}${shared_ext}$major' + fi + shlibpath_var=LIBPATH + fi + ;; + +amigaos*) + case $host_cpu in + powerpc) + # Since July 2007 AmigaOS4 officially supports .so libraries. + # When compiling the executable, add -use-dynld -Lsobjs: to the compileline. + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + ;; + m68k) + library_names_spec='$libname.ixlibrary $libname.a' + # Create ${libname}_ixlibrary.a entries in /sys/libs. + finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`func_echo_all "$lib" | $SED '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; test $RM /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done' + ;; + esac + ;; + +beos*) + library_names_spec='${libname}${shared_ext}' + dynamic_linker="$host_os ld.so" + shlibpath_var=LIBRARY_PATH + ;; + +bsdi[45]*) + version_type=linux # correct to gnu/linux during the next big refactor + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir' + shlibpath_var=LD_LIBRARY_PATH + sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib" + sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib" + # the default ld.so.conf also contains /usr/contrib/lib and + # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow + # libtool to hard-code these into programs + ;; + +cygwin* | mingw* | pw32* | cegcc*) + version_type=windows + shrext_cmds=".dll" + need_version=no + need_lib_prefix=no + + case $GCC,$cc_basename in + yes,*) + # gcc + library_names_spec='$libname.dll.a' + # DLL is installed to $(libdir)/../bin by postinstall_cmds + postinstall_cmds='base_file=`basename \${file}`~ + dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~ + dldir=$destdir/`dirname \$dlpath`~ + test -d \$dldir || mkdir -p \$dldir~ + $install_prog $dir/$dlname \$dldir/$dlname~ + chmod a+x \$dldir/$dlname~ + if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then + eval '\''$striplib \$dldir/$dlname'\'' || exit \$?; + fi' + postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ + dlpath=$dir/\$dldll~ + $RM \$dlpath' + shlibpath_overrides_runpath=yes + + case $host_os in + cygwin*) + # Cygwin DLLs use 'cyg' prefix rather than 'lib' + soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' + + ;; + mingw* | cegcc*) + # MinGW DLLs use traditional 'lib' prefix + soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' + ;; + pw32*) + # pw32 DLLs use 'pw' prefix rather than 'lib' + library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' + ;; + esac + dynamic_linker='Win32 ld.exe' + ;; + + *,cl*) + # Native MSVC + libname_spec='$name' + soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' + library_names_spec='${libname}.dll.lib' + + case $build_os in + mingw*) + sys_lib_search_path_spec= + lt_save_ifs=$IFS + IFS=';' + for lt_path in $LIB + do + IFS=$lt_save_ifs + # Let DOS variable expansion print the short 8.3 style file name. + lt_path=`cd "$lt_path" 2>/dev/null && cmd //C "for %i in (".") do @echo %~si"` + sys_lib_search_path_spec="$sys_lib_search_path_spec $lt_path" + done + IFS=$lt_save_ifs + # Convert to MSYS style. + sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | sed -e 's|\\\\|/|g' -e 's| \\([a-zA-Z]\\):| /\\1|g' -e 's|^ ||'` + ;; + cygwin*) + # Convert to unix form, then to dos form, then back to unix form + # but this time dos style (no spaces!) so that the unix form looks + # like /cygdrive/c/PROGRA~1:/cygdr... + sys_lib_search_path_spec=`cygpath --path --unix "$LIB"` + sys_lib_search_path_spec=`cygpath --path --dos "$sys_lib_search_path_spec" 2>/dev/null` + sys_lib_search_path_spec=`cygpath --path --unix "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` + ;; + *) + sys_lib_search_path_spec="$LIB" + if $ECHO "$sys_lib_search_path_spec" | $GREP ';[c-zC-Z]:/' >/dev/null; then + # It is most probably a Windows format PATH. + sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` + else + sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` + fi + # FIXME: find the short name or the path components, as spaces are + # common. (e.g. "Program Files" -> "PROGRA~1") + ;; + esac + + # DLL is installed to $(libdir)/../bin by postinstall_cmds + postinstall_cmds='base_file=`basename \${file}`~ + dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~ + dldir=$destdir/`dirname \$dlpath`~ + test -d \$dldir || mkdir -p \$dldir~ + $install_prog $dir/$dlname \$dldir/$dlname' + postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ + dlpath=$dir/\$dldll~ + $RM \$dlpath' + shlibpath_overrides_runpath=yes + dynamic_linker='Win32 link.exe' + ;; + + *) + # Assume MSVC wrapper + library_names_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext} $libname.lib' + dynamic_linker='Win32 ld.exe' + ;; + esac + # FIXME: first we should search . and the directory the executable is in + shlibpath_var=PATH + ;; + +darwin* | rhapsody*) + dynamic_linker="$host_os dyld" + version_type=darwin + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${major}$shared_ext ${libname}$shared_ext' + soname_spec='${libname}${release}${major}$shared_ext' + shlibpath_overrides_runpath=yes + shlibpath_var=DYLD_LIBRARY_PATH + shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`' + + sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib' + ;; + +dgux*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + ;; + +freebsd* | dragonfly*) + # DragonFly does not have aout. When/if they implement a new + # versioning mechanism, adjust this. + if test -x /usr/bin/objformat; then + objformat=`/usr/bin/objformat` + else + case $host_os in + freebsd[23].*) objformat=aout ;; + *) objformat=elf ;; + esac + fi + version_type=freebsd-$objformat + case $version_type in + freebsd-elf*) + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' + need_version=no + need_lib_prefix=no + ;; + freebsd-*) + library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix' + need_version=yes + ;; + esac + shlibpath_var=LD_LIBRARY_PATH + case $host_os in + freebsd2.*) + shlibpath_overrides_runpath=yes + ;; + freebsd3.[01]* | freebsdelf3.[01]*) + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + freebsd3.[2-9]* | freebsdelf3.[2-9]* | \ + freebsd4.[0-5] | freebsdelf4.[0-5] | freebsd4.1.1 | freebsdelf4.1.1) + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; + *) # from 4.6 on, and DragonFly + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + esac + ;; + +gnu*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; + +haiku*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + dynamic_linker="$host_os runtime_loader" + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LIBRARY_PATH + shlibpath_overrides_runpath=yes + sys_lib_dlsearch_path_spec='/boot/home/config/lib /boot/common/lib /boot/system/lib' + hardcode_into_libs=yes + ;; + +hpux9* | hpux10* | hpux11*) + # Give a soname corresponding to the major version so that dld.sl refuses to + # link against other versions. + version_type=sunos + need_lib_prefix=no + need_version=no + case $host_cpu in + ia64*) + shrext_cmds='.so' + hardcode_into_libs=yes + dynamic_linker="$host_os dld.so" + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + if test "X$HPUX_IA64_MODE" = X32; then + sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib" + else + sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64" + fi + sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec + ;; + hppa*64*) + shrext_cmds='.sl' + hardcode_into_libs=yes + dynamic_linker="$host_os dld.sl" + shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH + shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64" + sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec + ;; + *) + shrext_cmds='.sl' + dynamic_linker="$host_os dld.sl" + shlibpath_var=SHLIB_PATH + shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + ;; + esac + # HP-UX runs *really* slowly unless shared libraries are mode 555, ... + postinstall_cmds='chmod 555 $lib' + # or fails outright, so override atomically: + install_override_mode=555 + ;; + +interix[3-9]*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; + +irix5* | irix6* | nonstopux*) + case $host_os in + nonstopux*) version_type=nonstopux ;; + *) + if test "$lt_cv_prog_gnu_ld" = yes; then + version_type=linux # correct to gnu/linux during the next big refactor + else + version_type=irix + fi ;; + esac + need_lib_prefix=no + need_version=no + soname_spec='${libname}${release}${shared_ext}$major' + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}' + case $host_os in + irix5* | nonstopux*) + libsuff= shlibsuff= + ;; + *) + case $LD in # libtool.m4 will add one of these switches to LD + *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") + libsuff= shlibsuff= libmagic=32-bit;; + *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") + libsuff=32 shlibsuff=N32 libmagic=N32;; + *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") + libsuff=64 shlibsuff=64 libmagic=64-bit;; + *) libsuff= shlibsuff= libmagic=never-match;; + esac + ;; + esac + shlibpath_var=LD_LIBRARY${shlibsuff}_PATH + shlibpath_overrides_runpath=no + sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}" + sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}" + hardcode_into_libs=yes + ;; + +# No shared lib support for Linux oldld, aout, or coff. +linux*oldld* | linux*aout* | linux*coff*) + dynamic_linker=no + ;; + +# This must be glibc/ELF. +linux* | k*bsd*-gnu | kopensolaris*-gnu) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + + # Some binutils ld are patched to set DT_RUNPATH + if ${lt_cv_shlibpath_overrides_runpath+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_shlibpath_overrides_runpath=no + save_LDFLAGS=$LDFLAGS + save_libdir=$libdir + eval "libdir=/foo; wl=\"$lt_prog_compiler_wl_CXX\"; \ + LDFLAGS=\"\$LDFLAGS $hardcode_libdir_flag_spec_CXX\"" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_cxx_try_link "$LINENO"; then : + if ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir" >/dev/null; then : + lt_cv_shlibpath_overrides_runpath=yes +fi +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + LDFLAGS=$save_LDFLAGS + libdir=$save_libdir + +fi + + shlibpath_overrides_runpath=$lt_cv_shlibpath_overrides_runpath + + # This implies no fast_install, which is unacceptable. + # Some rework will be needed to allow for fast_install + # before this can be enabled. + hardcode_into_libs=yes + + # Append ld.so.conf contents to the search path + if test -f /etc/ld.so.conf; then + lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \$2)); skip = 1; } { if (!skip) print \$0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[ ]*hwcap[ ]/d;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;s/"//g;/^$/d' | tr '\n' ' '` + sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra" + fi + + # We used to test for /lib/ld.so.1 and disable shared libraries on + # powerpc, because MkLinux only supported shared libraries with the + # GNU dynamic linker. Since this was broken with cross compilers, + # most powerpc-linux boxes support dynamic linking these days and + # people can always --disable-shared, the test was removed, and we + # assume the GNU/Linux dynamic linker is in use. + dynamic_linker='GNU/Linux ld.so' + ;; + +netbsdelf*-gnu) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + dynamic_linker='NetBSD ld.elf_so' + ;; + +netbsd*) + version_type=sunos + need_lib_prefix=no + need_version=no + if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' + dynamic_linker='NetBSD (a.out) ld.so' + else + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + dynamic_linker='NetBSD ld.elf_so' + fi + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + +newsos6) + version_type=linux # correct to gnu/linux during the next big refactor + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + ;; + +*nto* | *qnx*) + version_type=qnx + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + dynamic_linker='ldqnx.so' + ;; + +openbsd*) + version_type=sunos + sys_lib_dlsearch_path_spec="/usr/lib" + need_lib_prefix=no + # Some older versions of OpenBSD (3.3 at least) *do* need versioned libs. + case $host_os in + openbsd3.3 | openbsd3.3.*) need_version=yes ;; + *) need_version=no ;; + esac + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' + shlibpath_var=LD_LIBRARY_PATH + if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then + case $host_os in + openbsd2.[89] | openbsd2.[89].*) + shlibpath_overrides_runpath=no + ;; + *) + shlibpath_overrides_runpath=yes + ;; + esac + else + shlibpath_overrides_runpath=yes + fi + ;; + +os2*) + libname_spec='$name' + shrext_cmds=".dll" + need_lib_prefix=no + library_names_spec='$libname${shared_ext} $libname.a' + dynamic_linker='OS/2 ld.exe' + shlibpath_var=LIBPATH + ;; + +osf3* | osf4* | osf5*) + version_type=osf + need_lib_prefix=no + need_version=no + soname_spec='${libname}${release}${shared_ext}$major' + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + shlibpath_var=LD_LIBRARY_PATH + sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib" + sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec" + ;; + +rdos*) + dynamic_linker=no + ;; + +solaris*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + # ldd complains unless libraries are executable + postinstall_cmds='chmod +x $lib' + ;; + +sunos4*) + version_type=sunos + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' + finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + if test "$with_gnu_ld" = yes; then + need_lib_prefix=no + fi + need_version=yes + ;; + +sysv4 | sysv4.3*) + version_type=linux # correct to gnu/linux during the next big refactor + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + case $host_vendor in + sni) + shlibpath_overrides_runpath=no + need_lib_prefix=no + runpath_var=LD_RUN_PATH + ;; + siemens) + need_lib_prefix=no + ;; + motorola) + need_lib_prefix=no + need_version=no + shlibpath_overrides_runpath=no + sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib' + ;; + esac + ;; + +sysv4*MP*) + if test -d /usr/nec ;then + version_type=linux # correct to gnu/linux during the next big refactor + library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}' + soname_spec='$libname${shared_ext}.$major' + shlibpath_var=LD_LIBRARY_PATH + fi + ;; + +sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) + version_type=freebsd-elf + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + if test "$with_gnu_ld" = yes; then + sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib' + else + sys_lib_search_path_spec='/usr/ccs/lib /usr/lib' + case $host_os in + sco3.2v5*) + sys_lib_search_path_spec="$sys_lib_search_path_spec /lib" + ;; + esac + fi + sys_lib_dlsearch_path_spec='/usr/lib' + ;; + +tpf*) + # TPF is a cross-target only. Preferred cross-host = GNU/Linux. + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; + +uts4*) + version_type=linux # correct to gnu/linux during the next big refactor + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + ;; + +*) + dynamic_linker=no + ;; +esac +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $dynamic_linker" >&5 +$as_echo "$dynamic_linker" >&6; } +test "$dynamic_linker" = no && can_build_shared=no + +variables_saved_for_relink="PATH $shlibpath_var $runpath_var" +if test "$GCC" = yes; then + variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" +fi + +if test "${lt_cv_sys_lib_search_path_spec+set}" = set; then + sys_lib_search_path_spec="$lt_cv_sys_lib_search_path_spec" +fi +if test "${lt_cv_sys_lib_dlsearch_path_spec+set}" = set; then + sys_lib_dlsearch_path_spec="$lt_cv_sys_lib_dlsearch_path_spec" +fi + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to hardcode library paths into programs" >&5 +$as_echo_n "checking how to hardcode library paths into programs... " >&6; } +hardcode_action_CXX= +if test -n "$hardcode_libdir_flag_spec_CXX" || + test -n "$runpath_var_CXX" || + test "X$hardcode_automatic_CXX" = "Xyes" ; then + + # We can hardcode non-existent directories. + if test "$hardcode_direct_CXX" != no && + # If the only mechanism to avoid hardcoding is shlibpath_var, we + # have to relink, otherwise we might link with an installed library + # when we should be linking with a yet-to-be-installed one + ## test "$_LT_TAGVAR(hardcode_shlibpath_var, CXX)" != no && + test "$hardcode_minus_L_CXX" != no; then + # Linking always hardcodes the temporary library directory. + hardcode_action_CXX=relink + else + # We can link without hardcoding, and we can hardcode nonexisting dirs. + hardcode_action_CXX=immediate + fi +else + # We cannot hardcode anything, or else we can only hardcode existing + # directories. + hardcode_action_CXX=unsupported +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $hardcode_action_CXX" >&5 +$as_echo "$hardcode_action_CXX" >&6; } + +if test "$hardcode_action_CXX" = relink || + test "$inherit_rpath_CXX" = yes; then + # Fast installation is not supported + enable_fast_install=no +elif test "$shlibpath_overrides_runpath" = yes || + test "$enable_shared" = no; then + # Fast installation is not necessary + enable_fast_install=needless +fi + + + + + + + + fi # test -n "$compiler" + + CC=$lt_save_CC + CFLAGS=$lt_save_CFLAGS + LDCXX=$LD + LD=$lt_save_LD + GCC=$lt_save_GCC + with_gnu_ld=$lt_save_with_gnu_ld + lt_cv_path_LDCXX=$lt_cv_path_LD + lt_cv_path_LD=$lt_save_path_LD + lt_cv_prog_gnu_ldcxx=$lt_cv_prog_gnu_ld + lt_cv_prog_gnu_ld=$lt_save_with_gnu_ld +fi # test "$_lt_caught_CXX_error" != yes + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + + + + + + + + + + + + + + + ac_config_commands="$ac_config_commands libtool" + + + + +# Only expand once: + + + +#enable -D_GNU_SOURCE since the return code value of getaddrinfo +#ifdefed with __USE_GNU +#features.h header undef's __USE_GNU and defines it only if _GNU_SOURCE is defined +#hence this define for gcc +# Check whether --enable-debug was given. +if test "${enable_debug+set}" = set; then : + enableval=$enable_debug; +else + enable_debug=no +fi + + +if test "x$enable_debug" = xyes; then + if test "x$init_cflags" = x; then + CFLAGS="" + fi + CFLAGS="$CFLAGS -g -O0 -D_GNU_SOURCE" +else + if test "x$init_cflags" = x; then + CFLAGS="-g -O2 -D_GNU_SOURCE" + fi +fi + +if test "x$enable_debug" = xyes; then + if test "x$init_cxxflags" = x; then + CXXFLAGS="" + fi + CXXFLAGS="$CXXFLAGS -g -O0" +else + if test "x$init_cxxflags" = x; then + CXXFLAGS="-g -O2" + fi +fi + + +# Check whether --with-syncapi was given. +if test "${with_syncapi+set}" = set; then : + withval=$with_syncapi; +else + with_syncapi=yes +fi + + +# Checks for libraries. +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for pthread_mutex_lock in -lpthread" >&5 +$as_echo_n "checking for pthread_mutex_lock in -lpthread... " >&6; } +if ${ac_cv_lib_pthread_pthread_mutex_lock+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lpthread $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char pthread_mutex_lock (); +int +main () +{ +return pthread_mutex_lock (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_pthread_pthread_mutex_lock=yes +else + ac_cv_lib_pthread_pthread_mutex_lock=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_pthread_pthread_mutex_lock" >&5 +$as_echo "$ac_cv_lib_pthread_pthread_mutex_lock" >&6; } +if test "x$ac_cv_lib_pthread_pthread_mutex_lock" = xyes; then : + have_pthread=yes +else + have_pthread=no +fi + + +if test "x$with_syncapi" != xno && test "x$have_pthread" = xno; then + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cannot build SyncAPI -- pthread not found" >&5 +$as_echo "$as_me: WARNING: cannot build SyncAPI -- pthread not found" >&2;} + with_syncapi=no +fi +if test "x$with_syncapi" != xno; then + { $as_echo "$as_me:${as_lineno-$LINENO}: building with SyncAPI support" >&5 +$as_echo "$as_me: building with SyncAPI support" >&6;} +else + { $as_echo "$as_me:${as_lineno-$LINENO}: building without SyncAPI support" >&5 +$as_echo "$as_me: building without SyncAPI support" >&6;} +fi + + if test "x$with_syncapi" != xno; then + WANT_SYNCAPI_TRUE= + WANT_SYNCAPI_FALSE='#' +else + WANT_SYNCAPI_TRUE='#' + WANT_SYNCAPI_FALSE= +fi + + +# Checks for header files. +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header files" >&5 +$as_echo_n "checking for ANSI C header files... " >&6; } +if ${ac_cv_header_stdc+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +#include +#include +#include + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_header_stdc=yes +else + ac_cv_header_stdc=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + +if test $ac_cv_header_stdc = yes; then + # SunOS 4.x string.h does not declare mem*, contrary to ANSI. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include + +_ACEOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + $EGREP "memchr" >/dev/null 2>&1; then : + +else + ac_cv_header_stdc=no +fi +rm -f conftest* + +fi + +if test $ac_cv_header_stdc = yes; then + # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include + +_ACEOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + $EGREP "free" >/dev/null 2>&1; then : + +else + ac_cv_header_stdc=no +fi +rm -f conftest* + +fi + +if test $ac_cv_header_stdc = yes; then + # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi. + if test "$cross_compiling" = yes; then : + : +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +#include +#if ((' ' & 0x0FF) == 0x020) +# define ISLOWER(c) ('a' <= (c) && (c) <= 'z') +# define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c)) +#else +# define ISLOWER(c) \ + (('a' <= (c) && (c) <= 'i') \ + || ('j' <= (c) && (c) <= 'r') \ + || ('s' <= (c) && (c) <= 'z')) +# define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c)) +#endif + +#define XOR(e, f) (((e) && !(f)) || (!(e) && (f))) +int +main () +{ + int i; + for (i = 0; i < 256; i++) + if (XOR (islower (i), ISLOWER (i)) + || toupper (i) != TOUPPER (i)) + return 2; + return 0; +} +_ACEOF +if ac_fn_c_try_run "$LINENO"; then : + +else + ac_cv_header_stdc=no +fi +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ + conftest.$ac_objext conftest.beam conftest.$ac_ext +fi + +fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdc" >&5 +$as_echo "$ac_cv_header_stdc" >&6; } +if test $ac_cv_header_stdc = yes; then + +$as_echo "#define STDC_HEADERS 1" >>confdefs.h + +fi + +for ac_header in arpa/inet.h fcntl.h netdb.h netinet/in.h stdlib.h string.h sys/socket.h sys/time.h unistd.h sys/utsname.h +do : + as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` +ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default" +if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : + cat >>confdefs.h <<_ACEOF +#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 +_ACEOF + +fi + +done + + +# Checks for typedefs, structures, and compiler characteristics. +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for an ANSI C-conforming const" >&5 +$as_echo_n "checking for an ANSI C-conforming const... " >&6; } +if ${ac_cv_c_const+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + +#ifndef __cplusplus + /* Ultrix mips cc rejects this sort of thing. */ + typedef int charset[2]; + const charset cs = { 0, 0 }; + /* SunOS 4.1.1 cc rejects this. */ + char const *const *pcpcc; + char **ppc; + /* NEC SVR4.0.2 mips cc rejects this. */ + struct point {int x, y;}; + static struct point const zero = {0,0}; + /* AIX XL C 1.02.0.0 rejects this. + It does not let you subtract one const X* pointer from another in + an arm of an if-expression whose if-part is not a constant + expression */ + const char *g = "string"; + pcpcc = &g + (g ? g-g : 0); + /* HPUX 7.0 cc rejects these. */ + ++pcpcc; + ppc = (char**) pcpcc; + pcpcc = (char const *const *) ppc; + { /* SCO 3.2v4 cc rejects this sort of thing. */ + char tx; + char *t = &tx; + char const *s = 0 ? (char *) 0 : (char const *) 0; + + *t++ = 0; + if (s) return 0; + } + { /* Someone thinks the Sun supposedly-ANSI compiler will reject this. */ + int x[] = {25, 17}; + const int *foo = &x[0]; + ++foo; + } + { /* Sun SC1.0 ANSI compiler rejects this -- but not the above. */ + typedef const int *iptr; + iptr p = 0; + ++p; + } + { /* AIX XL C 1.02.0.0 rejects this sort of thing, saying + "k.c", line 2.27: 1506-025 (S) Operand must be a modifiable lvalue. */ + struct s { int j; const int *ap[3]; } bx; + struct s *b = &bx; b->j = 5; + } + { /* ULTRIX-32 V3.1 (Rev 9) vcc rejects this */ + const int foo = 10; + if (!foo) return 0; + } + return !cs[0] && !zero.x; +#endif + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_c_const=yes +else + ac_cv_c_const=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_const" >&5 +$as_echo "$ac_cv_c_const" >&6; } +if test $ac_cv_c_const = no; then + +$as_echo "#define const /**/" >>confdefs.h + +fi + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for inline" >&5 +$as_echo_n "checking for inline... " >&6; } +if ${ac_cv_c_inline+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_cv_c_inline=no +for ac_kw in inline __inline__ __inline; do + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#ifndef __cplusplus +typedef int foo_t; +static $ac_kw foo_t static_foo () {return 0; } +$ac_kw foo_t foo () {return 0; } +#endif + +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_c_inline=$ac_kw +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + test "$ac_cv_c_inline" != no && break +done + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_inline" >&5 +$as_echo "$ac_cv_c_inline" >&6; } + +case $ac_cv_c_inline in + inline | yes) ;; + *) + case $ac_cv_c_inline in + no) ac_val=;; + *) ac_val=$ac_cv_c_inline;; + esac + cat >>confdefs.h <<_ACEOF +#ifndef __cplusplus +#define inline $ac_val +#endif +_ACEOF + ;; +esac + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether time.h and sys/time.h may both be included" >&5 +$as_echo_n "checking whether time.h and sys/time.h may both be included... " >&6; } +if ${ac_cv_header_time+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +#include +#include + +int +main () +{ +if ((struct tm *) 0) +return 0; + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_header_time=yes +else + ac_cv_header_time=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_time" >&5 +$as_echo "$ac_cv_header_time" >&6; } +if test $ac_cv_header_time = yes; then + +$as_echo "#define TIME_WITH_SYS_TIME 1" >>confdefs.h + +fi + +ac_fn_c_check_type "$LINENO" "nfds_t" "ac_cv_type_nfds_t" "#include +" +if test "x$ac_cv_type_nfds_t" = xyes; then : + +$as_echo "#define POLL_NFDS_TYPE nfds_t" >>confdefs.h + +else + +$as_echo "#define POLL_NFDS_TYPE unsigned int" >>confdefs.h + +fi + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to enable ipv6" >&5 +$as_echo_n "checking whether to enable ipv6... " >&6; } + +if test "$cross_compiling" = yes; then : + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + ipv6=no +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + /* is AF_INET6 available? */ +#include +#include +main() +{ + if (socket(AF_INET6, SOCK_STREAM, 0) < 0) + exit(1); + else + exit(0); +} + +_ACEOF +if ac_fn_c_try_run "$LINENO"; then : + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + ipv6=yes +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + ipv6=no +fi +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ + conftest.$ac_objext conftest.beam conftest.$ac_ext +fi + + +if test x"$ipv6" = xyes; then + USEIPV6="-DZOO_IPV6_ENABLED" + +fi + +# Checks for library functions. +for ac_func in getcwd gethostbyname gethostname getlogin getpwuid_r gettimeofday getuid memmove memset poll socket strchr strdup strerror strtol +do : + as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` +ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var" +if eval test \"x\$"$as_ac_var"\" = x"yes"; then : + cat >>confdefs.h <<_ACEOF +#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 +_ACEOF + +fi +done + + +ac_config_files="$ac_config_files Makefile" + +cat >confcache <<\_ACEOF +# This file is a shell script that caches the results of configure +# tests run on this system so they can be shared between configure +# scripts and configure runs, see configure's option --config-cache. +# It is not useful on other systems. If it contains results you don't +# want to keep, you may remove or edit it. +# +# config.status only pays attention to the cache file if you give it +# the --recheck option to rerun configure. +# +# `ac_cv_env_foo' variables (set or unset) will be overridden when +# loading this file, other *unset* `ac_cv_foo' will be assigned the +# following values. + +_ACEOF + +# The following way of writing the cache mishandles newlines in values, +# but we know of no workaround that is simple, portable, and efficient. +# So, we kill variables containing newlines. +# Ultrix sh set writes to stderr and can't be redirected directly, +# and sets the high bit in the cache file unless we assign to the vars. +( + for ac_var in `(set) 2>&1 | sed -n 's/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'`; do + eval ac_val=\$$ac_var + case $ac_val in #( + *${as_nl}*) + case $ac_var in #( + *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 +$as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; + esac + case $ac_var in #( + _ | IFS | as_nl) ;; #( + BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( + *) { eval $ac_var=; unset $ac_var;} ;; + esac ;; + esac + done + + (set) 2>&1 | + case $as_nl`(ac_space=' '; set) 2>&1` in #( + *${as_nl}ac_space=\ *) + # `set' does not quote correctly, so add quotes: double-quote + # substitution turns \\\\ into \\, and sed turns \\ into \. + sed -n \ + "s/'/'\\\\''/g; + s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p" + ;; #( + *) + # `set' quotes correctly as required by POSIX, so do not add quotes. + sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" + ;; + esac | + sort +) | + sed ' + /^ac_cv_env_/b end + t clear + :clear + s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/ + t end + s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/ + :end' >>confcache +if diff "$cache_file" confcache >/dev/null 2>&1; then :; else + if test -w "$cache_file"; then + if test "x$cache_file" != "x/dev/null"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5 +$as_echo "$as_me: updating cache $cache_file" >&6;} + if test ! -f "$cache_file" || test -h "$cache_file"; then + cat confcache >"$cache_file" + else + case $cache_file in #( + */* | ?:*) + mv -f confcache "$cache_file"$$ && + mv -f "$cache_file"$$ "$cache_file" ;; #( + *) + mv -f confcache "$cache_file" ;; + esac + fi + fi + else + { $as_echo "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5 +$as_echo "$as_me: not updating unwritable cache $cache_file" >&6;} + fi +fi +rm -f confcache + +test "x$prefix" = xNONE && prefix=$ac_default_prefix +# Let make expand exec_prefix. +test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' + +DEFS=-DHAVE_CONFIG_H + +ac_libobjs= +ac_ltlibobjs= +U= +for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue + # 1. Remove the extension, and $U if already installed. + ac_script='s/\$U\././;s/\.o$//;s/\.obj$//' + ac_i=`$as_echo "$ac_i" | sed "$ac_script"` + # 2. Prepend LIBOBJDIR. When used with automake>=1.10 LIBOBJDIR + # will be set to the directory where LIBOBJS objects are built. + as_fn_append ac_libobjs " \${LIBOBJDIR}$ac_i\$U.$ac_objext" + as_fn_append ac_ltlibobjs " \${LIBOBJDIR}$ac_i"'$U.lo' +done +LIBOBJS=$ac_libobjs + +LTLIBOBJS=$ac_ltlibobjs + + +if test -z "${DX_COND_doc_TRUE}" && test -z "${DX_COND_doc_FALSE}"; then + as_fn_error $? "conditional \"DX_COND_doc\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${DX_COND_doc_TRUE}" && test -z "${DX_COND_doc_FALSE}"; then + as_fn_error $? "conditional \"DX_COND_doc\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${DX_COND_dot_TRUE}" && test -z "${DX_COND_dot_FALSE}"; then + as_fn_error $? "conditional \"DX_COND_dot\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${DX_COND_dot_TRUE}" && test -z "${DX_COND_dot_FALSE}"; then + as_fn_error $? "conditional \"DX_COND_dot\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${DX_COND_man_TRUE}" && test -z "${DX_COND_man_FALSE}"; then + as_fn_error $? "conditional \"DX_COND_man\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${DX_COND_man_TRUE}" && test -z "${DX_COND_man_FALSE}"; then + as_fn_error $? "conditional \"DX_COND_man\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${DX_COND_rtf_TRUE}" && test -z "${DX_COND_rtf_FALSE}"; then + as_fn_error $? "conditional \"DX_COND_rtf\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${DX_COND_rtf_TRUE}" && test -z "${DX_COND_rtf_FALSE}"; then + as_fn_error $? "conditional \"DX_COND_rtf\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${DX_COND_xml_TRUE}" && test -z "${DX_COND_xml_FALSE}"; then + as_fn_error $? "conditional \"DX_COND_xml\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${DX_COND_xml_TRUE}" && test -z "${DX_COND_xml_FALSE}"; then + as_fn_error $? "conditional \"DX_COND_xml\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${DX_COND_chm_TRUE}" && test -z "${DX_COND_chm_FALSE}"; then + as_fn_error $? "conditional \"DX_COND_chm\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${DX_COND_chm_TRUE}" && test -z "${DX_COND_chm_FALSE}"; then + as_fn_error $? "conditional \"DX_COND_chm\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${DX_COND_chi_TRUE}" && test -z "${DX_COND_chi_FALSE}"; then + as_fn_error $? "conditional \"DX_COND_chi\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${DX_COND_chi_TRUE}" && test -z "${DX_COND_chi_FALSE}"; then + as_fn_error $? "conditional \"DX_COND_chi\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${DX_COND_html_TRUE}" && test -z "${DX_COND_html_FALSE}"; then + as_fn_error $? "conditional \"DX_COND_html\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${DX_COND_html_TRUE}" && test -z "${DX_COND_html_FALSE}"; then + as_fn_error $? "conditional \"DX_COND_html\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${DX_COND_ps_TRUE}" && test -z "${DX_COND_ps_FALSE}"; then + as_fn_error $? "conditional \"DX_COND_ps\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${DX_COND_ps_TRUE}" && test -z "${DX_COND_ps_FALSE}"; then + as_fn_error $? "conditional \"DX_COND_ps\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${DX_COND_pdf_TRUE}" && test -z "${DX_COND_pdf_FALSE}"; then + as_fn_error $? "conditional \"DX_COND_pdf\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${DX_COND_pdf_TRUE}" && test -z "${DX_COND_pdf_FALSE}"; then + as_fn_error $? "conditional \"DX_COND_pdf\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${DX_COND_latex_TRUE}" && test -z "${DX_COND_latex_FALSE}"; then + as_fn_error $? "conditional \"DX_COND_latex\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${DX_COND_latex_TRUE}" && test -z "${DX_COND_latex_FALSE}"; then + as_fn_error $? "conditional \"DX_COND_latex\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi + if test -n "$EXEEXT"; then + am__EXEEXT_TRUE= + am__EXEEXT_FALSE='#' +else + am__EXEEXT_TRUE='#' + am__EXEEXT_FALSE= +fi + +if test -z "${AMDEP_TRUE}" && test -z "${AMDEP_FALSE}"; then + as_fn_error $? "conditional \"AMDEP\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${am__fastdepCC_TRUE}" && test -z "${am__fastdepCC_FALSE}"; then + as_fn_error $? "conditional \"am__fastdepCC\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${am__fastdepCXX_TRUE}" && test -z "${am__fastdepCXX_FALSE}"; then + as_fn_error $? "conditional \"am__fastdepCXX\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${WANT_SYNCAPI_TRUE}" && test -z "${WANT_SYNCAPI_FALSE}"; then + as_fn_error $? "conditional \"WANT_SYNCAPI\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi + +: "${CONFIG_STATUS=./config.status}" +ac_write_fail=0 +ac_clean_files_save=$ac_clean_files +ac_clean_files="$ac_clean_files $CONFIG_STATUS" +{ $as_echo "$as_me:${as_lineno-$LINENO}: creating $CONFIG_STATUS" >&5 +$as_echo "$as_me: creating $CONFIG_STATUS" >&6;} +as_write_fail=0 +cat >$CONFIG_STATUS <<_ASEOF || as_write_fail=1 +#! $SHELL +# Generated by $as_me. +# Run this file to recreate the current configuration. +# Compiler output produced by configure, useful for debugging +# configure, is in config.log if it exists. + +debug=false +ac_cs_recheck=false +ac_cs_silent=false + +SHELL=\${CONFIG_SHELL-$SHELL} +export SHELL +_ASEOF +cat >>$CONFIG_STATUS <<\_ASEOF || as_write_fail=1 +## -------------------- ## +## M4sh Initialization. ## +## -------------------- ## + +# Be more Bourne compatible +DUALCASE=1; export DUALCASE # for MKS sh +if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : + emulate sh + NULLCMD=: + # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which + # is contrary to our usage. Disable this feature. + alias -g '${1+"$@"}'='"$@"' + setopt NO_GLOB_SUBST +else + case `(set -o) 2>/dev/null` in #( + *posix*) : + set -o posix ;; #( + *) : + ;; +esac +fi + + +as_nl=' +' +export as_nl +# Printing a long string crashes Solaris 7 /usr/bin/printf. +as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' +as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo +as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo +# Prefer a ksh shell builtin over an external printf program on Solaris, +# but without wasting forks for bash or zsh. +if test -z "$BASH_VERSION$ZSH_VERSION" \ + && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then + as_echo='print -r --' + as_echo_n='print -rn --' +elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then + as_echo='printf %s\n' + as_echo_n='printf %s' +else + if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then + as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' + as_echo_n='/usr/ucb/echo -n' + else + as_echo_body='eval expr "X$1" : "X\\(.*\\)"' + as_echo_n_body='eval + arg=$1; + case $arg in #( + *"$as_nl"*) + expr "X$arg" : "X\\(.*\\)$as_nl"; + arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; + esac; + expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" + ' + export as_echo_n_body + as_echo_n='sh -c $as_echo_n_body as_echo' + fi + export as_echo_body + as_echo='sh -c $as_echo_body as_echo' +fi + +# The user is always right. +if test "${PATH_SEPARATOR+set}" != set; then + PATH_SEPARATOR=: + (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { + (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || + PATH_SEPARATOR=';' + } +fi + + +# IFS +# We need space, tab and new line, in precisely that order. Quoting is +# there to prevent editors from complaining about space-tab. +# (If _AS_PATH_WALK were called with IFS unset, it would disable word +# splitting by setting IFS to empty value.) +IFS=" "" $as_nl" + +# Find who we are. Look in the path if we contain no directory separator. +as_myself= +case $0 in #(( + *[\\/]* ) as_myself=$0 ;; + *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break + done +IFS=$as_save_IFS + + ;; +esac +# We did not find ourselves, most probably we were run as `sh COMMAND' +# in which case we are not to be found in the path. +if test "x$as_myself" = x; then + as_myself=$0 +fi +if test ! -f "$as_myself"; then + $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 + exit 1 +fi + +# Unset variables that we do not need and which cause bugs (e.g. in +# pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" +# suppresses any "Segmentation fault" message there. '((' could +# trigger a bug in pdksh 5.2.14. +for as_var in BASH_ENV ENV MAIL MAILPATH +do eval test x\${$as_var+set} = xset \ + && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : +done +PS1='$ ' +PS2='> ' +PS4='+ ' + +# NLS nuisances. +LC_ALL=C +export LC_ALL +LANGUAGE=C +export LANGUAGE + +# CDPATH. +(unset CDPATH) >/dev/null 2>&1 && unset CDPATH + + +# as_fn_error STATUS ERROR [LINENO LOG_FD] +# ---------------------------------------- +# Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are +# provided, also output the error to LOG_FD, referencing LINENO. Then exit the +# script with STATUS, using 1 if that was 0. +as_fn_error () +{ + as_status=$1; test $as_status -eq 0 && as_status=1 + if test "$4"; then + as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 + fi + $as_echo "$as_me: error: $2" >&2 + as_fn_exit $as_status +} # as_fn_error + + +# as_fn_set_status STATUS +# ----------------------- +# Set $? to STATUS, without forking. +as_fn_set_status () +{ + return $1 +} # as_fn_set_status + +# as_fn_exit STATUS +# ----------------- +# Exit the shell with STATUS, even in a "trap 0" or "set -e" context. +as_fn_exit () +{ + set +e + as_fn_set_status $1 + exit $1 +} # as_fn_exit + +# as_fn_unset VAR +# --------------- +# Portably unset VAR. +as_fn_unset () +{ + { eval $1=; unset $1;} +} +as_unset=as_fn_unset +# as_fn_append VAR VALUE +# ---------------------- +# Append the text in VALUE to the end of the definition contained in VAR. Take +# advantage of any shell optimizations that allow amortized linear growth over +# repeated appends, instead of the typical quadratic growth present in naive +# implementations. +if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : + eval 'as_fn_append () + { + eval $1+=\$2 + }' +else + as_fn_append () + { + eval $1=\$$1\$2 + } +fi # as_fn_append + +# as_fn_arith ARG... +# ------------------ +# Perform arithmetic evaluation on the ARGs, and store the result in the +# global $as_val. Take advantage of shells that can avoid forks. The arguments +# must be portable across $(()) and expr. +if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : + eval 'as_fn_arith () + { + as_val=$(( $* )) + }' +else + as_fn_arith () + { + as_val=`expr "$@" || test $? -eq 1` + } +fi # as_fn_arith + + +if expr a : '\(a\)' >/dev/null 2>&1 && + test "X`expr 00001 : '.*\(...\)'`" = X001; then + as_expr=expr +else + as_expr=false +fi + +if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then + as_basename=basename +else + as_basename=false +fi + +if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then + as_dirname=dirname +else + as_dirname=false +fi + +as_me=`$as_basename -- "$0" || +$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ + X"$0" : 'X\(//\)$' \| \ + X"$0" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X/"$0" | + sed '/^.*\/\([^/][^/]*\)\/*$/{ + s//\1/ + q + } + /^X\/\(\/\/\)$/{ + s//\1/ + q + } + /^X\/\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + +# Avoid depending upon Character Ranges. +as_cr_letters='abcdefghijklmnopqrstuvwxyz' +as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' +as_cr_Letters=$as_cr_letters$as_cr_LETTERS +as_cr_digits='0123456789' +as_cr_alnum=$as_cr_Letters$as_cr_digits + +ECHO_C= ECHO_N= ECHO_T= +case `echo -n x` in #((((( +-n*) + case `echo 'xy\c'` in + *c*) ECHO_T=' ';; # ECHO_T is single tab character. + xy) ECHO_C='\c';; + *) echo `echo ksh88 bug on AIX 6.1` > /dev/null + ECHO_T=' ';; + esac;; +*) + ECHO_N='-n';; +esac + +rm -f conf$$ conf$$.exe conf$$.file +if test -d conf$$.dir; then + rm -f conf$$.dir/conf$$.file +else + rm -f conf$$.dir + mkdir conf$$.dir 2>/dev/null +fi +if (echo >conf$$.file) 2>/dev/null; then + if ln -s conf$$.file conf$$ 2>/dev/null; then + as_ln_s='ln -s' + # ... but there are two gotchas: + # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. + # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. + # In both cases, we have to default to `cp -pR'. + ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || + as_ln_s='cp -pR' + elif ln conf$$.file conf$$ 2>/dev/null; then + as_ln_s=ln + else + as_ln_s='cp -pR' + fi +else + as_ln_s='cp -pR' +fi +rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file +rmdir conf$$.dir 2>/dev/null + + +# as_fn_mkdir_p +# ------------- +# Create "$as_dir" as a directory, including parents if necessary. +as_fn_mkdir_p () +{ + + case $as_dir in #( + -*) as_dir=./$as_dir;; + esac + test -d "$as_dir" || eval $as_mkdir_p || { + as_dirs= + while :; do + case $as_dir in #( + *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( + *) as_qdir=$as_dir;; + esac + as_dirs="'$as_qdir' $as_dirs" + as_dir=`$as_dirname -- "$as_dir" || +$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$as_dir" : 'X\(//\)[^/]' \| \ + X"$as_dir" : 'X\(//\)$' \| \ + X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$as_dir" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + test -d "$as_dir" && break + done + test -z "$as_dirs" || eval "mkdir $as_dirs" + } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" + + +} # as_fn_mkdir_p +if mkdir -p . 2>/dev/null; then + as_mkdir_p='mkdir -p "$as_dir"' +else + test -d ./-p && rmdir ./-p + as_mkdir_p=false +fi + + +# as_fn_executable_p FILE +# ----------------------- +# Test if FILE is an executable regular file. +as_fn_executable_p () +{ + test -f "$1" && test -x "$1" +} # as_fn_executable_p +as_test_x='test -x' +as_executable_p=as_fn_executable_p + +# Sed expression to map a string onto a valid CPP name. +as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" + +# Sed expression to map a string onto a valid variable name. +as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" + + +exec 6>&1 +## ----------------------------------- ## +## Main body of $CONFIG_STATUS script. ## +## ----------------------------------- ## +_ASEOF +test $as_write_fail = 0 && chmod +x $CONFIG_STATUS || ac_write_fail=1 + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +# Save the log message, to keep $0 and so on meaningful, and to +# report actual input values of CONFIG_FILES etc. instead of their +# values after options handling. +ac_log=" +This file was extended by zookeeper C client $as_me 3.4.6, which was +generated by GNU Autoconf 2.69. Invocation command line was + + CONFIG_FILES = $CONFIG_FILES + CONFIG_HEADERS = $CONFIG_HEADERS + CONFIG_LINKS = $CONFIG_LINKS + CONFIG_COMMANDS = $CONFIG_COMMANDS + $ $0 $@ + +on `(hostname || uname -n) 2>/dev/null | sed 1q` +" + +_ACEOF + +case $ac_config_files in *" +"*) set x $ac_config_files; shift; ac_config_files=$*;; +esac + +case $ac_config_headers in *" +"*) set x $ac_config_headers; shift; ac_config_headers=$*;; +esac + + +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +# Files that config.status was made for. +config_files="$ac_config_files" +config_headers="$ac_config_headers" +config_commands="$ac_config_commands" + +_ACEOF + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +ac_cs_usage="\ +\`$as_me' instantiates files and other configuration actions +from templates according to the current configuration. Unless the files +and actions are specified as TAGs, all are instantiated by default. + +Usage: $0 [OPTION]... [TAG]... + + -h, --help print this help, then exit + -V, --version print version number and configuration settings, then exit + --config print configuration, then exit + -q, --quiet, --silent + do not print progress messages + -d, --debug don't remove temporary files + --recheck update $as_me by reconfiguring in the same conditions + --file=FILE[:TEMPLATE] + instantiate the configuration file FILE + --header=FILE[:TEMPLATE] + instantiate the configuration header FILE + +Configuration files: +$config_files + +Configuration headers: +$config_headers + +Configuration commands: +$config_commands + +Report bugs to ." + +_ACEOF +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" +ac_cs_version="\\ +zookeeper C client config.status 3.4.6 +configured by $0, generated by GNU Autoconf 2.69, + with options \\"\$ac_cs_config\\" + +Copyright (C) 2012 Free Software Foundation, Inc. +This config.status script is free software; the Free Software Foundation +gives unlimited permission to copy, distribute and modify it." + +ac_pwd='$ac_pwd' +srcdir='$srcdir' +INSTALL='$INSTALL' +MKDIR_P='$MKDIR_P' +AWK='$AWK' +test -n "\$AWK" || AWK=awk +_ACEOF + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +# The default lists apply if the user does not specify any file. +ac_need_defaults=: +while test $# != 0 +do + case $1 in + --*=?*) + ac_option=`expr "X$1" : 'X\([^=]*\)='` + ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'` + ac_shift=: + ;; + --*=) + ac_option=`expr "X$1" : 'X\([^=]*\)='` + ac_optarg= + ac_shift=: + ;; + *) + ac_option=$1 + ac_optarg=$2 + ac_shift=shift + ;; + esac + + case $ac_option in + # Handling of the options. + -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) + ac_cs_recheck=: ;; + --version | --versio | --versi | --vers | --ver | --ve | --v | -V ) + $as_echo "$ac_cs_version"; exit ;; + --config | --confi | --conf | --con | --co | --c ) + $as_echo "$ac_cs_config"; exit ;; + --debug | --debu | --deb | --de | --d | -d ) + debug=: ;; + --file | --fil | --fi | --f ) + $ac_shift + case $ac_optarg in + *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; + '') as_fn_error $? "missing file argument" ;; + esac + as_fn_append CONFIG_FILES " '$ac_optarg'" + ac_need_defaults=false;; + --header | --heade | --head | --hea ) + $ac_shift + case $ac_optarg in + *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; + esac + as_fn_append CONFIG_HEADERS " '$ac_optarg'" + ac_need_defaults=false;; + --he | --h) + # Conflict between --help and --header + as_fn_error $? "ambiguous option: \`$1' +Try \`$0 --help' for more information.";; + --help | --hel | -h ) + $as_echo "$ac_cs_usage"; exit ;; + -q | -quiet | --quiet | --quie | --qui | --qu | --q \ + | -silent | --silent | --silen | --sile | --sil | --si | --s) + ac_cs_silent=: ;; + + # This is an error. + -*) as_fn_error $? "unrecognized option: \`$1' +Try \`$0 --help' for more information." ;; + + *) as_fn_append ac_config_targets " $1" + ac_need_defaults=false ;; + + esac + shift +done + +ac_configure_extra_args= + +if $ac_cs_silent; then + exec 6>/dev/null + ac_configure_extra_args="$ac_configure_extra_args --silent" +fi + +_ACEOF +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +if \$ac_cs_recheck; then + set X $SHELL '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion + shift + \$as_echo "running CONFIG_SHELL=$SHELL \$*" >&6 + CONFIG_SHELL='$SHELL' + export CONFIG_SHELL + exec "\$@" +fi + +_ACEOF +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +exec 5>>config.log +{ + echo + sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX +## Running $as_me. ## +_ASBOX + $as_echo "$ac_log" +} >&5 + +_ACEOF +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +# +# INIT-COMMANDS +# +AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir" + + +# The HP-UX ksh and POSIX shell print the target directory to stdout +# if CDPATH is set. +(unset CDPATH) >/dev/null 2>&1 && unset CDPATH + +sed_quote_subst='$sed_quote_subst' +double_quote_subst='$double_quote_subst' +delay_variable_subst='$delay_variable_subst' +macro_version='`$ECHO "$macro_version" | $SED "$delay_single_quote_subst"`' +macro_revision='`$ECHO "$macro_revision" | $SED "$delay_single_quote_subst"`' +enable_shared='`$ECHO "$enable_shared" | $SED "$delay_single_quote_subst"`' +enable_static='`$ECHO "$enable_static" | $SED "$delay_single_quote_subst"`' +pic_mode='`$ECHO "$pic_mode" | $SED "$delay_single_quote_subst"`' +enable_fast_install='`$ECHO "$enable_fast_install" | $SED "$delay_single_quote_subst"`' +SHELL='`$ECHO "$SHELL" | $SED "$delay_single_quote_subst"`' +ECHO='`$ECHO "$ECHO" | $SED "$delay_single_quote_subst"`' +PATH_SEPARATOR='`$ECHO "$PATH_SEPARATOR" | $SED "$delay_single_quote_subst"`' +host_alias='`$ECHO "$host_alias" | $SED "$delay_single_quote_subst"`' +host='`$ECHO "$host" | $SED "$delay_single_quote_subst"`' +host_os='`$ECHO "$host_os" | $SED "$delay_single_quote_subst"`' +build_alias='`$ECHO "$build_alias" | $SED "$delay_single_quote_subst"`' +build='`$ECHO "$build" | $SED "$delay_single_quote_subst"`' +build_os='`$ECHO "$build_os" | $SED "$delay_single_quote_subst"`' +SED='`$ECHO "$SED" | $SED "$delay_single_quote_subst"`' +Xsed='`$ECHO "$Xsed" | $SED "$delay_single_quote_subst"`' +GREP='`$ECHO "$GREP" | $SED "$delay_single_quote_subst"`' +EGREP='`$ECHO "$EGREP" | $SED "$delay_single_quote_subst"`' +FGREP='`$ECHO "$FGREP" | $SED "$delay_single_quote_subst"`' +LD='`$ECHO "$LD" | $SED "$delay_single_quote_subst"`' +NM='`$ECHO "$NM" | $SED "$delay_single_quote_subst"`' +LN_S='`$ECHO "$LN_S" | $SED "$delay_single_quote_subst"`' +max_cmd_len='`$ECHO "$max_cmd_len" | $SED "$delay_single_quote_subst"`' +ac_objext='`$ECHO "$ac_objext" | $SED "$delay_single_quote_subst"`' +exeext='`$ECHO "$exeext" | $SED "$delay_single_quote_subst"`' +lt_unset='`$ECHO "$lt_unset" | $SED "$delay_single_quote_subst"`' +lt_SP2NL='`$ECHO "$lt_SP2NL" | $SED "$delay_single_quote_subst"`' +lt_NL2SP='`$ECHO "$lt_NL2SP" | $SED "$delay_single_quote_subst"`' +lt_cv_to_host_file_cmd='`$ECHO "$lt_cv_to_host_file_cmd" | $SED "$delay_single_quote_subst"`' +lt_cv_to_tool_file_cmd='`$ECHO "$lt_cv_to_tool_file_cmd" | $SED "$delay_single_quote_subst"`' +reload_flag='`$ECHO "$reload_flag" | $SED "$delay_single_quote_subst"`' +reload_cmds='`$ECHO "$reload_cmds" | $SED "$delay_single_quote_subst"`' +OBJDUMP='`$ECHO "$OBJDUMP" | $SED "$delay_single_quote_subst"`' +deplibs_check_method='`$ECHO "$deplibs_check_method" | $SED "$delay_single_quote_subst"`' +file_magic_cmd='`$ECHO "$file_magic_cmd" | $SED "$delay_single_quote_subst"`' +file_magic_glob='`$ECHO "$file_magic_glob" | $SED "$delay_single_quote_subst"`' +want_nocaseglob='`$ECHO "$want_nocaseglob" | $SED "$delay_single_quote_subst"`' +DLLTOOL='`$ECHO "$DLLTOOL" | $SED "$delay_single_quote_subst"`' +sharedlib_from_linklib_cmd='`$ECHO "$sharedlib_from_linklib_cmd" | $SED "$delay_single_quote_subst"`' +AR='`$ECHO "$AR" | $SED "$delay_single_quote_subst"`' +AR_FLAGS='`$ECHO "$AR_FLAGS" | $SED "$delay_single_quote_subst"`' +archiver_list_spec='`$ECHO "$archiver_list_spec" | $SED "$delay_single_quote_subst"`' +STRIP='`$ECHO "$STRIP" | $SED "$delay_single_quote_subst"`' +RANLIB='`$ECHO "$RANLIB" | $SED "$delay_single_quote_subst"`' +old_postinstall_cmds='`$ECHO "$old_postinstall_cmds" | $SED "$delay_single_quote_subst"`' +old_postuninstall_cmds='`$ECHO "$old_postuninstall_cmds" | $SED "$delay_single_quote_subst"`' +old_archive_cmds='`$ECHO "$old_archive_cmds" | $SED "$delay_single_quote_subst"`' +lock_old_archive_extraction='`$ECHO "$lock_old_archive_extraction" | $SED "$delay_single_quote_subst"`' +CC='`$ECHO "$CC" | $SED "$delay_single_quote_subst"`' +CFLAGS='`$ECHO "$CFLAGS" | $SED "$delay_single_quote_subst"`' +compiler='`$ECHO "$compiler" | $SED "$delay_single_quote_subst"`' +GCC='`$ECHO "$GCC" | $SED "$delay_single_quote_subst"`' +lt_cv_sys_global_symbol_pipe='`$ECHO "$lt_cv_sys_global_symbol_pipe" | $SED "$delay_single_quote_subst"`' +lt_cv_sys_global_symbol_to_cdecl='`$ECHO "$lt_cv_sys_global_symbol_to_cdecl" | $SED "$delay_single_quote_subst"`' +lt_cv_sys_global_symbol_to_c_name_address='`$ECHO "$lt_cv_sys_global_symbol_to_c_name_address" | $SED "$delay_single_quote_subst"`' +lt_cv_sys_global_symbol_to_c_name_address_lib_prefix='`$ECHO "$lt_cv_sys_global_symbol_to_c_name_address_lib_prefix" | $SED "$delay_single_quote_subst"`' +nm_file_list_spec='`$ECHO "$nm_file_list_spec" | $SED "$delay_single_quote_subst"`' +lt_sysroot='`$ECHO "$lt_sysroot" | $SED "$delay_single_quote_subst"`' +objdir='`$ECHO "$objdir" | $SED "$delay_single_quote_subst"`' +MAGIC_CMD='`$ECHO "$MAGIC_CMD" | $SED "$delay_single_quote_subst"`' +lt_prog_compiler_no_builtin_flag='`$ECHO "$lt_prog_compiler_no_builtin_flag" | $SED "$delay_single_quote_subst"`' +lt_prog_compiler_pic='`$ECHO "$lt_prog_compiler_pic" | $SED "$delay_single_quote_subst"`' +lt_prog_compiler_wl='`$ECHO "$lt_prog_compiler_wl" | $SED "$delay_single_quote_subst"`' +lt_prog_compiler_static='`$ECHO "$lt_prog_compiler_static" | $SED "$delay_single_quote_subst"`' +lt_cv_prog_compiler_c_o='`$ECHO "$lt_cv_prog_compiler_c_o" | $SED "$delay_single_quote_subst"`' +need_locks='`$ECHO "$need_locks" | $SED "$delay_single_quote_subst"`' +MANIFEST_TOOL='`$ECHO "$MANIFEST_TOOL" | $SED "$delay_single_quote_subst"`' +DSYMUTIL='`$ECHO "$DSYMUTIL" | $SED "$delay_single_quote_subst"`' +NMEDIT='`$ECHO "$NMEDIT" | $SED "$delay_single_quote_subst"`' +LIPO='`$ECHO "$LIPO" | $SED "$delay_single_quote_subst"`' +OTOOL='`$ECHO "$OTOOL" | $SED "$delay_single_quote_subst"`' +OTOOL64='`$ECHO "$OTOOL64" | $SED "$delay_single_quote_subst"`' +libext='`$ECHO "$libext" | $SED "$delay_single_quote_subst"`' +shrext_cmds='`$ECHO "$shrext_cmds" | $SED "$delay_single_quote_subst"`' +extract_expsyms_cmds='`$ECHO "$extract_expsyms_cmds" | $SED "$delay_single_quote_subst"`' +archive_cmds_need_lc='`$ECHO "$archive_cmds_need_lc" | $SED "$delay_single_quote_subst"`' +enable_shared_with_static_runtimes='`$ECHO "$enable_shared_with_static_runtimes" | $SED "$delay_single_quote_subst"`' +export_dynamic_flag_spec='`$ECHO "$export_dynamic_flag_spec" | $SED "$delay_single_quote_subst"`' +whole_archive_flag_spec='`$ECHO "$whole_archive_flag_spec" | $SED "$delay_single_quote_subst"`' +compiler_needs_object='`$ECHO "$compiler_needs_object" | $SED "$delay_single_quote_subst"`' +old_archive_from_new_cmds='`$ECHO "$old_archive_from_new_cmds" | $SED "$delay_single_quote_subst"`' +old_archive_from_expsyms_cmds='`$ECHO "$old_archive_from_expsyms_cmds" | $SED "$delay_single_quote_subst"`' +archive_cmds='`$ECHO "$archive_cmds" | $SED "$delay_single_quote_subst"`' +archive_expsym_cmds='`$ECHO "$archive_expsym_cmds" | $SED "$delay_single_quote_subst"`' +module_cmds='`$ECHO "$module_cmds" | $SED "$delay_single_quote_subst"`' +module_expsym_cmds='`$ECHO "$module_expsym_cmds" | $SED "$delay_single_quote_subst"`' +with_gnu_ld='`$ECHO "$with_gnu_ld" | $SED "$delay_single_quote_subst"`' +allow_undefined_flag='`$ECHO "$allow_undefined_flag" | $SED "$delay_single_quote_subst"`' +no_undefined_flag='`$ECHO "$no_undefined_flag" | $SED "$delay_single_quote_subst"`' +hardcode_libdir_flag_spec='`$ECHO "$hardcode_libdir_flag_spec" | $SED "$delay_single_quote_subst"`' +hardcode_libdir_separator='`$ECHO "$hardcode_libdir_separator" | $SED "$delay_single_quote_subst"`' +hardcode_direct='`$ECHO "$hardcode_direct" | $SED "$delay_single_quote_subst"`' +hardcode_direct_absolute='`$ECHO "$hardcode_direct_absolute" | $SED "$delay_single_quote_subst"`' +hardcode_minus_L='`$ECHO "$hardcode_minus_L" | $SED "$delay_single_quote_subst"`' +hardcode_shlibpath_var='`$ECHO "$hardcode_shlibpath_var" | $SED "$delay_single_quote_subst"`' +hardcode_automatic='`$ECHO "$hardcode_automatic" | $SED "$delay_single_quote_subst"`' +inherit_rpath='`$ECHO "$inherit_rpath" | $SED "$delay_single_quote_subst"`' +link_all_deplibs='`$ECHO "$link_all_deplibs" | $SED "$delay_single_quote_subst"`' +always_export_symbols='`$ECHO "$always_export_symbols" | $SED "$delay_single_quote_subst"`' +export_symbols_cmds='`$ECHO "$export_symbols_cmds" | $SED "$delay_single_quote_subst"`' +exclude_expsyms='`$ECHO "$exclude_expsyms" | $SED "$delay_single_quote_subst"`' +include_expsyms='`$ECHO "$include_expsyms" | $SED "$delay_single_quote_subst"`' +prelink_cmds='`$ECHO "$prelink_cmds" | $SED "$delay_single_quote_subst"`' +postlink_cmds='`$ECHO "$postlink_cmds" | $SED "$delay_single_quote_subst"`' +file_list_spec='`$ECHO "$file_list_spec" | $SED "$delay_single_quote_subst"`' +variables_saved_for_relink='`$ECHO "$variables_saved_for_relink" | $SED "$delay_single_quote_subst"`' +need_lib_prefix='`$ECHO "$need_lib_prefix" | $SED "$delay_single_quote_subst"`' +need_version='`$ECHO "$need_version" | $SED "$delay_single_quote_subst"`' +version_type='`$ECHO "$version_type" | $SED "$delay_single_quote_subst"`' +runpath_var='`$ECHO "$runpath_var" | $SED "$delay_single_quote_subst"`' +shlibpath_var='`$ECHO "$shlibpath_var" | $SED "$delay_single_quote_subst"`' +shlibpath_overrides_runpath='`$ECHO "$shlibpath_overrides_runpath" | $SED "$delay_single_quote_subst"`' +libname_spec='`$ECHO "$libname_spec" | $SED "$delay_single_quote_subst"`' +library_names_spec='`$ECHO "$library_names_spec" | $SED "$delay_single_quote_subst"`' +soname_spec='`$ECHO "$soname_spec" | $SED "$delay_single_quote_subst"`' +install_override_mode='`$ECHO "$install_override_mode" | $SED "$delay_single_quote_subst"`' +postinstall_cmds='`$ECHO "$postinstall_cmds" | $SED "$delay_single_quote_subst"`' +postuninstall_cmds='`$ECHO "$postuninstall_cmds" | $SED "$delay_single_quote_subst"`' +finish_cmds='`$ECHO "$finish_cmds" | $SED "$delay_single_quote_subst"`' +finish_eval='`$ECHO "$finish_eval" | $SED "$delay_single_quote_subst"`' +hardcode_into_libs='`$ECHO "$hardcode_into_libs" | $SED "$delay_single_quote_subst"`' +sys_lib_search_path_spec='`$ECHO "$sys_lib_search_path_spec" | $SED "$delay_single_quote_subst"`' +sys_lib_dlsearch_path_spec='`$ECHO "$sys_lib_dlsearch_path_spec" | $SED "$delay_single_quote_subst"`' +hardcode_action='`$ECHO "$hardcode_action" | $SED "$delay_single_quote_subst"`' +enable_dlopen='`$ECHO "$enable_dlopen" | $SED "$delay_single_quote_subst"`' +enable_dlopen_self='`$ECHO "$enable_dlopen_self" | $SED "$delay_single_quote_subst"`' +enable_dlopen_self_static='`$ECHO "$enable_dlopen_self_static" | $SED "$delay_single_quote_subst"`' +old_striplib='`$ECHO "$old_striplib" | $SED "$delay_single_quote_subst"`' +striplib='`$ECHO "$striplib" | $SED "$delay_single_quote_subst"`' +compiler_lib_search_dirs='`$ECHO "$compiler_lib_search_dirs" | $SED "$delay_single_quote_subst"`' +predep_objects='`$ECHO "$predep_objects" | $SED "$delay_single_quote_subst"`' +postdep_objects='`$ECHO "$postdep_objects" | $SED "$delay_single_quote_subst"`' +predeps='`$ECHO "$predeps" | $SED "$delay_single_quote_subst"`' +postdeps='`$ECHO "$postdeps" | $SED "$delay_single_quote_subst"`' +compiler_lib_search_path='`$ECHO "$compiler_lib_search_path" | $SED "$delay_single_quote_subst"`' +LD_CXX='`$ECHO "$LD_CXX" | $SED "$delay_single_quote_subst"`' +reload_flag_CXX='`$ECHO "$reload_flag_CXX" | $SED "$delay_single_quote_subst"`' +reload_cmds_CXX='`$ECHO "$reload_cmds_CXX" | $SED "$delay_single_quote_subst"`' +old_archive_cmds_CXX='`$ECHO "$old_archive_cmds_CXX" | $SED "$delay_single_quote_subst"`' +compiler_CXX='`$ECHO "$compiler_CXX" | $SED "$delay_single_quote_subst"`' +GCC_CXX='`$ECHO "$GCC_CXX" | $SED "$delay_single_quote_subst"`' +lt_prog_compiler_no_builtin_flag_CXX='`$ECHO "$lt_prog_compiler_no_builtin_flag_CXX" | $SED "$delay_single_quote_subst"`' +lt_prog_compiler_pic_CXX='`$ECHO "$lt_prog_compiler_pic_CXX" | $SED "$delay_single_quote_subst"`' +lt_prog_compiler_wl_CXX='`$ECHO "$lt_prog_compiler_wl_CXX" | $SED "$delay_single_quote_subst"`' +lt_prog_compiler_static_CXX='`$ECHO "$lt_prog_compiler_static_CXX" | $SED "$delay_single_quote_subst"`' +lt_cv_prog_compiler_c_o_CXX='`$ECHO "$lt_cv_prog_compiler_c_o_CXX" | $SED "$delay_single_quote_subst"`' +archive_cmds_need_lc_CXX='`$ECHO "$archive_cmds_need_lc_CXX" | $SED "$delay_single_quote_subst"`' +enable_shared_with_static_runtimes_CXX='`$ECHO "$enable_shared_with_static_runtimes_CXX" | $SED "$delay_single_quote_subst"`' +export_dynamic_flag_spec_CXX='`$ECHO "$export_dynamic_flag_spec_CXX" | $SED "$delay_single_quote_subst"`' +whole_archive_flag_spec_CXX='`$ECHO "$whole_archive_flag_spec_CXX" | $SED "$delay_single_quote_subst"`' +compiler_needs_object_CXX='`$ECHO "$compiler_needs_object_CXX" | $SED "$delay_single_quote_subst"`' +old_archive_from_new_cmds_CXX='`$ECHO "$old_archive_from_new_cmds_CXX" | $SED "$delay_single_quote_subst"`' +old_archive_from_expsyms_cmds_CXX='`$ECHO "$old_archive_from_expsyms_cmds_CXX" | $SED "$delay_single_quote_subst"`' +archive_cmds_CXX='`$ECHO "$archive_cmds_CXX" | $SED "$delay_single_quote_subst"`' +archive_expsym_cmds_CXX='`$ECHO "$archive_expsym_cmds_CXX" | $SED "$delay_single_quote_subst"`' +module_cmds_CXX='`$ECHO "$module_cmds_CXX" | $SED "$delay_single_quote_subst"`' +module_expsym_cmds_CXX='`$ECHO "$module_expsym_cmds_CXX" | $SED "$delay_single_quote_subst"`' +with_gnu_ld_CXX='`$ECHO "$with_gnu_ld_CXX" | $SED "$delay_single_quote_subst"`' +allow_undefined_flag_CXX='`$ECHO "$allow_undefined_flag_CXX" | $SED "$delay_single_quote_subst"`' +no_undefined_flag_CXX='`$ECHO "$no_undefined_flag_CXX" | $SED "$delay_single_quote_subst"`' +hardcode_libdir_flag_spec_CXX='`$ECHO "$hardcode_libdir_flag_spec_CXX" | $SED "$delay_single_quote_subst"`' +hardcode_libdir_separator_CXX='`$ECHO "$hardcode_libdir_separator_CXX" | $SED "$delay_single_quote_subst"`' +hardcode_direct_CXX='`$ECHO "$hardcode_direct_CXX" | $SED "$delay_single_quote_subst"`' +hardcode_direct_absolute_CXX='`$ECHO "$hardcode_direct_absolute_CXX" | $SED "$delay_single_quote_subst"`' +hardcode_minus_L_CXX='`$ECHO "$hardcode_minus_L_CXX" | $SED "$delay_single_quote_subst"`' +hardcode_shlibpath_var_CXX='`$ECHO "$hardcode_shlibpath_var_CXX" | $SED "$delay_single_quote_subst"`' +hardcode_automatic_CXX='`$ECHO "$hardcode_automatic_CXX" | $SED "$delay_single_quote_subst"`' +inherit_rpath_CXX='`$ECHO "$inherit_rpath_CXX" | $SED "$delay_single_quote_subst"`' +link_all_deplibs_CXX='`$ECHO "$link_all_deplibs_CXX" | $SED "$delay_single_quote_subst"`' +always_export_symbols_CXX='`$ECHO "$always_export_symbols_CXX" | $SED "$delay_single_quote_subst"`' +export_symbols_cmds_CXX='`$ECHO "$export_symbols_cmds_CXX" | $SED "$delay_single_quote_subst"`' +exclude_expsyms_CXX='`$ECHO "$exclude_expsyms_CXX" | $SED "$delay_single_quote_subst"`' +include_expsyms_CXX='`$ECHO "$include_expsyms_CXX" | $SED "$delay_single_quote_subst"`' +prelink_cmds_CXX='`$ECHO "$prelink_cmds_CXX" | $SED "$delay_single_quote_subst"`' +postlink_cmds_CXX='`$ECHO "$postlink_cmds_CXX" | $SED "$delay_single_quote_subst"`' +file_list_spec_CXX='`$ECHO "$file_list_spec_CXX" | $SED "$delay_single_quote_subst"`' +hardcode_action_CXX='`$ECHO "$hardcode_action_CXX" | $SED "$delay_single_quote_subst"`' +compiler_lib_search_dirs_CXX='`$ECHO "$compiler_lib_search_dirs_CXX" | $SED "$delay_single_quote_subst"`' +predep_objects_CXX='`$ECHO "$predep_objects_CXX" | $SED "$delay_single_quote_subst"`' +postdep_objects_CXX='`$ECHO "$postdep_objects_CXX" | $SED "$delay_single_quote_subst"`' +predeps_CXX='`$ECHO "$predeps_CXX" | $SED "$delay_single_quote_subst"`' +postdeps_CXX='`$ECHO "$postdeps_CXX" | $SED "$delay_single_quote_subst"`' +compiler_lib_search_path_CXX='`$ECHO "$compiler_lib_search_path_CXX" | $SED "$delay_single_quote_subst"`' + +LTCC='$LTCC' +LTCFLAGS='$LTCFLAGS' +compiler='$compiler_DEFAULT' + +# A function that is used when there is no print builtin or printf. +func_fallback_echo () +{ + eval 'cat <<_LTECHO_EOF +\$1 +_LTECHO_EOF' +} + +# Quote evaled strings. +for var in SHELL \ +ECHO \ +PATH_SEPARATOR \ +SED \ +GREP \ +EGREP \ +FGREP \ +LD \ +NM \ +LN_S \ +lt_SP2NL \ +lt_NL2SP \ +reload_flag \ +OBJDUMP \ +deplibs_check_method \ +file_magic_cmd \ +file_magic_glob \ +want_nocaseglob \ +DLLTOOL \ +sharedlib_from_linklib_cmd \ +AR \ +AR_FLAGS \ +archiver_list_spec \ +STRIP \ +RANLIB \ +CC \ +CFLAGS \ +compiler \ +lt_cv_sys_global_symbol_pipe \ +lt_cv_sys_global_symbol_to_cdecl \ +lt_cv_sys_global_symbol_to_c_name_address \ +lt_cv_sys_global_symbol_to_c_name_address_lib_prefix \ +nm_file_list_spec \ +lt_prog_compiler_no_builtin_flag \ +lt_prog_compiler_pic \ +lt_prog_compiler_wl \ +lt_prog_compiler_static \ +lt_cv_prog_compiler_c_o \ +need_locks \ +MANIFEST_TOOL \ +DSYMUTIL \ +NMEDIT \ +LIPO \ +OTOOL \ +OTOOL64 \ +shrext_cmds \ +export_dynamic_flag_spec \ +whole_archive_flag_spec \ +compiler_needs_object \ +with_gnu_ld \ +allow_undefined_flag \ +no_undefined_flag \ +hardcode_libdir_flag_spec \ +hardcode_libdir_separator \ +exclude_expsyms \ +include_expsyms \ +file_list_spec \ +variables_saved_for_relink \ +libname_spec \ +library_names_spec \ +soname_spec \ +install_override_mode \ +finish_eval \ +old_striplib \ +striplib \ +compiler_lib_search_dirs \ +predep_objects \ +postdep_objects \ +predeps \ +postdeps \ +compiler_lib_search_path \ +LD_CXX \ +reload_flag_CXX \ +compiler_CXX \ +lt_prog_compiler_no_builtin_flag_CXX \ +lt_prog_compiler_pic_CXX \ +lt_prog_compiler_wl_CXX \ +lt_prog_compiler_static_CXX \ +lt_cv_prog_compiler_c_o_CXX \ +export_dynamic_flag_spec_CXX \ +whole_archive_flag_spec_CXX \ +compiler_needs_object_CXX \ +with_gnu_ld_CXX \ +allow_undefined_flag_CXX \ +no_undefined_flag_CXX \ +hardcode_libdir_flag_spec_CXX \ +hardcode_libdir_separator_CXX \ +exclude_expsyms_CXX \ +include_expsyms_CXX \ +file_list_spec_CXX \ +compiler_lib_search_dirs_CXX \ +predep_objects_CXX \ +postdep_objects_CXX \ +predeps_CXX \ +postdeps_CXX \ +compiler_lib_search_path_CXX; do + case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in + *[\\\\\\\`\\"\\\$]*) + eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED \\"\\\$sed_quote_subst\\"\\\`\\\\\\"" + ;; + *) + eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\"" + ;; + esac +done + +# Double-quote double-evaled strings. +for var in reload_cmds \ +old_postinstall_cmds \ +old_postuninstall_cmds \ +old_archive_cmds \ +extract_expsyms_cmds \ +old_archive_from_new_cmds \ +old_archive_from_expsyms_cmds \ +archive_cmds \ +archive_expsym_cmds \ +module_cmds \ +module_expsym_cmds \ +export_symbols_cmds \ +prelink_cmds \ +postlink_cmds \ +postinstall_cmds \ +postuninstall_cmds \ +finish_cmds \ +sys_lib_search_path_spec \ +sys_lib_dlsearch_path_spec \ +reload_cmds_CXX \ +old_archive_cmds_CXX \ +old_archive_from_new_cmds_CXX \ +old_archive_from_expsyms_cmds_CXX \ +archive_cmds_CXX \ +archive_expsym_cmds_CXX \ +module_cmds_CXX \ +module_expsym_cmds_CXX \ +export_symbols_cmds_CXX \ +prelink_cmds_CXX \ +postlink_cmds_CXX; do + case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in + *[\\\\\\\`\\"\\\$]*) + eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED -e \\"\\\$double_quote_subst\\" -e \\"\\\$sed_quote_subst\\" -e \\"\\\$delay_variable_subst\\"\\\`\\\\\\"" + ;; + *) + eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\"" + ;; + esac +done + +ac_aux_dir='$ac_aux_dir' +xsi_shell='$xsi_shell' +lt_shell_append='$lt_shell_append' + +# See if we are running on zsh, and set the options which allow our +# commands through without removal of \ escapes INIT. +if test -n "\${ZSH_VERSION+set}" ; then + setopt NO_GLOB_SUBST +fi + + + PACKAGE='$PACKAGE' + VERSION='$VERSION' + TIMESTAMP='$TIMESTAMP' + RM='$RM' + ofile='$ofile' + + + + + + +_ACEOF + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 + +# Handling of arguments. +for ac_config_target in $ac_config_targets +do + case $ac_config_target in + "config.h") CONFIG_HEADERS="$CONFIG_HEADERS config.h" ;; + "depfiles") CONFIG_COMMANDS="$CONFIG_COMMANDS depfiles" ;; + "libtool") CONFIG_COMMANDS="$CONFIG_COMMANDS libtool" ;; + "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;; + + *) as_fn_error $? "invalid argument: \`$ac_config_target'" "$LINENO" 5;; + esac +done + + +# If the user did not use the arguments to specify the items to instantiate, +# then the envvar interface is used. Set only those that are not. +# We use the long form for the default assignment because of an extremely +# bizarre bug on SunOS 4.1.3. +if $ac_need_defaults; then + test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files + test "${CONFIG_HEADERS+set}" = set || CONFIG_HEADERS=$config_headers + test "${CONFIG_COMMANDS+set}" = set || CONFIG_COMMANDS=$config_commands +fi + +# Have a temporary directory for convenience. Make it in the build tree +# simply because there is no reason against having it here, and in addition, +# creating and moving files from /tmp can sometimes cause problems. +# Hook for its removal unless debugging. +# Note that there is a small window in which the directory will not be cleaned: +# after its creation but before its name has been assigned to `$tmp'. +$debug || +{ + tmp= ac_tmp= + trap 'exit_status=$? + : "${ac_tmp:=$tmp}" + { test ! -d "$ac_tmp" || rm -fr "$ac_tmp"; } && exit $exit_status +' 0 + trap 'as_fn_exit 1' 1 2 13 15 +} +# Create a (secure) tmp directory for tmp files. + +{ + tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` && + test -d "$tmp" +} || +{ + tmp=./conf$$-$RANDOM + (umask 077 && mkdir "$tmp") +} || as_fn_error $? "cannot create a temporary directory in ." "$LINENO" 5 +ac_tmp=$tmp + +# Set up the scripts for CONFIG_FILES section. +# No need to generate them if there are no CONFIG_FILES. +# This happens for instance with `./config.status config.h'. +if test -n "$CONFIG_FILES"; then + + +ac_cr=`echo X | tr X '\015'` +# On cygwin, bash can eat \r inside `` if the user requested igncr. +# But we know of no other shell where ac_cr would be empty at this +# point, so we can use a bashism as a fallback. +if test "x$ac_cr" = x; then + eval ac_cr=\$\'\\r\' +fi +ac_cs_awk_cr=`$AWK 'BEGIN { print "a\rb" }' /dev/null` +if test "$ac_cs_awk_cr" = "a${ac_cr}b"; then + ac_cs_awk_cr='\\r' +else + ac_cs_awk_cr=$ac_cr +fi + +echo 'BEGIN {' >"$ac_tmp/subs1.awk" && +_ACEOF + + +{ + echo "cat >conf$$subs.awk <<_ACEOF" && + echo "$ac_subst_vars" | sed 's/.*/&!$&$ac_delim/' && + echo "_ACEOF" +} >conf$$subs.sh || + as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 +ac_delim_num=`echo "$ac_subst_vars" | grep -c '^'` +ac_delim='%!_!# ' +for ac_last_try in false false false false false :; do + . ./conf$$subs.sh || + as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 + + ac_delim_n=`sed -n "s/.*$ac_delim\$/X/p" conf$$subs.awk | grep -c X` + if test $ac_delim_n = $ac_delim_num; then + break + elif $ac_last_try; then + as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 + else + ac_delim="$ac_delim!$ac_delim _$ac_delim!! " + fi +done +rm -f conf$$subs.sh + +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +cat >>"\$ac_tmp/subs1.awk" <<\\_ACAWK && +_ACEOF +sed -n ' +h +s/^/S["/; s/!.*/"]=/ +p +g +s/^[^!]*!// +:repl +t repl +s/'"$ac_delim"'$// +t delim +:nl +h +s/\(.\{148\}\)..*/\1/ +t more1 +s/["\\]/\\&/g; s/^/"/; s/$/\\n"\\/ +p +n +b repl +:more1 +s/["\\]/\\&/g; s/^/"/; s/$/"\\/ +p +g +s/.\{148\}// +t nl +:delim +h +s/\(.\{148\}\)..*/\1/ +t more2 +s/["\\]/\\&/g; s/^/"/; s/$/"/ +p +b +:more2 +s/["\\]/\\&/g; s/^/"/; s/$/"\\/ +p +g +s/.\{148\}// +t delim +' >$CONFIG_STATUS || ac_write_fail=1 +rm -f conf$$subs.awk +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +_ACAWK +cat >>"\$ac_tmp/subs1.awk" <<_ACAWK && + for (key in S) S_is_set[key] = 1 + FS = "" + +} +{ + line = $ 0 + nfields = split(line, field, "@") + substed = 0 + len = length(field[1]) + for (i = 2; i < nfields; i++) { + key = field[i] + keylen = length(key) + if (S_is_set[key]) { + value = S[key] + line = substr(line, 1, len) "" value "" substr(line, len + keylen + 3) + len += length(value) + length(field[++i]) + substed = 1 + } else + len += 1 + keylen + } + + print line +} + +_ACAWK +_ACEOF +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +if sed "s/$ac_cr//" < /dev/null > /dev/null 2>&1; then + sed "s/$ac_cr\$//; s/$ac_cr/$ac_cs_awk_cr/g" +else + cat +fi < "$ac_tmp/subs1.awk" > "$ac_tmp/subs.awk" \ + || as_fn_error $? "could not setup config files machinery" "$LINENO" 5 +_ACEOF + +# VPATH may cause trouble with some makes, so we remove sole $(srcdir), +# ${srcdir} and @srcdir@ entries from VPATH if srcdir is ".", strip leading and +# trailing colons and then remove the whole line if VPATH becomes empty +# (actually we leave an empty line to preserve line numbers). +if test "x$srcdir" = x.; then + ac_vpsub='/^[ ]*VPATH[ ]*=[ ]*/{ +h +s/// +s/^/:/ +s/[ ]*$/:/ +s/:\$(srcdir):/:/g +s/:\${srcdir}:/:/g +s/:@srcdir@:/:/g +s/^:*// +s/:*$// +x +s/\(=[ ]*\).*/\1/ +G +s/\n// +s/^[^=]*=[ ]*$// +}' +fi + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +fi # test -n "$CONFIG_FILES" + +# Set up the scripts for CONFIG_HEADERS section. +# No need to generate them if there are no CONFIG_HEADERS. +# This happens for instance with `./config.status Makefile'. +if test -n "$CONFIG_HEADERS"; then +cat >"$ac_tmp/defines.awk" <<\_ACAWK || +BEGIN { +_ACEOF + +# Transform confdefs.h into an awk script `defines.awk', embedded as +# here-document in config.status, that substitutes the proper values into +# config.h.in to produce config.h. + +# Create a delimiter string that does not exist in confdefs.h, to ease +# handling of long lines. +ac_delim='%!_!# ' +for ac_last_try in false false :; do + ac_tt=`sed -n "/$ac_delim/p" confdefs.h` + if test -z "$ac_tt"; then + break + elif $ac_last_try; then + as_fn_error $? "could not make $CONFIG_HEADERS" "$LINENO" 5 + else + ac_delim="$ac_delim!$ac_delim _$ac_delim!! " + fi +done + +# For the awk script, D is an array of macro values keyed by name, +# likewise P contains macro parameters if any. Preserve backslash +# newline sequences. + +ac_word_re=[_$as_cr_Letters][_$as_cr_alnum]* +sed -n ' +s/.\{148\}/&'"$ac_delim"'/g +t rset +:rset +s/^[ ]*#[ ]*define[ ][ ]*/ / +t def +d +:def +s/\\$// +t bsnl +s/["\\]/\\&/g +s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\ +D["\1"]=" \3"/p +s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2"/p +d +:bsnl +s/["\\]/\\&/g +s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\ +D["\1"]=" \3\\\\\\n"\\/p +t cont +s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2\\\\\\n"\\/p +t cont +d +:cont +n +s/.\{148\}/&'"$ac_delim"'/g +t clear +:clear +s/\\$// +t bsnlc +s/["\\]/\\&/g; s/^/"/; s/$/"/p +d +:bsnlc +s/["\\]/\\&/g; s/^/"/; s/$/\\\\\\n"\\/p +b cont +' >$CONFIG_STATUS || ac_write_fail=1 + +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 + for (key in D) D_is_set[key] = 1 + FS = "" +} +/^[\t ]*#[\t ]*(define|undef)[\t ]+$ac_word_re([\t (]|\$)/ { + line = \$ 0 + split(line, arg, " ") + if (arg[1] == "#") { + defundef = arg[2] + mac1 = arg[3] + } else { + defundef = substr(arg[1], 2) + mac1 = arg[2] + } + split(mac1, mac2, "(") #) + macro = mac2[1] + prefix = substr(line, 1, index(line, defundef) - 1) + if (D_is_set[macro]) { + # Preserve the white space surrounding the "#". + print prefix "define", macro P[macro] D[macro] + next + } else { + # Replace #undef with comments. This is necessary, for example, + # in the case of _POSIX_SOURCE, which is predefined and required + # on some systems where configure will not decide to define it. + if (defundef == "undef") { + print "/*", prefix defundef, macro, "*/" + next + } + } +} +{ print } +_ACAWK +_ACEOF +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 + as_fn_error $? "could not setup config headers machinery" "$LINENO" 5 +fi # test -n "$CONFIG_HEADERS" + + +eval set X " :F $CONFIG_FILES :H $CONFIG_HEADERS :C $CONFIG_COMMANDS" +shift +for ac_tag +do + case $ac_tag in + :[FHLC]) ac_mode=$ac_tag; continue;; + esac + case $ac_mode$ac_tag in + :[FHL]*:*);; + :L* | :C*:*) as_fn_error $? "invalid tag \`$ac_tag'" "$LINENO" 5;; + :[FH]-) ac_tag=-:-;; + :[FH]*) ac_tag=$ac_tag:$ac_tag.in;; + esac + ac_save_IFS=$IFS + IFS=: + set x $ac_tag + IFS=$ac_save_IFS + shift + ac_file=$1 + shift + + case $ac_mode in + :L) ac_source=$1;; + :[FH]) + ac_file_inputs= + for ac_f + do + case $ac_f in + -) ac_f="$ac_tmp/stdin";; + *) # Look for the file first in the build tree, then in the source tree + # (if the path is not absolute). The absolute path cannot be DOS-style, + # because $ac_f cannot contain `:'. + test -f "$ac_f" || + case $ac_f in + [\\/$]*) false;; + *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";; + esac || + as_fn_error 1 "cannot find input file: \`$ac_f'" "$LINENO" 5;; + esac + case $ac_f in *\'*) ac_f=`$as_echo "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac + as_fn_append ac_file_inputs " '$ac_f'" + done + + # Let's still pretend it is `configure' which instantiates (i.e., don't + # use $as_me), people would be surprised to read: + # /* config.h. Generated by config.status. */ + configure_input='Generated from '` + $as_echo "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g' + `' by configure.' + if test x"$ac_file" != x-; then + configure_input="$ac_file. $configure_input" + { $as_echo "$as_me:${as_lineno-$LINENO}: creating $ac_file" >&5 +$as_echo "$as_me: creating $ac_file" >&6;} + fi + # Neutralize special characters interpreted by sed in replacement strings. + case $configure_input in #( + *\&* | *\|* | *\\* ) + ac_sed_conf_input=`$as_echo "$configure_input" | + sed 's/[\\\\&|]/\\\\&/g'`;; #( + *) ac_sed_conf_input=$configure_input;; + esac + + case $ac_tag in + *:-:* | *:-) cat >"$ac_tmp/stdin" \ + || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; + esac + ;; + esac + + ac_dir=`$as_dirname -- "$ac_file" || +$as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$ac_file" : 'X\(//\)[^/]' \| \ + X"$ac_file" : 'X\(//\)$' \| \ + X"$ac_file" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$ac_file" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + as_dir="$ac_dir"; as_fn_mkdir_p + ac_builddir=. + +case "$ac_dir" in +.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; +*) + ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` + # A ".." for each directory in $ac_dir_suffix. + ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` + case $ac_top_builddir_sub in + "") ac_top_builddir_sub=. ac_top_build_prefix= ;; + *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; + esac ;; +esac +ac_abs_top_builddir=$ac_pwd +ac_abs_builddir=$ac_pwd$ac_dir_suffix +# for backward compatibility: +ac_top_builddir=$ac_top_build_prefix + +case $srcdir in + .) # We are building in place. + ac_srcdir=. + ac_top_srcdir=$ac_top_builddir_sub + ac_abs_top_srcdir=$ac_pwd ;; + [\\/]* | ?:[\\/]* ) # Absolute name. + ac_srcdir=$srcdir$ac_dir_suffix; + ac_top_srcdir=$srcdir + ac_abs_top_srcdir=$srcdir ;; + *) # Relative name. + ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix + ac_top_srcdir=$ac_top_build_prefix$srcdir + ac_abs_top_srcdir=$ac_pwd/$srcdir ;; +esac +ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix + + + case $ac_mode in + :F) + # + # CONFIG_FILE + # + + case $INSTALL in + [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;; + *) ac_INSTALL=$ac_top_build_prefix$INSTALL ;; + esac + ac_MKDIR_P=$MKDIR_P + case $MKDIR_P in + [\\/$]* | ?:[\\/]* ) ;; + */*) ac_MKDIR_P=$ac_top_build_prefix$MKDIR_P ;; + esac +_ACEOF + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +# If the template does not know about datarootdir, expand it. +# FIXME: This hack should be removed a few years after 2.60. +ac_datarootdir_hack=; ac_datarootdir_seen= +ac_sed_dataroot=' +/datarootdir/ { + p + q +} +/@datadir@/p +/@docdir@/p +/@infodir@/p +/@localedir@/p +/@mandir@/p' +case `eval "sed -n \"\$ac_sed_dataroot\" $ac_file_inputs"` in +*datarootdir*) ac_datarootdir_seen=yes;; +*@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*) + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5 +$as_echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;} +_ACEOF +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 + ac_datarootdir_hack=' + s&@datadir@&$datadir&g + s&@docdir@&$docdir&g + s&@infodir@&$infodir&g + s&@localedir@&$localedir&g + s&@mandir@&$mandir&g + s&\\\${datarootdir}&$datarootdir&g' ;; +esac +_ACEOF + +# Neutralize VPATH when `$srcdir' = `.'. +# Shell code in configure.ac might set extrasub. +# FIXME: do we really want to maintain this feature? +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +ac_sed_extra="$ac_vpsub +$extrasub +_ACEOF +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +:t +/@[a-zA-Z_][a-zA-Z_0-9]*@/!b +s|@configure_input@|$ac_sed_conf_input|;t t +s&@top_builddir@&$ac_top_builddir_sub&;t t +s&@top_build_prefix@&$ac_top_build_prefix&;t t +s&@srcdir@&$ac_srcdir&;t t +s&@abs_srcdir@&$ac_abs_srcdir&;t t +s&@top_srcdir@&$ac_top_srcdir&;t t +s&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t +s&@builddir@&$ac_builddir&;t t +s&@abs_builddir@&$ac_abs_builddir&;t t +s&@abs_top_builddir@&$ac_abs_top_builddir&;t t +s&@INSTALL@&$ac_INSTALL&;t t +s&@MKDIR_P@&$ac_MKDIR_P&;t t +$ac_datarootdir_hack +" +eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$ac_tmp/subs.awk" \ + >$ac_tmp/out || as_fn_error $? "could not create $ac_file" "$LINENO" 5 + +test -z "$ac_datarootdir_hack$ac_datarootdir_seen" && + { ac_out=`sed -n '/\${datarootdir}/p' "$ac_tmp/out"`; test -n "$ac_out"; } && + { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' \ + "$ac_tmp/out"`; test -z "$ac_out"; } && + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \`datarootdir' +which seems to be undefined. Please make sure it is defined" >&5 +$as_echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir' +which seems to be undefined. Please make sure it is defined" >&2;} + + rm -f "$ac_tmp/stdin" + case $ac_file in + -) cat "$ac_tmp/out" && rm -f "$ac_tmp/out";; + *) rm -f "$ac_file" && mv "$ac_tmp/out" "$ac_file";; + esac \ + || as_fn_error $? "could not create $ac_file" "$LINENO" 5 + ;; + :H) + # + # CONFIG_HEADER + # + if test x"$ac_file" != x-; then + { + $as_echo "/* $configure_input */" \ + && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" + } >"$ac_tmp/config.h" \ + || as_fn_error $? "could not create $ac_file" "$LINENO" 5 + if diff "$ac_file" "$ac_tmp/config.h" >/dev/null 2>&1; then + { $as_echo "$as_me:${as_lineno-$LINENO}: $ac_file is unchanged" >&5 +$as_echo "$as_me: $ac_file is unchanged" >&6;} + else + rm -f "$ac_file" + mv "$ac_tmp/config.h" "$ac_file" \ + || as_fn_error $? "could not create $ac_file" "$LINENO" 5 + fi + else + $as_echo "/* $configure_input */" \ + && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" \ + || as_fn_error $? "could not create -" "$LINENO" 5 + fi +# Compute "$ac_file"'s index in $config_headers. +_am_arg="$ac_file" +_am_stamp_count=1 +for _am_header in $config_headers :; do + case $_am_header in + $_am_arg | $_am_arg:* ) + break ;; + * ) + _am_stamp_count=`expr $_am_stamp_count + 1` ;; + esac +done +echo "timestamp for $_am_arg" >`$as_dirname -- "$_am_arg" || +$as_expr X"$_am_arg" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$_am_arg" : 'X\(//\)[^/]' \| \ + X"$_am_arg" : 'X\(//\)$' \| \ + X"$_am_arg" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$_am_arg" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'`/stamp-h$_am_stamp_count + ;; + + :C) { $as_echo "$as_me:${as_lineno-$LINENO}: executing $ac_file commands" >&5 +$as_echo "$as_me: executing $ac_file commands" >&6;} + ;; + esac + + + case $ac_file$ac_mode in + "depfiles":C) test x"$AMDEP_TRUE" != x"" || { + # Autoconf 2.62 quotes --file arguments for eval, but not when files + # are listed without --file. Let's play safe and only enable the eval + # if we detect the quoting. + case $CONFIG_FILES in + *\'*) eval set x "$CONFIG_FILES" ;; + *) set x $CONFIG_FILES ;; + esac + shift + for mf + do + # Strip MF so we end up with the name of the file. + mf=`echo "$mf" | sed -e 's/:.*$//'` + # Check whether this is an Automake generated Makefile or not. + # We used to match only the files named `Makefile.in', but + # some people rename them; so instead we look at the file content. + # Grep'ing the first line is not enough: some people post-process + # each Makefile.in and add a new line on top of each file to say so. + # Grep'ing the whole file is not good either: AIX grep has a line + # limit of 2048, but all sed's we know have understand at least 4000. + if sed -n 's,^#.*generated by automake.*,X,p' "$mf" | grep X >/dev/null 2>&1; then + dirpart=`$as_dirname -- "$mf" || +$as_expr X"$mf" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$mf" : 'X\(//\)[^/]' \| \ + X"$mf" : 'X\(//\)$' \| \ + X"$mf" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$mf" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + else + continue + fi + # Extract the definition of DEPDIR, am__include, and am__quote + # from the Makefile without running `make'. + DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"` + test -z "$DEPDIR" && continue + am__include=`sed -n 's/^am__include = //p' < "$mf"` + test -z "am__include" && continue + am__quote=`sed -n 's/^am__quote = //p' < "$mf"` + # When using ansi2knr, U may be empty or an underscore; expand it + U=`sed -n 's/^U = //p' < "$mf"` + # Find all dependency output files, they are included files with + # $(DEPDIR) in their names. We invoke sed twice because it is the + # simplest approach to changing $(DEPDIR) to its actual value in the + # expansion. + for file in `sed -n " + s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \ + sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g' -e 's/\$U/'"$U"'/g'`; do + # Make sure the directory exists. + test -f "$dirpart/$file" && continue + fdir=`$as_dirname -- "$file" || +$as_expr X"$file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$file" : 'X\(//\)[^/]' \| \ + X"$file" : 'X\(//\)$' \| \ + X"$file" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$file" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + as_dir=$dirpart/$fdir; as_fn_mkdir_p + # echo "creating $dirpart/$file" + echo '# dummy' > "$dirpart/$file" + done + done +} + ;; + "libtool":C) + + # See if we are running on zsh, and set the options which allow our + # commands through without removal of \ escapes. + if test -n "${ZSH_VERSION+set}" ; then + setopt NO_GLOB_SUBST + fi + + cfgfile="${ofile}T" + trap "$RM \"$cfgfile\"; exit 1" 1 2 15 + $RM "$cfgfile" + + cat <<_LT_EOF >> "$cfgfile" +#! $SHELL + +# `$ECHO "$ofile" | sed 's%^.*/%%'` - Provide generalized library-building support services. +# Generated automatically by $as_me ($PACKAGE$TIMESTAMP) $VERSION +# Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`: +# NOTE: Changes made to this file will be lost: look at ltmain.sh. +# +# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005, +# 2006, 2007, 2008, 2009, 2010, 2011 Free Software +# Foundation, Inc. +# Written by Gordon Matzigkeit, 1996 +# +# This file is part of GNU Libtool. +# +# GNU Libtool is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License as +# published by the Free Software Foundation; either version 2 of +# the License, or (at your option) any later version. +# +# As a special exception to the GNU General Public License, +# if you distribute this file as part of a program or library that +# is built using GNU Libtool, you may include this file under the +# same distribution terms that you use for the rest of that program. +# +# GNU Libtool is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with GNU Libtool; see the file COPYING. If not, a copy +# can be downloaded from http://www.gnu.org/licenses/gpl.html, or +# obtained by writing to the Free Software Foundation, Inc., +# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + + +# The names of the tagged configurations supported by this script. +available_tags="CXX " + +# ### BEGIN LIBTOOL CONFIG + +# Which release of libtool.m4 was used? +macro_version=$macro_version +macro_revision=$macro_revision + +# Whether or not to build shared libraries. +build_libtool_libs=$enable_shared + +# Whether or not to build static libraries. +build_old_libs=$enable_static + +# What type of objects to build. +pic_mode=$pic_mode + +# Whether or not to optimize for fast installation. +fast_install=$enable_fast_install + +# Shell to use when invoking shell scripts. +SHELL=$lt_SHELL + +# An echo program that protects backslashes. +ECHO=$lt_ECHO + +# The PATH separator for the build system. +PATH_SEPARATOR=$lt_PATH_SEPARATOR + +# The host system. +host_alias=$host_alias +host=$host +host_os=$host_os + +# The build system. +build_alias=$build_alias +build=$build +build_os=$build_os + +# A sed program that does not truncate output. +SED=$lt_SED + +# Sed that helps us avoid accidentally triggering echo(1) options like -n. +Xsed="\$SED -e 1s/^X//" + +# A grep program that handles long lines. +GREP=$lt_GREP + +# An ERE matcher. +EGREP=$lt_EGREP + +# A literal string matcher. +FGREP=$lt_FGREP + +# A BSD- or MS-compatible name lister. +NM=$lt_NM + +# Whether we need soft or hard links. +LN_S=$lt_LN_S + +# What is the maximum length of a command? +max_cmd_len=$max_cmd_len + +# Object file suffix (normally "o"). +objext=$ac_objext + +# Executable file suffix (normally ""). +exeext=$exeext + +# whether the shell understands "unset". +lt_unset=$lt_unset + +# turn spaces into newlines. +SP2NL=$lt_lt_SP2NL + +# turn newlines into spaces. +NL2SP=$lt_lt_NL2SP + +# convert \$build file names to \$host format. +to_host_file_cmd=$lt_cv_to_host_file_cmd + +# convert \$build files to toolchain format. +to_tool_file_cmd=$lt_cv_to_tool_file_cmd + +# An object symbol dumper. +OBJDUMP=$lt_OBJDUMP + +# Method to check whether dependent libraries are shared objects. +deplibs_check_method=$lt_deplibs_check_method + +# Command to use when deplibs_check_method = "file_magic". +file_magic_cmd=$lt_file_magic_cmd + +# How to find potential files when deplibs_check_method = "file_magic". +file_magic_glob=$lt_file_magic_glob + +# Find potential files using nocaseglob when deplibs_check_method = "file_magic". +want_nocaseglob=$lt_want_nocaseglob + +# DLL creation program. +DLLTOOL=$lt_DLLTOOL + +# Command to associate shared and link libraries. +sharedlib_from_linklib_cmd=$lt_sharedlib_from_linklib_cmd + +# The archiver. +AR=$lt_AR + +# Flags to create an archive. +AR_FLAGS=$lt_AR_FLAGS + +# How to feed a file listing to the archiver. +archiver_list_spec=$lt_archiver_list_spec + +# A symbol stripping program. +STRIP=$lt_STRIP + +# Commands used to install an old-style archive. +RANLIB=$lt_RANLIB +old_postinstall_cmds=$lt_old_postinstall_cmds +old_postuninstall_cmds=$lt_old_postuninstall_cmds + +# Whether to use a lock for old archive extraction. +lock_old_archive_extraction=$lock_old_archive_extraction + +# A C compiler. +LTCC=$lt_CC + +# LTCC compiler flags. +LTCFLAGS=$lt_CFLAGS + +# Take the output of nm and produce a listing of raw symbols and C names. +global_symbol_pipe=$lt_lt_cv_sys_global_symbol_pipe + +# Transform the output of nm in a proper C declaration. +global_symbol_to_cdecl=$lt_lt_cv_sys_global_symbol_to_cdecl + +# Transform the output of nm in a C name address pair. +global_symbol_to_c_name_address=$lt_lt_cv_sys_global_symbol_to_c_name_address + +# Transform the output of nm in a C name address pair when lib prefix is needed. +global_symbol_to_c_name_address_lib_prefix=$lt_lt_cv_sys_global_symbol_to_c_name_address_lib_prefix + +# Specify filename containing input files for \$NM. +nm_file_list_spec=$lt_nm_file_list_spec + +# The root where to search for dependent libraries,and in which our libraries should be installed. +lt_sysroot=$lt_sysroot + +# The name of the directory that contains temporary libtool files. +objdir=$objdir + +# Used to examine libraries when file_magic_cmd begins with "file". +MAGIC_CMD=$MAGIC_CMD + +# Must we lock files when doing compilation? +need_locks=$lt_need_locks + +# Manifest tool. +MANIFEST_TOOL=$lt_MANIFEST_TOOL + +# Tool to manipulate archived DWARF debug symbol files on Mac OS X. +DSYMUTIL=$lt_DSYMUTIL + +# Tool to change global to local symbols on Mac OS X. +NMEDIT=$lt_NMEDIT + +# Tool to manipulate fat objects and archives on Mac OS X. +LIPO=$lt_LIPO + +# ldd/readelf like tool for Mach-O binaries on Mac OS X. +OTOOL=$lt_OTOOL + +# ldd/readelf like tool for 64 bit Mach-O binaries on Mac OS X 10.4. +OTOOL64=$lt_OTOOL64 + +# Old archive suffix (normally "a"). +libext=$libext + +# Shared library suffix (normally ".so"). +shrext_cmds=$lt_shrext_cmds + +# The commands to extract the exported symbol list from a shared archive. +extract_expsyms_cmds=$lt_extract_expsyms_cmds + +# Variables whose values should be saved in libtool wrapper scripts and +# restored at link time. +variables_saved_for_relink=$lt_variables_saved_for_relink + +# Do we need the "lib" prefix for modules? +need_lib_prefix=$need_lib_prefix + +# Do we need a version for libraries? +need_version=$need_version + +# Library versioning type. +version_type=$version_type + +# Shared library runtime path variable. +runpath_var=$runpath_var + +# Shared library path variable. +shlibpath_var=$shlibpath_var + +# Is shlibpath searched before the hard-coded library search path? +shlibpath_overrides_runpath=$shlibpath_overrides_runpath + +# Format of library name prefix. +libname_spec=$lt_libname_spec + +# List of archive names. First name is the real one, the rest are links. +# The last name is the one that the linker finds with -lNAME +library_names_spec=$lt_library_names_spec + +# The coded name of the library, if different from the real name. +soname_spec=$lt_soname_spec + +# Permission mode override for installation of shared libraries. +install_override_mode=$lt_install_override_mode + +# Command to use after installation of a shared archive. +postinstall_cmds=$lt_postinstall_cmds + +# Command to use after uninstallation of a shared archive. +postuninstall_cmds=$lt_postuninstall_cmds + +# Commands used to finish a libtool library installation in a directory. +finish_cmds=$lt_finish_cmds + +# As "finish_cmds", except a single script fragment to be evaled but +# not shown. +finish_eval=$lt_finish_eval + +# Whether we should hardcode library paths into libraries. +hardcode_into_libs=$hardcode_into_libs + +# Compile-time system search path for libraries. +sys_lib_search_path_spec=$lt_sys_lib_search_path_spec + +# Run-time system search path for libraries. +sys_lib_dlsearch_path_spec=$lt_sys_lib_dlsearch_path_spec + +# Whether dlopen is supported. +dlopen_support=$enable_dlopen + +# Whether dlopen of programs is supported. +dlopen_self=$enable_dlopen_self + +# Whether dlopen of statically linked programs is supported. +dlopen_self_static=$enable_dlopen_self_static + +# Commands to strip libraries. +old_striplib=$lt_old_striplib +striplib=$lt_striplib + + +# The linker used to build libraries. +LD=$lt_LD + +# How to create reloadable object files. +reload_flag=$lt_reload_flag +reload_cmds=$lt_reload_cmds + +# Commands used to build an old-style archive. +old_archive_cmds=$lt_old_archive_cmds + +# A language specific compiler. +CC=$lt_compiler + +# Is the compiler the GNU compiler? +with_gcc=$GCC + +# Compiler flag to turn off builtin functions. +no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag + +# Additional compiler flags for building library objects. +pic_flag=$lt_lt_prog_compiler_pic + +# How to pass a linker flag through the compiler. +wl=$lt_lt_prog_compiler_wl + +# Compiler flag to prevent dynamic linking. +link_static_flag=$lt_lt_prog_compiler_static + +# Does compiler simultaneously support -c and -o options? +compiler_c_o=$lt_lt_cv_prog_compiler_c_o + +# Whether or not to add -lc for building shared libraries. +build_libtool_need_lc=$archive_cmds_need_lc + +# Whether or not to disallow shared libs when runtime libs are static. +allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes + +# Compiler flag to allow reflexive dlopens. +export_dynamic_flag_spec=$lt_export_dynamic_flag_spec + +# Compiler flag to generate shared objects directly from archives. +whole_archive_flag_spec=$lt_whole_archive_flag_spec + +# Whether the compiler copes with passing no objects directly. +compiler_needs_object=$lt_compiler_needs_object + +# Create an old-style archive from a shared archive. +old_archive_from_new_cmds=$lt_old_archive_from_new_cmds + +# Create a temporary old-style archive to link instead of a shared archive. +old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds + +# Commands used to build a shared archive. +archive_cmds=$lt_archive_cmds +archive_expsym_cmds=$lt_archive_expsym_cmds + +# Commands used to build a loadable module if different from building +# a shared archive. +module_cmds=$lt_module_cmds +module_expsym_cmds=$lt_module_expsym_cmds + +# Whether we are building with GNU ld or not. +with_gnu_ld=$lt_with_gnu_ld + +# Flag that allows shared libraries with undefined symbols to be built. +allow_undefined_flag=$lt_allow_undefined_flag + +# Flag that enforces no undefined symbols. +no_undefined_flag=$lt_no_undefined_flag + +# Flag to hardcode \$libdir into a binary during linking. +# This must work even if \$libdir does not exist +hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec + +# Whether we need a single "-rpath" flag with a separated argument. +hardcode_libdir_separator=$lt_hardcode_libdir_separator + +# Set to "yes" if using DIR/libNAME\${shared_ext} during linking hardcodes +# DIR into the resulting binary. +hardcode_direct=$hardcode_direct + +# Set to "yes" if using DIR/libNAME\${shared_ext} during linking hardcodes +# DIR into the resulting binary and the resulting library dependency is +# "absolute",i.e impossible to change by setting \${shlibpath_var} if the +# library is relocated. +hardcode_direct_absolute=$hardcode_direct_absolute + +# Set to "yes" if using the -LDIR flag during linking hardcodes DIR +# into the resulting binary. +hardcode_minus_L=$hardcode_minus_L + +# Set to "yes" if using SHLIBPATH_VAR=DIR during linking hardcodes DIR +# into the resulting binary. +hardcode_shlibpath_var=$hardcode_shlibpath_var + +# Set to "yes" if building a shared library automatically hardcodes DIR +# into the library and all subsequent libraries and executables linked +# against it. +hardcode_automatic=$hardcode_automatic + +# Set to yes if linker adds runtime paths of dependent libraries +# to runtime path list. +inherit_rpath=$inherit_rpath + +# Whether libtool must link a program against all its dependency libraries. +link_all_deplibs=$link_all_deplibs + +# Set to "yes" if exported symbols are required. +always_export_symbols=$always_export_symbols + +# The commands to list exported symbols. +export_symbols_cmds=$lt_export_symbols_cmds + +# Symbols that should not be listed in the preloaded symbols. +exclude_expsyms=$lt_exclude_expsyms + +# Symbols that must always be exported. +include_expsyms=$lt_include_expsyms + +# Commands necessary for linking programs (against libraries) with templates. +prelink_cmds=$lt_prelink_cmds + +# Commands necessary for finishing linking programs. +postlink_cmds=$lt_postlink_cmds + +# Specify filename containing input files. +file_list_spec=$lt_file_list_spec + +# How to hardcode a shared library path into an executable. +hardcode_action=$hardcode_action + +# The directories searched by this compiler when creating a shared library. +compiler_lib_search_dirs=$lt_compiler_lib_search_dirs + +# Dependencies to place before and after the objects being linked to +# create a shared library. +predep_objects=$lt_predep_objects +postdep_objects=$lt_postdep_objects +predeps=$lt_predeps +postdeps=$lt_postdeps + +# The library search path used internally by the compiler when linking +# a shared library. +compiler_lib_search_path=$lt_compiler_lib_search_path + +# ### END LIBTOOL CONFIG + +_LT_EOF + + case $host_os in + aix3*) + cat <<\_LT_EOF >> "$cfgfile" +# AIX sometimes has problems with the GCC collect2 program. For some +# reason, if we set the COLLECT_NAMES environment variable, the problems +# vanish in a puff of smoke. +if test "X${COLLECT_NAMES+set}" != Xset; then + COLLECT_NAMES= + export COLLECT_NAMES +fi +_LT_EOF + ;; + esac + + +ltmain="$ac_aux_dir/ltmain.sh" + + + # We use sed instead of cat because bash on DJGPP gets confused if + # if finds mixed CR/LF and LF-only lines. Since sed operates in + # text mode, it properly converts lines to CR/LF. This bash problem + # is reportedly fixed, but why not run on old versions too? + sed '$q' "$ltmain" >> "$cfgfile" \ + || (rm -f "$cfgfile"; exit 1) + + if test x"$xsi_shell" = xyes; then + sed -e '/^func_dirname ()$/,/^} # func_dirname /c\ +func_dirname ()\ +{\ +\ case ${1} in\ +\ */*) func_dirname_result="${1%/*}${2}" ;;\ +\ * ) func_dirname_result="${3}" ;;\ +\ esac\ +} # Extended-shell func_dirname implementation' "$cfgfile" > $cfgfile.tmp \ + && mv -f "$cfgfile.tmp" "$cfgfile" \ + || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") +test 0 -eq $? || _lt_function_replace_fail=: + + + sed -e '/^func_basename ()$/,/^} # func_basename /c\ +func_basename ()\ +{\ +\ func_basename_result="${1##*/}"\ +} # Extended-shell func_basename implementation' "$cfgfile" > $cfgfile.tmp \ + && mv -f "$cfgfile.tmp" "$cfgfile" \ + || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") +test 0 -eq $? || _lt_function_replace_fail=: + + + sed -e '/^func_dirname_and_basename ()$/,/^} # func_dirname_and_basename /c\ +func_dirname_and_basename ()\ +{\ +\ case ${1} in\ +\ */*) func_dirname_result="${1%/*}${2}" ;;\ +\ * ) func_dirname_result="${3}" ;;\ +\ esac\ +\ func_basename_result="${1##*/}"\ +} # Extended-shell func_dirname_and_basename implementation' "$cfgfile" > $cfgfile.tmp \ + && mv -f "$cfgfile.tmp" "$cfgfile" \ + || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") +test 0 -eq $? || _lt_function_replace_fail=: + + + sed -e '/^func_stripname ()$/,/^} # func_stripname /c\ +func_stripname ()\ +{\ +\ # pdksh 5.2.14 does not do ${X%$Y} correctly if both X and Y are\ +\ # positional parameters, so assign one to ordinary parameter first.\ +\ func_stripname_result=${3}\ +\ func_stripname_result=${func_stripname_result#"${1}"}\ +\ func_stripname_result=${func_stripname_result%"${2}"}\ +} # Extended-shell func_stripname implementation' "$cfgfile" > $cfgfile.tmp \ + && mv -f "$cfgfile.tmp" "$cfgfile" \ + || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") +test 0 -eq $? || _lt_function_replace_fail=: + + + sed -e '/^func_split_long_opt ()$/,/^} # func_split_long_opt /c\ +func_split_long_opt ()\ +{\ +\ func_split_long_opt_name=${1%%=*}\ +\ func_split_long_opt_arg=${1#*=}\ +} # Extended-shell func_split_long_opt implementation' "$cfgfile" > $cfgfile.tmp \ + && mv -f "$cfgfile.tmp" "$cfgfile" \ + || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") +test 0 -eq $? || _lt_function_replace_fail=: + + + sed -e '/^func_split_short_opt ()$/,/^} # func_split_short_opt /c\ +func_split_short_opt ()\ +{\ +\ func_split_short_opt_arg=${1#??}\ +\ func_split_short_opt_name=${1%"$func_split_short_opt_arg"}\ +} # Extended-shell func_split_short_opt implementation' "$cfgfile" > $cfgfile.tmp \ + && mv -f "$cfgfile.tmp" "$cfgfile" \ + || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") +test 0 -eq $? || _lt_function_replace_fail=: + + + sed -e '/^func_lo2o ()$/,/^} # func_lo2o /c\ +func_lo2o ()\ +{\ +\ case ${1} in\ +\ *.lo) func_lo2o_result=${1%.lo}.${objext} ;;\ +\ *) func_lo2o_result=${1} ;;\ +\ esac\ +} # Extended-shell func_lo2o implementation' "$cfgfile" > $cfgfile.tmp \ + && mv -f "$cfgfile.tmp" "$cfgfile" \ + || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") +test 0 -eq $? || _lt_function_replace_fail=: + + + sed -e '/^func_xform ()$/,/^} # func_xform /c\ +func_xform ()\ +{\ + func_xform_result=${1%.*}.lo\ +} # Extended-shell func_xform implementation' "$cfgfile" > $cfgfile.tmp \ + && mv -f "$cfgfile.tmp" "$cfgfile" \ + || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") +test 0 -eq $? || _lt_function_replace_fail=: + + + sed -e '/^func_arith ()$/,/^} # func_arith /c\ +func_arith ()\ +{\ + func_arith_result=$(( $* ))\ +} # Extended-shell func_arith implementation' "$cfgfile" > $cfgfile.tmp \ + && mv -f "$cfgfile.tmp" "$cfgfile" \ + || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") +test 0 -eq $? || _lt_function_replace_fail=: + + + sed -e '/^func_len ()$/,/^} # func_len /c\ +func_len ()\ +{\ + func_len_result=${#1}\ +} # Extended-shell func_len implementation' "$cfgfile" > $cfgfile.tmp \ + && mv -f "$cfgfile.tmp" "$cfgfile" \ + || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") +test 0 -eq $? || _lt_function_replace_fail=: + +fi + +if test x"$lt_shell_append" = xyes; then + sed -e '/^func_append ()$/,/^} # func_append /c\ +func_append ()\ +{\ + eval "${1}+=\\${2}"\ +} # Extended-shell func_append implementation' "$cfgfile" > $cfgfile.tmp \ + && mv -f "$cfgfile.tmp" "$cfgfile" \ + || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") +test 0 -eq $? || _lt_function_replace_fail=: + + + sed -e '/^func_append_quoted ()$/,/^} # func_append_quoted /c\ +func_append_quoted ()\ +{\ +\ func_quote_for_eval "${2}"\ +\ eval "${1}+=\\\\ \\$func_quote_for_eval_result"\ +} # Extended-shell func_append_quoted implementation' "$cfgfile" > $cfgfile.tmp \ + && mv -f "$cfgfile.tmp" "$cfgfile" \ + || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") +test 0 -eq $? || _lt_function_replace_fail=: + + + # Save a `func_append' function call where possible by direct use of '+=' + sed -e 's%func_append \([a-zA-Z_]\{1,\}\) "%\1+="%g' $cfgfile > $cfgfile.tmp \ + && mv -f "$cfgfile.tmp" "$cfgfile" \ + || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") + test 0 -eq $? || _lt_function_replace_fail=: +else + # Save a `func_append' function call even when '+=' is not available + sed -e 's%func_append \([a-zA-Z_]\{1,\}\) "%\1="$\1%g' $cfgfile > $cfgfile.tmp \ + && mv -f "$cfgfile.tmp" "$cfgfile" \ + || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") + test 0 -eq $? || _lt_function_replace_fail=: +fi + +if test x"$_lt_function_replace_fail" = x":"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Unable to substitute extended shell functions in $ofile" >&5 +$as_echo "$as_me: WARNING: Unable to substitute extended shell functions in $ofile" >&2;} +fi + + + mv -f "$cfgfile" "$ofile" || + (rm -f "$ofile" && cp "$cfgfile" "$ofile" && rm -f "$cfgfile") + chmod +x "$ofile" + + + cat <<_LT_EOF >> "$ofile" + +# ### BEGIN LIBTOOL TAG CONFIG: CXX + +# The linker used to build libraries. +LD=$lt_LD_CXX + +# How to create reloadable object files. +reload_flag=$lt_reload_flag_CXX +reload_cmds=$lt_reload_cmds_CXX + +# Commands used to build an old-style archive. +old_archive_cmds=$lt_old_archive_cmds_CXX + +# A language specific compiler. +CC=$lt_compiler_CXX + +# Is the compiler the GNU compiler? +with_gcc=$GCC_CXX + +# Compiler flag to turn off builtin functions. +no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag_CXX + +# Additional compiler flags for building library objects. +pic_flag=$lt_lt_prog_compiler_pic_CXX + +# How to pass a linker flag through the compiler. +wl=$lt_lt_prog_compiler_wl_CXX + +# Compiler flag to prevent dynamic linking. +link_static_flag=$lt_lt_prog_compiler_static_CXX + +# Does compiler simultaneously support -c and -o options? +compiler_c_o=$lt_lt_cv_prog_compiler_c_o_CXX + +# Whether or not to add -lc for building shared libraries. +build_libtool_need_lc=$archive_cmds_need_lc_CXX + +# Whether or not to disallow shared libs when runtime libs are static. +allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes_CXX + +# Compiler flag to allow reflexive dlopens. +export_dynamic_flag_spec=$lt_export_dynamic_flag_spec_CXX + +# Compiler flag to generate shared objects directly from archives. +whole_archive_flag_spec=$lt_whole_archive_flag_spec_CXX + +# Whether the compiler copes with passing no objects directly. +compiler_needs_object=$lt_compiler_needs_object_CXX + +# Create an old-style archive from a shared archive. +old_archive_from_new_cmds=$lt_old_archive_from_new_cmds_CXX + +# Create a temporary old-style archive to link instead of a shared archive. +old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds_CXX + +# Commands used to build a shared archive. +archive_cmds=$lt_archive_cmds_CXX +archive_expsym_cmds=$lt_archive_expsym_cmds_CXX + +# Commands used to build a loadable module if different from building +# a shared archive. +module_cmds=$lt_module_cmds_CXX +module_expsym_cmds=$lt_module_expsym_cmds_CXX + +# Whether we are building with GNU ld or not. +with_gnu_ld=$lt_with_gnu_ld_CXX + +# Flag that allows shared libraries with undefined symbols to be built. +allow_undefined_flag=$lt_allow_undefined_flag_CXX + +# Flag that enforces no undefined symbols. +no_undefined_flag=$lt_no_undefined_flag_CXX + +# Flag to hardcode \$libdir into a binary during linking. +# This must work even if \$libdir does not exist +hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec_CXX + +# Whether we need a single "-rpath" flag with a separated argument. +hardcode_libdir_separator=$lt_hardcode_libdir_separator_CXX + +# Set to "yes" if using DIR/libNAME\${shared_ext} during linking hardcodes +# DIR into the resulting binary. +hardcode_direct=$hardcode_direct_CXX + +# Set to "yes" if using DIR/libNAME\${shared_ext} during linking hardcodes +# DIR into the resulting binary and the resulting library dependency is +# "absolute",i.e impossible to change by setting \${shlibpath_var} if the +# library is relocated. +hardcode_direct_absolute=$hardcode_direct_absolute_CXX + +# Set to "yes" if using the -LDIR flag during linking hardcodes DIR +# into the resulting binary. +hardcode_minus_L=$hardcode_minus_L_CXX + +# Set to "yes" if using SHLIBPATH_VAR=DIR during linking hardcodes DIR +# into the resulting binary. +hardcode_shlibpath_var=$hardcode_shlibpath_var_CXX + +# Set to "yes" if building a shared library automatically hardcodes DIR +# into the library and all subsequent libraries and executables linked +# against it. +hardcode_automatic=$hardcode_automatic_CXX + +# Set to yes if linker adds runtime paths of dependent libraries +# to runtime path list. +inherit_rpath=$inherit_rpath_CXX + +# Whether libtool must link a program against all its dependency libraries. +link_all_deplibs=$link_all_deplibs_CXX + +# Set to "yes" if exported symbols are required. +always_export_symbols=$always_export_symbols_CXX + +# The commands to list exported symbols. +export_symbols_cmds=$lt_export_symbols_cmds_CXX + +# Symbols that should not be listed in the preloaded symbols. +exclude_expsyms=$lt_exclude_expsyms_CXX + +# Symbols that must always be exported. +include_expsyms=$lt_include_expsyms_CXX + +# Commands necessary for linking programs (against libraries) with templates. +prelink_cmds=$lt_prelink_cmds_CXX + +# Commands necessary for finishing linking programs. +postlink_cmds=$lt_postlink_cmds_CXX + +# Specify filename containing input files. +file_list_spec=$lt_file_list_spec_CXX + +# How to hardcode a shared library path into an executable. +hardcode_action=$hardcode_action_CXX + +# The directories searched by this compiler when creating a shared library. +compiler_lib_search_dirs=$lt_compiler_lib_search_dirs_CXX + +# Dependencies to place before and after the objects being linked to +# create a shared library. +predep_objects=$lt_predep_objects_CXX +postdep_objects=$lt_postdep_objects_CXX +predeps=$lt_predeps_CXX +postdeps=$lt_postdeps_CXX + +# The library search path used internally by the compiler when linking +# a shared library. +compiler_lib_search_path=$lt_compiler_lib_search_path_CXX + +# ### END LIBTOOL TAG CONFIG: CXX +_LT_EOF + + ;; + + esac +done # for ac_tag + + +as_fn_exit 0 +_ACEOF +ac_clean_files=$ac_clean_files_save + +test $ac_write_fail = 0 || + as_fn_error $? "write failure creating $CONFIG_STATUS" "$LINENO" 5 + + +# configure is writing to config.log, and then calls config.status. +# config.status does its own redirection, appending to config.log. +# Unfortunately, on DOS this fails, as config.log is still kept open +# by configure, so config.status won't be able to write to it; its +# output is simply discarded. So we exec the FD to /dev/null, +# effectively closing config.log, so it can be properly (re)opened and +# appended to by config.status. When coming back to configure, we +# need to make the FD available again. +if test "$no_create" != yes; then + ac_cs_success=: + ac_config_status_args= + test "$silent" = yes && + ac_config_status_args="$ac_config_status_args --quiet" + exec 5>/dev/null + $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false + exec 5>>config.log + # Use ||, not &&, to avoid exiting from the if with $? = 1, which + # would make configure fail if this is the last instruction. + $ac_cs_success || as_fn_exit 1 +fi +if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5 +$as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;} +fi + diff --git a/pkg/registry/zookeeper-3.4.6/src/c/configure.ac b/pkg/registry/zookeeper-3.4.6/src/c/configure.ac new file mode 100644 index 000000000..b4ed639fc --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/c/configure.ac @@ -0,0 +1,149 @@ +# -*- Autoconf -*- +# Process this file with autoconf to produce a configure script. + +AC_PREREQ(2.59) + +AC_INIT([zookeeper C client],3.4.6,[user@zookeeper.apache.org],[zookeeper]) +AC_CONFIG_SRCDIR([src/zookeeper.c]) + +# Save initial CFLAGS and CXXFLAGS values before AC_PROG_CC and AC_PROG_CXX +init_cflags="$CFLAGS" +init_cxxflags="$CXXFLAGS" + +# initialize Doxygen support +DX_HTML_FEATURE(ON) +DX_CHM_FEATURE(OFF) +DX_CHI_FEATURE(OFF) +DX_MAN_FEATURE(OFF) +DX_RTF_FEATURE(OFF) +DX_XML_FEATURE(OFF) +DX_PDF_FEATURE(OFF) +DX_PS_FEATURE(OFF) +DX_INIT_DOXYGEN([zookeeper],[c-doc.Doxyfile],[docs]) + +# initialize automake +AM_INIT_AUTOMAKE([-Wall foreign]) +AC_CONFIG_HEADER([config.h]) + +# Checks for programs. +AC_ARG_WITH(cppunit, + [ --without-cppunit do not use CPPUNIT]) + +if test "$with_cppunit" = "no" ; then + CPPUNIT_PATH="No_CPPUNIT" + CPPUNIT_INCLUDE= + CPPUNIT_LIBS= +else + AM_PATH_CPPUNIT(1.10.2) +fi + +if test "$CALLER" = "ANT" ; then +CPPUNIT_CFLAGS="$CPPUNIT_CFLAGS -DZKSERVER_CMD=\"\\\"${base_dir}/src/c/tests/zkServer.sh\\\"\"" +else +CPPUNIT_CFLAGS="$CPPUNIT_CFLAGS -DZKSERVER_CMD=\"\\\"./tests/zkServer.sh\\\"\"" +AC_CHECK_FILES([generated/zookeeper.jute.c generated/zookeeper.jute.h],[], + [AC_MSG_ERROR([jute files are missing! Please run "ant compile_jute" while in the zookeeper top level directory.]) +]) +fi +AC_SUBST(CPPUNIT_CFLAGS) + +AC_PROG_CC +AM_PROG_CC_C_O +AC_PROG_CXX +AC_PROG_INSTALL +AC_PROG_LN_S + +# AC_DISABLE_SHARED +AC_PROG_LIBTOOL + +#enable -D_GNU_SOURCE since the return code value of getaddrinfo +#ifdefed with __USE_GNU +#features.h header undef's __USE_GNU and defines it only if _GNU_SOURCE is defined +#hence this define for gcc +AC_ARG_ENABLE([debug], + [AS_HELP_STRING([--enable-debug],[enable debug build [default=no]])], + [],[enable_debug=no]) + +if test "x$enable_debug" = xyes; then + if test "x$init_cflags" = x; then + CFLAGS="" + fi + CFLAGS="$CFLAGS -g -O0 -D_GNU_SOURCE" +else + if test "x$init_cflags" = x; then + CFLAGS="-g -O2 -D_GNU_SOURCE" + fi +fi + +if test "x$enable_debug" = xyes; then + if test "x$init_cxxflags" = x; then + CXXFLAGS="" + fi + CXXFLAGS="$CXXFLAGS -g -O0" +else + if test "x$init_cxxflags" = x; then + CXXFLAGS="-g -O2" + fi +fi + +AC_ARG_WITH([syncapi], + [AS_HELP_STRING([--with-syncapi],[build with support for SyncAPI [default=yes]])], + [],[with_syncapi=yes]) + +# Checks for libraries. +AC_CHECK_LIB([pthread], [pthread_mutex_lock],[have_pthread=yes],[have_pthread=no]) + +if test "x$with_syncapi" != xno && test "x$have_pthread" = xno; then + AC_MSG_WARN([cannot build SyncAPI -- pthread not found]) + with_syncapi=no +fi +if test "x$with_syncapi" != xno; then + AC_MSG_NOTICE([building with SyncAPI support]) +else + AC_MSG_NOTICE([building without SyncAPI support]) +fi + +AM_CONDITIONAL([WANT_SYNCAPI],[test "x$with_syncapi" != xno]) + +# Checks for header files. +AC_HEADER_STDC +AC_CHECK_HEADERS([arpa/inet.h fcntl.h netdb.h netinet/in.h stdlib.h string.h sys/socket.h sys/time.h unistd.h sys/utsname.h]) + +# Checks for typedefs, structures, and compiler characteristics. +AC_C_CONST +AC_C_INLINE +AC_HEADER_TIME +AC_CHECK_TYPE([nfds_t], + [AC_DEFINE([POLL_NFDS_TYPE],[nfds_t],[poll() second argument type])], + [AC_DEFINE([POLL_NFDS_TYPE],[unsigned int],[poll() second argument type])], + [#include ]) + +AC_MSG_CHECKING([whether to enable ipv6]) + +AC_TRY_RUN([ /* is AF_INET6 available? */ +#include +#include +main() +{ + if (socket(AF_INET6, SOCK_STREAM, 0) < 0) + exit(1); + else + exit(0); +} +], AC_MSG_RESULT(yes) + ipv6=yes, + AC_MSG_RESULT(no) + ipv6=no, + AC_MSG_RESULT(no) + ipv6=no) + +if test x"$ipv6" = xyes; then + USEIPV6="-DZOO_IPV6_ENABLED" + AC_SUBST(USEIPV6) +fi + +# Checks for library functions. +AC_CHECK_FUNCS([getcwd gethostbyname gethostname getlogin getpwuid_r gettimeofday getuid memmove memset poll socket strchr strdup strerror strtol]) + +AC_CONFIG_FILES([Makefile]) +AC_OUTPUT diff --git a/pkg/registry/zookeeper-3.4.6/src/c/depcomp b/pkg/registry/zookeeper-3.4.6/src/c/depcomp new file mode 100755 index 000000000..25a39e6cd --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/c/depcomp @@ -0,0 +1,708 @@ +#! /bin/sh +# depcomp - compile a program generating dependencies as side-effects + +scriptversion=2012-03-27.16; # UTC + +# Copyright (C) 1999, 2000, 2003, 2004, 2005, 2006, 2007, 2009, 2010, +# 2011, 2012 Free Software Foundation, Inc. + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2, or (at your option) +# any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program that contains a +# configuration script generated by Autoconf, you may include it under +# the same distribution terms that you use for the rest of that program. + +# Originally written by Alexandre Oliva . + +case $1 in + '') + echo "$0: No command. Try '$0 --help' for more information." 1>&2 + exit 1; + ;; + -h | --h*) + cat <<\EOF +Usage: depcomp [--help] [--version] PROGRAM [ARGS] + +Run PROGRAMS ARGS to compile a file, generating dependencies +as side-effects. + +Environment variables: + depmode Dependency tracking mode. + source Source file read by 'PROGRAMS ARGS'. + object Object file output by 'PROGRAMS ARGS'. + DEPDIR directory where to store dependencies. + depfile Dependency file to output. + tmpdepfile Temporary file to use when outputting dependencies. + libtool Whether libtool is used (yes/no). + +Report bugs to . +EOF + exit $? + ;; + -v | --v*) + echo "depcomp $scriptversion" + exit $? + ;; +esac + +# A tabulation character. +tab=' ' +# A newline character. +nl=' +' + +if test -z "$depmode" || test -z "$source" || test -z "$object"; then + echo "depcomp: Variables source, object and depmode must be set" 1>&2 + exit 1 +fi + +# Dependencies for sub/bar.o or sub/bar.obj go into sub/.deps/bar.Po. +depfile=${depfile-`echo "$object" | + sed 's|[^\\/]*$|'${DEPDIR-.deps}'/&|;s|\.\([^.]*\)$|.P\1|;s|Pobj$|Po|'`} +tmpdepfile=${tmpdepfile-`echo "$depfile" | sed 's/\.\([^.]*\)$/.T\1/'`} + +rm -f "$tmpdepfile" + +# Some modes work just like other modes, but use different flags. We +# parameterize here, but still list the modes in the big case below, +# to make depend.m4 easier to write. Note that we *cannot* use a case +# here, because this file can only contain one case statement. +if test "$depmode" = hp; then + # HP compiler uses -M and no extra arg. + gccflag=-M + depmode=gcc +fi + +if test "$depmode" = dashXmstdout; then + # This is just like dashmstdout with a different argument. + dashmflag=-xM + depmode=dashmstdout +fi + +cygpath_u="cygpath -u -f -" +if test "$depmode" = msvcmsys; then + # This is just like msvisualcpp but w/o cygpath translation. + # Just convert the backslash-escaped backslashes to single forward + # slashes to satisfy depend.m4 + cygpath_u='sed s,\\\\,/,g' + depmode=msvisualcpp +fi + +if test "$depmode" = msvc7msys; then + # This is just like msvc7 but w/o cygpath translation. + # Just convert the backslash-escaped backslashes to single forward + # slashes to satisfy depend.m4 + cygpath_u='sed s,\\\\,/,g' + depmode=msvc7 +fi + +if test "$depmode" = xlc; then + # IBM C/C++ Compilers xlc/xlC can output gcc-like dependency informations. + gccflag=-qmakedep=gcc,-MF + depmode=gcc +fi + +case "$depmode" in +gcc3) +## gcc 3 implements dependency tracking that does exactly what +## we want. Yay! Note: for some reason libtool 1.4 doesn't like +## it if -MD -MP comes after the -MF stuff. Hmm. +## Unfortunately, FreeBSD c89 acceptance of flags depends upon +## the command line argument order; so add the flags where they +## appear in depend2.am. Note that the slowdown incurred here +## affects only configure: in makefiles, %FASTDEP% shortcuts this. + for arg + do + case $arg in + -c) set fnord "$@" -MT "$object" -MD -MP -MF "$tmpdepfile" "$arg" ;; + *) set fnord "$@" "$arg" ;; + esac + shift # fnord + shift # $arg + done + "$@" + stat=$? + if test $stat -eq 0; then : + else + rm -f "$tmpdepfile" + exit $stat + fi + mv "$tmpdepfile" "$depfile" + ;; + +gcc) +## There are various ways to get dependency output from gcc. Here's +## why we pick this rather obscure method: +## - Don't want to use -MD because we'd like the dependencies to end +## up in a subdir. Having to rename by hand is ugly. +## (We might end up doing this anyway to support other compilers.) +## - The DEPENDENCIES_OUTPUT environment variable makes gcc act like +## -MM, not -M (despite what the docs say). +## - Using -M directly means running the compiler twice (even worse +## than renaming). + if test -z "$gccflag"; then + gccflag=-MD, + fi + "$@" -Wp,"$gccflag$tmpdepfile" + stat=$? + if test $stat -eq 0; then : + else + rm -f "$tmpdepfile" + exit $stat + fi + rm -f "$depfile" + echo "$object : \\" > "$depfile" + alpha=ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz +## The second -e expression handles DOS-style file names with drive letters. + sed -e 's/^[^:]*: / /' \ + -e 's/^['$alpha']:\/[^:]*: / /' < "$tmpdepfile" >> "$depfile" +## This next piece of magic avoids the "deleted header file" problem. +## The problem is that when a header file which appears in a .P file +## is deleted, the dependency causes make to die (because there is +## typically no way to rebuild the header). We avoid this by adding +## dummy dependencies for each header file. Too bad gcc doesn't do +## this for us directly. + tr ' ' "$nl" < "$tmpdepfile" | +## Some versions of gcc put a space before the ':'. On the theory +## that the space means something, we add a space to the output as +## well. hp depmode also adds that space, but also prefixes the VPATH +## to the object. Take care to not repeat it in the output. +## Some versions of the HPUX 10.20 sed can't process this invocation +## correctly. Breaking it into two sed invocations is a workaround. + sed -e 's/^\\$//' -e '/^$/d' -e "s|.*$object$||" -e '/:$/d' \ + | sed -e 's/$/ :/' >> "$depfile" + rm -f "$tmpdepfile" + ;; + +hp) + # This case exists only to let depend.m4 do its work. It works by + # looking at the text of this script. This case will never be run, + # since it is checked for above. + exit 1 + ;; + +sgi) + if test "$libtool" = yes; then + "$@" "-Wp,-MDupdate,$tmpdepfile" + else + "$@" -MDupdate "$tmpdepfile" + fi + stat=$? + if test $stat -eq 0; then : + else + rm -f "$tmpdepfile" + exit $stat + fi + rm -f "$depfile" + + if test -f "$tmpdepfile"; then # yes, the sourcefile depend on other files + echo "$object : \\" > "$depfile" + + # Clip off the initial element (the dependent). Don't try to be + # clever and replace this with sed code, as IRIX sed won't handle + # lines with more than a fixed number of characters (4096 in + # IRIX 6.2 sed, 8192 in IRIX 6.5). We also remove comment lines; + # the IRIX cc adds comments like '#:fec' to the end of the + # dependency line. + tr ' ' "$nl" < "$tmpdepfile" \ + | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' | \ + tr "$nl" ' ' >> "$depfile" + echo >> "$depfile" + + # The second pass generates a dummy entry for each header file. + tr ' ' "$nl" < "$tmpdepfile" \ + | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' -e 's/$/:/' \ + >> "$depfile" + else + # The sourcefile does not contain any dependencies, so just + # store a dummy comment line, to avoid errors with the Makefile + # "include basename.Plo" scheme. + echo "#dummy" > "$depfile" + fi + rm -f "$tmpdepfile" + ;; + +xlc) + # This case exists only to let depend.m4 do its work. It works by + # looking at the text of this script. This case will never be run, + # since it is checked for above. + exit 1 + ;; + +aix) + # The C for AIX Compiler uses -M and outputs the dependencies + # in a .u file. In older versions, this file always lives in the + # current directory. Also, the AIX compiler puts '$object:' at the + # start of each line; $object doesn't have directory information. + # Version 6 uses the directory in both cases. + dir=`echo "$object" | sed -e 's|/[^/]*$|/|'` + test "x$dir" = "x$object" && dir= + base=`echo "$object" | sed -e 's|^.*/||' -e 's/\.o$//' -e 's/\.lo$//'` + if test "$libtool" = yes; then + tmpdepfile1=$dir$base.u + tmpdepfile2=$base.u + tmpdepfile3=$dir.libs/$base.u + "$@" -Wc,-M + else + tmpdepfile1=$dir$base.u + tmpdepfile2=$dir$base.u + tmpdepfile3=$dir$base.u + "$@" -M + fi + stat=$? + + if test $stat -eq 0; then : + else + rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" + exit $stat + fi + + for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" + do + test -f "$tmpdepfile" && break + done + if test -f "$tmpdepfile"; then + # Each line is of the form 'foo.o: dependent.h'. + # Do two passes, one to just change these to + # '$object: dependent.h' and one to simply 'dependent.h:'. + sed -e "s,^.*\.[a-z]*:,$object:," < "$tmpdepfile" > "$depfile" + sed -e 's,^.*\.[a-z]*:['"$tab"' ]*,,' -e 's,$,:,' < "$tmpdepfile" >> "$depfile" + else + # The sourcefile does not contain any dependencies, so just + # store a dummy comment line, to avoid errors with the Makefile + # "include basename.Plo" scheme. + echo "#dummy" > "$depfile" + fi + rm -f "$tmpdepfile" + ;; + +icc) + # Intel's C compiler anf tcc (Tiny C Compiler) understand '-MD -MF file'. + # However on + # $CC -MD -MF foo.d -c -o sub/foo.o sub/foo.c + # ICC 7.0 will fill foo.d with something like + # foo.o: sub/foo.c + # foo.o: sub/foo.h + # which is wrong. We want + # sub/foo.o: sub/foo.c + # sub/foo.o: sub/foo.h + # sub/foo.c: + # sub/foo.h: + # ICC 7.1 will output + # foo.o: sub/foo.c sub/foo.h + # and will wrap long lines using '\': + # foo.o: sub/foo.c ... \ + # sub/foo.h ... \ + # ... + # tcc 0.9.26 (FIXME still under development at the moment of writing) + # will emit a similar output, but also prepend the continuation lines + # with horizontal tabulation characters. + "$@" -MD -MF "$tmpdepfile" + stat=$? + if test $stat -eq 0; then : + else + rm -f "$tmpdepfile" + exit $stat + fi + rm -f "$depfile" + # Each line is of the form 'foo.o: dependent.h', + # or 'foo.o: dep1.h dep2.h \', or ' dep3.h dep4.h \'. + # Do two passes, one to just change these to + # '$object: dependent.h' and one to simply 'dependent.h:'. + sed -e "s/^[ $tab][ $tab]*/ /" -e "s,^[^:]*:,$object :," \ + < "$tmpdepfile" > "$depfile" + sed ' + s/[ '"$tab"'][ '"$tab"']*/ /g + s/^ *// + s/ *\\*$// + s/^[^:]*: *// + /^$/d + /:$/d + s/$/ :/ + ' < "$tmpdepfile" >> "$depfile" + rm -f "$tmpdepfile" + ;; + +hp2) + # The "hp" stanza above does not work with aCC (C++) and HP's ia64 + # compilers, which have integrated preprocessors. The correct option + # to use with these is +Maked; it writes dependencies to a file named + # 'foo.d', which lands next to the object file, wherever that + # happens to be. + # Much of this is similar to the tru64 case; see comments there. + dir=`echo "$object" | sed -e 's|/[^/]*$|/|'` + test "x$dir" = "x$object" && dir= + base=`echo "$object" | sed -e 's|^.*/||' -e 's/\.o$//' -e 's/\.lo$//'` + if test "$libtool" = yes; then + tmpdepfile1=$dir$base.d + tmpdepfile2=$dir.libs/$base.d + "$@" -Wc,+Maked + else + tmpdepfile1=$dir$base.d + tmpdepfile2=$dir$base.d + "$@" +Maked + fi + stat=$? + if test $stat -eq 0; then : + else + rm -f "$tmpdepfile1" "$tmpdepfile2" + exit $stat + fi + + for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" + do + test -f "$tmpdepfile" && break + done + if test -f "$tmpdepfile"; then + sed -e "s,^.*\.[a-z]*:,$object:," "$tmpdepfile" > "$depfile" + # Add 'dependent.h:' lines. + sed -ne '2,${ + s/^ *// + s/ \\*$// + s/$/:/ + p + }' "$tmpdepfile" >> "$depfile" + else + echo "#dummy" > "$depfile" + fi + rm -f "$tmpdepfile" "$tmpdepfile2" + ;; + +tru64) + # The Tru64 compiler uses -MD to generate dependencies as a side + # effect. 'cc -MD -o foo.o ...' puts the dependencies into 'foo.o.d'. + # At least on Alpha/Redhat 6.1, Compaq CCC V6.2-504 seems to put + # dependencies in 'foo.d' instead, so we check for that too. + # Subdirectories are respected. + dir=`echo "$object" | sed -e 's|/[^/]*$|/|'` + test "x$dir" = "x$object" && dir= + base=`echo "$object" | sed -e 's|^.*/||' -e 's/\.o$//' -e 's/\.lo$//'` + + if test "$libtool" = yes; then + # With Tru64 cc, shared objects can also be used to make a + # static library. This mechanism is used in libtool 1.4 series to + # handle both shared and static libraries in a single compilation. + # With libtool 1.4, dependencies were output in $dir.libs/$base.lo.d. + # + # With libtool 1.5 this exception was removed, and libtool now + # generates 2 separate objects for the 2 libraries. These two + # compilations output dependencies in $dir.libs/$base.o.d and + # in $dir$base.o.d. We have to check for both files, because + # one of the two compilations can be disabled. We should prefer + # $dir$base.o.d over $dir.libs/$base.o.d because the latter is + # automatically cleaned when .libs/ is deleted, while ignoring + # the former would cause a distcleancheck panic. + tmpdepfile1=$dir.libs/$base.lo.d # libtool 1.4 + tmpdepfile2=$dir$base.o.d # libtool 1.5 + tmpdepfile3=$dir.libs/$base.o.d # libtool 1.5 + tmpdepfile4=$dir.libs/$base.d # Compaq CCC V6.2-504 + "$@" -Wc,-MD + else + tmpdepfile1=$dir$base.o.d + tmpdepfile2=$dir$base.d + tmpdepfile3=$dir$base.d + tmpdepfile4=$dir$base.d + "$@" -MD + fi + + stat=$? + if test $stat -eq 0; then : + else + rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" "$tmpdepfile4" + exit $stat + fi + + for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" "$tmpdepfile4" + do + test -f "$tmpdepfile" && break + done + if test -f "$tmpdepfile"; then + sed -e "s,^.*\.[a-z]*:,$object:," < "$tmpdepfile" > "$depfile" + sed -e 's,^.*\.[a-z]*:['"$tab"' ]*,,' -e 's,$,:,' < "$tmpdepfile" >> "$depfile" + else + echo "#dummy" > "$depfile" + fi + rm -f "$tmpdepfile" + ;; + +msvc7) + if test "$libtool" = yes; then + showIncludes=-Wc,-showIncludes + else + showIncludes=-showIncludes + fi + "$@" $showIncludes > "$tmpdepfile" + stat=$? + grep -v '^Note: including file: ' "$tmpdepfile" + if test "$stat" = 0; then : + else + rm -f "$tmpdepfile" + exit $stat + fi + rm -f "$depfile" + echo "$object : \\" > "$depfile" + # The first sed program below extracts the file names and escapes + # backslashes for cygpath. The second sed program outputs the file + # name when reading, but also accumulates all include files in the + # hold buffer in order to output them again at the end. This only + # works with sed implementations that can handle large buffers. + sed < "$tmpdepfile" -n ' +/^Note: including file: *\(.*\)/ { + s//\1/ + s/\\/\\\\/g + p +}' | $cygpath_u | sort -u | sed -n ' +s/ /\\ /g +s/\(.*\)/'"$tab"'\1 \\/p +s/.\(.*\) \\/\1:/ +H +$ { + s/.*/'"$tab"'/ + G + p +}' >> "$depfile" + rm -f "$tmpdepfile" + ;; + +msvc7msys) + # This case exists only to let depend.m4 do its work. It works by + # looking at the text of this script. This case will never be run, + # since it is checked for above. + exit 1 + ;; + +#nosideeffect) + # This comment above is used by automake to tell side-effect + # dependency tracking mechanisms from slower ones. + +dashmstdout) + # Important note: in order to support this mode, a compiler *must* + # always write the preprocessed file to stdout, regardless of -o. + "$@" || exit $? + + # Remove the call to Libtool. + if test "$libtool" = yes; then + while test "X$1" != 'X--mode=compile'; do + shift + done + shift + fi + + # Remove '-o $object'. + IFS=" " + for arg + do + case $arg in + -o) + shift + ;; + $object) + shift + ;; + *) + set fnord "$@" "$arg" + shift # fnord + shift # $arg + ;; + esac + done + + test -z "$dashmflag" && dashmflag=-M + # Require at least two characters before searching for ':' + # in the target name. This is to cope with DOS-style filenames: + # a dependency such as 'c:/foo/bar' could be seen as target 'c' otherwise. + "$@" $dashmflag | + sed 's:^['"$tab"' ]*[^:'"$tab"' ][^:][^:]*\:['"$tab"' ]*:'"$object"'\: :' > "$tmpdepfile" + rm -f "$depfile" + cat < "$tmpdepfile" > "$depfile" + tr ' ' "$nl" < "$tmpdepfile" | \ +## Some versions of the HPUX 10.20 sed can't process this invocation +## correctly. Breaking it into two sed invocations is a workaround. + sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile" + rm -f "$tmpdepfile" + ;; + +dashXmstdout) + # This case only exists to satisfy depend.m4. It is never actually + # run, as this mode is specially recognized in the preamble. + exit 1 + ;; + +makedepend) + "$@" || exit $? + # Remove any Libtool call + if test "$libtool" = yes; then + while test "X$1" != 'X--mode=compile'; do + shift + done + shift + fi + # X makedepend + shift + cleared=no eat=no + for arg + do + case $cleared in + no) + set ""; shift + cleared=yes ;; + esac + if test $eat = yes; then + eat=no + continue + fi + case "$arg" in + -D*|-I*) + set fnord "$@" "$arg"; shift ;; + # Strip any option that makedepend may not understand. Remove + # the object too, otherwise makedepend will parse it as a source file. + -arch) + eat=yes ;; + -*|$object) + ;; + *) + set fnord "$@" "$arg"; shift ;; + esac + done + obj_suffix=`echo "$object" | sed 's/^.*\././'` + touch "$tmpdepfile" + ${MAKEDEPEND-makedepend} -o"$obj_suffix" -f"$tmpdepfile" "$@" + rm -f "$depfile" + # makedepend may prepend the VPATH from the source file name to the object. + # No need to regex-escape $object, excess matching of '.' is harmless. + sed "s|^.*\($object *:\)|\1|" "$tmpdepfile" > "$depfile" + sed '1,2d' "$tmpdepfile" | tr ' ' "$nl" | \ +## Some versions of the HPUX 10.20 sed can't process this invocation +## correctly. Breaking it into two sed invocations is a workaround. + sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile" + rm -f "$tmpdepfile" "$tmpdepfile".bak + ;; + +cpp) + # Important note: in order to support this mode, a compiler *must* + # always write the preprocessed file to stdout. + "$@" || exit $? + + # Remove the call to Libtool. + if test "$libtool" = yes; then + while test "X$1" != 'X--mode=compile'; do + shift + done + shift + fi + + # Remove '-o $object'. + IFS=" " + for arg + do + case $arg in + -o) + shift + ;; + $object) + shift + ;; + *) + set fnord "$@" "$arg" + shift # fnord + shift # $arg + ;; + esac + done + + "$@" -E | + sed -n -e '/^# [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \ + -e '/^#line [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' | + sed '$ s: \\$::' > "$tmpdepfile" + rm -f "$depfile" + echo "$object : \\" > "$depfile" + cat < "$tmpdepfile" >> "$depfile" + sed < "$tmpdepfile" '/^$/d;s/^ //;s/ \\$//;s/$/ :/' >> "$depfile" + rm -f "$tmpdepfile" + ;; + +msvisualcpp) + # Important note: in order to support this mode, a compiler *must* + # always write the preprocessed file to stdout. + "$@" || exit $? + + # Remove the call to Libtool. + if test "$libtool" = yes; then + while test "X$1" != 'X--mode=compile'; do + shift + done + shift + fi + + IFS=" " + for arg + do + case "$arg" in + -o) + shift + ;; + $object) + shift + ;; + "-Gm"|"/Gm"|"-Gi"|"/Gi"|"-ZI"|"/ZI") + set fnord "$@" + shift + shift + ;; + *) + set fnord "$@" "$arg" + shift + shift + ;; + esac + done + "$@" -E 2>/dev/null | + sed -n '/^#line [0-9][0-9]* "\([^"]*\)"/ s::\1:p' | $cygpath_u | sort -u > "$tmpdepfile" + rm -f "$depfile" + echo "$object : \\" > "$depfile" + sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::'"$tab"'\1 \\:p' >> "$depfile" + echo "$tab" >> "$depfile" + sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::\1\::p' >> "$depfile" + rm -f "$tmpdepfile" + ;; + +msvcmsys) + # This case exists only to let depend.m4 do its work. It works by + # looking at the text of this script. This case will never be run, + # since it is checked for above. + exit 1 + ;; + +none) + exec "$@" + ;; + +*) + echo "Unknown depmode $depmode" 1>&2 + exit 1 + ;; +esac + +exit 0 + +# Local Variables: +# mode: shell-script +# sh-indentation: 2 +# eval: (add-hook 'write-file-hooks 'time-stamp) +# time-stamp-start: "scriptversion=" +# time-stamp-format: "%:y-%02m-%02d.%02H" +# time-stamp-time-zone: "UTC" +# time-stamp-end: "; # UTC" +# End: diff --git a/pkg/registry/zookeeper-3.4.6/src/c/generated/zookeeper.jute.c b/pkg/registry/zookeeper-3.4.6/src/c/generated/zookeeper.jute.c new file mode 100644 index 000000000..5823c2f01 --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/c/generated/zookeeper.jute.c @@ -0,0 +1,1315 @@ +/** +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you 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. +*/ + +#include +#include "zookeeper.jute.h" + +int serialize_Id(struct oarchive *out, const char *tag, struct Id *v){ + int rc; + rc = out->start_record(out, tag); + rc = rc ? rc : out->serialize_String(out, "scheme", &v->scheme); + rc = rc ? rc : out->serialize_String(out, "id", &v->id); + rc = rc ? rc : out->end_record(out, tag); + return rc; +} +int deserialize_Id(struct iarchive *in, const char *tag, struct Id*v){ + int rc; + rc = in->start_record(in, tag); + rc = rc ? rc : in->deserialize_String(in, "scheme", &v->scheme); + rc = rc ? rc : in->deserialize_String(in, "id", &v->id); + rc = rc ? rc : in->end_record(in, tag); + return rc; +} +void deallocate_Id(struct Id*v){ + deallocate_String(&v->scheme); + deallocate_String(&v->id); +} +int serialize_ACL(struct oarchive *out, const char *tag, struct ACL *v){ + int rc; + rc = out->start_record(out, tag); + rc = rc ? rc : out->serialize_Int(out, "perms", &v->perms); + rc = rc ? rc : serialize_Id(out, "id", &v->id); + rc = rc ? rc : out->end_record(out, tag); + return rc; +} +int deserialize_ACL(struct iarchive *in, const char *tag, struct ACL*v){ + int rc; + rc = in->start_record(in, tag); + rc = rc ? rc : in->deserialize_Int(in, "perms", &v->perms); + rc = rc ? rc : deserialize_Id(in, "id", &v->id); + rc = rc ? rc : in->end_record(in, tag); + return rc; +} +void deallocate_ACL(struct ACL*v){ + deallocate_Id(&v->id); +} +int serialize_Stat(struct oarchive *out, const char *tag, struct Stat *v){ + int rc; + rc = out->start_record(out, tag); + rc = rc ? rc : out->serialize_Long(out, "czxid", &v->czxid); + rc = rc ? rc : out->serialize_Long(out, "mzxid", &v->mzxid); + rc = rc ? rc : out->serialize_Long(out, "ctime", &v->ctime); + rc = rc ? rc : out->serialize_Long(out, "mtime", &v->mtime); + rc = rc ? rc : out->serialize_Int(out, "version", &v->version); + rc = rc ? rc : out->serialize_Int(out, "cversion", &v->cversion); + rc = rc ? rc : out->serialize_Int(out, "aversion", &v->aversion); + rc = rc ? rc : out->serialize_Long(out, "ephemeralOwner", &v->ephemeralOwner); + rc = rc ? rc : out->serialize_Int(out, "dataLength", &v->dataLength); + rc = rc ? rc : out->serialize_Int(out, "numChildren", &v->numChildren); + rc = rc ? rc : out->serialize_Long(out, "pzxid", &v->pzxid); + rc = rc ? rc : out->end_record(out, tag); + return rc; +} +int deserialize_Stat(struct iarchive *in, const char *tag, struct Stat*v){ + int rc; + rc = in->start_record(in, tag); + rc = rc ? rc : in->deserialize_Long(in, "czxid", &v->czxid); + rc = rc ? rc : in->deserialize_Long(in, "mzxid", &v->mzxid); + rc = rc ? rc : in->deserialize_Long(in, "ctime", &v->ctime); + rc = rc ? rc : in->deserialize_Long(in, "mtime", &v->mtime); + rc = rc ? rc : in->deserialize_Int(in, "version", &v->version); + rc = rc ? rc : in->deserialize_Int(in, "cversion", &v->cversion); + rc = rc ? rc : in->deserialize_Int(in, "aversion", &v->aversion); + rc = rc ? rc : in->deserialize_Long(in, "ephemeralOwner", &v->ephemeralOwner); + rc = rc ? rc : in->deserialize_Int(in, "dataLength", &v->dataLength); + rc = rc ? rc : in->deserialize_Int(in, "numChildren", &v->numChildren); + rc = rc ? rc : in->deserialize_Long(in, "pzxid", &v->pzxid); + rc = rc ? rc : in->end_record(in, tag); + return rc; +} +void deallocate_Stat(struct Stat*v){ +} +int serialize_StatPersisted(struct oarchive *out, const char *tag, struct StatPersisted *v){ + int rc; + rc = out->start_record(out, tag); + rc = rc ? rc : out->serialize_Long(out, "czxid", &v->czxid); + rc = rc ? rc : out->serialize_Long(out, "mzxid", &v->mzxid); + rc = rc ? rc : out->serialize_Long(out, "ctime", &v->ctime); + rc = rc ? rc : out->serialize_Long(out, "mtime", &v->mtime); + rc = rc ? rc : out->serialize_Int(out, "version", &v->version); + rc = rc ? rc : out->serialize_Int(out, "cversion", &v->cversion); + rc = rc ? rc : out->serialize_Int(out, "aversion", &v->aversion); + rc = rc ? rc : out->serialize_Long(out, "ephemeralOwner", &v->ephemeralOwner); + rc = rc ? rc : out->serialize_Long(out, "pzxid", &v->pzxid); + rc = rc ? rc : out->end_record(out, tag); + return rc; +} +int deserialize_StatPersisted(struct iarchive *in, const char *tag, struct StatPersisted*v){ + int rc; + rc = in->start_record(in, tag); + rc = rc ? rc : in->deserialize_Long(in, "czxid", &v->czxid); + rc = rc ? rc : in->deserialize_Long(in, "mzxid", &v->mzxid); + rc = rc ? rc : in->deserialize_Long(in, "ctime", &v->ctime); + rc = rc ? rc : in->deserialize_Long(in, "mtime", &v->mtime); + rc = rc ? rc : in->deserialize_Int(in, "version", &v->version); + rc = rc ? rc : in->deserialize_Int(in, "cversion", &v->cversion); + rc = rc ? rc : in->deserialize_Int(in, "aversion", &v->aversion); + rc = rc ? rc : in->deserialize_Long(in, "ephemeralOwner", &v->ephemeralOwner); + rc = rc ? rc : in->deserialize_Long(in, "pzxid", &v->pzxid); + rc = rc ? rc : in->end_record(in, tag); + return rc; +} +void deallocate_StatPersisted(struct StatPersisted*v){ +} +int serialize_StatPersistedV1(struct oarchive *out, const char *tag, struct StatPersistedV1 *v){ + int rc; + rc = out->start_record(out, tag); + rc = rc ? rc : out->serialize_Long(out, "czxid", &v->czxid); + rc = rc ? rc : out->serialize_Long(out, "mzxid", &v->mzxid); + rc = rc ? rc : out->serialize_Long(out, "ctime", &v->ctime); + rc = rc ? rc : out->serialize_Long(out, "mtime", &v->mtime); + rc = rc ? rc : out->serialize_Int(out, "version", &v->version); + rc = rc ? rc : out->serialize_Int(out, "cversion", &v->cversion); + rc = rc ? rc : out->serialize_Int(out, "aversion", &v->aversion); + rc = rc ? rc : out->serialize_Long(out, "ephemeralOwner", &v->ephemeralOwner); + rc = rc ? rc : out->end_record(out, tag); + return rc; +} +int deserialize_StatPersistedV1(struct iarchive *in, const char *tag, struct StatPersistedV1*v){ + int rc; + rc = in->start_record(in, tag); + rc = rc ? rc : in->deserialize_Long(in, "czxid", &v->czxid); + rc = rc ? rc : in->deserialize_Long(in, "mzxid", &v->mzxid); + rc = rc ? rc : in->deserialize_Long(in, "ctime", &v->ctime); + rc = rc ? rc : in->deserialize_Long(in, "mtime", &v->mtime); + rc = rc ? rc : in->deserialize_Int(in, "version", &v->version); + rc = rc ? rc : in->deserialize_Int(in, "cversion", &v->cversion); + rc = rc ? rc : in->deserialize_Int(in, "aversion", &v->aversion); + rc = rc ? rc : in->deserialize_Long(in, "ephemeralOwner", &v->ephemeralOwner); + rc = rc ? rc : in->end_record(in, tag); + return rc; +} +void deallocate_StatPersistedV1(struct StatPersistedV1*v){ +} +int serialize_ConnectRequest(struct oarchive *out, const char *tag, struct ConnectRequest *v){ + int rc; + rc = out->start_record(out, tag); + rc = rc ? rc : out->serialize_Int(out, "protocolVersion", &v->protocolVersion); + rc = rc ? rc : out->serialize_Long(out, "lastZxidSeen", &v->lastZxidSeen); + rc = rc ? rc : out->serialize_Int(out, "timeOut", &v->timeOut); + rc = rc ? rc : out->serialize_Long(out, "sessionId", &v->sessionId); + rc = rc ? rc : out->serialize_Buffer(out, "passwd", &v->passwd); + rc = rc ? rc : out->end_record(out, tag); + return rc; +} +int deserialize_ConnectRequest(struct iarchive *in, const char *tag, struct ConnectRequest*v){ + int rc; + rc = in->start_record(in, tag); + rc = rc ? rc : in->deserialize_Int(in, "protocolVersion", &v->protocolVersion); + rc = rc ? rc : in->deserialize_Long(in, "lastZxidSeen", &v->lastZxidSeen); + rc = rc ? rc : in->deserialize_Int(in, "timeOut", &v->timeOut); + rc = rc ? rc : in->deserialize_Long(in, "sessionId", &v->sessionId); + rc = rc ? rc : in->deserialize_Buffer(in, "passwd", &v->passwd); + rc = rc ? rc : in->end_record(in, tag); + return rc; +} +void deallocate_ConnectRequest(struct ConnectRequest*v){ + deallocate_Buffer(&v->passwd); +} +int serialize_ConnectResponse(struct oarchive *out, const char *tag, struct ConnectResponse *v){ + int rc; + rc = out->start_record(out, tag); + rc = rc ? rc : out->serialize_Int(out, "protocolVersion", &v->protocolVersion); + rc = rc ? rc : out->serialize_Int(out, "timeOut", &v->timeOut); + rc = rc ? rc : out->serialize_Long(out, "sessionId", &v->sessionId); + rc = rc ? rc : out->serialize_Buffer(out, "passwd", &v->passwd); + rc = rc ? rc : out->end_record(out, tag); + return rc; +} +int deserialize_ConnectResponse(struct iarchive *in, const char *tag, struct ConnectResponse*v){ + int rc; + rc = in->start_record(in, tag); + rc = rc ? rc : in->deserialize_Int(in, "protocolVersion", &v->protocolVersion); + rc = rc ? rc : in->deserialize_Int(in, "timeOut", &v->timeOut); + rc = rc ? rc : in->deserialize_Long(in, "sessionId", &v->sessionId); + rc = rc ? rc : in->deserialize_Buffer(in, "passwd", &v->passwd); + rc = rc ? rc : in->end_record(in, tag); + return rc; +} +void deallocate_ConnectResponse(struct ConnectResponse*v){ + deallocate_Buffer(&v->passwd); +} +int allocate_String_vector(struct String_vector *v, int32_t len) { + if (!len) { + v->count = 0; + v->data = 0; + } else { + v->count = len; + v->data = calloc(sizeof(*v->data), len); + } + return 0; +} +int deallocate_String_vector(struct String_vector *v) { + if (v->data) { + int32_t i; + for(i=0;icount; i++) { + deallocate_String(&v->data[i]); + } + free(v->data); + v->data = 0; + } + return 0; +} +int serialize_String_vector(struct oarchive *out, const char *tag, struct String_vector *v) +{ + int32_t count = v->count; + int rc = 0; + int32_t i; + rc = out->start_vector(out, tag, &count); + for(i=0;icount;i++) { + rc = rc ? rc : out->serialize_String(out, "data", &v->data[i]); + } + rc = rc ? rc : out->end_vector(out, tag); + return rc; +} +int deserialize_String_vector(struct iarchive *in, const char *tag, struct String_vector *v) +{ + int rc = 0; + int32_t i; + rc = in->start_vector(in, tag, &v->count); + v->data = calloc(v->count, sizeof(*v->data)); + for(i=0;icount;i++) { + rc = rc ? rc : in->deserialize_String(in, "value", &v->data[i]); + } + rc = in->end_vector(in, tag); + return rc; +} +int serialize_SetWatches(struct oarchive *out, const char *tag, struct SetWatches *v){ + int rc; + rc = out->start_record(out, tag); + rc = rc ? rc : out->serialize_Long(out, "relativeZxid", &v->relativeZxid); + rc = rc ? rc : serialize_String_vector(out, "dataWatches", &v->dataWatches); + rc = rc ? rc : serialize_String_vector(out, "existWatches", &v->existWatches); + rc = rc ? rc : serialize_String_vector(out, "childWatches", &v->childWatches); + rc = rc ? rc : out->end_record(out, tag); + return rc; +} +int deserialize_SetWatches(struct iarchive *in, const char *tag, struct SetWatches*v){ + int rc; + rc = in->start_record(in, tag); + rc = rc ? rc : in->deserialize_Long(in, "relativeZxid", &v->relativeZxid); + rc = rc ? rc : deserialize_String_vector(in, "dataWatches", &v->dataWatches); + rc = rc ? rc : deserialize_String_vector(in, "existWatches", &v->existWatches); + rc = rc ? rc : deserialize_String_vector(in, "childWatches", &v->childWatches); + rc = rc ? rc : in->end_record(in, tag); + return rc; +} +void deallocate_SetWatches(struct SetWatches*v){ + deallocate_String_vector(&v->dataWatches); + deallocate_String_vector(&v->existWatches); + deallocate_String_vector(&v->childWatches); +} +int serialize_RequestHeader(struct oarchive *out, const char *tag, struct RequestHeader *v){ + int rc; + rc = out->start_record(out, tag); + rc = rc ? rc : out->serialize_Int(out, "xid", &v->xid); + rc = rc ? rc : out->serialize_Int(out, "type", &v->type); + rc = rc ? rc : out->end_record(out, tag); + return rc; +} +int deserialize_RequestHeader(struct iarchive *in, const char *tag, struct RequestHeader*v){ + int rc; + rc = in->start_record(in, tag); + rc = rc ? rc : in->deserialize_Int(in, "xid", &v->xid); + rc = rc ? rc : in->deserialize_Int(in, "type", &v->type); + rc = rc ? rc : in->end_record(in, tag); + return rc; +} +void deallocate_RequestHeader(struct RequestHeader*v){ +} +int serialize_MultiHeader(struct oarchive *out, const char *tag, struct MultiHeader *v){ + int rc; + rc = out->start_record(out, tag); + rc = rc ? rc : out->serialize_Int(out, "type", &v->type); + rc = rc ? rc : out->serialize_Bool(out, "done", &v->done); + rc = rc ? rc : out->serialize_Int(out, "err", &v->err); + rc = rc ? rc : out->end_record(out, tag); + return rc; +} +int deserialize_MultiHeader(struct iarchive *in, const char *tag, struct MultiHeader*v){ + int rc; + rc = in->start_record(in, tag); + rc = rc ? rc : in->deserialize_Int(in, "type", &v->type); + rc = rc ? rc : in->deserialize_Bool(in, "done", &v->done); + rc = rc ? rc : in->deserialize_Int(in, "err", &v->err); + rc = rc ? rc : in->end_record(in, tag); + return rc; +} +void deallocate_MultiHeader(struct MultiHeader*v){ +} +int serialize_AuthPacket(struct oarchive *out, const char *tag, struct AuthPacket *v){ + int rc; + rc = out->start_record(out, tag); + rc = rc ? rc : out->serialize_Int(out, "type", &v->type); + rc = rc ? rc : out->serialize_String(out, "scheme", &v->scheme); + rc = rc ? rc : out->serialize_Buffer(out, "auth", &v->auth); + rc = rc ? rc : out->end_record(out, tag); + return rc; +} +int deserialize_AuthPacket(struct iarchive *in, const char *tag, struct AuthPacket*v){ + int rc; + rc = in->start_record(in, tag); + rc = rc ? rc : in->deserialize_Int(in, "type", &v->type); + rc = rc ? rc : in->deserialize_String(in, "scheme", &v->scheme); + rc = rc ? rc : in->deserialize_Buffer(in, "auth", &v->auth); + rc = rc ? rc : in->end_record(in, tag); + return rc; +} +void deallocate_AuthPacket(struct AuthPacket*v){ + deallocate_String(&v->scheme); + deallocate_Buffer(&v->auth); +} +int serialize_ReplyHeader(struct oarchive *out, const char *tag, struct ReplyHeader *v){ + int rc; + rc = out->start_record(out, tag); + rc = rc ? rc : out->serialize_Int(out, "xid", &v->xid); + rc = rc ? rc : out->serialize_Long(out, "zxid", &v->zxid); + rc = rc ? rc : out->serialize_Int(out, "err", &v->err); + rc = rc ? rc : out->end_record(out, tag); + return rc; +} +int deserialize_ReplyHeader(struct iarchive *in, const char *tag, struct ReplyHeader*v){ + int rc; + rc = in->start_record(in, tag); + rc = rc ? rc : in->deserialize_Int(in, "xid", &v->xid); + rc = rc ? rc : in->deserialize_Long(in, "zxid", &v->zxid); + rc = rc ? rc : in->deserialize_Int(in, "err", &v->err); + rc = rc ? rc : in->end_record(in, tag); + return rc; +} +void deallocate_ReplyHeader(struct ReplyHeader*v){ +} +int serialize_GetDataRequest(struct oarchive *out, const char *tag, struct GetDataRequest *v){ + int rc; + rc = out->start_record(out, tag); + rc = rc ? rc : out->serialize_String(out, "path", &v->path); + rc = rc ? rc : out->serialize_Bool(out, "watch", &v->watch); + rc = rc ? rc : out->end_record(out, tag); + return rc; +} +int deserialize_GetDataRequest(struct iarchive *in, const char *tag, struct GetDataRequest*v){ + int rc; + rc = in->start_record(in, tag); + rc = rc ? rc : in->deserialize_String(in, "path", &v->path); + rc = rc ? rc : in->deserialize_Bool(in, "watch", &v->watch); + rc = rc ? rc : in->end_record(in, tag); + return rc; +} +void deallocate_GetDataRequest(struct GetDataRequest*v){ + deallocate_String(&v->path); +} +int serialize_SetDataRequest(struct oarchive *out, const char *tag, struct SetDataRequest *v){ + int rc; + rc = out->start_record(out, tag); + rc = rc ? rc : out->serialize_String(out, "path", &v->path); + rc = rc ? rc : out->serialize_Buffer(out, "data", &v->data); + rc = rc ? rc : out->serialize_Int(out, "version", &v->version); + rc = rc ? rc : out->end_record(out, tag); + return rc; +} +int deserialize_SetDataRequest(struct iarchive *in, const char *tag, struct SetDataRequest*v){ + int rc; + rc = in->start_record(in, tag); + rc = rc ? rc : in->deserialize_String(in, "path", &v->path); + rc = rc ? rc : in->deserialize_Buffer(in, "data", &v->data); + rc = rc ? rc : in->deserialize_Int(in, "version", &v->version); + rc = rc ? rc : in->end_record(in, tag); + return rc; +} +void deallocate_SetDataRequest(struct SetDataRequest*v){ + deallocate_String(&v->path); + deallocate_Buffer(&v->data); +} +int serialize_SetDataResponse(struct oarchive *out, const char *tag, struct SetDataResponse *v){ + int rc; + rc = out->start_record(out, tag); + rc = rc ? rc : serialize_Stat(out, "stat", &v->stat); + rc = rc ? rc : out->end_record(out, tag); + return rc; +} +int deserialize_SetDataResponse(struct iarchive *in, const char *tag, struct SetDataResponse*v){ + int rc; + rc = in->start_record(in, tag); + rc = rc ? rc : deserialize_Stat(in, "stat", &v->stat); + rc = rc ? rc : in->end_record(in, tag); + return rc; +} +void deallocate_SetDataResponse(struct SetDataResponse*v){ + deallocate_Stat(&v->stat); +} +int serialize_GetSASLRequest(struct oarchive *out, const char *tag, struct GetSASLRequest *v){ + int rc; + rc = out->start_record(out, tag); + rc = rc ? rc : out->serialize_Buffer(out, "token", &v->token); + rc = rc ? rc : out->end_record(out, tag); + return rc; +} +int deserialize_GetSASLRequest(struct iarchive *in, const char *tag, struct GetSASLRequest*v){ + int rc; + rc = in->start_record(in, tag); + rc = rc ? rc : in->deserialize_Buffer(in, "token", &v->token); + rc = rc ? rc : in->end_record(in, tag); + return rc; +} +void deallocate_GetSASLRequest(struct GetSASLRequest*v){ + deallocate_Buffer(&v->token); +} +int serialize_SetSASLRequest(struct oarchive *out, const char *tag, struct SetSASLRequest *v){ + int rc; + rc = out->start_record(out, tag); + rc = rc ? rc : out->serialize_Buffer(out, "token", &v->token); + rc = rc ? rc : out->end_record(out, tag); + return rc; +} +int deserialize_SetSASLRequest(struct iarchive *in, const char *tag, struct SetSASLRequest*v){ + int rc; + rc = in->start_record(in, tag); + rc = rc ? rc : in->deserialize_Buffer(in, "token", &v->token); + rc = rc ? rc : in->end_record(in, tag); + return rc; +} +void deallocate_SetSASLRequest(struct SetSASLRequest*v){ + deallocate_Buffer(&v->token); +} +int serialize_SetSASLResponse(struct oarchive *out, const char *tag, struct SetSASLResponse *v){ + int rc; + rc = out->start_record(out, tag); + rc = rc ? rc : out->serialize_Buffer(out, "token", &v->token); + rc = rc ? rc : out->end_record(out, tag); + return rc; +} +int deserialize_SetSASLResponse(struct iarchive *in, const char *tag, struct SetSASLResponse*v){ + int rc; + rc = in->start_record(in, tag); + rc = rc ? rc : in->deserialize_Buffer(in, "token", &v->token); + rc = rc ? rc : in->end_record(in, tag); + return rc; +} +void deallocate_SetSASLResponse(struct SetSASLResponse*v){ + deallocate_Buffer(&v->token); +} +int allocate_ACL_vector(struct ACL_vector *v, int32_t len) { + if (!len) { + v->count = 0; + v->data = 0; + } else { + v->count = len; + v->data = calloc(sizeof(*v->data), len); + } + return 0; +} +int deallocate_ACL_vector(struct ACL_vector *v) { + if (v->data) { + int32_t i; + for(i=0;icount; i++) { + deallocate_ACL(&v->data[i]); + } + free(v->data); + v->data = 0; + } + return 0; +} +int serialize_ACL_vector(struct oarchive *out, const char *tag, struct ACL_vector *v) +{ + int32_t count = v->count; + int rc = 0; + int32_t i; + rc = out->start_vector(out, tag, &count); + for(i=0;icount;i++) { + rc = rc ? rc : serialize_ACL(out, "data", &v->data[i]); + } + rc = rc ? rc : out->end_vector(out, tag); + return rc; +} +int deserialize_ACL_vector(struct iarchive *in, const char *tag, struct ACL_vector *v) +{ + int rc = 0; + int32_t i; + rc = in->start_vector(in, tag, &v->count); + v->data = calloc(v->count, sizeof(*v->data)); + for(i=0;icount;i++) { + rc = rc ? rc : deserialize_ACL(in, "value", &v->data[i]); + } + rc = in->end_vector(in, tag); + return rc; +} +int serialize_CreateRequest(struct oarchive *out, const char *tag, struct CreateRequest *v){ + int rc; + rc = out->start_record(out, tag); + rc = rc ? rc : out->serialize_String(out, "path", &v->path); + rc = rc ? rc : out->serialize_Buffer(out, "data", &v->data); + rc = rc ? rc : serialize_ACL_vector(out, "acl", &v->acl); + rc = rc ? rc : out->serialize_Int(out, "flags", &v->flags); + rc = rc ? rc : out->end_record(out, tag); + return rc; +} +int deserialize_CreateRequest(struct iarchive *in, const char *tag, struct CreateRequest*v){ + int rc; + rc = in->start_record(in, tag); + rc = rc ? rc : in->deserialize_String(in, "path", &v->path); + rc = rc ? rc : in->deserialize_Buffer(in, "data", &v->data); + rc = rc ? rc : deserialize_ACL_vector(in, "acl", &v->acl); + rc = rc ? rc : in->deserialize_Int(in, "flags", &v->flags); + rc = rc ? rc : in->end_record(in, tag); + return rc; +} +void deallocate_CreateRequest(struct CreateRequest*v){ + deallocate_String(&v->path); + deallocate_Buffer(&v->data); + deallocate_ACL_vector(&v->acl); +} +int serialize_DeleteRequest(struct oarchive *out, const char *tag, struct DeleteRequest *v){ + int rc; + rc = out->start_record(out, tag); + rc = rc ? rc : out->serialize_String(out, "path", &v->path); + rc = rc ? rc : out->serialize_Int(out, "version", &v->version); + rc = rc ? rc : out->end_record(out, tag); + return rc; +} +int deserialize_DeleteRequest(struct iarchive *in, const char *tag, struct DeleteRequest*v){ + int rc; + rc = in->start_record(in, tag); + rc = rc ? rc : in->deserialize_String(in, "path", &v->path); + rc = rc ? rc : in->deserialize_Int(in, "version", &v->version); + rc = rc ? rc : in->end_record(in, tag); + return rc; +} +void deallocate_DeleteRequest(struct DeleteRequest*v){ + deallocate_String(&v->path); +} +int serialize_GetChildrenRequest(struct oarchive *out, const char *tag, struct GetChildrenRequest *v){ + int rc; + rc = out->start_record(out, tag); + rc = rc ? rc : out->serialize_String(out, "path", &v->path); + rc = rc ? rc : out->serialize_Bool(out, "watch", &v->watch); + rc = rc ? rc : out->end_record(out, tag); + return rc; +} +int deserialize_GetChildrenRequest(struct iarchive *in, const char *tag, struct GetChildrenRequest*v){ + int rc; + rc = in->start_record(in, tag); + rc = rc ? rc : in->deserialize_String(in, "path", &v->path); + rc = rc ? rc : in->deserialize_Bool(in, "watch", &v->watch); + rc = rc ? rc : in->end_record(in, tag); + return rc; +} +void deallocate_GetChildrenRequest(struct GetChildrenRequest*v){ + deallocate_String(&v->path); +} +int serialize_GetChildren2Request(struct oarchive *out, const char *tag, struct GetChildren2Request *v){ + int rc; + rc = out->start_record(out, tag); + rc = rc ? rc : out->serialize_String(out, "path", &v->path); + rc = rc ? rc : out->serialize_Bool(out, "watch", &v->watch); + rc = rc ? rc : out->end_record(out, tag); + return rc; +} +int deserialize_GetChildren2Request(struct iarchive *in, const char *tag, struct GetChildren2Request*v){ + int rc; + rc = in->start_record(in, tag); + rc = rc ? rc : in->deserialize_String(in, "path", &v->path); + rc = rc ? rc : in->deserialize_Bool(in, "watch", &v->watch); + rc = rc ? rc : in->end_record(in, tag); + return rc; +} +void deallocate_GetChildren2Request(struct GetChildren2Request*v){ + deallocate_String(&v->path); +} +int serialize_CheckVersionRequest(struct oarchive *out, const char *tag, struct CheckVersionRequest *v){ + int rc; + rc = out->start_record(out, tag); + rc = rc ? rc : out->serialize_String(out, "path", &v->path); + rc = rc ? rc : out->serialize_Int(out, "version", &v->version); + rc = rc ? rc : out->end_record(out, tag); + return rc; +} +int deserialize_CheckVersionRequest(struct iarchive *in, const char *tag, struct CheckVersionRequest*v){ + int rc; + rc = in->start_record(in, tag); + rc = rc ? rc : in->deserialize_String(in, "path", &v->path); + rc = rc ? rc : in->deserialize_Int(in, "version", &v->version); + rc = rc ? rc : in->end_record(in, tag); + return rc; +} +void deallocate_CheckVersionRequest(struct CheckVersionRequest*v){ + deallocate_String(&v->path); +} +int serialize_GetMaxChildrenRequest(struct oarchive *out, const char *tag, struct GetMaxChildrenRequest *v){ + int rc; + rc = out->start_record(out, tag); + rc = rc ? rc : out->serialize_String(out, "path", &v->path); + rc = rc ? rc : out->end_record(out, tag); + return rc; +} +int deserialize_GetMaxChildrenRequest(struct iarchive *in, const char *tag, struct GetMaxChildrenRequest*v){ + int rc; + rc = in->start_record(in, tag); + rc = rc ? rc : in->deserialize_String(in, "path", &v->path); + rc = rc ? rc : in->end_record(in, tag); + return rc; +} +void deallocate_GetMaxChildrenRequest(struct GetMaxChildrenRequest*v){ + deallocate_String(&v->path); +} +int serialize_GetMaxChildrenResponse(struct oarchive *out, const char *tag, struct GetMaxChildrenResponse *v){ + int rc; + rc = out->start_record(out, tag); + rc = rc ? rc : out->serialize_Int(out, "max", &v->max); + rc = rc ? rc : out->end_record(out, tag); + return rc; +} +int deserialize_GetMaxChildrenResponse(struct iarchive *in, const char *tag, struct GetMaxChildrenResponse*v){ + int rc; + rc = in->start_record(in, tag); + rc = rc ? rc : in->deserialize_Int(in, "max", &v->max); + rc = rc ? rc : in->end_record(in, tag); + return rc; +} +void deallocate_GetMaxChildrenResponse(struct GetMaxChildrenResponse*v){ +} +int serialize_SetMaxChildrenRequest(struct oarchive *out, const char *tag, struct SetMaxChildrenRequest *v){ + int rc; + rc = out->start_record(out, tag); + rc = rc ? rc : out->serialize_String(out, "path", &v->path); + rc = rc ? rc : out->serialize_Int(out, "max", &v->max); + rc = rc ? rc : out->end_record(out, tag); + return rc; +} +int deserialize_SetMaxChildrenRequest(struct iarchive *in, const char *tag, struct SetMaxChildrenRequest*v){ + int rc; + rc = in->start_record(in, tag); + rc = rc ? rc : in->deserialize_String(in, "path", &v->path); + rc = rc ? rc : in->deserialize_Int(in, "max", &v->max); + rc = rc ? rc : in->end_record(in, tag); + return rc; +} +void deallocate_SetMaxChildrenRequest(struct SetMaxChildrenRequest*v){ + deallocate_String(&v->path); +} +int serialize_SyncRequest(struct oarchive *out, const char *tag, struct SyncRequest *v){ + int rc; + rc = out->start_record(out, tag); + rc = rc ? rc : out->serialize_String(out, "path", &v->path); + rc = rc ? rc : out->end_record(out, tag); + return rc; +} +int deserialize_SyncRequest(struct iarchive *in, const char *tag, struct SyncRequest*v){ + int rc; + rc = in->start_record(in, tag); + rc = rc ? rc : in->deserialize_String(in, "path", &v->path); + rc = rc ? rc : in->end_record(in, tag); + return rc; +} +void deallocate_SyncRequest(struct SyncRequest*v){ + deallocate_String(&v->path); +} +int serialize_SyncResponse(struct oarchive *out, const char *tag, struct SyncResponse *v){ + int rc; + rc = out->start_record(out, tag); + rc = rc ? rc : out->serialize_String(out, "path", &v->path); + rc = rc ? rc : out->end_record(out, tag); + return rc; +} +int deserialize_SyncResponse(struct iarchive *in, const char *tag, struct SyncResponse*v){ + int rc; + rc = in->start_record(in, tag); + rc = rc ? rc : in->deserialize_String(in, "path", &v->path); + rc = rc ? rc : in->end_record(in, tag); + return rc; +} +void deallocate_SyncResponse(struct SyncResponse*v){ + deallocate_String(&v->path); +} +int serialize_GetACLRequest(struct oarchive *out, const char *tag, struct GetACLRequest *v){ + int rc; + rc = out->start_record(out, tag); + rc = rc ? rc : out->serialize_String(out, "path", &v->path); + rc = rc ? rc : out->end_record(out, tag); + return rc; +} +int deserialize_GetACLRequest(struct iarchive *in, const char *tag, struct GetACLRequest*v){ + int rc; + rc = in->start_record(in, tag); + rc = rc ? rc : in->deserialize_String(in, "path", &v->path); + rc = rc ? rc : in->end_record(in, tag); + return rc; +} +void deallocate_GetACLRequest(struct GetACLRequest*v){ + deallocate_String(&v->path); +} +int serialize_SetACLRequest(struct oarchive *out, const char *tag, struct SetACLRequest *v){ + int rc; + rc = out->start_record(out, tag); + rc = rc ? rc : out->serialize_String(out, "path", &v->path); + rc = rc ? rc : serialize_ACL_vector(out, "acl", &v->acl); + rc = rc ? rc : out->serialize_Int(out, "version", &v->version); + rc = rc ? rc : out->end_record(out, tag); + return rc; +} +int deserialize_SetACLRequest(struct iarchive *in, const char *tag, struct SetACLRequest*v){ + int rc; + rc = in->start_record(in, tag); + rc = rc ? rc : in->deserialize_String(in, "path", &v->path); + rc = rc ? rc : deserialize_ACL_vector(in, "acl", &v->acl); + rc = rc ? rc : in->deserialize_Int(in, "version", &v->version); + rc = rc ? rc : in->end_record(in, tag); + return rc; +} +void deallocate_SetACLRequest(struct SetACLRequest*v){ + deallocate_String(&v->path); + deallocate_ACL_vector(&v->acl); +} +int serialize_SetACLResponse(struct oarchive *out, const char *tag, struct SetACLResponse *v){ + int rc; + rc = out->start_record(out, tag); + rc = rc ? rc : serialize_Stat(out, "stat", &v->stat); + rc = rc ? rc : out->end_record(out, tag); + return rc; +} +int deserialize_SetACLResponse(struct iarchive *in, const char *tag, struct SetACLResponse*v){ + int rc; + rc = in->start_record(in, tag); + rc = rc ? rc : deserialize_Stat(in, "stat", &v->stat); + rc = rc ? rc : in->end_record(in, tag); + return rc; +} +void deallocate_SetACLResponse(struct SetACLResponse*v){ + deallocate_Stat(&v->stat); +} +int serialize_WatcherEvent(struct oarchive *out, const char *tag, struct WatcherEvent *v){ + int rc; + rc = out->start_record(out, tag); + rc = rc ? rc : out->serialize_Int(out, "type", &v->type); + rc = rc ? rc : out->serialize_Int(out, "state", &v->state); + rc = rc ? rc : out->serialize_String(out, "path", &v->path); + rc = rc ? rc : out->end_record(out, tag); + return rc; +} +int deserialize_WatcherEvent(struct iarchive *in, const char *tag, struct WatcherEvent*v){ + int rc; + rc = in->start_record(in, tag); + rc = rc ? rc : in->deserialize_Int(in, "type", &v->type); + rc = rc ? rc : in->deserialize_Int(in, "state", &v->state); + rc = rc ? rc : in->deserialize_String(in, "path", &v->path); + rc = rc ? rc : in->end_record(in, tag); + return rc; +} +void deallocate_WatcherEvent(struct WatcherEvent*v){ + deallocate_String(&v->path); +} +int serialize_ErrorResponse(struct oarchive *out, const char *tag, struct ErrorResponse *v){ + int rc; + rc = out->start_record(out, tag); + rc = rc ? rc : out->serialize_Int(out, "err", &v->err); + rc = rc ? rc : out->end_record(out, tag); + return rc; +} +int deserialize_ErrorResponse(struct iarchive *in, const char *tag, struct ErrorResponse*v){ + int rc; + rc = in->start_record(in, tag); + rc = rc ? rc : in->deserialize_Int(in, "err", &v->err); + rc = rc ? rc : in->end_record(in, tag); + return rc; +} +void deallocate_ErrorResponse(struct ErrorResponse*v){ +} +int serialize_CreateResponse(struct oarchive *out, const char *tag, struct CreateResponse *v){ + int rc; + rc = out->start_record(out, tag); + rc = rc ? rc : out->serialize_String(out, "path", &v->path); + rc = rc ? rc : out->end_record(out, tag); + return rc; +} +int deserialize_CreateResponse(struct iarchive *in, const char *tag, struct CreateResponse*v){ + int rc; + rc = in->start_record(in, tag); + rc = rc ? rc : in->deserialize_String(in, "path", &v->path); + rc = rc ? rc : in->end_record(in, tag); + return rc; +} +void deallocate_CreateResponse(struct CreateResponse*v){ + deallocate_String(&v->path); +} +int serialize_ExistsRequest(struct oarchive *out, const char *tag, struct ExistsRequest *v){ + int rc; + rc = out->start_record(out, tag); + rc = rc ? rc : out->serialize_String(out, "path", &v->path); + rc = rc ? rc : out->serialize_Bool(out, "watch", &v->watch); + rc = rc ? rc : out->end_record(out, tag); + return rc; +} +int deserialize_ExistsRequest(struct iarchive *in, const char *tag, struct ExistsRequest*v){ + int rc; + rc = in->start_record(in, tag); + rc = rc ? rc : in->deserialize_String(in, "path", &v->path); + rc = rc ? rc : in->deserialize_Bool(in, "watch", &v->watch); + rc = rc ? rc : in->end_record(in, tag); + return rc; +} +void deallocate_ExistsRequest(struct ExistsRequest*v){ + deallocate_String(&v->path); +} +int serialize_ExistsResponse(struct oarchive *out, const char *tag, struct ExistsResponse *v){ + int rc; + rc = out->start_record(out, tag); + rc = rc ? rc : serialize_Stat(out, "stat", &v->stat); + rc = rc ? rc : out->end_record(out, tag); + return rc; +} +int deserialize_ExistsResponse(struct iarchive *in, const char *tag, struct ExistsResponse*v){ + int rc; + rc = in->start_record(in, tag); + rc = rc ? rc : deserialize_Stat(in, "stat", &v->stat); + rc = rc ? rc : in->end_record(in, tag); + return rc; +} +void deallocate_ExistsResponse(struct ExistsResponse*v){ + deallocate_Stat(&v->stat); +} +int serialize_GetDataResponse(struct oarchive *out, const char *tag, struct GetDataResponse *v){ + int rc; + rc = out->start_record(out, tag); + rc = rc ? rc : out->serialize_Buffer(out, "data", &v->data); + rc = rc ? rc : serialize_Stat(out, "stat", &v->stat); + rc = rc ? rc : out->end_record(out, tag); + return rc; +} +int deserialize_GetDataResponse(struct iarchive *in, const char *tag, struct GetDataResponse*v){ + int rc; + rc = in->start_record(in, tag); + rc = rc ? rc : in->deserialize_Buffer(in, "data", &v->data); + rc = rc ? rc : deserialize_Stat(in, "stat", &v->stat); + rc = rc ? rc : in->end_record(in, tag); + return rc; +} +void deallocate_GetDataResponse(struct GetDataResponse*v){ + deallocate_Buffer(&v->data); + deallocate_Stat(&v->stat); +} +int serialize_GetChildrenResponse(struct oarchive *out, const char *tag, struct GetChildrenResponse *v){ + int rc; + rc = out->start_record(out, tag); + rc = rc ? rc : serialize_String_vector(out, "children", &v->children); + rc = rc ? rc : out->end_record(out, tag); + return rc; +} +int deserialize_GetChildrenResponse(struct iarchive *in, const char *tag, struct GetChildrenResponse*v){ + int rc; + rc = in->start_record(in, tag); + rc = rc ? rc : deserialize_String_vector(in, "children", &v->children); + rc = rc ? rc : in->end_record(in, tag); + return rc; +} +void deallocate_GetChildrenResponse(struct GetChildrenResponse*v){ + deallocate_String_vector(&v->children); +} +int serialize_GetChildren2Response(struct oarchive *out, const char *tag, struct GetChildren2Response *v){ + int rc; + rc = out->start_record(out, tag); + rc = rc ? rc : serialize_String_vector(out, "children", &v->children); + rc = rc ? rc : serialize_Stat(out, "stat", &v->stat); + rc = rc ? rc : out->end_record(out, tag); + return rc; +} +int deserialize_GetChildren2Response(struct iarchive *in, const char *tag, struct GetChildren2Response*v){ + int rc; + rc = in->start_record(in, tag); + rc = rc ? rc : deserialize_String_vector(in, "children", &v->children); + rc = rc ? rc : deserialize_Stat(in, "stat", &v->stat); + rc = rc ? rc : in->end_record(in, tag); + return rc; +} +void deallocate_GetChildren2Response(struct GetChildren2Response*v){ + deallocate_String_vector(&v->children); + deallocate_Stat(&v->stat); +} +int serialize_GetACLResponse(struct oarchive *out, const char *tag, struct GetACLResponse *v){ + int rc; + rc = out->start_record(out, tag); + rc = rc ? rc : serialize_ACL_vector(out, "acl", &v->acl); + rc = rc ? rc : serialize_Stat(out, "stat", &v->stat); + rc = rc ? rc : out->end_record(out, tag); + return rc; +} +int deserialize_GetACLResponse(struct iarchive *in, const char *tag, struct GetACLResponse*v){ + int rc; + rc = in->start_record(in, tag); + rc = rc ? rc : deserialize_ACL_vector(in, "acl", &v->acl); + rc = rc ? rc : deserialize_Stat(in, "stat", &v->stat); + rc = rc ? rc : in->end_record(in, tag); + return rc; +} +void deallocate_GetACLResponse(struct GetACLResponse*v){ + deallocate_ACL_vector(&v->acl); + deallocate_Stat(&v->stat); +} +int serialize_LearnerInfo(struct oarchive *out, const char *tag, struct LearnerInfo *v){ + int rc; + rc = out->start_record(out, tag); + rc = rc ? rc : out->serialize_Long(out, "serverid", &v->serverid); + rc = rc ? rc : out->serialize_Int(out, "protocolVersion", &v->protocolVersion); + rc = rc ? rc : out->end_record(out, tag); + return rc; +} +int deserialize_LearnerInfo(struct iarchive *in, const char *tag, struct LearnerInfo*v){ + int rc; + rc = in->start_record(in, tag); + rc = rc ? rc : in->deserialize_Long(in, "serverid", &v->serverid); + rc = rc ? rc : in->deserialize_Int(in, "protocolVersion", &v->protocolVersion); + rc = rc ? rc : in->end_record(in, tag); + return rc; +} +void deallocate_LearnerInfo(struct LearnerInfo*v){ +} +int allocate_Id_vector(struct Id_vector *v, int32_t len) { + if (!len) { + v->count = 0; + v->data = 0; + } else { + v->count = len; + v->data = calloc(sizeof(*v->data), len); + } + return 0; +} +int deallocate_Id_vector(struct Id_vector *v) { + if (v->data) { + int32_t i; + for(i=0;icount; i++) { + deallocate_Id(&v->data[i]); + } + free(v->data); + v->data = 0; + } + return 0; +} +int serialize_Id_vector(struct oarchive *out, const char *tag, struct Id_vector *v) +{ + int32_t count = v->count; + int rc = 0; + int32_t i; + rc = out->start_vector(out, tag, &count); + for(i=0;icount;i++) { + rc = rc ? rc : serialize_Id(out, "data", &v->data[i]); + } + rc = rc ? rc : out->end_vector(out, tag); + return rc; +} +int deserialize_Id_vector(struct iarchive *in, const char *tag, struct Id_vector *v) +{ + int rc = 0; + int32_t i; + rc = in->start_vector(in, tag, &v->count); + v->data = calloc(v->count, sizeof(*v->data)); + for(i=0;icount;i++) { + rc = rc ? rc : deserialize_Id(in, "value", &v->data[i]); + } + rc = in->end_vector(in, tag); + return rc; +} +int serialize_QuorumPacket(struct oarchive *out, const char *tag, struct QuorumPacket *v){ + int rc; + rc = out->start_record(out, tag); + rc = rc ? rc : out->serialize_Int(out, "type", &v->type); + rc = rc ? rc : out->serialize_Long(out, "zxid", &v->zxid); + rc = rc ? rc : out->serialize_Buffer(out, "data", &v->data); + rc = rc ? rc : serialize_Id_vector(out, "authinfo", &v->authinfo); + rc = rc ? rc : out->end_record(out, tag); + return rc; +} +int deserialize_QuorumPacket(struct iarchive *in, const char *tag, struct QuorumPacket*v){ + int rc; + rc = in->start_record(in, tag); + rc = rc ? rc : in->deserialize_Int(in, "type", &v->type); + rc = rc ? rc : in->deserialize_Long(in, "zxid", &v->zxid); + rc = rc ? rc : in->deserialize_Buffer(in, "data", &v->data); + rc = rc ? rc : deserialize_Id_vector(in, "authinfo", &v->authinfo); + rc = rc ? rc : in->end_record(in, tag); + return rc; +} +void deallocate_QuorumPacket(struct QuorumPacket*v){ + deallocate_Buffer(&v->data); + deallocate_Id_vector(&v->authinfo); +} +int serialize_FileHeader(struct oarchive *out, const char *tag, struct FileHeader *v){ + int rc; + rc = out->start_record(out, tag); + rc = rc ? rc : out->serialize_Int(out, "magic", &v->magic); + rc = rc ? rc : out->serialize_Int(out, "version", &v->version); + rc = rc ? rc : out->serialize_Long(out, "dbid", &v->dbid); + rc = rc ? rc : out->end_record(out, tag); + return rc; +} +int deserialize_FileHeader(struct iarchive *in, const char *tag, struct FileHeader*v){ + int rc; + rc = in->start_record(in, tag); + rc = rc ? rc : in->deserialize_Int(in, "magic", &v->magic); + rc = rc ? rc : in->deserialize_Int(in, "version", &v->version); + rc = rc ? rc : in->deserialize_Long(in, "dbid", &v->dbid); + rc = rc ? rc : in->end_record(in, tag); + return rc; +} +void deallocate_FileHeader(struct FileHeader*v){ +} +int serialize_TxnHeader(struct oarchive *out, const char *tag, struct TxnHeader *v){ + int rc; + rc = out->start_record(out, tag); + rc = rc ? rc : out->serialize_Long(out, "clientId", &v->clientId); + rc = rc ? rc : out->serialize_Int(out, "cxid", &v->cxid); + rc = rc ? rc : out->serialize_Long(out, "zxid", &v->zxid); + rc = rc ? rc : out->serialize_Long(out, "time", &v->time); + rc = rc ? rc : out->serialize_Int(out, "type", &v->type); + rc = rc ? rc : out->end_record(out, tag); + return rc; +} +int deserialize_TxnHeader(struct iarchive *in, const char *tag, struct TxnHeader*v){ + int rc; + rc = in->start_record(in, tag); + rc = rc ? rc : in->deserialize_Long(in, "clientId", &v->clientId); + rc = rc ? rc : in->deserialize_Int(in, "cxid", &v->cxid); + rc = rc ? rc : in->deserialize_Long(in, "zxid", &v->zxid); + rc = rc ? rc : in->deserialize_Long(in, "time", &v->time); + rc = rc ? rc : in->deserialize_Int(in, "type", &v->type); + rc = rc ? rc : in->end_record(in, tag); + return rc; +} +void deallocate_TxnHeader(struct TxnHeader*v){ +} +int serialize_CreateTxnV0(struct oarchive *out, const char *tag, struct CreateTxnV0 *v){ + int rc; + rc = out->start_record(out, tag); + rc = rc ? rc : out->serialize_String(out, "path", &v->path); + rc = rc ? rc : out->serialize_Buffer(out, "data", &v->data); + rc = rc ? rc : serialize_ACL_vector(out, "acl", &v->acl); + rc = rc ? rc : out->serialize_Bool(out, "ephemeral", &v->ephemeral); + rc = rc ? rc : out->end_record(out, tag); + return rc; +} +int deserialize_CreateTxnV0(struct iarchive *in, const char *tag, struct CreateTxnV0*v){ + int rc; + rc = in->start_record(in, tag); + rc = rc ? rc : in->deserialize_String(in, "path", &v->path); + rc = rc ? rc : in->deserialize_Buffer(in, "data", &v->data); + rc = rc ? rc : deserialize_ACL_vector(in, "acl", &v->acl); + rc = rc ? rc : in->deserialize_Bool(in, "ephemeral", &v->ephemeral); + rc = rc ? rc : in->end_record(in, tag); + return rc; +} +void deallocate_CreateTxnV0(struct CreateTxnV0*v){ + deallocate_String(&v->path); + deallocate_Buffer(&v->data); + deallocate_ACL_vector(&v->acl); +} +int serialize_CreateTxn(struct oarchive *out, const char *tag, struct CreateTxn *v){ + int rc; + rc = out->start_record(out, tag); + rc = rc ? rc : out->serialize_String(out, "path", &v->path); + rc = rc ? rc : out->serialize_Buffer(out, "data", &v->data); + rc = rc ? rc : serialize_ACL_vector(out, "acl", &v->acl); + rc = rc ? rc : out->serialize_Bool(out, "ephemeral", &v->ephemeral); + rc = rc ? rc : out->serialize_Int(out, "parentCVersion", &v->parentCVersion); + rc = rc ? rc : out->end_record(out, tag); + return rc; +} +int deserialize_CreateTxn(struct iarchive *in, const char *tag, struct CreateTxn*v){ + int rc; + rc = in->start_record(in, tag); + rc = rc ? rc : in->deserialize_String(in, "path", &v->path); + rc = rc ? rc : in->deserialize_Buffer(in, "data", &v->data); + rc = rc ? rc : deserialize_ACL_vector(in, "acl", &v->acl); + rc = rc ? rc : in->deserialize_Bool(in, "ephemeral", &v->ephemeral); + rc = rc ? rc : in->deserialize_Int(in, "parentCVersion", &v->parentCVersion); + rc = rc ? rc : in->end_record(in, tag); + return rc; +} +void deallocate_CreateTxn(struct CreateTxn*v){ + deallocate_String(&v->path); + deallocate_Buffer(&v->data); + deallocate_ACL_vector(&v->acl); +} +int serialize_DeleteTxn(struct oarchive *out, const char *tag, struct DeleteTxn *v){ + int rc; + rc = out->start_record(out, tag); + rc = rc ? rc : out->serialize_String(out, "path", &v->path); + rc = rc ? rc : out->end_record(out, tag); + return rc; +} +int deserialize_DeleteTxn(struct iarchive *in, const char *tag, struct DeleteTxn*v){ + int rc; + rc = in->start_record(in, tag); + rc = rc ? rc : in->deserialize_String(in, "path", &v->path); + rc = rc ? rc : in->end_record(in, tag); + return rc; +} +void deallocate_DeleteTxn(struct DeleteTxn*v){ + deallocate_String(&v->path); +} +int serialize_SetDataTxn(struct oarchive *out, const char *tag, struct SetDataTxn *v){ + int rc; + rc = out->start_record(out, tag); + rc = rc ? rc : out->serialize_String(out, "path", &v->path); + rc = rc ? rc : out->serialize_Buffer(out, "data", &v->data); + rc = rc ? rc : out->serialize_Int(out, "version", &v->version); + rc = rc ? rc : out->end_record(out, tag); + return rc; +} +int deserialize_SetDataTxn(struct iarchive *in, const char *tag, struct SetDataTxn*v){ + int rc; + rc = in->start_record(in, tag); + rc = rc ? rc : in->deserialize_String(in, "path", &v->path); + rc = rc ? rc : in->deserialize_Buffer(in, "data", &v->data); + rc = rc ? rc : in->deserialize_Int(in, "version", &v->version); + rc = rc ? rc : in->end_record(in, tag); + return rc; +} +void deallocate_SetDataTxn(struct SetDataTxn*v){ + deallocate_String(&v->path); + deallocate_Buffer(&v->data); +} +int serialize_CheckVersionTxn(struct oarchive *out, const char *tag, struct CheckVersionTxn *v){ + int rc; + rc = out->start_record(out, tag); + rc = rc ? rc : out->serialize_String(out, "path", &v->path); + rc = rc ? rc : out->serialize_Int(out, "version", &v->version); + rc = rc ? rc : out->end_record(out, tag); + return rc; +} +int deserialize_CheckVersionTxn(struct iarchive *in, const char *tag, struct CheckVersionTxn*v){ + int rc; + rc = in->start_record(in, tag); + rc = rc ? rc : in->deserialize_String(in, "path", &v->path); + rc = rc ? rc : in->deserialize_Int(in, "version", &v->version); + rc = rc ? rc : in->end_record(in, tag); + return rc; +} +void deallocate_CheckVersionTxn(struct CheckVersionTxn*v){ + deallocate_String(&v->path); +} +int serialize_SetACLTxn(struct oarchive *out, const char *tag, struct SetACLTxn *v){ + int rc; + rc = out->start_record(out, tag); + rc = rc ? rc : out->serialize_String(out, "path", &v->path); + rc = rc ? rc : serialize_ACL_vector(out, "acl", &v->acl); + rc = rc ? rc : out->serialize_Int(out, "version", &v->version); + rc = rc ? rc : out->end_record(out, tag); + return rc; +} +int deserialize_SetACLTxn(struct iarchive *in, const char *tag, struct SetACLTxn*v){ + int rc; + rc = in->start_record(in, tag); + rc = rc ? rc : in->deserialize_String(in, "path", &v->path); + rc = rc ? rc : deserialize_ACL_vector(in, "acl", &v->acl); + rc = rc ? rc : in->deserialize_Int(in, "version", &v->version); + rc = rc ? rc : in->end_record(in, tag); + return rc; +} +void deallocate_SetACLTxn(struct SetACLTxn*v){ + deallocate_String(&v->path); + deallocate_ACL_vector(&v->acl); +} +int serialize_SetMaxChildrenTxn(struct oarchive *out, const char *tag, struct SetMaxChildrenTxn *v){ + int rc; + rc = out->start_record(out, tag); + rc = rc ? rc : out->serialize_String(out, "path", &v->path); + rc = rc ? rc : out->serialize_Int(out, "max", &v->max); + rc = rc ? rc : out->end_record(out, tag); + return rc; +} +int deserialize_SetMaxChildrenTxn(struct iarchive *in, const char *tag, struct SetMaxChildrenTxn*v){ + int rc; + rc = in->start_record(in, tag); + rc = rc ? rc : in->deserialize_String(in, "path", &v->path); + rc = rc ? rc : in->deserialize_Int(in, "max", &v->max); + rc = rc ? rc : in->end_record(in, tag); + return rc; +} +void deallocate_SetMaxChildrenTxn(struct SetMaxChildrenTxn*v){ + deallocate_String(&v->path); +} +int serialize_CreateSessionTxn(struct oarchive *out, const char *tag, struct CreateSessionTxn *v){ + int rc; + rc = out->start_record(out, tag); + rc = rc ? rc : out->serialize_Int(out, "timeOut", &v->timeOut); + rc = rc ? rc : out->end_record(out, tag); + return rc; +} +int deserialize_CreateSessionTxn(struct iarchive *in, const char *tag, struct CreateSessionTxn*v){ + int rc; + rc = in->start_record(in, tag); + rc = rc ? rc : in->deserialize_Int(in, "timeOut", &v->timeOut); + rc = rc ? rc : in->end_record(in, tag); + return rc; +} +void deallocate_CreateSessionTxn(struct CreateSessionTxn*v){ +} +int serialize_ErrorTxn(struct oarchive *out, const char *tag, struct ErrorTxn *v){ + int rc; + rc = out->start_record(out, tag); + rc = rc ? rc : out->serialize_Int(out, "err", &v->err); + rc = rc ? rc : out->end_record(out, tag); + return rc; +} +int deserialize_ErrorTxn(struct iarchive *in, const char *tag, struct ErrorTxn*v){ + int rc; + rc = in->start_record(in, tag); + rc = rc ? rc : in->deserialize_Int(in, "err", &v->err); + rc = rc ? rc : in->end_record(in, tag); + return rc; +} +void deallocate_ErrorTxn(struct ErrorTxn*v){ +} +int serialize_Txn(struct oarchive *out, const char *tag, struct Txn *v){ + int rc; + rc = out->start_record(out, tag); + rc = rc ? rc : out->serialize_Int(out, "type", &v->type); + rc = rc ? rc : out->serialize_Buffer(out, "data", &v->data); + rc = rc ? rc : out->end_record(out, tag); + return rc; +} +int deserialize_Txn(struct iarchive *in, const char *tag, struct Txn*v){ + int rc; + rc = in->start_record(in, tag); + rc = rc ? rc : in->deserialize_Int(in, "type", &v->type); + rc = rc ? rc : in->deserialize_Buffer(in, "data", &v->data); + rc = rc ? rc : in->end_record(in, tag); + return rc; +} +void deallocate_Txn(struct Txn*v){ + deallocate_Buffer(&v->data); +} +int allocate_Txn_vector(struct Txn_vector *v, int32_t len) { + if (!len) { + v->count = 0; + v->data = 0; + } else { + v->count = len; + v->data = calloc(sizeof(*v->data), len); + } + return 0; +} +int deallocate_Txn_vector(struct Txn_vector *v) { + if (v->data) { + int32_t i; + for(i=0;icount; i++) { + deallocate_Txn(&v->data[i]); + } + free(v->data); + v->data = 0; + } + return 0; +} +int serialize_Txn_vector(struct oarchive *out, const char *tag, struct Txn_vector *v) +{ + int32_t count = v->count; + int rc = 0; + int32_t i; + rc = out->start_vector(out, tag, &count); + for(i=0;icount;i++) { + rc = rc ? rc : serialize_Txn(out, "data", &v->data[i]); + } + rc = rc ? rc : out->end_vector(out, tag); + return rc; +} +int deserialize_Txn_vector(struct iarchive *in, const char *tag, struct Txn_vector *v) +{ + int rc = 0; + int32_t i; + rc = in->start_vector(in, tag, &v->count); + v->data = calloc(v->count, sizeof(*v->data)); + for(i=0;icount;i++) { + rc = rc ? rc : deserialize_Txn(in, "value", &v->data[i]); + } + rc = in->end_vector(in, tag); + return rc; +} +int serialize_MultiTxn(struct oarchive *out, const char *tag, struct MultiTxn *v){ + int rc; + rc = out->start_record(out, tag); + rc = rc ? rc : serialize_Txn_vector(out, "txns", &v->txns); + rc = rc ? rc : out->end_record(out, tag); + return rc; +} +int deserialize_MultiTxn(struct iarchive *in, const char *tag, struct MultiTxn*v){ + int rc; + rc = in->start_record(in, tag); + rc = rc ? rc : deserialize_Txn_vector(in, "txns", &v->txns); + rc = rc ? rc : in->end_record(in, tag); + return rc; +} +void deallocate_MultiTxn(struct MultiTxn*v){ + deallocate_Txn_vector(&v->txns); +} diff --git a/pkg/registry/zookeeper-3.4.6/src/c/generated/zookeeper.jute.h b/pkg/registry/zookeeper-3.4.6/src/c/generated/zookeeper.jute.h new file mode 100644 index 000000000..89733ecff --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/c/generated/zookeeper.jute.h @@ -0,0 +1,485 @@ +/** +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you 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. +*/ + +#ifndef __ZOOKEEPER_JUTE__ +#define __ZOOKEEPER_JUTE__ +#include "recordio.h" + +#ifdef __cplusplus +extern "C" { +#endif + +struct Id { + char * scheme; + char * id; +}; +int serialize_Id(struct oarchive *out, const char *tag, struct Id *v); +int deserialize_Id(struct iarchive *in, const char *tag, struct Id*v); +void deallocate_Id(struct Id*); +struct ACL { + int32_t perms; + struct Id id; +}; +int serialize_ACL(struct oarchive *out, const char *tag, struct ACL *v); +int deserialize_ACL(struct iarchive *in, const char *tag, struct ACL*v); +void deallocate_ACL(struct ACL*); +struct Stat { + int64_t czxid; + int64_t mzxid; + int64_t ctime; + int64_t mtime; + int32_t version; + int32_t cversion; + int32_t aversion; + int64_t ephemeralOwner; + int32_t dataLength; + int32_t numChildren; + int64_t pzxid; +}; +int serialize_Stat(struct oarchive *out, const char *tag, struct Stat *v); +int deserialize_Stat(struct iarchive *in, const char *tag, struct Stat*v); +void deallocate_Stat(struct Stat*); +struct StatPersisted { + int64_t czxid; + int64_t mzxid; + int64_t ctime; + int64_t mtime; + int32_t version; + int32_t cversion; + int32_t aversion; + int64_t ephemeralOwner; + int64_t pzxid; +}; +int serialize_StatPersisted(struct oarchive *out, const char *tag, struct StatPersisted *v); +int deserialize_StatPersisted(struct iarchive *in, const char *tag, struct StatPersisted*v); +void deallocate_StatPersisted(struct StatPersisted*); +struct StatPersistedV1 { + int64_t czxid; + int64_t mzxid; + int64_t ctime; + int64_t mtime; + int32_t version; + int32_t cversion; + int32_t aversion; + int64_t ephemeralOwner; +}; +int serialize_StatPersistedV1(struct oarchive *out, const char *tag, struct StatPersistedV1 *v); +int deserialize_StatPersistedV1(struct iarchive *in, const char *tag, struct StatPersistedV1*v); +void deallocate_StatPersistedV1(struct StatPersistedV1*); +struct ConnectRequest { + int32_t protocolVersion; + int64_t lastZxidSeen; + int32_t timeOut; + int64_t sessionId; + struct buffer passwd; +}; +int serialize_ConnectRequest(struct oarchive *out, const char *tag, struct ConnectRequest *v); +int deserialize_ConnectRequest(struct iarchive *in, const char *tag, struct ConnectRequest*v); +void deallocate_ConnectRequest(struct ConnectRequest*); +struct ConnectResponse { + int32_t protocolVersion; + int32_t timeOut; + int64_t sessionId; + struct buffer passwd; +}; +int serialize_ConnectResponse(struct oarchive *out, const char *tag, struct ConnectResponse *v); +int deserialize_ConnectResponse(struct iarchive *in, const char *tag, struct ConnectResponse*v); +void deallocate_ConnectResponse(struct ConnectResponse*); +struct String_vector { + int32_t count; + char * *data; + +}; +int serialize_String_vector(struct oarchive *out, const char *tag, struct String_vector *v); +int deserialize_String_vector(struct iarchive *in, const char *tag, struct String_vector *v); +int allocate_String_vector(struct String_vector *v, int32_t len); +int deallocate_String_vector(struct String_vector *v); +struct SetWatches { + int64_t relativeZxid; + struct String_vector dataWatches; + struct String_vector existWatches; + struct String_vector childWatches; +}; +int serialize_SetWatches(struct oarchive *out, const char *tag, struct SetWatches *v); +int deserialize_SetWatches(struct iarchive *in, const char *tag, struct SetWatches*v); +void deallocate_SetWatches(struct SetWatches*); +struct RequestHeader { + int32_t xid; + int32_t type; +}; +int serialize_RequestHeader(struct oarchive *out, const char *tag, struct RequestHeader *v); +int deserialize_RequestHeader(struct iarchive *in, const char *tag, struct RequestHeader*v); +void deallocate_RequestHeader(struct RequestHeader*); +struct MultiHeader { + int32_t type; + int32_t done; + int32_t err; +}; +int serialize_MultiHeader(struct oarchive *out, const char *tag, struct MultiHeader *v); +int deserialize_MultiHeader(struct iarchive *in, const char *tag, struct MultiHeader*v); +void deallocate_MultiHeader(struct MultiHeader*); +struct AuthPacket { + int32_t type; + char * scheme; + struct buffer auth; +}; +int serialize_AuthPacket(struct oarchive *out, const char *tag, struct AuthPacket *v); +int deserialize_AuthPacket(struct iarchive *in, const char *tag, struct AuthPacket*v); +void deallocate_AuthPacket(struct AuthPacket*); +struct ReplyHeader { + int32_t xid; + int64_t zxid; + int32_t err; +}; +int serialize_ReplyHeader(struct oarchive *out, const char *tag, struct ReplyHeader *v); +int deserialize_ReplyHeader(struct iarchive *in, const char *tag, struct ReplyHeader*v); +void deallocate_ReplyHeader(struct ReplyHeader*); +struct GetDataRequest { + char * path; + int32_t watch; +}; +int serialize_GetDataRequest(struct oarchive *out, const char *tag, struct GetDataRequest *v); +int deserialize_GetDataRequest(struct iarchive *in, const char *tag, struct GetDataRequest*v); +void deallocate_GetDataRequest(struct GetDataRequest*); +struct SetDataRequest { + char * path; + struct buffer data; + int32_t version; +}; +int serialize_SetDataRequest(struct oarchive *out, const char *tag, struct SetDataRequest *v); +int deserialize_SetDataRequest(struct iarchive *in, const char *tag, struct SetDataRequest*v); +void deallocate_SetDataRequest(struct SetDataRequest*); +struct SetDataResponse { + struct Stat stat; +}; +int serialize_SetDataResponse(struct oarchive *out, const char *tag, struct SetDataResponse *v); +int deserialize_SetDataResponse(struct iarchive *in, const char *tag, struct SetDataResponse*v); +void deallocate_SetDataResponse(struct SetDataResponse*); +struct GetSASLRequest { + struct buffer token; +}; +int serialize_GetSASLRequest(struct oarchive *out, const char *tag, struct GetSASLRequest *v); +int deserialize_GetSASLRequest(struct iarchive *in, const char *tag, struct GetSASLRequest*v); +void deallocate_GetSASLRequest(struct GetSASLRequest*); +struct SetSASLRequest { + struct buffer token; +}; +int serialize_SetSASLRequest(struct oarchive *out, const char *tag, struct SetSASLRequest *v); +int deserialize_SetSASLRequest(struct iarchive *in, const char *tag, struct SetSASLRequest*v); +void deallocate_SetSASLRequest(struct SetSASLRequest*); +struct SetSASLResponse { + struct buffer token; +}; +int serialize_SetSASLResponse(struct oarchive *out, const char *tag, struct SetSASLResponse *v); +int deserialize_SetSASLResponse(struct iarchive *in, const char *tag, struct SetSASLResponse*v); +void deallocate_SetSASLResponse(struct SetSASLResponse*); +struct ACL_vector { + int32_t count; + struct ACL *data; + +}; +int serialize_ACL_vector(struct oarchive *out, const char *tag, struct ACL_vector *v); +int deserialize_ACL_vector(struct iarchive *in, const char *tag, struct ACL_vector *v); +int allocate_ACL_vector(struct ACL_vector *v, int32_t len); +int deallocate_ACL_vector(struct ACL_vector *v); +struct CreateRequest { + char * path; + struct buffer data; + struct ACL_vector acl; + int32_t flags; +}; +int serialize_CreateRequest(struct oarchive *out, const char *tag, struct CreateRequest *v); +int deserialize_CreateRequest(struct iarchive *in, const char *tag, struct CreateRequest*v); +void deallocate_CreateRequest(struct CreateRequest*); +struct DeleteRequest { + char * path; + int32_t version; +}; +int serialize_DeleteRequest(struct oarchive *out, const char *tag, struct DeleteRequest *v); +int deserialize_DeleteRequest(struct iarchive *in, const char *tag, struct DeleteRequest*v); +void deallocate_DeleteRequest(struct DeleteRequest*); +struct GetChildrenRequest { + char * path; + int32_t watch; +}; +int serialize_GetChildrenRequest(struct oarchive *out, const char *tag, struct GetChildrenRequest *v); +int deserialize_GetChildrenRequest(struct iarchive *in, const char *tag, struct GetChildrenRequest*v); +void deallocate_GetChildrenRequest(struct GetChildrenRequest*); +struct GetChildren2Request { + char * path; + int32_t watch; +}; +int serialize_GetChildren2Request(struct oarchive *out, const char *tag, struct GetChildren2Request *v); +int deserialize_GetChildren2Request(struct iarchive *in, const char *tag, struct GetChildren2Request*v); +void deallocate_GetChildren2Request(struct GetChildren2Request*); +struct CheckVersionRequest { + char * path; + int32_t version; +}; +int serialize_CheckVersionRequest(struct oarchive *out, const char *tag, struct CheckVersionRequest *v); +int deserialize_CheckVersionRequest(struct iarchive *in, const char *tag, struct CheckVersionRequest*v); +void deallocate_CheckVersionRequest(struct CheckVersionRequest*); +struct GetMaxChildrenRequest { + char * path; +}; +int serialize_GetMaxChildrenRequest(struct oarchive *out, const char *tag, struct GetMaxChildrenRequest *v); +int deserialize_GetMaxChildrenRequest(struct iarchive *in, const char *tag, struct GetMaxChildrenRequest*v); +void deallocate_GetMaxChildrenRequest(struct GetMaxChildrenRequest*); +struct GetMaxChildrenResponse { + int32_t max; +}; +int serialize_GetMaxChildrenResponse(struct oarchive *out, const char *tag, struct GetMaxChildrenResponse *v); +int deserialize_GetMaxChildrenResponse(struct iarchive *in, const char *tag, struct GetMaxChildrenResponse*v); +void deallocate_GetMaxChildrenResponse(struct GetMaxChildrenResponse*); +struct SetMaxChildrenRequest { + char * path; + int32_t max; +}; +int serialize_SetMaxChildrenRequest(struct oarchive *out, const char *tag, struct SetMaxChildrenRequest *v); +int deserialize_SetMaxChildrenRequest(struct iarchive *in, const char *tag, struct SetMaxChildrenRequest*v); +void deallocate_SetMaxChildrenRequest(struct SetMaxChildrenRequest*); +struct SyncRequest { + char * path; +}; +int serialize_SyncRequest(struct oarchive *out, const char *tag, struct SyncRequest *v); +int deserialize_SyncRequest(struct iarchive *in, const char *tag, struct SyncRequest*v); +void deallocate_SyncRequest(struct SyncRequest*); +struct SyncResponse { + char * path; +}; +int serialize_SyncResponse(struct oarchive *out, const char *tag, struct SyncResponse *v); +int deserialize_SyncResponse(struct iarchive *in, const char *tag, struct SyncResponse*v); +void deallocate_SyncResponse(struct SyncResponse*); +struct GetACLRequest { + char * path; +}; +int serialize_GetACLRequest(struct oarchive *out, const char *tag, struct GetACLRequest *v); +int deserialize_GetACLRequest(struct iarchive *in, const char *tag, struct GetACLRequest*v); +void deallocate_GetACLRequest(struct GetACLRequest*); +struct SetACLRequest { + char * path; + struct ACL_vector acl; + int32_t version; +}; +int serialize_SetACLRequest(struct oarchive *out, const char *tag, struct SetACLRequest *v); +int deserialize_SetACLRequest(struct iarchive *in, const char *tag, struct SetACLRequest*v); +void deallocate_SetACLRequest(struct SetACLRequest*); +struct SetACLResponse { + struct Stat stat; +}; +int serialize_SetACLResponse(struct oarchive *out, const char *tag, struct SetACLResponse *v); +int deserialize_SetACLResponse(struct iarchive *in, const char *tag, struct SetACLResponse*v); +void deallocate_SetACLResponse(struct SetACLResponse*); +struct WatcherEvent { + int32_t type; + int32_t state; + char * path; +}; +int serialize_WatcherEvent(struct oarchive *out, const char *tag, struct WatcherEvent *v); +int deserialize_WatcherEvent(struct iarchive *in, const char *tag, struct WatcherEvent*v); +void deallocate_WatcherEvent(struct WatcherEvent*); +struct ErrorResponse { + int32_t err; +}; +int serialize_ErrorResponse(struct oarchive *out, const char *tag, struct ErrorResponse *v); +int deserialize_ErrorResponse(struct iarchive *in, const char *tag, struct ErrorResponse*v); +void deallocate_ErrorResponse(struct ErrorResponse*); +struct CreateResponse { + char * path; +}; +int serialize_CreateResponse(struct oarchive *out, const char *tag, struct CreateResponse *v); +int deserialize_CreateResponse(struct iarchive *in, const char *tag, struct CreateResponse*v); +void deallocate_CreateResponse(struct CreateResponse*); +struct ExistsRequest { + char * path; + int32_t watch; +}; +int serialize_ExistsRequest(struct oarchive *out, const char *tag, struct ExistsRequest *v); +int deserialize_ExistsRequest(struct iarchive *in, const char *tag, struct ExistsRequest*v); +void deallocate_ExistsRequest(struct ExistsRequest*); +struct ExistsResponse { + struct Stat stat; +}; +int serialize_ExistsResponse(struct oarchive *out, const char *tag, struct ExistsResponse *v); +int deserialize_ExistsResponse(struct iarchive *in, const char *tag, struct ExistsResponse*v); +void deallocate_ExistsResponse(struct ExistsResponse*); +struct GetDataResponse { + struct buffer data; + struct Stat stat; +}; +int serialize_GetDataResponse(struct oarchive *out, const char *tag, struct GetDataResponse *v); +int deserialize_GetDataResponse(struct iarchive *in, const char *tag, struct GetDataResponse*v); +void deallocate_GetDataResponse(struct GetDataResponse*); +struct GetChildrenResponse { + struct String_vector children; +}; +int serialize_GetChildrenResponse(struct oarchive *out, const char *tag, struct GetChildrenResponse *v); +int deserialize_GetChildrenResponse(struct iarchive *in, const char *tag, struct GetChildrenResponse*v); +void deallocate_GetChildrenResponse(struct GetChildrenResponse*); +struct GetChildren2Response { + struct String_vector children; + struct Stat stat; +}; +int serialize_GetChildren2Response(struct oarchive *out, const char *tag, struct GetChildren2Response *v); +int deserialize_GetChildren2Response(struct iarchive *in, const char *tag, struct GetChildren2Response*v); +void deallocate_GetChildren2Response(struct GetChildren2Response*); +struct GetACLResponse { + struct ACL_vector acl; + struct Stat stat; +}; +int serialize_GetACLResponse(struct oarchive *out, const char *tag, struct GetACLResponse *v); +int deserialize_GetACLResponse(struct iarchive *in, const char *tag, struct GetACLResponse*v); +void deallocate_GetACLResponse(struct GetACLResponse*); +struct LearnerInfo { + int64_t serverid; + int32_t protocolVersion; +}; +int serialize_LearnerInfo(struct oarchive *out, const char *tag, struct LearnerInfo *v); +int deserialize_LearnerInfo(struct iarchive *in, const char *tag, struct LearnerInfo*v); +void deallocate_LearnerInfo(struct LearnerInfo*); +struct Id_vector { + int32_t count; + struct Id *data; + +}; +int serialize_Id_vector(struct oarchive *out, const char *tag, struct Id_vector *v); +int deserialize_Id_vector(struct iarchive *in, const char *tag, struct Id_vector *v); +int allocate_Id_vector(struct Id_vector *v, int32_t len); +int deallocate_Id_vector(struct Id_vector *v); +struct QuorumPacket { + int32_t type; + int64_t zxid; + struct buffer data; + struct Id_vector authinfo; +}; +int serialize_QuorumPacket(struct oarchive *out, const char *tag, struct QuorumPacket *v); +int deserialize_QuorumPacket(struct iarchive *in, const char *tag, struct QuorumPacket*v); +void deallocate_QuorumPacket(struct QuorumPacket*); +struct FileHeader { + int32_t magic; + int32_t version; + int64_t dbid; +}; +int serialize_FileHeader(struct oarchive *out, const char *tag, struct FileHeader *v); +int deserialize_FileHeader(struct iarchive *in, const char *tag, struct FileHeader*v); +void deallocate_FileHeader(struct FileHeader*); +struct TxnHeader { + int64_t clientId; + int32_t cxid; + int64_t zxid; + int64_t time; + int32_t type; +}; +int serialize_TxnHeader(struct oarchive *out, const char *tag, struct TxnHeader *v); +int deserialize_TxnHeader(struct iarchive *in, const char *tag, struct TxnHeader*v); +void deallocate_TxnHeader(struct TxnHeader*); +struct CreateTxnV0 { + char * path; + struct buffer data; + struct ACL_vector acl; + int32_t ephemeral; +}; +int serialize_CreateTxnV0(struct oarchive *out, const char *tag, struct CreateTxnV0 *v); +int deserialize_CreateTxnV0(struct iarchive *in, const char *tag, struct CreateTxnV0*v); +void deallocate_CreateTxnV0(struct CreateTxnV0*); +struct CreateTxn { + char * path; + struct buffer data; + struct ACL_vector acl; + int32_t ephemeral; + int32_t parentCVersion; +}; +int serialize_CreateTxn(struct oarchive *out, const char *tag, struct CreateTxn *v); +int deserialize_CreateTxn(struct iarchive *in, const char *tag, struct CreateTxn*v); +void deallocate_CreateTxn(struct CreateTxn*); +struct DeleteTxn { + char * path; +}; +int serialize_DeleteTxn(struct oarchive *out, const char *tag, struct DeleteTxn *v); +int deserialize_DeleteTxn(struct iarchive *in, const char *tag, struct DeleteTxn*v); +void deallocate_DeleteTxn(struct DeleteTxn*); +struct SetDataTxn { + char * path; + struct buffer data; + int32_t version; +}; +int serialize_SetDataTxn(struct oarchive *out, const char *tag, struct SetDataTxn *v); +int deserialize_SetDataTxn(struct iarchive *in, const char *tag, struct SetDataTxn*v); +void deallocate_SetDataTxn(struct SetDataTxn*); +struct CheckVersionTxn { + char * path; + int32_t version; +}; +int serialize_CheckVersionTxn(struct oarchive *out, const char *tag, struct CheckVersionTxn *v); +int deserialize_CheckVersionTxn(struct iarchive *in, const char *tag, struct CheckVersionTxn*v); +void deallocate_CheckVersionTxn(struct CheckVersionTxn*); +struct SetACLTxn { + char * path; + struct ACL_vector acl; + int32_t version; +}; +int serialize_SetACLTxn(struct oarchive *out, const char *tag, struct SetACLTxn *v); +int deserialize_SetACLTxn(struct iarchive *in, const char *tag, struct SetACLTxn*v); +void deallocate_SetACLTxn(struct SetACLTxn*); +struct SetMaxChildrenTxn { + char * path; + int32_t max; +}; +int serialize_SetMaxChildrenTxn(struct oarchive *out, const char *tag, struct SetMaxChildrenTxn *v); +int deserialize_SetMaxChildrenTxn(struct iarchive *in, const char *tag, struct SetMaxChildrenTxn*v); +void deallocate_SetMaxChildrenTxn(struct SetMaxChildrenTxn*); +struct CreateSessionTxn { + int32_t timeOut; +}; +int serialize_CreateSessionTxn(struct oarchive *out, const char *tag, struct CreateSessionTxn *v); +int deserialize_CreateSessionTxn(struct iarchive *in, const char *tag, struct CreateSessionTxn*v); +void deallocate_CreateSessionTxn(struct CreateSessionTxn*); +struct ErrorTxn { + int32_t err; +}; +int serialize_ErrorTxn(struct oarchive *out, const char *tag, struct ErrorTxn *v); +int deserialize_ErrorTxn(struct iarchive *in, const char *tag, struct ErrorTxn*v); +void deallocate_ErrorTxn(struct ErrorTxn*); +struct Txn { + int32_t type; + struct buffer data; +}; +int serialize_Txn(struct oarchive *out, const char *tag, struct Txn *v); +int deserialize_Txn(struct iarchive *in, const char *tag, struct Txn*v); +void deallocate_Txn(struct Txn*); +struct Txn_vector { + int32_t count; + struct Txn *data; + +}; +int serialize_Txn_vector(struct oarchive *out, const char *tag, struct Txn_vector *v); +int deserialize_Txn_vector(struct iarchive *in, const char *tag, struct Txn_vector *v); +int allocate_Txn_vector(struct Txn_vector *v, int32_t len); +int deallocate_Txn_vector(struct Txn_vector *v); +struct MultiTxn { + struct Txn_vector txns; +}; +int serialize_MultiTxn(struct oarchive *out, const char *tag, struct MultiTxn *v); +int deserialize_MultiTxn(struct iarchive *in, const char *tag, struct MultiTxn*v); +void deallocate_MultiTxn(struct MultiTxn*); + +#ifdef __cplusplus +} +#endif + +#endif //ZOOKEEPER_JUTE__ diff --git a/pkg/registry/zookeeper-3.4.6/src/c/include/proto.h b/pkg/registry/zookeeper-3.4.6/src/c/include/proto.h new file mode 100644 index 000000000..bce408e6f --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/c/include/proto.h @@ -0,0 +1,47 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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. + */ +#ifndef PROTO_H_ +#define PROTO_H_ + +#ifdef __cplusplus +extern "C" { +#endif + +#define ZOO_NOTIFY_OP 0 +#define ZOO_CREATE_OP 1 +#define ZOO_DELETE_OP 2 +#define ZOO_EXISTS_OP 3 +#define ZOO_GETDATA_OP 4 +#define ZOO_SETDATA_OP 5 +#define ZOO_GETACL_OP 6 +#define ZOO_SETACL_OP 7 +#define ZOO_GETCHILDREN_OP 8 +#define ZOO_SYNC_OP 9 +#define ZOO_PING_OP 11 +#define ZOO_GETCHILDREN2_OP 12 +#define ZOO_CHECK_OP 13 +#define ZOO_MULTI_OP 14 +#define ZOO_CLOSE_OP -11 +#define ZOO_SETAUTH_OP 100 +#define ZOO_SETWATCHES_OP 101 + +#ifdef __cplusplus +} +#endif + +#endif /*PROTO_H_*/ diff --git a/pkg/registry/zookeeper-3.4.6/src/c/include/recordio.h b/pkg/registry/zookeeper-3.4.6/src/c/include/recordio.h new file mode 100644 index 000000000..4e1b78eab --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/c/include/recordio.h @@ -0,0 +1,82 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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. + */ +#ifndef __RECORDIO_H__ +#define __RECORDIO_H__ + +#include +#ifndef WIN32 +#define STRUCT_INITIALIZER(l,r) .l = r +#else +#define STRUCT_INITIALIZER(l,r) r +#include "winconfig.h" +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +struct buffer { + int32_t len; + char *buff; +}; + +void deallocate_String(char **s); +void deallocate_Buffer(struct buffer *b); +void deallocate_vector(void *d); +struct iarchive { + int (*start_record)(struct iarchive *ia, const char *tag); + int (*end_record)(struct iarchive *ia, const char *tag); + int (*start_vector)(struct iarchive *ia, const char *tag, int32_t *count); + int (*end_vector)(struct iarchive *ia, const char *tag); + int (*deserialize_Bool)(struct iarchive *ia, const char *name, int32_t *); + int (*deserialize_Int)(struct iarchive *ia, const char *name, int32_t *); + int (*deserialize_Long)(struct iarchive *ia, const char *name, int64_t *); + int (*deserialize_Buffer)(struct iarchive *ia, const char *name, + struct buffer *); + int (*deserialize_String)(struct iarchive *ia, const char *name, char **); + void *priv; +}; +struct oarchive { + int (*start_record)(struct oarchive *oa, const char *tag); + int (*end_record)(struct oarchive *oa, const char *tag); + int (*start_vector)(struct oarchive *oa, const char *tag, const int32_t *count); + int (*end_vector)(struct oarchive *oa, const char *tag); + int (*serialize_Bool)(struct oarchive *oa, const char *name, const int32_t *); + int (*serialize_Int)(struct oarchive *oa, const char *name, const int32_t *); + int (*serialize_Long)(struct oarchive *oa, const char *name, + const int64_t *); + int (*serialize_Buffer)(struct oarchive *oa, const char *name, + const struct buffer *); + int (*serialize_String)(struct oarchive *oa, const char *name, char **); + void *priv; +}; + +struct oarchive *create_buffer_oarchive(void); +void close_buffer_oarchive(struct oarchive **oa, int free_buffer); +struct iarchive *create_buffer_iarchive(char *buffer, int len); +void close_buffer_iarchive(struct iarchive **ia); +char *get_buffer(struct oarchive *); +int get_buffer_len(struct oarchive *); + +int64_t htonll(int64_t v); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/pkg/registry/zookeeper-3.4.6/src/c/include/winconfig.h b/pkg/registry/zookeeper-3.4.6/src/c/include/winconfig.h new file mode 100644 index 000000000..a68dcc628 --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/c/include/winconfig.h @@ -0,0 +1,191 @@ +/* Define to 1 if you have the header file. */ +#undef HAVE_ARPA_INET_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_DLFCN_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_FCNTL_H + +/* Define to 1 if you have the file `generated/zookeeper.jute.c'. */ +#define HAVE_GENERATED_ZOOKEEPER_JUTE_C 1 + +/* Define to 1 if you have the file `generated/zookeeper.jute.h'. */ +#define HAVE_GENERATED_ZOOKEEPER_JUTE_H 1 + +/* Define to 1 if you have the `getcwd' function. */ +#undef HAVE_GETCWD + +/* Define to 1 if you have the `gethostbyname' function. */ +#undef HAVE_GETHOSTBYNAME + +/* Define to 1 if you have the `gethostname' function. */ +#define HAVE_GETHOSTNAME 1 + +/* Define to 1 if you have the `getlogin' function. */ +#undef HAVE_GETLOGIN + +/* Define to 1 if you have the `getpwuid_r' function. */ +#undef HAVE_GETPWUID_R + +/* Define to 1 if you have the `gettimeofday' function. */ +#undef HAVE_GETTIMEOFDAY + +/* Define to 1 if you have the `getuid' function. */ +#undef HAVE_GETUID + +/* Define to 1 if you have the header file. */ +#undef HAVE_INTTYPES_H + +/* Define to 1 if you have the `memmove' function. */ +#undef HAVE_MEMMOVE + +/* Define to 1 if you have the header file. */ +#undef HAVE_MEMORY_H + +/* Define to 1 if you have the `memset' function. */ +#undef HAVE_MEMSET + +/* Define to 1 if you have the header file. */ +#undef HAVE_NETDB_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_NETINET_IN_H + +/* Define to 1 if you have the `poll' function. */ +#undef HAVE_POLL + +/* Define to 1 if you have the `socket' function. */ +#undef HAVE_SOCKET + +/* Define to 1 if you have the header file. */ +#undef HAVE_STDINT_H + +/* Define to 1 if you have the header file. */ +#define HAVE_STDLIB_H 1 + +/* Define to 1 if you have the `strchr' function. */ +#define HAVE_STRCHR 1 + +/* Define to 1 if you have the `strdup' function. */ +#define HAVE_STRDUP 1 + +/* Define to 1 if you have the `strerror' function. */ +#define HAVE_STRERROR 1 + +/* Define to 1 if you have the header file. */ +#undef HAVE_STRINGS_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_STRING_H + +/* Define to 1 if you have the `strtol' function. */ +#undef HAVE_STRTOL + +/* Define to 1 if you have the header file. */ +#undef HAVE_SYS_SOCKET_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_SYS_STAT_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_SYS_TIME_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_SYS_TYPES_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_SYS_UTSNAME_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_UNISTD_H + +/* Define to the sub-directory in which libtool stores uninstalled libraries. + */ +#define LT_OBJDIR + +/* Define to 1 if your C compiler doesn't accept -c and -o together. */ +/* #undef NO_MINUS_C_MINUS_O */ + +/* Name of package */ +#define PACKAGE "c-client-src" + +/* Define to the address where bug reports for this package should be sent. */ +#define PACKAGE_BUGREPORT "user@zookeeper.apache.org" + +/* Define to the full name of this package. */ +#define PACKAGE_NAME "zookeeper C client" + +/* Define to the full name and version of this package. */ +#define PACKAGE_STRING "zookeeper C client 3.4.0 win32" + +/* Define to the one symbol short name of this package. */ +#define PACKAGE_TARNAME "c-client-src" + +/* Define to the home page for this package. */ +#define PACKAGE_URL "" + +/* Define to the version of this package. */ +#define PACKAGE_VERSION "3.4.0" + +/* poll() second argument type */ +#define POLL_NFDS_TYPE + +/* Define to 1 if you have the ANSI C header files. */ +#define STDC_HEADERS + +/* Define to 1 if you can safely include both and . */ +#define TIME_WITH_SYS_TIME + +/* Version number of package */ +#define VERSION "3.4.0" + +/* Define to empty if `const' does not conform to ANSI C. */ +/* #undef const */ + +/* Define to `__inline__' or `__inline' if that's what the C compiler + calls it, or to nothing if 'inline' is not supported under any name. */ +#ifndef __cplusplus +#define inline __inline +#endif +#ifdef WIN32 +#define __attribute__(x) +#define __func__ __FUNCTION__ + +#ifndef _WIN32_WINNT_NT4 +#define _WIN32_WINNT_NT4 0x0400 +#endif + +#define NTDDI_VERSION _WIN32_WINNT_NT4 +#define _WIN32_WINNT _WIN32_WINNT_NT4 + +#define _CRT_SECURE_NO_WARNINGS +#define WIN32_LEAN_AND_MEAN +#include +#include +#include +#include +#include +#undef AF_INET6 +#undef min +#undef max + +#include + +#define strtok_r strtok_s +#define localtime_r(a,b) localtime_s(b,a) +#define get_errno() errno=GetLastError() +#define random rand +#define snprintf _snprintf + +#define ACL ZKACL // Conflict with windows API + +#define EAI_ADDRFAMILY WSAEINVAL +#define EHOSTDOWN EPIPE +#define ESTALE ENODEV + +#define EWOULDBLOCK WSAEWOULDBLOCK +#define EINPROGRESS WSAEINPROGRESS + +typedef int pid_t; +#endif diff --git a/pkg/registry/zookeeper-3.4.6/src/c/include/winstdint.h b/pkg/registry/zookeeper-3.4.6/src/c/include/winstdint.h new file mode 100644 index 000000000..d02608a59 --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/c/include/winstdint.h @@ -0,0 +1,247 @@ +// ISO C9x compliant stdint.h for Microsoft Visual Studio +// Based on ISO/IEC 9899:TC2 Committee draft (May 6, 2005) WG14/N1124 +// +// Copyright (c) 2006-2008 Alexander Chemeris +// +// 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 name of the author may be used to endorse or promote products +// derived from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED +// WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO +// EVENT SHALL THE AUTHOR 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 _MSC_VER // [ +#error "Use this header only with Microsoft Visual C++ compilers!" +#endif // _MSC_VER ] + +#ifndef _MSC_STDINT_H_ // [ +#define _MSC_STDINT_H_ + +#if _MSC_VER > 1000 +#pragma once +#endif + +#include + +// For Visual Studio 6 in C++ mode and for many Visual Studio versions when +// compiling for ARM we should wrap include with 'extern "C++" {}' +// or compiler give many errors like this: +// error C2733: second C linkage of overloaded function 'wmemchr' not allowed +#ifdef __cplusplus +extern "C" { +#endif +# include +#ifdef __cplusplus +} +#endif + +// Define _W64 macros to mark types changing their size, like intptr_t. +#ifndef _W64 +# if !defined(__midl) && (defined(_X86_) || defined(_M_IX86)) && _MSC_VER >= 1300 +# define _W64 __w64 +# else +# define _W64 +# endif +#endif + + +// 7.18.1 Integer types + +// 7.18.1.1 Exact-width integer types + +// Visual Studio 6 and Embedded Visual C++ 4 doesn't +// realize that, e.g. char has the same size as __int8 +// so we give up on __intX for them. +#if (_MSC_VER < 1300) + typedef signed char int8_t; + typedef signed short int16_t; + typedef signed int int32_t; + typedef unsigned char uint8_t; + typedef unsigned short uint16_t; + typedef unsigned int uint32_t; +#else + typedef signed __int8 int8_t; + typedef signed __int16 int16_t; + typedef signed __int32 int32_t; + typedef unsigned __int8 uint8_t; + typedef unsigned __int16 uint16_t; + typedef unsigned __int32 uint32_t; +#endif +typedef signed __int64 int64_t; +typedef unsigned __int64 uint64_t; + + +// 7.18.1.2 Minimum-width integer types +typedef int8_t int_least8_t; +typedef int16_t int_least16_t; +typedef int32_t int_least32_t; +typedef int64_t int_least64_t; +typedef uint8_t uint_least8_t; +typedef uint16_t uint_least16_t; +typedef uint32_t uint_least32_t; +typedef uint64_t uint_least64_t; + +// 7.18.1.3 Fastest minimum-width integer types +typedef int8_t int_fast8_t; +typedef int16_t int_fast16_t; +typedef int32_t int_fast32_t; +typedef int64_t int_fast64_t; +typedef uint8_t uint_fast8_t; +typedef uint16_t uint_fast16_t; +typedef uint32_t uint_fast32_t; +typedef uint64_t uint_fast64_t; + +// 7.18.1.4 Integer types capable of holding object pointers +#ifdef _WIN64 // [ + typedef signed __int64 intptr_t; + typedef unsigned __int64 uintptr_t; +#else // _WIN64 ][ + typedef _W64 signed int intptr_t; + typedef _W64 unsigned int uintptr_t; +#endif // _WIN64 ] + +// 7.18.1.5 Greatest-width integer types +typedef int64_t intmax_t; +typedef uint64_t uintmax_t; + + +// 7.18.2 Limits of specified-width integer types + +#if !defined(__cplusplus) || defined(__STDC_LIMIT_MACROS) // [ See footnote 220 at page 257 and footnote 221 at page 259 + +// 7.18.2.1 Limits of exact-width integer types +#define INT8_MIN ((int8_t)_I8_MIN) +#define INT8_MAX _I8_MAX +#define INT16_MIN ((int16_t)_I16_MIN) +#define INT16_MAX _I16_MAX +#define INT32_MIN ((int32_t)_I32_MIN) +#define INT32_MAX _I32_MAX +#define INT64_MIN ((int64_t)_I64_MIN) +#define INT64_MAX _I64_MAX +#define UINT8_MAX _UI8_MAX +#define UINT16_MAX _UI16_MAX +#define UINT32_MAX _UI32_MAX +#define UINT64_MAX _UI64_MAX + +// 7.18.2.2 Limits of minimum-width integer types +#define INT_LEAST8_MIN INT8_MIN +#define INT_LEAST8_MAX INT8_MAX +#define INT_LEAST16_MIN INT16_MIN +#define INT_LEAST16_MAX INT16_MAX +#define INT_LEAST32_MIN INT32_MIN +#define INT_LEAST32_MAX INT32_MAX +#define INT_LEAST64_MIN INT64_MIN +#define INT_LEAST64_MAX INT64_MAX +#define UINT_LEAST8_MAX UINT8_MAX +#define UINT_LEAST16_MAX UINT16_MAX +#define UINT_LEAST32_MAX UINT32_MAX +#define UINT_LEAST64_MAX UINT64_MAX + +// 7.18.2.3 Limits of fastest minimum-width integer types +#define INT_FAST8_MIN INT8_MIN +#define INT_FAST8_MAX INT8_MAX +#define INT_FAST16_MIN INT16_MIN +#define INT_FAST16_MAX INT16_MAX +#define INT_FAST32_MIN INT32_MIN +#define INT_FAST32_MAX INT32_MAX +#define INT_FAST64_MIN INT64_MIN +#define INT_FAST64_MAX INT64_MAX +#define UINT_FAST8_MAX UINT8_MAX +#define UINT_FAST16_MAX UINT16_MAX +#define UINT_FAST32_MAX UINT32_MAX +#define UINT_FAST64_MAX UINT64_MAX + +// 7.18.2.4 Limits of integer types capable of holding object pointers +#ifdef _WIN64 // [ +# define INTPTR_MIN INT64_MIN +# define INTPTR_MAX INT64_MAX +# define UINTPTR_MAX UINT64_MAX +#else // _WIN64 ][ +# define INTPTR_MIN INT32_MIN +# define INTPTR_MAX INT32_MAX +# define UINTPTR_MAX UINT32_MAX +#endif // _WIN64 ] + +// 7.18.2.5 Limits of greatest-width integer types +#define INTMAX_MIN INT64_MIN +#define INTMAX_MAX INT64_MAX +#define UINTMAX_MAX UINT64_MAX + +// 7.18.3 Limits of other integer types + +#ifdef _WIN64 // [ +# define PTRDIFF_MIN _I64_MIN +# define PTRDIFF_MAX _I64_MAX +#else // _WIN64 ][ +# define PTRDIFF_MIN _I32_MIN +# define PTRDIFF_MAX _I32_MAX +#endif // _WIN64 ] + +#define SIG_ATOMIC_MIN INT_MIN +#define SIG_ATOMIC_MAX INT_MAX + +#ifndef SIZE_MAX // [ +# ifdef _WIN64 // [ +# define SIZE_MAX _UI64_MAX +# else // _WIN64 ][ +# define SIZE_MAX _UI32_MAX +# endif // _WIN64 ] +#endif // SIZE_MAX ] + +// WCHAR_MIN and WCHAR_MAX are also defined in +#ifndef WCHAR_MIN // [ +# define WCHAR_MIN 0 +#endif // WCHAR_MIN ] +#ifndef WCHAR_MAX // [ +# define WCHAR_MAX _UI16_MAX +#endif // WCHAR_MAX ] + +#define WINT_MIN 0 +#define WINT_MAX _UI16_MAX + +#endif // __STDC_LIMIT_MACROS ] + + +// 7.18.4 Limits of other integer types + +#if !defined(__cplusplus) || defined(__STDC_CONSTANT_MACROS) // [ See footnote 224 at page 260 + +// 7.18.4.1 Macros for minimum-width integer constants + +#define INT8_C(val) val##i8 +#define INT16_C(val) val##i16 +#define INT32_C(val) val##i32 +#define INT64_C(val) val##i64 + +#define UINT8_C(val) val##ui8 +#define UINT16_C(val) val##ui16 +#define UINT32_C(val) val##ui32 +#define UINT64_C(val) val##ui64 + +// 7.18.4.2 Macros for greatest-width integer constants +#define INTMAX_C INT64_C +#define UINTMAX_C UINT64_C + +#endif // __STDC_CONSTANT_MACROS ] + + +#endif // _MSC_STDINT_H_ ] diff --git a/pkg/registry/zookeeper-3.4.6/src/c/include/zookeeper.h b/pkg/registry/zookeeper-3.4.6/src/c/include/zookeeper.h new file mode 100644 index 000000000..7d1066a93 --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/c/include/zookeeper.h @@ -0,0 +1,1583 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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. + */ + +#ifndef ZOOKEEPER_H_ +#define ZOOKEEPER_H_ + +#include +#ifndef WIN32 +#include +#include +#else +#include "winconfig.h" +#endif +#include +#include + +#include "proto.h" +#include "zookeeper_version.h" +#include "recordio.h" +#include "zookeeper.jute.h" + +/** + * \file zookeeper.h + * \brief ZooKeeper functions and definitions. + * + * ZooKeeper is a network service that may be backed by a cluster of + * synchronized servers. The data in the service is represented as a tree + * of data nodes. Each node has data, children, an ACL, and status information. + * The data for a node is read and write in its entirety. + * + * ZooKeeper clients can leave watches when they queries the data or children + * of a node. If a watch is left, that client will be notified of the change. + * The notification is a one time trigger. Subsequent chances to the node will + * not trigger a notification unless the client issues a query with the watch + * flag set. If the client is ever disconnected from the service, the watches do + * not need to be reset. The client automatically resets the watches. + * + * When a node is created, it may be flagged as an ephemeral node. Ephemeral + * nodes are automatically removed when a client session is closed or when + * a session times out due to inactivity (the ZooKeeper runtime fills in + * periods of inactivity with pings). Ephemeral nodes cannot have children. + * + * ZooKeeper clients are identified by a server assigned session id. For + * security reasons The server + * also generates a corresponding password for a session. A client may save its + * id and corresponding password to persistent storage in order to use the + * session across program invocation boundaries. + */ + +/* Support for building on various platforms */ + +// on cygwin we should take care of exporting/importing symbols properly +#ifdef DLL_EXPORT +# define ZOOAPI __declspec(dllexport) +#else +# if (defined(__CYGWIN__) || defined(WIN32)) && !defined(USE_STATIC_LIB) +# define ZOOAPI __declspec(dllimport) +# else +# define ZOOAPI +# endif +#endif + +/** zookeeper return constants **/ + +enum ZOO_ERRORS { + ZOK = 0, /*!< Everything is OK */ + + /** System and server-side errors. + * This is never thrown by the server, it shouldn't be used other than + * to indicate a range. Specifically error codes greater than this + * value, but lesser than {@link #ZAPIERROR}, are system errors. */ + ZSYSTEMERROR = -1, + ZRUNTIMEINCONSISTENCY = -2, /*!< A runtime inconsistency was found */ + ZDATAINCONSISTENCY = -3, /*!< A data inconsistency was found */ + ZCONNECTIONLOSS = -4, /*!< Connection to the server has been lost */ + ZMARSHALLINGERROR = -5, /*!< Error while marshalling or unmarshalling data */ + ZUNIMPLEMENTED = -6, /*!< Operation is unimplemented */ + ZOPERATIONTIMEOUT = -7, /*!< Operation timeout */ + ZBADARGUMENTS = -8, /*!< Invalid arguments */ + ZINVALIDSTATE = -9, /*!< Invliad zhandle state */ + + /** API errors. + * This is never thrown by the server, it shouldn't be used other than + * to indicate a range. Specifically error codes greater than this + * value are API errors (while values less than this indicate a + * {@link #ZSYSTEMERROR}). + */ + ZAPIERROR = -100, + ZNONODE = -101, /*!< Node does not exist */ + ZNOAUTH = -102, /*!< Not authenticated */ + ZBADVERSION = -103, /*!< Version conflict */ + ZNOCHILDRENFOREPHEMERALS = -108, /*!< Ephemeral nodes may not have children */ + ZNODEEXISTS = -110, /*!< The node already exists */ + ZNOTEMPTY = -111, /*!< The node has children */ + ZSESSIONEXPIRED = -112, /*!< The session has been expired by the server */ + ZINVALIDCALLBACK = -113, /*!< Invalid callback specified */ + ZINVALIDACL = -114, /*!< Invalid ACL specified */ + ZAUTHFAILED = -115, /*!< Client authentication failed */ + ZCLOSING = -116, /*!< ZooKeeper is closing */ + ZNOTHING = -117, /*!< (not error) no server responses to process */ + ZSESSIONMOVED = -118 /*! + * The legacy style, an application wishing to receive events from ZooKeeper must + * first implement a function with this signature and pass a pointer to the function + * to \ref zookeeper_init. Next, the application sets a watch by calling one of + * the getter API that accept the watch integer flag (for example, \ref zoo_aexists, + * \ref zoo_get, etc). + *

    + * The watcher object style uses an instance of a "watcher object" which in + * the C world is represented by a pair: a pointer to a function implementing this + * signature and a pointer to watcher context -- handback user-specific data. + * When a watch is triggered this function will be called along with + * the watcher context. An application wishing to use this style must use + * the getter API functions with the "w" prefix in their names (for example, \ref + * zoo_awexists, \ref zoo_wget, etc). + * + * \param zh zookeeper handle + * \param type event type. This is one of the *_EVENT constants. + * \param state connection state. The state value will be one of the *_STATE constants. + * \param path znode path for which the watcher is triggered. NULL if the event + * type is ZOO_SESSION_EVENT + * \param watcherCtx watcher context. + */ +typedef void (*watcher_fn)(zhandle_t *zh, int type, + int state, const char *path,void *watcherCtx); + +/** + * \brief create a handle to used communicate with zookeeper. + * + * This method creates a new handle and a zookeeper session that corresponds + * to that handle. Session establishment is asynchronous, meaning that the + * session should not be considered established until (and unless) an + * event of state ZOO_CONNECTED_STATE is received. + * \param host comma separated host:port pairs, each corresponding to a zk + * server. e.g. "127.0.0.1:3000,127.0.0.1:3001,127.0.0.1:3002" + * \param fn the global watcher callback function. When notifications are + * triggered this function will be invoked. + * \param clientid the id of a previously established session that this + * client will be reconnecting to. Pass 0 if not reconnecting to a previous + * session. Clients can access the session id of an established, valid, + * connection by calling \ref zoo_client_id. If the session corresponding to + * the specified clientid has expired, or if the clientid is invalid for + * any reason, the returned zhandle_t will be invalid -- the zhandle_t + * state will indicate the reason for failure (typically + * ZOO_EXPIRED_SESSION_STATE). + * \param context the handback object that will be associated with this instance + * of zhandle_t. Application can access it (for example, in the watcher + * callback) using \ref zoo_get_context. The object is not used by zookeeper + * internally and can be null. + * \param flags reserved for future use. Should be set to zero. + * \return a pointer to the opaque zhandle structure. If it fails to create + * a new zhandle the function returns NULL and the errno variable + * indicates the reason. + */ +ZOOAPI zhandle_t *zookeeper_init(const char *host, watcher_fn fn, + int recv_timeout, const clientid_t *clientid, void *context, int flags); + +/** + * \brief close the zookeeper handle and free up any resources. + * + * After this call, the client session will no longer be valid. The function + * will flush any outstanding send requests before return. As a result it may + * block. + * + * This method should only be called only once on a zookeeper handle. Calling + * twice will cause undefined (and probably undesirable behavior). Calling any other + * zookeeper method after calling close is undefined behaviour and should be avoided. + * + * \param zh the zookeeper handle obtained by a call to \ref zookeeper_init + * \return a result code. Regardless of the error code returned, the zhandle + * will be destroyed and all resources freed. + * + * ZOK - success + * ZBADARGUMENTS - invalid input parameters + * ZMARSHALLINGERROR - failed to marshall a request; possibly, out of memory + * ZOPERATIONTIMEOUT - failed to flush the buffers within the specified timeout. + * ZCONNECTIONLOSS - a network error occured while attempting to send request to server + * ZSYSTEMERROR -- a system (OS) error occured; it's worth checking errno to get details + */ +ZOOAPI int zookeeper_close(zhandle_t *zh); + +/** + * \brief return the client session id, only valid if the connections + * is currently connected (ie. last watcher state is ZOO_CONNECTED_STATE) + */ +ZOOAPI const clientid_t *zoo_client_id(zhandle_t *zh); + +/** + * \brief return the timeout for this session, only valid if the connections + * is currently connected (ie. last watcher state is ZOO_CONNECTED_STATE). This + * value may change after a server re-connect. + */ +ZOOAPI int zoo_recv_timeout(zhandle_t *zh); + +/** + * \brief return the context for this handle. + */ +ZOOAPI const void *zoo_get_context(zhandle_t *zh); + +/** + * \brief set the context for this handle. + */ +ZOOAPI void zoo_set_context(zhandle_t *zh, void *context); + +/** + * \brief set a watcher function + * \return previous watcher function + */ +ZOOAPI watcher_fn zoo_set_watcher(zhandle_t *zh,watcher_fn newFn); + +/** + * \brief returns the socket address for the current connection + * \return socket address of the connected host or NULL on failure, only valid if the + * connection is current connected + */ +ZOOAPI struct sockaddr* zookeeper_get_connected_host(zhandle_t *zh, + struct sockaddr *addr, socklen_t *addr_len); + +#ifndef THREADED +/** + * \brief Returns the events that zookeeper is interested in. + * + * \param zh the zookeeper handle obtained by a call to \ref zookeeper_init + * \param fd is the file descriptor of interest + * \param interest is an or of the ZOOKEEPER_WRITE and ZOOKEEPER_READ flags to + * indicate the I/O of interest on fd. + * \param tv a timeout value to be used with select/poll system call + * \return a result code. + * ZOK - success + * ZBADARGUMENTS - invalid input parameters + * ZINVALIDSTATE - zhandle state is either ZOO_SESSION_EXPIRED_STATE or ZOO_AUTH_FAILED_STATE + * ZCONNECTIONLOSS - a network error occured while attempting to establish + * a connection to the server + * ZMARSHALLINGERROR - failed to marshall a request; possibly, out of memory + * ZOPERATIONTIMEOUT - hasn't received anything from the server for 2/3 of the + * timeout value specified in zookeeper_init() + * ZSYSTEMERROR -- a system (OS) error occured; it's worth checking errno to get details + */ +#ifdef WIN32 +ZOOAPI int zookeeper_interest(zhandle_t *zh, SOCKET *fd, int *interest, + struct timeval *tv); +#else +ZOOAPI int zookeeper_interest(zhandle_t *zh, int *fd, int *interest, + struct timeval *tv); +#endif + +/** + * \brief Notifies zookeeper that an event of interest has happened. + * + * \param zh the zookeeper handle obtained by a call to \ref zookeeper_init + * \param events will be an OR of the ZOOKEEPER_WRITE and ZOOKEEPER_READ flags. + * \return a result code. + * ZOK - success + * ZBADARGUMENTS - invalid input parameters + * ZINVALIDSTATE - zhandle state is either ZOO_SESSION_EXPIRED_STATE or ZOO_AUTH_FAILED_STATE + * ZCONNECTIONLOSS - a network error occured while attempting to send request to server + * ZSESSIONEXPIRED - connection attempt failed -- the session's expired + * ZAUTHFAILED - authentication request failed, e.i. invalid credentials + * ZRUNTIMEINCONSISTENCY - a server response came out of order + * ZSYSTEMERROR -- a system (OS) error occured; it's worth checking errno to get details + * ZNOTHING -- not an error; simply indicates that there no more data from the server + * to be processed (when called with ZOOKEEPER_READ flag). + */ +ZOOAPI int zookeeper_process(zhandle_t *zh, int events); +#endif + +/** + * \brief signature of a completion function for a call that returns void. + * + * This method will be invoked at the end of a asynchronous call and also as + * a result of connection loss or timeout. + * \param rc the error code of the call. Connection loss/timeout triggers + * the completion with one of the following error codes: + * ZCONNECTIONLOSS -- lost connection to the server + * ZOPERATIONTIMEOUT -- connection timed out + * Data related events trigger the completion with error codes listed the + * Exceptions section of the documentation of the function that initiated the + * call. (Zero indicates call was successful.) + * \param data the pointer that was passed by the caller when the function + * that this completion corresponds to was invoked. The programmer + * is responsible for any memory freeing associated with the data + * pointer. + */ +typedef void (*void_completion_t)(int rc, const void *data); + +/** + * \brief signature of a completion function that returns a Stat structure. + * + * This method will be invoked at the end of a asynchronous call and also as + * a result of connection loss or timeout. + * \param rc the error code of the call. Connection loss/timeout triggers + * the completion with one of the following error codes: + * ZCONNECTIONLOSS -- lost connection to the server + * ZOPERATIONTIMEOUT -- connection timed out + * Data related events trigger the completion with error codes listed the + * Exceptions section of the documentation of the function that initiated the + * call. (Zero indicates call was successful.) + * \param stat a pointer to the stat information for the node involved in + * this function. If a non zero error code is returned, the content of + * stat is undefined. The programmer is NOT responsible for freeing stat. + * \param data the pointer that was passed by the caller when the function + * that this completion corresponds to was invoked. The programmer + * is responsible for any memory freeing associated with the data + * pointer. + */ +typedef void (*stat_completion_t)(int rc, const struct Stat *stat, + const void *data); + +/** + * \brief signature of a completion function that returns data. + * + * This method will be invoked at the end of a asynchronous call and also as + * a result of connection loss or timeout. + * \param rc the error code of the call. Connection loss/timeout triggers + * the completion with one of the following error codes: + * ZCONNECTIONLOSS -- lost connection to the server + * ZOPERATIONTIMEOUT -- connection timed out + * Data related events trigger the completion with error codes listed the + * Exceptions section of the documentation of the function that initiated the + * call. (Zero indicates call was successful.) + * \param value the value of the information returned by the asynchronous call. + * If a non zero error code is returned, the content of value is undefined. + * The programmer is NOT responsible for freeing value. + * \param value_len the number of bytes in value. + * \param stat a pointer to the stat information for the node involved in + * this function. If a non zero error code is returned, the content of + * stat is undefined. The programmer is NOT responsible for freeing stat. + * \param data the pointer that was passed by the caller when the function + * that this completion corresponds to was invoked. The programmer + * is responsible for any memory freeing associated with the data + * pointer. + */ +typedef void (*data_completion_t)(int rc, const char *value, int value_len, + const struct Stat *stat, const void *data); + +/** + * \brief signature of a completion function that returns a list of strings. + * + * This method will be invoked at the end of a asynchronous call and also as + * a result of connection loss or timeout. + * \param rc the error code of the call. Connection loss/timeout triggers + * the completion with one of the following error codes: + * ZCONNECTIONLOSS -- lost connection to the server + * ZOPERATIONTIMEOUT -- connection timed out + * Data related events trigger the completion with error codes listed the + * Exceptions section of the documentation of the function that initiated the + * call. (Zero indicates call was successful.) + * \param strings a pointer to the structure containng the list of strings of the + * names of the children of a node. If a non zero error code is returned, + * the content of strings is undefined. The programmer is NOT responsible + * for freeing strings. + * \param data the pointer that was passed by the caller when the function + * that this completion corresponds to was invoked. The programmer + * is responsible for any memory freeing associated with the data + * pointer. + */ +typedef void (*strings_completion_t)(int rc, + const struct String_vector *strings, const void *data); + +/** + * \brief signature of a completion function that returns a list of strings and stat. + * . + * + * This method will be invoked at the end of a asynchronous call and also as + * a result of connection loss or timeout. + * \param rc the error code of the call. Connection loss/timeout triggers + * the completion with one of the following error codes: + * ZCONNECTIONLOSS -- lost connection to the server + * ZOPERATIONTIMEOUT -- connection timed out + * Data related events trigger the completion with error codes listed the + * Exceptions section of the documentation of the function that initiated the + * call. (Zero indicates call was successful.) + * \param strings a pointer to the structure containng the list of strings of the + * names of the children of a node. If a non zero error code is returned, + * the content of strings is undefined. The programmer is NOT responsible + * for freeing strings. + * \param stat a pointer to the stat information for the node involved in + * this function. If a non zero error code is returned, the content of + * stat is undefined. The programmer is NOT responsible for freeing stat. + * \param data the pointer that was passed by the caller when the function + * that this completion corresponds to was invoked. The programmer + * is responsible for any memory freeing associated with the data + * pointer. + */ +typedef void (*strings_stat_completion_t)(int rc, + const struct String_vector *strings, const struct Stat *stat, + const void *data); + +/** + * \brief signature of a completion function that returns a list of strings. + * + * This method will be invoked at the end of a asynchronous call and also as + * a result of connection loss or timeout. + * \param rc the error code of the call. Connection loss/timeout triggers + * the completion with one of the following error codes: + * ZCONNECTIONLOSS -- lost connection to the server + * ZOPERATIONTIMEOUT -- connection timed out + * Data related events trigger the completion with error codes listed the + * Exceptions section of the documentation of the function that initiated the + * call. (Zero indicates call was successful.) + * \param value the value of the string returned. + * \param data the pointer that was passed by the caller when the function + * that this completion corresponds to was invoked. The programmer + * is responsible for any memory freeing associated with the data + * pointer. + */ +typedef void + (*string_completion_t)(int rc, const char *value, const void *data); + +/** + * \brief signature of a completion function that returns an ACL. + * + * This method will be invoked at the end of a asynchronous call and also as + * a result of connection loss or timeout. + * \param rc the error code of the call. Connection loss/timeout triggers + * the completion with one of the following error codes: + * ZCONNECTIONLOSS -- lost connection to the server + * ZOPERATIONTIMEOUT -- connection timed out + * Data related events trigger the completion with error codes listed the + * Exceptions section of the documentation of the function that initiated the + * call. (Zero indicates call was successful.) + * \param acl a pointer to the structure containng the ACL of a node. If a non + * zero error code is returned, the content of strings is undefined. The + * programmer is NOT responsible for freeing acl. + * \param stat a pointer to the stat information for the node involved in + * this function. If a non zero error code is returned, the content of + * stat is undefined. The programmer is NOT responsible for freeing stat. + * \param data the pointer that was passed by the caller when the function + * that this completion corresponds to was invoked. The programmer + * is responsible for any memory freeing associated with the data + * pointer. + */ +typedef void (*acl_completion_t)(int rc, struct ACL_vector *acl, + struct Stat *stat, const void *data); + +/** + * \brief get the state of the zookeeper connection. + * + * The return value will be one of the \ref State Consts. + */ +ZOOAPI int zoo_state(zhandle_t *zh); + +/** + * \brief create a node. + * + * This method will create a node in ZooKeeper. A node can only be created if + * it does not already exists. The Create Flags affect the creation of nodes. + * If ZOO_EPHEMERAL flag is set, the node will automatically get removed if the + * client session goes away. If the ZOO_SEQUENCE flag is set, a unique + * monotonically increasing sequence number is appended to the path name. The + * sequence number is always fixed length of 10 digits, 0 padded. + * + * \param zh the zookeeper handle obtained by a call to \ref zookeeper_init + * \param path The name of the node. Expressed as a file name with slashes + * separating ancestors of the node. + * \param value The data to be stored in the node. + * \param valuelen The number of bytes in data. + * \param acl The initial ACL of the node. The ACL must not be null or empty. + * \param flags this parameter can be set to 0 for normal create or an OR + * of the Create Flags + * \param completion the routine to invoke when the request completes. The completion + * will be triggered with one of the following codes passed in as the rc argument: + * ZOK operation completed successfully + * ZNONODE the parent node does not exist. + * ZNODEEXISTS the node already exists + * ZNOAUTH the client does not have permission. + * ZNOCHILDRENFOREPHEMERALS cannot create children of ephemeral nodes. + * \param data The data that will be passed to the completion routine when the + * function completes. + * \return ZOK on success or one of the following errcodes on failure: + * ZBADARGUMENTS - invalid input parameters + * ZINVALIDSTATE - zhandle state is either ZOO_SESSION_EXPIRED_STATE or ZOO_AUTH_FAILED_STATE + * ZMARSHALLINGERROR - failed to marshall a request; possibly, out of memory + */ +ZOOAPI int zoo_acreate(zhandle_t *zh, const char *path, const char *value, + int valuelen, const struct ACL_vector *acl, int flags, + string_completion_t completion, const void *data); + +/** + * \brief delete a node in zookeeper. + * + * \param zh the zookeeper handle obtained by a call to \ref zookeeper_init + * \param path the name of the node. Expressed as a file name with slashes + * separating ancestors of the node. + * \param version the expected version of the node. The function will fail if the + * actual version of the node does not match the expected version. + * If -1 is used the version check will not take place. + * \param completion the routine to invoke when the request completes. The completion + * will be triggered with one of the following codes passed in as the rc argument: + * ZOK operation completed successfully + * ZNONODE the node does not exist. + * ZNOAUTH the client does not have permission. + * ZBADVERSION expected version does not match actual version. + * ZNOTEMPTY children are present; node cannot be deleted. + * \param data the data that will be passed to the completion routine when + * the function completes. + * \return ZOK on success or one of the following errcodes on failure: + * ZBADARGUMENTS - invalid input parameters + * ZINVALIDSTATE - zhandle state is either ZOO_SESSION_EXPIRED_STATE or ZOO_AUTH_FAILED_STATE + * ZMARSHALLINGERROR - failed to marshall a request; possibly, out of memory + */ +ZOOAPI int zoo_adelete(zhandle_t *zh, const char *path, int version, + void_completion_t completion, const void *data); + +/** + * \brief checks the existence of a node in zookeeper. + * + * \param zh the zookeeper handle obtained by a call to \ref zookeeper_init + * \param path the name of the node. Expressed as a file name with slashes + * separating ancestors of the node. + * \param watch if nonzero, a watch will be set at the server to notify the + * client if the node changes. The watch will be set even if the node does not + * exist. This allows clients to watch for nodes to appear. + * \param completion the routine to invoke when the request completes. The completion + * will be triggered with one of the following codes passed in as the rc argument: + * ZOK operation completed successfully + * ZNONODE the node does not exist. + * ZNOAUTH the client does not have permission. + * \param data the data that will be passed to the completion routine when the + * function completes. + * \return ZOK on success or one of the following errcodes on failure: + * ZBADARGUMENTS - invalid input parameters + * ZINVALIDSTATE - zhandle state is either ZOO_SESSION_EXPIRED_STATE or ZOO_AUTH_FAILED_STATE + * ZMARSHALLINGERROR - failed to marshall a request; possibly, out of memory + */ +ZOOAPI int zoo_aexists(zhandle_t *zh, const char *path, int watch, + stat_completion_t completion, const void *data); + +/** + * \brief checks the existence of a node in zookeeper. + * + * This function is similar to \ref zoo_axists except it allows one specify + * a watcher object - a function pointer and associated context. The function + * will be called once the watch has fired. The associated context data will be + * passed to the function as the watcher context parameter. + * + * \param zh the zookeeper handle obtained by a call to \ref zookeeper_init + * \param path the name of the node. Expressed as a file name with slashes + * separating ancestors of the node. + * \param watcher if non-null a watch will set on the specified znode on the server. + * The watch will be set even if the node does not exist. This allows clients + * to watch for nodes to appear. + * \param watcherCtx user specific data, will be passed to the watcher callback. + * Unlike the global context set by \ref zookeeper_init, this watcher context + * is associated with the given instance of the watcher only. + * \param completion the routine to invoke when the request completes. The completion + * will be triggered with one of the following codes passed in as the rc argument: + * ZOK operation completed successfully + * ZNONODE the node does not exist. + * ZNOAUTH the client does not have permission. + * \param data the data that will be passed to the completion routine when the + * function completes. + * \return ZOK on success or one of the following errcodes on failure: + * ZBADARGUMENTS - invalid input parameters + * ZINVALIDSTATE - zhandle state is either ZOO_SESSION_EXPIRED_STATE or ZOO_AUTH_FAILED_STATE + * ZMARSHALLINGERROR - failed to marshall a request; possibly, out of memory + */ +ZOOAPI int zoo_awexists(zhandle_t *zh, const char *path, + watcher_fn watcher, void* watcherCtx, + stat_completion_t completion, const void *data); + +/** + * \brief gets the data associated with a node. + * + * \param zh the zookeeper handle obtained by a call to \ref zookeeper_init + * \param path the name of the node. Expressed as a file name with slashes + * separating ancestors of the node. + * \param watch if nonzero, a watch will be set at the server to notify + * the client if the node changes. + * \param completion the routine to invoke when the request completes. The completion + * will be triggered with one of the following codes passed in as the rc argument: + * ZOK operation completed successfully + * ZNONODE the node does not exist. + * ZNOAUTH the client does not have permission. + * \param data the data that will be passed to the completion routine when + * the function completes. + * \return ZOK on success or one of the following errcodes on failure: + * ZBADARGUMENTS - invalid input parameters + * ZINVALIDSTATE - zhandle state is either in ZOO_SESSION_EXPIRED_STATE or ZOO_AUTH_FAILED_STATE + * ZMARSHALLINGERROR - failed to marshall a request; possibly, out of memory + */ +ZOOAPI int zoo_aget(zhandle_t *zh, const char *path, int watch, + data_completion_t completion, const void *data); + +/** + * \brief gets the data associated with a node. + * + * This function is similar to \ref zoo_aget except it allows one specify + * a watcher object rather than a boolean watch flag. + * + * \param zh the zookeeper handle obtained by a call to \ref zookeeper_init + * \param path the name of the node. Expressed as a file name with slashes + * separating ancestors of the node. + * \param watcher if non-null, a watch will be set at the server to notify + * the client if the node changes. + * \param watcherCtx user specific data, will be passed to the watcher callback. + * Unlike the global context set by \ref zookeeper_init, this watcher context + * is associated with the given instance of the watcher only. + * \param completion the routine to invoke when the request completes. The completion + * will be triggered with one of the following codes passed in as the rc argument: + * ZOK operation completed successfully + * ZNONODE the node does not exist. + * ZNOAUTH the client does not have permission. + * \param data the data that will be passed to the completion routine when + * the function completes. + * \return ZOK on success or one of the following errcodes on failure: + * ZBADARGUMENTS - invalid input parameters + * ZINVALIDSTATE - zhandle state is either in ZOO_SESSION_EXPIRED_STATE or ZOO_AUTH_FAILED_STATE + * ZMARSHALLINGERROR - failed to marshall a request; possibly, out of memory + */ +ZOOAPI int zoo_awget(zhandle_t *zh, const char *path, + watcher_fn watcher, void* watcherCtx, + data_completion_t completion, const void *data); + +/** + * \brief sets the data associated with a node. + * + * \param zh the zookeeper handle obtained by a call to \ref zookeeper_init + * \param path the name of the node. Expressed as a file name with slashes + * separating ancestors of the node. + * \param buffer the buffer holding data to be written to the node. + * \param buflen the number of bytes from buffer to write. + * \param version the expected version of the node. The function will fail if + * the actual version of the node does not match the expected version. If -1 is + * used the version check will not take place. * completion: If null, + * the function will execute synchronously. Otherwise, the function will return + * immediately and invoke the completion routine when the request completes. + * \param completion the routine to invoke when the request completes. The completion + * will be triggered with one of the following codes passed in as the rc argument: + * ZOK operation completed successfully + * ZNONODE the node does not exist. + * ZNOAUTH the client does not have permission. + * ZBADVERSION expected version does not match actual version. + * \param data the data that will be passed to the completion routine when + * the function completes. + * \return ZOK on success or one of the following errcodes on failure: + * ZBADARGUMENTS - invalid input parameters + * ZINVALIDSTATE - zhandle state is either ZOO_SESSION_EXPIRED_STATE or ZOO_AUTH_FAILED_STATE + * ZMARSHALLINGERROR - failed to marshall a request; possibly, out of memory + */ +ZOOAPI int zoo_aset(zhandle_t *zh, const char *path, const char *buffer, int buflen, + int version, stat_completion_t completion, const void *data); + +/** + * \brief lists the children of a node. + * + * \param zh the zookeeper handle obtained by a call to \ref zookeeper_init + * \param path the name of the node. Expressed as a file name with slashes + * separating ancestors of the node. + * \param watch if nonzero, a watch will be set at the server to notify + * the client if the node changes. + * \param completion the routine to invoke when the request completes. The completion + * will be triggered with one of the following codes passed in as the rc argument: + * ZOK operation completed successfully + * ZNONODE the node does not exist. + * ZNOAUTH the client does not have permission. + * \param data the data that will be passed to the completion routine when + * the function completes. + * \return ZOK on success or one of the following errcodes on failure: + * ZBADARGUMENTS - invalid input parameters + * ZINVALIDSTATE - zhandle state is either ZOO_SESSION_EXPIRED_STATE or ZOO_AUTH_FAILED_STATE + * ZMARSHALLINGERROR - failed to marshall a request; possibly, out of memory + */ +ZOOAPI int zoo_aget_children(zhandle_t *zh, const char *path, int watch, + strings_completion_t completion, const void *data); + +/** + * \brief lists the children of a node. + * + * This function is similar to \ref zoo_aget_children except it allows one specify + * a watcher object rather than a boolean watch flag. + * + * \param zh the zookeeper handle obtained by a call to \ref zookeeper_init + * \param path the name of the node. Expressed as a file name with slashes + * separating ancestors of the node. + * \param watcher if non-null, a watch will be set at the server to notify + * the client if the node changes. + * \param watcherCtx user specific data, will be passed to the watcher callback. + * Unlike the global context set by \ref zookeeper_init, this watcher context + * is associated with the given instance of the watcher only. + * \param completion the routine to invoke when the request completes. The completion + * will be triggered with one of the following codes passed in as the rc argument: + * ZOK operation completed successfully + * ZNONODE the node does not exist. + * ZNOAUTH the client does not have permission. + * \param data the data that will be passed to the completion routine when + * the function completes. + * \return ZOK on success or one of the following errcodes on failure: + * ZBADARGUMENTS - invalid input parameters + * ZINVALIDSTATE - zhandle state is either ZOO_SESSION_EXPIRED_STATE or ZOO_AUTH_FAILED_STATE + * ZMARSHALLINGERROR - failed to marshall a request; possibly, out of memory + */ +ZOOAPI int zoo_awget_children(zhandle_t *zh, const char *path, + watcher_fn watcher, void* watcherCtx, + strings_completion_t completion, const void *data); + +/** + * \brief lists the children of a node, and get the parent stat. + * + * This function is new in version 3.3.0 + * + * \param zh the zookeeper handle obtained by a call to \ref zookeeper_init + * \param path the name of the node. Expressed as a file name with slashes + * separating ancestors of the node. + * \param watch if nonzero, a watch will be set at the server to notify + * the client if the node changes. + * \param completion the routine to invoke when the request completes. The completion + * will be triggered with one of the following codes passed in as the rc argument: + * ZOK operation completed successfully + * ZNONODE the node does not exist. + * ZNOAUTH the client does not have permission. + * \param data the data that will be passed to the completion routine when + * the function completes. + * \return ZOK on success or one of the following errcodes on failure: + * ZBADARGUMENTS - invalid input parameters + * ZINVALIDSTATE - zhandle state is either ZOO_SESSION_EXPIRED_STATE or ZOO_AUTH_FAILED_STATE + * ZMARSHALLINGERROR - failed to marshall a request; possibly, out of memory + */ +ZOOAPI int zoo_aget_children2(zhandle_t *zh, const char *path, int watch, + strings_stat_completion_t completion, const void *data); + +/** + * \brief lists the children of a node, and get the parent stat. + * + * This function is similar to \ref zoo_aget_children2 except it allows one specify + * a watcher object rather than a boolean watch flag. + * + * This function is new in version 3.3.0 + * + * \param zh the zookeeper handle obtained by a call to \ref zookeeper_init + * \param path the name of the node. Expressed as a file name with slashes + * separating ancestors of the node. + * \param watcher if non-null, a watch will be set at the server to notify + * the client if the node changes. + * \param watcherCtx user specific data, will be passed to the watcher callback. + * Unlike the global context set by \ref zookeeper_init, this watcher context + * is associated with the given instance of the watcher only. + * \param completion the routine to invoke when the request completes. The completion + * will be triggered with one of the following codes passed in as the rc argument: + * ZOK operation completed successfully + * ZNONODE the node does not exist. + * ZNOAUTH the client does not have permission. + * \param data the data that will be passed to the completion routine when + * the function completes. + * \return ZOK on success or one of the following errcodes on failure: + * ZBADARGUMENTS - invalid input parameters + * ZINVALIDSTATE - zhandle state is either ZOO_SESSION_EXPIRED_STATE or ZOO_AUTH_FAILED_STATE + * ZMARSHALLINGERROR - failed to marshall a request; possibly, out of memory + */ +ZOOAPI int zoo_awget_children2(zhandle_t *zh, const char *path, + watcher_fn watcher, void* watcherCtx, + strings_stat_completion_t completion, const void *data); + +/** + * \brief Flush leader channel. + * + * \param zh the zookeeper handle obtained by a call to \ref zookeeper_init + * \param path the name of the node. Expressed as a file name with slashes + * separating ancestors of the node. + * \param completion the routine to invoke when the request completes. The completion + * will be triggered with one of the following codes passed in as the rc argument: + * ZOK operation completed successfully + * ZNONODE the node does not exist. + * ZNOAUTH the client does not have permission. + * \param data the data that will be passed to the completion routine when + * the function completes. + * \return ZOK on success or one of the following errcodes on failure: + * ZBADARGUMENTS - invalid input parameters + * ZINVALIDSTATE - zhandle state is either ZOO_SESSION_EXPIRED_STATE or ZOO_AUTH_FAILED_STATE + * ZMARSHALLINGERROR - failed to marshall a request; possibly, out of memory + */ + +ZOOAPI int zoo_async(zhandle_t *zh, const char *path, + string_completion_t completion, const void *data); + + +/** + * \brief gets the acl associated with a node. + * + * \param zh the zookeeper handle obtained by a call to \ref zookeeper_init + * \param path the name of the node. Expressed as a file name with slashes + * separating ancestors of the node. + * \param completion the routine to invoke when the request completes. The completion + * will be triggered with one of the following codes passed in as the rc argument: + * ZOK operation completed successfully + * ZNONODE the node does not exist. + * ZNOAUTH the client does not have permission. + * \param data the data that will be passed to the completion routine when + * the function completes. + * \return ZOK on success or one of the following errcodes on failure: + * ZBADARGUMENTS - invalid input parameters + * ZINVALIDSTATE - zhandle state is either ZOO_SESSION_EXPIRED_STATE or ZOO_AUTH_FAILED_STATE + * ZMARSHALLINGERROR - failed to marshall a request; possibly, out of memory + */ +ZOOAPI int zoo_aget_acl(zhandle_t *zh, const char *path, acl_completion_t completion, + const void *data); + +/** + * \brief sets the acl associated with a node. + * + * \param zh the zookeeper handle obtained by a call to \ref zookeeper_init + * \param path the name of the node. Expressed as a file name with slashes + * separating ancestors of the node. + * \param buffer the buffer holding the acls to be written to the node. + * \param buflen the number of bytes from buffer to write. + * \param completion the routine to invoke when the request completes. The completion + * will be triggered with one of the following codes passed in as the rc argument: + * ZOK operation completed successfully + * ZNONODE the node does not exist. + * ZNOAUTH the client does not have permission. + * ZINVALIDACL invalid ACL specified + * ZBADVERSION expected version does not match actual version. + * \param data the data that will be passed to the completion routine when + * the function completes. + * \return ZOK on success or one of the following errcodes on failure: + * ZBADARGUMENTS - invalid input parameters + * ZINVALIDSTATE - zhandle state is either ZOO_SESSION_EXPIRED_STATE or ZOO_AUTH_FAILED_STATE + * ZMARSHALLINGERROR - failed to marshall a request; possibly, out of memory + */ +ZOOAPI int zoo_aset_acl(zhandle_t *zh, const char *path, int version, + struct ACL_vector *acl, void_completion_t, const void *data); + +/** + * \brief atomically commits multiple zookeeper operations. + * + * \param zh the zookeeper handle obtained by a call to \ref zookeeper_init + * \param count the number of operations + * \param ops an array of operations to commit + * \param results an array to hold the results of the operations + * \param completion the routine to invoke when the request completes. The completion + * will be triggered with any of the error codes that can that can be returned by the + * ops supported by a multi op (see \ref zoo_acreate, \ref zoo_adelete, \ref zoo_aset). + * \param data the data that will be passed to the completion routine when + * the function completes. + * \return the return code for the function call. This can be any of the + * values that can be returned by the ops supported by a multi op (see + * \ref zoo_acreate, \ref zoo_adelete, \ref zoo_aset). + */ +ZOOAPI int zoo_amulti(zhandle_t *zh, int count, const zoo_op_t *ops, + zoo_op_result_t *results, void_completion_t, const void *data); + +/** + * \brief return an error string. + * + * \param return code + * \return string corresponding to the return code + */ +ZOOAPI const char* zerror(int c); + +/** + * \brief specify application credentials. + * + * The application calls this function to specify its credentials for purposes + * of authentication. The server will use the security provider specified by + * the scheme parameter to authenticate the client connection. If the + * authentication request has failed: + * - the server connection is dropped + * - the watcher is called with the ZOO_AUTH_FAILED_STATE value as the state + * parameter. + * \param zh the zookeeper handle obtained by a call to \ref zookeeper_init + * \param scheme the id of authentication scheme. Natively supported: + * "digest" password-based authentication + * \param cert application credentials. The actual value depends on the scheme. + * \param certLen the length of the data parameter + * \param completion the routine to invoke when the request completes. One of + * the following result codes may be passed into the completion callback: + * ZOK operation completed successfully + * ZAUTHFAILED authentication failed + * \param data the data that will be passed to the completion routine when the + * function completes. + * \return ZOK on success or one of the following errcodes on failure: + * ZBADARGUMENTS - invalid input parameters + * ZINVALIDSTATE - zhandle state is either ZOO_SESSION_EXPIRED_STATE or ZOO_AUTH_FAILED_STATE + * ZMARSHALLINGERROR - failed to marshall a request; possibly, out of memory + * ZSYSTEMERROR - a system error occured + */ +ZOOAPI int zoo_add_auth(zhandle_t *zh,const char* scheme,const char* cert, + int certLen, void_completion_t completion, const void *data); + +/** + * \brief checks if the current zookeeper connection state can't be recovered. + * + * The application must close the zhandle and try to reconnect. + * + * \param zh the zookeeper handle (see \ref zookeeper_init) + * \return ZINVALIDSTATE if connection is unrecoverable + */ +ZOOAPI int is_unrecoverable(zhandle_t *zh); + +/** + * \brief sets the debugging level for the library + */ +ZOOAPI void zoo_set_debug_level(ZooLogLevel logLevel); + +/** + * \brief sets the stream to be used by the library for logging + * + * The zookeeper library uses stderr as its default log stream. Application + * must make sure the stream is writable. Passing in NULL resets the stream + * to its default value (stderr). + */ +ZOOAPI void zoo_set_log_stream(FILE* logStream); + +/** + * \brief enable/disable quorum endpoint order randomization + * + * Note: typically this method should NOT be used outside of testing. + * + * If passed a non-zero value, will make the client connect to quorum peers + * in the order as specified in the zookeeper_init() call. + * A zero value causes zookeeper_init() to permute the peer endpoints + * which is good for more even client connection distribution among the + * quorum peers. + */ +ZOOAPI void zoo_deterministic_conn_order(int yesOrNo); + +/** + * \brief create a node synchronously. + * + * This method will create a node in ZooKeeper. A node can only be created if + * it does not already exists. The Create Flags affect the creation of nodes. + * If ZOO_EPHEMERAL flag is set, the node will automatically get removed if the + * client session goes away. If the ZOO_SEQUENCE flag is set, a unique + * monotonically increasing sequence number is appended to the path name. + * + * \param zh the zookeeper handle obtained by a call to \ref zookeeper_init + * \param path The name of the node. Expressed as a file name with slashes + * separating ancestors of the node. + * \param value The data to be stored in the node. + * \param valuelen The number of bytes in data. To set the data to be NULL use + * value as NULL and valuelen as -1. + * \param acl The initial ACL of the node. The ACL must not be null or empty. + * \param flags this parameter can be set to 0 for normal create or an OR + * of the Create Flags + * \param path_buffer Buffer which will be filled with the path of the + * new node (this might be different than the supplied path + * because of the ZOO_SEQUENCE flag). The path string will always be + * null-terminated. This parameter may be NULL if path_buffer_len = 0. + * \param path_buffer_len Size of path buffer; if the path of the new + * node (including space for the null terminator) exceeds the buffer size, + * the path string will be truncated to fit. The actual path of the + * new node in the server will not be affected by the truncation. + * The path string will always be null-terminated. + * \return one of the following codes are returned: + * ZOK operation completed successfully + * ZNONODE the parent node does not exist. + * ZNODEEXISTS the node already exists + * ZNOAUTH the client does not have permission. + * ZNOCHILDRENFOREPHEMERALS cannot create children of ephemeral nodes. + * ZBADARGUMENTS - invalid input parameters + * ZINVALIDSTATE - zhandle state is either ZOO_SESSION_EXPIRED_STATE or ZOO_AUTH_FAILED_STATE + * ZMARSHALLINGERROR - failed to marshall a request; possibly, out of memory + */ +ZOOAPI int zoo_create(zhandle_t *zh, const char *path, const char *value, + int valuelen, const struct ACL_vector *acl, int flags, + char *path_buffer, int path_buffer_len); + +/** + * \brief delete a node in zookeeper synchronously. + * + * \param zh the zookeeper handle obtained by a call to \ref zookeeper_init + * \param path the name of the node. Expressed as a file name with slashes + * separating ancestors of the node. + * \param version the expected version of the node. The function will fail if the + * actual version of the node does not match the expected version. + * If -1 is used the version check will not take place. + * \return one of the following values is returned. + * ZOK operation completed successfully + * ZNONODE the node does not exist. + * ZNOAUTH the client does not have permission. + * ZBADVERSION expected version does not match actual version. + * ZNOTEMPTY children are present; node cannot be deleted. + * ZBADARGUMENTS - invalid input parameters + * ZINVALIDSTATE - zhandle state is either ZOO_SESSION_EXPIRED_STATE or ZOO_AUTH_FAILED_STATE + * ZMARSHALLINGERROR - failed to marshall a request; possibly, out of memory + */ +ZOOAPI int zoo_delete(zhandle_t *zh, const char *path, int version); + + +/** + * \brief checks the existence of a node in zookeeper synchronously. + * + * \param zh the zookeeper handle obtained by a call to \ref zookeeper_init + * \param path the name of the node. Expressed as a file name with slashes + * separating ancestors of the node. + * \param watch if nonzero, a watch will be set at the server to notify the + * client if the node changes. The watch will be set even if the node does not + * exist. This allows clients to watch for nodes to appear. + * \param the return stat value of the node. + * \return return code of the function call. + * ZOK operation completed successfully + * ZNONODE the node does not exist. + * ZNOAUTH the client does not have permission. + * ZBADARGUMENTS - invalid input parameters + * ZINVALIDSTATE - zhandle state is either ZOO_SESSION_EXPIRED_STATE or ZOO_AUTH_FAILED_STATE + * ZMARSHALLINGERROR - failed to marshall a request; possibly, out of memory + */ +ZOOAPI int zoo_exists(zhandle_t *zh, const char *path, int watch, struct Stat *stat); + +/** + * \brief checks the existence of a node in zookeeper synchronously. + * + * This function is similar to \ref zoo_exists except it allows one specify + * a watcher object rather than a boolean watch flag. + * + * \param zh the zookeeper handle obtained by a call to \ref zookeeper_init + * \param path the name of the node. Expressed as a file name with slashes + * separating ancestors of the node. + * \param watcher if non-null a watch will set on the specified znode on the server. + * The watch will be set even if the node does not exist. This allows clients + * to watch for nodes to appear. + * \param watcherCtx user specific data, will be passed to the watcher callback. + * Unlike the global context set by \ref zookeeper_init, this watcher context + * is associated with the given instance of the watcher only. + * \param the return stat value of the node. + * \return return code of the function call. + * ZOK operation completed successfully + * ZNONODE the node does not exist. + * ZNOAUTH the client does not have permission. + * ZBADARGUMENTS - invalid input parameters + * ZINVALIDSTATE - zhandle state is either ZOO_SESSION_EXPIRED_STATE or ZOO_AUTH_FAILED_STATE + * ZMARSHALLINGERROR - failed to marshall a request; possibly, out of memory + */ +ZOOAPI int zoo_wexists(zhandle_t *zh, const char *path, + watcher_fn watcher, void* watcherCtx, struct Stat *stat); + +/** + * \brief gets the data associated with a node synchronously. + * + * \param zh the zookeeper handle obtained by a call to \ref zookeeper_init + * \param path the name of the node. Expressed as a file name with slashes + * separating ancestors of the node. + * \param watch if nonzero, a watch will be set at the server to notify + * the client if the node changes. + * \param buffer the buffer holding the node data returned by the server + * \param buffer_len is the size of the buffer pointed to by the buffer parameter. + * It'll be set to the actual data length upon return. If the data is NULL, length is -1. + * \param stat if not NULL, will hold the value of stat for the path on return. + * \return return value of the function call. + * ZOK operation completed successfully + * ZNONODE the node does not exist. + * ZNOAUTH the client does not have permission. + * ZBADARGUMENTS - invalid input parameters + * ZINVALIDSTATE - zhandle state is either in ZOO_SESSION_EXPIRED_STATE or ZOO_AUTH_FAILED_STATE + * ZMARSHALLINGERROR - failed to marshall a request; possibly, out of memory + */ +ZOOAPI int zoo_get(zhandle_t *zh, const char *path, int watch, char *buffer, + int* buffer_len, struct Stat *stat); + +/** + * \brief gets the data associated with a node synchronously. + * + * This function is similar to \ref zoo_get except it allows one specify + * a watcher object rather than a boolean watch flag. + * + * \param zh the zookeeper handle obtained by a call to \ref zookeeper_init + * \param path the name of the node. Expressed as a file name with slashes + * separating ancestors of the node. + * \param watcher if non-null, a watch will be set at the server to notify + * the client if the node changes. + * \param watcherCtx user specific data, will be passed to the watcher callback. + * Unlike the global context set by \ref zookeeper_init, this watcher context + * is associated with the given instance of the watcher only. + * \param buffer the buffer holding the node data returned by the server + * \param buffer_len is the size of the buffer pointed to by the buffer parameter. + * It'll be set to the actual data length upon return. If the data is NULL, length is -1. + * \param stat if not NULL, will hold the value of stat for the path on return. + * \return return value of the function call. + * ZOK operation completed successfully + * ZNONODE the node does not exist. + * ZNOAUTH the client does not have permission. + * ZBADARGUMENTS - invalid input parameters + * ZINVALIDSTATE - zhandle state is either in ZOO_SESSION_EXPIRED_STATE or ZOO_AUTH_FAILED_STATE + * ZMARSHALLINGERROR - failed to marshall a request; possibly, out of memory + */ +ZOOAPI int zoo_wget(zhandle_t *zh, const char *path, + watcher_fn watcher, void* watcherCtx, + char *buffer, int* buffer_len, struct Stat *stat); + +/** + * \brief sets the data associated with a node. See zoo_set2 function if + * you require access to the stat information associated with the znode. + * + * \param zh the zookeeper handle obtained by a call to \ref zookeeper_init + * \param path the name of the node. Expressed as a file name with slashes + * separating ancestors of the node. + * \param buffer the buffer holding data to be written to the node. + * \param buflen the number of bytes from buffer to write. To set NULL as data + * use buffer as NULL and buflen as -1. + * \param version the expected version of the node. The function will fail if + * the actual version of the node does not match the expected version. If -1 is + * used the version check will not take place. + * \return the return code for the function call. + * ZOK operation completed successfully + * ZNONODE the node does not exist. + * ZNOAUTH the client does not have permission. + * ZBADVERSION expected version does not match actual version. + * ZBADARGUMENTS - invalid input parameters + * ZINVALIDSTATE - zhandle state is either ZOO_SESSION_EXPIRED_STATE or ZOO_AUTH_FAILED_STATE + * ZMARSHALLINGERROR - failed to marshall a request; possibly, out of memory + */ +ZOOAPI int zoo_set(zhandle_t *zh, const char *path, const char *buffer, + int buflen, int version); + +/** + * \brief sets the data associated with a node. This function is the same + * as zoo_set except that it also provides access to stat information + * associated with the znode. + * + * \param zh the zookeeper handle obtained by a call to \ref zookeeper_init + * \param path the name of the node. Expressed as a file name with slashes + * separating ancestors of the node. + * \param buffer the buffer holding data to be written to the node. + * \param buflen the number of bytes from buffer to write. To set NULL as data + * use buffer as NULL and buflen as -1. + * \param version the expected version of the node. The function will fail if + * the actual version of the node does not match the expected version. If -1 is + * used the version check will not take place. + * \param stat if not NULL, will hold the value of stat for the path on return. + * \return the return code for the function call. + * ZOK operation completed successfully + * ZNONODE the node does not exist. + * ZNOAUTH the client does not have permission. + * ZBADVERSION expected version does not match actual version. + * ZBADARGUMENTS - invalid input parameters + * ZINVALIDSTATE - zhandle state is either ZOO_SESSION_EXPIRED_STATE or ZOO_AUTH_FAILED_STATE + * ZMARSHALLINGERROR - failed to marshall a request; possibly, out of memory + */ +ZOOAPI int zoo_set2(zhandle_t *zh, const char *path, const char *buffer, + int buflen, int version, struct Stat *stat); + +/** + * \brief lists the children of a node synchronously. + * + * \param zh the zookeeper handle obtained by a call to \ref zookeeper_init + * \param path the name of the node. Expressed as a file name with slashes + * separating ancestors of the node. + * \param watch if nonzero, a watch will be set at the server to notify + * the client if the node changes. + * \param strings return value of children paths. + * \return the return code of the function. + * ZOK operation completed successfully + * ZNONODE the node does not exist. + * ZNOAUTH the client does not have permission. + * ZBADARGUMENTS - invalid input parameters + * ZINVALIDSTATE - zhandle state is either ZOO_SESSION_EXPIRED_STATE or ZOO_AUTH_FAILED_STATE + * ZMARSHALLINGERROR - failed to marshall a request; possibly, out of memory + */ +ZOOAPI int zoo_get_children(zhandle_t *zh, const char *path, int watch, + struct String_vector *strings); + +/** + * \brief lists the children of a node synchronously. + * + * This function is similar to \ref zoo_get_children except it allows one specify + * a watcher object rather than a boolean watch flag. + * + * \param zh the zookeeper handle obtained by a call to \ref zookeeper_init + * \param path the name of the node. Expressed as a file name with slashes + * separating ancestors of the node. + * \param watcher if non-null, a watch will be set at the server to notify + * the client if the node changes. + * \param watcherCtx user specific data, will be passed to the watcher callback. + * Unlike the global context set by \ref zookeeper_init, this watcher context + * is associated with the given instance of the watcher only. + * \param strings return value of children paths. + * \return the return code of the function. + * ZOK operation completed successfully + * ZNONODE the node does not exist. + * ZNOAUTH the client does not have permission. + * ZBADARGUMENTS - invalid input parameters + * ZINVALIDSTATE - zhandle state is either ZOO_SESSION_EXPIRED_STATE or ZOO_AUTH_FAILED_STATE + * ZMARSHALLINGERROR - failed to marshall a request; possibly, out of memory + */ +ZOOAPI int zoo_wget_children(zhandle_t *zh, const char *path, + watcher_fn watcher, void* watcherCtx, + struct String_vector *strings); + +/** + * \brief lists the children of a node and get its stat synchronously. + * + * This function is new in version 3.3.0 + * + * \param zh the zookeeper handle obtained by a call to \ref zookeeper_init + * \param path the name of the node. Expressed as a file name with slashes + * separating ancestors of the node. + * \param watch if nonzero, a watch will be set at the server to notify + * the client if the node changes. + * \param strings return value of children paths. + * \param stat return value of node stat. + * \return the return code of the function. + * ZOK operation completed successfully + * ZNONODE the node does not exist. + * ZNOAUTH the client does not have permission. + * ZBADARGUMENTS - invalid input parameters + * ZINVALIDSTATE - zhandle state is either ZOO_SESSION_EXPIRED_STATE or ZOO_AUTH_FAILED_STATE + * ZMARSHALLINGERROR - failed to marshall a request; possibly, out of memory + */ +ZOOAPI int zoo_get_children2(zhandle_t *zh, const char *path, int watch, + struct String_vector *strings, struct Stat *stat); + +/** + * \brief lists the children of a node and get its stat synchronously. + * + * This function is similar to \ref zoo_get_children except it allows one specify + * a watcher object rather than a boolean watch flag. + * + * This function is new in version 3.3.0 + * + * \param zh the zookeeper handle obtained by a call to \ref zookeeper_init + * \param path the name of the node. Expressed as a file name with slashes + * separating ancestors of the node. + * \param watcher if non-null, a watch will be set at the server to notify + * the client if the node changes. + * \param watcherCtx user specific data, will be passed to the watcher callback. + * Unlike the global context set by \ref zookeeper_init, this watcher context + * is associated with the given instance of the watcher only. + * \param strings return value of children paths. + * \param stat return value of node stat. + * \return the return code of the function. + * ZOK operation completed successfully + * ZNONODE the node does not exist. + * ZNOAUTH the client does not have permission. + * ZBADARGUMENTS - invalid input parameters + * ZINVALIDSTATE - zhandle state is either ZOO_SESSION_EXPIRED_STATE or ZOO_AUTH_FAILED_STATE + * ZMARSHALLINGERROR - failed to marshall a request; possibly, out of memory + */ +ZOOAPI int zoo_wget_children2(zhandle_t *zh, const char *path, + watcher_fn watcher, void* watcherCtx, + struct String_vector *strings, struct Stat *stat); + +/** + * \brief gets the acl associated with a node synchronously. + * + * \param zh the zookeeper handle obtained by a call to \ref zookeeper_init + * \param path the name of the node. Expressed as a file name with slashes + * separating ancestors of the node. + * \param acl the return value of acls on the path. + * \param stat returns the stat of the path specified. + * \return the return code for the function call. + * ZOK operation completed successfully + * ZNONODE the node does not exist. + * ZNOAUTH the client does not have permission. + * ZBADARGUMENTS - invalid input parameters + * ZINVALIDSTATE - zhandle state is either ZOO_SESSION_EXPIRED_STATE or ZOO_AUTH_FAILED_STATE + * ZMARSHALLINGERROR - failed to marshall a request; possibly, out of memory + */ +ZOOAPI int zoo_get_acl(zhandle_t *zh, const char *path, struct ACL_vector *acl, + struct Stat *stat); + +/** + * \brief sets the acl associated with a node synchronously. + * + * \param zh the zookeeper handle obtained by a call to \ref zookeeper_init + * \param path the name of the node. Expressed as a file name with slashes + * separating ancestors of the node. + * \param version the expected version of the path. + * \param acl the acl to be set on the path. + * \return the return code for the function call. + * ZOK operation completed successfully + * ZNONODE the node does not exist. + * ZNOAUTH the client does not have permission. + * ZINVALIDACL invalid ACL specified + * ZBADVERSION expected version does not match actual version. + * ZBADARGUMENTS - invalid input parameters + * ZINVALIDSTATE - zhandle state is either ZOO_SESSION_EXPIRED_STATE or ZOO_AUTH_FAILED_STATE + * ZMARSHALLINGERROR - failed to marshall a request; possibly, out of memory + */ +ZOOAPI int zoo_set_acl(zhandle_t *zh, const char *path, int version, + const struct ACL_vector *acl); + +/** + * \brief atomically commits multiple zookeeper operations synchronously. + * + * \param zh the zookeeper handle obtained by a call to \ref zookeeper_init + * \param count the number of operations + * \param ops an array of operations to commit + * \param results an array to hold the results of the operations + * \return the return code for the function call. This can be any of the + * values that can be returned by the ops supported by a multi op (see + * \ref zoo_acreate, \ref zoo_adelete, \ref zoo_aset). + */ +ZOOAPI int zoo_multi(zhandle_t *zh, int count, const zoo_op_t *ops, zoo_op_result_t *results); + +#ifdef __cplusplus +} +#endif + +#endif /*ZOOKEEPER_H_*/ diff --git a/pkg/registry/zookeeper-3.4.6/src/c/include/zookeeper_log.h b/pkg/registry/zookeeper-3.4.6/src/c/include/zookeeper_log.h new file mode 100644 index 000000000..e5917cbc6 --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/c/include/zookeeper_log.h @@ -0,0 +1,51 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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. + */ + +#ifndef ZK_LOG_H_ +#define ZK_LOG_H_ + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +extern ZOOAPI ZooLogLevel logLevel; +#define LOGSTREAM getLogStream() + +#define LOG_ERROR(x) if(logLevel>=ZOO_LOG_LEVEL_ERROR) \ + log_message(ZOO_LOG_LEVEL_ERROR,__LINE__,__func__,format_log_message x) +#define LOG_WARN(x) if(logLevel>=ZOO_LOG_LEVEL_WARN) \ + log_message(ZOO_LOG_LEVEL_WARN,__LINE__,__func__,format_log_message x) +#define LOG_INFO(x) if(logLevel>=ZOO_LOG_LEVEL_INFO) \ + log_message(ZOO_LOG_LEVEL_INFO,__LINE__,__func__,format_log_message x) +#define LOG_DEBUG(x) if(logLevel==ZOO_LOG_LEVEL_DEBUG) \ + log_message(ZOO_LOG_LEVEL_DEBUG,__LINE__,__func__,format_log_message x) + +ZOOAPI void log_message(ZooLogLevel curLevel, int line,const char* funcName, + const char* message); + +ZOOAPI const char* format_log_message(const char* format,...); + +FILE* getLogStream(); + +#ifdef __cplusplus +} +#endif + +#endif /*ZK_LOG_H_*/ diff --git a/pkg/registry/zookeeper-3.4.6/src/c/include/zookeeper_version.h b/pkg/registry/zookeeper-3.4.6/src/c/include/zookeeper_version.h new file mode 100644 index 000000000..3e1c63684 --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/c/include/zookeeper_version.h @@ -0,0 +1,33 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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. + */ +#ifndef ZOOKEEPER_VERSION_H_ +#define ZOOKEEPER_VERSION_H_ + +#ifdef __cplusplus +extern "C" { +#endif + +#define ZOO_MAJOR_VERSION 3 +#define ZOO_MINOR_VERSION 4 +#define ZOO_PATCH_VERSION 6 + +#ifdef __cplusplus +} +#endif + +#endif /* ZOOKEEPER_VERSION_H_ */ diff --git a/pkg/registry/zookeeper-3.4.6/src/c/install-sh b/pkg/registry/zookeeper-3.4.6/src/c/install-sh new file mode 100755 index 000000000..a9244eb07 --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/c/install-sh @@ -0,0 +1,527 @@ +#!/bin/sh +# install - install a program, script, or datafile + +scriptversion=2011-01-19.21; # UTC + +# This originates from X11R5 (mit/util/scripts/install.sh), which was +# later released in X11R6 (xc/config/util/install.sh) with the +# following copyright and license. +# +# Copyright (C) 1994 X Consortium +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to +# deal in the Software without restriction, including without limitation the +# rights to use, copy, modify, merge, publish, distribute, sublicense, and/or +# sell copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in +# all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN +# AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNEC- +# TION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +# +# Except as contained in this notice, the name of the X Consortium shall not +# be used in advertising or otherwise to promote the sale, use or other deal- +# ings in this Software without prior written authorization from the X Consor- +# tium. +# +# +# FSF changes to this file are in the public domain. +# +# Calling this script install-sh is preferred over install.sh, to prevent +# `make' implicit rules from creating a file called install from it +# when there is no Makefile. +# +# This script is compatible with the BSD install script, but was written +# from scratch. + +nl=' +' +IFS=" "" $nl" + +# set DOITPROG to echo to test this script + +# Don't use :- since 4.3BSD and earlier shells don't like it. +doit=${DOITPROG-} +if test -z "$doit"; then + doit_exec=exec +else + doit_exec=$doit +fi + +# Put in absolute file names if you don't have them in your path; +# or use environment vars. + +chgrpprog=${CHGRPPROG-chgrp} +chmodprog=${CHMODPROG-chmod} +chownprog=${CHOWNPROG-chown} +cmpprog=${CMPPROG-cmp} +cpprog=${CPPROG-cp} +mkdirprog=${MKDIRPROG-mkdir} +mvprog=${MVPROG-mv} +rmprog=${RMPROG-rm} +stripprog=${STRIPPROG-strip} + +posix_glob='?' +initialize_posix_glob=' + test "$posix_glob" != "?" || { + if (set -f) 2>/dev/null; then + posix_glob= + else + posix_glob=: + fi + } +' + +posix_mkdir= + +# Desired mode of installed file. +mode=0755 + +chgrpcmd= +chmodcmd=$chmodprog +chowncmd= +mvcmd=$mvprog +rmcmd="$rmprog -f" +stripcmd= + +src= +dst= +dir_arg= +dst_arg= + +copy_on_change=false +no_target_directory= + +usage="\ +Usage: $0 [OPTION]... [-T] SRCFILE DSTFILE + or: $0 [OPTION]... SRCFILES... DIRECTORY + or: $0 [OPTION]... -t DIRECTORY SRCFILES... + or: $0 [OPTION]... -d DIRECTORIES... + +In the 1st form, copy SRCFILE to DSTFILE. +In the 2nd and 3rd, copy all SRCFILES to DIRECTORY. +In the 4th, create DIRECTORIES. + +Options: + --help display this help and exit. + --version display version info and exit. + + -c (ignored) + -C install only if different (preserve the last data modification time) + -d create directories instead of installing files. + -g GROUP $chgrpprog installed files to GROUP. + -m MODE $chmodprog installed files to MODE. + -o USER $chownprog installed files to USER. + -s $stripprog installed files. + -t DIRECTORY install into DIRECTORY. + -T report an error if DSTFILE is a directory. + +Environment variables override the default commands: + CHGRPPROG CHMODPROG CHOWNPROG CMPPROG CPPROG MKDIRPROG MVPROG + RMPROG STRIPPROG +" + +while test $# -ne 0; do + case $1 in + -c) ;; + + -C) copy_on_change=true;; + + -d) dir_arg=true;; + + -g) chgrpcmd="$chgrpprog $2" + shift;; + + --help) echo "$usage"; exit $?;; + + -m) mode=$2 + case $mode in + *' '* | *' '* | *' +'* | *'*'* | *'?'* | *'['*) + echo "$0: invalid mode: $mode" >&2 + exit 1;; + esac + shift;; + + -o) chowncmd="$chownprog $2" + shift;; + + -s) stripcmd=$stripprog;; + + -t) dst_arg=$2 + # Protect names problematic for `test' and other utilities. + case $dst_arg in + -* | [=\(\)!]) dst_arg=./$dst_arg;; + esac + shift;; + + -T) no_target_directory=true;; + + --version) echo "$0 $scriptversion"; exit $?;; + + --) shift + break;; + + -*) echo "$0: invalid option: $1" >&2 + exit 1;; + + *) break;; + esac + shift +done + +if test $# -ne 0 && test -z "$dir_arg$dst_arg"; then + # When -d is used, all remaining arguments are directories to create. + # When -t is used, the destination is already specified. + # Otherwise, the last argument is the destination. Remove it from $@. + for arg + do + if test -n "$dst_arg"; then + # $@ is not empty: it contains at least $arg. + set fnord "$@" "$dst_arg" + shift # fnord + fi + shift # arg + dst_arg=$arg + # Protect names problematic for `test' and other utilities. + case $dst_arg in + -* | [=\(\)!]) dst_arg=./$dst_arg;; + esac + done +fi + +if test $# -eq 0; then + if test -z "$dir_arg"; then + echo "$0: no input file specified." >&2 + exit 1 + fi + # It's OK to call `install-sh -d' without argument. + # This can happen when creating conditional directories. + exit 0 +fi + +if test -z "$dir_arg"; then + do_exit='(exit $ret); exit $ret' + trap "ret=129; $do_exit" 1 + trap "ret=130; $do_exit" 2 + trap "ret=141; $do_exit" 13 + trap "ret=143; $do_exit" 15 + + # Set umask so as not to create temps with too-generous modes. + # However, 'strip' requires both read and write access to temps. + case $mode in + # Optimize common cases. + *644) cp_umask=133;; + *755) cp_umask=22;; + + *[0-7]) + if test -z "$stripcmd"; then + u_plus_rw= + else + u_plus_rw='% 200' + fi + cp_umask=`expr '(' 777 - $mode % 1000 ')' $u_plus_rw`;; + *) + if test -z "$stripcmd"; then + u_plus_rw= + else + u_plus_rw=,u+rw + fi + cp_umask=$mode$u_plus_rw;; + esac +fi + +for src +do + # Protect names problematic for `test' and other utilities. + case $src in + -* | [=\(\)!]) src=./$src;; + esac + + if test -n "$dir_arg"; then + dst=$src + dstdir=$dst + test -d "$dstdir" + dstdir_status=$? + else + + # Waiting for this to be detected by the "$cpprog $src $dsttmp" command + # might cause directories to be created, which would be especially bad + # if $src (and thus $dsttmp) contains '*'. + if test ! -f "$src" && test ! -d "$src"; then + echo "$0: $src does not exist." >&2 + exit 1 + fi + + if test -z "$dst_arg"; then + echo "$0: no destination specified." >&2 + exit 1 + fi + dst=$dst_arg + + # If destination is a directory, append the input filename; won't work + # if double slashes aren't ignored. + if test -d "$dst"; then + if test -n "$no_target_directory"; then + echo "$0: $dst_arg: Is a directory" >&2 + exit 1 + fi + dstdir=$dst + dst=$dstdir/`basename "$src"` + dstdir_status=0 + else + # Prefer dirname, but fall back on a substitute if dirname fails. + dstdir=` + (dirname "$dst") 2>/dev/null || + expr X"$dst" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$dst" : 'X\(//\)[^/]' \| \ + X"$dst" : 'X\(//\)$' \| \ + X"$dst" : 'X\(/\)' \| . 2>/dev/null || + echo X"$dst" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q' + ` + + test -d "$dstdir" + dstdir_status=$? + fi + fi + + obsolete_mkdir_used=false + + if test $dstdir_status != 0; then + case $posix_mkdir in + '') + # Create intermediate dirs using mode 755 as modified by the umask. + # This is like FreeBSD 'install' as of 1997-10-28. + umask=`umask` + case $stripcmd.$umask in + # Optimize common cases. + *[2367][2367]) mkdir_umask=$umask;; + .*0[02][02] | .[02][02] | .[02]) mkdir_umask=22;; + + *[0-7]) + mkdir_umask=`expr $umask + 22 \ + - $umask % 100 % 40 + $umask % 20 \ + - $umask % 10 % 4 + $umask % 2 + `;; + *) mkdir_umask=$umask,go-w;; + esac + + # With -d, create the new directory with the user-specified mode. + # Otherwise, rely on $mkdir_umask. + if test -n "$dir_arg"; then + mkdir_mode=-m$mode + else + mkdir_mode= + fi + + posix_mkdir=false + case $umask in + *[123567][0-7][0-7]) + # POSIX mkdir -p sets u+wx bits regardless of umask, which + # is incompatible with FreeBSD 'install' when (umask & 300) != 0. + ;; + *) + tmpdir=${TMPDIR-/tmp}/ins$RANDOM-$$ + trap 'ret=$?; rmdir "$tmpdir/d" "$tmpdir" 2>/dev/null; exit $ret' 0 + + if (umask $mkdir_umask && + exec $mkdirprog $mkdir_mode -p -- "$tmpdir/d") >/dev/null 2>&1 + then + if test -z "$dir_arg" || { + # Check for POSIX incompatibilities with -m. + # HP-UX 11.23 and IRIX 6.5 mkdir -m -p sets group- or + # other-writeable bit of parent directory when it shouldn't. + # FreeBSD 6.1 mkdir -m -p sets mode of existing directory. + ls_ld_tmpdir=`ls -ld "$tmpdir"` + case $ls_ld_tmpdir in + d????-?r-*) different_mode=700;; + d????-?--*) different_mode=755;; + *) false;; + esac && + $mkdirprog -m$different_mode -p -- "$tmpdir" && { + ls_ld_tmpdir_1=`ls -ld "$tmpdir"` + test "$ls_ld_tmpdir" = "$ls_ld_tmpdir_1" + } + } + then posix_mkdir=: + fi + rmdir "$tmpdir/d" "$tmpdir" + else + # Remove any dirs left behind by ancient mkdir implementations. + rmdir ./$mkdir_mode ./-p ./-- 2>/dev/null + fi + trap '' 0;; + esac;; + esac + + if + $posix_mkdir && ( + umask $mkdir_umask && + $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir" + ) + then : + else + + # The umask is ridiculous, or mkdir does not conform to POSIX, + # or it failed possibly due to a race condition. Create the + # directory the slow way, step by step, checking for races as we go. + + case $dstdir in + /*) prefix='/';; + [-=\(\)!]*) prefix='./';; + *) prefix='';; + esac + + eval "$initialize_posix_glob" + + oIFS=$IFS + IFS=/ + $posix_glob set -f + set fnord $dstdir + shift + $posix_glob set +f + IFS=$oIFS + + prefixes= + + for d + do + test X"$d" = X && continue + + prefix=$prefix$d + if test -d "$prefix"; then + prefixes= + else + if $posix_mkdir; then + (umask=$mkdir_umask && + $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir") && break + # Don't fail if two instances are running concurrently. + test -d "$prefix" || exit 1 + else + case $prefix in + *\'*) qprefix=`echo "$prefix" | sed "s/'/'\\\\\\\\''/g"`;; + *) qprefix=$prefix;; + esac + prefixes="$prefixes '$qprefix'" + fi + fi + prefix=$prefix/ + done + + if test -n "$prefixes"; then + # Don't fail if two instances are running concurrently. + (umask $mkdir_umask && + eval "\$doit_exec \$mkdirprog $prefixes") || + test -d "$dstdir" || exit 1 + obsolete_mkdir_used=true + fi + fi + fi + + if test -n "$dir_arg"; then + { test -z "$chowncmd" || $doit $chowncmd "$dst"; } && + { test -z "$chgrpcmd" || $doit $chgrpcmd "$dst"; } && + { test "$obsolete_mkdir_used$chowncmd$chgrpcmd" = false || + test -z "$chmodcmd" || $doit $chmodcmd $mode "$dst"; } || exit 1 + else + + # Make a couple of temp file names in the proper directory. + dsttmp=$dstdir/_inst.$$_ + rmtmp=$dstdir/_rm.$$_ + + # Trap to clean up those temp files at exit. + trap 'ret=$?; rm -f "$dsttmp" "$rmtmp" && exit $ret' 0 + + # Copy the file name to the temp name. + (umask $cp_umask && $doit_exec $cpprog "$src" "$dsttmp") && + + # and set any options; do chmod last to preserve setuid bits. + # + # If any of these fail, we abort the whole thing. If we want to + # ignore errors from any of these, just make sure not to ignore + # errors from the above "$doit $cpprog $src $dsttmp" command. + # + { test -z "$chowncmd" || $doit $chowncmd "$dsttmp"; } && + { test -z "$chgrpcmd" || $doit $chgrpcmd "$dsttmp"; } && + { test -z "$stripcmd" || $doit $stripcmd "$dsttmp"; } && + { test -z "$chmodcmd" || $doit $chmodcmd $mode "$dsttmp"; } && + + # If -C, don't bother to copy if it wouldn't change the file. + if $copy_on_change && + old=`LC_ALL=C ls -dlL "$dst" 2>/dev/null` && + new=`LC_ALL=C ls -dlL "$dsttmp" 2>/dev/null` && + + eval "$initialize_posix_glob" && + $posix_glob set -f && + set X $old && old=:$2:$4:$5:$6 && + set X $new && new=:$2:$4:$5:$6 && + $posix_glob set +f && + + test "$old" = "$new" && + $cmpprog "$dst" "$dsttmp" >/dev/null 2>&1 + then + rm -f "$dsttmp" + else + # Rename the file to the real destination. + $doit $mvcmd -f "$dsttmp" "$dst" 2>/dev/null || + + # The rename failed, perhaps because mv can't rename something else + # to itself, or perhaps because mv is so ancient that it does not + # support -f. + { + # Now remove or move aside any old file at destination location. + # We try this two ways since rm can't unlink itself on some + # systems and the destination file might be busy for other + # reasons. In this case, the final cleanup might fail but the new + # file should still install successfully. + { + test ! -f "$dst" || + $doit $rmcmd -f "$dst" 2>/dev/null || + { $doit $mvcmd -f "$dst" "$rmtmp" 2>/dev/null && + { $doit $rmcmd -f "$rmtmp" 2>/dev/null; :; } + } || + { echo "$0: cannot unlink or rename $dst" >&2 + (exit 1); exit 1 + } + } && + + # Now rename the file to the real destination. + $doit $mvcmd "$dsttmp" "$dst" + } + fi || exit 1 + + trap '' 0 + fi +done + +# Local variables: +# eval: (add-hook 'write-file-hooks 'time-stamp) +# time-stamp-start: "scriptversion=" +# time-stamp-format: "%:y-%02m-%02d.%02H" +# time-stamp-time-zone: "UTC" +# time-stamp-end: "; # UTC" +# End: diff --git a/pkg/registry/zookeeper-3.4.6/src/c/ltmain.sh b/pkg/registry/zookeeper-3.4.6/src/c/ltmain.sh new file mode 100755 index 000000000..0096fe6c7 --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/c/ltmain.sh @@ -0,0 +1,9661 @@ + +# libtool (GNU libtool) 2.4.2 +# Written by Gordon Matzigkeit , 1996 + +# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005, 2006, +# 2007, 2008, 2009, 2010, 2011 Free Software Foundation, Inc. +# This is free software; see the source for copying conditions. There is NO +# warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + +# GNU Libtool is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# As a special exception to the GNU General Public License, +# if you distribute this file as part of a program or library that +# is built using GNU Libtool, you may include this file under the +# same distribution terms that you use for the rest of that program. +# +# GNU Libtool is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with GNU Libtool; see the file COPYING. If not, a copy +# can be downloaded from http://www.gnu.org/licenses/gpl.html, +# or obtained by writing to the Free Software Foundation, Inc., +# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +# Usage: $progname [OPTION]... [MODE-ARG]... +# +# Provide generalized library-building support services. +# +# --config show all configuration variables +# --debug enable verbose shell tracing +# -n, --dry-run display commands without modifying any files +# --features display basic configuration information and exit +# --mode=MODE use operation mode MODE +# --preserve-dup-deps don't remove duplicate dependency libraries +# --quiet, --silent don't print informational messages +# --no-quiet, --no-silent +# print informational messages (default) +# --no-warn don't display warning messages +# --tag=TAG use configuration variables from tag TAG +# -v, --verbose print more informational messages than default +# --no-verbose don't print the extra informational messages +# --version print version information +# -h, --help, --help-all print short, long, or detailed help message +# +# MODE must be one of the following: +# +# clean remove files from the build directory +# compile compile a source file into a libtool object +# execute automatically set library path, then run a program +# finish complete the installation of libtool libraries +# install install libraries or executables +# link create a library or an executable +# uninstall remove libraries from an installed directory +# +# MODE-ARGS vary depending on the MODE. When passed as first option, +# `--mode=MODE' may be abbreviated as `MODE' or a unique abbreviation of that. +# Try `$progname --help --mode=MODE' for a more detailed description of MODE. +# +# When reporting a bug, please describe a test case to reproduce it and +# include the following information: +# +# host-triplet: $host +# shell: $SHELL +# compiler: $LTCC +# compiler flags: $LTCFLAGS +# linker: $LD (gnu? $with_gnu_ld) +# $progname: (GNU libtool) 2.4.2 Debian-2.4.2-1ubuntu2 +# automake: $automake_version +# autoconf: $autoconf_version +# +# Report bugs to . +# GNU libtool home page: . +# General help using GNU software: . + +PROGRAM=libtool +PACKAGE=libtool +VERSION="2.4.2 Debian-2.4.2-1ubuntu2" +TIMESTAMP="" +package_revision=1.3337 + +# Be Bourne compatible +if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then + emulate sh + NULLCMD=: + # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which + # is contrary to our usage. Disable this feature. + alias -g '${1+"$@"}'='"$@"' + setopt NO_GLOB_SUBST +else + case `(set -o) 2>/dev/null` in *posix*) set -o posix;; esac +fi +BIN_SH=xpg4; export BIN_SH # for Tru64 +DUALCASE=1; export DUALCASE # for MKS sh + +# A function that is used when there is no print builtin or printf. +func_fallback_echo () +{ + eval 'cat <<_LTECHO_EOF +$1 +_LTECHO_EOF' +} + +# NLS nuisances: We save the old values to restore during execute mode. +lt_user_locale= +lt_safe_locale= +for lt_var in LANG LANGUAGE LC_ALL LC_CTYPE LC_COLLATE LC_MESSAGES +do + eval "if test \"\${$lt_var+set}\" = set; then + save_$lt_var=\$$lt_var + $lt_var=C + export $lt_var + lt_user_locale=\"$lt_var=\\\$save_\$lt_var; \$lt_user_locale\" + lt_safe_locale=\"$lt_var=C; \$lt_safe_locale\" + fi" +done +LC_ALL=C +LANGUAGE=C +export LANGUAGE LC_ALL + +$lt_unset CDPATH + + +# Work around backward compatibility issue on IRIX 6.5. On IRIX 6.4+, sh +# is ksh but when the shell is invoked as "sh" and the current value of +# the _XPG environment variable is not equal to 1 (one), the special +# positional parameter $0, within a function call, is the name of the +# function. +progpath="$0" + + + +: ${CP="cp -f"} +test "${ECHO+set}" = set || ECHO=${as_echo-'printf %s\n'} +: ${MAKE="make"} +: ${MKDIR="mkdir"} +: ${MV="mv -f"} +: ${RM="rm -f"} +: ${SHELL="${CONFIG_SHELL-/bin/sh}"} +: ${Xsed="$SED -e 1s/^X//"} + +# Global variables: +EXIT_SUCCESS=0 +EXIT_FAILURE=1 +EXIT_MISMATCH=63 # $? = 63 is used to indicate version mismatch to missing. +EXIT_SKIP=77 # $? = 77 is used to indicate a skipped test to automake. + +exit_status=$EXIT_SUCCESS + +# Make sure IFS has a sensible default +lt_nl=' +' +IFS=" $lt_nl" + +dirname="s,/[^/]*$,," +basename="s,^.*/,," + +# func_dirname file append nondir_replacement +# Compute the dirname of FILE. If nonempty, add APPEND to the result, +# otherwise set result to NONDIR_REPLACEMENT. +func_dirname () +{ + func_dirname_result=`$ECHO "${1}" | $SED "$dirname"` + if test "X$func_dirname_result" = "X${1}"; then + func_dirname_result="${3}" + else + func_dirname_result="$func_dirname_result${2}" + fi +} # func_dirname may be replaced by extended shell implementation + + +# func_basename file +func_basename () +{ + func_basename_result=`$ECHO "${1}" | $SED "$basename"` +} # func_basename may be replaced by extended shell implementation + + +# func_dirname_and_basename file append nondir_replacement +# perform func_basename and func_dirname in a single function +# call: +# dirname: Compute the dirname of FILE. If nonempty, +# add APPEND to the result, otherwise set result +# to NONDIR_REPLACEMENT. +# value returned in "$func_dirname_result" +# basename: Compute filename of FILE. +# value retuned in "$func_basename_result" +# Implementation must be kept synchronized with func_dirname +# and func_basename. For efficiency, we do not delegate to +# those functions but instead duplicate the functionality here. +func_dirname_and_basename () +{ + # Extract subdirectory from the argument. + func_dirname_result=`$ECHO "${1}" | $SED -e "$dirname"` + if test "X$func_dirname_result" = "X${1}"; then + func_dirname_result="${3}" + else + func_dirname_result="$func_dirname_result${2}" + fi + func_basename_result=`$ECHO "${1}" | $SED -e "$basename"` +} # func_dirname_and_basename may be replaced by extended shell implementation + + +# func_stripname prefix suffix name +# strip PREFIX and SUFFIX off of NAME. +# PREFIX and SUFFIX must not contain globbing or regex special +# characters, hashes, percent signs, but SUFFIX may contain a leading +# dot (in which case that matches only a dot). +# func_strip_suffix prefix name +func_stripname () +{ + case ${2} in + .*) func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%\\\\${2}\$%%"`;; + *) func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%${2}\$%%"`;; + esac +} # func_stripname may be replaced by extended shell implementation + + +# These SED scripts presuppose an absolute path with a trailing slash. +pathcar='s,^/\([^/]*\).*$,\1,' +pathcdr='s,^/[^/]*,,' +removedotparts=':dotsl + s@/\./@/@g + t dotsl + s,/\.$,/,' +collapseslashes='s@/\{1,\}@/@g' +finalslash='s,/*$,/,' + +# func_normal_abspath PATH +# Remove doubled-up and trailing slashes, "." path components, +# and cancel out any ".." path components in PATH after making +# it an absolute path. +# value returned in "$func_normal_abspath_result" +func_normal_abspath () +{ + # Start from root dir and reassemble the path. + func_normal_abspath_result= + func_normal_abspath_tpath=$1 + func_normal_abspath_altnamespace= + case $func_normal_abspath_tpath in + "") + # Empty path, that just means $cwd. + func_stripname '' '/' "`pwd`" + func_normal_abspath_result=$func_stripname_result + return + ;; + # The next three entries are used to spot a run of precisely + # two leading slashes without using negated character classes; + # we take advantage of case's first-match behaviour. + ///*) + # Unusual form of absolute path, do nothing. + ;; + //*) + # Not necessarily an ordinary path; POSIX reserves leading '//' + # and for example Cygwin uses it to access remote file shares + # over CIFS/SMB, so we conserve a leading double slash if found. + func_normal_abspath_altnamespace=/ + ;; + /*) + # Absolute path, do nothing. + ;; + *) + # Relative path, prepend $cwd. + func_normal_abspath_tpath=`pwd`/$func_normal_abspath_tpath + ;; + esac + # Cancel out all the simple stuff to save iterations. We also want + # the path to end with a slash for ease of parsing, so make sure + # there is one (and only one) here. + func_normal_abspath_tpath=`$ECHO "$func_normal_abspath_tpath" | $SED \ + -e "$removedotparts" -e "$collapseslashes" -e "$finalslash"` + while :; do + # Processed it all yet? + if test "$func_normal_abspath_tpath" = / ; then + # If we ascended to the root using ".." the result may be empty now. + if test -z "$func_normal_abspath_result" ; then + func_normal_abspath_result=/ + fi + break + fi + func_normal_abspath_tcomponent=`$ECHO "$func_normal_abspath_tpath" | $SED \ + -e "$pathcar"` + func_normal_abspath_tpath=`$ECHO "$func_normal_abspath_tpath" | $SED \ + -e "$pathcdr"` + # Figure out what to do with it + case $func_normal_abspath_tcomponent in + "") + # Trailing empty path component, ignore it. + ;; + ..) + # Parent dir; strip last assembled component from result. + func_dirname "$func_normal_abspath_result" + func_normal_abspath_result=$func_dirname_result + ;; + *) + # Actual path component, append it. + func_normal_abspath_result=$func_normal_abspath_result/$func_normal_abspath_tcomponent + ;; + esac + done + # Restore leading double-slash if one was found on entry. + func_normal_abspath_result=$func_normal_abspath_altnamespace$func_normal_abspath_result +} + +# func_relative_path SRCDIR DSTDIR +# generates a relative path from SRCDIR to DSTDIR, with a trailing +# slash if non-empty, suitable for immediately appending a filename +# without needing to append a separator. +# value returned in "$func_relative_path_result" +func_relative_path () +{ + func_relative_path_result= + func_normal_abspath "$1" + func_relative_path_tlibdir=$func_normal_abspath_result + func_normal_abspath "$2" + func_relative_path_tbindir=$func_normal_abspath_result + + # Ascend the tree starting from libdir + while :; do + # check if we have found a prefix of bindir + case $func_relative_path_tbindir in + $func_relative_path_tlibdir) + # found an exact match + func_relative_path_tcancelled= + break + ;; + $func_relative_path_tlibdir*) + # found a matching prefix + func_stripname "$func_relative_path_tlibdir" '' "$func_relative_path_tbindir" + func_relative_path_tcancelled=$func_stripname_result + if test -z "$func_relative_path_result"; then + func_relative_path_result=. + fi + break + ;; + *) + func_dirname $func_relative_path_tlibdir + func_relative_path_tlibdir=${func_dirname_result} + if test "x$func_relative_path_tlibdir" = x ; then + # Have to descend all the way to the root! + func_relative_path_result=../$func_relative_path_result + func_relative_path_tcancelled=$func_relative_path_tbindir + break + fi + func_relative_path_result=../$func_relative_path_result + ;; + esac + done + + # Now calculate path; take care to avoid doubling-up slashes. + func_stripname '' '/' "$func_relative_path_result" + func_relative_path_result=$func_stripname_result + func_stripname '/' '/' "$func_relative_path_tcancelled" + if test "x$func_stripname_result" != x ; then + func_relative_path_result=${func_relative_path_result}/${func_stripname_result} + fi + + # Normalisation. If bindir is libdir, return empty string, + # else relative path ending with a slash; either way, target + # file name can be directly appended. + if test ! -z "$func_relative_path_result"; then + func_stripname './' '' "$func_relative_path_result/" + func_relative_path_result=$func_stripname_result + fi +} + +# The name of this program: +func_dirname_and_basename "$progpath" +progname=$func_basename_result + +# Make sure we have an absolute path for reexecution: +case $progpath in + [\\/]*|[A-Za-z]:\\*) ;; + *[\\/]*) + progdir=$func_dirname_result + progdir=`cd "$progdir" && pwd` + progpath="$progdir/$progname" + ;; + *) + save_IFS="$IFS" + IFS=${PATH_SEPARATOR-:} + for progdir in $PATH; do + IFS="$save_IFS" + test -x "$progdir/$progname" && break + done + IFS="$save_IFS" + test -n "$progdir" || progdir=`pwd` + progpath="$progdir/$progname" + ;; +esac + +# Sed substitution that helps us do robust quoting. It backslashifies +# metacharacters that are still active within double-quoted strings. +Xsed="${SED}"' -e 1s/^X//' +sed_quote_subst='s/\([`"$\\]\)/\\\1/g' + +# Same as above, but do not quote variable references. +double_quote_subst='s/\(["`\\]\)/\\\1/g' + +# Sed substitution that turns a string into a regex matching for the +# string literally. +sed_make_literal_regex='s,[].[^$\\*\/],\\&,g' + +# Sed substitution that converts a w32 file name or path +# which contains forward slashes, into one that contains +# (escaped) backslashes. A very naive implementation. +lt_sed_naive_backslashify='s|\\\\*|\\|g;s|/|\\|g;s|\\|\\\\|g' + +# Re-`\' parameter expansions in output of double_quote_subst that were +# `\'-ed in input to the same. If an odd number of `\' preceded a '$' +# in input to double_quote_subst, that '$' was protected from expansion. +# Since each input `\' is now two `\'s, look for any number of runs of +# four `\'s followed by two `\'s and then a '$'. `\' that '$'. +bs='\\' +bs2='\\\\' +bs4='\\\\\\\\' +dollar='\$' +sed_double_backslash="\ + s/$bs4/&\\ +/g + s/^$bs2$dollar/$bs&/ + s/\\([^$bs]\\)$bs2$dollar/\\1$bs2$bs$dollar/g + s/\n//g" + +# Standard options: +opt_dry_run=false +opt_help=false +opt_quiet=false +opt_verbose=false +opt_warning=: + +# func_echo arg... +# Echo program name prefixed message, along with the current mode +# name if it has been set yet. +func_echo () +{ + $ECHO "$progname: ${opt_mode+$opt_mode: }$*" +} + +# func_verbose arg... +# Echo program name prefixed message in verbose mode only. +func_verbose () +{ + $opt_verbose && func_echo ${1+"$@"} + + # A bug in bash halts the script if the last line of a function + # fails when set -e is in force, so we need another command to + # work around that: + : +} + +# func_echo_all arg... +# Invoke $ECHO with all args, space-separated. +func_echo_all () +{ + $ECHO "$*" +} + +# func_error arg... +# Echo program name prefixed message to standard error. +func_error () +{ + $ECHO "$progname: ${opt_mode+$opt_mode: }"${1+"$@"} 1>&2 +} + +# func_warning arg... +# Echo program name prefixed warning message to standard error. +func_warning () +{ + $opt_warning && $ECHO "$progname: ${opt_mode+$opt_mode: }warning: "${1+"$@"} 1>&2 + + # bash bug again: + : +} + +# func_fatal_error arg... +# Echo program name prefixed message to standard error, and exit. +func_fatal_error () +{ + func_error ${1+"$@"} + exit $EXIT_FAILURE +} + +# func_fatal_help arg... +# Echo program name prefixed message to standard error, followed by +# a help hint, and exit. +func_fatal_help () +{ + func_error ${1+"$@"} + func_fatal_error "$help" +} +help="Try \`$progname --help' for more information." ## default + + +# func_grep expression filename +# Check whether EXPRESSION matches any line of FILENAME, without output. +func_grep () +{ + $GREP "$1" "$2" >/dev/null 2>&1 +} + + +# func_mkdir_p directory-path +# Make sure the entire path to DIRECTORY-PATH is available. +func_mkdir_p () +{ + my_directory_path="$1" + my_dir_list= + + if test -n "$my_directory_path" && test "$opt_dry_run" != ":"; then + + # Protect directory names starting with `-' + case $my_directory_path in + -*) my_directory_path="./$my_directory_path" ;; + esac + + # While some portion of DIR does not yet exist... + while test ! -d "$my_directory_path"; do + # ...make a list in topmost first order. Use a colon delimited + # list incase some portion of path contains whitespace. + my_dir_list="$my_directory_path:$my_dir_list" + + # If the last portion added has no slash in it, the list is done + case $my_directory_path in */*) ;; *) break ;; esac + + # ...otherwise throw away the child directory and loop + my_directory_path=`$ECHO "$my_directory_path" | $SED -e "$dirname"` + done + my_dir_list=`$ECHO "$my_dir_list" | $SED 's,:*$,,'` + + save_mkdir_p_IFS="$IFS"; IFS=':' + for my_dir in $my_dir_list; do + IFS="$save_mkdir_p_IFS" + # mkdir can fail with a `File exist' error if two processes + # try to create one of the directories concurrently. Don't + # stop in that case! + $MKDIR "$my_dir" 2>/dev/null || : + done + IFS="$save_mkdir_p_IFS" + + # Bail out if we (or some other process) failed to create a directory. + test -d "$my_directory_path" || \ + func_fatal_error "Failed to create \`$1'" + fi +} + + +# func_mktempdir [string] +# Make a temporary directory that won't clash with other running +# libtool processes, and avoids race conditions if possible. If +# given, STRING is the basename for that directory. +func_mktempdir () +{ + my_template="${TMPDIR-/tmp}/${1-$progname}" + + if test "$opt_dry_run" = ":"; then + # Return a directory name, but don't create it in dry-run mode + my_tmpdir="${my_template}-$$" + else + + # If mktemp works, use that first and foremost + my_tmpdir=`mktemp -d "${my_template}-XXXXXXXX" 2>/dev/null` + + if test ! -d "$my_tmpdir"; then + # Failing that, at least try and use $RANDOM to avoid a race + my_tmpdir="${my_template}-${RANDOM-0}$$" + + save_mktempdir_umask=`umask` + umask 0077 + $MKDIR "$my_tmpdir" + umask $save_mktempdir_umask + fi + + # If we're not in dry-run mode, bomb out on failure + test -d "$my_tmpdir" || \ + func_fatal_error "cannot create temporary directory \`$my_tmpdir'" + fi + + $ECHO "$my_tmpdir" +} + + +# func_quote_for_eval arg +# Aesthetically quote ARG to be evaled later. +# This function returns two values: FUNC_QUOTE_FOR_EVAL_RESULT +# is double-quoted, suitable for a subsequent eval, whereas +# FUNC_QUOTE_FOR_EVAL_UNQUOTED_RESULT has merely all characters +# which are still active within double quotes backslashified. +func_quote_for_eval () +{ + case $1 in + *[\\\`\"\$]*) + func_quote_for_eval_unquoted_result=`$ECHO "$1" | $SED "$sed_quote_subst"` ;; + *) + func_quote_for_eval_unquoted_result="$1" ;; + esac + + case $func_quote_for_eval_unquoted_result in + # Double-quote args containing shell metacharacters to delay + # word splitting, command substitution and and variable + # expansion for a subsequent eval. + # Many Bourne shells cannot handle close brackets correctly + # in scan sets, so we specify it separately. + *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") + func_quote_for_eval_result="\"$func_quote_for_eval_unquoted_result\"" + ;; + *) + func_quote_for_eval_result="$func_quote_for_eval_unquoted_result" + esac +} + + +# func_quote_for_expand arg +# Aesthetically quote ARG to be evaled later; same as above, +# but do not quote variable references. +func_quote_for_expand () +{ + case $1 in + *[\\\`\"]*) + my_arg=`$ECHO "$1" | $SED \ + -e "$double_quote_subst" -e "$sed_double_backslash"` ;; + *) + my_arg="$1" ;; + esac + + case $my_arg in + # Double-quote args containing shell metacharacters to delay + # word splitting and command substitution for a subsequent eval. + # Many Bourne shells cannot handle close brackets correctly + # in scan sets, so we specify it separately. + *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") + my_arg="\"$my_arg\"" + ;; + esac + + func_quote_for_expand_result="$my_arg" +} + + +# func_show_eval cmd [fail_exp] +# Unless opt_silent is true, then output CMD. Then, if opt_dryrun is +# not true, evaluate CMD. If the evaluation of CMD fails, and FAIL_EXP +# is given, then evaluate it. +func_show_eval () +{ + my_cmd="$1" + my_fail_exp="${2-:}" + + ${opt_silent-false} || { + func_quote_for_expand "$my_cmd" + eval "func_echo $func_quote_for_expand_result" + } + + if ${opt_dry_run-false}; then :; else + eval "$my_cmd" + my_status=$? + if test "$my_status" -eq 0; then :; else + eval "(exit $my_status); $my_fail_exp" + fi + fi +} + + +# func_show_eval_locale cmd [fail_exp] +# Unless opt_silent is true, then output CMD. Then, if opt_dryrun is +# not true, evaluate CMD. If the evaluation of CMD fails, and FAIL_EXP +# is given, then evaluate it. Use the saved locale for evaluation. +func_show_eval_locale () +{ + my_cmd="$1" + my_fail_exp="${2-:}" + + ${opt_silent-false} || { + func_quote_for_expand "$my_cmd" + eval "func_echo $func_quote_for_expand_result" + } + + if ${opt_dry_run-false}; then :; else + eval "$lt_user_locale + $my_cmd" + my_status=$? + eval "$lt_safe_locale" + if test "$my_status" -eq 0; then :; else + eval "(exit $my_status); $my_fail_exp" + fi + fi +} + +# func_tr_sh +# Turn $1 into a string suitable for a shell variable name. +# Result is stored in $func_tr_sh_result. All characters +# not in the set a-zA-Z0-9_ are replaced with '_'. Further, +# if $1 begins with a digit, a '_' is prepended as well. +func_tr_sh () +{ + case $1 in + [0-9]* | *[!a-zA-Z0-9_]*) + func_tr_sh_result=`$ECHO "$1" | $SED 's/^\([0-9]\)/_\1/; s/[^a-zA-Z0-9_]/_/g'` + ;; + * ) + func_tr_sh_result=$1 + ;; + esac +} + + +# func_version +# Echo version message to standard output and exit. +func_version () +{ + $opt_debug + + $SED -n '/(C)/!b go + :more + /\./!{ + N + s/\n# / / + b more + } + :go + /^# '$PROGRAM' (GNU /,/# warranty; / { + s/^# // + s/^# *$// + s/\((C)\)[ 0-9,-]*\( [1-9][0-9]*\)/\1\2/ + p + }' < "$progpath" + exit $? +} + +# func_usage +# Echo short help message to standard output and exit. +func_usage () +{ + $opt_debug + + $SED -n '/^# Usage:/,/^# *.*--help/ { + s/^# // + s/^# *$// + s/\$progname/'$progname'/ + p + }' < "$progpath" + echo + $ECHO "run \`$progname --help | more' for full usage" + exit $? +} + +# func_help [NOEXIT] +# Echo long help message to standard output and exit, +# unless 'noexit' is passed as argument. +func_help () +{ + $opt_debug + + $SED -n '/^# Usage:/,/# Report bugs to/ { + :print + s/^# // + s/^# *$// + s*\$progname*'$progname'* + s*\$host*'"$host"'* + s*\$SHELL*'"$SHELL"'* + s*\$LTCC*'"$LTCC"'* + s*\$LTCFLAGS*'"$LTCFLAGS"'* + s*\$LD*'"$LD"'* + s/\$with_gnu_ld/'"$with_gnu_ld"'/ + s/\$automake_version/'"`(${AUTOMAKE-automake} --version) 2>/dev/null |$SED 1q`"'/ + s/\$autoconf_version/'"`(${AUTOCONF-autoconf} --version) 2>/dev/null |$SED 1q`"'/ + p + d + } + /^# .* home page:/b print + /^# General help using/b print + ' < "$progpath" + ret=$? + if test -z "$1"; then + exit $ret + fi +} + +# func_missing_arg argname +# Echo program name prefixed message to standard error and set global +# exit_cmd. +func_missing_arg () +{ + $opt_debug + + func_error "missing argument for $1." + exit_cmd=exit +} + + +# func_split_short_opt shortopt +# Set func_split_short_opt_name and func_split_short_opt_arg shell +# variables after splitting SHORTOPT after the 2nd character. +func_split_short_opt () +{ + my_sed_short_opt='1s/^\(..\).*$/\1/;q' + my_sed_short_rest='1s/^..\(.*\)$/\1/;q' + + func_split_short_opt_name=`$ECHO "$1" | $SED "$my_sed_short_opt"` + func_split_short_opt_arg=`$ECHO "$1" | $SED "$my_sed_short_rest"` +} # func_split_short_opt may be replaced by extended shell implementation + + +# func_split_long_opt longopt +# Set func_split_long_opt_name and func_split_long_opt_arg shell +# variables after splitting LONGOPT at the `=' sign. +func_split_long_opt () +{ + my_sed_long_opt='1s/^\(--[^=]*\)=.*/\1/;q' + my_sed_long_arg='1s/^--[^=]*=//' + + func_split_long_opt_name=`$ECHO "$1" | $SED "$my_sed_long_opt"` + func_split_long_opt_arg=`$ECHO "$1" | $SED "$my_sed_long_arg"` +} # func_split_long_opt may be replaced by extended shell implementation + +exit_cmd=: + + + + + +magic="%%%MAGIC variable%%%" +magic_exe="%%%MAGIC EXE variable%%%" + +# Global variables. +nonopt= +preserve_args= +lo2o="s/\\.lo\$/.${objext}/" +o2lo="s/\\.${objext}\$/.lo/" +extracted_archives= +extracted_serial=0 + +# If this variable is set in any of the actions, the command in it +# will be execed at the end. This prevents here-documents from being +# left over by shells. +exec_cmd= + +# func_append var value +# Append VALUE to the end of shell variable VAR. +func_append () +{ + eval "${1}=\$${1}\${2}" +} # func_append may be replaced by extended shell implementation + +# func_append_quoted var value +# Quote VALUE and append to the end of shell variable VAR, separated +# by a space. +func_append_quoted () +{ + func_quote_for_eval "${2}" + eval "${1}=\$${1}\\ \$func_quote_for_eval_result" +} # func_append_quoted may be replaced by extended shell implementation + + +# func_arith arithmetic-term... +func_arith () +{ + func_arith_result=`expr "${@}"` +} # func_arith may be replaced by extended shell implementation + + +# func_len string +# STRING may not start with a hyphen. +func_len () +{ + func_len_result=`expr "${1}" : ".*" 2>/dev/null || echo $max_cmd_len` +} # func_len may be replaced by extended shell implementation + + +# func_lo2o object +func_lo2o () +{ + func_lo2o_result=`$ECHO "${1}" | $SED "$lo2o"` +} # func_lo2o may be replaced by extended shell implementation + + +# func_xform libobj-or-source +func_xform () +{ + func_xform_result=`$ECHO "${1}" | $SED 's/\.[^.]*$/.lo/'` +} # func_xform may be replaced by extended shell implementation + + +# func_fatal_configuration arg... +# Echo program name prefixed message to standard error, followed by +# a configuration failure hint, and exit. +func_fatal_configuration () +{ + func_error ${1+"$@"} + func_error "See the $PACKAGE documentation for more information." + func_fatal_error "Fatal configuration error." +} + + +# func_config +# Display the configuration for all the tags in this script. +func_config () +{ + re_begincf='^# ### BEGIN LIBTOOL' + re_endcf='^# ### END LIBTOOL' + + # Default configuration. + $SED "1,/$re_begincf CONFIG/d;/$re_endcf CONFIG/,\$d" < "$progpath" + + # Now print the configurations for the tags. + for tagname in $taglist; do + $SED -n "/$re_begincf TAG CONFIG: $tagname\$/,/$re_endcf TAG CONFIG: $tagname\$/p" < "$progpath" + done + + exit $? +} + +# func_features +# Display the features supported by this script. +func_features () +{ + echo "host: $host" + if test "$build_libtool_libs" = yes; then + echo "enable shared libraries" + else + echo "disable shared libraries" + fi + if test "$build_old_libs" = yes; then + echo "enable static libraries" + else + echo "disable static libraries" + fi + + exit $? +} + +# func_enable_tag tagname +# Verify that TAGNAME is valid, and either flag an error and exit, or +# enable the TAGNAME tag. We also add TAGNAME to the global $taglist +# variable here. +func_enable_tag () +{ + # Global variable: + tagname="$1" + + re_begincf="^# ### BEGIN LIBTOOL TAG CONFIG: $tagname\$" + re_endcf="^# ### END LIBTOOL TAG CONFIG: $tagname\$" + sed_extractcf="/$re_begincf/,/$re_endcf/p" + + # Validate tagname. + case $tagname in + *[!-_A-Za-z0-9,/]*) + func_fatal_error "invalid tag name: $tagname" + ;; + esac + + # Don't test for the "default" C tag, as we know it's + # there but not specially marked. + case $tagname in + CC) ;; + *) + if $GREP "$re_begincf" "$progpath" >/dev/null 2>&1; then + taglist="$taglist $tagname" + + # Evaluate the configuration. Be careful to quote the path + # and the sed script, to avoid splitting on whitespace, but + # also don't use non-portable quotes within backquotes within + # quotes we have to do it in 2 steps: + extractedcf=`$SED -n -e "$sed_extractcf" < "$progpath"` + eval "$extractedcf" + else + func_error "ignoring unknown tag $tagname" + fi + ;; + esac +} + +# func_check_version_match +# Ensure that we are using m4 macros, and libtool script from the same +# release of libtool. +func_check_version_match () +{ + if test "$package_revision" != "$macro_revision"; then + if test "$VERSION" != "$macro_version"; then + if test -z "$macro_version"; then + cat >&2 <<_LT_EOF +$progname: Version mismatch error. This is $PACKAGE $VERSION, but the +$progname: definition of this LT_INIT comes from an older release. +$progname: You should recreate aclocal.m4 with macros from $PACKAGE $VERSION +$progname: and run autoconf again. +_LT_EOF + else + cat >&2 <<_LT_EOF +$progname: Version mismatch error. This is $PACKAGE $VERSION, but the +$progname: definition of this LT_INIT comes from $PACKAGE $macro_version. +$progname: You should recreate aclocal.m4 with macros from $PACKAGE $VERSION +$progname: and run autoconf again. +_LT_EOF + fi + else + cat >&2 <<_LT_EOF +$progname: Version mismatch error. This is $PACKAGE $VERSION, revision $package_revision, +$progname: but the definition of this LT_INIT comes from revision $macro_revision. +$progname: You should recreate aclocal.m4 with macros from revision $package_revision +$progname: of $PACKAGE $VERSION and run autoconf again. +_LT_EOF + fi + + exit $EXIT_MISMATCH + fi +} + + +# Shorthand for --mode=foo, only valid as the first argument +case $1 in +clean|clea|cle|cl) + shift; set dummy --mode clean ${1+"$@"}; shift + ;; +compile|compil|compi|comp|com|co|c) + shift; set dummy --mode compile ${1+"$@"}; shift + ;; +execute|execut|execu|exec|exe|ex|e) + shift; set dummy --mode execute ${1+"$@"}; shift + ;; +finish|finis|fini|fin|fi|f) + shift; set dummy --mode finish ${1+"$@"}; shift + ;; +install|instal|insta|inst|ins|in|i) + shift; set dummy --mode install ${1+"$@"}; shift + ;; +link|lin|li|l) + shift; set dummy --mode link ${1+"$@"}; shift + ;; +uninstall|uninstal|uninsta|uninst|unins|unin|uni|un|u) + shift; set dummy --mode uninstall ${1+"$@"}; shift + ;; +esac + + + +# Option defaults: +opt_debug=: +opt_dry_run=false +opt_config=false +opt_preserve_dup_deps=false +opt_features=false +opt_finish=false +opt_help=false +opt_help_all=false +opt_silent=: +opt_warning=: +opt_verbose=: +opt_silent=false +opt_verbose=false + + +# Parse options once, thoroughly. This comes as soon as possible in the +# script to make things like `--version' happen as quickly as we can. +{ + # this just eases exit handling + while test $# -gt 0; do + opt="$1" + shift + case $opt in + --debug|-x) opt_debug='set -x' + func_echo "enabling shell trace mode" + $opt_debug + ;; + --dry-run|--dryrun|-n) + opt_dry_run=: + ;; + --config) + opt_config=: +func_config + ;; + --dlopen|-dlopen) + optarg="$1" + opt_dlopen="${opt_dlopen+$opt_dlopen +}$optarg" + shift + ;; + --preserve-dup-deps) + opt_preserve_dup_deps=: + ;; + --features) + opt_features=: +func_features + ;; + --finish) + opt_finish=: +set dummy --mode finish ${1+"$@"}; shift + ;; + --help) + opt_help=: + ;; + --help-all) + opt_help_all=: +opt_help=': help-all' + ;; + --mode) + test $# = 0 && func_missing_arg $opt && break + optarg="$1" + opt_mode="$optarg" +case $optarg in + # Valid mode arguments: + clean|compile|execute|finish|install|link|relink|uninstall) ;; + + # Catch anything else as an error + *) func_error "invalid argument for $opt" + exit_cmd=exit + break + ;; +esac + shift + ;; + --no-silent|--no-quiet) + opt_silent=false +func_append preserve_args " $opt" + ;; + --no-warning|--no-warn) + opt_warning=false +func_append preserve_args " $opt" + ;; + --no-verbose) + opt_verbose=false +func_append preserve_args " $opt" + ;; + --silent|--quiet) + opt_silent=: +func_append preserve_args " $opt" + opt_verbose=false + ;; + --verbose|-v) + opt_verbose=: +func_append preserve_args " $opt" +opt_silent=false + ;; + --tag) + test $# = 0 && func_missing_arg $opt && break + optarg="$1" + opt_tag="$optarg" +func_append preserve_args " $opt $optarg" +func_enable_tag "$optarg" + shift + ;; + + -\?|-h) func_usage ;; + --help) func_help ;; + --version) func_version ;; + + # Separate optargs to long options: + --*=*) + func_split_long_opt "$opt" + set dummy "$func_split_long_opt_name" "$func_split_long_opt_arg" ${1+"$@"} + shift + ;; + + # Separate non-argument short options: + -\?*|-h*|-n*|-v*) + func_split_short_opt "$opt" + set dummy "$func_split_short_opt_name" "-$func_split_short_opt_arg" ${1+"$@"} + shift + ;; + + --) break ;; + -*) func_fatal_help "unrecognized option \`$opt'" ;; + *) set dummy "$opt" ${1+"$@"}; shift; break ;; + esac + done + + # Validate options: + + # save first non-option argument + if test "$#" -gt 0; then + nonopt="$opt" + shift + fi + + # preserve --debug + test "$opt_debug" = : || func_append preserve_args " --debug" + + case $host in + *cygwin* | *mingw* | *pw32* | *cegcc*) + # don't eliminate duplications in $postdeps and $predeps + opt_duplicate_compiler_generated_deps=: + ;; + *) + opt_duplicate_compiler_generated_deps=$opt_preserve_dup_deps + ;; + esac + + $opt_help || { + # Sanity checks first: + func_check_version_match + + if test "$build_libtool_libs" != yes && test "$build_old_libs" != yes; then + func_fatal_configuration "not configured to build any kind of library" + fi + + # Darwin sucks + eval std_shrext=\"$shrext_cmds\" + + # Only execute mode is allowed to have -dlopen flags. + if test -n "$opt_dlopen" && test "$opt_mode" != execute; then + func_error "unrecognized option \`-dlopen'" + $ECHO "$help" 1>&2 + exit $EXIT_FAILURE + fi + + # Change the help message to a mode-specific one. + generic_help="$help" + help="Try \`$progname --help --mode=$opt_mode' for more information." + } + + + # Bail if the options were screwed + $exit_cmd $EXIT_FAILURE +} + + + + +## ----------- ## +## Main. ## +## ----------- ## + +# func_lalib_p file +# True iff FILE is a libtool `.la' library or `.lo' object file. +# This function is only a basic sanity check; it will hardly flush out +# determined imposters. +func_lalib_p () +{ + test -f "$1" && + $SED -e 4q "$1" 2>/dev/null \ + | $GREP "^# Generated by .*$PACKAGE" > /dev/null 2>&1 +} + +# func_lalib_unsafe_p file +# True iff FILE is a libtool `.la' library or `.lo' object file. +# This function implements the same check as func_lalib_p without +# resorting to external programs. To this end, it redirects stdin and +# closes it afterwards, without saving the original file descriptor. +# As a safety measure, use it only where a negative result would be +# fatal anyway. Works if `file' does not exist. +func_lalib_unsafe_p () +{ + lalib_p=no + if test -f "$1" && test -r "$1" && exec 5<&0 <"$1"; then + for lalib_p_l in 1 2 3 4 + do + read lalib_p_line + case "$lalib_p_line" in + \#\ Generated\ by\ *$PACKAGE* ) lalib_p=yes; break;; + esac + done + exec 0<&5 5<&- + fi + test "$lalib_p" = yes +} + +# func_ltwrapper_script_p file +# True iff FILE is a libtool wrapper script +# This function is only a basic sanity check; it will hardly flush out +# determined imposters. +func_ltwrapper_script_p () +{ + func_lalib_p "$1" +} + +# func_ltwrapper_executable_p file +# True iff FILE is a libtool wrapper executable +# This function is only a basic sanity check; it will hardly flush out +# determined imposters. +func_ltwrapper_executable_p () +{ + func_ltwrapper_exec_suffix= + case $1 in + *.exe) ;; + *) func_ltwrapper_exec_suffix=.exe ;; + esac + $GREP "$magic_exe" "$1$func_ltwrapper_exec_suffix" >/dev/null 2>&1 +} + +# func_ltwrapper_scriptname file +# Assumes file is an ltwrapper_executable +# uses $file to determine the appropriate filename for a +# temporary ltwrapper_script. +func_ltwrapper_scriptname () +{ + func_dirname_and_basename "$1" "" "." + func_stripname '' '.exe' "$func_basename_result" + func_ltwrapper_scriptname_result="$func_dirname_result/$objdir/${func_stripname_result}_ltshwrapper" +} + +# func_ltwrapper_p file +# True iff FILE is a libtool wrapper script or wrapper executable +# This function is only a basic sanity check; it will hardly flush out +# determined imposters. +func_ltwrapper_p () +{ + func_ltwrapper_script_p "$1" || func_ltwrapper_executable_p "$1" +} + + +# func_execute_cmds commands fail_cmd +# Execute tilde-delimited COMMANDS. +# If FAIL_CMD is given, eval that upon failure. +# FAIL_CMD may read-access the current command in variable CMD! +func_execute_cmds () +{ + $opt_debug + save_ifs=$IFS; IFS='~' + for cmd in $1; do + IFS=$save_ifs + eval cmd=\"$cmd\" + func_show_eval "$cmd" "${2-:}" + done + IFS=$save_ifs +} + + +# func_source file +# Source FILE, adding directory component if necessary. +# Note that it is not necessary on cygwin/mingw to append a dot to +# FILE even if both FILE and FILE.exe exist: automatic-append-.exe +# behavior happens only for exec(3), not for open(2)! Also, sourcing +# `FILE.' does not work on cygwin managed mounts. +func_source () +{ + $opt_debug + case $1 in + */* | *\\*) . "$1" ;; + *) . "./$1" ;; + esac +} + + +# func_resolve_sysroot PATH +# Replace a leading = in PATH with a sysroot. Store the result into +# func_resolve_sysroot_result +func_resolve_sysroot () +{ + func_resolve_sysroot_result=$1 + case $func_resolve_sysroot_result in + =*) + func_stripname '=' '' "$func_resolve_sysroot_result" + func_resolve_sysroot_result=$lt_sysroot$func_stripname_result + ;; + esac +} + +# func_replace_sysroot PATH +# If PATH begins with the sysroot, replace it with = and +# store the result into func_replace_sysroot_result. +func_replace_sysroot () +{ + case "$lt_sysroot:$1" in + ?*:"$lt_sysroot"*) + func_stripname "$lt_sysroot" '' "$1" + func_replace_sysroot_result="=$func_stripname_result" + ;; + *) + # Including no sysroot. + func_replace_sysroot_result=$1 + ;; + esac +} + +# func_infer_tag arg +# Infer tagged configuration to use if any are available and +# if one wasn't chosen via the "--tag" command line option. +# Only attempt this if the compiler in the base compile +# command doesn't match the default compiler. +# arg is usually of the form 'gcc ...' +func_infer_tag () +{ + $opt_debug + if test -n "$available_tags" && test -z "$tagname"; then + CC_quoted= + for arg in $CC; do + func_append_quoted CC_quoted "$arg" + done + CC_expanded=`func_echo_all $CC` + CC_quoted_expanded=`func_echo_all $CC_quoted` + case $@ in + # Blanks in the command may have been stripped by the calling shell, + # but not from the CC environment variable when configure was run. + " $CC "* | "$CC "* | " $CC_expanded "* | "$CC_expanded "* | \ + " $CC_quoted"* | "$CC_quoted "* | " $CC_quoted_expanded "* | "$CC_quoted_expanded "*) ;; + # Blanks at the start of $base_compile will cause this to fail + # if we don't check for them as well. + *) + for z in $available_tags; do + if $GREP "^# ### BEGIN LIBTOOL TAG CONFIG: $z$" < "$progpath" > /dev/null; then + # Evaluate the configuration. + eval "`${SED} -n -e '/^# ### BEGIN LIBTOOL TAG CONFIG: '$z'$/,/^# ### END LIBTOOL TAG CONFIG: '$z'$/p' < $progpath`" + CC_quoted= + for arg in $CC; do + # Double-quote args containing other shell metacharacters. + func_append_quoted CC_quoted "$arg" + done + CC_expanded=`func_echo_all $CC` + CC_quoted_expanded=`func_echo_all $CC_quoted` + case "$@ " in + " $CC "* | "$CC "* | " $CC_expanded "* | "$CC_expanded "* | \ + " $CC_quoted"* | "$CC_quoted "* | " $CC_quoted_expanded "* | "$CC_quoted_expanded "*) + # The compiler in the base compile command matches + # the one in the tagged configuration. + # Assume this is the tagged configuration we want. + tagname=$z + break + ;; + esac + fi + done + # If $tagname still isn't set, then no tagged configuration + # was found and let the user know that the "--tag" command + # line option must be used. + if test -z "$tagname"; then + func_echo "unable to infer tagged configuration" + func_fatal_error "specify a tag with \`--tag'" +# else +# func_verbose "using $tagname tagged configuration" + fi + ;; + esac + fi +} + + + +# func_write_libtool_object output_name pic_name nonpic_name +# Create a libtool object file (analogous to a ".la" file), +# but don't create it if we're doing a dry run. +func_write_libtool_object () +{ + write_libobj=${1} + if test "$build_libtool_libs" = yes; then + write_lobj=\'${2}\' + else + write_lobj=none + fi + + if test "$build_old_libs" = yes; then + write_oldobj=\'${3}\' + else + write_oldobj=none + fi + + $opt_dry_run || { + cat >${write_libobj}T </dev/null` + if test "$?" -eq 0 && test -n "${func_convert_core_file_wine_to_w32_tmp}"; then + func_convert_core_file_wine_to_w32_result=`$ECHO "$func_convert_core_file_wine_to_w32_tmp" | + $SED -e "$lt_sed_naive_backslashify"` + else + func_convert_core_file_wine_to_w32_result= + fi + fi +} +# end: func_convert_core_file_wine_to_w32 + + +# func_convert_core_path_wine_to_w32 ARG +# Helper function used by path conversion functions when $build is *nix, and +# $host is mingw, cygwin, or some other w32 environment. Relies on a correctly +# configured wine environment available, with the winepath program in $build's +# $PATH. Assumes ARG has no leading or trailing path separator characters. +# +# ARG is path to be converted from $build format to win32. +# Result is available in $func_convert_core_path_wine_to_w32_result. +# Unconvertible file (directory) names in ARG are skipped; if no directory names +# are convertible, then the result may be empty. +func_convert_core_path_wine_to_w32 () +{ + $opt_debug + # unfortunately, winepath doesn't convert paths, only file names + func_convert_core_path_wine_to_w32_result="" + if test -n "$1"; then + oldIFS=$IFS + IFS=: + for func_convert_core_path_wine_to_w32_f in $1; do + IFS=$oldIFS + func_convert_core_file_wine_to_w32 "$func_convert_core_path_wine_to_w32_f" + if test -n "$func_convert_core_file_wine_to_w32_result" ; then + if test -z "$func_convert_core_path_wine_to_w32_result"; then + func_convert_core_path_wine_to_w32_result="$func_convert_core_file_wine_to_w32_result" + else + func_append func_convert_core_path_wine_to_w32_result ";$func_convert_core_file_wine_to_w32_result" + fi + fi + done + IFS=$oldIFS + fi +} +# end: func_convert_core_path_wine_to_w32 + + +# func_cygpath ARGS... +# Wrapper around calling the cygpath program via LT_CYGPATH. This is used when +# when (1) $build is *nix and Cygwin is hosted via a wine environment; or (2) +# $build is MSYS and $host is Cygwin, or (3) $build is Cygwin. In case (1) or +# (2), returns the Cygwin file name or path in func_cygpath_result (input +# file name or path is assumed to be in w32 format, as previously converted +# from $build's *nix or MSYS format). In case (3), returns the w32 file name +# or path in func_cygpath_result (input file name or path is assumed to be in +# Cygwin format). Returns an empty string on error. +# +# ARGS are passed to cygpath, with the last one being the file name or path to +# be converted. +# +# Specify the absolute *nix (or w32) name to cygpath in the LT_CYGPATH +# environment variable; do not put it in $PATH. +func_cygpath () +{ + $opt_debug + if test -n "$LT_CYGPATH" && test -f "$LT_CYGPATH"; then + func_cygpath_result=`$LT_CYGPATH "$@" 2>/dev/null` + if test "$?" -ne 0; then + # on failure, ensure result is empty + func_cygpath_result= + fi + else + func_cygpath_result= + func_error "LT_CYGPATH is empty or specifies non-existent file: \`$LT_CYGPATH'" + fi +} +#end: func_cygpath + + +# func_convert_core_msys_to_w32 ARG +# Convert file name or path ARG from MSYS format to w32 format. Return +# result in func_convert_core_msys_to_w32_result. +func_convert_core_msys_to_w32 () +{ + $opt_debug + # awkward: cmd appends spaces to result + func_convert_core_msys_to_w32_result=`( cmd //c echo "$1" ) 2>/dev/null | + $SED -e 's/[ ]*$//' -e "$lt_sed_naive_backslashify"` +} +#end: func_convert_core_msys_to_w32 + + +# func_convert_file_check ARG1 ARG2 +# Verify that ARG1 (a file name in $build format) was converted to $host +# format in ARG2. Otherwise, emit an error message, but continue (resetting +# func_to_host_file_result to ARG1). +func_convert_file_check () +{ + $opt_debug + if test -z "$2" && test -n "$1" ; then + func_error "Could not determine host file name corresponding to" + func_error " \`$1'" + func_error "Continuing, but uninstalled executables may not work." + # Fallback: + func_to_host_file_result="$1" + fi +} +# end func_convert_file_check + + +# func_convert_path_check FROM_PATHSEP TO_PATHSEP FROM_PATH TO_PATH +# Verify that FROM_PATH (a path in $build format) was converted to $host +# format in TO_PATH. Otherwise, emit an error message, but continue, resetting +# func_to_host_file_result to a simplistic fallback value (see below). +func_convert_path_check () +{ + $opt_debug + if test -z "$4" && test -n "$3"; then + func_error "Could not determine the host path corresponding to" + func_error " \`$3'" + func_error "Continuing, but uninstalled executables may not work." + # Fallback. This is a deliberately simplistic "conversion" and + # should not be "improved". See libtool.info. + if test "x$1" != "x$2"; then + lt_replace_pathsep_chars="s|$1|$2|g" + func_to_host_path_result=`echo "$3" | + $SED -e "$lt_replace_pathsep_chars"` + else + func_to_host_path_result="$3" + fi + fi +} +# end func_convert_path_check + + +# func_convert_path_front_back_pathsep FRONTPAT BACKPAT REPL ORIG +# Modifies func_to_host_path_result by prepending REPL if ORIG matches FRONTPAT +# and appending REPL if ORIG matches BACKPAT. +func_convert_path_front_back_pathsep () +{ + $opt_debug + case $4 in + $1 ) func_to_host_path_result="$3$func_to_host_path_result" + ;; + esac + case $4 in + $2 ) func_append func_to_host_path_result "$3" + ;; + esac +} +# end func_convert_path_front_back_pathsep + + +################################################## +# $build to $host FILE NAME CONVERSION FUNCTIONS # +################################################## +# invoked via `$to_host_file_cmd ARG' +# +# In each case, ARG is the path to be converted from $build to $host format. +# Result will be available in $func_to_host_file_result. + + +# func_to_host_file ARG +# Converts the file name ARG from $build format to $host format. Return result +# in func_to_host_file_result. +func_to_host_file () +{ + $opt_debug + $to_host_file_cmd "$1" +} +# end func_to_host_file + + +# func_to_tool_file ARG LAZY +# converts the file name ARG from $build format to toolchain format. Return +# result in func_to_tool_file_result. If the conversion in use is listed +# in (the comma separated) LAZY, no conversion takes place. +func_to_tool_file () +{ + $opt_debug + case ,$2, in + *,"$to_tool_file_cmd",*) + func_to_tool_file_result=$1 + ;; + *) + $to_tool_file_cmd "$1" + func_to_tool_file_result=$func_to_host_file_result + ;; + esac +} +# end func_to_tool_file + + +# func_convert_file_noop ARG +# Copy ARG to func_to_host_file_result. +func_convert_file_noop () +{ + func_to_host_file_result="$1" +} +# end func_convert_file_noop + + +# func_convert_file_msys_to_w32 ARG +# Convert file name ARG from (mingw) MSYS to (mingw) w32 format; automatic +# conversion to w32 is not available inside the cwrapper. Returns result in +# func_to_host_file_result. +func_convert_file_msys_to_w32 () +{ + $opt_debug + func_to_host_file_result="$1" + if test -n "$1"; then + func_convert_core_msys_to_w32 "$1" + func_to_host_file_result="$func_convert_core_msys_to_w32_result" + fi + func_convert_file_check "$1" "$func_to_host_file_result" +} +# end func_convert_file_msys_to_w32 + + +# func_convert_file_cygwin_to_w32 ARG +# Convert file name ARG from Cygwin to w32 format. Returns result in +# func_to_host_file_result. +func_convert_file_cygwin_to_w32 () +{ + $opt_debug + func_to_host_file_result="$1" + if test -n "$1"; then + # because $build is cygwin, we call "the" cygpath in $PATH; no need to use + # LT_CYGPATH in this case. + func_to_host_file_result=`cygpath -m "$1"` + fi + func_convert_file_check "$1" "$func_to_host_file_result" +} +# end func_convert_file_cygwin_to_w32 + + +# func_convert_file_nix_to_w32 ARG +# Convert file name ARG from *nix to w32 format. Requires a wine environment +# and a working winepath. Returns result in func_to_host_file_result. +func_convert_file_nix_to_w32 () +{ + $opt_debug + func_to_host_file_result="$1" + if test -n "$1"; then + func_convert_core_file_wine_to_w32 "$1" + func_to_host_file_result="$func_convert_core_file_wine_to_w32_result" + fi + func_convert_file_check "$1" "$func_to_host_file_result" +} +# end func_convert_file_nix_to_w32 + + +# func_convert_file_msys_to_cygwin ARG +# Convert file name ARG from MSYS to Cygwin format. Requires LT_CYGPATH set. +# Returns result in func_to_host_file_result. +func_convert_file_msys_to_cygwin () +{ + $opt_debug + func_to_host_file_result="$1" + if test -n "$1"; then + func_convert_core_msys_to_w32 "$1" + func_cygpath -u "$func_convert_core_msys_to_w32_result" + func_to_host_file_result="$func_cygpath_result" + fi + func_convert_file_check "$1" "$func_to_host_file_result" +} +# end func_convert_file_msys_to_cygwin + + +# func_convert_file_nix_to_cygwin ARG +# Convert file name ARG from *nix to Cygwin format. Requires Cygwin installed +# in a wine environment, working winepath, and LT_CYGPATH set. Returns result +# in func_to_host_file_result. +func_convert_file_nix_to_cygwin () +{ + $opt_debug + func_to_host_file_result="$1" + if test -n "$1"; then + # convert from *nix to w32, then use cygpath to convert from w32 to cygwin. + func_convert_core_file_wine_to_w32 "$1" + func_cygpath -u "$func_convert_core_file_wine_to_w32_result" + func_to_host_file_result="$func_cygpath_result" + fi + func_convert_file_check "$1" "$func_to_host_file_result" +} +# end func_convert_file_nix_to_cygwin + + +############################################# +# $build to $host PATH CONVERSION FUNCTIONS # +############################################# +# invoked via `$to_host_path_cmd ARG' +# +# In each case, ARG is the path to be converted from $build to $host format. +# The result will be available in $func_to_host_path_result. +# +# Path separators are also converted from $build format to $host format. If +# ARG begins or ends with a path separator character, it is preserved (but +# converted to $host format) on output. +# +# All path conversion functions are named using the following convention: +# file name conversion function : func_convert_file_X_to_Y () +# path conversion function : func_convert_path_X_to_Y () +# where, for any given $build/$host combination the 'X_to_Y' value is the +# same. If conversion functions are added for new $build/$host combinations, +# the two new functions must follow this pattern, or func_init_to_host_path_cmd +# will break. + + +# func_init_to_host_path_cmd +# Ensures that function "pointer" variable $to_host_path_cmd is set to the +# appropriate value, based on the value of $to_host_file_cmd. +to_host_path_cmd= +func_init_to_host_path_cmd () +{ + $opt_debug + if test -z "$to_host_path_cmd"; then + func_stripname 'func_convert_file_' '' "$to_host_file_cmd" + to_host_path_cmd="func_convert_path_${func_stripname_result}" + fi +} + + +# func_to_host_path ARG +# Converts the path ARG from $build format to $host format. Return result +# in func_to_host_path_result. +func_to_host_path () +{ + $opt_debug + func_init_to_host_path_cmd + $to_host_path_cmd "$1" +} +# end func_to_host_path + + +# func_convert_path_noop ARG +# Copy ARG to func_to_host_path_result. +func_convert_path_noop () +{ + func_to_host_path_result="$1" +} +# end func_convert_path_noop + + +# func_convert_path_msys_to_w32 ARG +# Convert path ARG from (mingw) MSYS to (mingw) w32 format; automatic +# conversion to w32 is not available inside the cwrapper. Returns result in +# func_to_host_path_result. +func_convert_path_msys_to_w32 () +{ + $opt_debug + func_to_host_path_result="$1" + if test -n "$1"; then + # Remove leading and trailing path separator characters from ARG. MSYS + # behavior is inconsistent here; cygpath turns them into '.;' and ';.'; + # and winepath ignores them completely. + func_stripname : : "$1" + func_to_host_path_tmp1=$func_stripname_result + func_convert_core_msys_to_w32 "$func_to_host_path_tmp1" + func_to_host_path_result="$func_convert_core_msys_to_w32_result" + func_convert_path_check : ";" \ + "$func_to_host_path_tmp1" "$func_to_host_path_result" + func_convert_path_front_back_pathsep ":*" "*:" ";" "$1" + fi +} +# end func_convert_path_msys_to_w32 + + +# func_convert_path_cygwin_to_w32 ARG +# Convert path ARG from Cygwin to w32 format. Returns result in +# func_to_host_file_result. +func_convert_path_cygwin_to_w32 () +{ + $opt_debug + func_to_host_path_result="$1" + if test -n "$1"; then + # See func_convert_path_msys_to_w32: + func_stripname : : "$1" + func_to_host_path_tmp1=$func_stripname_result + func_to_host_path_result=`cygpath -m -p "$func_to_host_path_tmp1"` + func_convert_path_check : ";" \ + "$func_to_host_path_tmp1" "$func_to_host_path_result" + func_convert_path_front_back_pathsep ":*" "*:" ";" "$1" + fi +} +# end func_convert_path_cygwin_to_w32 + + +# func_convert_path_nix_to_w32 ARG +# Convert path ARG from *nix to w32 format. Requires a wine environment and +# a working winepath. Returns result in func_to_host_file_result. +func_convert_path_nix_to_w32 () +{ + $opt_debug + func_to_host_path_result="$1" + if test -n "$1"; then + # See func_convert_path_msys_to_w32: + func_stripname : : "$1" + func_to_host_path_tmp1=$func_stripname_result + func_convert_core_path_wine_to_w32 "$func_to_host_path_tmp1" + func_to_host_path_result="$func_convert_core_path_wine_to_w32_result" + func_convert_path_check : ";" \ + "$func_to_host_path_tmp1" "$func_to_host_path_result" + func_convert_path_front_back_pathsep ":*" "*:" ";" "$1" + fi +} +# end func_convert_path_nix_to_w32 + + +# func_convert_path_msys_to_cygwin ARG +# Convert path ARG from MSYS to Cygwin format. Requires LT_CYGPATH set. +# Returns result in func_to_host_file_result. +func_convert_path_msys_to_cygwin () +{ + $opt_debug + func_to_host_path_result="$1" + if test -n "$1"; then + # See func_convert_path_msys_to_w32: + func_stripname : : "$1" + func_to_host_path_tmp1=$func_stripname_result + func_convert_core_msys_to_w32 "$func_to_host_path_tmp1" + func_cygpath -u -p "$func_convert_core_msys_to_w32_result" + func_to_host_path_result="$func_cygpath_result" + func_convert_path_check : : \ + "$func_to_host_path_tmp1" "$func_to_host_path_result" + func_convert_path_front_back_pathsep ":*" "*:" : "$1" + fi +} +# end func_convert_path_msys_to_cygwin + + +# func_convert_path_nix_to_cygwin ARG +# Convert path ARG from *nix to Cygwin format. Requires Cygwin installed in a +# a wine environment, working winepath, and LT_CYGPATH set. Returns result in +# func_to_host_file_result. +func_convert_path_nix_to_cygwin () +{ + $opt_debug + func_to_host_path_result="$1" + if test -n "$1"; then + # Remove leading and trailing path separator characters from + # ARG. msys behavior is inconsistent here, cygpath turns them + # into '.;' and ';.', and winepath ignores them completely. + func_stripname : : "$1" + func_to_host_path_tmp1=$func_stripname_result + func_convert_core_path_wine_to_w32 "$func_to_host_path_tmp1" + func_cygpath -u -p "$func_convert_core_path_wine_to_w32_result" + func_to_host_path_result="$func_cygpath_result" + func_convert_path_check : : \ + "$func_to_host_path_tmp1" "$func_to_host_path_result" + func_convert_path_front_back_pathsep ":*" "*:" : "$1" + fi +} +# end func_convert_path_nix_to_cygwin + + +# func_mode_compile arg... +func_mode_compile () +{ + $opt_debug + # Get the compilation command and the source file. + base_compile= + srcfile="$nonopt" # always keep a non-empty value in "srcfile" + suppress_opt=yes + suppress_output= + arg_mode=normal + libobj= + later= + pie_flag= + + for arg + do + case $arg_mode in + arg ) + # do not "continue". Instead, add this to base_compile + lastarg="$arg" + arg_mode=normal + ;; + + target ) + libobj="$arg" + arg_mode=normal + continue + ;; + + normal ) + # Accept any command-line options. + case $arg in + -o) + test -n "$libobj" && \ + func_fatal_error "you cannot specify \`-o' more than once" + arg_mode=target + continue + ;; + + -pie | -fpie | -fPIE) + func_append pie_flag " $arg" + continue + ;; + + -shared | -static | -prefer-pic | -prefer-non-pic) + func_append later " $arg" + continue + ;; + + -no-suppress) + suppress_opt=no + continue + ;; + + -Xcompiler) + arg_mode=arg # the next one goes into the "base_compile" arg list + continue # The current "srcfile" will either be retained or + ;; # replaced later. I would guess that would be a bug. + + -Wc,*) + func_stripname '-Wc,' '' "$arg" + args=$func_stripname_result + lastarg= + save_ifs="$IFS"; IFS=',' + for arg in $args; do + IFS="$save_ifs" + func_append_quoted lastarg "$arg" + done + IFS="$save_ifs" + func_stripname ' ' '' "$lastarg" + lastarg=$func_stripname_result + + # Add the arguments to base_compile. + func_append base_compile " $lastarg" + continue + ;; + + *) + # Accept the current argument as the source file. + # The previous "srcfile" becomes the current argument. + # + lastarg="$srcfile" + srcfile="$arg" + ;; + esac # case $arg + ;; + esac # case $arg_mode + + # Aesthetically quote the previous argument. + func_append_quoted base_compile "$lastarg" + done # for arg + + case $arg_mode in + arg) + func_fatal_error "you must specify an argument for -Xcompile" + ;; + target) + func_fatal_error "you must specify a target with \`-o'" + ;; + *) + # Get the name of the library object. + test -z "$libobj" && { + func_basename "$srcfile" + libobj="$func_basename_result" + } + ;; + esac + + # Recognize several different file suffixes. + # If the user specifies -o file.o, it is replaced with file.lo + case $libobj in + *.[cCFSifmso] | \ + *.ada | *.adb | *.ads | *.asm | \ + *.c++ | *.cc | *.ii | *.class | *.cpp | *.cxx | \ + *.[fF][09]? | *.for | *.java | *.go | *.obj | *.sx | *.cu | *.cup) + func_xform "$libobj" + libobj=$func_xform_result + ;; + esac + + case $libobj in + *.lo) func_lo2o "$libobj"; obj=$func_lo2o_result ;; + *) + func_fatal_error "cannot determine name of library object from \`$libobj'" + ;; + esac + + func_infer_tag $base_compile + + for arg in $later; do + case $arg in + -shared) + test "$build_libtool_libs" != yes && \ + func_fatal_configuration "can not build a shared library" + build_old_libs=no + continue + ;; + + -static) + build_libtool_libs=no + build_old_libs=yes + continue + ;; + + -prefer-pic) + pic_mode=yes + continue + ;; + + -prefer-non-pic) + pic_mode=no + continue + ;; + esac + done + + func_quote_for_eval "$libobj" + test "X$libobj" != "X$func_quote_for_eval_result" \ + && $ECHO "X$libobj" | $GREP '[]~#^*{};<>?"'"'"' &()|`$[]' \ + && func_warning "libobj name \`$libobj' may not contain shell special characters." + func_dirname_and_basename "$obj" "/" "" + objname="$func_basename_result" + xdir="$func_dirname_result" + lobj=${xdir}$objdir/$objname + + test -z "$base_compile" && \ + func_fatal_help "you must specify a compilation command" + + # Delete any leftover library objects. + if test "$build_old_libs" = yes; then + removelist="$obj $lobj $libobj ${libobj}T" + else + removelist="$lobj $libobj ${libobj}T" + fi + + # On Cygwin there's no "real" PIC flag so we must build both object types + case $host_os in + cygwin* | mingw* | pw32* | os2* | cegcc*) + pic_mode=default + ;; + esac + if test "$pic_mode" = no && test "$deplibs_check_method" != pass_all; then + # non-PIC code in shared libraries is not supported + pic_mode=default + fi + + # Calculate the filename of the output object if compiler does + # not support -o with -c + if test "$compiler_c_o" = no; then + output_obj=`$ECHO "$srcfile" | $SED 's%^.*/%%; s%\.[^.]*$%%'`.${objext} + lockfile="$output_obj.lock" + else + output_obj= + need_locks=no + lockfile= + fi + + # Lock this critical section if it is needed + # We use this script file to make the link, it avoids creating a new file + if test "$need_locks" = yes; then + until $opt_dry_run || ln "$progpath" "$lockfile" 2>/dev/null; do + func_echo "Waiting for $lockfile to be removed" + sleep 2 + done + elif test "$need_locks" = warn; then + if test -f "$lockfile"; then + $ECHO "\ +*** ERROR, $lockfile exists and contains: +`cat $lockfile 2>/dev/null` + +This indicates that another process is trying to use the same +temporary object file, and libtool could not work around it because +your compiler does not support \`-c' and \`-o' together. If you +repeat this compilation, it may succeed, by chance, but you had better +avoid parallel builds (make -j) in this platform, or get a better +compiler." + + $opt_dry_run || $RM $removelist + exit $EXIT_FAILURE + fi + func_append removelist " $output_obj" + $ECHO "$srcfile" > "$lockfile" + fi + + $opt_dry_run || $RM $removelist + func_append removelist " $lockfile" + trap '$opt_dry_run || $RM $removelist; exit $EXIT_FAILURE' 1 2 15 + + func_to_tool_file "$srcfile" func_convert_file_msys_to_w32 + srcfile=$func_to_tool_file_result + func_quote_for_eval "$srcfile" + qsrcfile=$func_quote_for_eval_result + + # Only build a PIC object if we are building libtool libraries. + if test "$build_libtool_libs" = yes; then + # Without this assignment, base_compile gets emptied. + fbsd_hideous_sh_bug=$base_compile + + if test "$pic_mode" != no; then + command="$base_compile $qsrcfile $pic_flag" + else + # Don't build PIC code + command="$base_compile $qsrcfile" + fi + + func_mkdir_p "$xdir$objdir" + + if test -z "$output_obj"; then + # Place PIC objects in $objdir + func_append command " -o $lobj" + fi + + func_show_eval_locale "$command" \ + 'test -n "$output_obj" && $RM $removelist; exit $EXIT_FAILURE' + + if test "$need_locks" = warn && + test "X`cat $lockfile 2>/dev/null`" != "X$srcfile"; then + $ECHO "\ +*** ERROR, $lockfile contains: +`cat $lockfile 2>/dev/null` + +but it should contain: +$srcfile + +This indicates that another process is trying to use the same +temporary object file, and libtool could not work around it because +your compiler does not support \`-c' and \`-o' together. If you +repeat this compilation, it may succeed, by chance, but you had better +avoid parallel builds (make -j) in this platform, or get a better +compiler." + + $opt_dry_run || $RM $removelist + exit $EXIT_FAILURE + fi + + # Just move the object if needed, then go on to compile the next one + if test -n "$output_obj" && test "X$output_obj" != "X$lobj"; then + func_show_eval '$MV "$output_obj" "$lobj"' \ + 'error=$?; $opt_dry_run || $RM $removelist; exit $error' + fi + + # Allow error messages only from the first compilation. + if test "$suppress_opt" = yes; then + suppress_output=' >/dev/null 2>&1' + fi + fi + + # Only build a position-dependent object if we build old libraries. + if test "$build_old_libs" = yes; then + if test "$pic_mode" != yes; then + # Don't build PIC code + command="$base_compile $qsrcfile$pie_flag" + else + command="$base_compile $qsrcfile $pic_flag" + fi + if test "$compiler_c_o" = yes; then + func_append command " -o $obj" + fi + + # Suppress compiler output if we already did a PIC compilation. + func_append command "$suppress_output" + func_show_eval_locale "$command" \ + '$opt_dry_run || $RM $removelist; exit $EXIT_FAILURE' + + if test "$need_locks" = warn && + test "X`cat $lockfile 2>/dev/null`" != "X$srcfile"; then + $ECHO "\ +*** ERROR, $lockfile contains: +`cat $lockfile 2>/dev/null` + +but it should contain: +$srcfile + +This indicates that another process is trying to use the same +temporary object file, and libtool could not work around it because +your compiler does not support \`-c' and \`-o' together. If you +repeat this compilation, it may succeed, by chance, but you had better +avoid parallel builds (make -j) in this platform, or get a better +compiler." + + $opt_dry_run || $RM $removelist + exit $EXIT_FAILURE + fi + + # Just move the object if needed + if test -n "$output_obj" && test "X$output_obj" != "X$obj"; then + func_show_eval '$MV "$output_obj" "$obj"' \ + 'error=$?; $opt_dry_run || $RM $removelist; exit $error' + fi + fi + + $opt_dry_run || { + func_write_libtool_object "$libobj" "$objdir/$objname" "$objname" + + # Unlock the critical section if it was locked + if test "$need_locks" != no; then + removelist=$lockfile + $RM "$lockfile" + fi + } + + exit $EXIT_SUCCESS +} + +$opt_help || { + test "$opt_mode" = compile && func_mode_compile ${1+"$@"} +} + +func_mode_help () +{ + # We need to display help for each of the modes. + case $opt_mode in + "") + # Generic help is extracted from the usage comments + # at the start of this file. + func_help + ;; + + clean) + $ECHO \ +"Usage: $progname [OPTION]... --mode=clean RM [RM-OPTION]... FILE... + +Remove files from the build directory. + +RM is the name of the program to use to delete files associated with each FILE +(typically \`/bin/rm'). RM-OPTIONS are options (such as \`-f') to be passed +to RM. + +If FILE is a libtool library, object or program, all the files associated +with it are deleted. Otherwise, only FILE itself is deleted using RM." + ;; + + compile) + $ECHO \ +"Usage: $progname [OPTION]... --mode=compile COMPILE-COMMAND... SOURCEFILE + +Compile a source file into a libtool library object. + +This mode accepts the following additional options: + + -o OUTPUT-FILE set the output file name to OUTPUT-FILE + -no-suppress do not suppress compiler output for multiple passes + -prefer-pic try to build PIC objects only + -prefer-non-pic try to build non-PIC objects only + -shared do not build a \`.o' file suitable for static linking + -static only build a \`.o' file suitable for static linking + -Wc,FLAG pass FLAG directly to the compiler + +COMPILE-COMMAND is a command to be used in creating a \`standard' object file +from the given SOURCEFILE. + +The output file name is determined by removing the directory component from +SOURCEFILE, then substituting the C source code suffix \`.c' with the +library object suffix, \`.lo'." + ;; + + execute) + $ECHO \ +"Usage: $progname [OPTION]... --mode=execute COMMAND [ARGS]... + +Automatically set library path, then run a program. + +This mode accepts the following additional options: + + -dlopen FILE add the directory containing FILE to the library path + +This mode sets the library path environment variable according to \`-dlopen' +flags. + +If any of the ARGS are libtool executable wrappers, then they are translated +into their corresponding uninstalled binary, and any of their required library +directories are added to the library path. + +Then, COMMAND is executed, with ARGS as arguments." + ;; + + finish) + $ECHO \ +"Usage: $progname [OPTION]... --mode=finish [LIBDIR]... + +Complete the installation of libtool libraries. + +Each LIBDIR is a directory that contains libtool libraries. + +The commands that this mode executes may require superuser privileges. Use +the \`--dry-run' option if you just want to see what would be executed." + ;; + + install) + $ECHO \ +"Usage: $progname [OPTION]... --mode=install INSTALL-COMMAND... + +Install executables or libraries. + +INSTALL-COMMAND is the installation command. The first component should be +either the \`install' or \`cp' program. + +The following components of INSTALL-COMMAND are treated specially: + + -inst-prefix-dir PREFIX-DIR Use PREFIX-DIR as a staging area for installation + +The rest of the components are interpreted as arguments to that command (only +BSD-compatible install options are recognized)." + ;; + + link) + $ECHO \ +"Usage: $progname [OPTION]... --mode=link LINK-COMMAND... + +Link object files or libraries together to form another library, or to +create an executable program. + +LINK-COMMAND is a command using the C compiler that you would use to create +a program from several object files. + +The following components of LINK-COMMAND are treated specially: + + -all-static do not do any dynamic linking at all + -avoid-version do not add a version suffix if possible + -bindir BINDIR specify path to binaries directory (for systems where + libraries must be found in the PATH setting at runtime) + -dlopen FILE \`-dlpreopen' FILE if it cannot be dlopened at runtime + -dlpreopen FILE link in FILE and add its symbols to lt_preloaded_symbols + -export-dynamic allow symbols from OUTPUT-FILE to be resolved with dlsym(3) + -export-symbols SYMFILE + try to export only the symbols listed in SYMFILE + -export-symbols-regex REGEX + try to export only the symbols matching REGEX + -LLIBDIR search LIBDIR for required installed libraries + -lNAME OUTPUT-FILE requires the installed library libNAME + -module build a library that can dlopened + -no-fast-install disable the fast-install mode + -no-install link a not-installable executable + -no-undefined declare that a library does not refer to external symbols + -o OUTPUT-FILE create OUTPUT-FILE from the specified objects + -objectlist FILE Use a list of object files found in FILE to specify objects + -precious-files-regex REGEX + don't remove output files matching REGEX + -release RELEASE specify package release information + -rpath LIBDIR the created library will eventually be installed in LIBDIR + -R[ ]LIBDIR add LIBDIR to the runtime path of programs and libraries + -shared only do dynamic linking of libtool libraries + -shrext SUFFIX override the standard shared library file extension + -static do not do any dynamic linking of uninstalled libtool libraries + -static-libtool-libs + do not do any dynamic linking of libtool libraries + -version-info CURRENT[:REVISION[:AGE]] + specify library version info [each variable defaults to 0] + -weak LIBNAME declare that the target provides the LIBNAME interface + -Wc,FLAG + -Xcompiler FLAG pass linker-specific FLAG directly to the compiler + -Wl,FLAG + -Xlinker FLAG pass linker-specific FLAG directly to the linker + -XCClinker FLAG pass link-specific FLAG to the compiler driver (CC) + +All other options (arguments beginning with \`-') are ignored. + +Every other argument is treated as a filename. Files ending in \`.la' are +treated as uninstalled libtool libraries, other files are standard or library +object files. + +If the OUTPUT-FILE ends in \`.la', then a libtool library is created, +only library objects (\`.lo' files) may be specified, and \`-rpath' is +required, except when creating a convenience library. + +If OUTPUT-FILE ends in \`.a' or \`.lib', then a standard library is created +using \`ar' and \`ranlib', or on Windows using \`lib'. + +If OUTPUT-FILE ends in \`.lo' or \`.${objext}', then a reloadable object file +is created, otherwise an executable program is created." + ;; + + uninstall) + $ECHO \ +"Usage: $progname [OPTION]... --mode=uninstall RM [RM-OPTION]... FILE... + +Remove libraries from an installation directory. + +RM is the name of the program to use to delete files associated with each FILE +(typically \`/bin/rm'). RM-OPTIONS are options (such as \`-f') to be passed +to RM. + +If FILE is a libtool library, all the files associated with it are deleted. +Otherwise, only FILE itself is deleted using RM." + ;; + + *) + func_fatal_help "invalid operation mode \`$opt_mode'" + ;; + esac + + echo + $ECHO "Try \`$progname --help' for more information about other modes." +} + +# Now that we've collected a possible --mode arg, show help if necessary +if $opt_help; then + if test "$opt_help" = :; then + func_mode_help + else + { + func_help noexit + for opt_mode in compile link execute install finish uninstall clean; do + func_mode_help + done + } | sed -n '1p; 2,$s/^Usage:/ or: /p' + { + func_help noexit + for opt_mode in compile link execute install finish uninstall clean; do + echo + func_mode_help + done + } | + sed '1d + /^When reporting/,/^Report/{ + H + d + } + $x + /information about other modes/d + /more detailed .*MODE/d + s/^Usage:.*--mode=\([^ ]*\) .*/Description of \1 mode:/' + fi + exit $? +fi + + +# func_mode_execute arg... +func_mode_execute () +{ + $opt_debug + # The first argument is the command name. + cmd="$nonopt" + test -z "$cmd" && \ + func_fatal_help "you must specify a COMMAND" + + # Handle -dlopen flags immediately. + for file in $opt_dlopen; do + test -f "$file" \ + || func_fatal_help "\`$file' is not a file" + + dir= + case $file in + *.la) + func_resolve_sysroot "$file" + file=$func_resolve_sysroot_result + + # Check to see that this really is a libtool archive. + func_lalib_unsafe_p "$file" \ + || func_fatal_help "\`$lib' is not a valid libtool archive" + + # Read the libtool library. + dlname= + library_names= + func_source "$file" + + # Skip this library if it cannot be dlopened. + if test -z "$dlname"; then + # Warn if it was a shared library. + test -n "$library_names" && \ + func_warning "\`$file' was not linked with \`-export-dynamic'" + continue + fi + + func_dirname "$file" "" "." + dir="$func_dirname_result" + + if test -f "$dir/$objdir/$dlname"; then + func_append dir "/$objdir" + else + if test ! -f "$dir/$dlname"; then + func_fatal_error "cannot find \`$dlname' in \`$dir' or \`$dir/$objdir'" + fi + fi + ;; + + *.lo) + # Just add the directory containing the .lo file. + func_dirname "$file" "" "." + dir="$func_dirname_result" + ;; + + *) + func_warning "\`-dlopen' is ignored for non-libtool libraries and objects" + continue + ;; + esac + + # Get the absolute pathname. + absdir=`cd "$dir" && pwd` + test -n "$absdir" && dir="$absdir" + + # Now add the directory to shlibpath_var. + if eval "test -z \"\$$shlibpath_var\""; then + eval "$shlibpath_var=\"\$dir\"" + else + eval "$shlibpath_var=\"\$dir:\$$shlibpath_var\"" + fi + done + + # This variable tells wrapper scripts just to set shlibpath_var + # rather than running their programs. + libtool_execute_magic="$magic" + + # Check if any of the arguments is a wrapper script. + args= + for file + do + case $file in + -* | *.la | *.lo ) ;; + *) + # Do a test to see if this is really a libtool program. + if func_ltwrapper_script_p "$file"; then + func_source "$file" + # Transform arg to wrapped name. + file="$progdir/$program" + elif func_ltwrapper_executable_p "$file"; then + func_ltwrapper_scriptname "$file" + func_source "$func_ltwrapper_scriptname_result" + # Transform arg to wrapped name. + file="$progdir/$program" + fi + ;; + esac + # Quote arguments (to preserve shell metacharacters). + func_append_quoted args "$file" + done + + if test "X$opt_dry_run" = Xfalse; then + if test -n "$shlibpath_var"; then + # Export the shlibpath_var. + eval "export $shlibpath_var" + fi + + # Restore saved environment variables + for lt_var in LANG LANGUAGE LC_ALL LC_CTYPE LC_COLLATE LC_MESSAGES + do + eval "if test \"\${save_$lt_var+set}\" = set; then + $lt_var=\$save_$lt_var; export $lt_var + else + $lt_unset $lt_var + fi" + done + + # Now prepare to actually exec the command. + exec_cmd="\$cmd$args" + else + # Display what would be done. + if test -n "$shlibpath_var"; then + eval "\$ECHO \"\$shlibpath_var=\$$shlibpath_var\"" + echo "export $shlibpath_var" + fi + $ECHO "$cmd$args" + exit $EXIT_SUCCESS + fi +} + +test "$opt_mode" = execute && func_mode_execute ${1+"$@"} + + +# func_mode_finish arg... +func_mode_finish () +{ + $opt_debug + libs= + libdirs= + admincmds= + + for opt in "$nonopt" ${1+"$@"} + do + if test -d "$opt"; then + func_append libdirs " $opt" + + elif test -f "$opt"; then + if func_lalib_unsafe_p "$opt"; then + func_append libs " $opt" + else + func_warning "\`$opt' is not a valid libtool archive" + fi + + else + func_fatal_error "invalid argument \`$opt'" + fi + done + + if test -n "$libs"; then + if test -n "$lt_sysroot"; then + sysroot_regex=`$ECHO "$lt_sysroot" | $SED "$sed_make_literal_regex"` + sysroot_cmd="s/\([ ']\)$sysroot_regex/\1/g;" + else + sysroot_cmd= + fi + + # Remove sysroot references + if $opt_dry_run; then + for lib in $libs; do + echo "removing references to $lt_sysroot and \`=' prefixes from $lib" + done + else + tmpdir=`func_mktempdir` + for lib in $libs; do + sed -e "${sysroot_cmd} s/\([ ']-[LR]\)=/\1/g; s/\([ ']\)=/\1/g" $lib \ + > $tmpdir/tmp-la + mv -f $tmpdir/tmp-la $lib + done + ${RM}r "$tmpdir" + fi + fi + + if test -n "$finish_cmds$finish_eval" && test -n "$libdirs"; then + for libdir in $libdirs; do + if test -n "$finish_cmds"; then + # Do each command in the finish commands. + func_execute_cmds "$finish_cmds" 'admincmds="$admincmds +'"$cmd"'"' + fi + if test -n "$finish_eval"; then + # Do the single finish_eval. + eval cmds=\"$finish_eval\" + $opt_dry_run || eval "$cmds" || func_append admincmds " + $cmds" + fi + done + fi + + # Exit here if they wanted silent mode. + $opt_silent && exit $EXIT_SUCCESS + + if test -n "$finish_cmds$finish_eval" && test -n "$libdirs"; then + echo "----------------------------------------------------------------------" + echo "Libraries have been installed in:" + for libdir in $libdirs; do + $ECHO " $libdir" + done + echo + echo "If you ever happen to want to link against installed libraries" + echo "in a given directory, LIBDIR, you must either use libtool, and" + echo "specify the full pathname of the library, or use the \`-LLIBDIR'" + echo "flag during linking and do at least one of the following:" + if test -n "$shlibpath_var"; then + echo " - add LIBDIR to the \`$shlibpath_var' environment variable" + echo " during execution" + fi + if test -n "$runpath_var"; then + echo " - add LIBDIR to the \`$runpath_var' environment variable" + echo " during linking" + fi + if test -n "$hardcode_libdir_flag_spec"; then + libdir=LIBDIR + eval flag=\"$hardcode_libdir_flag_spec\" + + $ECHO " - use the \`$flag' linker flag" + fi + if test -n "$admincmds"; then + $ECHO " - have your system administrator run these commands:$admincmds" + fi + if test -f /etc/ld.so.conf; then + echo " - have your system administrator add LIBDIR to \`/etc/ld.so.conf'" + fi + echo + + echo "See any operating system documentation about shared libraries for" + case $host in + solaris2.[6789]|solaris2.1[0-9]) + echo "more information, such as the ld(1), crle(1) and ld.so(8) manual" + echo "pages." + ;; + *) + echo "more information, such as the ld(1) and ld.so(8) manual pages." + ;; + esac + echo "----------------------------------------------------------------------" + fi + exit $EXIT_SUCCESS +} + +test "$opt_mode" = finish && func_mode_finish ${1+"$@"} + + +# func_mode_install arg... +func_mode_install () +{ + $opt_debug + # There may be an optional sh(1) argument at the beginning of + # install_prog (especially on Windows NT). + if test "$nonopt" = "$SHELL" || test "$nonopt" = /bin/sh || + # Allow the use of GNU shtool's install command. + case $nonopt in *shtool*) :;; *) false;; esac; then + # Aesthetically quote it. + func_quote_for_eval "$nonopt" + install_prog="$func_quote_for_eval_result " + arg=$1 + shift + else + install_prog= + arg=$nonopt + fi + + # The real first argument should be the name of the installation program. + # Aesthetically quote it. + func_quote_for_eval "$arg" + func_append install_prog "$func_quote_for_eval_result" + install_shared_prog=$install_prog + case " $install_prog " in + *[\\\ /]cp\ *) install_cp=: ;; + *) install_cp=false ;; + esac + + # We need to accept at least all the BSD install flags. + dest= + files= + opts= + prev= + install_type= + isdir=no + stripme= + no_mode=: + for arg + do + arg2= + if test -n "$dest"; then + func_append files " $dest" + dest=$arg + continue + fi + + case $arg in + -d) isdir=yes ;; + -f) + if $install_cp; then :; else + prev=$arg + fi + ;; + -g | -m | -o) + prev=$arg + ;; + -s) + stripme=" -s" + continue + ;; + -*) + ;; + *) + # If the previous option needed an argument, then skip it. + if test -n "$prev"; then + if test "x$prev" = x-m && test -n "$install_override_mode"; then + arg2=$install_override_mode + no_mode=false + fi + prev= + else + dest=$arg + continue + fi + ;; + esac + + # Aesthetically quote the argument. + func_quote_for_eval "$arg" + func_append install_prog " $func_quote_for_eval_result" + if test -n "$arg2"; then + func_quote_for_eval "$arg2" + fi + func_append install_shared_prog " $func_quote_for_eval_result" + done + + test -z "$install_prog" && \ + func_fatal_help "you must specify an install program" + + test -n "$prev" && \ + func_fatal_help "the \`$prev' option requires an argument" + + if test -n "$install_override_mode" && $no_mode; then + if $install_cp; then :; else + func_quote_for_eval "$install_override_mode" + func_append install_shared_prog " -m $func_quote_for_eval_result" + fi + fi + + if test -z "$files"; then + if test -z "$dest"; then + func_fatal_help "no file or destination specified" + else + func_fatal_help "you must specify a destination" + fi + fi + + # Strip any trailing slash from the destination. + func_stripname '' '/' "$dest" + dest=$func_stripname_result + + # Check to see that the destination is a directory. + test -d "$dest" && isdir=yes + if test "$isdir" = yes; then + destdir="$dest" + destname= + else + func_dirname_and_basename "$dest" "" "." + destdir="$func_dirname_result" + destname="$func_basename_result" + + # Not a directory, so check to see that there is only one file specified. + set dummy $files; shift + test "$#" -gt 1 && \ + func_fatal_help "\`$dest' is not a directory" + fi + case $destdir in + [\\/]* | [A-Za-z]:[\\/]*) ;; + *) + for file in $files; do + case $file in + *.lo) ;; + *) + func_fatal_help "\`$destdir' must be an absolute directory name" + ;; + esac + done + ;; + esac + + # This variable tells wrapper scripts just to set variables rather + # than running their programs. + libtool_install_magic="$magic" + + staticlibs= + future_libdirs= + current_libdirs= + for file in $files; do + + # Do each installation. + case $file in + *.$libext) + # Do the static libraries later. + func_append staticlibs " $file" + ;; + + *.la) + func_resolve_sysroot "$file" + file=$func_resolve_sysroot_result + + # Check to see that this really is a libtool archive. + func_lalib_unsafe_p "$file" \ + || func_fatal_help "\`$file' is not a valid libtool archive" + + library_names= + old_library= + relink_command= + func_source "$file" + + # Add the libdir to current_libdirs if it is the destination. + if test "X$destdir" = "X$libdir"; then + case "$current_libdirs " in + *" $libdir "*) ;; + *) func_append current_libdirs " $libdir" ;; + esac + else + # Note the libdir as a future libdir. + case "$future_libdirs " in + *" $libdir "*) ;; + *) func_append future_libdirs " $libdir" ;; + esac + fi + + func_dirname "$file" "/" "" + dir="$func_dirname_result" + func_append dir "$objdir" + + if test -n "$relink_command"; then + # Determine the prefix the user has applied to our future dir. + inst_prefix_dir=`$ECHO "$destdir" | $SED -e "s%$libdir\$%%"` + + # Don't allow the user to place us outside of our expected + # location b/c this prevents finding dependent libraries that + # are installed to the same prefix. + # At present, this check doesn't affect windows .dll's that + # are installed into $libdir/../bin (currently, that works fine) + # but it's something to keep an eye on. + test "$inst_prefix_dir" = "$destdir" && \ + func_fatal_error "error: cannot install \`$file' to a directory not ending in $libdir" + + if test -n "$inst_prefix_dir"; then + # Stick the inst_prefix_dir data into the link command. + relink_command=`$ECHO "$relink_command" | $SED "s%@inst_prefix_dir@%-inst-prefix-dir $inst_prefix_dir%"` + else + relink_command=`$ECHO "$relink_command" | $SED "s%@inst_prefix_dir@%%"` + fi + + func_warning "relinking \`$file'" + func_show_eval "$relink_command" \ + 'func_fatal_error "error: relink \`$file'\'' with the above command before installing it"' + fi + + # See the names of the shared library. + set dummy $library_names; shift + if test -n "$1"; then + realname="$1" + shift + + srcname="$realname" + test -n "$relink_command" && srcname="$realname"T + + # Install the shared library and build the symlinks. + func_show_eval "$install_shared_prog $dir/$srcname $destdir/$realname" \ + 'exit $?' + tstripme="$stripme" + case $host_os in + cygwin* | mingw* | pw32* | cegcc*) + case $realname in + *.dll.a) + tstripme="" + ;; + esac + ;; + esac + if test -n "$tstripme" && test -n "$striplib"; then + func_show_eval "$striplib $destdir/$realname" 'exit $?' + fi + + if test "$#" -gt 0; then + # Delete the old symlinks, and create new ones. + # Try `ln -sf' first, because the `ln' binary might depend on + # the symlink we replace! Solaris /bin/ln does not understand -f, + # so we also need to try rm && ln -s. + for linkname + do + test "$linkname" != "$realname" \ + && func_show_eval "(cd $destdir && { $LN_S -f $realname $linkname || { $RM $linkname && $LN_S $realname $linkname; }; })" + done + fi + + # Do each command in the postinstall commands. + lib="$destdir/$realname" + func_execute_cmds "$postinstall_cmds" 'exit $?' + fi + + # Install the pseudo-library for information purposes. + func_basename "$file" + name="$func_basename_result" + instname="$dir/$name"i + func_show_eval "$install_prog $instname $destdir/$name" 'exit $?' + + # Maybe install the static library, too. + test -n "$old_library" && func_append staticlibs " $dir/$old_library" + ;; + + *.lo) + # Install (i.e. copy) a libtool object. + + # Figure out destination file name, if it wasn't already specified. + if test -n "$destname"; then + destfile="$destdir/$destname" + else + func_basename "$file" + destfile="$func_basename_result" + destfile="$destdir/$destfile" + fi + + # Deduce the name of the destination old-style object file. + case $destfile in + *.lo) + func_lo2o "$destfile" + staticdest=$func_lo2o_result + ;; + *.$objext) + staticdest="$destfile" + destfile= + ;; + *) + func_fatal_help "cannot copy a libtool object to \`$destfile'" + ;; + esac + + # Install the libtool object if requested. + test -n "$destfile" && \ + func_show_eval "$install_prog $file $destfile" 'exit $?' + + # Install the old object if enabled. + if test "$build_old_libs" = yes; then + # Deduce the name of the old-style object file. + func_lo2o "$file" + staticobj=$func_lo2o_result + func_show_eval "$install_prog \$staticobj \$staticdest" 'exit $?' + fi + exit $EXIT_SUCCESS + ;; + + *) + # Figure out destination file name, if it wasn't already specified. + if test -n "$destname"; then + destfile="$destdir/$destname" + else + func_basename "$file" + destfile="$func_basename_result" + destfile="$destdir/$destfile" + fi + + # If the file is missing, and there is a .exe on the end, strip it + # because it is most likely a libtool script we actually want to + # install + stripped_ext="" + case $file in + *.exe) + if test ! -f "$file"; then + func_stripname '' '.exe' "$file" + file=$func_stripname_result + stripped_ext=".exe" + fi + ;; + esac + + # Do a test to see if this is really a libtool program. + case $host in + *cygwin* | *mingw*) + if func_ltwrapper_executable_p "$file"; then + func_ltwrapper_scriptname "$file" + wrapper=$func_ltwrapper_scriptname_result + else + func_stripname '' '.exe' "$file" + wrapper=$func_stripname_result + fi + ;; + *) + wrapper=$file + ;; + esac + if func_ltwrapper_script_p "$wrapper"; then + notinst_deplibs= + relink_command= + + func_source "$wrapper" + + # Check the variables that should have been set. + test -z "$generated_by_libtool_version" && \ + func_fatal_error "invalid libtool wrapper script \`$wrapper'" + + finalize=yes + for lib in $notinst_deplibs; do + # Check to see that each library is installed. + libdir= + if test -f "$lib"; then + func_source "$lib" + fi + libfile="$libdir/"`$ECHO "$lib" | $SED 's%^.*/%%g'` ### testsuite: skip nested quoting test + if test -n "$libdir" && test ! -f "$libfile"; then + func_warning "\`$lib' has not been installed in \`$libdir'" + finalize=no + fi + done + + relink_command= + func_source "$wrapper" + + outputname= + if test "$fast_install" = no && test -n "$relink_command"; then + $opt_dry_run || { + if test "$finalize" = yes; then + tmpdir=`func_mktempdir` + func_basename "$file$stripped_ext" + file="$func_basename_result" + outputname="$tmpdir/$file" + # Replace the output file specification. + relink_command=`$ECHO "$relink_command" | $SED 's%@OUTPUT@%'"$outputname"'%g'` + + $opt_silent || { + func_quote_for_expand "$relink_command" + eval "func_echo $func_quote_for_expand_result" + } + if eval "$relink_command"; then : + else + func_error "error: relink \`$file' with the above command before installing it" + $opt_dry_run || ${RM}r "$tmpdir" + continue + fi + file="$outputname" + else + func_warning "cannot relink \`$file'" + fi + } + else + # Install the binary that we compiled earlier. + file=`$ECHO "$file$stripped_ext" | $SED "s%\([^/]*\)$%$objdir/\1%"` + fi + fi + + # remove .exe since cygwin /usr/bin/install will append another + # one anyway + case $install_prog,$host in + */usr/bin/install*,*cygwin*) + case $file:$destfile in + *.exe:*.exe) + # this is ok + ;; + *.exe:*) + destfile=$destfile.exe + ;; + *:*.exe) + func_stripname '' '.exe' "$destfile" + destfile=$func_stripname_result + ;; + esac + ;; + esac + func_show_eval "$install_prog\$stripme \$file \$destfile" 'exit $?' + $opt_dry_run || if test -n "$outputname"; then + ${RM}r "$tmpdir" + fi + ;; + esac + done + + for file in $staticlibs; do + func_basename "$file" + name="$func_basename_result" + + # Set up the ranlib parameters. + oldlib="$destdir/$name" + func_to_tool_file "$oldlib" func_convert_file_msys_to_w32 + tool_oldlib=$func_to_tool_file_result + + func_show_eval "$install_prog \$file \$oldlib" 'exit $?' + + if test -n "$stripme" && test -n "$old_striplib"; then + func_show_eval "$old_striplib $tool_oldlib" 'exit $?' + fi + + # Do each command in the postinstall commands. + func_execute_cmds "$old_postinstall_cmds" 'exit $?' + done + + test -n "$future_libdirs" && \ + func_warning "remember to run \`$progname --finish$future_libdirs'" + + if test -n "$current_libdirs"; then + # Maybe just do a dry run. + $opt_dry_run && current_libdirs=" -n$current_libdirs" + exec_cmd='$SHELL $progpath $preserve_args --finish$current_libdirs' + else + exit $EXIT_SUCCESS + fi +} + +test "$opt_mode" = install && func_mode_install ${1+"$@"} + + +# func_generate_dlsyms outputname originator pic_p +# Extract symbols from dlprefiles and create ${outputname}S.o with +# a dlpreopen symbol table. +func_generate_dlsyms () +{ + $opt_debug + my_outputname="$1" + my_originator="$2" + my_pic_p="${3-no}" + my_prefix=`$ECHO "$my_originator" | sed 's%[^a-zA-Z0-9]%_%g'` + my_dlsyms= + + if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then + if test -n "$NM" && test -n "$global_symbol_pipe"; then + my_dlsyms="${my_outputname}S.c" + else + func_error "not configured to extract global symbols from dlpreopened files" + fi + fi + + if test -n "$my_dlsyms"; then + case $my_dlsyms in + "") ;; + *.c) + # Discover the nlist of each of the dlfiles. + nlist="$output_objdir/${my_outputname}.nm" + + func_show_eval "$RM $nlist ${nlist}S ${nlist}T" + + # Parse the name list into a source file. + func_verbose "creating $output_objdir/$my_dlsyms" + + $opt_dry_run || $ECHO > "$output_objdir/$my_dlsyms" "\ +/* $my_dlsyms - symbol resolution table for \`$my_outputname' dlsym emulation. */ +/* Generated by $PROGRAM (GNU $PACKAGE$TIMESTAMP) $VERSION */ + +#ifdef __cplusplus +extern \"C\" { +#endif + +#if defined(__GNUC__) && (((__GNUC__ == 4) && (__GNUC_MINOR__ >= 4)) || (__GNUC__ > 4)) +#pragma GCC diagnostic ignored \"-Wstrict-prototypes\" +#endif + +/* Keep this code in sync between libtool.m4, ltmain, lt_system.h, and tests. */ +#if defined(_WIN32) || defined(__CYGWIN__) || defined(_WIN32_WCE) +/* DATA imports from DLLs on WIN32 con't be const, because runtime + relocations are performed -- see ld's documentation on pseudo-relocs. */ +# define LT_DLSYM_CONST +#elif defined(__osf__) +/* This system does not cope well with relocations in const data. */ +# define LT_DLSYM_CONST +#else +# define LT_DLSYM_CONST const +#endif + +/* External symbol declarations for the compiler. */\ +" + + if test "$dlself" = yes; then + func_verbose "generating symbol list for \`$output'" + + $opt_dry_run || echo ': @PROGRAM@ ' > "$nlist" + + # Add our own program objects to the symbol list. + progfiles=`$ECHO "$objs$old_deplibs" | $SP2NL | $SED "$lo2o" | $NL2SP` + for progfile in $progfiles; do + func_to_tool_file "$progfile" func_convert_file_msys_to_w32 + func_verbose "extracting global C symbols from \`$func_to_tool_file_result'" + $opt_dry_run || eval "$NM $func_to_tool_file_result | $global_symbol_pipe >> '$nlist'" + done + + if test -n "$exclude_expsyms"; then + $opt_dry_run || { + eval '$EGREP -v " ($exclude_expsyms)$" "$nlist" > "$nlist"T' + eval '$MV "$nlist"T "$nlist"' + } + fi + + if test -n "$export_symbols_regex"; then + $opt_dry_run || { + eval '$EGREP -e "$export_symbols_regex" "$nlist" > "$nlist"T' + eval '$MV "$nlist"T "$nlist"' + } + fi + + # Prepare the list of exported symbols + if test -z "$export_symbols"; then + export_symbols="$output_objdir/$outputname.exp" + $opt_dry_run || { + $RM $export_symbols + eval "${SED} -n -e '/^: @PROGRAM@ $/d' -e 's/^.* \(.*\)$/\1/p' "'< "$nlist" > "$export_symbols"' + case $host in + *cygwin* | *mingw* | *cegcc* ) + eval "echo EXPORTS "'> "$output_objdir/$outputname.def"' + eval 'cat "$export_symbols" >> "$output_objdir/$outputname.def"' + ;; + esac + } + else + $opt_dry_run || { + eval "${SED} -e 's/\([].[*^$]\)/\\\\\1/g' -e 's/^/ /' -e 's/$/$/'"' < "$export_symbols" > "$output_objdir/$outputname.exp"' + eval '$GREP -f "$output_objdir/$outputname.exp" < "$nlist" > "$nlist"T' + eval '$MV "$nlist"T "$nlist"' + case $host in + *cygwin* | *mingw* | *cegcc* ) + eval "echo EXPORTS "'> "$output_objdir/$outputname.def"' + eval 'cat "$nlist" >> "$output_objdir/$outputname.def"' + ;; + esac + } + fi + fi + + for dlprefile in $dlprefiles; do + func_verbose "extracting global C symbols from \`$dlprefile'" + func_basename "$dlprefile" + name="$func_basename_result" + case $host in + *cygwin* | *mingw* | *cegcc* ) + # if an import library, we need to obtain dlname + if func_win32_import_lib_p "$dlprefile"; then + func_tr_sh "$dlprefile" + eval "curr_lafile=\$libfile_$func_tr_sh_result" + dlprefile_dlbasename="" + if test -n "$curr_lafile" && func_lalib_p "$curr_lafile"; then + # Use subshell, to avoid clobbering current variable values + dlprefile_dlname=`source "$curr_lafile" && echo "$dlname"` + if test -n "$dlprefile_dlname" ; then + func_basename "$dlprefile_dlname" + dlprefile_dlbasename="$func_basename_result" + else + # no lafile. user explicitly requested -dlpreopen . + $sharedlib_from_linklib_cmd "$dlprefile" + dlprefile_dlbasename=$sharedlib_from_linklib_result + fi + fi + $opt_dry_run || { + if test -n "$dlprefile_dlbasename" ; then + eval '$ECHO ": $dlprefile_dlbasename" >> "$nlist"' + else + func_warning "Could not compute DLL name from $name" + eval '$ECHO ": $name " >> "$nlist"' + fi + func_to_tool_file "$dlprefile" func_convert_file_msys_to_w32 + eval "$NM \"$func_to_tool_file_result\" 2>/dev/null | $global_symbol_pipe | + $SED -e '/I __imp/d' -e 's/I __nm_/D /;s/_nm__//' >> '$nlist'" + } + else # not an import lib + $opt_dry_run || { + eval '$ECHO ": $name " >> "$nlist"' + func_to_tool_file "$dlprefile" func_convert_file_msys_to_w32 + eval "$NM \"$func_to_tool_file_result\" 2>/dev/null | $global_symbol_pipe >> '$nlist'" + } + fi + ;; + *) + $opt_dry_run || { + eval '$ECHO ": $name " >> "$nlist"' + func_to_tool_file "$dlprefile" func_convert_file_msys_to_w32 + eval "$NM \"$func_to_tool_file_result\" 2>/dev/null | $global_symbol_pipe >> '$nlist'" + } + ;; + esac + done + + $opt_dry_run || { + # Make sure we have at least an empty file. + test -f "$nlist" || : > "$nlist" + + if test -n "$exclude_expsyms"; then + $EGREP -v " ($exclude_expsyms)$" "$nlist" > "$nlist"T + $MV "$nlist"T "$nlist" + fi + + # Try sorting and uniquifying the output. + if $GREP -v "^: " < "$nlist" | + if sort -k 3 /dev/null 2>&1; then + sort -k 3 + else + sort +2 + fi | + uniq > "$nlist"S; then + : + else + $GREP -v "^: " < "$nlist" > "$nlist"S + fi + + if test -f "$nlist"S; then + eval "$global_symbol_to_cdecl"' < "$nlist"S >> "$output_objdir/$my_dlsyms"' + else + echo '/* NONE */' >> "$output_objdir/$my_dlsyms" + fi + + echo >> "$output_objdir/$my_dlsyms" "\ + +/* The mapping between symbol names and symbols. */ +typedef struct { + const char *name; + void *address; +} lt_dlsymlist; +extern LT_DLSYM_CONST lt_dlsymlist +lt_${my_prefix}_LTX_preloaded_symbols[]; +LT_DLSYM_CONST lt_dlsymlist +lt_${my_prefix}_LTX_preloaded_symbols[] = +{\ + { \"$my_originator\", (void *) 0 }," + + case $need_lib_prefix in + no) + eval "$global_symbol_to_c_name_address" < "$nlist" >> "$output_objdir/$my_dlsyms" + ;; + *) + eval "$global_symbol_to_c_name_address_lib_prefix" < "$nlist" >> "$output_objdir/$my_dlsyms" + ;; + esac + echo >> "$output_objdir/$my_dlsyms" "\ + {0, (void *) 0} +}; + +/* This works around a problem in FreeBSD linker */ +#ifdef FREEBSD_WORKAROUND +static const void *lt_preloaded_setup() { + return lt_${my_prefix}_LTX_preloaded_symbols; +} +#endif + +#ifdef __cplusplus +} +#endif\ +" + } # !$opt_dry_run + + pic_flag_for_symtable= + case "$compile_command " in + *" -static "*) ;; + *) + case $host in + # compiling the symbol table file with pic_flag works around + # a FreeBSD bug that causes programs to crash when -lm is + # linked before any other PIC object. But we must not use + # pic_flag when linking with -static. The problem exists in + # FreeBSD 2.2.6 and is fixed in FreeBSD 3.1. + *-*-freebsd2.*|*-*-freebsd3.0*|*-*-freebsdelf3.0*) + pic_flag_for_symtable=" $pic_flag -DFREEBSD_WORKAROUND" ;; + *-*-hpux*) + pic_flag_for_symtable=" $pic_flag" ;; + *) + if test "X$my_pic_p" != Xno; then + pic_flag_for_symtable=" $pic_flag" + fi + ;; + esac + ;; + esac + symtab_cflags= + for arg in $LTCFLAGS; do + case $arg in + -pie | -fpie | -fPIE) ;; + *) func_append symtab_cflags " $arg" ;; + esac + done + + # Now compile the dynamic symbol file. + func_show_eval '(cd $output_objdir && $LTCC$symtab_cflags -c$no_builtin_flag$pic_flag_for_symtable "$my_dlsyms")' 'exit $?' + + # Clean up the generated files. + func_show_eval '$RM "$output_objdir/$my_dlsyms" "$nlist" "${nlist}S" "${nlist}T"' + + # Transform the symbol file into the correct name. + symfileobj="$output_objdir/${my_outputname}S.$objext" + case $host in + *cygwin* | *mingw* | *cegcc* ) + if test -f "$output_objdir/$my_outputname.def"; then + compile_command=`$ECHO "$compile_command" | $SED "s%@SYMFILE@%$output_objdir/$my_outputname.def $symfileobj%"` + finalize_command=`$ECHO "$finalize_command" | $SED "s%@SYMFILE@%$output_objdir/$my_outputname.def $symfileobj%"` + else + compile_command=`$ECHO "$compile_command" | $SED "s%@SYMFILE@%$symfileobj%"` + finalize_command=`$ECHO "$finalize_command" | $SED "s%@SYMFILE@%$symfileobj%"` + fi + ;; + *) + compile_command=`$ECHO "$compile_command" | $SED "s%@SYMFILE@%$symfileobj%"` + finalize_command=`$ECHO "$finalize_command" | $SED "s%@SYMFILE@%$symfileobj%"` + ;; + esac + ;; + *) + func_fatal_error "unknown suffix for \`$my_dlsyms'" + ;; + esac + else + # We keep going just in case the user didn't refer to + # lt_preloaded_symbols. The linker will fail if global_symbol_pipe + # really was required. + + # Nullify the symbol file. + compile_command=`$ECHO "$compile_command" | $SED "s% @SYMFILE@%%"` + finalize_command=`$ECHO "$finalize_command" | $SED "s% @SYMFILE@%%"` + fi +} + +# func_win32_libid arg +# return the library type of file 'arg' +# +# Need a lot of goo to handle *both* DLLs and import libs +# Has to be a shell function in order to 'eat' the argument +# that is supplied when $file_magic_command is called. +# Despite the name, also deal with 64 bit binaries. +func_win32_libid () +{ + $opt_debug + win32_libid_type="unknown" + win32_fileres=`file -L $1 2>/dev/null` + case $win32_fileres in + *ar\ archive\ import\ library*) # definitely import + win32_libid_type="x86 archive import" + ;; + *ar\ archive*) # could be an import, or static + # Keep the egrep pattern in sync with the one in _LT_CHECK_MAGIC_METHOD. + if eval $OBJDUMP -f $1 | $SED -e '10q' 2>/dev/null | + $EGREP 'file format (pei*-i386(.*architecture: i386)?|pe-arm-wince|pe-x86-64)' >/dev/null; then + func_to_tool_file "$1" func_convert_file_msys_to_w32 + win32_nmres=`eval $NM -f posix -A \"$func_to_tool_file_result\" | + $SED -n -e ' + 1,100{ + / I /{ + s,.*,import, + p + q + } + }'` + case $win32_nmres in + import*) win32_libid_type="x86 archive import";; + *) win32_libid_type="x86 archive static";; + esac + fi + ;; + *DLL*) + win32_libid_type="x86 DLL" + ;; + *executable*) # but shell scripts are "executable" too... + case $win32_fileres in + *MS\ Windows\ PE\ Intel*) + win32_libid_type="x86 DLL" + ;; + esac + ;; + esac + $ECHO "$win32_libid_type" +} + +# func_cygming_dll_for_implib ARG +# +# Platform-specific function to extract the +# name of the DLL associated with the specified +# import library ARG. +# Invoked by eval'ing the libtool variable +# $sharedlib_from_linklib_cmd +# Result is available in the variable +# $sharedlib_from_linklib_result +func_cygming_dll_for_implib () +{ + $opt_debug + sharedlib_from_linklib_result=`$DLLTOOL --identify-strict --identify "$1"` +} + +# func_cygming_dll_for_implib_fallback_core SECTION_NAME LIBNAMEs +# +# The is the core of a fallback implementation of a +# platform-specific function to extract the name of the +# DLL associated with the specified import library LIBNAME. +# +# SECTION_NAME is either .idata$6 or .idata$7, depending +# on the platform and compiler that created the implib. +# +# Echos the name of the DLL associated with the +# specified import library. +func_cygming_dll_for_implib_fallback_core () +{ + $opt_debug + match_literal=`$ECHO "$1" | $SED "$sed_make_literal_regex"` + $OBJDUMP -s --section "$1" "$2" 2>/dev/null | + $SED '/^Contents of section '"$match_literal"':/{ + # Place marker at beginning of archive member dllname section + s/.*/====MARK====/ + p + d + } + # These lines can sometimes be longer than 43 characters, but + # are always uninteresting + /:[ ]*file format pe[i]\{,1\}-/d + /^In archive [^:]*:/d + # Ensure marker is printed + /^====MARK====/p + # Remove all lines with less than 43 characters + /^.\{43\}/!d + # From remaining lines, remove first 43 characters + s/^.\{43\}//' | + $SED -n ' + # Join marker and all lines until next marker into a single line + /^====MARK====/ b para + H + $ b para + b + :para + x + s/\n//g + # Remove the marker + s/^====MARK====// + # Remove trailing dots and whitespace + s/[\. \t]*$// + # Print + /./p' | + # we now have a list, one entry per line, of the stringified + # contents of the appropriate section of all members of the + # archive which possess that section. Heuristic: eliminate + # all those which have a first or second character that is + # a '.' (that is, objdump's representation of an unprintable + # character.) This should work for all archives with less than + # 0x302f exports -- but will fail for DLLs whose name actually + # begins with a literal '.' or a single character followed by + # a '.'. + # + # Of those that remain, print the first one. + $SED -e '/^\./d;/^.\./d;q' +} + +# func_cygming_gnu_implib_p ARG +# This predicate returns with zero status (TRUE) if +# ARG is a GNU/binutils-style import library. Returns +# with nonzero status (FALSE) otherwise. +func_cygming_gnu_implib_p () +{ + $opt_debug + func_to_tool_file "$1" func_convert_file_msys_to_w32 + func_cygming_gnu_implib_tmp=`$NM "$func_to_tool_file_result" | eval "$global_symbol_pipe" | $EGREP ' (_head_[A-Za-z0-9_]+_[ad]l*|[A-Za-z0-9_]+_[ad]l*_iname)$'` + test -n "$func_cygming_gnu_implib_tmp" +} + +# func_cygming_ms_implib_p ARG +# This predicate returns with zero status (TRUE) if +# ARG is an MS-style import library. Returns +# with nonzero status (FALSE) otherwise. +func_cygming_ms_implib_p () +{ + $opt_debug + func_to_tool_file "$1" func_convert_file_msys_to_w32 + func_cygming_ms_implib_tmp=`$NM "$func_to_tool_file_result" | eval "$global_symbol_pipe" | $GREP '_NULL_IMPORT_DESCRIPTOR'` + test -n "$func_cygming_ms_implib_tmp" +} + +# func_cygming_dll_for_implib_fallback ARG +# Platform-specific function to extract the +# name of the DLL associated with the specified +# import library ARG. +# +# This fallback implementation is for use when $DLLTOOL +# does not support the --identify-strict option. +# Invoked by eval'ing the libtool variable +# $sharedlib_from_linklib_cmd +# Result is available in the variable +# $sharedlib_from_linklib_result +func_cygming_dll_for_implib_fallback () +{ + $opt_debug + if func_cygming_gnu_implib_p "$1" ; then + # binutils import library + sharedlib_from_linklib_result=`func_cygming_dll_for_implib_fallback_core '.idata$7' "$1"` + elif func_cygming_ms_implib_p "$1" ; then + # ms-generated import library + sharedlib_from_linklib_result=`func_cygming_dll_for_implib_fallback_core '.idata$6' "$1"` + else + # unknown + sharedlib_from_linklib_result="" + fi +} + + +# func_extract_an_archive dir oldlib +func_extract_an_archive () +{ + $opt_debug + f_ex_an_ar_dir="$1"; shift + f_ex_an_ar_oldlib="$1" + if test "$lock_old_archive_extraction" = yes; then + lockfile=$f_ex_an_ar_oldlib.lock + until $opt_dry_run || ln "$progpath" "$lockfile" 2>/dev/null; do + func_echo "Waiting for $lockfile to be removed" + sleep 2 + done + fi + func_show_eval "(cd \$f_ex_an_ar_dir && $AR x \"\$f_ex_an_ar_oldlib\")" \ + 'stat=$?; rm -f "$lockfile"; exit $stat' + if test "$lock_old_archive_extraction" = yes; then + $opt_dry_run || rm -f "$lockfile" + fi + if ($AR t "$f_ex_an_ar_oldlib" | sort | sort -uc >/dev/null 2>&1); then + : + else + func_fatal_error "object name conflicts in archive: $f_ex_an_ar_dir/$f_ex_an_ar_oldlib" + fi +} + + +# func_extract_archives gentop oldlib ... +func_extract_archives () +{ + $opt_debug + my_gentop="$1"; shift + my_oldlibs=${1+"$@"} + my_oldobjs="" + my_xlib="" + my_xabs="" + my_xdir="" + + for my_xlib in $my_oldlibs; do + # Extract the objects. + case $my_xlib in + [\\/]* | [A-Za-z]:[\\/]*) my_xabs="$my_xlib" ;; + *) my_xabs=`pwd`"/$my_xlib" ;; + esac + func_basename "$my_xlib" + my_xlib="$func_basename_result" + my_xlib_u=$my_xlib + while :; do + case " $extracted_archives " in + *" $my_xlib_u "*) + func_arith $extracted_serial + 1 + extracted_serial=$func_arith_result + my_xlib_u=lt$extracted_serial-$my_xlib ;; + *) break ;; + esac + done + extracted_archives="$extracted_archives $my_xlib_u" + my_xdir="$my_gentop/$my_xlib_u" + + func_mkdir_p "$my_xdir" + + case $host in + *-darwin*) + func_verbose "Extracting $my_xabs" + # Do not bother doing anything if just a dry run + $opt_dry_run || { + darwin_orig_dir=`pwd` + cd $my_xdir || exit $? + darwin_archive=$my_xabs + darwin_curdir=`pwd` + darwin_base_archive=`basename "$darwin_archive"` + darwin_arches=`$LIPO -info "$darwin_archive" 2>/dev/null | $GREP Architectures 2>/dev/null || true` + if test -n "$darwin_arches"; then + darwin_arches=`$ECHO "$darwin_arches" | $SED -e 's/.*are://'` + darwin_arch= + func_verbose "$darwin_base_archive has multiple architectures $darwin_arches" + for darwin_arch in $darwin_arches ; do + func_mkdir_p "unfat-$$/${darwin_base_archive}-${darwin_arch}" + $LIPO -thin $darwin_arch -output "unfat-$$/${darwin_base_archive}-${darwin_arch}/${darwin_base_archive}" "${darwin_archive}" + cd "unfat-$$/${darwin_base_archive}-${darwin_arch}" + func_extract_an_archive "`pwd`" "${darwin_base_archive}" + cd "$darwin_curdir" + $RM "unfat-$$/${darwin_base_archive}-${darwin_arch}/${darwin_base_archive}" + done # $darwin_arches + ## Okay now we've a bunch of thin objects, gotta fatten them up :) + darwin_filelist=`find unfat-$$ -type f -name \*.o -print -o -name \*.lo -print | $SED -e "$basename" | sort -u` + darwin_file= + darwin_files= + for darwin_file in $darwin_filelist; do + darwin_files=`find unfat-$$ -name $darwin_file -print | sort | $NL2SP` + $LIPO -create -output "$darwin_file" $darwin_files + done # $darwin_filelist + $RM -rf unfat-$$ + cd "$darwin_orig_dir" + else + cd $darwin_orig_dir + func_extract_an_archive "$my_xdir" "$my_xabs" + fi # $darwin_arches + } # !$opt_dry_run + ;; + *) + func_extract_an_archive "$my_xdir" "$my_xabs" + ;; + esac + my_oldobjs="$my_oldobjs "`find $my_xdir -name \*.$objext -print -o -name \*.lo -print | sort | $NL2SP` + done + + func_extract_archives_result="$my_oldobjs" +} + + +# func_emit_wrapper [arg=no] +# +# Emit a libtool wrapper script on stdout. +# Don't directly open a file because we may want to +# incorporate the script contents within a cygwin/mingw +# wrapper executable. Must ONLY be called from within +# func_mode_link because it depends on a number of variables +# set therein. +# +# ARG is the value that the WRAPPER_SCRIPT_BELONGS_IN_OBJDIR +# variable will take. If 'yes', then the emitted script +# will assume that the directory in which it is stored is +# the $objdir directory. This is a cygwin/mingw-specific +# behavior. +func_emit_wrapper () +{ + func_emit_wrapper_arg1=${1-no} + + $ECHO "\ +#! $SHELL + +# $output - temporary wrapper script for $objdir/$outputname +# Generated by $PROGRAM (GNU $PACKAGE$TIMESTAMP) $VERSION +# +# The $output program cannot be directly executed until all the libtool +# libraries that it depends on are installed. +# +# This wrapper script should never be moved out of the build directory. +# If it is, it will not operate correctly. + +# Sed substitution that helps us do robust quoting. It backslashifies +# metacharacters that are still active within double-quoted strings. +sed_quote_subst='$sed_quote_subst' + +# Be Bourne compatible +if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then + emulate sh + NULLCMD=: + # Zsh 3.x and 4.x performs word splitting on \${1+\"\$@\"}, which + # is contrary to our usage. Disable this feature. + alias -g '\${1+\"\$@\"}'='\"\$@\"' + setopt NO_GLOB_SUBST +else + case \`(set -o) 2>/dev/null\` in *posix*) set -o posix;; esac +fi +BIN_SH=xpg4; export BIN_SH # for Tru64 +DUALCASE=1; export DUALCASE # for MKS sh + +# The HP-UX ksh and POSIX shell print the target directory to stdout +# if CDPATH is set. +(unset CDPATH) >/dev/null 2>&1 && unset CDPATH + +relink_command=\"$relink_command\" + +# This environment variable determines our operation mode. +if test \"\$libtool_install_magic\" = \"$magic\"; then + # install mode needs the following variables: + generated_by_libtool_version='$macro_version' + notinst_deplibs='$notinst_deplibs' +else + # When we are sourced in execute mode, \$file and \$ECHO are already set. + if test \"\$libtool_execute_magic\" != \"$magic\"; then + file=\"\$0\"" + + qECHO=`$ECHO "$ECHO" | $SED "$sed_quote_subst"` + $ECHO "\ + +# A function that is used when there is no print builtin or printf. +func_fallback_echo () +{ + eval 'cat <<_LTECHO_EOF +\$1 +_LTECHO_EOF' +} + ECHO=\"$qECHO\" + fi + +# Very basic option parsing. These options are (a) specific to +# the libtool wrapper, (b) are identical between the wrapper +# /script/ and the wrapper /executable/ which is used only on +# windows platforms, and (c) all begin with the string "--lt-" +# (application programs are unlikely to have options which match +# this pattern). +# +# There are only two supported options: --lt-debug and +# --lt-dump-script. There is, deliberately, no --lt-help. +# +# The first argument to this parsing function should be the +# script's $0 value, followed by "$@". +lt_option_debug= +func_parse_lt_options () +{ + lt_script_arg0=\$0 + shift + for lt_opt + do + case \"\$lt_opt\" in + --lt-debug) lt_option_debug=1 ;; + --lt-dump-script) + lt_dump_D=\`\$ECHO \"X\$lt_script_arg0\" | $SED -e 's/^X//' -e 's%/[^/]*$%%'\` + test \"X\$lt_dump_D\" = \"X\$lt_script_arg0\" && lt_dump_D=. + lt_dump_F=\`\$ECHO \"X\$lt_script_arg0\" | $SED -e 's/^X//' -e 's%^.*/%%'\` + cat \"\$lt_dump_D/\$lt_dump_F\" + exit 0 + ;; + --lt-*) + \$ECHO \"Unrecognized --lt- option: '\$lt_opt'\" 1>&2 + exit 1 + ;; + esac + done + + # Print the debug banner immediately: + if test -n \"\$lt_option_debug\"; then + echo \"${outputname}:${output}:\${LINENO}: libtool wrapper (GNU $PACKAGE$TIMESTAMP) $VERSION\" 1>&2 + fi +} + +# Used when --lt-debug. Prints its arguments to stdout +# (redirection is the responsibility of the caller) +func_lt_dump_args () +{ + lt_dump_args_N=1; + for lt_arg + do + \$ECHO \"${outputname}:${output}:\${LINENO}: newargv[\$lt_dump_args_N]: \$lt_arg\" + lt_dump_args_N=\`expr \$lt_dump_args_N + 1\` + done +} + +# Core function for launching the target application +func_exec_program_core () +{ +" + case $host in + # Backslashes separate directories on plain windows + *-*-mingw | *-*-os2* | *-cegcc*) + $ECHO "\ + if test -n \"\$lt_option_debug\"; then + \$ECHO \"${outputname}:${output}:\${LINENO}: newargv[0]: \$progdir\\\\\$program\" 1>&2 + func_lt_dump_args \${1+\"\$@\"} 1>&2 + fi + exec \"\$progdir\\\\\$program\" \${1+\"\$@\"} +" + ;; + + *) + $ECHO "\ + if test -n \"\$lt_option_debug\"; then + \$ECHO \"${outputname}:${output}:\${LINENO}: newargv[0]: \$progdir/\$program\" 1>&2 + func_lt_dump_args \${1+\"\$@\"} 1>&2 + fi + exec \"\$progdir/\$program\" \${1+\"\$@\"} +" + ;; + esac + $ECHO "\ + \$ECHO \"\$0: cannot exec \$program \$*\" 1>&2 + exit 1 +} + +# A function to encapsulate launching the target application +# Strips options in the --lt-* namespace from \$@ and +# launches target application with the remaining arguments. +func_exec_program () +{ + case \" \$* \" in + *\\ --lt-*) + for lt_wr_arg + do + case \$lt_wr_arg in + --lt-*) ;; + *) set x \"\$@\" \"\$lt_wr_arg\"; shift;; + esac + shift + done ;; + esac + func_exec_program_core \${1+\"\$@\"} +} + + # Parse options + func_parse_lt_options \"\$0\" \${1+\"\$@\"} + + # Find the directory that this script lives in. + thisdir=\`\$ECHO \"\$file\" | $SED 's%/[^/]*$%%'\` + test \"x\$thisdir\" = \"x\$file\" && thisdir=. + + # Follow symbolic links until we get to the real thisdir. + file=\`ls -ld \"\$file\" | $SED -n 's/.*-> //p'\` + while test -n \"\$file\"; do + destdir=\`\$ECHO \"\$file\" | $SED 's%/[^/]*\$%%'\` + + # If there was a directory component, then change thisdir. + if test \"x\$destdir\" != \"x\$file\"; then + case \"\$destdir\" in + [\\\\/]* | [A-Za-z]:[\\\\/]*) thisdir=\"\$destdir\" ;; + *) thisdir=\"\$thisdir/\$destdir\" ;; + esac + fi + + file=\`\$ECHO \"\$file\" | $SED 's%^.*/%%'\` + file=\`ls -ld \"\$thisdir/\$file\" | $SED -n 's/.*-> //p'\` + done + + # Usually 'no', except on cygwin/mingw when embedded into + # the cwrapper. + WRAPPER_SCRIPT_BELONGS_IN_OBJDIR=$func_emit_wrapper_arg1 + if test \"\$WRAPPER_SCRIPT_BELONGS_IN_OBJDIR\" = \"yes\"; then + # special case for '.' + if test \"\$thisdir\" = \".\"; then + thisdir=\`pwd\` + fi + # remove .libs from thisdir + case \"\$thisdir\" in + *[\\\\/]$objdir ) thisdir=\`\$ECHO \"\$thisdir\" | $SED 's%[\\\\/][^\\\\/]*$%%'\` ;; + $objdir ) thisdir=. ;; + esac + fi + + # Try to get the absolute directory name. + absdir=\`cd \"\$thisdir\" && pwd\` + test -n \"\$absdir\" && thisdir=\"\$absdir\" +" + + if test "$fast_install" = yes; then + $ECHO "\ + program=lt-'$outputname'$exeext + progdir=\"\$thisdir/$objdir\" + + if test ! -f \"\$progdir/\$program\" || + { file=\`ls -1dt \"\$progdir/\$program\" \"\$progdir/../\$program\" 2>/dev/null | ${SED} 1q\`; \\ + test \"X\$file\" != \"X\$progdir/\$program\"; }; then + + file=\"\$\$-\$program\" + + if test ! -d \"\$progdir\"; then + $MKDIR \"\$progdir\" + else + $RM \"\$progdir/\$file\" + fi" + + $ECHO "\ + + # relink executable if necessary + if test -n \"\$relink_command\"; then + if relink_command_output=\`eval \$relink_command 2>&1\`; then : + else + $ECHO \"\$relink_command_output\" >&2 + $RM \"\$progdir/\$file\" + exit 1 + fi + fi + + $MV \"\$progdir/\$file\" \"\$progdir/\$program\" 2>/dev/null || + { $RM \"\$progdir/\$program\"; + $MV \"\$progdir/\$file\" \"\$progdir/\$program\"; } + $RM \"\$progdir/\$file\" + fi" + else + $ECHO "\ + program='$outputname' + progdir=\"\$thisdir/$objdir\" +" + fi + + $ECHO "\ + + if test -f \"\$progdir/\$program\"; then" + + # fixup the dll searchpath if we need to. + # + # Fix the DLL searchpath if we need to. Do this before prepending + # to shlibpath, because on Windows, both are PATH and uninstalled + # libraries must come first. + if test -n "$dllsearchpath"; then + $ECHO "\ + # Add the dll search path components to the executable PATH + PATH=$dllsearchpath:\$PATH +" + fi + + # Export our shlibpath_var if we have one. + if test "$shlibpath_overrides_runpath" = yes && test -n "$shlibpath_var" && test -n "$temp_rpath"; then + $ECHO "\ + # Add our own library path to $shlibpath_var + $shlibpath_var=\"$temp_rpath\$$shlibpath_var\" + + # Some systems cannot cope with colon-terminated $shlibpath_var + # The second colon is a workaround for a bug in BeOS R4 sed + $shlibpath_var=\`\$ECHO \"\$$shlibpath_var\" | $SED 's/::*\$//'\` + + export $shlibpath_var +" + fi + + $ECHO "\ + if test \"\$libtool_execute_magic\" != \"$magic\"; then + # Run the actual program with our arguments. + func_exec_program \${1+\"\$@\"} + fi + else + # The program doesn't exist. + \$ECHO \"\$0: error: \\\`\$progdir/\$program' does not exist\" 1>&2 + \$ECHO \"This script is just a wrapper for \$program.\" 1>&2 + \$ECHO \"See the $PACKAGE documentation for more information.\" 1>&2 + exit 1 + fi +fi\ +" +} + + +# func_emit_cwrapperexe_src +# emit the source code for a wrapper executable on stdout +# Must ONLY be called from within func_mode_link because +# it depends on a number of variable set therein. +func_emit_cwrapperexe_src () +{ + cat < +#include +#ifdef _MSC_VER +# include +# include +# include +#else +# include +# include +# ifdef __CYGWIN__ +# include +# endif +#endif +#include +#include +#include +#include +#include +#include +#include +#include + +/* declarations of non-ANSI functions */ +#if defined(__MINGW32__) +# ifdef __STRICT_ANSI__ +int _putenv (const char *); +# endif +#elif defined(__CYGWIN__) +# ifdef __STRICT_ANSI__ +char *realpath (const char *, char *); +int putenv (char *); +int setenv (const char *, const char *, int); +# endif +/* #elif defined (other platforms) ... */ +#endif + +/* portability defines, excluding path handling macros */ +#if defined(_MSC_VER) +# define setmode _setmode +# define stat _stat +# define chmod _chmod +# define getcwd _getcwd +# define putenv _putenv +# define S_IXUSR _S_IEXEC +# ifndef _INTPTR_T_DEFINED +# define _INTPTR_T_DEFINED +# define intptr_t int +# endif +#elif defined(__MINGW32__) +# define setmode _setmode +# define stat _stat +# define chmod _chmod +# define getcwd _getcwd +# define putenv _putenv +#elif defined(__CYGWIN__) +# define HAVE_SETENV +# define FOPEN_WB "wb" +/* #elif defined (other platforms) ... */ +#endif + +#if defined(PATH_MAX) +# define LT_PATHMAX PATH_MAX +#elif defined(MAXPATHLEN) +# define LT_PATHMAX MAXPATHLEN +#else +# define LT_PATHMAX 1024 +#endif + +#ifndef S_IXOTH +# define S_IXOTH 0 +#endif +#ifndef S_IXGRP +# define S_IXGRP 0 +#endif + +/* path handling portability macros */ +#ifndef DIR_SEPARATOR +# define DIR_SEPARATOR '/' +# define PATH_SEPARATOR ':' +#endif + +#if defined (_WIN32) || defined (__MSDOS__) || defined (__DJGPP__) || \ + defined (__OS2__) +# define HAVE_DOS_BASED_FILE_SYSTEM +# define FOPEN_WB "wb" +# ifndef DIR_SEPARATOR_2 +# define DIR_SEPARATOR_2 '\\' +# endif +# ifndef PATH_SEPARATOR_2 +# define PATH_SEPARATOR_2 ';' +# endif +#endif + +#ifndef DIR_SEPARATOR_2 +# define IS_DIR_SEPARATOR(ch) ((ch) == DIR_SEPARATOR) +#else /* DIR_SEPARATOR_2 */ +# define IS_DIR_SEPARATOR(ch) \ + (((ch) == DIR_SEPARATOR) || ((ch) == DIR_SEPARATOR_2)) +#endif /* DIR_SEPARATOR_2 */ + +#ifndef PATH_SEPARATOR_2 +# define IS_PATH_SEPARATOR(ch) ((ch) == PATH_SEPARATOR) +#else /* PATH_SEPARATOR_2 */ +# define IS_PATH_SEPARATOR(ch) ((ch) == PATH_SEPARATOR_2) +#endif /* PATH_SEPARATOR_2 */ + +#ifndef FOPEN_WB +# define FOPEN_WB "w" +#endif +#ifndef _O_BINARY +# define _O_BINARY 0 +#endif + +#define XMALLOC(type, num) ((type *) xmalloc ((num) * sizeof(type))) +#define XFREE(stale) do { \ + if (stale) { free ((void *) stale); stale = 0; } \ +} while (0) + +#if defined(LT_DEBUGWRAPPER) +static int lt_debug = 1; +#else +static int lt_debug = 0; +#endif + +const char *program_name = "libtool-wrapper"; /* in case xstrdup fails */ + +void *xmalloc (size_t num); +char *xstrdup (const char *string); +const char *base_name (const char *name); +char *find_executable (const char *wrapper); +char *chase_symlinks (const char *pathspec); +int make_executable (const char *path); +int check_executable (const char *path); +char *strendzap (char *str, const char *pat); +void lt_debugprintf (const char *file, int line, const char *fmt, ...); +void lt_fatal (const char *file, int line, const char *message, ...); +static const char *nonnull (const char *s); +static const char *nonempty (const char *s); +void lt_setenv (const char *name, const char *value); +char *lt_extend_str (const char *orig_value, const char *add, int to_end); +void lt_update_exe_path (const char *name, const char *value); +void lt_update_lib_path (const char *name, const char *value); +char **prepare_spawn (char **argv); +void lt_dump_script (FILE *f); +EOF + + cat <= 0) + && (st.st_mode & (S_IXUSR | S_IXGRP | S_IXOTH))) + return 1; + else + return 0; +} + +int +make_executable (const char *path) +{ + int rval = 0; + struct stat st; + + lt_debugprintf (__FILE__, __LINE__, "(make_executable): %s\n", + nonempty (path)); + if ((!path) || (!*path)) + return 0; + + if (stat (path, &st) >= 0) + { + rval = chmod (path, st.st_mode | S_IXOTH | S_IXGRP | S_IXUSR); + } + return rval; +} + +/* Searches for the full path of the wrapper. Returns + newly allocated full path name if found, NULL otherwise + Does not chase symlinks, even on platforms that support them. +*/ +char * +find_executable (const char *wrapper) +{ + int has_slash = 0; + const char *p; + const char *p_next; + /* static buffer for getcwd */ + char tmp[LT_PATHMAX + 1]; + int tmp_len; + char *concat_name; + + lt_debugprintf (__FILE__, __LINE__, "(find_executable): %s\n", + nonempty (wrapper)); + + if ((wrapper == NULL) || (*wrapper == '\0')) + return NULL; + + /* Absolute path? */ +#if defined (HAVE_DOS_BASED_FILE_SYSTEM) + if (isalpha ((unsigned char) wrapper[0]) && wrapper[1] == ':') + { + concat_name = xstrdup (wrapper); + if (check_executable (concat_name)) + return concat_name; + XFREE (concat_name); + } + else + { +#endif + if (IS_DIR_SEPARATOR (wrapper[0])) + { + concat_name = xstrdup (wrapper); + if (check_executable (concat_name)) + return concat_name; + XFREE (concat_name); + } +#if defined (HAVE_DOS_BASED_FILE_SYSTEM) + } +#endif + + for (p = wrapper; *p; p++) + if (*p == '/') + { + has_slash = 1; + break; + } + if (!has_slash) + { + /* no slashes; search PATH */ + const char *path = getenv ("PATH"); + if (path != NULL) + { + for (p = path; *p; p = p_next) + { + const char *q; + size_t p_len; + for (q = p; *q; q++) + if (IS_PATH_SEPARATOR (*q)) + break; + p_len = q - p; + p_next = (*q == '\0' ? q : q + 1); + if (p_len == 0) + { + /* empty path: current directory */ + if (getcwd (tmp, LT_PATHMAX) == NULL) + lt_fatal (__FILE__, __LINE__, "getcwd failed: %s", + nonnull (strerror (errno))); + tmp_len = strlen (tmp); + concat_name = + XMALLOC (char, tmp_len + 1 + strlen (wrapper) + 1); + memcpy (concat_name, tmp, tmp_len); + concat_name[tmp_len] = '/'; + strcpy (concat_name + tmp_len + 1, wrapper); + } + else + { + concat_name = + XMALLOC (char, p_len + 1 + strlen (wrapper) + 1); + memcpy (concat_name, p, p_len); + concat_name[p_len] = '/'; + strcpy (concat_name + p_len + 1, wrapper); + } + if (check_executable (concat_name)) + return concat_name; + XFREE (concat_name); + } + } + /* not found in PATH; assume curdir */ + } + /* Relative path | not found in path: prepend cwd */ + if (getcwd (tmp, LT_PATHMAX) == NULL) + lt_fatal (__FILE__, __LINE__, "getcwd failed: %s", + nonnull (strerror (errno))); + tmp_len = strlen (tmp); + concat_name = XMALLOC (char, tmp_len + 1 + strlen (wrapper) + 1); + memcpy (concat_name, tmp, tmp_len); + concat_name[tmp_len] = '/'; + strcpy (concat_name + tmp_len + 1, wrapper); + + if (check_executable (concat_name)) + return concat_name; + XFREE (concat_name); + return NULL; +} + +char * +chase_symlinks (const char *pathspec) +{ +#ifndef S_ISLNK + return xstrdup (pathspec); +#else + char buf[LT_PATHMAX]; + struct stat s; + char *tmp_pathspec = xstrdup (pathspec); + char *p; + int has_symlinks = 0; + while (strlen (tmp_pathspec) && !has_symlinks) + { + lt_debugprintf (__FILE__, __LINE__, + "checking path component for symlinks: %s\n", + tmp_pathspec); + if (lstat (tmp_pathspec, &s) == 0) + { + if (S_ISLNK (s.st_mode) != 0) + { + has_symlinks = 1; + break; + } + + /* search backwards for last DIR_SEPARATOR */ + p = tmp_pathspec + strlen (tmp_pathspec) - 1; + while ((p > tmp_pathspec) && (!IS_DIR_SEPARATOR (*p))) + p--; + if ((p == tmp_pathspec) && (!IS_DIR_SEPARATOR (*p))) + { + /* no more DIR_SEPARATORS left */ + break; + } + *p = '\0'; + } + else + { + lt_fatal (__FILE__, __LINE__, + "error accessing file \"%s\": %s", + tmp_pathspec, nonnull (strerror (errno))); + } + } + XFREE (tmp_pathspec); + + if (!has_symlinks) + { + return xstrdup (pathspec); + } + + tmp_pathspec = realpath (pathspec, buf); + if (tmp_pathspec == 0) + { + lt_fatal (__FILE__, __LINE__, + "could not follow symlinks for %s", pathspec); + } + return xstrdup (tmp_pathspec); +#endif +} + +char * +strendzap (char *str, const char *pat) +{ + size_t len, patlen; + + assert (str != NULL); + assert (pat != NULL); + + len = strlen (str); + patlen = strlen (pat); + + if (patlen <= len) + { + str += len - patlen; + if (strcmp (str, pat) == 0) + *str = '\0'; + } + return str; +} + +void +lt_debugprintf (const char *file, int line, const char *fmt, ...) +{ + va_list args; + if (lt_debug) + { + (void) fprintf (stderr, "%s:%s:%d: ", program_name, file, line); + va_start (args, fmt); + (void) vfprintf (stderr, fmt, args); + va_end (args); + } +} + +static void +lt_error_core (int exit_status, const char *file, + int line, const char *mode, + const char *message, va_list ap) +{ + fprintf (stderr, "%s:%s:%d: %s: ", program_name, file, line, mode); + vfprintf (stderr, message, ap); + fprintf (stderr, ".\n"); + + if (exit_status >= 0) + exit (exit_status); +} + +void +lt_fatal (const char *file, int line, const char *message, ...) +{ + va_list ap; + va_start (ap, message); + lt_error_core (EXIT_FAILURE, file, line, "FATAL", message, ap); + va_end (ap); +} + +static const char * +nonnull (const char *s) +{ + return s ? s : "(null)"; +} + +static const char * +nonempty (const char *s) +{ + return (s && !*s) ? "(empty)" : nonnull (s); +} + +void +lt_setenv (const char *name, const char *value) +{ + lt_debugprintf (__FILE__, __LINE__, + "(lt_setenv) setting '%s' to '%s'\n", + nonnull (name), nonnull (value)); + { +#ifdef HAVE_SETENV + /* always make a copy, for consistency with !HAVE_SETENV */ + char *str = xstrdup (value); + setenv (name, str, 1); +#else + int len = strlen (name) + 1 + strlen (value) + 1; + char *str = XMALLOC (char, len); + sprintf (str, "%s=%s", name, value); + if (putenv (str) != EXIT_SUCCESS) + { + XFREE (str); + } +#endif + } +} + +char * +lt_extend_str (const char *orig_value, const char *add, int to_end) +{ + char *new_value; + if (orig_value && *orig_value) + { + int orig_value_len = strlen (orig_value); + int add_len = strlen (add); + new_value = XMALLOC (char, add_len + orig_value_len + 1); + if (to_end) + { + strcpy (new_value, orig_value); + strcpy (new_value + orig_value_len, add); + } + else + { + strcpy (new_value, add); + strcpy (new_value + add_len, orig_value); + } + } + else + { + new_value = xstrdup (add); + } + return new_value; +} + +void +lt_update_exe_path (const char *name, const char *value) +{ + lt_debugprintf (__FILE__, __LINE__, + "(lt_update_exe_path) modifying '%s' by prepending '%s'\n", + nonnull (name), nonnull (value)); + + if (name && *name && value && *value) + { + char *new_value = lt_extend_str (getenv (name), value, 0); + /* some systems can't cope with a ':'-terminated path #' */ + int len = strlen (new_value); + while (((len = strlen (new_value)) > 0) && IS_PATH_SEPARATOR (new_value[len-1])) + { + new_value[len-1] = '\0'; + } + lt_setenv (name, new_value); + XFREE (new_value); + } +} + +void +lt_update_lib_path (const char *name, const char *value) +{ + lt_debugprintf (__FILE__, __LINE__, + "(lt_update_lib_path) modifying '%s' by prepending '%s'\n", + nonnull (name), nonnull (value)); + + if (name && *name && value && *value) + { + char *new_value = lt_extend_str (getenv (name), value, 0); + lt_setenv (name, new_value); + XFREE (new_value); + } +} + +EOF + case $host_os in + mingw*) + cat <<"EOF" + +/* Prepares an argument vector before calling spawn(). + Note that spawn() does not by itself call the command interpreter + (getenv ("COMSPEC") != NULL ? getenv ("COMSPEC") : + ({ OSVERSIONINFO v; v.dwOSVersionInfoSize = sizeof(OSVERSIONINFO); + GetVersionEx(&v); + v.dwPlatformId == VER_PLATFORM_WIN32_NT; + }) ? "cmd.exe" : "command.com"). + Instead it simply concatenates the arguments, separated by ' ', and calls + CreateProcess(). We must quote the arguments since Win32 CreateProcess() + interprets characters like ' ', '\t', '\\', '"' (but not '<' and '>') in a + special way: + - Space and tab are interpreted as delimiters. They are not treated as + delimiters if they are surrounded by double quotes: "...". + - Unescaped double quotes are removed from the input. Their only effect is + that within double quotes, space and tab are treated like normal + characters. + - Backslashes not followed by double quotes are not special. + - But 2*n+1 backslashes followed by a double quote become + n backslashes followed by a double quote (n >= 0): + \" -> " + \\\" -> \" + \\\\\" -> \\" + */ +#define SHELL_SPECIAL_CHARS "\"\\ \001\002\003\004\005\006\007\010\011\012\013\014\015\016\017\020\021\022\023\024\025\026\027\030\031\032\033\034\035\036\037" +#define SHELL_SPACE_CHARS " \001\002\003\004\005\006\007\010\011\012\013\014\015\016\017\020\021\022\023\024\025\026\027\030\031\032\033\034\035\036\037" +char ** +prepare_spawn (char **argv) +{ + size_t argc; + char **new_argv; + size_t i; + + /* Count number of arguments. */ + for (argc = 0; argv[argc] != NULL; argc++) + ; + + /* Allocate new argument vector. */ + new_argv = XMALLOC (char *, argc + 1); + + /* Put quoted arguments into the new argument vector. */ + for (i = 0; i < argc; i++) + { + const char *string = argv[i]; + + if (string[0] == '\0') + new_argv[i] = xstrdup ("\"\""); + else if (strpbrk (string, SHELL_SPECIAL_CHARS) != NULL) + { + int quote_around = (strpbrk (string, SHELL_SPACE_CHARS) != NULL); + size_t length; + unsigned int backslashes; + const char *s; + char *quoted_string; + char *p; + + length = 0; + backslashes = 0; + if (quote_around) + length++; + for (s = string; *s != '\0'; s++) + { + char c = *s; + if (c == '"') + length += backslashes + 1; + length++; + if (c == '\\') + backslashes++; + else + backslashes = 0; + } + if (quote_around) + length += backslashes + 1; + + quoted_string = XMALLOC (char, length + 1); + + p = quoted_string; + backslashes = 0; + if (quote_around) + *p++ = '"'; + for (s = string; *s != '\0'; s++) + { + char c = *s; + if (c == '"') + { + unsigned int j; + for (j = backslashes + 1; j > 0; j--) + *p++ = '\\'; + } + *p++ = c; + if (c == '\\') + backslashes++; + else + backslashes = 0; + } + if (quote_around) + { + unsigned int j; + for (j = backslashes; j > 0; j--) + *p++ = '\\'; + *p++ = '"'; + } + *p = '\0'; + + new_argv[i] = quoted_string; + } + else + new_argv[i] = (char *) string; + } + new_argv[argc] = NULL; + + return new_argv; +} +EOF + ;; + esac + + cat <<"EOF" +void lt_dump_script (FILE* f) +{ +EOF + func_emit_wrapper yes | + $SED -n -e ' +s/^\(.\{79\}\)\(..*\)/\1\ +\2/ +h +s/\([\\"]\)/\\\1/g +s/$/\\n/ +s/\([^\n]*\).*/ fputs ("\1", f);/p +g +D' + cat <<"EOF" +} +EOF +} +# end: func_emit_cwrapperexe_src + +# func_win32_import_lib_p ARG +# True if ARG is an import lib, as indicated by $file_magic_cmd +func_win32_import_lib_p () +{ + $opt_debug + case `eval $file_magic_cmd \"\$1\" 2>/dev/null | $SED -e 10q` in + *import*) : ;; + *) false ;; + esac +} + +# func_mode_link arg... +func_mode_link () +{ + $opt_debug + case $host in + *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*) + # It is impossible to link a dll without this setting, and + # we shouldn't force the makefile maintainer to figure out + # which system we are compiling for in order to pass an extra + # flag for every libtool invocation. + # allow_undefined=no + + # FIXME: Unfortunately, there are problems with the above when trying + # to make a dll which has undefined symbols, in which case not + # even a static library is built. For now, we need to specify + # -no-undefined on the libtool link line when we can be certain + # that all symbols are satisfied, otherwise we get a static library. + allow_undefined=yes + ;; + *) + allow_undefined=yes + ;; + esac + libtool_args=$nonopt + base_compile="$nonopt $@" + compile_command=$nonopt + finalize_command=$nonopt + + compile_rpath= + finalize_rpath= + compile_shlibpath= + finalize_shlibpath= + convenience= + old_convenience= + deplibs= + old_deplibs= + compiler_flags= + linker_flags= + dllsearchpath= + lib_search_path=`pwd` + inst_prefix_dir= + new_inherited_linker_flags= + + avoid_version=no + bindir= + dlfiles= + dlprefiles= + dlself=no + export_dynamic=no + export_symbols= + export_symbols_regex= + generated= + libobjs= + ltlibs= + module=no + no_install=no + objs= + non_pic_objects= + precious_files_regex= + prefer_static_libs=no + preload=no + prev= + prevarg= + release= + rpath= + xrpath= + perm_rpath= + temp_rpath= + thread_safe=no + vinfo= + vinfo_number=no + weak_libs= + single_module="${wl}-single_module" + func_infer_tag $base_compile + + # We need to know -static, to get the right output filenames. + for arg + do + case $arg in + -shared) + test "$build_libtool_libs" != yes && \ + func_fatal_configuration "can not build a shared library" + build_old_libs=no + break + ;; + -all-static | -static | -static-libtool-libs) + case $arg in + -all-static) + if test "$build_libtool_libs" = yes && test -z "$link_static_flag"; then + func_warning "complete static linking is impossible in this configuration" + fi + if test -n "$link_static_flag"; then + dlopen_self=$dlopen_self_static + fi + prefer_static_libs=yes + ;; + -static) + if test -z "$pic_flag" && test -n "$link_static_flag"; then + dlopen_self=$dlopen_self_static + fi + prefer_static_libs=built + ;; + -static-libtool-libs) + if test -z "$pic_flag" && test -n "$link_static_flag"; then + dlopen_self=$dlopen_self_static + fi + prefer_static_libs=yes + ;; + esac + build_libtool_libs=no + build_old_libs=yes + break + ;; + esac + done + + # See if our shared archives depend on static archives. + test -n "$old_archive_from_new_cmds" && build_old_libs=yes + + # Go through the arguments, transforming them on the way. + while test "$#" -gt 0; do + arg="$1" + shift + func_quote_for_eval "$arg" + qarg=$func_quote_for_eval_unquoted_result + func_append libtool_args " $func_quote_for_eval_result" + + # If the previous option needs an argument, assign it. + if test -n "$prev"; then + case $prev in + output) + func_append compile_command " @OUTPUT@" + func_append finalize_command " @OUTPUT@" + ;; + esac + + case $prev in + bindir) + bindir="$arg" + prev= + continue + ;; + dlfiles|dlprefiles) + if test "$preload" = no; then + # Add the symbol object into the linking commands. + func_append compile_command " @SYMFILE@" + func_append finalize_command " @SYMFILE@" + preload=yes + fi + case $arg in + *.la | *.lo) ;; # We handle these cases below. + force) + if test "$dlself" = no; then + dlself=needless + export_dynamic=yes + fi + prev= + continue + ;; + self) + if test "$prev" = dlprefiles; then + dlself=yes + elif test "$prev" = dlfiles && test "$dlopen_self" != yes; then + dlself=yes + else + dlself=needless + export_dynamic=yes + fi + prev= + continue + ;; + *) + if test "$prev" = dlfiles; then + func_append dlfiles " $arg" + else + func_append dlprefiles " $arg" + fi + prev= + continue + ;; + esac + ;; + expsyms) + export_symbols="$arg" + test -f "$arg" \ + || func_fatal_error "symbol file \`$arg' does not exist" + prev= + continue + ;; + expsyms_regex) + export_symbols_regex="$arg" + prev= + continue + ;; + framework) + case $host in + *-*-darwin*) + case "$deplibs " in + *" $qarg.ltframework "*) ;; + *) func_append deplibs " $qarg.ltframework" # this is fixed later + ;; + esac + ;; + esac + prev= + continue + ;; + inst_prefix) + inst_prefix_dir="$arg" + prev= + continue + ;; + objectlist) + if test -f "$arg"; then + save_arg=$arg + moreargs= + for fil in `cat "$save_arg"` + do +# func_append moreargs " $fil" + arg=$fil + # A libtool-controlled object. + + # Check to see that this really is a libtool object. + if func_lalib_unsafe_p "$arg"; then + pic_object= + non_pic_object= + + # Read the .lo file + func_source "$arg" + + if test -z "$pic_object" || + test -z "$non_pic_object" || + test "$pic_object" = none && + test "$non_pic_object" = none; then + func_fatal_error "cannot find name of object for \`$arg'" + fi + + # Extract subdirectory from the argument. + func_dirname "$arg" "/" "" + xdir="$func_dirname_result" + + if test "$pic_object" != none; then + # Prepend the subdirectory the object is found in. + pic_object="$xdir$pic_object" + + if test "$prev" = dlfiles; then + if test "$build_libtool_libs" = yes && test "$dlopen_support" = yes; then + func_append dlfiles " $pic_object" + prev= + continue + else + # If libtool objects are unsupported, then we need to preload. + prev=dlprefiles + fi + fi + + # CHECK ME: I think I busted this. -Ossama + if test "$prev" = dlprefiles; then + # Preload the old-style object. + func_append dlprefiles " $pic_object" + prev= + fi + + # A PIC object. + func_append libobjs " $pic_object" + arg="$pic_object" + fi + + # Non-PIC object. + if test "$non_pic_object" != none; then + # Prepend the subdirectory the object is found in. + non_pic_object="$xdir$non_pic_object" + + # A standard non-PIC object + func_append non_pic_objects " $non_pic_object" + if test -z "$pic_object" || test "$pic_object" = none ; then + arg="$non_pic_object" + fi + else + # If the PIC object exists, use it instead. + # $xdir was prepended to $pic_object above. + non_pic_object="$pic_object" + func_append non_pic_objects " $non_pic_object" + fi + else + # Only an error if not doing a dry-run. + if $opt_dry_run; then + # Extract subdirectory from the argument. + func_dirname "$arg" "/" "" + xdir="$func_dirname_result" + + func_lo2o "$arg" + pic_object=$xdir$objdir/$func_lo2o_result + non_pic_object=$xdir$func_lo2o_result + func_append libobjs " $pic_object" + func_append non_pic_objects " $non_pic_object" + else + func_fatal_error "\`$arg' is not a valid libtool object" + fi + fi + done + else + func_fatal_error "link input file \`$arg' does not exist" + fi + arg=$save_arg + prev= + continue + ;; + precious_regex) + precious_files_regex="$arg" + prev= + continue + ;; + release) + release="-$arg" + prev= + continue + ;; + rpath | xrpath) + # We need an absolute path. + case $arg in + [\\/]* | [A-Za-z]:[\\/]*) ;; + *) + func_fatal_error "only absolute run-paths are allowed" + ;; + esac + if test "$prev" = rpath; then + case "$rpath " in + *" $arg "*) ;; + *) func_append rpath " $arg" ;; + esac + else + case "$xrpath " in + *" $arg "*) ;; + *) func_append xrpath " $arg" ;; + esac + fi + prev= + continue + ;; + shrext) + shrext_cmds="$arg" + prev= + continue + ;; + weak) + func_append weak_libs " $arg" + prev= + continue + ;; + xcclinker) + func_append linker_flags " $qarg" + func_append compiler_flags " $qarg" + prev= + func_append compile_command " $qarg" + func_append finalize_command " $qarg" + continue + ;; + xcompiler) + func_append compiler_flags " $qarg" + prev= + func_append compile_command " $qarg" + func_append finalize_command " $qarg" + continue + ;; + xlinker) + func_append linker_flags " $qarg" + func_append compiler_flags " $wl$qarg" + prev= + func_append compile_command " $wl$qarg" + func_append finalize_command " $wl$qarg" + continue + ;; + *) + eval "$prev=\"\$arg\"" + prev= + continue + ;; + esac + fi # test -n "$prev" + + prevarg="$arg" + + case $arg in + -all-static) + if test -n "$link_static_flag"; then + # See comment for -static flag below, for more details. + func_append compile_command " $link_static_flag" + func_append finalize_command " $link_static_flag" + fi + continue + ;; + + -allow-undefined) + # FIXME: remove this flag sometime in the future. + func_fatal_error "\`-allow-undefined' must not be used because it is the default" + ;; + + -avoid-version) + avoid_version=yes + continue + ;; + + -bindir) + prev=bindir + continue + ;; + + -dlopen) + prev=dlfiles + continue + ;; + + -dlpreopen) + prev=dlprefiles + continue + ;; + + -export-dynamic) + export_dynamic=yes + continue + ;; + + -export-symbols | -export-symbols-regex) + if test -n "$export_symbols" || test -n "$export_symbols_regex"; then + func_fatal_error "more than one -exported-symbols argument is not allowed" + fi + if test "X$arg" = "X-export-symbols"; then + prev=expsyms + else + prev=expsyms_regex + fi + continue + ;; + + -framework) + prev=framework + continue + ;; + + -inst-prefix-dir) + prev=inst_prefix + continue + ;; + + # The native IRIX linker understands -LANG:*, -LIST:* and -LNO:* + # so, if we see these flags be careful not to treat them like -L + -L[A-Z][A-Z]*:*) + case $with_gcc/$host in + no/*-*-irix* | /*-*-irix*) + func_append compile_command " $arg" + func_append finalize_command " $arg" + ;; + esac + continue + ;; + + -L*) + func_stripname "-L" '' "$arg" + if test -z "$func_stripname_result"; then + if test "$#" -gt 0; then + func_fatal_error "require no space between \`-L' and \`$1'" + else + func_fatal_error "need path for \`-L' option" + fi + fi + func_resolve_sysroot "$func_stripname_result" + dir=$func_resolve_sysroot_result + # We need an absolute path. + case $dir in + [\\/]* | [A-Za-z]:[\\/]*) ;; + *) + absdir=`cd "$dir" && pwd` + test -z "$absdir" && \ + func_fatal_error "cannot determine absolute directory name of \`$dir'" + dir="$absdir" + ;; + esac + case "$deplibs " in + *" -L$dir "* | *" $arg "*) + # Will only happen for absolute or sysroot arguments + ;; + *) + # Preserve sysroot, but never include relative directories + case $dir in + [\\/]* | [A-Za-z]:[\\/]* | =*) func_append deplibs " $arg" ;; + *) func_append deplibs " -L$dir" ;; + esac + func_append lib_search_path " $dir" + ;; + esac + case $host in + *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*) + testbindir=`$ECHO "$dir" | $SED 's*/lib$*/bin*'` + case :$dllsearchpath: in + *":$dir:"*) ;; + ::) dllsearchpath=$dir;; + *) func_append dllsearchpath ":$dir";; + esac + case :$dllsearchpath: in + *":$testbindir:"*) ;; + ::) dllsearchpath=$testbindir;; + *) func_append dllsearchpath ":$testbindir";; + esac + ;; + esac + continue + ;; + + -l*) + if test "X$arg" = "X-lc" || test "X$arg" = "X-lm"; then + case $host in + *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-beos* | *-cegcc* | *-*-haiku*) + # These systems don't actually have a C or math library (as such) + continue + ;; + *-*-os2*) + # These systems don't actually have a C library (as such) + test "X$arg" = "X-lc" && continue + ;; + *-*-openbsd* | *-*-freebsd* | *-*-dragonfly*) + # Do not include libc due to us having libc/libc_r. + test "X$arg" = "X-lc" && continue + ;; + *-*-rhapsody* | *-*-darwin1.[012]) + # Rhapsody C and math libraries are in the System framework + func_append deplibs " System.ltframework" + continue + ;; + *-*-sco3.2v5* | *-*-sco5v6*) + # Causes problems with __ctype + test "X$arg" = "X-lc" && continue + ;; + *-*-sysv4.2uw2* | *-*-sysv5* | *-*-unixware* | *-*-OpenUNIX*) + # Compiler inserts libc in the correct place for threads to work + test "X$arg" = "X-lc" && continue + ;; + esac + elif test "X$arg" = "X-lc_r"; then + case $host in + *-*-openbsd* | *-*-freebsd* | *-*-dragonfly*) + # Do not include libc_r directly, use -pthread flag. + continue + ;; + esac + fi + func_append deplibs " $arg" + continue + ;; + + -module) + module=yes + continue + ;; + + # Tru64 UNIX uses -model [arg] to determine the layout of C++ + # classes, name mangling, and exception handling. + # Darwin uses the -arch flag to determine output architecture. + -model|-arch|-isysroot|--sysroot) + func_append compiler_flags " $arg" + func_append compile_command " $arg" + func_append finalize_command " $arg" + prev=xcompiler + continue + ;; + + -mt|-mthreads|-kthread|-Kthread|-pthread|-pthreads|--thread-safe \ + |-threads|-fopenmp|-openmp|-mp|-xopenmp|-omp|-qsmp=*) + func_append compiler_flags " $arg" + func_append compile_command " $arg" + func_append finalize_command " $arg" + case "$new_inherited_linker_flags " in + *" $arg "*) ;; + * ) func_append new_inherited_linker_flags " $arg" ;; + esac + continue + ;; + + -multi_module) + single_module="${wl}-multi_module" + continue + ;; + + -no-fast-install) + fast_install=no + continue + ;; + + -no-install) + case $host in + *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-*-darwin* | *-cegcc*) + # The PATH hackery in wrapper scripts is required on Windows + # and Darwin in order for the loader to find any dlls it needs. + func_warning "\`-no-install' is ignored for $host" + func_warning "assuming \`-no-fast-install' instead" + fast_install=no + ;; + *) no_install=yes ;; + esac + continue + ;; + + -no-undefined) + allow_undefined=no + continue + ;; + + -objectlist) + prev=objectlist + continue + ;; + + -o) prev=output ;; + + -precious-files-regex) + prev=precious_regex + continue + ;; + + -release) + prev=release + continue + ;; + + -rpath) + prev=rpath + continue + ;; + + -R) + prev=xrpath + continue + ;; + + -R*) + func_stripname '-R' '' "$arg" + dir=$func_stripname_result + # We need an absolute path. + case $dir in + [\\/]* | [A-Za-z]:[\\/]*) ;; + =*) + func_stripname '=' '' "$dir" + dir=$lt_sysroot$func_stripname_result + ;; + *) + func_fatal_error "only absolute run-paths are allowed" + ;; + esac + case "$xrpath " in + *" $dir "*) ;; + *) func_append xrpath " $dir" ;; + esac + continue + ;; + + -shared) + # The effects of -shared are defined in a previous loop. + continue + ;; + + -shrext) + prev=shrext + continue + ;; + + -static | -static-libtool-libs) + # The effects of -static are defined in a previous loop. + # We used to do the same as -all-static on platforms that + # didn't have a PIC flag, but the assumption that the effects + # would be equivalent was wrong. It would break on at least + # Digital Unix and AIX. + continue + ;; + + -thread-safe) + thread_safe=yes + continue + ;; + + -version-info) + prev=vinfo + continue + ;; + + -version-number) + prev=vinfo + vinfo_number=yes + continue + ;; + + -weak) + prev=weak + continue + ;; + + -Wc,*) + func_stripname '-Wc,' '' "$arg" + args=$func_stripname_result + arg= + save_ifs="$IFS"; IFS=',' + for flag in $args; do + IFS="$save_ifs" + func_quote_for_eval "$flag" + func_append arg " $func_quote_for_eval_result" + func_append compiler_flags " $func_quote_for_eval_result" + done + IFS="$save_ifs" + func_stripname ' ' '' "$arg" + arg=$func_stripname_result + ;; + + -Wl,*) + func_stripname '-Wl,' '' "$arg" + args=$func_stripname_result + arg= + save_ifs="$IFS"; IFS=',' + for flag in $args; do + IFS="$save_ifs" + func_quote_for_eval "$flag" + func_append arg " $wl$func_quote_for_eval_result" + func_append compiler_flags " $wl$func_quote_for_eval_result" + func_append linker_flags " $func_quote_for_eval_result" + done + IFS="$save_ifs" + func_stripname ' ' '' "$arg" + arg=$func_stripname_result + ;; + + -Xcompiler) + prev=xcompiler + continue + ;; + + -Xlinker) + prev=xlinker + continue + ;; + + -XCClinker) + prev=xcclinker + continue + ;; + + # -msg_* for osf cc + -msg_*) + func_quote_for_eval "$arg" + arg="$func_quote_for_eval_result" + ;; + + # Flags to be passed through unchanged, with rationale: + # -64, -mips[0-9] enable 64-bit mode for the SGI compiler + # -r[0-9][0-9]* specify processor for the SGI compiler + # -xarch=*, -xtarget=* enable 64-bit mode for the Sun compiler + # +DA*, +DD* enable 64-bit mode for the HP compiler + # -q* compiler args for the IBM compiler + # -m*, -t[45]*, -txscale* architecture-specific flags for GCC + # -F/path path to uninstalled frameworks, gcc on darwin + # -p, -pg, --coverage, -fprofile-* profiling flags for GCC + # @file GCC response files + # -tp=* Portland pgcc target processor selection + # --sysroot=* for sysroot support + # -O*, -flto*, -fwhopr*, -fuse-linker-plugin GCC link-time optimization + -64|-mips[0-9]|-r[0-9][0-9]*|-xarch=*|-xtarget=*|+DA*|+DD*|-q*|-m*| \ + -t[45]*|-txscale*|-p|-pg|--coverage|-fprofile-*|-F*|@*|-tp=*|--sysroot=*| \ + -O*|-flto*|-fwhopr*|-fuse-linker-plugin) + func_quote_for_eval "$arg" + arg="$func_quote_for_eval_result" + func_append compile_command " $arg" + func_append finalize_command " $arg" + func_append compiler_flags " $arg" + continue + ;; + + # Some other compiler flag. + -* | +*) + func_quote_for_eval "$arg" + arg="$func_quote_for_eval_result" + ;; + + *.$objext) + # A standard object. + func_append objs " $arg" + ;; + + *.lo) + # A libtool-controlled object. + + # Check to see that this really is a libtool object. + if func_lalib_unsafe_p "$arg"; then + pic_object= + non_pic_object= + + # Read the .lo file + func_source "$arg" + + if test -z "$pic_object" || + test -z "$non_pic_object" || + test "$pic_object" = none && + test "$non_pic_object" = none; then + func_fatal_error "cannot find name of object for \`$arg'" + fi + + # Extract subdirectory from the argument. + func_dirname "$arg" "/" "" + xdir="$func_dirname_result" + + if test "$pic_object" != none; then + # Prepend the subdirectory the object is found in. + pic_object="$xdir$pic_object" + + if test "$prev" = dlfiles; then + if test "$build_libtool_libs" = yes && test "$dlopen_support" = yes; then + func_append dlfiles " $pic_object" + prev= + continue + else + # If libtool objects are unsupported, then we need to preload. + prev=dlprefiles + fi + fi + + # CHECK ME: I think I busted this. -Ossama + if test "$prev" = dlprefiles; then + # Preload the old-style object. + func_append dlprefiles " $pic_object" + prev= + fi + + # A PIC object. + func_append libobjs " $pic_object" + arg="$pic_object" + fi + + # Non-PIC object. + if test "$non_pic_object" != none; then + # Prepend the subdirectory the object is found in. + non_pic_object="$xdir$non_pic_object" + + # A standard non-PIC object + func_append non_pic_objects " $non_pic_object" + if test -z "$pic_object" || test "$pic_object" = none ; then + arg="$non_pic_object" + fi + else + # If the PIC object exists, use it instead. + # $xdir was prepended to $pic_object above. + non_pic_object="$pic_object" + func_append non_pic_objects " $non_pic_object" + fi + else + # Only an error if not doing a dry-run. + if $opt_dry_run; then + # Extract subdirectory from the argument. + func_dirname "$arg" "/" "" + xdir="$func_dirname_result" + + func_lo2o "$arg" + pic_object=$xdir$objdir/$func_lo2o_result + non_pic_object=$xdir$func_lo2o_result + func_append libobjs " $pic_object" + func_append non_pic_objects " $non_pic_object" + else + func_fatal_error "\`$arg' is not a valid libtool object" + fi + fi + ;; + + *.$libext) + # An archive. + func_append deplibs " $arg" + func_append old_deplibs " $arg" + continue + ;; + + *.la) + # A libtool-controlled library. + + func_resolve_sysroot "$arg" + if test "$prev" = dlfiles; then + # This library was specified with -dlopen. + func_append dlfiles " $func_resolve_sysroot_result" + prev= + elif test "$prev" = dlprefiles; then + # The library was specified with -dlpreopen. + func_append dlprefiles " $func_resolve_sysroot_result" + prev= + else + func_append deplibs " $func_resolve_sysroot_result" + fi + continue + ;; + + # Some other compiler argument. + *) + # Unknown arguments in both finalize_command and compile_command need + # to be aesthetically quoted because they are evaled later. + func_quote_for_eval "$arg" + arg="$func_quote_for_eval_result" + ;; + esac # arg + + # Now actually substitute the argument into the commands. + if test -n "$arg"; then + func_append compile_command " $arg" + func_append finalize_command " $arg" + fi + done # argument parsing loop + + test -n "$prev" && \ + func_fatal_help "the \`$prevarg' option requires an argument" + + if test "$export_dynamic" = yes && test -n "$export_dynamic_flag_spec"; then + eval arg=\"$export_dynamic_flag_spec\" + func_append compile_command " $arg" + func_append finalize_command " $arg" + fi + + oldlibs= + # calculate the name of the file, without its directory + func_basename "$output" + outputname="$func_basename_result" + libobjs_save="$libobjs" + + if test -n "$shlibpath_var"; then + # get the directories listed in $shlibpath_var + eval shlib_search_path=\`\$ECHO \"\${$shlibpath_var}\" \| \$SED \'s/:/ /g\'\` + else + shlib_search_path= + fi + eval sys_lib_search_path=\"$sys_lib_search_path_spec\" + eval sys_lib_dlsearch_path=\"$sys_lib_dlsearch_path_spec\" + + func_dirname "$output" "/" "" + output_objdir="$func_dirname_result$objdir" + func_to_tool_file "$output_objdir/" + tool_output_objdir=$func_to_tool_file_result + # Create the object directory. + func_mkdir_p "$output_objdir" + + # Determine the type of output + case $output in + "") + func_fatal_help "you must specify an output file" + ;; + *.$libext) linkmode=oldlib ;; + *.lo | *.$objext) linkmode=obj ;; + *.la) linkmode=lib ;; + *) linkmode=prog ;; # Anything else should be a program. + esac + + specialdeplibs= + + libs= + # Find all interdependent deplibs by searching for libraries + # that are linked more than once (e.g. -la -lb -la) + for deplib in $deplibs; do + if $opt_preserve_dup_deps ; then + case "$libs " in + *" $deplib "*) func_append specialdeplibs " $deplib" ;; + esac + fi + func_append libs " $deplib" + done + + if test "$linkmode" = lib; then + libs="$predeps $libs $compiler_lib_search_path $postdeps" + + # Compute libraries that are listed more than once in $predeps + # $postdeps and mark them as special (i.e., whose duplicates are + # not to be eliminated). + pre_post_deps= + if $opt_duplicate_compiler_generated_deps; then + for pre_post_dep in $predeps $postdeps; do + case "$pre_post_deps " in + *" $pre_post_dep "*) func_append specialdeplibs " $pre_post_deps" ;; + esac + func_append pre_post_deps " $pre_post_dep" + done + fi + pre_post_deps= + fi + + deplibs= + newdependency_libs= + newlib_search_path= + need_relink=no # whether we're linking any uninstalled libtool libraries + notinst_deplibs= # not-installed libtool libraries + notinst_path= # paths that contain not-installed libtool libraries + + case $linkmode in + lib) + passes="conv dlpreopen link" + for file in $dlfiles $dlprefiles; do + case $file in + *.la) ;; + *) + func_fatal_help "libraries can \`-dlopen' only libtool libraries: $file" + ;; + esac + done + ;; + prog) + compile_deplibs= + finalize_deplibs= + alldeplibs=no + newdlfiles= + newdlprefiles= + passes="conv scan dlopen dlpreopen link" + ;; + *) passes="conv" + ;; + esac + + for pass in $passes; do + # The preopen pass in lib mode reverses $deplibs; put it back here + # so that -L comes before libs that need it for instance... + if test "$linkmode,$pass" = "lib,link"; then + ## FIXME: Find the place where the list is rebuilt in the wrong + ## order, and fix it there properly + tmp_deplibs= + for deplib in $deplibs; do + tmp_deplibs="$deplib $tmp_deplibs" + done + deplibs="$tmp_deplibs" + fi + + if test "$linkmode,$pass" = "lib,link" || + test "$linkmode,$pass" = "prog,scan"; then + libs="$deplibs" + deplibs= + fi + if test "$linkmode" = prog; then + case $pass in + dlopen) libs="$dlfiles" ;; + dlpreopen) libs="$dlprefiles" ;; + link) + libs="$deplibs %DEPLIBS%" + test "X$link_all_deplibs" != Xno && libs="$libs $dependency_libs" + ;; + esac + fi + if test "$linkmode,$pass" = "lib,dlpreopen"; then + # Collect and forward deplibs of preopened libtool libs + for lib in $dlprefiles; do + # Ignore non-libtool-libs + dependency_libs= + func_resolve_sysroot "$lib" + case $lib in + *.la) func_source "$func_resolve_sysroot_result" ;; + esac + + # Collect preopened libtool deplibs, except any this library + # has declared as weak libs + for deplib in $dependency_libs; do + func_basename "$deplib" + deplib_base=$func_basename_result + case " $weak_libs " in + *" $deplib_base "*) ;; + *) func_append deplibs " $deplib" ;; + esac + done + done + libs="$dlprefiles" + fi + if test "$pass" = dlopen; then + # Collect dlpreopened libraries + save_deplibs="$deplibs" + deplibs= + fi + + for deplib in $libs; do + lib= + found=no + case $deplib in + -mt|-mthreads|-kthread|-Kthread|-pthread|-pthreads|--thread-safe \ + |-threads|-fopenmp|-openmp|-mp|-xopenmp|-omp|-qsmp=*) + if test "$linkmode,$pass" = "prog,link"; then + compile_deplibs="$deplib $compile_deplibs" + finalize_deplibs="$deplib $finalize_deplibs" + else + func_append compiler_flags " $deplib" + if test "$linkmode" = lib ; then + case "$new_inherited_linker_flags " in + *" $deplib "*) ;; + * ) func_append new_inherited_linker_flags " $deplib" ;; + esac + fi + fi + continue + ;; + -l*) + if test "$linkmode" != lib && test "$linkmode" != prog; then + func_warning "\`-l' is ignored for archives/objects" + continue + fi + func_stripname '-l' '' "$deplib" + name=$func_stripname_result + if test "$linkmode" = lib; then + searchdirs="$newlib_search_path $lib_search_path $compiler_lib_search_dirs $sys_lib_search_path $shlib_search_path" + else + searchdirs="$newlib_search_path $lib_search_path $sys_lib_search_path $shlib_search_path" + fi + for searchdir in $searchdirs; do + for search_ext in .la $std_shrext .so .a; do + # Search the libtool library + lib="$searchdir/lib${name}${search_ext}" + if test -f "$lib"; then + if test "$search_ext" = ".la"; then + found=yes + else + found=no + fi + break 2 + fi + done + done + if test "$found" != yes; then + # deplib doesn't seem to be a libtool library + if test "$linkmode,$pass" = "prog,link"; then + compile_deplibs="$deplib $compile_deplibs" + finalize_deplibs="$deplib $finalize_deplibs" + else + deplibs="$deplib $deplibs" + test "$linkmode" = lib && newdependency_libs="$deplib $newdependency_libs" + fi + continue + else # deplib is a libtool library + # If $allow_libtool_libs_with_static_runtimes && $deplib is a stdlib, + # We need to do some special things here, and not later. + if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then + case " $predeps $postdeps " in + *" $deplib "*) + if func_lalib_p "$lib"; then + library_names= + old_library= + func_source "$lib" + for l in $old_library $library_names; do + ll="$l" + done + if test "X$ll" = "X$old_library" ; then # only static version available + found=no + func_dirname "$lib" "" "." + ladir="$func_dirname_result" + lib=$ladir/$old_library + if test "$linkmode,$pass" = "prog,link"; then + compile_deplibs="$deplib $compile_deplibs" + finalize_deplibs="$deplib $finalize_deplibs" + else + deplibs="$deplib $deplibs" + test "$linkmode" = lib && newdependency_libs="$deplib $newdependency_libs" + fi + continue + fi + fi + ;; + *) ;; + esac + fi + fi + ;; # -l + *.ltframework) + if test "$linkmode,$pass" = "prog,link"; then + compile_deplibs="$deplib $compile_deplibs" + finalize_deplibs="$deplib $finalize_deplibs" + else + deplibs="$deplib $deplibs" + if test "$linkmode" = lib ; then + case "$new_inherited_linker_flags " in + *" $deplib "*) ;; + * ) func_append new_inherited_linker_flags " $deplib" ;; + esac + fi + fi + continue + ;; + -L*) + case $linkmode in + lib) + deplibs="$deplib $deplibs" + test "$pass" = conv && continue + newdependency_libs="$deplib $newdependency_libs" + func_stripname '-L' '' "$deplib" + func_resolve_sysroot "$func_stripname_result" + func_append newlib_search_path " $func_resolve_sysroot_result" + ;; + prog) + if test "$pass" = conv; then + deplibs="$deplib $deplibs" + continue + fi + if test "$pass" = scan; then + deplibs="$deplib $deplibs" + else + compile_deplibs="$deplib $compile_deplibs" + finalize_deplibs="$deplib $finalize_deplibs" + fi + func_stripname '-L' '' "$deplib" + func_resolve_sysroot "$func_stripname_result" + func_append newlib_search_path " $func_resolve_sysroot_result" + ;; + *) + func_warning "\`-L' is ignored for archives/objects" + ;; + esac # linkmode + continue + ;; # -L + -R*) + if test "$pass" = link; then + func_stripname '-R' '' "$deplib" + func_resolve_sysroot "$func_stripname_result" + dir=$func_resolve_sysroot_result + # Make sure the xrpath contains only unique directories. + case "$xrpath " in + *" $dir "*) ;; + *) func_append xrpath " $dir" ;; + esac + fi + deplibs="$deplib $deplibs" + continue + ;; + *.la) + func_resolve_sysroot "$deplib" + lib=$func_resolve_sysroot_result + ;; + *.$libext) + if test "$pass" = conv; then + deplibs="$deplib $deplibs" + continue + fi + case $linkmode in + lib) + # Linking convenience modules into shared libraries is allowed, + # but linking other static libraries is non-portable. + case " $dlpreconveniencelibs " in + *" $deplib "*) ;; + *) + valid_a_lib=no + case $deplibs_check_method in + match_pattern*) + set dummy $deplibs_check_method; shift + match_pattern_regex=`expr "$deplibs_check_method" : "$1 \(.*\)"` + if eval "\$ECHO \"$deplib\"" 2>/dev/null | $SED 10q \ + | $EGREP "$match_pattern_regex" > /dev/null; then + valid_a_lib=yes + fi + ;; + pass_all) + valid_a_lib=yes + ;; + esac + if test "$valid_a_lib" != yes; then + echo + $ECHO "*** Warning: Trying to link with static lib archive $deplib." + echo "*** I have the capability to make that library automatically link in when" + echo "*** you link to this library. But I can only do this if you have a" + echo "*** shared version of the library, which you do not appear to have" + echo "*** because the file extensions .$libext of this argument makes me believe" + echo "*** that it is just a static archive that I should not use here." + else + echo + $ECHO "*** Warning: Linking the shared library $output against the" + $ECHO "*** static library $deplib is not portable!" + deplibs="$deplib $deplibs" + fi + ;; + esac + continue + ;; + prog) + if test "$pass" != link; then + deplibs="$deplib $deplibs" + else + compile_deplibs="$deplib $compile_deplibs" + finalize_deplibs="$deplib $finalize_deplibs" + fi + continue + ;; + esac # linkmode + ;; # *.$libext + *.lo | *.$objext) + if test "$pass" = conv; then + deplibs="$deplib $deplibs" + elif test "$linkmode" = prog; then + if test "$pass" = dlpreopen || test "$dlopen_support" != yes || test "$build_libtool_libs" = no; then + # If there is no dlopen support or we're linking statically, + # we need to preload. + func_append newdlprefiles " $deplib" + compile_deplibs="$deplib $compile_deplibs" + finalize_deplibs="$deplib $finalize_deplibs" + else + func_append newdlfiles " $deplib" + fi + fi + continue + ;; + %DEPLIBS%) + alldeplibs=yes + continue + ;; + esac # case $deplib + + if test "$found" = yes || test -f "$lib"; then : + else + func_fatal_error "cannot find the library \`$lib' or unhandled argument \`$deplib'" + fi + + # Check to see that this really is a libtool archive. + func_lalib_unsafe_p "$lib" \ + || func_fatal_error "\`$lib' is not a valid libtool archive" + + func_dirname "$lib" "" "." + ladir="$func_dirname_result" + + dlname= + dlopen= + dlpreopen= + libdir= + library_names= + old_library= + inherited_linker_flags= + # If the library was installed with an old release of libtool, + # it will not redefine variables installed, or shouldnotlink + installed=yes + shouldnotlink=no + avoidtemprpath= + + + # Read the .la file + func_source "$lib" + + # Convert "-framework foo" to "foo.ltframework" + if test -n "$inherited_linker_flags"; then + tmp_inherited_linker_flags=`$ECHO "$inherited_linker_flags" | $SED 's/-framework \([^ $]*\)/\1.ltframework/g'` + for tmp_inherited_linker_flag in $tmp_inherited_linker_flags; do + case " $new_inherited_linker_flags " in + *" $tmp_inherited_linker_flag "*) ;; + *) func_append new_inherited_linker_flags " $tmp_inherited_linker_flag";; + esac + done + fi + dependency_libs=`$ECHO " $dependency_libs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` + if test "$linkmode,$pass" = "lib,link" || + test "$linkmode,$pass" = "prog,scan" || + { test "$linkmode" != prog && test "$linkmode" != lib; }; then + test -n "$dlopen" && func_append dlfiles " $dlopen" + test -n "$dlpreopen" && func_append dlprefiles " $dlpreopen" + fi + + if test "$pass" = conv; then + # Only check for convenience libraries + deplibs="$lib $deplibs" + if test -z "$libdir"; then + if test -z "$old_library"; then + func_fatal_error "cannot find name of link library for \`$lib'" + fi + # It is a libtool convenience library, so add in its objects. + func_append convenience " $ladir/$objdir/$old_library" + func_append old_convenience " $ladir/$objdir/$old_library" + tmp_libs= + for deplib in $dependency_libs; do + deplibs="$deplib $deplibs" + if $opt_preserve_dup_deps ; then + case "$tmp_libs " in + *" $deplib "*) func_append specialdeplibs " $deplib" ;; + esac + fi + func_append tmp_libs " $deplib" + done + elif test "$linkmode" != prog && test "$linkmode" != lib; then + func_fatal_error "\`$lib' is not a convenience library" + fi + continue + fi # $pass = conv + + + # Get the name of the library we link against. + linklib= + if test -n "$old_library" && + { test "$prefer_static_libs" = yes || + test "$prefer_static_libs,$installed" = "built,no"; }; then + linklib=$old_library + else + for l in $old_library $library_names; do + linklib="$l" + done + fi + if test -z "$linklib"; then + func_fatal_error "cannot find name of link library for \`$lib'" + fi + + # This library was specified with -dlopen. + if test "$pass" = dlopen; then + if test -z "$libdir"; then + func_fatal_error "cannot -dlopen a convenience library: \`$lib'" + fi + if test -z "$dlname" || + test "$dlopen_support" != yes || + test "$build_libtool_libs" = no; then + # If there is no dlname, no dlopen support or we're linking + # statically, we need to preload. We also need to preload any + # dependent libraries so libltdl's deplib preloader doesn't + # bomb out in the load deplibs phase. + func_append dlprefiles " $lib $dependency_libs" + else + func_append newdlfiles " $lib" + fi + continue + fi # $pass = dlopen + + # We need an absolute path. + case $ladir in + [\\/]* | [A-Za-z]:[\\/]*) abs_ladir="$ladir" ;; + *) + abs_ladir=`cd "$ladir" && pwd` + if test -z "$abs_ladir"; then + func_warning "cannot determine absolute directory name of \`$ladir'" + func_warning "passing it literally to the linker, although it might fail" + abs_ladir="$ladir" + fi + ;; + esac + func_basename "$lib" + laname="$func_basename_result" + + # Find the relevant object directory and library name. + if test "X$installed" = Xyes; then + if test ! -f "$lt_sysroot$libdir/$linklib" && test -f "$abs_ladir/$linklib"; then + func_warning "library \`$lib' was moved." + dir="$ladir" + absdir="$abs_ladir" + libdir="$abs_ladir" + else + dir="$lt_sysroot$libdir" + absdir="$lt_sysroot$libdir" + fi + test "X$hardcode_automatic" = Xyes && avoidtemprpath=yes + else + if test ! -f "$ladir/$objdir/$linklib" && test -f "$abs_ladir/$linklib"; then + dir="$ladir" + absdir="$abs_ladir" + # Remove this search path later + func_append notinst_path " $abs_ladir" + else + dir="$ladir/$objdir" + absdir="$abs_ladir/$objdir" + # Remove this search path later + func_append notinst_path " $abs_ladir" + fi + fi # $installed = yes + func_stripname 'lib' '.la' "$laname" + name=$func_stripname_result + + # This library was specified with -dlpreopen. + if test "$pass" = dlpreopen; then + if test -z "$libdir" && test "$linkmode" = prog; then + func_fatal_error "only libraries may -dlpreopen a convenience library: \`$lib'" + fi + case "$host" in + # special handling for platforms with PE-DLLs. + *cygwin* | *mingw* | *cegcc* ) + # Linker will automatically link against shared library if both + # static and shared are present. Therefore, ensure we extract + # symbols from the import library if a shared library is present + # (otherwise, the dlopen module name will be incorrect). We do + # this by putting the import library name into $newdlprefiles. + # We recover the dlopen module name by 'saving' the la file + # name in a special purpose variable, and (later) extracting the + # dlname from the la file. + if test -n "$dlname"; then + func_tr_sh "$dir/$linklib" + eval "libfile_$func_tr_sh_result=\$abs_ladir/\$laname" + func_append newdlprefiles " $dir/$linklib" + else + func_append newdlprefiles " $dir/$old_library" + # Keep a list of preopened convenience libraries to check + # that they are being used correctly in the link pass. + test -z "$libdir" && \ + func_append dlpreconveniencelibs " $dir/$old_library" + fi + ;; + * ) + # Prefer using a static library (so that no silly _DYNAMIC symbols + # are required to link). + if test -n "$old_library"; then + func_append newdlprefiles " $dir/$old_library" + # Keep a list of preopened convenience libraries to check + # that they are being used correctly in the link pass. + test -z "$libdir" && \ + func_append dlpreconveniencelibs " $dir/$old_library" + # Otherwise, use the dlname, so that lt_dlopen finds it. + elif test -n "$dlname"; then + func_append newdlprefiles " $dir/$dlname" + else + func_append newdlprefiles " $dir/$linklib" + fi + ;; + esac + fi # $pass = dlpreopen + + if test -z "$libdir"; then + # Link the convenience library + if test "$linkmode" = lib; then + deplibs="$dir/$old_library $deplibs" + elif test "$linkmode,$pass" = "prog,link"; then + compile_deplibs="$dir/$old_library $compile_deplibs" + finalize_deplibs="$dir/$old_library $finalize_deplibs" + else + deplibs="$lib $deplibs" # used for prog,scan pass + fi + continue + fi + + + if test "$linkmode" = prog && test "$pass" != link; then + func_append newlib_search_path " $ladir" + deplibs="$lib $deplibs" + + linkalldeplibs=no + if test "$link_all_deplibs" != no || test -z "$library_names" || + test "$build_libtool_libs" = no; then + linkalldeplibs=yes + fi + + tmp_libs= + for deplib in $dependency_libs; do + case $deplib in + -L*) func_stripname '-L' '' "$deplib" + func_resolve_sysroot "$func_stripname_result" + func_append newlib_search_path " $func_resolve_sysroot_result" + ;; + esac + # Need to link against all dependency_libs? + if test "$linkalldeplibs" = yes; then + deplibs="$deplib $deplibs" + else + # Need to hardcode shared library paths + # or/and link against static libraries + newdependency_libs="$deplib $newdependency_libs" + fi + if $opt_preserve_dup_deps ; then + case "$tmp_libs " in + *" $deplib "*) func_append specialdeplibs " $deplib" ;; + esac + fi + func_append tmp_libs " $deplib" + done # for deplib + continue + fi # $linkmode = prog... + + if test "$linkmode,$pass" = "prog,link"; then + if test -n "$library_names" && + { { test "$prefer_static_libs" = no || + test "$prefer_static_libs,$installed" = "built,yes"; } || + test -z "$old_library"; }; then + # We need to hardcode the library path + if test -n "$shlibpath_var" && test -z "$avoidtemprpath" ; then + # Make sure the rpath contains only unique directories. + case "$temp_rpath:" in + *"$absdir:"*) ;; + *) func_append temp_rpath "$absdir:" ;; + esac + fi + + # Hardcode the library path. + # Skip directories that are in the system default run-time + # search path. + case " $sys_lib_dlsearch_path " in + *" $absdir "*) ;; + *) + case "$compile_rpath " in + *" $absdir "*) ;; + *) func_append compile_rpath " $absdir" ;; + esac + ;; + esac + case " $sys_lib_dlsearch_path " in + *" $libdir "*) ;; + *) + case "$finalize_rpath " in + *" $libdir "*) ;; + *) func_append finalize_rpath " $libdir" ;; + esac + ;; + esac + fi # $linkmode,$pass = prog,link... + + if test "$alldeplibs" = yes && + { test "$deplibs_check_method" = pass_all || + { test "$build_libtool_libs" = yes && + test -n "$library_names"; }; }; then + # We only need to search for static libraries + continue + fi + fi + + link_static=no # Whether the deplib will be linked statically + use_static_libs=$prefer_static_libs + if test "$use_static_libs" = built && test "$installed" = yes; then + use_static_libs=no + fi + if test -n "$library_names" && + { test "$use_static_libs" = no || test -z "$old_library"; }; then + case $host in + *cygwin* | *mingw* | *cegcc*) + # No point in relinking DLLs because paths are not encoded + func_append notinst_deplibs " $lib" + need_relink=no + ;; + *) + if test "$installed" = no; then + func_append notinst_deplibs " $lib" + need_relink=yes + fi + ;; + esac + # This is a shared library + + # Warn about portability, can't link against -module's on some + # systems (darwin). Don't bleat about dlopened modules though! + dlopenmodule="" + for dlpremoduletest in $dlprefiles; do + if test "X$dlpremoduletest" = "X$lib"; then + dlopenmodule="$dlpremoduletest" + break + fi + done + if test -z "$dlopenmodule" && test "$shouldnotlink" = yes && test "$pass" = link; then + echo + if test "$linkmode" = prog; then + $ECHO "*** Warning: Linking the executable $output against the loadable module" + else + $ECHO "*** Warning: Linking the shared library $output against the loadable module" + fi + $ECHO "*** $linklib is not portable!" + fi + if test "$linkmode" = lib && + test "$hardcode_into_libs" = yes; then + # Hardcode the library path. + # Skip directories that are in the system default run-time + # search path. + case " $sys_lib_dlsearch_path " in + *" $absdir "*) ;; + *) + case "$compile_rpath " in + *" $absdir "*) ;; + *) func_append compile_rpath " $absdir" ;; + esac + ;; + esac + case " $sys_lib_dlsearch_path " in + *" $libdir "*) ;; + *) + case "$finalize_rpath " in + *" $libdir "*) ;; + *) func_append finalize_rpath " $libdir" ;; + esac + ;; + esac + fi + + if test -n "$old_archive_from_expsyms_cmds"; then + # figure out the soname + set dummy $library_names + shift + realname="$1" + shift + libname=`eval "\\$ECHO \"$libname_spec\""` + # use dlname if we got it. it's perfectly good, no? + if test -n "$dlname"; then + soname="$dlname" + elif test -n "$soname_spec"; then + # bleh windows + case $host in + *cygwin* | mingw* | *cegcc*) + func_arith $current - $age + major=$func_arith_result + versuffix="-$major" + ;; + esac + eval soname=\"$soname_spec\" + else + soname="$realname" + fi + + # Make a new name for the extract_expsyms_cmds to use + soroot="$soname" + func_basename "$soroot" + soname="$func_basename_result" + func_stripname 'lib' '.dll' "$soname" + newlib=libimp-$func_stripname_result.a + + # If the library has no export list, then create one now + if test -f "$output_objdir/$soname-def"; then : + else + func_verbose "extracting exported symbol list from \`$soname'" + func_execute_cmds "$extract_expsyms_cmds" 'exit $?' + fi + + # Create $newlib + if test -f "$output_objdir/$newlib"; then :; else + func_verbose "generating import library for \`$soname'" + func_execute_cmds "$old_archive_from_expsyms_cmds" 'exit $?' + fi + # make sure the library variables are pointing to the new library + dir=$output_objdir + linklib=$newlib + fi # test -n "$old_archive_from_expsyms_cmds" + + if test "$linkmode" = prog || test "$opt_mode" != relink; then + add_shlibpath= + add_dir= + add= + lib_linked=yes + case $hardcode_action in + immediate | unsupported) + if test "$hardcode_direct" = no; then + add="$dir/$linklib" + case $host in + *-*-sco3.2v5.0.[024]*) add_dir="-L$dir" ;; + *-*-sysv4*uw2*) add_dir="-L$dir" ;; + *-*-sysv5OpenUNIX* | *-*-sysv5UnixWare7.[01].[10]* | \ + *-*-unixware7*) add_dir="-L$dir" ;; + *-*-darwin* ) + # if the lib is a (non-dlopened) module then we can not + # link against it, someone is ignoring the earlier warnings + if /usr/bin/file -L $add 2> /dev/null | + $GREP ": [^:]* bundle" >/dev/null ; then + if test "X$dlopenmodule" != "X$lib"; then + $ECHO "*** Warning: lib $linklib is a module, not a shared library" + if test -z "$old_library" ; then + echo + echo "*** And there doesn't seem to be a static archive available" + echo "*** The link will probably fail, sorry" + else + add="$dir/$old_library" + fi + elif test -n "$old_library"; then + add="$dir/$old_library" + fi + fi + esac + elif test "$hardcode_minus_L" = no; then + case $host in + *-*-sunos*) add_shlibpath="$dir" ;; + esac + add_dir="-L$dir" + add="-l$name" + elif test "$hardcode_shlibpath_var" = no; then + add_shlibpath="$dir" + add="-l$name" + else + lib_linked=no + fi + ;; + relink) + if test "$hardcode_direct" = yes && + test "$hardcode_direct_absolute" = no; then + add="$dir/$linklib" + elif test "$hardcode_minus_L" = yes; then + add_dir="-L$absdir" + # Try looking first in the location we're being installed to. + if test -n "$inst_prefix_dir"; then + case $libdir in + [\\/]*) + func_append add_dir " -L$inst_prefix_dir$libdir" + ;; + esac + fi + add="-l$name" + elif test "$hardcode_shlibpath_var" = yes; then + add_shlibpath="$dir" + add="-l$name" + else + lib_linked=no + fi + ;; + *) lib_linked=no ;; + esac + + if test "$lib_linked" != yes; then + func_fatal_configuration "unsupported hardcode properties" + fi + + if test -n "$add_shlibpath"; then + case :$compile_shlibpath: in + *":$add_shlibpath:"*) ;; + *) func_append compile_shlibpath "$add_shlibpath:" ;; + esac + fi + if test "$linkmode" = prog; then + test -n "$add_dir" && compile_deplibs="$add_dir $compile_deplibs" + test -n "$add" && compile_deplibs="$add $compile_deplibs" + else + test -n "$add_dir" && deplibs="$add_dir $deplibs" + test -n "$add" && deplibs="$add $deplibs" + if test "$hardcode_direct" != yes && + test "$hardcode_minus_L" != yes && + test "$hardcode_shlibpath_var" = yes; then + case :$finalize_shlibpath: in + *":$libdir:"*) ;; + *) func_append finalize_shlibpath "$libdir:" ;; + esac + fi + fi + fi + + if test "$linkmode" = prog || test "$opt_mode" = relink; then + add_shlibpath= + add_dir= + add= + # Finalize command for both is simple: just hardcode it. + if test "$hardcode_direct" = yes && + test "$hardcode_direct_absolute" = no; then + add="$libdir/$linklib" + elif test "$hardcode_minus_L" = yes; then + add_dir="-L$libdir" + add="-l$name" + elif test "$hardcode_shlibpath_var" = yes; then + case :$finalize_shlibpath: in + *":$libdir:"*) ;; + *) func_append finalize_shlibpath "$libdir:" ;; + esac + add="-l$name" + elif test "$hardcode_automatic" = yes; then + if test -n "$inst_prefix_dir" && + test -f "$inst_prefix_dir$libdir/$linklib" ; then + add="$inst_prefix_dir$libdir/$linklib" + else + add="$libdir/$linklib" + fi + else + # We cannot seem to hardcode it, guess we'll fake it. + add_dir="-L$libdir" + # Try looking first in the location we're being installed to. + if test -n "$inst_prefix_dir"; then + case $libdir in + [\\/]*) + func_append add_dir " -L$inst_prefix_dir$libdir" + ;; + esac + fi + add="-l$name" + fi + + if test "$linkmode" = prog; then + test -n "$add_dir" && finalize_deplibs="$add_dir $finalize_deplibs" + test -n "$add" && finalize_deplibs="$add $finalize_deplibs" + else + test -n "$add_dir" && deplibs="$add_dir $deplibs" + test -n "$add" && deplibs="$add $deplibs" + fi + fi + elif test "$linkmode" = prog; then + # Here we assume that one of hardcode_direct or hardcode_minus_L + # is not unsupported. This is valid on all known static and + # shared platforms. + if test "$hardcode_direct" != unsupported; then + test -n "$old_library" && linklib="$old_library" + compile_deplibs="$dir/$linklib $compile_deplibs" + finalize_deplibs="$dir/$linklib $finalize_deplibs" + else + compile_deplibs="-l$name -L$dir $compile_deplibs" + finalize_deplibs="-l$name -L$dir $finalize_deplibs" + fi + elif test "$build_libtool_libs" = yes; then + # Not a shared library + if test "$deplibs_check_method" != pass_all; then + # We're trying link a shared library against a static one + # but the system doesn't support it. + + # Just print a warning and add the library to dependency_libs so + # that the program can be linked against the static library. + echo + $ECHO "*** Warning: This system can not link to static lib archive $lib." + echo "*** I have the capability to make that library automatically link in when" + echo "*** you link to this library. But I can only do this if you have a" + echo "*** shared version of the library, which you do not appear to have." + if test "$module" = yes; then + echo "*** But as you try to build a module library, libtool will still create " + echo "*** a static module, that should work as long as the dlopening application" + echo "*** is linked with the -dlopen flag to resolve symbols at runtime." + if test -z "$global_symbol_pipe"; then + echo + echo "*** However, this would only work if libtool was able to extract symbol" + echo "*** lists from a program, using \`nm' or equivalent, but libtool could" + echo "*** not find such a program. So, this module is probably useless." + echo "*** \`nm' from GNU binutils and a full rebuild may help." + fi + if test "$build_old_libs" = no; then + build_libtool_libs=module + build_old_libs=yes + else + build_libtool_libs=no + fi + fi + else + deplibs="$dir/$old_library $deplibs" + link_static=yes + fi + fi # link shared/static library? + + if test "$linkmode" = lib; then + if test -n "$dependency_libs" && + { test "$hardcode_into_libs" != yes || + test "$build_old_libs" = yes || + test "$link_static" = yes; }; then + # Extract -R from dependency_libs + temp_deplibs= + for libdir in $dependency_libs; do + case $libdir in + -R*) func_stripname '-R' '' "$libdir" + temp_xrpath=$func_stripname_result + case " $xrpath " in + *" $temp_xrpath "*) ;; + *) func_append xrpath " $temp_xrpath";; + esac;; + *) func_append temp_deplibs " $libdir";; + esac + done + dependency_libs="$temp_deplibs" + fi + + func_append newlib_search_path " $absdir" + # Link against this library + test "$link_static" = no && newdependency_libs="$abs_ladir/$laname $newdependency_libs" + # ... and its dependency_libs + tmp_libs= + for deplib in $dependency_libs; do + newdependency_libs="$deplib $newdependency_libs" + case $deplib in + -L*) func_stripname '-L' '' "$deplib" + func_resolve_sysroot "$func_stripname_result";; + *) func_resolve_sysroot "$deplib" ;; + esac + if $opt_preserve_dup_deps ; then + case "$tmp_libs " in + *" $func_resolve_sysroot_result "*) + func_append specialdeplibs " $func_resolve_sysroot_result" ;; + esac + fi + func_append tmp_libs " $func_resolve_sysroot_result" + done + + if test "$link_all_deplibs" != no; then + # Add the search paths of all dependency libraries + for deplib in $dependency_libs; do + path= + case $deplib in + -L*) path="$deplib" ;; + *.la) + func_resolve_sysroot "$deplib" + deplib=$func_resolve_sysroot_result + func_dirname "$deplib" "" "." + dir=$func_dirname_result + # We need an absolute path. + case $dir in + [\\/]* | [A-Za-z]:[\\/]*) absdir="$dir" ;; + *) + absdir=`cd "$dir" && pwd` + if test -z "$absdir"; then + func_warning "cannot determine absolute directory name of \`$dir'" + absdir="$dir" + fi + ;; + esac + if $GREP "^installed=no" $deplib > /dev/null; then + case $host in + *-*-darwin*) + depdepl= + eval deplibrary_names=`${SED} -n -e 's/^library_names=\(.*\)$/\1/p' $deplib` + if test -n "$deplibrary_names" ; then + for tmp in $deplibrary_names ; do + depdepl=$tmp + done + if test -f "$absdir/$objdir/$depdepl" ; then + depdepl="$absdir/$objdir/$depdepl" + darwin_install_name=`${OTOOL} -L $depdepl | awk '{if (NR == 2) {print $1;exit}}'` + if test -z "$darwin_install_name"; then + darwin_install_name=`${OTOOL64} -L $depdepl | awk '{if (NR == 2) {print $1;exit}}'` + fi + func_append compiler_flags " ${wl}-dylib_file ${wl}${darwin_install_name}:${depdepl}" + func_append linker_flags " -dylib_file ${darwin_install_name}:${depdepl}" + path= + fi + fi + ;; + *) + path="-L$absdir/$objdir" + ;; + esac + else + eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $deplib` + test -z "$libdir" && \ + func_fatal_error "\`$deplib' is not a valid libtool archive" + test "$absdir" != "$libdir" && \ + func_warning "\`$deplib' seems to be moved" + + path="-L$absdir" + fi + ;; + esac + case " $deplibs " in + *" $path "*) ;; + *) deplibs="$path $deplibs" ;; + esac + done + fi # link_all_deplibs != no + fi # linkmode = lib + done # for deplib in $libs + if test "$pass" = link; then + if test "$linkmode" = "prog"; then + compile_deplibs="$new_inherited_linker_flags $compile_deplibs" + finalize_deplibs="$new_inherited_linker_flags $finalize_deplibs" + else + compiler_flags="$compiler_flags "`$ECHO " $new_inherited_linker_flags" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` + fi + fi + dependency_libs="$newdependency_libs" + if test "$pass" = dlpreopen; then + # Link the dlpreopened libraries before other libraries + for deplib in $save_deplibs; do + deplibs="$deplib $deplibs" + done + fi + if test "$pass" != dlopen; then + if test "$pass" != conv; then + # Make sure lib_search_path contains only unique directories. + lib_search_path= + for dir in $newlib_search_path; do + case "$lib_search_path " in + *" $dir "*) ;; + *) func_append lib_search_path " $dir" ;; + esac + done + newlib_search_path= + fi + + if test "$linkmode,$pass" != "prog,link"; then + vars="deplibs" + else + vars="compile_deplibs finalize_deplibs" + fi + for var in $vars dependency_libs; do + # Add libraries to $var in reverse order + eval tmp_libs=\"\$$var\" + new_libs= + for deplib in $tmp_libs; do + # FIXME: Pedantically, this is the right thing to do, so + # that some nasty dependency loop isn't accidentally + # broken: + #new_libs="$deplib $new_libs" + # Pragmatically, this seems to cause very few problems in + # practice: + case $deplib in + -L*) new_libs="$deplib $new_libs" ;; + -R*) ;; + *) + # And here is the reason: when a library appears more + # than once as an explicit dependence of a library, or + # is implicitly linked in more than once by the + # compiler, it is considered special, and multiple + # occurrences thereof are not removed. Compare this + # with having the same library being listed as a + # dependency of multiple other libraries: in this case, + # we know (pedantically, we assume) the library does not + # need to be listed more than once, so we keep only the + # last copy. This is not always right, but it is rare + # enough that we require users that really mean to play + # such unportable linking tricks to link the library + # using -Wl,-lname, so that libtool does not consider it + # for duplicate removal. + case " $specialdeplibs " in + *" $deplib "*) new_libs="$deplib $new_libs" ;; + *) + case " $new_libs " in + *" $deplib "*) ;; + *) new_libs="$deplib $new_libs" ;; + esac + ;; + esac + ;; + esac + done + tmp_libs= + for deplib in $new_libs; do + case $deplib in + -L*) + case " $tmp_libs " in + *" $deplib "*) ;; + *) func_append tmp_libs " $deplib" ;; + esac + ;; + *) func_append tmp_libs " $deplib" ;; + esac + done + eval $var=\"$tmp_libs\" + done # for var + fi + # Last step: remove runtime libs from dependency_libs + # (they stay in deplibs) + tmp_libs= + for i in $dependency_libs ; do + case " $predeps $postdeps $compiler_lib_search_path " in + *" $i "*) + i="" + ;; + esac + if test -n "$i" ; then + func_append tmp_libs " $i" + fi + done + dependency_libs=$tmp_libs + done # for pass + if test "$linkmode" = prog; then + dlfiles="$newdlfiles" + fi + if test "$linkmode" = prog || test "$linkmode" = lib; then + dlprefiles="$newdlprefiles" + fi + + case $linkmode in + oldlib) + if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then + func_warning "\`-dlopen' is ignored for archives" + fi + + case " $deplibs" in + *\ -l* | *\ -L*) + func_warning "\`-l' and \`-L' are ignored for archives" ;; + esac + + test -n "$rpath" && \ + func_warning "\`-rpath' is ignored for archives" + + test -n "$xrpath" && \ + func_warning "\`-R' is ignored for archives" + + test -n "$vinfo" && \ + func_warning "\`-version-info/-version-number' is ignored for archives" + + test -n "$release" && \ + func_warning "\`-release' is ignored for archives" + + test -n "$export_symbols$export_symbols_regex" && \ + func_warning "\`-export-symbols' is ignored for archives" + + # Now set the variables for building old libraries. + build_libtool_libs=no + oldlibs="$output" + func_append objs "$old_deplibs" + ;; + + lib) + # Make sure we only generate libraries of the form `libNAME.la'. + case $outputname in + lib*) + func_stripname 'lib' '.la' "$outputname" + name=$func_stripname_result + eval shared_ext=\"$shrext_cmds\" + eval libname=\"$libname_spec\" + ;; + *) + test "$module" = no && \ + func_fatal_help "libtool library \`$output' must begin with \`lib'" + + if test "$need_lib_prefix" != no; then + # Add the "lib" prefix for modules if required + func_stripname '' '.la' "$outputname" + name=$func_stripname_result + eval shared_ext=\"$shrext_cmds\" + eval libname=\"$libname_spec\" + else + func_stripname '' '.la' "$outputname" + libname=$func_stripname_result + fi + ;; + esac + + if test -n "$objs"; then + if test "$deplibs_check_method" != pass_all; then + func_fatal_error "cannot build libtool library \`$output' from non-libtool objects on this host:$objs" + else + echo + $ECHO "*** Warning: Linking the shared library $output against the non-libtool" + $ECHO "*** objects $objs is not portable!" + func_append libobjs " $objs" + fi + fi + + test "$dlself" != no && \ + func_warning "\`-dlopen self' is ignored for libtool libraries" + + set dummy $rpath + shift + test "$#" -gt 1 && \ + func_warning "ignoring multiple \`-rpath's for a libtool library" + + install_libdir="$1" + + oldlibs= + if test -z "$rpath"; then + if test "$build_libtool_libs" = yes; then + # Building a libtool convenience library. + # Some compilers have problems with a `.al' extension so + # convenience libraries should have the same extension an + # archive normally would. + oldlibs="$output_objdir/$libname.$libext $oldlibs" + build_libtool_libs=convenience + build_old_libs=yes + fi + + test -n "$vinfo" && \ + func_warning "\`-version-info/-version-number' is ignored for convenience libraries" + + test -n "$release" && \ + func_warning "\`-release' is ignored for convenience libraries" + else + + # Parse the version information argument. + save_ifs="$IFS"; IFS=':' + set dummy $vinfo 0 0 0 + shift + IFS="$save_ifs" + + test -n "$7" && \ + func_fatal_help "too many parameters to \`-version-info'" + + # convert absolute version numbers to libtool ages + # this retains compatibility with .la files and attempts + # to make the code below a bit more comprehensible + + case $vinfo_number in + yes) + number_major="$1" + number_minor="$2" + number_revision="$3" + # + # There are really only two kinds -- those that + # use the current revision as the major version + # and those that subtract age and use age as + # a minor version. But, then there is irix + # which has an extra 1 added just for fun + # + case $version_type in + # correct linux to gnu/linux during the next big refactor + darwin|linux|osf|windows|none) + func_arith $number_major + $number_minor + current=$func_arith_result + age="$number_minor" + revision="$number_revision" + ;; + freebsd-aout|freebsd-elf|qnx|sunos) + current="$number_major" + revision="$number_minor" + age="0" + ;; + irix|nonstopux) + func_arith $number_major + $number_minor + current=$func_arith_result + age="$number_minor" + revision="$number_minor" + lt_irix_increment=no + ;; + *) + func_fatal_configuration "$modename: unknown library version type \`$version_type'" + ;; + esac + ;; + no) + current="$1" + revision="$2" + age="$3" + ;; + esac + + # Check that each of the things are valid numbers. + case $current in + 0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;; + *) + func_error "CURRENT \`$current' must be a nonnegative integer" + func_fatal_error "\`$vinfo' is not valid version information" + ;; + esac + + case $revision in + 0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;; + *) + func_error "REVISION \`$revision' must be a nonnegative integer" + func_fatal_error "\`$vinfo' is not valid version information" + ;; + esac + + case $age in + 0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;; + *) + func_error "AGE \`$age' must be a nonnegative integer" + func_fatal_error "\`$vinfo' is not valid version information" + ;; + esac + + if test "$age" -gt "$current"; then + func_error "AGE \`$age' is greater than the current interface number \`$current'" + func_fatal_error "\`$vinfo' is not valid version information" + fi + + # Calculate the version variables. + major= + versuffix= + verstring= + case $version_type in + none) ;; + + darwin) + # Like Linux, but with the current version available in + # verstring for coding it into the library header + func_arith $current - $age + major=.$func_arith_result + versuffix="$major.$age.$revision" + # Darwin ld doesn't like 0 for these options... + func_arith $current + 1 + minor_current=$func_arith_result + xlcverstring="${wl}-compatibility_version ${wl}$minor_current ${wl}-current_version ${wl}$minor_current.$revision" + verstring="-compatibility_version $minor_current -current_version $minor_current.$revision" + ;; + + freebsd-aout) + major=".$current" + versuffix=".$current.$revision"; + ;; + + freebsd-elf) + major=".$current" + versuffix=".$current" + ;; + + irix | nonstopux) + if test "X$lt_irix_increment" = "Xno"; then + func_arith $current - $age + else + func_arith $current - $age + 1 + fi + major=$func_arith_result + + case $version_type in + nonstopux) verstring_prefix=nonstopux ;; + *) verstring_prefix=sgi ;; + esac + verstring="$verstring_prefix$major.$revision" + + # Add in all the interfaces that we are compatible with. + loop=$revision + while test "$loop" -ne 0; do + func_arith $revision - $loop + iface=$func_arith_result + func_arith $loop - 1 + loop=$func_arith_result + verstring="$verstring_prefix$major.$iface:$verstring" + done + + # Before this point, $major must not contain `.'. + major=.$major + versuffix="$major.$revision" + ;; + + linux) # correct to gnu/linux during the next big refactor + func_arith $current - $age + major=.$func_arith_result + versuffix="$major.$age.$revision" + ;; + + osf) + func_arith $current - $age + major=.$func_arith_result + versuffix=".$current.$age.$revision" + verstring="$current.$age.$revision" + + # Add in all the interfaces that we are compatible with. + loop=$age + while test "$loop" -ne 0; do + func_arith $current - $loop + iface=$func_arith_result + func_arith $loop - 1 + loop=$func_arith_result + verstring="$verstring:${iface}.0" + done + + # Make executables depend on our current version. + func_append verstring ":${current}.0" + ;; + + qnx) + major=".$current" + versuffix=".$current" + ;; + + sunos) + major=".$current" + versuffix=".$current.$revision" + ;; + + windows) + # Use '-' rather than '.', since we only want one + # extension on DOS 8.3 filesystems. + func_arith $current - $age + major=$func_arith_result + versuffix="-$major" + ;; + + *) + func_fatal_configuration "unknown library version type \`$version_type'" + ;; + esac + + # Clear the version info if we defaulted, and they specified a release. + if test -z "$vinfo" && test -n "$release"; then + major= + case $version_type in + darwin) + # we can't check for "0.0" in archive_cmds due to quoting + # problems, so we reset it completely + verstring= + ;; + *) + verstring="0.0" + ;; + esac + if test "$need_version" = no; then + versuffix= + else + versuffix=".0.0" + fi + fi + + # Remove version info from name if versioning should be avoided + if test "$avoid_version" = yes && test "$need_version" = no; then + major= + versuffix= + verstring="" + fi + + # Check to see if the archive will have undefined symbols. + if test "$allow_undefined" = yes; then + if test "$allow_undefined_flag" = unsupported; then + func_warning "undefined symbols not allowed in $host shared libraries" + build_libtool_libs=no + build_old_libs=yes + fi + else + # Don't allow undefined symbols. + allow_undefined_flag="$no_undefined_flag" + fi + + fi + + func_generate_dlsyms "$libname" "$libname" "yes" + func_append libobjs " $symfileobj" + test "X$libobjs" = "X " && libobjs= + + if test "$opt_mode" != relink; then + # Remove our outputs, but don't remove object files since they + # may have been created when compiling PIC objects. + removelist= + tempremovelist=`$ECHO "$output_objdir/*"` + for p in $tempremovelist; do + case $p in + *.$objext | *.gcno) + ;; + $output_objdir/$outputname | $output_objdir/$libname.* | $output_objdir/${libname}${release}.*) + if test "X$precious_files_regex" != "X"; then + if $ECHO "$p" | $EGREP -e "$precious_files_regex" >/dev/null 2>&1 + then + continue + fi + fi + func_append removelist " $p" + ;; + *) ;; + esac + done + test -n "$removelist" && \ + func_show_eval "${RM}r \$removelist" + fi + + # Now set the variables for building old libraries. + if test "$build_old_libs" = yes && test "$build_libtool_libs" != convenience ; then + func_append oldlibs " $output_objdir/$libname.$libext" + + # Transform .lo files to .o files. + oldobjs="$objs "`$ECHO "$libobjs" | $SP2NL | $SED "/\.${libext}$/d; $lo2o" | $NL2SP` + fi + + # Eliminate all temporary directories. + #for path in $notinst_path; do + # lib_search_path=`$ECHO "$lib_search_path " | $SED "s% $path % %g"` + # deplibs=`$ECHO "$deplibs " | $SED "s% -L$path % %g"` + # dependency_libs=`$ECHO "$dependency_libs " | $SED "s% -L$path % %g"` + #done + + if test -n "$xrpath"; then + # If the user specified any rpath flags, then add them. + temp_xrpath= + for libdir in $xrpath; do + func_replace_sysroot "$libdir" + func_append temp_xrpath " -R$func_replace_sysroot_result" + case "$finalize_rpath " in + *" $libdir "*) ;; + *) func_append finalize_rpath " $libdir" ;; + esac + done + if test "$hardcode_into_libs" != yes || test "$build_old_libs" = yes; then + dependency_libs="$temp_xrpath $dependency_libs" + fi + fi + + # Make sure dlfiles contains only unique files that won't be dlpreopened + old_dlfiles="$dlfiles" + dlfiles= + for lib in $old_dlfiles; do + case " $dlprefiles $dlfiles " in + *" $lib "*) ;; + *) func_append dlfiles " $lib" ;; + esac + done + + # Make sure dlprefiles contains only unique files + old_dlprefiles="$dlprefiles" + dlprefiles= + for lib in $old_dlprefiles; do + case "$dlprefiles " in + *" $lib "*) ;; + *) func_append dlprefiles " $lib" ;; + esac + done + + if test "$build_libtool_libs" = yes; then + if test -n "$rpath"; then + case $host in + *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-*-beos* | *-cegcc* | *-*-haiku*) + # these systems don't actually have a c library (as such)! + ;; + *-*-rhapsody* | *-*-darwin1.[012]) + # Rhapsody C library is in the System framework + func_append deplibs " System.ltframework" + ;; + *-*-netbsd*) + # Don't link with libc until the a.out ld.so is fixed. + ;; + *-*-openbsd* | *-*-freebsd* | *-*-dragonfly*) + # Do not include libc due to us having libc/libc_r. + ;; + *-*-sco3.2v5* | *-*-sco5v6*) + # Causes problems with __ctype + ;; + *-*-sysv4.2uw2* | *-*-sysv5* | *-*-unixware* | *-*-OpenUNIX*) + # Compiler inserts libc in the correct place for threads to work + ;; + *) + # Add libc to deplibs on all other systems if necessary. + if test "$build_libtool_need_lc" = "yes"; then + func_append deplibs " -lc" + fi + ;; + esac + fi + + # Transform deplibs into only deplibs that can be linked in shared. + name_save=$name + libname_save=$libname + release_save=$release + versuffix_save=$versuffix + major_save=$major + # I'm not sure if I'm treating the release correctly. I think + # release should show up in the -l (ie -lgmp5) so we don't want to + # add it in twice. Is that correct? + release="" + versuffix="" + major="" + newdeplibs= + droppeddeps=no + case $deplibs_check_method in + pass_all) + # Don't check for shared/static. Everything works. + # This might be a little naive. We might want to check + # whether the library exists or not. But this is on + # osf3 & osf4 and I'm not really sure... Just + # implementing what was already the behavior. + newdeplibs=$deplibs + ;; + test_compile) + # This code stresses the "libraries are programs" paradigm to its + # limits. Maybe even breaks it. We compile a program, linking it + # against the deplibs as a proxy for the library. Then we can check + # whether they linked in statically or dynamically with ldd. + $opt_dry_run || $RM conftest.c + cat > conftest.c </dev/null` + $nocaseglob + else + potential_libs=`ls $i/$libnameglob[.-]* 2>/dev/null` + fi + for potent_lib in $potential_libs; do + # Follow soft links. + if ls -lLd "$potent_lib" 2>/dev/null | + $GREP " -> " >/dev/null; then + continue + fi + # The statement above tries to avoid entering an + # endless loop below, in case of cyclic links. + # We might still enter an endless loop, since a link + # loop can be closed while we follow links, + # but so what? + potlib="$potent_lib" + while test -h "$potlib" 2>/dev/null; do + potliblink=`ls -ld $potlib | ${SED} 's/.* -> //'` + case $potliblink in + [\\/]* | [A-Za-z]:[\\/]*) potlib="$potliblink";; + *) potlib=`$ECHO "$potlib" | $SED 's,[^/]*$,,'`"$potliblink";; + esac + done + if eval $file_magic_cmd \"\$potlib\" 2>/dev/null | + $SED -e 10q | + $EGREP "$file_magic_regex" > /dev/null; then + func_append newdeplibs " $a_deplib" + a_deplib="" + break 2 + fi + done + done + fi + if test -n "$a_deplib" ; then + droppeddeps=yes + echo + $ECHO "*** Warning: linker path does not have real file for library $a_deplib." + echo "*** I have the capability to make that library automatically link in when" + echo "*** you link to this library. But I can only do this if you have a" + echo "*** shared version of the library, which you do not appear to have" + echo "*** because I did check the linker path looking for a file starting" + if test -z "$potlib" ; then + $ECHO "*** with $libname but no candidates were found. (...for file magic test)" + else + $ECHO "*** with $libname and none of the candidates passed a file format test" + $ECHO "*** using a file magic. Last file checked: $potlib" + fi + fi + ;; + *) + # Add a -L argument. + func_append newdeplibs " $a_deplib" + ;; + esac + done # Gone through all deplibs. + ;; + match_pattern*) + set dummy $deplibs_check_method; shift + match_pattern_regex=`expr "$deplibs_check_method" : "$1 \(.*\)"` + for a_deplib in $deplibs; do + case $a_deplib in + -l*) + func_stripname -l '' "$a_deplib" + name=$func_stripname_result + if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then + case " $predeps $postdeps " in + *" $a_deplib "*) + func_append newdeplibs " $a_deplib" + a_deplib="" + ;; + esac + fi + if test -n "$a_deplib" ; then + libname=`eval "\\$ECHO \"$libname_spec\""` + for i in $lib_search_path $sys_lib_search_path $shlib_search_path; do + potential_libs=`ls $i/$libname[.-]* 2>/dev/null` + for potent_lib in $potential_libs; do + potlib="$potent_lib" # see symlink-check above in file_magic test + if eval "\$ECHO \"$potent_lib\"" 2>/dev/null | $SED 10q | \ + $EGREP "$match_pattern_regex" > /dev/null; then + func_append newdeplibs " $a_deplib" + a_deplib="" + break 2 + fi + done + done + fi + if test -n "$a_deplib" ; then + droppeddeps=yes + echo + $ECHO "*** Warning: linker path does not have real file for library $a_deplib." + echo "*** I have the capability to make that library automatically link in when" + echo "*** you link to this library. But I can only do this if you have a" + echo "*** shared version of the library, which you do not appear to have" + echo "*** because I did check the linker path looking for a file starting" + if test -z "$potlib" ; then + $ECHO "*** with $libname but no candidates were found. (...for regex pattern test)" + else + $ECHO "*** with $libname and none of the candidates passed a file format test" + $ECHO "*** using a regex pattern. Last file checked: $potlib" + fi + fi + ;; + *) + # Add a -L argument. + func_append newdeplibs " $a_deplib" + ;; + esac + done # Gone through all deplibs. + ;; + none | unknown | *) + newdeplibs="" + tmp_deplibs=`$ECHO " $deplibs" | $SED 's/ -lc$//; s/ -[LR][^ ]*//g'` + if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then + for i in $predeps $postdeps ; do + # can't use Xsed below, because $i might contain '/' + tmp_deplibs=`$ECHO " $tmp_deplibs" | $SED "s,$i,,"` + done + fi + case $tmp_deplibs in + *[!\ \ ]*) + echo + if test "X$deplibs_check_method" = "Xnone"; then + echo "*** Warning: inter-library dependencies are not supported in this platform." + else + echo "*** Warning: inter-library dependencies are not known to be supported." + fi + echo "*** All declared inter-library dependencies are being dropped." + droppeddeps=yes + ;; + esac + ;; + esac + versuffix=$versuffix_save + major=$major_save + release=$release_save + libname=$libname_save + name=$name_save + + case $host in + *-*-rhapsody* | *-*-darwin1.[012]) + # On Rhapsody replace the C library with the System framework + newdeplibs=`$ECHO " $newdeplibs" | $SED 's/ -lc / System.ltframework /'` + ;; + esac + + if test "$droppeddeps" = yes; then + if test "$module" = yes; then + echo + echo "*** Warning: libtool could not satisfy all declared inter-library" + $ECHO "*** dependencies of module $libname. Therefore, libtool will create" + echo "*** a static module, that should work as long as the dlopening" + echo "*** application is linked with the -dlopen flag." + if test -z "$global_symbol_pipe"; then + echo + echo "*** However, this would only work if libtool was able to extract symbol" + echo "*** lists from a program, using \`nm' or equivalent, but libtool could" + echo "*** not find such a program. So, this module is probably useless." + echo "*** \`nm' from GNU binutils and a full rebuild may help." + fi + if test "$build_old_libs" = no; then + oldlibs="$output_objdir/$libname.$libext" + build_libtool_libs=module + build_old_libs=yes + else + build_libtool_libs=no + fi + else + echo "*** The inter-library dependencies that have been dropped here will be" + echo "*** automatically added whenever a program is linked with this library" + echo "*** or is declared to -dlopen it." + + if test "$allow_undefined" = no; then + echo + echo "*** Since this library must not contain undefined symbols," + echo "*** because either the platform does not support them or" + echo "*** it was explicitly requested with -no-undefined," + echo "*** libtool will only create a static version of it." + if test "$build_old_libs" = no; then + oldlibs="$output_objdir/$libname.$libext" + build_libtool_libs=module + build_old_libs=yes + else + build_libtool_libs=no + fi + fi + fi + fi + # Done checking deplibs! + deplibs=$newdeplibs + fi + # Time to change all our "foo.ltframework" stuff back to "-framework foo" + case $host in + *-*-darwin*) + newdeplibs=`$ECHO " $newdeplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` + new_inherited_linker_flags=`$ECHO " $new_inherited_linker_flags" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` + deplibs=`$ECHO " $deplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` + ;; + esac + + # move library search paths that coincide with paths to not yet + # installed libraries to the beginning of the library search list + new_libs= + for path in $notinst_path; do + case " $new_libs " in + *" -L$path/$objdir "*) ;; + *) + case " $deplibs " in + *" -L$path/$objdir "*) + func_append new_libs " -L$path/$objdir" ;; + esac + ;; + esac + done + for deplib in $deplibs; do + case $deplib in + -L*) + case " $new_libs " in + *" $deplib "*) ;; + *) func_append new_libs " $deplib" ;; + esac + ;; + *) func_append new_libs " $deplib" ;; + esac + done + deplibs="$new_libs" + + # All the library-specific variables (install_libdir is set above). + library_names= + old_library= + dlname= + + # Test again, we may have decided not to build it any more + if test "$build_libtool_libs" = yes; then + # Remove ${wl} instances when linking with ld. + # FIXME: should test the right _cmds variable. + case $archive_cmds in + *\$LD\ *) wl= ;; + esac + if test "$hardcode_into_libs" = yes; then + # Hardcode the library paths + hardcode_libdirs= + dep_rpath= + rpath="$finalize_rpath" + test "$opt_mode" != relink && rpath="$compile_rpath$rpath" + for libdir in $rpath; do + if test -n "$hardcode_libdir_flag_spec"; then + if test -n "$hardcode_libdir_separator"; then + func_replace_sysroot "$libdir" + libdir=$func_replace_sysroot_result + if test -z "$hardcode_libdirs"; then + hardcode_libdirs="$libdir" + else + # Just accumulate the unique libdirs. + case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in + *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*) + ;; + *) + func_append hardcode_libdirs "$hardcode_libdir_separator$libdir" + ;; + esac + fi + else + eval flag=\"$hardcode_libdir_flag_spec\" + func_append dep_rpath " $flag" + fi + elif test -n "$runpath_var"; then + case "$perm_rpath " in + *" $libdir "*) ;; + *) func_append perm_rpath " $libdir" ;; + esac + fi + done + # Substitute the hardcoded libdirs into the rpath. + if test -n "$hardcode_libdir_separator" && + test -n "$hardcode_libdirs"; then + libdir="$hardcode_libdirs" + eval "dep_rpath=\"$hardcode_libdir_flag_spec\"" + fi + if test -n "$runpath_var" && test -n "$perm_rpath"; then + # We should set the runpath_var. + rpath= + for dir in $perm_rpath; do + func_append rpath "$dir:" + done + eval "$runpath_var='$rpath\$$runpath_var'; export $runpath_var" + fi + test -n "$dep_rpath" && deplibs="$dep_rpath $deplibs" + fi + + shlibpath="$finalize_shlibpath" + test "$opt_mode" != relink && shlibpath="$compile_shlibpath$shlibpath" + if test -n "$shlibpath"; then + eval "$shlibpath_var='$shlibpath\$$shlibpath_var'; export $shlibpath_var" + fi + + # Get the real and link names of the library. + eval shared_ext=\"$shrext_cmds\" + eval library_names=\"$library_names_spec\" + set dummy $library_names + shift + realname="$1" + shift + + if test -n "$soname_spec"; then + eval soname=\"$soname_spec\" + else + soname="$realname" + fi + if test -z "$dlname"; then + dlname=$soname + fi + + lib="$output_objdir/$realname" + linknames= + for link + do + func_append linknames " $link" + done + + # Use standard objects if they are pic + test -z "$pic_flag" && libobjs=`$ECHO "$libobjs" | $SP2NL | $SED "$lo2o" | $NL2SP` + test "X$libobjs" = "X " && libobjs= + + delfiles= + if test -n "$export_symbols" && test -n "$include_expsyms"; then + $opt_dry_run || cp "$export_symbols" "$output_objdir/$libname.uexp" + export_symbols="$output_objdir/$libname.uexp" + func_append delfiles " $export_symbols" + fi + + orig_export_symbols= + case $host_os in + cygwin* | mingw* | cegcc*) + if test -n "$export_symbols" && test -z "$export_symbols_regex"; then + # exporting using user supplied symfile + if test "x`$SED 1q $export_symbols`" != xEXPORTS; then + # and it's NOT already a .def file. Must figure out + # which of the given symbols are data symbols and tag + # them as such. So, trigger use of export_symbols_cmds. + # export_symbols gets reassigned inside the "prepare + # the list of exported symbols" if statement, so the + # include_expsyms logic still works. + orig_export_symbols="$export_symbols" + export_symbols= + always_export_symbols=yes + fi + fi + ;; + esac + + # Prepare the list of exported symbols + if test -z "$export_symbols"; then + if test "$always_export_symbols" = yes || test -n "$export_symbols_regex"; then + func_verbose "generating symbol list for \`$libname.la'" + export_symbols="$output_objdir/$libname.exp" + $opt_dry_run || $RM $export_symbols + cmds=$export_symbols_cmds + save_ifs="$IFS"; IFS='~' + for cmd1 in $cmds; do + IFS="$save_ifs" + # Take the normal branch if the nm_file_list_spec branch + # doesn't work or if tool conversion is not needed. + case $nm_file_list_spec~$to_tool_file_cmd in + *~func_convert_file_noop | *~func_convert_file_msys_to_w32 | ~*) + try_normal_branch=yes + eval cmd=\"$cmd1\" + func_len " $cmd" + len=$func_len_result + ;; + *) + try_normal_branch=no + ;; + esac + if test "$try_normal_branch" = yes \ + && { test "$len" -lt "$max_cmd_len" \ + || test "$max_cmd_len" -le -1; } + then + func_show_eval "$cmd" 'exit $?' + skipped_export=false + elif test -n "$nm_file_list_spec"; then + func_basename "$output" + output_la=$func_basename_result + save_libobjs=$libobjs + save_output=$output + output=${output_objdir}/${output_la}.nm + func_to_tool_file "$output" + libobjs=$nm_file_list_spec$func_to_tool_file_result + func_append delfiles " $output" + func_verbose "creating $NM input file list: $output" + for obj in $save_libobjs; do + func_to_tool_file "$obj" + $ECHO "$func_to_tool_file_result" + done > "$output" + eval cmd=\"$cmd1\" + func_show_eval "$cmd" 'exit $?' + output=$save_output + libobjs=$save_libobjs + skipped_export=false + else + # The command line is too long to execute in one step. + func_verbose "using reloadable object file for export list..." + skipped_export=: + # Break out early, otherwise skipped_export may be + # set to false by a later but shorter cmd. + break + fi + done + IFS="$save_ifs" + if test -n "$export_symbols_regex" && test "X$skipped_export" != "X:"; then + func_show_eval '$EGREP -e "$export_symbols_regex" "$export_symbols" > "${export_symbols}T"' + func_show_eval '$MV "${export_symbols}T" "$export_symbols"' + fi + fi + fi + + if test -n "$export_symbols" && test -n "$include_expsyms"; then + tmp_export_symbols="$export_symbols" + test -n "$orig_export_symbols" && tmp_export_symbols="$orig_export_symbols" + $opt_dry_run || eval '$ECHO "$include_expsyms" | $SP2NL >> "$tmp_export_symbols"' + fi + + if test "X$skipped_export" != "X:" && test -n "$orig_export_symbols"; then + # The given exports_symbols file has to be filtered, so filter it. + func_verbose "filter symbol list for \`$libname.la' to tag DATA exports" + # FIXME: $output_objdir/$libname.filter potentially contains lots of + # 's' commands which not all seds can handle. GNU sed should be fine + # though. Also, the filter scales superlinearly with the number of + # global variables. join(1) would be nice here, but unfortunately + # isn't a blessed tool. + $opt_dry_run || $SED -e '/[ ,]DATA/!d;s,\(.*\)\([ \,].*\),s|^\1$|\1\2|,' < $export_symbols > $output_objdir/$libname.filter + func_append delfiles " $export_symbols $output_objdir/$libname.filter" + export_symbols=$output_objdir/$libname.def + $opt_dry_run || $SED -f $output_objdir/$libname.filter < $orig_export_symbols > $export_symbols + fi + + tmp_deplibs= + for test_deplib in $deplibs; do + case " $convenience " in + *" $test_deplib "*) ;; + *) + func_append tmp_deplibs " $test_deplib" + ;; + esac + done + deplibs="$tmp_deplibs" + + if test -n "$convenience"; then + if test -n "$whole_archive_flag_spec" && + test "$compiler_needs_object" = yes && + test -z "$libobjs"; then + # extract the archives, so we have objects to list. + # TODO: could optimize this to just extract one archive. + whole_archive_flag_spec= + fi + if test -n "$whole_archive_flag_spec"; then + save_libobjs=$libobjs + eval libobjs=\"\$libobjs $whole_archive_flag_spec\" + test "X$libobjs" = "X " && libobjs= + else + gentop="$output_objdir/${outputname}x" + func_append generated " $gentop" + + func_extract_archives $gentop $convenience + func_append libobjs " $func_extract_archives_result" + test "X$libobjs" = "X " && libobjs= + fi + fi + + if test "$thread_safe" = yes && test -n "$thread_safe_flag_spec"; then + eval flag=\"$thread_safe_flag_spec\" + func_append linker_flags " $flag" + fi + + # Make a backup of the uninstalled library when relinking + if test "$opt_mode" = relink; then + $opt_dry_run || eval '(cd $output_objdir && $RM ${realname}U && $MV $realname ${realname}U)' || exit $? + fi + + # Do each of the archive commands. + if test "$module" = yes && test -n "$module_cmds" ; then + if test -n "$export_symbols" && test -n "$module_expsym_cmds"; then + eval test_cmds=\"$module_expsym_cmds\" + cmds=$module_expsym_cmds + else + eval test_cmds=\"$module_cmds\" + cmds=$module_cmds + fi + else + if test -n "$export_symbols" && test -n "$archive_expsym_cmds"; then + eval test_cmds=\"$archive_expsym_cmds\" + cmds=$archive_expsym_cmds + else + eval test_cmds=\"$archive_cmds\" + cmds=$archive_cmds + fi + fi + + if test "X$skipped_export" != "X:" && + func_len " $test_cmds" && + len=$func_len_result && + test "$len" -lt "$max_cmd_len" || test "$max_cmd_len" -le -1; then + : + else + # The command line is too long to link in one step, link piecewise + # or, if using GNU ld and skipped_export is not :, use a linker + # script. + + # Save the value of $output and $libobjs because we want to + # use them later. If we have whole_archive_flag_spec, we + # want to use save_libobjs as it was before + # whole_archive_flag_spec was expanded, because we can't + # assume the linker understands whole_archive_flag_spec. + # This may have to be revisited, in case too many + # convenience libraries get linked in and end up exceeding + # the spec. + if test -z "$convenience" || test -z "$whole_archive_flag_spec"; then + save_libobjs=$libobjs + fi + save_output=$output + func_basename "$output" + output_la=$func_basename_result + + # Clear the reloadable object creation command queue and + # initialize k to one. + test_cmds= + concat_cmds= + objlist= + last_robj= + k=1 + + if test -n "$save_libobjs" && test "X$skipped_export" != "X:" && test "$with_gnu_ld" = yes; then + output=${output_objdir}/${output_la}.lnkscript + func_verbose "creating GNU ld script: $output" + echo 'INPUT (' > $output + for obj in $save_libobjs + do + func_to_tool_file "$obj" + $ECHO "$func_to_tool_file_result" >> $output + done + echo ')' >> $output + func_append delfiles " $output" + func_to_tool_file "$output" + output=$func_to_tool_file_result + elif test -n "$save_libobjs" && test "X$skipped_export" != "X:" && test "X$file_list_spec" != X; then + output=${output_objdir}/${output_la}.lnk + func_verbose "creating linker input file list: $output" + : > $output + set x $save_libobjs + shift + firstobj= + if test "$compiler_needs_object" = yes; then + firstobj="$1 " + shift + fi + for obj + do + func_to_tool_file "$obj" + $ECHO "$func_to_tool_file_result" >> $output + done + func_append delfiles " $output" + func_to_tool_file "$output" + output=$firstobj\"$file_list_spec$func_to_tool_file_result\" + else + if test -n "$save_libobjs"; then + func_verbose "creating reloadable object files..." + output=$output_objdir/$output_la-${k}.$objext + eval test_cmds=\"$reload_cmds\" + func_len " $test_cmds" + len0=$func_len_result + len=$len0 + + # Loop over the list of objects to be linked. + for obj in $save_libobjs + do + func_len " $obj" + func_arith $len + $func_len_result + len=$func_arith_result + if test "X$objlist" = X || + test "$len" -lt "$max_cmd_len"; then + func_append objlist " $obj" + else + # The command $test_cmds is almost too long, add a + # command to the queue. + if test "$k" -eq 1 ; then + # The first file doesn't have a previous command to add. + reload_objs=$objlist + eval concat_cmds=\"$reload_cmds\" + else + # All subsequent reloadable object files will link in + # the last one created. + reload_objs="$objlist $last_robj" + eval concat_cmds=\"\$concat_cmds~$reload_cmds~\$RM $last_robj\" + fi + last_robj=$output_objdir/$output_la-${k}.$objext + func_arith $k + 1 + k=$func_arith_result + output=$output_objdir/$output_la-${k}.$objext + objlist=" $obj" + func_len " $last_robj" + func_arith $len0 + $func_len_result + len=$func_arith_result + fi + done + # Handle the remaining objects by creating one last + # reloadable object file. All subsequent reloadable object + # files will link in the last one created. + test -z "$concat_cmds" || concat_cmds=$concat_cmds~ + reload_objs="$objlist $last_robj" + eval concat_cmds=\"\${concat_cmds}$reload_cmds\" + if test -n "$last_robj"; then + eval concat_cmds=\"\${concat_cmds}~\$RM $last_robj\" + fi + func_append delfiles " $output" + + else + output= + fi + + if ${skipped_export-false}; then + func_verbose "generating symbol list for \`$libname.la'" + export_symbols="$output_objdir/$libname.exp" + $opt_dry_run || $RM $export_symbols + libobjs=$output + # Append the command to create the export file. + test -z "$concat_cmds" || concat_cmds=$concat_cmds~ + eval concat_cmds=\"\$concat_cmds$export_symbols_cmds\" + if test -n "$last_robj"; then + eval concat_cmds=\"\$concat_cmds~\$RM $last_robj\" + fi + fi + + test -n "$save_libobjs" && + func_verbose "creating a temporary reloadable object file: $output" + + # Loop through the commands generated above and execute them. + save_ifs="$IFS"; IFS='~' + for cmd in $concat_cmds; do + IFS="$save_ifs" + $opt_silent || { + func_quote_for_expand "$cmd" + eval "func_echo $func_quote_for_expand_result" + } + $opt_dry_run || eval "$cmd" || { + lt_exit=$? + + # Restore the uninstalled library and exit + if test "$opt_mode" = relink; then + ( cd "$output_objdir" && \ + $RM "${realname}T" && \ + $MV "${realname}U" "$realname" ) + fi + + exit $lt_exit + } + done + IFS="$save_ifs" + + if test -n "$export_symbols_regex" && ${skipped_export-false}; then + func_show_eval '$EGREP -e "$export_symbols_regex" "$export_symbols" > "${export_symbols}T"' + func_show_eval '$MV "${export_symbols}T" "$export_symbols"' + fi + fi + + if ${skipped_export-false}; then + if test -n "$export_symbols" && test -n "$include_expsyms"; then + tmp_export_symbols="$export_symbols" + test -n "$orig_export_symbols" && tmp_export_symbols="$orig_export_symbols" + $opt_dry_run || eval '$ECHO "$include_expsyms" | $SP2NL >> "$tmp_export_symbols"' + fi + + if test -n "$orig_export_symbols"; then + # The given exports_symbols file has to be filtered, so filter it. + func_verbose "filter symbol list for \`$libname.la' to tag DATA exports" + # FIXME: $output_objdir/$libname.filter potentially contains lots of + # 's' commands which not all seds can handle. GNU sed should be fine + # though. Also, the filter scales superlinearly with the number of + # global variables. join(1) would be nice here, but unfortunately + # isn't a blessed tool. + $opt_dry_run || $SED -e '/[ ,]DATA/!d;s,\(.*\)\([ \,].*\),s|^\1$|\1\2|,' < $export_symbols > $output_objdir/$libname.filter + func_append delfiles " $export_symbols $output_objdir/$libname.filter" + export_symbols=$output_objdir/$libname.def + $opt_dry_run || $SED -f $output_objdir/$libname.filter < $orig_export_symbols > $export_symbols + fi + fi + + libobjs=$output + # Restore the value of output. + output=$save_output + + if test -n "$convenience" && test -n "$whole_archive_flag_spec"; then + eval libobjs=\"\$libobjs $whole_archive_flag_spec\" + test "X$libobjs" = "X " && libobjs= + fi + # Expand the library linking commands again to reset the + # value of $libobjs for piecewise linking. + + # Do each of the archive commands. + if test "$module" = yes && test -n "$module_cmds" ; then + if test -n "$export_symbols" && test -n "$module_expsym_cmds"; then + cmds=$module_expsym_cmds + else + cmds=$module_cmds + fi + else + if test -n "$export_symbols" && test -n "$archive_expsym_cmds"; then + cmds=$archive_expsym_cmds + else + cmds=$archive_cmds + fi + fi + fi + + if test -n "$delfiles"; then + # Append the command to remove temporary files to $cmds. + eval cmds=\"\$cmds~\$RM $delfiles\" + fi + + # Add any objects from preloaded convenience libraries + if test -n "$dlprefiles"; then + gentop="$output_objdir/${outputname}x" + func_append generated " $gentop" + + func_extract_archives $gentop $dlprefiles + func_append libobjs " $func_extract_archives_result" + test "X$libobjs" = "X " && libobjs= + fi + + save_ifs="$IFS"; IFS='~' + for cmd in $cmds; do + IFS="$save_ifs" + eval cmd=\"$cmd\" + $opt_silent || { + func_quote_for_expand "$cmd" + eval "func_echo $func_quote_for_expand_result" + } + $opt_dry_run || eval "$cmd" || { + lt_exit=$? + + # Restore the uninstalled library and exit + if test "$opt_mode" = relink; then + ( cd "$output_objdir" && \ + $RM "${realname}T" && \ + $MV "${realname}U" "$realname" ) + fi + + exit $lt_exit + } + done + IFS="$save_ifs" + + # Restore the uninstalled library and exit + if test "$opt_mode" = relink; then + $opt_dry_run || eval '(cd $output_objdir && $RM ${realname}T && $MV $realname ${realname}T && $MV ${realname}U $realname)' || exit $? + + if test -n "$convenience"; then + if test -z "$whole_archive_flag_spec"; then + func_show_eval '${RM}r "$gentop"' + fi + fi + + exit $EXIT_SUCCESS + fi + + # Create links to the real library. + for linkname in $linknames; do + if test "$realname" != "$linkname"; then + func_show_eval '(cd "$output_objdir" && $RM "$linkname" && $LN_S "$realname" "$linkname")' 'exit $?' + fi + done + + # If -module or -export-dynamic was specified, set the dlname. + if test "$module" = yes || test "$export_dynamic" = yes; then + # On all known operating systems, these are identical. + dlname="$soname" + fi + fi + ;; + + obj) + if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then + func_warning "\`-dlopen' is ignored for objects" + fi + + case " $deplibs" in + *\ -l* | *\ -L*) + func_warning "\`-l' and \`-L' are ignored for objects" ;; + esac + + test -n "$rpath" && \ + func_warning "\`-rpath' is ignored for objects" + + test -n "$xrpath" && \ + func_warning "\`-R' is ignored for objects" + + test -n "$vinfo" && \ + func_warning "\`-version-info' is ignored for objects" + + test -n "$release" && \ + func_warning "\`-release' is ignored for objects" + + case $output in + *.lo) + test -n "$objs$old_deplibs" && \ + func_fatal_error "cannot build library object \`$output' from non-libtool objects" + + libobj=$output + func_lo2o "$libobj" + obj=$func_lo2o_result + ;; + *) + libobj= + obj="$output" + ;; + esac + + # Delete the old objects. + $opt_dry_run || $RM $obj $libobj + + # Objects from convenience libraries. This assumes + # single-version convenience libraries. Whenever we create + # different ones for PIC/non-PIC, this we'll have to duplicate + # the extraction. + reload_conv_objs= + gentop= + # reload_cmds runs $LD directly, so let us get rid of + # -Wl from whole_archive_flag_spec and hope we can get by with + # turning comma into space.. + wl= + + if test -n "$convenience"; then + if test -n "$whole_archive_flag_spec"; then + eval tmp_whole_archive_flags=\"$whole_archive_flag_spec\" + reload_conv_objs=$reload_objs\ `$ECHO "$tmp_whole_archive_flags" | $SED 's|,| |g'` + else + gentop="$output_objdir/${obj}x" + func_append generated " $gentop" + + func_extract_archives $gentop $convenience + reload_conv_objs="$reload_objs $func_extract_archives_result" + fi + fi + + # If we're not building shared, we need to use non_pic_objs + test "$build_libtool_libs" != yes && libobjs="$non_pic_objects" + + # Create the old-style object. + reload_objs="$objs$old_deplibs "`$ECHO "$libobjs" | $SP2NL | $SED "/\.${libext}$/d; /\.lib$/d; $lo2o" | $NL2SP`" $reload_conv_objs" ### testsuite: skip nested quoting test + + output="$obj" + func_execute_cmds "$reload_cmds" 'exit $?' + + # Exit if we aren't doing a library object file. + if test -z "$libobj"; then + if test -n "$gentop"; then + func_show_eval '${RM}r "$gentop"' + fi + + exit $EXIT_SUCCESS + fi + + if test "$build_libtool_libs" != yes; then + if test -n "$gentop"; then + func_show_eval '${RM}r "$gentop"' + fi + + # Create an invalid libtool object if no PIC, so that we don't + # accidentally link it into a program. + # $show "echo timestamp > $libobj" + # $opt_dry_run || eval "echo timestamp > $libobj" || exit $? + exit $EXIT_SUCCESS + fi + + if test -n "$pic_flag" || test "$pic_mode" != default; then + # Only do commands if we really have different PIC objects. + reload_objs="$libobjs $reload_conv_objs" + output="$libobj" + func_execute_cmds "$reload_cmds" 'exit $?' + fi + + if test -n "$gentop"; then + func_show_eval '${RM}r "$gentop"' + fi + + exit $EXIT_SUCCESS + ;; + + prog) + case $host in + *cygwin*) func_stripname '' '.exe' "$output" + output=$func_stripname_result.exe;; + esac + test -n "$vinfo" && \ + func_warning "\`-version-info' is ignored for programs" + + test -n "$release" && \ + func_warning "\`-release' is ignored for programs" + + test "$preload" = yes \ + && test "$dlopen_support" = unknown \ + && test "$dlopen_self" = unknown \ + && test "$dlopen_self_static" = unknown && \ + func_warning "\`LT_INIT([dlopen])' not used. Assuming no dlopen support." + + case $host in + *-*-rhapsody* | *-*-darwin1.[012]) + # On Rhapsody replace the C library is the System framework + compile_deplibs=`$ECHO " $compile_deplibs" | $SED 's/ -lc / System.ltframework /'` + finalize_deplibs=`$ECHO " $finalize_deplibs" | $SED 's/ -lc / System.ltframework /'` + ;; + esac + + case $host in + *-*-darwin*) + # Don't allow lazy linking, it breaks C++ global constructors + # But is supposedly fixed on 10.4 or later (yay!). + if test "$tagname" = CXX ; then + case ${MACOSX_DEPLOYMENT_TARGET-10.0} in + 10.[0123]) + func_append compile_command " ${wl}-bind_at_load" + func_append finalize_command " ${wl}-bind_at_load" + ;; + esac + fi + # Time to change all our "foo.ltframework" stuff back to "-framework foo" + compile_deplibs=`$ECHO " $compile_deplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` + finalize_deplibs=`$ECHO " $finalize_deplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` + ;; + esac + + + # move library search paths that coincide with paths to not yet + # installed libraries to the beginning of the library search list + new_libs= + for path in $notinst_path; do + case " $new_libs " in + *" -L$path/$objdir "*) ;; + *) + case " $compile_deplibs " in + *" -L$path/$objdir "*) + func_append new_libs " -L$path/$objdir" ;; + esac + ;; + esac + done + for deplib in $compile_deplibs; do + case $deplib in + -L*) + case " $new_libs " in + *" $deplib "*) ;; + *) func_append new_libs " $deplib" ;; + esac + ;; + *) func_append new_libs " $deplib" ;; + esac + done + compile_deplibs="$new_libs" + + + func_append compile_command " $compile_deplibs" + func_append finalize_command " $finalize_deplibs" + + if test -n "$rpath$xrpath"; then + # If the user specified any rpath flags, then add them. + for libdir in $rpath $xrpath; do + # This is the magic to use -rpath. + case "$finalize_rpath " in + *" $libdir "*) ;; + *) func_append finalize_rpath " $libdir" ;; + esac + done + fi + + # Now hardcode the library paths + rpath= + hardcode_libdirs= + for libdir in $compile_rpath $finalize_rpath; do + if test -n "$hardcode_libdir_flag_spec"; then + if test -n "$hardcode_libdir_separator"; then + if test -z "$hardcode_libdirs"; then + hardcode_libdirs="$libdir" + else + # Just accumulate the unique libdirs. + case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in + *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*) + ;; + *) + func_append hardcode_libdirs "$hardcode_libdir_separator$libdir" + ;; + esac + fi + else + eval flag=\"$hardcode_libdir_flag_spec\" + func_append rpath " $flag" + fi + elif test -n "$runpath_var"; then + case "$perm_rpath " in + *" $libdir "*) ;; + *) func_append perm_rpath " $libdir" ;; + esac + fi + case $host in + *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*) + testbindir=`${ECHO} "$libdir" | ${SED} -e 's*/lib$*/bin*'` + case :$dllsearchpath: in + *":$libdir:"*) ;; + ::) dllsearchpath=$libdir;; + *) func_append dllsearchpath ":$libdir";; + esac + case :$dllsearchpath: in + *":$testbindir:"*) ;; + ::) dllsearchpath=$testbindir;; + *) func_append dllsearchpath ":$testbindir";; + esac + ;; + esac + done + # Substitute the hardcoded libdirs into the rpath. + if test -n "$hardcode_libdir_separator" && + test -n "$hardcode_libdirs"; then + libdir="$hardcode_libdirs" + eval rpath=\" $hardcode_libdir_flag_spec\" + fi + compile_rpath="$rpath" + + rpath= + hardcode_libdirs= + for libdir in $finalize_rpath; do + if test -n "$hardcode_libdir_flag_spec"; then + if test -n "$hardcode_libdir_separator"; then + if test -z "$hardcode_libdirs"; then + hardcode_libdirs="$libdir" + else + # Just accumulate the unique libdirs. + case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in + *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*) + ;; + *) + func_append hardcode_libdirs "$hardcode_libdir_separator$libdir" + ;; + esac + fi + else + eval flag=\"$hardcode_libdir_flag_spec\" + func_append rpath " $flag" + fi + elif test -n "$runpath_var"; then + case "$finalize_perm_rpath " in + *" $libdir "*) ;; + *) func_append finalize_perm_rpath " $libdir" ;; + esac + fi + done + # Substitute the hardcoded libdirs into the rpath. + if test -n "$hardcode_libdir_separator" && + test -n "$hardcode_libdirs"; then + libdir="$hardcode_libdirs" + eval rpath=\" $hardcode_libdir_flag_spec\" + fi + finalize_rpath="$rpath" + + if test -n "$libobjs" && test "$build_old_libs" = yes; then + # Transform all the library objects into standard objects. + compile_command=`$ECHO "$compile_command" | $SP2NL | $SED "$lo2o" | $NL2SP` + finalize_command=`$ECHO "$finalize_command" | $SP2NL | $SED "$lo2o" | $NL2SP` + fi + + func_generate_dlsyms "$outputname" "@PROGRAM@" "no" + + # template prelinking step + if test -n "$prelink_cmds"; then + func_execute_cmds "$prelink_cmds" 'exit $?' + fi + + wrappers_required=yes + case $host in + *cegcc* | *mingw32ce*) + # Disable wrappers for cegcc and mingw32ce hosts, we are cross compiling anyway. + wrappers_required=no + ;; + *cygwin* | *mingw* ) + if test "$build_libtool_libs" != yes; then + wrappers_required=no + fi + ;; + *) + if test "$need_relink" = no || test "$build_libtool_libs" != yes; then + wrappers_required=no + fi + ;; + esac + if test "$wrappers_required" = no; then + # Replace the output file specification. + compile_command=`$ECHO "$compile_command" | $SED 's%@OUTPUT@%'"$output"'%g'` + link_command="$compile_command$compile_rpath" + + # We have no uninstalled library dependencies, so finalize right now. + exit_status=0 + func_show_eval "$link_command" 'exit_status=$?' + + if test -n "$postlink_cmds"; then + func_to_tool_file "$output" + postlink_cmds=`func_echo_all "$postlink_cmds" | $SED -e 's%@OUTPUT@%'"$output"'%g' -e 's%@TOOL_OUTPUT@%'"$func_to_tool_file_result"'%g'` + func_execute_cmds "$postlink_cmds" 'exit $?' + fi + + # Delete the generated files. + if test -f "$output_objdir/${outputname}S.${objext}"; then + func_show_eval '$RM "$output_objdir/${outputname}S.${objext}"' + fi + + exit $exit_status + fi + + if test -n "$compile_shlibpath$finalize_shlibpath"; then + compile_command="$shlibpath_var=\"$compile_shlibpath$finalize_shlibpath\$$shlibpath_var\" $compile_command" + fi + if test -n "$finalize_shlibpath"; then + finalize_command="$shlibpath_var=\"$finalize_shlibpath\$$shlibpath_var\" $finalize_command" + fi + + compile_var= + finalize_var= + if test -n "$runpath_var"; then + if test -n "$perm_rpath"; then + # We should set the runpath_var. + rpath= + for dir in $perm_rpath; do + func_append rpath "$dir:" + done + compile_var="$runpath_var=\"$rpath\$$runpath_var\" " + fi + if test -n "$finalize_perm_rpath"; then + # We should set the runpath_var. + rpath= + for dir in $finalize_perm_rpath; do + func_append rpath "$dir:" + done + finalize_var="$runpath_var=\"$rpath\$$runpath_var\" " + fi + fi + + if test "$no_install" = yes; then + # We don't need to create a wrapper script. + link_command="$compile_var$compile_command$compile_rpath" + # Replace the output file specification. + link_command=`$ECHO "$link_command" | $SED 's%@OUTPUT@%'"$output"'%g'` + # Delete the old output file. + $opt_dry_run || $RM $output + # Link the executable and exit + func_show_eval "$link_command" 'exit $?' + + if test -n "$postlink_cmds"; then + func_to_tool_file "$output" + postlink_cmds=`func_echo_all "$postlink_cmds" | $SED -e 's%@OUTPUT@%'"$output"'%g' -e 's%@TOOL_OUTPUT@%'"$func_to_tool_file_result"'%g'` + func_execute_cmds "$postlink_cmds" 'exit $?' + fi + + exit $EXIT_SUCCESS + fi + + if test "$hardcode_action" = relink; then + # Fast installation is not supported + link_command="$compile_var$compile_command$compile_rpath" + relink_command="$finalize_var$finalize_command$finalize_rpath" + + func_warning "this platform does not like uninstalled shared libraries" + func_warning "\`$output' will be relinked during installation" + else + if test "$fast_install" != no; then + link_command="$finalize_var$compile_command$finalize_rpath" + if test "$fast_install" = yes; then + relink_command=`$ECHO "$compile_var$compile_command$compile_rpath" | $SED 's%@OUTPUT@%\$progdir/\$file%g'` + else + # fast_install is set to needless + relink_command= + fi + else + link_command="$compile_var$compile_command$compile_rpath" + relink_command="$finalize_var$finalize_command$finalize_rpath" + fi + fi + + # Replace the output file specification. + link_command=`$ECHO "$link_command" | $SED 's%@OUTPUT@%'"$output_objdir/$outputname"'%g'` + + # Delete the old output files. + $opt_dry_run || $RM $output $output_objdir/$outputname $output_objdir/lt-$outputname + + func_show_eval "$link_command" 'exit $?' + + if test -n "$postlink_cmds"; then + func_to_tool_file "$output_objdir/$outputname" + postlink_cmds=`func_echo_all "$postlink_cmds" | $SED -e 's%@OUTPUT@%'"$output_objdir/$outputname"'%g' -e 's%@TOOL_OUTPUT@%'"$func_to_tool_file_result"'%g'` + func_execute_cmds "$postlink_cmds" 'exit $?' + fi + + # Now create the wrapper script. + func_verbose "creating $output" + + # Quote the relink command for shipping. + if test -n "$relink_command"; then + # Preserve any variables that may affect compiler behavior + for var in $variables_saved_for_relink; do + if eval test -z \"\${$var+set}\"; then + relink_command="{ test -z \"\${$var+set}\" || $lt_unset $var || { $var=; export $var; }; }; $relink_command" + elif eval var_value=\$$var; test -z "$var_value"; then + relink_command="$var=; export $var; $relink_command" + else + func_quote_for_eval "$var_value" + relink_command="$var=$func_quote_for_eval_result; export $var; $relink_command" + fi + done + relink_command="(cd `pwd`; $relink_command)" + relink_command=`$ECHO "$relink_command" | $SED "$sed_quote_subst"` + fi + + # Only actually do things if not in dry run mode. + $opt_dry_run || { + # win32 will think the script is a binary if it has + # a .exe suffix, so we strip it off here. + case $output in + *.exe) func_stripname '' '.exe' "$output" + output=$func_stripname_result ;; + esac + # test for cygwin because mv fails w/o .exe extensions + case $host in + *cygwin*) + exeext=.exe + func_stripname '' '.exe' "$outputname" + outputname=$func_stripname_result ;; + *) exeext= ;; + esac + case $host in + *cygwin* | *mingw* ) + func_dirname_and_basename "$output" "" "." + output_name=$func_basename_result + output_path=$func_dirname_result + cwrappersource="$output_path/$objdir/lt-$output_name.c" + cwrapper="$output_path/$output_name.exe" + $RM $cwrappersource $cwrapper + trap "$RM $cwrappersource $cwrapper; exit $EXIT_FAILURE" 1 2 15 + + func_emit_cwrapperexe_src > $cwrappersource + + # The wrapper executable is built using the $host compiler, + # because it contains $host paths and files. If cross- + # compiling, it, like the target executable, must be + # executed on the $host or under an emulation environment. + $opt_dry_run || { + $LTCC $LTCFLAGS -o $cwrapper $cwrappersource + $STRIP $cwrapper + } + + # Now, create the wrapper script for func_source use: + func_ltwrapper_scriptname $cwrapper + $RM $func_ltwrapper_scriptname_result + trap "$RM $func_ltwrapper_scriptname_result; exit $EXIT_FAILURE" 1 2 15 + $opt_dry_run || { + # note: this script will not be executed, so do not chmod. + if test "x$build" = "x$host" ; then + $cwrapper --lt-dump-script > $func_ltwrapper_scriptname_result + else + func_emit_wrapper no > $func_ltwrapper_scriptname_result + fi + } + ;; + * ) + $RM $output + trap "$RM $output; exit $EXIT_FAILURE" 1 2 15 + + func_emit_wrapper no > $output + chmod +x $output + ;; + esac + } + exit $EXIT_SUCCESS + ;; + esac + + # See if we need to build an old-fashioned archive. + for oldlib in $oldlibs; do + + if test "$build_libtool_libs" = convenience; then + oldobjs="$libobjs_save $symfileobj" + addlibs="$convenience" + build_libtool_libs=no + else + if test "$build_libtool_libs" = module; then + oldobjs="$libobjs_save" + build_libtool_libs=no + else + oldobjs="$old_deplibs $non_pic_objects" + if test "$preload" = yes && test -f "$symfileobj"; then + func_append oldobjs " $symfileobj" + fi + fi + addlibs="$old_convenience" + fi + + if test -n "$addlibs"; then + gentop="$output_objdir/${outputname}x" + func_append generated " $gentop" + + func_extract_archives $gentop $addlibs + func_append oldobjs " $func_extract_archives_result" + fi + + # Do each command in the archive commands. + if test -n "$old_archive_from_new_cmds" && test "$build_libtool_libs" = yes; then + cmds=$old_archive_from_new_cmds + else + + # Add any objects from preloaded convenience libraries + if test -n "$dlprefiles"; then + gentop="$output_objdir/${outputname}x" + func_append generated " $gentop" + + func_extract_archives $gentop $dlprefiles + func_append oldobjs " $func_extract_archives_result" + fi + + # POSIX demands no paths to be encoded in archives. We have + # to avoid creating archives with duplicate basenames if we + # might have to extract them afterwards, e.g., when creating a + # static archive out of a convenience library, or when linking + # the entirety of a libtool archive into another (currently + # not supported by libtool). + if (for obj in $oldobjs + do + func_basename "$obj" + $ECHO "$func_basename_result" + done | sort | sort -uc >/dev/null 2>&1); then + : + else + echo "copying selected object files to avoid basename conflicts..." + gentop="$output_objdir/${outputname}x" + func_append generated " $gentop" + func_mkdir_p "$gentop" + save_oldobjs=$oldobjs + oldobjs= + counter=1 + for obj in $save_oldobjs + do + func_basename "$obj" + objbase="$func_basename_result" + case " $oldobjs " in + " ") oldobjs=$obj ;; + *[\ /]"$objbase "*) + while :; do + # Make sure we don't pick an alternate name that also + # overlaps. + newobj=lt$counter-$objbase + func_arith $counter + 1 + counter=$func_arith_result + case " $oldobjs " in + *[\ /]"$newobj "*) ;; + *) if test ! -f "$gentop/$newobj"; then break; fi ;; + esac + done + func_show_eval "ln $obj $gentop/$newobj || cp $obj $gentop/$newobj" + func_append oldobjs " $gentop/$newobj" + ;; + *) func_append oldobjs " $obj" ;; + esac + done + fi + func_to_tool_file "$oldlib" func_convert_file_msys_to_w32 + tool_oldlib=$func_to_tool_file_result + eval cmds=\"$old_archive_cmds\" + + func_len " $cmds" + len=$func_len_result + if test "$len" -lt "$max_cmd_len" || test "$max_cmd_len" -le -1; then + cmds=$old_archive_cmds + elif test -n "$archiver_list_spec"; then + func_verbose "using command file archive linking..." + for obj in $oldobjs + do + func_to_tool_file "$obj" + $ECHO "$func_to_tool_file_result" + done > $output_objdir/$libname.libcmd + func_to_tool_file "$output_objdir/$libname.libcmd" + oldobjs=" $archiver_list_spec$func_to_tool_file_result" + cmds=$old_archive_cmds + else + # the command line is too long to link in one step, link in parts + func_verbose "using piecewise archive linking..." + save_RANLIB=$RANLIB + RANLIB=: + objlist= + concat_cmds= + save_oldobjs=$oldobjs + oldobjs= + # Is there a better way of finding the last object in the list? + for obj in $save_oldobjs + do + last_oldobj=$obj + done + eval test_cmds=\"$old_archive_cmds\" + func_len " $test_cmds" + len0=$func_len_result + len=$len0 + for obj in $save_oldobjs + do + func_len " $obj" + func_arith $len + $func_len_result + len=$func_arith_result + func_append objlist " $obj" + if test "$len" -lt "$max_cmd_len"; then + : + else + # the above command should be used before it gets too long + oldobjs=$objlist + if test "$obj" = "$last_oldobj" ; then + RANLIB=$save_RANLIB + fi + test -z "$concat_cmds" || concat_cmds=$concat_cmds~ + eval concat_cmds=\"\${concat_cmds}$old_archive_cmds\" + objlist= + len=$len0 + fi + done + RANLIB=$save_RANLIB + oldobjs=$objlist + if test "X$oldobjs" = "X" ; then + eval cmds=\"\$concat_cmds\" + else + eval cmds=\"\$concat_cmds~\$old_archive_cmds\" + fi + fi + fi + func_execute_cmds "$cmds" 'exit $?' + done + + test -n "$generated" && \ + func_show_eval "${RM}r$generated" + + # Now create the libtool archive. + case $output in + *.la) + old_library= + test "$build_old_libs" = yes && old_library="$libname.$libext" + func_verbose "creating $output" + + # Preserve any variables that may affect compiler behavior + for var in $variables_saved_for_relink; do + if eval test -z \"\${$var+set}\"; then + relink_command="{ test -z \"\${$var+set}\" || $lt_unset $var || { $var=; export $var; }; }; $relink_command" + elif eval var_value=\$$var; test -z "$var_value"; then + relink_command="$var=; export $var; $relink_command" + else + func_quote_for_eval "$var_value" + relink_command="$var=$func_quote_for_eval_result; export $var; $relink_command" + fi + done + # Quote the link command for shipping. + relink_command="(cd `pwd`; $SHELL $progpath $preserve_args --mode=relink $libtool_args @inst_prefix_dir@)" + relink_command=`$ECHO "$relink_command" | $SED "$sed_quote_subst"` + if test "$hardcode_automatic" = yes ; then + relink_command= + fi + + # Only create the output if not a dry run. + $opt_dry_run || { + for installed in no yes; do + if test "$installed" = yes; then + if test -z "$install_libdir"; then + break + fi + output="$output_objdir/$outputname"i + # Replace all uninstalled libtool libraries with the installed ones + newdependency_libs= + for deplib in $dependency_libs; do + case $deplib in + *.la) + func_basename "$deplib" + name="$func_basename_result" + func_resolve_sysroot "$deplib" + eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $func_resolve_sysroot_result` + test -z "$libdir" && \ + func_fatal_error "\`$deplib' is not a valid libtool archive" + func_append newdependency_libs " ${lt_sysroot:+=}$libdir/$name" + ;; + -L*) + func_stripname -L '' "$deplib" + func_replace_sysroot "$func_stripname_result" + func_append newdependency_libs " -L$func_replace_sysroot_result" + ;; + -R*) + func_stripname -R '' "$deplib" + func_replace_sysroot "$func_stripname_result" + func_append newdependency_libs " -R$func_replace_sysroot_result" + ;; + *) func_append newdependency_libs " $deplib" ;; + esac + done + dependency_libs="$newdependency_libs" + newdlfiles= + + for lib in $dlfiles; do + case $lib in + *.la) + func_basename "$lib" + name="$func_basename_result" + eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $lib` + test -z "$libdir" && \ + func_fatal_error "\`$lib' is not a valid libtool archive" + func_append newdlfiles " ${lt_sysroot:+=}$libdir/$name" + ;; + *) func_append newdlfiles " $lib" ;; + esac + done + dlfiles="$newdlfiles" + newdlprefiles= + for lib in $dlprefiles; do + case $lib in + *.la) + # Only pass preopened files to the pseudo-archive (for + # eventual linking with the app. that links it) if we + # didn't already link the preopened objects directly into + # the library: + func_basename "$lib" + name="$func_basename_result" + eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $lib` + test -z "$libdir" && \ + func_fatal_error "\`$lib' is not a valid libtool archive" + func_append newdlprefiles " ${lt_sysroot:+=}$libdir/$name" + ;; + esac + done + dlprefiles="$newdlprefiles" + else + newdlfiles= + for lib in $dlfiles; do + case $lib in + [\\/]* | [A-Za-z]:[\\/]*) abs="$lib" ;; + *) abs=`pwd`"/$lib" ;; + esac + func_append newdlfiles " $abs" + done + dlfiles="$newdlfiles" + newdlprefiles= + for lib in $dlprefiles; do + case $lib in + [\\/]* | [A-Za-z]:[\\/]*) abs="$lib" ;; + *) abs=`pwd`"/$lib" ;; + esac + func_append newdlprefiles " $abs" + done + dlprefiles="$newdlprefiles" + fi + $RM $output + # place dlname in correct position for cygwin + # In fact, it would be nice if we could use this code for all target + # systems that can't hard-code library paths into their executables + # and that have no shared library path variable independent of PATH, + # but it turns out we can't easily determine that from inspecting + # libtool variables, so we have to hard-code the OSs to which it + # applies here; at the moment, that means platforms that use the PE + # object format with DLL files. See the long comment at the top of + # tests/bindir.at for full details. + tdlname=$dlname + case $host,$output,$installed,$module,$dlname in + *cygwin*,*lai,yes,no,*.dll | *mingw*,*lai,yes,no,*.dll | *cegcc*,*lai,yes,no,*.dll) + # If a -bindir argument was supplied, place the dll there. + if test "x$bindir" != x ; + then + func_relative_path "$install_libdir" "$bindir" + tdlname=$func_relative_path_result$dlname + else + # Otherwise fall back on heuristic. + tdlname=../bin/$dlname + fi + ;; + esac + $ECHO > $output "\ +# $outputname - a libtool library file +# Generated by $PROGRAM (GNU $PACKAGE$TIMESTAMP) $VERSION +# +# Please DO NOT delete this file! +# It is necessary for linking the library. + +# The name that we can dlopen(3). +dlname='$tdlname' + +# Names of this library. +library_names='$library_names' + +# The name of the static archive. +old_library='$old_library' + +# Linker flags that can not go in dependency_libs. +inherited_linker_flags='$new_inherited_linker_flags' + +# Libraries that this one depends upon. +dependency_libs='$dependency_libs' + +# Names of additional weak libraries provided by this library +weak_library_names='$weak_libs' + +# Version information for $libname. +current=$current +age=$age +revision=$revision + +# Is this an already installed library? +installed=$installed + +# Should we warn about portability when linking against -modules? +shouldnotlink=$module + +# Files to dlopen/dlpreopen +dlopen='$dlfiles' +dlpreopen='$dlprefiles' + +# Directory that this library needs to be installed in: +libdir='$install_libdir'" + if test "$installed" = no && test "$need_relink" = yes; then + $ECHO >> $output "\ +relink_command=\"$relink_command\"" + fi + done + } + + # Do a symbolic link so that the libtool archive can be found in + # LD_LIBRARY_PATH before the program is installed. + func_show_eval '( cd "$output_objdir" && $RM "$outputname" && $LN_S "../$outputname" "$outputname" )' 'exit $?' + ;; + esac + exit $EXIT_SUCCESS +} + +{ test "$opt_mode" = link || test "$opt_mode" = relink; } && + func_mode_link ${1+"$@"} + + +# func_mode_uninstall arg... +func_mode_uninstall () +{ + $opt_debug + RM="$nonopt" + files= + rmforce= + exit_status=0 + + # This variable tells wrapper scripts just to set variables rather + # than running their programs. + libtool_install_magic="$magic" + + for arg + do + case $arg in + -f) func_append RM " $arg"; rmforce=yes ;; + -*) func_append RM " $arg" ;; + *) func_append files " $arg" ;; + esac + done + + test -z "$RM" && \ + func_fatal_help "you must specify an RM program" + + rmdirs= + + for file in $files; do + func_dirname "$file" "" "." + dir="$func_dirname_result" + if test "X$dir" = X.; then + odir="$objdir" + else + odir="$dir/$objdir" + fi + func_basename "$file" + name="$func_basename_result" + test "$opt_mode" = uninstall && odir="$dir" + + # Remember odir for removal later, being careful to avoid duplicates + if test "$opt_mode" = clean; then + case " $rmdirs " in + *" $odir "*) ;; + *) func_append rmdirs " $odir" ;; + esac + fi + + # Don't error if the file doesn't exist and rm -f was used. + if { test -L "$file"; } >/dev/null 2>&1 || + { test -h "$file"; } >/dev/null 2>&1 || + test -f "$file"; then + : + elif test -d "$file"; then + exit_status=1 + continue + elif test "$rmforce" = yes; then + continue + fi + + rmfiles="$file" + + case $name in + *.la) + # Possibly a libtool archive, so verify it. + if func_lalib_p "$file"; then + func_source $dir/$name + + # Delete the libtool libraries and symlinks. + for n in $library_names; do + func_append rmfiles " $odir/$n" + done + test -n "$old_library" && func_append rmfiles " $odir/$old_library" + + case "$opt_mode" in + clean) + case " $library_names " in + *" $dlname "*) ;; + *) test -n "$dlname" && func_append rmfiles " $odir/$dlname" ;; + esac + test -n "$libdir" && func_append rmfiles " $odir/$name $odir/${name}i" + ;; + uninstall) + if test -n "$library_names"; then + # Do each command in the postuninstall commands. + func_execute_cmds "$postuninstall_cmds" 'test "$rmforce" = yes || exit_status=1' + fi + + if test -n "$old_library"; then + # Do each command in the old_postuninstall commands. + func_execute_cmds "$old_postuninstall_cmds" 'test "$rmforce" = yes || exit_status=1' + fi + # FIXME: should reinstall the best remaining shared library. + ;; + esac + fi + ;; + + *.lo) + # Possibly a libtool object, so verify it. + if func_lalib_p "$file"; then + + # Read the .lo file + func_source $dir/$name + + # Add PIC object to the list of files to remove. + if test -n "$pic_object" && + test "$pic_object" != none; then + func_append rmfiles " $dir/$pic_object" + fi + + # Add non-PIC object to the list of files to remove. + if test -n "$non_pic_object" && + test "$non_pic_object" != none; then + func_append rmfiles " $dir/$non_pic_object" + fi + fi + ;; + + *) + if test "$opt_mode" = clean ; then + noexename=$name + case $file in + *.exe) + func_stripname '' '.exe' "$file" + file=$func_stripname_result + func_stripname '' '.exe' "$name" + noexename=$func_stripname_result + # $file with .exe has already been added to rmfiles, + # add $file without .exe + func_append rmfiles " $file" + ;; + esac + # Do a test to see if this is a libtool program. + if func_ltwrapper_p "$file"; then + if func_ltwrapper_executable_p "$file"; then + func_ltwrapper_scriptname "$file" + relink_command= + func_source $func_ltwrapper_scriptname_result + func_append rmfiles " $func_ltwrapper_scriptname_result" + else + relink_command= + func_source $dir/$noexename + fi + + # note $name still contains .exe if it was in $file originally + # as does the version of $file that was added into $rmfiles + func_append rmfiles " $odir/$name $odir/${name}S.${objext}" + if test "$fast_install" = yes && test -n "$relink_command"; then + func_append rmfiles " $odir/lt-$name" + fi + if test "X$noexename" != "X$name" ; then + func_append rmfiles " $odir/lt-${noexename}.c" + fi + fi + fi + ;; + esac + func_show_eval "$RM $rmfiles" 'exit_status=1' + done + + # Try to remove the ${objdir}s in the directories where we deleted files + for dir in $rmdirs; do + if test -d "$dir"; then + func_show_eval "rmdir $dir >/dev/null 2>&1" + fi + done + + exit $exit_status +} + +{ test "$opt_mode" = uninstall || test "$opt_mode" = clean; } && + func_mode_uninstall ${1+"$@"} + +test -z "$opt_mode" && { + help="$generic_help" + func_fatal_help "you must specify a MODE" +} + +test -z "$exec_cmd" && \ + func_fatal_help "invalid operation mode \`$opt_mode'" + +if test -n "$exec_cmd"; then + eval exec "$exec_cmd" + exit $EXIT_FAILURE +fi + +exit $exit_status + + +# The TAGs below are defined such that we never get into a situation +# in which we disable both kinds of libraries. Given conflicting +# choices, we go for a static library, that is the most portable, +# since we can't tell whether shared libraries were disabled because +# the user asked for that or because the platform doesn't support +# them. This is particularly important on AIX, because we don't +# support having both static and shared libraries enabled at the same +# time on that platform, so we default to a shared-only configuration. +# If a disable-shared tag is given, we'll fallback to a static-only +# configuration. But we'll never go from static-only to shared-only. + +# ### BEGIN LIBTOOL TAG CONFIG: disable-shared +build_libtool_libs=no +build_old_libs=yes +# ### END LIBTOOL TAG CONFIG: disable-shared + +# ### BEGIN LIBTOOL TAG CONFIG: disable-static +build_old_libs=`case $build_libtool_libs in yes) echo no;; *) echo yes;; esac` +# ### END LIBTOOL TAG CONFIG: disable-static + +# Local Variables: +# mode:shell-script +# sh-indentation:2 +# End: +# vi:sw=2 + diff --git a/pkg/registry/zookeeper-3.4.6/src/c/missing b/pkg/registry/zookeeper-3.4.6/src/c/missing new file mode 100755 index 000000000..86a8fc31e --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/c/missing @@ -0,0 +1,331 @@ +#! /bin/sh +# Common stub for a few missing GNU programs while installing. + +scriptversion=2012-01-06.13; # UTC + +# Copyright (C) 1996, 1997, 1999, 2000, 2002, 2003, 2004, 2005, 2006, +# 2008, 2009, 2010, 2011, 2012 Free Software Foundation, Inc. +# Originally by Fran,cois Pinard , 1996. + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2, or (at your option) +# any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program that contains a +# configuration script generated by Autoconf, you may include it under +# the same distribution terms that you use for the rest of that program. + +if test $# -eq 0; then + echo 1>&2 "Try \`$0 --help' for more information" + exit 1 +fi + +run=: +sed_output='s/.* --output[ =]\([^ ]*\).*/\1/p' +sed_minuso='s/.* -o \([^ ]*\).*/\1/p' + +# In the cases where this matters, `missing' is being run in the +# srcdir already. +if test -f configure.ac; then + configure_ac=configure.ac +else + configure_ac=configure.in +fi + +msg="missing on your system" + +case $1 in +--run) + # Try to run requested program, and just exit if it succeeds. + run= + shift + "$@" && exit 0 + # Exit code 63 means version mismatch. This often happens + # when the user try to use an ancient version of a tool on + # a file that requires a minimum version. In this case we + # we should proceed has if the program had been absent, or + # if --run hadn't been passed. + if test $? = 63; then + run=: + msg="probably too old" + fi + ;; + + -h|--h|--he|--hel|--help) + echo "\ +$0 [OPTION]... PROGRAM [ARGUMENT]... + +Handle \`PROGRAM [ARGUMENT]...' for when PROGRAM is missing, or return an +error status if there is no known handling for PROGRAM. + +Options: + -h, --help display this help and exit + -v, --version output version information and exit + --run try to run the given command, and emulate it if it fails + +Supported PROGRAM values: + aclocal touch file \`aclocal.m4' + autoconf touch file \`configure' + autoheader touch file \`config.h.in' + autom4te touch the output file, or create a stub one + automake touch all \`Makefile.in' files + bison create \`y.tab.[ch]', if possible, from existing .[ch] + flex create \`lex.yy.c', if possible, from existing .c + help2man touch the output file + lex create \`lex.yy.c', if possible, from existing .c + makeinfo touch the output file + yacc create \`y.tab.[ch]', if possible, from existing .[ch] + +Version suffixes to PROGRAM as well as the prefixes \`gnu-', \`gnu', and +\`g' are ignored when checking the name. + +Send bug reports to ." + exit $? + ;; + + -v|--v|--ve|--ver|--vers|--versi|--versio|--version) + echo "missing $scriptversion (GNU Automake)" + exit $? + ;; + + -*) + echo 1>&2 "$0: Unknown \`$1' option" + echo 1>&2 "Try \`$0 --help' for more information" + exit 1 + ;; + +esac + +# normalize program name to check for. +program=`echo "$1" | sed ' + s/^gnu-//; t + s/^gnu//; t + s/^g//; t'` + +# Now exit if we have it, but it failed. Also exit now if we +# don't have it and --version was passed (most likely to detect +# the program). This is about non-GNU programs, so use $1 not +# $program. +case $1 in + lex*|yacc*) + # Not GNU programs, they don't have --version. + ;; + + *) + if test -z "$run" && ($1 --version) > /dev/null 2>&1; then + # We have it, but it failed. + exit 1 + elif test "x$2" = "x--version" || test "x$2" = "x--help"; then + # Could not run --version or --help. This is probably someone + # running `$TOOL --version' or `$TOOL --help' to check whether + # $TOOL exists and not knowing $TOOL uses missing. + exit 1 + fi + ;; +esac + +# If it does not exist, or fails to run (possibly an outdated version), +# try to emulate it. +case $program in + aclocal*) + echo 1>&2 "\ +WARNING: \`$1' is $msg. You should only need it if + you modified \`acinclude.m4' or \`${configure_ac}'. You might want + to install the \`Automake' and \`Perl' packages. Grab them from + any GNU archive site." + touch aclocal.m4 + ;; + + autoconf*) + echo 1>&2 "\ +WARNING: \`$1' is $msg. You should only need it if + you modified \`${configure_ac}'. You might want to install the + \`Autoconf' and \`GNU m4' packages. Grab them from any GNU + archive site." + touch configure + ;; + + autoheader*) + echo 1>&2 "\ +WARNING: \`$1' is $msg. You should only need it if + you modified \`acconfig.h' or \`${configure_ac}'. You might want + to install the \`Autoconf' and \`GNU m4' packages. Grab them + from any GNU archive site." + files=`sed -n 's/^[ ]*A[CM]_CONFIG_HEADER(\([^)]*\)).*/\1/p' ${configure_ac}` + test -z "$files" && files="config.h" + touch_files= + for f in $files; do + case $f in + *:*) touch_files="$touch_files "`echo "$f" | + sed -e 's/^[^:]*://' -e 's/:.*//'`;; + *) touch_files="$touch_files $f.in";; + esac + done + touch $touch_files + ;; + + automake*) + echo 1>&2 "\ +WARNING: \`$1' is $msg. You should only need it if + you modified \`Makefile.am', \`acinclude.m4' or \`${configure_ac}'. + You might want to install the \`Automake' and \`Perl' packages. + Grab them from any GNU archive site." + find . -type f -name Makefile.am -print | + sed 's/\.am$/.in/' | + while read f; do touch "$f"; done + ;; + + autom4te*) + echo 1>&2 "\ +WARNING: \`$1' is needed, but is $msg. + You might have modified some files without having the + proper tools for further handling them. + You can get \`$1' as part of \`Autoconf' from any GNU + archive site." + + file=`echo "$*" | sed -n "$sed_output"` + test -z "$file" && file=`echo "$*" | sed -n "$sed_minuso"` + if test -f "$file"; then + touch $file + else + test -z "$file" || exec >$file + echo "#! /bin/sh" + echo "# Created by GNU Automake missing as a replacement of" + echo "# $ $@" + echo "exit 0" + chmod +x $file + exit 1 + fi + ;; + + bison*|yacc*) + echo 1>&2 "\ +WARNING: \`$1' $msg. You should only need it if + you modified a \`.y' file. You may need the \`Bison' package + in order for those modifications to take effect. You can get + \`Bison' from any GNU archive site." + rm -f y.tab.c y.tab.h + if test $# -ne 1; then + eval LASTARG=\${$#} + case $LASTARG in + *.y) + SRCFILE=`echo "$LASTARG" | sed 's/y$/c/'` + if test -f "$SRCFILE"; then + cp "$SRCFILE" y.tab.c + fi + SRCFILE=`echo "$LASTARG" | sed 's/y$/h/'` + if test -f "$SRCFILE"; then + cp "$SRCFILE" y.tab.h + fi + ;; + esac + fi + if test ! -f y.tab.h; then + echo >y.tab.h + fi + if test ! -f y.tab.c; then + echo 'main() { return 0; }' >y.tab.c + fi + ;; + + lex*|flex*) + echo 1>&2 "\ +WARNING: \`$1' is $msg. You should only need it if + you modified a \`.l' file. You may need the \`Flex' package + in order for those modifications to take effect. You can get + \`Flex' from any GNU archive site." + rm -f lex.yy.c + if test $# -ne 1; then + eval LASTARG=\${$#} + case $LASTARG in + *.l) + SRCFILE=`echo "$LASTARG" | sed 's/l$/c/'` + if test -f "$SRCFILE"; then + cp "$SRCFILE" lex.yy.c + fi + ;; + esac + fi + if test ! -f lex.yy.c; then + echo 'main() { return 0; }' >lex.yy.c + fi + ;; + + help2man*) + echo 1>&2 "\ +WARNING: \`$1' is $msg. You should only need it if + you modified a dependency of a manual page. You may need the + \`Help2man' package in order for those modifications to take + effect. You can get \`Help2man' from any GNU archive site." + + file=`echo "$*" | sed -n "$sed_output"` + test -z "$file" && file=`echo "$*" | sed -n "$sed_minuso"` + if test -f "$file"; then + touch $file + else + test -z "$file" || exec >$file + echo ".ab help2man is required to generate this page" + exit $? + fi + ;; + + makeinfo*) + echo 1>&2 "\ +WARNING: \`$1' is $msg. You should only need it if + you modified a \`.texi' or \`.texinfo' file, or any other file + indirectly affecting the aspect of the manual. The spurious + call might also be the consequence of using a buggy \`make' (AIX, + DU, IRIX). You might want to install the \`Texinfo' package or + the \`GNU make' package. Grab either from any GNU archive site." + # The file to touch is that specified with -o ... + file=`echo "$*" | sed -n "$sed_output"` + test -z "$file" && file=`echo "$*" | sed -n "$sed_minuso"` + if test -z "$file"; then + # ... or it is the one specified with @setfilename ... + infile=`echo "$*" | sed 's/.* \([^ ]*\) *$/\1/'` + file=`sed -n ' + /^@setfilename/{ + s/.* \([^ ]*\) *$/\1/ + p + q + }' $infile` + # ... or it is derived from the source name (dir/f.texi becomes f.info) + test -z "$file" && file=`echo "$infile" | sed 's,.*/,,;s,.[^.]*$,,'`.info + fi + # If the file does not exist, the user really needs makeinfo; + # let's fail without touching anything. + test -f $file || exit 1 + touch $file + ;; + + *) + echo 1>&2 "\ +WARNING: \`$1' is needed, and is $msg. + You might have modified some files without having the + proper tools for further handling them. Check the \`README' file, + it often tells you about the needed prerequisites for installing + this package. You may also peek at any GNU archive site, in case + some other package would contain this missing \`$1' program." + exit 1 + ;; +esac + +exit 0 + +# Local variables: +# eval: (add-hook 'write-file-hooks 'time-stamp) +# time-stamp-start: "scriptversion=" +# time-stamp-format: "%:y-%02m-%02d.%02H" +# time-stamp-time-zone: "UTC" +# time-stamp-end: "; # UTC" +# End: diff --git a/pkg/registry/zookeeper-3.4.6/src/c/src/cli.c b/pkg/registry/zookeeper-3.4.6/src/c/src/cli.c new file mode 100644 index 000000000..7b3cd61b5 --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/c/src/cli.c @@ -0,0 +1,681 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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. + */ + +#include +#include +#include +#include +#include + +#ifndef WIN32 +#include +#include +#include +#else +#include "winport.h" +//#include <-- can't include, conflicting definitions of close() +int read(int _FileHandle, void * _DstBuf, unsigned int _MaxCharCount); +int write(int _Filehandle, const void * _Buf, unsigned int _MaxCharCount); +#define ctime_r(tctime, buffer) ctime_s (buffer, 40, tctime) +#endif + +#include +#include +#include + +#ifdef YCA +#include +#endif + +#define _LL_CAST_ (long long) + +static zhandle_t *zh; +static clientid_t myid; +static const char *clientIdFile = 0; +struct timeval startTime; +static char cmd[1024]; +static int batchMode=0; + +static int to_send=0; +static int sent=0; +static int recvd=0; + +static int shutdownThisThing=0; + +static __attribute__ ((unused)) void +printProfileInfo(struct timeval start, struct timeval end, int thres, + const char* msg) +{ + int delay=(end.tv_sec*1000+end.tv_usec/1000)- + (start.tv_sec*1000+start.tv_usec/1000); + if(delay>thres) + fprintf(stderr,"%s: execution time=%dms\n",msg,delay); +} + +static const char* state2String(int state){ + if (state == 0) + return "CLOSED_STATE"; + if (state == ZOO_CONNECTING_STATE) + return "CONNECTING_STATE"; + if (state == ZOO_ASSOCIATING_STATE) + return "ASSOCIATING_STATE"; + if (state == ZOO_CONNECTED_STATE) + return "CONNECTED_STATE"; + if (state == ZOO_EXPIRED_SESSION_STATE) + return "EXPIRED_SESSION_STATE"; + if (state == ZOO_AUTH_FAILED_STATE) + return "AUTH_FAILED_STATE"; + + return "INVALID_STATE"; +} + +static const char* type2String(int state){ + if (state == ZOO_CREATED_EVENT) + return "CREATED_EVENT"; + if (state == ZOO_DELETED_EVENT) + return "DELETED_EVENT"; + if (state == ZOO_CHANGED_EVENT) + return "CHANGED_EVENT"; + if (state == ZOO_CHILD_EVENT) + return "CHILD_EVENT"; + if (state == ZOO_SESSION_EVENT) + return "SESSION_EVENT"; + if (state == ZOO_NOTWATCHING_EVENT) + return "NOTWATCHING_EVENT"; + + return "UNKNOWN_EVENT_TYPE"; +} + +void watcher(zhandle_t *zzh, int type, int state, const char *path, + void* context) +{ + /* Be careful using zh here rather than zzh - as this may be mt code + * the client lib may call the watcher before zookeeper_init returns */ + + fprintf(stderr, "Watcher %s state = %s", type2String(type), state2String(state)); + if (path && strlen(path) > 0) { + fprintf(stderr, " for path %s", path); + } + fprintf(stderr, "\n"); + + if (type == ZOO_SESSION_EVENT) { + if (state == ZOO_CONNECTED_STATE) { + const clientid_t *id = zoo_client_id(zzh); + if (myid.client_id == 0 || myid.client_id != id->client_id) { + myid = *id; + fprintf(stderr, "Got a new session id: 0x%llx\n", + _LL_CAST_ myid.client_id); + if (clientIdFile) { + FILE *fh = fopen(clientIdFile, "w"); + if (!fh) { + perror(clientIdFile); + } else { + int rc = fwrite(&myid, sizeof(myid), 1, fh); + if (rc != sizeof(myid)) { + perror("writing client id"); + } + fclose(fh); + } + } + } + } else if (state == ZOO_AUTH_FAILED_STATE) { + fprintf(stderr, "Authentication failure. Shutting down...\n"); + zookeeper_close(zzh); + shutdownThisThing=1; + zh=0; + } else if (state == ZOO_EXPIRED_SESSION_STATE) { + fprintf(stderr, "Session expired. Shutting down...\n"); + zookeeper_close(zzh); + shutdownThisThing=1; + zh=0; + } + } +} + +void dumpStat(const struct Stat *stat) { + char tctimes[40]; + char tmtimes[40]; + time_t tctime; + time_t tmtime; + + if (!stat) { + fprintf(stderr,"null\n"); + return; + } + tctime = stat->ctime/1000; + tmtime = stat->mtime/1000; + + ctime_r(&tmtime, tmtimes); + ctime_r(&tctime, tctimes); + + fprintf(stderr, "\tctime = %s\tczxid=%llx\n" + "\tmtime=%s\tmzxid=%llx\n" + "\tversion=%x\taversion=%x\n" + "\tephemeralOwner = %llx\n", + tctimes, _LL_CAST_ stat->czxid, tmtimes, + _LL_CAST_ stat->mzxid, + (unsigned int)stat->version, (unsigned int)stat->aversion, + _LL_CAST_ stat->ephemeralOwner); +} + +void my_string_completion(int rc, const char *name, const void *data) { + fprintf(stderr, "[%s]: rc = %d\n", (char*)(data==0?"null":data), rc); + if (!rc) { + fprintf(stderr, "\tname = %s\n", name); + } + if(batchMode) + shutdownThisThing=1; +} + +void my_string_completion_free_data(int rc, const char *name, const void *data) { + my_string_completion(rc, name, data); + free((void*)data); +} + +void my_data_completion(int rc, const char *value, int value_len, + const struct Stat *stat, const void *data) { + struct timeval tv; + int sec; + int usec; + gettimeofday(&tv, 0); + sec = tv.tv_sec - startTime.tv_sec; + usec = tv.tv_usec - startTime.tv_usec; + fprintf(stderr, "time = %d msec\n", sec*1000 + usec/1000); + fprintf(stderr, "%s: rc = %d\n", (char*)data, rc); + if (value) { + fprintf(stderr, " value_len = %d\n", value_len); + assert(write(2, value, value_len) == value_len); + } + fprintf(stderr, "\nStat:\n"); + dumpStat(stat); + free((void*)data); + if(batchMode) + shutdownThisThing=1; +} + +void my_silent_data_completion(int rc, const char *value, int value_len, + const struct Stat *stat, const void *data) { + recvd++; + fprintf(stderr, "Data completion %s rc = %d\n",(char*)data,rc); + free((void*)data); + if (recvd==to_send) { + fprintf(stderr,"Recvd %d responses for %d requests sent\n",recvd,to_send); + if(batchMode) + shutdownThisThing=1; + } +} + +void my_strings_completion(int rc, const struct String_vector *strings, + const void *data) { + struct timeval tv; + int sec; + int usec; + int i; + + gettimeofday(&tv, 0); + sec = tv.tv_sec - startTime.tv_sec; + usec = tv.tv_usec - startTime.tv_usec; + fprintf(stderr, "time = %d msec\n", sec*1000 + usec/1000); + fprintf(stderr, "%s: rc = %d\n", (char*)data, rc); + if (strings) + for (i=0; i < strings->count; i++) { + fprintf(stderr, "\t%s\n", strings->data[i]); + } + free((void*)data); + gettimeofday(&tv, 0); + sec = tv.tv_sec - startTime.tv_sec; + usec = tv.tv_usec - startTime.tv_usec; + fprintf(stderr, "time = %d msec\n", sec*1000 + usec/1000); + if(batchMode) + shutdownThisThing=1; +} + +void my_strings_stat_completion(int rc, const struct String_vector *strings, + const struct Stat *stat, const void *data) { + my_strings_completion(rc, strings, data); + dumpStat(stat); + if(batchMode) + shutdownThisThing=1; +} + +void my_void_completion(int rc, const void *data) { + fprintf(stderr, "%s: rc = %d\n", (char*)data, rc); + free((void*)data); + if(batchMode) + shutdownThisThing=1; +} + +void my_stat_completion(int rc, const struct Stat *stat, const void *data) { + fprintf(stderr, "%s: rc = %d Stat:\n", (char*)data, rc); + dumpStat(stat); + free((void*)data); + if(batchMode) + shutdownThisThing=1; +} + +void my_silent_stat_completion(int rc, const struct Stat *stat, + const void *data) { + // fprintf(stderr, "State completion: [%s] rc = %d\n", (char*)data, rc); + sent++; + free((void*)data); +} + +static void sendRequest(const char* data) { + zoo_aset(zh, "/od", data, strlen(data), -1, my_silent_stat_completion, + strdup("/od")); + zoo_aget(zh, "/od", 1, my_silent_data_completion, strdup("/od")); +} + +void od_completion(int rc, const struct Stat *stat, const void *data) { + int i; + fprintf(stderr, "od command response: rc = %d Stat:\n", rc); + dumpStat(stat); + // send a whole bunch of requests + recvd=0; + sent=0; + to_send=200; + for (i=0; i\n"); + fprintf(stderr, " delete \n"); + fprintf(stderr, " set \n"); + fprintf(stderr, " get \n"); + fprintf(stderr, " ls \n"); + fprintf(stderr, " ls2 \n"); + fprintf(stderr, " sync \n"); + fprintf(stderr, " exists \n"); + fprintf(stderr, " wexists \n"); + fprintf(stderr, " myid\n"); + fprintf(stderr, " verbose\n"); + fprintf(stderr, " addauth \n"); + fprintf(stderr, " quit\n"); + fprintf(stderr, "\n"); + fprintf(stderr, " prefix the command with the character 'a' to run the command asynchronously.\n"); + fprintf(stderr, " run the 'verbose' command to toggle verbose logging.\n"); + fprintf(stderr, " i.e. 'aget /foo' to get /foo asynchronously\n"); + } else if (startsWith(line, "verbose")) { + if (verbose) { + verbose = 0; + zoo_set_debug_level(ZOO_LOG_LEVEL_WARN); + fprintf(stderr, "logging level set to WARN\n"); + } else { + verbose = 1; + zoo_set_debug_level(ZOO_LOG_LEVEL_DEBUG); + fprintf(stderr, "logging level set to DEBUG\n"); + } + } else if (startsWith(line, "get ")) { + line += 4; + if (line[0] != '/') { + fprintf(stderr, "Path must start with /, found: %s\n", line); + return; + } + + rc = zoo_aget(zh, line, 1, my_data_completion, strdup(line)); + if (rc) { + fprintf(stderr, "Error %d for %s\n", rc, line); + } + } else if (startsWith(line, "set ")) { + char *ptr; + line += 4; + if (line[0] != '/') { + fprintf(stderr, "Path must start with /, found: %s\n", line); + return; + } + ptr = strchr(line, ' '); + if (!ptr) { + fprintf(stderr, "No data found after path\n"); + return; + } + *ptr = '\0'; + ptr++; + if (async) { + rc = zoo_aset(zh, line, ptr, strlen(ptr), -1, my_stat_completion, + strdup(line)); + } else { + struct Stat stat; + rc = zoo_set2(zh, line, ptr, strlen(ptr), -1, &stat); + } + if (rc) { + fprintf(stderr, "Error %d for %s\n", rc, line); + } + } else if (startsWith(line, "ls ")) { + line += 3; + if (line[0] != '/') { + fprintf(stderr, "Path must start with /, found: %s\n", line); + return; + } + gettimeofday(&startTime, 0); + rc= zoo_aget_children(zh, line, 1, my_strings_completion, strdup(line)); + if (rc) { + fprintf(stderr, "Error %d for %s\n", rc, line); + } + } else if (startsWith(line, "ls2 ")) { + line += 4; + if (line[0] != '/') { + fprintf(stderr, "Path must start with /, found: %s\n", line); + return; + } + gettimeofday(&startTime, 0); + rc= zoo_aget_children2(zh, line, 1, my_strings_stat_completion, strdup(line)); + if (rc) { + fprintf(stderr, "Error %d for %s\n", rc, line); + } + } else if (startsWith(line, "create ")) { + int flags = 0; + line += 7; + if (line[0] == '+') { + line++; + if (line[0] == 'e') { + flags |= ZOO_EPHEMERAL; + line++; + } + if (line[0] == 's') { + flags |= ZOO_SEQUENCE; + line++; + } + line++; + } + if (line[0] != '/') { + fprintf(stderr, "Path must start with /, found: %s\n", line); + return; + } + fprintf(stderr, "Creating [%s] node\n", line); +// { +// struct ACL _CREATE_ONLY_ACL_ACL[] = {{ZOO_PERM_CREATE, ZOO_ANYONE_ID_UNSAFE}}; +// struct ACL_vector CREATE_ONLY_ACL = {1,_CREATE_ONLY_ACL_ACL}; +// rc = zoo_acreate(zh, line, "new", 3, &CREATE_ONLY_ACL, flags, +// my_string_completion, strdup(line)); +// } + rc = zoo_acreate(zh, line, "new", 3, &ZOO_OPEN_ACL_UNSAFE, flags, + my_string_completion_free_data, strdup(line)); + if (rc) { + fprintf(stderr, "Error %d for %s\n", rc, line); + } + } else if (startsWith(line, "delete ")) { + line += 7; + if (line[0] != '/') { + fprintf(stderr, "Path must start with /, found: %s\n", line); + return; + } + if (async) { + rc = zoo_adelete(zh, line, -1, my_void_completion, strdup(line)); + } else { + rc = zoo_delete(zh, line, -1); + } + if (rc) { + fprintf(stderr, "Error %d for %s\n", rc, line); + } + } else if (startsWith(line, "sync ")) { + line += 5; + if (line[0] != '/') { + fprintf(stderr, "Path must start with /, found: %s\n", line); + return; + } + rc = zoo_async(zh, line, my_string_completion_free_data, strdup(line)); + if (rc) { + fprintf(stderr, "Error %d for %s\n", rc, line); + } + } else if (startsWith(line, "wexists ")) { +#ifdef THREADED + struct Stat stat; +#endif + line += 8; + if (line[0] != '/') { + fprintf(stderr, "Path must start with /, found: %s\n", line); + return; + } +#ifndef THREADED + rc = zoo_awexists(zh, line, watcher, (void*) 0, my_stat_completion, strdup(line)); +#else + rc = zoo_wexists(zh, line, watcher, (void*) 0, &stat); +#endif + if (rc) { + fprintf(stderr, "Error %d for %s\n", rc, line); + } + } else if (startsWith(line, "exists ")) { +#ifdef THREADED + struct Stat stat; +#endif + line += 7; + if (line[0] != '/') { + fprintf(stderr, "Path must start with /, found: %s\n", line); + return; + } +#ifndef THREADED + rc = zoo_aexists(zh, line, 1, my_stat_completion, strdup(line)); +#else + rc = zoo_exists(zh, line, 1, &stat); +#endif + if (rc) { + fprintf(stderr, "Error %d for %s\n", rc, line); + } + } else if (strcmp(line, "myid") == 0) { + printf("session Id = %llx\n", _LL_CAST_ zoo_client_id(zh)->client_id); + } else if (strcmp(line, "reinit") == 0) { + zookeeper_close(zh); + // we can't send myid to the server here -- zookeeper_close() removes + // the session on the server. We must start anew. + zh = zookeeper_init(hostPort, watcher, 30000, 0, 0, 0); + } else if (startsWith(line, "quit")) { + fprintf(stderr, "Quitting...\n"); + shutdownThisThing=1; + } else if (startsWith(line, "od")) { + const char val[]="fire off"; + fprintf(stderr, "Overdosing...\n"); + rc = zoo_aset(zh, "/od", val, sizeof(val)-1, -1, od_completion, 0); + if (rc) + fprintf(stderr, "od command failed: %d\n", rc); + } else if (startsWith(line, "addauth ")) { + char *ptr; + line += 8; + ptr = strchr(line, ' '); + if (ptr) { + *ptr = '\0'; + ptr++; + } + zoo_add_auth(zh, line, ptr, ptr ? strlen(ptr) : 0, NULL, NULL); + } +} + +int main(int argc, char **argv) { +#ifndef THREADED + fd_set rfds, wfds, efds; + int processed=0; +#endif + char buffer[4096]; + char p[2048]; +#ifdef YCA + char *cert=0; + char appId[64]; +#endif + int bufoff = 0; + FILE *fh; + + if (argc < 2) { + fprintf(stderr, + "USAGE %s zookeeper_host_list [clientid_file|cmd:(ls|ls2|create|od|...)]\n", + argv[0]); + fprintf(stderr, + "Version: ZooKeeper cli (c client) version %d.%d.%d\n", + ZOO_MAJOR_VERSION, + ZOO_MINOR_VERSION, + ZOO_PATCH_VERSION); + return 2; + } + if (argc > 2) { + if(strncmp("cmd:",argv[2],4)==0){ + strcpy(cmd,argv[2]+4); + batchMode=1; + fprintf(stderr,"Batch mode: %s\n",cmd); + }else{ + clientIdFile = argv[2]; + fh = fopen(clientIdFile, "r"); + if (fh) { + if (fread(&myid, sizeof(myid), 1, fh) != sizeof(myid)) { + memset(&myid, 0, sizeof(myid)); + } + fclose(fh); + } + } + } +#ifdef YCA + strcpy(appId,"yahoo.example.yca_test"); + cert = yca_get_cert_once(appId); + if(cert!=0) { + fprintf(stderr,"Certificate for appid [%s] is [%s]\n",appId,cert); + strncpy(p,cert,sizeof(p)-1); + free(cert); + } else { + fprintf(stderr,"Certificate for appid [%s] not found\n",appId); + strcpy(p,"dummy"); + } +#else + strcpy(p, "dummy"); +#endif + verbose = 0; + zoo_set_debug_level(ZOO_LOG_LEVEL_WARN); + zoo_deterministic_conn_order(1); // enable deterministic order + hostPort = argv[1]; + zh = zookeeper_init(hostPort, watcher, 30000, &myid, 0, 0); + if (!zh) { + return errno; + } + +#ifdef YCA + if(zoo_add_auth(zh,"yca",p,strlen(p),0,0)!=ZOK) + return 2; +#endif + +#ifdef THREADED + while(!shutdownThisThing) { + int rc; + int len = sizeof(buffer) - bufoff -1; + if (len <= 0) { + fprintf(stderr, "Can't handle lines that long!\n"); + exit(2); + } + rc = read(0, buffer+bufoff, len); + if (rc <= 0) { + fprintf(stderr, "bye\n"); + shutdownThisThing=1; + break; + } + bufoff += rc; + buffer[bufoff] = '\0'; + while (strchr(buffer, '\n')) { + char *ptr = strchr(buffer, '\n'); + *ptr = '\0'; + processline(buffer); + ptr++; + memmove(buffer, ptr, strlen(ptr)+1); + bufoff = 0; + } + } +#else + FD_ZERO(&rfds); + FD_ZERO(&wfds); + FD_ZERO(&efds); + while (!shutdownThisThing) { + int fd; + int interest; + int events; + struct timeval tv; + int rc; + zookeeper_interest(zh, &fd, &interest, &tv); + if (fd != -1) { + if (interest&ZOOKEEPER_READ) { + FD_SET(fd, &rfds); + } else { + FD_CLR(fd, &rfds); + } + if (interest&ZOOKEEPER_WRITE) { + FD_SET(fd, &wfds); + } else { + FD_CLR(fd, &wfds); + } + } else { + fd = 0; + } + FD_SET(0, &rfds); + rc = select(fd+1, &rfds, &wfds, &efds, &tv); + events = 0; + if (rc > 0) { + if (FD_ISSET(fd, &rfds)) { + events |= ZOOKEEPER_READ; + } + if (FD_ISSET(fd, &wfds)) { + events |= ZOOKEEPER_WRITE; + } + } + if(batchMode && processed==0){ + //batch mode + processline(cmd); + processed=1; + } + if (FD_ISSET(0, &rfds)) { + int rc; + int len = sizeof(buffer) - bufoff -1; + if (len <= 0) { + fprintf(stderr, "Can't handle lines that long!\n"); + exit(2); + } + rc = read(0, buffer+bufoff, len); + if (rc <= 0) { + fprintf(stderr, "bye\n"); + break; + } + bufoff += rc; + buffer[bufoff] = '\0'; + while (strchr(buffer, '\n')) { + char *ptr = strchr(buffer, '\n'); + *ptr = '\0'; + processline(buffer); + ptr++; + memmove(buffer, ptr, strlen(ptr)+1); + bufoff = 0; + } + } + zookeeper_process(zh, events); + } +#endif + if (to_send!=0) + fprintf(stderr,"Recvd %d responses for %d requests sent\n",recvd,sent); + zookeeper_close(zh); + return 0; +} diff --git a/pkg/registry/zookeeper-3.4.6/src/c/src/hashtable/LICENSE.txt b/pkg/registry/zookeeper-3.4.6/src/c/src/hashtable/LICENSE.txt new file mode 100644 index 000000000..674a62456 --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/c/src/hashtable/LICENSE.txt @@ -0,0 +1,30 @@ +Copyright (c) 2002, 2004, Christopher Clark +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: + + * Redistributions of source code must retain the above copyright +notice, this list of conditions and the following disclaimer. + + * 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. + + * Neither the name of the original author; nor the names of any contributors +may be used to endorse or promote products derived from this software +without specific prior written permission. + + +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. diff --git a/pkg/registry/zookeeper-3.4.6/src/c/src/hashtable/hashtable.c b/pkg/registry/zookeeper-3.4.6/src/c/src/hashtable/hashtable.c new file mode 100644 index 000000000..763357edc --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/c/src/hashtable/hashtable.c @@ -0,0 +1,274 @@ +/* Copyright (C) 2004 Christopher Clark */ + +#include "hashtable.h" +#include "hashtable_private.h" +#include +#include +#include +#include + +/* +Credit for primes table: Aaron Krowne + http://br.endernet.org/~akrowne/ + http://planetmath.org/encyclopedia/GoodHashTablePrimes.html +*/ +static const unsigned int primes[] = { +53, 97, 193, 389, +769, 1543, 3079, 6151, +12289, 24593, 49157, 98317, +196613, 393241, 786433, 1572869, +3145739, 6291469, 12582917, 25165843, +50331653, 100663319, 201326611, 402653189, +805306457, 1610612741 +}; +const unsigned int prime_table_length = sizeof(primes)/sizeof(primes[0]); +const float max_load_factor = 0.65; + +/*****************************************************************************/ +struct hashtable * +create_hashtable(unsigned int minsize, + unsigned int (*hashf) (void*), + int (*eqf) (void*,void*)) +{ + struct hashtable *h; + unsigned int pindex, size = primes[0]; + /* Check requested hashtable isn't too large */ + if (minsize > (1u << 30)) return NULL; + /* Enforce size as prime */ + for (pindex=0; pindex < prime_table_length; pindex++) { + if (primes[pindex] > minsize) { size = primes[pindex]; break; } + } + h = (struct hashtable *)malloc(sizeof(struct hashtable)); + if (NULL == h) return NULL; /*oom*/ + h->table = (struct entry **)malloc(sizeof(struct entry*) * size); + if (NULL == h->table) { free(h); return NULL; } /*oom*/ + memset(h->table, 0, size * sizeof(struct entry *)); + h->tablelength = size; + h->primeindex = pindex; + h->entrycount = 0; + h->hashfn = hashf; + h->eqfn = eqf; + h->loadlimit = (unsigned int) ceil(size * max_load_factor); + return h; +} + +/*****************************************************************************/ +unsigned int +hash(struct hashtable *h, void *k) +{ + /* Aim to protect against poor hash functions by adding logic here + * - logic taken from java 1.4 hashtable source */ + unsigned int i = h->hashfn(k); + i += ~(i << 9); + i ^= ((i >> 14) | (i << 18)); /* >>> */ + i += (i << 4); + i ^= ((i >> 10) | (i << 22)); /* >>> */ + return i; +} + +/*****************************************************************************/ +static int +hashtable_expand(struct hashtable *h) +{ + /* Double the size of the table to accomodate more entries */ + struct entry **newtable; + struct entry *e; + struct entry **pE; + unsigned int newsize, i, index; + /* Check we're not hitting max capacity */ + if (h->primeindex == (prime_table_length - 1)) return 0; + newsize = primes[++(h->primeindex)]; + + newtable = (struct entry **)malloc(sizeof(struct entry*) * newsize); + if (NULL != newtable) + { + memset(newtable, 0, newsize * sizeof(struct entry *)); + /* This algorithm is not 'stable'. ie. it reverses the list + * when it transfers entries between the tables */ + for (i = 0; i < h->tablelength; i++) { + while (NULL != (e = h->table[i])) { + h->table[i] = e->next; + index = indexFor(newsize,e->h); + e->next = newtable[index]; + newtable[index] = e; + } + } + free(h->table); + h->table = newtable; + } + /* Plan B: realloc instead */ + else + { + newtable = (struct entry **) + realloc(h->table, newsize * sizeof(struct entry *)); + if (NULL == newtable) { (h->primeindex)--; return 0; } + h->table = newtable; + memset(newtable[h->tablelength], 0, newsize - h->tablelength); + for (i = 0; i < h->tablelength; i++) { + for (pE = &(newtable[i]), e = *pE; e != NULL; e = *pE) { + index = indexFor(newsize,e->h); + if (index == i) + { + pE = &(e->next); + } + else + { + *pE = e->next; + e->next = newtable[index]; + newtable[index] = e; + } + } + } + } + h->tablelength = newsize; + h->loadlimit = (unsigned int) ceil(newsize * max_load_factor); + return -1; +} + +/*****************************************************************************/ +unsigned int +hashtable_count(struct hashtable *h) +{ + return h->entrycount; +} + +/*****************************************************************************/ +int +hashtable_insert(struct hashtable *h, void *k, void *v) +{ + /* This method allows duplicate keys - but they shouldn't be used */ + unsigned int index; + struct entry *e; + if (++(h->entrycount) > h->loadlimit) + { + /* Ignore the return value. If expand fails, we should + * still try cramming just this value into the existing table + * -- we may not have memory for a larger table, but one more + * element may be ok. Next time we insert, we'll try expanding again.*/ + hashtable_expand(h); + } + e = (struct entry *)malloc(sizeof(struct entry)); + if (NULL == e) { --(h->entrycount); return 0; } /*oom*/ + e->h = hash(h,k); + index = indexFor(h->tablelength,e->h); + e->k = k; + e->v = v; + e->next = h->table[index]; + h->table[index] = e; + return -1; +} + +/*****************************************************************************/ +void * /* returns value associated with key */ +hashtable_search(struct hashtable *h, void *k) +{ + struct entry *e; + unsigned int hashvalue, index; + hashvalue = hash(h,k); + index = indexFor(h->tablelength,hashvalue); + e = h->table[index]; + while (NULL != e) + { + /* Check hash value to short circuit heavier comparison */ + if ((hashvalue == e->h) && (h->eqfn(k, e->k))) return e->v; + e = e->next; + } + return NULL; +} + +/*****************************************************************************/ +void * /* returns value associated with key */ +hashtable_remove(struct hashtable *h, void *k) +{ + /* TODO: consider compacting the table when the load factor drops enough, + * or provide a 'compact' method. */ + + struct entry *e; + struct entry **pE; + void *v; + unsigned int hashvalue, index; + + hashvalue = hash(h,k); + index = indexFor(h->tablelength,hash(h,k)); + pE = &(h->table[index]); + e = *pE; + while (NULL != e) + { + /* Check hash value to short circuit heavier comparison */ + if ((hashvalue == e->h) && (h->eqfn(k, e->k))) + { + *pE = e->next; + h->entrycount--; + v = e->v; + freekey(e->k); + free(e); + return v; + } + pE = &(e->next); + e = e->next; + } + return NULL; +} + +/*****************************************************************************/ +/* destroy */ +void +hashtable_destroy(struct hashtable *h, int free_values) +{ + unsigned int i; + struct entry *e, *f; + struct entry **table = h->table; + if (free_values) + { + for (i = 0; i < h->tablelength; i++) + { + e = table[i]; + while (NULL != e) + { f = e; e = e->next; freekey(f->k); free(f->v); free(f); } + } + } + else + { + for (i = 0; i < h->tablelength; i++) + { + e = table[i]; + while (NULL != e) + { f = e; e = e->next; freekey(f->k); free(f); } + } + } + free(h->table); + free(h); +} + +/* + * Copyright (c) 2002, Christopher Clark + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * * 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. + * + * * Neither the name of the original author; nor the names of any contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * + * 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. +*/ diff --git a/pkg/registry/zookeeper-3.4.6/src/c/src/hashtable/hashtable.h b/pkg/registry/zookeeper-3.4.6/src/c/src/hashtable/hashtable.h new file mode 100644 index 000000000..cbead1829 --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/c/src/hashtable/hashtable.h @@ -0,0 +1,209 @@ +/* Copyright (C) 2002 Christopher Clark */ + +#ifndef __HASHTABLE_CWC22_H__ +#define __HASHTABLE_CWC22_H__ +#ifdef WIN32 +#include "winconfig.h" +#endif +#ifdef __cplusplus +extern "C" { +#endif + +struct hashtable; + +/* Example of use: + * + * struct hashtable *h; + * struct some_key *k; + * struct some_value *v; + * + * static unsigned int hash_from_key_fn( void *k ); + * static int keys_equal_fn ( void *key1, void *key2 ); + * + * h = create_hashtable(16, hash_from_key_fn, keys_equal_fn); + * k = (struct some_key *) malloc(sizeof(struct some_key)); + * v = (struct some_value *) malloc(sizeof(struct some_value)); + * + * (initialise k and v to suitable values) + * + * if (! hashtable_insert(h,k,v) ) + * { exit(-1); } + * + * if (NULL == (found = hashtable_search(h,k) )) + * { printf("not found!"); } + * + * if (NULL == (found = hashtable_remove(h,k) )) + * { printf("Not found\n"); } + * + */ + +/* Macros may be used to define type-safe(r) hashtable access functions, with + * methods specialized to take known key and value types as parameters. + * + * Example: + * + * Insert this at the start of your file: + * + * DEFINE_HASHTABLE_INSERT(insert_some, struct some_key, struct some_value); + * DEFINE_HASHTABLE_SEARCH(search_some, struct some_key, struct some_value); + * DEFINE_HASHTABLE_REMOVE(remove_some, struct some_key, struct some_value); + * + * This defines the functions 'insert_some', 'search_some' and 'remove_some'. + * These operate just like hashtable_insert etc., with the same parameters, + * but their function signatures have 'struct some_key *' rather than + * 'void *', and hence can generate compile time errors if your program is + * supplying incorrect data as a key (and similarly for value). + * + * Note that the hash and key equality functions passed to create_hashtable + * still take 'void *' parameters instead of 'some key *'. This shouldn't be + * a difficult issue as they're only defined and passed once, and the other + * functions will ensure that only valid keys are supplied to them. + * + * The cost for this checking is increased code size and runtime overhead + * - if performance is important, it may be worth switching back to the + * unsafe methods once your program has been debugged with the safe methods. + * This just requires switching to some simple alternative defines - eg: + * #define insert_some hashtable_insert + * + */ + +/***************************************************************************** + * create_hashtable + + * @name create_hashtable + * @param minsize minimum initial size of hashtable + * @param hashfunction function for hashing keys + * @param key_eq_fn function for determining key equality + * @return newly created hashtable or NULL on failure + */ + +struct hashtable * +create_hashtable(unsigned int minsize, + unsigned int (*hashfunction) (void*), + int (*key_eq_fn) (void*,void*)); + +/***************************************************************************** + * hashtable_insert + + * @name hashtable_insert + * @param h the hashtable to insert into + * @param k the key - hashtable claims ownership and will free on removal + * @param v the value - does not claim ownership + * @return non-zero for successful insertion + * + * This function will cause the table to expand if the insertion would take + * the ratio of entries to table size over the maximum load factor. + * + * This function does not check for repeated insertions with a duplicate key. + * The value returned when using a duplicate key is undefined -- when + * the hashtable changes size, the order of retrieval of duplicate key + * entries is reversed. + * If in doubt, remove before insert. + */ + +int +hashtable_insert(struct hashtable *h, void *k, void *v); + +#define DEFINE_HASHTABLE_INSERT(fnname, keytype, valuetype) \ +int fnname (struct hashtable *h, keytype *k, valuetype *v) \ +{ \ + return hashtable_insert(h,k,v); \ +} + +/***************************************************************************** + * hashtable_search + + * @name hashtable_search + * @param h the hashtable to search + * @param k the key to search for - does not claim ownership + * @return the value associated with the key, or NULL if none found + */ + +void * +hashtable_search(struct hashtable *h, void *k); + +#define DEFINE_HASHTABLE_SEARCH(fnname, keytype, valuetype) \ +valuetype * fnname (struct hashtable *h, keytype *k) \ +{ \ + return (valuetype *) (hashtable_search(h,k)); \ +} + +/***************************************************************************** + * hashtable_remove + + * @name hashtable_remove + * @param h the hashtable to remove the item from + * @param k the key to search for - does not claim ownership + * @return the value associated with the key, or NULL if none found + */ + +void * /* returns value */ +hashtable_remove(struct hashtable *h, void *k); + +#define DEFINE_HASHTABLE_REMOVE(fnname, keytype, valuetype) \ +valuetype * fnname (struct hashtable *h, keytype *k) \ +{ \ + return (valuetype *) (hashtable_remove(h,k)); \ +} + + +/***************************************************************************** + * hashtable_count + + * @name hashtable_count + * @param h the hashtable + * @return the number of items stored in the hashtable + */ +unsigned int +hashtable_count(struct hashtable *h); + + +/***************************************************************************** + * hashtable_destroy + + * @name hashtable_destroy + * @param h the hashtable + * @param free_values whether to call 'free' on the remaining values + */ + +void +hashtable_destroy(struct hashtable *h, int free_values); + +#ifdef __cplusplus +} +#endif + +#endif /* __HASHTABLE_CWC22_H__ */ + +/* + * Copyright (c) 2002, Christopher Clark + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * * 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. + * + * * Neither the name of the original author; nor the names of any contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * + * 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. +*/ diff --git a/pkg/registry/zookeeper-3.4.6/src/c/src/hashtable/hashtable_itr.c b/pkg/registry/zookeeper-3.4.6/src/c/src/hashtable/hashtable_itr.c new file mode 100644 index 000000000..defac691f --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/c/src/hashtable/hashtable_itr.c @@ -0,0 +1,176 @@ +/* Copyright (C) 2002, 2004 Christopher Clark */ + +#include "hashtable.h" +#include "hashtable_private.h" +#include "hashtable_itr.h" +#include /* defines NULL */ + +/*****************************************************************************/ +/* hashtable_iterator - iterator constructor */ + +struct hashtable_itr * +hashtable_iterator(struct hashtable *h) +{ + unsigned int i, tablelength; + struct hashtable_itr *itr = (struct hashtable_itr *) + malloc(sizeof(struct hashtable_itr)); + if (NULL == itr) return NULL; + itr->h = h; + itr->e = NULL; + itr->parent = NULL; + tablelength = h->tablelength; + itr->index = tablelength; + if (0 == h->entrycount) return itr; + + for (i = 0; i < tablelength; i++) + { + if (NULL != h->table[i]) + { + itr->e = h->table[i]; + itr->index = i; + break; + } + } + return itr; +} + +/*****************************************************************************/ +/* advance - advance the iterator to the next element + * returns zero if advanced to end of table */ + +int +hashtable_iterator_advance(struct hashtable_itr *itr) +{ + unsigned int j,tablelength; + struct entry **table; + struct entry *next; + if (NULL == itr->e) return 0; /* stupidity check */ + + next = itr->e->next; + if (NULL != next) + { + itr->parent = itr->e; + itr->e = next; + return -1; + } + tablelength = itr->h->tablelength; + itr->parent = NULL; + if (tablelength <= (j = ++(itr->index))) + { + itr->e = NULL; + return 0; + } + table = itr->h->table; + while (NULL == (next = table[j])) + { + if (++j >= tablelength) + { + itr->index = tablelength; + itr->e = NULL; + return 0; + } + } + itr->index = j; + itr->e = next; + return -1; +} + +/*****************************************************************************/ +/* remove - remove the entry at the current iterator position + * and advance the iterator, if there is a successive + * element. + * If you want the value, read it before you remove: + * beware memory leaks if you don't. + * Returns zero if end of iteration. */ + +int +hashtable_iterator_remove(struct hashtable_itr *itr) +{ + struct entry *remember_e, *remember_parent; + int ret; + + /* Do the removal */ + if (NULL == (itr->parent)) + { + /* element is head of a chain */ + itr->h->table[itr->index] = itr->e->next; + } else { + /* element is mid-chain */ + itr->parent->next = itr->e->next; + } + /* itr->e is now outside the hashtable */ + remember_e = itr->e; + itr->h->entrycount--; + freekey(remember_e->k); + + /* Advance the iterator, correcting the parent */ + remember_parent = itr->parent; + ret = hashtable_iterator_advance(itr); + if (itr->parent == remember_e) { itr->parent = remember_parent; } + free(remember_e); + return ret; +} + +/*****************************************************************************/ +int /* returns zero if not found */ +hashtable_iterator_search(struct hashtable_itr *itr, + struct hashtable *h, void *k) +{ + struct entry *e, *parent; + unsigned int hashvalue, index; + + hashvalue = hash(h,k); + index = indexFor(h->tablelength,hashvalue); + + e = h->table[index]; + parent = NULL; + while (NULL != e) + { + /* Check hash value to short circuit heavier comparison */ + if ((hashvalue == e->h) && (h->eqfn(k, e->k))) + { + itr->index = index; + itr->e = e; + itr->parent = parent; + itr->h = h; + return -1; + } + parent = e; + e = e->next; + } + return 0; +} + + +/* + * Copyright (c) 2002, 2004, Christopher Clark + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * * 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. + * + * * Neither the name of the original author; nor the names of any contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * + * 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. +*/ diff --git a/pkg/registry/zookeeper-3.4.6/src/c/src/hashtable/hashtable_itr.h b/pkg/registry/zookeeper-3.4.6/src/c/src/hashtable/hashtable_itr.h new file mode 100644 index 000000000..30379c7ee --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/c/src/hashtable/hashtable_itr.h @@ -0,0 +1,119 @@ +/* Copyright (C) 2002, 2004 Christopher Clark */ + +#ifndef __HASHTABLE_ITR_CWC22__ +#define __HASHTABLE_ITR_CWC22__ +#include "hashtable.h" +#include "hashtable_private.h" /* needed to enable inlining */ + +#ifdef __cplusplus +extern "C" { +#endif + +/*****************************************************************************/ +/* This struct is only concrete here to allow the inlining of two of the + * accessor functions. */ +struct hashtable_itr +{ + struct hashtable *h; + struct entry *e; + struct entry *parent; + unsigned int index; +}; + + +/*****************************************************************************/ +/* hashtable_iterator + */ + +struct hashtable_itr * +hashtable_iterator(struct hashtable *h); + +/*****************************************************************************/ +/* hashtable_iterator_key + * - return the value of the (key,value) pair at the current position */ + +static inline void * +hashtable_iterator_key(struct hashtable_itr *i) +{ + return i->e->k; +} + +/*****************************************************************************/ +/* value - return the value of the (key,value) pair at the current position */ + +static inline void * +hashtable_iterator_value(struct hashtable_itr *i) +{ + return i->e->v; +} + +/*****************************************************************************/ +/* advance - advance the iterator to the next element + * returns zero if advanced to end of table */ + +int +hashtable_iterator_advance(struct hashtable_itr *itr); + +/*****************************************************************************/ +/* remove - remove current element and advance the iterator to the next element + * NB: if you need the value to free it, read it before + * removing. ie: beware memory leaks! + * returns zero if advanced to end of table */ + +int +hashtable_iterator_remove(struct hashtable_itr *itr); + +/*****************************************************************************/ +/* search - overwrite the supplied iterator, to point to the entry + * matching the supplied key. + h points to the hashtable to be searched. + * returns zero if not found. */ +int +hashtable_iterator_search(struct hashtable_itr *itr, + struct hashtable *h, void *k); + +#define DEFINE_HASHTABLE_ITERATOR_SEARCH(fnname, keytype) \ +int fnname (struct hashtable_itr *i, struct hashtable *h, keytype *k) \ +{ \ + return (hashtable_iterator_search(i,h,k)); \ +} + + +#ifdef __cplusplus +} +#endif + +#endif /* __HASHTABLE_ITR_CWC22__*/ + +/* + * Copyright (c) 2002, 2004, Christopher Clark + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * * 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. + * + * * Neither the name of the original author; nor the names of any contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * + * 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. +*/ diff --git a/pkg/registry/zookeeper-3.4.6/src/c/src/hashtable/hashtable_private.h b/pkg/registry/zookeeper-3.4.6/src/c/src/hashtable/hashtable_private.h new file mode 100644 index 000000000..3e95f6005 --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/c/src/hashtable/hashtable_private.h @@ -0,0 +1,85 @@ +/* Copyright (C) 2002, 2004 Christopher Clark */ + +#ifndef __HASHTABLE_PRIVATE_CWC22_H__ +#define __HASHTABLE_PRIVATE_CWC22_H__ + +#include "hashtable.h" + +/*****************************************************************************/ +struct entry +{ + void *k, *v; + unsigned int h; + struct entry *next; +}; + +struct hashtable { + unsigned int tablelength; + struct entry **table; + unsigned int entrycount; + unsigned int loadlimit; + unsigned int primeindex; + unsigned int (*hashfn) (void *k); + int (*eqfn) (void *k1, void *k2); +}; + +/*****************************************************************************/ +unsigned int +hash(struct hashtable *h, void *k); + +/*****************************************************************************/ +/* indexFor */ +static inline unsigned int +indexFor(unsigned int tablelength, unsigned int hashvalue) { + return (hashvalue % tablelength); +}; + +/* Only works if tablelength == 2^N */ +/*static inline unsigned int +indexFor(unsigned int tablelength, unsigned int hashvalue) +{ + return (hashvalue & (tablelength - 1u)); +} +*/ + +/*****************************************************************************/ +#define freekey(X) free(X) +/*define freekey(X) ; */ + + +/*****************************************************************************/ + +#endif /* __HASHTABLE_PRIVATE_CWC22_H__*/ + +/* + * Copyright (c) 2002, Christopher Clark + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * * 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. + * + * * Neither the name of the original author; nor the names of any contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * + * 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. +*/ diff --git a/pkg/registry/zookeeper-3.4.6/src/c/src/load_gen.c b/pkg/registry/zookeeper-3.4.6/src/c/src/load_gen.c new file mode 100644 index 000000000..72b595076 --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/c/src/load_gen.c @@ -0,0 +1,286 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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. + */ + +#include +#include "zookeeper_log.h" +#include +#ifndef WIN32 +#ifdef THREADED +#include +#endif +#else +#include "win32port.h" +#endif +#include +#include + +static zhandle_t *zh; + +static int shutdownThisThing=0; + +// ***************************************************************************** +// +static pthread_cond_t cond=PTHREAD_COND_INITIALIZER; +static pthread_mutex_t lock=PTHREAD_MUTEX_INITIALIZER; + +static pthread_cond_t counterCond=PTHREAD_COND_INITIALIZER; +static pthread_mutex_t counterLock=PTHREAD_MUTEX_INITIALIZER; +static int counter; + + + +void ensureConnected(){ + pthread_mutex_lock(&lock); + while (zoo_state(zh)!=ZOO_CONNECTED_STATE) { + pthread_cond_wait(&cond,&lock); + } + pthread_mutex_unlock(&lock); +} + +void incCounter(int delta){ + pthread_mutex_lock(&counterLock); + counter+=delta; + pthread_cond_broadcast(&counterCond); + pthread_mutex_unlock(&counterLock); + +} +void setCounter(int cnt){ + pthread_mutex_lock(&counterLock); + counter=cnt; + pthread_cond_broadcast(&counterCond); + pthread_mutex_unlock(&counterLock); + +} +void waitCounter(){ + pthread_mutex_lock(&counterLock); + while (counter>0) { + pthread_cond_wait(&counterCond,&counterLock); + } + pthread_mutex_unlock(&counterLock); +} + +void listener(zhandle_t *zzh, int type, int state, const char *path,void* ctx) { + if(type == ZOO_SESSION_EVENT){ + if(state == ZOO_CONNECTED_STATE){ + pthread_mutex_lock(&lock); + pthread_cond_broadcast(&cond); + pthread_mutex_unlock(&lock); + } + setCounter(0); + } +} + +void create_completion(int rc, const char *name, const void *data) { + incCounter(-1); + if(rc!=ZOK){ + LOG_ERROR(("Failed to create a node rc=%d",rc)); + } +} + +int doCreateNodes(const char* root, int count){ + char nodeName[1024]; + int i; + for(i=0; idata) { + int32_t i; + for(i=0;icount; i++) { + free(v->data[i]); + } + free(v->data); + v->data = 0; + } + return 0; +} + +static int deletedCounter; + +int recursiveDelete(const char* root){ + struct String_vector children; + int i; + int rc=zoo_get_children(zh,root,0,&children); + if(rc!=ZNONODE){ + if(rc!=ZOK){ + LOG_ERROR(("Failed to get children of %s, rc=%d",root,rc)); + return rc; + } + for(i=0;i +#include +#include +#include +#include +#include + +#ifndef WIN32 +#include +#include +#include +#include +#endif + +void zoo_lock_auth(zhandle_t *zh) +{ + pthread_mutex_lock(&zh->auth_h.lock); +} +void zoo_unlock_auth(zhandle_t *zh) +{ + pthread_mutex_unlock(&zh->auth_h.lock); +} +void lock_buffer_list(buffer_head_t *l) +{ + pthread_mutex_lock(&l->lock); +} +void unlock_buffer_list(buffer_head_t *l) +{ + pthread_mutex_unlock(&l->lock); +} +void lock_completion_list(completion_head_t *l) +{ + pthread_mutex_lock(&l->lock); +} +void unlock_completion_list(completion_head_t *l) +{ + pthread_cond_broadcast(&l->cond); + pthread_mutex_unlock(&l->lock); +} +struct sync_completion *alloc_sync_completion(void) +{ + struct sync_completion *sc = (struct sync_completion*)calloc(1, sizeof(struct sync_completion)); + if (sc) { + pthread_cond_init(&sc->cond, 0); + pthread_mutex_init(&sc->lock, 0); + } + return sc; +} +int wait_sync_completion(struct sync_completion *sc) +{ + pthread_mutex_lock(&sc->lock); + while (!sc->complete) { + pthread_cond_wait(&sc->cond, &sc->lock); + } + pthread_mutex_unlock(&sc->lock); + return 0; +} + +void free_sync_completion(struct sync_completion *sc) +{ + if (sc) { + pthread_mutex_destroy(&sc->lock); + pthread_cond_destroy(&sc->cond); + free(sc); + } +} + +void notify_sync_completion(struct sync_completion *sc) +{ + pthread_mutex_lock(&sc->lock); + sc->complete = 1; + pthread_cond_broadcast(&sc->cond); + pthread_mutex_unlock(&sc->lock); +} + +int process_async(int outstanding_sync) +{ + return 0; +} + +#ifdef WIN32 +unsigned __stdcall do_io( void * ); +unsigned __stdcall do_completion( void * ); + +int handle_error(SOCKET sock, char* message) +{ + LOG_ERROR(("%s. %d",message, WSAGetLastError())); + closesocket (sock); + return -1; +} + +//--create socket pair for interupting selects. +int create_socket_pair(SOCKET fds[2]) +{ + struct sockaddr_in inaddr; + struct sockaddr addr; + int yes=1; + int len=0; + + SOCKET lst=socket(AF_INET, SOCK_STREAM,IPPROTO_TCP); + if (lst == INVALID_SOCKET ){ + LOG_ERROR(("Error creating socket. %d",WSAGetLastError())); + return -1; + } + memset(&inaddr, 0, sizeof(inaddr)); + memset(&addr, 0, sizeof(addr)); + inaddr.sin_family = AF_INET; + inaddr.sin_addr.s_addr = htonl(INADDR_LOOPBACK); + inaddr.sin_port = 0; //--system assigns the port + + if ( setsockopt(lst,SOL_SOCKET,SO_REUSEADDR,(char*)&yes,sizeof(yes)) == SOCKET_ERROR ) { + return handle_error(lst,"Error trying to set socket option."); + } + if (bind(lst,(struct sockaddr *)&inaddr,sizeof(inaddr)) == SOCKET_ERROR){ + return handle_error(lst,"Error trying to bind socket."); + } + if (listen(lst,1) == SOCKET_ERROR){ + return handle_error(lst,"Error trying to listen on socket."); + } + len=sizeof(inaddr); + getsockname(lst, &addr,&len); + fds[0]=socket(AF_INET, SOCK_STREAM,0); + if (connect(fds[0],&addr,len) == SOCKET_ERROR){ + return handle_error(lst, "Error while connecting to socket."); + } + if ((fds[1]=accept(lst,0,0)) == INVALID_SOCKET){ + closesocket(fds[0]); + return handle_error(lst, "Error while accepting socket connection."); + } + closesocket(lst); + return 0; +} +#else +void *do_io(void *); +void *do_completion(void *); +#endif + + +int wakeup_io_thread(zhandle_t *zh); + +#ifdef WIN32 +static int set_nonblock(SOCKET fd){ + ULONG nonblocking_flag = 1; + if (ioctlsocket(fd, FIONBIO, &nonblocking_flag) == 0) + return 1; + else + return -1; +} +#else +static int set_nonblock(int fd){ + long l = fcntl(fd, F_GETFL); + if(l & O_NONBLOCK) return 0; + return fcntl(fd, F_SETFL, l | O_NONBLOCK); +} +#endif + +void wait_for_others(zhandle_t* zh) +{ + struct adaptor_threads* adaptor=zh->adaptor_priv; + pthread_mutex_lock(&adaptor->lock); + while(adaptor->threadsToWait>0) + pthread_cond_wait(&adaptor->cond,&adaptor->lock); + pthread_mutex_unlock(&adaptor->lock); +} + +void notify_thread_ready(zhandle_t* zh) +{ + struct adaptor_threads* adaptor=zh->adaptor_priv; + pthread_mutex_lock(&adaptor->lock); + adaptor->threadsToWait--; + pthread_cond_broadcast(&adaptor->cond); + while(adaptor->threadsToWait>0) + pthread_cond_wait(&adaptor->cond,&adaptor->lock); + pthread_mutex_unlock(&adaptor->lock); +} + + +void start_threads(zhandle_t* zh) +{ + int rc = 0; + struct adaptor_threads* adaptor=zh->adaptor_priv; + pthread_cond_init(&adaptor->cond,0); + pthread_mutex_init(&adaptor->lock,0); + adaptor->threadsToWait=2; // wait for 2 threads before opening the barrier + + // use api_prolog() to make sure zhandle doesn't get destroyed + // while initialization is in progress + api_prolog(zh); + LOG_DEBUG(("starting threads...")); + rc=pthread_create(&adaptor->io, 0, do_io, zh); + assert("pthread_create() failed for the IO thread"&&!rc); + rc=pthread_create(&adaptor->completion, 0, do_completion, zh); + assert("pthread_create() failed for the completion thread"&&!rc); + wait_for_others(zh); + api_epilog(zh, 0); +} + +int adaptor_init(zhandle_t *zh) +{ + pthread_mutexattr_t recursive_mx_attr; + struct adaptor_threads *adaptor_threads = calloc(1, sizeof(*adaptor_threads)); + if (!adaptor_threads) { + LOG_ERROR(("Out of memory")); + return -1; + } + + /* We use a pipe for interrupting select() in unix/sol and socketpair in windows. */ +#ifdef WIN32 + if (create_socket_pair(adaptor_threads->self_pipe) == -1){ + LOG_ERROR(("Can't make a socket.")); +#else + if(pipe(adaptor_threads->self_pipe)==-1) { + LOG_ERROR(("Can't make a pipe %d",errno)); +#endif + free(adaptor_threads); + return -1; + } + set_nonblock(adaptor_threads->self_pipe[1]); + set_nonblock(adaptor_threads->self_pipe[0]); + + pthread_mutex_init(&zh->auth_h.lock,0); + + zh->adaptor_priv = adaptor_threads; + pthread_mutex_init(&zh->to_process.lock,0); + pthread_mutex_init(&adaptor_threads->zh_lock,0); + // to_send must be recursive mutex + pthread_mutexattr_init(&recursive_mx_attr); + pthread_mutexattr_settype(&recursive_mx_attr, PTHREAD_MUTEX_RECURSIVE); + pthread_mutex_init(&zh->to_send.lock,&recursive_mx_attr); + pthread_mutexattr_destroy(&recursive_mx_attr); + + pthread_mutex_init(&zh->sent_requests.lock,0); + pthread_cond_init(&zh->sent_requests.cond,0); + pthread_mutex_init(&zh->completions_to_process.lock,0); + pthread_cond_init(&zh->completions_to_process.cond,0); + start_threads(zh); + return 0; +} + +void adaptor_finish(zhandle_t *zh) +{ + struct adaptor_threads *adaptor_threads; + // make sure zh doesn't get destroyed until after we're done here + api_prolog(zh); + adaptor_threads = zh->adaptor_priv; + if(adaptor_threads==0) { + api_epilog(zh,0); + return; + } + + if(!pthread_equal(adaptor_threads->io,pthread_self())){ + wakeup_io_thread(zh); + pthread_join(adaptor_threads->io, 0); + }else + pthread_detach(adaptor_threads->io); + + if(!pthread_equal(adaptor_threads->completion,pthread_self())){ + pthread_mutex_lock(&zh->completions_to_process.lock); + pthread_cond_broadcast(&zh->completions_to_process.cond); + pthread_mutex_unlock(&zh->completions_to_process.lock); + pthread_join(adaptor_threads->completion, 0); + }else + pthread_detach(adaptor_threads->completion); + + api_epilog(zh,0); +} + +void adaptor_destroy(zhandle_t *zh) +{ + struct adaptor_threads *adaptor = zh->adaptor_priv; + if(adaptor==0) return; + + pthread_cond_destroy(&adaptor->cond); + pthread_mutex_destroy(&adaptor->lock); + pthread_mutex_destroy(&zh->to_process.lock); + pthread_mutex_destroy(&zh->to_send.lock); + pthread_mutex_destroy(&zh->sent_requests.lock); + pthread_cond_destroy(&zh->sent_requests.cond); + pthread_mutex_destroy(&zh->completions_to_process.lock); + pthread_cond_destroy(&zh->completions_to_process.cond); + pthread_mutex_destroy(&adaptor->zh_lock); + + pthread_mutex_destroy(&zh->auth_h.lock); + + close(adaptor->self_pipe[0]); + close(adaptor->self_pipe[1]); + free(adaptor); + zh->adaptor_priv=0; +} + +int wakeup_io_thread(zhandle_t *zh) +{ + struct adaptor_threads *adaptor_threads = zh->adaptor_priv; + char c=0; +#ifndef WIN32 + return write(adaptor_threads->self_pipe[1],&c,1)==1? ZOK: ZSYSTEMERROR; +#else + return send(adaptor_threads->self_pipe[1], &c, 1, 0)==1? ZOK: ZSYSTEMERROR; +#endif +} + +int adaptor_send_queue(zhandle_t *zh, int timeout) +{ + if(!zh->close_requested) + return wakeup_io_thread(zh); + // don't rely on the IO thread to send the messages if the app has + // requested to close + return flush_send_queue(zh, timeout); +} + +/* These two are declared here because we will run the event loop + * and not the client */ +#ifdef WIN32 +int zookeeper_interest(zhandle_t *zh, SOCKET *fd, int *interest, + struct timeval *tv); +#else +int zookeeper_interest(zhandle_t *zh, int *fd, int *interest, + struct timeval *tv); +#endif +int zookeeper_process(zhandle_t *zh, int events); + +#ifdef WIN32 +unsigned __stdcall do_io( void * v) +#else +void *do_io(void *v) +#endif +{ + zhandle_t *zh = (zhandle_t*)v; +#ifndef WIN32 + struct pollfd fds[2]; + struct adaptor_threads *adaptor_threads = zh->adaptor_priv; + + api_prolog(zh); + notify_thread_ready(zh); + LOG_DEBUG(("started IO thread")); + fds[0].fd=adaptor_threads->self_pipe[0]; + fds[0].events=POLLIN; + while(!zh->close_requested) { + struct timeval tv; + int fd; + int interest; + int timeout; + int maxfd=1; + int rc; + + zookeeper_interest(zh, &fd, &interest, &tv); + if (fd != -1) { + fds[1].fd=fd; + fds[1].events=(interest&ZOOKEEPER_READ)?POLLIN:0; + fds[1].events|=(interest&ZOOKEEPER_WRITE)?POLLOUT:0; + maxfd=2; + } + timeout=tv.tv_sec * 1000 + (tv.tv_usec/1000); + + poll(fds,maxfd,timeout); + if (fd != -1) { + interest=(fds[1].revents&POLLIN)?ZOOKEEPER_READ:0; + interest|=((fds[1].revents&POLLOUT)||(fds[1].revents&POLLHUP))?ZOOKEEPER_WRITE:0; + } + if(fds[0].revents&POLLIN){ + // flush the pipe + char b[128]; + while(read(adaptor_threads->self_pipe[0],b,sizeof(b))==sizeof(b)){} + } +#else + fd_set rfds, wfds, efds; + struct adaptor_threads *adaptor_threads = zh->adaptor_priv; + api_prolog(zh); + notify_thread_ready(zh); + LOG_DEBUG(("started IO thread")); + FD_ZERO(&rfds); FD_ZERO(&wfds); FD_ZERO(&efds); + while(!zh->close_requested) { + struct timeval tv; + SOCKET fd; + SOCKET maxfd=adaptor_threads->self_pipe[0]; + int interest; + int rc; + + zookeeper_interest(zh, &fd, &interest, &tv); + if (fd != -1) { + if (interest&ZOOKEEPER_READ) { + FD_SET(fd, &rfds); + } else { + FD_CLR(fd, &rfds); + } + if (interest&ZOOKEEPER_WRITE) { + FD_SET(fd, &wfds); + } else { + FD_CLR(fd, &wfds); + } + } + FD_SET( adaptor_threads->self_pipe[0] ,&rfds ); + rc = select((int)maxfd, &rfds, &wfds, &efds, &tv); + if (fd != -1) + { + interest = (FD_ISSET(fd, &rfds))? ZOOKEEPER_READ:0; + interest|= (FD_ISSET(fd, &wfds))? ZOOKEEPER_WRITE:0; + } + + if (FD_ISSET(adaptor_threads->self_pipe[0], &rfds)){ + // flush the pipe/socket + char b[128]; + while(recv(adaptor_threads->self_pipe[0],b,sizeof(b), 0)==sizeof(b)){} + } +#endif + // dispatch zookeeper events + rc = zookeeper_process(zh, interest); + // check the current state of the zhandle and terminate + // if it is_unrecoverable() + if(is_unrecoverable(zh)) + break; + } + api_epilog(zh, 0); + LOG_DEBUG(("IO thread terminated")); + return 0; +} + +#ifdef WIN32 +unsigned __stdcall do_completion( void * v) +#else +void *do_completion(void *v) +#endif +{ + zhandle_t *zh = v; + api_prolog(zh); + notify_thread_ready(zh); + LOG_DEBUG(("started completion thread")); + while(!zh->close_requested) { + pthread_mutex_lock(&zh->completions_to_process.lock); + while(!zh->completions_to_process.head && !zh->close_requested) { + pthread_cond_wait(&zh->completions_to_process.cond, &zh->completions_to_process.lock); + } + pthread_mutex_unlock(&zh->completions_to_process.lock); + process_completions(zh); + } + api_epilog(zh, 0); + LOG_DEBUG(("completion thread terminated")); + return 0; +} + +int32_t inc_ref_counter(zhandle_t* zh,int i) +{ + int incr=(i<0?-1:(i>0?1:0)); + // fetch_and_add implements atomic post-increment + int v=fetch_and_add(&zh->ref_counter,incr); + // inc_ref_counter wants pre-increment + v+=incr; // simulate pre-increment + return v; +} + +int32_t fetch_and_add(volatile int32_t* operand, int incr) +{ +#ifndef WIN32 + int32_t result; + asm __volatile__( + "lock xaddl %0,%1\n" + : "=r"(result), "=m"(*(int *)operand) + : "0"(incr) + : "memory"); + return result; +#else + volatile int32_t result; + _asm + { + mov eax, operand; //eax = v; + mov ebx, incr; // ebx = i; + mov ecx, 0x0; // ecx = 0; + lock xadd dword ptr [eax], ecx; + lock xadd dword ptr [eax], ebx; + mov result, ecx; // result = ebx; + } + return result; +#endif +} + +// make sure the static xid is initialized before any threads started +__attribute__((constructor)) int32_t get_xid() +{ + static int32_t xid = -1; + if (xid == -1) { + xid = time(0); + } + return fetch_and_add(&xid,1); +} + +void enter_critical(zhandle_t* zh) +{ + struct adaptor_threads *adaptor = zh->adaptor_priv; + if(adaptor) + pthread_mutex_lock(&adaptor->zh_lock); +} + +void leave_critical(zhandle_t* zh) +{ + struct adaptor_threads *adaptor = zh->adaptor_priv; + if(adaptor) + pthread_mutex_unlock(&adaptor->zh_lock); +} diff --git a/pkg/registry/zookeeper-3.4.6/src/c/src/recordio.c b/pkg/registry/zookeeper-3.4.6/src/c/src/recordio.c new file mode 100644 index 000000000..cf8a1ac7c --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/c/src/recordio.c @@ -0,0 +1,360 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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. + */ + +#include +#include +#include +#include +#include +#ifndef WIN32 +#include +#endif + +void deallocate_String(char **s) +{ + if (*s) + free(*s); + *s = 0; +} + +void deallocate_Buffer(struct buffer *b) +{ + if (b->buff) + free(b->buff); + b->buff = 0; +} + +struct buff_struct { + int32_t len; + int32_t off; + char *buffer; +}; + +static int resize_buffer(struct buff_struct *s, int newlen) +{ + char *buffer= NULL; + while (s->len < newlen) { + s->len *= 2; + } + buffer = (char*)realloc(s->buffer, s->len); + if (!buffer) { + s->buffer = 0; + return -ENOMEM; + } + s->buffer = buffer; + return 0; +} + +int oa_start_record(struct oarchive *oa, const char *tag) +{ + return 0; +} +int oa_end_record(struct oarchive *oa, const char *tag) +{ + return 0; +} +int oa_serialize_int(struct oarchive *oa, const char *tag, const int32_t *d) +{ + struct buff_struct *priv = oa->priv; + int32_t i = htonl(*d); + if ((priv->len - priv->off) < sizeof(i)) { + int rc = resize_buffer(priv, priv->len + sizeof(i)); + if (rc < 0) return rc; + } + memcpy(priv->buffer+priv->off, &i, sizeof(i)); + priv->off+=sizeof(i); + return 0; +} +int64_t htonll(int64_t v) +{ + int i = 0; + char *s = (char *)&v; + if (htonl(1) == 1) { + return v; + } + for (i = 0; i < 4; i++) { + int tmp = s[i]; + s[i] = s[8-i-1]; + s[8-i-1] = tmp; + } + + return v; +} + +int oa_serialize_long(struct oarchive *oa, const char *tag, const int64_t *d) +{ + const int64_t i = htonll(*d); + struct buff_struct *priv = oa->priv; + if ((priv->len - priv->off) < sizeof(i)) { + int rc = resize_buffer(priv, priv->len + sizeof(i)); + if (rc < 0) return rc; + } + memcpy(priv->buffer+priv->off, &i, sizeof(i)); + priv->off+=sizeof(i); + return 0; +} +int oa_start_vector(struct oarchive *oa, const char *tag, const int32_t *count) +{ + return oa_serialize_int(oa, tag, count); +} +int oa_end_vector(struct oarchive *oa, const char *tag) +{ + return 0; +} +int oa_serialize_bool(struct oarchive *oa, const char *name, const int32_t *i) +{ + //return oa_serialize_int(oa, name, i); + struct buff_struct *priv = oa->priv; + if ((priv->len - priv->off) < 1) { + int rc = resize_buffer(priv, priv->len + 1); + if (rc < 0) + return rc; + } + priv->buffer[priv->off] = (*i == 0 ? '\0' : '\1'); + priv->off++; + return 0; +} +static const int32_t negone = -1; +int oa_serialize_buffer(struct oarchive *oa, const char *name, + const struct buffer *b) +{ + struct buff_struct *priv = oa->priv; + int rc; + if (!b) { + return oa_serialize_int(oa, "len", &negone); + } + rc = oa_serialize_int(oa, "len", &b->len); + if (rc < 0) + return rc; + // this means a buffer of NUll + // with size of -1. This is + // waht we use in java serialization for NULL + if (b->len == -1) { + return rc; + } + if ((priv->len - priv->off) < b->len) { + rc = resize_buffer(priv, priv->len + b->len); + if (rc < 0) + return rc; + } + memcpy(priv->buffer+priv->off, b->buff, b->len); + priv->off += b->len; + return 0; +} +int oa_serialize_string(struct oarchive *oa, const char *name, char **s) +{ + struct buff_struct *priv = oa->priv; + int32_t len; + int rc; + if (!*s) { + oa_serialize_int(oa, "len", &negone); + return 0; + } + len = strlen(*s); + rc = oa_serialize_int(oa, "len", &len); + if (rc < 0) + return rc; + if ((priv->len - priv->off) < len) { + rc = resize_buffer(priv, priv->len + len); + if (rc < 0) + return rc; + } + memcpy(priv->buffer+priv->off, *s, len); + priv->off += len; + return 0; +} +int ia_start_record(struct iarchive *ia, const char *tag) +{ + return 0; +} +int ia_end_record(struct iarchive *ia, const char *tag) +{ + return 0; +} +int ia_deserialize_int(struct iarchive *ia, const char *tag, int32_t *count) +{ + struct buff_struct *priv = ia->priv; + if ((priv->len - priv->off) < sizeof(*count)) { + return -E2BIG; + } + memcpy(count, priv->buffer+priv->off, sizeof(*count)); + priv->off+=sizeof(*count); + *count = ntohl(*count); + return 0; +} + +int ia_deserialize_long(struct iarchive *ia, const char *tag, int64_t *count) +{ + struct buff_struct *priv = ia->priv; + int64_t v = 0; + if ((priv->len - priv->off) < sizeof(*count)) { + return -E2BIG; + } + memcpy(count, priv->buffer+priv->off, sizeof(*count)); + priv->off+=sizeof(*count); + v = htonll(*count); // htonll and ntohll do the same + *count = v; + return 0; +} +int ia_start_vector(struct iarchive *ia, const char *tag, int32_t *count) +{ + return ia_deserialize_int(ia, tag, count); +} +int ia_end_vector(struct iarchive *ia, const char *tag) +{ + return 0; +} +int ia_deserialize_bool(struct iarchive *ia, const char *name, int32_t *v) +{ + struct buff_struct *priv = ia->priv; + //fprintf(stderr, "Deserializing bool %d\n", priv->off); + //return ia_deserialize_int(ia, name, v); + if ((priv->len - priv->off) < 1) { + return -E2BIG; + } + *v = priv->buffer[priv->off]; + priv->off+=1; + //fprintf(stderr, "Deserializing bool end %d\n", priv->off); + return 0; +} +int ia_deserialize_buffer(struct iarchive *ia, const char *name, + struct buffer *b) +{ + struct buff_struct *priv = ia->priv; + int rc = ia_deserialize_int(ia, "len", &b->len); + if (rc < 0) + return rc; + if ((priv->len - priv->off) < b->len) { + return -E2BIG; + } + // set the buffer to null + if (b->len == -1) { + b->buff = NULL; + return rc; + } + b->buff = malloc(b->len); + if (!b->buff) { + return -ENOMEM; + } + memcpy(b->buff, priv->buffer+priv->off, b->len); + priv->off += b->len; + return 0; +} +int ia_deserialize_string(struct iarchive *ia, const char *name, char **s) +{ + struct buff_struct *priv = ia->priv; + int32_t len; + int rc = ia_deserialize_int(ia, "len", &len); + if (rc < 0) + return rc; + if ((priv->len - priv->off) < len) { + return -E2BIG; + } + if (len < 0) { + return -EINVAL; + } + *s = malloc(len+1); + if (!*s) { + return -ENOMEM; + } + memcpy(*s, priv->buffer+priv->off, len); + (*s)[len] = '\0'; + priv->off += len; + return 0; +} + +static struct iarchive ia_default = { STRUCT_INITIALIZER (start_record ,ia_start_record), + STRUCT_INITIALIZER (end_record ,ia_end_record), STRUCT_INITIALIZER (start_vector , ia_start_vector), + STRUCT_INITIALIZER (end_vector ,ia_end_vector), STRUCT_INITIALIZER (deserialize_Bool , ia_deserialize_bool), + STRUCT_INITIALIZER (deserialize_Int ,ia_deserialize_int), + STRUCT_INITIALIZER (deserialize_Long , ia_deserialize_long) , + STRUCT_INITIALIZER (deserialize_Buffer, ia_deserialize_buffer), + STRUCT_INITIALIZER (deserialize_String, ia_deserialize_string) }; + +static struct oarchive oa_default = { STRUCT_INITIALIZER (start_record , oa_start_record), + STRUCT_INITIALIZER (end_record , oa_end_record), STRUCT_INITIALIZER (start_vector , oa_start_vector), + STRUCT_INITIALIZER (end_vector , oa_end_vector), STRUCT_INITIALIZER (serialize_Bool , oa_serialize_bool), + STRUCT_INITIALIZER (serialize_Int , oa_serialize_int), + STRUCT_INITIALIZER (serialize_Long , oa_serialize_long) , + STRUCT_INITIALIZER (serialize_Buffer , oa_serialize_buffer), + STRUCT_INITIALIZER (serialize_String , oa_serialize_string) }; + +struct iarchive *create_buffer_iarchive(char *buffer, int len) +{ + struct iarchive *ia = malloc(sizeof(*ia)); + struct buff_struct *buff = malloc(sizeof(struct buff_struct)); + if (!ia) return 0; + if (!buff) { + free(ia); + return 0; + } + *ia = ia_default; + buff->off = 0; + buff->buffer = buffer; + buff->len = len; + ia->priv = buff; + return ia; +} + +struct oarchive *create_buffer_oarchive() +{ + struct oarchive *oa = malloc(sizeof(*oa)); + struct buff_struct *buff = malloc(sizeof(struct buff_struct)); + if (!oa) return 0; + if (!buff) { + free(oa); + return 0; + } + *oa = oa_default; + buff->off = 0; + buff->buffer = malloc(128); + buff->len = 128; + oa->priv = buff; + return oa; +} + +void close_buffer_iarchive(struct iarchive **ia) +{ + free((*ia)->priv); + free(*ia); + *ia = 0; +} + +void close_buffer_oarchive(struct oarchive **oa, int free_buffer) +{ + if (free_buffer) { + struct buff_struct *buff = (struct buff_struct *)(*oa)->priv; + if (buff->buffer) { + free(buff->buffer); + } + } + free((*oa)->priv); + free(*oa); + *oa = 0; +} + +char *get_buffer(struct oarchive *oa) +{ + struct buff_struct *buff = oa->priv; + return buff->buffer; +} +int get_buffer_len(struct oarchive *oa) +{ + struct buff_struct *buff = oa->priv; + return buff->off; +} diff --git a/pkg/registry/zookeeper-3.4.6/src/c/src/st_adaptor.c b/pkg/registry/zookeeper-3.4.6/src/c/src/st_adaptor.c new file mode 100644 index 000000000..7609edf8c --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/c/src/st_adaptor.c @@ -0,0 +1,99 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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. + */ + +#ifndef DLL_EXPORT +# define USE_STATIC_LIB +#endif + +#include "zk_adaptor.h" +#include +#include + +void zoo_lock_auth(zhandle_t *zh) +{ +} +void zoo_unlock_auth(zhandle_t *zh) +{ +} +void lock_buffer_list(buffer_head_t *l) +{ +} +void unlock_buffer_list(buffer_head_t *l) +{ +} +void lock_completion_list(completion_head_t *l) +{ +} +void unlock_completion_list(completion_head_t *l) +{ +} +struct sync_completion *alloc_sync_completion(void) +{ + return (struct sync_completion*)calloc(1, sizeof(struct sync_completion)); +} +int wait_sync_completion(struct sync_completion *sc) +{ + return 0; +} + +void free_sync_completion(struct sync_completion *sc) +{ + free(sc); +} + +void notify_sync_completion(struct sync_completion *sc) +{ +} + +int process_async(int outstanding_sync) +{ + return outstanding_sync == 0; +} + +int adaptor_init(zhandle_t *zh) +{ + return 0; +} + +void adaptor_finish(zhandle_t *zh){} + +void adaptor_destroy(zhandle_t *zh){} + +int flush_send_queue(zhandle_t *, int); + +int adaptor_send_queue(zhandle_t *zh, int timeout) +{ + return flush_send_queue(zh, timeout); +} + +int32_t inc_ref_counter(zhandle_t* zh,int i) +{ + zh->ref_counter+=(i<0?-1:(i>0?1:0)); + return zh->ref_counter; +} + +int32_t get_xid() +{ + static int32_t xid = -1; + if (xid == -1) { + xid = time(0); + } + return xid++; +} +void enter_critical(zhandle_t* zh){} +void leave_critical(zhandle_t* zh){} diff --git a/pkg/registry/zookeeper-3.4.6/src/c/src/winport.c b/pkg/registry/zookeeper-3.4.6/src/c/src/winport.c new file mode 100644 index 000000000..aeef3a84e --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/c/src/winport.c @@ -0,0 +1,292 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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. + */ + +#ifdef WIN32 +#include "winport.h" +#include +#include + +int pthread_mutex_lock(pthread_mutex_t* _mutex ){ + int rc = WaitForSingleObject( *_mutex, // handle to mutex + INFINITE); // no time-out interval + return ((rc == WAIT_OBJECT_0) ? 0: rc); +} + +int pthread_mutex_unlock( pthread_mutex_t* _mutex ){ + int rc = ReleaseMutex(*_mutex); + return ((rc != 0)? 0: GetLastError()); +} + +int pthread_mutex_init(pthread_mutex_t* _mutex, void* ignoredAttr){ + //use CreateMutex as we are using the HANDLES in pthread_cond + *_mutex = CreateMutex( + NULL, // default security attributes + FALSE, // initially not owned + NULL); // unnamed mutex + return ((*_mutex == NULL) ? GetLastError() : 0); +} + +int pthread_mutex_destroy(pthread_mutex_t* _mutex) +{ + int rc = CloseHandle(*_mutex); + return ((rc != 0)? 0: GetLastError()); +} + +int pthread_create(pthread_t *thread, const pthread_attr_t *attr, unsigned (__stdcall* start_routine)(void* a), void *arg) +{ + int _intThreadId; + (*thread).thread_handle = (HANDLE)_beginthreadex( NULL, 0, start_routine , arg, 0, (unsigned int*)&_intThreadId ); + (*thread).thread_id = _intThreadId; + return (((*thread).thread_handle == 0 ) ? errno : 0 ); +} + + +int pthread_equal(pthread_t t1, pthread_t t2){ +//Is there a better way to do this? GetThreadId(handle) is only supported Windows 2003 n above. + return ((t1.thread_id == t2.thread_id) ? 1:0); +} + +pthread_t pthread_self(){ + pthread_t thread_self; + thread_self.thread_handle = GetCurrentThread(); + thread_self.thread_id = GetCurrentThreadId(); + return thread_self; +} + +int pthread_join(pthread_t _thread, void** ignore) +{ + int rc = WaitForSingleObject( _thread.thread_handle, INFINITE ); + return ((rc == WAIT_OBJECT_0) ? 0: rc); +} + +int pthread_detach(pthread_t _thread) +{ + int rc = CloseHandle(_thread.thread_handle) ; + return (rc != 0) ? 0: GetLastError(); +} + +void pthread_mutexattr_init(pthread_mutexattr_t* ignore){} +void pthread_mutexattr_settype(pthread_mutexattr_t* ingore_attr, int ignore){} +void pthread_mutexattr_destroy(pthread_mutexattr_t* ignore_attr){} + +int +pthread_cond_init (pthread_cond_t *cv, + const pthread_condattr_t * ignore) +{ + cv->waiters_count_ = 0; + cv->was_broadcast_ = 0; + cv->sema_ = CreateSemaphore (NULL, // no security + 0, // initially 0 + 0x7fffffff, // max count + NULL); // unnamed + if (cv->sema_ == NULL ) + return GetLastError(); + InitializeCriticalSection (&cv->waiters_count_lock_); + cv->waiters_done_ = CreateEvent (NULL, // no security + FALSE, // auto-reset + FALSE, // non-signaled initially + NULL); // unnamed + return (cv->waiters_done_ == NULL) ? GetLastError() : 0; + +} + + +int pthread_cond_destroy(pthread_cond_t *cond) +{ + CloseHandle( cond->sema_); + DeleteCriticalSection(&cond->waiters_count_lock_); + return (CloseHandle( cond->waiters_done_ ) == 0)? GetLastError(): 0 ; +} + + +int +pthread_cond_signal (pthread_cond_t *cv) +{ + int have_waiters; + EnterCriticalSection (& (cv->waiters_count_lock_)); + have_waiters = cv->waiters_count_ > 0; + LeaveCriticalSection (&cv->waiters_count_lock_); + + // If there aren't any waiters, then this is a no-op. + if (have_waiters){ + return (ReleaseSemaphore (cv->sema_, 1, 0) == 0 ) ? GetLastError() : 0 ; + }else + return 0; +} + + +int +pthread_cond_broadcast (pthread_cond_t *cv) +{ + // This is needed to ensure that and are + // consistent relative to each other. + int have_waiters = 0; + EnterCriticalSection (&cv->waiters_count_lock_); + + if (cv->waiters_count_ > 0) { + // We are broadcasting, even if there is just one waiter... + // Record that we are broadcasting, which helps optimize + // for the non-broadcast case. + cv->was_broadcast_ = 1; + have_waiters = 1; + } + + if (have_waiters) { + // Wake up all the waiters atomically. + ReleaseSemaphore (cv->sema_, cv->waiters_count_, 0); + + LeaveCriticalSection (&cv->waiters_count_lock_); + + // Wait for all the awakened threads to acquire the counting + // semaphore. + WaitForSingleObject (cv->waiters_done_, INFINITE); + // This assignment is okay, even without the held + // because no other waiter threads can wake up to access it. + cv->was_broadcast_ = 0; + } + else + LeaveCriticalSection (&cv->waiters_count_lock_); +} + + +int +pthread_cond_wait (pthread_cond_t *cv, + pthread_mutex_t *external_mutex) +{ + int last_waiter; + // Avoid race conditions. + EnterCriticalSection (&cv->waiters_count_lock_); + cv->waiters_count_++; + LeaveCriticalSection (&cv->waiters_count_lock_); + + // This call atomically releases the mutex and waits on the + // semaphore until or + // are called by another thread. + SignalObjectAndWait (*external_mutex, cv->sema_, INFINITE, FALSE); + + // Reacquire lock to avoid race conditions. + EnterCriticalSection (&cv->waiters_count_lock_); + + // We're no longer waiting... + cv->waiters_count_--; + + // Check to see if we're the last waiter after . + last_waiter = cv->was_broadcast_ && cv->waiters_count_ == 0; + + LeaveCriticalSection (&cv->waiters_count_lock_); + + // If we're the last waiter thread during this particular broadcast + // then let all the other threads proceed. + if (last_waiter) + // This call atomically signals the event and waits until + // it can acquire the . This is required to ensure fairness. + SignalObjectAndWait (cv->waiters_done_, *external_mutex, INFINITE, FALSE); + else + // Always regain the external mutex since that's the guarantee we + // give to our callers. + WaitForSingleObject (*external_mutex, INFINITE); +} + +int pthread_key_create(pthread_key_t *key, void (*destructor)(void *) ) +{ + int result = 0; + pthread_key_t* newkey; + + if ((newkey = (pthread_key_t*) calloc (1, sizeof (pthread_key_t))) == NULL) + { + result = ENOMEM; + } + else if ((newkey->key = TlsAlloc ()) == TLS_OUT_OF_INDEXES) + { + result = EAGAIN; + free (newkey); + newkey = NULL; + } + else if (destructor != NULL) + { + //--we have to store the function pointer for destructor, so that we can call it + //--to free up the user allocated storage-- + newkey->destructor = destructor; + } + key = newkey; + return (result); +} + +int pthread_key_delete(pthread_key_t key) +{ + int rc = 0; + LPVOID lpvData = TlsGetValue(key.key); + rc = TlsFree (key.key); + rc = (rc != 0 ) ? 0 : GetLastError(); + if (key.destructor != NULL && lpvData != 0){ + key.destructor(lpvData); //we take control of calling destructor, instead of calling it on thread exit. + } + free (&key); + return (rc); +} + +void *pthread_getspecific(pthread_key_t key) +{ + LPVOID lpvData = TlsGetValue(key.key); + if ((lpvData == 0) && (GetLastError() != ERROR_SUCCESS)) + return NULL; + else + return lpvData; +} + +int pthread_setspecific(pthread_key_t key, const void *value) +{ + int rc = TlsSetValue (key.key, value); + return ((rc != 0 ) ? 0 : GetLastError()); +} + + +int close(SOCKET fd) { + return closesocket(fd); +} + +int Win32WSAStartup() +{ + WORD wVersionRq; + WSADATA wsaData; + int err; + + wVersionRq = MAKEWORD(2,0); + err = WSAStartup(wVersionRq, &wsaData); + if (err != 0) + return 1; + + // confirm the version information + if ((LOBYTE(wsaData.wVersion) != 2) || + (HIBYTE(wsaData.wVersion) != 0)) + { + Win32WSACleanup(); + return 1; + } + return 0; +} + +void Win32WSACleanup() +{ + WSACleanup(); +} + +#endif //WIN32 + + + diff --git a/pkg/registry/zookeeper-3.4.6/src/c/src/winport.h b/pkg/registry/zookeeper-3.4.6/src/c/src/winport.h new file mode 100644 index 000000000..32272c03d --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/c/src/winport.h @@ -0,0 +1,123 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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 header file is to port pthread lib , sockets and other utility methods on windows. + * Specifically the threads function, mutexes, keys, and socket initialization. + */ + +#ifndef WINPORT_H_ +#define WINPORT_H_ + +#ifdef WIN32 +#include +#include +#include +#include +#include + + +typedef int ssize_t; +typedef HANDLE pthread_mutex_t; + +struct pthread_t_ +{ + HANDLE thread_handle; + DWORD thread_id; +}; + +typedef struct pthread_t_ pthread_t; +typedef int pthread_mutexattr_t; +typedef int pthread_condattr_t; +typedef int pthread_attr_t; +#define PTHREAD_MUTEX_RECURSIVE 0 + +int pthread_mutex_lock(pthread_mutex_t* _mutex ); +int pthread_mutex_unlock( pthread_mutex_t* _mutex ); +int pthread_mutex_init(pthread_mutex_t* _mutex, void* ignoredAttr); +int pthread_mutex_destroy(pthread_mutex_t* _mutex); +int pthread_create(pthread_t *thread, const pthread_attr_t *attr, unsigned (__stdcall* start_routine)(void* a), void *arg); +int pthread_equal(pthread_t t1, pthread_t t2); +pthread_t pthread_self(); +int pthread_join(pthread_t _thread, void** ignore); +int pthread_detach(pthread_t _thread); + +void pthread_mutexattr_init(pthread_mutexattr_t* ignore); +void pthread_mutexattr_settype(pthread_mutexattr_t* ingore_attr, int ignore); +void pthread_mutexattr_destroy(pthread_mutexattr_t* ignore_attr); + + +// http://www.cs.wustl.edu/~schmidt/win32-cv-1.html + +typedef struct +{ + int waiters_count_; + // Number of waiting threads. + + CRITICAL_SECTION waiters_count_lock_; + // Serialize access to . + + HANDLE sema_; + // Semaphore used to queue up threads waiting for the condition to + // become signaled. + + HANDLE waiters_done_; + // An auto-reset event used by the broadcast/signal thread to wait + // for all the waiting thread(s) to wake up and be released from the + // semaphore. + + size_t was_broadcast_; + // Keeps track of whether we were broadcasting or signaling. This + // allows us to optimize the code if we're just signaling. +}pthread_cond_t; + +int pthread_cond_init (pthread_cond_t *cv,const pthread_condattr_t * ignore); +int pthread_cond_destroy(pthread_cond_t *cond); +int pthread_cond_signal (pthread_cond_t *cv); +int pthread_cond_broadcast (pthread_cond_t *cv); +int pthread_cond_wait (pthread_cond_t *cv, pthread_mutex_t *external_mutex); + + +struct pthread_key_t_ +{ + DWORD key; + void (*destructor) (void *); +}; + +typedef struct pthread_key_t_ pthread_key_t; +int pthread_key_create(pthread_key_t *key, void (*destructor)(void *) ); +int pthread_key_delete(pthread_key_t key); +void *pthread_getspecific(pthread_key_t key); +int pthread_setspecific(pthread_key_t key, const void *value); + +inline int gettimeofday(struct timeval *tp, void *tzp) { + int64_t now = 0; + if (tzp != 0) { errno = EINVAL; return -1; } + GetSystemTimeAsFileTime( (LPFILETIME)&now ); + tp->tv_sec = (long)(now / 10000000 - 11644473600LL); + tp->tv_usec = (now / 10) % 1000000; + return 0; +} +int close(SOCKET fd); +int Win32WSAStartup(); +void Win32WSACleanup(); +#endif //WIN32 + + + +#endif //WINPORT_H_ diff --git a/pkg/registry/zookeeper-3.4.6/src/c/src/zk_adaptor.h b/pkg/registry/zookeeper-3.4.6/src/c/src/zk_adaptor.h new file mode 100644 index 000000000..6aed38fab --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/c/src/zk_adaptor.h @@ -0,0 +1,276 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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. + */ + +#ifndef ZK_ADAPTOR_H_ +#define ZK_ADAPTOR_H_ +#include +#ifdef THREADED +#ifndef WIN32 +#include +#else +#include "winport.h" +#endif +#endif +#include "zookeeper.h" +#include "zk_hashtable.h" + +/* predefined xid's values recognized as special by the server */ +#define WATCHER_EVENT_XID -1 +#define PING_XID -2 +#define AUTH_XID -4 +#define SET_WATCHES_XID -8 + +/* zookeeper state constants */ +#define EXPIRED_SESSION_STATE_DEF -112 +#define AUTH_FAILED_STATE_DEF -113 +#define CONNECTING_STATE_DEF 1 +#define ASSOCIATING_STATE_DEF 2 +#define CONNECTED_STATE_DEF 3 +#define NOTCONNECTED_STATE_DEF 999 + +/* zookeeper event type constants */ +#define CREATED_EVENT_DEF 1 +#define DELETED_EVENT_DEF 2 +#define CHANGED_EVENT_DEF 3 +#define CHILD_EVENT_DEF 4 +#define SESSION_EVENT_DEF -1 +#define NOTWATCHING_EVENT_DEF -2 + +#ifdef __cplusplus +extern "C" { +#endif + +struct _buffer_list; +struct _completion_list; + +typedef struct _buffer_head { + struct _buffer_list *volatile head; + struct _buffer_list *last; +#ifdef THREADED + pthread_mutex_t lock; +#endif +} buffer_head_t; + +typedef struct _completion_head { + struct _completion_list *volatile head; + struct _completion_list *last; +#ifdef THREADED + pthread_cond_t cond; + pthread_mutex_t lock; +#endif +} completion_head_t; + +void lock_buffer_list(buffer_head_t *l); +void unlock_buffer_list(buffer_head_t *l); +void lock_completion_list(completion_head_t *l); +void unlock_completion_list(completion_head_t *l); + +struct sync_completion { + int rc; + union { + struct { + char *str; + int str_len; + } str; + struct Stat stat; + struct { + char *buffer; + int buff_len; + struct Stat stat; + } data; + struct { + struct ACL_vector acl; + struct Stat stat; + } acl; + struct String_vector strs2; + struct { + struct String_vector strs2; + struct Stat stat2; + } strs_stat; + } u; + int complete; +#ifdef THREADED + pthread_cond_t cond; + pthread_mutex_t lock; +#endif +}; + +typedef struct _auth_info { + int state; /* 0=>inactive, >0 => active */ + char* scheme; + struct buffer auth; + void_completion_t completion; + const char* data; + struct _auth_info *next; +} auth_info; + +/** + * This structure represents a packet being read or written. + */ +typedef struct _buffer_list { + char *buffer; + int len; /* This represents the length of sizeof(header) + length of buffer */ + int curr_offset; /* This is the offset into the header followed by offset into the buffer */ + struct _buffer_list *next; +} buffer_list_t; + +/* the size of connect request */ +#define HANDSHAKE_REQ_SIZE 44 +/* connect request */ +struct connect_req { + int32_t protocolVersion; + int64_t lastZxidSeen; + int32_t timeOut; + int64_t sessionId; + int32_t passwd_len; + char passwd[16]; +}; + +/* the connect response */ +struct prime_struct { + int32_t len; + int32_t protocolVersion; + int32_t timeOut; + int64_t sessionId; + int32_t passwd_len; + char passwd[16]; +}; + +#ifdef THREADED +/* this is used by mt_adaptor internally for thread management */ +struct adaptor_threads { + pthread_t io; + pthread_t completion; + int threadsToWait; // barrier + pthread_cond_t cond; // barrier's conditional + pthread_mutex_t lock; // ... and a lock + pthread_mutex_t zh_lock; // critical section lock +#ifdef WIN32 + SOCKET self_pipe[2]; +#else + int self_pipe[2]; +#endif +}; +#endif + +/** the auth list for adding auth */ +typedef struct _auth_list_head { + auth_info *auth; +#ifdef THREADED + pthread_mutex_t lock; +#endif +} auth_list_head_t; + +/** + * This structure represents the connection to zookeeper. + */ + +struct _zhandle { +#ifdef WIN32 + SOCKET fd; /* the descriptor used to talk to zookeeper */ +#else + int fd; /* the descriptor used to talk to zookeeper */ +#endif + char *hostname; /* the hostname of zookeeper */ + struct sockaddr_storage *addrs; /* the addresses that correspond to the hostname */ + int addrs_count; /* The number of addresses in the addrs array */ + watcher_fn watcher; /* the registered watcher */ + struct timeval last_recv; /* The time that the last message was received */ + struct timeval last_send; /* The time that the last message was sent */ + struct timeval last_ping; /* The time that the last PING was sent */ + struct timeval next_deadline; /* The time of the next deadline */ + int recv_timeout; /* The maximum amount of time that can go by without + receiving anything from the zookeeper server */ + buffer_list_t *input_buffer; /* the current buffer being read in */ + buffer_head_t to_process; /* The buffers that have been read and are ready to be processed. */ + buffer_head_t to_send; /* The packets queued to send */ + completion_head_t sent_requests; /* The outstanding requests */ + completion_head_t completions_to_process; /* completions that are ready to run */ + int connect_index; /* The index of the address to connect to */ + clientid_t client_id; + long long last_zxid; + int outstanding_sync; /* Number of outstanding synchronous requests */ + struct _buffer_list primer_buffer; /* The buffer used for the handshake at the start of a connection */ + struct prime_struct primer_storage; /* the connect response */ + char primer_storage_buffer[40]; /* the true size of primer_storage */ + volatile int state; + void *context; + auth_list_head_t auth_h; /* authentication data list */ + /* zookeeper_close is not reentrant because it de-allocates the zhandler. + * This guard variable is used to defer the destruction of zhandle till + * right before top-level API call returns to the caller */ + int32_t ref_counter; + volatile int close_requested; + void *adaptor_priv; + /* Used for debugging only: non-zero value indicates the time when the zookeeper_process + * call returned while there was at least one unprocessed server response + * available in the socket recv buffer */ + struct timeval socket_readable; + + zk_hashtable* active_node_watchers; + zk_hashtable* active_exist_watchers; + zk_hashtable* active_child_watchers; + /** used for chroot path at the client side **/ + char *chroot; +}; + + +int adaptor_init(zhandle_t *zh); +void adaptor_finish(zhandle_t *zh); +void adaptor_destroy(zhandle_t *zh); +struct sync_completion *alloc_sync_completion(void); +int wait_sync_completion(struct sync_completion *sc); +void free_sync_completion(struct sync_completion *sc); +void notify_sync_completion(struct sync_completion *sc); +int adaptor_send_queue(zhandle_t *zh, int timeout); +int process_async(int outstanding_sync); +void process_completions(zhandle_t *zh); +int flush_send_queue(zhandle_t*zh, int timeout); +char* sub_string(zhandle_t *zh, const char* server_path); +void free_duplicate_path(const char* free_path, const char* path); +void zoo_lock_auth(zhandle_t *zh); +void zoo_unlock_auth(zhandle_t *zh); + +// critical section guards +void enter_critical(zhandle_t* zh); +void leave_critical(zhandle_t* zh); +// zhandle object reference counting +void api_prolog(zhandle_t* zh); +int api_epilog(zhandle_t *zh, int rc); +int32_t get_xid(); +// returns the new value of the ref counter +int32_t inc_ref_counter(zhandle_t* zh,int i); + +#ifdef THREADED +// atomic post-increment +int32_t fetch_and_add(volatile int32_t* operand, int incr); +// in mt mode process session event asynchronously by the completion thread +#define PROCESS_SESSION_EVENT(zh,newstate) queue_session_event(zh,newstate) +#else +// in single-threaded mode process session event immediately +//#define PROCESS_SESSION_EVENT(zh,newstate) deliverWatchers(zh,ZOO_SESSION_EVENT,newstate,0) +#define PROCESS_SESSION_EVENT(zh,newstate) queue_session_event(zh,newstate) +#endif + +#ifdef __cplusplus +} +#endif + +#endif /*ZK_ADAPTOR_H_*/ + + diff --git a/pkg/registry/zookeeper-3.4.6/src/c/src/zk_hashtable.c b/pkg/registry/zookeeper-3.4.6/src/c/src/zk_hashtable.c new file mode 100644 index 000000000..0efc5aaf4 --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/c/src/zk_hashtable.c @@ -0,0 +1,337 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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. + */ + +#include "zk_hashtable.h" +#include "zk_adaptor.h" +#include "hashtable/hashtable.h" +#include "hashtable/hashtable_itr.h" +#include +#include +#include + +typedef struct _watcher_object { + watcher_fn watcher; + void* context; + struct _watcher_object* next; +} watcher_object_t; + + +struct _zk_hashtable { + struct hashtable* ht; +}; + +struct watcher_object_list { + watcher_object_t* head; +}; + +/* the following functions are for testing only */ +typedef struct hashtable hashtable_impl; + +hashtable_impl* getImpl(zk_hashtable* ht){ + return ht->ht; +} + +watcher_object_t* getFirstWatcher(zk_hashtable* ht,const char* path) +{ + watcher_object_list_t* wl=hashtable_search(ht->ht,(void*)path); + if(wl!=0) + return wl->head; + return 0; +} +/* end of testing functions */ + +watcher_object_t* clone_watcher_object(watcher_object_t* wo) +{ + watcher_object_t* res=calloc(1,sizeof(watcher_object_t)); + assert(res); + res->watcher=wo->watcher; + res->context=wo->context; + return res; +} + +static unsigned int string_hash_djb2(void *str) +{ + unsigned int hash = 5381; + int c; + const char* cstr = (const char*)str; + while ((c = *cstr++)) + hash = ((hash << 5) + hash) + c; /* hash * 33 + c */ + + return hash; +} + +static int string_equal(void *key1,void *key2) +{ + return strcmp((const char*)key1,(const char*)key2)==0; +} + +static watcher_object_t* create_watcher_object(watcher_fn watcher,void* ctx) +{ + watcher_object_t* wo=calloc(1,sizeof(watcher_object_t)); + assert(wo); + wo->watcher=watcher; + wo->context=ctx; + return wo; +} + +static watcher_object_list_t* create_watcher_object_list(watcher_object_t* head) +{ + watcher_object_list_t* wl=calloc(1,sizeof(watcher_object_list_t)); + assert(wl); + wl->head=head; + return wl; +} + +static void destroy_watcher_object_list(watcher_object_list_t* list) +{ + watcher_object_t* e = NULL; + + if(list==0) + return; + e=list->head; + while(e!=0){ + watcher_object_t* this=e; + e=e->next; + free(this); + } + free(list); +} + +zk_hashtable* create_zk_hashtable() +{ + struct _zk_hashtable *ht=calloc(1,sizeof(struct _zk_hashtable)); + assert(ht); + ht->ht=create_hashtable(32,string_hash_djb2,string_equal); + return ht; +} + +static void do_clean_hashtable(zk_hashtable* ht) +{ + struct hashtable_itr *it; + int hasMore; + if(hashtable_count(ht->ht)==0) + return; + it=hashtable_iterator(ht->ht); + do { + watcher_object_list_t* w=hashtable_iterator_value(it); + destroy_watcher_object_list(w); + hasMore=hashtable_iterator_remove(it); + } while(hasMore); + free(it); +} + +void destroy_zk_hashtable(zk_hashtable* ht) +{ + if(ht!=0){ + do_clean_hashtable(ht); + hashtable_destroy(ht->ht,0); + free(ht); + } +} + +// searches for a watcher object instance in a watcher object list; +// two watcher objects are equal if their watcher function and context pointers +// are equal +static watcher_object_t* search_watcher(watcher_object_list_t** wl,watcher_object_t* wo) +{ + watcher_object_t* wobj=(*wl)->head; + while(wobj!=0){ + if(wobj->watcher==wo->watcher && wobj->context==wo->context) + return wobj; + wobj=wobj->next; + } + return 0; +} + +static int add_to_list(watcher_object_list_t **wl, watcher_object_t *wo, + int clone) +{ + if (search_watcher(wl, wo)==0) { + watcher_object_t* cloned=wo; + if (clone) { + cloned = clone_watcher_object(wo); + assert(cloned); + } + cloned->next = (*wl)->head; + (*wl)->head = cloned; + return 1; + } else if (!clone) { + // If it's here and we aren't supposed to clone, we must destroy + free(wo); + } + return 0; +} + +static int do_insert_watcher_object(zk_hashtable *ht, const char *path, watcher_object_t* wo) +{ + int res=1; + watcher_object_list_t* wl; + + wl=hashtable_search(ht->ht,(void*)path); + if(wl==0){ + int res; + /* inserting a new path element */ + res=hashtable_insert(ht->ht,strdup(path),create_watcher_object_list(wo)); + assert(res); + }else{ + /* + * Path already exists; check if the watcher already exists. + * Don't clone the watcher since it's allocated on the heap --- avoids + * a memory leak and saves a clone operation (calloc + copy). + */ + res = add_to_list(&wl, wo, 0); + } + return res; +} + + +char **collect_keys(zk_hashtable *ht, int *count) +{ + char **list; + struct hashtable_itr *it; + int i; + + *count = hashtable_count(ht->ht); + list = calloc(*count, sizeof(char*)); + it=hashtable_iterator(ht->ht); + for(i = 0; i < *count; i++) { + list[i] = strdup(hashtable_iterator_key(it)); + hashtable_iterator_advance(it); + } + free(it); + return list; +} + +static int insert_watcher_object(zk_hashtable *ht, const char *path, + watcher_object_t* wo) +{ + int res; + res=do_insert_watcher_object(ht,path,wo); + return res; +} + +static void copy_watchers(watcher_object_list_t *from, watcher_object_list_t *to, int clone) +{ + watcher_object_t* wo=from->head; + while(wo){ + watcher_object_t *next = wo->next; + add_to_list(&to, wo, clone); + wo=next; + } +} + +static void copy_table(zk_hashtable *from, watcher_object_list_t *to) { + struct hashtable_itr *it; + int hasMore; + if(hashtable_count(from->ht)==0) + return; + it=hashtable_iterator(from->ht); + do { + watcher_object_list_t *w = hashtable_iterator_value(it); + copy_watchers(w, to, 1); + hasMore=hashtable_iterator_advance(it); + } while(hasMore); + free(it); +} + +static void collect_session_watchers(zhandle_t *zh, + watcher_object_list_t **list) +{ + copy_table(zh->active_node_watchers, *list); + copy_table(zh->active_exist_watchers, *list); + copy_table(zh->active_child_watchers, *list); +} + +static void add_for_event(zk_hashtable *ht, char *path, watcher_object_list_t **list) +{ + watcher_object_list_t* wl; + wl = (watcher_object_list_t*)hashtable_remove(ht->ht, path); + if (wl) { + copy_watchers(wl, *list, 0); + // Since we move, not clone the watch_objects, we just need to free the + // head pointer + free(wl); + } +} + +static void do_foreach_watcher(watcher_object_t* wo,zhandle_t* zh, + const char* path,int type,int state) +{ + // session event's don't have paths + const char *client_path = + (type != ZOO_SESSION_EVENT ? sub_string(zh, path) : path); + while(wo!=0){ + wo->watcher(zh,type,state,client_path,wo->context); + wo=wo->next; + } + free_duplicate_path(client_path, path); +} + +watcher_object_list_t *collectWatchers(zhandle_t *zh,int type, char *path) +{ + struct watcher_object_list *list = create_watcher_object_list(0); + + if(type==ZOO_SESSION_EVENT){ + watcher_object_t defWatcher; + defWatcher.watcher=zh->watcher; + defWatcher.context=zh->context; + add_to_list(&list, &defWatcher, 1); + collect_session_watchers(zh, &list); + return list; + } + switch(type){ + case CREATED_EVENT_DEF: + case CHANGED_EVENT_DEF: + // look up the watchers for the path and move them to a delivery list + add_for_event(zh->active_node_watchers,path,&list); + add_for_event(zh->active_exist_watchers,path,&list); + break; + case CHILD_EVENT_DEF: + // look up the watchers for the path and move them to a delivery list + add_for_event(zh->active_child_watchers,path,&list); + break; + case DELETED_EVENT_DEF: + // look up the watchers for the path and move them to a delivery list + add_for_event(zh->active_node_watchers,path,&list); + add_for_event(zh->active_exist_watchers,path,&list); + add_for_event(zh->active_child_watchers,path,&list); + break; + } + return list; +} + +void deliverWatchers(zhandle_t *zh, int type,int state, char *path, watcher_object_list_t **list) +{ + if (!list || !(*list)) return; + do_foreach_watcher((*list)->head, zh, path, type, state); + destroy_watcher_object_list(*list); + *list = 0; +} + +void activateWatcher(zhandle_t *zh, watcher_registration_t* reg, int rc) +{ + if(reg){ + /* in multithreaded lib, this code is executed + * by the IO thread */ + zk_hashtable *ht = reg->checker(zh, rc); + if(ht){ + insert_watcher_object(ht,reg->path, + create_watcher_object(reg->watcher, reg->context)); + } + } +} diff --git a/pkg/registry/zookeeper-3.4.6/src/c/src/zk_hashtable.h b/pkg/registry/zookeeper-3.4.6/src/c/src/zk_hashtable.h new file mode 100644 index 000000000..31109c11f --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/c/src/zk_hashtable.h @@ -0,0 +1,69 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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. + */ + +#ifndef ZK_HASHTABLE_H_ +#define ZK_HASHTABLE_H_ + +#include + +#ifdef __cplusplus +extern "C" { +#endif + + typedef struct watcher_object_list watcher_object_list_t; +typedef struct _zk_hashtable zk_hashtable; + +/** + * The function must return a non-zero value if the watcher object can be activated + * as a result of the server response. Normally, a watch can only be activated + * if the server returns a success code (ZOK). However in the case when zoo_exists() + * returns a ZNONODE code the watcher should be activated nevertheless. + */ +typedef zk_hashtable *(*result_checker_fn)(zhandle_t *, int rc); + +/** + * A watcher object gets temporarily stored with the completion entry until + * the server response comes back at which moment the watcher object is moved + * to the active watchers map. + */ +typedef struct _watcher_registration { + watcher_fn watcher; + void* context; + result_checker_fn checker; + const char* path; +} watcher_registration_t; + +zk_hashtable* create_zk_hashtable(); +void destroy_zk_hashtable(zk_hashtable* ht); + +char **collect_keys(zk_hashtable *ht, int *count); + +/** + * check if the completion has a watcher object associated + * with it. If it does, move the watcher object to the map of + * active watchers (only if the checker allows to do so) + */ + void activateWatcher(zhandle_t *zh, watcher_registration_t* reg, int rc); + watcher_object_list_t *collectWatchers(zhandle_t *zh,int type, char *path); + void deliverWatchers(zhandle_t *zh, int type, int state, char *path, struct watcher_object_list **list); + +#ifdef __cplusplus +} +#endif + +#endif /*ZK_HASHTABLE_H_*/ diff --git a/pkg/registry/zookeeper-3.4.6/src/c/src/zk_log.c b/pkg/registry/zookeeper-3.4.6/src/c/src/zk_log.c new file mode 100644 index 000000000..4dc0f2167 --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/c/src/zk_log.c @@ -0,0 +1,176 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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. + */ + +#ifndef DLL_EXPORT +# define USE_STATIC_LIB +#endif + +#include "zookeeper_log.h" +#ifndef WIN32 +#include +#endif + +#include +#include + +#define TIME_NOW_BUF_SIZE 1024 +#define FORMAT_LOG_BUF_SIZE 4096 + +#ifdef THREADED +#ifndef WIN32 +#include +#else +#include "winport.h" +#endif + +static pthread_key_t time_now_buffer; +static pthread_key_t format_log_msg_buffer; + +void freeBuffer(void* p){ + if(p) free(p); +} + +__attribute__((constructor)) void prepareTSDKeys() { + pthread_key_create (&time_now_buffer, freeBuffer); + pthread_key_create (&format_log_msg_buffer, freeBuffer); +} + +char* getTSData(pthread_key_t key,int size){ + char* p=pthread_getspecific(key); + if(p==0){ + int res; + p=calloc(1,size); + res=pthread_setspecific(key,p); + if(res!=0){ + fprintf(stderr,"Failed to set TSD key: %d",res); + } + } + return p; +} + +char* get_time_buffer(){ + return getTSData(time_now_buffer,TIME_NOW_BUF_SIZE); +} + +char* get_format_log_buffer(){ + return getTSData(format_log_msg_buffer,FORMAT_LOG_BUF_SIZE); +} +#else +char* get_time_buffer(){ + static char buf[TIME_NOW_BUF_SIZE]; + return buf; +} + +char* get_format_log_buffer(){ + static char buf[FORMAT_LOG_BUF_SIZE]; + return buf; +} + +#endif + +ZooLogLevel logLevel=ZOO_LOG_LEVEL_INFO; + +static FILE* logStream=0; +FILE* getLogStream(){ + if(logStream==0) + logStream=stderr; + return logStream; +} + +void zoo_set_log_stream(FILE* stream){ + logStream=stream; +} + +static const char* time_now(char* now_str){ + struct timeval tv; + struct tm lt; + time_t now = 0; + size_t len = 0; + + gettimeofday(&tv,0); + + now = tv.tv_sec; + localtime_r(&now, <); + + // clone the format used by log4j ISO8601DateFormat + // specifically: "yyyy-MM-dd HH:mm:ss,SSS" + + len = strftime(now_str, TIME_NOW_BUF_SIZE, + "%Y-%m-%d %H:%M:%S", + <); + + len += snprintf(now_str + len, + TIME_NOW_BUF_SIZE - len, + ",%03d", + (int)(tv.tv_usec/1000)); + + return now_str; +} + +void log_message(ZooLogLevel curLevel,int line,const char* funcName, + const char* message) +{ + static const char* dbgLevelStr[]={"ZOO_INVALID","ZOO_ERROR","ZOO_WARN", + "ZOO_INFO","ZOO_DEBUG"}; + static pid_t pid=0; +#ifdef WIN32 + char timebuf [TIME_NOW_BUF_SIZE]; +#endif + if(pid==0)pid=getpid(); +#ifndef THREADED + fprintf(LOGSTREAM, "%s:%d:%s@%s@%d: %s\n", time_now(get_time_buffer()),pid, + dbgLevelStr[curLevel],funcName,line,message); +#else +#ifdef WIN32 + fprintf(LOGSTREAM, "%s:%d(0x%lx):%s@%s@%d: %s\n", time_now(timebuf),pid, + (unsigned long int)(pthread_self().thread_id), + dbgLevelStr[curLevel],funcName,line,message); +#else + fprintf(LOGSTREAM, "%s:%d(0x%lx):%s@%s@%d: %s\n", time_now(get_time_buffer()),pid, + (unsigned long int)pthread_self(), + dbgLevelStr[curLevel],funcName,line,message); +#endif +#endif + fflush(LOGSTREAM); +} + +const char* format_log_message(const char* format,...) +{ + va_list va; + char* buf=get_format_log_buffer(); + if(!buf) + return "format_log_message: Unable to allocate memory buffer"; + + va_start(va,format); + vsnprintf(buf, FORMAT_LOG_BUF_SIZE-1,format,va); + va_end(va); + return buf; +} + +void zoo_set_debug_level(ZooLogLevel level) +{ + if(level==0){ + // disable logging (unit tests do this) + logLevel=(ZooLogLevel)0; + return; + } + if(levelZOO_LOG_LEVEL_DEBUG)level=ZOO_LOG_LEVEL_DEBUG; + logLevel=level; +} + diff --git a/pkg/registry/zookeeper-3.4.6/src/c/src/zookeeper.c b/pkg/registry/zookeeper-3.4.6/src/c/src/zookeeper.c new file mode 100644 index 000000000..27ecf8a6a --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/c/src/zookeeper.c @@ -0,0 +1,3714 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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. + */ + +#ifndef DLL_EXPORT +# define USE_STATIC_LIB +#endif + +#if defined(__CYGWIN__) +#define USE_IPV6 +#endif + +#include +#include +#include +#include "zk_adaptor.h" +#include "zookeeper_log.h" +#include "zk_hashtable.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#ifndef WIN32 +#include +#include +#include +#include +#include +#include +#include +#include +#include "config.h" +#endif + +#ifdef HAVE_SYS_UTSNAME_H +#include +#endif + +#ifdef HAVE_GETPWUID_R +#include +#endif + +#define IF_DEBUG(x) if(logLevel==ZOO_LOG_LEVEL_DEBUG) {x;} + +const int ZOOKEEPER_WRITE = 1 << 0; +const int ZOOKEEPER_READ = 1 << 1; + +const int ZOO_EPHEMERAL = 1 << 0; +const int ZOO_SEQUENCE = 1 << 1; + +const int ZOO_EXPIRED_SESSION_STATE = EXPIRED_SESSION_STATE_DEF; +const int ZOO_AUTH_FAILED_STATE = AUTH_FAILED_STATE_DEF; +const int ZOO_CONNECTING_STATE = CONNECTING_STATE_DEF; +const int ZOO_ASSOCIATING_STATE = ASSOCIATING_STATE_DEF; +const int ZOO_CONNECTED_STATE = CONNECTED_STATE_DEF; +static __attribute__ ((unused)) const char* state2String(int state){ + switch(state){ + case 0: + return "ZOO_CLOSED_STATE"; + case CONNECTING_STATE_DEF: + return "ZOO_CONNECTING_STATE"; + case ASSOCIATING_STATE_DEF: + return "ZOO_ASSOCIATING_STATE"; + case CONNECTED_STATE_DEF: + return "ZOO_CONNECTED_STATE"; + case EXPIRED_SESSION_STATE_DEF: + return "ZOO_EXPIRED_SESSION_STATE"; + case AUTH_FAILED_STATE_DEF: + return "ZOO_AUTH_FAILED_STATE"; + } + return "INVALID_STATE"; +} + +const int ZOO_CREATED_EVENT = CREATED_EVENT_DEF; +const int ZOO_DELETED_EVENT = DELETED_EVENT_DEF; +const int ZOO_CHANGED_EVENT = CHANGED_EVENT_DEF; +const int ZOO_CHILD_EVENT = CHILD_EVENT_DEF; +const int ZOO_SESSION_EVENT = SESSION_EVENT_DEF; +const int ZOO_NOTWATCHING_EVENT = NOTWATCHING_EVENT_DEF; +static __attribute__ ((unused)) const char* watcherEvent2String(int ev){ + switch(ev){ + case 0: + return "ZOO_ERROR_EVENT"; + case CREATED_EVENT_DEF: + return "ZOO_CREATED_EVENT"; + case DELETED_EVENT_DEF: + return "ZOO_DELETED_EVENT"; + case CHANGED_EVENT_DEF: + return "ZOO_CHANGED_EVENT"; + case CHILD_EVENT_DEF: + return "ZOO_CHILD_EVENT"; + case SESSION_EVENT_DEF: + return "ZOO_SESSION_EVENT"; + case NOTWATCHING_EVENT_DEF: + return "ZOO_NOTWATCHING_EVENT"; + } + return "INVALID_EVENT"; +} + +const int ZOO_PERM_READ = 1 << 0; +const int ZOO_PERM_WRITE = 1 << 1; +const int ZOO_PERM_CREATE = 1 << 2; +const int ZOO_PERM_DELETE = 1 << 3; +const int ZOO_PERM_ADMIN = 1 << 4; +const int ZOO_PERM_ALL = 0x1f; +struct Id ZOO_ANYONE_ID_UNSAFE = {"world", "anyone"}; +struct Id ZOO_AUTH_IDS = {"auth", ""}; +static struct ACL _OPEN_ACL_UNSAFE_ACL[] = {{0x1f, {"world", "anyone"}}}; +static struct ACL _READ_ACL_UNSAFE_ACL[] = {{0x01, {"world", "anyone"}}}; +static struct ACL _CREATOR_ALL_ACL_ACL[] = {{0x1f, {"auth", ""}}}; +struct ACL_vector ZOO_OPEN_ACL_UNSAFE = { 1, _OPEN_ACL_UNSAFE_ACL}; +struct ACL_vector ZOO_READ_ACL_UNSAFE = { 1, _READ_ACL_UNSAFE_ACL}; +struct ACL_vector ZOO_CREATOR_ALL_ACL = { 1, _CREATOR_ALL_ACL_ACL}; + +#define COMPLETION_WATCH -1 +#define COMPLETION_VOID 0 +#define COMPLETION_STAT 1 +#define COMPLETION_DATA 2 +#define COMPLETION_STRINGLIST 3 +#define COMPLETION_STRINGLIST_STAT 4 +#define COMPLETION_ACLLIST 5 +#define COMPLETION_STRING 6 +#define COMPLETION_MULTI 7 + +typedef struct _auth_completion_list { + void_completion_t completion; + const char *auth_data; + struct _auth_completion_list *next; +} auth_completion_list_t; + +typedef struct completion { + int type; /* one of COMPLETION_* values above */ + union { + void_completion_t void_result; + stat_completion_t stat_result; + data_completion_t data_result; + strings_completion_t strings_result; + strings_stat_completion_t strings_stat_result; + acl_completion_t acl_result; + string_completion_t string_result; + struct watcher_object_list *watcher_result; + }; + completion_head_t clist; /* For multi-op */ +} completion_t; + +typedef struct _completion_list { + int xid; + completion_t c; + const void *data; + buffer_list_t *buffer; + struct _completion_list *next; + watcher_registration_t* watcher; +} completion_list_t; + +const char*err2string(int err); +static int queue_session_event(zhandle_t *zh, int state); +static const char* format_endpoint_info(const struct sockaddr_storage* ep); +static const char* format_current_endpoint_info(zhandle_t* zh); + +/* deserialize forward declarations */ +static void deserialize_response(int type, int xid, int failed, int rc, completion_list_t *cptr, struct iarchive *ia); +static int deserialize_multi(int xid, completion_list_t *cptr, struct iarchive *ia); + +/* completion routine forward declarations */ +static int add_completion(zhandle_t *zh, int xid, int completion_type, + const void *dc, const void *data, int add_to_front, + watcher_registration_t* wo, completion_head_t *clist); +static completion_list_t* create_completion_entry(int xid, int completion_type, + const void *dc, const void *data, watcher_registration_t* wo, + completion_head_t *clist); +static void destroy_completion_entry(completion_list_t* c); +static void queue_completion_nolock(completion_head_t *list, completion_list_t *c, + int add_to_front); +static void queue_completion(completion_head_t *list, completion_list_t *c, + int add_to_front); +static int handle_socket_error_msg(zhandle_t *zh, int line, int rc, + const char* format,...); +static void cleanup_bufs(zhandle_t *zh,int callCompletion,int rc); + +static int disable_conn_permute=0; // permute enabled by default + +static __attribute__((unused)) void print_completion_queue(zhandle_t *zh); + +static void *SYNCHRONOUS_MARKER = (void*)&SYNCHRONOUS_MARKER; +static int isValidPath(const char* path, const int flags); + +#ifdef _WINDOWS +static int zookeeper_send(SOCKET s, const char* buf, int len) +#else +static ssize_t zookeeper_send(int s, const void* buf, size_t len) +#endif +{ +#ifdef __linux__ + return send(s, buf, len, MSG_NOSIGNAL); +#else + return send(s, buf, len, 0); +#endif +} + +const void *zoo_get_context(zhandle_t *zh) +{ + return zh->context; +} + +void zoo_set_context(zhandle_t *zh, void *context) +{ + if (zh != NULL) { + zh->context = context; + } +} + +int zoo_recv_timeout(zhandle_t *zh) +{ + return zh->recv_timeout; +} + +/** these functions are thread unsafe, so make sure that + zoo_lock_auth is called before you access them **/ +static auth_info* get_last_auth(auth_list_head_t *auth_list) { + auth_info *element; + element = auth_list->auth; + if (element == NULL) { + return NULL; + } + while (element->next != NULL) { + element = element->next; + } + return element; +} + +static void free_auth_completion(auth_completion_list_t *a_list) { + auth_completion_list_t *tmp, *ftmp; + if (a_list == NULL) { + return; + } + tmp = a_list->next; + while (tmp != NULL) { + ftmp = tmp; + tmp = tmp->next; + ftmp->completion = NULL; + ftmp->auth_data = NULL; + free(ftmp); + } + a_list->completion = NULL; + a_list->auth_data = NULL; + a_list->next = NULL; + return; +} + +static void add_auth_completion(auth_completion_list_t* a_list, void_completion_t* completion, + const char *data) { + auth_completion_list_t *element; + auth_completion_list_t *n_element; + element = a_list; + if (a_list->completion == NULL) { + //this is the first element + a_list->completion = *completion; + a_list->next = NULL; + a_list->auth_data = data; + return; + } + while (element->next != NULL) { + element = element->next; + } + n_element = (auth_completion_list_t*) malloc(sizeof(auth_completion_list_t)); + n_element->next = NULL; + n_element->completion = *completion; + n_element->auth_data = data; + element->next = n_element; + return; +} + +static void get_auth_completions(auth_list_head_t *auth_list, auth_completion_list_t *a_list) { + auth_info *element; + element = auth_list->auth; + if (element == NULL) { + return; + } + while (element) { + if (element->completion) { + add_auth_completion(a_list, &element->completion, element->data); + } + element->completion = NULL; + element = element->next; + } + return; +} + +static void add_last_auth(auth_list_head_t *auth_list, auth_info *add_el) { + auth_info *element; + element = auth_list->auth; + if (element == NULL) { + //first element in the list + auth_list->auth = add_el; + return; + } + while (element->next != NULL) { + element = element->next; + } + element->next = add_el; + return; +} + +static void init_auth_info(auth_list_head_t *auth_list) +{ + auth_list->auth = NULL; +} + +static void mark_active_auth(zhandle_t *zh) { + auth_list_head_t auth_h = zh->auth_h; + auth_info *element; + if (auth_h.auth == NULL) { + return; + } + element = auth_h.auth; + while (element != NULL) { + element->state = 1; + element = element->next; + } +} + +static void free_auth_info(auth_list_head_t *auth_list) +{ + auth_info *auth = auth_list->auth; + while (auth != NULL) { + auth_info* old_auth = NULL; + if(auth->scheme!=NULL) + free(auth->scheme); + deallocate_Buffer(&auth->auth); + old_auth = auth; + auth = auth->next; + free(old_auth); + } + init_auth_info(auth_list); +} + +int is_unrecoverable(zhandle_t *zh) +{ + return (zh->state<0)? ZINVALIDSTATE: ZOK; +} + +zk_hashtable *exists_result_checker(zhandle_t *zh, int rc) +{ + if (rc == ZOK) { + return zh->active_node_watchers; + } else if (rc == ZNONODE) { + return zh->active_exist_watchers; + } + return 0; +} + +zk_hashtable *data_result_checker(zhandle_t *zh, int rc) +{ + return rc==ZOK ? zh->active_node_watchers : 0; +} + +zk_hashtable *child_result_checker(zhandle_t *zh, int rc) +{ + return rc==ZOK ? zh->active_child_watchers : 0; +} + +/** + * Frees and closes everything associated with a handle, + * including the handle itself. + */ +static void destroy(zhandle_t *zh) +{ + if (zh == NULL) { + return; + } + /* call any outstanding completions with a special error code */ + cleanup_bufs(zh,1,ZCLOSING); + if (zh->hostname != 0) { + free(zh->hostname); + zh->hostname = NULL; + } + if (zh->fd != -1) { + close(zh->fd); + zh->fd = -1; + zh->state = 0; + } + if (zh->addrs != 0) { + free(zh->addrs); + zh->addrs = NULL; + } + + if (zh->chroot != 0) { + free(zh->chroot); + zh->chroot = NULL; + } + + free_auth_info(&zh->auth_h); + destroy_zk_hashtable(zh->active_node_watchers); + destroy_zk_hashtable(zh->active_exist_watchers); + destroy_zk_hashtable(zh->active_child_watchers); +} + +static void setup_random() +{ +#ifndef WIN32 // TODO: better seed + int seed; + int fd = open("/dev/urandom", O_RDONLY); + if (fd == -1) { + seed = getpid(); + } else { + int rc = read(fd, &seed, sizeof(seed)); + assert(rc == sizeof(seed)); + close(fd); + } + srandom(seed); +#endif +} + +#ifndef __CYGWIN__ +/** + * get the errno from the return code + * of get addrinfo. Errno is not set + * with the call to getaddrinfo, so thats + * why we have to do this. + */ +static int getaddrinfo_errno(int rc) { + switch(rc) { + case EAI_NONAME: +// ZOOKEEPER-1323 EAI_NODATA and EAI_ADDRFAMILY are deprecated in FreeBSD. +#if defined EAI_NODATA && EAI_NODATA != EAI_NONAME + case EAI_NODATA: +#endif + return ENOENT; + case EAI_MEMORY: + return ENOMEM; + default: + return EINVAL; + } +} +#endif + +/** + * fill in the addrs array of the zookeeper servers in the zhandle. after filling + * them in, we will permute them for load balancing. + */ +int getaddrs(zhandle_t *zh) +{ + char *hosts = strdup(zh->hostname); + char *host; + char *strtok_last; + struct sockaddr_storage *addr; + int i; + int rc; + int alen = 0; /* the allocated length of the addrs array */ + + zh->addrs_count = 0; + if (zh->addrs) { + free(zh->addrs); + zh->addrs = 0; + } + if (!hosts) { + LOG_ERROR(("out of memory")); + errno=ENOMEM; + return ZSYSTEMERROR; + } + zh->addrs = 0; + host=strtok_r(hosts, ",", &strtok_last); + while(host) { + char *port_spec = strrchr(host, ':'); + char *end_port_spec; + int port; + if (!port_spec) { + LOG_ERROR(("no port in %s", host)); + errno=EINVAL; + rc=ZBADARGUMENTS; + goto fail; + } + *port_spec = '\0'; + port_spec++; + port = strtol(port_spec, &end_port_spec, 0); + if (!*port_spec || *end_port_spec || port == 0) { + LOG_ERROR(("invalid port in %s", host)); + errno=EINVAL; + rc=ZBADARGUMENTS; + goto fail; + } +#if defined(__CYGWIN__) + // sadly CYGWIN doesn't have getaddrinfo + // but happily gethostbyname is threadsafe in windows + { + struct hostent *he; + char **ptr; + struct sockaddr_in *addr4; + + he = gethostbyname(host); + if (!he) { + LOG_ERROR(("could not resolve %s", host)); + errno=ENOENT; + rc=ZBADARGUMENTS; + goto fail; + } + + /* Setup the address array */ + for(ptr = he->h_addr_list;*ptr != 0; ptr++) { + if (zh->addrs_count == alen) { + alen += 16; + zh->addrs = realloc(zh->addrs, sizeof(*zh->addrs)*alen); + if (zh->addrs == 0) { + LOG_ERROR(("out of memory")); + errno=ENOMEM; + rc=ZSYSTEMERROR; + goto fail; + } + } + addr = &zh->addrs[zh->addrs_count]; + addr4 = (struct sockaddr_in*)addr; + addr->ss_family = he->h_addrtype; + if (addr->ss_family == AF_INET) { + addr4->sin_port = htons(port); + memset(&addr4->sin_zero, 0, sizeof(addr4->sin_zero)); + memcpy(&addr4->sin_addr, *ptr, he->h_length); + zh->addrs_count++; + } +#if defined(AF_INET6) + else if (addr->ss_family == AF_INET6) { + struct sockaddr_in6 *addr6; + + addr6 = (struct sockaddr_in6*)addr; + addr6->sin6_port = htons(port); + addr6->sin6_scope_id = 0; + addr6->sin6_flowinfo = 0; + memcpy(&addr6->sin6_addr, *ptr, he->h_length); + zh->addrs_count++; + } +#endif + else { + LOG_WARN(("skipping unknown address family %x for %s", + addr->ss_family, zh->hostname)); + } + } + host = strtok_r(0, ",", &strtok_last); + } +#else + { + struct addrinfo hints, *res, *res0; + + memset(&hints, 0, sizeof(hints)); +#ifdef AI_ADDRCONFIG + hints.ai_flags = AI_ADDRCONFIG; +#else + hints.ai_flags = 0; +#endif + hints.ai_family = AF_UNSPEC; + hints.ai_socktype = SOCK_STREAM; + hints.ai_protocol = IPPROTO_TCP; + + while(isspace(*host) && host != strtok_last) + host++; + + if ((rc = getaddrinfo(host, port_spec, &hints, &res0)) != 0) { + //bug in getaddrinfo implementation when it returns + //EAI_BADFLAGS or EAI_ADDRFAMILY with AF_UNSPEC and + // ai_flags as AI_ADDRCONFIG +#ifdef AI_ADDRCONFIG + if ((hints.ai_flags == AI_ADDRCONFIG) && +// ZOOKEEPER-1323 EAI_NODATA and EAI_ADDRFAMILY are deprecated in FreeBSD. +#ifdef EAI_ADDRFAMILY + ((rc ==EAI_BADFLAGS) || (rc == EAI_ADDRFAMILY))) { +#else + (rc == EAI_BADFLAGS)) { +#endif + //reset ai_flags to null + hints.ai_flags = 0; + //retry getaddrinfo + rc = getaddrinfo(host, port_spec, &hints, &res0); + } +#endif + if (rc != 0) { + errno = getaddrinfo_errno(rc); +#ifdef WIN32 + LOG_ERROR(("Win32 message: %s\n", gai_strerror(rc))); +#else + LOG_ERROR(("getaddrinfo: %s\n", strerror(errno))); +#endif + rc=ZSYSTEMERROR; + goto fail; + } + } + + for (res = res0; res; res = res->ai_next) { + // Expand address list if needed + if (zh->addrs_count == alen) { + void *tmpaddr; + alen += 16; + tmpaddr = realloc(zh->addrs, sizeof(*zh->addrs)*alen); + if (tmpaddr == 0) { + LOG_ERROR(("out of memory")); + errno=ENOMEM; + rc=ZSYSTEMERROR; + goto fail; + } + zh->addrs=tmpaddr; + } + + // Copy addrinfo into address list + addr = &zh->addrs[zh->addrs_count]; + switch (res->ai_family) { + case AF_INET: +#if defined(AF_INET6) + case AF_INET6: +#endif + memcpy(addr, res->ai_addr, res->ai_addrlen); + ++zh->addrs_count; + break; + default: + LOG_WARN(("skipping unknown address family %x for %s", + res->ai_family, zh->hostname)); + break; + } + } + + freeaddrinfo(res0); + + host = strtok_r(0, ",", &strtok_last); + } +#endif + } + free(hosts); + + if(!disable_conn_permute){ + setup_random(); + /* Permute */ + for (i = zh->addrs_count - 1; i > 0; --i) { + long int j = random()%(i+1); + if (i != j) { + struct sockaddr_storage t = zh->addrs[i]; + zh->addrs[i] = zh->addrs[j]; + zh->addrs[j] = t; + } + } + } + return ZOK; +fail: + if (zh->addrs) { + free(zh->addrs); + zh->addrs=0; + } + if (hosts) { + free(hosts); + } + return rc; +} + +const clientid_t *zoo_client_id(zhandle_t *zh) +{ + return &zh->client_id; +} + +static void null_watcher_fn(zhandle_t* p1, int p2, int p3,const char* p4,void*p5){} + +watcher_fn zoo_set_watcher(zhandle_t *zh,watcher_fn newFn) +{ + watcher_fn oldWatcher=zh->watcher; + if (newFn) { + zh->watcher = newFn; + } else { + zh->watcher = null_watcher_fn; + } + return oldWatcher; +} + +struct sockaddr* zookeeper_get_connected_host(zhandle_t *zh, + struct sockaddr *addr, socklen_t *addr_len) +{ + if (zh->state!=ZOO_CONNECTED_STATE) { + return NULL; + } + if (getpeername(zh->fd, addr, addr_len)==-1) { + return NULL; + } + return addr; +} + +static void log_env() { + char buf[2048]; +#ifdef HAVE_SYS_UTSNAME_H + struct utsname utsname; +#endif + +#if defined(HAVE_GETUID) && defined(HAVE_GETPWUID_R) + struct passwd pw; + struct passwd *pwp = NULL; + uid_t uid = 0; +#endif + + LOG_INFO(("Client environment:zookeeper.version=%s", PACKAGE_STRING)); + +#ifdef HAVE_GETHOSTNAME + gethostname(buf, sizeof(buf)); + LOG_INFO(("Client environment:host.name=%s", buf)); +#else + LOG_INFO(("Client environment:host.name=")); +#endif + +#ifdef HAVE_SYS_UTSNAME_H + uname(&utsname); + LOG_INFO(("Client environment:os.name=%s", utsname.sysname)); + LOG_INFO(("Client environment:os.arch=%s", utsname.release)); + LOG_INFO(("Client environment:os.version=%s", utsname.version)); +#else + LOG_INFO(("Client environment:os.name=")); + LOG_INFO(("Client environment:os.arch=")); + LOG_INFO(("Client environment:os.version=")); +#endif + +#ifdef HAVE_GETLOGIN + LOG_INFO(("Client environment:user.name=%s", getlogin())); +#else + LOG_INFO(("Client environment:user.name=")); +#endif + +#if defined(HAVE_GETUID) && defined(HAVE_GETPWUID_R) + uid = getuid(); + if (!getpwuid_r(uid, &pw, buf, sizeof(buf), &pwp)) { + LOG_INFO(("Client environment:user.home=%s", pw.pw_dir)); + } else { + LOG_INFO(("Client environment:user.home=")); + } +#else + LOG_INFO(("Client environment:user.home=")); +#endif + +#ifdef HAVE_GETCWD + if (!getcwd(buf, sizeof(buf))) { + LOG_INFO(("Client environment:user.dir=")); + } else { + LOG_INFO(("Client environment:user.dir=%s", buf)); + } +#else + LOG_INFO(("Client environment:user.dir=")); +#endif +} + +/** + * Create a zookeeper handle associated with the given host and port. + */ +zhandle_t *zookeeper_init(const char *host, watcher_fn watcher, + int recv_timeout, const clientid_t *clientid, void *context, int flags) +{ + int errnosave = 0; + zhandle_t *zh = NULL; + char *index_chroot = NULL; + + log_env(); +#ifdef WIN32 + if (Win32WSAStartup()){ + LOG_ERROR(("Error initializing ws2_32.dll")); + return 0; + } +#endif + LOG_INFO(("Initiating client connection, host=%s sessionTimeout=%d watcher=%p" + " sessionId=%#llx sessionPasswd=%s context=%p flags=%d", + host, + recv_timeout, + watcher, + (clientid == 0 ? 0 : clientid->client_id), + ((clientid == 0) || (clientid->passwd[0] == 0) ? + "" : ""), + context, + flags)); + + zh = calloc(1, sizeof(*zh)); + if (!zh) { + return 0; + } + zh->fd = -1; + zh->state = NOTCONNECTED_STATE_DEF; + zh->context = context; + zh->recv_timeout = recv_timeout; + init_auth_info(&zh->auth_h); + if (watcher) { + zh->watcher = watcher; + } else { + zh->watcher = null_watcher_fn; + } + if (host == 0 || *host == 0) { // what we shouldn't dup + errno=EINVAL; + goto abort; + } + //parse the host to get the chroot if + //available + index_chroot = strchr(host, '/'); + if (index_chroot) { + zh->chroot = strdup(index_chroot); + if (zh->chroot == NULL) { + goto abort; + } + // if chroot is just / set it to null + if (strlen(zh->chroot) == 1) { + free(zh->chroot); + zh->chroot = NULL; + } + // cannot use strndup so allocate and strcpy + zh->hostname = (char *) malloc(index_chroot - host + 1); + zh->hostname = strncpy(zh->hostname, host, (index_chroot - host)); + //strncpy does not null terminate + *(zh->hostname + (index_chroot - host)) = '\0'; + + } else { + zh->chroot = NULL; + zh->hostname = strdup(host); + } + if (zh->chroot && !isValidPath(zh->chroot, 0)) { + errno = EINVAL; + goto abort; + } + if (zh->hostname == 0) { + goto abort; + } + if(getaddrs(zh)!=0) { + goto abort; + } + zh->connect_index = 0; + if (clientid) { + memcpy(&zh->client_id, clientid, sizeof(zh->client_id)); + } else { + memset(&zh->client_id, 0, sizeof(zh->client_id)); + } + zh->primer_buffer.buffer = zh->primer_storage_buffer; + zh->primer_buffer.curr_offset = 0; + zh->primer_buffer.len = sizeof(zh->primer_storage_buffer); + zh->primer_buffer.next = 0; + zh->last_zxid = 0; + zh->next_deadline.tv_sec=zh->next_deadline.tv_usec=0; + zh->socket_readable.tv_sec=zh->socket_readable.tv_usec=0; + zh->active_node_watchers=create_zk_hashtable(); + zh->active_exist_watchers=create_zk_hashtable(); + zh->active_child_watchers=create_zk_hashtable(); + + if (adaptor_init(zh) == -1) { + goto abort; + } + + return zh; +abort: + errnosave=errno; + destroy(zh); + free(zh); + errno=errnosave; + return 0; +} + +/** + * deallocated the free_path only its beeen allocated + * and not equal to path + */ +void free_duplicate_path(const char *free_path, const char* path) { + if (free_path != path) { + free((void*)free_path); + } +} + +/** + prepend the chroot path if available else return the path +*/ +static char* prepend_string(zhandle_t *zh, const char* client_path) { + char *ret_str; + if (zh == NULL || zh->chroot == NULL) + return (char *) client_path; + // handle the chroot itself, client_path = "/" + if (strlen(client_path) == 1) { + return strdup(zh->chroot); + } + ret_str = (char *) malloc(strlen(zh->chroot) + strlen(client_path) + 1); + strcpy(ret_str, zh->chroot); + return strcat(ret_str, client_path); +} + +/** + strip off the chroot string from the server path + if there is one else return the exact path + */ +char* sub_string(zhandle_t *zh, const char* server_path) { + char *ret_str; + if (zh->chroot == NULL) + return (char *) server_path; + //ZOOKEEPER-1027 + if (strncmp(server_path, zh->chroot, strlen(zh->chroot)) != 0) { + LOG_ERROR(("server path %s does not include chroot path %s", + server_path, zh->chroot)); + return (char *) server_path; + } + if (strlen(server_path) == strlen(zh->chroot)) { + //return "/" + ret_str = strdup("/"); + return ret_str; + } + ret_str = strdup(server_path + strlen(zh->chroot)); + return ret_str; +} + +static buffer_list_t *allocate_buffer(char *buff, int len) +{ + buffer_list_t *buffer = calloc(1, sizeof(*buffer)); + if (buffer == 0) + return 0; + + buffer->len = len==0?sizeof(*buffer):len; + buffer->curr_offset = 0; + buffer->buffer = buff; + buffer->next = 0; + return buffer; +} + +static void free_buffer(buffer_list_t *b) +{ + if (!b) { + return; + } + if (b->buffer) { + free(b->buffer); + } + free(b); +} + +static buffer_list_t *dequeue_buffer(buffer_head_t *list) +{ + buffer_list_t *b; + lock_buffer_list(list); + b = list->head; + if (b) { + list->head = b->next; + if (!list->head) { + assert(b == list->last); + list->last = 0; + } + } + unlock_buffer_list(list); + return b; +} + +static int remove_buffer(buffer_head_t *list) +{ + buffer_list_t *b = dequeue_buffer(list); + if (!b) { + return 0; + } + free_buffer(b); + return 1; +} + +static void queue_buffer(buffer_head_t *list, buffer_list_t *b, int add_to_front) +{ + b->next = 0; + lock_buffer_list(list); + if (list->head) { + assert(list->last); + // The list is not empty + if (add_to_front) { + b->next = list->head; + list->head = b; + } else { + list->last->next = b; + list->last = b; + } + }else{ + // The list is empty + assert(!list->head); + list->head = b; + list->last = b; + } + unlock_buffer_list(list); +} + +static int queue_buffer_bytes(buffer_head_t *list, char *buff, int len) +{ + buffer_list_t *b = allocate_buffer(buff,len); + if (!b) + return ZSYSTEMERROR; + queue_buffer(list, b, 0); + return ZOK; +} + +static int queue_front_buffer_bytes(buffer_head_t *list, char *buff, int len) +{ + buffer_list_t *b = allocate_buffer(buff,len); + if (!b) + return ZSYSTEMERROR; + queue_buffer(list, b, 1); + return ZOK; +} + +static __attribute__ ((unused)) int get_queue_len(buffer_head_t *list) +{ + int i; + buffer_list_t *ptr; + lock_buffer_list(list); + ptr = list->head; + for (i=0; ptr!=0; ptr=ptr->next, i++) + ; + unlock_buffer_list(list); + return i; +} +/* returns: + * -1 if send failed, + * 0 if send would block while sending the buffer (or a send was incomplete), + * 1 if success + */ +#ifdef WIN32 +static int send_buffer(SOCKET fd, buffer_list_t *buff) +#else +static int send_buffer(int fd, buffer_list_t *buff) +#endif +{ + int len = buff->len; + int off = buff->curr_offset; + int rc = -1; + + if (off < 4) { + /* we need to send the length at the beginning */ + int nlen = htonl(len); + char *b = (char*)&nlen; + rc = zookeeper_send(fd, b + off, sizeof(nlen) - off); + if (rc == -1) { +#ifndef _WINDOWS + if (errno != EAGAIN) { +#else + if (WSAGetLastError() != WSAEWOULDBLOCK) { +#endif + return -1; + } else { + return 0; + } + } else { + buff->curr_offset += rc; + } + off = buff->curr_offset; + } + if (off >= 4) { + /* want off to now represent the offset into the buffer */ + off -= sizeof(buff->len); + rc = zookeeper_send(fd, buff->buffer + off, len - off); + if (rc == -1) { +#ifndef _WINDOWS + if (errno != EAGAIN) { +#else + if (WSAGetLastError() != WSAEWOULDBLOCK) { +#endif + return -1; + } + } else { + buff->curr_offset += rc; + } + } + return buff->curr_offset == len + sizeof(buff->len); +} + +/* returns: + * -1 if recv call failed, + * 0 if recv would block, + * 1 if success + */ +#ifdef WIN32 +static int recv_buffer(SOCKET fd, buffer_list_t *buff) +#else +static int recv_buffer(int fd, buffer_list_t *buff) +#endif +{ + int off = buff->curr_offset; + int rc = 0; + //fprintf(LOGSTREAM, "rc = %d, off = %d, line %d\n", rc, off, __LINE__); + + /* if buffer is less than 4, we are reading in the length */ + if (off < 4) { + char *buffer = (char*)&(buff->len); + rc = recv(fd, buffer+off, sizeof(int)-off, 0); + //fprintf(LOGSTREAM, "rc = %d, off = %d, line %d\n", rc, off, __LINE__); + switch(rc) { + case 0: + errno = EHOSTDOWN; + case -1: +#ifndef _WINDOWS + if (errno == EAGAIN) { +#else + if (WSAGetLastError() == WSAEWOULDBLOCK) { +#endif + return 0; + } + return -1; + default: + buff->curr_offset += rc; + } + off = buff->curr_offset; + if (buff->curr_offset == sizeof(buff->len)) { + buff->len = ntohl(buff->len); + buff->buffer = calloc(1, buff->len); + } + } + if (buff->buffer) { + /* want off to now represent the offset into the buffer */ + off -= sizeof(buff->len); + + rc = recv(fd, buff->buffer+off, buff->len-off, 0); + switch(rc) { + case 0: + errno = EHOSTDOWN; + case -1: +#ifndef _WINDOWS + if (errno == EAGAIN) { +#else + if (WSAGetLastError() == WSAEWOULDBLOCK) { +#endif + break; + } + return -1; + default: + buff->curr_offset += rc; + } + } + return buff->curr_offset == buff->len + sizeof(buff->len); +} + +void free_buffers(buffer_head_t *list) +{ + while (remove_buffer(list)) + ; +} + +void free_completions(zhandle_t *zh,int callCompletion,int reason) +{ + completion_head_t tmp_list; + struct oarchive *oa; + struct ReplyHeader h; + void_completion_t auth_completion = NULL; + auth_completion_list_t a_list, *a_tmp; + + lock_completion_list(&zh->sent_requests); + tmp_list = zh->sent_requests; + zh->sent_requests.head = 0; + zh->sent_requests.last = 0; + unlock_completion_list(&zh->sent_requests); + while (tmp_list.head) { + completion_list_t *cptr = tmp_list.head; + + tmp_list.head = cptr->next; + if (cptr->c.data_result == SYNCHRONOUS_MARKER) { + struct sync_completion + *sc = (struct sync_completion*)cptr->data; + sc->rc = reason; + notify_sync_completion(sc); + zh->outstanding_sync--; + destroy_completion_entry(cptr); + } else if (callCompletion) { + if(cptr->xid == PING_XID){ + // Nothing to do with a ping response + destroy_completion_entry(cptr); + } else { + // Fake the response + buffer_list_t *bptr; + h.xid = cptr->xid; + h.zxid = -1; + h.err = reason; + oa = create_buffer_oarchive(); + serialize_ReplyHeader(oa, "header", &h); + bptr = calloc(sizeof(*bptr), 1); + assert(bptr); + bptr->len = get_buffer_len(oa); + bptr->buffer = get_buffer(oa); + close_buffer_oarchive(&oa, 0); + cptr->buffer = bptr; + queue_completion(&zh->completions_to_process, cptr, 0); + } + } + } + a_list.completion = NULL; + a_list.next = NULL; + zoo_lock_auth(zh); + get_auth_completions(&zh->auth_h, &a_list); + zoo_unlock_auth(zh); + a_tmp = &a_list; + // chain call user's completion function + while (a_tmp->completion != NULL) { + auth_completion = a_tmp->completion; + auth_completion(reason, a_tmp->auth_data); + a_tmp = a_tmp->next; + if (a_tmp == NULL) + break; + } + free_auth_completion(&a_list); +} + +static void cleanup_bufs(zhandle_t *zh,int callCompletion,int rc) +{ + enter_critical(zh); + free_buffers(&zh->to_send); + free_buffers(&zh->to_process); + free_completions(zh,callCompletion,rc); + leave_critical(zh); + if (zh->input_buffer && zh->input_buffer != &zh->primer_buffer) { + free_buffer(zh->input_buffer); + zh->input_buffer = 0; + } +} + +static void handle_error(zhandle_t *zh,int rc) +{ + close(zh->fd); + if (is_unrecoverable(zh)) { + LOG_DEBUG(("Calling a watcher for a ZOO_SESSION_EVENT and the state=%s", + state2String(zh->state))); + PROCESS_SESSION_EVENT(zh, zh->state); + } else if (zh->state == ZOO_CONNECTED_STATE) { + LOG_DEBUG(("Calling a watcher for a ZOO_SESSION_EVENT and the state=CONNECTING_STATE")); + PROCESS_SESSION_EVENT(zh, ZOO_CONNECTING_STATE); + } + cleanup_bufs(zh,1,rc); + zh->fd = -1; + zh->connect_index++; + if (!is_unrecoverable(zh)) { + zh->state = 0; + } + if (process_async(zh->outstanding_sync)) { + process_completions(zh); + } +} + +static int handle_socket_error_msg(zhandle_t *zh, int line, int rc, + const char* format, ...) +{ + if(logLevel>=ZOO_LOG_LEVEL_ERROR){ + va_list va; + char buf[1024]; + va_start(va,format); + vsnprintf(buf, sizeof(buf)-1,format,va); + log_message(ZOO_LOG_LEVEL_ERROR,line,__func__, + format_log_message("Socket [%s] zk retcode=%d, errno=%d(%s): %s", + format_current_endpoint_info(zh),rc,errno,strerror(errno),buf)); + va_end(va); + } + handle_error(zh,rc); + return rc; +} + +static void auth_completion_func(int rc, zhandle_t* zh) +{ + void_completion_t auth_completion = NULL; + auth_completion_list_t a_list; + auth_completion_list_t *a_tmp; + + if(zh==NULL) + return; + + zoo_lock_auth(zh); + + if(rc!=0){ + zh->state=ZOO_AUTH_FAILED_STATE; + }else{ + //change state for all auths + mark_active_auth(zh); + } + a_list.completion = NULL; + a_list.next = NULL; + get_auth_completions(&zh->auth_h, &a_list); + zoo_unlock_auth(zh); + if (rc) { + LOG_ERROR(("Authentication scheme %s failed. Connection closed.", + zh->auth_h.auth->scheme)); + } + else { + LOG_INFO(("Authentication scheme %s succeeded", zh->auth_h.auth->scheme)); + } + a_tmp = &a_list; + // chain call user's completion function + while (a_tmp->completion != NULL) { + auth_completion = a_tmp->completion; + auth_completion(rc, a_tmp->auth_data); + a_tmp = a_tmp->next; + if (a_tmp == NULL) + break; + } + free_auth_completion(&a_list); +} + +static int send_info_packet(zhandle_t *zh, auth_info* auth) { + struct oarchive *oa; + struct RequestHeader h = { STRUCT_INITIALIZER(xid , AUTH_XID), STRUCT_INITIALIZER(type , ZOO_SETAUTH_OP)}; + struct AuthPacket req; + int rc; + oa = create_buffer_oarchive(); + rc = serialize_RequestHeader(oa, "header", &h); + req.type=0; // ignored by the server + req.scheme = auth->scheme; + req.auth = auth->auth; + rc = rc < 0 ? rc : serialize_AuthPacket(oa, "req", &req); + /* add this buffer to the head of the send queue */ + rc = rc < 0 ? rc : queue_front_buffer_bytes(&zh->to_send, get_buffer(oa), + get_buffer_len(oa)); + /* We queued the buffer, so don't free it */ + close_buffer_oarchive(&oa, 0); + + return rc; +} + +/** send all auths, not just the last one **/ +static int send_auth_info(zhandle_t *zh) { + int rc = 0; + auth_info *auth = NULL; + + zoo_lock_auth(zh); + auth = zh->auth_h.auth; + if (auth == NULL) { + zoo_unlock_auth(zh); + return ZOK; + } + while (auth != NULL) { + rc = send_info_packet(zh, auth); + auth = auth->next; + } + zoo_unlock_auth(zh); + LOG_DEBUG(("Sending all auth info request to %s", format_current_endpoint_info(zh))); + return (rc <0) ? ZMARSHALLINGERROR:ZOK; +} + +static int send_last_auth_info(zhandle_t *zh) +{ + int rc = 0; + auth_info *auth = NULL; + + zoo_lock_auth(zh); + auth = get_last_auth(&zh->auth_h); + if(auth==NULL) { + zoo_unlock_auth(zh); + return ZOK; // there is nothing to send + } + rc = send_info_packet(zh, auth); + zoo_unlock_auth(zh); + LOG_DEBUG(("Sending auth info request to %s",format_current_endpoint_info(zh))); + return (rc < 0)?ZMARSHALLINGERROR:ZOK; +} + +static void free_key_list(char **list, int count) +{ + int i; + + for(i = 0; i < count; i++) { + free(list[i]); + } + free(list); +} + +static int send_set_watches(zhandle_t *zh) +{ + struct oarchive *oa; + struct RequestHeader h = { STRUCT_INITIALIZER(xid , SET_WATCHES_XID), STRUCT_INITIALIZER(type , ZOO_SETWATCHES_OP)}; + struct SetWatches req; + int rc; + + req.relativeZxid = zh->last_zxid; + req.dataWatches.data = collect_keys(zh->active_node_watchers, (int*)&req.dataWatches.count); + req.existWatches.data = collect_keys(zh->active_exist_watchers, (int*)&req.existWatches.count); + req.childWatches.data = collect_keys(zh->active_child_watchers, (int*)&req.childWatches.count); + + // return if there are no pending watches + if (!req.dataWatches.count && !req.existWatches.count && + !req.childWatches.count) { + free_key_list(req.dataWatches.data, req.dataWatches.count); + free_key_list(req.existWatches.data, req.existWatches.count); + free_key_list(req.childWatches.data, req.childWatches.count); + return ZOK; + } + + + oa = create_buffer_oarchive(); + rc = serialize_RequestHeader(oa, "header", &h); + rc = rc < 0 ? rc : serialize_SetWatches(oa, "req", &req); + /* add this buffer to the head of the send queue */ + rc = rc < 0 ? rc : queue_front_buffer_bytes(&zh->to_send, get_buffer(oa), + get_buffer_len(oa)); + /* We queued the buffer, so don't free it */ + close_buffer_oarchive(&oa, 0); + free_key_list(req.dataWatches.data, req.dataWatches.count); + free_key_list(req.existWatches.data, req.existWatches.count); + free_key_list(req.childWatches.data, req.childWatches.count); + LOG_DEBUG(("Sending set watches request to %s",format_current_endpoint_info(zh))); + return (rc < 0)?ZMARSHALLINGERROR:ZOK; +} + +static int serialize_prime_connect(struct connect_req *req, char* buffer){ + //this should be the order of serialization + int offset = 0; + req->protocolVersion = htonl(req->protocolVersion); + memcpy(buffer + offset, &req->protocolVersion, sizeof(req->protocolVersion)); + offset = offset + sizeof(req->protocolVersion); + + req->lastZxidSeen = htonll(req->lastZxidSeen); + memcpy(buffer + offset, &req->lastZxidSeen, sizeof(req->lastZxidSeen)); + offset = offset + sizeof(req->lastZxidSeen); + + req->timeOut = htonl(req->timeOut); + memcpy(buffer + offset, &req->timeOut, sizeof(req->timeOut)); + offset = offset + sizeof(req->timeOut); + + req->sessionId = htonll(req->sessionId); + memcpy(buffer + offset, &req->sessionId, sizeof(req->sessionId)); + offset = offset + sizeof(req->sessionId); + + req->passwd_len = htonl(req->passwd_len); + memcpy(buffer + offset, &req->passwd_len, sizeof(req->passwd_len)); + offset = offset + sizeof(req->passwd_len); + + memcpy(buffer + offset, req->passwd, sizeof(req->passwd)); + + return 0; +} + + static int deserialize_prime_response(struct prime_struct *req, char* buffer){ + //this should be the order of deserialization + int offset = 0; + memcpy(&req->len, buffer + offset, sizeof(req->len)); + offset = offset + sizeof(req->len); + + req->len = ntohl(req->len); + memcpy(&req->protocolVersion, buffer + offset, sizeof(req->protocolVersion)); + offset = offset + sizeof(req->protocolVersion); + + req->protocolVersion = ntohl(req->protocolVersion); + memcpy(&req->timeOut, buffer + offset, sizeof(req->timeOut)); + offset = offset + sizeof(req->timeOut); + + req->timeOut = ntohl(req->timeOut); + memcpy(&req->sessionId, buffer + offset, sizeof(req->sessionId)); + offset = offset + sizeof(req->sessionId); + + req->sessionId = htonll(req->sessionId); + memcpy(&req->passwd_len, buffer + offset, sizeof(req->passwd_len)); + offset = offset + sizeof(req->passwd_len); + + req->passwd_len = ntohl(req->passwd_len); + memcpy(req->passwd, buffer + offset, sizeof(req->passwd)); + return 0; + } + +static int prime_connection(zhandle_t *zh) +{ + int rc; + /*this is the size of buffer to serialize req into*/ + char buffer_req[HANDSHAKE_REQ_SIZE]; + int len = sizeof(buffer_req); + int hlen = 0; + struct connect_req req; + req.protocolVersion = 0; + req.sessionId = zh->client_id.client_id; + req.passwd_len = sizeof(req.passwd); + memcpy(req.passwd, zh->client_id.passwd, sizeof(zh->client_id.passwd)); + req.timeOut = zh->recv_timeout; + req.lastZxidSeen = zh->last_zxid; + hlen = htonl(len); + /* We are running fast and loose here, but this string should fit in the initial buffer! */ + rc=zookeeper_send(zh->fd, &hlen, sizeof(len)); + serialize_prime_connect(&req, buffer_req); + rc=rc<0 ? rc : zookeeper_send(zh->fd, buffer_req, len); + if (rc<0) { + return handle_socket_error_msg(zh, __LINE__, ZCONNECTIONLOSS, + "failed to send a handshake packet: %s", strerror(errno)); + } + zh->state = ZOO_ASSOCIATING_STATE; + + zh->input_buffer = &zh->primer_buffer; + /* This seems a bit weird to to set the offset to 4, but we already have a + * length, so we skip reading the length (and allocating the buffer) by + * saying that we are already at offset 4 */ + zh->input_buffer->curr_offset = 4; + + return ZOK; +} + +static inline int calculate_interval(const struct timeval *start, + const struct timeval *end) +{ + int interval; + struct timeval i = *end; + i.tv_sec -= start->tv_sec; + i.tv_usec -= start->tv_usec; + interval = i.tv_sec * 1000 + (i.tv_usec/1000); + return interval; +} + +static struct timeval get_timeval(int interval) +{ + struct timeval tv; + if (interval < 0) { + interval = 0; + } + tv.tv_sec = interval/1000; + tv.tv_usec = (interval%1000)*1000; + return tv; +} + + static int add_void_completion(zhandle_t *zh, int xid, void_completion_t dc, + const void *data); + static int add_string_completion(zhandle_t *zh, int xid, + string_completion_t dc, const void *data); + + int send_ping(zhandle_t* zh) + { + int rc; + struct oarchive *oa = create_buffer_oarchive(); + struct RequestHeader h = { STRUCT_INITIALIZER(xid ,PING_XID), STRUCT_INITIALIZER (type , ZOO_PING_OP) }; + + rc = serialize_RequestHeader(oa, "header", &h); + enter_critical(zh); + gettimeofday(&zh->last_ping, 0); + rc = rc < 0 ? rc : add_void_completion(zh, h.xid, 0, 0); + rc = rc < 0 ? rc : queue_buffer_bytes(&zh->to_send, get_buffer(oa), + get_buffer_len(oa)); + leave_critical(zh); + close_buffer_oarchive(&oa, 0); + return rc<0 ? rc : adaptor_send_queue(zh, 0); +} + +#ifdef WIN32 +int zookeeper_interest(zhandle_t *zh, SOCKET *fd, int *interest, + struct timeval *tv) +{ + + ULONG nonblocking_flag = 1; +#else +int zookeeper_interest(zhandle_t *zh, int *fd, int *interest, + struct timeval *tv) +{ +#endif + struct timeval now; + if(zh==0 || fd==0 ||interest==0 || tv==0) + return ZBADARGUMENTS; + if (is_unrecoverable(zh)) + return ZINVALIDSTATE; + gettimeofday(&now, 0); + if(zh->next_deadline.tv_sec!=0 || zh->next_deadline.tv_usec!=0){ + int time_left = calculate_interval(&zh->next_deadline, &now); + if (time_left > 10) + LOG_WARN(("Exceeded deadline by %dms", time_left)); + } + api_prolog(zh); + *fd = zh->fd; + *interest = 0; + tv->tv_sec = 0; + tv->tv_usec = 0; + if (*fd == -1) { + if (zh->connect_index == zh->addrs_count) { + /* Wait a bit before trying again so that we don't spin */ + zh->connect_index = 0; + }else { + int rc; +#ifdef WIN32 + char enable_tcp_nodelay = 1; +#else + int enable_tcp_nodelay = 1; +#endif + int ssoresult; + + zh->fd = socket(zh->addrs[zh->connect_index].ss_family, SOCK_STREAM, 0); + if (zh->fd < 0) { + return api_epilog(zh,handle_socket_error_msg(zh,__LINE__, + ZSYSTEMERROR, "socket() call failed")); + } + ssoresult = setsockopt(zh->fd, IPPROTO_TCP, TCP_NODELAY, &enable_tcp_nodelay, sizeof(enable_tcp_nodelay)); + if (ssoresult != 0) { + LOG_WARN(("Unable to set TCP_NODELAY, operation latency may be effected")); + } +#ifdef WIN32 + ioctlsocket(zh->fd, FIONBIO, &nonblocking_flag); +#else + fcntl(zh->fd, F_SETFL, O_NONBLOCK|fcntl(zh->fd, F_GETFL, 0)); +#endif +#if defined(AF_INET6) + if (zh->addrs[zh->connect_index].ss_family == AF_INET6) { + rc = connect(zh->fd, (struct sockaddr*) &zh->addrs[zh->connect_index], sizeof(struct sockaddr_in6)); + } else { +#else + LOG_DEBUG(("[zk] connect()\n")); + { +#endif + rc = connect(zh->fd, (struct sockaddr*) &zh->addrs[zh->connect_index], sizeof(struct sockaddr_in)); +#ifdef WIN32 + get_errno(); +#endif + } + if (rc == -1) { + /* we are handling the non-blocking connect according to + * the description in section 16.3 "Non-blocking connect" + * in UNIX Network Programming vol 1, 3rd edition */ + if (errno == EWOULDBLOCK || errno == EINPROGRESS) + zh->state = ZOO_CONNECTING_STATE; + else + return api_epilog(zh,handle_socket_error_msg(zh,__LINE__, + ZCONNECTIONLOSS,"connect() call failed")); + } else { + if((rc=prime_connection(zh))!=0) + return api_epilog(zh,rc); + + LOG_INFO(("Initiated connection to server [%s]", + format_endpoint_info(&zh->addrs[zh->connect_index]))); + } + } + *fd = zh->fd; + *tv = get_timeval(zh->recv_timeout/3); + zh->last_recv = now; + zh->last_send = now; + zh->last_ping = now; + } + if (zh->fd != -1) { + int idle_recv = calculate_interval(&zh->last_recv, &now); + int idle_send = calculate_interval(&zh->last_send, &now); + int recv_to = zh->recv_timeout*2/3 - idle_recv; + int send_to = zh->recv_timeout/3; + // have we exceeded the receive timeout threshold? + if (recv_to <= 0) { + // We gotta cut our losses and connect to someone else +#ifdef WIN32 + errno = WSAETIMEDOUT; +#else + errno = ETIMEDOUT; +#endif + *interest=0; + *tv = get_timeval(0); + return api_epilog(zh,handle_socket_error_msg(zh, + __LINE__,ZOPERATIONTIMEOUT, + "connection to %s timed out (exceeded timeout by %dms)", + format_endpoint_info(&zh->addrs[zh->connect_index]), + -recv_to)); + + } + // We only allow 1/3 of our timeout time to expire before sending + // a PING + if (zh->state==ZOO_CONNECTED_STATE) { + send_to = zh->recv_timeout/3 - idle_send; + if (send_to <= 0) { + if (zh->sent_requests.head==0) { +// LOG_DEBUG(("Sending PING to %s (exceeded idle by %dms)", +// format_current_endpoint_info(zh),-send_to)); + int rc=send_ping(zh); + if (rc < 0){ + LOG_ERROR(("failed to send PING request (zk retcode=%d)",rc)); + return api_epilog(zh,rc); + } + } + send_to = zh->recv_timeout/3; + } + } + // choose the lesser value as the timeout + *tv = get_timeval(recv_to < send_to? recv_to:send_to); + zh->next_deadline.tv_sec = now.tv_sec + tv->tv_sec; + zh->next_deadline.tv_usec = now.tv_usec + tv->tv_usec; + if (zh->next_deadline.tv_usec > 1000000) { + zh->next_deadline.tv_sec += zh->next_deadline.tv_usec / 1000000; + zh->next_deadline.tv_usec = zh->next_deadline.tv_usec % 1000000; + } + *interest = ZOOKEEPER_READ; + /* we are interested in a write if we are connected and have something + * to send, or we are waiting for a connect to finish. */ + if ((zh->to_send.head && (zh->state == ZOO_CONNECTED_STATE)) + || zh->state == ZOO_CONNECTING_STATE) { + *interest |= ZOOKEEPER_WRITE; + } + } + return api_epilog(zh,ZOK); +} + +static int check_events(zhandle_t *zh, int events) +{ + if (zh->fd == -1) + return ZINVALIDSTATE; + if ((events&ZOOKEEPER_WRITE)&&(zh->state == ZOO_CONNECTING_STATE)) { + int rc, error; + socklen_t len = sizeof(error); + rc = getsockopt(zh->fd, SOL_SOCKET, SO_ERROR, &error, &len); + /* the description in section 16.4 "Non-blocking connect" + * in UNIX Network Programming vol 1, 3rd edition, points out + * that sometimes the error is in errno and sometimes in error */ + if (rc < 0 || error) { + if (rc == 0) + errno = error; + return handle_socket_error_msg(zh, __LINE__,ZCONNECTIONLOSS, + "server refused to accept the client"); + } + if((rc=prime_connection(zh))!=0) + return rc; + LOG_INFO(("initiated connection to server [%s]", + format_endpoint_info(&zh->addrs[zh->connect_index]))); + return ZOK; + } + if (zh->to_send.head && (events&ZOOKEEPER_WRITE)) { + /* make the flush call non-blocking by specifying a 0 timeout */ + int rc=flush_send_queue(zh,0); + if (rc < 0) + return handle_socket_error_msg(zh,__LINE__,ZCONNECTIONLOSS, + "failed while flushing send queue"); + } + if (events&ZOOKEEPER_READ) { + int rc; + if (zh->input_buffer == 0) { + zh->input_buffer = allocate_buffer(0,0); + } + + rc = recv_buffer(zh->fd, zh->input_buffer); + if (rc < 0) { + return handle_socket_error_msg(zh, __LINE__,ZCONNECTIONLOSS, + "failed while receiving a server response"); + } + if (rc > 0) { + gettimeofday(&zh->last_recv, 0); + if (zh->input_buffer != &zh->primer_buffer) { + queue_buffer(&zh->to_process, zh->input_buffer, 0); + } else { + int64_t oldid,newid; + //deserialize + deserialize_prime_response(&zh->primer_storage, zh->primer_buffer.buffer); + /* We are processing the primer_buffer, so we need to finish + * the connection handshake */ + oldid = zh->client_id.client_id; + newid = zh->primer_storage.sessionId; + if (oldid != 0 && oldid != newid) { + zh->state = ZOO_EXPIRED_SESSION_STATE; + errno = ESTALE; + return handle_socket_error_msg(zh,__LINE__,ZSESSIONEXPIRED, + "sessionId=%#llx has expired.",oldid); + } else { + zh->recv_timeout = zh->primer_storage.timeOut; + zh->client_id.client_id = newid; + + memcpy(zh->client_id.passwd, &zh->primer_storage.passwd, + sizeof(zh->client_id.passwd)); + zh->state = ZOO_CONNECTED_STATE; + LOG_INFO(("session establishment complete on server [%s], sessionId=%#llx, negotiated timeout=%d", + format_endpoint_info(&zh->addrs[zh->connect_index]), + newid, zh->recv_timeout)); + /* we want the auth to be sent for, but since both call push to front + we need to call send_watch_set first */ + send_set_watches(zh); + /* send the authentication packet now */ + send_auth_info(zh); + LOG_DEBUG(("Calling a watcher for a ZOO_SESSION_EVENT and the state=ZOO_CONNECTED_STATE")); + zh->input_buffer = 0; // just in case the watcher calls zookeeper_process() again + PROCESS_SESSION_EVENT(zh, ZOO_CONNECTED_STATE); + } + } + zh->input_buffer = 0; + } else { + // zookeeper_process was called but there was nothing to read + // from the socket + return ZNOTHING; + } + } + return ZOK; +} + +void api_prolog(zhandle_t* zh) +{ + inc_ref_counter(zh,1); +} + +int api_epilog(zhandle_t *zh,int rc) +{ + if(inc_ref_counter(zh,-1)==0 && zh->close_requested!=0) + zookeeper_close(zh); + return rc; +} + +static __attribute__((unused)) void print_completion_queue(zhandle_t *zh) +{ + completion_list_t* cptr; + + if(logLevelsent_requests.head==0) { + fprintf(LOGSTREAM,"empty\n"); + return; + } + + cptr=zh->sent_requests.head; + while(cptr){ + fprintf(LOGSTREAM,"%d,",cptr->xid); + cptr=cptr->next; + } + fprintf(LOGSTREAM,"end\n"); +} + +//#ifdef THREADED +// IO thread queues session events to be processed by the completion thread +static int queue_session_event(zhandle_t *zh, int state) +{ + int rc; + struct WatcherEvent evt = { ZOO_SESSION_EVENT, state, "" }; + struct ReplyHeader hdr = { WATCHER_EVENT_XID, 0, 0 }; + struct oarchive *oa; + completion_list_t *cptr; + + if ((oa=create_buffer_oarchive())==NULL) { + LOG_ERROR(("out of memory")); + goto error; + } + rc = serialize_ReplyHeader(oa, "hdr", &hdr); + rc = rc<0?rc: serialize_WatcherEvent(oa, "event", &evt); + if(rc<0){ + close_buffer_oarchive(&oa, 1); + goto error; + } + cptr = create_completion_entry(WATCHER_EVENT_XID,-1,0,0,0,0); + cptr->buffer = allocate_buffer(get_buffer(oa), get_buffer_len(oa)); + cptr->buffer->curr_offset = get_buffer_len(oa); + if (!cptr->buffer) { + free(cptr); + close_buffer_oarchive(&oa, 1); + goto error; + } + /* We queued the buffer, so don't free it */ + close_buffer_oarchive(&oa, 0); + cptr->c.watcher_result = collectWatchers(zh, ZOO_SESSION_EVENT, ""); + queue_completion(&zh->completions_to_process, cptr, 0); + if (process_async(zh->outstanding_sync)) { + process_completions(zh); + } + return ZOK; +error: + errno=ENOMEM; + return ZSYSTEMERROR; +} +//#endif + +completion_list_t *dequeue_completion(completion_head_t *list) +{ + completion_list_t *cptr; + lock_completion_list(list); + cptr = list->head; + if (cptr) { + list->head = cptr->next; + if (!list->head) { + assert(list->last == cptr); + list->last = 0; + } + } + unlock_completion_list(list); + return cptr; +} + +static void process_sync_completion( + completion_list_t *cptr, + struct sync_completion *sc, + struct iarchive *ia, + zhandle_t *zh) +{ + LOG_DEBUG(("Processing sync_completion with type=%d xid=%#x rc=%d", + cptr->c.type, cptr->xid, sc->rc)); + + switch(cptr->c.type) { + case COMPLETION_DATA: + if (sc->rc==0) { + struct GetDataResponse res; + int len; + deserialize_GetDataResponse(ia, "reply", &res); + if (res.data.len <= sc->u.data.buff_len) { + len = res.data.len; + } else { + len = sc->u.data.buff_len; + } + sc->u.data.buff_len = len; + // check if len is negative + // just of NULL which is -1 int + if (len == -1) { + sc->u.data.buffer = NULL; + } else { + memcpy(sc->u.data.buffer, res.data.buff, len); + } + sc->u.data.stat = res.stat; + deallocate_GetDataResponse(&res); + } + break; + case COMPLETION_STAT: + if (sc->rc==0) { + struct SetDataResponse res; + deserialize_SetDataResponse(ia, "reply", &res); + sc->u.stat = res.stat; + deallocate_SetDataResponse(&res); + } + break; + case COMPLETION_STRINGLIST: + if (sc->rc==0) { + struct GetChildrenResponse res; + deserialize_GetChildrenResponse(ia, "reply", &res); + sc->u.strs2 = res.children; + /* We don't deallocate since we are passing it back */ + // deallocate_GetChildrenResponse(&res); + } + break; + case COMPLETION_STRINGLIST_STAT: + if (sc->rc==0) { + struct GetChildren2Response res; + deserialize_GetChildren2Response(ia, "reply", &res); + sc->u.strs_stat.strs2 = res.children; + sc->u.strs_stat.stat2 = res.stat; + /* We don't deallocate since we are passing it back */ + // deallocate_GetChildren2Response(&res); + } + break; + case COMPLETION_STRING: + if (sc->rc==0) { + struct CreateResponse res; + int len; + const char * client_path; + deserialize_CreateResponse(ia, "reply", &res); + //ZOOKEEPER-1027 + client_path = sub_string(zh, res.path); + len = strlen(client_path) + 1;if (len > sc->u.str.str_len) { + len = sc->u.str.str_len; + } + if (len > 0) { + memcpy(sc->u.str.str, client_path, len - 1); + sc->u.str.str[len - 1] = '\0'; + } + free_duplicate_path(client_path, res.path); + deallocate_CreateResponse(&res); + } + break; + case COMPLETION_ACLLIST: + if (sc->rc==0) { + struct GetACLResponse res; + deserialize_GetACLResponse(ia, "reply", &res); + sc->u.acl.acl = res.acl; + sc->u.acl.stat = res.stat; + /* We don't deallocate since we are passing it back */ + //deallocate_GetACLResponse(&res); + } + break; + case COMPLETION_VOID: + break; + case COMPLETION_MULTI: + sc->rc = deserialize_multi(cptr->xid, cptr, ia); + break; + default: + LOG_DEBUG(("Unsupported completion type=%d", cptr->c.type)); + break; + } +} + +static int deserialize_multi(int xid, completion_list_t *cptr, struct iarchive *ia) +{ + int rc = 0; + completion_head_t *clist = &cptr->c.clist; + struct MultiHeader mhdr = { STRUCT_INITIALIZER(type , 0), STRUCT_INITIALIZER(done , 0), STRUCT_INITIALIZER(err , 0) }; + assert(clist); + deserialize_MultiHeader(ia, "multiheader", &mhdr); + while (!mhdr.done) { + completion_list_t *entry = dequeue_completion(clist); + assert(entry); + + if (mhdr.type == -1) { + struct ErrorResponse er; + deserialize_ErrorResponse(ia, "error", &er); + mhdr.err = er.err ; + if (rc == 0 && er.err != 0 && er.err != ZRUNTIMEINCONSISTENCY) { + rc = er.err; + } + } + + deserialize_response(entry->c.type, xid, mhdr.type == -1, mhdr.err, entry, ia); + deserialize_MultiHeader(ia, "multiheader", &mhdr); + //While deserializing the response we must destroy completion entry for each operation in + //the zoo_multi transaction. Otherwise this results in memory leak when client invokes zoo_multi + //operation. + destroy_completion_entry(entry); + } + + return rc; +} + +static void deserialize_response(int type, int xid, int failed, int rc, completion_list_t *cptr, struct iarchive *ia) +{ + switch (type) { + case COMPLETION_DATA: + LOG_DEBUG(("Calling COMPLETION_DATA for xid=%#x failed=%d rc=%d", + cptr->xid, failed, rc)); + if (failed) { + cptr->c.data_result(rc, 0, 0, 0, cptr->data); + } else { + struct GetDataResponse res; + deserialize_GetDataResponse(ia, "reply", &res); + cptr->c.data_result(rc, res.data.buff, res.data.len, + &res.stat, cptr->data); + deallocate_GetDataResponse(&res); + } + break; + case COMPLETION_STAT: + LOG_DEBUG(("Calling COMPLETION_STAT for xid=%#x failed=%d rc=%d", + cptr->xid, failed, rc)); + if (failed) { + cptr->c.stat_result(rc, 0, cptr->data); + } else { + struct SetDataResponse res; + deserialize_SetDataResponse(ia, "reply", &res); + cptr->c.stat_result(rc, &res.stat, cptr->data); + deallocate_SetDataResponse(&res); + } + break; + case COMPLETION_STRINGLIST: + LOG_DEBUG(("Calling COMPLETION_STRINGLIST for xid=%#x failed=%d rc=%d", + cptr->xid, failed, rc)); + if (failed) { + cptr->c.strings_result(rc, 0, cptr->data); + } else { + struct GetChildrenResponse res; + deserialize_GetChildrenResponse(ia, "reply", &res); + cptr->c.strings_result(rc, &res.children, cptr->data); + deallocate_GetChildrenResponse(&res); + } + break; + case COMPLETION_STRINGLIST_STAT: + LOG_DEBUG(("Calling COMPLETION_STRINGLIST_STAT for xid=%#x failed=%d rc=%d", + cptr->xid, failed, rc)); + if (failed) { + cptr->c.strings_stat_result(rc, 0, 0, cptr->data); + } else { + struct GetChildren2Response res; + deserialize_GetChildren2Response(ia, "reply", &res); + cptr->c.strings_stat_result(rc, &res.children, &res.stat, cptr->data); + deallocate_GetChildren2Response(&res); + } + break; + case COMPLETION_STRING: + LOG_DEBUG(("Calling COMPLETION_STRING for xid=%#x failed=%d, rc=%d", + cptr->xid, failed, rc)); + if (failed) { + cptr->c.string_result(rc, 0, cptr->data); + } else { + struct CreateResponse res; + deserialize_CreateResponse(ia, "reply", &res); + cptr->c.string_result(rc, res.path, cptr->data); + deallocate_CreateResponse(&res); + } + break; + case COMPLETION_ACLLIST: + LOG_DEBUG(("Calling COMPLETION_ACLLIST for xid=%#x failed=%d rc=%d", + cptr->xid, failed, rc)); + if (failed) { + cptr->c.acl_result(rc, 0, 0, cptr->data); + } else { + struct GetACLResponse res; + deserialize_GetACLResponse(ia, "reply", &res); + cptr->c.acl_result(rc, &res.acl, &res.stat, cptr->data); + deallocate_GetACLResponse(&res); + } + break; + case COMPLETION_VOID: + LOG_DEBUG(("Calling COMPLETION_VOID for xid=%#x failed=%d rc=%d", + cptr->xid, failed, rc)); + if (xid == PING_XID) { + // We want to skip the ping + } else { + assert(cptr->c.void_result); + cptr->c.void_result(rc, cptr->data); + } + break; + case COMPLETION_MULTI: + LOG_DEBUG(("Calling COMPLETION_MULTI for xid=%#x failed=%d rc=%d", + cptr->xid, failed, rc)); + rc = deserialize_multi(xid, cptr, ia); + assert(cptr->c.void_result); + cptr->c.void_result(rc, cptr->data); + break; + default: + LOG_DEBUG(("Unsupported completion type=%d", cptr->c.type)); + } +} + + +/* handles async completion (both single- and multithreaded) */ +void process_completions(zhandle_t *zh) +{ + completion_list_t *cptr; + while ((cptr = dequeue_completion(&zh->completions_to_process)) != 0) { + struct ReplyHeader hdr; + buffer_list_t *bptr = cptr->buffer; + struct iarchive *ia = create_buffer_iarchive(bptr->buffer, + bptr->len); + deserialize_ReplyHeader(ia, "hdr", &hdr); + + if (hdr.xid == WATCHER_EVENT_XID) { + int type, state; + struct WatcherEvent evt; + deserialize_WatcherEvent(ia, "event", &evt); + /* We are doing a notification, so there is no pending request */ + type = evt.type; + state = evt.state; + /* This is a notification so there aren't any pending requests */ + LOG_DEBUG(("Calling a watcher for node [%s], type = %d event=%s", + (evt.path==NULL?"NULL":evt.path), cptr->c.type, + watcherEvent2String(type))); + deliverWatchers(zh,type,state,evt.path, &cptr->c.watcher_result); + deallocate_WatcherEvent(&evt); + } else { + deserialize_response(cptr->c.type, hdr.xid, hdr.err != 0, hdr.err, cptr, ia); + } + destroy_completion_entry(cptr); + close_buffer_iarchive(&ia); + } +} + +static void isSocketReadable(zhandle_t* zh) +{ +#ifndef WIN32 + struct pollfd fds; + fds.fd = zh->fd; + fds.events = POLLIN; + if (poll(&fds,1,0)<=0) { + // socket not readable -- no more responses to process + zh->socket_readable.tv_sec=zh->socket_readable.tv_usec=0; + } +#else + fd_set rfds; + struct timeval waittime = {0, 0}; + FD_ZERO(&rfds); + FD_SET( zh->fd , &rfds); + if (select(0, &rfds, NULL, NULL, &waittime) <= 0){ + // socket not readable -- no more responses to process + zh->socket_readable.tv_sec=zh->socket_readable.tv_usec=0; + } +#endif + else{ + gettimeofday(&zh->socket_readable,0); + } +} + +static void checkResponseLatency(zhandle_t* zh) +{ + int delay; + struct timeval now; + + if(zh->socket_readable.tv_sec==0) + return; + + gettimeofday(&now,0); + delay=calculate_interval(&zh->socket_readable, &now); + if(delay>20) + LOG_DEBUG(("The following server response has spent at least %dms sitting in the client socket recv buffer",delay)); + + zh->socket_readable.tv_sec=zh->socket_readable.tv_usec=0; +} + +int zookeeper_process(zhandle_t *zh, int events) +{ + buffer_list_t *bptr; + int rc; + + if (zh==NULL) + return ZBADARGUMENTS; + if (is_unrecoverable(zh)) + return ZINVALIDSTATE; + api_prolog(zh); + IF_DEBUG(checkResponseLatency(zh)); + rc = check_events(zh, events); + if (rc!=ZOK) + return api_epilog(zh, rc); + + IF_DEBUG(isSocketReadable(zh)); + + while (rc >= 0 && (bptr=dequeue_buffer(&zh->to_process))) { + struct ReplyHeader hdr; + struct iarchive *ia = create_buffer_iarchive( + bptr->buffer, bptr->curr_offset); + deserialize_ReplyHeader(ia, "hdr", &hdr); + if (hdr.zxid > 0) { + zh->last_zxid = hdr.zxid; + } else { + // fprintf(stderr, "Got %#x for %#x\n", hdr.zxid, hdr.xid); + } + + if (hdr.xid == WATCHER_EVENT_XID) { + struct WatcherEvent evt; + int type = 0; + char *path = NULL; + completion_list_t *c = NULL; + + LOG_DEBUG(("Processing WATCHER_EVENT")); + + deserialize_WatcherEvent(ia, "event", &evt); + type = evt.type; + path = evt.path; + /* We are doing a notification, so there is no pending request */ + c = create_completion_entry(WATCHER_EVENT_XID,-1,0,0,0,0); + c->buffer = bptr; + c->c.watcher_result = collectWatchers(zh, type, path); + + // We cannot free until now, otherwise path will become invalid + deallocate_WatcherEvent(&evt); + queue_completion(&zh->completions_to_process, c, 0); + } else if (hdr.xid == SET_WATCHES_XID) { + LOG_DEBUG(("Processing SET_WATCHES")); + free_buffer(bptr); + } else if (hdr.xid == AUTH_XID){ + LOG_DEBUG(("Processing AUTH_XID")); + + /* special handling for the AUTH response as it may come back + * out-of-band */ + auth_completion_func(hdr.err,zh); + free_buffer(bptr); + /* authentication completion may change the connection state to + * unrecoverable */ + if(is_unrecoverable(zh)){ + handle_error(zh, ZAUTHFAILED); + close_buffer_iarchive(&ia); + return api_epilog(zh, ZAUTHFAILED); + } + } else { + int rc = hdr.err; + /* Find the request corresponding to the response */ + completion_list_t *cptr = dequeue_completion(&zh->sent_requests); + + /* [ZOOKEEPER-804] Don't assert if zookeeper_close has been called. */ + if (zh->close_requested == 1 && cptr == NULL) { + LOG_DEBUG(("Completion queue has been cleared by zookeeper_close()")); + close_buffer_iarchive(&ia); + return api_epilog(zh,ZINVALIDSTATE); + } + assert(cptr); + /* The requests are going to come back in order */ + if (cptr->xid != hdr.xid) { + LOG_DEBUG(("Processing unexpected or out-of-order response!")); + + // received unexpected (or out-of-order) response + close_buffer_iarchive(&ia); + free_buffer(bptr); + // put the completion back on the queue (so it gets properly + // signaled and deallocated) and disconnect from the server + queue_completion(&zh->sent_requests,cptr,1); + return handle_socket_error_msg(zh, __LINE__,ZRUNTIMEINCONSISTENCY, + "unexpected server response: expected %#x, but received %#x", + hdr.xid,cptr->xid); + } + + activateWatcher(zh, cptr->watcher, rc); + + if (cptr->c.void_result != SYNCHRONOUS_MARKER) { + if(hdr.xid == PING_XID){ + int elapsed = 0; + struct timeval now; + gettimeofday(&now, 0); + elapsed = calculate_interval(&zh->last_ping, &now); + LOG_DEBUG(("Got ping response in %d ms", elapsed)); + + // Nothing to do with a ping response + free_buffer(bptr); + destroy_completion_entry(cptr); + } else { + LOG_DEBUG(("Queueing asynchronous response")); + + cptr->buffer = bptr; + queue_completion(&zh->completions_to_process, cptr, 0); + } + } else { + struct sync_completion + *sc = (struct sync_completion*)cptr->data; + sc->rc = rc; + + process_sync_completion(cptr, sc, ia, zh); + + notify_sync_completion(sc); + free_buffer(bptr); + zh->outstanding_sync--; + destroy_completion_entry(cptr); + } + } + + close_buffer_iarchive(&ia); + + } + if (process_async(zh->outstanding_sync)) { + process_completions(zh); + } + return api_epilog(zh,ZOK);} + +int zoo_state(zhandle_t *zh) +{ + if(zh!=0) + return zh->state; + return 0; +} + +static watcher_registration_t* create_watcher_registration(const char* path, + result_checker_fn checker,watcher_fn watcher,void* ctx){ + watcher_registration_t* wo; + if(watcher==0) + return 0; + wo=calloc(1,sizeof(watcher_registration_t)); + wo->path=strdup(path); + wo->watcher=watcher; + wo->context=ctx; + wo->checker=checker; + return wo; +} + +static void destroy_watcher_registration(watcher_registration_t* wo){ + if(wo!=0){ + free((void*)wo->path); + free(wo); + } +} + +static completion_list_t* create_completion_entry(int xid, int completion_type, + const void *dc, const void *data,watcher_registration_t* wo, completion_head_t *clist) +{ + completion_list_t *c = calloc(1,sizeof(completion_list_t)); + if (!c) { + LOG_ERROR(("out of memory")); + return 0; + } + c->c.type = completion_type; + c->data = data; + switch(c->c.type) { + case COMPLETION_VOID: + c->c.void_result = (void_completion_t)dc; + break; + case COMPLETION_STRING: + c->c.string_result = (string_completion_t)dc; + break; + case COMPLETION_DATA: + c->c.data_result = (data_completion_t)dc; + break; + case COMPLETION_STAT: + c->c.stat_result = (stat_completion_t)dc; + break; + case COMPLETION_STRINGLIST: + c->c.strings_result = (strings_completion_t)dc; + break; + case COMPLETION_STRINGLIST_STAT: + c->c.strings_stat_result = (strings_stat_completion_t)dc; + break; + case COMPLETION_ACLLIST: + c->c.acl_result = (acl_completion_t)dc; + break; + case COMPLETION_MULTI: + assert(clist); + c->c.void_result = (void_completion_t)dc; + c->c.clist = *clist; + break; + } + c->xid = xid; + c->watcher = wo; + + return c; +} + +static void destroy_completion_entry(completion_list_t* c){ + if(c!=0){ + destroy_watcher_registration(c->watcher); + if(c->buffer!=0) + free_buffer(c->buffer); + free(c); + } +} + +static void queue_completion_nolock(completion_head_t *list, + completion_list_t *c, + int add_to_front) +{ + c->next = 0; + /* appending a new entry to the back of the list */ + if (list->last) { + assert(list->head); + // List is not empty + if (!add_to_front) { + list->last->next = c; + list->last = c; + } else { + c->next = list->head; + list->head = c; + } + } else { + // List is empty + assert(!list->head); + list->head = c; + list->last = c; + } +} + +static void queue_completion(completion_head_t *list, completion_list_t *c, + int add_to_front) +{ + + lock_completion_list(list); + queue_completion_nolock(list, c, add_to_front); + unlock_completion_list(list); +} + +static int add_completion(zhandle_t *zh, int xid, int completion_type, + const void *dc, const void *data, int add_to_front, + watcher_registration_t* wo, completion_head_t *clist) +{ + completion_list_t *c =create_completion_entry(xid, completion_type, dc, + data, wo, clist); + int rc = 0; + if (!c) + return ZSYSTEMERROR; + lock_completion_list(&zh->sent_requests); + if (zh->close_requested != 1) { + queue_completion_nolock(&zh->sent_requests, c, add_to_front); + if (dc == SYNCHRONOUS_MARKER) { + zh->outstanding_sync++; + } + rc = ZOK; + } else { + free(c); + rc = ZINVALIDSTATE; + } + unlock_completion_list(&zh->sent_requests); + return rc; +} + +static int add_data_completion(zhandle_t *zh, int xid, data_completion_t dc, + const void *data,watcher_registration_t* wo) +{ + return add_completion(zh, xid, COMPLETION_DATA, dc, data, 0, wo, 0); +} + +static int add_stat_completion(zhandle_t *zh, int xid, stat_completion_t dc, + const void *data,watcher_registration_t* wo) +{ + return add_completion(zh, xid, COMPLETION_STAT, dc, data, 0, wo, 0); +} + +static int add_strings_completion(zhandle_t *zh, int xid, + strings_completion_t dc, const void *data,watcher_registration_t* wo) +{ + return add_completion(zh, xid, COMPLETION_STRINGLIST, dc, data, 0, wo, 0); +} + +static int add_strings_stat_completion(zhandle_t *zh, int xid, + strings_stat_completion_t dc, const void *data,watcher_registration_t* wo) +{ + return add_completion(zh, xid, COMPLETION_STRINGLIST_STAT, dc, data, 0, wo, 0); +} + +static int add_acl_completion(zhandle_t *zh, int xid, acl_completion_t dc, + const void *data) +{ + return add_completion(zh, xid, COMPLETION_ACLLIST, dc, data, 0, 0, 0); +} + +static int add_void_completion(zhandle_t *zh, int xid, void_completion_t dc, + const void *data) +{ + return add_completion(zh, xid, COMPLETION_VOID, dc, data, 0, 0, 0); +} + +static int add_string_completion(zhandle_t *zh, int xid, + string_completion_t dc, const void *data) +{ + return add_completion(zh, xid, COMPLETION_STRING, dc, data, 0, 0, 0); +} + +static int add_multi_completion(zhandle_t *zh, int xid, void_completion_t dc, + const void *data, completion_head_t *clist) +{ + return add_completion(zh, xid, COMPLETION_MULTI, dc, data, 0,0, clist); +} + +int zookeeper_close(zhandle_t *zh) +{ + int rc=ZOK; + if (zh==0) + return ZBADARGUMENTS; + + zh->close_requested=1; + if (inc_ref_counter(zh,1)>1) { + /* We have incremented the ref counter to prevent the + * completions from calling zookeeper_close before we have + * completed the adaptor_finish call below. */ + + /* Signal any syncronous completions before joining the threads */ + enter_critical(zh); + free_completions(zh,1,ZCLOSING); + leave_critical(zh); + + adaptor_finish(zh); + /* Now we can allow the handle to be cleaned up, if the completion + * threads finished during the adaptor_finish call. */ + api_epilog(zh, 0); + return ZOK; + } + /* No need to decrement the counter since we're just going to + * destroy the handle later. */ + if(zh->state==ZOO_CONNECTED_STATE){ + struct oarchive *oa; + struct RequestHeader h = { STRUCT_INITIALIZER (xid , get_xid()), STRUCT_INITIALIZER (type , ZOO_CLOSE_OP)}; + LOG_INFO(("Closing zookeeper sessionId=%#llx to [%s]\n", + zh->client_id.client_id,format_current_endpoint_info(zh))); + oa = create_buffer_oarchive(); + rc = serialize_RequestHeader(oa, "header", &h); + rc = rc < 0 ? rc : queue_buffer_bytes(&zh->to_send, get_buffer(oa), + get_buffer_len(oa)); + /* We queued the buffer, so don't free it */ + close_buffer_oarchive(&oa, 0); + if (rc < 0) { + rc = ZMARSHALLINGERROR; + goto finish; + } + + /* make sure the close request is sent; we set timeout to an arbitrary + * (but reasonable) number of milliseconds since we want the call to block*/ + rc=adaptor_send_queue(zh, 3000); + }else{ + LOG_INFO(("Freeing zookeeper resources for sessionId=%#llx\n", + zh->client_id.client_id)); + rc = ZOK; + } + +finish: + destroy(zh); + adaptor_destroy(zh); + free(zh); +#ifdef WIN32 + Win32WSACleanup(); +#endif + return rc; +} + +static int isValidPath(const char* path, const int flags) { + int len = 0; + char lastc = '/'; + char c; + int i = 0; + + if (path == 0) + return 0; + len = strlen(path); + if (len == 0) + return 0; + if (path[0] != '/') + return 0; + if (len == 1) // done checking - it's the root + return 1; + if (path[len - 1] == '/' && !(flags & ZOO_SEQUENCE)) + return 0; + + i = 1; + for (; i < len; lastc = path[i], i++) { + c = path[i]; + + if (c == 0) { + return 0; + } else if (c == '/' && lastc == '/') { + return 0; + } else if (c == '.' && lastc == '.') { + if (path[i-2] == '/' && (((i + 1 == len) && !(flags & ZOO_SEQUENCE)) + || path[i+1] == '/')) { + return 0; + } + } else if (c == '.') { + if ((path[i-1] == '/') && (((i + 1 == len) && !(flags & ZOO_SEQUENCE)) + || path[i+1] == '/')) { + return 0; + } + } else if (c > 0x00 && c < 0x1f) { + return 0; + } + } + + return 1; +} + +/*---------------------------------------------------------------------------* + * REQUEST INIT HELPERS + *---------------------------------------------------------------------------*/ +/* Common Request init helper functions to reduce code duplication */ +static int Request_path_init(zhandle_t *zh, int flags, + char **path_out, const char *path) +{ + assert(path_out); + + *path_out = prepend_string(zh, path); + if (zh == NULL || !isValidPath(*path_out, flags)) { + free_duplicate_path(*path_out, path); + return ZBADARGUMENTS; + } + if (is_unrecoverable(zh)) { + free_duplicate_path(*path_out, path); + return ZINVALIDSTATE; + } + + return ZOK; +} + +static int Request_path_watch_init(zhandle_t *zh, int flags, + char **path_out, const char *path, + int32_t *watch_out, uint32_t watch) +{ + int rc = Request_path_init(zh, flags, path_out, path); + if (rc != ZOK) { + return rc; + } + *watch_out = watch; + return ZOK; +} + +/*---------------------------------------------------------------------------* + * ASYNC API + *---------------------------------------------------------------------------*/ +int zoo_aget(zhandle_t *zh, const char *path, int watch, data_completion_t dc, + const void *data) +{ + return zoo_awget(zh,path,watch?zh->watcher:0,zh->context,dc,data); +} + +int zoo_awget(zhandle_t *zh, const char *path, + watcher_fn watcher, void* watcherCtx, + data_completion_t dc, const void *data) +{ + struct oarchive *oa; + char *server_path = prepend_string(zh, path); + struct RequestHeader h = { STRUCT_INITIALIZER (xid , get_xid()), STRUCT_INITIALIZER (type ,ZOO_GETDATA_OP)}; + struct GetDataRequest req = { (char*)server_path, watcher!=0 }; + int rc; + + if (zh==0 || !isValidPath(server_path, 0)) { + free_duplicate_path(server_path, path); + return ZBADARGUMENTS; + } + if (is_unrecoverable(zh)) { + free_duplicate_path(server_path, path); + return ZINVALIDSTATE; + } + oa=create_buffer_oarchive(); + rc = serialize_RequestHeader(oa, "header", &h); + rc = rc < 0 ? rc : serialize_GetDataRequest(oa, "req", &req); + enter_critical(zh); + rc = rc < 0 ? rc : add_data_completion(zh, h.xid, dc, data, + create_watcher_registration(server_path,data_result_checker,watcher,watcherCtx)); + rc = rc < 0 ? rc : queue_buffer_bytes(&zh->to_send, get_buffer(oa), + get_buffer_len(oa)); + leave_critical(zh); + free_duplicate_path(server_path, path); + /* We queued the buffer, so don't free it */ + close_buffer_oarchive(&oa, 0); + + LOG_DEBUG(("Sending request xid=%#x for path [%s] to %s",h.xid,path, + format_current_endpoint_info(zh))); + /* make a best (non-blocking) effort to send the requests asap */ + adaptor_send_queue(zh, 0); + return (rc < 0)?ZMARSHALLINGERROR:ZOK; +} + +static int SetDataRequest_init(zhandle_t *zh, struct SetDataRequest *req, + const char *path, const char *buffer, int buflen, int version) +{ + int rc; + assert(req); + rc = Request_path_init(zh, 0, &req->path, path); + if (rc != ZOK) { + return rc; + } + req->data.buff = (char*)buffer; + req->data.len = buflen; + req->version = version; + + return ZOK; +} + +int zoo_aset(zhandle_t *zh, const char *path, const char *buffer, int buflen, + int version, stat_completion_t dc, const void *data) +{ + struct oarchive *oa; + struct RequestHeader h = { STRUCT_INITIALIZER(xid , get_xid()), STRUCT_INITIALIZER (type , ZOO_SETDATA_OP)}; + struct SetDataRequest req; + int rc = SetDataRequest_init(zh, &req, path, buffer, buflen, version); + if (rc != ZOK) { + return rc; + } + oa = create_buffer_oarchive(); + rc = serialize_RequestHeader(oa, "header", &h); + rc = rc < 0 ? rc : serialize_SetDataRequest(oa, "req", &req); + enter_critical(zh); + rc = rc < 0 ? rc : add_stat_completion(zh, h.xid, dc, data,0); + rc = rc < 0 ? rc : queue_buffer_bytes(&zh->to_send, get_buffer(oa), + get_buffer_len(oa)); + leave_critical(zh); + free_duplicate_path(req.path, path); + /* We queued the buffer, so don't free it */ + close_buffer_oarchive(&oa, 0); + + LOG_DEBUG(("Sending request xid=%#x for path [%s] to %s",h.xid,path, + format_current_endpoint_info(zh))); + /* make a best (non-blocking) effort to send the requests asap */ + adaptor_send_queue(zh, 0); + return (rc < 0)?ZMARSHALLINGERROR:ZOK; +} + +static int CreateRequest_init(zhandle_t *zh, struct CreateRequest *req, + const char *path, const char *value, + int valuelen, const struct ACL_vector *acl_entries, int flags) +{ + int rc; + assert(req); + rc = Request_path_init(zh, flags, &req->path, path); + assert(req); + if (rc != ZOK) { + return rc; + } + req->flags = flags; + req->data.buff = (char*)value; + req->data.len = valuelen; + if (acl_entries == 0) { + req->acl.count = 0; + req->acl.data = 0; + } else { + req->acl = *acl_entries; + } + + return ZOK; +} + +int zoo_acreate(zhandle_t *zh, const char *path, const char *value, + int valuelen, const struct ACL_vector *acl_entries, int flags, + string_completion_t completion, const void *data) +{ + struct oarchive *oa; + struct RequestHeader h = { STRUCT_INITIALIZER (xid , get_xid()), STRUCT_INITIALIZER (type ,ZOO_CREATE_OP) }; + struct CreateRequest req; + + int rc = CreateRequest_init(zh, &req, + path, value, valuelen, acl_entries, flags); + if (rc != ZOK) { + return rc; + } + oa = create_buffer_oarchive(); + rc = serialize_RequestHeader(oa, "header", &h); + rc = rc < 0 ? rc : serialize_CreateRequest(oa, "req", &req); + enter_critical(zh); + rc = rc < 0 ? rc : add_string_completion(zh, h.xid, completion, data); + rc = rc < 0 ? rc : queue_buffer_bytes(&zh->to_send, get_buffer(oa), + get_buffer_len(oa)); + leave_critical(zh); + free_duplicate_path(req.path, path); + /* We queued the buffer, so don't free it */ + close_buffer_oarchive(&oa, 0); + + LOG_DEBUG(("Sending request xid=%#x for path [%s] to %s",h.xid,path, + format_current_endpoint_info(zh))); + /* make a best (non-blocking) effort to send the requests asap */ + adaptor_send_queue(zh, 0); + return (rc < 0)?ZMARSHALLINGERROR:ZOK; +} + +int DeleteRequest_init(zhandle_t *zh, struct DeleteRequest *req, + const char *path, int version) +{ + int rc = Request_path_init(zh, 0, &req->path, path); + if (rc != ZOK) { + return rc; + } + req->version = version; + return ZOK; +} + +int zoo_adelete(zhandle_t *zh, const char *path, int version, + void_completion_t completion, const void *data) +{ + struct oarchive *oa; + struct RequestHeader h = { STRUCT_INITIALIZER (xid , get_xid()), STRUCT_INITIALIZER (type , ZOO_DELETE_OP)}; + struct DeleteRequest req; + int rc = DeleteRequest_init(zh, &req, path, version); + if (rc != ZOK) { + return rc; + } + oa = create_buffer_oarchive(); + rc = serialize_RequestHeader(oa, "header", &h); + rc = rc < 0 ? rc : serialize_DeleteRequest(oa, "req", &req); + enter_critical(zh); + rc = rc < 0 ? rc : add_void_completion(zh, h.xid, completion, data); + rc = rc < 0 ? rc : queue_buffer_bytes(&zh->to_send, get_buffer(oa), + get_buffer_len(oa)); + leave_critical(zh); + free_duplicate_path(req.path, path); + /* We queued the buffer, so don't free it */ + close_buffer_oarchive(&oa, 0); + + LOG_DEBUG(("Sending request xid=%#x for path [%s] to %s",h.xid,path, + format_current_endpoint_info(zh))); + /* make a best (non-blocking) effort to send the requests asap */ + adaptor_send_queue(zh, 0); + return (rc < 0)?ZMARSHALLINGERROR:ZOK; +} + +int zoo_aexists(zhandle_t *zh, const char *path, int watch, + stat_completion_t sc, const void *data) +{ + return zoo_awexists(zh,path,watch?zh->watcher:0,zh->context,sc,data); +} + +int zoo_awexists(zhandle_t *zh, const char *path, + watcher_fn watcher, void* watcherCtx, + stat_completion_t completion, const void *data) +{ + struct oarchive *oa; + struct RequestHeader h = { STRUCT_INITIALIZER (xid ,get_xid()), STRUCT_INITIALIZER (type , ZOO_EXISTS_OP) }; + struct ExistsRequest req; + int rc = Request_path_watch_init(zh, 0, &req.path, path, + &req.watch, watcher != NULL); + if (rc != ZOK) { + return rc; + } + oa = create_buffer_oarchive(); + rc = serialize_RequestHeader(oa, "header", &h); + rc = rc < 0 ? rc : serialize_ExistsRequest(oa, "req", &req); + enter_critical(zh); + rc = rc < 0 ? rc : add_stat_completion(zh, h.xid, completion, data, + create_watcher_registration(req.path,exists_result_checker, + watcher,watcherCtx)); + rc = rc < 0 ? rc : queue_buffer_bytes(&zh->to_send, get_buffer(oa), + get_buffer_len(oa)); + leave_critical(zh); + free_duplicate_path(req.path, path); + /* We queued the buffer, so don't free it */ + close_buffer_oarchive(&oa, 0); + + LOG_DEBUG(("Sending request xid=%#x for path [%s] to %s",h.xid,path, + format_current_endpoint_info(zh))); + /* make a best (non-blocking) effort to send the requests asap */ + adaptor_send_queue(zh, 0); + return (rc < 0)?ZMARSHALLINGERROR:ZOK; +} + +static int zoo_awget_children_(zhandle_t *zh, const char *path, + watcher_fn watcher, void* watcherCtx, + strings_completion_t sc, + const void *data) +{ + struct oarchive *oa; + struct RequestHeader h = { STRUCT_INITIALIZER (xid , get_xid()), STRUCT_INITIALIZER (type , ZOO_GETCHILDREN_OP)}; + struct GetChildrenRequest req ; + int rc = Request_path_watch_init(zh, 0, &req.path, path, + &req.watch, watcher != NULL); + if (rc != ZOK) { + return rc; + } + oa = create_buffer_oarchive(); + rc = serialize_RequestHeader(oa, "header", &h); + rc = rc < 0 ? rc : serialize_GetChildrenRequest(oa, "req", &req); + enter_critical(zh); + rc = rc < 0 ? rc : add_strings_completion(zh, h.xid, sc, data, + create_watcher_registration(req.path,child_result_checker,watcher,watcherCtx)); + rc = rc < 0 ? rc : queue_buffer_bytes(&zh->to_send, get_buffer(oa), + get_buffer_len(oa)); + leave_critical(zh); + free_duplicate_path(req.path, path); + /* We queued the buffer, so don't free it */ + close_buffer_oarchive(&oa, 0); + + LOG_DEBUG(("Sending request xid=%#x for path [%s] to %s",h.xid,path, + format_current_endpoint_info(zh))); + /* make a best (non-blocking) effort to send the requests asap */ + adaptor_send_queue(zh, 0); + return (rc < 0)?ZMARSHALLINGERROR:ZOK; +} + +int zoo_aget_children(zhandle_t *zh, const char *path, int watch, + strings_completion_t dc, const void *data) +{ + return zoo_awget_children_(zh,path,watch?zh->watcher:0,zh->context,dc,data); +} + +int zoo_awget_children(zhandle_t *zh, const char *path, + watcher_fn watcher, void* watcherCtx, + strings_completion_t dc, + const void *data) +{ + return zoo_awget_children_(zh,path,watcher,watcherCtx,dc,data); +} + +static int zoo_awget_children2_(zhandle_t *zh, const char *path, + watcher_fn watcher, void* watcherCtx, + strings_stat_completion_t ssc, + const void *data) +{ + /* invariant: (sc == NULL) != (sc == NULL) */ + struct oarchive *oa; + struct RequestHeader h = { STRUCT_INITIALIZER( xid, get_xid()), STRUCT_INITIALIZER (type ,ZOO_GETCHILDREN2_OP)}; + struct GetChildren2Request req ; + int rc = Request_path_watch_init(zh, 0, &req.path, path, + &req.watch, watcher != NULL); + if (rc != ZOK) { + return rc; + } + oa = create_buffer_oarchive(); + rc = serialize_RequestHeader(oa, "header", &h); + rc = rc < 0 ? rc : serialize_GetChildren2Request(oa, "req", &req); + enter_critical(zh); + rc = rc < 0 ? rc : add_strings_stat_completion(zh, h.xid, ssc, data, + create_watcher_registration(req.path,child_result_checker,watcher,watcherCtx)); + rc = rc < 0 ? rc : queue_buffer_bytes(&zh->to_send, get_buffer(oa), + get_buffer_len(oa)); + leave_critical(zh); + free_duplicate_path(req.path, path); + /* We queued the buffer, so don't free it */ + close_buffer_oarchive(&oa, 0); + + LOG_DEBUG(("Sending request xid=%#x for path [%s] to %s",h.xid,path, + format_current_endpoint_info(zh))); + /* make a best (non-blocking) effort to send the requests asap */ + adaptor_send_queue(zh, 0); + return (rc < 0)?ZMARSHALLINGERROR:ZOK; +} + +int zoo_aget_children2(zhandle_t *zh, const char *path, int watch, + strings_stat_completion_t dc, const void *data) +{ + return zoo_awget_children2_(zh,path,watch?zh->watcher:0,zh->context,dc,data); +} + +int zoo_awget_children2(zhandle_t *zh, const char *path, + watcher_fn watcher, void* watcherCtx, + strings_stat_completion_t dc, + const void *data) +{ + return zoo_awget_children2_(zh,path,watcher,watcherCtx,dc,data); +} + +int zoo_async(zhandle_t *zh, const char *path, + string_completion_t completion, const void *data) +{ + struct oarchive *oa; + struct RequestHeader h = { STRUCT_INITIALIZER (xid , get_xid()), STRUCT_INITIALIZER (type , ZOO_SYNC_OP)}; + struct SyncRequest req; + int rc = Request_path_init(zh, 0, &req.path, path); + if (rc != ZOK) { + return rc; + } + oa = create_buffer_oarchive(); + rc = serialize_RequestHeader(oa, "header", &h); + rc = rc < 0 ? rc : serialize_SyncRequest(oa, "req", &req); + enter_critical(zh); + rc = rc < 0 ? rc : add_string_completion(zh, h.xid, completion, data); + rc = rc < 0 ? rc : queue_buffer_bytes(&zh->to_send, get_buffer(oa), + get_buffer_len(oa)); + leave_critical(zh); + free_duplicate_path(req.path, path); + /* We queued the buffer, so don't free it */ + close_buffer_oarchive(&oa, 0); + + LOG_DEBUG(("Sending request xid=%#x for path [%s] to %s",h.xid,path, + format_current_endpoint_info(zh))); + /* make a best (non-blocking) effort to send the requests asap */ + adaptor_send_queue(zh, 0); + return (rc < 0)?ZMARSHALLINGERROR:ZOK; +} + + +int zoo_aget_acl(zhandle_t *zh, const char *path, acl_completion_t completion, + const void *data) +{ + struct oarchive *oa; + struct RequestHeader h = { STRUCT_INITIALIZER (xid , get_xid()), STRUCT_INITIALIZER(type ,ZOO_GETACL_OP)}; + struct GetACLRequest req; + int rc = Request_path_init(zh, 0, &req.path, path) ; + if (rc != ZOK) { + return rc; + } + oa = create_buffer_oarchive(); + rc = serialize_RequestHeader(oa, "header", &h); + rc = rc < 0 ? rc : serialize_GetACLRequest(oa, "req", &req); + enter_critical(zh); + rc = rc < 0 ? rc : add_acl_completion(zh, h.xid, completion, data); + rc = rc < 0 ? rc : queue_buffer_bytes(&zh->to_send, get_buffer(oa), + get_buffer_len(oa)); + leave_critical(zh); + free_duplicate_path(req.path, path); + /* We queued the buffer, so don't free it */ + close_buffer_oarchive(&oa, 0); + + LOG_DEBUG(("Sending request xid=%#x for path [%s] to %s",h.xid,path, + format_current_endpoint_info(zh))); + /* make a best (non-blocking) effort to send the requests asap */ + adaptor_send_queue(zh, 0); + return (rc < 0)?ZMARSHALLINGERROR:ZOK; +} + +int zoo_aset_acl(zhandle_t *zh, const char *path, int version, + struct ACL_vector *acl, void_completion_t completion, const void *data) +{ + struct oarchive *oa; + struct RequestHeader h = { STRUCT_INITIALIZER(xid ,get_xid()), STRUCT_INITIALIZER (type , ZOO_SETACL_OP)}; + struct SetACLRequest req; + int rc = Request_path_init(zh, 0, &req.path, path); + if (rc != ZOK) { + return rc; + } + oa = create_buffer_oarchive(); + req.acl = *acl; + req.version = version; + rc = serialize_RequestHeader(oa, "header", &h); + rc = rc < 0 ? rc : serialize_SetACLRequest(oa, "req", &req); + enter_critical(zh); + rc = rc < 0 ? rc : add_void_completion(zh, h.xid, completion, data); + rc = rc < 0 ? rc : queue_buffer_bytes(&zh->to_send, get_buffer(oa), + get_buffer_len(oa)); + leave_critical(zh); + free_duplicate_path(req.path, path); + /* We queued the buffer, so don't free it */ + close_buffer_oarchive(&oa, 0); + + LOG_DEBUG(("Sending request xid=%#x for path [%s] to %s",h.xid,path, + format_current_endpoint_info(zh))); + /* make a best (non-blocking) effort to send the requests asap */ + adaptor_send_queue(zh, 0); + return (rc < 0)?ZMARSHALLINGERROR:ZOK; +} + +/* Completions for multi-op results */ +static void op_result_string_completion(int err, const char *value, const void *data) +{ + struct zoo_op_result *result = (struct zoo_op_result *)data; + assert(result); + result->err = err; + + if (result->value && value) { + int len = strlen(value) + 1; + if (len > result->valuelen) { + len = result->valuelen; + } + if (len > 0) { + memcpy(result->value, value, len - 1); + result->value[len - 1] = '\0'; + } + } else { + result->value = NULL; + } +} + +static void op_result_void_completion(int err, const void *data) +{ + struct zoo_op_result *result = (struct zoo_op_result *)data; + assert(result); + result->err = err; +} + +static void op_result_stat_completion(int err, const struct Stat *stat, const void *data) +{ + struct zoo_op_result *result = (struct zoo_op_result *)data; + assert(result); + result->err = err; + + if (result->stat && err == 0 && stat) { + *result->stat = *stat; + } else { + result->stat = NULL ; + } +} + +static int CheckVersionRequest_init(zhandle_t *zh, struct CheckVersionRequest *req, + const char *path, int version) +{ + int rc ; + assert(req); + rc = Request_path_init(zh, 0, &req->path, path); + if (rc != ZOK) { + return rc; + } + req->version = version; + + return ZOK; +} + +int zoo_amulti(zhandle_t *zh, int count, const zoo_op_t *ops, + zoo_op_result_t *results, void_completion_t completion, const void *data) +{ + struct RequestHeader h = { STRUCT_INITIALIZER(xid, get_xid()), STRUCT_INITIALIZER(type, ZOO_MULTI_OP) }; + struct MultiHeader mh = { STRUCT_INITIALIZER(type, -1), STRUCT_INITIALIZER(done, 1), STRUCT_INITIALIZER(err, -1) }; + struct oarchive *oa = create_buffer_oarchive(); + completion_head_t clist = { 0 }; + + int rc = serialize_RequestHeader(oa, "header", &h); + + int index = 0; + for (index=0; index < count; index++) { + const zoo_op_t *op = ops+index; + zoo_op_result_t *result = results+index; + completion_list_t *entry = NULL; + + struct MultiHeader mh = { STRUCT_INITIALIZER(type, op->type), STRUCT_INITIALIZER(done, 0), STRUCT_INITIALIZER(err, -1) }; + rc = rc < 0 ? rc : serialize_MultiHeader(oa, "multiheader", &mh); + + switch(op->type) { + case ZOO_CREATE_OP: { + struct CreateRequest req; + + rc = rc < 0 ? rc : CreateRequest_init(zh, &req, + op->create_op.path, op->create_op.data, + op->create_op.datalen, op->create_op.acl, + op->create_op.flags); + rc = rc < 0 ? rc : serialize_CreateRequest(oa, "req", &req); + result->value = op->create_op.buf; + result->valuelen = op->create_op.buflen; + + enter_critical(zh); + entry = create_completion_entry(h.xid, COMPLETION_STRING, op_result_string_completion, result, 0, 0); + leave_critical(zh); + free_duplicate_path(req.path, op->create_op.path); + break; + } + + case ZOO_DELETE_OP: { + struct DeleteRequest req; + rc = rc < 0 ? rc : DeleteRequest_init(zh, &req, op->delete_op.path, op->delete_op.version); + rc = rc < 0 ? rc : serialize_DeleteRequest(oa, "req", &req); + + enter_critical(zh); + entry = create_completion_entry(h.xid, COMPLETION_VOID, op_result_void_completion, result, 0, 0); + leave_critical(zh); + free_duplicate_path(req.path, op->delete_op.path); + break; + } + + case ZOO_SETDATA_OP: { + struct SetDataRequest req; + rc = rc < 0 ? rc : SetDataRequest_init(zh, &req, + op->set_op.path, op->set_op.data, + op->set_op.datalen, op->set_op.version); + rc = rc < 0 ? rc : serialize_SetDataRequest(oa, "req", &req); + result->stat = op->set_op.stat; + + enter_critical(zh); + entry = create_completion_entry(h.xid, COMPLETION_STAT, op_result_stat_completion, result, 0, 0); + leave_critical(zh); + free_duplicate_path(req.path, op->set_op.path); + break; + } + + case ZOO_CHECK_OP: { + struct CheckVersionRequest req; + rc = rc < 0 ? rc : CheckVersionRequest_init(zh, &req, + op->check_op.path, op->check_op.version); + rc = rc < 0 ? rc : serialize_CheckVersionRequest(oa, "req", &req); + + enter_critical(zh); + entry = create_completion_entry(h.xid, COMPLETION_VOID, op_result_void_completion, result, 0, 0); + leave_critical(zh); + free_duplicate_path(req.path, op->check_op.path); + break; + } + + default: + LOG_ERROR(("Unimplemented sub-op type=%d in multi-op", op->type)); + return ZUNIMPLEMENTED; + } + + queue_completion(&clist, entry, 0); + } + + rc = rc < 0 ? rc : serialize_MultiHeader(oa, "multiheader", &mh); + + /* BEGIN: CRTICIAL SECTION */ + enter_critical(zh); + rc = rc < 0 ? rc : add_multi_completion(zh, h.xid, completion, data, &clist); + rc = rc < 0 ? rc : queue_buffer_bytes(&zh->to_send, get_buffer(oa), + get_buffer_len(oa)); + leave_critical(zh); + + /* We queued the buffer, so don't free it */ + close_buffer_oarchive(&oa, 0); + + LOG_DEBUG(("Sending multi request xid=%#x with %d subrequests to %s", + h.xid, index, format_current_endpoint_info(zh))); + /* make a best (non-blocking) effort to send the requests asap */ + adaptor_send_queue(zh, 0); + + return (rc < 0) ? ZMARSHALLINGERROR : ZOK; +} + +void zoo_create_op_init(zoo_op_t *op, const char *path, const char *value, + int valuelen, const struct ACL_vector *acl, int flags, + char *path_buffer, int path_buffer_len) +{ + assert(op); + op->type = ZOO_CREATE_OP; + op->create_op.path = path; + op->create_op.data = value; + op->create_op.datalen = valuelen; + op->create_op.acl = acl; + op->create_op.flags = flags; + op->create_op.buf = path_buffer; + op->create_op.buflen = path_buffer_len; +} + +void zoo_delete_op_init(zoo_op_t *op, const char *path, int version) +{ + assert(op); + op->type = ZOO_DELETE_OP; + op->delete_op.path = path; + op->delete_op.version = version; +} + +void zoo_set_op_init(zoo_op_t *op, const char *path, const char *buffer, + int buflen, int version, struct Stat *stat) +{ + assert(op); + op->type = ZOO_SETDATA_OP; + op->set_op.path = path; + op->set_op.data = buffer; + op->set_op.datalen = buflen; + op->set_op.version = version; + op->set_op.stat = stat; +} + +void zoo_check_op_init(zoo_op_t *op, const char *path, int version) +{ + assert(op); + op->type = ZOO_CHECK_OP; + op->check_op.path = path; + op->check_op.version = version; +} + +int zoo_multi(zhandle_t *zh, int count, const zoo_op_t *ops, zoo_op_result_t *results) +{ + int rc; + + struct sync_completion *sc = alloc_sync_completion(); + if (!sc) { + return ZSYSTEMERROR; + } + + rc = zoo_amulti(zh, count, ops, results, SYNCHRONOUS_MARKER, sc); + if (rc == ZOK) { + wait_sync_completion(sc); + rc = sc->rc; + } + free_sync_completion(sc); + + return rc; +} + +/* specify timeout of 0 to make the function non-blocking */ +/* timeout is in milliseconds */ +int flush_send_queue(zhandle_t*zh, int timeout) +{ + int rc= ZOK; + struct timeval started; +#ifdef WIN32 + fd_set pollSet; + struct timeval wait; +#endif + gettimeofday(&started,0); + // we can't use dequeue_buffer() here because if (non-blocking) send_buffer() + // returns EWOULDBLOCK we'd have to put the buffer back on the queue. + // we use a recursive lock instead and only dequeue the buffer if a send was + // successful + lock_buffer_list(&zh->to_send); + while (zh->to_send.head != 0&& zh->state == ZOO_CONNECTED_STATE) { + if(timeout!=0){ + int elapsed; + struct timeval now; + gettimeofday(&now,0); + elapsed=calculate_interval(&started,&now); + if (elapsed>timeout) { + rc = ZOPERATIONTIMEOUT; + break; + } + +#ifdef WIN32 + wait = get_timeval(timeout-elapsed); + FD_ZERO(&pollSet); + FD_SET(zh->fd, &pollSet); + // Poll the socket + rc = select((int)(zh->fd)+1, NULL, &pollSet, NULL, &wait); +#else + struct pollfd fds; + fds.fd = zh->fd; + fds.events = POLLOUT; + fds.revents = 0; + rc = poll(&fds, 1, timeout-elapsed); +#endif + if (rc<=0) { + /* timed out or an error or POLLERR */ + rc = rc==0 ? ZOPERATIONTIMEOUT : ZSYSTEMERROR; + break; + } + } + + rc = send_buffer(zh->fd, zh->to_send.head); + if(rc==0 && timeout==0){ + /* send_buffer would block while sending this buffer */ + rc = ZOK; + break; + } + if (rc < 0) { + rc = ZCONNECTIONLOSS; + break; + } + // if the buffer has been sent successfully, remove it from the queue + if (rc > 0) + remove_buffer(&zh->to_send); + gettimeofday(&zh->last_send, 0); + rc = ZOK; + } + unlock_buffer_list(&zh->to_send); + return rc; +} + +const char* zerror(int c) +{ + switch (c){ + case ZOK: + return "ok"; + case ZSYSTEMERROR: + return "system error"; + case ZRUNTIMEINCONSISTENCY: + return "run time inconsistency"; + case ZDATAINCONSISTENCY: + return "data inconsistency"; + case ZCONNECTIONLOSS: + return "connection loss"; + case ZMARSHALLINGERROR: + return "marshalling error"; + case ZUNIMPLEMENTED: + return "unimplemented"; + case ZOPERATIONTIMEOUT: + return "operation timeout"; + case ZBADARGUMENTS: + return "bad arguments"; + case ZINVALIDSTATE: + return "invalid zhandle state"; + case ZAPIERROR: + return "api error"; + case ZNONODE: + return "no node"; + case ZNOAUTH: + return "not authenticated"; + case ZBADVERSION: + return "bad version"; + case ZNOCHILDRENFOREPHEMERALS: + return "no children for ephemerals"; + case ZNODEEXISTS: + return "node exists"; + case ZNOTEMPTY: + return "not empty"; + case ZSESSIONEXPIRED: + return "session expired"; + case ZINVALIDCALLBACK: + return "invalid callback"; + case ZINVALIDACL: + return "invalid acl"; + case ZAUTHFAILED: + return "authentication failed"; + case ZCLOSING: + return "zookeeper is closing"; + case ZNOTHING: + return "(not error) no server responses to process"; + case ZSESSIONMOVED: + return "session moved to another server, so operation is ignored"; + } + if (c > 0) { + return strerror(c); + } + return "unknown error"; +} + +int zoo_add_auth(zhandle_t *zh,const char* scheme,const char* cert, + int certLen,void_completion_t completion, const void *data) +{ + struct buffer auth; + auth_info *authinfo; + if(scheme==NULL || zh==NULL) + return ZBADARGUMENTS; + + if (is_unrecoverable(zh)) + return ZINVALIDSTATE; + + // [ZOOKEEPER-800] zoo_add_auth should return ZINVALIDSTATE if + // the connection is closed. + if (zoo_state(zh) == 0) { + return ZINVALIDSTATE; + } + + if(cert!=NULL && certLen!=0){ + auth.buff=calloc(1,certLen); + if(auth.buff==0) { + return ZSYSTEMERROR; + } + memcpy(auth.buff,cert,certLen); + auth.len=certLen; + } else { + auth.buff = 0; + auth.len = 0; + } + + zoo_lock_auth(zh); + authinfo = (auth_info*) malloc(sizeof(auth_info)); + authinfo->scheme=strdup(scheme); + authinfo->auth=auth; + authinfo->completion=completion; + authinfo->data=data; + authinfo->next = NULL; + add_last_auth(&zh->auth_h, authinfo); + zoo_unlock_auth(zh); + + if(zh->state == ZOO_CONNECTED_STATE || zh->state == ZOO_ASSOCIATING_STATE) + return send_last_auth_info(zh); + + return ZOK; +} + +static const char* format_endpoint_info(const struct sockaddr_storage* ep) +{ + static char buf[128]; + char addrstr[128]; + void *inaddr; +#ifdef WIN32 + char * addrstring; +#endif + int port; + if(ep==0) + return "null"; + +#if defined(AF_INET6) + if(ep->ss_family==AF_INET6){ + inaddr=&((struct sockaddr_in6*)ep)->sin6_addr; + port=((struct sockaddr_in6*)ep)->sin6_port; + } else { +#endif + inaddr=&((struct sockaddr_in*)ep)->sin_addr; + port=((struct sockaddr_in*)ep)->sin_port; +#if defined(AF_INET6) + } +#endif +#ifdef WIN32 + addrstring = inet_ntoa (*(struct in_addr*)inaddr); + sprintf(buf,"%s:%d",addrstring,ntohs(port)); +#else + inet_ntop(ep->ss_family,inaddr,addrstr,sizeof(addrstr)-1); + sprintf(buf,"%s:%d",addrstr,ntohs(port)); +#endif + return buf; +} + +static const char* format_current_endpoint_info(zhandle_t* zh) +{ + return format_endpoint_info(&zh->addrs[zh->connect_index]); +} + +void zoo_deterministic_conn_order(int yesOrNo) +{ + disable_conn_permute=yesOrNo; +} + +/*---------------------------------------------------------------------------* + * SYNC API + *---------------------------------------------------------------------------*/ +int zoo_create(zhandle_t *zh, const char *path, const char *value, + int valuelen, const struct ACL_vector *acl, int flags, + char *path_buffer, int path_buffer_len) +{ + struct sync_completion *sc = alloc_sync_completion(); + int rc; + if (!sc) { + return ZSYSTEMERROR; + } + sc->u.str.str = path_buffer; + sc->u.str.str_len = path_buffer_len; + rc=zoo_acreate(zh, path, value, valuelen, acl, flags, SYNCHRONOUS_MARKER, sc); + if(rc==ZOK){ + wait_sync_completion(sc); + rc = sc->rc; + } + free_sync_completion(sc); + return rc; +} + +int zoo_delete(zhandle_t *zh, const char *path, int version) +{ + struct sync_completion *sc = alloc_sync_completion(); + int rc; + if (!sc) { + return ZSYSTEMERROR; + } + rc=zoo_adelete(zh, path, version, SYNCHRONOUS_MARKER, sc); + if(rc==ZOK){ + wait_sync_completion(sc); + rc = sc->rc; + } + free_sync_completion(sc); + return rc; +} + +int zoo_exists(zhandle_t *zh, const char *path, int watch, struct Stat *stat) +{ + return zoo_wexists(zh,path,watch?zh->watcher:0,zh->context,stat); +} + +int zoo_wexists(zhandle_t *zh, const char *path, + watcher_fn watcher, void* watcherCtx, struct Stat *stat) +{ + struct sync_completion *sc = alloc_sync_completion(); + int rc; + if (!sc) { + return ZSYSTEMERROR; + } + rc=zoo_awexists(zh,path,watcher,watcherCtx,SYNCHRONOUS_MARKER, sc); + if(rc==ZOK){ + wait_sync_completion(sc); + rc = sc->rc; + if (rc == 0&& stat) { + *stat = sc->u.stat; + } + } + free_sync_completion(sc); + return rc; +} + +int zoo_get(zhandle_t *zh, const char *path, int watch, char *buffer, + int* buffer_len, struct Stat *stat) +{ + return zoo_wget(zh,path,watch?zh->watcher:0,zh->context, + buffer,buffer_len,stat); +} + +int zoo_wget(zhandle_t *zh, const char *path, + watcher_fn watcher, void* watcherCtx, + char *buffer, int* buffer_len, struct Stat *stat) +{ + struct sync_completion *sc; + int rc=0; + + if(buffer_len==NULL) + return ZBADARGUMENTS; + if((sc=alloc_sync_completion())==NULL) + return ZSYSTEMERROR; + + sc->u.data.buffer = buffer; + sc->u.data.buff_len = *buffer_len; + rc=zoo_awget(zh, path, watcher, watcherCtx, SYNCHRONOUS_MARKER, sc); + if(rc==ZOK){ + wait_sync_completion(sc); + rc = sc->rc; + if (rc == 0) { + if(stat) + *stat = sc->u.data.stat; + *buffer_len = sc->u.data.buff_len; + } + } + free_sync_completion(sc); + return rc; +} + +int zoo_set(zhandle_t *zh, const char *path, const char *buffer, int buflen, + int version) +{ + return zoo_set2(zh, path, buffer, buflen, version, 0); +} + +int zoo_set2(zhandle_t *zh, const char *path, const char *buffer, int buflen, + int version, struct Stat *stat) +{ + struct sync_completion *sc = alloc_sync_completion(); + int rc; + if (!sc) { + return ZSYSTEMERROR; + } + rc=zoo_aset(zh, path, buffer, buflen, version, SYNCHRONOUS_MARKER, sc); + if(rc==ZOK){ + wait_sync_completion(sc); + rc = sc->rc; + if (rc == 0 && stat) { + *stat = sc->u.stat; + } + } + free_sync_completion(sc); + return rc; +} + +static int zoo_wget_children_(zhandle_t *zh, const char *path, + watcher_fn watcher, void* watcherCtx, + struct String_vector *strings) +{ + struct sync_completion *sc = alloc_sync_completion(); + int rc; + if (!sc) { + return ZSYSTEMERROR; + } + rc= zoo_awget_children (zh, path, watcher, watcherCtx, SYNCHRONOUS_MARKER, sc); + if(rc==ZOK){ + wait_sync_completion(sc); + rc = sc->rc; + if (rc == 0) { + if (strings) { + *strings = sc->u.strs2; + } else { + deallocate_String_vector(&sc->u.strs2); + } + } + } + free_sync_completion(sc); + return rc; +} + +static int zoo_wget_children2_(zhandle_t *zh, const char *path, + watcher_fn watcher, void* watcherCtx, + struct String_vector *strings, struct Stat *stat) +{ + struct sync_completion *sc = alloc_sync_completion(); + int rc; + if (!sc) { + return ZSYSTEMERROR; + } + rc= zoo_awget_children2(zh, path, watcher, watcherCtx, SYNCHRONOUS_MARKER, sc); + + if(rc==ZOK){ + wait_sync_completion(sc); + rc = sc->rc; + if (rc == 0) { + *stat = sc->u.strs_stat.stat2; + if (strings) { + *strings = sc->u.strs_stat.strs2; + } else { + deallocate_String_vector(&sc->u.strs_stat.strs2); + } + } + } + free_sync_completion(sc); + return rc; +} + +int zoo_get_children(zhandle_t *zh, const char *path, int watch, + struct String_vector *strings) +{ + return zoo_wget_children_(zh,path,watch?zh->watcher:0,zh->context,strings); +} + +int zoo_wget_children(zhandle_t *zh, const char *path, + watcher_fn watcher, void* watcherCtx, + struct String_vector *strings) +{ + return zoo_wget_children_(zh,path,watcher,watcherCtx,strings); +} + +int zoo_get_children2(zhandle_t *zh, const char *path, int watch, + struct String_vector *strings, struct Stat *stat) +{ + return zoo_wget_children2_(zh,path,watch?zh->watcher:0,zh->context,strings,stat); +} + +int zoo_wget_children2(zhandle_t *zh, const char *path, + watcher_fn watcher, void* watcherCtx, + struct String_vector *strings, struct Stat *stat) +{ + return zoo_wget_children2_(zh,path,watcher,watcherCtx,strings,stat); +} + +int zoo_get_acl(zhandle_t *zh, const char *path, struct ACL_vector *acl, + struct Stat *stat) +{ + struct sync_completion *sc = alloc_sync_completion(); + int rc; + if (!sc) { + return ZSYSTEMERROR; + } + rc=zoo_aget_acl(zh, path, SYNCHRONOUS_MARKER, sc); + if(rc==ZOK){ + wait_sync_completion(sc); + rc = sc->rc; + if (rc == 0&& stat) { + *stat = sc->u.acl.stat; + } + if (rc == 0) { + if (acl) { + *acl = sc->u.acl.acl; + } else { + deallocate_ACL_vector(&sc->u.acl.acl); + } + } + } + free_sync_completion(sc); + return rc; +} + +int zoo_set_acl(zhandle_t *zh, const char *path, int version, + const struct ACL_vector *acl) +{ + struct sync_completion *sc = alloc_sync_completion(); + int rc; + if (!sc) { + return ZSYSTEMERROR; + } + rc=zoo_aset_acl(zh, path, version, (struct ACL_vector*)acl, + SYNCHRONOUS_MARKER, sc); + if(rc==ZOK){ + wait_sync_completion(sc); + rc = sc->rc; + } + free_sync_completion(sc); + return rc; +} diff --git a/pkg/registry/zookeeper-3.4.6/src/c/tests/CollectionUtil.h b/pkg/registry/zookeeper-3.4.6/src/c/tests/CollectionUtil.h new file mode 100644 index 000000000..dd3481175 --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/c/tests/CollectionUtil.h @@ -0,0 +1,195 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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. + */ +#ifndef _COLLECTION_UTIL_H_ +#define _COLLECTION_UTIL_H_ + +/** + * \file + * CollectionBuilder and DictionaryBuilder classes and collection utility functions + */ + +namespace Util +{ + +// ********************************************************* +/** A shortcut to use for building collections. + * This class is a wrapper around standard STL collection containers such as vector. + * It allows one to conveniently build collections at the variable initialization time: + * \code + * #include "CollectionUtil.h" + * #include "Vector.h" // for ostream << operator overload for STL vector + * using Util; + * + * int main() + * { + * typedef vector MyVector; + * MyVector myVector=CollectionBuilder()("str1")("str2")("str3"); + * cout< +class CollectionBuilder +{ +public: + /// Type of the collection container. + typedef CONT CollectionType; + /// Container's value type. + typedef typename CollectionType::value_type value_type; + /// Container's constant iterator type. + typedef typename CollectionType::const_iterator const_iterator; + /// Container's size type. + typedef typename CollectionType::size_type size_type; + + /** Operator function call overload to allow call chaining. + * \param value the value to be inserted into the container + */ + CollectionBuilder& operator()(const value_type& value){ + return push_back(value); + } + /** Same as regular STL push_back() but allows call chaining. + * \param value the value to be inserted into the container + */ + CollectionBuilder& push_back(const value_type& value){ + collection_.push_back(value); + return *this; + } + /// \name Standard STL container interface + /// @{ + const_iterator begin() const{return collection_.begin();} + const_iterator end() const{return collection_.end();} + size_type size() const{return collection_.size();} + void clear() {collection_.clear();} + ///@} + /// Explicit typecast operator. + operator const CollectionType&() const {return collection_;} +private: + /// \cond PRIVATE + CollectionType collection_; + /// \endcond +}; + + +// ********************************************************* +/** A shortcut to use for building dictionaries. + * This class is a wrapper around standard STL associative containers such as map. + * It allows one to conveniently build dictionaries at the variable initialization time: + * \code + * #include "CollectionUtil.h" + * #include "Map.h" // for ostream << operator overload for STL map + * using Util; + * + * int main() + * { + * typedef map MyMap; + * MyMap myMap=DictionaryBuilder()("str1",1)("str2",2)("str3",3); + * cout< +class DictionaryBuilder +{ +public: + /// The type of the associative container + typedef CONT DictionaryType; + /// Container's element type (usually a pair) + typedef typename DictionaryType::value_type value_type; + /// Container's key type + typedef typename DictionaryType::key_type key_type; + /// Container's value type + typedef typename DictionaryType::mapped_type mapped_type; + /// Container's constant iterator type + typedef typename DictionaryType::const_iterator const_iterator; + /// Container's writable iterator type + typedef typename DictionaryType::iterator iterator; + /// Container's size type + typedef typename DictionaryType::size_type size_type; + + /** Operator function call overload to allow call chaining. + * \param key the value key to be inserted + * \param value the value to be inserted into the container + * \return a non-const reference to self + */ + DictionaryBuilder& operator()(const key_type& key,const mapped_type& value){ + dict_.insert(value_type(key,value)); + return *this; + } + /** Lookup value by key. + * \param key the key associated with the value. + * \return a non-const iterator pointing to the element whose key matched the \a key parameter + */ + iterator find(const key_type& key){ + return dict_.find(key); + } + /** Lookup value by key. + * \param key the key associated with the value. + * \return a const iterator pointing to the element whose key matched the \a key parameter + */ + const_iterator find(const key_type& key) const{ + return dict_.find(key); + } + + /// \name Standard STL container interface + /// @{ + const_iterator begin() const{return dict_.begin();} + const_iterator end() const{return dict_.end();} + size_type size() const{return dict_.size();} + void clear() {dict_.clear();} + ///@} + /// Explicit typecast operator. + operator const DictionaryType&() const {return dict_;} +private: + DictionaryType dict_; +}; + + +// *********************************************************** +/** Deletes all dynamically allocated elements of a collection. + * C::value_type is expected to be a pointer to a dynamically allocated object, or it won't compile. + * The function will iterate over all container elements and call delete for each of them. + * \param c a collection (vector,set) whose elements are being deleted. + */ +template +void clearCollection(C& c){ + for(typename C::const_iterator it=c.begin();it!=c.end();++it) + delete *it; + c.clear(); +} + +/** Deletes all dynamically allocated values of the assotiative container. + * The function expects the M::value_type to be a pair<..., ptr_to_type>, or it won't compile. + * It first deletes the objects pointed to by ptr_to_type + * and then clears (calls m.clear()) the container. + * \param m an associative container (map,hash_map) whose elements are being deleted. + */ +template +void clearMap(M& m){ + for(typename M::const_iterator it=m.begin();it!=m.end();++it) + delete it->second; + m.clear(); +} + +} // namespace Util + + +#endif // _COLLECTION_UTIL_H_ diff --git a/pkg/registry/zookeeper-3.4.6/src/c/tests/CppAssertHelper.h b/pkg/registry/zookeeper-3.4.6/src/c/tests/CppAssertHelper.h new file mode 100644 index 000000000..3926f51ef --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/c/tests/CppAssertHelper.h @@ -0,0 +1,37 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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. + */ + +#ifndef CPPASSERTHELPER_H_ +#define CPPASSERTHELPER_H_ + +#include + +// make it possible to specify location of the ASSERT call +#define CPPUNIT_ASSERT_EQUAL_LOC(expected,actual,file,line) \ + ( CPPUNIT_NS::assertEquals( (expected), \ + (actual), \ + CPPUNIT_NS::SourceLine(file,line), \ + "" ) ) + +#define CPPUNIT_ASSERT_EQUAL_MESSAGE_LOC(message,expected,actual,file,line) \ + ( CPPUNIT_NS::assertEquals( (expected), \ + (actual), \ + CPPUNIT_NS::SourceLine(file,line), \ + (message) ) ) + +#endif /*CPPASSERTHELPER_H_*/ diff --git a/pkg/registry/zookeeper-3.4.6/src/c/tests/LibCMocks.cc b/pkg/registry/zookeeper-3.4.6/src/c/tests/LibCMocks.cc new file mode 100644 index 000000000..44ab0a9ad --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/c/tests/LibCMocks.cc @@ -0,0 +1,333 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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. + */ + +#include +#include +#include +#include + +#include "Util.h" +#include "LibCMocks.h" + +#undef USING_DUMA + +using namespace std; + +// ***************************************************************************** +// gethostbyname + +struct hostent* gethostbyname(const char *name) { + if(!Mock_gethostbyname::mock_) + return LIBC_SYMBOLS.gethostbyname(name); + return Mock_gethostbyname::mock_->call(name); +} + +Mock_gethostbyname* Mock_gethostbyname::mock_=0; + +Mock_gethostbyname::~Mock_gethostbyname(){ + mock_=0; + for(unsigned int i=0;icall(p1,p2); +} +#endif + +void* Mock_calloc::call(size_t p1, size_t p2){ +#ifndef USING_DUMA + if(counter++ ==callsBeforeFailure){ + counter=0; + errno=errnoOnFailure; + return 0; + } + return CALL_REAL(calloc,(p1,p2)); +#else + return 0; +#endif +} + +Mock_calloc* Mock_calloc::mock_=0; + +// ***************************************************************************** +// realloc + +#ifndef USING_DUMA +void* realloc(void* p, size_t s){ + if(!Mock_realloc::mock_) + return LIBC_SYMBOLS.realloc(p,s); + return Mock_realloc::mock_->call(p,s); +} +#endif + +Mock_realloc* Mock_realloc::mock_=0; + +void* Mock_realloc::call(void* p, size_t s){ + if(counter++ ==callsBeforeFailure){ + counter=0; + errno=errnoOnFailure; + return 0; + } + return LIBC_SYMBOLS.realloc(p,s); +} + +// ***************************************************************************** +// random +RANDOM_RET_TYPE random(){ + if(!Mock_random::mock_) + return LIBC_SYMBOLS.random(); + return Mock_random::mock_->call(); +} + +void srandom(unsigned long seed){ + if (!Mock_random::mock_) + LIBC_SYMBOLS.srandom(seed); + else + Mock_random::mock_->setSeed(seed); +} + +Mock_random* Mock_random::mock_=0; + +int Mock_random::call(){ + assert("Must specify one or more random integers"&&(randomReturns.size()!=0)); + return randomReturns[currentIdx++ % randomReturns.size()]; +} + +// ***************************************************************************** +// free +#ifndef USING_DUMA +DECLARE_WRAPPER(void,free,(void* p)){ + if(Mock_free_noop::mock_ && !Mock_free_noop::mock_->nested) + Mock_free_noop::mock_->call(p); + else + CALL_REAL(free,(p)); +} +#endif + +void Mock_free_noop::call(void* p){ + // on cygwin libc++ is linked statically + // push_back() may call free(), hence the nesting guards + synchronized(mx); + nested++; + callCounter++; + requested.push_back(p); + nested--; +} +void Mock_free_noop::freeRequested(){ +#ifndef USING_DUMA + synchronized(mx); + for(unsigned i=0; icallSocket(domain,type,protocol); +} + +int close(int fd){ + if (!Mock_socket::mock_) + return LIBC_SYMBOLS.close(fd); + return Mock_socket::mock_->callClose(fd); +} + +int getsockopt(int s,int level,int optname,void *optval,socklen_t *optlen){ + if (!Mock_socket::mock_) + return LIBC_SYMBOLS.getsockopt(s,level,optname,optval,optlen); + return Mock_socket::mock_->callGet(s,level,optname,optval,optlen); +} + +int setsockopt(int s,int level,int optname,const void *optval,socklen_t optlen){ + if (!Mock_socket::mock_) + return LIBC_SYMBOLS.setsockopt(s,level,optname,optval,optlen); + return Mock_socket::mock_->callSet(s,level,optname,optval,optlen); +} +int connect(int s,const struct sockaddr *addr,socklen_t len){ + if (!Mock_socket::mock_) + return LIBC_SYMBOLS.connect(s,addr,len); + return Mock_socket::mock_->callConnect(s,addr,len); +} +ssize_t send(int s,const void *buf,size_t len,int flags){ + if (!Mock_socket::mock_) + return LIBC_SYMBOLS.send(s,buf,len,flags); + return Mock_socket::mock_->callSend(s,buf,len,flags); +} + +ssize_t recv(int s,void *buf,size_t len,int flags){ + if (!Mock_socket::mock_) + return LIBC_SYMBOLS.recv(s,buf,len,flags); + return Mock_socket::mock_->callRecv(s,buf,len,flags); +} + +Mock_socket* Mock_socket::mock_=0; + +// ***************************************************************************** +// fcntl +extern "C" int fcntl(int fd,int cmd,...){ + va_list va; + va_start(va,cmd); + void* arg = va_arg(va, void *); + va_end (va); + if (!Mock_fcntl::mock_) + return LIBC_SYMBOLS.fcntl(fd,cmd,arg); + return Mock_fcntl::mock_->call(fd,cmd,arg); +} + +Mock_fcntl* Mock_fcntl::mock_=0; + +// ***************************************************************************** +// select +int select(int nfds,fd_set *rfds,fd_set *wfds,fd_set *efds,struct timeval *timeout){ + if (!Mock_select::mock_) + return LIBC_SYMBOLS.select(nfds,rfds,wfds,efds,timeout); + return Mock_select::mock_->call(nfds,rfds,wfds,efds,timeout); +} + +Mock_select* Mock_select::mock_=0; + +// ***************************************************************************** +// poll +Mock_poll* Mock_poll::mock_=0; +int poll(struct pollfd *fds, POLL_NFDS_TYPE nfds, int timeout){ + if (!Mock_poll::mock_) + return LIBC_SYMBOLS.poll(fds,nfds,timeout); + return Mock_poll::mock_->call(fds,nfds,timeout); + +} + +/* + * Recent gcc with -O2 and glibc FORTIFY feature may cause our poll + * mock to be ignored. + */ +#if __USE_FORTIFY_LEVEL > 0 +int __poll_chk (struct pollfd *__fds, nfds_t __nfds, int __timeout, + __SIZE_TYPE__ __fdslen) { + return poll(__fds, __nfds, __timeout); +} +#endif + +// ***************************************************************************** +// gettimeofday +int gettimeofday(struct timeval *tp, GETTIMEOFDAY_ARG2_TYPE tzp){ + if (!Mock_gettimeofday::mock_) + return LIBC_SYMBOLS.gettimeofday(tp,tzp); + return Mock_gettimeofday::mock_->call(tp,tzp); +} + +Mock_gettimeofday* Mock_gettimeofday::mock_=0; + diff --git a/pkg/registry/zookeeper-3.4.6/src/c/tests/LibCMocks.h b/pkg/registry/zookeeper-3.4.6/src/c/tests/LibCMocks.h new file mode 100644 index 000000000..5b07cdae9 --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/c/tests/LibCMocks.h @@ -0,0 +1,408 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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. + */ + +#ifndef LIBCMOCKS_H_ +#define LIBCMOCKS_H_ + +#include +#include +#include + +#include +#include + +#include "MocksBase.h" +#include "LibCSymTable.h" +#include "ThreadingUtil.h" + +// ***************************************************************************** +// gethostbyname + +class Mock_gethostbyname: public Mock +{ +public: + struct HostEntry: public hostent { + HostEntry(const char* hostName,short addrtype); + ~HostEntry(); + HostEntry& addAlias(const char* alias); + HostEntry& addAddress(const char* addr4); + }; + + Mock_gethostbyname():current(0){mock_=this;} + virtual ~Mock_gethostbyname(); + HostEntry& addHostEntry(const char* hostName,short addrtype=AF_INET); + virtual hostent* call(const char* name); + + typedef std::vector HostEntryCollection; + HostEntryCollection gethostbynameReturns; + int current; + static Mock_gethostbyname* mock_; +}; + +class MockFailed_gethostbyname: public Mock_gethostbyname +{ +public: + MockFailed_gethostbyname():h_errnoReturn(HOST_NOT_FOUND) {} + + int h_errnoReturn; + virtual hostent* call(const char* name) { + h_errno=h_errnoReturn; + return 0; + } +}; + +// ***************************************************************************** +// calloc + +class Mock_calloc: public Mock +{ +public: + Mock_calloc():errnoOnFailure(ENOMEM),callsBeforeFailure(-1),counter(0) { + mock_=this; + } + virtual ~Mock_calloc() {mock_=0;} + + int errnoOnFailure; + int callsBeforeFailure; + int counter; + virtual void* call(size_t p1, size_t p2); + + static Mock_calloc* mock_; +}; + +// ***************************************************************************** +// realloc + +class Mock_realloc: public Mock +{ +public: + Mock_realloc():errnoOnFailure(ENOMEM),callsBeforeFailure(-1),counter(0) { + mock_=this; + } + virtual ~Mock_realloc() {mock_=0;} + + int errnoOnFailure; + int callsBeforeFailure; + int counter; + virtual void* call(void* p, size_t s); + + static Mock_realloc* mock_; +}; + +// ***************************************************************************** +// random + +class Mock_random: public Mock +{ +public: + Mock_random():currentIdx(0) {mock_=this;} + virtual ~Mock_random() {mock_=0;} + + int currentIdx; + std::vector randomReturns; + virtual int call(); + void setSeed(unsigned long){currentIdx=0;} + + static Mock_random* mock_; +}; + +// ***************************************************************************** +// no-op free; keeps track of all deallocation requests +class Mock_free_noop: public Mock +{ + Mutex mx; + std::vector requested; +public: + Mock_free_noop():nested(0),callCounter(0){mock_=this;} + virtual ~Mock_free_noop(){ + mock_=0; + freeRequested(); + } + + int nested; + int callCounter; + virtual void call(void* p); + void freeRequested(); + void disable(){mock_=0;} + // returns number of times the pointer was freed + int getFreeCount(void*); + bool isFreed(void*); + + static Mock_free_noop* mock_; +}; + +// ***************************************************************************** +// socket and related system calls + +class Mock_socket: public Mock +{ +public: + static const int FD=63; + Mock_socket():socketReturns(FD),closeReturns(0),getsocketoptReturns(0), + optvalSO_ERROR(0), + setsockoptReturns(0),connectReturns(0),connectErrno(0), + sendErrno(0),recvErrno(0) + { + mock_=this; + } + virtual ~Mock_socket(){mock_=0;} + + int socketReturns; + virtual int callSocket(int domain, int type, int protocol){ + return socketReturns; + } + int closeReturns; + virtual int callClose(int fd){ + return closeReturns; + } + int getsocketoptReturns; + int optvalSO_ERROR; + virtual int callGet(int s,int level,int optname,void *optval,socklen_t *len){ + if(level==SOL_SOCKET && optname==SO_ERROR){ + setSO_ERROR(optval,*len); + } + return getsocketoptReturns; + } + virtual void setSO_ERROR(void *optval,socklen_t len){ + memcpy(optval,&optvalSO_ERROR,len); + } + + int setsockoptReturns; + virtual int callSet(int s,int level,int optname,const void *optval,socklen_t len){ + return setsockoptReturns; + } + int connectReturns; + int connectErrno; + virtual int callConnect(int s,const struct sockaddr *addr,socklen_t len){ + errno=connectErrno; + return connectReturns; + } + + virtual void notifyBufferSent(const std::string& buffer){} + + int sendErrno; + std::string sendBuffer; + virtual ssize_t callSend(int s,const void *buf,size_t len,int flags){ + if(sendErrno!=0){ + errno=sendErrno; + return -1; + } + // first call to send() is always the length of the buffer to follow + bool sendingLength=sendBuffer.size()==0; + // overwrite the length bytes + sendBuffer.assign((const char*)buf,len); + if(!sendingLength){ + notifyBufferSent(sendBuffer); + sendBuffer.erase(); + } + return len; + } + + int recvErrno; + std::string recvReturnBuffer; + virtual ssize_t callRecv(int s,void *buf,size_t len,int flags){ + if(recvErrno!=0){ + errno=recvErrno; + return -1; + } + int k=std::min(len,recvReturnBuffer.length()); + if(k==0) + return 0; + memcpy(buf,recvReturnBuffer.data(),k); + recvReturnBuffer.erase(0,k); + return k; + } + virtual bool hasMoreRecv() const{ + return recvReturnBuffer.size()!=0; + } + static Mock_socket* mock_; +}; + +// ***************************************************************************** +// fcntl +class Mock_fcntl: public Mock +{ +public: + Mock_fcntl():callReturns(0),trapFD(-1){mock_=this;} + ~Mock_fcntl(){mock_=0;} + + int callReturns; + int trapFD; + virtual int call(int fd, int cmd, void* arg){ + if(trapFD==-1) + return LIBC_SYMBOLS.fcntl(fd,cmd,arg); + return callReturns; + } + + static Mock_fcntl* mock_; +}; + +// ***************************************************************************** +// select +class Mock_select: public Mock +{ +public: + Mock_select(Mock_socket* s,int fd):sock(s), + callReturns(0),myFD(fd),timeout(50) + { + mock_=this; + } + ~Mock_select(){mock_=0;} + + Mock_socket* sock; + int callReturns; + int myFD; + int timeout; //in millis + virtual int call(int nfds,fd_set *rfds,fd_set *wfds,fd_set *efds,struct timeval *tv){ + bool isWritableRequested=(wfds && FD_ISSET(myFD,wfds)); + if(rfds) FD_CLR(myFD,rfds); + if(wfds) FD_CLR(myFD,wfds); + // this timeout is only to prevent a tight loop + timeval myTimeout={0,0}; + if(!isWritableRequested && !isFDReadable()){ + myTimeout.tv_sec=timeout/1000; + myTimeout.tv_usec=(timeout%1000)*1000; + } + LIBC_SYMBOLS.select(nfds,rfds,wfds,efds,&myTimeout); + // myFD is always writable + if(isWritableRequested) FD_SET(myFD,wfds); + // myFD is only readable if the socket has anything to read + if(isFDReadable() && rfds) FD_SET(myFD,rfds); + return callReturns; + } + + virtual bool isFDReadable() const { + return sock->hasMoreRecv(); + } + + static Mock_select* mock_; +}; + +// ***************************************************************************** +// poll +// the last element of the pollfd array is expected to be test FD +class Mock_poll: public Mock +{ +public: + Mock_poll(Mock_socket* s,int fd):sock(s), + callReturns(1),myFD(fd),timeout(50) + { + mock_=this; + } + ~Mock_poll(){mock_=0;} + + Mock_socket* sock; + int callReturns; + int myFD; + int timeout; //in millis + virtual int call(struct pollfd *fds, POLL_NFDS_TYPE nfds, int to) { + pollfd* myPoll=0; + if(fds[nfds-1].fd==myFD) + myPoll=&fds[nfds-1]; + bool isWritableRequested=false; + if(myPoll!=0){ + isWritableRequested=myPoll->events&POLLOUT; + nfds--; + } + LIBC_SYMBOLS.poll(fds,nfds,(!isWritableRequested&&!isFDReadable())?timeout:0); + if(myPoll!=0){ + // myFD is always writable if requested + myPoll->revents=isWritableRequested?POLLOUT:0; + // myFD is only readable if the socket has anything to read + myPoll->revents|=isFDReadable()?POLLIN:0; + } + return callReturns; + } + + virtual bool isFDReadable() const { + return sock->hasMoreRecv(); + } + + static Mock_poll* mock_; +}; + +// ***************************************************************************** +// gettimeofday +class Mock_gettimeofday: public Mock +{ +public: + Mock_gettimeofday(){ + LIBC_SYMBOLS.gettimeofday(&tv,0); + mock_=this; + } + Mock_gettimeofday(const Mock_gettimeofday& other):tv(other.tv){} + Mock_gettimeofday(int32_t sec,int32_t usec){ + tv.tv_sec=sec; + tv.tv_usec=usec; + } + ~Mock_gettimeofday(){mock_=0;} + + timeval tv; + virtual int call(struct timeval *tp, GETTIMEOFDAY_ARG2_TYPE tzp){ + *tp=tv; + return 0; + } + operator timeval() const{ + return tv; + } + // advance secs + virtual void tick(int howmuch=1){tv.tv_sec+=howmuch;} + // advance milliseconds + // can move the clock forward as well as backward by providing a negative + // number + virtual void millitick(int howmuch=1){ + int ms=tv.tv_usec/1000+howmuch; + tv.tv_sec+=ms/1000; + // going backward? + if(ms<0){ + ms=1000-(-ms%1000); //wrap millis around + } + tv.tv_usec=(ms%1000)*1000; + } + virtual void tick(const timeval& howmuch){ + // add milliseconds (discarding microsecond portion) + long ms=tv.tv_usec/1000+howmuch.tv_usec/1000; + tv.tv_sec+=howmuch.tv_sec+ms/1000; + tv.tv_usec=(ms%1000)*1000; + } + static Mock_gettimeofday* mock_; +}; + +// discard microseconds! +inline bool operator==(const timeval& lhs, const timeval& rhs){ + return rhs.tv_sec==lhs.tv_sec && rhs.tv_usec/1000==lhs.tv_usec/1000; +} + +// simplistic implementation: no normalization, assume lhs >= rhs, +// discarding microseconds +inline timeval operator-(const timeval& lhs, const timeval& rhs){ + timeval res; + res.tv_sec=lhs.tv_sec-rhs.tv_sec; + res.tv_usec=(lhs.tv_usec/1000-rhs.tv_usec/1000)*1000; + if(res.tv_usec<0){ + res.tv_sec--; + res.tv_usec=1000000+res.tv_usec%1000000; // wrap the millis around + } + return res; +} + +inline int32_t toMilliseconds(const timeval& tv){ + return tv.tv_sec*1000+tv.tv_usec/1000; +} + +#endif /*LIBCMOCKS_H_*/ diff --git a/pkg/registry/zookeeper-3.4.6/src/c/tests/LibCSymTable.cc b/pkg/registry/zookeeper-3.4.6/src/c/tests/LibCSymTable.cc new file mode 100644 index 000000000..53785796a --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/c/tests/LibCSymTable.cc @@ -0,0 +1,83 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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. + */ + +#include "LibCSymTable.h" + +#define LOAD_SYM(sym) \ + sym=(sym##_sig)dlsym(handle,#sym); \ + assert("Unable to load "#sym" from libc"&&sym) + + +LibCSymTable& LibCSymTable::instance(){ + static LibCSymTable tbl; + return tbl; +} + +//****************************************************************************** +// preload original libc symbols +LibCSymTable::LibCSymTable() +{ + void* handle=getHandle(); + LOAD_SYM(gethostbyname); + LOAD_SYM(calloc); + LOAD_SYM(realloc); + LOAD_SYM(free); + LOAD_SYM(random); + LOAD_SYM(srandom); + LOAD_SYM(printf); + LOAD_SYM(socket); + LOAD_SYM(close); + LOAD_SYM(getsockopt); + LOAD_SYM(setsockopt); + LOAD_SYM(fcntl); + LOAD_SYM(connect); + LOAD_SYM(send); + LOAD_SYM(recv); + LOAD_SYM(select); + LOAD_SYM(poll); + LOAD_SYM(gettimeofday); +#ifdef THREADED + LOAD_SYM(pthread_create); + LOAD_SYM(pthread_detach); + LOAD_SYM(pthread_cond_broadcast); + LOAD_SYM(pthread_cond_destroy); + LOAD_SYM(pthread_cond_init); + LOAD_SYM(pthread_cond_signal); + LOAD_SYM(pthread_cond_timedwait); + LOAD_SYM(pthread_cond_wait); + LOAD_SYM(pthread_join); + LOAD_SYM(pthread_mutex_destroy); + LOAD_SYM(pthread_mutex_init); + LOAD_SYM(pthread_mutex_lock); + LOAD_SYM(pthread_mutex_trylock); + LOAD_SYM(pthread_mutex_unlock); +#endif +} + +void* LibCSymTable::getHandle(){ + static void* handle=0; + if(!handle){ +#ifdef __CYGWIN__ + handle=dlopen("cygwin1.dll",RTLD_LAZY); + assert("Unable to dlopen global sym table"&&handle); +#else + handle=RTLD_NEXT; +#endif + } + return handle; +} diff --git a/pkg/registry/zookeeper-3.4.6/src/c/tests/LibCSymTable.h b/pkg/registry/zookeeper-3.4.6/src/c/tests/LibCSymTable.h new file mode 100644 index 000000000..2f7e0c291 --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/c/tests/LibCSymTable.h @@ -0,0 +1,107 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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. + */ + +#ifndef LIBCSYMTABLE_H_ +#define LIBCSYMTABLE_H_ + +#include +#include +#include +#include +#include +#include +#include + +#ifdef THREADED +#include +#endif + +#include "config.h" + +// TODO: move all these macros to config.h (generated by autoconf) +#ifdef __CYGWIN__ +#if (CYGWIN_VERSION_DLL_MAJOR < 1007) +#define RANDOM_RET_TYPE int +#else +#define RANDOM_RET_TYPE long int +#endif +#define GETTIMEOFDAY_ARG2_TYPE void* +#else +#define RANDOM_RET_TYPE long int +#define GETTIMEOFDAY_ARG2_TYPE struct timezone* +#endif + +#define DECLARE_SYM(ret,sym,sig) \ + typedef ret (*sym##_sig)sig; \ + static sym##_sig preload_##sym () { \ + static sym##_sig ptr=0;\ + if(!ptr){ void* h=getHandle(); ptr=(sym##_sig)dlsym(h,#sym); } \ + assert("Unable to load "#sym" from libc"&&ptr); \ + return ptr; \ + } \ + sym##_sig sym + +#define LIBC_SYMBOLS LibCSymTable::instance() + +//****************************************************************************** +// preload original libc symbols +struct LibCSymTable +{ + DECLARE_SYM(hostent*,gethostbyname,(const char*)); + DECLARE_SYM(void*,calloc,(size_t, size_t)); + DECLARE_SYM(void*,realloc,(void*, size_t)); + DECLARE_SYM(void,free,(void*)); + DECLARE_SYM(RANDOM_RET_TYPE,random,(void)); + DECLARE_SYM(void,srandom,(unsigned long)); + DECLARE_SYM(int,printf,(const char*, ...)); + DECLARE_SYM(int,socket,(int,int,int)); + DECLARE_SYM(int,close,(int)); + DECLARE_SYM(int,getsockopt,(int,int,int,void*,socklen_t*)); + DECLARE_SYM(int,setsockopt,(int,int,int,const void*,socklen_t)); + DECLARE_SYM(int,fcntl,(int,int,...)); + DECLARE_SYM(int,connect,(int,const struct sockaddr*,socklen_t)); + DECLARE_SYM(ssize_t,send,(int,const void*,size_t,int)); + DECLARE_SYM(ssize_t,recv,(int,const void*,size_t,int)); + DECLARE_SYM(int,select,(int,fd_set*,fd_set*,fd_set*,struct timeval*)); + DECLARE_SYM(int,poll,(struct pollfd*,POLL_NFDS_TYPE,int)); + DECLARE_SYM(int,gettimeofday,(struct timeval*,GETTIMEOFDAY_ARG2_TYPE)); +#ifdef THREADED + DECLARE_SYM(int,pthread_create,(pthread_t *, const pthread_attr_t *, + void *(*)(void *), void *)); + DECLARE_SYM(int,pthread_detach,(pthread_t)); + DECLARE_SYM(int,pthread_cond_broadcast,(pthread_cond_t *)); + DECLARE_SYM(int,pthread_cond_destroy,(pthread_cond_t *)); + DECLARE_SYM(int,pthread_cond_init,(pthread_cond_t *, const pthread_condattr_t *)); + DECLARE_SYM(int,pthread_cond_signal,(pthread_cond_t *)); + DECLARE_SYM(int,pthread_cond_timedwait,(pthread_cond_t *, + pthread_mutex_t *, const struct timespec *)); + DECLARE_SYM(int,pthread_cond_wait,(pthread_cond_t *, pthread_mutex_t *)); + DECLARE_SYM(int,pthread_join,(pthread_t, void **)); + DECLARE_SYM(int,pthread_mutex_destroy,(pthread_mutex_t *)); + DECLARE_SYM(int,pthread_mutex_init,(pthread_mutex_t *, const pthread_mutexattr_t *)); + DECLARE_SYM(int,pthread_mutex_lock,(pthread_mutex_t *)); + DECLARE_SYM(int,pthread_mutex_trylock,(pthread_mutex_t *)); + DECLARE_SYM(int,pthread_mutex_unlock,(pthread_mutex_t *)); +#endif + LibCSymTable(); + + static void* getHandle(); + static LibCSymTable& instance(); +}; + +#endif /*LIBCSYMTABLE_H_*/ diff --git a/pkg/registry/zookeeper-3.4.6/src/c/tests/MocksBase.cc b/pkg/registry/zookeeper-3.4.6/src/c/tests/MocksBase.cc new file mode 100644 index 000000000..60b2c75f2 --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/c/tests/MocksBase.cc @@ -0,0 +1,36 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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. + */ + +#include +#include + +#include "MocksBase.h" +#include "LibCSymTable.h" + +// ***************************************************************************** +// Mock base +void* Mock::operator new(std::size_t s){ + void* p=malloc(s); + if(!p) + throw std::bad_alloc(); + return p; +} + +void Mock::operator delete(void* p){ + LIBC_SYMBOLS.free(p); +} diff --git a/pkg/registry/zookeeper-3.4.6/src/c/tests/MocksBase.h b/pkg/registry/zookeeper-3.4.6/src/c/tests/MocksBase.h new file mode 100644 index 000000000..5b54251ec --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/c/tests/MocksBase.h @@ -0,0 +1,36 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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. + */ + +#ifndef MOCKSBASE_H_ +#define MOCKSBASE_H_ + +#include + +// ***************************************************************************** +// Mock base + +class Mock +{ +public: + virtual ~Mock(){} + + static void* operator new(std::size_t s); + static void operator delete(void* p); +}; + +#endif /*MOCKSBASE_H_*/ diff --git a/pkg/registry/zookeeper-3.4.6/src/c/tests/PthreadMocks.cc b/pkg/registry/zookeeper-3.4.6/src/c/tests/PthreadMocks.cc new file mode 100644 index 000000000..490cebf33 --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/c/tests/PthreadMocks.cc @@ -0,0 +1,106 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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. + */ + +#include "PthreadMocks.h" + +MockPthreadsBase* MockPthreadsBase::mock_=0; + +#undef USING_DUMA + +#ifndef USING_DUMA +int pthread_cond_broadcast (pthread_cond_t *c){ + if(!MockPthreadsBase::mock_) + return LIBC_SYMBOLS.pthread_cond_broadcast(c); + return MockPthreadsBase::mock_->pthread_cond_broadcast(c); +} +int pthread_cond_destroy (pthread_cond_t *c){ + if(!MockPthreadsBase::mock_) + return LIBC_SYMBOLS.pthread_cond_destroy(c); + return MockPthreadsBase::mock_->pthread_cond_destroy(c); +} +int pthread_cond_init (pthread_cond_t *c, const pthread_condattr_t *a){ + if(!MockPthreadsBase::mock_) + return LIBC_SYMBOLS.pthread_cond_init(c,a); + return MockPthreadsBase::mock_->pthread_cond_init(c,a); +} +int pthread_cond_signal (pthread_cond_t *c){ + if(!MockPthreadsBase::mock_) + return LIBC_SYMBOLS.pthread_cond_signal(c); + return MockPthreadsBase::mock_->pthread_cond_signal(c); +} +int pthread_cond_timedwait (pthread_cond_t *c, + pthread_mutex_t *m, const struct timespec *t){ + if(!MockPthreadsBase::mock_) + return LIBC_SYMBOLS.pthread_cond_timedwait(c,m,t); + return MockPthreadsBase::mock_->pthread_cond_timedwait(c,m,t); +} +int pthread_cond_wait (pthread_cond_t *c, pthread_mutex_t *m){ + if(!MockPthreadsBase::mock_) + return LIBC_SYMBOLS.pthread_cond_wait(c,m); + return MockPthreadsBase::mock_->pthread_cond_wait(c,m); +} +int pthread_create (pthread_t *t, const pthread_attr_t *a, + void *(*f)(void *), void *d){ + if(!MockPthreadsBase::mock_) + return LIBC_SYMBOLS.pthread_create(t,a,f,d); + return MockPthreadsBase::mock_->pthread_create(t,a,f,d); +} +int pthread_detach(pthread_t t){ + if(!MockPthreadsBase::mock_) + return LIBC_SYMBOLS.pthread_detach(t); + return MockPthreadsBase::mock_->pthread_detach(t); +} +int pthread_join (pthread_t t, void **r){ + if(!MockPthreadsBase::mock_) + return LIBC_SYMBOLS.pthread_join(t,r); + return MockPthreadsBase::mock_->pthread_join(t,r); +} +int pthread_mutex_destroy (pthread_mutex_t *m){ + if(!MockPthreadsBase::mock_) + return LIBC_SYMBOLS.pthread_mutex_destroy(m); + return MockPthreadsBase::mock_->pthread_mutex_destroy(m); +} +int pthread_mutex_init (pthread_mutex_t *m, const pthread_mutexattr_t *a){ + if(!MockPthreadsBase::mock_) + return LIBC_SYMBOLS.pthread_mutex_init(m,a); + return MockPthreadsBase::mock_->pthread_mutex_init(m,a); +} + +DECLARE_WRAPPER(int,pthread_mutex_lock,(pthread_mutex_t *m)){ + if(!MockPthreadsBase::mock_) + return CALL_REAL(pthread_mutex_lock,(m)); + return MockPthreadsBase::mock_->pthread_mutex_lock(m); +} + +int pthread_mutex_trylock (pthread_mutex_t *m){ + if(!MockPthreadsBase::mock_) + return LIBC_SYMBOLS.pthread_mutex_trylock(m); + return MockPthreadsBase::mock_->pthread_mutex_trylock(m); +} + +DECLARE_WRAPPER(int,pthread_mutex_unlock,(pthread_mutex_t *m)){ + if(!MockPthreadsBase::mock_) + return CALL_REAL(pthread_mutex_unlock,(m)); + return MockPthreadsBase::mock_->pthread_mutex_unlock(m); +} +#endif + +CheckedPthread::ThreadMap CheckedPthread::tmap_; +CheckedPthread::MutexMap CheckedPthread::mmap_; +CheckedPthread::CVMap CheckedPthread::cvmap_; +Mutex CheckedPthread::mx; diff --git a/pkg/registry/zookeeper-3.4.6/src/c/tests/PthreadMocks.h b/pkg/registry/zookeeper-3.4.6/src/c/tests/PthreadMocks.h new file mode 100644 index 000000000..8db881501 --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/c/tests/PthreadMocks.h @@ -0,0 +1,449 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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. + */ + +#ifndef PTHREADMOCKS_H_ +#define PTHREADMOCKS_H_ + +#include +#include +#include + +#include "src/zk_adaptor.h" + +#include "Util.h" +#include "MocksBase.h" +#include "LibCSymTable.h" +#include "ThreadingUtil.h" + +// an ABC for pthreads +class MockPthreadsBase: public Mock +{ +public: + MockPthreadsBase(){mock_=this;} + virtual ~MockPthreadsBase(){mock_=0;} + + virtual int pthread_create(pthread_t * t, const pthread_attr_t *a, + void *(*f)(void *), void *d) =0; + virtual int pthread_join(pthread_t t, void ** r) =0; + virtual int pthread_detach(pthread_t t) =0; + virtual int pthread_cond_broadcast(pthread_cond_t *c) =0; + virtual int pthread_cond_destroy(pthread_cond_t *c) =0; + virtual int pthread_cond_init(pthread_cond_t *c, const pthread_condattr_t *a) =0; + virtual int pthread_cond_signal(pthread_cond_t *c) =0; + virtual int pthread_cond_timedwait(pthread_cond_t *c, + pthread_mutex_t *m, const struct timespec *t) =0; + virtual int pthread_cond_wait(pthread_cond_t *c, pthread_mutex_t *m) =0; + virtual int pthread_mutex_destroy(pthread_mutex_t *m) =0; + virtual int pthread_mutex_init(pthread_mutex_t *m, const pthread_mutexattr_t *a) =0; + virtual int pthread_mutex_lock(pthread_mutex_t *m) =0; + virtual int pthread_mutex_trylock(pthread_mutex_t *m) =0; + virtual int pthread_mutex_unlock(pthread_mutex_t *m) =0; + + static MockPthreadsBase* mock_; +}; + +// all pthread functions simply return an error code +// and increment their invocation counter. No actual threads are spawned. +class MockPthreadsNull: public MockPthreadsBase +{ +public: + MockPthreadsNull(): + pthread_createReturns(0),pthread_createCounter(0), + pthread_joinReturns(0),pthread_joinCounter(0),pthread_joinResultReturn(0), + pthread_detachReturns(0),pthread_detachCounter(0), + pthread_cond_broadcastReturns(0),pthread_cond_broadcastCounter(0), + pthread_cond_destroyReturns(0),pthread_cond_destroyCounter(0), + pthread_cond_initReturns(0),pthread_cond_initCounter(0), + pthread_cond_signalReturns(0),pthread_cond_signalCounter(0), + pthread_cond_timedwaitReturns(0),pthread_cond_timedwaitCounter(0), + pthread_cond_waitReturns(0),pthread_cond_waitCounter(0), + pthread_mutex_destroyReturns(0),pthread_mutex_destroyCounter(0), + pthread_mutex_initReturns(0),pthread_mutex_initCounter(0), + pthread_mutex_lockReturns(0),pthread_mutex_lockCounter(0), + pthread_mutex_trylockReturns(0),pthread_mutex_trylockCounter(0), + pthread_mutex_unlockReturns(0),pthread_mutex_unlockCounter(0) + { + memset(threads,0,sizeof(threads)); + } + + short threads[512]; + + int pthread_createReturns; + int pthread_createCounter; + virtual int pthread_create(pthread_t * t, const pthread_attr_t *a, + void *(*f)(void *), void *d){ + char* p=(char*)&threads[pthread_createCounter++]; + p[0]='i'; // mark as created + *t=(pthread_t)p; + return pthread_createReturns; + } + int pthread_joinReturns; + int pthread_joinCounter; + void* pthread_joinResultReturn; + virtual int pthread_join(pthread_t t, void ** r){ + pthread_joinCounter++; + if(r!=0) + *r=pthread_joinResultReturn; + char* p=(char*)t; + p[0]='x';p[1]+=1; + return pthread_joinReturns; + } + int pthread_detachReturns; + int pthread_detachCounter; + virtual int pthread_detach(pthread_t t){ + pthread_detachCounter++; + char* p=(char*)t; + p[0]='x';p[1]+=1; + return pthread_detachReturns; + } + + template + static bool isInitialized(const T& t){ + return ((char*)t)[0]=='i'; + } + template + static bool isDestroyed(const T& t){ + return ((char*)t)[0]=='x'; + } + template + static int getDestroyCounter(const T& t){ + return ((char*)t)[1]; + } + template + static int getInvalidAccessCounter(const T& t){ + return ((char*)t)[2]; + } + int pthread_cond_broadcastReturns; + int pthread_cond_broadcastCounter; + virtual int pthread_cond_broadcast(pthread_cond_t *c){ + pthread_cond_broadcastCounter++; + if(isDestroyed(c))((char*)c)[2]++; + return pthread_cond_broadcastReturns; + } + int pthread_cond_destroyReturns; + int pthread_cond_destroyCounter; + virtual int pthread_cond_destroy(pthread_cond_t *c){ + pthread_cond_destroyCounter++; + char* p=(char*)c; + p[0]='x';p[1]+=1; + return pthread_cond_destroyReturns; + } + int pthread_cond_initReturns; + int pthread_cond_initCounter; + virtual int pthread_cond_init(pthread_cond_t *c, const pthread_condattr_t *a){ + pthread_cond_initCounter++; + char* p=(char*)c; + p[0]='i'; // mark as created + p[1]=0; // destruction counter + p[2]=0; // access after destruction counter + return pthread_cond_initReturns; + } + int pthread_cond_signalReturns; + int pthread_cond_signalCounter; + virtual int pthread_cond_signal(pthread_cond_t *c){ + pthread_cond_signalCounter++; + if(isDestroyed(c))((char*)c)[2]++; + return pthread_cond_signalReturns; + } + int pthread_cond_timedwaitReturns; + int pthread_cond_timedwaitCounter; + virtual int pthread_cond_timedwait(pthread_cond_t *c, + pthread_mutex_t *m, const struct timespec *t){ + pthread_cond_timedwaitCounter++; + if(isDestroyed(c))((char*)c)[2]++; + return pthread_cond_timedwaitReturns; + } + int pthread_cond_waitReturns; + int pthread_cond_waitCounter; + virtual int pthread_cond_wait(pthread_cond_t *c, pthread_mutex_t *m){ + pthread_cond_waitCounter++; + if(isDestroyed(c))((char*)c)[2]++; + return pthread_cond_waitReturns; + } + int pthread_mutex_destroyReturns; + int pthread_mutex_destroyCounter; + virtual int pthread_mutex_destroy(pthread_mutex_t *m){ + pthread_mutex_destroyCounter++; + char* p=(char*)m; + p[0]='x';p[1]+=1; + return pthread_mutex_destroyReturns; + } + int pthread_mutex_initReturns; + int pthread_mutex_initCounter; + virtual int pthread_mutex_init(pthread_mutex_t *m, const pthread_mutexattr_t *a){ + pthread_mutex_initCounter++; + char* p=(char*)m; + p[0]='i'; // mark as created + p[1]=0; // destruction counter + p[2]=0; // access after destruction counter + return pthread_mutex_initReturns; + } + int pthread_mutex_lockReturns; + int pthread_mutex_lockCounter; + virtual int pthread_mutex_lock(pthread_mutex_t *m){ + pthread_mutex_lockCounter++; + if(isDestroyed(m))((char*)m)[2]++; + return pthread_mutex_lockReturns; + } + int pthread_mutex_trylockReturns; + int pthread_mutex_trylockCounter; + virtual int pthread_mutex_trylock(pthread_mutex_t *m){ + pthread_mutex_trylockCounter++; + if(isDestroyed(m))((char*)m)[2]++; + return pthread_mutex_trylockReturns; + } + int pthread_mutex_unlockReturns; + int pthread_mutex_unlockCounter; + virtual int pthread_mutex_unlock(pthread_mutex_t *m){ + pthread_mutex_unlockCounter++; + if(isDestroyed(m))((char*)m)[2]++; + return pthread_mutex_unlockReturns; + } +}; + +// simulates the way zookeeper threads make use of api_prolog/epilog and +// +class MockPthreadZKNull: public MockPthreadsNull +{ + typedef std::map Map; + Map map_; +public: + virtual int pthread_create(pthread_t * t, const pthread_attr_t *a, + void *(*f)(void *), void *d){ + int ret=MockPthreadsNull::pthread_create(t,a,f,d); + zhandle_t* zh=(zhandle_t*)d; + adaptor_threads* ad=(adaptor_threads*)zh->adaptor_priv; + api_prolog(zh); + ad->threadsToWait--; + putValue(map_,*t,zh); + return ret; + } + virtual int pthread_join(pthread_t t, void ** r){ + zhandle_t* zh=0; + if(getValue(map_,t,zh)) + api_epilog(zh,0); + return MockPthreadsNull::pthread_join(t,r); + } +}; + +struct ThreadInfo{ + typedef enum {RUNNING,TERMINATED} ThreadState; + + ThreadInfo(): + destructionCounter_(0),invalidAccessCounter_(0),state_(RUNNING) + { + } + + ThreadInfo& incDestroyed() { + destructionCounter_++; + return *this; + } + ThreadInfo& incInvalidAccess(){ + invalidAccessCounter_++; + return *this; + } + ThreadInfo& setTerminated(){ + state_=TERMINATED; + return *this; + } + int destructionCounter_; + int invalidAccessCounter_; + ThreadState state_; +}; + +class CheckedPthread: public MockPthreadsBase +{ + // first => destruction counter + // second => invalid access counter + //typedef std::pair Entry; + typedef ThreadInfo Entry; + typedef std::map ThreadMap; + static ThreadMap tmap_; + static ThreadMap& getMap(const TypeOp::BareT&){return tmap_;} + typedef std::map MutexMap; + static MutexMap mmap_; + static MutexMap& getMap(const TypeOp::BareT&){return mmap_;} + typedef std::map CVMap; + static CVMap cvmap_; + static CVMap& getMap(const TypeOp::BareT&){return cvmap_;} + + static Mutex mx; + + template + static void markDestroyed(T& t){ + typedef typename TypeOp::BareT Type; + Entry e; + synchronized(mx); + if(getValue(getMap(Type()),t,e)){ + putValue(getMap(Type()),t,Entry(e).incDestroyed()); + }else{ + putValue(getMap(Type()),t,Entry().incDestroyed()); + } + } + template + static void markCreated(T& t){ + typedef typename TypeOp::BareT Type; + Entry e; + synchronized(mx); + if(!getValue(getMap(Type()),t,e)) + putValue(getMap(Type()),t,Entry()); + } + template + static void checkAccessed(T& t){ + typedef typename TypeOp::BareT Type; + Entry e; + synchronized(mx); + if(getValue(getMap(Type()),t,e) && e.destructionCounter_>0) + putValue(getMap(Type()),t,Entry(e).incInvalidAccess()); + } + static void setTerminated(pthread_t t){ + Entry e; + synchronized(mx); + if(getValue(tmap_,t,e)) + putValue(tmap_,t,Entry(e).setTerminated()); + } +public: + bool verbose; + CheckedPthread():verbose(false){ + tmap_.clear(); + mmap_.clear(); + cvmap_.clear(); + mx.release(); + } + template + static bool isInitialized(const T& t){ + typedef typename TypeOp::BareT Type; + Entry e; + synchronized(mx); + return getValue(getMap(Type()),t,e) && e.destructionCounter_==0; + } + template + static bool isDestroyed(const T& t){ + typedef typename TypeOp::BareT Type; + Entry e; + synchronized(mx); + return getValue(getMap(Type()),t,e) && e.destructionCounter_>0; + } + static bool isTerminated(pthread_t t){ + Entry e; + synchronized(mx); + return getValue(tmap_,t,e) && e.state_==ThreadInfo::TERMINATED; + } + template + static int getDestroyCounter(const T& t){ + typedef typename TypeOp::BareT Type; + Entry e; + synchronized(mx); + return getValue(getMap(Type()),t,e)?e.destructionCounter_:-1; + } + template + static int getInvalidAccessCounter(const T& t){ + typedef typename TypeOp::BareT Type; + Entry e; + synchronized(mx); + return getValue(getMap(Type()),t,e)?e.invalidAccessCounter_:-1; + } + + struct ThreadContext{ + typedef void *(*ThreadFunc)(void *); + + ThreadContext(ThreadFunc func,void* param):func_(func),param_(param){} + ThreadFunc func_; + void* param_; + }; + static void* threadFuncWrapper(void* v){ + ThreadContext* ctx=(ThreadContext*)v; + pthread_t t=pthread_self(); + markCreated(t); + void* res=ctx->func_(ctx->param_); + setTerminated(pthread_self()); + delete ctx; + return res; + } + virtual int pthread_create(pthread_t * t, const pthread_attr_t *a, + void *(*f)(void *), void *d) + { + int ret=LIBC_SYMBOLS.pthread_create(t,a,threadFuncWrapper, + new ThreadContext(f,d)); + if(verbose) + TEST_TRACE(("thread created %p",*t)); + return ret; + } + virtual int pthread_join(pthread_t t, void ** r){ + if(verbose) TEST_TRACE(("thread joined %p",t)); + int ret=LIBC_SYMBOLS.pthread_join(t,r); + if(ret==0) + markDestroyed(t); + return ret; + } + virtual int pthread_detach(pthread_t t){ + if(verbose) TEST_TRACE(("thread detached %p",t)); + int ret=LIBC_SYMBOLS.pthread_detach(t); + if(ret==0) + markDestroyed(t); + return ret; + } + virtual int pthread_cond_broadcast(pthread_cond_t *c){ + checkAccessed(c); + return LIBC_SYMBOLS.pthread_cond_broadcast(c); + } + virtual int pthread_cond_destroy(pthread_cond_t *c){ + markDestroyed(c); + return LIBC_SYMBOLS.pthread_cond_destroy(c); + } + virtual int pthread_cond_init(pthread_cond_t *c, const pthread_condattr_t *a){ + markCreated(c); + return LIBC_SYMBOLS.pthread_cond_init(c,a); + } + virtual int pthread_cond_signal(pthread_cond_t *c){ + checkAccessed(c); + return LIBC_SYMBOLS.pthread_cond_signal(c); + } + virtual int pthread_cond_timedwait(pthread_cond_t *c, + pthread_mutex_t *m, const struct timespec *t){ + checkAccessed(c); + return LIBC_SYMBOLS.pthread_cond_timedwait(c,m,t); + } + virtual int pthread_cond_wait(pthread_cond_t *c, pthread_mutex_t *m){ + checkAccessed(c); + return LIBC_SYMBOLS.pthread_cond_wait(c,m); + } + virtual int pthread_mutex_destroy(pthread_mutex_t *m){ + markDestroyed(m); + return LIBC_SYMBOLS.pthread_mutex_destroy(m); + } + virtual int pthread_mutex_init(pthread_mutex_t *m, const pthread_mutexattr_t *a){ + markCreated(m); + return LIBC_SYMBOLS.pthread_mutex_init(m,a); + } + virtual int pthread_mutex_lock(pthread_mutex_t *m){ + checkAccessed(m); + return LIBC_SYMBOLS.pthread_mutex_lock(m); + } + virtual int pthread_mutex_trylock(pthread_mutex_t *m){ + checkAccessed(m); + return LIBC_SYMBOLS.pthread_mutex_trylock(m); + } + virtual int pthread_mutex_unlock(pthread_mutex_t *m){ + checkAccessed(m); + return LIBC_SYMBOLS.pthread_mutex_unlock(m); + } +}; + +#endif /*PTHREADMOCKS_H_*/ + diff --git a/pkg/registry/zookeeper-3.4.6/src/c/tests/TestClient.cc b/pkg/registry/zookeeper-3.4.6/src/c/tests/TestClient.cc new file mode 100644 index 000000000..154fbed9e --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/c/tests/TestClient.cc @@ -0,0 +1,1135 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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. + */ + +#include +#include "CppAssertHelper.h" + +#include +#include +#include +#include + +#include "CollectionUtil.h" +#include "ThreadingUtil.h" + +using namespace Util; + +#include "Vector.h" +using namespace std; + +#include +#include + +#include +#include +#include +#include "Util.h" + +struct buff_struct_2 { + int32_t len; + int32_t off; + char *buffer; +}; + +static int Stat_eq(struct Stat* a, struct Stat* b) +{ + if (a->czxid != b->czxid) return 0; + if (a->mzxid != b->mzxid) return 0; + if (a->ctime != b->ctime) return 0; + if (a->mtime != b->mtime) return 0; + if (a->version != b->version) return 0; + if (a->cversion != b->cversion) return 0; + if (a->aversion != b->aversion) return 0; + if (a->ephemeralOwner != b->ephemeralOwner) return 0; + if (a->dataLength != b->dataLength) return 0; + if (a->numChildren != b->numChildren) return 0; + if (a->pzxid != b->pzxid) return 0; + return 1; +} +#ifdef THREADED + static void yield(zhandle_t *zh, int i) + { + sleep(i); + } +#else + static void yield(zhandle_t *zh, int seconds) + { + int fd; + int interest; + int events; + struct timeval tv; + int rc; + time_t expires = time(0) + seconds; + time_t timeLeft = seconds; + fd_set rfds, wfds, efds; + FD_ZERO(&rfds); + FD_ZERO(&wfds); + FD_ZERO(&efds); + + while(timeLeft >= 0) { + zookeeper_interest(zh, &fd, &interest, &tv); + if (fd != -1) { + if (interest&ZOOKEEPER_READ) { + FD_SET(fd, &rfds); + } else { + FD_CLR(fd, &rfds); + } + if (interest&ZOOKEEPER_WRITE) { + FD_SET(fd, &wfds); + } else { + FD_CLR(fd, &wfds); + } + } else { + fd = 0; + } + FD_SET(0, &rfds); + if (tv.tv_sec > timeLeft) { + tv.tv_sec = timeLeft; + } + rc = select(fd+1, &rfds, &wfds, &efds, &tv); + timeLeft = expires - time(0); + events = 0; + if (FD_ISSET(fd, &rfds)) { + events |= ZOOKEEPER_READ; + } + if (FD_ISSET(fd, &wfds)) { + events |= ZOOKEEPER_WRITE; + } + zookeeper_process(zh, events); + } + } +#endif + +typedef struct evt { + string path; + int type; +} evt_t; + +typedef struct watchCtx { +private: + list events; + watchCtx(const watchCtx&); + watchCtx& operator=(const watchCtx&); +public: + bool connected; + zhandle_t *zh; + Mutex mutex; + + watchCtx() { + connected = false; + zh = 0; + } + ~watchCtx() { + if (zh) { + zookeeper_close(zh); + zh = 0; + } + } + + evt_t getEvent() { + evt_t evt; + mutex.acquire(); + CPPUNIT_ASSERT( events.size() > 0); + evt = events.front(); + events.pop_front(); + mutex.release(); + return evt; + } + + int countEvents() { + int count; + mutex.acquire(); + count = events.size(); + mutex.release(); + return count; + } + + void putEvent(evt_t evt) { + mutex.acquire(); + events.push_back(evt); + mutex.release(); + } + + bool waitForConnected(zhandle_t *zh) { + time_t expires = time(0) + 10; + while(!connected && time(0) < expires) { + yield(zh, 1); + } + return connected; + } + bool waitForDisconnected(zhandle_t *zh) { + time_t expires = time(0) + 15; + while(connected && time(0) < expires) { + yield(zh, 1); + } + return !connected; + } +} watchctx_t; + +class Zookeeper_simpleSystem : public CPPUNIT_NS::TestFixture +{ + CPPUNIT_TEST_SUITE(Zookeeper_simpleSystem); + CPPUNIT_TEST(testAsyncWatcherAutoReset); + CPPUNIT_TEST(testDeserializeString); + CPPUNIT_TEST(testFirstServerDown); +#ifdef THREADED + CPPUNIT_TEST(testNullData); +#ifdef ZOO_IPV6_ENABLED + CPPUNIT_TEST(testIPV6); +#endif + CPPUNIT_TEST(testPath); + CPPUNIT_TEST(testPathValidation); + CPPUNIT_TEST(testPing); + CPPUNIT_TEST(testAcl); + CPPUNIT_TEST(testChroot); + CPPUNIT_TEST(testAuth); + CPPUNIT_TEST(testHangingClient); + CPPUNIT_TEST(testWatcherAutoResetWithGlobal); + CPPUNIT_TEST(testWatcherAutoResetWithLocal); + CPPUNIT_TEST(testGetChildren2); +#endif + CPPUNIT_TEST_SUITE_END(); + + static void watcher(zhandle_t *, int type, int state, const char *path,void*v){ + watchctx_t *ctx = (watchctx_t*)v; + + if (state == ZOO_CONNECTED_STATE) { + ctx->connected = true; + } else { + ctx->connected = false; + } + if (type != ZOO_SESSION_EVENT) { + evt_t evt; + evt.path = path; + evt.type = type; + ctx->putEvent(evt); + } + } + + static const char hostPorts[]; + + const char *getHostPorts() { + return hostPorts; + } + + zhandle_t *createClient(watchctx_t *ctx) { + return createClient(hostPorts, ctx); + } + + zhandle_t *createClient(const char *hp, watchctx_t *ctx) { + zhandle_t *zk = zookeeper_init(hp, watcher, 10000, 0, ctx, 0); + ctx->zh = zk; + sleep(1); + return zk; + } + + zhandle_t *createchClient(watchctx_t *ctx, const char* chroot) { + zhandle_t *zk = zookeeper_init(chroot, watcher, 10000, 0, ctx, 0); + ctx->zh = zk; + sleep(1); + return zk; + } + + FILE *logfile; +public: + + Zookeeper_simpleSystem() { + logfile = openlogfile("Zookeeper_simpleSystem"); + } + + ~Zookeeper_simpleSystem() { + if (logfile) { + fflush(logfile); + fclose(logfile); + logfile = 0; + } + } + + void setUp() + { + zoo_set_log_stream(logfile); + } + + + void startServer() { + char cmd[1024]; + sprintf(cmd, "%s start %s", ZKSERVER_CMD, getHostPorts()); + CPPUNIT_ASSERT(system(cmd) == 0); + } + + void stopServer() { + char cmd[1024]; + sprintf(cmd, "%s stop %s", ZKSERVER_CMD, getHostPorts()); + CPPUNIT_ASSERT(system(cmd) == 0); + } + + void tearDown() + { + } + + /** have a callback in the default watcher **/ + static void default_zoo_watcher(zhandle_t *zzh, int type, int state, const char *path, void *context){ + int zrc = 0; + struct String_vector str_vec = {0, NULL}; + zrc = zoo_wget_children(zzh, "/mytest", default_zoo_watcher, NULL, &str_vec); + } + + /** ZOOKEEPER-1057 This checks that the client connects to the second server when the first is not reachable **/ + void testFirstServerDown() { + watchctx_t ctx; + + zoo_deterministic_conn_order(true); + + zhandle_t* zk = createClient("127.0.0.1:22182,127.0.0.1:22181", &ctx); + CPPUNIT_ASSERT(zk != 0); + CPPUNIT_ASSERT(ctx.waitForConnected(zk)); + } + + /** this checks for a deadlock in calling zookeeper_close and calls from a default watcher that might get triggered just when zookeeper_close() is in progress **/ + void testHangingClient() { + int zrc = 0; + char buff[10] = "testall"; + char path[512]; + watchctx_t *ctx; + struct String_vector str_vec = {0, NULL}; + zhandle_t *zh = zookeeper_init(hostPorts, NULL, 10000, 0, ctx, 0); + sleep(1); + zrc = zoo_create(zh, "/mytest", buff, 10, &ZOO_OPEN_ACL_UNSAFE, 0, path, 512); + zrc = zoo_wget_children(zh, "/mytest", default_zoo_watcher, NULL, &str_vec); + zrc = zoo_create(zh, "/mytest/test1", buff, 10, &ZOO_OPEN_ACL_UNSAFE, 0, path, 512); + zrc = zoo_wget_children(zh, "/mytest", default_zoo_watcher, NULL, &str_vec); + zrc = zoo_delete(zh, "/mytest/test1", -1); + zookeeper_close(zh); + } + + + void testPing() + { + watchctx_t ctxIdle; + watchctx_t ctxWC; + zhandle_t *zkIdle = createClient(&ctxIdle); + zhandle_t *zkWatchCreator = createClient(&ctxWC); + + CPPUNIT_ASSERT(zkIdle); + CPPUNIT_ASSERT(zkWatchCreator); + + char path[80]; + sprintf(path, "/testping"); + int rc = zoo_create(zkWatchCreator, path, "", 0, &ZOO_OPEN_ACL_UNSAFE, 0, 0, 0); + CPPUNIT_ASSERT_EQUAL((int)ZOK, rc); + + for(int i = 0; i < 30; i++) { + sprintf(path, "/testping/%i", i); + rc = zoo_create(zkWatchCreator, path, "", 0, &ZOO_OPEN_ACL_UNSAFE, 0, 0, 0); + CPPUNIT_ASSERT_EQUAL((int)ZOK, rc); + } + + for(int i = 0; i < 30; i++) { + sprintf(path, "/testping/%i", i); + struct Stat stat; + rc = zoo_exists(zkIdle, path, 1, &stat); + CPPUNIT_ASSERT_EQUAL((int)ZOK, rc); + } + + for(int i = 0; i < 30; i++) { + sprintf(path, "/testping/%i", i); + usleep(500000); + rc = zoo_delete(zkWatchCreator, path, -1); + CPPUNIT_ASSERT_EQUAL((int)ZOK, rc); + } + struct Stat stat; + CPPUNIT_ASSERT_EQUAL((int)ZNONODE, zoo_exists(zkIdle, "/testping/0", 0, &stat)); + } + + bool waitForEvent(zhandle_t *zh, watchctx_t *ctx, int seconds) { + time_t expires = time(0) + seconds; + while(ctx->countEvents() == 0 && time(0) < expires) { + yield(zh, 1); + } + return ctx->countEvents() > 0; + } + +#define COUNT 100 + + static zhandle_t *async_zk; + static volatile int count; + static const char* hp_chroot; + + static void statCompletion(int rc, const struct Stat *stat, const void *data) { + int tmp = (int) (long) data; + CPPUNIT_ASSERT_EQUAL(tmp, rc); + } + + static void stringCompletion(int rc, const char *value, const void *data) { + char *path = (char*)data; + + if (rc == ZCONNECTIONLOSS && path) { + // Try again + rc = zoo_acreate(async_zk, path, "", 0, &ZOO_OPEN_ACL_UNSAFE, 0, stringCompletion, 0); + } else if (rc != ZOK) { + // fprintf(stderr, "rc = %d with path = %s\n", rc, (path ? path : "null")); + } + if (path) { + free(path); + } + } + + static void create_completion_fn(int rc, const char* value, const void *data) { + CPPUNIT_ASSERT_EQUAL((int) ZOK, rc); + count++; + } + + static void waitForCreateCompletion(int seconds) { + time_t expires = time(0) + seconds; + while(count == 0 && time(0) < expires) { + sleep(1); + } + count--; + } + + static void watcher_chroot_fn(zhandle_t *zh, int type, + int state, const char *path,void *watcherCtx) { + // check for path + char *client_path = (char *) watcherCtx; + CPPUNIT_ASSERT(strcmp(client_path, path) == 0); + count ++; + } + + static void waitForChrootWatch(int seconds) { + time_t expires = time(0) + seconds; + while (count == 0 && time(0) < expires) { + sleep(1); + } + count--; + } + + static void waitForVoidCompletion(int seconds) { + time_t expires = time(0) + seconds; + while(count == 0 && time(0) < expires) { + sleep(1); + } + count--; + } + + static void voidCompletion(int rc, const void *data) { + int tmp = (int) (long) data; + CPPUNIT_ASSERT_EQUAL(tmp, rc); + count++; + } + + static void verifyCreateFails(const char *path, zhandle_t *zk) { + CPPUNIT_ASSERT_EQUAL((int)ZBADARGUMENTS, zoo_create(zk, + path, "", 0, &ZOO_OPEN_ACL_UNSAFE, 0, 0, 0)); + } + + static void verifyCreateOk(const char *path, zhandle_t *zk) { + CPPUNIT_ASSERT_EQUAL((int)ZOK, zoo_create(zk, + path, "", 0, &ZOO_OPEN_ACL_UNSAFE, 0, 0, 0)); + } + + static void verifyCreateFailsSeq(const char *path, zhandle_t *zk) { + CPPUNIT_ASSERT_EQUAL((int)ZBADARGUMENTS, zoo_create(zk, + path, "", 0, &ZOO_OPEN_ACL_UNSAFE, ZOO_SEQUENCE, 0, 0)); + } + + static void verifyCreateOkSeq(const char *path, zhandle_t *zk) { + CPPUNIT_ASSERT_EQUAL((int)ZOK, zoo_create(zk, + path, "", 0, &ZOO_OPEN_ACL_UNSAFE, ZOO_SEQUENCE, 0, 0)); + } + + + /** + returns false if the vectors dont match + **/ + bool compareAcl(struct ACL_vector acl1, struct ACL_vector acl2) { + if (acl1.count != acl2.count) { + return false; + } + struct ACL *aclval1 = acl1.data; + struct ACL *aclval2 = acl2.data; + if (aclval1->perms != aclval2->perms) { + return false; + } + struct Id id1 = aclval1->id; + struct Id id2 = aclval2->id; + if (strcmp(id1.scheme, id2.scheme) != 0) { + return false; + } + if (strcmp(id1.id, id2.id) != 0) { + return false; + } + return true; + } + + void testDeserializeString() { + char *val_str; + int rc = 0; + int val = -1; + struct iarchive *ia; + struct buff_struct_2 *b; + struct oarchive *oa = create_buffer_oarchive(); + oa->serialize_Int(oa, "int", &val); + b = (struct buff_struct_2 *) oa->priv; + ia = create_buffer_iarchive(b->buffer, b->len); + rc = ia->deserialize_String(ia, "string", &val_str); + CPPUNIT_ASSERT_EQUAL(-EINVAL, rc); + } + + void testAcl() { + int rc; + struct ACL_vector aclvec; + struct Stat stat; + watchctx_t ctx; + zhandle_t *zk = createClient(&ctx); + rc = zoo_create(zk, "/acl", "", 0, + &ZOO_OPEN_ACL_UNSAFE, 0, 0, 0); + CPPUNIT_ASSERT_EQUAL((int)ZOK, rc); + rc = zoo_get_acl(zk, "/acl", &aclvec, &stat ); + CPPUNIT_ASSERT_EQUAL((int) ZOK, rc); + bool cmp = compareAcl(ZOO_OPEN_ACL_UNSAFE, aclvec); + CPPUNIT_ASSERT_EQUAL(true, cmp); + rc = zoo_set_acl(zk, "/acl", -1, &ZOO_READ_ACL_UNSAFE); + CPPUNIT_ASSERT_EQUAL((int) ZOK, rc); + rc = zoo_get_acl(zk, "/acl", &aclvec, &stat); + CPPUNIT_ASSERT_EQUAL((int) ZOK, rc); + cmp = compareAcl(ZOO_READ_ACL_UNSAFE, aclvec); + CPPUNIT_ASSERT_EQUAL(true, cmp); + } + + + void testAuth() { + int rc; + count = 0; + watchctx_t ctx1, ctx2, ctx3, ctx4, ctx5; + zhandle_t *zk = createClient(&ctx1); + struct ACL_vector nodeAcl; + struct ACL acl_val; + rc = zoo_add_auth(0, "", 0, 0, voidCompletion, (void*)-1); + CPPUNIT_ASSERT_EQUAL((int) ZBADARGUMENTS, rc); + + rc = zoo_add_auth(zk, 0, 0, 0, voidCompletion, (void*)-1); + CPPUNIT_ASSERT_EQUAL((int) ZBADARGUMENTS, rc); + + // auth as pat, create /tauth1, close session + rc = zoo_add_auth(zk, "digest", "pat:passwd", 10, voidCompletion, + (void*)ZOK); + CPPUNIT_ASSERT_EQUAL((int) ZOK, rc); + waitForVoidCompletion(3); + CPPUNIT_ASSERT(count == 0); + + rc = zoo_create(zk, "/tauth1", "", 0, &ZOO_CREATOR_ALL_ACL, 0, 0, 0); + CPPUNIT_ASSERT_EQUAL((int)ZOK, rc); + + { + //create a new client + zk = createClient(&ctx4); + rc = zoo_add_auth(zk, "digest", "", 0, voidCompletion, (void*)ZOK); + CPPUNIT_ASSERT_EQUAL((int) ZOK, rc); + waitForVoidCompletion(3); + CPPUNIT_ASSERT(count == 0); + + rc = zoo_add_auth(zk, "digest", "", 0, voidCompletion, (void*)ZOK); + CPPUNIT_ASSERT_EQUAL((int) ZOK, rc); + waitForVoidCompletion(3); + CPPUNIT_ASSERT(count == 0); + } + + //create a new client + zk = createClient(&ctx2); + + rc = zoo_add_auth(zk, "digest", "pat:passwd2", 11, voidCompletion, + (void*)ZOK); + CPPUNIT_ASSERT_EQUAL((int) ZOK, rc); + waitForVoidCompletion(3); + CPPUNIT_ASSERT(count == 0); + + char buf[1024]; + int blen = sizeof(buf); + struct Stat stat; + rc = zoo_get(zk, "/tauth1", 0, buf, &blen, &stat); + CPPUNIT_ASSERT_EQUAL((int)ZNOAUTH, rc); + // add auth pat w/correct pass verify success + rc = zoo_add_auth(zk, "digest", "pat:passwd", 10, voidCompletion, + (void*)ZOK); + + CPPUNIT_ASSERT_EQUAL((int) ZOK, rc); + rc = zoo_get(zk, "/tauth1", 0, buf, &blen, &stat); + CPPUNIT_ASSERT_EQUAL((int)ZOK, rc); + waitForVoidCompletion(3); + CPPUNIT_ASSERT(count == 0); + //create a new client + zk = createClient(&ctx3); + rc = zoo_add_auth(zk, "digest", "pat:passwd", 10, voidCompletion, (void*) ZOK); + waitForVoidCompletion(3); + CPPUNIT_ASSERT(count == 0); + rc = zoo_add_auth(zk, "ip", "none", 4, voidCompletion, (void*)ZOK); + //make the server forget the auths + waitForVoidCompletion(3); + CPPUNIT_ASSERT(count == 0); + + stopServer(); + CPPUNIT_ASSERT(ctx3.waitForDisconnected(zk)); + startServer(); + CPPUNIT_ASSERT(ctx3.waitForConnected(zk)); + // now try getting the data + rc = zoo_get(zk, "/tauth1", 0, buf, &blen, &stat); + CPPUNIT_ASSERT_EQUAL((int)ZOK, rc); + // also check for get + rc = zoo_get_acl(zk, "/", &nodeAcl, &stat); + CPPUNIT_ASSERT_EQUAL((int)ZOK, rc); + // check if the acl has all the perms + CPPUNIT_ASSERT_EQUAL((int)1, (int)nodeAcl.count); + acl_val = *(nodeAcl.data); + CPPUNIT_ASSERT_EQUAL((int) acl_val.perms, ZOO_PERM_ALL); + // verify on root node + rc = zoo_set_acl(zk, "/", -1, &ZOO_CREATOR_ALL_ACL); + CPPUNIT_ASSERT_EQUAL((int) ZOK, rc); + + rc = zoo_set_acl(zk, "/", -1, &ZOO_OPEN_ACL_UNSAFE); + CPPUNIT_ASSERT_EQUAL((int) ZOK, rc); + + //[ZOOKEEPER-1108], test that auth info is sent to server, if client is not + //connected to server when zoo_add_auth was called. + zhandle_t *zk_auth = zookeeper_init(hostPorts, NULL, 10000, 0, NULL, 0); + rc = zoo_add_auth(zk_auth, "digest", "pat:passwd", 10, voidCompletion, (void*)ZOK); + CPPUNIT_ASSERT_EQUAL((int) ZOK, rc); + sleep(2); + CPPUNIT_ASSERT(count == 1); + count = 0; + CPPUNIT_ASSERT_EQUAL((int) ZOK, zookeeper_close(zk_auth)); + + // [ZOOKEEPER-800] zoo_add_auth should return ZINVALIDSTATE if + // the connection is closed. + zhandle_t *zk2 = zookeeper_init(hostPorts, NULL, 10000, 0, NULL, 0); + sleep(1); + CPPUNIT_ASSERT_EQUAL((int) ZOK, zookeeper_close(zk2)); + CPPUNIT_ASSERT_EQUAL(0, zoo_state(zk2)); // 0 ==> ZOO_CLOSED_STATE + rc = zoo_add_auth(zk2, "digest", "pat:passwd", 10, voidCompletion, (void*)ZOK); + CPPUNIT_ASSERT_EQUAL((int) ZINVALIDSTATE, rc); + + struct sockaddr addr; + socklen_t addr_len = sizeof(addr); + zk = createClient(&ctx5); + stopServer(); + CPPUNIT_ASSERT(ctx5.waitForDisconnected(zk)); + CPPUNIT_ASSERT(zookeeper_get_connected_host(zk, &addr, &addr_len) == NULL); + addr_len = sizeof(addr); + startServer(); + CPPUNIT_ASSERT(ctx5.waitForConnected(zk)); + CPPUNIT_ASSERT(zookeeper_get_connected_host(zk, &addr, &addr_len) != NULL); + } + + void testGetChildren2() { + int rc; + watchctx_t ctx; + zhandle_t *zk = createClient(&ctx); + + rc = zoo_create(zk, "/parent", "", 0, &ZOO_OPEN_ACL_UNSAFE, 0, 0, 0); + CPPUNIT_ASSERT_EQUAL((int)ZOK, rc); + + rc = zoo_create(zk, "/parent/child_a", "", 0, &ZOO_OPEN_ACL_UNSAFE, 0, 0, 0); + CPPUNIT_ASSERT_EQUAL((int)ZOK, rc); + + rc = zoo_create(zk, "/parent/child_b", "", 0, &ZOO_OPEN_ACL_UNSAFE, 0, 0, 0); + CPPUNIT_ASSERT_EQUAL((int)ZOK, rc); + + rc = zoo_create(zk, "/parent/child_c", "", 0, &ZOO_OPEN_ACL_UNSAFE, 0, 0, 0); + CPPUNIT_ASSERT_EQUAL((int)ZOK, rc); + + rc = zoo_create(zk, "/parent/child_d", "", 0, &ZOO_OPEN_ACL_UNSAFE, 0, 0, 0); + CPPUNIT_ASSERT_EQUAL((int)ZOK, rc); + + struct String_vector strings; + struct Stat stat_a, stat_b; + + rc = zoo_get_children2(zk, "/parent", 0, &strings, &stat_a); + CPPUNIT_ASSERT_EQUAL((int)ZOK, rc); + + rc = zoo_exists(zk, "/parent", 0, &stat_b); + CPPUNIT_ASSERT_EQUAL((int)ZOK, rc); + + CPPUNIT_ASSERT(Stat_eq(&stat_a, &stat_b)); + CPPUNIT_ASSERT(stat_a.numChildren == 4); + } + + void testIPV6() { + watchctx_t ctx; + zhandle_t *zk = createClient("::1:22181", &ctx); + CPPUNIT_ASSERT(zk); + int rc = 0; + rc = zoo_create(zk, "/ipv6", NULL, -1, + &ZOO_OPEN_ACL_UNSAFE, 0, 0, 0); + CPPUNIT_ASSERT_EQUAL((int) ZOK, rc); + } + + void testNullData() { + watchctx_t ctx; + zhandle_t *zk = createClient(&ctx); + CPPUNIT_ASSERT(zk); + int rc = 0; + rc = zoo_create(zk, "/mahadev", NULL, -1, + &ZOO_OPEN_ACL_UNSAFE, 0, 0, 0); + CPPUNIT_ASSERT_EQUAL((int) ZOK, rc); + char buffer[512]; + struct Stat stat; + int len = 512; + rc = zoo_wget(zk, "/mahadev", NULL, NULL, buffer, &len, &stat); + CPPUNIT_ASSERT_EQUAL( -1, len); + CPPUNIT_ASSERT_EQUAL((int) ZOK, rc); + rc = zoo_set(zk, "/mahadev", NULL, -1, -1); + CPPUNIT_ASSERT_EQUAL((int) ZOK, rc); + rc = zoo_wget(zk, "/mahadev", NULL, NULL, buffer, &len, &stat); + CPPUNIT_ASSERT_EQUAL( -1, len); + CPPUNIT_ASSERT_EQUAL((int) ZOK, rc); + } + + void testPath() { + watchctx_t ctx; + char pathbuf[20]; + zhandle_t *zk = createClient(&ctx); + CPPUNIT_ASSERT(zk); + int rc = 0; + + memset(pathbuf, 'X', 20); + rc = zoo_create(zk, "/testpathpath0", "", 0, + &ZOO_OPEN_ACL_UNSAFE, 0, pathbuf, 0); + CPPUNIT_ASSERT_EQUAL((int) ZOK, rc); + CPPUNIT_ASSERT_EQUAL('X', pathbuf[0]); + + rc = zoo_create(zk, "/testpathpath1", "", 0, + &ZOO_OPEN_ACL_UNSAFE, 0, pathbuf, 1); + CPPUNIT_ASSERT_EQUAL((int) ZOK, rc); + CPPUNIT_ASSERT(strlen(pathbuf) == 0); + + rc = zoo_create(zk, "/testpathpath2", "", 0, + &ZOO_OPEN_ACL_UNSAFE, 0, pathbuf, 2); + CPPUNIT_ASSERT_EQUAL((int) ZOK, rc); + CPPUNIT_ASSERT(strcmp(pathbuf, "/") == 0); + + rc = zoo_create(zk, "/testpathpath3", "", 0, + &ZOO_OPEN_ACL_UNSAFE, 0, pathbuf, 3); + CPPUNIT_ASSERT_EQUAL((int) ZOK, rc); + CPPUNIT_ASSERT(strcmp(pathbuf, "/t") == 0); + + rc = zoo_create(zk, "/testpathpath7", "", 0, + &ZOO_OPEN_ACL_UNSAFE, 0, pathbuf, 15); + CPPUNIT_ASSERT_EQUAL((int) ZOK, rc); + CPPUNIT_ASSERT(strcmp(pathbuf, "/testpathpath7") == 0); + + rc = zoo_create(zk, "/testpathpath8", "", 0, + &ZOO_OPEN_ACL_UNSAFE, 0, pathbuf, 16); + CPPUNIT_ASSERT_EQUAL((int) ZOK, rc); + CPPUNIT_ASSERT(strcmp(pathbuf, "/testpathpath8") == 0); + } + + void testPathValidation() { + watchctx_t ctx; + zhandle_t *zk = createClient(&ctx); + CPPUNIT_ASSERT(zk); + + verifyCreateFails(0, zk); + verifyCreateFails("", zk); + verifyCreateFails("//", zk); + verifyCreateFails("///", zk); + verifyCreateFails("////", zk); + verifyCreateFails("/.", zk); + verifyCreateFails("/..", zk); + verifyCreateFails("/./", zk); + verifyCreateFails("/../", zk); + verifyCreateFails("/foo/./", zk); + verifyCreateFails("/foo/../", zk); + verifyCreateFails("/foo/.", zk); + verifyCreateFails("/foo/..", zk); + verifyCreateFails("/./.", zk); + verifyCreateFails("/../..", zk); + verifyCreateFails("/foo/bar/", zk); + verifyCreateFails("/foo//bar", zk); + verifyCreateFails("/foo/bar//", zk); + + verifyCreateFails("foo", zk); + verifyCreateFails("a", zk); + + // verify that trailing fails, except for seq which adds suffix + verifyCreateOk("/createseq", zk); + verifyCreateFails("/createseq/", zk); + verifyCreateOkSeq("/createseq/", zk); + verifyCreateOkSeq("/createseq/.", zk); + verifyCreateOkSeq("/createseq/..", zk); + verifyCreateFailsSeq("/createseq//", zk); + verifyCreateFailsSeq("/createseq/./", zk); + verifyCreateFailsSeq("/createseq/../", zk); + + verifyCreateOk("/.foo", zk); + verifyCreateOk("/.f.", zk); + verifyCreateOk("/..f", zk); + verifyCreateOk("/..f..", zk); + verifyCreateOk("/f.c", zk); + verifyCreateOk("/f", zk); + verifyCreateOk("/f/.f", zk); + verifyCreateOk("/f/f.", zk); + verifyCreateOk("/f/..f", zk); + verifyCreateOk("/f/f..", zk); + verifyCreateOk("/f/.f/f", zk); + verifyCreateOk("/f/f./f", zk); + } + + void testChroot() { + // the c client async callbacks do + // not callback with the path, so + // we dont need to test taht for now + // we should fix that though soon! + watchctx_t ctx, ctx_ch; + zhandle_t *zk, *zk_ch; + char buf[60]; + int rc, len; + struct Stat stat; + const char* data = "garbage"; + const char* retStr = "/chroot"; + const char* root= "/"; + zk_ch = createchClient(&ctx_ch, "127.0.0.1:22181/testch1/mahadev"); + CPPUNIT_ASSERT(zk_ch != NULL); + zk = createClient(&ctx); + // first test with a NULL zk handle, make sure client library does not + // dereference a null pointer, but instead returns ZBADARGUMENTS + rc = zoo_create(NULL, "/testch1", "", 0, &ZOO_OPEN_ACL_UNSAFE, 0, 0, 0); + CPPUNIT_ASSERT_EQUAL((int) ZBADARGUMENTS, rc); + rc = zoo_create(zk, "/testch1", "", 0, &ZOO_OPEN_ACL_UNSAFE, 0, 0, 0); + CPPUNIT_ASSERT_EQUAL((int) ZOK, rc); + rc = zoo_create(zk, "/testch1/mahadev", data, 7, &ZOO_OPEN_ACL_UNSAFE, 0, 0, 0); + CPPUNIT_ASSERT_EQUAL((int) ZOK, rc); + // try an exists with / + len = 60; + rc = zoo_get(zk_ch, "/", 0, buf, &len, &stat); + CPPUNIT_ASSERT_EQUAL((int)ZOK, rc); + //check if the data is the same + CPPUNIT_ASSERT(strncmp(buf, data, 7) == 0); + //check for watches + rc = zoo_wexists(zk_ch, "/chroot", watcher_chroot_fn, (void *) retStr, &stat); + //now check if we can do create/delete/get/sets/acls/getChildren and others + //check create + rc = zoo_create(zk_ch, "/chroot", "", 0, &ZOO_OPEN_ACL_UNSAFE, 0, 0,0); + CPPUNIT_ASSERT_EQUAL((int) ZOK, rc); + waitForChrootWatch(3); + CPPUNIT_ASSERT(count == 0); + rc = zoo_create(zk_ch, "/chroot/child", "", 0, &ZOO_OPEN_ACL_UNSAFE, 0, 0, 0); + CPPUNIT_ASSERT_EQUAL((int) ZOK, rc); + rc = zoo_exists(zk, "/testch1/mahadev/chroot/child", 0, &stat); + CPPUNIT_ASSERT_EQUAL((int) ZOK, rc); + + rc = zoo_delete(zk_ch, "/chroot/child", -1); + CPPUNIT_ASSERT_EQUAL((int) ZOK, rc); + rc = zoo_exists(zk, "/testch1/mahadev/chroot/child", 0, &stat); + CPPUNIT_ASSERT_EQUAL((int) ZNONODE, rc); + rc = zoo_wget(zk_ch, "/chroot", watcher_chroot_fn, (char*) retStr, + buf, &len, &stat); + CPPUNIT_ASSERT_EQUAL((int) ZOK, rc); + rc = zoo_set(zk_ch, "/chroot",buf, 3, -1); + CPPUNIT_ASSERT_EQUAL((int) ZOK, rc); + waitForChrootWatch(3); + CPPUNIT_ASSERT(count == 0); + // check for getchildren + struct String_vector children; + rc = zoo_get_children(zk_ch, "/", 0, &children); + CPPUNIT_ASSERT_EQUAL((int)ZOK, rc); + CPPUNIT_ASSERT_EQUAL((int)1, (int)children.count); + //check if te child if chroot + CPPUNIT_ASSERT(strcmp((retStr+1), children.data[0]) == 0); + // check for get/set acl + struct ACL_vector acl; + rc = zoo_get_acl(zk_ch, "/", &acl, &stat); + CPPUNIT_ASSERT_EQUAL((int)ZOK, rc); + CPPUNIT_ASSERT_EQUAL((int)1, (int)acl.count); + CPPUNIT_ASSERT_EQUAL((int)ZOO_PERM_ALL, (int)acl.data->perms); + // set acl + rc = zoo_set_acl(zk_ch, "/chroot", -1, &ZOO_READ_ACL_UNSAFE); + CPPUNIT_ASSERT_EQUAL((int) ZOK, rc); + // see if you add children + rc = zoo_create(zk_ch, "/chroot/child1", "",0, &ZOO_OPEN_ACL_UNSAFE, 0, 0, 0); + CPPUNIT_ASSERT_EQUAL((int)ZNOAUTH, rc); + //add wget children test + rc = zoo_wget_children(zk_ch, "/", watcher_chroot_fn, (char*) root, &children); + CPPUNIT_ASSERT_EQUAL((int)ZOK, rc); + + //now create a node + rc = zoo_create(zk_ch, "/child2", "",0, &ZOO_OPEN_ACL_UNSAFE, 0, 0, 0); + CPPUNIT_ASSERT_EQUAL((int) ZOK, rc); + waitForChrootWatch(3); + CPPUNIT_ASSERT(count == 0); + //check for one async call just to make sure + rc = zoo_acreate(zk_ch, "/child3", "", 0, &ZOO_OPEN_ACL_UNSAFE, 0, + create_completion_fn, 0); + waitForCreateCompletion(3); + CPPUNIT_ASSERT(count == 0); + + //ZOOKEEPER-1027 correctly return path_buffer without prefixed chroot + const char* path = "/zookeeper1027"; + char path_buffer[1024]; + int path_buffer_len=sizeof(path_buffer); + rc = zoo_create(zk_ch, path, "", 0, &ZOO_OPEN_ACL_UNSAFE, 0, path_buffer, path_buffer_len); + CPPUNIT_ASSERT_EQUAL((int) ZOK, rc); + CPPUNIT_ASSERT_EQUAL(string(path), string(path_buffer)); + } + + void testAsyncWatcherAutoReset() + { + watchctx_t ctx; + zhandle_t *zk = createClient(&ctx); + watchctx_t lctx[COUNT]; + int i; + char path[80]; + int rc; + evt_t evt; + + async_zk = zk; + for(i = 0; i < COUNT; i++) { + sprintf(path, "/awar%d", i); + rc = zoo_awexists(zk, path, watcher, &lctx[i], statCompletion, (void*)ZNONODE); + CPPUNIT_ASSERT_EQUAL((int)ZOK, rc); + } + + yield(zk, 0); + + for(i = 0; i < COUNT/2; i++) { + sprintf(path, "/awar%d", i); + rc = zoo_acreate(zk, path, "", 0, &ZOO_OPEN_ACL_UNSAFE, 0, stringCompletion, strdup(path)); + CPPUNIT_ASSERT_EQUAL((int)ZOK, rc); + } + + yield(zk, 3); + for(i = 0; i < COUNT/2; i++) { + sprintf(path, "/awar%d", i); + CPPUNIT_ASSERT_MESSAGE(path, waitForEvent(zk, &lctx[i], 5)); + evt = lctx[i].getEvent(); + CPPUNIT_ASSERT_EQUAL_MESSAGE(evt.path.c_str(), ZOO_CREATED_EVENT, evt.type); + CPPUNIT_ASSERT_EQUAL(string(path), evt.path); + } + + for(i = COUNT/2 + 1; i < COUNT*10; i++) { + sprintf(path, "/awar%d", i); + rc = zoo_acreate(zk, path, "", 0, &ZOO_OPEN_ACL_UNSAFE, 0, stringCompletion, strdup(path)); + CPPUNIT_ASSERT_EQUAL((int)ZOK, rc); + } + + yield(zk, 1); + stopServer(); + CPPUNIT_ASSERT(ctx.waitForDisconnected(zk)); + startServer(); + CPPUNIT_ASSERT(ctx.waitForConnected(zk)); + yield(zk, 3); + for(i = COUNT/2+1; i < COUNT; i++) { + sprintf(path, "/awar%d", i); + CPPUNIT_ASSERT_MESSAGE(path, waitForEvent(zk, &lctx[i], 5)); + evt = lctx[i].getEvent(); + CPPUNIT_ASSERT_EQUAL_MESSAGE(evt.path, ZOO_CREATED_EVENT, evt.type); + CPPUNIT_ASSERT_EQUAL(string(path), evt.path); + } + } + + void testWatcherAutoReset(zhandle_t *zk, watchctx_t *ctxGlobal, + watchctx_t *ctxLocal) + { + bool isGlobal = (ctxGlobal == ctxLocal); + int rc; + struct Stat stat; + char buf[1024]; + int blen; + struct String_vector strings; + const char *testName; + + rc = zoo_create(zk, "/watchtest", "", 0, + &ZOO_OPEN_ACL_UNSAFE, 0, 0, 0); + CPPUNIT_ASSERT_EQUAL((int)ZOK, rc); + rc = zoo_create(zk, "/watchtest/child", "", 0, + &ZOO_OPEN_ACL_UNSAFE, ZOO_EPHEMERAL, 0, 0); + CPPUNIT_ASSERT_EQUAL((int)ZOK, rc); + + if (isGlobal) { + testName = "GlobalTest"; + rc = zoo_get_children(zk, "/watchtest", 1, &strings); + deallocate_String_vector(&strings); + CPPUNIT_ASSERT_EQUAL((int)ZOK, rc); + blen = sizeof(buf); + rc = zoo_get(zk, "/watchtest/child", 1, buf, &blen, &stat); + CPPUNIT_ASSERT_EQUAL((int)ZOK, rc); + rc = zoo_exists(zk, "/watchtest/child2", 1, &stat); + CPPUNIT_ASSERT_EQUAL((int)ZNONODE, rc); + } else { + testName = "LocalTest"; + rc = zoo_wget_children(zk, "/watchtest", watcher, ctxLocal, + &strings); + deallocate_String_vector(&strings); + CPPUNIT_ASSERT_EQUAL((int)ZOK, rc); + blen = sizeof(buf); + rc = zoo_wget(zk, "/watchtest/child", watcher, ctxLocal, + buf, &blen, &stat); + CPPUNIT_ASSERT_EQUAL((int)ZOK, rc); + rc = zoo_wexists(zk, "/watchtest/child2", watcher, ctxLocal, + &stat); + CPPUNIT_ASSERT_EQUAL((int)ZNONODE, rc); + } + + CPPUNIT_ASSERT(ctxLocal->countEvents() == 0); + + stopServer(); + CPPUNIT_ASSERT_MESSAGE(testName, ctxGlobal->waitForDisconnected(zk)); + startServer(); + CPPUNIT_ASSERT_MESSAGE(testName, ctxLocal->waitForConnected(zk)); + + CPPUNIT_ASSERT(ctxLocal->countEvents() == 0); + + rc = zoo_set(zk, "/watchtest/child", "1", 1, -1); + CPPUNIT_ASSERT_EQUAL((int)ZOK, rc); + struct Stat stat1, stat2; + rc = zoo_set2(zk, "/watchtest/child", "1", 1, -1, &stat1); + CPPUNIT_ASSERT_EQUAL((int)ZOK, rc); + CPPUNIT_ASSERT(stat1.version >= 0); + rc = zoo_set2(zk, "/watchtest/child", "1", 1, stat1.version, &stat2); + CPPUNIT_ASSERT_EQUAL((int)ZOK, rc); + rc = zoo_set(zk, "/watchtest/child", "1", 1, stat2.version); + CPPUNIT_ASSERT_EQUAL((int)ZOK, rc); + rc = zoo_create(zk, "/watchtest/child2", "", 0, + &ZOO_OPEN_ACL_UNSAFE, 0, 0, 0); + CPPUNIT_ASSERT_EQUAL((int)ZOK, rc); + + CPPUNIT_ASSERT_MESSAGE(testName, waitForEvent(zk, ctxLocal, 5)); + + evt_t evt = ctxLocal->getEvent(); + CPPUNIT_ASSERT_EQUAL_MESSAGE(evt.path, ZOO_CHANGED_EVENT, evt.type); + CPPUNIT_ASSERT_EQUAL(string("/watchtest/child"), evt.path); + + CPPUNIT_ASSERT_MESSAGE(testName, waitForEvent(zk, ctxLocal, 5)); + // The create will trigget the get children and the + // exists watches + evt = ctxLocal->getEvent(); + CPPUNIT_ASSERT_EQUAL_MESSAGE(evt.path, ZOO_CREATED_EVENT, evt.type); + CPPUNIT_ASSERT_EQUAL(string("/watchtest/child2"), evt.path); + CPPUNIT_ASSERT_MESSAGE(testName, waitForEvent(zk, ctxLocal, 5)); + evt = ctxLocal->getEvent(); + CPPUNIT_ASSERT_EQUAL_MESSAGE(evt.path, ZOO_CHILD_EVENT, evt.type); + CPPUNIT_ASSERT_EQUAL(string("/watchtest"), evt.path); + + // Make sure Pings are giving us problems + sleep(5); + + CPPUNIT_ASSERT(ctxLocal->countEvents() == 0); + + stopServer(); + CPPUNIT_ASSERT_MESSAGE(testName, ctxGlobal->waitForDisconnected(zk)); + startServer(); + CPPUNIT_ASSERT_MESSAGE(testName, ctxGlobal->waitForConnected(zk)); + + if (isGlobal) { + testName = "GlobalTest"; + rc = zoo_get_children(zk, "/watchtest", 1, &strings); + deallocate_String_vector(&strings); + CPPUNIT_ASSERT_EQUAL((int)ZOK, rc); + blen = sizeof(buf); + rc = zoo_get(zk, "/watchtest/child", 1, buf, &blen, &stat); + CPPUNIT_ASSERT_EQUAL((int)ZOK, rc); + rc = zoo_exists(zk, "/watchtest/child2", 1, &stat); + CPPUNIT_ASSERT_EQUAL((int)ZOK, rc); + } else { + testName = "LocalTest"; + rc = zoo_wget_children(zk, "/watchtest", watcher, ctxLocal, + &strings); + deallocate_String_vector(&strings); + CPPUNIT_ASSERT_EQUAL((int)ZOK, rc); + blen = sizeof(buf); + rc = zoo_wget(zk, "/watchtest/child", watcher, ctxLocal, + buf, &blen, &stat); + CPPUNIT_ASSERT_EQUAL((int)ZOK, rc); + rc = zoo_wexists(zk, "/watchtest/child2", watcher, ctxLocal, + &stat); + CPPUNIT_ASSERT_EQUAL((int)ZOK, rc); + } + + zoo_delete(zk, "/watchtest/child2", -1); + + CPPUNIT_ASSERT_MESSAGE(testName, waitForEvent(zk, ctxLocal, 5)); + + evt = ctxLocal->getEvent(); + CPPUNIT_ASSERT_EQUAL_MESSAGE(evt.path, ZOO_DELETED_EVENT, evt.type); + CPPUNIT_ASSERT_EQUAL(string("/watchtest/child2"), evt.path); + + CPPUNIT_ASSERT_MESSAGE(testName, waitForEvent(zk, ctxLocal, 5)); + evt = ctxLocal->getEvent(); + CPPUNIT_ASSERT_EQUAL_MESSAGE(evt.path, ZOO_CHILD_EVENT, evt.type); + CPPUNIT_ASSERT_EQUAL(string("/watchtest"), evt.path); + + stopServer(); + CPPUNIT_ASSERT_MESSAGE(testName, ctxGlobal->waitForDisconnected(zk)); + startServer(); + CPPUNIT_ASSERT_MESSAGE(testName, ctxLocal->waitForConnected(zk)); + + zoo_delete(zk, "/watchtest/child", -1); + zoo_delete(zk, "/watchtest", -1); + + CPPUNIT_ASSERT_MESSAGE(testName, waitForEvent(zk, ctxLocal, 5)); + + evt = ctxLocal->getEvent(); + CPPUNIT_ASSERT_EQUAL_MESSAGE(evt.path, ZOO_DELETED_EVENT, evt.type); + CPPUNIT_ASSERT_EQUAL(string("/watchtest/child"), evt.path); + + // Make sure nothing is straggling + sleep(1); + CPPUNIT_ASSERT(ctxLocal->countEvents() == 0); + } + + void testWatcherAutoResetWithGlobal() + { + { + watchctx_t ctx; + zhandle_t *zk = createClient(&ctx); + int rc = zoo_create(zk, "/testarwg", "", 0, &ZOO_OPEN_ACL_UNSAFE, 0, 0, 0); + CPPUNIT_ASSERT_EQUAL((int) ZOK, rc); + rc = zoo_create(zk, "/testarwg/arwg", "", 0, &ZOO_OPEN_ACL_UNSAFE, 0, 0, 0); + CPPUNIT_ASSERT_EQUAL((int) ZOK, rc); + } + + { + watchctx_t ctx; + zhandle_t *zk = createchClient(&ctx, "127.0.0.1:22181/testarwg/arwg"); + + testWatcherAutoReset(zk, &ctx, &ctx); + } + } + + void testWatcherAutoResetWithLocal() + { + { + watchctx_t ctx; + zhandle_t *zk = createClient(&ctx); + int rc = zoo_create(zk, "/testarwl", "", 0, &ZOO_OPEN_ACL_UNSAFE, 0, 0, 0); + CPPUNIT_ASSERT_EQUAL((int) ZOK, rc); + rc = zoo_create(zk, "/testarwl/arwl", "", 0, &ZOO_OPEN_ACL_UNSAFE, 0, 0, 0); + CPPUNIT_ASSERT_EQUAL((int) ZOK, rc); + } + + { + watchctx_t ctx; + watchctx_t lctx; + zhandle_t *zk = createchClient(&ctx, "127.0.0.1:22181/testarwl/arwl"); + testWatcherAutoReset(zk, &ctx, &lctx); + } + } +}; + +volatile int Zookeeper_simpleSystem::count; +zhandle_t *Zookeeper_simpleSystem::async_zk; +const char Zookeeper_simpleSystem::hostPorts[] = "127.0.0.1:22181"; +CPPUNIT_TEST_SUITE_REGISTRATION(Zookeeper_simpleSystem); diff --git a/pkg/registry/zookeeper-3.4.6/src/c/tests/TestClientRetry.cc b/pkg/registry/zookeeper-3.4.6/src/c/tests/TestClientRetry.cc new file mode 100644 index 000000000..41d517986 --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/c/tests/TestClientRetry.cc @@ -0,0 +1,273 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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. + */ + +#include +#include "CppAssertHelper.h" + +#include +#include +#include +#include + +#include "CollectionUtil.h" +#include "ThreadingUtil.h" + +using namespace Util; + +#include "Vector.h" +using namespace std; + +#include +#include + +#include + +#include "Util.h" + +#ifdef THREADED + static void yield(zhandle_t *zh, int i) + { + sleep(i); + } +#else + static void yield(zhandle_t *zh, int seconds) + { + int fd; + int interest; + int events; + struct timeval tv; + int rc; + time_t expires = time(0) + seconds; + time_t timeLeft = seconds; + fd_set rfds, wfds, efds; + FD_ZERO(&rfds); + FD_ZERO(&wfds); + FD_ZERO(&efds); + + while(timeLeft >= 0) { + zookeeper_interest(zh, &fd, &interest, &tv); + if (fd != -1) { + if (interest&ZOOKEEPER_READ) { + FD_SET(fd, &rfds); + } else { + FD_CLR(fd, &rfds); + } + if (interest&ZOOKEEPER_WRITE) { + FD_SET(fd, &wfds); + } else { + FD_CLR(fd, &wfds); + } + } else { + fd = 0; + } + FD_SET(0, &rfds); + if (tv.tv_sec > timeLeft) { + tv.tv_sec = timeLeft; + } + rc = select(fd+1, &rfds, &wfds, &efds, &tv); + timeLeft = expires - time(0); + events = 0; + if (FD_ISSET(fd, &rfds)) { + events |= ZOOKEEPER_READ; + } + if (FD_ISSET(fd, &wfds)) { + events |= ZOOKEEPER_WRITE; + } + zookeeper_process(zh, events); + } + } +#endif + +typedef struct evt { + string path; + int type; +} evt_t; + +typedef struct watchCtx { +private: + list events; +public: + bool connected; + zhandle_t *zh; + Mutex mutex; + + watchCtx() { + connected = false; + zh = 0; + } + ~watchCtx() { + if (zh) { + zookeeper_close(zh); + zh = 0; + } + } + + evt_t getEvent() { + evt_t evt; + mutex.acquire(); + CPPUNIT_ASSERT( events.size() > 0); + evt = events.front(); + events.pop_front(); + mutex.release(); + return evt; + } + + int countEvents() { + int count; + mutex.acquire(); + count = events.size(); + mutex.release(); + return count; + } + + void putEvent(evt_t evt) { + mutex.acquire(); + events.push_back(evt); + mutex.release(); + } + + bool waitForConnected(zhandle_t *zh) { + time_t expires = time(0) + 10; + while(!connected && time(0) < expires) { + yield(zh, 1); + } + return connected; + } + bool waitForDisconnected(zhandle_t *zh) { + time_t expires = time(0) + 15; + while(connected && time(0) < expires) { + yield(zh, 1); + } + return !connected; + } +} watchctx_t; + +class Zookeeper_clientretry : public CPPUNIT_NS::TestFixture +{ + CPPUNIT_TEST_SUITE(Zookeeper_clientretry); +#ifdef THREADED + CPPUNIT_TEST(testRetry); +#endif + CPPUNIT_TEST_SUITE_END(); + + static void watcher(zhandle_t *, int type, int state, const char *path,void*v){ + watchctx_t *ctx = (watchctx_t*)v; + + if (state == ZOO_CONNECTED_STATE) { + ctx->connected = true; + } else { + ctx->connected = false; + } + if (type != ZOO_SESSION_EVENT) { + evt_t evt; + evt.path = path; + evt.type = type; + ctx->putEvent(evt); + } + } + + static const char hostPorts[]; + + const char *getHostPorts() { + return hostPorts; + } + + zhandle_t *createClient(watchctx_t *ctx) { + zhandle_t *zk = zookeeper_init(hostPorts, watcher, 10000, 0, + ctx, 0); + ctx->zh = zk; + sleep(1); + return zk; + } + + FILE *logfile; +public: + + Zookeeper_clientretry() { + logfile = openlogfile("Zookeeper_clientretry"); + } + + ~Zookeeper_clientretry() { + if (logfile) { + fflush(logfile); + fclose(logfile); + logfile = 0; + } + } + + void setUp() + { + zoo_set_log_stream(logfile); + + char cmd[1024]; + sprintf(cmd, "%s stop %s", ZKSERVER_CMD, getHostPorts()); + CPPUNIT_ASSERT(system(cmd) == 0); + + /* we are testing that if max cnxns is exceeded the server does the right thing */ + sprintf(cmd, "export ZKMAXCNXNS=1;%s startClean %s", ZKSERVER_CMD, getHostPorts()); + CPPUNIT_ASSERT(system(cmd) == 0); + + struct sigaction act; + act.sa_handler = SIG_IGN; + sigemptyset(&act.sa_mask); + act.sa_flags = 0; + CPPUNIT_ASSERT(sigaction(SIGPIPE, &act, NULL) == 0); + } + + void tearDown() + { + char cmd[1024]; + sprintf(cmd, "%s stop %s", ZKSERVER_CMD, getHostPorts()); + CPPUNIT_ASSERT(system(cmd) == 0); + + /* restart the server in "normal" mode */ + sprintf(cmd, "%s startClean %s", ZKSERVER_CMD, getHostPorts()); + CPPUNIT_ASSERT(system(cmd) == 0); + + struct sigaction act; + act.sa_handler = SIG_IGN; + sigemptyset(&act.sa_mask); + act.sa_flags = 0; + CPPUNIT_ASSERT(sigaction(SIGPIPE, &act, NULL) == 0); + } + + bool waitForEvent(zhandle_t *zh, watchctx_t *ctx, int seconds) { + time_t expires = time(0) + seconds; + while(ctx->countEvents() == 0 && time(0) < expires) { + yield(zh, 1); + } + return ctx->countEvents() > 0; + } + + static zhandle_t *async_zk; + + void testRetry() + { + watchctx_t ctx1, ctx2; + zhandle_t *zk1 = createClient(&ctx1); + CPPUNIT_ASSERT_EQUAL(true, ctx1.waitForConnected(zk1)); + zhandle_t *zk2 = createClient(&ctx2); + zookeeper_close(zk1); + CPPUNIT_ASSERT_EQUAL(true, ctx2.waitForConnected(zk2)); + ctx1.zh = 0; + } +}; + +zhandle_t *Zookeeper_clientretry::async_zk; +const char Zookeeper_clientretry::hostPorts[] = "127.0.0.1:22181"; +CPPUNIT_TEST_SUITE_REGISTRATION(Zookeeper_clientretry); diff --git a/pkg/registry/zookeeper-3.4.6/src/c/tests/TestDriver.cc b/pkg/registry/zookeeper-3.4.6/src/c/tests/TestDriver.cc new file mode 100644 index 000000000..3f32ba483 --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/c/tests/TestDriver.cc @@ -0,0 +1,173 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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. + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "Util.h" +#include "zookeeper_log.h" + +using namespace std; + +CPPUNIT_NS_BEGIN + +class EclipseOutputter: public CompilerOutputter +{ +public: + EclipseOutputter(TestResultCollector *result,ostream &stream): + CompilerOutputter(result,stream,"%p:%l: "),stream_(stream) + { + } + virtual void printFailedTestName( TestFailure *failure ){} + virtual void printFailureMessage( TestFailure *failure ) + { + stream_<<": "; + Message msg = failure->thrownException()->message(); + stream_<< msg.shortDescription(); + + string text; + for(int i=0; i the output must be in the compiler error format. + //bool selfTest = (argc > 1) && (std::string("-ide") == argv[1]); + globalTestConfig.addConfigFromCmdLine(argc,argv); + + ZKServer zkserver; + + // Create the event manager and test controller + CPPUNIT_NS::TestResult controller; + // Add a listener that colllects test result + CPPUNIT_NS::TestResultCollector result; + controller.addListener( &result ); + + // A listener that print dots as tests run. + // CPPUNIT_NS::TextTestProgressListener progress; + // CPPUNIT_NS::BriefTestProgressListener progress; + + // brief + elapsed time + TimingListener progress; + controller.addListener( &progress ); + + CPPUNIT_NS::TestRunner runner; + runner.addTest( CPPUNIT_NS::TestFactoryRegistry::getRegistry().makeTest() ); + + try { + CPPUNIT_NS::stdCOut() << "Running " << endl; + + zoo_set_debug_level(ZOO_LOG_LEVEL_INFO); + //zoo_set_debug_level(ZOO_LOG_LEVEL_DEBUG); + + runner.run( controller, globalTestConfig.getTestName()); + + // Print test in a compiler compatible format. + CPPUNIT_NS::EclipseOutputter outputter( &result,cout); + outputter.write(); + + // Uncomment this for XML output +#ifdef ENABLE_XML_OUTPUT + std::ofstream file( "tests.xml" ); + CPPUNIT_NS::XmlOutputter xml( &result, file ); + xml.setStyleSheet( "report.xsl" ); + xml.write(); + file.close(); +#endif + } catch ( std::invalid_argument &e ) { + // Test path not resolved + cout<<"\nERROR: "< +#include "CppAssertHelper.h" + +#include +#include +#include +#include + +#include "CollectionUtil.h" +#include "ThreadingUtil.h" + +using namespace Util; + +#include "Vector.h" +using namespace std; + +#include +#include + +#include +#include +#include +#include "Util.h" + +#ifdef THREADED + static void yield(zhandle_t *zh, int i) + { + sleep(i); + } +#else + static void yield(zhandle_t *zh, int seconds) + { + int fd; + int interest; + int events; + struct timeval tv; + int rc; + time_t expires = time(0) + seconds; + time_t timeLeft = seconds; + fd_set rfds, wfds, efds; + FD_ZERO(&rfds); + FD_ZERO(&wfds); + FD_ZERO(&efds); + + while(timeLeft >= 0) { + zookeeper_interest(zh, &fd, &interest, &tv); + if (fd != -1) { + if (interest&ZOOKEEPER_READ) { + FD_SET(fd, &rfds); + } else { + FD_CLR(fd, &rfds); + } + if (interest&ZOOKEEPER_WRITE) { + FD_SET(fd, &wfds); + } else { + FD_CLR(fd, &wfds); + } + } else { + fd = 0; + } + FD_SET(0, &rfds); + if (tv.tv_sec > timeLeft) { + tv.tv_sec = timeLeft; + } + rc = select(fd+1, &rfds, &wfds, &efds, &tv); + timeLeft = expires - time(0); + events = 0; + if (FD_ISSET(fd, &rfds)) { + events |= ZOOKEEPER_READ; + } + if (FD_ISSET(fd, &wfds)) { + events |= ZOOKEEPER_WRITE; + } + zookeeper_process(zh, events); + } + } +#endif + +typedef struct evt { + string path; + int type; +} evt_t; + +typedef struct watchCtx { +private: + list events; + watchCtx(const watchCtx&); + watchCtx& operator=(const watchCtx&); +public: + bool connected; + zhandle_t *zh; + Mutex mutex; + + watchCtx() { + connected = false; + zh = 0; + } + ~watchCtx() { + if (zh) { + zookeeper_close(zh); + zh = 0; + } + } + + evt_t getEvent() { + evt_t evt; + mutex.acquire(); + CPPUNIT_ASSERT( events.size() > 0); + evt = events.front(); + events.pop_front(); + mutex.release(); + return evt; + } + + int countEvents() { + int count; + mutex.acquire(); + count = events.size(); + mutex.release(); + return count; + } + + void putEvent(evt_t evt) { + mutex.acquire(); + events.push_back(evt); + mutex.release(); + } + + bool waitForConnected(zhandle_t *zh) { + time_t expires = time(0) + 10; + while(!connected && time(0) < expires) { + yield(zh, 1); + } + return connected; + } + bool waitForDisconnected(zhandle_t *zh) { + time_t expires = time(0) + 15; + while(connected && time(0) < expires) { + yield(zh, 1); + } + return !connected; + } +} watchctx_t; + +class Zookeeper_multi : public CPPUNIT_NS::TestFixture +{ + CPPUNIT_TEST_SUITE(Zookeeper_multi); +//FIXME: None of these tests pass in single-threaded mode. It seems to be a +//flaw in the test suite setup. +#ifdef THREADED + CPPUNIT_TEST(testCreate); + CPPUNIT_TEST(testCreateDelete); + CPPUNIT_TEST(testInvalidVersion); + CPPUNIT_TEST(testNestedCreate); + CPPUNIT_TEST(testSetData); + CPPUNIT_TEST(testUpdateConflict); + CPPUNIT_TEST(testDeleteUpdateConflict); + CPPUNIT_TEST(testAsyncMulti); + CPPUNIT_TEST(testMultiFail); + CPPUNIT_TEST(testCheck); + CPPUNIT_TEST(testWatch); + CPPUNIT_TEST(testSequentialNodeCreateInAsyncMulti); +#endif + CPPUNIT_TEST_SUITE_END(); + + static void watcher(zhandle_t *, int type, int state, const char *path,void*v){ + watchctx_t *ctx = (watchctx_t*)v; + + if (state == ZOO_CONNECTED_STATE) { + ctx->connected = true; + } else { + ctx->connected = false; + } + if (type != ZOO_SESSION_EVENT) { + evt_t evt; + evt.path = path; + evt.type = type; + ctx->putEvent(evt); + } + } + + static const char hostPorts[]; + + const char *getHostPorts() { + return hostPorts; + } + + zhandle_t *createClient(watchctx_t *ctx) { + return createClient(hostPorts, ctx); + } + + zhandle_t *createClient(const char *hp, watchctx_t *ctx) { + zhandle_t *zk = zookeeper_init(hp, watcher, 10000, 0, ctx, 0); + ctx->zh = zk; + CPPUNIT_ASSERT_EQUAL(true, ctx->waitForConnected(zk)); + return zk; + } + + FILE *logfile; +public: + + Zookeeper_multi() { + logfile = openlogfile("Zookeeper_multi"); + } + + ~Zookeeper_multi() { + if (logfile) { + fflush(logfile); + fclose(logfile); + logfile = 0; + } + } + + void setUp() + { + zoo_set_log_stream(logfile); + } + + void tearDown() + { + } + + static volatile int count; + + static void multi_completion_fn(int rc, const void *data) { + CPPUNIT_ASSERT_EQUAL((int) ZOK, rc); + count++; + } + + static void multi_completion_fn_no_assert(int rc, const void *data) { + count++; + } + + static void waitForMultiCompletion(int seconds) { + time_t expires = time(0) + seconds; + while(count == 0 && time(0) < expires) { + sleep(1); + } + count--; + } + + static void resetCounter() { + count = 0; + } + + /** + * Test basic multi-op create functionality + */ + void testCreate() { + int rc; + watchctx_t ctx; + zhandle_t *zk = createClient(&ctx); + + int sz = 512; + char p1[sz]; + char p2[sz]; + char p3[sz]; + p1[0] = p2[0] = p3[0] = '\0'; + + int nops = 3 ; + zoo_op_t ops[nops]; + zoo_op_result_t results[nops]; + + zoo_create_op_init(&ops[0], "/multi1", "", 0, &ZOO_OPEN_ACL_UNSAFE, 0, p1, sz); + zoo_create_op_init(&ops[1], "/multi1/a", "", 0, &ZOO_OPEN_ACL_UNSAFE, 0, p2, sz); + zoo_create_op_init(&ops[2], "/multi1/b", "", 0, &ZOO_OPEN_ACL_UNSAFE, 0, p3, sz); + + rc = zoo_multi(zk, nops, ops, results); + CPPUNIT_ASSERT_EQUAL((int)ZOK, rc); + + CPPUNIT_ASSERT(strcmp(p1, "/multi1") == 0); + CPPUNIT_ASSERT(strcmp(p2, "/multi1/a") == 0); + CPPUNIT_ASSERT(strcmp(p3, "/multi1/b") == 0); + + CPPUNIT_ASSERT_EQUAL((int)ZOK, results[0].err); + CPPUNIT_ASSERT_EQUAL((int)ZOK, results[1].err); + CPPUNIT_ASSERT_EQUAL((int)ZOK, results[2].err); + } + + /** + * Test create followed by delete + */ + void testCreateDelete() { + int rc; + watchctx_t ctx; + zhandle_t *zk = createClient(&ctx); + int sz = 512; + char p1[sz]; + p1[0] = '\0'; + int nops = 2 ; + zoo_op_t ops[nops]; + zoo_op_result_t results[nops]; + + zoo_create_op_init(&ops[0], "/multi2", "", 0, &ZOO_OPEN_ACL_UNSAFE, 0, p1, sz); + zoo_delete_op_init(&ops[1], "/multi2", 0); + + rc = zoo_multi(zk, nops, ops, results); + CPPUNIT_ASSERT_EQUAL((int)ZOK, rc); + + // '/multi2' should have been deleted + rc = zoo_exists(zk, "/multi2", 0, NULL); + CPPUNIT_ASSERT_EQUAL((int)ZNONODE, rc); + } + + /** + * Test invalid versions + */ + void testInvalidVersion() { + int rc; + watchctx_t ctx; + zhandle_t *zk = createClient(&ctx); + int nops = 4; + zoo_op_t ops[nops]; + zoo_op_result_t results[nops]; + + zoo_create_op_init(&ops[0], "/multi3", "", 0, &ZOO_OPEN_ACL_UNSAFE, 0, NULL, 0); + zoo_delete_op_init(&ops[1], "/multi3", 1); + zoo_create_op_init(&ops[2], "/multi3", "", 0, &ZOO_OPEN_ACL_UNSAFE, 0, NULL, 0); + zoo_create_op_init(&ops[3], "/multi3/a", "", 0, &ZOO_OPEN_ACL_UNSAFE, 0, NULL, 0); + + rc = zoo_multi(zk, nops, ops, results); + CPPUNIT_ASSERT_EQUAL((int)ZBADVERSION, rc); + CPPUNIT_ASSERT_EQUAL((int)ZOK, results[0].err); + CPPUNIT_ASSERT_EQUAL((int)ZBADVERSION, results[1].err); + CPPUNIT_ASSERT_EQUAL((int)ZRUNTIMEINCONSISTENCY, results[2].err); + CPPUNIT_ASSERT_EQUAL((int)ZRUNTIMEINCONSISTENCY, results[3].err); + } + + /** + * Test nested creates that rely on state in earlier op in multi + */ + void testNestedCreate() { + int rc; + watchctx_t ctx; + zhandle_t *zk = createClient(&ctx); + int sz = 512; + char p1[sz]; + p1[0] = '\0'; + int nops = 6; + zoo_op_t ops[nops]; + zoo_op_result_t results[nops]; + + /* Create */ + zoo_create_op_init(&ops[0], "/multi4", "", 0, &ZOO_OPEN_ACL_UNSAFE, 0, p1, sz); + zoo_create_op_init(&ops[1], "/multi4/a", "", 0, &ZOO_OPEN_ACL_UNSAFE, 0, p1, sz); + zoo_create_op_init(&ops[2], "/multi4/a/1", "", 0, &ZOO_OPEN_ACL_UNSAFE, 0, p1, sz); + + /* Delete */ + zoo_delete_op_init(&ops[3], "/multi4/a/1", 0); + zoo_delete_op_init(&ops[4], "/multi4/a", 0); + zoo_delete_op_init(&ops[5], "/multi4", 0); + + rc = zoo_multi(zk, nops, ops, results); + CPPUNIT_ASSERT_EQUAL((int)ZOK, rc); + + // Verify tree deleted + rc = zoo_exists(zk, "/multi4/a/1", 0, NULL); + CPPUNIT_ASSERT_EQUAL((int)ZNONODE, rc); + + rc = zoo_exists(zk, "/multi4/a", 0, NULL); + CPPUNIT_ASSERT_EQUAL((int)ZNONODE, rc); + + rc = zoo_exists(zk, "/multi4", 0, NULL); + CPPUNIT_ASSERT_EQUAL((int)ZNONODE, rc); + } + + /** + * Test setdata functionality + */ + void testSetData() { + int rc; + watchctx_t ctx; + zhandle_t *zk = createClient(&ctx); + int sz = 512; + struct Stat s1; + + char buf[sz]; + int blen = sz ; + + char p1[sz], p2[sz]; + + int nops = 2; + zoo_op_t ops[nops]; + zoo_op_result_t results[nops]; + + zoo_create_op_init(&ops[0], "/multi5", "", 0, &ZOO_OPEN_ACL_UNSAFE, 0, p1, sz); + zoo_create_op_init(&ops[1], "/multi5/a", "", 0, &ZOO_OPEN_ACL_UNSAFE, 0, p2, sz); + + rc = zoo_multi(zk, nops, ops, results); + CPPUNIT_ASSERT_EQUAL((int)ZOK, rc); + + yield(zk, 5); + + zoo_op_t setdata_ops[nops]; + zoo_op_result_t setdata_results[nops]; + + zoo_set_op_init(&setdata_ops[0], "/multi5", "1", 1, 0, &s1); + zoo_set_op_init(&setdata_ops[1], "/multi5/a", "2", 1, 0, &s1); + + rc = zoo_multi(zk, nops, setdata_ops, setdata_results); + CPPUNIT_ASSERT_EQUAL((int)ZOK, rc); + CPPUNIT_ASSERT_EQUAL((int)ZOK, results[0].err); + CPPUNIT_ASSERT_EQUAL((int)ZOK, results[1].err); + + memset(buf, '\0', blen); + rc = zoo_get(zk, "/multi5", 0, buf, &blen, &s1); + CPPUNIT_ASSERT_EQUAL((int)ZOK, rc); + CPPUNIT_ASSERT_EQUAL(1, blen); + CPPUNIT_ASSERT(strcmp("1", buf) == 0); + + memset(buf, '\0', blen); + rc = zoo_get(zk, "/multi5/a", 0, buf, &blen, &s1); + CPPUNIT_ASSERT_EQUAL((int)ZOK, rc); + CPPUNIT_ASSERT_EQUAL(1, blen); + CPPUNIT_ASSERT(strcmp("2", buf) == 0); + } + + /** + * Test update conflicts + */ + void testUpdateConflict() { + int rc; + watchctx_t ctx; + zhandle_t *zk = createClient(&ctx); + int sz = 512; + char buf[sz]; + int blen = sz; + char p1[sz]; + p1[0] = '\0'; + struct Stat s1; + int nops = 3; + zoo_op_t ops[nops]; + zoo_op_result_t results[nops]; + + zoo_create_op_init(&ops[0], "/multi6", "", 0, &ZOO_OPEN_ACL_UNSAFE, 0, p1, sz); + zoo_set_op_init(&ops[1], "/multi6", "X", 1, 0, &s1); + zoo_set_op_init(&ops[2], "/multi6", "Y", 1, 0, &s1); + + rc = zoo_multi(zk, nops, ops, results); + CPPUNIT_ASSERT_EQUAL((int)ZBADVERSION, rc); + + //Updating version solves conflict -- order matters + ops[2].set_op.version = 1; + rc = zoo_multi(zk, nops, ops, results); + CPPUNIT_ASSERT_EQUAL((int)ZOK, rc); + + memset(buf, 0, sz); + rc = zoo_get(zk, "/multi6", 0, buf, &blen, &s1); + CPPUNIT_ASSERT_EQUAL((int)ZOK, rc); + CPPUNIT_ASSERT_EQUAL(blen, 1); + CPPUNIT_ASSERT(strncmp(buf, "Y", 1) == 0); + } + + /** + * Test delete-update conflicts + */ + void testDeleteUpdateConflict() { + int rc; + watchctx_t ctx; + zhandle_t *zk = createClient(&ctx); + int sz = 512; + char buf[sz]; + int blen; + char p1[sz]; + p1[0] = '\0'; + struct Stat stat; + int nops = 3; + zoo_op_t ops[nops]; + zoo_op_result_t results[nops]; + + zoo_create_op_init(&ops[0], "/multi7", "", 0, &ZOO_OPEN_ACL_UNSAFE, 0, p1, sz); + zoo_delete_op_init(&ops[1], "/multi7", 0); + zoo_set_op_init(&ops[2], "/multi7", "Y", 1, 0, &stat); + + rc = zoo_multi(zk, nops, ops, results); + CPPUNIT_ASSERT_EQUAL((int)ZNONODE, rc); + + // '/multi' should never have been created as entire op should fail + rc = zoo_exists(zk, "/multi7", 0, NULL); + CPPUNIT_ASSERT_EQUAL((int)ZNONODE, rc); + } + + void testAsyncMulti() { + int rc; + watchctx_t ctx; + zhandle_t *zk = createClient(&ctx); + + int sz = 512; + char p1[sz], p2[sz], p3[sz]; + p1[0] = '\0'; + p2[0] = '\0'; + p3[0] = '\0'; + + int nops = 3; + zoo_op_t ops[nops]; + zoo_op_result_t results[nops]; + + zoo_create_op_init(&ops[0], "/multi8", "", 0, &ZOO_OPEN_ACL_UNSAFE, 0, p1, sz); + zoo_create_op_init(&ops[1], "/multi8/a", "", 0, &ZOO_OPEN_ACL_UNSAFE, 0, p2, sz); + zoo_create_op_init(&ops[2], "/multi8/b", "", 0, &ZOO_OPEN_ACL_UNSAFE, 0, p3, sz); + + rc = zoo_amulti(zk, nops, ops, results, multi_completion_fn, 0); + waitForMultiCompletion(10); + CPPUNIT_ASSERT_EQUAL((int)ZOK, rc); + + CPPUNIT_ASSERT(strcmp(p1, "/multi8") == 0); + CPPUNIT_ASSERT(strcmp(p2, "/multi8/a") == 0); + CPPUNIT_ASSERT(strcmp(p3, "/multi8/b") == 0); + + CPPUNIT_ASSERT_EQUAL((int)ZOK, results[0].err); + CPPUNIT_ASSERT_EQUAL((int)ZOK, results[1].err); + CPPUNIT_ASSERT_EQUAL((int)ZOK, results[2].err); + } + + void testMultiFail() { + int rc; + watchctx_t ctx; + zhandle_t *zk = createClient(&ctx); + + int sz = 512; + char p1[sz], p2[sz], p3[sz]; + + p1[0] = '\0'; + p2[0] = '\0'; + p3[0] = '\0'; + + int nops = 3; + zoo_op_t ops[nops]; + zoo_op_result_t results[nops]; + + zoo_create_op_init(&ops[0], "/multi9", "", 0, &ZOO_OPEN_ACL_UNSAFE, 0, p1, sz); + zoo_create_op_init(&ops[1], "/multi9", "", 0, &ZOO_OPEN_ACL_UNSAFE, 0, p2, sz); + zoo_create_op_init(&ops[2], "/multi9/b", "", 0, &ZOO_OPEN_ACL_UNSAFE, 0, p3, sz); + + rc = zoo_multi(zk, nops, ops, results); + CPPUNIT_ASSERT_EQUAL((int)ZNODEEXISTS, rc); + } + + /** + * Test basic multi-op check functionality + */ + void testCheck() { + int rc; + watchctx_t ctx; + zhandle_t *zk = createClient(&ctx); + int sz = 512; + char p1[sz]; + p1[0] = '\0'; + struct Stat s1; + + rc = zoo_create(zk, "/multi0", "", 0, &ZOO_OPEN_ACL_UNSAFE, 0, p1, sz); + CPPUNIT_ASSERT_EQUAL((int)ZOK, rc); + + // Conditionally create /multi0/a' only if '/multi0' at version 0 + int nops = 2; + zoo_op_t ops[nops]; + zoo_op_result_t results[nops]; + + zoo_check_op_init(&ops[0], "/multi0", 0); + zoo_create_op_init(&ops[1], "/multi0/a", "", 0, &ZOO_OPEN_ACL_UNSAFE, 0, p1, sz); + + rc = zoo_multi(zk, nops, ops, results); + CPPUNIT_ASSERT_EQUAL((int)ZOK, rc); + + CPPUNIT_ASSERT_EQUAL((int)ZOK, results[0].err); + CPPUNIT_ASSERT_EQUAL((int)ZOK, results[1].err); + + // '/multi0/a' should have been created as it passed version check + rc = zoo_exists(zk, "/multi0/a", 0, NULL); + CPPUNIT_ASSERT_EQUAL((int)ZOK, rc); + + // Only create '/multi0/b' if '/multi0' at version 10 (which it's not) + zoo_op_t ops2[nops]; + zoo_check_op_init(&ops2[0], "/multi0", 10); + zoo_create_op_init(&ops2[1], "/multi0/b", "", 0, &ZOO_OPEN_ACL_UNSAFE, 0, p1, sz); + + rc = zoo_multi(zk, nops, ops2, results); + CPPUNIT_ASSERT_EQUAL((int)ZBADVERSION, rc); + + CPPUNIT_ASSERT_EQUAL((int)ZBADVERSION, results[0].err); + CPPUNIT_ASSERT_EQUAL((int)ZRUNTIMEINCONSISTENCY, results[1].err); + + // '/multi0/b' should NOT have been created + rc = zoo_exists(zk, "/multi0/b", 0, NULL); + CPPUNIT_ASSERT_EQUAL((int)ZNONODE, rc); + } + + /** + * Do a multi op inside a watch callback context. + */ + static void doMultiInWatch(zhandle_t *zk, int type, int state, const char *path, void *ctx) { + int rc; + int sz = 512; + char p1[sz]; + p1[0] = '\0'; + struct Stat s1; + + int nops = 1; + zoo_op_t ops[nops]; + zoo_op_result_t results[nops]; + + zoo_set_op_init(&ops[0], "/multiwatch", "1", 1, -1, NULL); + + rc = zoo_multi(zk, nops, ops, results); + CPPUNIT_ASSERT_EQUAL((int)ZOK, rc); + CPPUNIT_ASSERT_EQUAL((int)ZOK, results[0].err); + + memset(p1, '\0', sz); + rc = zoo_get(zk, "/multiwatch", 0, p1, &sz, &s1); + CPPUNIT_ASSERT_EQUAL((int)ZOK, rc); + CPPUNIT_ASSERT_EQUAL(1, sz); + CPPUNIT_ASSERT(strcmp("1", p1) == 0); + count++; + } + + /** + * Test multi-op called from a watch + */ + void testWatch() { + int rc; + watchctx_t ctx; + zhandle_t *zk = createClient(&ctx); + int sz = 512; + char p1[sz]; + p1[0] = '\0'; + + rc = zoo_create(zk, "/multiwatch", "", 0, &ZOO_OPEN_ACL_UNSAFE, 0, NULL, 0); + CPPUNIT_ASSERT_EQUAL((int)ZOK, rc); + + // create a watch on node '/multiwatch' + rc = zoo_wget(zk, "/multiwatch", doMultiInWatch, &ctx, p1, &sz, NULL); + + // setdata on node '/multiwatch' this should trip the watch + rc = zoo_set(zk, "/multiwatch", NULL, -1, -1); + CPPUNIT_ASSERT_EQUAL((int) ZOK, rc); + + // wait for multi completion in doMultiInWatch + waitForMultiCompletion(5); + } + + /** + * ZOOKEEPER-1624: PendingChanges of create sequential node request didn't + * get rollbacked correctly when multi-op failed. This caused + * create sequential node request in subsequent multi-op to failed because + * sequential node name generation is incorrect. + * + * The check is to make sure that each request in multi-op failed with + * the correct reason. + */ + void testSequentialNodeCreateInAsyncMulti() { + int rc; + watchctx_t ctx; + zhandle_t *zk = createClient(&ctx); + + int iteration = 4; + int nops = 2; + + zoo_op_result_t results[iteration][nops]; + zoo_op_t ops[nops]; + zoo_create_op_init(&ops[0], "/node-", "", 0, &ZOO_OPEN_ACL_UNSAFE, ZOO_SEQUENCE, NULL, 0); + zoo_create_op_init(&ops[1], "/dup", "", 0, &ZOO_OPEN_ACL_UNSAFE, 0, NULL, 0); + for (int i = 0; i < iteration ; ++i) { + rc = zoo_amulti(zk, nops, ops, results[i], multi_completion_fn_no_assert, 0); + CPPUNIT_ASSERT_EQUAL((int)ZOK, rc); + } + + waitForMultiCompletion(10); + + CPPUNIT_ASSERT_EQUAL((int)ZOK, results[0][0].err); + CPPUNIT_ASSERT_EQUAL((int)ZOK, results[1][0].err); + CPPUNIT_ASSERT_EQUAL((int)ZOK, results[2][0].err); + CPPUNIT_ASSERT_EQUAL((int)ZOK, results[3][0].err); + + CPPUNIT_ASSERT_EQUAL((int)ZOK, results[0][1].err); + CPPUNIT_ASSERT_EQUAL((int)ZNODEEXISTS, results[1][1].err); + CPPUNIT_ASSERT_EQUAL((int)ZNODEEXISTS, results[2][1].err); + CPPUNIT_ASSERT_EQUAL((int)ZNODEEXISTS, results[3][1].err); + + resetCounter(); + } +}; + +volatile int Zookeeper_multi::count; +const char Zookeeper_multi::hostPorts[] = "127.0.0.1:22181"; +CPPUNIT_TEST_SUITE_REGISTRATION(Zookeeper_multi); diff --git a/pkg/registry/zookeeper-3.4.6/src/c/tests/TestOperations.cc b/pkg/registry/zookeeper-3.4.6/src/c/tests/TestOperations.cc new file mode 100644 index 000000000..b0370e9af --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/c/tests/TestOperations.cc @@ -0,0 +1,675 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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. + */ + +#include +#include "CppAssertHelper.h" + +#include "ZKMocks.h" +#include + +using namespace std; + +class Zookeeper_operations : public CPPUNIT_NS::TestFixture +{ + CPPUNIT_TEST_SUITE(Zookeeper_operations); +#ifndef THREADED + CPPUNIT_TEST(testPing); + CPPUNIT_TEST(testTimeoutCausedByWatches1); + CPPUNIT_TEST(testTimeoutCausedByWatches2); +#else + CPPUNIT_TEST(testAsyncWatcher1); + CPPUNIT_TEST(testAsyncGetOperation); +#endif + CPPUNIT_TEST(testOperationsAndDisconnectConcurrently1); + CPPUNIT_TEST(testOperationsAndDisconnectConcurrently2); + CPPUNIT_TEST(testConcurrentOperations1); + CPPUNIT_TEST_SUITE_END(); + zhandle_t *zh; + FILE *logfile; + + static void watcher(zhandle_t *, int, int, const char *,void*){} +public: + Zookeeper_operations() { + logfile = openlogfile("Zookeeper_operations"); + } + + ~Zookeeper_operations() { + if (logfile) { + fflush(logfile); + fclose(logfile); + logfile = 0; + } + } + + void setUp() + { + zoo_set_log_stream(logfile); + + zoo_deterministic_conn_order(0); + zh=0; + } + + void tearDown() + { + zookeeper_close(zh); + } + + class AsyncGetOperationCompletion: public AsyncCompletion{ + public: + AsyncGetOperationCompletion():called_(false),rc_(ZAPIERROR){} + virtual void dataCompl(int rc, const char *value, int len, const Stat *stat){ + synchronized(mx_); + called_=true; + rc_=rc; + value_.erase(); + if(rc!=ZOK) return; + value_.assign(value,len); + if(stat) + stat_=*stat; + } + bool operator()()const{ + synchronized(mx_); + return called_; + } + mutable Mutex mx_; + bool called_; + int rc_; + string value_; + NodeStat stat_; + }; +#ifndef THREADED + // send two get data requests; verify that the corresponding completions called + void testConcurrentOperations1() + { + Mock_gettimeofday timeMock; + ZookeeperServer zkServer; + // must call zookeeper_close() while all the mocks are in scope + CloseFinally guard(&zh); + + zh=zookeeper_init("localhost:2121",watcher,10000,TEST_CLIENT_ID,0,0); + CPPUNIT_ASSERT(zh!=0); + // simulate connected state + forceConnected(zh); + + int fd=0; + int interest=0; + timeval tv; + // first operation + AsyncGetOperationCompletion res1; + zkServer.addOperationResponse(new ZooGetResponse("1",1)); + int rc=zoo_aget(zh,"/x/y/1",0,asyncCompletion,&res1); + CPPUNIT_ASSERT_EQUAL((int)ZOK,rc); + // second operation + AsyncGetOperationCompletion res2; + zkServer.addOperationResponse(new ZooGetResponse("2",1)); + rc=zoo_aget(zh,"/x/y/2",0,asyncCompletion,&res2); + CPPUNIT_ASSERT_EQUAL((int)ZOK,rc); + // process the send queue + rc=zookeeper_interest(zh,&fd,&interest,&tv); + CPPUNIT_ASSERT_EQUAL((int)ZOK,rc); + while((rc=zookeeper_process(zh,interest))==ZOK) { + millisleep(100); + //printf("%d\n", rc); + } + //printf("RC = %d", rc); + CPPUNIT_ASSERT_EQUAL((int)ZNOTHING,rc); + + CPPUNIT_ASSERT_EQUAL((int)ZOK,res1.rc_); + CPPUNIT_ASSERT_EQUAL(string("1"),res1.value_); + CPPUNIT_ASSERT_EQUAL((int)ZOK,res2.rc_); + CPPUNIT_ASSERT_EQUAL(string("2"),res2.value_); + } + // send two getData requests and disconnect while the second request is + // outstanding; + // verify the completions are called + void testOperationsAndDisconnectConcurrently1() + { + Mock_gettimeofday timeMock; + ZookeeperServer zkServer; + // must call zookeeper_close() while all the mocks are in scope + CloseFinally guard(&zh); + + zh=zookeeper_init("localhost:2121",watcher,10000,TEST_CLIENT_ID,0,0); + CPPUNIT_ASSERT(zh!=0); + // simulate connected state + forceConnected(zh); + + int fd=0; + int interest=0; + timeval tv; + // first operation + AsyncGetOperationCompletion res1; + zkServer.addOperationResponse(new ZooGetResponse("1",1)); + int rc=zoo_aget(zh,"/x/y/1",0,asyncCompletion,&res1); + CPPUNIT_ASSERT_EQUAL((int)ZOK,rc); + // second operation + AsyncGetOperationCompletion res2; + zkServer.addOperationResponse(new ZooGetResponse("2",1)); + rc=zoo_aget(zh,"/x/y/2",0,asyncCompletion,&res2); + CPPUNIT_ASSERT_EQUAL((int)ZOK,rc); + // process the send queue + rc=zookeeper_interest(zh,&fd,&interest,&tv); + CPPUNIT_ASSERT_EQUAL((int)ZOK,rc); + rc=zookeeper_process(zh,interest); + CPPUNIT_ASSERT_EQUAL((int)ZOK,rc); + // simulate a disconnect + zkServer.setConnectionLost(); + rc=zookeeper_interest(zh,&fd,&interest,&tv); + rc=zookeeper_process(zh,interest); + CPPUNIT_ASSERT_EQUAL((int)ZCONNECTIONLOSS,rc); + CPPUNIT_ASSERT_EQUAL((int)ZOK,res1.rc_); + CPPUNIT_ASSERT_EQUAL(string("1"),res1.value_); + CPPUNIT_ASSERT_EQUAL((int)ZCONNECTIONLOSS,res2.rc_); + CPPUNIT_ASSERT_EQUAL(string(""),res2.value_); + } + // send two getData requests and simulate timeout while the both request + // are pending; + // verify the completions are called + void testOperationsAndDisconnectConcurrently2() + { + Mock_gettimeofday timeMock; + ZookeeperServer zkServer; + // must call zookeeper_close() while all the mocks are in scope + CloseFinally guard(&zh); + + zh=zookeeper_init("localhost:2121",watcher,10000,TEST_CLIENT_ID,0,0); + CPPUNIT_ASSERT(zh!=0); + // simulate connected state + forceConnected(zh); + + int fd=0; + int interest=0; + timeval tv; + // first operation + AsyncGetOperationCompletion res1; + zkServer.addOperationResponse(new ZooGetResponse("1",1)); + int rc=zoo_aget(zh,"/x/y/1",0,asyncCompletion,&res1); + CPPUNIT_ASSERT_EQUAL((int)ZOK,rc); + // second operation + AsyncGetOperationCompletion res2; + zkServer.addOperationResponse(new ZooGetResponse("2",1)); + rc=zoo_aget(zh,"/x/y/2",0,asyncCompletion,&res2); + CPPUNIT_ASSERT_EQUAL((int)ZOK,rc); + // simulate timeout + timeMock.tick(+10); // advance system time by 10 secs + // the next call to zookeeper_interest should return ZOPERATIONTIMEOUT + rc=zookeeper_interest(zh,&fd,&interest,&tv); + CPPUNIT_ASSERT_EQUAL((int)ZOPERATIONTIMEOUT,rc); + // make sure the completions have been called + CPPUNIT_ASSERT_EQUAL((int)ZOPERATIONTIMEOUT,res1.rc_); + CPPUNIT_ASSERT_EQUAL((int)ZOPERATIONTIMEOUT,res2.rc_); + } + + class PingCountingServer: public ZookeeperServer{ + public: + PingCountingServer():pingCount_(0){} + // called when a client request is received + virtual void onMessageReceived(const RequestHeader& rh, iarchive* ia){ + if(rh.type==ZOO_PING_OP){ + pingCount_++; + } + } + int pingCount_; + }; + + // establish a connection; idle for a while + // verify ping was sent at least once + void testPing() + { + const int TIMEOUT=9; // timeout in secs + Mock_gettimeofday timeMock; + PingCountingServer zkServer; + // must call zookeeper_close() while all the mocks are in scope + CloseFinally guard(&zh); + + // receive timeout is in milliseconds + zh=zookeeper_init("localhost:1234",watcher,TIMEOUT*1000,TEST_CLIENT_ID,0,0); + CPPUNIT_ASSERT(zh!=0); + // simulate connected state + forceConnected(zh); + + int fd=0; + int interest=0; + timeval tv; + // Round 1. + int rc=zookeeper_interest(zh,&fd,&interest,&tv); + CPPUNIT_ASSERT_EQUAL((int)ZOK,rc); + // simulate waiting for the select() call to timeout; + // advance the system clock accordingly + timeMock.tick(tv); + rc=zookeeper_process(zh,interest); + CPPUNIT_ASSERT_EQUAL((int)ZNOTHING,rc); + // verify no ping sent + CPPUNIT_ASSERT(zkServer.pingCount_==0); + + // Round 2. + // the client should have the idle threshold exceeded, by now + rc=zookeeper_interest(zh,&fd,&interest,&tv); + CPPUNIT_ASSERT_EQUAL((int)ZOK,rc); + // assume the socket is writable, so no idling here; move on to + // zookeeper_process immediately + rc=zookeeper_process(zh,interest); + // ZNOTHING means the client hasn't received a ping response yet + CPPUNIT_ASSERT_EQUAL((int)ZNOTHING,rc); + // verify a ping is sent + CPPUNIT_ASSERT_EQUAL(1,zkServer.pingCount_); + + // Round 3. + // we're going to receive a server PING response and make sure + // that the client has updated its last_recv timestamp + zkServer.addRecvResponse(new PingResponse); + rc=zookeeper_interest(zh,&fd,&interest,&tv); + CPPUNIT_ASSERT_EQUAL((int)ZOK,rc); + // pseudo-sleep for a short while (10 ms) + timeMock.millitick(10); + rc=zookeeper_process(zh,interest); + CPPUNIT_ASSERT_EQUAL((int)ZOK,rc); + // only one ping so far? + CPPUNIT_ASSERT_EQUAL(1,zkServer.pingCount_); + CPPUNIT_ASSERT(timeMock==zh->last_recv); + + // Round 4 + // make sure that a ping is not sent if something is outstanding + AsyncGetOperationCompletion res1; + rc=zoo_aget(zh,"/x/y/1",0,asyncCompletion,&res1); + CPPUNIT_ASSERT_EQUAL((int)ZOK,rc); + rc=zookeeper_interest(zh,&fd,&interest,&tv); + CPPUNIT_ASSERT_EQUAL((int)ZOK,rc); + timeMock.tick(tv); + rc=zookeeper_interest(zh,&fd,&interest,&tv); + CPPUNIT_ASSERT_EQUAL((int)ZOK,rc); + rc=zookeeper_process(zh,interest); + CPPUNIT_ASSERT_EQUAL((int)ZNOTHING,rc); + rc=zookeeper_interest(zh,&fd,&interest,&tv); + CPPUNIT_ASSERT_EQUAL((int)ZOK,rc); + // pseudo-sleep for a short while (10 ms) + timeMock.millitick(10); + rc=zookeeper_process(zh,interest); + CPPUNIT_ASSERT_EQUAL((int)ZNOTHING,rc); + // only one ping so far? + CPPUNIT_ASSERT_EQUAL(1,zkServer.pingCount_); + } + + // simulate a watch arriving right before a ping is due + // assert the ping is sent nevertheless + void testTimeoutCausedByWatches1() + { + const int TIMEOUT=9; // timeout in secs + Mock_gettimeofday timeMock; + PingCountingServer zkServer; + // must call zookeeper_close() while all the mocks are in scope + CloseFinally guard(&zh); + + // receive timeout is in milliseconds + zh=zookeeper_init("localhost:1234",watcher,TIMEOUT*1000,TEST_CLIENT_ID,0,0); + CPPUNIT_ASSERT(zh!=0); + // simulate connected state + forceConnected(zh); + + int fd=0; + int interest=0; + timeval tv; + // Round 1. + int rc=zookeeper_interest(zh,&fd,&interest,&tv); + CPPUNIT_ASSERT_EQUAL((int)ZOK,rc); + // simulate waiting for the select() call to timeout; + // advance the system clock accordingly + timeMock.tick(tv); + timeMock.tick(-1); // set the clock to a millisecond before a ping is due + // trigger a watch now + zkServer.addRecvResponse(new ZNodeEvent(ZOO_CHANGED_EVENT,"/x/y/z")); + rc=zookeeper_process(zh,interest); + CPPUNIT_ASSERT_EQUAL((int)ZOK,rc); + // arrival of a watch sets the last_recv to the current time + CPPUNIT_ASSERT(timeMock==zh->last_recv); + // spend 1 millisecond by processing the watch + timeMock.tick(1); + + // Round 2. + // a ping is due; zookeeper_interest() must send it now + rc=zookeeper_interest(zh,&fd,&interest,&tv); + CPPUNIT_ASSERT_EQUAL((int)ZOK,rc); + // no delay here -- as if the socket is immediately writable + rc=zookeeper_process(zh,interest); + CPPUNIT_ASSERT_EQUAL((int)ZNOTHING,rc); + // verify a ping is sent + CPPUNIT_ASSERT_EQUAL(1,zkServer.pingCount_); + } + + // similar to testTimeoutCausedByWatches1, but this time the watch is + // triggered while the client has an outstanding request + // assert the ping is sent on time + void testTimeoutCausedByWatches2() + { + const int TIMEOUT=9; // timeout in secs + Mock_gettimeofday now; + PingCountingServer zkServer; + // must call zookeeper_close() while all the mocks are in scope + CloseFinally guard(&zh); + + // receive timeout is in milliseconds + zh=zookeeper_init("localhost:1234",watcher,TIMEOUT*1000,TEST_CLIENT_ID,0,0); + CPPUNIT_ASSERT(zh!=0); + // simulate connected state + forceConnected(zh); + + // queue up a request; keep it pending (as if the server is busy or has died) + AsyncGetOperationCompletion res1; + zkServer.addOperationResponse(new ZooGetResponse("2",1)); + int rc=zoo_aget(zh,"/x/y/1",0,asyncCompletion,&res1); + + int fd=0; + int interest=0; + timeval tv; + // Round 1. + // send the queued up zoo_aget() request + Mock_gettimeofday beginningOfTimes(now); // remember when we started + rc=zookeeper_interest(zh,&fd,&interest,&tv); + CPPUNIT_ASSERT_EQUAL((int)ZOK,rc); + // no delay -- the socket is writable + rc=zookeeper_process(zh,interest); + CPPUNIT_ASSERT_EQUAL((int)ZOK,rc); + + // Round 2. + // what's next? + rc=zookeeper_interest(zh,&fd,&interest,&tv); + CPPUNIT_ASSERT_EQUAL((int)ZOK,rc); + // no response from the server yet -- waiting in the select() call + now.tick(tv); + // a watch has arrived, thus preventing the connection from timing out + zkServer.addRecvResponse(new ZNodeEvent(ZOO_CHANGED_EVENT,"/x/y/z")); + rc=zookeeper_process(zh,interest); + CPPUNIT_ASSERT_EQUAL((int)ZOK,rc); // read the watch message + CPPUNIT_ASSERT_EQUAL(0,zkServer.pingCount_); // not yet! + + //Round 3. + // now is the time to send a ping; make sure it's actually sent + rc=zookeeper_interest(zh,&fd,&interest,&tv); + CPPUNIT_ASSERT_EQUAL((int)ZOK,rc); + rc=zookeeper_process(zh,interest); + CPPUNIT_ASSERT_EQUAL((int)ZNOTHING,rc); + // verify a ping is sent + CPPUNIT_ASSERT_EQUAL(1,zkServer.pingCount_); + // make sure only 1/3 of the timeout has passed + CPPUNIT_ASSERT_EQUAL((int32_t)TIMEOUT/3*1000,toMilliseconds(now-beginningOfTimes)); + } + +#else + class TestGetDataJob: public TestJob{ + public: + TestGetDataJob(ZookeeperServer* svr,zhandle_t* zh, int reps=500) + :svr_(svr),zh_(zh),rc_(ZAPIERROR),reps_(reps){} + virtual void run(){ + int i; + for(i=0;iaddOperationResponse(new ZooGetResponse("1",1)); + rc_=zoo_get(zh_,"/x/y/z",0,&buf,&size,0); + if(rc_!=ZOK){ + break; + } + } + } + ZookeeperServer* svr_; + zhandle_t* zh_; + int rc_; + int reps_; + }; + class TestConcurrentOpJob: public TestGetDataJob{ + public: + static const int REPS=500; + TestConcurrentOpJob(ZookeeperServer* svr,zhandle_t* zh): + TestGetDataJob(svr,zh,REPS){} + virtual TestJob* clone() const { + return new TestConcurrentOpJob(svr_,zh_); + } + virtual void validate(const char* file, int line) const{ + CPPUNIT_ASSERT_EQUAL_MESSAGE_LOC("ZOK != rc",(int)ZOK,rc_,file,line); + } + }; + void testConcurrentOperations1() + { + for(int counter=0; counter<50; counter++){ + // frozen time -- no timeouts and no pings + Mock_gettimeofday timeMock; + + ZookeeperServer zkServer; + Mock_poll pollMock(&zkServer,ZookeeperServer::FD); + // must call zookeeper_close() while all the mocks are in the scope! + CloseFinally guard(&zh); + + zh=zookeeper_init("localhost:2121",watcher,10000,TEST_CLIENT_ID,0,0); + CPPUNIT_ASSERT(zh!=0); + // make sure the client has connected + CPPUNIT_ASSERT(ensureCondition(ClientConnected(zh),1000)<1000); + + TestJobManager jmgr(TestConcurrentOpJob(&zkServer,zh),10); + jmgr.startAllJobs(); + jmgr.wait(); + // validate test results + VALIDATE_JOBS(jmgr); + } + } + class ZKGetJob: public TestJob{ + public: + static const int REPS=1000; + ZKGetJob(zhandle_t* zh) + :zh_(zh),rc_(ZAPIERROR){} + virtual TestJob* clone() const { + return new ZKGetJob(zh_); + } + virtual void run(){ + int i; + for(i=0;i +#include "CppAssertHelper.h" + +#include "ZKMocks.h" +#include "CollectionUtil.h" +#include "Util.h" + +class Zookeeper_watchers : public CPPUNIT_NS::TestFixture +{ + CPPUNIT_TEST_SUITE(Zookeeper_watchers); + CPPUNIT_TEST(testDefaultSessionWatcher1); + CPPUNIT_TEST(testDefaultSessionWatcher2); + CPPUNIT_TEST(testObjectSessionWatcher1); + CPPUNIT_TEST(testObjectSessionWatcher2); + CPPUNIT_TEST(testNodeWatcher1); + CPPUNIT_TEST(testChildWatcher1); + CPPUNIT_TEST(testChildWatcher2); + CPPUNIT_TEST_SUITE_END(); + + static void watcher(zhandle_t *, int, int, const char *,void*){} + zhandle_t *zh; + FILE *logfile; + +public: + + Zookeeper_watchers() { + logfile = openlogfile("Zookeeper_watchers"); + } + + ~Zookeeper_watchers() { + if (logfile) { + fflush(logfile); + fclose(logfile); + logfile = 0; + } + } + + void setUp() + { + zoo_set_log_stream(logfile); + + zoo_deterministic_conn_order(0); + zh=0; + } + + void tearDown() + { + zookeeper_close(zh); + } + + class ConnectionWatcher: public WatcherAction{ + public: + ConnectionWatcher():connected_(false),counter_(0){} + virtual void onConnectionEstablished(zhandle_t*){ + synchronized(mx_); + counter_++; + connected_=true; + } + SyncedBoolCondition isConnectionEstablished() const{ + return SyncedBoolCondition(connected_,mx_); + } + bool connected_; + int counter_; + }; + + class DisconnectWatcher: public WatcherAction{ + public: + DisconnectWatcher():disconnected_(false),counter_(0){} + virtual void onConnectionLost(zhandle_t*){ + synchronized(mx_); + counter_++; + disconnected_=true; + } + SyncedBoolCondition isDisconnected() const{ + return SyncedBoolCondition(disconnected_,mx_); + } + bool disconnected_; + int counter_; + }; + + class CountingDataWatcher: public WatcherAction{ + public: + CountingDataWatcher():disconnected_(false),counter_(0){} + virtual void onNodeValueChanged(zhandle_t*,const char* path){ + synchronized(mx_); + counter_++; + } + virtual void onConnectionLost(zhandle_t*){ + synchronized(mx_); + counter_++; + disconnected_=true; + } + bool disconnected_; + int counter_; + }; + + class DeletionCountingDataWatcher: public WatcherAction{ + public: + DeletionCountingDataWatcher():counter_(0){} + virtual void onNodeDeleted(zhandle_t*,const char* path){ + synchronized(mx_); + counter_++; + } + int counter_; + }; + + class ChildEventCountingWatcher: public WatcherAction{ + public: + ChildEventCountingWatcher():counter_(0){} + virtual void onChildChanged(zhandle_t*,const char* path){ + synchronized(mx_); + counter_++; + } + int counter_; + }; + +#ifndef THREADED + + // verify: the default watcher is called once for a session event + void testDefaultSessionWatcher1(){ + Mock_gettimeofday timeMock; + ZookeeperServer zkServer; + // must call zookeeper_close() while all the mocks are in scope + CloseFinally guard(&zh); + + ConnectionWatcher watcher; + zh=zookeeper_init("localhost:2121",activeWatcher,10000,TEST_CLIENT_ID, + &watcher,0); + CPPUNIT_ASSERT(zh!=0); + + int fd=0; + int interest=0; + timeval tv; + // open the socket + int rc=zookeeper_interest(zh,&fd,&interest,&tv); + CPPUNIT_ASSERT_EQUAL((int)ZOK,rc); + CPPUNIT_ASSERT_EQUAL(ZOO_CONNECTING_STATE,zoo_state(zh)); + // send the handshake packet to the server + rc=zookeeper_process(zh,interest); + CPPUNIT_ASSERT_EQUAL((int)ZOK,rc); + CPPUNIT_ASSERT_EQUAL(ZOO_ASSOCIATING_STATE,zoo_state(zh)); + // receive the server handshake response + rc=zookeeper_process(zh,interest); + CPPUNIT_ASSERT_EQUAL((int)ZOK,rc); + // verify connected + CPPUNIT_ASSERT_EQUAL(ZOO_CONNECTED_STATE,zoo_state(zh)); + CPPUNIT_ASSERT(watcher.connected_); + CPPUNIT_ASSERT_EQUAL(1,watcher.counter_); + } + + // test case: connect to server, set a default watcher, disconnect from the server + // verify: the default watcher is called once + void testDefaultSessionWatcher2(){ + Mock_gettimeofday timeMock; + ZookeeperServer zkServer; + // must call zookeeper_close() while all the mocks are in scope + CloseFinally guard(&zh); + + DisconnectWatcher watcher; + zh=zookeeper_init("localhost:2121",activeWatcher,10000,TEST_CLIENT_ID, + &watcher,0); + CPPUNIT_ASSERT(zh!=0); + // simulate connected state + forceConnected(zh); + + // first operation + AsyncCompletion ignored; + zkServer.addOperationResponse(new ZooGetResponse("1",1)); + int rc=zoo_aget(zh,"/x/y/1",0,asyncCompletion,&ignored); + CPPUNIT_ASSERT_EQUAL((int)ZOK,rc); + // this will process the response and activate the watcher + rc=zookeeper_process(zh,ZOOKEEPER_READ); + CPPUNIT_ASSERT_EQUAL((int)ZOK,rc); + + // now, disconnect + zkServer.setConnectionLost(); + rc=zookeeper_process(zh,ZOOKEEPER_READ); + CPPUNIT_ASSERT_EQUAL((int)ZCONNECTIONLOSS,rc); + // verify disconnected + CPPUNIT_ASSERT(watcher.disconnected_); + CPPUNIT_ASSERT_EQUAL(1,watcher.counter_); + } + + // testcase: connect to the server, set a watcher object on a node, + // disconnect from the server + // verify: the watcher object as well as the default watcher are called + void testObjectSessionWatcher1(){ + Mock_gettimeofday timeMock; + ZookeeperServer zkServer; + // must call zookeeper_close() while all the mocks are in scope + CloseFinally guard(&zh); + + DisconnectWatcher defWatcher; + zh=zookeeper_init("localhost:2121",activeWatcher,10000,TEST_CLIENT_ID, + &defWatcher,0); + CPPUNIT_ASSERT(zh!=0); + // simulate connected state + forceConnected(zh); + + AsyncCompletion ignored; + CountingDataWatcher wobject; + zkServer.addOperationResponse(new ZooStatResponse); + int rc=zoo_awexists(zh,"/x/y/1",activeWatcher,&wobject, + asyncCompletion,&ignored); + CPPUNIT_ASSERT_EQUAL((int)ZOK,rc); + // this will process the response and activate the watcher + rc=zookeeper_process(zh,ZOOKEEPER_READ); + CPPUNIT_ASSERT_EQUAL((int)ZOK,rc); + + // now, disconnect + zkServer.setConnectionLost(); + rc=zookeeper_process(zh,ZOOKEEPER_READ); + CPPUNIT_ASSERT_EQUAL((int)ZCONNECTIONLOSS,rc); + + // verify the default watcher has been triggered + CPPUNIT_ASSERT(defWatcher.disconnected_); + // and triggered only once + CPPUNIT_ASSERT_EQUAL(1,defWatcher.counter_); + + // the path-specific watcher has been triggered as well + CPPUNIT_ASSERT(wobject.disconnected_); + // only once! + CPPUNIT_ASSERT_EQUAL(1,wobject.counter_); + } + + // testcase: connect to the server, set a watcher object on a node, + // set a def watcher on another node,disconnect from the server + // verify: the watcher object as well as the default watcher are called + void testObjectSessionWatcher2(){ + Mock_gettimeofday timeMock; + ZookeeperServer zkServer; + // must call zookeeper_close() while all the mocks are in scope + CloseFinally guard(&zh); + + DisconnectWatcher defWatcher; + zh=zookeeper_init("localhost:2121",activeWatcher,10000,TEST_CLIENT_ID, + &defWatcher,0); + CPPUNIT_ASSERT(zh!=0); + // simulate connected state + forceConnected(zh); + + // set the default watcher + AsyncCompletion ignored; + zkServer.addOperationResponse(new ZooStatResponse); + int rc=zoo_aexists(zh,"/a/b/c",1,asyncCompletion,&ignored); + CPPUNIT_ASSERT_EQUAL((int)ZOK,rc); + + CountingDataWatcher wobject; + zkServer.addOperationResponse(new ZooStatResponse); + rc=zoo_awexists(zh,"/x/y/z",activeWatcher,&wobject, + asyncCompletion,&ignored); + CPPUNIT_ASSERT_EQUAL((int)ZOK,rc); + + // this will process the response and activate the watcher + while((rc=zookeeper_process(zh,ZOOKEEPER_READ))==ZOK) { + millisleep(100); + } + CPPUNIT_ASSERT_EQUAL((int)ZNOTHING,rc); + + // disconnect now + zkServer.setConnectionLost(); + rc=zookeeper_process(zh,ZOOKEEPER_READ); + CPPUNIT_ASSERT_EQUAL((int)ZCONNECTIONLOSS,rc); + + // verify the default watcher has been triggered + CPPUNIT_ASSERT(defWatcher.disconnected_); + // and triggered only once + CPPUNIT_ASSERT_EQUAL(1,defWatcher.counter_); + + // the path-specific watcher has been triggered as well + CPPUNIT_ASSERT(wobject.disconnected_); + // only once! + CPPUNIT_ASSERT_EQUAL(1,wobject.counter_); + } + + // testcase: register 2 node watches for different paths, trigger the watches + // verify: the data watchers are processed, the default watcher is not called + void testNodeWatcher1(){ + Mock_gettimeofday timeMock; + ZookeeperServer zkServer; + // must call zookeeper_close() while all the mocks are in scope + CloseFinally guard(&zh); + + DisconnectWatcher defWatcher; + zh=zookeeper_init("localhost:2121",activeWatcher,10000,TEST_CLIENT_ID, + &defWatcher,0); + CPPUNIT_ASSERT(zh!=0); + // simulate connected state + forceConnected(zh); + + AsyncCompletion ignored; + CountingDataWatcher wobject1; + zkServer.addOperationResponse(new ZooStatResponse); + int rc=zoo_awexists(zh,"/a/b/c",activeWatcher,&wobject1, + asyncCompletion,&ignored); + CPPUNIT_ASSERT_EQUAL((int)ZOK,rc); + + CountingDataWatcher wobject2; + zkServer.addOperationResponse(new ZooStatResponse); + rc=zoo_awexists(zh,"/x/y/z",activeWatcher,&wobject2, + asyncCompletion,&ignored); + CPPUNIT_ASSERT_EQUAL((int)ZOK,rc); + + // this will process the response and activate the watcher + while((rc=zookeeper_process(zh,ZOOKEEPER_READ))==ZOK) { + millisleep(100); + } + CPPUNIT_ASSERT_EQUAL((int)ZNOTHING,rc); + + // we are all set now; let's trigger the watches + zkServer.addRecvResponse(new ZNodeEvent(ZOO_CHANGED_EVENT,"/a/b/c")); + zkServer.addRecvResponse(new ZNodeEvent(ZOO_CHANGED_EVENT,"/x/y/z")); + // make sure all watchers have been processed + while((rc=zookeeper_process(zh,ZOOKEEPER_READ))==ZOK) { + millisleep(100); + } + CPPUNIT_ASSERT_EQUAL((int)ZNOTHING,rc); + + CPPUNIT_ASSERT_EQUAL(1,wobject1.counter_); + CPPUNIT_ASSERT_EQUAL(1,wobject2.counter_); + CPPUNIT_ASSERT_EQUAL(0,defWatcher.counter_); + } + + // testcase: set up both a children and a data watchers on the node /a, then + // delete the node by sending a DELETE_EVENT event + // verify: both watchers are triggered + void testChildWatcher1(){ + Mock_gettimeofday timeMock; + ZookeeperServer zkServer; + // must call zookeeper_close() while all the mocks are in scope + CloseFinally guard(&zh); + + DeletionCountingDataWatcher defWatcher; + zh=zookeeper_init("localhost:2121",activeWatcher,10000,TEST_CLIENT_ID, + &defWatcher,0); + CPPUNIT_ASSERT(zh!=0); + // simulate connected state + forceConnected(zh); + + AsyncCompletion ignored; + DeletionCountingDataWatcher wobject1; + zkServer.addOperationResponse(new ZooStatResponse); + int rc=zoo_awexists(zh,"/a",activeWatcher,&wobject1, + asyncCompletion,&ignored); + CPPUNIT_ASSERT_EQUAL((int)ZOK,rc); + + typedef ZooGetChildrenResponse::StringVector ZooVector; + zkServer.addOperationResponse(new ZooGetChildrenResponse( + Util::CollectionBuilder()("/a/1")("/a/2") + )); + DeletionCountingDataWatcher wobject2; + rc=zoo_awget_children(zh,"/a",activeWatcher, + &wobject2,asyncCompletion,&ignored); + CPPUNIT_ASSERT_EQUAL((int)ZOK,rc); + + // this will process the response and activate the watcher + while((rc=zookeeper_process(zh,ZOOKEEPER_READ))==ZOK) { + millisleep(100); + } + CPPUNIT_ASSERT_EQUAL((int)ZNOTHING,rc); + + // we are all set now; let's trigger the watches + zkServer.addRecvResponse(new ZNodeEvent(ZOO_DELETED_EVENT,"/a")); + // make sure the watchers have been processed + while((rc=zookeeper_process(zh,ZOOKEEPER_READ))==ZOK) { + millisleep(100); + } + CPPUNIT_ASSERT_EQUAL((int)ZNOTHING,rc); + + CPPUNIT_ASSERT_EQUAL(1,wobject1.counter_); + CPPUNIT_ASSERT_EQUAL(1,wobject2.counter_); + CPPUNIT_ASSERT_EQUAL(0,defWatcher.counter_); + } + + // testcase: create both a child and data watch on the node /a, send a ZOO_CHILD_EVENT + // verify: only the child watch triggered + void testChildWatcher2(){ + Mock_gettimeofday timeMock; + ZookeeperServer zkServer; + // must call zookeeper_close() while all the mocks are in scope + CloseFinally guard(&zh); + + ChildEventCountingWatcher defWatcher; + zh=zookeeper_init("localhost:2121",activeWatcher,10000,TEST_CLIENT_ID, + &defWatcher,0); + CPPUNIT_ASSERT(zh!=0); + // simulate connected state + forceConnected(zh); + + AsyncCompletion ignored; + ChildEventCountingWatcher wobject1; + zkServer.addOperationResponse(new ZooStatResponse); + int rc=zoo_awexists(zh,"/a",activeWatcher,&wobject1, + asyncCompletion,&ignored); + CPPUNIT_ASSERT_EQUAL((int)ZOK,rc); + + typedef ZooGetChildrenResponse::StringVector ZooVector; + zkServer.addOperationResponse(new ZooGetChildrenResponse( + Util::CollectionBuilder()("/a/1")("/a/2") + )); + ChildEventCountingWatcher wobject2; + rc=zoo_awget_children(zh,"/a",activeWatcher, + &wobject2,asyncCompletion,&ignored); + CPPUNIT_ASSERT_EQUAL((int)ZOK,rc); + + // this will process the response and activate the watcher + while((rc=zookeeper_process(zh,ZOOKEEPER_READ))==ZOK) { + millisleep(100); + } + CPPUNIT_ASSERT_EQUAL((int)ZNOTHING,rc); + + // we are all set now; let's trigger the watches + zkServer.addRecvResponse(new ZNodeEvent(ZOO_CHILD_EVENT,"/a")); + // make sure the watchers have been processed + while((rc=zookeeper_process(zh,ZOOKEEPER_READ))==ZOK) { + millisleep(100); + } + CPPUNIT_ASSERT_EQUAL((int)ZNOTHING,rc); + + CPPUNIT_ASSERT_EQUAL(0,wobject1.counter_); + CPPUNIT_ASSERT_EQUAL(1,wobject2.counter_); + CPPUNIT_ASSERT_EQUAL(0,defWatcher.counter_); + } + +#else + // verify: the default watcher is called once for a session event + void testDefaultSessionWatcher1(){ + Mock_gettimeofday timeMock; + // zookeeper simulator + ZookeeperServer zkServer; + // detects when all watchers have been delivered + WatcherDeliveryTracker deliveryTracker(ZOO_SESSION_EVENT,ZOO_CONNECTED_STATE); + Mock_poll pollMock(&zkServer,ZookeeperServer::FD); + // must call zookeeper_close() while all the mocks are in the scope! + CloseFinally guard(&zh); + + ConnectionWatcher watcher; + zh=zookeeper_init("localhost:2121",activeWatcher,10000,TEST_CLIENT_ID, + &watcher,0); + CPPUNIT_ASSERT(zh!=0); + // wait till watcher proccessing has completed (the connection + // established event) + CPPUNIT_ASSERT(ensureCondition( + deliveryTracker.isWatcherProcessingCompleted(),1000)<1000); + + // verify the watcher has been triggered + CPPUNIT_ASSERT(ensureCondition(watcher.isConnectionEstablished(),1000)<1000); + // triggered only once + CPPUNIT_ASSERT_EQUAL(1,watcher.counter_); + } + + // test case: connect to server, set a default watcher, disconnect from the server + // verify: the default watcher is called once + void testDefaultSessionWatcher2(){ + Mock_gettimeofday timeMock; + // zookeeper simulator + ZookeeperServer zkServer; + Mock_poll pollMock(&zkServer,ZookeeperServer::FD); + // must call zookeeper_close() while all the mocks are in the scope! + CloseFinally guard(&zh); + + // detects when all watchers have been delivered + WatcherDeliveryTracker deliveryTracker(ZOO_SESSION_EVENT,ZOO_CONNECTING_STATE); + DisconnectWatcher watcher; + zh=zookeeper_init("localhost:2121",activeWatcher,10000,TEST_CLIENT_ID, + &watcher,0); + CPPUNIT_ASSERT(zh!=0); + // make sure the client has connected + CPPUNIT_ASSERT(ensureCondition(ClientConnected(zh),1000)<1000); + // set a default watch + AsyncCompletion ignored; + // a successful server response will activate the watcher + zkServer.addOperationResponse(new ZooStatResponse); + int rc=zoo_aexists(zh,"/x/y/z",1,asyncCompletion,&ignored); + CPPUNIT_ASSERT_EQUAL((int)ZOK,rc); + + // now, initiate a disconnect + zkServer.setConnectionLost(); + CPPUNIT_ASSERT(ensureCondition( + deliveryTracker.isWatcherProcessingCompleted(),1000)<1000); + + // verify the watcher has been triggered + CPPUNIT_ASSERT(watcher.disconnected_); + // triggered only once + CPPUNIT_ASSERT_EQUAL(1,watcher.counter_); + } + + // testcase: connect to the server, set a watcher object on a node, + // disconnect from the server + // verify: the watcher object as well as the default watcher are called + void testObjectSessionWatcher1(){ + Mock_gettimeofday timeMock; + // zookeeper simulator + ZookeeperServer zkServer; + Mock_poll pollMock(&zkServer,ZookeeperServer::FD); + // must call zookeeper_close() while all the mocks are in the scope! + CloseFinally guard(&zh); + + // detects when all watchers have been delivered + WatcherDeliveryTracker deliveryTracker(ZOO_SESSION_EVENT,ZOO_CONNECTING_STATE); + DisconnectWatcher defWatcher; + // use the tracker to find out when the watcher has been activated + WatcherActivationTracker activationTracker; + zh=zookeeper_init("localhost:2121",activeWatcher,10000,TEST_CLIENT_ID, + &defWatcher,0); + CPPUNIT_ASSERT(zh!=0); + // make sure the client has connected + CPPUNIT_ASSERT(ensureCondition(ClientConnected(zh),1000)<1000); + + AsyncCompletion ignored; + // this successful server response will activate the watcher + zkServer.addOperationResponse(new ZooStatResponse); + CountingDataWatcher wobject; + activationTracker.track(&wobject); + // set a path-specific watcher + int rc=zoo_awexists(zh,"/x/y/z",activeWatcher,&wobject, + asyncCompletion,&ignored); + CPPUNIT_ASSERT_EQUAL((int)ZOK,rc); + // make sure the watcher gets activated before we continue + CPPUNIT_ASSERT(ensureCondition(activationTracker.isWatcherActivated(),1000)<1000); + + // now, initiate a disconnect + zkServer.setConnectionLost(); + // make sure all watchers have been processed + CPPUNIT_ASSERT(ensureCondition( + deliveryTracker.isWatcherProcessingCompleted(),1000)<1000); + + // verify the default watcher has been triggered + CPPUNIT_ASSERT(defWatcher.disconnected_); + // and triggered only once + CPPUNIT_ASSERT_EQUAL(1,defWatcher.counter_); + + // the path-specific watcher has been triggered as well + CPPUNIT_ASSERT(wobject.disconnected_); + // only once! + CPPUNIT_ASSERT_EQUAL(1,wobject.counter_); + } + + // testcase: connect to the server, set a watcher object on a node, + // set a def watcher on another node,disconnect from the server + // verify: the watcher object as well as the default watcher are called + void testObjectSessionWatcher2(){ + Mock_gettimeofday timeMock; + // zookeeper simulator + ZookeeperServer zkServer; + Mock_poll pollMock(&zkServer,ZookeeperServer::FD); + // must call zookeeper_close() while all the mocks are in the scope! + CloseFinally guard(&zh); + + // detects when all watchers have been delivered + WatcherDeliveryTracker deliveryTracker(ZOO_SESSION_EVENT,ZOO_CONNECTING_STATE); + DisconnectWatcher defWatcher; + // use the tracker to find out when the watcher has been activated + WatcherActivationTracker activationTracker; + zh=zookeeper_init("localhost:2121",activeWatcher,10000,TEST_CLIENT_ID, + &defWatcher,0); + CPPUNIT_ASSERT(zh!=0); + // make sure the client has connected + CPPUNIT_ASSERT(ensureCondition(ClientConnected(zh),1000)<1000); + + // set a default watch + AsyncCompletion ignored; + // a successful server response will activate the watcher + zkServer.addOperationResponse(new ZooStatResponse); + activationTracker.track(&defWatcher); + int rc=zoo_aexists(zh,"/a/b/c",1,asyncCompletion,&ignored); + CPPUNIT_ASSERT_EQUAL((int)ZOK,rc); + // make sure the watcher gets activated before we continue + CPPUNIT_ASSERT(ensureCondition(activationTracker.isWatcherActivated(),1000)<1000); + + // this successful server response will activate the watcher + zkServer.addOperationResponse(new ZooStatResponse); + CountingDataWatcher wobject; + activationTracker.track(&wobject); + // set a path-specific watcher + rc=zoo_awexists(zh,"/x/y/z",activeWatcher,&wobject, + asyncCompletion,&ignored); + CPPUNIT_ASSERT_EQUAL((int)ZOK,rc); + // make sure the watcher gets activated before we continue + CPPUNIT_ASSERT(ensureCondition(activationTracker.isWatcherActivated(),1000)<1000); + + // now, initiate a disconnect + zkServer.setConnectionLost(); + // make sure all watchers have been processed + CPPUNIT_ASSERT(ensureCondition( + deliveryTracker.isWatcherProcessingCompleted(),1000)<1000); + + // verify the default watcher has been triggered + CPPUNIT_ASSERT(defWatcher.disconnected_); + // and triggered only once + CPPUNIT_ASSERT_EQUAL(1,defWatcher.counter_); + + // the path-specific watcher has been triggered as well + CPPUNIT_ASSERT(wobject.disconnected_); + // only once! + CPPUNIT_ASSERT_EQUAL(1,wobject.counter_); + } + + // testcase: register 2 node watches for different paths, trigger the watches + // verify: the data watchers are processed, the default watcher is not called + void testNodeWatcher1(){ + Mock_gettimeofday timeMock; + // zookeeper simulator + ZookeeperServer zkServer; + Mock_poll pollMock(&zkServer,ZookeeperServer::FD); + // must call zookeeper_close() while all the mocks are in the scope! + CloseFinally guard(&zh); + + // detects when all watchers have been delivered + WatcherDeliveryTracker deliveryTracker(ZOO_CHANGED_EVENT,0,false); + CountingDataWatcher defWatcher; + // use the tracker to find out when the watcher has been activated + WatcherActivationTracker activationTracker; + zh=zookeeper_init("localhost:2121",activeWatcher,10000,TEST_CLIENT_ID, + &defWatcher,0); + CPPUNIT_ASSERT(zh!=0); + // make sure the client has connected + CPPUNIT_ASSERT(ensureCondition(ClientConnected(zh),1000)<1000); + + // don't care about completions + AsyncCompletion ignored; + // set a one-shot watch + // a successful server response will activate the watcher + zkServer.addOperationResponse(new ZooStatResponse); + CountingDataWatcher wobject1; + activationTracker.track(&wobject1); + int rc=zoo_awexists(zh,"/a/b/c",activeWatcher,&wobject1, + asyncCompletion,&ignored); + CPPUNIT_ASSERT_EQUAL((int)ZOK,rc); + // make sure the watcher gets activated before we continue + CPPUNIT_ASSERT(ensureCondition(activationTracker.isWatcherActivated(),1000)<1000); + + // this successful server response will activate the watcher + zkServer.addOperationResponse(new ZooStatResponse); + CountingDataWatcher wobject2; + activationTracker.track(&wobject2); + // set a path-specific watcher + rc=zoo_awexists(zh,"/x/y/z",activeWatcher,&wobject2, + asyncCompletion,&ignored); + CPPUNIT_ASSERT_EQUAL((int)ZOK,rc); + // make sure the watcher gets activated before we continue + CPPUNIT_ASSERT(ensureCondition(activationTracker.isWatcherActivated(),1000)<1000); + + // we are all set now; let's trigger the watches + zkServer.addRecvResponse(new ZNodeEvent(ZOO_CHANGED_EVENT,"/a/b/c")); + zkServer.addRecvResponse(new ZNodeEvent(ZOO_CHANGED_EVENT,"/x/y/z")); + // make sure all watchers have been processed + CPPUNIT_ASSERT(ensureCondition( + deliveryTracker.deliveryCounterEquals(2),1000)<1000); + + CPPUNIT_ASSERT_EQUAL(1,wobject1.counter_); + CPPUNIT_ASSERT_EQUAL(1,wobject2.counter_); + CPPUNIT_ASSERT_EQUAL(0,defWatcher.counter_); + } + + // testcase: set up both a children and a data watchers on the node /a, then + // delete the node (that is, send a DELETE_EVENT) + // verify: both watchers are triggered + void testChildWatcher1(){ + Mock_gettimeofday timeMock; + // zookeeper simulator + ZookeeperServer zkServer; + Mock_poll pollMock(&zkServer,ZookeeperServer::FD); + // must call zookeeper_close() while all the mocks are in the scope! + CloseFinally guard(&zh); + + // detects when all watchers have been delivered + WatcherDeliveryTracker deliveryTracker(ZOO_DELETED_EVENT,0); + DeletionCountingDataWatcher defWatcher; + zh=zookeeper_init("localhost:2121",activeWatcher,10000,TEST_CLIENT_ID, + &defWatcher,0); + CPPUNIT_ASSERT(zh!=0); + // make sure the client has connected + CPPUNIT_ASSERT(ensureCondition(ClientConnected(zh),1000)<1000); + + // a successful server response will activate the watcher + zkServer.addOperationResponse(new ZooStatResponse); + DeletionCountingDataWatcher wobject1; + Stat stat; + // add a node watch + int rc=zoo_wexists(zh,"/a",activeWatcher,&wobject1,&stat); + CPPUNIT_ASSERT_EQUAL((int)ZOK,rc); + + typedef ZooGetChildrenResponse::StringVector ZooVector; + zkServer.addOperationResponse(new ZooGetChildrenResponse( + Util::CollectionBuilder()("/a/1")("/a/2") + )); + DeletionCountingDataWatcher wobject2; + String_vector children; + rc=zoo_wget_children(zh,"/a",activeWatcher,&wobject2,&children); + deallocate_String_vector(&children); + CPPUNIT_ASSERT_EQUAL((int)ZOK,rc); + + // we are all set now; let's trigger the watches + zkServer.addRecvResponse(new ZNodeEvent(ZOO_DELETED_EVENT,"/a")); + // make sure the watchers have been processed + CPPUNIT_ASSERT(ensureCondition( + deliveryTracker.isWatcherProcessingCompleted(),1000)<1000); + + CPPUNIT_ASSERT_EQUAL(1,wobject1.counter_); + CPPUNIT_ASSERT_EQUAL(1,wobject2.counter_); + CPPUNIT_ASSERT_EQUAL(0,defWatcher.counter_); + } + + // testcase: create both a child and data watch on the node /a, send a ZOO_CHILD_EVENT + // verify: only the child watch triggered + void testChildWatcher2(){ + Mock_gettimeofday timeMock; + // zookeeper simulator + ZookeeperServer zkServer; + Mock_poll pollMock(&zkServer,ZookeeperServer::FD); + // must call zookeeper_close() while all the mocks are in the scope! + CloseFinally guard(&zh); + + // detects when all watchers have been delivered + WatcherDeliveryTracker deliveryTracker(ZOO_CHILD_EVENT,0); + ChildEventCountingWatcher defWatcher; + zh=zookeeper_init("localhost:2121",activeWatcher,10000,TEST_CLIENT_ID, + &defWatcher,0); + CPPUNIT_ASSERT(zh!=0); + // make sure the client has connected + CPPUNIT_ASSERT(ensureCondition(ClientConnected(zh),1000)<1000); + // a successful server response will activate the watcher + zkServer.addOperationResponse(new ZooStatResponse); + ChildEventCountingWatcher wobject1; + Stat stat; + // add a node watch + int rc=zoo_wexists(zh,"/a",activeWatcher,&wobject1,&stat); + CPPUNIT_ASSERT_EQUAL((int)ZOK,rc); + + typedef ZooGetChildrenResponse::StringVector ZooVector; + zkServer.addOperationResponse(new ZooGetChildrenResponse( + Util::CollectionBuilder()("/a/1")("/a/2") + )); + ChildEventCountingWatcher wobject2; + String_vector children; + rc=zoo_wget_children(zh,"/a",activeWatcher,&wobject2,&children); + deallocate_String_vector(&children); + CPPUNIT_ASSERT_EQUAL((int)ZOK,rc); + + // we are all set now; let's trigger the watches + zkServer.addRecvResponse(new ZNodeEvent(ZOO_CHILD_EVENT,"/a")); + // make sure the watchers have been processed + CPPUNIT_ASSERT(ensureCondition( + deliveryTracker.isWatcherProcessingCompleted(),1000)<1000); + + CPPUNIT_ASSERT_EQUAL(0,wobject1.counter_); + CPPUNIT_ASSERT_EQUAL(1,wobject2.counter_); + CPPUNIT_ASSERT_EQUAL(0,defWatcher.counter_); + } + +#endif //THREADED +}; + +CPPUNIT_TEST_SUITE_REGISTRATION(Zookeeper_watchers); diff --git a/pkg/registry/zookeeper-3.4.6/src/c/tests/TestZookeeperClose.cc b/pkg/registry/zookeeper-3.4.6/src/c/tests/TestZookeeperClose.cc new file mode 100644 index 000000000..edefa66e9 --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/c/tests/TestZookeeperClose.cc @@ -0,0 +1,472 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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. + */ + +#include + +#include "ZKMocks.h" + +#ifdef THREADED +#include "PthreadMocks.h" +#endif + +using namespace std; + +class Zookeeper_close : public CPPUNIT_NS::TestFixture +{ + CPPUNIT_TEST_SUITE(Zookeeper_close); +#ifdef THREADED + CPPUNIT_TEST(testIOThreadStoppedOnExpire); +#endif + CPPUNIT_TEST(testCloseUnconnected); + CPPUNIT_TEST(testCloseUnconnected1); + CPPUNIT_TEST(testCloseConnected1); + CPPUNIT_TEST(testCloseFromWatcher1); + CPPUNIT_TEST_SUITE_END(); + zhandle_t *zh; + static void watcher(zhandle_t *, int, int, const char *,void*){} + FILE *logfile; +public: + + Zookeeper_close() { + logfile = openlogfile("Zookeeper_close"); + } + + ~Zookeeper_close() { + if (logfile) { + fflush(logfile); + fclose(logfile); + logfile = 0; + } + } + + void setUp() + { + zoo_set_log_stream(logfile); + + zoo_deterministic_conn_order(0); + zh=0; + } + + void tearDown() + { + zookeeper_close(zh); + } + + class CloseOnSessionExpired: public WatcherAction{ + public: + CloseOnSessionExpired(bool callClose=true): + callClose_(callClose),rc(ZOK){} + virtual void onSessionExpired(zhandle_t* zh){ + memcpy(&lzh,zh,sizeof(lzh)); + if(callClose_) + rc=zookeeper_close(zh); + } + zhandle_t lzh; + bool callClose_; + int rc; + }; + +#ifndef THREADED + void testCloseUnconnected() + { + zh=zookeeper_init("localhost:2121",watcher,10000,0,0,0); + CPPUNIT_ASSERT(zh!=0); + + // do not actually free the memory while in zookeeper_close() + Mock_free_noop freeMock; + // make a copy of zhandle before close() overwrites some of + // it members with NULLs + zhandle_t lzh; + memcpy(&lzh,zh,sizeof(lzh)); + int rc=zookeeper_close(zh); + zhandle_t* savezh=zh; zh=0; + freeMock.disable(); // disable mock's fake free()- use libc's free() instead + + // verify that zookeeper_close has done its job + CPPUNIT_ASSERT_EQUAL((int)ZOK,rc); + // memory + CPPUNIT_ASSERT_EQUAL(1,freeMock.getFreeCount(savezh)); + CPPUNIT_ASSERT_EQUAL(1,freeMock.getFreeCount(lzh.hostname)); + CPPUNIT_ASSERT_EQUAL(1,freeMock.getFreeCount(lzh.addrs)); + // This cannot be maintained properly CPPUNIT_ASSERT_EQUAL(9,freeMock.callCounter); + } + void testCloseUnconnected1() + { + zh=zookeeper_init("localhost:2121",watcher,10000,0,0,0); + CPPUNIT_ASSERT(zh!=0); + // simulate connected state + zh->fd=ZookeeperServer::FD; + zh->state=ZOO_CONNECTED_STATE; + Mock_flush_send_queue zkMock; + // do not actually free the memory while in zookeeper_close() + Mock_free_noop freeMock; + // make a copy of zhandle before close() overwrites some of + // it members with NULLs + zhandle_t lzh; + memcpy(&lzh,zh,sizeof(lzh)); + int rc=zookeeper_close(zh); + zhandle_t* savezh=zh; zh=0; + freeMock.disable(); // disable mock's fake free()- use libc's free() instead + + // verify that zookeeper_close has done its job + CPPUNIT_ASSERT_EQUAL((int)ZOK,rc); + // memory + CPPUNIT_ASSERT_EQUAL(1,freeMock.getFreeCount(savezh)); + CPPUNIT_ASSERT_EQUAL(1,freeMock.getFreeCount(lzh.hostname)); + CPPUNIT_ASSERT_EQUAL(1,freeMock.getFreeCount(lzh.addrs)); + // the close request sent? + CPPUNIT_ASSERT_EQUAL(1,zkMock.counter); + } + void testCloseConnected1() + { + ZookeeperServer zkServer; + // poll() will called from zookeeper_close() + Mock_poll pollMock(&zkServer,ZookeeperServer::FD); + + zh=zookeeper_init("localhost:2121",watcher,10000,TEST_CLIENT_ID,0,0); + CPPUNIT_ASSERT(zh!=0); + + Mock_gettimeofday timeMock; + + int fd=0; + int interest=0; + timeval tv; + int rc=zookeeper_interest(zh,&fd,&interest,&tv); + + CPPUNIT_ASSERT_EQUAL((int)ZOK,rc); + CPPUNIT_ASSERT_EQUAL(ZOO_CONNECTING_STATE,zoo_state(zh)); + CPPUNIT_ASSERT_EQUAL(ZOOKEEPER_READ|ZOOKEEPER_WRITE,interest); + + rc=zookeeper_process(zh,interest); + CPPUNIT_ASSERT_EQUAL((int)ZOK,rc); + CPPUNIT_ASSERT_EQUAL(ZOO_ASSOCIATING_STATE,zoo_state(zh)); + + rc=zookeeper_interest(zh,&fd,&interest,&tv); + CPPUNIT_ASSERT_EQUAL((int)ZOK,rc); + rc=zookeeper_process(zh,interest); + CPPUNIT_ASSERT_EQUAL((int)ZOK,rc); + CPPUNIT_ASSERT_EQUAL(ZOO_CONNECTED_STATE,zoo_state(zh)); + // do not actually free the memory while in zookeeper_close() + Mock_free_noop freeMock; + // make a copy of zhandle before close() overwrites some of + // it members with NULLs + zhandle_t lzh; + memcpy(&lzh,zh,sizeof(lzh)); + zookeeper_close(zh); + zhandle_t* savezh=zh; zh=0; + freeMock.disable(); // disable mock's fake free()- use libc's free() instead + // memory + CPPUNIT_ASSERT_EQUAL(1,freeMock.getFreeCount(savezh)); + CPPUNIT_ASSERT_EQUAL(1,freeMock.getFreeCount(lzh.hostname)); + CPPUNIT_ASSERT_EQUAL(1,freeMock.getFreeCount(lzh.addrs)); + // the close request sent? + CPPUNIT_ASSERT_EQUAL(1,(int)zkServer.closeSent); + } + void testCloseFromWatcher1() + { + Mock_gettimeofday timeMock; + + ZookeeperServer zkServer; + // make the server return a non-matching session id + zkServer.returnSessionExpired(); + // poll() will called from zookeeper_close() + Mock_poll pollMock(&zkServer,ZookeeperServer::FD); + + CloseOnSessionExpired closeAction; + zh=zookeeper_init("localhost:2121",activeWatcher,10000, + TEST_CLIENT_ID,&closeAction,0); + CPPUNIT_ASSERT(zh!=0); + + int fd=0; + int interest=0; + timeval tv; + // initiate connection + int rc=zookeeper_interest(zh,&fd,&interest,&tv); + CPPUNIT_ASSERT_EQUAL((int)ZOK,rc); + CPPUNIT_ASSERT_EQUAL(ZOO_CONNECTING_STATE,zoo_state(zh)); + CPPUNIT_ASSERT_EQUAL(ZOOKEEPER_READ|ZOOKEEPER_WRITE,interest); + rc=zookeeper_process(zh,interest); + // make sure the handshake in progress + CPPUNIT_ASSERT_EQUAL((int)ZOK,rc); + CPPUNIT_ASSERT_EQUAL(ZOO_ASSOCIATING_STATE,zoo_state(zh)); + rc=zookeeper_interest(zh,&fd,&interest,&tv); + CPPUNIT_ASSERT_EQUAL((int)ZOK,rc); + + // do not actually free the memory while in zookeeper_close() + Mock_free_noop freeMock; + // should call the watcher with ZOO_EXPIRED_SESSION_STATE state + rc=zookeeper_process(zh,interest); + zhandle_t* savezh=zh; zh=0; + freeMock.disable(); // disable mock's fake free()- use libc's free() instead + + CPPUNIT_ASSERT_EQUAL(ZOO_EXPIRED_SESSION_STATE,zoo_state(savezh)); + // memory + CPPUNIT_ASSERT_EQUAL(1,freeMock.getFreeCount(savezh)); + CPPUNIT_ASSERT_EQUAL(1,freeMock.getFreeCount(closeAction.lzh.hostname)); + CPPUNIT_ASSERT_EQUAL(1,freeMock.getFreeCount(closeAction.lzh.addrs)); + // make sure the close request NOT sent + CPPUNIT_ASSERT_EQUAL(0,(int)zkServer.closeSent); + } +#else + void testCloseUnconnected() + { + // disable threading + MockPthreadZKNull pthreadMock; + zh=zookeeper_init("localhost:2121",watcher,10000,0,0,0); + + CPPUNIT_ASSERT(zh!=0); + adaptor_threads* adaptor=(adaptor_threads*)zh->adaptor_priv; + CPPUNIT_ASSERT(adaptor!=0); + + // do not actually free the memory while in zookeeper_close() + Mock_free_noop freeMock; + // make a copy of zhandle before close() overwrites some of + // it members with NULLs + zhandle_t lzh; + memcpy(&lzh,zh,sizeof(lzh)); + int rc=zookeeper_close(zh); + zhandle_t* savezh=zh; zh=0; + // we're done, disable mock's fake free(), use libc's free() instead + freeMock.disable(); + + // verify that zookeeper_close has done its job + CPPUNIT_ASSERT_EQUAL((int)ZOK,rc); + // memory + CPPUNIT_ASSERT_EQUAL(1,freeMock.getFreeCount(savezh)); + CPPUNIT_ASSERT_EQUAL(1,freeMock.getFreeCount(lzh.hostname)); + CPPUNIT_ASSERT_EQUAL(1,freeMock.getFreeCount(lzh.addrs)); + CPPUNIT_ASSERT_EQUAL(1,freeMock.getFreeCount(adaptor)); + // Cannot be maintained accurately: CPPUNIT_ASSERT_EQUAL(10,freeMock.callCounter); + // threads + CPPUNIT_ASSERT_EQUAL(1,MockPthreadsNull::getDestroyCounter(adaptor->io)); + CPPUNIT_ASSERT_EQUAL(1,MockPthreadsNull::getDestroyCounter(adaptor->completion)); + // mutexes + CPPUNIT_ASSERT_EQUAL(1,MockPthreadsNull::getDestroyCounter(&savezh->to_process.lock)); + CPPUNIT_ASSERT_EQUAL(0,MockPthreadsNull::getInvalidAccessCounter(&savezh->to_process.lock)); + CPPUNIT_ASSERT_EQUAL(1,MockPthreadsNull::getDestroyCounter(&savezh->to_send.lock)); + CPPUNIT_ASSERT_EQUAL(0,MockPthreadsNull::getInvalidAccessCounter(&savezh->to_send.lock)); + CPPUNIT_ASSERT_EQUAL(1,MockPthreadsNull::getDestroyCounter(&savezh->sent_requests.lock)); + CPPUNIT_ASSERT_EQUAL(0,MockPthreadsNull::getInvalidAccessCounter(&savezh->sent_requests.lock)); + CPPUNIT_ASSERT_EQUAL(1,MockPthreadsNull::getDestroyCounter(&savezh->completions_to_process.lock)); + CPPUNIT_ASSERT_EQUAL(0,MockPthreadsNull::getInvalidAccessCounter(&savezh->completions_to_process.lock)); + // conditionals + CPPUNIT_ASSERT_EQUAL(1,MockPthreadsNull::getDestroyCounter(&savezh->sent_requests.cond)); + CPPUNIT_ASSERT_EQUAL(0,MockPthreadsNull::getInvalidAccessCounter(&savezh->sent_requests.cond)); + CPPUNIT_ASSERT_EQUAL(1,MockPthreadsNull::getDestroyCounter(&savezh->completions_to_process.cond)); + CPPUNIT_ASSERT_EQUAL(0,MockPthreadsNull::getInvalidAccessCounter(&savezh->completions_to_process.cond)); + } + void testCloseUnconnected1() + { + for(int i=0; i<100;i++){ + zh=zookeeper_init("localhost:2121",watcher,10000,0,0,0); + CPPUNIT_ASSERT(zh!=0); + adaptor_threads* adaptor=(adaptor_threads*)zh->adaptor_priv; + CPPUNIT_ASSERT(adaptor!=0); + int rc=zookeeper_close(zh); + zh=0; + CPPUNIT_ASSERT_EQUAL((int)ZOK,rc); + } + } + void testCloseConnected1() + { + // frozen time -- no timeouts and no pings + Mock_gettimeofday timeMock; + + for(int i=0;i<100;i++){ + ZookeeperServer zkServer; + Mock_poll pollMock(&zkServer,ZookeeperServer::FD); + // use a checked version of pthread calls + CheckedPthread threadMock; + // do not actually free the memory while in zookeeper_close() + Mock_free_noop freeMock; + + zh=zookeeper_init("localhost:2121",watcher,10000,TEST_CLIENT_ID,0,0); + CPPUNIT_ASSERT(zh!=0); + // make sure the client has connected + CPPUNIT_ASSERT(ensureCondition(ClientConnected(zh),1000)<1000); + // make a copy of zhandle before close() overwrites some of + // its members with NULLs + zhandle_t lzh; + memcpy(&lzh,zh,sizeof(lzh)); + int rc=zookeeper_close(zh); + zhandle_t* savezh=zh; zh=0; + // we're done, disable mock's fake free(), use libc's free() instead + freeMock.disable(); + + CPPUNIT_ASSERT_EQUAL((int)ZOK,rc); + adaptor_threads* adaptor=(adaptor_threads*)lzh.adaptor_priv; + // memory + CPPUNIT_ASSERT_EQUAL(1,freeMock.getFreeCount(savezh)); + CPPUNIT_ASSERT_EQUAL(1,freeMock.getFreeCount(lzh.hostname)); + CPPUNIT_ASSERT_EQUAL(1,freeMock.getFreeCount(lzh.addrs)); + CPPUNIT_ASSERT_EQUAL(1,freeMock.getFreeCount(adaptor)); + // threads + CPPUNIT_ASSERT_EQUAL(1,CheckedPthread::getDestroyCounter(adaptor->io)); + CPPUNIT_ASSERT_EQUAL(1,CheckedPthread::getDestroyCounter(adaptor->completion)); + // mutexes + CPPUNIT_ASSERT_EQUAL(1,CheckedPthread::getDestroyCounter(&savezh->to_process.lock)); + CPPUNIT_ASSERT_EQUAL(0,CheckedPthread::getInvalidAccessCounter(&savezh->to_process.lock)); + CPPUNIT_ASSERT_EQUAL(1,CheckedPthread::getDestroyCounter(&savezh->to_send.lock)); + CPPUNIT_ASSERT_EQUAL(0,CheckedPthread::getInvalidAccessCounter(&savezh->to_send.lock)); + CPPUNIT_ASSERT_EQUAL(1,CheckedPthread::getDestroyCounter(&savezh->sent_requests.lock)); + CPPUNIT_ASSERT_EQUAL(0,CheckedPthread::getInvalidAccessCounter(&savezh->sent_requests.lock)); + CPPUNIT_ASSERT_EQUAL(1,CheckedPthread::getDestroyCounter(&savezh->completions_to_process.lock)); + CPPUNIT_ASSERT_EQUAL(0,CheckedPthread::getInvalidAccessCounter(&savezh->completions_to_process.lock)); + // conditionals + CPPUNIT_ASSERT_EQUAL(1,CheckedPthread::getDestroyCounter(&savezh->sent_requests.cond)); + CPPUNIT_ASSERT_EQUAL(0,CheckedPthread::getInvalidAccessCounter(&savezh->sent_requests.cond)); + CPPUNIT_ASSERT_EQUAL(1,CheckedPthread::getDestroyCounter(&savezh->completions_to_process.cond)); + CPPUNIT_ASSERT_EQUAL(0,CheckedPthread::getInvalidAccessCounter(&savezh->completions_to_process.cond)); + } + } + + struct PointerFreed{ + PointerFreed(Mock_free_noop& freeMock,void* ptr): + freeMock_(freeMock),ptr_(ptr){} + bool operator()() const{return freeMock_.isFreed(ptr_); } + Mock_free_noop& freeMock_; + void* ptr_; + }; + // test if zookeeper_close may be called from a watcher callback on + // SESSION_EXPIRED event + void testCloseFromWatcher1() + { + // frozen time -- no timeouts and no pings + Mock_gettimeofday timeMock; + + for(int i=0;i<100;i++){ + ZookeeperServer zkServer; + // make the server return a non-matching session id + zkServer.returnSessionExpired(); + + Mock_poll pollMock(&zkServer,ZookeeperServer::FD); + // use a checked version of pthread calls + CheckedPthread threadMock; + // do not actually free the memory while in zookeeper_close() + Mock_free_noop freeMock; + + CloseOnSessionExpired closeAction; + zh=zookeeper_init("localhost:2121",activeWatcher,10000, + TEST_CLIENT_ID,&closeAction,0); + + CPPUNIT_ASSERT(zh!=0); + // we rely on the fact that zh is freed the last right before + // zookeeper_close() returns... + CPPUNIT_ASSERT(ensureCondition(PointerFreed(freeMock,zh),1000)<1000); + zhandle_t* lzh=zh; + zh=0; + // we're done, disable mock's fake free(), use libc's free() instead + freeMock.disable(); + + CPPUNIT_ASSERT_EQUAL((int)ZOK,closeAction.rc); + adaptor_threads* adaptor=(adaptor_threads*)closeAction.lzh.adaptor_priv; + // memory + CPPUNIT_ASSERT_EQUAL(1,freeMock.getFreeCount(lzh)); + CPPUNIT_ASSERT_EQUAL(1,freeMock.getFreeCount(closeAction.lzh.hostname)); + CPPUNIT_ASSERT_EQUAL(1,freeMock.getFreeCount(closeAction.lzh.addrs)); + CPPUNIT_ASSERT_EQUAL(1,freeMock.getFreeCount(adaptor)); + // threads + CPPUNIT_ASSERT_EQUAL(1,CheckedPthread::getDestroyCounter(adaptor->io)); + CPPUNIT_ASSERT_EQUAL(1,CheckedPthread::getDestroyCounter(adaptor->completion)); + // mutexes + CPPUNIT_ASSERT_EQUAL(1,CheckedPthread::getDestroyCounter(&lzh->to_process.lock)); + CPPUNIT_ASSERT_EQUAL(0,CheckedPthread::getInvalidAccessCounter(&lzh->to_process.lock)); + CPPUNIT_ASSERT_EQUAL(1,CheckedPthread::getDestroyCounter(&lzh->to_send.lock)); + CPPUNIT_ASSERT_EQUAL(0,CheckedPthread::getInvalidAccessCounter(&lzh->to_send.lock)); + CPPUNIT_ASSERT_EQUAL(1,CheckedPthread::getDestroyCounter(&lzh->sent_requests.lock)); + CPPUNIT_ASSERT_EQUAL(0,CheckedPthread::getInvalidAccessCounter(&lzh->sent_requests.lock)); + CPPUNIT_ASSERT_EQUAL(1,CheckedPthread::getDestroyCounter(&lzh->completions_to_process.lock)); + CPPUNIT_ASSERT_EQUAL(0,CheckedPthread::getInvalidAccessCounter(&lzh->completions_to_process.lock)); + // conditionals + CPPUNIT_ASSERT_EQUAL(1,CheckedPthread::getDestroyCounter(&lzh->sent_requests.cond)); + CPPUNIT_ASSERT_EQUAL(0,CheckedPthread::getInvalidAccessCounter(&lzh->sent_requests.cond)); + CPPUNIT_ASSERT_EQUAL(1,CheckedPthread::getDestroyCounter(&lzh->completions_to_process.cond)); + CPPUNIT_ASSERT_EQUAL(0,CheckedPthread::getInvalidAccessCounter(&lzh->completions_to_process.cond)); + } + } + + void testIOThreadStoppedOnExpire() + { + // frozen time -- no timeouts and no pings + Mock_gettimeofday timeMock; + + for(int i=0;i<100;i++){ + ZookeeperServer zkServer; + // make the server return a non-matching session id + zkServer.returnSessionExpired(); + + Mock_poll pollMock(&zkServer,ZookeeperServer::FD); + // use a checked version of pthread calls + CheckedPthread threadMock; + // do not call zookeeper_close() from the watcher + CloseOnSessionExpired closeAction(false); + zh=zookeeper_init("localhost:2121",activeWatcher,10000, + &testClientId,&closeAction,0); + + // this is to ensure that if any assert fires, zookeeper_close() + // will still be called while all the mocks are in the scope! + CloseFinally guard(&zh); + + CPPUNIT_ASSERT(zh!=0); + CPPUNIT_ASSERT(ensureCondition(SessionExpired(zh),1000)<1000); + CPPUNIT_ASSERT(ensureCondition(IOThreadStopped(zh),1000)<1000); + // make sure the watcher has been processed + CPPUNIT_ASSERT(ensureCondition(closeAction.isWatcherTriggered(),1000)<1000); + // make sure the threads have not been destroyed yet + adaptor_threads* adaptor=(adaptor_threads*)zh->adaptor_priv; + CPPUNIT_ASSERT_EQUAL(0,CheckedPthread::getDestroyCounter(adaptor->io)); + CPPUNIT_ASSERT_EQUAL(0,CheckedPthread::getDestroyCounter(adaptor->completion)); + // about to call zookeeper_close() -- no longer need the guard + guard.disarm(); + + // do not actually free the memory while in zookeeper_close() + Mock_free_noop freeMock; + zookeeper_close(zh); + zhandle_t* lzh=zh; zh=0; + // we're done, disable mock's fake free(), use libc's free() instead + freeMock.disable(); + + // memory + CPPUNIT_ASSERT_EQUAL(1,freeMock.getFreeCount(lzh)); + CPPUNIT_ASSERT_EQUAL(1,freeMock.getFreeCount(closeAction.lzh.hostname)); + CPPUNIT_ASSERT_EQUAL(1,freeMock.getFreeCount(closeAction.lzh.addrs)); + CPPUNIT_ASSERT_EQUAL(1,freeMock.getFreeCount(adaptor)); + // threads + CPPUNIT_ASSERT_EQUAL(1,CheckedPthread::getDestroyCounter(adaptor->io)); + CPPUNIT_ASSERT_EQUAL(1,CheckedPthread::getDestroyCounter(adaptor->completion)); + // mutexes + CPPUNIT_ASSERT_EQUAL(1,CheckedPthread::getDestroyCounter(&lzh->to_process.lock)); + CPPUNIT_ASSERT_EQUAL(0,CheckedPthread::getInvalidAccessCounter(&lzh->to_process.lock)); + CPPUNIT_ASSERT_EQUAL(1,CheckedPthread::getDestroyCounter(&lzh->to_send.lock)); + CPPUNIT_ASSERT_EQUAL(0,CheckedPthread::getInvalidAccessCounter(&lzh->to_send.lock)); + CPPUNIT_ASSERT_EQUAL(1,CheckedPthread::getDestroyCounter(&lzh->sent_requests.lock)); + CPPUNIT_ASSERT_EQUAL(0,CheckedPthread::getInvalidAccessCounter(&lzh->sent_requests.lock)); + CPPUNIT_ASSERT_EQUAL(1,CheckedPthread::getDestroyCounter(&lzh->completions_to_process.lock)); + CPPUNIT_ASSERT_EQUAL(0,CheckedPthread::getInvalidAccessCounter(&lzh->completions_to_process.lock)); + // conditionals + CPPUNIT_ASSERT_EQUAL(1,CheckedPthread::getDestroyCounter(&lzh->sent_requests.cond)); + CPPUNIT_ASSERT_EQUAL(0,CheckedPthread::getInvalidAccessCounter(&lzh->sent_requests.cond)); + CPPUNIT_ASSERT_EQUAL(1,CheckedPthread::getDestroyCounter(&lzh->completions_to_process.cond)); + CPPUNIT_ASSERT_EQUAL(0,CheckedPthread::getInvalidAccessCounter(&lzh->completions_to_process.cond)); + } + } + +#endif +}; + +CPPUNIT_TEST_SUITE_REGISTRATION(Zookeeper_close); diff --git a/pkg/registry/zookeeper-3.4.6/src/c/tests/TestZookeeperInit.cc b/pkg/registry/zookeeper-3.4.6/src/c/tests/TestZookeeperInit.cc new file mode 100644 index 000000000..eadf41d2d --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/c/tests/TestZookeeperInit.cc @@ -0,0 +1,301 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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. + */ + +#include +#include +#include +#include + +#include "Util.h" +#include "LibCMocks.h" +#include "ZKMocks.h" + +#ifdef THREADED +#include "PthreadMocks.h" +#else +class MockPthreadsNull; +#endif + +using namespace std; + +class Zookeeper_init : public CPPUNIT_NS::TestFixture +{ + CPPUNIT_TEST_SUITE(Zookeeper_init); + CPPUNIT_TEST(testBasic); + CPPUNIT_TEST(testAddressResolution); + CPPUNIT_TEST(testMultipleAddressResolution); + CPPUNIT_TEST(testNullAddressString); + CPPUNIT_TEST(testEmptyAddressString); + CPPUNIT_TEST(testOneSpaceAddressString); + CPPUNIT_TEST(testTwoSpacesAddressString); + CPPUNIT_TEST(testInvalidAddressString1); + CPPUNIT_TEST(testInvalidAddressString2); + CPPUNIT_TEST(testNonexistentHost); + CPPUNIT_TEST(testOutOfMemory_init); + CPPUNIT_TEST(testOutOfMemory_getaddrs1); +#if !defined(__CYGWIN__) // not valid for cygwin + CPPUNIT_TEST(testOutOfMemory_getaddrs2); +#endif + CPPUNIT_TEST(testPermuteAddrsList); + CPPUNIT_TEST_SUITE_END(); + zhandle_t *zh; + MockPthreadsNull* pthreadMock; + static void watcher(zhandle_t *, int , int , const char *,void*){} + FILE *logfile; +public: + Zookeeper_init():zh(0),pthreadMock(0){ + logfile = openlogfile("Zookeeper_init"); + } + + ~Zookeeper_init() { + if (logfile) { + fflush(logfile); + fclose(logfile); + logfile = 0; + } + } + + void setUp() + { + zoo_set_log_stream(logfile); + + zoo_deterministic_conn_order(0); +#ifdef THREADED + // disable threading + pthreadMock=new MockPthreadZKNull; +#endif + zh=0; + } + + void tearDown() + { + zookeeper_close(zh); +#ifdef THREADED + delete pthreadMock; +#endif + } + + void testBasic() + { + const string EXPECTED_HOST("127.0.0.1:2121"); + const int EXPECTED_ADDRS_COUNT =1; + const int EXPECTED_RECV_TIMEOUT=10000; + clientid_t cid; + memset(&cid,0xFE,sizeof(cid)); + + zh=zookeeper_init(EXPECTED_HOST.c_str(),watcher,EXPECTED_RECV_TIMEOUT, + &cid,(void*)1,0); + + CPPUNIT_ASSERT(zh!=0); + CPPUNIT_ASSERT(zh->fd == -1); + CPPUNIT_ASSERT(zh->hostname!=0); + CPPUNIT_ASSERT_EQUAL(EXPECTED_ADDRS_COUNT,zh->addrs_count); + CPPUNIT_ASSERT_EQUAL(EXPECTED_HOST,string(zh->hostname)); + CPPUNIT_ASSERT(zh->state == NOTCONNECTED_STATE_DEF); + CPPUNIT_ASSERT(zh->context == (void*)1); + CPPUNIT_ASSERT_EQUAL(EXPECTED_RECV_TIMEOUT,zh->recv_timeout); + CPPUNIT_ASSERT(zh->watcher == watcher); + CPPUNIT_ASSERT(zh->connect_index==0); + CPPUNIT_ASSERT(zh->primer_buffer.buffer==zh->primer_storage_buffer); + CPPUNIT_ASSERT(zh->primer_buffer.curr_offset ==0); + CPPUNIT_ASSERT(zh->primer_buffer.len == sizeof(zh->primer_storage_buffer)); + CPPUNIT_ASSERT(zh->primer_buffer.next == 0); + CPPUNIT_ASSERT(zh->last_zxid ==0); + CPPUNIT_ASSERT(memcmp(&zh->client_id,&cid,sizeof(cid))==0); + +#ifdef THREADED + // thread specific checks + adaptor_threads* adaptor=(adaptor_threads*)zh->adaptor_priv; + CPPUNIT_ASSERT(adaptor!=0); + CPPUNIT_ASSERT(pthreadMock->pthread_createCounter==2); + CPPUNIT_ASSERT(MockPthreadsNull::isInitialized(adaptor->io)); + CPPUNIT_ASSERT(MockPthreadsNull::isInitialized(adaptor->completion)); + CPPUNIT_ASSERT(MockPthreadsNull::isInitialized(&zh->to_process.lock)); + CPPUNIT_ASSERT(MockPthreadsNull::isInitialized(&zh->to_send.lock)); + CPPUNIT_ASSERT(MockPthreadsNull::isInitialized(&zh->sent_requests.lock)); + CPPUNIT_ASSERT(MockPthreadsNull::isInitialized(&zh->completions_to_process.lock)); + CPPUNIT_ASSERT(MockPthreadsNull::isInitialized(&zh->sent_requests.cond)); + CPPUNIT_ASSERT(MockPthreadsNull::isInitialized(&zh->completions_to_process.cond)); +#endif + } + void testAddressResolution() + { + const char EXPECTED_IPS[][4]={{127,0,0,1}}; + const int EXPECTED_ADDRS_COUNT =COUNTOF(EXPECTED_IPS); + + zoo_deterministic_conn_order(1); + zh=zookeeper_init("127.0.0.1:2121",0,10000,0,0,0); + + CPPUNIT_ASSERT(zh!=0); + CPPUNIT_ASSERT_EQUAL(EXPECTED_ADDRS_COUNT,zh->addrs_count); + for(int i=0;iaddrs_count;i++){ + sockaddr_in* addr=(struct sockaddr_in*)&zh->addrs[i]; + CPPUNIT_ASSERT(memcmp(EXPECTED_IPS[i],&addr->sin_addr,sizeof(addr->sin_addr))==0); + CPPUNIT_ASSERT_EQUAL(2121,(int)ntohs(addr->sin_port)); + } + } + void testMultipleAddressResolution() + { + const string EXPECTED_HOST("127.0.0.1:2121,127.0.0.2:3434"); + const char EXPECTED_IPS[][4]={{127,0,0,1},{127,0,0,2}}; + const int EXPECTED_ADDRS_COUNT =COUNTOF(EXPECTED_IPS); + + zoo_deterministic_conn_order(1); + zh=zookeeper_init(EXPECTED_HOST.c_str(),0,1000,0,0,0); + + CPPUNIT_ASSERT(zh!=0); + CPPUNIT_ASSERT_EQUAL(EXPECTED_ADDRS_COUNT,zh->addrs_count); + + for(int i=0;iaddrs_count;i++){ + sockaddr_in* addr=(struct sockaddr_in*)&zh->addrs[i]; + CPPUNIT_ASSERT(memcmp(EXPECTED_IPS[i],&addr->sin_addr,sizeof(addr->sin_addr))==0); + if(i<1) + CPPUNIT_ASSERT_EQUAL(2121,(int)ntohs(addr->sin_port)); + else + CPPUNIT_ASSERT_EQUAL(3434,(int)ntohs(addr->sin_port)); + } + } + void testMultipleAddressWithSpace() + { + const string EXPECTED_HOST("127.0.0.1:2121, 127.0.0.2:3434"); + const char EXPECTED_IPS[][4]={{127,0,0,1},{127,0,0,2}}; + const int EXPECTED_ADDRS_COUNT =COUNTOF(EXPECTED_IPS); + + zoo_deterministic_conn_order(1); + zh=zookeeper_init(EXPECTED_HOST.c_str(),0,1000,0,0,0); + + CPPUNIT_ASSERT(zh!=0); + CPPUNIT_ASSERT_EQUAL(EXPECTED_ADDRS_COUNT,zh->addrs_count); + + for(int i=0;iaddrs_count;i++){ + sockaddr_in* addr=(struct sockaddr_in*)&zh->addrs[i]; + CPPUNIT_ASSERT(memcmp(EXPECTED_IPS[i],&addr->sin_addr,sizeof(addr->sin_addr))==0); + if(i<1) + CPPUNIT_ASSERT_EQUAL(2121,(int)ntohs(addr->sin_port)); + else + CPPUNIT_ASSERT_EQUAL(3434,(int)ntohs(addr->sin_port)); + } + } + void testNullAddressString() + { + zh=zookeeper_init(NULL,0,0,0,0,0); + CPPUNIT_ASSERT(zh==0); + CPPUNIT_ASSERT_EQUAL(EINVAL,errno); + } + void testEmptyAddressString() + { + const string INVALID_HOST(""); + zh=zookeeper_init(INVALID_HOST.c_str(),0,0,0,0,0); + CPPUNIT_ASSERT(zh==0); + CPPUNIT_ASSERT_EQUAL(EINVAL,errno); + } + void testOneSpaceAddressString() + { + const string INVALID_HOST(" "); + zh=zookeeper_init(INVALID_HOST.c_str(),0,0,0,0,0); + CPPUNIT_ASSERT(zh==0); + CPPUNIT_ASSERT_EQUAL(EINVAL,errno); + } + void testTwoSpacesAddressString() + { + const string INVALID_HOST(" "); + zh=zookeeper_init(INVALID_HOST.c_str(),0,0,0,0,0); + CPPUNIT_ASSERT(zh==0); + CPPUNIT_ASSERT_EQUAL(EINVAL,errno); + } + void testInvalidAddressString1() + { + const string INVALID_HOST("host1"); + zh=zookeeper_init(INVALID_HOST.c_str(),0,0,0,0,0); + CPPUNIT_ASSERT(zh==0); + CPPUNIT_ASSERT_EQUAL(EINVAL,errno); + } + void testInvalidAddressString2() + { + const string INVALID_HOST("host1:1111+host:123"); + zh=zookeeper_init(INVALID_HOST.c_str(),0,0,0,0,0); + CPPUNIT_ASSERT(zh==0); + CPPUNIT_ASSERT((ENOENT|EINVAL) & errno); + } + void testNonexistentHost() + { + const string EXPECTED_HOST("host1.blabadibla.bla.:1111"); + + zh=zookeeper_init(EXPECTED_HOST.c_str(),0,0,0,0,0); + + CPPUNIT_ASSERT(zh==0); + //With the switch to thread safe getaddrinfo, we don't get + //these global variables + //CPPUNIT_ASSERT_EQUAL(EINVAL,errno); + //CPPUNIT_ASSERT_EQUAL(HOST_NOT_FOUND,h_errno); + } + void testOutOfMemory_init() + { + Mock_calloc mock; + mock.callsBeforeFailure=0; // fail first calloc in init() + + zh=zookeeper_init("ahost:123",watcher,10000,0,0,0); + + CPPUNIT_ASSERT(zh==0); + CPPUNIT_ASSERT_EQUAL(ENOMEM,errno); + } + void testOutOfMemory_getaddrs1() + { + Mock_realloc reallocMock; + reallocMock.callsBeforeFailure=0; // fail on first call to realloc + + zh=zookeeper_init("127.0.0.1:123",0,0,0,0,0); + + CPPUNIT_ASSERT(zh==0); + CPPUNIT_ASSERT_EQUAL(ENOMEM,errno); + } + void testOutOfMemory_getaddrs2() + { + Mock_realloc reallocMock; + reallocMock.callsBeforeFailure=1; // fail on the second call to realloc + + zh=zookeeper_init("127.0.0.1:123,127.0.0.2:123,127.0.0.3:123,127.0.0.4:123,127.0.0.5:123,127.0.0.6:123,127.0.0.7:123,127.0.0.8:123,127.0.0.9:123,127.0.0.10:123,127.0.0.11:123,127.0.0.12:123,127.0.0.13:123,127.0.0.14:123,127.0.0.15:123,127.0.0.16:123,127.0.0.17:123",0,0,0,0,0); + + CPPUNIT_ASSERT(zh==0); + CPPUNIT_ASSERT_EQUAL(ENOMEM,errno); + } + void testPermuteAddrsList() + { + const char EXPECTED[][5]={"\0\0\0\0","\1\1\1\1","\2\2\2\2","\3\3\3\3"}; + const int EXPECTED_ADDR_COUNT=COUNTOF(EXPECTED); + + const int RAND_SEQ[]={0,1,1,-1}; + const int RAND_SIZE=COUNTOF(RAND_SEQ); + Mock_random randomMock; + randomMock.randomReturns.assign(RAND_SEQ,RAND_SEQ+RAND_SIZE-1); + zh=zookeeper_init("0.0.0.0:123,1.1.1.1:123,2.2.2.2:123,3.3.3.3:123",0,1000,0,0,0); + + CPPUNIT_ASSERT(zh!=0); + CPPUNIT_ASSERT_EQUAL(EXPECTED_ADDR_COUNT,zh->addrs_count); + const string EXPECTED_SEQ("3210"); + char ACTUAL_SEQ[EXPECTED_ADDR_COUNT+1]; ACTUAL_SEQ[EXPECTED_ADDR_COUNT]=0; + for(int i=0;iaddrs_count;i++){ + sockaddr_in* addr=(struct sockaddr_in*)&zh->addrs[i]; + // match the first byte of the EXPECTED and of the actual address + ACTUAL_SEQ[i]=((char*)&addr->sin_addr)[0]+'0'; + } + CPPUNIT_ASSERT_EQUAL(EXPECTED_SEQ,string(ACTUAL_SEQ)); + } +}; + +CPPUNIT_TEST_SUITE_REGISTRATION(Zookeeper_init); diff --git a/pkg/registry/zookeeper-3.4.6/src/c/tests/ThreadingUtil.cc b/pkg/registry/zookeeper-3.4.6/src/c/tests/ThreadingUtil.cc new file mode 100644 index 000000000..3b5170abb --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/c/tests/ThreadingUtil.cc @@ -0,0 +1,87 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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. + */ + +#include +#include "ThreadingUtil.h" +#include "LibCSymTable.h" + +#ifdef THREADED + +// **************************************************************************** +// Mutex wrapper +struct Mutex::Impl{ + Impl(){ + LIBC_SYMBOLS.pthread_mutex_init(&mut_, 0); + } + ~Impl(){ + LIBC_SYMBOLS.pthread_mutex_destroy(&mut_); + } + pthread_mutex_t mut_; +}; + +Mutex::Mutex():impl_(new Impl) {} +Mutex::~Mutex() { delete impl_;} +void Mutex::acquire() { + LIBC_SYMBOLS.pthread_mutex_lock(&impl_->mut_); +} +void Mutex::release() { + LIBC_SYMBOLS.pthread_mutex_unlock(&impl_->mut_); +} + +// **************************************************************************** +// Atomics +int32_t atomic_post_incr(volatile int32_t* operand, int32_t incr) +{ +#if defined(__GNUC__) + return __sync_fetch_and_add(operand,incr); +#else + int32_t result; + __asm__ __volatile__( + "lock xaddl %0,%1\n" + : "=r"(result), "=m"(*operand) + : "0"(incr) + : "memory"); + return result; +#endif +} +int32_t atomic_fetch_store(volatile int32_t *ptr, int32_t value) +{ +#if defined(__GNUC__) + return __sync_lock_test_and_set(ptr,value); +#else + int32_t result; + __asm__ __volatile__("lock xchgl %0,%1\n" + : "=r"(result), "=m"(*ptr) + : "0"(value) + : "memory"); + return result; +#endif +} +#else +int32_t atomic_post_incr(volatile int32_t* operand, int32_t incr){ + int32_t v=*operand; + *operand+=incr; + return v; +} +int32_t atomic_fetch_store(volatile int32_t *ptr, int32_t value) +{ + int32_t result=*ptr; + *ptr=value; + return result; +} +#endif // THREADED diff --git a/pkg/registry/zookeeper-3.4.6/src/c/tests/ThreadingUtil.h b/pkg/registry/zookeeper-3.4.6/src/c/tests/ThreadingUtil.h new file mode 100644 index 000000000..9165412bc --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/c/tests/ThreadingUtil.h @@ -0,0 +1,261 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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. + */ + +#ifndef THREADINGUTIL_H_ +#define THREADINGUTIL_H_ + +#include + +#ifdef THREADED +#include "pthread.h" +#endif + +// ***************************************************************************** +// Threading primitives + +// atomic post-increment; returns the previous value of the operand +int32_t atomic_post_incr(volatile int32_t* operand, int32_t incr); +// atomic fetch&store; returns the previous value of the operand +int32_t atomic_fetch_store(volatile int32_t *operand, int32_t value); + +// a partial implementation of an atomic integer type +class AtomicInt{ +public: + explicit AtomicInt(int32_t init=0):v_(init){} + AtomicInt(const AtomicInt& other):v_(other){} + // assigment + AtomicInt& operator=(const AtomicInt& lhs){ + atomic_fetch_store(&v_,lhs); + return *this; + } + AtomicInt& operator=(int32_t i){ + atomic_fetch_store(&v_,i); + return *this; + } + // pre-increment + AtomicInt& operator++() { + atomic_post_incr(&v_,1); + return *this; + } + // pre-decrement + AtomicInt& operator--() { + atomic_post_incr(&v_,-1); + return *this; + } + // post-increment + AtomicInt operator++(int){ + return AtomicInt(atomic_post_incr(&v_,1)); + } + // post-decrement + AtomicInt operator--(int){ + return AtomicInt(atomic_post_incr(&v_,-1)); + } + + operator int() const{ + return atomic_post_incr(&v_,0); + } + int get() const{ + return atomic_post_incr(&v_,0); + } +private: + mutable int32_t v_; +}; + +#ifdef THREADED +// **************************************************************************** +#define VALIDATE_JOBS(jm) jm.validateJobs(__FILE__,__LINE__) +#define VALIDATE_JOB(j) j.validate(__FILE__,__LINE__) + +class Mutex{ +public: + Mutex(); + ~Mutex(); + void acquire(); + void release(); +private: + Mutex(const Mutex&); + Mutex& operator=(const Mutex&); + struct Impl; + Impl* impl_; +}; + +class MTLock{ +public: + MTLock(Mutex& m):m_(m){m.acquire();} + ~MTLock(){m_.release();} + Mutex& m_; +}; + +#define synchronized(m) MTLock __lock(m) + +// **************************************************************************** +class Latch { +public: + virtual ~Latch() {} + virtual void await() const =0; + virtual void signalAndWait() =0; + virtual void signal() =0; +}; + +class CountDownLatch: public Latch { +public: + CountDownLatch(int count):count_(count) { + pthread_cond_init(&cond_,0); + pthread_mutex_init(&mut_,0); + } + virtual ~CountDownLatch() { + pthread_mutex_lock(&mut_); + if(count_!=0) { + count_=0; + pthread_cond_broadcast(&cond_); + } + pthread_mutex_unlock(&mut_); + + pthread_cond_destroy(&cond_); + pthread_mutex_destroy(&mut_); + } + + virtual void await() const { + pthread_mutex_lock(&mut_); + awaitImpl(); + pthread_mutex_unlock(&mut_); + } + virtual void signalAndWait() { + pthread_mutex_lock(&mut_); + signalImpl(); + awaitImpl(); + pthread_mutex_unlock(&mut_); + } + virtual void signal() { + pthread_mutex_lock(&mut_); + signalImpl(); + pthread_mutex_unlock(&mut_); + } +private: + void awaitImpl() const{ + while(count_!=0) + pthread_cond_wait(&cond_,&mut_); + } + void signalImpl() { + if(count_>0) { + count_--; + pthread_cond_broadcast(&cond_); + } + } + int count_; + mutable pthread_mutex_t mut_; + mutable pthread_cond_t cond_; +}; + +class TestJob { +public: + typedef long JobId; + TestJob():hasRun_(false),startLatch_(0),endLatch_(0) {} + virtual ~TestJob() { + join(); + } + virtual TestJob* clone() const =0; + + virtual void run() =0; + virtual void validate(const char* file, int line) const =0; + + virtual void start(Latch* startLatch=0,Latch* endLatch=0) { + startLatch_=startLatch;endLatch_=endLatch; + hasRun_=true; + pthread_create(&thread_, 0, thread, this); + } + virtual JobId getJobId() const { + return (JobId)thread_; + } + virtual void join() { + if(!hasRun_) + return; + if(!pthread_equal(thread_,pthread_self())) + pthread_join(thread_,0); + else + pthread_detach(thread_); + } +private: + void awaitStart() { + if(startLatch_==0) return; + startLatch_->signalAndWait(); + } + void signalFinished() { + if(endLatch_==0) return; + endLatch_->signal(); + } + static void* thread(void* p) { + TestJob* j=(TestJob*)p; + j->awaitStart(); // wait for the start command + j->run(); + j->signalFinished(); + return 0; + } + bool hasRun_; + Latch* startLatch_; + Latch* endLatch_; + pthread_t thread_; +}; + +class TestJobManager { + typedef std::vector JobList; +public: + TestJobManager(const TestJob& tj,int threadCount=1): + startLatch_(threadCount),endLatch_(threadCount) + { + for(int i=0;istart(&startLatch_,&endLatch_); + } + virtual void startJobsImmediately() { + for(unsigned i=0;istart(0,&endLatch_); + } + virtual void wait() const { + endLatch_.await(); + } + virtual void validateJobs(const char* file, int line) const{ + for(unsigned i=0;ivalidate(file,line); + } +private: + JobList jobs_; + CountDownLatch startLatch_; + CountDownLatch endLatch_; +}; + +#else // THREADED +// single THREADED +class Mutex{ +public: + void acquire(){} + void release(){} +}; +#define synchronized(m) + +#endif // THREADED + +#endif /*THREADINGUTIL_H_*/ diff --git a/pkg/registry/zookeeper-3.4.6/src/c/tests/Util.cc b/pkg/registry/zookeeper-3.4.6/src/c/tests/Util.cc new file mode 100644 index 000000000..2b9da84eb --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/c/tests/Util.cc @@ -0,0 +1,51 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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. + */ + +#include "Util.h" +#include "string.h" + +const std::string EMPTY_STRING; + +TestConfig globalTestConfig; + +void millisleep(int ms){ + timespec ts; + ts.tv_sec=ms/1000; + ts.tv_nsec=(ms%1000)*1000000; // to nanoseconds + nanosleep(&ts,0); +} + +FILE *openlogfile(const char* testname) { + char name[1024]; + strcpy(name, "TEST-"); + strncpy(name + 5, testname, sizeof(name) - 5); +#ifdef THREADED + strcpy(name + strlen(name), "-mt.txt"); +#else + strcpy(name + strlen(name), "-st.txt"); +#endif + + FILE *logfile = fopen(name, "a"); + + if (logfile == 0) { + fprintf(stderr, "Can't open log file %s!\n", name); + return 0; + } + + return logfile; +} diff --git a/pkg/registry/zookeeper-3.4.6/src/c/tests/Util.h b/pkg/registry/zookeeper-3.4.6/src/c/tests/Util.h new file mode 100644 index 000000000..01e21ce25 --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/c/tests/Util.h @@ -0,0 +1,137 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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. + */ + +#ifndef UTIL_H_ +#define UTIL_H_ + +#include +#include +#include + +#include "zookeeper_log.h" + +// number of elements in array +#define COUNTOF(array) sizeof(array)/sizeof(array[0]) + +#define DECLARE_WRAPPER(ret,sym,sig) \ + extern "C" ret __real_##sym sig; \ + extern "C" ret __wrap_##sym sig + +#define CALL_REAL(sym,params) \ + __real_##sym params + +// must include "src/zookeeper_log.h" to be able to use this macro +#define TEST_TRACE(x) \ + log_message(ZOO_LOG_LEVEL_DEBUG,__LINE__,__func__,format_log_message x) + +extern const std::string EMPTY_STRING; + +// ***************************************************************************** +// A bit of wizardry to get to the bare type from a reference or a pointer +// to the type +template +struct TypeOp { + typedef T BareT; + typedef T ArgT; +}; + +// partial specialization for reference types +template +struct TypeOp{ + typedef T& ArgT; + typedef typename TypeOp::BareT BareT; +}; + +// partial specialization for pointers +template +struct TypeOp{ + typedef T* ArgT; + typedef typename TypeOp::BareT BareT; +}; + +// ***************************************************************************** +// Container utilities + +template +void putValue(std::map& map,const K& k, const V& v){ + typedef std::map Map; + typename Map::const_iterator it=map.find(k); + if(it==map.end()) + map.insert(typename Map::value_type(k,v)); + else + map[k]=v; +} + +template +bool getValue(const std::map& map,const K& k,V& v){ + typedef std::map Map; + typename Map::const_iterator it=map.find(k); + if(it==map.end()) + return false; + v=it->second; + return true; +} + +// ***************************************************************************** +// misc utils + +// millisecond sleep +void millisleep(int ms); +FILE *openlogfile(const char* name); +// evaluate given predicate until it returns true or the timeout +// (in millis) has expired +template +int ensureCondition(const Predicate& p,int timeout){ + int elapsed=0; + while(!p() && elapsed CmdLineOptList; +public: + typedef CmdLineOptList::const_iterator const_iterator; + TestConfig(){} + ~TestConfig(){} + void addConfigFromCmdLine(int argc, char* argv[]){ + if(argc>=2) + testName_=argv[1]; + for(int i=2; i + +// function to conveniently stream vectors +template +std::ostream& operator<<(std::ostream& os,const std::vector& c){ + typedef std::vector V; + os<<"["; + if(c.size()>0){ + for(typename V::const_iterator it=c.begin();it!=c.end();++it) + os<<*it<<","; + os.seekp(-1,std::ios::cur); + } + os<<"]"; + return os; +} + +#endif // _VECTOR_UTIL_H diff --git a/pkg/registry/zookeeper-3.4.6/src/c/tests/ZKMocks.cc b/pkg/registry/zookeeper-3.4.6/src/c/tests/ZKMocks.cc new file mode 100644 index 000000000..89166747f --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/c/tests/ZKMocks.cc @@ -0,0 +1,519 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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. + */ + +#include // for htonl +#include + +#include +#include + +#ifdef THREADED +#include "PthreadMocks.h" +#endif +#include "ZKMocks.h" + +using namespace std; + +TestClientId testClientId; +const char* TestClientId::PASSWD="1234567890123456"; + +HandshakeRequest* HandshakeRequest::parse(const std::string& buf){ + auto_ptr req(new HandshakeRequest); + + memcpy(&req->protocolVersion,buf.data(), sizeof(req->protocolVersion)); + req->protocolVersion = htonl(req->protocolVersion); + + int offset=sizeof(req->protocolVersion); + + memcpy(&req->lastZxidSeen,buf.data()+offset,sizeof(req->lastZxidSeen)); + req->lastZxidSeen = htonll(req->lastZxidSeen); + offset+=sizeof(req->lastZxidSeen); + + memcpy(&req->timeOut,buf.data()+offset,sizeof(req->timeOut)); + req->timeOut = htonl(req->timeOut); + offset+=sizeof(req->timeOut); + + memcpy(&req->sessionId,buf.data()+offset,sizeof(req->sessionId)); + req->sessionId = htonll(req->sessionId); + offset+=sizeof(req->sessionId); + + memcpy(&req->passwd_len,buf.data()+offset,sizeof(req->passwd_len)); + req->passwd_len = htonl(req->passwd_len); + offset+=sizeof(req->passwd_len); + + memcpy(req->passwd,buf.data()+offset,sizeof(req->passwd)); + if(testClientId.client_id==req->sessionId && + !memcmp(testClientId.passwd,req->passwd,sizeof(req->passwd))) + return req.release(); + // the request didn't match -- may not be a handshake request after all + return 0; +} + +// ***************************************************************************** +// watcher action implementation +void activeWatcher(zhandle_t *zh, int type, int state, const char *path,void* ctx){ + if(zh==0 || ctx==0) return; + WatcherAction* action=(WatcherAction*)ctx; + + if(type==ZOO_SESSION_EVENT){ + if(state==ZOO_EXPIRED_SESSION_STATE) + action->onSessionExpired(zh); + else if(state==ZOO_CONNECTING_STATE) + action->onConnectionLost(zh); + else if(state==ZOO_CONNECTED_STATE) + action->onConnectionEstablished(zh); + }else if(type==ZOO_CHANGED_EVENT) + action->onNodeValueChanged(zh,path); + else if(type==ZOO_DELETED_EVENT) + action->onNodeDeleted(zh,path); + else if(type==ZOO_CHILD_EVENT) + action->onChildChanged(zh,path); + // TODO: implement for the rest of the event types + // ... + action->setWatcherTriggered(); +} +SyncedBoolCondition WatcherAction::isWatcherTriggered() const{ + return SyncedBoolCondition(triggered_,mx_); +} + +// ***************************************************************************** +// a set of async completion signatures +void asyncCompletion(int rc, ACL_vector *acl,Stat *stat, const void *data){ + assert("Completion data is NULL"&&data); + static_cast((void*)data)->aclCompl(rc,acl,stat); +} +void asyncCompletion(int rc, const char *value, int len, const Stat *stat, + const void *data){ + assert("Completion data is NULL"&&data); + static_cast((void*)data)->dataCompl(rc,value,len,stat); +} +void asyncCompletion(int rc, const Stat *stat, const void *data){ + assert("Completion data is NULL"&&data); + static_cast((void*)data)->statCompl(rc,stat); +} +void asyncCompletion(int rc, const char *value, const void *data){ + assert("Completion data is NULL"&&data); + static_cast((void*)data)->stringCompl(rc,value); +} +void asyncCompletion(int rc,const String_vector *strings, const void *data){ + assert("Completion data is NULL"&&data); + static_cast((void*)data)->stringsCompl(rc,strings); +} +void asyncCompletion(int rc, const void *data){ + assert("Completion data is NULL"&&data); + static_cast((void*)data)->voidCompl(rc); +} + +// ***************************************************************************** +// a predicate implementation +bool IOThreadStopped::operator()() const{ +#ifdef THREADED + adaptor_threads* adaptor=(adaptor_threads*)zh_->adaptor_priv; + return CheckedPthread::isTerminated(adaptor->io); +#else + assert("IOThreadStopped predicate is only for use with THREADED client"&& false); + return false; +#endif +} + +//****************************************************************************** +// +DECLARE_WRAPPER(int,flush_send_queue,(zhandle_t*zh, int timeout)) +{ + if(!Mock_flush_send_queue::mock_) + return CALL_REAL(flush_send_queue,(zh,timeout)); + return Mock_flush_send_queue::mock_->call(zh,timeout); +} + +Mock_flush_send_queue* Mock_flush_send_queue::mock_=0; + +//****************************************************************************** +// +DECLARE_WRAPPER(int32_t,get_xid,()) +{ + if(!Mock_get_xid::mock_) + return CALL_REAL(get_xid,()); + return Mock_get_xid::mock_->call(); +} + +Mock_get_xid* Mock_get_xid::mock_=0; + +//****************************************************************************** +// activateWatcher mock + +DECLARE_WRAPPER(void,activateWatcher,(zhandle_t *zh, watcher_registration_t* reg, int rc)) +{ + if(!Mock_activateWatcher::mock_){ + CALL_REAL(activateWatcher,(zh, reg,rc)); + }else{ + Mock_activateWatcher::mock_->call(zh, reg,rc); + } +} +Mock_activateWatcher* Mock_activateWatcher::mock_=0; + +class ActivateWatcherWrapper: public Mock_activateWatcher{ +public: + ActivateWatcherWrapper():ctx_(0),activated_(false){} + + virtual void call(zhandle_t *zh, watcher_registration_t* reg, int rc){ + CALL_REAL(activateWatcher,(zh, reg,rc)); + synchronized(mx_); + if(reg->context==ctx_){ + activated_=true; + ctx_=0; + } + } + + void setContext(void* ctx){ + synchronized(mx_); + ctx_=ctx; + activated_=false; + } + + SyncedBoolCondition isActivated() const{ + return SyncedBoolCondition(activated_,mx_); + } + mutable Mutex mx_; + void* ctx_; + bool activated_; +}; + +WatcherActivationTracker::WatcherActivationTracker(): + wrapper_(new ActivateWatcherWrapper) +{ +} + +WatcherActivationTracker::~WatcherActivationTracker(){ + delete wrapper_; +} + +void WatcherActivationTracker::track(void* ctx){ + wrapper_->setContext(ctx); +} + +SyncedBoolCondition WatcherActivationTracker::isWatcherActivated() const{ + return wrapper_->isActivated(); +} + +//****************************************************************************** +// +DECLARE_WRAPPER(void,deliverWatchers,(zhandle_t* zh,int type,int state, const char* path, watcher_object_list_t **list)) +{ + if(!Mock_deliverWatchers::mock_){ + CALL_REAL(deliverWatchers,(zh,type,state,path, list)); + }else{ + Mock_deliverWatchers::mock_->call(zh,type,state,path, list); + } +} + +Mock_deliverWatchers* Mock_deliverWatchers::mock_=0; + +struct RefCounterValue{ + RefCounterValue(zhandle_t* const& zh,int32_t expectedCounter,Mutex& mx): + zh_(zh),expectedCounter_(expectedCounter),mx_(mx){} + bool operator()() const{ + { + synchronized(mx_); + if(zh_==0) + return false; + } + return inc_ref_counter(zh_,0)==expectedCounter_; + } + zhandle_t* const& zh_; + int32_t expectedCounter_; + Mutex& mx_; +}; + + +class DeliverWatchersWrapper: public Mock_deliverWatchers{ +public: + DeliverWatchersWrapper(int type,int state,bool terminate): + type_(type),state_(state), + allDelivered_(false),terminate_(terminate),zh_(0),deliveryCounter_(0){} + virtual void call(zhandle_t* zh,int type,int state, const char* path, watcher_object_list **list){ + { + synchronized(mx_); + zh_=zh; + allDelivered_=false; + } + CALL_REAL(deliverWatchers,(zh,type,state,path, list)); + if(type_==type && state_==state){ + if(terminate_){ + // prevent zhandle_t from being prematurely distroyed; + // this will also ensure that zookeeper_close() cleanups the thread + // resources by calling finish_adaptor() + inc_ref_counter(zh,1); + terminateZookeeperThreads(zh); + } + synchronized(mx_); + allDelivered_=true; + deliveryCounter_++; + } + } + SyncedBoolCondition isDelivered() const{ + if(terminate_){ + int i=ensureCondition(RefCounterValue(zh_,1,mx_),1000); + assert(i<1000); + } + return SyncedBoolCondition(allDelivered_,mx_); + } + void resetDeliveryCounter(){ + synchronized(mx_); + deliveryCounter_=0; + } + SyncedIntegerEqual deliveryCounterEquals(int expected) const{ + if(terminate_){ + int i=ensureCondition(RefCounterValue(zh_,1,mx_),1000); + assert(i<1000); + } + return SyncedIntegerEqual(deliveryCounter_,expected,mx_); + } + int type_; + int state_; + mutable Mutex mx_; + bool allDelivered_; + bool terminate_; + zhandle_t* zh_; + int deliveryCounter_; +}; + +WatcherDeliveryTracker::WatcherDeliveryTracker( + int type,int state,bool terminateCompletionThread): + deliveryWrapper_(new DeliverWatchersWrapper( + type,state,terminateCompletionThread)){ +} + +WatcherDeliveryTracker::~WatcherDeliveryTracker(){ + delete deliveryWrapper_; +} + +SyncedBoolCondition WatcherDeliveryTracker::isWatcherProcessingCompleted() const{ + return deliveryWrapper_->isDelivered(); +} + +void WatcherDeliveryTracker::resetDeliveryCounter(){ + deliveryWrapper_->resetDeliveryCounter(); +} + +SyncedIntegerEqual WatcherDeliveryTracker::deliveryCounterEquals(int expected) const{ + return deliveryWrapper_->deliveryCounterEquals(expected); +} + +//****************************************************************************** +// +string HandshakeResponse::toString() const { + string buf; + int32_t tmp=htonl(protocolVersion); + buf.append((char*)&tmp,sizeof(tmp)); + tmp=htonl(timeOut); + buf.append((char*)&tmp,sizeof(tmp)); + int64_t tmp64=htonll(sessionId); + buf.append((char*)&tmp64,sizeof(sessionId)); + tmp=htonl(passwd_len); + buf.append((char*)&tmp,sizeof(tmp)); + buf.append(passwd,sizeof(passwd)); + // finally set the buffer length + tmp=htonl(buf.size()+sizeof(tmp)); + buf.insert(0,(char*)&tmp, sizeof(tmp)); + return buf; +} + +string ZooGetResponse::toString() const{ + oarchive* oa=create_buffer_oarchive(); + + ReplyHeader h = {xid_,1,ZOK}; + serialize_ReplyHeader(oa, "hdr", &h); + + GetDataResponse resp; + char buf[1024]; + assert("GetDataResponse is too long"&&data_.size()<=sizeof(buf)); + resp.data.len=data_.size(); + resp.data.buff=buf; + data_.copy(resp.data.buff, data_.size()); + resp.stat=stat_; + serialize_GetDataResponse(oa, "reply", &resp); + int32_t len=htonl(get_buffer_len(oa)); + string res((char*)&len,sizeof(len)); + res.append(get_buffer(oa),get_buffer_len(oa)); + + close_buffer_oarchive(&oa,1); + return res; +} + +string ZooStatResponse::toString() const{ + oarchive* oa=create_buffer_oarchive(); + + ReplyHeader h = {xid_,1,rc_}; + serialize_ReplyHeader(oa, "hdr", &h); + + SetDataResponse resp; + resp.stat=stat_; + serialize_SetDataResponse(oa, "reply", &resp); + int32_t len=htonl(get_buffer_len(oa)); + string res((char*)&len,sizeof(len)); + res.append(get_buffer(oa),get_buffer_len(oa)); + + close_buffer_oarchive(&oa,1); + return res; +} + +string ZooGetChildrenResponse::toString() const{ + oarchive* oa=create_buffer_oarchive(); + + ReplyHeader h = {xid_,1,rc_}; + serialize_ReplyHeader(oa, "hdr", &h); + + GetChildrenResponse resp; + // populate the string vector + allocate_String_vector(&resp.children,strings_.size()); + for(int i=0;i<(int)strings_.size();++i) + resp.children.data[i]=strdup(strings_[i].c_str()); + serialize_GetChildrenResponse(oa, "reply", &resp); + deallocate_GetChildrenResponse(&resp); + + int32_t len=htonl(get_buffer_len(oa)); + string res((char*)&len,sizeof(len)); + res.append(get_buffer(oa),get_buffer_len(oa)); + + close_buffer_oarchive(&oa,1); + return res; +} + +string ZNodeEvent::toString() const{ + oarchive* oa=create_buffer_oarchive(); + struct WatcherEvent evt = {type_,0,(char*)path_.c_str()}; + struct ReplyHeader h = {WATCHER_EVENT_XID,0,ZOK }; + + serialize_ReplyHeader(oa, "hdr", &h); + serialize_WatcherEvent(oa, "event", &evt); + + int32_t len=htonl(get_buffer_len(oa)); + string res((char*)&len,sizeof(len)); + res.append(get_buffer(oa),get_buffer_len(oa)); + + close_buffer_oarchive(&oa,1); + return res; +} + +string PingResponse::toString() const{ + oarchive* oa=create_buffer_oarchive(); + + ReplyHeader h = {PING_XID,1,ZOK}; + serialize_ReplyHeader(oa, "hdr", &h); + + int32_t len=htonl(get_buffer_len(oa)); + string res((char*)&len,sizeof(len)); + res.append(get_buffer(oa),get_buffer_len(oa)); + + close_buffer_oarchive(&oa,1); + return res; +} + +//****************************************************************************** +// Zookeeper server simulator +// +bool ZookeeperServer::hasMoreRecv() const{ + return recvHasMore.get()!=0 || connectionLost; +} + +ssize_t ZookeeperServer::callRecv(int s,void *buf,size_t len,int flags){ + if(connectionLost){ + recvReturnBuffer.erase(); + return 0; + } + // done transmitting the current buffer? + if(recvReturnBuffer.size()==0){ + synchronized(recvQMx); + if(recvQueue.empty()){ + recvErrno=EAGAIN; + return Mock_socket::callRecv(s,buf,len,flags); + } + --recvHasMore; + Element& el=recvQueue.front(); + if(el.first!=0){ + recvReturnBuffer=el.first->toString(); + delete el.first; + } + recvErrno=el.second; + recvQueue.pop_front(); + } + return Mock_socket::callRecv(s,buf,len,flags); +} + +void ZookeeperServer::onMessageReceived(const RequestHeader& rh, iarchive* ia){ + // no-op by default +} + +void ZookeeperServer::notifyBufferSent(const std::string& buffer){ + if(HandshakeRequest::isValid(buffer)){ + // could be a connect request + auto_ptr req(HandshakeRequest::parse(buffer)); + if(req.get()!=0){ + // handle the handshake + int64_t sessId=sessionExpired?req->sessionId+1:req->sessionId; + sessionExpired=false; + addRecvResponse(new HandshakeResponse(sessId)); + return; + } + // not a connect request -- fall thru + } + // parse the buffer to extract the request type and its xid + iarchive *ia=create_buffer_iarchive((char*)buffer.data(), buffer.size()); + RequestHeader rh; + deserialize_RequestHeader(ia,"hdr",&rh); + // notify the "server" a client request has arrived + if (rh.xid == -8) { + Element e = Element(new ZooStatResponse,0); + e.first->setXID(-8); + addRecvResponse(e); + close_buffer_iarchive(&ia); + return; + } else { + onMessageReceived(rh,ia); + } + close_buffer_iarchive(&ia); + if(rh.type==ZOO_CLOSE_OP){ + ++closeSent; + return; // no reply for close requests + } + // get the next response from the response queue and append it to the receive list + Element e; + { + synchronized(respQMx); + if(respQueue.empty()) + return; + e=respQueue.front(); + respQueue.pop_front(); + } + e.first->setXID(rh.xid); + addRecvResponse(e); +} + +void forceConnected(zhandle_t* zh){ + // simulate connected state + zh->state=ZOO_CONNECTED_STATE; + zh->fd=ZookeeperServer::FD; + zh->input_buffer=0; + gettimeofday(&zh->last_recv,0); + gettimeofday(&zh->last_send,0); +} + +void terminateZookeeperThreads(zhandle_t* zh){ + // this will cause the zookeeper threads to terminate + zh->close_requested=1; +} diff --git a/pkg/registry/zookeeper-3.4.6/src/c/tests/ZKMocks.h b/pkg/registry/zookeeper-3.4.6/src/c/tests/ZKMocks.h new file mode 100644 index 000000000..fbcfc4f08 --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/c/tests/ZKMocks.h @@ -0,0 +1,509 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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. + */ + +#ifndef ZKMOCKS_H_ +#define ZKMOCKS_H_ + +#include +#include "src/zk_adaptor.h" + +#include "Util.h" +#include "LibCMocks.h" +#include "MocksBase.h" + +// ***************************************************************************** +// sets internal zhandle_t members to certain values to simulate the client +// connected state. This function should only be used with the single-threaded +// Async API tests! +void forceConnected(zhandle_t* zh); + +/** + * Gracefully terminates zookeeper I/O and completion threads. + */ +void terminateZookeeperThreads(zhandle_t* zh); + +// ***************************************************************************** +// Abstract watcher action +struct SyncedBoolCondition; + +class WatcherAction{ +public: + WatcherAction():triggered_(false){} + virtual ~WatcherAction(){} + + virtual void onSessionExpired(zhandle_t*){} + virtual void onConnectionEstablished(zhandle_t*){} + virtual void onConnectionLost(zhandle_t*){} + virtual void onNodeValueChanged(zhandle_t*,const char* path){} + virtual void onNodeDeleted(zhandle_t*,const char* path){} + virtual void onChildChanged(zhandle_t*,const char* path){} + + SyncedBoolCondition isWatcherTriggered() const; + void setWatcherTriggered(){ + synchronized(mx_); + triggered_=true; + } + +protected: + mutable Mutex mx_; + bool triggered_; +}; +// zh->context is a pointer to a WatcherAction instance +// based on the event type and state, the watcher calls a specific watcher +// action method +void activeWatcher(zhandle_t *zh, int type, int state, const char *path,void* ctx); + +// ***************************************************************************** +// a set of async completion signatures +class AsyncCompletion{ +public: + virtual ~AsyncCompletion(){} + virtual void aclCompl(int rc, ACL_vector *acl,Stat *stat){} + virtual void dataCompl(int rc, const char *value, int len, const Stat *stat){} + virtual void statCompl(int rc, const Stat *stat){} + virtual void stringCompl(int rc, const char *value){} + virtual void stringsCompl(int rc,const String_vector *strings){} + virtual void voidCompl(int rc){} +}; +void asyncCompletion(int rc, ACL_vector *acl,Stat *stat, const void *data); +void asyncCompletion(int rc, const char *value, int len, const Stat *stat, + const void *data); +void asyncCompletion(int rc, const Stat *stat, const void *data); +void asyncCompletion(int rc, const char *value, const void *data); +void asyncCompletion(int rc,const String_vector *strings, const void *data); +void asyncCompletion(int rc, const void *data); + +// ***************************************************************************** +// some common predicates to use with ensureCondition(): +// checks if the connection is established +struct ClientConnected{ + ClientConnected(zhandle_t* zh):zh_(zh){} + bool operator()() const{ + return zoo_state(zh_)==ZOO_CONNECTED_STATE; + } + zhandle_t* zh_; +}; +// check in the session expired +struct SessionExpired{ + SessionExpired(zhandle_t* zh):zh_(zh){} + bool operator()() const{ + return zoo_state(zh_)==ZOO_EXPIRED_SESSION_STATE; + } + zhandle_t* zh_; +}; +// checks if the IO thread has stopped; CheckedPthread must be active +struct IOThreadStopped{ + IOThreadStopped(zhandle_t* zh):zh_(zh){} + bool operator()() const; + zhandle_t* zh_; +}; + +// a synchronized boolean condition +struct SyncedBoolCondition{ + SyncedBoolCondition(const bool& cond,Mutex& mx):cond_(cond),mx_(mx){} + bool operator()() const{ + synchronized(mx_); + return cond_; + } + const bool& cond_; + Mutex& mx_; +}; + +// a synchronized integer comparison +struct SyncedIntegerEqual{ + SyncedIntegerEqual(const int& cond,int expected,Mutex& mx): + cond_(cond),expected_(expected),mx_(mx){} + bool operator()() const{ + synchronized(mx_); + return cond_==expected_; + } + const int& cond_; + const int expected_; + Mutex& mx_; +}; + +// ***************************************************************************** +// make sure to call zookeeper_close() even in presence of exceptions +struct CloseFinally{ + CloseFinally(zhandle_t** zh):zh_(zh){} + ~CloseFinally(){ + execute(); + } + int execute(){ + if(zh_==0)return ZOK; + zhandle_t* lzh=*zh_; + *zh_=0; + disarm(); + return zookeeper_close(lzh); + } + void disarm(){zh_=0;} + zhandle_t ** zh_; +}; + +struct TestClientId: clientid_t{ + static const int SESSION_ID=123456789; + static const char* PASSWD; + TestClientId(){ + client_id=SESSION_ID; + memcpy(passwd,PASSWD,sizeof(passwd)); + } +}; + +// ***************************************************************************** +// special client id recongnized by the ZK server simulator +extern TestClientId testClientId; +#define TEST_CLIENT_ID &testClientId + +// ***************************************************************************** +// +struct HandshakeRequest: public connect_req +{ + static HandshakeRequest* parse(const std::string& buf); + static bool isValid(const std::string& buf){ + // this is just quick and dirty check before we go and parse the request + return buf.size()==HANDSHAKE_REQ_SIZE; + } +}; + +// ***************************************************************************** +// flush_send_queue +class Mock_flush_send_queue: public Mock +{ +public: + Mock_flush_send_queue():counter(0),callReturns(ZOK){mock_=this;} + ~Mock_flush_send_queue(){mock_=0;} + + int counter; + int callReturns; + virtual int call(zhandle_t* zh, int timeout){ + counter++; + return callReturns; + } + + static Mock_flush_send_queue* mock_; +}; + +// ***************************************************************************** +// get_xid +class Mock_get_xid: public Mock +{ +public: + static const int32_t XID=123456; + Mock_get_xid(int retValue=XID):callReturns(retValue){mock_=this;} + ~Mock_get_xid(){mock_=0;} + + int callReturns; + virtual int call(){ + return callReturns; + } + + static Mock_get_xid* mock_; +}; + +// ***************************************************************************** +// activateWatcher +class Mock_activateWatcher: public Mock{ +public: + Mock_activateWatcher(){mock_=this;} + virtual ~Mock_activateWatcher(){mock_=0;} + + virtual void call(zhandle_t *zh, watcher_registration_t* reg, int rc){} + static Mock_activateWatcher* mock_; +}; + +class ActivateWatcherWrapper; +class WatcherActivationTracker{ +public: + WatcherActivationTracker(); + ~WatcherActivationTracker(); + + void track(void* ctx); + SyncedBoolCondition isWatcherActivated() const; +private: + ActivateWatcherWrapper* wrapper_; +}; + +// ***************************************************************************** +// deliverWatchers +class Mock_deliverWatchers: public Mock{ +public: + Mock_deliverWatchers(){mock_=this;} + virtual ~Mock_deliverWatchers(){mock_=0;} + + virtual void call(zhandle_t* zh,int type,int state, const char* path, watcher_object_list **){} + static Mock_deliverWatchers* mock_; +}; + +class DeliverWatchersWrapper; +class WatcherDeliveryTracker{ +public: + // filters deliveries by state and type + WatcherDeliveryTracker(int type,int state,bool terminateCompletionThread=true); + ~WatcherDeliveryTracker(); + + // if the thread termination requested (see the ctor params) + // this function will wait for the I/O and completion threads to + // terminate before returning a SyncBoolCondition instance + SyncedBoolCondition isWatcherProcessingCompleted() const; + void resetDeliveryCounter(); + SyncedIntegerEqual deliveryCounterEquals(int expected) const; +private: + DeliverWatchersWrapper* deliveryWrapper_; +}; + +// ***************************************************************************** +// a zookeeper Stat wrapper +struct NodeStat: public Stat +{ + NodeStat(){ + czxid=0; + mzxid=0; + ctime=0; + mtime=0; + version=1; + cversion=0; + aversion=0; + ephemeralOwner=0; + } + NodeStat(const Stat& other){ + memcpy(this,&other,sizeof(*this)); + } +}; + +// ***************************************************************************** +// Abstract server Response +class Response +{ +public: + virtual ~Response(){} + + virtual void setXID(int32_t xid){} + // this method is used by the ZookeeperServer class to serialize + // the instance of Response + virtual std::string toString() const =0; +}; + +// ***************************************************************************** +// Handshake response +class HandshakeResponse: public Response +{ +public: + HandshakeResponse(int64_t sessId=1) + :protocolVersion(1),timeOut(10000),sessionId(sessId),passwd_len(sizeof(passwd)) + { + memcpy(passwd,"1234567890123456",sizeof(passwd)); + } + int32_t protocolVersion; + int32_t timeOut; + int64_t sessionId; + int32_t passwd_len; + char passwd[16]; + virtual std::string toString() const ; +}; + +// zoo_get() response +class ZooGetResponse: public Response +{ +public: + ZooGetResponse(const char* data, int len,int32_t xid=0,int rc=ZOK,const Stat& stat=NodeStat()) + :xid_(xid),data_(data,len),rc_(rc),stat_(stat) + { + } + virtual std::string toString() const; + virtual void setXID(int32_t xid) {xid_=xid;} + +private: + int32_t xid_; + std::string data_; + int rc_; + Stat stat_; +}; + +// zoo_exists(), zoo_set() response +class ZooStatResponse: public Response +{ +public: + ZooStatResponse(int32_t xid=0,int rc=ZOK,const Stat& stat=NodeStat()) + :xid_(xid),rc_(rc),stat_(stat) + { + } + virtual std::string toString() const; + virtual void setXID(int32_t xid) {xid_=xid;} + +private: + int32_t xid_; + int rc_; + Stat stat_; +}; + +// zoo_get_children() +class ZooGetChildrenResponse: public Response +{ +public: + typedef std::vector StringVector; + ZooGetChildrenResponse(const StringVector& v,int rc=ZOK): + xid_(0),strings_(v),rc_(rc) + { + } + + virtual std::string toString() const; + virtual void setXID(int32_t xid) {xid_=xid;} + + int32_t xid_; + StringVector strings_; + int rc_; +}; + +// PING response +class PingResponse: public Response +{ +public: + virtual std::string toString() const; +}; + +// watcher znode event +class ZNodeEvent: public Response +{ +public: + ZNodeEvent(int type,const char* path):type_(type),path_(path){} + + virtual std::string toString() const; + +private: + int type_; + std::string path_; +}; + +// **************************************************************************** +// Zookeeper server simulator + +class ZookeeperServer: public Mock_socket +{ +public: + ZookeeperServer(): + serverDownSkipCount_(-1),sessionExpired(false),connectionLost(false) + { + connectReturns=-1; + connectErrno=EWOULDBLOCK; + } + virtual ~ZookeeperServer(){ + clearRecvQueue(); + clearRespQueue(); + } + virtual int callClose(int fd){ + if(fd!=FD) + return LIBC_SYMBOLS.close(fd); + clearRecvQueue(); + clearRespQueue(); + return Mock_socket::callClose(fd); + } + // connection handling + // what to do when the handshake request comes in? + int serverDownSkipCount_; + // this will cause getsockopt(zh->fd,SOL_SOCKET,SO_ERROR,&error,&len) return + // a failure after skipCount dropped to zero, thus simulating a server down + // condition + // passing skipCount==-1 will make every connect attempt succeed + void setServerDown(int skipCount=0){ + serverDownSkipCount_=skipCount; + optvalSO_ERROR=0; + } + virtual void setSO_ERROR(void *optval,socklen_t len){ + if(serverDownSkipCount_!=-1){ + if(serverDownSkipCount_==0) + optvalSO_ERROR=ECONNREFUSED; + else + serverDownSkipCount_--; + } + Mock_socket::setSO_ERROR(optval,len); + } + + // this is a trigger that gets reset back to false + // a connect request will return a non-matching session id thus causing + // the client throw SESSION_EXPIRED + volatile bool sessionExpired; + void returnSessionExpired(){ sessionExpired=true; } + + // this is a one shot trigger that gets reset back to false + // next recv call will return 0 length, thus simulating a connecton loss + volatile bool connectionLost; + void setConnectionLost() {connectionLost=true;} + + // recv + // this queue is used for server responses: client's recv() system call + // returns next available message from this queue + typedef std::pair Element; + typedef std::deque ResponseList; + ResponseList recvQueue; + mutable Mutex recvQMx; + AtomicInt recvHasMore; + ZookeeperServer& addRecvResponse(Response* resp, int errnum=0){ + synchronized(recvQMx); + recvQueue.push_back(Element(resp,errnum)); + ++recvHasMore; + return *this; + } + ZookeeperServer& addRecvResponse(int errnum){ + synchronized(recvQMx); + recvQueue.push_back(Element(0,errnum)); + ++recvHasMore; + return *this; + } + ZookeeperServer& addRecvResponse(const Element& e){ + synchronized(recvQMx); + recvQueue.push_back(e); + ++recvHasMore; + return *this; + } + void clearRecvQueue(){ + synchronized(recvQMx); + recvHasMore=0; + for(unsigned i=0; i /dev/null +if [ $? -eq 0 ] +then + pid=`lsof -i :$ZOOPORT | grep LISTEN | awk '{print $2}'` + if [ -n "$pid" ] + then + $KILL -9 $pid + fi +fi + +if [ "x${base_dir}" == "x" ] +then +zk_base="../../" +else +zk_base="${base_dir}" +fi + +CLASSPATH="$CLASSPATH:${zk_base}/build/classes" +CLASSPATH="$CLASSPATH:${zk_base}/conf" + +for i in "${zk_base}"/build/lib/*.jar +do + CLASSPATH="$CLASSPATH:$i" +done + +for i in "${zk_base}"/src/java/lib/*.jar +do + CLASSPATH="$CLASSPATH:$i" +done + +CLASSPATH="$CLASSPATH:${CLOVER_HOME}/lib/clover.jar" + +if $cygwin +then + CLASSPATH=`cygpath -wp "$CLASSPATH"` +fi + +case $1 in +start|startClean) + if [ "x${base_dir}" == "x" ] + then + mkdir -p /tmp/zkdata + java -cp "$CLASSPATH" org.apache.zookeeper.server.ZooKeeperServerMain $ZOOPORT /tmp/zkdata 3000 $ZKMAXCNXNS &> /tmp/zk.log & + pid=$! + echo -n $! > /tmp/zk.pid + else + mkdir -p "${base_dir}/build/tmp/zkdata" + java -cp "$CLASSPATH" org.apache.zookeeper.server.ZooKeeperServerMain $ZOOPORT "${base_dir}/build/tmp/zkdata" 3000 $ZKMAXCNXNS &> "${base_dir}/build/tmp/zk.log" & + pid=$! + echo -n $pid > "${base_dir}/build/tmp/zk.pid" + fi + + # wait max 120 seconds for server to be ready to server clients + # this handles testing on slow hosts + success=false + for i in {1..120} + do + if ps -p $pid > /dev/null + then + java -cp "$CLASSPATH" org.apache.zookeeper.ZooKeeperMain -server localhost:$ZOOPORT ls / > /dev/null 2>&1 + if [ $? -ne 0 ] + then + # server not up yet - wait + sleep 1 + else + # server is up and serving client connections + success=true + break + fi + else + # server died - exit now + echo -n " ZooKeeper server process failed" + break + fi + done + + if $success + then + ## in case for debug, but generally don't use as it messes up the + ## console test output + echo -n " ZooKeeper server started" + else + echo -n " ZooKeeper server NOT started" + fi + + ;; +stop) + # Already killed above + ;; +*) + echo "Unknown command " + $1 + exit 2 +esac + diff --git a/pkg/registry/zookeeper-3.4.6/src/c/zookeeper.sln b/pkg/registry/zookeeper-3.4.6/src/c/zookeeper.sln new file mode 100644 index 000000000..42f41c952 --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/c/zookeeper.sln @@ -0,0 +1,25 @@ +Microsoft Visual Studio Solution File, Format Version 10.00 +# Visual Studio 2008 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "zookeeper", "zookeeper.vcproj", "{5754FB2B-5EA5-4988-851D-908CA533A626}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Cli", "Cli.vcproj", "{050228F9-070F-4806-A2B5-E6B95D8EC4AF}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Win32 = Debug|Win32 + Release|Win32 = Release|Win32 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {5754FB2B-5EA5-4988-851D-908CA533A626}.Debug|Win32.ActiveCfg = Debug|Win32 + {5754FB2B-5EA5-4988-851D-908CA533A626}.Debug|Win32.Build.0 = Debug|Win32 + {5754FB2B-5EA5-4988-851D-908CA533A626}.Release|Win32.ActiveCfg = Release|Win32 + {5754FB2B-5EA5-4988-851D-908CA533A626}.Release|Win32.Build.0 = Release|Win32 + {050228F9-070F-4806-A2B5-E6B95D8EC4AF}.Debug|Win32.ActiveCfg = Debug|Win32 + {050228F9-070F-4806-A2B5-E6B95D8EC4AF}.Debug|Win32.Build.0 = Debug|Win32 + {050228F9-070F-4806-A2B5-E6B95D8EC4AF}.Release|Win32.ActiveCfg = Release|Win32 + {050228F9-070F-4806-A2B5-E6B95D8EC4AF}.Release|Win32.Build.0 = Release|Win32 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/pkg/registry/zookeeper-3.4.6/src/c/zookeeper.vcproj b/pkg/registry/zookeeper-3.4.6/src/c/zookeeper.vcproj new file mode 100644 index 000000000..dc3ab43e3 --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/c/zookeeper.vcproj @@ -0,0 +1,300 @@ +??? + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/build-contrib.xml b/pkg/registry/zookeeper-3.4.6/src/contrib/build-contrib.xml new file mode 100644 index 000000000..0e57d087a --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/contrib/build-contrib.xml @@ -0,0 +1,248 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/build.xml b/pkg/registry/zookeeper-3.4.6/src/contrib/build.xml new file mode 100644 index 000000000..7f7ba4ff6 --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/contrib/build.xml @@ -0,0 +1,88 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/fatjar/README.txt b/pkg/registry/zookeeper-3.4.6/src/contrib/fatjar/README.txt new file mode 100644 index 000000000..f8027ae8c --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/contrib/fatjar/README.txt @@ -0,0 +1,2 @@ +This package contains build to create a fat zookeeper jar. You need to run ant to create the fat jar. +To run the fatjar you can use. java -jar zoookeeper-*fatjar.jar diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/fatjar/build.xml b/pkg/registry/zookeeper-3.4.6/src/contrib/fatjar/build.xml new file mode 100644 index 000000000..8935f3940 --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/contrib/fatjar/build.xml @@ -0,0 +1,74 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/fatjar/conf/mainClasses b/pkg/registry/zookeeper-3.4.6/src/contrib/fatjar/conf/mainClasses new file mode 100644 index 000000000..2b0fc83f4 --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/contrib/fatjar/conf/mainClasses @@ -0,0 +1,10 @@ +::Client Commands +client:org.apache.zookeeper.ZooKeeperMain:Client shell to ZooKeeper +::Server Commands +server:org.apache.zookeeper.server.quorum.QuorumPeerMain:Start ZooKeeper server +::Test Commands +generateLoad:org.apache.zookeeper.test.system.GenerateLoad:A distributed load generator for testing +quorumBench:org.apache.zookeeper.server.QuorumBenchmark:A benchmark of just the quorum protocol +abBench:org.apache.zookeeper.server.quorum.AtomicBroadcastBenchmark:A benchmark of just the atomic broadcast +ic:org.apache.zookeeper.test.system.InstanceContainer:A container that will instantiate classes as directed by an instance manager +systest:org.apache.zookeeper.test.system.BaseSysTest:Start system test diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/fatjar/src/java/org/apache/zookeeper/util/FatJarMain.java b/pkg/registry/zookeeper-3.4.6/src/contrib/fatjar/src/java/org/apache/zookeeper/util/FatJarMain.java new file mode 100644 index 000000000..bdf0eaec5 --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/contrib/fatjar/src/java/org/apache/zookeeper/util/FatJarMain.java @@ -0,0 +1,126 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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. + */ + +package org.apache.zookeeper.util; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; +import java.util.ArrayList; +import java.util.HashMap; + +/** + * This is a generic Main class that is completely driven by the + * /mainClasses resource on the class path. This resource has the + * format: + *

    + * cmd:mainClass:Description
    + * 
    + * Any lines starting with # will be skipped + * + */ +public class FatJarMain { + static class Cmd { + Cmd(String cmd, String clazz, String desc) { + this.cmd = cmd; + this.clazz = clazz; + this.desc = desc; + } + String cmd; + String clazz; + String desc; + } + static HashMap cmds = new HashMap(); + static ArrayList order = new ArrayList(); + + /** + * @param args the first parameter of args will be used as an + * index into the /mainClasses resource. The rest will be passed + * to the mainClass to run. + * @throws IOException + * @throws ClassNotFoundException + * @throws NoSuchMethodException + * @throws SecurityException + * @throws IllegalAccessException + * @throws IllegalArgumentException + */ + public static void main(String[] args) throws IOException, ClassNotFoundException, SecurityException, NoSuchMethodException, IllegalArgumentException, IllegalAccessException { + InputStream is = FatJarMain.class.getResourceAsStream("/mainClasses"); + if (is == null) { + System.err.println("Couldn't find /mainClasses in classpath."); + System.exit(3); + } + BufferedReader br = new BufferedReader(new InputStreamReader(is)); + String line; + while((line = br.readLine()) != null) { + String parts[] = line.split(":", 3); + if (parts.length != 3 || (parts[0].length() > 0 && parts[0].charAt(0) == '#')) { + continue; + } + if (parts[0].length() > 0) { + cmds.put(parts[0], new Cmd(parts[0], parts[1], parts[2])); + // We use the order array to preserve the order of the commands + // for help. The hashmap will not preserver order. (It may be overkill.) + order.add(parts[0]); + } else { + // Just put the description in + order.add(parts[2]); + } + } + if (args.length == 0) { + doHelp(); + return; + } + Cmd cmd = cmds.get(args[0]); + if (cmd == null) { + doHelp(); + return; + } + Class clazz = Class.forName(cmd.clazz); + Method main = clazz.getMethod("main", String[].class); + String newArgs[] = new String[args.length-1]; + System.arraycopy(args, 1, newArgs, 0, newArgs.length); + try { + main.invoke(null, (Object)newArgs); + } catch(InvocationTargetException e) { + if (e.getCause() != null) { + e.getCause().printStackTrace(); + } else { + e.printStackTrace(); + } + } + } + + private static void doHelp() { + System.err.println("USAGE: FatJarMain cmd args"); + System.err.println("Available cmds:"); + for(String c: order) { + Cmd cmd = cmds.get(c); + if (cmd != null) { + System.err.println(" " + c + " " + cmd.desc); + } else { + System.err.println(c); + } + } + System.exit(2); + } + +} diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/huebrowser/README b/pkg/registry/zookeeper-3.4.6/src/contrib/huebrowser/README new file mode 100644 index 000000000..c03ea90fd --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/contrib/huebrowser/README @@ -0,0 +1,62 @@ + +ZooKeeper Browser - Hue Application +=================================== + +The ZooKeeper Browser application allows you to see how the cluster nodes are working and also allows you to do CRUD operations on the znode hierarchy. + +Requirements +------------ + +Hue-1.0: + * http://github.com/downloads/cloudera/hue/hue-1.0.tgz + * http://github.com/downloads/cloudera/hue/release-notes-1.0.html + +ZooKeeper REST gateway: + * available as contrib: contrib/rest + +How to install? +--------------- + +First of all you need to install Hue 1.0 release: + + * http://archive.cloudera.com/cdh/3/hue/sdk/sdk.html + * http://github.com/cloudera/hue/tree/release-1.0 + +After you finish the previous step you should copy the zkui/ folder to apps/ and register the new application: + + * $ ./build/env/bin/python tools/app_reg/app_reg.py --install apps/zkui + * $ ./build/env/bin/python tools/app_reg/app_reg.py --list 2>&1 | grep zkui + zkui 0.1 /Users/philip/src/hue/apps/zkui + + +And restart the Hue application server. + +Configuration +------------- + +Edit zkui/src/zkui/settings.py: + +CLUSTERS = [{ + 'nice_name': 'Default', + 'hostport': 'localhost:2181,localhost:2182,localhost:2183', + 'rest_gateway': 'http://localhost:9998' + }, { + # ... and more clusters + } +] + +What is Hue? +------------ + +Wiki: http://wiki.github.com/cloudera/hue/ +Main Repo: http://github.com/cloudera/hue + +Hue is both a web UI for Hadoop and a framework to create interactive web applications. It features a FileBrowser for accessing HDFS, JobSub and JobBrowser applications for submitting and viewing MapReduce jobs, a Beeswax application for interacting with Hive. On top of that, the web frontend is mostly built from declarative widgets that require no JavaScript and are easy to learn. + +What is ZooKeeper? +------------------ + +http://zookeeper.apache.org/ + +ZooKeeper is a centralized service for maintaining configuration information, naming, providing distributed synchronization, and providing group services. All of these kinds of services are used in some form or another by distributed applications. Each time they are implemented there is a lot of work that goes into fixing the bugs and race conditions that are inevitable. Because of the difficulty of implementing these kinds of services, applications initially usually skimp on them ,which make them brittle in the presence of change and difficult to manage. Even when done correctly, different implementations of these services lead to management complexity when the applications are deployed. + diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/huebrowser/zkui/Makefile b/pkg/registry/zookeeper-3.4.6/src/contrib/huebrowser/zkui/Makefile new file mode 100644 index 000000000..9c22d1c22 --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/contrib/huebrowser/zkui/Makefile @@ -0,0 +1,21 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you 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. + +ifeq ($(ROOT),) + $(error "Error: Expect the environment variable $$ROOT to point to the Desktop installation") +endif + +include $(ROOT)/Makefile.sdk diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/huebrowser/zkui/setup.py b/pkg/registry/zookeeper-3.4.6/src/contrib/huebrowser/zkui/setup.py new file mode 100644 index 000000000..68d1352ca --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/contrib/huebrowser/zkui/setup.py @@ -0,0 +1,46 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you 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. +from setuptools import setup, find_packages +import os + +def expand_package_data(src_dirs, strip=""): + ret = [] + for src_dir in src_dirs: + for path, dnames, fnames in os.walk(src_dir): + for fname in fnames: + ret.append(os.path.join(path, fname).replace(strip, "")) + return ret + +os.chdir(os.path.dirname(os.path.abspath(__file__))) +setup( + name = "zkui", + version = "0.1", + url = 'http://zookeeper.apache.org/', + description = 'ZooKeeper Browser', + packages = find_packages('src'), + package_dir = {'': 'src'}, + install_requires = ['setuptools', 'desktop'], + entry_points = { 'desktop.sdk.application': 'zkui=zkui' }, + zip_safe = False, + package_data = { + # Include static resources. Package_data doesn't + # deal well with directory globs, so we enumerate + # the files manually. + 'zkui': expand_package_data( + ["src/zkui/templates", "src/zkui/static"], + "src/zkui/") + } +) diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/huebrowser/zkui/src/zkui/__init__.py b/pkg/registry/zookeeper-3.4.6/src/contrib/huebrowser/zkui/src/zkui/__init__.py new file mode 100644 index 000000000..eccc8816c --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/contrib/huebrowser/zkui/src/zkui/__init__.py @@ -0,0 +1,16 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at + +# http://www.apache.org/licenses/LICENSE-2.0 + +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/huebrowser/zkui/src/zkui/forms.py b/pkg/registry/zookeeper-3.4.6/src/contrib/huebrowser/zkui/src/zkui/forms.py new file mode 100644 index 000000000..6b1f178fb --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/contrib/huebrowser/zkui/src/zkui/forms.py @@ -0,0 +1,29 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you 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. + +from django import forms +from django.forms.widgets import Textarea, HiddenInput + +class CreateZNodeForm(forms.Form): + name = forms.CharField(max_length=64) + data = forms.CharField(required=False, widget=Textarea) + sequence = forms.BooleanField(required=False) + +class EditZNodeForm(forms.Form): + data = forms.CharField(required=False, widget=Textarea) + version = forms.IntegerField(required=False, widget=HiddenInput) + + diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/huebrowser/zkui/src/zkui/models.py b/pkg/registry/zookeeper-3.4.6/src/contrib/huebrowser/zkui/src/zkui/models.py new file mode 100644 index 000000000..a46696b6d --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/contrib/huebrowser/zkui/src/zkui/models.py @@ -0,0 +1,17 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at + +# http://www.apache.org/licenses/LICENSE-2.0 + +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + + diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/huebrowser/zkui/src/zkui/rest.py b/pkg/registry/zookeeper-3.4.6/src/contrib/huebrowser/zkui/src/zkui/rest.py new file mode 100644 index 000000000..e4874a1ec --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/contrib/huebrowser/zkui/src/zkui/rest.py @@ -0,0 +1,230 @@ + +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you 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. + +import urllib2 +import urllib +import simplejson + +from contextlib import contextmanager + +class RequestWithMethod(urllib2.Request): + """ Request class that know how to set the method name """ + def __init__(self, *args, **kwargs): + urllib2.Request.__init__(self, *args, **kwargs) + self._method = None + + def get_method(self): + return self._method or \ + urllib2.Request.get_method(self) + + def set_method(self, method): + self._method = method + +class ZooKeeper(object): + + class Error(Exception): pass + + class NotFound(Error): pass + + class ZNodeExists(Error): pass + + class InvalidSession(Error): pass + + class WrongVersion(Error): pass + + def __init__(self, uri = 'http://localhost:9998'): + self._base = uri + self._session = None + + def start_session(self, expire=5, id=None): + """ Create a session and return the ID """ + if id is None: + url = "%s/sessions/v1/?op=create&expire=%d" % (self._base, expire) + self._session = self._do_post(url)['id'] + else: + self._session = id + return self._session + + def close_session(self): + """ Close the session on the server """ + if self._session is not None: + url = '%s/sessions/v1/%s' % (self._base, self._session) + self._do_delete(url) + self._session = None + + def heartbeat(self): + """ Send a heartbeat request. This is needed in order to keep a session alive """ + if self._session is not None: + url = '%s/sessions/v1/%s' % (self._base, self._session) + self._do_put(url, '') + + @contextmanager + def session(self, *args, **kwargs): + """ Session handling using a context manager """ + yield self.start_session(*args, **kwargs) + self.close_session() + + def get(self, path): + """ Get a node """ + url = "%s/znodes/v1%s" % (self._base, path) + return self._do_get(url) + + def get_children(self, path): + """ Get all the children for a given path. This function creates a generator """ + for child_path in self.get_children_paths(path, uris=True): + try: + yield self._do_get(child_path) + except ZooKeeper.NotFound: + continue + + def get_children_paths(self, path, uris=False): + """ Get the paths for children nodes """ + url = "%s/znodes/v1%s?view=children" % (self._base, path) + resp = self._do_get(url) + for child in resp.get('children', []): + yield child if not uris else resp['child_uri_template']\ + .replace('{child}', urllib2.quote(child)) + + def create(self, path, data=None, sequence=False, ephemeral=False): + """ Create a new node. By default this call creates a persistent znode. + + You can also create an ephemeral or a sequential znode. + """ + ri = path.rindex('/') + head, name = path[:ri+1], path[ri+1:] + if head != '/': head = head[:-1] + + flags = { + 'null': 'true' if data is None else 'false', + 'ephemeral': 'true' if ephemeral else 'false', + 'sequence': 'true' if sequence else 'false' + } + if ephemeral: + if self._session: + flags['session'] = self._session + else: + raise ZooKeeper.Error, 'You need a session '\ + 'to create an ephemeral node' + flags = urllib.urlencode(flags) + + url = "%s/znodes/v1%s?op=create&name=%s&%s" % \ + (self._base, head, name, flags) + + return self._do_post(url, data) + + def set(self, path, data=None, version=-1, null=False): + """ Set the value of node """ + url = "%s/znodes/v1%s?%s" % (self._base, path, \ + urllib.urlencode({ + 'version': version, + 'null': 'true' if null else 'false' + })) + return self._do_put(url, data) + + def delete(self, path, version=-1): + """ Delete a znode """ + if type(path) is list: + map(lambda el: self.delete(el, version), path) + return + + url = '%s/znodes/v1%s?%s' % (self._base, path, \ + urllib.urlencode({ + 'version':version + })) + try: + return self._do_delete(url) + except urllib2.HTTPError, e: + if e.code == 412: + raise ZooKeeper.WrongVersion(path) + elif e.code == 404: + raise ZooKeeper.NotFound(path) + raise + + def recursive_delete(self, path): + """ Delete all the nodes from the tree """ + for child in self.get_children_paths(path): + fp = ("%s/%s" % (path, child)).replace('//', '/') + self.recursive_delete(fp) + self.delete(path) + + def exists(self, path): + """ Do a znode exists """ + try: + self.get(path) + return True + except ZooKeeper.NotFound: + return False + + def _do_get(self, uri): + """ Send a GET request and convert errors to exceptions """ + try: + req = urllib2.urlopen(uri) + resp = simplejson.load(req) + + if 'Error' in resp: + raise ZooKeeper.Error(resp['Error']) + + return resp + except urllib2.HTTPError, e: + if e.code == 404: + raise ZooKeeper.NotFound(uri) + raise + + def _do_post(self, uri, data=None): + """ Send a POST request and convert errors to exceptions """ + try: + req = urllib2.Request(uri, {}) + req.add_header('Content-Type', 'application/octet-stream') + if data is not None: + req.add_data(data) + + resp = simplejson.load(urllib2.urlopen(req)) + if 'Error' in resp: + raise ZooKeeper.Error(resp['Error']) + return resp + + except urllib2.HTTPError, e: + if e.code == 201: + return True + elif e.code == 409: + raise ZooKeeper.ZNodeExists(uri) + elif e.code == 401: + raise ZooKeeper.InvalidSession(uri) + raise + + def _do_delete(self, uri): + """ Send a DELETE request """ + req = RequestWithMethod(uri) + req.set_method('DELETE') + req.add_header('Content-Type', 'application/octet-stream') + return urllib2.urlopen(req).read() + + def _do_put(self, uri, data): + """ Send a PUT request """ + try: + req = RequestWithMethod(uri) + req.set_method('PUT') + req.add_header('Content-Type', 'application/octet-stream') + if data is not None: + req.add_data(data) + + return urllib2.urlopen(req).read() + except urllib2.HTTPError, e: + if e.code == 412: # precondition failed + raise ZooKeeper.WrongVersion(uri) + raise + diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/huebrowser/zkui/src/zkui/settings.py b/pkg/registry/zookeeper-3.4.6/src/contrib/huebrowser/zkui/src/zkui/settings.py new file mode 100644 index 000000000..844c6952d --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/contrib/huebrowser/zkui/src/zkui/settings.py @@ -0,0 +1,30 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you 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. + +DJANGO_APPS = [ "zkui" ] +NICE_NAME = "ZooKeeper Browser" +REQUIRES_HADOOP = False + +CLUSTERS = [{ + 'nice_name': 'Default', + 'hostport': 'localhost:2181,localhost:2182,localhost:2183', + 'rest_gateway': 'http://localhost:9998' + } +] + +DEPENDER_PACKAGE_YMLS = [ + "src/zkui/static/js/package.yml", +] diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/huebrowser/zkui/src/zkui/static/art/line_icons.png b/pkg/registry/zookeeper-3.4.6/src/contrib/huebrowser/zkui/src/zkui/static/art/line_icons.png new file mode 100644 index 0000000000000000000000000000000000000000..1da4a294b34c5bcfe27ce676c85a2f363bab95c7 GIT binary patch literal 7499 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 UeFd$x$^ZZW07*qoM6N<$f+d!kO#lD@ literal 0 HcmV?d00001 diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/huebrowser/zkui/src/zkui/static/help/index.html b/pkg/registry/zookeeper-3.4.6/src/contrib/huebrowser/zkui/src/zkui/static/help/index.html new file mode 100644 index 000000000..355c8cdd2 --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/contrib/huebrowser/zkui/src/zkui/static/help/index.html @@ -0,0 +1,26 @@ + + +

    ZooKeeper Browser

    + + +

    ZooKeeper is a centralized service for maintaining configuration information, naming, providing distributed synchronization, and providing group services

    + +

    About

    + +

    The ZooKeeper Browser application allows you to see how the cluster nodes are working and also allows you to do CRUD operations on the znode hierarchy.

    + diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/huebrowser/zkui/src/zkui/static/js/package.yml b/pkg/registry/zookeeper-3.4.6/src/contrib/huebrowser/zkui/src/zkui/static/js/package.yml new file mode 100644 index 000000000..c2c07adf6 --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/contrib/huebrowser/zkui/src/zkui/static/js/package.yml @@ -0,0 +1,19 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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. +copyright: Apache License v2.0 +version: 0.1 +description: ZooKeeper Browser +name: ZooKeeper Browser +sources: [Source/Zkui/Zkui.js] diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/huebrowser/zkui/src/zkui/stats.py b/pkg/registry/zookeeper-3.4.6/src/contrib/huebrowser/zkui/src/zkui/stats.py new file mode 100644 index 000000000..48f35dd37 --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/contrib/huebrowser/zkui/src/zkui/stats.py @@ -0,0 +1,170 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you 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. + +import socket +import re + +from StringIO import StringIO + +class Session(object): + + class BrokenLine(Exception): pass + + def __init__(self, session): + m = re.search('/(\d+\.\d+\.\d+\.\d+):(\d+)\[(\d+)\]\((.*)\)', session) + if m: + self.host = m.group(1) + self.port = m.group(2) + self.interest_ops = m.group(3) + for d in m.group(4).split(","): + k,v = d.split("=") + self.__dict__[k] = v + else: + raise Session.BrokenLine() + +class ZooKeeperStats(object): + + def __init__(self, host='localhost', port='2181', timeout=1): + self._address = (host, int(port)) + self._timeout = timeout + + def get_stats(self): + """ Get ZooKeeper server stats as a map """ + data = self._send_cmd('mntr') + if data: + return self._parse(data) + else: + data = self._send_cmd('stat') + return self._parse_stat(data) + + def get_clients(self): + """ Get ZooKeeper server clients """ + clients = [] + + stat = self._send_cmd('stat') + if not stat: + return clients + + sio = StringIO(stat) + + #skip two lines + sio.readline() + sio.readline() + + for line in sio: + if not line.strip(): + break + try: + clients.append(Session(line.strip())) + except Session.BrokenLine: + continue + + return clients + + def _create_socket(self): + return socket.socket() + + def _send_cmd(self, cmd): + """ Send a 4letter word command to the server """ + s = self._create_socket() + s.settimeout(self._timeout) + + s.connect(self._address) + s.send(cmd) + + data = s.recv(2048) + s.close() + + return data + + def _parse(self, data): + """ Parse the output from the 'mntr' 4letter word command """ + h = StringIO(data) + + result = {} + for line in h.readlines(): + try: + key, value = self._parse_line(line) + result[key] = value + except ValueError: + pass # ignore broken lines + + return result + + def _parse_stat(self, data): + """ Parse the output from the 'stat' 4letter word command """ + h = StringIO(data) + + result = {} + + version = h.readline() + if version: + result['zk_version'] = version[version.index(':')+1:].strip() + + # skip all lines until we find the empty one + while h.readline().strip(): pass + + for line in h.readlines(): + m = re.match('Latency min/avg/max: (\d+)/(\d+)/(\d+)', line) + if m is not None: + result['zk_min_latency'] = int(m.group(1)) + result['zk_avg_latency'] = int(m.group(2)) + result['zk_max_latency'] = int(m.group(3)) + continue + + m = re.match('Received: (\d+)', line) + if m is not None: + result['zk_packets_received'] = int(m.group(1)) + continue + + m = re.match('Sent: (\d+)', line) + if m is not None: + result['zk_packets_sent'] = int(m.group(1)) + continue + + m = re.match('Outstanding: (\d+)', line) + if m is not None: + result['zk_outstanding_requests'] = int(m.group(1)) + continue + + m = re.match('Mode: (.*)', line) + if m is not None: + result['zk_server_state'] = m.group(1) + continue + + m = re.match('Node count: (\d+)', line) + if m is not None: + result['zk_znode_count'] = int(m.group(1)) + continue + + return result + + def _parse_line(self, line): + try: + key, value = map(str.strip, line.split('\t')) + except ValueError: + raise ValueError('Found invalid line: %s' % line) + + if not key: + raise ValueError('The key is mandatory and should not be empty') + + try: + value = int(value) + except (TypeError, ValueError): + pass + + return key, value + diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/huebrowser/zkui/src/zkui/templates/clients.mako b/pkg/registry/zookeeper-3.4.6/src/contrib/huebrowser/zkui/src/zkui/templates/clients.mako new file mode 100644 index 000000000..2bee9a7c5 --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/contrib/huebrowser/zkui/src/zkui/templates/clients.mako @@ -0,0 +1,51 @@ +<%! +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you 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. +%> + +<%namespace name="shared" file="shared_components.mako" /> + +${shared.header("ZooKeeper Browser > Clients > %s:%s" % (host, port))} + +

    ${host}:${port} :: client connections

    +
    + +% if clients: + + + + + + + + + + + % for client in clients: + + + + + + + + + % endfor +
    HostPortInterest OpsQueuedReceivedSent
    ${client.host}${client.port}${client.interest_ops}${client.queued}${client.recved}${client.sent}
    +% endif + +${shared.footer()} + diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/huebrowser/zkui/src/zkui/templates/create.mako b/pkg/registry/zookeeper-3.4.6/src/contrib/huebrowser/zkui/src/zkui/templates/create.mako new file mode 100644 index 000000000..2a8b8ccca --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/contrib/huebrowser/zkui/src/zkui/templates/create.mako @@ -0,0 +1,34 @@ +<%! +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you 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. +%> +<%namespace name="shared" file="shared_components.mako" /> + +${shared.header("ZooKeeper Browser > Create Znode")} + +

    Create New Znode :: ${path}

    +

    + +
    + + ${form.as_table()|n} + +
    + +
    +
    + +${shared.footer()} diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/huebrowser/zkui/src/zkui/templates/edit.mako b/pkg/registry/zookeeper-3.4.6/src/contrib/huebrowser/zkui/src/zkui/templates/edit.mako new file mode 100644 index 000000000..997bd07af --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/contrib/huebrowser/zkui/src/zkui/templates/edit.mako @@ -0,0 +1,34 @@ +<%! +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you 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. +%> +<%namespace name="shared" file="shared_components.mako" /> + +${shared.header("ZooKeeper Browser > Edit Znode > %s" % path)} + +

    Edit Znode Data :: ${path}

    +

    + +
    + + ${form.as_table()|n} + +
    + +
    +
    + +${shared.footer()} diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/huebrowser/zkui/src/zkui/templates/index.mako b/pkg/registry/zookeeper-3.4.6/src/contrib/huebrowser/zkui/src/zkui/templates/index.mako new file mode 100644 index 000000000..567919dd0 --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/contrib/huebrowser/zkui/src/zkui/templates/index.mako @@ -0,0 +1,54 @@ +<%! +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you 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. +%> +<%namespace name="shared" file="shared_components.mako" /> + +${shared.header("ZooKeeper Browser")} + +

    Overview

    + +
    + +% for i, c in enumerate(overview): +

    ${i+1}. ${c['nice_name']} Cluster Overview


    + + + + + + + + + + + + % for host, stats in c['stats'].items(): + + + + + + + + % endfor +
    NodeRoleAvg LatencyWatch CountVersion
    ${host}${stats.get('zk_server_state', '')}${stats.get('zk_avg_latency', '')}${stats.get('zk_watch_count', '')}${stats.get('zk_version', '')}
    + +

    +% endfor + +${shared.footer()} + diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/huebrowser/zkui/src/zkui/templates/shared_components.mako b/pkg/registry/zookeeper-3.4.6/src/contrib/huebrowser/zkui/src/zkui/templates/shared_components.mako new file mode 100644 index 000000000..f9a458934 --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/contrib/huebrowser/zkui/src/zkui/templates/shared_components.mako @@ -0,0 +1,66 @@ +<%! +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you 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. +%> + +<%! +import datetime +from django.template.defaultfilters import urlencode, escape +from zkui import settings +%> + +<%def name="header(title='ZooKeeper Browser', toolbar=True)"> + + + + ${title} + + + % if toolbar: +
    + +
    + % endif + +
    +
    + +
    + +

    Clusters

    + +
    + +
    + + +<%def name="info_button(url, text)"> + ${text} + + +<%def name="footer()"> +
    +
    + + + diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/huebrowser/zkui/src/zkui/templates/tree.mako b/pkg/registry/zookeeper-3.4.6/src/contrib/huebrowser/zkui/src/zkui/templates/tree.mako new file mode 100644 index 000000000..c74c20209 --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/contrib/huebrowser/zkui/src/zkui/templates/tree.mako @@ -0,0 +1,75 @@ +<%! +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you 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. +%> +<%namespace name="shared" file="shared_components.mako" /> + +${shared.header("ZooKeeper Browser > Tree > %s > %s" % (cluster['nice_name'], path))} + +

    ${cluster['nice_name'].lower()} :: ${path}

    +
    + + + + + + % for child in children: + + % endfor +
    Children
    + + ${child} + + Delete +
    +
    + + ${shared.info_button(url('zkui.views.create', id=cluster['id'], path=path), 'Create New')} + + +
    + +

    data :: base64 :: length :: ${znode.get('dataLength', 0)}

    +
    + + +
    + + ${shared.info_button(url('zkui.views.edit_as_base64', id=cluster['id'], path=path), 'Edit as Base64')} + ${shared.info_button(url('zkui.views.edit_as_text', id=cluster['id'], path=path), 'Edit as Text')} + +
    +
    + +

    stat information

    +
    + + + + + % for key in ('pzxid', 'ctime', 'aversion', 'mzxid', \ + 'ephemeralOwner', 'version', 'mtime', 'cversion', 'czxid'): + + % endfor +
    KeyValue
    ${key}${znode[key]}
    + +
    +Details on stat information. + +${shared.footer()} + diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/huebrowser/zkui/src/zkui/templates/view.mako b/pkg/registry/zookeeper-3.4.6/src/contrib/huebrowser/zkui/src/zkui/templates/view.mako new file mode 100644 index 000000000..e046afc4f --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/contrib/huebrowser/zkui/src/zkui/templates/view.mako @@ -0,0 +1,128 @@ +<%! +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you 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. +%> +<%namespace name="shared" file="shared_components.mako" /> + +${shared.header("ZooKeeper Browser > %s" % cluster['nice_name'])} + +<%def name="show_stats(stats)"> + + Key + Value + + + Version + ${stats.get('zk_version')} + + + Latency + Min: ${stats.get('zk_min_latency', '')} + Avg: ${stats.get('zk_avg_latency', '')} + Max: ${stats.get('zk_max_latency', '')} + + + Packets + Sent: ${stats.get('zk_packets_sent', '')} + Received: ${stats.get('zk_packets_received', '')} + + + + Outstanding Requests + ${stats.get('zk_outstanding_requests', '')} + + + Watch Count + ${stats.get('zk_watch_count', '')} + + + Open FD Count + ${stats.get('zk_open_file_descriptor_count', '')} + + + Max FD Count + ${stats.get('zk_max_file_descriptor_count', '')} + + + + +

    ${cluster['nice_name']} Cluster Overview

    + +${shared.info_button(url('zkui.views.tree', id=cluster['id'], path='/'), 'View Znode Hierarchy')} + +

    + +% if leader: +

    General

    + + + + + + + + + + + + + + + +
    KeyValue
    ZNode Count${leader.get('zk_znode_count', '')}
    Ephemerals Count${leader.get('zk_ephemerals_count', '')}
    Approximate Data Size${leader.get('zk_approximate_data_size', '')} bytes
    +

    +% endif + +% if leader: +

    node :: ${leader['host']} :: leader

    + + ${shared.info_button(url('zkui.views.clients', host=leader['host']), 'View Client Connections')} + +

    + + ${show_stats(leader)} + + + + + + + + + + + + + +
    Followers${leader.get('zk_followers', '')}
    Synced Followers${leader.get('zk_synced_followers', '')}
    Pending Syncs${leader.get('zk_pending_syncs', '')}
    +

    +% endif + +% for stats in followers: +

    node :: ${stats['host']} :: follower

    +
    + + ${shared.info_button(url('zkui.views.clients', host=stats['host']), 'View Client Connections')} + +

    + + ${show_stats(stats)} +
    +

    +% endfor + +${shared.footer()} + diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/huebrowser/zkui/src/zkui/urls.py b/pkg/registry/zookeeper-3.4.6/src/contrib/huebrowser/zkui/src/zkui/urls.py new file mode 100644 index 000000000..f795f7e71 --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/contrib/huebrowser/zkui/src/zkui/urls.py @@ -0,0 +1,28 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you 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. + +from django.conf.urls.defaults import patterns, url + +urlpatterns = patterns('zkui', + url(r'^$', 'views.index'), + url(r'view/(?P\d+)$', 'views.view'), + url(r'clients/(?P.+)$', 'views.clients'), + url(r'tree/(?P\d+)(?P.+)$', 'views.tree'), + url(r'create/(?P\d+)(?P.*)$', 'views.create'), + url(r'delete/(?P\d+)(?P.*)$', 'views.delete'), + url(r'edit/base64/(?P\d+)(?P.*)$', 'views.edit_as_base64'), + url(r'edit/text/(?P\d+)(?P.*)$', 'views.edit_as_text') +) diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/huebrowser/zkui/src/zkui/utils.py b/pkg/registry/zookeeper-3.4.6/src/contrib/huebrowser/zkui/src/zkui/utils.py new file mode 100644 index 000000000..fb013170f --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/contrib/huebrowser/zkui/src/zkui/utils.py @@ -0,0 +1,33 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you 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. + +from zkui import settings + +from django.http import Http404 + +def get_cluster_or_404(id): + try: + id = int(id) + if not (0 <= id < len(settings.CLUSTERS)): + raise ValueError, 'Undefined cluster id.' + except (TypeError, ValueError): + raise Http404() + + cluster = settings.CLUSTERS[id] + cluster['id'] = id + + return cluster + diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/huebrowser/zkui/src/zkui/views.py b/pkg/registry/zookeeper-3.4.6/src/contrib/huebrowser/zkui/src/zkui/views.py new file mode 100644 index 000000000..64d926b60 --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/contrib/huebrowser/zkui/src/zkui/views.py @@ -0,0 +1,165 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you 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. + +from desktop.lib.django_util import render +from django.http import Http404 + +from zkui import settings +from zkui.stats import ZooKeeperStats +from zkui.rest import ZooKeeper +from zkui.utils import get_cluster_or_404 +from zkui.forms import CreateZNodeForm, EditZNodeForm + +def _get_global_overview(): + overview = [] + for c in settings.CLUSTERS: + overview.append(_get_overview(c)) + return overview + +def _get_overview(cluster): + stats = {} + for s in cluster['hostport'].split(','): + host, port = map(str.strip, s.split(':')) + + zks = ZooKeeperStats(host, port) + stats[s] = zks.get_stats() or {} + + cluster['stats'] = stats + return cluster + +def _group_stats_by_role(cluster): + leader, followers = None, [] + for host, stats in cluster['stats'].items(): + stats['host'] = host + + if stats.get('zk_server_state') == 'leader': + leader = stats + + elif stats.get('zk_server_state') == 'follower': + followers.append(stats) + + return leader, followers + +def index(request): + overview = _get_global_overview() + return render('index.mako', request, + dict(overview=overview)) + +def view(request, id): + cluster = get_cluster_or_404(id) + + cluster = _get_overview(cluster) + leader, followers = _group_stats_by_role(cluster) + + return render('view.mako', request, + dict(cluster=cluster, leader=leader, followers=followers)) + +def clients(request, host): + parts = host.split(':') + if len(parts) != 2: + raise Http404 + + host, port = parts + zks = ZooKeeperStats(host, port) + clients = zks.get_clients() + + return render('clients.mako', request, + dict(host=host, port=port, clients=clients)) + +def tree(request, id, path): + cluster = get_cluster_or_404(id) + zk = ZooKeeper(cluster['rest_gateway']) + + znode = zk.get(path) + children = sorted(zk.get_children_paths(path)) + + return render('tree.mako', request, + dict(cluster=cluster, path=path, \ + znode=znode, children=children)) + +def delete(request, id, path): + cluster = get_cluster_or_404(id) + if request.method == 'POST': + zk = ZooKeeper(cluster['rest_gateway']) + try: + zk.recursive_delete(path) + except ZooKeeper.NotFound: + pass + + return tree(request, id, path[:path.rindex('/')] or '/') + +def create(request, id, path): + cluster = get_cluster_or_404(id) + + if request.method == 'POST': + form = CreateZNodeForm(request.POST) + if form.is_valid(): + zk = ZooKeeper(cluster['rest_gateway']) + + full_path = ("%s/%s" % (path, form.cleaned_data['name']))\ + .replace('//', '/') + + zk.create(full_path, \ + form.cleaned_data['data'], \ + sequence = form.cleaned_data['sequence']) + return tree(request, id, path) + else: + form = CreateZNodeForm() + + return render('create.mako', request, + dict(path=path, form=form)) + +def edit_as_base64(request, id, path): + cluster = get_cluster_or_404(id) + zk = ZooKeeper(cluster['rest_gateway']) + node = zk.get(path) + + if request.method == 'POST': + form = EditZNodeForm(request.POST) + if form.is_valid(): + # TODO is valid base64 string? + data = form.cleaned_data['data'].decode('base64') + zk.set(path, data, form.cleaned_data['version']) + + return tree(request, id, path) + else: + form = EditZNodeForm(dict(\ + data=node.get('data64', ''), + version=node.get('version', '-1'))) + + return render('edit.mako', request, + dict(path=path, form=form)) + +def edit_as_text(request, id, path): + cluster = get_cluster_or_404(id) + zk = ZooKeeper(cluster['rest_gateway']) + node = zk.get(path) + + if request.method == 'POST': + form = EditZNodeForm(request.POST) + if form.is_valid(): + zk.set(path, form.cleaned_data['data']) + + return tree(request, id, path) + else: + form = EditZNodeForm(dict(data=node.get('data64', '')\ + .decode('base64').strip(), + version=node.get('version', '-1'))) + + return render('edit.mako', request, + dict(path=path, form=form)) + + diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/huebrowser/zkui/src/zkui/windmilltests.py b/pkg/registry/zookeeper-3.4.6/src/contrib/huebrowser/zkui/src/zkui/windmilltests.py new file mode 100644 index 000000000..ba44e2686 --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/contrib/huebrowser/zkui/src/zkui/windmilltests.py @@ -0,0 +1,23 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you 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. + +from desktop.lib.windmill_util import logged_in_client + +def test_zkui(): + """ launches the default view for zkui """ + client = logged_in_client() + client.click(id='ccs-zkui-menu') + client.waits.forElement(classname='CCS-ZKUI', timeout='2000') diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/loggraph/README.txt b/pkg/registry/zookeeper-3.4.6/src/contrib/loggraph/README.txt new file mode 100644 index 000000000..1865fa5ab --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/contrib/loggraph/README.txt @@ -0,0 +1,69 @@ +LogGraph README + +1 - About +LogGraph is an application for viewing and filtering zookeeper logs. It can handle transaction logs and message logs. + +2 - Compiling + +Run "ant jar" in src/contrib/loggraph/. This will download all dependencies and compile all the loggraph code. + +Once compilation has finished, you can run it the the loggraph.sh script in src/contrib/loggraph/bin. This will start and embedded web server on your machine. +Navigate to http://localhost:8182/graph/main.html + +3 - Usage +LogGraph presents the user with 4 views, + + a) Simple log view + This view simply displays the log text. This isn't very useful without filters (see "Filtering the logs"). + + b) Server view + The server view shows the interactions between the different servers in an ensemble. The X axis represents time. + * Exceptions show up as red dots. Hovering your mouse over them will give you more details of the exception + * The colour of the line represents the election state of the server. + - orange means LOOKING for leader + - dark green means the server is the leader + - light green means the server is following a leader + - yellow means there isn't enough information to determine the state of the server. + * The gray arrows denote election messages between servers. Pink dashed arrows are messages that were sent but never delivered. + + c) Session view + The session view shows the lifetime of sessions on a server. Use the time filter to narrow down the view. Any more than about 2000 events will take a long time to view in your browser. + The X axis represents time. Each line is a session. The black dots represent events on the session. You can click on the black dots for more details of the event. + + d) Stats view + There is currently only one statistics view, Transactions/minute. Suggestions for other statistic views are very welcome. + +4 - Filtering the logs +The logs can be filtered in 2 ways, by time and by content. + +To filter by time simply move the slider to the desired start time. The time window specifies how many milliseconds after and including the start time will be displayed. + +Content filtering uses a adhoc filtering language, using prefix notation. The language looks somewhat similar to lisp. A statement in the language takes the form (op arg arg ....). A statement resolves to a boolean value. Statements can be nested. + +4.1 - Filter arguments +An argument can be a number, a string or a symbol. A number is any argument which starts with -, + or 0 to 9. If the number starts with 0x it is interpretted as hexidecimal. Otherwise it is interpretted as decimal. If the argument begins with a double-quote, (") it is interpretted as a string. Anything else is interpretted as a symbol. + +4.2 - Filter symbols +The possible filter symbols are: + +client-id : number, the session id of the client who initiated a transaction. +cxid : number, the cxid of a transaction +zxid : number, the zxid of a transaction +operation : string, the operation being performed, for example "setData", "createSession", "closeSession", "error", "create" + +4.3 - Filter operations +The possible filter operations are: + +or : logical or, takes 1 or more arguments which must be other statements. +and : logical and, takes 1 or more arguments which must be other statements. +not : logical not, takes 1 argument which must be another statement. +xor : exclusive or, takes 1 or more arguments which must be other statements. += : equals, takes 1 or more arguments, which must all be equal to each other to return true. +> : greater than, takes 1 or more arguments, to return true the 1st argument must be greater than the 2nd argument which must be greater than the 3rd argument and so on... +< : less than, takes 1 or more arguments, to return true the 1st argument must be less than the 2nd argument which must be less than the 3rd argument and so on... + +4.3 - Filter examples +Give me all the setData operations with session id 0xdeadbeef or 0xcafeb33r but not with zxid 0x12341234 -> + +(and (= operation "setData") (or (= client-id 0xdeadbeef) (= client-id 0xcafeb33r)) (not (= zxid 0x12341234))) + diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/loggraph/bin/loggraph-dev.sh b/pkg/registry/zookeeper-3.4.6/src/contrib/loggraph/bin/loggraph-dev.sh new file mode 100755 index 000000000..0b82efa35 --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/contrib/loggraph/bin/loggraph-dev.sh @@ -0,0 +1,43 @@ +#!/bin/sh + +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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. + +make_canonical () { + cd $1; pwd; +} + +SCRIPTDIR=`dirname $0` +BUILDDIR=`make_canonical $SCRIPTDIR/../../../../build/contrib/loggraph` +LIBDIR=`make_canonical $BUILDDIR/lib` +WEBDIR=`make_canonical $SCRIPTDIR/../web` +ZKDIR=`make_canonical $SCRIPTDIR/../../../../build/` + +if [ ! -x $BUILDDIR ]; then + echo "\n\n*** You need to build loggraph before running it ***\n\n"; + exit; +fi + +for i in `ls $LIBDIR`; do + CLASSPATH=$LIBDIR/$i:$CLASSPATH +done + +for i in $ZKDIR/zookeeper-*.jar; do + CLASSPATH="$i:$CLASSPATH" +done + +CLASSPATH=$BUILDDIR/classes:$WEBDIR:$CLASSPATH +echo $CLASSPATH +java -Dlog4j.configuration=org/apache/zookeeper/graph/log4j.properties -Xdebug -Xrunjdwp:transport=dt_socket,address=4444,server=y,suspend=n -cp $CLASSPATH org.apache.zookeeper.graph.LogServer $* diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/loggraph/bin/loggraph.sh b/pkg/registry/zookeeper-3.4.6/src/contrib/loggraph/bin/loggraph.sh new file mode 100755 index 000000000..381e5ad47 --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/contrib/loggraph/bin/loggraph.sh @@ -0,0 +1,48 @@ +#!/bin/sh + +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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. + +make_canonical () { + cd $1; pwd; +} + +SCRIPTDIR=`dirname $0` +BUILDDIR=`make_canonical $SCRIPTDIR/../../../../build/contrib/loggraph` +LIBDIR=`make_canonical $BUILDDIR/lib` +ZKDIR=`make_canonical $SCRIPTDIR/../../../../build/` + +if [ ! -x $BUILDDIR ]; then + echo "\n\n*** You need to build loggraph before running it ***\n\n"; + exit; +fi + +for i in `ls $LIBDIR`; do + CLASSPATH=$LIBDIR/$i:$CLASSPATH +done + +for i in `ls $BUILDDIR/*.jar`; do + CLASSPATH=$i:$CLASSPATH +done + +for i in $ZKDIR/zookeeper-*.jar; do + CLASSPATH="$i:$CLASSPATH" +done + +java -cp $CLASSPATH org.apache.zookeeper.graph.LogServer $* + + + + diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/loggraph/build.xml b/pkg/registry/zookeeper-3.4.6/src/contrib/loggraph/build.xml new file mode 100644 index 000000000..5be6970b6 --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/contrib/loggraph/build.xml @@ -0,0 +1,70 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/loggraph/ivy.xml b/pkg/registry/zookeeper-3.4.6/src/contrib/loggraph/ivy.xml new file mode 100644 index 000000000..d6fa9d6d7 --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/contrib/loggraph/ivy.xml @@ -0,0 +1,44 @@ + + + + + + + + ZooKeeper Graphing + + + + + + + + + + + + + + + + + + + diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/loggraph/src/java/org/apache/zookeeper/graph/FilterException.java b/pkg/registry/zookeeper-3.4.6/src/contrib/loggraph/src/java/org/apache/zookeeper/graph/FilterException.java new file mode 100644 index 000000000..c0912fa7d --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/contrib/loggraph/src/java/org/apache/zookeeper/graph/FilterException.java @@ -0,0 +1,22 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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. + */ +package org.apache.zookeeper.graph; + +public class FilterException extends Exception { + public FilterException(String s) { super(s); } +}; diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/loggraph/src/java/org/apache/zookeeper/graph/FilterOp.java b/pkg/registry/zookeeper-3.4.6/src/contrib/loggraph/src/java/org/apache/zookeeper/graph/FilterOp.java new file mode 100644 index 000000000..ee7328323 --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/contrib/loggraph/src/java/org/apache/zookeeper/graph/FilterOp.java @@ -0,0 +1,75 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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. + */ +package org.apache.zookeeper.graph; + +import java.util.ArrayList; +import org.apache.zookeeper.graph.filterops.*; + +public abstract class FilterOp { + protected ArrayList subOps; + protected ArrayList args; + + public enum ArgType { + STRING, NUMBER, SYMBOL + } + + public FilterOp() { + subOps = new ArrayList(); + args = new ArrayList(); + } + + public static FilterOp newOp(String op) throws FilterException { + if (op.equals("or")) + return new OrOp(); + if (op.equals("and")) + return new AndOp(); + if (op.equals("not")) + return new NotOp(); + if (op.equals("xor")) + return new XorOp(); + if (op.equals("=")) + return new EqualsOp(); + if (op.equals("<")) + return new LessThanOp(); + if (op.equals(">")) + return new GreaterThanOp(); + + throw new FilterException("Invalid operation '"+op+"'"); + } + + public void addSubOp(FilterOp op) { + subOps.add(op); + } + + public void addArg(Arg arg) { + args.add(arg); + } + + public abstract boolean matches(LogEntry entry) throws FilterException; + + public String toString() { + String op = "(" + getClass().getName(); + for (FilterOp f : subOps) { + op += " " + f; + } + for (Arg a : args) { + op += " " + a; + } + return op + ")"; + } +} diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/loggraph/src/java/org/apache/zookeeper/graph/FilterParser.java b/pkg/registry/zookeeper-3.4.6/src/contrib/loggraph/src/java/org/apache/zookeeper/graph/FilterParser.java new file mode 100644 index 000000000..cf12e3a53 --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/contrib/loggraph/src/java/org/apache/zookeeper/graph/FilterParser.java @@ -0,0 +1,131 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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. + */ +package org.apache.zookeeper.graph; + +import java.io.PushbackReader; +import java.io.StringReader; +import java.io.IOException; +import java.util.ArrayList; + +import org.apache.zookeeper.graph.filterops.*; + +public class FilterParser { + private PushbackReader reader; + + public FilterParser(String s) { + reader = new PushbackReader(new StringReader(s)); + } + + private String readUntilSpace() throws IOException { + StringBuffer buffer = new StringBuffer(); + + int c = reader.read(); + while (!Character.isWhitespace(c) && c != ')' && c != '(') { + buffer.append((char)c); + c = reader.read(); + if (c == -1) { + break; + } + } + reader.unread(c); + + return buffer.toString().trim(); + } + + private StringArg readStringArg() throws IOException, FilterException { + int c = reader.read(); + int last = 0; + if (c != '"') { + throw new FilterException("Check the parser, trying to read a string that doesn't begin with quotes"); + } + StringBuffer buffer = new StringBuffer(); + while (reader.ready()) { + last = c; + c = reader.read(); + if (c == -1) { + break; + } + + if (c == '"' && last != '\\') { + return new StringArg(buffer.toString()); + } else { + buffer.append((char)c); + } + } + throw new FilterException("Unterminated string"); + } + + private NumberArg readNumberArg() throws IOException, FilterException { + String strval = readUntilSpace(); + + try { + if (strval.startsWith("0x")) { + return new NumberArg(Long.valueOf(strval.substring(2), 16)); + } else { + return new NumberArg(Long.valueOf(strval)); + } + } catch (NumberFormatException e) { + throw new FilterException("Not a number [" + strval + "]\n" + e); + } + } + + private SymbolArg readSymbolArg() throws IOException, FilterException { + return new SymbolArg(readUntilSpace()); + } + + public FilterOp parse() throws IOException, FilterException { + int c = reader.read(); + if (c != '(') { + throw new FilterException("Invalid format"); + } + + String opstr = readUntilSpace(); + FilterOp op = FilterOp.newOp(opstr); + + while (reader.ready()) { + c = reader.read(); + if (c == -1) { + break; + } + if (c == '(') { + reader.unread(c); + op.addSubOp(parse()); + } else if (c == ')') { + return op; + } else if (c == '"') { + reader.unread(c); + op.addArg(readStringArg()); + } else if (Character.isDigit(c) || c == '-' || c == '+') { + reader.unread(c); + op.addArg(readNumberArg()); + } else if (Character.isJavaIdentifierStart(c)) { + reader.unread(c); + op.addArg(readSymbolArg()); + } + } + throw new FilterException("Incomplete filter"); + } + + public static void main(String[] args) throws IOException, FilterException { + if (args.length == 1) { + System.out.println(new FilterParser(args[0]).parse()); + } else { + System.out.println(new FilterParser("(or (and (= session foobar) (= session barfoo)) (= session sdfs))").parse()); + } + } +}; diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/loggraph/src/java/org/apache/zookeeper/graph/JsonGenerator.java b/pkg/registry/zookeeper-3.4.6/src/contrib/loggraph/src/java/org/apache/zookeeper/graph/JsonGenerator.java new file mode 100644 index 000000000..afaf3a1c9 --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/contrib/loggraph/src/java/org/apache/zookeeper/graph/JsonGenerator.java @@ -0,0 +1,223 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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. + */ +package org.apache.zookeeper.graph; + + +import org.json.simple.JSONArray; +import org.json.simple.JSONObject; +import org.json.simple.JSONValue; + +import java.io.Writer; +import java.io.OutputStreamWriter; +import java.io.IOException; +import java.util.regex.Pattern; +import java.util.regex.Matcher; +import java.util.HashSet; +import java.util.Iterator; +import java.util.LinkedList; +import java.util.ListIterator; + +public class JsonGenerator { + private JSONObject root; + private HashSet servers; + + private class Message { + private int from; + private int to; + private long zxid; + + public Message(int from, int to, long zxid) { + this.from = from; + this.to = to; + this.zxid = zxid; + } + + public boolean equals(Message m) { + return (m.from == this.from + && m.to == this.to + && m.zxid == this.zxid); + } + }; + + public JSONObject txnEntry(TransactionEntry e) { + JSONObject event = new JSONObject(); + + event.put("time", Long.toString(e.getTimestamp())); + event.put("client", Long.toHexString(e.getClientId())); + event.put("cxid", Long.toHexString(e.getCxid())); + event.put("zxid", Long.toHexString(e.getZxid())); + event.put("op", e.getOp()); + event.put("extra", e.getExtra()); + event.put("type", "transaction"); + + return event; + } + + /** + Assumes entries are sorted by timestamp. + */ + public JsonGenerator(LogIterator iter) { + servers = new HashSet(); + + Pattern stateChangeP = Pattern.compile("- (LOOKING|FOLLOWING|LEADING)"); + Pattern newElectionP = Pattern.compile("New election. My id = (\\d+), Proposed zxid = (\\d+)"); + Pattern receivedProposalP = Pattern.compile("Notification: (\\d+) \\(n.leader\\), (\\d+) \\(n.zxid\\), (\\d+) \\(n.round\\), .+ \\(n.state\\), (\\d+) \\(n.sid\\), .+ \\(my state\\)"); + Pattern exceptionP = Pattern.compile("xception"); + + root = new JSONObject(); + Matcher m = null; + JSONArray events = new JSONArray(); + root.put("events", events); + + long starttime = Long.MAX_VALUE; + long endtime = 0; + + int leader = 0; + long curEpoch = 0; + boolean newEpoch = false; + + while (iter.hasNext()) { + LogEntry ent = iter.next(); + + if (ent.getTimestamp() < starttime) { + starttime = ent.getTimestamp(); + } + if (ent.getTimestamp() > endtime) { + endtime = ent.getTimestamp(); + } + + if (ent.getType() == LogEntry.Type.TXN) { + events.add(txnEntry((TransactionEntry)ent)); + } else { + Log4JEntry e = (Log4JEntry)ent; + servers.add(e.getNode()); + + if ((m = stateChangeP.matcher(e.getEntry())).find()) { + JSONObject stateChange = new JSONObject(); + stateChange.put("type", "stateChange"); + stateChange.put("time", e.getTimestamp()); + stateChange.put("server", e.getNode()); + stateChange.put("state", m.group(1)); + events.add(stateChange); + + if (m.group(1).equals("LEADING")) { + leader = e.getNode(); + } + } else if ((m = newElectionP.matcher(e.getEntry())).find()) { + Iterator iterator = servers.iterator(); + long zxid = Long.valueOf(m.group(2)); + int count = (int)zxid;// & 0xFFFFFFFFL; + int epoch = (int)Long.rotateRight(zxid, 32);// >> 32; + + if (leader != 0 && epoch > curEpoch) { + JSONObject stateChange = new JSONObject(); + stateChange.put("type", "stateChange"); + stateChange.put("time", e.getTimestamp()); + stateChange.put("server", leader); + stateChange.put("state", "INIT"); + events.add(stateChange); + leader = 0; + } + + while (iterator.hasNext()) { + int dst = iterator.next(); + if (dst != e.getNode()) { + JSONObject msg = new JSONObject(); + msg.put("type", "postmessage"); + msg.put("src", e.getNode()); + msg.put("dst", dst); + msg.put("time", e.getTimestamp()); + msg.put("zxid", m.group(2)); + msg.put("count", count); + msg.put("epoch", epoch); + + events.add(msg); + } + } + } else if ((m = receivedProposalP.matcher(e.getEntry())).find()) { + // Pattern.compile("Notification: \\d+, (\\d+), (\\d+), \\d+, [^,]*, [^,]*, (\\d+)");//, LOOKING, LOOKING, 2 + int src = Integer.valueOf(m.group(4)); + long zxid = Long.valueOf(m.group(2)); + int dst = e.getNode(); + long epoch2 = Long.valueOf(m.group(3)); + + int count = (int)zxid;// & 0xFFFFFFFFL; + int epoch = (int)Long.rotateRight(zxid, 32);// >> 32; + + if (leader != 0 && epoch > curEpoch) { + JSONObject stateChange = new JSONObject(); + stateChange.put("type", "stateChange"); + stateChange.put("time", e.getTimestamp()); + stateChange.put("server", leader); + stateChange.put("state", "INIT"); + events.add(stateChange); + leader = 0; + } + + if (src != dst) { + JSONObject msg = new JSONObject(); + msg.put("type", "delivermessage"); + msg.put("src", src); + msg.put("dst", dst); + msg.put("time", e.getTimestamp()); + msg.put("zxid", zxid); + msg.put("epoch", epoch); + msg.put("count", count); + msg.put("epoch2", epoch2); + + events.add(msg); + } + } else if ((m = exceptionP.matcher(e.getEntry())).find()) { + JSONObject ex = new JSONObject(); + ex.put("type", "exception"); + ex.put("server", e.getNode()); + ex.put("time", e.getTimestamp()); + ex.put("text", e.getEntry()); + events.add(ex); + } + } + JSONObject ex = new JSONObject(); + ex.put("type", "text"); + ex.put("time", ent.getTimestamp()); + String txt = ent.toString(); + ex.put("text", txt); + events.add(ex); + } + // System.out.println("pending messages: "+pendingMessages.size()); + root.put("starttime", starttime); + root.put("endtime", endtime); + + JSONArray serversarray = new JSONArray(); + root.put("servers", serversarray); + + Iterator iterator = servers.iterator(); + while (iterator.hasNext()) { + serversarray.add(iterator.next()); + } + } + + public String toString() { + return JSONValue.toJSONString(root); + } + + public static void main(String[] args) throws Exception { + MergedLogSource src = new MergedLogSource(args); + LogIterator iter = src.iterator(); + System.out.println(new JsonGenerator(iter)); + } +} diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/loggraph/src/java/org/apache/zookeeper/graph/Log4JEntry.java b/pkg/registry/zookeeper-3.4.6/src/contrib/loggraph/src/java/org/apache/zookeeper/graph/Log4JEntry.java new file mode 100644 index 000000000..0edc14602 --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/contrib/loggraph/src/java/org/apache/zookeeper/graph/Log4JEntry.java @@ -0,0 +1,40 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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. + */ +package org.apache.zookeeper.graph; + +public class Log4JEntry extends LogEntry { + public Log4JEntry(long timestamp, int node, String entry) { + super(timestamp); + setAttribute("log-text", entry); + setAttribute("node", new Integer(node)); + } + + public String getEntry() { + return (String) getAttribute("log-text"); + } + + public String toString() { + return "" + getTimestamp() + "::::" + getNode() + "::::" + getEntry(); + } + + public int getNode() { + return (Integer) getAttribute("node"); + } + + public Type getType() { return LogEntry.Type.LOG4J; } +} diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/loggraph/src/java/org/apache/zookeeper/graph/Log4JSource.java b/pkg/registry/zookeeper-3.4.6/src/contrib/loggraph/src/java/org/apache/zookeeper/graph/Log4JSource.java new file mode 100644 index 000000000..78f0898b1 --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/contrib/loggraph/src/java/org/apache/zookeeper/graph/Log4JSource.java @@ -0,0 +1,381 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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. + */ +package org.apache.zookeeper.graph; + +import java.io.File; +import java.io.InputStreamReader; +import java.io.BufferedReader; +import java.io.FileReader; +import java.io.IOException; +import java.util.regex.Pattern; +import java.util.regex.Matcher; +import java.util.ArrayList; +import java.util.Date; +import java.text.SimpleDateFormat; +import java.text.ParseException; +import java.util.Calendar; +import java.util.GregorianCalendar; + +import java.io.EOFException; +import java.io.Closeable; +import java.io.FileNotFoundException; +import java.util.Iterator; +import java.util.NoSuchElementException; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class Log4JSource implements LogSource { + private static final Logger LOG = LoggerFactory.getLogger(Log4JSource.class); + + private static final int skipN = 10000; + private static final String DATE_FORMAT = "yyyy-MM-dd HH:mm:ss,SSS"; + + private LogSkipList skiplist = null; + + private String file = null; + private long starttime = 0; + private long endtime = 0; + private int serverid = 0; + private long size = 0; + + private Pattern timep; + + public boolean overlapsRange(long starttime, long endtime) { + return (starttime <= this.endtime && endtime >= this.starttime); + } + + public long size() { return size; } + public long getStartTime() { return starttime; } + public long getEndTime() { return endtime; } + public LogSkipList getSkipList() { return skiplist; } + + private class Log4JSourceIterator implements LogIterator { + private RandomAccessFileReader in; + private LogEntry next = null; + private long starttime = 0; + private long endtime = 0; + private String buf = ""; + private Log4JSource src = null; + private long skippedAtStart = 0; + private SimpleDateFormat dateformat = null; + private FilterOp filter = null; + + public Log4JSourceIterator(Log4JSource src, long starttime, long endtime) throws IllegalArgumentException, FilterException { + this(src, starttime, endtime, null); + } + + public Log4JSourceIterator(Log4JSource src, long starttime, long endtime, FilterOp filter) throws IllegalArgumentException, FilterException { + + this.dateformat = new SimpleDateFormat(DATE_FORMAT); + this.src = src; + this.starttime = starttime; + this.endtime = endtime; + + File f = new File(src.file); + try { + in = new RandomAccessFileReader(f); + } catch (FileNotFoundException e) { + throw new IllegalArgumentException("Bad file passed in (" + src.file +") cannot open:" + e); + } + + // skip to the offset of latest skip point before starttime + LogSkipList.Mark start = src.getSkipList().findMarkBefore(starttime); + try { + in.seek(start.getBytes()); + skippedAtStart = start.getEntriesSkipped(); + } catch (IOException ioe) { + // if we can't skip, we should just read from the start + } + + LogEntry e; + while ((e = readNextEntry()) != null && e.getTimestamp() < endtime) { + if (e.getTimestamp() >= starttime && (filter == null || filter.matches(e))) { + next = e; + return; + } + skippedAtStart++; + } + this.filter = filter; + } + + synchronized public long size() throws IOException { + if (LOG.isTraceEnabled()) { + LOG.trace("size() called"); + } + + if (this.endtime >= src.getEndTime()) { + return src.size() - skippedAtStart; + } + + long pos = in.getPosition(); + + if (LOG.isTraceEnabled()) { + LOG.trace("saved pos () = " + pos); + } + + LogEntry e; + + LogSkipList.Mark lastseg = src.getSkipList().findMarkBefore(this.endtime); + in.seek(lastseg.getBytes()); + buf = ""; // clear the buf so we don't get something we read before we sought + // number of entries skipped to get to the end of the iterator, less the number skipped to get to the start + long count = lastseg.getEntriesSkipped() - skippedAtStart; + + while ((e = readNextEntry()) != null) { + if (LOG.isTraceEnabled()) { + //LOG.trace(e); + } + if (e.getTimestamp() > this.endtime) { + break; + } + count++; + } + in.seek(pos); + buf = ""; + + if (LOG.isTraceEnabled()) { + LOG.trace("size() = " + count); + } + + return count; + } + + synchronized private LogEntry readNextEntry() { + try { + try { + while (true) { + String line = in.readLine(); + if (line == null) { + break; + } + + Matcher m = src.timep.matcher(line); + if (m.lookingAt()) { + if (buf.length() > 0) { + LogEntry e = new Log4JEntry(src.timestampFromText(dateformat, buf), src.getServerId(), buf); + buf = line; + return e; + } + buf = line; + } else if (buf.length() > 0) { + buf += line + "\n"; + } + } + } catch (EOFException eof) { + // ignore, we've simply come to the end of the file + } + if (buf.length() > 0) { + LogEntry e = new Log4JEntry(src.timestampFromText(dateformat, buf), src.getServerId(), buf); + buf = ""; + return e; + } + } catch (Exception e) { + LOG.error("Error reading next entry in file (" + src.file + "): " + e); + return null; + } + return null; + } + + public boolean hasNext() { + return next != null; + } + + public LogEntry next() throws NoSuchElementException { + LogEntry ret = next; + LogEntry e = readNextEntry(); + + if (filter != null) { + try { + while (e != null && !filter.matches(e)) { + e = readNextEntry(); + } + } catch (FilterException fe) { + throw new NoSuchElementException(e.toString()); + } + } + + if (e != null && e.getTimestamp() < endtime) { + next = e; + } else { + next = null; + } + return ret; + } + + public void remove() throws UnsupportedOperationException { + throw new UnsupportedOperationException("remove not supported for L4J logs"); + } + + public void close() throws IOException { + in.close(); + } + + public String toString() { + String size; + try { + size = new Long(size()).toString(); + } catch (IOException ioe) { + size = "Unable to read"; + } + return "Log4JSourceIterator(start=" + starttime + ", end=" + endtime + ", size=" + size + ")"; + } + } + + public LogIterator iterator(long starttime, long endtime) throws IllegalArgumentException { + try { + return iterator(starttime, endtime, null); + } catch (FilterException fe) { + assert(false); //"This should never happen, you can't have a filter exception without a filter"); + return null; + } + } + + public LogIterator iterator(long starttime, long endtime, FilterOp filter) throws IllegalArgumentException, FilterException{ + // sanitise start and end times + if (endtime < starttime) { + throw new IllegalArgumentException("End time (" + endtime + ") must be greater or equal to starttime (" + starttime + ")"); + } + + return new Log4JSourceIterator(this, starttime, endtime, filter); + } + + public LogIterator iterator() throws IllegalArgumentException { + return iterator(starttime, endtime+1); + } + + public Log4JSource(String file) throws IOException { + this.file=file; + + timep = Pattern.compile("^(\\d{4}-\\d{2}-\\d{2} \\d{2}:\\d{2}:\\d{2},\\d{3})"); + skiplist = new LogSkipList(); + init(); + } + + private static long timestampFromText(SimpleDateFormat format, String s) { + Date d = null; + try { + d = format.parse(s); + } catch (ParseException e) { + return 0; + } + Calendar c = new GregorianCalendar(); + c.setTime(d); + return c.getTimeInMillis(); + } + + private void init() throws IOException { + File f = new File(file); + RandomAccessFileReader in = new RandomAccessFileReader(f); + SimpleDateFormat dateformat = new SimpleDateFormat(DATE_FORMAT); + Pattern idp = Pattern.compile("\\[myid:(\\d+)\\]"); + + long lastFp = in.getPosition(); + String line = in.readLine(); + Matcher m = null; + + // if we have read data from the file, and it matchs the timep pattern + if ((line != null) && (m = timep.matcher(line)).lookingAt()) { + starttime = timestampFromText(dateformat, m.group(1)); + } else { + throw new IOException("Invalid log4j format. First line doesn't start with time"); + } + + /* + Count number of log entries. Any line starting with a timestamp counts as an entry + */ + String lastentry = line; + try { + while (line != null) { + m = timep.matcher(line); + if (m.lookingAt()) { + if (size % skipN == 0) { + long time = timestampFromText(dateformat, m.group(1)); + skiplist.addMark(time, lastFp, size); + } + size++; + lastentry = line; + } + if (serverid == 0 && (m = idp.matcher(line)).find()) { + serverid = Integer.valueOf(m.group(1)); + } + + lastFp = in.getPosition(); + line = in.readLine(); + } + } catch (EOFException eof) { + // ignore, simply end of file, though really (line!=null) should have caught this + } finally { + in.close(); + } + + m = timep.matcher(lastentry); + if (m.lookingAt()) { + endtime = timestampFromText(dateformat, m.group(1)); + } else { + throw new IOException("Invalid log4j format. Last line doesn't start with time"); + } + } + + public String toString() { + return "Log4JSource(file=" + file + ", size=" + size + ", start=" + starttime + ", end=" + endtime +", id=" + serverid +")"; + } + + public static void main(String[] args) throws IOException { + final Log4JSource s = new Log4JSource(args[0]); + System.out.println(s); + + LogIterator iter; + + if (args.length == 3) { + final long starttime = Long.valueOf(args[1]); + final long endtime = Long.valueOf(args[2]); + iter = s.iterator(starttime, endtime); + + Thread t1 = new Thread() { public void run () { + + LogIterator iter = s.iterator(starttime, endtime); + System.out.println(iter); + }; }; + Thread t2 = new Thread() { public void run () { + + LogIterator iter = s.iterator(starttime, endtime); + System.out.println(iter); + }; }; + Thread t3 = new Thread() { public void run () { + + LogIterator iter = s.iterator(starttime, endtime); + System.out.println(iter); + }; }; + t1.start(); + t2.start(); + // t3.start(); + } else { + iter = s.iterator(); + } + + /*while (iter.hasNext()) { + System.out.println(iter.next()); + }*/ + iter.close(); + } + + public int getServerId() { + return serverid; + } +} diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/loggraph/src/java/org/apache/zookeeper/graph/LogEntry.java b/pkg/registry/zookeeper-3.4.6/src/contrib/loggraph/src/java/org/apache/zookeeper/graph/LogEntry.java new file mode 100644 index 000000000..a8252ebb9 --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/contrib/loggraph/src/java/org/apache/zookeeper/graph/LogEntry.java @@ -0,0 +1,46 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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. + */ +package org.apache.zookeeper.graph; + +import java.io.Serializable; +import java.util.HashMap; + +public abstract class LogEntry implements Serializable { + private HashMap attributes; + + public enum Type { UNKNOWN, LOG4J, TXN }; + + public LogEntry(long timestamp) { + attributes = new HashMap(); + setAttribute("timestamp", new Long(timestamp)); + } + + public long getTimestamp() { + return (Long)getAttribute("timestamp"); + } + + public abstract Type getType(); + + public void setAttribute(String key, Object v) { + attributes.put(key, v); + } + + public Object getAttribute(String key) { + return attributes.get(key); + } +} diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/loggraph/src/java/org/apache/zookeeper/graph/LogIterator.java b/pkg/registry/zookeeper-3.4.6/src/contrib/loggraph/src/java/org/apache/zookeeper/graph/LogIterator.java new file mode 100644 index 000000000..9af440ba1 --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/contrib/loggraph/src/java/org/apache/zookeeper/graph/LogIterator.java @@ -0,0 +1,26 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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. + */ +package org.apache.zookeeper.graph; + +import java.io.Closeable; +import java.util.Iterator; +import java.io.IOException; + +public interface LogIterator extends Iterator, Closeable { + long size() throws IOException;; +}; diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/loggraph/src/java/org/apache/zookeeper/graph/LogServer.java b/pkg/registry/zookeeper-3.4.6/src/contrib/loggraph/src/java/org/apache/zookeeper/graph/LogServer.java new file mode 100644 index 000000000..5cffcdd1d --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/contrib/loggraph/src/java/org/apache/zookeeper/graph/LogServer.java @@ -0,0 +1,66 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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. + */ +package org.apache.zookeeper.graph; + +import java.io.IOException; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import javax.servlet.ServletException; + +import java.io.IOException; + +import org.eclipse.jetty.server.Server; +import org.eclipse.jetty.server.Request; +import org.eclipse.jetty.server.handler.AbstractHandler; +import org.eclipse.jetty.servlet.ServletContextHandler; +import org.eclipse.jetty.servlet.ServletHolder; + +import org.apache.zookeeper.graph.servlets.*; + +public class LogServer extends ServletContextHandler { + public LogServer(MergedLogSource src) throws Exception { + super(ServletContextHandler.SESSIONS); + setContextPath("/"); + + addServlet(new ServletHolder(new StaticContent()),"/graph/*"); + + addServlet(new ServletHolder(new Fs()),"/fs"); + addServlet(new ServletHolder(new GraphData(src)), "/data"); + addServlet(new ServletHolder(new FileLoader(src)), "/loadfile"); + addServlet(new ServletHolder(new NumEvents(src)), "/info"); + addServlet(new ServletHolder(new Throughput(src)), "/throughput"); + } + + public static void main(String[] args) { + try { + MergedLogSource src = new MergedLogSource(args); + System.out.println(src); + + Server server = new Server(8182); + server.setHandler(new LogServer(src)); + + server.start(); + server.join(); + + } catch (Exception e) { + // Something is wrong. + e.printStackTrace(); + } + } +} diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/loggraph/src/java/org/apache/zookeeper/graph/LogSkipList.java b/pkg/registry/zookeeper-3.4.6/src/contrib/loggraph/src/java/org/apache/zookeeper/graph/LogSkipList.java new file mode 100644 index 000000000..e74444291 --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/contrib/loggraph/src/java/org/apache/zookeeper/graph/LogSkipList.java @@ -0,0 +1,95 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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. + */ +package org.apache.zookeeper.graph; + +import java.util.List; +import java.util.LinkedList; +import java.util.NoSuchElementException; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** +Generic skip list for holding a rough index of a log file. When the log file is loaded, this +index is built by adding a mark every n entries. Then when a specific time position is requested +from the file, a point at most n-1 entries before the time position can be jumped to. + +*/ +public class LogSkipList { + private static final Logger LOG = LoggerFactory.getLogger(LogSkipList.class); + + private LinkedList marks; + + public class Mark { + private long time; + private long bytes; + private long skipped; + + public Mark(long time, long bytes, long skipped) { + this.time = time; + this.bytes = bytes; + this.skipped = skipped; + } + + public long getTime() { return this.time; } + public long getBytes() { return this.bytes; } + public long getEntriesSkipped() { return this.skipped; } + + public String toString() { + return "Mark(time=" + time + ", bytes=" + bytes + ", skipped=" + skipped + ")"; + } + }; + + public LogSkipList() { + if (LOG.isTraceEnabled()) { + LOG.trace("New skip list"); + } + marks = new LinkedList(); + } + + public void addMark(long time, long bytes, long skipped) { + if (LOG.isTraceEnabled()) { + LOG.trace("addMark (time:" + time + ", bytes: " + bytes + ", skipped: " + skipped + ")"); + } + marks.add(new Mark(time, bytes, skipped)); + } + + /** + Find the last mark in the skip list before time. + */ + public Mark findMarkBefore(long time) throws NoSuchElementException { + if (LOG.isTraceEnabled()) { + LOG.trace("findMarkBefore(" + time + ")"); + } + + Mark last = marks.getFirst(); + for (Mark m: marks) { + if (m.getTime() > time) { + break; + } + last = m; + } + + if (LOG.isTraceEnabled()) { + LOG.trace("return " + last ); + } + + return last; + } + +}; diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/loggraph/src/java/org/apache/zookeeper/graph/LogSource.java b/pkg/registry/zookeeper-3.4.6/src/contrib/loggraph/src/java/org/apache/zookeeper/graph/LogSource.java new file mode 100644 index 000000000..9845c7f0b --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/contrib/loggraph/src/java/org/apache/zookeeper/graph/LogSource.java @@ -0,0 +1,33 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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. + */ +package org.apache.zookeeper.graph; +import java.util.Iterator; + +public interface LogSource extends Iterable { + public LogIterator iterator(long starttime, long endtime, FilterOp filter) throws IllegalArgumentException, FilterException; + + public LogIterator iterator(long starttime, long endtime) throws IllegalArgumentException; + + public LogIterator iterator() throws IllegalArgumentException; + + public boolean overlapsRange(long starttime, long endtime); + + public long size(); + public long getStartTime(); + public long getEndTime(); +} diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/loggraph/src/java/org/apache/zookeeper/graph/MeasureThroughput.java b/pkg/registry/zookeeper-3.4.6/src/contrib/loggraph/src/java/org/apache/zookeeper/graph/MeasureThroughput.java new file mode 100644 index 000000000..1c83da7af --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/contrib/loggraph/src/java/org/apache/zookeeper/graph/MeasureThroughput.java @@ -0,0 +1,103 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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. + */ +package org.apache.zookeeper.graph; + +import java.io.IOException; +import java.io.BufferedOutputStream; +import java.io.FileOutputStream; +import java.io.DataOutputStream; +import java.io.PrintStream; + +import java.util.HashSet; + +public class MeasureThroughput { + private static final int MS_PER_SEC = 1000; + private static final int MS_PER_MIN = MS_PER_SEC*60; + private static final int MS_PER_HOUR = MS_PER_MIN*60; + + public static void main(String[] args) throws IOException { + MergedLogSource source = new MergedLogSource(args); + + PrintStream ps_ms = new PrintStream(new BufferedOutputStream(new FileOutputStream("throughput-ms.out"))); + PrintStream ps_sec = new PrintStream(new BufferedOutputStream(new FileOutputStream("throughput-sec.out"))); + PrintStream ps_min = new PrintStream(new BufferedOutputStream(new FileOutputStream("throughput-min.out"))); + PrintStream ps_hour = new PrintStream(new BufferedOutputStream(new FileOutputStream("throughput-hour.out"))); + LogIterator iter; + + System.out.println(source); + iter = source.iterator(); + long currentms = 0; + long currentsec = 0; + long currentmin = 0; + long currenthour = 0; + HashSet zxids_ms = new HashSet(); + long zxid_sec = 0; + long zxid_min = 0; + long zxid_hour = 0; + + while (iter.hasNext()) { + LogEntry e = iter.next(); + TransactionEntry cxn = (TransactionEntry)e; + + long ms = cxn.getTimestamp(); + long sec = ms/MS_PER_SEC; + long min = ms/MS_PER_MIN; + long hour = ms/MS_PER_HOUR; + + if (currentms != ms && currentms != 0) { + ps_ms.println("" + currentms + " " + zxids_ms.size()); + + zxid_sec += zxids_ms.size(); + zxid_min += zxids_ms.size(); + zxid_hour += zxids_ms.size(); + zxids_ms.clear(); + } + + if (currentsec != sec && currentsec != 0) { + ps_sec.println("" + currentsec*MS_PER_SEC + " " + zxid_sec); + + zxid_sec = 0; + } + + if (currentmin != min && currentmin != 0) { + ps_min.println("" + currentmin*MS_PER_MIN + " " + zxid_min); + + zxid_min = 0; + } + + if (currenthour != hour && currenthour != 0) { + ps_hour.println("" + currenthour*MS_PER_HOUR + " " + zxid_hour); + + zxid_hour = 0; + } + + currentms = ms; + currentsec = sec; + currentmin = min; + currenthour = hour; + + zxids_ms.add(cxn.getZxid()); + } + + iter.close(); + ps_ms.close(); + ps_sec.close(); + ps_min.close(); + ps_hour.close(); + } +}; diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/loggraph/src/java/org/apache/zookeeper/graph/MergedLogSource.java b/pkg/registry/zookeeper-3.4.6/src/contrib/loggraph/src/java/org/apache/zookeeper/graph/MergedLogSource.java new file mode 100644 index 000000000..bb789d395 --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/contrib/loggraph/src/java/org/apache/zookeeper/graph/MergedLogSource.java @@ -0,0 +1,219 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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. + */ +package org.apache.zookeeper.graph; + +import java.io.ByteArrayInputStream; +import java.io.EOFException; +import java.io.FileInputStream; +import java.io.IOException; +import java.text.DateFormat; +import java.util.Date; +import java.util.zip.Adler32; +import java.util.zip.Checksum; +import java.util.HashMap; + +import org.apache.jute.BinaryInputArchive; +import org.apache.jute.InputArchive; +import org.apache.jute.Record; +import org.apache.zookeeper.server.TraceFormatter; +import org.apache.zookeeper.server.persistence.FileHeader; +import org.apache.zookeeper.server.persistence.FileTxnLog; +import org.apache.zookeeper.server.util.SerializeUtils; +import org.apache.zookeeper.txn.TxnHeader; + +import org.apache.zookeeper.ZooDefs.OpCode; + +import org.apache.zookeeper.txn.CreateSessionTxn; +import org.apache.zookeeper.txn.CreateTxn; +import org.apache.zookeeper.txn.DeleteTxn; +import org.apache.zookeeper.txn.ErrorTxn; +import org.apache.zookeeper.txn.SetACLTxn; +import org.apache.zookeeper.txn.SetDataTxn; +import org.apache.zookeeper.txn.TxnHeader; + +import java.io.Closeable; +import java.io.FileNotFoundException; +import java.util.Vector; +import java.util.Iterator; +import java.util.Collections; +import java.util.NoSuchElementException; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class MergedLogSource implements LogSource { + private static final Logger LOG = LoggerFactory.getLogger(MergedLogSource.class); + private Vector sources = null; + private long starttime = 0; + private long endtime = 0; + private long size = 0; + + public boolean overlapsRange(long starttime, long endtime) { + return (starttime <= this.endtime && endtime >= this.starttime); + } + + public long size() { return size; } + public long getStartTime() { return starttime; } + public long getEndTime() { return endtime; } + + private class MergedLogSourceIterator implements LogIterator { + private LogEntry next = null; + private long start = 0; + private long end = 0; + private MergedLogSource src = null; + private LogIterator[] sources = null; + private LogEntry[] nexts = null; + private FilterOp filter = null; + + public MergedLogSourceIterator(MergedLogSource src, long starttime, long endtime, FilterOp filter) throws IllegalArgumentException, FilterException { + Vector iters = new Vector(); + for (LogSource s : src.sources) { + if (s.overlapsRange(starttime, endtime)) { + iters.add(s.iterator(starttime, endtime, filter)); + } + } + + sources = new LogIterator[iters.size()]; + sources = iters.toArray(sources); + nexts = new LogEntry[iters.size()]; + for (int i = 0; i < sources.length; i++) { + if (sources[i].hasNext()) + nexts[i] = sources[i].next(); + } + this.filter = filter; + } + + public MergedLogSourceIterator(MergedLogSource src, long starttime, long endtime) throws IllegalArgumentException, FilterException { + this(src, starttime, endtime, null); + } + + public long size() throws IOException { + long size = 0; + for (LogIterator i : sources) { + size += i.size(); + } + return size; + } + + public boolean hasNext() { + for (LogEntry n : nexts) { + if (n != null) return true; + } + return false; + } + + public LogEntry next() { + int min = -1; + for (int i = 0; i < nexts.length; i++) { + if (nexts[i] != null) { + if (min == -1) { + min = i; + } else if (nexts[i].getTimestamp() < nexts[min].getTimestamp()) { + min = i; + } + } + } + if (min == -1) { + return null; + } else { + LogEntry e = nexts[min]; + nexts[min] = sources[min].next(); + return e; + } + } + + public void remove() throws UnsupportedOperationException { + throw new UnsupportedOperationException("remove not supported for Merged logs"); + } + + public void close() throws IOException { + for (LogIterator i : sources) { + i.close(); + } + } + } + + public LogIterator iterator(long starttime, long endtime) throws IllegalArgumentException { + try { + return iterator(starttime, endtime, null); + } catch (FilterException fe) { + assert(false); // shouldn't happen without filter + return null; + } + } + + public LogIterator iterator(long starttime, long endtime, FilterOp filter) throws IllegalArgumentException, FilterException { + // sanitise start and end times + if (endtime < starttime) { + throw new IllegalArgumentException("End time (" + endtime + ") must be greater or equal to starttime (" + starttime + ")"); + } + + return new MergedLogSourceIterator(this, starttime, endtime, filter); + } + + public LogIterator iterator() throws IllegalArgumentException { + return iterator(starttime, endtime+1); + } + + public MergedLogSource(String[] files) throws IOException { + sources = new Vector(); + for (String f : files) { + addSource(f); + } + } + + public void addSource(String f) throws IOException { + LogSource s = null; + if (TxnLogSource.isTransactionFile(f)) { + s = new TxnLogSource(f); + } else { + s = new Log4JSource(f); + } + + size += s.size(); + endtime = s.getEndTime() > endtime ? s.getEndTime() : endtime; + starttime = s.getStartTime() < starttime || starttime == 0 ? s.getStartTime() : starttime; + sources.add(s); + } + + public String toString() { + String s = "MergedLogSource(size=" + size + ", start=" + starttime + ", end=" + endtime +")"; + for (LogSource src : sources) { + s += "\n\t- " +src; + } + return s; + } + + public static void main(String[] args) throws IOException { + System.out.println("Time: " + System.currentTimeMillis()); + MergedLogSource s = new MergedLogSource(args); + System.out.println(s); + + LogIterator iter; + + iter = s.iterator(); + System.out.println("Time: " + System.currentTimeMillis()); + System.out.println("Iterator Size: " + iter.size()); + System.out.println("Time: " + System.currentTimeMillis()); + /* while (iter.hasNext()) { + System.out.println(iter.next()); + }*/ + iter.close(); + System.out.println("Time: " + System.currentTimeMillis()); + } +} diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/loggraph/src/java/org/apache/zookeeper/graph/RandomAccessFileReader.java b/pkg/registry/zookeeper-3.4.6/src/contrib/loggraph/src/java/org/apache/zookeeper/graph/RandomAccessFileReader.java new file mode 100644 index 000000000..827a8a7a0 --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/contrib/loggraph/src/java/org/apache/zookeeper/graph/RandomAccessFileReader.java @@ -0,0 +1,328 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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. + */ +package org.apache.zookeeper.graph; + +import java.io.File; +import java.io.Reader; +import java.io.IOException; +import java.io.EOFException; +import java.io.RandomAccessFile; +import java.io.FileNotFoundException; + +import java.io.DataInputStream; +import java.io.ByteArrayInputStream; +import java.io.DataInput; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class RandomAccessFileReader extends Reader implements DataInput { + private static final Logger LOG = LoggerFactory.getLogger(RandomAccessFileReader.class); + private RandomAccessFile file; + private byte[] buffer; + private int buffersize; + private int bufferoffset; + private long fileoffset; + private long fp; + + private static final int DEFAULT_BUFFER_SIZE = 512*1024; // 512k + private int point = 0; + + public RandomAccessFileReader(File f) throws FileNotFoundException { + file = new RandomAccessFile(f, "r"); + if (LOG.isDebugEnabled()) { + try { + LOG.debug("Opened file(" + f + ") with FD (" + file.getFD() + ")"); + } catch (IOException ioe) { + LOG.debug("Opened file(" + f + ") coulds get FD"); + } + } + + buffer = new byte[DEFAULT_BUFFER_SIZE]; + buffersize = 0; + bufferoffset = 0; + fileoffset = 0; + fp = 0; + } + + /** + fill the buffer from the file. + fp keeps track of the file pointer. + fileoffset is the offset into the file to where the buffer came from. + */ + private int fill() throws IOException { + fileoffset = fp; + int read = file.read(buffer, 0, buffer.length); + + if (LOG.isDebugEnabled()) { + String buf = new String(buffer, 0, 40, "UTF-8"); + LOG.debug("fill(buffer=" + buf + ")"); + } + + if (read == -1) { // eof reached + buffersize = 0; + } else { + buffersize = read; + } + fp += buffersize; + bufferoffset = 0; + + return buffersize; + } + + /** + * Reader interface + */ + public boolean markSupported() { return false; } + + /** + copy what we can from buffer. if it's not enough, fill buffer again and copy again + */ + synchronized public int read(char[] cbuf, int off, int len) throws IOException { + // This could be faster, but probably wont be used + byte[] b = new byte[2]; + int bytesread = 0; + while (len > 0) { + int read = read(b, 0, 2); + bytesread += read; + if (read < 2) { + return bytesread; + } + cbuf[off] = (char)((b[0] << 8) | (b[1] & 0xff)); + off += read; + len -= read; + } + + return bytesread; + } + + synchronized public int read(byte[] buf, int off, int len) throws IOException { + if (LOG.isTraceEnabled()) { + LOG.trace("read(buf, off=" + off + ", len=" + len); + } + + int read = 0; + while (len > 0) { + if (buffersize == 0) { + fill(); + if (buffersize == 0) { + break; + } + } + + int tocopy = Math.min(len, buffersize); + if (LOG.isTraceEnabled()) { + LOG.trace("tocopy=" + tocopy); + } + + System.arraycopy(buffer, bufferoffset, buf, off, tocopy); + buffersize -= tocopy; + bufferoffset += tocopy; + + len -= tocopy; + read += tocopy; + off += tocopy; + } + if (LOG.isTraceEnabled()) { + LOG.trace("read=" + read); + } + + return read; + } + + public void close() throws IOException { + file.close(); + } + + /** + * Seek interface + */ + public long getPosition() { + return bufferoffset + fileoffset; + } + + synchronized public void seek(long pos) throws IOException { + if (LOG.isDebugEnabled()) { + LOG.debug("seek(" + pos + ")"); + } + file.seek(pos); + fp = pos; + buffersize = 0; // force a buffer fill on next read + } + + /** + works like the usual readLine but disregards \r to make things easier + */ + synchronized public String readLine() throws IOException { + StringBuffer s = null; + + // go through buffer until i find a \n, if i reach end of buffer first, put whats in buffer into string buffer, + // repeat + buffering: + for (;;) { + if (buffersize == 0) { + fill(); + if (buffersize == 0) { + break; + } + } + + for (int i = 0; i < buffersize; i++) { + if (buffer[bufferoffset + i] == '\n') { + if (i > 0) { // if \n is first char in buffer, leave the string buffer empty + if (s == null) { s = new StringBuffer(); } + s.append(new String(buffer, bufferoffset, i, "UTF-8")); + } + bufferoffset += i+1; + buffersize -= i+1; + break buffering; + } + } + + // We didn't find \n, read the whole buffer into string buffer + if (s == null) { s = new StringBuffer(); } + s.append(new String(buffer, bufferoffset, buffersize, "UTF-8")); + buffersize = 0; + } + + if (s == null) { + return null; + } else { + return s.toString(); + } + } + + /** + DataInput interface + */ + public void readFully(byte[] b) throws IOException { + readFully(b, 0, b.length); + } + + public void readFully(byte[] b, int off, int len) throws IOException + { + while (len > 0) { + int read = read(b, off, len); + len -= read; + off += read; + + if (read == 0) { + throw new EOFException("End of file reached"); + } + } + } + + public int skipBytes(int n) throws IOException { + seek(getPosition() + n); + return n; + } + + public boolean readBoolean() throws IOException { + return (readByte() != 0); + } + + public byte readByte() throws IOException { + byte[] b = new byte[1]; + readFully(b, 0, 1); + return b[0]; + } + + public int readUnsignedByte() throws IOException { + return (int)readByte(); + } + + public short readShort() throws IOException { + byte[] b = new byte[2]; + readFully(b, 0, 2); + return (short)((b[0] << 8) | (b[1] & 0xff)); + } + + public int readUnsignedShort() throws IOException { + byte[] b = new byte[2]; + readFully(b, 0, 2); + return (((b[0] & 0xff) << 8) | (b[1] & 0xff)); + } + + public char readChar() throws IOException { + return (char)readShort(); + } + + public int readInt() throws IOException { + byte[] b = new byte[4]; + readFully(b, 0, 4); + return (((b[0] & 0xff) << 24) | ((b[1] & 0xff) << 16) | ((b[2] & 0xff) << 8) | (b[3] & 0xff)); + } + + public long readLong() throws IOException { + byte[] b = new byte[8]; + readFully(b, 0, 8); + + return (((long)(b[0] & 0xff) << 56) | ((long)(b[1] & 0xff) << 48) | + ((long)(b[2] & 0xff) << 40) | ((long)(b[3] & 0xff) << 32) | + ((long)(b[4] & 0xff) << 24) | ((long)(b[5] & 0xff) << 16) | + ((long)(b[6] & 0xff) << 8) | ((long)(b[7] & 0xff))); + } + + public float readFloat() throws IOException { + return Float.intBitsToFloat(readInt()); + } + + public double readDouble() throws IOException { + return Double.longBitsToDouble(readLong()); + } + + public String readUTF() throws IOException { + int len = readUnsignedShort(); + byte[] bytes = new byte[len+2]; + bytes[0] = (byte)((len >> 8) & 0xFF); + bytes[1] = (byte)(len & 0xFF); + readFully(bytes, 2, len); + DataInputStream dis = new DataInputStream(new ByteArrayInputStream(bytes)); + return dis.readUTF(); + } + + public static void main(String[] args) throws IOException { + RandomAccessFileReader f = new RandomAccessFileReader(new File(args[0])); + + long pos0 = f.getPosition(); + for (int i = 0; i < 5; i++) { + System.out.println(f.readLine()); + } + System.out.println("============="); + long pos1 = f.getPosition(); + System.out.println("pos: " + pos1); + for (int i = 0; i < 5; i++) { + System.out.println(f.readLine()); + } + System.out.println("============="); + f.seek(pos1); + for (int i = 0; i < 5; i++) { + System.out.println(f.readLine()); + } + System.out.println("============="); + f.seek(pos0); + for (int i = 0; i < 5; i++) { + System.out.println(f.readLine()); + } + long pos2 = f.getPosition(); + System.out.println("============="); + System.out.println(f.readLine()); + f.seek(pos2); + System.out.println(f.readLine()); + } +}; diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/loggraph/src/java/org/apache/zookeeper/graph/TransactionEntry.java b/pkg/registry/zookeeper-3.4.6/src/contrib/loggraph/src/java/org/apache/zookeeper/graph/TransactionEntry.java new file mode 100644 index 000000000..33c7189c1 --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/contrib/loggraph/src/java/org/apache/zookeeper/graph/TransactionEntry.java @@ -0,0 +1,59 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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. + */ +package org.apache.zookeeper.graph; + +public class TransactionEntry extends LogEntry { + public TransactionEntry(long timestamp, long clientId, long Cxid, long Zxid, String op) { + this(timestamp, clientId, Cxid, Zxid, op, ""); + } + + public TransactionEntry(long timestamp, long clientId, long Cxid, long Zxid, String op, String extra) { + super(timestamp); + setAttribute("client-id", new Long(clientId)); + setAttribute("cxid", new Long(Cxid)); + setAttribute("zxid", new Long(Zxid)); + setAttribute("operation", op); + setAttribute("extra", extra); + } + + public long getClientId() { + return (Long)getAttribute("client-id"); + } + + public long getCxid() { + return (Long)getAttribute("cxid"); + } + + public long getZxid() { + return (Long)getAttribute("zxid"); + } + + public String getOp() { + return (String)getAttribute("operation"); + } + + public String getExtra() { + return (String)getAttribute("extra"); + } + + public String toString() { + return getTimestamp() + ":::session(0x" + Long.toHexString(getClientId()) + ") cxid(0x" + Long.toHexString(getCxid()) + ") zxid(0x" + Long.toHexString(getZxid()) + ") op(" + getOp() + ") extra(" + getExtra() +")"; + } + + public Type getType() { return LogEntry.Type.TXN; } +} diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/loggraph/src/java/org/apache/zookeeper/graph/TxnLogSource.java b/pkg/registry/zookeeper-3.4.6/src/contrib/loggraph/src/java/org/apache/zookeeper/graph/TxnLogSource.java new file mode 100644 index 000000000..809c45513 --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/contrib/loggraph/src/java/org/apache/zookeeper/graph/TxnLogSource.java @@ -0,0 +1,376 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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. + */ +package org.apache.zookeeper.graph; + +import java.io.ByteArrayInputStream; +import java.io.EOFException; +import java.io.FileInputStream; +import java.io.IOException; +import java.text.DateFormat; +import java.util.Date; +import java.util.zip.Adler32; +import java.util.zip.Checksum; +import java.util.HashMap; + +import org.apache.jute.BinaryInputArchive; +import org.apache.jute.InputArchive; +import org.apache.jute.Record; +import org.apache.zookeeper.server.TraceFormatter; +import org.apache.zookeeper.server.persistence.FileHeader; +import org.apache.zookeeper.server.persistence.FileTxnLog; +import org.apache.zookeeper.server.util.SerializeUtils; +import org.apache.zookeeper.txn.TxnHeader; + +import org.apache.zookeeper.ZooDefs.OpCode; + +import org.apache.zookeeper.txn.CreateSessionTxn; +import org.apache.zookeeper.txn.CreateTxn; +import org.apache.zookeeper.txn.DeleteTxn; +import org.apache.zookeeper.txn.ErrorTxn; +import org.apache.zookeeper.txn.SetACLTxn; +import org.apache.zookeeper.txn.SetDataTxn; +import org.apache.zookeeper.txn.TxnHeader; + +import java.io.File; +import java.io.Closeable; +import java.io.FileNotFoundException; +import java.util.Iterator; +import java.util.NoSuchElementException; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class TxnLogSource implements LogSource { + private static final Logger LOG = LoggerFactory.getLogger(TxnLogSource.class); + + private LogSkipList skiplist = null; + private static final int skipN = 10000; + + private String file = null; + private long starttime = 0; + private long endtime = 0; + private long size = 0; + + public boolean overlapsRange(long starttime, long endtime) { + return (starttime <= this.endtime && endtime >= this.starttime); + } + + public long size() { return size; } + public long getStartTime() { return starttime; } + public long getEndTime() { return endtime; } + public LogSkipList getSkipList() { return skiplist; } + + public static boolean isTransactionFile(String file) throws IOException { + RandomAccessFileReader reader = new RandomAccessFileReader(new File(file)); + BinaryInputArchive logStream = new BinaryInputArchive(reader); + FileHeader fhdr = new FileHeader(); + fhdr.deserialize(logStream, "fileheader"); + reader.close(); + + return fhdr.getMagic() == FileTxnLog.TXNLOG_MAGIC; + } + + private class TxnLogSourceIterator implements LogIterator { + private LogEntry next = null; + private long starttime = 0; + private long endtime = 0; + private TxnLogSource src = null; + private RandomAccessFileReader reader = null; + private BinaryInputArchive logStream = null; + private long skippedAtStart = 0; + private FilterOp filter = null; + + public TxnLogSourceIterator(TxnLogSource src, long starttime, long endtime) throws IllegalArgumentException, FilterException { + this(src,starttime,endtime,null); + } + + public TxnLogSourceIterator(TxnLogSource src, long starttime, long endtime, FilterOp filter) throws IllegalArgumentException, FilterException { + try { + this.src = src; + this.starttime = starttime; + this.endtime = endtime; + reader = new RandomAccessFileReader(new File(src.file)); + logStream = new BinaryInputArchive(reader); + FileHeader fhdr = new FileHeader(); + fhdr.deserialize(logStream, "fileheader"); + } catch (Exception e) { + throw new IllegalArgumentException("Cannot open transaction log ("+src.file+") :" + e); + } + + LogSkipList.Mark start = src.getSkipList().findMarkBefore(starttime); + try { + reader.seek(start.getBytes()); + skippedAtStart = start.getEntriesSkipped(); + } catch (IOException ioe) { + // if we can't skip, we should just read from the start + } + + this.filter = filter; + + LogEntry e; + while ((e = readNextEntry()) != null && e.getTimestamp() < endtime) { + if (e.getTimestamp() >= starttime && (filter == null || filter.matches(e)) ) { + next = e; + return; + } + skippedAtStart++; + } + + + } + + public long size() throws IOException { + if (this.endtime >= src.getEndTime()) { + return src.size() - skippedAtStart; + } + + long pos = reader.getPosition(); + LogEntry e; + + LogSkipList.Mark lastseg = src.getSkipList().findMarkBefore(this.endtime); + reader.seek(lastseg.getBytes()); + // number of entries skipped to get to the end of the iterator, less the number skipped to get to the start + long count = lastseg.getEntriesSkipped() - skippedAtStart; + + while ((e = readNextEntry()) != null) { + if (e.getTimestamp() > this.endtime) { + break; + } + count++; + } + reader.seek(pos);; + + return count; + } + + private LogEntry readNextEntry() { + LogEntry e = null; + try { + long crcValue; + byte[] bytes; + try { + crcValue = logStream.readLong("crcvalue"); + + bytes = logStream.readBuffer("txnEntry"); + } catch (EOFException ex) { + return null; + } + + if (bytes.length == 0) { + return null; + } + Checksum crc = new Adler32(); + crc.update(bytes, 0, bytes.length); + if (crcValue != crc.getValue()) { + throw new IOException("CRC doesn't match " + crcValue + + " vs " + crc.getValue()); + } + TxnHeader hdr = new TxnHeader(); + Record r = SerializeUtils.deserializeTxn(bytes, hdr); + + switch (hdr.getType()) { + case OpCode.createSession: { + e = new TransactionEntry(hdr.getTime(), hdr.getClientId(), hdr.getCxid(), hdr.getZxid(), "createSession"); + } + break; + case OpCode.closeSession: { + e = new TransactionEntry(hdr.getTime(), hdr.getClientId(), hdr.getCxid(), hdr.getZxid(), "closeSession"); + } + break; + case OpCode.create: + if (r != null) { + CreateTxn create = (CreateTxn)r; + String path = create.getPath(); + e = new TransactionEntry(hdr.getTime(), hdr.getClientId(), hdr.getCxid(), hdr.getZxid(), "create", path); + } + break; + case OpCode.setData: + if (r != null) { + SetDataTxn set = (SetDataTxn)r; + String path = set.getPath(); + e = new TransactionEntry(hdr.getTime(), hdr.getClientId(), hdr.getCxid(), hdr.getZxid(), "setData", path); + } + break; + case OpCode.setACL: + if (r != null) { + SetACLTxn setacl = (SetACLTxn)r; + String path = setacl.getPath(); + e = new TransactionEntry(hdr.getTime(), hdr.getClientId(), hdr.getCxid(), hdr.getZxid(), "setACL", path); + } + break; + case OpCode.error: + if (r != null) { + ErrorTxn error = (ErrorTxn)r; + + e = new TransactionEntry(hdr.getTime(), hdr.getClientId(), hdr.getCxid(), hdr.getZxid(), "error", "Error: " + error.getErr()); + } + break; + default: + LOG.info("Unknown op: " + hdr.getType()); + break; + } + + if (logStream.readByte("EOR") != 'B') { + throw new EOFException("Last transaction was partial."); + } + } catch (Exception ex) { + LOG.error("Error reading transaction from (" + src.file + ") :" + e); + return null; + } + return e; + } + + public boolean hasNext() { + return next != null; + } + + public LogEntry next() throws NoSuchElementException { + LogEntry ret = next; + LogEntry e = readNextEntry(); + + if (filter != null) { + try { + while (e != null && !filter.matches(e)) { + e = readNextEntry(); + } + } catch (FilterException fe) { + throw new NoSuchElementException(fe.toString()); + } + } + if (e != null && e.getTimestamp() < endtime) { + next = e; + } else { + next = null; + } + return ret; + } + + public void remove() throws UnsupportedOperationException { + throw new UnsupportedOperationException("remove not supported for Txn logs"); + } + + public void close() throws IOException { + reader.close(); + } + } + + public LogIterator iterator(long starttime, long endtime) throws IllegalArgumentException { + try { + return iterator(starttime, endtime, null); + } catch (FilterException fe) { + assert(false); // should never ever happen + return null; + } + } + + public LogIterator iterator(long starttime, long endtime, FilterOp filter) throws IllegalArgumentException, FilterException { + // sanitise start and end times + if (endtime < starttime) { + throw new IllegalArgumentException("End time (" + endtime + ") must be greater or equal to starttime (" + starttime + ")"); + } + + return new TxnLogSourceIterator(this, starttime, endtime, filter); + } + + public LogIterator iterator() throws IllegalArgumentException { + return iterator(starttime, endtime+1); + } + + public TxnLogSource(String file) throws IOException { + this.file = file; + + skiplist = new LogSkipList(); + + RandomAccessFileReader reader = new RandomAccessFileReader(new File(file)); + try { + BinaryInputArchive logStream = new BinaryInputArchive(reader); + FileHeader fhdr = new FileHeader(); + fhdr.deserialize(logStream, "fileheader"); + + byte[] bytes = null; + while (true) { + long lastFp = reader.getPosition(); + + long crcValue; + + try { + crcValue = logStream.readLong("crcvalue"); + bytes = logStream.readBuffer("txnEntry"); + } catch (EOFException e) { + break; + } + + if (bytes.length == 0) { + break; + } + Checksum crc = new Adler32(); + crc.update(bytes, 0, bytes.length); + if (crcValue != crc.getValue()) { + throw new IOException("CRC doesn't match " + crcValue + + " vs " + crc.getValue()); + } + if (logStream.readByte("EOR") != 'B') { + throw new EOFException("Last transaction was partial."); + } + TxnHeader hdr = new TxnHeader(); + Record r = SerializeUtils.deserializeTxn(bytes, hdr); + + if (starttime == 0) { + starttime = hdr.getTime(); + } + endtime = hdr.getTime(); + + if (size % skipN == 0) { + skiplist.addMark(hdr.getTime(), lastFp, size); + } + size++; + } + if (bytes == null) { + throw new IOException("Nothing read from ("+file+")"); + } + } finally { + reader.close(); + } + } + + public String toString() { + return "TxnLogSource(file=" + file + ", size=" + size + ", start=" + starttime + ", end=" + endtime +")"; + } + + public static void main(String[] args) throws IOException, FilterException { + TxnLogSource s = new TxnLogSource(args[0]); + System.out.println(s); + + LogIterator iter; + + if (args.length == 3) { + long starttime = Long.valueOf(args[1]); + long endtime = Long.valueOf(args[2]); + FilterOp fo = new FilterParser("(or (and (> zxid 0x2f0bd6f5e0) (< zxid 0x2f0bd6f5e9)) (= operation \"error\"))").parse(); + System.out.println("fo: " + fo); + iter = s.iterator(starttime, endtime, fo); + } else { + iter = s.iterator(); + } + System.out.println(iter); + while (iter.hasNext()) { + System.out.println(iter.next()); + } + iter.close(); + } +} diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/loggraph/src/java/org/apache/zookeeper/graph/filterops/AndOp.java b/pkg/registry/zookeeper-3.4.6/src/contrib/loggraph/src/java/org/apache/zookeeper/graph/filterops/AndOp.java new file mode 100644 index 000000000..581bdaacc --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/contrib/loggraph/src/java/org/apache/zookeeper/graph/filterops/AndOp.java @@ -0,0 +1,33 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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. + */ +package org.apache.zookeeper.graph.filterops; + +import org.apache.zookeeper.graph.LogEntry; +import org.apache.zookeeper.graph.FilterOp; +import org.apache.zookeeper.graph.FilterException; + +public class AndOp extends FilterOp { + public boolean matches(LogEntry entry) throws FilterException { + for (FilterOp f : subOps) { + if (!f.matches(entry)) { + return false; + } + } + return true; + } +} diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/loggraph/src/java/org/apache/zookeeper/graph/filterops/Arg.java b/pkg/registry/zookeeper-3.4.6/src/contrib/loggraph/src/java/org/apache/zookeeper/graph/filterops/Arg.java new file mode 100644 index 000000000..4fda3cf7d --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/contrib/loggraph/src/java/org/apache/zookeeper/graph/filterops/Arg.java @@ -0,0 +1,36 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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. + */ +package org.apache.zookeeper.graph.filterops; + +import org.apache.zookeeper.graph.FilterOp.*; + +public class Arg { + private ArgType type; + protected T value; + + protected Arg(ArgType type) { + this.type = type; + } + + public ArgType getType() { return type; } + public T getValue() { return value; } + + public String toString() { + return "[" + type + ":" + value + "]"; + } +} diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/loggraph/src/java/org/apache/zookeeper/graph/filterops/EqualsOp.java b/pkg/registry/zookeeper-3.4.6/src/contrib/loggraph/src/java/org/apache/zookeeper/graph/filterops/EqualsOp.java new file mode 100644 index 000000000..409815af2 --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/contrib/loggraph/src/java/org/apache/zookeeper/graph/filterops/EqualsOp.java @@ -0,0 +1,44 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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. + */ +package org.apache.zookeeper.graph.filterops; + +import org.apache.zookeeper.graph.LogEntry; +import org.apache.zookeeper.graph.FilterOp; +import org.apache.zookeeper.graph.FilterException; + +public class EqualsOp extends FilterOp { + public boolean matches(LogEntry entry) throws FilterException { + + Object last = null; + for (Arg a : args) { + Object v = a.getValue(); + if (a.getType() == FilterOp.ArgType.SYMBOL) { + String key = (String)a.getValue(); + v = entry.getAttribute(key); + } + + if (last != null + && !last.equals(v)) { + return false; + } + last = v; + } + + return true; + } +} diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/loggraph/src/java/org/apache/zookeeper/graph/filterops/GreaterThanOp.java b/pkg/registry/zookeeper-3.4.6/src/contrib/loggraph/src/java/org/apache/zookeeper/graph/filterops/GreaterThanOp.java new file mode 100644 index 000000000..244dd3dab --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/contrib/loggraph/src/java/org/apache/zookeeper/graph/filterops/GreaterThanOp.java @@ -0,0 +1,70 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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. + */ +package org.apache.zookeeper.graph.filterops; + +import org.apache.zookeeper.graph.LogEntry; +import org.apache.zookeeper.graph.FilterOp; +import org.apache.zookeeper.graph.FilterException; + +public class GreaterThanOp extends FilterOp { + public boolean matches(LogEntry entry) throws FilterException { + Arg first = args.get(0); + + if (first != null) { + FilterOp.ArgType type = first.getType(); + if (type == FilterOp.ArgType.SYMBOL) { + String key = (String)first.getValue(); + Object v = entry.getAttribute(key); + if (v instanceof String) { + type = FilterOp.ArgType.STRING; + } else if (v instanceof Double || v instanceof Long || v instanceof Integer || v instanceof Short) { + type = FilterOp.ArgType.NUMBER; + } else { + throw new FilterException("LessThanOp: Invalid argument, first argument resolves to neither a String nor a Number"); + } + } + + Object last = null; + for (Arg a : args) { + Object v = a.getValue(); + if (a.getType() == FilterOp.ArgType.SYMBOL) { + String key = (String)a.getValue(); + v = entry.getAttribute(key); + } + + if (last != null) { + if (type == FilterOp.ArgType.STRING) { + if (((String)last).compareTo((String)v) <= 0) { + return false; + } + } else if (type == FilterOp.ArgType.NUMBER) { + // System.out.println("last[" + ((Number)last).longValue() + "] v["+ ((Number)v).longValue() + "]"); + if (((Number)last).longValue() <= ((Number)v).longValue()) { + return false; + } + } + } + last = v; + } + return true; + } else { + return true; + } + } + +} diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/loggraph/src/java/org/apache/zookeeper/graph/filterops/LessThanOp.java b/pkg/registry/zookeeper-3.4.6/src/contrib/loggraph/src/java/org/apache/zookeeper/graph/filterops/LessThanOp.java new file mode 100644 index 000000000..b7d9e09ac --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/contrib/loggraph/src/java/org/apache/zookeeper/graph/filterops/LessThanOp.java @@ -0,0 +1,69 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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. + */ +package org.apache.zookeeper.graph.filterops; + +import org.apache.zookeeper.graph.LogEntry; +import org.apache.zookeeper.graph.FilterOp; +import org.apache.zookeeper.graph.FilterException; + +public class LessThanOp extends FilterOp { + public boolean matches(LogEntry entry) throws FilterException { + Arg first = args.get(0); + + if (first != null) { + FilterOp.ArgType type = first.getType(); + if (type == FilterOp.ArgType.SYMBOL) { + String key = (String)first.getValue(); + Object v = entry.getAttribute(key); + if (v instanceof String) { + type = FilterOp.ArgType.STRING; + } else if (v instanceof Double || v instanceof Long || v instanceof Integer || v instanceof Short) { + type = FilterOp.ArgType.NUMBER; + } else { + throw new FilterException("LessThanOp: Invalid argument, first argument resolves to neither a String nor a Number"); + } + } + + Object last = null; + for (Arg a : args) { + Object v = a.getValue(); + if (a.getType() == FilterOp.ArgType.SYMBOL) { + String key = (String)a.getValue(); + v = entry.getAttribute(key); + } + + if (last != null) { + if (type == FilterOp.ArgType.STRING) { + if (((String)last).compareTo((String)v) >= 0) { + return false; + } + } else if (type == FilterOp.ArgType.NUMBER) { + if (((Number)last).doubleValue() >= ((Number)v).doubleValue()) { + return false; + } + } + } + last = v; + } + return true; + } else { + return true; + } + } + +} diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/loggraph/src/java/org/apache/zookeeper/graph/filterops/NotOp.java b/pkg/registry/zookeeper-3.4.6/src/contrib/loggraph/src/java/org/apache/zookeeper/graph/filterops/NotOp.java new file mode 100644 index 000000000..d8ed7573f --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/contrib/loggraph/src/java/org/apache/zookeeper/graph/filterops/NotOp.java @@ -0,0 +1,31 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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. + */ +package org.apache.zookeeper.graph.filterops; + +import org.apache.zookeeper.graph.LogEntry; +import org.apache.zookeeper.graph.FilterOp; +import org.apache.zookeeper.graph.FilterException; + +public class NotOp extends FilterOp { + public boolean matches(LogEntry entry) throws FilterException { + if (subOps.size() != 1) { + throw new FilterException("Not operation can only take one argument"); + } + return !subOps.get(0).matches(entry); + } +} diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/loggraph/src/java/org/apache/zookeeper/graph/filterops/NumberArg.java b/pkg/registry/zookeeper-3.4.6/src/contrib/loggraph/src/java/org/apache/zookeeper/graph/filterops/NumberArg.java new file mode 100644 index 000000000..d6b584d85 --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/contrib/loggraph/src/java/org/apache/zookeeper/graph/filterops/NumberArg.java @@ -0,0 +1,28 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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. + */ +package org.apache.zookeeper.graph.filterops; + +import org.apache.zookeeper.graph.FilterOp.*; + +public class NumberArg extends Arg { + public NumberArg(Long value) { + super(ArgType.NUMBER); + this.value = value; + } +}; + diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/loggraph/src/java/org/apache/zookeeper/graph/filterops/OrOp.java b/pkg/registry/zookeeper-3.4.6/src/contrib/loggraph/src/java/org/apache/zookeeper/graph/filterops/OrOp.java new file mode 100644 index 000000000..d6815894a --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/contrib/loggraph/src/java/org/apache/zookeeper/graph/filterops/OrOp.java @@ -0,0 +1,33 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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. + */ +package org.apache.zookeeper.graph.filterops; + +import org.apache.zookeeper.graph.LogEntry; +import org.apache.zookeeper.graph.FilterOp; +import org.apache.zookeeper.graph.FilterException; + +public class OrOp extends FilterOp { + public boolean matches(LogEntry entry) throws FilterException { + for (FilterOp f : subOps) { + if (f.matches(entry)) { + return true; + } + } + return false; + } +} diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/loggraph/src/java/org/apache/zookeeper/graph/filterops/StringArg.java b/pkg/registry/zookeeper-3.4.6/src/contrib/loggraph/src/java/org/apache/zookeeper/graph/filterops/StringArg.java new file mode 100644 index 000000000..7345d3cc0 --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/contrib/loggraph/src/java/org/apache/zookeeper/graph/filterops/StringArg.java @@ -0,0 +1,28 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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. + */ +package org.apache.zookeeper.graph.filterops; + +import org.apache.zookeeper.graph.FilterOp.*; + +public class StringArg extends Arg { + public StringArg(String value) { + super(ArgType.STRING); + this.value = value; + } +}; + diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/loggraph/src/java/org/apache/zookeeper/graph/filterops/SymbolArg.java b/pkg/registry/zookeeper-3.4.6/src/contrib/loggraph/src/java/org/apache/zookeeper/graph/filterops/SymbolArg.java new file mode 100644 index 000000000..077553b1f --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/contrib/loggraph/src/java/org/apache/zookeeper/graph/filterops/SymbolArg.java @@ -0,0 +1,27 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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. + */ +package org.apache.zookeeper.graph.filterops; + +import org.apache.zookeeper.graph.FilterOp.*; + +public class SymbolArg extends Arg { + public SymbolArg(String value) { + super(ArgType.SYMBOL); + this.value = value; + } +}; diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/loggraph/src/java/org/apache/zookeeper/graph/filterops/XorOp.java b/pkg/registry/zookeeper-3.4.6/src/contrib/loggraph/src/java/org/apache/zookeeper/graph/filterops/XorOp.java new file mode 100644 index 000000000..9e778b199 --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/contrib/loggraph/src/java/org/apache/zookeeper/graph/filterops/XorOp.java @@ -0,0 +1,40 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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. + */ +package org.apache.zookeeper.graph.filterops; + +import org.apache.zookeeper.graph.LogEntry; +import org.apache.zookeeper.graph.FilterOp; +import org.apache.zookeeper.graph.FilterException; + +public class XorOp extends FilterOp { + public boolean matches(LogEntry entry) throws FilterException { + int count = 0; + for (FilterOp f : subOps) { + if (f.matches(entry)) { + count++; + if (count > 1) { + return false; + } + } + } + if (count == 1) { + return true; + } + return false; + } +} diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/loggraph/src/java/org/apache/zookeeper/graph/servlets/FileLoader.java b/pkg/registry/zookeeper-3.4.6/src/contrib/loggraph/src/java/org/apache/zookeeper/graph/servlets/FileLoader.java new file mode 100644 index 000000000..67e89454a --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/contrib/loggraph/src/java/org/apache/zookeeper/graph/servlets/FileLoader.java @@ -0,0 +1,60 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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. + */ +package org.apache.zookeeper.graph.servlets; + +import java.io.File; +import java.io.IOException; +import java.io.FileNotFoundException; + +import javax.servlet.ServletException; +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import org.json.simple.JSONArray; +import org.json.simple.JSONObject; +import org.json.simple.JSONValue; + +import org.apache.zookeeper.graph.*; + +public class FileLoader extends JsonServlet +{ + private MergedLogSource source = null; + + public FileLoader(MergedLogSource src) throws Exception { + source = src; + } + + String handleRequest(JsonRequest request) throws Exception + { + String output = ""; + + String file = request.getString("path", "/"); + JSONObject o = new JSONObject(); + try { + this.source.addSource(file); + o.put("status", "OK"); + + } catch (Exception e) { + o.put("status", "ERR"); + o.put("error", e.toString()); + } + + return JSONValue.toJSONString(o); + } +} diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/loggraph/src/java/org/apache/zookeeper/graph/servlets/Fs.java b/pkg/registry/zookeeper-3.4.6/src/contrib/loggraph/src/java/org/apache/zookeeper/graph/servlets/Fs.java new file mode 100644 index 000000000..e5b1a0133 --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/contrib/loggraph/src/java/org/apache/zookeeper/graph/servlets/Fs.java @@ -0,0 +1,69 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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. + */ +package org.apache.zookeeper.graph.servlets; + +import java.io.File; +import java.io.IOException; +import java.io.FileNotFoundException; + +import javax.servlet.ServletException; +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import org.json.simple.JSONArray; +import org.json.simple.JSONObject; +import org.json.simple.JSONValue; +import java.util.Arrays; +import java.util.Comparator; + +public class Fs extends JsonServlet +{ + String handleRequest(JsonRequest request) throws Exception + { + String output = ""; + JSONArray filelist = new JSONArray(); + + File base = new File(request.getString("path", "/")); + if (!base.exists() || !base.isDirectory()) { + throw new FileNotFoundException("Couldn't find [" + request + "]"); + } + File[] files = base.listFiles(); + Arrays.sort(files, new Comparator() { + public int compare(File o1, File o2) { + if (o1.isDirectory() != o2.isDirectory()) { + if (o1.isDirectory()) { + return -1; + } else { + return 1; + } + } + return o1.getName().compareToIgnoreCase(o2.getName()); + } + }); + + for (File f : files) { + JSONObject o = new JSONObject(); + o.put("file", f.getName()); + o.put("type", f.isDirectory() ? "D" : "F"); + o.put("path", f.getCanonicalPath()); + filelist.add(o); + } + return JSONValue.toJSONString(filelist); + } +} diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/loggraph/src/java/org/apache/zookeeper/graph/servlets/GraphData.java b/pkg/registry/zookeeper-3.4.6/src/contrib/loggraph/src/java/org/apache/zookeeper/graph/servlets/GraphData.java new file mode 100644 index 000000000..fc10eb1a3 --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/contrib/loggraph/src/java/org/apache/zookeeper/graph/servlets/GraphData.java @@ -0,0 +1,85 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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. + */ +package org.apache.zookeeper.graph.servlets; + +import java.io.File; +import java.io.IOException; +import java.io.FileNotFoundException; + +import javax.servlet.ServletException; +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import java.util.regex.Pattern; +import java.util.regex.Matcher; + +import org.json.simple.JSONArray; +import org.json.simple.JSONObject; +import org.json.simple.JSONValue; + +import org.apache.zookeeper.graph.*; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class GraphData extends JsonServlet +{ + private static final Logger LOG = LoggerFactory.getLogger(GraphData.class); + private static final int DEFAULT_PERIOD = 1000; + + private LogSource source = null; + + public GraphData(LogSource src) throws Exception { + this.source = src; + } + + String handleRequest(JsonRequest request) throws Exception { + + + long starttime = 0; + long endtime = 0; + long period = 0; + FilterOp fo = null; + + starttime = request.getNumber("start", 0); + endtime = request.getNumber("end", 0); + period = request.getNumber("period", 0); + String filterstr = request.getString("filter", ""); + + if (filterstr.length() > 0) { + fo = new FilterParser(filterstr).parse(); + } + + if (starttime == 0) { starttime = source.getStartTime(); } + if (endtime == 0) { + if (period > 0) { + endtime = starttime + period; + } else { + endtime = starttime + DEFAULT_PERIOD; + } + } + + if (LOG.isDebugEnabled()) { + LOG.debug("handle(start= " + starttime + ", end=" + endtime + ", period=" + period + ")"); + } + + LogIterator iterator = (fo != null) ? + source.iterator(starttime, endtime, fo) : source.iterator(starttime, endtime); + return new JsonGenerator(iterator).toString(); + } +} diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/loggraph/src/java/org/apache/zookeeper/graph/servlets/JsonServlet.java b/pkg/registry/zookeeper-3.4.6/src/contrib/loggraph/src/java/org/apache/zookeeper/graph/servlets/JsonServlet.java new file mode 100644 index 000000000..910d44f4e --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/contrib/loggraph/src/java/org/apache/zookeeper/graph/servlets/JsonServlet.java @@ -0,0 +1,85 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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. + */ +package org.apache.zookeeper.graph.servlets; + +import java.io.IOException; + +import javax.servlet.ServletException; +import javax.servlet.ServletRequest; +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import org.json.simple.JSONObject; +import org.json.simple.JSONValue; + +import java.util.Map; + +abstract public class JsonServlet extends HttpServlet { + abstract String handleRequest(JsonRequest request) throws Exception; + + protected class JsonRequest { + private Map map; + + public JsonRequest(ServletRequest request) { + map = request.getParameterMap(); + } + + public long getNumber(String name, long defaultnum) { + String[] vals = (String[])map.get(name); + if (vals == null || vals.length == 0) { + return defaultnum; + } + + try { + return Long.valueOf(vals[0]); + } catch (NumberFormatException e) { + return defaultnum; + } + } + + public String getString(String name, String defaultstr) { + String[] vals = (String[])map.get(name); + if (vals == null || vals.length == 0) { + return defaultstr; + } else { + return vals[0]; + } + } + } + + protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException + { + response.setContentType("text/plain;charset=utf-8"); + response.setStatus(HttpServletResponse.SC_OK); + + try { + String req = request.getRequestURI().substring(request.getServletPath().length()); + + response.getWriter().println(handleRequest(new JsonRequest(request))); + } catch (Exception e) { + JSONObject o = new JSONObject(); + o.put("error", e.toString()); + response.getWriter().println(JSONValue.toJSONString(o)); + } catch (java.lang.OutOfMemoryError oom) { + JSONObject o = new JSONObject(); + o.put("error", "Out of memory. Perhaps you've requested too many logs. Try narrowing you're filter criteria."); + response.getWriter().println(JSONValue.toJSONString(o)); + } + } +} diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/loggraph/src/java/org/apache/zookeeper/graph/servlets/NumEvents.java b/pkg/registry/zookeeper-3.4.6/src/contrib/loggraph/src/java/org/apache/zookeeper/graph/servlets/NumEvents.java new file mode 100644 index 000000000..ed4694581 --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/contrib/loggraph/src/java/org/apache/zookeeper/graph/servlets/NumEvents.java @@ -0,0 +1,87 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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. + */ +package org.apache.zookeeper.graph.servlets; + +import java.io.File; +import java.io.IOException; +import java.io.FileNotFoundException; + +import javax.servlet.ServletException; +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import org.json.simple.JSONArray; +import org.json.simple.JSONObject; +import org.json.simple.JSONValue; + +import java.util.regex.Pattern; +import java.util.regex.Matcher; + +import org.apache.zookeeper.graph.*; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + + +public class NumEvents extends JsonServlet +{ + private static final Logger LOG = LoggerFactory.getLogger(NumEvents.class); + private static final int DEFAULT_PERIOD = 1000; + + private LogSource source = null; + + public NumEvents(LogSource src) throws Exception { + this.source = src; + } + + String handleRequest(JsonRequest request) throws Exception { + String output = ""; + + long starttime = 0; + long endtime = 0; + long period = 0; + + starttime = request.getNumber("start", 0); + endtime = request.getNumber("end", 0); + period = request.getNumber("period", 0); + + if (starttime == 0) { starttime = source.getStartTime(); } + if (endtime == 0) { + if (period > 0) { + endtime = starttime + period; + } else { + endtime = source.getEndTime(); + } + } + + LogIterator iter = source.iterator(starttime, endtime); + JSONObject data = new JSONObject(); + data.put("startTime", starttime); + data.put("endTime", endtime); + long size = 0; + + size = iter.size(); + + data.put("numEntries", size); + if (LOG.isDebugEnabled()) { + LOG.debug("handle(start= " + starttime + ", end=" + endtime + ", numEntries=" + size +")"); + } + return JSONValue.toJSONString(data); + } +} + diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/loggraph/src/java/org/apache/zookeeper/graph/servlets/StaticContent.java b/pkg/registry/zookeeper-3.4.6/src/contrib/loggraph/src/java/org/apache/zookeeper/graph/servlets/StaticContent.java new file mode 100644 index 000000000..4af78959a --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/contrib/loggraph/src/java/org/apache/zookeeper/graph/servlets/StaticContent.java @@ -0,0 +1,50 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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. + */ +package org.apache.zookeeper.graph.servlets; + +import java.io.InputStream; +import java.io.InputStreamReader; +import java.io.BufferedReader; + +import java.io.IOException; + +import javax.servlet.ServletException; +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +public class StaticContent extends HttpServlet { + protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException + { + String path = request.getRequestURI().substring(request.getServletPath().length()); + + InputStream resource = ClassLoader.getSystemResourceAsStream("org/apache/zookeeper/graph/resources" + path); + if (resource == null) { + response.getWriter().println(path + " not found!"); + response.setStatus(HttpServletResponse.SC_NOT_FOUND); + return; + } + + while (resource.available() > 0) { + response.getWriter().write(resource.read()); + } + // response.setContentType("text/plain;charset=utf-8"); + response.setStatus(HttpServletResponse.SC_OK); + } + +} diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/loggraph/src/java/org/apache/zookeeper/graph/servlets/Throughput.java b/pkg/registry/zookeeper-3.4.6/src/contrib/loggraph/src/java/org/apache/zookeeper/graph/servlets/Throughput.java new file mode 100644 index 000000000..341bf9e6a --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/contrib/loggraph/src/java/org/apache/zookeeper/graph/servlets/Throughput.java @@ -0,0 +1,125 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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. + */ +package org.apache.zookeeper.graph.servlets; + +import java.io.IOException; +import java.io.BufferedOutputStream; +import java.io.FileOutputStream; +import java.io.DataOutputStream; +import java.io.PrintStream; + +import java.util.HashSet; +import java.util.LinkedHashMap; + +import org.apache.zookeeper.graph.*; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import org.json.simple.JSONArray; +import org.json.simple.JSONObject; +import org.json.simple.JSONValue; + + +public class Throughput extends JsonServlet +{ + private static final int MS_PER_SEC = 1000; + private static final int MS_PER_MIN = MS_PER_SEC*60; + private static final int MS_PER_HOUR = MS_PER_MIN*60; + + private LogSource source = null; + + public Throughput(LogSource src) throws Exception { + this.source = src; + } + + public String handleRequest(JsonRequest request) throws Exception { + long starttime = 0; + long endtime = 0; + long period = 0; + long scale = 0; + + starttime = request.getNumber("start", 0); + endtime = request.getNumber("end", 0); + period = request.getNumber("period", 0); + + + if (starttime == 0) { starttime = source.getStartTime(); } + if (endtime == 0) { + if (period > 0) { + endtime = starttime + period; + } else { + endtime = source.getEndTime(); + } + } + + String scalestr = request.getString("scale", "minutes"); + if (scalestr.equals("seconds")) { + scale = MS_PER_SEC; + } else if (scalestr.equals("hours")) { + scale = MS_PER_HOUR; + } else { + scale = MS_PER_MIN; + } + + LogIterator iter = source.iterator(starttime, endtime); + + long current = 0; + long currentms = 0; + HashSet zxids_ms = new HashSet(); + long zxidcount = 0; + + JSONArray events = new JSONArray(); + while (iter.hasNext()) { + LogEntry e = iter.next(); + if (e.getType() != LogEntry.Type.TXN) { + continue; + } + + TransactionEntry cxn = (TransactionEntry)e; + + long ms = cxn.getTimestamp(); + long inscale = ms/scale; + + if (currentms != ms && currentms != 0) { + zxidcount += zxids_ms.size(); + zxids_ms.clear(); + } + + if (inscale != current && current != 0) { + JSONObject o = new JSONObject(); + o.put("time", current*scale); + o.put("count", zxidcount); + events.add(o); + zxidcount = 0; + } + current = inscale; + currentms = ms; + + zxids_ms.add(cxn.getZxid()); + } + JSONObject o = new JSONObject(); + o.put("time", current*scale); + o.put("count", zxidcount); + events.add(o); + + iter.close(); + + return JSONValue.toJSONString(events); + } + +}; diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/loggraph/web/org/apache/zookeeper/graph/log4j.properties b/pkg/registry/zookeeper-3.4.6/src/contrib/loggraph/web/org/apache/zookeeper/graph/log4j.properties new file mode 100644 index 000000000..ab8960b0e --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/contrib/loggraph/web/org/apache/zookeeper/graph/log4j.properties @@ -0,0 +1,11 @@ +log4j.rootLogger=TRACE, CONSOLE + +# Print the date in ISO 8601 format +log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender +log4j.appender.CONSOLE.Threshold=TRACE +log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout +log4j.appender.CONSOLE.layout.ConversionPattern=%d{ISO8601} - %-5p [%t:%C{1}@%L] - %m%n + +log4j.logger.org.apache.zookeeper.graph.LogSkipList=off +log4j.logger.org.apache.zookeeper.graph.RandomAccessFileReader=off +#log4j.logger.org.apache.zookeeper.graph.Log4JSource=off \ No newline at end of file diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/loggraph/web/org/apache/zookeeper/graph/resources/load-big.gif b/pkg/registry/zookeeper-3.4.6/src/contrib/loggraph/web/org/apache/zookeeper/graph/resources/load-big.gif new file mode 100644 index 0000000000000000000000000000000000000000..ddb7ff1aac1b2fc825667c157873c2c55bbe8db8 GIT binary patch literal 1924 zcmciDX;70#00!U)Urs41ND>$3-?7cZa-C@o`?~}E+$na_sVK~an51Y7o6Am#OJGNBi-|v-0K)zTz!9cZZmYYj zeiQ^4Hx2}<@9us*(zz1hB8-YDCx|yPvMXzQM{_K$!h*iJ(7x2j*bY>E)v;gG zt15c?^oIWX1BxEuJ?E}-N%%X2$C&X)nYafzWBB27BZK9$hH1k@-(v5=%efcJKAYA8 zj{X%G-GGGnp>xBKmtR{qyXkbXi>i|w&^A+i%*o~apB=fnp1EvhyA8i)zT0!ZJK|=f zGujFu=8Q?f@YHB=vJ&Q(Q2ooMB$CxnsQ@;Cl88SakbL=c9-bR}Cd`4o_e-(kkx-G` z1gxmM5nm)f#c{~lR_t33s5hr)1~uEaw)kjKO}BP*)>VmXx>RQ1;1H?TbtLMnaSW#; zj9+XgO*q{nKEpjQb`O`&-Jk8B)-S0R`xoZlkUo^CY4otNIEG*Z>9xBj^;cd~XE!if z=JK3SR%Kh!+&qgwp0nLox=TA*jYs?se%u2xUeoK&1u^$dFrFz~jrhLs@UeBBdpx|M zY)D3CZeBjWKwtxdli{#JJ47_Xo<)bn10rN1&s7)?M_u%xDH4!1ac=bhs)DA9u4+yx zQz*rfNSWBSxTLdtwZlQ%QWxV{Y9-?#zL7M}ttCzze@xWkN1wM3@#hRCqG74qOeC&J z9C^RRzb6jvbS)W0Nd^=G0Xde#v6Z!xx5H+VUZrNmDp2GD$ZAyrrw%!G2FskYEUNL97Eu}MQR$IyrnBkg(h1rW4yIQEM3J@S3&;1KqjvtHc)u##|B-p#vH)WPhuYi^mQjj0C~N7S!=n7H-h z)-{F0|AmmcM>roo8TLt*J%^c#&ZiY1FVl9S>(#+iza>x4q)s+Z@gD1* z@P^eR(w@FoxHWz6T{O`R|GvS0@PW)Hmm#QRgaoFdRCosCuGa!^PcBA73HQUcl65Dr zO|`ePK2pY_S=Cuk0cLN5NYeIMmj@%E-?ilgU&#f%3S_8AdaDu z`F^)`6_9BI%cf+|5|L?q0A9#NmQZLMl$0#@LkamJueh-M5`ik%{!(^MZk{k*qitzz zdsl7?nA3Imb6iI@->x5 zwXc~EZZLz-aKH4hJ%XN<9U8*$f;BXGrEQ^o=8paJ`*iQfV=)}tj7M$B9-E(t0}WI5 ziiH<<@gb})LXWcd=N1SGi;6?d9SD)&II^XLelX2e#DZKujgFz0`cy~Oo<~(uRW#l% zG_=kVdRXZIt%P()d)_@2TRL5aa4qGGD&I4tJNR+p1a_1(jW-f!2MXqTpXs0WExsHx Pn1F;$An(;T&^-PCGf5vc literal 0 HcmV?d00001 diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/loggraph/web/org/apache/zookeeper/graph/resources/load.gif b/pkg/registry/zookeeper-3.4.6/src/contrib/loggraph/web/org/apache/zookeeper/graph/resources/load.gif new file mode 100644 index 0000000000000000000000000000000000000000..d0bce1542342e912da81a2c260562df172f30d73 GIT binary patch literal 673 zcmZ?wbhEHb6krfw_{6~Q|Nnmm28Kh24mmkF0U1e2Nli^nlO|14{Lk&@8WQa67~pE8 zXTZz|lvDgC+Z`3#dv5h=E26FfcG1 zbL_hF&)}42ws10s6^G;;cE1^EoUR)U5A70}d2pLv!jVIT7j&Z~EblI3x0K*v_sV|m z0kj3v921Z^em#l`(k(o@H$3ZdDRc@9NidXDNbqrumReCGv$gd8+e8WW28HVqkJ_9i zH>s*<31KtHjANIPvi2#*6BEu%3Dak5O_t&NBI)H?V$TxT}#l{vOTn5naXTfF^&~Hhq+NX@#Ccc>y7T?;vjI&jdhsDsPJyAw*m0Qz>i}K7# zL9w50Ng{fT}A5JUe8lRK1h7_Y2;BWJDd=c6f&i?Wv5(5q?6|P zQw{>maxZP<537OA37Uk}7@%_$4o$EWe_Zl>&#id|lE-BpDC#+Fn|msJ%_2h{Hg1vP z#N8WAzfWasG}yq|xqE)DrWaOofX=z|?*pgc%{ig5vl!pqDlC|q&~Z0$&Rvsft&VO- z4MZj+%-+Vx%W}v;V76hyp=;+R;x+~t^Q%*xuFTQAF2})fSfTHDAs>sO!OBw`)&)o$ c0!CNZt))x~rAZP^^P&YOFfdqy5)K#u0POD40{{R3 literal 0 HcmV?d00001 diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/loggraph/web/org/apache/zookeeper/graph/resources/main.html b/pkg/registry/zookeeper-3.4.6/src/contrib/loggraph/web/org/apache/zookeeper/graph/resources/main.html new file mode 100644 index 000000000..b9affe665 --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/contrib/loggraph/web/org/apache/zookeeper/graph/resources/main.html @@ -0,0 +1,60 @@ + + + + + + + + + + + + + + + + + + + + + + + + +
    + Edit Filters + Add logs +
    +
    + Log view + Servers view + Sessions view + Statistics +
    +
    +
    +
    +
    + + diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/monitoring/JMX-RESOURCES b/pkg/registry/zookeeper-3.4.6/src/contrib/monitoring/JMX-RESOURCES new file mode 100644 index 000000000..1d1aa98fe --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/contrib/monitoring/JMX-RESOURCES @@ -0,0 +1,38 @@ + +Resources for monitoring ZooKeeper using JMX +-------------------------------------------- + +JMX/REST Bridge +--------------- + +http://code.google.com/p/polarrose-jmx-rest-bridge/ + +"Simple Java Web Application that exposes JMX servers through HTTP. This was written so that external tools can easily query JMX attributes of Java applications. More specifically, this was written to allow Cacti to generate fancy graphs of ActiveMQ instances." + +JMXetric +-------- + +http://code.google.com/p/jmxetric/ + +"JMXetric is a 100% java, configurable JVM agent that periodically polls MBean attributes and reports their values to Ganglia." + +jmxquery +-------- + +http://code.google.com/p/jmxquery/ + +"a plugin for nagios to check jmx" + +check_jmx +--------- + +http://exchange.nagios.org/directory/Plugins/Java-Applications-and-Servers/check_jmx/details + + +jmx2snmp +-------- + +http://github.com/tcurdt/jmx2snmp + +Expose application JMX properties via SNMP + diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/monitoring/README b/pkg/registry/zookeeper-3.4.6/src/contrib/monitoring/README new file mode 100644 index 000000000..d48e2ce26 --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/contrib/monitoring/README @@ -0,0 +1,84 @@ + +Tools and Recipes for ZooKeeper Monitoring +------------------------------------------ + +How To Monitor +-------------- + +A ZooKeeper cluster can be monitored in two ways: + 1. by using the 'mntr' 4letterword command + 2. by using JMX to query the MBeans + +This repo contains tools and recipes for monitoring ZooKeeper using the first method. + +Check the file JMX-RESOURCE for some links to resources that could help you monitor a ZooKeeper cluster using the JMX interface. + +Requirements +------------ + +ZooKeeper 3.4.0 or later or you can apply ZOOKEEPER-744 patch over the latest 3.3.x release. +The server should understand the 'mntr' 4letterword command. + +$ echo 'mntr' | nc localhost 2181 +zk_version 3.4.0--1, built on 06/19/2010 15:07 GMT +zk_avg_latency 141 +zk_max_latency 1788 +zk_min_latency 0 +zk_packets_received 385466 +zk_packets_sent 435364 +zk_outstanding_requests 0 +zk_server_state follower +zk_znode_count 5 +zk_watch_count 0 +zk_ephemerals_count 0 +zk_approximate_data_size 41 +zk_open_file_descriptor_count 20 +zk_max_file_descriptor_count 1024 + +Python 2.6 (maybe it works on previous version but it's not tested yet). + +In a nutshell +------------- + +All you need is check_zookeeper.py It has no external dependencies. + + +*** On Nagios call the script like this: + +./check_zookeeper.py -o nagios -s "" -k -w -c + + +*** On Cacti define a custom data input method using the script like this: + +./check_zookeeper.py -o cacti -s "" -k --leader + +-- outputs a single value for the given key fetched from the cluster leader + +OR + +./check_zookeeper.py -o cacti -s "" -k + +-- outputs multiple values on for each cluster node +ex: localhost_2182:0 localhost_2183:0 localhost_2181:0 localhost_2184:0 localhost_2185:0 + +*** On Ganglia: + +install the plugin found in the ganglia/ subfolder OR + +./check_zookeeper.py -o ganglia -s "" + +it will use gmetric to send zookeeper node status data. + + +Check the subfolders for configuration details and samples for each platform. + +License +------- + +Apache License 2.0 or later. + +ZooKeeper 4letterwords Commands +------------------------------- + +http://zookeeper.apache.org/docs/current/zookeeperAdmin.html#sc_zkCommands + diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/monitoring/cacti/README b/pkg/registry/zookeeper-3.4.6/src/contrib/monitoring/cacti/README new file mode 100644 index 000000000..8188723e5 --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/contrib/monitoring/cacti/README @@ -0,0 +1,56 @@ +Licensed to the Apache Software Foundation (ASF) under one +or more contributor license agreements. See the NOTICE file +distributed with this work for additional information +regarding copyright ownership. The ASF licenses this file +to you 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. + +Recipes for ZooKeeper monitoring using Cacti +-------------------------------------------- + +Cacti install guide: https://help.ubuntu.com/community/Cacti + +Cacti Manual: http://www.cacti.net/downloads/docs/html/ +PDF version: http://www.cacti.net/downloads/docs/pdf/manual.pdf + +Check Chapter 16: Simplest Method of Going from Script to Graph + http://www.cacti.net/downloads/docs/html/how_to.html#SCRIPT_TO_GRAPH + +WARNING: I have wrote these instructions while installing and configuring the plugin on my desktop computer running Ubuntu 9.10. I've installed Cacti using apt-get. + +WARNING: I'm going to make the assumption that you know how to work with Cacti and how to setup Data Input Methods for custom scripts. I'm also going to assume that you have already installed Cacti and everything works as expected. + +You can extend the Cacti's data gathering functionality through external scripts. Cacti comes with a number of scripts out of the box wich are localted in the scripts/ directory. + + +The check_zookeeper.py script can be used a custom data input method for Cacti. + +Single value (check cluster status by sending queries to the leader): +--------------------------------------------------------------------- + +python scripts/check_zookeeper.py -s "localhost:2181,localhost:2182,localhost:2183,localhost:2184,localhost:2185" -k -o cacti --leader + +When you will call the script this way it will about a single value representing the value attached to this . + + +Multiple values (one for each cluster node): +-------------------------------------------- + +python scripts/check_zookeeper.py -s "localhost:2181,localhost:2182,localhost:2183,localhost:2184,localhost:2185" -k -o cacti + +Output: +localhost_2182:0 localhost_2183:0 localhost_2181:0 localhost_2184:0 localhost_2185:0 + + +TBD: Step by step guide + + diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/monitoring/check_zookeeper.py b/pkg/registry/zookeeper-3.4.6/src/contrib/monitoring/check_zookeeper.py new file mode 100644 index 000000000..c00db8bc0 --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/contrib/monitoring/check_zookeeper.py @@ -0,0 +1,358 @@ +#! /usr/bin/env python +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you 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. +""" Check Zookeeper Cluster + +Generic monitoring script that could be used with multiple platforms (Ganglia, Nagios, Cacti). + +It requires ZooKeeper 3.4.0 or greater. The script needs the 'mntr' 4letter word +command (patch ZOOKEEPER-744) that was now commited to the trunk. +The script also works with ZooKeeper 3.3.x but in a limited way. +""" + +import sys +import socket +import logging +import re +import subprocess + +from StringIO import StringIO +from optparse import OptionParser, OptionGroup + +__version__ = (0, 1, 0) + +log = logging.getLogger() +logging.basicConfig(level=logging.ERROR) + +class NagiosHandler(object): + + @classmethod + def register_options(cls, parser): + group = OptionGroup(parser, 'Nagios specific options') + + group.add_option('-w', '--warning', dest='warning') + group.add_option('-c', '--critical', dest='critical') + + parser.add_option_group(group) + + def analyze(self, opts, cluster_stats): + try: + warning = int(opts.warning) + critical = int(opts.critical) + + except (TypeError, ValueError): + print >>sys.stderr, 'Invalid values for "warning" and "critical".' + return 2 + + if opts.key is None: + print >>sys.stderr, 'You should specify a key name.' + return 2 + + warning_state, critical_state, values = [], [], [] + for host, stats in cluster_stats.items(): + if opts.key in stats: + + value = stats[opts.key] + values.append('%s=%s;%s;%s' % (host, value, warning, critical)) + + if warning >= value > critical or warning <= value < critical: + warning_state.append(host) + + elif (warning < critical and critical <= value) or (warning > critical and critical >= value): + critical_state.append(host) + + if not values: + # Zookeeper may be down, not serving requests or we may have a bad configuration + print 'Critical, %s not found' % opts.key + return 2 + + values = ' '.join(values) + if critical_state: + print 'Critical "%s" %s!|%s' % (opts.key, ', '.join(critical_state), values) + return 2 + + elif warning_state: + print 'Warning "%s" %s!|%s' % (opts.key, ', '.join(warning_state), values) + return 1 + + else: + print 'Ok "%s"!|%s' % (opts.key, values) + return 0 + +class CactiHandler(object): + + @classmethod + def register_options(cls, parser): + group = OptionGroup(parser, 'Cacti specific options') + + group.add_option('-l', '--leader', dest='leader', + action="store_true", help="only query the cluster leader") + + parser.add_option_group(group) + + def analyze(self, opts, cluster_stats): + if opts.key is None: + print >>sys.stderr, 'The key name is mandatory.' + return 1 + + if opts.leader is True: + try: + leader = [x for x in cluster_stats.values() \ + if x.get('zk_server_state', '') == 'leader'][0] + + except IndexError: + print >>sys.stderr, 'No leader found.' + return 3 + + if opts.key in leader: + print leader[opts.key] + return 0 + + else: + print >>sys.stderr, 'Unknown key: "%s"' % opts.key + return 2 + else: + for host, stats in cluster_stats.items(): + if opts.key not in stats: + continue + + host = host.replace(':', '_') + print '%s:%s' % (host, stats[opts.key]), + + +class GangliaHandler(object): + + @classmethod + def register_options(cls, parser): + group = OptionGroup(parser, 'Ganglia specific options') + + group.add_option('-g', '--gmetric', dest='gmetric', + default='/usr/bin/gmetric', help='ganglia gmetric binary '\ + 'location: /usr/bin/gmetric') + + parser.add_option_group(group) + + def call(self, *args, **kwargs): + subprocess.call(*args, **kwargs) + + def analyze(self, opts, cluster_stats): + if len(cluster_stats) != 1: + print >>sys.stderr, 'Only allowed to monitor a single node.' + return 1 + + for host, stats in cluster_stats.items(): + for k, v in stats.items(): + try: + self.call([opts.gmetric, '-n', k, '-v', str(int(v)), '-t', 'uint32']) + except (TypeError, ValueError): + pass + +class ZooKeeperServer(object): + + def __init__(self, host='localhost', port='2181', timeout=1): + self._address = (host, int(port)) + self._timeout = timeout + + def get_stats(self): + """ Get ZooKeeper server stats as a map """ + data = self._send_cmd('mntr') + if data: + return self._parse(data) + else: + data = self._send_cmd('stat') + return self._parse_stat(data) + + def _create_socket(self): + return socket.socket() + + def _send_cmd(self, cmd): + """ Send a 4letter word command to the server """ + s = self._create_socket() + s.settimeout(self._timeout) + + s.connect(self._address) + s.send(cmd) + + data = s.recv(2048) + s.close() + + return data + + def _parse(self, data): + """ Parse the output from the 'mntr' 4letter word command """ + h = StringIO(data) + + result = {} + for line in h.readlines(): + try: + key, value = self._parse_line(line) + result[key] = value + except ValueError: + pass # ignore broken lines + + return result + + def _parse_stat(self, data): + """ Parse the output from the 'stat' 4letter word command """ + h = StringIO(data) + + result = {} + + version = h.readline() + if version: + result['zk_version'] = version[version.index(':')+1:].strip() + + # skip all lines until we find the empty one + while h.readline().strip(): pass + + for line in h.readlines(): + m = re.match('Latency min/avg/max: (\d+)/(\d+)/(\d+)', line) + if m is not None: + result['zk_min_latency'] = int(m.group(1)) + result['zk_avg_latency'] = int(m.group(2)) + result['zk_max_latency'] = int(m.group(3)) + continue + + m = re.match('Received: (\d+)', line) + if m is not None: + result['zk_packets_received'] = int(m.group(1)) + continue + + m = re.match('Sent: (\d+)', line) + if m is not None: + result['zk_packets_sent'] = int(m.group(1)) + continue + + m = re.match('Outstanding: (\d+)', line) + if m is not None: + result['zk_outstanding_requests'] = int(m.group(1)) + continue + + m = re.match('Mode: (.*)', line) + if m is not None: + result['zk_server_state'] = m.group(1) + continue + + m = re.match('Node count: (\d+)', line) + if m is not None: + result['zk_znode_count'] = int(m.group(1)) + continue + + return result + + def _parse_line(self, line): + try: + key, value = map(str.strip, line.split('\t')) + except ValueError: + raise ValueError('Found invalid line: %s' % line) + + if not key: + raise ValueError('The key is mandatory and should not be empty') + + try: + value = int(value) + except (TypeError, ValueError): + pass + + return key, value + +def main(): + opts, args = parse_cli() + + cluster_stats = get_cluster_stats(opts.servers) + if opts.output is None: + dump_stats(cluster_stats) + return 0 + + handler = create_handler(opts.output) + if handler is None: + log.error('undefined handler: %s' % opts.output) + sys.exit(1) + + return handler.analyze(opts, cluster_stats) + +def create_handler(name): + """ Return an instance of a platform specific analyzer """ + try: + return globals()['%sHandler' % name.capitalize()]() + except KeyError: + return None + +def get_all_handlers(): + """ Get a list containing all the platform specific analyzers """ + return [NagiosHandler, CactiHandler, GangliaHandler] + +def dump_stats(cluster_stats): + """ Dump cluster statistics in an user friendly format """ + for server, stats in cluster_stats.items(): + print 'Server:', server + + for key, value in stats.items(): + print "%30s" % key, ' ', value + print + +def get_cluster_stats(servers): + """ Get stats for all the servers in the cluster """ + stats = {} + for host, port in servers: + try: + zk = ZooKeeperServer(host, port) + stats["%s:%s" % (host, port)] = zk.get_stats() + + except socket.error, e: + # ignore because the cluster can still work even + # if some servers fail completely + + # this error should be also visible in a variable + # exposed by the server in the statistics + + logging.info('unable to connect to server '\ + '"%s" on port "%s"' % (host, port)) + + return stats + + +def get_version(): + return '.'.join(map(str, __version__)) + + +def parse_cli(): + parser = OptionParser(usage='./check_zookeeper.py ', version=get_version()) + + parser.add_option('-s', '--servers', dest='servers', + help='a list of SERVERS', metavar='SERVERS') + + parser.add_option('-o', '--output', dest='output', + help='output HANDLER: nagios, ganglia, cacti', metavar='HANDLER') + + parser.add_option('-k', '--key', dest='key') + + for handler in get_all_handlers(): + handler.register_options(parser) + + opts, args = parser.parse_args() + + if opts.servers is None: + parser.error('The list of servers is mandatory') + + opts.servers = [s.split(':') for s in opts.servers.split(',')] + + return (opts, args) + + +if __name__ == '__main__': + sys.exit(main()) + diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/monitoring/ganglia/README b/pkg/registry/zookeeper-3.4.6/src/contrib/monitoring/ganglia/README new file mode 100644 index 000000000..578adfee2 --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/contrib/monitoring/ganglia/README @@ -0,0 +1,48 @@ +Licensed to the Apache Software Foundation (ASF) under one +or more contributor license agreements. See the NOTICE file +distributed with this work for additional information +regarding copyright ownership. The ASF licenses this file +to you 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. + +Recipes for ZooKeeper monitoring using Ganglia +---------------------------------------------- + +Ganglia Install guide: http://sourceforge.net/apps/trac/ganglia/wiki/Ganglia%203.1.x%20Installation%20and%20Configuration + +Gmond configuration: http://sourceforge.net/apps/trac/ganglia/wiki/Gmond%203.1.x%20General%20Configuration + +WARNING: I have wrote these instructions while installing and configuring the plugin on my desktop computer running Ubuntu 9.10. I've installed Ganglia using apt-get. + +WARNING: I'm going to make the assumption that you know how to work with Ganglia. I'm also going to assume that you have already installed Gangli and everything works as expected. + +You can monitoring ZooKeeper using Ganglia in two ways: + +1. Using a python module: + + WARNING! The python module only works with Ganglia 3.1.x + + a. enable python modules: you can find instructions in modpython.confg + b. copy zookeeper.pyconf in /etc/ganglia/conf.d/ + c. copy zookeeper_ganglia.py in /usr/lib/ganglia/python_plugins + d. restart the ganglia-monitor + + This is the recommended way! + +2. OR Using check_zookeeper.py and gmetric: + + Monitoring ZooKeeper using Ganglia is a simple as calling: + + ./check_zookeeper.py -o ganglia -s localhost:2181 + + on each of the ZooKeeper cluster nodes. I'm making the assumption that you have already configured gmond and installed gmetric on each node. + diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/monitoring/ganglia/Screenshot.png b/pkg/registry/zookeeper-3.4.6/src/contrib/monitoring/ganglia/Screenshot.png new file mode 100644 index 0000000000000000000000000000000000000000..bc0e41d5f644bdebd680aa8e97e3d3f08039fcdc GIT binary patch literal 111055 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\o(&ieLfwK!DlYCd)QI1| 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 literal 0 HcmV?d00001 diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/monitoring/ganglia/modpython.conf b/pkg/registry/zookeeper-3.4.6/src/contrib/monitoring/ganglia/modpython.conf new file mode 100644 index 000000000..5cd051a8e --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/contrib/monitoring/ganglia/modpython.conf @@ -0,0 +1,28 @@ +/* Licensed to the Apache Software Foundation (ASF) under one +or more contributor license agreements. See the NOTICE file +distributed with this work for additional information +regarding copyright ownership. The ASF licenses this file +to you 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. */ + +/* Update gmond.conf */ + +modules { + module { + name = "python_module" + path = "/usr/lib/ganglia/modpython.so" + params = "/usr/lib/ganglia/python_modules" + } +} + +include ('/etc/ganglia/conf.d/*.pyconf') + diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/monitoring/ganglia/zookeeper.pyconf b/pkg/registry/zookeeper-3.4.6/src/contrib/monitoring/ganglia/zookeeper.pyconf new file mode 100644 index 000000000..43801a0f2 --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/contrib/monitoring/ganglia/zookeeper.pyconf @@ -0,0 +1,49 @@ +/* Licensed to the Apache Software Foundation (ASF) under one +or more contributor license agreements. See the NOTICE file +distributed with this work for additional information +regarding copyright ownership. The ASF licenses this file +to you 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. */ + +/* Update /etc/ganglia/gmond.conf with the content of this file. */ + +/* ATTENTION: Change the host and the port to meet your setup. */ + +modules { + module { + name = "zookeeper_ganglia" + language = "python" + param host { value = "127.0.0.1" } + param port { value = 2181 } + } +} + +collection_group { + collect_every = 20 + time_threshold = 60 + metric { name = "zk_avg_latency" } + metric { name = "zk_max_latency" } + metric { name = "zk_min_latency" } + metric { name = "zk_packets_received" } + metric { name = "zk_packets_sent" } + metric { name = "zk_outstanding_requests" } + metric { name = "zk_znode_count" } + metric { name = "zk_watch_count" } + metric { name = "zk_ephemerals_count" } + metric { name = "zk_approximate_data_size" } + metric { name = "zk_open_file_descriptor_count" } + metric { name = "zk_max_file_descriptor_count" } + metric { name = "zk_followers" } + metric { name = "zk_synced_followers" } + metric { name = "zk_pending_syncs" } +} + diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/monitoring/ganglia/zookeeper_ganglia.py b/pkg/registry/zookeeper-3.4.6/src/contrib/monitoring/ganglia/zookeeper_ganglia.py new file mode 100644 index 000000000..82903d1f6 --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/contrib/monitoring/ganglia/zookeeper_ganglia.py @@ -0,0 +1,209 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you 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. +""" Python Ganglia Module for ZooKeeper monitoring + +Inspired by: http://gist.github.com/448007 + +Copy this file to /usr/lib/ganglia/python_plugins + +""" + +import sys +import socket +import time +import re + +from StringIO import StringIO + +TIME_BETWEEN_QUERIES = 20 + +class ZooKeeperServer(object): + + def __init__(self, host='localhost', port='2181', timeout=1): + self._address = (host, int(port)) + self._timeout = timeout + + def get_stats(self): + """ Get ZooKeeper server stats as a map """ + data = self._send_cmd('mntr') + if data: + return self._parse(data) + else: + data = self._send_cmd('stat') + return self._parse_stat(data) + + def _create_socket(self): + return socket.socket() + + def _send_cmd(self, cmd): + """ Send a 4letter word command to the server """ + s = self._create_socket() + s.settimeout(self._timeout) + + s.connect(self._address) + s.send(cmd) + + data = s.recv(2048) + s.close() + + return data + + def _parse(self, data): + """ Parse the output from the 'mntr' 4letter word command """ + h = StringIO(data) + + result = {} + for line in h.readlines(): + try: + key, value = self._parse_line(line) + result[key] = value + except ValueError: + pass # ignore broken lines + + return result + + def _parse_stat(self, data): + """ Parse the output from the 'stat' 4letter word command """ + h = StringIO(data) + + result = {} + + version = h.readline() + if version: + result['zk_version'] = version[version.index(':')+1:].strip() + + # skip all lines until we find the empty one + while h.readline().strip(): pass + + for line in h.readlines(): + m = re.match('Latency min/avg/max: (\d+)/(\d+)/(\d+)', line) + if m is not None: + result['zk_min_latency'] = int(m.group(1)) + result['zk_avg_latency'] = int(m.group(2)) + result['zk_max_latency'] = int(m.group(3)) + continue + + m = re.match('Received: (\d+)', line) + if m is not None: + result['zk_packets_received'] = int(m.group(1)) + continue + + m = re.match('Sent: (\d+)', line) + if m is not None: + result['zk_packets_sent'] = int(m.group(1)) + continue + + m = re.match('Outstanding: (\d+)', line) + if m is not None: + result['zk_outstanding_requests'] = int(m.group(1)) + continue + + m = re.match('Mode: (.*)', line) + if m is not None: + result['zk_server_state'] = m.group(1) + continue + + m = re.match('Node count: (\d+)', line) + if m is not None: + result['zk_znode_count'] = int(m.group(1)) + continue + + return result + + def _parse_line(self, line): + try: + key, value = map(str.strip, line.split('\t')) + except ValueError: + raise ValueError('Found invalid line: %s' % line) + + if not key: + raise ValueError('The key is mandatory and should not be empty') + + try: + value = int(value) + except (TypeError, ValueError): + pass + + return key, value + +def metric_handler(name): + if time.time() - metric_handler.timestamp > TIME_BETWEEN_QUERIES: + zk = ZooKeeperServer(metric_handler.host, metric_handler.port, 5) + try: + metric_handler.info = zk.get_stats() + except Exception, e: + print >>sys.stderr, e + metric_handler.info = {} + + return metric_handler.info.get(name, 0) + +def metric_init(params=None): + params = params or {} + + metric_handler.host = params.get('host', 'localhost') + metric_handler.port = int(params.get('port', 2181)) + metric_handler.timestamp = 0 + + metrics = { + 'zk_avg_latency': {'units': 'ms'}, + 'zk_max_latency': {'units': 'ms'}, + 'zk_min_latency': {'units': 'ms'}, + 'zk_packets_received': { + 'units': 'packets', + 'slope': 'positive' + }, + 'zk_packets_sent': { + 'units': 'packets', + 'slope': 'positive' + }, + 'zk_outstanding_requests': {'units': 'connections'}, + 'zk_znode_count': {'units': 'znodes'}, + 'zk_watch_count': {'units': 'watches'}, + 'zk_ephemerals_count': {'units': 'znodes'}, + 'zk_approximate_data_size': {'units': 'bytes'}, + 'zk_open_file_descriptor_count': {'units': 'descriptors'}, + 'zk_max_file_descriptor_count': {'units': 'descriptors'}, + 'zk_followers': {'units': 'nodes'}, + 'zk_synced_followers': {'units': 'nodes'}, + 'zk_pending_syncs': {'units': 'syncs'} + } + metric_handler.descriptors = {} + for name, updates in metrics.iteritems(): + descriptor = { + 'name': name, + 'call_back': metric_handler, + 'time_max': 90, + 'value_type': 'int', + 'units': '', + 'slope': 'both', + 'format': '%d', + 'groups': 'zookeeper', + } + descriptor.update(updates) + metric_handler.descriptors[name] = descriptor + + return metric_handler.descriptors.values() + +def metric_cleanup(): + pass + + +if __name__ == '__main__': + ds = metric_init({'host':'localhost', 'port': '2181'}) + for d in ds: + print "%s=%s" % (d['name'], metric_handler(d['name'])) + + diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/monitoring/nagios/README.txt b/pkg/registry/zookeeper-3.4.6/src/contrib/monitoring/nagios/README.txt new file mode 100644 index 000000000..317ae1486 --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/contrib/monitoring/nagios/README.txt @@ -0,0 +1,86 @@ +Licensed to the Apache Software Foundation (ASF) under one +or more contributor license agreements. See the NOTICE file +distributed with this work for additional information +regarding copyright ownership. The ASF licenses this file +to you 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. + +Configuration Recipe for monitoring ZooKeeper using Nagios +---------------------------------------------------------- + +I will start by making the assumption that you already have an working Nagios install. + +WARNING: I have wrote these instructions while installing and configuring the plugin on my desktop computer running Ubuntu 9.10. I've installed Nagios using apt-get. + +WARNING: You should customize the config files as suggested in order to match your Nagios and Zookeeper install. + +WARNING: This README assumes you know how to configure Nagios and how it works. + +WARNING: You should customize the warning and critical levels on service checks to meet your own needs. + +1. Install the plugin + +$ cp check_zookeeper.py /usr/lib/nagios/plugins/ + +2. Install the new commands + +$ cp zookeeper.cfg /etc/nagios-plugins/config + +3. Update the list of servers in zookeeper.cfg for the command 'check_zookeeper' and update the port for the command 'check_zk_node' (default: 2181) + +4. Create a virtual host in Nagios used for monitoring the cluster as a whole -OR- Create a hostgroup named 'zookeeper-servers' and add all the zookeeper cluster nodes. + +5. Define service checks like I have ilustrated bellow or just use the provided definitions. + +define service { + use generic-service + host_name zookeeper-cluster + service_description ... + check_command check_zookeeper!!! +} + +define service { + hostgroup_name zookeeper-servers + use generic-service + service_description ZK_Open_File_Descriptors_Count + check_command check_zk_node!!! +} + +Ex: + +a. check the number of open file descriptors + +define service{ + use generic-service + host_name zookeeper-cluster + service_description ZK_Open_File_Descriptor_Count + check_command check_zookeeper!zk_open_file_descriptor_count!500!800 +} + +b. check the number of ephemerals nodes + +define service { + use generic-service + host_name localhost + service_description ZK_Ephemerals_Count + check_command check_zookeeper!zk_ephemerals_count!10000!100000 +} + +c. check the number of open file descriptors for each host in the group + +define service { + hostgroup_name zookeeper-servers + use generic-service + service_description ZK_Open_File_Descriptors_Count + check_command check_zk_node!zk_open_file_descriptor_count!500!800 +} + diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/monitoring/nagios/Screenshot-1.png b/pkg/registry/zookeeper-3.4.6/src/contrib/monitoring/nagios/Screenshot-1.png new file mode 100644 index 0000000000000000000000000000000000000000..2dc55c58adcba0adf1407a093eabf3556153cd8b GIT binary patch literal 196668 zcmYhj1z1$!7Bzeb>28n|5v03YO1itdyIVp82^DD=y1P3B0cntq0qK%v==hKKe)s$S z;o+H?Gr`Px-@W(RYpqSRs3IMEI{v?3I3PWf1U!iB`CdsHc?pRC>je$L zupRg|)WCZw2~FRnzga%I1oQKQ6Ip3T%r)rDov2~D5>iqYC!G$lEOVauc189xuLoWi zk!r+|<=6V)2lQ1f;7WXXLy>H?*rjoNKiCuViOx?$G5Gr8=BB3JV|fvpcDw3vB7lMt zA@qX;pB4uN5&nZXH4e&i2!lENe{cThi2LV%NB{far9*Yy={EF3WZ z)2Yo!z2o+o_GTB*KEUB<-ovl($6t5Q$exV1*&NTR$zM3j<}qK^13Z{_K!m@g9-E3^5PHcB~L)S))@K;dm{p}L)- zqN2JwULX6L#3565OBUZ7;WG^A~zha~Fb$9Qr9ck%8IoM{*qj*a?Wf=2rK`c_sixc9mwulKm% zV~@R~ADw>|rdEBGFZ^Ac9lSI>jSnQV8kNl-KD*7{4g6i)(vbr9UpIc2=V2mh-&}?T zl5%j6dr3M=Ye&HBM)X|`7Z)8pKGZr?S3w=>;6nuX1_aQ*d4q(EtneD|%oMz6X=&ZX z#XdYd$T|^bF4#~}W$*3Ts#MaW003U}&*^E6S6?4AI`I(U4wyFs4@!%FPfrVZ?z!Hc zZ+<-BZH5RH{Yrn>Ou6%zuIY{LDYtj7swssicf=Qjkk zF3wO{W~G1e%0Gk9n0zBPp!@2pT%me;kzKkB3T*^#U)4(O!T$cphzQl0tfP(PXH}=sI3!+$^>oOL*Udv~jj&B!Dur_LAUyr4 zay$zQTm3=>37qrku}*Qm&n4+IY86Y%w81BitINyFi;Lw}4;xk0FY<+V$X?X{zQGfJ zSYa>XFTP=uW5J(@Sb8;oBJC)kzPU2rk|-ZsJsnI?CFKZLy#@|E%Y6+vj$W31^Lo1J zGt0%0#E8Q|^SkYE*cnTElE6^MTvgKxa{W#w&DL^Ekg)90)WuWMN*sx!9^vipJnMzt z<-+tY*l!YjYkWosFC`Ia)Cf`GkGOS; zp_ZSouPrxOdXXRG89z#m&mVDxba~TEhW>yrLe<&%xXEdmahNG6D5wxG+PGTG|I*gY z?F?bLk}2*$Chpnj^W#Bud4Sezxei;Byq2Ec`>rnVQ=C>yE!qA`O>Mo%rsVJRy!yT_ zg5N7b0%#rTnKV^(B5P6vy)7NYdzYfqwK@lFcb)G|8EhVjoMG7vBLRBGw-!IQcic?j zg(w#aa5>x!m{fIwA%zU=j*XT7hTbtBmq-vFln6Z@7bkvvl)_G}H#hqx7y!+vf8$;I z!t!B(;@inI+J8{z$=YG)H-m4bn%U-T=J<+rh-XvM_V9C_C$kg3dYXqjF` zNDUGb2}PWI`W7NvR@J_-|9LFNBG)bgm+tDJ30b9umQlvpxvJlMvB}9mPEM}gdhD0H z0&$wUtl}@5_6<;L!6adO~r3SvL|09l770r4yiG%UZp4%X@%B??ZK*D zi^1XUgXWTD@IjGJ`Vf#~5G&HT+qPDvBWv7Y!-RHD3Kp;4wb#u(h2*yB)+9w$Vd9~P z%m8(g{A`s`duHa!Lr2)(zlM-qX}cd6fzTNPucSUFFDaTc%TmoU?Q$NnxP+8uk`Gzi z0x@|V-1=Y^tm4%oWr8IodAIi!mKqwrE!m8`fWctb*Yoy`+)5tGO)V`g1r;;4-0tLq z?6K|b?fR8qNL%UEFFJCQ9k%uV?6d*%zauX?d=0Y$HyN&^SH9nh_Z(cFt$wMdpg{7j zU!-KNCgWRiqR;*IjWIzU+oa_>bCHrX^S0c^#>SMCl2onZU zc;7k>dX;gf|IO)obaXUOUOIC*^Q|E; z1^)T-2dr`2_A_#fRu$R~_Vx!|LHF+N=RcF;NG!y%T%MmE4Vsg{{H=YUdNeiRjKXa?CdNd@u6?s z)o<1iT4bkRJngmryEG`uTS7uYbhV2!QvKCepeR$>rm=L`lznS=$Ed}1eWp~SwY4?R zeYwsGoqJ30zWB%7Uy-#S*v0C_3u_EH!iBc^8&VZmoa)or ztrtt+S$$6YZb@#kslOGJT`o|i5+nQfc(@VyqKgY#Iheot4 z*LE-dgFz#@rJY+L`&x`iOvjN5UZ2{~;eZWNeKJy99@jrTqobpng9#TMe>?^ClBH2l zZ_Uvs_JBe zUZR#*WmoW{;2^43K%REFY%B?f|K*-`r9N0Z*fD5%$%u*P!98(xw0yGGy*5AZ^Yat# zhYugjH4{2IgiAH=rd7mVVjuygByU7TgL@-TYinya@FYI>8}R;S8vu`}TMY;zFi->DmJ`|hI| zxPKRmRjSSUqNHSG7zxl~@_;FnDP3`(=S*1whnzQHzRKwOXt^2OuMG{{kln-g6|z!p zW*);Er0Cb$(@&LxjTakeY!KmYSl_Nvx|a+6<2nJS+`)32h7j8tPQS?kiuq?O7g1x| z>jObM#XwJw>+Y7y&7o%UGTxB2JuoBEM#Hu=;shUluQwZH-22Z_Cf<0b!K??bql`oh z_Q(lJv@~$8R*GgV4#x+n(_A!ep#twUYZGOV0-N2S+k;wSYm=DwwQ&ZW<)x#28fbKM zZ@R9ECUi2zd{OzF@>+fVTh;@%lF{3t&b7LT65^i*ZoF~2mIi~+fcJ&JBO)T;5RkTZ z)`rK%2(7fn>;)xOj(@g?*?h{Aev{&}|J&-|a{mm~X~v$Xk6m2~9iEyD2Pt`%KfYd9 z5u>j}lhMb=&eO9&GPfqxN$lxnv(g}v^)VdB9@+-mOb}bmeTSSvtUSZZnKsJS)BSmX zi(7cqxfvM=X?WY6gVWsB))qX&*i@qS++==`l#%VY{8z7D@~OAJWd{IoP0cMVXlZHL z3|pw>2g%Ag6n*o5tp?rEHHIi|SIMB<==snK>yvQk?|Q#8F%`Uutb^hbdlOhBB;?tC(%CYc6$-_^PbG;%~|juAJsUA!UGuy`TpJcBd4BIoy~-x zj;tU@O`*OIo%4)8gpSYlgC@HOUuwwnD~+hRjD|F2CHFRE2#MYQ8GIx~q7*00DTFerNYu@>7!Nb2;18H zp)eov^fqaq@1c0Eto>4Vx@&B``KWt))M-%)4R9PU8|pNfe#pFlb{e?RX5)cy>_I?S zliD|BC2U!_GToWE%BbD_~er?wA;hL5iqEWKC9P$72qFJ>gM93yqNx3~A#Cu?9C1UE4kC#NHChAkar zw^858)wRa(X-}C?{z1qS9q!ki`@;?KE{k3x6VzweW+XY}-10j{OD{{kiN1FQx8t71 zL~JaB!0Bv-5BB%ZYe@G=P`|h+3@Smd)$*eP)wS|%NKhs`6@x%51l(&lpTVL(K6CLjz{h`d|1lY;NdSSlXkHyQs7+Igr zf6(vJzM05|n%K0|9dGjRk@r|v`yD2VkPcUA7zYMBz6v^=Iqz?;tdzwBOTqiZT$MP5 z$rVb9Cc{>hcG$h)udgFSA5LA6{a{8NEh*;@LQd~Ck(5G?pw~Oyw=1VjQwZAo7Hfvw zsTWzf*wO^g+T~Gals8k8EIZYc*|1mOHb$r0j^*an6LM0b@tL=CF z(|#}Yn*P=#ApaWwqaYwfun&+A z3OMo>szJyh$Hs)_P%`i^5>7~l)zkr-36;rTb4-1 zw~P#?7(Npd6E{pVXw~x3RmI;7ooZt*esVWAH#Idi^A!FMHVhFQO^c3;i;IzwksGf3 z@#Pg24FVNp1%x%B074{Uk2rKSbnE0q%y;k0c$QGJJt;9c-Yfq?Lmyq9%qAVc0LK=Y0eVbK#o$T z>f9PmAJYqpTAebG9nb-QDSQa&U24J*?yb|XRx|5_^6_*!nh2Qx#y%P#VZFvp)NwvE zkg!`B6-Z%3*yEZVz+3V4O{t+1aw#>x!#bJ%39>eO}<)>B{uF_$ZUOC$A1>nu%<&ljGyX4nL1Vbym?kh1cIe)P_kR$Sopb zq&V|}hvUxv6>MD)HGE`v*!yTHlEZnX>7dR$X09GN&TE=gQA&+|^*etui#2fEqRlQaNumiW(dj zL9ziJNO*y!DlOd)!bC%+OLDA$)k?!o`FU^e2KY9K^eQq^QtTKSnwkakha)2+N^cU&>Aid=MbJ!W zf2dXRl`bp#hfHEvR{!d9x8H5fb`g14>|OBAmL}4I>xr9?@w%(H`g{HtO&bCDgTGGe zJfO`(HMMNBRz$lzPNx=y`G?0-%7akXX!c^~HzQmR?PMYxp#O3?A35~#yb8&FuKo{g zyN@h1aD@TLd5wk|+Jo*@Ir!2gsSe0x>D5F5Y^(PMD8J~X8R%^)yTh~}W;FHbUVQq> z0sJY_m}NP!Q1zyieQ&!9^3Nvr-qScZ)E8o9@{V@i-~HY#FoH?f{v_9D~$XxH_< zS@_yA$4zH@e0hLVrx0On#q9&L@N@ihn+yA_fD#$!UT0SLYQUcMKPLM0`WH*A10{i8 za%bS}`T9HAcaoCu@bCcKK3r256NY^wqoCkYlIn;;{?S~aLrzF&)DneRPnftG z21@9Q*qRa?1~fGii(;so@a;m}B}Sag=JE0V{xKY|zrQanO($QNQLOkTWh5xj3+$%X zj5=-6 z9|Uob$`?H^ProW1@>yD2p@gYAl`M5xm1k$OvQL_n&%#qja46*iA!|Eh=2s^=LRrd? zLGSjgLHM`=VK#P*{3%oyl^IdCWBSLjf*=GBP&8xrIMtH>1Bf3_<@^~`$oui>4h;0<#O#9kp@VSstQXVgXxk<;y%H{y(uLEyY0;T+j1JC@a z{2t`=jW%2HT=n!8Z#`_zFYfPe_ZedF#DN$h#1Dg^>|luoM?C&XlM%4r!{ZCud|h)C+(Vg0uJd zk8os{l@>F0lH+mHt6$=`!n{SBd>#o|zCNP`MyO`;(_{6-=Wq=aZ66sCph!|I&sPI% zBTZacE5GO1#0)n?Jon4i8`BG$(B8YAd{qiI%rwTB^z}W#K^4z(L3K}fIkkASu^#SW z^7YceT&NyqOG%i*?zR(J!UJ4Ic>(s@8dc4mMgS95kWrhJG>_3VgIGmbJr@iGjZK7!kGU`IP2Za z&4vcyIFjzID}8xVl+L!D_Z` zrvZ?#W1}n{&Ber^C0oJ4siIhn%Gs68!Kh6maGYuvFp%=80pJDosj!Kvs;ciH(Mw|b z#G#*Z(HOLqao-tCft(z0oeElJhS0e&2~1;af0#}l!pJA!BpV{s7zoUJq|3bDrL->T z8fyOWTu`mV!t?FQt5~t;)c^>T<|C{M7{tWHTwGkzi(q%>?~t#W?Wa24MPbSF5dx|x zW{T~lE3?j&!NG7!8NAY;20B#r^ro7eGC-o7QplT`mbTBn(F`LYC*kw?0q1T8U$;q} z|3u{Xd;tJYN$TDVKRcVCSW=G1e(KdoUNx_au0Jlx$xgU&_M@VQ^y2oN)@0jw{&JuI zoAf7&#o6wsF1X=~TE4EpS*NoYXaH|P7-L1>R$4U-{Wl8c%)>Lu3-{02Fqq_#&PX%W zS{)>1PanhIX@?5|o>cVN=eYtNxl8zHBaBdJHLHn@y;dg$EyP+`EswLahf& zLq@W_i62F4j2P&N89=%iqy{6N8&=$D5{CqRjvsC|6Zo8#G!40bU383D<6E2+78HQJ zQUAn5wN|=}tbZ*7D3z#%a)g@lW=PA%F*Fl!`W?|Si zzCHx_FiTF-!3*AuMf0ZC(jjKEwq!Ihl0E1hie;`k0l&G&&NEvys~Z}G>FEcZn@8x>#XsdSRB9g{9gWGo z2B9>0{I_p-8DnpfbwW9PX#-SDWTo@?P;`y{+HJNvmYn}S z4aR7ILz3$$Kk4NN#G23PHzB;$*%@=s~)B&EkAD?M5_mtSrDa9#60 zf!h3cDG_@^q@AM$rOIco{w}sV%pZfY3`sZ%UD$5ztUWOzJDJk`6~*c03}e#puU~S} zQg6^0CBUMLz|MpF0O)AFyu5RV>`LL{QBa6j4SzQd@;~$xl+qv{JY)8`*clTE2(|#} z?`A?`Vls?@pFbn2vfB4N1tZ|tuTC}j94I#rH=QPROvO z0g)U7)TSTJ!rfH-h%&E%hG-4c#Mv*oT%6A|1adB}&!_4e#Dy3;*B9KZ~)4K&}1)skQX1p1G zql=EbQGH+2{UdE!;Slay+sipj(~E)v1G&jCB~dK?@E^}r8ra#{;o{=jH%5^-h*DEi zi;99Rnt~PKHbEo^zXZMiE-)}>=Kjp=g)d?#R6pL_q)i&>K_QSv)m1IkJU%|g=xgZ> z2KRNG3~l02rgAaVSw%siJt>8lh)70_-~}~Gm`pw@8rrv!ZSM>t&*Gu2Z#jQ}xMF%q z-BGkS9CvdWz+kw z@$|VtS}q1mpT=H2-JG~yFPbP}~s7+?PBoJPX@W3@N72^>XsON4hTgd|YH z03)0TknBH#hWt5buBleT@L4t zb|*|c1wocankK7x;tS2Yfq07LLXBOJKLW`f=RcuvqN}SYh!HQ);CjOpaNvOfcvD*f zqE+UiR`sf!9P3o>ynp(Awvm z^E*r99cYD6V=)o4Zt=198k}vW#gSyNwT@8|HWzuU=+^a{mgf5@h23Iq;e$l;`lP$h zbuFNlE~t+w2#I;f{6vh>V0e@|0_UJ(@lseP&ix<%wT4`jsd&rG`YrRBM$6&8gN((3O>0dst=1N@u$dm4Igps8294F^P#$ z(X?q4E9d6sZsbWteCao@T|Q!kQ~Xy)yJL~w;hAX+BO`o#^hF0Gi=Ee=gJs7$iCDX5fBeV=;HA|v6A3egrKdx2^4I|twLhDig;T!YzZ1YwfBXuv z{(O9V5w<1xNoqKV^CWRH76(b?(Wp*+eSLQ6MDNTHk&zQ#^09K1I%#PoMMcT#>ZWE_ z#~0bTnTAo5#0`J~Ah;)7$)h-~W^X}vjP*i|8AKmbT8&$2S-;Vd92b|I#PfXXeg0I* zto?GM1ASF3fsjSL9v2ta#l=NG4s}BMMxDvM<-=f`N^mO9-K5$=WZASrR|n5c+*h+k z>4m>mi97te%ptt;OFbh2&;mZ;`y#h1>}j(1l)BF+j93fa9=p3#Rs7%8hB%krbQX1q z)|;e0B(xA_>8&Y2&`+vvj1rg}hjOcTf`Tey@lz**t2=~vBoLAvx~`ZLLE#72iA*bZzo!HIt8a?B`RG98Zau#7C{3=;OTo39^;J#Y^M3Q?{Z?7ta{uev z6URGl^NW^tEY^LRi7K0A(Q}cB_}eXisORMQ6_wLtN!GzNSwTDn85wiy7XGo+lI4|O zAG+a@(yzc{XjNy*3S!Q3moS&H*7IQI#q^D_hdMuSvMxrUCpekX?$4?JgLQ^y5Z z@6%6sW14aKumqdUr893rh_j*mw%58LchwFLCnW#eFb@{0*j{u$Q+NG}r}u}Q=tPfS zVtfS4O51G?qJ*4+0+=xktgVao%J6h(+T>fwWl`Xez6@I_$JYz~g%1sdL$K}a7>FhP zry9RNC+c{*JKP*lvISZGsHmt2GjZ`x$UovaJ_mA(f}r$W^wg3=x^j20$nC;cuyU0^ zO+Ru>a`(F#+PMuye*fOvD+#HDx**B1CL$ugxVgER5w1B8w6iN+bR;Uw=U-T|3g=m$ z2SW}N7|$QC*GxM7XPukd-9Le{H$9!#-gL1F*f52Mg}ufrZP`+p(FYmPrB;i<$}r&) zOtq5lLm*mEe3Li{vK^o(0G50)*y!}d?!@z-aO@qBma`fraEnT%MqwV=+1{q3r(Xjr zuG*OA!@Uhxc|GfH>RGn(DOfZA^HWjV;deQ)g}{ zqb6O#q+B6KJC!5Fxv=abrgjUuByQKAb&o@XiTxqS-3O%-m=s$lO-^0&Urw;7RFp+e zL1pt-@jQjRD5T@0Y0h6ae5M{@W!@Gs%oqE6sR+-jI(@YU z09uk0asq%sgU#w>vfx`u6q;6(l@jcP?-xDWEJ`Q=Pk2BNY(BqmIQL!==y;k*NnDCz zz>$Q97Cve#Kce zF-q7Sl)gorJjpd|wqd`UTj#^<`-($15+_eM-(UE;@3t&`EeW>eNg*jG>Z;Osb9c!V zj6%~ks7%|UE%0%Cq2X?JHEtG#M$fgF^st^{@)SS?QIy!vchYYNtiosQLDGLiU7X`p zc5`!cb+wDWKG~pKRpOYnhr7Ew$a6O6S9W)YC>dfJ*00G`AX>!2oe7VRk4^jqrNF>P*vlmD&U-s+`{E)F{{ z8D{sfJwad}BN6nG*)15ajvT^&FJ zK#@WrrOL3)vwv_<2Q&uux$%=L7i)|LF*8npY^&Gd+&=7%=H18Fbaeg!0n-hL;$JxN zfM}B4&W?^1^IA}HjtUp?IJjJb9gagp#so8g&{|b(WB0AS+<)qv%dC2(<}^lcC`j;v z^0KQd`_2ou4DvxYqR&w4`oiMk6KFf1fWV@4{cKWu0_Osx{wV)CP?$NPR_WfQQ z$Sl6g9=}~TBxIB8{n)`fW-(Uul8?ee6yy1!lGXTH>oJ+jCGI&H^Wsl!zPv4LrhR(Z z{-#$Xd-U-*Q?2Urj27D1iSu!z_FDyq!;ns`xtJFw(cmo=ZHjb*3)Wu6*A$MMVY|@PzEjG@m@%TAG)u44I{SxA5^n6ffsp z?QC~nV_K5A#~bpZ;4TV{F8~iwop&3BW)s=NBCchzF6zNIF%&@hwaYQm_~B>d%b@F5 zK)%Ba3ZZ3+@zTwJc$M_iN8N-R>cv8MWI&FmEAD~dJFNG?`DoV!4k(?=C}r+!*sp}x zU44FgVd0P=$`SMjRa!hXyP)j#^QlcfJ@<$xH{Ffs@!Ki}KNnG;#9#3w*We~|C^FT*C=&*@=xi9Us=Cir*jYCDM zS>&nVvI_27H7y8=O}-ga^^jQC-~Noouhegh0nsXB5=eDV>uGCSH|qD}8n%& z3>5_A_D2G1*}UAo}QADVTwgPB-7lWXs%j118V9EwHC70)*r!y zFzB{BQE1riJ!VO?d&n*cqHj>ic4-y>E8k1}X~q0A6pVAw^Fbh8%lw(0KWqHkw{IXt zyRos++uQq@m<=Kp($&%N=CE?4@QR_FMd6?b;rIKs>cgB`lSj{C`T#URACbBP{dVl& zGy;32TeE#a;mcOs<>3V%wc;oCLf^CN?RQ>++keAmm^7{6um ztv!P;pzH5C4I19tE_XRhC|7opcvvF@aV6VPnZTUMv!1rUCwLQkrr(?%zCF=PR*!5x zK>Zd_Y%GBcXwzD}A5*2Q8ot}YY*c&tGcRgLCbiNei&!JgfT~jz!MJjbc9@q8!7pOiD zhNCvS*nW4RgrRo#>sJYFvuoe9PLB!%ctVIM7ksAY=$>*flR1lAnCxe9X`G(p%39t< zjliueVFyXWhXeNV9xboA)wfsYjaMCzP%=+Prd+77 z>mhfpa@WlXCI;M(<V(aNk|!FRf#Lu{fOiTZ5q*=2{Zd0I$nd<7G&3^;UH97B$^GVUSy@>b z8ImUzt#_1E8ryr!(89;;JGD|n$_qmK!FiWR1}Qskvc_SkDZ61eM9t9fV0|6*pX$wl z5`y9z{0VnaV`JqxR#PksN_2Q>1i-a|+FqIx9cU>lJD4{KsVph6{ap|}pkSb->9=-Gpdlv1GpJ}uYE%g2CmMIs}w_I(d>4uf_3!_L?HqCn~PyL=%v3TSd|grOst z0ui}&lHE4f)${7rpg9c0tIf7k6>ggY+)9Tq|8l5#{URq<9q1F#F*bH?)GseD?@vm5 zhMW+(J8)fy!1gU(>TFpRL#k@LJb#P2xsA_Ti)JkrY7{#s%JL>BK|0$BW?)NZhV2VU zSN2dk{Yb#m39q0VGBGkbc5$-&LnTbrbsjG6I+=Hp{9}5gc>D@}$~l{HNbm|L@W+Yw z1FLXkB-U4Znr?PDRY*j9CA#THjSKf08 z?M0c-8>N0GO^>%@{Dr>m18mt@D*oGvuKRII@=OVV57O&3+wG7~u9^1_x7S@qH5-LH z&9rNB@UqMX0{QQ=ih1T%dL%-T9ECX4uX<=6X~G{U^KqYK*GIfX#BLrnfm8B2_vsOs zHg4NwqsoRdq^zUXb$HieqGM6<3P;RM$?(LM-yQ0Dyb#&fZ4IaD_RhdB(%<_cfT{EK zcJl=>(==R9z0tfY>7*!h&1nA7=!br$x8rnEe!!eHJg`va=wqZ=G4GS*1Exn@qUyUxTW<{=%`_NYf>o=1 z-zAttrBu~nh17<~IW~V;a1IZsO1;~05kSDV4=fE8uyLxhiz!k=z`k%aJBM`absYss z-~b$-!lKyFfw1+z^K5Lxd;HfI(JZqBu9P1b9p3X`2XohG5oSgu96TA5{qXg3k(eo2 z@GrkiZ9h=cZ_YrlHKsrVFKe1?~toZ7_;VfWk&@vAFiV7|74Wz z`>l3b%P_u`CtVi%dbcMpFfW{X8?+Yp(dph-MEZ)JB;vMHhW5cl-G^{}XWQcVEb@x1 z?qP;4h%GjntQG3%cieCyOA$nK{==B$z3brBs%z)Qz)q4_A-wo#jue}GF3Ey143=CM zR6ck51}M{dwq^u+W{HzUFSate4GDE5KN<9q4NLaxq@)7kxn9+aqHo;h=T2glCbHlF z@z~hXuWHvPB|5Y&p_~i~Y~JD(4p@;a{57yTonp$`U{1vG;SGD>G!{i`-hb{f{SJ;G zbX}VeIk+mrz)7sNy*T@eJd^Q^5e4m6Z_q~(l8w9z#S>A>gESxsr~S`k&2+Po;~rjYZ4qD;6YDN0Km^1~ z+zg@*Ut=P@(|d2{mGpI2z_oG>pWQSE_@MeS8v!Q)oYR}S2id^k5e0{L{Bu7|2>^6m z01Yk@_#EA0I7jFUvC?ZQDd6W}fo=4E_Ve@WkEFAr+qSOPbDV+U&NMFMKLZ-RS04kO zZHnUmPHP*u*8Uo|kiDDNFkWF&BH`aJOhX77zKDf?k(pJ=MYhx~?XYt>3>pu}cgnbe z4Ls80<1WmA(E04OfJFvVg@M&gLq|#7&B0!IZz?A14=e($d?RzJ9-$1i!FF=yzKi2V z`$Vyob|W^zuv;t9hF~|~hqke%u?vt0o_a=Sfb-JYX&AJSK zA|dn%@^-K1&RxU(uSsi1V~s*1RYqL?hyn7!vU;vNRRNp%nZenC50(mNtskfQ>2oyh zf3v`YHe4HH+h)0b1p8lN1|^3$g=ImS<)o$vFn$-O`>jNi3kuy5WoQU0Puy8ve_~pR z%^bO~zv=Uj$M!Bt@&)rNm24RHxxxLib8+o>)9B!xk zDhH2%@RG-#fSkNydS5r0g^39)8+d)`pLM(o)%QcEjKfzTxq0y>;s@+zdutOo{$Za$gzGspEg@EGc&igw({~`rF_I)CVcd&D(a74 z;YDdNU$juu%+)8{BKv-0J;uOZwcAN?5Sr(3X53FjLB2RL;BE58d(vg^ zH`PaMn7_@=P2Vb6x3$u%5_1tLjDS~{S$g@r3MBH=$7#15PyLmr6*dr$=d;6Fp4z3t zxa>^6vrXx0tcNmv@#C)|Z@R?_qcK7eUVr^w0pakjO|s+Os%*|+n29q9Iv(yIwU}d1 zKgEed6sI)m7CcN#jJQj+$B#PRIYUg0-Dn-Kx$o>r^3%%Ojt8a*bx zkVw?3DP?}|C#9wAc5&OYsI>D@iJZh)yBh}OKzIyQq*lG~ zMb2xzAJrrAOO(Mo&Bs8kCLJAoEJ%4r`S#E$1#VztVNrrka&XoKwAigcp?(m)G{ueN z*J>D_gi=6F2HfpZ>Rc*gZkeFwLxSPmZZv~O^cl40S`EfifTnk^3)<&yq)<=-q@h{Q z@>vBLJ0Yd{*DsKOQ59vfSa}VQuE;{Xwdb(V-#ydeV8@ zwr4-el5KDr8Jy|{Ou^Y_mr=;0&h?=CPTW}r^0Og5EB}Yn=O57N`nEDOV5j?f74)k| zOFa3w8Tv65%_0k6c9Wis&pNnpWjDn72_b};h=yz?&bb3XuH(q3fxc#K1YeaKmLTah zV7?WQLm5hS15 zzh{=+|GWUGCIphjN=dR&4#3}(wNKHH?8M)+Qy?Ve?a!ENX`SwlQSUS44=AwG+L*SN zpG3I<{;H7Ga#)4sJ%wcH>@t1An2IJXJ4M<|$>A^>aEgK@(R|JVAuym*h5BexlI)q` z3w>;J;v*;Da?=?+z&!nB>yigf{r84MMWr9l?t7x5qB<=#M90K{jTt5ehU4#o_kn?d z=H}+0sFC>X8)%XO=g$;4NNWvQQ~r$@fDSBLcJ><3fCEx7O5m^pI7Xwct{xcJK|=8~ zk%SD|ve)XYMhX>D_~Q{?oBn|dH6y|H!R`*FrlO*fVa&$~=OF4d12;(b+ES~UMm*-_>PN`S6?DYxt0BY<$ zG1Gvm&THm{r~bVi%6Nrxu{%M%yPrB#Fjer(pN!QZwD@GUn~J9r03;z4{Dfy7*i`qP zfy=;K0IAgEVJ{LHdpug>=~?ED)8*Dud2v@ru8RlNTL3tkEg0ldP|2*G0%xs1`?+0j zk9o*6W2(agCA4iK&CJ_-9a3%yC2i9iPM<&Wcpj2mXAKf z(qD%x1wD2~K|>m7v44$pc#n^y%9IGo`B508+<`ZzJ1psCv-Uj%GN!c)G4k^6_4R%b zY*e(%DL-&f73{E~-A7PxTm$qz8`W|@iKsC=xl{6-fYS-Pk{t&B=RYd&QZkN#_WY@M z3L$XSa3tR(g4PKY6_qr_H^**xeV3pInVYQNm*oHB>zjh}3i~)u*sw|CG`4NqwynlC z+o+A5#Gv7_hKO$%7jO zdPaIWuExS&0WqAP%q6+G#(g1(AW2BYj)^OGhAQ!a=Z0bV#GkSD#AJ)6Ro4xDkiC&R z<9vTSjf#q@prD|VPD#}IUzEhwLvJ$v>-NpM7$RMy#0ZAUW-1mPi5?kf4iGot3)^vJ zOn}5M7N(}n3+vOY z%nSp+Al9+2;E3-eA$j!3j}cvKn~%$^JrJ~Z84^eSLXM*1`|9{zxo^2B}d{s+#y=@G2nzS ztX$5;3z%{+E>f#zyc@p{>fR$^eAEr8H(%@=1wtd>ah*R6e1g*gkZBjyyY3&WjRHdz zbX>B3zpa+PHX){favN}KF)r5o9|Bf6x&vJj|0(8>VnM$7+>Y~sWwO5G_bu)&dRO>` zic5xTaw7z+!0ttMQqaBqabr%+I!FStll#Oe>S_8>GN|^AfNuEw`lyiZq${PjT&uYv z#`zx+ckr>)c2Z5*+6ead!R7*7hGbo`6f673_uz^pN;mg#W0NLh_fJdwnoFQug|MG4 zBpEWat2~0Cn&11;8zNQiX2oiCn5{PU3@ zc?eO^v3MV~U>A~r$H4DC6caOSs_kJNSsk8vCAB0+|DjZpoB>)o=L+E#Jb+5Jv&D92 zK!I1OCFX?FI?W=y=~Lw(S(v&#({f$8SZ~Q4e>5|xAjct-`yQ!8gFSl{1~xhrK~>{5 z!1WwkGcGqGx zo9 z4xRg+r1w4GzV%P~*WP@~TovjXwP-(u8bAT!K8}t_27~fCH9lI}Th!_=-e|`+>O$Dr za60X@ELPIiUuK?9TMpg#dKaR;@c0T#Ut8I~LutL1?vL18+CJk9t%vW%E8;s}#M^Ba zPV=*=&_Kjs>{(6Tbh!H!n(%P6jqwl#J0bV4dsfX)O66_m^-R@HkNCclW-=u225%rS zP)^X$kL=PMQ_ljxA@x^~P2F?;jBfa#&4Ogrw)OD9+o^N;;NhsHAq-7f`*qMlK{mAF zph}mIDaGyJw&O&{2SvBhpw;bdjd@n$W7EXO#ip|LJ-^kIP-cm>T9>(l*T#6*ya{nt0ElF z>gB?23NF?#n~FM$KrC?5=E`9VF4j}(j%4TJ5CRF)=*R;P1&(zruIp&jLfCLmKWn{j z+|yf!l+(qK^o4YNnR%n2n_RwlCJpUg%xqm{^- z&lN`AZMR6X>^<-Cwvr?93cd&*YIIKo9cqZ4(VB%YmbI6b5Ymj&SYSC*0)Xkfi7#^v z!V=`wT^v=gG!bCx8Qorl8=5J?-E?X@9L!(#FgreY&c!Yq4V_<1Y0$kzYFFC8 zHP==QoUVgx%jr_R%;D@@97 zV?MvhJ2BZGw6MC|L{bKF8LE_%^s(RB(Mj8VN@@#*=SPBa-`eYvUqYavp*La=KjOaWse9>Em#?OMcH7P1!8PN`hI+6jq=?{ZoZ=zWkq(-2a>J35F2*j*2mHQI(QBV5>qSQIZ+x_#U4v z3;V~jrw#MPr*TH%R-ch)E*e>`TcSvc-1JGc&`CeXiqciqcRhrOgDwd=%WXyeUGkLDT<>vbp6F+y? z;xbG6&c8A#u&FlKR*X?pD|Jw7RK!D$Y%+*Q^K!W2h7z(`9j;)~DxO zw0@JLP=ixjHqlbJxWgBL>~{U#T9dY)Y>gp%(~}pWPKV_eDW6x|m{wDn!O}uo;}s=M zeH{$X@4n66QOf59dD$1*fI5nqL?z+kzDnyLNaK9zxtTI!40&1%Q-gU2E7w+ zH=|nHC8pB0Rkv8gS9Ns<8Q*A8Jgl>({jGby>b1`36Fgr0YzzA%=bS%VWtcQ<^e5ni-3A5*rW;P^ zBg^z?Xa!q#T+0JMd-!|$Wv?pP0>z8F=f$bc!F1z`U z_BXs(D=y=0*$s3lM@6k^aM2BlH?&dYiOrrH@&ZP9HO6?QSn3Z{{g8 zVA&QNIKR}I#%10t)-IB7X?1OwZJ&7Ey)gtiC`blZR=+w?$t@R`d?yajoSaz^#UtPp zgdsv`n#z*RIom(6{RoRwo@>4Eo5G965?Z_Gqg2AA>&BFBx{X5aNimmsS`0-55)Vf0gz@KXoeA2+T88Gog_b!-3x1DE8+%`WB zb;h||4eyC%x(r+r2_&2;d%+L8aCe?B04F%FFpN?2zlgH83@kYt7oe87u0LDtq(!Ed zmyY?9sxAT=B{N`1$=J1~Lktt}-0E4ze!*t?Tdg6@%uM@ZtOBk{+Ich}x2W%p+lxv~ zO9AQ;$_HD`qJJPc*VWoBi>rR+W6CNUtGSZX(@xHvu00R*tS&Ua3S!V5=0l-)gI;Eqjj{A3+D< z*LnCE+8a90hHo&F$z~oApceF1v{t9tKBFZhpx+uc5^Yq!d{Bg~3oH%nNJfCDFw(u- z=9(cCvdEPrf>XAo8^n(nnvthp55DdD6PX)gtGx$&EnKg2 zeX#Y7`5!4~9FhiQ2f?&ljB^!jkp^uRIdo{`=5UffvXOy&TnjF7m>h%Lni^QOdGo3C zn!J~$n%M(IK=i4^h#^y-$8m4rg*g506BzJEz+h>6_3e*G9RY4~`nvHJzY5vCJ4D1T z%}MlisMmRVk^CpZ;3I|4HtXb?=X<4U(^4U{up91#4U_y`-&ca&_a~QLRy?f_N{{OL zr7+nyIdmQE$`C(#u3Or&npS4?Dz1eCNzcL_sB(t3X!JCPo0cwsoo~5Y+4(x zkVU@YO>zgl^Cyr8M(G=*AGYRI4ex-(uj|pO^ohEOrdh8#0MhySi>${`}xuV zf>Mc4ND6kFeNF@?8}blEN)n)DO<>0)`+V^>G^&=j!qFU})Yh}Js)ZTa`dnbt9t>!b zLxecl*>oN|{poug6;}T3A2M6~F*z+Sb{8uO*v`R@B7Z((6UB5BHrrk$Q#VCRc28dIMUrquKXV#{WwN?k@&|yk{s0ak+ zy)*5tXHf4i#O-zZ5uLZ@=aEN((^;HvC{`{Q_6cj_?1jk@ZS1U6eYeP8;j< z@0=2Z-rqa0-;GdGQ-x72xvZ_~KEEbdKQxFlm=|R#_+ZnH&1P1sw#ylq3qmGO}K0hU)+s2RkozCj#jDe9?O5s(Y|* z-IT%Ewx5NPO^ws&r03>!MT{g7X|OI3Sjw~QLpg7AUaDvEd=-$hXt#UbjpvMu4h!rI zYh3J&YaX(AU+QB|HLN0R-Yr@D_<|_djm$cud=t2nFU0l`~#QsexzgLd~RSn>DKW0nLY)6p-jNK zjmqH{ch^6ie$P4DO+EC`aB=B^S$8)N?F?~jR(-n=Ck&Q|Y5e7u`!hs=^nY6Imv`se zN^-a%08=vTi;G9w`_A_qtTx_P*rGVQF0#D51N*k=WeY{M`hgFZyDuiaN(L5cM*Wpi zJm*F3c*spRlIPtb8ZXx7dRYQotxn~}F?)O)$MJt_4`viaEc;`RtRGhJAAWM;EZfZv zz>4qLN8`bGrBFI%7D#zRIyp*-b6YZLMvu>&d`l+yO=YRiwS^#L!URR&HmUE&qUAh? zpH}rSnm>@@BW7au6#(?a0tZKFk^_mM072y#GvMMxB zqnwu3WPVOy!30X=Uj@f~C}!O?8Yw3qWB106rz5fh7OaYb`3p`5YIlom8Zd&F9bMkO z@KfU|9nG3iF=-vU4G&kr)rSyFDUXeJo~x<5zQoYNOM7LOvM)*KsHuOgXWj}9)=OK8 zI8DMZ39TLYa>O72Td)s@?s_wxI<6vo4om+3V4ul+7k}+Fho`Q z%7OEh?xPj)r=iJo|p?iFv_^|#;l+{=*ma?t*H)VRN za3mDOwWEj0}$I(yRP%Y8{AXVhxLEBLRk3rQe(agcBFz`Ts#X$j@(E zAVg1{01!kuC(sk7Zcg_Foz|*X4Chyz&fJU@Aq;0jP?Ae*?u#3N7VMr+gzs>BYM>j0(5r6W7 z7&bwQkP=Po#nXb}B7IJu>?QLdNbSqBsG?+MgfKE>Uvn0Y=be*{71o3SZ9EQ3L5d5NOy#%w}rF*au#yGo9-T3QP? zqYA30n$DF0ox>3*RU%X#qDc&{OwU(QW1L#nPp5LXctKSz21~n}MRC#a{qp)Nfv~h0 zt>)Ect;Q9muTwZ|p`XQBp&WIRZwYI*AVi`#qiuxvMV;MZocc5E)^^gGRbK48J}OY` zBCVz!DM|1TF@kxEawvlnQUn6BYdbf*b89Rig_Iht3y=WA&d2?Np(-B;9|>%5fD)(J z@2up{Bt2zvAS(xbCmIkinEPd_7?FkG5s%C5ZRUw58WoC^%0lz=it9(#?=j3Q{wI8g z9pQ0y642C7jl4e9ad?ss!vgxTi5%BDS;&!2_KK76lc*A6Y2%~FwI1}%WQ5}0W(4Fl zT@QbYpCQhCc&5^W#Svg$HuvX7YH#;Q-GF0#exsmG-!!Ppu3wfcv*3@G!x*>fAx_9h zx;RX8^|6<3iXG=v;|dqpT&vlUPyLyY?Bn(Ly}CxdXaveL#S@%M?*FWRCqhP=4!z_n zc8MlYMx>NuUZ3;E){aN}bl@i1vO0XOw)etyG8+vhJ%8kV8>I8Y6vawqYB(d@_bO55 zff|fv_|(!)D?wY5hg06p*`B^9H1arf%-bD?TQth>FPjsE;$o?5>R6$NJ2^UC*dGz-->3dIIR@=CXs zw@>V#%fEVE$$^457Pyb!--8!csTsSK>+e<`FdwY6qtm0I0-4w_fb1wy;GD)d!Huej z+UmkcM4TF-5~%1sZcCgE$uzabvUJ3X7|FpcPF+tP|8=E*=m%RYyR$K>QLnDSie*-B z)pKd>@>Q&1J;HU|W^Pfo#ocA~N4zj~VnW;qU5FR`S@|28Rd%tfHm`usc<)xSscPjq zj6H)6hSv4ByZ)0vU!+^c8_k7T?~Wm4FbBLsyVF7`BF`#nkVCw-bf{3yB;;BuM2TRs zVZ4(=lsLF>F+@LUa$c#Ba)oNTDoKa607alPotCDxiMFjJx?-4Pk*(f~O=$_w_Z=~? zqGYK*hH`6|OP*XlYx~W-U{-Ben)Zjb=lAc5F6?Isza32MFchh*GRAe!4rTH58rG+a zE>O|n);$t}3!4vDYESq18Wz-NgHvtNawVP&%iUcH0!{psYbe#?Z( zUFJCXKzj13_EWM#tU|`YNy|!u2hy7C?zCHPC1#Q^yB^xK7R*#BY^{dV#%CEC*4o;l zq4{ZVGa!f~#@_#ESfBmLPq@Ob9GfvPvCVtNEch7ODlJa9^Z=^u`a%K%0N%cTko)Zm ztFfuD)bWv)cg9D`Nq+HRyXnvl8Gu5insz0D<>+{jx3Stv!&%9L!%soSpEXs@IF)Ti zaO6jqU7Zu;?;xV(Xe>>oNy(J%roZu&RJ7b!hmYUY1@gQZ@VMWteR+X}%UN18G1Iu~ zqFuOlM0!WsOTTYDt~$i-LGpKgX79AUG8KbSlNgZ#xA!FpnzDy&0wAY5cX;}vQaQXt zFVq)SWV2@>Tc~2~H~Cwy8AZSa%?&a@a^k`I6p{=b?62CEKgu7S4@EvKv^Lv@N#AM^ zWelFjmdhH=)UD4j?lBbXa65|+xukKBwl;%H=go$<=>6@V4vcVrAY1VoEuoC6^UP$= z&i5XOsQTMK`=T7^a6X#8KDSHyjU}?(Ok$n3aZQ3-Xn-mUg882yWHkEW!G&D(PymSs zl^CJPFM#$&R-^BV!E`~#xG$M~z~LWEh{n$z2ACV~B4u#%_mel`y-(jq^m#MqdH12^Vy#~(l`_g9myajo2gkt=4m^jLvzvmxGfl7Kja^ zyzvdOq9Iwh7>6Rd&7zRv<}V(Y3#c9WTg3T()l*`dNzv)ku&k95aQ$%7%3bjS10b*= zY8y?2meF{L!uD-c))k3goGyCXVgYiaa|x0PBTo(kWnJ}JD-E5lZrDC-4Iea(l{M@c z$r<-94?k-fr4-1q6>-M&G98Ufqs5Sdvu!t*qja$DiMP)iiTJ24dO28?78Wi1Br(AN zk%nI->^KZFAj}~|=Wz0yhN%Ew^VZ)RTG(n@XnHNKL4B>H|Fhten*FgNQx4TLwD`h1 z5(BJf53MD}aO?MF?7Z;7e{<(@83`_x+B)hK4l%5%8sbeh*k3eTh3_adbgWh%Qa z$Vbaa(=w*iIBQYNUsKv*dV-u_|NTZlm)xpdKfEM%pYda9B1vj3)D=ggZ3ha8;UTwc zPN$T+K&xP_(Mn<_#iHfrdd-ek`_BX?ZH1f6Rk3j8$Nj&@fjMMOUyRs|&#u3x{%VLv zAzxeRd@}Z+TFtdSu}KlrK)-5p&2yhkANTy_NF`eI3r|KLl7h6rS>kkqS8{Lt*;2y` zANQtI9d^EEIdIA#h!){e7flg5o8x}_rtf@kud1opRp*J>>16J0r&nF``n99c2hz}O z1;@?5k&Wz15h*R@yA%h#D6O@59F@)SOq_A`+Q*zC-lNahvV)a_mZo88@wo%Mw%zlk zlNP-B^Dp|sc!&b~N{LGfY)ZD@Z5u__--Q9xNuBRHxah;Lq1MUz@hgo+(o|k~_U*K8 zjG1p><%=CX7EK^#%-~ybk9clZf0n!c@D0BGos`3}-_gpQ^QbIA#pX*V>BaB_Necv$ zUWb>F>&XvVBG~KK6`AbE`Ey@O-+SHLHYX$Np`RK2L}Z={ZusNQJcsU25y>6d%@Z48 zwcEOtFG(U4(cVqZF7Nu!$*z*`MP<=gs8P@QZwJ@=>eHPMv!eo=eE&)~F@eqan{ocG zNn~Fs5p87Dv=j->Nv$sD1J=EmPg25`3w_}i!y?$mFVPvzYlFcrm)`IXM}mS;gyif7)|3H^h+} zXGNig@8~d&c;`t`^>}`m>cJycRshDvz@3A|>P^2<+gIm#92ts>bfMR_k2TmKk1FFt zJkv6MH)5TP+|_~nTy`mt?ym_ac+_lm0>i>Cq~@+&ZxI60=;`^z(9=bC;t@kt$= zP;7;DAVh^> zjblbNQE~O+v7UwP&6W`e4@hs7SNktjw)>ANQ+`T@hRInne}^vM_^u&eKs+syuR&}_|YD1 zDJxMhGZjb_vNO3vi5#?6+feg8wIz=7PNhZYV{-9>DaB(&{yTWK`Fw(-Kpw)Wj>}*C zhjfj7CePklU%kU^TCK=@(X5FMJLdi34C3Hk*19<+Qd#t%tiI7y1uUyPm?ul@Q~BA} zlW8)lU%}LJ4TpOrStE#p4s}%v)I^zPFmG!8!CGWMwy}A>s%K7orEMN!%xAGIPh~AB zH!7fdzByuqqs2-s%c*wv?K}2PvOz?#hh3?0@bf{p^347W0Kj~WhXw>khA;LeY+9!5 z4R$YsHMYr?3BV_OVK|#in3`r=KfTkeI$ixC3YwbiIhQX>rIq!MUksej`FWC8Avva(Hs1V%<6qRXt5%*3#0YB zLm>N`z{TlaM*K>d>E=yl^==kJpn_yAN$uRKHkDEUt-_mX;i7E(htupD1d}e0#Uj|7 zc1;R79V^rkuNVs+I~b4~p)lY@=lUxGiR;)cj7uzRztsjD*fpd2C5(t?u2nPgcipc| zyg1Y@vwBQm-?Jh=6-MBodJF-b3Lq7rlm9lS8$R~_yWsp=iD&>NU%6se2NS$t42Dv! zMUkAj&mW~G``$9OUUDouqFZ;P;uA-(faKrW+Ma5X|L6iB+dN-7kD5&hJYXiGoS6#% zw7&ZJeO#4A_tlBL8dmu^(~Bp3jau>};cRKXyhnxtvZspg`gL6O>1;XO2@_5&45H|U z;o6*ic61*m$XNs8Fs(5*$C4oQy~O^@2!xu=Z4ka?6&;}vJ~@I#%h0a;W!g+F*$9Fy5o`}{0+t&$5Vp7fO!aNG~Ixl<3h zeJwVXFUomK*TI6(U;n9MXOx|7oUi}&iyk2f)YT#qUtS}lF$Tq8ta*|+GuS>*vsu9Tt2Vcs9WVm$kfAN6_h9{|S#*zmv9(IbekK zyu(M#x-!gWdd{7u2$64ifpKP=5lgjHd{JA5(kg@R|Kcji>iE4T@jSm5S{WBVi@3Y| zP7;AGsY(^tF9|7atVqNrD+9)$qnWiE3?JFJBXd{m23rfqMrtjB4vJS#n1EffUye?7 z=cTlH{30%Vn31qEZ1s#9YQ~OOs)_e?gZ!7NykiQBnrz7?W<^A!kBZsz6M}6!ufOaU zCb8Xr$t&5gd)=(0&U1~(txU2PjX*5^X4W$yXr_JI#ZZ(4!X)Tmf zLDw1#)kXB?BNz147X6i}gUbB}J}z%yP-U(Fn*gqU#d3F%p6Ij6&nbhD+-3WhLiuRS zc1eMg>DzLN`56qF=y977K)7skzrYP?(f_%=Bz}-Q_qwz5EVp5ul}&)_q^B(+sKSIC z-kUj4A>$_`Ksibi|JLoGfw(^r<8oBYe9+41Z3bUwjYo@>VjqYKXzE$qPUnFqT4zs& zxc{inutoFbelq97$@$LF4mwRfA>To2OKk6mprCFhCt*x|L$I}Fkr{RC?A*{a_<-;9 z9%p4|XBXhW1laA@j~iSpca#(VA4SzH*O~M#GVfqWD1ttLyVaLX4eDhr+rEe6-ZcQ-jXuAq1m znHd!tEAj^FEAYjc?X+!Z6s#8|I`l-e|I;kZc7N+`2&md5SZuvuiR zSbNB1sUNK%!%F}g!P{rts4eC%*QK!S1OF*2qO@HQ>)gz?iwtTdYtnNsM@%rVWi-4` z-ivO-?aI=J2{zkwW!QIk!d7LqSP}SBTdha(iJ>clxDXqG?_uB4jboF_qylE zIhfb)eRhVxvb^uJ)tBfSfk9#Ap18_fmqNwC1#P1L&?jFBJiITUp&*Gj=%x;60h#WB zOZ<_2bf{08sa!XgJ%O`efNJZbn7vC(uxw+>M?NH_wr^!fRXt`W)}oD;A@%}wDTG?t zXk4G36-fIqOzRvoASm-Wn9c}RZAF*xaw=94b_ z>IQIr?0=QtKe#h|{#;fvXX+a(_pX1PF+MWN5AiZCR^0h34;#e_^kurDEFMnTCPIgU zc1+PtEqIDbE}FNs16BZ_q`c15=O_8fFL@ zSZOOMdJ@w8feqGuBWZ#vfDFI`a{}lATu6BMPjYgBU#&;uDo;5znN-DBM;yvfw76`2 z@dDRknM+P(z?D$|7(y6oC}8IEc$O1?oAJ4p^6#Ocoqyf?1}4dcj8+Z}>g6K`c)-WE zV|@(+G?_+lV#)V@!cz6bQt4=N*4qnsJe=2T$|$BgeVE;!8tu=T%Q1LJ9kKNy5V8<5 zimh$)=&bu@GFb<0^&g?aRdx*<{dPIrD0%EYWQzso74^>q<@*|wfnuzD^N%b(X-0bQ zV8pnrZFJ3QeIQixbFa2BoGc!Yj_@tkP`}x=&rTd%n14LC|GDnv;K}5jJ=^EfDmcCJ zs5@U=$&74a6VD2f_(~M?uGb6&fH>!Lt{X*jbKwEjq106I)KuumpA7&ovPpo?k=1Fb zwHe&T{e$!2Z23+quCr;LC|YWJUgjA|r)3RK@HgIGR}Hc^%6keZo;^GL3WnzK;&z^l%UtS-r}PnsR);md^Bcubx;h)%fAjW!v}KIIk)2WUP=8p6D;|P&;4p z8t-pfe-t~?HG7Vq>hpk%AJ+w*7#9CZ9HfXxDrKRO&H&sjqn<4R{{GEkBf$mp`0$3y zQE787tHp49_vfeOJ|@Q$W>`Q?uA{{}R7!@no{|jAH!2f!68%|nG2W%WLEo}dx9b~MxA*YBv^gDf zb(7`Y{x7m)`x%!r0Mv#MS@J$Le;>i{d=U*0K)y%gjW*x5% z`R-o#sKA&7uD0KKfzrEY*dl>(?x)f=Hbg=;enxR(hAkOcMA_6;T7--mhHrzNw%ni~ zj)Y8#$|3|eye9utzrSY*N48YJ^<$f7?!_K`*spL5Ff4Ab4Xm2um1e%=6?g3QMhWNA zh}@;C{y#O1AXZL>_p`u}(KwhPb^{x9K(j`3 z$AUM{5|2U(u)cK$&SOIcINq3TH6oyMqXXRzOGJG}PEty`&uK4N0&BG30CHIWbt^;4 z*EXG_I&h2xEm+tRGGeZ zmoUUpxZuowSGp>rjr^!zOmj$6_u6Z`daYOySOX;q^nEXvs3`S>1q{fSntst34b7^bH)D0HVymHH67EXX zRV9Z8Lcnj*1SLmkKp()=5EH3k4$HB!EC$d5se?^%zq^iYb^@Xq^WVVgTHw_3h9SIfMAj@L-;~oMh=8;7+c1bOkLa!9Er0l#io_z>q%jJ zY;sb5{vSL^!}{thZoM7eTX+HEZ*X-UbUkms!IyLU+>xS=0A&Rd0f_<4Bl{*6lVCGeEej92osOq?-OSUEbOu< zKRL~%@Zmd~PMgp>h*F|#!SLwp_Zx(?t3Xvk!)?D{6${tbSEh_xU5QAmy7e;|JD?q& zFOYqR92BG2T=yPK29sMH_xl|RO?ErpIqRe@{ypC!wB)m6sJt+0($8c%L+-RRG*gPA z#Ka@*s2g_mS(!Ehl+p|HsY00&$gcQn~^^v>7Otz{#lNwyO<^C8~rk}S$^cXV@~9_i%+=Sk_P$a^zt|3h_w*HRXViKdQG~nhIn>r?f)Ky_NLS57XlCO# zlpQTxDF6M?dmD~pGS;MN4a*Gj`!fIl%?SoK8u`#z1pb>+oa2pZ$eXdRxKIC8u!2d! zEqhUs?AS0hIAF3$ggTChRZIIJ{6%%6&Z-^SnWAoTbET7oOsC^4iRTR3)po&tu1suQ z-y$9*2MhQaHZ39sWn7{uJafd##lR*3*UjEA)9w9lIrVKNN%k{PQ30V=HR{2i3Dsgi zIf)CJlrKI9hba_f4u`!t0x!m zJ}l!IF>jbi%Bbo8IkGf~>Y~dzzE5xV+e5~5789NbZ}(esUXJttv7_@WtZ7N8Z4%qd`&J^PJWB=V`eqpas_PY6mmyao z=1%VKk+s@#<23qPtl+Il%Q*`=LuM+?XIK>k4>RtZ*``F#+|Vmp;|Fr~$`la0cI z5{MevcF9f&;$;OE%u>NVwi23*ETQq>;(M{xS?Dck;Nag=(D0KAE|^zYITiSAN-Aew zSOH2;G`BYM5eO@E61}GI=|z0u+S3FQJ{156DCNi-b#aG!=b%z$z}fRoq@v1cDS&Hl~75Fb(vy2I=Ppl1^(FI_ZB#d zHlXpx`C6ofsGhQc)U?=1EQ0}cw^A`+6+g&t)(k%=B_d4w5xSjH-#UC8_?Z#?St0OPq?x5){e>mZZQKAGgEp4wXn6oNPF0GY~xfbbu^}i&^=tih8uIZC{la zNPx1>Z1)(MSaND%JX=n@V`(>^;PYu(%igi6;u@E>u2QK$b3KP|n`r;}vCQ(*l3kMQ z!VcenT&_zmn_aN&_&u8SLQTj|bFO9@$t}Y3j#y1Sfp-3|Tp2@EH#J@5{F|L>LPq># zIIU^}TV>n)B;)jg8jxMb+EUBhlWeG-gsED}q^J-G8}!5K1V7>yxf1~o)VAU z&2A8!auh+~DTf~maZjGbcF(n_sH~2fhlAtURh?aIc_nYCb!VK_66mhiU&?6!LkEhr zabsd~=PY`7ffFM=*Q-=e-nFm68I4I;SZQmkoHIUY-zVUOK~6V-r8}0!+B$7MUf!$< zI?nX>?Rh?YjK^(v?5JhGw;ab}NnuB;D-jP4SpMmieusb-xWg4;uq9hdjuYA1^1+S< z)`Cxcd>!j!+~hkWUG2-?MDh`CYIC_ZY>0r9HI>T5ldnzlW*g;eBNj~tjln;3KCVKn zzJ{S0t-SmO2g0u-rYM96AOThw`D4}vUl$b!S2{UBaYjAC$4|oqFIB1m+8^&_X86%q z3eQt1=hDC7hNvy&*Kp@!5Q3L1Lem-ULUMO}f=c}m_vF_~L9iG!*nV6Lo&2Jd%r7^! zsx9#?az@`&4ZXhq%5meH zXEW4}*{5-K#!_ezg1@So&B7`YR*QFkG!0U(DEj7=f8q{O)TWHemtF2i#ha^#F=NjD zAm7g*IikwTHp$+M}g{rF^rsi0SS!qTr+|oj~JH`l*L=1?LGBe1n8(D>9;o&yJrz900dWZp7=7> z+ql}?o!u^KF8R8i)s1r?vn$z|)h2zzFB)UlHMb6$PWdjCmzKz_BYjJr)H^)i7?c#9 zzma)36A_J$^as5(G_tKwqrVj8-+ZTK@Z!B_@oz>$o3~MQ$`UBl)O18x5nNjKLB~ua z!0m`BJ<3nG$kHMNi!;Ez*UX;{nQcB4QOD}txve>28k-W%$V#Uo*%L&Dlq{$%byhk_ zOR)S&WF^=i3-9<5 znMe0)hXD`q6I--vUc^-oT@bR>+(mCw`2Qb!VM}uhfiRb^)?mEYpC0&1XqOf3p9GwD zjb-wU`K**5K`~Hui2nvNh3571f|x04PNUOo(B3AXVmV$(cD0i7VFH#AGPz>^)F0(9 z9@;-Av`w;@M>3{!`U>~lad08Te_rQ7C&2P=?HnvE)&#QWYYqG<+)Q;#zC)vDlX7uY zB+ROXLJ>ZhXZ(5Co4+nKF#uQTr@L$~neSgbTg*2-wz%;&@<-VDt_*Jx z7B1L~ZCxn&DbLKX7SSr-Fk3~xX0Z-Q`>*CD%$rwG*l4RQpAQB85?;5X-^KsZ0-$+b zocS+LWL!pWVve6WxtO@Cfg`aA!>}D&i2|{6h)@-n!>`^!a|`)&9Xtk%j@m@ zYM!Cb7o0f5@es&1;akq^bSJCYX`i>(nmQ%g7d8~orVzapuJ4^rOmjrRght-_RLptj z^lN=TWOdA>CRPuE+1D$$=0it*-a9(p(Ku}2Zm*`avs9h!GTvDhWmT}rEgf!H_&3^R zNtGqvUf2`}Lm`8}2z%Xzd%ff|H61hT$c`7MR;~Kz@G^r`*&e@*eUb20)*RuDJuSY* zVp_f?r+m6Jf(LHJ5h8KIb@C zdmf}|n)sKc2n#>2>}KV*Yc;ykkn1P(T;U zdy76@S0_`3?HrdPzbcmOpm{BKNyd;G`=W<%mgumlH90Hm`z2Bn3h7I3RtIEgF7j$2 zwyO~+u?`Igujg)OMIKl0jd2RCTeHV_EW;N>sT^ueHse|NtjkF;w;d!W(9O}=G`qv$ zXpm#?%^69!lYXCV;-Sd3`T^lcThvr0oN)N^^bu|)`k!|O zxn4IT$S>HG@wX%n)CP2F7O^70gkL_t!sFzp`+w;ysO5c74$Yv82&3_ER!(RUIT8gY zqA3g}4`{Ev;`!=P28O`$-QQHm$46-QMtN}(E}mmr#-GtKN@Sf!auM~(m-c5g!+-v$ zkIELB!Ikz%s?Z0AFn!ud=NhQ}vGkA$3_R*tmLGlmXS&M7|H1zMQ9V^ip4kc4QJOn^ z0ddaXG%{lYUq;Dt;P7cI_n3(tC>H0%3c|xjg7j{Ez+5#5_C%y0{}dlUm)`M8CIYd3 z>Ym;D$H^svX2QbVF*x7i&;T)->A{LUTh4@&v?V2`Q&0T}UH-dm@I89^Qh8fdZ#q+7 z48^YY#M|a$@%RWYub(50-(t*})juma9_7xoP&_zrDp^qWOeM%`QYgY1cF;f-t7(5} z*zh4!)UOGQEFps3+wd~Ov{19Kn5X)5$cvr8uX4-c)a`=ABB>rvd_bL9OqjyB*55lH|21*4R+o1zutHt?7&y z-oow$lx{^GP2vv6NH%6e3)VNOY+#7mIFT9pV6g{4K$-q?_y-I@j_!`qZY@}~`yBiZ;D{ymP*%|0kN>(kwpSk4| zf!#+MyPp_Y9=d2AU30w#j(s>kAae<28n+#{Itr8*9!fR-kU$e0boi;8WA>MfH09`_ z7S(>@_#c$LWmKG7vo-qQZo%E%gS$g;hv4qP-7UBUPjGihaEAnUcXxO9+u8e^JI?!k z=f}Nc^uO*N{dBFhYE{jev#OjSz*fjD2sS77qf$ay@deh?j84oyd-9-oL-^u=8p6%f z8|84Ww(d_>0=H1h?*S)UI<=KMX&*URpQ&H_w>`mna0$8liB+pRwYbd z_nAvq70A*m`1xgKy4CsJ+miI&iM~;wx+bNNaa0JcKM5*$k#%~TRd$$5QV15}#nG{u zf&ETE!WABaEr?tW%q#3kL5P8~#i)=tt^X7$HzyhuzOA{p+*QRI4LNV0%4Grugq!d{ z?4!CS2j9*q^Q`YN?(IZerHk)|SUhY$4aS$0kd z1ls%q73@bejO}QTZ#W-d!GVAw3VfbU?qm_aYcxvyW*elWTsL?X{-}SR9OMrDsU!}= z?~<;iKC_N~wN>w6;yj}mzA}+a0vjwoy;jmEmH{-E#9|z8kX^n|*=!;VLN%WT2ZtlHNe}@@Nhv7eu|BEdYIGR3l>}2UawC~Kk>!^4Hqr7r6aTc^>UKtmp9uw?V!2U?3&qtDG7aMPICN0# z`nB7LS>MquV^lSDsjI^m#OwTsLzh$6E!1j+2f+UwpM)1b{D|>4Cfbsi4;G8TK-==yU1J ziw9%w@=w>P{%RQ$F-U4t#tw^fcNAz3we_oARUB1_PF2z|7-{%Qbmf;dU5L+^e|3|v zue^{NU}dWr)Sb@hQ_u>rei53g% z=ri0q$JRE&&wq=9paowLmiqUIDu#)ffd;Gm-N6&~%I|Fw6tSvzT%@o*h$#QKv0Nd9 z!c8pxC;FFu1!CIU9$?lgj>bULSs9~$R-N=ASEZl!rp7G;I>=F zW#-II$PE(0Ld0yScq)a%liR+yn*0)F?Cy=5diV#C#VFpPyVE@(@r02xt6aOw-E5?L z1*7eTBxNQf<=T>t%8;d*{hr2!*oZaX(@NkahmP@@1aNIPBQUe0J*pJUj%&rG9PE*hR_z`(B(I6~5L< zwUIsDurssk!s4HjrXVhAi64AP3KTD&QP&)v{;}v^$NwHTb4JA;Weg2spaulE?c(w@ zb?Sa7+xV5B!9))3?xd%u*3wiWw;(b8E_64>U$uAgzI{Iay7IbqrXrJ)v>W;LTj7*B ztxn1(w7w2gV)N)sv_9TD+rFxBaheYiO%xQqn0ey5R;{l0yUs$LLQD5J>*w};8T;FU z<}RQSt-R;gg8P1g`@Un38FBFIg5jM)gb?6DJR=Lv#8nUs$B_O9Ou9NElS;x!UZT<2 zrJT+E7}#ov5p?BfBvBkr#J$%?b|;tguQ$*dLkM#(g*OCwL{Z6b1n-zLd2u(G>4;ol0Xx4HPT%W&#E_XY=(I5f*AJ zaxh^LovCbWg277z5%nY5c?eHmy^t}5pk``Ebq**{Z=Qdq0m3(;zVls3^7`YytUyG9 z3CE8#*%uK_v~k0C!5cRnPjmF!f3lYteiGP&6r@;fHE~C0&4Z0g7S8%kN4X)5I5(V` zqlr4wJ}TER)8aPc#g$7KlbdvVQC_y%`>E@SqUS38Q8U%1pFwr8PW5!9grk>Ul7Zno zmNM#w7tyGFE{X8>N6|%TyP5-?sf*dCXepKw_GZ!q{O@G~KD8ugX>u+<@E>wSnK}=2 z`;OK#^Y=gG_>8r!i*K(r@iV`|gxVJ;v`M~190N7X^Gx;P2J7V!B8@aMV%ptMWo>sxzvq0{*cTc;Ey0gycndC(ciNf|uKL1*K~N*J@EqER&=? zZW=IPV^rQ+l7DtR7z+6Mfz3Na%k#)NxP)i)P{l&MalcM;apzX|wTBaP23AInr9L^k z4K350aSwoHv2tOwXe6f3c;=R`A z9aVcfz>xPxIcDx7 z|G#@myqjOe76IcNXe`rH2^1<$?LM0v zqed4jG$S4E)~H}XA6K8x0c`}luX~SpXrV?p^L%+ZS8YE9P24p>?Y-{s4XiswBx{bz z7ru`cX|}ve|EjYOE_OpR#0jnc?x+}8h6_4z9nwt_w!A!&8BA!!vUV^r)@mPF;<)Zw zUAXkf6jH;PW36sdgE&>FlLs)JtQ6w2Ac3;S2mCFU2yVwz!sm2YvbSTf+O_#Wrz4VU z2`N`ak;i!rrmqxV;~8L7L{?A74N?QZ6xY|k`_X`B@O{Y4B=KRcJQNPn$pRmaHk8pd zbtm2z@=AI?kp8WpDPze}1;Q)UG|N9X<3N8$p600Q__ZVd0*C!c%3$|MJ*{ss2|SOR zXK^Xh17Fm?97-kDpe<;TTV4AA7C7~-^L$=Vw4Ggjysi7=RoIbHX1<^5QvIm|m(q=X z|3NHr2sl!lDdDb=_Rh1-B!U<*JkR%UhtFZfPzT{}7em&%A!McUK98b_>-+D0y5XHIb=s?78dARd5JAhEkk~qT~{N z8s5ChjHQqaBzi?$)Z*nsx15q4Uy~r5=vB%RjWTEpXs(#V#cpJPKjal__2Z=fO$6jX z*EcyKIH+a{3|`-oGiRySSNX$-ei2fbwMMQUmrjr&T}>I_)l!m4fT2wh*j6|i2G79o z9OmLt8-fCGD(hb5a6I#GC2w~p7s`oBt1p}}Yx$DyTo+a`V6ba68Bo6r{SJ`lj#K@D zYiEh*>WK(Etj=U2#DpvJ57Tfu?AH$orL-me6oX?zqA+oGR@Bd>uE7tlS+lg1MQYTQz>K};P z@;-VUMBeop>_Z_DwqK#0)zRPVlq970*Aj<$Wsh+Hh9@avsUw-E)A=#qz{^gGHN_e$ zc$|g80F8bmIG9(t4b_ETmfIa`c31>@ZYyK12yXneBsnJs$G3jLceJ4fpw3ycP<;BQ z$J6I(RFy=#(e1|y>5n5fR?m)u18DmrbIEXLp2gLC?m(OJJZ|SJx2*%cpz^mXlI5vV zLKt`j?-<>;Pp^uly;nm|lGd)-7gxKo1pR*-)489o`7fhLKBw?Fa_*)onNef4c=$G#saWd857G7h5&{sMvxXH;MWKhG5Co{j+tOjq7G8wzO>J zVa|9*v+J5-XBeg5Ty5n_QN{9mx<4N$G)XH@%i=~x3`|Q{^)h~Dm8q8Ji^s*p!^`Qk zKd%F|Ed2qy(effhVx<=7#N&AvjjZq;^){SpPS1)iqaie$=^ZT=cx;qvTpp8;v|r6v za4gnt{o&jEmQxUAlAa=@Q8osPqWjb5J$e5Tx+r9OfwI#+b5^WG{$;S`c+Q=&*k$$o zY*P+_K%E`rRA>5AN9;<~yVx(Y=56jjn0K)dp?(DCqU)TQN{beB^2n!07rtbo3^Oq? z+ZW&~DIY9(Yt2qNW3o6CaBQpj1P9dhjYZABc`RF)C4UQ@@e5b17E?@?kxL7Vzy*aBjnyf3W*-=ks79^ zu9VWHNIC$o;mxuzDpowx&tmt!7PFPOlc$!JMys~G%wkp0pQ~IZ>>g&#m$Mas;{b-PK<9{*710_2;&wz5VZy$3NPO3*|crhzxBOA$zq!oeM8xx*2=hzcp2% z!`!5|7{aXvLYMmM=F4BxF002{v3YfX4D0DzW-lx**zM*eej`p#pDppK5X(&1kV23p z;Gmv2HFcigq0h&1Xl@ZL^z`{qPq5(R?I|WKvwO}h;Lic!^qzn^I1Ar+wWih&2c!30 zu1C7j{bvbimh#CrJm=!&NBP=(04IS<4zHG4e*P(Jpb589xmEbp9u%NGK(lDa;LvOT zx>rm1(;ETN(_dmTh-HG@Xw-v6JZAy@UdNZ;8;8PVe>eyQprm5)*tVs7@%!kci2@>p z+^o5o4(3o{9Q<_fn_ssu_j>;&)HMq$d^0?AE5c`2P+H^$0|2dzlNMMy(_qj%T<;8c zO(w6W#N)S#bIe3-wxWqciqMu>=UN}=PV1>jP2K460FS%+$@=3~$H85#c^@4eoy*d$ zFDpg9eDrnSQU7}8zSJ*ORI-A26kwKzTrIekTPS)7Y71jAe{3vlkb!T0935Rij+gVf zJ~FUT>CMjAN<}ZYON*5A{z4}Y5>=R~;Qs`wM23i~!w6o;Pi{)X)9uyjE5DZ0y2E!? z*24i^QHd7oG}6F_Q>ecoS-3s6ef=HL^xpMujwvNT+U&<(`Xf88&5 z_Y7#*Mf+OU`Qd!<9qZFxYl1vN`h6Xy3II67!ohUaSd?$c7dSM)!PLRq4!Y$vY)jQK zb&wnP#iHx-)I8uH9(ncZaJyn@oI;^Cqf}c2toG!lP{#c>4$>Dwv?}n$cvK0oMhE@( zx7JOpfIanz#eD!!a-cm>P>4C_C9`?4*j0sPyu>Wx6mAyz$g!tjIms0Iw`bae(0LXSF?k+$k%5@zyhQ~tz33yn6#ZI?FF z?=@4FloFPtG&&Wc=$!k(WSUi#ni-Ua>N=>O1_Xx#$-exd7Ye#ghZBx3CQ&jYLxt_} z=UV|^Z7q>+wOea*^L#$DkVyW6E;bqU?gI{33j9p{2Hs`8y<-XuJk4Jccb@c;QAnc# z00TM^;d9XtharvEvpzI1VJ`koUb*k2H%yyQp zEd5Hg;3g-OU#jQ$<+{U+(5r5M0~*s72Qn%2rG`%Sqy{l_hJqiy?~RqJQ1+E2f|l3tB5_6YWD7wH--fdpR&G8(C1c)p>Vs>u z$q%S|YR)yXs{0imMVy>Pk{oO6<&K-awIL8YlfCQWt2_qrSmaG^j)gdj8=yMPR{k{) z)@91ACGqgO=-nwcHRtW}dC_ZJ!cPey2NK4P4=xT2o8}4%;iPt zQPVRi_|Wg-k(en$^nXG2rJ@8AzP!`06a@oyiWad!z~2+P?l_vGjeZE)D$CD`qHJ$R zY=Mk@hc8R$+G@DuUx7Tc3zA;8YNqpfCV6{vL4 zEZ;+aHAVoGBdfE+eOqTe+BRV~VeoGXo3Me?69p_U5o90QGrtmboai(Iz|;Rs!V8|( zX3O(+_4?hNKk)Lv6`vMLM+`yF?4#LInM^7fjaP|Qo4LS&4gGy6Yh^}g)c-Tv78I`k zn1YY`N$5G)P=P@bJRqo{K!}+;VY@S^Y(}*T=IW^hJ~I>2S#hh(8XgvM>mA+Pdp#cO zJk~yn>;BeChjt>jKI>r_#T>=F^|3YB!bnY)GOLfzr>S?BnB zl815C`rY`LjRrTKZy|Sn_X!gDBg$UWa}^&Znyb-z8<-ffuXU$oH!2%DQ3S{}8i+v@ zq1+J1-8k~AoZ4)yE{e#HX&iace`KoAb}&-E1?W6~RBqSQ2qjAk)w{oxHsk|OD2*E4 ztJ->lp`o<%4`!>)5R&thw)mV6794Om`J*!e^O9h~Zb#IF)&xjk_666CM%muNmpGF`{Q%WAz#ru zECKLeSV8kw(UCO|VomqC+97=W?nYJV^M1F8n-ev%_m5mG>fT#LWreXVv;8y^3N2+p zV7E*~%CfBI^i!{LM_0KS2==ZZhUL#CM8j~kVVDc78&1yiBG;2jLTAl2Q!7tx& z?H8jj?HYWkSKaGeldULa@8pYh$BK7>xncRFn9r>YBG#Ua&a zBu4#Mid%Pf-L~tjF?X$DM=T@`e`DU>_d?X@YKOwq5)SH2+~W@#5j$qI zSjpp8fTHn0E7i-+hOGn$W8u0S*Mf1xLW{6+KOA#q=InVN>4!`(^wEr7Cb)jIw^L!; zDt#kj07#O)FVc?;sb=Ggk6J0D@|L#<6t@piRqr2BHF?Dr~dBq2s*_=ZAB!KT_$71)x6cqOLS#rW*=I<|&HtY>?_E~M); z&3^Wzr!tf?-cfSWAgDT3Hy3_&Sh67)`2;WG!r84)E3@~@nggKz-;jp(=sYKg|L5CGIP?N5LkcdtXIo zOp$CK0to1bqJ#r}-tBjDd{<8QuqsRI?w-r%l!#tZdks+TRN~Qo2HoeVG%HVJ;Xz4B zad({Zqoa?&Q(JUvE;XlJb7oXtC3JVArn|xT2MbZTkF0J`S`8~-*#lgKl^0Bd;B&_E zX?UOmwU_AkBTao1Hh6&n3FP! zgm}fCKD)pZzx(Hsqb)esYv@>l!~mmY#FBM2UM<_-NLo=~Ai$#DAXn>9>;|Xei1qVn zeH5_+^7-fXXp|wOF36V2xs#vX?AjkUYgdFlHMUY}K4P11H6K~Sm;3;Q0e>OC7yp11 z)@a;jKc+gIx92pQF!->uAn<@c^R8N35Nlgg{AN^kYa2&8aE6vKgP zO773s^OS~N)Aw9O#F4;$thfa=?7FNC@3##<5d~A%QEPRH$R{-7vFRF@oM&MK|3EO| zE2_7z2nG4oPPcUO+h1h-^bjNl=gxYTQJ-`ezd5~ZVUF}gJPb2m_gJ$A?4&CjH#)@% z6_g<6yotv|cBj=*FU{#m{twh(koj?}hU=0i=uICX)MsgF@Pw=3)(h_MQvHqOJAqL< z(l=hyu*sGaG?(IOFa1XXR4ZQL4$_F$39%AqOvTCn<^sS>IW_qdlSe4$NC}C#rHqY1 zrrk`{x+}xDu=-4H100rX<<`-M!o3MnE0?}n?C5!ga3BcIu}s6+!xz-I2L7-?d@fK+ z6Dy`2V>ru^`qm6gA+l{Zo!}G0S@lyfC&d4r)z1!nUIhHOT=zxEjgw--FzwML;h$+V z1liM8;v@{ApBJxa*G!jBhTu!$|KG(@vf+xRm<)IjDkJ-4KbK$Ccx2Gw6S4hpvRDfm z^%%t;_dt&dsl1YsmzVdA>)#dj@mG3>S#|GmkN#vDlyPxS&B%zt1NN_#w(K$NNKs3O zLBYd+Z3oN=4cvdC(bQbe4#}@ZIFiThT14iQLo{Qa38e;66Y zz`5U`F=C(zk{45jgql?+EzbLO+3VIj4C3`w@O~a84t+>6i)(mk7!6@C)PhR`o_O+a z^<_@1^ZFEsJ{niW3@Q8kP9s{lp~LvTyhtmFzG-`tSp;4Vi--z^OcJ6w7iX9u^2^t`BnoG>S)oRSX$*nkd^$(06ukR4woW^ z3c7x9E|?yb+dbYF8;>h{sLCHyJ6ihM+W)*{CJnbkDZ7zO#`cQ~cLn$=?Uod9Gt*L2 zQv3&!zZkL(ckjsUjkh{vqd(GCUl9>Z`m9*HJlv+*#;7(5f?q0%I$7>DP^gcllB+)z zx|(=vJFp<;!!F&WzxJDy<`&T_t*xGJd$C&>;e;BoPa_AXel@d{L9zbWor+?`+{J>p z-EhQq|KPvVE2OnJIw^@0>iXdMd{f1b*i8fa2F{$vlYm5o^_-Cue5es4mVkzp3g`W= z!-?G2hmt>Ai09{NI}1S}pxwlEzE!)~N9`-H2o^wfz4c*yjsUS6vLU}w4}qwshoxe8 zP0rWVgrT?xV^-a#(4z%6)JU${MxxhW=(}005zgAV6DdHmMU`fVGiQEz*gj2=HpLn} zRdW2W3Rf6$?1KGwS@8c<*42I8$8|TP?7|ID2U>w35j#y(Vqzjx2M~AHoOQc_TTf-z zxo5u3NHOR#BbajQrl8jiG}=WnEPy+LTaRC2W}|UXMJF~UA$;1zM@LNuA;M9|yL#Di zyLZ(k;$gJhxwz58earWGf4bw(-Z{opTXl;oJbA~16*%UtF2mue*#xD-i>6XCBvxb0 z{w9@!JG$JG!m#@0GR)#)c#AwgO`x=0}>ZvJ9hhThGxbgK3q!bbo?Hq>#Onymdpef z_i3ZQyV?u84?P+!^ z;g!RFcr9)I>jv3nM$ag39v`{=_YVBQcHiOm3i|{wfNv!EEn^zO?d({Xn-zjoP7-mk zgaSYJXD;zULyQs@$h{Q^7l__;FF9%zMxO2rS}yZOu*a^RNQnLU6fwtzL>cw#%umE=lw&ry(h+OWmwmO`dGEB;$^!K7f|gn?Nm-&Z_>lR zCT~BIA75Rl*n*@yGC1mzL0h=wlcLkhkN}Gn12v15H%l1_r>+EonE{W19$4Um&a~g! z8_y^h>}5>|wxBu@3CVT7pFRd9j3p=OL;Y0Fcsuq&I^2cN^o;;>UGkXP%f3$rUe50L zrekBCy^yb?@9qw+ti=-B4TYu3J(FNEk|B@KoynYzwD|=K5lt22`pYM+O}ZtUeuQNG zEKj$-hewD7fM-)GdjRZ4OY6-m*7jxRp9!V4)W?1TcrV!~ zXsJXipoS=Aqv{e(RsJh-sVjn<-{O?zBz2q8nIhH>|A2WN6BCC|Q%b$0`%2-9svsi2 zJ>4i-3kFjDO@%CniFo{-6VuSf@9t4=F4=i+pr0?`Yp-VZ`;?sZCkw~Q?3zIZ+PdRr zuekp%(9Y7>lJg$!*?!_t7^j1?q@A6i@dExyk}kA~oQieI{v^m^od|U1S*zyu8?VV0 zKL!hVVNrAIaDj3nmmM5$XM{$)a;sj*NHkU_nnwm?f1;Sii&?FS0HZ>}>0bqWN-50a z(!VSSR=9_jF6f`{Eaa+4!2)Jw=2IZJ*GayJyVxQJB+55^ms2gJ7peUD{o;>WkcR5q z(i8k=G*ERU7*~1|HFNam%2Z&Sb|hRtVpS)`TBlCaR9H@@>FCwYskd@mSPZCoi(zhz zcE|9yddpS>8b-0!I~r=O^AVK7FA_1?KNdhkL2jKRn(s7OS68D7yIHLbEkj{$qx4Rz zPJRR;ukF))bZS{vdK@QXwMM~6c290AWaQH)+iVa(`rehq^}6AJi1e&QIsFEw%>iUd zoOtqB4Vd@0Z+)x%VZQ6EmSF#dK$< z%L5wV@`JU-b$9vK$J-$>Mqt)6(BB&iI+|0p+9%;qZBWOH21g}|lJMAVT5Gs!YFVL466^%y698d4eS=PB z7{mHT3w}W-MKC$)P6Z$M&em)~q^l|d|Ek7JucHMNz3DhPB7T7lLy<7$D0lfry5?$* zL%x;RHy#dJpZC=xIC{GeBNZY&?6)tfNE5twwWe@#x2FsAfp>rOQRTQVpkJSOLcYdB?0%-*K$e#5aFme(jR{??iM4`Af9azlkV( zx#^A8O-}K`w6KVx_vTMV3^O{miklyKN7n2>hKS!RQriDfQ`d6d5B$32?weQ`_@R)! zw#KKH**R>?#B?h(i(FldK{jqmHZvgJ0QYmM`RWCDiiNfmt1R?6t2Bl8EKdeV4hmh4 zWlPH|h=#xyR(^EDLNyW7P!zhFpQ%XYLx7kxB}02$kM%cM#lt`i@8oJa%o){r{s`2( zXVl+Xg+SRZ`ADMyu-ZC!$uA9-dz^a!0CirN+znzsi@80ATLPhqiunq5di+I=h0V(? z4`c~6Nf=;&4?lN_Z4?%x_U9#qmO_YtjCme28*DB4v}E%DxD0T~AK*KBf>#@lh2)9= zOPCfpLwPjo2Z?M`pzGsa@=BE@zX=m2kW+OMo;MDfTFuF6gz;WfDvDslVV{IQ{c|hP zELBR>;I*R<_2Pi?hvR580POHM<+-`%&V_?=A;mHUOvmOwMe@t$2IB$6fSZ}7d%$)V z=f&u#4v4<1X5LraDtCcDKli6+1Otd3iTTdxefta2qt)cJOaPZRV8a(= zRbv7kBYa27PHF1nMbS|J@U6u;Txx(%0BE#nrDRG*FUzrlN^iGDoy=&t6F=XWC~uXo zZdffjuM*<8cW^$%v6;jod7bhdbm!a~pMB<4;v_W1a#ee!qj_H%3i)#|l?AN?5Bp)-h&SQOsX`l4Zs)C%j@4z9CQJIR zIE)P$ee~O;s_k8b+Zm6BCp(TewiMFK^|i*6AFa+&-+Q3DwE(CC$qyj%arzr@&1Ez-x%0zW}C12C~exbNV5?M$KS{ojcknM0s(ib zL(~9ZB5Sm(Lv3!#wSO{Pnw?-wMwV}<+ezTXmwzyJ)Qer**OcZ228{T)pIzE0bG`(y z>bTJ0a}_ur>~?;zyT>(2CtQ0Zb$V{-R|G4u0~1SA&s^<`!NUjpWJXNk1mQp{Jd_X= zOU<(Eetz0jEx`9;Ma~pZanLR<4UP>l;p=zXoW?v9Q`-1|0}Xg3H$0R{4LFyd+ZK#? zBrD!<{Q+}nwg>&ZhrEYc*Z2CS*$LgU#+K{f%#PFy4z`cInyEZHU>a)Bd+&bNh`bgXfUaW!*UKf zK0PT7Mfh}OJ~j>v_^ESy+zX{tNaZs%q#DG$2iDp@qvaPX=iyBEQC>A+we=N&Kl9~@ z_wm;C>iB&dT>^6!@57v-GbWnW+w?^-Q27*{Z8z@ac(@VRzqIE|Eq~DSHEupn=%}Mn zL);Cgau~V0HFolPs1@liy8{~g2*mDi_CK2zyxIlPJ4n56*i6}6-KZuCQnM=A5f6-M z6mxr-^}BSbQW?}B{<1p|=0C$p002jc`WK%fUhjm%9Ku+me{{?O+>wS zn@8I6J$w^;Ji1)$(^s!~I}VhYHBNE8_y-#LpotC3tCj9@vqN#G^q29WTO0-!ur9ya z{LPq8MpJvZ;Afn1A(DxcQ0_A<7N;1inXv#oY|lEn&e=NX-V0*H{xT(|e!53KQFrN;*9*6Z>9L3I8YeT8!m4C~n6ke-Oqy^;S7PDp>bBvcgT#F&P z+T~l%chL&29<#v`_Z6;jTj)geq}(d*f=_6GP`=}awK4Kfi_;LYai7Z8Lx!VEiyyfA zzd`_^nvE*E6bEZkFP^QTl}sPFs+u445ti;Z)89ux$@!UrJYs!o6l5?v&(+D{bZ(>2 zfl{qF3FC(XTRaT-aybY$FzoJO7L#5h&m{Ny>YH#`nEEExPFtav@k!#|9g zetY1hohw_&KaapinqMlZWqOpHqH()zi2Ax`P)|d?w2bHa^k?`K#W~#=Fp(CA0;hc} zJl!77<0(((g3tOVR{m{&!m!$ed8X?C71h^7*BJ=Fw((Zrdy6%6&m_j&T$a1u8cF#H zvv`xz{@jdlmg!O9Y-x6R1Xs$~pMv{sxfD9yvD|;D;w#>C8Y5cBKvhJK$1BR%?OKcRwO03Y_jd%^rg2`zX@zSN2U^=wlyVED_(t3o zJ0G_HL4kQEOxw5lVmsdfojUQdOdbLl4s>!(dTk8q0)}x-Z?qMiXaQ8NVN&xU?sTA# zJ`+>|^gGo$_uV#|i+hTZ(gf zjUDuy-`_mcnV((XY1<21+$T zc~=UnKg*F?7lZuUa}LOPFzK&gq5gc|?w|jtMU*VV#Zk}BQUCCI59ca#s86`;-Etnu z>NkAv+D=@|3>Taf0rNtAJjX;RXgy>qLzMV zHQF=(tqSkkC(|qDhaW%vnO`-(Ck}paS+r!avho~&3-^b_*nY$JCwB0AsfUk4XImQY zOq(&DE|ZsH5*kqnQa%<$PqEVzDwUlTAUv?$m*{a$Wm+Tfp}!oH0`fJOru~*0JR>nN zfwVZjYe1)CV?KY~-BV7lk=h~L>NINapz_t+O^5TG6$b_7fU&~yQ_{5UZ6)_+ zTvS6S|4Ru}i)SO+HP^ZBN{F7jn@?&bE9uN&)cv|&watvlQ7Go9JEGnz0gkTZ=ysJW z_WFPsXo8Ex^n6$$#@_T3GjDs|F6TT?T$wIU7y;kZ<&L6`eMdi@D`Dqd+-hQF37{0# zI&sDeT2F6C#yb%;sK0=}Mb084YE(f{%xI`Qb7!2ZJ3sOwxfnOTG#&a%*5OSAM#+P?~_*L~(7zQ<+F zB?q?!|4pFfCzyo)sh#+ov$Ve9`PxNj?o%<`_G>b)`B23yBYk$^y>rJV(%udF`)T`4 z4dJdpTGa-{^ah)^7n1?iaJ-4_urPRw6`J)}#s8p6Xs9#oEk%6|9LMu{BP8FqVwYwZ z_tZf8fkm7=@AOv8Cpk84De+j>72u-e&4ozO;76wiTQxGuk2)cUOoO1^Lpg4O9)WFJ`$- zM+o;i6;i|?^t2OFw^HiW?eI{FQaXV``siAv+U~a2{GBU^G4}cwe*y)jB_%1yR>HPX za1h|gMTG)wZl{Kq8n}CVm9H-v**vvaj|j@mk2uiLtOUrp($ChB*#~}}Sqj8-wa4<% zu4MlKeOnve?MLqXJX)i=Q)Z~wmZ1+tQg`I30F**a5eK~gC zm1c+70|e2kmfOFhazTs!CZJ>;S&zKZL5Sgd@6aM|JeJ{}pj?fftPHA5;0gMmU18_R zd@)_qT;&ZxGXMa9?x^|m)benS?8ZZN4jmkW9sYQ?{Kgs8_qxoK@;{9zTjz@X0bPp7 zYK)NPA0`7_pDC;<9o3MGi=7Y-Z%zmxzXcAQ^qg!s5~ z<>t3Lbj6K;G@Mu#nqR(^9Vr77ZAPP)ADVdKUK%H^!e#dV;=i&u#hgD?^ndQX|3S>6 z%0N|M1p*>l%z^WYf+A6TVSPx*%mP)QEGZs%BqYaXUMqlWi^zWz`ckxu2JjBey83WY z=O!jPEa|5u0a_LD&oo(@?j~^ths9B~`ZD9C-Zd4-@kldX?yWQCAF+@y?@s7$v?WuM zymAi6eS1Fzrnh#@Cc2Zr(IXVYauns^GssE91C5#HuT+HsouLW;upo4rV}rKdZDJMNZXJ)Fl z#C&YqO=cE8DH!oN|X0 zJvKtw`veSV#ng-qCL9A4*2BM)KR9|t+auI9elq)ClnqVmv6wv$^Tjr?>)+NQQ*OOS z;Cw!{xc8q?8H=O+OHz>OO2ny1wK1{L{#61=r^!NdBQ(OMi56up#Lup{@!yee=V5TZ$ zh6ai!SW#j}UjNFQox3Q8CD4d-3j!0H1vW54A5aCAj!K_N85>|Ld< zRJ%L?B=$LhC)UH{!y9+2*D2j4UvoUb|5su0xybs4#d&Y7q(p22#t=%#zU z@{eTo8pEiyv#>;q;&8OfOGaVf9qO9|y?xLf)5}yv$fHQ|NP1n9(jb3aFpf zW(5b8zw1&PAg}?%SOrwNKGkW5@?TdPa$Vnh26A^QxOJBin&w)N`MbanIo=q`nW%c! zR?1`x^tn$tkj*JVNO;qYsxc^u*v<>5<#yu~CU5R1#?nie$C3Vb8b!fh8U_7)JZlIt z@Wb7)Ha9XwuIoqI>E@DDCu|vA(+A6HqJR7#>bj>z^Uyk8OkN2MN{eQAedHmMS8P>D z$-@udk%6LOSU|8REEDn7>C`7(9*}wq4Z;I-^43`fI1FS;5J2NCH~- z$CDfHKH*I_8+I)ed*7&0AVwB!`ei}7g*bt@b*sK=XU);GfqVd{EbYG$Yb2Wn9b!-_ z_lC0=sUQ3WsgQI{ih#GnWVU7#0=W(HX9lPJXXiHP#0N%m-L)A6V5F^ks<*V?3lGlg z&5iy_;&NwU_}lhyCY~x-x#@>IjfcCVv-2NYa!ZS*#uaQ@dyG@S9GJwsNdYVCR7v=s zV9?06mWkC90HU08G zjPM~cg;OMrOA$N)hb(mUO~K+=l>LQ3K*%`p*0GgUZZ1r5vvYwH`1b}?MZ)J?o2U4} z;9?j8h65Js%c?^S%0QjOj_%WgY}Ld+_v`Aw^k6l5_Mh`J3#s5X`u^-;I@8`0cE*E; z9=}SVu&VVo?( zzHMD_J~n4W`tDAmVztR{aj45j1!9zi{Qsw(l>EenPQm@1)HHA=IOcyt^FEmvlv$ND zVW=B|d*XXD-tdb!ie2FGf+?2nLYXO}(OY>PsCHMs0rPqss#%Z+-KexX%{{2=p>G^$7Q zq=m|iZ4_EMh!P>?{H>o6toSRz zw>^hA-65NF>Vc-xv8x)BJ~s=i6spMy+|luM-R9O!3v_^?&i9y^E&|ic*Xz+lUIWLs*E` z^sNoiyGW=Yc^;gfaQlvtjNM2vx!Th7_+8A^w#BWHbkUvqx^UjKjuzCrN^4;{(I$K+e zu9A@gu6d)mQ6Ej1t6Uq4>h8IrfVEQtmeZNyE$XaKuCYPNo`b3Uln=&h1JVLTV_UA~ zf6`UstH0Q~#&6H*m_*{b&&s}~kySZHTtGL0dD<~$Kp2FMm(N5xfz4;d&E z+_V=8npyfCezrOav8!zJYJX9Tj4(gXPtedQjCKOdb!Kyg=)M>!l0sM060{WsW#}kp z=vX=L9}L$p5!x&1MO5w?YwMAz8!pn@8H66qf;Ig<{~{uhUD26SNh%=OaIcziUw(za zrdByh2aS_Fuj~o&S$UyTbg`@+=HII@++PdST-ai)f>6*$85EDkp7ROlL>;nn{>F}I z;p6srfAe-!{6XfT=U|0-zuCJ0!;J6~3z^d;VCCzAT<`M0GO_t{!*_mAACraPFJ8lI zue$K}3j7+BFs?EavlY_YUa^f39*#$Uy!9yg>g>slYt5hQ^_!fM&#s*R)QlUNU(Df| z_E-8>N5g>IMpAIO@!=>f3zG7FN{&N3aj1mbn!}-@V}xIz9vGWvMY32T^_!xcPa_r-Yo^*UvAEt*}zAPgpFlG8`8-66TI{X zR#K}ZQwYmb9b(v{oOzixF8E!IRq9(<+`rqNA9m39Jut4%-}+?`*@}mIjr^Ofp@#eO zS=ZwM1uCU7g(~HRaz&svsI0P9Ij~+{;L4Z@6&47=smumj+=AYBC+*(%WbUMI@Q@-H zji4spG&@NDF0X$gjV#&Vz`%f#?Cexf5O}>BBcoC5HPF}u7n1XWh%j417$Kv2S3UAP8G^( zN=ZotcC{gk+{n=O7zoD^6VYWj2CHxq7D*dw?ijG9ToA{~@@+QkBuHzn z+T48$Ji+ET-7_30hGH^ppA3A7jlX73(+wuZqyI85eQ~XzFIH2P_QL!i3=&UZ{0JWs zVbh467$)NvO3?C0Bj=KsUn zJBCNvb?c%PcREf79oy>IwrzE6+vtw%j%{^p+qP}nr@FuIU3;y)*V$*E^W)T2zh)}+ zTs7z5J?=TiKgpM@Xt_#ZL4mOt!=Fa741Um3Xn^=KOeMe1vso%XFhf5|DWgLT^x^S% z(tf#ixGw2M%rdv2BHHrh$}5m7v7|OQ02>iN1)Glz04Z);wx6VzRf&250G*7&nV{iQ z_c;D^vHJxxd%)OPJVqB7RJbA>lp3X#zDkFV$)WcGvpi{d^nr7T# zf9IudpfTnh%lY6+c*BqUU+)h{pyIYhU!0RV)}q5d#ysgLvp;<rZvN&l=g}>Q(w!%N5|Zyg%wjhH=LskKwd8T(Q-I zo}I#{^!K7c*93RgR{+XT_>1u|$XFN{$p0bX3EEv)xTK3rPMWhD&RerRO7h<5zw(uc zdV-B8Q=LoFvFZv?0D<27X!+WbcjG<7GE#ufysETL!?Ug;|3zC=ns~1>(h~+jR7^$u zb{YpUeVsuDS5+x^HRU&`uh4S%^in)(uJl^-R54y#G>J&VGWK!88?k|v^CqhURDn{@ z2(TM6Bru?&z*Yq%Sg!ygkdZjV5u1Ho?VL&%BCI-;n|DQbUKML9V_otq!E(rN{~fET zl;gu10xZ$|pGuzql(=qUZ$-fSSAd|-{RwC2{VHN@+R;Y@N znwpxKS)MY%*pN81j~+v|7o&JPTteTeFzfyY zKX*N#7`zOZk@w1h+I>M;KsG7f+7zGrB=KS)13ru=8ds!twhB6YV@ z7>XsF((BjaaQ|_B80K{xL?prx=0NX4sT^j|ixd-s970UQ%zPKJSS2p9``Jks@#g`A0ftF&nn9`k z(&UrX)r&uRswMwBltq`bvm$Br$x9i8j+X-J4x@wF)5GcEj@pj2m-vf;YP1m&*I#=SMoCgWTV?FZ}!>-k?Sw(-i*u#QiN@L5_^@8A&?>N}?YUtJpdGz0n zc34RdXTp@?Q6;5fmM(Q#5YP{U8rY7+(U{Jr#fld>8KNp|X{lErbD)2>Er}(VFC%I> zTvQ29*iY(Gfp8L!(nwoFpDa$Om4*WMpgMj?RN=vwkR&V9 z<2hAzR|fE{=at^x(T|@93_76tk1O`$e?k6L=i#+<|Nu@Uyl z2iU{m%-=~<2A$XRGJLyO%x)m(CNit}9HCoKOrG5LeQ0KEILZ}51v7yq<(evv(g8Rl z6!?C;qlYC5M`8$PiyImo9o-B{8l@*k?pws@8iE9L=jt_Jg0W6Hm)fa*0x*4>#BA1( z8p6?q{R;UVfBgHSr+1TdJl>jq)uLrRA&&~VBxMm{=oqbszh?H@dgC>_{aC@{6YRWf zOWo2L>D+=-ea(QL`1PVIYo$1iL&cNK3Y`)YQ-ehs*1laQ&v$G(R{gWlFZ3aH+m#Ih zew+PGKPkpiS(InyyNEkJrUl5XGau=UV_@o5jV_Q@&_IPD1Vk2?%&+t8RW z3ZvQI5eV*y7APy=(zLW1JoZfdHMi=& z&!*eE4Tp<_V#z8t+{D$WU(>?aYpA$^sgPi-Ket4@)`5~YjIA(Bx*bW4-4&z6=ckM8 zTb|4d28Ri~4JA5*8ubhWJJ4+B_#__nC&+88n?YB0o_t4~ouSO=!;EwP_ zY~_7asaNJ(eZI$&;jG)ZZPfa$oYr*v4!)DTwdAY+qj<~jCI#&$9L}a$%|kcr+q79e z>wdDV{uyODs%FjEZ~5GpdTV1j&BE-8L;?B7OCCj?hnCLF{;;c4eIM$+?~exyA-l`n zp#yi<=7IFv+uJB8C|cUuZEbDh4oE&hN|ZF~Ndkg`;ue2w7x zvOsn;q10bsv*L+LX(!9|RkZQeLE)ZQ|&S}hkA zKkbE9Ugv6NWb6dO--$I|elu~$+y_bbeemVo1jC(B&|Jwnt%}|3CC$9F{O$Ox7GY7T z{2Z-)e>8~$Ff2A%gBl5nw6FcfcyVYrH&t9&pW9P|Sr1wmW3^G>OMR~42{IP~fp2#( z8X~%m3MFAr%8Y=PA4@fh)l6$Ec;X-ITX&K{6=AEptnPOz{(+5K$zt|%L&%d0gNXEx zdT;ZR5DCT)8S=pbl9Mr*OaV-$L`1pUzdpmp4FwB#e`Q=7?GWjdg8?w~sbTtFeqCN% zMTG5{bhP^|42FS`Oc+yCVhh9feKYj^?LbHfybxYIo*Z2PSwg*}Ye!u}lhbOAqq&&@ zy}jM>Wv#YLnyf`eyk+c|IS)D-**%I;Z;5HG2=U{Mz{HBH6_PnGft`F18H~diK9Xe> zo$kD2kn%$dF96b~F`QA^Y}rakm1uL%dBTB^Ucj2T1>S6v%Sdba$m4=N5T|9u*ez;R zjiWS)9nuNK*E0JXz37rm6lCaNh7f!gv_HN#X!Y%Hanc_`FR`?@Ds<|^=mVLynOp6w zOtgyQC2J)c;c%R2chjmu>sAMW>F`R2dRXI8q1rYY_vXgxzyTdIWaXcNr4mY*&d%zc z9_)jj6Gp8Rdkl5yDF3*)C^2H>FbtFrqIa%LOvP)wUs592I5=|)zm}M=Q?vk$RJ{s5 z!C$2f90W17AhWtA0X@MODUytXC?Vesm6RJH@X1YU!bZm9Zm8}r3gY3(iW51M1Qx?78cye!dBEm+w4DvOp?zLGzRhV} z$gerB8hcGOIJV0+e1j6mjsO@H*c4*nD29DX_TdP zX)JcVQM>3xg&R`L$qEHCMw54``1}EdAk3GE*F87Qm28t9d&Uc~^=G&kJ3Q zo}C+{e+-QlBq1DJqJRuC(nXo+15%w&zcH0rJBHz#+s8{` z`r&`dA+^64cS&(*NgrqeyUn4+)lD2BZ}YZ>fqQ1AZYqjWptmfC>WEhofv=;}i{2f} z9ttD8HMvGlDUBa#BEP!s6N-#5DdgyjV&AI&y14OuEMrIZ26D03+o75=R03$YGV}8D zp;90f->b@CFWoMOIlVsGT8O#39h8I?Q^=8 zVZO#zY`p(&;n3vS%H<8SANHHd^Po3ICPAH|^5eXrGD^Z9OCzob#MdOl7)Ay(0AIfq zy>{_RiI?SzTiBVU>@xs0B20C5W`>GeR)l#gF)Yl6pPwhJPen!L;TBtx2O;Nc(|H*1 zTT*}5X*PhAq&8E0Jl$8_;1+Q_%QDJ8S1VnU+9q!dkiw|m&gm&@iKaZzBT&{U^8`sz zR}_2>h_B_M$hs^aGS^b_#}EGalu~f#cqf$OvZr4z%V@+m`b{!@a-hKQ2&kqKw3vBy zjZEdm!ZWqxqy>g4aI{uR#|+&i-8AS)+E-T(blS_xT*`qJ)^XW_+@N5p(NRDD_*ic) zH}BdD#1;02l+kwg@1|`EAaYxh9aay9XP%_qXIsbi?7P*|4XX+X>xtSuhQMv^z#(!- z9V{xEutU>!Z-xc7+d4O&{BHmjFD z1dSoqz9g4OIlq5C-aNcKWPU-ZP4*=I>#~T3rmZVpa~DE`jUDK8bxc%SZt+$0UZFeK zR0@B*VJdmMEAb0!qS7(m+(Gbjwb&4fFGaqjT<7RHn3EJEV;U@k+Oi%g!-Z(ZXpSVIx#QGD(xL-Iq6GfZ&A@=#=FXiAh||U&g6& zIITh(o3dM+mo7zPJ@2Hrs703M-i9mV6xvwsF3;U!A00dsucg49aAhU8IAf8(`Ck)F zIa}J@12YdA$iG;anN7Vs-gZipeDntcwH1VK^pk=9xrlHmqlEP<0|ToICVh_n`QFO~ zg<|U$WZZ7}UtpdYfFW!(-`QJMadG;O^g!h@*6Yc4=`YL7Vr^cFFOLDe94bTy89eOG zP18~DB&chv$L(Hw`z^)07~g@XBV=}+_6gzTy~QEuSvVtoMy0KL&x>7FP=B(vA!2+X zhfo-d^W_=B<@G!dRhN9QHyv6g&k8by+((uHD7G7M6&2Q*JYZ(DV-RxA-mrp1L_`jZ zLQdOrp9!sXPEE$GA1R4raz7h=WAj%`b`@aZ@?;S%|pvVTQJ z7oixL6sqd#NDSF_Qh&T`fgeI(e)AfhSXXE0t`v}uW)kkK-BCuh&c%Hf1{C+kz0 zO0Kap!{MHfHvZ?0HN|vLU<>0Mb7IE%J|K8zZ)R?O1L*it^5wF3(G&VNgHqMzzDsF z&KksA0RA{{1-kaCs$NIZWOJL7|1~y7cv2a)QqS;pMH+wQr7~qVgyF*4Q zYH3L8)T1z~KC;03Oc#9O)86M8cps8W-@R^&6lU zfRDzAkpmke7B6pp?pl$!AAHp_Habc<*7RDpNsX2|rqVm`8CsDaRo=2*KRMv@*?s@j z2+3}W^wkYUS*Ei^&5CqM<%y+9R8Q<~)s?kQoW{P^O?tg*ll< zPFBbU?5m`(@)wn$%XTsni_;(fZ~>4d1An0$|H51V&6BMVF&+jPyg}|h-;Z=sV6K+4 z-|!)usIUmiE@!6YZNN4!39h{f(h-v)#b#%dpc)-nI%8kZi&Sh?TS zSmAWuf-xL%h7NwAy(F{e5%)*=>kqejM89Gr2mMS#77_K!#%N|6-A)wJ$b3hL5A8So zm6{rb$Gbi{`fTx(h|r*YG1Hra zmIn=B^Xq;69F)%4{kjuZOz7;n4R5g>-HQ8^TY#^|f*xZ+CNQtDolgCr)=YuCypF^B zd4m^*s!45G3D&yQKHZ}@c(goj_4_?3qSuvU5l=GSHarQt{Fg)SjIs#P5K@;(C7BMz zDWjcY5}Hax6B)9@a4TJs>h(!1s@<`I$bw%zycJe8oubk6!%Lk6W79t>OI`GOHq1Y0nG2HD8n6S3v`#XxMm?X}_7#{anX6&V6rq zUWFG|cAbL^++sAOq~zq}m~1^)S68veVpw@n!5_w7QFILkeYbLUQ2~64vNoH1g*;x6 zi5`JMGl*}2#>qobT0>Q0WwrDuniW%_2s0n_F|_QU(HO}L?-bu*_D6?UgT z^YLfzj&Mvz$?8u})vBag7ht+r8xLi#HhOp{^I_j?YU^1m@X0NA+MSU~DccC{%*8}M zf`%4$f<`ww?DrB~gc9Mi$E6g`{vJ)V&!s9;E5KJWO5V*Yh2#ya3s@@>Z(d#WYVllg zzB*&EW|Ah_o8CjYKK$}G?FOPJya8G%DPC!5;iIEDIp_VoLSaG|3=BephF?=Ox$^Rh zOA8ANO{@)#jSUP;P1URd6QroIzBcCge6Rz(XR#nM$#6jYPlZJDOV`Btc^S=y$O_t? z?u8`lj#QS$Bf|v>vj+9HKqe3cfeSlQ>eK=()a?%5-Liymy9+NBQsbCNi<9i&(MJ5nqt!Xx@jL);Jjaj-u{qbuvpb%mH4puW3PTdNv+E93%W|mkXY1W3qPIS)MypXx@8l( z11pWh@zffcD>^16{uCO}#s7J~>SADGq6H}c<%uvxj2y*Z4{(Tad~}47h&x{5=pJs~ zO#|TPPu13PF32NB;oVo$Y{{;#=ZDj$0Srdn;xH=Ojdi!zG&l-u1qB7E(rCPJP4H+B zxOE$wU`FThw6z)^os;3^x3uD>jMv%TukO08)}3HaEVZ1JB~KbRYQ7!F<^hNy6x{CE zMGsJkZ7z>mdh+*zjdJnU#pnRTQZ;!-4CY3vUUfNn7B6VjjdAksr)A_vgNIk!0W*d0 z=f_-e0y@K9KACl;{`wdIa#sv{YQ5dGf@qPn&(evYgHfyO`kvV@TmxN_=m-$MT&50G z3RPPtE4M?9O69~!g`-0&v_nK0aTR)cVv}oIH_3i8h%V1vs=_X<0CSPQx%)Fa zm6-VhQYV*#+l7{8%Be*%aQiDhSY65LuTDg;TIXC{#I^a|K4cC4eW$hYKZJZ$n@tX4by56_5G8}a-A?b<7kSfKM(rzesq%0gATSIJp7O2 zK~#>gZfbl)L)ooSvotbtlAWl^tNQ2T_~wz%5?OUrJn!$Nsxf_vMu*2NX6vn9-#0%` z>vVuIGzMg3QuCh|h`QJMV%<+iHIqMmzIv^ zOvEWL;D7D;@M_@$qhAwH)d!|L3i3GzwJor{;f+Y@CrXOCX zU5r?9$<7x!Hhe{wjOue1$~!0y1XokFcEnNbSxU|odjAAAw6|^q7T-_W=ejmWHWRpB zmdZ^5kUt(Sd$xCEGgg_aN+padYMUVy<;Pl`UlDmTXNqoGjnI+_$R=9-Ra)q8JWQ)f zr11@qD>K!Yonl5{H=;d%$N;fp*8GuK`g^m>$V;io^z`!M-^^D1YSXSh_75}I_H?NK z*f0NKU9Q3sAQyJy)aw^wl-~qFJPI4QQSzV6v3iI%@Vtqb8jwGIJ7ITL2ku<9>5k5c#HP;RrQ}VuNy6zIUd9SfF!|WW9^+p``p;oc1`rQV9 zY5XFAAWKka!P(IDtjmJDbM)PZTE3fJ$G%p7JVHkG>D%sZ@Mg`zmr9iTn~}|&Yo4QmmW-_&*I2}6Yf(ON!ICBn%IgIV3?q~O1xtH= zTi?bJowT;vFeaFc^+G+9_%qmPG7hECv~^HXR|TKu|Jx8pj zi6xh(%_EMlR{AkeQ(N!6-0bA&gn{<|1@fG#deFCDyG@nStWArIZ?G5x>17`Ne|FK5 zjrntK`|2)pFZ>G^eMWL{WfAP115gVaDB^QGN(oyV!IpDy$K-$|0X_Z5>U3NWs*|7TU4h(QB}=X4%B`;I53}-I4S7V_md` z28YElBR6EdGF34}&QGLm5b^}^ z;fhi;ZZcnpsQT-=7?z^`{dE7Ltk*V8#RAu$!1F+yZ%~ie+P{E)mg7)bL1EOV=-4UU z8E<(}5Q4qx;9>QPL@f=r2SW1V*5uYfa)1%Cgb-^(vq@1QuXsW z-o+&5UlGpQK2+i7*Ku~nq?YW{=;IK`QHW1Z*YQe>kKOWBe}CwKAZ+JzCAD>u6-@D0 z;0{8~SkSo!uHkQuh9tl{j91zq@C_W*`rgnX;ctt&C6{2q zBcNVE#FVPwesX=E_c2$T3uSi*C)Gy3f*|m6QX_v$(QdU~#qAhDM;3ZbLOSWkbdba& zvK{NEKFkK)e}Ap`V$yiA-fVyODb>$_Mc8PVr~JjNrDETTtTOHVd|4tLLXOGiG1j39 zxUCwC91ieHKR$u_Qd1pwmbI5VnT6(%ONbZdx0TumHQz$n1can4MCXu~+!Tj@$X4yS zRSg{6+b`<8F=Ci!T!*!48dxZz2-n?tXwF4F9G-r{!+68yVMF|^mizp*c??&4SC@AtdrvR06Kz!C9VJJ z-v56EE-Jo{zoldS(2RT>>6`Z|6?EPBl8Nh9mSr_x0*@cU=EM$B;(k}xL=CXHXnUOw z@?5qy?@AKHTJCk5*l&jmMV6`HB{O9*^ai6{3JTuP;lJ%aPlUnqem_Pj5YfF)c4yae zeRyxaH=nK4urwRq;vqG#k%*XAc40LbQ}nix*L9WFc6egWQfrWJ<7jqLR{MCEe;zmy z`@4zX#bUp*waPqj1dydZ3Gb(N_*~fIGMD`a%U^Ku!Sn+Z#TF#*~ z+9W@>k^DCpkafr1L&u}81UPi6PL^TPG)nC({IaUfJK$EVXcoWmgj*n z6wckn3eb9|-sHFvLe$kQPz{A7v<~bvf-3>i1094%Twqez(OzS~X9cKAMThM8i0Szz z(SOsEtJ@lUby9rwL0;cV&e~#ZVr!9c?SX(jty2h=h2y{d6Z(Nw^9|-9EU|Pa>Wvy` z8rFdEh(aj1M_|;oBsiO~;)9k~A|jrf-AQl(pqjR+DGgD4h)nXeCPO#q)0-_DNr*WWFU zR_k19EGBh6e?|e=krENT!1Kp@CRcA902`s4ERT)yNlKSyj~U8tG!a1};Oh4yC%u-S zwnFP{f6o(_N6BAaw0_P$XzJ7LPb>8)kw=-ce@_(OKSmL*A_wYo$$1{98%Z+RS&bg> zPv6Ih?D%gXId>9iB18g=L429cDi+vMA+>;?jI3DNWL91GYOdI}NG)}%BC%bZ$+{+^0n+^pjcVa^kmPaYKxIbtqcMQ7+GFPk;_HUV&+ClqDdKB3YyEvcMh1Ajy$` zExl~}I`mc#{Bo9+sJA`C9AWwRSpFpT!X4d=44Vz1fE@C={kQp52`Zho0;gBC`a2-IaK}E|OI(-a>`3sc z&sf*&Q*_LC&F5trB1eu@TjWW}#~YXOvfhknjZ#Rrv>6$;Jpb7c3HcVI4T!>kydQ5Q zw->ykvXvC6`&nq@P7=bxGqbe=v&Ebpd5_PdKZmVMu7o|iYVKwN*~i&X2obMrDw(Vp zy>>F@dZ2F2H;gV%EeP9z4FMR>oH-#p{RVxGGFj$nnCqI$+$pzVbk1Kb-g}kF1V>g| zP#6lUFU4M==R83%bn%jZuZ;iJrpp}DfHkpONgXJy$iyF zK@WcPZ}iF-N!M0A_oUs1$uX|a;r(Oy^FNeMT3@SxDV7??a+mdJy`ule_UKQ0|3}i; zJi)b4*-Tr^l?d%qr&AG24ZURWiytEM5P(T{xRc)izWjyu1!4Opu9xA>>6zqd?FQ?k zoKJinuVdIvTC_>6S9PGi{gRms_IA6gkbv(V4BE649=q$!t|T($93&h3J4W(P%GMS8 zeTl?R?6Y+26una=EB3=(t z4?oSeSeBx>dA(>aMqxl!ne(U6&pT}%tmWFPF7kCJto1ssyeD(#8K}m7R!y7E1!b|M zXUUqxYkEE6a(DIFU##Zj1RX1{+m+ zB(A^N!^|Uo}6rDJe6AKwASa_C}`6?`@#ndLBsmI_)?uCGivR=l4w|j0nbZZib4eufJ zVCz-buQu8(uX4EgtDSm7&(S6g;J~=V@vW;oJ;PzyqNen7LubXB)!sV!pXv;fE5k1! z7($RV0<)3vYcXf^L9$r9(rsY-+R(m93rH5U`3!(tt0Tce(*B)KE@C=0yy=r4aSUw>3C=Ye6N-lLEVlv431v-Jm3K&nw5v1$!Q@EM|qzn zNgar;OO{s~P&9RJ-GeBABYVQA;zvmEDqLZY^yi&tLr_ArXvJ5pAOI0)LLnoCWo96h zFb(l9;CW)Z_D3(BxY&TuwsE83J$pBqM>!_|B^aH_$X<1=1K1oOYyHsor)To+PI?E& zG~oNIsv|#%H08URJ=3J2nNqu!&ZGSgdO+v*{Wa|5R{ZD6eZZupkt6@uiQ02bQ32Q7 zzir9pIrl|I7%ku{t^25Fxz3!UmKpOIi$z9t34Hyqw?b@VDK~&zts-JHW(ejBSkU}C zvbB-+^AE`HY`lb`q)C#BJ&EkHI<-%`Hv?|h_m5yYQw;zl45ZbHW3bsVJFOf~$-u>cCrcV_jav+l*v#ll6puPLRfvgNxb zY15~h3}P>f?XwOq7j333yvSK)h47|>v_67eE!conjboCyJ@S$T%J!eYzEFMp;cU#b z_ooGW)=&v1qVBRdEo__WGFKQm+tVtZ;L6f4a%Q|m3X;hX02Iv-ZTst7ft+qfc^1GJ zDI9NIa!y4RZS>FZhGb+@RnuwYVGS)b0694&z*pjI`w4CdJ7AlJUuTEIThi^eJ=+|d zKl=Rb!sQ~g4r>8~XH&4O2vBfa*e5KmI?h#WwX&w98d6fRGhJra@I=J9IQ$~6Zmod} zP;TRJwA1L*2(0sqkL?oKSsJMCcyzcAdCYN%5`4oAdbUa_wQgZJT~(lRx(@Em?3V>X ziM<{i_gAlWPvSp8xbHv*p`;K$YQtfCFkwH@GU7cXiG9fv zM{%rE2H`UaK8VbQLy=6^Gkbbcjn3_Ux~|DGXLoaL^U4?^&}89thyC5s$Tq7;-XITA z*KE#bEK^Oc3aN~?%P#whz?~IA&8cCb)X|iJg0*M-c|1yO_Zv6gPe?%)_iwPkSz$35>zMd!r>AhIsCZ#e-)b8=zYW^swH zB}vd7oO6+hta=DmGF!>SlJU(95TJ+y&weJvVhCAvnG|VU7m;1DJ&wCcx6W;Rt-L;+YsU8GH2(m!=Vs9#Dcdg@7j%s)8zN~XYcOW9W zlbo&&VRfIT;yU~wUHw`59{urCfTLh@} znNZv)IDCew7M3Lx0;EK0bF}%ih&Y-nS>o~_OvTF#nbuXxgS4ks4|U3D@i|*e`FB2g zHUVuV4WkPwh$-`E`}#s8vbjLYeQluAC{?_Vh1=iA`J>n)sCp@U$%+F1W%hS_4g7jI zQtujXoBk!9jySLrmPoz)6FNsl3Fji^%PX4K7%Iq6dKu^uZolEX*fwcUsyO_uH=K#H$aX7 zhux>^ah!vs56hmp&~uniUO(cq+)$flyteJtE7JA=3>Jv*UCaaO`C9Bq@?m-Xp6IZe zRpR;xEiZcVCb zKee=CQSM^5YB(DS3ZN+)v|=p$`vCDvg#Umj%j4=U>_$~KC;DI$dP--!By{q7!~6pl z1y`gN=RaHkj3#YQ`(ZD!mgiwW)_m`{(?t&!RoU$O{+_$mh%$4zLH6l~9IijU*u%T_ z8fT{&*ZpBlOH1Jc%hW!=SKth7tS+OQk;{bHkkZHGTpUIg%lhszjwFXwvox#zwjRGuyH(Hzak^rYneVh_P zbHB4mKMS(nR@V1l?~M$h|M)j#`QCoLQwag#wzOpS`;|#>&jg1+o?>`h1_~f&-mk(1 z7(yz1lR017=Jr{%wHOe*3IL$odC080P@N_KaXfhThP5HF07^G-mEDpAD9{WtT{e%4 zdOno)mO>7Ql0;xbcqCr)pn&H8xYb|+A~)NRS^J_P)(ZUpCX{BA?*=j?OaA`_4J&&L z={e4Cxch^EDffWXyj}$TK>{zOHjgs`nfmBc9N%VUq9r?MDNOz+Fbv^?A~n*!MqbEx zk$6COn5r;sgYNOW7aq8uj;ipcrWUeN))>4fX^~J?9-KI15lp&vHUFB~@%A4m$c>
      +xHGrd_zYcH|R~nOS54djq`MaeF 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

      hm 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

      %4Ocm&BH;Uj&U@R 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 UIOjPIG!MF^q;aEA!TiyG0f4c#8UO$Q literal 0 HcmV?d00001 diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/monitoring/nagios/hostgroups.cfg b/pkg/registry/zookeeper-3.4.6/src/contrib/monitoring/nagios/hostgroups.cfg new file mode 100644 index 000000000..ea59a66e8 --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/contrib/monitoring/nagios/hostgroups.cfg @@ -0,0 +1,25 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you 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. + +# A group containing all the ZooKeeper nodes + +define hostgroup { + hostgroup_name zookeeper-servers + alias ZooKeeper Servers + members localhost +} + + diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/monitoring/nagios/services.cfg b/pkg/registry/zookeeper-3.4.6/src/contrib/monitoring/nagios/services.cfg new file mode 100644 index 000000000..dde6ab759 --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/contrib/monitoring/nagios/services.cfg @@ -0,0 +1,67 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you 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. + +# ZooKeeper Node specific services + +define service { + hostgroup_name zookeeper-servers + use generic-service + service_description ZK_Open_File_Descriptors_Count + check_command check_zk_node!zk_open_file_descriptor_count!500!800 +} + +define service { + hostgroup_name zookeeper-servers + use generic-service + service_description ZK_Ephemerals_Count + check_command check_zk_node!zk_ephemerals_count!10000!100000 +} + +define service { + hostgroup_name zookeeper-servers + use generic-service + service_description ZK_Avg_Latency + check_command check_zk_node!zk_avg_latency!500!1000 +} + +define service { + hostgroup_name zookeeper-servers + use generic-service + service_description ZK_Max_Latency + check_command check_zk_node!zk_max_latency!1000!2000 +} + +define service { + hostgroup_name zookeeper-servers + use generic-service + service_description ZK_Min_Latency + check_command check_zk_node!zk_min_latency!500!1000 +} + +define service { + hostgroup_name zookeeper-servers + use generic-service + service_description ZK_Outstanding_Requests + check_command check_zk_node!zk_outstanding_requests!20!50 +} + +define service { + hostgroup_name zookeeper-servers + use generic-service + service_description ZK_Watch_Count + check_command check_zk_node!zk_watch_count!100!500 +} + diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/monitoring/nagios/zookeeper.cfg b/pkg/registry/zookeeper-3.4.6/src/contrib/monitoring/nagios/zookeeper.cfg new file mode 100644 index 000000000..ed4cfab83 --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/contrib/monitoring/nagios/zookeeper.cfg @@ -0,0 +1,30 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you 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. + +# 'check_zookeeper' command definition +define command { + command_name check_zookeeper + command_line /usr/lib/nagios/plugins/check_zookeeper.py -s "localhost:2181,localhost:2182,localhost:2183" -o nagios -k '$ARG1$' -w '$ARG2$' -c '$ARG3$' + # ATTENTION: you should update the list of servers defined above +} + +# 'check_zk_node' command definition +define command { + command_name check_zk_node + command_line /usr/lib/nagios/plugins/check_zookeeper.py -s $HOSTADDRESS$:2181 -o nagios -k '$ARG1$' -w '$ARG2$' -c '$ARG3$' + # ATTENTION: you should update the port. default: 2181 +} + diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/monitoring/test.py b/pkg/registry/zookeeper-3.4.6/src/contrib/monitoring/test.py new file mode 100644 index 000000000..3941291fc --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/contrib/monitoring/test.py @@ -0,0 +1,282 @@ +#! /usr/bin/env python +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you 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. + +import unittest +import socket +import sys + +from StringIO import StringIO + +from check_zookeeper import ZooKeeperServer, NagiosHandler, CactiHandler, GangliaHandler + +ZK_MNTR_OUTPUT = """zk_version\t3.4.0--1, built on 06/19/2010 15:07 GMT +zk_avg_latency\t1 +zk_max_latency\t132 +zk_min_latency\t0 +zk_packets_received\t640 +zk_packets_sent\t639 +zk_outstanding_requests\t0 +zk_server_state\tfollower +zk_znode_count\t4 +zk_watch_count\t0 +zk_ephemerals_count\t0 +zk_approximate_data_size\t27 +zk_open_file_descriptor_count\t22 +zk_max_file_descriptor_count\t1024 +""" + +ZK_MNTR_OUTPUT_WITH_BROKEN_LINES = """zk_version\t3.4.0 +zk_avg_latency\t23 +broken-line + +""" + +ZK_STAT_OUTPUT = """Zookeeper version: 3.3.0-943314, built on 05/11/2010 22:20 GMT +Clients: + /0:0:0:0:0:0:0:1:34564[0](queued=0,recved=1,sent=0) + +Latency min/avg/max: 0/40/121 +Received: 11 +Sent: 10 +Outstanding: 0 +Zxid: 0x700000003 +Mode: follower +Node count: 4 +""" + +class SocketMock(object): + def __init__(self): + self.sent = [] + + def settimeout(self, timeout): + self.timeout = timeout + + def connect(self, address): + self.address = address + + def send(self, data): + self.sent.append(data) + return len(data) + + def recv(self, size): + return ZK_MNTR_OUTPUT[:size] + + def close(self): pass + +class ZK33xSocketMock(SocketMock): + def __init__(self): + SocketMock.__init__(self) + self.got_stat_cmd = False + + def recv(self, size): + if 'stat' in self.sent: + return ZK_STAT_OUTPUT[:size] + else: + return '' + +class UnableToConnectSocketMock(SocketMock): + def connect(self, _): + raise socket.error('[Errno 111] Connection refused') + +def create_server_mock(socket_class): + class ZooKeeperServerMock(ZooKeeperServer): + def _create_socket(self): + return socket_class() + return ZooKeeperServerMock() + +class TestCheckZookeeper(unittest.TestCase): + + def setUp(self): + self.zk = ZooKeeperServer() + + def test_parse_valid_line(self): + key, value = self.zk._parse_line('something\t5') + + self.assertEqual(key, 'something') + self.assertEqual(value, 5) + + def test_parse_line_raises_exception_on_invalid_output(self): + invalid_lines = ['something', '', 'a\tb\tc', '\t1'] + for line in invalid_lines: + self.assertRaises(ValueError, self.zk._parse_line, line) + + def test_parser_on_valid_output(self): + data = self.zk._parse(ZK_MNTR_OUTPUT) + + self.assertEqual(len(data), 14) + self.assertEqual(data['zk_znode_count'], 4) + + def test_parse_should_ignore_invalid_lines(self): + data = self.zk._parse(ZK_MNTR_OUTPUT_WITH_BROKEN_LINES) + + self.assertEqual(len(data), 2) + + def test_parse_stat_valid_output(self): + data = self.zk._parse_stat(ZK_STAT_OUTPUT) + + result = { + 'zk_version' : '3.3.0-943314, built on 05/11/2010 22:20 GMT', + 'zk_min_latency' : 0, + 'zk_avg_latency' : 40, + 'zk_max_latency' : 121, + 'zk_packets_received': 11, + 'zk_packets_sent': 10, + 'zk_server_state': 'follower', + 'zk_znode_count': 4 + } + for k, v in result.iteritems(): + self.assertEqual(v, data[k]) + + def test_recv_valid_output(self): + zk = create_server_mock(SocketMock) + + data = zk.get_stats() + self.assertEqual(len(data), 14) + self.assertEqual(data['zk_znode_count'], 4) + + def test_socket_unable_to_connect(self): + zk = create_server_mock(UnableToConnectSocketMock) + + self.assertRaises(socket.error, zk.get_stats) + + def test_use_stat_cmd_if_mntr_is_not_available(self): + zk = create_server_mock(ZK33xSocketMock) + + data = zk.get_stats() + self.assertEqual(data['zk_version'], '3.3.0-943314, built on 05/11/2010 22:20 GMT') + +class HandlerTestCase(unittest.TestCase): + + def setUp(self): + try: + sys._stdout + except: + sys._stdout = sys.stdout + + sys.stdout = StringIO() + + def tearDown(self): + sys.stdout = sys._stdout + + def output(self): + sys.stdout.seek(0) + return sys.stdout.read() + + +class TestNagiosHandler(HandlerTestCase): + + def _analyze(self, w, c, k, stats): + class Opts(object): + warning = w + critical = c + key = k + + return NagiosHandler().analyze(Opts(), {'localhost:2181':stats}) + + def test_ok_status(self): + r = self._analyze(10, 20, 'a', {'a': 5}) + + self.assertEqual(r, 0) + self.assertEqual(self.output(), 'Ok "a"!|localhost:2181=5;10;20\n') + + r = self._analyze(20, 10, 'a', {'a': 30}) + self.assertEqual(r, 0) + + def test_warning_status(self): + r = self._analyze(10, 20, 'a', {'a': 15}) + self.assertEqual(r, 1) + self.assertEqual(self.output(), + 'Warning "a" localhost:2181!|localhost:2181=15;10;20\n') + + r = self._analyze(20, 10, 'a', {'a': 15}) + self.assertEqual(r, 1) + + def test_critical_status(self): + r = self._analyze(10, 20, 'a', {'a': 30}) + self.assertEqual(r, 2) + self.assertEqual(self.output(), + 'Critical "a" localhost:2181!|localhost:2181=30;10;20\n') + + r = self._analyze(20, 10, 'a', {'a': 5}) + self.assertEqual(r, 2) + + def test_check_a_specific_key_on_all_hosts(self): + class Opts(object): + warning = 10 + critical = 20 + key = 'latency' + + r = NagiosHandler().analyze(Opts(), { + 's1:2181': {'latency': 5}, + 's2:2181': {'latency': 15}, + 's3:2181': {'latency': 35}, + }) + self.assertEqual(r, 2) + self.assertEqual(self.output(), + 'Critical "latency" s3:2181!|s1:2181=5;10;20 '\ + 's3:2181=35;10;20 s2:2181=15;10;20\n') + +class TestCactiHandler(HandlerTestCase): + class Opts(object): + key = 'a' + leader = False + + def __init__(self, leader=False): + self.leader = leader + + def test_output_values_for_all_hosts(self): + r = CactiHandler().analyze(TestCactiHandler.Opts(), { + 's1:2181':{'a':1}, + 's2:2181':{'a':2, 'b':3} + }) + self.assertEqual(r, None) + self.assertEqual(self.output(), 's1_2181:1 s2_2181:2') + + def test_output_single_value_for_leader(self): + r = CactiHandler().analyze(TestCactiHandler.Opts(leader=True), { + 's1:2181': {'a':1, 'zk_server_state': 'leader'}, + 's2:2181': {'a':2} + }) + self.assertEqual(r, 0) + self.assertEqual(self.output(), '1\n') + + +class TestGangliaHandler(unittest.TestCase): + + class TestableGangliaHandler(GangliaHandler): + def __init__(self): + GangliaHandler.__init__(self) + self.cli_calls = [] + + def call(self, cli): + self.cli_calls.append(' '.join(cli)) + + def test_send_single_metric(self): + class Opts(object): + @property + def gmetric(self): return '/usr/bin/gmetric' + opts = Opts() + + h = TestGangliaHandler.TestableGangliaHandler() + h.analyze(opts, {'localhost:2181':{'latency':10}}) + + cmd = "%s -n latency -v 10 -t uint32" % opts.gmetric + assert cmd in h.cli_calls + +if __name__ == '__main__': + unittest.main() + diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/rest/NOTICE.txt b/pkg/registry/zookeeper-3.4.6/src/contrib/rest/NOTICE.txt new file mode 100644 index 000000000..2a9225442 --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/contrib/rest/NOTICE.txt @@ -0,0 +1,7 @@ +This contrib module includes software developed under the +COMMON DEVELOPMENT AND DISTRIBUTION LICENSE (CDDL) Version 1.0 + +This contrib depends on binary only jar libraries developed at: + +https://jersey.dev.java.net/ +https://grizzly.dev.java.net/ diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/rest/README.txt b/pkg/registry/zookeeper-3.4.6/src/contrib/rest/README.txt new file mode 100644 index 000000000..30f2e5d19 --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/contrib/rest/README.txt @@ -0,0 +1,72 @@ + +ZooKeeper REST implementation using Jersey JAX-RS. +-------------------------------------------------- + +This is an implementation of version 2 of the ZooKeeper REST spec. + +Note: This interface is currently experimental, may change at any time, +etc... In general you should be using the Java/C client bindings to access +the ZooKeeper server. + +This REST ZooKeeper gateway is useful because most of the languages +have built-in support for working with HTTP based protocols. + +See SPEC.txt for details on the REST binding. + +Quickstart: +----------- + +1) start a zookeeper server on localhost port 2181 + +2) run "ant run" + +3) use a REST client to access the data (see below for more details) + + curl http://localhost:9998/znodes/v1/ + +or use the provided src/python scripts + + zk_dump_tree.py + + +Tests: +---------- + +1) the full testsuite can be run via "ant test" target +2) the python client library also contains a test suite + +Examples Using CURL +------------------- + +First review the spec SPEC.txt in this directory. + +#get the root node data +curl http://localhost:9998/znodes/v1/ + +#get children of the root node +curl http://localhost:9998/znodes/v1/?view=children + +#get "/cluster1/leader" as xml (default is json) +curl -H'Accept: application/xml' http://localhost:9998/znodes/v1/cluster1/leader + +#get the data as text +curl -w "\n%{http_code}\n" "http://localhost:9998/znodes/v1/cluster1/leader?dataformat=utf8" + +#set a node (data.txt contains the ascii text you want to set on the node) +curl -T data.txt -w "\n%{http_code}\n" "http://localhost:9998/znodes/v1/cluster1/leader?dataformat=utf8" + +#create a node +curl -d "data1" -H'Content-Type: application/octet-stream' -w "\n%{http_code}\n" "http://localhost:9998/znodes/v1/?op=create&name=cluster2&dataformat=utf8" + +curl -d "data2" -H'Content-Type: application/octet-stream' -w "\n%{http_code}\n" "http://localhost:9998/znodes/v1/cluster2?op=create&name=leader&dataformat=utf8" + +#create a new session +curl -d "" -H'Content-Type: application/octet-stream' -w "\n%{http_code}\n" "http://localhost:9998/sessions/v1/?op=create&expire=10" + +#session heartbeat +curl -X "PUT" -H'Content-Type: application/octet-stream' -w "\n%{http_code}\n" "http://localhost:9998/sessions/v1/02dfdcc8-8667-4e53-a6f8-ca5c2b495a72" + +#delete a session +curl -X "DELETE" -H'Content-Type: application/octet-stream' -w "\n%{http_code}\n" "http://localhost:9998/sessions/v1/02dfdcc8-8667-4e53-a6f8-ca5c2b495a72" + + diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/rest/SPEC.txt b/pkg/registry/zookeeper-3.4.6/src/contrib/rest/SPEC.txt new file mode 100644 index 000000000..8c5f70175 --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/contrib/rest/SPEC.txt @@ -0,0 +1,355 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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. + +A REST HTTP gateway for ZooKeeper +================================= + +Specification Version: 2 + +ZooKeeper is meant to enable distributed coordination and also store +system configuration and other relatively small amounts of information +that must be stored in a persistent and consistent manner. The +information stored in ZooKeeper is meant to be highly available to a +large number of nodes in a distributed-computing cluster. + +ZooKeeper offers a client-side library that supports rich semantics +that include strict ordering guarantees on operations, the creation of +ephemeral znodes, and the ability to watch for changes to state. +However, where clients need simple "CRUD" (create, read, update, +delete) operations, the ZooKeeper libraries can be cumbersome, both to +the programmers who have to use them (who are increasingly used to +REST-style APIs), and to the operators who have to deploy and update +them (for whom deploying and updating client libraries can be very +painful). + +It turns out that most languages comes with client libraries for HTTP +that are easy and familiar to program against, and deployed as part of +the language runtime. Thus, for simple CRUD clients, an HTTP gateway +would be a less cumbersome interface than the ZooKeeper library. + +This document describes a gatway for using HTTP to interact with a +ZooKeeper repository. + +Binding ZooKeeper to HTTP +------------------------- + +Encoding +-------- + +UTF-8 unless otherwise noted + +Paths +----- + +A ZooKeeper paths are mapped to IRIs and URIs as follows. ZK paths +are converted to IRIs by simply percent-encoding any characters in the +ZK path that are not allowed in IRI paths. ZK paths are converted to +URIs by mapping them first to IRIs, then converting to URIs in the +standard way. + +Going from URIs and IRIs is the reverse of the above but for one +difference: any "." and ".." segments in an IRI or URI must be folded +before conversion. (Fortunately, ZK does not allow "." and ".." +segments in its paths.) + +ZK and IRIs recommend the same practices when it comes to Unicode +normalization: ultimately, normalization is left to application +designers, but both recommend that application designers use NFC as a +best practice. + +Root +---- + +The following examples assume that the ZooKeeper znode heirarchy is +bound to the root of the HTTP servers namespace. This may not be the +case in practice however, the gateway may bind to some prefix, for +example the URL for accessing /a/b/c may be: + + http://localhost/zookeeper/znodes/v1/a/b/c + +This is perfectly valid. Users of the REST service should be aware of +this fact and code their clients to support any root (in this case +"/zookeeper" on the server localhost). + + +Basics: GET, PUT, HEAD, and DELETE +---------------------------------- + +HTTP's GET, PUT, HEAD, and DELETE operations map naturally to +ZooKeeper's "get," "set," "exists," and "delete" operations. + +ZooKeeper znodes have a version number that changes each time the +znode's value is updated. This number is returned by "get," "set," and +"exists" operations. The "set" and "delete" operations optionally take +a version number. If one is supplied, then "set" or "delete" will fail +if the current version of the znode doesn't match the version-number +supplied in the call. This mechanism supports atomic read-modify-write +cycles. Set/delete requests may include an optional parameter +"version" which defaults to no version check. + + +Getting ZooKeeper children +-------------------------- + +We overload the GET method to return the children of a ZooKeeper. In +particular, the GET method takes an optional parameter "view" which +could be set to one of type values, either "data" or "children". The +default is "data". Thus, to get the children of a znode named +"/a/b/c", then the GET request should start: + + GET /znodes/v1/a/b/c?view=children HTTP/1.1 + +If the requested view is "data", then the data of a znode is returned +as described in the previous section. If the requested view is +"children", then a list of children is returned in either an XML +document, or in a JSON object. (The default is JSON, but this can be +controlled changed by setting the Accept header.) + + +Creating a ZooKeeper session +---------------------------- + +In order to be able to create ephemeral nodes you first need to start +a new session. + + POST /sessions/v1?op=create&expire= HTTP/1.1 + +If the session creation is successful, then a 201 code will be returned. + +A session is just an UUID that you can pass around as a parameter and +the REST server will foward your request on the attached persistent +connection. + +Keeping a session alive +----------------------- + +To keep a session alive you must send hearbeat requests: + + PUT /sessions/v1/ HTTP/1.1 + +Closing a ZooKeeper session +--------------------------- + +You can close a connection by sending a DELETE request. + + DELETE /sessions/v1/ HTTP/1.1 + +If you don't close a session it will automatically expire after +the amount of time you specified on creation. + +Creating a ZooKeeper znode +-------------------------- + +We use the POST method to create a ZooKeeper znode. For example, to +create a znode named "c" under a parent named "/a/b", then the POST +request should start: + + POST /znodes/v1/a/b?op=create&name=c HTTP/1.1 + +If the creation is successful, then a 201 code will be returned. If +it fails, then a number of different codes might be returned +(documented in a later subsection). + +ZooKeeper's create operation has a flag that tells the server to +append a sequence-number to the client-supplied znode-name in order to +make the znode-name unique. If you set this flag and ask to create a +znode named "/a/b/c", and a znode named "/a/b" already exists, then +"create" will create a znode named "/a/b/c-#" instead, where "#" is and +integer required to generate a unique name in for format %10d. + +To obtain this behavior, an additional "sequence=true" parameter +should be added to the parameters of the POST. (Note that "sequence" +is an optional parameter, that defaults to "false"; this default may +be provided explicitly if desired.) + +On success the actual path of the created znode will be returned. + +If you want to create an ephemeral node you need to specify an +additional "ephemeral=true" parameter. (Note that "ephemeral" is an optional +parameter, that defaults to "false") + +(Note: ZooKeeper also allows the client to set ACLs for the +newly-created znode. This feature is not currently supported by the +HTTP gateway to ZooKeeper.) + + +Content types and negotiation +----------------------------- + +ZooKeeper REST gateway implementations may support three content-types +for request and response messages: + +* application/octet-stream + + HEAD - returns nothing (note below: status = 204) + GET - returns the znode data as an octet-stream + PUT - send binary data, returns nothing + POST - send binary data, returns the name of the znode + DELETE - returns nothing + + For PUT and HEAD some other content-type (i.e. JSON or XML) must be + used to access the Stat information of a znode. + +* application/json, application/javascript & application/xml + + HEAD - returns nothing + GET - returns a STAT or CHILD structure + PUT - send binary data, returns a STAT structure (sans data field) + POST - send binary data, returns a PATH structure + DELETE - returns nothing + + (structures defined below) + + Results returning DATA may include an optional "dataformat" + parameter which has two possible values; base64 (default) or + utf8. This allows the caller to control the format of returned data + and may simplify usage -- for example cat'ing results to the command + line with something like curl, or accessing a url through a browser. + Care should be exercised however, if utf8 is used on non character + data errors may result. + + "application/javascript" requests may include an optional "callback" + parameter. The response is wrapped in a callback method of your + choice. e.g. appending &callback=foo to your request will result in + a response body of: foo(...). Callbacks may only contain + alphanumeric characters and underscores. + +PATH + path : string + uri: string + + path is the full path to the znode as seen by ZooKeeper + + uri is the full URI of the znode as seen by the REST server, does not + include any query parameters (i.e. it's the path to the REST resource) + +SESSION + id : string UUID + uri : string + +CHILD + PATH + child_uri_template: string + children : [ string* ] + + The children list of strings contains only the name of the child + znodes, not the full path. + + child_uri_template is a template for URI of child znodes as seen by the + REST server. e.g. "http://localhost:9998/znodes/v1/foo/{child}", where + foo is the parent node, and {child} can be substituted with the name + of each child in the children array in order to access that resource. + This template is provided to simplify child access. + +STAT + PATH + encoding : value of "base64" or "utf8" + data : base64 or utf8 encoded string + stat : + czxid : number + mzxid : number + ctime : number + mtime : number + version : number + cversion : number + aversion : number + ephemeralOwner : number + datalength : number + numChildren : number + pzxid : number + + +Error Codes +----------- + +The ZooKeeper gateway uses HTTP response codes as follows: + + * 200 (Success) - ZOK for "get" "set" "delete", "yes" case of "exists" (json/xml) + * 201 (Created) - ZOK for "create" + * 204 (No Content) - ZOK for "yes" case of "exists" (octet) + * 400 (Bad Request) - ZINVALIDACL, ZBADARGUMENTS, version param not a number + * 401 (Unauthorized) - ZAUTHFAILED + * 404 (Not Found) - ZOK for "no" case of "exists;" ZNONODE for "get," "set," and "delete" + * 409 (Conflict) - ZNODEEXISTS, ZNONODE for "create," ZNOTEMPTY, + * 412 (Precondition Failed) - ZBADVERSION + * 415 (Unsupported Media Type) - if content-type of PUT or POST is not "application/octet-stream" + * 500 (Internal Server Error) - Failure in gateway code + * 501 (Not Implemented) - HTTP method other than GET, PUT, HEAD, DELETE + * 502 (Bad Gateway) - All other ZooKeeper error codes + * 503 (Service Unavailable) - ZSESSIONEXPIRED, ZCONNECTIONLOSS, (gateway will try to reestablish the connection, but will not hold the request waiting...) + * 504 (Gateway Timeout) - ZOPERATIONTIMEOUT, or ZooKeeper does not return in a timely manner + +Note that these are the codes used by the HTTP-to-Gateway software +itself. Depending on how this software is configured into a Web +server, the resulting Web Server might behave differently, e.g., it +might do redirection, check other headers, etc. + +Error Messages +-------------- + +Error messages are returned to the caller, format is dependent on the +format requested in the call. + +* application/octet-stream + + A string containing the error message. It should include the request + and information detailing the reason for the error. + +* application/json + + { "request":"GET /a/b/c", "message":"Node doesn't exist" } + +* application/xml + + + + GET /a/b/c + Node doesn't exist + + + +Binding ZooKeeper to an HTTP server +----------------------------------- + +It might be sage to assume that everyone is happy to run an Apache +server, and thus write a "mod_zookeeper" for Apache that works only +for the Apache Web Server. However, different operational +environments prefer different Web Servers, and it would be nice to +support more than one Web server. + +Issues: + + * Configuration. + + * Defining a root: Need to provide a URL alias and associate it + with a server. Need to be able to map different aliases to + different servers (implemented via multiple ZK connections). + + * Sharing connection across multiple processes. + + * Asynchronous. + + * Adaptors. + + * Code re-use. + + +Authentication -- TBD, not currently supported + +...the config file should contain authentication material for the gateway + +...the config file should contain an ACL list to be passed along to "create" + +...would we ever want to authenticate each request to ZooKeeper?... diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/rest/build.xml b/pkg/registry/zookeeper-3.4.6/src/contrib/rest/build.xml new file mode 100644 index 000000000..649dff752 --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/contrib/rest/build.xml @@ -0,0 +1,167 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Tests failed! + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/rest/conf/keys/README b/pkg/registry/zookeeper-3.4.6/src/contrib/rest/conf/keys/README new file mode 100644 index 000000000..085810a06 --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/contrib/rest/conf/keys/README @@ -0,0 +1,8 @@ + +In order to generate .jks (java keystore files) you need to use keytool. + +The password for the existing .jks is "123456" (without quotes). + +Some tutorials: + - http://www.mobilefish.com/tutorials/java/java_quickguide_keytool.html + diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/rest/conf/keys/rest.cer b/pkg/registry/zookeeper-3.4.6/src/contrib/rest/conf/keys/rest.cer new file mode 100644 index 0000000000000000000000000000000000000000..13e5aabe562f0d0507d3c6709a3a3527ce258f19 GIT binary patch literal 595 zcmXqLV)8d=V%)KSnTe5!iNz;sF0TPE8>d#AN85K^Mn+av27??!0RuiZ=1>+kVfN6x z?7aN)JeUXvh6p=`2p5J3H--o^T*N?5oY&C6z{0@P(9qDt$S_Kr*Vxp+*vK5prL$`q z=Oc#(BP#=QV=se2V<%H%BSYWbGS>f3PJXvm4%r-kd}HQ?l{*@lYdP% zKXaEoN*khNe+YWI`;11mY-+!bZpKk1GMmr3`n#2w6gv+_ab<1?{)@-|1UO&Uzt2^?V`hx> zo~?GG?UC!1EZ6iZIv5CUjxayK`25YYdr9R_ivm4AKHV<1dRh-#_&ZUf9R~ND9?75o t@hPEFdt$!Tolof%M$N1r7$#`FG}+r_l_j^PQl#fZW6;l-MbVp5Spm(9$n*dJ literal 0 HcmV?d00001 diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/rest/conf/keys/rest.jks b/pkg/registry/zookeeper-3.4.6/src/contrib/rest/conf/keys/rest.jks new file mode 100644 index 0000000000000000000000000000000000000000..539e8be7ba44e0dc3cb39deb822280a4fbde67af GIT binary patch literal 1363 zcmezO_TO6u1_mY|W&~r_+{*0KN+3_m@oVinpv*3VCZ=r$d~96WY>X_7T1J%57Nhc{i> zJWVv!CM&G;pKJ1F`Eydn8DX>4x8`(zSaIhqXF2aCF+QER+=YLS?SH#k?)!w(4c&fo zKk7Exu6e?c<~~{0x^8-+)!C|#nx4Hzp%*`A+gLFCy?gR@u13_fpKF5B^E}t?QD%LX z5p!;a2&0!zztzrfJQuE4uuNJz`+_ZBGXGRVy~N3x4_sq@ysP*sD<$b(+QLw~VQJf^ zd%r)51}K^S)hT4q6me+0D9Pv@6J+`QNqwBGgq^QW4wu%!!n^-UrdS<5b^R%C&&%0P z4eY^tdmqbnE^cj!_&3>X`nC5{w^9e zOV{?oh78_@+vR1aT0TYTHiXuHXY6O4zsqcjWq|M#uBH@?gkBxv?ea?9mlr9w-cks; z<5yI3Pe;MtdVc*b<0GF$T{e}uME}mUG`jcx%f88*G<9O4!+j;~a@{pL%g+A(@Jsf@ z=Dq*Q*%@A0*#j|HF%N9H1UsSl@e|w@_=G=0DQ{9(pYLv@+i)F7E zot$-blI}ET?>>)`3LA&Fys;T}5$&;VX zoqQ30pgLpU^H+)C8_%s;vC4ev#pda=)_ZVdtqgBtnY6HBD);ulD=Ujc=gm9guO7C` zI#kts=@Fg01SN4H%hnr74-PjUoAOCKvE6O*RIl|H+AnAQ?t&!f2t88+OJG6{1}0>G zgC@ou3z(T0nV497qUQ1%@Un4gwRyCC=LM!}RtAF{Ljhn?XAWgy6J`(1%g)O$&x46@ zV2H3|h;U(uaASxt!$l0_#CZ)33@i*x4Gj%Vj0~g1d5ujCjE&5pTspg^aXxZr05dsr zV=se2V<%H%BSYWbGS>f3PJXvm4%r-kd}HQ?l{*@lYdP%KXaEoN*khN ze+YWI`; z11mY-+!bZpKk1GMmr3`n#2w6gv+_ab<1?{)@-|1UO&Uzt2^?V`hx>o~?GG?UC!1 zEZ6iZIv5CUjxayK`25YYdr9R_ivm4AKHV<1dRh-#_&ZUf9R~ND9?75o@hPEFdt$!T zolof%M$N1r7$#`FG}+r_l_j^PQl#fZW6;l-MbVp5S#Ql>`)8x9kFnIL9nVyf=6eU7 H+RO<6^fNHf literal 0 HcmV?d00001 diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/rest/conf/log4j.properties b/pkg/registry/zookeeper-3.4.6/src/contrib/rest/conf/log4j.properties new file mode 100644 index 000000000..c294b3d4e --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/contrib/rest/conf/log4j.properties @@ -0,0 +1,72 @@ +# +# +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you 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. +# +# + +# +# ZooKeeper Logging Configuration +# + +# Format is " (, )+ + +# DEFAULT: console appender only +log4j.rootLogger=INFO, CONSOLE + +# Example with rolling log file +#log4j.rootLogger=DEBUG, CONSOLE, ROLLINGFILE + +# Example with rolling log file and tracing +#log4j.rootLogger=TRACE, CONSOLE, ROLLINGFILE, TRACEFILE + +# +# Log INFO level and above messages to the console +# +log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender +log4j.appender.CONSOLE.Threshold=INFO +log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout +log4j.appender.CONSOLE.layout.ConversionPattern=%d{ISO8601} - %-5p - [%t:%C{1}@%L] - %m%n + +# +# Add ROLLINGFILE to rootLogger to get log file output +# Log DEBUG level and above messages to a log file +log4j.appender.ROLLINGFILE=org.apache.log4j.ConsoleAppender +log4j.appender.ROLLINGFILE.Threshold=DEBUG +log4j.appender.ROLLINGFILE.File=bookkeeper.log +log4j.appender.ROLLINGFILE.layout=org.apache.log4j.PatternLayout +log4j.appender.ROLLINGFILE.layout.ConversionPattern=%d{ISO8601} - %-5p - [%t:%C{1}@%L] - %m%n + +# Max log file size of 10MB +log4j.appender.ROLLINGFILE.MaxFileSize=10MB +# uncomment the next line to limit number of backup files +#log4j.appender.ROLLINGFILE.MaxBackupIndex=10 + +log4j.appender.ROLLINGFILE.layout=org.apache.log4j.PatternLayout +log4j.appender.ROLLINGFILE.layout.ConversionPattern=%d{ISO8601} - %-5p [%t:%C{1}@%L] - %m%n + + +# +# Add TRACEFILE to rootLogger to get log file output +# Log DEBUG level and above messages to a log file +log4j.appender.TRACEFILE=org.apache.log4j.FileAppender +log4j.appender.TRACEFILE.Threshold=TRACE +log4j.appender.TRACEFILE.File=bookkeeper_trace.log + +log4j.appender.TRACEFILE.layout=org.apache.log4j.PatternLayout +### Notice we are including log4j's NDC here (%x) +log4j.appender.TRACEFILE.layout.ConversionPattern=%d{ISO8601} - %-5p [%t:%C{1}@%L][%x] - %m%n diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/rest/conf/rest.properties b/pkg/registry/zookeeper-3.4.6/src/contrib/rest/conf/rest.properties new file mode 100644 index 000000000..f0abb4541 --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/contrib/rest/conf/rest.properties @@ -0,0 +1,70 @@ +# +# +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you 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. +# +# + +# +# ZooKeeper REST Gateway Configuration file +# + +rest.port = 9998 + +# +# Endpoint definition +# + +# plain configuration ; +rest.endpoint.1 = /;localhost:2181,localhost:2182 + +# ... or chrooted to /zookeeper +# rest.endpoint.1 = /;localhost:2181,localhost:2182/zookeeper + +# HTTP Basic authentication for this endpoint +# rest.endpoint.1.http.auth = root:root1 + +# create -e /a data digest:'demo:ojnHEyje6F33LLzGVzg+yatf4Fc=':cdrwa +# any session on this endpoint will use authentication +# rest.endpoint.1.zk.digest = demo:test + +# you can easily generate the ACL using Python: +# import sha; sha.sha('demo:test').digest().encode('base64').strip() + +# +# ... you can define as many endpoints as you wish +# + +# rest.endpoint.2 = /restricted;localhost:2181 +# rest.endpoint.2.http.auth = admin:pass + +# rest.endpoint.3 = /cluster1;localhost:2181,localhost:2182 +# ** you should configure one end-point for each ZooKeeper cluster +# etc. + +# Global HTTP Basic Authentication +# You should also enable HTTPS-only access +# The authentication credentials are sent as plain text + +# rest.http.auth = guest:guest1 + +# Uncomment the lines bellow to allow https-only access + +# rest.ssl = true +# rest.ssl.jks = keys/rest.jks +# rest.ssl.jks.pass = 123456 + \ No newline at end of file diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/rest/ivy.xml b/pkg/registry/zookeeper-3.4.6/src/contrib/rest/ivy.xml new file mode 100644 index 000000000..903d3903e --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/contrib/rest/ivy.xml @@ -0,0 +1,48 @@ + + + + + + + + ZooKeeper REST + + + + + + + + + + + + + + + + + + + + + + + diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/rest/rest.sh b/pkg/registry/zookeeper-3.4.6/src/contrib/rest/rest.sh new file mode 100755 index 000000000..daa819836 --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/contrib/rest/rest.sh @@ -0,0 +1,90 @@ +#!/bin/sh + +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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. + +# +# If this scripted is run out of /usr/bin or some other system bin directory +# it should be linked to and not copied. Things like java jar files are found +# relative to the canonical path of this script. +# + +# Only follow symlinks if readlink supports it +if readlink -f "$0" > /dev/null 2>&1 +then + ZKREST=`readlink -f "$0"` +else + ZKREST="$0" +fi +ZKREST_HOME=`dirname "$ZKREST"` + +if $cygwin +then + # cygwin has a "kill" in the shell itself, gets confused + KILL=/bin/kill +else + KILL=kill +fi + +if [ -z $ZKREST_PIDFILE ] + then ZKREST_PIDFILE=$ZKREST_HOME/server.pid +fi + +ZKREST_MAIN=org.apache.zookeeper.server.jersey.RestMain + +ZKREST_CONF=$ZKREST_HOME/conf +ZKREST_LOG=$ZKREST_HOME/zkrest.log + +CLASSPATH="$ZKREST_CONF:$CLASSPATH" + +for i in "$ZKREST_HOME"/lib/*.jar +do + CLASSPATH="$i:$CLASSPATH" +done + +for i in "$ZKREST_HOME"/zookeeper-*.jar +do + CLASSPATH="$i:$CLASSPATH" +done + +case $1 in +start) + echo "Starting ZooKeeper REST Gateway ... " + java -cp "$CLASSPATH" $JVMFLAGS $ZKREST_MAIN >$ZKREST_LOG 2>&1 & + /bin/echo -n $! > "$ZKREST_PIDFILE" + echo STARTED + ;; +stop) + echo "Stopping ZooKeeper REST Gateway ... " + if [ ! -f "$ZKREST_PIDFILE" ] + then + echo "error: could not find file $ZKREST_PIDFILE" + exit 1 + else + $KILL -9 $(cat "$ZKREST_PIDFILE") + rm "$ZKREST_PIDFILE" + echo STOPPED + fi + ;; +restart) + shift + "$0" stop ${@} + sleep 3 + "$0" start ${@} + ;; +*) + echo "Usage: $0 {start|stop|restart}" >&2 + +esac diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/rest/src/java/org/apache/zookeeper/server/jersey/RestMain.java b/pkg/registry/zookeeper-3.4.6/src/contrib/rest/src/java/org/apache/zookeeper/server/jersey/RestMain.java new file mode 100644 index 000000000..954ad045b --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/contrib/rest/src/java/org/apache/zookeeper/server/jersey/RestMain.java @@ -0,0 +1,151 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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. + */ + +package org.apache.zookeeper.server.jersey; + +import java.io.File; +import java.io.IOException; +import java.net.URISyntaxException; +import java.net.URL; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.apache.zookeeper.server.jersey.cfg.Credentials; +import org.apache.zookeeper.server.jersey.cfg.Endpoint; +import org.apache.zookeeper.server.jersey.cfg.RestCfg; +import org.apache.zookeeper.server.jersey.filters.HTTPBasicAuth; + +import com.sun.grizzly.SSLConfig; +import com.sun.grizzly.http.embed.GrizzlyWebServer; +import com.sun.grizzly.http.servlet.ServletAdapter; +import com.sun.jersey.spi.container.servlet.ServletContainer; + +/** + * Demonstration of how to run the REST service using Grizzly + */ +public class RestMain { + + private static Logger LOG = LoggerFactory.getLogger(RestMain.class); + + private GrizzlyWebServer gws; + private RestCfg cfg; + + public RestMain(RestCfg cfg) { + this.cfg = cfg; + } + + public void start() throws IOException { + System.out.println("Starting grizzly ..."); + + boolean useSSL = cfg.useSSL(); + gws = new GrizzlyWebServer(cfg.getPort(), "/tmp/23cxv45345/2131xc2/", useSSL); + // BUG: Grizzly needs a doc root if you are going to register multiple adapters + + for (Endpoint e : cfg.getEndpoints()) { + ZooKeeperService.mapContext(e.getContext(), e); + gws.addGrizzlyAdapter(createJerseyAdapter(e), new String[] { e + .getContext() }); + } + + if (useSSL) { + System.out.println("Starting SSL ..."); + String jks = cfg.getJKS("keys/rest.jks"); + String jksPassword = cfg.getJKSPassword(); + + SSLConfig sslConfig = new SSLConfig(); + URL resource = getClass().getClassLoader().getResource(jks); + if (resource == null) { + LOG.error("Unable to find the keystore file: " + jks); + System.exit(2); + } + try { + sslConfig.setKeyStoreFile(new File(resource.toURI()) + .getAbsolutePath()); + } catch (URISyntaxException e1) { + LOG.error("Unable to load keystore: " + jks, e1); + System.exit(2); + } + sslConfig.setKeyStorePass(jksPassword); + gws.setSSLConfig(sslConfig); + } + + gws.start(); + } + + public void stop() { + gws.stop(); + ZooKeeperService.closeAll(); + } + + private ServletAdapter createJerseyAdapter(Endpoint e) { + ServletAdapter jersey = new ServletAdapter(); + + jersey.setServletInstance(new ServletContainer()); + jersey.addInitParameter("com.sun.jersey.config.property.packages", + "org.apache.zookeeper.server.jersey.resources"); + jersey.setContextPath(e.getContext()); + + Credentials c = Credentials.join(e.getCredentials(), cfg + .getCredentials()); + if (!c.isEmpty()) { + jersey.addFilter(new HTTPBasicAuth(c), e.getContext() + + "-basic-auth", null); + } + + return jersey; + } + + /** + * The entry point for starting the server + * + */ + public static void main(String[] args) throws Exception { + RestCfg cfg = new RestCfg("rest.properties"); + + final RestMain main = new RestMain(cfg); + main.start(); + + Runtime.getRuntime().addShutdownHook(new Thread() { + @Override + public void run() { + main.stop(); + System.out.println("Got exit request. Bye."); + } + }); + + printEndpoints(cfg); + System.out.println("Server started."); + } + + private static void printEndpoints(RestCfg cfg) { + int port = cfg.getPort(); + + for (Endpoint e : cfg.getEndpoints()) { + + String context = e.getContext(); + if (context.charAt(context.length() - 1) != '/') { + context += "/"; + } + + System.out.println(String.format( + "Started %s - WADL: http://localhost:%d%sapplication.wadl", + context, port, context)); + } + } + +} diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/rest/src/java/org/apache/zookeeper/server/jersey/ZooKeeperService.java b/pkg/registry/zookeeper-3.4.6/src/contrib/rest/src/java/org/apache/zookeeper/server/jersey/ZooKeeperService.java new file mode 100644 index 000000000..21d27a993 --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/contrib/rest/src/java/org/apache/zookeeper/server/jersey/ZooKeeperService.java @@ -0,0 +1,242 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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. + */ + +package org.apache.zookeeper.server.jersey; + +import java.io.IOException; +import java.util.HashMap; +import java.util.Map; +import java.util.Set; +import java.util.Timer; +import java.util.TimerTask; +import java.util.TreeSet; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.apache.zookeeper.WatchedEvent; +import org.apache.zookeeper.Watcher; +import org.apache.zookeeper.ZooKeeper; +import org.apache.zookeeper.Watcher.Event.KeeperState; +import org.apache.zookeeper.server.jersey.cfg.Endpoint; + +/** + * Singleton which provides JAX-RS resources access to the ZooKeeper client. + * There's a single session for each base uri (so usually just one). + */ +public class ZooKeeperService { + + private static Logger LOG = LoggerFactory.getLogger(ZooKeeperService.class); + + /** Map base uri to ZooKeeper host:port parameters */ + private static Map contextMap = new HashMap(); + + /** Map base uri to ZooKeeper session */ + private static Map zkMap = new HashMap(); + + /** Session timers */ + private static Map zkSessionTimers = new HashMap(); + private static Timer timer = new Timer(); + + /** Track the status of the ZooKeeper session */ + private static class MyWatcher implements Watcher { + final String contextPath; + + /** Separate watcher for each base uri */ + public MyWatcher(String contextPath) { + this.contextPath = contextPath; + } + + /** + * Track state - in particular watch for expiration. if it happens for + * re-creation of the ZK client session + */ + synchronized public void process(WatchedEvent event) { + if (event.getState() == KeeperState.Expired) { + close(contextPath); + } + } + } + + /** ZooKeeper session timer */ + private static class SessionTimerTask extends TimerTask { + + private int delay; + private String contextPath, session; + private Timer timer; + + public SessionTimerTask(int delayInSeconds, String session, + String contextPath, Timer timer) { + delay = delayInSeconds * 1000; // convert to milliseconds + this.contextPath = contextPath; + this.session = session; + this.timer = timer; + reset(); + } + + public SessionTimerTask(SessionTimerTask t) { + this(t.delay / 1000, t.session, t.contextPath, t.timer); + } + + @Override + public void run() { + if (LOG.isInfoEnabled()) { + LOG.info(String.format("Session '%s' expired after " + + "'%d' milliseconds.", session, delay)); + } + ZooKeeperService.close(contextPath, session); + } + + public void reset() { + timer.schedule(this, delay); + } + + } + + /** + * Specify ZooKeeper host:port for a particular context path. The host:port + * string is passed to the ZK client, so this can be formatted with more + * than a single host:port pair. + */ + synchronized public static void mapContext(String contextPath, Endpoint e) { + contextMap.put(contextPath, e); + } + + /** + * Reset timer for a session + */ + synchronized public static void resetTimer(String contextPath, + String session) { + if (session != null) { + String uri = concat(contextPath, session); + + SessionTimerTask t = zkSessionTimers.remove(uri); + t.cancel(); + + zkSessionTimers.put(uri, new SessionTimerTask(t)); + } + } + + /** + * Close the ZooKeeper session and remove it from the internal maps + */ + public static void close(String contextPath) { + close(contextPath, null); + } + + /** + * Close the ZooKeeper session and remove it + */ + synchronized public static void close(String contextPath, String session) { + String uri = concat(contextPath, session); + + TimerTask t = zkSessionTimers.remove(uri); + if (t != null) { + t.cancel(); + } + + ZooKeeper zk = zkMap.remove(uri); + if (zk == null) { + return; + } + try { + zk.close(); + } catch (InterruptedException e) { + LOG.error("Interrupted while closing ZooKeeper connection.", e); + } + } + + /** + * Close all the ZooKeeper sessions and remove them from the internal maps + */ + synchronized public static void closeAll() { + Set sessions = new TreeSet(zkMap.keySet()); + for (String key : sessions) { + close(key); + } + } + + /** + * Is there an active connection for this session? + */ + synchronized public static boolean isConnected(String contextPath, + String session) { + return zkMap.containsKey(concat(contextPath, session)); + } + + /** + * Return a ZooKeeper client not tied to a specific session. + */ + public static ZooKeeper getClient(String contextPath) throws IOException { + return getClient(contextPath, null); + } + + /** + * Return a ZooKeeper client for a session with a default expire time + * + * @throws IOException + */ + public static ZooKeeper getClient(String contextPath, String session) + throws IOException { + return getClient(contextPath, session, 5); + } + + /** + * Return a ZooKeeper client which may or may not be connected, but it will + * not be expired. This method can be called multiple times, the same object + * will be returned except in the case where the session expires (at which + * point a new session will be returned) + */ + synchronized public static ZooKeeper getClient(String contextPath, + String session, int expireTime) throws IOException { + final String connectionId = concat(contextPath, session); + + ZooKeeper zk = zkMap.get(connectionId); + if (zk == null) { + + if (LOG.isInfoEnabled()) { + LOG.info(String.format("creating new " + + "connection for : '%s'", connectionId)); + } + Endpoint e = contextMap.get(contextPath); + zk = new ZooKeeper(e.getHostPort(), 30000, new MyWatcher( + connectionId)); + + for (Map.Entry p : e.getZooKeeperAuthInfo().entrySet()) { + zk.addAuthInfo("digest", String.format("%s:%s", p.getKey(), + p.getValue()).getBytes()); + } + + zkMap.put(connectionId, zk); + + // a session should automatically expire after an amount of time + if (session != null) { + zkSessionTimers.put(connectionId, new SessionTimerTask( + expireTime, session, contextPath, timer)); + } + } + return zk; + } + + private static String concat(String contextPath, String session) { + if (session != null) { + return String.format("%s@%s", contextPath, session); + } + return contextPath; + } + +} diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/rest/src/java/org/apache/zookeeper/server/jersey/cfg/Credentials.java b/pkg/registry/zookeeper-3.4.6/src/contrib/rest/src/java/org/apache/zookeeper/server/jersey/cfg/Credentials.java new file mode 100644 index 000000000..0730be57c --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/contrib/rest/src/java/org/apache/zookeeper/server/jersey/cfg/Credentials.java @@ -0,0 +1,47 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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. + */ + +package org.apache.zookeeper.server.jersey.cfg; + +import java.util.HashMap; + +public class Credentials extends HashMap { + + public static Credentials join(Credentials a, Credentials b) { + Credentials result = new Credentials(); + result.putAll(a); + result.putAll(b); + return result; + } + + public Credentials() { + super(); + } + + public Credentials(String credentials) { + super(); + + if (!credentials.trim().equals("")) { + String[] parts = credentials.split(","); + for(String p : parts) { + String[] userPass = p.split(":"); + put(userPass[0], userPass[1]); + } + } + } +} diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/rest/src/java/org/apache/zookeeper/server/jersey/cfg/Endpoint.java b/pkg/registry/zookeeper-3.4.6/src/contrib/rest/src/java/org/apache/zookeeper/server/jersey/cfg/Endpoint.java new file mode 100644 index 000000000..2a6278250 --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/contrib/rest/src/java/org/apache/zookeeper/server/jersey/cfg/Endpoint.java @@ -0,0 +1,72 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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. + */ + +package org.apache.zookeeper.server.jersey.cfg; + +public class Endpoint { + + private String context; + private HostPortSet hostPort; + private Credentials credentials; + private Credentials zookeeperAuth; + + public Endpoint(String context, String hostPortList) { + this.context = context; + this.hostPort = new HostPortSet(hostPortList); + } + + public String getContext() { + return context; + } + + public String getHostPort() { + return hostPort.toString(); + } + + public Credentials getCredentials() { + return credentials; + } + + public void setCredentials(String c) { + this.credentials = new Credentials(c); + } + + public void setZooKeeperAuthInfo(String digest) { + zookeeperAuth = new Credentials(digest); + } + + public final Credentials getZooKeeperAuthInfo() { + return zookeeperAuth; + } + + @Override + public boolean equals(Object o) { + Endpoint e = (Endpoint) o; + return context.equals(e.context); + } + + @Override + public int hashCode() { + return context.hashCode(); + } + + @Override + public String toString() { + return String.format("", context, hostPort.toString()); + } +} diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/rest/src/java/org/apache/zookeeper/server/jersey/cfg/HostPort.java b/pkg/registry/zookeeper-3.4.6/src/contrib/rest/src/java/org/apache/zookeeper/server/jersey/cfg/HostPort.java new file mode 100644 index 000000000..51a1bdd2c --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/contrib/rest/src/java/org/apache/zookeeper/server/jersey/cfg/HostPort.java @@ -0,0 +1,51 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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. + */ + +package org.apache.zookeeper.server.jersey.cfg; + +public class HostPort { + + private String host; + private int port; + + public HostPort(String hostPort) { + String[] parts = hostPort.split(":"); + host = parts[0]; + port = Integer.parseInt(parts[1]); + } + + public String getHost() { + return host; + } + + public int getPort() { + return port; + } + + @Override + public boolean equals(Object o) { + HostPort p = (HostPort) o; + return host.equals(p.host) && port == p.port; + } + + @Override + public int hashCode() { + return String.format("%s:%d", host, port).hashCode(); + } + +} diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/rest/src/java/org/apache/zookeeper/server/jersey/cfg/HostPortSet.java b/pkg/registry/zookeeper-3.4.6/src/contrib/rest/src/java/org/apache/zookeeper/server/jersey/cfg/HostPortSet.java new file mode 100644 index 000000000..301a5656c --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/contrib/rest/src/java/org/apache/zookeeper/server/jersey/cfg/HostPortSet.java @@ -0,0 +1,51 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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. + */ + +package org.apache.zookeeper.server.jersey.cfg; + +import java.util.HashSet; +import java.util.Set; + +public class HostPortSet { + + private Set hostPortSet = new HashSet(); + private String original; + + public HostPortSet(String hostPortList) { + original = hostPortList; + + int chrootStart = hostPortList.indexOf('/'); + String hostPortPairs; + if (chrootStart != -1) { + hostPortPairs = hostPortList.substring(0, chrootStart); + } else { + hostPortPairs = hostPortList; + } + + String[] parts = hostPortPairs.split(","); + for(String p : parts) { + hostPortSet.add(new HostPort(p)); + } + } + + @Override + public String toString() { + return original; + } + +} diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/rest/src/java/org/apache/zookeeper/server/jersey/cfg/RestCfg.java b/pkg/registry/zookeeper-3.4.6/src/contrib/rest/src/java/org/apache/zookeeper/server/jersey/cfg/RestCfg.java new file mode 100644 index 000000000..c7730201d --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/contrib/rest/src/java/org/apache/zookeeper/server/jersey/cfg/RestCfg.java @@ -0,0 +1,106 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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. + */ + +package org.apache.zookeeper.server.jersey.cfg; + +import java.io.IOException; +import java.io.InputStream; +import java.util.HashSet; +import java.util.Properties; +import java.util.Set; + +public class RestCfg { + + private Properties cfg = new Properties(); + + private Set endpoints = new HashSet(); + private Credentials credentials = new Credentials(); + + public RestCfg(String resource) throws IOException { + this(RestCfg.class.getClassLoader().getResourceAsStream(resource)); + } + + public RestCfg(InputStream io) throws IOException { + cfg.load(io); + extractEndpoints(); + extractCredentials(); + } + + private void extractCredentials() { + if (cfg.containsKey("rest.http.auth")) { + credentials = new Credentials(cfg.getProperty("rest.http.auth", "")); + } + } + + private void extractEndpoints() { + int count = 1; + while (true) { + String e = cfg.getProperty( + String.format("rest.endpoint.%d", count), null); + if (e == null) { + break; + } + + String[] parts = e.split(";"); + if (parts.length != 2) { + count++; + continue; + } + Endpoint point = new Endpoint(parts[0], parts[1]); + + String c = cfg.getProperty(String.format( + "rest.endpoint.%d.http.auth", count), ""); + point.setCredentials(c); + + String digest = cfg.getProperty(String.format( + "rest.endpoint.%d.zk.digest", count), ""); + point.setZooKeeperAuthInfo(digest); + + endpoints.add(point); + count++; + } + } + + public int getPort() { + return Integer.parseInt(cfg.getProperty("rest.port", "9998")); + } + + public boolean useSSL() { + return Boolean.valueOf(cfg.getProperty("rest.ssl", "false")); + } + + public final Set getEndpoints() { + return endpoints; + } + + public final Credentials getCredentials() { + return credentials; + } + + public String getJKS() { + return cfg.getProperty("rest.ssl.jks"); + } + + public String getJKS(String def) { + return cfg.getProperty("rest.ssl.jks", def); + } + + public String getJKSPassword() { + return cfg.getProperty("rest.ssl.jks.pass"); + } +} diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/rest/src/java/org/apache/zookeeper/server/jersey/filters/HTTPBasicAuth.java b/pkg/registry/zookeeper-3.4.6/src/contrib/rest/src/java/org/apache/zookeeper/server/jersey/filters/HTTPBasicAuth.java new file mode 100644 index 000000000..49640b530 --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/contrib/rest/src/java/org/apache/zookeeper/server/jersey/filters/HTTPBasicAuth.java @@ -0,0 +1,87 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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. + */ + +package org.apache.zookeeper.server.jersey.filters; + +import java.io.IOException; + +import javax.servlet.Filter; +import javax.servlet.FilterChain; +import javax.servlet.FilterConfig; +import javax.servlet.ServletException; +import javax.servlet.ServletRequest; +import javax.servlet.ServletResponse; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import org.apache.zookeeper.server.jersey.cfg.Credentials; + +import com.sun.jersey.core.util.Base64; + +public class HTTPBasicAuth implements Filter { + + private Credentials credentials; + + public HTTPBasicAuth(Credentials c) { + credentials = c; + } + + @Override + public void doFilter(ServletRequest req0, ServletResponse resp0, + FilterChain chain) throws IOException, ServletException { + + HttpServletRequest request = (HttpServletRequest) req0; + HttpServletResponse response = (HttpServletResponse) resp0; + + String authorization = request.getHeader("Authorization"); + if (authorization != null) { + String c[] = parseAuthorization(authorization); + if (c != null && credentials.containsKey(c[0]) + && credentials.get(c[0]).equals(c[1])) { + chain.doFilter(request, response); + return; + } + } + + response.setHeader("WWW-Authenticate", "Basic realm=\"Restricted\""); + response.sendError(401); + } + + private String[] parseAuthorization(String authorization) { + String parts[] = authorization.split(" "); + if (parts.length == 2 && parts[0].equalsIgnoreCase("Basic")) { + String userPass = Base64.base64Decode(parts[1]); + + int p = userPass.indexOf(":"); + if (p != -1) { + return new String[] { userPass.substring(0, p), + userPass.substring(p + 1) }; + } + } + return null; + } + + @Override + public void init(FilterConfig arg0) throws ServletException { + } + + @Override + public void destroy() { + } + +} diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/rest/src/java/org/apache/zookeeper/server/jersey/jaxb/ZChildren.java b/pkg/registry/zookeeper-3.4.6/src/contrib/rest/src/java/org/apache/zookeeper/server/jersey/jaxb/ZChildren.java new file mode 100644 index 000000000..b3fad5544 --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/contrib/rest/src/java/org/apache/zookeeper/server/jersey/jaxb/ZChildren.java @@ -0,0 +1,80 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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. + */ + +package org.apache.zookeeper.server.jersey.jaxb; + +import java.util.ArrayList; +import java.util.List; + +import javax.xml.bind.annotation.XmlElement; +import javax.xml.bind.annotation.XmlElementWrapper; +import javax.xml.bind.annotation.XmlRootElement; + + +/** + * Represents the CHILD using JAXB. + * Special JSON version is required to get proper formatting in both + * JSON and XML output. See details in ZNodeResource. + */ +@XmlRootElement(name="child") +public class ZChildren { + public String path; + public String uri; + + public String child_uri_template; + @XmlElementWrapper(name="children") + @XmlElement(name="child") + public List children; + + public ZChildren() { + // needed by jersey + children = new ArrayList(); + } + + public ZChildren(String path, String uri, String child_uri_template, + List children) + { + this.path = path; + this.uri = uri; + this.child_uri_template = child_uri_template; + if (children != null) { + this.children = children; + } else { + this.children = new ArrayList(); + } + } + + @Override + public int hashCode() { + return path.hashCode(); + } + + @Override + public boolean equals(Object obj) { + if (!(obj instanceof ZChildren)) { + return false; + } + ZChildren o = (ZChildren) obj; + return path.equals(o.path) && children.equals(o.children); + } + + @Override + public String toString() { + return "ZChildren(" + path + "," + children + ")"; + } +} diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/rest/src/java/org/apache/zookeeper/server/jersey/jaxb/ZChildrenJSON.java b/pkg/registry/zookeeper-3.4.6/src/contrib/rest/src/java/org/apache/zookeeper/server/jersey/jaxb/ZChildrenJSON.java new file mode 100644 index 000000000..0dcece07e --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/contrib/rest/src/java/org/apache/zookeeper/server/jersey/jaxb/ZChildrenJSON.java @@ -0,0 +1,76 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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. + */ + +package org.apache.zookeeper.server.jersey.jaxb; + +import java.util.ArrayList; +import java.util.List; + +import javax.xml.bind.annotation.XmlRootElement; + + +/** + * Represents the CHILD using JAXB. + * Special JSON version is required to get proper formatting in both + * JSON and XML output. See details in ZNodeResource. + */ +@XmlRootElement(name="child") +public class ZChildrenJSON { + public String path; + public String uri; + + public String child_uri_template; + public List children; + + public ZChildrenJSON() { + // needed by jersey + children = new ArrayList(); + } + + public ZChildrenJSON(String path, String uri, String child_uri_template, + List children) + { + this.path = path; + this.uri = uri; + this.child_uri_template = child_uri_template; + if (children != null) { + this.children = children; + } else { + this.children = new ArrayList(); + } + } + + @Override + public int hashCode() { + return path.hashCode(); + } + + @Override + public boolean equals(Object obj) { + if (!(obj instanceof ZChildrenJSON)) { + return false; + } + ZChildrenJSON o = (ZChildrenJSON) obj; + return path.equals(o.path) && children.equals(o.children); + } + + @Override + public String toString() { + return "ZChildrenJSON(" + path + "," + children + ")"; + } +} diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/rest/src/java/org/apache/zookeeper/server/jersey/jaxb/ZError.java b/pkg/registry/zookeeper-3.4.6/src/contrib/rest/src/java/org/apache/zookeeper/server/jersey/jaxb/ZError.java new file mode 100644 index 000000000..e976ee0e3 --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/contrib/rest/src/java/org/apache/zookeeper/server/jersey/jaxb/ZError.java @@ -0,0 +1,41 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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. + */ + +package org.apache.zookeeper.server.jersey.jaxb; + +import javax.xml.bind.annotation.XmlRootElement; + + +/** + * Represents an ERROR using JAXB. + */ +@XmlRootElement(name="error") +public class ZError { + public String request; + public String message; + + public ZError(){ + // needed by jersey + } + + public ZError(String request, String message) { + this.request = request; + this.message = message; + } + +} diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/rest/src/java/org/apache/zookeeper/server/jersey/jaxb/ZPath.java b/pkg/registry/zookeeper-3.4.6/src/contrib/rest/src/java/org/apache/zookeeper/server/jersey/jaxb/ZPath.java new file mode 100644 index 000000000..4d8371780 --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/contrib/rest/src/java/org/apache/zookeeper/server/jersey/jaxb/ZPath.java @@ -0,0 +1,63 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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. + */ + +package org.apache.zookeeper.server.jersey.jaxb; + +import javax.xml.bind.annotation.XmlRootElement; + + +/** + * Represents a PATH using JAXB. + */ +@XmlRootElement(name="path") +public class ZPath { + public String path; + public String uri; + + public ZPath(){ + // needed by jersey + } + + public ZPath(String path) { + this(path, null); + } + + public ZPath(String path, String uri) { + this.path = path; + this.uri = uri; + } + + @Override + public int hashCode() { + return path.hashCode(); + } + + @Override + public boolean equals(Object obj) { + if (!(obj instanceof ZPath)) { + return false; + } + ZPath o = (ZPath) obj; + return path.equals(o.path); + } + + @Override + public String toString() { + return "ZPath(" + path + ")"; + } +} diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/rest/src/java/org/apache/zookeeper/server/jersey/jaxb/ZSession.java b/pkg/registry/zookeeper-3.4.6/src/contrib/rest/src/java/org/apache/zookeeper/server/jersey/jaxb/ZSession.java new file mode 100644 index 000000000..06ca9e57b --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/contrib/rest/src/java/org/apache/zookeeper/server/jersey/jaxb/ZSession.java @@ -0,0 +1,55 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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. + */ + +package org.apache.zookeeper.server.jersey.jaxb; + +import javax.xml.bind.annotation.XmlRootElement; + +@XmlRootElement(name="session") +public class ZSession { + public String id; + public String uri; + + public ZSession() { + // needed by jersey + } + + public ZSession(String id, String uri) { + this.id = id; + this.uri = uri; + } + + @Override + public int hashCode() { + return id.hashCode(); + } + + @Override + public boolean equals(Object obj) { + if(!(obj instanceof ZSession)) { + return false; + } + ZSession s = (ZSession) obj; + return id.equals(s.id); + } + + @Override + public String toString() { + return "ZSession(" + id +")"; + } +} diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/rest/src/java/org/apache/zookeeper/server/jersey/jaxb/ZStat.java b/pkg/registry/zookeeper-3.4.6/src/contrib/rest/src/java/org/apache/zookeeper/server/jersey/jaxb/ZStat.java new file mode 100644 index 000000000..af70d1826 --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/contrib/rest/src/java/org/apache/zookeeper/server/jersey/jaxb/ZStat.java @@ -0,0 +1,106 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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. + */ + +package org.apache.zookeeper.server.jersey.jaxb; + +import javax.xml.bind.annotation.XmlRootElement; + + +/** + * Represents a STAT using JAXB. + */ +@XmlRootElement(name="stat") +public class ZStat { + public String path; + public String uri; + public byte[] data64; + public String dataUtf8; + + public long czxid; + public long mzxid; + public long ctime; + public long mtime; + public int version; + public int cversion; + public int aversion; + public long ephemeralOwner; + public int dataLength; + public int numChildren; + public long pzxid; + + + public ZStat(){ + // needed by jersey + } + + public ZStat(String path, byte[] data64, String dataUtf8) + { + this.path = path; + this.data64 = data64; + this.dataUtf8 = dataUtf8; + } + + public ZStat(String path, String uri, byte[] data64, String dataUtf8, + long czxid, long mzxid, long ctime, long mtime, int version, + int cversion, int aversion, long ephemeralOwner, int dataLength, + int numChildren, long pzxid) + { + this.path = path; + this.uri = uri; + this.data64 = data64; + this.dataUtf8 = dataUtf8; + + this.czxid = czxid; + this.mzxid = mzxid; + this.ctime = ctime; + this.mtime = mtime; + this.version = version; + this.cversion = cversion; + this.aversion = aversion; + this.ephemeralOwner = ephemeralOwner; + this.dataLength = dataLength; + this.numChildren = numChildren; + this.pzxid = pzxid; + } + + @Override + public int hashCode() { + return path.hashCode(); + } + + /** + * This method considers two ZStats equal if their path, encoding, and + * data match. It does not compare the ZooKeeper + * org.apache.zookeeper.data.Stat class fields. + */ + @Override + public boolean equals(Object obj) { + if (!(obj instanceof ZStat)) { + return false; + } + ZStat o = (ZStat) obj; + return toString().equals(o.toString()); + } + + @Override + public String toString() { + return "ZStat(" + path + "," + "b64[" + + (data64 == null ? null : new String(data64)) + "]," + + dataUtf8 + ")"; + } +} diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/rest/src/java/org/apache/zookeeper/server/jersey/resources/JAXBContextResolver.java b/pkg/registry/zookeeper-3.4.6/src/contrib/rest/src/java/org/apache/zookeeper/server/jersey/resources/JAXBContextResolver.java new file mode 100644 index 000000000..08935868f --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/contrib/rest/src/java/org/apache/zookeeper/server/jersey/resources/JAXBContextResolver.java @@ -0,0 +1,72 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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. + */ + +package org.apache.zookeeper.server.jersey.resources; + +import java.util.Arrays; +import java.util.HashSet; +import java.util.Set; + +import javax.ws.rs.ext.ContextResolver; +import javax.ws.rs.ext.Provider; +import javax.xml.bind.JAXBContext; + +import org.apache.zookeeper.server.jersey.jaxb.ZChildrenJSON; +import org.apache.zookeeper.server.jersey.jaxb.ZPath; +import org.apache.zookeeper.server.jersey.jaxb.ZStat; + +import com.sun.jersey.api.json.JSONConfiguration; +import com.sun.jersey.api.json.JSONJAXBContext; + +/** + * Tell Jersey how to resolve JSON formatting. Specifically detail the + * fields which are arrays and which are numbers (not strings). + */ +@Provider +@SuppressWarnings("unchecked") +public final class JAXBContextResolver implements ContextResolver { + private final JAXBContext context; + + private final Set typesSet; + + public JAXBContextResolver() throws Exception { + Class[] typesArr = + new Class[]{ZPath.class, ZStat.class, ZChildrenJSON.class}; + typesSet = new HashSet(Arrays.asList(typesArr)); + context = new JSONJAXBContext( + JSONConfiguration.mapped() + .arrays("children") + .nonStrings("czxid") + .nonStrings("mzxid") + .nonStrings("ctime") + .nonStrings("mtime") + .nonStrings("version") + .nonStrings("cversion") + .nonStrings("aversion") + .nonStrings("ephemeralOwner") + .nonStrings("dataLength") + .nonStrings("numChildren") + .nonStrings("pzxid") + .build(), + typesArr); + } + + public JAXBContext getContext(Class objectType) { + return (typesSet.contains(objectType)) ? context : null; + } +} diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/rest/src/java/org/apache/zookeeper/server/jersey/resources/KeeperExceptionMapper.java b/pkg/registry/zookeeper-3.4.6/src/contrib/rest/src/java/org/apache/zookeeper/server/jersey/resources/KeeperExceptionMapper.java new file mode 100644 index 000000000..fdfc27b5c --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/contrib/rest/src/java/org/apache/zookeeper/server/jersey/resources/KeeperExceptionMapper.java @@ -0,0 +1,86 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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. + */ + +package org.apache.zookeeper.server.jersey.resources; + +import javax.ws.rs.core.Context; +import javax.ws.rs.core.Response; +import javax.ws.rs.core.UriInfo; +import javax.ws.rs.ext.ExceptionMapper; +import javax.ws.rs.ext.Provider; + +import org.apache.zookeeper.KeeperException; +import org.apache.zookeeper.server.jersey.jaxb.ZError; + + +/** + * Map KeeperException to HTTP status codes + */ +@Provider +public class KeeperExceptionMapper implements ExceptionMapper { + private UriInfo ui; + + public KeeperExceptionMapper(@Context UriInfo ui) { + this.ui = ui; + } + + public Response toResponse(KeeperException e) { + Response.Status status; + String message; + + String path = e.getPath(); + + switch(e.code()) { + case AUTHFAILED: + status = Response.Status.UNAUTHORIZED; + message = path + " not authorized"; + break; + case BADARGUMENTS: + status = Response.Status.BAD_REQUEST; + message = path + " bad arguments"; + break; + case BADVERSION: + status = Response.Status.PRECONDITION_FAILED; + message = path + " bad version"; + break; + case INVALIDACL: + status = Response.Status.BAD_REQUEST; + message = path + " invalid acl"; + break; + case NODEEXISTS: + status = Response.Status.CONFLICT; + message = path + " already exists"; + break; + case NONODE: + status = Response.Status.NOT_FOUND; + message = path + " not found"; + break; + case NOTEMPTY: + status = Response.Status.CONFLICT; + message = path + " not empty"; + break; + default: + status = Response.Status.fromStatusCode(502); // bad gateway + message = "Error processing request for " + path + + " : " + e.getMessage(); + } + + return Response.status(status).entity( + new ZError(ui.getRequestUri().toString(), message)).build(); + } +} diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/rest/src/java/org/apache/zookeeper/server/jersey/resources/RuntimeExceptionMapper.java b/pkg/registry/zookeeper-3.4.6/src/contrib/rest/src/java/org/apache/zookeeper/server/jersey/resources/RuntimeExceptionMapper.java new file mode 100644 index 000000000..46f33bb43 --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/contrib/rest/src/java/org/apache/zookeeper/server/jersey/resources/RuntimeExceptionMapper.java @@ -0,0 +1,55 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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. + */ + +package org.apache.zookeeper.server.jersey.resources; + +import javax.ws.rs.WebApplicationException; +import javax.ws.rs.core.Context; +import javax.ws.rs.core.Response; +import javax.ws.rs.core.UriInfo; +import javax.ws.rs.ext.ExceptionMapper; +import javax.ws.rs.ext.Provider; + +import org.apache.zookeeper.server.jersey.jaxb.ZError; + +/** + * Map RuntimeException to HTTP status codes + */ +@Provider +public class RuntimeExceptionMapper + implements ExceptionMapper +{ + private UriInfo ui; + + public RuntimeExceptionMapper(@Context UriInfo ui) { + this.ui = ui; + } + + public Response toResponse(RuntimeException e) { + // don't try to handle jersey exceptions ourselves + if (e instanceof WebApplicationException) { + WebApplicationException ie =(WebApplicationException) e; + return ie.getResponse(); + } + + return Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity( + new ZError(ui.getRequestUri().toString(), + "Error processing request due to " + e + )).build(); + } +} diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/rest/src/java/org/apache/zookeeper/server/jersey/resources/SessionsResource.java b/pkg/registry/zookeeper-3.4.6/src/contrib/rest/src/java/org/apache/zookeeper/server/jersey/resources/SessionsResource.java new file mode 100644 index 000000000..0744604e8 --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/contrib/rest/src/java/org/apache/zookeeper/server/jersey/resources/SessionsResource.java @@ -0,0 +1,135 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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. + */ + +package org.apache.zookeeper.server.jersey.resources; + +import java.io.IOException; +import java.net.URI; +import java.util.UUID; + +import javax.servlet.http.HttpServletRequest; +import javax.ws.rs.Consumes; +import javax.ws.rs.DELETE; +import javax.ws.rs.DefaultValue; +import javax.ws.rs.POST; +import javax.ws.rs.PUT; +import javax.ws.rs.Path; +import javax.ws.rs.PathParam; +import javax.ws.rs.Produces; +import javax.ws.rs.QueryParam; +import javax.ws.rs.WebApplicationException; +import javax.ws.rs.core.Context; +import javax.ws.rs.core.MediaType; +import javax.ws.rs.core.Response; +import javax.ws.rs.core.UriInfo; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.apache.zookeeper.server.jersey.ZooKeeperService; +import org.apache.zookeeper.server.jersey.jaxb.ZError; +import org.apache.zookeeper.server.jersey.jaxb.ZSession; + +import com.sun.jersey.api.json.JSONWithPadding; + +@Path("sessions/v1/{session: .*}") +public class SessionsResource { + + private static Logger LOG = LoggerFactory.getLogger(SessionsResource.class); + + private String contextPath; + + public SessionsResource(@Context HttpServletRequest request) { + contextPath = request.getContextPath(); + if (contextPath.equals("")) { + contextPath = "/"; + } + } + + @PUT + @Produces( { MediaType.APPLICATION_JSON, "application/javascript", + MediaType.APPLICATION_XML }) + @Consumes(MediaType.APPLICATION_OCTET_STREAM) + public Response keepAliveSession(@PathParam("session") String session, + @Context UriInfo ui, byte[] data) { + + if (!ZooKeeperService.isConnected(contextPath, session)) { + throwNotFound(session, ui); + } + + ZooKeeperService.resetTimer(contextPath, session); + return Response.status(Response.Status.OK).build(); + } + + @POST + @Produces( { MediaType.APPLICATION_JSON, "application/javascript", + MediaType.APPLICATION_XML }) + public Response createSession(@QueryParam("op") String op, + @DefaultValue("5") @QueryParam("expire") String expire, + @Context UriInfo ui) { + if (!op.equals("create")) { + throw new WebApplicationException(Response.status( + Response.Status.BAD_REQUEST).entity( + new ZError(ui.getRequestUri().toString(), "")).build()); + } + + int expireInSeconds; + try { + expireInSeconds = Integer.parseInt(expire); + } catch (NumberFormatException e) { + throw new WebApplicationException(Response.status( + Response.Status.BAD_REQUEST).build()); + } + + String uuid = UUID.randomUUID().toString(); + while (ZooKeeperService.isConnected(contextPath, uuid)) { + uuid = UUID.randomUUID().toString(); + } + + // establish the connection to the ZooKeeper cluster + try { + ZooKeeperService.getClient(contextPath, uuid, expireInSeconds); + } catch (IOException e) { + LOG.error("Failed while trying to create a new session", e); + + throw new WebApplicationException(Response.status( + Response.Status.INTERNAL_SERVER_ERROR).build()); + } + + URI uri = ui.getAbsolutePathBuilder().path(uuid).build(); + return Response.created(uri).entity( + new JSONWithPadding(new ZSession(uuid, uri.toString()))) + .build(); + } + + @DELETE + @Produces( { MediaType.APPLICATION_JSON, "application/javascript", + MediaType.APPLICATION_XML, MediaType.APPLICATION_OCTET_STREAM }) + public void deleteSession(@PathParam("session") String session, + @Context UriInfo ui) { + ZooKeeperService.close(contextPath, session); + } + + private static void throwNotFound(String session, UriInfo ui) + throws WebApplicationException { + throw new WebApplicationException(Response.status( + Response.Status.NOT_FOUND).entity( + new ZError(ui.getRequestUri().toString(), session + + " not found")).build()); + } + +} diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/rest/src/java/org/apache/zookeeper/server/jersey/resources/ZErrorWriter.java b/pkg/registry/zookeeper-3.4.6/src/contrib/rest/src/java/org/apache/zookeeper/server/jersey/resources/ZErrorWriter.java new file mode 100644 index 000000000..706ab89f1 --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/contrib/rest/src/java/org/apache/zookeeper/server/jersey/resources/ZErrorWriter.java @@ -0,0 +1,63 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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. + */ + +package org.apache.zookeeper.server.jersey.resources; + +import java.io.IOException; +import java.io.OutputStream; +import java.io.PrintStream; +import java.lang.annotation.Annotation; +import java.lang.reflect.Type; + +import javax.ws.rs.Produces; +import javax.ws.rs.WebApplicationException; +import javax.ws.rs.core.MediaType; +import javax.ws.rs.core.MultivaluedMap; +import javax.ws.rs.ext.MessageBodyWriter; +import javax.ws.rs.ext.Provider; + +import org.apache.zookeeper.server.jersey.jaxb.ZError; + +/** + * Tell Jersey how to format an octet response error message. + */ +@Produces(MediaType.APPLICATION_OCTET_STREAM) +@Provider +public class ZErrorWriter implements MessageBodyWriter { + + public long getSize(ZError t, Class type, Type genericType, + Annotation[] annotations, MediaType mediaType) { + return -1; + } + + public boolean isWriteable(Class type, Type genericType, + Annotation[] annotations, MediaType mediaType) { + return ZError.class.isAssignableFrom(type); + } + + public void writeTo(ZError t, Class type, Type genericType, + Annotation[] annotations, MediaType mediaType, + MultivaluedMap httpHeaders, + OutputStream os) + throws IOException, WebApplicationException + { + PrintStream p = new PrintStream(os); + p.print("Request " + t.request + " failed due to " + t.message); + p.flush(); + } +} diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/rest/src/java/org/apache/zookeeper/server/jersey/resources/ZNodeResource.java b/pkg/registry/zookeeper-3.4.6/src/contrib/rest/src/java/org/apache/zookeeper/server/jersey/resources/ZNodeResource.java new file mode 100644 index 000000000..77371eab5 --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/contrib/rest/src/java/org/apache/zookeeper/server/jersey/resources/ZNodeResource.java @@ -0,0 +1,412 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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. + */ + +package org.apache.zookeeper.server.jersey.resources; + +import java.io.IOException; +import java.net.URI; +import java.util.ArrayList; +import java.util.List; + +import javax.servlet.http.HttpServletRequest; +import javax.ws.rs.Consumes; +import javax.ws.rs.DELETE; +import javax.ws.rs.DefaultValue; +import javax.ws.rs.GET; +import javax.ws.rs.HEAD; +import javax.ws.rs.POST; +import javax.ws.rs.PUT; +import javax.ws.rs.Path; +import javax.ws.rs.PathParam; +import javax.ws.rs.Produces; +import javax.ws.rs.QueryParam; +import javax.ws.rs.WebApplicationException; +import javax.ws.rs.core.Context; +import javax.ws.rs.core.MediaType; +import javax.ws.rs.core.Response; +import javax.ws.rs.core.UriInfo; + +import org.apache.zookeeper.CreateMode; +import org.apache.zookeeper.KeeperException; +import org.apache.zookeeper.ZooKeeper; +import org.apache.zookeeper.ZooDefs.Ids; +import org.apache.zookeeper.data.Stat; +import org.apache.zookeeper.server.jersey.ZooKeeperService; +import org.apache.zookeeper.server.jersey.jaxb.ZChildren; +import org.apache.zookeeper.server.jersey.jaxb.ZChildrenJSON; +import org.apache.zookeeper.server.jersey.jaxb.ZError; +import org.apache.zookeeper.server.jersey.jaxb.ZPath; +import org.apache.zookeeper.server.jersey.jaxb.ZStat; + +import com.sun.jersey.api.json.JSONWithPadding; + +/** + * Version 1 implementation of the ZooKeeper REST specification. + */ +// TODO test octet fully +@Path("znodes/v1{path: /.*}") +public class ZNodeResource { + private final ZooKeeper zk; + + public ZNodeResource(@DefaultValue("") @QueryParam("session") String session, + @Context UriInfo ui, + @Context HttpServletRequest request + ) + throws IOException { + + String contextPath = request.getContextPath(); + if (contextPath.equals("")) { + contextPath = "/"; + } + if (session.equals("")) { + session = null; + } else if (!ZooKeeperService.isConnected(contextPath, session)) { + throw new WebApplicationException(Response.status( + Response.Status.UNAUTHORIZED).build()); + } + zk = ZooKeeperService.getClient(contextPath, session); + } + + private void ensurePathNotNull(String path) { + if (path == null) { + throw new IllegalArgumentException("Invalid path \"" + path + "\""); + } + } + + @HEAD + @Produces( { MediaType.APPLICATION_JSON, "application/javascript", + MediaType.APPLICATION_XML }) + public Response existsZNode(@PathParam("path") String path, + @Context UriInfo ui) throws InterruptedException, KeeperException { + Stat stat = zk.exists(path, false); + if (stat == null) { + throwNotFound(path, ui); + } + return Response.status(Response.Status.OK).build(); + } + + @HEAD + @Produces( { MediaType.APPLICATION_OCTET_STREAM }) + public Response existsZNodeAsOctet(@PathParam("path") String path, + @Context UriInfo ui) throws InterruptedException, KeeperException { + Stat stat = zk.exists(path, false); + if (stat == null) { + throwNotFound(path, ui); + } + return Response.status(Response.Status.NO_CONTENT).build(); + } + + /* + * getZNodeList and getZNodeListJSON are bogus - but necessary. + * Unfortunately Jersey 1.0.3 is unable to render both xml and json properly + * in the case where a object contains a list/array. It's impossible to get + * it to render properly for both. As a result we need to split into two + * jaxb classes. + */ + + @GET + @Produces( { MediaType.APPLICATION_JSON, "application/javascript" }) + public Response getZNodeListJSON( + @PathParam("path") String path, + @QueryParam("callback") String callback, + @DefaultValue("data") @QueryParam("view") String view, + @DefaultValue("base64") @QueryParam("dataformat") String dataformat, + @Context UriInfo ui) throws InterruptedException, KeeperException { + return getZNodeList(true, path, callback, view, dataformat, ui); + } + + @GET + @Produces(MediaType.APPLICATION_XML) + public Response getZNodeList( + @PathParam("path") String path, + @QueryParam("callback") String callback, + @DefaultValue("data") @QueryParam("view") String view, + @DefaultValue("base64") @QueryParam("dataformat") String dataformat, + @Context UriInfo ui) throws InterruptedException, KeeperException { + return getZNodeList(false, path, callback, view, dataformat, ui); + } + + private Response getZNodeList(boolean json, String path, String callback, + String view, String dataformat, UriInfo ui) + throws InterruptedException, KeeperException { + ensurePathNotNull(path); + + if (view.equals("children")) { + List children = new ArrayList(); + for (String child : zk.getChildren(path, false)) { + children.add(child); + } + + Object child; + String childTemplate = ui.getAbsolutePath().toString(); + if (!childTemplate.endsWith("/")) { + childTemplate += "/"; + } + childTemplate += "{child}"; + if (json) { + child = new ZChildrenJSON(path, + ui.getAbsolutePath().toString(), childTemplate, + children); + } else { + child = new ZChildren(path, ui.getAbsolutePath().toString(), + childTemplate, children); + } + return Response.status(Response.Status.OK).entity( + new JSONWithPadding(child, callback)).build(); + } else { + Stat stat = new Stat(); + byte[] data = zk.getData(path, false, stat); + + byte[] data64; + String dataUtf8; + if (data == null) { + data64 = null; + dataUtf8 = null; + } else if (!dataformat.equals("utf8")) { + data64 = data; + dataUtf8 = null; + } else { + data64 = null; + dataUtf8 = new String(data); + } + ZStat zstat = new ZStat(path, ui.getAbsolutePath().toString(), + data64, dataUtf8, stat.getCzxid(), stat.getMzxid(), stat + .getCtime(), stat.getMtime(), stat.getVersion(), + stat.getCversion(), stat.getAversion(), stat + .getEphemeralOwner(), stat.getDataLength(), stat + .getNumChildren(), stat.getPzxid()); + + return Response.status(Response.Status.OK).entity( + new JSONWithPadding(zstat, callback)).build(); + } + } + + @GET + @Produces(MediaType.APPLICATION_OCTET_STREAM) + public Response getZNodeListAsOctet(@PathParam("path") String path) + throws InterruptedException, KeeperException { + ensurePathNotNull(path); + + Stat stat = new Stat(); + byte[] data = zk.getData(path, false, stat); + + if (data == null) { + return Response.status(Response.Status.NO_CONTENT).build(); + } else { + return Response.status(Response.Status.OK).entity(data).build(); + } + } + + @PUT + @Produces( { MediaType.APPLICATION_JSON, "application/javascript", + MediaType.APPLICATION_XML }) + @Consumes(MediaType.APPLICATION_OCTET_STREAM) + public Response setZNode( + @PathParam("path") String path, + @QueryParam("callback") String callback, + @DefaultValue("-1") @QueryParam("version") String versionParam, + @DefaultValue("base64") @QueryParam("dataformat") String dataformat, + @DefaultValue("false") @QueryParam("null") String setNull, + @Context UriInfo ui, byte[] data) throws InterruptedException, + KeeperException { + ensurePathNotNull(path); + + int version; + try { + version = Integer.parseInt(versionParam); + } catch (NumberFormatException e) { + throw new WebApplicationException(Response.status( + Response.Status.BAD_REQUEST).entity( + new ZError(ui.getRequestUri().toString(), path + + " bad version " + versionParam)).build()); + } + + if (setNull.equals("true")) { + data = null; + } + + Stat stat = zk.setData(path, data, version); + + ZStat zstat = new ZStat(path, ui.getAbsolutePath().toString(), null, + null, stat.getCzxid(), stat.getMzxid(), stat.getCtime(), stat + .getMtime(), stat.getVersion(), stat.getCversion(), + stat.getAversion(), stat.getEphemeralOwner(), stat + .getDataLength(), stat.getNumChildren(), stat + .getPzxid()); + + return Response.status(Response.Status.OK).entity( + new JSONWithPadding(zstat, callback)).build(); + } + + @PUT + @Produces(MediaType.APPLICATION_OCTET_STREAM) + @Consumes(MediaType.APPLICATION_OCTET_STREAM) + public void setZNodeAsOctet(@PathParam("path") String path, + @DefaultValue("-1") @QueryParam("version") String versionParam, + @DefaultValue("false") @QueryParam("null") String setNull, + @Context UriInfo ui, byte[] data) throws InterruptedException, + KeeperException { + ensurePathNotNull(path); + + int version; + try { + version = Integer.parseInt(versionParam); + } catch (NumberFormatException e) { + throw new WebApplicationException(Response.status( + Response.Status.BAD_REQUEST).entity( + new ZError(ui.getRequestUri().toString(), path + + " bad version " + versionParam)).build()); + } + + if (setNull.equals("true")) { + data = null; + } + + zk.setData(path, data, version); + } + + @POST + @Produces( { MediaType.APPLICATION_JSON, "application/javascript", + MediaType.APPLICATION_XML }) + @Consumes(MediaType.APPLICATION_OCTET_STREAM) + public Response createZNode( + @PathParam("path") String path, + @QueryParam("callback") String callback, + @DefaultValue("create") @QueryParam("op") String op, + @QueryParam("name") String name, + @DefaultValue("base64") @QueryParam("dataformat") String dataformat, + @DefaultValue("false") @QueryParam("null") String setNull, + @DefaultValue("false") @QueryParam("sequence") String sequence, + @DefaultValue("false") @QueryParam("ephemeral") String ephemeral, + @Context UriInfo ui, byte[] data) throws InterruptedException, + KeeperException { + ensurePathNotNull(path); + + if (path.equals("/")) { + path += name; + } else { + path += "/" + name; + } + + if (!op.equals("create")) { + throw new WebApplicationException(Response.status( + Response.Status.BAD_REQUEST).entity( + new ZError(ui.getRequestUri().toString(), path + + " bad operaton " + op)).build()); + } + + if (setNull.equals("true")) { + data = null; + } + + CreateMode createMode; + if (sequence.equals("true")) { + if (ephemeral.equals("false")) { + createMode = CreateMode.PERSISTENT_SEQUENTIAL; + } else { + createMode = CreateMode.EPHEMERAL_SEQUENTIAL; + } + } else if (ephemeral.equals("false")) { + createMode = CreateMode.PERSISTENT; + } else { + createMode = CreateMode.EPHEMERAL; + } + + String newPath = zk.create(path, data, Ids.OPEN_ACL_UNSAFE, createMode); + + URI uri = ui.getAbsolutePathBuilder().path(newPath).build(); + + return Response.created(uri).entity( + new JSONWithPadding(new ZPath(newPath, ui.getAbsolutePath() + .toString()))).build(); + } + + @POST + @Produces(MediaType.APPLICATION_OCTET_STREAM) + @Consumes(MediaType.APPLICATION_OCTET_STREAM) + public Response createZNodeAsOctet(@PathParam("path") String path, + @DefaultValue("create") @QueryParam("op") String op, + @QueryParam("name") String name, + @DefaultValue("false") @QueryParam("null") String setNull, + @DefaultValue("false") @QueryParam("sequence") String sequence, + @Context UriInfo ui, byte[] data) throws InterruptedException, + KeeperException { + ensurePathNotNull(path); + + if (path.equals("/")) { + path += name; + } else { + path += "/" + name; + } + + if (!op.equals("create")) { + throw new WebApplicationException(Response.status( + Response.Status.BAD_REQUEST).entity( + new ZError(ui.getRequestUri().toString(), path + + " bad operaton " + op)).build()); + } + + if (setNull.equals("true")) { + data = null; + } + + CreateMode createMode; + if (sequence.equals("true")) { + createMode = CreateMode.PERSISTENT_SEQUENTIAL; + } else { + createMode = CreateMode.PERSISTENT; + } + + String newPath = zk.create(path, data, Ids.OPEN_ACL_UNSAFE, createMode); + + URI uri = ui.getAbsolutePathBuilder().path(newPath).build(); + + return Response.created(uri).entity( + new ZPath(newPath, ui.getAbsolutePath().toString())).build(); + } + + @DELETE + @Produces( { MediaType.APPLICATION_JSON, "application/javascript", + MediaType.APPLICATION_XML, MediaType.APPLICATION_OCTET_STREAM }) + public void deleteZNode(@PathParam("path") String path, + @DefaultValue("-1") @QueryParam("version") String versionParam, + @Context UriInfo ui) throws InterruptedException, KeeperException { + ensurePathNotNull(path); + + int version; + try { + version = Integer.parseInt(versionParam); + } catch (NumberFormatException e) { + throw new WebApplicationException(Response.status( + Response.Status.BAD_REQUEST).entity( + new ZError(ui.getRequestUri().toString(), path + + " bad version " + versionParam)).build()); + } + + zk.delete(path, version); + } + + private static void throwNotFound(String path, UriInfo ui) + throws WebApplicationException { + throw new WebApplicationException(Response.status( + Response.Status.NOT_FOUND).entity( + new ZError(ui.getRequestUri().toString(), path + " not found")) + .build()); + } + +} diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/rest/src/python/README.txt b/pkg/registry/zookeeper-3.4.6/src/contrib/rest/src/python/README.txt new file mode 100644 index 000000000..acc8ffb8e --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/contrib/rest/src/python/README.txt @@ -0,0 +1,9 @@ +Some basic python scripts which use the REST interface: + +zkrest.py -- basic REST ZooKeeper client +demo_master_election.py -- shows how to implement master election +demo_queue.py -- basic queue +zk_dump_tree.py -- dumps the nodes & data of a znode hierarchy + +Generally these scripts require: + * simplejson diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/rest/src/python/demo_master_election.py b/pkg/registry/zookeeper-3.4.6/src/contrib/rest/src/python/demo_master_election.py new file mode 100644 index 000000000..c0317c7fe --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/contrib/rest/src/python/demo_master_election.py @@ -0,0 +1,90 @@ +#! /usr/bin/env python + +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you 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. + +import sys +import threading +import time + +from zkrest import ZooKeeper + +class Agent(threading.Thread): + """ A basic agent that wants to become a master and exit """ + + root = '/election' + + def __init__(self, id): + super(Agent, self).__init__() + self.zk = ZooKeeper() + self.id = id + + def run(self): + print 'Starting #%s' % self.id + with self.zk.session(expire=5): + + # signal agent presence + r = self.zk.create("%s/agent-" % self.root, + sequence=True, ephemeral=True) + self.me = r['path'] + + while True: + children = sorted([el['path'] \ + for el in self.zk.get_children(self.root)]) + master, previous = children[0], None + try: + index = children.index(self.me) + if index != 0: + previous = children[index-1] + except ValueError: + break + + if previous is None: + self.do_master_work() + # and don't forget to send heartbeat messages + break + else: + # do slave work in another thread + pass + + # wait for the previous agent or current master to exit / finish + while self.zk.exists(previous) or self.zk.exists(master): + time.sleep(0.5) + self.zk.heartbeat() + + # TODO signal the slave thread to exit and wait for it + # and rerun the election loop + + def do_master_work(self): + print "#%s: I'm the master: %s" % (self.id, self.me) + +def main(): + zk = ZooKeeper() + + # create the root node used for master election + if not zk.exists('/election'): + zk.create('/election') + + print 'Starting 10 agents ...' + agents = [Agent(id) for id in range(0,15)] + + map(Agent.start, agents) + map(Agent.join, agents) + + zk.delete('/election') + +if __name__ == '__main__': + sys.exit(main()) diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/rest/src/python/demo_queue.py b/pkg/registry/zookeeper-3.4.6/src/contrib/rest/src/python/demo_queue.py new file mode 100644 index 000000000..9ca4c6440 --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/contrib/rest/src/python/demo_queue.py @@ -0,0 +1,99 @@ +#! /usr/bin/env python + +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you 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 is a simple message queue built on top of ZooKeeper. In order +# to be used in production it needs better error handling but it's +# still useful as a proof-of-concept. + +# Why use ZooKeeper as a queue? Highly available by design and has +# great performance. + +import sys +import threading +import time + +from zkrest import ZooKeeper + +class Queue(object): + def __init__(self, root, zk): + self.root = root + + self.zk = zk + + def put(self, data): + self.zk.create("%s/el-" % self.root, str(data), sequence=True, ephemeral=True) + + # creating ephemeral nodes for easy cleanup + # in a real world scenario you should create + # normal sequential znodes + + def fetch(self): + """ Pull an element from the queue + + This function is not blocking if the queue is empty, it will + just return None. + """ + children = sorted(self.zk.get_children(self.root), \ + lambda a, b: cmp(a['path'], b['path'])) + + if not children: + return None + + try: + first = children[0] + self.zk.delete(first['path'], version=first['version']) + if 'data64' not in first: + return '' + else: + return first['data64'].decode('base64') + + except (ZooKeeper.WrongVersion, ZooKeeper.NotFound): + # someone changed the znode between the get and delete + # this should not happen + # in practice you should retry the fetch + raise + + +def main(): + zk = ZooKeeper() + zk.start_session(expire=60) + + if not zk.exists('/queue'): + zk.create('/queue') + q = Queue('/queue', zk) + + print 'Pushing to queue 1 ... 5' + map(q.put, [1,2,3,4,5]) + + print 'Extracting ...' + while True: + el = q.fetch() + if el is None: + break + print el + + zk.close_session() + zk.delete('/queue') + + print 'Done.' + + +if __name__ == '__main__': + sys.exit(main()) + diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/rest/src/python/test.py b/pkg/registry/zookeeper-3.4.6/src/contrib/rest/src/python/test.py new file mode 100644 index 000000000..363747a64 --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/contrib/rest/src/python/test.py @@ -0,0 +1,163 @@ +#! /usr/bin/env python + +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you 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. + +import time +import unittest + +from zkrest import ZooKeeper + +class ZooKeeperREST_TestCase(unittest.TestCase): + + BASE_URI = 'http://localhost:9998' + + def setUp(self): + self.zk = ZooKeeper(self.BASE_URI) + + def tearDown(self): + try: + self.zk.delete('/test') + except ZooKeeper.NotFound: + pass + + def test_get_root_node(self): + assert self.zk.get('/') is not None + + def test_get_node_not_found(self): + self.assertRaises(ZooKeeper.NotFound, \ + self.zk.get, '/dummy-node') + + def test_exists_node(self): + assert self.zk.exists('/zookeeper') is True + + def test_get_children(self): + assert any([child['path'] == '/zookeeper/quota' \ + for child in self.zk.get_children('/zookeeper')]) + + def test_create_znode(self): + try: + self.zk.create('/test') + except ZooKeeper.ZNodeExists: + pass # it's ok if already exists + assert self.zk.exists('/test') is True + + def test_create_hierarchy(self): + try: + self.zk.delete(['/a/b', '/a']) + except ZooKeeper.NotFound: + pass + + self.zk.create('/a') + self.zk.create('/a/b') + + self.zk.delete(['/a/b', '/a']) + + def test_create_with_data(self): + self.zk.create('/test', 'some-data') + + zn = self.zk.get('/test') + self.assertEqual(zn.get('data64', None), \ + 'some-data'.encode('base64').strip()) + + def test_delete_znode(self): + self.zk.create('/test') + + self.zk.delete('/test') + assert not self.zk.exists('/test') + + def test_delete_older_version(self): + self.zk.create('/test') + + zn = self.zk.get('/test') + # do one more modification in order to increase the version number + self.zk.set('/test', 'dummy-data') + + self.assertRaises(ZooKeeper.WrongVersion, \ + self.zk.delete, '/test', version=zn['version']) + + def test_delete_raise_not_found(self): + self.zk.create('/test') + + zn = self.zk.get('/test') + self.zk.delete('/test') + + self.assertRaises(ZooKeeper.NotFound, \ + self.zk.delete, '/test', version=zn['version']) + + def test_set(self): + self.zk.create('/test') + + self.zk.set('/test', 'dummy') + + self.assertEqual(self.zk.get('/test')['data64'], \ + 'dummy'.encode('base64').strip()) + + def test_set_with_older_version(self): + if not self.zk.exists('/test'): + self.zk.create('/test', 'random-data') + + zn = self.zk.get('/test') + self.zk.set('/test', 'new-data') + self.assertRaises(ZooKeeper.WrongVersion, self.zk.set, \ + '/test', 'older-version', version=zn['version']) + + def test_set_null(self): + if not self.zk.exists('/test'): + self.zk.create('/test', 'random-data') + self.zk.set('/test', 'data') + assert 'data64' in self.zk.get('/test') + + self.zk.set('/test', null=True) + assert 'data64' not in self.zk.get('/test') + + def test_create_ephemeral_node(self): + with self.zk.session(): + if self.zk.exists('/ephemeral-test'): + self.zk.delete('/ephemeral-test') + + self.zk.create('/ephemeral-test', ephemeral=True) + zn = self.zk.get('/ephemeral-test') + + assert zn['ephemeralOwner'] != 0 + + def test_create_session(self): + with self.zk.session() as sid: + self.assertEqual(len(sid), 36) # UUID + + def test_session_invalidation(self): + self.zk.start_session(expire=1) + self.zk.create('/ephemeral-test', ephemeral=True) + + # keep the session alive by sending heartbeat requests + for _ in range(1,2): + self.zk.heartbeat() + time.sleep(0.9) + + time.sleep(2) # wait for the session to expire + self.assertRaises(ZooKeeper.InvalidSession, \ + self.zk.create, '/ephemeral-test', ephemeral=True) + + def test_presence_signaling(self): + with self.zk.session(expire=1): + self.zk.create('/i-am-online', ephemeral=True) + assert self.zk.exists('/i-am-online') + assert not self.zk.exists('/i-am-online') + + +if __name__ == '__main__': + unittest.main() + diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/rest/src/python/zk_dump_tree.py b/pkg/registry/zookeeper-3.4.6/src/contrib/rest/src/python/zk_dump_tree.py new file mode 100644 index 000000000..517d23b34 --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/contrib/rest/src/python/zk_dump_tree.py @@ -0,0 +1,108 @@ +#!/usr/bin/python + +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you 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. + +import getopt +import sys +import simplejson +import urllib2 +from base64 import b64decode + +printdata = False +fullpath = False + +def dump_node(url, depth): + """Dump the node, then dump children recursively + + Arguments: + - `url`: + - `depth`: + """ + req = urllib2.urlopen(url) + resp = simplejson.load(req) + if 'Error' in resp: + raise resp['Error'] + + if fullpath: + name = resp['path'] + else: + name = '/' + resp['path'].split('/')[-1] + + data64 = resp.get('data64') + dataUtf8 = resp.get('dataUtf8') + if data64 and printdata: + data = b64decode(data64) + print '%(indent)s%(name)s = b64(%(data64)s) str(%(data)s)' % \ + {'indent':' '*2*depth, 'name':name, 'data64':data64, 'data':data} + elif dataUtf8 and printdata: + print '%(indent)s%(name)s = %(data)s' % \ + {'indent':' '*2*depth, 'name':name, 'data':dataUtf8} + else: + print '%(indent)s%(name)s' % {'indent':' '*2*depth, 'name':name} + + req = urllib2.urlopen(resp['uri'] + '?view=children') + resp = simplejson.load(req) + + for child in resp.get('children', []): + dump_node(resp['child_uri_template'] + .replace("{child}", urllib2.quote(child)), + depth + 1) + +def zk_dump_tree(url, root): + """Dump the tree starting at the roota + + Arguments: + - `root`: + """ + dump_node(url + '/znodes/v1' + root, 0) + +def usage(): + """Usage + """ + print 'Usage: zk_dump_tree.py [-h|--help -u|--url=url -d|--data -f|--fullpath -r|--root=root]' + print ' where url is the url of the rest server, data is whether to' + print ' to include node data on output, root is the znode root' + print ' fullpath prints the full node path (useful for copy/paste)' + +if __name__ == '__main__': + try: + opts, args = getopt.getopt(sys.argv[1:], + "hu:dfr:", ["help", "url=", "data", "fullpath", "root="]) + except getopt.GetoptError, err: + # print help information and exit: + print str(err) # will print something like "option -a not recognized" + usage() + sys.exit(2) + url ='http://localhost:9998' + root = '/' + for o, a in opts: + if o in ("-d", "--data"): + printdata = True + elif o in ("-h", "--help"): + usage() + sys.exit() + elif o in ("-u", "--url"): + url = a + elif o in ("-r", "--root"): + root = a + elif o in ("-f", "--fullpath"): + fullpath = True + else: + assert False, "unhandled option" + + print 'Accessing REST server at ' + url + zk_dump_tree(url, root) diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/rest/src/python/zkrest.py b/pkg/registry/zookeeper-3.4.6/src/contrib/rest/src/python/zkrest.py new file mode 100644 index 000000000..c009d5d9b --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/contrib/rest/src/python/zkrest.py @@ -0,0 +1,218 @@ + +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you 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. + +import urllib2 +import urllib +import simplejson + +from contextlib import contextmanager + +class RequestWithMethod(urllib2.Request): + """ Request class that know how to set the method name """ + def __init__(self, *args, **kwargs): + urllib2.Request.__init__(self, *args, **kwargs) + self._method = None + + def get_method(self): + return self._method or \ + urllib2.Request.get_method(self) + + def set_method(self, method): + self._method = method + +class ZooKeeper(object): + + class Error(Exception): pass + + class NotFound(Error): pass + + class ZNodeExists(Error): pass + + class InvalidSession(Error): pass + + class WrongVersion(Error): pass + + def __init__(self, uri = 'http://localhost:9998'): + self._base = uri + self._session = None + + def start_session(self, expire=5, id=None): + """ Create a session and return the ID """ + if id is None: + url = "%s/sessions/v1/?op=create&expire=%d" % (self._base, expire) + self._session = self._do_post(url)['id'] + else: + self._session = id + return self._session + + def close_session(self): + """ Close the session on the server """ + if self._session is not None: + url = '%s/sessions/v1/%s' % (self._base, self._session) + self._do_delete(url) + self._session = None + + def heartbeat(self): + """ Send a heartbeat request. This is needed in order to keep a session alive """ + if self._session is not None: + url = '%s/sessions/v1/%s' % (self._base, self._session) + self._do_put(url, '') + + @contextmanager + def session(self, *args, **kwargs): + """ Session handling using a context manager """ + yield self.start_session(*args, **kwargs) + self.close_session() + + def get(self, path): + """ Get a node """ + url = "%s/znodes/v1%s" % (self._base, path) + return self._do_get(url) + + def get_children(self, path): + """ Get all the children for a given path. This function creates a generator """ + url = "%s/znodes/v1%s?view=children" % (self._base, path) + resp = self._do_get(url) + for child in resp.get('children', []): + try: + yield self._do_get(resp['child_uri_template']\ + .replace('{child}', urllib2.quote(child))) + except ZooKeeper.NotFound: + continue + + def create(self, path, data=None, sequence=False, ephemeral=False): + """ Create a new node. By default this call creates a persistent znode. + + You can also create an ephemeral or a sequential znode. + """ + ri = path.rindex('/') + head, name = path[:ri+1], path[ri+1:] + if head != '/': head = head[:-1] + + flags = { + 'null': 'true' if data is None else 'false', + 'ephemeral': 'true' if ephemeral else 'false', + 'sequence': 'true' if sequence else 'false' + } + if ephemeral: + if self._session: + flags['session'] = self._session + else: + raise ZooKeeper.Error, 'You need a session '\ + 'to create an ephemeral node' + flags = urllib.urlencode(flags) + + url = "%s/znodes/v1%s?op=create&name=%s&%s" % \ + (self._base, head, name, flags) + + return self._do_post(url, data) + + def set(self, path, data=None, version=-1, null=False): + """ Set the value of node """ + url = "%s/znodes/v1%s?%s" % (self._base, path, \ + urllib.urlencode({ + 'version': version, + 'null': 'true' if null else 'false' + })) + return self._do_put(url, data) + + def delete(self, path, version=-1): + """ Delete a znode """ + if type(path) is list: + map(lambda el: self.delete(el, version), path) + return + + url = '%s/znodes/v1%s?%s' % (self._base, path, \ + urllib.urlencode({ + 'version':version + })) + try: + return self._do_delete(url) + except urllib2.HTTPError, e: + if e.code == 412: + raise ZooKeeper.WrongVersion(path) + elif e.code == 404: + raise ZooKeeper.NotFound(path) + raise + + def exists(self, path): + """ Do a znode exists """ + try: + self.get(path) + return True + except ZooKeeper.NotFound: + return False + + def _do_get(self, uri): + """ Send a GET request and convert errors to exceptions """ + try: + req = urllib2.urlopen(uri) + resp = simplejson.load(req) + + if 'Error' in resp: + raise ZooKeeper.Error(resp['Error']) + + return resp + except urllib2.HTTPError, e: + if e.code == 404: + raise ZooKeeper.NotFound(uri) + raise + + def _do_post(self, uri, data=None): + """ Send a POST request and convert errors to exceptions """ + try: + req = urllib2.Request(uri, {}) + req.add_header('Content-Type', 'application/octet-stream') + if data is not None: + req.add_data(data) + + resp = simplejson.load(urllib2.urlopen(req)) + if 'Error' in resp: + raise ZooKeeper.Error(resp['Error']) + return resp + + except urllib2.HTTPError, e: + if e.code == 201: + return True + elif e.code == 409: + raise ZooKeeper.ZNodeExists(uri) + elif e.code == 401: + raise ZooKeeper.InvalidSession(uri) + raise + + def _do_delete(self, uri): + """ Send a DELETE request """ + req = RequestWithMethod(uri) + req.set_method('DELETE') + req.add_header('Content-Type', 'application/octet-stream') + return urllib2.urlopen(req).read() + + def _do_put(self, uri, data): + """ Send a PUT request """ + try: + req = RequestWithMethod(uri) + req.set_method('PUT') + req.add_header('Content-Type', 'application/octet-stream') + if data is not None: + req.add_data(data) + + return urllib2.urlopen(req).read() + except urllib2.HTTPError, e: + if e.code == 412: # precondition failed + raise ZooKeeper.WrongVersion(uri) + raise + diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/zkfuse/Makefile.am b/pkg/registry/zookeeper-3.4.6/src/contrib/zkfuse/Makefile.am new file mode 100644 index 000000000..36da1a50d --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/contrib/zkfuse/Makefile.am @@ -0,0 +1,4 @@ +## Process this file with automake to produce Makefile.in + +SUBDIRS = src + diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/zkfuse/README.txt b/pkg/registry/zookeeper-3.4.6/src/contrib/zkfuse/README.txt new file mode 100644 index 000000000..901d3634f --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/contrib/zkfuse/README.txt @@ -0,0 +1,63 @@ +Original authors of zkfuse are Swee Lim & Bartlomiej M Niechwiej of Yahoo. +' +ZooKeeper FUSE (File System in Userspace) +========================================= + +Pre-requisites +-------------- +1. Linux system with 2.6.X kernel. +2. Fuse (Filesystem in Userspace) must be installed on the build node. +3. Development build libraries: + a. fuse + b. log4cxx + c. pthread + d. boost + +Build instructions +------------------ +1. cd into this directory +2. autoreconf -if +3. ./configure +4. make +5. zkfuse binary is under the src directory + +Testing Zkfuse +-------------- +1. Depending on permission on /dev/fuse, you may need to sudo -u root. + * If /dev/fuse has permissions 0600, then you have to run Zkfuse as root. + * If /dev/fuse has permissions 0666, then you can run Zkfuse as any user. +2. Create or find a mount point that you have "rwx" permission. + * e.g. mkdir -p /tmp/zkfuse +3. Run Zkfuse as follows: + zkfuse -z -m /tmp/zkfuse -d + -z specifies ZooKeeper address(es) : + -m specifies the mount point + -d specifies the debug mode. + For additional command line options, try "zkfuse -h". + +FAQ +--- +Q. How to fix "warning: macro `AM_PATH_CPPUNIT' not found in library"? +A. * install cppunit (src or pkg) on build machine + +Q. Why can't Zkfuse cannot write to current directory? +A. * If Zkfuse is running as root on a NFS mounted file system, it will not + have root permissions because root user is mapped to another user by + NFS admin. + * If you run Zkfuse as root, it is a good idea to run Zkfuse from a + directory that you have write access to. This will allow core files + to be saved. + +Q. Why Zkfuse cannot mount? +A. * Check that the mount point exists and you have "rwx" permissions. + * Check that previous mounts have been umounted. If Zkfuse does not + exit cleanly, its mount point may have to be umounted manually. + If you cannot umount manually, make sure that there no files is open + within the mount point. + +Q. Why does Zkfuse complain about logging at startup? +A. * Zkfuse uses log4cxx for logging. It is looking for log4cxx.properties + file to obtain its logging configuration. + * There is an example log4cxx.properties file in the Zkfuse source + directory. + diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/zkfuse/build.xml b/pkg/registry/zookeeper-3.4.6/src/contrib/zkfuse/build.xml new file mode 100644 index 000000000..f58945381 --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/contrib/zkfuse/build.xml @@ -0,0 +1,61 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/zkfuse/configure.ac b/pkg/registry/zookeeper-3.4.6/src/contrib/zkfuse/configure.ac new file mode 100644 index 000000000..c86e7cdc8 --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/contrib/zkfuse/configure.ac @@ -0,0 +1,72 @@ +# -*- Autoconf -*- +# Process this file with autoconf to produce a configure script. + +AC_PREREQ(2.59) + +AC_INIT([zkfuse], [2.2.0]) +AM_INIT_AUTOMAKE(foreign) + +AC_CONFIG_SRCDIR([src/zkadapter.h]) +AM_CONFIG_HEADER([config.h]) + +PACKAGE=zkfuse +VERSION=1.0 + +AC_SUBST(PACKAGE) +AC_SUBST(VERSION) + +BUILD_PATH="`pwd`" + +# Checks for programs. +AC_LANG_CPLUSPLUS +AC_PROG_CXX + +# Checks for libraries. +AC_CHECK_LIB([fuse], [main]) +AC_CHECK_LIB([log4cxx], [main], [], [AC_MSG_ERROR("We need log4cxx to build zkfuse")]) +AC_CHECK_LIB([thread], [thr_create]) +AC_CHECK_LIB([pthread], [pthread_create]) +AC_CHECK_LIB([rt], [clock_gettime]) +AC_CHECK_LIB([socket], [socket]) +AC_CHECK_LIB([nsl], [gethostbyname]) +AC_CHECK_LIB([ulockmgr], [ulockmgr_op]) + +ZOOKEEPER_PATH=${BUILD_PATH}/../../c +ZOOKEEPER_BUILD_PATH=${BUILD_PATH}/../../../build/c +AC_CHECK_LIB(zookeeper_mt, main, [ZOOKEEPER_LD="-L${ZOOKEEPER_BUILD_PATH}/.libs -lzookeeper_mt"],,["-L${ZOOKEEPER_BUILD_PATH}/.libs"]) + +AC_SUBST(ZOOKEEPER_PATH) +AC_SUBST(ZOOKEEPER_LD) + +# Checks for header files. +AC_HEADER_DIRENT +AC_HEADER_STDC +AC_CHECK_HEADERS([fcntl.h stdlib.h string.h sys/time.h unistd.h]) +AC_CHECK_HEADERS([boost/shared_ptr.hpp boost/utility.hpp boost/weak_ptr.hpp],, AC_MSG_ERROR([boost library headers not found. Please install boost library.])) + +# Checks for typedefs, structures, and compiler characteristics. +AC_HEADER_STDBOOL +AC_C_CONST +AC_TYPE_UID_T +AC_C_INLINE +AC_TYPE_INT32_T +AC_TYPE_INT64_T +AC_TYPE_MODE_T +AC_TYPE_OFF_T +AC_TYPE_SIZE_T +AC_CHECK_MEMBERS([struct stat.st_blksize]) +AC_STRUCT_ST_BLOCKS +AC_HEADER_TIME +AC_TYPE_UINT32_T +AC_TYPE_UINT64_T +AC_TYPE_UINT8_T +AC_C_VOLATILE + +# Checks for library functions. +AC_FUNC_UTIME_NULL +AC_CHECK_FUNCS([gettimeofday memset mkdir rmdir strdup strerror strstr strtol strtoul strtoull utime]) + +AC_CONFIG_FILES([Makefile]) +AC_CONFIG_FILES([src/Makefile]) +AC_OUTPUT +AC_C_VOLATILE diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/zkfuse/src/Makefile.am b/pkg/registry/zookeeper-3.4.6/src/contrib/zkfuse/src/Makefile.am new file mode 100644 index 000000000..c0d87e317 --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/contrib/zkfuse/src/Makefile.am @@ -0,0 +1,7 @@ +AM_CXXFLAGS = -I${ZOOKEEPER_PATH}/include -I${ZOOKEEPER_PATH}/generated \ + -I$(top_srcdir)/include -I/usr/include -D_FILE_OFFSET_BITS=64 -D_REENTRANT + +noinst_PROGRAMS = zkfuse + +zkfuse_SOURCES = zkfuse.cc zkadapter.cc thread.cc log.cc +zkfuse_LDADD = ${ZOOKEEPER_LD} \ No newline at end of file diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/zkfuse/src/blockingqueue.h b/pkg/registry/zookeeper-3.4.6/src/contrib/zkfuse/src/blockingqueue.h new file mode 100644 index 000000000..4677290d7 --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/contrib/zkfuse/src/blockingqueue.h @@ -0,0 +1,154 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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. + */ + +#ifndef __BLOCKINGQUEUE_H__ +#define __BLOCKINGQUEUE_H__ + +#include + +#include "mutex.h" + +using namespace std; +USING_ZKFUSE_NAMESPACE + +namespace zk { + +/** + * \brief An unbounded blocking queue of elements of type E. + * + *

      + * This class is thread safe. + */ +template +class BlockingQueue { + public: + + /** + * \brief Adds the specified element to this queue, waiting if necessary + * \brief for space to become available. + * + * @param e the element to be added + */ + void put(E e); + + /** + * \brief Retrieves and removes the head of this queue, waiting if + * \brief no elements are present in this queue. + * + * @param timeout how long to wait until an element becomes availabe, + * in milliseconds; if 0 then wait forever + * @param timedOut if not NULL then set to true whether this function timed out + * @return the element from the queue + */ + E take(int32_t timeout = 0, bool *timedOut = NULL); + + /** + * Returns the current size of this blocking queue. + * + * @return the number of elements in this queue + */ + int size() const; + + /** + * \brief Returns whether this queue is empty or not. + * + * @return true if this queue has no elements; false otherwise + */ + bool empty() const; + + private: + + /** + * The queue of elements. Deque is used to provide O(1) time + * for head elements removal. + */ + deque m_queue; + + /** + * The mutex used for queue synchronization. + */ + mutable zkfuse::Mutex m_mutex; + + /** + * The conditionial variable associated with the mutex above. + */ + mutable Cond m_cond; + +}; + +template +int BlockingQueue::size() const { + int size; + m_mutex.Acquire(); + size = m_queue.size(); + m_mutex.Release(); + return size; +} + +template +bool BlockingQueue::empty() const { + bool isEmpty; + m_mutex.Acquire(); + isEmpty = m_queue.empty(); + m_mutex.Release(); + return isEmpty; +} + +template +void BlockingQueue::put(E e) { + m_mutex.Acquire(); + m_queue.push_back( e ); + m_cond.Signal(); + m_mutex.Release(); +} + +template + E BlockingQueue::take(int32_t timeout, bool *timedOut) { + m_mutex.Acquire(); + bool hasResult = true; + while (m_queue.empty()) { + if (timeout <= 0) { + m_cond.Wait( m_mutex ); + } else { + if (!m_cond.Wait( m_mutex, timeout )) { + hasResult = false; + break; + } + } + } + if (hasResult) { + E e = m_queue.front(); + m_queue.pop_front(); + m_mutex.Release(); + if (timedOut) { + *timedOut = false; + } + return e; + } else { + m_mutex.Release(); + if (timedOut) { + *timedOut = true; + } + return E(); + } +} + +} + +#endif /* __BLOCKINGQUEUE_H__ */ + diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/zkfuse/src/doxygen.cfg b/pkg/registry/zookeeper-3.4.6/src/contrib/zkfuse/src/doxygen.cfg new file mode 100644 index 000000000..308b09450 --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/contrib/zkfuse/src/doxygen.cfg @@ -0,0 +1,1242 @@ +# Doxyfile 1.4.3 + +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you 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 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 (" ") + +#--------------------------------------------------------------------------- +# Project related 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 = ZkFuse + +# 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 = doc + +# If the CREATE_SUBDIRS tag is set to YES, then doxygen will create +# 4096 sub-directories (in 2 levels) under the output directory of each output +# format and will distribute the generated files over these directories. +# Enabling this option can be useful when feeding doxygen a huge amount of +# source files, where putting all generated files in the same directory would +# otherwise cause performance problems for the file system. + +CREATE_SUBDIRS = NO + +# 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, Korean-en, Norwegian, +# Polish, Portuguese, Romanian, Russian, Serbian, Slovak, Slovene, Spanish, +# Swedish, and Ukrainian. + +OUTPUT_LANGUAGE = English + +# This tag can be used to specify the encoding used in the generated output. +# The encoding is not always determined by the language that is chosen, +# but also whether or not the output is meant for Windows or non-Windows users. +# In case there is a difference, setting the USE_WINDOWS_ENCODING tag to YES +# forces the Windows encoding (this is the default for the Windows binary), +# whereas setting the tag to NO uses a Unix-style encoding (the default for +# all platforms other than Windows). + +USE_WINDOWS_ENCODING = 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 + +# This tag implements a quasi-intelligent brief description abbreviator +# that is used to form the text in various listings. Each string +# in this list, if found as the leading text of the brief description, will be +# stripped from the text and the result after processing the whole list, is +# used as the annotated text. Otherwise, the brief description is used as-is. +# If left blank, the following values are used ("$name" is automatically +# replaced with the name of the entity): "The $name class" "The $name widget" +# "The $name file" "is" "provides" "specifies" "contains" +# "represents" "a" "an" "the" + +ABBREVIATE_BRIEF = + +# 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 = YES + +# 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. The tag can be used to show relative paths in the file list. +# If left blank the directory from which doxygen is run is used as the +# path to strip. + +STRIP_FROM_PATH = + +# The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of +# the path mentioned in the documentation of a class, which tells +# the reader which header file to include in order to use a class. +# If left blank only the name of the header file containing the class +# definition is used. Otherwise one should specify the include paths that +# are normally passed to the compiler using the -I flag. + +STRIP_FROM_INC_PATH = + +# 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 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 +# explicit @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 +# re-implements. + +INHERIT_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 + +# If the SEPARATE_MEMBER_PAGES tag is set to YES, then doxygen will produce +# a new page for each member. If set to NO, the documentation of a member will +# be part of the file/class/namespace that contains it. + +SEPARATE_MEMBER_PAGES = 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 + +# 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 = + +# 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 = NO + +# 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 SUBGROUPING tag to YES (the default) to allow class member groups of +# the same type (for instance a group of public functions) to be put as a +# subgroup of that type (e.g. under the Public Functions section). Set it to +# NO to prevent subgrouping. Alternatively, this can be done per class using +# the \nosubgrouping command. + +SUBGROUPING = YES + +#--------------------------------------------------------------------------- +# Build related configuration options +#--------------------------------------------------------------------------- + +# 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 = NO + +# If the EXTRACT_PRIVATE tag is set to YES all private members of a class +# will be included in the documentation. + +EXTRACT_PRIVATE = YES + +# If the EXTRACT_STATIC tag is set to YES all static members of a file +# will be included in the documentation. + +EXTRACT_STATIC = YES + +# 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 = YES + +# This flag is only useful for Objective-C code. When set to YES local +# methods, which are defined in the implementation section but not in +# the interface are included in the documentation. +# If set to NO (the default) only methods in the interface are included. + +EXTRACT_LOCAL_METHODS = 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 classes 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 HIDE_IN_BODY_DOCS tag is set to YES, Doxygen will hide any +# documentation blocks found inside the body of a function. +# If set to NO (the default) these blocks will be appended to the +# function's detailed documentation block. + +HIDE_IN_BODY_DOCS = NO + +# 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 + +# 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 +# and Mac users are advised to set this option to NO. + +CASE_SENSE_NAMES = YES + +# 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 SHOW_INCLUDE_FILES tag is set to YES (the default) then Doxygen +# will put a list of the files that are included by a file in the documentation +# of that file. + +SHOW_INCLUDE_FILES = 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 the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the +# brief documentation of file, namespace and class members alphabetically +# by member name. If set to NO (the default) the members will appear in +# declaration order. + +SORT_BRIEF_DOCS = NO + +# If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be +# sorted by fully-qualified names, including namespaces. If set to +# NO (the default), the class list will be sorted only by class name, +# not including the namespace part. +# Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES. +# Note: This option applies only to the class list, not to the +# alphabetical list. + +SORT_BY_SCOPE_NAME = NO + +# 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 + +# 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 consists 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 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 = YES + +# If the sources in your project are distributed over multiple directories +# then setting the SHOW_DIRECTORIES tag to YES will show the directory hierarchy +# in the documentation. + +SHOW_DIRECTORIES = YES + +# The FILE_VERSION_FILTER tag can be used to specify a program or script that +# doxygen should invoke to get the current version for each file (typically from the +# version control system). Doxygen will invoke the program by executing (via +# popen()) the command , where is the value of +# the FILE_VERSION_FILTER tag, and is the name of an input file +# provided by doxygen. Whatever the progam writes to standard output +# is used as the file version. See the manual for examples. + +FILE_VERSION_FILTER = + +#--------------------------------------------------------------------------- +# 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 + +# If WARN_IF_DOC_ERROR is set to YES, doxygen will generate warnings for +# potential errors in the documentation, such as not documenting some +# parameters in a documented function, or documenting parameters that +# don't exist or using markup commands wrongly. + +WARN_IF_DOC_ERROR = YES + +# This WARN_NO_PARAMDOC option can be abled to get warnings for +# functions that are documented, but have no documentation for their parameters +# or return value. If set to NO (the default) doxygen will only warn about +# wrong or incomplete parameter documentation, but not about the absence of +# documentation. + +WARN_NO_PARAMDOC = NO + +# 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. Optionally the format may contain +# $version, which will be replaced by the version of the file (if it could +# be obtained via FILE_VERSION_FILTER) + +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 = + +# 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 *.cs *.php *.php3 *.inc *.m *.mm + +FILE_PATTERNS = + +# The RECURSIVE tag can be used to turn specify whether or not subdirectories +# should be searched for input files as well. Possible values are YES and NO. +# If left blank NO is used. + +RECURSIVE = NO + +# The EXCLUDE tag can be used to specify files and/or directories that should +# excluded from the INPUT source files. This way you can easily exclude a +# subdirectory from a directory tree whose root is specified with the INPUT tag. + +EXCLUDE = + +# The EXCLUDE_SYMLINKS tag can be used select whether or not files or +# directories that are symbolic links (a Unix filesystem feature) are excluded +# from the input. + +EXCLUDE_SYMLINKS = NO + +# If the value of the INPUT tag contains directories, you can use the +# EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude +# certain files from those directories. + +EXCLUDE_PATTERNS = + +# The EXAMPLE_PATH tag can be used to specify one or more files or +# directories that contain example code fragments that are included (see +# the \include command). + +EXAMPLE_PATH = + +# If the value of the EXAMPLE_PATH tag contains directories, you can use the +# EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp +# and *.h) to filter out the source-files in the directories. If left +# blank all files are included. + +EXAMPLE_PATTERNS = + +# If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be +# searched for input files to be used with the \include or \dontinclude +# commands irrespective of the value of the RECURSIVE tag. +# Possible values are YES and NO. If left blank NO is used. + +EXAMPLE_RECURSIVE = NO + +# The IMAGE_PATH tag can be used to specify one or more files or +# directories that contain image that are included in the documentation (see +# the \image command). + +IMAGE_PATH = + +# The INPUT_FILTER tag can be used to specify a program that doxygen should +# invoke to filter for each input file. Doxygen will invoke the filter program +# by executing (via popen()) the command , where +# is the value of the INPUT_FILTER tag, and is the name of an +# input file. Doxygen will then use the output that the filter program writes +# to standard output. If FILTER_PATTERNS is specified, this tag will be +# ignored. + +INPUT_FILTER = + +# The FILTER_PATTERNS tag can be used to specify filters on a per file pattern +# basis. Doxygen will compare the file name with each pattern and apply the +# filter if there is a match. The filters are a list of the form: +# pattern=filter (like *.cpp=my_cpp_filter). See INPUT_FILTER for further +# info on how filters are used. If FILTER_PATTERNS is empty, INPUT_FILTER +# is applied to all files. + +FILTER_PATTERNS = + +# 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. +# Note: To get rid of all source code in the generated output, make sure also +# VERBATIM_HEADERS is set to NO. + +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 + +# 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 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 = YES + +# 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 = YES + +# If the USE_HTAGS tag is set to YES then the references to source code +# will point to the HTML generated by the htags(1) tool instead of doxygen +# built-in source browser. The htags tool is part of GNU's global source +# tagging system (see http://www.gnu.org/software/global/global.html). You +# will need version 4.8.6 or higher. + +USE_HTAGS = 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 + +#--------------------------------------------------------------------------- +# 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 = NO + +# 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 = html + +# 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. Note that doxygen will try to copy +# the style sheet file to the HTML output directory, so don't put your own +# stylesheet in the HTML output directory as well, or it will be erased! + +HTML_STYLESHEET = + +# 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 directory. + +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 = NO + +# 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, DHTML, CSS and frames is required (for instance Mozilla 1.0+, +# Netscape 6.0+, Internet explorer 5.0+, or Konqueror). 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 = YES + +# 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 + +# If LATEX_HIDE_INDICES is set to YES then doxygen will not +# include the index chapters (such as File Index, Compound Index, etc.) +# in the output. + +LATEX_HIDE_INDICES = 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 optimized 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 assignments. 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. + +GENERATE_XML = NO + +# The XML_OUTPUT tag is used to specify where the XML 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 `xml' will be used as the default path. + +XML_OUTPUT = xml + +# 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 = + +# If the XML_PROGRAMLISTING tag is set to YES Doxygen will +# dump the program listings (including syntax highlighting +# and cross-referencing information) to the XML output. Note that +# enabling this will significantly increase the size of the XML output. + +XML_PROGRAMLISTING = YES + +#--------------------------------------------------------------------------- +# 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 Perl module output +#--------------------------------------------------------------------------- + +# If the GENERATE_PERLMOD tag is set to YES Doxygen will +# generate a Perl module file that captures the structure of +# the code including all documentation. Note that this +# feature is still experimental and incomplete at the +# moment. + +GENERATE_PERLMOD = NO + +# If the PERLMOD_LATEX tag is set to YES Doxygen will generate +# the necessary Makefile rules, Perl scripts and LaTeX code to be able +# to generate PDF and DVI output from the Perl module output. + +PERLMOD_LATEX = NO + +# If the PERLMOD_PRETTY tag is set to YES the Perl module output will be +# nicely formatted so it can be parsed by a human reader. This is useful +# if you want to understand what is going on. On the other hand, if this +# tag is set to NO the size of the Perl module output will be much smaller +# and Perl will parse it just the same. + +PERLMOD_PRETTY = YES + +# The names of the make variables in the generated doxyrules.make file +# are prefixed with the string contained in PERLMOD_MAKEVAR_PREFIX. +# This is useful so different doxyrules.make files included by the same +# Makefile don't overwrite each other's variables. + +PERLMOD_MAKEVAR_PREFIX = + +#--------------------------------------------------------------------------- +# 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 = YES + +# 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. To prevent a macro definition from being +# undefined via #undef or recursively expanded use the := operator +# instead of the = operator. + +PREDEFINED = + +# If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF 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::additions related to external references +#--------------------------------------------------------------------------- + +# The TAGFILES option can be used to specify one or more tagfiles. +# Optionally an initial location of the external documentation +# can be added for each tagfile. The format of a tag file without +# this location is as follows: +# TAGFILES = file1 file2 ... +# Adding location for the tag files is done as follows: +# TAGFILES = file1=loc1 "file2 = loc2" ... +# where "loc1" and "loc2" can be relative or absolute paths or +# URLs. If a location is present for each tag, the installdox tool +# does not have to be run to correct the links. +# Note that each tag file must have a unique name +# (where the name does NOT include the path) +# If a tag file is not located in the directory in which doxygen +# is run, you must also specify the path to the tagfile here. + +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 superseded by the HAVE_DOT option below. This is only a +# fallback. It is recommended to install and use dot, since it yields 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 the GROUP_GRAPHS and HAVE_DOT tags are set to YES then doxygen +# will generate a graph for groups, showing the direct groups dependencies + +GROUP_GRAPHS = YES + +# If the UML_LOOK tag is set to YES doxygen will generate inheritance and +# collaboration diagrams in a style similar to the OMG's Unified Modeling +# Language. + +UML_LOOK = NO + +# If set to YES, the inheritance and collaboration graphs will show the +# relations between templates and their instances. + +TEMPLATE_RELATIONS = NO + +# 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 CALL_GRAPH and HAVE_DOT tags are set to YES then doxygen will +# generate a call dependency graph for every global function or class method. +# Note that enabling this option will significantly increase the time of a run. +# So in most cases it will be better to enable call graphs for selected +# functions only using the \callgraph command. + +CALL_GRAPH = NO + +# 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 + +# If the DIRECTORY_GRAPH, SHOW_DIRECTORIES and HAVE_DOT tags are set to YES +# then doxygen will show the dependencies a directory has on other directories +# in a graphical way. The dependency relations are determined by the #include +# relations between the files in the directories. + +DIRECTORY_GRAPH = 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 in 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 + +# The MAX_DOT_GRAPH_DEPTH tag can be used to set the maximum depth of the +# graphs generated by dot. A depth value of 3 means that only nodes reachable +# from the root by following a path via at most 3 edges will be shown. Nodes +# that lay further from the root node will be omitted. Note that setting this +# option to 1 or 2 may greatly reduce the computation time needed for large +# code bases. Also note that a graph may be further truncated if the graph's +# image dimensions are not sufficient to fit the graph (see MAX_DOT_GRAPH_WIDTH +# and MAX_DOT_GRAPH_HEIGHT). If 0 is used for the depth value (the default), +# the graph is not depth-constrained. + +MAX_DOT_GRAPH_DEPTH = 0 + +# Set the DOT_TRANSPARENT tag to YES to generate images with a transparent +# background. This is disabled by default, which results in a white background. +# Warning: Depending on the platform used, enabling this option may lead to +# badly anti-aliased labels on the edges of a graph (i.e. they become hard to +# read). + +DOT_TRANSPARENT = NO + +# Set the DOT_MULTI_TARGETS tag to YES allow dot to generate multiple output +# files in one run (i.e. multiple -o and -T options on the command line). This +# makes dot run faster, but since only newer versions of dot (>1.8.10) +# support this, this feature is disabled by default. + +DOT_MULTI_TARGETS = NO + +# 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 intermediate dot files that are used to generate +# the various graphs. + +DOT_CLEANUP = YES + +#--------------------------------------------------------------------------- +# Configuration::additions 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 diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/zkfuse/src/event.cc b/pkg/registry/zookeeper-3.4.6/src/contrib/zkfuse/src/event.cc new file mode 100644 index 000000000..541657e14 --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/contrib/zkfuse/src/event.cc @@ -0,0 +1,29 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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. + */ + +#include "event.h" + +#define LOG_LEVEL LOG_FATAL +#define MODULE_NAME "Event" + +using namespace std; + +namespace zkfuse { + +} /* end of 'namespace zkfuse' */ + diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/zkfuse/src/event.h b/pkg/registry/zookeeper-3.4.6/src/contrib/zkfuse/src/event.h new file mode 100644 index 000000000..0506932f7 --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/contrib/zkfuse/src/event.h @@ -0,0 +1,553 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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. + */ + +#ifndef __EVENT_H__ +#define __EVENT_H__ + +#include +#include +#include +#include +#ifdef GCC4 +# include +using namespace std::tr1; +#else +# include +using namespace boost; +#endif + +#include "log.h" +#include "blockingqueue.h" +#include "mutex.h" +#include "thread.h" + +using namespace std; +using namespace zk; + +namespace zkfuse { + +//forward declaration of EventSource +template +class EventSource; + +/** + * \brief This interface is implemented by an observer + * \brief of a particular {@link EventSource}. + */ +template +class EventListener { + public: + + /** + * \brief This method is invoked whenever an event + * \brief has been received by the event source being observed. + * + * @param source the source the triggered the event + * @param e the actual event being triggered + */ + virtual void eventReceived(const EventSource &source, const E &e) = 0; +}; + +/** + * \brief This class represents a source of events. + * + *

      + * Each source can have many observers (listeners) attached to it + * and in case of an event, this source may propagate the event + * using {@link #fireEvent} method. + */ +template +class EventSource { + public: + + /** + * \brief The type corresponding to the list of registered event listeners. + */ + typedef set *> EventListeners; + + /** + * \brief Registers a new event listener. + * + * @param listener the listener to be added to the set of listeners + */ + void addListener(EventListener *listener) { + m_listeners.insert( listener ); + } + + /** + * \brief Removes an already registered listener. + * + * @param listener the listener to be removed + */ + void removeListener(EventListener *listener) { + m_listeners.erase( listener ); + } + + /** + * \brief Destructor. + */ + virtual ~EventSource() {} + + protected: + + /** + * \brief Fires the given event to all registered listeners. + * + *

      + * This method essentially iterates over all listeners + * and invokes {@link fireEvent(EventListener *listener, const E &event)} + * for each element. All derived classes are free to + * override the method to provide better error handling + * than the default implementation. + * + * @param event the event to be propagated to all listeners + */ + void fireEvent(const E &event); + + /** + * \brief Sends an event to the given listener. + * + * @param listener the listener to whom pass the event + * @param event the event to be handled + */ + virtual void fireEvent(EventListener *listener, const E &event); + + private: + + /** + * The set of registered event listeners. + */ + EventListeners m_listeners; + +}; + +/** + * \brief The interface of a generic event wrapper. + */ +class AbstractEventWrapper { + public: + + /** + * \brief Destructor. + */ + virtual ~AbstractEventWrapper() {} + + /** + * \brief Returns the underlying wrapee's data. + */ + virtual void *getWrapee() = 0; +}; + +/** + * \brief A template based implementation of {@link AbstractEventWrapper}. + */ +template +class EventWrapper : public AbstractEventWrapper { + public: + EventWrapper(const E &e) : m_e(e) { + } + void *getWrapee() { + return &m_e; + } + private: + E m_e; +}; + +/** + * \brief This class represents a generic event. + */ +class GenericEvent { + public: + + /** + * \brief Constructor. + */ + GenericEvent() : m_type(0) {} + + /** + * \brief Constructor. + * + * @param type the type of this event + * @param eventWarpper the wrapper around event's data + */ + GenericEvent(int type, AbstractEventWrapper *eventWrapper) : + m_type(type), m_eventWrapper(eventWrapper) { + } + + /** + * \brief Returns the type of this event. + * + * @return type of this event + */ + int getType() const { return m_type; } + + /** + * \brief Returns the event's data. + * + * @return the event's data + */ + void *getEvent() const { return m_eventWrapper->getWrapee(); } + + private: + + /** + * The event type. + */ + int m_type; + + /** + * The event represented as abstract wrapper. + */ + shared_ptr m_eventWrapper; + +}; + +/** + * \brief This class adapts {@link EventListener} to a generic listener. + * Essentially this class listens on incoming events and fires them + * as {@link GenericEvent}s. + */ +template +class EventListenerAdapter : public virtual EventListener, + public virtual EventSource +{ + public: + + /** + * \brief Constructor. + * + * @param eventSource the source on which register this listener + */ + EventListenerAdapter(EventSource &eventSource) { + eventSource.addListener(this); + } + + void eventReceived(const EventSource &source, const E &e) { + AbstractEventWrapper *wrapper = new EventWrapper(e); + GenericEvent event(type, wrapper); + fireEvent( event ); + } + +}; + +/** + * \brief This class provides an adapter between an asynchronous and synchronous + * \brief event handling. + * + *

      + * This class queues up all received events and exposes them through + * {@link #getNextEvent()} method. + */ +template +class SynchronousEventAdapter : public EventListener { + public: + + void eventReceived(const EventSource &source, const E &e) { + m_queue.put( e ); + } + + /** + * \brief Returns the next available event from the underlying queue, + * \brief possibly blocking, if no data is available. + * + * @return the next available event + */ + E getNextEvent() { + return m_queue.take(); + } + + /** + * \brief Returns whether there are any events in the queue or not. + * + * @return true if there is at least one event and + * the next call to {@link #getNextEvent} won't block + */ + bool hasEvents() const { + return (m_queue.empty() ? false : true); + } + + /** + * \brief Destructor. + */ + virtual ~SynchronousEventAdapter() {} + + private: + + /** + * The blocking queue of all events received so far. + */ + BlockingQueue m_queue; + +}; + +/** + * This typedef defines the type of a timer Id. + */ +typedef int32_t TimerId; + +/** + * This class represents a timer event parametrized by the user's data type. + */ +template +class TimerEvent { + public: + + /** + * \brief Constructor. + * + * @param id the ID of this event + * @param alarmTime when this event is to be triggered + * @param userData the user data associated with this event + */ + TimerEvent(TimerId id, int64_t alarmTime, const T &userData) : + m_id(id), m_alarmTime(alarmTime), m_userData(userData) + {} + + /** + * \brief Constructor. + */ + TimerEvent() : m_id(-1), m_alarmTime(-1) {} + + /** + * \brief Returns the ID. + * + * @return the ID of this event + */ + TimerId getID() const { return m_id; } + + /** + * \brief Returns the alarm time. + * + * @return the alarm time + */ + int64_t getAlarmTime() const { return m_alarmTime; } + + /** + * \brief Returns the user's data. + * + * @return the user's data + */ + T const &getUserData() const { return m_userData; } + + /** + * \brief Returns whether the given alarm time is less than this event's + * \brief time. + */ + bool operator<(const int64_t alarmTime) const { + return m_alarmTime < alarmTime; + } + + private: + + /** + * The ID of ths event. + */ + TimerId m_id; + + /** + * The time at which this event triggers. + */ + int64_t m_alarmTime; + + /** + * The user specific data associated with this event. + */ + T m_userData; + +}; + +template +class Timer : public EventSource > { + public: + + /** + * \brief Constructor. + */ + Timer() : m_currentEventID(0), m_terminating(false) { + m_workerThread.Create( *this, &Timer::sendAlarms ); + } + + /** + * \brief Destructor. + */ + ~Timer() { + m_terminating = true; + m_lock.notify(); + m_workerThread.Join(); + } + + /** + * \brief Schedules the given event timeFromNow milliseconds. + * + * @param timeFromNow time from now, in milliseconds, when the event + * should be triggered + * @param userData the user data associated with the timer event + * + * @return the ID of the newly created timer event + */ + TimerId scheduleAfter(int64_t timeFromNow, const T &userData) { + return scheduleAt( getCurrentTimeMillis() + timeFromNow, userData ); + } + + /** + * \brief Schedules an event at the given time. + * + * @param absTime absolute time, in milliseconds, at which the event + * should be triggered; the time is measured + * from Jan 1st, 1970 + * @param userData the user data associated with the timer event + * + * @return the ID of the newly created timer event + */ + TimerId scheduleAt(int64_t absTime, const T &userData) { + m_lock.lock(); + typename QueueType::iterator pos = + lower_bound( m_queue.begin(), m_queue.end(), absTime ); + TimerId id = m_currentEventID++; + TimerEvent event(id, absTime, userData); + m_queue.insert( pos, event ); + m_lock.notify(); + m_lock.unlock(); + return id; + } + + /** + * \brief Returns the current time since Jan 1, 1970, in milliseconds. + * + * @return the current time in milliseconds + */ + static int64_t getCurrentTimeMillis() { + struct timeval now; + gettimeofday( &now, NULL ); + return now.tv_sec * 1000LL + now.tv_usec / 1000; + } + + /** + * \brief Cancels the given timer event. + * + * + * @param eventID the ID of the event to be canceled + * + * @return whether the event has been canceled + */ + bool cancelAlarm(TimerId eventID) { + bool canceled = false; + m_lock.lock(); + typename QueueType::iterator i; + for (i = m_queue.begin(); i != m_queue.end(); ++i) { + if (eventID == i->getID()) { + m_queue.erase( i ); + canceled = true; + break; + } + } + m_lock.unlock(); + return canceled; + } + + /** + * Executes the main loop of the worker thread. + */ + void sendAlarms() { + //iterate until terminating + while (!m_terminating) { + m_lock.lock(); + //1 step - wait until there is an event in the queue + if (m_queue.empty()) { + //wait up to 100ms to get next event + m_lock.wait( 100 ); + } + bool fire = false; + if (!m_queue.empty()) { + //retrieve the event from the queue and send it + TimerEvent event = m_queue.front(); + //check whether we can send it right away + int64_t timeToWait = + event.getAlarmTime() - getCurrentTimeMillis(); + if (timeToWait <= 0) { + m_queue.pop_front(); + //we fire only if it's still in the queue and alarm + //time has just elapsed (in case the top event + //is canceled) + fire = true; + } else { + m_lock.wait( timeToWait ); + } + m_lock.unlock(); + if (fire) { + fireEvent( event ); + } + } else { + m_lock.unlock(); + } + } + } + + private: + + /** + * The type of timer events queue. + */ + typedef deque > QueueType; + + /** + * The current event ID, auto-incremented each time a new event + * is created. + */ + TimerId m_currentEventID; + + /** + * The queue of timer events sorted by {@link TimerEvent#alarmTime}. + */ + QueueType m_queue; + + /** + * The lock used to guard {@link #m_queue}. + */ + Lock m_lock; + + /** + * The thread that triggers alarms. + */ + CXXThread > m_workerThread; + + /** + * Whether {@link #m_workerThread} is terminating. + */ + volatile bool m_terminating; + +}; + +template +void EventSource::fireEvent(const E &event) { + for (typename EventListeners::iterator i = m_listeners.begin(); + i != m_listeners.end(); + ++i) + { + fireEvent( *i, event ); + } +} + +template +void EventSource::fireEvent(EventListener *listener, const E &event) { + listener->eventReceived( *this, event ); +} + +} /* end of 'namespace zkfuse' */ + +#endif /* __EVENT_H__ */ diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/zkfuse/src/log.cc b/pkg/registry/zookeeper-3.4.6/src/contrib/zkfuse/src/log.cc new file mode 100644 index 000000000..e2bfb0dd8 --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/contrib/zkfuse/src/log.cc @@ -0,0 +1,36 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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. + */ + +#include + +#include "log.h" + +using namespace std; + +/** + * \brief This class encapsulates a log4cxx configuration. + */ +class LogConfiguration { + public: + LogConfiguration(const string &file) { + PropertyConfigurator::configureAndWatch( file, 5000 ); + } +}; + +//enforces the configuration to be initialized +static LogConfiguration logConfig( "log4cxx.properties" ); diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/zkfuse/src/log.h b/pkg/registry/zookeeper-3.4.6/src/contrib/zkfuse/src/log.h new file mode 100644 index 000000000..aefce10b1 --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/contrib/zkfuse/src/log.h @@ -0,0 +1,116 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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. + */ + +#ifndef __LOG_H__ +#define __LOG_H__ + +#define ZKFUSE_NAMESPACE zkfuse +#define START_ZKFUSE_NAMESPACE namespace ZKFUSE_NAMESPACE { +#define END_ZKFUSE_NAMESPACE } +#define USING_ZKFUSE_NAMESPACE using namespace ZKFUSE_NAMESPACE; + +#include +#include +#include + +#include +#include +#include +using namespace log4cxx; +using namespace log4cxx::helpers; + +#define PRINTIP(x) ((uint8_t*)&x)[0], ((uint8_t*)&x)[1], \ + ((uint8_t*)&x)[2], ((uint8_t*)&x)[3] + +#define IPFMT "%u.%u.%u.%u" + +#define DECLARE_LOGGER(varName) \ +extern LoggerPtr varName; + +#define DEFINE_LOGGER(varName, logName) \ +static LoggerPtr varName = Logger::getLogger( logName ); + +#define MAX_BUFFER_SIZE 20000 + +#define SPRINTF_LOG_MSG(buffer, fmt, args...) \ + char buffer[MAX_BUFFER_SIZE]; \ + snprintf( buffer, MAX_BUFFER_SIZE, fmt, ##args ); + +// older versions of log4cxx don't support tracing +#ifdef LOG4CXX_TRACE +#define LOG_TRACE(logger, fmt, args...) \ + if (logger->isTraceEnabled()) { \ + SPRINTF_LOG_MSG( __tmp, fmt, ##args ); \ + LOG4CXX_TRACE( logger, __tmp ); \ + } +#else +#define LOG_TRACE(logger, fmt, args...) \ + if (logger->isDebugEnabled()) { \ + SPRINTF_LOG_MSG( __tmp, fmt, ##args ); \ + LOG4CXX_DEBUG( logger, __tmp ); \ + } +#endif + +#define LOG_DEBUG(logger, fmt, args...) \ + if (logger->isDebugEnabled()) { \ + SPRINTF_LOG_MSG( __tmp, fmt, ##args ); \ + LOG4CXX_DEBUG( logger, __tmp ); \ + } + +#define LOG_INFO(logger, fmt, args...) \ + if (logger->isInfoEnabled()) { \ + SPRINTF_LOG_MSG( __tmp, fmt, ##args ); \ + LOG4CXX_INFO( logger, __tmp ); \ + } + +#define LOG_WARN(logger, fmt, args...) \ + if (logger->isWarnEnabled()) { \ + SPRINTF_LOG_MSG( __tmp, fmt, ##args ); \ + LOG4CXX_WARN( logger, __tmp ); \ + } + +#define LOG_ERROR(logger, fmt, args...) \ + if (logger->isErrorEnabled()) { \ + SPRINTF_LOG_MSG( __tmp, fmt, ##args ); \ + LOG4CXX_ERROR( logger, __tmp ); \ + } + +#define LOG_FATAL(logger, fmt, args...) \ + if (logger->isFatalEnabled()) { \ + SPRINTF_LOG_MSG( __tmp, fmt, ##args ); \ + LOG4CXX_FATAL( logger, __tmp ); \ + } + +#ifdef DISABLE_TRACE +# define TRACE(logger, x) +#else +# define TRACE(logger, x) \ +class Trace { \ + public: \ + Trace(const void* p) : _p(p) { \ + LOG_TRACE(logger, "%s %p Enter", __PRETTY_FUNCTION__, p); \ + } \ + ~Trace() { \ + LOG_TRACE(logger, "%s %p Exit", __PRETTY_FUNCTION__, _p); \ + } \ + const void* _p; \ +} traceObj(x); +#endif /* DISABLE_TRACE */ + +#endif /* __LOG_H__ */ + diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/zkfuse/src/log4cxx.properties b/pkg/registry/zookeeper-3.4.6/src/contrib/zkfuse/src/log4cxx.properties new file mode 100644 index 000000000..1e373e42a --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/contrib/zkfuse/src/log4cxx.properties @@ -0,0 +1,28 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you 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. + +# Set root logger level to DEBUG and its only appender to A1. +log4j.rootLogger=TRACE, A1 + +# A1 is set to be a ConsoleAppender. +log4j.appender.A1=org.apache.log4cxx.ConsoleAppender + +# A1 uses PatternLayout. +log4j.appender.A1.layout=org.apache.log4cxx.PatternLayout +log4j.appender.A1.layout.ConversionPattern=%-4r [%t] %-5p %c %x - %m%n + +log4j.category.zkfuse=TRACE + diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/zkfuse/src/mutex.h b/pkg/registry/zookeeper-3.4.6/src/contrib/zkfuse/src/mutex.h new file mode 100644 index 000000000..86c460434 --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/contrib/zkfuse/src/mutex.h @@ -0,0 +1,169 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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. + */ + +#ifndef __MUTEX_H__ +#define __MUTEX_H__ + +#include +#include +#include + +#include "log.h" + +START_ZKFUSE_NAMESPACE + +class Cond; + +class Mutex { + friend class Cond; + public: + Mutex() { + pthread_mutexattr_init( &m_mutexAttr ); + pthread_mutexattr_settype( &m_mutexAttr, PTHREAD_MUTEX_RECURSIVE_NP ); + pthread_mutex_init( &mutex, &m_mutexAttr ); + } + ~Mutex() { + pthread_mutex_destroy(&mutex); + pthread_mutexattr_destroy( &m_mutexAttr ); + } + void Acquire() { Lock(); } + void Release() { Unlock(); } + void Lock() { + pthread_mutex_lock(&mutex); + } + int TryLock() { + return pthread_mutex_trylock(&mutex); + } + void Unlock() { + pthread_mutex_unlock(&mutex); + } + private: + pthread_mutex_t mutex; + pthread_mutexattr_t m_mutexAttr; +}; + +class AutoLock { + public: + AutoLock(Mutex& mutex) : _mutex(mutex) { + mutex.Lock(); + } + ~AutoLock() { + _mutex.Unlock(); + } + private: + friend class AutoUnlockTemp; + Mutex& _mutex; +}; + +class AutoUnlockTemp { + public: + AutoUnlockTemp(AutoLock & autoLock) : _autoLock(autoLock) { + _autoLock._mutex.Unlock(); + } + ~AutoUnlockTemp() { + _autoLock._mutex.Lock(); + } + private: + AutoLock & _autoLock; +}; + +class Cond { + public: + Cond() { + static pthread_condattr_t attr; + static bool inited = false; + if(!inited) { + inited = true; + pthread_condattr_init(&attr); + } + pthread_cond_init(&_cond, &attr); + } + ~Cond() { + pthread_cond_destroy(&_cond); + } + + void Wait(Mutex& mutex) { + pthread_cond_wait(&_cond, &mutex.mutex); + } + + bool Wait(Mutex& mutex, long long int timeout) { + struct timeval now; + gettimeofday( &now, NULL ); + struct timespec abstime; + int64_t microSecs = now.tv_sec * 1000000LL + now.tv_usec; + microSecs += timeout * 1000; + abstime.tv_sec = microSecs / 1000000LL; + abstime.tv_nsec = (microSecs % 1000000LL) * 1000; + if (pthread_cond_timedwait(&_cond, &mutex.mutex, &abstime) == ETIMEDOUT) { + return false; + } else { + return true; + } + } + + void Signal() { + pthread_cond_signal(&_cond); + } + + private: + pthread_cond_t _cond; +}; + +/** + * A wrapper class for {@link Mutex} and {@link Cond}. + */ +class Lock { + public: + + void lock() { + m_mutex.Lock(); + } + + void unlock() { + m_mutex.Unlock(); + } + + void wait() { + m_cond.Wait( m_mutex ); + } + + bool wait(long long int timeout) { + return m_cond.Wait( m_mutex, timeout ); + } + + void notify() { + m_cond.Signal(); + } + + private: + + /** + * The mutex. + */ + Mutex m_mutex; + + /** + * The condition associated with this lock's mutex. + */ + Cond m_cond; +}; + +END_ZKFUSE_NAMESPACE + +#endif /* __MUTEX_H__ */ + diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/zkfuse/src/thread.cc b/pkg/registry/zookeeper-3.4.6/src/contrib/zkfuse/src/thread.cc new file mode 100644 index 000000000..f1ed8166f --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/contrib/zkfuse/src/thread.cc @@ -0,0 +1,41 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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. + */ + +#include + +#include "thread.h" + +DEFINE_LOGGER( LOG, "Thread" ) + +START_ZKFUSE_NAMESPACE + +void Thread::Create(void* ctx, ThreadFunc func) +{ + pthread_attr_t attr; + pthread_attr_init(&attr); + pthread_attr_setstacksize(&attr, _stackSize); + int ret = pthread_create(&mThread, &attr, func, ctx); + if(ret != 0) { + LOG_FATAL( LOG, "pthread_create failed: %s", strerror(errno) ); + } + // pthread_attr_destroy(&attr); + _ctx = ctx; + _func = func; +} + +END_ZKFUSE_NAMESPACE diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/zkfuse/src/thread.h b/pkg/registry/zookeeper-3.4.6/src/contrib/zkfuse/src/thread.h new file mode 100644 index 000000000..0ed12d7f6 --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/contrib/zkfuse/src/thread.h @@ -0,0 +1,99 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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. + */ + +#ifndef __THREAD_H__ +#define __THREAD_H__ + +#include +#include +#include +#include + +#include "log.h" + +START_ZKFUSE_NAMESPACE + +class Thread { + public: + static const size_t defaultStackSize = 1024 * 1024; + typedef void* (*ThreadFunc) (void*); + Thread(size_t stackSize = defaultStackSize) + : _stackSize(stackSize), _ctx(NULL), _func(NULL) + { + memset( &mThread, 0, sizeof(mThread) ); + } + ~Thread() { } + + void Create(void* ctx, ThreadFunc func); + void Join() { + //avoid SEGFAULT because of unitialized mThread + //in case Create(...) was never called + if (_func != NULL) { + pthread_join(mThread, 0); + } + } + private: + pthread_t mThread; + void *_ctx; + ThreadFunc _func; + size_t _stackSize; +}; + + +template +struct ThreadContext { + typedef void (T::*FuncPtr) (void); + ThreadContext(T& ctx, FuncPtr func) : _ctx(ctx), _func(func) {} + void run(void) { + (_ctx.*_func)(); + } + T& _ctx; + FuncPtr _func; +}; + +template +void* ThreadExec(void *obj) { + ThreadContext* tc = (ThreadContext*)(obj); + assert(tc != 0); + tc->run(); + return 0; +} + +template +class CXXThread : public Thread { + public: + typedef void (T::*FuncPtr) (void); + CXXThread(size_t stackSize = Thread::defaultStackSize) + : Thread(stackSize), ctx(0) {} + ~CXXThread() { if (ctx) delete ctx; } + + void Create(T& obj, FuncPtr func) { + assert(ctx == 0); + ctx = new ThreadContext(obj, func); + Thread::Create(ctx, ThreadExec); + } + + private: + ThreadContext* ctx; +}; + + +END_ZKFUSE_NAMESPACE + +#endif /* __THREAD_H__ */ + diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/zkfuse/src/zkadapter.cc b/pkg/registry/zookeeper-3.4.6/src/contrib/zkfuse/src/zkadapter.cc new file mode 100644 index 000000000..886051d97 --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/contrib/zkfuse/src/zkadapter.cc @@ -0,0 +1,881 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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. + */ + +#include +#include + +#include "blockingqueue.h" +#include "thread.h" +#include "zkadapter.h" + +using namespace std; +using namespace zk; + +DEFINE_LOGGER( LOG, "zookeeper.adapter" ) +DEFINE_LOGGER( ZK_LOG, "zookeeper.core" ) + +/** + * \brief A helper class to initialize ZK logging. + */ +class InitZooKeeperLogging +{ + public: + InitZooKeeperLogging() { + if (ZK_LOG->isDebugEnabled() +#ifdef LOG4CXX_TRACE + || ZK_LOG->isTraceEnabled() +#endif + ) + { + zoo_set_debug_level( ZOO_LOG_LEVEL_DEBUG ); + } else if (ZK_LOG->isInfoEnabled()) { + zoo_set_debug_level( ZOO_LOG_LEVEL_INFO ); + } else if (ZK_LOG->isWarnEnabled()) { + zoo_set_debug_level( ZOO_LOG_LEVEL_WARN ); + } else { + zoo_set_debug_level( ZOO_LOG_LEVEL_ERROR ); + } + } +}; + +using namespace std; + +namespace zk +{ + +/** + * \brief This class provides logic for checking if a request can be retried. + */ +class RetryHandler +{ + public: + RetryHandler(const ZooKeeperConfig &zkConfig) + : m_zkConfig(zkConfig) + { + if (zkConfig.getAutoReconnect()) { + retries = 2; + } else { + retries = 0; + } + } + + /** + * \brief Attempts to fix a side effect of the given RC. + * + * @param rc the ZK error code + * @return whether the error code has been handled and the caller should + * retry an operation the caused this error + */ + bool handleRC(int rc) + { + TRACE( LOG, "handleRC" ); + + //check if the given error code is recoverable + if (!retryOnError(rc)) { + return false; + } + LOG_TRACE( LOG, "RC: %d, retries left: %d", rc, retries ); + if (retries-- > 0) { + return true; + } else { + return false; + } + } + + private: + /** + * The ZK config. + */ + const ZooKeeperConfig &m_zkConfig; + + /** + * The number of outstanding retries. + */ + int retries; + + /** + * Checks whether the given error entitles this adapter + * to retry the previous operation. + * + * @param zkErrorCode one of the ZK error code + */ + static bool retryOnError(int zkErrorCode) + { + return (zkErrorCode == ZCONNECTIONLOSS || + zkErrorCode == ZOPERATIONTIMEOUT); + } +}; + + +//the implementation of the global ZK event watcher +void zkWatcher(zhandle_t *zh, int type, int state, const char *path, + void *watcherCtx) +{ + TRACE( LOG, "zkWatcher" ); + + //a workaround for buggy ZK API + string sPath = + (path == NULL || + state == ZOO_SESSION_EVENT || + state == ZOO_NOTWATCHING_EVENT) + ? "" + : string(path); + LOG_INFO( LOG, + "Received a ZK event - type: %d, state: %d, path: '%s'", + type, state, sPath.c_str() ); + ZooKeeperAdapter *zka = (ZooKeeperAdapter *)zoo_get_context(zh); + if (zka != NULL) { + zka->enqueueEvent( type, state, sPath ); + } else { + LOG_ERROR( LOG, + "Skipping ZK event (type: %d, state: %d, path: '%s'), " + "because ZK passed no context", + type, state, sPath.c_str() ); + } +} + + + +// ======================================================================= + +ZooKeeperAdapter::ZooKeeperAdapter(ZooKeeperConfig config, + ZKEventListener *listener, + bool establishConnection) + throw(ZooKeeperException) + : m_zkConfig(config), + mp_zkHandle(NULL), + m_terminating(false), + m_connected(false), + m_state(AS_DISCONNECTED) +{ + TRACE( LOG, "ZooKeeperAdapter" ); + + resetRemainingConnectTimeout(); + + //enforce setting up appropriate ZK log level + static InitZooKeeperLogging INIT_ZK_LOGGING; + + if (listener != NULL) { + addListener(listener); + } + + //start the event dispatcher thread + m_eventDispatcher.Create( *this, &ZooKeeperAdapter::processEvents ); + + //start the user event dispatcher thread + m_userEventDispatcher.Create( *this, &ZooKeeperAdapter::processUserEvents ); + + //optionally establish the connection + if (establishConnection) { + reconnect(); + } +} + +ZooKeeperAdapter::~ZooKeeperAdapter() +{ + TRACE( LOG, "~ZooKeeperAdapter" ); + + try { + disconnect(); + } catch (std::exception &e) { + LOG_ERROR( LOG, + "An exception while disconnecting from ZK: %s", + e.what() ); + } + m_terminating = true; + m_userEventDispatcher.Join(); + m_eventDispatcher.Join(); +} + +void +ZooKeeperAdapter::validatePath(const string &path) throw(ZooKeeperException) +{ + TRACE( LOG, "validatePath" ); + + if (path.find( "/" ) != 0) { + throw ZooKeeperException( string("Node path must start with '/' but" + "it was '") + + path + + "'" ); + } + if (path.length() > 1) { + if (path.rfind( "/" ) == path.length() - 1) { + throw ZooKeeperException( string("Node path must not end with " + "'/' but it was '") + + path + + "'" ); + } + if (path.find( "//" ) != string::npos) { + throw ZooKeeperException( string("Node path must not contain " + "'//' but it was '") + + path + + "'" ); + } + } +} + +void +ZooKeeperAdapter::disconnect() +{ + TRACE( LOG, "disconnect" ); + LOG_TRACE( LOG, "mp_zkHandle: %p, state %d", mp_zkHandle, m_state ); + + m_stateLock.lock(); + if (mp_zkHandle != NULL) { + zookeeper_close( mp_zkHandle ); + mp_zkHandle = NULL; + setState( AS_DISCONNECTED ); + } + m_stateLock.unlock(); +} + +void +ZooKeeperAdapter::reconnect() throw(ZooKeeperException) +{ + TRACE( LOG, "reconnect" ); + + m_stateLock.lock(); + //clear the connection state + disconnect(); + + //establish a new connection to ZooKeeper + mp_zkHandle = zookeeper_init( m_zkConfig.getHosts().c_str(), + zkWatcher, + m_zkConfig.getLeaseTimeout(), + NULL, this, 0); + resetRemainingConnectTimeout(); + if (mp_zkHandle != NULL) { + setState( AS_CONNECTING ); + m_stateLock.unlock(); + } else { + m_stateLock.unlock(); + throw ZooKeeperException( + string("Unable to connect to ZK running at '") + + m_zkConfig.getHosts() + "'" ); + } + + LOG_DEBUG( LOG, "mp_zkHandle: %p, state %d", mp_zkHandle, m_state ); +} + +void +ZooKeeperAdapter::handleEvent(int type, int state, const string &path) +{ + TRACE( LOG, "handleEvent" ); + LOG_TRACE( LOG, + "type: %d, state %d, path: %s", + type, state, path.c_str() ); + Listener2Context context, context2; + //ignore internal ZK events + if (type != ZOO_SESSION_EVENT && type != ZOO_NOTWATCHING_EVENT) { + m_zkContextsMutex.Acquire(); + //check if the user context is available + if (type == ZOO_CHANGED_EVENT || type == ZOO_DELETED_EVENT) { + //we may have two types of interest here, + //in this case lets try to notify twice + context = findAndRemoveListenerContext( GET_NODE_DATA, path ); + context2 = findAndRemoveListenerContext( NODE_EXISTS, path ); + if (context.empty()) { + //make sure that the 2nd context is NULL and + // assign it to the 1st one + context = context2; + context2.clear(); + } + } else if (type == ZOO_CHILD_EVENT) { + context = findAndRemoveListenerContext( GET_NODE_CHILDREN, path ); + } else if (type == ZOO_CREATED_EVENT) { + context = findAndRemoveListenerContext( NODE_EXISTS, path ); + } + m_zkContextsMutex.Release(); + } + + handleEvent( type, state, path, context ); + if (!context2.empty()) { + handleEvent( type, state, path, context2 ); + } +} + +void +ZooKeeperAdapter::handleEvent(int type, + int state, + const string &path, + const Listener2Context &listeners) +{ + TRACE( LOG, "handleEvents" ); + + if (listeners.empty()) { + //propagate with empty context + ZKWatcherEvent event(type, state, path); + fireEvent( event ); + } else { + for (Listener2Context::const_iterator i = listeners.begin(); + i != listeners.end(); + ++i) { + ZKWatcherEvent event(type, state, path, i->second); + if (i->first != NULL) { + fireEvent( i->first, event ); + } else { + fireEvent( event ); + } + } + } +} + +void +ZooKeeperAdapter::enqueueEvent(int type, int state, const string &path) +{ + TRACE( LOG, "enqueueEvents" ); + + m_events.put( ZKWatcherEvent( type, state, path ) ); +} + +void +ZooKeeperAdapter::processEvents() +{ + TRACE( LOG, "processEvents" ); + + while (!m_terminating) { + bool timedOut = false; + ZKWatcherEvent source = m_events.take( 100, &timedOut ); + if (!timedOut) { + if (source.getType() == ZOO_SESSION_EVENT) { + LOG_INFO( LOG, + "Received SESSION event, state: %d. Adapter state: %d", + source.getState(), m_state ); + m_stateLock.lock(); + if (source.getState() == ZOO_CONNECTED_STATE) { + m_connected = true; + resetRemainingConnectTimeout(); + setState( AS_CONNECTED ); + } else if (source.getState() == ZOO_CONNECTING_STATE) { + m_connected = false; + setState( AS_CONNECTING ); + } else if (source.getState() == ZOO_EXPIRED_SESSION_STATE) { + LOG_INFO( LOG, "Received EXPIRED_SESSION event" ); + setState( AS_SESSION_EXPIRED ); + } + m_stateLock.unlock(); + } + m_userEvents.put( source ); + } + } +} + +void +ZooKeeperAdapter::processUserEvents() +{ + TRACE( LOG, "processUserEvents" ); + + while (!m_terminating) { + bool timedOut = false; + ZKWatcherEvent source = m_userEvents.take( 100, &timedOut ); + if (!timedOut) { + try { + handleEvent( source.getType(), + source.getState(), + source.getPath() ); + } catch (std::exception &e) { + LOG_ERROR( LOG, + "Unable to process event (type: %d, state: %d, " + "path: %s), because of exception: %s", + source.getType(), + source.getState(), + source.getPath().c_str(), + e.what() ); + } + } + } +} + +void +ZooKeeperAdapter::registerContext(WatchableMethod method, + const string &path, + ZKEventListener *listener, + ContextType context) +{ + TRACE( LOG, "registerContext" ); + + m_zkContexts[method][path][listener] = context; +} + +ZooKeeperAdapter::Listener2Context +ZooKeeperAdapter::findAndRemoveListenerContext(WatchableMethod method, + const string &path) +{ + TRACE( LOG, "findAndRemoveListenerContext" ); + + Listener2Context listeners; + Path2Listener2Context::iterator elem = m_zkContexts[method].find( path ); + if (elem != m_zkContexts[method].end()) { + listeners = elem->second; + m_zkContexts[method].erase( elem ); + } + return listeners; +} + +void +ZooKeeperAdapter::setState(AdapterState newState) +{ + TRACE( LOG, "setState" ); + if (newState != m_state) { + LOG_INFO( LOG, "Adapter state transition: %d -> %d", m_state, newState ); + m_state = newState; + m_stateLock.notify(); + } else { + LOG_TRACE( LOG, "New state same as the current: %d", newState ); + } +} + + +//TODO move this code to verifyConnection so reconnect() +//is called from one place only +void +ZooKeeperAdapter::waitUntilConnected() + throw(ZooKeeperException) +{ + TRACE( LOG, "waitUntilConnected" ); + long long int timeout = getRemainingConnectTimeout(); + LOG_INFO( LOG, + "Waiting up to %lld ms until a connection to ZK is established", + timeout ); + bool connected; + if (timeout > 0) { + long long int toWait = timeout; + while (m_state != AS_CONNECTED && toWait > 0) { + //check if session expired and reconnect if so + if (m_state == AS_SESSION_EXPIRED) { + LOG_INFO( LOG, + "Reconnecting because the current session has expired" ); + reconnect(); + } + struct timeval now; + gettimeofday( &now, NULL ); + int64_t milliSecs = -(now.tv_sec * 1000LL + now.tv_usec / 1000); + LOG_TRACE( LOG, "About to wait %lld ms", toWait ); + m_stateLock.wait( toWait ); + gettimeofday( &now, NULL ); + milliSecs += now.tv_sec * 1000LL + now.tv_usec / 1000; + toWait -= milliSecs; + } + waitedForConnect( timeout - toWait ); + LOG_INFO( LOG, "Waited %lld ms", timeout - toWait ); + } + connected = (m_state == AS_CONNECTED); + if (!connected) { + if (timeout > 0) { + LOG_WARN( LOG, "Timed out while waiting for connection to ZK" ); + throw ZooKeeperException("Timed out while waiting for " + "connection to ZK"); + } else { + LOG_ERROR( LOG, "Global timeout expired and still not connected to ZK" ); + throw ZooKeeperException("Global timeout expired and still not " + "connected to ZK"); + } + } + LOG_INFO( LOG, "Connected!" ); +} + +void +ZooKeeperAdapter::verifyConnection() throw(ZooKeeperException) +{ + TRACE( LOG, "verifyConnection" ); + + m_stateLock.lock(); + try { + if (m_state == AS_DISCONNECTED) { + throw ZooKeeperException("Disconnected from ZK. " \ + "Please use reconnect() before attempting to use any ZK API"); + } else if (m_state != AS_CONNECTED) { + LOG_TRACE( LOG, "Checking if need to reconnect..." ); + //we are not connected, so check if connection in progress... + if (m_state != AS_CONNECTING) { + LOG_TRACE( LOG, + "yes. Checking if allowed to auto-reconnect..." ); + //...not in progres, so check if we can reconnect + if (!m_zkConfig.getAutoReconnect()) { + //...too bad, disallowed :( + LOG_TRACE( LOG, "no. Sorry." ); + throw ZooKeeperException("ZK connection is down and " + "auto-reconnect is not allowed"); + } else { + LOG_TRACE( LOG, "...yes. About to reconnect" ); + } + //...we are good to retry the connection + reconnect(); + } else { + LOG_TRACE( LOG, "...no, already in CONNECTING state" ); + } + //wait until the connection is established + waitUntilConnected(); + } + } catch (ZooKeeperException &e) { + m_stateLock.unlock(); + throw; + } + m_stateLock.unlock(); +} + +bool +ZooKeeperAdapter::createNode(const string &path, + const string &value, + int flags, + bool createAncestors, + string &returnPath) + throw(ZooKeeperException) +{ + TRACE( LOG, "createNode (internal)" ); + validatePath( path ); + + const int MAX_PATH_LENGTH = 1024; + char realPath[MAX_PATH_LENGTH]; + realPath[0] = 0; + + int rc; + RetryHandler rh(m_zkConfig); + do { + verifyConnection(); + rc = zoo_create( mp_zkHandle, + path.c_str(), + value.c_str(), + value.length(), + &ZOO_OPEN_ACL_UNSAFE, + flags, + realPath, + MAX_PATH_LENGTH ); + } while (rc != ZOK && rh.handleRC(rc)); + if (rc != ZOK) { + if (rc == ZNODEEXISTS) { + //the node already exists + LOG_WARN( LOG, "Error %d for %s", rc, path.c_str() ); + return false; + } else if (rc == ZNONODE && createAncestors) { + LOG_WARN( LOG, "Error %d for %s", rc, path.c_str() ); + //one of the ancestors doesn't exist so lets start from the root + //and make sure the whole path exists, creating missing nodes if + //necessary + for (string::size_type pos = 1; pos != string::npos; ) { + pos = path.find( "/", pos ); + if (pos != string::npos) { + try { + createNode( path.substr( 0, pos ), "", 0, true ); + } catch (ZooKeeperException &e) { + throw ZooKeeperException( string("Unable to create " + "node ") + + path, + rc ); + } + pos++; + } else { + //no more path components + return createNode( path, value, flags, false, returnPath ); + } + } + } + LOG_ERROR( LOG,"Error %d for %s", rc, path.c_str() ); + throw ZooKeeperException( string("Unable to create node ") + + path, + rc ); + } else { + LOG_INFO( LOG, "%s has been created", realPath ); + returnPath = string( realPath ); + return true; + } +} + +bool +ZooKeeperAdapter::createNode(const string &path, + const string &value, + int flags, + bool createAncestors) + throw(ZooKeeperException) +{ + TRACE( LOG, "createNode" ); + + string createdPath; + return createNode( path, value, flags, createAncestors, createdPath ); +} + +int64_t +ZooKeeperAdapter::createSequence(const string &path, + const string &value, + int flags, + bool createAncestors) + throw(ZooKeeperException) +{ + TRACE( LOG, "createSequence" ); + + string createdPath; + bool result = createNode( path, + value, + flags | ZOO_SEQUENCE, + createAncestors, + createdPath ); + if (!result) { + return -1; + } else { + //extract sequence number from the returned path + if (createdPath.find( path ) != 0) { + throw ZooKeeperException( string("Expecting returned path '") + + createdPath + + "' to start with '" + + path + + "'" ); + } + string seqSuffix = + createdPath.substr( path.length(), + createdPath.length() - path.length() ); + char *ptr = NULL; + int64_t seq = strtol( seqSuffix.c_str(), &ptr, 10 ); + if (ptr != NULL && *ptr != '\0') { + throw ZooKeeperException( string("Expecting a number but got ") + + seqSuffix ); + } + return seq; + } +} + +bool +ZooKeeperAdapter::deleteNode(const string &path, + bool recursive, + int version) + throw(ZooKeeperException) +{ + TRACE( LOG, "deleteNode" ); + + validatePath( path ); + + int rc; + RetryHandler rh(m_zkConfig); + do { + verifyConnection(); + rc = zoo_delete( mp_zkHandle, path.c_str(), version ); + } while (rc != ZOK && rh.handleRC(rc)); + if (rc != ZOK) { + if (rc == ZNONODE) { + LOG_WARN( LOG, "Error %d for %s", rc, path.c_str() ); + return false; + } + if (rc == ZNOTEMPTY && recursive) { + LOG_WARN( LOG, "Error %d for %s", rc, path.c_str() ); + //get all children and delete them recursively... + vector nodeList; + getNodeChildren( nodeList, path, false ); + for (vector::const_iterator i = nodeList.begin(); + i != nodeList.end(); + ++i) { + deleteNode( *i, true ); + } + //...and finally attempt to delete the node again + return deleteNode( path, false ); + } + LOG_ERROR( LOG, "Error %d for %s", rc, path.c_str() ); + throw ZooKeeperException( string("Unable to delete node ") + path, + rc ); + } else { + LOG_INFO( LOG, "%s has been deleted", path.c_str() ); + return true; + } +} + +bool +ZooKeeperAdapter::nodeExists(const string &path, + ZKEventListener *listener, + void *context, Stat *stat) + throw(ZooKeeperException) +{ + TRACE( LOG, "nodeExists" ); + + validatePath( path ); + + struct Stat tmpStat; + if (stat == NULL) { + stat = &tmpStat; + } + memset( stat, 0, sizeof(Stat) ); + + int rc; + RetryHandler rh(m_zkConfig); + do { + verifyConnection(); + if (context != NULL) { + m_zkContextsMutex.Acquire(); + rc = zoo_exists( mp_zkHandle, + path.c_str(), + (listener != NULL ? 1 : 0), + stat ); + if (rc == ZOK || rc == ZNONODE) { + registerContext( NODE_EXISTS, path, listener, context ); + } + m_zkContextsMutex.Release(); + } else { + rc = zoo_exists( mp_zkHandle, + path.c_str(), + (listener != NULL ? 1 : 0), + stat ); + } + } while (rc != ZOK && rh.handleRC(rc)); + if (rc != ZOK) { + if (rc == ZNONODE) { + LOG_TRACE( LOG, "Node %s does not exist", path.c_str() ); + return false; + } + LOG_ERROR( LOG, "Error %d for %s", rc, path.c_str() ); + throw ZooKeeperException( + string("Unable to check existence of node ") + path, + rc ); + } else { + return true; + } +} + +void +ZooKeeperAdapter::getNodeChildren(vector &nodeList, + const string &path, + ZKEventListener *listener, + void *context) + throw (ZooKeeperException) +{ + TRACE( LOG, "getNodeChildren" ); + + validatePath( path ); + + String_vector children; + memset( &children, 0, sizeof(children) ); + + int rc; + RetryHandler rh(m_zkConfig); + do { + verifyConnection(); + if (context != NULL) { + m_zkContextsMutex.Acquire(); + rc = zoo_get_children( mp_zkHandle, + path.c_str(), + (listener != NULL ? 1 : 0), + &children ); + if (rc == ZOK) { + registerContext( GET_NODE_CHILDREN, path, listener, context ); + } + m_zkContextsMutex.Release(); + } else { + rc = zoo_get_children( mp_zkHandle, + path.c_str(), + (listener != NULL ? 1 : 0), + &children ); + } + } while (rc != ZOK && rh.handleRC(rc)); + if (rc != ZOK) { + LOG_ERROR( LOG, "Error %d for %s", rc, path.c_str() ); + throw ZooKeeperException( string("Unable to get children of node ") + + path, + rc ); + } else { + for (int i = 0; i < children.count; ++i) { + //convert each child's path from relative to absolute + string absPath(path); + if (path != "/") { + absPath.append( "/" ); + } + absPath.append( children.data[i] ); + nodeList.push_back( absPath ); + } + //make sure the order is always deterministic + sort( nodeList.begin(), nodeList.end() ); + } +} + +string +ZooKeeperAdapter::getNodeData(const string &path, + ZKEventListener *listener, + void *context, Stat *stat) + throw(ZooKeeperException) +{ + TRACE( LOG, "getNodeData" ); + + validatePath( path ); + + const int MAX_DATA_LENGTH = 128 * 1024; + char buffer[MAX_DATA_LENGTH]; + memset( buffer, 0, MAX_DATA_LENGTH ); + struct Stat tmpStat; + if (stat == NULL) { + stat = &tmpStat; + } + memset( stat, 0, sizeof(Stat) ); + + int rc; + int len; + RetryHandler rh(m_zkConfig); + do { + verifyConnection(); + len = MAX_DATA_LENGTH - 1; + if (context != NULL) { + m_zkContextsMutex.Acquire(); + rc = zoo_get( mp_zkHandle, + path.c_str(), + (listener != NULL ? 1 : 0), + buffer, &len, stat ); + if (rc == ZOK) { + registerContext( GET_NODE_DATA, path, listener, context ); + } + m_zkContextsMutex.Release(); + } else { + rc = zoo_get( mp_zkHandle, + path.c_str(), + (listener != NULL ? 1 : 0), + buffer, &len, stat ); + } + } while (rc != ZOK && rh.handleRC(rc)); + if (rc != ZOK) { + LOG_ERROR( LOG, "Error %d for %s", rc, path.c_str() ); + throw ZooKeeperException( + string("Unable to get data of node ") + path, rc + ); + } else { + return string( buffer, buffer + len ); + } +} + +void +ZooKeeperAdapter::setNodeData(const string &path, + const string &value, + int version) + throw(ZooKeeperException) +{ + TRACE( LOG, "setNodeData" ); + + validatePath( path ); + + int rc; + RetryHandler rh(m_zkConfig); + do { + verifyConnection(); + rc = zoo_set( mp_zkHandle, + path.c_str(), + value.c_str(), + value.length(), + version); + } while (rc != ZOK && rh.handleRC(rc)); + if (rc != ZOK) { + LOG_ERROR( LOG, "Error %d for %s", rc, path.c_str() ); + throw ZooKeeperException( string("Unable to set data for node ") + + path, + rc ); + } +} + +} /* end of 'namespace zk' */ + diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/zkfuse/src/zkadapter.h b/pkg/registry/zookeeper-3.4.6/src/contrib/zkfuse/src/zkadapter.h new file mode 100644 index 000000000..8d4d1d57f --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/contrib/zkfuse/src/zkadapter.h @@ -0,0 +1,718 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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. + */ + +#ifndef __ZKADAPTER_H__ +#define __ZKADAPTER_H__ + +#include +#include +#include + +extern "C" { +#include "zookeeper.h" +} + +#include "log.h" +#include "mutex.h" +#include "thread.h" +#include "blockingqueue.h" +#include "event.h" + +using namespace std; +using namespace zkfuse; + +namespace zk { + +/** + * \brief A cluster related exception. + */ +class ZooKeeperException : + public std::exception +{ + public: + + /** + * \brief Constructor. + * + * @param msg the detailed message associated with this exception + */ + ZooKeeperException(const string &msg) : + m_message(msg), m_zkErrorCode(0) + {} + + /** + * \brief Constructor. + * + * @param msg the detailed message associated with this exception + * @param errorCode the ZK error code associated with this exception + */ + ZooKeeperException(const string &msg, int errorCode) : + m_zkErrorCode(errorCode) + { + char tmp[100]; + sprintf( tmp, " (ZK error code: %d)", errorCode ); + m_message = msg + tmp; + } + + /** + * \brief Destructor. + */ + ~ZooKeeperException() throw() {} + + /** + * \brief Returns detailed description of the exception. + */ + const char *what() const throw() { + return m_message.c_str(); + } + + /** + * \brief Returns the ZK error code. + */ + int getZKErrorCode() const { + return m_zkErrorCode; + } + + private: + + /** + * The detailed message associated with this exception. + */ + string m_message; + + /** + * The optional error code received from ZK. + */ + int m_zkErrorCode; + +}; + +/** + * \brief This class encapsulates configuration of a ZK client. + */ +class ZooKeeperConfig +{ + public: + + /** + * \brief Constructor. + * + * @param hosts the comma separated list of host and port pairs of ZK nodes + * @param leaseTimeout the lease timeout (heartbeat) + * @param autoReconnect whether to allow for auto-reconnect + * @param connectTimeout the connect timeout, in milliseconds; + */ + ZooKeeperConfig(const string &hosts, + int leaseTimeout, + bool autoReconnect = true, + long long int connectTimeout = 15000) : + m_hosts(hosts), m_leaseTimeout(leaseTimeout), + m_autoReconnect(autoReconnect), m_connectTimeout(connectTimeout) {} + + /** + * \brief Returns the list of ZK hosts to connect to. + */ + string getHosts() const { return m_hosts; } + + /** + * \brief Returns the lease timeout. + */ + int getLeaseTimeout() const { return m_leaseTimeout; } + + /** + * \brief Returns whether {@link ZooKeeperAdapter} should attempt + * \brief to automatically reconnect in case of a connection failure. + */ + bool getAutoReconnect() const { return m_autoReconnect; } + + /** + * \brief Gets the connect timeout. + * + * @return the connect timeout + */ + long long int getConnectTimeout() const { return m_connectTimeout; } + + private: + + /** + * The host addresses of ZK nodes. + */ + const string m_hosts; + + /** + * The ZK lease timeout. + */ + const int m_leaseTimeout; + + /** + * True if this adapater should attempt to autoreconnect in case + * the current session has been dropped. + */ + const bool m_autoReconnect; + + /** + * How long to wait, in milliseconds, before a connection + * is established to ZK. + */ + const long long int m_connectTimeout; + +}; + +/** + * \brief A data value object representing a watcher event received from the ZK. + */ +class ZKWatcherEvent +{ + public: + + /** + * \brief The type representing the user's context. + */ + typedef void *ContextType; + + /** + * \brief Constructor. + * + * @param type the type of this event + * @param state the state of this event + * @param path the corresponding path, may be empty for some event types + * @param context the user specified context; possibly NULL + */ + ZKWatcherEvent() : + m_type(-1), m_state(-1), m_path(""), mp_context(NULL) {} + + /** + * \brief Constructor. + * + * @param type the type of this event + * @param state the state of this event + * @param path the corresponding path, may be empty for some event types + * @param context the user specified context; possibly NULL + */ + ZKWatcherEvent(int type, int state, const string &path, + ContextType context = NULL) : + m_type(type), m_state(state), m_path(path), mp_context(context) {} + + int getType() const { return m_type; } + int getState() const { return m_state; } + string const &getPath() const { return m_path; } + ContextType getContext() const { return mp_context; } + + bool operator==(const ZKWatcherEvent &we) const { + return m_type == we.m_type && m_state == we.m_state + && m_path == we.m_path && mp_context == we.mp_context; + } + + private: + + /** + * The type of this event. It can be either ZOO_CREATED_EVENT, ZOO_DELETED_EVENT, + * ZOO_CHANGED_EVENT, ZOO_CHILD_EVENT, ZOO_SESSION_EVENT or ZOO_NOTWATCHING_EVENT. + * See zookeeper.h for more details. + */ + const int m_type; + + /** + * The state of ZK at the time of sending this event. + * It can be either ZOO_CONNECTING_STATE, ZOO_ASSOCIATING_STATE, + * ZOO_CONNECTED_STATE, ZOO_EXPIRED_SESSION_STATE or AUTH_FAILED_STATE. + * See {@file zookeeper.h} for more details. + */ + const int m_state; + + /** + * The corresponding path of the node in subject. It may be empty + * for some event types. + */ + const string m_path; + + /** + * The pointer to the user specified context, possibly NULL. + */ + ContextType mp_context; + +}; + +/** + * \brief The type definition of ZK event source. + */ +typedef EventSource ZKEventSource; + +/** + * \brief The type definition of ZK event listener. + */ +typedef EventListener ZKEventListener; + +/** + * \brief This is a wrapper around ZK C synchrounous API. + */ +class ZooKeeperAdapter + : public ZKEventSource +{ + public: + /** + * \brief The global function that handles all ZK asynchronous notifications. + */ + friend void zkWatcher(zhandle_t *, int, int, const char *, void *watcherCtx); + + /** + * \brief The type representing the user's context. + */ + typedef void *ContextType; + + /** + * \brief The map type of ZK event listener to user specified context mapping. + */ + typedef map Listener2Context; + + /** + * \brief The map type of ZK path's to listener's contexts. + */ + typedef map Path2Listener2Context; + + /** + * \brief All possible states of this client, in respect to + * \brief connection to the ZK server. + */ + enum AdapterState { + //mp_zkHandle is NULL + AS_DISCONNECTED = 0, + //mp_zkHandle is valid but this client is reconnecting + AS_CONNECTING, + //mp_zkHandle is valid and this client is connected + AS_CONNECTED, + //mp_zkHandle is valid, however no more calls can be made to ZK API + AS_SESSION_EXPIRED + }; + + /** + * \brief Constructor. + * Attempts to create a ZK adapter, optionally connecting + * to the ZK. Note, that if the connection is to be established + * and the given listener is NULL, some events may be lost, + * as they may arrive asynchronously before this method finishes. + * + * @param config the ZK configuration + * @param listener the event listener to be used for listening + * on incoming ZK events; + * if NULL not used + * @param establishConnection whether to establish connection to the ZK + * + * @throw ZooKeeperException if cannot establish connection to the given ZK + */ + ZooKeeperAdapter(ZooKeeperConfig config, + ZKEventListener *listener = NULL, + bool establishConnection = false) + throw(ZooKeeperException); + + /** + * \brief Destructor. + */ + ~ZooKeeperAdapter(); + + /** + * \brief Returns the current config. + */ + const ZooKeeperConfig &getZooKeeperConfig() const { + return m_zkConfig; + } + + /** + * \brief Restablishes connection to the ZK. + * If this adapter is already connected, the current connection + * will be dropped and a new connection will be established. + * + * @throw ZooKeeperException if cannot establish connection to the ZK + */ + void reconnect() throw(ZooKeeperException); + + /** + * \brief Disconnects from the ZK and unregisters {@link #mp_zkHandle}. + */ + void disconnect(); + + /** + * \brief Creates a new node identified by the given path. + * This method will optionally attempt to create all missing ancestors. + * + * @param path the absolute path name of the node to be created + * @param value the initial value to be associated with the node + * @param flags the ZK flags of the node to be created + * @param createAncestors if true and there are some missing ancestor nodes, + * this method will attempt to create them + * + * @return true if the node has been successfully created; false otherwise + * @throw ZooKeeperException if the operation has failed + */ + bool createNode(const string &path, + const string &value = "", + int flags = 0, + bool createAncestors = true) + throw(ZooKeeperException); + + /** + * \brief Creates a new sequence node using the give path as the prefix. + * This method will optionally attempt to create all missing ancestors. + * + * @param path the absolute path name of the node to be created; + * @param value the initial value to be associated with the node + * @param flags the ZK flags of the sequence node to be created + * (in addition to SEQUENCE) + * @param createAncestors if true and there are some missing ancestor + * nodes, this method will attempt to create them + * + * @return the sequence number associate with newly created node, + * or -1 if it couldn't be created + * @throw ZooKeeperException if the operation has failed + */ + int64_t createSequence(const string &path, + const string &value = "", + int flags = 0, + bool createAncestors = true) + throw(ZooKeeperException); + + /** + * \brief Deletes a node identified by the given path. + * + * @param path the absolute path name of the node to be deleted + * @param recursive if true this method will attempt to remove + * all children of the given node if any exist + * @param version the expected version of the node. The function will + * fail if the actual version of the node does not match + * the expected version + * + * @return true if the node has been deleted; false otherwise + * @throw ZooKeeperException if the operation has failed + */ + bool deleteNode(const string &path, bool recursive = false, int version = -1) + throw(ZooKeeperException); + + /** + * \brief Checks whether the given node exists or not. + * + * @param path the absolute path name of the node to be checked + * @param listener the listener for ZK watcher events; + * passing non NULL effectively establishes + * a ZK watch on the given node + * @param context the user specified context that is to be passed + * in a corresponding {@link ZKWatcherEvent} at later time; + * not used if listener is NULL + * @param stat the optional node statistics to be filled in by ZK + * + * @return true if the given node exists; false otherwise + * @throw ZooKeeperException if the operation has failed + */ + bool nodeExists(const string &path, + ZKEventListener *listener = NULL, + void *context = NULL, + Stat *stat = NULL) + throw(ZooKeeperException); + + /** + * \brief Retrieves list of all children of the given node. + * + * @param path the absolute path name of the node for which to get children + * @param listener the listener for ZK watcher events; + * passing non NULL effectively establishes + * a ZK watch on the given node + * @param context the user specified context that is to be passed + * in a corresponding {@link ZKWatcherEvent} at later time; + * not used if listener is NULL + * + * @return the list of absolute paths of child nodes, possibly empty + * @throw ZooKeeperException if the operation has failed + */ + void getNodeChildren(vector &children, + const string &path, + ZKEventListener *listener = NULL, + void *context = NULL) + throw(ZooKeeperException); + + /** + * \brief Gets the given node's data. + * + * @param path the absolute path name of the node to get data from + * @param listener the listener for ZK watcher events; + * passing non NULL effectively establishes + * a ZK watch on the given node + * @param context the user specified context that is to be passed + * in a corresponding {@link ZKWatcherEvent} at later time; + * not used if listener is NULL + * @param stat the optional node statistics to be filled in by ZK + * + * @return the node's data + * @throw ZooKeeperException if the operation has failed + */ + string getNodeData(const string &path, + ZKEventListener *listener = NULL, + void *context = NULL, + Stat *stat = NULL) + throw(ZooKeeperException); + + /** + * \brief Sets the given node's data. + * + * @param path the absolute path name of the node to get data from + * @param value the node's data to be set + * @param version the expected version of the node. The function will + * fail if the actual version of the node does not match + * the expected version + * + * @throw ZooKeeperException if the operation has failed + */ + void setNodeData(const string &path, const string &value, int version = -1) + throw(ZooKeeperException); + + /** + * \brief Validates the given path to a node in ZK. + * + * @param the path to be validated + * + * @throw ZooKeeperException if the given path is not valid + * (for instance it doesn't start with "/") + */ + static void validatePath(const string &path) throw(ZooKeeperException); + + /** + * Returns the current state of this adapter. + * + * @return the current state of this adapter + * @see AdapterState + */ + AdapterState getState() const { + return m_state; + } + + private: + + /** + * This enum defines methods from this class than can trigger an event. + */ + enum WatchableMethod { + NODE_EXISTS = 0, + GET_NODE_CHILDREN, + GET_NODE_DATA + }; + + /** + * \brief Creates a new node identified by the given path. + * This method is used internally to implement {@link createNode(...)} + * and {@link createSequence(...)}. On success, this method will set + * createdPath. + * + * @param path the absolute path name of the node to be created + * @param value the initial value to be associated with the node + * @param flags the ZK flags of the node to be created + * @param createAncestors if true and there are some missing ancestor nodes, + * this method will attempt to create them + * @param createdPath the actual path of the node that has been created; + * useful for sequences + * + * @return true if the node has been successfully created; false otherwise + * @throw ZooKeeperException if the operation has failed + */ + bool createNode(const string &path, + const string &value, + int flags, + bool createAncestors, + string &createdPath) + throw(ZooKeeperException); + + /** + * Handles an asynchronous event received from the ZK. + */ + void handleEvent(int type, int state, const string &path); + + /** + * Handles an asynchronous event received from the ZK. + * This method iterates over all listeners and passes the event + * to each of them. + */ + void handleEvent(int type, int state, const string &path, + const Listener2Context &listeners); + + /** + * \brief Enqueues the given event in {@link #m_events} queue. + */ + void enqueueEvent(int type, int state, const string &path); + + /** + * \brief Processes all ZK adapter events in a loop. + */ + void processEvents(); + + /** + * \brief Processes all user events in a loop. + */ + void processUserEvents(); + + /** + * \brief Registers the given context in the {@link #m_zkContexts} + * \brief contexts map. + * + * @param method the method where the given path is being used + * @param path the path of interest + * @param listener the event listener to call back later on + * @param context the user specified context to be passed back to user + */ + void registerContext(WatchableMethod method, const string &path, + ZKEventListener *listener, ContextType context); + + /** + * \brief Attempts to find a listener to context map in the contexts' + * \brief map, based on the specified criteria. + * If the context is found, it will be removed the udnerlying map. + * + * @param method the method type identify Listener2Context map + * @param path the path to be used to search in the Listener2Context map + * + * @return the context map associated with the given method and path, + * or empty map if not found + */ + Listener2Context findAndRemoveListenerContext(WatchableMethod method, + const string &path); + + /** + * Sets the new state in case it's different then the current one. + * This method assumes that {@link #m_stateLock} has been already locked. + * + * @param newState the new state to be set + */ + void setState(AdapterState newState); + + /** + * Waits until this client gets connected. The total wait time + * is given by {@link getRemainingConnectTimeout()}. + * If a timeout elapses, this method will throw an exception. + * + * @throw ZooKeeperException if unable to connect within the given timeout + */ + void waitUntilConnected() + throw(ZooKeeperException); + + /** + * Verifies whether the connection is established, + * optionally auto reconnecting. + * + * @throw ZooKeeperConnection if this client is disconnected + * and auto-reconnect failed or was not allowed + */ + void verifyConnection() throw(ZooKeeperException); + + /** + * Returns the remaining connect timeout. The timeout resets + * to {@link #m_connectTimeout} on a successfull connection to the ZK. + * + * @return the remaining connect timeout, in milliseconds + */ + long long int getRemainingConnectTimeout() { + return m_remainingConnectTimeout; + } + + /** + * Resets the remaining connect timeout to {@link #m_connectTimeout}. + */ + void resetRemainingConnectTimeout() { + m_remainingConnectTimeout = m_zkConfig.getConnectTimeout(); + } + + /** + * Updates the remaining connect timeout to reflect the given wait time. + * + * @param time the time for how long waited so far on connect to succeed + */ + void waitedForConnect(long long time) { + m_remainingConnectTimeout -= time; + } + + private: + + /** + * The mutex use to protect {@link #m_zkContexts}. + */ + zkfuse::Mutex m_zkContextsMutex; + + /** + * The map of registered ZK paths that are being watched. + * Each entry maps a function type to another map of registered contexts. + * + * @see WatchableMethod + */ + map m_zkContexts; + + /** + * The current ZK configuration. + */ + const ZooKeeperConfig m_zkConfig; + + /** + * The current ZK session. + */ + zhandle_t *mp_zkHandle; + + /** + * The blocking queue of all events waiting to be processed by ZK adapter. + */ + BlockingQueue m_events; + + /** + * The blocking queue of all events waiting to be processed by users + * of ZK adapter. + */ + BlockingQueue m_userEvents; + + /** + * The thread that dispatches all events from {@link #m_events} queue. + */ + CXXThread m_eventDispatcher; + + /** + * The thread that dispatches all events from {@link #m_userEvents} queue. + */ + CXXThread m_userEventDispatcher; + + /** + * Whether {@link #m_eventDispatcher} is terminating. + */ + volatile bool m_terminating; + + /** + * Whether this adapter is connected to the ZK. + */ + volatile bool m_connected; + + /** + * The state of this adapter. + */ + AdapterState m_state; + + /** + * The lock used to synchronize access to {@link #m_state}. + */ + Lock m_stateLock; + + /** + * How much time left for the connect to succeed, in milliseconds. + */ + long long int m_remainingConnectTimeout; + +}; + +} /* end of 'namespace zk' */ + +#endif /* __ZKADAPTER_H__ */ diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/zkfuse/src/zkfuse.cc b/pkg/registry/zookeeper-3.4.6/src/contrib/zkfuse/src/zkfuse.cc new file mode 100644 index 000000000..6a8216885 --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/contrib/zkfuse/src/zkfuse.cc @@ -0,0 +1,4492 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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. + */ + +#define FUSE_USE_VERSION 26 + +#ifdef HAVE_CONFIG_H +#include +#endif + +#undef _GNU_SOURCE +#define _GNU_SOURCE + +extern "C" { +#include +#include +} +#include +#include +#include +#include +#include +#include +#include +#ifdef HAVE_SETXATTR +#include +#endif + +#include + +#include +#include +#include +#include +#include +#include + +#include "log.h" +#include "mutex.h" +#include "zkadapter.h" + +#define ZOOKEEPER_ROOT_CHILDREN_WATCH_BUG + +/** + Typedef for ZooKeeperAdapter::Data. +*/ +typedef std::string Data; +/** + Typedef for ZooKeeperAdapter::NodeNames. +*/ +typedef vector NodeNames; + +#define MAX_DATA_SIZE 1024; + +DEFINE_LOGGER(LOG, "zkfuse"); + +inline +uint64_t millisecsToSecs(uint64_t millisecs) +{ + return millisecs / 1000; +} +inline +uint64_t secsToMillisecs(uint64_t secs) +{ + return secs * 1000; +} +inline +uint64_t nanosecsToMillisecs(uint64_t nanosecs) +{ + return nanosecs / 1000000; +} +inline +uint64_t timespecToMillisecs(const struct timespec & ts) +{ + return secsToMillisecs(ts.tv_sec) + nanosecsToMillisecs(ts.tv_nsec); +} + +typedef boost::shared_ptr ZooKeeperAdapterSharedPtr; + +/** + * ZkFuseCommon - holds immutable configuration objects. + * + * No locks are required to access these objects. + * A ZkFuseCommon instance is considered to be a data object and may be copied. + */ +class ZkFuseCommon +{ + private: + /** + References the ZooKeeperAdapter instance to be used. + */ + ZooKeeperAdapterSharedPtr _zkAdapter; + /** + Path to the ZooKeeper root node. + */ + std::string _rootPathName; + /** + Name used to access data "file" when the ZK node has + children. + */ + std::string _dataFileName; + /** + Suffix added to path components to force interpretation of + path components as directory. This is usually only required + for the last component. For example, ZkFuse may consider + a leaf node a regular file, e.g. /a/b/c/leaf. The suffix + can be used to create child under this node, e.g. + mkdir /a/b/c/leaf{forceDirSuffix}/new_leaf. + */ + std::string _forceDirSuffix; + /** + Prefix common to all metadata nodes created by ZkFuse. + */ + std::string _metadataNamePrefix; + /** + Path component name that identifies a directory metadata node. + A directory metadata node is currently empty. It is used by ZkFuse + to create a child when mkdir is used. This prevents ZkFuse + from interpreting the new child as a regular file. + */ + std::string _dirMetadataName; + /** + Path component name that identifies a regular file metadata node. + A regular metadata node holds metadata required to implement + Posix regular file semantics, such as setting mtime. + */ + std::string _regMetadataName; + /** + Number of not-in-use nodes to cache. + */ + unsigned _cacheSize; + /** + Assume this userid owns all nodes. + */ + const uid_t _uid; + /** + Assume this groupid owns all nodes. + */ + const gid_t _gid; + /** + Blocksize used to calculate number of blocks used for stat. + */ + const unsigned _blkSize; + + public: + /** + Constructor. + */ + ZkFuseCommon() + : _zkAdapter(), + _rootPathName("/"), + _dataFileName(), + _forceDirSuffix(), + _metadataNamePrefix(".zkfuse."), + _dirMetadataName(_metadataNamePrefix + "dir"), + _regMetadataName(_metadataNamePrefix + "file"), + _cacheSize(256), + _uid(geteuid()), + _gid(getegid()), + _blkSize(8192) + { + } + /** + Get root path name. Always "/". + \see _rootPathName + */ + const std::string & getRootPathName() const + { + return _rootPathName; + } + /** + Get dataFileName - the name for synthesized files to access + ZooKeeper node data. + \see _dataFileName + */ + const std::string & getDataFileName() const + { + return _dataFileName; + } + /** + Set dataFileName. + \see getDataFileName + \see _dataFileName + */ + void setDataFileName(const std::string & dataFileName) + { + _dataFileName = dataFileName; + } + /** + Get metadataNamePrefix - the common prefix for all ZkFuse created + metadata ZooKeeper nodes. + \see _metadataNamePrefix + */ + const std::string & getMetadataNamePrefix() const + { + return _metadataNamePrefix; + } + /** + Get forceDirSuffix - the suffix added to a path component to force + the path component to be treated like a directory. + \see _forceDirSuffix + */ + const std::string & getForceDirSuffix() const + { + return _forceDirSuffix; + } + /** + Set forceDirSuffix. + \see getForceDirSuffix + \see _forceDirSuffix + */ + void setForceDirSuffix(const std::string & forceDirSuffix) + { + _forceDirSuffix = forceDirSuffix; + } + /** + Get dirMetadataName - path component name of all directory + metadata ZooKeeper nodes. + \see _dirMetadataname + */ + const std::string & getDirMetadataName() const + { + return _dirMetadataName; + } + /** + Get regMetadataName - path component name of all regular file + metadata ZooKeeper nodes. + \see _regMetadataname + */ + const std::string & getRegMetadataName() const + { + return _regMetadataName; + } + /** + Get number of not-in-use ZkFuseFile instances to to cache. + \see _cacheSize + */ + unsigned getCacheSize() const + { + return _cacheSize; + } + /** + Set cache size. + \see getCacheSize + \see _cacheSize + */ + void setCacheSize(unsigned v) + { + _cacheSize = v; + } + /** + Get userid. + \see _uid + */ + uid_t getUid() const + { + return _uid; + } + /** + Get groupid. + \see _gid + */ + gid_t getGid() const + { + return _gid; + } + /** + Get block size. + \see _blkSize + */ + unsigned getBlkSize() const + { + return _blkSize; + } + /** + Get ZooKeeperAdapter. + \see _zkAdapter. + */ + const ZooKeeperAdapterSharedPtr & getZkAdapter() const + { + return _zkAdapter; + } + /** + Set ZooKeeperAdapter. + \see _zkAdaptor + */ + void setZkAdapter(const ZooKeeperAdapterSharedPtr & zkAdapter) + { + _zkAdapter = zkAdapter; + } +}; + +/** + ZkFuseNameType - identifies the type of the ZkFuse path. + */ +enum ZkFuseNameType { + /** + ZkFuse path is not syntheiszed. + ZkFuse should use its default rules to determine the Posix representation + of the path. + */ + ZkFuseNameDefaultType = 0, + /** + ZkFuse path is synthesized and identifies the data part of a + ZooKeeper node, i.e. Posix regular file semantics is expected. + */ + ZkFuseNameRegType = 1, + /** + ZkFuse path is synthesized and identifies the chidlren part of a + ZooKeeper node, i.e. Posix directory semantics is expected. + */ + ZkFuseNameDirType = 2 +}; + +class ZkFuseFile; + +typedef ZkFuseFile * ZkFuseFilePtr; + +class ZkFuseHandleManagerFactory; + +/** + ZkFuseHandleManager - keeps track of all the ZkFuseFile instances + allocated by a ZkFuseHandleManager instance and provides them + with a handle that can be used by FUSE. + + It maps a ZooKeeper path to a handle and a handle to a ZkFuse instance. + It also implements the methods that takes path names as arguments, such + as open, mknod, rmdir, and rename. + + Memory management + - References ZkFuseFile instances using regular pointers + Smart pointer is not used because reference counts are needed to + determine how many time a node is opened as a regular file or + directory. This also avoids circular smart pointer references. + - Each ZkFuseFile instance holds a reference to its ZkFuseHandleManager + using a boost::shared_ptr. This ensures that the ZkFuseHandleManager + instance that has the handle for the ZkFuseFile instance does not + get garbage collected while the ZkFuseFile instance exists. + + Concurrency control + - Except for the immutable ZkFuseCommon, all other member variables + are protected by _mutex. + - A method in this class can hold _mutex when it directly or + indirectly invokes ZkFuseFile methods. A ZkFuseFile method that holds + a ZkFuseFile instance _mutex cannot invoke a ZkFuseHandleManager + method that acquires the ZkFuseHandleManager instance's _mutex. + Otherwise, this may cause a dead lock. + - Methods that with names that begin with "_" do not acquire _mutex. + They are usually called by public methods that acquire and hold _mutex. + */ +class ZkFuseHandleManager : boost::noncopyable +{ + private: + /** + Typedef of handle, which is an int. + */ + typedef int Handle; + /** + Typedef of std::map used to map path to handle. + */ + typedef std::map Map; + /** + Typedef of std::vector used to map handle to ZkFuseFile instances. + */ + typedef std::vector Files; + /** + Typedef of std::vector used to hold unused handles. + */ + typedef std::vector FreeList; + /** + Typedef of boost::weak_ptr to the ZkFuseHandleManager instance. + */ + typedef boost::weak_ptr WeakPtr; + + /* Only ZkFuseHandleManagerFactory can create instances of this class */ + friend class ZkFuseHandleManagerFactory; + + /** + Contains common configuration. + Immutable so that it can be accessed without locks. + */ + const ZkFuseCommon _common; + /** + Maps a path name to a Handle. + */ + Map _map; + /** + Maps a handle to a ZkFuseFile instances. + Also holds pointers to all known ZkFuseFile instances. + An element may point to an allocated ZkFuseFile instance or be NULL. + + An allocated ZkFuseFile instance may be in one of the following states: + - in-use + Currently open, i.e. the ZkFuseFile instance's reference count + greater than 0. + - in-cache + Not currently open, i.e. the ZkFuseFile instances's + reference count is 0. + */ + Files _files; + /** + List of free'ed handles. + */ + FreeList _freeList; + /** + Mutex used to protect this instance. + */ + mutable zkfuse::Mutex _mutex; + /** + Count of number of in-use entries. + It used to calculate number of cached nodes. + Number cached nodes is (_files.size() - _numInUse). + */ + unsigned _numInUse; + /** + WeakPtr to myself. + */ + WeakPtr _thisWeakPtr; + + /** + Obtain a handle for the given path. + - If path is not known, then allocate a new handle and increment + _numInUse, and set newFile to true. The allocated + ZkFuseFile instance's reference count should be 1. + - If path is known, increase the corresponding + ZkFuseFile instance's reference count. + + \return the allocated handle. + \param path the path to lookup. + \param newFile indicates whether a new handle has been allocated. + */ + Handle allocate(const std::string & path, bool & newFile); + + /** + Constructor. + + \param common the immutable common configuration. + \param reserve number of elements to pre-allocate for + _files and _freeList. + */ + ZkFuseHandleManager( + const ZkFuseCommon & common, + const unsigned reserve) + : _common(common), + _files(), + _freeList(), + _mutex(), + _numInUse(0) + { + _files.reserve(reserve); + _files[0] = NULL; /* 0 never allocated */ + _files.resize(1); + _freeList.reserve(reserve); + } + + public: + /** + Typedef for boost::shared_ptr for this ZkFuseHandleManager class. + */ + typedef boost::shared_ptr SharedPtr; + + /** + Destructor. + */ + ~ZkFuseHandleManager() + { + } + /** + Get the ZkFuseFile instance for a handle. + + \return the ZkFuseFile instance identified by the handle. + \param handle get ZkFuseFile instance for this handle. + */ + ZkFuseFilePtr getFile(Handle handle) const + { + AutoLock lock(_mutex); + return _files[handle]; + } + /** + Get the immutable common configuration. + + \return the common configuration instance. + */ + const ZkFuseCommon & getCommon() const + { + return _common; + } + /** + Deallocate a previously allocated handle. + This decrements the reference count of the corresponding + ZkFuseFile instance. If the reference count becomes zero, + decrement _numInUse. It may also cause the ZkFuseFile instance + to be reclaimed if there are too many cached ZkFuseFile instances. + + The ZkFuseFile instance should be reclaimed if the number of + unused ZkFuseFile instances exceeds the configured cache size, i.e. + (_files.size() - _numInUse) > _common.getCacheSize() + and the ZkFuseFile instance has a reference count of zero. + + Reclaiming a ZkFuseFile instance involves removing the ZkFuseFile + instance's path to handle mapping from _map and the handle to the + ZkFuseFile instance mapping from _files, adding the handle to + the _freeList, and finally deleting the ZkFuseFile instance. + + \param handle the handle that should be deallocated. + */ + void deallocate(Handle handle); + /** + Handles ZooKeeper session events. + It invokes the known ZkFuseFile instances to let them know + that their watches will no longer be valid. + */ + void eventReceived(const ZKWatcherEvent & event); + /** + Get data from the specified the ZooKeeper path. + + \return 0 if successful, otherwise return negative errno. + \param path the path of the ZooKeeper node. + \param data return data read. + */ + int getData(const std::string & path, Data & data); + /** + Set data into the specified ZooKeeper path. + + \return 0 if successful, otherwise return negative errno. + \param path the path of the ZooKeeper node. + \param data the data to be written. + \param exists set to true if this path exists. + \param doFlush set to true if new data should be flushed to ZooKeeper. + */ + int setData(const std::string & path, + const Data & data, + bool exists, + bool doFlush); + /** + Create a ZooKeeper node to represent a ZkFuse file or directory. + + \return handle if successful, otherwise return negative errno. + \param path to create. + \param mode should be either S_IFDIR for directory or + S_IFREG for regular file. + \param mayExist if set and the ZooKeeper node already exist, return + valid handle instead of -EEXIST. + \param created returns whether a new ZooKeeper node had been created. + */ + int mknod(const std::string & path, + mode_t mode, + bool mayExist, + bool & created); + /** + Open a ZooKeeper node. + + The justCreated argument is used to differentiate if the _deleted flag + of the ZkFuseFile instance is to be trusted (i.e. the path + does not exist in ZooKeeper.) The _deleted flag is trusted + if the ZkFuseFile instance is known to exist in ZooKeeper after + invoking ZooKeeper with the path. + + If justCreated is true, then the ZkFuseFile instance was just created. + The ZkFuseFile constructor sets the _deleted flag to true because + path is not known to exist and hence should not be accessed. + The justCreated flag will force the ZkFuseFile instance to invoke + ZooKeeper to determine if the path exists. + + \return handle if successful, otherwise return negative errno. + \param path the path to open. + \param justCreated indicates if this is newly created ZkFuseFile instance. + */ + int open(const std::string & path, bool justCreated); + /** + Remove a ZkFuse directory. + + If force is not set, then the ZooKeeper node will be removed only + if it has no data and no child nodes except ZkFuse metadata nodes. + + \return 0 if successful, otherwise return negative errno. + \param path the path to remove. + \param force force removal, i.e. bypass checks. + */ + int rmdir(const char * path, bool force = false); + /** + Make a ZkFuse directory. + + ZkFuse represents a ZooKeeper node with no data and no children + as a regular file. In order to differentiate a newly created + directory from an empty regular file, mkdir will create a directory + metadata node as a child of the directory. + + \return 0 if successful, otherwise return negative errno. + \param path the path of the directory to create. + \param mode create directory with this mode + (mode currently not implemented). + */ + int mkdir(const char * path, mode_t mode); + /** + Remove a ZkFuse regular file. + + A file is the abstraction for the data part of a ZooKeeper node. + - If ZkFuse represents a ZooKeeper node as a directory, the data part + of the node is represented by synthesizing a name for this file. This + synthesized name is visible through readdir if the ZooKeeper node's + data is not empty. Removing such a file is done by truncating + the ZooKeeper node's data to 0 length. + - If ZkFuse represents a ZooKeeper node as a file, then removing the + is done by removing the ZooKeeper node (and its metadata). + + \return 0 if successful, otherwise return negative errno. + \param path the path of the file to remove. + */ + int unlink(const char * path); + /** + Get attributes of a ZkFuse regular file or directory. + + \return 0 if successful, otherwise return negative errno. + \param path get attributes for this path + \param stbuf store attributes here. + */ + int getattr(const char * path, struct stat & stbuf); + /** + Rename a ZkFuse regular file. + + It creates a new ZooKeeper node at toPath, copies data and file + metadata from the ZooKeeper node at fromPath to the new node, + and deletes the current ZooKeeper node. If the current ZooKeeper + node is not deleted if the new ZooKeeper node cannot be created + or the data copy fails. + + It cannot be used to rename a directory. + + \return 0 if successful, otherwise return negative errno. + \param fromPath the current path. + \param toPath rename to this path. + */ + int rename(const char * fromPath, const char * toPath); + /** + Add a child ZooKeeper path to the children information cache + of the ZkFuseFile instance that caches the parent ZooKeeper node. + + This is used to add a child path after a new ZooKeeper node has + been created to the children information cache of the parent + ZooKeeper node. This is needed because waiting for the children + changed event to update the cache may result in inconsistent local + views of the changes. + \see removeChildFromParent + + \parama childPath the path of the child ZooKeeper node. + */ + void addChildToParent(const std::string & childPath) const; + /** + Remove a child ZooKeeper path from the children information cache + of the ZkFuseFile instance that caches the parent ZooKeeper node. + + For example, this should happen whenever a path is deleted. + This child information cache of the parent will eventually be + invalidated by watches. However, the delivery of the children + change event may come after the next access and thus provide + the client with an inconsistent view. One example is that + client deletes the last file in a directory, but the children + changed event is not delivered before the client invokes rmdir. + to remove the parent. In this case, the rmdir fails because + the cached children information of the parent indicates the + "directory" is not empty. + + \param childPath the path of the child ZooKeeper node. + */ + void removeChildFromParent(const std::string & childPath) const; + /** + Return the path for the parent of the specified ZooKeeper path. + + \return the parent path. + \param childPath the child path. + */ + std::string getParentPath(const std::string & childPath) const; + /** + Return the ZooKeeper path from a ZkFuse path. + + The ZkFuse path may be a synthesized path. For example, a synthesized + path is required to access the data part of a ZooKeeper node's + data when ZkFuse represents the ZooKeeper node as directory. + A synthesized path is also required to create a child ZooKeeper node + under a ZooKeeper node that is represented by a regular file. + + \return the ZooKeeper path for path. + \param path the ZkFuse path, which may be a synthesized path. + \param nameType indicate whether the ZkFuse path is synthesized and + whether the synthesized ZkFuse path identifies a + directory or a regular file. + */ + std::string getZkPath(const char * path, ZkFuseNameType & nameType) const; +}; + +/** + ZkFuseHandleManagerFactory - factory for ZkFuseHandleManager. + + This is the only way to create a ZkFuseHandleManager instance. + to make sure that _thisWeakPtr of the instance is intialized + after the instance is created. + */ +class ZkFuseHandleManagerFactory +{ + public: + /** + Create an instance of ZkFuseHandleManager. + + \return the created ZkFuseHandleManager instance. + \param common the common configuration. + \param reserve initially reserve space for this number of handles. + */ + static ZkFuseHandleManager::SharedPtr create( + const ZkFuseCommon & common, + unsigned reserve = 1000) + { + ZkFuseHandleManager::SharedPtr manager + (new ZkFuseHandleManager(common, reserve)); + manager->_thisWeakPtr = manager; + return manager; + } +}; + +/** + ZkFuseAutoHandle - automatically closes handle. + + It holds an opened handle and automatically closes this handle + when it is destroyed. This enables code that open a handle + to be exception safe. + */ +class ZkFuseAutoHandle +{ + private: + /** + Typedef for Handle which is an int. + */ + typedef int Handle; + /** + Holds a reference to the ZkFuseHandlerManager instance that + allocated the handle. + */ + ZkFuseHandleManager::SharedPtr _manager; + /** + The handle that should be closed when this instance is destroyed. + A valid handle has value that is equal or greater than 0. + A negative value indicates an error condition, usually the value + is a negative errno. + */ + Handle _handle; + /** + Caches a reference to the ZkFuseFile instance with this handle. + This is a performance optimization so that _manager.getFile(_handle) + is only called once when the handle is initialized. + */ + ZkFuseFilePtr _file; + + /** + Initialize reference to the ZkFuseFile instance with this handle. + */ + void _initFile() + { + if (_handle >= 0) { + _file = _manager->getFile(_handle); + } else { + _file = NULL; + } + } + + public: + /** + Constructor - takes an previously opened handle. + + \param manager the ZkFuseHandleManager instance who allocated the handle. + \param handle the handle. + */ + ZkFuseAutoHandle( + const ZkFuseHandleManager::SharedPtr & manager, + int handle) + : _manager(manager), + _handle(handle), + _file() + { + _initFile(); + } + /** + Constructor - open path and remember handle. + + \param manager the ZkFuseHandleManager instance who allocated the handle. + \param path open this path and remember its handle in this instance. + */ + ZkFuseAutoHandle( + const ZkFuseHandleManager::SharedPtr & manager, + const std::string & path) + : _manager(manager), + _handle(_manager->open(path, false)), + _file() + { + _initFile(); + } + /** + Constructor - create path and remember handle. + + The creation mode indicates whether the path identifies a regular file + or a directory. + + \param manager the ZkFuseHandleManager instance who allocated the handle. + \param path create this path and remember its handle in this instance. + \param mode the creation mode for the path, should be either + S_IFDIR or S_IFDIR. + \param mayExist, if set and the path already exists, + then the ZkFuseAutoHandle will hold the handle + for the path instead of -EEXIST. + If not set and the path does not exist, then the handle + be -EEXIST. + */ + ZkFuseAutoHandle( + const ZkFuseHandleManager::SharedPtr & manager, + const std::string & path, + mode_t mode, + bool mayExist) + : _manager(manager), + _handle(-1), + _file() + { + bool created; + _handle = _manager->mknod(path, mode, mayExist, created); + _initFile(); + } + /** + Destructor - closes the handle. + */ + ~ZkFuseAutoHandle() + { + reset(); + } + /** + Get the handle. + \see _handle + */ + int get() const + { + return _handle; + } + /** + Get the ZkFuseFile instance of the handle. + \see _file + */ + ZkFuseFilePtr getFile() const + { + return _file; + } + /** + Forget the handle, don't close the handle. + */ + void release() + { + _handle = -1; + _file = NULL; + } + /** + Change the remembered handle. + + It will close the current handle (if valid). + */ + void reset(int handle = -1); +}; + +/** + ZkFuseStat - C++ wrapper for ZooKeeper Stat. + + This wrapper provides ZooKeeper Stat will constructors that + initializes the instance variables of Stat. + */ +class ZkFuseStat : public Stat +{ + public: + /** + Constructor - clear instance variables. + */ + ZkFuseStat() + { + clear(); + } + /** + Destructor - do nothing. + */ + ~ZkFuseStat() + { + } + /** + Clear instance variables. + */ + void clear() + { + czxid = 0; + mzxid = 0; + ctime = 0; + mtime = 0; + version = 0; + cversion = 0; + aversion = 0; + } +}; + +/** + ZkFuseFile - an instance encapsulates the runtime state of an allocated + ZooKeeper node. + + Memory management + - Referenced by the ZkFuseHandleManager that created this instance. + - Uses boost::shared_ptr to reference the ZkFuseHandleManager that + created this instance. This makes sure that this ZkFuseHandleManager + instance cannot be deleted when it has allocated ZkFuseFile instances. + - A ZkFuseHandleManager deletes itself if it can be reclaimed. + It can be reclaimed if it has no watches, its reference count is zero, + and the ZkFuseHandleManager instance would have more than the + configured number of cached ZkFuseFile instances. + - A ZkFuseFile instance cannot be deleted if it has active watches on + its ZooKeeper node. When one of its watches fires, the ZkFuseFile + instance must exist because one of its methods will be invoked + to process the event. If the ZkFuseFile instance has been deleted, + the method will access previously freed memory. + + Concurrency control + - _mutex protects the instance variables of an instance. + - Callers should assume that a public method will acquire _mutex. + - Methods of this class may not hold _mutex while invoking an + ZkFuseHandleManager instance. + - Methods that with names that begin with "_" do not acquire _mutex. + They are usually called by public methods that acquire and hold _mutex. +*/ +class ZkFuseFile : boost::noncopyable +{ + public: + /** + Maximum size for the data part of a ZooKeeper node. + */ + static const unsigned maxDataFileSize = MAX_DATA_SIZE; + + private: + /** + Mode returned by getattr for a ZkFuse directory. + */ + static const mode_t dirMode = (S_IFDIR | 0777); + /** + Mode returned by getattr for a ZkFuse regular file. + */ + static const mode_t regMode = (S_IFREG | 0777); + + /** + References the ZkFuseHandleManager that created this instance. + */ + ZkFuseHandleManager::SharedPtr _manager; + /** + Handle for this instance. + */ + const int _handle; + /** + Path of the ZooKeeper node represented by this instance. + */ + const std::string _path; + /** + Mutex that protects the instance variables of this instance. + */ + mutable zkfuse::Mutex _mutex; + /** + Reference count for this instance, i.e. the number of opens + minus the number of closes. + */ + int _refCount; + /** + Indicates whether the ZooKeeper node exist. + This flag allows caching of deleted ZooKeeper node to avoid + repeated ZooKeeper lookups for a non-existent path, and avoid + using cached information. + + Its value is true if + - it is verified to exist (by calling ZooKeeper), or + - it is existence is unknown because ZooKeeper has not been + invoked to verify its path's existence. + */ + bool _deleted; + /** + Count of current number directory opens minus directory closes. + */ + int _openDirCount; + /** + Indicates whether cached children information is valid. + + It is true if the cached children information is valid. + */ + bool _initializedChildren; + /** + Indicates whether there is an outstanding children watch. + + It is true if it has an outstanding children watch. + */ + bool _hasChildrenListener; + /** + Cached children information. + + The cache is valid if _initializedChildren is true. + */ + NodeNames _children; + + /** + Indicates whether the cached data is valid. + + It is true if the cached data and ZooKeeper Stat are valid. + */ + bool _initializedData; + /** + Indicates whether there is an outstanding data watch. + + It is true if it has an outstanding data watch. + */ + bool _hasDataListener; + /** + Indicates whether the cached data (_activeData) has been modified. + + It is true if the cached data has been modified. + */ + bool _dirtyData; + /** + Currently active data. + + To maintain atomicity of updates and emulate Posix semantics, + when a ZkFuse file remains open, the same data will be accessed + by the file's clients. The data will be flushed to ZooKeeper when + the flush method is called. The flush method may be called + explicitly by a client or implicitly when the ZkFuse file is no + longer currently open. + + _activeData and _activeStat stores the data and ZooKeeper Stat + that will be accessed by the file's clients. + + If there are changes when the ZkFuse file is open, new data is + cached as latest data (by _latestData and _latestStat). + */ + Data _activeData; + /** + Currently active ZooKeeper Stat. + \see _activeData + */ + ZkFuseStat _activeStat; + /** + Latest data. + This is either the same as _activeData or it is newer. It is newer + is it has been updated by event triggered by a data watch. + */ + Data _latestData; + /** + Latest ZooKeeper data. + This is either the same as _activeStat or it is newer. It is newer + is it has been updated by event triggered by a data watch. + */ + ZkFuseStat _latestStat; + + /** + Get userid. + + \return the userid. + */ + uid_t _getUid() const + { + return _manager->getCommon().getUid(); + } + /** + Get groupid. + + \return the groupid. + */ + gid_t _getGid() const + { + return _manager->getCommon().getGid(); + } + /** + Get block size. + + \return the block size. + */ + unsigned _getBlkSize() const + { + return _manager->getCommon().getBlkSize(); + } + /** + Get number of children, include metadata children in the count. + + \return the number of children including metadata children. + */ + unsigned _numChildrenIncludeMeta() const + { + unsigned count = _children.size(); + LOG_DEBUG(LOG, "numChildrenIncludeMeta() returns %u", count); + return count; + } + /** + Get number of children, exclude metadata children in the count. + + \return the number of children excluding metadata children. + */ + unsigned _numChildrenExcludeMeta() const + { + unsigned count = 0; + for (NodeNames::const_iterator it = _children.begin(); + it != _children.end(); + it++) { + if (!_isMeta(*it)) { + count++; + } + } + LOG_DEBUG(LOG, "numChildrenExcludeMeta() returns %u", count); + return count; + } + /** + Whether the ZooKeeper node has children, include metadata + children. + + \return true if it has children including metadata children. + */ + bool _hasChildrenIncludeMeta() const + { + return _numChildrenIncludeMeta() != 0; + } + /** + Return true if the ZooKeeper node has children, include metadata + children. + + \return true if it has children excluding metadata children. + */ + bool _hasChildrenExcludeMeta() const + { + return _numChildrenExcludeMeta() != 0; + } + /** + Whether the ZooKeeper node has data. + + \return true if _activeData is not empty. + */ + bool _hasData() const + { + return _activeData.empty() == false; + } + /** + Whether the ZooKeeper node has child with the specified path. + + \return true if the ZooKeeper node has a child with the specified path. + \param childPath the path of the child. + */ + bool _hasChildPath(const std::string & childPath) const + { + bool hasChild = + std::find(_children.begin(), _children.end(), childPath) + != _children.end(); + LOG_DEBUG(LOG, "hasChild(childPath %s) returns %d", + childPath.c_str(), hasChild); + return hasChild; + } + /** + Whether the given path component is a ZkFuse synthesized path + component. + + A ZkFuse synthesized path component will begin with + the metadataNamePrefix obtained from the common configuration. + \see _metadataNamePrefix + + \return true if the path component is a ZkFuse synthesized path + component. + \param childName the path component to check if it is synthesized by + ZkFuse. + */ + bool _isMeta(const std::string & childName) const + { + bool isMeta; + const std::string & prefix = + _manager->getCommon().getMetadataNamePrefix(); + unsigned offset = + (_path.length() > 1 ? + _path.length() + 1 : + 1 /* special case for root dir */ ); + unsigned minLength = offset + prefix.length(); + if (childName.length() < minLength || + childName.compare(offset, prefix.length(), prefix) != 0) { + isMeta = false; + } else { + isMeta = true; + } + LOG_DEBUG(LOG, "isMeta(childName %s) returns %d", + childName.c_str(), isMeta); + return isMeta; + } + /** + Build a path for a specific child of the ZooKeeper node. + + This is done by appending "/" (unless it is the ZooKeeper node + is the root node) and the name of the child. + + \return the path for the specified child of the ZooKeeper node. + \param name the name of the child. + */ + std::string _getChildPath(const std::string & name) const + { + return buildChildPath(_path, name); + } + /** + Whether the ZooKeeper node has a regular file metadata child node. + + \return true if the ZooKeeper node has a regular file metadata child + node. + */ + bool _hasRegMetadata() const + { + bool res = _hasChildPath( + _getChildPath(_manager->getCommon().getRegMetadataName())); + LOG_DEBUG(LOG, "hasRegMetadata() returns %d", res); + return res; + } + /** + Whether the ZooKeeper node has a directory metadata child node. + + \return true if the ZooKeeper node has a directory metadata child + node. + */ + bool _hasDirMetadata() const + { + bool res = _hasChildPath( + _getChildPath(_manager->getCommon().getDirMetadataName())); + LOG_DEBUG(LOG, "hasDirMetadata() returns %d", res); + return res; + } + /** + Whether ZkFuse should present the ZooKeeper node as a ZkFuse regular + file. + + It should be a ZkFuse regular file it has no children or its + only children is its regular file metadata child node. + + \return true if the Zookeeper node should be presented as a ZkFuse + regular file. + */ + bool _isReg() const + { + unsigned numChildrenIncludeMeta = _numChildrenIncludeMeta(); + bool res = + (numChildrenIncludeMeta == 0) || + (numChildrenIncludeMeta == 1 && _hasRegMetadata() == true); + LOG_DEBUG(LOG, "isReg() returns %d", res); + return res; + } + /** + Whether ZkFuse should present the ZooKeeper node as a ZkFuse directory. + + It should be a ZkFuse directory if it should not be presented as + a ZkFuse regular directory. + \see _isReg + + \return true if the Zookeeper node should be presented as a ZkFuse + directory. + */ + bool _isDir() const + { + return !_isReg(); + } + /** + Whether ZkFuse should present the ZooKeeper node as a ZkFuse regular + file by taking into account the specified ZkFuseNameType. + + The ZkFuseNameType may override the default ZkFuse presentation of + a ZooKeeper node. + + \return true if ZkFuse should present the ZooKeeper node as a ZkFuse + regular file. + \param nameType specifies the ZkFuseNameType. + \param doLock whether _mutex should be acquired, it should be true + if the caller did not acquire _mutex. + */ + bool _isRegNameType(ZkFuseNameType nameType, bool doLock = false) const + { + bool res; + switch (nameType) { + case ZkFuseNameRegType: + res = true; + break; + case ZkFuseNameDirType: + res = false; + break; + case ZkFuseNameDefaultType: + default: + if (doLock) { + AutoLock lock(_mutex); + res = _isReg(); + } else { + res = _isReg(); + } + break; + } + LOG_DEBUG(LOG, "isRegNameType(nameType %d) returns %d", + int(nameType), res); + return res; + } + /** + Whether ZkFuse should present the ZooKeeper node as a ZkFuse + directory by taking into account the specified ZkFuseNameType. + + The ZkFuseNameType may override the default ZkFuse presentation of + a ZooKeeper node. + + \return true if ZkFuse should present the ZooKeeper node as a ZkFuse + directory. + \param nameType specifies the ZkFuseNameType. + \param doLock whether _mutex should be acquired, it should be true + if the caller did not acquire _mutex. + */ + bool _isDirNameType(ZkFuseNameType nameType, bool doLock = false) const + { + bool res; + switch (nameType) { + case ZkFuseNameRegType: + res = false; + break; + case ZkFuseNameDirType: + res = true; + break; + case ZkFuseNameDefaultType: + default: + if (doLock) { + AutoLock lock(_mutex); + res = _isDir(); + } else { + res = _isDir(); + } + break; + } + LOG_DEBUG(LOG, "isDirNameType(nameType %d) returns %d", + int(nameType), res); + return res; + } + /** + ZkFuse regular file metadata. + */ + struct Metadata { + /** + Version of the ZooKeeper node data that this metadata is good for. + */ + uint32_t version; + /** + Acces time in milliseconds. + */ + uint64_t atime; + /** + Modified time in milliseconds. + */ + uint64_t mtime; + + /** + Constructor. + */ + Metadata() + : version(0), + atime(0), + mtime(0) + { + } + }; + /** + Encode Metadata into Data so that it can be stored in a metadata + ZooKeeper node. + + Each Metadata attribute is encoded as ": " on single line + terminated by newline. + + \param meta the input Metadata. + \param data the output Data after encoding. + */ + void _encodeMetadata(const Metadata & meta, Data & data) const + { + LOG_DEBUG(LOG, "encodeMetadata()"); + std::ostringstream oss; + oss << "version: " << meta.version << endl + << "atime: " << meta.atime << endl + << "mtime: " << meta.mtime << endl; + data = oss.str(); + } + /** + Decode Data from a metadata child ZooKeeper node into Metadata. + + Data is a stream of ": " records separated by newline. + + \param data the input Data. + \param meta the output Metadata after decoding. + */ + void _decodeMetadata(const Data & data, Metadata & meta) const + { + LOG_DEBUG(LOG, "decodeMetadata(data %s)", data.c_str()); + std::istringstream iss(data); + char key[128]; + char value[1024]; + while (!iss.eof()) { + key[0] = 0; + value[0] = 0; + iss.get(key, sizeof(key), ' '); + if (iss.eof()) { + break; + } + iss.ignore(32, ' '); + iss.getline(value, sizeof(value)); + LOG_DEBUG(LOG, "key %s value %s", key, value); + if (strcmp(key, "version:") == 0) { + unsigned long long v = strtoull(value, NULL, 0); + LOG_DEBUG(LOG, "version: %llu", v); + meta.version = v; + } + else if (strcmp(key, "atime:") == 0) { + unsigned long long v = strtoull(value, NULL, 0); + LOG_DEBUG(LOG, "atime: %llu", v); + meta.atime = v; + } + else if (strcmp(key, "mtime:") == 0) { + unsigned long long v = strtoull(value, NULL, 0); + LOG_DEBUG(LOG, "mtime: %llu", v); + meta.mtime = v; + } + else { + LOG_WARN(LOG, "decodeMetadata: path %s unknown key %s %s\n", + _path.c_str(), key, value); + } + } + LOG_DEBUG(LOG, "decodeMetadata done"); + } + /** + Flush data to the ZooKeeper node. + + If cached active data has been modified, flush it to the ZooKeeper node. + Returns -EIO if the data cannot be written because the cached active + data is not the expected version, i.e. ZooKeeper returns ZBADVERSION. + -EIO may also indicate a more general failure, such as unable to + communicate with ZooKeeper. + + \return 0 if successful, otherwise negative errno. + */ + int _flush() + { + LOG_DEBUG(LOG, "flush() path %s", _path.c_str()); + + int res = 0; + try { + if (_dirtyData) { + LOG_DEBUG(LOG, "is dirty, active version %d", + _activeStat.version); + _manager->getCommon().getZkAdapter()-> + setNodeData(_path, _activeData, _activeStat.version); + /* assumes version always increments by one if successful */ + _deleted = false; + _activeStat.version++; + _dirtyData = false; + res = 0; + } + else { + LOG_DEBUG(LOG, "not dirty"); + res = 0; + } + } catch (const ZooKeeperException & e) { + if (e.getZKErrorCode() == ZBADVERSION) { + LOG_ERROR(LOG, "flush %s bad version, was %d", + _path.c_str(), _activeStat.version); + res = -EIO; + } + else { + LOG_ERROR(LOG, "flush %s exception %s", + _path.c_str(), e.what()); + res = -EIO; + } + } + + LOG_DEBUG(LOG, "flush returns %d", res); + return res; + } + /** + Truncate or expand the size of the cached active data. + + This method only changes the size of the cached active data. + This change is committed to ZooKeeper when the cached data + is written to the ZooKeeper node by flush(). + + Return -EFBIG is the requested size exceeds the maximum. + + \return 0 if successful, otherwise negative errno. + \param size the requested size. + */ + int _truncate(off_t size) + { + LOG_DEBUG(LOG, "truncate(size %zu) path %s", size, _path.c_str()); + + int res = 0; + + if (!_isInitialized()) { + LOG_DEBUG(LOG, "not initialized"); + res = -EIO; + } + else if (size > _activeData.size()) { + if (size > maxDataFileSize) { + LOG_DEBUG(LOG, "size > maxDataFileSize"); + res = -EFBIG; + } else { + LOG_DEBUG(LOG, "increase to size"); + _activeData.insert(_activeData.begin() + + (size - _activeData.size()), 0); + _dirtyData = true; + res = 0; + } + } + else if (size < _activeData.size()) { + LOG_DEBUG(LOG, "decrease to size"); + _activeData.resize(size); + _dirtyData = true; + res = 0; + } + else { + LOG_DEBUG(LOG, "do nothing, same size"); + } + + LOG_DEBUG(LOG, "truncate returns %d", res); + return res; + } + /** + Remove a ZkFuse directory. + + If force is true, then the ZooKeeper node and its decendants + will be deleted. + + If force is false, then this method implements the semantics + of removing a ZkFuse directory. It will delete the ZooKeeper node + only if the ZooKeeper node have no data and no non-metadata + children. + - Return -ENOTDIR if the ZooKeeper node is not considered + to be a directory (after taking into consideration the specified + ZkFuseNameType). + - Return -ENOTEMPTY if the ZooKeeper node has data or it has + non-metadata children. + - Return -ENOENT if the ZooKeeper cannot be deleted, usually this + is because it does not exist. + + \return 0 if successful, otherwise negative errno. + \param nameType the ZkFuseNameType of the path used to specify the + directory to be removed. It influences whether ZkFuse + considers the ZooKeeper node to be a regular file or + directory. \see ZkFuseNameType + \param force set to true to bypass ZkFuse rmdir semantic check. + */ + int _rmdir(ZkFuseNameType nameType, bool force) + { + LOG_DEBUG(LOG, "rmdir(nameType %d, force %d) path %s", + int(nameType), force, _path.c_str()); + + int res = 0; + try { + if (!force && !_isDirNameType(nameType)) { + LOG_DEBUG(LOG, "failed because not directory"); + res = -ENOTDIR; + } + else if (!force && _hasData()) { + /* rmdir cannot occur if there non-empty "data file" */ + LOG_DEBUG(LOG, "failed because node has data"); + res = -ENOTEMPTY; + } + else if (!force && _hasChildrenExcludeMeta()) { + /* rmdir cannot occur if there are "subdirs" */ + LOG_DEBUG(LOG, "failed because node has children"); + res = -ENOTEMPTY; + } + else { + LOG_DEBUG(LOG, "delete node"); + bool deleted = _manager->getCommon().getZkAdapter()-> + deleteNode(_path, true); + if (deleted) { + _deleted = true; + _clearChildren(); + res = 0; + } else { + /* TODO: differentiate delete error conditions, + * e.g. access permission, not exists, ... ? + */ + LOG_DEBUG(LOG, "delete failed"); + res = -ENOENT; + } + } + } catch (const std::exception & e) { + LOG_ERROR(LOG, "rmdir %s exception %s", _path.c_str(), e.what()); + res = -EIO; + } + + LOG_DEBUG(LOG, "rmdir returns %d", res); + return res; + } + /** + Remove a ZkFuse regular file. + + This method implements the semantics of removing a ZkFuse regular file. + - If the ZkFuse regular file represents the data part of the + ZooKeeper node which is presented as a ZkFuse directory, + the regular file is virtually deleted by truncating the + ZooKeeper node's data. Readdir will not synthesize a regular + file entry for the data part of a ZooKeeper node if + the ZooKeeper node has no data. + - If the ZkFuse regular file represents the data part of the + ZooKeeper node which is presented as a ZkFuse regular file, + the ZooKeeper node and its decendants are deleted. + + Returns -EISDIR if the ZkFuse regular file cannot be deleted + because ZkFuse consider it to be a directory. + + \return 0 if successful, otherwise negative errno. + \param nameType the ZkFuseNameType of the path used to specify the + directory to be removed. It influences whether ZkFuse + considers the ZooKeeper node to be a regular file or + directory. \see ZkFuseNameType + */ + int _unlink(ZkFuseNameType nameType) + { + LOG_DEBUG(LOG, "unlink(nameType %d) path %s", + int(nameType), _path.c_str()); + + int res = 0; + switch (nameType) { + case ZkFuseNameRegType: + if (_isDir()) { + res = _truncate(0); + } else { + res = _rmdir(nameType, true); + } + break; + case ZkFuseNameDirType: + res = -EISDIR; + break; + case ZkFuseNameDefaultType: + default: + if (_isReg()) { + res = _rmdir(nameType, true); + } else { + res = -EISDIR; + } + break; + } + + LOG_DEBUG(LOG, "unlink returns %d", res); + return res; + } + /** + Whether cached children and data are valid. + + \return true if cached children and data are valid. + */ + bool _isInitialized() const + { + return _initializedChildren && _initializedData; + } + /** + Clear and invalidate cached children information. + */ + void _clearChildren() + { + _initializedChildren = false; + _children.clear(); + } + /** + Clear and invalidate cached data. + */ + void _clearData() + { + _initializedData = false; + _dirtyData = false; + _activeData.clear(); + _activeStat.clear(); + _latestData.clear(); + _latestStat.clear(); + } + /** + Whether the ZkFuseFile instance is a zombie. + + It is a zombie if it is not currently open, i.e. its reference count + is 0. + */ + bool _isZombie() const + { + return (_refCount == 0); + } + /** + Whether the ZkFuseFile instance is currently opened as a regular file + only once. + + It is used to determine when the cached data can be replaced with + the latest data. \see _activeData. + + \return true if its currently opened as a regular file only once. + */ + bool _isOnlyRegOpen() const + { + return ((_refCount - _openDirCount) == 1); + } + /** + Get attributes without accessing metadata. + + The atime and mtime returned does not take into consideration + overrides present in a matadata file. + + \return 0 if successful, otherwise negative errno. + \param stbuf return attributes here. + \param nameType specifies the ZkFuseNameType of the ZkFuse path used + to get attributes. It influences whether the directory + or regular file attributes are returned. + */ + int _getattrNoMetaAccess(struct stat & stbuf, ZkFuseNameType nameType) const + { + int res = 0; + if (_deleted) { + LOG_DEBUG(LOG, "deleted"); + res = -ENOENT; + } + else if (!_isInitialized()) { + LOG_DEBUG(LOG, "not initialized"); + res = -EIO; + } + else { + assert(_isInitialized()); + bool isRegular = _isRegNameType(nameType); + if (isRegular) { + LOG_DEBUG(LOG, "regular"); + stbuf.st_mode = regMode; + stbuf.st_nlink = 1; + stbuf.st_size = _activeData.size(); + } else { + LOG_DEBUG(LOG, "directory"); + stbuf.st_mode = dirMode; + stbuf.st_nlink = + _children.size() + (_activeData.empty() ? 0 : 1); + stbuf.st_size = stbuf.st_nlink; + } + stbuf.st_uid = _getUid(); + stbuf.st_gid = _getGid(); + /* IMPORTANT: + * Conversion to secs from millisecs must occur before + * assigning to st_atime, st_mtime, and st_ctime. Otherwise + * truncating from 64-bit to 32-bit will cause lost of + * most significant 32-bits before converting to secs. + */ + stbuf.st_atime = millisecsToSecs(_activeStat.mtime); + stbuf.st_mtime = millisecsToSecs(_activeStat.mtime); + stbuf.st_ctime = millisecsToSecs(_activeStat.ctime); + stbuf.st_blksize = _getBlkSize(); + stbuf.st_blocks = + (stbuf.st_size + stbuf.st_blksize - 1) / stbuf.st_blksize; + res = 0; + } + return res; + } + /** + Get the context that should be registered with the data and + children watches. + + The returned context is a pointer to the ZkFuseFile instance + cast to the desired ContextType. + + \return the context. + */ + ZooKeeperAdapter::ContextType _getZkContext() const + { + return (ZooKeeperAdapter::ContextType) NULL; + } + + /** + DataListener - listener that listens for ZooKeeper data events + and calls dataEventReceived on the ZkFuseFile instance + identified by the event context. + \see dataEventReceived + */ + class DataListener : public ZKEventListener { + public: + /** + Received a data event and invoke ZkFuseFile instance obtained from + event context to handle the event. + */ + virtual void eventReceived(const ZKEventSource & source, + const ZKWatcherEvent & event) + { + assert(event.getContext() != 0); + ZkFuseFile * file = static_cast(event.getContext()); + file->dataEventReceived(event); + } + }; + + /** + DataListener - listener that listens for ZooKeeper children events + and calls childrenEventReceived on the ZkFuseFile instance + identified by the event context. + \see childrenEventReceived + */ + class ChildrenListener : public ZKEventListener { + public: + /** + Received a children event and invoke ZkFuseFile instance obtained from + event context to handle the event. + */ + virtual void eventReceived(const ZKEventSource & source, + const ZKWatcherEvent & event) + { + assert(event.getContext() != 0); + ZkFuseFile * file = static_cast(event.getContext()); + file->childrenEventReceived(event); + } + }; + + /** + Globally shared DataListener. + */ + static DataListener _dataListener; + /** + Globally shared ChildrenListener. + */ + static ChildrenListener _childrenListener; + + public: + /** + Constructor. + + Sets reference count to one, i.e. it has been constructed because + a client is trying to open the path. \see _refCount. + Sets deleted to true. \see _deleted. + Sets number of currently directory opens to zero. \see _openDirCount. + Invalidate cach for children information and data. + + \param manager the ZkFuseHandleManager instance who is creating this + ZkFuseFile instance. + \param handle the handle assigned by the ZkFuseHandleManager instance + for this ZkFuseFile instance. + \param path the ZooKeeper path represented by this ZkFuseFile instance. + */ + ZkFuseFile(const ZkFuseHandleManager::SharedPtr & manager, + const int handle, + const std::string & path) + : _manager(manager), + _handle(handle), + _path(path), + _mutex(), + _refCount(1), + _deleted(true), + /* children stuff */ + _openDirCount(0), + _initializedChildren(false), + _hasChildrenListener(false), + _children(), + /* data stuff */ + _initializedData(false), + _hasDataListener(false), + _dirtyData(false), + _activeData(), + _activeStat(), + _latestData(), + _latestStat() + { + LOG_DEBUG(LOG, "constructor() path %s", _path.c_str()); + } + /** + Destructor. + */ + ~ZkFuseFile() + { + LOG_DEBUG(LOG, "destructor() path %s", _path.c_str()); + + assert(_isZombie()); + _clearChildren(); + _clearData(); + } + /** + Whether the ZooKeeper node represented by this ZkFuseFile instance + has been deleted. + \see _deleted + + \return true if it is deleted. + */ + bool isDeleted() const + { + AutoLock lock(_mutex); + return _deleted; + } + /** + Return the path of the ZooKeeper node represented by this ZkFuseFile + instance. + \see _path. + + \return the ZooKeeper node's path. + */ + const string & getPath() const + { + return _path; + } + /** + Add a childPath to the children information cache. + + \return 0 if successful, otherwise return negative errno. + \param childPath the ZooKeeper path of the child. + */ + int addChild(const std::string & childPath) + { + LOG_DEBUG(LOG, "addChild(childPath %s) path %s", + childPath.c_str(), _path.c_str()); + + int res = 0; + { + AutoLock lock(_mutex); + if (_initializedChildren) { + NodeNames::iterator it = + std::find(_children.begin(), _children.end(), childPath); + if (it == _children.end()) { + LOG_DEBUG(LOG, "child not found, adding child path"); + _children.push_back(childPath); + res = 0; + } + else { + LOG_DEBUG(LOG, "child found"); + res = -EEXIST; + } + } + } + + LOG_DEBUG(LOG, "addChild returns %d", res); + return res; + } + /** + Remove a childPath from the children information cache. + + \return 0 if successful, otherwise return negative errno. + \param childPath the ZooKeeper path of the child. + */ + int removeChild(const std::string & childPath) + { + LOG_DEBUG(LOG, "removeChild(childPath %s) path %s", + childPath.c_str(), _path.c_str()); + + int res = 0; + { + AutoLock lock(_mutex); + if (_initializedChildren) { + NodeNames::iterator it = + std::find(_children.begin(), _children.end(), childPath); + if (it != _children.end()) { + LOG_DEBUG(LOG, "child found"); + _children.erase(it); + res = 0; + } + else { + LOG_DEBUG(LOG, "child not found"); + res = -ENOENT; + } + } + } + + LOG_DEBUG(LOG, "removeChild returns %d", res); + return res; + } + /** + Invalidate the cached children information and cached data. + \see _clearChildren + \see _clearData + + \param clearChildren set to true to invalidate children information cache. + \param clearData set to true to invalidate data cache. + */ + void clear(bool clearChildren = true, bool clearData = true) + { + LOG_DEBUG(LOG, "clear(clearChildren %d, clearData %d) path %s", + clearChildren, clearData, _path.c_str()); + + { + AutoLock lock(_mutex); + if (clearChildren) { + _clearChildren(); + } + if (clearData) { + _clearData(); + } + } + } + /** + Whether reference count is zero. + \see _refCount + + \return true if reference count is zero. + */ + bool isZombie() const + { + AutoLock lock(_mutex); + + return (_refCount == 0); + } + /** + Increment the reference count of the ZkFuseFile instance. + + This method may be called by a ZkFuseFileManager instance while + holding the ZkFuseFileManager's _mutex. To avoid deadlocks, + this methods must never invoke a ZkFuseFileManager instance + directly or indirectly while holding the ZkFuseFile instance's + _mutex. + \see _refCount + + \return the post-increment reference count. + \param count value to increment the reference count by. + */ + int incRefCount(int count = 1) + { + LOG_DEBUG(LOG, "incRefCount(count %d) path %s", count, _path.c_str()); + + int res = 0; + { + AutoLock lock(_mutex); + _refCount += count; + assert(_refCount >= 0); + res = _refCount; + } + + LOG_DEBUG(LOG, "incRefCount returns %d", res); + return res; + } + /** + Decrement the reference count of the ZkFuseFile instance. + + This method may be called by a ZkFuseFileManager instance while + holding the ZkFuseFileManager's _mutex. To avoid deadlocks, + this methods must never invoke a ZkFuseFileManager instance + directly or indirectly while holding the ZkFuseFile instance's + _mutex. + \see _refCount + + \return the post-decrement reference count. + \param count value to decrement the reference count by. + */ + int decRefCount(int count = 1) + { + return incRefCount(-count); + } + /** + Increment the count of number times the ZkFuseFile instance has + been opened as a directory. + + This count is incremented by opendir and decremented by releasedir. + \see _openDirCount. + + \return the post-increment count. + \param count the value to increment the count by. + */ + int incOpenDirCount(int count = 1) + { + LOG_DEBUG(LOG, "incOpenDirCount(count %d) path %s", + count, _path.c_str()); + + int res = 0; + { + AutoLock lock(_mutex); + _openDirCount += count; + assert(_openDirCount >= 0); + res = _openDirCount; + assert(_openDirCount <= _refCount); + } + + LOG_DEBUG(LOG, "incOpenDirCount returns %d", res); + return res; + + } + /** + Decrement the count of number times the ZkFuseFile instance has + been opened as a directory. + + This count is incremented by opendir and decremented by releasedir. + \see _openDirCount. + + \return the post-decrement count. + \param count the value to decrement the count by. + */ + int decOpenDirCount(int count = 1) + { + return incOpenDirCount(-count); + } + /** + Whether ZkFuse should present the ZooKeeper node as a ZkFuse + directory by taking into account the specified ZkFuseNameType. + + The ZkFuseNameType may override the default ZkFuse presentation of + a ZooKeeper node. + \see _isDirNameType + + \return true if ZkFuse should present the ZooKeeper node as a ZkFuse + directory. + \param nameType specifies the ZkFuseNameType. + */ + bool isDirNameType(ZkFuseNameType nameType) const + { + return _isDirNameType(nameType, true); + } + /** + Whether ZkFuse should present the ZooKeeper node as a ZkFuse + regular file by taking into account the specified ZkFuseNameType. + + The ZkFuseNameType may override the default ZkFuse presentation of + a ZooKeeper node. + \see _isRegNameType + + \return true if ZkFuse should present the ZooKeeper node as a ZkFuse + regular file. + \param nameType specifies the ZkFuseNameType. + */ + bool isRegNameType(ZkFuseNameType nameType) const + { + return _isRegNameType(nameType, true); + } + /** + Get the active data. + \see _activeData + + \param data return data here. + */ + void getData(Data & data) const + { + AutoLock lock(_mutex); + + data = _activeData; + } + /** + Set the active data. + \see _activeData + + Return -EFBIG is the data to be written is bigger than the maximum + permitted size (and no data is written). + + \return 0 if successful, otherwise return negative errno. + \param data set to this data. + \param doFlush whether to flush the data to the ZooKeeper node. + */ + int setData(const Data & data, bool doFlush) + { + LOG_DEBUG(LOG, "setData(doFlush %d) path %s", doFlush, _path.c_str()); + int res = 0; + + if (data.size() > maxDataFileSize) { + res = -EFBIG; + } + else { + AutoLock lock(_mutex); + _activeData = data; + _dirtyData = true; + if (doFlush) { + res = _flush(); + } + } + + LOG_DEBUG(LOG, "setData() returns %d", res); + return res; + } + /** + Update the children information and the data caches as needed. + + This method is invoked when a ZkFuse regular file or directory + implemented by this ZkFuseFile instance is opened, e.g. + using open or opendir. It attempts to: + - make sure that the cache has valid children information + - register for watches for changes if no previous watches have + been registered. + + The newFile flag indicates if the ZkFuseFile instance has just + been constructed and that ZooKeeper has not been contacted to + determine if the ZooKeeper path for this file really exist. + When a ZkFuseFile instance is created, the _deleted flag is set to + true because it is safer to assume that the ZooKeeper node does + not exist. The newFile flag causes the _deleted flag to be + ignored and ZooKeeper to be contacted to update the caches. + + If the newFile flag is false, then the ZkFuseFile instance is + currently open and have been opened before. Hence, these previous + opens should have contacted ZooKeeper and would like learned from + ZooKeeper whether the ZooKeeper path exists. Therefore, + the _deleted flag should be trustworthy, i.e. it has accurate + information on whether the ZooKeeper path actually exists. + + \return 0 if successful, otherwise return negative errno. + \param newFile set to true if the ZkFuseFile instance is newly created. + */ + int update(bool newFile) + { + LOG_DEBUG(LOG, "update(newFile %d) path %s", newFile, _path.c_str()); + + int res = 0; + { + AutoLock lock(_mutex); + + /* At this point, cannot be zombie. + */ + assert(!_isZombie()); + if (!newFile && _deleted) { + /* Deleted file, don't bother to update caches */ + LOG_DEBUG(LOG, "deleted, not new file"); + res = -ENOENT; + } + else { + try { + LOG_DEBUG(LOG, "initialized children %d, data %d", + _initializedChildren, _initializedData); + LOG_DEBUG(LOG, "has children watch %d, data watch %d", + _hasChildrenListener, _hasDataListener); + /* + * Children handling starts here. + * If don't have children listener, + * then must establish listener. + * If don't have cached children information, + * then must get children information. + * It just happens, that the same ZooKeeper API + * is used for both. + */ + if (_initializedChildren == false || + _hasChildrenListener == false +#ifdef ZOOKEEPER_ROOT_CHILDREN_WATCH_BUG + /* HACK for root node because changes to children + * on a root node does not cause children watches to + * fire. + */ + || _path.length() == 1 +#endif // ZOOKEEPER_ROOT_CHILDREN_WATCH_BUG + ) { + LOG_DEBUG(LOG, "update children"); + NodeNames children; + _manager->getCommon().getZkAdapter()-> + getNodeChildren( children, _path, + &_childrenListener, _getZkContext()); + _hasChildrenListener = true; + LOG_DEBUG(LOG, "update children done"); + _children.swap(children); + _initializedChildren = true; + /* Since getNodeChildren is successful, the + * path must exist */ + _deleted = false; + } + else { + /* Children information is fresh since + * it is initialized and and have been + * updated by listener. + */ + } + /* + * Data handling starts here. + */ + assert(newFile == false || _isOnlyRegOpen()); + if (!_isOnlyRegOpen()) { + /* If is already currently opened by someone, + * then don't update data with latest from ZooKeeper, + * use current active data (which may be initialized + * or not). + * \see _activeData + */ + LOG_DEBUG(LOG, "node currently in-use, no data update"); + } + else { + /* If not opened/reopened by someone else, + * then perform more comprehensive checks of + * to make data and listener is setup correctly. + * If don't have data listener, + * then must establish listener. + * If don't have cached data, + * then must get data. + * It just happens, that the same ZooKeeper API + * is used for both. + */ + LOG_DEBUG(LOG, "node first use or reuse"); + if (_initializedData == false || + _hasDataListener == false) { + /* Don't have any data for now or need to register + * for callback */ + LOG_DEBUG(LOG, "update data"); + _latestData = + _manager->getCommon().getZkAdapter()-> + getNodeData(_path, &_dataListener, + _getZkContext(), + &_latestStat); + _hasDataListener = true; + LOG_DEBUG(LOG, + "update data done, latest version %d", + _latestStat.version); + /* Since getNodeData is successful, the + * path must exist. */ + _deleted = false; + } + else { + /* Data is fresh since it is initialized and + * and have been updated by listener. + */ + } + /* Update active data to the same as the most + * recently acquire data. + */ + _activeData = _latestData; + _activeStat = _latestStat; + _initializedData = true; + _dirtyData = false; + LOG_DEBUG(LOG, "update set active version %d", + _activeStat.version); + } + res = 0; + } catch (const ZooKeeperException & e) { + /* May have ZNONODE exception if path does exist. */ + if (e.getZKErrorCode() == ZNONODE) { + LOG_DEBUG(LOG, "update %s exception %s", + _path.c_str(), e.what()); + /* Path does not exist, set _deleted, + * clear children information cache + */ + _deleted = true; + _clearChildren(); + res = -ENOENT; + } else { + LOG_ERROR(LOG, "update %s exception %s", + _path.c_str(), e.what()); + res = -EIO; + } + } + } + } + + LOG_DEBUG(LOG, "update returns %d", res); + return res; + } + /** + Process a data event. + + This method may: + - Invalidate the data cache. + - Invoke ZooKeeper to update the data cache and register a new + data watch so that the cache can be kept in-sync with the + ZooKeeper node's data. + + This method does not change the active data. Active data will be + changed to a later version by update() at the appropriate time. + \see update. + */ + void dataEventReceived(const ZKWatcherEvent & event) + { + bool reclaim = false; + int eventType = event.getType(); + int eventState = event.getState(); + + /* + IMPORTANT: + + Do not mark ZkFuseFile instance as deleted when a ZOO_DELETED_EVENT + is received without checking with ZooKeeper. An example of + problematic sequence would be: + + 1. Create node. + 2. Set data and watch. + 3. Delete node. + 4. Create node. + 5. Deleted event received. + + It is a bug to mark the ZkFuseFile instance as deleted after + step 5 because the node exists. + + Therefore, this method should always contact ZooKeeper to keep the + data cache (and deleted status) up-to-date if necessary. + */ + LOG_DEBUG(LOG, "dataEventReceived() path %s, type %d, state %d", + _path.c_str(), eventType, eventState); + { + AutoLock lock(_mutex); + + _hasDataListener = false; + /* If zombie, then invalidate cached data. + * This clears _initializedData and eliminate + * the need to get the latest data from ZooKeeper and + * re-register data watch. + */ + if (_isZombie() && _initializedData) { + LOG_DEBUG(LOG, "invalidate data"); + _clearData(); + } + else if ((_refCount - _openDirCount) > 0) { + /* Don't invalidate cached data because clients of currently + * open files don't expect the data to change from under them. + * If data acted upon by these clients have become stale, + * then the clients will get an error when ZkFuse attempts to + * flush dirty data. The clients will not get error + * notification if they don't modify the stale data. + * + * If data cache is cleared here, then the following code + * to update data cache and re-register data watch will not + * be executed and may result in the cached data being + * out-of-sync with ZooKeeper. + */ + LOG_WARN(LOG, + "%s data has changed while in-use, " + "type %d, state %d, refCount %d", + _path.c_str(), eventType, eventState, _refCount); + } + /* If cache was valid and still connected + * then get the latest data from ZooKeeper + * and re-register data watch. This is required to keep + * the data cache in-sync with ZooKeeper. + */ + if (_initializedData && + eventState == ZOO_CONNECTED_STATE + ) { + try { + LOG_DEBUG(LOG, "register data watcher"); + _latestData = + _manager->getCommon().getZkAdapter()-> + getNodeData(_path, &_dataListener, _getZkContext(), + &_latestStat); + _hasDataListener = true; + LOG_DEBUG(LOG, + "get data done, version %u, cversion %u done", + _latestStat.version, _latestStat.cversion); + _deleted = false; + } catch (const ZooKeeperException & e) { + if (e.getZKErrorCode() == ZNONODE) { + _deleted = true; + _clearChildren(); + } + LOG_ERROR(LOG, "dataEventReceived %s exception %s", + _path.c_str(), e.what()); + } + } + } + LOG_DEBUG(LOG, "dataEventReceived return %d", reclaim); + } + /** + Process a children event. + + This method may: + - Invalidate the children information cache. + - Invoke ZooKeeper to update the children cache and register a new + data watch so that the cache can be kept in-sync with the + ZooKeeper node's children information. + */ + void childrenEventReceived(const ZKWatcherEvent & event) + { + bool reclaim = false; + int eventType = event.getType(); + int eventState = event.getState(); + + LOG_DEBUG(LOG, "childrenEventReceived() path %s, type %d, state %d", + _path.c_str(), eventType, eventState); + { + AutoLock lock(_mutex); + + _hasChildrenListener = false; + /* If zombie or disconnected, then invalidate cached children + * information. This clears _initializedChildren and eliminate + * the need to get the latest children information and + * re-register children watch. + */ + if (_initializedChildren && + (_isZombie() || eventState != ZOO_CONNECTED_STATE)) { + LOG_DEBUG(LOG, "invalidate children"); + _clearChildren(); + } + else if (_initializedChildren) { + /* Keep cached children information so that we have some + * children information if get new children information + * fails. If there is failure, then on next open, + * update() will attempt again to get children information + * again because _hasChildrenListener will be false. + * + * If children information cache is cleared here, then + * the following code to update children information cache + * and re-register children watch will not be executed + * and may result in the cached children information being + * out-of-sync with ZooKeeper. + * + * The children cache will be cleared if unable to + * get children and re-establish watch. + */ + LOG_WARN(LOG, + "%s children has changed while in-use, " + "type %d, state %d, refCount %d", + _path.c_str(), eventType, eventState, _refCount); + } + /* If children cache was valid and still connected, + * then get the latest children information from ZooKeeper + * and re-register children watch. This is required to + * keep the children information cache in-sync with ZooKeeper. + */ + if (_initializedChildren && + eventState == ZOO_CONNECTED_STATE + ) { + /* Should try to keep the cache in-sync, register call + * callback again and get current children. + */ + try { + LOG_DEBUG(LOG, "update children"); + NodeNames children; + _manager->getCommon().getZkAdapter()-> + getNodeChildren(children, _path, + &_childrenListener, _getZkContext()); + _hasChildrenListener = true; + LOG_DEBUG(LOG, "update children done"); + _children.swap(children); + _deleted = false; + } catch (const ZooKeeperException & e) { + if (e.getZKErrorCode() == ZNONODE) { + _deleted = true; + _clearChildren(); + } + LOG_ERROR(LOG, "childrenEventReceived %s exception %s", + _path.c_str(), e.what()); + _children.clear(); + } + } + } + LOG_DEBUG(LOG, "childrenEventReceived returns %d", reclaim); + } + /** + Truncate or expand the size of the cached active data. + + This method only changes the size of the cached active data. + This change is committed to ZooKeeper when the cached data + is written to the ZooKeeper node by flush(). + + Return -EFBIG is the requested size exceeds the maximum. + + \return 0 if successful, otherwise negative errno. + \param size the requested size. + */ + int truncate(off_t size) + { + int res = 0; + + { + AutoLock lock(_mutex); + res = _truncate(size); + } + + return res; + } + /** + Copy range of active data into specified output buffer. + + \return if successful, return number of bytes copied, otherwise + return negative errno. + \param buf address of the output buffer. + \param size size of the output buffer and desired number of bytes to copy. + \param offset offset into active data to start copying from. + */ + int read(char *buf, size_t size, off_t offset) const + { + LOG_DEBUG(LOG, "read(size %zu, off_t %zu) path %s", + size, offset, _path.c_str()); + + int res = 0; + + { + AutoLock lock(_mutex); + if (!_initializedData) { + LOG_DEBUG(LOG, "not initialized"); + res = -EIO; + } + else { + off_t fileSize = _activeData.size(); + if (offset > fileSize) { + LOG_DEBUG(LOG, "offset > fileSize %zu", fileSize); + res = 0; + } + else { + if (offset + size > fileSize) { + size = fileSize - offset; + LOG_DEBUG(LOG, + "reducing read size to %zu for fileSize %zu", + size, fileSize); + } + copy(_activeData.begin() + offset, + _activeData.begin() + offset + size, + buf); + res = size; + } + } + } + + LOG_DEBUG(LOG, "read returns %d", res); + return res; + } + /** + Copy buffer content to active data. + + \return if successful, return number of bytes copied, otherwise + return negative errno. + \param buf address of the buffer. + \param size size of the input buffer and desired number of bytes to copy. + \param offset offset into active data to start copying to. + */ + int write(const char *buf, size_t size, off_t offset) + { + LOG_DEBUG(LOG, "write(size %zu, off_t %zu) path %s", + size, offset, _path.c_str()); + + int res = 0; + + { + AutoLock lock(_mutex); + if (!_initializedData) { + LOG_DEBUG(LOG, "not initialized"); + res = -EIO; + } + else if (offset >= maxDataFileSize) { + LOG_DEBUG(LOG, "offset > maxDataFileSize %u", maxDataFileSize); + res = -ENOSPC; + } + else { + if (offset + size > maxDataFileSize) { + LOG_DEBUG(LOG, + "reducing write size to %zu " + "for maxDataFileSize %u", + size, maxDataFileSize); + size = maxDataFileSize - offset; + } + off_t fileSize = _activeData.size(); + if (offset + size > fileSize) { + LOG_DEBUG(LOG, "resizing to %zu", offset + size); + _activeData.resize(offset + size); + } + copy(buf, buf + size, _activeData.begin() + offset); + memcpy(&_activeData[offset], buf, size); + _dirtyData = true; + res = size; + } + } + + LOG_DEBUG(LOG, "write returns %d", res); + return res; + } + /** + Flush data to the ZooKeeper node. + + If cached active data has been modified, flush it to the ZooKeeper node. + Returns -EIO if the data cannot be written because the cached active + data is not the expected version, i.e. ZooKeeper returns ZBADVERSION. + -EIO may also indicate a more general failure, such as unable to + communicate with ZooKeeper. + + \return 0 if successful, otherwise negative errno. + */ + int flush() + { + int res = 0; + { + AutoLock lock(_mutex); + res = _flush(); + } + return res; + } + /** + Close of the ZkFuse regular file represented by the ZkFuseFile instance. + + This may: + - Flush dirty data to the ZooKeeper node, and return the result of the + flush operation. + - Reclaim the ZkFuseFile instance. + \see ZkFuseHandleManaer::reclaimIfNecessary + + \return result of flush operation - 0 if successful, + otherwise negative errno. + */ + int close() + { + LOG_DEBUG(LOG, "close() path %s", _path.c_str()); + int res = 0; + + bool reclaim = false; + { + AutoLock lock(_mutex); + res = _flush(); + if (_deleted) { + _clearData(); + _clearChildren(); + } + } + _manager->deallocate(_handle); + + LOG_DEBUG(LOG, "close returns %d", res); + return res; + } + /** + Get ZkFuse regular file or directory attributes. + + \return 0 if successful, otherwise negative errno. + \param stbuf return attributes here. + \param nameType specifies the ZkFuseNameType of the ZkFuse path used + to get attributes. It influences whether the directory + or regular file attributes are returned. + */ + int getattr(struct stat & stbuf, ZkFuseNameType nameType) const + { + LOG_DEBUG(LOG, "getattr(nameType %d) path %s", + int(nameType), _path.c_str()); + + int res = 0; + int version = 0; + std::string metaPath; + { + AutoLock lock(_mutex); + + res = _getattrNoMetaAccess(stbuf, nameType); + if (res == 0) { + version = _activeStat.version; + metaPath = _getChildPath( + ((stbuf.st_mode & S_IFMT) == S_IFREG) ? + _manager->getCommon().getRegMetadataName() : + _manager->getCommon().getDirMetadataName()); + if (_hasChildPath(metaPath) == false) { + metaPath.clear(); + } + } + } + if (res == 0 && metaPath.empty() == false) { + Data data; + int metaRes = _manager->getData(metaPath, data); + LOG_DEBUG(LOG, "metaRes %d dataSize %zu", + metaRes, data.size()); + if (metaRes == 0 && data.empty() == false) { + Metadata metadata; + _decodeMetadata(data, metadata); + LOG_DEBUG(LOG, "metadata version %u active version %u", + metadata.version, version); + if (metadata.version == version) { + /* IMPORTANT: + * Must convert from millisecs to secs before setting + * st_atime and st_mtime to avoid truncation error + * due to 64-bit to 32-bit conversion. + */ + stbuf.st_atime = millisecsToSecs(metadata.atime); + stbuf.st_mtime = millisecsToSecs(metadata.mtime); + } + } + } + + LOG_DEBUG(LOG, "getattr returns %d", res); + return res; + } + /** + Read directory entries. + This interface is defined by FUSE. + + \return 0 if successful, otherwise negative errno. + \param buf output buffer to store output directory entries. + \param filler function used to fill the output buffer. + \param offset start filling from a specific offset. + */ + int readdir(void *buf, fuse_fill_dir_t filler, off_t offset) const + { + LOG_DEBUG(LOG, "readdir(offset %zu) path %s", offset, _path.c_str()); + int res = 0; + + int dataFileIndex = -1; + unsigned leftTrim = 0; + typedef std::pair DirEntry; + typedef std::vector DirEntries; + DirEntries dirEntries; + + /* Get directory entries in two phase to avoid invoking + * ZkFuseHandleManager while holding _mutex. + * In first phase, get all the names of child nodes starting + * at offset. Also remember their index for use in second phase. + * The first phase hold _mutex. + */ + { + AutoLock lock(_mutex); + if (!_isInitialized()) { + LOG_DEBUG(LOG, "not initialized"); + res = -EIO; + } + else { + leftTrim = (_path.length() == 1 ? 1 : _path.length() + 1); + unsigned start = offset; + unsigned i; + for (i = start; i < _children.size(); i++) { + const std::string & childName = _children[i]; + if (_isMeta(childName)) { + continue; + } + dirEntries.push_back(DirEntry(childName, i)); + } + if (i == _children.size() && !_activeData.empty()) { + dataFileIndex = i + 1; + } + res = 0; + } + } + + /* Second phase starts here. + * DONOT hold _mutex as this phase invokes ZkFuseHandleManager to + * get attributes for the directory entries. + */ + if (res == 0) { + bool full = false; + for (DirEntries::const_iterator it = dirEntries.begin(); + it != dirEntries.end(); + it++) { + + ZkFuseAutoHandle childAutoHandle(_manager, it->first); + int childRes = childAutoHandle.get(); + if (childRes >= 0) { + struct stat stbuf; + int attrRes = childAutoHandle.getFile()-> + getattr(stbuf, ZkFuseNameDefaultType); + if (attrRes == 0) { + if (filler(buf, it->first.c_str() + leftTrim, + &stbuf, it->second + 1)) { + LOG_DEBUG(LOG, "filler full"); + full = true; + break; + } + } + } + } + if (full == false && dataFileIndex != -1) { + LOG_DEBUG(LOG, "include data file name"); + struct stat stbuf; + int attrRes = getattr(stbuf, ZkFuseNameRegType); + if (attrRes == 0) { + filler(buf, + _manager->getCommon().getDataFileName().c_str(), + &stbuf, dataFileIndex + 1); + } + } + } + + LOG_DEBUG(LOG, "readdir returns %d", res); + return res; + } + /** + Set the access time and modified time. + + Set the access and modifieds times on the ZkFuse regular file + or directory represented by this ZkFuseFile instance. + + Since there is no interface to change these times on a + ZooKeeper node, ZkFuse simulates this by writing to a + metadata node which is a child node of the ZooKeeper node. + ZkFuse writes the current version, the specified access + and modified times to the metadata node. + + When get attributes is invoked, get attributes will check + for the presence of this metadata node and if the version + number matches the current data version, then get attributes + will return the access and modified times stored in the + metadata node. + + \return 0 if successful, otherwise negative errno. + \param atime access time in milliseconds. + \param mtime modified time in milliseconds. + \param nameType specifies the ZkFuseNameType of the ZkFuse path used + to set access and modified times. It influences + whether the directory or regular file access and + modified times are set. + */ + int utime(uint64_t atime, uint64_t mtime, ZkFuseNameType nameType) + { + LOG_DEBUG(LOG, + "utime(atime %llu, mtime %llu, nameType %d) path %s", + (unsigned long long) atime, + (unsigned long long) mtime, + (int) nameType, _path.c_str()); + + int res = 0; + std::string metaPath; + bool exists = false; + Data data; + { + AutoLock lock(_mutex); + + if (!_isInitialized()) { + LOG_DEBUG(LOG, "not initialized"); + res = -EIO; + } + else { + bool isRegular = _isRegNameType(nameType); + Metadata metadata; + metadata.version = _activeStat.version; + metadata.atime = atime; + metadata.mtime = mtime; + metaPath = _getChildPath( + isRegular ? + _manager->getCommon().getRegMetadataName() : + _manager->getCommon().getDirMetadataName()); + exists = _hasChildPath(metaPath); + _encodeMetadata(metadata, data); + res = 0; + } + } + if (res == 0 && metaPath.empty() == false) { + res = _manager->setData(metaPath, data, exists, true); + } + + LOG_DEBUG(LOG, "utime returns %d", res); + return res; + } + /** + Remove a ZkFuse directory. + + If force is true, then the ZooKeeper node and its decendants + will be deleted. + + If force is false, then this method implements the semantics + of removing a ZkFuse directory. It will delete the ZooKeeper node + only if the ZooKeeper node have no data and no non-metadata + children. + - Return -ENOTDIR if the ZooKeeper node is not considered + to be a directory (after taking into consideration the specified + ZkFuseNameType). + - Return -ENOTEMPTY if the ZooKeeper node has data or it has + non-metadata children. + - Return -ENOENT if the ZooKeeper cannot be deleted, usually this + is because it does not exist. + + \return 0 if successful, otherwise negative errno. + \param nameType the ZkFuseNameType of the path used to specify the + directory to be removed. It influences whether ZkFuse + considers the ZooKeeper node to be a regular file or + directory. \see ZkFuseNameType + \param force set to true to bypass ZkFuse rmdir semantic check. + */ + int rmdir(ZkFuseNameType nameType, bool force) + { + int res = 0; + + { + AutoLock lock(_mutex); + res = _rmdir(nameType, force); + } + if (res == 0) { + _manager->removeChildFromParent(_path); + } + return res; + } + /** + Remove a ZkFuse regular file. + + This method implements the semantics of removing a ZkFuse regular file. + - If the ZkFuse regular file represents the data part of the + ZooKeeper node which is presented as a ZkFuse directory, + the regular file is virtually deleted by truncating the + ZooKeeper node's data. Readdir will not synthesize a regular + file entry for the data part of a ZooKeeper node if + the ZooKeeper node has no data. + - If the ZkFuse regular file represents the data part of the + ZooKeeper node which is presented as a ZkFuse regular file, + the ZooKeeper node and its decendants are deleted. + + Returns -EISDIR if the ZkFuse regular file cannot be deleted + because ZkFuse consider it to be a directory. + + \return 0 if successful, otherwise negative errno. + \param nameType the ZkFuseNameType of the path used to specify the + directory to be removed. It influences whether ZkFuse + considers the ZooKeeper node to be a regular file or + directory. \see ZkFuseNameType + */ + int unlink(ZkFuseNameType nameType) + { + int res = 0; + { + AutoLock lock(_mutex); + res = _unlink(nameType); + } + if (res == 0) { + _manager->removeChildFromParent(_path); + } + return res; + } + /** + Utility function to construct a ZooKeeper path for a child + of a ZooKeeper node. + + \return the full path of the child. + \param parent the parent's full path. + \param child the child's parent component. + */ + static std::string buildChildPath(const std::string & parent, + const std::string & child) + { + std::string s; + s.reserve(parent.length() + child.length() + 32); + if (parent.length() > 1) { + // special case for root dir + s += parent; + } + s += "/"; + s += child; + return s; + } +}; + +ZkFuseFile::DataListener ZkFuseFile::_dataListener; +ZkFuseFile::ChildrenListener ZkFuseFile::_childrenListener; + +void ZkFuseAutoHandle::reset(int handle) +{ + int old = _handle; + ZkFuseFilePtr oldFile = _file; + _handle = handle; + _initFile(); + if (old >= 0) { + assert(oldFile != NULL); + oldFile->close(); + } +} + +ZkFuseHandleManager::Handle +ZkFuseHandleManager::allocate(const std::string & path, bool & newFile) +{ + LOG_DEBUG(LOG, "allocate(path %s)", path.c_str()); + + Handle handle; + { + AutoLock lock(_mutex); + Map::iterator it = _map.find(path); + if (it == _map.end()) { + LOG_DEBUG(LOG, "not found"); + if (_freeList.empty()) { + handle = _files.size(); + _files.resize(handle + 1); + LOG_DEBUG(LOG, "free list empty, resize handle %d", handle); + } else { + handle = _freeList.back(); + _freeList.pop_back(); + LOG_DEBUG(LOG, "get from free list, handle %d", handle); + } + assert(_files[handle] == NULL); + _files[handle] = + new ZkFuseFile(SharedPtr(_thisWeakPtr), handle, path); + /* Not really supposed to invoke the new ZkFuseFile instance + * because this method is not supposed to invoke ZkFuseFile + * methods that while holding _mutex. However, it is safe + * to do without casuing deadlock because these methods + * are known not to invoke other methods, especially one + * that invoke this ZkFuseHandleManager instance. + */ + assert(_files[handle]->incRefCount(0) == 1); + _map[path] = handle; + _numInUse++; + LOG_DEBUG(LOG, "numInUse %u", _numInUse); + newFile = true; + } else { + LOG_DEBUG(LOG, "found"); + handle = it->second; + assert(_files[handle] != NULL); + int refCount = _files[handle]->incRefCount(); + if (refCount == 1) { + _numInUse++; + LOG_DEBUG(LOG, "resurrecting zombie, numInUse %u", _numInUse); + } + newFile = false; + } + } + + LOG_DEBUG(LOG, "allocate returns %d, newFile %d", handle, newFile); + return handle; +} + +void ZkFuseHandleManager::deallocate(Handle handle) +{ + LOG_DEBUG(LOG, "deallocate(handle %d)", handle); + + if (handle >= 0) { + bool reclaim = false; + ZkFuseFilePtr file; + { + AutoLock lock(_mutex); + file = _files[handle]; + assert(file != NULL); + int refCount = file->decRefCount(); + const std::string & path = file->getPath(); + LOG_DEBUG(LOG, "path %s ref count %d", path.c_str(), refCount); + if (refCount == 0) { + _numInUse--; + unsigned numCached = _files.size() - _numInUse; + if (numCached > _common.getCacheSize()) { + LOG_TRACE(LOG, + "reclaim path %s, cacheSize %u, filesSize %zu, " + "numInUse %u", + path.c_str(), + _common.getCacheSize(), _files.size(), _numInUse); + _map.erase(path); + _files[handle] = NULL; + _freeList.push_back(handle); + reclaim = true; + } + } + } + if (reclaim) { + delete file; + } + } + else { + LOG_DEBUG(LOG, "handle invalid"); + } + + LOG_DEBUG(LOG, "deallocate done"); +} + +void ZkFuseHandleManager::eventReceived(const ZKWatcherEvent & event) +{ + int eventType = event.getType(); + int eventState = event.getState(); + const std::string & path = event.getPath(); + LOG_DEBUG(LOG, "eventReceived() eventType %d, eventState %d, path %s", + eventType, eventState, path.c_str()); + + if (eventType == ZOO_DELETED_EVENT || + eventType == ZOO_CHANGED_EVENT || + eventType == ZOO_CHILD_EVENT) { + { + AutoLock lock(_mutex); + Map::iterator it = _map.find(path); + if (it != _map.end()) { + LOG_DEBUG(LOG, "path found"); + Handle handle = it->second; + ZkFuseFilePtr file = _files[handle]; + assert(file != NULL); + /* Prevent the ZkFuseFile instance from being + * deleted while handling the event. + */ + int refCount = file->incRefCount(); + if (refCount == 1) { + _numInUse++; + } + /* Pretent to be dir open. + */ + int dirCount = file->incOpenDirCount(); + { + /* _mutex is unlocked in this scope */ + AutoUnlockTemp autoUnlockTemp(lock); + if (eventType == ZOO_CHILD_EVENT) { + file->childrenEventReceived(event); + } + else if (eventType == ZOO_CHANGED_EVENT) { + file->dataEventReceived(event); + } + else { + assert(eventType == ZOO_DELETED_EVENT); + file->dataEventReceived(event); + // file->childrenEventReceived(event); + } + file->decOpenDirCount(); + deallocate(handle); + } + } + else { + LOG_WARN(LOG, + "path %s not found for event type %d, event state %d", + path.c_str(), eventType, eventState); + } + } + } + else if (eventType == ZOO_SESSION_EVENT) { + if (eventState == ZOO_CONNECTING_STATE) { + LOG_TRACE(LOG, "*** CONNECTING ***"); + { + AutoLock lock(_mutex); + for (int handle = 0; handle < _files.size(); handle++) { + ZkFuseFilePtr file = _files[handle]; + if (file != NULL) { + /* prevent the ZkFuseFile instance from being + * deleted while handling the event. + */ + int refCount = file->incRefCount(); + if (refCount == 1) { + _numInUse++; + } + /* Pretent to be dir open. + */ + int dirCount = file->incOpenDirCount(); + { + /* _mutex is unlocked in this scope */ + AutoUnlockTemp autoUnlockTemp(lock); + file->dataEventReceived(event); + file->childrenEventReceived(event); + file->decOpenDirCount(); + deallocate(handle); + } + /* this will eventually call decrement ref count */ + } + } + } + } + else if (eventState == ZOO_CONNECTED_STATE) { + LOG_TRACE(LOG, "*** CONNECTED ***"); + } + } + else { + LOG_WARN(LOG, + "eventReceived ignoring event type %d, event state %d, " + "path %s", eventType, eventState, path.c_str()); + } +} + +int ZkFuseHandleManager::getData(const std::string & path, + Data & data) +{ + LOG_DEBUG(LOG, "getData(path %s)", path.c_str()); + + int res = 0; + data.clear(); + ZkFuseAutoHandle autoHandle(SharedPtr(_thisWeakPtr), path); + res = autoHandle.get(); + if (res >= 0) { + autoHandle.getFile()->getData(data); + res = 0; + } + + LOG_DEBUG(LOG, "getData returns %d", res); + return res; +} + +int ZkFuseHandleManager::setData(const std::string & path, + const Data & data, + bool exists, + bool doFlush) +{ + LOG_DEBUG(LOG, "setData(path %s, exists %d)\n%s", + path.c_str(), exists, data.c_str()); + + int res = 0; + if (exists) { + res = open(path, false); + } else { + bool created; + res = mknod(path, S_IFREG, true, created); + } + if (res >= 0) { + ZkFuseAutoHandle autoHandle(SharedPtr(_thisWeakPtr), res); + res = autoHandle.getFile()->setData(data, doFlush); + } + + LOG_DEBUG(LOG, "setData returns %d", res); + return res; +} + +int ZkFuseHandleManager::mknod(const std::string & path, + mode_t mode, + bool mayExist, + bool & created) +{ + LOG_DEBUG(LOG, "mknod(path %s, mode %o, mayExist %d)", + path.c_str(), mode, mayExist); + + int res = 0; + created = false; + try { + if (S_ISREG(mode) == false && S_ISDIR(mode) == false) { + LOG_DEBUG(LOG, "bad mode %o", mode); + res = -EINVAL; + } + else { + Data data; + LOG_DEBUG(LOG, "create %s", path.c_str()); + created = + _common.getZkAdapter()->createNode(path, data, 0, false); + if (created) { + LOG_DEBUG(LOG, "created"); + if (S_ISDIR(mode)) { + /* is mkdir - create directory marker */ + std::string dirMetaPath = ZkFuseFile::buildChildPath + (path, _common.getDirMetadataName()); + LOG_DEBUG(LOG, "create %s", dirMetaPath.c_str()); + bool created; + int metaRes = mknod(dirMetaPath, S_IFREG, true, created); + if (metaRes >= 0) { + getFile(metaRes)->close(); + } + } + addChildToParent(path); + LOG_DEBUG(LOG, "open after create"); + res = open(path, true); + } else { + LOG_DEBUG(LOG, "create failed"); + int openRes = open(path, false); + if (openRes >= 0) { + if (mayExist == false) { + LOG_DEBUG(LOG, "create failed because already exist"); + getFile(openRes)->close(); + res = -EEXIST; + } else { + res = openRes; + } + } else { + LOG_DEBUG(LOG, "create failed but does not exist"); + res = -ENOENT; + } + } + } + } catch (const ZooKeeperException & e) { + LOG_ERROR(LOG, "mknod %s exception %s", path.c_str(), e.what()); + res = -EIO; + } + + LOG_DEBUG(LOG, "mknod returns %d created %d", res, created); + return res; +} + +int ZkFuseHandleManager::mkdir(const char * path, mode_t mode) +{ + LOG_DEBUG(LOG, "mkdir(path %s, mode %o)", path, mode); + + int res = 0; + try { + ZkFuseNameType nameType; + std::string zkPath = getZkPath(path, nameType); + mode = (mode & ~S_IFMT) | S_IFDIR; + ZkFuseAutoHandle autoHandle + (SharedPtr(_thisWeakPtr), zkPath, mode, false); + res = autoHandle.get(); + if (res >= 0) { + res = 0; + } + } catch (const std::exception & e) { + LOG_ERROR(LOG, "mkdir %s exception %s", path, e.what()); + res = -EIO; + } + + LOG_DEBUG(LOG, "mkdir returns %d", res); + return res; +} + +int ZkFuseHandleManager::open(const std::string & path, bool justCreated) +{ + LOG_DEBUG(LOG, "open(path %s, justCreated %d)", + path.c_str(), justCreated); + + int res = 0; + try { + bool newFile; + Handle handle = allocate(path, newFile); + ZkFuseAutoHandle autoHandle(SharedPtr(_thisWeakPtr), handle); + res = getFile(handle)->update(newFile || justCreated); + if (res == 0) { + res = handle; + autoHandle.release(); + } + } catch (const ZooKeeperException & e) { + LOG_ERROR(LOG, "open %s exception %s", path.c_str(), e.what()); + res = -EIO; + } + + LOG_DEBUG(LOG, "open returns %d", res); + return res; +} + +int ZkFuseHandleManager::rmdir(const char * path, bool force) +{ + LOG_DEBUG(LOG, "rmdir(path %s, force %d)", path, force); + + int res = 0; + + try { + ZkFuseNameType nameType; + std::string zkPath = getZkPath(path, nameType); + ZkFuseAutoHandle autoHandle(SharedPtr(_thisWeakPtr), zkPath); + res = autoHandle.get(); + if (res >= 0) { + res = autoHandle.getFile()->rmdir(nameType, force); + } + } catch (const std::exception & e) { + LOG_ERROR(LOG, "rmdir %s exception %s", path, e.what()); + res = -EIO; + } + + LOG_DEBUG(LOG, "rmdir returns %d", res); + return res; +} + + +int +ZkFuseHandleManager::unlink(const char * path) +{ + LOG_DEBUG(LOG, "unlink(path %s)", path); + + ZkFuseNameType nameType; + std::string zkPath = getZkPath(path, nameType); + ZkFuseAutoHandle autoHandle(SharedPtr(_thisWeakPtr), zkPath); + int res = autoHandle.get(); + if (res >= 0) { + res = autoHandle.getFile()->unlink(nameType); + } + + LOG_DEBUG(LOG, "unlink returns %d", res); + return res; +} + +int ZkFuseHandleManager::getattr(const char *path, struct stat &stbuf) +{ + LOG_DEBUG(LOG, "getattr(path %s)", path); + + int res = 0; + try { + ZkFuseNameType nameType; + std::string zkPath = getZkPath(path, nameType); + ZkFuseAutoHandle autoHandle(SharedPtr(_thisWeakPtr), zkPath); + res = autoHandle.get(); + if (res >= 0) { + res = autoHandle.getFile()->getattr(stbuf, nameType); + } + } catch (const std::exception & e) { + LOG_ERROR(LOG, "getattr %s exception %s", path, e.what()); + res = -EIO; + } + + LOG_DEBUG(LOG, "getattr returns %d", res); + return res; +} + +int +ZkFuseHandleManager::rename(const char * fromPath, const char * toPath) +{ + LOG_DEBUG(LOG, "rename(fromPath %s, toPath %s)", fromPath, toPath); + + ZkFuseNameType fromNameType; + std::string fromZkPath = getZkPath(fromPath, fromNameType); + ZkFuseAutoHandle fromAutoHandle(SharedPtr(_thisWeakPtr), fromZkPath); + int res = fromAutoHandle.get(); + if (res >= 0) { + LOG_DEBUG(LOG, "good fromPath"); + if (fromAutoHandle.getFile()->isDirNameType(fromNameType)) { + LOG_DEBUG(LOG, "fromPath is directory"); + res = -EISDIR; + } + } + if (res >= 0) { + ZkFuseNameType toNameType; + std::string toZkPath = getZkPath(toPath, toNameType); + bool created; + res = mknod(toZkPath.c_str(), S_IFREG, true, created); + if (res >= 0) { + ZkFuseAutoHandle toAutoHandle(SharedPtr(_thisWeakPtr), res); + if (toAutoHandle.getFile()->isDirNameType(toNameType)) { + LOG_DEBUG(LOG, "toPath is directory"); + res = -EISDIR; + } + if (res >= 0) { + LOG_DEBUG(LOG, "copy data"); + Data data; + fromAutoHandle.getFile()->getData(data); + toAutoHandle.getFile()->setData(data, true); + LOG_DEBUG(LOG, "copy metadata"); + struct stat stbuf; + int metaRes = + fromAutoHandle.getFile()->getattr(stbuf, fromNameType); + if (metaRes < 0) { + LOG_DEBUG(LOG, "get metadata failed"); + } + else { + metaRes = toAutoHandle.getFile()-> + utime(secsToMillisecs(stbuf.st_atime), + secsToMillisecs(stbuf.st_mtime), + toNameType); + if (metaRes < 0) { + LOG_DEBUG(LOG, "set metadata failed"); + } + } + } + if (created && res < 0) { + LOG_DEBUG(LOG, "undo create because copy data failed"); + int rmRes = toAutoHandle.getFile()->rmdir(toNameType, true); + } + } + } + if (res >= 0) { + LOG_DEBUG(LOG, "copy successful, unlink fromPath"); + res = fromAutoHandle.getFile()->unlink(fromNameType); + } + + LOG_DEBUG(LOG, "rename returns %d", res); + return res; +} + +void +ZkFuseHandleManager::addChildToParent(const std::string & childPath) const +{ + LOG_DEBUG(LOG, "addChildToParent(childPath %s)", childPath.c_str()); + + std::string parentPath = getParentPath(childPath); + if (!parentPath.empty()) { + AutoLock lock(_mutex); + Map::const_iterator it = _map.find(parentPath); + if (it != _map.end()) { + Handle handle = it->second; + assert(_files[handle] != NULL); + _files[handle]->addChild(childPath); + } + } + + LOG_DEBUG(LOG, "addChildToParent done"); +} + +void +ZkFuseHandleManager::removeChildFromParent(const std::string & childPath) const +{ + LOG_DEBUG(LOG, "removeChildFromParent(childPath %s)", childPath.c_str()); + + std::string parentPath = getParentPath(childPath); + if (!parentPath.empty()) { + AutoLock lock(_mutex); + Map::const_iterator it = _map.find(parentPath); + if (it != _map.end()) { + Handle handle = it->second; + assert(_files[handle] != NULL); + _files[handle]->removeChild(childPath); + } + } + + LOG_DEBUG(LOG, "removeChildFromParent done"); +} + +std::string +ZkFuseHandleManager::getParentPath(const std::string & childPath) const +{ + std::string::size_type lastPos = childPath.rfind('/'); + if (lastPos > 0) { + return std::string(childPath, 0, lastPos); + } + else { + assert(childPath[0] == '/'); + return std::string(); + } +} + +std::string +ZkFuseHandleManager::getZkPath(const char * path, ZkFuseNameType & nameType) + const +{ + LOG_DEBUG(LOG, "getZkPath(path %s)", path); + + std::string res; + unsigned pathLen = strlen(path); + const std::string & dataFileName = _common.getDataFileName(); + unsigned dataSuffixLen = dataFileName.length(); + const char * dataSuffix = dataFileName.c_str(); + unsigned dataSuffixIncludeSlashLen = dataSuffixLen + 1; + const std::string & forceDirSuffix = _common.getForceDirSuffix(); + unsigned forceDirSuffixLen = _common.getForceDirSuffix().length(); + /* Check if path is "/". If so, it is always a directory. + */ + if (pathLen == 1) { + assert(path[0] == '/'); + res = _common.getRootPathName(); + nameType = ZkFuseNameDirType; + } + /* Check if path ends of /{dataSuffix}, e.g. /foo/bar/{dataSuffix}. + * If so remove dataSuffix and nameType is ZkFuseNameRegType. + */ + else if ( + (pathLen >= dataSuffixIncludeSlashLen) && + (path[pathLen - dataSuffixIncludeSlashLen] == '/') && + (strncmp(path + (pathLen - dataSuffixLen), + dataSuffix, dataSuffixLen) == 0) + ) { + if ((pathLen - dataSuffixIncludeSlashLen) == 0) { + res = _common.getRootPathName(); + } else { + res.assign(path, pathLen - dataSuffixIncludeSlashLen); + } + nameType = ZkFuseNameRegType; + } + /* If not ZkFuseNameRegType, then check if path ends of + * {forceDirSuffix}, e.g. /foo/bar{forceDirSuffix}. + * If so remove forceDirSuffix and nameType is ZkFuseNameDirType. + */ + else if (forceDirSuffixLen > 0 && + pathLen >= forceDirSuffixLen && + strncmp(path + (pathLen - forceDirSuffixLen), + forceDirSuffix.c_str(), forceDirSuffixLen) == 0) { + res.assign(path, pathLen - forceDirSuffixLen); + nameType = ZkFuseNameDirType; + } + /* If not ZkFuseNameRegType and not ZkFuseNameDirType, then + * it is ZkFuseNameDefaultType. ZkFuse will infer type from + * ZooKeeper node's content. + */ + else { + res = path; + nameType = ZkFuseNameDefaultType; + } + /* Intermediate components of the path name may have + * forceDirSuffix, e.g. /foo/bar{forceDirSuffix}/baz. + * If so, remove the intermediate {forceDirSuffix}es. + */ + if (forceDirSuffixLen > 0) { + /* pos is an optimization to avoid always scanning from + * beginning of path + */ + unsigned pos = 0; + while ((res.length() - pos) > forceDirSuffixLen + 1) { + const char * found = + strstr(res.c_str() + pos, forceDirSuffix.c_str()); + if (found == NULL) { + break; + } + if (found[forceDirSuffixLen] == '/' || + found[forceDirSuffixLen] == '\0') { + pos = found - res.c_str(); + res.erase(pos, forceDirSuffixLen); + } + else { + pos += forceDirSuffixLen; + } + } + } + + LOG_DEBUG(LOG, "getZkPath returns %s, nameType %d", + res.c_str(), int(nameType)); + return res; +} + +static ZkFuseHandleManager::SharedPtr singletonZkFuseHandleManager; + +inline const ZkFuseHandleManager::SharedPtr & zkFuseHandleManager() +{ + return singletonZkFuseHandleManager; +} + +static +int zkfuse_getattr(const char *path, struct stat *stbuf) +{ + LOG_DEBUG(LOG, "zkfuse_getattr(path %s)", path); + + int res = 0; + try { + res = zkFuseHandleManager()->getattr(path, *stbuf); + } catch (const std::exception & e) { + LOG_ERROR(LOG, "zkfuse_getattr %s exception %s", path, e.what()); + res = -EIO; + } + + LOG_DEBUG(LOG, "zkfuse_getattr returns %d", res); + return res; +} + +static +int zkfuse_fgetattr(const char *path, struct stat *stbuf, + struct fuse_file_info *fi) +{ + LOG_DEBUG(LOG, "zkfuse_fgetattr(path %s)", path); + + int res = 0; + int handle = fi->fh; + try { + if (handle <= 0) { + res = -EINVAL; + } + else { + res = zkFuseHandleManager()->getFile(handle)-> + getattr(*stbuf, ZkFuseNameDefaultType); + } + } catch (const std::exception & e) { + LOG_ERROR(LOG, "zkfuse_fgetattr %s exception %s", path, e.what()); + res = -EIO; + } + + LOG_DEBUG(LOG, "zkfuse_fgetattr returns %d", res); + return res; +} + +static +int zkfuse_access(const char *path, int mask) +{ + /* not implemented */ + return -1; +} + +static +int zkfuse_readlink(const char *path, char *buf, size_t size) +{ + /* not implemented */ + return -1; +} + +static +int zkfuse_opendir(const char *path, struct fuse_file_info *fi) +{ + LOG_DEBUG(LOG, "zkfuse_opendir(path %s)", path); + + int res = 0; + try { + ZkFuseNameType nameType; + std::string zkPath = zkFuseHandleManager()->getZkPath(path, nameType); + if (nameType == ZkFuseNameRegType) { + res = -ENOENT; + } + else { + ZkFuseAutoHandle autoHandle(zkFuseHandleManager(), zkPath); + res = autoHandle.get(); + if (res >= 0) { + autoHandle.getFile()->incOpenDirCount(); + autoHandle.release(); + fi->fh = res; + res = 0; + } + } + } catch (const std::exception & e) { + LOG_ERROR(LOG, "zkfuse_opendir %s exception %s", path, e.what()); + res = -EIO; + } + + LOG_DEBUG(LOG, "zkfuse_opendir returns %d", res); + return res; +} + +static int +zkfuse_readdir(const char *path, void *buf, fuse_fill_dir_t filler, + off_t offset, struct fuse_file_info *fi) +{ + LOG_DEBUG(LOG, "zkfuse_readdir(path %s, offset %zu)", path, offset); + + int res = 0; + int handle = fi->fh; + try { + if (handle <= 0) { + res = -EINVAL; + } + else { + res = zkFuseHandleManager()->getFile(handle)-> + readdir(buf, filler, offset); + } + } catch (const std::exception & e) { + LOG_ERROR(LOG, "zkfuse_readdir %s exception %s", path, e.what()); + res = -EIO; + } + + LOG_DEBUG(LOG, "zkfuse_readdir returns %d", res); + return res; +} + +static +int zkfuse_releasedir(const char *path, struct fuse_file_info *fi) +{ + LOG_DEBUG(LOG, "zkfuse_releasedir(path %s)", path); + + int res = 0; + unsigned handle = fi->fh; + try { + if (handle <= 0) { + res = -EINVAL; + } + else { + zkFuseHandleManager()->getFile(handle)->decOpenDirCount(); + zkFuseHandleManager()->getFile(handle)->close(); + } + } catch (const std::exception & e) { + LOG_ERROR(LOG, "zkfuse_releasedir %s exception %s", path, e.what()); + res = -EIO; + } + + LOG_DEBUG(LOG, "zkfuse_releasedir returns %d", res); + return res; +} + +static +int zkfuse_mknod(const char *path, mode_t mode, dev_t rdev) +{ + LOG_DEBUG(LOG, "zkfuse_mknod(path %s, mode %o)", path, mode); + + int res = 0; + try { + ZkFuseNameType nameType; + std::string zkPath = zkFuseHandleManager()->getZkPath(path, nameType); + ZkFuseAutoHandle autoHandle(zkFuseHandleManager(), zkPath, mode, false); + res = autoHandle.get(); + if (res >= 0) { + res = 0; + } + } catch (const std::exception & e) { + LOG_ERROR(LOG, "zkfuse_mknod %s exception %s", path, e.what()); + res = -EIO; + } + + LOG_DEBUG(LOG, "zkfuse_mknod returns %d", res); + return res; +} + +static int zkfuse_mkdir(const char *path, mode_t mode) +{ + LOG_DEBUG(LOG, "zkfuse_mkdir(path %s, mode %o", path, mode); + + int res = 0; + try { + res = zkFuseHandleManager()->mkdir(path, mode); + } catch (const std::exception & e) { + LOG_ERROR(LOG, "zkfuse_mkdir %s exception %s", path, e.what()); + res = -EIO; + } + + LOG_DEBUG(LOG, "zkfuse_mkdir returns %d", res); + return res; +} + +static int zkfuse_unlink(const char *path) +{ + LOG_DEBUG(LOG, "zkfuse_unlink(path %s)", path); + + int res = 0; + try { + res = zkFuseHandleManager()->unlink(path); + } catch (const std::exception & e) { + LOG_ERROR(LOG, "zkfuse_unlink %s exception %s", path, e.what()); + res = -EIO; + } + + LOG_DEBUG(LOG, "zkfuse_unlink returns %d", res); + return res; +} + +static int zkfuse_rmdir(const char *path) +{ + LOG_DEBUG(LOG, "zkfuse_rmdir(path %s)", path); + + int res = 0; + try { + res = zkFuseHandleManager()->rmdir(path); + } catch (const std::exception & e) { + LOG_ERROR(LOG, "zkfuse_rmdir %s exception %s", path, e.what()); + res = -EIO; + } + + LOG_DEBUG(LOG, "zkfuse_rmdir returns %d", res); + + return res; +} + +static int zkfuse_symlink(const char *from, const char *to) +{ + /* not implemented */ + return -1; +} + +static int zkfuse_rename(const char *from, const char *to) +{ + LOG_DEBUG(LOG, "zkfuse_rename(from %s, to %s)", from, to); + + int res = 0; + try { + res = zkFuseHandleManager()->rename(from, to); + } catch (const std::exception & e) { + LOG_ERROR(LOG, "zkfuse_rename %s %s exception %s", from, to, e.what()); + res = -EIO; + } + + LOG_DEBUG(LOG, "zkfuse_rename returns %d", res); + + return res; +} + +static int zkfuse_link(const char *from, const char *to) +{ + /* not implemented */ + return -1; +} + +static int zkfuse_chmod(const char *path, mode_t mode) +{ + LOG_DEBUG(LOG, "zkfuse_chmod(path %s, mode %o)", path, mode); + int res = 0; + + LOG_DEBUG(LOG, "zkfuse_chmod returns %d", res); + return res; +} + +static int zkfuse_chown(const char *path, uid_t uid, gid_t gid) +{ + LOG_DEBUG(LOG, "zkfuse_chown(path %s, uid %d, gid %d)", path, uid, gid); + + int res = 0; + + if (zkFuseHandleManager()->getCommon().getUid() == uid && + zkFuseHandleManager()->getCommon().getGid() == gid) { + res = 0; + } + else { + res = -EPERM; + } + + LOG_DEBUG(LOG, "zkfuse_chown returns %d", res); + return 0; +} + +static int zkfuse_truncate(const char *path, off_t size) +{ + LOG_DEBUG(LOG, "zkfuse_truncate(path %s, size %zu)", path, size); + + int res = 0; + try { + ZkFuseNameType nameType; + std::string zkPath = zkFuseHandleManager()->getZkPath(path, nameType); + ZkFuseAutoHandle autoHandle(zkFuseHandleManager(), zkPath); + res = autoHandle.get(); + if (res >= 0) { + res = autoHandle.getFile()->truncate(size); + } + } catch (const std::exception & e) { + LOG_ERROR(LOG, "zkfuse_truncate %s exception %s", path, e.what()); + res = -EIO; + } + + LOG_DEBUG(LOG, "zkfuse_truncate returns %d", res); + return res; +} + +static +int zkfuse_ftruncate(const char *path, off_t size, struct fuse_file_info *fi) +{ + LOG_DEBUG(LOG, "zkfuse_ftruncate(path %s, size %zu)", path, size); + + int res = 0; + unsigned handle = fi->fh; + try { + if (handle <= 0) { + res = -EINVAL; + } + else { + res = zkFuseHandleManager()->getFile(handle)->truncate(size); + } + } catch (const std::exception & e) { + LOG_ERROR(LOG, "zkfuse_ftruncate %s exception %s", path, e.what()); + res = -EIO; + } + + LOG_DEBUG(LOG, "zkfuse_ftruncate returns %d", res); + return res; +} + +static +int zkfuse_utimens(const char *path, const struct timespec ts[2]) +{ + LOG_DEBUG(LOG, "zkfuse_utimens(path %s)", path); + + int res = 0; + try { + uint64_t atime = timespecToMillisecs(ts[0]); + uint64_t mtime = timespecToMillisecs(ts[1]); + ZkFuseNameType nameType; + std::string zkPath = zkFuseHandleManager()->getZkPath(path, nameType); + ZkFuseAutoHandle autoHandle(zkFuseHandleManager(), zkPath); + res = autoHandle.get(); + if (res >= 0) { + res = autoHandle.getFile()->utime(atime, mtime, nameType); + } + } catch (const std::exception & e) { + LOG_ERROR(LOG, "zkfuse_utimens %s exception %s", path, e.what()); + res = -EIO; + } + + LOG_DEBUG(LOG, "zkfuse_utimens returns %d", res); + return res; +} + +static +int zkfuse_create(const char *path, mode_t mode, struct fuse_file_info *fi) +{ + int fd; + + fd = open(path, fi->flags, mode); + if (fd == -1) + return -errno; + + fi->fh = fd; + return 0; +} + +static +int zkfuse_open(const char *path, struct fuse_file_info *fi) +{ + LOG_DEBUG(LOG, "zkfuse_open(path %s, flags %o)", path, fi->flags); + + int res = 0; + try { + ZkFuseNameType nameType; + std::string zkPath = zkFuseHandleManager()->getZkPath(path, nameType); + ZkFuseAutoHandle autoHandle(zkFuseHandleManager(), zkPath); + res = autoHandle.get(); + if (res >= 0) { + if (autoHandle.getFile()->isDirNameType(nameType)) { + res = -ENOENT; + } + } + if (res >= 0) { + autoHandle.release(); + fi->fh = res; + res = 0; + } + } catch (const std::exception & e) { + LOG_ERROR(LOG, "zkfuse_open %s exception %s", path, e.what()); + res = -EIO; + } + + LOG_DEBUG(LOG, "zkfuse_open returns %d", res); + return res; +} + +static +int zkfuse_read(const char *path, char *buf, size_t size, off_t offset, + struct fuse_file_info *fi) +{ + LOG_DEBUG(LOG, "zkfuse_read(path %s, size %zu, offset %zu)", + path, size, offset); + + int res = 0; + unsigned handle = fi->fh; + try { + if (handle <= 0) { + res = -EINVAL; + } + else { + res = zkFuseHandleManager()->getFile(handle)-> + read(buf, size, offset); + } + } catch (const std::exception & e) { + LOG_ERROR(LOG, "zkfuse_read %s exception %s", path, e.what()); + res = -EIO; + } + + LOG_DEBUG(LOG, "zkfuse_read returns %d", res); + return res; +} + +static +int zkfuse_write(const char *path, const char *buf, size_t size, + off_t offset, struct fuse_file_info *fi) +{ + LOG_DEBUG(LOG, "zkfuse_write(path %s, size %zu, offset %zu)", + path, size, offset); + + int res = 0; + unsigned handle = fi->fh; + try { + if (handle <= 0) { + res = -EINVAL; + } + else { + res = zkFuseHandleManager()->getFile(handle)-> + write(buf, size, offset); + } + } catch (const std::exception & e) { + LOG_ERROR(LOG, "zkfuse_write %s exception %s", path, e.what()); + res = -EIO; + } + + LOG_DEBUG(LOG, "zkfuse_write returns %d", res); + return res; +} + +static int zkfuse_statfs(const char *path, struct statvfs *stbuf) +{ + /* not implemented */ + return -1; +} + +static +int zkfuse_flush(const char *path, struct fuse_file_info *fi) +{ + /* This is called from every close on an open file, so call the + close on the underlying filesystem. But since flush may be + called multiple times for an open file, this must not really + close the file. This is important if used on a network + filesystem like NFS which flush the data/metadata on close() */ + + LOG_DEBUG(LOG, "zkfuse_flush(path %s)", path); + + int res = 0; + unsigned handle = fi->fh; + try { + if (handle <= 0) { + res = -EINVAL; + } + else { + res = zkFuseHandleManager()->getFile(handle)->flush(); + } + } catch (const std::exception & e) { + LOG_ERROR(LOG, "zkfuse_flush %s exception %s", path, e.what()); + res = -EIO; + } + + LOG_DEBUG(LOG, "zkfuse_flush returns %d", res); + return res; +} + +static +int zkfuse_release(const char *path, struct fuse_file_info *fi) +{ + LOG_DEBUG(LOG, "zkfuse_release(path %s)", path); + + int res = 0; + unsigned handle = fi->fh; + try { + if (handle <= 0) { + res = -EINVAL; + } + else { + zkFuseHandleManager()->getFile(handle)->close(); + } + } catch (const std::exception & e) { + LOG_ERROR(LOG, "zkfuse_release %s exception %s", path, e.what()); + res = -EIO; + } + + LOG_DEBUG(LOG, "zkfuse_release returns %d", res); + return res; +} + +static +int zkfuse_fsync(const char *path, int isdatasync, + struct fuse_file_info *fi) +{ + LOG_DEBUG(LOG, "zkfuse_fsync(path %s, isdatasync %d)", path, isdatasync); + + (void) isdatasync; + int res = zkfuse_flush(path, fi); + + LOG_DEBUG(LOG, "zkfuse_fsync returns %d", res); + return res; +} + +#ifdef HAVE_SETXATTR +/* xattr operations are optional and can safely be left unimplemented */ +static int zkfuse_setxattr(const char *path, const char *name, const char *value, + size_t size, int flags) +{ + int res = lsetxattr(path, name, value, size, flags); + if (res == -1) + return -errno; + return 0; +} + +static int zkfuse_getxattr(const char *path, const char *name, char *value, + size_t size) +{ + int res = lgetxattr(path, name, value, size); + if (res == -1) + return -errno; + return res; +} + +static int zkfuse_listxattr(const char *path, char *list, size_t size) +{ + int res = llistxattr(path, list, size); + if (res == -1) + return -errno; + return res; +} + +static int zkfuse_removexattr(const char *path, const char *name) +{ + int res = lremovexattr(path, name); + if (res == -1) + return -errno; + return 0; +} +#endif /* HAVE_SETXATTR */ + +static +int zkfuse_lock(const char *path, struct fuse_file_info *fi, int cmd, + struct flock *lock) +{ + (void) path; + return ulockmgr_op(fi->fh, cmd, lock, &fi->lock_owner, + sizeof(fi->lock_owner)); +} + + +static +void init_zkfuse_oper(fuse_operations & fo) +{ + memset(&fo, 0, sizeof(fuse_operations)); + fo.getattr = zkfuse_getattr; + fo.fgetattr = zkfuse_fgetattr; + // fo.access = zkfuse_access; + // fo.readlink = zkfuse_readlink; + fo.opendir = zkfuse_opendir; + fo.readdir = zkfuse_readdir; + fo.releasedir = zkfuse_releasedir; + fo.mknod = zkfuse_mknod; + fo.mkdir = zkfuse_mkdir; + // fo.symlink = zkfuse_symlink; + fo.unlink = zkfuse_unlink; + fo.rmdir = zkfuse_rmdir; + fo.rename = zkfuse_rename; + // fo.link = zkfuse_link; + fo.chmod = zkfuse_chmod; + fo.chown = zkfuse_chown; + fo.truncate = zkfuse_truncate; + fo.ftruncate = zkfuse_ftruncate; + fo.utimens = zkfuse_utimens; + // fo.create = zkfuse_create; + fo.open = zkfuse_open; + fo.read = zkfuse_read; + fo.write = zkfuse_write; + fo.statfs = zkfuse_statfs; + fo.flush = zkfuse_flush; + fo.release = zkfuse_release; + fo.fsync = zkfuse_fsync; +#ifdef HAVE_SETXATTR + // fo.setxattr = zkfuse_setxattr; + // fo.getxattr = zkfuse_getxattr; + // fo.listxattr = zkfuse_listxattr; + // fo.removexattr = zkfuse_removexattr; +#endif + fo.lock = zkfuse_lock; +}; + + +/** + * The listener of ZK events. + */ +class SessionEventListener : public ZKEventListener +{ + private: + /** + References the ZkFuseHandleManager instance that should be + invoked to service events. + */ + ZkFuseHandleManager::SharedPtr _manager; + + public: + /** + Sets the ZkFuseHandleManager instance that should be invoked + to service events. + */ + void setManager(const ZkFuseHandleManager::SharedPtr & manager) + { + _manager = manager; + } + /** + Received an event and invoke ZkFuseHandleManager instance to handle + received event. + */ + virtual void eventReceived(const ZKEventSource & source, + const ZKWatcherEvent & event) + { + _manager->eventReceived(event); + } +}; + +void +usage(int argc, char *argv[]) +{ + cout + << argv[0] + << " usage: " + << argv[0] + << " [args-and-values]+" << endl + << "nodepath == a complete path to a ZooKeeper node" << endl + << "\t--cachesize= or -c :" << endl + << " number of ZooKeeper nodes to cache." << endl + << "\t--debug or -d: " << endl + << "\t enable fuse debug mode." << endl + << "\t--help or -h: " << endl + << "\t print this message." << endl + << "\t--mount= or -m : " << endl + << "\t specifies where to mount the zkfuse filesystem." << endl + << "\t--name or -n: " << endl + << "\t name of file for accessing node data." << endl + << "\t--zookeeper= or -z : " << endl + << "\t specifies information needed to connect to zeekeeper." << endl; +} + +int +main(int argc, char *argv[]) +{ + /** + * Initialize log4cxx + */ + const std::string file("log4cxx.properties"); + PropertyConfigurator::configureAndWatch( file, 5000 ); + LOG_INFO(LOG, "Starting zkfuse"); + + /** + * Supported operations. + */ + enum ZkOption { + ZkOptionCacheSize = 1000, + ZkOptionDebug = 1001, + ZkOptionForceDirSuffix = 1002, + ZkOptionHelp = 1003, + ZkOptionMount = 1004, + ZkOptionName = 1005, + ZkOptionZookeeper = 1006, + ZkOptionInvalid = -1 + }; + + static const char *shortOptions = "c:df:hm:n:z:"; + static struct option longOptions[] = { + { "cachesize", 1, 0, ZkOptionCacheSize }, + { "debug", 0, 0, ZkOptionDebug }, + { "forcedirsuffix", 1, 0, ZkOptionForceDirSuffix }, + { "help", 0, 0, ZkOptionHelp }, + { "mount", 1, 0, ZkOptionMount }, + { "name", 1, 0, ZkOptionName }, + { "zookeeper", 1, 0, ZkOptionZookeeper }, + { 0, 0, 0, 0 } + }; + + /** + * Parse arguments + */ + bool debugFlag = false; + std::string mountPoint = "/tmp/zkfuse"; + std::string nameOfFile = "_data_"; + std::string forceDirSuffix = "._dir_"; + std::string zkHost; + unsigned cacheSize = 256; + + while (true) { + int c; + + c = getopt_long(argc, argv, shortOptions, longOptions, 0); + if (c == -1) { + break; + } + + switch (c) { + case ZkOptionInvalid: + cerr + << argv[0] + << ": ERROR: Did not specify legal argument!" + << endl; + return 99; + case 'c': + case ZkOptionCacheSize: + cacheSize = strtoul(optarg, NULL, 0); + break; + case 'd': + case ZkOptionDebug: + debugFlag = true; + break; + case 'f': + case ZkOptionForceDirSuffix: + forceDirSuffix = optarg; + break; + case 'h': + case ZkOptionHelp: + usage(argc, argv); + return 0; + case 'm': + case ZkOptionMount: + mountPoint = optarg; + break; + case 'n': + case ZkOptionName: + nameOfFile = optarg; + break; + case 'z': + case ZkOptionZookeeper: + zkHost = optarg; + break; + } + } + + /** + * Check that zkHost has a value, otherwise abort. + */ + if (zkHost.empty()) { + cerr + << argv[0] + << ": ERROR: " + << "required argument \"--zookeeper \" was not given!" + << endl; + return 99; + } + /** + * Check that zkHost has a value, otherwise abort. + */ + if (forceDirSuffix.empty()) { + cerr + << argv[0] + << ": ERROR: " + << "required argument \"--forcedirsuffix \" " + "not cannot be empty!" + << endl; + return 99; + } + /** + * Check nameOfFile has no forward slash + */ + if (nameOfFile.find_first_of('/') != std::string::npos) { + cerr + << argv[0] + << ": ERROR: " + << "'/' present in name which is not allowed" + << endl; + return 99; + } + + if (debugFlag) { + cout + << "cacheSize = " + << cacheSize + << ", debug = " + << debugFlag + << ", forceDirSuffix = \"" + << forceDirSuffix + << "\", mount = \"" + << mountPoint + << "\", name = \"" + << nameOfFile + << "\", zookeeper = \"" + << zkHost + << "\", optind = " + << optind + << ", argc = " + << argc + << ", current arg = \"" + << (optind >= argc ? "NULL" : argv[optind]) + << "\"" + << endl; + } + + SessionEventListener listener; + SynchronousEventAdapter eventAdapter; + LOG_INFO(LOG, "Create ZK adapter"); + try { + /** + * Create an instance of ZK adapter. + */ + std::string h(zkHost); + ZooKeeperConfig config(h, 1000, true, 10000); + ZkFuseCommon zkFuseCommon; + ZooKeeperAdapterSharedPtr zkPtr( + new ZooKeeperAdapter( + config, + &listener, + false + ) + ); + zkFuseCommon.setZkAdapter(zkPtr); + zkFuseCommon.setDataFileName(nameOfFile); + zkFuseCommon.setForceDirSuffix(forceDirSuffix); + zkFuseCommon.setCacheSize(cacheSize); + singletonZkFuseHandleManager = + ZkFuseHandleManagerFactory::create(zkFuseCommon); + listener.setManager(singletonZkFuseHandleManager); + zkPtr->reconnect(); + + } catch (const ZooKeeperException & e) { + cerr + << argv[0] + << ": ERROR: ZookKeeperException caught: " + << e.what() + << endl; + } catch (std::exception & e) { + cerr + << argv[0] + << ": ERROR: std::exception caught: " + << e.what() + << endl; + } + +#ifdef ZOOKEEPER_ROOT_CHILDREN_WATCH_BUG + cerr << "ZOOKEEPER_ROOT_CHILDREN_WATCH_BUG enabled" << endl; +#endif + /** + * Initialize fuse + */ + LOG_INFO(LOG, "Initialize fuse"); + umask(0); + fuse_operations zkfuse_oper; + init_zkfuse_oper(zkfuse_oper); + int fakeArgc = debugFlag ? 3 : 2; + char * fakeArgv[] = { + argv[0], + strdup(mountPoint.c_str()), + debugFlag ? strdup("-d") : NULL, + NULL + }; + int res = fuse_main(fakeArgc, fakeArgv, &zkfuse_oper, NULL); + for (unsigned i = 1; i <= 2; i++) { + if (fakeArgv[i] != NULL) { + free(fakeArgv[i]); + } + } + + return res; +} diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/zkperl/Changes b/pkg/registry/zookeeper-3.4.6/src/contrib/zkperl/Changes new file mode 100644 index 000000000..c31420e5e --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/contrib/zkperl/Changes @@ -0,0 +1,65 @@ +Net::ZooKeeper - Perl extension for Apache ZooKeeper + +Revision history +================ + +0.01 Dec 5, 2008 + - initial version + +0.02 Dec 16, 2008 + - support connection to ZooKeeper and get() method + +0.03 Jan 9, 2009 + - implemented watch mechanism for get() + +0.04 Jan 15, 2009 + - all basic ZooKeeper methods supported + +0.05 Jan 21, 2009 + - converted from T_PTROBJ to T_ZK_HASH with PERL_MAGIC_ext, + allows DESTROY() to be called repeatedly + +0.06 Jan 27, 2009 + - converted from attribute accessor methods to inner and outer hashes + with PERL_MAGIC_tied + +0.07 Jan 29, 2009 + - all tied hash methods completed + +0.08 Jan 30, 2009 + - simple thread safety enforced with CLONE_SKIP + +0.09 Feb 12, 2009 + - ACL constants + +0.10 Feb 18, 2009 + - ACL support + +0.11 Feb 21, 2009 + - ZooKeeper version check + +0.20 Feb 25, 2009 + - refactored watches as subclass + +0.30 Feb 27, 2009 + - refactored stats as subclass + +0.31 Mar 6, 2009 + - test suite completed + +0.32 Mar 25, 2009 + - initial documentation completed, first public release + +0.33 Apr 20, 2009 + - copyright donated to ASF + +0.34 Jul 14, 2009 + - support ZooKeeper 3.2.0 release + +0.35 Jul 15, 2009 + - support multiple include and library locations + +0.36 Mar 27, 2011 + - Fix zookeeper version check, but only warn since we haven't been enforcing it in a while + - Look for zookeeper includes in some sane places by default + diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/zkperl/LICENSE b/pkg/registry/zookeeper-3.4.6/src/contrib/zkperl/LICENSE new file mode 100644 index 000000000..d64569567 --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/contrib/zkperl/LICENSE @@ -0,0 +1,202 @@ + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/zkperl/MANIFEST b/pkg/registry/zookeeper-3.4.6/src/contrib/zkperl/MANIFEST new file mode 100644 index 000000000..1b57436d4 --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/contrib/zkperl/MANIFEST @@ -0,0 +1,23 @@ +Changes +LICENSE +Makefile.PL +MANIFEST +NOTICE +README +typemap +ZooKeeper.pm +ZooKeeper.xs +build/check_zk_version.c +build/check_zk_version.h +t/10_invalid.t +t/15_thread.t +t/20_tie.t +t/22_stat_tie.t +t/24_watch_tie.t +t/30_connect.t +t/35_log.t +t/40_basic.t +t/45_class.t +t/50_access.t +t/60_watch.t +t/util.pl diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/zkperl/Makefile.PL b/pkg/registry/zookeeper-3.4.6/src/contrib/zkperl/Makefile.PL new file mode 100644 index 000000000..9a0996ddd --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/contrib/zkperl/Makefile.PL @@ -0,0 +1,73 @@ +# Net::ZooKeeper - Perl extension for Apache ZooKeeper +# +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you 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. + +use 5.008_008; + +use Config; +use ExtUtils::MakeMaker; +use Getopt::Long; + +my $ZOO_MAJOR_VERSION = 3; +my $ZOO_REQUIRED_VERSION = qr{^$ZOO_MAJOR_VERSION\.\d+.\d+$}ismx; + +my @zk_inc_paths; +my @zk_lib_paths; + +GetOptions( + 'zookeeper-include=s' => \@zk_inc_paths, + 'zookeeper-lib=s' => \@zk_lib_paths +); + +my $zk_inc_paths = join(' ', map("-I$_", @zk_inc_paths)); +my $zk_lib_paths = join(' ', map("-L$_", @zk_lib_paths)); + +$zk_inc_paths .= ' ' unless ($zk_inc_paths eq ''); +$zk_lib_paths .= ' ' unless ($zk_lib_paths eq ''); + +my $cc = $Config{'cc'}; +my $check_file = 'build/check_zk_version'; + +my $check_out = qx($cc $zk_inc_paths $zk_lib_paths -I. -o $check_file $check_file.c 2>&1); + +if ($?) { + if ($check_out =~ /zookeeper_version\.h/) { + die("Could not determine ZooKeeper version:\n\n$check_out"); + } + else { + ## keep in sync with build/check_zk_version.h + die("Net::ZooKeeper requires at least ZooKeeper version 3.1.1\n"); + } +} + +chomp(my $zk_ver = qx($check_file)); + +if ($? >> 8 != 0) { + die "Couldn't check zookeeper version: $zk_ver: $r"; +} +elsif ($zk_ver !~ $ZOO_REQUIRED_VERSION) { + warn "Net::ZooKeeper requires ZooKeeper 3.x, found $zk_ver!"; +} + +WriteMakefile( + 'INC' => "$zk_inc_paths-I.", + 'LIBS' => [ "$zk_lib_paths-lzookeeper_mt" ], + 'NAME' => 'Net::ZooKeeper', + 'VERSION_FROM' => 'ZooKeeper.pm', + 'clean' => { 'FILES' => 'build/check_zk_version.o' } +); + diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/zkperl/NOTICE b/pkg/registry/zookeeper-3.4.6/src/contrib/zkperl/NOTICE new file mode 100644 index 000000000..b68fdac51 --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/contrib/zkperl/NOTICE @@ -0,0 +1,6 @@ +Net::ZooKeeper - Perl extension for Apache ZooKeeper +Copyright 2009 The Apache Software Foundation + +This product includes software developed at +The Apache Software Foundation (http://www.apache.org/). + diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/zkperl/README b/pkg/registry/zookeeper-3.4.6/src/contrib/zkperl/README new file mode 100644 index 000000000..bbe2a0d8f --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/contrib/zkperl/README @@ -0,0 +1,86 @@ +Net::ZooKeeper - Perl extension for Apache ZooKeeper +==================================================== + +Net::ZooKeeper provides a Perl interface to the synchronous C API +of Apache ZooKeeper. ZooKeeper is coordination service for +distributed applications. +For details see the ZooKeeper home page at: + +http://zookeeper.apache.org/ + +INSTALLATION + +To install this module type the following, first install the +zookeeper C client, then: + + perl Makefile.PL + make + ZK_TEST_HOSTS=host:port,... make test + make install + +If the C headers and library are installed in non-standard +locations, specify them as arguments to Makefile.PL: + + perl Makefile.PL \ + --zookeeper-include=/path/to/zookeeper/client/include \ + --zookeeper-lib=/path/to/zookeeper/client/lib + +The path supplied to the --zookeeper-include option should +identify the directory that contains the zookeeper.h and other +ZooKeeper C include files. + +The path supplied to the --zookeeper-lib option should identify +the directory that contains the libzookeeper_mt library. + +When running "make test", if no ZK_TEST_HOSTS environment +variable is set, many tests will be skipped because no connection +to a ZooKeeper server is available. To execute these tests, +the ZK_TEST_HOSTS variable may be assigned a list of one or more +ZooKeeper host:port pairs, e.g., "localhost:7100,otherhost:7200". + +The ZK_TEST_PATH environment variable, if defined, specifies +the ZooKeeper path under which all test nodes should be created. +The tests expect to have full read/write/create/delete/admin +ZooKeeper permissions under this path. If no ZK_TEST_PATH +variable is defined, the root ZooKeeper path ("/") is used. + +DEPENDENCIES + +Version 3.1.1 of ZooKeeper is required at a minimum. + +For version 3.1.1, you may also want to apply some of these +additional patches to the ZooKeeper C API code: + +https://issues.apache.org/jira/browse/ZOOKEEPER-262 +https://issues.apache.org/jira/browse/ZOOKEEPER-318 + +For version 3.1.1, you may also want to apply some of these +additional patches to the ZooKeeper C API code: + +https://issues.apache.org/jira/browse/ZOOKEEPER-262 +https://issues.apache.org/jira/browse/ZOOKEEPER-466 + +This module requires that the multi-threaded version of the +ZooKeeper C API client library be available on your system. + +This in turn implies that the POSIX pthread library is available +as well. + +COPYRIGHT AND LICENCE + +Licensed to the Apache Software Foundation (ASF) under one +or more contributor license agreements. See the NOTICE file +distributed with this work for additional information +regarding copyright ownership. The ASF licenses this file +to you under the Apache License, Version 2.0 (the +"License"); you may not use this file except in compliance +with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. + diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/zkperl/ZooKeeper.pm b/pkg/registry/zookeeper-3.4.6/src/contrib/zkperl/ZooKeeper.pm new file mode 100644 index 000000000..507f0298d --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/contrib/zkperl/ZooKeeper.pm @@ -0,0 +1,1257 @@ +# Net::ZooKeeper - Perl extension for Apache ZooKeeper +# +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you 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. + +use 5.008_008; + +use strict; +use warnings; + +package Net::ZooKeeper; + +require Exporter; +require XSLoader; + +our $VERSION = '0.36'; + +our @ISA = qw(Exporter); + +our %EXPORT_TAGS = ( + 'errors' => [qw( + ZOK + ZSYSTEMERROR + ZRUNTIMEINCONSISTENCY + ZDATAINCONSISTENCY + ZCONNECTIONLOSS + ZMARSHALLINGERROR + ZUNIMPLEMENTED + ZOPERATIONTIMEOUT + ZBADARGUMENTS + ZINVALIDSTATE + ZAPIERROR + ZNONODE + ZNOAUTH + ZBADVERSION + ZNOCHILDRENFOREPHEMERALS + ZNODEEXISTS + ZNOTEMPTY + ZSESSIONEXPIRED + ZINVALIDCALLBACK + ZINVALIDACL + ZAUTHFAILED + ZCLOSING + ZNOTHING + )], + 'node_flags' => [qw( + ZOO_EPHEMERAL + ZOO_SEQUENCE + )], + 'acl_perms' => [qw( + ZOO_PERM_READ + ZOO_PERM_WRITE + ZOO_PERM_CREATE + ZOO_PERM_DELETE + ZOO_PERM_ADMIN + ZOO_PERM_ALL + )], + 'acls' => [qw( + ZOO_OPEN_ACL_UNSAFE + ZOO_READ_ACL_UNSAFE + ZOO_CREATOR_ALL_ACL + )], + 'events' => [qw( + ZOO_CREATED_EVENT + ZOO_DELETED_EVENT + ZOO_CHANGED_EVENT + ZOO_CHILD_EVENT + ZOO_SESSION_EVENT + ZOO_NOTWATCHING_EVENT + )], + 'states' => [qw( + ZOO_EXPIRED_SESSION_STATE + ZOO_AUTH_FAILED_STATE + ZOO_CONNECTING_STATE + ZOO_ASSOCIATING_STATE + ZOO_CONNECTED_STATE + )], + 'log_levels' => [qw( + ZOO_LOG_LEVEL_OFF + ZOO_LOG_LEVEL_ERROR + ZOO_LOG_LEVEL_WARN + ZOO_LOG_LEVEL_INFO + ZOO_LOG_LEVEL_DEBUG + )] +); + +{ + my %tags; + + push @{$EXPORT_TAGS{'all'}}, + grep {!$tags{$_}++} @{$EXPORT_TAGS{$_}} foreach (keys(%EXPORT_TAGS)); +} + +our @EXPORT_OK = ( @{$EXPORT_TAGS{'all'}} ); + +XSLoader::load('Net::ZooKeeper', $VERSION); + +1; + +__END__ + +=head1 NAME + +Net::ZooKeeper - Perl extension for Apache ZooKeeper + +=head1 SYNOPSIS + + use Net::ZooKeeper qw(:node_flags :acls); + + my $zkh = Net::ZooKeeper->new('localhost:7000'); + + $zkh->create('/foo', 'bar', + 'flags' => ZOO_EPHEMERAL, + 'acl' => ZOO_OPEN_ACL_UNSAFE) or + die("unable to create node /foo: " . $zkh->get_error() . "\n"); + + print "node /foo has value: " . $zkh->get('/foo') . "\n"; + + $zkh->set('/foo', 'baz'); + + print "node / has child nodes:\n"; + foreach my $path ($zkh->get_children('/')) { + print " /$path\n"; + } + + my $stat = $zkh->stat(); + if ($zkh->exists('/foo', 'stat' => $stat)) { + print "node /foo has stat info:\n"; + while (my($key,$value) = each(%{$stat})) { + print " $key: $value\n"; + } + } + + foreach my $acl_entry ($zkh->get_acl('/foo')) { + print "node /foo has ACL entry:\n"; + print " perms: $acl_entry->{perms}\n"; + print " scheme: $acl_entry->{scheme}\n"; + print " id: $acl_entry->{id}\n"; + } + + my $watch = $zkh->watch('timeout' => 10000); + $zkh->exists('/foo', 'watch' => $watch); + + if ($watch->wait()) { + print "watch triggered on node /foo:\n"; + print " event: $watch->{event}\n"; + print " state: $watch->{state}\n"; + } + else { + print "watch timed out after 10 seconds\n"; + } + + $zkh->delete('/foo'); + +=head1 DESCRIPTION + +Net::ZooKeeper provides a Perl interface to the synchronous C API +of Apache ZooKeeper. ZooKeeper is coordination service for +distributed applications. + +Each connection to ZooKeeper is represented as a handle object +of the class Net::ZooKeeper, similar to the manner in which database +connections are represented in the DBI module. + +To disconnect from ZooKeeper, simply destroy the Net::ZooKeeper +handle object by undefining it or by explicitly calling the +C method. + +The methods which may be invoked on Net::ZooKeeper handles +correspond to the functions of the synchronous ZooKeeper C API; +e.g., the Net::ZooKeeper method C calls the ZooKeeper +C function C, C calls C, +and so forth. + +The synchronous API functions wait for a response from the ZooKeeper +cluster before returning a result to the caller. Using these +functions permits Net::ZooKeeper to provide an interface similar +to that of a DBI driver module. + +=head2 Internal POSIX Threads + +The use of the synchronous ZooKeeper C API still requires that +the ZooKeeper C client code create several POSIX threads which run +concurrently with the main thread containing the Perl interpreter. + +The synchronous API functions are wrappers of the asynchronous +functions in the ZooKeeper C API. When a request is made by the +caller's thread (i.e., the one with the running Perl interpreter), +it is enqueued for delivery at a later time by the ZooKeeper C client +code's IO thread. The caller's thread then waits for notification +before returning from the synchronous API function. + +The IO thread dequeues the request and sends it to the ZooKeeper +cluster, while also ensuring that a regular "heartbeat" is maintained +with the cluster so that the current session does not time out. +When the IO thread receives a response from +the ZooKeeper cluster, it enqueues the response for delivery to the +client by the second thread of the ZooKeeper client code, the +completion thread. + +If the caller is using the asynchronous API, the completion thread +invokes the appropriate callback function provided by the caller +for the given request. In the case of Net::ZooKeeper, it is not +viable for the completion thread to invoke a Perl callback function +at arbitrary times; this could interfere with the state of the +Perl interpreter. + +For this reason Net::ZooKeeper uses the synchronous API only. After +enqueuing requests the synchronous API functions wait for notification +of the corresponding response. The completion thread delivers these +notifications, at which point the synchronous functions return to +their caller. + +Note that the IO and completion threads are POSIX threads, not +Perl ithreads. Net::ZooKeeper defined a C function so +that if Perl ithreads are spawned while a Net::ZooKeeper connection +is active, the Net::ZooKeeper handle objects inherited by the +spawned ithread contain undefined values so that they can not be used. +Thus each ithread will need to create its own private connections to a +ZooKeeper cluster. + +Note also that before invoking C to spawn a new process, +all Net::ZooKeeper handles should be destroyed so that all +connections to ZooKeeper are closed and all internal POSIX threads +have exited. If a child process needs to communicate with +ZooKeeper it should open its own private connections after it is +created by C. + +=head2 Signals + +The ZooKeeper C API uses TCP connections to communicate with +the ZooKeeper cluster. These connections may generate SIGPIPE +signals when they encounter errors, such as when a connection +is terminated by a ZooKeeper server. Therefore most applications +will want to trap or ignore SIGPIPE signals, e.g.: + + local $SIG{'PIPE'} = 'IGNORE'; + +Ignoring SIGPIPE signals (or providing a signal handler that returns +control to the interrupted program after receiving the signal) +will allow the ZooKeeper C client code to detect the connection error +and report it upon return from the next Net::ZooKeeper method. + +=head2 Error Handling + +Net::ZooKeeper methods return different values in the case of an +error depending on their purpose and context. For example, +C returns true if the node exists and false otherwise, +which may indicate either that the node does not exist or that +an error occurred. + +After any method returns a false, empty, or undefined value which +might indicate an error has occurred, the C method +may be called to examine the specific error code, if any. + +If C returns C, no error has occurred. If the +error code is less than C, it indicates a normal error +condition reported by the ZooKeeper server, such as C +(node does not exist) or C (node already exists). + +If the error code is greater than C, then a connection +error or server error has occurred and the client should probably +close the connection by undefining the Net::ZooKeeper handle object +and, if necessary, attempt to create a new connection to the +ZooKeeper cluster. + +=head2 Access Control + +If the ZooKeeper cluster is not configured with C then +it will respect the access controls set for each node in the +ZooKeeper hierarchy. These access controls are defined using ACLs +(Access Control Lists); see the ZooKeeper documentation for compete +details. + +In Net::ZooKeeper, ACLs are represented as arrays of hashes, where +each hash is an ACL entry that must contain three attributes, +C, C, and C. The C attribute's value +should be composed by combining ACL permission flags using the +bitwise OR operator. See C<:acl_perms> for a list of the +available ACL permission flags. + +The ACL for a node may be read using the C method. A +node's ACL may be set when the node is created by passing an ACL +array as the value of the C<'acl'> option to the C method, +and may be updated by passing an ACL array to the C method. + +When a client connects to a ZooKeeper cluster it is automatically +assigned authentication credentials based on its IP address. +Additional authentication credentials may be added using +the C method. Once a credential has been added for +the current session, there is no way to disable it. + +As an example, digest authentication may be enabled for a session +by calling C as follows: + + $zkh->add_auth('digest', "$username:$password"); + +Note that the username and password are transmitted in cleartext +to the ZooKeeper cluster. + +Such authentication credentials would enable access to a node +whose ACL contained an entry with a C attribute of +C<'digest'> and an C attribute containing a Base64-encoded +SHA1 digest of the string C<"$username:$password">. The +Perl modules Digest and MIME::Base64 may be used to create +such ACL ID values as follows: + + use Digest qw(); + use MIME::Base64 qw(); + + my $ctx = Digest->new('SHA-1')->add("$username:$password"); + my $digest = MIME::Base64::encode($ctx->digest()); + +Note that using the C method of the Digest module +will not result in digest strings with the "=" suffix characters +required by ZooKeeper. + +=head2 Logging + +As of ZooKeeper version 3.1.1, logging in the C client code is +implemented with a single, shared file handle to which all +of the internal POSIX threads write log messages; by default, +this file handle is attached to STDERR. + +Moreover, this file handle is shared by all active ZooKeeper +connections (each of which has its own private IO and completion +threads; see L above). + +Net::ZooKeeper therefore does not provide per-connection handle +attributes related to logging. The global function +C may be used to set the current +log level. See C<:log_levels> for a list of the available log +levels. The default log level is C. + +To capture ZooKeeper log messages to a file instead of STDERR, +redirect STDERR to a new file handle in the normal Perl manner: + + open(OLDERR, '>&', fileno(STDERR)) or + die("unable to dup STDERR: $!"); + open(STDERR, '>', $log_file) or + die("unable to redirect STDERR: $!"); + +=head2 Connection Order + +ZooKeeper clusters are typically made up of an odd number of +ZooKeeper servers. When connecting to such a cluster, the +C method should be passed a comma-separated list of +the hostnames and ports for each of the servers in the cluster, +e.g., C<'host1:7000,host2:7000,host2:7100'>. + +The default behaviour of the ZooKeeper client code is to +reorder this list randomly before making any connections. +A connection is then made to the first server in the reordered +list. If that connection fails, the IO thread will +automatically attempt to reconnect to the cluster, this time +to the next server in the list; when the last server in the list +is reached, the IO thread will continue again with the first +server. + +For certain purposes it may be necessary for ZooKeeper clients +to know the exact order in which the IO thread will attempt to +connect to the servers of a cluster. To do so, call +C. Note, +however, that this will affect all Net::ZooKeeper object +handles created by the current process. + +=head1 ATTRIBUTES + +=head2 Net::ZooKeeper + +The Net::ZooKeeper class provides the main interface to the +ZooKeeper client API. The following attributes are available +for each Net::ZooKeeper handle object and are specific to +that handle and the method calls invoked on it. As with DBI +handle objects, attributes may be read and written through +a hash interface, e.g.: + + print sprintf("Session timeout is %.2f seconds.\n", + $zkh->{session_timeout} / 1000); + + $zkh->{watch_timeout} = 10000; + +=over 4 + +=item hosts + +The comma-separated list of ZooKeeper server hostnames and ports +as passed to the C method. Note that by default the +ZooKeeper C client code will reorder this list before attempting +to connect for the first time; see L for details. + +This attribute is B and may not be modified. + +=item session_timeout + +The session timeout value, in milliseconds, as set by the +ZooKeeper server after connection. This value may not be +exactly the same as what was requested in the C<'session_timeout'> +option of the C method; the server will adjust the +requested timeout value so that it is within a certain range +of the server's C setting. See the ZooKeeper +documentation for details. + +Because the actual connection to the ZooKeeper server is +not made during the C method call but shortly +thereafter by the IO thread, note that this value may not +be initialized to its final value until at least one +other method which requires communication with the server +(such as C) has succeeded. + +This attribute is B and may not be modified. + +=item session_id + +The client's session ID value as set by the ZooKeeper server +after connection. This is a binary data string which may +be passed to subsequent C calls as the value of +the C<'session_id'> option, if the user wishes to attempt to +continue a session after a failure. Note that the server +may not honour such an attempt. + +Because the actual connection to the ZooKeeper server is +not made during the C method call but shortly +thereafter by the IO thread, note that this value may not +be initialized to its final value until at least one +other method which requires communication with the server +(such as C) has succeeded. + +This attribute is B and may not be modified. + +=item data_read_len + +The maximum length of node data that will be returned to +the caller by the C method. If a node's data exceeds +this length, the returned value will be shorter than the +actual node data as stored in the ZooKeeper cluster. + +The default maximum length of the node data returned by +C is 1023 bytes. This may be changed by setting +the C attribute to a different value. + +Passing a value for the C<'data_read_len'> option when calling +the C method will temporarily override the per-handle +maximum. + +=item path_read_len + +The maximum length of a newly created node's path that will +be returned to the caller by the C method. If the path +of the newly created node exceeds this length, the returned +value will be shorter than the actual path of the node as stored +in the ZooKeeper cluster. + +The default maximum length of the node path returned by +C is 1023 bytes. This may be changed by setting +the C attribute to a different value. + +Passing a value for the C<'path_read_len'> option when calling +the C method will temporarily override the current +value of this attribute. + +=item watch_timeout + +The C attribute value, in milliseconds, inherited by +all watch objects (of class Net::ZooKeeper::Watch) created by +calls to the C method. When a watch object's +C method is invoked without a C<'timeout'> option, +it waits for an event notification from the ZooKeeper cluster +for no longer than the timeout period specified by the value of +the watch object's C attribute. + +The default C attribute value for all watch objects +created by the C method is 1 minute (60000 +milliseconds). This may be changed for a particular handle +object by setting this attribute to a different value; afterwards, +the new value will be inherited by any watch objects created +by the handle object's C method. Previously +created watch objects will not be affected. + +Passing a value for the C<'timeout'> option when calling +the C method will temporarily override the current +value of this attribute and cause the newly created watch object +to inherit a different value. + +See also the C method, and the C attribute +and C method of the Net::ZooKeeper::Watch class. + +=item pending_watches + +The number of internal ZooKeeper watches created for this handle +object that are still awaiting an event notification from the +ZooKeeper cluster. + +Note that this number may be different than the number of +extant watch objects created by the handle object's C +method, not only because some event notifications may have +occurred, but also if any watch objects have been reassigned +by reusing them in more than one call to any of the C, +C, or C methods. + +This attribute is B and may not be modified. + +=back + +=head2 Net::ZooKeeper::Stat + +The Net::ZooKeeper::Stat class provides a hash interface to +the individual pieces of information which together compose the +state of a given ZooKeeper node. Net::ZooKeeper::Stat objects +are created by calling the C method on a Net::ZooKeeper +handle object, and may then be passed to any methods which accept +a C<'stat'> option value, such as C. + +Net::ZooKeeper::Stat objects may be reused multiple times. +If the Net::ZooKeeper method to which the stat object is +passed succeeds, then the stat object is updated with the newly +retrieved node state information, and any state information +previously stored in the stat object is overwritten. + +All of the attributes of stat objects are B. + +=over 4 + +=item ctime + +The creation time of the node in milliseconds since the epoch. + +=item mtime + +The time of the last modification of the node's data in +milliseconds since the epoch. + +=item data_len + +The length of the node's data in bytes. + +=item num_children + +The number of child nodes beneath of the current node. + +=item ephemeral_owner + +If the node was created with the C flag, +this attribute holds the session ID of the ZooKeeper client +which created the node. If the node was not created with +the C flag, this attribute is set to zero. + +=item version + +The number of revisions of the node's data. The ZooKeeper +cluster will increment this version number whenever the +node's data is changed. When the node is first created this +version number is initialized to zero. + +=item acl_version + +The number of revisions of the node's ACL. The ZooKeeper +cluster will increment this version number whenever the +node's ACL is changed. When the node is first created this +version number is initialized to zero. + +=item children_version + +The number of revisions of the node's list of child nodes. +The ZooKeeper cluster will increment this version number +whenever the list of child nodes is changed. When the node +is first created this version number is initialized to zero. + +=item czxid + +The ZooKeeper transaction ID (ZXID) of the transaction which +created the node. + +=item mzxid + +The ZooKeeper transaction ID (ZXID) of the transaction which +last modified the node's data. This is initially set to +the same transaction ID as the C attribute by the +C method. + +=item children_zxid + +The ZooKeeper transaction ID (ZXID) of the transaction which +last modified the node's list of child nodes. This is +initially set to the same transaction ID as the C +attribute by the C method. + +=back + +=head2 Net::ZooKeeper::Watch + +The Net::ZooKeeper::Watch class provides a hash interface +to the data returned by event notifications from the ZooKeeper +cluster. Net::ZooKeeper::Watch objects are created by calling +the C method on a Net::ZooKeeper handle object, and +may then be passed to any methods which accept a C<'watch'> +option value, such as C. + +Net::ZooKeeper::Watch objects may be reused multiple times. +Regardless of whether the Net::ZooKeeper method to which the +watch object is passed succeeds, the watch object will be +updated to receive an event notification exclusively for the +node referenced in that method call. In the case of an error, +however, the watch object may never receive any event +notification. + +=over 4 + +=item timeout + +The default timeout value, in milliseconds, for all +invocations of the C method made on the watch object. +When the C method is invoked without a +C<'timeout'> option value, it waits for an +event notification from the ZooKeeper cluster for no longer +than the timeout period specified by this attribute. +This default timeout period may be altered by setting this +attribute to a different value. + +Passing a value for the C<'timeout'> option when calling +the C method will temporarily override the current +value of this attribute and cause the C method to +use a different timeout period. + +When a Net::ZooKeeper handle object's C method is +invoked without a C<'timeout'> option, it returns a newly +created watch object whose C attribute value +is initialized to the current value of the handle object's +C attribute. When the C method is invoked +with a C<'timeout'> option, the new watch object's C +attribute value is initialized to the value specified by +the C<'timeout'> option. + +See also the C method, and the C attribute +and C method of the Net::ZooKeeper class. + +=item event + +The type of event which triggered the notification, such +as C if the node's data was changed. +See C<:events> for a list of the possible event types. +If zero, no event notification has occurred yet. + +Note that the events which will trigger a notification +will depend on the Net::ZooKeeper method to which +the watch object was passed. Watches set through the +C and C methods will report events relating +to the node's data, while watches set through the +C method will report events relating to the +creation or deletion of child nodes of the watched node. + +This attribute is B and may not be modified. + +=item state + +The state of the Net::ZooKeeper connection at the time of +the event notification. See C<:states> for a list of +the possible connection states. If zero, no event +notification has occurred yet. + +This attribute is B and may not be modified. + +=back + +=head1 METHODS + +=head2 Net::ZooKeeper + +The following methods are defined for the Net::ZooKeeper class. + +=over 4 + +=item new() + + $zkh = Net::ZooKeeper->new('host1:7000,host2:7000'); + $zkh = Net::ZooKeeper->new('host1:7000,host2:7000', + 'session_timeout' => $session_timeout, + 'session_id' => $session_id); + +Creates a new Net::ZooKeeper handle object and attempts to +connect to the one of the servers of the given ZooKeeper +cluster. As described in the L and +L sections, the ZooKeeper client code will +create an IO thread which maintains the connection with a +regular "heartbeat" request. In the event of a connection error +the IO thread will also attempt to reconnect to another one of +the servers using the same session ID. In general, these actions +should be invisible to the user, although Net::ZooKeeper methods +may return transient errors while the IO thread +reconnects with another server. + +To disconnect, undefine the Net::ZooKeeper handle object +or call the C method. (After calling C +the handle object can not be reused.) + +The ZooKeeper client code will send a "heartbeat" message +if a third of the session timeout period has elapsed without +any communication with the ZooKeeper server. A specific +session timeout period may be requested when creating a +Net::ZooKeeper handle object by supplying a value, in +milliseconds, for the C<'session_timeout'> option. The +ZooKeeper server adjust the requested timeout value so that +it is within a certain range of the server's C setting; +the actual session timeout value will be available as the +value of the handle's C attribute after at +least one method call has succeeded. See the C +attribute for more information. + +If no C<'session_timeout'> option is provided, the default +value of 10 seconds (10000 milliseconds) will be used in the +initial connection request; again, the actual timeout period to +which the server agrees will be available subsequently as the +value of the C attribute. + +Upon successful connection (i.e., after the success of a method +which requires communication with the server), the C +attribute will hold a short binary string which represents the +client's session ID as set by the server. All ephemeral nodes +created by the session are identified by this ID in the +C attribute of any Net::ZooKeeper::Stat objects +used to query their state. + +The ZooKeeper client code will use this session ID internally +whenever it tries to reconnect to another server in the ZooKeeper +cluster after detecting a failed connection. If it successfully +reconnects with the same session ID, the session will continue +and ephemeral nodes belonging to it will not be deleted. + +However, if the server determines that the session has timed +out (for example because no "heartbeat" requests have been +received within the agreed-upon session timeout period), the +session will be terminated by the cluster and all ephemeral nodes +owned by the current session automatically deleted. + +On occasion the ZooKeeper client code may not be able to quickly +reconnect to a live server and the caller may want to destroy +the existing Net::ZooKeeper handle object and attempt a +fresh connection using the same session ID as before with a +new Net::ZooKeeper object. To do so, save the C +attribute value before undefining the old handle object +and then pass that binary string as the value of the +C<'session_id'> option to the C method when creating the +next handle object. After the successful completion of a +method which requires communication with the server, if the +new handle object's C attribute value matches the +old session ID then the session has been successfully maintained; +otherwise, the old session was expired by the cluster. + +=item get_error() + + $code = $zkh->get_error(); + +Returns the ZooKeeper error code, if any, from the most +recent Net::ZooKeeper method invocation. The returned value +will be zero (equivalent to C) if no error occurred, +otherwise non-zero. Non-zero values may be compared to +the error code names exported by the C<:errors> tagset. + +See L for more details. + +=item add_auth() + + $zkh->add_auth('digest', "$username:$password"); + +The C method may be used to add authentication +credentials to a session. Once a credential has been added for +the current session, there is no way to disable it. + +When using the digest authentication scheme, note that the +username and password are transmitted in cleartext +to the ZooKeeper cluster. + +See L for additional details. + +=item create() + + $path = $zkh->create($req_path, $data); + $path = $zkh->create($req_path, $data, + 'flags' => (ZOO_EPHEMERAL | ZOO_SEQUENCE), + 'acl' => ZOO_OPEN_ACL_UNSAFE, + 'path_read_len' => 100); + +Requests that a node be created in the ZooKeeper cluster's +hierarchy with the given path and data. Upon success, +the returns the node's path, otherwise undef. + +The path returned by a successful C method call +may not be the new node's full path as it appears in the +ZooKeeper hierarchy, depending on the length of the actual +path and the value of the handle object's C +attribute. If the length of the actual path exceeds the +current value of the C attribute, the path +returned by the C method will be truncated; note +that the node's path in the ZooKeeper hierarchy is not +affected by this truncation. + +Specifying a value for the C<'path_read_len'> option will +temporarily override the value of the C +attribute for the duration of the C method. + +The flag values available for use with the C<'flags'> option +are C and C; both are +included in the C<:flags> tagset. The flags should be +combined with the bitwise OR operator if more than one +is required. + +The C flag causes the node to be marked as +ephemeral, meaning it will be automatically deleted if it +still exists when the client's session ends. The +C flag causes a unique integer to be appended +to the node's final path component. See the ZooKeeper +documentation for additional advice on how to use these flags. + +When creating a node it may be important to define an ACL +for it; to do this, pass a reference to an ACL array (as +described in L) using the C<'acl'> option. +See also the C<:acl_perms> and C<:acls> tagsets for lists +of the available ACL permission flags and pre-defined ACLs. + +=item delete() + + $ret = $zkh->delete($path); + $ret = $zkh->delete($path, 'version' => $version); + +Requests that a node be deleted from the ZooKeeper hierarchy. +Returns true upon success, false otherwise. + +If a value for the C<'version'> option is supplied, the node +will only be deleted if its version number matches the given +value. See the C attribute of the Net::ZooKeeper::Stat +class for details on node version numbering. + +=item exists() + + $ret = $zkh->exists($path); + $ret = $zkh->exists($path, 'stat' => $stat, 'watch' => $watch); + +Tests whether a given node exists. Returns true if the node +exists, otherwise false. When the C method is successful +but the node does not exist, it returns false, and C +will return C until another method is called on the +handle object. + +The C<'stat'> option may be used to request that a +Net::ZooKeeper::Stat object be updated with the node's +current state information. The stat object will only be +updated if the node exists and the C method +succeeds. The stat object must first have been created +using the C method. + +The C<'watch'> option may be used to request that a +Net::ZooKeeper::Watch object be assigned to receive +notification of an event which alters the node's data. +The watch object must first have been created using the +C method. If the watch object was previously +assigned to receive notifications for another node, it +will be reassigned even if the C method fails. + +=item get_children() + + @child_names = $zkh->get_children($path); + $num_children = $zkh->get_children($path, 'watch' => $watch); + +Queries the names or number of the child nodes stored beneath +a given node in the ZooKeeper hierarchy. In a list context, +returns a list of the child nodes' names upon success, otherwise +an empty list. When the C method is successful +but there are no child nodes, it returns an empty list, and +C will return C until another method is called +on the handle object. + +In a scalar context, C returns the number +of child nodes upon success, otherwise undef. + +The names of the child nodes are simply the final component +of the nodes' paths, i.e., the portion of their path which +follows the path of the given parent node, excluding the +"/" delimiter. + +The C<'watch'> option may be used to request that a +Net::ZooKeeper::Watch object be assigned to receive +notification of an event which alters the node's list of +child nodes. The watch object must first have been created +using the C method. If the watch object was +previously assigned to receive notifications for another node, +it will be reassigned even if the C method fails. + +=item get() + + $data = $zkh->get($path); + $data = $zkh->get($path, 'data_read_len' => 100, + 'stat' => $stat, 'watch' => $watch); + +Queries the data stored in a given node. Returns the +data as a string upon success, otherwise undef. Note +that the data may contain nulls if the node's data is +not a text string. + +If the length of the node's data exceeds the current value +of the handle object's C attribute, the +string returned by the C method will be truncated; +note that the node's data in the ZooKeeper cluster is not +affected by this truncation. + +Specifying a value for the C<'data_read_len'> option will +temporarily override the value of the C +attribute for the duration of the C method. + +The C<'stat'> option may be used to request that a +Net::ZooKeeper::Stat object be updated with the node's +current state information. The stat object will only be +updated if the C method succeeds. The stat object +must first have been created using the C method. + +The C<'watch'> option may be used to request that a +Net::ZooKeeper::Watch object be assigned to receive +notification of an event which alters the node's data. +The watch object must first have been created using the +C method. If the watch object was previously +assigned to receive notifications for another node, it +will be reassigned even if the C method fails. + +=item set() + + $ret = $zkh->set($path, $data); + $ret = $zkh->set($path, $data, 'version' => $version, + 'stat' => $stat); + +Requests that a node's data be updated in the ZooKeeper +hierarchy. Returns true upon success, false otherwise. + +If a value for the C<'version'> option is supplied, the node's +data will only be updated if its version number matches the +given value. See the C attribute of the +Net::ZooKeeper::Stat class for details on node version numbering. + +The C<'stat'> option may be used to request that a +Net::ZooKeeper::Stat object be updated with the node's +current state information. The stat object will only be +updated if the C method succeeds. The stat object +must first have been created using the C method. + +=item get_acl() + + @acl = $zkh->get_acl($path); + $num_acl_entries = $zkh->get_acl($path, 'stat' => $stat); + +Queries the ACL associated with a node in the ZooKeeper +hierarchy, if any. In a list context, returns an array with +the node's ACL entries upon success, otherwise +an empty list. When the C method is successful +but there are no ACL entries, it returns an empty list, and +C will return C until another method is called +on the handle object. + +The elements of the returned array are hashes, each of which +represents one ACL entry. Each hash contains C, +C, and C elements. See the L +section for additional details, and the +C<:acl_perms> and C<:acls> tagsets for lists of the +available ACL permission flags and pre-defined ACLs. + +In a scalar context, C returns the number +of ACL entries upon success, otherwise undef. + +The C<'stat'> option may be used to request that a +Net::ZooKeeper::Stat object be updated with the node's +current state information. The stat object will only be +updated if the C method succeeds. The stat object +must first have been created using the C method. + +=item set_acl() + + $acl = [{ + 'perms' => (ZOO_PERM_READ | ZOO_PERM_WRITE), + 'scheme' => 'digest', + 'id' => "$username:$digest" + }]; + $ret = $zkh->set_acl($path, $acl); + $ret = $zkh->set_acl($path, ZOO_OPEN_ACL_UNSAFE, + 'version' => $version); + +Requests that a node's ACL be updated in the ZooKeeper +hierarchy. Returns true upon success, false otherwise. + +The ACL should be passed as a reference to an array of +hashes, where each hash represents one ACL entry. Each +hash should contain C, C, and C elements +as described in the L section. +See also the C<:acl_perms> and C<:acls> tagsets for lists +of the available ACL permission flags and pre-defined ACLs. + +If a value for the C<'version'> option is supplied, the node's +ACL will only be updated if its version number matches the +given value. See the C attribute of the +Net::ZooKeeper::Stat class for details on node version numbering. + +=item stat() + + $stat = $zkh->stat(); + +Creates a new Net::ZooKeeper::Stat object which may be used +with the C<'stat'> option of the C, C, +C, and C methods. When the stat object +is passed to any of these methods, upon success its attribute +values are updated to reflect the current state of the +node specified in the method call. The stat object is not +updated if the method call does not succeed. + +=item watch() + + $watch = $zkh->watch(); + $watch = $zkh->watch('timeout' => $timeout); + +Creates a new Net::ZooKeeper::Watch object which may be +used to wait for event notifications from the ZooKeeper +cluster. Each time the watch object is passed to any +of the C, C, or C methods, +its attribute values are immediately reset to zero, and will +later be updated upon receipt of an appropriate event +notification for the node specified in the method call. + +The specific types of events which cause notifications to be +sent by the ZooKeeper cluster depend on the method call used. +After use with the C and C methods, the +watch object will be set to receive an event notification +caused by a modification of the node's data or the node itself +(e.g., deletion of the node). After use with the +C method, the watch object will be set to +receive an event notification caused by a modification +of the node's list of child nodes. + +Watch objects receive at most one event notification after +their assignment to a node by one of the C, +C, or C methods. Note that in the +case of an error, the watch object may never receive any +event notification. However, when the parent Net::ZooKeeper +handle object experiences a connection error, the ZooKeeper +client code will notify all pending watches with an event of +type C. See C for more information +regarding the watch object's attribute values after a +connection error. + +A watch object may be reused with another C, +C, or C method call at any time, +in which case the watch object's attribute values +are reset to zero and the watch object will no longer be updated +by any event notification relevant to the previous method call. + +When the C method is invoked without a C<'timeout'> +option, it returns a newly created watch object whose C +attribute value is initialized to the current value of the +Net::ZooKeeper handle object's C attribute. +Otherwise, when the C method is invoked with a +C<'timeout'> option, the new watch object's C attribute +value is initialized to the value specified by the +C<'timeout'> option. + +See also the C attribute, and the C +attribute and C method of the Net::ZooKeeper::Watch +class. + +=back + +=head2 Net::ZooKeeper::Stat + +No methods are defined for the Net::ZooKeeper::Stat class. + +=head2 Net::ZooKeeper::Watch + +Only one method is defined for the Net::ZooKeeper::Watch class. + +=over 4 + +=item wait() + + $ret = $watch->wait(); + $ret = $watch->wait('timeout' => $timeout); + +Waits for an event notification from the ZooKeeper cluster +for the node most recently associated with the watch object. +Nodes are associated with a watch object by passing the +watch object as the value of a C<'watch'> option to a +Net::ZooKeeper method; methods which accept a C<'watch'> option +are C, C, and C. + +When the C method is invoked with a C<'timeout'> +option, it waits for no more than the number of milliseconds +specified by the C<'timeout'> option. +Otherwise, when the C method is invoked without a +C<'timeout'> option, it waits for no more than the timeout +period specified by the value of the watch object's C +attribute. + +The C method returns true if an event notification +was received, otherwise false. When C returns true, +the C and C attributes of the watch object +will be updated with the event's type and the current +connection state. + +When the parent Net::ZooKeeper handle object experiences a +connection error, the ZooKeeper client code will notify all +pending watches with an event of type C. +In this case, the C attribute will report the current +state of the connection to the ZooKeeper cluster. + +See also the C attribute, and the C method +and C attribute of the Net::ZooKeeper class. + +=back + +=head1 FUNCTIONS + +The following functions have global scope and affect all +Net::ZooKeeper handle objects. + +=over 4 + +=item set_log_level() + + Net::ZooKeeper::set_log_level($level); + +The C function may be called to +alter the number and type of messages written to the current log +file handle (if any). The default value is C +which disables all logging. + +See the L section for more details and C<:log_levels> +for a list of the available log levels. + +=item set_deterministic_conn_order() + + Net::ZooKeeper::set_deterministic_conn_order(1); + +The C function +may be called to indicate whether or not the list of ZooKeeper +servers passed to the C method should be randomly permuted. +If set to a true value, the list of servers will not be altered. +The default false value indicates the list of servers will +be randomly reordered prior to connection. + +See the L section for more details. + +=back + +=head1 EXPORTS + +Nothing is exported by default. Various tagsets exist which +group the tags available for export into different categories: + +=over 4 + +=item :errors + +ZooKeeper error codes. These may be compared to the values +returned by the C method. + +=item :node_flags + +The ZooKeeper node flags C and C, +which may be passed in the C<'flags'> option to the C +method. When more than node flag is required they +should be combined using the bitwise OR operator. + +=item :acl_perms + +The ZooKeeper ACL permission flags which may be used in +the value of the C attribute of an ACL entry hash. +When more than one ACL permission flag is required they +should be combined using the bitwise OR operator. + +The available ACL permission flags are C, +C, C, C, +and C. For convenience, C is +defined as the bitwise OR of all of these flags. + +=item :acls + +Common ZooKeeper ACLs which may be useful. C +specifies a node which is entirely open to all users with no +restrictions at all. C specifies +a node which is readable by all users; permissions for other actions +are not defined in this ACL. C specifies a node +for which all actions require the same authentication credentials as +held by the session which created the node; this implies that a +session should authenticate with an appropriate scheme before +creating a node with this ACL. + +=item :events + +The ZooKeeper event types which are returned in value of +the C attribute a Net::ZooKeeper::Watch object after +an event occurs on a watched node. + +=item :states + +The ZooKeeper connection states which are returned in value of +the C attribute of a Net::ZooKeeper::Watch object after +an event occurs on a watched node. + +=item :log_levels + +The ZooKeeper log levels which may be passed to the +C function. The available +log levels are, from least to most verbose, C +(the default), C, C, +C, and C. + +=item :all + +Everything from all of the above tagsets. + +=back + +=head1 SEE ALSO + +The Apache ZooKeeper project's home page at +L provides a wealth of detail +on how to develop applications using ZooKeeper. + +=head1 AUTHOR + +Chris Darroch, Echrisd@apache.orgE + +=head1 COPYRIGHT AND LICENSE + +Licensed to the Apache Software Foundation (ASF) under one +or more contributor license agreements. See the NOTICE file +distributed with this work for additional information +regarding copyright ownership. The ASF licenses this file +to you 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. + +=cut + diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/zkperl/ZooKeeper.xs b/pkg/registry/zookeeper-3.4.6/src/contrib/zkperl/ZooKeeper.xs new file mode 100644 index 000000000..2b475e1e5 --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/contrib/zkperl/ZooKeeper.xs @@ -0,0 +1,2669 @@ +/* Net::ZooKeeper - Perl extension for Apache ZooKeeper + * + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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. + */ + +#define PERL_NO_GET_CONTEXT + +#include "EXTERN.h" +#include "perl.h" +#include "XSUB.h" + +#include /* pthread_mutex_lock(), etc. */ +#include /* memset(), etc. */ +#include /* CHAR_BIT */ +#include /* gettimeofday() */ + +#include + +#include "build/check_zk_version.h" + + +#define PACKAGE_NAME "Net::ZooKeeper" +#define PACKAGE_SIGNATURE 19631123 + +#define STAT_PACKAGE_NAME "Net::ZooKeeper::Stat" +#define STAT_PACKAGE_SIGNATURE 19960512 + +#define WATCH_PACKAGE_NAME "Net::ZooKeeper::Watch" +#define WATCH_PACKAGE_SIGNATURE 20050326 + +#define MAX_KEY_NAME_LEN 16 /* "children_version" */ + +#define NUM_ACL_ENTRY_KEYS 3 +#define NUM_KEYS 7 +#define NUM_STAT_KEYS 11 +#define NUM_WATCH_KEYS 3 + +#define DEFAULT_RECV_TIMEOUT_MSEC 10000 + +#define DEFAULT_DATA_BUF_LEN 1023 +#define DEFAULT_PATH_BUF_LEN 1023 +#define DEFAULT_WATCH_TIMEOUT 60000 + +#define ZOO_LOG_LEVEL_OFF 0 + +#ifndef strcaseEQ +#define strcaseEQ(a,b) (!strcasecmp((a),(b))) +#endif + + +typedef struct Stat zk_stat_t; + +typedef HV* Net__ZooKeeper__Stat; + +typedef struct zk_watch_t zk_watch_t; + +struct zk_watch_t { + pthread_mutex_t mutex; + pthread_cond_t cond; + int done; + int ret; + int event_type; + int event_state; + unsigned int timeout; + zk_watch_t *prev; + zk_watch_t *next; + int ref_count; +}; + +typedef HV* Net__ZooKeeper__Watch; + +typedef struct { + zhandle_t *handle; + zk_watch_t *first_watch; + int data_buf_len; + int path_buf_len; + unsigned int watch_timeout; + const char *hosts; + int hosts_len; + int last_ret; + int last_errno; +} zk_t; + +typedef HV* Net__ZooKeeper; + +typedef struct { + I32 signature; + union { + zk_t *zk; + zk_stat_t *stat; + zk_watch_t *watch; + } handle; +} zk_handle_t; + +typedef struct { + const char name[MAX_KEY_NAME_LEN + 1]; + U32 name_len; + size_t offset; + size_t size; + U32 hash; +} zk_key_t; + + +static zk_key_t zk_acl_entry_keys[NUM_ACL_ENTRY_KEYS] = { + {"perms", 0, 0, 0, 0}, + {"scheme", 0, 0, 0, 0}, + {"id", 0, 0, 0, 0} +}; + +static zk_key_t zk_keys[NUM_KEYS] = { + {"data_read_len", 0, 0, 0, 0}, + {"path_read_len", 0, 0, 0, 0}, + {"watch_timeout", 0, 0, 0, 0}, + {"hosts", 0, 0, 0, 0}, + {"session_timeout", 0, 0, 0, 0}, + {"session_id", 0, 0, 0, 0}, + {"pending_watches", 0, 0, 0, 0} +}; + +static zk_key_t zk_stat_keys[NUM_STAT_KEYS] = { + {"czxid", 0, offsetof(struct Stat, czxid), + sizeof(((struct Stat*) 0)->czxid), 0}, + {"mzxid", 0, offsetof(struct Stat, mzxid), + sizeof(((struct Stat*) 0)->mzxid), 0}, + {"ctime", 0, offsetof(struct Stat, ctime), + sizeof(((struct Stat*) 0)->ctime), 0}, + {"mtime", 0, offsetof(struct Stat, mtime), + sizeof(((struct Stat*) 0)->mtime), 0}, + {"version", 0, offsetof(struct Stat, version), + sizeof(((struct Stat*) 0)->version), 0}, + {"children_version", 0, offsetof(struct Stat, cversion), + sizeof(((struct Stat*) 0)->cversion), 0}, + {"acl_version", 0, offsetof(struct Stat, aversion), + sizeof(((struct Stat*) 0)->aversion), 0}, + {"ephemeral_owner", 0, offsetof(struct Stat, ephemeralOwner), + sizeof(((struct Stat*) 0)->ephemeralOwner), 0}, + {"data_len", 0, offsetof(struct Stat, dataLength), + sizeof(((struct Stat*) 0)->dataLength), 0}, + {"num_children", 0, offsetof(struct Stat, numChildren), + sizeof(((struct Stat*) 0)->numChildren), 0}, + {"children_zxid", 0, offsetof(struct Stat, pzxid), + sizeof(((struct Stat*) 0)->pzxid), 0} +}; + +static zk_key_t zk_watch_keys[NUM_WATCH_KEYS] = { + {"timeout", 0, 0, 0, 0}, + {"event", 0, 0, 0, 0}, + {"state", 0, 0, 0, 0} +}; + + +static void _zk_watcher(zhandle_t *handle, int type, int state, + const char *path, void *context) +{ + zk_watch_t *watch_ctx = context; + + pthread_mutex_lock(&watch_ctx->mutex); + + watch_ctx->event_type = type; + watch_ctx->event_state = state; + + watch_ctx->done = 1; + + pthread_cond_signal(&watch_ctx->cond); + pthread_mutex_unlock(&watch_ctx->mutex); + + return; +} + +static void _zk_auth_completion(int ret, const void *data) +{ + zk_watch_t *watch_ctx = (zk_watch_t*) data; + + pthread_mutex_lock(&watch_ctx->mutex); + + watch_ctx->ret = ret; + + watch_ctx->done = 1; + + pthread_cond_signal(&watch_ctx->cond); + pthread_mutex_unlock(&watch_ctx->mutex); + + return; +} + +static zk_watch_t *_zk_create_watch(pTHX) +{ + zk_watch_t *watch; + + Newxz(watch, 1, zk_watch_t); + + if (pthread_mutex_init(&watch->mutex, NULL)) { + int save_errno = errno; + + Safefree(watch); + + errno = save_errno; + return NULL; + } + + if (pthread_cond_init(&watch->cond, NULL)) { + int save_errno = errno; + + pthread_mutex_destroy(&watch->mutex); + Safefree(watch); + + errno = save_errno; + return NULL; + } + + return watch; +} + +static void _zk_destroy_watch(pTHX_ zk_watch_t *watch) +{ + pthread_cond_destroy(&watch->cond); + pthread_mutex_destroy(&watch->mutex); + + Safefree(watch); + + return; +} + +static zk_watch_t *_zk_acquire_watch(pTHX) +{ + zk_watch_t *watch = _zk_create_watch(aTHX); + + if (watch) { + watch->ref_count = 1; + } + + return watch; +} + +static void _zk_release_watch(pTHX_ zk_watch_t *watch, int list) +{ + if (list) { + if (watch->prev) { + watch->prev->next = watch->next; + } + if (watch->next) { + watch->next->prev = watch->prev; + } + watch->prev = NULL; + watch->next = NULL; + } + + if (--watch->ref_count == 0) { + _zk_destroy_watch(aTHX_ watch); + } + + return; +} + +static unsigned int _zk_release_watches(pTHX_ zk_watch_t *first_watch, + int final) +{ + zk_watch_t *watch = first_watch->next; + unsigned int pending_watches = 0; + + while (watch) { + zk_watch_t *next_watch = watch->next; + int done = final; + + if (!final) { + pthread_mutex_lock(&watch->mutex); + done = watch->done; + pthread_mutex_unlock(&watch->mutex); + } + + if (done) { + _zk_release_watch(aTHX_ watch, 1); + } + else { + ++pending_watches; + } + + watch = next_watch; + } + + return pending_watches; +} + +static void _zk_replace_watch(pTHX_ zk_handle_t *handle, + zk_watch_t *first_watch, + zk_watch_t *old_watch, zk_watch_t *new_watch) +{ + zk_watch_t *next_watch; + + new_watch->timeout = old_watch->timeout; + + _zk_release_watch(aTHX_ old_watch, 0); + + /* cleanup any completed watches not tied to a handle */ + _zk_release_watches(aTHX_ first_watch, 0); + + next_watch = first_watch->next; + + new_watch->prev = first_watch; + new_watch->next = next_watch; + + if (next_watch) { + next_watch->prev = new_watch; + } + + first_watch->next = new_watch; + + ++new_watch->ref_count; + + handle->handle.watch = new_watch; + + return; +} + +static void _zk_free_acl(pTHX_ struct ACL_vector *acl) +{ + if (acl->data) { + Safefree(acl->data); + } + + return; +} + +static const char *_zk_fill_acl(pTHX_ AV *acl_arr, struct ACL_vector *acl) +{ + I32 num_acl_entries = av_len(acl_arr) + 1; + int i; + + Zero(acl, 1, struct ACL_vector); + + if (num_acl_entries <= 0) { + return NULL; + } + else if (num_acl_entries > PERL_INT_MAX) { + num_acl_entries = PERL_INT_MAX; + } + + Newx(acl->data, num_acl_entries, struct ACL); + + for (i = 0; i < num_acl_entries; ++i) { + SV **acl_entry_ptr; + HV *acl_entry_hash; + zk_key_t *key; + SV **val_ptr; + struct ACL acl_entry; + + acl_entry_ptr = av_fetch(acl_arr, i, 0); + + if (!acl_entry_ptr) { + continue; + } + + if (!SvROK(*acl_entry_ptr) || + SvTYPE(SvRV(*acl_entry_ptr)) != SVt_PVHV) { + _zk_free_acl(aTHX_ acl); + + return "invalid ACL entry hash reference"; + } + + acl_entry_hash = (HV*) SvRV(*acl_entry_ptr); + + key = &zk_acl_entry_keys[0]; + val_ptr = hv_fetch(acl_entry_hash, key->name, key->name_len, 0); + + if (!val_ptr) { + _zk_free_acl(aTHX_ acl); + + return "no ACL entry perms element"; + } + + acl_entry.perms = SvIV(*val_ptr); + + if (!acl_entry.perms || (acl_entry.perms & ~ZOO_PERM_ALL)) { + _zk_free_acl(aTHX_ acl); + + return "invalid ACL entry perms"; + } + + key = &zk_acl_entry_keys[1]; + val_ptr = hv_fetch(acl_entry_hash, key->name, key->name_len, 0); + + if (!val_ptr) { + _zk_free_acl(aTHX_ acl); + + return "no ACL entry scheme element"; + } + + acl_entry.id.scheme = SvPV_nolen(*val_ptr); + + key = &zk_acl_entry_keys[2]; + val_ptr = hv_fetch(acl_entry_hash, key->name, key->name_len, 0); + + if (!val_ptr) { + _zk_free_acl(aTHX_ acl); + + return "no ACL entry id element"; + } + + acl_entry.id.id = SvPV_nolen(*val_ptr); + + ++acl->count; + acl->data[i] = acl_entry; + } + + return NULL; +} + +static void _zk_fill_acl_entry_hash(pTHX_ struct ACL *acl_entry, + HV *acl_entry_hash) +{ + zk_key_t *key; + SV *val; + + key = &zk_acl_entry_keys[0]; + val = newSViv(acl_entry->perms); + + if (!hv_store(acl_entry_hash, key->name, key->name_len, val, key->hash)) { + SvREFCNT_dec(val); + } + + key = &zk_acl_entry_keys[1]; + val = newSVpv(acl_entry->id.scheme, 0); + + if (!hv_store(acl_entry_hash, key->name, key->name_len, val, key->hash)) { + SvREFCNT_dec(val); + } + + key = &zk_acl_entry_keys[2]; + val = newSVpv(acl_entry->id.id, 0); + + if (!hv_store(acl_entry_hash, key->name, key->name_len, val, key->hash)) { + SvREFCNT_dec(val); + } + + return; +} + +static zk_handle_t *_zk_check_handle_inner(pTHX_ HV *attr_hash, + I32 package_signature) +{ + zk_handle_t *handle = NULL; + + if (SvRMAGICAL(attr_hash)) { + MAGIC *magic = mg_find((SV*) attr_hash, PERL_MAGIC_ext); + + if (magic) { + handle = (zk_handle_t*) magic->mg_ptr; + + if (handle->signature != package_signature) { + handle = NULL; + } + } + } + + return handle; +} + +static zk_handle_t *_zk_check_handle_outer(pTHX_ HV *hash, HV **attr_hash_ptr, + const char *package_name, + I32 package_signature) +{ + zk_handle_t *handle = NULL; + + if (attr_hash_ptr) { + *attr_hash_ptr = NULL; + } + + if (SvRMAGICAL((SV*) hash)) { + MAGIC *magic = mg_find((SV*) hash, PERL_MAGIC_tied); + + if (magic) { + SV *attr = magic->mg_obj; + + if (SvROK(attr) && SvTYPE(SvRV(attr)) == SVt_PVHV && + sv_derived_from(attr, package_name)) { + HV *attr_hash = (HV*) SvRV(attr); + + handle = _zk_check_handle_inner(aTHX_ attr_hash, + package_signature); + + if (handle && attr_hash_ptr) { + *attr_hash_ptr = attr_hash; + } + } + } + } + + return handle; +} + +static zk_t *_zk_get_handle_inner(pTHX_ Net__ZooKeeper attr_hash) +{ + zk_handle_t *handle; + + handle = _zk_check_handle_inner(aTHX_ attr_hash, PACKAGE_SIGNATURE); + + return handle ? handle->handle.zk : NULL; +} + +static zk_t *_zk_get_handle_outer(pTHX_ Net__ZooKeeper zkh) +{ + zk_handle_t *handle; + + handle = _zk_check_handle_outer(aTHX_ zkh, NULL, PACKAGE_NAME, + PACKAGE_SIGNATURE); + + return handle ? handle->handle.zk : NULL; +} + +static zk_stat_t *_zks_get_handle_inner(pTHX_ Net__ZooKeeper__Stat attr_hash) +{ + zk_handle_t *handle; + + handle = _zk_check_handle_inner(aTHX_ attr_hash, STAT_PACKAGE_SIGNATURE); + + return handle ? handle->handle.stat : NULL; +} + +static zk_stat_t *_zks_get_handle_outer(pTHX_ Net__ZooKeeper__Stat zksh) +{ + zk_handle_t *handle; + + handle = _zk_check_handle_outer(aTHX_ zksh, NULL, STAT_PACKAGE_NAME, + STAT_PACKAGE_SIGNATURE); + + return handle ? handle->handle.stat : NULL; +} + +static zk_watch_t *_zkw_get_handle_inner(pTHX_ Net__ZooKeeper__Watch attr_hash) +{ + zk_handle_t *handle; + + handle = _zk_check_handle_inner(aTHX_ attr_hash, WATCH_PACKAGE_SIGNATURE); + + return handle ? handle->handle.watch : NULL; +} + +static zk_watch_t *_zkw_get_handle_outer(pTHX_ Net__ZooKeeper__Watch zkwh, + zk_handle_t **handle_ptr) +{ + zk_handle_t *handle; + + handle = _zk_check_handle_outer(aTHX_ zkwh, NULL, WATCH_PACKAGE_NAME, + WATCH_PACKAGE_SIGNATURE); + + if (handle_ptr) { + *handle_ptr = handle; + } + + return handle ? handle->handle.watch : NULL; +} + + +MODULE = Net::ZooKeeper PACKAGE = Net::ZooKeeper PREFIX = zk_ + +REQUIRE: 1.9508 + +PROTOTYPES: ENABLE + +BOOT: +{ + int i; + + for (i = 0; i < NUM_ACL_ENTRY_KEYS; ++i) { + zk_key_t *key = &zk_acl_entry_keys[i]; + + key->name_len = strlen(key->name); + PERL_HASH(key->hash, key->name, key->name_len); + } + + for (i = 0; i < NUM_KEYS; ++i) { + zk_keys[i].name_len = strlen(zk_keys[i].name); + } + + for (i = 0; i < NUM_STAT_KEYS; ++i) { + zk_stat_keys[i].name_len = strlen(zk_stat_keys[i].name); + } + + for (i = 0; i < NUM_WATCH_KEYS; ++i) { + zk_watch_keys[i].name_len = strlen(zk_watch_keys[i].name); + } + + zoo_set_log_stream(NULL); + zoo_set_debug_level(0); +} + + +I32 +zk_constant(alias=Nullch) + char *alias + ALIAS: + ZOK = ZOK + ZSYSTEMERROR = ZSYSTEMERROR + ZRUNTIMEINCONSISTENCY = ZRUNTIMEINCONSISTENCY + ZDATAINCONSISTENCY = ZDATAINCONSISTENCY + ZCONNECTIONLOSS = ZCONNECTIONLOSS + ZMARSHALLINGERROR = ZMARSHALLINGERROR + ZUNIMPLEMENTED = ZUNIMPLEMENTED + ZOPERATIONTIMEOUT = ZOPERATIONTIMEOUT + ZBADARGUMENTS = ZBADARGUMENTS + ZINVALIDSTATE = ZINVALIDSTATE + ZAPIERROR = ZAPIERROR + ZNONODE = ZNONODE + ZNOAUTH = ZNOAUTH + ZBADVERSION = ZBADVERSION + ZNOCHILDRENFOREPHEMERALS = ZNOCHILDRENFOREPHEMERALS + ZNODEEXISTS = ZNODEEXISTS + ZNOTEMPTY = ZNOTEMPTY + ZSESSIONEXPIRED = ZSESSIONEXPIRED + ZINVALIDCALLBACK = ZINVALIDCALLBACK + ZINVALIDACL = ZINVALIDACL + ZAUTHFAILED = ZAUTHFAILED + ZCLOSING = ZCLOSING + ZNOTHING = ZNOTHING + + ZOO_EPHEMERAL = ZOO_EPHEMERAL + ZOO_SEQUENCE = ZOO_SEQUENCE + + ZOO_PERM_READ = ZOO_PERM_READ + ZOO_PERM_WRITE = ZOO_PERM_WRITE + ZOO_PERM_CREATE = ZOO_PERM_CREATE + ZOO_PERM_DELETE = ZOO_PERM_DELETE + ZOO_PERM_ADMIN = ZOO_PERM_ADMIN + ZOO_PERM_ALL = ZOO_PERM_ALL + + ZOO_CREATED_EVENT = ZOO_CREATED_EVENT + ZOO_DELETED_EVENT = ZOO_DELETED_EVENT + ZOO_CHANGED_EVENT = ZOO_CHANGED_EVENT + ZOO_CHILD_EVENT = ZOO_CHILD_EVENT + ZOO_SESSION_EVENT = ZOO_SESSION_EVENT + ZOO_NOTWATCHING_EVENT = ZOO_NOTWATCHING_EVENT + + ZOO_EXPIRED_SESSION_STATE = ZOO_EXPIRED_SESSION_STATE + ZOO_AUTH_FAILED_STATE = ZOO_AUTH_FAILED_STATE + ZOO_CONNECTING_STATE = ZOO_CONNECTING_STATE + ZOO_ASSOCIATING_STATE = ZOO_ASSOCIATING_STATE + ZOO_CONNECTED_STATE = ZOO_CONNECTED_STATE + + ZOO_LOG_LEVEL_OFF = ZOO_LOG_LEVEL_OFF + ZOO_LOG_LEVEL_ERROR = ZOO_LOG_LEVEL_ERROR + ZOO_LOG_LEVEL_WARN = ZOO_LOG_LEVEL_WARN + ZOO_LOG_LEVEL_INFO = ZOO_LOG_LEVEL_INFO + ZOO_LOG_LEVEL_DEBUG = ZOO_LOG_LEVEL_DEBUG + CODE: + if (!ix) { + if (!alias) { + alias = GvNAME(CvGV(cv)); + } + + if (strEQ(alias, "ZOK")) { + RETVAL = ZOK; + } + else if (strEQ(alias, "ZOO_LOG_LEVEL_OFF")) { + RETVAL = ZOO_LOG_LEVEL_OFF; + } + else { + Perl_croak(aTHX_ "unknown " PACKAGE_NAME " constant: %s", + alias); + } + } + else { + RETVAL = ix; + } + OUTPUT: + RETVAL + + +AV * +zk_acl_constant(alias=Nullch) + char *alias + ALIAS: + ZOO_OPEN_ACL_UNSAFE = 1 + ZOO_READ_ACL_UNSAFE = 2 + ZOO_CREATOR_ALL_ACL = 3 + PREINIT: + struct ACL_vector acl; + AV *acl_arr; + int i; + PPCODE: + if (!ix && !alias) { + alias = GvNAME(CvGV(cv)); + } + + if (ix == 1 || (alias != NULL && strEQ(alias, "ZOO_OPEN_ACL_UNSAFE"))) { + acl = ZOO_OPEN_ACL_UNSAFE; + } + else if (ix == 2 || (alias != NULL && strEQ(alias, "ZOO_READ_ACL_UNSAFE"))) { + acl = ZOO_READ_ACL_UNSAFE; + } + else if (ix == 3 || (alias != NULL && strEQ(alias, "ZOO_CREATOR_ALL_ACL"))) { + acl = ZOO_CREATOR_ALL_ACL; + } + else { + Perl_croak(aTHX_ "unknown " PACKAGE_NAME " constant: %s", alias); + } + + acl_arr = newAV(); + + av_extend(acl_arr, acl.count); + + for (i = 0; i < acl.count; ++i) { + HV *acl_entry_hash = newHV(); + SV *val; + + _zk_fill_acl_entry_hash(aTHX_ &acl.data[i], acl_entry_hash); + + val = newRV_noinc((SV*) acl_entry_hash); + + if (!av_store(acl_arr, i, val)) { + SvREFCNT_dec(val); + } + } + + ST(0) = sv_2mortal(newRV_noinc((SV*) acl_arr)); + + XSRETURN(1); + + +void +zk_set_log_level(level) + int level + PPCODE: + if (level < ZOO_LOG_LEVEL_OFF || level > ZOO_LOG_LEVEL_DEBUG) { + Perl_croak(aTHX_ "invalid log level: %d", level); + } + + zoo_set_debug_level(level); + + XSRETURN_EMPTY; + + +void +zk_set_deterministic_conn_order(flag) + bool flag + PPCODE: + zoo_deterministic_conn_order(!!flag); + + XSRETURN_EMPTY; + + +void +zk_new(package, hosts, ...) + char *package + char *hosts + PREINIT: + int recv_timeout = DEFAULT_RECV_TIMEOUT_MSEC; + const clientid_t *client_id = NULL; + zk_t *zk; + zk_handle_t *handle; + HV *stash, *zk_hash, *attr_hash; + SV *attr; + int i; + PPCODE: + if (items > 2 && items % 2) { + Perl_croak(aTHX_ "invalid number of arguments"); + } + + for (i = 2; i < items; i += 2) { + char *key = SvPV_nolen(ST(i)); + + if (strcaseEQ(key, "session_timeout")) { + recv_timeout = SvIV(ST(i + 1)); + + /* NOTE: would be nice if requirement in zookeeper_interest() + * that recv_timeout*2 be non-negative was documented + */ + if (recv_timeout < 0 || recv_timeout > (PERL_INT_MAX >> 1)) { + Perl_croak(aTHX_ "invalid session timeout: %d", + recv_timeout); + } + } + else if (strcaseEQ(key, "session_id")) { + STRLEN client_id_len; + + client_id = (const clientid_t*) SvPV(ST(i + 1), client_id_len); + + if (client_id_len != sizeof(clientid_t)) { + Perl_croak(aTHX_ "invalid session ID"); + } + } + } + + Newxz(zk, 1, zk_t); + + zk->handle = zookeeper_init(hosts, NULL, recv_timeout, + client_id, NULL, 0); + + if (!zk->handle) { + Safefree(zk); + + XSRETURN_UNDEF; + } + + Newxz(zk->first_watch, 1, zk_watch_t); + + zk->data_buf_len = DEFAULT_DATA_BUF_LEN; + zk->path_buf_len = DEFAULT_PATH_BUF_LEN; + zk->watch_timeout = DEFAULT_WATCH_TIMEOUT; + + zk->hosts_len = strlen(hosts); + zk->hosts = savepvn(hosts, zk->hosts_len); + + Newx(handle, 1, zk_handle_t); + + handle->signature = PACKAGE_SIGNATURE; + handle->handle.zk = zk; + + /* We use several tricks from DBI here. The attr_hash is our + * empty inner hash; we attach extra magic to it in the form of + * our zk_handle_t structure. Then we tie attr_hash to zk_hash, + * our outer hash. This is what is passed around (by reference) by + * callers. + * + * Most methods use _zk_get_handle_outer() which finds our inner + * handle, then returns the zk_t structure from its extra magic + * pointer. + * + * However, the tied hash methods, FETCH(), STORE(), and so forth, + * receive an already-dereferenced inner handle hash. This is + * because we bless both inner and outer handles into this class, + * so when a caller's code references a hash element in our + * outer handle, Perl detects its tied magic, looks up the + * tied object (our inner handle) and invokes the tied hash methods + * in its class on it. Since we blessed it into the same class + * as the outer handle, these methods simply reside in our package. + */ + + stash = gv_stashpv(package, GV_ADDWARN); + + attr_hash = newHV(); + + sv_magic((SV*) attr_hash, Nullsv, PERL_MAGIC_ext, + (const char*) handle, 0); + + attr = sv_bless(newRV_noinc((SV*) attr_hash), stash); + + zk_hash = newHV(); + + sv_magic((SV*) zk_hash, attr, PERL_MAGIC_tied, Nullch, 0); + SvREFCNT_dec(attr); + + ST(0) = sv_bless(sv_2mortal(newRV_noinc((SV*) zk_hash)), stash); + + XSRETURN(1); + + +void +zk_DESTROY(zkh) + Net::ZooKeeper zkh + PREINIT: + zk_handle_t *handle; + HV *attr_hash; + int ret = ZBADARGUMENTS; + PPCODE: + handle = _zk_check_handle_outer(aTHX_ zkh, &attr_hash, + PACKAGE_NAME, PACKAGE_SIGNATURE); + + if (!handle) { + handle = _zk_check_handle_inner(aTHX_ zkh, PACKAGE_SIGNATURE); + + if (handle) { + attr_hash = zkh; + zkh = NULL; + } + } + + if (handle) { + zk_t *zk = handle->handle.zk; + + ret = zookeeper_close(zk->handle); + + /* detach all now-inactive watches still tied to handles */ + _zk_release_watches(aTHX_ zk->first_watch, 1); + + Safefree(zk->first_watch); + Safefree(zk->hosts); + Safefree(zk); + Safefree(handle); + + sv_unmagic((SV*) attr_hash, PERL_MAGIC_ext); + } + + if (zkh && attr_hash) { + sv_unmagic((SV*) zkh, PERL_MAGIC_tied); + } + + if (GIMME_V == G_VOID) { + XSRETURN_EMPTY; + } + else if (ret == ZOK) { + XSRETURN_YES; + } + else { + XSRETURN_NO; + } + + +void +zk_CLONE(package) + char *package + PPCODE: + XSRETURN_EMPTY; + + +void +zk_CLONE_SKIP(package) + char *package + PPCODE: + XSRETURN_YES; + + +void +zk_TIEHASH(package, ...) + char *package + PPCODE: + Perl_croak(aTHX_ "tying hashes of class " + PACKAGE_NAME " not supported"); + + +void +zk_UNTIE(attr_hash, ref_count) + Net::ZooKeeper attr_hash + IV ref_count + PPCODE: + Perl_croak(aTHX_ "untying hashes of class " + PACKAGE_NAME " not supported"); + + +void +zk_FIRSTKEY(attr_hash) + Net::ZooKeeper attr_hash + PREINIT: + zk_t *zk; + PPCODE: + zk = _zk_get_handle_inner(aTHX_ attr_hash); + + if (!zk) { + Perl_croak(aTHX_ "invalid handle"); + } + + ST(0) = sv_2mortal(newSVpvn(zk_keys[0].name, zk_keys[0].name_len)); + + XSRETURN(1); + + +void +zk_NEXTKEY(attr_hash, attr_key) + Net::ZooKeeper attr_hash + SV *attr_key + PREINIT: + zk_t *zk; + char *key; + int i; + PPCODE: + zk = _zk_get_handle_inner(aTHX_ attr_hash); + + if (!zk) { + Perl_croak(aTHX_ "invalid handle"); + } + + key = SvPV_nolen(attr_key); + + for (i = 0; i < NUM_KEYS; ++i) { + if (strcaseEQ(key, zk_keys[i].name)) { + ++i; + + break; + } + } + + if (i < NUM_KEYS) { + ST(0) = sv_2mortal(newSVpvn(zk_keys[i].name, zk_keys[i].name_len)); + + XSRETURN(1); + } + else { + XSRETURN_EMPTY; + } + + +void +zk_SCALAR(attr_hash) + Net::ZooKeeper attr_hash + PPCODE: + XSRETURN_YES; + + +void +zk_FETCH(attr_hash, attr_key) + Net::ZooKeeper attr_hash + SV *attr_key + PREINIT: + zk_t *zk; + char *key; + SV *val = NULL; + PPCODE: + zk = _zk_get_handle_inner(aTHX_ attr_hash); + + if (!zk) { + Perl_croak(aTHX_ "invalid handle"); + } + + key = SvPV_nolen(attr_key); + + if (strcaseEQ(key, "data_read_len")) { + val = newSViv(zk->data_buf_len); + } + else if (strcaseEQ(key, "path_read_len")) { + val = newSViv(zk->path_buf_len); + } + else if (strcaseEQ(key, "watch_timeout")) { + val = newSVuv(zk->watch_timeout); + } + else if (strcaseEQ(key, "hosts")) { + val = newSVpvn(zk->hosts, zk->hosts_len); + } + else if (strcaseEQ(key, "session_timeout")) { + val = newSViv(zoo_recv_timeout(zk->handle)); + } + else if (strcaseEQ(key, "session_id")) { + const clientid_t *client_id; + clientid_t null_client_id; + + client_id = zoo_client_id(zk->handle); + + memset(&null_client_id, 0, sizeof(clientid_t)); + + if (!memcmp(client_id, &null_client_id, sizeof(clientid_t))) { + val = newSVpv("", 0); + } + else { + val = newSVpvn((const char*) client_id, sizeof(clientid_t)); + } + } + else if (strcaseEQ(key, "pending_watches")) { + /* cleanup any completed watches not tied to a handle */ + val = newSVuv(_zk_release_watches(aTHX_ zk->first_watch, 0)); + } + + if (val) { + ST(0) = sv_2mortal(val); + + XSRETURN(1); + } + + Perl_warn(aTHX_ "invalid element: %s", key); + + XSRETURN_UNDEF; + + +void +zk_STORE(attr_hash, attr_key, attr_val) + Net::ZooKeeper attr_hash + SV *attr_key + SV *attr_val + PREINIT: + zk_t *zk; + char *key; + PPCODE: + zk = _zk_get_handle_inner(aTHX_ attr_hash); + + if (!zk) { + Perl_croak(aTHX_ "invalid handle"); + } + + key = SvPV_nolen(attr_key); + + if (strcaseEQ(key, "data_read_len")) { + int val = SvIV(attr_val); + + if (val < 0) { + Perl_croak(aTHX_ "invalid data read length: %d", val); + } + + zk->data_buf_len = val; + } + else if (strcaseEQ(key, "path_read_len")) { + int val = SvIV(attr_val); + + if (val < 0) { + Perl_croak(aTHX_ "invalid path read length: %d", val); + } + + zk->path_buf_len = val; + } + else if (strcaseEQ(key, "watch_timeout")) { + zk->watch_timeout = SvUV(attr_val); + } + else { + int i; + + for (i = 0; i < NUM_KEYS; ++i) { + if (strcaseEQ(key, zk_keys[i].name)) { + Perl_warn(aTHX_ "read-only element: %s", key); + + XSRETURN_EMPTY; + } + } + + Perl_warn(aTHX_ "invalid element: %s", key); + } + + XSRETURN_EMPTY; + + +void +zk_EXISTS(attr_hash, attr_key) + Net::ZooKeeper attr_hash + SV *attr_key + PREINIT: + zk_t *zk; + char *key; + int i; + PPCODE: + zk = _zk_get_handle_inner(aTHX_ attr_hash); + + if (!zk) { + Perl_croak(aTHX_ "invalid handle"); + } + + key = SvPV_nolen(attr_key); + + for (i = 0; i < NUM_KEYS; ++i) { + if (strcaseEQ(key, zk_keys[i].name)) { + XSRETURN_YES; + } + } + + XSRETURN_NO; + + +void +zk_DELETE(attr_hash, attr_key) + Net::ZooKeeper attr_hash + SV *attr_key + PPCODE: + Perl_warn(aTHX_ "deleting elements from hashes of class " + PACKAGE_NAME " not supported"); + + XSRETURN_EMPTY; + + +void +zk_CLEAR(attr_hash) + Net::ZooKeeper attr_hash + PPCODE: + Perl_warn(aTHX_ "clearing hashes of class " + PACKAGE_NAME " not supported"); + + XSRETURN_EMPTY; + + +SV * +zk_get_error(zkh) + Net::ZooKeeper zkh + PREINIT: + zk_t *zk; + CODE: + zk = _zk_get_handle_outer(aTHX_ zkh); + + if (!zk) { + Perl_croak(aTHX_ "invalid handle"); + } + + RETVAL = newSViv(zk->last_ret); + errno = zk->last_errno; + OUTPUT: + RETVAL + + +void +zk_add_auth(zkh, scheme, cert) + Net::ZooKeeper zkh + char *scheme + char *cert; cert = (char *) SvPV($arg, cert_len); + PREINIT: + zk_t *zk; + STRLEN cert_len; + zk_watch_t *watch; + int ret; + PPCODE: + zk = _zk_get_handle_outer(aTHX_ zkh); + + if (!zk) { + Perl_croak(aTHX_ "invalid handle"); + } + + zk->last_ret = ZOK; + zk->last_errno = 0; + + if (cert_len > PERL_INT_MAX) { + Perl_croak(aTHX_ "invalid certificate length: %u", cert_len); + } + + watch = _zk_create_watch(aTHX); + + if (!watch) { + /* errno will be set */ + zk->last_ret = ZSYSTEMERROR; + zk->last_errno = errno; + + XSRETURN_NO; + } + + errno = 0; + ret = zoo_add_auth(zk->handle, scheme, cert, cert_len, + _zk_auth_completion, watch); + + zk->last_ret = ret; + zk->last_errno = errno; + + if (ret == ZOK) { + pthread_mutex_lock(&watch->mutex); + + while (!watch->done) { + pthread_cond_wait(&watch->cond, &watch->mutex); + } + + pthread_mutex_unlock(&watch->mutex); + + if (watch->done) { + ret = watch->ret; + } + else { + ret = ZINVALIDSTATE; + } + + /* errno may be set while we waited */ + zk->last_ret = ret; + zk->last_errno = errno; + } + + _zk_destroy_watch(aTHX_ watch); + + if (ret == ZOK) { + XSRETURN_YES; + } + else { + XSRETURN_NO; + } + + +void +zk_create(zkh, path, buf, ...) + Net::ZooKeeper zkh + char *path + char *buf; buf = (char *) SvPV($arg, buf_len); + PREINIT: + zk_t *zk; + STRLEN buf_len; + int flags = 0; + char *path_buf; + int path_buf_len; + AV *acl_arr = NULL; + struct ACL_vector acl; + int i, ret; + PPCODE: + zk = _zk_get_handle_outer(aTHX_ zkh); + + if (!zk) { + Perl_croak(aTHX_ "invalid handle"); + } + + zk->last_ret = ZOK; + zk->last_errno = 0; + + if (items > 3 && !(items % 2)) { + Perl_croak(aTHX_ "invalid number of arguments"); + } + + if (buf_len > PERL_INT_MAX) { + Perl_croak(aTHX_ "invalid data length: %u", buf_len); + } + + path_buf_len = zk->path_buf_len; + + for (i = 3; i < items; i += 2) { + char *key = SvPV_nolen(ST(i)); + + if (strcaseEQ(key, "path_read_len")) { + path_buf_len = SvIV(ST(i + 1)); + + if (path_buf_len < 2) { + Perl_croak(aTHX_ "invalid path read length: %d", + path_buf_len); + } + } + else if (strcaseEQ(key, "flags")) { + flags = SvIV(ST(i + 1)); + + if (flags & ~(ZOO_SEQUENCE | ZOO_EPHEMERAL)) { + Perl_croak(aTHX_ "invalid create flags: %d", flags); + } + } + else if (strcaseEQ(key, "acl")) { + const char *err; + + if (!SvROK(ST(i + 1)) || SvTYPE(SvRV(ST(i + 1))) != SVt_PVAV) { + Perl_croak(aTHX_ "invalid ACL array reference"); + } + + acl_arr = (AV*) SvRV(ST(i + 1)); + + err = _zk_fill_acl(aTHX_ acl_arr, &acl); + + if (err) { + Perl_croak(aTHX_ err); + } + } + } + + /* NOTE: would be nice to be able to rely on null-terminated string */ + ++path_buf_len; + Newxz(path_buf, path_buf_len, char); + + errno = 0; + ret = zoo_create(zk->handle, path, buf, buf_len, + (acl_arr ? &acl : NULL), flags, + path_buf, path_buf_len); + + zk->last_ret = ret; + zk->last_errno = errno; + + if (acl_arr) { + _zk_free_acl(aTHX_ &acl); + } + + if (ret == ZOK) { + ST(0) = sv_newmortal(); +#ifdef SV_HAS_TRAILING_NUL + sv_usepvn_flags(ST(0), path_buf, strlen(path_buf), + SV_HAS_TRAILING_NUL); +#else + sv_usepvn(ST(0), path_buf, strlen(path_buf)); +#endif + SvCUR_set(ST(0), strlen(path_buf)); + + XSRETURN(1); + } + + Safefree(path_buf); + + XSRETURN_UNDEF; + + +void +zk_delete(zkh, path, ...) + Net::ZooKeeper zkh + char *path + PREINIT: + zk_t *zk; + int version = -1; + int i, ret; + PPCODE: + zk = _zk_get_handle_outer(aTHX_ zkh); + + if (!zk) { + Perl_croak(aTHX_ "invalid handle"); + } + + zk->last_ret = ZOK; + zk->last_errno = 0; + + if (items > 2 && items % 2) { + Perl_croak(aTHX_ "invalid number of arguments"); + } + + for (i = 2; i < items; i += 2) { + char *key = SvPV_nolen(ST(i)); + + if (strcaseEQ(key, "version")) { + version = SvIV(ST(i + 1)); + + if (version < 0) { + Perl_croak(aTHX_ "invalid version requirement: %d", + version); + } + } + } + + errno = 0; + ret = zoo_delete(zk->handle, path, version); + + zk->last_ret = ret; + zk->last_errno = errno; + + if (ret == ZOK) { + XSRETURN_YES; + } + else { + XSRETURN_NO; + } + + +void +zk_exists(zkh, path, ...) + Net::ZooKeeper zkh + char *path + PREINIT: + zk_t *zk; + zk_stat_t *stat = NULL; + zk_watch_t *old_watch = NULL; + zk_handle_t *watch_handle = NULL; + watcher_fn watcher = NULL; + zk_watch_t *new_watch = NULL; + int i, ret; + PPCODE: + zk = _zk_get_handle_outer(aTHX_ zkh); + + if (!zk) { + Perl_croak(aTHX_ "invalid handle"); + } + + zk->last_ret = ZOK; + zk->last_errno = 0; + + if (items > 2 && items % 2) { + Perl_croak(aTHX_ "invalid number of arguments"); + } + + for (i = 2; i < items; i += 2) { + char *key = SvPV_nolen(ST(i)); + + if (strcaseEQ(key, "stat")) { + if (!SvROK(ST(i + 1)) || SvTYPE(SvRV(ST(i + 1))) != SVt_PVHV || + !sv_derived_from(ST(i + 1), STAT_PACKAGE_NAME)) { + Perl_croak(aTHX_ "stat is not a hash reference of " + "type " STAT_PACKAGE_NAME); + } + + stat = _zks_get_handle_outer(aTHX_ (HV*) SvRV(ST(i + 1))); + + if (!stat) { + Perl_croak(aTHX_ "invalid stat handle"); + } + } + else if (strcaseEQ(key, "watch")) { + if (!SvROK(ST(i + 1)) || SvTYPE(SvRV(ST(i + 1))) != SVt_PVHV || + !sv_derived_from(ST(i + 1), WATCH_PACKAGE_NAME)) { + Perl_croak(aTHX_ "watch is not a hash reference of " + "type " WATCH_PACKAGE_NAME); + } + + old_watch = _zkw_get_handle_outer(aTHX_ (HV*) SvRV(ST(i + 1)), + &watch_handle); + + if (!old_watch) { + Perl_croak(aTHX_ "invalid watch handle"); + } + } + } + + if (watch_handle) { + new_watch = _zk_acquire_watch(aTHX); + + if (!new_watch) { + /* errno will be set */ + zk->last_ret = ZSYSTEMERROR; + zk->last_errno = errno; + + XSRETURN_NO; + } + + watcher = _zk_watcher; + } + + errno = 0; + ret = zoo_wexists(zk->handle, path, watcher, new_watch, stat); + + zk->last_ret = ret; + zk->last_errno = errno; + + if (watch_handle) { + _zk_replace_watch(aTHX_ watch_handle, zk->first_watch, + old_watch, new_watch); + } + + if (ret == ZOK) { + XSRETURN_YES; + } + else { + XSRETURN_NO; + } + + +void +zk_get_children(zkh, path, ...) + Net::ZooKeeper zkh + char *path + PREINIT: + zk_t *zk; + zk_watch_t *old_watch = NULL; + zk_handle_t *watch_handle = NULL; + watcher_fn watcher = NULL; + zk_watch_t *new_watch = NULL; + struct String_vector strings; + int i, ret; + PPCODE: + zk = _zk_get_handle_outer(aTHX_ zkh); + + if (!zk) { + Perl_croak(aTHX_ "invalid handle"); + } + + zk->last_ret = ZOK; + zk->last_errno = 0; + + if (items > 2 && items % 2) { + Perl_croak(aTHX_ "invalid number of arguments"); + } + + for (i = 2; i < items; i += 2) { + char *key = SvPV_nolen(ST(i)); + + if (strcaseEQ(key, "watch")) { + if (!SvROK(ST(i + 1)) || SvTYPE(SvRV(ST(i + 1))) != SVt_PVHV || + !sv_derived_from(ST(i + 1), WATCH_PACKAGE_NAME)) { + Perl_croak(aTHX_ "watch is not a hash reference of " + "type " WATCH_PACKAGE_NAME); + } + + old_watch = _zkw_get_handle_outer(aTHX_ (HV*) SvRV(ST(i + 1)), + &watch_handle); + + if (!old_watch) { + Perl_croak(aTHX_ "invalid watch handle"); + } + } + } + + if (watch_handle) { + new_watch = _zk_acquire_watch(aTHX); + + if (!new_watch) { + /* errno will be set */ + zk->last_ret = ZSYSTEMERROR; + zk->last_errno = errno; + + if (GIMME_V == G_ARRAY) { + XSRETURN_EMPTY; + } + else { + XSRETURN_UNDEF; + } + } + + watcher = _zk_watcher; + } + + Zero(&strings, 1, struct String_vector); + + errno = 0; + ret = zoo_wget_children(zk->handle, path, watcher, new_watch, + &strings); + + zk->last_ret = ret; + zk->last_errno = errno; + + if (watch_handle) { + _zk_replace_watch(aTHX_ watch_handle, zk->first_watch, + old_watch, new_watch); + } + + if (ret == ZOK) { + int num_children; + + num_children = + (strings.count > PERL_INT_MAX) ? PERL_INT_MAX : strings.count; + + if (GIMME_V == G_ARRAY && num_children > 0) { + EXTEND(SP, num_children); + + for (i = 0; i < num_children; ++i) { + ST(i) = sv_2mortal(newSVpv(strings.data[i], 0)); + } + } + + /* NOTE: would be nice if this were documented as required */ + deallocate_String_vector(&strings); + + if (GIMME_V == G_ARRAY) { + if (num_children == 0) { + XSRETURN_EMPTY; + } + + XSRETURN(num_children); + } + else { + ST(0) = sv_2mortal(newSViv(num_children)); + + XSRETURN(1); + } + } + else { + if (GIMME_V == G_ARRAY) { + XSRETURN_EMPTY; + } + else { + XSRETURN_UNDEF; + } + } + + +void +zk_get(zkh, path, ...) + Net::ZooKeeper zkh + char *path + PREINIT: + zk_t *zk; + int buf_len; + zk_stat_t *stat = NULL; + zk_watch_t *old_watch = NULL; + zk_handle_t *watch_handle = NULL; + char *buf; + watcher_fn watcher = NULL; + zk_watch_t *new_watch = NULL; + int i, ret; + PPCODE: + zk = _zk_get_handle_outer(aTHX_ zkh); + + if (!zk) { + Perl_croak(aTHX_ "invalid handle"); + } + + zk->last_ret = ZOK; + zk->last_errno = 0; + + if (items > 2 && items % 2) { + Perl_croak(aTHX_ "invalid number of arguments"); + } + + buf_len = zk->data_buf_len; + + for (i = 2; i < items; i += 2) { + char *key = SvPV_nolen(ST(i)); + + if (strcaseEQ(key, "data_read_len")) { + buf_len = SvIV(ST(i + 1)); + + if (buf_len < 0) { + Perl_croak(aTHX_ "invalid data read length: %d", + buf_len); + } + } + else if (strcaseEQ(key, "stat")) { + if (!SvROK(ST(i + 1)) || SvTYPE(SvRV(ST(i + 1))) != SVt_PVHV || + !sv_derived_from(ST(i + 1), STAT_PACKAGE_NAME)) { + Perl_croak(aTHX_ "stat is not a hash reference of " + "type " STAT_PACKAGE_NAME); + } + + stat = _zks_get_handle_outer(aTHX_ (HV*) SvRV(ST(i + 1))); + + if (!stat) { + Perl_croak(aTHX_ "invalid stat handle"); + } + } + else if (strcaseEQ(key, "watch")) { + if (!SvROK(ST(i + 1)) || SvTYPE(SvRV(ST(i + 1))) != SVt_PVHV || + !sv_derived_from(ST(i + 1), WATCH_PACKAGE_NAME)) { + Perl_croak(aTHX_ "watch is not a hash reference of " + "type " WATCH_PACKAGE_NAME); + } + + old_watch = _zkw_get_handle_outer(aTHX_ (HV*) SvRV(ST(i + 1)), + &watch_handle); + + if (!old_watch) { + Perl_croak(aTHX_ "invalid watch handle"); + } + } + } + + if (watch_handle) { + new_watch = _zk_acquire_watch(aTHX); + + if (!new_watch) { + /* errno will be set */ + zk->last_ret = ZSYSTEMERROR; + zk->last_errno = errno; + + XSRETURN_UNDEF; + } + + watcher = _zk_watcher; + } + + Newx(buf, buf_len + 1, char); + + errno = 0; + ret = zoo_wget(zk->handle, path, watcher, new_watch, + buf, &buf_len, stat); + + zk->last_ret = ret; + zk->last_errno = errno; + + if (watch_handle) { + _zk_replace_watch(aTHX_ watch_handle, zk->first_watch, + old_watch, new_watch); + } + + if (ret == ZOK) { + ST(0) = sv_newmortal(); +#ifdef SV_HAS_TRAILING_NUL + buf[buf_len] = '\0'; + sv_usepvn_flags(ST(0), buf, buf_len, SV_HAS_TRAILING_NUL); +#else + sv_usepvn(ST(0), buf, buf_len); +#endif + + XSRETURN(1); + } + else { + Safefree(buf); + + XSRETURN_UNDEF; + } + + +void +zk_set(zkh, path, buf, ...) + Net::ZooKeeper zkh + char *path + char *buf; buf = (char *) SvPV($arg, buf_len); + PREINIT: + zk_t *zk; + int version = -1; + zk_stat_t *stat = NULL; + STRLEN buf_len; + int i, ret; + PPCODE: + zk = _zk_get_handle_outer(aTHX_ zkh); + + if (!zk) { + Perl_croak(aTHX_ "invalid handle"); + } + + zk->last_ret = ZOK; + zk->last_errno = 0; + + if (items > 3 && !(items % 2)) { + Perl_croak(aTHX_ "invalid number of arguments"); + } + + if (buf_len > PERL_INT_MAX) { + Perl_croak(aTHX_ "invalid data length: %u", buf_len); + } + + for (i = 3; i < items; i += 2) { + char *key = SvPV_nolen(ST(i)); + + if (strcaseEQ(key, "version")) { + version = SvIV(ST(i + 1)); + + if (version < 0) { + Perl_croak(aTHX_ "invalid version requirement: %d", + version); + } + } + else if (strcaseEQ(key, "stat")) { + if (!SvROK(ST(i + 1)) || SvTYPE(SvRV(ST(i + 1))) != SVt_PVHV || + !sv_derived_from(ST(i + 1), STAT_PACKAGE_NAME)) { + Perl_croak(aTHX_ "stat is not a hash reference of " + "type " STAT_PACKAGE_NAME); + } + + stat = _zks_get_handle_outer(aTHX_ (HV*) SvRV(ST(i + 1))); + + if (!stat) { + Perl_croak(aTHX_ "invalid stat handle"); + } + } + } + + errno = 0; + ret = zoo_set2(zk->handle, path, buf, buf_len, version, stat); + + zk->last_ret = ret; + zk->last_errno = errno; + + if (ret == ZOK) { + XSRETURN_YES; + } + else { + XSRETURN_NO; + } + + +void +zk_get_acl(zkh, path, ...) + Net::ZooKeeper zkh + char *path + PREINIT: + zk_t *zk; + zk_stat_t *stat = NULL; + struct ACL_vector acl; + int i, ret; + PPCODE: + zk = _zk_get_handle_outer(aTHX_ zkh); + + if (!zk) { + Perl_croak(aTHX_ "invalid handle"); + } + + zk->last_ret = ZOK; + zk->last_errno = 0; + + if (items > 2 && items % 2) { + Perl_croak(aTHX_ "invalid number of arguments"); + } + + for (i = 2; i < items; i += 2) { + char *key = SvPV_nolen(ST(i)); + + if (strcaseEQ(key, "stat")) { + if (!SvROK(ST(i + 1)) || SvTYPE(SvRV(ST(i + 1))) != SVt_PVHV || + !sv_derived_from(ST(i + 1), STAT_PACKAGE_NAME)) { + Perl_croak(aTHX_ "stat is not a hash reference of " + "type " STAT_PACKAGE_NAME); + } + + stat = _zks_get_handle_outer(aTHX_ (HV*) SvRV(ST(i + 1))); + + if (!stat) { + Perl_croak(aTHX_ "invalid stat handle"); + } + } + } + + errno = 0; + ret = zoo_get_acl(zk->handle, path, &acl, stat); + + zk->last_ret = ret; + zk->last_errno = errno; + + if (ret == ZOK) { + int num_acl_entries; + + num_acl_entries = + (acl.count > PERL_INT_MAX) ? PERL_INT_MAX : acl.count; + + if (GIMME_V == G_ARRAY && num_acl_entries > 0) { + EXTEND(SP, num_acl_entries); + + for (i = 0; i < num_acl_entries; ++i) { + HV *acl_entry_hash = newHV(); + + _zk_fill_acl_entry_hash(aTHX_ &acl.data[i], + acl_entry_hash); + + ST(i) = sv_2mortal(newRV_noinc((SV*) acl_entry_hash)); + } + } + + /* NOTE: would be nice if this were documented as required */ + deallocate_ACL_vector(&acl); + + if (GIMME_V == G_ARRAY) { + if (num_acl_entries == 0) { + XSRETURN_EMPTY; + } + + XSRETURN(num_acl_entries); + } + else { + ST(0) = sv_2mortal(newSViv(num_acl_entries)); + + XSRETURN(1); + } + } + else { + if (GIMME_V == G_ARRAY) { + XSRETURN_EMPTY; + } + else { + XSRETURN_UNDEF; + } + } + + +void +zk_set_acl(zkh, path, acl_arr, ...) + Net::ZooKeeper zkh + char *path + AV *acl_arr + PREINIT: + zk_t *zk; + const char *err; + int version = -1; + struct ACL_vector acl; + int i, ret; + PPCODE: + zk = _zk_get_handle_outer(aTHX_ zkh); + + if (!zk) { + Perl_croak(aTHX_ "invalid handle"); + } + + zk->last_ret = ZOK; + zk->last_errno = 0; + + if (items > 3 && !(items % 2)) { + Perl_croak(aTHX_ "invalid number of arguments"); + } + + err = _zk_fill_acl(aTHX_ acl_arr, &acl); + + if (err) { + Perl_croak(aTHX_ err); + } + + for (i = 3; i < items; i += 2) { + char *key = SvPV_nolen(ST(i)); + + if (strcaseEQ(key, "version")) { + version = SvIV(ST(i + 1)); + + if (version < 0) { + Perl_croak(aTHX_ "invalid version requirement: %d", + version); + } + } + } + + errno = 0; + ret = zoo_set_acl(zk->handle, path, version, &acl); + + zk->last_ret = ret; + zk->last_errno = errno; + + _zk_free_acl(aTHX_ &acl); + + if (ret == ZOK) { + XSRETURN_YES; + } + else { + XSRETURN_NO; + } + + +void +zk_stat(zkh) + Net::ZooKeeper zkh + PREINIT: + zk_t *zk; + zk_handle_t *handle; + HV *stash, *stat_hash, *attr_hash; + SV *attr; + PPCODE: + zk = _zk_get_handle_outer(aTHX_ zkh); + + if (!zk) { + Perl_croak(aTHX_ "invalid handle"); + } + + zk->last_ret = ZOK; + zk->last_errno = 0; + + Newx(handle, 1, zk_handle_t); + + handle->signature = STAT_PACKAGE_SIGNATURE; + + Newxz(handle->handle.stat, 1, zk_stat_t); + + /* As in zk_new(), we use two levels of magic here. */ + + stash = gv_stashpv(STAT_PACKAGE_NAME, GV_ADDWARN); + + attr_hash = newHV(); + + sv_magic((SV*) attr_hash, Nullsv, PERL_MAGIC_ext, + (const char*) handle, 0); + + attr = sv_bless(newRV_noinc((SV*) attr_hash), stash); + + stat_hash = newHV(); + + sv_magic((SV*) stat_hash, attr, PERL_MAGIC_tied, Nullch, 0); + SvREFCNT_dec(attr); + + ST(0) = sv_bless(sv_2mortal(newRV_noinc((SV*) stat_hash)), stash); + + XSRETURN(1); + + +void +zk_watch(zkh, ...) + Net::ZooKeeper zkh + PREINIT: + zk_t *zk; + unsigned int timeout; + zk_watch_t *watch; + zk_handle_t *handle; + HV *stash, *watch_hash, *attr_hash; + SV *attr; + int i; + PPCODE: + zk = _zk_get_handle_outer(aTHX_ zkh); + + if (!zk) { + Perl_croak(aTHX_ "invalid handle"); + } + + zk->last_ret = ZOK; + zk->last_errno = 0; + + if (items > 1 && !(items % 2)) { + Perl_croak(aTHX_ "invalid number of arguments"); + } + + timeout = zk->watch_timeout; + + for (i = 1; i < items; i += 2) { + char *key = SvPV_nolen(ST(i)); + + if (strcaseEQ(key, "timeout")) { + timeout = SvUV(ST(i + 1)); + } + } + + watch = _zk_acquire_watch(aTHX); + + if (!watch) { + /* errno will be set */ + zk->last_ret = ZSYSTEMERROR; + zk->last_errno = errno; + + XSRETURN_UNDEF; + } + + Newx(handle, 1, zk_handle_t); + + handle->signature = WATCH_PACKAGE_SIGNATURE; + handle->handle.watch = watch; + + /* As in zk_new(), we use two levels of magic here. */ + + stash = gv_stashpv(WATCH_PACKAGE_NAME, GV_ADDWARN); + + attr_hash = newHV(); + + watch->timeout = timeout; + + sv_magic((SV*) attr_hash, Nullsv, PERL_MAGIC_ext, + (const char*) handle, 0); + + attr = sv_bless(newRV_noinc((SV*) attr_hash), stash); + + watch_hash = newHV(); + + sv_magic((SV*) watch_hash, attr, PERL_MAGIC_tied, Nullch, 0); + SvREFCNT_dec(attr); + + ST(0) = sv_bless(sv_2mortal(newRV_noinc((SV*) watch_hash)), stash); + + XSRETURN(1); + + +MODULE = Net::ZooKeeper PACKAGE = Net::ZooKeeper::Stat PREFIX = zks_ + +void +zks_DESTROY(zksh) + Net::ZooKeeper::Stat zksh + PREINIT: + zk_handle_t *handle; + HV *attr_hash; + int ret = ZBADARGUMENTS; + PPCODE: + handle = _zk_check_handle_outer(aTHX_ zksh, &attr_hash, + STAT_PACKAGE_NAME, + STAT_PACKAGE_SIGNATURE); + + if (!handle) { + handle = _zk_check_handle_inner(aTHX_ zksh, + STAT_PACKAGE_SIGNATURE); + + if (handle) { + attr_hash = zksh; + zksh = NULL; + } + } + + if (handle) { + ret = ZOK; + + Safefree(handle->handle.stat); + Safefree(handle); + + sv_unmagic((SV*) attr_hash, PERL_MAGIC_ext); + } + + if (zksh && attr_hash) { + sv_unmagic((SV*) zksh, PERL_MAGIC_tied); + } + + if (GIMME_V == G_VOID) { + XSRETURN_EMPTY; + } + else if (ret == ZOK) { + XSRETURN_YES; + } + else { + XSRETURN_NO; + } + + +void +zks_CLONE(package) + char *package + PPCODE: + XSRETURN_EMPTY; + + +void +zks_CLONE_SKIP(package) + char *package + PPCODE: + XSRETURN_YES; + + +void +zks_TIEHASH(package, ...) + char *package + PPCODE: + Perl_croak(aTHX_ "tying hashes of class " + STAT_PACKAGE_NAME " not supported"); + + +void +zks_UNTIE(attr_hash, ref_count) + Net::ZooKeeper::Stat attr_hash + IV ref_count + PPCODE: + Perl_croak(aTHX_ "untying hashes of class " + STAT_PACKAGE_NAME " not supported"); + + +void +zks_FIRSTKEY(attr_hash) + Net::ZooKeeper::Stat attr_hash + PREINIT: + zk_stat_t *stat; + PPCODE: + stat = _zks_get_handle_inner(aTHX_ attr_hash); + + if (!stat) { + Perl_croak(aTHX_ "invalid handle"); + } + + ST(0) = sv_2mortal(newSVpvn(zk_stat_keys[0].name, + zk_stat_keys[0].name_len)); + + XSRETURN(1); + + +void +zks_NEXTKEY(attr_hash, attr_key) + Net::ZooKeeper::Stat attr_hash + SV *attr_key + PREINIT: + zk_stat_t *stat; + char *key; + int i; + PPCODE: + stat = _zks_get_handle_inner(aTHX_ attr_hash); + + if (!stat) { + Perl_croak(aTHX_ "invalid handle"); + } + + key = SvPV_nolen(attr_key); + + for (i = 0; i < NUM_STAT_KEYS; ++i) { + if (strcaseEQ(key, zk_stat_keys[i].name)) { + ++i; + + break; + } + } + + if (i < NUM_STAT_KEYS) { + ST(0) = sv_2mortal(newSVpvn(zk_stat_keys[i].name, + zk_stat_keys[i].name_len)); + + XSRETURN(1); + } + else { + XSRETURN_EMPTY; + } + + +void +zks_SCALAR(attr_hash) + Net::ZooKeeper::Stat attr_hash + PPCODE: + XSRETURN_YES; + + +void +zks_FETCH(attr_hash, attr_key) + Net::ZooKeeper::Stat attr_hash + SV *attr_key + PREINIT: + zk_stat_t *stat; + char *key; + SV *val = NULL; + int i; + PPCODE: + stat = _zks_get_handle_inner(aTHX_ attr_hash); + + if (!stat) { + Perl_croak(aTHX_ "invalid handle"); + } + + key = SvPV_nolen(attr_key); + + for (i = 0; i < NUM_STAT_KEYS; ++i) { + if (strcaseEQ(key, zk_stat_keys[i].name)) { + if (zk_stat_keys[i].size * CHAR_BIT == 32) { + val = newSViv(*((int32_t*) (((char*) stat) + + zk_stat_keys[i].offset))); + } + else { + /* NOTE: %lld is inconsistent, so cast to a double */ + val = newSVpvf("%.0f", (double) + *((int64_t*) (((char*) stat) + + zk_stat_keys[i].offset))); + } + + break; + } + } + + if (val) { + ST(0) = sv_2mortal(val); + + XSRETURN(1); + } + + Perl_warn(aTHX_ "invalid element: %s", key); + + XSRETURN_UNDEF; + + +void +zks_STORE(attr_hash, attr_key, attr_val) + Net::ZooKeeper::Stat attr_hash + SV *attr_key + SV *attr_val + PREINIT: + zk_stat_t *stat; + char *key; + int i; + PPCODE: + stat = _zks_get_handle_inner(aTHX_ attr_hash); + + if (!stat) { + Perl_croak(aTHX_ "invalid handle"); + } + + key = SvPV_nolen(attr_key); + + for (i = 0; i < NUM_STAT_KEYS; ++i) { + if (strcaseEQ(key, zk_stat_keys[i].name)) { + Perl_warn(aTHX_ "read-only element: %s", key); + + XSRETURN_EMPTY; + } + } + + Perl_warn(aTHX_ "invalid element: %s", key); + + XSRETURN_EMPTY; + + +void +zks_EXISTS(attr_hash, attr_key) + Net::ZooKeeper::Stat attr_hash + SV *attr_key + PREINIT: + zk_stat_t *stat; + char *key; + int i; + PPCODE: + stat = _zks_get_handle_inner(aTHX_ attr_hash); + + if (!stat) { + Perl_croak(aTHX_ "invalid handle"); + } + + key = SvPV_nolen(attr_key); + + for (i = 0; i < NUM_STAT_KEYS; ++i) { + if (strcaseEQ(key, zk_stat_keys[i].name)) { + XSRETURN_YES; + } + } + + XSRETURN_NO; + + +void +zks_DELETE(attr_hash, attr_key) + Net::ZooKeeper::Stat attr_hash + SV *attr_key + PPCODE: + Perl_warn(aTHX_ "deleting elements from hashes of class " + STAT_PACKAGE_NAME " not supported"); + + XSRETURN_EMPTY; + + +void +zks_CLEAR(attr_hash) + Net::ZooKeeper::Stat attr_hash + PPCODE: + Perl_warn(aTHX_ "clearing hashes of class " + STAT_PACKAGE_NAME " not supported"); + + XSRETURN_EMPTY; + + +MODULE = Net::ZooKeeper PACKAGE = Net::ZooKeeper::Watch PREFIX = zkw_ + +void +zkw_DESTROY(zkwh) + Net::ZooKeeper::Watch zkwh + PREINIT: + zk_handle_t *handle; + HV *attr_hash; + int ret = ZBADARGUMENTS; + PPCODE: + handle = _zk_check_handle_outer(aTHX_ zkwh, &attr_hash, + WATCH_PACKAGE_NAME, + WATCH_PACKAGE_SIGNATURE); + + if (!handle) { + handle = _zk_check_handle_inner(aTHX_ zkwh, + WATCH_PACKAGE_SIGNATURE); + + if (handle) { + attr_hash = zkwh; + zkwh = NULL; + } + } + + if (handle) { + ret = ZOK; + + _zk_release_watch(aTHX_ handle->handle.watch, 0); + Safefree(handle); + + sv_unmagic((SV*) attr_hash, PERL_MAGIC_ext); + } + + if (zkwh && attr_hash) { + sv_unmagic((SV*) zkwh, PERL_MAGIC_tied); + } + + if (GIMME_V == G_VOID) { + XSRETURN_EMPTY; + } + else if (ret == ZOK) { + XSRETURN_YES; + } + else { + XSRETURN_NO; + } + + +void +zkw_CLONE(package) + char *package + PPCODE: + XSRETURN_EMPTY; + + +void +zkw_CLONE_SKIP(package) + char *package + PPCODE: + XSRETURN_YES; + + +void +zkw_TIEHASH(package, ...) + char *package + PPCODE: + Perl_croak(aTHX_ "tying hashes of class " + WATCH_PACKAGE_NAME " not supported"); + + +void +zkw_UNTIE(attr_hash, ref_count) + Net::ZooKeeper::Watch attr_hash + IV ref_count + PPCODE: + Perl_croak(aTHX_ "untying hashes of class " + WATCH_PACKAGE_NAME " not supported"); + + +void +zkw_FIRSTKEY(attr_hash) + Net::ZooKeeper::Watch attr_hash + PREINIT: + zk_watch_t *watch; + PPCODE: + watch = _zkw_get_handle_inner(aTHX_ attr_hash); + + if (!watch) { + Perl_croak(aTHX_ "invalid handle"); + } + + ST(0) = sv_2mortal(newSVpvn(zk_watch_keys[0].name, + zk_watch_keys[0].name_len)); + + XSRETURN(1); + + +void +zkw_NEXTKEY(attr_hash, attr_key) + Net::ZooKeeper::Watch attr_hash + SV *attr_key + PREINIT: + zk_watch_t *watch; + char *key; + int i; + PPCODE: + watch = _zkw_get_handle_inner(aTHX_ attr_hash); + + if (!watch) { + Perl_croak(aTHX_ "invalid handle"); + } + + key = SvPV_nolen(attr_key); + + for (i = 0; i < NUM_WATCH_KEYS; ++i) { + if (strcaseEQ(key, zk_watch_keys[i].name)) { + ++i; + + break; + } + } + + if (i < NUM_WATCH_KEYS) { + ST(0) = sv_2mortal(newSVpvn(zk_watch_keys[i].name, + zk_watch_keys[i].name_len)); + + XSRETURN(1); + } + else { + XSRETURN_EMPTY; + } + + +void +zkw_SCALAR(attr_hash) + Net::ZooKeeper::Watch attr_hash + PPCODE: + XSRETURN_YES; + + +void +zkw_FETCH(attr_hash, attr_key) + Net::ZooKeeper::Watch attr_hash + SV *attr_key + PREINIT: + zk_watch_t *watch; + char *key; + SV *val = NULL; + PPCODE: + watch = _zkw_get_handle_inner(aTHX_ attr_hash); + + if (!watch) { + Perl_croak(aTHX_ "invalid handle"); + } + + key = SvPV_nolen(attr_key); + + if (strcaseEQ(key, "timeout")) { + val = newSVuv(watch->timeout); + } + else if (strcaseEQ(key, "event")) { + val = newSViv(watch->event_type); + } + else if (strcaseEQ(key, "state")) { + val = newSViv(watch->event_state); + } + + if (val) { + ST(0) = sv_2mortal(val); + + XSRETURN(1); + } + + Perl_warn(aTHX_ "invalid element: %s", key); + + XSRETURN_UNDEF; + + +void +zkw_STORE(attr_hash, attr_key, attr_val) + Net::ZooKeeper::Watch attr_hash + SV *attr_key + SV *attr_val + PREINIT: + zk_watch_t *watch; + char *key; + PPCODE: + watch = _zkw_get_handle_inner(aTHX_ attr_hash); + + if (!watch) { + Perl_croak(aTHX_ "invalid handle"); + } + + key = SvPV_nolen(attr_key); + + if (strcaseEQ(key, "timeout")) { + watch->timeout = SvUV(attr_val); + } + else { + int i; + + for (i = 0; i < NUM_WATCH_KEYS; ++i) { + if (strcaseEQ(key, zk_watch_keys[i].name)) { + Perl_warn(aTHX_ "read-only element: %s", key); + + XSRETURN_EMPTY; + } + } + + Perl_warn(aTHX_ "invalid element: %s", key); + } + + XSRETURN_EMPTY; + + +void +zkw_EXISTS(attr_hash, attr_key) + Net::ZooKeeper::Watch attr_hash + SV *attr_key + PREINIT: + zk_watch_t *watch; + char *key; + int i; + PPCODE: + watch = _zkw_get_handle_inner(aTHX_ attr_hash); + + if (!watch) { + Perl_croak(aTHX_ "invalid handle"); + } + + key = SvPV_nolen(attr_key); + + for (i = 0; i < NUM_WATCH_KEYS; ++i) { + if (strcaseEQ(key, zk_watch_keys[i].name)) { + XSRETURN_YES; + } + } + + XSRETURN_NO; + + +void +zkw_DELETE(attr_hash, attr_key) + Net::ZooKeeper::Watch attr_hash + SV *attr_key + PPCODE: + Perl_warn(aTHX_ "deleting elements from hashes of class " + WATCH_PACKAGE_NAME " not supported"); + + XSRETURN_EMPTY; + + +void +zkw_CLEAR(attr_hash) + Net::ZooKeeper::Watch attr_hash + PPCODE: + Perl_warn(aTHX_ "clearing hashes of class " + WATCH_PACKAGE_NAME " not supported"); + + XSRETURN_EMPTY; + + +void +zkw_wait(zkwh, ...) + Net::ZooKeeper::Watch zkwh + PREINIT: + zk_watch_t *watch; + unsigned int timeout; + struct timeval end_timeval; + int i, done; + PPCODE: + watch = _zkw_get_handle_outer(aTHX_ zkwh, NULL); + + if (!watch) { + Perl_croak(aTHX_ "invalid handle"); + } + + if (items > 1 && !(items % 2)) { + Perl_croak(aTHX_ "invalid number of arguments"); + } + + timeout = watch->timeout; + + for (i = 1; i < items; i += 2) { + char *key = SvPV_nolen(ST(i)); + + if (strcaseEQ(key, "timeout")) { + timeout = SvUV(ST(i + 1)); + } + } + + gettimeofday(&end_timeval, NULL); + + end_timeval.tv_sec += timeout / 1000; + end_timeval.tv_usec += (timeout % 1000) * 1000; + + pthread_mutex_lock(&watch->mutex); + + while (!watch->done) { + struct timeval curr_timeval; + struct timespec wait_timespec; + + gettimeofday(&curr_timeval, NULL); + + wait_timespec.tv_sec = end_timeval.tv_sec - curr_timeval.tv_sec; + wait_timespec.tv_nsec = + (end_timeval.tv_usec - curr_timeval.tv_usec) * 1000; + + if (wait_timespec.tv_nsec < 0) { + --wait_timespec.tv_sec; + wait_timespec.tv_nsec += 1000000000; + } + + if (wait_timespec.tv_sec < 0 || + (wait_timespec.tv_sec == 0 && wait_timespec.tv_nsec <= 0)) { + break; + } + + pthread_cond_timedwait(&watch->cond, &watch->mutex, + &wait_timespec); + } + + done = watch->done; + + pthread_mutex_unlock(&watch->mutex); + + if (done) { + XSRETURN_YES; + } + else { + XSRETURN_NO; + } + diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/zkperl/build.xml b/pkg/registry/zookeeper-3.4.6/src/contrib/zkperl/build.xml new file mode 100644 index 000000000..0c7207dc0 --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/contrib/zkperl/build.xml @@ -0,0 +1,61 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/zkperl/build/check_zk_version.c b/pkg/registry/zookeeper-3.4.6/src/contrib/zkperl/build/check_zk_version.c new file mode 100644 index 000000000..b92315361 --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/contrib/zkperl/build/check_zk_version.c @@ -0,0 +1,29 @@ +/* Net::ZooKeeper - Perl extension for Apache ZooKeeper + * + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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. + */ + +#include +#include + +#include "check_zk_version.h" + +int main() { + printf("%d.%d.%d\n", ZOO_MAJOR_VERSION, ZOO_MINOR_VERSION, ZOO_PATCH_VERSION); + return 0; +} + diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/zkperl/build/check_zk_version.h b/pkg/registry/zookeeper-3.4.6/src/contrib/zkperl/build/check_zk_version.h new file mode 100644 index 000000000..67a36420f --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/contrib/zkperl/build/check_zk_version.h @@ -0,0 +1,27 @@ +/* Net::ZooKeeper - Perl extension for Apache ZooKeeper + * + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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. + */ + +/* keep in sync with Makefile.PL */ +#if !defined(ZOO_MAJOR_VERSION) || ZOO_MAJOR_VERSION != 3 || \ + !defined(ZOO_MINOR_VERSION) || ZOO_MINOR_VERSION < 1 || \ + !defined(ZOO_PATCH_VERSION) || \ + (ZOO_MINOR_VERSION == 1 && ZOO_PATCH_VERSION < 1) +#error "Net::ZooKeeper requires at least ZooKeeper version 3.1.1" +#endif + diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/zkperl/t/10_invalid.t b/pkg/registry/zookeeper-3.4.6/src/contrib/zkperl/t/10_invalid.t new file mode 100644 index 000000000..5e080b64c --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/contrib/zkperl/t/10_invalid.t @@ -0,0 +1,773 @@ +# Net::ZooKeeper - Perl extension for Apache ZooKeeper +# +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you 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. + +use File::Spec; +use Test::More tests => 107; + +BEGIN { use_ok('Net::ZooKeeper', qw(:all)) }; + + +my $test_dir; +(undef, $test_dir, undef) = File::Spec->splitpath($0); +require File::Spec->catfile($test_dir, 'util.pl'); + +my($hosts, $root_path, $node_path) = zk_test_setup(1); + + +## new() + +eval { + Net::ZooKeeper->new(); +}; +like($@, qr/Usage: Net::ZooKeeper::new\(package, hosts, \.\.\.\)/, + 'new(): no hostname specified'); + +eval { + Net::ZooKeeper->new($hosts, 'bar'); +}; +like($@, qr/invalid number of arguments/, + 'new(): invalid number of arguments'); + +eval { + Net::ZooKeeper->new($hosts, 'session_timeout' => -3); +}; +like($@, qr/invalid session timeout/, + 'new(): invalid session timeout'); + +eval { + Net::ZooKeeper->new($hosts, 'session_timeout' => 0x4000_0000); +}; +like($@, qr/invalid session timeout/, + 'new(): invalid session timeout'); + +eval { + Net::ZooKeeper->new($hosts, 'session_id' => 'abcdef'); +}; +like($@, qr/invalid session ID/, + 'new(): invalid session ID'); + +my $zkh = Net::ZooKeeper->new($hosts); +isa_ok($zkh, 'Net::ZooKeeper', + 'new(): created handle'); + + +## DESTROY() + +eval { + $zkh->DESTROY('foo'); +}; +like($@, qr/Usage: Net::ZooKeeper::DESTROY\(zkh\)/, + 'DESTROY(): too many arguments'); + +my $bad_zkh = {}; +$bad_zkh = bless($bad_zkh, 'Net::ZooKeeper'); + +my $ret = $bad_zkh->DESTROY(); +ok(!$ret, + 'DESTROY(): no action on invalid handle'); + + +## add_auth() + +eval { + $zkh->add_auth(); +}; +like($@, qr/Usage: Net::ZooKeeper::add_auth\(zkh, scheme, cert\)/, + 'add_auth(): no scheme specified'); + +eval { + $zkh->add_auth('foo'); +}; +like($@, qr/Usage: Net::ZooKeeper::add_auth\(zkh, scheme, cert\)/, + 'add_auth(): no certificate specified'); + +eval { + $zkh->add_auth('foo', 'foo', 'bar'); +}; +like($@, qr/Usage: Net::ZooKeeper::add_auth\(zkh, scheme, cert\)/, + 'add_auth(): too many arguments'); + +eval { + $bad_zkh->add_auth('foo', 'foo'); +}; +like($@, qr/invalid handle/, + 'add_auth(): invalid handle'); + +eval { + Net::ZooKeeper::add_auth(1, 'foo', 'foo'); +}; +like($@, qr/zkh is not a hash reference of type Net::ZooKeeper/, + 'add_auth(): invalid hash reference'); + + +## create() + +eval { + $zkh->create(); +}; +like($@, qr/Usage: Net::ZooKeeper::create\(zkh, path, buf, \.\.\.\)/, + 'create(): no path specified'); + +eval { + $zkh->create($node_path); +}; +like($@, qr/Usage: Net::ZooKeeper::create\(zkh, path, buf, \.\.\.\)/, + 'create(): no data buffer specified'); + +eval { + $zkh->create($node_path, 'foo', 'bar'); +}; +like($@, qr/invalid number of arguments/, + 'create(): invalid number of arguments'); + +eval { + $zkh->create($node_path, 'foo', 'path_read_len' => -3); +}; +like($@, qr/invalid path read length/, + 'create(): invalid path read length'); + +eval { + $zkh->create($node_path, 'foo', 'path_read_len' => 1); +}; +like($@, qr/invalid path read length/, + 'create(): invalid path read length'); + +eval { + $zkh->create($node_path, 'foo', 'flags' => 15); +}; +like($@, qr/invalid create flags/, + 'create(): invalid create flags'); + +eval { + $zkh->create($node_path, 'foo', 'flags' => ZOO_EPHEMERAL, 'acl', 'foo'); +}; +like($@, qr/invalid ACL array reference/, + 'create(): invalid ACL array reference'); + +eval { + $zkh->create($node_path, 'foo', 'acl', {}); +}; +like($@, qr/invalid ACL array reference/, + 'create(): invalid ACL array reference to hash'); + +eval { + my @acl = ('foo', 'bar'); + $zkh->create($node_path, 'foo', 'acl', \@acl); +}; +like($@, qr/invalid ACL entry hash reference/, + 'create(): invalid ACL entry hash reference'); + +eval { + my @acl = ({ 'foo' => 'bar' }); + $zkh->create($node_path, 'foo', 'acl', \@acl); +}; +like($@, qr/no ACL entry perms element/, + 'create(): no ACL entry perms element'); + +eval { + my @acl = ( + { + 'perms' => -1 + } + ); + $zkh->create($node_path, 'foo', 'acl', \@acl); +}; +like($@, qr/invalid ACL entry perms/, + 'create(): invalid ACL entry perms'); + +eval { + my @acl = ( + { + 'perms' => ZOO_PERM_ALL + } + ); + $zkh->create($node_path, 'foo', 'acl', \@acl); +}; +like($@, qr/no ACL entry scheme element/, + 'create(): no ACL entry scheme element'); + +eval { + my @acl = ( + { + 'perms' => ZOO_PERM_ALL, + 'scheme' => 'foo' + } + ); + $zkh->create($node_path, 'foo', 'acl', \@acl); +}; +like($@, qr/no ACL entry id element/, + 'create(): no ACL entry id element'); + +eval { + my @acl = ( + { + 'perms' => ZOO_PERM_ALL, + 'scheme' => 'foo', + 'id' => 'bar' + }, + 'bar' + ); + $zkh->create($node_path, 'foo', 'acl', \@acl); +}; +like($@, qr/invalid ACL entry hash reference/, + 'create(): invalid second ACL entry hash reference'); + +eval { + $bad_zkh->create($node_path, 'foo'); +}; +like($@, qr/invalid handle/, + 'create(): invalid handle'); + +eval { + Net::ZooKeeper::create(1, $node_path, 'foo'); +}; +like($@, qr/zkh is not a hash reference of type Net::ZooKeeper/, + 'create(): invalid hash reference'); + + +## delete() + +eval { + $zkh->delete(); +}; +like($@, qr/Usage: Net::ZooKeeper::delete\(zkh, path, \.\.\.\)/, + 'delete(): no path specified'); + +eval { + $zkh->delete($node_path, 'bar'); +}; +like($@, qr/invalid number of arguments/, + 'delete(): invalid number of arguments'); + +eval { + $zkh->delete($node_path, 'version' => -3); +}; +like($@, qr/invalid version requirement/, + 'delete(): invalid version requirement'); + +eval { + $bad_zkh->delete($node_path); +}; +like($@, qr/invalid handle/, + 'delete(): invalid handle'); + +eval { + Net::ZooKeeper::delete(1, $node_path); +}; +like($@, qr/zkh is not a hash reference of type Net::ZooKeeper/, + 'delete(): invalid hash reference'); + + +## exists() + +eval { + $zkh->exists(); +}; +like($@, qr/Usage: Net::ZooKeeper::exists\(zkh, path, \.\.\.\)/, + 'exists(): no path specified'); + +eval { + $zkh->exists($node_path, 'bar'); +}; +like($@, qr/invalid number of arguments/, + 'exists(): invalid number of arguments'); + +eval { + $zkh->exists($node_path, 'watch', 'bar'); +}; +like($@, qr/watch is not a hash reference of type Net::ZooKeeper::Watch/, + 'exists(): invalid watch hash reference'); + +eval { + $zkh->exists($node_path, 'watch', []); +}; +like($@, qr/watch is not a hash reference of type Net::ZooKeeper::Watch/, + 'exists(): invalid watch hash reference to array'); + +eval { + $zkh->exists($node_path, 'stat', 'bar'); +}; +like($@, qr/stat is not a hash reference of type Net::ZooKeeper::Stat/, + 'exists(): invalid stat hash reference'); + +eval { + $zkh->exists($node_path, 'stat', []); +}; +like($@, qr/stat is not a hash reference of type Net::ZooKeeper::Stat/, + 'exists(): invalid stat hash reference'); + +eval { + $bad_zkh->exists($node_path); +}; +like($@, qr/invalid handle/, + 'exists(): invalid handle'); + +eval { + Net::ZooKeeper::exists(1, $node_path); +}; +like($@, qr/zkh is not a hash reference of type Net::ZooKeeper/, + 'exists(): invalid hash reference'); + + +## get_children() + +eval { + $zkh->get_children(); +}; +like($@, qr/Usage: Net::ZooKeeper::get_children\(zkh, path, \.\.\.\)/, + 'get_children(): no path specified'); + +eval { + $zkh->get_children($node_path, 'bar'); +}; +like($@, qr/invalid number of arguments/, + 'get_children(): invalid number of arguments'); + +eval { + $zkh->get_children($node_path, 'watch', 'bar'); +}; +like($@, qr/watch is not a hash reference of type Net::ZooKeeper::Watch/, + 'get_children(): invalid watch hash reference'); + +eval { + $zkh->get_children($node_path, 'watch', []); +}; +like($@, qr/watch is not a hash reference of type Net::ZooKeeper::Watch/, + 'get_children(): invalid watch ash reference to array'); + +eval { + $bad_zkh->get_children($node_path); +}; +like($@, qr/invalid handle/, + 'get_children(): invalid handle'); + +eval { + Net::ZooKeeper::get_children(1, $node_path); +}; +like($@, qr/zkh is not a hash reference of type Net::ZooKeeper/, + 'get_children(): invalid hash reference'); + + +## get() + +eval { + $zkh->get(); +}; +like($@, qr/Usage: Net::ZooKeeper::get\(zkh, path, \.\.\.\)/, + 'get(): no path specified'); + +eval { + $zkh->get($node_path, 'bar'); +}; +like($@, qr/invalid number of arguments/, + 'get(): invalid number of arguments'); + +eval { + $zkh->get($node_path, 'data_read_len' => -3); +}; +like($@, qr/invalid data read length/, + 'get(): invalid data read length'); + +eval { + $zkh->get($node_path, 'data_read_len' => 10, 'watch', 'bar'); +}; +like($@, qr/watch is not a hash reference of type Net::ZooKeeper::Watch/, + 'get(): invalid watch hash reference'); + +eval { + $zkh->get($node_path, 'watch', []); +}; +like($@, qr/watch is not a hash reference of type Net::ZooKeeper::Watch/, + 'get(): invalid watch hash reference to array'); + +eval { + $zkh->get($node_path, 'stat', 'bar'); +}; +like($@, qr/stat is not a hash reference of type Net::ZooKeeper::Stat/, + 'get(): invalid stat hash reference'); + +eval { + $zkh->get($node_path, 'stat', []); +}; +like($@, qr/stat is not a hash reference of type Net::ZooKeeper::Stat/, + 'get(): invalid stat hash reference'); + +eval { + $bad_zkh->get($node_path); +}; +like($@, qr/invalid handle/, + 'get(): invalid handle'); + +eval { + Net::ZooKeeper::get(1, $node_path); +}; +like($@, qr/zkh is not a hash reference of type Net::ZooKeeper/, + 'get(): invalid hash reference'); + + +## set() + +eval { + $zkh->set(); +}; +like($@, qr/Usage: Net::ZooKeeper::set\(zkh, path, buf, \.\.\.\)/, + 'set(): no path specified'); + +eval { + $zkh->set($node_path); +}; +like($@, qr/Usage: Net::ZooKeeper::set\(zkh, path, buf, \.\.\.\)/, + 'set(): no data buffer specified'); + +eval { + $zkh->set($node_path, 'foo', 'bar'); +}; +like($@, qr/invalid number of arguments/, + 'set(): invalid number of arguments'); + +eval { + $zkh->set($node_path, 'foo', 'version' => -3); +}; +like($@, qr/invalid version requirement/, + 'set(): invalid version requirement'); + +eval { + $zkh->set($node_path, 'foo', 'version', 0, 'stat', 'bar'); +}; +like($@, qr/stat is not a hash reference of type Net::ZooKeeper::Stat/, + 'set(): invalid stat hash reference'); + +eval { + $zkh->set($node_path, 'foo', 'stat', []); +}; +like($@, qr/stat is not a hash reference of type Net::ZooKeeper::Stat/, + 'set(): invalid stat hash reference'); + +eval { + $bad_zkh->set($node_path, 'foo'); +}; +like($@, qr/invalid handle/, + 'set(): invalid handle'); + +eval { + Net::ZooKeeper::set(1, $node_path, 'foo'); +}; +like($@, qr/zkh is not a hash reference of type Net::ZooKeeper/, + 'set(): invalid hash reference'); + + +## get_acl() + +eval { + $zkh->get_acl(); +}; +like($@, qr/Usage: Net::ZooKeeper::get_acl\(zkh, path, \.\.\.\)/, + 'get_acl(): no path specified'); + +eval { + $zkh->get_acl($node_path, 'bar'); +}; +like($@, qr/invalid number of arguments/, + 'get_acl(): invalid number of arguments'); + +eval { + $zkh->get_acl($node_path, 'stat', 'bar'); +}; +like($@, qr/stat is not a hash reference of type Net::ZooKeeper::Stat/, + 'get_acl(): invalid stat hash reference'); + +eval { + $zkh->get_acl($node_path, 'stat', []); +}; +like($@, qr/stat is not a hash reference of type Net::ZooKeeper::Stat/, + 'get_acl(): invalid stat hash reference'); + +eval { + $bad_zkh->get_acl($node_path); +}; +like($@, qr/invalid handle/, + 'get_acl(): invalid handle'); + +eval { + Net::ZooKeeper::get_acl(1, $node_path); +}; +like($@, qr/zkh is not a hash reference of type Net::ZooKeeper/, + 'get_acl(): invalid hash reference'); + + +## set_acl() + +eval { + $zkh->set_acl(); +}; +like($@, qr/Usage: Net::ZooKeeper::set_acl\(zkh, path, acl_arr, \.\.\.\)/, + 'set_acl(): no path specified'); + +eval { + $zkh->set_acl($node_path); +}; +like($@, qr/Usage: Net::ZooKeeper::set_acl\(zkh, path, acl_arr, \.\.\.\)/, + 'set_acl(): no data buffer specified'); + +eval { + $zkh->set_acl($node_path, 'foo'); +}; +like($@, qr/acl_arr is not an array reference/, + 'set_acl(): invalid ACL array reference'); + +eval { + $zkh->set_acl($node_path, {}); +}; +like($@, qr/acl_arr is not an array reference/, + 'set_acl(): invalid ACL array reference to hash'); + +eval { + my @acl = ('foo', 'bar'); + $zkh->set_acl($node_path, \@acl); +}; +like($@, qr/invalid ACL entry hash reference/, + 'set_acl(): invalid ACL entry hash reference'); + +eval { + my @acl = ({ 'foo' => 'bar' }); + $zkh->set_acl($node_path, \@acl); +}; +like($@, qr/no ACL entry perms element/, + 'set_acl(): no ACL entry perms element'); + +eval { + my @acl = ( + { + 'perms' => -1 + } + ); + $zkh->set_acl($node_path, \@acl); +}; +like($@, qr/invalid ACL entry perms/, + 'set_acl(): invalid ACL entry perms'); + +eval { + my @acl = ( + { + 'perms' => ZOO_PERM_ALL + } + ); + $zkh->set_acl($node_path, \@acl); +}; +like($@, qr/no ACL entry scheme element/, + 'set_acl(): no ACL entry scheme element'); + +eval { + my @acl = ( + { + 'perms' => ZOO_PERM_ALL, + 'scheme' => 'foo' + } + ); + $zkh->set_acl($node_path, \@acl); +}; +like($@, qr/no ACL entry id element/, + 'set_acl(): no ACL entry id element'); + +eval { + my @acl = ( + { + 'perms' => ZOO_PERM_ALL, + 'scheme' => 'foo', + 'id' => 'bar' + }, + 'bar' + ); + $zkh->set_acl($node_path, \@acl); +}; +like($@, qr/invalid ACL entry hash reference/, + 'set_acl(): invalid second ACL entry hash reference'); + +eval { + $zkh->set_acl($node_path, [], 'bar'); +}; +like($@, qr/invalid number of arguments/, + 'set_acl(): invalid number of arguments'); + +eval { + $zkh->set_acl($node_path, [], 'version' => -3); +}; +like($@, qr/invalid version requirement/, + 'set_acl(): invalid version requirement'); + +eval { + $bad_zkh->set_acl($node_path, []); +}; +like($@, qr/invalid handle/, + 'set_acl(): invalid handle'); + +eval { + Net::ZooKeeper::set_acl(1, $node_path, []); +}; +like($@, qr/zkh is not a hash reference of type Net::ZooKeeper/, + 'set_acl(): invalid hash reference'); + + +## stat() + +eval { + $zkh->stat('bar'); +}; +like($@, qr/Usage: Net::ZooKeeper::stat\(zkh\)/, + 'stat(): too many arguments'); + +eval { + $bad_zkh->stat(); +}; +like($@, qr/invalid handle/, + 'stat(): invalid handle'); + +eval { + Net::ZooKeeper::stat(1); +}; +like($@, qr/zkh is not a hash reference of type Net::ZooKeeper/, + 'stat(): invalid hash reference'); + +my $stat = $zkh->stat(); +isa_ok($stat, 'Net::ZooKeeper::Stat', + 'stat(): created stat handle'); + + +## stat DESTROY() + +eval { + $stat->DESTROY('foo'); +}; +like($@, qr/Usage: Net::ZooKeeper::Stat::DESTROY\(zksh\)/, + 'stat DESTROY(): too many arguments'); + +my $bad_stat = {}; +$bad_stat = bless($bad_stat, 'Net::ZooKeeper::Stat'); + +$ret = $bad_stat->DESTROY(); +ok(!$ret, + 'stat DESTROY(): no action on invalid handle'); + + +## watch() + +eval { + $zkh->watch('bar'); +}; +like($@, qr/invalid number of arguments/, + 'watch(): invalid number of arguments'); + +eval { + $bad_zkh->watch(); +}; +like($@, qr/invalid handle/, + 'watch(): invalid handle'); + +eval { + Net::ZooKeeper::watch(1); +}; +like($@, qr/zkh is not a hash reference of type Net::ZooKeeper/, + 'watch(): invalid hash reference'); + +my $watch = $zkh->watch(); +isa_ok($watch, 'Net::ZooKeeper::Watch', + 'watch(): created watch handle'); + + +## watch DESTROY() + +eval { + $watch->DESTROY('foo'); +}; +like($@, qr/Usage: Net::ZooKeeper::Watch::DESTROY\(zkwh\)/, + 'watch DESTROY(): too many arguments'); + +my $bad_watch = {}; +$bad_watch = bless($bad_watch, 'Net::ZooKeeper::Watch'); + +$ret = $bad_watch->DESTROY(); +ok(!$ret, + 'watch DESTROY(): no action on invalid handle'); + + +## wait() + +eval { + $watch->wait('bar'); +}; +like($@, qr/invalid number of arguments/, + 'wait(): invalid number of arguments'); + +eval { + $bad_watch->wait(); +}; +like($@, qr/invalid handle/, + 'wait(): invalid watch handle'); + +eval { + Net::ZooKeeper::Watch::wait(1); +}; +like($@, qr/zkwh is not a hash reference of type Net::ZooKeeper::Watch/, + 'wait(): invalid watch hash reference'); + + +## set_log_level() + +eval { + my $f = \&Net::ZooKeeper::set_log_level; + &$f(); +}; +like($@, qr/Usage: Net::ZooKeeper::set_log_level\(level\)/, + 'set_log_level(): no level specified'); + +eval { + my $f = \&Net::ZooKeeper::set_log_level; + &$f(ZOO_LOG_LEVEL_OFF, 'foo'); +}; +like($@, qr/Usage: Net::ZooKeeper::set_log_level\(level\)/, + 'set_log_level(): too many arguments'); + +eval { + Net::ZooKeeper::set_log_level((ZOO_LOG_LEVEL_OFF) - 1); +}; +like($@, qr/invalid log level/, + 'set_log_level(): invalid low log level'); + +eval { + Net::ZooKeeper::set_log_level((ZOO_LOG_LEVEL_DEBUG) + 1); +}; +like($@, qr/invalid log level/, + 'set_log_level(): invalid high log level'); + + +## set_deterministic_conn_order() + +eval { + my $f = \&Net::ZooKeeper::set_deterministic_conn_order; + &$f(); +}; +like($@, qr/Usage: Net::ZooKeeper::set_deterministic_conn_order\(flag\)/, + 'set_deterministic_conn_order(): no flag specified'); + +eval { + my $f = \&Net::ZooKeeper::set_deterministic_conn_order; + &$f(1, 'foo'); +}; +like($@, qr/Usage: Net::ZooKeeper::set_deterministic_conn_order\(flag\)/, + 'set_deterministic_conn_order(): too many arguments'); + diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/zkperl/t/15_thread.t b/pkg/registry/zookeeper-3.4.6/src/contrib/zkperl/t/15_thread.t new file mode 100644 index 000000000..1ef56d0c7 --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/contrib/zkperl/t/15_thread.t @@ -0,0 +1,121 @@ +# Net::ZooKeeper - Perl extension for Apache ZooKeeper +# +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you 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. + +use Config; +use File::Spec; +use Test::More; + +BEGIN { + if ($Config{'useithreads'}) { + plan tests => 10; + } + else { + plan skip_all => 'no thread support'; + } +} + +use threads; + +BEGIN { use_ok('Net::ZooKeeper', qw(:all)) }; + + +my $test_dir; +(undef, $test_dir, undef) = File::Spec->splitpath($0); +require File::Spec->catfile($test_dir, 'util.pl'); + +my($hosts, $root_path, $node_path) = zk_test_setup(0); + + +my $zkh = Net::ZooKeeper->new($hosts); + +SKIP: { + skip 'no valid handle', 9 unless (defined($zkh)); + + my($thread) = threads->new(\&thread_test, $zkh); + + SKIP: { + skip 'no valid thread', 3 unless (defined($thread)); + + my(@ret) = $thread->join; + + ok((@ret == 3 and $ret[0]), + 'CLONE_SKIP(): handle reference after spawning thread'); + + ok((@ret == 3 and $ret[1]), + 'CLONE_SKIP(): scalar handle reference after spawning thread'); + + ok((@ret == 3 and $ret[2]), + 'CLONE_SKIP(): undef handle reference after spawning thread'); + } + + my $stat = $zkh->stat(); + + ($thread) = threads->new(\&thread_test, $stat); + + SKIP: { + skip 'no valid thread', 3 unless (defined($thread)); + + my(@ret) = $thread->join; + + ok((@ret == 3 and $ret[0]), + 'stat CLONE_SKIP(): stat handle reference after spawning thread'); + + ok((@ret == 3 and $ret[1]), + 'stat CLONE_SKIP(): scalar stat handle reference after ' . + 'spawning thread'); + + ok((@ret == 3 and $ret[2]), + 'stat CLONE_SKIP(): undef stat handle reference after ' . + 'spawning thread'); + } + + my $watch = $zkh->watch(); + + ($thread) = threads->new(\&thread_test, $watch); + + SKIP: { + skip 'no valid thread', 3 unless (defined($thread)); + + my(@ret) = $thread->join; + + ok((@ret == 3 and $ret[0]), + 'watch CLONE_SKIP(): watch handle reference after spawning thread'); + + ok((@ret == 3 and $ret[1]), + 'watch CLONE_SKIP(): scalar watch handle reference after ' . + 'spawning thread'); + + ok((@ret == 3 and $ret[2]), + 'watch CLONE_SKIP(): undef watch handle reference after ' . + 'spawning thread'); + } +} + +sub thread_test +{ + my $zkh = shift; + + my @ret; + + $ret[0] = ref($zkh) ? 1 : 0; + $ret[1] = ($ret[0] and ref($zkh) eq 'SCALAR') ? 1 : 0; + $ret[2] = ($ret[1] and !defined(${$zkh})) ? 1 : 0; + + return @ret; +} + diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/zkperl/t/20_tie.t b/pkg/registry/zookeeper-3.4.6/src/contrib/zkperl/t/20_tie.t new file mode 100644 index 000000000..37e9a4f4e --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/contrib/zkperl/t/20_tie.t @@ -0,0 +1,353 @@ +# Net::ZooKeeper - Perl extension for Apache ZooKeeper +# +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you 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. + +use File::Spec; +use Test::More tests => 54; + +BEGIN { use_ok('Net::ZooKeeper', qw(:all)) }; + + +my $test_dir; +(undef, $test_dir, undef) = File::Spec->splitpath($0); +require File::Spec->catfile($test_dir, 'util.pl'); + +my($hosts, $root_path, $node_path) = zk_test_setup(0); + + +SKIP: { + my $zkh = Net::ZooKeeper->new($hosts); + + skip 'no valid handle', 4 unless (defined($zkh)); + + + ## DESTROY() + + my $attr = tied(%{$zkh}); + + my $ret = $attr->DESTROY(); + ok($ret, + 'DESTROY(): destroyed inner hash'); + + $ret = $attr->DESTROY(); + ok(!$ret, + 'DESTROY(): no action on destroyed inner hash'); + + $ret = $zkh->DESTROY(); + ok(!$ret, + 'DESTROY(): no action on handle with destroyed inner hash'); + + undef $zkh; + ok(!defined($zkh), + 'undef: released handle with destroyed inner hash'); +} + +SKIP: { + my $zkh = Net::ZooKeeper->new($hosts); + + skip 'no valid handle', 49 unless (defined($zkh)); + + + ## TIEHASH(), UNTIE() + + eval { + tie(%{$zkh}, 'Net::ZooKeeper'); + }; + like($@, qr/tying hashes of class Net::ZooKeeper not supported/, + 'tie(): tying hashes not supported'); + + eval { + Net::ZooKeeper::TIEHASH('Net::ZooKeeper'); + }; + like($@, qr/tying hashes of class Net::ZooKeeper not supported/, + 'TIEHASH(): tying hashes not supported'); + + eval { + untie(%{$zkh}); + }; + like($@, qr/untying hashes of class Net::ZooKeeper not supported/, + 'untie(): untying hashes not supported'); + + my $attr = tied(%{$zkh}); + + eval { + $attr->UNTIE(0); + }; + like($@, qr/untying hashes of class Net::ZooKeeper not supported/, + 'UNTIE(): untying hashes not supported'); + + + ## FIRSTKEY(), NEXTKEY(), SCALAR() + + my $copy_zkh; + { + my %copy_zkh = %{$zkh}; + $copy_zkh = \%copy_zkh; + } + bless($copy_zkh, 'Net::ZooKeeper'); + is(ref($copy_zkh), 'Net::ZooKeeper', + 'FIRSTKEY(), NEXTKEY(): copied dereferenced handle'); + + eval { + my $val = $copy_zkh->FIRSTKEY(); + }; + like($@, qr/invalid handle/, + 'FETCHKEY(): invalid handle'); + + eval { + my $val = $copy_zkh->NEXTKEY('data_read_len'); + }; + like($@, qr/invalid handle/, + 'NEXTKEY(): invalid handle'); + + my @keys = keys(%{$zkh}); + is(scalar(@keys), 7, + 'keys(): count of keys from handle'); + + @keys = keys(%{$copy_zkh}); + is(scalar(@keys), 7, + 'keys(): count of keys from copied dereferenced handle'); + + is($attr->FIRSTKEY(), 'data_read_len', + 'FIRSTKEY(): retrieved first key using inner hash'); + + is($attr->NEXTKEY('session_id'), 'pending_watches', + 'NEXTKEY(): retrieved last key using inner hash'); + + is($attr->NEXTKEY('pending_watches'), undef, + 'NEXTKEY(): undef returned after last key using inner hash'); + + ok(scalar(%{$zkh}), + 'scalar(): true value returned for dereferenced handle'); + + ok($zkh->SCALAR(), + 'SCALAR(): true value returned'); + + + ## FETCH() + + eval { + my $val = $copy_zkh->FETCH('data_read_len'); + }; + like($@, qr/invalid handle/, + 'FETCH(): invalid handle'); + + { + my $msg; + + $SIG{'__WARN__'} = sub { $msg = $_[0]; }; + + my $val = $zkh->{'foo'}; + ok(!defined($val), + 'FETCH(): undef returned for invalid element'); + + like($msg, qr/invalid element/, + 'FETCH(): invalid element'); + } + + is($zkh->{'data_read_len'}, 1023, + 'FETCH(): default data read length'); + + is($zkh->{'path_read_len'}, 1023, + 'FETCH(): default path read length'); + + is($zkh->{'hosts'}, $hosts, + 'FETCH(): server hosts'); + + is($zkh->{'session_timeout'}, 10000, + 'FETCH(): default session timeout'); + + ok(defined($zkh->{'session_id'}), + 'FETCH(): session ID'); + + SKIP: { + my $zkh = Net::ZooKeeper->new('0.0.0.0:0'); + + skip 'no valid handle with invalid host', 1 unless (defined($zkh)); + + is($zkh->{'session_id'}, '', + 'FETCH(): empty session ID with invalid host'); + } + + is($zkh->{'pending_watches'}, 0, + 'FETCH(): default pending watch list length'); + + is($attr->FETCH('data_read_len'), 1023, + 'FETCH(): default data read length using inner hash'); + + + ## STORE() + + eval { + my $val = $copy_zkh->STORE('data_read_len', 'foo'); + }; + like($@, qr/invalid handle/, + 'STORE(): invalid handle'); + + { + my $msg; + + $SIG{'__WARN__'} = sub { $msg = $_[0]; }; + + $zkh->{'foo'} = 'foo'; + like($msg, qr/invalid element/, + 'STORE(): invalid element'); + } + + eval { + $zkh->{'data_read_len'} = -3; + }; + like($@, qr/invalid data read length/, + 'STORE(): invalid data read length'); + + eval { + $zkh->{'path_read_len'} = -3; + }; + like($@, qr/invalid path read length/, + 'STORE(): invalid path read length'); + + { + my $msg; + + $SIG{'__WARN__'} = sub { $msg = $_[0]; }; + + $zkh->{'hosts'} = 'foo'; + like($msg, qr/read-only element: hosts/, + 'STORE(): read-only server hosts element'); + } + + { + my $msg; + + $SIG{'__WARN__'} = sub { $msg = $_[0]; }; + + $zkh->{'session_timeout'} = 0; + like($msg, qr/read-only element: session_timeout/, + 'STORE(): read-only session timeout element'); + } + + { + my $msg; + + $SIG{'__WARN__'} = sub { $msg = $_[0]; }; + + $zkh->{'session_id'} = 'foo'; + like($msg, qr/read-only element: session_id/, + 'STORE(): read-only session ID element'); + } + + { + my $msg; + + $SIG{'__WARN__'} = sub { $msg = $_[0]; }; + + $zkh->{'pending_watches'} = 0; + like($msg, qr/read-only element: pending_watches/, + 'STORE(): read-only pending watch list length element'); + } + + $zkh->{'data_read_len'} = 200; + is($zkh->{'data_read_len'}, 200, + 'STORE(): updated data read length'); + + $zkh->{'path_read_len'} = 100; + is($zkh->{'path_read_len'}, 100, + 'STORE(): updated path read length'); + + $attr->STORE('data_read_len', 100); + is($zkh->{'data_read_len'}, 100, + 'STORE(): updated data read length using inner hash'); + + + ## EXISTS() + + eval { + my $val = $copy_zkh->EXISTS('data_read_len'); + }; + like($@, qr/invalid handle/, + 'EXISTS(): invalid handle'); + + ok(!exists($zkh->{'foo'}), + 'exists(): invalid element of handle'); + + ok(exists($zkh->{'data_read_len'}), + 'exists(): data read length'); + + ok(exists($zkh->{'path_read_len'}), + 'exists(): path read length'); + + ok(exists($zkh->{'hosts'}), + 'exists(): server hosts'); + + ok(exists($zkh->{'session_timeout'}), + 'exists(): session timeout'); + + ok(exists($zkh->{'session_id'}), + 'exists(): session ID'); + + ok(exists($zkh->{'pending_watches'}), + 'exists(): pending watch list length'); + + ok($attr->EXISTS('data_read_len'), + 'EXISTS(): data read length using inner hash'); + + + ## DELETE(), CLEAR() + + { + my $msg; + + $SIG{'__WARN__'} = sub { $msg = $_[0]; }; + + delete($zkh->{'data_read_len'}); + like($msg, + qr/deleting elements from hashes of class Net::ZooKeeper not supported/, + 'delete(): deleting hash elements not supported'); + } + + { + my $msg; + + $SIG{'__WARN__'} = sub { $msg = $_[0]; }; + + $zkh->DELETE({'data_read_len'}); + like($msg, + qr/deleting elements from hashes of class Net::ZooKeeper not supported/, + 'DELETE(): deleting hash elements not supported'); + } + + { + my $msg; + + $SIG{'__WARN__'} = sub { $msg = $_[0]; }; + + %{$zkh} = (); + like($msg, qr/clearing hashes of class Net::ZooKeeper not supported/, + 'assign: clearing hashes not supported'); + } + + { + my $msg; + + $SIG{'__WARN__'} = sub { $msg = $_[0]; }; + + $zkh->CLEAR(); + like($msg, qr/clearing hashes of class Net::ZooKeeper not supported/, + 'CLEAR(): clearing hashes not supported'); + } +} + diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/zkperl/t/22_stat_tie.t b/pkg/registry/zookeeper-3.4.6/src/contrib/zkperl/t/22_stat_tie.t new file mode 100644 index 000000000..02e79131d --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/contrib/zkperl/t/22_stat_tie.t @@ -0,0 +1,438 @@ +# Net::ZooKeeper - Perl extension for Apache ZooKeeper +# +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you 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. + +use File::Spec; +use Test::More tests => 66; + +BEGIN { use_ok('Net::ZooKeeper', qw(:all)) }; + + +my $test_dir; +(undef, $test_dir, undef) = File::Spec->splitpath($0); +require File::Spec->catfile($test_dir, 'util.pl'); + +my($hosts, $root_path, $node_path) = zk_test_setup(0); + + +SKIP: { + my $zkh = Net::ZooKeeper->new($hosts); + my $stat = $zkh->stat() if (defined($zkh)); + + skip 'no valid stat handle', 4 unless (defined($stat)); + + + ## DESTROY() + + my $attr = tied(%{$stat}); + + my $ret = $attr->DESTROY(); + ok($ret, + 'stat DESTROY(): destroyed inner stat hash'); + + $ret = $attr->DESTROY(); + ok(!$ret, + 'stat DESTROY(): no action on destroyed inner stat hash'); + + $ret = $stat->DESTROY(); + ok(!$ret, + 'stat DESTROY(): no action on stat handle with destroyed inner hash'); + + undef $stat; + ok(!defined($stat), + 'undef: released stat handle with destroyed inner hash'); +} + +SKIP: { + my $zkh = Net::ZooKeeper->new($hosts); + my $stat = $zkh->stat() if (defined($zkh)); + + skip 'no valid stat handle', 61 unless (defined($stat)); + + + ## TIEHASH(), UNTIE() + + eval { + tie(%{$stat}, 'Net::ZooKeeper::Stat'); + }; + like($@, qr/tying hashes of class Net::ZooKeeper::Stat not supported/, + 'tie(): tying stat hashes not supported'); + + eval { + Net::ZooKeeper::Stat::TIEHASH('Net::ZooKeeper::Stat'); + }; + like($@, qr/tying hashes of class Net::ZooKeeper::Stat not supported/, + 'stat TIEHASH(): tying stat hashes not supported'); + + eval { + untie(%{$stat}); + }; + like($@, qr/untying hashes of class Net::ZooKeeper::Stat not supported/, + 'untie(): untying stat hashes not supported'); + + my $attr = tied(%{$stat}); + + eval { + $attr->UNTIE(0); + }; + like($@, qr/untying hashes of class Net::ZooKeeper::Stat not supported/, + 'stat UNTIE(): untying stat hashes not supported'); + + + ## FIRSTKEY(), NEXTKEY(), SCALAR() + + my $copy_stat; + { + my %copy_stat = %{$stat}; + $copy_stat = \%copy_stat; + } + bless($copy_stat, 'Net::ZooKeeper::Stat'); + is(ref($copy_stat), 'Net::ZooKeeper::Stat', + 'stat FIRSTKEY(), NEXTKEY(): copied dereferenced stat handle'); + + eval { + my $val = $copy_stat->FIRSTKEY(); + }; + like($@, qr/invalid handle/, + 'stat FETCHKEY(): invalid stat handle'); + + eval { + my $val = $copy_stat->NEXTKEY('czxid'); + }; + like($@, qr/invalid handle/, + 'stat NEXTKEY(): invalid stat handle'); + + my @keys = keys(%{$stat}); + is(scalar(@keys), 11, + 'keys(): count of keys from stat handle'); + + @keys = keys(%{$copy_stat}); + is(scalar(@keys), 11, + 'keys(): count of keys from copied dereferenced stat handle'); + + is($attr->FIRSTKEY(), 'czxid', + 'stat FIRSTKEY(): retrieved first key using inner stat hash'); + + is($attr->NEXTKEY('num_children'), 'children_zxid', + 'stat NEXTKEY(): retrieved last key using inner stat hash'); + + is($attr->NEXTKEY('children_zxid'), undef, + 'NEXTKEY(): undef returned after last key using inner stat hash'); + + ok(scalar(%{$stat}), + 'scalar(): true value returned for dereferenced stat handle'); + + ok($stat->SCALAR(), + 'stat SCALAR(): true value returned'); + + + ## FETCH() + + eval { + my $val = $copy_stat->FETCH('version'); + }; + like($@, qr/invalid handle/, + 'stat FETCH(): invalid stat handle'); + + { + my $msg; + + $SIG{'__WARN__'} = sub { $msg = $_[0]; }; + + my $val = $stat->{'foo'}; + ok(!defined($val), + 'stat FETCH(): undef returned for invalid element'); + + like($msg, qr/invalid element/, + 'stat FETCH(): invalid element'); + } + + is($stat->{'czxid'}, 0, + 'stat FETCH(): default node creation ZooKeeper transaction ID'); + + is($stat->{'mzxid'}, 0, + 'stat FETCH(): default data last-modified ZooKeeper transaction ID'); + + is($stat->{'ctime'}, 0, + 'stat FETCH(): default node creation time'); + + is($stat->{'mtime'}, 0, + 'stat FETCH(): default data last-modified time'); + + is($stat->{'version'}, 0, + 'stat FETCH(): default data version'); + + is($stat->{'children_version'}, 0, + 'stat FETCH(): default child node list version'); + + is($stat->{'acl_version'}, 0, + 'stat FETCH(): default ACL version'); + + is($stat->{'ephemeral_owner'}, 0, + 'stat FETCH(): ephemeral node owner session ID'); + + is($stat->{'data_len'}, 0, + 'stat FETCH(): default data length'); + + is($stat->{'num_children'}, 0, + 'stat FETCH(): default child node list length'); + + is($stat->{'children_zxid'}, 0, + 'stat FETCH(): default child node list last-modified ' . + 'ZooKeeper transaction ID'); + + is($attr->FETCH('version'), 0, + 'stat FETCH(): default data version using inner stat hash'); + + + ## STORE() + + eval { + my $val = $copy_stat->STORE('version', 'foo'); + }; + like($@, qr/invalid handle/, + 'stat STORE(): invalid stat handle'); + + { + my $msg; + + $SIG{'__WARN__'} = sub { $msg = $_[0]; }; + + $stat->{'foo'} = 'foo'; + like($msg, qr/invalid element/, + 'stat STORE(): invalid element'); + } + + { + my $msg; + + $SIG{'__WARN__'} = sub { $msg = $_[0]; }; + + $stat->{'czxid'} = 'foo'; + like($msg, qr/read-only element: czxid/, + 'stat STORE(): read-only node creation ' . + 'ZooKeeper transaction ID element'); + } + + { + my $msg; + + $SIG{'__WARN__'} = sub { $msg = $_[0]; }; + + $stat->{'mzxid'} = 'foo'; + like($msg, qr/read-only element: mzxid/, + 'stat STORE(): read-only data last-modified ' . + 'ZooKeeper transaction ID element'); + } + + { + my $msg; + + $SIG{'__WARN__'} = sub { $msg = $_[0]; }; + + $stat->{'ctime'} = 'foo'; + like($msg, qr/read-only element: ctime/, + 'stat STORE(): read-only node creation time element'); + } + + { + my $msg; + + $SIG{'__WARN__'} = sub { $msg = $_[0]; }; + + $stat->{'mtime'} = 'foo'; + like($msg, qr/read-only element: mtime/, + 'stat STORE(): read-only data last-modified time element'); + } + + { + my $msg; + + $SIG{'__WARN__'} = sub { $msg = $_[0]; }; + + $stat->{'version'} = 'foo'; + like($msg, qr/read-only element: version/, + 'stat STORE(): read-only data version element'); + } + + { + my $msg; + + $SIG{'__WARN__'} = sub { $msg = $_[0]; }; + + $stat->{'children_version'} = 'foo'; + like($msg, qr/read-only element: children_version/, + 'stat STORE(): read-only child node list version element'); + } + + { + my $msg; + + $SIG{'__WARN__'} = sub { $msg = $_[0]; }; + + $stat->{'acl_version'} = 'foo'; + like($msg, qr/read-only element: acl_version/, + 'stat STORE(): read-only ACL version element'); + } + + { + my $msg; + + $SIG{'__WARN__'} = sub { $msg = $_[0]; }; + + $stat->{'ephemeral_owner'} = 'foo'; + like($msg, qr/read-only element: ephemeral_owner/, + 'stat STORE(): read-only ephemeral node owner ' . + 'session ID element'); + } + + { + my $msg; + + $SIG{'__WARN__'} = sub { $msg = $_[0]; }; + + $stat->{'data_len'} = 'foo'; + like($msg, qr/read-only element: data_len/, + 'stat STORE(): read-only data length element'); + } + + { + my $msg; + + $SIG{'__WARN__'} = sub { $msg = $_[0]; }; + + $stat->{'num_children'} = 'foo'; + like($msg, qr/read-only element: num_children/, + 'stat STORE(): read-only child node list length element'); + } + + { + my $msg; + + $SIG{'__WARN__'} = sub { $msg = $_[0]; }; + + $stat->{'children_zxid'} = 'foo'; + like($msg, qr/read-only element: children_zxid/, + 'stat STORE(): read-only child node list last-modified ' . + 'ZooKeeper transaction ID element'); + } + + { + my $msg; + + $SIG{'__WARN__'} = sub { $msg = $_[0]; }; + + $attr->STORE('version', 'foo'); + like($msg, qr/read-only element: version/, + 'stat STORE(): read-only data version element using ' . + 'inner stat hash'); + } + + + ## EXISTS() + + eval { + my $val = $copy_stat->EXISTS('version'); + }; + like($@, qr/invalid handle/, + 'stat EXISTS(): invalid stat handle'); + + ok(!exists($stat->{'foo'}), + 'exists(): invalid element of stat handle'); + + ok(exists($stat->{'czxid'}), + 'exists(): node creation ZooKeeper transaction ID'); + + ok(exists($stat->{'mzxid'}), + 'exists(): data last-modified ZooKeeper transaction ID'); + + ok(exists($stat->{'ctime'}), + 'exists(): node creation time'); + + ok(exists($stat->{'mtime'}), + 'exists(): data last-modified time'); + + ok(exists($stat->{'version'}), + 'exists(): data version'); + + ok(exists($stat->{'children_version'}), + 'exists(): child node list version'); + + ok(exists($stat->{'acl_version'}), + 'exists(): ACL version'); + + ok(exists($stat->{'ephemeral_owner'}), + 'exists(): ephemeral node owner session ID'); + + ok(exists($stat->{'data_len'}), + 'exists(): data length'); + + ok(exists($stat->{'num_children'}), + 'exists(): child node list length'); + + ok(exists($stat->{'children_zxid'}), + 'exists(): child node list last-modified ZooKeeper transaction ID'); + + ok($attr->EXISTS('version'), + 'stat EXISTS(): data version using inner stat hash'); + + + ## DELETE(), CLEAR() + + { + my $msg; + + $SIG{'__WARN__'} = sub { $msg = $_[0]; }; + + delete($stat->{'version'}); + like($msg, + qr/deleting elements from hashes of class Net::ZooKeeper::Stat not supported/, + 'delete(): deleting stat hash elements not supported'); + } + + { + my $msg; + + $SIG{'__WARN__'} = sub { $msg = $_[0]; }; + + $stat->DELETE({'version'}); + like($msg, + qr/deleting elements from hashes of class Net::ZooKeeper::Stat not supported/, + 'stat DELETE(): deleting stat hash elements not supported'); + } + + { + my $msg; + + $SIG{'__WARN__'} = sub { $msg = $_[0]; }; + + %{$stat} = (); + like($msg, qr/clearing hashes of class Net::ZooKeeper::Stat not supported/, + 'assign: clearing stat hashes not supported'); + } + + { + my $msg; + + $SIG{'__WARN__'} = sub { $msg = $_[0]; }; + + $stat->CLEAR(); + like($msg, qr/clearing hashes of class Net::ZooKeeper::Stat not supported/, + 'stat CLEAR(): clearing stat hashes not supported'); + } +} + diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/zkperl/t/24_watch_tie.t b/pkg/registry/zookeeper-3.4.6/src/contrib/zkperl/t/24_watch_tie.t new file mode 100644 index 000000000..e77879e62 --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/contrib/zkperl/t/24_watch_tie.t @@ -0,0 +1,292 @@ +# Net::ZooKeeper - Perl extension for Apache ZooKeeper +# +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you 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. + +use File::Spec; +use Test::More tests => 42; + +BEGIN { use_ok('Net::ZooKeeper', qw(:all)) }; + + +my $test_dir; +(undef, $test_dir, undef) = File::Spec->splitpath($0); +require File::Spec->catfile($test_dir, 'util.pl'); + +my($hosts, $root_path, $node_path) = zk_test_setup(0); + + +SKIP: { + my $zkh = Net::ZooKeeper->new($hosts); + my $watch = $zkh->watch() if (defined($zkh)); + + skip 'no valid watch handle', 4 unless (defined($watch)); + + + ## DESTROY() + + my $attr = tied(%{$watch}); + + my $ret = $attr->DESTROY(); + ok($ret, + 'watch DESTROY(): destroyed inner watch hash'); + + $ret = $attr->DESTROY(); + ok(!$ret, + 'watch DESTROY(): no action on destroyed inner watch hash'); + + $ret = $watch->DESTROY(); + ok(!$ret, + 'watch DESTROY(): no action on watch handle with destroyed inner hash'); + + undef $watch; + ok(!defined($watch), + 'undef: released watch handle with destroyed inner hash'); +} + +SKIP: { + my $zkh = Net::ZooKeeper->new($hosts); + my $watch = $zkh->watch() if (defined($zkh)); + + skip 'no valid watch handle', 37 unless (defined($watch)); + + + ## TIEHASH(), UNTIE() + + eval { + tie(%{$watch}, 'Net::ZooKeeper::Watch'); + }; + like($@, qr/tying hashes of class Net::ZooKeeper::Watch not supported/, + 'tie(): tying watch hashes not supported'); + + eval { + Net::ZooKeeper::Watch::TIEHASH('Net::ZooKeeper::Watch'); + }; + like($@, qr/tying hashes of class Net::ZooKeeper::Watch not supported/, + 'watch TIEHASH(): tying watch hashes not supported'); + + eval { + untie(%{$watch}); + }; + like($@, qr/untying hashes of class Net::ZooKeeper::Watch not supported/, + 'untie(): untying watch hashes not supported'); + + my $attr = tied(%{$watch}); + + eval { + $attr->UNTIE(0); + }; + like($@, qr/untying hashes of class Net::ZooKeeper::Watch not supported/, + 'watch UNTIE(): untying watch hashes not supported'); + + + ## FIRSTKEY(), NEXTKEY(), SCALAR() + + my $copy_watch; + { + my %copy_watch = %{$watch}; + $copy_watch = \%copy_watch; + } + bless($copy_watch, 'Net::ZooKeeper::Watch'); + is(ref($copy_watch), 'Net::ZooKeeper::Watch', + 'watch FIRSTKEY(), NEXTKEY(): copied dereferenced watch handle'); + + eval { + my $val = $copy_watch->FIRSTKEY(); + }; + like($@, qr/invalid handle/, + 'watch FETCHKEY(): invalid watch handle'); + + eval { + my $val = $copy_watch->NEXTKEY('czxid'); + }; + like($@, qr/invalid handle/, + 'watch NEXTKEY(): invalid watch handle'); + + my @keys = keys(%{$watch}); + is(scalar(@keys), 3, + 'keys(): count of keys from watch handle'); + + @keys = keys(%{$copy_watch}); + is(scalar(@keys), 3, + 'keys(): count of keys from copied dereferenced watch handle'); + + is($attr->FIRSTKEY(), 'timeout', + 'watch FIRSTKEY(): retrieved first key using inner watch hash'); + + is($attr->NEXTKEY('event'), 'state', + 'watch NEXTKEY(): retrieved last key using inner watch hash'); + + is($attr->NEXTKEY('state'), undef, + 'NEXTKEY(): undef returned after last key using inner watch hash'); + + ok(scalar(%{$watch}), + 'scalar(): true value returned for dereferenced watch handle'); + + ok($watch->SCALAR(), + 'watch SCALAR(): true value returned'); + + + ## FETCH() + + eval { + my $val = $copy_watch->FETCH('version'); + }; + like($@, qr/invalid handle/, + 'watch FETCH(): invalid watch handle'); + + { + my $msg; + + $SIG{'__WARN__'} = sub { $msg = $_[0]; }; + + my $val = $watch->{'foo'}; + ok(!defined($val), + 'watch FETCH(): undef returned for invalid element'); + + like($msg, qr/invalid element/, + 'watch FETCH(): invalid element'); + } + + is($watch->{'timeout'}, 60000, + 'watch FETCH(): default timeout'); + + is($watch->{'event'}, 0, + 'watch FETCH(): default event'); + + is($watch->{'state'}, 0, + 'watch FETCH(): default state'); + + is($attr->FETCH('timeout'), 60000, + 'watch FETCH(): default timeout using inner watch hash'); + + + ## STORE() + + eval { + my $val = $copy_watch->STORE('version', 'foo'); + }; + like($@, qr/invalid handle/, + 'watch STORE(): invalid watch handle'); + + { + my $msg; + + $SIG{'__WARN__'} = sub { $msg = $_[0]; }; + + $watch->{'foo'} = 'foo'; + like($msg, qr/invalid element/, + 'watch STORE(): invalid element'); + } + + { + my $msg; + + $SIG{'__WARN__'} = sub { $msg = $_[0]; }; + + $watch->{'event'} = 'foo'; + like($msg, qr/read-only element: event/, + 'watch STORE(): read-only event element'); + } + + { + my $msg; + + $SIG{'__WARN__'} = sub { $msg = $_[0]; }; + + $watch->{'state'} = 'foo'; + like($msg, qr/read-only element: state/, + 'watch STORE(): read-only state element'); + } + + $watch->{'timeout'} = 100; + is($watch->{'timeout'}, 100, + 'watch STORE(): updated timeout'); + + $attr->STORE('timeout', 200); + is($watch->{'timeout'}, 200, + 'watch STORE(): updated timeout using inner hash'); + + + ## EXISTS() + + eval { + my $val = $copy_watch->EXISTS('version'); + }; + like($@, qr/invalid handle/, + 'watch EXISTS(): invalid watch handle'); + + ok(!exists($watch->{'foo'}), + 'exists(): invalid element of watch handle'); + + ok(exists($watch->{'timeout'}), + 'exists(): timeout'); + + ok(exists($watch->{'event'}), + 'exists(): event'); + + ok(exists($watch->{'state'}), + 'exists(): state'); + + ok($attr->EXISTS('timeout'), + 'watch EXISTS(): timeout using inner watch hash'); + + + ## DELETE(), CLEAR() + + { + my $msg; + + $SIG{'__WARN__'} = sub { $msg = $_[0]; }; + + delete($watch->{'version'}); + like($msg, + qr/deleting elements from hashes of class Net::ZooKeeper::Watch not supported/, + 'delete(): deleting watch hash elements not supported'); + } + + { + my $msg; + + $SIG{'__WARN__'} = sub { $msg = $_[0]; }; + + $watch->DELETE({'version'}); + like($msg, + qr/deleting elements from hashes of class Net::ZooKeeper::Watch not supported/, + 'watch DELETE(): deleting watch hash elements not supported'); + } + + { + my $msg; + + $SIG{'__WARN__'} = sub { $msg = $_[0]; }; + + %{$watch} = (); + like($msg, qr/clearing hashes of class Net::ZooKeeper::Watch not supported/, + 'assign: clearing watch hashes not supported'); + } + + { + my $msg; + + $SIG{'__WARN__'} = sub { $msg = $_[0]; }; + + $watch->CLEAR(); + like($msg, qr/clearing hashes of class Net::ZooKeeper::Watch not supported/, + 'watch CLEAR(): clearing watch hashes not supported'); + } +} + diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/zkperl/t/30_connect.t b/pkg/registry/zookeeper-3.4.6/src/contrib/zkperl/t/30_connect.t new file mode 100644 index 000000000..c2b68bb4e --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/contrib/zkperl/t/30_connect.t @@ -0,0 +1,202 @@ +# Net::ZooKeeper - Perl extension for Apache ZooKeeper +# +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you 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. + +use File::Spec; +use Test::More tests => 29; + +BEGIN { use_ok('Net::ZooKeeper', qw(:all)) }; + + +my $test_dir; +(undef, $test_dir, undef) = File::Spec->splitpath($0); +require File::Spec->catfile($test_dir, 'util.pl'); + +my($hosts, $root_path, $node_path) = zk_test_setup(0); + + +## new(), DESTROY() + +Net::ZooKeeper::set_deterministic_conn_order(1); + +my $zkh = Net::ZooKeeper->new($hosts); +isa_ok($zkh, 'Net::ZooKeeper', + 'new(): created handle'); + +SKIP: { + skip 'no valid handle', 3 unless (defined($zkh)); + + my $ret = $zkh->DESTROY(); + ok($ret, + 'DESTROY(): destroyed handle'); + + $ret = $zkh->DESTROY(); + ok(!$ret, + 'DESTROY(): no action on destroyed handle'); + + undef $zkh; + ok(!defined($zkh), + 'undef: released handle'); +} + +Net::ZooKeeper::set_deterministic_conn_order(0); + +SKIP: { + my $zkh = Net::ZooKeeper->new($hosts); + + skip 'no valid handle', 10 unless (defined($zkh)); + + my $copy_zkh = $zkh; + isa_ok($copy_zkh, 'Net::ZooKeeper', + 'assign: copied handle'); + + my $ret = $zkh->exists($root_path); + ok(defined($ret), + 'exists(): no error from original handle'); + + undef $zkh; + ok(!defined($zkh), + 'undef: released original handle'); + + $ret = $copy_zkh->exists($root_path); + ok(defined($ret), + 'exists(): no error from first copy of handle'); + + $zkh = $copy_zkh; + isa_ok($zkh, 'Net::ZooKeeper', + 'assign: re-copied handle'); + + $ret = $copy_zkh->DESTROY(); + ok($ret, + 'DESTROY(): destroyed first copy of handle'); + + eval { + $zkh->exists($root_path); + }; + like($@, qr/invalid handle/, + 'exists(): invalid second copy of handle'); + + undef $copy_zkh; + ok(!defined($copy_zkh), + 'undef: released first copy of handle'); + + $ret = $zkh->DESTROY(); + ok(!$ret, + 'DESTROY(): no action on second copy of destroyed handle'); + + undef $zkh; + ok(!defined($zkh), + 'undef: released second copy of handle'); +} + +SKIP: { + my $zkh = Net::ZooKeeper->new($hosts); + + skip 'no valid handle', 6 unless (defined($zkh)); + + my $copy_zkh; + { + my %copy_zkh = %{$zkh}; + $copy_zkh = \%copy_zkh; + } + bless($copy_zkh, 'Net::ZooKeeper'); + isa_ok($copy_zkh, 'Net::ZooKeeper', + 'FIRSTKEY(), NEXTKEY(): copied dereferenced handle'); + + eval { + $copy_zkh->exists($root_path); + }; + like($@, qr/invalid handle/, + 'exists(): invalid copy of dereferenced handle'); + + $ret = $copy_zkh->DESTROY(); + ok(!$ret, + 'DESTROY(): no action on copy of dereferenced handle'); + + undef $copy_zkh; + ok(!defined($copy_zkh), + 'undef: released copy of dereferenced handle'); + + my $ret = $zkh->exists($root_path); + ok(defined($ret), + 'exists(): no error from original handle'); + + undef $zkh; + ok(!defined($zkh), + 'undef: released original handle'); +} + +Net::ZooKeeper::set_deterministic_conn_order(1); + +my $zkh1 = Net::ZooKeeper->new($hosts, 'session_timeout' => 0x3FFF_FFFF); +isa_ok($zkh1, 'Net::ZooKeeper', + 'new(): created handle with maximum session timeout'); + +SKIP: { + my $ret = $zkh1->exists($root_path) if (defined($zkh1)); + + skip 'no connection to ZooKeeper', 7 unless + (defined($ret) and $ret); + + + ## FETCH() of read-only attributes + + ok(($zkh1->{'session_timeout'} > 0 and + $zkh1->{'session_timeout'} <= 0x3FFF_FFFF), + 'FETCH(): session timeout reset after connection'); + + my $session_id1 = $zkh1->{'session_id'}; + ok((length($session_id1) > 0), + 'FETCH(): non-empty session ID after connection'); + + SKIP: { + skip 'no session ID after connection', 1 unless + (length($session_id1) > 0); + + my @nonzero_bytes = grep($_ != 0, unpack('c' x length($session_id1), + $session_id1)); + ok((@nonzero_bytes > 0), + 'FETCH(): non-zero session ID after connection'); + } + + ## NOTE: to test re-connections with saved session IDs we create a second + ## connection with the same ID while the first is still active; + ## this is bad practice in normal usage + + my $zkh2 = Net::ZooKeeper->new($hosts, + 'session_id' => $session_id1, + 'session_timeout' => 20000); + isa_ok($zkh2, 'Net::ZooKeeper', + 'new(): created handle with session ID and valid session timeout'); + + $ret = $zkh2->exists($root_path); + ok($ret, + 'new(): reconnection with session ID'); + + SKIP: { + skip 'no connection to ZooKeeper', 2 unless ($ret); + + is($zkh2->{'session_timeout'}, 20000, + 'FETCH(): session timeout unchanged after connection'); + + my $session_id2 = $zkh2->{'session_id'}; + ok((length($session_id2) == length($session_id1) + and $session_id2 eq $session_id1), + 'FETCH(): reconnect with session ID'); + } +} + diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/zkperl/t/35_log.t b/pkg/registry/zookeeper-3.4.6/src/contrib/zkperl/t/35_log.t new file mode 100644 index 000000000..92821afc1 --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/contrib/zkperl/t/35_log.t @@ -0,0 +1,88 @@ +# Net::ZooKeeper - Perl extension for Apache ZooKeeper +# +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you 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. + +use File::Spec; +use Test::More tests => 3; + +BEGIN { use_ok('Net::ZooKeeper', qw(:all)) }; + + +my $test_dir; +(undef, $test_dir, undef) = File::Spec->splitpath($0); +require File::Spec->catfile($test_dir, 'util.pl'); + +my($hosts, $root_path, $node_path) = zk_test_setup(0); + + +my $zkh = Net::ZooKeeper->new($hosts); + +Net::ZooKeeper::set_log_level(ZOO_LOG_LEVEL_INFO); + +SKIP: { + skip 'no valid handle', 2 unless (defined($zkh)); + + SKIP: { + my $dup = 0; + + if (open(OLDERR, '>&', fileno(STDERR))) { + if (close(STDERR) and open(STDERR, '+>', undef)) { + $dup = 1; + + my $old_select = select(STDERR); + $| = 1; + select($old_select); + } + else { + open(STDERR, '>&', fileno(OLDERR)); + close(OLDERR); + } + } + + skip 'no duplicated stderr', 2 unless ($dup); + + SKIP: { + $zkh->exists($root_path); + + sleep(1); + + skip 'no seek on stderr', 1 unless (seek(STDERR, 0, 0)); + + my $log = ; + like($log, qr/ZOO_/, + 'exists(): generated log message'); + } + + SKIP: { + $zkh->DESTROY(); + + sleep(1); + + skip 'no seek on stderr', 1 unless (seek(STDERR, 0, 0)); + + my $log = ; + like($log, qr/ZOO_/, + 'DESTROY(): generated log message'); + } + + open(STDERR, '>&', fileno(OLDERR)); + close(OLDERR); + } +} + +Net::ZooKeeper::set_log_level(ZOO_LOG_LEVEL_OFF); + diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/zkperl/t/40_basic.t b/pkg/registry/zookeeper-3.4.6/src/contrib/zkperl/t/40_basic.t new file mode 100644 index 000000000..38a8a2138 --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/contrib/zkperl/t/40_basic.t @@ -0,0 +1,277 @@ +# Net::ZooKeeper - Perl extension for Apache ZooKeeper +# +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you 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. + +use File::Spec; +use Test::More tests => 35; + +BEGIN { use_ok('Net::ZooKeeper', qw(:all)) }; + + +my $test_dir; +(undef, $test_dir, undef) = File::Spec->splitpath($0); +require File::Spec->catfile($test_dir, 'util.pl'); + +my($hosts, $root_path, $node_path) = zk_test_setup(0); + + +my $zkh = Net::ZooKeeper->new($hosts); +my $path; + +SKIP: { + my $ret = $zkh->exists($root_path) if (defined($zkh)); + + skip 'no connection to ZooKeeper', 1 unless + (defined($ret) and $ret); + + $path = $zkh->create($node_path, 'foo', 'acl' => ZOO_OPEN_ACL_UNSAFE); + is($path, $node_path, + 'create(): created node'); +} + +SKIP: { + skip 'no connection to ZooKeeper', 21 unless + (defined($path) and $path eq $node_path); + + + ## exists() + + my $ret = $zkh->exists($node_path); + ok($ret, + 'exists(): checked node existence'); + + $ret = $zkh->exists($node_path . '/NONE'); + ok((!$ret and $zkh->get_error() == ZNONODE and $! eq ''), + 'exists(): checked node non-existence'); + + my $stat = $zkh->stat(); + + $ret = $zkh->exists($node_path, 'stat' => $stat); + ok(($ret and $stat->{'data_len'} == 3), + 'exists(): checked node existence with stat handle'); + + + ## get() + + my $node = $zkh->get($node_path); + is($node, 'foo', + 'get(): retrieved node value'); + + $node = $zkh->get($node_path . '/NONE'); + ok((!defined($node) and $zkh->get_error() == ZNONODE and $! eq ''), + 'get(): undef returned for non-extant node'); + + $node = $zkh->get($node_path, 'data_read_len', 2); + is($node, 'fo', + 'get(): retrieved truncated node value'); + + $node = $zkh->get($node_path, 'data_read_len' => 0); + is($node, '', + 'get(): retrieved zero-length node value'); + + $node = $zkh->get($node_path, 'stat' => $stat); + ok(($node eq 'foo' and $stat->{'data_len'} == 3), + 'get(): retrieved node value with stat handle'); + + + ## set() + + $ret = $zkh->set($node_path, 'foo'); + ok($ret, + 'set(): set node value'); + + SKIP: { + my $ret = $zkh->exists($node_path, 'stat' => $stat); + + skip 'invalid node data', 2 unless + ($ret and $stat->{'version'} == 1); + + $ret = $zkh->set($node_path, 'foo', 'version' => $stat->{'version'}); + ok($ret, + 'set(): set node value with matching version'); + + $ret = $zkh->set($node_path, 'foo', 'version' => $stat->{'version'}); + ok((!$ret and $zkh->get_error() == ZBADVERSION and $! eq ''), + 'set(): node value unchanged if non-matching version'); + } + + $ret = $zkh->set($node_path, 'foobaz', 'stat' => $stat); + ok(($ret and $stat->{'data_len'} == 6), + 'set(): retrieved node value with stat handle'); + + + ## create(), delete() + + $path = $zkh->create($node_path, 'foo', 'acl' => ZOO_OPEN_ACL_UNSAFE); + ok((!defined($path) and $zkh->get_error() == ZNODEEXISTS and $! eq ''), + 'create(): undef when attempting to create extant node'); + + $ret = $zkh->delete($node_path . '/NONE'); + ok((!$ret and $zkh->get_error() == ZNONODE and $! eq ''), + 'delete(): no deletion of non-extant node'); + + $ret = $zkh->delete($node_path); + ok($ret, + 'delete(): deleted node'); + + my $path_read_len = length($node_path) - 2; + + $path = $zkh->create($node_path, 'foo', + 'path_read_len' => $path_read_len, + 'acl' => ZOO_OPEN_ACL_UNSAFE); + is($path, substr($node_path, 0, -2), + 'create(): created node with small return path buffer'); + + $path = $zkh->create("$node_path/s", 'foo', + 'flags' => ZOO_SEQUENCE, + 'acl' => ZOO_OPEN_ACL_UNSAFE); + like($path, qr/^$node_path\/s[0-9]+$/, + 'create(): created sequential node'); + + SKIP: { + my $ret = $zkh->exists($path, 'stat' => $stat); + + unless ($ret and $stat->{'version'} == 0) { + my $ret = $zkh->delete($path); + diag(sprintf('unable to delete node %s: %d, %s', + $path, $zkh->get_error(), $!)) unless ($ret); + + skip 'invalid node data', 2; + } + + $ret = $zkh->delete($path, 'version' => ($stat->{'version'} + 1)); + ok((!$ret and $zkh->get_error() == ZBADVERSION and $! eq ''), + 'delete(): node not deleted if non-matching version'); + + $ret = $zkh->delete($path, 'version' => $stat->{'version'}); + ok($ret, + 'delete(): deleted sequential node with matching version'); + } + + $path = $zkh->create("$node_path/e", 'foo', + 'flags' => ZOO_EPHEMERAL, + 'acl' => ZOO_OPEN_ACL_UNSAFE); + is($path, "$node_path/e", + 'create(): created ephemeral node'); + + $path = $zkh->create("$node_path/es", 'foo', + 'flags' => (ZOO_SEQUENCE | ZOO_EPHEMERAL), + 'acl' => ZOO_OPEN_ACL_UNSAFE); + like($path, qr/^$node_path\/es[0-9]+$/, + 'create(): created ephemeral sequential node'); + + undef $zkh; +} + +$zkh = Net::ZooKeeper->new($hosts); + +SKIP: { + my $ret = $zkh->exists($node_path) if (defined($zkh)); + + skip 'no connection to ZooKeeper', 12 unless + (defined($ret) and $ret); + + $ret = $zkh->exists("$node_path/e"); + ok((!$ret and $zkh->get_error() == ZNONODE and $! eq ''), + 'exists(): checked ephemeral node non-extant after reconnection'); + + $ret = $zkh->exists($path); + ok((!$ret and $zkh->get_error() == ZNONODE and $! eq ''), + 'exists(): checked ephemeral sequential node non-extant ' . + 'after reconnection'); + + + ## get_children() + + my @child_paths = ('abc'); + @child_paths = $zkh->get_children($node_path); + ok((@child_paths == 0 and $zkh->get_error() == ZOK), + 'get_children(): retrieved empty list of child nodes'); + + my $num_children = $zkh->get_children($node_path); + ok((defined($num_children) and $num_children == 0), + 'get_children(): retrieved zero count of child nodes'); + + @child_paths = $zkh->get_children($node_path . '/NONE'); + ok((@child_paths == 0 and $zkh->get_error() == ZNONODE and $! eq ''), + 'get_children(): empty list returned for non-extant node'); + + $num_children = $zkh->get_children($node_path . '/NONE'); + ok((!defined($num_children) and $zkh->get_error() == ZNONODE and $! eq ''), + 'get_children(): undef returned for non-extant node'); + + SKIP: { + my $path = $zkh->create("$node_path/c1", 'foo', + 'acl' => ZOO_OPEN_ACL_UNSAFE); + + skip 'no connection to ZooKeeper', 6 unless + (defined($path) and $path eq "$node_path/c1"); + + my @child_paths = ('abc'); + @child_paths = $zkh->get_children($node_path); + ok((@child_paths == 1 and $child_paths[0] eq 'c1'), + 'get_children(): retrieved list of single child node'); + + my $num_children = $zkh->get_children($node_path); + ok((defined($num_children) and $num_children == 1), + 'get_children(): retrieved count of single child node'); + + SKIP: { + my $path = $zkh->create("$node_path/c2", 'foo', + 'acl' => ZOO_OPEN_ACL_UNSAFE); + + skip 'no connection to ZooKeeper', 2 unless + (defined($path) and $path eq "$node_path/c2"); + + my @child_paths = ('abc'); + @child_paths = $zkh->get_children($node_path); + ok((@child_paths == 2 and $child_paths[0] eq 'c1' and + $child_paths[1] eq 'c2'), + 'get_children(): retrieved list of two child nodes'); + + my $num_children = $zkh->get_children($node_path); + ok((defined($num_children) and $num_children == 2), + 'get_children(): retrieved count of two child nodes'); + + my $ret = $zkh->delete("$node_path/c2"); + diag(sprintf('unable to delete node %s: %d, %s', + "$node_path/c2", $zkh->get_error(), $!)) unless + ($ret); + } + + @child_paths = ('abc'); + @child_paths = $zkh->get_children($node_path); + ok((@child_paths == 1 and $child_paths[0] eq 'c1'), + 'get_children(): retrieved list of single child node'); + + $num_children = $zkh->get_children($node_path); + ok((defined($num_children) and $num_children == 1), + 'get_children(): retrieved count of single child node'); + + my $ret = $zkh->delete("$node_path/c1"); + diag(sprintf('unable to delete node %s: %d, %s', + "$node_path/c1", $zkh->get_error(), $!)) unless ($ret); + } + + + ## cleanup + + $ret = $zkh->delete($node_path); + diag(sprintf('unable to delete node %s: %d, %s', + $node_path, $zkh->get_error(), $!)) unless ($ret); +} + diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/zkperl/t/45_class.t b/pkg/registry/zookeeper-3.4.6/src/contrib/zkperl/t/45_class.t new file mode 100644 index 000000000..4aa1a5733 --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/contrib/zkperl/t/45_class.t @@ -0,0 +1,408 @@ +# Net::ZooKeeper - Perl extension for Apache ZooKeeper +# +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you 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. + +use File::Spec; +use Test::More tests => 47; + +BEGIN { use_ok('Net::ZooKeeper', qw(:all)) }; + + +my $test_dir; +(undef, $test_dir, undef) = File::Spec->splitpath($0); +require File::Spec->catfile($test_dir, 'util.pl'); + +my($hosts, $root_path, $node_path) = zk_test_setup(0); + + +SKIP: { + my $zkh = Net::ZooKeeper->new($hosts); + + skip 'no valid handle', 15 unless (defined($zkh)); + + my $stat = $zkh->stat(); + my $watch = $zkh->watch(); + + + ## DESTROY() on reblessed handle + + bless($zkh, 'My::ZooKeeper'); + is(ref($zkh), 'My::ZooKeeper', + 'bless(): reblessed handle'); + + eval { + $zkh->EXISTS(); + }; + like($@, qr/Can't locate object method "EXISTS" via package "My::ZooKeeper"/, + 'EXISTS(): not defined on reblessed handle'); + + my $attr = tied(%{$zkh}); + + my $ret = $attr->DESTROY(); + ok($ret, + 'DESTROY(): destroyed inner hash of reblessed handle'); + + $ret = $attr->DESTROY(); + ok(!$ret, + 'DESTROY(): no action on destroyed inner hash of reblessed handle'); + + undef $zkh; + ok(!defined($zkh), + 'undef: released reblessed handle'); + + + ## DESTROY() on reblessed stat handle + + bless($stat, 'My::ZooKeeper::Stat'); + is(ref($stat), 'My::ZooKeeper::Stat', + 'bless(): reblessed stat handle'); + + eval { + $stat->EXISTS(1); + }; + like($@, qr/Can't locate object method "EXISTS" via package "My::ZooKeeper::Stat"/, + 'stat EXISTS(): not defined on reblessed stat handle'); + + $attr = tied(%{$stat}); + + $ret = $attr->DESTROY(); + ok($ret, + 'stat DESTROY(): destroyed inner hash of reblessed stat handle'); + + $ret = $attr->DESTROY(); + ok(!$ret, + 'stat DESTROY(): no action on destroyed inner hash of ' . + 'reblessed stat handle'); + + undef $stat; + ok(!defined($stat), + 'undef: released reblessed stat handle'); + + + ## DESTROY() on reblessed watch handle + + bless($watch, 'My::ZooKeeper::Watch'); + is(ref($watch), 'My::ZooKeeper::Watch', + 'bless(): reblessed watch handle'); + + eval { + $watch->EXISTS(1); + }; + like($@, qr/Can't locate object method "EXISTS" via package "My::ZooKeeper::Watch"/, + 'watch EXISTS(): not defined on reblessed watch handle'); + + $attr = tied(%{$watch}); + + $ret = $attr->DESTROY(); + ok($ret, + 'watch DESTROY(): destroyed inner hash of reblessed watch handle'); + + $ret = $attr->DESTROY(); + ok(!$ret, + 'watch DESTROY(): no action on destroyed inner hash of ' . + 'reblessed watch handle'); + + undef $watch; + ok(!defined($watch), + 'undef: released reblessed watch handle'); +} + +SKIP: { + my $zkh = Net::ZooKeeper->new($hosts); + + skip 'no valid handle', 9 unless (defined($zkh)); + + my $stat = $zkh->stat(); + my $watch = $zkh->watch(); + + + ## UNTIE() on reblessed handle + + bless($zkh, 'My::ZooKeeper'); + is(ref($zkh), 'My::ZooKeeper', + 'bless(): reblessed handle'); + + eval { + untie(%{$zkh}); + }; + like($@, qr/untying hashes of class Net::ZooKeeper not supported/, + 'untie(): untying hashes from reblessed handle not supported'); + + my $attr = tied(%{$zkh}); + + eval { + $attr->UNTIE(0); + }; + like($@, qr/untying hashes of class Net::ZooKeeper not supported/, + 'UNTIE(): untying hashes from reblessed handle not supported'); + + + ## UNTIE() on reblessed stat handle + + bless($stat, 'My::ZooKeeper::Stat'); + is(ref($stat), 'My::ZooKeeper::Stat', + 'bless(): reblessed stat handle'); + + eval { + untie(%{$stat}); + }; + like($@, qr/untying hashes of class Net::ZooKeeper::Stat not supported/, + 'untie(): untying hashes from reblessed stat handle not supported'); + + $attr = tied(%{$stat}); + + eval { + $attr->UNTIE(0); + }; + like($@, qr/untying hashes of class Net::ZooKeeper::Stat not supported/, + 'stat UNTIE(): untying hashes from reblessed stat handle ' . + 'not supported'); + + + ## UNTIE() on reblessed watch handle + + bless($watch, 'My::ZooKeeper::Watch'); + is(ref($watch), 'My::ZooKeeper::Watch', + 'bless(): reblessed watch handle'); + + eval { + untie(%{$watch}); + }; + like($@, qr/untying hashes of class Net::ZooKeeper::Watch not supported/, + 'untie(): untying hashes from reblessed watch handle not supported'); + + $attr = tied(%{$watch}); + + eval { + $attr->UNTIE(0); + }; + like($@, qr/untying hashes of class Net::ZooKeeper::Watch not supported/, + 'watch UNTIE(): untying hashes from reblessed watch handle ' . + 'not supported'); +} + + +package Net::ZooKeeper::Test; + +use Net::ZooKeeper qw(:acls); + +our @ISA = qw(Net::ZooKeeper); + +sub create +{ + my($self, $path, $buf) = @_; + + return $self->SUPER::create($path, $buf, + 'path_read_len' => length($path), + 'acl' => ZOO_OPEN_ACL_UNSAFE); +} + +sub get_first_child +{ + my($self, $path) = @_; + + my @child_paths = $self->get_children($path); + + if (@child_paths > 0) { + return $path . (($path =~ /\/$/) ? '' : '/') . $child_paths[0]; + } + + return undef; +} + +sub stat +{ + my $self = shift; + + my $stat = $self->SUPER::stat(); + + return bless($stat, 'Net::ZooKeeper::Test::Stat'); +} + + +sub watch +{ + my $self = shift; + + my $watch = $self->SUPER::watch(); + + return bless($watch, 'Net::ZooKeeper::Test::Watch'); +} + + +package Net::ZooKeeper::Test::Stat; + +our @ISA = qw(Net::ZooKeeper::Stat); + +sub get_ctime +{ + my $self = shift; + + return $self->{'ctime'}; +} + + +package Net::ZooKeeper::Test::Watch; + +our @ISA = qw(Net::ZooKeeper::Watch); + +sub get_timeout +{ + my $self = shift; + + return $self->{'timeout'}; +} + + +package main; + +my $sub_zkh = Net::ZooKeeper::Test->new($hosts); +isa_ok($sub_zkh, 'Net::ZooKeeper::Test', + 'new(): created subclassed handle'); + +SKIP: { + skip 'no valid subclassed handle', 21 unless (defined($sub_zkh)); + + is($sub_zkh->{'data_read_len'}, 1023, + 'FETCH(): default data read length using subclassed handle'); + + my $path; + + SKIP: { + my $ret = $sub_zkh->exists($root_path); + + skip 'no connection to ZooKeeper', 1 unless + (defined($ret) and $ret); + + $path = $sub_zkh->create($node_path, 'foo', + 'acl' => ZOO_OPEN_ACL_UNSAFE); + is($path, $node_path, + 'create(): created node with subclassed handle'); + } + + SKIP: { + skip 'no connection to ZooKeeper', 1 unless + (defined($path) and $path eq $node_path); + + my $child_path = $sub_zkh->get_first_child($root_path); + is($child_path, $node_path, + 'get_first_child(): retrieved first child with subclassed handle'); + } + + my $sub_stat = $sub_zkh->stat(); + isa_ok($sub_stat, 'Net::ZooKeeper::Test::Stat', + 'stat(): created subclassed stat handle'); + + SKIP: { + skip 'no valid subclassed stat handle', 6 unless + (defined($sub_stat)); + + is($sub_stat->{'ctime'}, 0, + 'stat FETCH(): default ctime using subclassed stat handle'); + + SKIP: { + my $ret = $sub_zkh->exists($node_path, 'stat' => $sub_stat) if + (defined($path) and $path eq $node_path); + + skip 'no connection to ZooKeeper', 2 unless + (defined($ret) and $ret); + + my $ctime = $sub_stat->get_ctime(); + ok($ctime > 0, + 'get_ctime(): retrieved ctime with subclassed stat handle'); + + is($sub_stat->{'ctime'}, $ctime, + 'stat FETCH(): ctime using subclassed stat handle'); + } + + my $ret = $sub_stat->DESTROY(); + ok($ret, + 'stat DESTROY(): destroyed subclassed stat handle'); + + $ret = $sub_stat->DESTROY(); + ok(!$ret, + 'stat DESTROY(): no action on destroyed subclassed stat handle'); + + undef $sub_stat; + ok(!defined($sub_stat), + 'undef: released subclassed stat handle'); + } + + my $sub_watch = $sub_zkh->watch(); + isa_ok($sub_watch, 'Net::ZooKeeper::Test::Watch', + 'watch(): created subclassed watch handle'); + + SKIP: { + skip 'no valid subclassed watch handle', 6 unless + (defined($sub_watch)); + + SKIP: { + my $ret = $sub_zkh->exists($root_path, 'watch' => $sub_watch); + + skip 'no connection to ZooKeeper', 3 unless + (defined($ret) and $ret); + + $sub_watch->{'timeout'} = 50; + + is($sub_watch->get_timeout(), 50, + 'get_timeout(): retrieved timeout with subclassed ' . + 'watch handle'); + + is($sub_watch->{'timeout'}, 50, + 'watch FETCH(): timeout using subclassed stat handle'); + + $ret = $sub_watch->wait(); + ok(!$ret, + 'wait(): watch after checking node existence timed out with ' . + 'subclassed watch handle'); + } + + my $ret = $sub_watch->DESTROY(); + ok($ret, + 'watch DESTROY(): destroyed subclassed watch handle'); + + $ret = $sub_watch->DESTROY(); + ok(!$ret, + 'watch DESTROY(): no action on destroyed subclassed watch handle'); + + undef $sub_watch; + ok(!defined($sub_watch), + 'undef: released subclassed watch handle'); + } + + SKIP: { + skip 'no connection to ZooKeeper', 1 unless + (defined($path) and $path eq $node_path); + + my $ret = $sub_zkh->delete($node_path); + ok($ret, + 'delete(): deleted node with subclassed handle'); + } + + my $ret = $sub_zkh->DESTROY(); + ok($ret, + 'DESTROY(): destroyed subclassed handle'); + + $ret = $sub_zkh->DESTROY(); + ok(!$ret, + 'DESTROY(): no action on destroyed subclassed handle'); + + undef $sub_zkh; + ok(!defined($sub_zkh), + 'undef: released subclassed handle'); +} + diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/zkperl/t/50_access.t b/pkg/registry/zookeeper-3.4.6/src/contrib/zkperl/t/50_access.t new file mode 100644 index 000000000..ef61ed668 --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/contrib/zkperl/t/50_access.t @@ -0,0 +1,356 @@ +# Net::ZooKeeper - Perl extension for Apache ZooKeeper +# +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you 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. + +use File::Spec; +use Test::More tests => 40; + +BEGIN { use_ok('Net::ZooKeeper', qw(:all)) }; + + +my $test_dir; +(undef, $test_dir, undef) = File::Spec->splitpath($0); +require File::Spec->catfile($test_dir, 'util.pl'); + +my($hosts, $root_path, $node_path) = zk_test_setup(0); + +my($username, $password, $digest) = zk_acl_test_setup(); + + +SKIP: { + my $zkh = Net::ZooKeeper->new($hosts); + + my $path = $zkh->create($node_path, 'foo', + 'acl' => ZOO_OPEN_ACL_UNSAFE) if (defined($zkh)); + + skip 'no connection to ZooKeeper', 36 unless + (defined($path) and $path eq $node_path); + + + ## _zk_acl_constant() + + my $no_read_acl = ZOO_OPEN_ACL_UNSAFE; + ok((ref($no_read_acl) eq 'ARRAY' and + @{$no_read_acl} == 1 and + ref($no_read_acl->[0]) eq 'HASH' and + keys(%{$no_read_acl->[0]}) == 3 and + $no_read_acl->[0]->{'perms'} == ZOO_PERM_ALL), + '_zk_acl_constant(): returned default ACL'); + + my $zoo_read_acl_unsafe = ZOO_READ_ACL_UNSAFE; + ok((ref($zoo_read_acl_unsafe) eq 'ARRAY' and + @{$zoo_read_acl_unsafe} == 1 and + ref($zoo_read_acl_unsafe->[0]) eq 'HASH' and + keys(%{$zoo_read_acl_unsafe->[0]}) == 3 and + $zoo_read_acl_unsafe->[0]->{'perms'} == ZOO_PERM_READ), + '_zk_acl_constant(): returned good ACL'); + + my $zoo_creator_all_acl = ZOO_CREATOR_ALL_ACL; + ok((ref($zoo_creator_all_acl) eq 'ARRAY' and + @{$zoo_creator_all_acl} == 1 and + ref($zoo_creator_all_acl->[0]) eq 'HASH' and + keys(%{$zoo_creator_all_acl->[0]}) == 3 and + $zoo_creator_all_acl->[0]->{'perms'} == ZOO_PERM_ALL), + '_zk_acl_constant(): returned good ACL'); + + $no_read_acl->[0]->{'perms'} &= ~ZOO_PERM_READ; + is($no_read_acl->[0]->{'perms'}, ((ZOO_PERM_ALL) & ~ZOO_PERM_READ), + 'assign: altered default ACL'); + + is(ZOO_OPEN_ACL_UNSAFE->[0]->{'perms'}, ZOO_PERM_ALL, + '_zk_acl_constant(): returned unaltered default ACL'); + + my $copy_no_read_acl = $no_read_acl; + is_deeply($copy_no_read_acl, $no_read_acl, + 'assign: copied default ACL'); + + undef $no_read_acl; + ok(!defined($no_read_acl), + 'undef: released original default ACL'); + + is($copy_no_read_acl->[0]->{'perms'}, ((ZOO_PERM_ALL) & ~ZOO_PERM_READ), + 'undef: no change to copied default ACL'); + + $no_read_acl = $copy_no_read_acl; + is_deeply($no_read_acl, $copy_no_read_acl, + 'assign: re-copied default ACL'); + + + ## create() + + my $acl_node_path = "$node_path/a1"; + + $path = $zkh->create($acl_node_path, 'foo', 'acl' => $no_read_acl); + is($path, $acl_node_path, + 'create(): created node with no-read ACL'); + + my $node = $zkh->get($acl_node_path); + + my $skip_acl; + if (defined($node) and $node eq 'foo') { + $skip_acl = 1; + } + elsif(!defined($node) and $zkh->get_error() == ZNOAUTH) { + $skip_acl = 0; + } + else { + $skip_acl = -1; + diag(sprintf('unable to get node with no-read ACL %s: %d, %s', + $acl_node_path, $zkh->get_error(), $!)); + } + + my $ret = $zkh->delete($acl_node_path); + diag(sprintf('unable to delete node with no-read ACL %s: %d, %s', + $acl_node_path, $zkh->get_error(), $!)) unless ($ret); + + my $digest_acl = [ + { + 'perms' => ZOO_PERM_READ, + 'scheme' => 'world', + 'id' => 'anyone' + }, + { + 'perms' => (ZOO_PERM_WRITE | ZOO_PERM_ADMIN), + 'scheme' => 'digest', + 'id' => "$username:$digest" + } + ]; + + $path = $zkh->create($acl_node_path, 'foo', 'acl' => $digest_acl); + is($path, $acl_node_path, + 'create(): created node with digest auth ACL'); + + SKIP: { + skip 'ZooKeeper skipping ACLs', 1 unless (!$skip_acl); + + my $acl_node_path = "$node_path/a2"; + + my $path = $zkh->create($acl_node_path, 'foo', 'acl' => [ + { + 'perms' => ZOO_PERM_WRITE, + 'scheme' => 'foo', + 'id' => 'bar' + } + ]); + ok((!defined($path) and $zkh->get_error() == ZINVALIDACL and $! eq ''), + 'create(): undef when attempting to create node with invalid ACL'); + } + + + ## get_acl() + + my @acl = ('abc'); + @acl = $zkh->get_acl($node_path . '/NONE'); + ok((@acl == 0 and $zkh->get_error() == ZNONODE and $! eq ''), + 'get_acl(): empty list returned for non-extant node'); + + $num_acl_entries = $zkh->get_acl($node_path . '/NONE'); + ok((!defined($num_acl_entries) and $zkh->get_error() == ZNONODE and + $! eq ''), + 'get_acl(): undef returned for non-extant node'); + + @acl = ('abc'); + @acl = $zkh->get_acl($acl_node_path); + is_deeply(\@acl, $digest_acl, + 'get_acl(): retrieved digest ACL'); + + my $stat = $zkh->stat(); + + @acl = ('abc'); + @acl = $zkh->get_acl($node_path, 'stat' => $stat); + is_deeply(\@acl, ZOO_OPEN_ACL_UNSAFE, + 'get_acl(): retrieved ACL'); + + is($stat->{'data_len'}, 3, + 'get_acl(): retrieved ACL with stat handle'); + + SKIP: { + skip 'ZooKeeper not skipping ACLs', 3 unless ($skip_acl > 0); + + my $acl_node_path = "$node_path/a2"; + + my $path = $zkh->create($acl_node_path, 'foo', 'acl' => []); + is($path, $acl_node_path, + 'create(): created node with empty ACL'); + + my @acl = ('abc'); + @acl = $zkh->get_acl($acl_node_path); + ok((@acl == 0 and $zkh->get_error() == ZOK), + 'get_acl(): retrieved empty ACL'); + + my $num_acl_entries = $zkh->get_acl($acl_node_path); + ok((defined($num_acl_entries) and $num_acl_entries == 0), + 'get_acl(): retrieved zero count of ACL entries'); + + my $ret = $zkh->delete($acl_node_path); + diag(sprintf('unable to delete node with empty ACL %s: %d, %s', + $acl_node_path, $zkh->get_error(), $!)) unless ($ret); + } + + + ## set_acl() + + SKIP: { + skip 'ZooKeeper skipping ACLs', 2 unless (!$skip_acl); + + my $ret = $zkh->set_acl($acl_node_path, [ + { + 'perms' => ZOO_PERM_CREATE, + 'scheme' => 'foo', + 'id' => 'bar' + } + ]); + ok((!$ret and $zkh->get_error() == ZINVALIDACL and $! eq ''), + 'set_acl(): invalid ACL'); + + push @{$digest_acl}, { + 'perms' => (ZOO_PERM_CREATE | ZOO_PERM_DELETE), + 'scheme' => 'ip', + 'id' => '0.0.0.0' + }; + + $ret = $zkh->set_acl($acl_node_path, $digest_acl); + ok((!$ret and $zkh->get_error() == ZNOAUTH and $! eq ''), + 'set_acl(): ACL unchanged if no auth'); + } + + + ## add_auth(), set_acl() + + $ret = $zkh->add_auth('digest', ''); + ok($ret, + 'add_auth(): empty digest cert'); + + SKIP: { + skip 'ZooKeeper skipping ACLs', 1 unless (!$skip_acl); + + my $ret = $zkh->set($acl_node_path, 'foo'); + ok((!$ret and $zkh->get_error() == ZNOAUTH and $! eq ''), + 'set(): node value unchanged if no auth'); + } + + $ret = $zkh->add_auth('digest', "$username:$password"); + ok($ret, + 'add_auth(): valid digest cert'); + + SKIP: { + skip 'ZooKeeper skipping ACLs', 13 unless (!$skip_acl); + + my $ret = $zkh->set($acl_node_path, 'baz'); + ok($ret, + 'set(): set node value with auth'); + + my $node = $zkh->get($acl_node_path); + is($node, 'baz', + 'get(): retrieved node value with auth'); + + $ret = $zkh->set_acl($acl_node_path, $digest_acl); + ok($ret, + 'set_acl(): set digest ACL with auth'); + + my $stat = $zkh->stat(); + + my @acl = ('abc'); + @acl = $zkh->get_acl($acl_node_path, 'stat' => $stat); + is_deeply(\@acl, $digest_acl, + 'get_acl(): retrieved digest ACL with auth'); + + is($stat->{'data_len'}, 3, + 'get_acl(): retrieved digest ACL with stat handle and auth'); + + SKIP: { + skip 'invalid node data', 2 unless ($stat->{'version'} == 1); + + my $ret = $zkh->set_acl($acl_node_path, $digest_acl, + 'version' => $stat->{'version'}); + ok($ret, + 'set_acl(): set digest ACL with matching version with auth'); + + $ret = $zkh->set_acl($acl_node_path, $digest_acl, + 'version' => $stat->{'version'}); + ok((!$ret and $zkh->get_error() == ZBADVERSION and $! eq ''), + 'set_acl(): ACL unchanged if non-matching version'); + } + + my $child_node_path = "$acl_node_path/c1"; + + my $path = $zkh->create($child_node_path, 'foo', + 'acl' => ZOO_OPEN_ACL_UNSAFE); + ok((!defined($path) and $zkh->get_error() == ZNOAUTH and $! eq ''), + 'create(): undef when attempting to create node if no auth'); + + $digest_acl->[1]->{'perms'} |= ZOO_PERM_CREATE; + $digest_acl->[2]->{'perms'} &= ~ZOO_PERM_CREATE; + + $ret = $zkh->set_acl($acl_node_path, $digest_acl); + ok($ret, + 'set_acl(): set changed digest ACL with auth'); + + $path = $zkh->create($child_node_path, 'foo', + 'acl' => ZOO_OPEN_ACL_UNSAFE); + is($path, $child_node_path, + 'create(): created node with auth'); + + $ret = $zkh->delete($child_node_path); + ok((!$ret and $zkh->get_error() == ZNOAUTH and $! eq ''), + 'delete(): no deletion of node if no auth'); + + $digest_acl->[1]->{'perms'} |= ZOO_PERM_DELETE; + pop @{$digest_acl}; + + $ret = $zkh->set_acl($acl_node_path, $digest_acl); + ok($ret, + 'set_acl(): set reduced digest ACL with auth'); + + $ret = $zkh->delete($child_node_path); + ok($ret, + 'delete(): deleted node with auth'); + } + + + ## cleanup + + $ret = $zkh->delete($acl_node_path); + diag(sprintf('unable to delete node with digest auth ACL %s: %d, %s', + $acl_node_path, $zkh->get_error(), $!)) unless ($ret); + + $ret = $zkh->delete($node_path); + diag(sprintf('unable to delete node %s: %d, %s', + $node_path, $zkh->get_error(), $!)) unless ($ret); +} + +SKIP: { + my $zkh = Net::ZooKeeper->new($hosts); + + my $ret = $zkh->exists($root_path) if (defined($zkh)); + + skip 'no connection to ZooKeeper', 1 unless + (defined($ret) and $ret); + + + ## add_auth() + + $ret = $zkh->add_auth('foo', 'bar'); + my $err = $zkh->get_error(); + ok((!$ret and + ($err == ZAUTHFAILED or + $err == ZCONNECTIONLOSS or + $err == ZSESSIONEXPIRED) + and $! eq ''), + 'set_acl(): invalid scheme'); +} + diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/zkperl/t/60_watch.t b/pkg/registry/zookeeper-3.4.6/src/contrib/zkperl/t/60_watch.t new file mode 100644 index 000000000..7d30602d5 --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/contrib/zkperl/t/60_watch.t @@ -0,0 +1,304 @@ +# Net::ZooKeeper - Perl extension for Apache ZooKeeper +# +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you 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. + +use File::Spec; +use Test::More tests => 30; + +BEGIN { use_ok('Net::ZooKeeper', qw(:all)) }; + + +my $test_dir; +(undef, $test_dir, undef) = File::Spec->splitpath($0); +require File::Spec->catfile($test_dir, 'util.pl'); + +my($hosts, $root_path, $node_path) = zk_test_setup(0); + + +SKIP: { + my $zkh = Net::ZooKeeper->new($hosts); + + my $path = $zkh->create($node_path, 'foo', + 'acl' => ZOO_OPEN_ACL_UNSAFE) if (defined($zkh)); + + skip 'no connection to ZooKeeper', 20 unless + (defined($path) and $path eq $node_path); + + + ## exists() + + $zkh->{'watch_timeout'} = 100; + + my $watch = $zkh->watch(); + + my $ret = $zkh->exists($node_path, 'watch' => $watch); + ok($ret, + 'exists(): checked node existence with watch handle'); + + $ret = $watch->wait(); + ok(!$ret, + 'wait(): watch after checking node existence timed out'); + + $ret = $zkh->exists($node_path, 'watch' => $watch); + ok($ret, + 'exists(): checked node existence with renewed watch handle'); + + $ret = $watch->wait(); + ok(!$ret, + 'wait(): watch after checking node existence timed out with ' . + 'renewed watch handle'); + + undef $watch; + ok(!defined($watch), + 'undef: released watch handle'); + + my $pending_watches = $zkh->{'pending_watches'}; + is($pending_watches, 2, + '_zk_release_watches(): report pending watches'); + + + ## get_children() + + $watch = $zkh->watch('timeout' => 50); + + my $num_children = $zkh->get_children($node_path, 'watch' => $watch); + ok((defined($num_children) and $num_children == 0), + 'get_children(): retrieved zero count of child nodes with ' . + 'watch handle'); + + $ret = $watch->wait(); + ok(!$ret, + 'wait(): watch after retrieving child nodes timed out with ' . + 'watch handle'); + + $watch->{'timeout'} = 100; + + my @child_paths = $zkh->get_children($node_path, 'watch' => $watch); + ok((@child_paths == 0), + 'get_children(): retrieved empty list of child nodes with ' . + 'renewed watch handle'); + + $ret = $watch->wait(); + ok(!$ret, + 'wait(): watch after retrieving child nodes timed out with ' . + 'renewed watch handle'); + + $pending_watches = $zkh->{'pending_watches'}; + is($pending_watches, 4, + '_zk_release_watches(): report pending watches'); + + + ## get() + + $watch = $zkh->watch(); + + my $node = $zkh->get($node_path, 'watch' => $watch); + is($node, 'foo', + 'get(): retrieved node value with watch handle'); + + $ret = $watch->wait('timeout' => 0); + ok(!$ret, + 'wait(): watch after retrieving node value timed out with ' . + 'watch handle'); + + $node = $zkh->get($node_path, 'watch' => $watch); + is($node, 'foo', + 'get(): retrieved node value with renewed watch handle'); + + $ret = $watch->wait(); + ok(!$ret, + 'wait(): watch after retrieving node value timed out with ' . + 'renewed watch handle'); + + $pending_watches = $zkh->{'pending_watches'}; + is($pending_watches, 6, + '_zk_release_watches(): all watches pending'); + + + ## _zk_release_watches() + + $ret = $zkh->DESTROY(); + ok($ret, + 'DESTROY(): destroyed handle with pending watches'); + + my $event = $watch->{'event'}; + is($event, 0, + '_zk_release_watches(): watch not destroyed when tied to watch handle'); + + $zkh = Net::ZooKeeper->new($hosts); + + SKIP: { + my $ret = $zkh->exists($node_path, 'watch' => $watch); + + skip 'no connection to ZooKeeper', 2 unless + (defined($ret) and $ret); + + ok($ret, + 'exists(): checked node existence with renewed watch handle ' . + 'from prior connection'); + + $ret = $watch->wait(); + ok(!$ret, + 'wait(): watch after checking node existence timed out with ' . + 'renewed watch handle from prior connection'); + + + } +} + +my $pid = fork(); + +SKIP: { + skip 'unable to fork', 4 unless (defined($pid)); + + my $zkh = Net::ZooKeeper->new($hosts); + + my $ret = $zkh->exists($node_path) if (defined($zkh)); + + if ($pid == 0) { + ## child process + + my $code = 0; + + if (defined($ret) and $ret) { + sleep(1); + + my $ret = $zkh->set($node_path, 'foo'); + + diag(sprintf('set(): failed in child process: %d, %s', + $zkh->get_error(), $!)) unless ($ret); + + $code = !$ret; + + sleep(1); + + my $path = $zkh->create("$node_path/c", 'foo', + 'acl' => ZOO_OPEN_ACL_UNSAFE); + + diag(sprintf('create(): failed in child process: %d, %s', + $zkh->get_error(), $!)) unless + (defined($path) and $path eq "$node_path/c"); + + $code &= !$ret; + + sleep(1); + + $ret = $zkh->delete("$node_path/c"); + + diag(sprintf('delete(): failed in child process: %d, %s', + $zkh->get_error(), $!)) unless ($ret); + + $code &= !$ret; + + sleep(1); + + $ret = $zkh->set($node_path, 'foo'); + + diag(sprintf('set(): failed in child process: %d, %s', + $zkh->get_error(), $!)) unless ($ret); + + $code &= !$ret; + } + + exit($code); + } + else { + ## parent process + + SKIP: { + skip 'no connection to ZooKeeper', 9 unless + (defined($ret) and $ret); + + my $watch = $zkh->watch('timeout' => 5000); + + + ## wait() + + my $ret = $zkh->exists($node_path, 'watch' => $watch); + ok($ret, + 'exists(): checked node existence with watch handle ' . + 'in parent'); + + $ret = $watch->wait(); + ok(($ret and $watch->{'event'} == ZOO_CHANGED_EVENT and + $watch->{'state'} == ZOO_CONNECTED_STATE), + 'wait(): waited for event after checking node existence'); + + my $num_children = $zkh->get_children($node_path, + 'watch' => $watch); + ok((defined($num_children) and $num_children == 0), + 'get_children(): retrieved zero count of child nodes with ' . + 'watch handle in parent'); + + $ret = $watch->wait(); + ok(($ret and $watch->{'event'} == ZOO_CHILD_EVENT and + $watch->{'state'} == ZOO_CONNECTED_STATE), + 'wait(): waited for create child event after ' . + 'retrieving child nodes'); + + my @child_paths = $zkh->get_children($node_path, + 'watch' => $watch); + ok((@child_paths == 1 and $child_paths[0] eq 'c'), + 'get_children(): retrieved list of child nodes with ' . + 'watch handle in parent'); + + $ret = $watch->wait(); + ok(($ret and $watch->{'event'} == ZOO_CHILD_EVENT and + $watch->{'state'} == ZOO_CONNECTED_STATE), + 'wait(): waited for delete child event after ' . + 'retrieving child nodes'); + + my $node = $zkh->get($node_path, 'watch' => $watch); + is($node, 'foo', + 'get(): retrieved node value with watch handle in parent'); + + $ret = $watch->wait(); + ok(($ret and $watch->{'event'} == ZOO_CHANGED_EVENT and + $watch->{'state'} == ZOO_CONNECTED_STATE), + 'wait(): waited for event after retrieving node value'); + + undef $watch; + + my $pending_watches = $zkh->{'pending_watches'}; + is($pending_watches, 0, + '_zk_release_watches(): no watches pending'); + } + + my $reap = waitpid($pid, 0); + + diag(sprintf('child process failed: exit %d, signal %d%s', + ($? >> 8), ($? & 127), + (($? & 128) ? ', core dump' : ''))) if + ($reap == $pid and $? != 0); + } +} + + +## cleanup + +{ + my $zkh = Net::ZooKeeper->new($hosts); + + my $ret = $zkh->exists($node_path) if (defined($zkh)); + + if (defined($ret) and $ret) { + $ret = $zkh->delete($node_path); + diag(sprintf('unable to delete node %s: %d, %s', + $node_path, $zkh->get_error(), $!)) unless ($ret); + } +} + diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/zkperl/t/util.pl b/pkg/registry/zookeeper-3.4.6/src/contrib/zkperl/t/util.pl new file mode 100644 index 000000000..1ca738d99 --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/contrib/zkperl/t/util.pl @@ -0,0 +1,62 @@ +# Net::ZooKeeper - Perl extension for Apache ZooKeeper +# +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you 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. + +sub zk_test_setup +{ + my $verbose = shift; + + $SIG{'PIPE'} = 'IGNORE'; + + my $hosts = $ENV{'ZK_TEST_HOSTS'}; + unless (defined($hosts) and $hosts =~ /\S/) { + $hosts = 'localhost:0'; + diag('no ZooKeeper hostnames specified in ZK_TEST_HOSTS env var, ' . + "using $hosts") if ($verbose); + } + + my $root_path = $ENV{'ZK_TEST_PATH'}; + if (defined($root_path) and $root_path =~ /^\//) { + $root_path =~ s/\/+/\//g; + $root_path =~ s/\/$//; + } + else { + $root_path = '/'; + diag('no ZooKeeper path specified in ZK_TEST_PATH env var, ' . + 'using root path') if ($verbose); + } + + my $node_path = $root_path . (($root_path =~ /\/$/) ? '' : '/') . + '_net_zookeeper_test'; + + return ($hosts, $root_path, $node_path); +} + +sub zk_acl_test_setup +{ + my $username = '_net_zookeeper_test'; + + my $password = 'test'; + + ## digest is Base64-encoded SHA1 digest of username:password + my $digest = '2qi7Erp2cXYLGcQbXADiwUFaOGo='; + + return ($username, $password, $digest); +} + +1; + diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/zkperl/typemap b/pkg/registry/zookeeper-3.4.6/src/contrib/zkperl/typemap new file mode 100644 index 000000000..84636fdfe --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/contrib/zkperl/typemap @@ -0,0 +1,38 @@ +# Net::ZooKeeper - Perl extension for Apache ZooKeeper +# +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you 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. + +TYPEMAP +Net::ZooKeeper T_ZK_HANDLE +Net::ZooKeeper::Stat T_ZK_HANDLE +Net::ZooKeeper::Watch T_ZK_HANDLE + +INPUT +T_ZK_HANDLE + if (SvROK($arg) && SvTYPE(SvRV($arg)) == SVt_PVHV && + sv_derived_from($arg, \"${ntype}\")) { + $var = (HV*) SvRV($arg); + } + else { + Perl_croak(aTHX_ + \"$var is not a hash reference of type ${ntype}\"); + } + +OUTPUT +T_ZK_HANDLE + NOT_IMPLEMENTED + diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/zkpython/README b/pkg/registry/zookeeper-3.4.6/src/contrib/zkpython/README new file mode 100644 index 000000000..89d999897 --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/contrib/zkpython/README @@ -0,0 +1,109 @@ +Early version of ZooKeeper bindings for Python. All functions are imported as methods into the zookeeper module. + +Please do not rely on APIs staying constant in the short term. The handling of exceptions and failure modes is one area that is subject to change. + +DEPENDENCIES: +------------- + +This has only been tested against SVN (i.e. 3.2.0 in development) but should work against 3.1.1. + +You will need the Python development headers installed to build the module - on many package-management systems, these can be found in python-devel. + +Python >= 2.6 is required. We have tested against 2.6. We have not tested against 3.x. + +BUILD AND INSTALL: +------------------- + +To install, make sure that the C client has been built and that the libraries are installed in /usr/local/lib (or change this directory in setup.py). Then run: + +ant install + +from zookeeper/src/contrib/zkpython/. + +To test, run ant test from the same directory. + +You can compile the module without installing by running + +ant compile + +In order to use the module, zookeeper.so must be in your PYTHONPATH or in one of the directories referenced by sys.path. Running ant install should make sure that this is the case, but if you only run ant compile you probably need to add build/contrib/zkpython/* to PYTHONPATH to find the module. The C client libraries must be in a system library path, or LD_LIBRARY_PATH or DYLD_LIBRARY_PATH (Mac OS) for the module to work correctly, otherwise you will see a library not found error when trying to import the module. + +NAMING CONVENTIONS: +-------------------- + +All methods that in the C library are zoo_fn_name have been implemented as zookeeper.fn_name. The exception is any function that has a watch function argument is named without the 'w' prefix (for example, zoo_wexists becomes zookeeper.exists). The variants of these functions without the watch argument (i.e. zoo_exists) have not been implemented on the understanding that they are superseded by the zoo_w* API. + +Enums and integer constants that begin ZOO_int_name are named as zookeeper.int_name. + +PARAMETER CHANGES: +------------------ + +Zookeeper handles are represented as integers to avoid marshalling the entire structure for every call. Therefore they are opaque from Python. + +Any parameter that is used to provide arguments to callback methods is not exposed in the API. Python provides better mechanisms for providing a closure to be called in the future. + +Every callback gets passed the handle of the ZooKeeper instance used to register the callback. + +DATA TYPES: +----------- + +ACL_vectors are lists of dictionaries. Stat structures are dictionaries. String_vectors are lists of strings. + +EXCEPTIONS AND ERROR HANDLING: +------------------------------ + +Currently synchronous calls indicate failure by throwing an exception (note that this includes the synchronous calls to set up asynchronous completion callbacks!). Success is returned as an integer. + +Callbacks signify failure by having the integer response code passed in. + +WHAT'S NEW IN 0.4: +------------------ + +More test coverage. + +Better reference counting, fixing at least two serious bugs. + +Out-of-range zhandles are now checked, fixing a potential security hole. + +Docstrings! Editing and cleanup required, but most of the text is there. + +zookeeper.set_watcher is now implemented correctly. + +zookeeper.client_id is now implemented correctly. zookeeper.init now respects the client_id parameter. + +get_context and set_context have been removed from the API. The context mechanism is used by PyZK to store the callables that are dispatched by C-side watchers. Messing with this from Python-side causes bugs very quickly. You should wrap all desired context up in a callable and then use zookeeper.set_watcher to attach it to the global watcher. + +Many methods now have optional parameters (usually if you can specify a watch, it's optional). The only time where genuinely optional parameters are still mandatory is when a required parameters comes after it. Currently we still respect the ZK C client parameter ordering. For example, you can simply connect with zookeeper.init("host:port") and ignore the other three parameters. + + +WHAT'S NEW IN 0.3: +------------------ + +Some tests in zkpython/test. More to follow! + +A variety of bugfixes. + +Changed the way methods return results - all responses are integers now, for the client to convert to a string if it needs. + +WHAT'S NEW IN 0.2: +------------------ + +The asynchronous API is now implemented (see zookeeper.a*). + +Most enums defined in zookeeper.h are now added as constants to the module. + +_set2 and a few other edge API calls have been implemented. The module is now nearly 100% feature complete! + +A reference count error was tracked down and killed. More probably lurk in there! + +WHAT'S NOT DONE / KNOWN ISSUES / FUTURE WORK: +--------------------------------------------- + +1. There may well be more memory leaks / reference count issues; however I am more confident that common paths are relatively safe. +2. There probably needs to be a more Pythonic Python-side wrapper for these functions (e.g. a zookeeper object, the ability to iterate through a tree of zk nodes) +3. Docstrings need a cleanup. +4. The way exceptions and error codes are returned needs looking at. Currently synchronous calls throw exceptions on everything but ZOK return, but asynchronous completions are simply passed the error code. Async. functions should never throw an exception on the C-side as they are practically impossible to catch. For the sync. functions, exceptions seem more reasonable, but some cases are certainly not exceptional. + +Bug reports / comments very welcome! + +Henry Robinson henry@cloudera.com diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/zkpython/build.xml b/pkg/registry/zookeeper-3.4.6/src/contrib/zkpython/build.xml new file mode 100644 index 000000000..d8254d14b --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/contrib/zkpython/build.xml @@ -0,0 +1,198 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/zkpython/ivy.xml b/pkg/registry/zookeeper-3.4.6/src/contrib/zkpython/ivy.xml new file mode 100644 index 000000000..6931f4684 --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/contrib/zkpython/ivy.xml @@ -0,0 +1,43 @@ + + + + + + + + ZKPython + + + + + + + + + + + + + + + + + + diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/zkpython/src/c/pyzk_docstrings.h b/pkg/registry/zookeeper-3.4.6/src/contrib/zkpython/src/c/pyzk_docstrings.h new file mode 100644 index 000000000..d2c4d60f6 --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/contrib/zkpython/src/c/pyzk_docstrings.h @@ -0,0 +1,594 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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. + */ + +#ifndef PYZK_DOCSTRINGS_H +#define PYZK_DOCSTRINGS_H + +const char pyzk_acreate_doc[] = +"Create a node asynchronously.\n" +"\n" +"This method will create a node in ZooKeeper. A node can only be created if\n" +"it does not already exists. The Create Flags affect the creation of nodes.\n" +"If EPHEMERAL flag is set, the node will automatically get removed if the\n" +"client session goes away. If the SEQUENCE flag is set, a unique\n" +"monotonically increasing sequence number is appended to the path name.\n" +"\n" +" zh: the zookeeper handle obtained by a call to zookeeper.init\n" +" path: The name of the node. Expressed as a file name with slashes \n" +"separating ancestors of the node.\n" +" value: The data to be stored in the node.\n" +" acl: The initial ACL of the node. If None, the ACL of the parent will be\n" +" used.\n" +"\n" +" (Subsequent parameters are optional)\n" +" flags: this parameter can be set to 0 for normal create or an OR\n" +" of the Create Flags\n" +" completion: the routine to invoke when the request completes. The completion\n" +"will be triggered with one of the following codes passed in as the rc argument:\n" +"OK operation completed successfully\n" +"NONODE the parent node does not exist.\n" +"NODEEXISTS the node already exists\n" +"NOAUTH the client does not have permission.\n" +"NOCHILDRENFOREPHEMERALS cannot create children of ephemeral nodes.\n" +"\n" +"RETURNS:\n" +"Returns OK on success or throws of the following errcodes on failure:\n" +"EXCEPTIONS:\n" +"BADARGUMENTS - invalid input parameters\n" +"INVALIDSTATE - zhandle state is either SESSION_EXPIRED_STATE or AUTH_FAILED_STATE\n" +"MARSHALLINGERROR - failed to marshall a request; possibly, out of memory"; + +static const char pyzk_client_id_doc[] = +"Return the client session id, only valid if the connections\n" +" is currently connected (ie. last watcher state is CONNECTED_STATE)"; + +static const char pyzk_state_doc[] = +"Get the state of the zookeeper connection.\n" + "The return value will be one of the State Consts."; + +static const char pyzk_adelete_doc[] = +" Delete a node in zookeeper.\n" +"\n" +" zh: the zookeeper handle obtained by a call to zookeeper.init\n" +" path: the name of the node. Expressed as a file name with slashes \n" +"separating ancestors of the node.\n" +"\n" +"(Subsequent parameters are optional)\n" +" version: the expected version of the node. The function will fail if the\n" +" actual version of the node does not match the expected version.\n" +" If -1 is used the version check will not take place. \n" +" completion: the routine to invoke when the request completes. The completion\n" +"will be triggered with one of the following codes passed in as the rc argument:\n" +"OK operation completed successfully\n" +"NONODE the node does not exist.\n" +"NOAUTH the client does not have permission.\n" +"BADVERSION expected version does not match actual version.\n" +"NOTEMPTY children are present; node cannot be deleted.\n" +"Returns OK on success or one of the following errcodes on failure:\n" +"BADARGUMENTS - invalid input parameters\n" +"INVALIDSTATE - zhandle state is either SESSION_EXPIRED_STATE or AUTH_FAILED_STATE\n" + "MARSHALLINGERROR - failed to marshall a request; possibly, out of memory"; + +static const char pyzk_aexists_doc[] = +" checks the existence of a node in zookeeper.\n" +"\n" +" zh the zookeeper handle obtained by a call to zookeeper.init\n" +" path the name of the node. Expressed as a file name with slashes \n" +"separating ancestors of the node.\n" +"\n" +"(Subsequent parameters are optional)\n" +" watch: if not None, a watch will be set at the server to notify the \n" +"client if the node changes. The watch will be set even if the node does not \n" +"exist. This allows clients to watch for nodes to appear.\n" +"\n" +" completion: the routine to invoke when the request completes. The completion\n" +"will be triggered with one of the following codes passed in as the rc argument:\n" +" OK operation completed successfully\n" +" NONODE the node does not exist.\n" +" NOAUTH the client does not have permission.\n" +" data the data that will be passed to the completion routine when the \n" +"function completes.\n" +" OK on success or one of the following errcodes on failure:\n" +" BADARGUMENTS - invalid input parameters\n" +" INVALIDSTATE - zhandle state is either SESSION_EXPIRED_STATE or AUTH_FAILED_STATE\n" +" MARSHALLINGERROR - failed to marshall a request; possibly, out of memory"; + +static const char pyzk_aget_doc[] = +"Gets the data associated with a node.\n" +"\n" +" zh the zookeeper handle obtained by a call to zookeeper.init\n" +" path the name of the node. Expressed as a file name with slashes \n" +"separating ancestors of the node.\n" +"\n" +"(Subsequent parameters are optional)\n" +" watcher if not None, a watch will be set at the server to notify \n" +"the client if the node changes.\n" +" completion: the routine to invoke when the request completes. The completion\n" +"will be triggered with one of the following codes passed in as the rc argument:\n" +" OK operation completed successfully\n" +" NONODE the node does not exist.\n" +" NOAUTH the client does not have permission.\n" +" data the data that will be passed to the completion routine when \n" +"the function completes.\n" +"Returns OK on success or one of the following errcodes on failure:\n" +" BADARGUMENTS - invalid input parameters\n" +" INVALIDSTATE - zhandle state is either in SESSION_EXPIRED_STATE or AUTH_FAILED_STATE\n" + " MARSHALLINGERROR - failed to marshall a request; possibly, out of memory"; + +static const char pyzk_aset_doc[] = +" Sets the data associated with a node.\n" +"\n" +" zh the zookeeper handle obtained by a call to zookeeper.init\n" +" path the name of the node. Expressed as a file name with slashes \n" +"separating ancestors of the node.\n" +" buffer the buffer holding data to be written to the node.\n" +" buflen the number of bytes from buffer to write.\n" +"\n" +"(Subsequent parameters are optional)\n" +" version the expected version of the node. The function will fail if \n" +"the actual version of the node does not match the expected version. If -1 is \n" +"used the version check will not take place.\n" +"completion: If None, \n" +"the function will execute synchronously. Otherwise, the function will return \n" +"immediately and invoke the completion routine when the request completes.\n" +" completion the routine to invoke when the request completes. The completion\n" +"will be triggered with one of the following codes passed in as the rc argument:\n" +"OK operation completed successfully\n" +"NONODE the node does not exist.\n" +"NOAUTH the client does not have permission.\n" +"BADVERSION expected version does not match actual version.\n" +" data the data that will be passed to the completion routine when \n" +"the function completes.\n" +"Returns OK on success or one of the following errcodes on failure:\n" +"BADARGUMENTS - invalid input parameters\n" +"INVALIDSTATE - zhandle state is either SESSION_EXPIRED_STATE or AUTH_FAILED_STATE\n" +"MARSHALLINGERROR - failed to marshall a request; possibly, out of memory"; + +static const char pyzk_aget_children_doc[] = +" Lists the children of a node.\n" +"\n" +"This function is similar to zoo_aget_children except it allows one specify \n" +"a watcher object rather than a boolean watch flag.\n" +" \n" +" zh the zookeeper handle obtained by a call to zookeeper.init\n" +" path the name of the node. Expressed as a file name with slashes \n" +"separating ancestors of the node.\n" +"\n" +"(Subsequent parameters are optional)\n" +" watcher if non-null, a watch will be set at the server to notify \n" +"the client if the node changes.\n" +"\n" +" completion the routine to invoke when the request completes. The completion\n" +"will be triggered with one of the following codes passed in as the rc argument:\n" +"OK operation completed successfully\n" +"NONODE the node does not exist.\n" +"NOAUTH the client does not have permission.\n" +"\n" +"Returns OK on success or one of the following errcodes on failure:\n" +"BADARGUMENTS - invalid input parameters\n" +"INVALIDSTATE - zhandle state is either SESSION_EXPIRED_STATE or AUTH_FAILED_STATE\n" +"MARSHALLINGERROR - failed to marshall a request; possibly, out of memory"; + +static const char pyzk_async_doc[] = +" Flush leader channel.\n" +"\n" +" zh the zookeeper handle obtained by a call to zookeeper.init\n" +" path the name of the node. Expressed as a file name with slashes\n" +"separating ancestors of the node.\n" +" completion the routine to invoke when the request completes. The completion\n" +"will be triggered with one of the following codes passed in as the rc argument:\n" +"OK operation completed successfully\n" +"NONODE the node does not exist.\n" +"NOAUTH the client does not have permission.\n" +"\n" +"Returns OK on success or one of the following errcodes on failure:\n" +"BADARGUMENTS - invalid input parameters\n" +"INVALIDSTATE - zhandle state is either SESSION_EXPIRED_STATE or AUTH_FAILED_STATE\n" + "MARSHALLINGERROR - failed to marshall a request; possibly, out of memory"; + +const static char pyzk_aget_acl_doc[] = +" Gets the acl associated with a node.\n" +"\n" +" zh: the zookeeper handle obtained by a call to zookeeper.init\n" +" path: the name of the node. Expressed as a file name with slashes \n" +"separating ancestors of the node.\n" +"\n" +"(Subsequent parameters are optional)\n" +" completion: the routine to invoke when the request completes. The completion\n" +"will be triggered with one of the following codes passed in as the rc argument:\n" +"OK operation completed successfully\n" +"NONODE the node does not exist.\n" +"NOAUTH the client does not have permission.\n" +"\n" +"Returns:\n" +" OK on success or one of the following errcodes on failure:\n" +" BADARGUMENTS - invalid input parameters\n" +" INVALIDSTATE - zhandle state is either SESSION_EXPIRED_STATE or AUTH_FAILED_STATE\n" +" MARSHALLINGERROR - failed to marshall a request; possibly, out of memory"; + +const char pyzk_aset_acl_doc[] = +" Sets the acl associated with a node.\n" +"\n" +"PARAMETERS:\n" +" zh: the zookeeper handle obtained by a call to zookeeper.init\n" +" path: the name of the node. Expressed as a file name with slashes \n" +"separating ancestors of the node.\n" +" buffer: the buffer holding the acls to be written to the node.\n" +" completion: the routine to invoke when the request completes. The completion\n" +"will be triggered with one of the following codes passed in as the rc argument:\n" +"OK operation completed successfully\n" +"NONODE the node does not exist.\n" +"NOAUTH the client does not have permission.\n" +"INVALIDACL invalid ACL specified\n" +"BADVERSION expected version does not match actual version.\n" +"" +" Returns OK on success or one of the following errcodes on failure:\n" +" BADARGUMENTS - invalid input parameters\n" +" INVALIDSTATE - zhandle state is either SESSION_EXPIRED_STATE or AUTH_FAILED_STATE\n" +" MARSHALLINGERROR - failed to marshall a request; possibly, out of memory"; + +const char pyzk_zerror_doc[] = +"Returns an error string corresponding to an integer error code.\n" +"\n" +"PARAMETERS:\n" +" err: Error code\n" +"RETURNS:\n" + " string corresponding to the return code\n"; + +const char pyzk_add_auth_doc[] = +" specify application credentials.\n" +"\n" +"The application calls this function to specify its credentials for purposes\n" +"of authentication. The server will use the security provider specified by \n" +"the scheme parameter to authenticate the client connection. If the \n" +"authentication request has failed:\n" +"- the server connection is dropped\n" +"- the watcher is called with the AUTH_FAILED_STATE value as the state \n" +"parameter.\n" +"\n" +"PARAMETERS:\n" +" zh: the zookeeper handle obtained by a call to zookeeper.init\n" +" scheme the id of authentication scheme. Natively supported:\n" +"'digest' password-based authentication\n" +" cert: application credentials. The actual value depends on the scheme.\n" +" completion: the routine to invoke when the request completes. One of \n" +"the following result codes may be passed into the completion callback:\n" +"OK operation completed successfully\n" +"AUTHFAILED authentication failed \n" +"\n" +"RETURNS:\n" +"OK on success or one of the following errcodes on failure:\n" +"BADARGUMENTS - invalid input parameters\n" +"INVALIDSTATE - zhandle state is either SESSION_EXPIRED_STATE or AUTH_FAILED_STATE\n" +"MARSHALLINGERROR - failed to marshall a request; possibly, out of memory\n" + "SYSTEMERROR - a system error occured\n"; + +const char pyzk_is_unrecoverable_doc[] = +" checks if the current zookeeper connection state can't be recovered.\n" +"\n" +" The application must close the zhandle and try to reconnect.\n" +"\n" +"PARAMETERS:\n" +" zh the zookeeper handle (see zookeeper.init)\n" +"\n" +"RETURNS:\n" + "True if connection is unrecoverable, otherwise False\n"; + +const char pyzk_set_debug_level_doc[] = +"\brief sets the debugging level for the library \n" +"\n" +"PARAMETERS:\n" +" logLevel: One of LOG_LEVEL_ERROR, LOG_LEVEL_WARN, LOG_LEVEL_INFO or LOG_LEVEL_DEBUG\n" +"\n" +"RETURNS:\n" + " None\n"; + +static const char pyzk_set_log_stream_doc[] = +" sets the stream to be used by the library for logging \n" +"\n" +"The zookeeper library uses stderr as its default log stream. Applications\n" +"must make sure the stream is writable. Passing in NULL resets the stream \n" + "to its default value (stderr).\n" +"\n" +"PARAMETERS:\n" +" logStream: a writable file object\n" +"RETURNS:\n" +" None\n"; + +static const char pyzk_deterministic_conn_order_doc[] = +" enable/disable quorum endpoint order randomization\n" +"\n" +"If passed a non-zero value, will make the client connect to quorum peers\n" +"in the order as specified in the zookeeper.init() call.\n" +"A zero value causes zookeeper.init() to permute the peer endpoints\n" +"which is good for more even client connection distribution among the \n" +"quorum peers.\n" +"PARAMETERS:\n" +" yesOrNo\n" +"\n" +"RETURNS:\n" + " None\n"; + +static const char pyzk_create_doc[] = +" create a node synchronously.\n" +"\n" +"This method will create a node in ZooKeeper. A node can only be created if\n" +"it does not already exists. The Create Flags affect the creation of nodes.\n" +"If the EPHEMERAL flag is set, the node will automatically get removed if the\n" +"client session goes away. If the SEQUENCE flag is set, a unique\n" +"monotonically increasing sequence number is appended to the path name.\n" +"\n" +"PARAMETERS:\n" +" zh: the zookeeper handle obtained by a call to zookeeper.init\n" +" path: The name of the node. Expressed as a file name with slashes \n" +"separating ancestors of the node.\n" +" value: The data to be stored in the node.\n" +" acl: The initial ACL of the node. If null, the ACL of the parent will be\n" +" used.\n" +" flags: this parameter can be set to 0 for normal create or an OR\n" +" of the Create Flags\n" +" realpath: the real path that is created (this might be different than the\n" +" path to create because of the SEQUENCE flag.\n" +" the maximum length of real path you would want.\n" +"\n" +"RETURNS:\n" +" The actual znode path that was created (may be different from path due to use of SEQUENTIAL\n" +" flag).\n" +"EXCEPTIONS:\n" +" NONODE the parent node does not exist.\n" +" NODEEXISTS the node already exists\n" +" NOAUTH the client does not have permission.\n" +" NOCHILDRENFOREPHEMERALS cannot create children of ephemeral nodes.\n" +" BADARGUMENTS - invalid input parameters\n" +" INVALIDSTATE - zhandle state is either SESSION_EXPIRED_STATE or AUTH_FAILED_STATE\n" + " MARSHALLINGERROR - failed to marshall a request; possibly, out of memory\n"; + +static const char pyzk_delete_doc[] = +" delete a node in zookeeper synchronously.\n" +"\n" +"PARAMETERS:\n" +" zh the zookeeper handle obtained by a call to zookeeper.init\n" +" path the name of the node. Expressed as a file name with slashes \n" +"separating ancestors of the node.\n" +"\n" +"(Subsequent parameters are optional)\n" +" version: the expected version of the node. The function will fail if the\n" +" actual version of the node does not match the expected version.\n" +" If -1 (the default) is used the version check will not take place. \n" +"\n" +"RETURNS:\n" +"One of the following values is returned.\n" +"OK operation completed successfully\n" +"NONODE the node does not exist.\n" +"NOAUTH the client does not have permission.\n" +"BADVERSION expected version does not match actual version.\n" +"NOTEMPTY children are present; node cannot be deleted.\n" +"BADARGUMENTS - invalid input parameters\n" +"INVALIDSTATE - zhandle state is either SESSION_EXPIRED_STATE or AUTH_FAILED_STATE\n" + "MARSHALLINGERROR - failed to marshall a request; possibly, out of memory\n"; + +static const char pyzk_exists_doc[] = +" checks the existence of a node in zookeeper synchronously.\n" +"\n" +"PARAMETERS:\n" +" zh: the zookeeper handle obtained by a call to zookeeper.init\n" +" path: the name of the node. Expressed as a file name with slashes \n" +"separating ancestors of the node.\n" +"\n" +"(Subsequent parameters are optional)\n" +" watch: if nonzero, a watch will be set at the server to notify the \n" +"client if the node changes. The watch will be set even if the node does not \n" +"exist. This allows clients to watch for nodes to appear.\n" +"\n" +"RETURNS:\n" +" the return stat value of the node.\n" +"EXCEPTIONS:\n" +"OK operation completed successfully\n" +"NONODE the node does not exist.\n" +"NOAUTH the client does not have permission.\n" +"BADARGUMENTS - invalid input parameters\n" +"INVALIDSTATE - zhandle state is either SESSION_EXPIRED_STATE or AUTH_FAILED_STATE\n" + "MARSHALLINGERROR - failed to marshall a request; possibly, out of memory\n"; + + +static const char pyzk_get_children_doc[] = +" lists the children of a node synchronously.\n" +"\n" +"PARAMETERS:\n" +" zh: the zookeeper handle obtained by a call to zookeeper.init\n" +" path: the name of the node. Expressed as a file name with slashes \n" +"separating ancestors of the node.\n" +"\n" +"(subsequent parameters are optional)\n" +" watcher: if non-null, a watch will be set at the server to notify \n" +"the client if the node changes.\n" +"\n" +"RETURNS:\n" +" A list of znode names\n" +"EXCEPTIONS:\n" +"NONODE the node does not exist.\n" +"NOAUTH the client does not have permission.\n" +"BADARGUMENTS - invalid input parameters\n" +"INVALIDSTATE - zhandle state is either SESSION_EXPIRED_STATE or AUTH_FAILED_STATE\n" + "MARSHALLINGERROR - failed to marshall a request; possibly, out of memory\n"; + +static const char pyzk_set_doc[] = +"\n" +" sets the data associated with a node. See set2 function if\n" +"you require access to the stat information associated with the znode.\n" +"\n" +"PARAMETERS:\n" +" zh: the zookeeper handle obtained by a call to zookeeper.init\n" +" path: the name of the node. Expressed as a file name with slashes \n" +"separating ancestors of the node.\n" +" buffer: the buffer holding data to be written to the node.\n" +"\n" +"(subsequent parameters are optional)\n" +" version: the expected version of the node. The function will fail if \n" +"the actual version of the node does not match the expected version. If -1 is \n" +"used the version check will not take place. \n" +"\n" +"RETURNS:\n" +" the return code for the function call.\n" +"OK operation completed successfully\n" +"EXCEPTIONS:\n" +"NONODE the node does not exist.\n" +"NOAUTH the client does not have permission.\n" +"BADVERSION expected version does not match actual version.\n" +"BADARGUMENTS - invalid input parameters\n" +"INVALIDSTATE - zhandle state is either SESSION_EXPIRED_STATE or AUTH_FAILED_STATE\n" + "MARSHALLINGERROR - failed to marshall a request; possibly, out of memory\n"; + +static const char pyzk_get_acl_doc[] = +" gets the acl associated with a node synchronously.\n" +"\n" +"PARAMETERS:\n" +" zh: the zookeeper handle obtained by a call to zookeeper.init\n" +" path: the name of the node. Expressed as a file name with slashes \n" +"separating ancestors of the node.\n" +" acl: the return value of acls on the path.\n" +"RETURNS:" +" returns the stat of the path specified.\n" +"EXCEPTIONS:" +"NONODE the node does not exist.\n" +"NOAUTH the client does not have permission.\n" +"BADARGUMENTS - invalid input parameters\n" +"INVALIDSTATE - zhandle state is either SESSION_EXPIRED_STATE or AUTH_FAILED_STATE\n" + "MARSHALLINGERROR - failed to marshall a request; possibly, out of memory\n"; + + +static const char pyzk_set_acl_doc[] = +" sets the acl associated with a node synchronously.\n" +"\n" +"PARAMETERS:\n" +" zh: the zookeeper handle obtained by a call to zookeeper.init\n" +" path: the name of the node. Expressed as a file name with slashes \n" +"separating ancestors of the node.\n" +" version: the expected version of the path.\n" +" acl: the acl to be set on the path. \n" +"\n" +"RETURNS:\n" +"OK operation completed successfully\n" +"EXCEPTIONS:\n" +"NONODE the node does not exist.\n" +"NOAUTH the client does not have permission.\n" +"INVALIDACL invalid ACL specified\n" +"BADVERSION expected version does not match actual version.\n" +"BADARGUMENTS - invalid input parameters\n" +"INVALIDSTATE - zhandle state is either SESSION_EXPIRED_STATE or AUTH_FAILED_STATE\n" + "MARSHALLINGERROR - failed to marshall a request; possibly, out of memory\n"; + +static const char pyzk_close_doc[] = +" close the zookeeper handle and free up any resources.\n" +"\n" +"After this call, the client session will no longer be valid. The function\n" +"will flush any outstanding send requests before return. As a result it may \n" +"block.\n" +"\n" +"This method should only be called only once on a zookeeper handle. Calling\n" +"twice will cause undefined (and probably undesirable behavior).\n" +"\n" +"PARAMETERS:\n" +" zh: the zookeeper handle obtained by a call to zookeeper.init\n" +"RETURNS:\n" +"Regardless of the error code returned, the zhandle \n" +"will be destroyed and all resources freed. \n" +"OK - success\n" +"EXCEPTIONS:\n" +"BADARGUMENTS - invalid input parameters\n" +"MARSHALLINGERROR - failed to marshall a request; possibly, out of memory\n" +"OPERATIONTIMEOUT - failed to flush the buffers within the specified timeout.\n" +"CONNECTIONLOSS - a network error occured while attempting to send request to server\n" + "SYSTEMERROR -- a system (OS) error occured; it's worth checking errno to get details\n"; + +static const char pyzk_set2_doc[] = +"\n" +" sets the data associated with a node, and returns the associated stat structure.\n" +"\n" +"PARAMETERS:\n" +" zh: the zookeeper handle obtained by a call to zookeeper.init\n" +" path: the name of the node. Expressed as a file name with slashes \n" +"separating ancestors of the node.\n" +" buffer: the buffer holding data to be written to the node.\n" +"\n" +"(subsequent parameters are optional)\n" +" version: the expected version of the node. The function will fail if \n" +"the actual version of the node does not match the expected version. If -1 is \n" +"used the version check will not take place. \n" +"\n" +"RETURNS:\n" +" the stat structure for the target znode\n" +"OK operation completed successfully\n" +"EXCEPTIONS:\n" +"NONODE the node does not exist.\n" +"NOAUTH the client does not have permission.\n" +"BADVERSION expected version does not match actual version.\n" +"BADARGUMENTS - invalid input parameters\n" +"INVALIDSTATE - zhandle state is either SESSION_EXPIRED_STATE or AUTH_FAILED_STATE\n" + "MARSHALLINGERROR - failed to marshall a request; possibly, out of memory\n"; + +static const char pyzk_init_doc[] = +"This method creates a new handle and a zookeeper session that corresponds\n" +"to that handle. Session establishment is asynchronous, meaning that the\n" +"session should not be considered established until (and unless) an\n" +"event of state CONNECTED_STATE is received.\n" +"PARAMETERS:\n" +" host: comma separated host:port pairs, each corresponding to a zk\n" +" server. e.g. '127.0.0.1:3000,127.0.0.1:3001,127.0.0.1:3002'\n" +"\n" +"(subsequent parameters are optional)\n" +" fn: the global watcher callback function. When notifications are\n" +" triggered this function will be invoked.\n" +" recv_timeout: \n" +" (clientid, passwd)\n" +" clientid the id of a previously established session that this\n" +" client will be reconnecting to. Clients can access the session id of an established, valid,\n" +" connection by calling zoo_client_id. If\n" +" the specified clientid has expired, or if the clientid is invalid for \n" +" any reason, the returned zhandle_t will be invalid -- the zhandle_t \n" +" state will indicate the reason for failure (typically\n" +" EXPIRED_SESSION_STATE).\n" +"\n" +"RETURNS:\n" +" an integer handle. If it fails to create \n" +" a new zhandle the function throws an exception.\n"; + +static const char pyzk_get_doc[] = +" gets the data associated with a node synchronously.\n" +"\n" +"\n" +"PARAMETERS:\n" +" zh the zookeeper handle obtained by a call to zookeeper.init\n" +" path the name of the node. Expressed as a file name with slashes \n" +"separating ancestors of the node.\n" +"\n" +"(subsequent parameters are optional)\n" +" watcher if not None, a watch will be set at the server to notify \n" +" the client if the node changes.\n" +" bufferlen: This value defaults to 1024*1024 - 1Mb. This method returns \n" +" the minimum of bufferlen and the true length of the znode's data. \n" +"RETURNS:\n" +" the data associated with the node\n" +"OK operation completed successfully\n" +"NONODE the node does not exist.\n" +"NOAUTH the client does not have permission.\n" +"BADARGUMENTS - invalid input parameters\n" +"INVALIDSTATE - zhandle state is either in SESSION_EXPIRED_STATE or AUTH_FAILED_STATE\n" + "MARSHALLINGERROR - failed to marshall a request; possibly, out of memory\n"; + +#endif diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/zkpython/src/c/zookeeper.c b/pkg/registry/zookeeper-3.4.6/src/contrib/zkpython/src/c/zookeeper.c new file mode 100644 index 000000000..7d8c899f1 --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/contrib/zkpython/src/c/zookeeper.c @@ -0,0 +1,1664 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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. + */ + +#include +#include +#include + +////////////////////////////////////////////// +// EXCEPTIONS +PyObject *ZooKeeperException = NULL; +PyObject *SystemErrorException; +PyObject *RuntimeInconsistencyException; +PyObject *DataInconsistencyException; +PyObject *ConnectionLossException; +PyObject *MarshallingErrorException; +PyObject *UnimplementedException; +PyObject *OperationTimeoutException; +PyObject *BadArgumentsException; +PyObject *InvalidStateException; + +PyObject *ApiErrorException; +PyObject *NoNodeException; +PyObject *NoAuthException; +PyObject *NodeExistsException; +PyObject *BadVersionException; +PyObject *NoChildrenForEphemeralsException; +PyObject *NotEmptyException; +PyObject *SessionExpiredException; +PyObject *SessionMovedException; +PyObject *InvalidCallbackException; +PyObject *InvalidACLException; +PyObject *AuthFailedException; +PyObject *ClosingException; +PyObject *NothingException; + +PyObject *err_to_exception(int errcode) { + switch (errcode) { + case ZSYSTEMERROR: + return SystemErrorException; + case ZINVALIDSTATE: + return InvalidStateException; + case ZRUNTIMEINCONSISTENCY: + return RuntimeInconsistencyException; + case ZDATAINCONSISTENCY: + return DataInconsistencyException; + case ZCONNECTIONLOSS: + return ConnectionLossException; + case ZMARSHALLINGERROR: + return MarshallingErrorException; + case ZUNIMPLEMENTED: + return UnimplementedException; + case ZOPERATIONTIMEOUT: + return OperationTimeoutException; + case ZBADARGUMENTS: + return BadArgumentsException; + case ZAPIERROR: + return ApiErrorException; + case ZNONODE: + return NoNodeException; + case ZNOAUTH: + return NoAuthException; + case ZBADVERSION: + return BadVersionException; + case ZNOCHILDRENFOREPHEMERALS: + return NoChildrenForEphemeralsException; + case ZNODEEXISTS: + return NodeExistsException; + case ZINVALIDACL: + return InvalidACLException; + case ZAUTHFAILED: + return AuthFailedException; + case ZNOTEMPTY: + return NotEmptyException; + case ZSESSIONEXPIRED: + return SessionExpiredException; + case ZINVALIDCALLBACK: + return InvalidCallbackException; + case ZSESSIONMOVED: + return SessionMovedException; + case ZCLOSING: + return ClosingException; + case ZNOTHING: + return NothingException; + case ZOK: + default: + return NULL; + } +} + + +#define CHECK_ZHANDLE(z) if ( (z) < 0 || (z) >= num_zhandles) { \ + PyErr_SetString( ZooKeeperException, "zhandle out of range" ); \ +return NULL; \ +} else if ( zhandles[(z)] == NULL ) { \ + PyErr_SetString(ZooKeeperException, "zhandle already freed"); \ + return NULL; \ + } + +/* Contains all the state required for a watcher callback - these are + passed to the *dispatch functions as void*, cast to pywatcher_t and + then their callback member is invoked if not NULL */ +typedef struct { + int zhandle; + PyObject *callback; + int permanent; +}pywatcher_t; + +/* This array exists because we need to ref. count the global watchers + for each connection - but they're inaccessible without pulling in + zk_adaptor.h, which I'm trying to avoid. */ +static pywatcher_t **watchers; + +/* We keep an array of zhandles available for use. When a zhandle is + correctly closed, the C client frees the memory so we set the + zhandles[i] entry to NULL. This entry can then be re-used. */ +static zhandle_t** zhandles = NULL; +static int num_zhandles = 0; +static int max_zhandles = 0; +#define REAL_MAX_ZHANDLES 32768 + +/* -------------------------------------------------------------------------- */ +/* zhandles - unique connection ids - tracking */ +/* -------------------------------------------------------------------------- */ + + +/* Allocates an initial zhandle and watcher array */ +int init_zhandles(int num) { + zhandles = malloc(sizeof(zhandle_t*)*num); + watchers = malloc(sizeof(pywatcher_t*)*num); + if (zhandles == NULL || watchers == NULL) { + return 0; + } + max_zhandles = num; + num_zhandles = 0; + memset(zhandles, 0, sizeof(zhandle_t*)*max_zhandles); + return 1; +} + +/* Note that the following zhandle functions are not thread-safe. The + C-Python runtime does not seem to pre-empt a thread that is in a C + module, so there's no need for synchronisation. */ + +/* Doubles the size of the zhandle / watcher array Returns 0 if the + new array would be >= REAL_MAX_ZHANDLES in size. Called when zhandles + is full. Returns 0 if allocation failed or if max num zhandles + exceeded. */ +int resize_zhandles(void) { + zhandle_t **tmp = zhandles; + pywatcher_t ** wtmp = watchers; + if (max_zhandles >= REAL_MAX_ZHANDLES >> 1) { + return 0; + } + max_zhandles *= 2; + zhandles = malloc(sizeof(zhandle_t*)*max_zhandles); + if (zhandles == NULL) { + PyErr_SetString(PyExc_MemoryError, "malloc for new zhandles failed"); + return 0; + } + memset(zhandles, 0, sizeof(zhandle_t*)*max_zhandles); + memcpy(zhandles, tmp, sizeof(zhandle_t*)*max_zhandles/2); + + watchers = malloc(sizeof(pywatcher_t*)*max_zhandles); + if (watchers == NULL) { + PyErr_SetString(PyExc_MemoryError, "malloc for new watchers failed"); + return 0; + } + memset(watchers, 0, sizeof(pywatcher_t*)*max_zhandles); + memcpy(watchers, wtmp, sizeof(pywatcher_t*)*max_zhandles/2); + + free(wtmp); + free(tmp); + return 1; +} + +/* Find a free zhandle - this iterates through the list of open + zhandles, but we expect it to be infrequently called. There are + optimisations that can be made if this turns out to be problematic. + Returns -1 if no free handle is found - resize_handles() can be + called in that case. */ +unsigned int next_zhandle(void) { + int i = 0; + for (i=0;izhandle = zh; ret->callback = cb; ret->permanent = permanent; + return ret; +} + +/* Releases the reference taken in create_pywatcher to the callback, + then frees the allocated pywatcher_t* */ +void free_pywatcher(pywatcher_t *pw) +{ + if (pw == NULL) { + return; + } + Py_DECREF(pw->callback); + + free(pw); +} + +/* Constructs a new stat object. Returns Py_None if stat == NULL or a + dictionary containing all the stat information otherwise. In either + case, takes a reference to the returned object. */ +PyObject *build_stat( const struct Stat *stat ) +{ + if (stat == NULL) { + Py_INCREF(Py_None); + return Py_None; + } + return Py_BuildValue( "{s:K, s:K, s:K, s:K," + "s:i, s:i, s:i, s:K," + "s:i, s:i, s:K}", + "czxid", stat->czxid, + "mzxid", stat->mzxid, + "ctime", stat->ctime, + "mtime", stat->mtime, + "version", stat->version, + "cversion", stat->cversion, + "aversion", stat->aversion, + "ephemeralOwner", stat->ephemeralOwner, + "dataLength", stat->dataLength, + "numChildren", stat->numChildren, + "pzxid", stat->pzxid ); +} + +/* Creates a new list of strings from a String_vector. Returns the + empty list if the String_vector is NULL. Takes a reference to the + returned PyObject and gives that reference to the caller. */ +PyObject *build_string_vector(const struct String_vector *sv) +{ + PyObject *ret; + if (!sv) { + return PyList_New(0); + } + + ret = PyList_New(sv->count); + if (ret) { + int i; + for (i=0;icount;++i) { +#if PY_MAJOR_VERSION >= 3 + PyObject *s = PyUnicode_FromString(sv->data[i]); +#else + PyObject *s = PyString_FromString(sv->data[i]); +#endif + if (!s) { + if (ret != Py_None) { + Py_DECREF(ret); + } + ret = NULL; + break; + } + PyList_SetItem(ret, i, s); + } + } + return ret; +} + +/* Returns 1 if the PyObject is a valid representation of an ACL, and + 0 otherwise. */ +int check_is_acl(PyObject *o) { + int i; + PyObject *entry; + if (o == NULL) { + return 0; + } + if (!PyList_Check(o)) { + return 0; + } + for (i=0;icount); + int i; + for (i=0;icount;++i) { + PyObject *acl = Py_BuildValue( "{s:i, s:s, s:s}", + "perms", acls->data[i].perms, + "scheme", acls->data[i].id.scheme, + "id", acls->data[i].id.id ); + PyList_SetItem(ret, i, acl); + } + return ret; +} + +/* Parse the Python representation of an ACL list into an ACL_vector + (which needs subsequent freeing) */ +int parse_acls(struct ACL_vector *acls, PyObject *pyacls) +{ + PyObject *a; + int i; + if (acls == NULL || pyacls == NULL) { + PyErr_SetString(PyExc_ValueError, "acls or pyacls NULL in parse_acls"); + return 0; + } + + acls->count = PyList_Size( pyacls ); + + // Is this a list? If not, we can't do anything + if (PyList_Check(pyacls) == 0) { + PyErr_SetString(InvalidACLException, "List of ACLs required in parse_acls"); + return 0; + } + + acls->data = (struct ACL *)calloc(acls->count, sizeof(struct ACL)); + if (acls->data == NULL) { + PyErr_SetString(PyExc_MemoryError, "calloc failed in parse_acls"); + return 0; + } + + for (i=0;icount;++i) { + a = PyList_GetItem(pyacls, i); + // a is now a dictionary + PyObject *perms = PyDict_GetItemString( a, "perms" ); +#if PY_MAJOR_VERSION >= 3 + acls->data[i].perms = (int32_t)(PyLong_AsLong(perms)); + acls->data[i].id.id = strdup( PyUnicode_AsUnicode( PyDict_GetItemString( a, "id" ) ) ); + acls->data[i].id.scheme = strdup( PyUnicode_AsUnicode( PyDict_GetItemString( a, "scheme" ) ) ); +#else + acls->data[i].perms = (int32_t)(PyInt_AsLong(perms)); + acls->data[i].id.id = strdup( PyString_AsString( PyDict_GetItemString( a, "id" ) ) ); + acls->data[i].id.scheme = strdup( PyString_AsString( PyDict_GetItemString( a, "scheme" ) ) ); +#endif + } + return 1; +} + +/* Deallocates the memory allocated inside an ACL_vector, but not the + ACL_vector itself */ +void free_acls( struct ACL_vector *acls ) +{ + if (acls == NULL) { + return; + } + int i; + for (i=0;icount;++i) { + free(acls->data[i].id.id); + free(acls->data[i].id.scheme); + } + free(acls->data); +} + +/* -------------------------------------------------------------------------- */ +/* Watcher and callback implementation */ +/* -------------------------------------------------------------------------- */ + +/* Every watcher invocation goes through this dispatch point, which + a) acquires the global interpreter lock + + b) unpacks the PyObject to call from the passed context pointer, + which handily includes the index of the relevant zookeeper handle + to pass back to Python. + + c) Makes the call into Python, checking for error conditions which + we are responsible for detecting and doing something about (we just + print the error and plough right on) + + d) releases the lock after freeing up the context object, which is + only used for one watch invocation (watches are one-shot, unless + 'permanent' != 0) +*/ +void watcher_dispatch(zhandle_t *zzh, int type, int state, + const char *path, void *context) +{ + PyGILState_STATE gstate; + pywatcher_t *pyw = (pywatcher_t*)context; + PyObject *callback = pyw->callback; + if (callback == NULL) { + // This is unexpected + char msg[256]; + sprintf(msg, "pywatcher: %d %p %d", pyw->zhandle, pyw->callback, pyw->permanent); + PyErr_SetString(PyExc_ValueError, msg); + return; + } + + gstate = PyGILState_Ensure(); + PyObject *arglist = Py_BuildValue("(i,i,i,s)", pyw->zhandle,type, state, path); + if (PyObject_CallObject((PyObject*)callback, arglist) == NULL) { + PyErr_Print(); + } + Py_DECREF(arglist); + if (pyw->permanent == 0 && (type != ZOO_SESSION_EVENT || state < 0)) { + free_pywatcher(pyw); + } + PyGILState_Release(gstate); +} + +/* The completion callbacks (from asynchronous calls) are implemented similarly */ + +/* Called when an asynchronous call that returns void completes and + dispatches user provided callback */ +void void_completion_dispatch(int rc, const void *data) +{ + PyGILState_STATE gstate; + pywatcher_t *pyw = (pywatcher_t*)data; + if (pyw == NULL) + return; + PyObject *callback = pyw->callback; + gstate = PyGILState_Ensure(); + PyObject *arglist = Py_BuildValue("(i,i)", pyw->zhandle, rc); + if (PyObject_CallObject((PyObject*)callback, arglist) == NULL) + PyErr_Print(); + Py_DECREF(arglist); + free_pywatcher(pyw); + PyGILState_Release(gstate); +} + +/* Called when an asynchronous call that returns a stat structure + completes and dispatches user provided callback */ +void stat_completion_dispatch(int rc, const struct Stat *stat, const void *data) +{ + PyGILState_STATE gstate; + pywatcher_t *pyw = (pywatcher_t*)data; + if (pyw == NULL) + return; + PyObject *callback = pyw->callback; + gstate = PyGILState_Ensure(); + PyObject *pystat = build_stat(stat); + PyObject *arglist = Py_BuildValue("(i,i,O)", pyw->zhandle,rc, pystat); + Py_DECREF(pystat); + if (PyObject_CallObject((PyObject*)callback, arglist) == NULL) + PyErr_Print(); + Py_DECREF(arglist); + free_pywatcher(pyw); + PyGILState_Release(gstate); +} + +/* Called when an asynchronous call that returns a stat structure and + some untyped data completes and dispatches user provided + callback (used by aget) */ +void data_completion_dispatch(int rc, const char *value, int value_len, const struct Stat *stat, const void *data) +{ + PyGILState_STATE gstate; + pywatcher_t *pyw = (pywatcher_t*)data; + if (pyw == NULL) + return; + PyObject *callback = pyw->callback; + gstate = PyGILState_Ensure(); + PyObject *pystat = build_stat(stat); + PyObject *arglist = Py_BuildValue("(i,i,s#,O)", pyw->zhandle,rc, value,value_len, pystat); + Py_DECREF(pystat); + + if (PyObject_CallObject((PyObject*)callback, arglist) == NULL) + PyErr_Print(); + Py_DECREF(arglist); + free_pywatcher(pyw); + PyGILState_Release(gstate); +} + +/* Called when an asynchronous call that returns a list of strings + completes and dispatches user provided callback */ +void strings_completion_dispatch(int rc, const struct String_vector *strings, const void *data) +{ + PyGILState_STATE gstate; + pywatcher_t *pyw = (pywatcher_t*)data; + if (pyw == NULL) + return; + PyObject *callback = pyw->callback; + gstate = PyGILState_Ensure(); + PyObject *pystrings = build_string_vector(strings); + if (pystrings) + { + PyObject *arglist = Py_BuildValue("(i,i,O)", pyw->zhandle, rc, pystrings); + if (arglist == NULL || PyObject_CallObject((PyObject*)callback, arglist) == NULL) + PyErr_Print(); + Py_DECREF(arglist); + } + else + PyErr_Print(); + Py_DECREF(pystrings); + free_pywatcher(pyw); + PyGILState_Release(gstate); +} + +/* Called when an asynchronous call that returns a single string + completes and dispatches user provided callback */ +void string_completion_dispatch(int rc, const char *value, const void *data) +{ + PyGILState_STATE gstate; + pywatcher_t *pyw = (pywatcher_t*)data; + if (pyw == NULL) { + return; + } + PyObject *callback = pyw->callback; + gstate = PyGILState_Ensure(); + PyObject *arglist = Py_BuildValue("(i,i,s)", pyw->zhandle,rc, value); + if (PyObject_CallObject((PyObject*)callback, arglist) == NULL) + PyErr_Print(); + Py_DECREF(arglist); + free_pywatcher(pyw); + PyGILState_Release(gstate); +} + +/* Called when an asynchronous call that returns a list of ACLs + completes and dispatches user provided callback */ +void acl_completion_dispatch(int rc, struct ACL_vector *acl, struct Stat *stat, const void *data) +{ + PyGILState_STATE gstate; + pywatcher_t *pyw = (pywatcher_t*)data; + if (pyw == NULL) { + return; + } + PyObject *callback = pyw->callback; + gstate = PyGILState_Ensure(); + PyObject *pystat = build_stat(stat); + PyObject *pyacls = build_acls(acl); + PyObject *arglist = Py_BuildValue("(i,i,O,O)", pyw->zhandle,rc, pyacls, pystat); + + Py_DECREF(pystat); + Py_DECREF(pyacls); + + if (PyObject_CallObject((PyObject*)callback, arglist) == NULL) { + PyErr_Print(); + } + Py_DECREF(arglist); + free_pywatcher(pyw); + PyGILState_Release(gstate); +} + +/* -------------------------------------------------------------------------- */ +/* ZOOKEEPER API IMPLEMENTATION */ +/* -------------------------------------------------------------------------- */ + +static PyObject *pyzookeeper_init(PyObject *self, PyObject *args) +{ + const char *host; + PyObject *watcherfn = Py_None; + int recv_timeout = 10000; + // int clientid = -1; + clientid_t cid; + cid.client_id = -1; + const char *passwd; + int handle = next_zhandle(); + if (handle == -1) { + if (resize_zhandles() == 0) { + return NULL; + } + handle = next_zhandle(); + } + + if (handle == -1) { + PyErr_SetString(ZooKeeperException,"Couldn't find a free zhandle, something is very wrong"); + return NULL; + } + + if (!PyArg_ParseTuple(args, "s|Oi(Ls)", &host, &watcherfn, &recv_timeout, &cid.client_id, &passwd)) + return NULL; + + if (cid.client_id != -1) { + strncpy(cid.passwd, passwd, 16*sizeof(char)); + } + pywatcher_t *pyw = NULL; + if (watcherfn != Py_None) { + pyw = create_pywatcher(handle, watcherfn,1); + if (pyw == NULL) { + return NULL; + } + } + watchers[handle] = pyw; + zhandle_t *zh = zookeeper_init( host, watcherfn != Py_None ? watcher_dispatch : NULL, + recv_timeout, cid.client_id == -1 ? 0 : &cid, + pyw, + 0 ); + + if (zh == NULL) + { + PyErr_SetString( ZooKeeperException, "Could not internally obtain zookeeper handle" ); + return NULL; + } + + zhandles[handle] = zh; + return Py_BuildValue( "i", handle); +} + + +/* -------------------------------------------------------------------------- */ +/* Asynchronous API implementation */ +/* -------------------------------------------------------------------------- */ + +/* Asynchronous node creation, returns integer error code */ +PyObject *pyzoo_acreate(PyObject *self, PyObject *args) +{ + int zkhid; char *path; char *value; int valuelen; + struct ACL_vector acl; int flags = 0; + PyObject *completion_callback = Py_None; + PyObject *pyacls = Py_None; + if (!PyArg_ParseTuple(args, "iss#O|iO", &zkhid, &path, + &value, &valuelen, &pyacls, &flags, + &completion_callback)) { + return NULL; + } + CHECK_ZHANDLE(zkhid); + CHECK_ACLS(pyacls); + if (parse_acls(&acl, pyacls) == 0) { + return NULL; + } + void *pyw = NULL; + if (completion_callback != Py_None) { + pyw = create_pywatcher(zkhid, completion_callback, 0); + if (pyw == NULL) { + return NULL; + } + } + int err = zoo_acreate( zhandles[zkhid], + path, + value, + valuelen, + pyacls == Py_None ? NULL : &acl, + flags, + string_completion_dispatch, + pyw); + free_acls(&acl); + if (err != ZOK) + { + PyErr_SetString(err_to_exception(err), zerror(err)); + return NULL; + } + return Py_BuildValue("i", err); +} + +/* Asynchronous node deletion, returns integer error code */ +PyObject *pyzoo_adelete(PyObject *self, PyObject *args) +{ + int zkhid; char *path; int version = -1; + PyObject *completion_callback = Py_None; + if (!PyArg_ParseTuple(args, "is|iO", &zkhid, &path, &version, &completion_callback)) + return NULL; + CHECK_ZHANDLE(zkhid); + + void *pyw = NULL; + if (completion_callback != Py_None) { + pyw = create_pywatcher(zkhid, completion_callback, 0); + if (pyw == NULL) { + return NULL; + } + } + + int err = zoo_adelete( zhandles[zkhid], + path, + version, + void_completion_dispatch, + pyw); + + if (err != ZOK) { + PyErr_SetString(err_to_exception(err), zerror(err)); + return NULL; + } + return Py_BuildValue("i", err); +} + +/* Asynchronous node existance check, returns integer error code */ +PyObject *pyzoo_aexists(PyObject *self, PyObject *args) +{ + int zkhid; char *path; + PyObject *completion_callback = Py_None; + PyObject *exists_watch = Py_None; + if (!PyArg_ParseTuple(args, "is|OO", &zkhid, &path, + &exists_watch, &completion_callback)) + return NULL; + CHECK_ZHANDLE(zkhid); + void *comp_pyw = NULL; + if (completion_callback != Py_None) { + comp_pyw = create_pywatcher(zkhid, completion_callback, 0); + if (comp_pyw == NULL) { + return NULL; + } + } + void *exist_pyw = NULL; + if (exists_watch != Py_None) { + exist_pyw = create_pywatcher(zkhid, exists_watch, 0); + if (exist_pyw == NULL) { + return NULL; + } + } + + int err = zoo_awexists( zhandles[zkhid], + path, + exists_watch != Py_None ? watcher_dispatch : NULL, + exist_pyw, + stat_completion_dispatch, + comp_pyw); + + if (err != ZOK) + { + PyErr_SetString(err_to_exception(err), zerror(err)); + return NULL; + } + return Py_BuildValue("i", err);; +} + +/* Asynchronous node data retrieval, returns integer error code */ +PyObject *pyzoo_aget(PyObject *self, PyObject *args) +{ + int zkhid; char *path; + PyObject *completion_callback = Py_None; + PyObject *get_watch = Py_None; + void *comp_pw = NULL; + void *watch_pw = NULL; + + if (!PyArg_ParseTuple(args, "is|OO", &zkhid, &path, + &get_watch, &completion_callback)) { + return NULL; + } + + CHECK_ZHANDLE(zkhid); + + if (get_watch != Py_None) { + if ((watch_pw = create_pywatcher(zkhid, get_watch, 0)) == NULL) { + return NULL; + } + } + + if (completion_callback != Py_None) { + if ((comp_pw = create_pywatcher(zkhid, completion_callback, 0)) == NULL) { + return NULL; + } + } + + int err = zoo_awget( zhandles[zkhid], + path, + get_watch != Py_None ? watcher_dispatch : NULL, + watch_pw, + data_completion_dispatch, + comp_pw); + + if (err != ZOK) { + PyErr_SetString(err_to_exception(err), zerror(err)); + return NULL; + } + return Py_BuildValue("i", err); +} + +/* Asynchronous node contents update, returns integer error code */ +PyObject *pyzoo_aset(PyObject *self, PyObject *args) +{ + int zkhid; char *path; char *buffer; int buflen; int version=-1; + PyObject *completion_callback = Py_None; + if (!PyArg_ParseTuple(args, "iss#|iO", &zkhid, &path, &buffer, &buflen, &version, &completion_callback)) + return NULL; + CHECK_ZHANDLE(zkhid); + void *pyw = NULL; + if (completion_callback != Py_None) { + pyw = create_pywatcher(zkhid, completion_callback, 0); + if (pyw == NULL) { + return NULL; + } + } + int err = zoo_aset( zhandles[zkhid], + path, + buffer, + buflen, + version, + stat_completion_dispatch, + pyw); + + if (err != ZOK) { + PyErr_SetString(err_to_exception(err), zerror(err)); + return NULL; + } + return Py_BuildValue("i", err); +} + +/* Asynchronous node child retrieval, returns integer error code */ +PyObject *pyzoo_aget_children(PyObject *self, PyObject *args) +{ + int zkhid; char *path; + PyObject *completion_callback = Py_None; + PyObject *get_watch; + if (!PyArg_ParseTuple(args, "is|OO", &zkhid, &path, + &get_watch, &completion_callback)) + return NULL; + CHECK_ZHANDLE(zkhid); + + void *get_pyw = NULL; + if (get_watch != Py_None) { + get_pyw = create_pywatcher(zkhid, get_watch, 0); + if (get_pyw == NULL) { + return NULL; + } + } + + void *pyw = NULL; + if (completion_callback != Py_None) { + pyw = create_pywatcher(zkhid, completion_callback, 0); + if (pyw == NULL) { + return NULL; + } + } + + int err = zoo_awget_children( zhandles[zkhid], + path, + get_watch != Py_None ? watcher_dispatch : NULL, + get_pyw, + strings_completion_dispatch, + pyw); + if (err != ZOK) { + PyErr_SetString(err_to_exception(err), zerror(err)); + return NULL; + } + return Py_BuildValue("i", err);; +} + +/* Asynchronous sync, returns integer error code */ +PyObject *pyzoo_async(PyObject *self, PyObject *args) +{ + int zkhid; char *path; + PyObject *completion_callback = Py_None; + if (!PyArg_ParseTuple(args, "is|O", &zkhid, &path, + &completion_callback)) { + return NULL; + } + CHECK_ZHANDLE(zkhid); + + void *pyw = NULL; + if (completion_callback != Py_None) { + pyw = create_pywatcher(zkhid, completion_callback, 0); + if (pyw == NULL) { + return NULL; + } + } + + int err = zoo_async( zhandles[zkhid], + path, + string_completion_dispatch, + pyw); + + if (err != ZOK) { + PyErr_SetString(err_to_exception(err), zerror(err)); + return NULL; + } + return Py_BuildValue("i", err);; +} + +/* Asynchronous node ACL retrieval, returns integer error code */ +PyObject *pyzoo_aget_acl(PyObject *self, PyObject *args) +{ + int zkhid; char *path; + PyObject *completion_callback = Py_None; + if (!PyArg_ParseTuple(args, "is|O", &zkhid, &path, + &completion_callback)) { + return NULL; + } + CHECK_ZHANDLE(zkhid); + + void *pyw = NULL; + if (completion_callback != Py_None) { + pyw = create_pywatcher(zkhid, completion_callback, 0); + if (pyw == NULL) { + return NULL; + } + } + + int err = zoo_aget_acl( zhandles[zkhid], + path, + acl_completion_dispatch, + pyw); + if (err != ZOK) { + PyErr_SetString(err_to_exception(err), zerror(err)); + return NULL; + } + return Py_BuildValue("i", err);; +} + +/* Asynchronous node ACL update, returns integer error code */ +PyObject *pyzoo_aset_acl(PyObject *self, PyObject *args) +{ + int zkhid; char *path; int version; + PyObject *completion_callback = Py_None, *pyacl; + struct ACL_vector aclv; + if (!PyArg_ParseTuple(args, "isiO|O", &zkhid, &path, &version, + &pyacl, &completion_callback)) { + return NULL; + } + CHECK_ZHANDLE(zkhid); + CHECK_ACLS(pyacl); + if (parse_acls(&aclv, pyacl) == 0) { + return NULL; + } + + void *pyw = NULL; + if (completion_callback != Py_None) { + pyw = create_pywatcher(zkhid, completion_callback, 0); + if (pyw == NULL) { + return NULL; + } + } + + int err = zoo_aset_acl( zhandles[zkhid], + path, + version, + &aclv, + void_completion_dispatch, + pyw); + free_acls(&aclv); + if (err != ZOK) { + PyErr_SetString(err_to_exception(err), zerror(err)); + return NULL; + } + return Py_BuildValue("i", err);; +} + +/* Asynchronous authorization addition, returns integer error code */ +PyObject *pyzoo_add_auth(PyObject *self, PyObject *args) +{ + int zkhid; + char *scheme, *cert; + int certLen; + PyObject *completion_callback; + + if (!PyArg_ParseTuple(args, "iss#O", &zkhid, &scheme, &cert, &certLen, + &completion_callback)) { + return NULL; + } + CHECK_ZHANDLE(zkhid); + + void *pyw = NULL; + if (completion_callback != Py_None) { + pyw = create_pywatcher(zkhid, completion_callback, 0); + if (pyw == NULL) { + return NULL; + } + } + + int err = zoo_add_auth( zhandles[zkhid], + scheme, + cert, + certLen, + void_completion_dispatch, + pyw); + if (err != ZOK) { + PyErr_SetString(err_to_exception(err), zerror(err)); + return NULL; + } + return Py_BuildValue("i", err); +} + +/* -------------------------------------------------------------------------- */ +/* Synchronous API implementation */ +/* -------------------------------------------------------------------------- */ + +/* Synchronous node creation, returns node path string */ +static PyObject *pyzoo_create(PyObject *self, PyObject *args) +{ + char *path; + int zkhid; + char* values; + int valuelen; + PyObject *acl = NULL; + int flags = 0; + char realbuf[256]; + const int maxbuf_len = 256; + if (!PyArg_ParseTuple(args, "iss#O|i",&zkhid, &path, &values, &valuelen,&acl,&flags)) + return NULL; + CHECK_ZHANDLE(zkhid); + struct ACL_vector aclv; + CHECK_ACLS(acl); + if (parse_acls(&aclv,acl) == 0) { + return NULL; + } + zhandle_t *zh = zhandles[zkhid]; + int err = zoo_create(zh, path, values, valuelen, &aclv, flags, realbuf, maxbuf_len); + free_acls(&aclv); + if (err != ZOK) { + PyErr_SetString(err_to_exception(err), zerror(err)); + return NULL; + } + + return Py_BuildValue("s", realbuf); +} + +/* Synchronous node deletion, returns integer error code */ +static PyObject *pyzoo_delete(PyObject *self, PyObject *args) +{ + int zkhid; + char *path; + int version = -1; + if (!PyArg_ParseTuple(args, "is|i",&zkhid,&path,&version)) + return NULL; + CHECK_ZHANDLE(zkhid); + zhandle_t *zh = zhandles[zkhid]; + int err = zoo_delete(zh, path, version); + if (err != ZOK) { + PyErr_SetString(err_to_exception(err), zerror(err)); + return NULL; + } + return Py_BuildValue("i", err); +} + +/* Synchronous node existance check, returns stat if exists, None if + absent */ +static PyObject *pyzoo_exists(PyObject *self, PyObject *args) +{ + int zkhid; char *path; PyObject *watcherfn = Py_None; + struct Stat stat; + if (!PyArg_ParseTuple(args, "is|O", &zkhid, &path, &watcherfn)) { + return NULL; + } + CHECK_ZHANDLE(zkhid); + zhandle_t *zh = zhandles[zkhid]; + pywatcher_t *pw = NULL; + void *callback = NULL; + if (watcherfn != Py_None) { + pw = create_pywatcher(zkhid, watcherfn,0); + callback = watcher_dispatch; + if (pw == NULL) { + return NULL; + } + } + int err = zoo_wexists(zh, path, callback, pw, &stat); + if (err != ZOK && err != ZNONODE) { + PyErr_SetString(err_to_exception(err), zerror(err)); + free_pywatcher(pw); + return NULL; + } + if (err == ZNONODE) { + Py_INCREF(Py_None); + return Py_None; // This isn't exceptional + } + return build_stat(&stat); +} + +/* Synchronous node child retrieval, returns list of children's path + as strings */ +static PyObject *pyzoo_get_children(PyObject *self, PyObject *args) +{ + int zkhid; + char *path; + PyObject *watcherfn = Py_None; + struct String_vector strings; + if (!PyArg_ParseTuple(args, "is|O", &zkhid, &path, &watcherfn)) { + return NULL; + } + CHECK_ZHANDLE(zkhid); + pywatcher_t *pw = NULL; + void *callback = NULL; + if (watcherfn != Py_None) { + pw = create_pywatcher( zkhid, watcherfn, 0 ); + callback = watcher_dispatch; + if (pw == NULL) { + return NULL; + } + } + int err = zoo_wget_children(zhandles[zkhid], path, + callback, + pw, &strings ); + + if (err != ZOK) { + PyErr_SetString(err_to_exception(err), zerror(err)); + free_pywatcher(pw); + return NULL; + } + + PyObject *ret = build_string_vector(&strings); + deallocate_String_vector(&strings); + return ret; +} + +/* Synchronous node data update, returns integer error code */ +static PyObject *pyzoo_set(PyObject *self, PyObject *args) +{ + int zkhid; + char *path; + char *buffer; + int buflen; + int version = -1; + if (!PyArg_ParseTuple(args, "iss#|i", &zkhid, &path, &buffer, &buflen, + &version)) { + return NULL; + } + CHECK_ZHANDLE(zkhid); + + int err = zoo_set(zhandles[zkhid], path, buffer, buflen, version); + if (err != ZOK) { + PyErr_SetString(err_to_exception(err), zerror(err)); + return NULL; + } + + return Py_BuildValue("i", err); +} + +/* Synchronous node data update, returns node's stat data structure */ +static PyObject *pyzoo_set2(PyObject *self, PyObject *args) +{ + int zkhid; + char *path; + char *buffer; + int buflen; + int version = -1; + if (!PyArg_ParseTuple(args, "iss#|i", &zkhid, &path, &buffer, &buflen, + &version)) { + return NULL; + } + CHECK_ZHANDLE(zkhid); + struct Stat stat; + int err = zoo_set2(zhandles[zkhid], path, buffer, buflen, version, &stat); + if (err != ZOK) { + PyErr_SetString(err_to_exception(err), zerror(err)); + return NULL; + } + + return build_stat(&stat); +} + +/* As per ZK documentation, datanodes are limited to 1Mb. Why not do a + stat followed by a get, to determine how big the buffer should be? + Because the znode may get updated between calls, so we can't + guarantee a complete get anyhow. */ +#define GET_BUFFER_SIZE 1024*1024 + +/* pyzoo_get has an extra parameter over the java/C equivalents. If + you set the fourth integer parameter buffer_len, we return + min(buffer_len, datalength) bytes. This is set by default to + GET_BUFFER_SIZE */ +static PyObject *pyzoo_get(PyObject *self, PyObject *args) +{ + int zkhid; + char *path; + char *buffer; + int buffer_len=GET_BUFFER_SIZE; + struct Stat stat; + PyObject *watcherfn = Py_None; + pywatcher_t *pw = NULL; + if (!PyArg_ParseTuple(args, "is|Oi", &zkhid, &path, &watcherfn, &buffer_len)) { + return NULL; + } + CHECK_ZHANDLE(zkhid); + if (watcherfn != Py_None) { + pw = create_pywatcher( zkhid, watcherfn,0 ); + if (pw == NULL) { + return NULL; + } + } + buffer = malloc(sizeof(char)*buffer_len); + if (buffer == NULL) { + free_pywatcher(pw); + PyErr_SetString(PyExc_MemoryError, "buffer could not be allocated in pyzoo_get"); + return NULL; + } + + int err = zoo_wget(zhandles[zkhid], path, + watcherfn != Py_None ? watcher_dispatch : NULL, + pw, buffer, + &buffer_len, &stat); + + if (err != ZOK) { + PyErr_SetString(err_to_exception(err), zerror(err)); + free_pywatcher(pw); + free(buffer); + return NULL; + } + + PyObject *stat_dict = build_stat( &stat ); + PyObject *ret = Py_BuildValue( "(s#,N)", buffer,buffer_len, stat_dict ); + free(buffer); + + return ret; +} + +/* Synchronous node ACL retrieval, returns list of ACLs */ +PyObject *pyzoo_get_acl(PyObject *self, PyObject *args) +{ + int zkhid; + char *path; + struct ACL_vector acl; + struct Stat stat; + if (!PyArg_ParseTuple(args, "is", &zkhid, &path)) + return NULL; + CHECK_ZHANDLE(zkhid); + int err = zoo_get_acl( zhandles[zkhid], path, &acl, &stat ); + if (err != ZOK) { + PyErr_SetString(err_to_exception(err), zerror(err)); + return NULL; + } + PyObject *pystat = build_stat( &stat ); + PyObject *acls = build_acls( &acl ); + PyObject *ret = Py_BuildValue( "(O,O)", pystat, acls ); + Py_DECREF(pystat); + Py_DECREF(acls); + return ret; +} + +/* Synchronous node ACL update, returns integer error code */ +PyObject *pyzoo_set_acl(PyObject *self, PyObject *args) +{ + int zkhid; + char *path; + int version; + PyObject *pyacls; + struct ACL_vector acl; + if (!PyArg_ParseTuple(args, "isiO", &zkhid, &path, &version, &pyacls)) { + return NULL; + } + CHECK_ZHANDLE(zkhid); + if (parse_acls(&acl, pyacls) == 0) { + return NULL; + } + int err = zoo_set_acl(zhandles[zkhid], path, version, &acl ); + free_acls(&acl); + if (err != ZOK) { + PyErr_SetString(err_to_exception(err), zerror(err)); + return NULL; + } + return Py_BuildValue("i", err);; +} + +/* -------------------------------------------------------------------------- */ +/* Session and context methods */ +/* -------------------------------------------------------------------------- */ + +/* Closes a connection, returns integer error code */ +PyObject *pyzoo_close(PyObject *self, PyObject *args) +{ + int zkhid, ret; + if (!PyArg_ParseTuple(args, "i", &zkhid)) { + return NULL; + } + CHECK_ZHANDLE(zkhid); + zhandle_t *handle = zhandles[zkhid]; + Py_BEGIN_ALLOW_THREADS + ret = zookeeper_close(handle); + Py_END_ALLOW_THREADS + zhandles[zkhid] = NULL; // The zk C client frees the zhandle + return Py_BuildValue("i", ret); +} + +/* Returns the ID of current client as a tuple (client_id, passwd) */ +PyObject *pyzoo_client_id(PyObject *self, PyObject *args) +{ + int zkhid; + if (!PyArg_ParseTuple(args, "i", &zkhid)) { + return NULL; + } + CHECK_ZHANDLE(zkhid); + const clientid_t *cid = zoo_client_id(zhandles[zkhid]); + return Py_BuildValue("(L,s)", cid->client_id, cid->passwd); +} + +/* DO NOT USE - context is used internally. This method is not exposed + in the Python module */ +PyObject *pyzoo_get_context(PyObject *self, PyObject *args) +{ + int zkhid; + if (!PyArg_ParseTuple(args, "i", &zkhid)) + return NULL; + CHECK_ZHANDLE(zkhid); + PyObject *context = NULL; + context = (PyObject*)zoo_get_context(zhandles[zkhid]); + if (context) return context; + Py_INCREF(Py_None); + return Py_None; +} + +/* DO NOT USE - context is used internally. This method is not exposed + in the Python module */ +PyObject *pyzoo_set_context(PyObject *self, PyObject *args) +{ + int zkhid; + PyObject *context; + if (!PyArg_ParseTuple(args, "iO", &zkhid, &context)) { + return NULL; + } + CHECK_ZHANDLE(zkhid); + PyObject *py_context = (PyObject*)zoo_get_context(zhandles[zkhid]); + if (py_context != NULL && py_context != Py_None) { + Py_DECREF(py_context); + } + Py_INCREF(context); + zoo_set_context(zhandles[zkhid], (void*)context); + Py_INCREF(Py_None); + return Py_None; +} + + +/* -------------------------------------------------------------------------- */ +/* Miscellaneous methods */ +/* -------------------------------------------------------------------------- */ + +/* Sets the global watcher. Returns None */ +PyObject *pyzoo_set_watcher(PyObject *self, PyObject *args) +{ + int zkhid; + PyObject *watcherfn; + if (!PyArg_ParseTuple(args, "iO", &zkhid, &watcherfn)) { + return NULL; + } + CHECK_ZHANDLE(zkhid); + pywatcher_t *pyw = watchers[zkhid]; + if (pyw != NULL) { + free_pywatcher( pyw ); + } + + // Create a *permanent* watcher object, not deallocated when called + pyw = create_pywatcher(zkhid, watcherfn,1); + if (pyw == NULL) { + return NULL; + } + watchers[zkhid] = pyw; + zoo_set_watcher(zhandles[zkhid], watcher_dispatch); + zoo_set_context(zhandles[zkhid], pyw); + Py_INCREF(Py_None); + return Py_None; +} + +/* Returns an integer code representing the current connection + state */ +PyObject *pyzoo_state(PyObject *self, PyObject *args) +{ + int zkhid; + if (!PyArg_ParseTuple(args,"i",&zkhid)) { + return NULL; + } + CHECK_ZHANDLE(zkhid); + int state = zoo_state(zhandles[zkhid]); + return Py_BuildValue("i",state); +} + + +/* Convert an integer error code into a string */ +PyObject *pyzerror(PyObject *self, PyObject *args) +{ + int rc; + if (!PyArg_ParseTuple(args,"i", &rc)) + return NULL; + return Py_BuildValue("s", zerror(rc)); +} + +/* Returns the integer receive timeout for a connection */ +PyObject *pyzoo_recv_timeout(PyObject *self, PyObject *args) +{ + int zkhid; + if (!PyArg_ParseTuple(args,"i",&zkhid)) + return NULL; + CHECK_ZHANDLE(zkhid); + int recv_timeout = zoo_recv_timeout(zhandles[zkhid]); + return Py_BuildValue("i",recv_timeout); +} + +/* Returns True if connection is unrecoverable, False otherwise */ +PyObject *pyis_unrecoverable(PyObject *self, PyObject *args) +{ + int zkhid; + if (!PyArg_ParseTuple(args,"i",&zkhid)) + return NULL; + CHECK_ZHANDLE(zkhid); + int ret = is_unrecoverable(zhandles[zkhid]); + if (ret == ZINVALIDSTATE) + Py_RETURN_TRUE; + Py_RETURN_FALSE; +} + +/* Set the debug level for logging, returns None */ +PyObject *pyzoo_set_debug_level(PyObject *self, PyObject *args) +{ + int loglevel; + if (!PyArg_ParseTuple(args, "i", &loglevel)) + return NULL; + zoo_set_debug_level((ZooLogLevel)loglevel); + Py_INCREF(Py_None); + return Py_None; +} + +static PyObject *log_stream = NULL; + +/* Set the output file-like object for logging output. Returns Py_None */ +PyObject *pyzoo_set_log_stream(PyObject *self, PyObject *args) +{ + PyObject *pystream = NULL; + if (!PyArg_ParseTuple(args,"O",&pystream)) { + PyErr_SetString(PyExc_ValueError, "Must supply a Python object to set_log_stream"); + return NULL; + } + +#if PY_MAJOR_VERSION >= 3 + extern PyTypeObject PyIOBase_Type; + if (!PyObject_IsInstance(pystream, (PyObject *)&PyIOBase_Type)) { +#else + if(!PyFile_Check(pystream)) { +#endif + + PyErr_SetString(PyExc_ValueError, "Must supply a file object to set_log_stream"); + return NULL; + } + /* Release the previous reference to log_stream that we took */ + if (log_stream != NULL) { + Py_DECREF(log_stream); + } + + log_stream = pystream; + Py_INCREF(log_stream); + +#if PY_MAJOR_VERSION >= 3 + int fd = PyObject_AsFileDescriptor(log_stream); + FILE *fp = fdopen(fd, "w"); +#else + FILE *fp = PyFile_AsFile(log_stream); +#endif + zoo_set_log_stream(fp); + + Py_INCREF(Py_None); + return Py_None; +} + +/* Set the connection order - randomized or in-order. Returns None. */ +PyObject *pyzoo_deterministic_conn_order(PyObject *self, PyObject *args) +{ + int yesOrNo; + if (!PyArg_ParseTuple(args, "i",&yesOrNo)) + return NULL; + zoo_deterministic_conn_order( yesOrNo ); + Py_INCREF(Py_None); + return Py_None; +} + +/* -------------------------------------------------------------------------- */ +/* Module setup */ +/* -------------------------------------------------------------------------- */ + +#include "pyzk_docstrings.h" + +static PyMethodDef ZooKeeperMethods[] = { + {"init", pyzookeeper_init, METH_VARARGS, pyzk_init_doc }, + {"create",pyzoo_create, METH_VARARGS, pyzk_create_doc }, + {"delete",pyzoo_delete, METH_VARARGS, pyzk_delete_doc }, + {"get_children", pyzoo_get_children, METH_VARARGS, pyzk_get_children_doc }, + {"set", pyzoo_set, METH_VARARGS, pyzk_set_doc }, + {"set2", pyzoo_set2, METH_VARARGS, pyzk_set2_doc }, + {"get",pyzoo_get, METH_VARARGS, pyzk_get_doc }, + {"exists",pyzoo_exists, METH_VARARGS, pyzk_exists_doc }, + {"get_acl", pyzoo_get_acl, METH_VARARGS, pyzk_get_acl_doc }, + {"set_acl", pyzoo_set_acl, METH_VARARGS, pyzk_set_acl_doc }, + {"close", pyzoo_close, METH_VARARGS, pyzk_close_doc }, + {"client_id", pyzoo_client_id, METH_VARARGS, pyzk_client_id_doc }, + {"set_watcher", pyzoo_set_watcher, METH_VARARGS }, + {"state", pyzoo_state, METH_VARARGS, pyzk_state_doc }, + {"recv_timeout",pyzoo_recv_timeout, METH_VARARGS }, + {"is_unrecoverable",pyis_unrecoverable, METH_VARARGS, pyzk_is_unrecoverable_doc }, + {"set_debug_level",pyzoo_set_debug_level, METH_VARARGS, pyzk_set_debug_level_doc }, + {"set_log_stream",pyzoo_set_log_stream, METH_VARARGS, pyzk_set_log_stream_doc }, + {"deterministic_conn_order",pyzoo_deterministic_conn_order, METH_VARARGS, pyzk_deterministic_conn_order_doc }, + {"acreate", pyzoo_acreate, METH_VARARGS, pyzk_acreate_doc }, + {"adelete", pyzoo_adelete, METH_VARARGS,pyzk_adelete_doc }, + {"aexists", pyzoo_aexists, METH_VARARGS,pyzk_aexists_doc }, + {"aget", pyzoo_aget, METH_VARARGS, pyzk_aget_doc }, + {"aset", pyzoo_aset, METH_VARARGS, pyzk_aset_doc }, + {"aget_children", pyzoo_aget_children, METH_VARARGS, pyzk_aget_children_doc }, + {"async", pyzoo_async, METH_VARARGS, pyzk_async_doc }, + {"aget_acl", pyzoo_aget_acl, METH_VARARGS, pyzk_aget_acl_doc }, + {"aset_acl", pyzoo_aset_acl, METH_VARARGS, pyzk_aset_acl_doc }, + {"zerror", pyzerror, METH_VARARGS, pyzk_zerror_doc }, + {"add_auth", pyzoo_add_auth, METH_VARARGS, pyzk_add_auth_doc }, + /* DO NOT USE get / set_context. Context is used internally to pass + the python watcher to a dispatch function. If you want context, set + it through set_watcher. */ + // {"get_context", pyzoo_get_context, METH_VARARGS, "" }, + // {"set_context", pyzoo_set_context, METH_VARARGS, "" }, + {NULL, NULL} +}; + +#if PY_MAJOR_VERSION >= 3 +static struct PyModuleDef zookeeper_moddef = { + PyModuleDef_HEAD_INIT, + "zookeeper", + NULL, + 0, + ZooKeeperMethods, + 0, + 0, + 0, + 0 +}; +#endif + +#define ADD_INTCONSTANT(x) PyModule_AddIntConstant(module, #x, ZOO_##x) +#define ADD_INTCONSTANTZ(x) PyModule_AddIntConstant(module, #x, Z##x) + +#define ADD_EXCEPTION(x) x = PyErr_NewException("zookeeper."#x, ZooKeeperException, NULL); \ + Py_INCREF(x); \ + PyModule_AddObject(module, #x, x); + +#if PY_MAJOR_VERSION >= 3 +PyMODINIT_FUNC PyInit_zookeeper(void) { +#else +PyMODINIT_FUNC initzookeeper(void) { +#endif + PyEval_InitThreads(); + +#if PY_MAJOR_VERSION >= 3 + PyObject *module = PyModule_Create(&zookeeper_moddef); +#else + PyObject *module = Py_InitModule("zookeeper", ZooKeeperMethods); +#endif + if (init_zhandles(32) == 0) { + return; // TODO: Is there any way to raise an exception here? + } + + ZooKeeperException = PyErr_NewException("zookeeper.ZooKeeperException", + PyExc_Exception, + NULL); + + PyModule_AddObject(module, "ZooKeeperException", ZooKeeperException); + Py_INCREF(ZooKeeperException); + + int size = 10; + char version_str[size]; + snprintf(version_str, size, "%i.%i.%i", ZOO_MAJOR_VERSION, ZOO_MINOR_VERSION, ZOO_PATCH_VERSION); + + PyModule_AddStringConstant(module, "__version__", version_str); + + ADD_INTCONSTANT(PERM_READ); + ADD_INTCONSTANT(PERM_WRITE); + ADD_INTCONSTANT(PERM_CREATE); + ADD_INTCONSTANT(PERM_DELETE); + ADD_INTCONSTANT(PERM_ALL); + ADD_INTCONSTANT(PERM_ADMIN); + + ADD_INTCONSTANT(EPHEMERAL); + ADD_INTCONSTANT(SEQUENCE); + + ADD_INTCONSTANT(EXPIRED_SESSION_STATE); + ADD_INTCONSTANT(AUTH_FAILED_STATE); + ADD_INTCONSTANT(CONNECTING_STATE); + ADD_INTCONSTANT(ASSOCIATING_STATE); + ADD_INTCONSTANT(CONNECTED_STATE); + + ADD_INTCONSTANT(CREATED_EVENT); + ADD_INTCONSTANT(DELETED_EVENT); + ADD_INTCONSTANT(CHANGED_EVENT); + ADD_INTCONSTANT(CHILD_EVENT); + ADD_INTCONSTANT(SESSION_EVENT); + ADD_INTCONSTANT(NOTWATCHING_EVENT); + + ADD_INTCONSTANT(LOG_LEVEL_ERROR); + ADD_INTCONSTANT(LOG_LEVEL_WARN); + ADD_INTCONSTANT(LOG_LEVEL_INFO); + ADD_INTCONSTANT(LOG_LEVEL_DEBUG); + + ADD_INTCONSTANTZ(SYSTEMERROR); + ADD_INTCONSTANTZ(RUNTIMEINCONSISTENCY); + ADD_INTCONSTANTZ(DATAINCONSISTENCY); + ADD_INTCONSTANTZ(CONNECTIONLOSS); + ADD_INTCONSTANTZ(MARSHALLINGERROR); + ADD_INTCONSTANTZ(UNIMPLEMENTED); + ADD_INTCONSTANTZ(OPERATIONTIMEOUT); + ADD_INTCONSTANTZ(BADARGUMENTS); + ADD_INTCONSTANTZ(INVALIDSTATE); + + ADD_EXCEPTION(SystemErrorException); + ADD_EXCEPTION(RuntimeInconsistencyException); + ADD_EXCEPTION(DataInconsistencyException); + ADD_EXCEPTION(ConnectionLossException); + ADD_EXCEPTION(MarshallingErrorException); + ADD_EXCEPTION(UnimplementedException); + ADD_EXCEPTION(OperationTimeoutException); + ADD_EXCEPTION(BadArgumentsException); + ADD_EXCEPTION(InvalidStateException); + + ADD_INTCONSTANTZ(OK); + ADD_INTCONSTANTZ(APIERROR); + ADD_INTCONSTANTZ(NONODE); + ADD_INTCONSTANTZ(NOAUTH); + ADD_INTCONSTANTZ(BADVERSION); + ADD_INTCONSTANTZ(NOCHILDRENFOREPHEMERALS); + ADD_INTCONSTANTZ(NODEEXISTS); + ADD_INTCONSTANTZ(NOTEMPTY); + ADD_INTCONSTANTZ(SESSIONEXPIRED); + ADD_INTCONSTANTZ(INVALIDCALLBACK); + ADD_INTCONSTANTZ(INVALIDACL); + ADD_INTCONSTANTZ(AUTHFAILED); + ADD_INTCONSTANTZ(CLOSING); + ADD_INTCONSTANTZ(NOTHING); + ADD_INTCONSTANTZ(SESSIONMOVED); + + ADD_EXCEPTION(ApiErrorException); + ADD_EXCEPTION(NoNodeException); + ADD_EXCEPTION(NoAuthException); + ADD_EXCEPTION(BadVersionException); + ADD_EXCEPTION(NoChildrenForEphemeralsException); + ADD_EXCEPTION(NodeExistsException); + ADD_EXCEPTION(NotEmptyException); + ADD_EXCEPTION(SessionExpiredException); + ADD_EXCEPTION(InvalidCallbackException); + ADD_EXCEPTION(InvalidACLException); + ADD_EXCEPTION(AuthFailedException); + ADD_EXCEPTION(ClosingException); + ADD_EXCEPTION(NothingException); + ADD_EXCEPTION(SessionMovedException); + +#if PY_MAJOR_VERSION >= 3 + return module; +#endif +} diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/zkpython/src/examples/README b/pkg/registry/zookeeper-3.4.6/src/contrib/zkpython/src/examples/README new file mode 100644 index 000000000..3c5345425 --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/contrib/zkpython/src/examples/README @@ -0,0 +1,8 @@ + +This folder contains sample showing how you can use ZooKeeper from Python. + +You should also check the following projects: + +* http://github.com/phunt/zk-smoketest +* http://github.com/henryr/pyzk-recipes + diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/zkpython/src/examples/watch_znode_for_changes.py b/pkg/registry/zookeeper-3.4.6/src/contrib/zkpython/src/examples/watch_znode_for_changes.py new file mode 100644 index 000000000..07100f020 --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/contrib/zkpython/src/examples/watch_znode_for_changes.py @@ -0,0 +1,202 @@ +#!/usr/bin/env python2.6 +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you 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. +""" ZNode Change Watcher Skeleton Script + +This script shows you how to write a python program that watches a specific +znode for changes and reacts to them. + +Steps to understand how this script works: + +1. start a standalone ZooKeeper server (by default it listens on localhost:2181) + +Did you know you can deploy "local clusters" by using zkconf[1]? +[1] http://github.com/phunt/zkconf + +2. enter the command line console + +3. create the test node: + [zk: (CONNECTED) 1] create /watch-test dummy-data + Created /watch-test + +4. in another shell start this script in verbose mode + $ python watch_znode_for_changes.py -v + + # you should see a lot of log messages. have a look over them because + # you can easily understand how zookeeper works + +5. update the node data: + + [zk: (CONNECTED) 2] set /watch-test new-data + cZxid = 0xa0000001a + ctime = Fri Jul 09 19:14:45 EEST 2010 + mZxid = 0xa0000001e + mtime = Fri Jul 09 19:18:18 EEST 2010 + pZxid = 0xa0000001a + cversion = 0 + dataVersion = 1 + aclVersion = 0 + ephemeralOwner = 0x0 + dataLength = 8 + numChildren = 0 + + ... and you should see similar log messages: + + 2010-07-09 19:18:18,537:11542(0xb6ea5b70):ZOO_DEBUG@process_completions@1765: Calling a watcher for node [/watch-test], type = -1 event=ZOO_CHANGED_EVENT + 2010-07-09 19:18:18,537 watch_znode_for_changes.py:83 - Running watcher: zh=0 event=3 state=3 path=/watch-test + 2010-07-09 19:18:18,537:11542(0xb6ea5b70):ZOO_DEBUG@zoo_awget@2400: Sending request xid=0x4c374b33 for path [/watch-test] to 127.0.0.1:2181 + 2010-07-09 19:18:18,545:11542(0xb76a6b70):ZOO_DEBUG@zookeeper_process@1980: Queueing asynchronous response + 2010-07-09 19:18:18,545:11542(0xb6ea5b70):ZOO_DEBUG@process_completions@1772: Calling COMPLETION_DATA for xid=0x4c374b33 rc=0 + 2010-07-09 19:18:18,545 watch_znode_for_changes.py:54 - This is where your application does work. + + You can repeat this step multiple times. + +6. that's all. in the end you can delete the node and you should see a ZOO_DELETED_EVENT + +""" + +import logging +import logging.handlers +import signal +import sys +import time +import threading +import zookeeper + +from optparse import OptionParser + +logger = logging.getLogger() + +class MyClass(threading.Thread): + znode = '/watch-test' + + def __init__(self, options, args): + threading.Thread.__init__(self) + + logger.debug('Initializing MyClass thread.') + if options.verbose: + zookeeper.set_debug_level(zookeeper.LOG_LEVEL_DEBUG) + + self.zh = zookeeper.init(options.servers) + if zookeeper.OK != zookeeper.aget(self.zh, self.znode, + self.watcher, self.handler): + logger.critical('Unable to get znode! Exiting.') + sys.exit(1) + + def __del__(self): + zookeeper.close(self.zh) + + def aget(self): + return zookeeper.aget(self.zh, self.znode, self.watcher, self.handler) + + def handler(self, zh, rc, data, stat): + """Handle zookeeper.aget() responses. + + This code handles the zookeeper.aget callback. It does not handle watches. + + Numeric arguments map to constants. See ``DATA`` in ``help(zookeeper)`` + for more information. + + Args: + zh Zookeeper handle that made this request. + rc Return code. + data Data stored in the znode. + + Does not provide a return value. + """ + if zookeeper.OK == rc: + logger.debug('This is where your application does work.') + else: + if zookeeper.NONODE == rc: + # avoid sending too many requests if the node does not yet exists + logger.info('Node not found. Trying again to set the watch.') + time.sleep(1) + + if zookeeper.OK != self.aget(): + logger.critical('Unable to get znode! Exiting.') + sys.exit(1) + + def watcher(self, zh, event, state, path): + """Handle zookeeper.aget() watches. + + This code is called when a znode changes and triggers a data watch. + It is not called to handle the zookeeper.aget call itself. + + Numeric arguments map to constants. See ``DATA`` in ``help(zookeeper)`` + for more information. + + Args: + zh Zookeeper handle that set this watch. + event Event that caused the watch (often called ``type`` elsewhere). + state Connection state. + path Znode that triggered this watch. + + Does not provide a return value. + """ + out = ['Running watcher:', + 'zh=%d' % zh, + 'event=%d' % event, + 'state=%d' % state, + 'path=%s' % path] + logger.debug(' '.join(out)) + if event == zookeeper.CHANGED_EVENT and \ + state == zookeeper.CONNECTED_STATE and \ + self.znode == path: + if zookeeper.OK != self.aget(): + logger.critical('Unable to get znode! Exiting.') + sys.exit(1) + + def run(self): + while True: + time.sleep(86400) + + +def main(argv=None): + # Allow Ctrl-C + signal.signal(signal.SIGINT, signal.SIG_DFL) + + parser = OptionParser() + parser.add_option('-v', '--verbose', + dest='verbose', + default=False, + action='store_true', + help='Verbose logging. (default: %default)') + parser.add_option('-s', '--servers', + dest='servers', + default='localhost:2181', + help='Comma-separated list of host:port pairs. (default: %default)') + + (options, args) = parser.parse_args() + + if options.verbose: + logger.setLevel(logging.DEBUG) + else: + logger.setLevel(logging.INFO) + + formatter = logging.Formatter("%(asctime)s %(filename)s:%(lineno)d - %(message)s") + stream_handler = logging.StreamHandler() + stream_handler.setFormatter(formatter) + logger.addHandler(stream_handler) + + logger.info('Starting Zookeeper python example: %s' % ' '.join(sys.argv)) + + mc = MyClass(options, args) + mc.start() + mc.join() + + +if __name__ == '__main__': + main() diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/zkpython/src/packages/deb/zkpython.control/control b/pkg/registry/zookeeper-3.4.6/src/contrib/zkpython/src/packages/deb/zkpython.control/control new file mode 100644 index 000000000..6ec76d069 --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/contrib/zkpython/src/packages/deb/zkpython.control/control @@ -0,0 +1,23 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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. +Package: zkpython +Version: @version@ +Section: misc +Priority: optional +Architecture: all +Depends: python +Maintainer: Apache Software Foundation +Description: ZooKeeper python binding library +Distribution: development diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/zkpython/src/packages/rpm/spec/zkpython.spec b/pkg/registry/zookeeper-3.4.6/src/contrib/zkpython/src/packages/rpm/spec/zkpython.spec new file mode 100644 index 000000000..d1f981431 --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/contrib/zkpython/src/packages/rpm/spec/zkpython.spec @@ -0,0 +1,81 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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. + +# +# RPM Spec file for ZooKeeper version @version@ +# + +%define name zkpython +%define version @version@ +%define release @package.release@ + +# Installation Locations +%define _prefix @package.prefix@ + +# Build time settings +%define _build_dir @package.build.dir@ +%define _final_name @final.name@ +%define _python_lib @python.lib@ +%define debug_package %{nil} + +# Disable brp-java-repack-jars for aspect J +%define __os_install_post \ + /usr/lib/rpm/redhat/brp-compress \ + %{!?__debug_package:/usr/lib/rpm/redhat/brp-strip %{__strip}} \ + /usr/lib/rpm/redhat/brp-strip-static-archive %{__strip} \ + /usr/lib/rpm/redhat/brp-strip-comment-note %{__strip} %{__objdump} \ + /usr/lib/rpm/brp-python-bytecompile %{nil} + +# RPM searches perl files for dependancies and this breaks for non packaged perl lib +# like thrift so disable this +%define _use_internal_dependency_generator 0 + +Summary: ZooKeeper python binding library +Group: Development/Libraries +License: Apache License, Version 2.0 +URL: http://zookeeper.apache.org/ +Vendor: Apache Software Foundation +Name: %{name} +Version: %{version} +Release: %{release} +Source0: %{_python_lib} +Prefix: %{_prefix} +Requires: zookeeper-lib == %{version} +AutoReqProv: no +Provides: zkpython + +%description +ZooKeeper python binding library + +%prep +tar fxz %{_python_lib} -C %{_build_dir} + +%build + +######################### +#### INSTALL SECTION #### +######################### +%install + +%pre + +%post + +%preun + +%files +%defattr(-,root,root) +%{_prefix} + diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/zkpython/src/python/setup.py b/pkg/registry/zookeeper-3.4.6/src/contrib/zkpython/src/python/setup.py new file mode 100644 index 000000000..c6a1ceefb --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/contrib/zkpython/src/python/setup.py @@ -0,0 +1,36 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you 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. + +from distutils.core import setup, Extension + +zookeeper_basedir = "../../../" + +zookeepermodule = Extension("zookeeper", + sources=["src/c/zookeeper.c"], + include_dirs=[zookeeper_basedir + "/src/c/include", + zookeeper_basedir + "/build/c", + zookeeper_basedir + "/src/c/generated"], + libraries=["zookeeper_mt"], + library_dirs=[zookeeper_basedir + "/src/c/.libs/", + zookeeper_basedir + "/build/c/.libs/", + zookeeper_basedir + "/build/test/test-cppunit/.libs", + "/usr/local/lib" + ]) + +setup( name="ZooKeeper", + version = "0.4", + description = "ZooKeeper Python bindings", + ext_modules=[zookeepermodule] ) diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/zkpython/src/python/zk.py b/pkg/registry/zookeeper-3.4.6/src/contrib/zkpython/src/python/zk.py new file mode 100644 index 000000000..9c0f37482 --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/contrib/zkpython/src/python/zk.py @@ -0,0 +1,76 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you 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. + +import zookeeper, time, threading + +f = open("out.log","w") +zookeeper.set_log_stream(f) + +connected = False +conn_cv = threading.Condition( ) + +def my_connection_watcher(handle,type,state,path): + global connected, conn_cv + print("Connected, handle is ", handle) + conn_cv.acquire() + connected = True + conn_cv.notifyAll() + conn_cv.release() + +conn_cv.acquire() +print("Connecting to localhost:2181 -- ") +handle = zookeeper.init("localhost:2181", my_connection_watcher, 10000, 0) +while not connected: + conn_cv.wait() +conn_cv.release() + +def my_getc_watch( handle, type, state, path ): + print("Watch fired -- ") + print(type, state, path) + +ZOO_OPEN_ACL_UNSAFE = {"perms":0x1f, "scheme":"world", "id" :"anyone"}; + +try: + zookeeper.create(handle, "/zk-python", "data", [ZOO_OPEN_ACL_UNSAFE], 0) + zookeeper.get_children(handle, "/zk-python", my_getc_watch) + for i in xrange(5): + print("Creating sequence node ", i, " ", zookeeper.create(handle, "/zk-python/sequencenode", "data", [ZOO_OPEN_ACL_UNSAFE], zookeeper.SEQUENCE )) +except: + pass + +def pp_zk(handle,root, indent = 0): + """Pretty print(a zookeeper tree, starting at root""") + def make_path(child): + if root == "/": + return "/" + child + return root + "/" + child + children = zookeeper.get_children(handle, root, None) + out = "" + for i in xrange(indent): + out += "\t" + out += "|---"+root + " :: " + zookeeper.get(handle, root, None)[0] + print(out) + for child in children: + pp_zk(handle,make_path(child),indent+1) + +print("ZNode tree -- ") +pp_zk(handle,"/") + +print("Getting ACL / Stat for /zk-python --") +(stat, acl) = zookeeper.get_acl(handle, "/zk-python") +print("Stat:: ", stat) +print("Acl:: ", acl) + diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/zktreeutil/Makefile.am b/pkg/registry/zookeeper-3.4.6/src/contrib/zktreeutil/Makefile.am new file mode 100644 index 000000000..36da1a50d --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/contrib/zktreeutil/Makefile.am @@ -0,0 +1,4 @@ +## Process this file with automake to produce Makefile.in + +SUBDIRS = src + diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/zktreeutil/README.txt b/pkg/registry/zookeeper-3.4.6/src/contrib/zktreeutil/README.txt new file mode 100644 index 000000000..43b06fa72 --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/contrib/zktreeutil/README.txt @@ -0,0 +1,74 @@ +========================================== +zktreeutil - Zookeeper Tree Data Utility +Author: Anirban Roy +Organization: Yahoo Inc. +========================================== + +zktreeutil program is intended to manage and manipulate zk-tree data quickly, effi- +ciently and with ease. The utility operates on free-form ZK-tree and hence can be used +for any cluster managed by Zookeeper. Here are the basic functionalities - + +EXPORT: The whole/partial ZK-tree is exported into a XML file. This helps in +capturing a current snapshot of the data for backup/analysis. For a subtree +export, one need to specify the path to the ZK-subtree with proper option. + +IMPORT: The ZK-tree can be imported from XML into ZK cluster. This helps in priming +the new ZK cluster with static configuration. The import can be non-intrusive by +making only the additions in the existing data. The import of subtree is also +possible by optionally providing the path to the ZK-subtree. + +DIFF: Creates a diff between live ZK data vs data saved in XML file. Diff can ignore +some ZK-tree branches (possibly dynamic data) on reading the optional ignore flag +from XML file. Diffing on a ZK-subtree achieved by providing path to ZK-subtree with +diff command. + +UPDATE: Make the incremental changes into the live ZK-tree from saved XML, essentia- +lly after running the diff. + +DUMP: Dumps the ZK-tree on the standard output device reading either from live ZK +server or XML file. Like export, ZK-subtree can be dumped with optionaly +providing the path to the ZK-subtree, and till a certain depth of the (sub)tree. + +The exported ZK data into XML file can be shortened by only keeping the static ZK +nodes which are required to prime a cluster. The dynamic zk nodes (created on-the- +fly) can be ignored by setting a 'ignore' attribute at the root node of the dynamic +subtree (see tests/zk_sample.xml), possibly deleting all inner ZK nodes under that. +Once ignored, the whole subtree is ignored during DIFF, UPDATE and WRITE. + +Pre-requisites +-------------- +1. Linux system with 2.6.X kernel. +2. Zookeeper C client library (locally built at ../../c/.libs) >= 3.X.X +3. Development build libraries (rpm packages): + a. boost-devel >= 1.32.0 + b. libxml2-devel >= 2.7.3 + c. log4cxx0100-devel >= 0.10.0 + +Build instructions +------------------ +1. cd into this directory +2. autoreconf -if +3. ./configure +4. make +5. 'zktreeutil' binary created under src directory + +Limitations +----------- +Current version works with text data only, binary data will be supported in future +versions. + +Testing and usage of zktreeutil +-------------------------------- +1. Run Zookeeper server locally on port 2181 +2. export LD_LIBRARY_PATH=../../c/.libs/:/usr/local/lib/ +3. ./src/zktreeutil --help # show help +4. ./src/zktreeutil --zookeeper=localhost:2181 --import --xmlfile=tests/zk_sample.xml 2>/dev/null # import sample ZK tree +5. ./src/zktreeutil --zookeeper=localhost:2181 --dump --path=/myapp/version-1.0 2>/dev/null # dump Zk subtree +5. ./src/zktreeutil --zookeeper=localhost:2181 --dump --depth=3 2>/dev/null # dump Zk tree till certain depth +6. ./src/zktreeutil --xmlfile=zk_sample.xml -D 2>/dev/null # dump the xml data +7. Change zk_sample.xml with adding/deleting/chaging some nodes +8. ./src/zktreeutil -z localhost:2181 -F -x zk_sample.xml -p /myapp/version-1.0/configuration 2>/dev/null # take a diff of changes +9. ./src/zktreeutil -z localhost:2181 -E 2>/dev/null > zk_sample2.xml # export the mofied ZK tree +10. ./src/zktreeutil -z localhost:2181 -U -x zk_sample.xml -p /myapp/version-1.0/distributions 2>/dev/null # update with incr. changes +11. ./src/zktreeutil --zookeeper=localhost:2181 --import --force --xmlfile=zk_sample2.xml 2>/dev/null # re-prime the ZK tree + diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/zktreeutil/build.xml b/pkg/registry/zookeeper-3.4.6/src/contrib/zktreeutil/build.xml new file mode 100644 index 000000000..809d134ec --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/contrib/zktreeutil/build.xml @@ -0,0 +1,61 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/zktreeutil/configure.ac b/pkg/registry/zookeeper-3.4.6/src/contrib/zktreeutil/configure.ac new file mode 100644 index 000000000..b4a82a76a --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/contrib/zktreeutil/configure.ac @@ -0,0 +1,66 @@ +# -*- Autoconf -*- +# Process this file with autoconf to produce a configure script. + +AC_PREREQ(2.59) + +AC_INIT([zktreeutil], [1.0.0]) +AM_INIT_AUTOMAKE(foreign) + +AC_CONFIG_SRCDIR([src]) +AM_CONFIG_HEADER([config.h]) + +PACKAGE=zktreeutil +VERSION=1.0.0 + +AC_SUBST(PACKAGE) +AC_SUBST(VERSION) +BUILD_PATH="`pwd`" + +# Checks for programs. +AC_LANG_CPLUSPLUS +AC_PROG_CXX + +# Checks for libxm2. +AM_PATH_XML2(2.7.3) +XML2_INCLUDE="/usr/include/libxml2" +AC_SUBST(XML2_INCLUDE) + +# Zookeeper C client +ZOOKEEPER_PATH=${BUILD_PATH}/../../c +AC_CHECK_LIB(zookeeper_mt, main, [ZOOKEEPER="-L${ZOOKEEPER_PATH}/.libs -lzookeeper_mt"],,["-L${ZOOKEEPER_PATH}/.libs"]) +if test -z "${ZOOKEEPER}"; then + AC_ERROR("... zookeeper C client not found!") +fi + +AC_SUBST(ZOOKEEPER) +AC_SUBST(ZOOKEEPER_PATH) + +### log4cxx ### + +LOG4CXX_VERSION="0.10.0" +LOG4CXX_INCLUDE="/usr/local/include" +LOG4CXX_LIB_PATH="/usr/local/lib" +AC_CHECK_LIB(log4cxx, main, [LOG4CXX="-L${LOG4CXX_LIB_PATH} -llog4cxx"],,["-L${LOG4CXX_LIB_PATH}"]) +if test -z "${LOG4CXX}"; then + AC_ERROR("... log4cxx not found!") +fi + +AC_SUBST(LOG4CXX) +AC_SUBST(LOG4CXX_VERSION) +AC_SUBST(LOG4CXX_INCLUDE) + +# Checks for header files. +AC_HEADER_DIRENT +AC_HEADER_STDC +AC_CHECK_HEADERS([stdlib.h string.h stdio.h unistd.h boost/shared_ptr.hpp boost/algorithm/string.hpp boost/algorithm/string/split.hpp]) + +# Checks for typedefs, structures, and compiler characteristics. +AC_HEADER_STDBOOL +AC_C_CONST +AC_C_INLINE +AC_TYPE_SIZE_T +AC_C_VOLATILE + +AC_CONFIG_FILES([Makefile]) +AC_CONFIG_FILES([src/Makefile]) +AC_OUTPUT diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/zktreeutil/src/Makefile.am b/pkg/registry/zookeeper-3.4.6/src/contrib/zktreeutil/src/Makefile.am new file mode 100644 index 000000000..641077a88 --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/contrib/zktreeutil/src/Makefile.am @@ -0,0 +1,24 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you 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. + +AM_CXXFLAGS = -I${ZOOKEEPER_PATH}/include -I${ZOOKEEPER_PATH}/generated \ + -I$(top_srcdir)/include -I${LOG4CXX_INCLUDE} -I/usr/include \ + -I${XML2_INCLUDE} + +bin_PROGRAMS = zktreeutil + +zktreeutil_SOURCES = ZkAdaptor.cc ZkTreeUtil.cc ZkTreeUtilMain.cc +zktreeutil_LDADD = ${ZOOKEEPER} ${XML_LIBS} ${LOG4CXX} diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/zktreeutil/src/SimpleTree.h b/pkg/registry/zookeeper-3.4.6/src/contrib/zktreeutil/src/SimpleTree.h new file mode 100644 index 000000000..8226f05c9 --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/contrib/zktreeutil/src/SimpleTree.h @@ -0,0 +1,150 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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. + */ + +#ifndef __SIMPLE_TREE_H__ +#define __SIMPLE_TREE_H__ + +#include +#include + +namespace zktreeutil +{ + using std::vector; + + /** + * \brief A simple tree data-structure template. + */ + template < class KeyType, class DataType > class SimpleTreeNode + { + private: + /** + * \brief The type representing simple-tree node smart-pointer. + */ + typedef boost::shared_ptr< SimpleTreeNode< KeyType, DataType > > SimpleTreeNodeSptr; + + public: + /** + * \brief Constructor. + * + * @param isRoot the flag indicating whether the node is root. + */ + SimpleTreeNode (bool isRoot=false) : isRoot_(isRoot) + { + } + + /** + * \brief Constructor. + * + * @param key the key stored at the tree node + * @param isRoot the flag indicating whether the node is root + */ + SimpleTreeNode (const KeyType& key, bool isRoot=false) : + isRoot_(isRoot), key_(key) + { + } + + /** + * \brief Constructor. + * + * @param key the key stored at the tree node + * @param val the value stored at the tree node + * @param isRoot the flag indicating whether the node is root + */ + SimpleTreeNode (const KeyType& key, const DataType& val, bool isRoot=false) : + isRoot_(isRoot), key_(key), val_(val) + { + } + + /** + * \brief Destructor. + */ + ~SimpleTreeNode () throw() {} + + /** + * \brief Add a child node to this node. + * + * @param node the child node to be added + */ + void addChild (const SimpleTreeNodeSptr node) { children_.push_back (node); } + + /** + * \brief Sets the key of this node. + * + * @param key the key to be set + */ + void setKey (const KeyType& key) { key_ = key; } + + /** + * \brief Sets the data of this node. + * + * @param val the value to be set + */ + void setData (const DataType& val) { val_ = val; } + + /** + * \brief Gets the key of this node. + * + * @return the key of this node + */ + KeyType getKey () const { return key_; } + + /** + * \brief Gets the data of this node. + * + * @return the value of this node + */ + DataType getData () const { return val_; } + + /** + * \brief Gets the i'th of this node. + * + * @param idx the index of the child node + * @return the child node + */ + SimpleTreeNodeSptr getChild (unsigned idx) const { return children_[idx]; } + + /** + * \brief Gets the number of children of this node. + * + * @return the number of children + */ + unsigned numChildren () const { return children_.size(); } + + /** + * \brief Indicates whether this node is root. + * + * @return 'true' if this node is root, 'false' otherwise + */ + bool isRoot () const { return isRoot_; } + + /** + * \brief Indicates whether this node is leaf node. + * + * @return 'true' if this node is leaf node, 'false' otherwise + */ + bool isLeaf () const { return !numChildren(); } + + private: + bool isRoot_; // Flag indicates if the node is root + KeyType key_; // Key of this node + DataType val_; // Value of this node + vector< SimpleTreeNodeSptr > children_; // List of children of this node + }; +} + +#endif // __SIMPLE_TREE_H__ diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/zktreeutil/src/ZkAdaptor.cc b/pkg/registry/zookeeper-3.4.6/src/contrib/zktreeutil/src/ZkAdaptor.cc new file mode 100644 index 000000000..baec8f9b0 --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/contrib/zktreeutil/src/ZkAdaptor.cc @@ -0,0 +1,513 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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. + */ + +#include "ZkAdaptor.h" +#include +#include +#include +#include +#include + +// Logger +static log4cxx::LoggerPtr zkLoggerPtr = log4cxx::Logger::getLogger ("zookeeper.core"); + +namespace zktreeutil +{ + /** + * \brief This class provides logic for checking if a request can be retried. + */ + class RetryHandler + { + public: + RetryHandler(const ZooKeeperConfig &zkConfig) : m_zkConfig(zkConfig) + { + if (zkConfig.getAutoReconnect()) + retries = 2; + else + retries = 0; + } + + /** + * \brief Attempts to fix a side effect of the given RC. + * + * @param rc the ZK error code + * @return whether the error code has been handled and the caller should + * retry an operation the caused this error + */ + bool handleRC(int rc) + { + //check if the given error code is recoverable + if (!retryOnError(rc)) + return false; + + std::cerr << "[zktreeuti] Number of retries left: " << retries << std::endl; + if (retries-- > 0) + return true; + else + return false; + } + + private: + /** + * The ZK config. + */ + const ZooKeeperConfig &m_zkConfig; + + /** + * The number of outstanding retries. + */ + int retries; + + /** + * Checks whether the given error entitles this adapter + * to retry the previous operation. + * + * @param zkErrorCode one of the ZK error code + */ + static bool retryOnError(int zkErrorCode) + { + return (zkErrorCode == ZCONNECTIONLOSS || zkErrorCode == ZOPERATIONTIMEOUT); + } + }; + + + // ======================================================================= + + ZooKeeperAdapter::ZooKeeperAdapter(ZooKeeperConfig config) throw(ZooKeeperException) : + m_zkConfig(config), + mp_zkHandle(NULL) + { + // Enforce setting up appropriate ZK log level + if (zkLoggerPtr->isDebugEnabled() +#ifdef LOG4CXX_TRACE + || zkLoggerPtr->isTraceEnabled() +#endif + ) + { + zoo_set_debug_level( ZOO_LOG_LEVEL_DEBUG ); + } else if (zkLoggerPtr->isInfoEnabled()) { + zoo_set_debug_level( ZOO_LOG_LEVEL_INFO ); + } else if (zkLoggerPtr->isWarnEnabled()) { + zoo_set_debug_level( ZOO_LOG_LEVEL_WARN ); + } else { + zoo_set_debug_level( ZOO_LOG_LEVEL_ERROR ); + } + + // Establish the connection + reconnect(); + } + + ZooKeeperAdapter::~ZooKeeperAdapter() + { + try + { + disconnect(); + } + catch (std::exception &e) + { + std::cerr << "[zktreeutil] An exception while disconnecting from ZK: " + << e.what() + << std::endl; + } + } + + void ZooKeeperAdapter::validatePath(const string &path) throw(ZooKeeperException) + { + if (path.find ("/") != 0) + { + std::ostringstream oss; + oss << "Node path must start with '/' but" "it was '" + << path + << "'"; + throw ZooKeeperException (oss.str()); + } + if (path.length() > 1) + { + if (path.rfind ("/") == path.length() - 1) + { + std::ostringstream oss; + oss << "Node path must not end with '/' but it was '" + << path + << "'"; + throw ZooKeeperException (oss.str()); + } + if (path.find( "//" ) != string::npos) + { + std::ostringstream oss; + oss << "Node path must not contain '//' but it was '" + << path + << "'"; + throw ZooKeeperException (oss.str()); + } + } + } + + void ZooKeeperAdapter::disconnect() + { + if (mp_zkHandle != NULL) + { + zookeeper_close (mp_zkHandle); + mp_zkHandle = NULL; + } + } + + void ZooKeeperAdapter::reconnect() throw(ZooKeeperException) + { + // Clear the connection state + disconnect(); + + // Establish a new connection to ZooKeeper + mp_zkHandle = zookeeper_init( m_zkConfig.getHosts().c_str(), + NULL, + m_zkConfig.getLeaseTimeout(), + 0, + NULL, + 0); + if (mp_zkHandle == NULL) + { + // Invalid handle returned + std::ostringstream oss; + oss << "Unable to connect to ZK running at '" + << m_zkConfig.getHosts() + << "'"; + throw ZooKeeperException (oss.str()); + } + + // Enter into connect loop + int64_t connWaitTime = m_zkConfig.getConnectTimeout(); + while (1) + { + int state = zoo_state (mp_zkHandle); + if (state == ZOO_CONNECTED_STATE) + { + // connected + std::cerr << "[zktreeutil] Connected! mp_zkHandle: " + << mp_zkHandle + << std::endl; + return; + } + else if ( state && state != ZOO_CONNECTING_STATE) + { + // Not connecting any more... some other issue + std::ostringstream oss; + oss << "Unable to connect to ZK running at '" + << m_zkConfig.getHosts() + << "'; state=" + << state; + throw ZooKeeperException (oss.str()); + } + + // Still connecting, wait and come back + struct timeval now; + gettimeofday( &now, NULL ); + int64_t milliSecs = -(now.tv_sec * 1000LL + now.tv_usec / 1000); + std::cerr << "[zktreeutil] About to wait 1 sec" << std::endl; + sleep (1); + gettimeofday( &now, NULL ); + milliSecs += now.tv_sec * 1000LL + now.tv_usec / 1000; + connWaitTime -= milliSecs; + // Timed out !!! + if (connWaitTime <= 0) + break; + } + + // Timed out while connecting + std::ostringstream oss; + oss << "Timed out while connecting to ZK running at '" + << m_zkConfig.getHosts() + << "'"; + throw ZooKeeperException (oss.str()); + } + + void ZooKeeperAdapter::verifyConnection() throw(ZooKeeperException) + { + // Check connection state + int state = zoo_state (mp_zkHandle); + if (state != ZOO_CONNECTED_STATE) + { + if (m_zkConfig.getAutoReconnect()) + { + // Trying to reconnect + std::cerr << "[zktreeutil] Trying to reconnect..." << std::endl; + reconnect(); + } + else + { + std::ostringstream oss; + oss << "Disconnected from ZK running at '" + << m_zkConfig.getHosts() + << "'; state=" + << state; + throw ZooKeeperException (oss.str()); + } + } + } + + bool ZooKeeperAdapter::createNode(const string &path, + const string &value, + int flags, + bool createAncestors) throw(ZooKeeperException) + { + const int MAX_PATH_LENGTH = 1024; + char realPath[MAX_PATH_LENGTH]; + realPath[0] = 0; + + int rc; + RetryHandler rh(m_zkConfig); + do + { + verifyConnection(); + rc = zoo_create( mp_zkHandle, + path.c_str(), + value.c_str(), + value.length(), + &ZOO_OPEN_ACL_UNSAFE, + flags, + realPath, + MAX_PATH_LENGTH ); + } while (rc != ZOK && rh.handleRC(rc)); + if (rc != ZOK) // check return status + { + if (rc == ZNODEEXISTS) + { + //the node already exists + std::cerr << "[zktreeutil] ZK node " << path << " already exists" << std::endl; + return false; + } + else if (rc == ZNONODE && createAncestors) + { + std::cerr << "[zktreeutil] Intermediate ZK node missing in path " << path << std::endl; + //one of the ancestors doesn't exist so lets start from the root + //and make sure the whole path exists, creating missing nodes if + //necessary + for (string::size_type pos = 1; pos != string::npos; ) + { + pos = path.find( "/", pos ); + if (pos != string::npos) + { + try + { + createNode( path.substr( 0, pos ), "", 0, true ); + } + catch (ZooKeeperException &e) + { + throw ZooKeeperException( string("Unable to create " "node ") + path, rc ); + } + pos++; + } + else + { + // No more path components + return createNode( path, value, flags, false ); + } + } + } + + // Unexpected error during create + std::cerr << "[zktreeutil] Error in creating ZK node " << path << std::endl; + throw ZooKeeperException( string("Unable to create node ") + path, rc ); + } + + // Success + std::cerr << "[zktreeutil] " << realPath << " has been created" << std::endl; + return true; + } + + bool ZooKeeperAdapter::deleteNode(const string &path, + bool recursive, + int version) throw(ZooKeeperException) + { + // Validate the zk path + validatePath( path ); + + int rc; + RetryHandler rh(m_zkConfig); + do + { + verifyConnection(); + rc = zoo_delete( mp_zkHandle, path.c_str(), version ); + } while (rc != ZOK && rh.handleRC(rc)); + if (rc != ZOK) //check return status + { + if (rc == ZNONODE) + { + std::cerr << "[zktreeutil] ZK Node " + << path + << " does not exist" + << std::endl; + return false; + } + if (rc == ZNOTEMPTY && recursive) + { + std::cerr << "[zktreeutil] ZK Node " + << path + << " not empty; deleting..." + << std::endl; + //get all children and delete them recursively... + vector nodeList = getNodeChildren (path); + for (vector::const_iterator i = nodeList.begin(); + i != nodeList.end(); + ++i) { + deleteNode( *i, true ); + } + //...and finally attempt to delete the node again + return deleteNode( path, false ); + } + + // Unexpected return without success + std::cerr << "[zktreeutil] Unable to delete ZK node " << path << std::endl; + throw ZooKeeperException( string("Unable to delete node ") + path, rc ); + } + + // success + std::cerr << "[zktreeutil] " << path << " has been deleted" << std::endl; + return true; + } + + vector< string > ZooKeeperAdapter::getNodeChildren (const string &path) throw (ZooKeeperException) + { + // Validate the zk path + validatePath( path ); + + String_vector children; + memset( &children, 0, sizeof(children) ); + int rc; + RetryHandler rh(m_zkConfig); + do + { + verifyConnection(); + rc = zoo_get_children( mp_zkHandle, + path.c_str(), + 0, + &children ); + } while (rc != ZOK && rh.handleRC(rc)); + if (rc != ZOK) // check return code + { + std::cerr << "[zktreeutil] Error in fetching children of " << path << std::endl; + throw ZooKeeperException( string("Unable to get children of node ") + path, rc ); + } + else + { + vector< string > nodeList; + for (int i = 0; i < children.count; ++i) + { + //convert each child's path from relative to absolute + string absPath(path); + if (path != "/") + { + absPath.append( "/" ); + } + absPath.append( children.data[i] ); + nodeList.push_back( absPath ); + } + + //make sure the order is always deterministic + sort( nodeList.begin(), nodeList.end() ); + return nodeList; + } + } + + bool ZooKeeperAdapter::nodeExists(const string &path) throw(ZooKeeperException) + { + // Validate the zk path + validatePath( path ); + + struct Stat tmpStat; + struct Stat* stat = &tmpStat; + memset( stat, 0, sizeof(Stat) ); + + int rc; + RetryHandler rh(m_zkConfig); + do { + verifyConnection(); + rc = zoo_exists( mp_zkHandle, + path.c_str(), + 0, + stat ); + } while (rc != ZOK && rh.handleRC(rc)); + if (rc != ZOK) + { + if (rc == ZNONODE) + return false; + // Some error + std::cerr << "[zktreeutil] Error in checking existance of " << path << std::endl; + throw ZooKeeperException( string("Unable to check existence of node ") + path, rc ); + } else { + return true; + } + } + + string ZooKeeperAdapter::getNodeData(const string &path) throw(ZooKeeperException) + { + // Validate the zk path + validatePath( path ); + + const int MAX_DATA_LENGTH = 128 * 1024; + char buffer[MAX_DATA_LENGTH]; + memset( buffer, 0, MAX_DATA_LENGTH ); + struct Stat tmpStat; + struct Stat* stat = &tmpStat; + memset( stat, 0, sizeof(Stat) ); + + int rc; + int len; + RetryHandler rh(m_zkConfig); + do { + verifyConnection(); + len = MAX_DATA_LENGTH - 1; + rc = zoo_get( mp_zkHandle, + path.c_str(), + 0, + buffer, &len, stat ); + } while (rc != ZOK && rh.handleRC(rc)); + if (rc != ZOK) // checl return code + { + std::cerr << "[zktreeutil] Error in fetching value of " << path << std::endl; + throw ZooKeeperException( string("Unable to get data of node ") + path, rc ); + } + + // return data + return string( buffer, buffer + len ); + } + + void ZooKeeperAdapter::setNodeData(const string &path, + const string &value, + int version) throw(ZooKeeperException) + { + // Validate the zk path + validatePath( path ); + + int rc; + RetryHandler rh(m_zkConfig); + do { + verifyConnection(); + rc = zoo_set( mp_zkHandle, + path.c_str(), + value.c_str(), + value.length(), + version); + } while (rc != ZOK && rh.handleRC(rc)); + if (rc != ZOK) // check return code + { + std::cerr << "[zktreeutil] Error in setting value of " << path << std::endl; + throw ZooKeeperException( string("Unable to set data for node ") + path, rc ); + } + // success + } + +} /* end of 'namespace zktreeutil' */ diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/zktreeutil/src/ZkAdaptor.h b/pkg/registry/zookeeper-3.4.6/src/contrib/zktreeutil/src/ZkAdaptor.h new file mode 100644 index 000000000..d94b033c5 --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/contrib/zktreeutil/src/ZkAdaptor.h @@ -0,0 +1,327 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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. + */ + +#ifndef __ZK_ADAPTER_H__ +#define __ZK_ADAPTER_H__ + +#include +#include + +extern "C" { +#include "zookeeper.h" +} + +namespace zktreeutil +{ + using std::string; + using std::vector; + + /** + * \brief A cluster related exception. + */ + class ZooKeeperException : public std::exception + { + public: + + /** + * \brief Constructor. + * + * @param msg the detailed message associated with this exception + */ + ZooKeeperException(const string& msg) : + m_message(msg), + m_zkErrorCode(0) {} + + /** + * \brief Constructor. + * + * @param msg the detailed message associated with this exception + * @param errorCode the ZK error code associated with this exception + */ + ZooKeeperException(const string &msg, int errorCode) : + m_zkErrorCode(errorCode) + { + char tmp[100]; + sprintf( tmp, " (ZK error code: %d)", errorCode ); + m_message = msg + tmp; + } + + /** + * \brief Destructor. + */ + ~ZooKeeperException() throw() {} + + /** + * \brief Returns detailed description of the exception. + */ + const char *what() const throw() + { + return m_message.c_str(); + } + + /** + * \brief Returns the ZK error code. + */ + int getZKErrorCode() const + { + return m_zkErrorCode; + } + + private: + + /** + * The detailed message associated with this exception. + */ + string m_message; + + /** + * The optional error code received from ZK. + */ + int m_zkErrorCode; + + }; + + /** + * \brief This class encapsulates configuration of a ZK client. + */ + class ZooKeeperConfig + { + public: + + /** + * \brief Constructor. + * + * @param hosts the comma separated list of host and port pairs of ZK nodes + * @param leaseTimeout the lease timeout (heartbeat) + * @param autoReconnect whether to allow for auto-reconnect + * @param connectTimeout the connect timeout, in milliseconds; + */ + ZooKeeperConfig(const string &hosts, + int leaseTimeout, + bool autoReconnect = true, + long long int connectTimeout = 15000) + : m_hosts(hosts), + m_leaseTimeout(leaseTimeout), + m_autoReconnect(autoReconnect), + m_connectTimeout(connectTimeout) {} + + /** + * \brief Returns the list of ZK hosts to connect to. + */ + string getHosts() const { return m_hosts; } + + /** + * \brief Returns the lease timeout. + */ + int getLeaseTimeout() const { return m_leaseTimeout; } + + /** + * \brief Returns whether {@link ZooKeeperAdapter} should attempt + * \brief to automatically reconnect in case of a connection failure. + */ + bool getAutoReconnect() const { return m_autoReconnect; } + + /** + * \brief Gets the connect timeout. + * + * @return the connect timeout + */ + long long int getConnectTimeout() const { return m_connectTimeout; } + + private: + + /** + * The host addresses of ZK nodes. + */ + const string m_hosts; + + /** + * The ZK lease timeout. + */ + const int m_leaseTimeout; + + /** + * True if this adapater should attempt to autoreconnect in case + * the current session has been dropped. + */ + const bool m_autoReconnect; + + /** + * How long to wait, in milliseconds, before a connection + * is established to ZK. + */ + const long long int m_connectTimeout; + }; + + /** + * \brief This is a wrapper around ZK C synchrounous API. + */ + class ZooKeeperAdapter + { + public: + /** + * \brief Constructor. + * Attempts to create a ZK adapter, optionally connecting + * to the ZK. Note, that if the connection is to be established + * and the given listener is NULL, some events may be lost, + * as they may arrive asynchronously before this method finishes. + * + * @param config the ZK configuration + * @throw ZooKeeperException if cannot establish connection to the given ZK + */ + ZooKeeperAdapter(ZooKeeperConfig config) throw(ZooKeeperException); + + /** + * \brief Destructor. + */ + ~ZooKeeperAdapter(); + + /** + * \brief Returns the current config. + */ + const ZooKeeperConfig &getZooKeeperConfig() const { return m_zkConfig; } + + /** + * \brief Restablishes connection to the ZK. + * If this adapter is already connected, the current connection + * will be dropped and a new connection will be established. + * + * @throw ZooKeeperException if cannot establish connection to the ZK + */ + void reconnect() throw(ZooKeeperException); + + /** + * \brief Disconnects from the ZK and unregisters {@link #mp_zkHandle}. + */ + void disconnect(); + + /** + * \brief Creates a new node identified by the given path. + * This method will optionally attempt to create all missing ancestors. + * + * @param path the absolute path name of the node to be created + * @param value the initial value to be associated with the node + * @param flags the ZK flags of the node to be created + * @param createAncestors if true and there are some missing ancestor nodes, + * this method will attempt to create them + * + * @return true if the node has been successfully created; false otherwise + * @throw ZooKeeperException if the operation has failed + */ + bool createNode(const string &path, + const string &value = "", + int flags = 0, + bool createAncestors = true) throw(ZooKeeperException); + + /** + * \brief Deletes a node identified by the given path. + * + * @param path the absolute path name of the node to be deleted + * @param recursive if true this method will attempt to remove + * all children of the given node if any exist + * @param version the expected version of the node. The function will + * fail if the actual version of the node does not match + * the expected version + * + * @return true if the node has been deleted; false otherwise + * @throw ZooKeeperException if the operation has failed + */ + bool deleteNode(const string &path, + bool recursive = false, + int version = -1) throw(ZooKeeperException); + + /** + * \brief Retrieves list of all children of the given node. + * + * @param path the absolute path name of the node for which to get children + * @return the list of absolute paths of child nodes, possibly empty + * @throw ZooKeeperException if the operation has failed + */ + vector getNodeChildren( const string &path) throw(ZooKeeperException); + + /** + * \brief Check the existance of path to a znode. + * + * @param path the absolute path name of the znode + * @return TRUE if the znode exists; FALSE otherwise + * @throw ZooKeeperException if the operation has failed + */ + bool nodeExists(const string &path) throw(ZooKeeperException); + + /** + * \brief Gets the given node's data. + * + * @param path the absolute path name of the node to get data from + * + * @return the node's data + * @throw ZooKeeperException if the operation has failed + */ + string getNodeData(const string &path) throw(ZooKeeperException); + + /** + * \brief Sets the given node's data. + * + * @param path the absolute path name of the node to get data from + * @param value the node's data to be set + * @param version the expected version of the node. The function will + * fail if the actual version of the node does not match + * the expected version + * + * @throw ZooKeeperException if the operation has failed + */ + void setNodeData(const string &path, + const string &value, + int version = -1) throw(ZooKeeperException); + + /** + * \brief Validates the given path to a node in ZK. + * + * @param the path to be validated + * + * @throw ZooKeeperException if the given path is not valid + * (for instance it doesn't start with "/") + */ + static void validatePath(const string &path) throw(ZooKeeperException); + + private: + + /** + * Verifies whether the connection is established, + * optionally auto reconnecting. + * + * @throw ZooKeeperConnection if this client is disconnected + * and auto-reconnect failed or was not allowed + */ + void verifyConnection() throw(ZooKeeperException); + + private: + + /** + * The current ZK configuration. + */ + const ZooKeeperConfig m_zkConfig; + + /** + * The current ZK session. + */ + zhandle_t *mp_zkHandle; + }; + +} /* end of 'namespace zktreeutil' */ + +#endif /* __ZK_ADAPTER_H__ */ diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/zktreeutil/src/ZkTreeUtil.cc b/pkg/registry/zookeeper-3.4.6/src/contrib/zktreeutil/src/ZkTreeUtil.cc new file mode 100644 index 000000000..83f0cbf3f --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/contrib/zktreeutil/src/ZkTreeUtil.cc @@ -0,0 +1,705 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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. + */ + +#include "ZkTreeUtil.h" + +#include +#include +#include +#include +#include + +namespace zktreeutil +{ + using std::map; + using std::pair; + + static ZkTreeNodeSptr loadZkTree_ (ZooKeeperAdapterSptr zkHandle, + const string& path) + { + // Extract the node value + string value = zkHandle->getNodeData(path); + + // Extract nodename from the path + string nodename = "/"; + if (path != "/") + { + vector< string > nodes; + boost::split(nodes, path, boost::is_any_of ("/") ); + nodename = nodes[nodes.size()-1]; + } + + // Create tree-node with name and value + ZkTreeNodeSptr nodeSptr = ZkTreeNodeSptr (new ZkTreeNode (nodename, value)); + std::cerr << "[zktreeutil] loaded nodename: " + << nodename + << " value: " + << value + << std::endl; + + // Load all the children + vector< string > cnodes = zkHandle->getNodeChildren (path); + for (unsigned i = 0; i < cnodes.size(); i++) + nodeSptr->addChild (loadZkTree_ (zkHandle, cnodes[i])); + + // Return the constructed node + return nodeSptr; + } + + static ZkTreeNodeSptr loadZkTreeXml_ (xmlNode* xmlNodePtr) + { + // Null check + if (xmlNodePtr == NULL) + { + std::cerr << "[zktreeutil] empty XML node encountered" << std::endl; + exit (-1); + } + + // Get the node name + xmlChar* name = xmlGetProp (xmlNodePtr, BAD_CAST "name"); + string nameStr = (const char*)name; + std::cerr << "[zktreeutil] node name: " << nameStr; + xmlFree (name); + // Get the node value + string valueStr; + xmlChar* value = xmlGetProp (xmlNodePtr, BAD_CAST "value"); + if (value) + { + valueStr = (const char*)value; + std::cerr << " value: " << valueStr; + } + xmlFree (value); + // Get the ignore flag + bool doIgnore = false; + xmlChar* ignore = xmlGetProp (xmlNodePtr, BAD_CAST "ignore"); + if (ignore) + { + string ignoreStr = (const char*) ignore; + if (ignoreStr == "true" || ignoreStr == "yes" || ignoreStr == "1") + { + doIgnore = true; + std::cerr << " "; + } + } + xmlFree (ignore); + std::cerr << std::endl; + + // Create the zk node + ZkTreeNodeSptr nodeSptr = + ZkTreeNodeSptr (new ZkTreeNode (nameStr, + ZkNodeData (valueStr, doIgnore))); + + // Load the children + for (xmlNode* chldNode = xmlNodePtr->children; + chldNode; + chldNode = chldNode->next) + if (chldNode->type == XML_ELEMENT_NODE) + nodeSptr->addChild (loadZkTreeXml_ (chldNode)); + + // Return the loaded node + return nodeSptr; + } + + static void writeZkTree_ (ZooKeeperAdapterSptr zkHandle, + const ZkTreeNodeSptr zkNodeSptr, + const string& path) + { + // Create the path in zk-tree + zkHandle->createNode(path.c_str(), "", 0, false); + std::cerr << "[zktreeutil] created key: " << path << std::endl; + // Set value for the path + string value = zkNodeSptr->getData().value; + if (value != "") + { + zkHandle->setNodeData (path.c_str(), value.c_str()); + std::cerr << "[zktreeutil] set value: " << std::endl; + } + + // Go deep to write the subtree rooted in the node, if not to be ignored + if (!(zkNodeSptr->getData().ignoreUpdate)) + { + for (unsigned i=0; i < zkNodeSptr->numChildren(); i++) + { + ZkTreeNodeSptr childNodeSptr = zkNodeSptr->getChild (i); + // Add the node name into the path and write in zk-tree + string cpath = ((path != "/")? path : "") + + string("/") + + childNodeSptr->getKey(); + writeZkTree_ (zkHandle, childNodeSptr, cpath); + } + } + + return; + } + + static void addTreeZkAction_ (const ZkTreeNodeSptr zkNodeSptr, + const string& path, + vector< ZkAction >& actions) + { + // Create the key + actions.push_back (ZkAction (ZkAction::CREATE, path)); + + // Set value for the new key + if (zkNodeSptr->getData().value != "") + actions.push_back (ZkAction (ZkAction::VALUE, + path, + zkNodeSptr->getData().value)); + + // Add all the children + for (unsigned i=0; i < zkNodeSptr->numChildren(); i++) + { + ZkTreeNodeSptr childSptr = zkNodeSptr->getChild (i); + string cpath = path + string("/") + childSptr->getKey(); + addTreeZkAction_ (childSptr, cpath, actions); + } + + return; + } + + static xmlNodePtr dumpZkTreeXml_ (const ZkTreeNodeSptr zkNodeSptr) + { + // Create xml node with zknode name and value + string nodename = zkNodeSptr->getKey (); + string value = zkNodeSptr->getData().value; + xmlNodePtr node = xmlNewNode(NULL, BAD_CAST "zknode"); + xmlNewProp (node, BAD_CAST "name", BAD_CAST nodename.c_str()); + if (value.length()) + xmlNewProp (node, BAD_CAST "value", BAD_CAST value.c_str()); + + // Add all the children rotted at this node + for (unsigned i=0; i < zkNodeSptr->numChildren(); i++) + xmlAddChild (node, dumpZkTreeXml_ (zkNodeSptr->getChild (i))); + + // Return xml node + return node; + } + + static void dumpZkTree_ (const ZkTreeNodeSptr zkNodeSptr, + int maxLevel, + int level, + vector< bool >& masks) + { + // Check the max. dlevel to be dumped + if (level > maxLevel) + return; + + + // Create branch + for (int i=0; i < level; i++) + { + if ( i== level-1) std::cout << "| "; + else if (masks[i]) std::cout << " "; + else std::cout << "| "; + } + std::cout << std::endl; + for (int i=0; i < level-1; i++) + { + if (masks[i]) std::cout << " "; + else std::cout << "| "; + } + + // Dump the node name and value + std::cout << "|--[" << zkNodeSptr->getKey(); + if (zkNodeSptr->getData().value != "") + std::cout << " => " << zkNodeSptr->getData().value; + std::cout << "]" << std::endl; + + // Dump all the children + for (unsigned i=0; i < zkNodeSptr->numChildren(); i++) + { + // Add mask for last child + if (i == zkNodeSptr->numChildren()-1) + masks.push_back(true); + else + masks.push_back(false); + dumpZkTree_ (zkNodeSptr->getChild (i), maxLevel, level+1, masks); + } + + masks.pop_back(); + return; + } + + static ZkTreeNodeSptr traverseBranch_ (const ZkTreeNodeSptr& zkRootSptr, + const string& path) + { + // Check if the tree is loaded into memory + if (zkRootSptr == NULL) + { + string errMsg = "[zktreeutil] null root passed for traversing"; + std::cout << errMsg << std::endl; + throw std::logic_error (errMsg); + } + + // Split the path and add intermediate znodes + vector< string > nodes; + boost::split(nodes, path, boost::is_any_of ("/") ); + + // Start traversing the tree + ZkTreeNodeSptr currNodeSptr = zkRootSptr; + for (unsigned znode_idx = 1; znode_idx < nodes.size(); znode_idx++) + { + bool found = false; + for (unsigned i=0; i < currNodeSptr->numChildren(); i++) + { + ZkTreeNodeSptr childNodeSptr = currNodeSptr->getChild(i); + if (childNodeSptr->getKey() == nodes[znode_idx]) + { + // Found! go to the znode + currNodeSptr = childNodeSptr; + found = true; + break; + } + } + if (!found) // No such znode found; return NULL node-ptr + { + string errMsg = string("[zktreeutil] unknown znode during traversal: ") + + nodes[znode_idx]; + std::cout << errMsg << std::endl; + throw std::logic_error (errMsg); + } + } + + return currNodeSptr; + } + + static ZkTreeNodeSptr createAncestors_ (const string& path) + { + // Create the root znode + ZkTreeNodeSptr zkRootSptr = ZkTreeNodeSptr (new ZkTreeNode ("/")); + ZkTreeNodeSptr currNodeSptr = zkRootSptr; + // Split the path and add intermediate znodes + vector< string > nodes; + boost::split(nodes, path, boost::is_any_of ("/") ); + for (unsigned i=1; i < nodes.size()-1; i++) + { + ZkTreeNodeSptr childNodeSptr = ZkTreeNodeSptr (new ZkTreeNode (nodes[i])); + currNodeSptr->addChild (childNodeSptr); + currNodeSptr = childNodeSptr; + } + + //Return the root of the branch + return zkRootSptr; + } + + ZooKeeperAdapterSptr ZkTreeUtil::get_zkHandle (const string& zkHosts) + { + try + { + // Create an instance of ZK adapter. + ZooKeeperConfig config (zkHosts, 10000); + ZooKeeperAdapterSptr zkHandleSptr = + ZooKeeperAdapterSptr (new ZooKeeperAdapter (config)); + return zkHandleSptr; + } + catch (const ZooKeeperException &e) + { + std::cerr << "[zktreeutil] zooKeeper exception caught: " + << e.what() + << std::endl; + throw; + } + catch (std::exception &stde) + { + std::cerr << "[zktreeutil] standard exception caught: " + << stde.what() + << std::endl; + throw; + } + catch (...) + { + std::cerr + << "[zktreeutil] unknown exception while connecting to zookeeper" + << std::endl; + throw; + } + } + + + void ZkTreeUtil::loadZkTree (const string& zkHosts, + const string& path, + bool force) + { + // Check if already loaded + if (loaded_ && !force) + { + std::cerr << "[zktreeutil] zk-tree already loaded into memory" + << std::endl; + return; + } + + // Connect to ZK server + ZooKeeperAdapterSptr zkHandle = get_zkHandle (zkHosts); + std::cerr << "[zktreeutil] connected to ZK serverfor reading" + << std::endl; + + // Check the existance of the path to znode + if (!zkHandle->nodeExists (path)) + { + string errMsg = string("[zktreeutil] path does not exists : ") + path; + std::cout << errMsg << std::endl; + throw std::logic_error (errMsg); + } + + // Load the rooted (sub)tree + ZkTreeNodeSptr zkSubrootSptr = loadZkTree_ (zkHandle, path); + + // Create the ancestors before loading the rooted subtree + if (path != "/") + { + zkRootSptr_ = createAncestors_(path); + string ppath = path.substr (0, path.rfind('/')); + ZkTreeNodeSptr parentSptr = traverseBranch_( zkRootSptr_, ppath); + parentSptr->addChild (zkSubrootSptr); + } + else // Loaded entire zk-tree + { + zkRootSptr_ = zkSubrootSptr; + } + + // Set load flag + loaded_ = true; + return; + } + + void ZkTreeUtil::loadZkTreeXml (const string& zkXmlConfig, + bool force) + { + // Check if already loaded + if (loaded_ && !force) + { + std::cerr << "[zktreeutil] zk-tree already loaded into memory" + << std::endl; + return; + } + + // Parse the file and get the DOM + xmlDocPtr docPtr = xmlReadFile(zkXmlConfig.c_str(), NULL, 0); + if (docPtr == NULL) { + std::cerr << "[zktreeutil] could not parse XML file " + << zkXmlConfig + << std::endl; + exit (-1); + } + std::cerr << "[zktreeutil] zk-tree XML parsing successful" + << std::endl; + + // Get the root element node + xmlNodePtr rootPtr = xmlDocGetRootElement(docPtr); + // Create the root zk node + zkRootSptr_ = ZkTreeNodeSptr (new ZkTreeNode ("/")); + // Load the rooted XML tree + for (xmlNode* chldNode = rootPtr->children; + chldNode; + chldNode = chldNode->next) + { + if (chldNode->type == XML_ELEMENT_NODE) + zkRootSptr_->addChild (loadZkTreeXml_ (chldNode)); + } + + // set oad flag + loaded_ = true; + // Cleanup stuff + xmlFreeDoc(docPtr); + xmlCleanupParser(); + return; + } + + void ZkTreeUtil::writeZkTree (const string& zkHosts, + const string& path, + bool force) const + { + // Connect to ZK server + ZooKeeperAdapterSptr zkHandle = get_zkHandle (zkHosts); + std::cerr << "[zktreeutil] connected to ZK server for writing" + << std::endl; + + // Go to the rooted subtree + ZkTreeNodeSptr zkRootSptr = traverseBranch_ (zkRootSptr_, path); + + // Cleanup before write if forceful write enabled + if (force) + { + if (path != "/") // remove the subtree rooted at the znode + { + // Delete the subtree rooted at the znode before write + if (zkHandle->nodeExists (path)) + { + std::cerr << "[zktreeutil] deleting subtree rooted at " + << path + << "..." + << std::endl; + zkHandle->deleteNode (path, true); + } + } + else // remove the rooted znodes + { + std::cerr << "[zktreeutil] deleting rooted zk-tree" + << "..." + << std::endl; + // Get the root's children + vector< string > cnodes = zkHandle->getNodeChildren ("/"); + for (unsigned i=0; i < cnodes.size(); i++) + { + if ( cnodes[i] != "/zookeeper") // reserved for zookeeper use + zkHandle->deleteNode(cnodes[i], true); + } + } + } + + // Start tree construction + writeZkTree_ (zkHandle, zkRootSptr, path); + return; + } + + void ZkTreeUtil::dumpZkTree (bool xml, int depth) const + { + if (xml) + { + // Creates a new document, a node and set it as a root node + xmlDocPtr docPtr = xmlNewDoc(BAD_CAST "1.0"); + xmlNodePtr rootNode = xmlNewNode(NULL, BAD_CAST "root"); + xmlDocSetRootElement(docPtr, rootNode); + + // Add all the rooted children + for (unsigned i=0; i < zkRootSptr_->numChildren(); i++) + xmlAddChild (rootNode, dumpZkTreeXml_ (zkRootSptr_->getChild (i))); + + // Dumping document to stdio or file + xmlSaveFormatFileEnc("-", docPtr, "UTF-8", 1); + + // Cleanup stuff + xmlFreeDoc(docPtr); + xmlCleanupParser(); + return; + } + + // Dump text + std::cout << "/" << std::endl; + vector< bool > masks; + for (unsigned i=0; i < zkRootSptr_->numChildren(); i++) + { + if (i == zkRootSptr_->numChildren()-1) + masks.push_back(true); + else + masks.push_back(false); + dumpZkTree_ (zkRootSptr_->getChild (i), depth, 1, masks); + } + + return; + } + + vector< ZkAction > ZkTreeUtil::diffZkTree (const string& zkHosts, + const string& path) const + { + // Action container + vector< ZkAction > actions; + + if (!loaded_) + { + std::cout << "[zktreeutil] zk-tree not loaded for diff" + << std::endl; + exit (-1); + } + + // Load the rooted subtree from zookeeper + ZooKeeperAdapterSptr zkHandle = get_zkHandle (zkHosts); + std::cerr << "[zktreeutil] connected to ZK server for reading" + << std::endl; + ZkTreeNodeSptr zkLiveRootSptr = loadZkTree_ (zkHandle, path); + + // Go to the saved rooted subtree + ZkTreeNodeSptr zkLoadedRootSptr = + traverseBranch_ (zkRootSptr_, path); + + // Check the root value first + if (zkLoadedRootSptr->getData().value + != zkLiveRootSptr->getData().value) + { + actions.push_back (ZkAction (ZkAction::VALUE, + path, + zkLoadedRootSptr->getData().value, + zkLiveRootSptr->getData().value)); + } + + // Start traversal from root + vector< string > ppaths; + vector< pair< ZkTreeNodeSptr, ZkTreeNodeSptr > > commonNodes; + ppaths.push_back ((path != "/")? path : ""); + commonNodes.push_back (pair< ZkTreeNodeSptr, ZkTreeNodeSptr > + (zkLoadedRootSptr, zkLiveRootSptr)); + + for (unsigned j=0; j < commonNodes.size(); j++) + { + // Get children of loaded tree + map< string, ZkTreeNodeSptr > loadedChildren; + for (unsigned i=0; i < commonNodes[j].first->numChildren(); i++) + { + ZkTreeNodeSptr childSptr = commonNodes[j].first->getChild (i); + loadedChildren[childSptr->getKey()] = childSptr; + } + // Get children of live tree + map< string, ZkTreeNodeSptr > liveChildren; + for (unsigned i=0; i < commonNodes[j].second->numChildren(); i++) + { + ZkTreeNodeSptr childSptr = commonNodes[j].second->getChild (i); + liveChildren[childSptr->getKey()] = childSptr; + } + + // Start comparing the children + for (map< string, ZkTreeNodeSptr >::const_iterator it = + loadedChildren.begin(); + it != loadedChildren.end(); + it++) + { + bool ignoreKey = it->second->getData().ignoreUpdate; + string loadedVal = it->second->getData().value; + // Path to this node + string path = ppaths[j] + string("/") + it->first; + + map< string, ZkTreeNodeSptr >::const_iterator jt = + liveChildren.find (it->first); + if (jt != liveChildren.end()) + { + // Key is present in live zk-tree + string liveVal = jt->second->getData().value; + // Check value for the key, if not ignored + if (!ignoreKey) + { + if (loadedVal != liveVal) + { + // Value differs, set the new value for the key + actions.push_back (ZkAction (ZkAction::VALUE, + path, + loadedVal, + liveVal)); + } + + // Add node to common nodes + ppaths.push_back (path); + commonNodes.push_back (pair< ZkTreeNodeSptr, ZkTreeNodeSptr > + (it->second, jt->second)); + } + + // Remove the live zk node + liveChildren.erase (it->first); + } + else + { + // Add the subtree rooted to this node, if not ignored + if (!ignoreKey) + addTreeZkAction_ (it->second, path, actions); + } + } + + // Remaining live zk nodes to be deleted + for (map< string, ZkTreeNodeSptr >::const_iterator it = liveChildren.begin(); + it != liveChildren.end(); it++) + { + string path = ppaths[j] + string("/") + it->first; + actions.push_back (ZkAction (ZkAction::DELETE, path)); + } + } + // return the diff actions + return actions; + } + + void ZkTreeUtil::executeZkActions (const string& zkHosts, + const vector< ZkAction >& zkActions, + int execFlags) const + { + // Execute the diff zk actions + if (zkActions.size()) + { + // Connect to Zookeeper for writing + ZooKeeperAdapterSptr zkHandleSptr; + if ((execFlags & EXECUTE) + || (execFlags & INTERACTIVE)) + { + zkHandleSptr = get_zkHandle (zkHosts); + std::cerr << "[zktreeutil] connected to ZK server for writing" + << std::endl; + } + + for (unsigned i=0; i < zkActions.size(); i++) + { + if (zkActions[i].action == ZkAction::CREATE) + { + if (execFlags & PRINT) + std::cout << "CREAT- key:" << zkActions[i].key << std::endl; + if (execFlags & EXECUTE) + { + if (execFlags & INTERACTIVE) + { + string resp; + std::cout << "Execute this action?[yes/no]: "; + std::getline(std::cin, resp); + if (resp != "yes") + continue; + } + zkHandleSptr->createNode(zkActions[i].key.c_str(), "", 0, false); + } + } + else if (zkActions[i].action == ZkAction::DELETE) + { + if (execFlags & PRINT) + std::cout << "DELET- key:" << zkActions[i].key << std::endl; + if (execFlags & EXECUTE) + { + if (execFlags & INTERACTIVE) + { + string resp; + std::cout << "Execute this action?[yes/no]: "; + std::getline(std::cin, resp); + if (resp != "yes") + continue; + } + zkHandleSptr->deleteNode(zkActions[i].key.c_str(), true); + } + } + else if (zkActions[i].action == ZkAction::VALUE) + { + if (execFlags & PRINT) + { + std::cout << "VALUE- key:" + << zkActions[i].key + << " value:" << zkActions[i].newval; + if (zkActions[i].oldval != "") + std::cout << " old_value:" << zkActions[i].oldval; + std::cout << std::endl; + } + if (execFlags & EXECUTE) + { + if (execFlags & INTERACTIVE) + { + string resp; + std::cout << "Execute this action?[yes/no]: "; + std::getline(std::cin, resp); + if (resp != "yes") + continue; + } + zkHandleSptr->setNodeData (zkActions[i].key, zkActions[i].newval); + } + } + } + } + + return; + } + +} + diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/zktreeutil/src/ZkTreeUtil.h b/pkg/registry/zookeeper-3.4.6/src/contrib/zktreeutil/src/ZkTreeUtil.h new file mode 100644 index 000000000..0a9be03f8 --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/contrib/zktreeutil/src/ZkTreeUtil.h @@ -0,0 +1,262 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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. + */ + +#ifndef __ZK_TREE_UTIL_H__ +#define __ZK_TREE_UTIL_H__ + +#include +#include +#include "SimpleTree.h" +#include "ZkAdaptor.h" + +namespace zktreeutil +{ + +#define ZKTREEUTIL_INF 1000000000 + /** + * \brief A structure containing ZK node data. + */ + struct ZkNodeData + { + /** + * \brief The value string of the ZK node. + */ + string value; + + /** + * \brief The flag indicating whether children of the + * \brief node shduld be ignored during create/diff/update + */ + bool ignoreUpdate; + + /** + * \brief Constructor. + * + * @param val the value string + * @param ignore the flag indicating ignore any update/diff + */ + ZkNodeData (const string& val, bool ignore=false) + : value (val), ignoreUpdate (ignore) {} + + /** + * \brief Constructor. + * + * @param ignore the flag indicating ignore any update/diff + */ + ZkNodeData (bool ignore=false) + : ignoreUpdate (ignore) {} + }; + + /** + * \brief The type representing a ZK Treenode + */ + typedef SimpleTreeNode< string, ZkNodeData > ZkTreeNode; + + /** + * \brief The type representing a ZK Treenode smart-pointer + */ + typedef boost::shared_ptr< ZkTreeNode > ZkTreeNodeSptr; + + /** + * \brief The type representing a ZK Adapter smart-pointer + */ + typedef boost::shared_ptr< ZooKeeperAdapter > ZooKeeperAdapterSptr; + + /** + * \brief A structure defining a particular action on ZK node; + * \brief the action can be any of - + * \brief CREAT- : creates recussively + * \brief DELET- : deletes recursively + * \brief VALUE- : sets to + */ + struct ZkAction + { + /** + * \brief The action type; any of create/delete/setvalue. + */ + enum ZkActionType + { + NONE, + CREATE, + DELETE, + VALUE, + }; + + /** + * \brief action of this instance + */ + ZkActionType action; + + /** + * \brief ZK node key + */ + string key; + + /** + * \brief value to be set, if action is setvalue + */ + string newval; + + /** + * \brief existing value of the ZK node key + */ + string oldval; + + /** + * \brief Constructor. + */ + ZkAction () + : action (ZkAction::NONE) {} + + /** + * \brief Constructor. + * + * @param act the action to be taken + * @param k the key on which action to be taken + */ + ZkAction (ZkActionType act, const string& k) + : action(act), + key(k) {} + + /** + * \brief Constructor. + * + * @param act the action to be taken + * @param k the key on which action to be taken + * @param v the value of the ZK node key + */ + ZkAction (ZkActionType act, const string& k, const string& v) + : action(act), + key(k), + newval(v) {} + + /** + * \brief Constructor. + * + * @param act the action to be taken + * @param k the key on which action to be taken + * @param nv the new value of the ZK node key + * @param ov the old value of the ZK node key + */ + ZkAction (ZkActionType act, const string& k, const string& nv, const string& ov) + : action (act), + key(k), + newval(nv), + oldval(ov) {} + }; + + /** + * \brief The ZK tree utility class; supports loading ZK tree from ZK server OR + * \brief from saved XML file, saving ZK tree into XML file, dumping the ZK tree + * \brief on standard output, creting a diff between saved ZK tree and live ZK + * \brief tree and incremental update of the live ZK tree. + */ + class ZkTreeUtil + { + public: + /** + * \brief Execution flag on ZkAction + */ + enum ZkActionExecuteFlag + { + NONE = 0, + PRINT = 1, + EXECUTE = 2, + INTERACTIVE = 5, + }; + + public: + /** + * \brief Connects to zookeeper and returns a valid ZK handle + * + * @param zkHosts comma separated list of host:port forming ZK quorum + * @param a valid ZK handle + */ + static ZooKeeperAdapterSptr get_zkHandle (const string& zkHosts); + + + public: + /** + * \brief Constructor. + */ + ZkTreeUtil () : loaded_(false) {} + + /** + * \brief loads the ZK tree from ZK server into memory + * + * @param zkHosts comma separated list of host:port forming ZK quorum + * @param path path to the subtree to be loaded into memory + * @param force forces reloading in case tree already loaded into memory + */ + void loadZkTree (const string& zkHosts, const string& path="/", bool force=false); + + /** + * \brief loads the ZK tree from XML file into memory + * + * @param zkXmlConfig ZK tree XML file + * @param force forces reloading in case tree already loaded into memory + */ + void loadZkTreeXml (const string& zkXmlConfig, bool force=false); + + /** + * \brief writes the in-memory ZK tree on to ZK server + * + * @param zkHosts comma separated list of host:port forming ZK quorum + * @param path path to the subtree to be written to ZK tree + * @param force forces cleanup of the ZK tree on the ZK server before writing + */ + void writeZkTree (const string& zkHosts, const string& path="/", bool force=false) const; + + /** + * \brief dupms the in-memory ZK tree on the standard output device; + * + * @param xml flag indicates whether tree should be dumped in XML format + * @param depth the depth of the tree to be dumped for non-xml dump + */ + void dumpZkTree (bool xml=false, int depth=ZKTREEUTIL_INF) const; + + /** + * \brief returns a list of actions after taking a diff of in-memory + * \brief ZK tree and live ZK tree. + * + * @param zkHosts comma separated list of host:port forming ZK quorum + * @param path path to the subtree in consideration while taking diff with ZK tree + * @return a list of ZKAction instances to be performed on live ZK tree + */ + vector< ZkAction > diffZkTree (const string& zkHosts, const string& path="/") const; + + /** + * \brief performs create/delete/setvalue by executing a set of + * ZkActions on a live ZK tree. + * + * @param zkHosts comma separated list of host:port forming ZK quorum + * @param zkActions set of ZkActions + * @param execFlags flags indicating print/execute/interactive etc + */ + void executeZkActions (const string& zkHosts, + const vector< ZkAction >& zkActions, + int execFlags) const; + + private: + + ZkTreeNodeSptr zkRootSptr_; // ZK tree root node + bool loaded_; // Falg indicating whether ZK tree loaded into memory + }; +} + +#endif // __ZK_TREE_UTIL_H__ diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/zktreeutil/src/ZkTreeUtilMain.cc b/pkg/registry/zookeeper-3.4.6/src/contrib/zktreeutil/src/ZkTreeUtilMain.cc new file mode 100644 index 000000000..8afebf6e2 --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/contrib/zktreeutil/src/ZkTreeUtilMain.cc @@ -0,0 +1,247 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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. + */ + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include +#ifndef _GNU_SOURCE +#define _GNU_SOURCE +#endif +#include +#include +#include "ZkTreeUtil.h" + +using namespace zktreeutil; + +// The set of "long" options accepted by this program. +static struct option long_options[] = { + {"help", no_argument, 0, 'h'}, + {"import", no_argument, 0, 'I'}, + {"export", no_argument, 0, 'E'}, + {"update", no_argument, 0, 'U'}, + {"diff", no_argument, 0, 'F'}, + {"dump", no_argument, 0, 'D'}, + {"force", no_argument, 0, 'f'}, + {"xmlfile", required_argument, 0, 'x'}, + {"path", required_argument, 0, 'p'}, + {"depth", required_argument, 0, 'd'}, + {"zookeeper", required_argument, 0, 'z'}, + {0, 0, 0, 0} +}; +static char *short_options = "IEUFDfx:p:d:hz:"; + +static void usage(int argc, char *argv[]) +{ + std::cout << "ZK-tree utility for managing ZK-tree with XML import/export," << std::endl; + std::cout << "viewing diff between live and saved ZK-tree and performing" << std::endl; + std::cout << "incremental update of the same." << std::endl; + std::cout << "Usage: " << argv[0] << " [args-and-values]+" << std::endl; + std::cout + << "\t--import or -I: " + << std::endl + << "\t Imports the zookeeper tree from XML file. Must be specified with" + << std::endl + << "\t --zookeeper AND --xmlfile options. Optionally takes --path for" + << std::endl + << "\t importing subtree" + << std::endl; + std::cout + << "\t--export or -E: " + << std::endl + << "\t Exports the zookeeper tree to XML file. Must be specified with" + << std::endl + << "\t --zookeeper option. Optionally takes --path for exporting subtree" + << std::endl; + std::cout + << "\t--update or -U: " + << std::endl + << "\t Updates zookeeper tree with changes from XML file. Update operation" + << std::endl + << "\t is interactive unless specified with --force option. Must be speci-" + << std::endl + << "\t fied with --zookeeper AND --xmlfile options. Optionally takes --path" + << std::endl + << "\t for updating subtree." + << std::endl; + std::cout + << "\t--diff or -F: " + << std::endl + << "\t Creates a list of diff actions on ZK tree based on XML data. Must" + << std::endl + << "\t be specified with --zookeeper OR --xmlfile options. Optionally takes" + << std::endl + << "\t --path for subtree diff" + << std::endl; + std::cout + << "\t--dump or -D: " + << std::endl + << "\t Dumps the entire ZK (sub)tree to standard output. Must be specified" + << std::endl + << "\t with --zookeeper OR --xmlfile options. Optionally takes --path and" + << std::endl + << "\t --depth for dumping subtree." + << std::endl; + std::cout + << "\t--xmlfile= or -x : " + << std::endl + << "\t Zookeeper tree-data XML file." + << std::endl; + std::cout + << "\t--path= or -p : " + << std::endl + << "\t Path to the zookeeper subtree rootnode." + << std::endl; + std::cout + << "\t--depth= or -d : " + << std::endl + << "\t Depth of the ZK tree to be dumped (ignored for XML dump)." + << std::endl; + std::cout + << "\t--force or -f: Forces cleanup before import; also used for forceful" + << std::endl + << "\t update. Optionally be specified with --import and --update." + << std::endl; + std::cout + << "\t--help or -h: " + << std::endl + << "\t prints this message" + << std::endl; + std::cout + << "\t--zookeeper= or -z : " + << std::endl + << "\t specifies information to connect to zookeeper." + << std::endl; +} + +int main(int argc, char **argv) +{ + if (argc == 1) { + usage(argc, argv); + exit(0); + } + + // Parse the arguments. + int op = 0; + bool force = false; + string zkHosts; + string xmlFile; + string path = "/"; + int depth = 0; + while (1) + { + int c = getopt_long(argc, argv, short_options, long_options, 0); + if (c == -1) + break; + + switch (c) { + case 'I': op = c; + break; + case 'E': op = c; + break; + case 'U': op = c; + break; + case 'F': op = c; + break; + case 'D': op = c; + break; + case 'f': force = true; + break; + case 'x': xmlFile = optarg; + break; + case 'p': path = optarg; + break; + case 'd': depth = atoi (optarg); + break; + case 'z': zkHosts = optarg; + break; + case 'h': usage (argc, argv); + exit(0); + } + } + + ZkTreeUtil zkTreeUtil; + switch (op) + { + case 'I': { + if (zkHosts == "" || xmlFile == "") + { + std::cout << "[zktreeutil] missing params; please see usage" << std::endl; + exit (-1); + } + zkTreeUtil.loadZkTreeXml (xmlFile); + zkTreeUtil.writeZkTree (zkHosts, path, force); + std::cout << "[zktreeutil] import successful!" << std::endl; + break; + } + case 'E': { + if (zkHosts == "") + { + std::cout << "[zktreeutil] missing params; please see usage" << std::endl; + exit (-1); + } + zkTreeUtil.loadZkTree (zkHosts, path); + zkTreeUtil.dumpZkTree (true); + break; + } + case 'U': { + if (zkHosts == "" || xmlFile == "") + { + std::cout << "[zktreeutil] missing params; please see usage" << std::endl; + exit (-1); + } + zkTreeUtil.loadZkTreeXml (xmlFile); + vector< ZkAction > zkActions = zkTreeUtil.diffZkTree (zkHosts, path); + int flags = ZkTreeUtil::EXECUTE; + if (!force) flags |= ZkTreeUtil::INTERACTIVE; + zkTreeUtil.executeZkActions (zkHosts, zkActions, flags); + std::cout << "[zktreeutil] update successful!" << std::endl; + break; + } + case 'F': { + if (zkHosts == "" || xmlFile == "") + { + std::cout << "[zktreeutil] missing params; please see usage" << std::endl; + exit (-1); + } + zkTreeUtil.loadZkTreeXml (xmlFile); + vector< ZkAction > zkActions = zkTreeUtil.diffZkTree (zkHosts, path); + zkTreeUtil.executeZkActions (zkHosts, zkActions, ZkTreeUtil::PRINT); + break; + } + case 'D': { + if (zkHosts != "") + zkTreeUtil.loadZkTree (zkHosts, path); + else if (xmlFile != "") + zkTreeUtil.loadZkTreeXml (xmlFile); + else + { + std::cout << "[zktreeutil] missing params; please see usage" << std::endl; + exit (-1); + } + // Dump the ZK tree + if (depth) zkTreeUtil.dumpZkTree (false, depth); + else zkTreeUtil.dumpZkTree (false); + break; + } + } + + exit(0); +} + diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/zktreeutil/tests/zk_sample.xml b/pkg/registry/zookeeper-3.4.6/src/contrib/zktreeutil/tests/zk_sample.xml new file mode 100644 index 000000000..6e97daa5f --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/contrib/zktreeutil/tests/zk_sample.xml @@ -0,0 +1,44 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/zooinspector/NOTICE.txt b/pkg/registry/zookeeper-3.4.6/src/contrib/zooinspector/NOTICE.txt new file mode 100644 index 000000000..e0bf2f0d7 --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/contrib/zooinspector/NOTICE.txt @@ -0,0 +1,3 @@ +This contrib module includes icons available under the Eclipse Public Licence Version 1.0 +. from the Eclipse Java Devlopment Platform. +The lib sub-directory includes a binary only jar library developed at http://sourceforge.net/projects/jtoaster/ \ No newline at end of file diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/zooinspector/README.txt b/pkg/registry/zookeeper-3.4.6/src/contrib/zooinspector/README.txt new file mode 100644 index 000000000..3c2a58f42 --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/contrib/zooinspector/README.txt @@ -0,0 +1,94 @@ +========================================== +ZooInspector - Browser and Editor for ZooKeeper Instances +Author: Colin Goodheart-Smithe +Date: February 2010 +========================================== + +ZooInspector is a Java Swing based application for browsing and editing ZooKeeper instances. + +Contents +-------- + - Features + - Pre-requisites + - Build Instructions + - Using ZooInspector + - Creating and Using Plugins + +Features +-------- + Below is a list of features in the current release of ZooInspector. + - Load connection settings from a zookeeper properties file + - Plugable DataEncryptionManagers to specify how data should be encrypted and decrypted in the Zookeeper instance + - Browseable tree view of the ZooKeeper instance + - View the data in a node + - View the ACL's currently applied to a node + - View the metadata for a node (Version, Number of Children, Last modified Tiem, etc.) + - Plugable NodeViewers interface + - Ability to save/load and set default Node Viewers + +Pre-requisites +-------------- + - The main zookeeper build script must have been run before building this module + +Build Instructions +------------------ + 1. Open a command line. + 2. cd into this directory + 3. Run command: ant + 4. ZooInspector will be built to ../../../build/contrib/ZooInspector + 5. Copy zookeeper-3.x.x.jar into the lib sub-directory (if you are using zookeeper-3.3.0.jar it will have been + copied to this directory during the build + 6. By default the zookeeper.cmd and zookeeper.sh files expect zookeeper-3.3.0.jar. If you are using another version + you will need to change these files to point to the zookeeper-3.x.x.jar you copied to the lib directory + 7. To run ZooInspector run zooInspector.cmd (on Windows) or zooInspector.sh (on Linux). If you are using + zookeeper-3.3.0.jar and do not require any classpath changes you can run the zookeeper-dev-ZooInspector.jar + directly + +Using ZooInspector +------------------ + To start ZooInspector run zooInspector.cmd (on Windows) or zooInspector.sh (on Linux). If you are using + zookeeper-3.3.0.jar and do not require any classpath changes you can run the zookeeper-dev-ZooInspector.jar + directly. + + Click the play button on the toolbar to bring up the connection dialog. From here you can enter connection + information for your zookeeper instance. You can also load the connection properties from a file. This file can + have the format as a normal zookeeper properties file (i.e. hosts and timeout key-value pairs) and van optional have + an encryptionManager key-value pair to specify the DataEncryptionManager to use for this connection + (DataEncryptionManagers are explained in further detail in the 'Creating and Using Plugins' section below). You can + also set the entered information as the defaults so that when you first start ZooInspector these settings are + automatically loaded into this dialog. Pressing the OK button with connect to your ZooKeeper instance and show the + current node tree on the left of the main panel. + + Clicking a node in the node tree will load the data for that node into the node viewers. Three node viewers are + currently distributed with ZooInspector: + 1. Node Data - This enables you to see the data current stored on that node. This data can be modified and + saved. The data is decrypted and encrypted using the DataEncryptionManager specified on the connection + dialog. + 2. Node Metadata - This enables you to see the metadata associiated with this node. This is Essentially the data + obtained from the Stat object for this node. + 3. Node ACLs - This allows you to see the ACLs currently applied to this node. Currently there is no ability + to change the ACLs on a node, but it is a feature I would like to add. + Other custom Node Viewers can be added, this is explained in the 'Creating and Using Plugins' section below. + + +Creating and Using Plugins +-------------------------- + There are two types of plugin which can be used with ZooInspector: + 1. DataEncryptionManager - This specifies how data should be encrypted and decrypted when working with a + zookeeper instance. + 2. ZooInspectorNodeViewer - This is a GUI panel which provides a view of visualisation on a node. + More information on these interfaces can be found in the javadocs for this module. + + To use a plugin in ZooInspector, build the plugin to a jar and copy the jar to the lib sub-directory. Edit the + zooInspector.cmd and/or zooInspector.sh files to include your new jar on the classpath and run ZooInspector. + + For DataEncryptionManagers, click the play button to open the connection dialog and enter the full class name of + your DataEncryptionManager in the 'Data Encryption Manager' field. You can make this Data Encryption Manager the + default by clicking 'Set As Default'. Click the 'OK' button to instantiate and use your plugin. + + For ZooInspectorNodeViewers, Click the 'Change Node Viewers' button on the toolbar (looks like a tree with a pencil) + and enter the full classname for your Node Viewer in the field left of the 'Add' button, then click the 'Add' + button. The Node Viewer will be instantiated and should appear in the list. You can change the order of the Node + viewers by clicking the up and dpwn buttons and delete a Node Viewer by clicking the delete button. You can save + to configuration to a file or set it as the default if necessary. Then click the 'OK' button and your Node Viewer + should appear in the tabs on the right of the main panel. \ No newline at end of file diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/zooinspector/build.xml b/pkg/registry/zookeeper-3.4.6/src/contrib/zooinspector/build.xml new file mode 100644 index 000000000..a2427909e --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/contrib/zooinspector/build.xml @@ -0,0 +1,152 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Tests failed! + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/zooinspector/config/defaultConnectionSettings.cfg b/pkg/registry/zookeeper-3.4.6/src/contrib/zooinspector/config/defaultConnectionSettings.cfg new file mode 100644 index 000000000..36a34ff30 --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/contrib/zooinspector/config/defaultConnectionSettings.cfg @@ -0,0 +1,21 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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. +# +#Default connection for ZooInspector +hosts=localhost\:2181 +encryptionManager=org.apache.zookeeper.inspector.encryption.BasicDataEncryptionManager +timeout=5000 +authScheme= +authData= diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/zooinspector/config/defaultNodeVeiwers.cfg b/pkg/registry/zookeeper-3.4.6/src/contrib/zooinspector/config/defaultNodeVeiwers.cfg new file mode 100644 index 000000000..38fe9a85e --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/contrib/zooinspector/config/defaultNodeVeiwers.cfg @@ -0,0 +1,17 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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. +org.apache.zookeeper.inspector.gui.nodeviewer.NodeViewerData +org.apache.zookeeper.inspector.gui.nodeviewer.NodeViewerMetaData +org.apache.zookeeper.inspector.gui.nodeviewer.NodeViewerACL diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/zooinspector/icons/edtsrclkup_co.gif b/pkg/registry/zookeeper-3.4.6/src/contrib/zooinspector/icons/edtsrclkup_co.gif new file mode 100644 index 0000000000000000000000000000000000000000..94eedf6f92944ef56a7165d98ee6482ad24d00f3 GIT binary patch literal 204 zcmZ?wbhEHb6krfwIKsdXQ?+X1(&P7^zE^TizkPY(?k!y(Zmf8Dr0(0Z6O(Jgr_{$z zZA_S45!jz;(U)n_pJO+nzamx|{omhdZ+pPy1w_LK}lAnr-`SJ62+pK*(^ACOa@_X{KW3$$r zUbOlAiXE5N?74dH#gDtszu$lH{mGl3&)@xg`{~!`Z@=#VMPB~6_u~7*S3h2T`1$R} z?`Q9Re)#(P)3@JWfBgRb^LKTLe^s%6bxA;7sb4jaQ5?`-<Y72H(vk7Xs us!1$fvP8{QU92ZrK%7tARasP&f6JDw8m_8J3W|I7DyXXX9C3DJum%7=h^`F) literal 0 HcmV?d00001 diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/zooinspector/icons/fldr_obj.gif b/pkg/registry/zookeeper-3.4.6/src/contrib/zooinspector/icons/fldr_obj.gif new file mode 100644 index 0000000000000000000000000000000000000000..51e703b1b9c671baa2be0f6525edb3b69403370d GIT binary patch literal 216 zcmZ?wbhEHb6krfwIKsg2wj(b5!P~sjn^4pBFDXFJ7TPNb)}zFdzZN zpDc_F4AKlbATf}g46LCK)cR5~=VfGBty!EmMJ+qTijl!k<;;`cOWYDXbj&=28jDUI znIPA;;-J&oD09KqYe6rnb~B%5E3$|tF?k!UrOe@6&xDe6Z(8Y4cFg@2oFwXHJRx@P^{Hj-{g3x~&Wh)&R@kLgN4c literal 0 HcmV?d00001 diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/zooinspector/icons/launch_run.gif b/pkg/registry/zookeeper-3.4.6/src/contrib/zooinspector/icons/launch_run.gif new file mode 100644 index 0000000000000000000000000000000000000000..57f410224cf0e125fefdfbfd424b34ca32650ac4 GIT binary patch literal 379 zcmZ?wbhEHb6krfwxXQqw(BP;BL>-Qf6T{aP*iM?lCLeYNChZ zME|t4Kq*J#ax2FU508od{@|VOltj+J(UOww!N5}U3iQCI3ZqHwGu%qFO+M$;f|G|KP zbfEZ?g^__lk3k2d733!dwiyo73p{kh9NV1~0xTMO)-@+?HCpL1C+*_|jkQs$L%3SK zWZD#%Uw+AK^#3sVq2$yax7_cq>g;#(C^lABHOjI%u}OEy<@M@F%Q8AK@K5dOm7mJO z;KV30f4Z*Rd;#G}fjokO)8$r)3o+Lza0p5E$no(>iVJg;1ab?@$%#scNeOe;IkR(c Y3G?y_b8(z@@nG_1@(Z}@>d0UX09ibCp#T5? literal 0 HcmV?d00001 diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/zooinspector/icons/launch_stop.gif b/pkg/registry/zookeeper-3.4.6/src/contrib/zooinspector/icons/launch_stop.gif new file mode 100644 index 0000000000000000000000000000000000000000..fbf1686e4b47fd4e9fe639c6b6d7bb49ca09b706 GIT binary patch literal 916 zcma)5Ur1A76hFJWvg?r8zLu)g97e2UJ)cYo*m&hPxr`ObGw zHlGlVw3)yJ-2jSHPy|sC-HKbvwFeR=yJC0B4q@ICkR?%Wb+3=dWKoCD>tJZN&Y})vc0? zTOEK!!^&%5<_m>7ZC_W>bffI*0Q3M>?MO!kHZXwP0@Ip=?UVM1>UuGCF{Xf8sWA(3 z)Kjm6bOcEU|GOtg`5x>V>q(97$0M}V=%K74XBDyf1rJb_8f)3XjPuJ9KnQ?UaVC_s zI}OT#>bSLH<}0q*A08y4I)F~U@`hh_BjWqhz;@}spU0B0JaRKb20rPPmvrzs9h@Tm z1Ot1pchVsPFe=U=z6~%Txx#KZA-Ifg}E3bkV~vIf*ZhHQ@NZ<>v6tiSIG- zJpteVwvnz-wlM@ySr)le222^KbHuRX_{y85@o6sN&lpg|KRX{GE~iCqrTN3WZDOeH zD$FI%!P#(rsFZ_rp2k-}g#b=1?~2ho0qqqLoD>;I_~1$d9PEONHF*}VfWSVLrv4Ma zU5C9K?;ejP?{V90ebMO9v2L@mwpEFe)rKmPps{rBguKlfhzc=G1w^LIbre)@Ii`S<%Te>{Bk z12|TpyR{>mrI{2JXHL%C7O09Mu>554H9&1sF`=rV`q@7GGB8G zKfk`Pt2BF0FFPY+r;7~t)M?XXTxEIZ%$>s~>nhH=Wa(0IS4pnbYt~4*N^x%5yop81 WRg`1b?%krUA_op05^-{5um%7kHK6(c literal 0 HcmV?d00001 diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/zooinspector/icons/refresh.gif b/pkg/registry/zookeeper-3.4.6/src/contrib/zooinspector/icons/refresh.gif new file mode 100644 index 0000000000000000000000000000000000000000..3ca04d06ff9c811a6f791d029a802a7be4681ff4 GIT binary patch literal 327 zcmZ?wbhEHb6krfwxXQrrJWa!4-LeYm0=|77MK@5?WI%v@BcT|Ns9CR0WDZSr{1@R2g(Yrh@#$z?O1g zQh|q#RHw+PiyoXB)1AE)3U1~skT{fJ?U6BUYICAZn$5HYp3GD7dKS#fQdLEHHy z6I^aRo~tUt;P2kV6w~t;=?ud9vy7?cE^q z*1q%4_Md-x_|o&km!6%t_VVPl7w2!kK6mTY)%$O+-hXrZ@w-PaKBPA<&u(2-(6RIc zNcPq9H=oX5zOnP@<=ao*J$&)u*_+SB-Al@Q7r*)NC8Bg+ zz;2_n+r|KMbN2{G6a4_&{kGN)4gvc5juAGR#sRMOu1@w&t^vlzRuN`KMgigX?uQ4k zYgk5@s;SFPcrC52W*VWRCnlyRuKMMRsEVpigru?tONzsU2OVNcZfg!)N^s&3;9>A! zDQIQv=+@exGeO}YGc&uwQjf$B2b)>gB6wUn7Bn7go*uf&AmXGW<1{9LBBLK|is)RRH2yZMG-dG{LyHRvkqv*C;prFW}Cb1QH0&9u|R~HDbFBMu_B(%Cf zXj8fH`cmQLIReYF1^)m4&p+|z+lLr1JVKV69Zf3ff)rJI#S8AmOS&g!objY zXp*F{?P9eo9}@`oK{Iw9&}i^SBU4D}c3FLN?5SiQ`V!5RSYo{04T literal 0 HcmV?d00001 diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/zooinspector/icons/search_prev.gif b/pkg/registry/zookeeper-3.4.6/src/contrib/zooinspector/icons/search_prev.gif new file mode 100644 index 0000000000000000000000000000000000000000..07164754e5ca231666d9daf7fa4a9d12e378a52a GIT binary patch literal 323 zcmZ?wbhEHb6krfwxXQrr@9+D6zn=X4cJ<${r+>d*`SKk--`OT*-X9 literal 0 HcmV?d00001 diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/zooinspector/icons/trash.gif b/pkg/registry/zookeeper-3.4.6/src/contrib/zooinspector/icons/trash.gif new file mode 100644 index 0000000000000000000000000000000000000000..5f47780f0e61161f1fb21701d68f697fe80cbec9 GIT binary patch literal 132 zcmV-~0DJ#ONk%w1VGsZi0Kx|VhLob9uDr9s&%Mjp$JFB5==JpZ{{R30A^8LW000L7 zEC2ui01yBW0009?c&gC8kOf0c0P(oZ7pO)d76c&(n8vM*SB<2ZGNDimwh*AuSJ=4U mZlJf6sN=bQN1>AjWhS3M!*M literal 0 HcmV?d00001 diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/zooinspector/ivy.xml b/pkg/registry/zookeeper-3.4.6/src/contrib/zooinspector/ivy.xml new file mode 100644 index 000000000..096f05c3f --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/contrib/zooinspector/ivy.xml @@ -0,0 +1,48 @@ + + + + + + + + ZooInspector + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/zooinspector/lib/jtoaster-1.0.4.jar b/pkg/registry/zookeeper-3.4.6/src/contrib/zooinspector/lib/jtoaster-1.0.4.jar new file mode 100644 index 0000000000000000000000000000000000000000..aaf3f6ea06f4b66fbe1719f63dd8f68e6ed05193 GIT binary patch literal 14975 zcma)j1CS-#)@IqZZ5v&-ZQHhO+vswaZQHhOqpP~AOVj<{%-p^==700niHyh-=j6)0 zkSq88_P6AvfI(0IAbx#Tnn;)d{ty%Z5C9nwWdT|VSy6f!0a*!A5hZ0h8PSh%0DuRX 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 + + + + + +Eclipse Public License - Version 1.0 + + + + + + +

      Eclipse Public License - v 1.0

      + +

      THE ACCOMPANYING PROGRAM IS PROVIDED UNDER THE TERMS OF THIS ECLIPSE +PUBLIC LICENSE ("AGREEMENT"). ANY USE, REPRODUCTION OR +DISTRIBUTION OF THE PROGRAM CONSTITUTES RECIPIENT'S ACCEPTANCE OF THIS +AGREEMENT.

      + +

      1. DEFINITIONS

      + +

      "Contribution" means:

      + +

      a) in the case of the initial Contributor, the initial +code and documentation distributed under this Agreement, and

      +

      b) in the case of each subsequent Contributor:

      +

      i) changes to the Program, and

      +

      ii) additions to the Program;

      +

      where such changes and/or additions to the Program +originate from and are distributed by that particular Contributor. A +Contribution 'originates' from a Contributor if it was added to the +Program by such Contributor itself or anyone acting on such +Contributor's behalf. Contributions do not include additions to the +Program which: (i) are separate modules of software distributed in +conjunction with the Program under their own license agreement, and (ii) +are not derivative works of the Program.

      + +

      "Contributor" means any person or entity that distributes +the Program.

      + +

      "Licensed Patents" mean patent claims licensable by a +Contributor which are necessarily infringed by the use or sale of its +Contribution alone or when combined with the Program.

      + +

      "Program" means the Contributions distributed in accordance +with this Agreement.

      + +

      "Recipient" means anyone who receives the Program under +this Agreement, including all Contributors.

      + +

      2. GRANT OF RIGHTS

      + +

      a) Subject to the terms of this Agreement, each +Contributor hereby grants Recipient a non-exclusive, worldwide, +royalty-free copyright license to reproduce, prepare derivative works +of, publicly display, publicly perform, distribute and sublicense the +Contribution of such Contributor, if any, and such derivative works, in +source code and object code form.

      + +

      b) Subject to the terms of this Agreement, each +Contributor hereby grants Recipient a non-exclusive, worldwide, +royalty-free patent license under Licensed Patents to make, use, sell, +offer to sell, import and otherwise transfer the Contribution of such +Contributor, if any, in source code and object code form. This patent +license shall apply to the combination of the Contribution and the +Program if, at the time the Contribution is added by the Contributor, +such addition of the Contribution causes such combination to be covered +by the Licensed Patents. The patent license shall not apply to any other +combinations which include the Contribution. No hardware per se is +licensed hereunder.

      + +

      c) Recipient understands that although each Contributor +grants the licenses to its Contributions set forth herein, no assurances +are provided by any Contributor that the Program does not infringe the +patent or other intellectual property rights of any other entity. Each +Contributor disclaims any liability to Recipient for claims brought by +any other entity based on infringement of intellectual property rights +or otherwise. As a condition to exercising the rights and licenses +granted hereunder, each Recipient hereby assumes sole responsibility to +secure any other intellectual property rights needed, if any. For +example, if a third party patent license is required to allow Recipient +to distribute the Program, it is Recipient's responsibility to acquire +that license before distributing the Program.

      + +

      d) Each Contributor represents that to its knowledge it +has sufficient copyright rights in its Contribution, if any, to grant +the copyright license set forth in this Agreement.

      + +

      3. REQUIREMENTS

      + +

      A Contributor may choose to distribute the Program in object code +form under its own license agreement, provided that:

      + +

      a) it complies with the terms and conditions of this +Agreement; and

      + +

      b) its license agreement:

      + +

      i) effectively disclaims on behalf of all Contributors +all warranties and conditions, express and implied, including warranties +or conditions of title and non-infringement, and implied warranties or +conditions of merchantability and fitness for a particular purpose;

      + +

      ii) effectively excludes on behalf of all Contributors +all liability for damages, including direct, indirect, special, +incidental and consequential damages, such as lost profits;

      + +

      iii) states that any provisions which differ from this +Agreement are offered by that Contributor alone and not by any other +party; and

      + +

      iv) states that source code for the Program is available +from such Contributor, and informs licensees how to obtain it in a +reasonable manner on or through a medium customarily used for software +exchange.

      + +

      When the Program is made available in source code form:

      + +

      a) it must be made available under this Agreement; and

      + +

      b) a copy of this Agreement must be included with each +copy of the Program.

      + +

      Contributors may not remove or alter any copyright notices contained +within the Program.

      + +

      Each Contributor must identify itself as the originator of its +Contribution, if any, in a manner that reasonably allows subsequent +Recipients to identify the originator of the Contribution.

      + +

      4. COMMERCIAL DISTRIBUTION

      + +

      Commercial distributors of software may accept certain +responsibilities with respect to end users, business partners and the +like. While this license is intended to facilitate the commercial use of +the Program, the Contributor who includes the Program in a commercial +product offering should do so in a manner which does not create +potential liability for other Contributors. Therefore, if a Contributor +includes the Program in a commercial product offering, such Contributor +("Commercial Contributor") hereby agrees to defend and +indemnify every other Contributor ("Indemnified Contributor") +against any losses, damages and costs (collectively "Losses") +arising from claims, lawsuits and other legal actions brought by a third +party against the Indemnified Contributor to the extent caused by the +acts or omissions of such Commercial Contributor in connection with its +distribution of the Program in a commercial product offering. The +obligations in this section do not apply to any claims or Losses +relating to any actual or alleged intellectual property infringement. In +order to qualify, an Indemnified Contributor must: a) promptly notify +the Commercial Contributor in writing of such claim, and b) allow the +Commercial Contributor to control, and cooperate with the Commercial +Contributor in, the defense and any related settlement negotiations. The +Indemnified Contributor may participate in any such claim at its own +expense.

      + +

      For example, a Contributor might include the Program in a commercial +product offering, Product X. That Contributor is then a Commercial +Contributor. If that Commercial Contributor then makes performance +claims, or offers warranties related to Product X, those performance +claims and warranties are such Commercial Contributor's responsibility +alone. Under this section, the Commercial Contributor would have to +defend claims against the other Contributors related to those +performance claims and warranties, and if a court requires any other +Contributor to pay any damages as a result, the Commercial Contributor +must pay those damages.

      + +

      5. NO WARRANTY

      + +

      EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, THE PROGRAM IS +PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS +OF ANY KIND, EITHER EXPRESS OR IMPLIED INCLUDING, WITHOUT LIMITATION, +ANY WARRANTIES OR CONDITIONS OF TITLE, NON-INFRINGEMENT, MERCHANTABILITY +OR FITNESS FOR A PARTICULAR PURPOSE. Each Recipient is solely +responsible for determining the appropriateness of using and +distributing the Program and assumes all risks associated with its +exercise of rights under this Agreement , including but not limited to +the risks and costs of program errors, compliance with applicable laws, +damage to or loss of data, programs or equipment, and unavailability or +interruption of operations.

      + +

      6. DISCLAIMER OF LIABILITY

      + +

      EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, NEITHER RECIPIENT +NOR ANY CONTRIBUTORS SHALL HAVE ANY LIABILITY FOR ANY DIRECT, INDIRECT, +INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING +WITHOUT LIMITATION LOST PROFITS), 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 OR +DISTRIBUTION OF THE PROGRAM OR THE EXERCISE OF ANY RIGHTS GRANTED +HEREUNDER, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.

      + +

      7. GENERAL

      + +

      If any provision of this Agreement is invalid or unenforceable under +applicable law, it shall not affect the validity or enforceability of +the remainder of the terms of this Agreement, and without further action +by the parties hereto, such provision shall be reformed to the minimum +extent necessary to make such provision valid and enforceable.

      + +

      If Recipient institutes patent litigation against any entity +(including a cross-claim or counterclaim in a lawsuit) alleging that the +Program itself (excluding combinations of the Program with other +software or hardware) infringes such Recipient's patent(s), then such +Recipient's rights granted under Section 2(b) shall terminate as of the +date such litigation is filed.

      + +

      All Recipient's rights under this Agreement shall terminate if it +fails to comply with any of the material terms or conditions of this +Agreement and does not cure such failure in a reasonable period of time +after becoming aware of such noncompliance. If all Recipient's rights +under this Agreement terminate, Recipient agrees to cease use and +distribution of the Program as soon as reasonably practicable. However, +Recipient's obligations under this Agreement and any licenses granted by +Recipient relating to the Program shall continue and survive.

      + +

      Everyone is permitted to copy and distribute copies of this +Agreement, but in order to avoid inconsistency the Agreement is +copyrighted and may only be modified in the following manner. The +Agreement Steward reserves the right to publish new versions (including +revisions) of this Agreement from time to time. No one other than the +Agreement Steward has the right to modify this Agreement. The Eclipse +Foundation is the initial Agreement Steward. The Eclipse Foundation may +assign the responsibility to serve as the Agreement Steward to a +suitable separate entity. Each new version of the Agreement will be +given a distinguishing version number. The Program (including +Contributions) may always be distributed subject to the version of the +Agreement under which it was received. In addition, after a new version +of the Agreement is published, Contributor may elect to distribute the +Program (including its Contributions) under the new version. Except as +expressly stated in Sections 2(a) and 2(b) above, Recipient receives no +rights or licenses to the intellectual property of any Contributor under +this Agreement, whether expressly, by implication, estoppel or +otherwise. All rights in the Program not expressly granted under this +Agreement are reserved.

      + +

      This Agreement is governed by the laws of the State of New York and +the intellectual property laws of the United States of America. No party +to this Agreement will bring a legal action under this Agreement more +than one year after the cause of action arose. Each party waives its +rights to a jury trial in any resulting litigation.

      + + + + diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/zooinspector/src/java/org/apache/zookeeper/inspector/ZooInspector.java b/pkg/registry/zookeeper-3.4.6/src/contrib/zooinspector/src/java/org/apache/zookeeper/inspector/ZooInspector.java new file mode 100644 index 000000000..b637bfd4c --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/contrib/zooinspector/src/java/org/apache/zookeeper/inspector/ZooInspector.java @@ -0,0 +1,66 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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. + */ +package org.apache.zookeeper.inspector; + +import java.awt.event.WindowAdapter; +import java.awt.event.WindowEvent; + +import javax.swing.JFrame; +import javax.swing.JOptionPane; +import javax.swing.UIManager; + +import org.apache.zookeeper.inspector.gui.ZooInspectorPanel; +import org.apache.zookeeper.inspector.logger.LoggerFactory; +import org.apache.zookeeper.inspector.manager.ZooInspectorManagerImpl; + +/** + * + */ +public class ZooInspector { + /** + * @param args + * - not used. The value of these parameters will have no effect + * on the application + */ + public static void main(String[] args) { + try { + UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); + JFrame frame = new JFrame("ZooInspector"); + frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); + final ZooInspectorPanel zooInspectorPanel = new ZooInspectorPanel( + new ZooInspectorManagerImpl()); + frame.addWindowListener(new WindowAdapter() { + @Override + public void windowClosed(WindowEvent e) { + super.windowClosed(e); + zooInspectorPanel.disconnect(true); + } + }); + + frame.setContentPane(zooInspectorPanel); + frame.setSize(1024, 768); + frame.setVisible(true); + } catch (Exception e) { + LoggerFactory.getLogger().error( + "Error occurred loading ZooInspector", e); + JOptionPane.showMessageDialog(null, + "ZooInspector failed to start: " + e.getMessage(), "Error", + JOptionPane.ERROR_MESSAGE); + } + } +} diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/zooinspector/src/java/org/apache/zookeeper/inspector/encryption/BasicDataEncryptionManager.java b/pkg/registry/zookeeper-3.4.6/src/contrib/zooinspector/src/java/org/apache/zookeeper/inspector/encryption/BasicDataEncryptionManager.java new file mode 100644 index 000000000..a9e5ac477 --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/contrib/zooinspector/src/java/org/apache/zookeeper/inspector/encryption/BasicDataEncryptionManager.java @@ -0,0 +1,50 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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. + */ +package org.apache.zookeeper.inspector.encryption; + +/** + * + */ +public class BasicDataEncryptionManager implements DataEncryptionManager { + + /* + * (non-Javadoc) + * + * @see + * org.apache.zookeeper.inspector.encryption.DataEncryptionManager#decryptData + * (byte[]) + */ + public String decryptData(byte[] encrypted) throws Exception { + return new String(encrypted); + } + + /* + * (non-Javadoc) + * + * @see + * org.apache.zookeeper.inspector.encryption.DataEncryptionManager#encryptData + * (java.lang.String) + */ + public byte[] encryptData(String data) throws Exception { + if (data == null) { + return new byte[0]; + } + return data.getBytes(); + } + +} diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/zooinspector/src/java/org/apache/zookeeper/inspector/encryption/DataEncryptionManager.java b/pkg/registry/zookeeper-3.4.6/src/contrib/zooinspector/src/java/org/apache/zookeeper/inspector/encryption/DataEncryptionManager.java new file mode 100644 index 000000000..15a9ee435 --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/contrib/zooinspector/src/java/org/apache/zookeeper/inspector/encryption/DataEncryptionManager.java @@ -0,0 +1,39 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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. + */ +package org.apache.zookeeper.inspector.encryption; + +/** + * A class which describes how data should be encrypted and decrypted + */ +public interface DataEncryptionManager { + /** + * @param data + * - the data to be encrypted + * @return the encrypted data + * @throws Exception + */ + public byte[] encryptData(String data) throws Exception; + + /** + * @param encrypted + * - the data to be decrypted + * @return the decrypted data + * @throws Exception + */ + public String decryptData(byte[] encrypted) throws Exception; +} diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/zooinspector/src/java/org/apache/zookeeper/inspector/gui/NodeViewersChangeListener.java b/pkg/registry/zookeeper-3.4.6/src/contrib/zooinspector/src/java/org/apache/zookeeper/inspector/gui/NodeViewersChangeListener.java new file mode 100644 index 000000000..b0b1e9801 --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/contrib/zooinspector/src/java/org/apache/zookeeper/inspector/gui/NodeViewersChangeListener.java @@ -0,0 +1,37 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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. + */ +package org.apache.zookeeper.inspector.gui; + +import java.util.List; + +import org.apache.zookeeper.inspector.gui.nodeviewer.ZooInspectorNodeViewer; + +/** + * A Listener for changes to the configuration of which node viewers are shown + */ +public interface NodeViewersChangeListener { + /** + * Called when the node viewers configuration is changed (i.e node viewers + * are added, removed or the order of the node viewers is changed) + * + * @param newViewers + * - a {@link List} of {@link ZooInspectorNodeViewer}s which are + * to be shown + */ + public void nodeViewersChanged(List newViewers); +} diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/zooinspector/src/java/org/apache/zookeeper/inspector/gui/ZooInspectorAboutDialog.java b/pkg/registry/zookeeper-3.4.6/src/contrib/zooinspector/src/java/org/apache/zookeeper/inspector/gui/ZooInspectorAboutDialog.java new file mode 100644 index 000000000..fbae8f10f --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/contrib/zooinspector/src/java/org/apache/zookeeper/inspector/gui/ZooInspectorAboutDialog.java @@ -0,0 +1,80 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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. + */ +package org.apache.zookeeper.inspector.gui; + +import java.awt.BorderLayout; +import java.awt.Dimension; +import java.awt.FlowLayout; +import java.awt.Frame; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.io.IOException; + +import javax.swing.JButton; +import javax.swing.JDialog; +import javax.swing.JEditorPane; +import javax.swing.JPanel; + +import org.apache.zookeeper.inspector.logger.LoggerFactory; + +/** + * The About Dialog for the application + */ +public class ZooInspectorAboutDialog extends JDialog { + /** + * @param frame + * - the Frame from which the dialog is displayed + */ + public ZooInspectorAboutDialog(Frame frame) { + super(frame); + this.setLayout(new BorderLayout()); + this.setIconImage(ZooInspectorIconResources.getInformationIcon() + .getImage()); + this.setTitle("About ZooInspector"); + this.setModal(true); + this.setAlwaysOnTop(true); + this.setResizable(false); + JPanel panel = new JPanel(); + panel.setLayout(new BorderLayout()); + JEditorPane aboutPane = new JEditorPane(); + aboutPane.setEditable(false); + aboutPane.setOpaque(false); + java.net.URL aboutURL = ZooInspectorAboutDialog.class + .getResource("about.html"); + try { + aboutPane.setPage(aboutURL); + } catch (IOException e) { + LoggerFactory.getLogger().error( + "Error loading about.html, file may be corrupt", e); + } + panel.add(aboutPane, BorderLayout.CENTER); + panel.setPreferredSize(new Dimension(600, 200)); + JPanel buttonsPanel = new JPanel(); + buttonsPanel.setLayout(new FlowLayout(FlowLayout.CENTER, 10, 10)); + JButton okButton = new JButton("OK"); + okButton.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + ZooInspectorAboutDialog.this.dispose(); + } + }); + buttonsPanel.add(okButton); + this.add(panel, BorderLayout.CENTER); + this.add(buttonsPanel, BorderLayout.SOUTH); + this.pack(); + } +} diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/zooinspector/src/java/org/apache/zookeeper/inspector/gui/ZooInspectorConnectionPropertiesDialog.java b/pkg/registry/zookeeper-3.4.6/src/contrib/zooinspector/src/java/org/apache/zookeeper/inspector/gui/ZooInspectorConnectionPropertiesDialog.java new file mode 100644 index 000000000..c7db5243b --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/contrib/zooinspector/src/java/org/apache/zookeeper/inspector/gui/ZooInspectorConnectionPropertiesDialog.java @@ -0,0 +1,321 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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. + */ +package org.apache.zookeeper.inspector.gui; + +import java.awt.BorderLayout; +import java.awt.GridBagConstraints; +import java.awt.GridBagLayout; +import java.awt.Insets; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.io.File; +import java.io.FileReader; +import java.io.IOException; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Properties; +import java.util.Map.Entry; + +import javax.swing.JButton; +import javax.swing.JComboBox; +import javax.swing.JComponent; +import javax.swing.JDialog; +import javax.swing.JFileChooser; +import javax.swing.JLabel; +import javax.swing.JOptionPane; +import javax.swing.JPanel; +import javax.swing.JTextField; + +import org.apache.zookeeper.inspector.logger.LoggerFactory; +import org.apache.zookeeper.inspector.manager.Pair; + +/** + * The connection properties dialog. This is used to determine the settings for + * connecting to a zookeeper instance + */ +public class ZooInspectorConnectionPropertiesDialog extends JDialog { + + private final HashMap components; + + /** + * @param lastConnectionProps + * - the last connection properties used. if this is the first + * conneciton since starting the applications this will be the + * default settings + * @param connectionPropertiesTemplateAndLabels + * - the connection properties and labels to show in this dialog + * @param zooInspectorPanel + * - the {@link ZooInspectorPanel} linked to this dialog + */ + public ZooInspectorConnectionPropertiesDialog( + Properties lastConnectionProps, + Pair>, Map> connectionPropertiesTemplateAndLabels, + final ZooInspectorPanel zooInspectorPanel) { + final Map> connectionPropertiesTemplate = connectionPropertiesTemplateAndLabels + .getKey(); + final Map connectionPropertiesLabels = connectionPropertiesTemplateAndLabels + .getValue(); + this.setLayout(new BorderLayout()); + this.setTitle("Connection Settings"); + this.setModal(true); + this.setAlwaysOnTop(true); + this.setResizable(false); + final JPanel options = new JPanel(); + final JFileChooser fileChooser = new JFileChooser(); + options.setLayout(new GridBagLayout()); + int i = 0; + components = new HashMap(); + for (Entry> entry : connectionPropertiesTemplate + .entrySet()) { + int rowPos = 2 * i + 1; + JLabel label = new JLabel(connectionPropertiesLabels.get(entry + .getKey())); + GridBagConstraints c1 = new GridBagConstraints(); + c1.gridx = 0; + c1.gridy = rowPos; + c1.gridwidth = 1; + c1.gridheight = 1; + c1.weightx = 0; + c1.weighty = 0; + c1.anchor = GridBagConstraints.WEST; + c1.fill = GridBagConstraints.HORIZONTAL; + c1.insets = new Insets(5, 5, 5, 5); + c1.ipadx = 0; + c1.ipady = 0; + options.add(label, c1); + if (entry.getValue().size() == 0) { + JTextField text = new JTextField(); + GridBagConstraints c2 = new GridBagConstraints(); + c2.gridx = 2; + c2.gridy = rowPos; + c2.gridwidth = 1; + c2.gridheight = 1; + c2.weightx = 0; + c2.weighty = 0; + c2.anchor = GridBagConstraints.WEST; + c2.fill = GridBagConstraints.HORIZONTAL; + c2.insets = new Insets(5, 5, 5, 5); + c2.ipadx = 0; + c2.ipady = 0; + options.add(text, c2); + components.put(entry.getKey(), text); + } else if (entry.getValue().size() == 1) { + JTextField text = new JTextField(entry.getValue().get(0)); + GridBagConstraints c2 = new GridBagConstraints(); + c2.gridx = 2; + c2.gridy = rowPos; + c2.gridwidth = 1; + c2.gridheight = 1; + c2.weightx = 0; + c2.weighty = 0; + c2.anchor = GridBagConstraints.WEST; + c2.fill = GridBagConstraints.HORIZONTAL; + c2.insets = new Insets(5, 5, 5, 5); + c2.ipadx = 0; + c2.ipady = 0; + options.add(text, c2); + components.put(entry.getKey(), text); + } else { + List list = entry.getValue(); + JComboBox combo = new JComboBox(list.toArray(new String[list + .size()])); + combo.setSelectedItem(list.get(0)); + GridBagConstraints c2 = new GridBagConstraints(); + c2.gridx = 2; + c2.gridy = rowPos; + c2.gridwidth = 1; + c2.gridheight = 1; + c2.weightx = 0; + c2.weighty = 0; + c2.anchor = GridBagConstraints.WEST; + c2.fill = GridBagConstraints.HORIZONTAL; + c2.insets = new Insets(5, 5, 5, 5); + c2.ipadx = 0; + c2.ipady = 0; + options.add(combo, c2); + components.put(entry.getKey(), combo); + } + i++; + } + loadConnectionProps(lastConnectionProps); + JPanel buttonsPanel = new JPanel(); + buttonsPanel.setLayout(new GridBagLayout()); + JButton loadPropsFileButton = new JButton("Load from file"); + loadPropsFileButton.addActionListener(new ActionListener() { + + public void actionPerformed(ActionEvent e) { + int result = fileChooser + .showOpenDialog(ZooInspectorConnectionPropertiesDialog.this); + if (result == JFileChooser.APPROVE_OPTION) { + File propsFilePath = fileChooser.getSelectedFile(); + Properties props = new Properties(); + try { + FileReader reader = new FileReader(propsFilePath); + try { + props.load(reader); + loadConnectionProps(props); + } finally { + reader.close(); + } + } catch (IOException ex) { + LoggerFactory + .getLogger() + .error( + "An Error occurred loading connection properties from file", + ex); + JOptionPane + .showMessageDialog( + ZooInspectorConnectionPropertiesDialog.this, + "An Error occurred loading connection properties from file", + "Error", JOptionPane.ERROR_MESSAGE); + } + options.revalidate(); + options.repaint(); + } + + } + }); + GridBagConstraints c3 = new GridBagConstraints(); + c3.gridx = 0; + c3.gridy = 0; + c3.gridwidth = 1; + c3.gridheight = 1; + c3.weightx = 0; + c3.weighty = 1; + c3.anchor = GridBagConstraints.SOUTHWEST; + c3.fill = GridBagConstraints.NONE; + c3.insets = new Insets(5, 5, 5, 5); + c3.ipadx = 0; + c3.ipady = 0; + buttonsPanel.add(loadPropsFileButton, c3); + JButton saveDefaultPropsFileButton = new JButton("Set As Default"); + saveDefaultPropsFileButton.addActionListener(new ActionListener() { + + public void actionPerformed(ActionEvent e) { + + Properties connectionProps = getConnectionProps(); + try { + zooInspectorPanel + .setdefaultConnectionProps(connectionProps); + } catch (IOException ex) { + LoggerFactory + .getLogger() + .error( + "An Error occurred saving the default connection properties file", + ex); + JOptionPane + .showMessageDialog( + ZooInspectorConnectionPropertiesDialog.this, + "An Error occurred saving the default connection properties file", + "Error", JOptionPane.ERROR_MESSAGE); + } + } + }); + GridBagConstraints c6 = new GridBagConstraints(); + c6.gridx = 1; + c6.gridy = 0; + c6.gridwidth = 1; + c6.gridheight = 1; + c6.weightx = 1; + c6.weighty = 1; + c6.anchor = GridBagConstraints.SOUTHWEST; + c6.fill = GridBagConstraints.NONE; + c6.insets = new Insets(5, 5, 5, 5); + c6.ipadx = 0; + c6.ipady = 0; + buttonsPanel.add(saveDefaultPropsFileButton, c6); + JButton okButton = new JButton("OK"); + okButton.addActionListener(new ActionListener() { + + public void actionPerformed(ActionEvent e) { + ZooInspectorConnectionPropertiesDialog.this.dispose(); + Properties connectionProps = getConnectionProps(); + zooInspectorPanel.connect(connectionProps); + } + }); + GridBagConstraints c4 = new GridBagConstraints(); + c4.gridx = 2; + c4.gridy = 0; + c4.gridwidth = 1; + c4.gridheight = 1; + c4.weightx = 0; + c4.weighty = 1; + c4.anchor = GridBagConstraints.SOUTH; + c4.fill = GridBagConstraints.HORIZONTAL; + c4.insets = new Insets(5, 5, 5, 5); + c4.ipadx = 0; + c4.ipady = 0; + buttonsPanel.add(okButton, c4); + JButton cancelButton = new JButton("Cancel"); + cancelButton.addActionListener(new ActionListener() { + + public void actionPerformed(ActionEvent e) { + ZooInspectorConnectionPropertiesDialog.this.dispose(); + } + }); + GridBagConstraints c5 = new GridBagConstraints(); + c5.gridx = 3; + c5.gridy = 0; + c5.gridwidth = 1; + c5.gridheight = 1; + c5.weightx = 0; + c5.weighty = 1; + c5.anchor = GridBagConstraints.SOUTH; + c5.fill = GridBagConstraints.HORIZONTAL; + c5.insets = new Insets(5, 5, 5, 5); + c5.ipadx = 0; + c5.ipady = 0; + buttonsPanel.add(cancelButton, c5); + this.add(options, BorderLayout.CENTER); + this.add(buttonsPanel, BorderLayout.SOUTH); + this.pack(); + } + + private void loadConnectionProps(Properties props) { + if (props != null) { + for (Object key : props.keySet()) { + String propsKey = (String) key; + if (components.containsKey(propsKey)) { + JComponent component = components.get(propsKey); + String value = props.getProperty(propsKey); + if (component instanceof JTextField) { + ((JTextField) component).setText(value); + } else if (component instanceof JComboBox) { + ((JComboBox) component).setSelectedItem(value); + } + } + } + } + } + + private Properties getConnectionProps() { + Properties connectionProps = new Properties(); + for (Entry entry : components.entrySet()) { + String value = null; + JComponent component = entry.getValue(); + if (component instanceof JTextField) { + value = ((JTextField) component).getText(); + } else if (component instanceof JComboBox) { + value = ((JComboBox) component).getSelectedItem().toString(); + } + connectionProps.put(entry.getKey(), value); + } + return connectionProps; + } +} diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/zooinspector/src/java/org/apache/zookeeper/inspector/gui/ZooInspectorIconResources.java b/pkg/registry/zookeeper-3.4.6/src/contrib/zooinspector/src/java/org/apache/zookeeper/inspector/gui/ZooInspectorIconResources.java new file mode 100644 index 000000000..fa45ab31e --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/contrib/zooinspector/src/java/org/apache/zookeeper/inspector/gui/ZooInspectorIconResources.java @@ -0,0 +1,118 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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. + */ +package org.apache.zookeeper.inspector.gui; + +import javax.swing.ImageIcon; + +/** + * A class containing static methods for retrieving {@link ImageIcon}s used in + * the application + */ +public class ZooInspectorIconResources { + + /** + * @return file icon + */ + public static ImageIcon getTreeLeafIcon() { + return new ImageIcon("icons/file_obj.gif"); //$NON-NLS-1$ + } + + /** + * @return folder open icon + */ + public static ImageIcon getTreeOpenIcon() { + return new ImageIcon("icons/fldr_obj.gif"); //$NON-NLS-1$ + } + + /** + * @return folder closed icon + */ + public static ImageIcon getTreeClosedIcon() { + return new ImageIcon("icons/fldr_obj.gif"); //$NON-NLS-1$ + } + + /** + * @return connect icon + */ + public static ImageIcon getConnectIcon() { + return new ImageIcon("icons/launch_run.gif"); //$NON-NLS-1$ + } + + /** + * @return disconnect icon + */ + public static ImageIcon getDisconnectIcon() { + return new ImageIcon("icons/launch_stop.gif"); //$NON-NLS-1$ + } + + /** + * @return save icon + */ + public static ImageIcon getSaveIcon() { + return new ImageIcon("icons/save_edit.gif"); //$NON-NLS-1$ + } + + /** + * @return add icon + */ + public static ImageIcon getAddNodeIcon() { + return new ImageIcon("icons/new_con.gif"); //$NON-NLS-1$ + } + + /** + * @return delete icon + */ + public static ImageIcon getDeleteNodeIcon() { + return new ImageIcon("icons/trash.gif"); //$NON-NLS-1$ + } + + /** + * @return refresh icon + */ + public static ImageIcon getRefreshIcon() { + return new ImageIcon("icons/refresh.gif"); //$NON-NLS-1$ + } + + /** + * @return information icon + */ + public static ImageIcon getInformationIcon() { + return new ImageIcon("icons/info_obj.gif"); //$NON-NLS-1$ + } + + /** + * @return node viewers icon + */ + public static ImageIcon getChangeNodeViewersIcon() { + return new ImageIcon("icons/edtsrclkup_co.gif"); //$NON-NLS-1$ + } + + /** + * @return up icon + */ + public static ImageIcon getUpIcon() { + return new ImageIcon("icons/search_prev.gif"); //$NON-NLS-1$ + } + + /** + * @return down icon + */ + public static ImageIcon getDownIcon() { + return new ImageIcon("icons/search_next.gif"); //$NON-NLS-1$ + } +} diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/zooinspector/src/java/org/apache/zookeeper/inspector/gui/ZooInspectorNodeViewersDialog.java b/pkg/registry/zookeeper-3.4.6/src/contrib/zooinspector/src/java/org/apache/zookeeper/inspector/gui/ZooInspectorNodeViewersDialog.java new file mode 100644 index 000000000..fd0b00ac0 --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/contrib/zooinspector/src/java/org/apache/zookeeper/inspector/gui/ZooInspectorNodeViewersDialog.java @@ -0,0 +1,605 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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. + */ +package org.apache.zookeeper.inspector.gui; + +import java.awt.BorderLayout; +import java.awt.Component; +import java.awt.FlowLayout; +import java.awt.Frame; +import java.awt.GridBagConstraints; +import java.awt.GridBagLayout; +import java.awt.Insets; +import java.awt.datatransfer.Transferable; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.io.File; +import java.io.IOException; +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; + +import javax.swing.DefaultListCellRenderer; +import javax.swing.DefaultListModel; +import javax.swing.DropMode; +import javax.swing.JButton; +import javax.swing.JComponent; +import javax.swing.JDialog; +import javax.swing.JFileChooser; +import javax.swing.JLabel; +import javax.swing.JList; +import javax.swing.JOptionPane; +import javax.swing.JPanel; +import javax.swing.JScrollPane; +import javax.swing.JTextField; +import javax.swing.ListSelectionModel; +import javax.swing.TransferHandler; +import javax.swing.event.ListSelectionEvent; +import javax.swing.event.ListSelectionListener; + +import org.apache.zookeeper.inspector.gui.nodeviewer.ZooInspectorNodeViewer; +import org.apache.zookeeper.inspector.logger.LoggerFactory; +import org.apache.zookeeper.inspector.manager.ZooInspectorManager; + +/** + * A {@link JDialog} for configuring which {@link ZooInspectorNodeViewer}s to + * show in the application + */ +public class ZooInspectorNodeViewersDialog extends JDialog implements + ListSelectionListener { + + private final JButton upButton; + private final JButton downButton; + private final JButton removeButton; + private final JButton addButton; + private final JList viewersList; + private final JButton saveFileButton; + private final JButton loadFileButton; + private final JButton setDefaultsButton; + private final JFileChooser fileChooser = new JFileChooser(new File(".")); + + /** + * @param frame + * - the Frame from which the dialog is displayed + * @param currentViewers + * - the {@link ZooInspectorNodeViewer}s to show + * @param listeners + * - the {@link NodeViewersChangeListener}s which need to be + * notified of changes to the node viewers configuration + * @param manager + * - the {@link ZooInspectorManager} for the application + * + */ + public ZooInspectorNodeViewersDialog(Frame frame, + final List currentViewers, + final Collection listeners, + final ZooInspectorManager manager) { + super(frame); + final List newViewers = new ArrayList( + currentViewers); + this.setLayout(new BorderLayout()); + this.setIconImage(ZooInspectorIconResources.getChangeNodeViewersIcon() + .getImage()); + this.setTitle("About ZooInspector"); + this.setModal(true); + this.setAlwaysOnTop(true); + this.setResizable(true); + final JPanel panel = new JPanel(); + panel.setLayout(new GridBagLayout()); + viewersList = new JList(); + DefaultListModel model = new DefaultListModel(); + for (ZooInspectorNodeViewer viewer : newViewers) { + model.addElement(viewer); + } + viewersList.setModel(model); + viewersList.setCellRenderer(new DefaultListCellRenderer() { + @Override + public Component getListCellRendererComponent(JList list, + Object value, int index, boolean isSelected, + boolean cellHasFocus) { + ZooInspectorNodeViewer viewer = (ZooInspectorNodeViewer) value; + JLabel label = (JLabel) super.getListCellRendererComponent( + list, value, index, isSelected, cellHasFocus); + label.setText(viewer.getTitle()); + return label; + } + }); + viewersList.setDropMode(DropMode.INSERT); + viewersList.enableInputMethods(true); + viewersList.setDragEnabled(true); + viewersList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); + viewersList.getSelectionModel().addListSelectionListener(this); + viewersList.setTransferHandler(new TransferHandler() { + + @Override + public boolean canImport(TransferHandler.TransferSupport info) { + // we only import NodeViewers + if (!info + .isDataFlavorSupported(ZooInspectorNodeViewer.nodeViewerDataFlavor)) { + return false; + } + + JList.DropLocation dl = (JList.DropLocation) info + .getDropLocation(); + if (dl.getIndex() == -1) { + return false; + } + return true; + } + + @Override + public boolean importData(TransferHandler.TransferSupport info) { + JList.DropLocation dl = (JList.DropLocation) info + .getDropLocation(); + DefaultListModel listModel = (DefaultListModel) viewersList + .getModel(); + int index = dl.getIndex(); + boolean insert = dl.isInsert(); + // Get the string that is being dropped. + Transferable t = info.getTransferable(); + String data; + try { + data = (String) t + .getTransferData(ZooInspectorNodeViewer.nodeViewerDataFlavor); + } catch (Exception e) { + return false; + } + try { + ZooInspectorNodeViewer viewer = (ZooInspectorNodeViewer) Class + .forName(data).newInstance(); + if (listModel.contains(viewer)) { + listModel.removeElement(viewer); + } + if (insert) { + listModel.add(index, viewer); + } else { + listModel.set(index, viewer); + } + return true; + } catch (Exception e) { + LoggerFactory.getLogger().error( + "Error instantiating class: " + data, e); + return false; + } + + } + + @Override + public int getSourceActions(JComponent c) { + return MOVE; + } + + @Override + protected Transferable createTransferable(JComponent c) { + JList list = (JList) c; + ZooInspectorNodeViewer value = (ZooInspectorNodeViewer) list + .getSelectedValue(); + return value; + } + }); + JScrollPane scroller = new JScrollPane(viewersList); + GridBagConstraints c1 = new GridBagConstraints(); + c1.gridx = 0; + c1.gridy = 0; + c1.gridwidth = 3; + c1.gridheight = 3; + c1.weightx = 0; + c1.weighty = 1; + c1.anchor = GridBagConstraints.CENTER; + c1.fill = GridBagConstraints.BOTH; + c1.insets = new Insets(5, 5, 5, 5); + c1.ipadx = 0; + c1.ipady = 0; + panel.add(scroller, c1); + upButton = new JButton(ZooInspectorIconResources.getUpIcon()); + downButton = new JButton(ZooInspectorIconResources.getDownIcon()); + removeButton = new JButton(ZooInspectorIconResources + .getDeleteNodeIcon()); + addButton = new JButton(ZooInspectorIconResources.getAddNodeIcon()); + upButton.setEnabled(false); + downButton.setEnabled(false); + removeButton.setEnabled(false); + addButton.setEnabled(true); + upButton.setToolTipText("Move currently selected node viewer up"); + downButton.setToolTipText("Move currently selected node viewer down"); + removeButton.setToolTipText("Remove currently selected node viewer"); + addButton.setToolTipText("Add node viewer"); + final JTextField newViewerTextField = new JTextField(); + GridBagConstraints c2 = new GridBagConstraints(); + c2.gridx = 3; + c2.gridy = 0; + c2.gridwidth = 1; + c2.gridheight = 1; + c2.weightx = 0; + c2.weighty = 0; + c2.anchor = GridBagConstraints.NORTH; + c2.fill = GridBagConstraints.HORIZONTAL; + c2.insets = new Insets(5, 5, 5, 5); + c2.ipadx = 0; + c2.ipady = 0; + panel.add(upButton, c2); + GridBagConstraints c3 = new GridBagConstraints(); + c3.gridx = 3; + c3.gridy = 2; + c3.gridwidth = 1; + c3.gridheight = 1; + c3.weightx = 0; + c3.weighty = 0; + c3.anchor = GridBagConstraints.NORTH; + c3.fill = GridBagConstraints.HORIZONTAL; + c3.insets = new Insets(5, 5, 5, 5); + c3.ipadx = 0; + c3.ipady = 0; + panel.add(downButton, c3); + GridBagConstraints c4 = new GridBagConstraints(); + c4.gridx = 3; + c4.gridy = 1; + c4.gridwidth = 1; + c4.gridheight = 1; + c4.weightx = 0; + c4.weighty = 0; + c4.anchor = GridBagConstraints.NORTH; + c4.fill = GridBagConstraints.HORIZONTAL; + c4.insets = new Insets(5, 5, 5, 5); + c4.ipadx = 0; + c4.ipady = 0; + panel.add(removeButton, c4); + GridBagConstraints c5 = new GridBagConstraints(); + c5.gridx = 0; + c5.gridy = 3; + c5.gridwidth = 3; + c5.gridheight = 1; + c5.weightx = 0; + c5.weighty = 0; + c5.anchor = GridBagConstraints.CENTER; + c5.fill = GridBagConstraints.BOTH; + c5.insets = new Insets(5, 5, 5, 5); + c5.ipadx = 0; + c5.ipady = 0; + panel.add(newViewerTextField, c5); + GridBagConstraints c6 = new GridBagConstraints(); + c6.gridx = 3; + c6.gridy = 3; + c6.gridwidth = 1; + c6.gridheight = 1; + c6.weightx = 0; + c6.weighty = 0; + c6.anchor = GridBagConstraints.CENTER; + c6.fill = GridBagConstraints.BOTH; + c6.insets = new Insets(5, 5, 5, 5); + c6.ipadx = 0; + c6.ipady = 0; + panel.add(addButton, c6); + upButton.addActionListener(new ActionListener() { + + public void actionPerformed(ActionEvent e) { + DefaultListModel listModel = (DefaultListModel) viewersList + .getModel(); + ZooInspectorNodeViewer viewer = (ZooInspectorNodeViewer) viewersList + .getSelectedValue(); + int index = viewersList.getSelectedIndex(); + if (listModel.contains(viewer)) { + listModel.removeElementAt(index); + listModel.insertElementAt(viewer, index - 1); + viewersList.setSelectedValue(viewer, true); + } + } + }); + downButton.addActionListener(new ActionListener() { + + public void actionPerformed(ActionEvent e) { + DefaultListModel listModel = (DefaultListModel) viewersList + .getModel(); + ZooInspectorNodeViewer viewer = (ZooInspectorNodeViewer) viewersList + .getSelectedValue(); + int index = viewersList.getSelectedIndex(); + if (listModel.contains(viewer)) { + listModel.removeElementAt(index); + listModel.insertElementAt(viewer, index + 1); + viewersList.setSelectedValue(viewer, true); + } + } + }); + removeButton.addActionListener(new ActionListener() { + + public void actionPerformed(ActionEvent e) { + DefaultListModel listModel = (DefaultListModel) viewersList + .getModel(); + ZooInspectorNodeViewer viewer = (ZooInspectorNodeViewer) viewersList + .getSelectedValue(); + int index = viewersList.getSelectedIndex(); + if (listModel.contains(viewer)) { + listModel.removeElement(viewer); + viewersList + .setSelectedIndex(index == listModel.size() ? index - 1 + : index); + } + } + }); + addButton.addActionListener(new ActionListener() { + + public void actionPerformed(ActionEvent e) { + String className = newViewerTextField.getText(); + if (className == null || className.length() == 0) { + JOptionPane + .showMessageDialog( + ZooInspectorNodeViewersDialog.this, + "Please enter the full class name for a Node Viewer and click the add button", + "Input Error", JOptionPane.ERROR_MESSAGE); + } else { + try { + DefaultListModel listModel = (DefaultListModel) viewersList + .getModel(); + ZooInspectorNodeViewer viewer = (ZooInspectorNodeViewer) Class + .forName(className).newInstance(); + if (listModel.contains(viewer)) { + JOptionPane + .showMessageDialog( + ZooInspectorNodeViewersDialog.this, + "Node viewer already exists. Each node viewer can only be added once.", + "Input Error", + JOptionPane.ERROR_MESSAGE); + } else { + listModel.addElement(viewer); + } + } catch (Exception ex) { + LoggerFactory + .getLogger() + .error( + "An error occurred while instaniating the node viewer. ", + ex); + JOptionPane.showMessageDialog( + ZooInspectorNodeViewersDialog.this, + "An error occurred while instaniating the node viewer: " + + ex.getMessage(), "Error", + JOptionPane.ERROR_MESSAGE); + } + } + } + }); + saveFileButton = new JButton("Save"); + loadFileButton = new JButton("Load"); + setDefaultsButton = new JButton("Set As Defaults"); + saveFileButton + .setToolTipText("Save current node viewer configuration to file"); + loadFileButton + .setToolTipText("Load node viewer configuration frm file"); + setDefaultsButton + .setToolTipText("Set current configuration asd defaults"); + GridBagConstraints c7 = new GridBagConstraints(); + c7.gridx = 0; + c7.gridy = 4; + c7.gridwidth = 1; + c7.gridheight = 1; + c7.weightx = 1; + c7.weighty = 0; + c7.anchor = GridBagConstraints.WEST; + c7.fill = GridBagConstraints.VERTICAL; + c7.insets = new Insets(5, 5, 5, 5); + c7.ipadx = 0; + c7.ipady = 0; + panel.add(saveFileButton, c7); + GridBagConstraints c8 = new GridBagConstraints(); + c8.gridx = 1; + c8.gridy = 4; + c8.gridwidth = 1; + c8.gridheight = 1; + c8.weightx = 0; + c8.weighty = 0; + c8.anchor = GridBagConstraints.WEST; + c8.fill = GridBagConstraints.VERTICAL; + c8.insets = new Insets(5, 5, 5, 5); + c8.ipadx = 0; + c8.ipady = 0; + panel.add(loadFileButton, c8); + GridBagConstraints c9 = new GridBagConstraints(); + c9.gridx = 2; + c9.gridy = 4; + c9.gridwidth = 1; + c9.gridheight = 1; + c9.weightx = 0; + c9.weighty = 0; + c9.anchor = GridBagConstraints.WEST; + c9.fill = GridBagConstraints.VERTICAL; + c9.insets = new Insets(5, 5, 5, 5); + c9.ipadx = 0; + c9.ipady = 0; + panel.add(setDefaultsButton, c9); + saveFileButton.addActionListener(new ActionListener() { + + public void actionPerformed(ActionEvent e) { + int result = fileChooser + .showSaveDialog(ZooInspectorNodeViewersDialog.this); + if (result == JFileChooser.APPROVE_OPTION) { + File selectedFile = fileChooser.getSelectedFile(); + int answer = JOptionPane.YES_OPTION; + if (selectedFile.exists()) { + answer = JOptionPane + .showConfirmDialog( + ZooInspectorNodeViewersDialog.this, + "The specified file already exists. do you want to overwrite it?", + "Confirm Overwrite", + JOptionPane.YES_NO_OPTION, + JOptionPane.WARNING_MESSAGE); + } + if (answer == JOptionPane.YES_OPTION) { + DefaultListModel listModel = (DefaultListModel) viewersList + .getModel(); + List nodeViewersClassNames = new ArrayList(); + Object[] modelContents = listModel.toArray(); + for (Object o : modelContents) { + nodeViewersClassNames + .add(((ZooInspectorNodeViewer) o) + .getClass().getCanonicalName()); + } + try { + manager.saveNodeViewersFile(selectedFile, + nodeViewersClassNames); + } catch (IOException ex) { + LoggerFactory + .getLogger() + .error( + "Error saving node veiwer configuration from file.", + ex); + JOptionPane.showMessageDialog( + ZooInspectorNodeViewersDialog.this, + "Error saving node veiwer configuration from file: " + + ex.getMessage(), "Error", + JOptionPane.ERROR_MESSAGE); + } + } + } + } + }); + loadFileButton.addActionListener(new ActionListener() { + + public void actionPerformed(ActionEvent e) { + int result = fileChooser + .showOpenDialog(ZooInspectorNodeViewersDialog.this); + if (result == JFileChooser.APPROVE_OPTION) { + try { + List nodeViewersClassNames = manager + .loadNodeViewersFile(fileChooser + .getSelectedFile()); + List nodeViewers = new ArrayList(); + for (String nodeViewersClassName : nodeViewersClassNames) { + ZooInspectorNodeViewer viewer = (ZooInspectorNodeViewer) Class + .forName(nodeViewersClassName) + .newInstance(); + nodeViewers.add(viewer); + } + DefaultListModel model = new DefaultListModel(); + for (ZooInspectorNodeViewer viewer : nodeViewers) { + model.addElement(viewer); + } + viewersList.setModel(model); + panel.revalidate(); + panel.repaint(); + } catch (Exception ex) { + LoggerFactory + .getLogger() + .error( + "Error loading node veiwer configuration from file.", + ex); + JOptionPane.showMessageDialog( + ZooInspectorNodeViewersDialog.this, + "Error loading node veiwer configuration from file: " + + ex.getMessage(), "Error", + JOptionPane.ERROR_MESSAGE); + } + } + } + }); + setDefaultsButton.addActionListener(new ActionListener() { + + public void actionPerformed(ActionEvent e) { + int answer = JOptionPane + .showConfirmDialog( + ZooInspectorNodeViewersDialog.this, + "Are you sure you want to save this configuration as the default?", + "Confirm Set Defaults", + JOptionPane.YES_NO_OPTION, + JOptionPane.WARNING_MESSAGE); + if (answer == JOptionPane.YES_OPTION) { + DefaultListModel listModel = (DefaultListModel) viewersList + .getModel(); + List nodeViewersClassNames = new ArrayList(); + Object[] modelContents = listModel.toArray(); + for (Object o : modelContents) { + nodeViewersClassNames.add(((ZooInspectorNodeViewer) o) + .getClass().getCanonicalName()); + } + try { + manager + .setDefaultNodeViewerConfiguration(nodeViewersClassNames); + } catch (IOException ex) { + LoggerFactory + .getLogger() + .error( + "Error setting default node veiwer configuration.", + ex); + JOptionPane.showMessageDialog( + ZooInspectorNodeViewersDialog.this, + "Error setting default node veiwer configuration: " + + ex.getMessage(), "Error", + JOptionPane.ERROR_MESSAGE); + } + } + } + }); + + JPanel buttonsPanel = new JPanel(); + buttonsPanel.setLayout(new FlowLayout(FlowLayout.CENTER, 10, 10)); + JButton okButton = new JButton("OK"); + okButton.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + ZooInspectorNodeViewersDialog.this.dispose(); + DefaultListModel listModel = (DefaultListModel) viewersList + .getModel(); + newViewers.clear(); + Object[] modelContents = listModel.toArray(); + for (Object o : modelContents) { + newViewers.add((ZooInspectorNodeViewer) o); + } + currentViewers.clear(); + currentViewers.addAll(newViewers); + for (NodeViewersChangeListener listener : listeners) { + listener.nodeViewersChanged(currentViewers); + } + } + }); + buttonsPanel.add(okButton); + JButton cancelButton = new JButton("Cancel"); + cancelButton.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + ZooInspectorNodeViewersDialog.this.dispose(); + } + }); + buttonsPanel.add(cancelButton); + this.add(panel, BorderLayout.CENTER); + this.add(buttonsPanel, BorderLayout.SOUTH); + this.pack(); + } + + /* + * (non-Javadoc) + * + * @see + * javax.swing.event.ListSelectionListener#valueChanged(javax.swing.event + * .ListSelectionEvent) + */ + public void valueChanged(ListSelectionEvent e) { + int index = viewersList.getSelectedIndex(); + if (index == -1) { + removeButton.setEnabled(false); + upButton.setEnabled(false); + downButton.setEnabled(false); + } else { + removeButton.setEnabled(true); + if (index == 0) { + upButton.setEnabled(false); + } else { + upButton.setEnabled(true); + } + if (index == ((DefaultListModel) viewersList.getModel()).getSize()) { + downButton.setEnabled(false); + } else { + downButton.setEnabled(true); + } + } + } +} diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/zooinspector/src/java/org/apache/zookeeper/inspector/gui/ZooInspectorNodeViewersPanel.java b/pkg/registry/zookeeper-3.4.6/src/contrib/zooinspector/src/java/org/apache/zookeeper/inspector/gui/ZooInspectorNodeViewersPanel.java new file mode 100644 index 000000000..05c256b5a --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/contrib/zooinspector/src/java/org/apache/zookeeper/inspector/gui/ZooInspectorNodeViewersPanel.java @@ -0,0 +1,140 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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. + */ +package org.apache.zookeeper.inspector.gui; + +import java.awt.BorderLayout; +import java.util.ArrayList; +import java.util.List; + +import javax.swing.JPanel; +import javax.swing.JTabbedPane; +import javax.swing.event.ChangeEvent; +import javax.swing.event.ChangeListener; +import javax.swing.event.TreeSelectionEvent; +import javax.swing.event.TreeSelectionListener; +import javax.swing.tree.TreePath; + +import org.apache.zookeeper.inspector.gui.nodeviewer.ZooInspectorNodeViewer; +import org.apache.zookeeper.inspector.manager.ZooInspectorManager; +import org.apache.zookeeper.inspector.manager.ZooInspectorNodeManager; + +/** + * This is the {@link JPanel} which contains the {@link ZooInspectorNodeViewer}s + */ +public class ZooInspectorNodeViewersPanel extends JPanel implements + TreeSelectionListener, ChangeListener { + + private final List nodeVeiwers = new ArrayList(); + private final List needsReload = new ArrayList(); + private final JTabbedPane tabbedPane; + private final List selectedNodes = new ArrayList(); + private final ZooInspectorNodeManager zooInspectorManager; + + /** + * @param zooInspectorManager + * - the {@link ZooInspectorManager} for the application + * @param nodeVeiwers + * - the {@link ZooInspectorNodeViewer}s to show + */ + public ZooInspectorNodeViewersPanel( + ZooInspectorNodeManager zooInspectorManager, + List nodeVeiwers) { + this.zooInspectorManager = zooInspectorManager; + this.setLayout(new BorderLayout()); + tabbedPane = new JTabbedPane(JTabbedPane.TOP, + JTabbedPane.WRAP_TAB_LAYOUT); + setNodeViewers(nodeVeiwers); + tabbedPane.addChangeListener(this); + this.add(tabbedPane, BorderLayout.CENTER); + reloadSelectedViewer(); + } + + /** + * @param nodeViewers + * - the {@link ZooInspectorNodeViewer}s to show + */ + public void setNodeViewers(List nodeViewers) { + this.nodeVeiwers.clear(); + this.nodeVeiwers.addAll(nodeViewers); + needsReload.clear(); + tabbedPane.removeAll(); + for (ZooInspectorNodeViewer nodeViewer : nodeVeiwers) { + nodeViewer.setZooInspectorManager(zooInspectorManager); + needsReload.add(true); + tabbedPane.add(nodeViewer.getTitle(), nodeViewer); + } + this.revalidate(); + this.repaint(); + } + + private void reloadSelectedViewer() { + int index = this.tabbedPane.getSelectedIndex(); + if (index != -1 && this.needsReload.get(index)) { + ZooInspectorNodeViewer viewer = this.nodeVeiwers.get(index); + viewer.nodeSelectionChanged(selectedNodes); + this.needsReload.set(index, false); + } + } + + /* + * (non-Javadoc) + * + * @see + * javax.swing.event.TreeSelectionListener#valueChanged(javax.swing.event + * .TreeSelectionEvent) + */ + public void valueChanged(TreeSelectionEvent e) { + TreePath[] paths = e.getPaths(); + selectedNodes.clear(); + for (TreePath path : paths) { + boolean appended = false; + StringBuilder sb = new StringBuilder(); + Object[] pathArray = path.getPath(); + for (Object o : pathArray) { + if (o != null) { + String nodeName = o.toString(); + if (nodeName != null) { + if (nodeName.length() > 0) { + appended = true; + sb.append("/"); //$NON-NLS-1$ + sb.append(o.toString()); + } + } + } + } + if (appended) { + selectedNodes.add(sb.toString()); + } + } + for (int i = 0; i < needsReload.size(); i++) { + this.needsReload.set(i, true); + } + reloadSelectedViewer(); + } + + /* + * (non-Javadoc) + * + * @see + * javax.swing.event.ChangeListener#stateChanged(javax.swing.event.ChangeEvent + * ) + */ + public void stateChanged(ChangeEvent e) { + reloadSelectedViewer(); + } +} diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/zooinspector/src/java/org/apache/zookeeper/inspector/gui/ZooInspectorPanel.java b/pkg/registry/zookeeper-3.4.6/src/contrib/zooinspector/src/java/org/apache/zookeeper/inspector/gui/ZooInspectorPanel.java new file mode 100644 index 000000000..7a4efafa4 --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/contrib/zooinspector/src/java/org/apache/zookeeper/inspector/gui/ZooInspectorPanel.java @@ -0,0 +1,361 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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. + */ +package org.apache.zookeeper.inspector.gui; + +import java.awt.BorderLayout; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; +import java.util.Properties; +import java.util.concurrent.ExecutionException; + +import javax.swing.JButton; +import javax.swing.JOptionPane; +import javax.swing.JPanel; +import javax.swing.JScrollPane; +import javax.swing.JSplitPane; +import javax.swing.JToolBar; +import javax.swing.SwingWorker; + +import org.apache.zookeeper.inspector.gui.nodeviewer.ZooInspectorNodeViewer; +import org.apache.zookeeper.inspector.logger.LoggerFactory; +import org.apache.zookeeper.inspector.manager.ZooInspectorManager; + +/** + * The parent {@link JPanel} for the whole application + */ +public class ZooInspectorPanel extends JPanel implements + NodeViewersChangeListener { + private final JButton refreshButton; + private final JButton disconnectButton; + private final JButton connectButton; + private final ZooInspectorNodeViewersPanel nodeViewersPanel; + private final ZooInspectorTreeViewer treeViewer; + private final ZooInspectorManager zooInspectorManager; + private final JButton addNodeButton; + private final JButton deleteNodeButton; + private final JButton nodeViewersButton; + private final JButton aboutButton; + private final List listeners = new ArrayList(); + { + listeners.add(this); + } + + /** + * @param zooInspectorManager + * - the {@link ZooInspectorManager} for the application + */ + public ZooInspectorPanel(final ZooInspectorManager zooInspectorManager) { + this.zooInspectorManager = zooInspectorManager; + final ArrayList nodeViewers = new ArrayList(); + try { + List defaultNodeViewersClassNames = this.zooInspectorManager + .getDefaultNodeViewerConfiguration(); + for (String className : defaultNodeViewersClassNames) { + nodeViewers.add((ZooInspectorNodeViewer) Class.forName( + className).newInstance()); + } + } catch (Exception ex) { + LoggerFactory.getLogger().error( + "Error loading default node viewers.", ex); + JOptionPane.showMessageDialog(ZooInspectorPanel.this, + "Error loading default node viewers: " + ex.getMessage(), + "Error", JOptionPane.ERROR_MESSAGE); + } + nodeViewersPanel = new ZooInspectorNodeViewersPanel( + zooInspectorManager, nodeViewers); + treeViewer = new ZooInspectorTreeViewer(zooInspectorManager, + nodeViewersPanel); + this.setLayout(new BorderLayout()); + JToolBar toolbar = new JToolBar(); + toolbar.setFloatable(false); + connectButton = new JButton(ZooInspectorIconResources.getConnectIcon()); + disconnectButton = new JButton(ZooInspectorIconResources + .getDisconnectIcon()); + refreshButton = new JButton(ZooInspectorIconResources.getRefreshIcon()); + addNodeButton = new JButton(ZooInspectorIconResources.getAddNodeIcon()); + deleteNodeButton = new JButton(ZooInspectorIconResources + .getDeleteNodeIcon()); + nodeViewersButton = new JButton(ZooInspectorIconResources + .getChangeNodeViewersIcon()); + aboutButton = new JButton(ZooInspectorIconResources + .getInformationIcon()); + toolbar.add(connectButton); + toolbar.add(disconnectButton); + toolbar.add(refreshButton); + toolbar.add(addNodeButton); + toolbar.add(deleteNodeButton); + toolbar.add(nodeViewersButton); + toolbar.add(aboutButton); + aboutButton.setEnabled(true); + connectButton.setEnabled(true); + disconnectButton.setEnabled(false); + refreshButton.setEnabled(false); + addNodeButton.setEnabled(false); + deleteNodeButton.setEnabled(false); + nodeViewersButton.setEnabled(true); + nodeViewersButton.setToolTipText("Change Node Viewers"); + aboutButton.setToolTipText("About ZooInspector"); + connectButton.setToolTipText("Connect"); + disconnectButton.setToolTipText("Disconnect"); + refreshButton.setToolTipText("Refresh"); + addNodeButton.setToolTipText("Add Node"); + deleteNodeButton.setToolTipText("Delete Node"); + connectButton.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + ZooInspectorConnectionPropertiesDialog zicpd = new ZooInspectorConnectionPropertiesDialog( + zooInspectorManager.getLastConnectionProps(), + zooInspectorManager.getConnectionPropertiesTemplate(), + ZooInspectorPanel.this); + zicpd.setVisible(true); + } + }); + disconnectButton.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + disconnect(); + } + }); + refreshButton.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + treeViewer.refreshView(); + } + }); + addNodeButton.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + final List selectedNodes = treeViewer + .getSelectedNodes(); + if (selectedNodes.size() == 1) { + final String nodeName = JOptionPane.showInputDialog( + ZooInspectorPanel.this, + "Please Enter a name for the new node", + "Create Node", JOptionPane.INFORMATION_MESSAGE); + if (nodeName != null && nodeName.length() > 0) { + SwingWorker worker = new SwingWorker() { + + @Override + protected Boolean doInBackground() throws Exception { + return ZooInspectorPanel.this.zooInspectorManager + .createNode(selectedNodes.get(0), + nodeName); + } + + @Override + protected void done() { + treeViewer.refreshView(); + } + }; + worker.execute(); + } + } else { + JOptionPane.showMessageDialog(ZooInspectorPanel.this, + "Please select 1 parent node for the new node."); + } + } + }); + deleteNodeButton.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + final List selectedNodes = treeViewer + .getSelectedNodes(); + if (selectedNodes.size() == 0) { + JOptionPane.showMessageDialog(ZooInspectorPanel.this, + "Please select at least 1 node to be deleted"); + } else { + int answer = JOptionPane.showConfirmDialog( + ZooInspectorPanel.this, + "Are you sure you want to delete the selected nodes?" + + "(This action cannot be reverted)", + "Confirm Delete", JOptionPane.YES_NO_OPTION, + JOptionPane.WARNING_MESSAGE); + if (answer == JOptionPane.YES_OPTION) { + SwingWorker worker = new SwingWorker() { + + @Override + protected Boolean doInBackground() throws Exception { + for (String nodePath : selectedNodes) { + ZooInspectorPanel.this.zooInspectorManager + .deleteNode(nodePath); + } + return true; + } + + @Override + protected void done() { + treeViewer.refreshView(); + } + }; + worker.execute(); + } + } + } + }); + nodeViewersButton.addActionListener(new ActionListener() { + + public void actionPerformed(ActionEvent e) { + ZooInspectorNodeViewersDialog nvd = new ZooInspectorNodeViewersDialog( + JOptionPane.getRootFrame(), nodeViewers, listeners, + zooInspectorManager); + nvd.setVisible(true); + } + }); + aboutButton.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + ZooInspectorAboutDialog zicpd = new ZooInspectorAboutDialog( + JOptionPane.getRootFrame()); + zicpd.setVisible(true); + } + }); + JScrollPane treeScroller = new JScrollPane(treeViewer); + JSplitPane splitPane = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, + treeScroller, nodeViewersPanel); + splitPane.setResizeWeight(0.25); + this.add(splitPane, BorderLayout.CENTER); + this.add(toolbar, BorderLayout.NORTH); + } + + /** + * @param connectionProps + * the {@link Properties} for connecting to the zookeeper + * instance + */ + public void connect(final Properties connectionProps) { + SwingWorker worker = new SwingWorker() { + + @Override + protected Boolean doInBackground() throws Exception { + zooInspectorManager.setLastConnectionProps(connectionProps); + return zooInspectorManager.connect(connectionProps); + } + + @Override + protected void done() { + try { + if (get()) { + treeViewer.refreshView(); + connectButton.setEnabled(false); + disconnectButton.setEnabled(true); + refreshButton.setEnabled(true); + addNodeButton.setEnabled(true); + deleteNodeButton.setEnabled(true); + } else { + JOptionPane.showMessageDialog(ZooInspectorPanel.this, + "Unable to connect to zookeeper", "Error", + JOptionPane.ERROR_MESSAGE); + } + } catch (InterruptedException e) { + LoggerFactory + .getLogger() + .error( + "Error occurred while connecting to ZooKeeper server", + e); + } catch (ExecutionException e) { + LoggerFactory + .getLogger() + .error( + "Error occurred while connecting to ZooKeeper server", + e); + } + } + + }; + worker.execute(); + } + + /** + * + */ + public void disconnect() { + disconnect(false); + } + + /** + * @param wait + * - set this to true if the method should only return once the + * application has successfully disconnected + */ + public void disconnect(boolean wait) { + SwingWorker worker = new SwingWorker() { + + @Override + protected Boolean doInBackground() throws Exception { + return ZooInspectorPanel.this.zooInspectorManager.disconnect(); + } + + @Override + protected void done() { + try { + if (get()) { + treeViewer.clearView(); + connectButton.setEnabled(true); + disconnectButton.setEnabled(false); + refreshButton.setEnabled(false); + addNodeButton.setEnabled(false); + deleteNodeButton.setEnabled(false); + } + } catch (InterruptedException e) { + LoggerFactory + .getLogger() + .error( + "Error occurred while disconnecting from ZooKeeper server", + e); + } catch (ExecutionException e) { + LoggerFactory + .getLogger() + .error( + "Error occurred while disconnecting from ZooKeeper server", + e); + } + } + + }; + worker.execute(); + if (wait) { + while (!worker.isDone()) { + try { + Thread.sleep(100); + } catch (InterruptedException e) { + LoggerFactory + .getLogger() + .error( + "Error occurred while disconnecting from ZooKeeper server", + e); + } + } + } + } + + /* + * (non-Javadoc) + * + * @seeorg.apache.zookeeper.inspector.gui.NodeViewersChangeListener# + * nodeViewersChanged(java.util.List) + */ + public void nodeViewersChanged(List newViewers) { + this.nodeViewersPanel.setNodeViewers(newViewers); + } + + /** + * @param connectionProps + * @throws IOException + */ + public void setdefaultConnectionProps(Properties connectionProps) + throws IOException { + this.zooInspectorManager.saveDefaultConnectionFile(connectionProps); + } +} diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/zooinspector/src/java/org/apache/zookeeper/inspector/gui/ZooInspectorTreeViewer.java b/pkg/registry/zookeeper-3.4.6/src/contrib/zooinspector/src/java/org/apache/zookeeper/inspector/gui/ZooInspectorTreeViewer.java new file mode 100644 index 000000000..128b358eb --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/contrib/zooinspector/src/java/org/apache/zookeeper/inspector/gui/ZooInspectorTreeViewer.java @@ -0,0 +1,362 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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. + */ +package org.apache.zookeeper.inspector.gui; + +import java.awt.BorderLayout; +import java.awt.Color; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.awt.event.MouseAdapter; +import java.awt.event.MouseEvent; +import java.util.ArrayList; +import java.util.Collections; +import java.util.Enumeration; +import java.util.LinkedHashSet; +import java.util.List; +import java.util.Map; +import java.util.Set; + +import javax.swing.JMenuItem; +import javax.swing.JPanel; +import javax.swing.JPopupMenu; +import javax.swing.JTree; +import javax.swing.SwingWorker; +import javax.swing.event.TreeSelectionListener; +import javax.swing.tree.DefaultMutableTreeNode; +import javax.swing.tree.DefaultTreeCellRenderer; +import javax.swing.tree.DefaultTreeModel; +import javax.swing.tree.TreeNode; +import javax.swing.tree.TreePath; + +import org.apache.zookeeper.inspector.manager.NodeListener; +import org.apache.zookeeper.inspector.manager.ZooInspectorManager; + +import com.nitido.utils.toaster.Toaster; + +/** + * A {@link JPanel} for showing the tree view of all the nodes in the zookeeper + * instance + */ +public class ZooInspectorTreeViewer extends JPanel implements NodeListener { + private final ZooInspectorManager zooInspectorManager; + private final JTree tree; + private final Toaster toasterManager; + + /** + * @param zooInspectorManager + * - the {@link ZooInspectorManager} for the application + * @param listener + * - the {@link TreeSelectionListener} to listen for changes in + * the selected node on the node tree + */ + public ZooInspectorTreeViewer( + final ZooInspectorManager zooInspectorManager, + TreeSelectionListener listener) { + this.zooInspectorManager = zooInspectorManager; + this.setLayout(new BorderLayout()); + final JPopupMenu popupMenu = new JPopupMenu(); + final JMenuItem addNotify = new JMenuItem("Add Change Notification"); + this.toasterManager = new Toaster(); + this.toasterManager.setBorderColor(Color.BLACK); + this.toasterManager.setMessageColor(Color.BLACK); + this.toasterManager.setToasterColor(Color.WHITE); + addNotify.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + List selectedNodes = getSelectedNodes(); + zooInspectorManager.addWatchers(selectedNodes, + ZooInspectorTreeViewer.this); + } + }); + final JMenuItem removeNotify = new JMenuItem( + "Remove Change Notification"); + removeNotify.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + List selectedNodes = getSelectedNodes(); + zooInspectorManager.removeWatchers(selectedNodes); + } + }); + tree = new JTree(new DefaultMutableTreeNode()); + tree.setCellRenderer(new ZooInspectorTreeCellRenderer()); + tree.setEditable(false); + tree.getSelectionModel().addTreeSelectionListener(listener); + tree.addMouseListener(new MouseAdapter() { + @Override + public void mouseClicked(MouseEvent e) { + if (e.isPopupTrigger() || e.getButton() == MouseEvent.BUTTON3) { + // TODO only show add if a selected node isn't being + // watched, and only show remove if a selected node is being + // watched + popupMenu.removeAll(); + popupMenu.add(addNotify); + popupMenu.add(removeNotify); + popupMenu.show(ZooInspectorTreeViewer.this, e.getX(), e + .getY()); + } + } + }); + this.add(tree, BorderLayout.CENTER); + } + + /** + * Refresh the tree view + */ + public void refreshView() { + final Set expandedNodes = new LinkedHashSet(); + int rowCount = tree.getRowCount(); + for (int i = 0; i < rowCount; i++) { + TreePath path = tree.getPathForRow(i); + if (tree.isExpanded(path)) { + expandedNodes.add(path); + } + } + final TreePath[] selectedNodes = tree.getSelectionPaths(); + SwingWorker worker = new SwingWorker() { + + @Override + protected Boolean doInBackground() throws Exception { + tree.setModel(new DefaultTreeModel(new ZooInspectorTreeNode( + "/", null))); + return true; + } + + @Override + protected void done() { + for (TreePath path : expandedNodes) { + tree.expandPath(path); + } + tree.getSelectionModel().setSelectionPaths(selectedNodes); + } + }; + worker.execute(); + } + + /** + * clear the tree view of all nodes + */ + public void clearView() { + tree.setModel(new DefaultTreeModel(new DefaultMutableTreeNode())); + } + + /** + * @author Colin + * + */ + private static class ZooInspectorTreeCellRenderer extends + DefaultTreeCellRenderer { + public ZooInspectorTreeCellRenderer() { + setLeafIcon(ZooInspectorIconResources.getTreeLeafIcon()); + setOpenIcon(ZooInspectorIconResources.getTreeOpenIcon()); + setClosedIcon(ZooInspectorIconResources.getTreeClosedIcon()); + } + } + + /** + * @author Colin + * + */ + private class ZooInspectorTreeNode implements TreeNode { + private final String nodePath; + private final String nodeName; + private final ZooInspectorTreeNode parent; + + public ZooInspectorTreeNode(String nodePath, ZooInspectorTreeNode parent) { + this.parent = parent; + this.nodePath = nodePath; + int index = nodePath.lastIndexOf("/"); + if (index == -1) { + throw new IllegalArgumentException("Invalid node path" + + nodePath); + } + this.nodeName = nodePath.substring(index + 1); + } + + /* + * (non-Javadoc) + * + * @see javax.swing.tree.TreeNode#children() + */ + public Enumeration children() { + List children = zooInspectorManager + .getChildren(this.nodePath); + Collections.sort(children); + List returnChildren = new ArrayList(); + for (String child : children) { + returnChildren.add(new ZooInspectorTreeNode((this.nodePath + .equals("/") ? "" : this.nodePath) + + "/" + child, this)); + } + return Collections.enumeration(returnChildren); + } + + /* + * (non-Javadoc) + * + * @see javax.swing.tree.TreeNode#getAllowsChildren() + */ + public boolean getAllowsChildren() { + return zooInspectorManager.isAllowsChildren(this.nodePath); + } + + /* + * (non-Javadoc) + * + * @see javax.swing.tree.TreeNode#getChildAt(int) + */ + public TreeNode getChildAt(int childIndex) { + String child = zooInspectorManager.getNodeChild(this.nodePath, + childIndex); + if (child != null) { + return new ZooInspectorTreeNode((this.nodePath.equals("/") ? "" + : this.nodePath) + + "/" + child, this); + } + return null; + } + + /* + * (non-Javadoc) + * + * @see javax.swing.tree.TreeNode#getChildCount() + */ + public int getChildCount() { + return zooInspectorManager.getNumChildren(this.nodePath); + } + + /* + * (non-Javadoc) + * + * @see javax.swing.tree.TreeNode#getIndex(javax.swing.tree.TreeNode) + */ + public int getIndex(TreeNode node) { + return zooInspectorManager.getNodeIndex(this.nodePath); + } + + /* + * (non-Javadoc) + * + * @see javax.swing.tree.TreeNode#getParent() + */ + public TreeNode getParent() { + return this.parent; + } + + /* + * (non-Javadoc) + * + * @see javax.swing.tree.TreeNode#isLeaf() + */ + public boolean isLeaf() { + return !zooInspectorManager.hasChildren(this.nodePath); + } + + @Override + public String toString() { + return this.nodeName; + } + + @Override + public int hashCode() { + final int prime = 31; + int result = 1; + result = prime * result + getOuterType().hashCode(); + result = prime * result + + ((nodePath == null) ? 0 : nodePath.hashCode()); + result = prime * result + + ((parent == null) ? 0 : parent.hashCode()); + return result; + } + + @Override + public boolean equals(Object obj) { + if (this == obj) + return true; + if (obj == null) + return false; + if (getClass() != obj.getClass()) + return false; + ZooInspectorTreeNode other = (ZooInspectorTreeNode) obj; + if (!getOuterType().equals(other.getOuterType())) + return false; + if (nodePath == null) { + if (other.nodePath != null) + return false; + } else if (!nodePath.equals(other.nodePath)) + return false; + if (parent == null) { + if (other.parent != null) + return false; + } else if (!parent.equals(other.parent)) + return false; + return true; + } + + private ZooInspectorTreeViewer getOuterType() { + return ZooInspectorTreeViewer.this; + } + + } + + /** + * @return {@link List} of the currently selected nodes + */ + public List getSelectedNodes() { + TreePath[] paths = tree.getSelectionPaths(); + List selectedNodes = new ArrayList(); + if (paths != null) { + for (TreePath path : paths) { + StringBuilder sb = new StringBuilder(); + Object[] pathArray = path.getPath(); + for (Object o : pathArray) { + String nodeName = o.toString(); + if (nodeName.length() > 0) { + sb.append("/"); + sb.append(o.toString()); + } + } + selectedNodes.add(sb.toString()); + } + } + return selectedNodes; + } + + /* + * (non-Javadoc) + * + * @see + * org.apache.zookeeper.inspector.manager.NodeListener#processEvent(java + * .lang.String, java.lang.String, java.util.Map) + */ + public void processEvent(String nodePath, String eventType, + Map eventInfo) { + StringBuilder sb = new StringBuilder(); + sb.append("Node: "); + sb.append(nodePath); + sb.append("\nEvent: "); + sb.append(eventType); + if (eventInfo != null) { + for (Map.Entry entry : eventInfo.entrySet()) { + sb.append("\n"); + sb.append(entry.getKey()); + sb.append(": "); + sb.append(entry.getValue()); + } + } + this.toasterManager.showToaster(ZooInspectorIconResources + .getInformationIcon(), sb.toString()); + } +} diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/zooinspector/src/java/org/apache/zookeeper/inspector/gui/about.html b/pkg/registry/zookeeper-3.4.6/src/contrib/zooinspector/src/java/org/apache/zookeeper/inspector/gui/about.html new file mode 100644 index 000000000..17fb3dca2 --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/contrib/zooinspector/src/java/org/apache/zookeeper/inspector/gui/about.html @@ -0,0 +1,21 @@ + + + + +ZooInspector v0.1 + + +

      ZooInspector was developed by Colin Goodheart-Smithe and is +available under the Apache Software Licence v2.0.

      +
      +

      ZooKeeper is available from http://zookeeper.apache.org/ +and is licensed under an Apache Software Licence v2.0

      +

      The ApacheSoftware Licence v2.0 can be found at http://www.apache.org/licenses/LICENSE-2.0

      + + diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/zooinspector/src/java/org/apache/zookeeper/inspector/gui/nodeviewer/NodeViewerACL.java b/pkg/registry/zookeeper-3.4.6/src/contrib/zooinspector/src/java/org/apache/zookeeper/inspector/gui/nodeviewer/NodeViewerACL.java new file mode 100644 index 000000000..5ac203c28 --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/contrib/zooinspector/src/java/org/apache/zookeeper/inspector/gui/nodeviewer/NodeViewerACL.java @@ -0,0 +1,187 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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. + */ +package org.apache.zookeeper.inspector.gui.nodeviewer; + +import java.awt.BorderLayout; +import java.awt.Color; +import java.awt.GridBagConstraints; +import java.awt.GridBagLayout; +import java.awt.Insets; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.concurrent.ExecutionException; + +import javax.swing.BorderFactory; +import javax.swing.JLabel; +import javax.swing.JPanel; +import javax.swing.JScrollPane; +import javax.swing.JTextField; +import javax.swing.SwingWorker; + +import org.apache.zookeeper.inspector.logger.LoggerFactory; +import org.apache.zookeeper.inspector.manager.ZooInspectorNodeManager; + +/** + * A node viewer for displaying the ACLs currently applied to the selected node + */ +public class NodeViewerACL extends ZooInspectorNodeViewer { + private ZooInspectorNodeManager zooInspectorManager; + private final JPanel aclDataPanel; + private String selectedNode; + + /** + * + */ + public NodeViewerACL() { + this.setLayout(new BorderLayout()); + this.aclDataPanel = new JPanel(); + this.aclDataPanel.setBackground(Color.WHITE); + JScrollPane scroller = new JScrollPane(this.aclDataPanel); + this.add(scroller, BorderLayout.CENTER); + } + + /* + * (non-Javadoc) + * + * @see + * org.apache.zookeeper.inspector.gui.nodeviewer.ZooInspectorNodeViewer# + * getTitle() + */ + @Override + public String getTitle() { + return "Node ACLs"; + } + + /* + * (non-Javadoc) + * + * @see + * org.apache.zookeeper.inspector.gui.nodeviewer.ZooInspectorNodeViewer# + * nodeSelectionChanged(java.util.Set) + */ + @Override + public void nodeSelectionChanged(List selectedNodes) { + this.aclDataPanel.removeAll(); + if (selectedNodes.size() > 0) { + this.selectedNode = selectedNodes.get(0); + SwingWorker>, Void> worker = new SwingWorker>, Void>() { + + @Override + protected List> doInBackground() + throws Exception { + return NodeViewerACL.this.zooInspectorManager + .getACLs(NodeViewerACL.this.selectedNode); + } + + @Override + protected void done() { + List> acls = null; + try { + acls = get(); + } catch (InterruptedException e) { + acls = new ArrayList>(); + LoggerFactory.getLogger().error( + "Error retrieving ACL Information for node: " + + NodeViewerACL.this.selectedNode, e); + } catch (ExecutionException e) { + acls = new ArrayList>(); + LoggerFactory.getLogger().error( + "Error retrieving ACL Information for node: " + + NodeViewerACL.this.selectedNode, e); + } + aclDataPanel.setLayout(new GridBagLayout()); + int j = 0; + for (Map data : acls) { + int rowPos = 2 * j + 1; + JPanel aclPanel = new JPanel(); + aclPanel.setBorder(BorderFactory + .createLineBorder(Color.BLACK)); + aclPanel.setBackground(Color.WHITE); + aclPanel.setLayout(new GridBagLayout()); + int i = 0; + for (Map.Entry entry : data.entrySet()) { + int rowPosACL = 2 * i + 1; + JLabel label = new JLabel(entry.getKey()); + JTextField text = new JTextField(entry.getValue()); + text.setEditable(false); + GridBagConstraints c1 = new GridBagConstraints(); + c1.gridx = 1; + c1.gridy = rowPosACL; + c1.gridwidth = 1; + c1.gridheight = 1; + c1.weightx = 0; + c1.weighty = 0; + c1.anchor = GridBagConstraints.NORTHWEST; + c1.fill = GridBagConstraints.BOTH; + c1.insets = new Insets(5, 5, 5, 5); + c1.ipadx = 0; + c1.ipady = 0; + aclPanel.add(label, c1); + GridBagConstraints c2 = new GridBagConstraints(); + c2.gridx = 3; + c2.gridy = rowPosACL; + c2.gridwidth = 1; + c2.gridheight = 1; + c2.weightx = 0; + c2.weighty = 0; + c2.anchor = GridBagConstraints.NORTHWEST; + c2.fill = GridBagConstraints.BOTH; + c2.insets = new Insets(5, 5, 5, 5); + c2.ipadx = 0; + c2.ipady = 0; + aclPanel.add(text, c2); + i++; + } + GridBagConstraints c = new GridBagConstraints(); + c.gridx = 1; + c.gridy = rowPos; + c.gridwidth = 1; + c.gridheight = 1; + c.weightx = 1; + c.weighty = 1; + c.anchor = GridBagConstraints.NORTHWEST; + c.fill = GridBagConstraints.NONE; + c.insets = new Insets(5, 5, 5, 5); + c.ipadx = 0; + c.ipady = 0; + aclDataPanel.add(aclPanel, c); + } + NodeViewerACL.this.aclDataPanel.revalidate(); + NodeViewerACL.this.aclDataPanel.repaint(); + } + }; + worker.execute(); + } + } + + /* + * (non-Javadoc) + * + * @see + * org.apache.zookeeper.inspector.gui.nodeviewer.ZooInspectorNodeViewer# + * setZooInspectorManager + * (org.apache.zookeeper.inspector.manager.ZooInspectorNodeManager) + */ + @Override + public void setZooInspectorManager( + ZooInspectorNodeManager zooInspectorManager) { + this.zooInspectorManager = zooInspectorManager; + } + +} diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/zooinspector/src/java/org/apache/zookeeper/inspector/gui/nodeviewer/NodeViewerData.java b/pkg/registry/zookeeper-3.4.6/src/contrib/zooinspector/src/java/org/apache/zookeeper/inspector/gui/nodeviewer/NodeViewerData.java new file mode 100644 index 000000000..001cb7b21 --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/contrib/zooinspector/src/java/org/apache/zookeeper/inspector/gui/nodeviewer/NodeViewerData.java @@ -0,0 +1,146 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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. + */ +package org.apache.zookeeper.inspector.gui.nodeviewer; + +import java.awt.BorderLayout; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.util.List; +import java.util.concurrent.ExecutionException; + +import javax.swing.JButton; +import javax.swing.JOptionPane; +import javax.swing.JScrollPane; +import javax.swing.JTextPane; +import javax.swing.JToolBar; +import javax.swing.SwingWorker; + +import org.apache.zookeeper.inspector.gui.ZooInspectorIconResources; +import org.apache.zookeeper.inspector.logger.LoggerFactory; +import org.apache.zookeeper.inspector.manager.ZooInspectorNodeManager; + +/** + * A node viewer for displaying the data for the currently selected node + */ +public class NodeViewerData extends ZooInspectorNodeViewer { + private ZooInspectorNodeManager zooInspectorManager; + private final JTextPane dataArea; + private final JToolBar toolbar; + private String selectedNode; + + /** + * + */ + public NodeViewerData() { + this.setLayout(new BorderLayout()); + this.dataArea = new JTextPane(); + this.toolbar = new JToolBar(); + this.toolbar.setFloatable(false); + JScrollPane scroller = new JScrollPane(this.dataArea); + scroller + .setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_NEVER); + this.add(scroller, BorderLayout.CENTER); + this.add(this.toolbar, BorderLayout.NORTH); + JButton saveButton = new JButton(ZooInspectorIconResources + .getSaveIcon()); + saveButton.addActionListener(new ActionListener() { + + public void actionPerformed(ActionEvent e) { + if (selectedNode != null) { + if (JOptionPane.showConfirmDialog(NodeViewerData.this, + "Are you sure you want to save this node?" + + " (this action cannot be reverted)", + "Confirm Save", JOptionPane.YES_NO_OPTION, + JOptionPane.WARNING_MESSAGE) == JOptionPane.YES_OPTION) { + zooInspectorManager.setData(selectedNode, dataArea + .getText()); + } + } + } + }); + this.toolbar.add(saveButton); + + } + + /* + * (non-Javadoc) + * + * @see + * org.apache.zookeeper.inspector.gui.nodeviewer.ZooInspectorNodeViewer# + * getTitle() + */ + @Override + public String getTitle() { + return "Node Data"; + } + + /* + * (non-Javadoc) + * + * @see + * org.apache.zookeeper.inspector.gui.nodeviewer.ZooInspectorNodeViewer# + * nodeSelectionChanged(java.util.Set) + */ + @Override + public void nodeSelectionChanged(List selectedNodes) { + if (selectedNodes.size() > 0) { + this.selectedNode = selectedNodes.get(0); + SwingWorker worker = new SwingWorker() { + + @Override + protected String doInBackground() throws Exception { + return NodeViewerData.this.zooInspectorManager + .getData(NodeViewerData.this.selectedNode); + } + + @Override + protected void done() { + String data = ""; + try { + data = get(); + } catch (InterruptedException e) { + LoggerFactory.getLogger().error( + "Error retrieving data for node: " + + NodeViewerData.this.selectedNode, e); + } catch (ExecutionException e) { + LoggerFactory.getLogger().error( + "Error retrieving data for node: " + + NodeViewerData.this.selectedNode, e); + } + NodeViewerData.this.dataArea.setText(data); + } + }; + worker.execute(); + } + } + + /* + * (non-Javadoc) + * + * @see + * org.apache.zookeeper.inspector.gui.nodeviewer.ZooInspectorNodeViewer# + * setZooInspectorManager + * (org.apache.zookeeper.inspector.manager.ZooInspectorNodeManager) + */ + @Override + public void setZooInspectorManager( + ZooInspectorNodeManager zooInspectorManager) { + this.zooInspectorManager = zooInspectorManager; + } + +} diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/zooinspector/src/java/org/apache/zookeeper/inspector/gui/nodeviewer/NodeViewerMetaData.java b/pkg/registry/zookeeper-3.4.6/src/contrib/zooinspector/src/java/org/apache/zookeeper/inspector/gui/nodeviewer/NodeViewerMetaData.java new file mode 100644 index 000000000..5c2df8d88 --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/contrib/zooinspector/src/java/org/apache/zookeeper/inspector/gui/nodeviewer/NodeViewerMetaData.java @@ -0,0 +1,186 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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. + */ +package org.apache.zookeeper.inspector.gui.nodeviewer; + +import java.awt.BorderLayout; +import java.awt.Color; +import java.awt.GridBagConstraints; +import java.awt.GridBagLayout; +import java.awt.Insets; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.concurrent.ExecutionException; + +import javax.swing.JLabel; +import javax.swing.JPanel; +import javax.swing.JScrollPane; +import javax.swing.JTextField; +import javax.swing.SwingWorker; + +import org.apache.zookeeper.data.Stat; +import org.apache.zookeeper.inspector.logger.LoggerFactory; +import org.apache.zookeeper.inspector.manager.ZooInspectorNodeManager; + +/** + * A node viewer for displaying the meta data for the currently selected node. + * The meta data is essentially the information from the {@link Stat} for the + * node + */ +public class NodeViewerMetaData extends ZooInspectorNodeViewer { + private ZooInspectorNodeManager zooInspectorManager; + private final JPanel metaDataPanel; + private String selectedNode; + + /** + * + */ + public NodeViewerMetaData() { + this.setLayout(new BorderLayout()); + this.metaDataPanel = new JPanel(); + this.metaDataPanel.setBackground(Color.WHITE); + JScrollPane scroller = new JScrollPane(this.metaDataPanel); + this.add(scroller, BorderLayout.CENTER); + } + + /* + * (non-Javadoc) + * + * @see + * org.apache.zookeeper.inspector.gui.nodeviewer.ZooInspectorNodeViewer# + * getTitle() + */ + @Override + public String getTitle() { + return "Node Metadata"; + } + + /* + * (non-Javadoc) + * + * @see + * org.apache.zookeeper.inspector.gui.nodeviewer.ZooInspectorNodeViewer# + * nodeSelectionChanged(java.util.Set) + */ + @Override + public void nodeSelectionChanged(List selectedNodes) { + this.metaDataPanel.removeAll(); + if (selectedNodes.size() > 0) { + this.selectedNode = selectedNodes.get(0); + SwingWorker, Void> worker = new SwingWorker, Void>() { + + @Override + protected Map doInBackground() throws Exception { + return NodeViewerMetaData.this.zooInspectorManager + .getNodeMeta(NodeViewerMetaData.this.selectedNode); + } + + @Override + protected void done() { + Map data = null; + try { + data = get(); + } catch (InterruptedException e) { + data = new HashMap(); + LoggerFactory.getLogger().error( + "Error retrieving meta data for node: " + + NodeViewerMetaData.this.selectedNode, + e); + } catch (ExecutionException e) { + data = new HashMap(); + LoggerFactory.getLogger().error( + "Error retrieving meta data for node: " + + NodeViewerMetaData.this.selectedNode, + e); + } + NodeViewerMetaData.this.metaDataPanel + .setLayout(new GridBagLayout()); + JPanel infoPanel = new JPanel(); + infoPanel.setBackground(Color.WHITE); + infoPanel.setLayout(new GridBagLayout()); + int i = 0; + int rowPos = 0; + for (Map.Entry entry : data.entrySet()) { + rowPos = 2 * i + 1; + JLabel label = new JLabel(entry.getKey()); + JTextField text = new JTextField(entry.getValue()); + text.setEditable(false); + GridBagConstraints c1 = new GridBagConstraints(); + c1.gridx = 0; + c1.gridy = rowPos; + c1.gridwidth = 1; + c1.gridheight = 1; + c1.weightx = 0; + c1.weighty = 0; + c1.anchor = GridBagConstraints.WEST; + c1.fill = GridBagConstraints.HORIZONTAL; + c1.insets = new Insets(5, 5, 5, 5); + c1.ipadx = 0; + c1.ipady = 0; + infoPanel.add(label, c1); + GridBagConstraints c2 = new GridBagConstraints(); + c2.gridx = 2; + c2.gridy = rowPos; + c2.gridwidth = 1; + c2.gridheight = 1; + c2.weightx = 0; + c2.weighty = 0; + c2.anchor = GridBagConstraints.WEST; + c2.fill = GridBagConstraints.HORIZONTAL; + c2.insets = new Insets(5, 5, 5, 5); + c2.ipadx = 0; + c2.ipady = 0; + infoPanel.add(text, c2); + i++; + } + GridBagConstraints c = new GridBagConstraints(); + c.gridx = 1; + c.gridy = rowPos; + c.gridwidth = 1; + c.gridheight = 1; + c.weightx = 1; + c.weighty = 1; + c.anchor = GridBagConstraints.NORTHWEST; + c.fill = GridBagConstraints.NONE; + c.insets = new Insets(5, 5, 5, 5); + c.ipadx = 0; + c.ipady = 0; + NodeViewerMetaData.this.metaDataPanel.add(infoPanel, c); + NodeViewerMetaData.this.metaDataPanel.revalidate(); + NodeViewerMetaData.this.metaDataPanel.repaint(); + } + }; + worker.execute(); + } + } + + /* + * (non-Javadoc) + * + * @see + * org.apache.zookeeper.inspector.gui.nodeviewer.ZooInspectorNodeViewer# + * setZooInspectorManager + * (org.apache.zookeeper.inspector.manager.ZooInspectorNodeManager) + */ + @Override + public void setZooInspectorManager( + ZooInspectorNodeManager zooInspectorManager) { + this.zooInspectorManager = zooInspectorManager; + } + +} diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/zooinspector/src/java/org/apache/zookeeper/inspector/gui/nodeviewer/ZooInspectorNodeViewer.java b/pkg/registry/zookeeper-3.4.6/src/contrib/zooinspector/src/java/org/apache/zookeeper/inspector/gui/nodeviewer/ZooInspectorNodeViewer.java new file mode 100644 index 000000000..32119a85c --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/contrib/zooinspector/src/java/org/apache/zookeeper/inspector/gui/nodeviewer/ZooInspectorNodeViewer.java @@ -0,0 +1,138 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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. + */ +package org.apache.zookeeper.inspector.gui.nodeviewer; + +import java.awt.datatransfer.DataFlavor; +import java.awt.datatransfer.Transferable; +import java.awt.datatransfer.UnsupportedFlavorException; +import java.io.IOException; +import java.util.List; + +import javax.swing.JPanel; + +import org.apache.zookeeper.inspector.manager.ZooInspectorNodeManager; + +/** + * A {@link JPanel} for displaying information about the currently selected + * node(s) + */ +public abstract class ZooInspectorNodeViewer extends JPanel implements + Transferable { + /** + * The {@link DataFlavor} used for DnD in the node viewer configuration + * dialog + */ + public static final DataFlavor nodeViewerDataFlavor = new DataFlavor( + ZooInspectorNodeViewer.class, "nodeviewer"); + + /** + * @param zooInspectorManager + */ + public abstract void setZooInspectorManager( + ZooInspectorNodeManager zooInspectorManager); + + /** + * Called whenever the selected nodes in the tree view changes. + * + * @param selectedNodes + * - the nodes currently selected in the tree view + * + */ + public abstract void nodeSelectionChanged(List selectedNodes); + + /** + * @return the title of the node viewer. this will be shown on the tab for + * this node viewer. + */ + public abstract String getTitle(); + + /* + * (non-Javadoc) + * + * @see + * java.awt.datatransfer.Transferable#getTransferData(java.awt.datatransfer + * .DataFlavor) + */ + public Object getTransferData(DataFlavor flavor) + throws UnsupportedFlavorException, IOException { + if (flavor.equals(nodeViewerDataFlavor)) { + return this.getClass().getCanonicalName(); + } else { + return null; + } + } + + /* + * (non-Javadoc) + * + * @see java.awt.datatransfer.Transferable#getTransferDataFlavors() + */ + public DataFlavor[] getTransferDataFlavors() { + return new DataFlavor[] { nodeViewerDataFlavor }; + } + + /* + * (non-Javadoc) + * + * @seejava.awt.datatransfer.Transferable#isDataFlavorSupported(java.awt. + * datatransfer.DataFlavor) + */ + public boolean isDataFlavorSupported(DataFlavor flavor) { + return flavor.equals(nodeViewerDataFlavor); + } + + /* + * (non-Javadoc) + * + * @see java.lang.Object#hashCode() + */ + @Override + public int hashCode() { + final int prime = 31; + int result = 1; + result = prime * result + + ((getTitle() == null) ? 0 : getTitle().hashCode()); + return result; + } + + /* + * (non-Javadoc) + * + * @see java.lang.Object#equals(java.lang.Object) + */ + @Override + public boolean equals(Object obj) { + if (this == obj) + return true; + if (obj == null) + return false; + if (getClass() != obj.getClass()) + return false; + ZooInspectorNodeViewer other = (ZooInspectorNodeViewer) obj; + if (getClass().getCanonicalName() != other.getClass() + .getCanonicalName()) { + return false; + } + if (getTitle() == null) { + if (other.getTitle() != null) + return false; + } else if (!getTitle().equals(other.getTitle())) + return false; + return true; + } +} diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/zooinspector/src/java/org/apache/zookeeper/inspector/logger/LoggerFactory.java b/pkg/registry/zookeeper-3.4.6/src/contrib/zooinspector/src/java/org/apache/zookeeper/inspector/logger/LoggerFactory.java new file mode 100644 index 000000000..e4fae4169 --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/contrib/zooinspector/src/java/org/apache/zookeeper/inspector/logger/LoggerFactory.java @@ -0,0 +1,36 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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. + */ +package org.apache.zookeeper.inspector.logger; + +/** + * Provides a {@link Logger} for use across the entire application + * + */ +public class LoggerFactory +{ + private static final org.slf4j.Logger logger = org.slf4j.LoggerFactory.getLogger("org.apache.zookeeper.inspector"); //$NON-NLS-1$ + + /** + * @return {@link Logger} for ZooInspector + */ + public static org.slf4j.Logger getLogger() + { + return logger; + } + +} diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/zooinspector/src/java/org/apache/zookeeper/inspector/manager/NodeListener.java b/pkg/registry/zookeeper-3.4.6/src/contrib/zooinspector/src/java/org/apache/zookeeper/inspector/manager/NodeListener.java new file mode 100644 index 000000000..fe55a45b8 --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/contrib/zooinspector/src/java/org/apache/zookeeper/inspector/manager/NodeListener.java @@ -0,0 +1,37 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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. + */ +package org.apache.zookeeper.inspector.manager; + +import java.util.Map; + +/** + * A Listener for Events on zookeeper nodes + */ +public interface NodeListener { + /** + * @param nodePath + * - the path of the node + * @param eventType + * - the event type + * @param eventInfo + * - a {@link Map} containing any other information about this + * event + */ + public void processEvent(String nodePath, String eventType, + Map eventInfo); +} diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/zooinspector/src/java/org/apache/zookeeper/inspector/manager/Pair.java b/pkg/registry/zookeeper-3.4.6/src/contrib/zooinspector/src/java/org/apache/zookeeper/inspector/manager/Pair.java new file mode 100644 index 000000000..b72950c95 --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/contrib/zooinspector/src/java/org/apache/zookeeper/inspector/manager/Pair.java @@ -0,0 +1,120 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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. + */ +package org.apache.zookeeper.inspector.manager; + +/** + * A utility class for storing a pair of objects + * + * @param + * @param + */ +public class Pair { + private K key; + private V value; + + /** + * @param key + * @param value + */ + public Pair(K key, V value) { + this.key = key; + this.value = value; + } + + /** + * + */ + public Pair() { + // Do Nothing + } + + /** + * @return key + */ + public K getKey() { + return key; + } + + /** + * @param key + */ + public void setKey(K key) { + this.key = key; + } + + /** + * @return value + */ + public V getValue() { + return value; + } + + /** + * @param value + */ + public void setValue(V value) { + this.value = value; + } + + @Override + public String toString() { + return "Pair [" + key + ", " + value + "]"; + } + + /* + * (non-Javadoc) + * + * @see java.lang.Object#hashCode() + */ + @Override + public int hashCode() { + final int prime = 31; + int result = 1; + result = prime * result + ((key == null) ? 0 : key.hashCode()); + result = prime * result + ((value == null) ? 0 : value.hashCode()); + return result; + } + + /* + * (non-Javadoc) + * + * @see java.lang.Object#equals(java.lang.Object) + */ + @Override + public boolean equals(Object obj) { + if (this == obj) + return true; + if (obj == null) + return false; + if (getClass() != obj.getClass()) + return false; + Pair other = (Pair) obj; + if (key == null) { + if (other.key != null) + return false; + } else if (!key.equals(other.key)) + return false; + if (value == null) { + if (other.value != null) + return false; + } else if (!value.equals(other.value)) + return false; + return true; + } + +} diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/zooinspector/src/java/org/apache/zookeeper/inspector/manager/ZooInspectorManager.java b/pkg/registry/zookeeper-3.4.6/src/contrib/zooinspector/src/java/org/apache/zookeeper/inspector/manager/ZooInspectorManager.java new file mode 100644 index 000000000..74c3cb20e --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/contrib/zooinspector/src/java/org/apache/zookeeper/inspector/manager/ZooInspectorManager.java @@ -0,0 +1,139 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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. + */ +package org.apache.zookeeper.inspector.manager; + +import java.io.File; +import java.io.IOException; +import java.util.Collection; +import java.util.List; +import java.util.Map; +import java.util.Properties; + +import javax.swing.JComboBox; +import javax.swing.JTextField; + +/** + * A Manager for all interactions between the application and the Zookeeper + * instance + */ +public interface ZooInspectorManager extends ZooInspectorNodeManager, + ZooInspectorNodeTreeManager { + + /** + * @param connectionProps + * @return true if successfully connected + */ + public boolean connect(Properties connectionProps); + + /** + * @return true if successfully disconnected + */ + public boolean disconnect(); + + /** + * @return a {@link Pair} containing the following: + * ]]> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Important: All versions, of all nodes, under the given node are deleted. +

      + If there is an error with deleting one of the sub-nodes in the tree, + this operation would abort and would be the responsibility of the app to handle the same. + + See {@link #delete(String, int)} for more details. + + @throws IllegalArgumentException if an invalid path is specified]]> + + + + + + + + + + + + Important: All versions, of all nodes, under the given node are deleted. +

      + If there is an error with deleting one of the sub-nodes in the tree, + this operation would abort and would be the responsibility of the app to handle the same. +

      + @param zk the zookeeper handle + @param pathRoot the path to be deleted + @param cb call back method + @param ctx the context the callback method is called with + @throws IllegalArgumentException if an invalid path is specified]]> + + + + + + + + + + Important: This is not an atomic snapshot of the tree ever, but the + state as it exists across multiple RPCs from zkClient to the ensemble. + For practical purposes, it is suggested to bring the clients to the ensemble + down (i.e. prevent writes to pathRoot) to 'simulate' a snapshot behavior. + + @param zk the zookeeper handle + @param pathRoot The znode path, for which the entire subtree needs to be listed. + @throws InterruptedException + @throws KeeperException]]> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Session establishment is asynchronous. This constructor will initiate + connection to the server and return immediately - potentially (usually) + before the session is fully established. The watcher argument specifies + the watcher that will be notified of any changes in state. This + notification can come at any point before or after the constructor call + has returned. +

      + The instantiated ZooKeeper client object will pick an arbitrary server + from the connectString and attempt to connect to it. If establishment of + the connection fails, another server in the connect string will be tried + (the order is non-deterministic, as we random shuffle the list), until a + connection is established. The client will continue attempts until the + session is explicitly closed. +

      + Added in 3.2.0: An optional "chroot" suffix may also be appended to the + connection string. This will run the client commands while interpreting + all paths relative to this root (similar to the unix chroot command). + + @param connectString + comma separated host:port pairs, each corresponding to a zk + server. e.g. "127.0.0.1:3000,127.0.0.1:3001,127.0.0.1:3002" If + the optional chroot suffix is used the example would look + like: "127.0.0.1:3000,127.0.0.1:3001,127.0.0.1:3002/app/a" + where the client would be rooted at "/app/a" and all paths + would be relative to this root - ie getting/setting/etc... + "/foo/bar" would result in operations being run on + "/app/a/foo/bar" (from the server perspective). + @param sessionTimeout + session timeout in milliseconds + @param watcher + a watcher object which will be notified of state changes, may + also be notified for node events + + @throws IOException + in cases of network failure + @throws IllegalArgumentException + if an invalid chroot path is specified]]> + + + + + + + Session establishment is asynchronous. This constructor will initiate + connection to the server and return immediately - potentially (usually) + before the session is fully established. The watcher argument specifies + the watcher that will be notified of any changes in state. This + notification can come at any point before or after the constructor call + has returned. +

      + The instantiated ZooKeeper client object will pick an arbitrary server + from the connectString and attempt to connect to it. If establishment of + the connection fails, another server in the connect string will be tried + (the order is non-deterministic, as we random shuffle the list), until a + connection is established. The client will continue attempts until the + session is explicitly closed. +

      + Added in 3.2.0: An optional "chroot" suffix may also be appended to the + connection string. This will run the client commands while interpreting + all paths relative to this root (similar to the unix chroot command). + + @param connectString + comma separated host:port pairs, each corresponding to a zk + server. e.g. "127.0.0.1:3000,127.0.0.1:3001,127.0.0.1:3002" If + the optional chroot suffix is used the example would look + like: "127.0.0.1:3000,127.0.0.1:3001,127.0.0.1:3002/app/a" + where the client would be rooted at "/app/a" and all paths + would be relative to this root - ie getting/setting/etc... + "/foo/bar" would result in operations being run on + "/app/a/foo/bar" (from the server perspective). + @param sessionTimeout + session timeout in milliseconds + @param watcher + a watcher object which will be notified of state changes, may + also be notified for node events + @param canBeReadOnly + (added in 3.4) whether the created client is allowed to go to + read-only mode in case of partitioning. Read-only mode + basically means that if the client can't find any majority + servers but there's partitioned server it could reach, it + connects to one in read-only mode, i.e. read requests are + allowed while write requests are not. It continues seeking for + majority in the background. + + @throws IOException + in cases of network failure + @throws IllegalArgumentException + if an invalid chroot path is specified]]> + + + + + + + Session establishment is asynchronous. This constructor will initiate + connection to the server and return immediately - potentially (usually) + before the session is fully established. The watcher argument specifies + the watcher that will be notified of any changes in state. This + notification can come at any point before or after the constructor call + has returned. +

      + The instantiated ZooKeeper client object will pick an arbitrary server + from the connectString and attempt to connect to it. If establishment of + the connection fails, another server in the connect string will be tried + (the order is non-deterministic, as we random shuffle the list), until a + connection is established. The client will continue attempts until the + session is explicitly closed (or the session is expired by the server). +

      + Added in 3.2.0: An optional "chroot" suffix may also be appended to the + connection string. This will run the client commands while interpreting + all paths relative to this root (similar to the unix chroot command). +

      + Use {@link #getSessionId} and {@link #getSessionPasswd} on an established + client connection, these values must be passed as sessionId and + sessionPasswd respectively if reconnecting. Otherwise, if not + reconnecting, use the other constructor which does not require these + parameters. + + @param connectString + comma separated host:port pairs, each corresponding to a zk + server. e.g. "127.0.0.1:3000,127.0.0.1:3001,127.0.0.1:3002" + If the optional chroot suffix is used the example would look + like: "127.0.0.1:3000,127.0.0.1:3001,127.0.0.1:3002/app/a" + where the client would be rooted at "/app/a" and all paths + would be relative to this root - ie getting/setting/etc... + "/foo/bar" would result in operations being run on + "/app/a/foo/bar" (from the server perspective). + @param sessionTimeout + session timeout in milliseconds + @param watcher + a watcher object which will be notified of state changes, may + also be notified for node events + @param sessionId + specific session id to use if reconnecting + @param sessionPasswd + password for this session + + @throws IOException in cases of network failure + @throws IllegalArgumentException if an invalid chroot path is specified + @throws IllegalArgumentException for an invalid list of ZooKeeper hosts]]> + + + + + + + Session establishment is asynchronous. This constructor will initiate + connection to the server and return immediately - potentially (usually) + before the session is fully established. The watcher argument specifies + the watcher that will be notified of any changes in state. This + notification can come at any point before or after the constructor call + has returned. +

      + The instantiated ZooKeeper client object will pick an arbitrary server + from the connectString and attempt to connect to it. If establishment of + the connection fails, another server in the connect string will be tried + (the order is non-deterministic, as we random shuffle the list), until a + connection is established. The client will continue attempts until the + session is explicitly closed (or the session is expired by the server). +

      + Added in 3.2.0: An optional "chroot" suffix may also be appended to the + connection string. This will run the client commands while interpreting + all paths relative to this root (similar to the unix chroot command). +

      + Use {@link #getSessionId} and {@link #getSessionPasswd} on an established + client connection, these values must be passed as sessionId and + sessionPasswd respectively if reconnecting. Otherwise, if not + reconnecting, use the other constructor which does not require these + parameters. + + @param connectString + comma separated host:port pairs, each corresponding to a zk + server. e.g. "127.0.0.1:3000,127.0.0.1:3001,127.0.0.1:3002" + If the optional chroot suffix is used the example would look + like: "127.0.0.1:3000,127.0.0.1:3001,127.0.0.1:3002/app/a" + where the client would be rooted at "/app/a" and all paths + would be relative to this root - ie getting/setting/etc... + "/foo/bar" would result in operations being run on + "/app/a/foo/bar" (from the server perspective). + @param sessionTimeout + session timeout in milliseconds + @param watcher + a watcher object which will be notified of state changes, may + also be notified for node events + @param sessionId + specific session id to use if reconnecting + @param sessionPasswd + password for this session + @param canBeReadOnly + (added in 3.4) whether the created client is allowed to go to + read-only mode in case of partitioning. Read-only mode + basically means that if the client can't find any majority + servers but there's partitioned server it could reach, it + connects to one in read-only mode, i.e. read requests are + allowed while write requests are not. It continues seeking for + majority in the background. + + @throws IOException in cases of network failure + @throws IllegalArgumentException if an invalid chroot path is specified]]> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + The flags argument specifies whether the created node will be ephemeral + or not. +

      + An ephemeral node will be removed by the ZooKeeper automatically when the + session associated with the creation of the node expires. +

      + The flags argument can also specify to create a sequential node. The + actual path name of a sequential node will be the given path plus a + suffix "i" where i is the current sequential number of the node. The sequence + number is always fixed length of 10 digits, 0 padded. Once + such a node is created, the sequential number will be incremented by one. +

      + If a node with the same actual path already exists in the ZooKeeper, a + KeeperException with error code KeeperException.NodeExists will be + thrown. Note that since a different actual path is used for each + invocation of creating sequential node with the same path argument, the + call will never throw "file exists" KeeperException. +

      + If the parent node does not exist in the ZooKeeper, a KeeperException + with error code KeeperException.NoNode will be thrown. +

      + An ephemeral node cannot have children. If the parent node of the given + path is ephemeral, a KeeperException with error code + KeeperException.NoChildrenForEphemerals will be thrown. +

      + This operation, if successful, will trigger all the watches left on the + node of the given path by exists and getData API calls, and the watches + left on the parent node by getChildren API calls. +

      + If a node is created successfully, the ZooKeeper server will trigger the + watches on the path left by exists calls, and the watches on the parent + of the node by getChildren calls. +

      + The maximum allowable size of the data array is 1 MB (1,048,576 bytes). + Arrays larger than this will cause a KeeperExecption to be thrown. + + @param path + the path for the node + @param data + the initial data for the node + @param acl + the acl for the node + @param createMode + specifying whether the node to be created is ephemeral + and/or sequential + @return the actual path of the created node + @throws KeeperException if the server returns a non-zero error code + @throws KeeperException.InvalidACLException if the ACL is invalid, null, or empty + @throws InterruptedException if the transaction is interrupted + @throws IllegalArgumentException if an invalid path is specified]]> + + + + + + + + + + + + + + + + + + + + + A KeeperException with error code KeeperException.NoNode will be thrown + if the nodes does not exist. +

      + A KeeperException with error code KeeperException.BadVersion will be + thrown if the given version does not match the node's version. +

      + A KeeperException with error code KeeperException.NotEmpty will be thrown + if the node has children. +

      + This operation, if successful, will trigger all the watches on the node + of the given path left by exists API calls, and the watches on the parent + node left by getChildren API calls. + + @param path + the path of the node to be deleted. + @param version + the expected node version. + @throws InterruptedException IF the server transaction is interrupted + @throws KeeperException If the server signals an error with a non-zero + return code. + @throws IllegalArgumentException if an invalid path is specified]]> + + + + + + + + + On success, a list of results is returned. + On failure, an exception is raised which contains partial results and + error details, see {@link KeeperException#getResults} +

      + Note: The maximum allowable size of all of the data arrays in all of + the setData operations in this single request is typically 1 MB + (1,048,576 bytes). This limit is specified on the server via + jute.maxbuffer. + Requests larger than this will cause a KeeperException to be + thrown. + + @param ops An iterable that contains the operations to be done. + These should be created using the factory methods on {@link Op}. + @return A list of results, one for each input Op, the order of + which exactly matches the order of the ops input + operations. + @throws InterruptedException If the operation was interrupted. + The operation may or may not have succeeded, but will not have + partially succeeded if this exception is thrown. + @throws KeeperException If the operation could not be completed + due to some error in doing one of the specified ops. + @throws IllegalArgumentException if an invalid path is specified + + @since 3.4.0]]> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + If the watch is non-null and the call is successful (no exception is thrown), + a watch will be left on the node with the given path. The watch will be + triggered by a successful operation that creates/delete the node or sets + the data on the node. + + @param path the node path + @param watcher explicit watcher + @return the stat of the node of the given path; return null if no such a + node exists. + @throws KeeperException If the server signals an error + @throws InterruptedException If the server transaction is interrupted. + @throws IllegalArgumentException if an invalid path is specified]]> + + + + + + + + + + If the watch is true and the call is successful (no exception is thrown), + a watch will be left on the node with the given path. The watch will be + triggered by a successful operation that creates/delete the node or sets + the data on the node. + + @param path + the node path + @param watch + whether need to watch this node + @return the stat of the node of the given path; return null if no such a + node exists. + @throws KeeperException If the server signals an error + @throws InterruptedException If the server transaction is interrupted.]]> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + If the watch is non-null and the call is successful (no exception is + thrown), a watch will be left on the node with the given path. The watch + will be triggered by a successful operation that sets data on the node, or + deletes the node. +

      + A KeeperException with error code KeeperException.NoNode will be thrown + if no node with the given path exists. + + @param path the given path + @param watcher explicit watcher + @param stat the stat of the node + @return the data of the node + @throws KeeperException If the server signals an error with a non-zero error code + @throws InterruptedException If the server transaction is interrupted. + @throws IllegalArgumentException if an invalid path is specified]]> + + + + + + + + + + + If the watch is true and the call is successful (no exception is + thrown), a watch will be left on the node with the given path. The watch + will be triggered by a successful operation that sets data on the node, or + deletes the node. +

      + A KeeperException with error code KeeperException.NoNode will be thrown + if no node with the given path exists. + + @param path the given path + @param watch whether need to watch this node + @param stat the stat of the node + @return the data of the node + @throws KeeperException If the server signals an error with a non-zero error code + @throws InterruptedException If the server transaction is interrupted.]]> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + This operation, if successful, will trigger all the watches on the node + of the given path left by getData calls. +

      + A KeeperException with error code KeeperException.NoNode will be thrown + if no node with the given path exists. +

      + A KeeperException with error code KeeperException.BadVersion will be + thrown if the given version does not match the node's version. +

      + The maximum allowable size of the data array is 1 MB (1,048,576 bytes). + Arrays larger than this will cause a KeeperException to be thrown. + + @param path + the path of the node + @param data + the data to set + @param version + the expected matching version + @return the state of the node + @throws InterruptedException If the server transaction is interrupted. + @throws KeeperException If the server signals an error with a non-zero error code. + @throws IllegalArgumentException if an invalid path is specified]]> + + + + + + + + + + + + + + + + + + + + A KeeperException with error code KeeperException.NoNode will be thrown + if no node with the given path exists. + + @param path + the given path for the node + @param stat + the stat of the node will be copied to this parameter. + @return the ACL array of the given node. + @throws InterruptedException If the server transaction is interrupted. + @throws KeeperException If the server signals an error with a non-zero error code. + @throws IllegalArgumentException if an invalid path is specified]]> + + + + + + + + + + + + + + + + + + + + A KeeperException with error code KeeperException.NoNode will be thrown + if no node with the given path exists. +

      + A KeeperException with error code KeeperException.BadVersion will be + thrown if the given version does not match the node's version. + + @param path + @param acl + @param version + @return the stat of the node. + @throws InterruptedException If the server transaction is interrupted. + @throws KeeperException If the server signals an error with a non-zero error code. + @throws org.apache.zookeeper.KeeperException.InvalidACLException If the acl is invalide. + @throws IllegalArgumentException if an invalid path is specified]]> + + + + + + + + + + + + + + + + + + + + If the watch is non-null and the call is successful (no exception is thrown), + a watch will be left on the node with the given path. The watch willbe + triggered by a successful operation that deletes the node of the given + path or creates/delete a child under the node. +

      + The list of children returned is not sorted and no guarantee is provided + as to its natural or lexical order. +

      + A KeeperException with error code KeeperException.NoNode will be thrown + if no node with the given path exists. + + @param path + @param watcher explicit watcher + @return an unordered array of children of the node with the given path + @throws InterruptedException If the server transaction is interrupted. + @throws KeeperException If the server signals an error with a non-zero error code. + @throws IllegalArgumentException if an invalid path is specified]]> + + + + + + + + + + If the watch is true and the call is successful (no exception is thrown), + a watch will be left on the node with the given path. The watch willbe + triggered by a successful operation that deletes the node of the given + path or creates/delete a child under the node. +

      + The list of children returned is not sorted and no guarantee is provided + as to its natural or lexical order. +

      + A KeeperException with error code KeeperException.NoNode will be thrown + if no node with the given path exists. + + @param path + @param watch + @return an unordered array of children of the node with the given path + @throws InterruptedException If the server transaction is interrupted. + @throws KeeperException If the server signals an error with a non-zero error code.]]> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + If the watch is non-null and the call is successful (no exception is thrown), + a watch will be left on the node with the given path. The watch willbe + triggered by a successful operation that deletes the node of the given + path or creates/delete a child under the node. +

      + The list of children returned is not sorted and no guarantee is provided + as to its natural or lexical order. +

      + A KeeperException with error code KeeperException.NoNode will be thrown + if no node with the given path exists. + + @since 3.3.0 + + @param path + @param watcher explicit watcher + @param stat stat of the znode designated by path + @return an unordered array of children of the node with the given path + @throws InterruptedException If the server transaction is interrupted. + @throws KeeperException If the server signals an error with a non-zero error code. + @throws IllegalArgumentException if an invalid path is specified]]> + + + + + + + + + + + If the watch is true and the call is successful (no exception is thrown), + a watch will be left on the node with the given path. The watch willbe + triggered by a successful operation that deletes the node of the given + path or creates/delete a child under the node. +

      + The list of children returned is not sorted and no guarantee is provided + as to its natural or lexical order. +

      + A KeeperException with error code KeeperException.NoNode will be thrown + if no node with the given path exists. + + @since 3.3.0 + + @param path + @param watch + @param stat stat of the znode designated by path + @return an unordered array of children of the node with the given path + @throws InterruptedException If the server transaction is interrupted. + @throws KeeperException If the server signals an error with a non-zero + error code.]]> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Once a connection to a server is established, a session ID is assigned to the + client. The client will send heart beats to the server periodically to keep + the session valid. +

      + The application can call ZooKeeper APIs through a client as long as the + session ID of the client remains valid. +

      + If for some reason, the client fails to send heart beats to the server for a + prolonged period of time (exceeding the sessionTimeout value, for instance), + the server will expire the session, and the session ID will become invalid. + The client object will no longer be usable. To make ZooKeeper API calls, the + application must create a new client object. +

      + If the ZooKeeper server the client currently connects to fails or otherwise + does not respond, the client will automatically try to connect to another + server before its session ID expires. If successful, the application can + continue to use the client. +

      + The ZooKeeper API methods are either synchronous or asynchronous. Synchronous + methods blocks until the server has responded. Asynchronous methods just queue + the request for sending and return immediately. They take a callback object that + will be executed either on successful execution of the request or on error with + an appropriate return code (rc) indicating the error. +

      + Some successful ZooKeeper API calls can leave watches on the "data nodes" in + the ZooKeeper server. Other successful ZooKeeper API calls can trigger those + watches. Once a watch is triggered, an event will be delivered to the client + which left the watch at the first place. Each watch can be triggered only + once. Thus, up to one event will be delivered to a client for every watch it + leaves. +

      + A client needs an object of a class implementing Watcher interface for + processing the events delivered to the client. + + When a client drops current connection and re-connects to a server, all the + existing watches are considered as being triggered but the undelivered events + are lost. To emulate this, the client will generate a special event to tell + the event handler a connection has been dropped. This special event has type + EventNone and state sKeeperStateDisconnected.]]> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/pkg/registry/zookeeper-3.4.6/src/java/lib/jdiff/zookeeper_3.4.6.xml b/pkg/registry/zookeeper-3.4.6/src/java/lib/jdiff/zookeeper_3.4.6.xml new file mode 100644 index 000000000..f91f61149 --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/java/lib/jdiff/zookeeper_3.4.6.xml @@ -0,0 +1,4559 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + null. + @param memoryLimit virtual memory limit + @return a String[] with the ulimit command arguments or + null if we are running on a non *nix platform or + if the limit is unspecified.]]> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Shell interface. + @param cmd shell command to execute. + @return the output of the executed command.]]> + + + + + + + + + Shell interface. + @param env the map of environment key=value + @param cmd shell command to execute. + @param timeout time in milliseconds after which script should be marked timeout + @return the output of the executed command.o]]> + + + + + + + + Shell interface. + @param env the map of environment key=value + @param cmd shell command to execute. + @return the output of the executed command.]]> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Shell can be used to run unix commands like du or + df. It also offers facilities to gate commands by + time-intervals.]]> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ShellCommandExecutorshould be used in cases where the output + of the command needs no explicit parsing and where the command, working + directory and the environment remains unchanged. The output of the command + is stored as-is and is expected to be small.]]> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    1. --short - prints a short version string "1.2.3" +
    2. --revision - prints a short version string with the SVN + repository revision "1.2.3-94" +
    3. --full - prints the revision and the build date + ]]> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Important: All versions, of all nodes, under the given node are deleted. +

      + If there is an error with deleting one of the sub-nodes in the tree, + this operation would abort and would be the responsibility of the app to handle the same. + + See {@link #delete(String, int)} for more details. + + @throws IllegalArgumentException if an invalid path is specified]]> + + + + + + + + + + + + Important: All versions, of all nodes, under the given node are deleted. +

      + If there is an error with deleting one of the sub-nodes in the tree, + this operation would abort and would be the responsibility of the app to handle the same. +

      + @param zk the zookeeper handle + @param pathRoot the path to be deleted + @param cb call back method + @param ctx the context the callback method is called with + @throws IllegalArgumentException if an invalid path is specified]]> + + + + + + + + + + Important: This is not an atomic snapshot of the tree ever, but the + state as it exists across multiple RPCs from zkClient to the ensemble. + For practical purposes, it is suggested to bring the clients to the ensemble + down (i.e. prevent writes to pathRoot) to 'simulate' a snapshot behavior. + + @param zk the zookeeper handle + @param pathRoot The znode path, for which the entire subtree needs to be listed. + @throws InterruptedException + @throws KeeperException]]> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Session establishment is asynchronous. This constructor will initiate + connection to the server and return immediately - potentially (usually) + before the session is fully established. The watcher argument specifies + the watcher that will be notified of any changes in state. This + notification can come at any point before or after the constructor call + has returned. +

      + The instantiated ZooKeeper client object will pick an arbitrary server + from the connectString and attempt to connect to it. If establishment of + the connection fails, another server in the connect string will be tried + (the order is non-deterministic, as we random shuffle the list), until a + connection is established. The client will continue attempts until the + session is explicitly closed. +

      + Added in 3.2.0: An optional "chroot" suffix may also be appended to the + connection string. This will run the client commands while interpreting + all paths relative to this root (similar to the unix chroot command). + + @param connectString + comma separated host:port pairs, each corresponding to a zk + server. e.g. "127.0.0.1:3000,127.0.0.1:3001,127.0.0.1:3002" If + the optional chroot suffix is used the example would look + like: "127.0.0.1:3000,127.0.0.1:3001,127.0.0.1:3002/app/a" + where the client would be rooted at "/app/a" and all paths + would be relative to this root - ie getting/setting/etc... + "/foo/bar" would result in operations being run on + "/app/a/foo/bar" (from the server perspective). + @param sessionTimeout + session timeout in milliseconds + @param watcher + a watcher object which will be notified of state changes, may + also be notified for node events + + @throws IOException + in cases of network failure + @throws IllegalArgumentException + if an invalid chroot path is specified]]> + + + + + + + Session establishment is asynchronous. This constructor will initiate + connection to the server and return immediately - potentially (usually) + before the session is fully established. The watcher argument specifies + the watcher that will be notified of any changes in state. This + notification can come at any point before or after the constructor call + has returned. +

      + The instantiated ZooKeeper client object will pick an arbitrary server + from the connectString and attempt to connect to it. If establishment of + the connection fails, another server in the connect string will be tried + (the order is non-deterministic, as we random shuffle the list), until a + connection is established. The client will continue attempts until the + session is explicitly closed. +

      + Added in 3.2.0: An optional "chroot" suffix may also be appended to the + connection string. This will run the client commands while interpreting + all paths relative to this root (similar to the unix chroot command). + + @param connectString + comma separated host:port pairs, each corresponding to a zk + server. e.g. "127.0.0.1:3000,127.0.0.1:3001,127.0.0.1:3002" If + the optional chroot suffix is used the example would look + like: "127.0.0.1:3000,127.0.0.1:3001,127.0.0.1:3002/app/a" + where the client would be rooted at "/app/a" and all paths + would be relative to this root - ie getting/setting/etc... + "/foo/bar" would result in operations being run on + "/app/a/foo/bar" (from the server perspective). + @param sessionTimeout + session timeout in milliseconds + @param watcher + a watcher object which will be notified of state changes, may + also be notified for node events + @param canBeReadOnly + (added in 3.4) whether the created client is allowed to go to + read-only mode in case of partitioning. Read-only mode + basically means that if the client can't find any majority + servers but there's partitioned server it could reach, it + connects to one in read-only mode, i.e. read requests are + allowed while write requests are not. It continues seeking for + majority in the background. + + @throws IOException + in cases of network failure + @throws IllegalArgumentException + if an invalid chroot path is specified]]> + + + + + + + Session establishment is asynchronous. This constructor will initiate + connection to the server and return immediately - potentially (usually) + before the session is fully established. The watcher argument specifies + the watcher that will be notified of any changes in state. This + notification can come at any point before or after the constructor call + has returned. +

      + The instantiated ZooKeeper client object will pick an arbitrary server + from the connectString and attempt to connect to it. If establishment of + the connection fails, another server in the connect string will be tried + (the order is non-deterministic, as we random shuffle the list), until a + connection is established. The client will continue attempts until the + session is explicitly closed (or the session is expired by the server). +

      + Added in 3.2.0: An optional "chroot" suffix may also be appended to the + connection string. This will run the client commands while interpreting + all paths relative to this root (similar to the unix chroot command). +

      + Use {@link #getSessionId} and {@link #getSessionPasswd} on an established + client connection, these values must be passed as sessionId and + sessionPasswd respectively if reconnecting. Otherwise, if not + reconnecting, use the other constructor which does not require these + parameters. + + @param connectString + comma separated host:port pairs, each corresponding to a zk + server. e.g. "127.0.0.1:3000,127.0.0.1:3001,127.0.0.1:3002" + If the optional chroot suffix is used the example would look + like: "127.0.0.1:3000,127.0.0.1:3001,127.0.0.1:3002/app/a" + where the client would be rooted at "/app/a" and all paths + would be relative to this root - ie getting/setting/etc... + "/foo/bar" would result in operations being run on + "/app/a/foo/bar" (from the server perspective). + @param sessionTimeout + session timeout in milliseconds + @param watcher + a watcher object which will be notified of state changes, may + also be notified for node events + @param sessionId + specific session id to use if reconnecting + @param sessionPasswd + password for this session + + @throws IOException in cases of network failure + @throws IllegalArgumentException if an invalid chroot path is specified + @throws IllegalArgumentException for an invalid list of ZooKeeper hosts]]> + + + + + + + Session establishment is asynchronous. This constructor will initiate + connection to the server and return immediately - potentially (usually) + before the session is fully established. The watcher argument specifies + the watcher that will be notified of any changes in state. This + notification can come at any point before or after the constructor call + has returned. +

      + The instantiated ZooKeeper client object will pick an arbitrary server + from the connectString and attempt to connect to it. If establishment of + the connection fails, another server in the connect string will be tried + (the order is non-deterministic, as we random shuffle the list), until a + connection is established. The client will continue attempts until the + session is explicitly closed (or the session is expired by the server). +

      + Added in 3.2.0: An optional "chroot" suffix may also be appended to the + connection string. This will run the client commands while interpreting + all paths relative to this root (similar to the unix chroot command). +

      + Use {@link #getSessionId} and {@link #getSessionPasswd} on an established + client connection, these values must be passed as sessionId and + sessionPasswd respectively if reconnecting. Otherwise, if not + reconnecting, use the other constructor which does not require these + parameters. + + @param connectString + comma separated host:port pairs, each corresponding to a zk + server. e.g. "127.0.0.1:3000,127.0.0.1:3001,127.0.0.1:3002" + If the optional chroot suffix is used the example would look + like: "127.0.0.1:3000,127.0.0.1:3001,127.0.0.1:3002/app/a" + where the client would be rooted at "/app/a" and all paths + would be relative to this root - ie getting/setting/etc... + "/foo/bar" would result in operations being run on + "/app/a/foo/bar" (from the server perspective). + @param sessionTimeout + session timeout in milliseconds + @param watcher + a watcher object which will be notified of state changes, may + also be notified for node events + @param sessionId + specific session id to use if reconnecting + @param sessionPasswd + password for this session + @param canBeReadOnly + (added in 3.4) whether the created client is allowed to go to + read-only mode in case of partitioning. Read-only mode + basically means that if the client can't find any majority + servers but there's partitioned server it could reach, it + connects to one in read-only mode, i.e. read requests are + allowed while write requests are not. It continues seeking for + majority in the background. + + @throws IOException in cases of network failure + @throws IllegalArgumentException if an invalid chroot path is specified]]> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + The flags argument specifies whether the created node will be ephemeral + or not. +

      + An ephemeral node will be removed by the ZooKeeper automatically when the + session associated with the creation of the node expires. +

      + The flags argument can also specify to create a sequential node. The + actual path name of a sequential node will be the given path plus a + suffix "i" where i is the current sequential number of the node. The sequence + number is always fixed length of 10 digits, 0 padded. Once + such a node is created, the sequential number will be incremented by one. +

      + If a node with the same actual path already exists in the ZooKeeper, a + KeeperException with error code KeeperException.NodeExists will be + thrown. Note that since a different actual path is used for each + invocation of creating sequential node with the same path argument, the + call will never throw "file exists" KeeperException. +

      + If the parent node does not exist in the ZooKeeper, a KeeperException + with error code KeeperException.NoNode will be thrown. +

      + An ephemeral node cannot have children. If the parent node of the given + path is ephemeral, a KeeperException with error code + KeeperException.NoChildrenForEphemerals will be thrown. +

      + This operation, if successful, will trigger all the watches left on the + node of the given path by exists and getData API calls, and the watches + left on the parent node by getChildren API calls. +

      + If a node is created successfully, the ZooKeeper server will trigger the + watches on the path left by exists calls, and the watches on the parent + of the node by getChildren calls. +

      + The maximum allowable size of the data array is 1 MB (1,048,576 bytes). + Arrays larger than this will cause a KeeperExecption to be thrown. + + @param path + the path for the node + @param data + the initial data for the node + @param acl + the acl for the node + @param createMode + specifying whether the node to be created is ephemeral + and/or sequential + @return the actual path of the created node + @throws KeeperException if the server returns a non-zero error code + @throws KeeperException.InvalidACLException if the ACL is invalid, null, or empty + @throws InterruptedException if the transaction is interrupted + @throws IllegalArgumentException if an invalid path is specified]]> + + + + + + + + + + + + + + + + + + + + + A KeeperException with error code KeeperException.NoNode will be thrown + if the nodes does not exist. +

      + A KeeperException with error code KeeperException.BadVersion will be + thrown if the given version does not match the node's version. +

      + A KeeperException with error code KeeperException.NotEmpty will be thrown + if the node has children. +

      + This operation, if successful, will trigger all the watches on the node + of the given path left by exists API calls, and the watches on the parent + node left by getChildren API calls. + + @param path + the path of the node to be deleted. + @param version + the expected node version. + @throws InterruptedException IF the server transaction is interrupted + @throws KeeperException If the server signals an error with a non-zero + return code. + @throws IllegalArgumentException if an invalid path is specified]]> + + + + + + + + + On success, a list of results is returned. + On failure, an exception is raised which contains partial results and + error details, see {@link KeeperException#getResults} +

      + Note: The maximum allowable size of all of the data arrays in all of + the setData operations in this single request is typically 1 MB + (1,048,576 bytes). This limit is specified on the server via + jute.maxbuffer. + Requests larger than this will cause a KeeperException to be + thrown. + + @param ops An iterable that contains the operations to be done. + These should be created using the factory methods on {@link Op}. + @return A list of results, one for each input Op, the order of + which exactly matches the order of the ops input + operations. + @throws InterruptedException If the operation was interrupted. + The operation may or may not have succeeded, but will not have + partially succeeded if this exception is thrown. + @throws KeeperException If the operation could not be completed + due to some error in doing one of the specified ops. + @throws IllegalArgumentException if an invalid path is specified + + @since 3.4.0]]> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + If the watch is non-null and the call is successful (no exception is thrown), + a watch will be left on the node with the given path. The watch will be + triggered by a successful operation that creates/delete the node or sets + the data on the node. + + @param path the node path + @param watcher explicit watcher + @return the stat of the node of the given path; return null if no such a + node exists. + @throws KeeperException If the server signals an error + @throws InterruptedException If the server transaction is interrupted. + @throws IllegalArgumentException if an invalid path is specified]]> + + + + + + + + + + If the watch is true and the call is successful (no exception is thrown), + a watch will be left on the node with the given path. The watch will be + triggered by a successful operation that creates/delete the node or sets + the data on the node. + + @param path + the node path + @param watch + whether need to watch this node + @return the stat of the node of the given path; return null if no such a + node exists. + @throws KeeperException If the server signals an error + @throws InterruptedException If the server transaction is interrupted.]]> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + If the watch is non-null and the call is successful (no exception is + thrown), a watch will be left on the node with the given path. The watch + will be triggered by a successful operation that sets data on the node, or + deletes the node. +

      + A KeeperException with error code KeeperException.NoNode will be thrown + if no node with the given path exists. + + @param path the given path + @param watcher explicit watcher + @param stat the stat of the node + @return the data of the node + @throws KeeperException If the server signals an error with a non-zero error code + @throws InterruptedException If the server transaction is interrupted. + @throws IllegalArgumentException if an invalid path is specified]]> + + + + + + + + + + + If the watch is true and the call is successful (no exception is + thrown), a watch will be left on the node with the given path. The watch + will be triggered by a successful operation that sets data on the node, or + deletes the node. +

      + A KeeperException with error code KeeperException.NoNode will be thrown + if no node with the given path exists. + + @param path the given path + @param watch whether need to watch this node + @param stat the stat of the node + @return the data of the node + @throws KeeperException If the server signals an error with a non-zero error code + @throws InterruptedException If the server transaction is interrupted.]]> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + This operation, if successful, will trigger all the watches on the node + of the given path left by getData calls. +

      + A KeeperException with error code KeeperException.NoNode will be thrown + if no node with the given path exists. +

      + A KeeperException with error code KeeperException.BadVersion will be + thrown if the given version does not match the node's version. +

      + The maximum allowable size of the data array is 1 MB (1,048,576 bytes). + Arrays larger than this will cause a KeeperException to be thrown. + + @param path + the path of the node + @param data + the data to set + @param version + the expected matching version + @return the state of the node + @throws InterruptedException If the server transaction is interrupted. + @throws KeeperException If the server signals an error with a non-zero error code. + @throws IllegalArgumentException if an invalid path is specified]]> + + + + + + + + + + + + + + + + + + + + A KeeperException with error code KeeperException.NoNode will be thrown + if no node with the given path exists. + + @param path + the given path for the node + @param stat + the stat of the node will be copied to this parameter. + @return the ACL array of the given node. + @throws InterruptedException If the server transaction is interrupted. + @throws KeeperException If the server signals an error with a non-zero error code. + @throws IllegalArgumentException if an invalid path is specified]]> + + + + + + + + + + + + + + + + + + + + A KeeperException with error code KeeperException.NoNode will be thrown + if no node with the given path exists. +

      + A KeeperException with error code KeeperException.BadVersion will be + thrown if the given version does not match the node's version. + + @param path + @param acl + @param version + @return the stat of the node. + @throws InterruptedException If the server transaction is interrupted. + @throws KeeperException If the server signals an error with a non-zero error code. + @throws org.apache.zookeeper.KeeperException.InvalidACLException If the acl is invalide. + @throws IllegalArgumentException if an invalid path is specified]]> + + + + + + + + + + + + + + + + + + + + If the watch is non-null and the call is successful (no exception is thrown), + a watch will be left on the node with the given path. The watch willbe + triggered by a successful operation that deletes the node of the given + path or creates/delete a child under the node. +

      + The list of children returned is not sorted and no guarantee is provided + as to its natural or lexical order. +

      + A KeeperException with error code KeeperException.NoNode will be thrown + if no node with the given path exists. + + @param path + @param watcher explicit watcher + @return an unordered array of children of the node with the given path + @throws InterruptedException If the server transaction is interrupted. + @throws KeeperException If the server signals an error with a non-zero error code. + @throws IllegalArgumentException if an invalid path is specified]]> + + + + + + + + + + If the watch is true and the call is successful (no exception is thrown), + a watch will be left on the node with the given path. The watch willbe + triggered by a successful operation that deletes the node of the given + path or creates/delete a child under the node. +

      + The list of children returned is not sorted and no guarantee is provided + as to its natural or lexical order. +

      + A KeeperException with error code KeeperException.NoNode will be thrown + if no node with the given path exists. + + @param path + @param watch + @return an unordered array of children of the node with the given path + @throws InterruptedException If the server transaction is interrupted. + @throws KeeperException If the server signals an error with a non-zero error code.]]> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + If the watch is non-null and the call is successful (no exception is thrown), + a watch will be left on the node with the given path. The watch willbe + triggered by a successful operation that deletes the node of the given + path or creates/delete a child under the node. +

      + The list of children returned is not sorted and no guarantee is provided + as to its natural or lexical order. +

      + A KeeperException with error code KeeperException.NoNode will be thrown + if no node with the given path exists. + + @since 3.3.0 + + @param path + @param watcher explicit watcher + @param stat stat of the znode designated by path + @return an unordered array of children of the node with the given path + @throws InterruptedException If the server transaction is interrupted. + @throws KeeperException If the server signals an error with a non-zero error code. + @throws IllegalArgumentException if an invalid path is specified]]> + + + + + + + + + + + If the watch is true and the call is successful (no exception is thrown), + a watch will be left on the node with the given path. The watch willbe + triggered by a successful operation that deletes the node of the given + path or creates/delete a child under the node. +

      + The list of children returned is not sorted and no guarantee is provided + as to its natural or lexical order. +

      + A KeeperException with error code KeeperException.NoNode will be thrown + if no node with the given path exists. + + @since 3.3.0 + + @param path + @param watch + @param stat stat of the znode designated by path + @return an unordered array of children of the node with the given path + @throws InterruptedException If the server transaction is interrupted. + @throws KeeperException If the server signals an error with a non-zero + error code.]]> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Once a connection to a server is established, a session ID is assigned to the + client. The client will send heart beats to the server periodically to keep + the session valid. +

      + The application can call ZooKeeper APIs through a client as long as the + session ID of the client remains valid. +

      + If for some reason, the client fails to send heart beats to the server for a + prolonged period of time (exceeding the sessionTimeout value, for instance), + the server will expire the session, and the session ID will become invalid. + The client object will no longer be usable. To make ZooKeeper API calls, the + application must create a new client object. +

      + If the ZooKeeper server the client currently connects to fails or otherwise + does not respond, the client will automatically try to connect to another + server before its session ID expires. If successful, the application can + continue to use the client. +

      + The ZooKeeper API methods are either synchronous or asynchronous. Synchronous + methods blocks until the server has responded. Asynchronous methods just queue + the request for sending and return immediately. They take a callback object that + will be executed either on successful execution of the request or on error with + an appropriate return code (rc) indicating the error. +

      + Some successful ZooKeeper API calls can leave watches on the "data nodes" in + the ZooKeeper server. Other successful ZooKeeper API calls can trigger those + watches. Once a watch is triggered, an event will be delivered to the client + which left the watch at the first place. Each watch can be triggered only + once. Thus, up to one event will be delivered to a client for every watch it + leaves. +

      + A client needs an object of a class implementing Watcher interface for + processing the events delivered to the client. + + When a client drops current connection and re-connects to a server, all the + existing watches are considered as being triggered but the undelivered events + are lost. To emulate this, the client will generate a special event to tell + the event handler a connection has been dropped. This special event has type + EventNone and state sKeeperStateDisconnected.]]> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/pkg/registry/zookeeper-3.4.6/src/java/lib/jline-0.9.94.LICENSE.txt b/pkg/registry/zookeeper-3.4.6/src/java/lib/jline-0.9.94.LICENSE.txt new file mode 100644 index 000000000..1cdc44c21 --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/java/lib/jline-0.9.94.LICENSE.txt @@ -0,0 +1,33 @@ +Copyright (c) 2002-2006, Marc Prud'hommeaux +All rights reserved. + +Redistribution and use in source and binary forms, with or +without modification, are permitted provided that the following +conditions are met: + +Redistributions of source code must retain the above copyright +notice, this list of conditions and the following disclaimer. + +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. + +Neither the name of JLine nor the names of its contributors +may be used to endorse or promote products derived from this +software without specific prior written permission. + +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. + diff --git a/pkg/registry/zookeeper-3.4.6/src/java/lib/log4j-1.2.16.LICENSE.txt b/pkg/registry/zookeeper-3.4.6/src/java/lib/log4j-1.2.16.LICENSE.txt new file mode 100644 index 000000000..6279e5206 --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/java/lib/log4j-1.2.16.LICENSE.txt @@ -0,0 +1,202 @@ + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright 1999-2005 The Apache Software Foundation + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/jute/BinaryInputArchive.java b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/jute/BinaryInputArchive.java new file mode 100644 index 000000000..6b2cb46a8 --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/jute/BinaryInputArchive.java @@ -0,0 +1,126 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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. + */ + +package org.apache.jute; + +import java.io.DataInput; +import java.io.DataInputStream; +import java.io.IOException; +import java.io.InputStream; + +/** + * + */ +public class BinaryInputArchive implements InputArchive { + + private DataInput in; + + static public BinaryInputArchive getArchive(InputStream strm) { + return new BinaryInputArchive(new DataInputStream(strm)); + } + + static private class BinaryIndex implements Index { + private int nelems; + BinaryIndex(int nelems) { + this.nelems = nelems; + } + public boolean done() { + return (nelems <= 0); + } + public void incr() { + nelems--; + } + } + /** Creates a new instance of BinaryInputArchive */ + public BinaryInputArchive(DataInput in) { + this.in = in; + } + + public byte readByte(String tag) throws IOException { + return in.readByte(); + } + + public boolean readBool(String tag) throws IOException { + return in.readBoolean(); + } + + public int readInt(String tag) throws IOException { + return in.readInt(); + } + + public long readLong(String tag) throws IOException { + return in.readLong(); + } + + public float readFloat(String tag) throws IOException { + return in.readFloat(); + } + + public double readDouble(String tag) throws IOException { + return in.readDouble(); + } + + public String readString(String tag) throws IOException { + int len = in.readInt(); + if (len == -1) return null; + byte b[] = new byte[len]; + in.readFully(b); + return new String(b, "UTF8"); + } + + static public final int maxBuffer = Integer.getInteger("jute.maxbuffer", 0xfffff); + + public byte[] readBuffer(String tag) throws IOException { + int len = readInt(tag); + if (len == -1) return null; + // Since this is a rough sanity check, add some padding to maxBuffer to + // make up for extra fields, etc. (otherwise e.g. clients may be able to + // write buffers larger than we can read from disk!) + if (len < 0 || len > maxBuffer + 1024) { + throw new IOException("Unreasonable length = " + len); + } + byte[] arr = new byte[len]; + in.readFully(arr); + return arr; + } + + public void readRecord(Record r, String tag) throws IOException { + r.deserialize(this, tag); + } + + public void startRecord(String tag) throws IOException {} + + public void endRecord(String tag) throws IOException {} + + public Index startVector(String tag) throws IOException { + int len = readInt(tag); + if (len == -1) { + return null; + } + return new BinaryIndex(len); + } + + public void endVector(String tag) throws IOException {} + + public Index startMap(String tag) throws IOException { + return new BinaryIndex(readInt(tag)); + } + + public void endMap(String tag) throws IOException {} + +} diff --git a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/jute/BinaryOutputArchive.java b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/jute/BinaryOutputArchive.java new file mode 100644 index 000000000..213e20339 --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/jute/BinaryOutputArchive.java @@ -0,0 +1,146 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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. + */ + +package org.apache.jute; + +import java.io.DataOutput; +import java.io.DataOutputStream; +import java.io.IOException; +import java.io.OutputStream; +import java.nio.ByteBuffer; +import java.util.List; +import java.util.TreeMap; + +/** + * + */ +public class BinaryOutputArchive implements OutputArchive { + private ByteBuffer bb = ByteBuffer.allocate(1024); + + private DataOutput out; + + public static BinaryOutputArchive getArchive(OutputStream strm) { + return new BinaryOutputArchive(new DataOutputStream(strm)); + } + + /** Creates a new instance of BinaryOutputArchive */ + public BinaryOutputArchive(DataOutput out) { + this.out = out; + } + + public void writeByte(byte b, String tag) throws IOException { + out.writeByte(b); + } + + public void writeBool(boolean b, String tag) throws IOException { + out.writeBoolean(b); + } + + public void writeInt(int i, String tag) throws IOException { + out.writeInt(i); + } + + public void writeLong(long l, String tag) throws IOException { + out.writeLong(l); + } + + public void writeFloat(float f, String tag) throws IOException { + out.writeFloat(f); + } + + public void writeDouble(double d, String tag) throws IOException { + out.writeDouble(d); + } + + /** + * create our own char encoder to utf8. This is faster + * then string.getbytes(UTF8). + * @param s the string to encode into utf8 + * @return utf8 byte sequence. + */ + final private ByteBuffer stringToByteBuffer(CharSequence s) { + bb.clear(); + final int len = s.length(); + for (int i = 0; i < len; i++) { + if (bb.remaining() < 3) { + ByteBuffer n = ByteBuffer.allocate(bb.capacity() << 1); + bb.flip(); + n.put(bb); + bb = n; + } + char c = s.charAt(i); + if (c < 0x80) { + bb.put((byte) c); + } else if (c < 0x800) { + bb.put((byte) (0xc0 | (c >> 6))); + bb.put((byte) (0x80 | (c & 0x3f))); + } else { + bb.put((byte) (0xe0 | (c >> 12))); + bb.put((byte) (0x80 | ((c >> 6) & 0x3f))); + bb.put((byte) (0x80 | (c & 0x3f))); + } + } + bb.flip(); + return bb; + } + + public void writeString(String s, String tag) throws IOException { + if (s == null) { + writeInt(-1, "len"); + return; + } + ByteBuffer bb = stringToByteBuffer(s); + writeInt(bb.remaining(), "len"); + out.write(bb.array(), bb.position(), bb.limit()); + } + + public void writeBuffer(byte barr[], String tag) + throws IOException { + if (barr == null) { + out.writeInt(-1); + return; + } + out.writeInt(barr.length); + out.write(barr); + } + + public void writeRecord(Record r, String tag) throws IOException { + r.serialize(this, tag); + } + + public void startRecord(Record r, String tag) throws IOException {} + + public void endRecord(Record r, String tag) throws IOException {} + + public void startVector(List v, String tag) throws IOException { + if (v == null) { + writeInt(-1, tag); + return; + } + writeInt(v.size(), tag); + } + + public void endVector(List v, String tag) throws IOException {} + + public void startMap(TreeMap v, String tag) throws IOException { + writeInt(v.size(), tag); + } + + public void endMap(TreeMap v, String tag) throws IOException {} + +} diff --git a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/jute/CsvInputArchive.java b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/jute/CsvInputArchive.java new file mode 100644 index 000000000..3eb40ec7e --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/jute/CsvInputArchive.java @@ -0,0 +1,208 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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. + */ + +package org.apache.jute; + +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.io.PushbackReader; +import java.io.UnsupportedEncodingException; + +/** + * + */ +class CsvInputArchive implements InputArchive { + + private PushbackReader stream; + + private class CsvIndex implements Index { + public boolean done() { + char c = '\0'; + try { + c = (char) stream.read(); + stream.unread(c); + } catch (IOException ex) { + } + return (c == '}') ? true : false; + } + public void incr() {} + } + + private void throwExceptionOnError(String tag) throws IOException { + throw new IOException("Error deserializing "+tag); + } + + private String readField(String tag) throws IOException { + try { + StringBuilder buf = new StringBuilder(); + while (true) { + char c = (char) stream.read(); + switch (c) { + case ',': + return buf.toString(); + case '}': + case '\n': + case '\r': + stream.unread(c); + return buf.toString(); + default: + buf.append(c); + } + } + } catch (IOException ex) { + throw new IOException("Error reading "+tag); + } + } + + static CsvInputArchive getArchive(InputStream strm) + throws UnsupportedEncodingException { + return new CsvInputArchive(strm); + } + + /** Creates a new instance of CsvInputArchive */ + public CsvInputArchive(InputStream in) + throws UnsupportedEncodingException { + stream = new PushbackReader(new InputStreamReader(in, "UTF-8")); + } + + public byte readByte(String tag) throws IOException { + return (byte) readLong(tag); + } + + public boolean readBool(String tag) throws IOException { + String sval = readField(tag); + return "T".equals(sval) ? true : false; + } + + public int readInt(String tag) throws IOException { + return (int) readLong(tag); + } + + public long readLong(String tag) throws IOException { + String sval = readField(tag); + try { + long lval = Long.parseLong(sval); + return lval; + } catch (NumberFormatException ex) { + throw new IOException("Error deserializing "+tag); + } + } + + public float readFloat(String tag) throws IOException { + return (float) readDouble(tag); + } + + public double readDouble(String tag) throws IOException { + String sval = readField(tag); + try { + double dval = Double.parseDouble(sval); + return dval; + } catch (NumberFormatException ex) { + throw new IOException("Error deserializing "+tag); + } + } + + public String readString(String tag) throws IOException { + String sval = readField(tag); + return Utils.fromCSVString(sval); + + } + + public byte[] readBuffer(String tag) throws IOException { + String sval = readField(tag); + return Utils.fromCSVBuffer(sval); + } + + public void readRecord(Record r, String tag) throws IOException { + r.deserialize(this, tag); + } + + public void startRecord(String tag) throws IOException { + if (tag != null && !"".equals(tag)) { + char c1 = (char) stream.read(); + char c2 = (char) stream.read(); + if (c1 != 's' || c2 != '{') { + throw new IOException("Error deserializing "+tag); + } + } + } + + public void endRecord(String tag) throws IOException { + char c = (char) stream.read(); + if (tag == null || "".equals(tag)) { + if (c != '\n' && c != '\r') { + throw new IOException("Error deserializing record."); + } else { + return; + } + } + + if (c != '}') { + throw new IOException("Error deserializing "+tag); + } + c = (char) stream.read(); + if (c != ',') { + stream.unread(c); + } + + return; + } + + public Index startVector(String tag) throws IOException { + char c1 = (char) stream.read(); + char c2 = (char) stream.read(); + if (c1 != 'v' || c2 != '{') { + throw new IOException("Error deserializing "+tag); + } + return new CsvIndex(); + } + + public void endVector(String tag) throws IOException { + char c = (char) stream.read(); + if (c != '}') { + throw new IOException("Error deserializing "+tag); + } + c = (char) stream.read(); + if (c != ',') { + stream.unread(c); + } + return; + } + + public Index startMap(String tag) throws IOException { + char c1 = (char) stream.read(); + char c2 = (char) stream.read(); + if (c1 != 'm' || c2 != '{') { + throw new IOException("Error deserializing "+tag); + } + return new CsvIndex(); + } + + public void endMap(String tag) throws IOException { + char c = (char) stream.read(); + if (c != '}') { + throw new IOException("Error deserializing "+tag); + } + c = (char) stream.read(); + if (c != ',') { + stream.unread(c); + } + return; + } +} diff --git a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/jute/CsvOutputArchive.java b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/jute/CsvOutputArchive.java new file mode 100644 index 000000000..f6d60d819 --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/jute/CsvOutputArchive.java @@ -0,0 +1,150 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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. + */ + +package org.apache.jute; + +import java.io.IOException; +import java.io.OutputStream; +import java.io.PrintStream; +import java.io.UnsupportedEncodingException; +import java.util.List; +import java.util.TreeMap; + +/** + * + */ +public class CsvOutputArchive implements OutputArchive { + + private PrintStream stream; + private boolean isFirst = true; + + static CsvOutputArchive getArchive(OutputStream strm) + throws UnsupportedEncodingException { + return new CsvOutputArchive(strm); + } + + private void throwExceptionOnError(String tag) throws IOException { + if (stream.checkError()) { + throw new IOException("Error serializing "+tag); + } + } + + private void printCommaUnlessFirst() { + if (!isFirst) { + stream.print(","); + } + isFirst = false; + } + + /** Creates a new instance of CsvOutputArchive */ + public CsvOutputArchive(OutputStream out) + throws UnsupportedEncodingException { + stream = new PrintStream(out, true, "UTF-8"); + } + + public void writeByte(byte b, String tag) throws IOException { + writeLong((long)b, tag); + } + + public void writeBool(boolean b, String tag) throws IOException { + printCommaUnlessFirst(); + String val = b ? "T" : "F"; + stream.print(val); + throwExceptionOnError(tag); + } + + public void writeInt(int i, String tag) throws IOException { + writeLong((long)i, tag); + } + + public void writeLong(long l, String tag) throws IOException { + printCommaUnlessFirst(); + stream.print(l); + throwExceptionOnError(tag); + } + + public void writeFloat(float f, String tag) throws IOException { + writeDouble((double)f, tag); + } + + public void writeDouble(double d, String tag) throws IOException { + printCommaUnlessFirst(); + stream.print(d); + throwExceptionOnError(tag); + } + + public void writeString(String s, String tag) throws IOException { + printCommaUnlessFirst(); + stream.print(Utils.toCSVString(s)); + throwExceptionOnError(tag); + } + + public void writeBuffer(byte buf[], String tag) + throws IOException { + printCommaUnlessFirst(); + stream.print(Utils.toCSVBuffer(buf)); + throwExceptionOnError(tag); + } + + public void writeRecord(Record r, String tag) throws IOException { + if (r == null) { + return; + } + r.serialize(this, tag); + } + + public void startRecord(Record r, String tag) throws IOException { + if (tag != null && !"".equals(tag)) { + printCommaUnlessFirst(); + stream.print("s{"); + isFirst = true; + } + } + + public void endRecord(Record r, String tag) throws IOException { + if (tag == null || "".equals(tag)) { + stream.print("\n"); + isFirst = true; + } else { + stream.print("}"); + isFirst = false; + } + } + + public void startVector(List v, String tag) throws IOException { + printCommaUnlessFirst(); + stream.print("v{"); + isFirst = true; + } + + public void endVector(List v, String tag) throws IOException { + stream.print("}"); + isFirst = false; + } + + public void startMap(TreeMap v, String tag) throws IOException { + printCommaUnlessFirst(); + stream.print("m{"); + isFirst = true; + } + + public void endMap(TreeMap v, String tag) throws IOException { + stream.print("}"); + isFirst = false; + } +} diff --git a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/jute/Index.java b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/jute/Index.java new file mode 100644 index 000000000..258c6b55d --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/jute/Index.java @@ -0,0 +1,38 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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. + */ + +package org.apache.jute; + +/** + * Interface that acts as an iterator for deserializing maps. + * The deserializer returns an instance that the record uses to + * read vectors and maps. An example of usage is as follows: + * + * + * Index idx = startVector(...); + * while (!idx.done()) { + * .... // read element of a vector + * idx.incr(); + * } + * + * + */ +public interface Index { + public boolean done(); + public void incr(); +} diff --git a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/jute/InputArchive.java b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/jute/InputArchive.java new file mode 100644 index 000000000..b19ab3de6 --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/jute/InputArchive.java @@ -0,0 +1,43 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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. + */ + +package org.apache.jute; + +import java.io.IOException; + +/** + * Interface that all the Deserializers have to implement. + * + */ +public interface InputArchive { + public byte readByte(String tag) throws IOException; + public boolean readBool(String tag) throws IOException; + public int readInt(String tag) throws IOException; + public long readLong(String tag) throws IOException; + public float readFloat(String tag) throws IOException; + public double readDouble(String tag) throws IOException; + public String readString(String tag) throws IOException; + public byte[] readBuffer(String tag) throws IOException; + public void readRecord(Record r, String tag) throws IOException; + public void startRecord(String tag) throws IOException; + public void endRecord(String tag) throws IOException; + public Index startVector(String tag) throws IOException; + public void endVector(String tag) throws IOException; + public Index startMap(String tag) throws IOException; + public void endMap(String tag) throws IOException; +} diff --git a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/jute/OutputArchive.java b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/jute/OutputArchive.java new file mode 100644 index 000000000..4e084e8e1 --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/jute/OutputArchive.java @@ -0,0 +1,47 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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. + */ + +package org.apache.jute; + +import java.io.IOException; +import java.util.List; +import java.util.TreeMap; + +/** + * Interface that alll the serializers have to implement. + * + */ +public interface OutputArchive { + public void writeByte(byte b, String tag) throws IOException; + public void writeBool(boolean b, String tag) throws IOException; + public void writeInt(int i, String tag) throws IOException; + public void writeLong(long l, String tag) throws IOException; + public void writeFloat(float f, String tag) throws IOException; + public void writeDouble(double d, String tag) throws IOException; + public void writeString(String s, String tag) throws IOException; + public void writeBuffer(byte buf[], String tag) + throws IOException; + public void writeRecord(Record r, String tag) throws IOException; + public void startRecord(Record r, String tag) throws IOException; + public void endRecord(Record r, String tag) throws IOException; + public void startVector(List v, String tag) throws IOException; + public void endVector(List v, String tag) throws IOException; + public void startMap(TreeMap v, String tag) throws IOException; + public void endMap(TreeMap v, String tag) throws IOException; + +} diff --git a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/jute/Record.java b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/jute/Record.java new file mode 100644 index 000000000..bc7a350ee --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/jute/Record.java @@ -0,0 +1,32 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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. + */ + +package org.apache.jute; + +import java.io.IOException; + +/** + * Interface that is implemented by generated classes. + * + */ +public interface Record { + public void serialize(OutputArchive archive, String tag) + throws IOException; + public void deserialize(InputArchive archive, String tag) + throws IOException; +} diff --git a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/jute/RecordReader.java b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/jute/RecordReader.java new file mode 100644 index 000000000..2977d3fbe --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/jute/RecordReader.java @@ -0,0 +1,93 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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. + */ + +package org.apache.jute; + +import java.io.IOException; +import java.io.InputStream; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; +import java.util.HashMap; + +/** + * Front-end interface to deserializers. Also acts as a factory + * for deserializers. + * + */ +public class RecordReader { + + private InputArchive archive; + + static private HashMap archiveFactory; + + static { + archiveFactory = new HashMap(); + Class[] params = { InputStream.class }; + try { + archiveFactory.put("binary", + BinaryInputArchive.class.getDeclaredMethod( + "getArchive", params)); + archiveFactory.put("csv", + CsvInputArchive.class.getDeclaredMethod( + "getArchive", params)); + archiveFactory.put("xml", + XmlInputArchive.class.getDeclaredMethod( + "getArchive", params)); + } catch (SecurityException ex) { + ex.printStackTrace(); + } catch (NoSuchMethodException ex) { + ex.printStackTrace(); + } + } + + static private InputArchive createArchive(InputStream in, String format) + throws IOException { + Method factory = (Method) archiveFactory.get(format); + if (factory != null) { + Object[] params = { in }; + try { + return (InputArchive) factory.invoke(null, params); + } catch (IllegalArgumentException ex) { + ex.printStackTrace(); + } catch (InvocationTargetException ex) { + ex.printStackTrace(); + } catch (IllegalAccessException ex) { + ex.printStackTrace(); + } + } + return null; + } + /** + * Creates a new instance of RecordReader. + * @param in Stream from which to deserialize a record + * @param format Deserialization format ("binary", "xml", or "csv") + */ + public RecordReader(InputStream in, String format) + throws IOException { + archive = createArchive(in, format); + } + + /** + * Deserialize a record + * @param r Record to be deserialized + */ + public void read(Record r) throws IOException { + r.deserialize(archive, ""); + } + +} diff --git a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/jute/RecordWriter.java b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/jute/RecordWriter.java new file mode 100644 index 000000000..0adbd56f5 --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/jute/RecordWriter.java @@ -0,0 +1,113 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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. + */ + +package org.apache.jute; + +import java.io.DataOutputStream; +import java.io.IOException; +import java.io.OutputStream; +import java.io.UnsupportedEncodingException; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; +import java.util.HashMap; + +/** + * Front-end for serializers. Also serves as a factory for serializers. + * + */ +public class RecordWriter { + + private OutputArchive archive; + + static private OutputArchive getBinaryArchive(OutputStream out) { + return new BinaryOutputArchive(new DataOutputStream(out)); + } + + static private OutputArchive getCsvArchive(OutputStream out) + throws IOException { + try { + return new CsvOutputArchive(out); + } catch (UnsupportedEncodingException ex) { + throw new IOException("Unsupported encoding UTF-8"); + } + } + + static private OutputArchive getXmlArchive(OutputStream out) + throws IOException { + return new XmlOutputArchive(out); + } + + static HashMap constructFactory() { + HashMap factory = new HashMap(); + Class[] params = { OutputStream.class }; + try { + factory.put("binary", + BinaryOutputArchive.class.getDeclaredMethod( + "getArchive", params)); + factory.put("csv", + CsvOutputArchive.class.getDeclaredMethod( + "getArchive", params)); + factory.put("xml", + XmlOutputArchive.class.getDeclaredMethod( + "getArchive", params)); + } catch (SecurityException ex) { + ex.printStackTrace(); + } catch (NoSuchMethodException ex) { + ex.printStackTrace(); + } + return factory; + } + + static private HashMap archiveFactory = constructFactory(); + + static private OutputArchive createArchive(OutputStream out, + String format) + throws IOException { + Method factory = (Method) archiveFactory.get(format); + if (factory != null) { + Object[] params = { out }; + try { + return (OutputArchive) factory.invoke(null, params); + } catch (IllegalArgumentException ex) { + ex.printStackTrace(); + } catch (InvocationTargetException ex) { + ex.printStackTrace(); + } catch (IllegalAccessException ex) { + ex.printStackTrace(); + } + } + return null; + } + /** + * Creates a new instance of RecordWriter + * @param out Output stream where the records will be serialized + * @param format Serialization format ("binary", "xml", or "csv") + */ + public RecordWriter(OutputStream out, String format) + throws IOException { + archive = createArchive(out, format); + } + + /** + * Serialize a record + * @param r record to be serialized + */ + public void write(Record r) throws IOException { + r.serialize(archive, ""); + } +} diff --git a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/jute/Utils.java b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/jute/Utils.java new file mode 100644 index 000000000..243f2c8b0 --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/jute/Utils.java @@ -0,0 +1,282 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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. + */ + +package org.apache.jute; + +import java.io.ByteArrayOutputStream; +import java.io.IOException; + +/** + * Various utility functions for Hadoop record I/O runtime. + */ +public class Utils { + + /** Cannot create a new instance of Utils */ + private Utils() { + super(); + } + + /** + * equals function that actually compares two buffers. + * + * @param onearray First buffer + * @param twoarray Second buffer + * @return true if one and two contain exactly the same content, else false. + */ + public static boolean bufEquals(byte onearray[], byte twoarray[] ) { + if (onearray == twoarray) return true; + boolean ret = (onearray.length == twoarray.length); + if (!ret) { + return ret; + } + for (int idx = 0; idx < onearray.length; idx++) { + if (onearray[idx] != twoarray[idx]) { + return false; + } + } + return true; + } + + private static final char[] hexchars = { '0', '1', '2', '3', '4', '5', + '6', '7', '8', '9', 'A', 'B', + 'C', 'D', 'E', 'F' }; + /** + * + * @param s + * @return + */ + static String toXMLString(String s) { + if (s == null) + return ""; + + StringBuilder sb = new StringBuilder(); + for (int idx = 0; idx < s.length(); idx++) { + char ch = s.charAt(idx); + if (ch == '<') { + sb.append("<"); + } else if (ch == '&') { + sb.append("&"); + } else if (ch == '%') { + sb.append("%25"); + } else if (ch < 0x20) { + sb.append("%"); + sb.append(hexchars[ch/16]); + sb.append(hexchars[ch%16]); + } else { + sb.append(ch); + } + } + return sb.toString(); + } + + static private int h2c(char ch) { + if (ch >= '0' && ch <= '9') { + return ch - '0'; + } else if (ch >= 'A' && ch <= 'F') { + return ch - 'A'; + } else if (ch >= 'a' && ch <= 'f') { + return ch - 'a'; + } + return 0; + } + + /** + * + * @param s + * @return + */ + static String fromXMLString(String s) { + StringBuilder sb = new StringBuilder(); + for (int idx = 0; idx < s.length();) { + char ch = s.charAt(idx++); + if (ch == '%') { + char ch1 = s.charAt(idx++); + char ch2 = s.charAt(idx++); + char res = (char)(h2c(ch1)*16 + h2c(ch2)); + sb.append(res); + } else { + sb.append(ch); + } + } + + return sb.toString(); + } + + /** + * + * @param s + * @return + */ + static String toCSVString(String s) { + if (s == null) + return ""; + + StringBuilder sb = new StringBuilder(s.length()+1); + sb.append('\''); + int len = s.length(); + for (int i = 0; i < len; i++) { + char c = s.charAt(i); + switch(c) { + case '\0': + sb.append("%00"); + break; + case '\n': + sb.append("%0A"); + break; + case '\r': + sb.append("%0D"); + break; + case ',': + sb.append("%2C"); + break; + case '}': + sb.append("%7D"); + break; + case '%': + sb.append("%25"); + break; + default: + sb.append(c); + } + } + return sb.toString(); + } + + /** + * + * @param s + * @throws java.io.IOException + * @return + */ + static String fromCSVString(String s) throws IOException { + if (s.charAt(0) != '\'') { + throw new IOException("Error deserializing string."); + } + int len = s.length(); + StringBuilder sb = new StringBuilder(len-1); + for (int i = 1; i < len; i++) { + char c = s.charAt(i); + if (c == '%') { + char ch1 = s.charAt(i+1); + char ch2 = s.charAt(i+2); + i += 2; + if (ch1 == '0' && ch2 == '0') { sb.append('\0'); } + else if (ch1 == '0' && ch2 == 'A') { sb.append('\n'); } + else if (ch1 == '0' && ch2 == 'D') { sb.append('\r'); } + else if (ch1 == '2' && ch2 == 'C') { sb.append(','); } + else if (ch1 == '7' && ch2 == 'D') { sb.append('}'); } + else if (ch1 == '2' && ch2 == '5') { sb.append('%'); } + else {throw new IOException("Error deserializing string.");} + } else { + sb.append(c); + } + } + return sb.toString(); + } + + /** + * + * @param s + * @return + */ + static String toXMLBuffer(byte barr[]) { + if (barr == null || barr.length == 0) { + return ""; + } + StringBuilder sb = new StringBuilder(2*barr.length); + for (int idx = 0; idx < barr.length; idx++) { + sb.append(Integer.toHexString(barr[idx])); + } + return sb.toString(); + } + + /** + * + * @param s + * @throws java.io.IOException + * @return + */ + static byte[] fromXMLBuffer(String s) + throws IOException { + ByteArrayOutputStream stream = new ByteArrayOutputStream(); + if (s.length() == 0) { return stream.toByteArray(); } + int blen = s.length()/2; + byte[] barr = new byte[blen]; + for (int idx = 0; idx < blen; idx++) { + char c1 = s.charAt(2*idx); + char c2 = s.charAt(2*idx+1); + barr[idx] = Byte.parseByte(""+c1+c2, 16); + } + stream.write(barr); + return stream.toByteArray(); + } + + /** + * + * @param buf + * @return + */ + static String toCSVBuffer(byte barr[]) { + if (barr == null || barr.length == 0) { + return ""; + } + StringBuilder sb = new StringBuilder(barr.length + 1); + sb.append('#'); + for(int idx = 0; idx < barr.length; idx++) { + sb.append(Integer.toHexString(barr[idx])); + } + return sb.toString(); + } + + /** + * Converts a CSV-serialized representation of buffer to a new + * ByteArrayOutputStream. + * @param s CSV-serialized representation of buffer + * @throws java.io.IOException + * @return Deserialized ByteArrayOutputStream + */ + static byte[] fromCSVBuffer(String s) + throws IOException { + if (s.charAt(0) != '#') { + throw new IOException("Error deserializing buffer."); + } + ByteArrayOutputStream stream = new ByteArrayOutputStream(); + if (s.length() == 1) { return stream.toByteArray(); } + int blen = (s.length()-1)/2; + byte[] barr = new byte[blen]; + for (int idx = 0; idx < blen; idx++) { + char c1 = s.charAt(2*idx+1); + char c2 = s.charAt(2*idx+2); + barr[idx] = Byte.parseByte(""+c1+c2, 16); + } + stream.write(barr); + return stream.toByteArray(); + } + public static int compareBytes(byte b1[], int off1, int len1, byte b2[], int off2, int len2) { + int i; + for(i=0; i < len1 && i < len2; i++) { + if (b1[off1+i] != b2[off2+i]) { + return b1[off1+i] < b2[off2+1] ? -1 : 1; + } + } + if (len1 != len2) { + return len1 < len2 ? -1 : 1; + } + return 0; + } +} diff --git a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/jute/XmlInputArchive.java b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/jute/XmlInputArchive.java new file mode 100644 index 000000000..99e11d10e --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/jute/XmlInputArchive.java @@ -0,0 +1,251 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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. + */ + +package org.apache.jute; + +import java.io.IOException; +import java.io.InputStream; +import java.util.ArrayList; + +import javax.xml.parsers.ParserConfigurationException; +import javax.xml.parsers.SAXParser; +import javax.xml.parsers.SAXParserFactory; + +import org.xml.sax.Attributes; +import org.xml.sax.SAXException; +import org.xml.sax.helpers.DefaultHandler; +/** + * + */ +class XmlInputArchive implements InputArchive { + + static private class Value { + private String type; + private StringBuffer sb; + + public Value(String t) { + type = t; + sb = new StringBuffer(); + } + public void addChars(char[] buf, int offset, int len) { + sb.append(buf, offset, len); + } + public String getValue() { return sb.toString(); } + public String getType() { return type; } + } + + private static class XMLParser extends DefaultHandler { + private boolean charsValid = false; + + private ArrayList valList; + + private XMLParser(ArrayList vlist) { + valList = vlist; + } + + public void startDocument() throws SAXException {} + + public void endDocument() throws SAXException {} + + public void startElement(String ns, + String sname, + String qname, + Attributes attrs) throws SAXException { + charsValid = false; + if ("boolean".equals(qname) || + "i4".equals(qname) || + "int".equals(qname) || + "string".equals(qname) || + "double".equals(qname) || + "ex:i1".equals(qname) || + "ex:i8".equals(qname) || + "ex:float".equals(qname)) { + charsValid = true; + valList.add(new Value(qname)); + } else if ("struct".equals(qname) || + "array".equals(qname)) { + valList.add(new Value(qname)); + } + } + + public void endElement(String ns, + String sname, + String qname) throws SAXException { + charsValid = false; + if ("struct".equals(qname) || + "array".equals(qname)) { + valList.add(new Value("/"+qname)); + } + } + + public void characters(char buf[], int offset, int len) + throws SAXException { + if (charsValid) { + Value v = valList.get(valList.size()-1); + v.addChars(buf, offset,len); + } + } + + } + + private class XmlIndex implements Index { + public boolean done() { + Value v = valList.get(vIdx); + if ("/array".equals(v.getType())) { + valList.set(vIdx, null); + vIdx++; + return true; + } else { + return false; + } + } + public void incr() {} + } + + private ArrayList valList; + private int vLen; + private int vIdx; + + private Value next() throws IOException { + if (vIdx < vLen) { + Value v = valList.get(vIdx); + valList.set(vIdx, null); + vIdx++; + return v; + } else { + throw new IOException("Error in deserialization."); + } + } + + static XmlInputArchive getArchive(InputStream strm) + throws ParserConfigurationException, SAXException, IOException { + return new XmlInputArchive(strm); + } + + /** Creates a new instance of BinaryInputArchive */ + public XmlInputArchive(InputStream in) + throws ParserConfigurationException, SAXException, IOException { + valList = new ArrayList(); + DefaultHandler handler = new XMLParser(valList); + SAXParserFactory factory = SAXParserFactory.newInstance(); + SAXParser parser = factory.newSAXParser(); + parser.parse(in, handler); + vLen = valList.size(); + vIdx = 0; + } + + public byte readByte(String tag) throws IOException { + Value v = next(); + if (!"ex:i1".equals(v.getType())) { + throw new IOException("Error deserializing "+tag+"."); + } + return Byte.parseByte(v.getValue()); + } + + public boolean readBool(String tag) throws IOException { + Value v = next(); + if (!"boolean".equals(v.getType())) { + throw new IOException("Error deserializing "+tag+"."); + } + return "1".equals(v.getValue()); + } + + public int readInt(String tag) throws IOException { + Value v = next(); + if (!"i4".equals(v.getType()) && + !"int".equals(v.getType())) { + throw new IOException("Error deserializing "+tag+"."); + } + return Integer.parseInt(v.getValue()); + } + + public long readLong(String tag) throws IOException { + Value v = next(); + if (!"ex:i8".equals(v.getType())) { + throw new IOException("Error deserializing "+tag+"."); + } + return Long.parseLong(v.getValue()); + } + + public float readFloat(String tag) throws IOException { + Value v = next(); + if (!"ex:float".equals(v.getType())) { + throw new IOException("Error deserializing "+tag+"."); + } + return Float.parseFloat(v.getValue()); + } + + public double readDouble(String tag) throws IOException { + Value v = next(); + if (!"double".equals(v.getType())) { + throw new IOException("Error deserializing "+tag+"."); + } + return Double.parseDouble(v.getValue()); + } + + public String readString(String tag) throws IOException { + Value v = next(); + if (!"string".equals(v.getType())) { + throw new IOException("Error deserializing "+tag+"."); + } + return Utils.fromXMLString(v.getValue()); + } + + public byte[] readBuffer(String tag) throws IOException { + Value v = next(); + if (!"string".equals(v.getType())) { + throw new IOException("Error deserializing "+tag+"."); + } + return Utils.fromXMLBuffer(v.getValue()); + } + + public void readRecord(Record r, String tag) throws IOException { + r.deserialize(this, tag); + } + + public void startRecord(String tag) throws IOException { + Value v = next(); + if (!"struct".equals(v.getType())) { + throw new IOException("Error deserializing "+tag+"."); + } + } + + public void endRecord(String tag) throws IOException { + Value v = next(); + if (!"/struct".equals(v.getType())) { + throw new IOException("Error deserializing "+tag+"."); + } + } + + public Index startVector(String tag) throws IOException { + Value v = next(); + if (!"array".equals(v.getType())) { + throw new IOException("Error deserializing "+tag+"."); + } + return new XmlIndex(); + } + + public void endVector(String tag) throws IOException {} + + public Index startMap(String tag) throws IOException { + return startVector(tag); + } + + public void endMap(String tag) throws IOException { endVector(tag); } + +} diff --git a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/jute/XmlOutputArchive.java b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/jute/XmlOutputArchive.java new file mode 100644 index 000000000..b65e9a000 --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/jute/XmlOutputArchive.java @@ -0,0 +1,251 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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. + */ + +package org.apache.jute; + +import java.io.IOException; +import java.io.OutputStream; +import java.io.PrintStream; +import java.util.List; +import java.util.Stack; +import java.util.TreeMap; + +/** + * + */ +class XmlOutputArchive implements OutputArchive { + + private PrintStream stream; + + private int indent = 0; + + private Stack compoundStack; + + private void putIndent() { + StringBuilder sb = new StringBuilder(""); + for (int idx = 0; idx < indent; idx++) { + sb.append(" "); + } + stream.print(sb.toString()); + } + + private void addIndent() { + indent++; + } + + private void closeIndent() { + indent--; + } + + private void printBeginEnvelope(String tag) { + if (!compoundStack.empty()) { + String s = compoundStack.peek(); + if ("struct".equals(s)) { + putIndent(); + stream.print("\n"); + addIndent(); + putIndent(); + stream.print(""+tag+"\n"); + putIndent(); + stream.print(""); + } else if ("vector".equals(s)) { + stream.print(""); + } else if ("map".equals(s)) { + stream.print(""); + } + } else { + stream.print(""); + } + } + + private void printEndEnvelope(String tag) { + if (!compoundStack.empty()) { + String s = compoundStack.peek(); + if ("struct".equals(s)) { + stream.print("\n"); + closeIndent(); + putIndent(); + stream.print("\n"); + } else if ("vector".equals(s)) { + stream.print("\n"); + } else if ("map".equals(s)) { + stream.print("\n"); + } + } else { + stream.print("\n"); + } + } + + private void insideVector(String tag) { + printBeginEnvelope(tag); + compoundStack.push("vector"); + } + + private void outsideVector(String tag) throws IOException { + String s = compoundStack.pop(); + if (!"vector".equals(s)) { + throw new IOException("Error serializing vector."); + } + printEndEnvelope(tag); + } + + private void insideMap(String tag) { + printBeginEnvelope(tag); + compoundStack.push("map"); + } + + private void outsideMap(String tag) throws IOException { + String s = compoundStack.pop(); + if (!"map".equals(s)) { + throw new IOException("Error serializing map."); + } + printEndEnvelope(tag); + } + + private void insideRecord(String tag) { + printBeginEnvelope(tag); + compoundStack.push("struct"); + } + + private void outsideRecord(String tag) throws IOException { + String s = compoundStack.pop(); + if (!"struct".equals(s)) { + throw new IOException("Error serializing record."); + } + printEndEnvelope(tag); + } + + static XmlOutputArchive getArchive(OutputStream strm) { + return new XmlOutputArchive(strm); + } + + /** Creates a new instance of XmlOutputArchive */ + public XmlOutputArchive(OutputStream out) { + stream = new PrintStream(out); + compoundStack = new Stack(); + } + + public void writeByte(byte b, String tag) throws IOException { + printBeginEnvelope(tag); + stream.print(""); + stream.print(Byte.toString(b)); + stream.print(""); + printEndEnvelope(tag); + } + + public void writeBool(boolean b, String tag) throws IOException { + printBeginEnvelope(tag); + stream.print(""); + stream.print(b ? "1" : "0"); + stream.print(""); + printEndEnvelope(tag); + } + + public void writeInt(int i, String tag) throws IOException { + printBeginEnvelope(tag); + stream.print(""); + stream.print(Integer.toString(i)); + stream.print(""); + printEndEnvelope(tag); + } + + public void writeLong(long l, String tag) throws IOException { + printBeginEnvelope(tag); + stream.print(""); + stream.print(Long.toString(l)); + stream.print(""); + printEndEnvelope(tag); + } + + public void writeFloat(float f, String tag) throws IOException { + printBeginEnvelope(tag); + stream.print(""); + stream.print(Float.toString(f)); + stream.print(""); + printEndEnvelope(tag); + } + + public void writeDouble(double d, String tag) throws IOException { + printBeginEnvelope(tag); + stream.print(""); + stream.print(Double.toString(d)); + stream.print(""); + printEndEnvelope(tag); + } + + public void writeString(String s, String tag) throws IOException { + printBeginEnvelope(tag); + stream.print(""); + stream.print(Utils.toXMLString(s)); + stream.print(""); + printEndEnvelope(tag); + } + + public void writeBuffer(byte buf[], String tag) + throws IOException { + printBeginEnvelope(tag); + stream.print(""); + stream.print(Utils.toXMLBuffer(buf)); + stream.print(""); + printEndEnvelope(tag); + } + + public void writeRecord(Record r, String tag) throws IOException { + r.serialize(this, tag); + } + + public void startRecord(Record r, String tag) throws IOException { + insideRecord(tag); + stream.print("\n"); + addIndent(); + } + + public void endRecord(Record r, String tag) throws IOException { + closeIndent(); + putIndent(); + stream.print(""); + outsideRecord(tag); + } + + public void startVector(List v, String tag) throws IOException { + insideVector(tag); + stream.print("\n"); + addIndent(); + } + + public void endVector(List v, String tag) throws IOException { + closeIndent(); + putIndent(); + stream.print(""); + outsideVector(tag); + } + + public void startMap(TreeMap v, String tag) throws IOException { + insideMap(tag); + stream.print("\n"); + addIndent(); + } + + public void endMap(TreeMap v, String tag) throws IOException { + closeIndent(); + putIndent(); + stream.print(""); + outsideMap(tag); + } + +} diff --git a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/jute/compiler/CGenerator.java b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/jute/compiler/CGenerator.java new file mode 100644 index 000000000..4bfdcadc9 --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/jute/compiler/CGenerator.java @@ -0,0 +1,130 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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. + */ + +package org.apache.jute.compiler; + +import java.util.ArrayList; +import java.io.File; +import java.io.FileWriter; +import java.io.IOException; +import java.util.Iterator; + +/** + * C++ Code generator front-end for Hadoop record I/O. + */ +class CGenerator { + private String mName; + private ArrayList mInclFiles; + private ArrayList mRecList; + private final File outputDirectory; + + /** Creates a new instance of CppGenerator + * + * @param name possibly full pathname to the file + * @param ilist included files (as JFile) + * @param rlist List of records defined within this file + * @param outputDirectory + */ + CGenerator(String name, ArrayList ilist, ArrayList rlist, + File outputDirectory) + { + this.outputDirectory = outputDirectory; + mName = (new File(name)).getName(); + mInclFiles = ilist; + mRecList = rlist; + } + + /** + * Generate C++ code. This method only creates the requested file(s) + * and spits-out file-level elements (such as include statements etc.) + * record-level code is generated by JRecord. + */ + void genCode() throws IOException { + if (!outputDirectory.exists()) { + if (!outputDirectory.mkdirs()) { + throw new IOException("unable to create output directory " + + outputDirectory); + } + } + FileWriter c = new FileWriter(new File(outputDirectory, mName+".c")); + FileWriter h = new FileWriter(new File(outputDirectory, mName+".h")); + + h.write("/**\n"); + h.write("* Licensed to the Apache Software Foundation (ASF) under one\n"); + h.write("* or more contributor license agreements. See the NOTICE file\n"); + h.write("* distributed with this work for additional information\n"); + h.write("* regarding copyright ownership. The ASF licenses this file\n"); + h.write("* to you under the Apache License, Version 2.0 (the\n"); + h.write("* \"License\"); you may not use this file except in compliance\n"); + h.write("* with the License. You may obtain a copy of the License at\n"); + h.write("*\n"); + h.write("* http://www.apache.org/licenses/LICENSE-2.0\n"); + h.write("*\n"); + h.write("* Unless required by applicable law or agreed to in writing, software\n"); + h.write("* distributed under the License is distributed on an \"AS IS\" BASIS,\n"); + h.write("* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n"); + h.write("* See the License for the specific language governing permissions and\n"); + h.write("* limitations under the License.\n"); + h.write("*/\n"); + h.write("\n"); + + c.write("/**\n"); + c.write("* Licensed to the Apache Software Foundation (ASF) under one\n"); + c.write("* or more contributor license agreements. See the NOTICE file\n"); + c.write("* distributed with this work for additional information\n"); + c.write("* regarding copyright ownership. The ASF licenses this file\n"); + c.write("* to you under the Apache License, Version 2.0 (the\n"); + c.write("* \"License\"); you may not use this file except in compliance\n"); + c.write("* with the License. You may obtain a copy of the License at\n"); + c.write("*\n"); + c.write("* http://www.apache.org/licenses/LICENSE-2.0\n"); + c.write("*\n"); + c.write("* Unless required by applicable law or agreed to in writing, software\n"); + c.write("* distributed under the License is distributed on an \"AS IS\" BASIS,\n"); + c.write("* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n"); + c.write("* See the License for the specific language governing permissions and\n"); + c.write("* limitations under the License.\n"); + c.write("*/\n"); + c.write("\n"); + + h.write("#ifndef __"+mName.toUpperCase().replace('.','_')+"__\n"); + h.write("#define __"+mName.toUpperCase().replace('.','_')+"__\n"); + + h.write("#include \"recordio.h\"\n"); + for (Iterator i = mInclFiles.iterator(); i.hasNext();) { + JFile f = i.next(); + h.write("#include \""+f.getName()+".h\"\n"); + } + // required for compilation from C++ + h.write("\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n"); + + c.write("#include \n"); // need it for calloc() & free() + c.write("#include \""+mName+".h\"\n\n"); + + for (Iterator i = mRecList.iterator(); i.hasNext();) { + JRecord jr = i.next(); + jr.genCCode(h, c); + } + + h.write("\n#ifdef __cplusplus\n}\n#endif\n\n"); + h.write("#endif //"+mName.toUpperCase().replace('.','_')+"__\n"); + + h.close(); + c.close(); + } +} diff --git a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/jute/compiler/CSharpGenerator.java b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/jute/compiler/CSharpGenerator.java new file mode 100644 index 000000000..c28751d00 --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/jute/compiler/CSharpGenerator.java @@ -0,0 +1,53 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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. + */ + +package org.apache.jute.compiler; + +import java.io.File; +import java.io.IOException; +import java.util.ArrayList; + +public class CSharpGenerator { + private ArrayList mRecList; + private final File outputDirectory; + + /** Creates a new instance of CSharpGenerator + * + * @param name possibly full pathname to the file + * @param ilist included files (as JFile) + * @param rlist List of records defined within this file + * @param outputDirectory + */ + CSharpGenerator(String name, ArrayList ilist, ArrayList rlist, + File outputDirectory) + { + this.outputDirectory = outputDirectory; + mRecList = rlist; + } + + /** + * Generate C# code. This method only creates the requested file(s) + * and spits-out file-level elements (such as include statements etc.) + * record-level code is generated by JRecord. + */ + void genCode() throws IOException { + for (JRecord rec : mRecList) { + rec.genCsharpCode(outputDirectory); + } + } +} diff --git a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/jute/compiler/CppGenerator.java b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/jute/compiler/CppGenerator.java new file mode 100644 index 000000000..16d44ce0e --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/jute/compiler/CppGenerator.java @@ -0,0 +1,125 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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. + */ + +package org.apache.jute.compiler; + +import java.util.ArrayList; +import java.io.File; +import java.io.FileWriter; +import java.io.IOException; +import java.util.Iterator; + +/** + * C++ Code generator front-end for Hadoop record I/O. + */ +class CppGenerator { + private String mName; + private ArrayList mInclFiles; + private ArrayList mRecList; + private final File outputDirectory; + + /** Creates a new instance of CppGenerator + * + * @param name possibly full pathname to the file + * @param ilist included files (as JFile) + * @param rlist List of records defined within this file + * @param outputDirectory + */ + CppGenerator(String name, ArrayList ilist, ArrayList rlist, + File outputDirectory) + { + this.outputDirectory = outputDirectory; + mName = (new File(name)).getName(); + mInclFiles = ilist; + mRecList = rlist; + } + + /** + * Generate C++ code. This method only creates the requested file(s) + * and spits-out file-level elements (such as include statements etc.) + * record-level code is generated by JRecord. + */ + void genCode() throws IOException { + if (!outputDirectory.exists()) { + if (!outputDirectory.mkdirs()) { + throw new IOException("unable to create output directory " + + outputDirectory); + } + } + FileWriter cc = new FileWriter(new File(outputDirectory, mName+".cc")); + FileWriter hh = new FileWriter(new File(outputDirectory, mName+".hh")); + + hh.write("/**\n"); + hh.write("* Licensed to the Apache Software Foundation (ASF) under one\n"); + hh.write("* or more contributor license agreements. See the NOTICE file\n"); + hh.write("* distributed with this work for additional information\n"); + hh.write("* regarding copyright ownership. The ASF licenses this file\n"); + hh.write("* to you under the Apache License, Version 2.0 (the\n"); + hh.write("* \"License\"); you may not use this file except in compliance\n"); + hh.write("* with the License. You may obtain a copy of the License at\n"); + hh.write("*\n"); + hh.write("* http://www.apache.org/licenses/LICENSE-2.0\n"); + hh.write("*\n"); + hh.write("* Unless required by applicable law or agreed to in writing, software\n"); + hh.write("* distributed under the License is distributed on an \"AS IS\" BASIS,\n"); + hh.write("* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n"); + hh.write("* See the License for the specific language governing permissions and\n"); + hh.write("* limitations under the License.\n"); + hh.write("*/\n"); + hh.write("\n"); + + cc.write("/**\n"); + cc.write("* Licensed to the Apache Software Foundation (ASF) under one\n"); + cc.write("* or more contributor license agreements. See the NOTICE file\n"); + cc.write("* distributed with this work for additional information\n"); + cc.write("* regarding copyright ownership. The ASF licenses this file\n"); + cc.write("* to you under the Apache License, Version 2.0 (the\n"); + cc.write("* \"License\"); you may not use this file except in compliance\n"); + cc.write("* with the License. You may obtain a copy of the License at\n"); + cc.write("*\n"); + cc.write("* http://www.apache.org/licenses/LICENSE-2.0\n"); + cc.write("*\n"); + cc.write("* Unless required by applicable law or agreed to in writing, software\n"); + cc.write("* distributed under the License is distributed on an \"AS IS\" BASIS,\n"); + cc.write("* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n"); + cc.write("* See the License for the specific language governing permissions and\n"); + cc.write("* limitations under the License.\n"); + cc.write("*/\n"); + cc.write("\n"); + + hh.write("#ifndef __"+mName.toUpperCase().replace('.','_')+"__\n"); + hh.write("#define __"+mName.toUpperCase().replace('.','_')+"__\n"); + + hh.write("#include \"recordio.hh\"\n"); + for (Iterator i = mInclFiles.iterator(); i.hasNext();) { + JFile f = i.next(); + hh.write("#include \""+f.getName()+".hh\"\n"); + } + cc.write("#include \""+mName+".hh\"\n"); + + for (Iterator i = mRecList.iterator(); i.hasNext();) { + JRecord jr = i.next(); + jr.genCppCode(hh, cc); + } + + hh.write("#endif //"+mName.toUpperCase().replace('.','_')+"__\n"); + + hh.close(); + cc.close(); + } +} diff --git a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/jute/compiler/JBoolean.java b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/jute/compiler/JBoolean.java new file mode 100644 index 000000000..b45b161e3 --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/jute/compiler/JBoolean.java @@ -0,0 +1,50 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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. + */ + +package org.apache.jute.compiler; + +/** + * + */ +public class JBoolean extends JType { + + /** Creates a new instance of JBoolean */ + public JBoolean() { + super("int32_t", "bool", "bool", "boolean", "Bool", "Boolean", "bool", "toBoolean"); + } + + public String getSignature() { + return "z"; + } + + public String genJavaCompareTo(String fname) { + return " ret = ("+fname+" == peer."+fname+")? 0 : ("+fname+"?1:-1);\n"; + } + + public String genJavaHashCode(String fname) { + return " ret = ("+fname+")?0:1;\n"; + } + + String genCsharpHashCode(String fname) { + return " ret = ("+capitalize(fname)+")?0:1;\n"; + } + + String genCsharpCompareTo(String name) { + return " ret = ("+capitalize(name)+" == peer."+capitalize(name)+")? 0 : ("+capitalize(name)+"?1:-1);\n"; + } +} diff --git a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/jute/compiler/JBuffer.java b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/jute/compiler/JBuffer.java new file mode 100644 index 000000000..b2be5bd06 --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/jute/compiler/JBuffer.java @@ -0,0 +1,106 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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. + */ + +package org.apache.jute.compiler; + +/** + * + */ +public class JBuffer extends JCompType { + + /** Creates a new instance of JBuffer */ + public JBuffer() { + super("struct buffer", " ::std::string", "byte[]", "byte[]", "Buffer", "byte[]", "byte[]"); + } + + public String genCppGetSet(String fname, int fIdx) { + String cgetFunc = " virtual const "+getCppType()+"& get"+fname+"() const {\n"; + cgetFunc += " return m"+fname+";\n"; + cgetFunc += " }\n"; + String getFunc = " virtual "+getCppType()+"& get"+fname+"() {\n"; + getFunc += " bs_.set("+fIdx+");return m"+fname+";\n"; + getFunc += " }\n"; + return cgetFunc + getFunc; + } + + public String getSignature() { + return "B"; + } + + public String genJavaReadWrapper(String fname, String tag, boolean decl) { + String ret = ""; + if (decl) { + ret = " byte[] "+fname+";\n"; + } + return ret + " "+fname+"=a_.readBuffer(\""+tag+"\");\n"; + } + + public String genJavaWriteWrapper(String fname, String tag) { + return " a_.writeBuffer("+fname+",\""+tag+"\");\n"; + } + + public String genJavaCompareTo(String fname, String other) { + StringBuilder sb = new StringBuilder(); + sb.append(" {\n"); + sb.append(" byte[] my = "+fname+";\n"); + sb.append(" byte[] ur = "+other+";\n"); + sb.append(" ret = org.apache.jute.Utils.compareBytes(my,0,my.length,ur,0,ur.length);\n"); + sb.append(" }\n"); + return sb.toString(); + } + + public String genJavaCompareTo(String fname) { + return genJavaCompareTo(fname, "peer."+fname); + } + public String genJavaCompareToWrapper(String fname, String other) { + return " "+genJavaCompareTo(fname, other); + } + + public String genJavaEquals(String fname, String peer) { + return " ret = org.apache.jute.Utils.bufEquals("+fname+","+peer+");\n"; + } + + public String genJavaHashCode(String fname) { + return " ret = java.util.Arrays.toString("+fname+").hashCode();\n"; + } + + public String genJavaSlurpBytes(String b, String s, String l) { + StringBuilder sb = new StringBuilder(); + sb.append(" {\n"); + sb.append(" int i = org.apache.jute.Utils.readVInt("+b+", "+s+");\n"); + sb.append(" int z = WritableUtils.getVIntSize(i);\n"); + sb.append(" "+s+" += z+i; "+l+" -= (z+i);\n"); + sb.append(" }\n"); + return sb.toString(); + } + + public String genJavaCompareBytes() { + StringBuilder sb = new StringBuilder(); + sb.append(" {\n"); + sb.append(" int i1 = org.apache.jute.Utils.readVInt(b1, s1);\n"); + sb.append(" int i2 = org.apache.jute.Utils.readVInt(b2, s2);\n"); + sb.append(" int z1 = WritableUtils.getVIntSize(i1);\n"); + sb.append(" int z2 = WritableUtils.getVIntSize(i2);\n"); + sb.append(" s1+=z1; s2+=z2; l1-=z1; l2-=z2;\n"); + sb.append(" int r1 = org.apache.jute.Utils.compareBytes(b1,s1,l1,b2,s2,l2);\n"); + sb.append(" if (r1 != 0) { return (r1<0)?-1:0; }\n"); + sb.append(" s1+=i1; s2+=i2; l1-=i1; l1-=i2;\n"); + sb.append(" }\n"); + return sb.toString(); + } +} diff --git a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/jute/compiler/JByte.java b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/jute/compiler/JByte.java new file mode 100644 index 000000000..4b1cea459 --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/jute/compiler/JByte.java @@ -0,0 +1,34 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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. + */ + +package org.apache.jute.compiler; + +/** + * + */ +public class JByte extends JType { + + /** Creates a new instance of JByte */ + public JByte() { + super("char", "int8_t", "byte", "byte", "Byte", "Byte", "byte", "toByte"); + } + + public String getSignature() { + return "b"; + } +} diff --git a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/jute/compiler/JCompType.java b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/jute/compiler/JCompType.java new file mode 100644 index 000000000..d98658fcf --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/jute/compiler/JCompType.java @@ -0,0 +1,66 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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. + */ + +package org.apache.jute.compiler; + +/** + * Abstract base class for all the "compound" types such as ustring, + * buffer, vector, map, and record. + */ +abstract class JCompType extends JType { + + /** Creates a new instance of JCompType */ + JCompType(String cType, String cppType, String csharpType, String javaType, String suffix, String wrapper, String csharpWrapper) { + super(cType, cppType, csharpType, javaType, suffix, wrapper, csharpWrapper, null); + } + + String genCppGetSet(String fname, int fIdx) { + String cgetFunc = " virtual const "+getCppType()+"& get"+fname+"() const {\n"; + cgetFunc += " return m"+fname+";\n"; + cgetFunc += " }\n"; + String getFunc = " virtual "+getCppType()+"& get"+fname+"() {\n"; + getFunc += " bs_.set("+fIdx+");return m"+fname+";\n"; + getFunc += " }\n"; + return cgetFunc + getFunc; + } + + String genJavaCompareTo(String fname) { + return " ret = "+fname+".compareTo(peer."+fname+");\n"; + } + + String genJavaEquals(String fname, String peer) { + return " ret = "+fname+".equals("+peer+");\n"; + } + + String genJavaHashCode(String fname) { + return " ret = "+fname+".hashCode();\n"; + } + + String genCsharpHashCode(String fname) { + return " ret = "+capitalize(fname)+".GetHashCode();\n"; + } + + String genCsharpEquals(String name, String peer) { + String[] peerSplit = peer.split("\\."); + return " ret = "+capitalize(name)+".Equals("+peerSplit[0] + "." + capitalize(peerSplit[1]) + ");\n"; + } + + String genCsharpCompareTo(String name) { + return " ret = "+capitalize(name)+".CompareTo(peer."+capitalize(name)+");\n"; + } +} diff --git a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/jute/compiler/JDouble.java b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/jute/compiler/JDouble.java new file mode 100644 index 000000000..21f9cc856 --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/jute/compiler/JDouble.java @@ -0,0 +1,40 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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. + */ + +package org.apache.jute.compiler; + +/** + * + */ +public class JDouble extends JType { + + /** Creates a new instance of JDouble */ + public JDouble() { + super("double", "double", "double", "double", "Double", "Double", "double", "toDouble"); + } + + public String getSignature() { + return "d"; + } + + public String genJavaHashCode(String fname) { + String tmp = "Double.doubleToLongBits("+fname+")"; + return " ret = (int)("+tmp+"^("+tmp+">>>32));\n"; + } + +} diff --git a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/jute/compiler/JField.java b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/jute/compiler/JField.java new file mode 100644 index 000000000..50f9fc9df --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/jute/compiler/JField.java @@ -0,0 +1,140 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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. + */ + +package org.apache.jute.compiler; + +/** + * + */ +public class JField { + private JType mType; + private String mName; + /** + * Creates a new instance of JField + */ + public JField(JType type, String name) { + mType = type; + mName = name; + } + + public String getSignature() { + return mType.getSignature(); + } + + public String genCppDecl() { + return mType.genCppDecl(mName); + } + + public String genCDecl() { + return mType.genCDecl(mName); + } + + public String genCsharpDecl() { + return mType.genCsharpDecl(mName); + } + + public String genCsharpConstructorParam(String fname) { + return mType.genCsharpConstructorParam(fname); + } + + public String genJavaDecl() { + return mType.genJavaDecl(mName); + } + + public String genJavaConstructorParam(String fname) { + return mType.genJavaConstructorParam(fname); + } + + public String getName() { + return mName; + } + + public String getCsharpName() { + return "Id".equals(mName) ? "ZKId" : mName; + } + + public String getTag() { + return mName; + } + + public JType getType() { + return mType; + } + + public String genCppGetSet(int fIdx) { + return mType.genCppGetSet(mName, fIdx); + } + + public String genCsharpConstructorSet(String fname) { + return mType.genCsharpConstructorSet(mName, fname); + } + + public String genCsharpGetSet(int fIdx) { + return mType.genCsharpGetSet(getCsharpName(), fIdx); + } + + public String genCsharpWriteMethodName() { + return mType.genCsharpWriteMethod(getCsharpName(), getTag()); + } + + public String genCsharpReadMethodName() { + return mType.genCsharpReadMethod(getCsharpName(), getTag()); + } + + public String genCsharpCompareTo() { + return mType.genCsharpCompareTo(getCsharpName()); + } + + public String genCsharpEquals() { + return mType.genCsharpEquals(getCsharpName(), "peer."+getCsharpName()); + } + + public String genCsharpHashCode() { + return mType.genCsharpHashCode(getCsharpName()); + } + + + public String genJavaGetSet(int fIdx) { + return mType.genJavaGetSet(mName, fIdx); + } + + public String genJavaWriteMethodName() { + return mType.genJavaWriteMethod(getName(), getTag()); + } + + public String genJavaReadMethodName() { + return mType.genJavaReadMethod(getName(), getTag()); + } + + public String genJavaCompareTo() { + return mType.genJavaCompareTo(getName()); + } + + public String genJavaEquals() { + return mType.genJavaEquals(getName(), "peer."+getName()); + } + + public String genJavaHashCode() { + return mType.genJavaHashCode(getName()); + } + + public String genJavaConstructorSet(String fname) { + return mType.genJavaConstructorSet(mName, fname); + } + +} diff --git a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/jute/compiler/JFile.java b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/jute/compiler/JFile.java new file mode 100644 index 000000000..e5b0ba361 --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/jute/compiler/JFile.java @@ -0,0 +1,84 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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. + */ + +package org.apache.jute.compiler; + +import java.io.File; +import java.io.IOException; +import java.util.ArrayList; + +/** + * Container for the Hadoop Record DDL. + * The main components of the file are filename, list of included files, + * and records defined in that file. + * + */ +public class JFile { + + private String mName; + private ArrayList mInclFiles; + private ArrayList mRecords; + + /** Creates a new instance of JFile + * + * @param name possibly full pathname to the file + * @param inclFiles included files (as JFile) + * @param recList List of records defined within this file + */ + public JFile(String name, ArrayList inclFiles, + ArrayList recList) + { + mName = name; + mInclFiles = inclFiles; + mRecords = recList; + } + + /** Strip the other pathname components and return the basename */ + String getName() { + int idx = mName.lastIndexOf('/'); + return (idx > 0) ? mName.substring(idx) : mName; + } + + /** Generate record code in given language. Language should be all + * lowercase. + * @param outputDirectory + */ + public void genCode(String language, File outputDirectory) + throws IOException + { + if ("c++".equals(language)) { + CppGenerator gen = new CppGenerator(mName, mInclFiles, mRecords, + outputDirectory); + gen.genCode(); + } else if ("java".equals(language)) { + JavaGenerator gen = new JavaGenerator(mName, mInclFiles, mRecords, + outputDirectory); + gen.genCode(); + } else if ("c".equals(language)) { + CGenerator gen = new CGenerator(mName, mInclFiles, mRecords, + outputDirectory); + gen.genCode(); + } else if ("csharp".equals(language)) { + CSharpGenerator gen = new CSharpGenerator(mName, mInclFiles, mRecords, + outputDirectory); + gen.genCode(); + } else { + throw new IOException("Cannnot recognize language:" + language); + } + } +} diff --git a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/jute/compiler/JFloat.java b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/jute/compiler/JFloat.java new file mode 100644 index 000000000..a4be6ec99 --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/jute/compiler/JFloat.java @@ -0,0 +1,39 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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. + */ + +package org.apache.jute.compiler; + +/** + * + */ +public class JFloat extends JType { + + /** Creates a new instance of JFloat */ + public JFloat() { + super("float", "float", "float", "float", "Float", "Float", "float", "toFloat"); + } + + public String getSignature() { + return "f"; + } + + public String genJavaHashCode(String fname) { + return " ret = Float.floatToIntBits("+fname+");\n"; + } + +} diff --git a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/jute/compiler/JInt.java b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/jute/compiler/JInt.java new file mode 100644 index 000000000..23b902e27 --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/jute/compiler/JInt.java @@ -0,0 +1,34 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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. + */ + +package org.apache.jute.compiler; + +/** + * + */ +public class JInt extends JType { + + /** Creates a new instance of JInt */ + public JInt() { + super("int32_t", "int32_t", "int", "int", "Int", "Integer", "int", "toInt"); + } + + public String getSignature() { + return "i"; + } +} diff --git a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/jute/compiler/JLong.java b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/jute/compiler/JLong.java new file mode 100644 index 000000000..342fd9af5 --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/jute/compiler/JLong.java @@ -0,0 +1,38 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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. + */ + +package org.apache.jute.compiler; + +/** + * + */ +public class JLong extends JType { + + /** Creates a new instance of JLong */ + public JLong() { + super("int64_t", "int64_t", "long", "long", "Long", "Long", "long", "toLong"); + } + + public String getSignature() { + return "l"; + } + + public String genJavaHashCode(String fname) { + return " ret = (int) ("+fname+"^("+fname+">>>32));\n"; + } +} diff --git a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/jute/compiler/JMap.java b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/jute/compiler/JMap.java new file mode 100644 index 000000000..cc503bebf --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/jute/compiler/JMap.java @@ -0,0 +1,149 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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. + */ + +package org.apache.jute.compiler; + +/** + * + */ +public class JMap extends JCompType { + + static private int level = 0; + + static private String getLevel() { return Integer.toString(level); } + + static private void incrLevel() { level++; } + + static private void decrLevel() { level--; } + + static private String getId(String id) { return id+getLevel(); } + + private JType mKey; + private JType mValue; + + /** Creates a new instance of JMap */ + public JMap(JType t1, JType t2) { + super("#error", " ::std::map<"+t1.getCppType()+","+t2.getCppType()+">", + "System.Collections.Generic.SortedDictionary", "java.util.TreeMap", "Map", "System.Collections.Generic.SortedDictionary", "java.util.TreeMap"); + mKey = t1; + mValue = t2; + } + + public String getSignature() { + return "{" + mKey.getSignature() + mValue.getSignature() +"}"; + } + + public String genJavaCompareTo(String fname) { + return " throw new UnsupportedOperationException(\"comparing " + + fname + " is unimplemented\");\n"; + } + + public String genJavaReadWrapper(String fname, String tag, boolean decl) { + StringBuilder ret = new StringBuilder(""); + if (decl) { + ret.append(" java.util.TreeMap "+fname+";\n"); + } + ret.append(" {\n"); + incrLevel(); + ret.append(" org.apache.jute.Index "+getId("midx")+" = a_.startMap(\""+tag+"\");\n"); + ret.append(" "+fname+"=new java.util.TreeMap();\n"); + ret.append(" for (; !"+getId("midx")+".done(); "+getId("midx")+".incr()) {\n"); + ret.append(mKey.genJavaReadWrapper(getId("k"),getId("k"),true)); + ret.append(mValue.genJavaReadWrapper(getId("v"),getId("v"),true)); + ret.append(" "+fname+".put("+getId("k")+","+getId("v")+");\n"); + ret.append(" }\n"); + ret.append(" a_.endMap(\""+tag+"\");\n"); + decrLevel(); + ret.append(" }\n"); + return ret.toString(); + } + + public String genJavaReadMethod(String fname, String tag) { + return genJavaReadWrapper(fname, tag, false); + } + + public String genJavaWriteWrapper(String fname, String tag) { + StringBuilder ret = new StringBuilder(" {\n"); + incrLevel(); + ret.append(" a_.startMap("+fname+",\""+tag+"\");\n"); + ret.append(" java.util.Set "+getId("es")+" = "+fname+".entrySet();\n"); + ret.append(" for(java.util.Iterator "+getId("midx")+" = "+getId("es")+".iterator(); "+getId("midx")+".hasNext(); ) {\n"); + ret.append(" java.util.Map.Entry "+getId("me")+" = (java.util.Map.Entry) "+getId("midx")+".next();\n"); + ret.append(" "+mKey.getJavaWrapperType()+" "+getId("k")+" = ("+mKey.getJavaWrapperType()+") "+getId("me")+".getKey();\n"); + ret.append(" "+mValue.getJavaWrapperType()+" "+getId("v")+" = ("+mValue.getJavaWrapperType()+") "+getId("me")+".getValue();\n"); + ret.append(mKey.genJavaWriteWrapper(getId("k"),getId("k"))); + ret.append(mValue.genJavaWriteWrapper(getId("v"),getId("v"))); + ret.append(" }\n"); + ret.append(" a_.endMap("+fname+",\""+tag+"\");\n"); + ret.append(" }\n"); + decrLevel(); + return ret.toString(); + } + + public String genJavaWriteMethod(String fname, String tag) { + return genJavaWriteWrapper(fname, tag); + } + + public String genCsharpWriteWrapper(String fname, int tag) { + StringBuilder ret = new StringBuilder(" {\n"); + incrLevel(); + ret.append(" a_.StartMap("+fname+",\""+tag+"\");\n"); + ret.append(" java.util.Set "+getId("es")+" = "+fname+".entrySet();\n"); + ret.append(" for(java.util.Iterator "+getId("midx")+" = "+getId("es")+".iterator(); "+getId("midx")+".hasNext(); ) {\n"); + ret.append(" java.util.Map.Entry "+getId("me")+" = (java.util.Map.Entry) "+getId("midx")+".next();\n"); + ret.append(" "+mKey.getCsharpWrapperType()+" "+getId("k")+" = ("+mKey.getCsharpWrapperType()+") "+getId("me")+".getKey();\n"); + ret.append(" "+mValue.getCsharpWrapperType()+" "+getId("v")+" = ("+mValue.getCsharpWrapperType()+") "+getId("me")+".getValue();\n"); + ret.append(mKey.genCsharpWriteWrapper(getId("k"),getId("k"))); + ret.append(mValue.genCsharpWriteWrapper(getId("v"),getId("v"))); + ret.append(" }\n"); + ret.append(" a_.EndMap("+fname+",\""+tag+"\");\n"); + ret.append(" }\n"); + decrLevel(); + return ret.toString(); + } + + String genCsharpWriteMethod(String fname, int tag) { + return genCsharpWriteWrapper(fname, tag); + } + + public String genCsharpReadWrapper(String fname, int tag, boolean decl) { + StringBuilder ret = new StringBuilder(""); + if (decl) { + ret.append(" System.Collections.SortedDictionary "+capitalize(fname)+";\n"); + } + ret.append(" {\n"); + incrLevel(); + ret.append(" Org.Apache.Jute.IIndex "+getId("midx")+" = a_.StartMap(\""+tag+"\");\n"); + ret.append(" "+fname+"= new System.Collections.SortedDictionary();\n"); + ret.append(" for (; !"+getId("midx")+".done(); "+getId("midx")+".incr()) {\n"); + ret.append(mKey.genCsharpReadWrapper(getId("k"),getId("k"),true)); + ret.append(mValue.genCsharpReadWrapper(getId("v"),getId("v"),true)); + ret.append(" "+fname+".Add("+getId("k")+","+getId("v")+");\n"); + ret.append(" }\n"); + ret.append(" a_.EndMap(\""+tag+"\");\n"); + decrLevel(); + ret.append(" }\n"); + return ret.toString(); + } + + + + String genCsharpReadMethod(String fname, int tag) { + return genCsharpReadWrapper(fname, tag, false); + } +} diff --git a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/jute/compiler/JRecord.java b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/jute/compiler/JRecord.java new file mode 100644 index 000000000..01ba2989a --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/jute/compiler/JRecord.java @@ -0,0 +1,761 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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. + */ + +package org.apache.jute.compiler; + +import java.io.File; +import java.io.FileWriter; +import java.io.IOException; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.Iterator; + +/** + * + */ +public class JRecord extends JCompType { + + private String mFQName; + private String mName; + private String mModule; + private ArrayList mFields; + + /** + * Creates a new instance of JRecord + */ + public JRecord(String name, ArrayList flist) { + super("struct " + name.substring(name.lastIndexOf('.')+1), + name.replaceAll("\\.","::"), getCsharpFQName(name), name, "Record", name, getCsharpFQName("IRecord")); + mFQName = name; + int idx = name.lastIndexOf('.'); + mName = name.substring(idx+1); + mModule = name.substring(0, idx); + mFields = flist; + } + + public String getName() { + return mName; + } + + public String getCsharpName() { + return "Id".equals(mName) ? "ZKId" : mName; + } + + public String getJavaFQName() { + return mFQName; + } + + public String getCppFQName() { + return mFQName.replaceAll("\\.", "::"); + } + + public String getJavaPackage() { + return mModule; + } + + public String getCppNameSpace() { + return mModule.replaceAll("\\.", "::"); + } + + public String getCsharpNameSpace() { + String[] parts = mModule.split("\\."); + StringBuffer namespace = new StringBuffer(); + for (int i = 0; i < parts.length; i++) { + String capitalized = parts[i].substring(0, 1).toUpperCase() + parts[i].substring(1).toLowerCase(); + namespace.append(capitalized); + if (i != parts.length - 1) namespace.append("."); + } + return namespace.toString(); + } + + public ArrayList getFields() { + return mFields; + } + + public String getSignature() { + StringBuilder sb = new StringBuilder(); + sb.append("L").append(mName).append("("); + for (Iterator i = mFields.iterator(); i.hasNext();) { + String s = i.next().getSignature(); + sb.append(s); + } + sb.append(")"); + return sb.toString(); + } + + public String genCppDecl(String fname) { + return " "+ getCppNameSpace() + "::" + mName+" m"+fname+";\n"; + } + + public String genJavaReadMethod(String fname, String tag) { + return genJavaReadWrapper(fname, tag, false); + } + + public String genJavaReadWrapper(String fname, String tag, boolean decl) { + StringBuilder ret = new StringBuilder(""); + if (decl) { + ret.append(" "+getJavaFQName()+" "+fname+";\n"); + } + ret.append(" "+fname+"= new "+getJavaFQName()+"();\n"); + ret.append(" a_.readRecord("+fname+",\""+tag+"\");\n"); + return ret.toString(); + } + + public String genJavaWriteWrapper(String fname, String tag) { + return " a_.writeRecord("+fname+",\""+tag+"\");\n"; + } + + String genCsharpReadMethod(String fname, String tag) { + //return " "+capitalize(fname)+"=a_.Read"+mMethodSuffix+"(" + capitalize(fname) + ",\""+tag+"\");\n"; + return genCsharpReadWrapper(capitalize(fname), tag, false); + } + + public String genCsharpReadWrapper(String fname, String tag, boolean decl) { + StringBuilder ret = new StringBuilder(""); + if (decl) { + ret.append(" "+getCsharpFQName(mFQName)+" "+fname+";\n"); + } + ret.append(" "+fname+"= new "+getCsharpFQName(mFQName)+"();\n"); + ret.append(" a_.ReadRecord("+fname+",\""+tag+"\");\n"); + return ret.toString(); + } + + public String genCsharpWriteWrapper(String fname, String tag) { + return " a_.WriteRecord("+fname+",\""+tag+"\");\n"; + } + + static HashMap vectorStructs = new HashMap(); + public void genCCode(FileWriter h, FileWriter c) throws IOException { + for (JField f : mFields) { + if (f.getType() instanceof JVector) { + JVector jv = (JVector)f.getType(); + JType jvType = jv.getElementType(); + String struct_name = JVector.extractVectorName(jvType); + if (vectorStructs.get(struct_name) == null) { + vectorStructs.put(struct_name, struct_name); + h.write("struct " + struct_name + " {\n int32_t count;\n" + jv.getElementType().genCDecl("*data") + "\n};\n"); + h.write("int serialize_" + struct_name + "(struct oarchive *out, const char *tag, struct " + struct_name + " *v);\n"); + h.write("int deserialize_" + struct_name + "(struct iarchive *in, const char *tag, struct " + struct_name + " *v);\n"); + h.write("int allocate_" + struct_name + "(struct " + struct_name + " *v, int32_t len);\n"); + h.write("int deallocate_" + struct_name + "(struct " + struct_name + " *v);\n"); + c.write("int allocate_" + struct_name + "(struct " + struct_name + " *v, int32_t len) {\n"); + c.write(" if (!len) {\n"); + c.write(" v->count = 0;\n"); + c.write(" v->data = 0;\n"); + c.write(" } else {\n"); + c.write(" v->count = len;\n"); + c.write(" v->data = calloc(sizeof(*v->data), len);\n"); + c.write(" }\n"); + c.write(" return 0;\n"); + c.write("}\n"); + c.write("int deallocate_" + struct_name + "(struct " + struct_name + " *v) {\n"); + c.write(" if (v->data) {\n"); + c.write(" int32_t i;\n"); + c.write(" for(i=0;icount; i++) {\n"); + c.write(" deallocate_"+JRecord.extractMethodSuffix(jvType)+"(&v->data[i]);\n"); + c.write(" }\n"); + c.write(" free(v->data);\n"); + c.write(" v->data = 0;\n"); + c.write(" }\n"); + c.write(" return 0;\n"); + c.write("}\n"); + c.write("int serialize_" + struct_name + "(struct oarchive *out, const char *tag, struct " + struct_name + " *v)\n"); + c.write("{\n"); + c.write(" int32_t count = v->count;\n"); + c.write(" int rc = 0;\n"); + c.write(" int32_t i;\n"); + c.write(" rc = out->start_vector(out, tag, &count);\n"); + c.write(" for(i=0;icount;i++) {\n"); + genSerialize(c, jvType, "data", "data[i]"); + c.write(" }\n"); + c.write(" rc = rc ? rc : out->end_vector(out, tag);\n"); + c.write(" return rc;\n"); + c.write("}\n"); + c.write("int deserialize_" + struct_name + "(struct iarchive *in, const char *tag, struct " + struct_name + " *v)\n"); + c.write("{\n"); + c.write(" int rc = 0;\n"); + c.write(" int32_t i;\n"); + c.write(" rc = in->start_vector(in, tag, &v->count);\n"); + c.write(" v->data = calloc(v->count, sizeof(*v->data));\n"); + c.write(" for(i=0;icount;i++) {\n"); + genDeserialize(c, jvType, "value", "data[i]"); + c.write(" }\n"); + c.write(" rc = in->end_vector(in, tag);\n"); + c.write(" return rc;\n"); + c.write("}\n"); + + } + } + } + String rec_name = getName(); + h.write("struct " + rec_name + " {\n"); + for (JField f : mFields) { + h.write(f.genCDecl()); + } + h.write("};\n"); + h.write("int serialize_" + rec_name + "(struct oarchive *out, const char *tag, struct " + rec_name + " *v);\n"); + h.write("int deserialize_" + rec_name + "(struct iarchive *in, const char *tag, struct " + rec_name + "*v);\n"); + h.write("void deallocate_" + rec_name + "(struct " + rec_name + "*);\n"); + c.write("int serialize_" + rec_name + "(struct oarchive *out, const char *tag, struct " + rec_name + " *v)"); + c.write("{\n"); + c.write(" int rc;\n"); + c.write(" rc = out->start_record(out, tag);\n"); + for(JField f : mFields) { + genSerialize(c, f.getType(), f.getTag(), f.getName()); + } + c.write(" rc = rc ? rc : out->end_record(out, tag);\n"); + c.write(" return rc;\n"); + c.write("}\n"); + c.write("int deserialize_" + rec_name + "(struct iarchive *in, const char *tag, struct " + rec_name + "*v)"); + c.write("{\n"); + c.write(" int rc;\n"); + c.write(" rc = in->start_record(in, tag);\n"); + for(JField f : mFields) { + genDeserialize(c, f.getType(), f.getTag(), f.getName()); + } + c.write(" rc = rc ? rc : in->end_record(in, tag);\n"); + c.write(" return rc;\n"); + c.write("}\n"); + c.write("void deallocate_" + rec_name + "(struct " + rec_name + "*v)"); + c.write("{\n"); + for(JField f : mFields) { + if (f.getType() instanceof JRecord) { + c.write(" deallocate_" + extractStructName(f.getType()) + "(&v->" + f.getName() + ");\n"); + } else if (f.getType() instanceof JVector) { + JVector vt = (JVector)f.getType(); + c.write(" deallocate_" + JVector.extractVectorName(vt.getElementType())+ "(&v->"+f.getName()+");\n"); + } else if (f.getType() instanceof JCompType) { + c.write(" deallocate_" + extractMethodSuffix(f.getType()) + "(&v->"+f.getName()+");\n"); + } + } + c.write("}\n"); + } + + private void genSerialize(FileWriter c, JType type, String tag, String name) throws IOException { + if (type instanceof JRecord) { + c.write(" rc = rc ? rc : serialize_" + extractStructName(type) + "(out, \"" + tag + "\", &v->" + name + ");\n"); + } else if (type instanceof JVector) { + c.write(" rc = rc ? rc : serialize_" + JVector.extractVectorName(((JVector)type).getElementType()) + "(out, \"" + tag + "\", &v->" + name + ");\n"); + } else { + c.write(" rc = rc ? rc : out->serialize_" + extractMethodSuffix(type) + "(out, \"" + tag + "\", &v->" + name + ");\n"); + } + } + + private void genDeserialize(FileWriter c, JType type, String tag, String name) throws IOException { + if (type instanceof JRecord) { + c.write(" rc = rc ? rc : deserialize_" + extractStructName(type) + "(in, \"" + tag + "\", &v->" + name + ");\n"); + } else if (type instanceof JVector) { + c.write(" rc = rc ? rc : deserialize_" + JVector.extractVectorName(((JVector)type).getElementType()) + "(in, \"" + tag + "\", &v->" + name + ");\n"); + } else { + c.write(" rc = rc ? rc : in->deserialize_" + extractMethodSuffix(type) + "(in, \"" + tag + "\", &v->" + name + ");\n"); + } + } + + static String extractMethodSuffix(JType t) { + if (t instanceof JRecord) { + return extractStructName(t); + } + return t.getMethodSuffix(); + } + + static private String extractStructName(JType t) { + String type = t.getCType(); + if (!type.startsWith("struct ")) return type; + return type.substring("struct ".length()); + } + + public void genCppCode(FileWriter hh, FileWriter cc) + throws IOException { + String[] ns = getCppNameSpace().split("::"); + for (int i = 0; i < ns.length; i++) { + hh.write("namespace "+ns[i]+" {\n"); + } + + hh.write("class "+getName()+" : public ::hadoop::Record {\n"); + hh.write("private:\n"); + + for (Iterator i = mFields.iterator(); i.hasNext();) { + JField jf = i.next(); + hh.write(jf.genCppDecl()); + } + hh.write(" mutable std::bitset<"+mFields.size()+"> bs_;\n"); + hh.write("public:\n"); + hh.write(" virtual void serialize(::hadoop::OArchive& a_, const char* tag) const;\n"); + hh.write(" virtual void deserialize(::hadoop::IArchive& a_, const char* tag);\n"); + hh.write(" virtual const ::std::string& type() const;\n"); + hh.write(" virtual const ::std::string& signature() const;\n"); + hh.write(" virtual bool validate() const;\n"); + hh.write(" virtual bool operator<(const "+getName()+"& peer_) const;\n"); + hh.write(" virtual bool operator==(const "+getName()+"& peer_) const;\n"); + hh.write(" virtual ~"+getName()+"() {};\n"); + int fIdx = 0; + for (Iterator i = mFields.iterator(); i.hasNext(); fIdx++) { + JField jf = i.next(); + hh.write(jf.genCppGetSet(fIdx)); + } + hh.write("}; // end record "+getName()+"\n"); + for (int i=ns.length-1; i>=0; i--) { + hh.write("} // end namespace "+ns[i]+"\n"); + } + cc.write("void "+getCppFQName()+"::serialize(::hadoop::OArchive& a_, const char* tag) const {\n"); + cc.write(" if (!validate()) throw new ::hadoop::IOException(\"All fields not set.\");\n"); + cc.write(" a_.startRecord(*this,tag);\n"); + fIdx = 0; + for (Iterator i = mFields.iterator(); i.hasNext(); fIdx++) { + JField jf = i.next(); + String name = jf.getName(); + if (jf.getType() instanceof JBuffer) { + cc.write(" a_.serialize(m"+name+",m"+name+".length(),\""+jf.getTag()+"\");\n"); + } else { + cc.write(" a_.serialize(m"+name+",\""+jf.getTag()+"\");\n"); + } + cc.write(" bs_.reset("+fIdx+");\n"); + } + cc.write(" a_.endRecord(*this,tag);\n"); + cc.write(" return;\n"); + cc.write("}\n"); + + cc.write("void "+getCppFQName()+"::deserialize(::hadoop::IArchive& a_, const char* tag) {\n"); + cc.write(" a_.startRecord(*this,tag);\n"); + fIdx = 0; + for (Iterator i = mFields.iterator(); i.hasNext(); fIdx++) { + JField jf = i.next(); + String name = jf.getName(); + if (jf.getType() instanceof JBuffer) { + cc.write(" { size_t len=0; a_.deserialize(m"+name+",len,\""+jf.getTag()+"\");}\n"); + } else { + cc.write(" a_.deserialize(m"+name+",\""+jf.getTag()+"\");\n"); + } + cc.write(" bs_.set("+fIdx+");\n"); + } + cc.write(" a_.endRecord(*this,tag);\n"); + cc.write(" return;\n"); + cc.write("}\n"); + + cc.write("bool "+getCppFQName()+"::validate() const {\n"); + cc.write(" if (bs_.size() != bs_.count()) return false;\n"); + for (Iterator i = mFields.iterator(); i.hasNext(); fIdx++) { + JField jf = (JField) i.next(); + JType type = jf.getType(); + if (type instanceof JRecord) { + cc.write(" if (!m"+jf.getName()+".validate()) return false;\n"); + } + } + cc.write(" return true;\n"); + cc.write("}\n"); + + cc.write("bool "+getCppFQName()+"::operator< (const "+getCppFQName()+"& peer_) const {\n"); + cc.write(" return (1\n"); + for (Iterator i = mFields.iterator(); i.hasNext();) { + JField jf = i.next(); + String name = jf.getName(); + cc.write(" && (m"+name+" < peer_.m"+name+")\n"); + } + cc.write(" );\n"); + cc.write("}\n"); + + cc.write("bool "+getCppFQName()+"::operator== (const "+getCppFQName()+"& peer_) const {\n"); + cc.write(" return (1\n"); + for (Iterator i = mFields.iterator(); i.hasNext();) { + JField jf = i.next(); + String name = jf.getName(); + cc.write(" && (m"+name+" == peer_.m"+name+")\n"); + } + cc.write(" );\n"); + cc.write("}\n"); + + cc.write("const ::std::string&"+getCppFQName()+"::type() const {\n"); + cc.write(" static const ::std::string type_(\""+mName+"\");\n"); + cc.write(" return type_;\n"); + cc.write("}\n"); + + cc.write("const ::std::string&"+getCppFQName()+"::signature() const {\n"); + cc.write(" static const ::std::string sig_(\""+getSignature()+"\");\n"); + cc.write(" return sig_;\n"); + cc.write("}\n"); + + } + + public void genJavaCode(File outputDirectory) throws IOException { + String pkg = getJavaPackage(); + String pkgpath = pkg.replaceAll("\\.", "/"); + File pkgdir = new File(outputDirectory, pkgpath); + if (!pkgdir.exists()) { + // create the pkg directory + if (!pkgdir.mkdirs()) { + throw new IOException("Cannnot create directory: " + pkgpath); + } + } else if (!pkgdir.isDirectory()) { + throw new IOException(pkgpath + " is not a directory."); + } + File jfile = new File(pkgdir, getName()+".java"); + FileWriter jj = new FileWriter(jfile); + jj.write("// File generated by hadoop record compiler. Do not edit.\n"); + jj.write("/**\n"); + jj.write("* Licensed to the Apache Software Foundation (ASF) under one\n"); + jj.write("* or more contributor license agreements. See the NOTICE file\n"); + jj.write("* distributed with this work for additional information\n"); + jj.write("* regarding copyright ownership. The ASF licenses this file\n"); + jj.write("* to you under the Apache License, Version 2.0 (the\n"); + jj.write("* \"License\"); you may not use this file except in compliance\n"); + jj.write("* with the License. You may obtain a copy of the License at\n"); + jj.write("*\n"); + jj.write("* http://www.apache.org/licenses/LICENSE-2.0\n"); + jj.write("*\n"); + jj.write("* Unless required by applicable law or agreed to in writing, software\n"); + jj.write("* distributed under the License is distributed on an \"AS IS\" BASIS,\n"); + jj.write("* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n"); + jj.write("* See the License for the specific language governing permissions and\n"); + jj.write("* limitations under the License.\n"); + jj.write("*/\n"); + jj.write("\n"); + jj.write("package "+getJavaPackage()+";\n\n"); + jj.write("import org.apache.jute.*;\n"); + jj.write("public class "+getName()+" implements Record {\n"); + for (Iterator i = mFields.iterator(); i.hasNext();) { + JField jf = i.next(); + jj.write(jf.genJavaDecl()); + } + jj.write(" public "+getName()+"() {\n"); + jj.write(" }\n"); + + jj.write(" public "+getName()+"(\n"); + int fIdx = 0; + int fLen = mFields.size(); + for (Iterator i = mFields.iterator(); i.hasNext(); fIdx++) { + JField jf = i.next(); + jj.write(jf.genJavaConstructorParam(jf.getName())); + jj.write((fLen-1 == fIdx)?"":",\n"); + } + jj.write(") {\n"); + fIdx = 0; + for (Iterator i = mFields.iterator(); i.hasNext(); fIdx++) { + JField jf = i.next(); + jj.write(jf.genJavaConstructorSet(jf.getName())); + } + jj.write(" }\n"); + fIdx = 0; + for (Iterator i = mFields.iterator(); i.hasNext(); fIdx++) { + JField jf = i.next(); + jj.write(jf.genJavaGetSet(fIdx)); + } + jj.write(" public void serialize(OutputArchive a_, String tag) throws java.io.IOException {\n"); + jj.write(" a_.startRecord(this,tag);\n"); + fIdx = 0; + for (Iterator i = mFields.iterator(); i.hasNext(); fIdx++) { + JField jf = i.next(); + jj.write(jf.genJavaWriteMethodName()); + } + jj.write(" a_.endRecord(this,tag);\n"); + jj.write(" }\n"); + + jj.write(" public void deserialize(InputArchive a_, String tag) throws java.io.IOException {\n"); + jj.write(" a_.startRecord(tag);\n"); + fIdx = 0; + for (Iterator i = mFields.iterator(); i.hasNext(); fIdx++) { + JField jf = i.next(); + jj.write(jf.genJavaReadMethodName()); + } + jj.write(" a_.endRecord(tag);\n"); + jj.write("}\n"); + + jj.write(" public String toString() {\n"); + jj.write(" try {\n"); + jj.write(" java.io.ByteArrayOutputStream s =\n"); + jj.write(" new java.io.ByteArrayOutputStream();\n"); + jj.write(" CsvOutputArchive a_ = \n"); + jj.write(" new CsvOutputArchive(s);\n"); + jj.write(" a_.startRecord(this,\"\");\n"); + fIdx = 0; + for (Iterator i = mFields.iterator(); i.hasNext(); fIdx++) { + JField jf = i.next(); + jj.write(jf.genJavaWriteMethodName()); + } + jj.write(" a_.endRecord(this,\"\");\n"); + jj.write(" return new String(s.toByteArray(), \"UTF-8\");\n"); + jj.write(" } catch (Throwable ex) {\n"); + jj.write(" ex.printStackTrace();\n"); + jj.write(" }\n"); + jj.write(" return \"ERROR\";\n"); + jj.write(" }\n"); + + jj.write(" public void write(java.io.DataOutput out) throws java.io.IOException {\n"); + jj.write(" BinaryOutputArchive archive = new BinaryOutputArchive(out);\n"); + jj.write(" serialize(archive, \"\");\n"); + jj.write(" }\n"); + + jj.write(" public void readFields(java.io.DataInput in) throws java.io.IOException {\n"); + jj.write(" BinaryInputArchive archive = new BinaryInputArchive(in);\n"); + jj.write(" deserialize(archive, \"\");\n"); + jj.write(" }\n"); + + jj.write(" public int compareTo (Object peer_) throws ClassCastException {\n"); + boolean unimplemented = false; + for (JField f : mFields) { + if ((f.getType() instanceof JMap) + || (f.getType() instanceof JVector)) + { + unimplemented = true; + } + } + if (unimplemented) { + jj.write(" throw new UnsupportedOperationException(\"comparing " + + getName() + " is unimplemented\");\n"); + } else { + jj.write(" if (!(peer_ instanceof "+getName()+")) {\n"); + jj.write(" throw new ClassCastException(\"Comparing different types of records.\");\n"); + jj.write(" }\n"); + jj.write(" "+getName()+" peer = ("+getName()+") peer_;\n"); + jj.write(" int ret = 0;\n"); + for (Iterator i = mFields.iterator(); i.hasNext(); fIdx++) { + JField jf = i.next(); + jj.write(jf.genJavaCompareTo()); + jj.write(" if (ret != 0) return ret;\n"); + } + jj.write(" return ret;\n"); + } + jj.write(" }\n"); + + jj.write(" public boolean equals(Object peer_) {\n"); + jj.write(" if (!(peer_ instanceof "+getName()+")) {\n"); + jj.write(" return false;\n"); + jj.write(" }\n"); + jj.write(" if (peer_ == this) {\n"); + jj.write(" return true;\n"); + jj.write(" }\n"); + jj.write(" "+getName()+" peer = ("+getName()+") peer_;\n"); + jj.write(" boolean ret = false;\n"); + for (Iterator i = mFields.iterator(); i.hasNext(); fIdx++) { + JField jf = i.next(); + jj.write(jf.genJavaEquals()); + jj.write(" if (!ret) return ret;\n"); + } + jj.write(" return ret;\n"); + jj.write(" }\n"); + + jj.write(" public int hashCode() {\n"); + jj.write(" int result = 17;\n"); + jj.write(" int ret;\n"); + for (Iterator i = mFields.iterator(); i.hasNext(); fIdx++) { + JField jf = i.next(); + jj.write(jf.genJavaHashCode()); + jj.write(" result = 37*result + ret;\n"); + } + jj.write(" return result;\n"); + jj.write(" }\n"); + jj.write(" public static String signature() {\n"); + jj.write(" return \""+getSignature()+"\";\n"); + jj.write(" }\n"); + + jj.write("}\n"); + + jj.close(); + } + + public void genCsharpCode(File outputDirectory) throws IOException { + if (!outputDirectory.exists()) { + // create the pkg directory + if (!outputDirectory.mkdirs()) { + throw new IOException("Cannnot create directory: " + outputDirectory); + } + } else if (!outputDirectory.isDirectory()) { + throw new IOException(outputDirectory + " is not a directory."); + } + File csharpFile = new File(outputDirectory, getName()+".cs"); + FileWriter cs = new FileWriter(csharpFile); + cs.write("// File generated by hadoop record compiler. Do not edit.\n"); + cs.write("/**\n"); + cs.write("* Licensed to the Apache Software Foundation (ASF) under one\n"); + cs.write("* or more contributor license agreements. See the NOTICE file\n"); + cs.write("* distributed with this work for additional information\n"); + cs.write("* regarding copyright ownership. The ASF licenses this file\n"); + cs.write("* to you under the Apache License, Version 2.0 (the\n"); + cs.write("* \"License\"); you may not use this file except in compliance\n"); + cs.write("* with the License. You may obtain a copy of the License at\n"); + cs.write("*\n"); + cs.write("* http://www.apache.org/licenses/LICENSE-2.0\n"); + cs.write("*\n"); + cs.write("* Unless required by applicable law or agreed to in writing, software\n"); + cs.write("* distributed under the License is distributed on an \"AS IS\" BASIS,\n"); + cs.write("* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n"); + cs.write("* See the License for the specific language governing permissions and\n"); + cs.write("* limitations under the License.\n"); + cs.write("*/\n"); + cs.write("\n"); + cs.write("using System;\n"); + cs.write("using Org.Apache.Jute;\n"); + cs.write("\n"); + cs.write("namespace "+getCsharpNameSpace()+"\n"); + cs.write("{\n"); + + String className = getCsharpName(); + cs.write("public class "+className+" : IRecord, IComparable \n"); + cs.write("{\n"); + cs.write(" public "+ className +"() {\n"); + cs.write(" }\n"); + + cs.write(" public "+className+"(\n"); + int fIdx = 0; + int fLen = mFields.size(); + for (Iterator i = mFields.iterator(); i.hasNext(); fIdx++) { + JField jf = i.next(); + cs.write(jf.genCsharpConstructorParam(jf.getCsharpName())); + cs.write((fLen-1 == fIdx)?"":",\n"); + } + cs.write(") {\n"); + fIdx = 0; + for (Iterator i = mFields.iterator(); i.hasNext(); fIdx++) { + JField jf = i.next(); + cs.write(jf.genCsharpConstructorSet(jf.getCsharpName())); + } + cs.write(" }\n"); + fIdx = 0; + for (Iterator i = mFields.iterator(); i.hasNext(); fIdx++) { + JField jf = i.next(); + cs.write(jf.genCsharpGetSet(fIdx)); + cs.write("\n"); + } + cs.write(" public void Serialize(IOutputArchive a_, String tag) {\n"); + cs.write(" a_.StartRecord(this,tag);\n"); + fIdx = 0; + for (Iterator i = mFields.iterator(); i.hasNext(); fIdx++) { + JField jf = i.next(); + cs.write(jf.genCsharpWriteMethodName()); + } + cs.write(" a_.EndRecord(this,tag);\n"); + cs.write(" }\n"); + + cs.write(" public void Deserialize(IInputArchive a_, String tag) {\n"); + cs.write(" a_.StartRecord(tag);\n"); + fIdx = 0; + for (Iterator i = mFields.iterator(); i.hasNext(); fIdx++) { + JField jf = i.next(); + cs.write(jf.genCsharpReadMethodName()); + } + cs.write(" a_.EndRecord(tag);\n"); + cs.write("}\n"); + + cs.write(" public override String ToString() {\n"); + cs.write(" try {\n"); + cs.write(" System.IO.MemoryStream ms = new System.IO.MemoryStream();\n"); + cs.write(" MiscUtil.IO.EndianBinaryWriter writer =\n"); + cs.write(" new MiscUtil.IO.EndianBinaryWriter(MiscUtil.Conversion.EndianBitConverter.Big, ms, System.Text.Encoding.UTF8);\n"); + cs.write(" BinaryOutputArchive a_ = \n"); + cs.write(" new BinaryOutputArchive(writer);\n"); + cs.write(" a_.StartRecord(this,\"\");\n"); + fIdx = 0; + for (Iterator i = mFields.iterator(); i.hasNext(); fIdx++) { + JField jf = i.next(); + cs.write(jf.genCsharpWriteMethodName()); + } + cs.write(" a_.EndRecord(this,\"\");\n"); + cs.write(" ms.Position = 0;\n"); + cs.write(" return System.Text.Encoding.UTF8.GetString(ms.ToArray());\n"); + cs.write(" } catch (Exception ex) {\n"); + cs.write(" Console.WriteLine(ex.StackTrace);\n"); + cs.write(" }\n"); + cs.write(" return \"ERROR\";\n"); + cs.write(" }\n"); + + cs.write(" public void Write(MiscUtil.IO.EndianBinaryWriter writer) {\n"); + cs.write(" BinaryOutputArchive archive = new BinaryOutputArchive(writer);\n"); + cs.write(" Serialize(archive, \"\");\n"); + cs.write(" }\n"); + + cs.write(" public void ReadFields(MiscUtil.IO.EndianBinaryReader reader) {\n"); + cs.write(" BinaryInputArchive archive = new BinaryInputArchive(reader);\n"); + cs.write(" Deserialize(archive, \"\");\n"); + cs.write(" }\n"); + + cs.write(" public int CompareTo (object peer_) {\n"); + boolean unimplemented = false; + for (JField f : mFields) { + if ((f.getType() instanceof JMap) + || (f.getType() instanceof JVector)) + { + unimplemented = true; + } + } + if (unimplemented) { + cs.write(" throw new InvalidOperationException(\"comparing " + + getCsharpName() + " is unimplemented\");\n"); + } else { + cs.write(" if (!(peer_ is "+getCsharpName()+")) {\n"); + cs.write(" throw new InvalidOperationException(\"Comparing different types of records.\");\n"); + cs.write(" }\n"); + cs.write(" "+getCsharpName()+" peer = ("+getCsharpName()+") peer_;\n"); + cs.write(" int ret = 0;\n"); + for (Iterator i = mFields.iterator(); i.hasNext(); fIdx++) { + JField jf = i.next(); + cs.write(jf.genCsharpCompareTo()); + cs.write(" if (ret != 0) return ret;\n"); + } + cs.write(" return ret;\n"); + } + cs.write(" }\n"); + + cs.write(" public override bool Equals(object peer_) {\n"); + cs.write(" if (!(peer_ is "+getCsharpName()+")) {\n"); + cs.write(" return false;\n"); + cs.write(" }\n"); + cs.write(" if (peer_ == this) {\n"); + cs.write(" return true;\n"); + cs.write(" }\n"); + cs.write(" bool ret = false;\n"); + cs.write(" " + getCsharpName() + " peer = (" + getCsharpName() + ")peer_;\n"); + for (Iterator i = mFields.iterator(); i.hasNext(); fIdx++) { + JField jf = i.next(); + cs.write(jf.genCsharpEquals()); + cs.write(" if (!ret) return ret;\n"); + } + cs.write(" return ret;\n"); + cs.write(" }\n"); + + cs.write(" public override int GetHashCode() {\n"); + cs.write(" int result = 17;\n"); + cs.write(" int ret;\n"); + for (Iterator i = mFields.iterator(); i.hasNext(); fIdx++) { + JField jf = i.next(); + cs.write(jf.genCsharpHashCode()); + cs.write(" result = 37*result + ret;\n"); + } + cs.write(" return result;\n"); + cs.write(" }\n"); + cs.write(" public static string Signature() {\n"); + cs.write(" return \""+getSignature()+"\";\n"); + cs.write(" }\n"); + + cs.write("}\n"); + cs.write("}\n"); + + cs.close(); + } + + public static String getCsharpFQName(String name) { + String[] packages = name.split("\\."); + StringBuffer fQName = new StringBuffer(); + for (int i = 0; i < packages.length; i++) { + String pack = packages[i]; + pack = capitalize(pack); + pack = "Id".equals(pack) ? "ZKId" : pack; + fQName.append(capitalize(pack)); + if (i != packages.length - 1) fQName.append("."); + } + return fQName.toString(); + } +} diff --git a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/jute/compiler/JString.java b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/jute/compiler/JString.java new file mode 100644 index 000000000..7f246c33b --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/jute/compiler/JString.java @@ -0,0 +1,46 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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. + */ + +package org.apache.jute.compiler; + +/** + * + */ +public class JString extends JCompType { + + /** Creates a new instance of JString */ + public JString() { + super("char *", " ::std::string", "string", "String", "String", "String", "string"); + } + + public String getSignature() { + return "s"; + } + + public String genJavaReadWrapper(String fname, String tag, boolean decl) { + String ret = ""; + if (decl) { + ret = " String "+fname+";\n"; + } + return ret + " "+fname+"=a_.readString(\""+tag+"\");\n"; + } + + public String genJavaWriteWrapper(String fname, String tag) { + return " a_.writeString("+fname+",\""+tag+"\");\n"; + } +} diff --git a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/jute/compiler/JType.java b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/jute/compiler/JType.java new file mode 100644 index 000000000..ee1b9c085 --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/jute/compiler/JType.java @@ -0,0 +1,204 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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. + */ + +package org.apache.jute.compiler; + +/** + * Abstract Base class for all types supported by Hadoop Record I/O. + * + */ +abstract public class JType { + + private String mCName; + private String mCppName; + private String mCsharpName; + private String mJavaName; + protected String mMethodSuffix; + private String mWrapper; + private String mSharpWrapper; + private String mUnwrapMethod; + + /** + * Creates a new instance of JType + */ + JType(String cname, String cppname, String csharpName, String javaname, String suffix, String wrapper, String csharpWrapper, String unwrap) { + mCName = cname; + mCppName = cppname; + mCsharpName = "Id".equals(csharpName) ? "ZKId" : csharpName; + mJavaName = javaname; + mMethodSuffix = suffix; + mWrapper = wrapper; + mSharpWrapper = csharpWrapper; + mUnwrapMethod = unwrap; + } + + abstract String getSignature(); + + String genCppDecl(String fname) { + return " "+mCppName+" m"+fname+";\n"; + } + + String genCDecl(String name) { + return " " + mCName + " "+name+";\n"; + } + + public String genCsharpDecl(String name) { + return " private "+mCsharpName+" " +name+";\n"; + } + + String genJavaDecl (String fname) { + return " private "+mJavaName+" " +fname+";\n"; + } + + String genJavaConstructorParam (String fname) { + return " "+mJavaName+" "+fname; + } + + String genCppGetSet(String fname, int fIdx) { + String getFunc = " virtual "+mCppName+" get"+fname+"() const {\n"; + getFunc += " return m"+fname+";\n"; + getFunc += " }\n"; + String setFunc = " virtual void set"+fname+"("+mCppName+" m_) {\n"; + setFunc += " m"+fname+"=m_; bs_.set("+fIdx+");\n"; + setFunc += " }\n"; + return getFunc+setFunc; + } + + String genCsharpGetSet(String fname, int fIdx) { + String getFunc = " public " + getCsharpType() + " " + capitalize(fname) + " { get; set; } "; + return getFunc; + } + + static String capitalize(String s) { + return s.substring(0,1).toUpperCase()+s.substring(1); + } + String genJavaGetSet(String fname, int fIdx) { + String getFunc = " public "+mJavaName+" get"+capitalize(fname)+"() {\n"; + getFunc += " return "+fname+";\n"; + getFunc += " }\n"; + String setFunc = " public void set"+capitalize(fname)+"("+mJavaName+" m_) {\n"; + setFunc += " " + fname+"=m_;\n"; + setFunc += " }\n"; + return getFunc+setFunc; + } + + String getCType() { + return mCName; + } + String getCppType() { + return mCppName; + } + + String getCsharpType() { + return mCsharpName; + } + + String getJavaType() { + return mJavaName; + } + + String getJavaWrapperType() { + return mWrapper; + } + + String getCsharpWrapperType() { + return mSharpWrapper; + } + + String getMethodSuffix() { + return mMethodSuffix; + } + + String genJavaWriteMethod(String fname, String tag) { + return " a_.write"+mMethodSuffix+"("+fname+",\""+tag+"\");\n"; + } + + String genJavaReadMethod(String fname, String tag) { + return " "+fname+"=a_.read"+mMethodSuffix+"(\""+tag+"\");\n"; + } + + String genJavaReadWrapper(String fname, String tag, boolean decl) { + String ret = ""; + if (decl) { + ret = " "+mWrapper+" "+fname+";\n"; + } + return ret + " "+fname+"=new "+mWrapper+"(a_.read"+mMethodSuffix+"(\""+tag+"\"));\n"; + } + + String genJavaWriteWrapper(String fname, String tag) { + return " a_.write"+mMethodSuffix+"("+fname+"."+mUnwrapMethod+"(),\""+tag+"\");\n"; + } + + String genJavaCompareTo(String fname) { + return " ret = ("+fname+" == peer."+fname+")? 0 :(("+fname+"", "System.Collections.Generic.List<" + t.getCsharpType() + ">", "java.util.List<" + t.getJavaType() + ">", "Vector", + "System.Collections.Generic.List<" + t.getCsharpType() + ">", "java.util.ArrayList<" + t.getJavaType() + ">"); + mElement = t; + } + + public String getSignature() { + return "[" + mElement.getSignature() + "]"; + } + + public String genJavaCompareTo(String fname) { + return " throw new UnsupportedOperationException(\"comparing " + + fname + " is unimplemented\");\n"; + } + + public String genJavaReadWrapper(String fname, String tag, boolean decl) { + StringBuilder ret = new StringBuilder(""); + if (decl) { + ret.append(" java.util.List "+fname+";\n"); + } + ret.append(" {\n"); + incrLevel(); + ret.append(" Index "+getId("vidx")+" = a_.startVector(\""+tag+"\");\n"); + ret.append(" if ("+getId("vidx")+"!= null) {"); + ret.append(" "+fname+"=new java.util.ArrayList<"+ mElement.getJavaType() + ">();\n"); + ret.append(" for (; !"+getId("vidx")+".done(); "+getId("vidx")+".incr()) {\n"); + ret.append(mElement.genJavaReadWrapper(getId("e"), getId("e"), true)); + ret.append(" "+fname+".add("+getId("e")+");\n"); + ret.append(" }\n"); + ret.append(" }\n"); + ret.append(" a_.endVector(\""+tag+"\");\n"); + decrLevel(); + ret.append(" }\n"); + return ret.toString(); + } + + public String genJavaReadMethod(String fname, String tag) { + return genJavaReadWrapper(fname, tag, false); + } + + public String genJavaWriteWrapper(String fname, String tag) { + StringBuilder ret = new StringBuilder(" {\n"); + incrLevel(); + ret.append(" a_.startVector("+fname+",\""+tag+"\");\n"); + ret.append(" if ("+fname+"!= null) {"); + ret.append(" int "+getId("len")+" = "+fname+".size();\n"); + ret.append(" for(int "+getId("vidx")+" = 0; "+getId("vidx")+"<"+getId("len")+"; "+getId("vidx")+"++) {\n"); + ret.append(" "+mElement.getJavaWrapperType()+" "+getId("e")+" = ("+mElement.getJavaWrapperType()+") "+fname+".get("+getId("vidx")+");\n"); + ret.append(mElement.genJavaWriteWrapper(getId("e"), getId("e"))); + ret.append(" }\n"); + ret.append(" }\n"); + ret.append(" a_.endVector("+fname+",\""+tag+"\");\n"); + ret.append(" }\n"); + decrLevel(); + return ret.toString(); + } + + public String genJavaWriteMethod(String fname, String tag) { + return genJavaWriteWrapper(fname, tag); + } + + public JType getElementType() { + return mElement; + } + + public String genCsharpWriteWrapper(String fname, String tag) { + StringBuilder ret = new StringBuilder(" {\n"); + incrLevel(); + ret.append(" a_.StartVector("+capitalize(fname)+",\""+tag+"\");\n"); + ret.append(" if ("+capitalize(fname)+"!= null) {"); + ret.append(" int "+getId("len")+" = "+capitalize(fname)+".Count;\n"); + ret.append(" for(int "+getId("vidx")+" = 0; "+getId("vidx")+"<"+getId("len")+"; "+getId("vidx")+"++) {\n"); + ret.append(" "+mElement.getCsharpWrapperType()+" "+getId("e")+" = ("+mElement.getCsharpWrapperType()+") "+capitalize(fname)+"["+getId("vidx")+"];\n"); + ret.append(mElement.genCsharpWriteWrapper(getId("e"), getId("e"))); + ret.append(" }\n"); + ret.append(" }\n"); + ret.append(" a_.EndVector("+capitalize(fname)+",\""+tag+"\");\n"); + ret.append(" }\n"); + decrLevel(); + return ret.toString(); + } + + String genCsharpWriteMethod(String fname, String tag) { + return genCsharpWriteWrapper(fname, tag); + } + + public String genCsharpReadWrapper(String fname, String tag, boolean decl) { + StringBuilder ret = new StringBuilder(""); + if (decl) { + ret.append(" System.Collections.Generic.List<" + mElement.getCsharpType()+ "> "+capitalize(fname)+";\n"); + } + ret.append(" {\n"); + incrLevel(); + ret.append(" IIndex "+getId("vidx")+" = a_.StartVector(\""+tag+"\");\n"); + ret.append(" if ("+getId("vidx")+"!= null) {"); + ret.append(" "+capitalize(fname)+"=new System.Collections.Generic.List<"+ mElement.getCsharpType() + ">();\n"); + ret.append(" for (; !"+getId("vidx")+".Done(); "+getId("vidx")+".Incr()) {\n"); + ret.append(mElement.genCsharpReadWrapper(getId("e"), getId("e"), true)); + ret.append(" "+capitalize(fname)+".Add("+getId("e")+");\n"); + ret.append(" }\n"); + ret.append(" }\n"); + ret.append(" a_.EndVector(\""+tag+"\");\n"); + decrLevel(); + ret.append(" }\n"); + return ret.toString(); + } + + String genCsharpReadMethod(String fname, String tag) { + return genCsharpReadWrapper(fname, tag, false); + } + + static public String extractVectorName(JType jvType) { + return JRecord.extractMethodSuffix(jvType)+"_vector"; + } +} diff --git a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/jute/compiler/JavaGenerator.java b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/jute/compiler/JavaGenerator.java new file mode 100644 index 000000000..4078520f7 --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/jute/compiler/JavaGenerator.java @@ -0,0 +1,57 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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. + */ + +package org.apache.jute.compiler; + +import java.io.File; +import java.io.IOException; +import java.util.ArrayList; +import java.util.Iterator; + +/** + * Java Code generator front-end for Hadoop record I/O. + */ +class JavaGenerator { + private ArrayList mRecList; + private final File outputDirectory; + + /** Creates a new instance of JavaGenerator + * + * @param name possibly full pathname to the file + * @param incl included files (as JFile) + * @param records List of records defined within this file + * @param outputDirectory + */ + JavaGenerator(String name, ArrayList incl, + ArrayList records, File outputDirectory) + { + mRecList = records; + this.outputDirectory = outputDirectory; + } + + /** + * Generate Java code for records. This method is only a front-end to + * JRecord, since one file is generated for each record. + */ + void genCode() throws IOException { + for (Iterator i = mRecList.iterator(); i.hasNext(); ) { + JRecord rec = i.next(); + rec.genJavaCode(outputDirectory); + } + } +} diff --git a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/jute/compiler/generated/ParseException.java b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/jute/compiler/generated/ParseException.java new file mode 100644 index 000000000..e4b0a9b67 --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/jute/compiler/generated/ParseException.java @@ -0,0 +1,210 @@ +/* Generated By:JavaCC: Do not edit this line. ParseException.java Version 3.0 */ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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. + */ + +package org.apache.jute.compiler.generated; + +/** + * This exception is thrown when parse errors are encountered. + * You can explicitly create objects of this exception type by + * calling the method generateParseException in the generated + * parser. + * + * You can modify this class to customize your error reporting + * mechanisms so long as you retain the public fields. + */ +public class ParseException extends Exception { + + /** + * This constructor is used by the method "generateParseException" + * in the generated parser. Calling this constructor generates + * a new object of this type with the fields "currentToken", + * "expectedTokenSequences", and "tokenImage" set. The boolean + * flag "specialConstructor" is also set to true to indicate that + * this constructor was used to create this object. + * This constructor calls its super class with the empty string + * to force the "toString" method of parent class "Throwable" to + * print the error message in the form: + * ParseException: + */ + public ParseException(Token currentTokenVal, + int[][] expectedTokenSequencesVal, + String[] tokenImageVal + ) + { + super(""); + specialConstructor = true; + currentToken = currentTokenVal; + expectedTokenSequences = expectedTokenSequencesVal; + tokenImage = tokenImageVal; + } + + /** + * The following constructors are for use by you for whatever + * purpose you can think of. Constructing the exception in this + * manner makes the exception behave in the normal way - i.e., as + * documented in the class "Throwable". The fields "errorToken", + * "expectedTokenSequences", and "tokenImage" do not contain + * relevant information. The JavaCC generated code does not use + * these constructors. + */ + + public ParseException() { + super(); + specialConstructor = false; + } + + public ParseException(String message) { + super(message); + specialConstructor = false; + } + + /** + * This variable determines which constructor was used to create + * this object and thereby affects the semantics of the + * "getMessage" method (see below). + */ + protected boolean specialConstructor; + + /** + * This is the last token that has been consumed successfully. If + * this object has been created due to a parse error, the token + * followng this token will (therefore) be the first error token. + */ + public Token currentToken; + + /** + * Each entry in this array is an array of integers. Each array + * of integers represents a sequence of tokens (by their ordinal + * values) that is expected at this point of the parse. + */ + public int[][] expectedTokenSequences; + + /** + * This is a reference to the "tokenImage" array of the generated + * parser within which the parse error occurred. This array is + * defined in the generated ...Constants interface. + */ + public String[] tokenImage; + + /** + * This method has the standard behavior when this object has been + * created using the standard constructors. Otherwise, it uses + * "currentToken" and "expectedTokenSequences" to generate a parse + * error message and returns it. If this object has been created + * due to a parse error, and you do not catch it (it gets thrown + * from the parser), then this method is called during the printing + * of the final stack trace, and hence the correct error message + * gets displayed. + */ + public String getMessage() { + if (!specialConstructor) { + return super.getMessage(); + } + StringBuffer expected = new StringBuffer(); + int maxSize = 0; + for (int i = 0; i < expectedTokenSequences.length; i++) { + if (maxSize < expectedTokenSequences[i].length) { + maxSize = expectedTokenSequences[i].length; + } + for (int j = 0; j < expectedTokenSequences[i].length; j++) { + expected.append(tokenImage[expectedTokenSequences[i][j]]).append(" "); + } + if (expectedTokenSequences[i][expectedTokenSequences[i].length - 1] != 0) { + expected.append("..."); + } + expected.append(eol).append(" "); + } + String retval = "Encountered \""; + Token tok = currentToken.next; + for (int i = 0; i < maxSize; i++) { + if (i != 0) retval += " "; + if (tok.kind == 0) { + retval += tokenImage[0]; + break; + } + retval += add_escapes(tok.image); + tok = tok.next; + } + retval += "\" at line " + currentToken.next.beginLine + ", column " + currentToken.next.beginColumn; + retval += "." + eol; + if (expectedTokenSequences.length == 1) { + retval += "Was expecting:" + eol + " "; + } else { + retval += "Was expecting one of:" + eol + " "; + } + retval += expected.toString(); + return retval; + } + + /** + * The end of line string for this machine. + */ + protected String eol = System.getProperty("line.separator", "\n"); + + /** + * Used to convert raw characters to their escaped version + * when these raw version cannot be used as part of an ASCII + * string literal. + */ + protected String add_escapes(String str) { + StringBuffer retval = new StringBuffer(); + char ch; + for (int i = 0; i < str.length(); i++) { + switch (str.charAt(i)) + { + case 0 : + continue; + case '\b': + retval.append("\\b"); + continue; + case '\t': + retval.append("\\t"); + continue; + case '\n': + retval.append("\\n"); + continue; + case '\f': + retval.append("\\f"); + continue; + case '\r': + retval.append("\\r"); + continue; + case '\"': + retval.append("\\\""); + continue; + case '\'': + retval.append("\\\'"); + continue; + case '\\': + retval.append("\\\\"); + continue; + default: + if ((ch = str.charAt(i)) < 0x20 || ch > 0x7e) { + String s = "0000" + Integer.toString(ch, 16); + retval.append("\\u" + s.substring(s.length() - 4, s.length())); + } else { + retval.append(ch); + } + continue; + } + } + return retval.toString(); + } + +} diff --git a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/jute/compiler/generated/Rcc.java b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/jute/compiler/generated/Rcc.java new file mode 100644 index 000000000..1bd4878a9 --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/jute/compiler/generated/Rcc.java @@ -0,0 +1,525 @@ +/* Generated By:JavaCC: Do not edit this line. Rcc.java */ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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. + */ + +package org.apache.jute.compiler.generated; + +import org.apache.jute.compiler.*; +import java.util.ArrayList; +import java.util.Hashtable; +import java.util.Iterator; +import java.io.File; +import java.io.FileReader; +import java.io.FileNotFoundException; +import java.io.IOException; + +public class Rcc implements RccConstants { + private static Hashtable recTab = new Hashtable(); + private static String curDir = System.getProperty("user.dir"); + private static String curFileName; + private static String curModuleName; + + public static void main(String args[]) { + String language = "java"; + ArrayList recFiles = new ArrayList(); + JFile curFile=null; + + for (int i=0; i= 0) { + la1tokens[jj_kind] = true; + jj_kind = -1; + } + for (int i = 0; i < 6; i++) { + if (jj_la1[i] == jj_gen) { + for (int j = 0; j < 32; j++) { + if ((jj_la1_0[i] & (1<", + "\" \"", + "\"\\t\"", + "\"\\n\"", + "\"\\r\"", + "\"//\"", + "", + "", + "\"/*\"", + "\"*/\"", + "", + "\"module\"", + "\"class\"", + "\"include\"", + "\"byte\"", + "\"boolean\"", + "\"int\"", + "\"long\"", + "\"float\"", + "\"double\"", + "\"ustring\"", + "\"buffer\"", + "\"vector\"", + "\"map\"", + "\"{\"", + "\"}\"", + "\"<\"", + "\">\"", + "\";\"", + "\",\"", + "\".\"", + "", + "", + }; + +} diff --git a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/jute/compiler/generated/RccTokenManager.java b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/jute/compiler/generated/RccTokenManager.java new file mode 100644 index 000000000..5ae99e27d --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/jute/compiler/generated/RccTokenManager.java @@ -0,0 +1,833 @@ +/* Generated By:JavaCC: Do not edit this line. RccTokenManager.java */ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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. + */ + +package org.apache.jute.compiler.generated; +import org.apache.jute.compiler.*; +import java.util.ArrayList; +import java.util.Hashtable; +import java.util.Iterator; +import java.io.File; +import java.io.FileReader; +import java.io.FileNotFoundException; +import java.io.IOException; + +public class RccTokenManager implements RccConstants +{ + public java.io.PrintStream debugStream = System.out; + public void setDebugStream(java.io.PrintStream ds) { debugStream = ds; } +private final int jjMoveStringLiteralDfa0_1() +{ + return jjMoveNfa_1(0, 0); +} +private final void jjCheckNAdd(int state) +{ + if (jjrounds[state] != jjround) + { + jjstateSet[jjnewStateCnt++] = state; + jjrounds[state] = jjround; + } +} +private final void jjAddStates(int start, int end) +{ + do { + jjstateSet[jjnewStateCnt++] = jjnextStates[start]; + } while (start++ != end); +} +private final void jjCheckNAddTwoStates(int state1, int state2) +{ + jjCheckNAdd(state1); + jjCheckNAdd(state2); +} +private final void jjCheckNAddStates(int start, int end) +{ + do { + jjCheckNAdd(jjnextStates[start]); + } while (start++ != end); +} +private final void jjCheckNAddStates(int start) +{ + jjCheckNAdd(jjnextStates[start]); + jjCheckNAdd(jjnextStates[start + 1]); +} +private final int jjMoveNfa_1(int startState, int curPos) +{ + int[] nextStates; + int startsAt = 0; + jjnewStateCnt = 3; + int i = 1; + jjstateSet[0] = startState; + int j, kind = 0x7fffffff; + for (;;) + { + if (++jjround == 0x7fffffff) + ReInitRounds(); + if (curChar < 64) + { + long l = 1L << curChar; + MatchLoop: do + { + switch(jjstateSet[--i]) + { + case 0: + if ((0x2400L & l) != 0L) + { + if (kind > 6) + kind = 6; + } + if (curChar == 13) + jjstateSet[jjnewStateCnt++] = 1; + break; + case 1: + if (curChar == 10 && kind > 6) + kind = 6; + break; + case 2: + if (curChar == 13) + jjstateSet[jjnewStateCnt++] = 1; + break; + default : break; + } + } while(i != startsAt); + } + else if (curChar < 128) + { + long l = 1L << (curChar & 077); + MatchLoop: do + { + switch(jjstateSet[--i]) + { + default : break; + } + } while(i != startsAt); + } + else + { + int i2 = (curChar & 0xff) >> 6; + long l2 = 1L << (curChar & 077); + MatchLoop: do + { + switch(jjstateSet[--i]) + { + default : break; + } + } while(i != startsAt); + } + if (kind != 0x7fffffff) + { + jjmatchedKind = kind; + jjmatchedPos = curPos; + kind = 0x7fffffff; + } + ++curPos; + if ((i = jjnewStateCnt) == (startsAt = 3 - (jjnewStateCnt = startsAt))) + return curPos; + try { curChar = input_stream.readChar(); } + catch(java.io.IOException e) { return curPos; } + } +} +private final int jjStopStringLiteralDfa_0(int pos, long active0) +{ + switch (pos) + { + case 0: + if ((active0 & 0xfff800L) != 0L) + { + jjmatchedKind = 32; + return 4; + } + return -1; + case 1: + if ((active0 & 0xfff800L) != 0L) + { + jjmatchedKind = 32; + jjmatchedPos = 1; + return 4; + } + return -1; + case 2: + if ((active0 & 0x7ef800L) != 0L) + { + jjmatchedKind = 32; + jjmatchedPos = 2; + return 4; + } + if ((active0 & 0x810000L) != 0L) + return 4; + return -1; + case 3: + if ((active0 & 0x24000L) != 0L) + return 4; + if ((active0 & 0x7cb800L) != 0L) + { + jjmatchedKind = 32; + jjmatchedPos = 3; + return 4; + } + return -1; + case 4: + if ((active0 & 0x41000L) != 0L) + return 4; + if ((active0 & 0x78a800L) != 0L) + { + jjmatchedKind = 32; + jjmatchedPos = 4; + return 4; + } + return -1; + case 5: + if ((active0 & 0x680800L) != 0L) + return 4; + if ((active0 & 0x10a000L) != 0L) + { + jjmatchedKind = 32; + jjmatchedPos = 5; + return 4; + } + return -1; + default : + return -1; + } +} +private final int jjStartNfa_0(int pos, long active0) +{ + return jjMoveNfa_0(jjStopStringLiteralDfa_0(pos, active0), pos + 1); +} +private final int jjStopAtPos(int pos, int kind) +{ + jjmatchedKind = kind; + jjmatchedPos = pos; + return pos + 1; +} +private final int jjStartNfaWithStates_0(int pos, int kind, int state) +{ + jjmatchedKind = kind; + jjmatchedPos = pos; + try { curChar = input_stream.readChar(); } + catch(java.io.IOException e) { return pos + 1; } + return jjMoveNfa_0(state, pos + 1); +} +private final int jjMoveStringLiteralDfa0_0() +{ + switch(curChar) + { + case 44: + return jjStopAtPos(0, 29); + case 46: + return jjStopAtPos(0, 30); + case 47: + return jjMoveStringLiteralDfa1_0(0x120L); + case 59: + return jjStopAtPos(0, 28); + case 60: + return jjStopAtPos(0, 26); + case 62: + return jjStopAtPos(0, 27); + case 98: + return jjMoveStringLiteralDfa1_0(0x20c000L); + case 99: + return jjMoveStringLiteralDfa1_0(0x1000L); + case 100: + return jjMoveStringLiteralDfa1_0(0x80000L); + case 102: + return jjMoveStringLiteralDfa1_0(0x40000L); + case 105: + return jjMoveStringLiteralDfa1_0(0x12000L); + case 108: + return jjMoveStringLiteralDfa1_0(0x20000L); + case 109: + return jjMoveStringLiteralDfa1_0(0x800800L); + case 117: + return jjMoveStringLiteralDfa1_0(0x100000L); + case 118: + return jjMoveStringLiteralDfa1_0(0x400000L); + case 123: + return jjStopAtPos(0, 24); + case 125: + return jjStopAtPos(0, 25); + default : + return jjMoveNfa_0(0, 0); + } +} +private final int jjMoveStringLiteralDfa1_0(long active0) +{ + try { curChar = input_stream.readChar(); } + catch(java.io.IOException e) { + jjStopStringLiteralDfa_0(0, active0); + return 1; + } + switch(curChar) + { + case 42: + if ((active0 & 0x100L) != 0L) + return jjStopAtPos(1, 8); + break; + case 47: + if ((active0 & 0x20L) != 0L) + return jjStopAtPos(1, 5); + break; + case 97: + return jjMoveStringLiteralDfa2_0(active0, 0x800000L); + case 101: + return jjMoveStringLiteralDfa2_0(active0, 0x400000L); + case 108: + return jjMoveStringLiteralDfa2_0(active0, 0x41000L); + case 110: + return jjMoveStringLiteralDfa2_0(active0, 0x12000L); + case 111: + return jjMoveStringLiteralDfa2_0(active0, 0xa8800L); + case 115: + return jjMoveStringLiteralDfa2_0(active0, 0x100000L); + case 117: + return jjMoveStringLiteralDfa2_0(active0, 0x200000L); + case 121: + return jjMoveStringLiteralDfa2_0(active0, 0x4000L); + default : + break; + } + return jjStartNfa_0(0, active0); +} +private final int jjMoveStringLiteralDfa2_0(long old0, long active0) +{ + if (((active0 &= old0)) == 0L) + return jjStartNfa_0(0, old0); + try { curChar = input_stream.readChar(); } + catch(java.io.IOException e) { + jjStopStringLiteralDfa_0(1, active0); + return 2; + } + switch(curChar) + { + case 97: + return jjMoveStringLiteralDfa3_0(active0, 0x1000L); + case 99: + return jjMoveStringLiteralDfa3_0(active0, 0x402000L); + case 100: + return jjMoveStringLiteralDfa3_0(active0, 0x800L); + case 102: + return jjMoveStringLiteralDfa3_0(active0, 0x200000L); + case 110: + return jjMoveStringLiteralDfa3_0(active0, 0x20000L); + case 111: + return jjMoveStringLiteralDfa3_0(active0, 0x48000L); + case 112: + if ((active0 & 0x800000L) != 0L) + return jjStartNfaWithStates_0(2, 23, 4); + break; + case 116: + if ((active0 & 0x10000L) != 0L) + return jjStartNfaWithStates_0(2, 16, 4); + return jjMoveStringLiteralDfa3_0(active0, 0x104000L); + case 117: + return jjMoveStringLiteralDfa3_0(active0, 0x80000L); + default : + break; + } + return jjStartNfa_0(1, active0); +} +private final int jjMoveStringLiteralDfa3_0(long old0, long active0) +{ + if (((active0 &= old0)) == 0L) + return jjStartNfa_0(1, old0); + try { curChar = input_stream.readChar(); } + catch(java.io.IOException e) { + jjStopStringLiteralDfa_0(2, active0); + return 3; + } + switch(curChar) + { + case 97: + return jjMoveStringLiteralDfa4_0(active0, 0x40000L); + case 98: + return jjMoveStringLiteralDfa4_0(active0, 0x80000L); + case 101: + if ((active0 & 0x4000L) != 0L) + return jjStartNfaWithStates_0(3, 14, 4); + break; + case 102: + return jjMoveStringLiteralDfa4_0(active0, 0x200000L); + case 103: + if ((active0 & 0x20000L) != 0L) + return jjStartNfaWithStates_0(3, 17, 4); + break; + case 108: + return jjMoveStringLiteralDfa4_0(active0, 0xa000L); + case 114: + return jjMoveStringLiteralDfa4_0(active0, 0x100000L); + case 115: + return jjMoveStringLiteralDfa4_0(active0, 0x1000L); + case 116: + return jjMoveStringLiteralDfa4_0(active0, 0x400000L); + case 117: + return jjMoveStringLiteralDfa4_0(active0, 0x800L); + default : + break; + } + return jjStartNfa_0(2, active0); +} +private final int jjMoveStringLiteralDfa4_0(long old0, long active0) +{ + if (((active0 &= old0)) == 0L) + return jjStartNfa_0(2, old0); + try { curChar = input_stream.readChar(); } + catch(java.io.IOException e) { + jjStopStringLiteralDfa_0(3, active0); + return 4; + } + switch(curChar) + { + case 101: + return jjMoveStringLiteralDfa5_0(active0, 0x208000L); + case 105: + return jjMoveStringLiteralDfa5_0(active0, 0x100000L); + case 108: + return jjMoveStringLiteralDfa5_0(active0, 0x80800L); + case 111: + return jjMoveStringLiteralDfa5_0(active0, 0x400000L); + case 115: + if ((active0 & 0x1000L) != 0L) + return jjStartNfaWithStates_0(4, 12, 4); + break; + case 116: + if ((active0 & 0x40000L) != 0L) + return jjStartNfaWithStates_0(4, 18, 4); + break; + case 117: + return jjMoveStringLiteralDfa5_0(active0, 0x2000L); + default : + break; + } + return jjStartNfa_0(3, active0); +} +private final int jjMoveStringLiteralDfa5_0(long old0, long active0) +{ + if (((active0 &= old0)) == 0L) + return jjStartNfa_0(3, old0); + try { curChar = input_stream.readChar(); } + catch(java.io.IOException e) { + jjStopStringLiteralDfa_0(4, active0); + return 5; + } + switch(curChar) + { + case 97: + return jjMoveStringLiteralDfa6_0(active0, 0x8000L); + case 100: + return jjMoveStringLiteralDfa6_0(active0, 0x2000L); + case 101: + if ((active0 & 0x800L) != 0L) + return jjStartNfaWithStates_0(5, 11, 4); + else if ((active0 & 0x80000L) != 0L) + return jjStartNfaWithStates_0(5, 19, 4); + break; + case 110: + return jjMoveStringLiteralDfa6_0(active0, 0x100000L); + case 114: + if ((active0 & 0x200000L) != 0L) + return jjStartNfaWithStates_0(5, 21, 4); + else if ((active0 & 0x400000L) != 0L) + return jjStartNfaWithStates_0(5, 22, 4); + break; + default : + break; + } + return jjStartNfa_0(4, active0); +} +private final int jjMoveStringLiteralDfa6_0(long old0, long active0) +{ + if (((active0 &= old0)) == 0L) + return jjStartNfa_0(4, old0); + try { curChar = input_stream.readChar(); } + catch(java.io.IOException e) { + jjStopStringLiteralDfa_0(5, active0); + return 6; + } + switch(curChar) + { + case 101: + if ((active0 & 0x2000L) != 0L) + return jjStartNfaWithStates_0(6, 13, 4); + break; + case 103: + if ((active0 & 0x100000L) != 0L) + return jjStartNfaWithStates_0(6, 20, 4); + break; + case 110: + if ((active0 & 0x8000L) != 0L) + return jjStartNfaWithStates_0(6, 15, 4); + break; + default : + break; + } + return jjStartNfa_0(5, active0); +} +static final long[] jjbitVec0 = { + 0x0L, 0x0L, 0xffffffffffffffffL, 0xffffffffffffffffL +}; +private final int jjMoveNfa_0(int startState, int curPos) +{ + int[] nextStates; + int startsAt = 0; + jjnewStateCnt = 5; + int i = 1; + jjstateSet[0] = startState; + int j, kind = 0x7fffffff; + for (;;) + { + if (++jjround == 0x7fffffff) + ReInitRounds(); + if (curChar < 64) + { + long l = 1L << curChar; + MatchLoop: do + { + switch(jjstateSet[--i]) + { + case 0: + if (curChar == 34) + jjCheckNAdd(1); + break; + case 1: + if ((0xfffffffbffffffffL & l) != 0L) + jjCheckNAddTwoStates(1, 2); + break; + case 2: + if (curChar == 34 && kind > 31) + kind = 31; + break; + case 4: + if ((0x3ff000000000000L & l) == 0L) + break; + if (kind > 32) + kind = 32; + jjstateSet[jjnewStateCnt++] = 4; + break; + default : break; + } + } while(i != startsAt); + } + else if (curChar < 128) + { + long l = 1L << (curChar & 077); + MatchLoop: do + { + switch(jjstateSet[--i]) + { + case 0: + if ((0x7fffffe07fffffeL & l) == 0L) + break; + if (kind > 32) + kind = 32; + jjCheckNAdd(4); + break; + case 1: + jjAddStates(0, 1); + break; + case 4: + if ((0x7fffffe87fffffeL & l) == 0L) + break; + if (kind > 32) + kind = 32; + jjCheckNAdd(4); + break; + default : break; + } + } while(i != startsAt); + } + else + { + int i2 = (curChar & 0xff) >> 6; + long l2 = 1L << (curChar & 077); + MatchLoop: do + { + switch(jjstateSet[--i]) + { + case 1: + if ((jjbitVec0[i2] & l2) != 0L) + jjAddStates(0, 1); + break; + default : break; + } + } while(i != startsAt); + } + if (kind != 0x7fffffff) + { + jjmatchedKind = kind; + jjmatchedPos = curPos; + kind = 0x7fffffff; + } + ++curPos; + if ((i = jjnewStateCnt) == (startsAt = 5 - (jjnewStateCnt = startsAt))) + return curPos; + try { curChar = input_stream.readChar(); } + catch(java.io.IOException e) { return curPos; } + } +} +private final int jjMoveStringLiteralDfa0_2() +{ + switch(curChar) + { + case 42: + return jjMoveStringLiteralDfa1_2(0x200L); + default : + return 1; + } +} +private final int jjMoveStringLiteralDfa1_2(long active0) +{ + try { curChar = input_stream.readChar(); } + catch(java.io.IOException e) { + return 1; + } + switch(curChar) + { + case 47: + if ((active0 & 0x200L) != 0L) + return jjStopAtPos(1, 9); + break; + default : + return 2; + } + return 2; +} +static final int[] jjnextStates = { + 1, 2, +}; +public static final String[] jjstrLiteralImages = { +"", null, null, null, null, null, null, null, null, null, null, +"\155\157\144\165\154\145", "\143\154\141\163\163", "\151\156\143\154\165\144\145", "\142\171\164\145", +"\142\157\157\154\145\141\156", "\151\156\164", "\154\157\156\147", "\146\154\157\141\164", +"\144\157\165\142\154\145", "\165\163\164\162\151\156\147", "\142\165\146\146\145\162", +"\166\145\143\164\157\162", "\155\141\160", "\173", "\175", "\74", "\76", "\73", "\54", "\56", null, null, }; +public static final String[] lexStateNames = { + "DEFAULT", + "WithinOneLineComment", + "WithinMultiLineComment", +}; +public static final int[] jjnewLexState = { + -1, -1, -1, -1, -1, 1, 0, -1, 2, 0, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, +}; +static final long[] jjtoToken = { + 0x1fffff801L, +}; +static final long[] jjtoSkip = { + 0x37eL, +}; +static final long[] jjtoSpecial = { + 0x360L, +}; +static final long[] jjtoMore = { + 0x480L, +}; +protected SimpleCharStream input_stream; +private final int[] jjrounds = new int[5]; +private final int[] jjstateSet = new int[10]; +StringBuffer image; +int jjimageLen; +int lengthOfMatch; +protected char curChar; +public RccTokenManager(SimpleCharStream stream){ + if (SimpleCharStream.staticFlag) + throw new Error("ERROR: Cannot use a static CharStream class with a non-static lexical analyzer."); + input_stream = stream; +} +public RccTokenManager(SimpleCharStream stream, int lexState){ + this(stream); + SwitchTo(lexState); +} +public void ReInit(SimpleCharStream stream) +{ + jjmatchedPos = jjnewStateCnt = 0; + curLexState = defaultLexState; + input_stream = stream; + ReInitRounds(); +} +private final void ReInitRounds() +{ + int i; + jjround = 0x80000001; + for (i = 5; i-- > 0;) + jjrounds[i] = 0x80000000; +} +public void ReInit(SimpleCharStream stream, int lexState) +{ + ReInit(stream); + SwitchTo(lexState); +} +public void SwitchTo(int lexState) +{ + if (lexState >= 3 || lexState < 0) + throw new TokenMgrError("Error: Ignoring invalid lexical state : " + lexState + ". State unchanged.", TokenMgrError.INVALID_LEXICAL_STATE); + else + curLexState = lexState; +} + +protected Token jjFillToken() +{ + Token t = Token.newToken(jjmatchedKind); + t.kind = jjmatchedKind; + String im = jjstrLiteralImages[jjmatchedKind]; + t.image = (im == null) ? input_stream.GetImage() : im; + t.beginLine = input_stream.getBeginLine(); + t.beginColumn = input_stream.getBeginColumn(); + t.endLine = input_stream.getEndLine(); + t.endColumn = input_stream.getEndColumn(); + return t; +} + +int curLexState = 0; +int defaultLexState = 0; +int jjnewStateCnt; +int jjround; +int jjmatchedPos; +int jjmatchedKind; + +public Token getNextToken() +{ + int kind; + Token specialToken = null; + Token matchedToken; + int curPos = 0; + + EOFLoop : + for (;;) + { + try + { + curChar = input_stream.BeginToken(); + } + catch(java.io.IOException e) + { + jjmatchedKind = 0; + matchedToken = jjFillToken(); + matchedToken.specialToken = specialToken; + return matchedToken; + } + image = null; + jjimageLen = 0; + + for (;;) + { + switch(curLexState) + { + case 0: + try { input_stream.backup(0); + while (curChar <= 32 && (0x100002600L & (1L << curChar)) != 0L) + curChar = input_stream.BeginToken(); + } + catch (java.io.IOException e1) { continue EOFLoop; } + jjmatchedKind = 0x7fffffff; + jjmatchedPos = 0; + curPos = jjMoveStringLiteralDfa0_0(); + break; + case 1: + jjmatchedKind = 0x7fffffff; + jjmatchedPos = 0; + curPos = jjMoveStringLiteralDfa0_1(); + if (jjmatchedPos == 0 && jjmatchedKind > 7) + { + jjmatchedKind = 7; + } + break; + case 2: + jjmatchedKind = 0x7fffffff; + jjmatchedPos = 0; + curPos = jjMoveStringLiteralDfa0_2(); + if (jjmatchedPos == 0 && jjmatchedKind > 10) + { + jjmatchedKind = 10; + } + break; + } + if (jjmatchedKind != 0x7fffffff) + { + if (jjmatchedPos + 1 < curPos) + input_stream.backup(curPos - jjmatchedPos - 1); + if ((jjtoToken[jjmatchedKind >> 6] & (1L << (jjmatchedKind & 077))) != 0L) + { + matchedToken = jjFillToken(); + matchedToken.specialToken = specialToken; + if (jjnewLexState[jjmatchedKind] != -1) + curLexState = jjnewLexState[jjmatchedKind]; + return matchedToken; + } + else if ((jjtoSkip[jjmatchedKind >> 6] & (1L << (jjmatchedKind & 077))) != 0L) + { + if ((jjtoSpecial[jjmatchedKind >> 6] & (1L << (jjmatchedKind & 077))) != 0L) + { + matchedToken = jjFillToken(); + if (specialToken == null) + specialToken = matchedToken; + else + { + matchedToken.specialToken = specialToken; + specialToken = (specialToken.next = matchedToken); + } + SkipLexicalActions(matchedToken); + } + else + SkipLexicalActions(null); + if (jjnewLexState[jjmatchedKind] != -1) + curLexState = jjnewLexState[jjmatchedKind]; + continue EOFLoop; + } + jjimageLen += jjmatchedPos + 1; + if (jjnewLexState[jjmatchedKind] != -1) + curLexState = jjnewLexState[jjmatchedKind]; + curPos = 0; + jjmatchedKind = 0x7fffffff; + try { + curChar = input_stream.readChar(); + continue; + } + catch (java.io.IOException e1) { } + } + int error_line = input_stream.getEndLine(); + int error_column = input_stream.getEndColumn(); + String error_after = null; + boolean EOFSeen = false; + try { input_stream.readChar(); input_stream.backup(1); } + catch (java.io.IOException e1) { + EOFSeen = true; + error_after = curPos <= 1 ? "" : input_stream.GetImage(); + if (curChar == '\n' || curChar == '\r') { + error_line++; + error_column = 0; + } + else + error_column++; + } + if (!EOFSeen) { + input_stream.backup(1); + error_after = curPos <= 1 ? "" : input_stream.GetImage(); + } + throw new TokenMgrError(EOFSeen, curLexState, error_line, error_column, error_after, curChar, TokenMgrError.LEXICAL_ERROR); + } + } +} + +void SkipLexicalActions(Token matchedToken) +{ + switch(jjmatchedKind) + { + default : + break; + } +} +} diff --git a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/jute/compiler/generated/SimpleCharStream.java b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/jute/compiler/generated/SimpleCharStream.java new file mode 100644 index 000000000..e38b4517b --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/jute/compiler/generated/SimpleCharStream.java @@ -0,0 +1,457 @@ +/* Generated By:JavaCC: Do not edit this line. SimpleCharStream.java Version 4.0 */ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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. + */ + +package org.apache.jute.compiler.generated; + +/** + * An implementation of interface CharStream, where the stream is assumed to + * contain only ASCII characters (without unicode processing). + */ + +public class SimpleCharStream +{ + public static final boolean staticFlag = false; + int bufsize; + int available; + int tokenBegin; + public int bufpos = -1; + protected int bufline[]; + protected int bufcolumn[]; + + protected int column = 0; + protected int line = 1; + + protected boolean prevCharIsCR = false; + protected boolean prevCharIsLF = false; + + protected java.io.Reader inputStream; + + protected char[] buffer; + protected int maxNextCharInd = 0; + protected int inBuf = 0; + protected int tabSize = 8; + + protected void setTabSize(int i) { tabSize = i; } + protected int getTabSize(int i) { return tabSize; } + + + protected void ExpandBuff(boolean wrapAround) + { + char[] newbuffer = new char[bufsize + 2048]; + int newbufline[] = new int[bufsize + 2048]; + int newbufcolumn[] = new int[bufsize + 2048]; + + try + { + if (wrapAround) + { + System.arraycopy(buffer, tokenBegin, newbuffer, 0, bufsize - tokenBegin); + System.arraycopy(buffer, 0, newbuffer, + bufsize - tokenBegin, bufpos); + buffer = newbuffer; + + System.arraycopy(bufline, tokenBegin, newbufline, 0, bufsize - tokenBegin); + System.arraycopy(bufline, 0, newbufline, bufsize - tokenBegin, bufpos); + bufline = newbufline; + + System.arraycopy(bufcolumn, tokenBegin, newbufcolumn, 0, bufsize - tokenBegin); + System.arraycopy(bufcolumn, 0, newbufcolumn, bufsize - tokenBegin, bufpos); + bufcolumn = newbufcolumn; + + maxNextCharInd = (bufpos += (bufsize - tokenBegin)); + } + else + { + System.arraycopy(buffer, tokenBegin, newbuffer, 0, bufsize - tokenBegin); + buffer = newbuffer; + + System.arraycopy(bufline, tokenBegin, newbufline, 0, bufsize - tokenBegin); + bufline = newbufline; + + System.arraycopy(bufcolumn, tokenBegin, newbufcolumn, 0, bufsize - tokenBegin); + bufcolumn = newbufcolumn; + + maxNextCharInd = (bufpos -= tokenBegin); + } + } + catch (Throwable t) + { + throw new Error(t.getMessage()); + } + + + bufsize += 2048; + available = bufsize; + tokenBegin = 0; + } + + protected void FillBuff() throws java.io.IOException + { + if (maxNextCharInd == available) + { + if (available == bufsize) + { + if (tokenBegin > 2048) + { + bufpos = maxNextCharInd = 0; + available = tokenBegin; + } + else if (tokenBegin < 0) + bufpos = maxNextCharInd = 0; + else + ExpandBuff(false); + } + else if (available > tokenBegin) + available = bufsize; + else if ((tokenBegin - available) < 2048) + ExpandBuff(true); + else + available = tokenBegin; + } + + int i; + try { + if ((i = inputStream.read(buffer, maxNextCharInd, + available - maxNextCharInd)) == -1) + { + inputStream.close(); + throw new java.io.IOException(); + } + else + maxNextCharInd += i; + return; + } + catch(java.io.IOException e) { + --bufpos; + backup(0); + if (tokenBegin == -1) + tokenBegin = bufpos; + throw e; + } + } + + public char BeginToken() throws java.io.IOException + { + tokenBegin = -1; + char c = readChar(); + tokenBegin = bufpos; + + return c; + } + + protected void UpdateLineColumn(char c) + { + column++; + + if (prevCharIsLF) + { + prevCharIsLF = false; + line += (column = 1); + } + else if (prevCharIsCR) + { + prevCharIsCR = false; + if (c == '\n') + { + prevCharIsLF = true; + } + else + line += (column = 1); + } + + switch (c) + { + case '\r' : + prevCharIsCR = true; + break; + case '\n' : + prevCharIsLF = true; + break; + case '\t' : + column--; + column += (tabSize - (column % tabSize)); + break; + default : + break; + } + + bufline[bufpos] = line; + bufcolumn[bufpos] = column; + } + + public char readChar() throws java.io.IOException + { + if (inBuf > 0) + { + --inBuf; + + if (++bufpos == bufsize) + bufpos = 0; + + return buffer[bufpos]; + } + + if (++bufpos >= maxNextCharInd) + FillBuff(); + + char c = buffer[bufpos]; + + UpdateLineColumn(c); + return (c); + } + + /** + * @deprecated + * @see #getEndColumn + */ + + public int getColumn() { + return bufcolumn[bufpos]; + } + + /** + * @deprecated + * @see #getEndLine + */ + + public int getLine() { + return bufline[bufpos]; + } + + public int getEndColumn() { + return bufcolumn[bufpos]; + } + + public int getEndLine() { + return bufline[bufpos]; + } + + public int getBeginColumn() { + return bufcolumn[tokenBegin]; + } + + public int getBeginLine() { + return bufline[tokenBegin]; + } + + public void backup(int amount) { + + inBuf += amount; + if ((bufpos -= amount) < 0) + bufpos += bufsize; + } + + public SimpleCharStream(java.io.Reader dstream, int startline, + int startcolumn, int buffersize) + { + inputStream = dstream; + line = startline; + column = startcolumn - 1; + + available = bufsize = buffersize; + buffer = new char[buffersize]; + bufline = new int[buffersize]; + bufcolumn = new int[buffersize]; + } + + public SimpleCharStream(java.io.Reader dstream, int startline, + int startcolumn) + { + this(dstream, startline, startcolumn, 4096); + } + + public SimpleCharStream(java.io.Reader dstream) + { + this(dstream, 1, 1, 4096); + } + public void ReInit(java.io.Reader dstream, int startline, + int startcolumn, int buffersize) + { + inputStream = dstream; + line = startline; + column = startcolumn - 1; + + if (buffer == null || buffersize != buffer.length) + { + available = bufsize = buffersize; + buffer = new char[buffersize]; + bufline = new int[buffersize]; + bufcolumn = new int[buffersize]; + } + prevCharIsLF = prevCharIsCR = false; + tokenBegin = inBuf = maxNextCharInd = 0; + bufpos = -1; + } + + public void ReInit(java.io.Reader dstream, int startline, + int startcolumn) + { + ReInit(dstream, startline, startcolumn, 4096); + } + + public void ReInit(java.io.Reader dstream) + { + ReInit(dstream, 1, 1, 4096); + } + public SimpleCharStream(java.io.InputStream dstream, String encoding, int startline, + int startcolumn, int buffersize) throws java.io.UnsupportedEncodingException + { + this(encoding == null ? new java.io.InputStreamReader(dstream) : new java.io.InputStreamReader(dstream, encoding), startline, startcolumn, buffersize); + } + + public SimpleCharStream(java.io.InputStream dstream, int startline, + int startcolumn, int buffersize) + { + this(new java.io.InputStreamReader(dstream), startline, startcolumn, buffersize); + } + + public SimpleCharStream(java.io.InputStream dstream, String encoding, int startline, + int startcolumn) throws java.io.UnsupportedEncodingException + { + this(dstream, encoding, startline, startcolumn, 4096); + } + + public SimpleCharStream(java.io.InputStream dstream, int startline, + int startcolumn) + { + this(dstream, startline, startcolumn, 4096); + } + + public SimpleCharStream(java.io.InputStream dstream, String encoding) throws java.io.UnsupportedEncodingException + { + this(dstream, encoding, 1, 1, 4096); + } + + public SimpleCharStream(java.io.InputStream dstream) + { + this(dstream, 1, 1, 4096); + } + + public void ReInit(java.io.InputStream dstream, String encoding, int startline, + int startcolumn, int buffersize) throws java.io.UnsupportedEncodingException + { + ReInit(encoding == null ? new java.io.InputStreamReader(dstream) : new java.io.InputStreamReader(dstream, encoding), startline, startcolumn, buffersize); + } + + public void ReInit(java.io.InputStream dstream, int startline, + int startcolumn, int buffersize) + { + ReInit(new java.io.InputStreamReader(dstream), startline, startcolumn, buffersize); + } + + public void ReInit(java.io.InputStream dstream, String encoding) throws java.io.UnsupportedEncodingException + { + ReInit(dstream, encoding, 1, 1, 4096); + } + + public void ReInit(java.io.InputStream dstream) + { + ReInit(dstream, 1, 1, 4096); + } + public void ReInit(java.io.InputStream dstream, String encoding, int startline, + int startcolumn) throws java.io.UnsupportedEncodingException + { + ReInit(dstream, encoding, startline, startcolumn, 4096); + } + public void ReInit(java.io.InputStream dstream, int startline, + int startcolumn) + { + ReInit(dstream, startline, startcolumn, 4096); + } + public String GetImage() + { + if (bufpos >= tokenBegin) + return new String(buffer, tokenBegin, bufpos - tokenBegin + 1); + else + return new String(buffer, tokenBegin, bufsize - tokenBegin) + + new String(buffer, 0, bufpos + 1); + } + + public char[] GetSuffix(int len) + { + char[] ret = new char[len]; + + if ((bufpos + 1) >= len) + System.arraycopy(buffer, bufpos - len + 1, ret, 0, len); + else + { + System.arraycopy(buffer, bufsize - (len - bufpos - 1), ret, 0, + len - bufpos - 1); + System.arraycopy(buffer, 0, ret, len - bufpos - 1, bufpos + 1); + } + + return ret; + } + + public void Done() + { + buffer = null; + bufline = null; + bufcolumn = null; + } + + /** + * Method to adjust line and column numbers for the start of a token. + */ + public void adjustBeginLineColumn(int newLine, int newCol) + { + int start = tokenBegin; + int len; + + if (bufpos >= tokenBegin) + { + len = bufpos - tokenBegin + inBuf + 1; + } + else + { + len = bufsize - tokenBegin + bufpos + 1 + inBuf; + } + + int i = 0, j = 0, k = 0; + int nextColDiff = 0, columnDiff = 0; + + while (i < len && + bufline[j = start % bufsize] == bufline[k = ++start % bufsize]) + { + bufline[j] = newLine; + nextColDiff = columnDiff + bufcolumn[k] - bufcolumn[j]; + bufcolumn[j] = newCol + columnDiff; + columnDiff = nextColDiff; + i++; + } + + if (i < len) + { + bufline[j] = newLine++; + bufcolumn[j] = newCol + columnDiff; + + while (i++ < len) + { + if (bufline[j = start % bufsize] != bufline[++start % bufsize]) + bufline[j] = newLine++; + else + bufline[j] = newLine; + } + } + + line = bufline[j]; + column = bufcolumn[j]; + } + +} diff --git a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/jute/compiler/generated/Token.java b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/jute/compiler/generated/Token.java new file mode 100644 index 000000000..3e7018b5d --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/jute/compiler/generated/Token.java @@ -0,0 +1,99 @@ +/* Generated By:JavaCC: Do not edit this line. Token.java Version 3.0 */ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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. + */ + +package org.apache.jute.compiler.generated; + +/** + * Describes the input token stream. + */ + +public class Token { + + /** + * An integer that describes the kind of this token. This numbering + * system is determined by JavaCCParser, and a table of these numbers is + * stored in the file ...Constants.java. + */ + public int kind; + + /** + * beginLine and beginColumn describe the position of the first character + * of this token; endLine and endColumn describe the position of the + * last character of this token. + */ + public int beginLine, beginColumn, endLine, endColumn; + + /** + * The string image of the token. + */ + public String image; + + /** + * A reference to the next regular (non-special) token from the input + * stream. If this is the last token from the input stream, or if the + * token manager has not read tokens beyond this one, this field is + * set to null. This is true only if this token is also a regular + * token. Otherwise, see below for a description of the contents of + * this field. + */ + public Token next; + + /** + * This field is used to access special tokens that occur prior to this + * token, but after the immediately preceding regular (non-special) token. + * If there are no such special tokens, this field is set to null. + * When there are more than one such special token, this field refers + * to the last of these special tokens, which in turn refers to the next + * previous special token through its specialToken field, and so on + * until the first special token (whose specialToken field is null). + * The next fields of special tokens refer to other special tokens that + * immediately follow it (without an intervening regular token). If there + * is no such token, this field is null. + */ + public Token specialToken; + + /** + * Returns the image. + */ + public String toString() + { + return image; + } + + /** + * Returns a new Token object, by default. However, if you want, you + * can create and return subclass objects based on the value of ofKind. + * Simply add the cases to the switch for all those special cases. + * For example, if you have a subclass of Token called IDToken that + * you want to create if ofKind is ID, simlpy add something like : + * + * case MyParserConstants.ID : return new IDToken(); + * + * to the following switch statement. Then you can cast matchedToken + * variable to the appropriate type and use it in your lexical actions. + */ + public static final Token newToken(int ofKind) + { + switch(ofKind) + { + default : return new Token(); + } + } + +} diff --git a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/jute/compiler/generated/TokenMgrError.java b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/jute/compiler/generated/TokenMgrError.java new file mode 100644 index 000000000..e2469628a --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/jute/compiler/generated/TokenMgrError.java @@ -0,0 +1,151 @@ +/* Generated By:JavaCC: Do not edit this line. TokenMgrError.java Version 3.0 */ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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. + */ + +package org.apache.jute.compiler.generated; + +public class TokenMgrError extends Error +{ + /* + * Ordinals for various reasons why an Error of this type can be thrown. + */ + + /** + * Lexical error occured. + */ + static final int LEXICAL_ERROR = 0; + + /** + * An attempt wass made to create a second instance of a static token manager. + */ + static final int STATIC_LEXER_ERROR = 1; + + /** + * Tried to change to an invalid lexical state. + */ + static final int INVALID_LEXICAL_STATE = 2; + + /** + * Detected (and bailed out of) an infinite loop in the token manager. + */ + static final int LOOP_DETECTED = 3; + + /** + * Indicates the reason why the exception is thrown. It will have + * one of the above 4 values. + */ + int errorCode; + + /** + * Replaces unprintable characters by their espaced (or unicode escaped) + * equivalents in the given string + */ + protected static final String addEscapes(String str) { + StringBuffer retval = new StringBuffer(); + char ch; + for (int i = 0; i < str.length(); i++) { + switch (str.charAt(i)) + { + case 0 : + continue; + case '\b': + retval.append("\\b"); + continue; + case '\t': + retval.append("\\t"); + continue; + case '\n': + retval.append("\\n"); + continue; + case '\f': + retval.append("\\f"); + continue; + case '\r': + retval.append("\\r"); + continue; + case '\"': + retval.append("\\\""); + continue; + case '\'': + retval.append("\\\'"); + continue; + case '\\': + retval.append("\\\\"); + continue; + default: + if ((ch = str.charAt(i)) < 0x20 || ch > 0x7e) { + String s = "0000" + Integer.toString(ch, 16); + retval.append("\\u" + s.substring(s.length() - 4, s.length())); + } else { + retval.append(ch); + } + continue; + } + } + return retval.toString(); + } + + /** + * Returns a detailed message for the Error when it is thrown by the + * token manager to indicate a lexical error. + * Parameters : + * EOFSeen : indicates if EOF caused the lexicl error + * curLexState : lexical state in which this error occured + * errorLine : line number when the error occured + * errorColumn : column number when the error occured + * errorAfter : prefix that was seen before this error occured + * curchar : the offending character + * Note: You can customize the lexical error message by modifying this method. + */ + protected static String LexicalError(boolean EOFSeen, int lexState, int errorLine, int errorColumn, String errorAfter, char curChar) { + return("Lexical error at line " + + errorLine + ", column " + + errorColumn + ". Encountered: " + + (EOFSeen ? " " : ("\"" + addEscapes(String.valueOf(curChar)) + "\"") + " (" + (int)curChar + "), ") + + "after : \"" + addEscapes(errorAfter) + "\""); + } + + /** + * You can also modify the body of this method to customize your error messages. + * For example, cases like LOOP_DETECTED and INVALID_LEXICAL_STATE are not + * of end-users concern, so you can return something like : + * + * "Internal Error : Please file a bug report .... " + * + * from this method for such cases in the release version of your parser. + */ + public String getMessage() { + return super.getMessage(); + } + + /* + * Constructors of various flavors follow. + */ + + public TokenMgrError() { + } + + public TokenMgrError(String message, int reason) { + super(message); + errorCode = reason; + } + + public TokenMgrError(boolean EOFSeen, int lexState, int errorLine, int errorColumn, String errorAfter, char curChar, int reason) { + this(LexicalError(EOFSeen, lexState, errorLine, errorColumn, errorAfter, curChar), reason); + } +} diff --git a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/jute/compiler/generated/package.html b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/jute/compiler/generated/package.html new file mode 100644 index 000000000..8ef8a8c7d --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/jute/compiler/generated/package.html @@ -0,0 +1,28 @@ + + + + + + Hadoop Record Compiler: Parser + + + This package contains code generated by JavaCC from the + Hadoop record syntax file rcc.jj. For details about the + record file syntax please @see org.apache.hadoop.record. + + diff --git a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/jute/compiler/generated/rcc.jj b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/jute/compiler/generated/rcc.jj new file mode 100644 index 000000000..94d4f42f6 --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/jute/compiler/generated/rcc.jj @@ -0,0 +1,374 @@ +options { +STATIC=false; +} + +PARSER_BEGIN(Rcc) +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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. + */ + +package org.apache.jute.compiler.generated; + +import org.apache.jute.compiler.*; +import java.util.ArrayList; +import java.util.Hashtable; +import java.io.File; +import java.io.FileReader; +import java.io.FileNotFoundException; +import java.io.IOException; + +@SuppressWarnings("unused") +public class Rcc { + private static Hashtable recTab = new Hashtable(); + private static String curDir = System.getProperty("user.dir"); + private static String curFileName; + private static String curModuleName; + + public static void main(String args[]) { + String language = "java"; + ArrayList recFiles = new ArrayList(); + JFile curFile=null; + + for (int i=0; i(); + return parser.Input(); + } finally { + try { + reader.close(); + } catch (IOException e) { + } + } + } +} + +PARSER_END(Rcc) + +SKIP : +{ + " " +| "\t" +| "\n" +| "\r" +} + +SPECIAL_TOKEN : +{ + "//" : WithinOneLineComment +} + + SPECIAL_TOKEN : +{ + <("\n" | "\r" | "\r\n" )> : DEFAULT +} + + MORE : +{ + <~[]> +} + +SPECIAL_TOKEN : +{ + "/*" : WithinMultiLineComment +} + + SPECIAL_TOKEN : +{ + "*/" : DEFAULT +} + + MORE : +{ + <~[]> +} + +TOKEN : +{ + +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| "> +| +| +| +| +| +} + +JFile Input() : +{ + ArrayList ilist = new ArrayList(); + ArrayList rlist = new ArrayList(); + JFile i; + ArrayList l; +} +{ + ( + i = Include() + { ilist.add(i); } + | l = Module() + { rlist.addAll(l); } + )+ + + { return new JFile(curFileName, ilist, rlist); } +} + +JFile Include() : +{ + String fname; + Token t; +} +{ + + t = + { + JFile ret = null; + fname = t.image.replaceAll("^\"", "").replaceAll("\"$",""); + File file = new File(curDir, fname); + String tmpDir = curDir; + String tmpFile = curFileName; + curDir = file.getParent(); + curFileName = file.getName(); + try { + FileReader reader = new FileReader(file); + Rcc parser = new Rcc(reader); + try { + ret = parser.Input(); + System.out.println(fname + " Parsed Successfully"); + } catch (ParseException e) { + System.out.println(e.toString()); + System.exit(1); + } + try { + reader.close(); + } catch (IOException e) { + } + } catch (FileNotFoundException e) { + System.out.println("File " + fname + + " Not found."); + System.exit(1); + } + curDir = tmpDir; + curFileName = tmpFile; + return ret; + } +} + +ArrayList Module() : +{ + String mName; + ArrayList rlist; +} +{ + + mName = ModuleName() + { curModuleName = mName; } + + rlist = RecordList() + + { return rlist; } +} + +String ModuleName() : +{ + String name = ""; + Token t; +} +{ + t = + { name += t.image; } + ( + + t = + { name += "." + t.image; } + )* + { return name; } +} + +ArrayList RecordList() : +{ + ArrayList rlist = new ArrayList(); + JRecord r; +} +{ + ( + r = Record() + { rlist.add(r); } + )+ + { return rlist; } +} + +JRecord Record() : +{ + String rname; + ArrayList flist = new ArrayList(); + Token t; + JField f; +} +{ + + t = + { rname = t.image; } + + ( + f = Field() + { flist.add(f); } + + )+ + + { + String fqn = curModuleName + "." + rname; + JRecord r = new JRecord(fqn, flist); + recTab.put(fqn, r); + return r; + } +} + +JField Field() : +{ + JType jt; + Token t; +} +{ + jt = Type() + t = + { return new JField(jt, t.image); } +} + +JType Type() : +{ + JType jt; + Token t; + String rname; +} +{ + jt = Map() + { return jt; } +| jt = Vector() + { return jt; } +| + { return new JByte(); } +| + { return new JBoolean(); } +| + { return new JInt(); } +| + { return new JLong(); } +| + { return new JFloat(); } +| + { return new JDouble(); } +| + { return new JString(); } +| + { return new JBuffer(); } +| rname = ModuleName() + { + if (rname.indexOf('.', 0) < 0) { + rname = curModuleName + "." + rname; + } + JRecord r = recTab.get(rname); + if (r == null) { + System.out.println("Type " + rname + " not known. Exiting."); + System.exit(1); + } + return r; + } +} + +JMap Map() : +{ + JType jt1; + JType jt2; +} +{ + + + jt1 = Type() + + jt2 = Type() + + { return new JMap(jt1, jt2); } +} + +JVector Vector() : +{ + JType jt; +} +{ + + + jt = Type() + + { return new JVector(jt); } +} diff --git a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/jute/compiler/package.html b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/jute/compiler/package.html new file mode 100644 index 000000000..03bdb1bbb --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/jute/compiler/package.html @@ -0,0 +1,30 @@ + + + + + + Hadoop Record Compiler + + + This package contains classes needed for code generation + from the hadoop record compiler. CppGenerator and JavaGenerator + are the main entry points from the parser. There are classes + corrsponding to every primitive type and compound type + included in Hadoop record I/O syntax. + + diff --git a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/jute/package.html b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/jute/package.html new file mode 100644 index 000000000..531a6e37a --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/jute/package.html @@ -0,0 +1,801 @@ + + + + + + Hadoop Record I/O + + + Hadoop record I/O contains classes and a record description language + translator for simplifying serialization and deserialization of records in a + language-neutral manner. + +

      Introduction

      + + Software systems of any significant complexity require mechanisms for data +interchange with the outside world. These interchanges typically involve the +marshaling and unmarshaling of logical units of data to and from data streams +(files, network connections, memory buffers etc.). Applications usually have +some code for serializing and deserializing the data types that they manipulate +embedded in them. The work of serialization has several features that make +automatic code generation for it worthwhile. Given a particular output encoding +(binary, XML, etc.), serialization of primitive types and simple compositions +of primitives (structs, vectors etc.) is a very mechanical task. Manually +written serialization code can be susceptible to bugs especially when records +have a large number of fields or a record definition changes between software +versions. Lastly, it can be very useful for applications written in different +programming languages to be able to share and interchange data. This can be +made a lot easier by describing the data records manipulated by these +applications in a language agnostic manner and using the descriptions to derive +implementations of serialization in multiple target languages. + +This document describes Hadoop Record I/O, a mechanism that is aimed +at +
        +
      • enabling the specification of simple serializable data types (records) +
      • enabling the generation of code in multiple target languages for +marshaling and unmarshaling such types +
      • providing target language specific support that will enable application +programmers to incorporate generated code into their applications +
      + +The goals of Hadoop Record I/O are similar to those of mechanisms such as XDR, +ASN.1, PADS and ICE. While these systems all include a DDL that enables +the specification of most record types, they differ widely in what else they +focus on. The focus in Hadoop Record I/O is on data marshaling and +multi-lingual support. We take a translator-based approach to serialization. +Hadoop users have to describe their data in a simple data description +language. The Hadoop DDL translator rcc generates code that users +can invoke in order to read/write their data from/to simple stream +abstractions. Next we list explicitly some of the goals and non-goals of +Hadoop Record I/O. + + +

      Goals

      + +
        +
      • Support for commonly used primitive types. Hadoop should include as +primitives commonly used builtin types from programming languages we intend to +support. + +
      • Support for common data compositions (including recursive compositions). +Hadoop should support widely used composite types such as structs and +vectors. + +
      • Code generation in multiple target languages. Hadoop should be capable of +generating serialization code in multiple target languages and should be +easily extensible to new target languages. The initial target languages are +C++ and Java. + +
      • Support for generated target languages. Hadooop should include support +in the form of headers, libraries, packages for supported target languages +that enable easy inclusion and use of generated code in applications. + +
      • Support for multiple output encodings. Candidates include +packed binary, comma-separated text, XML etc. + +
      • Support for specifying record types in a backwards/forwards compatible +manner. This will probably be in the form of support for optional fields in +records. This version of the document does not include a description of the +planned mechanism, we intend to include it in the next iteration. + +
      + +

      Non-Goals

      + +
        +
      • Serializing existing arbitrary C++ classes. +
      • Serializing complex data structures such as trees, linked lists etc. +
      • Built-in indexing schemes, compression, or check-sums. +
      • Dynamic construction of objects from an XML schema. +
      + +The remainder of this document describes the features of Hadoop record I/O +in more detail. Section 2 describes the data types supported by the system. +Section 3 lays out the DDL syntax with some examples of simple records. +Section 4 describes the process of code generation with rcc. Section 5 +describes target language mappings and support for Hadoop types. We include a +fairly complete description of C++ mappings with intent to include Java and +others in upcoming iterations of this document. The last section talks about +supported output encodings. + + +

      Data Types and Streams

      + +This section describes the primitive and composite types supported by Hadoop. +We aim to support a set of types that can be used to simply and efficiently +express a wide range of record types in different programming languages. + +

      Primitive Types

      + +For the most part, the primitive types of Hadoop map directly to primitive +types in high level programming languages. Special cases are the +ustring (a Unicode string) and buffer types, which we believe +find wide use and which are usually implemented in library code and not +available as language built-ins. Hadoop also supplies these via library code +when a target language built-in is not present and there is no widely +adopted "standard" implementation. The complete list of primitive types is: + +
        +
      • byte: An 8-bit unsigned integer. +
      • boolean: A boolean value. +
      • int: A 32-bit signed integer. +
      • long: A 64-bit signed integer. +
      • float: A single precision floating point number as described by + IEEE-754. +
      • double: A double precision floating point number as described by + IEEE-754. +
      • ustring: A string consisting of Unicode characters. +
      • buffer: An arbitrary sequence of bytes. +
      + + +

      Composite Types

      +Hadoop supports a small set of composite types that enable the description +of simple aggregate types and containers. A composite type is serialized +by sequentially serializing it constituent elements. The supported +composite types are: + +
        + +
      • record: An aggregate type like a C-struct. This is a list of +typed fields that are together considered a single unit of data. A record +is serialized by sequentially serializing its constituent fields. In addition +to serialization a record has comparison operations (equality and less-than) +implemented for it, these are defined as memberwise comparisons. + +
      • vector: A sequence of entries of the same data type, primitive +or composite. + +
      • map: An associative container mapping instances of a key type to +instances of a value type. The key and value types may themselves be primitive +or composite types. + +
      + +

      Streams

      + +Hadoop generates code for serializing and deserializing record types to +abstract streams. For each target language Hadoop defines very simple input +and output stream interfaces. Application writers can usually develop +concrete implementations of these by putting a one method wrapper around +an existing stream implementation. + + +

      DDL Syntax and Examples

      + +We now describe the syntax of the Hadoop data description language. This is +followed by a few examples of DDL usage. + +

      Hadoop DDL Syntax

      + +
      
      +recfile = *include module *record
      +include = "include" path
      +path = (relative-path / absolute-path)
      +module = "module" module-name
      +module-name = name *("." name)
      +record := "class" name "{" 1*(field) "}"
      +field := type name ";"
      +name :=  ALPHA (ALPHA / DIGIT / "_" )*
      +type := (ptype / ctype)
      +ptype := ("byte" / "boolean" / "int" |
      +          "long" / "float" / "double"
      +          "ustring" / "buffer")
      +ctype := (("vector" "<" type ">") /
      +          ("map" "<" type "," type ">" ) ) / name)
      +
      + +A DDL file describes one or more record types. It begins with zero or +more include declarations, a single mandatory module declaration +followed by zero or more class declarations. The semantics of each of +these declarations are described below: + +
        + +
      • include: An include declaration specifies a DDL file to be +referenced when generating code for types in the current DDL file. Record types +in the current compilation unit may refer to types in all included files. +File inclusion is recursive. An include does not trigger code +generation for the referenced file. + +
      • module: Every Hadoop DDL file must have a single module +declaration that follows the list of includes and precedes all record +declarations. A module declaration identifies a scope within which +the names of all types in the current file are visible. Module names are +mapped to C++ namespaces, Java packages etc. in generated code. + +
      • class: Records types are specified through class +declarations. A class declaration is like a Java class declaration. +It specifies a named record type and a list of fields that constitute records +of the type. Usage is illustrated in the following examples. + +
      + +

      Examples

      + +
        +
      • A simple DDL file links.jr with just one record declaration. +
        
        +module links {
        +    class Link {
        +        ustring URL;
        +        boolean isRelative;
        +        ustring anchorText;
        +    };
        +}
        +
        + +
      • A DDL file outlinks.jr which includes another +
        
        +include "links.jr"
        +
        +module outlinks {
        +    class OutLinks {
        +        ustring baseURL;
        +        vector outLinks;
        +    };
        +}
        +
        +
      + +

      Code Generation

      + +The Hadoop translator is written in Java. Invocation is done by executing a +wrapper shell script named named rcc. It takes a list of +record description files as a mandatory argument and an +optional language argument (the default is Java) --language or +-l. Thus a typical invocation would look like: +
      
      +$ rcc -l C++  ...
      +
      + + +

      Target Language Mappings and Support

      + +For all target languages, the unit of code generation is a record type. +For each record type, Hadoop generates code for serialization and +deserialization, record comparison and access to record members. + +

      C++

      + +Support for including Hadoop generated C++ code in applications comes in the +form of a header file recordio.hh which needs to be included in source +that uses Hadoop types and a library librecordio.a which applications need +to be linked with. The header declares the Hadoop C++ namespace which defines +appropriate types for the various primitives, the basic interfaces for +records and streams and enumerates the supported serialization encodings. +Declarations of these interfaces and a description of their semantics follow: + +
      
      +namespace hadoop {
      +
      +  enum RecFormat { kBinary, kXML, kCSV };
      +
      +  class InStream {
      +  public:
      +    virtual ssize_t read(void *buf, size_t n) = 0;
      +  };
      +
      +  class OutStream {
      +  public:
      +    virtual ssize_t write(const void *buf, size_t n) = 0;
      +  };
      +
      +  class IOError : public runtime_error {
      +  public:
      +    explicit IOError(const std::string& msg);
      +  };
      +
      +  class IArchive;
      +  class OArchive;
      +
      +  class RecordReader {
      +  public:
      +    RecordReader(InStream& in, RecFormat fmt);
      +    virtual ~RecordReader(void);
      +
      +    virtual void read(Record& rec);
      +  };
      +
      +  class RecordWriter {
      +  public:
      +    RecordWriter(OutStream& out, RecFormat fmt);
      +    virtual ~RecordWriter(void);
      +
      +    virtual void write(Record& rec);
      +  };
      +
      +
      +  class Record {
      +  public:
      +    virtual std::string type(void) const = 0;
      +    virtual std::string signature(void) const = 0;
      +  protected:
      +    virtual bool validate(void) const = 0;
      +
      +    virtual void
      +    serialize(OArchive& oa, const std::string& tag) const = 0;
      +
      +    virtual void
      +    deserialize(IArchive& ia, const std::string& tag) = 0;
      +  };
      +}
      +
      + +
        + +
      • RecFormat: An enumeration of the serialization encodings supported +by this implementation of Hadoop. + +
      • InStream: A simple abstraction for an input stream. This has a +single public read method that reads n bytes from the stream into +the buffer buf. Has the same semantics as a blocking read system +call. Returns the number of bytes read or -1 if an error occurs. + +
      • OutStream: A simple abstraction for an output stream. This has a +single write method that writes n bytes to the stream from the +buffer buf. Has the same semantics as a blocking write system +call. Returns the number of bytes written or -1 if an error occurs. + +
      • RecordReader: A RecordReader reads records one at a time from +an underlying stream in a specified record format. The reader is instantiated +with a stream and a serialization format. It has a read method that +takes an instance of a record and deserializes the record from the stream. + +
      • RecordWriter: A RecordWriter writes records one at a +time to an underlying stream in a specified record format. The writer is +instantiated with a stream and a serialization format. It has a +write method that takes an instance of a record and serializes the +record to the stream. + +
      • Record: The base class for all generated record types. This has two +public methods type and signature that return the typename and the +type signature of the record. + +
      + +Two files are generated for each record file (note: not for each record). If a +record file is named "name.jr", the generated files are +"name.jr.cc" and "name.jr.hh" containing serialization +implementations and record type declarations respectively. + +For each record in the DDL file, the generated header file will contain a +class definition corresponding to the record type, method definitions for the +generated type will be present in the '.cc' file. The generated class will +inherit from the abstract class hadoop::Record. The DDL files +module declaration determines the namespace the record belongs to. +Each '.' delimited token in the module declaration results in the +creation of a namespace. For instance, the declaration module docs.links +results in the creation of a docs namespace and a nested +docs::links namespace. In the preceding examples, the Link class +is placed in the links namespace. The header file corresponding to +the links.jr file will contain: + +
      
      +namespace links {
      +  class Link : public hadoop::Record {
      +    // ....
      +  };
      +};
      +
      + +Each field within the record will cause the generation of a private member +declaration of the appropriate type in the class declaration, and one or more +acccessor methods. The generated class will implement the serialize and +deserialize methods defined in hadoop::Record+. It will also +implement the inspection methods type and signature from +hadoop::Record. A default constructor and virtual destructor will also +be generated. Serialization code will read/write records into streams that +implement the hadoop::InStream and the hadoop::OutStream interfaces. + +For each member of a record an accessor method is generated that returns +either the member or a reference to the member. For members that are returned +by value, a setter method is also generated. This is true for primitive +data members of the types byte, int, long, boolean, float and +double. For example, for a int field called MyField the folowing +code is generated. + +
      
      +...
      +private:
      +  int32_t mMyField;
      +  ...
      +public:
      +  int32_t getMyField(void) const {
      +    return mMyField;
      +  };
      +
      +  void setMyField(int32_t m) {
      +    mMyField = m;
      +  };
      +  ...
      +
      + +For a ustring or buffer or composite field. The generated code +only contains accessors that return a reference to the field. A const +and a non-const accessor are generated. For example: + +
      
      +...
      +private:
      +  std::string mMyBuf;
      +  ...
      +public:
      +
      +  std::string& getMyBuf() {
      +    return mMyBuf;
      +  };
      +
      +  const std::string& getMyBuf() const {
      +    return mMyBuf;
      +  };
      +  ...
      +
      + +

      Examples

      + +Suppose the inclrec.jr file contains: +
      
      +module inclrec {
      +    class RI {
      +        int      I32;
      +        double   D;
      +        ustring  S;
      +    };
      +}
      +
      + +and the testrec.jr file contains: + +
      
      +include "inclrec.jr"
      +module testrec {
      +    class R {
      +        vector VF;
      +        RI            Rec;
      +        buffer        Buf;
      +    };
      +}
      +
      + +Then the invocation of rcc such as: +
      
      +$ rcc -l c++ inclrec.jr testrec.jr
      +
      +will result in generation of four files: +inclrec.jr.{cc,hh} and testrec.jr.{cc,hh}. + +The inclrec.jr.hh will contain: + +
      
      +#ifndef _INCLREC_JR_HH_
      +#define _INCLREC_JR_HH_
      +
      +#include "recordio.hh"
      +
      +namespace inclrec {
      +  
      +  class RI : public hadoop::Record {
      +
      +  private:
      +
      +    int32_t      mI32;
      +    double       mD;
      +    std::string  mS;
      +
      +  public:
      +
      +    RI(void);
      +    virtual ~RI(void);
      +
      +    virtual bool operator==(const RI& peer) const;
      +    virtual bool operator<(const RI& peer) const;
      +
      +    virtual int32_t getI32(void) const { return mI32; }
      +    virtual void setI32(int32_t v) { mI32 = v; }
      +
      +    virtual double getD(void) const { return mD; }
      +    virtual void setD(double v) { mD = v; }
      +
      +    virtual std::string& getS(void) const { return mS; }
      +    virtual const std::string& getS(void) const { return mS; }
      +
      +    virtual std::string type(void) const;
      +    virtual std::string signature(void) const;
      +
      +  protected:
      +
      +    virtual void serialize(hadoop::OArchive& a) const;
      +    virtual void deserialize(hadoop::IArchive& a);
      +
      +    virtual bool validate(void);
      +  };
      +} // end namespace inclrec
      +
      +#endif /* _INCLREC_JR_HH_ */
      +
      +
      + +The testrec.jr.hh file will contain: + + +
      
      +
      +#ifndef _TESTREC_JR_HH_
      +#define _TESTREC_JR_HH_
      +
      +#include "inclrec.jr.hh"
      +
      +namespace testrec {
      +  class R : public hadoop::Record {
      +
      +  private:
      +
      +    std::vector mVF;
      +    inclrec::RI        mRec;
      +    std::string        mBuf;
      +
      +  public:
      +
      +    R(void);
      +    virtual ~R(void);
      +
      +    virtual bool operator==(const R& peer) const;
      +    virtual bool operator<(const R& peer) const;
      +
      +    virtual std::vector& getVF(void) const;
      +    virtual const std::vector& getVF(void) const;
      +
      +    virtual std::string& getBuf(void) const ;
      +    virtual const std::string& getBuf(void) const;
      +
      +    virtual inclrec::RI& getRec(void) const;
      +    virtual const inclrec::RI& getRec(void) const;
      +    
      +    virtual bool serialize(hadoop::OutArchive& a) const;
      +    virtual bool deserialize(hadoop::InArchive& a);
      +    
      +    virtual std::string type(void) const;
      +    virtual std::string signature(void) const;
      +  };
      +}; // end namespace testrec
      +#endif /* _TESTREC_JR_HH_ */
      +
      +
      + +

      Java

      + +Code generation for Java is similar to that for C++. A Java class is generated +for each record type with private members corresponding to the fields. Getters +and setters for fields are also generated. Some differences arise in the +way comparison is expressed and in the mapping of modules to packages and +classes to files. For equality testing, an equals method is generated +for each record type. As per Java requirements a hashCode method is also +generated. For comparison a compareTo method is generated for each +record type. This has the semantics as defined by the Java Comparable +interface, that is, the method returns a negative integer, zero, or a positive +integer as the invoked object is less than, equal to, or greater than the +comparison parameter. + +A .java file is generated per record type as opposed to per DDL +file as in C++. The module declaration translates to a Java +package declaration. The module name maps to an identical Java package +name. In addition to this mapping, the DDL compiler creates the appropriate +directory hierarchy for the package and places the generated .java +files in the correct directories. + +

      Mapping Summary

      + +
      
      +DDL Type        C++ Type            Java Type 
      +
      +boolean         bool                boolean
      +byte            int8_t              byte
      +int             int32_t             int
      +long            int64_t             long
      +float           float               float
      +double          double              double
      +ustring         std::string         Text
      +buffer          std::string         java.io.ByteArrayOutputStream
      +class type      class type          class type
      +vector    std::vector   java.util.ArrayList
      +map  std::map java.util.TreeMap
      +
      + +

      Data encodings

      + +This section describes the format of the data encodings supported by Hadoop. +Currently, three data encodings are supported, namely binary, CSV and XML. + +

      Binary Serialization Format

      + +The binary data encoding format is fairly dense. Serialization of composite +types is simply defined as a concatenation of serializations of the constituent +elements (lengths are included in vectors and maps). + +Composite types are serialized as follows: +
        +
      • class: Sequence of serialized members. +
      • vector: The number of elements serialized as an int. Followed by a +sequence of serialized elements. +
      • map: The number of key value pairs serialized as an int. Followed +by a sequence of serialized (key,value) pairs. +
      + +Serialization of primitives is more interesting, with a zero compression +optimization for integral types and normalization to UTF-8 for strings. +Primitive types are serialized as follows: + +
        +
      • byte: Represented by 1 byte, as is. +
      • boolean: Represented by 1-byte (0 or 1) +
      • int/long: Integers and longs are serialized zero compressed. +Represented as 1-byte if -120 <= value < 128. Otherwise, serialized as a +sequence of 2-5 bytes for ints, 2-9 bytes for longs. The first byte represents +the number of trailing bytes, N, as the negative number (-120-N). For example, +the number 1024 (0x400) is represented by the byte sequence 'x86 x04 x00'. +This doesn't help much for 4-byte integers but does a reasonably good job with +longs without bit twiddling. +
      • float/double: Serialized in IEEE 754 single and double precision +format in network byte order. This is the format used by Java. +
      • ustring: Serialized as 4-byte zero compressed length followed by +data encoded as UTF-8. Strings are normalized to UTF-8 regardless of native +language representation. +
      • buffer: Serialized as a 4-byte zero compressed length followed by the +raw bytes in the buffer. +
      + + +

      CSV Serialization Format

      + +The CSV serialization format has a lot more structure than the "standard" +Excel CSV format, but we believe the additional structure is useful because + +
        +
      • it makes parsing a lot easier without detracting too much from legibility +
      • the delimiters around composites make it obvious when one is reading a +sequence of Hadoop records +
      + +Serialization formats for the various types are detailed in the grammar that +follows. The notable feature of the formats is the use of delimiters for +indicating the certain field types. + +
        +
      • A string field begins with a single quote ('). +
      • A buffer field begins with a sharp (#). +
      • A class, vector or map begins with 's{', 'v{' or 'm{' respectively and +ends with '}'. +
      + +The CSV format can be described by the following grammar: + +
      
      +record = primitive / struct / vector / map
      +primitive = boolean / int / long / float / double / ustring / buffer
      +
      +boolean = "T" / "F"
      +int = ["-"] 1*DIGIT
      +long = ";" ["-"] 1*DIGIT
      +float = ["-"] 1*DIGIT "." 1*DIGIT ["E" / "e" ["-"] 1*DIGIT]
      +double = ";" ["-"] 1*DIGIT "." 1*DIGIT ["E" / "e" ["-"] 1*DIGIT]
      +
      +ustring = "'" *(UTF8 char except NULL, LF, % and , / "%00" / "%0a" / "%25" / "%2c" )
      +
      +buffer = "#" *(BYTE except NULL, LF, % and , / "%00" / "%0a" / "%25" / "%2c" )
      +
      +struct = "s{" record *("," record) "}"
      +vector = "v{" [record *("," record)] "}"
      +map = "m{" [*(record "," record)] "}"
      +
      + +

      XML Serialization Format

      + +The XML serialization format is the same used by Apache XML-RPC +(http://ws.apache.org/xmlrpc/types.html). This is an extension of the original +XML-RPC format and adds some additional data types. All record I/O types are +not directly expressible in this format, and access to a DDL is required in +order to convert these to valid types. All types primitive or composite are +represented by <value> elements. The particular XML-RPC type is +indicated by a nested element in the <value> element. The encoding for +records is always UTF-8. Primitive types are serialized as follows: + +
        +
      • byte: XML tag <ex:i1>. Values: 1-byte unsigned +integers represented in US-ASCII +
      • boolean: XML tag <boolean>. Values: "0" or "1" +
      • int: XML tags <i4> or <int>. Values: 4-byte +signed integers represented in US-ASCII. +
      • long: XML tag <ex:i8>. Values: 8-byte signed integers +represented in US-ASCII. +
      • float: XML tag <ex:float>. Values: Single precision +floating point numbers represented in US-ASCII. +
      • double: XML tag <double>. Values: Double precision +floating point numbers represented in US-ASCII. +
      • ustring: XML tag <;string>. Values: String values +represented as UTF-8. XML does not permit all Unicode characters in literal +data. In particular, NULLs and control chars are not allowed. Additionally, +XML processors are required to replace carriage returns with line feeds and to +replace CRLF sequences with line feeds. Programming languages that we work +with do not impose these restrictions on string types. To work around these +restrictions, disallowed characters and CRs are percent escaped in strings. +The '%' character is also percent escaped. +
      • buffer: XML tag <string&>. Values: Arbitrary binary +data. Represented as hexBinary, each byte is replaced by its 2-byte +hexadecimal representation. +
      + +Composite types are serialized as follows: + +
        +
      • class: XML tag <struct>. A struct is a sequence of +<member> elements. Each <member> element has a <name> +element and a <value> element. The <name> is a string that must +match /[a-zA-Z][a-zA-Z0-9_]*/. The value of the member is represented +by a <value> element. + +
      • vector: XML tag <array<. An <array> contains a +single <data> element. The <data> element is a sequence of +<value> elements each of which represents an element of the vector. + +
      • map: XML tag <array>. Same as vector. + +
      + +For example: + +
      
      +class {
      +  int           MY_INT;            // value 5
      +  vector MY_VEC;            // values 0.1, -0.89, 2.45e4
      +  buffer        MY_BUF;            // value '\00\n\tabc%'
      +}
      +
      + +is serialized as + +
      
      +<value>
      +  <struct>
      +    <member>
      +      <name>MY_INT</name>
      +      <value><i4>5</i4></value>
      +    </member>
      +    <member>
      +      <name>MY_VEC</name>
      +      <value>
      +        <array>
      +          <data>
      +            <value><ex:float>0.1</ex:float></value>
      +            <value><ex:float>-0.89</ex:float></value>
      +            <value><ex:float>2.45e4</ex:float></value>
      +          </data>
      +        </array>
      +      </value>
      +    </member>
      +    <member>
      +      <name>MY_BUF</name>
      +      <value><string>%00\n\tabc%25</string></value>
      +    </member>
      +  </struct>
      +</value> 
      +
      + + + diff --git a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/AsyncCallback.java b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/AsyncCallback.java new file mode 100644 index 000000000..30377238b --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/AsyncCallback.java @@ -0,0 +1,57 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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. + */ +package org.apache.zookeeper; + +import java.util.List; + +import org.apache.zookeeper.data.ACL; +import org.apache.zookeeper.data.Stat; + +public interface AsyncCallback { + interface StatCallback extends AsyncCallback { + public void processResult(int rc, String path, Object ctx, Stat stat); + } + + interface DataCallback extends AsyncCallback { + public void processResult(int rc, String path, Object ctx, byte data[], + Stat stat); + } + + interface ACLCallback extends AsyncCallback { + public void processResult(int rc, String path, Object ctx, + List acl, Stat stat); + } + + interface ChildrenCallback extends AsyncCallback { + public void processResult(int rc, String path, Object ctx, + List children); + } + + interface Children2Callback extends AsyncCallback { + public void processResult(int rc, String path, Object ctx, + List children, Stat stat); + } + + interface StringCallback extends AsyncCallback { + public void processResult(int rc, String path, Object ctx, String name); + } + + interface VoidCallback extends AsyncCallback { + public void processResult(int rc, String path, Object ctx); + } +} diff --git a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/ClientCnxn.java b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/ClientCnxn.java new file mode 100644 index 000000000..6b230d584 --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/ClientCnxn.java @@ -0,0 +1,1412 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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. + */ + +package org.apache.zookeeper; + +import java.io.BufferedReader; +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.io.InputStreamReader; +import java.lang.Thread.UncaughtExceptionHandler; +import java.net.ConnectException; +import java.net.InetSocketAddress; +import java.net.Socket; +import java.net.SocketAddress; +import java.nio.ByteBuffer; +import java.util.LinkedList; +import java.util.List; +import java.util.Random; +import java.util.Set; +import java.util.concurrent.CopyOnWriteArraySet; +import java.util.concurrent.LinkedBlockingQueue; + +import javax.security.auth.login.LoginException; +import javax.security.sasl.SaslException; + +import org.apache.jute.BinaryInputArchive; +import org.apache.jute.BinaryOutputArchive; +import org.apache.jute.Record; +import org.apache.zookeeper.AsyncCallback.ACLCallback; +import org.apache.zookeeper.AsyncCallback.Children2Callback; +import org.apache.zookeeper.AsyncCallback.ChildrenCallback; +import org.apache.zookeeper.AsyncCallback.DataCallback; +import org.apache.zookeeper.AsyncCallback.StatCallback; +import org.apache.zookeeper.AsyncCallback.StringCallback; +import org.apache.zookeeper.AsyncCallback.VoidCallback; +import org.apache.zookeeper.Watcher.Event; +import org.apache.zookeeper.Watcher.Event.EventType; +import org.apache.zookeeper.Watcher.Event.KeeperState; +import org.apache.zookeeper.ZooDefs.OpCode; +import org.apache.zookeeper.ZooKeeper.States; +import org.apache.zookeeper.ZooKeeper.WatchRegistration; +import org.apache.zookeeper.client.HostProvider; +import org.apache.zookeeper.client.ZooKeeperSaslClient; +import org.apache.zookeeper.proto.AuthPacket; +import org.apache.zookeeper.proto.ConnectRequest; +import org.apache.zookeeper.proto.CreateResponse; +import org.apache.zookeeper.proto.ExistsResponse; +import org.apache.zookeeper.proto.GetACLResponse; +import org.apache.zookeeper.proto.GetChildren2Response; +import org.apache.zookeeper.proto.GetChildrenResponse; +import org.apache.zookeeper.proto.GetDataResponse; +import org.apache.zookeeper.proto.GetSASLRequest; +import org.apache.zookeeper.proto.ReplyHeader; +import org.apache.zookeeper.proto.RequestHeader; +import org.apache.zookeeper.proto.SetACLResponse; +import org.apache.zookeeper.proto.SetDataResponse; +import org.apache.zookeeper.proto.SetWatches; +import org.apache.zookeeper.proto.WatcherEvent; +import org.apache.zookeeper.server.ByteBufferInputStream; +import org.apache.zookeeper.server.ZooTrace; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * This class manages the socket i/o for the client. ClientCnxn maintains a list + * of available servers to connect to and "transparently" switches servers it is + * connected to as needed. + * + */ +public class ClientCnxn { + private static final Logger LOG = LoggerFactory.getLogger(ClientCnxn.class); + + private static final String ZK_SASL_CLIENT_USERNAME = + "zookeeper.sasl.client.username"; + + /** This controls whether automatic watch resetting is enabled. + * Clients automatically reset watches during session reconnect, this + * option allows the client to turn off this behavior by setting + * the environment variable "zookeeper.disableAutoWatchReset" to "true" */ + private static boolean disableAutoWatchReset; + static { + // this var should not be public, but otw there is no easy way + // to test + disableAutoWatchReset = + Boolean.getBoolean("zookeeper.disableAutoWatchReset"); + if (LOG.isDebugEnabled()) { + LOG.debug("zookeeper.disableAutoWatchReset is " + + disableAutoWatchReset); + } + } + + static class AuthData { + AuthData(String scheme, byte data[]) { + this.scheme = scheme; + this.data = data; + } + + String scheme; + + byte data[]; + } + + private final CopyOnWriteArraySet authInfo = new CopyOnWriteArraySet(); + + /** + * These are the packets that have been sent and are waiting for a response. + */ + private final LinkedList pendingQueue = new LinkedList(); + + /** + * These are the packets that need to be sent. + */ + private final LinkedList outgoingQueue = new LinkedList(); + + private int connectTimeout; + + /** + * The timeout in ms the client negotiated with the server. This is the + * "real" timeout, not the timeout request by the client (which may have + * been increased/decreased by the server which applies bounds to this + * value. + */ + private volatile int negotiatedSessionTimeout; + + private int readTimeout; + + private final int sessionTimeout; + + private final ZooKeeper zooKeeper; + + private final ClientWatchManager watcher; + + private long sessionId; + + private byte sessionPasswd[] = new byte[16]; + + /** + * If true, the connection is allowed to go to r-o mode. This field's value + * is sent, besides other data, during session creation handshake. If the + * server on the other side of the wire is partitioned it'll accept + * read-only clients only. + */ + private boolean readOnly; + + final String chrootPath; + + final SendThread sendThread; + + final EventThread eventThread; + + /** + * Set to true when close is called. Latches the connection such that we + * don't attempt to re-connect to the server if in the middle of closing the + * connection (client sends session disconnect to server as part of close + * operation) + */ + private volatile boolean closing = false; + + /** + * A set of ZooKeeper hosts this client could connect to. + */ + private final HostProvider hostProvider; + + /** + * Is set to true when a connection to a r/w server is established for the + * first time; never changed afterwards. + *

      + * Is used to handle situations when client without sessionId connects to a + * read-only server. Such client receives "fake" sessionId from read-only + * server, but this sessionId is invalid for other servers. So when such + * client finds a r/w server, it sends 0 instead of fake sessionId during + * connection handshake and establishes new, valid session. + *

      + * If this field is false (which implies we haven't seen r/w server before) + * then non-zero sessionId is fake, otherwise it is valid. + */ + volatile boolean seenRwServerBefore = false; + + + public ZooKeeperSaslClient zooKeeperSaslClient; + + public long getSessionId() { + return sessionId; + } + + public byte[] getSessionPasswd() { + return sessionPasswd; + } + + public int getSessionTimeout() { + return negotiatedSessionTimeout; + } + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(); + + SocketAddress local = sendThread.getClientCnxnSocket().getLocalSocketAddress(); + SocketAddress remote = sendThread.getClientCnxnSocket().getRemoteSocketAddress(); + sb + .append("sessionid:0x").append(Long.toHexString(getSessionId())) + .append(" local:").append(local) + .append(" remoteserver:").append(remote) + .append(" lastZxid:").append(lastZxid) + .append(" xid:").append(xid) + .append(" sent:").append(sendThread.getClientCnxnSocket().getSentCount()) + .append(" recv:").append(sendThread.getClientCnxnSocket().getRecvCount()) + .append(" queuedpkts:").append(outgoingQueue.size()) + .append(" pendingresp:").append(pendingQueue.size()) + .append(" queuedevents:").append(eventThread.waitingEvents.size()); + + return sb.toString(); + } + + /** + * This class allows us to pass the headers and the relevant records around. + */ + static class Packet { + RequestHeader requestHeader; + + ReplyHeader replyHeader; + + Record request; + + Record response; + + ByteBuffer bb; + + /** Client's view of the path (may differ due to chroot) **/ + String clientPath; + /** Servers's view of the path (may differ due to chroot) **/ + String serverPath; + + boolean finished; + + AsyncCallback cb; + + Object ctx; + + WatchRegistration watchRegistration; + + public boolean readOnly; + + /** Convenience ctor */ + Packet(RequestHeader requestHeader, ReplyHeader replyHeader, + Record request, Record response, + WatchRegistration watchRegistration) { + this(requestHeader, replyHeader, request, response, + watchRegistration, false); + } + + Packet(RequestHeader requestHeader, ReplyHeader replyHeader, + Record request, Record response, + WatchRegistration watchRegistration, boolean readOnly) { + + this.requestHeader = requestHeader; + this.replyHeader = replyHeader; + this.request = request; + this.response = response; + this.readOnly = readOnly; + this.watchRegistration = watchRegistration; + } + + public void createBB() { + try { + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + BinaryOutputArchive boa = BinaryOutputArchive.getArchive(baos); + boa.writeInt(-1, "len"); // We'll fill this in later + if (requestHeader != null) { + requestHeader.serialize(boa, "header"); + } + if (request instanceof ConnectRequest) { + request.serialize(boa, "connect"); + // append "am-I-allowed-to-be-readonly" flag + boa.writeBool(readOnly, "readOnly"); + } else if (request != null) { + request.serialize(boa, "request"); + } + baos.close(); + this.bb = ByteBuffer.wrap(baos.toByteArray()); + this.bb.putInt(this.bb.capacity() - 4); + this.bb.rewind(); + } catch (IOException e) { + LOG.warn("Ignoring unexpected exception", e); + } + } + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(); + + sb.append("clientPath:" + clientPath); + sb.append(" serverPath:" + serverPath); + sb.append(" finished:" + finished); + + sb.append(" header:: " + requestHeader); + sb.append(" replyHeader:: " + replyHeader); + sb.append(" request:: " + request); + sb.append(" response:: " + response); + + // jute toString is horrible, remove unnecessary newlines + return sb.toString().replaceAll("\r*\n+", " "); + } + } + + /** + * Creates a connection object. The actual network connect doesn't get + * established until needed. The start() instance method must be called + * subsequent to construction. + * + * @param chrootPath - the chroot of this client. Should be removed from this Class in ZOOKEEPER-838 + * @param hostProvider + * the list of ZooKeeper servers to connect to + * @param sessionTimeout + * the timeout for connections. + * @param zooKeeper + * the zookeeper object that this connection is related to. + * @param watcher watcher for this connection + * @param clientCnxnSocket + * the socket implementation used (e.g. NIO/Netty) + * @param canBeReadOnly + * whether the connection is allowed to go to read-only + * mode in case of partitioning + * @throws IOException + */ + public ClientCnxn(String chrootPath, HostProvider hostProvider, int sessionTimeout, ZooKeeper zooKeeper, + ClientWatchManager watcher, ClientCnxnSocket clientCnxnSocket, boolean canBeReadOnly) + throws IOException { + this(chrootPath, hostProvider, sessionTimeout, zooKeeper, watcher, + clientCnxnSocket, 0, new byte[16], canBeReadOnly); + } + + /** + * Creates a connection object. The actual network connect doesn't get + * established until needed. The start() instance method must be called + * subsequent to construction. + * + * @param chrootPath - the chroot of this client. Should be removed from this Class in ZOOKEEPER-838 + * @param hostProvider + * the list of ZooKeeper servers to connect to + * @param sessionTimeout + * the timeout for connections. + * @param zooKeeper + * the zookeeper object that this connection is related to. + * @param watcher watcher for this connection + * @param clientCnxnSocket + * the socket implementation used (e.g. NIO/Netty) + * @param sessionId session id if re-establishing session + * @param sessionPasswd session passwd if re-establishing session + * @param canBeReadOnly + * whether the connection is allowed to go to read-only + * mode in case of partitioning + * @throws IOException + */ + public ClientCnxn(String chrootPath, HostProvider hostProvider, int sessionTimeout, ZooKeeper zooKeeper, + ClientWatchManager watcher, ClientCnxnSocket clientCnxnSocket, + long sessionId, byte[] sessionPasswd, boolean canBeReadOnly) { + this.zooKeeper = zooKeeper; + this.watcher = watcher; + this.sessionId = sessionId; + this.sessionPasswd = sessionPasswd; + this.sessionTimeout = sessionTimeout; + this.hostProvider = hostProvider; + this.chrootPath = chrootPath; + + connectTimeout = sessionTimeout / hostProvider.size(); + readTimeout = sessionTimeout * 2 / 3; + readOnly = canBeReadOnly; + + sendThread = new SendThread(clientCnxnSocket); + eventThread = new EventThread(); + + } + + /** + * tests use this to check on reset of watches + * @return if the auto reset of watches are disabled + */ + public static boolean getDisableAutoResetWatch() { + return disableAutoWatchReset; + } + /** + * tests use this to set the auto reset + * @param b the value to set disable watches to + */ + public static void setDisableAutoResetWatch(boolean b) { + disableAutoWatchReset = b; + } + public void start() { + sendThread.start(); + eventThread.start(); + } + + private Object eventOfDeath = new Object(); + + private final static UncaughtExceptionHandler uncaughtExceptionHandler = new UncaughtExceptionHandler() { + @Override + public void uncaughtException(Thread t, Throwable e) { + LOG.error("from " + t.getName(), e); + } + }; + + private static class WatcherSetEventPair { + private final Set watchers; + private final WatchedEvent event; + + public WatcherSetEventPair(Set watchers, WatchedEvent event) { + this.watchers = watchers; + this.event = event; + } + } + + /** + * Guard against creating "-EventThread-EventThread-EventThread-..." thread + * names when ZooKeeper object is being created from within a watcher. + * See ZOOKEEPER-795 for details. + */ + private static String makeThreadName(String suffix) { + String name = Thread.currentThread().getName(). + replaceAll("-EventThread", ""); + return name + suffix; + } + + class EventThread extends Thread { + private final LinkedBlockingQueue waitingEvents = + new LinkedBlockingQueue(); + + /** This is really the queued session state until the event + * thread actually processes the event and hands it to the watcher. + * But for all intents and purposes this is the state. + */ + private volatile KeeperState sessionState = KeeperState.Disconnected; + + private volatile boolean wasKilled = false; + private volatile boolean isRunning = false; + + EventThread() { + super(makeThreadName("-EventThread")); + setUncaughtExceptionHandler(uncaughtExceptionHandler); + setDaemon(true); + } + + public void queueEvent(WatchedEvent event) { + if (event.getType() == EventType.None + && sessionState == event.getState()) { + return; + } + sessionState = event.getState(); + + // materialize the watchers based on the event + WatcherSetEventPair pair = new WatcherSetEventPair( + watcher.materialize(event.getState(), event.getType(), + event.getPath()), + event); + // queue the pair (watch set & event) for later processing + waitingEvents.add(pair); + } + + public void queuePacket(Packet packet) { + if (wasKilled) { + synchronized (waitingEvents) { + if (isRunning) waitingEvents.add(packet); + else processEvent(packet); + } + } else { + waitingEvents.add(packet); + } + } + + public void queueEventOfDeath() { + waitingEvents.add(eventOfDeath); + } + + @Override + public void run() { + try { + isRunning = true; + while (true) { + Object event = waitingEvents.take(); + if (event == eventOfDeath) { + wasKilled = true; + } else { + processEvent(event); + } + if (wasKilled) + synchronized (waitingEvents) { + if (waitingEvents.isEmpty()) { + isRunning = false; + break; + } + } + } + } catch (InterruptedException e) { + LOG.error("Event thread exiting due to interruption", e); + } + + LOG.info("EventThread shut down"); + } + + private void processEvent(Object event) { + try { + if (event instanceof WatcherSetEventPair) { + // each watcher will process the event + WatcherSetEventPair pair = (WatcherSetEventPair) event; + for (Watcher watcher : pair.watchers) { + try { + watcher.process(pair.event); + } catch (Throwable t) { + LOG.error("Error while calling watcher ", t); + } + } + } else { + Packet p = (Packet) event; + int rc = 0; + String clientPath = p.clientPath; + if (p.replyHeader.getErr() != 0) { + rc = p.replyHeader.getErr(); + } + if (p.cb == null) { + LOG.warn("Somehow a null cb got to EventThread!"); + } else if (p.response instanceof ExistsResponse + || p.response instanceof SetDataResponse + || p.response instanceof SetACLResponse) { + StatCallback cb = (StatCallback) p.cb; + if (rc == 0) { + if (p.response instanceof ExistsResponse) { + cb.processResult(rc, clientPath, p.ctx, + ((ExistsResponse) p.response) + .getStat()); + } else if (p.response instanceof SetDataResponse) { + cb.processResult(rc, clientPath, p.ctx, + ((SetDataResponse) p.response) + .getStat()); + } else if (p.response instanceof SetACLResponse) { + cb.processResult(rc, clientPath, p.ctx, + ((SetACLResponse) p.response) + .getStat()); + } + } else { + cb.processResult(rc, clientPath, p.ctx, null); + } + } else if (p.response instanceof GetDataResponse) { + DataCallback cb = (DataCallback) p.cb; + GetDataResponse rsp = (GetDataResponse) p.response; + if (rc == 0) { + cb.processResult(rc, clientPath, p.ctx, rsp + .getData(), rsp.getStat()); + } else { + cb.processResult(rc, clientPath, p.ctx, null, + null); + } + } else if (p.response instanceof GetACLResponse) { + ACLCallback cb = (ACLCallback) p.cb; + GetACLResponse rsp = (GetACLResponse) p.response; + if (rc == 0) { + cb.processResult(rc, clientPath, p.ctx, rsp + .getAcl(), rsp.getStat()); + } else { + cb.processResult(rc, clientPath, p.ctx, null, + null); + } + } else if (p.response instanceof GetChildrenResponse) { + ChildrenCallback cb = (ChildrenCallback) p.cb; + GetChildrenResponse rsp = (GetChildrenResponse) p.response; + if (rc == 0) { + cb.processResult(rc, clientPath, p.ctx, rsp + .getChildren()); + } else { + cb.processResult(rc, clientPath, p.ctx, null); + } + } else if (p.response instanceof GetChildren2Response) { + Children2Callback cb = (Children2Callback) p.cb; + GetChildren2Response rsp = (GetChildren2Response) p.response; + if (rc == 0) { + cb.processResult(rc, clientPath, p.ctx, rsp + .getChildren(), rsp.getStat()); + } else { + cb.processResult(rc, clientPath, p.ctx, null, null); + } + } else if (p.response instanceof CreateResponse) { + StringCallback cb = (StringCallback) p.cb; + CreateResponse rsp = (CreateResponse) p.response; + if (rc == 0) { + cb.processResult(rc, clientPath, p.ctx, + (chrootPath == null + ? rsp.getPath() + : rsp.getPath() + .substring(chrootPath.length()))); + } else { + cb.processResult(rc, clientPath, p.ctx, null); + } + } else if (p.cb instanceof VoidCallback) { + VoidCallback cb = (VoidCallback) p.cb; + cb.processResult(rc, clientPath, p.ctx); + } + } + } catch (Throwable t) { + LOG.error("Caught unexpected throwable", t); + } + } + } + + private void finishPacket(Packet p) { + if (p.watchRegistration != null) { + p.watchRegistration.register(p.replyHeader.getErr()); + } + + if (p.cb == null) { + synchronized (p) { + p.finished = true; + p.notifyAll(); + } + } else { + p.finished = true; + eventThread.queuePacket(p); + } + } + + private void conLossPacket(Packet p) { + if (p.replyHeader == null) { + return; + } + switch (state) { + case AUTH_FAILED: + p.replyHeader.setErr(KeeperException.Code.AUTHFAILED.intValue()); + break; + case CLOSED: + p.replyHeader.setErr(KeeperException.Code.SESSIONEXPIRED.intValue()); + break; + default: + p.replyHeader.setErr(KeeperException.Code.CONNECTIONLOSS.intValue()); + } + finishPacket(p); + } + + private volatile long lastZxid; + + public long getLastZxid() { + return lastZxid; + } + + static class EndOfStreamException extends IOException { + private static final long serialVersionUID = -5438877188796231422L; + + public EndOfStreamException(String msg) { + super(msg); + } + + @Override + public String toString() { + return "EndOfStreamException: " + getMessage(); + } + } + + private static class SessionTimeoutException extends IOException { + private static final long serialVersionUID = 824482094072071178L; + + public SessionTimeoutException(String msg) { + super(msg); + } + } + + private static class SessionExpiredException extends IOException { + private static final long serialVersionUID = -1388816932076193249L; + + public SessionExpiredException(String msg) { + super(msg); + } + } + + private static class RWServerFoundException extends IOException { + private static final long serialVersionUID = 90431199887158758L; + + public RWServerFoundException(String msg) { + super(msg); + } + } + + public static final int packetLen = Integer.getInteger("jute.maxbuffer", + 4096 * 1024); + + /** + * This class services the outgoing request queue and generates the heart + * beats. It also spawns the ReadThread. + */ + class SendThread extends Thread { + private long lastPingSentNs; + private final ClientCnxnSocket clientCnxnSocket; + private Random r = new Random(System.nanoTime()); + private boolean isFirstConnect = true; + + void readResponse(ByteBuffer incomingBuffer) throws IOException { + ByteBufferInputStream bbis = new ByteBufferInputStream( + incomingBuffer); + BinaryInputArchive bbia = BinaryInputArchive.getArchive(bbis); + ReplyHeader replyHdr = new ReplyHeader(); + + replyHdr.deserialize(bbia, "header"); + if (replyHdr.getXid() == -2) { + // -2 is the xid for pings + if (LOG.isDebugEnabled()) { + LOG.debug("Got ping response for sessionid: 0x" + + Long.toHexString(sessionId) + + " after " + + ((System.nanoTime() - lastPingSentNs) / 1000000) + + "ms"); + } + return; + } + if (replyHdr.getXid() == -4) { + // -4 is the xid for AuthPacket + if(replyHdr.getErr() == KeeperException.Code.AUTHFAILED.intValue()) { + state = States.AUTH_FAILED; + eventThread.queueEvent( new WatchedEvent(Watcher.Event.EventType.None, + Watcher.Event.KeeperState.AuthFailed, null) ); + } + if (LOG.isDebugEnabled()) { + LOG.debug("Got auth sessionid:0x" + + Long.toHexString(sessionId)); + } + return; + } + if (replyHdr.getXid() == -1) { + // -1 means notification + if (LOG.isDebugEnabled()) { + LOG.debug("Got notification sessionid:0x" + + Long.toHexString(sessionId)); + } + WatcherEvent event = new WatcherEvent(); + event.deserialize(bbia, "response"); + + // convert from a server path to a client path + if (chrootPath != null) { + String serverPath = event.getPath(); + if(serverPath.compareTo(chrootPath)==0) + event.setPath("/"); + else if (serverPath.length() > chrootPath.length()) + event.setPath(serverPath.substring(chrootPath.length())); + else { + LOG.warn("Got server path " + event.getPath() + + " which is too short for chroot path " + + chrootPath); + } + } + + WatchedEvent we = new WatchedEvent(event); + if (LOG.isDebugEnabled()) { + LOG.debug("Got " + we + " for sessionid 0x" + + Long.toHexString(sessionId)); + } + + eventThread.queueEvent( we ); + return; + } + + // If SASL authentication is currently in progress, construct and + // send a response packet immediately, rather than queuing a + // response as with other packets. + if (clientTunneledAuthenticationInProgress()) { + GetSASLRequest request = new GetSASLRequest(); + request.deserialize(bbia,"token"); + zooKeeperSaslClient.respondToServer(request.getToken(), + ClientCnxn.this); + return; + } + + Packet packet; + synchronized (pendingQueue) { + if (pendingQueue.size() == 0) { + throw new IOException("Nothing in the queue, but got " + + replyHdr.getXid()); + } + packet = pendingQueue.remove(); + } + /* + * Since requests are processed in order, we better get a response + * to the first request! + */ + try { + if (packet.requestHeader.getXid() != replyHdr.getXid()) { + packet.replyHeader.setErr( + KeeperException.Code.CONNECTIONLOSS.intValue()); + throw new IOException("Xid out of order. Got Xid " + + replyHdr.getXid() + " with err " + + + replyHdr.getErr() + + " expected Xid " + + packet.requestHeader.getXid() + + " for a packet with details: " + + packet ); + } + + packet.replyHeader.setXid(replyHdr.getXid()); + packet.replyHeader.setErr(replyHdr.getErr()); + packet.replyHeader.setZxid(replyHdr.getZxid()); + if (replyHdr.getZxid() > 0) { + lastZxid = replyHdr.getZxid(); + } + if (packet.response != null && replyHdr.getErr() == 0) { + packet.response.deserialize(bbia, "response"); + } + + if (LOG.isDebugEnabled()) { + LOG.debug("Reading reply sessionid:0x" + + Long.toHexString(sessionId) + ", packet:: " + packet); + } + } finally { + finishPacket(packet); + } + } + + SendThread(ClientCnxnSocket clientCnxnSocket) { + super(makeThreadName("-SendThread()")); + state = States.CONNECTING; + this.clientCnxnSocket = clientCnxnSocket; + setUncaughtExceptionHandler(uncaughtExceptionHandler); + setDaemon(true); + } + + // TODO: can not name this method getState since Thread.getState() + // already exists + // It would be cleaner to make class SendThread an implementation of + // Runnable + /** + * Used by ClientCnxnSocket + * + * @return + */ + ZooKeeper.States getZkState() { + return state; + } + + ClientCnxnSocket getClientCnxnSocket() { + return clientCnxnSocket; + } + + void primeConnection() throws IOException { + LOG.info("Socket connection established to " + + clientCnxnSocket.getRemoteSocketAddress() + + ", initiating session"); + isFirstConnect = false; + long sessId = (seenRwServerBefore) ? sessionId : 0; + ConnectRequest conReq = new ConnectRequest(0, lastZxid, + sessionTimeout, sessId, sessionPasswd); + synchronized (outgoingQueue) { + // We add backwards since we are pushing into the front + // Only send if there's a pending watch + // TODO: here we have the only remaining use of zooKeeper in + // this class. It's to be eliminated! + if (!disableAutoWatchReset) { + List dataWatches = zooKeeper.getDataWatches(); + List existWatches = zooKeeper.getExistWatches(); + List childWatches = zooKeeper.getChildWatches(); + if (!dataWatches.isEmpty() + || !existWatches.isEmpty() || !childWatches.isEmpty()) { + SetWatches sw = new SetWatches(lastZxid, + prependChroot(dataWatches), + prependChroot(existWatches), + prependChroot(childWatches)); + RequestHeader h = new RequestHeader(); + h.setType(ZooDefs.OpCode.setWatches); + h.setXid(-8); + Packet packet = new Packet(h, new ReplyHeader(), sw, null, null); + outgoingQueue.addFirst(packet); + } + } + + for (AuthData id : authInfo) { + outgoingQueue.addFirst(new Packet(new RequestHeader(-4, + OpCode.auth), null, new AuthPacket(0, id.scheme, + id.data), null, null)); + } + outgoingQueue.addFirst(new Packet(null, null, conReq, + null, null, readOnly)); + } + clientCnxnSocket.enableReadWriteOnly(); + if (LOG.isDebugEnabled()) { + LOG.debug("Session establishment request sent on " + + clientCnxnSocket.getRemoteSocketAddress()); + } + } + + private List prependChroot(List paths) { + if (chrootPath != null && !paths.isEmpty()) { + for (int i = 0; i < paths.size(); ++i) { + String clientPath = paths.get(i); + String serverPath; + // handle clientPath = "/" + if (clientPath.length() == 1) { + serverPath = chrootPath; + } else { + serverPath = chrootPath + clientPath; + } + paths.set(i, serverPath); + } + } + return paths; + } + + private void sendPing() { + lastPingSentNs = System.nanoTime(); + RequestHeader h = new RequestHeader(-2, OpCode.ping); + queuePacket(h, null, null, null, null, null, null, null, null); + } + + private InetSocketAddress rwServerAddress = null; + + private final static int minPingRwTimeout = 100; + + private final static int maxPingRwTimeout = 60000; + + private int pingRwTimeout = minPingRwTimeout; + + // Set to true if and only if constructor of ZooKeeperSaslClient + // throws a LoginException: see startConnect() below. + private boolean saslLoginFailed = false; + + private void startConnect() throws IOException { + state = States.CONNECTING; + + InetSocketAddress addr; + if (rwServerAddress != null) { + addr = rwServerAddress; + rwServerAddress = null; + } else { + addr = hostProvider.next(1000); + } + + setName(getName().replaceAll("\\(.*\\)", + "(" + addr.getHostName() + ":" + addr.getPort() + ")")); + if (ZooKeeperSaslClient.isEnabled()) { + try { + String principalUserName = System.getProperty( + ZK_SASL_CLIENT_USERNAME, "zookeeper"); + zooKeeperSaslClient = + new ZooKeeperSaslClient( + principalUserName+"/"+addr.getHostName()); + } catch (LoginException e) { + // An authentication error occurred when the SASL client tried to initialize: + // for Kerberos this means that the client failed to authenticate with the KDC. + // This is different from an authentication error that occurs during communication + // with the Zookeeper server, which is handled below. + LOG.warn("SASL configuration failed: " + e + " Will continue connection to Zookeeper server without " + + "SASL authentication, if Zookeeper server allows it."); + eventThread.queueEvent(new WatchedEvent( + Watcher.Event.EventType.None, + Watcher.Event.KeeperState.AuthFailed, null)); + saslLoginFailed = true; + } + } + logStartConnect(addr); + + clientCnxnSocket.connect(addr); + } + + private void logStartConnect(InetSocketAddress addr) { + String msg = "Opening socket connection to server " + addr; + if (zooKeeperSaslClient != null) { + msg += ". " + zooKeeperSaslClient.getConfigStatus(); + } + LOG.info(msg); + } + + private static final String RETRY_CONN_MSG = + ", closing socket connection and attempting reconnect"; + + @Override + public void run() { + clientCnxnSocket.introduce(this,sessionId); + clientCnxnSocket.updateNow(); + clientCnxnSocket.updateLastSendAndHeard(); + int to; + long lastPingRwServer = System.currentTimeMillis(); + final int MAX_SEND_PING_INTERVAL = 10000; //10 seconds + while (state.isAlive()) { + try { + if (!clientCnxnSocket.isConnected()) { + if(!isFirstConnect){ + try { + Thread.sleep(r.nextInt(1000)); + } catch (InterruptedException e) { + LOG.warn("Unexpected exception", e); + } + } + // don't re-establish connection if we are closing + if (closing || !state.isAlive()) { + break; + } + startConnect(); + clientCnxnSocket.updateLastSendAndHeard(); + } + + if (state.isConnected()) { + // determine whether we need to send an AuthFailed event. + if (zooKeeperSaslClient != null) { + boolean sendAuthEvent = false; + if (zooKeeperSaslClient.getSaslState() == ZooKeeperSaslClient.SaslState.INITIAL) { + try { + zooKeeperSaslClient.initialize(ClientCnxn.this); + } catch (SaslException e) { + LOG.error("SASL authentication with Zookeeper Quorum member failed: " + e); + state = States.AUTH_FAILED; + sendAuthEvent = true; + } + } + KeeperState authState = zooKeeperSaslClient.getKeeperState(); + if (authState != null) { + if (authState == KeeperState.AuthFailed) { + // An authentication error occurred during authentication with the Zookeeper Server. + state = States.AUTH_FAILED; + sendAuthEvent = true; + } else { + if (authState == KeeperState.SaslAuthenticated) { + sendAuthEvent = true; + } + } + } + + if (sendAuthEvent == true) { + eventThread.queueEvent(new WatchedEvent( + Watcher.Event.EventType.None, + authState,null)); + } + } + to = readTimeout - clientCnxnSocket.getIdleRecv(); + } else { + to = connectTimeout - clientCnxnSocket.getIdleRecv(); + } + + if (to <= 0) { + throw new SessionTimeoutException( + "Client session timed out, have not heard from server in " + + clientCnxnSocket.getIdleRecv() + "ms" + + " for sessionid 0x" + + Long.toHexString(sessionId)); + } + if (state.isConnected()) { + //1000(1 second) is to prevent race condition missing to send the second ping + //also make sure not to send too many pings when readTimeout is small + int timeToNextPing = readTimeout / 2 - clientCnxnSocket.getIdleSend() - + ((clientCnxnSocket.getIdleSend() > 1000) ? 1000 : 0); + //send a ping request either time is due or no packet sent out within MAX_SEND_PING_INTERVAL + if (timeToNextPing <= 0 || clientCnxnSocket.getIdleSend() > MAX_SEND_PING_INTERVAL) { + sendPing(); + clientCnxnSocket.updateLastSend(); + } else { + if (timeToNextPing < to) { + to = timeToNextPing; + } + } + } + + // If we are in read-only mode, seek for read/write server + if (state == States.CONNECTEDREADONLY) { + long now = System.currentTimeMillis(); + int idlePingRwServer = (int) (now - lastPingRwServer); + if (idlePingRwServer >= pingRwTimeout) { + lastPingRwServer = now; + idlePingRwServer = 0; + pingRwTimeout = + Math.min(2*pingRwTimeout, maxPingRwTimeout); + pingRwServer(); + } + to = Math.min(to, pingRwTimeout - idlePingRwServer); + } + + clientCnxnSocket.doTransport(to, pendingQueue, outgoingQueue, ClientCnxn.this); + } catch (Throwable e) { + if (closing) { + if (LOG.isDebugEnabled()) { + // closing so this is expected + LOG.debug("An exception was thrown while closing send thread for session 0x" + + Long.toHexString(getSessionId()) + + " : " + e.getMessage()); + } + break; + } else { + // this is ugly, you have a better way speak up + if (e instanceof SessionExpiredException) { + LOG.info(e.getMessage() + ", closing socket connection"); + } else if (e instanceof SessionTimeoutException) { + LOG.info(e.getMessage() + RETRY_CONN_MSG); + } else if (e instanceof EndOfStreamException) { + LOG.info(e.getMessage() + RETRY_CONN_MSG); + } else if (e instanceof RWServerFoundException) { + LOG.info(e.getMessage()); + } else { + LOG.warn( + "Session 0x" + + Long.toHexString(getSessionId()) + + " for server " + + clientCnxnSocket.getRemoteSocketAddress() + + ", unexpected error" + + RETRY_CONN_MSG, e); + } + cleanup(); + if (state.isAlive()) { + eventThread.queueEvent(new WatchedEvent( + Event.EventType.None, + Event.KeeperState.Disconnected, + null)); + } + clientCnxnSocket.updateNow(); + clientCnxnSocket.updateLastSendAndHeard(); + } + } + } + cleanup(); + clientCnxnSocket.close(); + if (state.isAlive()) { + eventThread.queueEvent(new WatchedEvent(Event.EventType.None, + Event.KeeperState.Disconnected, null)); + } + ZooTrace.logTraceMessage(LOG, ZooTrace.getTextTraceLevel(), + "SendThread exitedloop."); + } + + private void pingRwServer() throws RWServerFoundException { + String result = null; + InetSocketAddress addr = hostProvider.next(0); + LOG.info("Checking server " + addr + " for being r/w." + + " Timeout " + pingRwTimeout); + + Socket sock = null; + BufferedReader br = null; + try { + sock = new Socket(addr.getHostName(), addr.getPort()); + sock.setSoLinger(false, -1); + sock.setSoTimeout(1000); + sock.setTcpNoDelay(true); + sock.getOutputStream().write("isro".getBytes()); + sock.getOutputStream().flush(); + sock.shutdownOutput(); + br = new BufferedReader( + new InputStreamReader(sock.getInputStream())); + result = br.readLine(); + } catch (ConnectException e) { + // ignore, this just means server is not up + } catch (IOException e) { + // some unexpected error, warn about it + LOG.warn("Exception while seeking for r/w server " + + e.getMessage(), e); + } finally { + if (sock != null) { + try { + sock.close(); + } catch (IOException e) { + LOG.warn("Unexpected exception", e); + } + } + if (br != null) { + try { + br.close(); + } catch (IOException e) { + LOG.warn("Unexpected exception", e); + } + } + } + + if ("rw".equals(result)) { + pingRwTimeout = minPingRwTimeout; + // save the found address so that it's used during the next + // connection attempt + rwServerAddress = addr; + throw new RWServerFoundException("Majority server found at " + + addr.getHostName() + ":" + addr.getPort()); + } + } + + private void cleanup() { + clientCnxnSocket.cleanup(); + synchronized (pendingQueue) { + for (Packet p : pendingQueue) { + conLossPacket(p); + } + pendingQueue.clear(); + } + synchronized (outgoingQueue) { + for (Packet p : outgoingQueue) { + conLossPacket(p); + } + outgoingQueue.clear(); + } + } + + /** + * Callback invoked by the ClientCnxnSocket once a connection has been + * established. + * + * @param _negotiatedSessionTimeout + * @param _sessionId + * @param _sessionPasswd + * @param isRO + * @throws IOException + */ + void onConnected(int _negotiatedSessionTimeout, long _sessionId, + byte[] _sessionPasswd, boolean isRO) throws IOException { + negotiatedSessionTimeout = _negotiatedSessionTimeout; + if (negotiatedSessionTimeout <= 0) { + state = States.CLOSED; + + eventThread.queueEvent(new WatchedEvent( + Watcher.Event.EventType.None, + Watcher.Event.KeeperState.Expired, null)); + eventThread.queueEventOfDeath(); + throw new SessionExpiredException( + "Unable to reconnect to ZooKeeper service, session 0x" + + Long.toHexString(sessionId) + " has expired"); + } + if (!readOnly && isRO) { + LOG.error("Read/write client got connected to read-only server"); + } + readTimeout = negotiatedSessionTimeout * 2 / 3; + connectTimeout = negotiatedSessionTimeout / hostProvider.size(); + hostProvider.onConnected(); + sessionId = _sessionId; + sessionPasswd = _sessionPasswd; + state = (isRO) ? + States.CONNECTEDREADONLY : States.CONNECTED; + seenRwServerBefore |= !isRO; + LOG.info("Session establishment complete on server " + + clientCnxnSocket.getRemoteSocketAddress() + + ", sessionid = 0x" + Long.toHexString(sessionId) + + ", negotiated timeout = " + negotiatedSessionTimeout + + (isRO ? " (READ-ONLY mode)" : "")); + KeeperState eventState = (isRO) ? + KeeperState.ConnectedReadOnly : KeeperState.SyncConnected; + eventThread.queueEvent(new WatchedEvent( + Watcher.Event.EventType.None, + eventState, null)); + } + + void close() { + state = States.CLOSED; + clientCnxnSocket.wakeupCnxn(); + } + + void testableCloseSocket() throws IOException { + clientCnxnSocket.testableCloseSocket(); + } + + public boolean clientTunneledAuthenticationInProgress() { + // 1. SASL client is disabled. + if (!ZooKeeperSaslClient.isEnabled()) { + return false; + } + + // 2. SASL login failed. + if (saslLoginFailed == true) { + return false; + } + + // 3. SendThread has not created the authenticating object yet, + // therefore authentication is (at the earliest stage of being) in progress. + if (zooKeeperSaslClient == null) { + return true; + } + + // 4. authenticating object exists, so ask it for its progress. + return zooKeeperSaslClient.clientTunneledAuthenticationInProgress(); + } + + public void sendPacket(Packet p) throws IOException { + clientCnxnSocket.sendPacket(p); + } + } + + /** + * Shutdown the send/event threads. This method should not be called + * directly - rather it should be called as part of close operation. This + * method is primarily here to allow the tests to verify disconnection + * behavior. + */ + public void disconnect() { + if (LOG.isDebugEnabled()) { + LOG.debug("Disconnecting client for session: 0x" + + Long.toHexString(getSessionId())); + } + + sendThread.close(); + eventThread.queueEventOfDeath(); + } + + /** + * Close the connection, which includes; send session disconnect to the + * server, shutdown the send/event threads. + * + * @throws IOException + */ + public void close() throws IOException { + if (LOG.isDebugEnabled()) { + LOG.debug("Closing client for session: 0x" + + Long.toHexString(getSessionId())); + } + + try { + RequestHeader h = new RequestHeader(); + h.setType(ZooDefs.OpCode.closeSession); + + submitRequest(h, null, null, null); + } catch (InterruptedException e) { + // ignore, close the send/event threads + } finally { + disconnect(); + } + } + + private int xid = 1; + + private volatile States state = States.NOT_CONNECTED; + + /* + * getXid() is called externally by ClientCnxnNIO::doIO() when packets are sent from the outgoingQueue to + * the server. Thus, getXid() must be public. + */ + synchronized public int getXid() { + return xid++; + } + + public ReplyHeader submitRequest(RequestHeader h, Record request, + Record response, WatchRegistration watchRegistration) + throws InterruptedException { + ReplyHeader r = new ReplyHeader(); + Packet packet = queuePacket(h, r, request, response, null, null, null, + null, watchRegistration); + synchronized (packet) { + while (!packet.finished) { + packet.wait(); + } + } + return r; + } + + public void enableWrite() { + sendThread.getClientCnxnSocket().enableWrite(); + } + + public void sendPacket(Record request, Record response, AsyncCallback cb, int opCode) + throws IOException { + // Generate Xid now because it will be sent immediately, + // by call to sendThread.sendPacket() below. + int xid = getXid(); + RequestHeader h = new RequestHeader(); + h.setXid(xid); + h.setType(opCode); + + ReplyHeader r = new ReplyHeader(); + r.setXid(xid); + + Packet p = new Packet(h, r, request, response, null, false); + p.cb = cb; + sendThread.sendPacket(p); + } + + Packet queuePacket(RequestHeader h, ReplyHeader r, Record request, + Record response, AsyncCallback cb, String clientPath, + String serverPath, Object ctx, WatchRegistration watchRegistration) + { + Packet packet = null; + + // Note that we do not generate the Xid for the packet yet. It is + // generated later at send-time, by an implementation of ClientCnxnSocket::doIO(), + // where the packet is actually sent. + synchronized (outgoingQueue) { + packet = new Packet(h, r, request, response, watchRegistration); + packet.cb = cb; + packet.ctx = ctx; + packet.clientPath = clientPath; + packet.serverPath = serverPath; + if (!state.isAlive() || closing) { + conLossPacket(packet); + } else { + // If the client is asking to close the session then + // mark as closing + if (h.getType() == OpCode.closeSession) { + closing = true; + } + outgoingQueue.add(packet); + } + } + sendThread.getClientCnxnSocket().wakeupCnxn(); + return packet; + } + + public void addAuthInfo(String scheme, byte auth[]) { + if (!state.isAlive()) { + return; + } + authInfo.add(new AuthData(scheme, auth)); + queuePacket(new RequestHeader(-4, OpCode.auth), null, + new AuthPacket(0, scheme, auth), null, null, null, null, + null, null); + } + + States getState() { + return state; + } +} diff --git a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/ClientCnxnSocket.java b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/ClientCnxnSocket.java new file mode 100644 index 000000000..5ca0ba77b --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/ClientCnxnSocket.java @@ -0,0 +1,174 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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. + */ + +package org.apache.zookeeper; + +import java.io.IOException; +import java.net.InetSocketAddress; +import java.net.SocketAddress; +import java.nio.ByteBuffer; +import java.util.LinkedList; +import java.util.List; + +import org.apache.jute.BinaryInputArchive; +import org.apache.zookeeper.ClientCnxn.Packet; +import org.apache.zookeeper.proto.ConnectResponse; +import org.apache.zookeeper.server.ByteBufferInputStream; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * A ClientCnxnSocket does the lower level communication with a socket + * implementation. + * + * This code has been moved out of ClientCnxn so that a Netty implementation can + * be provided as an alternative to the NIO socket code. + * + */ +abstract class ClientCnxnSocket { + private static final Logger LOG = LoggerFactory.getLogger(ClientCnxnSocket.class); + + protected boolean initialized; + + /** + * This buffer is only used to read the length of the incoming message. + */ + protected final ByteBuffer lenBuffer = ByteBuffer.allocateDirect(4); + + /** + * After the length is read, a new incomingBuffer is allocated in + * readLength() to receive the full message. + */ + protected ByteBuffer incomingBuffer = lenBuffer; + protected long sentCount = 0; + protected long recvCount = 0; + protected long lastHeard; + protected long lastSend; + protected long now; + protected ClientCnxn.SendThread sendThread; + + /** + * The sessionId is only available here for Log and Exception messages. + * Otherwise the socket doesn't need to know it. + */ + protected long sessionId; + + void introduce(ClientCnxn.SendThread sendThread, long sessionId) { + this.sendThread = sendThread; + this.sessionId = sessionId; + } + + void updateNow() { + now = System.currentTimeMillis(); + } + + int getIdleRecv() { + return (int) (now - lastHeard); + } + + int getIdleSend() { + return (int) (now - lastSend); + } + + long getSentCount() { + return sentCount; + } + + long getRecvCount() { + return recvCount; + } + + void updateLastHeard() { + this.lastHeard = now; + } + + void updateLastSend() { + this.lastSend = now; + } + + void updateLastSendAndHeard() { + this.lastSend = now; + this.lastHeard = now; + } + + protected void readLength() throws IOException { + int len = incomingBuffer.getInt(); + if (len < 0 || len >= ClientCnxn.packetLen) { + throw new IOException("Packet len" + len + " is out of range!"); + } + incomingBuffer = ByteBuffer.allocate(len); + } + + void readConnectResult() throws IOException { + if (LOG.isTraceEnabled()) { + StringBuilder buf = new StringBuilder("0x["); + for (byte b : incomingBuffer.array()) { + buf.append(Integer.toHexString(b) + ","); + } + buf.append("]"); + LOG.trace("readConnectResult " + incomingBuffer.remaining() + " " + + buf.toString()); + } + ByteBufferInputStream bbis = new ByteBufferInputStream(incomingBuffer); + BinaryInputArchive bbia = BinaryInputArchive.getArchive(bbis); + ConnectResponse conRsp = new ConnectResponse(); + conRsp.deserialize(bbia, "connect"); + + // read "is read-only" flag + boolean isRO = false; + try { + isRO = bbia.readBool("readOnly"); + } catch (IOException e) { + // this is ok -- just a packet from an old server which + // doesn't contain readOnly field + LOG.warn("Connected to an old server; r-o mode will be unavailable"); + } + + this.sessionId = conRsp.getSessionId(); + sendThread.onConnected(conRsp.getTimeOut(), this.sessionId, + conRsp.getPasswd(), isRO); + } + + abstract boolean isConnected(); + + abstract void connect(InetSocketAddress addr) throws IOException; + + abstract SocketAddress getRemoteSocketAddress(); + + abstract SocketAddress getLocalSocketAddress(); + + abstract void cleanup(); + + abstract void close(); + + abstract void wakeupCnxn(); + + abstract void enableWrite(); + + abstract void disableWrite(); + + abstract void enableReadWriteOnly(); + + abstract void doTransport(int waitTimeOut, List pendingQueue, + LinkedList outgoingQueue, ClientCnxn cnxn) + throws IOException, InterruptedException; + + abstract void testableCloseSocket() throws IOException; + + abstract void sendPacket(Packet p) throws IOException; +} diff --git a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/ClientCnxnSocketNIO.java b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/ClientCnxnSocketNIO.java new file mode 100644 index 000000000..720619d89 --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/ClientCnxnSocketNIO.java @@ -0,0 +1,431 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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. + */ + +package org.apache.zookeeper; + +import java.io.IOException; +import java.net.InetSocketAddress; +import java.net.SocketAddress; +import java.nio.ByteBuffer; +import java.nio.channels.SelectionKey; +import java.nio.channels.Selector; +import java.nio.channels.SocketChannel; +import java.util.LinkedList; +import java.util.List; +import java.util.ListIterator; +import java.util.Set; + +import org.apache.zookeeper.ClientCnxn.EndOfStreamException; +import org.apache.zookeeper.ClientCnxn.Packet; +import org.apache.zookeeper.ZooDefs.OpCode; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class ClientCnxnSocketNIO extends ClientCnxnSocket { + private static final Logger LOG = LoggerFactory + .getLogger(ClientCnxnSocketNIO.class); + + private final Selector selector = Selector.open(); + + private SelectionKey sockKey; + + ClientCnxnSocketNIO() throws IOException { + super(); + } + + @Override + boolean isConnected() { + return sockKey != null; + } + + /** + * @return true if a packet was received + * @throws InterruptedException + * @throws IOException + */ + void doIO(List pendingQueue, LinkedList outgoingQueue, ClientCnxn cnxn) + throws InterruptedException, IOException { + SocketChannel sock = (SocketChannel) sockKey.channel(); + if (sock == null) { + throw new IOException("Socket is null!"); + } + if (sockKey.isReadable()) { + int rc = sock.read(incomingBuffer); + if (rc < 0) { + throw new EndOfStreamException( + "Unable to read additional data from server sessionid 0x" + + Long.toHexString(sessionId) + + ", likely server has closed socket"); + } + if (!incomingBuffer.hasRemaining()) { + incomingBuffer.flip(); + if (incomingBuffer == lenBuffer) { + recvCount++; + readLength(); + } else if (!initialized) { + readConnectResult(); + enableRead(); + if (findSendablePacket(outgoingQueue, + cnxn.sendThread.clientTunneledAuthenticationInProgress()) != null) { + // Since SASL authentication has completed (if client is configured to do so), + // outgoing packets waiting in the outgoingQueue can now be sent. + enableWrite(); + } + lenBuffer.clear(); + incomingBuffer = lenBuffer; + updateLastHeard(); + initialized = true; + } else { + sendThread.readResponse(incomingBuffer); + lenBuffer.clear(); + incomingBuffer = lenBuffer; + updateLastHeard(); + } + } + } + if (sockKey.isWritable()) { + synchronized(outgoingQueue) { + Packet p = findSendablePacket(outgoingQueue, + cnxn.sendThread.clientTunneledAuthenticationInProgress()); + + if (p != null) { + updateLastSend(); + // If we already started writing p, p.bb will already exist + if (p.bb == null) { + if ((p.requestHeader != null) && + (p.requestHeader.getType() != OpCode.ping) && + (p.requestHeader.getType() != OpCode.auth)) { + p.requestHeader.setXid(cnxn.getXid()); + } + p.createBB(); + } + sock.write(p.bb); + if (!p.bb.hasRemaining()) { + sentCount++; + outgoingQueue.removeFirstOccurrence(p); + if (p.requestHeader != null + && p.requestHeader.getType() != OpCode.ping + && p.requestHeader.getType() != OpCode.auth) { + synchronized (pendingQueue) { + pendingQueue.add(p); + } + } + } + } + if (outgoingQueue.isEmpty()) { + // No more packets to send: turn off write interest flag. + // Will be turned on later by a later call to enableWrite(), + // from within ZooKeeperSaslClient (if client is configured + // to attempt SASL authentication), or in either doIO() or + // in doTransport() if not. + disableWrite(); + } else if (!initialized && p != null && !p.bb.hasRemaining()) { + // On initial connection, write the complete connect request + // packet, but then disable further writes until after + // receiving a successful connection response. If the + // session is expired, then the server sends the expiration + // response and immediately closes its end of the socket. If + // the client is simultaneously writing on its end, then the + // TCP stack may choose to abort with RST, in which case the + // client would never receive the session expired event. See + // http://docs.oracle.com/javase/6/docs/technotes/guides/net/articles/connection_release.html + disableWrite(); + } else { + // Just in case + enableWrite(); + } + } + } + } + + private Packet findSendablePacket(LinkedList outgoingQueue, + boolean clientTunneledAuthenticationInProgress) { + synchronized (outgoingQueue) { + if (outgoingQueue.isEmpty()) { + return null; + } + if (outgoingQueue.getFirst().bb != null // If we've already starting sending the first packet, we better finish + || !clientTunneledAuthenticationInProgress) { + return outgoingQueue.getFirst(); + } + + // Since client's authentication with server is in progress, + // send only the null-header packet queued by primeConnection(). + // This packet must be sent so that the SASL authentication process + // can proceed, but all other packets should wait until + // SASL authentication completes. + ListIterator iter = outgoingQueue.listIterator(); + while (iter.hasNext()) { + Packet p = iter.next(); + if (p.requestHeader == null) { + // We've found the priming-packet. Move it to the beginning of the queue. + iter.remove(); + outgoingQueue.add(0, p); + return p; + } else { + // Non-priming packet: defer it until later, leaving it in the queue + // until authentication completes. + if (LOG.isDebugEnabled()) { + LOG.debug("deferring non-priming packet: " + p + + "until SASL authentication completes."); + } + } + } + // no sendable packet found. + return null; + } + } + + @Override + void cleanup() { + if (sockKey != null) { + SocketChannel sock = (SocketChannel) sockKey.channel(); + sockKey.cancel(); + try { + sock.socket().shutdownInput(); + } catch (IOException e) { + if (LOG.isDebugEnabled()) { + LOG.debug("Ignoring exception during shutdown input", e); + } + } + try { + sock.socket().shutdownOutput(); + } catch (IOException e) { + if (LOG.isDebugEnabled()) { + LOG.debug("Ignoring exception during shutdown output", + e); + } + } + try { + sock.socket().close(); + } catch (IOException e) { + if (LOG.isDebugEnabled()) { + LOG.debug("Ignoring exception during socket close", e); + } + } + try { + sock.close(); + } catch (IOException e) { + if (LOG.isDebugEnabled()) { + LOG.debug("Ignoring exception during channel close", e); + } + } + } + try { + Thread.sleep(100); + } catch (InterruptedException e) { + if (LOG.isDebugEnabled()) { + LOG.debug("SendThread interrupted during sleep, ignoring"); + } + } + sockKey = null; + } + + @Override + void close() { + try { + if (LOG.isTraceEnabled()) { + LOG.trace("Doing client selector close"); + } + selector.close(); + if (LOG.isTraceEnabled()) { + LOG.trace("Closed client selector"); + } + } catch (IOException e) { + LOG.warn("Ignoring exception during selector close", e); + } + } + + /** + * create a socket channel. + * @return the created socket channel + * @throws IOException + */ + SocketChannel createSock() throws IOException { + SocketChannel sock; + sock = SocketChannel.open(); + sock.configureBlocking(false); + sock.socket().setSoLinger(false, -1); + sock.socket().setTcpNoDelay(true); + return sock; + } + + /** + * register with the selection and connect + * @param sock the {@link SocketChannel} + * @param addr the address of remote host + * @throws IOException + */ + void registerAndConnect(SocketChannel sock, InetSocketAddress addr) + throws IOException { + sockKey = sock.register(selector, SelectionKey.OP_CONNECT); + boolean immediateConnect = sock.connect(addr); + if (immediateConnect) { + sendThread.primeConnection(); + } + } + + @Override + void connect(InetSocketAddress addr) throws IOException { + SocketChannel sock = createSock(); + try { + registerAndConnect(sock, addr); + } catch (IOException e) { + LOG.error("Unable to open socket to " + addr); + sock.close(); + throw e; + } + initialized = false; + + /* + * Reset incomingBuffer + */ + lenBuffer.clear(); + incomingBuffer = lenBuffer; + } + + /** + * Returns the address to which the socket is connected. + * + * @return ip address of the remote side of the connection or null if not + * connected + */ + @Override + SocketAddress getRemoteSocketAddress() { + // a lot could go wrong here, so rather than put in a bunch of code + // to check for nulls all down the chain let's do it the simple + // yet bulletproof way + try { + return ((SocketChannel) sockKey.channel()).socket() + .getRemoteSocketAddress(); + } catch (NullPointerException e) { + return null; + } + } + + /** + * Returns the local address to which the socket is bound. + * + * @return ip address of the remote side of the connection or null if not + * connected + */ + @Override + SocketAddress getLocalSocketAddress() { + // a lot could go wrong here, so rather than put in a bunch of code + // to check for nulls all down the chain let's do it the simple + // yet bulletproof way + try { + return ((SocketChannel) sockKey.channel()).socket() + .getLocalSocketAddress(); + } catch (NullPointerException e) { + return null; + } + } + + @Override + synchronized void wakeupCnxn() { + selector.wakeup(); + } + + @Override + void doTransport(int waitTimeOut, List pendingQueue, LinkedList outgoingQueue, + ClientCnxn cnxn) + throws IOException, InterruptedException { + selector.select(waitTimeOut); + Set selected; + synchronized (this) { + selected = selector.selectedKeys(); + } + // Everything below and until we get back to the select is + // non blocking, so time is effectively a constant. That is + // Why we just have to do this once, here + updateNow(); + for (SelectionKey k : selected) { + SocketChannel sc = ((SocketChannel) k.channel()); + if ((k.readyOps() & SelectionKey.OP_CONNECT) != 0) { + if (sc.finishConnect()) { + updateLastSendAndHeard(); + sendThread.primeConnection(); + } + } else if ((k.readyOps() & (SelectionKey.OP_READ | SelectionKey.OP_WRITE)) != 0) { + doIO(pendingQueue, outgoingQueue, cnxn); + } + } + if (sendThread.getZkState().isConnected()) { + synchronized(outgoingQueue) { + if (findSendablePacket(outgoingQueue, + cnxn.sendThread.clientTunneledAuthenticationInProgress()) != null) { + enableWrite(); + } + } + } + selected.clear(); + } + + //TODO should this be synchronized? + @Override + void testableCloseSocket() throws IOException { + LOG.info("testableCloseSocket() called"); + ((SocketChannel) sockKey.channel()).socket().close(); + } + + @Override + synchronized void enableWrite() { + int i = sockKey.interestOps(); + if ((i & SelectionKey.OP_WRITE) == 0) { + sockKey.interestOps(i | SelectionKey.OP_WRITE); + } + } + + @Override + public synchronized void disableWrite() { + int i = sockKey.interestOps(); + if ((i & SelectionKey.OP_WRITE) != 0) { + sockKey.interestOps(i & (~SelectionKey.OP_WRITE)); + } + } + + synchronized private void enableRead() { + int i = sockKey.interestOps(); + if ((i & SelectionKey.OP_READ) == 0) { + sockKey.interestOps(i | SelectionKey.OP_READ); + } + } + + @Override + synchronized void enableReadWriteOnly() { + sockKey.interestOps(SelectionKey.OP_READ | SelectionKey.OP_WRITE); + } + + Selector getSelector() { + return selector; + } + + @Override + void sendPacket(Packet p) throws IOException { + SocketChannel sock = (SocketChannel) sockKey.channel(); + if (sock == null) { + throw new IOException("Socket is null!"); + } + p.createBB(); + ByteBuffer pbb = p.bb; + sock.write(pbb); + } + + +} diff --git a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/ClientWatchManager.java b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/ClientWatchManager.java new file mode 100644 index 000000000..d56374dee --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/ClientWatchManager.java @@ -0,0 +1,40 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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. + */ + +package org.apache.zookeeper; + +import java.util.Set; + +/** + */ +public interface ClientWatchManager { + /** + * Return a set of watchers that should be notified of the event. The + * manager must not notify the watcher(s), however it will update it's + * internal structure as if the watches had triggered. The intent being + * that the callee is now responsible for notifying the watchers of the + * event, possibly at some later time. + * + * @param state event state + * @param type event type + * @param path event path + * @return may be empty set but must not be null + */ + public Set materialize(Watcher.Event.KeeperState state, + Watcher.Event.EventType type, String path); +} diff --git a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/CreateMode.java b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/CreateMode.java new file mode 100644 index 000000000..d87f410c8 --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/CreateMode.java @@ -0,0 +1,92 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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. + */ +package org.apache.zookeeper; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.apache.zookeeper.KeeperException; + +/*** + * CreateMode value determines how the znode is created on ZooKeeper. + */ +public enum CreateMode { + + /** + * The znode will not be automatically deleted upon client's disconnect. + */ + PERSISTENT (0, false, false), + /** + * The znode will not be automatically deleted upon client's disconnect, + * and its name will be appended with a monotonically increasing number. + */ + PERSISTENT_SEQUENTIAL (2, false, true), + /** + * The znode will be deleted upon the client's disconnect. + */ + EPHEMERAL (1, true, false), + /** + * The znode will be deleted upon the client's disconnect, and its name + * will be appended with a monotonically increasing number. + */ + EPHEMERAL_SEQUENTIAL (3, true, true); + + private static final Logger LOG = LoggerFactory.getLogger(CreateMode.class); + + private boolean ephemeral; + private boolean sequential; + private int flag; + + CreateMode(int flag, boolean ephemeral, boolean sequential) { + this.flag = flag; + this.ephemeral = ephemeral; + this.sequential = sequential; + } + + public boolean isEphemeral() { + return ephemeral; + } + + public boolean isSequential() { + return sequential; + } + + public int toFlag() { + return flag; + } + + /** + * Map an integer value to a CreateMode value + */ + static public CreateMode fromFlag(int flag) throws KeeperException { + switch(flag) { + case 0: return CreateMode.PERSISTENT; + + case 1: return CreateMode.EPHEMERAL; + + case 2: return CreateMode.PERSISTENT_SEQUENTIAL; + + case 3: return CreateMode.EPHEMERAL_SEQUENTIAL ; + + default: + String errMsg = "Received an invalid flag value: " + flag + + " to convert to a CreateMode"; + LOG.error(errMsg); + throw new KeeperException.BadArgumentsException(errMsg); + } + } +} diff --git a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/Environment.java b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/Environment.java new file mode 100644 index 000000000..34cac4ca9 --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/Environment.java @@ -0,0 +1,103 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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. + */ + +package org.apache.zookeeper; + +import java.net.InetAddress; +import java.net.UnknownHostException; +import java.util.ArrayList; +import java.util.List; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * Provide insight into the runtime environment. + * + */ +public class Environment { + public static String JAAS_CONF_KEY = "java.security.auth.login.config"; + + public static class Entry { + private String k; + private String v; + public Entry(String k, String v) { + this.k = k; + this.v = v; + } + public String getKey() { return k; } + public String getValue() { return v; } + + @Override + public String toString() { + return k + "=" + v; + } + } + + private static void put(ArrayList l, String k, String v) { + l.add(new Entry(k,v)); + } + + public static List list() { + ArrayList l = new ArrayList(); + put(l, "zookeeper.version", Version.getFullVersion()); + + try { + put(l, "host.name", + InetAddress.getLocalHost().getCanonicalHostName()); + } catch (UnknownHostException e) { + put(l, "host.name", ""); + } + + put(l, "java.version", + System.getProperty("java.version", "")); + put(l, "java.vendor", + System.getProperty("java.vendor", "")); + put(l, "java.home", + System.getProperty("java.home", "")); + put(l, "java.class.path", + System.getProperty("java.class.path", "")); + put(l, "java.library.path", + System.getProperty("java.library.path", "")); + put(l, "java.io.tmpdir", + System.getProperty("java.io.tmpdir", "")); + put(l, "java.compiler", + System.getProperty("java.compiler", "")); + put(l, "os.name", + System.getProperty("os.name", "")); + put(l, "os.arch", + System.getProperty("os.arch", "")); + put(l, "os.version", + System.getProperty("os.version", "")); + put(l, "user.name", + System.getProperty("user.name", "")); + put(l, "user.home", + System.getProperty("user.home", "")); + put(l, "user.dir", + System.getProperty("user.dir", "")); + + return l; + } + + public static void logEnv(String msg, Logger log) { + List env = Environment.list(); + for (Entry e : env) { + log.info(msg + e.toString()); + } + } +} diff --git a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/JLineZNodeCompletor.java b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/JLineZNodeCompletor.java new file mode 100644 index 000000000..02b0645af --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/JLineZNodeCompletor.java @@ -0,0 +1,84 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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. + */ + +package org.apache.zookeeper; + +import java.util.List; + +import jline.Completor; + +class JLineZNodeCompletor implements Completor { + private ZooKeeper zk; + + public JLineZNodeCompletor(ZooKeeper zk) { + this.zk = zk; + } + + @SuppressWarnings("unchecked") + public int complete(String buffer, int cursor, List candidates) { + // Guarantee that the final token is the one we're expanding + buffer = buffer.substring(0,cursor); + String token = ""; + if (!buffer.endsWith(" ")) { + String[] tokens = buffer.split(" "); + if (tokens.length != 0) { + token = tokens[tokens.length-1] ; + } + } + + if (token.startsWith("/")){ + return completeZNode( buffer, token, candidates); + } + return completeCommand(buffer, token, candidates); + } + + private int completeCommand(String buffer, String token, + List candidates) + { + for (String cmd : ZooKeeperMain.getCommands()) { + if (cmd.startsWith( token )) { + candidates.add(cmd); + } + } + return buffer.lastIndexOf(" ")+1; + } + + private int completeZNode( String buffer, String token, + List candidates) + { + String path = token; + int idx = path.lastIndexOf("/") + 1; + String prefix = path.substring(idx); + try { + // Only the root path can end in a /, so strip it off every other prefix + String dir = idx == 1 ? "/" : path.substring(0,idx-1); + List children = zk.getChildren(dir, false); + for (String child : children) { + if (child.startsWith(prefix)) { + candidates.add( child ); + } + } + } catch( InterruptedException e) { + return 0; + } + catch( KeeperException e) { + return 0; + } + return candidates.size() == 0 ? buffer.length() : buffer.lastIndexOf("/") + 1; + } +} diff --git a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/KeeperException.java b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/KeeperException.java new file mode 100644 index 000000000..2664411d3 --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/KeeperException.java @@ -0,0 +1,702 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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. + */ + +package org.apache.zookeeper; + +import java.util.ArrayList; +import java.util.EnumSet; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +@SuppressWarnings("serial") +public abstract class KeeperException extends Exception { + /** + * All multi-requests that result in an exception retain the results + * here so that it is possible to examine the problems in the catch + * scope. Non-multi requests will get a null if they try to access + * these results. + */ + private List results; + + /** + * All non-specific keeper exceptions should be constructed via + * this factory method in order to guarantee consistency in error + * codes and such. If you know the error code, then you should + * construct the special purpose exception directly. That will + * allow you to have the most specific possible declarations of + * what exceptions might actually be thrown. + * + * @param code The error code. + * @param path The ZooKeeper path being operated on. + * @return The specialized exception, presumably to be thrown by + * the caller. + */ + public static KeeperException create(Code code, String path) { + KeeperException r = create(code); + r.path = path; + return r; + } + + /** + * @deprecated deprecated in 3.1.0, use {@link #create(Code, String)} + * instead + */ + @Deprecated + public static KeeperException create(int code, String path) { + KeeperException r = create(Code.get(code)); + r.path = path; + return r; + } + + /** + * @deprecated deprecated in 3.1.0, use {@link #create(Code)} + * instead + */ + @Deprecated + public static KeeperException create(int code) { + return create(Code.get(code)); + } + + /** + * All non-specific keeper exceptions should be constructed via + * this factory method in order to guarantee consistency in error + * codes and such. If you know the error code, then you should + * construct the special purpose exception directly. That will + * allow you to have the most specific possible declarations of + * what exceptions might actually be thrown. + * + * @param code The error code of your new exception. This will + * also determine the specific type of the exception that is + * returned. + * @return The specialized exception, presumably to be thrown by + * the caller. + */ + public static KeeperException create(Code code) { + switch (code) { + case SYSTEMERROR: + return new SystemErrorException(); + case RUNTIMEINCONSISTENCY: + return new RuntimeInconsistencyException(); + case DATAINCONSISTENCY: + return new DataInconsistencyException(); + case CONNECTIONLOSS: + return new ConnectionLossException(); + case MARSHALLINGERROR: + return new MarshallingErrorException(); + case UNIMPLEMENTED: + return new UnimplementedException(); + case OPERATIONTIMEOUT: + return new OperationTimeoutException(); + case BADARGUMENTS: + return new BadArgumentsException(); + case APIERROR: + return new APIErrorException(); + case NONODE: + return new NoNodeException(); + case NOAUTH: + return new NoAuthException(); + case BADVERSION: + return new BadVersionException(); + case NOCHILDRENFOREPHEMERALS: + return new NoChildrenForEphemeralsException(); + case NODEEXISTS: + return new NodeExistsException(); + case INVALIDACL: + return new InvalidACLException(); + case AUTHFAILED: + return new AuthFailedException(); + case NOTEMPTY: + return new NotEmptyException(); + case SESSIONEXPIRED: + return new SessionExpiredException(); + case INVALIDCALLBACK: + return new InvalidCallbackException(); + case SESSIONMOVED: + return new SessionMovedException(); + case NOTREADONLY: + return new NotReadOnlyException(); + + case OK: + default: + throw new IllegalArgumentException("Invalid exception code"); + } + } + + /** + * Set the code for this exception + * @param code error code + * @deprecated deprecated in 3.1.0, exceptions should be immutable, this + * method should not be used + */ + @Deprecated + public void setCode(int code) { + this.code = Code.get(code); + } + + /** This interface contains the original static final int constants + * which have now been replaced with an enumeration in Code. Do not + * reference this class directly, if necessary (legacy code) continue + * to access the constants through Code. + * Note: an interface is used here due to the fact that enums cannot + * reference constants defined within the same enum as said constants + * are considered initialized _after_ the enum itself. By using an + * interface as a super type this allows the deprecated constants to + * be initialized first and referenced when constructing the enums. I + * didn't want to have constants declared twice. This + * interface should be private, but it's declared public to enable + * javadoc to include in the user API spec. + */ + @Deprecated + public interface CodeDeprecated { + /** + * @deprecated deprecated in 3.1.0, use {@link Code#OK} instead + */ + @Deprecated + public static final int Ok = 0; + + /** + * @deprecated deprecated in 3.1.0, use {@link Code#SYSTEMERROR} instead + */ + @Deprecated + public static final int SystemError = -1; + /** + * @deprecated deprecated in 3.1.0, use + * {@link Code#RUNTIMEINCONSISTENCY} instead + */ + @Deprecated + public static final int RuntimeInconsistency = -2; + /** + * @deprecated deprecated in 3.1.0, use {@link Code#DATAINCONSISTENCY} + * instead + */ + @Deprecated + public static final int DataInconsistency = -3; + /** + * @deprecated deprecated in 3.1.0, use {@link Code#CONNECTIONLOSS} + * instead + */ + @Deprecated + public static final int ConnectionLoss = -4; + /** + * @deprecated deprecated in 3.1.0, use {@link Code#MARSHALLINGERROR} + * instead + */ + @Deprecated + public static final int MarshallingError = -5; + /** + * @deprecated deprecated in 3.1.0, use {@link Code#UNIMPLEMENTED} + * instead + */ + @Deprecated + public static final int Unimplemented = -6; + /** + * @deprecated deprecated in 3.1.0, use {@link Code#OPERATIONTIMEOUT} + * instead + */ + @Deprecated + public static final int OperationTimeout = -7; + /** + * @deprecated deprecated in 3.1.0, use {@link Code#BADARGUMENTS} + * instead + */ + @Deprecated + public static final int BadArguments = -8; + + /** + * @deprecated deprecated in 3.1.0, use {@link Code#APIERROR} instead + */ + @Deprecated + public static final int APIError = -100; + + /** + * @deprecated deprecated in 3.1.0, use {@link Code#NONODE} instead + */ + @Deprecated + public static final int NoNode = -101; + /** + * @deprecated deprecated in 3.1.0, use {@link Code#NOAUTH} instead + */ + @Deprecated + public static final int NoAuth = -102; + /** + * @deprecated deprecated in 3.1.0, use {@link Code#BADVERSION} instead + */ + @Deprecated + public static final int BadVersion = -103; + /** + * @deprecated deprecated in 3.1.0, use + * {@link Code#NOCHILDRENFOREPHEMERALS} + * instead + */ + @Deprecated + public static final int NoChildrenForEphemerals = -108; + /** + * @deprecated deprecated in 3.1.0, use {@link Code#NODEEXISTS} instead + */ + @Deprecated + public static final int NodeExists = -110; + /** + * @deprecated deprecated in 3.1.0, use {@link Code#NOTEMPTY} instead + */ + @Deprecated + public static final int NotEmpty = -111; + /** + * @deprecated deprecated in 3.1.0, use {@link Code#SESSIONEXPIRED} instead + */ + @Deprecated + public static final int SessionExpired = -112; + /** + * @deprecated deprecated in 3.1.0, use {@link Code#INVALIDCALLBACK} + * instead + */ + @Deprecated + public static final int InvalidCallback = -113; + /** + * @deprecated deprecated in 3.1.0, use {@link Code#INVALIDACL} instead + */ + @Deprecated + public static final int InvalidACL = -114; + /** + * @deprecated deprecated in 3.1.0, use {@link Code#AUTHFAILED} instead + */ + @Deprecated + public static final int AuthFailed = -115; + /** + * This value will be used directly in {@link CODE#SESSIONMOVED} + */ + // public static final int SessionMoved = -118; + } + + /** Codes which represent the various KeeperException + * types. This enum replaces the deprecated earlier static final int + * constants. The old, deprecated, values are in "camel case" while the new + * enum values are in all CAPS. + */ + public static enum Code implements CodeDeprecated { + /** Everything is OK */ + OK (Ok), + + /** System and server-side errors. + * This is never thrown by the server, it shouldn't be used other than + * to indicate a range. Specifically error codes greater than this + * value, but lesser than {@link #APIERROR}, are system errors. + */ + SYSTEMERROR (SystemError), + + /** A runtime inconsistency was found */ + RUNTIMEINCONSISTENCY (RuntimeInconsistency), + /** A data inconsistency was found */ + DATAINCONSISTENCY (DataInconsistency), + /** Connection to the server has been lost */ + CONNECTIONLOSS (ConnectionLoss), + /** Error while marshalling or unmarshalling data */ + MARSHALLINGERROR (MarshallingError), + /** Operation is unimplemented */ + UNIMPLEMENTED (Unimplemented), + /** Operation timeout */ + OPERATIONTIMEOUT (OperationTimeout), + /** Invalid arguments */ + BADARGUMENTS (BadArguments), + + /** API errors. + * This is never thrown by the server, it shouldn't be used other than + * to indicate a range. Specifically error codes greater than this + * value are API errors (while values less than this indicate a + * {@link #SYSTEMERROR}). + */ + APIERROR (APIError), + + /** Node does not exist */ + NONODE (NoNode), + /** Not authenticated */ + NOAUTH (NoAuth), + /** Version conflict */ + BADVERSION (BadVersion), + /** Ephemeral nodes may not have children */ + NOCHILDRENFOREPHEMERALS (NoChildrenForEphemerals), + /** The node already exists */ + NODEEXISTS (NodeExists), + /** The node has children */ + NOTEMPTY (NotEmpty), + /** The session has been expired by the server */ + SESSIONEXPIRED (SessionExpired), + /** Invalid callback specified */ + INVALIDCALLBACK (InvalidCallback), + /** Invalid ACL specified */ + INVALIDACL (InvalidACL), + /** Client authentication failed */ + AUTHFAILED (AuthFailed), + /** Session moved to another server, so operation is ignored */ + SESSIONMOVED (-118), + /** State-changing request is passed to read-only server */ + NOTREADONLY (-119); + + private static final Map lookup + = new HashMap(); + + static { + for(Code c : EnumSet.allOf(Code.class)) + lookup.put(c.code, c); + } + + private final int code; + Code(int code) { + this.code = code; + } + + /** + * Get the int value for a particular Code. + * @return error code as integer + */ + public int intValue() { return code; } + + /** + * Get the Code value for a particular integer error code + * @param code int error code + * @return Code value corresponding to specified int code, or null + */ + public static Code get(int code) { + return lookup.get(code); + } + } + + static String getCodeMessage(Code code) { + switch (code) { + case OK: + return "ok"; + case SYSTEMERROR: + return "SystemError"; + case RUNTIMEINCONSISTENCY: + return "RuntimeInconsistency"; + case DATAINCONSISTENCY: + return "DataInconsistency"; + case CONNECTIONLOSS: + return "ConnectionLoss"; + case MARSHALLINGERROR: + return "MarshallingError"; + case UNIMPLEMENTED: + return "Unimplemented"; + case OPERATIONTIMEOUT: + return "OperationTimeout"; + case BADARGUMENTS: + return "BadArguments"; + case APIERROR: + return "APIError"; + case NONODE: + return "NoNode"; + case NOAUTH: + return "NoAuth"; + case BADVERSION: + return "BadVersion"; + case NOCHILDRENFOREPHEMERALS: + return "NoChildrenForEphemerals"; + case NODEEXISTS: + return "NodeExists"; + case INVALIDACL: + return "InvalidACL"; + case AUTHFAILED: + return "AuthFailed"; + case NOTEMPTY: + return "Directory not empty"; + case SESSIONEXPIRED: + return "Session expired"; + case INVALIDCALLBACK: + return "Invalid callback"; + case SESSIONMOVED: + return "Session moved"; + case NOTREADONLY: + return "Not a read-only call"; + default: + return "Unknown error " + code; + } + } + + private Code code; + + private String path; + + public KeeperException(Code code) { + this.code = code; + } + + KeeperException(Code code, String path) { + this.code = code; + this.path = path; + } + + /** + * Read the error code for this exception + * @return the error code for this exception + * @deprecated deprecated in 3.1.0, use {@link #code()} instead + */ + @Deprecated + public int getCode() { + return code.code; + } + + /** + * Read the error Code for this exception + * @return the error Code for this exception + */ + public Code code() { + return code; + } + + /** + * Read the path for this exception + * @return the path associated with this error, null if none + */ + public String getPath() { + return path; + } + + @Override + public String getMessage() { + if (path == null) { + return "KeeperErrorCode = " + getCodeMessage(code); + } + return "KeeperErrorCode = " + getCodeMessage(code) + " for " + path; + } + + void setMultiResults(List results) { + this.results = results; + } + + /** + * If this exception was thrown by a multi-request then the (partial) results + * and error codes can be retrieved using this getter. + * @return A copy of the list of results from the operations in the multi-request. + * + * @since 3.4.0 + * + */ + public List getResults() { + return results != null ? new ArrayList(results) : null; + } + + /** + * @see Code#APIERROR + */ + public static class APIErrorException extends KeeperException { + public APIErrorException() { + super(Code.APIERROR); + } + } + + /** + * @see Code#AUTHFAILED + */ + public static class AuthFailedException extends KeeperException { + public AuthFailedException() { + super(Code.AUTHFAILED); + } + } + + /** + * @see Code#BADARGUMENTS + */ + public static class BadArgumentsException extends KeeperException { + public BadArgumentsException() { + super(Code.BADARGUMENTS); + } + public BadArgumentsException(String path) { + super(Code.BADARGUMENTS, path); + } + } + + /** + * @see Code#BADVERSION + */ + public static class BadVersionException extends KeeperException { + public BadVersionException() { + super(Code.BADVERSION); + } + public BadVersionException(String path) { + super(Code.BADVERSION, path); + } + } + + /** + * @see Code#CONNECTIONLOSS + */ + public static class ConnectionLossException extends KeeperException { + public ConnectionLossException() { + super(Code.CONNECTIONLOSS); + } + } + + /** + * @see Code#DATAINCONSISTENCY + */ + public static class DataInconsistencyException extends KeeperException { + public DataInconsistencyException() { + super(Code.DATAINCONSISTENCY); + } + } + + /** + * @see Code#INVALIDACL + */ + public static class InvalidACLException extends KeeperException { + public InvalidACLException() { + super(Code.INVALIDACL); + } + public InvalidACLException(String path) { + super(Code.INVALIDACL, path); + } + } + + /** + * @see Code#INVALIDCALLBACK + */ + public static class InvalidCallbackException extends KeeperException { + public InvalidCallbackException() { + super(Code.INVALIDCALLBACK); + } + } + + /** + * @see Code#MARSHALLINGERROR + */ + public static class MarshallingErrorException extends KeeperException { + public MarshallingErrorException() { + super(Code.MARSHALLINGERROR); + } + } + + /** + * @see Code#NOAUTH + */ + public static class NoAuthException extends KeeperException { + public NoAuthException() { + super(Code.NOAUTH); + } + } + + /** + * @see Code#NOCHILDRENFOREPHEMERALS + */ + public static class NoChildrenForEphemeralsException extends KeeperException { + public NoChildrenForEphemeralsException() { + super(Code.NOCHILDRENFOREPHEMERALS); + } + public NoChildrenForEphemeralsException(String path) { + super(Code.NOCHILDRENFOREPHEMERALS, path); + } + } + + /** + * @see Code#NODEEXISTS + */ + public static class NodeExistsException extends KeeperException { + public NodeExistsException() { + super(Code.NODEEXISTS); + } + public NodeExistsException(String path) { + super(Code.NODEEXISTS, path); + } + } + + /** + * @see Code#NONODE + */ + public static class NoNodeException extends KeeperException { + public NoNodeException() { + super(Code.NONODE); + } + public NoNodeException(String path) { + super(Code.NONODE, path); + } + } + + /** + * @see Code#NOTEMPTY + */ + public static class NotEmptyException extends KeeperException { + public NotEmptyException() { + super(Code.NOTEMPTY); + } + public NotEmptyException(String path) { + super(Code.NOTEMPTY, path); + } + } + + /** + * @see Code#OPERATIONTIMEOUT + */ + public static class OperationTimeoutException extends KeeperException { + public OperationTimeoutException() { + super(Code.OPERATIONTIMEOUT); + } + } + + /** + * @see Code#RUNTIMEINCONSISTENCY + */ + public static class RuntimeInconsistencyException extends KeeperException { + public RuntimeInconsistencyException() { + super(Code.RUNTIMEINCONSISTENCY); + } + } + + /** + * @see Code#SESSIONEXPIRED + */ + public static class SessionExpiredException extends KeeperException { + public SessionExpiredException() { + super(Code.SESSIONEXPIRED); + } + } + + /** + * @see Code#SESSIONMOVED + */ + public static class SessionMovedException extends KeeperException { + public SessionMovedException() { + super(Code.SESSIONMOVED); + } + } + + /** + * @see Code#NOTREADONLY + */ + public static class NotReadOnlyException extends KeeperException { + public NotReadOnlyException() { + super(Code.NOTREADONLY); + } + } + + /** + * @see Code#SYSTEMERROR + */ + public static class SystemErrorException extends KeeperException { + public SystemErrorException() { + super(Code.SYSTEMERROR); + } + } + + /** + * @see Code#UNIMPLEMENTED + */ + public static class UnimplementedException extends KeeperException { + public UnimplementedException() { + super(Code.UNIMPLEMENTED); + } + } +} diff --git a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/Login.java b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/Login.java new file mode 100644 index 000000000..31ac39a28 --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/Login.java @@ -0,0 +1,402 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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. + */ + +package org.apache.zookeeper; + +/** + * This class is responsible for refreshing Kerberos credentials for + * logins for both Zookeeper client and server. + * See ZooKeeperSaslServer for server-side usage. + * See ZooKeeperSaslClient for client-side usage. + */ + +import javax.security.auth.kerberos.KerberosPrincipal; +import javax.security.auth.login.AppConfigurationEntry; +import javax.security.auth.login.Configuration; +import javax.security.auth.login.LoginContext; +import javax.security.auth.login.LoginException; +import javax.security.auth.callback.CallbackHandler; + +import org.apache.log4j.Logger; +import org.apache.zookeeper.client.ZooKeeperSaslClient; +import javax.security.auth.kerberos.KerberosTicket; +import javax.security.auth.Subject; +import java.util.Date; +import java.util.Random; +import java.util.Set; + +public class Login { + Logger LOG = Logger.getLogger(Login.class); + public CallbackHandler callbackHandler; + + // LoginThread will sleep until 80% of time from last refresh to + // ticket's expiry has been reached, at which time it will wake + // and try to renew the ticket. + private static final float TICKET_RENEW_WINDOW = 0.80f; + + /** + * Percentage of random jitter added to the renewal time + */ + private static final float TICKET_RENEW_JITTER = 0.05f; + + // Regardless of TICKET_RENEW_WINDOW setting above and the ticket expiry time, + // thread will not sleep between refresh attempts any less than 1 minute (60*1000 milliseconds = 1 minute). + // Change the '1' to e.g. 5, to change this to 5 minutes. + private static final long MIN_TIME_BEFORE_RELOGIN = 1 * 60 * 1000L; + + private Subject subject = null; + private Thread t = null; + private boolean isKrbTicket = false; + private boolean isUsingTicketCache = false; + private boolean isUsingKeytab = false; + + /** Random number generator */ + private static Random rng = new Random(); + + private LoginContext login = null; + private String loginContextName = null; + private String keytabFile = null; + private String principal = null; + + private long lastLogin = 0; + + /** + * LoginThread constructor. The constructor starts the thread used + * to periodically re-login to the Kerberos Ticket Granting Server. + * @param loginContextName + * name of section in JAAS file that will be use to login. + * Passed as first param to javax.security.auth.login.LoginContext(). + * + * @param callbackHandler + * Passed as second param to javax.security.auth.login.LoginContext(). + * @throws javax.security.auth.login.LoginException + * Thrown if authentication fails. + */ + public Login(final String loginContextName, CallbackHandler callbackHandler) + throws LoginException { + this.callbackHandler = callbackHandler; + login = login(loginContextName); + this.loginContextName = loginContextName; + subject = login.getSubject(); + isKrbTicket = !subject.getPrivateCredentials(KerberosTicket.class).isEmpty(); + AppConfigurationEntry entries[] = Configuration.getConfiguration().getAppConfigurationEntry(loginContextName); + for (AppConfigurationEntry entry: entries) { + // there will only be a single entry, so this for() loop will only be iterated through once. + if (entry.getOptions().get("useTicketCache") != null) { + String val = (String)entry.getOptions().get("useTicketCache"); + if (val.equals("true")) { + isUsingTicketCache = true; + } + } + if (entry.getOptions().get("keyTab") != null) { + keytabFile = (String)entry.getOptions().get("keyTab"); + isUsingKeytab = true; + } + if (entry.getOptions().get("principal") != null) { + principal = (String)entry.getOptions().get("principal"); + } + break; + } + + if (!isKrbTicket) { + // if no TGT, do not bother with ticket management. + return; + } + + // Refresh the Ticket Granting Ticket (TGT) periodically. How often to refresh is determined by the + // TGT's existing expiry date and the configured MIN_TIME_BEFORE_RELOGIN. For testing and development, + // you can decrease the interval of expiration of tickets (for example, to 3 minutes) by running : + // "modprinc -maxlife 3mins " in kadmin. + t = new Thread(new Runnable() { + public void run() { + LOG.info("TGT refresh thread started."); + while (true) { // renewal thread's main loop. if it exits from here, thread will exit. + KerberosTicket tgt = getTGT(); + long now = System.currentTimeMillis(); + long nextRefresh; + Date nextRefreshDate; + if (tgt == null) { + nextRefresh = now + MIN_TIME_BEFORE_RELOGIN; + nextRefreshDate = new Date(nextRefresh); + LOG.warn("No TGT found: will try again at " + nextRefreshDate); + } else { + nextRefresh = getRefreshTime(tgt); + long expiry = tgt.getEndTime().getTime(); + Date expiryDate = new Date(expiry); + if ((isUsingTicketCache) && (tgt.getEndTime().equals(tgt.getRenewTill()))) { + LOG.error("The TGT cannot be renewed beyond the next expiry date: " + expiryDate + "." + + "This process will not be able to authenticate new SASL connections after that " + + "time (for example, it will not be authenticate a new connection with a Zookeeper " + + "Quorum member). Ask your system administrator to either increase the " + + "'renew until' time by doing : 'modprinc -maxrenewlife " + principal + "' within " + + "kadmin, or instead, to generate a keytab for " + principal + ". Because the TGT's " + + "expiry cannot be further extended by refreshing, exiting refresh thread now."); + return; + } + // determine how long to sleep from looking at ticket's expiry. + // We should not allow the ticket to expire, but we should take into consideration + // MIN_TIME_BEFORE_RELOGIN. Will not sleep less than MIN_TIME_BEFORE_RELOGIN, unless doing so + // would cause ticket expiration. + if ((nextRefresh > expiry) || + ((now + MIN_TIME_BEFORE_RELOGIN) > expiry)) { + // expiry is before next scheduled refresh). + LOG.info("refreshing now because expiry is before next scheduled refresh time."); + nextRefresh = now; + } else { + if (nextRefresh < (now + MIN_TIME_BEFORE_RELOGIN)) { + // next scheduled refresh is sooner than (now + MIN_TIME_BEFORE_LOGIN). + Date until = new Date(nextRefresh); + Date newuntil = new Date(now + MIN_TIME_BEFORE_RELOGIN); + LOG.warn("TGT refresh thread time adjusted from : " + until + " to : " + newuntil + " since " + + "the former is sooner than the minimum refresh interval (" + + MIN_TIME_BEFORE_RELOGIN / 1000 + " seconds) from now."); + } + nextRefresh = Math.max(nextRefresh, now + MIN_TIME_BEFORE_RELOGIN); + } + nextRefreshDate = new Date(nextRefresh); + if (nextRefresh > expiry) { + LOG.error("next refresh: " + nextRefreshDate + " is later than expiry " + expiryDate + + ". This may indicate a clock skew problem. Check that this host and the KDC's " + + "hosts' clocks are in sync. Exiting refresh thread."); + return; + } + } + if (now < nextRefresh) { + Date until = new Date(nextRefresh); + LOG.info("TGT refresh sleeping until: " + until.toString()); + try { + Thread.sleep(nextRefresh - now); + } catch (InterruptedException ie) { + LOG.warn("TGT renewal thread has been interrupted and will exit."); + break; + } + } + else { + LOG.error("nextRefresh:" + nextRefreshDate + " is in the past: exiting refresh thread. Check" + + " clock sync between this host and KDC - (KDC's clock is likely ahead of this host)." + + " Manual intervention will be required for this client to successfully authenticate." + + " Exiting refresh thread."); + return; + } + if (isUsingTicketCache) { + String cmd = "/usr/bin/kinit"; + if (System.getProperty("zookeeper.kinit") != null) { + cmd = System.getProperty("zookeeper.kinit"); + } + String kinitArgs = "-R"; + int retry = 1; + while (retry >= 0) { + try { + LOG.debug("running ticket cache refresh command: " + cmd + " " + kinitArgs); + Shell.execCommand(cmd, kinitArgs); + break; + } catch (Exception e) { + if (retry > 0) { + --retry; + // sleep for 10 seconds + try { + Thread.sleep(10 * 1000); + } catch (InterruptedException ie) { + LOG.error("Interrupted while renewing TGT, exiting Login thread"); + return; + } + } else { + LOG.warn("Could not renew TGT due to problem running shell command: '" + cmd + + " " + kinitArgs + "'" + "; exception was:" + e + ". Exiting refresh thread.",e); + return; + } + } + } + } + try { + int retry = 1; + while (retry >= 0) { + try { + reLogin(); + break; + } catch (LoginException le) { + if (retry > 0) { + --retry; + // sleep for 10 seconds. + try { + Thread.sleep(10 * 1000); + } catch (InterruptedException e) { + LOG.error("Interrupted during login retry after LoginException:", le); + throw le; + } + } else { + LOG.error("Could not refresh TGT for principal: " + principal + ".", le); + } + } + } + } catch (LoginException le) { + LOG.error("Failed to refresh TGT: refresh thread exiting now.",le); + break; + } + } + } + }); + t.setDaemon(true); + } + + public void startThreadIfNeeded() { + // thread object 't' will be null if a refresh thread is not needed. + if (t != null) { + t.start(); + } + } + + public void shutdown() { + if ((t != null) && (t.isAlive())) { + t.interrupt(); + try { + t.join(); + } catch (InterruptedException e) { + LOG.warn("error while waiting for Login thread to shutdown: " + e); + } + } + } + + public Subject getSubject() { + return subject; + } + + public String getLoginContextName() { + return loginContextName; + } + + private synchronized LoginContext login(final String loginContextName) throws LoginException { + if (loginContextName == null) { + throw new LoginException("loginContext name (JAAS file section header) was null. " + + "Please check your java.security.login.auth.config (=" + + System.getProperty("java.security.login.auth.config") + + ") and your " + ZooKeeperSaslClient.LOGIN_CONTEXT_NAME_KEY + "(=" + + System.getProperty(ZooKeeperSaslClient.LOGIN_CONTEXT_NAME_KEY, "Client") + ")"); + } + LoginContext loginContext = new LoginContext(loginContextName,callbackHandler); + loginContext.login(); + LOG.info("successfully logged in."); + return loginContext; + } + + // c.f. org.apache.hadoop.security.UserGroupInformation. + private long getRefreshTime(KerberosTicket tgt) { + long start = tgt.getStartTime().getTime(); + long expires = tgt.getEndTime().getTime(); + LOG.info("TGT valid starting at: " + tgt.getStartTime().toString()); + LOG.info("TGT expires: " + tgt.getEndTime().toString()); + long proposedRefresh = start + (long) ((expires - start) * + (TICKET_RENEW_WINDOW + (TICKET_RENEW_JITTER * rng.nextDouble()))); + if (proposedRefresh > expires) { + // proposedRefresh is too far in the future: it's after ticket expires: simply return now. + return System.currentTimeMillis(); + } + else { + return proposedRefresh; + } + } + + private synchronized KerberosTicket getTGT() { + Set tickets = subject.getPrivateCredentials(KerberosTicket.class); + for(KerberosTicket ticket: tickets) { + KerberosPrincipal server = ticket.getServer(); + if (server.getName().equals("krbtgt/" + server.getRealm() + "@" + server.getRealm())) { + LOG.debug("Found tgt " + ticket + "."); + return ticket; + } + } + return null; + } + + private boolean hasSufficientTimeElapsed() { + long now = System.currentTimeMillis(); + if (now - getLastLogin() < MIN_TIME_BEFORE_RELOGIN ) { + LOG.warn("Not attempting to re-login since the last re-login was " + + "attempted less than " + (MIN_TIME_BEFORE_RELOGIN/1000) + " seconds"+ + " before."); + return false; + } + // register most recent relogin attempt + setLastLogin(now); + return true; + } + + /** + * Returns login object + * @return login + */ + private LoginContext getLogin() { + return login; + } + + /** + * Set the login object + * @param login + */ + private void setLogin(LoginContext login) { + this.login = login; + } + + /** + * Set the last login time. + * @param time the number of milliseconds since the beginning of time + */ + private void setLastLogin(long time) { + lastLogin = time; + } + + /** + * Get the time of the last login. + * @return the number of milliseconds since the beginning of time. + */ + private long getLastLogin() { + return lastLogin; + } + + /** + * Re-login a principal. This method assumes that {@link #login(String)} has happened already. + * @throws javax.security.auth.login.LoginException on a failure + */ + // c.f. HADOOP-6559 + private synchronized void reLogin() + throws LoginException { + if (!isKrbTicket) { + return; + } + LoginContext login = getLogin(); + if (login == null) { + throw new LoginException("login must be done first"); + } + if (!hasSufficientTimeElapsed()) { + return; + } + LOG.info("Initiating logout for " + principal); + synchronized (Login.class) { + //clear up the kerberos state. But the tokens are not cleared! As per + //the Java kerberos login module code, only the kerberos credentials + //are cleared + login.logout(); + //login and also update the subject field of this instance to + //have the new credentials (pass it to the LoginContext constructor) + login = new LoginContext(loginContextName, getSubject()); + LOG.info("Initiating re-login for " + principal); + login.login(); + setLogin(login); + } + } +} diff --git a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/MultiResponse.java b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/MultiResponse.java new file mode 100644 index 000000000..70f76236e --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/MultiResponse.java @@ -0,0 +1,166 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + */ + +package org.apache.zookeeper; + +import org.apache.jute.InputArchive; +import org.apache.jute.OutputArchive; +import org.apache.jute.Record; +import org.apache.zookeeper.proto.CreateResponse; +import org.apache.zookeeper.proto.MultiHeader; +import org.apache.zookeeper.proto.SetDataResponse; +import org.apache.zookeeper.proto.ErrorResponse; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; + +/** + * Handles the response from a multi request. Such a response consists of + * a sequence of responses each prefixed by a MultiResponse that indicates + * the type of the response. The end of the list is indicated by a MultiHeader + * with a negative type. Each individual response is in the same format as + * with the corresponding operation in the original request list. + */ +public class MultiResponse implements Record, Iterable { + private List results = new ArrayList(); + + public void add(OpResult x) { + results.add(x); + } + + @Override + public Iterator iterator() { + return results.iterator(); + } + + public int size() { + return results.size(); + } + + @Override + public void serialize(OutputArchive archive, String tag) throws IOException { + archive.startRecord(this, tag); + + int index = 0; + for (OpResult result : results) { + int err = result.getType() == ZooDefs.OpCode.error ? ((OpResult.ErrorResult)result).getErr() : 0; + + new MultiHeader(result.getType(), false, err).serialize(archive, tag); + + switch (result.getType()) { + case ZooDefs.OpCode.create: + new CreateResponse(((OpResult.CreateResult) result).getPath()).serialize(archive, tag); + break; + case ZooDefs.OpCode.delete: + case ZooDefs.OpCode.check: + break; + case ZooDefs.OpCode.setData: + new SetDataResponse(((OpResult.SetDataResult) result).getStat()).serialize(archive, tag); + break; + case ZooDefs.OpCode.error: + new ErrorResponse(((OpResult.ErrorResult) result).getErr()).serialize(archive, tag); + break; + default: + throw new IOException("Invalid type " + result.getType() + " in MultiResponse"); + } + } + new MultiHeader(-1, true, -1).serialize(archive, tag); + archive.endRecord(this, tag); + } + + @Override + public void deserialize(InputArchive archive, String tag) throws IOException { + results = new ArrayList(); + + archive.startRecord(tag); + MultiHeader h = new MultiHeader(); + h.deserialize(archive, tag); + while (!h.getDone()) { + switch (h.getType()) { + case ZooDefs.OpCode.create: + CreateResponse cr = new CreateResponse(); + cr.deserialize(archive, tag); + results.add(new OpResult.CreateResult(cr.getPath())); + break; + + case ZooDefs.OpCode.delete: + results.add(new OpResult.DeleteResult()); + break; + + case ZooDefs.OpCode.setData: + SetDataResponse sdr = new SetDataResponse(); + sdr.deserialize(archive, tag); + results.add(new OpResult.SetDataResult(sdr.getStat())); + break; + + case ZooDefs.OpCode.check: + results.add(new OpResult.CheckResult()); + break; + + case ZooDefs.OpCode.error: + //FIXME: need way to more cleanly serialize/deserialize exceptions + ErrorResponse er = new ErrorResponse(); + er.deserialize(archive, tag); + results.add(new OpResult.ErrorResult(er.getErr())); + break; + + default: + throw new IOException("Invalid type " + h.getType() + " in MultiResponse"); + } + h.deserialize(archive, tag); + } + archive.endRecord(tag); + } + + public List getResultList() { + return results; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (!(o instanceof MultiResponse)) return false; + + MultiResponse other = (MultiResponse) o; + + if (results != null) { + Iterator i = other.results.iterator(); + for (OpResult result : results) { + if (i.hasNext()) { + if (!result.equals(i.next())) { + return false; + } + } else { + return false; + } + } + return !i.hasNext(); + } + else return other.results == null; + } + + @Override + public int hashCode() { + int hash = results.size(); + for (OpResult result : results) { + hash = (hash * 35) + result.hashCode(); + } + return hash; + } +} diff --git a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/MultiTransactionRecord.java b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/MultiTransactionRecord.java new file mode 100644 index 000000000..801969a9a --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/MultiTransactionRecord.java @@ -0,0 +1,160 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + */ + +package org.apache.zookeeper; + +import org.apache.jute.InputArchive; +import org.apache.jute.OutputArchive; +import org.apache.jute.Record; +import org.apache.zookeeper.proto.*; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; + +/** + * Encodes a composite transaction. In the wire format, each transaction + * consists of a single MultiHeader followed by the appropriate request. + * Each of these MultiHeaders has a type which indicates + * the type of the following transaction or a negative number if no more transactions + * are included. + */ +public class MultiTransactionRecord implements Record, Iterable { + private List ops = new ArrayList(); + + public MultiTransactionRecord() { + } + + public MultiTransactionRecord(Iterable ops) { + for (Op op : ops) { + add(op); + } + } + + @Override + public Iterator iterator() { + return ops.iterator() ; + } + + public void add(Op op) { + ops.add(op); + } + + public int size() { + return ops.size(); + } + + @Override + public void serialize(OutputArchive archive, String tag) throws IOException { + archive.startRecord(this, tag); + int index = 0 ; + for (Op op : ops) { + MultiHeader h = new MultiHeader(op.getType(), false, -1); + h.serialize(archive, tag); + switch (op.getType()) { + case ZooDefs.OpCode.create: + op.toRequestRecord().serialize(archive, tag); + break; + case ZooDefs.OpCode.delete: + op.toRequestRecord().serialize(archive, tag); + break; + case ZooDefs.OpCode.setData: + op.toRequestRecord().serialize(archive, tag); + break; + case ZooDefs.OpCode.check: + op.toRequestRecord().serialize(archive, tag); + break; + default: + throw new IOException("Invalid type of op"); + } + } + new MultiHeader(-1, true, -1).serialize(archive, tag); + archive.endRecord(this, tag); + } + + @Override + public void deserialize(InputArchive archive, String tag) throws IOException { + archive.startRecord(tag); + MultiHeader h = new MultiHeader(); + h.deserialize(archive, tag); + + while (!h.getDone()) { + switch (h.getType()) { + case ZooDefs.OpCode.create: + CreateRequest cr = new CreateRequest(); + cr.deserialize(archive, tag); + add(Op.create(cr.getPath(), cr.getData(), cr.getAcl(), cr.getFlags())); + break; + case ZooDefs.OpCode.delete: + DeleteRequest dr = new DeleteRequest(); + dr.deserialize(archive, tag); + add(Op.delete(dr.getPath(), dr.getVersion())); + break; + case ZooDefs.OpCode.setData: + SetDataRequest sdr = new SetDataRequest(); + sdr.deserialize(archive, tag); + add(Op.setData(sdr.getPath(), sdr.getData(), sdr.getVersion())); + break; + case ZooDefs.OpCode.check: + CheckVersionRequest cvr = new CheckVersionRequest(); + cvr.deserialize(archive, tag); + add(Op.check(cvr.getPath(), cvr.getVersion())); + break; + default: + throw new IOException("Invalid type of op"); + } + h.deserialize(archive, tag); + } + archive.endRecord(tag); + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (!(o instanceof MultiTransactionRecord)) return false; + + MultiTransactionRecord that = (MultiTransactionRecord) o; + + if (ops != null) { + Iterator other = that.ops.iterator(); + for (Op op : ops) { + boolean hasMoreData = other.hasNext(); + if (!hasMoreData) { + return false; + } + Op otherOp = other.next(); + if (!op.equals(otherOp)) { + return false; + } + } + return !other.hasNext(); + } else { + return that.ops == null; + } + + } + + @Override + public int hashCode() { + int h = 1023; + for (Op op : ops) { + h = h * 25 + op.hashCode(); + } + return h; + } +} diff --git a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/Op.java b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/Op.java new file mode 100644 index 000000000..1bc206101 --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/Op.java @@ -0,0 +1,351 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + */ + +package org.apache.zookeeper; + +import org.apache.jute.Record; +import org.apache.zookeeper.common.PathUtils; +import org.apache.zookeeper.data.ACL; +import org.apache.zookeeper.proto.CheckVersionRequest; +import org.apache.zookeeper.proto.CreateRequest; +import org.apache.zookeeper.proto.DeleteRequest; +import org.apache.zookeeper.proto.SetDataRequest; + +import java.util.Arrays; +import java.util.Iterator; +import java.util.List; + +/** + * Represents a single operation in a multi-operation transaction. Each operation can be a create, update + * or delete or can just be a version check. + * + * Sub-classes of Op each represent each detailed type but should not normally be referenced except via + * the provided factory methods. + * + * @see ZooKeeper#create(String, byte[], java.util.List, CreateMode) + * @see ZooKeeper#create(String, byte[], java.util.List, CreateMode, org.apache.zookeeper.AsyncCallback.StringCallback, Object) + * @see ZooKeeper#delete(String, int) + * @see ZooKeeper#setData(String, byte[], int) + */ +public abstract class Op { + private int type; + private String path; + + // prevent untyped construction + private Op(int type, String path) { + this.type = type; + this.path = path; + } + + /** + * Constructs a create operation. Arguments are as for the ZooKeeper method of the same name. + * @see ZooKeeper#create(String, byte[], java.util.List, CreateMode) + * @see CreateMode#fromFlag(int) + * + * @param path + * the path for the node + * @param data + * the initial data for the node + * @param acl + * the acl for the node + * @param flags + * specifying whether the node to be created is ephemeral + * and/or sequential but using the integer encoding. + */ + public static Op create(String path, byte[] data, List acl, int flags) { + return new Create(path, data, acl, flags); + } + + /** + * Constructs a create operation. Arguments are as for the ZooKeeper method of the same name. + * @see ZooKeeper#create(String, byte[], java.util.List, CreateMode) + * + * @param path + * the path for the node + * @param data + * the initial data for the node + * @param acl + * the acl for the node + * @param createMode + * specifying whether the node to be created is ephemeral + * and/or sequential + */ + public static Op create(String path, byte[] data, List acl, CreateMode createMode) { + return new Create(path, data, acl, createMode); + } + + /** + * Constructs a delete operation. Arguments are as for the ZooKeeper method of the same name. + * @see ZooKeeper#delete(String, int) + * + * @param path + * the path of the node to be deleted. + * @param version + * the expected node version. + */ + public static Op delete(String path, int version) { + return new Delete(path, version); + } + + /** + * Constructs an update operation. Arguments are as for the ZooKeeper method of the same name. + * @see ZooKeeper#setData(String, byte[], int) + * + * @param path + * the path of the node + * @param data + * the data to set + * @param version + * the expected matching version + */ + public static Op setData(String path, byte[] data, int version) { + return new SetData(path, data, version); + } + + + /** + * Constructs an version check operation. Arguments are as for the ZooKeeper.setData method except that + * no data is provided since no update is intended. The purpose for this is to allow read-modify-write + * operations that apply to multiple znodes, but where some of the znodes are involved only in the read, + * not the write. A similar effect could be achieved by writing the same data back, but that leads to + * way more version updates than are necessary and more writing in general. + * + * @param path + * the path of the node + * @param version + * the expected matching version + */ + public static Op check(String path, int version) { + return new Check(path, version); + } + + /** + * Gets the integer type code for an Op. This code should be as from ZooDefs.OpCode + * @see ZooDefs.OpCode + * @return The type code. + */ + public int getType() { + return type; + } + + /** + * Gets the path for an Op. + * @return The path. + */ + public String getPath() { + return path; + } + + /** + * Encodes an op for wire transmission. + * @return An appropriate Record structure. + */ + public abstract Record toRequestRecord() ; + + /** + * Reconstructs the transaction with the chroot prefix. + * + * @return transaction with chroot. + */ + abstract Op withChroot(String addRootPrefix); + + /** + * Performs client path validations. + * + * @throws IllegalArgumentException + * if an invalid path is specified + * @throws KeeperException.BadArgumentsException + * if an invalid create mode flag is specified + */ + void validate() throws KeeperException { + PathUtils.validatePath(path); + } + + ////////////////// + // these internal classes are public, but should not generally be referenced. + // + public static class Create extends Op { + private byte[] data; + private List acl; + private int flags; + + private Create(String path, byte[] data, List acl, int flags) { + super(ZooDefs.OpCode.create, path); + this.data = data; + this.acl = acl; + this.flags = flags; + } + + private Create(String path, byte[] data, List acl, CreateMode createMode) { + super(ZooDefs.OpCode.create, path); + this.data = data; + this.acl = acl; + this.flags = createMode.toFlag(); + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (!(o instanceof Create)) return false; + + Create op = (Create) o; + + boolean aclEquals = true; + Iterator i = op.acl.iterator(); + for (ACL acl : op.acl) { + boolean hasMoreData = i.hasNext(); + if (!hasMoreData) { + aclEquals = false; + break; + } + ACL otherAcl = i.next(); + if (!acl.equals(otherAcl)) { + aclEquals = false; + break; + } + } + return !i.hasNext() && getType() == op.getType() && Arrays.equals(data, op.data) && flags == op.flags && aclEquals; + } + + @Override + public int hashCode() { + return getType() + getPath().hashCode() + Arrays.hashCode(data); + } + + @Override + public Record toRequestRecord() { + return new CreateRequest(getPath(), data, acl, flags); + } + + @Override + Op withChroot(String path) { + return new Create(path, data, acl, flags); + } + + @Override + void validate() throws KeeperException { + CreateMode createMode = CreateMode.fromFlag(flags); + PathUtils.validatePath(getPath(), createMode.isSequential()); + } + } + + public static class Delete extends Op { + private int version; + + private Delete(String path, int version) { + super(ZooDefs.OpCode.delete, path); + this.version = version; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (!(o instanceof Delete)) return false; + + Delete op = (Delete) o; + + return getType() == op.getType() && version == op.version + && getPath().equals(op.getPath()); + } + + @Override + public int hashCode() { + return getType() + getPath().hashCode() + version; + } + + @Override + public Record toRequestRecord() { + return new DeleteRequest(getPath(), version); + } + + @Override + Op withChroot(String path) { + return new Delete(path, version); + } + } + + public static class SetData extends Op { + private byte[] data; + private int version; + + private SetData(String path, byte[] data, int version) { + super(ZooDefs.OpCode.setData, path); + this.data = data; + this.version = version; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (!(o instanceof SetData)) return false; + + SetData op = (SetData) o; + + return getType() == op.getType() && version == op.version + && getPath().equals(op.getPath()) && Arrays.equals(data, op.data); + } + + @Override + public int hashCode() { + return getType() + getPath().hashCode() + Arrays.hashCode(data) + version; + } + + @Override + public Record toRequestRecord() { + return new SetDataRequest(getPath(), data, version); + } + + @Override + Op withChroot(String path) { + return new SetData(path, data, version); + } + } + + public static class Check extends Op { + private int version; + + private Check(String path, int version) { + super(ZooDefs.OpCode.check, path); + this.version = version; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (!(o instanceof Check)) return false; + + Check op = (Check) o; + + return getType() == op.getType() && getPath().equals(op.getPath()) && version == op.version; + } + + @Override + public int hashCode() { + return getType() + getPath().hashCode() + version; + } + + @Override + public Record toRequestRecord() { + return new CheckVersionRequest(getPath(), version); + } + + @Override + Op withChroot(String path) { + return new Check(path, version); + } + } +} diff --git a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/OpResult.java b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/OpResult.java new file mode 100644 index 000000000..45331d114 --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/OpResult.java @@ -0,0 +1,185 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + */ + +package org.apache.zookeeper; + + +import org.apache.zookeeper.data.Stat; + +/** + * Encodes the result of a single part of a multiple operation commit. + */ +public abstract class OpResult { + private int type; + + private OpResult(int type) { + this.type = type; + } + + /** + * Encodes the return type as from ZooDefs.OpCode. Can be used + * to dispatch to the correct cast needed for getting the desired + * additional result data. + * @see ZooDefs.OpCode + * @return an integer identifying what kind of operation this result came from. + */ + public int getType() { + return type; + } + + /** + * A result from a create operation. This kind of result allows the + * path to be retrieved since the create might have been a sequential + * create. + */ + public static class CreateResult extends OpResult { + private String path; + + public CreateResult(String path) { + super(ZooDefs.OpCode.create); + this.path = path; + } + + public String getPath() { + return path; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (!(o instanceof CreateResult)) return false; + + CreateResult other = (CreateResult) o; + return getType() == other.getType() && path.equals(other.getPath()); + } + + @Override + public int hashCode() { + return getType() * 35 + path.hashCode(); + } + } + + /** + * A result from a delete operation. No special values are available. + */ + public static class DeleteResult extends OpResult { + public DeleteResult() { + super(ZooDefs.OpCode.delete); + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (!(o instanceof DeleteResult)) return false; + + DeleteResult opResult = (DeleteResult) o; + return getType() == opResult.getType(); + } + + @Override + public int hashCode() { + return getType(); + } + } + + /** + * A result from a setData operation. This kind of result provides access + * to the Stat structure from the update. + */ + public static class SetDataResult extends OpResult { + private Stat stat; + + public SetDataResult(Stat stat) { + super(ZooDefs.OpCode.setData); + this.stat = stat; + } + + public Stat getStat() { + return stat; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (!(o instanceof SetDataResult)) return false; + + SetDataResult other = (SetDataResult) o; + return getType() == other.getType() && stat.getMzxid() == other.stat.getMzxid(); + } + + @Override + public int hashCode() { + return (int) (getType() * 35 + stat.getMzxid()); + } + } + + /** + * A result from a version check operation. No special values are available. + */ + public static class CheckResult extends OpResult { + public CheckResult() { + super(ZooDefs.OpCode.check); + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (!(o instanceof CheckResult)) return false; + + CheckResult other = (CheckResult) o; + return getType() == other.getType(); + } + + @Override + public int hashCode() { + return getType(); + } + } + + /** + * An error result from any kind of operation. The point of error results + * is that they contain an error code which helps understand what happened. + * @see KeeperException.Code + * + */ + public static class ErrorResult extends OpResult { + private int err; + + public ErrorResult(int err) { + super(ZooDefs.OpCode.error); + this.err = err; + } + + public int getErr() { + return err; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (!(o instanceof ErrorResult)) return false; + + ErrorResult other = (ErrorResult) o; + return getType() == other.getType() && err == other.getErr(); + } + + @Override + public int hashCode() { + return getType() * 35 + err; + } + } +} diff --git a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/Quotas.java b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/Quotas.java new file mode 100644 index 000000000..b82e3395d --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/Quotas.java @@ -0,0 +1,68 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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. + */ + +package org.apache.zookeeper; + +/** + * this class manages quotas + * and has many other utils + * for quota + */ +public class Quotas { + + /** the zookeeper nodes that acts as the management and status node **/ + public static final String procZookeeper = "/zookeeper"; + + /** the zookeeper quota node that acts as the quota + * management node for zookeeper */ + public static final String quotaZookeeper = "/zookeeper/quota"; + + /** + * the limit node that has the limit of + * a subtree + */ + public static final String limitNode = "zookeeper_limits"; + + /** + * the stat node that monitors the limit of + * a subtree. + */ + public static final String statNode = "zookeeper_stats"; + + /** + * return the quota path associated with this + * prefix + * @param path the actual path in zookeeper. + * @return the limit quota path + */ + public static String quotaPath(String path) { + return quotaZookeeper + path + + "/" + limitNode; + } + + /** + * return the stat quota path associated with this + * prefix. + * @param path the actual path in zookeeper + * @return the stat quota path + */ + public static String statPath(String path) { + return quotaZookeeper + path + "/" + + statNode; + } +} diff --git a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/ServerAdminClient.java b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/ServerAdminClient.java new file mode 100644 index 000000000..da17fcfcb --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/ServerAdminClient.java @@ -0,0 +1,313 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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. + */ + +package org.apache.zookeeper; + +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.net.InetSocketAddress; +import java.net.Socket; +import java.nio.ByteBuffer; +import java.util.StringTokenizer; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import org.apache.zookeeper.server.ZooTrace; + +public class ServerAdminClient { + private static final Logger LOG = LoggerFactory.getLogger(ServerAdminClient.class); + + private static long getMask(String mask) { + long retv = 0; + if (mask.equalsIgnoreCase("CLIENT_REQUEST_TRACE_MASK")) { + retv = ZooTrace.CLIENT_REQUEST_TRACE_MASK; + } else if (mask.equalsIgnoreCase("CLIENT_DATA_PACKET_TRACE_MASK")) { + retv = ZooTrace.CLIENT_DATA_PACKET_TRACE_MASK; + } else if (mask.equalsIgnoreCase("CLIENT_PING_TRACE_MASK")) { + retv = ZooTrace.CLIENT_PING_TRACE_MASK; + } else if (mask.equalsIgnoreCase("SERVER_PACKET_TRACE_MASK")) { + retv = ZooTrace.SERVER_PACKET_TRACE_MASK; + } else if (mask.equalsIgnoreCase("SESSION_TRACE_MASK")) { + retv = ZooTrace.SESSION_TRACE_MASK; + } else if (mask.equalsIgnoreCase("EVENT_DELIVERY_TRACE_MASK")) { + retv = ZooTrace.EVENT_DELIVERY_TRACE_MASK; + } else if (mask.equalsIgnoreCase("SERVER_PING_TRACE_MASK")) { + retv = ZooTrace.SERVER_PING_TRACE_MASK; + } else if (mask.equalsIgnoreCase("WARNING_TRACE_MASK")) { + retv = ZooTrace.WARNING_TRACE_MASK; + } + return retv; + } + + private static long getMasks(String masks) { + long retv = 0; + StringTokenizer st = new StringTokenizer(masks, "|"); + while (st.hasMoreTokens()) { + String mask = st.nextToken().trim(); + retv = retv | getMask(mask); + } + return retv; + } + + public static void ruok(String host, int port) { + Socket s = null; + try { + byte[] reqBytes = new byte[4]; + ByteBuffer req = ByteBuffer.wrap(reqBytes); + req.putInt(ByteBuffer.wrap("ruok".getBytes()).getInt()); + s = new Socket(); + s.setSoLinger(false, 10); + s.setSoTimeout(20000); + s.connect(new InetSocketAddress(host, port)); + + InputStream is = s.getInputStream(); + OutputStream os = s.getOutputStream(); + + os.write(reqBytes); + + byte[] resBytes = new byte[4]; + + int rc = is.read(resBytes); + String retv = new String(resBytes); + System.out.println("rc=" + rc + " retv=" + retv); + } catch (IOException e) { + LOG.warn("Unexpected exception", e); + } finally { + if (s != null) { + try { + s.close(); + } catch (IOException e) { + LOG.warn("Unexpected exception", e); + } + } + } + } + + public static void dump(String host, int port) { + Socket s = null; + try { + byte[] reqBytes = new byte[4]; + ByteBuffer req = ByteBuffer.wrap(reqBytes); + req.putInt(ByteBuffer.wrap("dump".getBytes()).getInt()); + s = new Socket(); + s.setSoLinger(false, 10); + s.setSoTimeout(20000); + s.connect(new InetSocketAddress(host, port)); + + InputStream is = s.getInputStream(); + OutputStream os = s.getOutputStream(); + + os.write(reqBytes); + + byte[] resBytes = new byte[1024]; + + int rc = is.read(resBytes); + String retv = new String(resBytes); + System.out.println("rc=" + rc + " retv=" + retv); + } catch (IOException e) { + LOG.warn("Unexpected exception", e); + } finally { + if (s != null) { + try { + s.close(); + } catch (IOException e) { + LOG.warn("Unexpected exception", e); + } + } + } + } + + public static void stat(String host, int port) { + Socket s = null; + try { + byte[] reqBytes = new byte[4]; + ByteBuffer req = ByteBuffer.wrap(reqBytes); + req.putInt(ByteBuffer.wrap("stat".getBytes()).getInt()); + s = new Socket(); + s.setSoLinger(false, 10); + s.setSoTimeout(20000); + s.connect(new InetSocketAddress(host, port)); + + InputStream is = s.getInputStream(); + OutputStream os = s.getOutputStream(); + + os.write(reqBytes); + + byte[] resBytes = new byte[1024]; + + int rc = is.read(resBytes); + String retv = new String(resBytes); + System.out.println("rc=" + rc + " retv=" + retv); + } catch (IOException e) { + LOG.warn("Unexpected exception", e); + } finally { + if (s != null) { + try { + s.close(); + } catch (IOException e) { + LOG.warn("Unexpected exception", e); + } + } + } + } + + public static void kill(String host, int port) { + Socket s = null; + try { + byte[] reqBytes = new byte[4]; + ByteBuffer req = ByteBuffer.wrap(reqBytes); + req.putInt(ByteBuffer.wrap("kill".getBytes()).getInt()); + s = new Socket(); + s.setSoLinger(false, 10); + s.setSoTimeout(20000); + s.connect(new InetSocketAddress(host, port)); + + InputStream is = s.getInputStream(); + OutputStream os = s.getOutputStream(); + + os.write(reqBytes); + byte[] resBytes = new byte[4]; + + int rc = is.read(resBytes); + String retv = new String(resBytes); + System.out.println("rc=" + rc + " retv=" + retv); + } catch (IOException e) { + LOG.warn("Unexpected exception", e); + } finally { + if (s != null) { + try { + s.close(); + } catch (IOException e) { + LOG.warn("Unexpected exception", e); + } + } + } + } + + public static void setTraceMask(String host, int port, String traceMaskStr) { + Socket s = null; + try { + byte[] reqBytes = new byte[12]; + ByteBuffer req = ByteBuffer.wrap(reqBytes); + long traceMask = Long.parseLong(traceMaskStr, 8); + req.putInt(ByteBuffer.wrap("stmk".getBytes()).getInt()); + req.putLong(traceMask); + + s = new Socket(); + s.setSoLinger(false, 10); + s.setSoTimeout(20000); + s.connect(new InetSocketAddress(host, port)); + + InputStream is = s.getInputStream(); + OutputStream os = s.getOutputStream(); + + os.write(reqBytes); + + byte[] resBytes = new byte[8]; + + int rc = is.read(resBytes); + ByteBuffer res = ByteBuffer.wrap(resBytes); + long retv = res.getLong(); + System.out.println("rc=" + rc + " retv=0" + + Long.toOctalString(retv) + " masks=0" + + Long.toOctalString(traceMask)); + assert (retv == traceMask); + } catch (IOException e) { + LOG.warn("Unexpected exception", e); + } finally { + if (s != null) { + try { + s.close(); + } catch (IOException e) { + LOG.warn("Unexpected exception", e); + } + } + } + } + + public static void getTraceMask(String host, int port) { + Socket s = null; + try { + byte[] reqBytes = new byte[12]; + ByteBuffer req = ByteBuffer.wrap(reqBytes); + req.putInt(ByteBuffer.wrap("gtmk".getBytes()).getInt()); + + s = new Socket(); + s.setSoLinger(false, 10); + s.setSoTimeout(20000); + s.connect(new InetSocketAddress(host, port)); + + InputStream is = s.getInputStream(); + OutputStream os = s.getOutputStream(); + + os.write(reqBytes); + + byte[] resBytes = new byte[8]; + + int rc = is.read(resBytes); + ByteBuffer res = ByteBuffer.wrap(resBytes); + long retv = res.getLong(); + System.out.println("rc=" + rc + " retv=0" + + Long.toOctalString(retv)); + } catch (IOException e) { + LOG.warn("Unexpected exception", e); + } finally { + if (s != null) { + try { + s.close(); + } catch (IOException e) { + LOG.warn("Unexpected exception", e); + } + } + } + } + + private static void usage() { + System.out + .println("usage: java [-cp CLASSPATH] org.apache.zookeeper.ServerAdminClient " + + "host port op (ruok|stat|dump|kill|gettracemask|settracemask) [arguments]"); + + } + + public static void main(String[] args) { + if (args.length < 3) { + usage(); + return; + } + String host = args[0]; + int port = Integer.parseInt(args[1]); + String op = args[2]; + if (op.equalsIgnoreCase("gettracemask")) { + getTraceMask(host, port); + } else if (op.equalsIgnoreCase("settracemask")) { + setTraceMask(host, port, args[3]); + } else if (op.equalsIgnoreCase("ruok")) { + ruok(host, port); + } else if (op.equalsIgnoreCase("kill")) { + kill(host, port); + } else if (op.equalsIgnoreCase("stat")) { + stat(host, port); + } else if (op.equalsIgnoreCase("dump")) { + dump(host, port); + } else { + System.out.println("Unrecognized op: " + op); + } + } +} diff --git a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/Shell.java b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/Shell.java new file mode 100644 index 000000000..789c481a6 --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/Shell.java @@ -0,0 +1,475 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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 file copied from Hadoop's security branch, + * with the following changes: + * 1. package changed from org.apache.hadoop.util to + * org.apache.zookeeper. + * 2. Usage of Hadoop's Configuration class removed since + * it is not available in Zookeeper: instead, system properties + * are used. + * 3. The deprecated getUlimitMemoryCommand() method removed since + * it is not needed. + */ + + +package org.apache.zookeeper; + +import java.io.BufferedReader; +import java.io.File; +import java.io.IOException; +import java.io.InputStreamReader; +import java.util.Map; +import java.util.Timer; +import java.util.TimerTask; +import java.util.concurrent.atomic.AtomicBoolean; +import org.apache.log4j.Logger; + +/** + * A base class for running a Unix command. + * + * Shell can be used to run unix commands like du or + * df. It also offers facilities to gate commands by + * time-intervals. + */ +abstract public class Shell { + + Logger LOG = Logger.getLogger(Shell.class); + + /** a Unix command to get the current user's name */ + public final static String USER_NAME_COMMAND = "whoami"; + /** a Unix command to get the current user's groups list */ + public static String[] getGroupsCommand() { + return new String[]{"bash", "-c", "groups"}; + } + /** a Unix command to get a given user's groups list */ + public static String[] getGroupsForUserCommand(final String user) { + //'groups username' command return is non-consistent across different unixes + return new String [] {"bash", "-c", "id -Gn " + user}; + } + /** a Unix command to set permission */ + public static final String SET_PERMISSION_COMMAND = "chmod"; + /** a Unix command to set owner */ + public static final String SET_OWNER_COMMAND = "chown"; + public static final String SET_GROUP_COMMAND = "chgrp"; + /** Return a Unix command to get permission information. */ + public static String[] getGET_PERMISSION_COMMAND() { + //force /bin/ls, except on windows. + return new String[] {(WINDOWS ? "ls" : "/bin/ls"), "-ld"}; + } + + /**Time after which the executing script would be timedout*/ + protected long timeOutInterval = 0L; + /** If or not script timed out*/ + private AtomicBoolean timedOut; + + /** a Unix command to get ulimit of a process. */ + public static final String ULIMIT_COMMAND = "ulimit"; + + /** + * Get the Unix command for setting the maximum virtual memory available + * to a given child process. This is only relevant when we are forking a + * process from within the Mapper or the Reducer implementations. + * Also see Hadoop Pipes and Hadoop Streaming. + * + * It also checks to ensure that we are running on a *nix platform else + * (e.g. in Cygwin/Windows) it returns null. + * @param memoryLimit virtual memory limit + * @return a String[] with the ulimit command arguments or + * null if we are running on a non *nix platform or + * if the limit is unspecified. + */ + public static String[] getUlimitMemoryCommand(int memoryLimit) { + // ulimit isn't supported on Windows + if (WINDOWS) { + return null; + } + + return new String[] {ULIMIT_COMMAND, "-v", String.valueOf(memoryLimit)}; + } + + /** Set to true on Windows platforms */ + public static final boolean WINDOWS /* borrowed from Path.WINDOWS */ + = System.getProperty("os.name").startsWith("Windows"); + + private long interval; // refresh interval in msec + private long lastTime; // last time the command was performed + private Map environment; // env for the command execution + private File dir; + private Process process; // sub process used to execute the command + private int exitCode; + + /**If or not script finished executing*/ + private volatile AtomicBoolean completed; + + public Shell() { + this(0L); + } + + /** + * @param interval the minimum duration to wait before re-executing the + * command. + */ + public Shell( long interval ) { + this.interval = interval; + this.lastTime = (interval<0) ? 0 : -interval; + } + + /** set the environment for the command + * @param env Mapping of environment variables + */ + protected void setEnvironment(Map env) { + this.environment = env; + } + + /** set the working directory + * @param dir The directory where the command would be executed + */ + protected void setWorkingDirectory(File dir) { + this.dir = dir; + } + + /** check to see if a command needs to be executed and execute if needed */ + protected void run() throws IOException { + if (lastTime + interval > System.currentTimeMillis()) + return; + exitCode = 0; // reset for next run + runCommand(); + } + + /** Run a command */ + private void runCommand() throws IOException { + ProcessBuilder builder = new ProcessBuilder(getExecString()); + Timer timeOutTimer = null; + ShellTimeoutTimerTask timeoutTimerTask = null; + timedOut = new AtomicBoolean(false); + completed = new AtomicBoolean(false); + + if (environment != null) { + builder.environment().putAll(this.environment); + } + if (dir != null) { + builder.directory(this.dir); + } + + process = builder.start(); + if (timeOutInterval > 0) { + timeOutTimer = new Timer(); + timeoutTimerTask = new ShellTimeoutTimerTask( + this); + //One time scheduling. + timeOutTimer.schedule(timeoutTimerTask, timeOutInterval); + } + final BufferedReader errReader = + new BufferedReader(new InputStreamReader(process + .getErrorStream())); + BufferedReader inReader = + new BufferedReader(new InputStreamReader(process + .getInputStream())); + final StringBuffer errMsg = new StringBuffer(); + + // read error and input streams as this would free up the buffers + // free the error stream buffer + Thread errThread = new Thread() { + @Override + public void run() { + try { + String line = errReader.readLine(); + while((line != null) && !isInterrupted()) { + errMsg.append(line); + errMsg.append(System.getProperty("line.separator")); + line = errReader.readLine(); + } + } catch(IOException ioe) { + LOG.warn("Error reading the error stream", ioe); + } + } + }; + try { + errThread.start(); + } catch (IllegalStateException ise) { } + try { + parseExecResult(inReader); // parse the output + // clear the input stream buffer + String line = inReader.readLine(); + while(line != null) { + line = inReader.readLine(); + } + // wait for the process to finish and check the exit code + exitCode = process.waitFor(); + try { + // make sure that the error thread exits + errThread.join(); + } catch (InterruptedException ie) { + LOG.warn("Interrupted while reading the error stream", ie); + } + completed.set(true); + //the timeout thread handling + //taken care in finally block + if (exitCode != 0) { + throw new ExitCodeException(exitCode, errMsg.toString()); + } + } catch (InterruptedException ie) { + throw new IOException(ie.toString()); + } finally { + if ((timeOutTimer!=null) && !timedOut.get()) { + timeOutTimer.cancel(); + } + // close the input stream + try { + inReader.close(); + } catch (IOException ioe) { + LOG.warn("Error while closing the input stream", ioe); + } + if (!completed.get()) { + errThread.interrupt(); + } + try { + errReader.close(); + } catch (IOException ioe) { + LOG.warn("Error while closing the error stream", ioe); + } + process.destroy(); + lastTime = System.currentTimeMillis(); + } + } + + /** return an array containing the command name & its parameters */ + protected abstract String[] getExecString(); + + /** Parse the execution result */ + protected abstract void parseExecResult(BufferedReader lines) + throws IOException; + + /** get the current sub-process executing the given command + * @return process executing the command + */ + public Process getProcess() { + return process; + } + + /** get the exit code + * @return the exit code of the process + */ + public int getExitCode() { + return exitCode; + } + + /** + * This is an IOException with exit code added. + */ + public static class ExitCodeException extends IOException { + int exitCode; + + public ExitCodeException(int exitCode, String message) { + super(message); + this.exitCode = exitCode; + } + + public int getExitCode() { + return exitCode; + } + } + + /** + * A simple shell command executor. + * + * ShellCommandExecutorshould be used in cases where the output + * of the command needs no explicit parsing and where the command, working + * directory and the environment remains unchanged. The output of the command + * is stored as-is and is expected to be small. + */ + public static class ShellCommandExecutor extends Shell { + + private String[] command; + private StringBuffer output; + + + public ShellCommandExecutor(String[] execString) { + this(execString, null); + } + + public ShellCommandExecutor(String[] execString, File dir) { + this(execString, dir, null); + } + + public ShellCommandExecutor(String[] execString, File dir, + Map env) { + this(execString, dir, env , 0L); + } + + /** + * Create a new instance of the ShellCommandExecutor to execute a command. + * + * @param execString The command to execute with arguments + * @param dir If not-null, specifies the directory which should be set + * as the current working directory for the command. + * If null, the current working directory is not modified. + * @param env If not-null, environment of the command will include the + * key-value pairs specified in the map. If null, the current + * environment is not modified. + * @param timeout Specifies the time in milliseconds, after which the + * command will be killed and the status marked as timedout. + * If 0, the command will not be timed out. + */ + public ShellCommandExecutor(String[] execString, File dir, + Map env, long timeout) { + command = execString.clone(); + if (dir != null) { + setWorkingDirectory(dir); + } + if (env != null) { + setEnvironment(env); + } + timeOutInterval = timeout; + } + + + /** Execute the shell command. */ + public void execute() throws IOException { + this.run(); + } + + protected String[] getExecString() { + return command; + } + + protected void parseExecResult(BufferedReader lines) throws IOException { + output = new StringBuffer(); + char[] buf = new char[512]; + int nRead; + while ( (nRead = lines.read(buf, 0, buf.length)) > 0 ) { + output.append(buf, 0, nRead); + } + } + + /** Get the output of the shell command.*/ + public String getOutput() { + return (output == null) ? "" : output.toString(); + } + + /** + * Returns the commands of this instance. + * Arguments with spaces in are presented with quotes round; other + * arguments are presented raw + * + * @return a string representation of the object. + */ + public String toString() { + StringBuilder builder = new StringBuilder(); + String[] args = getExecString(); + for (String s : args) { + if (s.indexOf(' ') >= 0) { + builder.append('"').append(s).append('"'); + } else { + builder.append(s); + } + builder.append(' '); + } + return builder.toString(); + } + } + + /** + * To check if the passed script to shell command executor timed out or + * not. + * + * @return if the script timed out. + */ + public boolean isTimedOut() { + return timedOut.get(); + } + + /** + * Set if the command has timed out. + * + */ + private void setTimedOut() { + this.timedOut.set(true); + } + + /** + * Static method to execute a shell command. + * Covers most of the simple cases without requiring the user to implement + * the Shell interface. + * @param cmd shell command to execute. + * @return the output of the executed command. + */ + public static String execCommand(String ... cmd) throws IOException { + return execCommand(null, cmd, 0L); + } + + /** + * Static method to execute a shell command. + * Covers most of the simple cases without requiring the user to implement + * the Shell interface. + * @param env the map of environment key=value + * @param cmd shell command to execute. + * @param timeout time in milliseconds after which script should be marked timeout + * @return the output of the executed command.o + */ + + public static String execCommand(Map env, String[] cmd, + long timeout) throws IOException { + ShellCommandExecutor exec = new ShellCommandExecutor(cmd, null, env, + timeout); + exec.execute(); + return exec.getOutput(); + } + + /** + * Static method to execute a shell command. + * Covers most of the simple cases without requiring the user to implement + * the Shell interface. + * @param env the map of environment key=value + * @param cmd shell command to execute. + * @return the output of the executed command. + */ + public static String execCommand(Map env, String ... cmd) + throws IOException { + return execCommand(env, cmd, 0L); + } + + /** + * Timer which is used to timeout scripts spawned off by shell. + */ + private static class ShellTimeoutTimerTask extends TimerTask { + + private Shell shell; + + public ShellTimeoutTimerTask(Shell shell) { + this.shell = shell; + } + + @Override + public void run() { + Process p = shell.getProcess(); + try { + p.exitValue(); + } catch (Exception e) { + //Process has not terminated. + //So check if it has completed + //if not just destroy it. + if (p != null && !shell.completed.get()) { + shell.setTimedOut(); + p.destroy(); + } + } + } + } +} diff --git a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/StatsTrack.java b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/StatsTrack.java new file mode 100644 index 000000000..623c6d446 --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/StatsTrack.java @@ -0,0 +1,101 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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. + */ + +package org.apache.zookeeper; + +/** + * a class that represents the stats associated with quotas + */ +public class StatsTrack { + private int count; + private long bytes; + private String countStr = "count"; + private String byteStr = "bytes"; + + /** + * a default constructor for + * stats + */ + public StatsTrack() { + this(null); + } + /** + * the stat string should be of the form count=int,bytes=long + * if stats is called with null the count and bytes are initialized + * to -1. + * @param stats the stat string to be intialized with + */ + public StatsTrack(String stats) { + if (stats == null) { + stats = "count=-1,bytes=-1"; + } + String[] split = stats.split(","); + if (split.length != 2) { + throw new IllegalArgumentException("invalid string " + stats); + } + count = Integer.parseInt(split[0].split("=")[1]); + bytes = Long.parseLong(split[1].split("=")[1]); + } + + + /** + * get the count of nodes allowed as part of quota + * + * @return the count as part of this string + */ + public int getCount() { + return this.count; + } + + /** + * set the count for this stat tracker. + * + * @param count + * the count to set with + */ + public void setCount(int count) { + this.count = count; + } + + /** + * get the count of bytes allowed as part of quota + * + * @return the bytes as part of this string + */ + public long getBytes() { + return this.bytes; + } + + /** + * set teh bytes for this stat tracker. + * + * @param bytes + * the bytes to set with + */ + public void setBytes(long bytes) { + this.bytes = bytes; + } + + @Override + /* + * returns the string that maps to this stat tracking. + */ + public String toString() { + return countStr + "=" + count + "," + byteStr + "=" + bytes; + } +} diff --git a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/Transaction.java b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/Transaction.java new file mode 100644 index 000000000..7e67b87a4 --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/Transaction.java @@ -0,0 +1,63 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + */ + +package org.apache.zookeeper; + +import org.apache.zookeeper.data.ACL; +import java.util.ArrayList; +import java.util.List; + +/** + * Provides a builder style interface for doing multiple updates. This is + * really just a thin layer on top of Zookeeper.multi(). + * + * @since 3.4.0 + * + */ +public class Transaction { + private ZooKeeper zk; + private List ops = new ArrayList(); + + protected Transaction(ZooKeeper zk) { + this.zk = zk; + } + + public Transaction create(final String path, byte data[], List acl, + CreateMode createMode) { + ops.add(Op.create(path, data, acl, createMode.toFlag())); + return this; + } + + public Transaction delete(final String path, int version) { + ops.add(Op.delete(path, version)); + return this; + } + + public Transaction check(String path, int version) { + ops.add(Op.check(path, version)); + return this; + } + + public Transaction setData(final String path, byte data[], int version) { + ops.add(Op.setData(path, data, version)); + return this; + } + + public List commit() throws InterruptedException, KeeperException { + return zk.multi(ops); + } +} diff --git a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/Version.java b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/Version.java new file mode 100644 index 000000000..46573717b --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/Version.java @@ -0,0 +1,79 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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. + */ + +package org.apache.zookeeper; + +public class Version implements org.apache.zookeeper.version.Info { + + public static int getRevision() { + return REVISION; + } + + public static String getBuildDate() { + return BUILD_DATE; + } + + public static String getVersion() { + return MAJOR + "." + MINOR + "." + MICRO + + (QUALIFIER == null ? "" : "-" + QUALIFIER); + } + + public static String getVersionRevision() { + return getVersion() + "-" + getRevision(); + } + + public static String getFullVersion() { + return getVersionRevision() + ", built on " + getBuildDate(); + } + + public static void printUsage() { + System.out + .print("Usage:\tjava -cp ... org.apache.zookeeper.Version " + + "[--full | --short | --revision],\n\tPrints --full version " + + "info if no arg specified."); + System.exit(1); + } + + /** + * Prints the current version, revision and build date to the standard out. + * + * @param args + *
        + *
      • --short - prints a short version string "1.2.3" + *
      • --revision - prints a short version string with the SVN + * repository revision "1.2.3-94" + *
      • --full - prints the revision and the build date + *
      + */ + public static void main(String[] args) { + if (args.length > 1) { + printUsage(); + } + if (args.length == 0 || (args.length == 1 && args[0].equals("--full"))) { + System.out.println(getFullVersion()); + System.exit(0); + } + if (args[0].equals("--short")) + System.out.println(getVersion()); + else if (args[0].equals("--revision")) + System.out.println(getVersionRevision()); + else + printUsage(); + System.exit(0); + } +} diff --git a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/WatchedEvent.java b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/WatchedEvent.java new file mode 100644 index 000000000..63f29c3c6 --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/WatchedEvent.java @@ -0,0 +1,79 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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. + */ +package org.apache.zookeeper; + +import org.apache.zookeeper.proto.WatcherEvent; +import org.apache.zookeeper.Watcher.Event.EventType; +import org.apache.zookeeper.Watcher.Event.KeeperState; + +/** + * A WatchedEvent represents a change on the ZooKeeper that a Watcher + * is able to respond to. The WatchedEvent includes exactly what happened, + * the current state of the ZooKeeper, and the path of the znode that + * was involved in the event. + */ +public class WatchedEvent { + final private KeeperState keeperState; + final private EventType eventType; + private String path; + + /** + * Create a WatchedEvent with specified type, state and path + */ + public WatchedEvent(EventType eventType, KeeperState keeperState, String path) { + this.keeperState = keeperState; + this.eventType = eventType; + this.path = path; + } + + /** + * Convert a WatcherEvent sent over the wire into a full-fledged WatcherEvent + */ + public WatchedEvent(WatcherEvent eventMessage) { + keeperState = KeeperState.fromInt(eventMessage.getState()); + eventType = EventType.fromInt(eventMessage.getType()); + path = eventMessage.getPath(); + } + + public KeeperState getState() { + return keeperState; + } + + public EventType getType() { + return eventType; + } + + public String getPath() { + return path; + } + + @Override + public String toString() { + return "WatchedEvent state:" + keeperState + + " type:" + eventType + " path:" + path; + } + + /** + * Convert WatchedEvent to type that can be sent over network + */ + public WatcherEvent getWrapper() { + return new WatcherEvent(eventType.getIntValue(), + keeperState.getIntValue(), + path); + } +} diff --git a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/Watcher.java b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/Watcher.java new file mode 100644 index 000000000..36c7b5b8d --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/Watcher.java @@ -0,0 +1,149 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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. + */ + +package org.apache.zookeeper; + +/** + * This interface specifies the public interface an event handler class must + * implement. A ZooKeeper client will get various events from the ZooKeepr + * server it connects to. An application using such a client handles these + * events by registering a callback object with the client. The callback object + * is expected to be an instance of a class that implements Watcher interface. + * + */ +public interface Watcher { + + /** + * This interface defines the possible states an Event may represent + */ + public interface Event { + /** + * Enumeration of states the ZooKeeper may be at the event + */ + public enum KeeperState { + /** Unused, this state is never generated by the server */ + @Deprecated + Unknown (-1), + + /** The client is in the disconnected state - it is not connected + * to any server in the ensemble. */ + Disconnected (0), + + /** Unused, this state is never generated by the server */ + @Deprecated + NoSyncConnected (1), + + /** The client is in the connected state - it is connected + * to a server in the ensemble (one of the servers specified + * in the host connection parameter during ZooKeeper client + * creation). */ + SyncConnected (3), + + /** + * Auth failed state + */ + AuthFailed (4), + + /** + * The client is connected to a read-only server, that is the + * server which is not currently connected to the majority. + * The only operations allowed after receiving this state is + * read operations. + * This state is generated for read-only clients only since + * read/write clients aren't allowed to connect to r/o servers. + */ + ConnectedReadOnly (5), + + /** + * SaslAuthenticated: used to notify clients that they are SASL-authenticated, + * so that they can perform Zookeeper actions with their SASL-authorized permissions. + */ + SaslAuthenticated(6), + + /** The serving cluster has expired this session. The ZooKeeper + * client connection (the session) is no longer valid. You must + * create a new client connection (instantiate a new ZooKeeper + * instance) if you with to access the ensemble. */ + Expired (-112); + + private final int intValue; // Integer representation of value + // for sending over wire + + KeeperState(int intValue) { + this.intValue = intValue; + } + + public int getIntValue() { + return intValue; + } + + public static KeeperState fromInt(int intValue) { + switch(intValue) { + case -1: return KeeperState.Unknown; + case 0: return KeeperState.Disconnected; + case 1: return KeeperState.NoSyncConnected; + case 3: return KeeperState.SyncConnected; + case 4: return KeeperState.AuthFailed; + case 5: return KeeperState.ConnectedReadOnly; + case 6: return KeeperState.SaslAuthenticated; + case -112: return KeeperState.Expired; + + default: + throw new RuntimeException("Invalid integer value for conversion to KeeperState"); + } + } + } + + /** + * Enumeration of types of events that may occur on the ZooKeeper + */ + public enum EventType { + None (-1), + NodeCreated (1), + NodeDeleted (2), + NodeDataChanged (3), + NodeChildrenChanged (4); + + private final int intValue; // Integer representation of value + // for sending over wire + + EventType(int intValue) { + this.intValue = intValue; + } + + public int getIntValue() { + return intValue; + } + + public static EventType fromInt(int intValue) { + switch(intValue) { + case -1: return EventType.None; + case 1: return EventType.NodeCreated; + case 2: return EventType.NodeDeleted; + case 3: return EventType.NodeDataChanged; + case 4: return EventType.NodeChildrenChanged; + + default: + throw new RuntimeException("Invalid integer value for conversion to EventType"); + } + } + } + } + + abstract public void process(WatchedEvent event); +} diff --git a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/ZKUtil.java b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/ZKUtil.java new file mode 100644 index 000000000..4713a08a9 --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/ZKUtil.java @@ -0,0 +1,124 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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. + */ +package org.apache.zookeeper; + +import java.util.ArrayList; +import java.util.Deque; +import java.util.LinkedList; +import java.util.List; + +import org.apache.zookeeper.AsyncCallback.VoidCallback; +import org.apache.zookeeper.common.PathUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class ZKUtil { + private static final Logger LOG = LoggerFactory.getLogger(ZKUtil.class); + /** + * Recursively delete the node with the given path. + *

      + * Important: All versions, of all nodes, under the given node are deleted. + *

      + * If there is an error with deleting one of the sub-nodes in the tree, + * this operation would abort and would be the responsibility of the app to handle the same. + * + * See {@link #delete(String, int)} for more details. + * + * @throws IllegalArgumentException if an invalid path is specified + */ + public static void deleteRecursive(ZooKeeper zk, final String pathRoot) + throws InterruptedException, KeeperException + { + PathUtils.validatePath(pathRoot); + + List tree = listSubTreeBFS(zk, pathRoot); + LOG.debug("Deleting " + tree); + LOG.debug("Deleting " + tree.size() + " subnodes "); + for (int i = tree.size() - 1; i >= 0 ; --i) { + //Delete the leaves first and eventually get rid of the root + zk.delete(tree.get(i), -1); //Delete all versions of the node with -1. + } + } + + + /** + * Recursively delete the node with the given path. (async version). + * + *

      + * Important: All versions, of all nodes, under the given node are deleted. + *

      + * If there is an error with deleting one of the sub-nodes in the tree, + * this operation would abort and would be the responsibility of the app to handle the same. + *

      + * @param zk the zookeeper handle + * @param pathRoot the path to be deleted + * @param cb call back method + * @param ctx the context the callback method is called with + * @throws IllegalArgumentException if an invalid path is specified + */ + public static void deleteRecursive(ZooKeeper zk, final String pathRoot, VoidCallback cb, + Object ctx) + throws InterruptedException, KeeperException + { + PathUtils.validatePath(pathRoot); + + List tree = listSubTreeBFS(zk, pathRoot); + LOG.debug("Deleting " + tree); + LOG.debug("Deleting " + tree.size() + " subnodes "); + for (int i = tree.size() - 1; i >= 0 ; --i) { + //Delete the leaves first and eventually get rid of the root + zk.delete(tree.get(i), -1, cb, ctx); //Delete all versions of the node with -1. + } + } + + /** + * BFS Traversal of the system under pathRoot, with the entries in the list, in the + * same order as that of the traversal. + *

      + * Important: This is not an atomic snapshot of the tree ever, but the + * state as it exists across multiple RPCs from zkClient to the ensemble. + * For practical purposes, it is suggested to bring the clients to the ensemble + * down (i.e. prevent writes to pathRoot) to 'simulate' a snapshot behavior. + * + * @param zk the zookeeper handle + * @param pathRoot The znode path, for which the entire subtree needs to be listed. + * @throws InterruptedException + * @throws KeeperException + */ + public static List listSubTreeBFS(ZooKeeper zk, final String pathRoot) throws + KeeperException, InterruptedException { + Deque queue = new LinkedList(); + List tree = new ArrayList(); + queue.add(pathRoot); + tree.add(pathRoot); + while (true) { + String node = queue.pollFirst(); + if (node == null) { + break; + } + List children = zk.getChildren(node, false); + for (final String child : children) { + final String childPath = node + "/" + child; + queue.add(childPath); + tree.add(childPath); + } + } + return tree; + } + +} \ No newline at end of file diff --git a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/ZooDefs.java b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/ZooDefs.java new file mode 100644 index 000000000..c7f1b208c --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/ZooDefs.java @@ -0,0 +1,119 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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. + */ + +package org.apache.zookeeper; + +import java.util.ArrayList; +import java.util.Collections; + +import org.apache.zookeeper.data.ACL; +import org.apache.zookeeper.data.Id; + +public class ZooDefs { + public interface OpCode { + public final int notification = 0; + + public final int create = 1; + + public final int delete = 2; + + public final int exists = 3; + + public final int getData = 4; + + public final int setData = 5; + + public final int getACL = 6; + + public final int setACL = 7; + + public final int getChildren = 8; + + public final int sync = 9; + + public final int ping = 11; + + public final int getChildren2 = 12; + + public final int check = 13; + + public final int multi = 14; + + public final int auth = 100; + + public final int setWatches = 101; + + public final int sasl = 102; + + public final int createSession = -10; + + public final int closeSession = -11; + + public final int error = -1; + } + + public interface Perms { + int READ = 1 << 0; + + int WRITE = 1 << 1; + + int CREATE = 1 << 2; + + int DELETE = 1 << 3; + + int ADMIN = 1 << 4; + + int ALL = READ | WRITE | CREATE | DELETE | ADMIN; + } + + public interface Ids { + /** + * This Id represents anyone. + */ + public final Id ANYONE_ID_UNSAFE = new Id("world", "anyone"); + + /** + * This Id is only usable to set ACLs. It will get substituted with the + * Id's the client authenticated with. + */ + public final Id AUTH_IDS = new Id("auth", ""); + + /** + * This is a completely open ACL . + */ + public final ArrayList OPEN_ACL_UNSAFE = new ArrayList( + Collections.singletonList(new ACL(Perms.ALL, ANYONE_ID_UNSAFE))); + + /** + * This ACL gives the creators authentication id's all permissions. + */ + public final ArrayList CREATOR_ALL_ACL = new ArrayList( + Collections.singletonList(new ACL(Perms.ALL, AUTH_IDS))); + + /** + * This ACL gives the world the ability to read. + */ + public final ArrayList READ_ACL_UNSAFE = new ArrayList( + Collections + .singletonList(new ACL(Perms.READ, ANYONE_ID_UNSAFE))); + } + + final public static String[] opNames = { "notification", "create", + "delete", "exists", "getData", "setData", "getACL", "setACL", + "getChildren", "getChildren2", "getMaxChildren", "setMaxChildren", "ping" }; +} diff --git a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/ZooKeeper.java b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/ZooKeeper.java new file mode 100644 index 000000000..6385781f8 --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/ZooKeeper.java @@ -0,0 +1,1788 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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. + */ + +package org.apache.zookeeper; + +import org.apache.zookeeper.AsyncCallback.*; +import org.apache.zookeeper.OpResult.ErrorResult; +import org.apache.zookeeper.client.ConnectStringParser; +import org.apache.zookeeper.client.HostProvider; +import org.apache.zookeeper.client.StaticHostProvider; +import org.apache.zookeeper.client.ZooKeeperSaslClient; +import org.apache.zookeeper.common.PathUtils; +import org.apache.zookeeper.data.ACL; +import org.apache.zookeeper.data.Stat; +import org.apache.zookeeper.proto.*; +import org.apache.zookeeper.server.DataTree; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.io.IOException; +import java.net.SocketAddress; +import java.util.*; + +/** + * This is the main class of ZooKeeper client library. To use a ZooKeeper + * service, an application must first instantiate an object of ZooKeeper class. + * All the iterations will be done by calling the methods of ZooKeeper class. + * The methods of this class are thread-safe unless otherwise noted. + *

      + * Once a connection to a server is established, a session ID is assigned to the + * client. The client will send heart beats to the server periodically to keep + * the session valid. + *

      + * The application can call ZooKeeper APIs through a client as long as the + * session ID of the client remains valid. + *

      + * If for some reason, the client fails to send heart beats to the server for a + * prolonged period of time (exceeding the sessionTimeout value, for instance), + * the server will expire the session, and the session ID will become invalid. + * The client object will no longer be usable. To make ZooKeeper API calls, the + * application must create a new client object. + *

      + * If the ZooKeeper server the client currently connects to fails or otherwise + * does not respond, the client will automatically try to connect to another + * server before its session ID expires. If successful, the application can + * continue to use the client. + *

      + * The ZooKeeper API methods are either synchronous or asynchronous. Synchronous + * methods blocks until the server has responded. Asynchronous methods just queue + * the request for sending and return immediately. They take a callback object that + * will be executed either on successful execution of the request or on error with + * an appropriate return code (rc) indicating the error. + *

      + * Some successful ZooKeeper API calls can leave watches on the "data nodes" in + * the ZooKeeper server. Other successful ZooKeeper API calls can trigger those + * watches. Once a watch is triggered, an event will be delivered to the client + * which left the watch at the first place. Each watch can be triggered only + * once. Thus, up to one event will be delivered to a client for every watch it + * leaves. + *

      + * A client needs an object of a class implementing Watcher interface for + * processing the events delivered to the client. + * + * When a client drops current connection and re-connects to a server, all the + * existing watches are considered as being triggered but the undelivered events + * are lost. To emulate this, the client will generate a special event to tell + * the event handler a connection has been dropped. This special event has type + * EventNone and state sKeeperStateDisconnected. + * + */ +public class ZooKeeper { + + public static final String ZOOKEEPER_CLIENT_CNXN_SOCKET = "zookeeper.clientCnxnSocket"; + + protected final ClientCnxn cnxn; + private static final Logger LOG; + static { + //Keep these two lines together to keep the initialization order explicit + LOG = LoggerFactory.getLogger(ZooKeeper.class); + Environment.logEnv("Client environment:", LOG); + } + + public ZooKeeperSaslClient getSaslClient() { + return cnxn.zooKeeperSaslClient; + } + + private final ZKWatchManager watchManager = new ZKWatchManager(); + + List getDataWatches() { + synchronized(watchManager.dataWatches) { + List rc = new ArrayList(watchManager.dataWatches.keySet()); + return rc; + } + } + List getExistWatches() { + synchronized(watchManager.existWatches) { + List rc = new ArrayList(watchManager.existWatches.keySet()); + return rc; + } + } + List getChildWatches() { + synchronized(watchManager.childWatches) { + List rc = new ArrayList(watchManager.childWatches.keySet()); + return rc; + } + } + + /** + * Manage watchers & handle events generated by the ClientCnxn object. + * + * We are implementing this as a nested class of ZooKeeper so that + * the public methods will not be exposed as part of the ZooKeeper client + * API. + */ + private static class ZKWatchManager implements ClientWatchManager { + private final Map> dataWatches = + new HashMap>(); + private final Map> existWatches = + new HashMap>(); + private final Map> childWatches = + new HashMap>(); + + private volatile Watcher defaultWatcher; + + final private void addTo(Set from, Set to) { + if (from != null) { + to.addAll(from); + } + } + + /* (non-Javadoc) + * @see org.apache.zookeeper.ClientWatchManager#materialize(Event.KeeperState, + * Event.EventType, java.lang.String) + */ + @Override + public Set materialize(Watcher.Event.KeeperState state, + Watcher.Event.EventType type, + String clientPath) + { + Set result = new HashSet(); + + switch (type) { + case None: + result.add(defaultWatcher); + boolean clear = ClientCnxn.getDisableAutoResetWatch() && + state != Watcher.Event.KeeperState.SyncConnected; + + synchronized(dataWatches) { + for(Set ws: dataWatches.values()) { + result.addAll(ws); + } + if (clear) { + dataWatches.clear(); + } + } + + synchronized(existWatches) { + for(Set ws: existWatches.values()) { + result.addAll(ws); + } + if (clear) { + existWatches.clear(); + } + } + + synchronized(childWatches) { + for(Set ws: childWatches.values()) { + result.addAll(ws); + } + if (clear) { + childWatches.clear(); + } + } + + return result; + case NodeDataChanged: + case NodeCreated: + synchronized (dataWatches) { + addTo(dataWatches.remove(clientPath), result); + } + synchronized (existWatches) { + addTo(existWatches.remove(clientPath), result); + } + break; + case NodeChildrenChanged: + synchronized (childWatches) { + addTo(childWatches.remove(clientPath), result); + } + break; + case NodeDeleted: + synchronized (dataWatches) { + addTo(dataWatches.remove(clientPath), result); + } + // XXX This shouldn't be needed, but just in case + synchronized (existWatches) { + Set list = existWatches.remove(clientPath); + if (list != null) { + addTo(existWatches.remove(clientPath), result); + LOG.warn("We are triggering an exists watch for delete! Shouldn't happen!"); + } + } + synchronized (childWatches) { + addTo(childWatches.remove(clientPath), result); + } + break; + default: + String msg = "Unhandled watch event type " + type + + " with state " + state + " on path " + clientPath; + LOG.error(msg); + throw new RuntimeException(msg); + } + + return result; + } + } + + /** + * Register a watcher for a particular path. + */ + abstract class WatchRegistration { + private Watcher watcher; + private String clientPath; + public WatchRegistration(Watcher watcher, String clientPath) + { + this.watcher = watcher; + this.clientPath = clientPath; + } + + abstract protected Map> getWatches(int rc); + + /** + * Register the watcher with the set of watches on path. + * @param rc the result code of the operation that attempted to + * add the watch on the path. + */ + public void register(int rc) { + if (shouldAddWatch(rc)) { + Map> watches = getWatches(rc); + synchronized(watches) { + Set watchers = watches.get(clientPath); + if (watchers == null) { + watchers = new HashSet(); + watches.put(clientPath, watchers); + } + watchers.add(watcher); + } + } + } + /** + * Determine whether the watch should be added based on return code. + * @param rc the result code of the operation that attempted to add the + * watch on the node + * @return true if the watch should be added, otw false + */ + protected boolean shouldAddWatch(int rc) { + return rc == 0; + } + } + + /** Handle the special case of exists watches - they add a watcher + * even in the case where NONODE result code is returned. + */ + class ExistsWatchRegistration extends WatchRegistration { + public ExistsWatchRegistration(Watcher watcher, String clientPath) { + super(watcher, clientPath); + } + + @Override + protected Map> getWatches(int rc) { + return rc == 0 ? watchManager.dataWatches : watchManager.existWatches; + } + + @Override + protected boolean shouldAddWatch(int rc) { + return rc == 0 || rc == KeeperException.Code.NONODE.intValue(); + } + } + + class DataWatchRegistration extends WatchRegistration { + public DataWatchRegistration(Watcher watcher, String clientPath) { + super(watcher, clientPath); + } + + @Override + protected Map> getWatches(int rc) { + return watchManager.dataWatches; + } + } + + class ChildWatchRegistration extends WatchRegistration { + public ChildWatchRegistration(Watcher watcher, String clientPath) { + super(watcher, clientPath); + } + + @Override + protected Map> getWatches(int rc) { + return watchManager.childWatches; + } + } + + public enum States { + CONNECTING, ASSOCIATING, CONNECTED, CONNECTEDREADONLY, + CLOSED, AUTH_FAILED, NOT_CONNECTED; + + public boolean isAlive() { + return this != CLOSED && this != AUTH_FAILED; + } + + /** + * Returns whether we are connected to a server (which + * could possibly be read-only, if this client is allowed + * to go to read-only mode) + * */ + public boolean isConnected() { + return this == CONNECTED || this == CONNECTEDREADONLY; + } + } + + /** + * To create a ZooKeeper client object, the application needs to pass a + * connection string containing a comma separated list of host:port pairs, + * each corresponding to a ZooKeeper server. + *

      + * Session establishment is asynchronous. This constructor will initiate + * connection to the server and return immediately - potentially (usually) + * before the session is fully established. The watcher argument specifies + * the watcher that will be notified of any changes in state. This + * notification can come at any point before or after the constructor call + * has returned. + *

      + * The instantiated ZooKeeper client object will pick an arbitrary server + * from the connectString and attempt to connect to it. If establishment of + * the connection fails, another server in the connect string will be tried + * (the order is non-deterministic, as we random shuffle the list), until a + * connection is established. The client will continue attempts until the + * session is explicitly closed. + *

      + * Added in 3.2.0: An optional "chroot" suffix may also be appended to the + * connection string. This will run the client commands while interpreting + * all paths relative to this root (similar to the unix chroot command). + * + * @param connectString + * comma separated host:port pairs, each corresponding to a zk + * server. e.g. "127.0.0.1:3000,127.0.0.1:3001,127.0.0.1:3002" If + * the optional chroot suffix is used the example would look + * like: "127.0.0.1:3000,127.0.0.1:3001,127.0.0.1:3002/app/a" + * where the client would be rooted at "/app/a" and all paths + * would be relative to this root - ie getting/setting/etc... + * "/foo/bar" would result in operations being run on + * "/app/a/foo/bar" (from the server perspective). + * @param sessionTimeout + * session timeout in milliseconds + * @param watcher + * a watcher object which will be notified of state changes, may + * also be notified for node events + * + * @throws IOException + * in cases of network failure + * @throws IllegalArgumentException + * if an invalid chroot path is specified + */ + public ZooKeeper(String connectString, int sessionTimeout, Watcher watcher) + throws IOException + { + this(connectString, sessionTimeout, watcher, false); + } + + /** + * To create a ZooKeeper client object, the application needs to pass a + * connection string containing a comma separated list of host:port pairs, + * each corresponding to a ZooKeeper server. + *

      + * Session establishment is asynchronous. This constructor will initiate + * connection to the server and return immediately - potentially (usually) + * before the session is fully established. The watcher argument specifies + * the watcher that will be notified of any changes in state. This + * notification can come at any point before or after the constructor call + * has returned. + *

      + * The instantiated ZooKeeper client object will pick an arbitrary server + * from the connectString and attempt to connect to it. If establishment of + * the connection fails, another server in the connect string will be tried + * (the order is non-deterministic, as we random shuffle the list), until a + * connection is established. The client will continue attempts until the + * session is explicitly closed. + *

      + * Added in 3.2.0: An optional "chroot" suffix may also be appended to the + * connection string. This will run the client commands while interpreting + * all paths relative to this root (similar to the unix chroot command). + * + * @param connectString + * comma separated host:port pairs, each corresponding to a zk + * server. e.g. "127.0.0.1:3000,127.0.0.1:3001,127.0.0.1:3002" If + * the optional chroot suffix is used the example would look + * like: "127.0.0.1:3000,127.0.0.1:3001,127.0.0.1:3002/app/a" + * where the client would be rooted at "/app/a" and all paths + * would be relative to this root - ie getting/setting/etc... + * "/foo/bar" would result in operations being run on + * "/app/a/foo/bar" (from the server perspective). + * @param sessionTimeout + * session timeout in milliseconds + * @param watcher + * a watcher object which will be notified of state changes, may + * also be notified for node events + * @param canBeReadOnly + * (added in 3.4) whether the created client is allowed to go to + * read-only mode in case of partitioning. Read-only mode + * basically means that if the client can't find any majority + * servers but there's partitioned server it could reach, it + * connects to one in read-only mode, i.e. read requests are + * allowed while write requests are not. It continues seeking for + * majority in the background. + * + * @throws IOException + * in cases of network failure + * @throws IllegalArgumentException + * if an invalid chroot path is specified + */ + public ZooKeeper(String connectString, int sessionTimeout, Watcher watcher, + boolean canBeReadOnly) + throws IOException + { + LOG.info("Initiating client connection, connectString=" + connectString + + " sessionTimeout=" + sessionTimeout + " watcher=" + watcher); + + watchManager.defaultWatcher = watcher; + + ConnectStringParser connectStringParser = new ConnectStringParser( + connectString); + HostProvider hostProvider = new StaticHostProvider( + connectStringParser.getServerAddresses()); + cnxn = new ClientCnxn(connectStringParser.getChrootPath(), + hostProvider, sessionTimeout, this, watchManager, + getClientCnxnSocket(), canBeReadOnly); + cnxn.start(); + } + + /** + * To create a ZooKeeper client object, the application needs to pass a + * connection string containing a comma separated list of host:port pairs, + * each corresponding to a ZooKeeper server. + *

      + * Session establishment is asynchronous. This constructor will initiate + * connection to the server and return immediately - potentially (usually) + * before the session is fully established. The watcher argument specifies + * the watcher that will be notified of any changes in state. This + * notification can come at any point before or after the constructor call + * has returned. + *

      + * The instantiated ZooKeeper client object will pick an arbitrary server + * from the connectString and attempt to connect to it. If establishment of + * the connection fails, another server in the connect string will be tried + * (the order is non-deterministic, as we random shuffle the list), until a + * connection is established. The client will continue attempts until the + * session is explicitly closed (or the session is expired by the server). + *

      + * Added in 3.2.0: An optional "chroot" suffix may also be appended to the + * connection string. This will run the client commands while interpreting + * all paths relative to this root (similar to the unix chroot command). + *

      + * Use {@link #getSessionId} and {@link #getSessionPasswd} on an established + * client connection, these values must be passed as sessionId and + * sessionPasswd respectively if reconnecting. Otherwise, if not + * reconnecting, use the other constructor which does not require these + * parameters. + * + * @param connectString + * comma separated host:port pairs, each corresponding to a zk + * server. e.g. "127.0.0.1:3000,127.0.0.1:3001,127.0.0.1:3002" + * If the optional chroot suffix is used the example would look + * like: "127.0.0.1:3000,127.0.0.1:3001,127.0.0.1:3002/app/a" + * where the client would be rooted at "/app/a" and all paths + * would be relative to this root - ie getting/setting/etc... + * "/foo/bar" would result in operations being run on + * "/app/a/foo/bar" (from the server perspective). + * @param sessionTimeout + * session timeout in milliseconds + * @param watcher + * a watcher object which will be notified of state changes, may + * also be notified for node events + * @param sessionId + * specific session id to use if reconnecting + * @param sessionPasswd + * password for this session + * + * @throws IOException in cases of network failure + * @throws IllegalArgumentException if an invalid chroot path is specified + * @throws IllegalArgumentException for an invalid list of ZooKeeper hosts + */ + public ZooKeeper(String connectString, int sessionTimeout, Watcher watcher, + long sessionId, byte[] sessionPasswd) + throws IOException + { + this(connectString, sessionTimeout, watcher, sessionId, sessionPasswd, false); + } + + /** + * To create a ZooKeeper client object, the application needs to pass a + * connection string containing a comma separated list of host:port pairs, + * each corresponding to a ZooKeeper server. + *

      + * Session establishment is asynchronous. This constructor will initiate + * connection to the server and return immediately - potentially (usually) + * before the session is fully established. The watcher argument specifies + * the watcher that will be notified of any changes in state. This + * notification can come at any point before or after the constructor call + * has returned. + *

      + * The instantiated ZooKeeper client object will pick an arbitrary server + * from the connectString and attempt to connect to it. If establishment of + * the connection fails, another server in the connect string will be tried + * (the order is non-deterministic, as we random shuffle the list), until a + * connection is established. The client will continue attempts until the + * session is explicitly closed (or the session is expired by the server). + *

      + * Added in 3.2.0: An optional "chroot" suffix may also be appended to the + * connection string. This will run the client commands while interpreting + * all paths relative to this root (similar to the unix chroot command). + *

      + * Use {@link #getSessionId} and {@link #getSessionPasswd} on an established + * client connection, these values must be passed as sessionId and + * sessionPasswd respectively if reconnecting. Otherwise, if not + * reconnecting, use the other constructor which does not require these + * parameters. + * + * @param connectString + * comma separated host:port pairs, each corresponding to a zk + * server. e.g. "127.0.0.1:3000,127.0.0.1:3001,127.0.0.1:3002" + * If the optional chroot suffix is used the example would look + * like: "127.0.0.1:3000,127.0.0.1:3001,127.0.0.1:3002/app/a" + * where the client would be rooted at "/app/a" and all paths + * would be relative to this root - ie getting/setting/etc... + * "/foo/bar" would result in operations being run on + * "/app/a/foo/bar" (from the server perspective). + * @param sessionTimeout + * session timeout in milliseconds + * @param watcher + * a watcher object which will be notified of state changes, may + * also be notified for node events + * @param sessionId + * specific session id to use if reconnecting + * @param sessionPasswd + * password for this session + * @param canBeReadOnly + * (added in 3.4) whether the created client is allowed to go to + * read-only mode in case of partitioning. Read-only mode + * basically means that if the client can't find any majority + * servers but there's partitioned server it could reach, it + * connects to one in read-only mode, i.e. read requests are + * allowed while write requests are not. It continues seeking for + * majority in the background. + * + * @throws IOException in cases of network failure + * @throws IllegalArgumentException if an invalid chroot path is specified + */ + public ZooKeeper(String connectString, int sessionTimeout, Watcher watcher, + long sessionId, byte[] sessionPasswd, boolean canBeReadOnly) + throws IOException + { + LOG.info("Initiating client connection, connectString=" + connectString + + " sessionTimeout=" + sessionTimeout + + " watcher=" + watcher + + " sessionId=" + Long.toHexString(sessionId) + + " sessionPasswd=" + + (sessionPasswd == null ? "" : "")); + + watchManager.defaultWatcher = watcher; + + ConnectStringParser connectStringParser = new ConnectStringParser( + connectString); + HostProvider hostProvider = new StaticHostProvider( + connectStringParser.getServerAddresses()); + cnxn = new ClientCnxn(connectStringParser.getChrootPath(), + hostProvider, sessionTimeout, this, watchManager, + getClientCnxnSocket(), sessionId, sessionPasswd, canBeReadOnly); + cnxn.seenRwServerBefore = true; // since user has provided sessionId + cnxn.start(); + } + + /** + * The session id for this ZooKeeper client instance. The value returned is + * not valid until the client connects to a server and may change after a + * re-connect. + * + * This method is NOT thread safe + * + * @return current session id + */ + public long getSessionId() { + return cnxn.getSessionId(); + } + + /** + * The session password for this ZooKeeper client instance. The value + * returned is not valid until the client connects to a server and may + * change after a re-connect. + * + * This method is NOT thread safe + * + * @return current session password + */ + public byte[] getSessionPasswd() { + return cnxn.getSessionPasswd(); + } + + /** + * The negotiated session timeout for this ZooKeeper client instance. The + * value returned is not valid until the client connects to a server and + * may change after a re-connect. + * + * This method is NOT thread safe + * + * @return current session timeout + */ + public int getSessionTimeout() { + return cnxn.getSessionTimeout(); + } + + /** + * Add the specified scheme:auth information to this connection. + * + * This method is NOT thread safe + * + * @param scheme + * @param auth + */ + public void addAuthInfo(String scheme, byte auth[]) { + cnxn.addAuthInfo(scheme, auth); + } + + /** + * Specify the default watcher for the connection (overrides the one + * specified during construction). + * + * @param watcher + */ + public synchronized void register(Watcher watcher) { + watchManager.defaultWatcher = watcher; + } + + /** + * Close this client object. Once the client is closed, its session becomes + * invalid. All the ephemeral nodes in the ZooKeeper server associated with + * the session will be removed. The watches left on those nodes (and on + * their parents) will be triggered. + * + * @throws InterruptedException + */ + public synchronized void close() throws InterruptedException { + if (!cnxn.getState().isAlive()) { + if (LOG.isDebugEnabled()) { + LOG.debug("Close called on already closed client"); + } + return; + } + + if (LOG.isDebugEnabled()) { + LOG.debug("Closing session: 0x" + Long.toHexString(getSessionId())); + } + + try { + cnxn.close(); + } catch (IOException e) { + if (LOG.isDebugEnabled()) { + LOG.debug("Ignoring unexpected exception during close", e); + } + } + + LOG.info("Session: 0x" + Long.toHexString(getSessionId()) + " closed"); + } + + /** + * Prepend the chroot to the client path (if present). The expectation of + * this function is that the client path has been validated before this + * function is called + * @param clientPath path to the node + * @return server view of the path (chroot prepended to client path) + */ + private String prependChroot(String clientPath) { + if (cnxn.chrootPath != null) { + // handle clientPath = "/" + if (clientPath.length() == 1) { + return cnxn.chrootPath; + } + return cnxn.chrootPath + clientPath; + } else { + return clientPath; + } + } + + /** + * Create a node with the given path. The node data will be the given data, + * and node acl will be the given acl. + *

      + * The flags argument specifies whether the created node will be ephemeral + * or not. + *

      + * An ephemeral node will be removed by the ZooKeeper automatically when the + * session associated with the creation of the node expires. + *

      + * The flags argument can also specify to create a sequential node. The + * actual path name of a sequential node will be the given path plus a + * suffix "i" where i is the current sequential number of the node. The sequence + * number is always fixed length of 10 digits, 0 padded. Once + * such a node is created, the sequential number will be incremented by one. + *

      + * If a node with the same actual path already exists in the ZooKeeper, a + * KeeperException with error code KeeperException.NodeExists will be + * thrown. Note that since a different actual path is used for each + * invocation of creating sequential node with the same path argument, the + * call will never throw "file exists" KeeperException. + *

      + * If the parent node does not exist in the ZooKeeper, a KeeperException + * with error code KeeperException.NoNode will be thrown. + *

      + * An ephemeral node cannot have children. If the parent node of the given + * path is ephemeral, a KeeperException with error code + * KeeperException.NoChildrenForEphemerals will be thrown. + *

      + * This operation, if successful, will trigger all the watches left on the + * node of the given path by exists and getData API calls, and the watches + * left on the parent node by getChildren API calls. + *

      + * If a node is created successfully, the ZooKeeper server will trigger the + * watches on the path left by exists calls, and the watches on the parent + * of the node by getChildren calls. + *

      + * The maximum allowable size of the data array is 1 MB (1,048,576 bytes). + * Arrays larger than this will cause a KeeperExecption to be thrown. + * + * @param path + * the path for the node + * @param data + * the initial data for the node + * @param acl + * the acl for the node + * @param createMode + * specifying whether the node to be created is ephemeral + * and/or sequential + * @return the actual path of the created node + * @throws KeeperException if the server returns a non-zero error code + * @throws KeeperException.InvalidACLException if the ACL is invalid, null, or empty + * @throws InterruptedException if the transaction is interrupted + * @throws IllegalArgumentException if an invalid path is specified + */ + public String create(final String path, byte data[], List acl, + CreateMode createMode) + throws KeeperException, InterruptedException + { + final String clientPath = path; + PathUtils.validatePath(clientPath, createMode.isSequential()); + + final String serverPath = prependChroot(clientPath); + + RequestHeader h = new RequestHeader(); + h.setType(ZooDefs.OpCode.create); + CreateRequest request = new CreateRequest(); + CreateResponse response = new CreateResponse(); + request.setData(data); + request.setFlags(createMode.toFlag()); + request.setPath(serverPath); + if (acl != null && acl.size() == 0) { + throw new KeeperException.InvalidACLException(); + } + request.setAcl(acl); + ReplyHeader r = cnxn.submitRequest(h, request, response, null); + if (r.getErr() != 0) { + throw KeeperException.create(KeeperException.Code.get(r.getErr()), + clientPath); + } + if (cnxn.chrootPath == null) { + return response.getPath(); + } else { + return response.getPath().substring(cnxn.chrootPath.length()); + } + } + + /** + * The asynchronous version of create. + * + * @see #create(String, byte[], List, CreateMode) + */ + + public void create(final String path, byte data[], List acl, + CreateMode createMode, StringCallback cb, Object ctx) + { + final String clientPath = path; + PathUtils.validatePath(clientPath, createMode.isSequential()); + + final String serverPath = prependChroot(clientPath); + + RequestHeader h = new RequestHeader(); + h.setType(ZooDefs.OpCode.create); + CreateRequest request = new CreateRequest(); + CreateResponse response = new CreateResponse(); + ReplyHeader r = new ReplyHeader(); + request.setData(data); + request.setFlags(createMode.toFlag()); + request.setPath(serverPath); + request.setAcl(acl); + cnxn.queuePacket(h, r, request, response, cb, clientPath, + serverPath, ctx, null); + } + + /** + * Delete the node with the given path. The call will succeed if such a node + * exists, and the given version matches the node's version (if the given + * version is -1, it matches any node's versions). + *

      + * A KeeperException with error code KeeperException.NoNode will be thrown + * if the nodes does not exist. + *

      + * A KeeperException with error code KeeperException.BadVersion will be + * thrown if the given version does not match the node's version. + *

      + * A KeeperException with error code KeeperException.NotEmpty will be thrown + * if the node has children. + *

      + * This operation, if successful, will trigger all the watches on the node + * of the given path left by exists API calls, and the watches on the parent + * node left by getChildren API calls. + * + * @param path + * the path of the node to be deleted. + * @param version + * the expected node version. + * @throws InterruptedException IF the server transaction is interrupted + * @throws KeeperException If the server signals an error with a non-zero + * return code. + * @throws IllegalArgumentException if an invalid path is specified + */ + public void delete(final String path, int version) + throws InterruptedException, KeeperException + { + final String clientPath = path; + PathUtils.validatePath(clientPath); + + final String serverPath; + + // maintain semantics even in chroot case + // specifically - root cannot be deleted + // I think this makes sense even in chroot case. + if (clientPath.equals("/")) { + // a bit of a hack, but delete(/) will never succeed and ensures + // that the same semantics are maintained + serverPath = clientPath; + } else { + serverPath = prependChroot(clientPath); + } + + RequestHeader h = new RequestHeader(); + h.setType(ZooDefs.OpCode.delete); + DeleteRequest request = new DeleteRequest(); + request.setPath(serverPath); + request.setVersion(version); + ReplyHeader r = cnxn.submitRequest(h, request, null, null); + if (r.getErr() != 0) { + throw KeeperException.create(KeeperException.Code.get(r.getErr()), + clientPath); + } + } + + /** + * Executes multiple ZooKeeper operations or none of them. + *

      + * On success, a list of results is returned. + * On failure, an exception is raised which contains partial results and + * error details, see {@link KeeperException#getResults} + *

      + * Note: The maximum allowable size of all of the data arrays in all of + * the setData operations in this single request is typically 1 MB + * (1,048,576 bytes). This limit is specified on the server via + * jute.maxbuffer. + * Requests larger than this will cause a KeeperException to be + * thrown. + * + * @param ops An iterable that contains the operations to be done. + * These should be created using the factory methods on {@link Op}. + * @return A list of results, one for each input Op, the order of + * which exactly matches the order of the ops input + * operations. + * @throws InterruptedException If the operation was interrupted. + * The operation may or may not have succeeded, but will not have + * partially succeeded if this exception is thrown. + * @throws KeeperException If the operation could not be completed + * due to some error in doing one of the specified ops. + * @throws IllegalArgumentException if an invalid path is specified + * + * @since 3.4.0 + */ + public List multi(Iterable ops) throws InterruptedException, KeeperException { + for (Op op : ops) { + op.validate(); + } + // reconstructing transaction with the chroot prefix + List transaction = new ArrayList(); + for (Op op : ops) { + transaction.add(withRootPrefix(op)); + } + return multiInternal(new MultiTransactionRecord(transaction)); + } + + private Op withRootPrefix(Op op) { + if (null != op.getPath()) { + final String serverPath = prependChroot(op.getPath()); + if (!op.getPath().equals(serverPath)) { + return op.withChroot(serverPath); + } + } + return op; + } + + protected List multiInternal(MultiTransactionRecord request) + throws InterruptedException, KeeperException { + RequestHeader h = new RequestHeader(); + h.setType(ZooDefs.OpCode.multi); + MultiResponse response = new MultiResponse(); + ReplyHeader r = cnxn.submitRequest(h, request, response, null); + if (r.getErr() != 0) { + throw KeeperException.create(KeeperException.Code.get(r.getErr())); + } + + List results = response.getResultList(); + + ErrorResult fatalError = null; + for (OpResult result : results) { + if (result instanceof ErrorResult && ((ErrorResult)result).getErr() != KeeperException.Code.OK.intValue()) { + fatalError = (ErrorResult) result; + break; + } + } + + if (fatalError != null) { + KeeperException ex = KeeperException.create(KeeperException.Code.get(fatalError.getErr())); + ex.setMultiResults(results); + throw ex; + } + + return results; + } + + /** + * A Transaction is a thin wrapper on the {@link #multi} method + * which provides a builder object that can be used to construct + * and commit an atomic set of operations. + * + * @since 3.4.0 + * + * @return a Transaction builder object + */ + public Transaction transaction() { + return new Transaction(this); + } + + /** + * The asynchronous version of delete. + * + * @see #delete(String, int) + */ + public void delete(final String path, int version, VoidCallback cb, + Object ctx) + { + final String clientPath = path; + PathUtils.validatePath(clientPath); + + final String serverPath; + + // maintain semantics even in chroot case + // specifically - root cannot be deleted + // I think this makes sense even in chroot case. + if (clientPath.equals("/")) { + // a bit of a hack, but delete(/) will never succeed and ensures + // that the same semantics are maintained + serverPath = clientPath; + } else { + serverPath = prependChroot(clientPath); + } + + RequestHeader h = new RequestHeader(); + h.setType(ZooDefs.OpCode.delete); + DeleteRequest request = new DeleteRequest(); + request.setPath(serverPath); + request.setVersion(version); + cnxn.queuePacket(h, new ReplyHeader(), request, null, cb, clientPath, + serverPath, ctx, null); + } + + /** + * Return the stat of the node of the given path. Return null if no such a + * node exists. + *

      + * If the watch is non-null and the call is successful (no exception is thrown), + * a watch will be left on the node with the given path. The watch will be + * triggered by a successful operation that creates/delete the node or sets + * the data on the node. + * + * @param path the node path + * @param watcher explicit watcher + * @return the stat of the node of the given path; return null if no such a + * node exists. + * @throws KeeperException If the server signals an error + * @throws InterruptedException If the server transaction is interrupted. + * @throws IllegalArgumentException if an invalid path is specified + */ + public Stat exists(final String path, Watcher watcher) + throws KeeperException, InterruptedException + { + final String clientPath = path; + PathUtils.validatePath(clientPath); + + // the watch contains the un-chroot path + WatchRegistration wcb = null; + if (watcher != null) { + wcb = new ExistsWatchRegistration(watcher, clientPath); + } + + final String serverPath = prependChroot(clientPath); + + RequestHeader h = new RequestHeader(); + h.setType(ZooDefs.OpCode.exists); + ExistsRequest request = new ExistsRequest(); + request.setPath(serverPath); + request.setWatch(watcher != null); + SetDataResponse response = new SetDataResponse(); + ReplyHeader r = cnxn.submitRequest(h, request, response, wcb); + if (r.getErr() != 0) { + if (r.getErr() == KeeperException.Code.NONODE.intValue()) { + return null; + } + throw KeeperException.create(KeeperException.Code.get(r.getErr()), + clientPath); + } + + return response.getStat().getCzxid() == -1 ? null : response.getStat(); + } + + /** + * Return the stat of the node of the given path. Return null if no such a + * node exists. + *

      + * If the watch is true and the call is successful (no exception is thrown), + * a watch will be left on the node with the given path. The watch will be + * triggered by a successful operation that creates/delete the node or sets + * the data on the node. + * + * @param path + * the node path + * @param watch + * whether need to watch this node + * @return the stat of the node of the given path; return null if no such a + * node exists. + * @throws KeeperException If the server signals an error + * @throws InterruptedException If the server transaction is interrupted. + */ + public Stat exists(String path, boolean watch) throws KeeperException, + InterruptedException + { + return exists(path, watch ? watchManager.defaultWatcher : null); + } + + /** + * The asynchronous version of exists. + * + * @see #exists(String, Watcher) + */ + public void exists(final String path, Watcher watcher, + StatCallback cb, Object ctx) + { + final String clientPath = path; + PathUtils.validatePath(clientPath); + + // the watch contains the un-chroot path + WatchRegistration wcb = null; + if (watcher != null) { + wcb = new ExistsWatchRegistration(watcher, clientPath); + } + + final String serverPath = prependChroot(clientPath); + + RequestHeader h = new RequestHeader(); + h.setType(ZooDefs.OpCode.exists); + ExistsRequest request = new ExistsRequest(); + request.setPath(serverPath); + request.setWatch(watcher != null); + SetDataResponse response = new SetDataResponse(); + cnxn.queuePacket(h, new ReplyHeader(), request, response, cb, + clientPath, serverPath, ctx, wcb); + } + + /** + * The asynchronous version of exists. + * + * @see #exists(String, boolean) + */ + public void exists(String path, boolean watch, StatCallback cb, Object ctx) { + exists(path, watch ? watchManager.defaultWatcher : null, cb, ctx); + } + + /** + * Return the data and the stat of the node of the given path. + *

      + * If the watch is non-null and the call is successful (no exception is + * thrown), a watch will be left on the node with the given path. The watch + * will be triggered by a successful operation that sets data on the node, or + * deletes the node. + *

      + * A KeeperException with error code KeeperException.NoNode will be thrown + * if no node with the given path exists. + * + * @param path the given path + * @param watcher explicit watcher + * @param stat the stat of the node + * @return the data of the node + * @throws KeeperException If the server signals an error with a non-zero error code + * @throws InterruptedException If the server transaction is interrupted. + * @throws IllegalArgumentException if an invalid path is specified + */ + public byte[] getData(final String path, Watcher watcher, Stat stat) + throws KeeperException, InterruptedException + { + final String clientPath = path; + PathUtils.validatePath(clientPath); + + // the watch contains the un-chroot path + WatchRegistration wcb = null; + if (watcher != null) { + wcb = new DataWatchRegistration(watcher, clientPath); + } + + final String serverPath = prependChroot(clientPath); + + RequestHeader h = new RequestHeader(); + h.setType(ZooDefs.OpCode.getData); + GetDataRequest request = new GetDataRequest(); + request.setPath(serverPath); + request.setWatch(watcher != null); + GetDataResponse response = new GetDataResponse(); + ReplyHeader r = cnxn.submitRequest(h, request, response, wcb); + if (r.getErr() != 0) { + throw KeeperException.create(KeeperException.Code.get(r.getErr()), + clientPath); + } + if (stat != null) { + DataTree.copyStat(response.getStat(), stat); + } + return response.getData(); + } + + /** + * Return the data and the stat of the node of the given path. + *

      + * If the watch is true and the call is successful (no exception is + * thrown), a watch will be left on the node with the given path. The watch + * will be triggered by a successful operation that sets data on the node, or + * deletes the node. + *

      + * A KeeperException with error code KeeperException.NoNode will be thrown + * if no node with the given path exists. + * + * @param path the given path + * @param watch whether need to watch this node + * @param stat the stat of the node + * @return the data of the node + * @throws KeeperException If the server signals an error with a non-zero error code + * @throws InterruptedException If the server transaction is interrupted. + */ + public byte[] getData(String path, boolean watch, Stat stat) + throws KeeperException, InterruptedException { + return getData(path, watch ? watchManager.defaultWatcher : null, stat); + } + + /** + * The asynchronous version of getData. + * + * @see #getData(String, Watcher, Stat) + */ + public void getData(final String path, Watcher watcher, + DataCallback cb, Object ctx) + { + final String clientPath = path; + PathUtils.validatePath(clientPath); + + // the watch contains the un-chroot path + WatchRegistration wcb = null; + if (watcher != null) { + wcb = new DataWatchRegistration(watcher, clientPath); + } + + final String serverPath = prependChroot(clientPath); + + RequestHeader h = new RequestHeader(); + h.setType(ZooDefs.OpCode.getData); + GetDataRequest request = new GetDataRequest(); + request.setPath(serverPath); + request.setWatch(watcher != null); + GetDataResponse response = new GetDataResponse(); + cnxn.queuePacket(h, new ReplyHeader(), request, response, cb, + clientPath, serverPath, ctx, wcb); + } + + /** + * The asynchronous version of getData. + * + * @see #getData(String, boolean, Stat) + */ + public void getData(String path, boolean watch, DataCallback cb, Object ctx) { + getData(path, watch ? watchManager.defaultWatcher : null, cb, ctx); + } + + /** + * Set the data for the node of the given path if such a node exists and the + * given version matches the version of the node (if the given version is + * -1, it matches any node's versions). Return the stat of the node. + *

      + * This operation, if successful, will trigger all the watches on the node + * of the given path left by getData calls. + *

      + * A KeeperException with error code KeeperException.NoNode will be thrown + * if no node with the given path exists. + *

      + * A KeeperException with error code KeeperException.BadVersion will be + * thrown if the given version does not match the node's version. + *

      + * The maximum allowable size of the data array is 1 MB (1,048,576 bytes). + * Arrays larger than this will cause a KeeperException to be thrown. + * + * @param path + * the path of the node + * @param data + * the data to set + * @param version + * the expected matching version + * @return the state of the node + * @throws InterruptedException If the server transaction is interrupted. + * @throws KeeperException If the server signals an error with a non-zero error code. + * @throws IllegalArgumentException if an invalid path is specified + */ + public Stat setData(final String path, byte data[], int version) + throws KeeperException, InterruptedException + { + final String clientPath = path; + PathUtils.validatePath(clientPath); + + final String serverPath = prependChroot(clientPath); + + RequestHeader h = new RequestHeader(); + h.setType(ZooDefs.OpCode.setData); + SetDataRequest request = new SetDataRequest(); + request.setPath(serverPath); + request.setData(data); + request.setVersion(version); + SetDataResponse response = new SetDataResponse(); + ReplyHeader r = cnxn.submitRequest(h, request, response, null); + if (r.getErr() != 0) { + throw KeeperException.create(KeeperException.Code.get(r.getErr()), + clientPath); + } + return response.getStat(); + } + + /** + * The asynchronous version of setData. + * + * @see #setData(String, byte[], int) + */ + public void setData(final String path, byte data[], int version, + StatCallback cb, Object ctx) + { + final String clientPath = path; + PathUtils.validatePath(clientPath); + + final String serverPath = prependChroot(clientPath); + + RequestHeader h = new RequestHeader(); + h.setType(ZooDefs.OpCode.setData); + SetDataRequest request = new SetDataRequest(); + request.setPath(serverPath); + request.setData(data); + request.setVersion(version); + SetDataResponse response = new SetDataResponse(); + cnxn.queuePacket(h, new ReplyHeader(), request, response, cb, + clientPath, serverPath, ctx, null); + } + + /** + * Return the ACL and stat of the node of the given path. + *

      + * A KeeperException with error code KeeperException.NoNode will be thrown + * if no node with the given path exists. + * + * @param path + * the given path for the node + * @param stat + * the stat of the node will be copied to this parameter. + * @return the ACL array of the given node. + * @throws InterruptedException If the server transaction is interrupted. + * @throws KeeperException If the server signals an error with a non-zero error code. + * @throws IllegalArgumentException if an invalid path is specified + */ + public List getACL(final String path, Stat stat) + throws KeeperException, InterruptedException + { + final String clientPath = path; + PathUtils.validatePath(clientPath); + + final String serverPath = prependChroot(clientPath); + + RequestHeader h = new RequestHeader(); + h.setType(ZooDefs.OpCode.getACL); + GetACLRequest request = new GetACLRequest(); + request.setPath(serverPath); + GetACLResponse response = new GetACLResponse(); + ReplyHeader r = cnxn.submitRequest(h, request, response, null); + if (r.getErr() != 0) { + throw KeeperException.create(KeeperException.Code.get(r.getErr()), + clientPath); + } + DataTree.copyStat(response.getStat(), stat); + return response.getAcl(); + } + + /** + * The asynchronous version of getACL. + * + * @see #getACL(String, Stat) + */ + public void getACL(final String path, Stat stat, ACLCallback cb, + Object ctx) + { + final String clientPath = path; + PathUtils.validatePath(clientPath); + + final String serverPath = prependChroot(clientPath); + + RequestHeader h = new RequestHeader(); + h.setType(ZooDefs.OpCode.getACL); + GetACLRequest request = new GetACLRequest(); + request.setPath(serverPath); + GetACLResponse response = new GetACLResponse(); + cnxn.queuePacket(h, new ReplyHeader(), request, response, cb, + clientPath, serverPath, ctx, null); + } + + /** + * Set the ACL for the node of the given path if such a node exists and the + * given version matches the version of the node. Return the stat of the + * node. + *

      + * A KeeperException with error code KeeperException.NoNode will be thrown + * if no node with the given path exists. + *

      + * A KeeperException with error code KeeperException.BadVersion will be + * thrown if the given version does not match the node's version. + * + * @param path + * @param acl + * @param version + * @return the stat of the node. + * @throws InterruptedException If the server transaction is interrupted. + * @throws KeeperException If the server signals an error with a non-zero error code. + * @throws org.apache.zookeeper.KeeperException.InvalidACLException If the acl is invalide. + * @throws IllegalArgumentException if an invalid path is specified + */ + public Stat setACL(final String path, List acl, int version) + throws KeeperException, InterruptedException + { + final String clientPath = path; + PathUtils.validatePath(clientPath); + + final String serverPath = prependChroot(clientPath); + + RequestHeader h = new RequestHeader(); + h.setType(ZooDefs.OpCode.setACL); + SetACLRequest request = new SetACLRequest(); + request.setPath(serverPath); + if (acl != null && acl.size() == 0) { + throw new KeeperException.InvalidACLException(clientPath); + } + request.setAcl(acl); + request.setVersion(version); + SetACLResponse response = new SetACLResponse(); + ReplyHeader r = cnxn.submitRequest(h, request, response, null); + if (r.getErr() != 0) { + throw KeeperException.create(KeeperException.Code.get(r.getErr()), + clientPath); + } + return response.getStat(); + } + + /** + * The asynchronous version of setACL. + * + * @see #setACL(String, List, int) + */ + public void setACL(final String path, List acl, int version, + StatCallback cb, Object ctx) + { + final String clientPath = path; + PathUtils.validatePath(clientPath); + + final String serverPath = prependChroot(clientPath); + + RequestHeader h = new RequestHeader(); + h.setType(ZooDefs.OpCode.setACL); + SetACLRequest request = new SetACLRequest(); + request.setPath(serverPath); + request.setAcl(acl); + request.setVersion(version); + SetACLResponse response = new SetACLResponse(); + cnxn.queuePacket(h, new ReplyHeader(), request, response, cb, + clientPath, serverPath, ctx, null); + } + + /** + * Return the list of the children of the node of the given path. + *

      + * If the watch is non-null and the call is successful (no exception is thrown), + * a watch will be left on the node with the given path. The watch willbe + * triggered by a successful operation that deletes the node of the given + * path or creates/delete a child under the node. + *

      + * The list of children returned is not sorted and no guarantee is provided + * as to its natural or lexical order. + *

      + * A KeeperException with error code KeeperException.NoNode will be thrown + * if no node with the given path exists. + * + * @param path + * @param watcher explicit watcher + * @return an unordered array of children of the node with the given path + * @throws InterruptedException If the server transaction is interrupted. + * @throws KeeperException If the server signals an error with a non-zero error code. + * @throws IllegalArgumentException if an invalid path is specified + */ + public List getChildren(final String path, Watcher watcher) + throws KeeperException, InterruptedException + { + final String clientPath = path; + PathUtils.validatePath(clientPath); + + // the watch contains the un-chroot path + WatchRegistration wcb = null; + if (watcher != null) { + wcb = new ChildWatchRegistration(watcher, clientPath); + } + + final String serverPath = prependChroot(clientPath); + + RequestHeader h = new RequestHeader(); + h.setType(ZooDefs.OpCode.getChildren); + GetChildrenRequest request = new GetChildrenRequest(); + request.setPath(serverPath); + request.setWatch(watcher != null); + GetChildrenResponse response = new GetChildrenResponse(); + ReplyHeader r = cnxn.submitRequest(h, request, response, wcb); + if (r.getErr() != 0) { + throw KeeperException.create(KeeperException.Code.get(r.getErr()), + clientPath); + } + return response.getChildren(); + } + + /** + * Return the list of the children of the node of the given path. + *

      + * If the watch is true and the call is successful (no exception is thrown), + * a watch will be left on the node with the given path. The watch willbe + * triggered by a successful operation that deletes the node of the given + * path or creates/delete a child under the node. + *

      + * The list of children returned is not sorted and no guarantee is provided + * as to its natural or lexical order. + *

      + * A KeeperException with error code KeeperException.NoNode will be thrown + * if no node with the given path exists. + * + * @param path + * @param watch + * @return an unordered array of children of the node with the given path + * @throws InterruptedException If the server transaction is interrupted. + * @throws KeeperException If the server signals an error with a non-zero error code. + */ + public List getChildren(String path, boolean watch) + throws KeeperException, InterruptedException { + return getChildren(path, watch ? watchManager.defaultWatcher : null); + } + + /** + * The asynchronous version of getChildren. + * + * @see #getChildren(String, Watcher) + */ + public void getChildren(final String path, Watcher watcher, + ChildrenCallback cb, Object ctx) + { + final String clientPath = path; + PathUtils.validatePath(clientPath); + + // the watch contains the un-chroot path + WatchRegistration wcb = null; + if (watcher != null) { + wcb = new ChildWatchRegistration(watcher, clientPath); + } + + final String serverPath = prependChroot(clientPath); + + RequestHeader h = new RequestHeader(); + h.setType(ZooDefs.OpCode.getChildren); + GetChildrenRequest request = new GetChildrenRequest(); + request.setPath(serverPath); + request.setWatch(watcher != null); + GetChildrenResponse response = new GetChildrenResponse(); + cnxn.queuePacket(h, new ReplyHeader(), request, response, cb, + clientPath, serverPath, ctx, wcb); + } + + /** + * The asynchronous version of getChildren. + * + * @see #getChildren(String, boolean) + */ + public void getChildren(String path, boolean watch, ChildrenCallback cb, + Object ctx) + { + getChildren(path, watch ? watchManager.defaultWatcher : null, cb, ctx); + } + + /** + * For the given znode path return the stat and children list. + *

      + * If the watch is non-null and the call is successful (no exception is thrown), + * a watch will be left on the node with the given path. The watch willbe + * triggered by a successful operation that deletes the node of the given + * path or creates/delete a child under the node. + *

      + * The list of children returned is not sorted and no guarantee is provided + * as to its natural or lexical order. + *

      + * A KeeperException with error code KeeperException.NoNode will be thrown + * if no node with the given path exists. + * + * @since 3.3.0 + * + * @param path + * @param watcher explicit watcher + * @param stat stat of the znode designated by path + * @return an unordered array of children of the node with the given path + * @throws InterruptedException If the server transaction is interrupted. + * @throws KeeperException If the server signals an error with a non-zero error code. + * @throws IllegalArgumentException if an invalid path is specified + */ + public List getChildren(final String path, Watcher watcher, + Stat stat) + throws KeeperException, InterruptedException + { + final String clientPath = path; + PathUtils.validatePath(clientPath); + + // the watch contains the un-chroot path + WatchRegistration wcb = null; + if (watcher != null) { + wcb = new ChildWatchRegistration(watcher, clientPath); + } + + final String serverPath = prependChroot(clientPath); + + RequestHeader h = new RequestHeader(); + h.setType(ZooDefs.OpCode.getChildren2); + GetChildren2Request request = new GetChildren2Request(); + request.setPath(serverPath); + request.setWatch(watcher != null); + GetChildren2Response response = new GetChildren2Response(); + ReplyHeader r = cnxn.submitRequest(h, request, response, wcb); + if (r.getErr() != 0) { + throw KeeperException.create(KeeperException.Code.get(r.getErr()), + clientPath); + } + if (stat != null) { + DataTree.copyStat(response.getStat(), stat); + } + return response.getChildren(); + } + + /** + * For the given znode path return the stat and children list. + *

      + * If the watch is true and the call is successful (no exception is thrown), + * a watch will be left on the node with the given path. The watch willbe + * triggered by a successful operation that deletes the node of the given + * path or creates/delete a child under the node. + *

      + * The list of children returned is not sorted and no guarantee is provided + * as to its natural or lexical order. + *

      + * A KeeperException with error code KeeperException.NoNode will be thrown + * if no node with the given path exists. + * + * @since 3.3.0 + * + * @param path + * @param watch + * @param stat stat of the znode designated by path + * @return an unordered array of children of the node with the given path + * @throws InterruptedException If the server transaction is interrupted. + * @throws KeeperException If the server signals an error with a non-zero + * error code. + */ + public List getChildren(String path, boolean watch, Stat stat) + throws KeeperException, InterruptedException { + return getChildren(path, watch ? watchManager.defaultWatcher : null, + stat); + } + + /** + * The asynchronous version of getChildren. + * + * @since 3.3.0 + * + * @see #getChildren(String, Watcher, Stat) + */ + public void getChildren(final String path, Watcher watcher, + Children2Callback cb, Object ctx) + { + final String clientPath = path; + PathUtils.validatePath(clientPath); + + // the watch contains the un-chroot path + WatchRegistration wcb = null; + if (watcher != null) { + wcb = new ChildWatchRegistration(watcher, clientPath); + } + + final String serverPath = prependChroot(clientPath); + + RequestHeader h = new RequestHeader(); + h.setType(ZooDefs.OpCode.getChildren2); + GetChildren2Request request = new GetChildren2Request(); + request.setPath(serverPath); + request.setWatch(watcher != null); + GetChildren2Response response = new GetChildren2Response(); + cnxn.queuePacket(h, new ReplyHeader(), request, response, cb, + clientPath, serverPath, ctx, wcb); + } + + /** + * The asynchronous version of getChildren. + * + * @since 3.3.0 + * + * @see #getChildren(String, boolean, Stat) + */ + public void getChildren(String path, boolean watch, Children2Callback cb, + Object ctx) + { + getChildren(path, watch ? watchManager.defaultWatcher : null, cb, ctx); + } + + /** + * Asynchronous sync. Flushes channel between process and leader. + * @param path + * @param cb a handler for the callback + * @param ctx context to be provided to the callback + * @throws IllegalArgumentException if an invalid path is specified + */ + public void sync(final String path, VoidCallback cb, Object ctx){ + final String clientPath = path; + PathUtils.validatePath(clientPath); + + final String serverPath = prependChroot(clientPath); + + RequestHeader h = new RequestHeader(); + h.setType(ZooDefs.OpCode.sync); + SyncRequest request = new SyncRequest(); + SyncResponse response = new SyncResponse(); + request.setPath(serverPath); + cnxn.queuePacket(h, new ReplyHeader(), request, response, cb, + clientPath, serverPath, ctx, null); + } + + public States getState() { + return cnxn.getState(); + } + + /** + * String representation of this ZooKeeper client. Suitable for things + * like logging. + * + * Do NOT count on the format of this string, it may change without + * warning. + * + * @since 3.3.0 + */ + @Override + public String toString() { + States state = getState(); + return ("State:" + state.toString() + + (state.isConnected() ? + " Timeout:" + getSessionTimeout() + " " : + " ") + + cnxn); + } + + /* + * Methods to aid in testing follow. + * + * THESE METHODS ARE EXPECTED TO BE USED FOR TESTING ONLY!!! + */ + + /** + * Wait up to wait milliseconds for the underlying threads to shutdown. + * THIS METHOD IS EXPECTED TO BE USED FOR TESTING ONLY!!! + * + * @since 3.3.0 + * + * @param wait max wait in milliseconds + * @return true iff all threads are shutdown, otw false + */ + protected boolean testableWaitForShutdown(int wait) + throws InterruptedException + { + cnxn.sendThread.join(wait); + if (cnxn.sendThread.isAlive()) return false; + cnxn.eventThread.join(wait); + if (cnxn.eventThread.isAlive()) return false; + return true; + } + + /** + * Returns the address to which the socket is connected. Useful for testing + * against an ensemble - test client may need to know which server + * to shutdown if interested in verifying that the code handles + * disconnection/reconnection correctly. + * THIS METHOD IS EXPECTED TO BE USED FOR TESTING ONLY!!! + * + * @since 3.3.0 + * + * @return ip address of the remote side of the connection or null if + * not connected + */ + protected SocketAddress testableRemoteSocketAddress() { + return cnxn.sendThread.getClientCnxnSocket().getRemoteSocketAddress(); + } + + /** + * Returns the local address to which the socket is bound. + * THIS METHOD IS EXPECTED TO BE USED FOR TESTING ONLY!!! + * + * @since 3.3.0 + * + * @return ip address of the remote side of the connection or null if + * not connected + */ + protected SocketAddress testableLocalSocketAddress() { + return cnxn.sendThread.getClientCnxnSocket().getLocalSocketAddress(); + } + + private static ClientCnxnSocket getClientCnxnSocket() throws IOException { + String clientCnxnSocketName = System + .getProperty(ZOOKEEPER_CLIENT_CNXN_SOCKET); + if (clientCnxnSocketName == null) { + clientCnxnSocketName = ClientCnxnSocketNIO.class.getName(); + } + try { + return (ClientCnxnSocket) Class.forName(clientCnxnSocketName) + .newInstance(); + } catch (Exception e) { + IOException ioe = new IOException("Couldn't instantiate " + + clientCnxnSocketName); + ioe.initCause(e); + throw ioe; + } + } +} diff --git a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/ZooKeeperMain.java b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/ZooKeeperMain.java new file mode 100644 index 000000000..b1b4c2781 --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/ZooKeeperMain.java @@ -0,0 +1,859 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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. + */ + +package org.apache.zookeeper; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStreamReader; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Date; +import java.util.HashMap; +import java.util.Iterator; +import java.util.LinkedList; +import java.util.List; +import java.util.Map; +import java.util.NoSuchElementException; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.apache.zookeeper.AsyncCallback.DataCallback; +import org.apache.zookeeper.ZooDefs.Ids; +import org.apache.zookeeper.data.ACL; +import org.apache.zookeeper.data.Id; +import org.apache.zookeeper.data.Stat; +import java.util.StringTokenizer; + +/** + * The command line client to ZooKeeper. + * + */ +public class ZooKeeperMain { + private static final Logger LOG = LoggerFactory.getLogger(ZooKeeperMain.class); + protected static final Map commandMap = new HashMap( ); + + protected MyCommandOptions cl = new MyCommandOptions(); + protected HashMap history = new HashMap( ); + protected int commandCount = 0; + protected boolean printWatches = true; + + protected ZooKeeper zk; + protected String host = ""; + + public boolean getPrintWatches( ) { + return printWatches; + } + + static { + commandMap.put("connect", "host:port"); + commandMap.put("close",""); + commandMap.put("create", "[-s] [-e] path data acl"); + commandMap.put("delete","path [version]"); + commandMap.put("rmr","path"); + commandMap.put("set","path data [version]"); + commandMap.put("get","path [watch]"); + commandMap.put("ls","path [watch]"); + commandMap.put("ls2","path [watch]"); + commandMap.put("getAcl","path"); + commandMap.put("setAcl","path acl"); + commandMap.put("stat","path [watch]"); + commandMap.put("sync","path"); + commandMap.put("setquota","-n|-b val path"); + commandMap.put("listquota","path"); + commandMap.put("delquota","[-n|-b] path"); + commandMap.put("history",""); + commandMap.put("redo","cmdno"); + commandMap.put("printwatches", "on|off"); + commandMap.put("quit",""); + commandMap.put("addauth", "scheme auth"); + } + + static void usage() { + System.err.println("ZooKeeper -server host:port cmd args"); + for (String cmd : commandMap.keySet()) { + System.err.println("\t"+cmd+ " " + commandMap.get(cmd)); + } + } + + private class MyWatcher implements Watcher { + public void process(WatchedEvent event) { + if (getPrintWatches()) { + ZooKeeperMain.printMessage("WATCHER::"); + ZooKeeperMain.printMessage(event.toString()); + } + } + } + + static private int getPermFromString(String permString) { + int perm = 0; + for (int i = 0; i < permString.length(); i++) { + switch (permString.charAt(i)) { + case 'r': + perm |= ZooDefs.Perms.READ; + break; + case 'w': + perm |= ZooDefs.Perms.WRITE; + break; + case 'c': + perm |= ZooDefs.Perms.CREATE; + break; + case 'd': + perm |= ZooDefs.Perms.DELETE; + break; + case 'a': + perm |= ZooDefs.Perms.ADMIN; + break; + default: + System.err + .println("Unknown perm type: " + permString.charAt(i)); + } + } + return perm; + } + + private static void printStat(Stat stat) { + System.err.println("cZxid = 0x" + Long.toHexString(stat.getCzxid())); + System.err.println("ctime = " + new Date(stat.getCtime()).toString()); + System.err.println("mZxid = 0x" + Long.toHexString(stat.getMzxid())); + System.err.println("mtime = " + new Date(stat.getMtime()).toString()); + System.err.println("pZxid = 0x" + Long.toHexString(stat.getPzxid())); + System.err.println("cversion = " + stat.getCversion()); + System.err.println("dataVersion = " + stat.getVersion()); + System.err.println("aclVersion = " + stat.getAversion()); + System.err.println("ephemeralOwner = 0x" + + Long.toHexString(stat.getEphemeralOwner())); + System.err.println("dataLength = " + stat.getDataLength()); + System.err.println("numChildren = " + stat.getNumChildren()); + } + + /** + * A storage class for both command line options and shell commands. + * + */ + static class MyCommandOptions { + + private Map options = new HashMap(); + private List cmdArgs = null; + private String command = null; + + public MyCommandOptions() { + options.put("server", "localhost:2181"); + options.put("timeout", "30000"); + } + + public String getOption(String opt) { + return options.get(opt); + } + + public String getCommand( ) { + return command; + } + + public String getCmdArgument( int index ) { + return cmdArgs.get(index); + } + + public int getNumArguments( ) { + return cmdArgs.size(); + } + + public String[] getArgArray() { + return cmdArgs.toArray(new String[0]); + } + + /** + * Parses a command line that may contain one or more flags + * before an optional command string + * @param args command line arguments + * @return true if parsing succeeded, false otherwise. + */ + public boolean parseOptions(String[] args) { + List argList = Arrays.asList(args); + Iterator it = argList.iterator(); + + while (it.hasNext()) { + String opt = it.next(); + try { + if (opt.equals("-server")) { + options.put("server", it.next()); + } else if (opt.equals("-timeout")) { + options.put("timeout", it.next()); + } else if (opt.equals("-r")) { + options.put("readonly", "true"); + } + } catch (NoSuchElementException e){ + System.err.println("Error: no argument found for option " + + opt); + return false; + } + + if (!opt.startsWith("-")) { + command = opt; + cmdArgs = new ArrayList( ); + cmdArgs.add( command ); + while (it.hasNext()) { + cmdArgs.add(it.next()); + } + return true; + } + } + return true; + } + + /** + * Breaks a string into command + arguments. + * @param cmdstring string of form "cmd arg1 arg2..etc" + * @return true if parsing succeeded. + */ + public boolean parseCommand( String cmdstring ) { + StringTokenizer cmdTokens = new StringTokenizer(cmdstring, " "); + String[] args = new String[cmdTokens.countTokens()]; + int tokenIndex = 0; + while (cmdTokens.hasMoreTokens()) { + args[tokenIndex] = cmdTokens.nextToken(); + tokenIndex++; + } + if (args.length == 0){ + return false; + } + command = args[0]; + cmdArgs = Arrays.asList(args); + return true; + } + } + + + /** + * Makes a list of possible completions, either for commands + * or for zk nodes if the token to complete begins with / + * + */ + + + protected void addToHistory(int i,String cmd) { + history.put(i, cmd); + } + + public static List getCommands() { + return new LinkedList(commandMap.keySet()); + } + + protected String getPrompt() { + return "[zk: " + host + "("+zk.getState()+")" + " " + commandCount + "] "; + } + + public static void printMessage(String msg) { + System.out.println("\n"+msg); + } + + protected void connectToZK(String newHost) throws InterruptedException, IOException { + if (zk != null && zk.getState().isAlive()) { + zk.close(); + } + host = newHost; + boolean readOnly = cl.getOption("readonly") != null; + zk = new ZooKeeper(host, + Integer.parseInt(cl.getOption("timeout")), + new MyWatcher(), readOnly); + } + + public static void main(String args[]) + throws KeeperException, IOException, InterruptedException + { + ZooKeeperMain main = new ZooKeeperMain(args); + main.run(); + } + + public ZooKeeperMain(String args[]) throws IOException, InterruptedException { + cl.parseOptions(args); + System.out.println("Connecting to " + cl.getOption("server")); + connectToZK(cl.getOption("server")); + //zk = new ZooKeeper(cl.getOption("server"), +// Integer.parseInt(cl.getOption("timeout")), new MyWatcher()); + } + + public ZooKeeperMain(ZooKeeper zk) { + this.zk = zk; + } + + @SuppressWarnings("unchecked") + void run() throws KeeperException, IOException, InterruptedException { + if (cl.getCommand() == null) { + System.out.println("Welcome to ZooKeeper!"); + + boolean jlinemissing = false; + // only use jline if it's in the classpath + try { + Class consoleC = Class.forName("jline.ConsoleReader"); + Class completorC = + Class.forName("org.apache.zookeeper.JLineZNodeCompletor"); + + System.out.println("JLine support is enabled"); + + Object console = + consoleC.getConstructor().newInstance(); + + Object completor = + completorC.getConstructor(ZooKeeper.class).newInstance(zk); + Method addCompletor = consoleC.getMethod("addCompletor", + Class.forName("jline.Completor")); + addCompletor.invoke(console, completor); + + String line; + Method readLine = consoleC.getMethod("readLine", String.class); + while ((line = (String)readLine.invoke(console, getPrompt())) != null) { + executeLine(line); + } + } catch (ClassNotFoundException e) { + LOG.debug("Unable to start jline", e); + jlinemissing = true; + } catch (NoSuchMethodException e) { + LOG.debug("Unable to start jline", e); + jlinemissing = true; + } catch (InvocationTargetException e) { + LOG.debug("Unable to start jline", e); + jlinemissing = true; + } catch (IllegalAccessException e) { + LOG.debug("Unable to start jline", e); + jlinemissing = true; + } catch (InstantiationException e) { + LOG.debug("Unable to start jline", e); + jlinemissing = true; + } + + if (jlinemissing) { + System.out.println("JLine support is disabled"); + BufferedReader br = + new BufferedReader(new InputStreamReader(System.in)); + + String line; + while ((line = br.readLine()) != null) { + executeLine(line); + } + } + } + } + + public void executeLine(String line) + throws InterruptedException, IOException, KeeperException { + if (!line.equals("")) { + cl.parseCommand(line); + addToHistory(commandCount,line); + processCmd(cl); + commandCount++; + } + } + + private static DataCallback dataCallback = new DataCallback() { + + public void processResult(int rc, String path, Object ctx, byte[] data, + Stat stat) { + System.out.println("rc = " + rc + " path = " + path + " data = " + + (data == null ? "null" : new String(data)) + " stat = "); + printStat(stat); + } + + }; + + /** + * trim the quota tree to recover unwanted tree elements + * in the quota's tree + * @param zk the zookeeper client + * @param path the path to start from and go up and see if their + * is any unwanted parent in the path. + * @return true if sucessful + * @throws KeeperException + * @throws IOException + * @throws InterruptedException + */ + private static boolean trimProcQuotas(ZooKeeper zk, String path) + throws KeeperException, IOException, InterruptedException + { + if (Quotas.quotaZookeeper.equals(path)) { + return true; + } + List children = zk.getChildren(path, false); + if (children.size() == 0) { + zk.delete(path, -1); + String parent = path.substring(0, path.lastIndexOf('/')); + return trimProcQuotas(zk, parent); + } else { + return true; + } + } + + /** + * this method deletes quota for a node. + * @param zk the zookeeper client + * @param path the path to delete quota for + * @param bytes true if number of bytes needs to + * be unset + * @param numNodes true if number of nodes needs + * to be unset + * @return true if quota deletion is successful + * @throws KeeperException + * @throws IOException + * @throws InterruptedException + */ + public static boolean delQuota(ZooKeeper zk, String path, + boolean bytes, boolean numNodes) + throws KeeperException, IOException, InterruptedException + { + String parentPath = Quotas.quotaZookeeper + path; + String quotaPath = Quotas.quotaZookeeper + path + "/" + Quotas.limitNode; + if (zk.exists(quotaPath, false) == null) { + System.out.println("Quota does not exist for " + path); + return true; + } + byte[] data = null; + try { + data = zk.getData(quotaPath, false, new Stat()); + } catch(KeeperException.NoNodeException ne) { + System.err.println("quota does not exist for " + path); + return true; + } + StatsTrack strack = new StatsTrack(new String(data)); + if (bytes && !numNodes) { + strack.setBytes(-1L); + zk.setData(quotaPath, strack.toString().getBytes(), -1); + } else if (!bytes && numNodes) { + strack.setCount(-1); + zk.setData(quotaPath, strack.toString().getBytes(), -1); + } else if (bytes && numNodes) { + // delete till you can find a node with more than + // one child + List children = zk.getChildren(parentPath, false); + /// delete the direct children first + for (String child: children) { + zk.delete(parentPath + "/" + child, -1); + } + // cut the tree till their is more than one child + trimProcQuotas(zk, parentPath); + } + return true; + } + + private static void checkIfParentQuota(ZooKeeper zk, String path) + throws InterruptedException, KeeperException + { + final String[] splits = path.split("/"); + String quotaPath = Quotas.quotaZookeeper; + for (String str: splits) { + if (str.length() == 0) { + // this should only be for the beginning of the path + // i.e. "/..." - split(path)[0] is empty string before first '/' + continue; + } + quotaPath += "/" + str; + List children = null; + try { + children = zk.getChildren(quotaPath, false); + } catch(KeeperException.NoNodeException ne) { + LOG.debug("child removed during quota check", ne); + return; + } + if (children.size() == 0) { + return; + } + for (String child: children) { + if (Quotas.limitNode.equals(child)) { + throw new IllegalArgumentException(path + " has a parent " + + quotaPath + " which has a quota"); + } + } + } + } + + /** + * this method creates a quota node for the path + * @param zk the ZooKeeper client + * @param path the path for which quota needs to be created + * @param bytes the limit of bytes on this path + * @param numNodes the limit of number of nodes on this path + * @return true if its successful and false if not. + */ + public static boolean createQuota(ZooKeeper zk, String path, + long bytes, int numNodes) + throws KeeperException, IOException, InterruptedException + { + // check if the path exists. We cannot create + // quota for a path that already exists in zookeeper + // for now. + Stat initStat = zk.exists(path, false); + if (initStat == null) { + throw new IllegalArgumentException(path + " does not exist."); + } + // now check if their is already existing + // parent or child that has quota + + String quotaPath = Quotas.quotaZookeeper; + // check for more than 2 children -- + // if zookeeper_stats and zookeeper_qutoas + // are not the children then this path + // is an ancestor of some path that + // already has quota + String realPath = Quotas.quotaZookeeper + path; + try { + List children = zk.getChildren(realPath, false); + for (String child: children) { + if (!child.startsWith("zookeeper_")) { + throw new IllegalArgumentException(path + " has child " + + child + " which has a quota"); + } + } + } catch(KeeperException.NoNodeException ne) { + // this is fine + } + + //check for any parent that has been quota + checkIfParentQuota(zk, path); + + // this is valid node for quota + // start creating all the parents + if (zk.exists(quotaPath, false) == null) { + try { + zk.create(Quotas.procZookeeper, null, Ids.OPEN_ACL_UNSAFE, + CreateMode.PERSISTENT); + zk.create(Quotas.quotaZookeeper, null, Ids.OPEN_ACL_UNSAFE, + CreateMode.PERSISTENT); + } catch(KeeperException.NodeExistsException ne) { + // do nothing + } + } + + // now create the direct children + // and the stat and quota nodes + String[] splits = path.split("/"); + StringBuilder sb = new StringBuilder(); + sb.append(quotaPath); + for (int i=1; i 2; + String path = null; + List acl = Ids.OPEN_ACL_UNSAFE; + LOG.debug("Processing " + cmd); + + if (cmd.equals("quit")) { + System.out.println("Quitting..."); + zk.close(); + System.exit(0); + } else if (cmd.equals("redo") && args.length >= 2) { + Integer i = Integer.decode(args[1]); + if (commandCount <= i){ // don't allow redoing this redo + System.out.println("Command index out of range"); + return false; + } + cl.parseCommand(history.get(i)); + if (cl.getCommand().equals( "redo" )){ + System.out.println("No redoing redos"); + return false; + } + history.put(commandCount, history.get(i)); + processCmd( cl); + } else if (cmd.equals("history")) { + for (int i=commandCount - 10;i<=commandCount;++i) { + if (i < 0) continue; + System.out.println(i + " - " + history.get(i)); + } + } else if (cmd.equals("printwatches")) { + if (args.length == 1) { + System.out.println("printwatches is " + (printWatches ? "on" : "off")); + } else { + printWatches = args[1].equals("on"); + } + } else if (cmd.equals("connect")) { + if (args.length >=2) { + connectToZK(args[1]); + } else { + connectToZK(host); + } + } + + // Below commands all need a live connection + if (zk == null || !zk.getState().isAlive()) { + System.out.println("Not connected"); + return false; + } + + if (cmd.equals("create") && args.length >= 3) { + int first = 0; + CreateMode flags = CreateMode.PERSISTENT; + if ((args[1].equals("-e") && args[2].equals("-s")) + || (args[1]).equals("-s") && (args[2].equals("-e"))) { + first+=2; + flags = CreateMode.EPHEMERAL_SEQUENTIAL; + } else if (args[1].equals("-e")) { + first++; + flags = CreateMode.EPHEMERAL; + } else if (args[1].equals("-s")) { + first++; + flags = CreateMode.PERSISTENT_SEQUENTIAL; + } + if (args.length == first + 4) { + acl = parseACLs(args[first+3]); + } + path = args[first + 1]; + String newPath = zk.create(path, args[first+2].getBytes(), acl, + flags); + System.err.println("Created " + newPath); + } else if (cmd.equals("delete") && args.length >= 2) { + path = args[1]; + zk.delete(path, watch ? Integer.parseInt(args[2]) : -1); + } else if (cmd.equals("rmr") && args.length >= 2) { + path = args[1]; + ZKUtil.deleteRecursive(zk, path); + } else if (cmd.equals("set") && args.length >= 3) { + path = args[1]; + stat = zk.setData(path, args[2].getBytes(), + args.length > 3 ? Integer.parseInt(args[3]) : -1); + printStat(stat); + } else if (cmd.equals("aget") && args.length >= 2) { + path = args[1]; + zk.getData(path, watch, dataCallback, path); + } else if (cmd.equals("get") && args.length >= 2) { + path = args[1]; + byte data[] = zk.getData(path, watch, stat); + data = (data == null)? "null".getBytes() : data; + System.out.println(new String(data)); + printStat(stat); + } else if (cmd.equals("ls") && args.length >= 2) { + path = args[1]; + List children = zk.getChildren(path, watch); + System.out.println(children); + } else if (cmd.equals("ls2") && args.length >= 2) { + path = args[1]; + List children = zk.getChildren(path, watch, stat); + System.out.println(children); + printStat(stat); + } else if (cmd.equals("getAcl") && args.length >= 2) { + path = args[1]; + acl = zk.getACL(path, stat); + for (ACL a : acl) { + System.out.println(a.getId() + ": " + + getPermString(a.getPerms())); + } + } else if (cmd.equals("setAcl") && args.length >= 3) { + path = args[1]; + stat = zk.setACL(path, parseACLs(args[2]), + args.length > 4 ? Integer.parseInt(args[3]) : -1); + printStat(stat); + } else if (cmd.equals("stat") && args.length >= 2) { + path = args[1]; + stat = zk.exists(path, watch); + if (stat == null) { + throw new KeeperException.NoNodeException(path); + } + printStat(stat); + } else if (cmd.equals("listquota") && args.length >= 2) { + path = args[1]; + String absolutePath = Quotas.quotaZookeeper + path + "/" + Quotas.limitNode; + byte[] data = null; + try { + System.err.println("absolute path is " + absolutePath); + data = zk.getData(absolutePath, false, stat); + StatsTrack st = new StatsTrack(new String(data)); + System.out.println("Output quota for " + path + " " + + st.toString()); + + data = zk.getData(Quotas.quotaZookeeper + path + "/" + + Quotas.statNode, false, stat); + System.out.println("Output stat for " + path + " " + + new StatsTrack(new String(data)).toString()); + } catch(KeeperException.NoNodeException ne) { + System.err.println("quota for " + path + " does not exist."); + } + } else if (cmd.equals("setquota") && args.length >= 4) { + String option = args[1]; + String val = args[2]; + path = args[3]; + System.err.println("Comment: the parts are " + + "option " + option + + " val " + val + + " path " + path); + if ("-b".equals(option)) { + // we are setting the bytes quota + createQuota(zk, path, Long.parseLong(val), -1); + } else if ("-n".equals(option)) { + // we are setting the num quota + createQuota(zk, path, -1L, Integer.parseInt(val)); + } else { + usage(); + } + + } else if (cmd.equals("delquota") && args.length >= 2) { + //if neither option -n or -b is specified, we delete + // the quota node for thsi node. + if (args.length == 3) { + //this time we have an option + String option = args[1]; + path = args[2]; + if ("-b".equals(option)) { + delQuota(zk, path, true, false); + } else if ("-n".equals(option)) { + delQuota(zk, path, false, true); + } + } else if (args.length == 2) { + path = args[1]; + // we dont have an option specified. + // just delete whole quota node + delQuota(zk, path, true, true); + } else if (cmd.equals("help")) { + usage(); + } + } else if (cmd.equals("close")) { + zk.close(); + } else if (cmd.equals("sync") && args.length >= 2) { + path = args[1]; + zk.sync(path, new AsyncCallback.VoidCallback() { public void processResult(int rc, String path, Object ctx) { System.out.println("Sync returned " + rc); } }, null ); + } else if (cmd.equals("addauth") && args.length >=2 ) { + byte[] b = null; + if (args.length >= 3) + b = args[2].getBytes(); + + zk.addAuthInfo(args[1], b); + } else if (!commandMap.containsKey(cmd)) { + usage(); + } + return watch; + } + + private static String getPermString(int perms) { + StringBuilder p = new StringBuilder(); + if ((perms & ZooDefs.Perms.CREATE) != 0) { + p.append('c'); + } + if ((perms & ZooDefs.Perms.DELETE) != 0) { + p.append('d'); + } + if ((perms & ZooDefs.Perms.READ) != 0) { + p.append('r'); + } + if ((perms & ZooDefs.Perms.WRITE) != 0) { + p.append('w'); + } + if ((perms & ZooDefs.Perms.ADMIN) != 0) { + p.append('a'); + } + return p.toString(); + } + + private static List parseACLs(String aclString) { + List acl; + String acls[] = aclString.split(","); + acl = new ArrayList(); + for (String a : acls) { + int firstColon = a.indexOf(':'); + int lastColon = a.lastIndexOf(':'); + if (firstColon == -1 || lastColon == -1 || firstColon == lastColon) { + System.err + .println(a + " does not have the form scheme:id:perm"); + continue; + } + ACL newAcl = new ACL(); + newAcl.setId(new Id(a.substring(0, firstColon), a.substring( + firstColon + 1, lastColon))); + newAcl.setPerms(getPermFromString(a.substring(lastColon + 1))); + acl.add(newAcl); + } + return acl; + } +} diff --git a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/client/ConnectStringParser.java b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/client/ConnectStringParser.java new file mode 100644 index 000000000..ff0425a4e --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/client/ConnectStringParser.java @@ -0,0 +1,87 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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. + */ + +package org.apache.zookeeper.client; + +import java.net.InetSocketAddress; +import java.util.ArrayList; + +import org.apache.zookeeper.common.PathUtils; + +/** + * A parser for ZooKeeper Client connect strings. + * + * This class is not meant to be seen or used outside of ZooKeeper itself. + * + * The chrootPath member should be replaced by a Path object in issue + * ZOOKEEPER-849. + * + * @see org.apache.zookeeper.ZooKeeper + */ +public final class ConnectStringParser { + private static final int DEFAULT_PORT = 2181; + + private final String chrootPath; + + private final ArrayList serverAddresses = new ArrayList(); + + /** + * + * @throws IllegalArgumentException + * for an invalid chroot path. + */ + public ConnectStringParser(String connectString) { + // parse out chroot, if any + int off = connectString.indexOf('/'); + if (off >= 0) { + String chrootPath = connectString.substring(off); + // ignore "/" chroot spec, same as null + if (chrootPath.length() == 1) { + this.chrootPath = null; + } else { + PathUtils.validatePath(chrootPath); + this.chrootPath = chrootPath; + } + connectString = connectString.substring(0, off); + } else { + this.chrootPath = null; + } + + String hostsList[] = connectString.split(","); + for (String host : hostsList) { + int port = DEFAULT_PORT; + int pidx = host.lastIndexOf(':'); + if (pidx >= 0) { + // otherwise : is at the end of the string, ignore + if (pidx < host.length() - 1) { + port = Integer.parseInt(host.substring(pidx + 1)); + } + host = host.substring(0, pidx); + } + serverAddresses.add(InetSocketAddress.createUnresolved(host, port)); + } + } + + public String getChrootPath() { + return chrootPath; + } + + public ArrayList getServerAddresses() { + return serverAddresses; + } +} \ No newline at end of file diff --git a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/client/FourLetterWordMain.java b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/client/FourLetterWordMain.java new file mode 100644 index 000000000..e41465ab9 --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/client/FourLetterWordMain.java @@ -0,0 +1,79 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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. + */ + +package org.apache.zookeeper.client; + +import org.apache.log4j.Logger; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStreamReader; +import java.io.OutputStream; +import java.net.Socket; + +public class FourLetterWordMain { + protected static final Logger LOG = Logger.getLogger(FourLetterWordMain.class); + + /** + * Send the 4letterword + * @param host the destination host + * @param port the destination port + * @param cmd the 4letterword + * @return server response + * @throws java.io.IOException + */ + public static String send4LetterWord(String host, int port, String cmd) + throws IOException + { + LOG.info("connecting to " + host + " " + port); + Socket sock = new Socket(host, port); + BufferedReader reader = null; + try { + OutputStream outstream = sock.getOutputStream(); + outstream.write(cmd.getBytes()); + outstream.flush(); + // this replicates NC - close the output stream before reading + sock.shutdownOutput(); + + reader = + new BufferedReader( + new InputStreamReader(sock.getInputStream())); + StringBuilder sb = new StringBuilder(); + String line; + while((line = reader.readLine()) != null) { + sb.append(line + "\n"); + } + return sb.toString(); + } finally { + sock.close(); + if (reader != null) { + reader.close(); + } + } + } + + public static void main(String[] args) + throws IOException + { + if (args.length != 3) { + System.out.println("Usage: FourLetterWordMain "); + } else { + System.out.println(send4LetterWord(args[0], Integer.parseInt(args[1]), args[2])); + } + } +} diff --git a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/client/HostProvider.java b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/client/HostProvider.java new file mode 100644 index 000000000..c2815b3e7 --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/client/HostProvider.java @@ -0,0 +1,61 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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. + */ + +package org.apache.zookeeper.client; + +import java.net.InetSocketAddress; + +/** + * A set of hosts a ZooKeeper client should connect to. + * + * Classes implementing this interface must guarantee the following: + * + * * Every call to next() returns an InetSocketAddress. So the iterator never + * ends. + * + * * The size() of a HostProvider may never be zero. + * + * A HostProvider must return resolved InetSocketAddress instances on next(), + * but it's up to the HostProvider, when it wants to do the resolving. + * + * Different HostProvider could be imagined: + * + * * A HostProvider that loads the list of Hosts from an URL or from DNS + * * A HostProvider that re-resolves the InetSocketAddress after a timeout. + * * A HostProvider that prefers nearby hosts. + */ +public interface HostProvider { + public int size(); + + /** + * The next host to try to connect to. + * + * For a spinDelay of 0 there should be no wait. + * + * @param spinDelay + * Milliseconds to wait if all hosts have been tried once. + */ + public InetSocketAddress next(long spinDelay); + + /** + * Notify the HostProvider of a successful connection. + * + * The HostProvider may use this notification to reset it's inner state. + */ + public void onConnected(); +} diff --git a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/client/StaticHostProvider.java b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/client/StaticHostProvider.java new file mode 100644 index 000000000..e207963fd --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/client/StaticHostProvider.java @@ -0,0 +1,116 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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. + */ + +package org.apache.zookeeper.client; + +import java.net.InetAddress; +import java.net.InetSocketAddress; +import java.net.UnknownHostException; +import java.util.ArrayList; +import java.util.Collection; +import java.util.Collections; +import java.util.List; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + + +/** + * Most simple HostProvider, resolves only on instantiation. + * + */ +public final class StaticHostProvider implements HostProvider { + private static final Logger LOG = LoggerFactory + .getLogger(StaticHostProvider.class); + + private final List serverAddresses = new ArrayList( + 5); + + private int lastIndex = -1; + + private int currentIndex = -1; + + /** + * Constructs a SimpleHostSet. + * + * @param serverAddresses + * possibly unresolved ZooKeeper server addresses + * @throws UnknownHostException + * @throws IllegalArgumentException + * if serverAddresses is empty or resolves to an empty list + */ + public StaticHostProvider(Collection serverAddresses) + throws UnknownHostException { + for (InetSocketAddress address : serverAddresses) { + InetAddress ia = address.getAddress(); + InetAddress resolvedAddresses[] = InetAddress.getAllByName((ia!=null) ? ia.getHostAddress(): + address.getHostName()); + for (InetAddress resolvedAddress : resolvedAddresses) { + // If hostName is null but the address is not, we can tell that + // the hostName is an literal IP address. Then we can set the host string as the hostname + // safely to avoid reverse DNS lookup. + // As far as i know, the only way to check if the hostName is null is use toString(). + // Both the two implementations of InetAddress are final class, so we can trust the return value of + // the toString() method. + if (resolvedAddress.toString().startsWith("/") + && resolvedAddress.getAddress() != null) { + this.serverAddresses.add( + new InetSocketAddress(InetAddress.getByAddress( + address.getHostName(), + resolvedAddress.getAddress()), + address.getPort())); + } else { + this.serverAddresses.add(new InetSocketAddress(resolvedAddress.getHostAddress(), address.getPort())); + } + } + } + + if (this.serverAddresses.isEmpty()) { + throw new IllegalArgumentException( + "A HostProvider may not be empty!"); + } + Collections.shuffle(this.serverAddresses); + } + + public int size() { + return serverAddresses.size(); + } + + public InetSocketAddress next(long spinDelay) { + ++currentIndex; + if (currentIndex == serverAddresses.size()) { + currentIndex = 0; + } + if (currentIndex == lastIndex && spinDelay > 0) { + try { + Thread.sleep(spinDelay); + } catch (InterruptedException e) { + LOG.warn("Unexpected exception", e); + } + } else if (lastIndex == -1) { + // We don't want to sleep on the first ever connect attempt. + lastIndex = 0; + } + + return serverAddresses.get(currentIndex); + } + + public void onConnected() { + lastIndex = currentIndex; + } +} diff --git a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/client/ZooKeeperSaslClient.java b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/client/ZooKeeperSaslClient.java new file mode 100644 index 000000000..dbc108019 --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/client/ZooKeeperSaslClient.java @@ -0,0 +1,584 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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. + */ + +package org.apache.zookeeper.client; + +import java.io.IOException; +import java.security.Principal; +import java.security.PrivilegedActionException; +import java.security.PrivilegedExceptionAction; + +import javax.security.auth.Subject; +import javax.security.auth.callback.Callback; +import javax.security.auth.callback.CallbackHandler; +import javax.security.auth.callback.NameCallback; +import javax.security.auth.callback.PasswordCallback; +import javax.security.auth.callback.UnsupportedCallbackException; +import javax.security.auth.login.AppConfigurationEntry; +import javax.security.auth.login.Configuration; +import javax.security.auth.login.LoginException; +import javax.security.sasl.AuthorizeCallback; +import javax.security.sasl.RealmCallback; +import javax.security.sasl.Sasl; +import javax.security.sasl.SaslClient; +import javax.security.sasl.SaslException; + +import org.apache.zookeeper.AsyncCallback; +import org.apache.zookeeper.ClientCnxn; +import org.apache.zookeeper.Environment; +import org.apache.zookeeper.Login; +import org.apache.zookeeper.Watcher.Event.KeeperState; +import org.apache.zookeeper.ZooDefs; +import org.apache.zookeeper.data.Stat; +import org.apache.zookeeper.proto.GetSASLRequest; +import org.apache.zookeeper.proto.SetSASLResponse; +import org.apache.zookeeper.server.auth.KerberosName; +import org.ietf.jgss.GSSContext; +import org.ietf.jgss.GSSCredential; +import org.ietf.jgss.GSSException; +import org.ietf.jgss.GSSManager; +import org.ietf.jgss.Oid; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * This class manages SASL authentication for the client. It + * allows ClientCnxn to authenticate using SASL with a Zookeeper server. + */ +public class ZooKeeperSaslClient { + public static final String LOGIN_CONTEXT_NAME_KEY = "zookeeper.sasl.clientconfig"; + public static final String ENABLE_CLIENT_SASL_KEY = "zookeeper.sasl.client"; + public static final String ENABLE_CLIENT_SASL_DEFAULT = "true"; + + /** + * Returns true if the SASL client is enabled. By default, the client + * is enabled but can be disabled by setting the system property + * zookeeper.sasl.client to false. See + * ZOOKEEPER-1657 for more information. + * + * @return If the SASL client is enabled. + */ + public static boolean isEnabled() { + return Boolean.valueOf(System.getProperty(ENABLE_CLIENT_SASL_KEY, ENABLE_CLIENT_SASL_DEFAULT)); + } + + private static final Logger LOG = LoggerFactory.getLogger(ZooKeeperSaslClient.class); + private static Login login = null; + private SaslClient saslClient; + private boolean isSASLConfigured = true; + + private byte[] saslToken = new byte[0]; + + public enum SaslState { + INITIAL,INTERMEDIATE,COMPLETE,FAILED + } + + private SaslState saslState = SaslState.INITIAL; + + private boolean gotLastPacket = false; + /** informational message indicating the current configuration status */ + private final String configStatus; + + public SaslState getSaslState() { + return saslState; + } + + public String getLoginContext() { + if (login != null) + return login.getLoginContextName(); + return null; + } + + public ZooKeeperSaslClient(final String serverPrincipal) + throws LoginException { + /** + * ZOOKEEPER-1373: allow system property to specify the JAAS + * configuration section that the zookeeper client should use. + * Default to "Client". + */ + String clientSection = System.getProperty(ZooKeeperSaslClient.LOGIN_CONTEXT_NAME_KEY, "Client"); + // Note that 'Configuration' here refers to javax.security.auth.login.Configuration. + AppConfigurationEntry entries[] = null; + RuntimeException runtimeException = null; + try { + entries = Configuration.getConfiguration().getAppConfigurationEntry(clientSection); + } catch (SecurityException e) { + // handle below: might be harmless if the user doesn't intend to use JAAS authentication. + runtimeException = e; + } catch (IllegalArgumentException e) { + // third party customized getAppConfigurationEntry could throw IllegalArgumentException when JAAS + // configuration isn't set. We can reevaluate whether to catch RuntimeException instead when more + // different types of RuntimeException found + runtimeException = e; + } + if (entries != null) { + this.configStatus = "Will attempt to SASL-authenticate using Login Context section '" + clientSection + "'"; + this.saslClient = createSaslClient(serverPrincipal, clientSection); + } else { + // Handle situation of clientSection's being null: it might simply because the client does not intend to + // use SASL, so not necessarily an error. + saslState = SaslState.FAILED; + String explicitClientSection = System.getProperty(ZooKeeperSaslClient.LOGIN_CONTEXT_NAME_KEY); + if (explicitClientSection != null) { + // If the user explicitly overrides the default Login Context, they probably expected SASL to + // succeed. But if we got here, SASL failed. + if (runtimeException != null) { + throw new LoginException("Zookeeper client cannot authenticate using the " + explicitClientSection + + " section of the supplied JAAS configuration: '" + + System.getProperty(Environment.JAAS_CONF_KEY) + "' because of a " + + "RuntimeException: " + runtimeException); + } else { + throw new LoginException("Client cannot SASL-authenticate because the specified JAAS configuration " + + "section '" + explicitClientSection + "' could not be found."); + } + } else { + // The user did not override the default context. It might be that they just don't intend to use SASL, + // so log at INFO, not WARN, since they don't expect any SASL-related information. + String msg = "Will not attempt to authenticate using SASL "; + if (runtimeException != null) { + msg += "(" + runtimeException + ")"; + } else { + msg += "(unknown error)"; + } + this.configStatus = msg; + this.isSASLConfigured = false; + } + if (System.getProperty(Environment.JAAS_CONF_KEY) != null) { + // Again, the user explicitly set something SASL-related, so they probably expected SASL to succeed. + if (runtimeException != null) { + throw new LoginException("Zookeeper client cannot authenticate using the '" + + System.getProperty(ZooKeeperSaslClient.LOGIN_CONTEXT_NAME_KEY, "Client") + + "' section of the supplied JAAS configuration: '" + + System.getProperty(Environment.JAAS_CONF_KEY) + "' because of a " + + "RuntimeException: " + runtimeException); + } else { + throw new LoginException("No JAAS configuration section named '" + + System.getProperty(ZooKeeperSaslClient.LOGIN_CONTEXT_NAME_KEY, "Client") + + "' was found in specified JAAS configuration file: '" + + System.getProperty(Environment.JAAS_CONF_KEY) + "'."); + } + } + } + } + + /** + * @return informational message indicating the current configuration status. + */ + public String getConfigStatus() { + return configStatus; + } + + public boolean isComplete() { + return (saslState == SaslState.COMPLETE); + } + + public boolean isFailed() { + return (saslState == SaslState.FAILED); + } + + public static class ServerSaslResponseCallback implements AsyncCallback.DataCallback { + public void processResult(int rc, String path, Object ctx, byte data[], Stat stat) { + // processResult() is used by ClientCnxn's sendThread to respond to + // data[] contains the Zookeeper Server's SASL token. + // ctx is the ZooKeeperSaslClient object. We use this object's respondToServer() method + // to reply to the Zookeeper Server's SASL token + ZooKeeperSaslClient client = ((ClientCnxn)ctx).zooKeeperSaslClient; + if (client == null) { + LOG.warn("sasl client was unexpectedly null: cannot respond to Zookeeper server."); + return; + } + byte[] usedata = data; + if (data != null) { + LOG.debug("ServerSaslResponseCallback(): saslToken server response: (length="+usedata.length+")"); + } + else { + usedata = new byte[0]; + LOG.debug("ServerSaslResponseCallback(): using empty data[] as server response (length="+usedata.length+")"); + } + client.respondToServer(usedata, (ClientCnxn)ctx); + } + } + + synchronized private SaslClient createSaslClient(final String servicePrincipal, + final String loginContext) throws LoginException { + try { + if (login == null) { + if (LOG.isDebugEnabled()) { + LOG.debug("JAAS loginContext is: " + loginContext); + } + // note that the login object is static: it's shared amongst all zookeeper-related connections. + // createSaslClient() must be declared synchronized so that login is initialized only once. + login = new Login(loginContext, new ClientCallbackHandler(null)); + login.startThreadIfNeeded(); + } + Subject subject = login.getSubject(); + SaslClient saslClient; + // Use subject.getPrincipals().isEmpty() as an indication of which SASL mechanism to use: + // if empty, use DIGEST-MD5; otherwise, use GSSAPI. + if (subject.getPrincipals().isEmpty()) { + // no principals: must not be GSSAPI: use DIGEST-MD5 mechanism instead. + LOG.info("Client will use DIGEST-MD5 as SASL mechanism."); + String[] mechs = {"DIGEST-MD5"}; + String username = (String)(subject.getPublicCredentials().toArray()[0]); + String password = (String)(subject.getPrivateCredentials().toArray()[0]); + // "zk-sasl-md5" is a hard-wired 'domain' parameter shared with zookeeper server code (see ServerCnxnFactory.java) + saslClient = Sasl.createSaslClient(mechs, username, "zookeeper", "zk-sasl-md5", null, new ClientCallbackHandler(password)); + return saslClient; + } + else { // GSSAPI. + boolean usingNativeJgss = + Boolean.getBoolean("sun.security.jgss.native"); + if (usingNativeJgss) { + // http://docs.oracle.com/javase/6/docs/technotes/guides/security/jgss/jgss-features.html + // """ + // In addition, when performing operations as a particular + // Subject, e.g. Subject.doAs(...) or Subject.doAsPrivileged(...), + // the to-be-used GSSCredential should be added to Subject's + // private credential set. Otherwise, the GSS operations will + // fail since no credential is found. + // """ + try { + GSSManager manager = GSSManager.getInstance(); + Oid krb5Mechanism = new Oid("1.2.840.113554.1.2.2"); + GSSCredential cred = manager.createCredential(null, + GSSContext.DEFAULT_LIFETIME, + krb5Mechanism, + GSSCredential.INITIATE_ONLY); + subject.getPrivateCredentials().add(cred); + if (LOG.isDebugEnabled()) { + LOG.debug("Added private credential to subject: " + cred); + } + } catch (GSSException ex) { + LOG.warn("Cannot add private credential to subject; " + + "authentication at the server may fail", ex); + } + } + final Object[] principals = subject.getPrincipals().toArray(); + // determine client principal from subject. + final Principal clientPrincipal = (Principal)principals[0]; + final KerberosName clientKerberosName = new KerberosName(clientPrincipal.getName()); + // assume that server and client are in the same realm (by default; unless the system property + // "zookeeper.server.realm" is set). + String serverRealm = System.getProperty("zookeeper.server.realm",clientKerberosName.getRealm()); + KerberosName serviceKerberosName = new KerberosName(servicePrincipal+"@"+serverRealm); + final String serviceName = serviceKerberosName.getServiceName(); + final String serviceHostname = serviceKerberosName.getHostName(); + final String clientPrincipalName = clientKerberosName.toString(); + try { + saslClient = Subject.doAs(subject,new PrivilegedExceptionAction() { + public SaslClient run() throws SaslException { + LOG.info("Client will use GSSAPI as SASL mechanism."); + String[] mechs = {"GSSAPI"}; + LOG.debug("creating sasl client: client="+clientPrincipalName+";service="+serviceName+";serviceHostname="+serviceHostname); + SaslClient saslClient = Sasl.createSaslClient(mechs,clientPrincipalName,serviceName,serviceHostname,null,new ClientCallbackHandler(null)); + return saslClient; + } + }); + return saslClient; + } + catch (Exception e) { + LOG.error("Exception while trying to create SASL client", e); + e.printStackTrace(); + return null; + } + } + } catch (LoginException e) { + // We throw LoginExceptions... + throw e; + } catch (Exception e) { + // ..but consume (with a log message) all other types of exceptions. + LOG.error("Exception while trying to create SASL client: " + e); + return null; + } + } + + public void respondToServer(byte[] serverToken, ClientCnxn cnxn) { + if (saslClient == null) { + LOG.error("saslClient is unexpectedly null. Cannot respond to server's SASL message; ignoring."); + return; + } + + if (!(saslClient.isComplete())) { + try { + saslToken = createSaslToken(serverToken); + if (saslToken != null) { + sendSaslPacket(saslToken, cnxn); + } + } catch (SaslException e) { + LOG.error("SASL authentication failed using login context '" + + this.getLoginContext() + "'."); + saslState = SaslState.FAILED; + gotLastPacket = true; + } + } + + if (saslClient.isComplete()) { + // GSSAPI: server sends a final packet after authentication succeeds + // or fails. + if ((serverToken == null) && (saslClient.getMechanismName().equals("GSSAPI"))) + gotLastPacket = true; + // non-GSSAPI: no final packet from server. + if (!saslClient.getMechanismName().equals("GSSAPI")) { + gotLastPacket = true; + } + // SASL authentication is completed, successfully or not: + // enable the socket's writable flag so that any packets waiting for authentication to complete in + // the outgoing queue will be sent to the Zookeeper server. + cnxn.enableWrite(); + } + } + + private byte[] createSaslToken() throws SaslException { + saslState = SaslState.INTERMEDIATE; + return createSaslToken(saslToken); + } + + private byte[] createSaslToken(final byte[] saslToken) throws SaslException { + if (saslToken == null) { + // TODO: introspect about runtime environment (such as jaas.conf) + saslState = SaslState.FAILED; + throw new SaslException("Error in authenticating with a Zookeeper Quorum member: the quorum member's saslToken is null."); + } + + Subject subject = login.getSubject(); + if (subject != null) { + synchronized(login) { + try { + final byte[] retval = + Subject.doAs(subject, new PrivilegedExceptionAction() { + public byte[] run() throws SaslException { + LOG.debug("saslClient.evaluateChallenge(len="+saslToken.length+")"); + return saslClient.evaluateChallenge(saslToken); + } + }); + return retval; + } + catch (PrivilegedActionException e) { + String error = "An error: (" + e + ") occurred when evaluating Zookeeper Quorum Member's " + + " received SASL token."; + // Try to provide hints to use about what went wrong so they can fix their configuration. + // TODO: introspect about e: look for GSS information. + final String UNKNOWN_SERVER_ERROR_TEXT = + "(Mechanism level: Server not found in Kerberos database (7) - UNKNOWN_SERVER)"; + if (e.toString().indexOf(UNKNOWN_SERVER_ERROR_TEXT) > -1) { + error += " This may be caused by Java's being unable to resolve the Zookeeper Quorum Member's" + + " hostname correctly. You may want to try to adding" + + " '-Dsun.net.spi.nameservice.provider.1=dns,sun' to your client's JVMFLAGS environment."; + } + error += " Zookeeper Client will go to AUTH_FAILED state."; + LOG.error(error); + saslState = SaslState.FAILED; + throw new SaslException(error); + } + } + } + else { + throw new SaslException("Cannot make SASL token without subject defined. " + + "For diagnosis, please look for WARNs and ERRORs in your log related to the Login class."); + } + } + + private void sendSaslPacket(byte[] saslToken, ClientCnxn cnxn) + throws SaslException{ + if (LOG.isDebugEnabled()) { + LOG.debug("ClientCnxn:sendSaslPacket:length="+saslToken.length); + } + + GetSASLRequest request = new GetSASLRequest(); + request.setToken(saslToken); + SetSASLResponse response = new SetSASLResponse(); + ServerSaslResponseCallback cb = new ServerSaslResponseCallback(); + + try { + cnxn.sendPacket(request,response,cb, ZooDefs.OpCode.sasl); + } catch (IOException e) { + throw new SaslException("Failed to send SASL packet to server.", + e); + } + } + + private void sendSaslPacket(ClientCnxn cnxn) throws SaslException { + if (LOG.isDebugEnabled()) { + LOG.debug("ClientCnxn:sendSaslPacket:length="+saslToken.length); + } + GetSASLRequest request = new GetSASLRequest(); + request.setToken(createSaslToken()); + SetSASLResponse response = new SetSASLResponse(); + ServerSaslResponseCallback cb = new ServerSaslResponseCallback(); + try { + cnxn.sendPacket(request,response,cb, ZooDefs.OpCode.sasl); + } catch (IOException e) { + throw new SaslException("Failed to send SASL packet to server due " + + "to IOException:", e); + } + } + + // used by ClientCnxn to know whether to emit a SASL-related event: either AuthFailed or SaslAuthenticated, + // or none, if not ready yet. Sets saslState to COMPLETE as a side-effect. + public KeeperState getKeeperState() { + if (saslClient != null) { + if (saslState == SaslState.FAILED) { + return KeeperState.AuthFailed; + } + if (saslClient.isComplete()) { + if (saslState == SaslState.INTERMEDIATE) { + saslState = SaslState.COMPLETE; + return KeeperState.SaslAuthenticated; + } + } + } + // No event ready to emit yet. + return null; + } + + // Initialize the client's communications with the Zookeeper server by sending the server the first + // authentication packet. + public void initialize(ClientCnxn cnxn) throws SaslException { + if (saslClient == null) { + saslState = SaslState.FAILED; + throw new SaslException("saslClient failed to initialize properly: it's null."); + } + if (saslState == SaslState.INITIAL) { + if (saslClient.hasInitialResponse()) { + sendSaslPacket(cnxn); + } + else { + byte[] emptyToken = new byte[0]; + sendSaslPacket(emptyToken, cnxn); + } + saslState = SaslState.INTERMEDIATE; + } + } + + // The CallbackHandler interface here refers to + // javax.security.auth.callback.CallbackHandler. + // It should not be confused with Zookeeper packet callbacks like + // org.apache.zookeeper.server.auth.SaslServerCallbackHandler. + public static class ClientCallbackHandler implements CallbackHandler { + private String password = null; + + public ClientCallbackHandler(String password) { + this.password = password; + } + + public void handle(Callback[] callbacks) throws + UnsupportedCallbackException { + for (Callback callback : callbacks) { + if (callback instanceof NameCallback) { + NameCallback nc = (NameCallback) callback; + nc.setName(nc.getDefaultName()); + } + else { + if (callback instanceof PasswordCallback) { + PasswordCallback pc = (PasswordCallback)callback; + if (password != null) { + pc.setPassword(this.password.toCharArray()); + } else { + LOG.warn("Could not login: the client is being asked for a password, but the Zookeeper" + + " client code does not currently support obtaining a password from the user." + + " Make sure that the client is configured to use a ticket cache (using" + + " the JAAS configuration setting 'useTicketCache=true)' and restart the client. If" + + " you still get this message after that, the TGT in the ticket cache has expired and must" + + " be manually refreshed. To do so, first determine if you are using a password or a" + + " keytab. If the former, run kinit in a Unix shell in the environment of the user who" + + " is running this Zookeeper client using the command" + + " 'kinit ' (where is the name of the client's Kerberos principal)." + + " If the latter, do" + + " 'kinit -k -t ' (where is the name of the Kerberos principal, and" + + " is the location of the keytab file). After manually refreshing your cache," + + " restart this client. If you continue to see this message after manually refreshing" + + " your cache, ensure that your KDC host's clock is in sync with this host's clock."); + } + } + else { + if (callback instanceof RealmCallback) { + RealmCallback rc = (RealmCallback) callback; + rc.setText(rc.getDefaultText()); + } + else { + if (callback instanceof AuthorizeCallback) { + AuthorizeCallback ac = (AuthorizeCallback) callback; + String authid = ac.getAuthenticationID(); + String authzid = ac.getAuthorizationID(); + if (authid.equals(authzid)) { + ac.setAuthorized(true); + } else { + ac.setAuthorized(false); + } + if (ac.isAuthorized()) { + ac.setAuthorizedID(authzid); + } + } + else { + throw new UnsupportedCallbackException(callback,"Unrecognized SASL ClientCallback"); + } + } + } + } + } + } + } + + public boolean clientTunneledAuthenticationInProgress() { + if (!isSASLConfigured) { + return false; + } + // TODO: Rather than checking a disjunction here, should be a single member + // variable or method in this class to determine whether the client is + // configured to use SASL. (see also ZOOKEEPER-1455). + try { + if ((System.getProperty(Environment.JAAS_CONF_KEY) != null) || + ((javax.security.auth.login.Configuration.getConfiguration() != null) && + (javax.security.auth.login.Configuration.getConfiguration(). + getAppConfigurationEntry(System. + getProperty(ZooKeeperSaslClient.LOGIN_CONTEXT_NAME_KEY,"Client")) + != null))) { + // Client is configured to use a valid login Configuration, so + // authentication is either in progress, successful, or failed. + + // 1. Authentication hasn't finished yet: we must wait for it to do so. + if ((isComplete() == false) && + (isFailed() == false)) { + return true; + } + + // 2. SASL authentication has succeeded or failed.. + if (isComplete() || isFailed()) { + if (gotLastPacket == false) { + // ..but still in progress, because there is a final SASL + // message from server which must be received. + return true; + } + } + } + // Either client is not configured to use a tunnelled authentication + // scheme, or tunnelled authentication has completed (successfully or + // not), and all server SASL messages have been received. + return false; + } catch (SecurityException e) { + // Thrown if the caller does not have permission to retrieve the Configuration. + // In this case, simply returning false is correct. + if (LOG.isDebugEnabled() == true) { + LOG.debug("Could not retrieve login configuration: " + e); + } + return false; + } + } + + +} diff --git a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/common/AtomicFileOutputStream.java b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/common/AtomicFileOutputStream.java new file mode 100644 index 000000000..ecfcad7c4 --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/common/AtomicFileOutputStream.java @@ -0,0 +1,115 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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. + */ +package org.apache.zookeeper.common; + +import java.io.File; +import java.io.FileNotFoundException; +import java.io.FileOutputStream; +import java.io.FilterOutputStream; +import java.io.IOException; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/* + * This code is originally from HDFS, see the similarly named files there + * in case of bug fixing, history, etc... + */ + +/** + * A FileOutputStream that has the property that it will only show up at its + * destination once it has been entirely written and flushed to disk. While + * being written, it will use a .tmp suffix. + * + * When the output stream is closed, it is flushed, fsynced, and will be moved + * into place, overwriting any file that already exists at that location. + * + * NOTE: on Windows platforms, it will not atomically replace the target + * file - instead the target file is deleted before this one is moved into + * place. + */ +public class AtomicFileOutputStream extends FilterOutputStream { + private static final String TMP_EXTENSION = ".tmp"; + + private final static Logger LOG = LoggerFactory + .getLogger(AtomicFileOutputStream.class); + + private final File origFile; + private final File tmpFile; + + public AtomicFileOutputStream(File f) throws FileNotFoundException { + // Code unfortunately must be duplicated below since we can't assign + // anything + // before calling super + super(new FileOutputStream(new File(f.getParentFile(), f.getName() + + TMP_EXTENSION))); + origFile = f.getAbsoluteFile(); + tmpFile = new File(f.getParentFile(), f.getName() + TMP_EXTENSION) + .getAbsoluteFile(); + } + + @Override + public void close() throws IOException { + boolean triedToClose = false, success = false; + try { + flush(); + ((FileOutputStream) out).getChannel().force(true); + + triedToClose = true; + super.close(); + success = true; + } finally { + if (success) { + boolean renamed = tmpFile.renameTo(origFile); + if (!renamed) { + // On windows, renameTo does not replace. + if (!origFile.delete() || !tmpFile.renameTo(origFile)) { + throw new IOException( + "Could not rename temporary file " + tmpFile + + " to " + origFile); + } + } + } else { + if (!triedToClose) { + // If we failed when flushing, try to close it to not leak + // an FD + IOUtils.closeStream(out); + } + // close wasn't successful, try to delete the tmp file + if (!tmpFile.delete()) { + LOG.warn("Unable to delete tmp file " + tmpFile); + } + } + } + } + + /** + * Close the atomic file, but do not "commit" the temporary file on top of + * the destination. This should be used if there is a failure in writing. + */ + public void abort() { + try { + super.close(); + } catch (IOException ioe) { + LOG.warn("Unable to abort file " + tmpFile, ioe); + } + if (!tmpFile.delete()) { + LOG.warn("Unable to delete tmp file during abort " + tmpFile); + } + } +} diff --git a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/common/IOUtils.java b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/common/IOUtils.java new file mode 100644 index 000000000..16aea4ea4 --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/common/IOUtils.java @@ -0,0 +1,123 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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. + */ +package org.apache.zookeeper.common; + +import java.io.Closeable; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.io.PrintStream; + +import org.slf4j.Logger; + +/* + * This code is originally from HDFS, see the similarly named files there + * in case of bug fixing, history, etc... + */ + +public class IOUtils { + /** + * Closes the stream ignoring {@link IOException}. Must only be called in + * cleaning up from exception handlers. + * + * @param stream + * the Stream to close + */ + public static void closeStream(Closeable stream) { + cleanup(null, stream); + } + + /** + * Close the Closeable objects and ignore any {@link IOException} or + * null pointers. Must only be used for cleanup in exception handlers. + * + * @param log + * the log to record problems to at debug level. Can be null. + * @param closeables + * the objects to close + */ + public static void cleanup(Logger log, Closeable... closeables) { + for (Closeable c : closeables) { + if (c != null) { + try { + c.close(); + } catch (IOException e) { + if (log != null) { + log.warn("Exception in closing " + c, e); + } + } + } + } + } + + /** + * Copies from one stream to another. + * + * @param in + * InputStrem to read from + * @param out + * OutputStream to write to + * @param buffSize + * the size of the buffer + * @param close + * whether or not close the InputStream and OutputStream at the + * end. The streams are closed in the finally clause. + */ + public static void copyBytes(InputStream in, OutputStream out, + int buffSize, boolean close) throws IOException { + try { + copyBytes(in, out, buffSize); + if (close) { + out.close(); + out = null; + in.close(); + in = null; + } + } finally { + if (close) { + closeStream(out); + closeStream(in); + } + } + } + + /** + * Copies from one stream to another. + * + * @param in + * InputStrem to read from + * @param out + * OutputStream to write to + * @param buffSize + * the size of the buffer + */ + public static void copyBytes(InputStream in, OutputStream out, int buffSize) + throws IOException { + PrintStream ps = out instanceof PrintStream ? (PrintStream) out : null; + byte buf[] = new byte[buffSize]; + int bytesRead = in.read(buf); + while (bytesRead >= 0) { + out.write(buf, 0, bytesRead); + if ((ps != null) && ps.checkError()) { + throw new IOException("Unable to write to output stream."); + } + bytesRead = in.read(buf); + } + } + +} diff --git a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/common/PathTrie.java b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/common/PathTrie.java new file mode 100644 index 000000000..73053e02c --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/common/PathTrie.java @@ -0,0 +1,293 @@ + /** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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. + */ + +package org.apache.zookeeper.common; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * a class that implements prefix matching for + * components of a filesystem path. the trie + * looks like a tree with edges mapping to + * the component of a path. + * example /ab/bc/cf would map to a trie + * / + * ab/ + * (ab) + * bc/ + * / + * (bc) + * cf/ + * (cf) + */ +public class PathTrie { + /** + * the logger for this class + */ + private static final Logger LOG = LoggerFactory.getLogger(PathTrie.class); + + /** + * the root node of PathTrie + */ + private final TrieNode rootNode ; + + static class TrieNode { + boolean property = false; + final HashMap children; + TrieNode parent = null; + /** + * create a trienode with parent + * as parameter + * @param parent the parent of this trienode + */ + private TrieNode(TrieNode parent) { + children = new HashMap(); + this.parent = parent; + } + + /** + * get the parent of this node + * @return the parent node + */ + TrieNode getParent() { + return this.parent; + } + + /** + * set the parent of this node + * @param parent the parent to set to + */ + void setParent(TrieNode parent) { + this.parent = parent; + } + + /** + * a property that is set + * for a node - making it + * special. + */ + void setProperty(boolean prop) { + this.property = prop; + } + + /** the property of this + * node + * @return the property for this + * node + */ + boolean getProperty() { + return this.property; + } + /** + * add a child to the existing node + * @param childName the string name of the child + * @param node the node that is the child + */ + void addChild(String childName, TrieNode node) { + synchronized(children) { + if (children.containsKey(childName)) { + return; + } + children.put(childName, node); + } + } + + /** + * delete child from this node + * @param childName the string name of the child to + * be deleted + */ + void deleteChild(String childName) { + synchronized(children) { + if (!children.containsKey(childName)) { + return; + } + TrieNode childNode = children.get(childName); + // this is the only child node. + if (childNode.getChildren().length == 1) { + childNode.setParent(null); + children.remove(childName); + } + else { + // their are more child nodes + // so just reset property. + childNode.setProperty(false); + } + } + } + + /** + * return the child of a node mapping + * to the input childname + * @param childName the name of the child + * @return the child of a node + */ + TrieNode getChild(String childName) { + synchronized(children) { + if (!children.containsKey(childName)) { + return null; + } + else { + return children.get(childName); + } + } + } + + /** + * get the list of children of this + * trienode. + * @param node to get its children + * @return the string list of its children + */ + String[] getChildren() { + synchronized(children) { + return children.keySet().toArray(new String[0]); + } + } + + /** + * get the string representation + * for this node + */ + public String toString() { + StringBuilder sb = new StringBuilder(); + sb.append("Children of trienode: "); + synchronized(children) { + for (String str: children.keySet()) { + sb.append(" " + str); + } + } + return sb.toString(); + } + } + + /** + * construct a new PathTrie with + * a root node of / + */ + public PathTrie() { + this.rootNode = new TrieNode(null); + } + + /** + * add a path to the path trie + * @param path + */ + public void addPath(String path) { + if (path == null) { + return; + } + String[] pathComponents = path.split("/"); + TrieNode parent = rootNode; + String part = null; + if (pathComponents.length <= 1) { + throw new IllegalArgumentException("Invalid path " + path); + } + for (int i=1; i components = new ArrayList(); + if (pathComponents.length <= 1) { + throw new IllegalArgumentException("Invalid path " + path); + } + int i = 1; + String part = null; + StringBuilder sb = new StringBuilder(); + int lastindex = -1; + while((i < pathComponents.length)) { + if (parent.getChild(pathComponents[i]) != null) { + part = pathComponents[i]; + parent = parent.getChild(part); + components.add(part); + if (parent.getProperty()) { + lastindex = i-1; + } + } + else { + break; + } + i++; + } + for (int j=0; j< (lastindex+1); j++) { + sb.append("/" + components.get(j)); + } + return sb.toString(); + } + + /** + * clear all nodes + */ + public void clear() { + for(String child : rootNode.getChildren()) { + rootNode.deleteChild(child); + } + } +} diff --git a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/common/PathUtils.java b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/common/PathUtils.java new file mode 100644 index 000000000..12a68142b --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/common/PathUtils.java @@ -0,0 +1,103 @@ + /** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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. + */ + +package org.apache.zookeeper.common; + + +/** + * Path related utilities + */ +public class PathUtils { + + /** validate the provided znode path string + * @param path znode path string + * @param isSequential if the path is being created + * with a sequential flag + * @throws IllegalArgumentException if the path is invalid + */ + public static void validatePath(String path, boolean isSequential) + throws IllegalArgumentException { + validatePath(isSequential? path + "1": path); + } + + /** + * Validate the provided znode path string + * @param path znode path string + * @throws IllegalArgumentException if the path is invalid + */ + public static void validatePath(String path) throws IllegalArgumentException { + if (path == null) { + throw new IllegalArgumentException("Path cannot be null"); + } + if (path.length() == 0) { + throw new IllegalArgumentException("Path length must be > 0"); + } + if (path.charAt(0) != '/') { + throw new IllegalArgumentException( + "Path must start with / character"); + } + if (path.length() == 1) { // done checking - it's the root + return; + } + if (path.charAt(path.length() - 1) == '/') { + throw new IllegalArgumentException( + "Path must not end with / character"); + } + + String reason = null; + char lastc = '/'; + char chars[] = path.toCharArray(); + char c; + for (int i = 1; i < chars.length; lastc = chars[i], i++) { + c = chars[i]; + + if (c == 0) { + reason = "null character not allowed @" + i; + break; + } else if (c == '/' && lastc == '/') { + reason = "empty node name specified @" + i; + break; + } else if (c == '.' && lastc == '.') { + if (chars[i-2] == '/' && + ((i + 1 == chars.length) + || chars[i+1] == '/')) { + reason = "relative paths not allowed @" + i; + break; + } + } else if (c == '.') { + if (chars[i-1] == '/' && + ((i + 1 == chars.length) + || chars[i+1] == '/')) { + reason = "relative paths not allowed @" + i; + break; + } + } else if (c > '\u0000' && c < '\u001f' + || c > '\u007f' && c < '\u009F' + || c > '\ud800' && c < '\uf8ff' + || c > '\ufff0' && c < '\uffff') { + reason = "invalid charater @" + i; + break; + } + } + + if (reason != null) { + throw new IllegalArgumentException( + "Invalid path string \"" + path + "\" caused by " + reason); + } + } +} diff --git a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/jmx/CommonNames.java b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/jmx/CommonNames.java new file mode 100644 index 000000000..986d69dd7 --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/jmx/CommonNames.java @@ -0,0 +1,29 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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. + */ + +package org.apache.zookeeper.jmx; + +/** + * A bunch of constants. + * TODO: will get rid of it eventually. + */ +public class CommonNames { + public static final String DOMAIN="org.apache.ZooKeeperService"; + public static final String DATA_TREE_KEY="DataTree"; + public static final String STANDALONE_SERVER_KEY="StandaloneServer"; +} diff --git a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/jmx/MBeanRegistry.java b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/jmx/MBeanRegistry.java new file mode 100644 index 000000000..895b81864 --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/jmx/MBeanRegistry.java @@ -0,0 +1,215 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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. + */ + +package org.apache.zookeeper.jmx; + +import java.lang.management.ManagementFactory; +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; + +import javax.management.JMException; +import javax.management.MBeanServer; +import javax.management.MBeanServerFactory; +import javax.management.MalformedObjectNameException; +import javax.management.ObjectName; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * This class provides a unified interface for registering/unregistering of + * zookeeper MBeans with the platform MBean server. It builds a hierarchy of MBeans + * where each MBean represented by a filesystem-like path. Eventually, this hierarchy + * will be stored in the zookeeper data tree instance as a virtual data tree. + */ +public class MBeanRegistry { + private static final Logger LOG = LoggerFactory.getLogger(MBeanRegistry.class); + + private static MBeanRegistry instance = new MBeanRegistry(); + + private Map mapBean2Path = + new ConcurrentHashMap(); + + private Map mapName2Bean = + new ConcurrentHashMap(); + + private MBeanServer mBeanServer; + + public static MBeanRegistry getInstance() { + return instance; + } + + public MBeanRegistry () { + try { + mBeanServer = ManagementFactory.getPlatformMBeanServer(); + } catch (Error e) { + // Account for running within IKVM and create a new MBeanServer + // if the PlatformMBeanServer does not exist. + mBeanServer = MBeanServerFactory.createMBeanServer(); + } + } + + /** + * Return the underlying MBeanServer that is being + * used to register MBean's. The returned MBeanServer + * may be a new empty MBeanServer if running through IKVM. + */ + public MBeanServer getPlatformMBeanServer() { + return mBeanServer; + } + + /** + * Registers a new MBean with the platform MBean server. + * @param bean the bean being registered + * @param parent if not null, the new bean will be registered as a child + * node of this parent. + */ + public void register(ZKMBeanInfo bean, ZKMBeanInfo parent) + throws JMException + { + assert bean != null; + String path = null; + if (parent != null) { + path = mapBean2Path.get(parent); + assert path != null; + } + path = makeFullPath(path, parent); + if(bean.isHidden()) + return; + ObjectName oname = makeObjectName(path, bean); + try { + mBeanServer.registerMBean(bean, oname); + mapBean2Path.put(bean, path); + mapName2Bean.put(bean.getName(), bean); + } catch (JMException e) { + LOG.warn("Failed to register MBean " + bean.getName()); + throw e; + } + } + + /** + * Unregister the MBean identified by the path. + * @param path + * @param bean + */ + private void unregister(String path,ZKMBeanInfo bean) throws JMException { + if(path==null) + return; + if (!bean.isHidden()) { + try { + mBeanServer.unregisterMBean(makeObjectName(path, bean)); + } catch (JMException e) { + LOG.warn("Failed to unregister MBean " + bean.getName()); + throw e; + } + } + } + + /** + * Unregister MBean. + * @param bean + */ + public void unregister(ZKMBeanInfo bean) { + if(bean==null) + return; + String path=mapBean2Path.get(bean); + try { + unregister(path,bean); + } catch (JMException e) { + LOG.warn("Error during unregister", e); + } + mapBean2Path.remove(bean); + mapName2Bean.remove(bean.getName()); + } + /** + * Unregister all currently registered MBeans + */ + public void unregisterAll() { + for(Map.Entry e: mapBean2Path.entrySet()) { + try { + unregister(e.getValue(), e.getKey()); + } catch (JMException e1) { + LOG.warn("Error during unregister", e1); + } + } + mapBean2Path.clear(); + mapName2Bean.clear(); + } + /** + * Generate a filesystem-like path. + * @param prefix path prefix + * @param name path elements + * @return absolute path + */ + public String makeFullPath(String prefix, String... name) { + StringBuilder sb=new StringBuilder(prefix == null ? "/" : (prefix.equals("/")?prefix:prefix+"/")); + boolean first=true; + for (String s : name) { + if(s==null) continue; + if(!first){ + sb.append("/"); + }else + first=false; + sb.append(s); + } + return sb.toString(); + } + + protected String makeFullPath(String prefix, ZKMBeanInfo bean) { + return makeFullPath(prefix, bean == null ? null : bean.getName()); + } + + /** + * This takes a path, such as /a/b/c, and converts it to + * name0=a,name1=b,name2=c + */ + private int tokenize(StringBuilder sb, String path, int index){ + String[] tokens = path.split("/"); + for (String s: tokens) { + if (s.length()==0) + continue; + sb.append("name").append(index++) + .append("=").append(s).append(","); + } + return index; + } + /** + * Builds an MBean path and creates an ObjectName instance using the path. + * @param path MBean path + * @param bean the MBean instance + * @return ObjectName to be registered with the platform MBean server + */ + protected ObjectName makeObjectName(String path, ZKMBeanInfo bean) + throws MalformedObjectNameException + { + if(path==null) + return null; + StringBuilder beanName = new StringBuilder(CommonNames.DOMAIN + ":"); + int counter=0; + counter=tokenize(beanName,path,counter); + tokenize(beanName,bean.getName(),counter); + beanName.deleteCharAt(beanName.length()-1); + try { + return new ObjectName(beanName.toString()); + } catch (MalformedObjectNameException e) { + LOG.warn("Invalid name \"" + beanName.toString() + "\" for class " + + bean.getClass().toString()); + throw e; + } + } +} diff --git a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/jmx/ManagedUtil.java b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/jmx/ManagedUtil.java new file mode 100644 index 000000000..64e1942bd --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/jmx/ManagedUtil.java @@ -0,0 +1,71 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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. + */ + +package org.apache.zookeeper.jmx; + +import java.util.Enumeration; + +import javax.management.JMException; +import javax.management.MBeanServer; +import javax.management.ObjectName; + +import org.apache.log4j.LogManager; +import org.apache.log4j.Logger; +import org.apache.log4j.jmx.HierarchyDynamicMBean; +import org.apache.log4j.spi.LoggerRepository; + +/** + * Shared utilities + */ +public class ManagedUtil { + /** + * Register the log4j JMX mbeans. Set environment variable + * "zookeeper.jmx.log4j.disable" to true to disable registration. + * @see http://logging.apache.org/log4j/1.2/apidocs/index.html?org/apache/log4j/jmx/package-summary.html + * @throws JMException if registration fails + */ + public static void registerLog4jMBeans() throws JMException { + if (Boolean.getBoolean("zookeeper.jmx.log4j.disable") == true) { + return; + } + + MBeanServer mbs = MBeanRegistry.getInstance().getPlatformMBeanServer(); + + // Create and Register the top level Log4J MBean + HierarchyDynamicMBean hdm = new HierarchyDynamicMBean(); + + ObjectName mbo = new ObjectName("log4j:hiearchy=default"); + mbs.registerMBean(hdm, mbo); + + // Add the root logger to the Hierarchy MBean + Logger rootLogger = Logger.getRootLogger(); + hdm.addLoggerMBean(rootLogger.getName()); + + // Get each logger from the Log4J Repository and add it to + // the Hierarchy MBean created above. + LoggerRepository r = LogManager.getLoggerRepository(); + Enumeration enumer = r.getCurrentLoggers(); + Logger logger = null; + + while (enumer.hasMoreElements()) { + logger = (Logger) enumer.nextElement(); + hdm.addLoggerMBean(logger.getName()); + } + } + +} diff --git a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/jmx/ZKMBeanInfo.java b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/jmx/ZKMBeanInfo.java new file mode 100644 index 000000000..1e87d92e1 --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/jmx/ZKMBeanInfo.java @@ -0,0 +1,36 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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. + */ + +package org.apache.zookeeper.jmx; + +/** + * Zookeeper MBean info interface. MBeanRegistry uses the interface to generate + * JMX object name. + */ +public interface ZKMBeanInfo { + /** + * @return a string identifying the MBean + */ + public String getName(); + /** + * If isHidden returns true, the MBean won't be registered with MBean server, + * and thus won't be available for management tools. Used for grouping MBeans. + * @return true if the MBean is hidden. + */ + public boolean isHidden(); +} diff --git a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/ByteBufferInputStream.java b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/ByteBufferInputStream.java new file mode 100644 index 000000000..e5ac120ac --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/ByteBufferInputStream.java @@ -0,0 +1,82 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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. + */ + +package org.apache.zookeeper.server; + +import java.io.IOException; +import java.io.InputStream; +import java.nio.ByteBuffer; + +import org.apache.jute.BinaryInputArchive; +import org.apache.jute.Record; + +public class ByteBufferInputStream extends InputStream { + ByteBuffer bb; + + public ByteBufferInputStream(ByteBuffer bb) { + this.bb = bb; + } + + @Override + public int read() throws IOException { + if (bb.remaining() == 0) { + return -1; + } + return bb.get() & 0xff; + } + + @Override + public int available() throws IOException { + return bb.remaining(); + } + + @Override + public int read(byte[] b, int off, int len) throws IOException { + if (bb.remaining() == 0) { + return -1; + } + if (len > bb.remaining()) { + len = bb.remaining(); + } + bb.get(b, off, len); + return len; + } + + @Override + public int read(byte[] b) throws IOException { + return read(b, 0, b.length); + } + + @Override + public long skip(long n) throws IOException { + long newPos = bb.position() + n; + if (newPos > bb.remaining()) { + n = bb.remaining(); + } + bb.position(bb.position() + (int) n); + return n; + } + + static public void byteBuffer2Record(ByteBuffer bb, Record record) + throws IOException { + BinaryInputArchive ia; + ia = BinaryInputArchive.getArchive(new ByteBufferInputStream(bb)); + record.deserialize(ia, "request"); + } + +} diff --git a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/ByteBufferOutputStream.java b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/ByteBufferOutputStream.java new file mode 100644 index 000000000..a2fcc956b --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/ByteBufferOutputStream.java @@ -0,0 +1,52 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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. + */ + +package org.apache.zookeeper.server; + +import java.io.IOException; +import java.io.OutputStream; +import java.nio.ByteBuffer; + +import org.apache.jute.BinaryInputArchive; +import org.apache.jute.BinaryOutputArchive; +import org.apache.jute.Record; + +public class ByteBufferOutputStream extends OutputStream { + ByteBuffer bb; + public ByteBufferOutputStream(ByteBuffer bb) { + this.bb = bb; + } + @Override + public void write(int b) throws IOException { + bb.put((byte)b); + } + @Override + public void write(byte[] b) throws IOException { + bb.put(b); + } + @Override + public void write(byte[] b, int off, int len) throws IOException { + bb.put(b, off, len); + } + static public void record2ByteBuffer(Record record, ByteBuffer bb) + throws IOException { + BinaryOutputArchive oa; + oa = BinaryOutputArchive.getArchive(new ByteBufferOutputStream(bb)); + record.serialize(oa, "request"); + } +} diff --git a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/ConnectionBean.java b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/ConnectionBean.java new file mode 100644 index 000000000..917aacfdc --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/ConnectionBean.java @@ -0,0 +1,173 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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. + */ + +package org.apache.zookeeper.server; + +import java.net.Inet6Address; +import java.net.InetAddress; +import java.net.InetSocketAddress; +import java.util.Arrays; +import java.util.Date; + +import javax.management.ObjectName; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.apache.zookeeper.jmx.MBeanRegistry; +import org.apache.zookeeper.jmx.ZKMBeanInfo; + +/** + * Implementation of connection MBean interface. + */ +public class ConnectionBean implements ConnectionMXBean, ZKMBeanInfo { + private static final Logger LOG = LoggerFactory.getLogger(ConnectionBean.class); + + private final ServerCnxn connection; + private final Stats stats; + + private final ZooKeeperServer zk; + + private final String remoteIP; + private final long sessionId; + + public ConnectionBean(ServerCnxn connection,ZooKeeperServer zk){ + this.connection = connection; + this.stats = connection; + this.zk = zk; + + InetSocketAddress sockAddr = connection.getRemoteSocketAddress(); + if (sockAddr == null) { + remoteIP = "Unknown"; + } else { + InetAddress addr = sockAddr.getAddress(); + if (addr instanceof Inet6Address) { + remoteIP = ObjectName.quote(addr.getHostAddress()); + } else { + remoteIP = addr.getHostAddress(); + } + } + sessionId = connection.getSessionId(); + } + + public String getSessionId() { + return "0x" + Long.toHexString(sessionId); + } + + public String getSourceIP() { + InetSocketAddress sockAddr = connection.getRemoteSocketAddress(); + if (sockAddr == null) { + return null; + } + return sockAddr.getAddress().getHostAddress() + + ":" + sockAddr.getPort(); + } + + public String getName() { + return MBeanRegistry.getInstance().makeFullPath("Connections", remoteIP, + getSessionId()); + } + + public boolean isHidden() { + return false; + } + + public String[] getEphemeralNodes() { + if(zk.getZKDatabase() !=null){ + String[] res = zk.getZKDatabase().getEphemerals(sessionId) + .toArray(new String[0]); + Arrays.sort(res); + return res; + } + return null; + } + + public String getStartedTime() { + return stats.getEstablished().toString(); + } + + public void terminateSession() { + try { + zk.closeSession(sessionId); + } catch (Exception e) { + LOG.warn("Unable to closeSession() for session: 0x" + + getSessionId(), e); + } + } + + public void terminateConnection() { + connection.sendCloseSession(); + } + + public void resetCounters() { + stats.resetStats(); + } + + @Override + public String toString() { + return "ConnectionBean{ClientIP=" + ObjectName.quote(getSourceIP()) + + ",SessionId=0x" + getSessionId() + "}"; + } + + public long getOutstandingRequests() { + return stats.getOutstandingRequests(); + } + + public long getPacketsReceived() { + return stats.getPacketsReceived(); + } + + public long getPacketsSent() { + return stats.getPacketsSent(); + } + + public int getSessionTimeout() { + return connection.getSessionTimeout(); + } + + public long getMinLatency() { + return stats.getMinLatency(); + } + + public long getAvgLatency() { + return stats.getAvgLatency(); + } + + public long getMaxLatency() { + return stats.getMaxLatency(); + } + + public String getLastOperation() { + return stats.getLastOperation(); + } + + public String getLastCxid() { + return "0x" + Long.toHexString(stats.getLastCxid()); + } + + public String getLastZxid() { + return "0x" + Long.toHexString(stats.getLastZxid()); + } + + public String getLastResponseTime() { + return new Date(stats.getLastResponseTime()).toString(); + } + + public long getLastLatency() { + return stats.getLastLatency(); + } +} diff --git a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/ConnectionMXBean.java b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/ConnectionMXBean.java new file mode 100644 index 000000000..8bdec9a02 --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/ConnectionMXBean.java @@ -0,0 +1,98 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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. + */ + +package org.apache.zookeeper.server; + +/** + * This MBean represents a client connection. + */ +public interface ConnectionMXBean { + /** + * @return source (client) IP address + */ + public String getSourceIP(); + /** + * @return client's session id + */ + public String getSessionId(); + /** + * @return time the connection was started + */ + public String getStartedTime(); + /** + * @return number of ephemeral nodes owned by this connection + */ + public String[] getEphemeralNodes(); + /** + * @return packets received from this client + */ + public long getPacketsReceived(); + /** + * @return number of packets sent to this client + */ + public long getPacketsSent(); + /** + * @return number of requets being processed + */ + public long getOutstandingRequests(); + /** + * @return session timeout in ms + */ + public int getSessionTimeout(); + + /** + * Terminate this client session. The client will reconnect with a different + * session id. + */ + public void terminateSession(); + /** + * Terminate thei client connection. The client will immediately attempt to + * reconnect with the same session id. + */ + public void terminateConnection(); + + + /** Min latency in ms + * @since 3.3.0 */ + long getMinLatency(); + /** Average latency in ms + * @since 3.3.0 */ + long getAvgLatency(); + /** Max latency in ms + * @since 3.3.0 */ + long getMaxLatency(); + /** Last operation performed by this connection + * @since 3.3.0 */ + String getLastOperation(); + /** Last cxid of this connection + * @since 3.3.0 */ + String getLastCxid(); + /** Last zxid of this connection + * @since 3.3.0 */ + String getLastZxid(); + /** Last time server sent a response to client on this connection + * @since 3.3.0 */ + String getLastResponseTime(); + /** Latency of last response to client on this connection in ms + * @since 3.3.0 */ + long getLastLatency(); + + /** Reset counters + * @since 3.3.0 */ + void resetCounters(); +} diff --git a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/DataNode.java b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/DataNode.java new file mode 100644 index 000000000..9498204fc --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/DataNode.java @@ -0,0 +1,173 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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. + */ + +package org.apache.zookeeper.server; + +import java.io.IOException; +import java.util.HashSet; +import java.util.Set; + +import org.apache.jute.InputArchive; +import org.apache.jute.OutputArchive; +import org.apache.jute.Record; +import org.apache.zookeeper.data.Stat; +import org.apache.zookeeper.data.StatPersisted; + +/** + * This class contains the data for a node in the data tree. + *

      + * A data node contains a reference to its parent, a byte array as its data, an + * array of ACLs, a stat object, and a set of its children's paths. + * + */ +public class DataNode implements Record { + /** the parent of this datanode */ + DataNode parent; + + /** the data for this datanode */ + byte data[]; + + /** + * the acl map long for this datanode. the datatree has the map + */ + Long acl; + + /** + * the stat for this node that is persisted to disk. + */ + public StatPersisted stat; + + /** + * the list of children for this node. note that the list of children string + * does not contain the parent path -- just the last part of the path. This + * should be synchronized on except deserializing (for speed up issues). + */ + private Set children = null; + + /** + * default constructor for the datanode + */ + DataNode() { + // default constructor + } + + /** + * create a DataNode with parent, data, acls and stat + * + * @param parent + * the parent of this DataNode + * @param data + * the data to be set + * @param acl + * the acls for this node + * @param stat + * the stat for this node. + */ + public DataNode(DataNode parent, byte data[], Long acl, StatPersisted stat) { + this.parent = parent; + this.data = data; + this.acl = acl; + this.stat = stat; + } + + /** + * Method that inserts a child into the children set + * + * @param child + * to be inserted + * @return true if this set did not already contain the specified element + */ + public synchronized boolean addChild(String child) { + if (children == null) { + // let's be conservative on the typical number of children + children = new HashSet(8); + } + return children.add(child); + } + + /** + * Method that removes a child from the children set + * + * @param child + * @return true if this set contained the specified element + */ + public synchronized boolean removeChild(String child) { + if (children == null) { + return false; + } + return children.remove(child); + } + + /** + * convenience method for setting the children for this datanode + * + * @param children + */ + public synchronized void setChildren(HashSet children) { + this.children = children; + } + + /** + * convenience methods to get the children + * + * @return the children of this datanode + */ + public synchronized Set getChildren() { + return children; + } + + synchronized public void copyStat(Stat to) { + to.setAversion(stat.getAversion()); + to.setCtime(stat.getCtime()); + to.setCzxid(stat.getCzxid()); + to.setMtime(stat.getMtime()); + to.setMzxid(stat.getMzxid()); + to.setPzxid(stat.getPzxid()); + to.setVersion(stat.getVersion()); + to.setEphemeralOwner(stat.getEphemeralOwner()); + to.setDataLength(data == null ? 0 : data.length); + int numChildren = 0; + if (this.children != null) { + numChildren = children.size(); + } + // when we do the Cversion we need to translate from the count of the creates + // to the count of the changes (v3 semantics) + // for every create there is a delete except for the children still present + to.setCversion(stat.getCversion()*2 - numChildren); + to.setNumChildren(numChildren); + } + + synchronized public void deserialize(InputArchive archive, String tag) + throws IOException { + archive.startRecord("node"); + data = archive.readBuffer("data"); + acl = archive.readLong("acl"); + stat = new StatPersisted(); + stat.deserialize(archive, "statpersisted"); + archive.endRecord("node"); + } + + synchronized public void serialize(OutputArchive archive, String tag) + throws IOException { + archive.startRecord(this, "node"); + archive.writeBuffer(data, "data"); + archive.writeLong(acl, "acl"); + stat.serialize(archive, "statpersisted"); + archive.endRecord(this, "node"); + } +} diff --git a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/DataTree.java b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/DataTree.java new file mode 100644 index 000000000..363b256b6 --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/DataTree.java @@ -0,0 +1,1350 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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. + */ + +package org.apache.zookeeper.server; + +import java.io.IOException; +import java.io.PrintWriter; +import java.nio.ByteBuffer; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collection; +import java.util.HashMap; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.concurrent.ConcurrentHashMap; + +import org.apache.jute.Index; +import org.apache.jute.InputArchive; +import org.apache.jute.OutputArchive; +import org.apache.jute.Record; +import org.apache.zookeeper.KeeperException; +import org.apache.zookeeper.KeeperException.Code; +import org.apache.zookeeper.KeeperException.NoNodeException; +import org.apache.zookeeper.Quotas; +import org.apache.zookeeper.StatsTrack; +import org.apache.zookeeper.WatchedEvent; +import org.apache.zookeeper.Watcher; +import org.apache.zookeeper.Watcher.Event; +import org.apache.zookeeper.Watcher.Event.EventType; +import org.apache.zookeeper.Watcher.Event.KeeperState; +import org.apache.zookeeper.ZooDefs.Ids; +import org.apache.zookeeper.ZooDefs.OpCode; +import org.apache.zookeeper.common.PathTrie; +import org.apache.zookeeper.data.ACL; +import org.apache.zookeeper.data.Stat; +import org.apache.zookeeper.data.StatPersisted; +import org.apache.zookeeper.txn.CheckVersionTxn; +import org.apache.zookeeper.txn.CreateTxn; +import org.apache.zookeeper.txn.DeleteTxn; +import org.apache.zookeeper.txn.ErrorTxn; +import org.apache.zookeeper.txn.MultiTxn; +import org.apache.zookeeper.txn.SetACLTxn; +import org.apache.zookeeper.txn.SetDataTxn; +import org.apache.zookeeper.txn.Txn; +import org.apache.zookeeper.txn.TxnHeader; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * This class maintains the tree data structure. It doesn't have any networking + * or client connection code in it so that it can be tested in a stand alone + * way. + *

      + * The tree maintains two parallel data structures: a hashtable that maps from + * full paths to DataNodes and a tree of DataNodes. All accesses to a path is + * through the hashtable. The tree is traversed only when serializing to disk. + */ +public class DataTree { + private static final Logger LOG = LoggerFactory.getLogger(DataTree.class); + + /** + * This hashtable provides a fast lookup to the datanodes. The tree is the + * source of truth and is where all the locking occurs + */ + private final ConcurrentHashMap nodes = + new ConcurrentHashMap(); + + private final WatchManager dataWatches = new WatchManager(); + + private final WatchManager childWatches = new WatchManager(); + + /** the root of zookeeper tree */ + private static final String rootZookeeper = "/"; + + /** the zookeeper nodes that acts as the management and status node **/ + private static final String procZookeeper = Quotas.procZookeeper; + + /** this will be the string thats stored as a child of root */ + private static final String procChildZookeeper = procZookeeper.substring(1); + + /** + * the zookeeper quota node that acts as the quota management node for + * zookeeper + */ + private static final String quotaZookeeper = Quotas.quotaZookeeper; + + /** this will be the string thats stored as a child of /zookeeper */ + private static final String quotaChildZookeeper = quotaZookeeper + .substring(procZookeeper.length() + 1); + + /** + * the path trie that keeps track fo the quota nodes in this datatree + */ + private final PathTrie pTrie = new PathTrie(); + + /** + * This hashtable lists the paths of the ephemeral nodes of a session. + */ + private final Map> ephemerals = + new ConcurrentHashMap>(); + + /** + * this is map from longs to acl's. It saves acl's being stored for each + * datanode. + */ + public final Map> longKeyMap = + new HashMap>(); + + /** + * this a map from acls to long. + */ + public final Map, Long> aclKeyMap = + new HashMap, Long>(); + + /** + * these are the number of acls that we have in the datatree + */ + protected long aclIndex = 0; + + @SuppressWarnings("unchecked") + public HashSet getEphemerals(long sessionId) { + HashSet retv = ephemerals.get(sessionId); + if (retv == null) { + return new HashSet(); + } + HashSet cloned = null; + synchronized (retv) { + cloned = (HashSet) retv.clone(); + } + return cloned; + } + + public Map> getEphemeralsMap() { + return ephemerals; + } + + private long incrementIndex() { + return ++aclIndex; + } + + /** + * compare two list of acls. if there elements are in the same order and the + * same size then return true else return false + * + * @param lista + * the list to be compared + * @param listb + * the list to be compared + * @return true if and only if the lists are of the same size and the + * elements are in the same order in lista and listb + */ + private boolean listACLEquals(List lista, List listb) { + if (lista.size() != listb.size()) { + return false; + } + for (int i = 0; i < lista.size(); i++) { + ACL a = lista.get(i); + ACL b = listb.get(i); + if (!a.equals(b)) { + return false; + } + } + return true; + } + + /** + * converts the list of acls to a list of longs. + * + * @param acls + * @return a list of longs that map to the acls + */ + public synchronized Long convertAcls(List acls) { + if (acls == null) + return -1L; + // get the value from the map + Long ret = aclKeyMap.get(acls); + // could not find the map + if (ret != null) + return ret; + long val = incrementIndex(); + longKeyMap.put(val, acls); + aclKeyMap.put(acls, val); + return val; + } + + /** + * converts a list of longs to a list of acls. + * + * @param longVal + * the list of longs + * @return a list of ACLs that map to longs + */ + public synchronized List convertLong(Long longVal) { + if (longVal == null) + return null; + if (longVal == -1L) + return Ids.OPEN_ACL_UNSAFE; + List acls = longKeyMap.get(longVal); + if (acls == null) { + LOG.error("ERROR: ACL not available for long " + longVal); + throw new RuntimeException("Failed to fetch acls for " + longVal); + } + return acls; + } + + public Collection getSessions() { + return ephemerals.keySet(); + } + + /** + * just an accessor method to allow raw creation of datatree's from a bunch + * of datanodes + * + * @param path + * the path of the datanode + * @param node + * the datanode corresponding to this path + */ + public void addDataNode(String path, DataNode node) { + nodes.put(path, node); + } + + public DataNode getNode(String path) { + return nodes.get(path); + } + + public int getNodeCount() { + return nodes.size(); + } + + public int getWatchCount() { + return dataWatches.size() + childWatches.size(); + } + + public int getEphemeralsCount() { + Map> map = this.getEphemeralsMap(); + int result = 0; + for (HashSet set : map.values()) { + result += set.size(); + } + return result; + } + + /** + * Get the size of the nodes based on path and data length. + * + * @return size of the data + */ + public long approximateDataSize() { + long result = 0; + for (Map.Entry entry : nodes.entrySet()) { + DataNode value = entry.getValue(); + synchronized (value) { + result += entry.getKey().length(); + result += (value.data == null ? 0 + : value.data.length); + } + } + return result; + } + + /** + * This is a pointer to the root of the DataTree. It is the source of truth, + * but we usually use the nodes hashmap to find nodes in the tree. + */ + private DataNode root = new DataNode(null, new byte[0], -1L, + new StatPersisted()); + + /** + * create a /zookeeper filesystem that is the proc filesystem of zookeeper + */ + private DataNode procDataNode = new DataNode(root, new byte[0], -1L, + new StatPersisted()); + + /** + * create a /zookeeper/quota node for maintaining quota properties for + * zookeeper + */ + private DataNode quotaDataNode = new DataNode(procDataNode, new byte[0], + -1L, new StatPersisted()); + + public DataTree() { + /* Rather than fight it, let root have an alias */ + nodes.put("", root); + nodes.put(rootZookeeper, root); + + /** add the proc node and quota node */ + root.addChild(procChildZookeeper); + nodes.put(procZookeeper, procDataNode); + + procDataNode.addChild(quotaChildZookeeper); + nodes.put(quotaZookeeper, quotaDataNode); + } + + /** + * is the path one of the special paths owned by zookeeper. + * + * @param path + * the path to be checked + * @return true if a special path. false if not. + */ + boolean isSpecialPath(String path) { + if (rootZookeeper.equals(path) || procZookeeper.equals(path) + || quotaZookeeper.equals(path)) { + return true; + } + return false; + } + + static public void copyStatPersisted(StatPersisted from, StatPersisted to) { + to.setAversion(from.getAversion()); + to.setCtime(from.getCtime()); + to.setCversion(from.getCversion()); + to.setCzxid(from.getCzxid()); + to.setMtime(from.getMtime()); + to.setMzxid(from.getMzxid()); + to.setPzxid(from.getPzxid()); + to.setVersion(from.getVersion()); + to.setEphemeralOwner(from.getEphemeralOwner()); + } + + static public void copyStat(Stat from, Stat to) { + to.setAversion(from.getAversion()); + to.setCtime(from.getCtime()); + to.setCversion(from.getCversion()); + to.setCzxid(from.getCzxid()); + to.setMtime(from.getMtime()); + to.setMzxid(from.getMzxid()); + to.setPzxid(from.getPzxid()); + to.setVersion(from.getVersion()); + to.setEphemeralOwner(from.getEphemeralOwner()); + to.setDataLength(from.getDataLength()); + to.setNumChildren(from.getNumChildren()); + } + + /** + * update the count of this stat datanode + * + * @param lastPrefix + * the path of the node that is quotaed. + * @param diff + * the diff to be added to the count + */ + public void updateCount(String lastPrefix, int diff) { + String statNode = Quotas.statPath(lastPrefix); + DataNode node = nodes.get(statNode); + StatsTrack updatedStat = null; + if (node == null) { + // should not happen + LOG.error("Missing count node for stat " + statNode); + return; + } + synchronized (node) { + updatedStat = new StatsTrack(new String(node.data)); + updatedStat.setCount(updatedStat.getCount() + diff); + node.data = updatedStat.toString().getBytes(); + } + // now check if the counts match the quota + String quotaNode = Quotas.quotaPath(lastPrefix); + node = nodes.get(quotaNode); + StatsTrack thisStats = null; + if (node == null) { + // should not happen + LOG.error("Missing count node for quota " + quotaNode); + return; + } + synchronized (node) { + thisStats = new StatsTrack(new String(node.data)); + } + if (thisStats.getCount() > -1 && (thisStats.getCount() < updatedStat.getCount())) { + LOG + .warn("Quota exceeded: " + lastPrefix + " count=" + + updatedStat.getCount() + " limit=" + + thisStats.getCount()); + } + } + + /** + * update the count of bytes of this stat datanode + * + * @param lastPrefix + * the path of the node that is quotaed + * @param diff + * the diff to added to number of bytes + * @throws IOException + * if path is not found + */ + public void updateBytes(String lastPrefix, long diff) { + String statNode = Quotas.statPath(lastPrefix); + DataNode node = nodes.get(statNode); + if (node == null) { + // should never be null but just to make + // findbugs happy + LOG.error("Missing stat node for bytes " + statNode); + return; + } + StatsTrack updatedStat = null; + synchronized (node) { + updatedStat = new StatsTrack(new String(node.data)); + updatedStat.setBytes(updatedStat.getBytes() + diff); + node.data = updatedStat.toString().getBytes(); + } + // now check if the bytes match the quota + String quotaNode = Quotas.quotaPath(lastPrefix); + node = nodes.get(quotaNode); + if (node == null) { + // should never be null but just to make + // findbugs happy + LOG.error("Missing quota node for bytes " + quotaNode); + return; + } + StatsTrack thisStats = null; + synchronized (node) { + thisStats = new StatsTrack(new String(node.data)); + } + if (thisStats.getBytes() > -1 && (thisStats.getBytes() < updatedStat.getBytes())) { + LOG + .warn("Quota exceeded: " + lastPrefix + " bytes=" + + updatedStat.getBytes() + " limit=" + + thisStats.getBytes()); + } + } + + /** + * @param path + * @param data + * @param acl + * @param ephemeralOwner + * the session id that owns this node. -1 indicates this is not + * an ephemeral node. + * @param zxid + * @param time + * @return the patch of the created node + * @throws KeeperException + */ + public String createNode(String path, byte data[], List acl, + long ephemeralOwner, int parentCVersion, long zxid, long time) + throws KeeperException.NoNodeException, + KeeperException.NodeExistsException { + int lastSlash = path.lastIndexOf('/'); + String parentName = path.substring(0, lastSlash); + String childName = path.substring(lastSlash + 1); + StatPersisted stat = new StatPersisted(); + stat.setCtime(time); + stat.setMtime(time); + stat.setCzxid(zxid); + stat.setMzxid(zxid); + stat.setPzxid(zxid); + stat.setVersion(0); + stat.setAversion(0); + stat.setEphemeralOwner(ephemeralOwner); + DataNode parent = nodes.get(parentName); + if (parent == null) { + throw new KeeperException.NoNodeException(); + } + synchronized (parent) { + Set children = parent.getChildren(); + if (children != null) { + if (children.contains(childName)) { + throw new KeeperException.NodeExistsException(); + } + } + + if (parentCVersion == -1) { + parentCVersion = parent.stat.getCversion(); + parentCVersion++; + } + parent.stat.setCversion(parentCVersion); + parent.stat.setPzxid(zxid); + Long longval = convertAcls(acl); + DataNode child = new DataNode(parent, data, longval, stat); + parent.addChild(childName); + nodes.put(path, child); + if (ephemeralOwner != 0) { + HashSet list = ephemerals.get(ephemeralOwner); + if (list == null) { + list = new HashSet(); + ephemerals.put(ephemeralOwner, list); + } + synchronized (list) { + list.add(path); + } + } + } + // now check if its one of the zookeeper node child + if (parentName.startsWith(quotaZookeeper)) { + // now check if its the limit node + if (Quotas.limitNode.equals(childName)) { + // this is the limit node + // get the parent and add it to the trie + pTrie.addPath(parentName.substring(quotaZookeeper.length())); + } + if (Quotas.statNode.equals(childName)) { + updateQuotaForPath(parentName + .substring(quotaZookeeper.length())); + } + } + // also check to update the quotas for this node + String lastPrefix; + if((lastPrefix = getMaxPrefixWithQuota(path)) != null) { + // ok we have some match and need to update + updateCount(lastPrefix, 1); + updateBytes(lastPrefix, data == null ? 0 : data.length); + } + dataWatches.triggerWatch(path, Event.EventType.NodeCreated); + childWatches.triggerWatch(parentName.equals("") ? "/" : parentName, + Event.EventType.NodeChildrenChanged); + return path; + } + + /** + * remove the path from the datatree + * + * @param path + * the path to of the node to be deleted + * @param zxid + * the current zxid + * @throws KeeperException.NoNodeException + */ + public void deleteNode(String path, long zxid) + throws KeeperException.NoNodeException { + int lastSlash = path.lastIndexOf('/'); + String parentName = path.substring(0, lastSlash); + String childName = path.substring(lastSlash + 1); + DataNode node = nodes.get(path); + if (node == null) { + throw new KeeperException.NoNodeException(); + } + nodes.remove(path); + DataNode parent = nodes.get(parentName); + if (parent == null) { + throw new KeeperException.NoNodeException(); + } + synchronized (parent) { + parent.removeChild(childName); + parent.stat.setPzxid(zxid); + long eowner = node.stat.getEphemeralOwner(); + if (eowner != 0) { + HashSet nodes = ephemerals.get(eowner); + if (nodes != null) { + synchronized (nodes) { + nodes.remove(path); + } + } + } + node.parent = null; + } + if (parentName.startsWith(procZookeeper)) { + // delete the node in the trie. + if (Quotas.limitNode.equals(childName)) { + // we need to update the trie + // as well + pTrie.deletePath(parentName.substring(quotaZookeeper.length())); + } + } + + // also check to update the quotas for this node + String lastPrefix; + if((lastPrefix = getMaxPrefixWithQuota(path)) != null) { + // ok we have some match and need to update + updateCount(lastPrefix, -1); + int bytes = 0; + synchronized (node) { + bytes = (node.data == null ? 0 : -(node.data.length)); + } + updateBytes(lastPrefix, bytes); + } + if (LOG.isTraceEnabled()) { + ZooTrace.logTraceMessage(LOG, ZooTrace.EVENT_DELIVERY_TRACE_MASK, + "dataWatches.triggerWatch " + path); + ZooTrace.logTraceMessage(LOG, ZooTrace.EVENT_DELIVERY_TRACE_MASK, + "childWatches.triggerWatch " + parentName); + } + Set processed = dataWatches.triggerWatch(path, + EventType.NodeDeleted); + childWatches.triggerWatch(path, EventType.NodeDeleted, processed); + childWatches.triggerWatch(parentName.equals("") ? "/" : parentName, + EventType.NodeChildrenChanged); + } + + public Stat setData(String path, byte data[], int version, long zxid, + long time) throws KeeperException.NoNodeException { + Stat s = new Stat(); + DataNode n = nodes.get(path); + if (n == null) { + throw new KeeperException.NoNodeException(); + } + byte lastdata[] = null; + synchronized (n) { + lastdata = n.data; + n.data = data; + n.stat.setMtime(time); + n.stat.setMzxid(zxid); + n.stat.setVersion(version); + n.copyStat(s); + } + // now update if the path is in a quota subtree. + String lastPrefix; + if((lastPrefix = getMaxPrefixWithQuota(path)) != null) { + this.updateBytes(lastPrefix, (data == null ? 0 : data.length) + - (lastdata == null ? 0 : lastdata.length)); + } + dataWatches.triggerWatch(path, EventType.NodeDataChanged); + return s; + } + + /** + * If there is a quota set, return the appropriate prefix for that quota + * Else return null + * @param path The ZK path to check for quota + * @return Max quota prefix, or null if none + */ + public String getMaxPrefixWithQuota(String path) { + // do nothing for the root. + // we are not keeping a quota on the zookeeper + // root node for now. + String lastPrefix = pTrie.findMaxPrefix(path); + + if (!rootZookeeper.equals(lastPrefix) && !("".equals(lastPrefix))) { + return lastPrefix; + } + else { + return null; + } + } + + public byte[] getData(String path, Stat stat, Watcher watcher) + throws KeeperException.NoNodeException { + DataNode n = nodes.get(path); + if (n == null) { + throw new KeeperException.NoNodeException(); + } + synchronized (n) { + n.copyStat(stat); + if (watcher != null) { + dataWatches.addWatch(path, watcher); + } + return n.data; + } + } + + public Stat statNode(String path, Watcher watcher) + throws KeeperException.NoNodeException { + Stat stat = new Stat(); + DataNode n = nodes.get(path); + if (watcher != null) { + dataWatches.addWatch(path, watcher); + } + if (n == null) { + throw new KeeperException.NoNodeException(); + } + synchronized (n) { + n.copyStat(stat); + return stat; + } + } + + public List getChildren(String path, Stat stat, Watcher watcher) + throws KeeperException.NoNodeException { + DataNode n = nodes.get(path); + if (n == null) { + throw new KeeperException.NoNodeException(); + } + synchronized (n) { + if (stat != null) { + n.copyStat(stat); + } + ArrayList children; + Set childs = n.getChildren(); + if (childs != null) { + children = new ArrayList(childs.size()); + children.addAll(childs); + } else { + children = new ArrayList(0); + } + + if (watcher != null) { + childWatches.addWatch(path, watcher); + } + return children; + } + } + + public Stat setACL(String path, List acl, int version) + throws KeeperException.NoNodeException { + Stat stat = new Stat(); + DataNode n = nodes.get(path); + if (n == null) { + throw new KeeperException.NoNodeException(); + } + synchronized (n) { + n.stat.setAversion(version); + n.acl = convertAcls(acl); + n.copyStat(stat); + return stat; + } + } + + @SuppressWarnings("unchecked") + public List getACL(String path, Stat stat) + throws KeeperException.NoNodeException { + DataNode n = nodes.get(path); + if (n == null) { + throw new KeeperException.NoNodeException(); + } + synchronized (n) { + n.copyStat(stat); + return new ArrayList(convertLong(n.acl)); + } + } + + static public class ProcessTxnResult { + public long clientId; + + public int cxid; + + public long zxid; + + public int err; + + public int type; + + public String path; + + public Stat stat; + + public List multiResult; + + /** + * Equality is defined as the clientId and the cxid being the same. This + * allows us to use hash tables to track completion of transactions. + * + * @see java.lang.Object#equals(java.lang.Object) + */ + @Override + public boolean equals(Object o) { + if (o instanceof ProcessTxnResult) { + ProcessTxnResult other = (ProcessTxnResult) o; + return other.clientId == clientId && other.cxid == cxid; + } + return false; + } + + /** + * See equals() to find the rational for how this hashcode is generated. + * + * @see ProcessTxnResult#equals(Object) + * @see java.lang.Object#hashCode() + */ + @Override + public int hashCode() { + return (int) ((clientId ^ cxid) % Integer.MAX_VALUE); + } + + } + + public volatile long lastProcessedZxid = 0; + + public ProcessTxnResult processTxn(TxnHeader header, Record txn) + { + ProcessTxnResult rc = new ProcessTxnResult(); + + try { + rc.clientId = header.getClientId(); + rc.cxid = header.getCxid(); + rc.zxid = header.getZxid(); + rc.type = header.getType(); + rc.err = 0; + rc.multiResult = null; + switch (header.getType()) { + case OpCode.create: + CreateTxn createTxn = (CreateTxn) txn; + rc.path = createTxn.getPath(); + createNode( + createTxn.getPath(), + createTxn.getData(), + createTxn.getAcl(), + createTxn.getEphemeral() ? header.getClientId() : 0, + createTxn.getParentCVersion(), + header.getZxid(), header.getTime()); + break; + case OpCode.delete: + DeleteTxn deleteTxn = (DeleteTxn) txn; + rc.path = deleteTxn.getPath(); + deleteNode(deleteTxn.getPath(), header.getZxid()); + break; + case OpCode.setData: + SetDataTxn setDataTxn = (SetDataTxn) txn; + rc.path = setDataTxn.getPath(); + rc.stat = setData(setDataTxn.getPath(), setDataTxn + .getData(), setDataTxn.getVersion(), header + .getZxid(), header.getTime()); + break; + case OpCode.setACL: + SetACLTxn setACLTxn = (SetACLTxn) txn; + rc.path = setACLTxn.getPath(); + rc.stat = setACL(setACLTxn.getPath(), setACLTxn.getAcl(), + setACLTxn.getVersion()); + break; + case OpCode.closeSession: + killSession(header.getClientId(), header.getZxid()); + break; + case OpCode.error: + ErrorTxn errTxn = (ErrorTxn) txn; + rc.err = errTxn.getErr(); + break; + case OpCode.check: + CheckVersionTxn checkTxn = (CheckVersionTxn) txn; + rc.path = checkTxn.getPath(); + break; + case OpCode.multi: + MultiTxn multiTxn = (MultiTxn) txn ; + List txns = multiTxn.getTxns(); + rc.multiResult = new ArrayList(); + boolean failed = false; + for (Txn subtxn : txns) { + if (subtxn.getType() == OpCode.error) { + failed = true; + break; + } + } + + boolean post_failed = false; + for (Txn subtxn : txns) { + ByteBuffer bb = ByteBuffer.wrap(subtxn.getData()); + Record record = null; + switch (subtxn.getType()) { + case OpCode.create: + record = new CreateTxn(); + break; + case OpCode.delete: + record = new DeleteTxn(); + break; + case OpCode.setData: + record = new SetDataTxn(); + break; + case OpCode.error: + record = new ErrorTxn(); + post_failed = true; + break; + case OpCode.check: + record = new CheckVersionTxn(); + break; + default: + throw new IOException("Invalid type of op: " + subtxn.getType()); + } + assert(record != null); + + ByteBufferInputStream.byteBuffer2Record(bb, record); + + if (failed && subtxn.getType() != OpCode.error){ + int ec = post_failed ? Code.RUNTIMEINCONSISTENCY.intValue() + : Code.OK.intValue(); + + subtxn.setType(OpCode.error); + record = new ErrorTxn(ec); + } + + if (failed) { + assert(subtxn.getType() == OpCode.error) ; + } + + TxnHeader subHdr = new TxnHeader(header.getClientId(), header.getCxid(), + header.getZxid(), header.getTime(), + subtxn.getType()); + ProcessTxnResult subRc = processTxn(subHdr, record); + rc.multiResult.add(subRc); + if (subRc.err != 0 && rc.err == 0) { + rc.err = subRc.err ; + } + } + break; + } + } catch (KeeperException e) { + if (LOG.isDebugEnabled()) { + LOG.debug("Failed: " + header + ":" + txn, e); + } + rc.err = e.code().intValue(); + } catch (IOException e) { + if (LOG.isDebugEnabled()) { + LOG.debug("Failed: " + header + ":" + txn, e); + } + } + /* + * A snapshot might be in progress while we are modifying the data + * tree. If we set lastProcessedZxid prior to making corresponding + * change to the tree, then the zxid associated with the snapshot + * file will be ahead of its contents. Thus, while restoring from + * the snapshot, the restore method will not apply the transaction + * for zxid associated with the snapshot file, since the restore + * method assumes that transaction to be present in the snapshot. + * + * To avoid this, we first apply the transaction and then modify + * lastProcessedZxid. During restore, we correctly handle the + * case where the snapshot contains data ahead of the zxid associated + * with the file. + */ + if (rc.zxid > lastProcessedZxid) { + lastProcessedZxid = rc.zxid; + } + + /* + * Snapshots are taken lazily. It can happen that the child + * znodes of a parent are created after the parent + * is serialized. Therefore, while replaying logs during restore, a + * create might fail because the node was already + * created. + * + * After seeing this failure, we should increment + * the cversion of the parent znode since the parent was serialized + * before its children. + * + * Note, such failures on DT should be seen only during + * restore. + */ + if (header.getType() == OpCode.create && + rc.err == Code.NODEEXISTS.intValue()) { + LOG.debug("Adjusting parent cversion for Txn: " + header.getType() + + " path:" + rc.path + " err: " + rc.err); + int lastSlash = rc.path.lastIndexOf('/'); + String parentName = rc.path.substring(0, lastSlash); + CreateTxn cTxn = (CreateTxn)txn; + try { + setCversionPzxid(parentName, cTxn.getParentCVersion(), + header.getZxid()); + } catch (KeeperException.NoNodeException e) { + LOG.error("Failed to set parent cversion for: " + + parentName, e); + rc.err = e.code().intValue(); + } + } else if (rc.err != Code.OK.intValue()) { + LOG.debug("Ignoring processTxn failure hdr: " + header.getType() + + " : error: " + rc.err); + } + return rc; + } + + void killSession(long session, long zxid) { + // the list is already removed from the ephemerals + // so we do not have to worry about synchronizing on + // the list. This is only called from FinalRequestProcessor + // so there is no need for synchronization. The list is not + // changed here. Only create and delete change the list which + // are again called from FinalRequestProcessor in sequence. + HashSet list = ephemerals.remove(session); + if (list != null) { + for (String path : list) { + try { + deleteNode(path, zxid); + if (LOG.isDebugEnabled()) { + LOG + .debug("Deleting ephemeral node " + path + + " for session 0x" + + Long.toHexString(session)); + } + } catch (NoNodeException e) { + LOG.warn("Ignoring NoNodeException for path " + path + + " while removing ephemeral for dead session 0x" + + Long.toHexString(session)); + } + } + } + } + + /** + * a encapsultaing class for return value + */ + private static class Counts { + long bytes; + int count; + } + + /** + * this method gets the count of nodes and the bytes under a subtree + * + * @param path + * the path to be used + * @param counts + * the int count + */ + private void getCounts(String path, Counts counts) { + DataNode node = getNode(path); + if (node == null) { + return; + } + String[] children = null; + int len = 0; + synchronized (node) { + Set childs = node.getChildren(); + if (childs != null) { + children = childs.toArray(new String[childs.size()]); + } + len = (node.data == null ? 0 : node.data.length); + } + // add itself + counts.count += 1; + counts.bytes += len; + if (children == null || children.length == 0) { + return; + } + for (String child : children) { + getCounts(path + "/" + child, counts); + } + } + + /** + * update the quota for the given path + * + * @param path + * the path to be used + */ + private void updateQuotaForPath(String path) { + Counts c = new Counts(); + getCounts(path, c); + StatsTrack strack = new StatsTrack(); + strack.setBytes(c.bytes); + strack.setCount(c.count); + String statPath = Quotas.quotaZookeeper + path + "/" + Quotas.statNode; + DataNode node = getNode(statPath); + // it should exist + if (node == null) { + LOG.warn("Missing quota stat node " + statPath); + return; + } + synchronized (node) { + node.data = strack.toString().getBytes(); + } + } + + /** + * this method traverses the quota path and update the path trie and sets + * + * @param path + */ + private void traverseNode(String path) { + DataNode node = getNode(path); + String children[] = null; + synchronized (node) { + Set childs = node.getChildren(); + if (childs != null) { + children = childs.toArray(new String[childs.size()]); + } + } + if (children == null || children.length == 0) { + // this node does not have a child + // is the leaf node + // check if its the leaf node + String endString = "/" + Quotas.limitNode; + if (path.endsWith(endString)) { + // ok this is the limit node + // get the real node and update + // the count and the bytes + String realPath = path.substring(Quotas.quotaZookeeper + .length(), path.indexOf(endString)); + updateQuotaForPath(realPath); + this.pTrie.addPath(realPath); + } + return; + } + for (String child : children) { + traverseNode(path + "/" + child); + } + } + + /** + * this method sets up the path trie and sets up stats for quota nodes + */ + private void setupQuota() { + String quotaPath = Quotas.quotaZookeeper; + DataNode node = getNode(quotaPath); + if (node == null) { + return; + } + traverseNode(quotaPath); + } + + /** + * this method uses a stringbuilder to create a new path for children. This + * is faster than string appends ( str1 + str2). + * + * @param oa + * OutputArchive to write to. + * @param path + * a string builder. + * @throws IOException + * @throws InterruptedException + */ + void serializeNode(OutputArchive oa, StringBuilder path) throws IOException { + String pathString = path.toString(); + DataNode node = getNode(pathString); + if (node == null) { + return; + } + String children[] = null; + synchronized (node) { + scount++; + oa.writeString(pathString, "path"); + oa.writeRecord(node, "node"); + Set childs = node.getChildren(); + if (childs != null) { + children = childs.toArray(new String[childs.size()]); + } + } + path.append('/'); + int off = path.length(); + if (children != null) { + for (String child : children) { + // since this is single buffer being resused + // we need + // to truncate the previous bytes of string. + path.delete(off, Integer.MAX_VALUE); + path.append(child); + serializeNode(oa, path); + } + } + } + + int scount; + + public boolean initialized = false; + + private void deserializeList(Map> longKeyMap, + InputArchive ia) throws IOException { + int i = ia.readInt("map"); + while (i > 0) { + Long val = ia.readLong("long"); + if (aclIndex < val) { + aclIndex = val; + } + List aclList = new ArrayList(); + Index j = ia.startVector("acls"); + while (!j.done()) { + ACL acl = new ACL(); + acl.deserialize(ia, "acl"); + aclList.add(acl); + j.incr(); + } + longKeyMap.put(val, aclList); + aclKeyMap.put(aclList, val); + i--; + } + } + + private synchronized void serializeList(Map> longKeyMap, + OutputArchive oa) throws IOException { + oa.writeInt(longKeyMap.size(), "map"); + Set>> set = longKeyMap.entrySet(); + for (Map.Entry> val : set) { + oa.writeLong(val.getKey(), "long"); + List aclList = val.getValue(); + oa.startVector(aclList, "acls"); + for (ACL acl : aclList) { + acl.serialize(oa, "acl"); + } + oa.endVector(aclList, "acls"); + } + } + + public void serialize(OutputArchive oa, String tag) throws IOException { + scount = 0; + serializeList(longKeyMap, oa); + serializeNode(oa, new StringBuilder("")); + // / marks end of stream + // we need to check if clear had been called in between the snapshot. + if (root != null) { + oa.writeString("/", "path"); + } + } + + public void deserialize(InputArchive ia, String tag) throws IOException { + deserializeList(longKeyMap, ia); + nodes.clear(); + pTrie.clear(); + String path = ia.readString("path"); + while (!path.equals("/")) { + DataNode node = new DataNode(); + ia.readRecord(node, "node"); + nodes.put(path, node); + int lastSlash = path.lastIndexOf('/'); + if (lastSlash == -1) { + root = node; + } else { + String parentPath = path.substring(0, lastSlash); + node.parent = nodes.get(parentPath); + if (node.parent == null) { + throw new IOException("Invalid Datatree, unable to find " + + "parent " + parentPath + " of path " + path); + } + node.parent.addChild(path.substring(lastSlash + 1)); + long eowner = node.stat.getEphemeralOwner(); + if (eowner != 0) { + HashSet list = ephemerals.get(eowner); + if (list == null) { + list = new HashSet(); + ephemerals.put(eowner, list); + } + list.add(path); + } + } + path = ia.readString("path"); + } + nodes.put("/", root); + // we are done with deserializing the + // the datatree + // update the quotas - create path trie + // and also update the stat nodes + setupQuota(); + } + + /** + * Summary of the watches on the datatree. + * @param pwriter the output to write to + */ + public synchronized void dumpWatchesSummary(PrintWriter pwriter) { + pwriter.print(dataWatches.toString()); + } + + /** + * Write a text dump of all the watches on the datatree. + * Warning, this is expensive, use sparingly! + * @param pwriter the output to write to + */ + public synchronized void dumpWatches(PrintWriter pwriter, boolean byPath) { + dataWatches.dumpWatches(pwriter, byPath); + } + + /** + * Write a text dump of all the ephemerals in the datatree. + * @param pwriter the output to write to + */ + public void dumpEphemerals(PrintWriter pwriter) { + Set keys = ephemerals.keySet(); + pwriter.println("Sessions with Ephemerals (" + + keys.size() + "):"); + for (long k : keys) { + pwriter.print("0x" + Long.toHexString(k)); + pwriter.println(":"); + HashSet tmp = ephemerals.get(k); + if (tmp != null) { + synchronized (tmp) { + for (String path : tmp) { + pwriter.println("\t" + path); + } + } + } + } + } + + public void removeCnxn(Watcher watcher) { + dataWatches.removeWatcher(watcher); + childWatches.removeWatcher(watcher); + } + + public void clear() { + root = null; + nodes.clear(); + ephemerals.clear(); + } + + public void setWatches(long relativeZxid, List dataWatches, + List existWatches, List childWatches, + Watcher watcher) { + for (String path : dataWatches) { + DataNode node = getNode(path); + if (node == null) { + watcher.process(new WatchedEvent(EventType.NodeDeleted, + KeeperState.SyncConnected, path)); + } else if (node.stat.getMzxid() > relativeZxid) { + watcher.process(new WatchedEvent(EventType.NodeDataChanged, + KeeperState.SyncConnected, path)); + } else { + this.dataWatches.addWatch(path, watcher); + } + } + for (String path : existWatches) { + DataNode node = getNode(path); + if (node != null) { + watcher.process(new WatchedEvent(EventType.NodeCreated, + KeeperState.SyncConnected, path)); + } else { + this.dataWatches.addWatch(path, watcher); + } + } + for (String path : childWatches) { + DataNode node = getNode(path); + if (node == null) { + watcher.process(new WatchedEvent(EventType.NodeDeleted, + KeeperState.SyncConnected, path)); + } else if (node.stat.getPzxid() > relativeZxid) { + watcher.process(new WatchedEvent(EventType.NodeChildrenChanged, + KeeperState.SyncConnected, path)); + } else { + this.childWatches.addWatch(path, watcher); + } + } + } + + /** + * This method sets the Cversion and Pzxid for the specified node to the + * values passed as arguments. The values are modified only if newCversion + * is greater than the current Cversion. A NoNodeException is thrown if + * a znode for the specified path is not found. + * + * @param path + * Full path to the znode whose Cversion needs to be modified. + * A "/" at the end of the path is ignored. + * @param newCversion + * Value to be assigned to Cversion + * @param zxid + * Value to be assigned to Pzxid + * @throws KeeperException.NoNodeException + * If znode not found. + **/ + public void setCversionPzxid(String path, int newCversion, long zxid) + throws KeeperException.NoNodeException { + if (path.endsWith("/")) { + path = path.substring(0, path.length() - 1); + } + DataNode node = nodes.get(path); + if (node == null) { + throw new KeeperException.NoNodeException(path); + } + synchronized (node) { + if(newCversion == -1) { + newCversion = node.stat.getCversion() + 1; + } + if (newCversion > node.stat.getCversion()) { + node.stat.setCversion(newCversion); + node.stat.setPzxid(zxid); + } + } + } +} diff --git a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/DataTreeBean.java b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/DataTreeBean.java new file mode 100644 index 000000000..433c13fbb --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/DataTreeBean.java @@ -0,0 +1,61 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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. + */ + +package org.apache.zookeeper.server; + +import org.apache.zookeeper.jmx.ZKMBeanInfo; + +/** + * This class implements the data tree MBean. + */ +public class DataTreeBean implements DataTreeMXBean, ZKMBeanInfo { + DataTree dataTree; + + public DataTreeBean(org.apache.zookeeper.server.DataTree dataTree){ + this.dataTree = dataTree; + } + + public int getNodeCount() { + return dataTree.getNodeCount(); + } + + public long approximateDataSize() { + return dataTree.approximateDataSize(); + } + + public int countEphemerals() { + return dataTree.getEphemeralsCount(); + } + + public int getWatchCount() { + return dataTree.getWatchCount(); + } + + public String getName() { + return "InMemoryDataTree"; + } + + public boolean isHidden() { + return false; + } + + public String getLastZxid() { + return "0x" + Long.toHexString(dataTree.lastProcessedZxid); + } + +} diff --git a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/DataTreeMXBean.java b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/DataTreeMXBean.java new file mode 100644 index 000000000..0048b6b27 --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/DataTreeMXBean.java @@ -0,0 +1,47 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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. + */ + +package org.apache.zookeeper.server; + +/** + * Zookeeper data tree MBean. + */ +public interface DataTreeMXBean { + /** + * @return number of znodes in the data tree. + */ + public int getNodeCount(); + /** + * @return the most recent zxid processed by the data tree. + */ + public String getLastZxid(); + /** + * @return number of watches set. + */ + public int getWatchCount(); + + /** + * @return data tree size in bytes. The size includes the znode path and + * its value. + */ + public long approximateDataSize(); + /** + * @return number of ephemeral nodes in the data tree + */ + public int countEphemerals(); +} diff --git a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/DatadirCleanupManager.java b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/DatadirCleanupManager.java new file mode 100644 index 000000000..8c4797166 --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/DatadirCleanupManager.java @@ -0,0 +1,192 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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. + */ + +package org.apache.zookeeper.server; + +import java.io.File; +import java.util.Timer; +import java.util.TimerTask; +import java.util.concurrent.TimeUnit; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * This class manages the cleanup of snapshots and corresponding transaction + * logs by scheduling the auto purge task with the specified + * 'autopurge.purgeInterval'. It keeps the most recent + * 'autopurge.snapRetainCount' number of snapshots and corresponding transaction + * logs. + */ +public class DatadirCleanupManager { + + private static final Logger LOG = LoggerFactory.getLogger(DatadirCleanupManager.class); + + /** + * Status of the dataDir purge task + */ + public enum PurgeTaskStatus { + NOT_STARTED, STARTED, COMPLETED; + } + + private PurgeTaskStatus purgeTaskStatus = PurgeTaskStatus.NOT_STARTED; + + private final String snapDir; + + private final String dataLogDir; + + private final int snapRetainCount; + + private final int purgeInterval; + + private Timer timer; + + /** + * Constructor of DatadirCleanupManager. It takes the parameters to schedule + * the purge task. + * + * @param snapDir + * snapshot directory + * @param dataLogDir + * transaction log directory + * @param snapRetainCount + * number of snapshots to be retained after purge + * @param purgeInterval + * purge interval in hours + */ + public DatadirCleanupManager(String snapDir, String dataLogDir, int snapRetainCount, + int purgeInterval) { + this.snapDir = snapDir; + this.dataLogDir = dataLogDir; + this.snapRetainCount = snapRetainCount; + this.purgeInterval = purgeInterval; + LOG.info("autopurge.snapRetainCount set to " + snapRetainCount); + LOG.info("autopurge.purgeInterval set to " + purgeInterval); + } + + /** + * Validates the purge configuration and schedules the purge task. Purge + * task keeps the most recent snapRetainCount number of + * snapshots and deletes the remaining for every purgeInterval + * hour(s). + *

      + * purgeInterval of 0 or + * negative integer will not schedule the purge task. + *

      + * + * @see PurgeTxnLog#purge(File, File, int) + */ + public void start() { + if (PurgeTaskStatus.STARTED == purgeTaskStatus) { + LOG.warn("Purge task is already running."); + return; + } + // Don't schedule the purge task with zero or negative purge interval. + if (purgeInterval <= 0) { + LOG.info("Purge task is not scheduled."); + return; + } + + timer = new Timer("PurgeTask", true); + TimerTask task = new PurgeTask(dataLogDir, snapDir, snapRetainCount); + timer.scheduleAtFixedRate(task, 0, TimeUnit.HOURS.toMillis(purgeInterval)); + + purgeTaskStatus = PurgeTaskStatus.STARTED; + } + + /** + * Shutdown the purge task. + */ + public void shutdown() { + if (PurgeTaskStatus.STARTED == purgeTaskStatus) { + LOG.info("Shutting down purge task."); + timer.cancel(); + purgeTaskStatus = PurgeTaskStatus.COMPLETED; + } else { + LOG.warn("Purge task not started. Ignoring shutdown!"); + } + } + + static class PurgeTask extends TimerTask { + private String logsDir; + private String snapsDir; + private int snapRetainCount; + + public PurgeTask(String dataDir, String snapDir, int count) { + logsDir = dataDir; + snapsDir = snapDir; + snapRetainCount = count; + } + + @Override + public void run() { + LOG.info("Purge task started."); + try { + PurgeTxnLog.purge(new File(logsDir), new File(snapsDir), snapRetainCount); + } catch (Exception e) { + LOG.error("Error occured while purging.", e); + } + LOG.info("Purge task completed."); + } + } + + /** + * Returns the status of the purge task. + * + * @return the status of the purge task + */ + public PurgeTaskStatus getPurgeTaskStatus() { + return purgeTaskStatus; + } + + /** + * Returns the snapshot directory. + * + * @return the snapshot directory. + */ + public String getSnapDir() { + return snapDir; + } + + /** + * Returns transaction log directory. + * + * @return the transaction log directory. + */ + public String getDataLogDir() { + return dataLogDir; + } + + /** + * Returns purge interval in hours. + * + * @return the purge interval in hours. + */ + public int getPurgeInterval() { + return purgeInterval; + } + + /** + * Returns the number of snapshots to be retained after purge. + * + * @return the number of snapshots to be retained after purge. + */ + public int getSnapRetainCount() { + return snapRetainCount; + } +} diff --git a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/FinalRequestProcessor.java b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/FinalRequestProcessor.java new file mode 100644 index 000000000..e3cfc4b0e --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/FinalRequestProcessor.java @@ -0,0 +1,418 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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. + */ + +package org.apache.zookeeper.server; + +import java.io.IOException; +import java.nio.ByteBuffer; +import java.util.List; + +import org.apache.jute.Record; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.apache.zookeeper.KeeperException; +import org.apache.zookeeper.MultiResponse; +import org.apache.zookeeper.ZooDefs; +import org.apache.zookeeper.KeeperException.Code; +import org.apache.zookeeper.KeeperException.SessionMovedException; +import org.apache.zookeeper.ZooDefs.OpCode; +import org.apache.zookeeper.data.ACL; +import org.apache.zookeeper.data.Stat; +import org.apache.zookeeper.proto.CreateResponse; +import org.apache.zookeeper.proto.ExistsRequest; +import org.apache.zookeeper.proto.ExistsResponse; +import org.apache.zookeeper.proto.GetACLRequest; +import org.apache.zookeeper.proto.GetACLResponse; +import org.apache.zookeeper.proto.GetChildren2Request; +import org.apache.zookeeper.proto.GetChildren2Response; +import org.apache.zookeeper.proto.GetChildrenRequest; +import org.apache.zookeeper.proto.GetChildrenResponse; +import org.apache.zookeeper.proto.GetDataRequest; +import org.apache.zookeeper.proto.GetDataResponse; +import org.apache.zookeeper.proto.ReplyHeader; +import org.apache.zookeeper.proto.SetACLResponse; +import org.apache.zookeeper.proto.SetDataResponse; +import org.apache.zookeeper.proto.SetWatches; +import org.apache.zookeeper.proto.SyncRequest; +import org.apache.zookeeper.proto.SyncResponse; +import org.apache.zookeeper.server.DataTree.ProcessTxnResult; +import org.apache.zookeeper.server.ZooKeeperServer.ChangeRecord; +import org.apache.zookeeper.txn.CreateSessionTxn; +import org.apache.zookeeper.txn.ErrorTxn; +import org.apache.zookeeper.txn.TxnHeader; + +import org.apache.zookeeper.MultiTransactionRecord; +import org.apache.zookeeper.Op; +import org.apache.zookeeper.OpResult; +import org.apache.zookeeper.OpResult.CheckResult; +import org.apache.zookeeper.OpResult.CreateResult; +import org.apache.zookeeper.OpResult.DeleteResult; +import org.apache.zookeeper.OpResult.SetDataResult; +import org.apache.zookeeper.OpResult.ErrorResult; + +/** + * This Request processor actually applies any transaction associated with a + * request and services any queries. It is always at the end of a + * RequestProcessor chain (hence the name), so it does not have a nextProcessor + * member. + * + * This RequestProcessor counts on ZooKeeperServer to populate the + * outstandingRequests member of ZooKeeperServer. + */ +public class FinalRequestProcessor implements RequestProcessor { + private static final Logger LOG = LoggerFactory.getLogger(FinalRequestProcessor.class); + + ZooKeeperServer zks; + + public FinalRequestProcessor(ZooKeeperServer zks) { + this.zks = zks; + } + + public void processRequest(Request request) { + if (LOG.isDebugEnabled()) { + LOG.debug("Processing request:: " + request); + } + // request.addRQRec(">final"); + long traceMask = ZooTrace.CLIENT_REQUEST_TRACE_MASK; + if (request.type == OpCode.ping) { + traceMask = ZooTrace.SERVER_PING_TRACE_MASK; + } + if (LOG.isTraceEnabled()) { + ZooTrace.logRequest(LOG, traceMask, 'E', request, ""); + } + ProcessTxnResult rc = null; + synchronized (zks.outstandingChanges) { + while (!zks.outstandingChanges.isEmpty() + && zks.outstandingChanges.get(0).zxid <= request.zxid) { + ChangeRecord cr = zks.outstandingChanges.remove(0); + if (cr.zxid < request.zxid) { + LOG.warn("Zxid outstanding " + + cr.zxid + + " is less than current " + request.zxid); + } + if (zks.outstandingChangesForPath.get(cr.path) == cr) { + zks.outstandingChangesForPath.remove(cr.path); + } + } + if (request.hdr != null) { + TxnHeader hdr = request.hdr; + Record txn = request.txn; + + rc = zks.processTxn(hdr, txn); + } + // do not add non quorum packets to the queue. + if (Request.isQuorum(request.type)) { + zks.getZKDatabase().addCommittedProposal(request); + } + } + + if (request.hdr != null && request.hdr.getType() == OpCode.closeSession) { + ServerCnxnFactory scxn = zks.getServerCnxnFactory(); + // this might be possible since + // we might just be playing diffs from the leader + if (scxn != null && request.cnxn == null) { + // calling this if we have the cnxn results in the client's + // close session response being lost - we've already closed + // the session/socket here before we can send the closeSession + // in the switch block below + scxn.closeSession(request.sessionId); + return; + } + } + + if (request.cnxn == null) { + return; + } + ServerCnxn cnxn = request.cnxn; + + String lastOp = "NA"; + zks.decInProcess(); + Code err = Code.OK; + Record rsp = null; + boolean closeSession = false; + try { + if (request.hdr != null && request.hdr.getType() == OpCode.error) { + throw KeeperException.create(KeeperException.Code.get(( + (ErrorTxn) request.txn).getErr())); + } + + KeeperException ke = request.getException(); + if (ke != null && request.type != OpCode.multi) { + throw ke; + } + + if (LOG.isDebugEnabled()) { + LOG.debug("{}",request); + } + switch (request.type) { + case OpCode.ping: { + zks.serverStats().updateLatency(request.createTime); + + lastOp = "PING"; + cnxn.updateStatsForResponse(request.cxid, request.zxid, lastOp, + request.createTime, System.currentTimeMillis()); + + cnxn.sendResponse(new ReplyHeader(-2, + zks.getZKDatabase().getDataTreeLastProcessedZxid(), 0), null, "response"); + return; + } + case OpCode.createSession: { + zks.serverStats().updateLatency(request.createTime); + + lastOp = "SESS"; + cnxn.updateStatsForResponse(request.cxid, request.zxid, lastOp, + request.createTime, System.currentTimeMillis()); + + zks.finishSessionInit(request.cnxn, true); + return; + } + case OpCode.multi: { + lastOp = "MULT"; + rsp = new MultiResponse() ; + + for (ProcessTxnResult subTxnResult : rc.multiResult) { + + OpResult subResult ; + + switch (subTxnResult.type) { + case OpCode.check: + subResult = new CheckResult(); + break; + case OpCode.create: + subResult = new CreateResult(subTxnResult.path); + break; + case OpCode.delete: + subResult = new DeleteResult(); + break; + case OpCode.setData: + subResult = new SetDataResult(subTxnResult.stat); + break; + case OpCode.error: + subResult = new ErrorResult(subTxnResult.err) ; + break; + default: + throw new IOException("Invalid type of op"); + } + + ((MultiResponse)rsp).add(subResult); + } + + break; + } + case OpCode.create: { + lastOp = "CREA"; + rsp = new CreateResponse(rc.path); + err = Code.get(rc.err); + break; + } + case OpCode.delete: { + lastOp = "DELE"; + err = Code.get(rc.err); + break; + } + case OpCode.setData: { + lastOp = "SETD"; + rsp = new SetDataResponse(rc.stat); + err = Code.get(rc.err); + break; + } + case OpCode.setACL: { + lastOp = "SETA"; + rsp = new SetACLResponse(rc.stat); + err = Code.get(rc.err); + break; + } + case OpCode.closeSession: { + lastOp = "CLOS"; + closeSession = true; + err = Code.get(rc.err); + break; + } + case OpCode.sync: { + lastOp = "SYNC"; + SyncRequest syncRequest = new SyncRequest(); + ByteBufferInputStream.byteBuffer2Record(request.request, + syncRequest); + rsp = new SyncResponse(syncRequest.getPath()); + break; + } + case OpCode.check: { + lastOp = "CHEC"; + rsp = new SetDataResponse(rc.stat); + err = Code.get(rc.err); + break; + } + case OpCode.exists: { + lastOp = "EXIS"; + // TODO we need to figure out the security requirement for this! + ExistsRequest existsRequest = new ExistsRequest(); + ByteBufferInputStream.byteBuffer2Record(request.request, + existsRequest); + String path = existsRequest.getPath(); + if (path.indexOf('\0') != -1) { + throw new KeeperException.BadArgumentsException(); + } + Stat stat = zks.getZKDatabase().statNode(path, existsRequest + .getWatch() ? cnxn : null); + rsp = new ExistsResponse(stat); + break; + } + case OpCode.getData: { + lastOp = "GETD"; + GetDataRequest getDataRequest = new GetDataRequest(); + ByteBufferInputStream.byteBuffer2Record(request.request, + getDataRequest); + DataNode n = zks.getZKDatabase().getNode(getDataRequest.getPath()); + if (n == null) { + throw new KeeperException.NoNodeException(); + } + Long aclL; + synchronized(n) { + aclL = n.acl; + } + PrepRequestProcessor.checkACL(zks, zks.getZKDatabase().convertLong(aclL), + ZooDefs.Perms.READ, + request.authInfo); + Stat stat = new Stat(); + byte b[] = zks.getZKDatabase().getData(getDataRequest.getPath(), stat, + getDataRequest.getWatch() ? cnxn : null); + rsp = new GetDataResponse(b, stat); + break; + } + case OpCode.setWatches: { + lastOp = "SETW"; + SetWatches setWatches = new SetWatches(); + // XXX We really should NOT need this!!!! + request.request.rewind(); + ByteBufferInputStream.byteBuffer2Record(request.request, setWatches); + long relativeZxid = setWatches.getRelativeZxid(); + zks.getZKDatabase().setWatches(relativeZxid, + setWatches.getDataWatches(), + setWatches.getExistWatches(), + setWatches.getChildWatches(), cnxn); + break; + } + case OpCode.getACL: { + lastOp = "GETA"; + GetACLRequest getACLRequest = new GetACLRequest(); + ByteBufferInputStream.byteBuffer2Record(request.request, + getACLRequest); + Stat stat = new Stat(); + List acl = + zks.getZKDatabase().getACL(getACLRequest.getPath(), stat); + rsp = new GetACLResponse(acl, stat); + break; + } + case OpCode.getChildren: { + lastOp = "GETC"; + GetChildrenRequest getChildrenRequest = new GetChildrenRequest(); + ByteBufferInputStream.byteBuffer2Record(request.request, + getChildrenRequest); + DataNode n = zks.getZKDatabase().getNode(getChildrenRequest.getPath()); + if (n == null) { + throw new KeeperException.NoNodeException(); + } + Long aclG; + synchronized(n) { + aclG = n.acl; + + } + PrepRequestProcessor.checkACL(zks, zks.getZKDatabase().convertLong(aclG), + ZooDefs.Perms.READ, + request.authInfo); + List children = zks.getZKDatabase().getChildren( + getChildrenRequest.getPath(), null, getChildrenRequest + .getWatch() ? cnxn : null); + rsp = new GetChildrenResponse(children); + break; + } + case OpCode.getChildren2: { + lastOp = "GETC"; + GetChildren2Request getChildren2Request = new GetChildren2Request(); + ByteBufferInputStream.byteBuffer2Record(request.request, + getChildren2Request); + Stat stat = new Stat(); + DataNode n = zks.getZKDatabase().getNode(getChildren2Request.getPath()); + if (n == null) { + throw new KeeperException.NoNodeException(); + } + Long aclG; + synchronized(n) { + aclG = n.acl; + } + PrepRequestProcessor.checkACL(zks, zks.getZKDatabase().convertLong(aclG), + ZooDefs.Perms.READ, + request.authInfo); + List children = zks.getZKDatabase().getChildren( + getChildren2Request.getPath(), stat, getChildren2Request + .getWatch() ? cnxn : null); + rsp = new GetChildren2Response(children, stat); + break; + } + } + } catch (SessionMovedException e) { + // session moved is a connection level error, we need to tear + // down the connection otw ZOOKEEPER-710 might happen + // ie client on slow follower starts to renew session, fails + // before this completes, then tries the fast follower (leader) + // and is successful, however the initial renew is then + // successfully fwd/processed by the leader and as a result + // the client and leader disagree on where the client is most + // recently attached (and therefore invalid SESSION MOVED generated) + cnxn.sendCloseSession(); + return; + } catch (KeeperException e) { + err = e.code(); + } catch (Exception e) { + // log at error level as we are returning a marshalling + // error to the user + LOG.error("Failed to process " + request, e); + StringBuilder sb = new StringBuilder(); + ByteBuffer bb = request.request; + bb.rewind(); + while (bb.hasRemaining()) { + sb.append(Integer.toHexString(bb.get() & 0xff)); + } + LOG.error("Dumping request buffer: 0x" + sb.toString()); + err = Code.MARSHALLINGERROR; + } + + long lastZxid = zks.getZKDatabase().getDataTreeLastProcessedZxid(); + ReplyHeader hdr = + new ReplyHeader(request.cxid, lastZxid, err.intValue()); + + zks.serverStats().updateLatency(request.createTime); + cnxn.updateStatsForResponse(request.cxid, lastZxid, lastOp, + request.createTime, System.currentTimeMillis()); + + try { + cnxn.sendResponse(hdr, rsp, "response"); + if (closeSession) { + cnxn.sendCloseSession(); + } + } catch (IOException e) { + LOG.error("FIXMSG",e); + } + } + + public void shutdown() { + // we are the final link in the chain + LOG.info("shutdown of request processor complete"); + } + +} diff --git a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/LogFormatter.java b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/LogFormatter.java new file mode 100644 index 000000000..cd1347d91 --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/LogFormatter.java @@ -0,0 +1,106 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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. + */ + +package org.apache.zookeeper.server; + +import java.io.ByteArrayInputStream; +import java.io.EOFException; +import java.io.FileInputStream; +import java.io.IOException; +import java.text.DateFormat; +import java.util.Date; +import java.util.zip.Adler32; +import java.util.zip.Checksum; + +import org.apache.jute.BinaryInputArchive; +import org.apache.jute.InputArchive; +import org.apache.jute.Record; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.apache.zookeeper.server.persistence.FileHeader; +import org.apache.zookeeper.server.persistence.FileTxnLog; +import org.apache.zookeeper.server.util.SerializeUtils; +import org.apache.zookeeper.txn.TxnHeader; + +public class LogFormatter { + private static final Logger LOG = LoggerFactory.getLogger(LogFormatter.class); + + /** + * @param args + */ + public static void main(String[] args) throws Exception { + if (args.length != 1) { + System.err.println("USAGE: LogFormatter log_file"); + System.exit(2); + } + FileInputStream fis = new FileInputStream(args[0]); + BinaryInputArchive logStream = BinaryInputArchive.getArchive(fis); + FileHeader fhdr = new FileHeader(); + fhdr.deserialize(logStream, "fileheader"); + + if (fhdr.getMagic() != FileTxnLog.TXNLOG_MAGIC) { + System.err.println("Invalid magic number for " + args[0]); + System.exit(2); + } + System.out.println("ZooKeeper Transactional Log File with dbid " + + fhdr.getDbid() + " txnlog format version " + + fhdr.getVersion()); + + int count = 0; + while (true) { + long crcValue; + byte[] bytes; + try { + crcValue = logStream.readLong("crcvalue"); + + bytes = logStream.readBuffer("txnEntry"); + } catch (EOFException e) { + System.out.println("EOF reached after " + count + " txns."); + return; + } + if (bytes.length == 0) { + // Since we preallocate, we define EOF to be an + // empty transaction + System.out.println("EOF reached after " + count + " txns."); + return; + } + Checksum crc = new Adler32(); + crc.update(bytes, 0, bytes.length); + if (crcValue != crc.getValue()) { + throw new IOException("CRC doesn't match " + crcValue + + " vs " + crc.getValue()); + } + TxnHeader hdr = new TxnHeader(); + Record txn = SerializeUtils.deserializeTxn(bytes, hdr); + System.out.println(DateFormat.getDateTimeInstance(DateFormat.SHORT, + DateFormat.LONG).format(new Date(hdr.getTime())) + + " session 0x" + + Long.toHexString(hdr.getClientId()) + + " cxid 0x" + + Long.toHexString(hdr.getCxid()) + + " zxid 0x" + + Long.toHexString(hdr.getZxid()) + + " " + TraceFormatter.op2String(hdr.getType()) + " " + txn); + if (logStream.readByte("EOR") != 'B') { + LOG.error("Last transaction was partial."); + throw new EOFException("Last transaction was partial."); + } + count++; + } + } +} diff --git a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/NIOServerCnxn.java b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/NIOServerCnxn.java new file mode 100644 index 000000000..d832ad93f --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/NIOServerCnxn.java @@ -0,0 +1,1162 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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. + */ + +package org.apache.zookeeper.server; + +import java.io.BufferedWriter; +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.io.PrintWriter; +import java.io.Writer; +import java.net.InetAddress; +import java.net.InetSocketAddress; +import java.nio.ByteBuffer; +import java.nio.channels.CancelledKeyException; +import java.nio.channels.SelectionKey; +import java.nio.channels.SocketChannel; +import java.util.HashSet; +import java.util.List; +import java.util.Set; +import java.util.concurrent.LinkedBlockingQueue; + +import org.apache.jute.BinaryInputArchive; +import org.apache.jute.BinaryOutputArchive; +import org.apache.jute.Record; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.apache.zookeeper.Environment; +import org.apache.zookeeper.Version; +import org.apache.zookeeper.WatchedEvent; +import org.apache.zookeeper.data.Id; +import org.apache.zookeeper.proto.ReplyHeader; +import org.apache.zookeeper.proto.RequestHeader; +import org.apache.zookeeper.proto.WatcherEvent; +import org.apache.zookeeper.server.quorum.Leader; +import org.apache.zookeeper.server.quorum.LeaderZooKeeperServer; +import org.apache.zookeeper.server.quorum.ReadOnlyZooKeeperServer; +import org.apache.zookeeper.server.util.OSMXBean; + +/** + * This class handles communication with clients using NIO. There is one per + * client, but only one thread doing the communication. + */ +public class NIOServerCnxn extends ServerCnxn { + static final Logger LOG = LoggerFactory.getLogger(NIOServerCnxn.class); + + NIOServerCnxnFactory factory; + + final SocketChannel sock; + + private final SelectionKey sk; + + boolean initialized; + + ByteBuffer lenBuffer = ByteBuffer.allocate(4); + + ByteBuffer incomingBuffer = lenBuffer; + + LinkedBlockingQueue outgoingBuffers = new LinkedBlockingQueue(); + + int sessionTimeout; + + private final ZooKeeperServer zkServer; + + /** + * The number of requests that have been submitted but not yet responded to. + */ + int outstandingRequests; + + /** + * This is the id that uniquely identifies the session of a client. Once + * this session is no longer active, the ephemeral nodes will go away. + */ + long sessionId; + + static long nextSessionId = 1; + int outstandingLimit = 1; + + public NIOServerCnxn(ZooKeeperServer zk, SocketChannel sock, + SelectionKey sk, NIOServerCnxnFactory factory) throws IOException { + this.zkServer = zk; + this.sock = sock; + this.sk = sk; + this.factory = factory; + if (this.factory.login != null) { + this.zooKeeperSaslServer = new ZooKeeperSaslServer(factory.login); + } + if (zk != null) { + outstandingLimit = zk.getGlobalOutstandingLimit(); + } + sock.socket().setTcpNoDelay(true); + /* set socket linger to false, so that socket close does not + * block */ + sock.socket().setSoLinger(false, -1); + InetAddress addr = ((InetSocketAddress) sock.socket() + .getRemoteSocketAddress()).getAddress(); + authInfo.add(new Id("ip", addr.getHostAddress())); + sk.interestOps(SelectionKey.OP_READ); + } + + /* Send close connection packet to the client, doIO will eventually + * close the underlying machinery (like socket, selectorkey, etc...) + */ + public void sendCloseSession() { + sendBuffer(ServerCnxnFactory.closeConn); + } + + /** + * send buffer without using the asynchronous + * calls to selector and then close the socket + * @param bb + */ + void sendBufferSync(ByteBuffer bb) { + try { + /* configure socket to be blocking + * so that we dont have to do write in + * a tight while loop + */ + sock.configureBlocking(true); + if (bb != ServerCnxnFactory.closeConn) { + if (sock.isOpen()) { + sock.write(bb); + } + packetSent(); + } + } catch (IOException ie) { + LOG.error("Error sending data synchronously ", ie); + } + } + + public void sendBuffer(ByteBuffer bb) { + try { + if (bb != ServerCnxnFactory.closeConn) { + // We check if write interest here because if it is NOT set, + // nothing is queued, so we can try to send the buffer right + // away without waking up the selector + if ((sk.interestOps() & SelectionKey.OP_WRITE) == 0) { + try { + sock.write(bb); + } catch (IOException e) { + // we are just doing best effort right now + } + } + // if there is nothing left to send, we are done + if (bb.remaining() == 0) { + packetSent(); + return; + } + } + + synchronized(this.factory){ + sk.selector().wakeup(); + if (LOG.isTraceEnabled()) { + LOG.trace("Add a buffer to outgoingBuffers, sk " + sk + + " is valid: " + sk.isValid()); + } + outgoingBuffers.add(bb); + if (sk.isValid()) { + sk.interestOps(sk.interestOps() | SelectionKey.OP_WRITE); + } + } + + } catch(Exception e) { + LOG.error("Unexpected Exception: ", e); + } + } + + /** Read the request payload (everything following the length prefix) */ + private void readPayload() throws IOException, InterruptedException { + if (incomingBuffer.remaining() != 0) { // have we read length bytes? + int rc = sock.read(incomingBuffer); // sock is non-blocking, so ok + if (rc < 0) { + throw new EndOfStreamException( + "Unable to read additional data from client sessionid 0x" + + Long.toHexString(sessionId) + + ", likely client has closed socket"); + } + } + + if (incomingBuffer.remaining() == 0) { // have we read length bytes? + packetReceived(); + incomingBuffer.flip(); + if (!initialized) { + readConnectRequest(); + } else { + readRequest(); + } + lenBuffer.clear(); + incomingBuffer = lenBuffer; + } + } + + /** + * Only used in order to allow testing + */ + protected boolean isSocketOpen() { + return sock.isOpen(); + } + + /** + * Handles read/write IO on connection. + */ + void doIO(SelectionKey k) throws InterruptedException { + try { + if (isSocketOpen() == false) { + LOG.warn("trying to do i/o on a null socket for session:0x" + + Long.toHexString(sessionId)); + + return; + } + if (k.isReadable()) { + int rc = sock.read(incomingBuffer); + if (rc < 0) { + throw new EndOfStreamException( + "Unable to read additional data from client sessionid 0x" + + Long.toHexString(sessionId) + + ", likely client has closed socket"); + } + if (incomingBuffer.remaining() == 0) { + boolean isPayload; + if (incomingBuffer == lenBuffer) { // start of next request + incomingBuffer.flip(); + isPayload = readLength(k); + incomingBuffer.clear(); + } else { + // continuation + isPayload = true; + } + if (isPayload) { // not the case for 4letterword + readPayload(); + } + else { + // four letter words take care + // need not do anything else + return; + } + } + } + if (k.isWritable()) { + // ZooLog.logTraceMessage(LOG, + // ZooLog.CLIENT_DATA_PACKET_TRACE_MASK + // "outgoingBuffers.size() = " + + // outgoingBuffers.size()); + if (outgoingBuffers.size() > 0) { + // ZooLog.logTraceMessage(LOG, + // ZooLog.CLIENT_DATA_PACKET_TRACE_MASK, + // "sk " + k + " is valid: " + + // k.isValid()); + + /* + * This is going to reset the buffer position to 0 and the + * limit to the size of the buffer, so that we can fill it + * with data from the non-direct buffers that we need to + * send. + */ + ByteBuffer directBuffer = factory.directBuffer; + directBuffer.clear(); + + for (ByteBuffer b : outgoingBuffers) { + if (directBuffer.remaining() < b.remaining()) { + /* + * When we call put later, if the directBuffer is to + * small to hold everything, nothing will be copied, + * so we've got to slice the buffer if it's too big. + */ + b = (ByteBuffer) b.slice().limit( + directBuffer.remaining()); + } + /* + * put() is going to modify the positions of both + * buffers, put we don't want to change the position of + * the source buffers (we'll do that after the send, if + * needed), so we save and reset the position after the + * copy + */ + int p = b.position(); + directBuffer.put(b); + b.position(p); + if (directBuffer.remaining() == 0) { + break; + } + } + /* + * Do the flip: limit becomes position, position gets set to + * 0. This sets us up for the write. + */ + directBuffer.flip(); + + int sent = sock.write(directBuffer); + ByteBuffer bb; + + // Remove the buffers that we have sent + while (outgoingBuffers.size() > 0) { + bb = outgoingBuffers.peek(); + if (bb == ServerCnxnFactory.closeConn) { + throw new CloseRequestException("close requested"); + } + int left = bb.remaining() - sent; + if (left > 0) { + /* + * We only partially sent this buffer, so we update + * the position and exit the loop. + */ + bb.position(bb.position() + sent); + break; + } + packetSent(); + /* We've sent the whole buffer, so drop the buffer */ + sent -= bb.remaining(); + outgoingBuffers.remove(); + } + // ZooLog.logTraceMessage(LOG, + // ZooLog.CLIENT_DATA_PACKET_TRACE_MASK, "after send, + // outgoingBuffers.size() = " + outgoingBuffers.size()); + } + + synchronized(this.factory){ + if (outgoingBuffers.size() == 0) { + if (!initialized + && (sk.interestOps() & SelectionKey.OP_READ) == 0) { + throw new CloseRequestException("responded to info probe"); + } + sk.interestOps(sk.interestOps() + & (~SelectionKey.OP_WRITE)); + } else { + sk.interestOps(sk.interestOps() + | SelectionKey.OP_WRITE); + } + } + } + } catch (CancelledKeyException e) { + LOG.warn("Exception causing close of session 0x" + + Long.toHexString(sessionId) + + " due to " + e); + if (LOG.isDebugEnabled()) { + LOG.debug("CancelledKeyException stack trace", e); + } + close(); + } catch (CloseRequestException e) { + // expecting close to log session closure + close(); + } catch (EndOfStreamException e) { + LOG.warn("caught end of stream exception",e); // tell user why + + // expecting close to log session closure + close(); + } catch (IOException e) { + LOG.warn("Exception causing close of session 0x" + + Long.toHexString(sessionId) + + " due to " + e); + if (LOG.isDebugEnabled()) { + LOG.debug("IOException stack trace", e); + } + close(); + } + } + + private void readRequest() throws IOException { + zkServer.processPacket(this, incomingBuffer); + } + + protected void incrOutstandingRequests(RequestHeader h) { + if (h.getXid() >= 0) { + synchronized (this) { + outstandingRequests++; + } + synchronized (this.factory) { + // check throttling + if (zkServer.getInProcess() > outstandingLimit) { + if (LOG.isDebugEnabled()) { + LOG.debug("Throttling recv " + zkServer.getInProcess()); + } + disableRecv(); + // following lines should not be needed since we are + // already reading + // } else { + // enableRecv(); + } + } + } + + } + + public void disableRecv() { + sk.interestOps(sk.interestOps() & (~SelectionKey.OP_READ)); + } + + public void enableRecv() { + synchronized (this.factory) { + sk.selector().wakeup(); + if (sk.isValid()) { + int interest = sk.interestOps(); + if ((interest & SelectionKey.OP_READ) == 0) { + sk.interestOps(interest | SelectionKey.OP_READ); + } + } + } + } + + private void readConnectRequest() throws IOException, InterruptedException { + if (zkServer == null) { + throw new IOException("ZooKeeperServer not running"); + } + zkServer.processConnectRequest(this, incomingBuffer); + initialized = true; + } + + /** + * clean up the socket related to a command and also make sure we flush the + * data before we do that + * + * @param pwriter + * the pwriter for a command socket + */ + private void cleanupWriterSocket(PrintWriter pwriter) { + try { + if (pwriter != null) { + pwriter.flush(); + pwriter.close(); + } + } catch (Exception e) { + LOG.info("Error closing PrintWriter ", e); + } finally { + try { + close(); + } catch (Exception e) { + LOG.error("Error closing a command socket ", e); + } + } + } + + /** + * This class wraps the sendBuffer method of NIOServerCnxn. It is + * responsible for chunking up the response to a client. Rather + * than cons'ing up a response fully in memory, which may be large + * for some commands, this class chunks up the result. + */ + private class SendBufferWriter extends Writer { + private StringBuffer sb = new StringBuffer(); + + /** + * Check if we are ready to send another chunk. + * @param force force sending, even if not a full chunk + */ + private void checkFlush(boolean force) { + if ((force && sb.length() > 0) || sb.length() > 2048) { + sendBufferSync(ByteBuffer.wrap(sb.toString().getBytes())); + // clear our internal buffer + sb.setLength(0); + } + } + + @Override + public void close() throws IOException { + if (sb == null) return; + checkFlush(true); + sb = null; // clear out the ref to ensure no reuse + } + + @Override + public void flush() throws IOException { + checkFlush(true); + } + + @Override + public void write(char[] cbuf, int off, int len) throws IOException { + sb.append(cbuf, off, len); + checkFlush(false); + } + } + + private static final String ZK_NOT_SERVING = + "This ZooKeeper instance is not currently serving requests"; + + /** + * Set of threads for commmand ports. All the 4 + * letter commands are run via a thread. Each class + * maps to a corresponding 4 letter command. CommandThread + * is the abstract class from which all the others inherit. + */ + private abstract class CommandThread extends Thread { + PrintWriter pw; + + CommandThread(PrintWriter pw) { + this.pw = pw; + } + + public void run() { + try { + commandRun(); + } catch (IOException ie) { + LOG.error("Error in running command ", ie); + } finally { + cleanupWriterSocket(pw); + } + } + + public abstract void commandRun() throws IOException; + } + + private class RuokCommand extends CommandThread { + public RuokCommand(PrintWriter pw) { + super(pw); + } + + @Override + public void commandRun() { + pw.print("imok"); + + } + } + + private class TraceMaskCommand extends CommandThread { + TraceMaskCommand(PrintWriter pw) { + super(pw); + } + + @Override + public void commandRun() { + long traceMask = ZooTrace.getTextTraceLevel(); + pw.print(traceMask); + } + } + + private class SetTraceMaskCommand extends CommandThread { + long trace = 0; + SetTraceMaskCommand(PrintWriter pw, long trace) { + super(pw); + this.trace = trace; + } + + @Override + public void commandRun() { + pw.print(trace); + } + } + + private class EnvCommand extends CommandThread { + EnvCommand(PrintWriter pw) { + super(pw); + } + + @Override + public void commandRun() { + List env = Environment.list(); + + pw.println("Environment:"); + for(Environment.Entry e : env) { + pw.print(e.getKey()); + pw.print("="); + pw.println(e.getValue()); + } + + } + } + + private class ConfCommand extends CommandThread { + ConfCommand(PrintWriter pw) { + super(pw); + } + + @Override + public void commandRun() { + if (zkServer == null) { + pw.println(ZK_NOT_SERVING); + } else { + zkServer.dumpConf(pw); + } + } + } + + private class StatResetCommand extends CommandThread { + public StatResetCommand(PrintWriter pw) { + super(pw); + } + + @Override + public void commandRun() { + if (zkServer == null) { + pw.println(ZK_NOT_SERVING); + } + else { + zkServer.serverStats().reset(); + pw.println("Server stats reset."); + } + } + } + + private class CnxnStatResetCommand extends CommandThread { + public CnxnStatResetCommand(PrintWriter pw) { + super(pw); + } + + @Override + public void commandRun() { + if (zkServer == null) { + pw.println(ZK_NOT_SERVING); + } else { + synchronized(factory.cnxns){ + for(ServerCnxn c : factory.cnxns){ + c.resetStats(); + } + } + pw.println("Connection stats reset."); + } + } + } + + private class DumpCommand extends CommandThread { + public DumpCommand(PrintWriter pw) { + super(pw); + } + + @Override + public void commandRun() { + if (zkServer == null) { + pw.println(ZK_NOT_SERVING); + } + else { + pw.println("SessionTracker dump:"); + zkServer.sessionTracker.dumpSessions(pw); + pw.println("ephemeral nodes dump:"); + zkServer.dumpEphemerals(pw); + } + } + } + + private class StatCommand extends CommandThread { + int len; + public StatCommand(PrintWriter pw, int len) { + super(pw); + this.len = len; + } + + @SuppressWarnings("unchecked") + @Override + public void commandRun() { + if (zkServer == null) { + pw.println(ZK_NOT_SERVING); + } + else { + pw.print("Zookeeper version: "); + pw.println(Version.getFullVersion()); + if (zkServer instanceof ReadOnlyZooKeeperServer) { + pw.println("READ-ONLY mode; serving only " + + "read-only clients"); + } + if (len == statCmd) { + LOG.info("Stat command output"); + pw.println("Clients:"); + // clone should be faster than iteration + // ie give up the cnxns lock faster + HashSet cnxnset; + synchronized(factory.cnxns){ + cnxnset = (HashSet)factory + .cnxns.clone(); + } + for(NIOServerCnxn c : cnxnset){ + c.dumpConnectionInfo(pw, true); + pw.println(); + } + pw.println(); + } + pw.print(zkServer.serverStats().toString()); + pw.print("Node count: "); + pw.println(zkServer.getZKDatabase().getNodeCount()); + } + + } + } + + private class ConsCommand extends CommandThread { + public ConsCommand(PrintWriter pw) { + super(pw); + } + + @SuppressWarnings("unchecked") + @Override + public void commandRun() { + if (zkServer == null) { + pw.println(ZK_NOT_SERVING); + } else { + // clone should be faster than iteration + // ie give up the cnxns lock faster + HashSet cnxns; + synchronized (factory.cnxns) { + cnxns = (HashSet) factory.cnxns.clone(); + } + for (NIOServerCnxn c : cnxns) { + c.dumpConnectionInfo(pw, false); + pw.println(); + } + pw.println(); + } + } + } + + private class WatchCommand extends CommandThread { + int len = 0; + public WatchCommand(PrintWriter pw, int len) { + super(pw); + this.len = len; + } + + @Override + public void commandRun() { + if (zkServer == null) { + pw.println(ZK_NOT_SERVING); + } else { + DataTree dt = zkServer.getZKDatabase().getDataTree(); + if (len == wchsCmd) { + dt.dumpWatchesSummary(pw); + } else if (len == wchpCmd) { + dt.dumpWatches(pw, true); + } else { + dt.dumpWatches(pw, false); + } + pw.println(); + } + } + } + + private class MonitorCommand extends CommandThread { + + MonitorCommand(PrintWriter pw) { + super(pw); + } + + @Override + public void commandRun() { + if(zkServer == null) { + pw.println(ZK_NOT_SERVING); + return; + } + ZKDatabase zkdb = zkServer.getZKDatabase(); + ServerStats stats = zkServer.serverStats(); + + print("version", Version.getFullVersion()); + + print("avg_latency", stats.getAvgLatency()); + print("max_latency", stats.getMaxLatency()); + print("min_latency", stats.getMinLatency()); + + print("packets_received", stats.getPacketsReceived()); + print("packets_sent", stats.getPacketsSent()); + print("num_alive_connections", stats.getNumAliveClientConnections()); + + print("outstanding_requests", stats.getOutstandingRequests()); + + print("server_state", stats.getServerState()); + print("znode_count", zkdb.getNodeCount()); + + print("watch_count", zkdb.getDataTree().getWatchCount()); + print("ephemerals_count", zkdb.getDataTree().getEphemeralsCount()); + print("approximate_data_size", zkdb.getDataTree().approximateDataSize()); + + OSMXBean osMbean = new OSMXBean(); + if (osMbean != null && osMbean.getUnix() == true) { + print("open_file_descriptor_count", osMbean.getOpenFileDescriptorCount()); + print("max_file_descriptor_count", osMbean.getMaxFileDescriptorCount()); + } + + if(stats.getServerState().equals("leader")) { + Leader leader = ((LeaderZooKeeperServer)zkServer).getLeader(); + + print("followers", leader.getLearners().size()); + print("synced_followers", leader.getForwardingFollowers().size()); + print("pending_syncs", leader.getNumPendingSyncs()); + } + } + + private void print(String key, long number) { + print(key, "" + number); + } + + private void print(String key, String value) { + pw.print("zk_"); + pw.print(key); + pw.print("\t"); + pw.println(value); + } + + } + + private class IsroCommand extends CommandThread { + + public IsroCommand(PrintWriter pw) { + super(pw); + } + + @Override + public void commandRun() { + if (zkServer == null) { + pw.print("null"); + } else if (zkServer instanceof ReadOnlyZooKeeperServer) { + pw.print("ro"); + } else { + pw.print("rw"); + } + } + } + + /** Return if four letter word found and responded to, otw false **/ + private boolean checkFourLetterWord(final SelectionKey k, final int len) + throws IOException + { + // We take advantage of the limited size of the length to look + // for cmds. They are all 4-bytes which fits inside of an int + String cmd = cmd2String.get(len); + if (cmd == null) { + return false; + } + LOG.info("Processing " + cmd + " command from " + + sock.socket().getRemoteSocketAddress()); + packetReceived(); + + /** cancel the selection key to remove the socket handling + * from selector. This is to prevent netcat problem wherein + * netcat immediately closes the sending side after sending the + * commands and still keeps the receiving channel open. + * The idea is to remove the selectionkey from the selector + * so that the selector does not notice the closed read on the + * socket channel and keep the socket alive to write the data to + * and makes sure to close the socket after its done writing the data + */ + if (k != null) { + try { + k.cancel(); + } catch(Exception e) { + LOG.error("Error cancelling command selection key ", e); + } + } + + final PrintWriter pwriter = new PrintWriter( + new BufferedWriter(new SendBufferWriter())); + if (len == ruokCmd) { + RuokCommand ruok = new RuokCommand(pwriter); + ruok.start(); + return true; + } else if (len == getTraceMaskCmd) { + TraceMaskCommand tmask = new TraceMaskCommand(pwriter); + tmask.start(); + return true; + } else if (len == setTraceMaskCmd) { + int rc = sock.read(incomingBuffer); + if (rc < 0) { + throw new IOException("Read error"); + } + + incomingBuffer.flip(); + long traceMask = incomingBuffer.getLong(); + ZooTrace.setTextTraceLevel(traceMask); + SetTraceMaskCommand setMask = new SetTraceMaskCommand(pwriter, traceMask); + setMask.start(); + return true; + } else if (len == enviCmd) { + EnvCommand env = new EnvCommand(pwriter); + env.start(); + return true; + } else if (len == confCmd) { + ConfCommand ccmd = new ConfCommand(pwriter); + ccmd.start(); + return true; + } else if (len == srstCmd) { + StatResetCommand strst = new StatResetCommand(pwriter); + strst.start(); + return true; + } else if (len == crstCmd) { + CnxnStatResetCommand crst = new CnxnStatResetCommand(pwriter); + crst.start(); + return true; + } else if (len == dumpCmd) { + DumpCommand dump = new DumpCommand(pwriter); + dump.start(); + return true; + } else if (len == statCmd || len == srvrCmd) { + StatCommand stat = new StatCommand(pwriter, len); + stat.start(); + return true; + } else if (len == consCmd) { + ConsCommand cons = new ConsCommand(pwriter); + cons.start(); + return true; + } else if (len == wchpCmd || len == wchcCmd || len == wchsCmd) { + WatchCommand wcmd = new WatchCommand(pwriter, len); + wcmd.start(); + return true; + } else if (len == mntrCmd) { + MonitorCommand mntr = new MonitorCommand(pwriter); + mntr.start(); + return true; + } else if (len == isroCmd) { + IsroCommand isro = new IsroCommand(pwriter); + isro.start(); + return true; + } + return false; + } + + /** Reads the first 4 bytes of lenBuffer, which could be true length or + * four letter word. + * + * @param k selection key + * @return true if length read, otw false (wasn't really the length) + * @throws IOException if buffer size exceeds maxBuffer size + */ + private boolean readLength(SelectionKey k) throws IOException { + // Read the length, now get the buffer + int len = lenBuffer.getInt(); + if (!initialized && checkFourLetterWord(sk, len)) { + return false; + } + if (len < 0 || len > BinaryInputArchive.maxBuffer) { + throw new IOException("Len error " + len); + } + if (zkServer == null) { + throw new IOException("ZooKeeperServer not running"); + } + incomingBuffer = ByteBuffer.allocate(len); + return true; + } + + public long getOutstandingRequests() { + synchronized (this) { + synchronized (this.factory) { + return outstandingRequests; + } + } + } + + /* + * (non-Javadoc) + * + * @see org.apache.zookeeper.server.ServerCnxnIface#getSessionTimeout() + */ + public int getSessionTimeout() { + return sessionTimeout; + } + + @Override + public String toString() { + return "NIOServerCnxn object with sock = " + sock + " and sk = " + sk; + } + + /* + * Close the cnxn and remove it from the factory cnxns list. + * + * This function returns immediately if the cnxn is not on the cnxns list. + */ + @Override + public void close() { + synchronized(factory.cnxns){ + // if this is not in cnxns then it's already closed + if (!factory.cnxns.remove(this)) { + return; + } + + synchronized (factory.ipMap) { + Set s = + factory.ipMap.get(sock.socket().getInetAddress()); + s.remove(this); + } + + factory.unregisterConnection(this); + + if (zkServer != null) { + zkServer.removeCnxn(this); + } + + closeSock(); + + if (sk != null) { + try { + // need to cancel this selection key from the selector + sk.cancel(); + } catch (Exception e) { + if (LOG.isDebugEnabled()) { + LOG.debug("ignoring exception during selectionkey cancel", e); + } + } + } + } + } + + /** + * Close resources associated with the sock of this cnxn. + */ + private void closeSock() { + if (sock.isOpen() == false) { + return; + } + + LOG.info("Closed socket connection for client " + + sock.socket().getRemoteSocketAddress() + + (sessionId != 0 ? + " which had sessionid 0x" + Long.toHexString(sessionId) : + " (no session established for client)")); + try { + /* + * The following sequence of code is stupid! You would think that + * only sock.close() is needed, but alas, it doesn't work that way. + * If you just do sock.close() there are cases where the socket + * doesn't actually close... + */ + sock.socket().shutdownOutput(); + } catch (IOException e) { + // This is a relatively common exception that we can't avoid + if (LOG.isDebugEnabled()) { + LOG.debug("ignoring exception during output shutdown", e); + } + } + try { + sock.socket().shutdownInput(); + } catch (IOException e) { + // This is a relatively common exception that we can't avoid + if (LOG.isDebugEnabled()) { + LOG.debug("ignoring exception during input shutdown", e); + } + } + try { + sock.socket().close(); + } catch (IOException e) { + if (LOG.isDebugEnabled()) { + LOG.debug("ignoring exception during socket close", e); + } + } + try { + sock.close(); + // XXX The next line doesn't seem to be needed, but some posts + // to forums suggest that it is needed. Keep in mind if errors in + // this section arise. + // factory.selector.wakeup(); + } catch (IOException e) { + if (LOG.isDebugEnabled()) { + LOG.debug("ignoring exception during socketchannel close", e); + } + } + } + + private final static byte fourBytes[] = new byte[4]; + + /* + * (non-Javadoc) + * + * @see org.apache.zookeeper.server.ServerCnxnIface#sendResponse(org.apache.zookeeper.proto.ReplyHeader, + * org.apache.jute.Record, java.lang.String) + */ + @Override + synchronized public void sendResponse(ReplyHeader h, Record r, String tag) { + try { + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + // Make space for length + BinaryOutputArchive bos = BinaryOutputArchive.getArchive(baos); + try { + baos.write(fourBytes); + bos.writeRecord(h, "header"); + if (r != null) { + bos.writeRecord(r, tag); + } + baos.close(); + } catch (IOException e) { + LOG.error("Error serializing response"); + } + byte b[] = baos.toByteArray(); + ByteBuffer bb = ByteBuffer.wrap(b); + bb.putInt(b.length - 4).rewind(); + sendBuffer(bb); + if (h.getXid() > 0) { + synchronized(this){ + outstandingRequests--; + } + // check throttling + synchronized (this.factory) { + if (zkServer.getInProcess() < outstandingLimit + || outstandingRequests < 1) { + sk.selector().wakeup(); + enableRecv(); + } + } + } + } catch(Exception e) { + LOG.warn("Unexpected exception. Destruction averted.", e); + } + } + + /* + * (non-Javadoc) + * + * @see org.apache.zookeeper.server.ServerCnxnIface#process(org.apache.zookeeper.proto.WatcherEvent) + */ + @Override + synchronized public void process(WatchedEvent event) { + ReplyHeader h = new ReplyHeader(-1, -1L, 0); + if (LOG.isTraceEnabled()) { + ZooTrace.logTraceMessage(LOG, ZooTrace.EVENT_DELIVERY_TRACE_MASK, + "Deliver event " + event + " to 0x" + + Long.toHexString(this.sessionId) + + " through " + this); + } + + // Convert WatchedEvent to a type that can be sent over the wire + WatcherEvent e = event.getWrapper(); + + sendResponse(h, e, "notification"); + } + + /* + * (non-Javadoc) + * + * @see org.apache.zookeeper.server.ServerCnxnIface#getSessionId() + */ + @Override + public long getSessionId() { + return sessionId; + } + + @Override + public void setSessionId(long sessionId) { + this.sessionId = sessionId; + } + + @Override + public void setSessionTimeout(int sessionTimeout) { + this.sessionTimeout = sessionTimeout; + } + + @Override + public int getInterestOps() { + return sk.isValid() ? sk.interestOps() : 0; + } + + @Override + public InetSocketAddress getRemoteSocketAddress() { + if (sock.isOpen() == false) { + return null; + } + return (InetSocketAddress) sock.socket().getRemoteSocketAddress(); + } + + @Override + protected ServerStats serverStats() { + if (zkServer == null) { + return null; + } + return zkServer.serverStats(); + } + +} diff --git a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/NIOServerCnxnFactory.java b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/NIOServerCnxnFactory.java new file mode 100644 index 000000000..8b4c46bc9 --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/NIOServerCnxnFactory.java @@ -0,0 +1,309 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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. + */ + +package org.apache.zookeeper.server; + +import java.io.IOException; +import java.net.InetAddress; +import java.net.InetSocketAddress; +import java.nio.ByteBuffer; +import java.nio.channels.SelectionKey; +import java.nio.channels.Selector; +import java.nio.channels.ServerSocketChannel; +import java.nio.channels.SocketChannel; +import java.util.ArrayList; +import java.util.Collections; +import java.util.HashMap; +import java.util.HashSet; +import java.util.Set; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class NIOServerCnxnFactory extends ServerCnxnFactory implements Runnable { + private static final Logger LOG = LoggerFactory.getLogger(NIOServerCnxnFactory.class); + + static { + Thread.setDefaultUncaughtExceptionHandler(new Thread.UncaughtExceptionHandler() { + public void uncaughtException(Thread t, Throwable e) { + LOG.error("Thread " + t + " died", e); + } + }); + /** + * this is to avoid the jvm bug: + * NullPointerException in Selector.open() + * http://bugs.sun.com/view_bug.do?bug_id=6427854 + */ + try { + Selector.open().close(); + } catch(IOException ie) { + LOG.error("Selector failed to open", ie); + } + } + + ServerSocketChannel ss; + + final Selector selector = Selector.open(); + + /** + * We use this buffer to do efficient socket I/O. Since there is a single + * sender thread per NIOServerCnxn instance, we can use a member variable to + * only allocate it once. + */ + final ByteBuffer directBuffer = ByteBuffer.allocateDirect(64 * 1024); + + final HashMap> ipMap = + new HashMap>( ); + + int maxClientCnxns = 60; + + /** + * Construct a new server connection factory which will accept an unlimited number + * of concurrent connections from each client (up to the file descriptor + * limits of the operating system). startup(zks) must be called subsequently. + * @throws IOException + */ + public NIOServerCnxnFactory() throws IOException { + } + + Thread thread; + @Override + public void configure(InetSocketAddress addr, int maxcc) throws IOException { + configureSaslLogin(); + + thread = new Thread(this, "NIOServerCxn.Factory:" + addr); + thread.setDaemon(true); + maxClientCnxns = maxcc; + this.ss = ServerSocketChannel.open(); + ss.socket().setReuseAddress(true); + LOG.info("binding to port " + addr); + ss.socket().bind(addr); + ss.configureBlocking(false); + ss.register(selector, SelectionKey.OP_ACCEPT); + } + + /** {@inheritDoc} */ + public int getMaxClientCnxnsPerHost() { + return maxClientCnxns; + } + + /** {@inheritDoc} */ + public void setMaxClientCnxnsPerHost(int max) { + maxClientCnxns = max; + } + + @Override + public void start() { + // ensure thread is started once and only once + if (thread.getState() == Thread.State.NEW) { + thread.start(); + } + } + + @Override + public void startup(ZooKeeperServer zks) throws IOException, + InterruptedException { + start(); + zks.startdata(); + zks.startup(); + setZooKeeperServer(zks); + } + + @Override + public InetSocketAddress getLocalAddress(){ + return (InetSocketAddress)ss.socket().getLocalSocketAddress(); + } + + @Override + public int getLocalPort(){ + return ss.socket().getLocalPort(); + } + + private void addCnxn(NIOServerCnxn cnxn) { + synchronized (cnxns) { + cnxns.add(cnxn); + synchronized (ipMap){ + InetAddress addr = cnxn.sock.socket().getInetAddress(); + Set s = ipMap.get(addr); + if (s == null) { + // in general we will see 1 connection from each + // host, setting the initial cap to 2 allows us + // to minimize mem usage in the common case + // of 1 entry -- we need to set the initial cap + // to 2 to avoid rehash when the first entry is added + s = new HashSet(2); + s.add(cnxn); + ipMap.put(addr,s); + } else { + s.add(cnxn); + } + } + } + } + + protected NIOServerCnxn createConnection(SocketChannel sock, + SelectionKey sk) throws IOException { + return new NIOServerCnxn(zkServer, sock, sk, this); + } + + private int getClientCnxnCount(InetAddress cl) { + // The ipMap lock covers both the map, and its contents + // (that is, the cnxn sets shouldn't be modified outside of + // this lock) + synchronized (ipMap) { + Set s = ipMap.get(cl); + if (s == null) return 0; + return s.size(); + } + } + + public void run() { + while (!ss.socket().isClosed()) { + try { + selector.select(1000); + Set selected; + synchronized (this) { + selected = selector.selectedKeys(); + } + ArrayList selectedList = new ArrayList( + selected); + Collections.shuffle(selectedList); + for (SelectionKey k : selectedList) { + if ((k.readyOps() & SelectionKey.OP_ACCEPT) != 0) { + SocketChannel sc = ((ServerSocketChannel) k + .channel()).accept(); + InetAddress ia = sc.socket().getInetAddress(); + int cnxncount = getClientCnxnCount(ia); + if (maxClientCnxns > 0 && cnxncount >= maxClientCnxns){ + LOG.warn("Too many connections from " + ia + + " - max is " + maxClientCnxns ); + sc.close(); + } else { + LOG.info("Accepted socket connection from " + + sc.socket().getRemoteSocketAddress()); + sc.configureBlocking(false); + SelectionKey sk = sc.register(selector, + SelectionKey.OP_READ); + NIOServerCnxn cnxn = createConnection(sc, sk); + sk.attach(cnxn); + addCnxn(cnxn); + } + } else if ((k.readyOps() & (SelectionKey.OP_READ | SelectionKey.OP_WRITE)) != 0) { + NIOServerCnxn c = (NIOServerCnxn) k.attachment(); + c.doIO(k); + } else { + if (LOG.isDebugEnabled()) { + LOG.debug("Unexpected ops in select " + + k.readyOps()); + } + } + } + selected.clear(); + } catch (RuntimeException e) { + LOG.warn("Ignoring unexpected runtime exception", e); + } catch (Exception e) { + LOG.warn("Ignoring exception", e); + } + } + closeAll(); + LOG.info("NIOServerCnxn factory exited run method"); + } + + /** + * clear all the connections in the selector + * + */ + @Override + @SuppressWarnings("unchecked") + synchronized public void closeAll() { + selector.wakeup(); + HashSet cnxns; + synchronized (this.cnxns) { + cnxns = (HashSet)this.cnxns.clone(); + } + // got to clear all the connections that we have in the selector + for (NIOServerCnxn cnxn: cnxns) { + try { + // don't hold this.cnxns lock as deadlock may occur + cnxn.close(); + } catch (Exception e) { + LOG.warn("Ignoring exception closing cnxn sessionid 0x" + + Long.toHexString(cnxn.sessionId), e); + } + } + } + + public void shutdown() { + try { + ss.close(); + closeAll(); + thread.interrupt(); + thread.join(); + if (login != null) { + login.shutdown(); + } + } catch (InterruptedException e) { + LOG.warn("Ignoring interrupted exception during shutdown", e); + } catch (Exception e) { + LOG.warn("Ignoring unexpected exception during shutdown", e); + } + try { + selector.close(); + } catch (IOException e) { + LOG.warn("Selector closing", e); + } + if (zkServer != null) { + zkServer.shutdown(); + } + } + + @Override + public synchronized void closeSession(long sessionId) { + selector.wakeup(); + closeSessionWithoutWakeup(sessionId); + } + + @SuppressWarnings("unchecked") + private void closeSessionWithoutWakeup(long sessionId) { + HashSet cnxns; + synchronized (this.cnxns) { + cnxns = (HashSet)this.cnxns.clone(); + } + + for (NIOServerCnxn cnxn : cnxns) { + if (cnxn.getSessionId() == sessionId) { + try { + cnxn.close(); + } catch (Exception e) { + LOG.warn("exception during session close", e); + } + break; + } + } + } + + @Override + public void join() throws InterruptedException { + thread.join(); + } + + @Override + public Iterable getConnections() { + return cnxns; + } +} diff --git a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/NettyServerCnxn.java b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/NettyServerCnxn.java new file mode 100644 index 000000000..cf43c8b22 --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/NettyServerCnxn.java @@ -0,0 +1,856 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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. + */ + +package org.apache.zookeeper.server; + +import static org.jboss.netty.buffer.ChannelBuffers.wrappedBuffer; + +import java.io.BufferedWriter; +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.io.PrintWriter; +import java.io.Writer; +import java.net.InetSocketAddress; +import java.net.SocketAddress; +import java.nio.ByteBuffer; +import java.util.AbstractSet; +import java.util.HashSet; +import java.util.List; +import java.util.Set; +import java.util.concurrent.atomic.AtomicLong; + +import org.apache.jute.BinaryInputArchive; +import org.apache.jute.BinaryOutputArchive; +import org.apache.jute.Record; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.apache.zookeeper.Environment; +import org.apache.zookeeper.Version; +import org.apache.zookeeper.WatchedEvent; +import org.apache.zookeeper.proto.ReplyHeader; +import org.apache.zookeeper.proto.WatcherEvent; +import org.apache.zookeeper.server.quorum.Leader; +import org.apache.zookeeper.server.quorum.LeaderZooKeeperServer; +import org.apache.zookeeper.server.quorum.ReadOnlyZooKeeperServer; +import org.apache.zookeeper.server.util.OSMXBean; +import org.jboss.netty.buffer.ChannelBuffer; +import org.jboss.netty.buffer.ChannelBuffers; +import org.jboss.netty.channel.Channel; +import org.jboss.netty.channel.ChannelFuture; +import org.jboss.netty.channel.MessageEvent; + +public class NettyServerCnxn extends ServerCnxn { + Logger LOG = LoggerFactory.getLogger(NettyServerCnxn.class); + Channel channel; + ChannelBuffer queuedBuffer; + volatile boolean throttled; + ByteBuffer bb; + ByteBuffer bbLen = ByteBuffer.allocate(4); + long sessionId; + int sessionTimeout; + AtomicLong outstandingCount = new AtomicLong(); + + /** The ZooKeeperServer for this connection. May be null if the server + * is not currently serving requests (for example if the server is not + * an active quorum participant. + */ + private volatile ZooKeeperServer zkServer; + + NettyServerCnxnFactory factory; + boolean initialized; + + NettyServerCnxn(Channel channel, ZooKeeperServer zks, NettyServerCnxnFactory factory) { + this.channel = channel; + this.zkServer = zks; + this.factory = factory; + if (this.factory.login != null) { + this.zooKeeperSaslServer = new ZooKeeperSaslServer(factory.login); + } + } + + @Override + public void close() { + if (LOG.isDebugEnabled()) { + LOG.debug("close called for sessionid:0x" + + Long.toHexString(sessionId)); + } + synchronized(factory.cnxns){ + // if this is not in cnxns then it's already closed + if (!factory.cnxns.remove(this)) { + if (LOG.isDebugEnabled()) { + LOG.debug("cnxns size:" + factory.cnxns.size()); + } + return; + } + if (LOG.isDebugEnabled()) { + LOG.debug("close in progress for sessionid:0x" + + Long.toHexString(sessionId)); + } + + synchronized (factory.ipMap) { + Set s = + factory.ipMap.get(((InetSocketAddress)channel + .getRemoteAddress()).getAddress()); + s.remove(this); + } + } + + if (channel.isOpen()) { + channel.close(); + } + factory.unregisterConnection(this); + } + + @Override + public long getSessionId() { + return sessionId; + } + + @Override + public int getSessionTimeout() { + return sessionTimeout; + } + + @Override + public void process(WatchedEvent event) { + ReplyHeader h = new ReplyHeader(-1, -1L, 0); + if (LOG.isTraceEnabled()) { + ZooTrace.logTraceMessage(LOG, ZooTrace.EVENT_DELIVERY_TRACE_MASK, + "Deliver event " + event + " to 0x" + + Long.toHexString(this.sessionId) + + " through " + this); + } + + // Convert WatchedEvent to a type that can be sent over the wire + WatcherEvent e = event.getWrapper(); + + try { + sendResponse(h, e, "notification"); + } catch (IOException e1) { + if (LOG.isDebugEnabled()) { + LOG.debug("Problem sending to " + getRemoteSocketAddress(), e1); + } + close(); + } + } + + private static final byte[] fourBytes = new byte[4]; + static class ResumeMessageEvent implements MessageEvent { + Channel channel; + ResumeMessageEvent(Channel channel) { + this.channel = channel; + } + @Override + public Object getMessage() {return null;} + @Override + public SocketAddress getRemoteAddress() {return null;} + @Override + public Channel getChannel() {return channel;} + @Override + public ChannelFuture getFuture() {return null;} + }; + + @Override + public void sendResponse(ReplyHeader h, Record r, String tag) + throws IOException { + if (!channel.isOpen()) { + return; + } + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + // Make space for length + BinaryOutputArchive bos = BinaryOutputArchive.getArchive(baos); + try { + baos.write(fourBytes); + bos.writeRecord(h, "header"); + if (r != null) { + bos.writeRecord(r, tag); + } + baos.close(); + } catch (IOException e) { + LOG.error("Error serializing response"); + } + byte b[] = baos.toByteArray(); + ByteBuffer bb = ByteBuffer.wrap(b); + bb.putInt(b.length - 4).rewind(); + sendBuffer(bb); + if (h.getXid() > 0) { + // zks cannot be null otherwise we would not have gotten here! + if (!zkServer.shouldThrottle(outstandingCount.decrementAndGet())) { + enableRecv(); + } + } + } + + @Override + public void setSessionId(long sessionId) { + this.sessionId = sessionId; + } + + @Override + public void enableRecv() { + if (throttled) { + throttled = false; + if (LOG.isDebugEnabled()) { + LOG.debug("Sending unthrottle event " + this); + } + channel.getPipeline().sendUpstream(new ResumeMessageEvent(channel)); + } + } + + @Override + public void sendBuffer(ByteBuffer sendBuffer) { + if (sendBuffer == ServerCnxnFactory.closeConn) { + close(); + return; + } + channel.write(wrappedBuffer(sendBuffer)); + packetSent(); + } + + /** + * clean up the socket related to a command and also make sure we flush the + * data before we do that + * + * @param pwriter + * the pwriter for a command socket + */ + private void cleanupWriterSocket(PrintWriter pwriter) { + try { + if (pwriter != null) { + pwriter.flush(); + pwriter.close(); + } + } catch (Exception e) { + LOG.info("Error closing PrintWriter ", e); + } finally { + try { + close(); + } catch (Exception e) { + LOG.error("Error closing a command socket ", e); + } + } + } + + /** + * This class wraps the sendBuffer method of NIOServerCnxn. It is + * responsible for chunking up the response to a client. Rather + * than cons'ing up a response fully in memory, which may be large + * for some commands, this class chunks up the result. + */ + private class SendBufferWriter extends Writer { + private StringBuffer sb = new StringBuffer(); + + /** + * Check if we are ready to send another chunk. + * @param force force sending, even if not a full chunk + */ + private void checkFlush(boolean force) { + if ((force && sb.length() > 0) || sb.length() > 2048) { + sendBuffer(ByteBuffer.wrap(sb.toString().getBytes())); + // clear our internal buffer + sb.setLength(0); + } + } + + @Override + public void close() throws IOException { + if (sb == null) return; + checkFlush(true); + sb = null; // clear out the ref to ensure no reuse + } + + @Override + public void flush() throws IOException { + checkFlush(true); + } + + @Override + public void write(char[] cbuf, int off, int len) throws IOException { + sb.append(cbuf, off, len); + checkFlush(false); + } + } + + private static final String ZK_NOT_SERVING = + "This ZooKeeper instance is not currently serving requests"; + + /** + * Set of threads for commmand ports. All the 4 + * letter commands are run via a thread. Each class + * maps to a correspoding 4 letter command. CommandThread + * is the abstract class from which all the others inherit. + */ + private abstract class CommandThread /*extends Thread*/ { + PrintWriter pw; + + CommandThread(PrintWriter pw) { + this.pw = pw; + } + + public void start() { + run(); + } + + public void run() { + try { + commandRun(); + } catch (IOException ie) { + LOG.error("Error in running command ", ie); + } finally { + cleanupWriterSocket(pw); + } + } + + public abstract void commandRun() throws IOException; + } + + private class RuokCommand extends CommandThread { + public RuokCommand(PrintWriter pw) { + super(pw); + } + + @Override + public void commandRun() { + pw.print("imok"); + + } + } + + private class TraceMaskCommand extends CommandThread { + TraceMaskCommand(PrintWriter pw) { + super(pw); + } + + @Override + public void commandRun() { + long traceMask = ZooTrace.getTextTraceLevel(); + pw.print(traceMask); + } + } + + private class SetTraceMaskCommand extends CommandThread { + long trace = 0; + SetTraceMaskCommand(PrintWriter pw, long trace) { + super(pw); + this.trace = trace; + } + + @Override + public void commandRun() { + pw.print(trace); + } + } + + private class EnvCommand extends CommandThread { + EnvCommand(PrintWriter pw) { + super(pw); + } + + @Override + public void commandRun() { + List env = Environment.list(); + + pw.println("Environment:"); + for(Environment.Entry e : env) { + pw.print(e.getKey()); + pw.print("="); + pw.println(e.getValue()); + } + + } + } + + private class ConfCommand extends CommandThread { + ConfCommand(PrintWriter pw) { + super(pw); + } + + @Override + public void commandRun() { + if (zkServer == null) { + pw.println(ZK_NOT_SERVING); + } else { + zkServer.dumpConf(pw); + } + } + } + + private class StatResetCommand extends CommandThread { + public StatResetCommand(PrintWriter pw) { + super(pw); + } + + @Override + public void commandRun() { + if (zkServer == null) { + pw.println(ZK_NOT_SERVING); + } + else { + zkServer.serverStats().reset(); + pw.println("Server stats reset."); + } + } + } + + private class CnxnStatResetCommand extends CommandThread { + public CnxnStatResetCommand(PrintWriter pw) { + super(pw); + } + + @Override + public void commandRun() { + if (zkServer == null) { + pw.println(ZK_NOT_SERVING); + } else { + synchronized(factory.cnxns){ + for(ServerCnxn c : factory.cnxns){ + c.resetStats(); + } + } + pw.println("Connection stats reset."); + } + } + } + + private class DumpCommand extends CommandThread { + public DumpCommand(PrintWriter pw) { + super(pw); + } + + @Override + public void commandRun() { + if (zkServer == null) { + pw.println(ZK_NOT_SERVING); + } + else { + pw.println("SessionTracker dump:"); + zkServer.sessionTracker.dumpSessions(pw); + pw.println("ephemeral nodes dump:"); + zkServer.dumpEphemerals(pw); + } + } + } + + private class StatCommand extends CommandThread { + int len; + public StatCommand(PrintWriter pw, int len) { + super(pw); + this.len = len; + } + + @Override + public void commandRun() { + if (zkServer == null) { + pw.println(ZK_NOT_SERVING); + } + else { + pw.print("Zookeeper version: "); + pw.println(Version.getFullVersion()); + if (zkServer instanceof ReadOnlyZooKeeperServer) { + pw.println("READ-ONLY mode; serving only " + + "read-only clients"); + } + if (len == statCmd) { + LOG.info("Stat command output"); + pw.println("Clients:"); + // clone should be faster than iteration + // ie give up the cnxns lock faster + HashSet cnxns; + synchronized(factory.cnxns){ + cnxns = new HashSet(factory.cnxns); + } + for(ServerCnxn c : cnxns){ + c.dumpConnectionInfo(pw, true); + pw.println(); + } + pw.println(); + } + pw.print(zkServer.serverStats().toString()); + pw.print("Node count: "); + pw.println(zkServer.getZKDatabase().getNodeCount()); + } + + } + } + + private class ConsCommand extends CommandThread { + public ConsCommand(PrintWriter pw) { + super(pw); + } + + @Override + public void commandRun() { + if (zkServer == null) { + pw.println(ZK_NOT_SERVING); + } else { + // clone should be faster than iteration + // ie give up the cnxns lock faster + AbstractSet cnxns; + synchronized (factory.cnxns) { + cnxns = new HashSet(factory.cnxns); + } + for (ServerCnxn c : cnxns) { + c.dumpConnectionInfo(pw, false); + pw.println(); + } + pw.println(); + } + } + } + + private class WatchCommand extends CommandThread { + int len = 0; + public WatchCommand(PrintWriter pw, int len) { + super(pw); + this.len = len; + } + + @Override + public void commandRun() { + if (zkServer == null) { + pw.println(ZK_NOT_SERVING); + } else { + DataTree dt = zkServer.getZKDatabase().getDataTree(); + if (len == wchsCmd) { + dt.dumpWatchesSummary(pw); + } else if (len == wchpCmd) { + dt.dumpWatches(pw, true); + } else { + dt.dumpWatches(pw, false); + } + pw.println(); + } + } + } + + private class MonitorCommand extends CommandThread { + + MonitorCommand(PrintWriter pw) { + super(pw); + } + + @Override + public void commandRun() { + if(zkServer == null) { + pw.println(ZK_NOT_SERVING); + return; + } + ZKDatabase zkdb = zkServer.getZKDatabase(); + ServerStats stats = zkServer.serverStats(); + + print("version", Version.getFullVersion()); + + print("avg_latency", stats.getAvgLatency()); + print("max_latency", stats.getMaxLatency()); + print("min_latency", stats.getMinLatency()); + + print("packets_received", stats.getPacketsReceived()); + print("packets_sent", stats.getPacketsSent()); + print("num_alive_connections", stats.getNumAliveClientConnections()); + + print("outstanding_requests", stats.getOutstandingRequests()); + + print("server_state", stats.getServerState()); + print("znode_count", zkdb.getNodeCount()); + + print("watch_count", zkdb.getDataTree().getWatchCount()); + print("ephemerals_count", zkdb.getDataTree().getEphemeralsCount()); + print("approximate_data_size", zkdb.getDataTree().approximateDataSize()); + + OSMXBean osMbean = new OSMXBean(); + if (osMbean != null && osMbean.getUnix() == true) { + print("open_file_descriptor_count", osMbean.getOpenFileDescriptorCount()); + print("max_file_descriptor_count", osMbean.getMaxFileDescriptorCount()); + } + + if(stats.getServerState().equals("leader")) { + Leader leader = ((LeaderZooKeeperServer)zkServer).getLeader(); + + print("followers", leader.getLearners().size()); + print("synced_followers", leader.getForwardingFollowers().size()); + print("pending_syncs", leader.getNumPendingSyncs()); + } + } + + private void print(String key, long number) { + print(key, "" + number); + } + + private void print(String key, String value) { + pw.print("zk_"); + pw.print(key); + pw.print("\t"); + pw.println(value); + } + + } + + private class IsroCommand extends CommandThread { + + public IsroCommand(PrintWriter pw) { + super(pw); + } + + @Override + public void commandRun() { + if (zkServer == null) { + pw.print("null"); + } else if (zkServer instanceof ReadOnlyZooKeeperServer) { + pw.print("ro"); + } else { + pw.print("rw"); + } + } + } + + /** Return if four letter word found and responded to, otw false **/ + private boolean checkFourLetterWord(final Channel channel, + ChannelBuffer message, final int len) throws IOException + { + // We take advantage of the limited size of the length to look + // for cmds. They are all 4-bytes which fits inside of an int + String cmd = cmd2String.get(len); + if (cmd == null) { + return false; + } + channel.setInterestOps(0).awaitUninterruptibly(); + LOG.info("Processing " + cmd + " command from " + + channel.getRemoteAddress()); + packetReceived(); + + final PrintWriter pwriter = new PrintWriter( + new BufferedWriter(new SendBufferWriter())); + if (len == ruokCmd) { + RuokCommand ruok = new RuokCommand(pwriter); + ruok.start(); + return true; + } else if (len == getTraceMaskCmd) { + TraceMaskCommand tmask = new TraceMaskCommand(pwriter); + tmask.start(); + return true; + } else if (len == setTraceMaskCmd) { + ByteBuffer mask = ByteBuffer.allocate(4); + message.readBytes(mask); + + bb.flip(); + long traceMask = mask.getLong(); + ZooTrace.setTextTraceLevel(traceMask); + SetTraceMaskCommand setMask = new SetTraceMaskCommand(pwriter, traceMask); + setMask.start(); + return true; + } else if (len == enviCmd) { + EnvCommand env = new EnvCommand(pwriter); + env.start(); + return true; + } else if (len == confCmd) { + ConfCommand ccmd = new ConfCommand(pwriter); + ccmd.start(); + return true; + } else if (len == srstCmd) { + StatResetCommand strst = new StatResetCommand(pwriter); + strst.start(); + return true; + } else if (len == crstCmd) { + CnxnStatResetCommand crst = new CnxnStatResetCommand(pwriter); + crst.start(); + return true; + } else if (len == dumpCmd) { + DumpCommand dump = new DumpCommand(pwriter); + dump.start(); + return true; + } else if (len == statCmd || len == srvrCmd) { + StatCommand stat = new StatCommand(pwriter, len); + stat.start(); + return true; + } else if (len == consCmd) { + ConsCommand cons = new ConsCommand(pwriter); + cons.start(); + return true; + } else if (len == wchpCmd || len == wchcCmd || len == wchsCmd) { + WatchCommand wcmd = new WatchCommand(pwriter, len); + wcmd.start(); + return true; + } else if (len == mntrCmd) { + MonitorCommand mntr = new MonitorCommand(pwriter); + mntr.start(); + return true; + } else if (len == isroCmd) { + IsroCommand isro = new IsroCommand(pwriter); + isro.start(); + return true; + } + return false; + } + + public void receiveMessage(ChannelBuffer message) { + try { + while(message.readable() && !throttled) { + if (bb != null) { + if (LOG.isTraceEnabled()) { + LOG.trace("message readable " + message.readableBytes() + + " bb len " + bb.remaining() + " " + bb); + ByteBuffer dat = bb.duplicate(); + dat.flip(); + LOG.trace(Long.toHexString(sessionId) + + " bb 0x" + + ChannelBuffers.hexDump( + ChannelBuffers.copiedBuffer(dat))); + } + + if (bb.remaining() > message.readableBytes()) { + int newLimit = bb.position() + message.readableBytes(); + bb.limit(newLimit); + } + message.readBytes(bb); + bb.limit(bb.capacity()); + + if (LOG.isTraceEnabled()) { + LOG.trace("after readBytes message readable " + + message.readableBytes() + + " bb len " + bb.remaining() + " " + bb); + ByteBuffer dat = bb.duplicate(); + dat.flip(); + LOG.trace("after readbytes " + + Long.toHexString(sessionId) + + " bb 0x" + + ChannelBuffers.hexDump( + ChannelBuffers.copiedBuffer(dat))); + } + if (bb.remaining() == 0) { + packetReceived(); + bb.flip(); + + ZooKeeperServer zks = this.zkServer; + if (zks == null) { + throw new IOException("ZK down"); + } + if (initialized) { + zks.processPacket(this, bb); + + if (zks.shouldThrottle(outstandingCount.incrementAndGet())) { + disableRecvNoWait(); + } + } else { + LOG.debug("got conn req request from " + + getRemoteSocketAddress()); + zks.processConnectRequest(this, bb); + initialized = true; + } + bb = null; + } + } else { + if (LOG.isTraceEnabled()) { + LOG.trace("message readable " + + message.readableBytes() + + " bblenrem " + bbLen.remaining()); + ByteBuffer dat = bbLen.duplicate(); + dat.flip(); + LOG.trace(Long.toHexString(sessionId) + + " bbLen 0x" + + ChannelBuffers.hexDump( + ChannelBuffers.copiedBuffer(dat))); + } + + if (message.readableBytes() < bbLen.remaining()) { + bbLen.limit(bbLen.position() + message.readableBytes()); + } + message.readBytes(bbLen); + bbLen.limit(bbLen.capacity()); + if (bbLen.remaining() == 0) { + bbLen.flip(); + + if (LOG.isTraceEnabled()) { + LOG.trace(Long.toHexString(sessionId) + + " bbLen 0x" + + ChannelBuffers.hexDump( + ChannelBuffers.copiedBuffer(bbLen))); + } + int len = bbLen.getInt(); + if (LOG.isTraceEnabled()) { + LOG.trace(Long.toHexString(sessionId) + + " bbLen len is " + len); + } + + bbLen.clear(); + if (!initialized) { + if (checkFourLetterWord(channel, message, len)) { + return; + } + } + if (len < 0 || len > BinaryInputArchive.maxBuffer) { + throw new IOException("Len error " + len); + } + bb = ByteBuffer.allocate(len); + } + } + } + } catch(IOException e) { + LOG.warn("Closing connection to " + getRemoteSocketAddress(), e); + close(); + } + } + + @Override + public void disableRecv() { + disableRecvNoWait().awaitUninterruptibly(); + } + + private ChannelFuture disableRecvNoWait() { + throttled = true; + if (LOG.isDebugEnabled()) { + LOG.debug("Throttling - disabling recv " + this); + } + return channel.setReadable(false); + } + + @Override + public long getOutstandingRequests() { + return outstandingCount.longValue(); + } + + @Override + public void setSessionTimeout(int sessionTimeout) { + this.sessionTimeout = sessionTimeout; + } + + @Override + public int getInterestOps() { + return channel.getInterestOps(); + } + + @Override + public InetSocketAddress getRemoteSocketAddress() { + return (InetSocketAddress)channel.getRemoteAddress(); + } + + /** Send close connection packet to the client. + */ + @Override + public void sendCloseSession() { + sendBuffer(ServerCnxnFactory.closeConn); + } + + @Override + protected ServerStats serverStats() { + if (zkServer == null) { + return null; + } + return zkServer.serverStats(); + } + +} diff --git a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/NettyServerCnxnFactory.java b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/NettyServerCnxnFactory.java new file mode 100644 index 000000000..7a84ce911 --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/NettyServerCnxnFactory.java @@ -0,0 +1,403 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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. + */ + +package org.apache.zookeeper.server; + +import static org.jboss.netty.buffer.ChannelBuffers.dynamicBuffer; + +import java.io.IOException; +import java.net.InetAddress; +import java.net.InetSocketAddress; +import java.util.HashMap; +import java.util.HashSet; +import java.util.Set; +import java.util.concurrent.Executors; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.jboss.netty.bootstrap.ServerBootstrap; +import org.jboss.netty.buffer.ChannelBuffer; +import org.jboss.netty.buffer.ChannelBuffers; +import org.jboss.netty.channel.Channel; +import org.jboss.netty.channel.ChannelHandler.Sharable; +import org.jboss.netty.channel.ChannelHandlerContext; +import org.jboss.netty.channel.ChannelStateEvent; +import org.jboss.netty.channel.ExceptionEvent; +import org.jboss.netty.channel.MessageEvent; +import org.jboss.netty.channel.SimpleChannelHandler; +import org.jboss.netty.channel.WriteCompletionEvent; +import org.jboss.netty.channel.group.ChannelGroup; +import org.jboss.netty.channel.group.DefaultChannelGroup; +import org.jboss.netty.channel.socket.nio.NioServerSocketChannelFactory; + +public class NettyServerCnxnFactory extends ServerCnxnFactory { + Logger LOG = LoggerFactory.getLogger(NettyServerCnxnFactory.class); + + ServerBootstrap bootstrap; + Channel parentChannel; + ChannelGroup allChannels = new DefaultChannelGroup("zkServerCnxns"); + HashMap> ipMap = + new HashMap>( ); + InetSocketAddress localAddress; + int maxClientCnxns = 60; + + /** + * This is an inner class since we need to extend SimpleChannelHandler, but + * NettyServerCnxnFactory already extends ServerCnxnFactory. By making it inner + * this class gets access to the member variables and methods. + */ + @Sharable + class CnxnChannelHandler extends SimpleChannelHandler { + + @Override + public void channelClosed(ChannelHandlerContext ctx, ChannelStateEvent e) + throws Exception + { + if (LOG.isTraceEnabled()) { + LOG.trace("Channel closed " + e); + } + allChannels.remove(ctx.getChannel()); + } + + @Override + public void channelConnected(ChannelHandlerContext ctx, + ChannelStateEvent e) throws Exception + { + if (LOG.isTraceEnabled()) { + LOG.trace("Channel connected " + e); + } + allChannels.add(ctx.getChannel()); + NettyServerCnxn cnxn = new NettyServerCnxn(ctx.getChannel(), + zkServer, NettyServerCnxnFactory.this); + ctx.setAttachment(cnxn); + addCnxn(cnxn); + } + + @Override + public void channelDisconnected(ChannelHandlerContext ctx, + ChannelStateEvent e) throws Exception + { + if (LOG.isTraceEnabled()) { + LOG.trace("Channel disconnected " + e); + } + NettyServerCnxn cnxn = (NettyServerCnxn) ctx.getAttachment(); + if (cnxn != null) { + if (LOG.isTraceEnabled()) { + LOG.trace("Channel disconnect caused close " + e); + } + cnxn.close(); + } + } + + @Override + public void exceptionCaught(ChannelHandlerContext ctx, ExceptionEvent e) + throws Exception + { + LOG.warn("Exception caught " + e, e.getCause()); + NettyServerCnxn cnxn = (NettyServerCnxn) ctx.getAttachment(); + if (cnxn != null) { + if (LOG.isDebugEnabled()) { + LOG.debug("Closing " + cnxn); + cnxn.close(); + } + } + } + + @Override + public void messageReceived(ChannelHandlerContext ctx, MessageEvent e) + throws Exception + { + if (LOG.isTraceEnabled()) { + LOG.trace("message received called " + e.getMessage()); + } + try { + if (LOG.isDebugEnabled()) { + LOG.debug("New message " + e.toString() + + " from " + ctx.getChannel()); + } + NettyServerCnxn cnxn = (NettyServerCnxn)ctx.getAttachment(); + synchronized(cnxn) { + processMessage(e, cnxn); + } + } catch(Exception ex) { + LOG.error("Unexpected exception in receive", ex); + throw ex; + } + } + + private void processMessage(MessageEvent e, NettyServerCnxn cnxn) { + if (LOG.isDebugEnabled()) { + LOG.debug(Long.toHexString(cnxn.sessionId) + " queuedBuffer: " + + cnxn.queuedBuffer); + } + + if (e instanceof NettyServerCnxn.ResumeMessageEvent) { + LOG.debug("Received ResumeMessageEvent"); + if (cnxn.queuedBuffer != null) { + if (LOG.isTraceEnabled()) { + LOG.trace("processing queue " + + Long.toHexString(cnxn.sessionId) + + " queuedBuffer 0x" + + ChannelBuffers.hexDump(cnxn.queuedBuffer)); + } + cnxn.receiveMessage(cnxn.queuedBuffer); + if (!cnxn.queuedBuffer.readable()) { + LOG.debug("Processed queue - no bytes remaining"); + cnxn.queuedBuffer = null; + } else { + LOG.debug("Processed queue - bytes remaining"); + } + } else { + LOG.debug("queue empty"); + } + cnxn.channel.setReadable(true); + } else { + ChannelBuffer buf = (ChannelBuffer)e.getMessage(); + if (LOG.isTraceEnabled()) { + LOG.trace(Long.toHexString(cnxn.sessionId) + + " buf 0x" + + ChannelBuffers.hexDump(buf)); + } + + if (cnxn.throttled) { + LOG.debug("Received message while throttled"); + // we are throttled, so we need to queue + if (cnxn.queuedBuffer == null) { + LOG.debug("allocating queue"); + cnxn.queuedBuffer = dynamicBuffer(buf.readableBytes()); + } + cnxn.queuedBuffer.writeBytes(buf); + LOG.debug(Long.toHexString(cnxn.sessionId) + + " queuedBuffer 0x" + + ChannelBuffers.hexDump(cnxn.queuedBuffer)); + } else { + LOG.debug("not throttled"); + if (cnxn.queuedBuffer != null) { + if (LOG.isTraceEnabled()) { + LOG.trace(Long.toHexString(cnxn.sessionId) + + " queuedBuffer 0x" + + ChannelBuffers.hexDump(cnxn.queuedBuffer)); + } + cnxn.queuedBuffer.writeBytes(buf); + if (LOG.isTraceEnabled()) { + LOG.trace(Long.toHexString(cnxn.sessionId) + + " queuedBuffer 0x" + + ChannelBuffers.hexDump(cnxn.queuedBuffer)); + } + + cnxn.receiveMessage(cnxn.queuedBuffer); + if (!cnxn.queuedBuffer.readable()) { + LOG.debug("Processed queue - no bytes remaining"); + cnxn.queuedBuffer = null; + } else { + LOG.debug("Processed queue - bytes remaining"); + } + } else { + cnxn.receiveMessage(buf); + if (buf.readable()) { + if (LOG.isTraceEnabled()) { + LOG.trace("Before copy " + buf); + } + cnxn.queuedBuffer = dynamicBuffer(buf.readableBytes()); + cnxn.queuedBuffer.writeBytes(buf); + if (LOG.isTraceEnabled()) { + LOG.trace("Copy is " + cnxn.queuedBuffer); + LOG.trace(Long.toHexString(cnxn.sessionId) + + " queuedBuffer 0x" + + ChannelBuffers.hexDump(cnxn.queuedBuffer)); + } + } + } + } + } + } + + @Override + public void writeComplete(ChannelHandlerContext ctx, + WriteCompletionEvent e) throws Exception + { + if (LOG.isTraceEnabled()) { + LOG.trace("write complete " + e); + } + } + + } + + CnxnChannelHandler channelHandler = new CnxnChannelHandler(); + + NettyServerCnxnFactory() { + bootstrap = new ServerBootstrap( + new NioServerSocketChannelFactory( + Executors.newCachedThreadPool(), + Executors.newCachedThreadPool())); + // parent channel + bootstrap.setOption("reuseAddress", true); + // child channels + bootstrap.setOption("child.tcpNoDelay", true); + /* set socket linger to off, so that socket close does not block */ + bootstrap.setOption("child.soLinger", -1); + + bootstrap.getPipeline().addLast("servercnxnfactory", channelHandler); + } + + @Override + public void closeAll() { + if (LOG.isDebugEnabled()) { + LOG.debug("closeAll()"); + } + + NettyServerCnxn[] allCnxns = null; + synchronized (cnxns) { + allCnxns = cnxns.toArray(new NettyServerCnxn[cnxns.size()]); + } + // got to clear all the connections that we have in the selector + for (NettyServerCnxn cnxn : allCnxns) { + try { + cnxn.close(); + } catch (Exception e) { + LOG.warn("Ignoring exception closing cnxn sessionid 0x" + + Long.toHexString(cnxn.getSessionId()), e); + } + } + if (LOG.isDebugEnabled()) { + LOG.debug("allChannels size:" + allChannels.size() + " cnxns size:" + + allCnxns.length); + } + } + + @Override + public void closeSession(long sessionId) { + if (LOG.isDebugEnabled()) { + LOG.debug("closeSession sessionid:0x" + sessionId); + } + NettyServerCnxn[] allCnxns = null; + synchronized (cnxns) { + allCnxns = cnxns.toArray(new NettyServerCnxn[cnxns.size()]); + } + for (NettyServerCnxn cnxn : allCnxns) { + if (cnxn.getSessionId() == sessionId) { + try { + cnxn.close(); + } catch (Exception e) { + LOG.warn("exception during session close", e); + } + break; + } + } + } + + @Override + public void configure(InetSocketAddress addr, int maxClientCnxns) + throws IOException + { + configureSaslLogin(); + localAddress = addr; + this.maxClientCnxns = maxClientCnxns; + } + + /** {@inheritDoc} */ + public int getMaxClientCnxnsPerHost() { + return maxClientCnxns; + } + + /** {@inheritDoc} */ + public void setMaxClientCnxnsPerHost(int max) { + maxClientCnxns = max; + } + + @Override + public int getLocalPort() { + return localAddress.getPort(); + } + + boolean killed; + @Override + public void join() throws InterruptedException { + synchronized(this) { + while(!killed) { + wait(); + } + } + } + + @Override + public void shutdown() { + LOG.info("shutdown called " + localAddress); + if (login != null) { + login.shutdown(); + } + // null if factory never started + if (parentChannel != null) { + parentChannel.close().awaitUninterruptibly(); + closeAll(); + allChannels.close().awaitUninterruptibly(); + bootstrap.releaseExternalResources(); + } + + if (zkServer != null) { + zkServer.shutdown(); + } + synchronized(this) { + killed = true; + notifyAll(); + } + } + + @Override + public void start() { + LOG.info("binding to port " + localAddress); + parentChannel = bootstrap.bind(localAddress); + } + + @Override + public void startup(ZooKeeperServer zks) throws IOException, + InterruptedException { + start(); + zks.startdata(); + zks.startup(); + setZooKeeperServer(zks); + } + + @Override + public Iterable getConnections() { + return cnxns; + } + + @Override + public InetSocketAddress getLocalAddress() { + return localAddress; + } + + private void addCnxn(NettyServerCnxn cnxn) { + synchronized (cnxns) { + cnxns.add(cnxn); + synchronized (ipMap){ + InetAddress addr = + ((InetSocketAddress)cnxn.channel.getRemoteAddress()) + .getAddress(); + Set s = ipMap.get(addr); + if (s == null) { + s = new HashSet(); + } + s.add(cnxn); + ipMap.put(addr,s); + } + } + } + +} diff --git a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/ObserverBean.java b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/ObserverBean.java new file mode 100644 index 000000000..4e0e82a8e --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/ObserverBean.java @@ -0,0 +1,45 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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. + */ + +package org.apache.zookeeper.server; + +import org.apache.zookeeper.server.quorum.Observer; +import org.apache.zookeeper.server.quorum.ObserverMXBean; + +/** + * ObserverBean + * + */ +public class ObserverBean extends ZooKeeperServerBean implements ObserverMXBean{ + + private Observer observer; + + public ObserverBean(Observer observer, ZooKeeperServer zks) { + super(zks); + this.observer = observer; + } + + public int getPendingRevalidationCount() { + return this.observer.getPendingRevalidationsCount(); + } + + public String getQuorumAddress() { + return observer.getSocket().toString(); + } + +} diff --git a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/PrepRequestProcessor.java b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/PrepRequestProcessor.java new file mode 100644 index 000000000..f636d2a87 --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/PrepRequestProcessor.java @@ -0,0 +1,766 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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. + */ + +package org.apache.zookeeper.server; + +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.nio.ByteBuffer; +import java.util.ArrayList; +import java.util.HashSet; +import java.util.HashMap; +import java.util.Iterator; +import java.util.LinkedList; +import java.util.List; +import java.util.ListIterator; +import java.util.Locale; +import java.util.Set; +import java.util.concurrent.LinkedBlockingQueue; + +import org.apache.jute.Record; +import org.apache.jute.BinaryOutputArchive; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.apache.zookeeper.CreateMode; +import org.apache.zookeeper.KeeperException; +import org.apache.zookeeper.MultiTransactionRecord; +import org.apache.zookeeper.Op; +import org.apache.zookeeper.ZooDefs; +import org.apache.zookeeper.KeeperException.Code; +import org.apache.zookeeper.ZooDefs.OpCode; +import org.apache.zookeeper.common.PathUtils; +import org.apache.zookeeper.data.ACL; +import org.apache.zookeeper.data.Id; +import org.apache.zookeeper.data.StatPersisted; +import org.apache.zookeeper.proto.CreateRequest; +import org.apache.zookeeper.proto.DeleteRequest; +import org.apache.zookeeper.proto.SetACLRequest; +import org.apache.zookeeper.proto.SetDataRequest; +import org.apache.zookeeper.proto.CheckVersionRequest; +import org.apache.zookeeper.server.ZooKeeperServer.ChangeRecord; +import org.apache.zookeeper.server.auth.AuthenticationProvider; +import org.apache.zookeeper.server.auth.ProviderRegistry; +import org.apache.zookeeper.server.quorum.Leader.XidRolloverException; +import org.apache.zookeeper.txn.CreateSessionTxn; +import org.apache.zookeeper.txn.CreateTxn; +import org.apache.zookeeper.txn.DeleteTxn; +import org.apache.zookeeper.txn.ErrorTxn; +import org.apache.zookeeper.txn.SetACLTxn; +import org.apache.zookeeper.txn.SetDataTxn; +import org.apache.zookeeper.txn.CheckVersionTxn; +import org.apache.zookeeper.txn.Txn; +import org.apache.zookeeper.txn.MultiTxn; +import org.apache.zookeeper.txn.TxnHeader; + +/** + * This request processor is generally at the start of a RequestProcessor + * change. It sets up any transactions associated with requests that change the + * state of the system. It counts on ZooKeeperServer to update + * outstandingRequests, so that it can take into account transactions that are + * in the queue to be applied when generating a transaction. + */ +public class PrepRequestProcessor extends Thread implements RequestProcessor { + private static final Logger LOG = LoggerFactory.getLogger(PrepRequestProcessor.class); + + static boolean skipACL; + static { + skipACL = System.getProperty("zookeeper.skipACL", "no").equals("yes"); + if (skipACL) { + LOG.info("zookeeper.skipACL==\"yes\", ACL checks will be skipped"); + } + } + + /** + * this is only for testing purposes. + * should never be useed otherwise + */ + private static boolean failCreate = false; + + LinkedBlockingQueue submittedRequests = new LinkedBlockingQueue(); + + RequestProcessor nextProcessor; + + ZooKeeperServer zks; + + public PrepRequestProcessor(ZooKeeperServer zks, + RequestProcessor nextProcessor) { + super("ProcessThread(sid:" + zks.getServerId() + + " cport:" + zks.getClientPort() + "):"); + this.nextProcessor = nextProcessor; + this.zks = zks; + } + + /** + * method for tests to set failCreate + * @param b + */ + public static void setFailCreate(boolean b) { + failCreate = b; + } + @Override + public void run() { + try { + while (true) { + Request request = submittedRequests.take(); + long traceMask = ZooTrace.CLIENT_REQUEST_TRACE_MASK; + if (request.type == OpCode.ping) { + traceMask = ZooTrace.CLIENT_PING_TRACE_MASK; + } + if (LOG.isTraceEnabled()) { + ZooTrace.logRequest(LOG, traceMask, 'P', request, ""); + } + if (Request.requestOfDeath == request) { + break; + } + pRequest(request); + } + } catch (InterruptedException e) { + LOG.error("Unexpected interruption", e); + } catch (RequestProcessorException e) { + if (e.getCause() instanceof XidRolloverException) { + LOG.info(e.getCause().getMessage()); + } + LOG.error("Unexpected exception", e); + } catch (Exception e) { + LOG.error("Unexpected exception", e); + } + LOG.info("PrepRequestProcessor exited loop!"); + } + + ChangeRecord getRecordForPath(String path) throws KeeperException.NoNodeException { + ChangeRecord lastChange = null; + synchronized (zks.outstandingChanges) { + lastChange = zks.outstandingChangesForPath.get(path); + /* + for (int i = 0; i < zks.outstandingChanges.size(); i++) { + ChangeRecord c = zks.outstandingChanges.get(i); + if (c.path.equals(path)) { + lastChange = c; + } + } + */ + if (lastChange == null) { + DataNode n = zks.getZKDatabase().getNode(path); + if (n != null) { + Long acl; + Set children; + synchronized(n) { + acl = n.acl; + children = n.getChildren(); + } + lastChange = new ChangeRecord(-1, path, n.stat, + children != null ? children.size() : 0, + zks.getZKDatabase().convertLong(acl)); + } + } + } + if (lastChange == null || lastChange.stat == null) { + throw new KeeperException.NoNodeException(path); + } + return lastChange; + } + + void addChangeRecord(ChangeRecord c) { + synchronized (zks.outstandingChanges) { + zks.outstandingChanges.add(c); + zks.outstandingChangesForPath.put(c.path, c); + } + } + + /** + * Grab current pending change records for each op in a multi-op. + * + * This is used inside MultiOp error code path to rollback in the event + * of a failed multi-op. + * + * @param multiRequest + */ + HashMap getPendingChanges(MultiTransactionRecord multiRequest) { + HashMap pendingChangeRecords = new HashMap(); + + for(Op op: multiRequest) { + String path = op.getPath(); + + try { + ChangeRecord cr = getRecordForPath(path); + if (cr != null) { + pendingChangeRecords.put(path, cr); + } + /* + * ZOOKEEPER-1624 - We need to store for parent's ChangeRecord + * of the parent node of a request. So that if this is a + * sequential node creation request, rollbackPendingChanges() + * can restore previous parent's ChangeRecord correctly. + * + * Otherwise, sequential node name generation will be incorrect + * for a subsequent request. + */ + int lastSlash = path.lastIndexOf('/'); + if (lastSlash == -1 || path.indexOf('\0') != -1) { + continue; + } + String parentPath = path.substring(0, lastSlash); + ChangeRecord parentCr = getRecordForPath(parentPath); + if (parentCr != null) { + pendingChangeRecords.put(parentPath, parentCr); + } + } catch (KeeperException.NoNodeException e) { + // ignore this one + } + } + + return pendingChangeRecords; + } + + /** + * Rollback pending changes records from a failed multi-op. + * + * If a multi-op fails, we can't leave any invalid change records we created + * around. We also need to restore their prior value (if any) if their prior + * value is still valid. + * + * @param zxid + * @param pendingChangeRecords + */ + void rollbackPendingChanges(long zxid, HashMappendingChangeRecords) { + + synchronized (zks.outstandingChanges) { + // Grab a list iterator starting at the END of the list so we can iterate in reverse + ListIterator iter = zks.outstandingChanges.listIterator(zks.outstandingChanges.size()); + while (iter.hasPrevious()) { + ChangeRecord c = iter.previous(); + if (c.zxid == zxid) { + iter.remove(); + zks.outstandingChangesForPath.remove(c.path); + } else { + break; + } + } + + boolean empty = zks.outstandingChanges.isEmpty(); + long firstZxid = 0; + if (!empty) { + firstZxid = zks.outstandingChanges.get(0).zxid; + } + + Iterator priorIter = pendingChangeRecords.values().iterator(); + while (priorIter.hasNext()) { + ChangeRecord c = priorIter.next(); + + /* Don't apply any prior change records less than firstZxid */ + if (!empty && (c.zxid < firstZxid)) { + continue; + } + + zks.outstandingChangesForPath.put(c.path, c); + } + } + } + + static void checkACL(ZooKeeperServer zks, List acl, int perm, + List ids) throws KeeperException.NoAuthException { + if (skipACL) { + return; + } + if (acl == null || acl.size() == 0) { + return; + } + for (Id authId : ids) { + if (authId.getScheme().equals("super")) { + return; + } + } + for (ACL a : acl) { + Id id = a.getId(); + if ((a.getPerms() & perm) != 0) { + if (id.getScheme().equals("world") + && id.getId().equals("anyone")) { + return; + } + AuthenticationProvider ap = ProviderRegistry.getProvider(id + .getScheme()); + if (ap != null) { + for (Id authId : ids) { + if (authId.getScheme().equals(id.getScheme()) + && ap.matches(authId.getId(), id.getId())) { + return; + } + } + } + } + } + throw new KeeperException.NoAuthException(); + } + + /** + * This method will be called inside the ProcessRequestThread, which is a + * singleton, so there will be a single thread calling this code. + * + * @param type + * @param zxid + * @param request + * @param record + */ + @SuppressWarnings("unchecked") + protected void pRequest2Txn(int type, long zxid, Request request, Record record, boolean deserialize) + throws KeeperException, IOException, RequestProcessorException + { + request.hdr = new TxnHeader(request.sessionId, request.cxid, zxid, + zks.getTime(), type); + + switch (type) { + case OpCode.create: + zks.sessionTracker.checkSession(request.sessionId, request.getOwner()); + CreateRequest createRequest = (CreateRequest)record; + if(deserialize) + ByteBufferInputStream.byteBuffer2Record(request.request, createRequest); + String path = createRequest.getPath(); + int lastSlash = path.lastIndexOf('/'); + if (lastSlash == -1 || path.indexOf('\0') != -1 || failCreate) { + LOG.info("Invalid path " + path + " with session 0x" + + Long.toHexString(request.sessionId)); + throw new KeeperException.BadArgumentsException(path); + } + List listACL = removeDuplicates(createRequest.getAcl()); + if (!fixupACL(request.authInfo, listACL)) { + throw new KeeperException.InvalidACLException(path); + } + String parentPath = path.substring(0, lastSlash); + ChangeRecord parentRecord = getRecordForPath(parentPath); + + checkACL(zks, parentRecord.acl, ZooDefs.Perms.CREATE, + request.authInfo); + int parentCVersion = parentRecord.stat.getCversion(); + CreateMode createMode = + CreateMode.fromFlag(createRequest.getFlags()); + if (createMode.isSequential()) { + path = path + String.format(Locale.ENGLISH, "%010d", parentCVersion); + } + try { + PathUtils.validatePath(path); + } catch(IllegalArgumentException ie) { + LOG.info("Invalid path " + path + " with session 0x" + + Long.toHexString(request.sessionId)); + throw new KeeperException.BadArgumentsException(path); + } + try { + if (getRecordForPath(path) != null) { + throw new KeeperException.NodeExistsException(path); + } + } catch (KeeperException.NoNodeException e) { + // ignore this one + } + boolean ephemeralParent = parentRecord.stat.getEphemeralOwner() != 0; + if (ephemeralParent) { + throw new KeeperException.NoChildrenForEphemeralsException(path); + } + int newCversion = parentRecord.stat.getCversion()+1; + request.txn = new CreateTxn(path, createRequest.getData(), + listACL, + createMode.isEphemeral(), newCversion); + StatPersisted s = new StatPersisted(); + if (createMode.isEphemeral()) { + s.setEphemeralOwner(request.sessionId); + } + parentRecord = parentRecord.duplicate(request.hdr.getZxid()); + parentRecord.childCount++; + parentRecord.stat.setCversion(newCversion); + addChangeRecord(parentRecord); + addChangeRecord(new ChangeRecord(request.hdr.getZxid(), path, s, + 0, listACL)); + break; + case OpCode.delete: + zks.sessionTracker.checkSession(request.sessionId, request.getOwner()); + DeleteRequest deleteRequest = (DeleteRequest)record; + if(deserialize) + ByteBufferInputStream.byteBuffer2Record(request.request, deleteRequest); + path = deleteRequest.getPath(); + lastSlash = path.lastIndexOf('/'); + if (lastSlash == -1 || path.indexOf('\0') != -1 + || zks.getZKDatabase().isSpecialPath(path)) { + throw new KeeperException.BadArgumentsException(path); + } + parentPath = path.substring(0, lastSlash); + parentRecord = getRecordForPath(parentPath); + ChangeRecord nodeRecord = getRecordForPath(path); + checkACL(zks, parentRecord.acl, ZooDefs.Perms.DELETE, + request.authInfo); + int version = deleteRequest.getVersion(); + if (version != -1 && nodeRecord.stat.getVersion() != version) { + throw new KeeperException.BadVersionException(path); + } + if (nodeRecord.childCount > 0) { + throw new KeeperException.NotEmptyException(path); + } + request.txn = new DeleteTxn(path); + parentRecord = parentRecord.duplicate(request.hdr.getZxid()); + parentRecord.childCount--; + addChangeRecord(parentRecord); + addChangeRecord(new ChangeRecord(request.hdr.getZxid(), path, + null, -1, null)); + break; + case OpCode.setData: + zks.sessionTracker.checkSession(request.sessionId, request.getOwner()); + SetDataRequest setDataRequest = (SetDataRequest)record; + if(deserialize) + ByteBufferInputStream.byteBuffer2Record(request.request, setDataRequest); + path = setDataRequest.getPath(); + nodeRecord = getRecordForPath(path); + checkACL(zks, nodeRecord.acl, ZooDefs.Perms.WRITE, + request.authInfo); + version = setDataRequest.getVersion(); + int currentVersion = nodeRecord.stat.getVersion(); + if (version != -1 && version != currentVersion) { + throw new KeeperException.BadVersionException(path); + } + version = currentVersion + 1; + request.txn = new SetDataTxn(path, setDataRequest.getData(), version); + nodeRecord = nodeRecord.duplicate(request.hdr.getZxid()); + nodeRecord.stat.setVersion(version); + addChangeRecord(nodeRecord); + break; + case OpCode.setACL: + zks.sessionTracker.checkSession(request.sessionId, request.getOwner()); + SetACLRequest setAclRequest = (SetACLRequest)record; + if(deserialize) + ByteBufferInputStream.byteBuffer2Record(request.request, setAclRequest); + path = setAclRequest.getPath(); + listACL = removeDuplicates(setAclRequest.getAcl()); + if (!fixupACL(request.authInfo, listACL)) { + throw new KeeperException.InvalidACLException(path); + } + nodeRecord = getRecordForPath(path); + checkACL(zks, nodeRecord.acl, ZooDefs.Perms.ADMIN, + request.authInfo); + version = setAclRequest.getVersion(); + currentVersion = nodeRecord.stat.getAversion(); + if (version != -1 && version != currentVersion) { + throw new KeeperException.BadVersionException(path); + } + version = currentVersion + 1; + request.txn = new SetACLTxn(path, listACL, version); + nodeRecord = nodeRecord.duplicate(request.hdr.getZxid()); + nodeRecord.stat.setAversion(version); + addChangeRecord(nodeRecord); + break; + case OpCode.createSession: + request.request.rewind(); + int to = request.request.getInt(); + request.txn = new CreateSessionTxn(to); + request.request.rewind(); + zks.sessionTracker.addSession(request.sessionId, to); + zks.setOwner(request.sessionId, request.getOwner()); + break; + case OpCode.closeSession: + // We don't want to do this check since the session expiration thread + // queues up this operation without being the session owner. + // this request is the last of the session so it should be ok + //zks.sessionTracker.checkSession(request.sessionId, request.getOwner()); + HashSet es = zks.getZKDatabase() + .getEphemerals(request.sessionId); + synchronized (zks.outstandingChanges) { + for (ChangeRecord c : zks.outstandingChanges) { + if (c.stat == null) { + // Doing a delete + es.remove(c.path); + } else if (c.stat.getEphemeralOwner() == request.sessionId) { + es.add(c.path); + } + } + for (String path2Delete : es) { + addChangeRecord(new ChangeRecord(request.hdr.getZxid(), + path2Delete, null, 0, null)); + } + + zks.sessionTracker.setSessionClosing(request.sessionId); + } + + LOG.info("Processed session termination for sessionid: 0x" + + Long.toHexString(request.sessionId)); + break; + case OpCode.check: + zks.sessionTracker.checkSession(request.sessionId, request.getOwner()); + CheckVersionRequest checkVersionRequest = (CheckVersionRequest)record; + if(deserialize) + ByteBufferInputStream.byteBuffer2Record(request.request, checkVersionRequest); + path = checkVersionRequest.getPath(); + nodeRecord = getRecordForPath(path); + checkACL(zks, nodeRecord.acl, ZooDefs.Perms.READ, + request.authInfo); + version = checkVersionRequest.getVersion(); + currentVersion = nodeRecord.stat.getVersion(); + if (version != -1 && version != currentVersion) { + throw new KeeperException.BadVersionException(path); + } + version = currentVersion + 1; + request.txn = new CheckVersionTxn(path, version); + break; + } + } + + /** + * This method will be called inside the ProcessRequestThread, which is a + * singleton, so there will be a single thread calling this code. + * + * @param request + */ + @SuppressWarnings("unchecked") + protected void pRequest(Request request) throws RequestProcessorException { + // LOG.info("Prep>>> cxid = " + request.cxid + " type = " + + // request.type + " id = 0x" + Long.toHexString(request.sessionId)); + request.hdr = null; + request.txn = null; + + try { + switch (request.type) { + case OpCode.create: + CreateRequest createRequest = new CreateRequest(); + pRequest2Txn(request.type, zks.getNextZxid(), request, createRequest, true); + break; + case OpCode.delete: + DeleteRequest deleteRequest = new DeleteRequest(); + pRequest2Txn(request.type, zks.getNextZxid(), request, deleteRequest, true); + break; + case OpCode.setData: + SetDataRequest setDataRequest = new SetDataRequest(); + pRequest2Txn(request.type, zks.getNextZxid(), request, setDataRequest, true); + break; + case OpCode.setACL: + SetACLRequest setAclRequest = new SetACLRequest(); + pRequest2Txn(request.type, zks.getNextZxid(), request, setAclRequest, true); + break; + case OpCode.check: + CheckVersionRequest checkRequest = new CheckVersionRequest(); + pRequest2Txn(request.type, zks.getNextZxid(), request, checkRequest, true); + break; + case OpCode.multi: + MultiTransactionRecord multiRequest = new MultiTransactionRecord(); + try { + ByteBufferInputStream.byteBuffer2Record(request.request, multiRequest); + } catch(IOException e) { + request.hdr = new TxnHeader(request.sessionId, request.cxid, zks.getNextZxid(), + zks.getTime(), OpCode.multi); + throw e; + } + List txns = new ArrayList(); + //Each op in a multi-op must have the same zxid! + long zxid = zks.getNextZxid(); + KeeperException ke = null; + + //Store off current pending change records in case we need to rollback + HashMap pendingChanges = getPendingChanges(multiRequest); + + int index = 0; + for(Op op: multiRequest) { + Record subrequest = op.toRequestRecord() ; + + /* If we've already failed one of the ops, don't bother + * trying the rest as we know it's going to fail and it + * would be confusing in the logfiles. + */ + if (ke != null) { + request.hdr.setType(OpCode.error); + request.txn = new ErrorTxn(Code.RUNTIMEINCONSISTENCY.intValue()); + } + + /* Prep the request and convert to a Txn */ + else { + try { + pRequest2Txn(op.getType(), zxid, request, subrequest, false); + } catch (KeeperException e) { + if (ke == null) { + ke = e; + } + request.hdr.setType(OpCode.error); + request.txn = new ErrorTxn(e.code().intValue()); + LOG.info("Got user-level KeeperException when processing " + + request.toString() + " aborting remaining multi ops." + + " Error Path:" + e.getPath() + + " Error:" + e.getMessage()); + + request.setException(e); + + /* Rollback change records from failed multi-op */ + rollbackPendingChanges(zxid, pendingChanges); + } + } + + //FIXME: I don't want to have to serialize it here and then + // immediately deserialize in next processor. But I'm + // not sure how else to get the txn stored into our list. + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + BinaryOutputArchive boa = BinaryOutputArchive.getArchive(baos); + request.txn.serialize(boa, "request") ; + ByteBuffer bb = ByteBuffer.wrap(baos.toByteArray()); + + txns.add(new Txn(request.hdr.getType(), bb.array())); + index++; + } + + request.hdr = new TxnHeader(request.sessionId, request.cxid, zxid, zks.getTime(), request.type); + request.txn = new MultiTxn(txns); + + break; + + //create/close session don't require request record + case OpCode.createSession: + case OpCode.closeSession: + pRequest2Txn(request.type, zks.getNextZxid(), request, null, true); + break; + + //All the rest don't need to create a Txn - just verify session + case OpCode.sync: + case OpCode.exists: + case OpCode.getData: + case OpCode.getACL: + case OpCode.getChildren: + case OpCode.getChildren2: + case OpCode.ping: + case OpCode.setWatches: + zks.sessionTracker.checkSession(request.sessionId, + request.getOwner()); + break; + } + } catch (KeeperException e) { + if (request.hdr != null) { + request.hdr.setType(OpCode.error); + request.txn = new ErrorTxn(e.code().intValue()); + } + LOG.info("Got user-level KeeperException when processing " + + request.toString() + + " Error Path:" + e.getPath() + + " Error:" + e.getMessage()); + request.setException(e); + } catch (Exception e) { + // log at error level as we are returning a marshalling + // error to the user + LOG.error("Failed to process " + request, e); + + StringBuilder sb = new StringBuilder(); + ByteBuffer bb = request.request; + if(bb != null){ + bb.rewind(); + while (bb.hasRemaining()) { + sb.append(Integer.toHexString(bb.get() & 0xff)); + } + } else { + sb.append("request buffer is null"); + } + + LOG.error("Dumping request buffer: 0x" + sb.toString()); + if (request.hdr != null) { + request.hdr.setType(OpCode.error); + request.txn = new ErrorTxn(Code.MARSHALLINGERROR.intValue()); + } + } + request.zxid = zks.getZxid(); + nextProcessor.processRequest(request); + } + + private List removeDuplicates(List acl) { + + ArrayList retval = new ArrayList(); + Iterator it = acl.iterator(); + while (it.hasNext()) { + ACL a = it.next(); + if (retval.contains(a) == false) { + retval.add(a); + } + } + return retval; + } + + + /** + * This method checks out the acl making sure it isn't null or empty, + * it has valid schemes and ids, and expanding any relative ids that + * depend on the requestor's authentication information. + * + * @param authInfo list of ACL IDs associated with the client connection + * @param acl list of ACLs being assigned to the node (create or setACL operation) + * @return + */ + private boolean fixupACL(List authInfo, List acl) { + if (skipACL) { + return true; + } + if (acl == null || acl.size() == 0) { + return false; + } + + Iterator it = acl.iterator(); + LinkedList toAdd = null; + while (it.hasNext()) { + ACL a = it.next(); + Id id = a.getId(); + if (id.getScheme().equals("world") && id.getId().equals("anyone")) { + // wide open + } else if (id.getScheme().equals("auth")) { + // This is the "auth" id, so we have to expand it to the + // authenticated ids of the requestor + it.remove(); + if (toAdd == null) { + toAdd = new LinkedList(); + } + boolean authIdValid = false; + for (Id cid : authInfo) { + AuthenticationProvider ap = + ProviderRegistry.getProvider(cid.getScheme()); + if (ap == null) { + LOG.error("Missing AuthenticationProvider for " + + cid.getScheme()); + } else if (ap.isAuthenticated()) { + authIdValid = true; + toAdd.add(new ACL(a.getPerms(), cid)); + } + } + if (!authIdValid) { + return false; + } + } else { + AuthenticationProvider ap = ProviderRegistry.getProvider(id + .getScheme()); + if (ap == null) { + return false; + } + if (!ap.isValid(id.getId())) { + return false; + } + } + } + if (toAdd != null) { + for (ACL a : toAdd) { + acl.add(a); + } + } + return acl.size() > 0; + } + + public void processRequest(Request request) { + // request.addRQRec(">prep="+zks.outstandingChanges.size()); + submittedRequests.add(request); + } + + public void shutdown() { + LOG.info("Shutting down"); + submittedRequests.clear(); + submittedRequests.add(Request.requestOfDeath); + nextProcessor.shutdown(); + } +} diff --git a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/PurgeTxnLog.java b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/PurgeTxnLog.java new file mode 100644 index 000000000..185c1e123 --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/PurgeTxnLog.java @@ -0,0 +1,133 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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. + */ + +package org.apache.zookeeper.server; + +import java.io.File; +import java.io.FileFilter; +import java.io.IOException; +import java.text.DateFormat; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.HashSet; +import java.util.List; +import java.util.Set; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.apache.zookeeper.server.persistence.FileTxnSnapLog; +import org.apache.zookeeper.server.persistence.Util; + +/** + * this class is used to clean up the + * snapshot and data log dir's. This is usually + * run as a cronjob on the zookeeper server machine. + * Invocation of this class will clean up the datalogdir + * files and snapdir files keeping the last "-n" snapshot files + * and the corresponding logs. + */ +public class PurgeTxnLog { + private static final Logger LOG = LoggerFactory.getLogger(PurgeTxnLog.class); + + static void printUsage(){ + System.out.println("PurgeTxnLog dataLogDir [snapDir] -n count"); + System.out.println("\tdataLogDir -- path to the txn log directory"); + System.out.println("\tsnapDir -- path to the snapshot directory"); + System.out.println("\tcount -- the number of old snaps/logs you want to keep"); + System.exit(1); + } + + /** + * purges the snapshot and logs keeping the last num snapshots + * and the corresponding logs. + * @param dataDir the dir that has the logs + * @param snapDir the dir that has the snapshots + * @param num the number of snapshots to keep + * @throws IOException + */ + public static void purge(File dataDir, File snapDir, int num) throws IOException { + if (num < 3) { + throw new IllegalArgumentException("count should be greater than 3"); + } + + FileTxnSnapLog txnLog = new FileTxnSnapLog(dataDir, snapDir); + + // found any valid recent snapshots? + + // files to exclude from deletion + Set exc=new HashSet(); + List snaps = txnLog.findNRecentSnapshots(num); + if (snaps.size() == 0) + return; + File snapShot = snaps.get(snaps.size() -1); + for (File f: snaps) { + exc.add(f); + } + long zxid = Util.getZxidFromName(snapShot.getName(),"snapshot"); + exc.addAll(Arrays.asList(txnLog.getSnapshotLogs(zxid))); + + final Set exclude=exc; + class MyFileFilter implements FileFilter{ + private final String prefix; + MyFileFilter(String prefix){ + this.prefix=prefix; + } + public boolean accept(File f){ + if(!f.getName().startsWith(prefix) || exclude.contains(f)) + return false; + return true; + } + } + // add all non-excluded log files + List files=new ArrayList( + Arrays.asList(txnLog.getDataDir().listFiles(new MyFileFilter("log.")))); + // add all non-excluded snapshot files to the deletion list + files.addAll(Arrays.asList(txnLog.getSnapDir().listFiles(new MyFileFilter("snapshot.")))); + // remove the old files + for(File f: files) + { + System.out.println("Removing file: "+ + DateFormat.getDateTimeInstance().format(f.lastModified())+ + "\t"+f.getPath()); + if(!f.delete()){ + System.err.println("Failed to remove "+f.getPath()); + } + } + + } + + /** + * @param args PurgeTxnLog dataLogDir + * dataLogDir -- txn log directory + * -n num (number of snapshots to keep) + */ + public static void main(String[] args) throws IOException { + if(args.length<3 || args.length>4) + printUsage(); + int i = 0; + File dataDir=new File(args[0]); + File snapDir=dataDir; + if(args.length==4){ + i++; + snapDir=new File(args[i]); + } + i++; i++; + int num = Integer.parseInt(args[i]); + purge(dataDir, snapDir, num); + } +} diff --git a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/Request.java b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/Request.java new file mode 100644 index 000000000..80d2b99d5 --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/Request.java @@ -0,0 +1,241 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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. + */ + +package org.apache.zookeeper.server; + +import java.nio.ByteBuffer; +import java.util.List; + +import org.apache.jute.Record; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.apache.zookeeper.KeeperException; +import org.apache.zookeeper.ZooDefs.OpCode; +import org.apache.zookeeper.data.Id; +import org.apache.zookeeper.txn.TxnHeader; + +/** + * This is the structure that represents a request moving through a chain of + * RequestProcessors. There are various pieces of information that is tacked + * onto the request as it is processed. + */ +public class Request { + private static final Logger LOG = LoggerFactory.getLogger(Request.class); + + public final static Request requestOfDeath = new Request(null, 0, 0, 0, + null, null); + + /** + * @param cnxn + * @param sessionId + * @param xid + * @param type + * @param bb + */ + public Request(ServerCnxn cnxn, long sessionId, int xid, int type, + ByteBuffer bb, List authInfo) { + this.cnxn = cnxn; + this.sessionId = sessionId; + this.cxid = xid; + this.type = type; + this.request = bb; + this.authInfo = authInfo; + } + + public final long sessionId; + + public final int cxid; + + public final int type; + + public final ByteBuffer request; + + public final ServerCnxn cnxn; + + public TxnHeader hdr; + + public Record txn; + + public long zxid = -1; + + public final List authInfo; + + public final long createTime = System.currentTimeMillis(); + + private Object owner; + + private KeeperException e; + + public Object getOwner() { + return owner; + } + + public void setOwner(Object owner) { + this.owner = owner; + } + + /** + * is the packet type a valid packet in zookeeper + * + * @param type + * the type of the packet + * @return true if a valid packet, false if not + */ + static boolean isValid(int type) { + // make sure this is always synchronized with Zoodefs!! + switch (type) { + case OpCode.notification: + return false; + case OpCode.create: + case OpCode.delete: + case OpCode.createSession: + case OpCode.exists: + case OpCode.getData: + case OpCode.check: + case OpCode.multi: + case OpCode.setData: + case OpCode.sync: + case OpCode.getACL: + case OpCode.setACL: + case OpCode.getChildren: + case OpCode.getChildren2: + case OpCode.ping: + case OpCode.closeSession: + case OpCode.setWatches: + return true; + default: + return false; + } + } + + static boolean isQuorum(int type) { + switch (type) { + case OpCode.exists: + case OpCode.getACL: + case OpCode.getChildren: + case OpCode.getChildren2: + case OpCode.getData: + return false; + case OpCode.error: + case OpCode.closeSession: + case OpCode.create: + case OpCode.createSession: + case OpCode.delete: + case OpCode.setACL: + case OpCode.setData: + case OpCode.check: + case OpCode.multi: + return true; + default: + return false; + } + } + + static String op2String(int op) { + switch (op) { + case OpCode.notification: + return "notification"; + case OpCode.create: + return "create"; + case OpCode.setWatches: + return "setWatches"; + case OpCode.delete: + return "delete"; + case OpCode.exists: + return "exists"; + case OpCode.getData: + return "getData"; + case OpCode.check: + return "check"; + case OpCode.multi: + return "multi"; + case OpCode.setData: + return "setData"; + case OpCode.sync: + return "sync:"; + case OpCode.getACL: + return "getACL"; + case OpCode.setACL: + return "setACL"; + case OpCode.getChildren: + return "getChildren"; + case OpCode.getChildren2: + return "getChildren2"; + case OpCode.ping: + return "ping"; + case OpCode.createSession: + return "createSession"; + case OpCode.closeSession: + return "closeSession"; + case OpCode.error: + return "error"; + default: + return "unknown " + op; + } + } + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(); + sb.append("sessionid:0x").append(Long.toHexString(sessionId)) + .append(" type:").append(op2String(type)) + .append(" cxid:0x").append(Long.toHexString(cxid)) + .append(" zxid:0x").append(Long.toHexString(hdr == null ? + -2 : hdr.getZxid())) + .append(" txntype:").append(hdr == null ? + "unknown" : "" + hdr.getType()); + + // best effort to print the path assoc with this request + String path = "n/a"; + if (type != OpCode.createSession + && type != OpCode.setWatches + && type != OpCode.closeSession + && request != null + && request.remaining() >= 4) + { + try { + // make sure we don't mess with request itself + ByteBuffer rbuf = request.asReadOnlyBuffer(); + rbuf.clear(); + int pathLen = rbuf.getInt(); + // sanity check + if (pathLen >= 0 + && pathLen < 4096 + && rbuf.remaining() >= pathLen) + { + byte b[] = new byte[pathLen]; + rbuf.get(b); + path = new String(b); + } + } catch (Exception e) { + // ignore - can't find the path, will output "n/a" instead + } + } + sb.append(" reqpath:").append(path); + + return sb.toString(); + } + + public void setException(KeeperException e) { + this.e = e; + } + + public KeeperException getException() { + return e; + } +} diff --git a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/RequestProcessor.java b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/RequestProcessor.java new file mode 100644 index 000000000..9c9e5bdc0 --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/RequestProcessor.java @@ -0,0 +1,44 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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. + */ + +package org.apache.zookeeper.server; + +/** + * RequestProcessors are chained together to process transactions. Requests are + * always processed in order. The standalone server, follower, and leader all + * have slightly different RequestProcessors chained together. + * + * Requests always move forward through the chain of RequestProcessors. Requests + * are passed to a RequestProcessor through processRequest(). Generally method + * will always be invoked by a single thread. + * + * When shutdown is called, the request RequestProcessor should also shutdown + * any RequestProcessors that it is connected to. + */ +public interface RequestProcessor { + @SuppressWarnings("serial") + public static class RequestProcessorException extends Exception { + public RequestProcessorException(String msg, Throwable t) { + super(msg, t); + } + } + + void processRequest(Request request) throws RequestProcessorException; + + void shutdown(); +} diff --git a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/ServerCnxn.java b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/ServerCnxn.java new file mode 100644 index 000000000..6dd509b16 --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/ServerCnxn.java @@ -0,0 +1,452 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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. + */ + +package org.apache.zookeeper.server; + +import java.io.IOException; +import java.io.PrintWriter; +import java.io.StringWriter; +import java.net.InetSocketAddress; +import java.nio.ByteBuffer; +import java.util.ArrayList; +import java.util.Collections; +import java.util.Date; +import java.util.HashMap; +import java.util.List; +import java.util.concurrent.atomic.AtomicLong; + +import org.apache.jute.Record; +import org.apache.zookeeper.WatchedEvent; +import org.apache.zookeeper.Watcher; +import org.apache.zookeeper.data.Id; +import org.apache.zookeeper.proto.ReplyHeader; +import org.apache.zookeeper.proto.RequestHeader; + +/** + * Interface to a Server connection - represents a connection from a client + * to the server. + */ +public abstract class ServerCnxn implements Stats, Watcher { + // This is just an arbitrary object to represent requests issued by + // (aka owned by) this class + final public static Object me = new Object(); + + protected ArrayList authInfo = new ArrayList(); + + /** + * If the client is of old version, we don't send r-o mode info to it. + * The reason is that if we would, old C client doesn't read it, which + * results in TCP RST packet, i.e. "connection reset by peer". + */ + boolean isOldClient = true; + + abstract int getSessionTimeout(); + + abstract void close(); + + public abstract void sendResponse(ReplyHeader h, Record r, String tag) + throws IOException; + + /* notify the client the session is closing and close/cleanup socket */ + abstract void sendCloseSession(); + + public abstract void process(WatchedEvent event); + + abstract long getSessionId(); + + abstract void setSessionId(long sessionId); + + /** auth info for the cnxn, returns an unmodifyable list */ + public List getAuthInfo() { + return Collections.unmodifiableList(authInfo); + } + + public void addAuthInfo(Id id) { + if (authInfo.contains(id) == false) { + authInfo.add(id); + } + } + + public boolean removeAuthInfo(Id id) { + return authInfo.remove(id); + } + + abstract void sendBuffer(ByteBuffer closeConn); + + abstract void enableRecv(); + + abstract void disableRecv(); + + abstract void setSessionTimeout(int sessionTimeout); + + protected ZooKeeperSaslServer zooKeeperSaslServer = null; + + protected static class CloseRequestException extends IOException { + private static final long serialVersionUID = -7854505709816442681L; + + public CloseRequestException(String msg) { + super(msg); + } + } + + protected static class EndOfStreamException extends IOException { + private static final long serialVersionUID = -8255690282104294178L; + + public EndOfStreamException(String msg) { + super(msg); + } + + public String toString() { + return "EndOfStreamException: " + getMessage(); + } + } + + /* + * See + * Zk Admin. this link is for all the commands. + */ + protected final static int confCmd = + ByteBuffer.wrap("conf".getBytes()).getInt(); + + /* + * See + * Zk Admin. this link is for all the commands. + */ + protected final static int consCmd = + ByteBuffer.wrap("cons".getBytes()).getInt(); + + /* + * See + * Zk Admin. this link is for all the commands. + */ + protected final static int crstCmd = + ByteBuffer.wrap("crst".getBytes()).getInt(); + + /* + * See + * Zk Admin. this link is for all the commands. + */ + protected final static int dumpCmd = + ByteBuffer.wrap("dump".getBytes()).getInt(); + + /* + * See + * Zk Admin. this link is for all the commands. + */ + protected final static int enviCmd = + ByteBuffer.wrap("envi".getBytes()).getInt(); + + /* + * See + * Zk Admin. this link is for all the commands. + */ + protected final static int getTraceMaskCmd = + ByteBuffer.wrap("gtmk".getBytes()).getInt(); + + /* + * See + * Zk Admin. this link is for all the commands. + */ + protected final static int ruokCmd = + ByteBuffer.wrap("ruok".getBytes()).getInt(); + /* + * See + * Zk Admin. this link is for all the commands. + */ + protected final static int setTraceMaskCmd = + ByteBuffer.wrap("stmk".getBytes()).getInt(); + + /* + * See + * Zk Admin. this link is for all the commands. + */ + protected final static int srvrCmd = + ByteBuffer.wrap("srvr".getBytes()).getInt(); + + /* + * See + * Zk Admin. this link is for all the commands. + */ + protected final static int srstCmd = + ByteBuffer.wrap("srst".getBytes()).getInt(); + + /* + * See + * Zk Admin. this link is for all the commands. + */ + protected final static int statCmd = + ByteBuffer.wrap("stat".getBytes()).getInt(); + + /* + * See + * Zk Admin. this link is for all the commands. + */ + protected final static int wchcCmd = + ByteBuffer.wrap("wchc".getBytes()).getInt(); + + /* + * See + * Zk Admin. this link is for all the commands. + */ + protected final static int wchpCmd = + ByteBuffer.wrap("wchp".getBytes()).getInt(); + + /* + * See + * Zk Admin. this link is for all the commands. + */ + protected final static int wchsCmd = + ByteBuffer.wrap("wchs".getBytes()).getInt(); + + /* + * See + * Zk Admin. this link is for all the commands. + */ + protected final static int mntrCmd = ByteBuffer.wrap("mntr".getBytes()) + .getInt(); + + /* + * See + * Zk Admin. this link is for all the commands. + */ + protected final static int isroCmd = ByteBuffer.wrap("isro".getBytes()) + .getInt(); + + protected final static HashMap cmd2String = + new HashMap(); + + // specify all of the commands that are available + static { + cmd2String.put(confCmd, "conf"); + cmd2String.put(consCmd, "cons"); + cmd2String.put(crstCmd, "crst"); + cmd2String.put(dumpCmd, "dump"); + cmd2String.put(enviCmd, "envi"); + cmd2String.put(getTraceMaskCmd, "gtmk"); + cmd2String.put(ruokCmd, "ruok"); + cmd2String.put(setTraceMaskCmd, "stmk"); + cmd2String.put(srstCmd, "srst"); + cmd2String.put(srvrCmd, "srvr"); + cmd2String.put(statCmd, "stat"); + cmd2String.put(wchcCmd, "wchc"); + cmd2String.put(wchpCmd, "wchp"); + cmd2String.put(wchsCmd, "wchs"); + cmd2String.put(mntrCmd, "mntr"); + cmd2String.put(isroCmd, "isro"); + } + + protected void packetReceived() { + incrPacketsReceived(); + ServerStats serverStats = serverStats(); + if (serverStats != null) { + serverStats().incrementPacketsReceived(); + } + } + + protected void packetSent() { + incrPacketsSent(); + ServerStats serverStats = serverStats(); + if (serverStats != null) { + serverStats().incrementPacketsSent(); + } + } + + protected abstract ServerStats serverStats(); + + protected final Date established = new Date(); + + protected final AtomicLong packetsReceived = new AtomicLong(); + protected final AtomicLong packetsSent = new AtomicLong(); + + protected long minLatency; + protected long maxLatency; + protected String lastOp; + protected long lastCxid; + protected long lastZxid; + protected long lastResponseTime; + protected long lastLatency; + + protected long count; + protected long totalLatency; + + public synchronized void resetStats() { + packetsReceived.set(0); + packetsSent.set(0); + minLatency = Long.MAX_VALUE; + maxLatency = 0; + lastOp = "NA"; + lastCxid = -1; + lastZxid = -1; + lastResponseTime = 0; + lastLatency = 0; + + count = 0; + totalLatency = 0; + } + + protected long incrPacketsReceived() { + return packetsReceived.incrementAndGet(); + } + + protected void incrOutstandingRequests(RequestHeader h) { + } + + protected long incrPacketsSent() { + return packetsSent.incrementAndGet(); + } + + protected synchronized void updateStatsForResponse(long cxid, long zxid, + String op, long start, long end) + { + // don't overwrite with "special" xids - we're interested + // in the clients last real operation + if (cxid >= 0) { + lastCxid = cxid; + } + lastZxid = zxid; + lastOp = op; + lastResponseTime = end; + long elapsed = end - start; + lastLatency = elapsed; + if (elapsed < minLatency) { + minLatency = elapsed; + } + if (elapsed > maxLatency) { + maxLatency = elapsed; + } + count++; + totalLatency += elapsed; + } + + public Date getEstablished() { + return (Date)established.clone(); + } + + public abstract long getOutstandingRequests(); + + public long getPacketsReceived() { + return packetsReceived.longValue(); + } + + public long getPacketsSent() { + return packetsSent.longValue(); + } + + public synchronized long getMinLatency() { + return minLatency == Long.MAX_VALUE ? 0 : minLatency; + } + + public synchronized long getAvgLatency() { + return count == 0 ? 0 : totalLatency / count; + } + + public synchronized long getMaxLatency() { + return maxLatency; + } + + public synchronized String getLastOperation() { + return lastOp; + } + + public synchronized long getLastCxid() { + return lastCxid; + } + + public synchronized long getLastZxid() { + return lastZxid; + } + + public synchronized long getLastResponseTime() { + return lastResponseTime; + } + + public synchronized long getLastLatency() { + return lastLatency; + } + + /** + * Prints detailed stats information for the connection. + * + * @see dumpConnectionInfo(PrintWriter, boolean) for brief stats + */ + @Override + public String toString() { + StringWriter sw = new StringWriter(); + PrintWriter pwriter = new PrintWriter(sw); + dumpConnectionInfo(pwriter, false); + pwriter.flush(); + pwriter.close(); + return sw.toString(); + } + + public abstract InetSocketAddress getRemoteSocketAddress(); + public abstract int getInterestOps(); + + /** + * Print information about the connection. + * @param brief iff true prints brief details, otw full detail + * @return information about this connection + */ + protected synchronized void + dumpConnectionInfo(PrintWriter pwriter, boolean brief) { + pwriter.print(" "); + pwriter.print(getRemoteSocketAddress()); + pwriter.print("["); + int interestOps = getInterestOps(); + pwriter.print(interestOps == 0 ? "0" : Integer.toHexString(interestOps)); + pwriter.print("](queued="); + pwriter.print(getOutstandingRequests()); + pwriter.print(",recved="); + pwriter.print(getPacketsReceived()); + pwriter.print(",sent="); + pwriter.print(getPacketsSent()); + + if (!brief) { + long sessionId = getSessionId(); + if (sessionId != 0) { + pwriter.print(",sid=0x"); + pwriter.print(Long.toHexString(sessionId)); + pwriter.print(",lop="); + pwriter.print(getLastOperation()); + pwriter.print(",est="); + pwriter.print(getEstablished().getTime()); + pwriter.print(",to="); + pwriter.print(getSessionTimeout()); + long lastCxid = getLastCxid(); + if (lastCxid >= 0) { + pwriter.print(",lcxid=0x"); + pwriter.print(Long.toHexString(lastCxid)); + } + pwriter.print(",lzxid=0x"); + pwriter.print(Long.toHexString(getLastZxid())); + pwriter.print(",lresp="); + pwriter.print(getLastResponseTime()); + pwriter.print(",llat="); + pwriter.print(getLastLatency()); + pwriter.print(",minlat="); + pwriter.print(getMinLatency()); + pwriter.print(",avglat="); + pwriter.print(getAvgLatency()); + pwriter.print(",maxlat="); + pwriter.print(getMaxLatency()); + } + } + pwriter.print(")"); + } + +} diff --git a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/ServerCnxnFactory.java b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/ServerCnxnFactory.java new file mode 100644 index 000000000..9b7fd8738 --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/ServerCnxnFactory.java @@ -0,0 +1,211 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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. + */ + +package org.apache.zookeeper.server; + +import java.io.IOException; +import java.net.InetSocketAddress; +import java.nio.ByteBuffer; +import java.util.HashSet; +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; + +import javax.security.auth.login.Configuration; +import javax.security.auth.login.LoginException; +import javax.security.auth.login.AppConfigurationEntry; + +import javax.management.JMException; + +import org.apache.zookeeper.Login; +import org.apache.zookeeper.Environment; +import org.apache.zookeeper.jmx.MBeanRegistry; +import org.apache.zookeeper.server.auth.SaslServerCallbackHandler; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public abstract class ServerCnxnFactory { + + public static final String ZOOKEEPER_SERVER_CNXN_FACTORY = "zookeeper.serverCnxnFactory"; + + public interface PacketProcessor { + public void processPacket(ByteBuffer packet, ServerCnxn src); + } + + Logger LOG = LoggerFactory.getLogger(ServerCnxnFactory.class); + + /** + * The buffer will cause the connection to be close when we do a send. + */ + static final ByteBuffer closeConn = ByteBuffer.allocate(0); + + public abstract int getLocalPort(); + + public abstract Iterable getConnections(); + + public int getNumAliveConnections() { + synchronized(cnxns) { + return cnxns.size(); + } + } + + public abstract void closeSession(long sessionId); + + public abstract void configure(InetSocketAddress addr, + int maxClientCnxns) throws IOException; + + protected SaslServerCallbackHandler saslServerCallbackHandler; + public Login login; + + /** Maximum number of connections allowed from particular host (ip) */ + public abstract int getMaxClientCnxnsPerHost(); + + /** Maximum number of connections allowed from particular host (ip) */ + public abstract void setMaxClientCnxnsPerHost(int max); + + public abstract void startup(ZooKeeperServer zkServer) + throws IOException, InterruptedException; + + public abstract void join() throws InterruptedException; + + public abstract void shutdown(); + + public abstract void start(); + + protected ZooKeeperServer zkServer; + final public void setZooKeeperServer(ZooKeeperServer zk) { + this.zkServer = zk; + if (zk != null) { + zk.setServerCnxnFactory(this); + } + } + + public abstract void closeAll(); + + static public ServerCnxnFactory createFactory() throws IOException { + String serverCnxnFactoryName = + System.getProperty(ZOOKEEPER_SERVER_CNXN_FACTORY); + if (serverCnxnFactoryName == null) { + serverCnxnFactoryName = NIOServerCnxnFactory.class.getName(); + } + try { + return (ServerCnxnFactory) Class.forName(serverCnxnFactoryName) + .newInstance(); + } catch (Exception e) { + IOException ioe = new IOException("Couldn't instantiate " + + serverCnxnFactoryName); + ioe.initCause(e); + throw ioe; + } + } + + static public ServerCnxnFactory createFactory(int clientPort, + int maxClientCnxns) throws IOException + { + return createFactory(new InetSocketAddress(clientPort), maxClientCnxns); + } + + static public ServerCnxnFactory createFactory(InetSocketAddress addr, + int maxClientCnxns) throws IOException + { + ServerCnxnFactory factory = createFactory(); + factory.configure(addr, maxClientCnxns); + return factory; + } + + public abstract InetSocketAddress getLocalAddress(); + + private final Map connectionBeans + = new ConcurrentHashMap(); + + protected final HashSet cnxns = new HashSet(); + public void unregisterConnection(ServerCnxn serverCnxn) { + ConnectionBean jmxConnectionBean = connectionBeans.remove(serverCnxn); + if (jmxConnectionBean != null){ + MBeanRegistry.getInstance().unregister(jmxConnectionBean); + } + } + + public void registerConnection(ServerCnxn serverCnxn) { + if (zkServer != null) { + ConnectionBean jmxConnectionBean = new ConnectionBean(serverCnxn, zkServer); + try { + MBeanRegistry.getInstance().register(jmxConnectionBean, zkServer.jmxServerBean); + connectionBeans.put(serverCnxn, jmxConnectionBean); + } catch (JMException e) { + LOG.warn("Could not register connection", e); + } + } + + } + + /** + * Initialize the server SASL if specified. + * + * If the user has specified a "ZooKeeperServer.LOGIN_CONTEXT_NAME_KEY" + * or a jaas.conf using "java.security.auth.login.config" + * the authentication is required and an exception is raised. + * Otherwise no authentication is configured and no exception is raised. + * + * @throws IOException if jaas.conf is missing or there's an error in it. + */ + protected void configureSaslLogin() throws IOException { + String serverSection = System.getProperty(ZooKeeperSaslServer.LOGIN_CONTEXT_NAME_KEY, + ZooKeeperSaslServer.DEFAULT_LOGIN_CONTEXT_NAME); + + // Note that 'Configuration' here refers to javax.security.auth.login.Configuration. + AppConfigurationEntry entries[] = null; + SecurityException securityException = null; + try { + entries = Configuration.getConfiguration().getAppConfigurationEntry(serverSection); + } catch (SecurityException e) { + // handle below: might be harmless if the user doesn't intend to use JAAS authentication. + securityException = e; + } + + // No entries in jaas.conf + // If there's a configuration exception fetching the jaas section and + // the user has required sasl by specifying a LOGIN_CONTEXT_NAME_KEY or a jaas file + // we throw an exception otherwise we continue without authentication. + if (entries == null) { + String jaasFile = System.getProperty(Environment.JAAS_CONF_KEY); + String loginContextName = System.getProperty(ZooKeeperSaslServer.LOGIN_CONTEXT_NAME_KEY); + if (securityException != null && (loginContextName != null || jaasFile != null)) { + String errorMessage = "No JAAS configuration section named '" + serverSection + "' was found"; + if (jaasFile != null) { + errorMessage += "in '" + jaasFile + "'."; + } + if (loginContextName != null) { + errorMessage += " But " + ZooKeeperSaslServer.LOGIN_CONTEXT_NAME_KEY + " was set."; + } + LOG.error(errorMessage); + throw new IOException(errorMessage); + } + return; + } + + // jaas.conf entry available + try { + saslServerCallbackHandler = new SaslServerCallbackHandler(Configuration.getConfiguration()); + login = new Login(serverSection, saslServerCallbackHandler); + login.startThreadIfNeeded(); + } catch (LoginException e) { + throw new IOException("Could not configure server because SASL configuration did not allow the " + + " ZooKeeper server to authenticate itself properly: " + e); + } + } +} diff --git a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/ServerConfig.java b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/ServerConfig.java new file mode 100644 index 000000000..ec710cd3a --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/ServerConfig.java @@ -0,0 +1,111 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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. + */ + +package org.apache.zookeeper.server; + +import java.net.InetSocketAddress; +import java.util.Arrays; + +import org.apache.zookeeper.server.quorum.QuorumPeerConfig; +import org.apache.zookeeper.server.quorum.QuorumPeerConfig.ConfigException; + +/** + * Server configuration storage. + * + * We use this instead of Properties as it's typed. + * + */ +public class ServerConfig { + //// + //// If you update the configuration parameters be sure + //// to update the "conf" 4letter word + //// + protected InetSocketAddress clientPortAddress; + protected String dataDir; + protected String dataLogDir; + protected int tickTime = ZooKeeperServer.DEFAULT_TICK_TIME; + protected int maxClientCnxns; + /** defaults to -1 if not set explicitly */ + protected int minSessionTimeout = -1; + /** defaults to -1 if not set explicitly */ + protected int maxSessionTimeout = -1; + + /** + * Parse arguments for server configuration + * @param args clientPort dataDir and optional tickTime + * @return ServerConfig configured wrt arguments + * @throws IllegalArgumentException on invalid usage + */ + public void parse(String[] args) { + if (args.length < 2 || args.length > 4) { + throw new IllegalArgumentException("Invalid args:" + + Arrays.toString(args)); + } + + clientPortAddress = new InetSocketAddress(Integer.parseInt(args[0])); + dataDir = args[1]; + dataLogDir = dataDir; + if (args.length == 3) { + tickTime = Integer.parseInt(args[2]); + } + if (args.length == 4) { + maxClientCnxns = Integer.parseInt(args[3]); + } + } + + /** + * Parse a ZooKeeper configuration file + * @param path the patch of the configuration file + * @return ServerConfig configured wrt arguments + * @throws ConfigException error processing configuration + */ + public void parse(String path) throws ConfigException { + QuorumPeerConfig config = new QuorumPeerConfig(); + config.parse(path); + + // let qpconfig parse the file and then pull the stuff we are + // interested in + readFrom(config); + } + + /** + * Read attributes from a QuorumPeerConfig. + * @param config + */ + public void readFrom(QuorumPeerConfig config) { + clientPortAddress = config.getClientPortAddress(); + dataDir = config.getDataDir(); + dataLogDir = config.getDataLogDir(); + tickTime = config.getTickTime(); + maxClientCnxns = config.getMaxClientCnxns(); + minSessionTimeout = config.getMinSessionTimeout(); + maxSessionTimeout = config.getMaxSessionTimeout(); + } + + public InetSocketAddress getClientPortAddress() { + return clientPortAddress; + } + public String getDataDir() { return dataDir; } + public String getDataLogDir() { return dataLogDir; } + public int getTickTime() { return tickTime; } + public int getMaxClientCnxns() { return maxClientCnxns; } + /** minimum session timeout in milliseconds, -1 if unset */ + public int getMinSessionTimeout() { return minSessionTimeout; } + /** maximum session timeout in milliseconds, -1 if unset */ + public int getMaxSessionTimeout() { return maxSessionTimeout; } +} diff --git a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/ServerStats.java b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/ServerStats.java new file mode 100644 index 000000000..dbee6d540 --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/ServerStats.java @@ -0,0 +1,139 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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. + */ + +package org.apache.zookeeper.server; + + +/** + * Basic Server Statistics + */ +public class ServerStats { + private long packetsSent; + private long packetsReceived; + private long maxLatency; + private long minLatency = Long.MAX_VALUE; + private long totalLatency = 0; + private long count = 0; + + private final Provider provider; + + public interface Provider { + public long getOutstandingRequests(); + public long getLastProcessedZxid(); + public String getState(); + public int getNumAliveConnections(); + } + + public ServerStats(Provider provider) { + this.provider = provider; + } + + // getters + synchronized public long getMinLatency() { + return minLatency == Long.MAX_VALUE ? 0 : minLatency; + } + + synchronized public long getAvgLatency() { + if (count != 0) { + return totalLatency / count; + } + return 0; + } + + synchronized public long getMaxLatency() { + return maxLatency; + } + + public long getOutstandingRequests() { + return provider.getOutstandingRequests(); + } + + public long getLastProcessedZxid(){ + return provider.getLastProcessedZxid(); + } + + synchronized public long getPacketsReceived() { + return packetsReceived; + } + + synchronized public long getPacketsSent() { + return packetsSent; + } + + public String getServerState() { + return provider.getState(); + } + + /** The number of client connections alive to this server */ + public int getNumAliveClientConnections() { + return provider.getNumAliveConnections(); + } + + @Override + public String toString(){ + StringBuilder sb = new StringBuilder(); + sb.append("Latency min/avg/max: " + getMinLatency() + "/" + + getAvgLatency() + "/" + getMaxLatency() + "\n"); + sb.append("Received: " + getPacketsReceived() + "\n"); + sb.append("Sent: " + getPacketsSent() + "\n"); + sb.append("Connections: " + getNumAliveClientConnections() + "\n"); + + if (provider != null) { + sb.append("Outstanding: " + getOutstandingRequests() + "\n"); + sb.append("Zxid: 0x"+ Long.toHexString(getLastProcessedZxid())+ "\n"); + } + sb.append("Mode: " + getServerState() + "\n"); + return sb.toString(); + } + // mutators + synchronized void updateLatency(long requestCreateTime) { + long latency = System.currentTimeMillis() - requestCreateTime; + totalLatency += latency; + count++; + if (latency < minLatency) { + minLatency = latency; + } + if (latency > maxLatency) { + maxLatency = latency; + } + } + synchronized public void resetLatency(){ + totalLatency = 0; + count = 0; + maxLatency = 0; + minLatency = Long.MAX_VALUE; + } + synchronized public void resetMaxLatency(){ + maxLatency = getMinLatency(); + } + synchronized public void incrementPacketsReceived() { + packetsReceived++; + } + synchronized public void incrementPacketsSent() { + packetsSent++; + } + synchronized public void resetRequestCounters(){ + packetsReceived = 0; + packetsSent = 0; + } + synchronized public void reset() { + resetLatency(); + resetRequestCounters(); + } + +} diff --git a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/SessionTracker.java b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/SessionTracker.java new file mode 100644 index 000000000..3535e1b5c --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/SessionTracker.java @@ -0,0 +1,81 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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. + */ + +package org.apache.zookeeper.server; + +import java.io.PrintWriter; + +import org.apache.zookeeper.KeeperException; +import org.apache.zookeeper.KeeperException.SessionExpiredException; +import org.apache.zookeeper.KeeperException.SessionMovedException; + +/** + * This is the basic interface that ZooKeeperServer uses to track sessions. The + * standalone and leader ZooKeeperServer use the same SessionTracker. The + * FollowerZooKeeperServer uses a SessionTracker which is basically a simple + * shell to track information to be forwarded to the leader. + */ +public interface SessionTracker { + public static interface Session { + long getSessionId(); + int getTimeout(); + boolean isClosing(); + } + public static interface SessionExpirer { + void expire(Session session); + + long getServerId(); + } + + long createSession(int sessionTimeout); + + void addSession(long id, int to); + + /** + * @param sessionId + * @param sessionTimeout + * @return false if session is no longer active + */ + boolean touchSession(long sessionId, int sessionTimeout); + + /** + * Mark that the session is in the process of closing. + * @param sessionId + */ + void setSessionClosing(long sessionId); + + /** + * + */ + void shutdown(); + + /** + * @param sessionId + */ + void removeSession(long sessionId); + + void checkSession(long sessionId, Object owner) throws KeeperException.SessionExpiredException, SessionMovedException; + + void setOwner(long id, Object owner) throws SessionExpiredException; + + /** + * Text dump of session information, suitable for debugging. + * @param pwriter the output writer + */ + void dumpSessions(PrintWriter pwriter); +} diff --git a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/SessionTrackerImpl.java b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/SessionTrackerImpl.java new file mode 100644 index 000000000..0cf2fa9fc --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/SessionTrackerImpl.java @@ -0,0 +1,279 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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. + */ + +package org.apache.zookeeper.server; + +import java.io.PrintWriter; +import java.io.StringWriter; +import java.util.ArrayList; +import java.util.Collections; +import java.util.Date; +import java.util.HashMap; +import java.util.HashSet; +import java.util.Map.Entry; +import java.util.concurrent.ConcurrentHashMap; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.apache.zookeeper.KeeperException; +import org.apache.zookeeper.KeeperException.SessionExpiredException; + +/** + * This is a full featured SessionTracker. It tracks session in grouped by tick + * interval. It always rounds up the tick interval to provide a sort of grace + * period. Sessions are thus expired in batches made up of sessions that expire + * in a given interval. + */ +public class SessionTrackerImpl extends Thread implements SessionTracker { + private static final Logger LOG = LoggerFactory.getLogger(SessionTrackerImpl.class); + + HashMap sessionsById = new HashMap(); + + HashMap sessionSets = new HashMap(); + + ConcurrentHashMap sessionsWithTimeout; + long nextSessionId = 0; + long nextExpirationTime; + + int expirationInterval; + + public static class SessionImpl implements Session { + SessionImpl(long sessionId, int timeout, long expireTime) { + this.sessionId = sessionId; + this.timeout = timeout; + this.tickTime = expireTime; + isClosing = false; + } + + final long sessionId; + final int timeout; + long tickTime; + boolean isClosing; + + Object owner; + + public long getSessionId() { return sessionId; } + public int getTimeout() { return timeout; } + public boolean isClosing() { return isClosing; } + } + + public static long initializeNextSession(long id) { + long nextSid = 0; + nextSid = (System.currentTimeMillis() << 24) >>> 8; + nextSid = nextSid | (id <<56); + return nextSid; + } + + static class SessionSet { + HashSet sessions = new HashSet(); + } + + SessionExpirer expirer; + + private long roundToInterval(long time) { + // We give a one interval grace period + return (time / expirationInterval + 1) * expirationInterval; + } + + public SessionTrackerImpl(SessionExpirer expirer, + ConcurrentHashMap sessionsWithTimeout, int tickTime, + long sid) + { + super("SessionTracker"); + this.expirer = expirer; + this.expirationInterval = tickTime; + this.sessionsWithTimeout = sessionsWithTimeout; + nextExpirationTime = roundToInterval(System.currentTimeMillis()); + this.nextSessionId = initializeNextSession(sid); + for (Entry e : sessionsWithTimeout.entrySet()) { + addSession(e.getKey(), e.getValue()); + } + } + + volatile boolean running = true; + + volatile long currentTime; + + synchronized public void dumpSessions(PrintWriter pwriter) { + pwriter.print("Session Sets ("); + pwriter.print(sessionSets.size()); + pwriter.println("):"); + ArrayList keys = new ArrayList(sessionSets.keySet()); + Collections.sort(keys); + for (long time : keys) { + pwriter.print(sessionSets.get(time).sessions.size()); + pwriter.print(" expire at "); + pwriter.print(new Date(time)); + pwriter.println(":"); + for (SessionImpl s : sessionSets.get(time).sessions) { + pwriter.print("\t0x"); + pwriter.println(Long.toHexString(s.sessionId)); + } + } + } + + @Override + synchronized public String toString() { + StringWriter sw = new StringWriter(); + PrintWriter pwriter = new PrintWriter(sw); + dumpSessions(pwriter); + pwriter.flush(); + pwriter.close(); + return sw.toString(); + } + + @Override + synchronized public void run() { + try { + while (running) { + currentTime = System.currentTimeMillis(); + if (nextExpirationTime > currentTime) { + this.wait(nextExpirationTime - currentTime); + continue; + } + SessionSet set; + set = sessionSets.remove(nextExpirationTime); + if (set != null) { + for (SessionImpl s : set.sessions) { + setSessionClosing(s.sessionId); + expirer.expire(s); + } + } + nextExpirationTime += expirationInterval; + } + } catch (InterruptedException e) { + LOG.error("Unexpected interruption", e); + } + LOG.info("SessionTrackerImpl exited loop!"); + } + + synchronized public boolean touchSession(long sessionId, int timeout) { + if (LOG.isTraceEnabled()) { + ZooTrace.logTraceMessage(LOG, + ZooTrace.CLIENT_PING_TRACE_MASK, + "SessionTrackerImpl --- Touch session: 0x" + + Long.toHexString(sessionId) + " with timeout " + timeout); + } + SessionImpl s = sessionsById.get(sessionId); + // Return false, if the session doesn't exists or marked as closing + if (s == null || s.isClosing()) { + return false; + } + long expireTime = roundToInterval(System.currentTimeMillis() + timeout); + if (s.tickTime >= expireTime) { + // Nothing needs to be done + return true; + } + SessionSet set = sessionSets.get(s.tickTime); + if (set != null) { + set.sessions.remove(s); + } + s.tickTime = expireTime; + set = sessionSets.get(s.tickTime); + if (set == null) { + set = new SessionSet(); + sessionSets.put(expireTime, set); + } + set.sessions.add(s); + return true; + } + + synchronized public void setSessionClosing(long sessionId) { + if (LOG.isTraceEnabled()) { + LOG.info("Session closing: 0x" + Long.toHexString(sessionId)); + } + SessionImpl s = sessionsById.get(sessionId); + if (s == null) { + return; + } + s.isClosing = true; + } + + synchronized public void removeSession(long sessionId) { + SessionImpl s = sessionsById.remove(sessionId); + sessionsWithTimeout.remove(sessionId); + if (LOG.isTraceEnabled()) { + ZooTrace.logTraceMessage(LOG, ZooTrace.SESSION_TRACE_MASK, + "SessionTrackerImpl --- Removing session 0x" + + Long.toHexString(sessionId)); + } + if (s != null) { + SessionSet set = sessionSets.get(s.tickTime); + // Session expiration has been removing the sessions + if(set != null){ + set.sessions.remove(s); + } + } + } + + public void shutdown() { + LOG.info("Shutting down"); + + running = false; + if (LOG.isTraceEnabled()) { + ZooTrace.logTraceMessage(LOG, ZooTrace.getTextTraceLevel(), + "Shutdown SessionTrackerImpl!"); + } + } + + + synchronized public long createSession(int sessionTimeout) { + addSession(nextSessionId, sessionTimeout); + return nextSessionId++; + } + + synchronized public void addSession(long id, int sessionTimeout) { + sessionsWithTimeout.put(id, sessionTimeout); + if (sessionsById.get(id) == null) { + SessionImpl s = new SessionImpl(id, sessionTimeout, 0); + sessionsById.put(id, s); + if (LOG.isTraceEnabled()) { + ZooTrace.logTraceMessage(LOG, ZooTrace.SESSION_TRACE_MASK, + "SessionTrackerImpl --- Adding session 0x" + + Long.toHexString(id) + " " + sessionTimeout); + } + } else { + if (LOG.isTraceEnabled()) { + ZooTrace.logTraceMessage(LOG, ZooTrace.SESSION_TRACE_MASK, + "SessionTrackerImpl --- Existing session 0x" + + Long.toHexString(id) + " " + sessionTimeout); + } + } + touchSession(id, sessionTimeout); + } + + synchronized public void checkSession(long sessionId, Object owner) throws KeeperException.SessionExpiredException, KeeperException.SessionMovedException { + SessionImpl session = sessionsById.get(sessionId); + if (session == null || session.isClosing()) { + throw new KeeperException.SessionExpiredException(); + } + if (session.owner == null) { + session.owner = owner; + } else if (session.owner != owner) { + throw new KeeperException.SessionMovedException(); + } + } + + synchronized public void setOwner(long id, Object owner) throws SessionExpiredException { + SessionImpl session = sessionsById.get(id); + if (session == null || session.isClosing()) { + throw new KeeperException.SessionExpiredException(); + } + session.owner = owner; + } +} diff --git a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/SnapshotFormatter.java b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/SnapshotFormatter.java new file mode 100644 index 000000000..f94c54ddf --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/SnapshotFormatter.java @@ -0,0 +1,128 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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. + */ + +package org.apache.zookeeper.server; + +import java.io.BufferedInputStream; +import java.io.FileInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.util.Date; +import java.util.HashMap; +import java.util.Map; +import java.util.Set; +import java.util.zip.Adler32; +import java.util.zip.CheckedInputStream; + +import org.apache.jute.BinaryInputArchive; +import org.apache.jute.InputArchive; +import org.apache.zookeeper.data.StatPersisted; +import org.apache.zookeeper.server.persistence.FileSnap; + +/** + * Dump a snapshot file to stdout. + */ +public class SnapshotFormatter { + + /** + * USAGE: SnapshotFormatter snapshot_file + */ + public static void main(String[] args) throws Exception { + if (args.length != 1) { + System.err.println("USAGE: SnapshotFormatter snapshot_file"); + System.exit(2); + } + + new SnapshotFormatter().run(args[0]); + } + + public void run(String snapshotFileName) throws IOException { + InputStream is = new CheckedInputStream( + new BufferedInputStream(new FileInputStream(snapshotFileName)), + new Adler32()); + InputArchive ia = BinaryInputArchive.getArchive(is); + + FileSnap fileSnap = new FileSnap(null); + + DataTree dataTree = new DataTree(); + Map sessions = new HashMap(); + + fileSnap.deserialize(dataTree, sessions, ia); + + printDetails(dataTree, sessions); + } + + private void printDetails(DataTree dataTree, Map sessions) { + printZnodeDetails(dataTree); + printSessionDetails(dataTree, sessions); + } + + private void printZnodeDetails(DataTree dataTree) { + System.out.println(String.format("ZNode Details (count=%d):", + dataTree.getNodeCount())); + + printZnode(dataTree, "/"); + System.out.println("----"); + } + + private void printZnode(DataTree dataTree, String name) { + System.out.println("----"); + DataNode n = dataTree.getNode(name); + Set children; + synchronized(n) { // keep findbugs happy + System.out.println(name); + printStat(n.stat); + if (n.data != null) { + System.out.println(" dataLength = " + n.data.length); + } else { + System.out.println(" no data"); + } + children = n.getChildren(); + } + if (children != null) { + for (String child : children) { + printZnode(dataTree, name + (name.equals("/") ? "" : "/") + child); + } + } + } + + private void printSessionDetails(DataTree dataTree, Map sessions) { + System.out.println("Session Details (sid, timeout, ephemeralCount):"); + for (Map.Entry e : sessions.entrySet()) { + long sid = e.getKey(); + System.out.println(String.format("%#016x, %d, %d", + sid, e.getValue(), dataTree.getEphemerals(sid).size())); + } + } + + private void printStat(StatPersisted stat) { + printHex("cZxid", stat.getCzxid()); + System.out.println(" ctime = " + new Date(stat.getCtime()).toString()); + printHex("mZxid", stat.getMzxid()); + System.out.println(" mtime = " + new Date(stat.getMtime()).toString()); + printHex("pZxid", stat.getPzxid()); + System.out.println(" cversion = " + stat.getCversion()); + System.out.println(" dataVersion = " + stat.getVersion()); + System.out.println(" aclVersion = " + stat.getAversion()); + printHex("ephemeralOwner", stat.getEphemeralOwner()); + } + + private void printHex(String prefix, long value) { + System.out.println(String.format(" %s = %#016x", prefix, value)); + } +} diff --git a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/Stats.java b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/Stats.java new file mode 100644 index 000000000..e2584ee58 --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/Stats.java @@ -0,0 +1,68 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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. + */ + +package org.apache.zookeeper.server; + +import java.util.Date; + +/** + * Statistics on the ServerCnxn + */ +interface Stats { + /** Date/time the connection was established + * @since 3.3.0 */ + Date getEstablished(); + + /** + * The number of requests that have been submitted but not yet + * responded to. + */ + long getOutstandingRequests(); + /** Number of packets received */ + long getPacketsReceived(); + /** Number of packets sent (incl notifications) */ + long getPacketsSent(); + /** Min latency in ms + * @since 3.3.0 */ + long getMinLatency(); + /** Average latency in ms + * @since 3.3.0 */ + long getAvgLatency(); + /** Max latency in ms + * @since 3.3.0 */ + long getMaxLatency(); + /** Last operation performed by this connection + * @since 3.3.0 */ + String getLastOperation(); + /** Last cxid of this connection + * @since 3.3.0 */ + long getLastCxid(); + /** Last zxid of this connection + * @since 3.3.0 */ + long getLastZxid(); + /** Last time server sent a response to client on this connection + * @since 3.3.0 */ + long getLastResponseTime(); + /** Latency of last response to client on this connection in ms + * @since 3.3.0 */ + long getLastLatency(); + + /** Reset counters + * @since 3.3.0 */ + void resetStats(); +} diff --git a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/SyncRequestProcessor.java b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/SyncRequestProcessor.java new file mode 100644 index 000000000..929996147 --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/SyncRequestProcessor.java @@ -0,0 +1,235 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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. + */ + +package org.apache.zookeeper.server; + +import java.io.Flushable; +import java.io.IOException; +import java.util.LinkedList; +import java.util.Random; +import java.util.concurrent.LinkedBlockingQueue; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * This RequestProcessor logs requests to disk. It batches the requests to do + * the io efficiently. The request is not passed to the next RequestProcessor + * until its log has been synced to disk. + * + * SyncRequestProcessor is used in 3 different cases + * 1. Leader - Sync request to disk and forward it to AckRequestProcessor which + * send ack back to itself. + * 2. Follower - Sync request to disk and forward request to + * SendAckRequestProcessor which send the packets to leader. + * SendAckRequestProcessor is flushable which allow us to force + * push packets to leader. + * 3. Observer - Sync committed request to disk (received as INFORM packet). + * It never send ack back to the leader, so the nextProcessor will + * be null. This change the semantic of txnlog on the observer + * since it only contains committed txns. + */ +public class SyncRequestProcessor extends Thread implements RequestProcessor { + private static final Logger LOG = LoggerFactory.getLogger(SyncRequestProcessor.class); + private final ZooKeeperServer zks; + private final LinkedBlockingQueue queuedRequests = + new LinkedBlockingQueue(); + private final RequestProcessor nextProcessor; + + private Thread snapInProcess = null; + volatile private boolean running; + + /** + * Transactions that have been written and are waiting to be flushed to + * disk. Basically this is the list of SyncItems whose callbacks will be + * invoked after flush returns successfully. + */ + private final LinkedList toFlush = new LinkedList(); + private final Random r = new Random(System.nanoTime()); + /** + * The number of log entries to log before starting a snapshot + */ + private static int snapCount = ZooKeeperServer.getSnapCount(); + + /** + * The number of log entries before rolling the log, number + * is chosen randomly + */ + private static int randRoll; + + private final Request requestOfDeath = Request.requestOfDeath; + + public SyncRequestProcessor(ZooKeeperServer zks, + RequestProcessor nextProcessor) + { + super("SyncThread:" + zks.getServerId()); + this.zks = zks; + this.nextProcessor = nextProcessor; + running = true; + } + + /** + * used by tests to check for changing + * snapcounts + * @param count + */ + public static void setSnapCount(int count) { + snapCount = count; + randRoll = count; + } + + /** + * used by tests to get the snapcount + * @return the snapcount + */ + public static int getSnapCount() { + return snapCount; + } + + /** + * Sets the value of randRoll. This method + * is here to avoid a findbugs warning for + * setting a static variable in an instance + * method. + * + * @param roll + */ + private static void setRandRoll(int roll) { + randRoll = roll; + } + + @Override + public void run() { + try { + int logCount = 0; + + // we do this in an attempt to ensure that not all of the servers + // in the ensemble take a snapshot at the same time + setRandRoll(r.nextInt(snapCount/2)); + while (true) { + Request si = null; + if (toFlush.isEmpty()) { + si = queuedRequests.take(); + } else { + si = queuedRequests.poll(); + if (si == null) { + flush(toFlush); + continue; + } + } + if (si == requestOfDeath) { + break; + } + if (si != null) { + // track the number of records written to the log + if (zks.getZKDatabase().append(si)) { + logCount++; + if (logCount > (snapCount / 2 + randRoll)) { + randRoll = r.nextInt(snapCount/2); + // roll the log + zks.getZKDatabase().rollLog(); + // take a snapshot + if (snapInProcess != null && snapInProcess.isAlive()) { + LOG.warn("Too busy to snap, skipping"); + } else { + snapInProcess = new Thread("Snapshot Thread") { + public void run() { + try { + zks.takeSnapshot(); + } catch(Exception e) { + LOG.warn("Unexpected exception", e); + } + } + }; + snapInProcess.start(); + } + logCount = 0; + } + } else if (toFlush.isEmpty()) { + // optimization for read heavy workloads + // iff this is a read, and there are no pending + // flushes (writes), then just pass this to the next + // processor + if (nextProcessor != null) { + nextProcessor.processRequest(si); + if (nextProcessor instanceof Flushable) { + ((Flushable)nextProcessor).flush(); + } + } + continue; + } + toFlush.add(si); + if (toFlush.size() > 1000) { + flush(toFlush); + } + } + } + } catch (Throwable t) { + LOG.error("Severe unrecoverable error, exiting", t); + running = false; + System.exit(11); + } + LOG.info("SyncRequestProcessor exited!"); + } + + private void flush(LinkedList toFlush) + throws IOException, RequestProcessorException + { + if (toFlush.isEmpty()) + return; + + zks.getZKDatabase().commit(); + while (!toFlush.isEmpty()) { + Request i = toFlush.remove(); + if (nextProcessor != null) { + nextProcessor.processRequest(i); + } + } + if (nextProcessor != null && nextProcessor instanceof Flushable) { + ((Flushable)nextProcessor).flush(); + } + } + + public void shutdown() { + LOG.info("Shutting down"); + queuedRequests.add(requestOfDeath); + try { + if(running){ + this.join(); + } + if (!toFlush.isEmpty()) { + flush(toFlush); + } + } catch(InterruptedException e) { + LOG.warn("Interrupted while wating for " + this + " to finish"); + } catch (IOException e) { + LOG.warn("Got IO exception during shutdown"); + } catch (RequestProcessorException e) { + LOG.warn("Got request processor exception during shutdown"); + } + if (nextProcessor != null) { + nextProcessor.shutdown(); + } + } + + public void processRequest(Request request) { + // request.addRQRec(">sync"); + queuedRequests.add(request); + } + +} diff --git a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/TraceFormatter.java b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/TraceFormatter.java new file mode 100644 index 000000000..60d1cc758 --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/TraceFormatter.java @@ -0,0 +1,123 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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. + */ + +package org.apache.zookeeper.server; + +import java.io.FileInputStream; +import java.io.IOException; +import java.nio.ByteBuffer; +import java.nio.channels.FileChannel; +import java.text.DateFormat; +import java.util.Date; + +import org.apache.zookeeper.ZooDefs.OpCode; + +public class TraceFormatter { + + static String op2String(int op) { + switch (op) { + case OpCode.notification: + return "notification"; + case OpCode.create: + return "create"; + case OpCode.delete: + return "delete"; + case OpCode.exists: + return "exists"; + case OpCode.getData: + return "getDate"; + case OpCode.setData: + return "setData"; + case OpCode.multi: + return "multi"; + case OpCode.getACL: + return "getACL"; + case OpCode.setACL: + return "setACL"; + case OpCode.getChildren: + return "getChildren"; + case OpCode.getChildren2: + return "getChildren2"; + case OpCode.ping: + return "ping"; + case OpCode.createSession: + return "createSession"; + case OpCode.closeSession: + return "closeSession"; + case OpCode.error: + return "error"; + default: + return "unknown " + op; + } + } + + /** + * @param args + * @throws IOException + */ + public static void main(String[] args) throws IOException { + if (args.length != 1) { + System.err.println("USAGE: TraceFormatter trace_file"); + System.exit(2); + } + FileChannel fc = new FileInputStream(args[0]).getChannel(); + while (true) { + ByteBuffer bb = ByteBuffer.allocate(41); + fc.read(bb); + bb.flip(); + + byte app = bb.get(); + long time = bb.getLong(); + long id = bb.getLong(); + int cxid = bb.getInt(); + long zxid = bb.getLong(); + int txnType = bb.getInt(); + int type = bb.getInt(); + int len = bb.getInt(); + bb = ByteBuffer.allocate(len); + fc.read(bb); + bb.flip(); + String path = "n/a"; + if (bb.remaining() > 0) { + if (type != OpCode.createSession) { + int pathLen = bb.getInt(); + byte b[] = new byte[pathLen]; + bb.get(b); + path = new String(b); + } + } + System.out.println(DateFormat.getDateTimeInstance(DateFormat.SHORT, + DateFormat.LONG).format(new Date(time)) + + ": " + + (char) app + + " id=0x" + + Long.toHexString(id) + + " cxid=" + + cxid + + " op=" + + op2String(type) + + " zxid=0x" + + Long.toHexString(zxid) + + " txnType=" + + txnType + + " len=" + + len + " path=" + path); + } + } + +} diff --git a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/UnimplementedRequestProcessor.java b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/UnimplementedRequestProcessor.java new file mode 100644 index 000000000..aa58e63d4 --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/UnimplementedRequestProcessor.java @@ -0,0 +1,48 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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. + */ + +package org.apache.zookeeper.server; + +import java.io.IOException; + +import org.apache.zookeeper.KeeperException; +import org.apache.zookeeper.proto.ReplyHeader; + +/** + * Manages the unknown requests (i.e. unknown OpCode), by: + * - sending back the KeeperException.UnimplementedException() error code to the client + * - closing the connection. + */ +public class UnimplementedRequestProcessor implements RequestProcessor { + + public void processRequest(Request request) throws RequestProcessorException { + KeeperException ke = new KeeperException.UnimplementedException(); + request.setException(ke); + ReplyHeader rh = new ReplyHeader(request.cxid, request.zxid, ke.code().intValue()); + try { + request.cnxn.sendResponse(rh, null, "response"); + } catch (IOException e) { + throw new RequestProcessorException("Can't send the response", e); + } + + request.cnxn.sendCloseSession(); + } + + public void shutdown() { + } +} diff --git a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/WatchManager.java b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/WatchManager.java new file mode 100644 index 000000000..76e37f2a3 --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/WatchManager.java @@ -0,0 +1,171 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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. + */ + +package org.apache.zookeeper.server; + +import java.io.PrintWriter; +import java.util.HashMap; +import java.util.HashSet; +import java.util.Set; +import java.util.Map.Entry; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.apache.zookeeper.WatchedEvent; +import org.apache.zookeeper.Watcher; +import org.apache.zookeeper.Watcher.Event.EventType; +import org.apache.zookeeper.Watcher.Event.KeeperState; + +/** + * This class manages watches. It allows watches to be associated with a string + * and removes watchers and their watches in addition to managing triggers. + */ +public class WatchManager { + private static final Logger LOG = LoggerFactory.getLogger(WatchManager.class); + + private final HashMap> watchTable = + new HashMap>(); + + private final HashMap> watch2Paths = + new HashMap>(); + + public synchronized int size(){ + int result = 0; + for(Set watches : watchTable.values()) { + result += watches.size(); + } + return result; + } + + public synchronized void addWatch(String path, Watcher watcher) { + HashSet list = watchTable.get(path); + if (list == null) { + // don't waste memory if there are few watches on a node + // rehash when the 4th entry is added, doubling size thereafter + // seems like a good compromise + list = new HashSet(4); + watchTable.put(path, list); + } + list.add(watcher); + + HashSet paths = watch2Paths.get(watcher); + if (paths == null) { + // cnxns typically have many watches, so use default cap here + paths = new HashSet(); + watch2Paths.put(watcher, paths); + } + paths.add(path); + } + + public synchronized void removeWatcher(Watcher watcher) { + HashSet paths = watch2Paths.remove(watcher); + if (paths == null) { + return; + } + for (String p : paths) { + HashSet list = watchTable.get(p); + if (list != null) { + list.remove(watcher); + if (list.size() == 0) { + watchTable.remove(p); + } + } + } + } + + public Set triggerWatch(String path, EventType type) { + return triggerWatch(path, type, null); + } + + public Set triggerWatch(String path, EventType type, Set supress) { + WatchedEvent e = new WatchedEvent(type, + KeeperState.SyncConnected, path); + HashSet watchers; + synchronized (this) { + watchers = watchTable.remove(path); + if (watchers == null || watchers.isEmpty()) { + if (LOG.isTraceEnabled()) { + ZooTrace.logTraceMessage(LOG, + ZooTrace.EVENT_DELIVERY_TRACE_MASK, + "No watchers for " + path); + } + return null; + } + for (Watcher w : watchers) { + HashSet paths = watch2Paths.get(w); + if (paths != null) { + paths.remove(path); + } + } + } + for (Watcher w : watchers) { + if (supress != null && supress.contains(w)) { + continue; + } + w.process(e); + } + return watchers; + } + + /** + * Brief description of this object. + */ + @Override + public synchronized String toString() { + StringBuilder sb = new StringBuilder(); + + sb.append(watch2Paths.size()).append(" connections watching ") + .append(watchTable.size()).append(" paths\n"); + + int total = 0; + for (HashSet paths : watch2Paths.values()) { + total += paths.size(); + } + sb.append("Total watches:").append(total); + + return sb.toString(); + } + + /** + * String representation of watches. Warning, may be large! + * @param byPath iff true output watches by paths, otw output + * watches by connection + * @return string representation of watches + */ + public synchronized void dumpWatches(PrintWriter pwriter, boolean byPath) { + if (byPath) { + for (Entry> e : watchTable.entrySet()) { + pwriter.println(e.getKey()); + for (Watcher w : e.getValue()) { + pwriter.print("\t0x"); + pwriter.print(Long.toHexString(((ServerCnxn)w).getSessionId())); + pwriter.print("\n"); + } + } + } else { + for (Entry> e : watch2Paths.entrySet()) { + pwriter.print("0x"); + pwriter.println(Long.toHexString(((ServerCnxn)e.getKey()).getSessionId())); + for (String path : e.getValue()) { + pwriter.print("\t"); + pwriter.println(path); + } + } + } + } +} diff --git a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/ZKDatabase.java b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/ZKDatabase.java new file mode 100644 index 000000000..4c29dead8 --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/ZKDatabase.java @@ -0,0 +1,502 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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. + */ + +package org.apache.zookeeper.server; + +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.io.PrintWriter; +import java.util.Collection; +import java.util.HashSet; +import java.util.LinkedList; +import java.util.List; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.locks.ReentrantReadWriteLock; +import java.util.concurrent.locks.ReentrantReadWriteLock.ReadLock; +import java.util.concurrent.locks.ReentrantReadWriteLock.WriteLock; + +import org.apache.jute.BinaryOutputArchive; +import org.apache.jute.InputArchive; +import org.apache.jute.OutputArchive; +import org.apache.jute.Record; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.apache.zookeeper.KeeperException; +import org.apache.zookeeper.KeeperException.NoNodeException; +import org.apache.zookeeper.Watcher; +import org.apache.zookeeper.data.ACL; +import org.apache.zookeeper.data.Stat; +import org.apache.zookeeper.server.DataTree.ProcessTxnResult; +import org.apache.zookeeper.server.persistence.FileTxnSnapLog; +import org.apache.zookeeper.server.persistence.FileTxnSnapLog.PlayBackListener; +import org.apache.zookeeper.server.quorum.Leader; +import org.apache.zookeeper.server.quorum.Leader.Proposal; +import org.apache.zookeeper.server.quorum.QuorumPacket; +import org.apache.zookeeper.server.util.SerializeUtils; +import org.apache.zookeeper.txn.TxnHeader; + +/** + * This class maintains the in memory database of zookeeper + * server states that includes the sessions, datatree and the + * committed logs. It is booted up after reading the logs + * and snapshots from the disk. + */ +public class ZKDatabase { + + private static final Logger LOG = LoggerFactory.getLogger(ZKDatabase.class); + + /** + * make sure on a clear you take care of + * all these members. + */ + protected DataTree dataTree; + protected ConcurrentHashMap sessionsWithTimeouts; + protected FileTxnSnapLog snapLog; + protected long minCommittedLog, maxCommittedLog; + public static final int commitLogCount = 500; + protected static int commitLogBuffer = 700; + protected LinkedList committedLog = new LinkedList(); + protected ReentrantReadWriteLock logLock = new ReentrantReadWriteLock(); + volatile private boolean initialized = false; + + /** + * the filetxnsnaplog that this zk database + * maps to. There is a one to one relationship + * between a filetxnsnaplog and zkdatabase. + * @param snapLog the FileTxnSnapLog mapping this zkdatabase + */ + public ZKDatabase(FileTxnSnapLog snapLog) { + dataTree = new DataTree(); + sessionsWithTimeouts = new ConcurrentHashMap(); + this.snapLog = snapLog; + } + + /** + * checks to see if the zk database has been + * initialized or not. + * @return true if zk database is initialized and false if not + */ + public boolean isInitialized() { + return initialized; + } + + /** + * clear the zkdatabase. + * Note to developers - be careful to see that + * the clear method does clear out all the + * data structures in zkdatabase. + */ + public void clear() { + minCommittedLog = 0; + maxCommittedLog = 0; + /* to be safe we just create a new + * datatree. + */ + dataTree = new DataTree(); + sessionsWithTimeouts.clear(); + WriteLock lock = logLock.writeLock(); + try { + lock.lock(); + committedLog.clear(); + } finally { + lock.unlock(); + } + initialized = false; + } + + /** + * the datatree for this zkdatabase + * @return the datatree for this zkdatabase + */ + public DataTree getDataTree() { + return this.dataTree; + } + + /** + * the committed log for this zk database + * @return the committed log for this zkdatabase + */ + public long getmaxCommittedLog() { + return maxCommittedLog; + } + + + /** + * the minimum committed transaction log + * available in memory + * @return the minimum committed transaction + * log available in memory + */ + public long getminCommittedLog() { + return minCommittedLog; + } + /** + * Get the lock that controls the committedLog. If you want to get the pointer to the committedLog, you need + * to use this lock to acquire a read lock before calling getCommittedLog() + * @return the lock that controls the committed log + */ + public ReentrantReadWriteLock getLogLock() { + return logLock; + } + + + public synchronized LinkedList getCommittedLog() { + ReadLock rl = logLock.readLock(); + // only make a copy if this thread isn't already holding a lock + if(logLock.getReadHoldCount() <=0) { + try { + rl.lock(); + return new LinkedList(this.committedLog); + } finally { + rl.unlock(); + } + } + return this.committedLog; + } + + /** + * get the last processed zxid from a datatree + * @return the last processed zxid of a datatree + */ + public long getDataTreeLastProcessedZxid() { + return dataTree.lastProcessedZxid; + } + + /** + * set the datatree initialized or not + * @param b set the datatree initialized to b + */ + public void setDataTreeInit(boolean b) { + dataTree.initialized = b; + } + + /** + * return the sessions in the datatree + * @return the data tree sessions + */ + public Collection getSessions() { + return dataTree.getSessions(); + } + + /** + * get sessions with timeouts + * @return the hashmap of sessions with timeouts + */ + public ConcurrentHashMap getSessionWithTimeOuts() { + return sessionsWithTimeouts; + } + + + /** + * load the database from the disk onto memory and also add + * the transactions to the committedlog in memory. + * @return the last valid zxid on disk + * @throws IOException + */ + public long loadDataBase() throws IOException { + PlayBackListener listener=new PlayBackListener(){ + public void onTxnLoaded(TxnHeader hdr,Record txn){ + Request r = new Request(null, 0, hdr.getCxid(),hdr.getType(), + null, null); + r.txn = txn; + r.hdr = hdr; + r.zxid = hdr.getZxid(); + addCommittedProposal(r); + } + }; + + long zxid = snapLog.restore(dataTree,sessionsWithTimeouts,listener); + initialized = true; + return zxid; + } + + /** + * maintains a list of last committedLog + * or so committed requests. This is used for + * fast follower synchronization. + * @param request committed request + */ + public void addCommittedProposal(Request request) { + WriteLock wl = logLock.writeLock(); + try { + wl.lock(); + if (committedLog.size() > commitLogCount) { + committedLog.removeFirst(); + minCommittedLog = committedLog.getFirst().packet.getZxid(); + } + if (committedLog.size() == 0) { + minCommittedLog = request.zxid; + maxCommittedLog = request.zxid; + } + + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + BinaryOutputArchive boa = BinaryOutputArchive.getArchive(baos); + try { + request.hdr.serialize(boa, "hdr"); + if (request.txn != null) { + request.txn.serialize(boa, "txn"); + } + baos.close(); + } catch (IOException e) { + LOG.error("This really should be impossible", e); + } + QuorumPacket pp = new QuorumPacket(Leader.PROPOSAL, request.zxid, + baos.toByteArray(), null); + Proposal p = new Proposal(); + p.packet = pp; + p.request = request; + committedLog.add(p); + maxCommittedLog = p.packet.getZxid(); + } finally { + wl.unlock(); + } + } + + + /** + * remove a cnxn from the datatree + * @param cnxn the cnxn to remove from the datatree + */ + public void removeCnxn(ServerCnxn cnxn) { + dataTree.removeCnxn(cnxn); + } + + /** + * kill a given session in the datatree + * @param sessionId the session id to be killed + * @param zxid the zxid of kill session transaction + */ + public void killSession(long sessionId, long zxid) { + dataTree.killSession(sessionId, zxid); + } + + /** + * write a text dump of all the ephemerals in the datatree + * @param pwriter the output to write to + */ + public void dumpEphemerals(PrintWriter pwriter) { + dataTree.dumpEphemerals(pwriter); + } + + /** + * the node count of the datatree + * @return the node count of datatree + */ + public int getNodeCount() { + return dataTree.getNodeCount(); + } + + /** + * the paths for ephemeral session id + * @param sessionId the session id for which paths match to + * @return the paths for a session id + */ + public HashSet getEphemerals(long sessionId) { + return dataTree.getEphemerals(sessionId); + } + + /** + * the last processed zxid in the datatree + * @param zxid the last processed zxid in the datatree + */ + public void setlastProcessedZxid(long zxid) { + dataTree.lastProcessedZxid = zxid; + } + + /** + * the process txn on the data + * @param hdr the txnheader for the txn + * @param txn the transaction that needs to be processed + * @return the result of processing the transaction on this + * datatree/zkdatabase + */ + public ProcessTxnResult processTxn(TxnHeader hdr, Record txn) { + return dataTree.processTxn(hdr, txn); + } + + /** + * stat the path + * @param path the path for which stat is to be done + * @param serverCnxn the servercnxn attached to this request + * @return the stat of this node + * @throws KeeperException.NoNodeException + */ + public Stat statNode(String path, ServerCnxn serverCnxn) throws KeeperException.NoNodeException { + return dataTree.statNode(path, serverCnxn); + } + + /** + * get the datanode for this path + * @param path the path to lookup + * @return the datanode for getting the path + */ + public DataNode getNode(String path) { + return dataTree.getNode(path); + } + + /** + * convert from long to the acl entry + * @param aclL the long for which to get the acl + * @return the acl corresponding to this long entry + */ + public List convertLong(Long aclL) { + return dataTree.convertLong(aclL); + } + + /** + * get data and stat for a path + * @param path the path being queried + * @param stat the stat for this path + * @param watcher the watcher function + * @return + * @throws KeeperException.NoNodeException + */ + public byte[] getData(String path, Stat stat, Watcher watcher) + throws KeeperException.NoNodeException { + return dataTree.getData(path, stat, watcher); + } + + /** + * set watches on the datatree + * @param relativeZxid the relative zxid that client has seen + * @param dataWatches the data watches the client wants to reset + * @param existWatches the exists watches the client wants to reset + * @param childWatches the child watches the client wants to reset + * @param watcher the watcher function + */ + public void setWatches(long relativeZxid, List dataWatches, + List existWatches, List childWatches, Watcher watcher) { + dataTree.setWatches(relativeZxid, dataWatches, existWatches, childWatches, watcher); + } + + /** + * get acl for a path + * @param path the path to query for acl + * @param stat the stat for the node + * @return the acl list for this path + * @throws NoNodeException + */ + public List getACL(String path, Stat stat) throws NoNodeException { + return dataTree.getACL(path, stat); + } + + /** + * get children list for this path + * @param path the path of the node + * @param stat the stat of the node + * @param watcher the watcher function for this path + * @return the list of children for this path + * @throws KeeperException.NoNodeException + */ + public List getChildren(String path, Stat stat, Watcher watcher) + throws KeeperException.NoNodeException { + return dataTree.getChildren(path, stat, watcher); + } + + /** + * check if the path is special or not + * @param path the input path + * @return true if path is special and false if not + */ + public boolean isSpecialPath(String path) { + return dataTree.isSpecialPath(path); + } + + /** + * get the acl size of the datatree + * @return the acl size of the datatree + */ + public int getAclSize() { + return dataTree.longKeyMap.size(); + } + + /** + * Truncate the ZKDatabase to the specified zxid + * @param zxid the zxid to truncate zk database to + * @return true if the truncate is successful and false if not + * @throws IOException + */ + public boolean truncateLog(long zxid) throws IOException { + clear(); + + // truncate the log + boolean truncated = snapLog.truncateLog(zxid); + + if (!truncated) { + return false; + } + + loadDataBase(); + return true; + } + + /** + * deserialize a snapshot from an input archive + * @param ia the input archive you want to deserialize from + * @throws IOException + */ + public void deserializeSnapshot(InputArchive ia) throws IOException { + clear(); + SerializeUtils.deserializeSnapshot(getDataTree(),ia,getSessionWithTimeOuts()); + initialized = true; + } + + /** + * serialize the snapshot + * @param oa the output archive to which the snapshot needs to be serialized + * @throws IOException + * @throws InterruptedException + */ + public void serializeSnapshot(OutputArchive oa) throws IOException, + InterruptedException { + SerializeUtils.serializeSnapshot(getDataTree(), oa, getSessionWithTimeOuts()); + } + + /** + * append to the underlying transaction log + * @param si the request to append + * @return true if the append was succesfull and false if not + */ + public boolean append(Request si) throws IOException { + return this.snapLog.append(si); + } + + /** + * roll the underlying log + */ + public void rollLog() throws IOException { + this.snapLog.rollLog(); + } + + /** + * commit to the underlying transaction log + * @throws IOException + */ + public void commit() throws IOException { + this.snapLog.commit(); + } + + /** + * close this database. free the resources + * @throws IOException + */ + public void close() throws IOException { + this.snapLog.close(); + } + +} diff --git a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/ZooKeeperSaslServer.java b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/ZooKeeperSaslServer.java new file mode 100644 index 000000000..71870ce1c --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/ZooKeeperSaslServer.java @@ -0,0 +1,173 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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. + */ + +package org.apache.zookeeper.server; + +import java.security.Principal; +import java.security.PrivilegedActionException; +import java.security.PrivilegedExceptionAction; + +import javax.security.auth.Subject; +import javax.security.sasl.Sasl; +import javax.security.sasl.SaslException; +import javax.security.sasl.SaslServer; + +import org.apache.zookeeper.Login; +import org.ietf.jgss.GSSContext; +import org.ietf.jgss.GSSCredential; +import org.ietf.jgss.GSSException; +import org.ietf.jgss.GSSManager; +import org.ietf.jgss.GSSName; +import org.ietf.jgss.Oid; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class ZooKeeperSaslServer { + public static final String LOGIN_CONTEXT_NAME_KEY = "zookeeper.sasl.serverconfig"; + public static final String DEFAULT_LOGIN_CONTEXT_NAME = "Server"; + + Logger LOG = LoggerFactory.getLogger(ZooKeeperSaslServer.class); + private SaslServer saslServer; + + ZooKeeperSaslServer(final Login login) { + saslServer = createSaslServer(login); + } + + private SaslServer createSaslServer(final Login login) { + synchronized (login) { + Subject subject = login.getSubject(); + if (subject != null) { + // server is using a JAAS-authenticated subject: determine service principal name and hostname from zk server's subject. + if (subject.getPrincipals().size() > 0) { + try { + final Object[] principals = subject.getPrincipals().toArray(); + final Principal servicePrincipal = (Principal)principals[0]; + + // e.g. servicePrincipalNameAndHostname := "zookeeper/myhost.foo.com@FOO.COM" + final String servicePrincipalNameAndHostname = servicePrincipal.getName(); + + int indexOf = servicePrincipalNameAndHostname.indexOf("/"); + + // e.g. servicePrincipalName := "zookeeper" + final String servicePrincipalName = servicePrincipalNameAndHostname.substring(0, indexOf); + + // e.g. serviceHostnameAndKerbDomain := "myhost.foo.com@FOO.COM" + final String serviceHostnameAndKerbDomain = servicePrincipalNameAndHostname.substring(indexOf+1,servicePrincipalNameAndHostname.length()); + + indexOf = serviceHostnameAndKerbDomain.indexOf("@"); + // e.g. serviceHostname := "myhost.foo.com" + final String serviceHostname = serviceHostnameAndKerbDomain.substring(0,indexOf); + + final String mech = "GSSAPI"; // TODO: should depend on zoo.cfg specified mechs, but if subject is non-null, it can be assumed to be GSSAPI. + + LOG.debug("serviceHostname is '"+ serviceHostname + "'"); + LOG.debug("servicePrincipalName is '"+ servicePrincipalName + "'"); + LOG.debug("SASL mechanism(mech) is '"+ mech +"'"); + + boolean usingNativeJgss = + Boolean.getBoolean("sun.security.jgss.native"); + if (usingNativeJgss) { + // http://docs.oracle.com/javase/6/docs/technotes/guides/security/jgss/jgss-features.html + // """ + // In addition, when performing operations as a particular + // Subject, e.g. Subject.doAs(...) or + // Subject.doAsPrivileged(...), the to-be-used + // GSSCredential should be added to Subject's + // private credential set. Otherwise, the GSS operations + // will fail since no credential is found. + // """ + try { + GSSManager manager = GSSManager.getInstance(); + Oid krb5Mechanism = new Oid("1.2.840.113554.1.2.2"); + GSSName gssName = manager.createName( + servicePrincipalName + "@" + serviceHostname, + GSSName.NT_HOSTBASED_SERVICE); + GSSCredential cred = manager.createCredential(gssName, + GSSContext.DEFAULT_LIFETIME, + krb5Mechanism, + GSSCredential.ACCEPT_ONLY); + subject.getPrivateCredentials().add(cred); + if (LOG.isDebugEnabled()) { + LOG.debug("Added private credential to subject: " + cred); + } + } catch (GSSException ex) { + LOG.warn("Cannot add private credential to subject; " + + "clients authentication may fail", ex); + } + } + try { + return Subject.doAs(subject,new PrivilegedExceptionAction() { + public SaslServer run() { + try { + SaslServer saslServer; + saslServer = Sasl.createSaslServer(mech, servicePrincipalName, serviceHostname, null, login.callbackHandler); + return saslServer; + } + catch (SaslException e) { + LOG.error("Zookeeper Server failed to create a SaslServer to interact with a client during session initiation: " + e); + e.printStackTrace(); + return null; + } + } + } + ); + } + catch (PrivilegedActionException e) { + // TODO: exit server at this point(?) + LOG.error("Zookeeper Quorum member experienced a PrivilegedActionException exception while creating a SaslServer using a JAAS principal context:" + e); + e.printStackTrace(); + } + } + catch (IndexOutOfBoundsException e) { + LOG.error("server principal name/hostname determination error: ", e); + } + } + else { + // JAAS non-GSSAPI authentication: assuming and supporting only DIGEST-MD5 mechanism for now. + // TODO: use 'authMech=' value in zoo.cfg. + try { + SaslServer saslServer = Sasl.createSaslServer("DIGEST-MD5","zookeeper","zk-sasl-md5",null, login.callbackHandler); + return saslServer; + } + catch (SaslException e) { + LOG.error("Zookeeper Quorum member failed to create a SaslServer to interact with a client during session initiation", e); + } + } + } + } + LOG.error("failed to create saslServer object."); + return null; + } + + public byte[] evaluateResponse(byte[] response) throws SaslException { + return saslServer.evaluateResponse(response); + } + + public boolean isComplete() { + return saslServer.isComplete(); + } + + public String getAuthorizationID() { + return saslServer.getAuthorizationID(); + } + +} + + + + diff --git a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/ZooKeeperServer.java b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/ZooKeeperServer.java new file mode 100644 index 000000000..c1812c453 --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/ZooKeeperServer.java @@ -0,0 +1,1012 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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. + */ + +package org.apache.zookeeper.server; + +import java.io.ByteArrayOutputStream; +import java.io.File; +import java.io.IOException; +import java.io.InputStream; +import java.io.PrintWriter; +import java.nio.ByteBuffer; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.HashMap; +import java.util.LinkedList; +import java.util.List; +import java.util.Random; + +import javax.security.sasl.SaslException; + +import org.apache.jute.BinaryInputArchive; +import org.apache.jute.BinaryOutputArchive; +import org.apache.jute.Record; +import org.apache.zookeeper.Environment; +import org.apache.zookeeper.KeeperException; +import org.apache.zookeeper.KeeperException.Code; +import org.apache.zookeeper.KeeperException.SessionExpiredException; +import org.apache.zookeeper.ZooDefs.OpCode; +import org.apache.zookeeper.data.ACL; +import org.apache.zookeeper.data.Id; +import org.apache.zookeeper.data.StatPersisted; +import org.apache.zookeeper.jmx.MBeanRegistry; +import org.apache.zookeeper.proto.AuthPacket; +import org.apache.zookeeper.proto.ConnectRequest; +import org.apache.zookeeper.proto.ConnectResponse; +import org.apache.zookeeper.proto.GetSASLRequest; +import org.apache.zookeeper.proto.ReplyHeader; +import org.apache.zookeeper.proto.RequestHeader; +import org.apache.zookeeper.proto.SetSASLResponse; +import org.apache.zookeeper.server.DataTree.ProcessTxnResult; +import org.apache.zookeeper.server.RequestProcessor.RequestProcessorException; +import org.apache.zookeeper.server.ServerCnxn.CloseRequestException; +import org.apache.zookeeper.server.SessionTracker.Session; +import org.apache.zookeeper.server.SessionTracker.SessionExpirer; +import org.apache.zookeeper.server.auth.AuthenticationProvider; +import org.apache.zookeeper.server.auth.ProviderRegistry; +import org.apache.zookeeper.server.persistence.FileTxnSnapLog; +import org.apache.zookeeper.server.quorum.ReadOnlyZooKeeperServer; +import org.apache.zookeeper.txn.CreateSessionTxn; +import org.apache.zookeeper.txn.TxnHeader; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + + +/** + * This class implements a simple standalone ZooKeeperServer. It sets up the + * following chain of RequestProcessors to process requests: + * PrepRequestProcessor -> SyncRequestProcessor -> FinalRequestProcessor + */ +public class ZooKeeperServer implements SessionExpirer, ServerStats.Provider { + protected static final Logger LOG; + + static { + LOG = LoggerFactory.getLogger(ZooKeeperServer.class); + + Environment.logEnv("Server environment:", LOG); + } + + protected ZooKeeperServerBean jmxServerBean; + protected DataTreeBean jmxDataTreeBean; + + + /** + * The server delegates loading of the tree to an instance of the interface + */ + public interface DataTreeBuilder { + public DataTree build(); + } + + static public class BasicDataTreeBuilder implements DataTreeBuilder { + public DataTree build() { + return new DataTree(); + } + } + + public static final int DEFAULT_TICK_TIME = 3000; + protected int tickTime = DEFAULT_TICK_TIME; + /** value of -1 indicates unset, use default */ + protected int minSessionTimeout = -1; + /** value of -1 indicates unset, use default */ + protected int maxSessionTimeout = -1; + protected SessionTracker sessionTracker; + private FileTxnSnapLog txnLogFactory = null; + private ZKDatabase zkDb; + protected long hzxid = 0; + public final static Exception ok = new Exception("No prob"); + protected RequestProcessor firstProcessor; + protected volatile boolean running; + + /** + * This is the secret that we use to generate passwords, for the moment it + * is more of a sanity check. + */ + static final private long superSecret = 0XB3415C00L; + + int requestsInProcess; + final List outstandingChanges = new ArrayList(); + // this data structure must be accessed under the outstandingChanges lock + final HashMap outstandingChangesForPath = + new HashMap(); + + private ServerCnxnFactory serverCnxnFactory; + + private final ServerStats serverStats; + + void removeCnxn(ServerCnxn cnxn) { + zkDb.removeCnxn(cnxn); + } + + /** + * Creates a ZooKeeperServer instance. Nothing is setup, use the setX + * methods to prepare the instance (eg datadir, datalogdir, ticktime, + * builder, etc...) + * + * @throws IOException + */ + public ZooKeeperServer() { + serverStats = new ServerStats(this); + } + + /** + * Creates a ZooKeeperServer instance. It sets everything up, but doesn't + * actually start listening for clients until run() is invoked. + * + * @param dataDir the directory to put the data + */ + public ZooKeeperServer(FileTxnSnapLog txnLogFactory, int tickTime, + int minSessionTimeout, int maxSessionTimeout, + DataTreeBuilder treeBuilder, ZKDatabase zkDb) { + serverStats = new ServerStats(this); + this.txnLogFactory = txnLogFactory; + this.zkDb = zkDb; + this.tickTime = tickTime; + this.minSessionTimeout = minSessionTimeout; + this.maxSessionTimeout = maxSessionTimeout; + + LOG.info("Created server with tickTime " + tickTime + + " minSessionTimeout " + getMinSessionTimeout() + + " maxSessionTimeout " + getMaxSessionTimeout() + + " datadir " + txnLogFactory.getDataDir() + + " snapdir " + txnLogFactory.getSnapDir()); + } + + /** + * creates a zookeeperserver instance. + * @param txnLogFactory the file transaction snapshot logging class + * @param tickTime the ticktime for the server + * @param treeBuilder the datatree builder + * @throws IOException + */ + public ZooKeeperServer(FileTxnSnapLog txnLogFactory, int tickTime, + DataTreeBuilder treeBuilder) throws IOException { + this(txnLogFactory, tickTime, -1, -1, treeBuilder, + new ZKDatabase(txnLogFactory)); + } + + public ServerStats serverStats() { + return serverStats; + } + + public void dumpConf(PrintWriter pwriter) { + pwriter.print("clientPort="); + pwriter.println(getClientPort()); + pwriter.print("dataDir="); + pwriter.println(zkDb.snapLog.getSnapDir().getAbsolutePath()); + pwriter.print("dataLogDir="); + pwriter.println(zkDb.snapLog.getDataDir().getAbsolutePath()); + pwriter.print("tickTime="); + pwriter.println(getTickTime()); + pwriter.print("maxClientCnxns="); + pwriter.println(serverCnxnFactory.getMaxClientCnxnsPerHost()); + pwriter.print("minSessionTimeout="); + pwriter.println(getMinSessionTimeout()); + pwriter.print("maxSessionTimeout="); + pwriter.println(getMaxSessionTimeout()); + + pwriter.print("serverId="); + pwriter.println(getServerId()); + } + + /** + * This constructor is for backward compatibility with the existing unit + * test code. + * It defaults to FileLogProvider persistence provider. + */ + public ZooKeeperServer(File snapDir, File logDir, int tickTime) + throws IOException { + this( new FileTxnSnapLog(snapDir, logDir), + tickTime, new BasicDataTreeBuilder()); + } + + /** + * Default constructor, relies on the config for its agrument values + * + * @throws IOException + */ + public ZooKeeperServer(FileTxnSnapLog txnLogFactory, + DataTreeBuilder treeBuilder) + throws IOException + { + this(txnLogFactory, DEFAULT_TICK_TIME, -1, -1, treeBuilder, + new ZKDatabase(txnLogFactory)); + } + + /** + * get the zookeeper database for this server + * @return the zookeeper database for this server + */ + public ZKDatabase getZKDatabase() { + return this.zkDb; + } + + /** + * set the zkdatabase for this zookeeper server + * @param zkDb + */ + public void setZKDatabase(ZKDatabase zkDb) { + this.zkDb = zkDb; + } + + /** + * Restore sessions and data + */ + public void loadData() throws IOException, InterruptedException { + /* + * When a new leader starts executing Leader#lead, it + * invokes this method. The database, however, has been + * initialized before running leader election so that + * the server could pick its zxid for its initial vote. + * It does it by invoking QuorumPeer#getLastLoggedZxid. + * Consequently, we don't need to initialize it once more + * and avoid the penalty of loading it a second time. Not + * reloading it is particularly important for applications + * that host a large database. + * + * The following if block checks whether the database has + * been initialized or not. Note that this method is + * invoked by at least one other method: + * ZooKeeperServer#startdata. + * + * See ZOOKEEPER-1642 for more detail. + */ + if(zkDb.isInitialized()){ + setZxid(zkDb.getDataTreeLastProcessedZxid()); + } + else { + setZxid(zkDb.loadDataBase()); + } + + // Clean up dead sessions + LinkedList deadSessions = new LinkedList(); + for (Long session : zkDb.getSessions()) { + if (zkDb.getSessionWithTimeOuts().get(session) == null) { + deadSessions.add(session); + } + } + zkDb.setDataTreeInit(true); + for (long session : deadSessions) { + // XXX: Is lastProcessedZxid really the best thing to use? + killSession(session, zkDb.getDataTreeLastProcessedZxid()); + } + } + + public void takeSnapshot(){ + + try { + txnLogFactory.save(zkDb.getDataTree(), zkDb.getSessionWithTimeOuts()); + } catch (IOException e) { + LOG.error("Severe unrecoverable error, exiting", e); + // This is a severe error that we cannot recover from, + // so we need to exit + System.exit(10); + } + } + + + /** + * This should be called from a synchronized block on this! + */ + synchronized public long getZxid() { + return hzxid; + } + + synchronized long getNextZxid() { + return ++hzxid; + } + + synchronized public void setZxid(long zxid) { + hzxid = zxid; + } + + long getTime() { + return System.currentTimeMillis(); + } + + private void close(long sessionId) { + submitRequest(null, sessionId, OpCode.closeSession, 0, null, null); + } + + public void closeSession(long sessionId) { + LOG.info("Closing session 0x" + Long.toHexString(sessionId)); + + // we do not want to wait for a session close. send it as soon as we + // detect it! + close(sessionId); + } + + protected void killSession(long sessionId, long zxid) { + zkDb.killSession(sessionId, zxid); + if (LOG.isTraceEnabled()) { + ZooTrace.logTraceMessage(LOG, ZooTrace.SESSION_TRACE_MASK, + "ZooKeeperServer --- killSession: 0x" + + Long.toHexString(sessionId)); + } + if (sessionTracker != null) { + sessionTracker.removeSession(sessionId); + } + } + + public void expire(Session session) { + long sessionId = session.getSessionId(); + LOG.info("Expiring session 0x" + Long.toHexString(sessionId) + + ", timeout of " + session.getTimeout() + "ms exceeded"); + close(sessionId); + } + + public static class MissingSessionException extends IOException { + private static final long serialVersionUID = 7467414635467261007L; + + public MissingSessionException(String msg) { + super(msg); + } + } + + void touch(ServerCnxn cnxn) throws MissingSessionException { + if (cnxn == null) { + return; + } + long id = cnxn.getSessionId(); + int to = cnxn.getSessionTimeout(); + if (!sessionTracker.touchSession(id, to)) { + throw new MissingSessionException( + "No session with sessionid 0x" + Long.toHexString(id) + + " exists, probably expired and removed"); + } + } + + protected void registerJMX() { + // register with JMX + try { + jmxServerBean = new ZooKeeperServerBean(this); + MBeanRegistry.getInstance().register(jmxServerBean, null); + + try { + jmxDataTreeBean = new DataTreeBean(zkDb.getDataTree()); + MBeanRegistry.getInstance().register(jmxDataTreeBean, jmxServerBean); + } catch (Exception e) { + LOG.warn("Failed to register with JMX", e); + jmxDataTreeBean = null; + } + } catch (Exception e) { + LOG.warn("Failed to register with JMX", e); + jmxServerBean = null; + } + } + + public void startdata() + throws IOException, InterruptedException { + //check to see if zkDb is not null + if (zkDb == null) { + zkDb = new ZKDatabase(this.txnLogFactory); + } + if (!zkDb.isInitialized()) { + loadData(); + } + } + + public void startup() { + if (sessionTracker == null) { + createSessionTracker(); + } + startSessionTracker(); + setupRequestProcessors(); + + registerJMX(); + + synchronized (this) { + running = true; + notifyAll(); + } + } + + protected void setupRequestProcessors() { + RequestProcessor finalProcessor = new FinalRequestProcessor(this); + RequestProcessor syncProcessor = new SyncRequestProcessor(this, + finalProcessor); + ((SyncRequestProcessor)syncProcessor).start(); + firstProcessor = new PrepRequestProcessor(this, syncProcessor); + ((PrepRequestProcessor)firstProcessor).start(); + } + + protected void createSessionTracker() { + sessionTracker = new SessionTrackerImpl(this, zkDb.getSessionWithTimeOuts(), + tickTime, 1); + } + + protected void startSessionTracker() { + ((SessionTrackerImpl)sessionTracker).start(); + } + + public boolean isRunning() { + return running; + } + + public void shutdown() { + LOG.info("shutting down"); + + // new RuntimeException("Calling shutdown").printStackTrace(); + this.running = false; + // Since sessionTracker and syncThreads poll we just have to + // set running to false and they will detect it during the poll + // interval. + if (sessionTracker != null) { + sessionTracker.shutdown(); + } + if (firstProcessor != null) { + firstProcessor.shutdown(); + } + if (zkDb != null) { + zkDb.clear(); + } + + unregisterJMX(); + } + + protected void unregisterJMX() { + // unregister from JMX + try { + if (jmxDataTreeBean != null) { + MBeanRegistry.getInstance().unregister(jmxDataTreeBean); + } + } catch (Exception e) { + LOG.warn("Failed to unregister with JMX", e); + } + try { + if (jmxServerBean != null) { + MBeanRegistry.getInstance().unregister(jmxServerBean); + } + } catch (Exception e) { + LOG.warn("Failed to unregister with JMX", e); + } + jmxServerBean = null; + jmxDataTreeBean = null; + } + + synchronized public void incInProcess() { + requestsInProcess++; + } + + synchronized public void decInProcess() { + requestsInProcess--; + } + + public int getInProcess() { + return requestsInProcess; + } + + /** + * This structure is used to facilitate information sharing between PrepRP + * and FinalRP. + */ + static class ChangeRecord { + ChangeRecord(long zxid, String path, StatPersisted stat, int childCount, + List acl) { + this.zxid = zxid; + this.path = path; + this.stat = stat; + this.childCount = childCount; + this.acl = acl; + } + + long zxid; + + String path; + + StatPersisted stat; /* Make sure to create a new object when changing */ + + int childCount; + + List acl; /* Make sure to create a new object when changing */ + + @SuppressWarnings("unchecked") + ChangeRecord duplicate(long zxid) { + StatPersisted stat = new StatPersisted(); + if (this.stat != null) { + DataTree.copyStatPersisted(this.stat, stat); + } + return new ChangeRecord(zxid, path, stat, childCount, + acl == null ? new ArrayList() : new ArrayList(acl)); + } + } + + byte[] generatePasswd(long id) { + Random r = new Random(id ^ superSecret); + byte p[] = new byte[16]; + r.nextBytes(p); + return p; + } + + protected boolean checkPasswd(long sessionId, byte[] passwd) { + return sessionId != 0 + && Arrays.equals(passwd, generatePasswd(sessionId)); + } + + long createSession(ServerCnxn cnxn, byte passwd[], int timeout) { + long sessionId = sessionTracker.createSession(timeout); + Random r = new Random(sessionId ^ superSecret); + r.nextBytes(passwd); + ByteBuffer to = ByteBuffer.allocate(4); + to.putInt(timeout); + cnxn.setSessionId(sessionId); + submitRequest(cnxn, sessionId, OpCode.createSession, 0, to, null); + return sessionId; + } + + /** + * set the owner of this session as owner + * @param id the session id + * @param owner the owner of the session + * @throws SessionExpiredException + */ + public void setOwner(long id, Object owner) throws SessionExpiredException { + sessionTracker.setOwner(id, owner); + } + + protected void revalidateSession(ServerCnxn cnxn, long sessionId, + int sessionTimeout) throws IOException { + boolean rc = sessionTracker.touchSession(sessionId, sessionTimeout); + if (LOG.isTraceEnabled()) { + ZooTrace.logTraceMessage(LOG,ZooTrace.SESSION_TRACE_MASK, + "Session 0x" + Long.toHexString(sessionId) + + " is valid: " + rc); + } + finishSessionInit(cnxn, rc); + } + + public void reopenSession(ServerCnxn cnxn, long sessionId, byte[] passwd, + int sessionTimeout) throws IOException { + if (!checkPasswd(sessionId, passwd)) { + finishSessionInit(cnxn, false); + } else { + revalidateSession(cnxn, sessionId, sessionTimeout); + } + } + + public void finishSessionInit(ServerCnxn cnxn, boolean valid) { + // register with JMX + try { + if (valid) { + serverCnxnFactory.registerConnection(cnxn); + } + } catch (Exception e) { + LOG.warn("Failed to register with JMX", e); + } + + try { + ConnectResponse rsp = new ConnectResponse(0, valid ? cnxn.getSessionTimeout() + : 0, valid ? cnxn.getSessionId() : 0, // send 0 if session is no + // longer valid + valid ? generatePasswd(cnxn.getSessionId()) : new byte[16]); + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + BinaryOutputArchive bos = BinaryOutputArchive.getArchive(baos); + bos.writeInt(-1, "len"); + rsp.serialize(bos, "connect"); + if (!cnxn.isOldClient) { + bos.writeBool( + this instanceof ReadOnlyZooKeeperServer, "readOnly"); + } + baos.close(); + ByteBuffer bb = ByteBuffer.wrap(baos.toByteArray()); + bb.putInt(bb.remaining() - 4).rewind(); + cnxn.sendBuffer(bb); + + if (!valid) { + LOG.info("Invalid session 0x" + + Long.toHexString(cnxn.getSessionId()) + + " for client " + + cnxn.getRemoteSocketAddress() + + ", probably expired"); + cnxn.sendBuffer(ServerCnxnFactory.closeConn); + } else { + LOG.info("Established session 0x" + + Long.toHexString(cnxn.getSessionId()) + + " with negotiated timeout " + cnxn.getSessionTimeout() + + " for client " + + cnxn.getRemoteSocketAddress()); + cnxn.enableRecv(); + } + + } catch (Exception e) { + LOG.warn("Exception while establishing session, closing", e); + cnxn.close(); + } + } + + public void closeSession(ServerCnxn cnxn, RequestHeader requestHeader) { + closeSession(cnxn.getSessionId()); + } + + public long getServerId() { + return 0; + } + + /** + * @param cnxn + * @param sessionId + * @param xid + * @param bb + */ + private void submitRequest(ServerCnxn cnxn, long sessionId, int type, + int xid, ByteBuffer bb, List authInfo) { + Request si = new Request(cnxn, sessionId, xid, type, bb, authInfo); + submitRequest(si); + } + + public void submitRequest(Request si) { + if (firstProcessor == null) { + synchronized (this) { + try { + while (!running) { + wait(1000); + } + } catch (InterruptedException e) { + LOG.warn("Unexpected interruption", e); + } + if (firstProcessor == null) { + throw new RuntimeException("Not started"); + } + } + } + try { + touch(si.cnxn); + boolean validpacket = Request.isValid(si.type); + if (validpacket) { + firstProcessor.processRequest(si); + if (si.cnxn != null) { + incInProcess(); + } + } else { + LOG.warn("Received packet at server of unknown type " + si.type); + new UnimplementedRequestProcessor().processRequest(si); + } + } catch (MissingSessionException e) { + if (LOG.isDebugEnabled()) { + LOG.debug("Dropping request: " + e.getMessage()); + } + } catch (RequestProcessorException e) { + LOG.error("Unable to process request:" + e.getMessage(), e); + } + } + + public static int getSnapCount() { + String sc = System.getProperty("zookeeper.snapCount"); + try { + int snapCount = Integer.parseInt(sc); + + // snapCount must be 2 or more. See org.apache.zookeeper.server.SyncRequestProcessor + if( snapCount < 2 ) { + LOG.warn("SnapCount should be 2 or more. Now, snapCount is reset to 2"); + snapCount = 2; + } + return snapCount; + } catch (Exception e) { + return 100000; + } + } + + public int getGlobalOutstandingLimit() { + String sc = System.getProperty("zookeeper.globalOutstandingLimit"); + int limit; + try { + limit = Integer.parseInt(sc); + } catch (Exception e) { + limit = 1000; + } + return limit; + } + + public void setServerCnxnFactory(ServerCnxnFactory factory) { + serverCnxnFactory = factory; + } + + public ServerCnxnFactory getServerCnxnFactory() { + return serverCnxnFactory; + } + + /** + * return the last proceesed id from the + * datatree + */ + public long getLastProcessedZxid() { + return zkDb.getDataTreeLastProcessedZxid(); + } + + /** + * return the outstanding requests + * in the queue, which havent been + * processed yet + */ + public long getOutstandingRequests() { + return getInProcess(); + } + + /** + * trunccate the log to get in sync with others + * if in a quorum + * @param zxid the zxid that it needs to get in sync + * with others + * @throws IOException + */ + public void truncateLog(long zxid) throws IOException { + this.zkDb.truncateLog(zxid); + } + + public int getTickTime() { + return tickTime; + } + + public void setTickTime(int tickTime) { + LOG.info("tickTime set to " + tickTime); + this.tickTime = tickTime; + } + + public int getMinSessionTimeout() { + return minSessionTimeout == -1 ? tickTime * 2 : minSessionTimeout; + } + + public void setMinSessionTimeout(int min) { + LOG.info("minSessionTimeout set to " + min); + this.minSessionTimeout = min; + } + + public int getMaxSessionTimeout() { + return maxSessionTimeout == -1 ? tickTime * 20 : maxSessionTimeout; + } + + public void setMaxSessionTimeout(int max) { + LOG.info("maxSessionTimeout set to " + max); + this.maxSessionTimeout = max; + } + + public int getClientPort() { + return serverCnxnFactory != null ? serverCnxnFactory.getLocalPort() : -1; + } + + public void setTxnLogFactory(FileTxnSnapLog txnLog) { + this.txnLogFactory = txnLog; + } + + public FileTxnSnapLog getTxnLogFactory() { + return this.txnLogFactory; + } + + public String getState() { + return "standalone"; + } + + public void dumpEphemerals(PrintWriter pwriter) { + zkDb.dumpEphemerals(pwriter); + } + + /** + * return the total number of client connections that are alive + * to this server + */ + public int getNumAliveConnections() { + return serverCnxnFactory.getNumAliveConnections(); + } + + public void processConnectRequest(ServerCnxn cnxn, ByteBuffer incomingBuffer) throws IOException { + BinaryInputArchive bia = BinaryInputArchive.getArchive(new ByteBufferInputStream(incomingBuffer)); + ConnectRequest connReq = new ConnectRequest(); + connReq.deserialize(bia, "connect"); + if (LOG.isDebugEnabled()) { + LOG.debug("Session establishment request from client " + + cnxn.getRemoteSocketAddress() + + " client's lastZxid is 0x" + + Long.toHexString(connReq.getLastZxidSeen())); + } + boolean readOnly = false; + try { + readOnly = bia.readBool("readOnly"); + cnxn.isOldClient = false; + } catch (IOException e) { + // this is ok -- just a packet from an old client which + // doesn't contain readOnly field + LOG.warn("Connection request from old client " + + cnxn.getRemoteSocketAddress() + + "; will be dropped if server is in r-o mode"); + } + if (readOnly == false && this instanceof ReadOnlyZooKeeperServer) { + String msg = "Refusing session request for not-read-only client " + + cnxn.getRemoteSocketAddress(); + LOG.info(msg); + throw new CloseRequestException(msg); + } + if (connReq.getLastZxidSeen() > zkDb.dataTree.lastProcessedZxid) { + String msg = "Refusing session request for client " + + cnxn.getRemoteSocketAddress() + + " as it has seen zxid 0x" + + Long.toHexString(connReq.getLastZxidSeen()) + + " our last zxid is 0x" + + Long.toHexString(getZKDatabase().getDataTreeLastProcessedZxid()) + + " client must try another server"; + + LOG.info(msg); + throw new CloseRequestException(msg); + } + int sessionTimeout = connReq.getTimeOut(); + byte passwd[] = connReq.getPasswd(); + int minSessionTimeout = getMinSessionTimeout(); + if (sessionTimeout < minSessionTimeout) { + sessionTimeout = minSessionTimeout; + } + int maxSessionTimeout = getMaxSessionTimeout(); + if (sessionTimeout > maxSessionTimeout) { + sessionTimeout = maxSessionTimeout; + } + cnxn.setSessionTimeout(sessionTimeout); + // We don't want to receive any packets until we are sure that the + // session is setup + cnxn.disableRecv(); + long sessionId = connReq.getSessionId(); + if (sessionId != 0) { + long clientSessionId = connReq.getSessionId(); + LOG.info("Client attempting to renew session 0x" + + Long.toHexString(clientSessionId) + + " at " + cnxn.getRemoteSocketAddress()); + serverCnxnFactory.closeSession(sessionId); + cnxn.setSessionId(sessionId); + reopenSession(cnxn, sessionId, passwd, sessionTimeout); + } else { + LOG.info("Client attempting to establish new session at " + + cnxn.getRemoteSocketAddress()); + createSession(cnxn, passwd, sessionTimeout); + } + } + + public boolean shouldThrottle(long outStandingCount) { + if (getGlobalOutstandingLimit() < getInProcess()) { + return outStandingCount > 0; + } + return false; + } + + public void processPacket(ServerCnxn cnxn, ByteBuffer incomingBuffer) throws IOException { + // We have the request, now process and setup for next + InputStream bais = new ByteBufferInputStream(incomingBuffer); + BinaryInputArchive bia = BinaryInputArchive.getArchive(bais); + RequestHeader h = new RequestHeader(); + h.deserialize(bia, "header"); + // Through the magic of byte buffers, txn will not be + // pointing + // to the start of the txn + incomingBuffer = incomingBuffer.slice(); + if (h.getType() == OpCode.auth) { + LOG.info("got auth packet " + cnxn.getRemoteSocketAddress()); + AuthPacket authPacket = new AuthPacket(); + ByteBufferInputStream.byteBuffer2Record(incomingBuffer, authPacket); + String scheme = authPacket.getScheme(); + AuthenticationProvider ap = ProviderRegistry.getProvider(scheme); + Code authReturn = KeeperException.Code.AUTHFAILED; + if(ap != null) { + try { + authReturn = ap.handleAuthentication(cnxn, authPacket.getAuth()); + } catch(RuntimeException e) { + LOG.warn("Caught runtime exception from AuthenticationProvider: " + scheme + " due to " + e); + authReturn = KeeperException.Code.AUTHFAILED; + } + } + if (authReturn!= KeeperException.Code.OK) { + if (ap == null) { + LOG.warn("No authentication provider for scheme: " + + scheme + " has " + + ProviderRegistry.listProviders()); + } else { + LOG.warn("Authentication failed for scheme: " + scheme); + } + // send a response... + ReplyHeader rh = new ReplyHeader(h.getXid(), 0, + KeeperException.Code.AUTHFAILED.intValue()); + cnxn.sendResponse(rh, null, null); + // ... and close connection + cnxn.sendBuffer(ServerCnxnFactory.closeConn); + cnxn.disableRecv(); + } else { + if (LOG.isDebugEnabled()) { + LOG.debug("Authentication succeeded for scheme: " + + scheme); + } + LOG.info("auth success " + cnxn.getRemoteSocketAddress()); + ReplyHeader rh = new ReplyHeader(h.getXid(), 0, + KeeperException.Code.OK.intValue()); + cnxn.sendResponse(rh, null, null); + } + return; + } else { + if (h.getType() == OpCode.sasl) { + Record rsp = processSasl(incomingBuffer,cnxn); + ReplyHeader rh = new ReplyHeader(h.getXid(), 0, KeeperException.Code.OK.intValue()); + cnxn.sendResponse(rh,rsp, "response"); // not sure about 3rd arg..what is it? + } + else { + Request si = new Request(cnxn, cnxn.getSessionId(), h.getXid(), + h.getType(), incomingBuffer, cnxn.getAuthInfo()); + si.setOwner(ServerCnxn.me); + submitRequest(si); + } + } + cnxn.incrOutstandingRequests(h); + } + + private Record processSasl(ByteBuffer incomingBuffer, ServerCnxn cnxn) throws IOException { + LOG.debug("Responding to client SASL token."); + GetSASLRequest clientTokenRecord = new GetSASLRequest(); + ByteBufferInputStream.byteBuffer2Record(incomingBuffer,clientTokenRecord); + byte[] clientToken = clientTokenRecord.getToken(); + LOG.debug("Size of client SASL token: " + clientToken.length); + byte[] responseToken = null; + try { + ZooKeeperSaslServer saslServer = cnxn.zooKeeperSaslServer; + try { + // note that clientToken might be empty (clientToken.length == 0): + // if using the DIGEST-MD5 mechanism, clientToken will be empty at the beginning of the + // SASL negotiation process. + responseToken = saslServer.evaluateResponse(clientToken); + if (saslServer.isComplete() == true) { + String authorizationID = saslServer.getAuthorizationID(); + LOG.info("adding SASL authorization for authorizationID: " + authorizationID); + cnxn.addAuthInfo(new Id("sasl",authorizationID)); + } + } + catch (SaslException e) { + LOG.warn("Client failed to SASL authenticate: " + e); + if ((System.getProperty("zookeeper.allowSaslFailedClients") != null) + && + (System.getProperty("zookeeper.allowSaslFailedClients").equals("true"))) { + LOG.warn("Maintaining client connection despite SASL authentication failure."); + } else { + LOG.warn("Closing client connection due to SASL authentication failure."); + cnxn.close(); + } + } + } + catch (NullPointerException e) { + LOG.error("cnxn.saslServer is null: cnxn object did not initialize its saslServer properly."); + } + if (responseToken != null) { + LOG.debug("Size of server SASL response: " + responseToken.length); + } + // wrap SASL response token to client inside a Response object. + return new SetSASLResponse(responseToken); + } + + public ProcessTxnResult processTxn(TxnHeader hdr, Record txn) { + ProcessTxnResult rc; + int opCode = hdr.getType(); + long sessionId = hdr.getClientId(); + rc = getZKDatabase().processTxn(hdr, txn); + if (opCode == OpCode.createSession) { + if (txn instanceof CreateSessionTxn) { + CreateSessionTxn cst = (CreateSessionTxn) txn; + sessionTracker.addSession(sessionId, cst + .getTimeOut()); + } else { + LOG.warn("*****>>>>> Got " + + txn.getClass() + " " + + txn.toString()); + } + } else if (opCode == OpCode.closeSession) { + sessionTracker.removeSession(sessionId); + } + return rc; + } + + +} diff --git a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/ZooKeeperServerBean.java b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/ZooKeeperServerBean.java new file mode 100644 index 000000000..0eb5c7f97 --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/ZooKeeperServerBean.java @@ -0,0 +1,147 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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. + */ + +package org.apache.zookeeper.server; + +import java.net.InetAddress; +import java.net.UnknownHostException; +import java.util.Date; + +import org.apache.zookeeper.Version; +import org.apache.zookeeper.jmx.ZKMBeanInfo; + +/** + * This class implements the ZooKeeper server MBean interface. + */ +public class ZooKeeperServerBean implements ZooKeeperServerMXBean, ZKMBeanInfo { + private final Date startTime; + private final String name; + + protected final ZooKeeperServer zks; + + public ZooKeeperServerBean(ZooKeeperServer zks) { + startTime = new Date(); + this.zks = zks; + name = "StandaloneServer_port" + zks.getClientPort(); + } + + public String getClientPort() { + try { + return InetAddress.getLocalHost().getHostAddress() + ":" + + zks.getClientPort(); + } catch (UnknownHostException e) { + return "localhost:" + zks.getClientPort(); + } + } + + public String getName() { + return name; + } + + public boolean isHidden() { + return false; + } + + public String getStartTime() { + return startTime.toString(); + } + + public String getVersion() { + return Version.getFullVersion(); + } + + public long getAvgRequestLatency() { + return zks.serverStats().getAvgLatency(); + } + + public long getMaxRequestLatency() { + return zks.serverStats().getMaxLatency(); + } + + public long getMinRequestLatency() { + return zks.serverStats().getMinLatency(); + } + + public long getOutstandingRequests() { + return zks.serverStats().getOutstandingRequests(); + } + + public int getTickTime() { + return zks.getTickTime(); + } + + public void setTickTime(int tickTime) { + zks.setTickTime(tickTime); + } + + public int getMaxClientCnxnsPerHost() { + ServerCnxnFactory fac = zks.getServerCnxnFactory(); + if (fac == null) { + return -1; + } + return fac.getMaxClientCnxnsPerHost(); + } + + public void setMaxClientCnxnsPerHost(int max) { + // if fac is null the exception will be propagated to the client + zks.getServerCnxnFactory().setMaxClientCnxnsPerHost(max); + } + + public int getMinSessionTimeout() { + return zks.getMinSessionTimeout(); + } + + public void setMinSessionTimeout(int min) { + zks.setMinSessionTimeout(min); + } + + public int getMaxSessionTimeout() { + return zks.getMaxSessionTimeout(); + } + + public void setMaxSessionTimeout(int max) { + zks.setMaxSessionTimeout(max); + } + + + public long getPacketsReceived() { + return zks.serverStats().getPacketsReceived(); + } + + public long getPacketsSent() { + return zks.serverStats().getPacketsSent(); + } + + public void resetLatency() { + zks.serverStats().resetLatency(); + } + + public void resetMaxLatency() { + zks.serverStats().resetMaxLatency(); + } + + public void resetStatistics() { + ServerStats serverStats = zks.serverStats(); + serverStats.resetRequestCounters(); + serverStats.resetLatency(); + } + + public long getNumAliveConnections() { + return zks.getNumAliveConnections(); + } +} diff --git a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/ZooKeeperServerMXBean.java b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/ZooKeeperServerMXBean.java new file mode 100644 index 000000000..127ead8a0 --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/ZooKeeperServerMXBean.java @@ -0,0 +1,110 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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. + */ + +package org.apache.zookeeper.server; + +/** + * ZooKeeper server MBean. + */ +public interface ZooKeeperServerMXBean { + /** + * @return the server socket port number + */ + public String getClientPort(); + /** + * @return the zookeeper server version + */ + public String getVersion(); + /** + * @return time the server was started + */ + public String getStartTime(); + /** + * @return min request latency in ms + */ + public long getMinRequestLatency(); + /** + * @return average request latency in ms + */ + public long getAvgRequestLatency(); + /** + * @return max request latency in ms + */ + public long getMaxRequestLatency(); + /** + * @return number of packets received so far + */ + public long getPacketsReceived(); + /** + * @return number of packets sent so far + */ + public long getPacketsSent(); + /** + * @return number of outstanding requests. + */ + public long getOutstandingRequests(); + /** + * Current TickTime of server in milliseconds + */ + public int getTickTime(); + /** + * Set TickTime of server in milliseconds + */ + public void setTickTime(int tickTime); + + /** Current maxClientCnxns allowed from a particular host */ + public int getMaxClientCnxnsPerHost(); + + /** Set maxClientCnxns allowed from a particular host */ + public void setMaxClientCnxnsPerHost(int max); + + /** + * Current minSessionTimeout of the server in milliseconds + */ + public int getMinSessionTimeout(); + /** + * Set minSessionTimeout of server in milliseconds + */ + public void setMinSessionTimeout(int min); + + /** + * Current maxSessionTimeout of the server in milliseconds + */ + public int getMaxSessionTimeout(); + /** + * Set maxSessionTimeout of server in milliseconds + */ + public void setMaxSessionTimeout(int max); + + /** + * Reset packet and latency statistics + */ + public void resetStatistics(); + /** + * Reset min/avg/max latency statistics + */ + public void resetLatency(); + /** + * Reset max latency statistics only. + */ + public void resetMaxLatency(); + /** + * @return number of alive client connections + */ + public long getNumAliveConnections(); +} diff --git a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/ZooKeeperServerMain.java b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/ZooKeeperServerMain.java new file mode 100644 index 000000000..c7eb9d640 --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/ZooKeeperServerMain.java @@ -0,0 +1,134 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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. + */ + +package org.apache.zookeeper.server; + +import java.io.File; +import java.io.IOException; + +import javax.management.JMException; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.apache.zookeeper.jmx.ManagedUtil; +import org.apache.zookeeper.server.persistence.FileTxnSnapLog; +import org.apache.zookeeper.server.quorum.QuorumPeerConfig.ConfigException; + +/** + * This class starts and runs a standalone ZooKeeperServer. + */ +public class ZooKeeperServerMain { + private static final Logger LOG = + LoggerFactory.getLogger(ZooKeeperServerMain.class); + + private static final String USAGE = + "Usage: ZooKeeperServerMain configfile | port datadir [ticktime] [maxcnxns]"; + + private ServerCnxnFactory cnxnFactory; + + /* + * Start up the ZooKeeper server. + * + * @param args the configfile or the port datadir [ticktime] + */ + public static void main(String[] args) { + ZooKeeperServerMain main = new ZooKeeperServerMain(); + try { + main.initializeAndRun(args); + } catch (IllegalArgumentException e) { + LOG.error("Invalid arguments, exiting abnormally", e); + LOG.info(USAGE); + System.err.println(USAGE); + System.exit(2); + } catch (ConfigException e) { + LOG.error("Invalid config, exiting abnormally", e); + System.err.println("Invalid config, exiting abnormally"); + System.exit(2); + } catch (Exception e) { + LOG.error("Unexpected exception, exiting abnormally", e); + System.exit(1); + } + LOG.info("Exiting normally"); + System.exit(0); + } + + protected void initializeAndRun(String[] args) + throws ConfigException, IOException + { + try { + ManagedUtil.registerLog4jMBeans(); + } catch (JMException e) { + LOG.warn("Unable to register log4j JMX control", e); + } + + ServerConfig config = new ServerConfig(); + if (args.length == 1) { + config.parse(args[0]); + } else { + config.parse(args); + } + + runFromConfig(config); + } + + /** + * Run from a ServerConfig. + * @param config ServerConfig to use. + * @throws IOException + */ + public void runFromConfig(ServerConfig config) throws IOException { + LOG.info("Starting server"); + FileTxnSnapLog txnLog = null; + try { + // Note that this thread isn't going to be doing anything else, + // so rather than spawning another thread, we will just call + // run() in this thread. + // create a file logger url from the command line args + ZooKeeperServer zkServer = new ZooKeeperServer(); + + txnLog = new FileTxnSnapLog(new File(config.dataLogDir), new File( + config.dataDir)); + zkServer.setTxnLogFactory(txnLog); + zkServer.setTickTime(config.tickTime); + zkServer.setMinSessionTimeout(config.minSessionTimeout); + zkServer.setMaxSessionTimeout(config.maxSessionTimeout); + cnxnFactory = ServerCnxnFactory.createFactory(); + cnxnFactory.configure(config.getClientPortAddress(), + config.getMaxClientCnxns()); + cnxnFactory.startup(zkServer); + cnxnFactory.join(); + if (zkServer.isRunning()) { + zkServer.shutdown(); + } + } catch (InterruptedException e) { + // warn, but generally this is ok + LOG.warn("Server interrupted", e); + } finally { + if (txnLog != null) { + txnLog.close(); + } + } + } + + /** + * Shutdown the serving instance + */ + protected void shutdown() { + cnxnFactory.shutdown(); + } +} diff --git a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/ZooTrace.java b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/ZooTrace.java new file mode 100644 index 000000000..ac14fe22c --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/ZooTrace.java @@ -0,0 +1,93 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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. + */ + +package org.apache.zookeeper.server; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import org.apache.zookeeper.server.quorum.QuorumPacket; + +/** + * This class encapsulates and centralizes tracing for the ZooKeeper server. + * Trace messages go to the log with TRACE level. + *

      + * Log4j must be correctly configured to capture the TRACE messages. + */ +public class ZooTrace { + final static public long CLIENT_REQUEST_TRACE_MASK = 1 << 1; + + final static public long CLIENT_DATA_PACKET_TRACE_MASK = 1 << 2; + + final static public long CLIENT_PING_TRACE_MASK = 1 << 3; + + final static public long SERVER_PACKET_TRACE_MASK = 1 << 4; + + final static public long SESSION_TRACE_MASK = 1 << 5; + + final static public long EVENT_DELIVERY_TRACE_MASK = 1 << 6; + + final static public long SERVER_PING_TRACE_MASK = 1 << 7; + + final static public long WARNING_TRACE_MASK = 1 << 8; + + final static public long JMX_TRACE_MASK = 1 << 9; + + private static long traceMask = CLIENT_REQUEST_TRACE_MASK + | SERVER_PACKET_TRACE_MASK | SESSION_TRACE_MASK + | WARNING_TRACE_MASK; + + public static long getTextTraceLevel() { + return traceMask; + } + + public static void setTextTraceLevel(long mask) { + traceMask = mask; + Logger LOG = LoggerFactory.getLogger(ZooTrace.class); + LOG.info("Set text trace mask to 0x" + Long.toHexString(mask)); + } + + public static boolean isTraceEnabled(Logger log, long mask) { + return log.isTraceEnabled() && (mask & traceMask) != 0; + } + + public static void logTraceMessage(Logger log, long mask, String msg) { + if (isTraceEnabled(log, mask)) { + log.trace(msg); + } + } + + static public void logQuorumPacket(Logger log, long mask, + char direction, QuorumPacket qp) + { + return; + + // if (isTraceEnabled(log, mask)) { + // logTraceMessage(LOG, mask, direction + " " + // + FollowerHandler.packetToString(qp)); + // } + } + + static public void logRequest(Logger log, long mask, + char rp, Request request, String header) + { + if (isTraceEnabled(log, mask)) { + log.trace(header + ":" + rp + request.toString()); + } + } +} diff --git a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/auth/AuthenticationProvider.java b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/auth/AuthenticationProvider.java new file mode 100644 index 000000000..dd6e32fde --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/auth/AuthenticationProvider.java @@ -0,0 +1,82 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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. + */ + +package org.apache.zookeeper.server.auth; + +import org.apache.zookeeper.KeeperException; +import org.apache.zookeeper.server.ServerCnxn; + +/** + * This interface is implemented by authentication providers to add new kinds of + * authentication schemes to ZooKeeper. + */ +public interface AuthenticationProvider { + /** + * The String used to represent this provider. This will correspond to the + * scheme field of an Id. + * + * @return the scheme of this provider. + */ + String getScheme(); + + /** + * This method is called when a client passes authentication data for this + * scheme. The authData is directly from the authentication packet. The + * implementor may attach new ids to the authInfo field of cnxn or may use + * cnxn to send packets back to the client. + * + * @param cnxn + * the cnxn that received the authentication information. + * @param authData + * the authentication data received. + * @return TODO + */ + KeeperException.Code handleAuthentication(ServerCnxn cnxn, byte authData[]); + + /** + * This method is called to see if the given id matches the given id + * expression in the ACL. This allows schemes to use application specific + * wild cards. + * + * @param id + * the id to check. + * @param aclExpr + * the expression to match ids against. + * @return true if the id can be matched by the expression. + */ + boolean matches(String id, String aclExpr); + + /** + * This method is used to check if the authentication done by this provider + * should be used to identify the creator of a node. Some ids such as hosts + * and ip addresses are rather transient and in general don't really + * identify a client even though sometimes they do. + * + * @return true if this provider identifies creators. + */ + boolean isAuthenticated(); + + /** + * Validates the syntax of an id. + * + * @param id + * the id to validate. + * @return true if id is well formed. + */ + boolean isValid(String id); +} diff --git a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/auth/DigestAuthenticationProvider.java b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/auth/DigestAuthenticationProvider.java new file mode 100644 index 000000000..2427e7a4b --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/auth/DigestAuthenticationProvider.java @@ -0,0 +1,139 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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. + */ + +package org.apache.zookeeper.server.auth; + +import java.security.MessageDigest; +import java.security.NoSuchAlgorithmException; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.apache.zookeeper.KeeperException; +import org.apache.zookeeper.data.Id; +import org.apache.zookeeper.server.ServerCnxn; + +public class DigestAuthenticationProvider implements AuthenticationProvider { + private static final Logger LOG = + LoggerFactory.getLogger(DigestAuthenticationProvider.class); + + /** specify a command line property with key of + * "zookeeper.DigestAuthenticationProvider.superDigest" + * and value of "super:" to enable + * super user access (i.e. acls disabled) + */ + private final static String superDigest = System.getProperty( + "zookeeper.DigestAuthenticationProvider.superDigest"); + + public String getScheme() { + return "digest"; + } + + static final private String base64Encode(byte b[]) { + StringBuilder sb = new StringBuilder(); + for (int i = 0; i < b.length;) { + int pad = 0; + int v = (b[i++] & 0xff) << 16; + if (i < b.length) { + v |= (b[i++] & 0xff) << 8; + } else { + pad++; + } + if (i < b.length) { + v |= (b[i++] & 0xff); + } else { + pad++; + } + sb.append(encode(v >> 18)); + sb.append(encode(v >> 12)); + if (pad < 2) { + sb.append(encode(v >> 6)); + } else { + sb.append('='); + } + if (pad < 1) { + sb.append(encode(v)); + } else { + sb.append('='); + } + } + return sb.toString(); + } + + static final private char encode(int i) { + i &= 0x3f; + if (i < 26) { + return (char) ('A' + i); + } + if (i < 52) { + return (char) ('a' + i - 26); + } + if (i < 62) { + return (char) ('0' + i - 52); + } + return i == 62 ? '+' : '/'; + } + + static public String generateDigest(String idPassword) + throws NoSuchAlgorithmException { + String parts[] = idPassword.split(":", 2); + byte digest[] = MessageDigest.getInstance("SHA1").digest( + idPassword.getBytes()); + return parts[0] + ":" + base64Encode(digest); + } + + public KeeperException.Code + handleAuthentication(ServerCnxn cnxn, byte[] authData) + { + String id = new String(authData); + try { + String digest = generateDigest(id); + if (digest.equals(superDigest)) { + cnxn.addAuthInfo(new Id("super", "")); + } + cnxn.addAuthInfo(new Id(getScheme(), digest)); + return KeeperException.Code.OK; + } catch (NoSuchAlgorithmException e) { + LOG.error("Missing algorithm",e); + } + return KeeperException.Code.AUTHFAILED; + } + + public boolean isAuthenticated() { + return true; + } + + public boolean isValid(String id) { + String parts[] = id.split(":"); + return parts.length == 2; + } + + public boolean matches(String id, String aclExpr) { + return id.equals(aclExpr); + } + + /** Call with a single argument of user:pass to generate authdata. + * Authdata output can be used when setting superDigest for example. + * @param args single argument of user:pass + * @throws NoSuchAlgorithmException + */ + public static void main(String args[]) throws NoSuchAlgorithmException { + for (int i = 0; i < args.length; i++) { + System.out.println(args[i] + "->" + generateDigest(args[i])); + } + } +} diff --git a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/auth/DigestLoginModule.java b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/auth/DigestLoginModule.java new file mode 100644 index 000000000..955c728b6 --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/auth/DigestLoginModule.java @@ -0,0 +1,61 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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. + */ + +package org.apache.zookeeper.server.auth; + +import javax.security.auth.Subject; +import javax.security.auth.callback.CallbackHandler; +import javax.security.auth.spi.LoginModule; +import java.util.Map; + +public class DigestLoginModule implements LoginModule { + private Subject subject; + + public boolean abort() { + return false; + } + + public boolean commit() { + return true; + } + + public void initialize(Subject subject, CallbackHandler callbackHandler, Map sharedState, Map options) { + if (options.containsKey("username")) { + // Zookeeper client: get username and password from JAAS conf (only used if using DIGEST-MD5). + this.subject = subject; + String username = (String)options.get("username"); + this.subject.getPublicCredentials().add((Object)username); + String password = (String)options.get("password"); + this.subject.getPrivateCredentials().add((Object)password); + } + return; + } + + public boolean logout() { + return true; + } + + public boolean login() { + // Unlike with Krb5LoginModule, we don't do any actual login or credential passing here: authentication to Zookeeper + // is done later, through the SASLClient object. + return true; + } + +} + + diff --git a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/auth/IPAuthenticationProvider.java b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/auth/IPAuthenticationProvider.java new file mode 100644 index 000000000..192dc0603 --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/auth/IPAuthenticationProvider.java @@ -0,0 +1,117 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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. + */ + +package org.apache.zookeeper.server.auth; + +import org.apache.zookeeper.KeeperException; +import org.apache.zookeeper.data.Id; +import org.apache.zookeeper.server.ServerCnxn; + +public class IPAuthenticationProvider implements AuthenticationProvider { + + public String getScheme() { + return "ip"; + } + + public KeeperException.Code + handleAuthentication(ServerCnxn cnxn, byte[] authData) + { + String id = cnxn.getRemoteSocketAddress().getAddress().getHostAddress(); + cnxn.addAuthInfo(new Id(getScheme(), id)); + return KeeperException.Code.OK; + } + + // This is a bit weird but we need to return the address and the number of + // bytes (to distinguish between IPv4 and IPv6 + private byte[] addr2Bytes(String addr) { + byte b[] = v4addr2Bytes(addr); + // TODO Write the v6addr2Bytes + return b; + } + + private byte[] v4addr2Bytes(String addr) { + String parts[] = addr.split("\\.", -1); + if (parts.length != 4) { + return null; + } + byte b[] = new byte[4]; + for (int i = 0; i < 4; i++) { + try { + int v = Integer.parseInt(parts[i]); + if (v >= 0 && v <= 255) { + b[i] = (byte) v; + } else { + return null; + } + } catch (NumberFormatException e) { + return null; + } + } + return b; + } + + private void mask(byte b[], int bits) { + int start = bits / 8; + int startMask = (1 << (8 - (bits % 8))) - 1; + startMask = ~startMask; + while (start < b.length) { + b[start] &= startMask; + startMask = 0; + start++; + } + } + + public boolean matches(String id, String aclExpr) { + String parts[] = aclExpr.split("/", 2); + byte aclAddr[] = addr2Bytes(parts[0]); + if (aclAddr == null) { + return false; + } + int bits = aclAddr.length * 8; + if (parts.length == 2) { + try { + bits = Integer.parseInt(parts[1]); + if (bits < 0 || bits > aclAddr.length * 8) { + return false; + } + } catch (NumberFormatException e) { + return false; + } + } + mask(aclAddr, bits); + byte remoteAddr[] = addr2Bytes(id); + if (remoteAddr == null) { + return false; + } + mask(remoteAddr, bits); + for (int i = 0; i < remoteAddr.length; i++) { + if (remoteAddr[i] != aclAddr[i]) { + return false; + } + } + return true; + } + + public boolean isAuthenticated() { + return false; + } + + public boolean isValid(String id) { + return addr2Bytes(id) != null; + } +} diff --git a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/auth/KerberosName.java b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/auth/KerberosName.java new file mode 100644 index 000000000..01d1f6664 --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/auth/KerberosName.java @@ -0,0 +1,418 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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 file copied from Hadoop's security branch, + * with the following changes: + * 1. package changed from org.apache.hadoop.security to + * org.apache.zookeeper.server.auth. + * 2. Usage of Hadoop's Configuration class removed since + * it is not available in Zookeeper: instead, system property + * "zookeeper.security.auth_to_local" is used. + */ + +package org.apache.zookeeper.server.auth; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +import org.apache.zookeeper.server.util.KerberosUtil; + +/** + * This class implements parsing and handling of Kerberos principal names. In + * particular, it splits them apart and translates them down into local + * operating system names. + */ +public class KerberosName { + /** The first component of the name */ + private final String serviceName; + /** The second component of the name. It may be null. */ + private final String hostName; + /** The realm of the name. */ + private final String realm; + + /** + * A pattern that matches a Kerberos name with at most 2 components. + */ + private static final Pattern nameParser = + Pattern.compile("([^/@]*)(/([^/@]*))?@([^/@]*)"); + + /** + * A pattern that matches a string with out '$' and then a single + * parameter with $n. + */ + private static Pattern parameterPattern = + Pattern.compile("([^$]*)(\\$(\\d*))?"); + + /** + * A pattern for parsing a auth_to_local rule. + */ + private static final Pattern ruleParser = + Pattern.compile("\\s*((DEFAULT)|(RULE:\\[(\\d*):([^\\]]*)](\\(([^)]*)\\))?"+ + "(s/([^/]*)/([^/]*)/(g)?)?))"); + + /** + * A pattern that recognizes simple/non-simple names. + */ + private static final Pattern nonSimplePattern = Pattern.compile("[/@]"); + + /** + * The list of translation rules. + */ + private static List rules; + + private static String defaultRealm; + + static { + try { + defaultRealm = KerberosUtil.getDefaultRealm(); + } catch (Exception ke) { + if ((System.getProperty("zookeeper.requireKerberosConfig") != null) && + (System.getProperty("zookeeper.requireKerberosConfig").equals("true"))) { + throw new IllegalArgumentException("Can't get Kerberos configuration",ke); + } + else + defaultRealm=""; + } + try { + // setConfiguration() will work even if the above try() fails due + // to a missing Kerberos configuration (unless zookeeper.requireKerberosConfig + // is set to true, which would not allow execution to reach here due to the + // throwing of an IllegalArgumentException above). + setConfiguration(); + } + catch (IOException e) { + throw new IllegalArgumentException("Could not configure Kerberos principal name mapping."); + } + } + + /** + * Create a name from the full Kerberos principal name. + * @param name + */ + public KerberosName(String name) { + Matcher match = nameParser.matcher(name); + if (!match.matches()) { + if (name.contains("@")) { + throw new IllegalArgumentException("Malformed Kerberos name: " + name); + } else { + serviceName = name; + hostName = null; + realm = null; + } + } else { + serviceName = match.group(1); + hostName = match.group(3); + realm = match.group(4); + } + } + + /** + * Get the configured default realm. + * @return the default realm from the krb5.conf + */ + public String getDefaultRealm() { + return defaultRealm; + } + + /** + * Put the name back together from the parts. + */ + @Override + public String toString() { + StringBuilder result = new StringBuilder(); + result.append(serviceName); + if (hostName != null) { + result.append('/'); + result.append(hostName); + } + if (realm != null) { + result.append('@'); + result.append(realm); + } + return result.toString(); + } + + /** + * Get the first component of the name. + * @return the first section of the Kerberos principal name + */ + public String getServiceName() { + return serviceName; + } + + /** + * Get the second component of the name. + * @return the second section of the Kerberos principal name, and may be null + */ + public String getHostName() { + return hostName; + } + + /** + * Get the realm of the name. + * @return the realm of the name, may be null + */ + public String getRealm() { + return realm; + } + + /** + * An encoding of a rule for translating kerberos names. + */ + private static class Rule { + private final boolean isDefault; + private final int numOfComponents; + private final String format; + private final Pattern match; + private final Pattern fromPattern; + private final String toPattern; + private final boolean repeat; + + Rule() { + isDefault = true; + numOfComponents = 0; + format = null; + match = null; + fromPattern = null; + toPattern = null; + repeat = false; + } + + Rule(int numOfComponents, String format, String match, String fromPattern, + String toPattern, boolean repeat) { + isDefault = false; + this.numOfComponents = numOfComponents; + this.format = format; + this.match = match == null ? null : Pattern.compile(match); + this.fromPattern = + fromPattern == null ? null : Pattern.compile(fromPattern); + this.toPattern = toPattern; + this.repeat = repeat; + } + + @Override + public String toString() { + StringBuilder buf = new StringBuilder(); + if (isDefault) { + buf.append("DEFAULT"); + } else { + buf.append("RULE:["); + buf.append(numOfComponents); + buf.append(':'); + buf.append(format); + buf.append(']'); + if (match != null) { + buf.append('('); + buf.append(match); + buf.append(')'); + } + if (fromPattern != null) { + buf.append("s/"); + buf.append(fromPattern); + buf.append('/'); + buf.append(toPattern); + buf.append('/'); + if (repeat) { + buf.append('g'); + } + } + } + return buf.toString(); + } + + /** + * Replace the numbered parameters of the form $n where n is from 1 to + * the length of params. Normal text is copied directly and $n is replaced + * by the corresponding parameter. + * @param format the string to replace parameters again + * @param params the list of parameters + * @return the generated string with the parameter references replaced. + * @throws BadFormatString + */ + static String replaceParameters(String format, + String[] params) throws BadFormatString { + Matcher match = parameterPattern.matcher(format); + int start = 0; + StringBuilder result = new StringBuilder(); + while (start < format.length() && match.find(start)) { + result.append(match.group(1)); + String paramNum = match.group(3); + if (paramNum != null) { + try { + int num = Integer.parseInt(paramNum); + if (num < 0 || num > params.length) { + throw new BadFormatString("index " + num + " from " + format + + " is outside of the valid range 0 to " + + (params.length - 1)); + } + result.append(params[num]); + } catch (NumberFormatException nfe) { + throw new BadFormatString("bad format in username mapping in " + + paramNum, nfe); + } + + } + start = match.end(); + } + return result.toString(); + } + + /** + * Replace the matches of the from pattern in the base string with the value + * of the to string. + * @param base the string to transform + * @param from the pattern to look for in the base string + * @param to the string to replace matches of the pattern with + * @param repeat whether the substitution should be repeated + * @return + */ + static String replaceSubstitution(String base, Pattern from, String to, + boolean repeat) { + Matcher match = from.matcher(base); + if (repeat) { + return match.replaceAll(to); + } else { + return match.replaceFirst(to); + } + } + + /** + * Try to apply this rule to the given name represented as a parameter + * array. + * @param params first element is the realm, second and later elements are + * are the components of the name "a/b@FOO" -> {"FOO", "a", "b"} + * @return the short name if this rule applies or null + * @throws IOException throws if something is wrong with the rules + */ + String apply(String[] params) throws IOException { + String result = null; + if (isDefault) { + if (defaultRealm.equals(params[0])) { + result = params[1]; + } + } else if (params.length - 1 == numOfComponents) { + String base = replaceParameters(format, params); + if (match == null || match.matcher(base).matches()) { + if (fromPattern == null) { + result = base; + } else { + result = replaceSubstitution(base, fromPattern, toPattern, repeat); + } + } + } + if (result != null && nonSimplePattern.matcher(result).find()) { + throw new NoMatchingRule("Non-simple name " + result + + " after auth_to_local rule " + this); + } + return result; + } + } + + static List parseRules(String rules) { + List result = new ArrayList(); + String remaining = rules.trim(); + while (remaining.length() > 0) { + Matcher matcher = ruleParser.matcher(remaining); + if (!matcher.lookingAt()) { + throw new IllegalArgumentException("Invalid rule: " + remaining); + } + if (matcher.group(2) != null) { + result.add(new Rule()); + } else { + result.add(new Rule(Integer.parseInt(matcher.group(4)), + matcher.group(5), + matcher.group(7), + matcher.group(9), + matcher.group(10), + "g".equals(matcher.group(11)))); + } + remaining = remaining.substring(matcher.end()); + } + return result; + } + + /** + * Set the static configuration to get the rules. + * @param conf the new configuration + * @throws IOException + */ + public static void setConfiguration() throws IOException { + String ruleString = System.getProperty("zookeeper.security.auth_to_local", "DEFAULT"); + rules = parseRules(ruleString); + } + + @SuppressWarnings("serial") + public static class BadFormatString extends IOException { + BadFormatString(String msg) { + super(msg); + } + BadFormatString(String msg, Throwable err) { + super(msg, err); + } + } + + @SuppressWarnings("serial") + public static class NoMatchingRule extends IOException { + NoMatchingRule(String msg) { + super(msg); + } + } + + /** + * Get the translation of the principal name into an operating system + * user name. + * @return the short name + * @throws IOException + */ + public String getShortName() throws IOException { + String[] params; + if (hostName == null) { + // if it is already simple, just return it + if (realm == null) { + return serviceName; + } + params = new String[]{realm, serviceName}; + } else { + params = new String[]{realm, serviceName, hostName}; + } + for(Rule r: rules) { + String result = r.apply(params); + if (result != null) { + return result; + } + } + throw new NoMatchingRule("No rules applied to " + toString()); + } + + static void printRules() throws IOException { + int i = 0; + for(Rule r: rules) { + System.out.println(++i + " " + r); + } + } + + public static void main(String[] args) throws Exception { + for(String arg: args) { + KerberosName name = new KerberosName(arg); + System.out.println("Name: " + name + " to " + name.getShortName()); + } + } +} diff --git a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/auth/ProviderRegistry.java b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/auth/ProviderRegistry.java new file mode 100644 index 000000000..406015f84 --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/auth/ProviderRegistry.java @@ -0,0 +1,77 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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. + */ + +package org.apache.zookeeper.server.auth; + +import java.util.Enumeration; +import java.util.HashMap; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import org.apache.zookeeper.server.ZooKeeperServer; + +public class ProviderRegistry { + private static final Logger LOG = LoggerFactory.getLogger(ProviderRegistry.class); + + private static boolean initialized = false; + private static HashMap authenticationProviders = + new HashMap(); + + public static void initialize() { + synchronized (ProviderRegistry.class) { + if (initialized) + return; + IPAuthenticationProvider ipp = new IPAuthenticationProvider(); + DigestAuthenticationProvider digp = new DigestAuthenticationProvider(); + authenticationProviders.put(ipp.getScheme(), ipp); + authenticationProviders.put(digp.getScheme(), digp); + Enumeration en = System.getProperties().keys(); + while (en.hasMoreElements()) { + String k = (String) en.nextElement(); + if (k.startsWith("zookeeper.authProvider.")) { + String className = System.getProperty(k); + try { + Class c = ZooKeeperServer.class.getClassLoader() + .loadClass(className); + AuthenticationProvider ap = (AuthenticationProvider) c + .newInstance(); + authenticationProviders.put(ap.getScheme(), ap); + } catch (Exception e) { + LOG.warn("Problems loading " + className,e); + } + } + } + initialized = true; + } + } + + public static AuthenticationProvider getProvider(String scheme) { + if(!initialized) + initialize(); + return authenticationProviders.get(scheme); + } + + public static String listProviders() { + StringBuilder sb = new StringBuilder(); + for(String s: authenticationProviders.keySet()) { + sb.append(s + " "); +} + return sb.toString(); + } +} diff --git a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/auth/SASLAuthenticationProvider.java b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/auth/SASLAuthenticationProvider.java new file mode 100644 index 000000000..063304f44 --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/auth/SASLAuthenticationProvider.java @@ -0,0 +1,70 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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. + */ + +package org.apache.zookeeper.server.auth; + +import org.apache.zookeeper.KeeperException; +import org.apache.zookeeper.server.ServerCnxn; + +public class SASLAuthenticationProvider implements AuthenticationProvider { + + public String getScheme() { + return "sasl"; + } + + public KeeperException.Code + handleAuthentication(ServerCnxn cnxn, byte[] authData) + { + // Should never call this: SASL authentication is negotiated at session initiation. + // TODO: consider substituting current implementation of direct ClientCnxn manipulation with + // a call to this method (SASLAuthenticationProvider:handleAuthentication()) at session initiation. + return KeeperException.Code.AUTHFAILED; + + } + + public boolean matches(String id,String aclExpr) { + if (System.getProperty("zookeeper.superUser") != null) { + return (id.equals(System.getProperty("zookeeper.superUser")) || id.equals(aclExpr)); + } + return (id.equals("super") || id.equals(aclExpr)); + } + + public boolean isAuthenticated() { + return true; + } + + public boolean isValid(String id) { + // Since the SASL authenticator will usually be used with Kerberos authentication, + // it should enforce that these names are valid according to Kerberos's + // syntax for principals. + // + // Use the KerberosName(id) constructor to define validity: + // if KerberosName(id) throws IllegalArgumentException, then id is invalid. + // otherwise, it is valid. + // + try { + new KerberosName(id); + return true; + } + catch (IllegalArgumentException e) { + return false; + } + } + + +} diff --git a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/auth/SaslServerCallbackHandler.java b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/auth/SaslServerCallbackHandler.java new file mode 100644 index 000000000..2fbd6eda4 --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/auth/SaslServerCallbackHandler.java @@ -0,0 +1,152 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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. + */ + +package org.apache.zookeeper.server.auth; + +import java.io.IOException; +import java.util.HashMap; +import java.util.Map; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import javax.security.auth.callback.Callback; +import javax.security.auth.callback.CallbackHandler; +import javax.security.auth.callback.NameCallback; +import javax.security.auth.callback.PasswordCallback; +import javax.security.auth.callback.UnsupportedCallbackException; +import javax.security.auth.login.AppConfigurationEntry; +import javax.security.auth.login.Configuration; +import javax.security.sasl.AuthorizeCallback; +import javax.security.sasl.RealmCallback; + +import org.apache.zookeeper.server.ZooKeeperSaslServer; + +public class SaslServerCallbackHandler implements CallbackHandler { + private static final String USER_PREFIX = "user_"; + private static final Logger LOG = LoggerFactory.getLogger(SaslServerCallbackHandler.class); + private static final String SYSPROP_SUPER_PASSWORD = "zookeeper.SASLAuthenticationProvider.superPassword"; + private static final String SYSPROP_REMOVE_HOST = "zookeeper.kerberos.removeHostFromPrincipal"; + private static final String SYSPROP_REMOVE_REALM = "zookeeper.kerberos.removeRealmFromPrincipal"; + + private String userName; + private final Map credentials = new HashMap(); + + public SaslServerCallbackHandler(Configuration configuration) throws IOException { + String serverSection = System.getProperty(ZooKeeperSaslServer.LOGIN_CONTEXT_NAME_KEY, + ZooKeeperSaslServer.DEFAULT_LOGIN_CONTEXT_NAME); + AppConfigurationEntry configurationEntries[] = configuration.getAppConfigurationEntry(serverSection); + + if (configurationEntries == null) { + String errorMessage = "Could not find a 'Server' entry in this configuration: Server cannot start."; + LOG.error(errorMessage); + throw new IOException(errorMessage); + } + credentials.clear(); + for(AppConfigurationEntry entry: configurationEntries) { + Map options = entry.getOptions(); + // Populate DIGEST-MD5 user -> password map with JAAS configuration entries from the "Server" section. + // Usernames are distinguished from other options by prefixing the username with a "user_" prefix. + for(Map.Entry pair : options.entrySet()) { + String key = pair.getKey(); + if (key.startsWith(USER_PREFIX)) { + String userName = key.substring(USER_PREFIX.length()); + credentials.put(userName,(String)pair.getValue()); + } + } + } + } + + public void handle(Callback[] callbacks) throws UnsupportedCallbackException { + for (Callback callback : callbacks) { + if (callback instanceof NameCallback) { + handleNameCallback((NameCallback) callback); + } else if (callback instanceof PasswordCallback) { + handlePasswordCallback((PasswordCallback) callback); + } else if (callback instanceof RealmCallback) { + handleRealmCallback((RealmCallback) callback); + } else if (callback instanceof AuthorizeCallback) { + handleAuthorizeCallback((AuthorizeCallback) callback); + } + } + } + + private void handleNameCallback(NameCallback nc) { + // check to see if this user is in the user password database. + if (credentials.get(nc.getDefaultName()) == null) { + LOG.warn("User '" + nc.getDefaultName() + "' not found in list of DIGEST-MD5 authenticateable users."); + return; + } + nc.setName(nc.getDefaultName()); + userName = nc.getDefaultName(); + } + + private void handlePasswordCallback(PasswordCallback pc) { + if ("super".equals(this.userName) && System.getProperty(SYSPROP_SUPER_PASSWORD) != null) { + // superuser: use Java system property for password, if available. + pc.setPassword(System.getProperty(SYSPROP_SUPER_PASSWORD).toCharArray()); + } else if (credentials.containsKey(userName) ) { + pc.setPassword(credentials.get(userName).toCharArray()); + } else { + LOG.warn("No password found for user: " + userName); + } + } + + private void handleRealmCallback(RealmCallback rc) { + LOG.debug("client supplied realm: " + rc.getDefaultText()); + rc.setText(rc.getDefaultText()); + } + + private void handleAuthorizeCallback(AuthorizeCallback ac) { + String authenticationID = ac.getAuthenticationID(); + String authorizationID = ac.getAuthorizationID(); + + LOG.info("Successfully authenticated client: authenticationID=" + authenticationID + + "; authorizationID=" + authorizationID + "."); + ac.setAuthorized(true); + + // canonicalize authorization id according to system properties: + // zookeeper.kerberos.removeRealmFromPrincipal(={true,false}) + // zookeeper.kerberos.removeHostFromPrincipal(={true,false}) + KerberosName kerberosName = new KerberosName(authenticationID); + try { + StringBuilder userNameBuilder = new StringBuilder(kerberosName.getShortName()); + if (shouldAppendHost(kerberosName)) { + userNameBuilder.append("/").append(kerberosName.getHostName()); + } + if (shouldAppendRealm(kerberosName)) { + userNameBuilder.append("@").append(kerberosName.getRealm()); + } + LOG.info("Setting authorizedID: " + userNameBuilder); + ac.setAuthorizedID(userNameBuilder.toString()); + } catch (IOException e) { + LOG.error("Failed to set name based on Kerberos authentication rules."); + } + } + + private boolean shouldAppendRealm(KerberosName kerberosName) { + return !isSystemPropertyTrue(SYSPROP_REMOVE_REALM) && kerberosName.getRealm() != null; + } + + private boolean shouldAppendHost(KerberosName kerberosName) { + return !isSystemPropertyTrue(SYSPROP_REMOVE_HOST) && kerberosName.getHostName() != null; + } + + private boolean isSystemPropertyTrue(String propertyName) { + return "true".equals(System.getProperty(propertyName)); + } +} diff --git a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/package.html b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/package.html new file mode 100644 index 000000000..89a5d7eff --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/package.html @@ -0,0 +1,101 @@ + + + + +

      ZooKeeper server theory of operation

      +ZooKeeperServer is designed to work in standalone mode and also +be extensible so that it can be used to implement the quorum based +version of ZooKeeper. +

      +ZooKeeper maintains a order when processing requests: +

        +
      • All requests will be processed in order. +
      • All responses will return in order. +
      • All watches will be sent in the order that the update takes place. +
      +

      +We will explain the three aspects of ZooKeeperServer: request processing, data +structure maintenance, and session tracking. + +

      Request processing

      + +Requests are received by the ServerCnxn. Demarshalling of a request is +done by ClientRequestHandler. After a request has been demarshalled, +ClientRequestHandler invokes the relevant method in ZooKeeper and marshals +the result. +

      +If the request is just a query, it will be processed by ZooKeeper and returned. +Otherwise, the request will be validated and a transaction will be generated +and logged. This the request will then wait until the request has been logged +before continuing processing. +

      +Requests are logged as a group. Transactions are queued up and the SyncThread +will process them at predefined intervals. (Currently 20ms) The SyncThread +interacts with ZooKeeperServer the txnQueue. Transactions are added to the +txnQueue of SyncThread via queueItem. When the transaction has been synced to +disk, its callback will be invoked which will cause the request processing to +be completed. + +

      Data structure maintenance

      + +ZooKeeper data is stored in-memory. Each znode is stored in a DataNode object. +This object is accessed through a hash table that maps paths to DataNodes. +DataNodes also organize themselves into a tree. This tree is only used for +serializing nodes. +

      +We guarantee that changes to nodes are stored to non-volatile media before +responding to a client. We do this quickly by writing changes as a sequence +of transactions in a log file. Even though we flush transactions as a group, +we need to avoid seeks as much as possible. Also, since the server can fail +at any point, we need to be careful of partial records. +

      +We address the above problems by +

        +
      • Pre-allocating 1M chunks of file space. This allows us to append to the +file without causing seeks to update file size. It also means that we need +to check for the end of the log by looking for a zero length transaction +rather than simply end of file. +
      • Writing a signature at the end of each transaction. When processing +transactions, we only use transactions that have a valid signature at the end. +
      +

      +As the server runs, the log file will grow quite large. To avoid long startup +times we periodically take a snapshot of the tree of DataNodes. We cannot +take the snapshot synchronously as the data takes a while to write out, so +instead we asynchronously write out the tree. This means that we end up +with a "corrupt" snapshot of the data tree. More formally if we define T +to be the real snapshot of the tree at the time we begin taking the snapshot +and l as the sequence of transactions that are applied to the tree between +the time the snapshot begins and the time the snapshot completes, we write +to disk T+l' where l' is a subset of the transactions in l. While we do not +have a way of figuring out which transactions make up l', it doesn't really +matter. T+l'+l = T+l since the transactions we log are idempotent (applying +the transaction multiple times has the same result as applying the transaction +once). So when we restore the snapshot we also play all transactions in the log +that occur after the snapshot was begun. We can easily figure out where to +start the replay because we start a new logfile when we start a snapshot. Both +the snapshot file and log file have a numeric suffix that represent the +transaction id that created the respective files. + +

      Session tracking

      +Rather than tracking sessions exactly, we track them in batches. That are +processed at fixed intervals. This is easier to implement than exact +session tracking and it is more efficient in terms of performance. It also +provides a small grace period for session renewal. + + \ No newline at end of file diff --git a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/persistence/FileSnap.java b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/persistence/FileSnap.java new file mode 100644 index 000000000..8f5733841 --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/persistence/FileSnap.java @@ -0,0 +1,250 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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. + */ + +package org.apache.zookeeper.server.persistence; +import java.io.BufferedInputStream; +import java.io.BufferedOutputStream; +import java.io.File; +import java.io.FileInputStream; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.nio.ByteBuffer; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.zip.Adler32; +import java.util.zip.CheckedInputStream; +import java.util.zip.CheckedOutputStream; + +import org.apache.jute.BinaryInputArchive; +import org.apache.jute.BinaryOutputArchive; +import org.apache.jute.InputArchive; +import org.apache.jute.OutputArchive; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.apache.zookeeper.server.DataTree; +import org.apache.zookeeper.server.util.SerializeUtils; + +/** + * This class implements the snapshot interface. + * it is responsible for storing, serializing + * and deserializing the right snapshot. + * and provides access to the snapshots. + */ +public class FileSnap implements SnapShot { + File snapDir; + private volatile boolean close = false; + private static final int VERSION=2; + private static final long dbId=-1; + private static final Logger LOG = LoggerFactory.getLogger(FileSnap.class); + public final static int SNAP_MAGIC + = ByteBuffer.wrap("ZKSN".getBytes()).getInt(); + public FileSnap(File snapDir) { + this.snapDir = snapDir; + } + + /** + * deserialize a data tree from the most recent snapshot + * @return the zxid of the snapshot + */ + public long deserialize(DataTree dt, Map sessions) + throws IOException { + // we run through 100 snapshots (not all of them) + // if we cannot get it running within 100 snapshots + // we should give up + List snapList = findNValidSnapshots(100); + if (snapList.size() == 0) { + return -1L; + } + File snap = null; + boolean foundValid = false; + for (int i = 0; i < snapList.size(); i++) { + snap = snapList.get(i); + InputStream snapIS = null; + CheckedInputStream crcIn = null; + try { + LOG.info("Reading snapshot " + snap); + snapIS = new BufferedInputStream(new FileInputStream(snap)); + crcIn = new CheckedInputStream(snapIS, new Adler32()); + InputArchive ia = BinaryInputArchive.getArchive(crcIn); + deserialize(dt,sessions, ia); + long checkSum = crcIn.getChecksum().getValue(); + long val = ia.readLong("val"); + if (val != checkSum) { + throw new IOException("CRC corruption in snapshot : " + snap); + } + foundValid = true; + break; + } catch(IOException e) { + LOG.warn("problem reading snap file " + snap, e); + } finally { + if (snapIS != null) + snapIS.close(); + if (crcIn != null) + crcIn.close(); + } + } + if (!foundValid) { + throw new IOException("Not able to find valid snapshots in " + snapDir); + } + dt.lastProcessedZxid = Util.getZxidFromName(snap.getName(), "snapshot"); + return dt.lastProcessedZxid; + } + + /** + * deserialize the datatree from an inputarchive + * @param dt the datatree to be serialized into + * @param sessions the sessions to be filled up + * @param ia the input archive to restore from + * @throws IOException + */ + public void deserialize(DataTree dt, Map sessions, + InputArchive ia) throws IOException { + FileHeader header = new FileHeader(); + header.deserialize(ia, "fileheader"); + if (header.getMagic() != SNAP_MAGIC) { + throw new IOException("mismatching magic headers " + + header.getMagic() + + " != " + FileSnap.SNAP_MAGIC); + } + SerializeUtils.deserializeSnapshot(dt,ia,sessions); + } + + /** + * find the most recent snapshot in the database. + * @return the file containing the most recent snapshot + */ + public File findMostRecentSnapshot() throws IOException { + List files = findNValidSnapshots(1); + if (files.size() == 0) { + return null; + } + return files.get(0); + } + + /** + * find the last (maybe) valid n snapshots. this does some + * minor checks on the validity of the snapshots. It just + * checks for / at the end of the snapshot. This does + * not mean that the snapshot is truly valid but is + * valid with a high probability. also, the most recent + * will be first on the list. + * @param n the number of most recent snapshots + * @return the last n snapshots (the number might be + * less than n in case enough snapshots are not available). + * @throws IOException + */ + private List findNValidSnapshots(int n) throws IOException { + List files = Util.sortDataDir(snapDir.listFiles(),"snapshot", false); + int count = 0; + List list = new ArrayList(); + for (File f : files) { + // we should catch the exceptions + // from the valid snapshot and continue + // until we find a valid one + try { + if (Util.isValidSnapshot(f)) { + list.add(f); + count++; + if (count == n) { + break; + } + } + } catch (IOException e) { + LOG.info("invalid snapshot " + f, e); + } + } + return list; + } + + /** + * find the last n snapshots. this does not have + * any checks if the snapshot might be valid or not + * @param the number of most recent snapshots + * @return the last n snapshots + * @throws IOException + */ + public List findNRecentSnapshots(int n) throws IOException { + List files = Util.sortDataDir(snapDir.listFiles(), "snapshot", false); + int i = 0; + List list = new ArrayList(); + for (File f: files) { + if (i==n) + break; + i++; + list.add(f); + } + return list; + } + + /** + * serialize the datatree and sessions + * @param dt the datatree to be serialized + * @param sessions the sessions to be serialized + * @param oa the output archive to serialize into + * @param header the header of this snapshot + * @throws IOException + */ + protected void serialize(DataTree dt,Map sessions, + OutputArchive oa, FileHeader header) throws IOException { + // this is really a programmatic error and not something that can + // happen at runtime + if(header==null) + throw new IllegalStateException( + "Snapshot's not open for writing: uninitialized header"); + header.serialize(oa, "fileheader"); + SerializeUtils.serializeSnapshot(dt,oa,sessions); + } + + /** + * serialize the datatree and session into the file snapshot + * @param dt the datatree to be serialized + * @param sessions the sessions to be serialized + * @param snapShot the file to store snapshot into + */ + public synchronized void serialize(DataTree dt, Map sessions, File snapShot) + throws IOException { + if (!close) { + OutputStream sessOS = new BufferedOutputStream(new FileOutputStream(snapShot)); + CheckedOutputStream crcOut = new CheckedOutputStream(sessOS, new Adler32()); + //CheckedOutputStream cout = new CheckedOutputStream() + OutputArchive oa = BinaryOutputArchive.getArchive(crcOut); + FileHeader header = new FileHeader(SNAP_MAGIC, VERSION, dbId); + serialize(dt,sessions,oa, header); + long val = crcOut.getChecksum().getValue(); + oa.writeLong(val, "val"); + oa.writeString("/", "path"); + sessOS.flush(); + crcOut.close(); + sessOS.close(); + } + } + + /** + * synchronized close just so that if serialize is in place + * the close operation will block and will wait till serialize + * is done and will set the close flag + */ + @Override + public synchronized void close() throws IOException { + close = true; + } + + } diff --git a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/persistence/FileTxnLog.java b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/persistence/FileTxnLog.java new file mode 100644 index 000000000..b0dd79c1c --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/persistence/FileTxnLog.java @@ -0,0 +1,684 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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. + */ +package org.apache.zookeeper.server.persistence; + +import java.io.BufferedInputStream; +import java.io.BufferedOutputStream; +import java.io.EOFException; +import java.io.File; +import java.io.FileInputStream; +import java.io.FileOutputStream; +import java.io.FilterInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.RandomAccessFile; +import java.nio.ByteBuffer; +import java.util.ArrayList; +import java.util.LinkedList; +import java.util.List; +import java.util.concurrent.TimeUnit; +import java.util.zip.Adler32; +import java.util.zip.Checksum; + +import org.apache.jute.BinaryInputArchive; +import org.apache.jute.BinaryOutputArchive; +import org.apache.jute.InputArchive; +import org.apache.jute.OutputArchive; +import org.apache.jute.Record; +import org.apache.zookeeper.server.util.SerializeUtils; +import org.apache.zookeeper.txn.TxnHeader; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * This class implements the TxnLog interface. It provides api's + * to access the txnlogs and add entries to it. + *

      + * The format of a Transactional log is as follows: + *

      + * LogFile:
      + *     FileHeader TxnList ZeroPad
      + * 
      + * FileHeader: {
      + *     magic 4bytes (ZKLG)
      + *     version 4bytes
      + *     dbid 8bytes
      + *   }
      + * 
      + * TxnList:
      + *     Txn || Txn TxnList
      + *     
      + * Txn:
      + *     checksum Txnlen TxnHeader Record 0x42
      + * 
      + * checksum: 8bytes Adler32 is currently used
      + *   calculated across payload -- Txnlen, TxnHeader, Record and 0x42
      + * 
      + * Txnlen:
      + *     len 4bytes
      + * 
      + * TxnHeader: {
      + *     sessionid 8bytes
      + *     cxid 4bytes
      + *     zxid 8bytes
      + *     time 8bytes
      + *     type 4bytes
      + *   }
      + *     
      + * Record:
      + *     See Jute definition file for details on the various record types
      + *      
      + * ZeroPad:
      + *     0 padded to EOF (filled during preallocation stage)
      + * 
      + */ +public class FileTxnLog implements TxnLog { + private static final Logger LOG; + + static long preAllocSize = 65536 * 1024; + + public final static int TXNLOG_MAGIC = + ByteBuffer.wrap("ZKLG".getBytes()).getInt(); + + public final static int VERSION = 2; + + /** Maximum time we allow for elapsed fsync before WARNing */ + private final static long fsyncWarningThresholdMS; + + static { + LOG = LoggerFactory.getLogger(FileTxnLog.class); + + String size = System.getProperty("zookeeper.preAllocSize"); + if (size != null) { + try { + preAllocSize = Long.parseLong(size) * 1024; + } catch (NumberFormatException e) { + LOG.warn(size + " is not a valid value for preAllocSize"); + } + } + fsyncWarningThresholdMS = Long.getLong("fsync.warningthresholdms", 1000); + } + + long lastZxidSeen; + volatile BufferedOutputStream logStream = null; + volatile OutputArchive oa; + volatile FileOutputStream fos = null; + + File logDir; + private final boolean forceSync = !System.getProperty("zookeeper.forceSync", "yes").equals("no");; + long dbId; + private LinkedList streamsToFlush = + new LinkedList(); + long currentSize; + File logFileWrite = null; + + /** + * constructor for FileTxnLog. Take the directory + * where the txnlogs are stored + * @param logDir the directory where the txnlogs are stored + */ + public FileTxnLog(File logDir) { + this.logDir = logDir; + } + + /** + * method to allow setting preallocate size + * of log file to pad the file. + * @param size the size to set to in bytes + */ + public static void setPreallocSize(long size) { + preAllocSize = size; + } + + /** + * creates a checksum alogrithm to be used + * @return the checksum used for this txnlog + */ + protected Checksum makeChecksumAlgorithm(){ + return new Adler32(); + } + + + /** + * rollover the current log file to a new one. + * @throws IOException + */ + public synchronized void rollLog() throws IOException { + if (logStream != null) { + this.logStream.flush(); + this.logStream = null; + oa = null; + } + } + + /** + * close all the open file handles + * @throws IOException + */ + public synchronized void close() throws IOException { + if (logStream != null) { + logStream.close(); + } + for (FileOutputStream log : streamsToFlush) { + log.close(); + } + } + + /** + * append an entry to the transaction log + * @param hdr the header of the transaction + * @param txn the transaction part of the entry + * returns true iff something appended, otw false + */ + public synchronized boolean append(TxnHeader hdr, Record txn) + throws IOException + { + if (hdr != null) { + if (hdr.getZxid() <= lastZxidSeen) { + LOG.warn("Current zxid " + hdr.getZxid() + + " is <= " + lastZxidSeen + " for " + + hdr.getType()); + } + if (logStream==null) { + if(LOG.isInfoEnabled()){ + LOG.info("Creating new log file: log." + + Long.toHexString(hdr.getZxid())); + } + + logFileWrite = new File(logDir, ("log." + + Long.toHexString(hdr.getZxid()))); + fos = new FileOutputStream(logFileWrite); + logStream=new BufferedOutputStream(fos); + oa = BinaryOutputArchive.getArchive(logStream); + FileHeader fhdr = new FileHeader(TXNLOG_MAGIC,VERSION, dbId); + fhdr.serialize(oa, "fileheader"); + // Make sure that the magic number is written before padding. + logStream.flush(); + currentSize = fos.getChannel().position(); + streamsToFlush.add(fos); + } + padFile(fos); + byte[] buf = Util.marshallTxnEntry(hdr, txn); + if (buf == null || buf.length == 0) { + throw new IOException("Faulty serialization for header " + + "and txn"); + } + Checksum crc = makeChecksumAlgorithm(); + crc.update(buf, 0, buf.length); + oa.writeLong(crc.getValue(), "txnEntryCRC"); + Util.writeTxnBytes(oa, buf); + + return true; + } + return false; + } + + /** + * pad the current file to increase its size + * @param out the outputstream to be padded + * @throws IOException + */ + private void padFile(FileOutputStream out) throws IOException { + currentSize = Util.padLogFile(out, currentSize, preAllocSize); + } + + /** + * Find the log file that starts at, or just before, the snapshot. Return + * this and all subsequent logs. Results are ordered by zxid of file, + * ascending order. + * @param logDirList array of files + * @param snapshotZxid return files at, or before this zxid + * @return + */ + public static File[] getLogFiles(File[] logDirList,long snapshotZxid) { + List files = Util.sortDataDir(logDirList, "log", true); + long logZxid = 0; + // Find the log file that starts before or at the same time as the + // zxid of the snapshot + for (File f : files) { + long fzxid = Util.getZxidFromName(f.getName(), "log"); + if (fzxid > snapshotZxid) { + continue; + } + // the files + // are sorted with zxid's + if (fzxid > logZxid) { + logZxid = fzxid; + } + } + List v=new ArrayList(5); + for (File f : files) { + long fzxid = Util.getZxidFromName(f.getName(), "log"); + if (fzxid < logZxid) { + continue; + } + v.add(f); + } + return v.toArray(new File[0]); + + } + + /** + * get the last zxid that was logged in the transaction logs + * @return the last zxid logged in the transaction logs + */ + public long getLastLoggedZxid() { + File[] files = getLogFiles(logDir.listFiles(), 0); + long maxLog=files.length>0? + Util.getZxidFromName(files[files.length-1].getName(),"log"):-1; + + // if a log file is more recent we must scan it to find + // the highest zxid + long zxid = maxLog; + TxnIterator itr = null; + try { + FileTxnLog txn = new FileTxnLog(logDir); + itr = txn.read(maxLog); + while (true) { + if(!itr.next()) + break; + TxnHeader hdr = itr.getHeader(); + zxid = hdr.getZxid(); + } + } catch (IOException e) { + LOG.warn("Unexpected exception", e); + } finally { + close(itr); + } + return zxid; + } + + private void close(TxnIterator itr) { + if (itr != null) { + try { + itr.close(); + } catch (IOException ioe) { + LOG.warn("Error closing file iterator", ioe); + } + } + } + + /** + * commit the logs. make sure that evertyhing hits the + * disk + */ + public synchronized void commit() throws IOException { + if (logStream != null) { + logStream.flush(); + } + for (FileOutputStream log : streamsToFlush) { + log.flush(); + if (forceSync) { + long startSyncNS = System.nanoTime(); + + log.getChannel().force(false); + + long syncElapsedMS = + TimeUnit.NANOSECONDS.toMillis(System.nanoTime() - startSyncNS); + if (syncElapsedMS > fsyncWarningThresholdMS) { + LOG.warn("fsync-ing the write ahead log in " + + Thread.currentThread().getName() + + " took " + syncElapsedMS + + "ms which will adversely effect operation latency. " + + "See the ZooKeeper troubleshooting guide"); + } + } + } + while (streamsToFlush.size() > 1) { + streamsToFlush.removeFirst().close(); + } + } + + /** + * start reading all the transactions from the given zxid + * @param zxid the zxid to start reading transactions from + * @return returns an iterator to iterate through the transaction + * logs + */ + public TxnIterator read(long zxid) throws IOException { + return new FileTxnIterator(logDir, zxid); + } + + /** + * truncate the current transaction logs + * @param zxid the zxid to truncate the logs to + * @return true if successful false if not + */ + public boolean truncate(long zxid) throws IOException { + FileTxnIterator itr = null; + try { + itr = new FileTxnIterator(this.logDir, zxid); + PositionInputStream input = itr.inputStream; + long pos = input.getPosition(); + // now, truncate at the current position + RandomAccessFile raf = new RandomAccessFile(itr.logFile, "rw"); + raf.setLength(pos); + raf.close(); + while (itr.goToNextLog()) { + if (!itr.logFile.delete()) { + LOG.warn("Unable to truncate {}", itr.logFile); + } + } + } finally { + close(itr); + } + return true; + } + + /** + * read the header of the transaction file + * @param file the transaction file to read + * @return header that was read fomr the file + * @throws IOException + */ + private static FileHeader readHeader(File file) throws IOException { + InputStream is =null; + try { + is = new BufferedInputStream(new FileInputStream(file)); + InputArchive ia=BinaryInputArchive.getArchive(is); + FileHeader hdr = new FileHeader(); + hdr.deserialize(ia, "fileheader"); + return hdr; + } finally { + try { + if (is != null) is.close(); + } catch (IOException e) { + LOG.warn("Ignoring exception during close", e); + } + } + } + + /** + * the dbid of this transaction database + * @return the dbid of this database + */ + public long getDbId() throws IOException { + FileTxnIterator itr = new FileTxnIterator(logDir, 0); + FileHeader fh=readHeader(itr.logFile); + itr.close(); + if(fh==null) + throw new IOException("Unsupported Format."); + return fh.getDbid(); + } + + /** + * the forceSync value. true if forceSync is enabled, false otherwise. + * @return the forceSync value + */ + public boolean isForceSync() { + return forceSync; + } + + /** + * a class that keeps track of the position + * in the input stream. The position points to offset + * that has been consumed by the applications. It can + * wrap buffered input streams to provide the right offset + * for the application. + */ + static class PositionInputStream extends FilterInputStream { + long position; + protected PositionInputStream(InputStream in) { + super(in); + position = 0; + } + + @Override + public int read() throws IOException { + int rc = super.read(); + if (rc > -1) { + position++; + } + return rc; + } + + public int read(byte[] b) throws IOException { + int rc = super.read(b); + if (rc > 0) { + position += rc; + } + return rc; + } + + @Override + public int read(byte[] b, int off, int len) throws IOException { + int rc = super.read(b, off, len); + if (rc > 0) { + position += rc; + } + return rc; + } + + @Override + public long skip(long n) throws IOException { + long rc = super.skip(n); + if (rc > 0) { + position += rc; + } + return rc; + } + public long getPosition() { + return position; + } + + @Override + public boolean markSupported() { + return false; + } + + @Override + public void mark(int readLimit) { + throw new UnsupportedOperationException("mark"); + } + + @Override + public void reset() { + throw new UnsupportedOperationException("reset"); + } + } + + /** + * this class implements the txnlog iterator interface + * which is used for reading the transaction logs + */ + public static class FileTxnIterator implements TxnLog.TxnIterator { + File logDir; + long zxid; + TxnHeader hdr; + Record record; + File logFile; + InputArchive ia; + static final String CRC_ERROR="CRC check failed"; + + PositionInputStream inputStream=null; + //stored files is the list of files greater than + //the zxid we are looking for. + private ArrayList storedFiles; + + /** + * create an iterator over a transaction database directory + * @param logDir the transaction database directory + * @param zxid the zxid to start reading from + * @throws IOException + */ + public FileTxnIterator(File logDir, long zxid) throws IOException { + this.logDir = logDir; + this.zxid = zxid; + init(); + } + + /** + * initialize to the zxid specified + * this is inclusive of the zxid + * @throws IOException + */ + void init() throws IOException { + storedFiles = new ArrayList(); + List files = Util.sortDataDir(FileTxnLog.getLogFiles(logDir.listFiles(), 0), "log", false); + for (File f: files) { + if (Util.getZxidFromName(f.getName(), "log") >= zxid) { + storedFiles.add(f); + } + // add the last logfile that is less than the zxid + else if (Util.getZxidFromName(f.getName(), "log") < zxid) { + storedFiles.add(f); + break; + } + } + goToNextLog(); + if (!next()) + return; + while (hdr.getZxid() < zxid) { + if (!next()) + return; + } + } + + /** + * go to the next logfile + * @return true if there is one and false if there is no + * new file to be read + * @throws IOException + */ + private boolean goToNextLog() throws IOException { + if (storedFiles.size() > 0) { + this.logFile = storedFiles.remove(storedFiles.size()-1); + ia = createInputArchive(this.logFile); + return true; + } + return false; + } + + /** + * read the header from the inputarchive + * @param ia the inputarchive to be read from + * @param is the inputstream + * @throws IOException + */ + protected void inStreamCreated(InputArchive ia, InputStream is) + throws IOException{ + FileHeader header= new FileHeader(); + header.deserialize(ia, "fileheader"); + if (header.getMagic() != FileTxnLog.TXNLOG_MAGIC) { + throw new IOException("Transaction log: " + this.logFile + " has invalid magic number " + + header.getMagic() + + " != " + FileTxnLog.TXNLOG_MAGIC); + } + } + + /** + * Invoked to indicate that the input stream has been created. + * @param ia input archive + * @param is file input stream associated with the input archive. + * @throws IOException + **/ + protected InputArchive createInputArchive(File logFile) throws IOException { + if(inputStream==null){ + inputStream= new PositionInputStream(new BufferedInputStream(new FileInputStream(logFile))); + LOG.debug("Created new input stream " + logFile); + ia = BinaryInputArchive.getArchive(inputStream); + inStreamCreated(ia,inputStream); + LOG.debug("Created new input archive " + logFile); + } + return ia; + } + + /** + * create a checksum algorithm + * @return the checksum algorithm + */ + protected Checksum makeChecksumAlgorithm(){ + return new Adler32(); + } + + /** + * the iterator that moves to the next transaction + * @return true if there is more transactions to be read + * false if not. + */ + public boolean next() throws IOException { + if (ia == null) { + return false; + } + try { + long crcValue = ia.readLong("crcvalue"); + byte[] bytes = Util.readTxnBytes(ia); + // Since we preallocate, we define EOF to be an + if (bytes == null || bytes.length==0) { + throw new EOFException("Failed to read " + logFile); + } + // EOF or corrupted record + // validate CRC + Checksum crc = makeChecksumAlgorithm(); + crc.update(bytes, 0, bytes.length); + if (crcValue != crc.getValue()) + throw new IOException(CRC_ERROR); + if (bytes == null || bytes.length == 0) + return false; + hdr = new TxnHeader(); + record = SerializeUtils.deserializeTxn(bytes, hdr); + } catch (EOFException e) { + LOG.debug("EOF excepton " + e); + inputStream.close(); + inputStream = null; + ia = null; + hdr = null; + // this means that the file has ended + // we should go to the next file + if (!goToNextLog()) { + return false; + } + // if we went to the next log file, we should call next() again + return next(); + } catch (IOException e) { + inputStream.close(); + throw e; + } + return true; + } + + /** + * reutrn the current header + * @return the current header that + * is read + */ + public TxnHeader getHeader() { + return hdr; + } + + /** + * return the current transaction + * @return the current transaction + * that is read + */ + public Record getTxn() { + return record; + } + + /** + * close the iterator + * and release the resources. + */ + public void close() throws IOException { + if (inputStream != null) { + inputStream.close(); + } + } + } + +} diff --git a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/persistence/FileTxnSnapLog.java b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/persistence/FileTxnSnapLog.java new file mode 100644 index 000000000..6f0df515f --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/persistence/FileTxnSnapLog.java @@ -0,0 +1,341 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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. + */ + +package org.apache.zookeeper.server.persistence; + +import java.io.File; +import java.io.IOException; +import java.util.List; +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; + +import org.apache.jute.Record; +import org.apache.zookeeper.KeeperException; +import org.apache.zookeeper.KeeperException.Code; +import org.apache.zookeeper.ZooDefs.OpCode; +import org.apache.zookeeper.server.DataTree; +import org.apache.zookeeper.server.DataTree.ProcessTxnResult; +import org.apache.zookeeper.server.Request; +import org.apache.zookeeper.server.ZooTrace; +import org.apache.zookeeper.server.persistence.TxnLog.TxnIterator; +import org.apache.zookeeper.txn.CreateSessionTxn; +import org.apache.zookeeper.txn.TxnHeader; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * This is a helper class + * above the implementations + * of txnlog and snapshot + * classes + */ +public class FileTxnSnapLog { + //the direcotry containing the + //the transaction logs + private final File dataDir; + //the directory containing the + //the snapshot directory + private final File snapDir; + private TxnLog txnLog; + private SnapShot snapLog; + public final static int VERSION = 2; + public final static String version = "version-"; + + private static final Logger LOG = LoggerFactory.getLogger(FileTxnSnapLog.class); + + /** + * This listener helps + * the external apis calling + * restore to gather information + * while the data is being + * restored. + */ + public interface PlayBackListener { + void onTxnLoaded(TxnHeader hdr, Record rec); + } + + /** + * the constructor which takes the datadir and + * snapdir. + * @param dataDir the trasaction directory + * @param snapDir the snapshot directory + */ + public FileTxnSnapLog(File dataDir, File snapDir) throws IOException { + LOG.debug("Opening datadir:{} snapDir:{}", dataDir, snapDir); + + this.dataDir = new File(dataDir, version + VERSION); + this.snapDir = new File(snapDir, version + VERSION); + if (!this.dataDir.exists()) { + if (!this.dataDir.mkdirs()) { + throw new IOException("Unable to create data directory " + + this.dataDir); + } + } + if (!this.snapDir.exists()) { + if (!this.snapDir.mkdirs()) { + throw new IOException("Unable to create snap directory " + + this.snapDir); + } + } + txnLog = new FileTxnLog(this.dataDir); + snapLog = new FileSnap(this.snapDir); + } + + /** + * get the datadir used by this filetxn + * snap log + * @return the data dir + */ + public File getDataDir() { + return this.dataDir; + } + + /** + * get the snap dir used by this + * filetxn snap log + * @return the snap dir + */ + public File getSnapDir() { + return this.snapDir; + } + + /** + * this function restores the server + * database after reading from the + * snapshots and transaction logs + * @param dt the datatree to be restored + * @param sessions the sessions to be restored + * @param listener the playback listener to run on the + * database restoration + * @return the highest zxid restored + * @throws IOException + */ + public long restore(DataTree dt, Map sessions, + PlayBackListener listener) throws IOException { + snapLog.deserialize(dt, sessions); + FileTxnLog txnLog = new FileTxnLog(dataDir); + TxnIterator itr = txnLog.read(dt.lastProcessedZxid+1); + long highestZxid = dt.lastProcessedZxid; + TxnHeader hdr; + try { + while (true) { + // iterator points to + // the first valid txn when initialized + hdr = itr.getHeader(); + if (hdr == null) { + //empty logs + return dt.lastProcessedZxid; + } + if (hdr.getZxid() < highestZxid && highestZxid != 0) { + LOG.error("{}(higestZxid) > {}(next log) for type {}", + new Object[] { highestZxid, hdr.getZxid(), + hdr.getType() }); + } else { + highestZxid = hdr.getZxid(); + } + try { + processTransaction(hdr,dt,sessions, itr.getTxn()); + } catch(KeeperException.NoNodeException e) { + throw new IOException("Failed to process transaction type: " + + hdr.getType() + " error: " + e.getMessage(), e); + } + listener.onTxnLoaded(hdr, itr.getTxn()); + if (!itr.next()) + break; + } + } finally { + if (itr != null) { + itr.close(); + } + } + return highestZxid; + } + + /** + * process the transaction on the datatree + * @param hdr the hdr of the transaction + * @param dt the datatree to apply transaction to + * @param sessions the sessions to be restored + * @param txn the transaction to be applied + */ + public void processTransaction(TxnHeader hdr,DataTree dt, + Map sessions, Record txn) + throws KeeperException.NoNodeException { + ProcessTxnResult rc; + switch (hdr.getType()) { + case OpCode.createSession: + sessions.put(hdr.getClientId(), + ((CreateSessionTxn) txn).getTimeOut()); + if (LOG.isTraceEnabled()) { + ZooTrace.logTraceMessage(LOG,ZooTrace.SESSION_TRACE_MASK, + "playLog --- create session in log: 0x" + + Long.toHexString(hdr.getClientId()) + + " with timeout: " + + ((CreateSessionTxn) txn).getTimeOut()); + } + // give dataTree a chance to sync its lastProcessedZxid + rc = dt.processTxn(hdr, txn); + break; + case OpCode.closeSession: + sessions.remove(hdr.getClientId()); + if (LOG.isTraceEnabled()) { + ZooTrace.logTraceMessage(LOG,ZooTrace.SESSION_TRACE_MASK, + "playLog --- close session in log: 0x" + + Long.toHexString(hdr.getClientId())); + } + rc = dt.processTxn(hdr, txn); + break; + default: + rc = dt.processTxn(hdr, txn); + } + + /** + * Snapshots are lazily created. So when a snapshot is in progress, + * there is a chance for later transactions to make into the + * snapshot. Then when the snapshot is restored, NONODE/NODEEXISTS + * errors could occur. It should be safe to ignore these. + */ + if (rc.err != Code.OK.intValue()) { + LOG.debug("Ignoring processTxn failure hdr:" + hdr.getType() + + ", error: " + rc.err + ", path: " + rc.path); + } + } + + /** + * the last logged zxid on the transaction logs + * @return the last logged zxid + */ + public long getLastLoggedZxid() { + FileTxnLog txnLog = new FileTxnLog(dataDir); + return txnLog.getLastLoggedZxid(); + } + + /** + * save the datatree and the sessions into a snapshot + * @param dataTree the datatree to be serialized onto disk + * @param sessionsWithTimeouts the sesssion timeouts to be + * serialized onto disk + * @throws IOException + */ + public void save(DataTree dataTree, + ConcurrentHashMap sessionsWithTimeouts) + throws IOException { + long lastZxid = dataTree.lastProcessedZxid; + File snapshotFile = new File(snapDir, Util.makeSnapshotName(lastZxid)); + LOG.info("Snapshotting: 0x{} to {}", Long.toHexString(lastZxid), + snapshotFile); + snapLog.serialize(dataTree, sessionsWithTimeouts, snapshotFile); + + } + + /** + * truncate the transaction logs the zxid + * specified + * @param zxid the zxid to truncate the logs to + * @return true if able to truncate the log, false if not + * @throws IOException + */ + public boolean truncateLog(long zxid) throws IOException { + // close the existing txnLog and snapLog + close(); + + // truncate it + FileTxnLog truncLog = new FileTxnLog(dataDir); + boolean truncated = truncLog.truncate(zxid); + truncLog.close(); + + // re-open the txnLog and snapLog + // I'd rather just close/reopen this object itself, however that + // would have a big impact outside ZKDatabase as there are other + // objects holding a reference to this object. + txnLog = new FileTxnLog(dataDir); + snapLog = new FileSnap(snapDir); + + return truncated; + } + + /** + * the most recent snapshot in the snapshot + * directory + * @return the file that contains the most + * recent snapshot + * @throws IOException + */ + public File findMostRecentSnapshot() throws IOException { + FileSnap snaplog = new FileSnap(snapDir); + return snaplog.findMostRecentSnapshot(); + } + + /** + * the n most recent snapshots + * @param n the number of recent snapshots + * @return the list of n most recent snapshots, with + * the most recent in front + * @throws IOException + */ + public List findNRecentSnapshots(int n) throws IOException { + FileSnap snaplog = new FileSnap(snapDir); + return snaplog.findNRecentSnapshots(n); + } + + /** + * get the snapshot logs that are greater than + * the given zxid + * @param zxid the zxid that contains logs greater than + * zxid + * @return + */ + public File[] getSnapshotLogs(long zxid) { + return FileTxnLog.getLogFiles(dataDir.listFiles(), zxid); + } + + /** + * append the request to the transaction logs + * @param si the request to be appended + * returns true iff something appended, otw false + * @throws IOException + */ + public boolean append(Request si) throws IOException { + return txnLog.append(si.hdr, si.txn); + } + + /** + * commit the transaction of logs + * @throws IOException + */ + public void commit() throws IOException { + txnLog.commit(); + } + + /** + * roll the transaction logs + * @throws IOException + */ + public void rollLog() throws IOException { + txnLog.rollLog(); + } + + /** + * close the transaction log files + * @throws IOException + */ + public void close() throws IOException { + txnLog.close(); + snapLog.close(); + } +} diff --git a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/persistence/SnapShot.java b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/persistence/SnapShot.java new file mode 100644 index 000000000..c964afc6d --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/persistence/SnapShot.java @@ -0,0 +1,66 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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. + */ + +package org.apache.zookeeper.server.persistence; +import java.io.File; +import java.io.IOException; +import java.util.Map; + +import org.apache.zookeeper.server.DataTree; + +/** + * snapshot interface for the persistence layer. + * implement this interface for implementing + * snapshots. + */ +public interface SnapShot { + + /** + * deserialize a data tree from the last valid snapshot and + * return the last zxid that was deserialized + * @param dt the datatree to be deserialized into + * @param sessions the sessions to be deserialized into + * @return the last zxid that was deserialized from the snapshot + * @throws IOException + */ + long deserialize(DataTree dt, Map sessions) + throws IOException; + + /** + * persist the datatree and the sessions into a persistence storage + * @param dt the datatree to be serialized + * @param sessions + * @throws IOException + */ + void serialize(DataTree dt, Map sessions, + File name) + throws IOException; + + /** + * find the most recent snapshot file + * @return the most recent snapshot file + * @throws IOException + */ + File findMostRecentSnapshot() throws IOException; + + /** + * free resources from this snapshot immediately + * @throws IOException + */ + void close() throws IOException; +} diff --git a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/persistence/TxnLog.java b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/persistence/TxnLog.java new file mode 100644 index 000000000..d52dfb796 --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/persistence/TxnLog.java @@ -0,0 +1,121 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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. + */ + +package org.apache.zookeeper.server.persistence; + +import java.io.IOException; + +import org.apache.jute.Record; +import org.apache.zookeeper.txn.TxnHeader; + +/** + * Interface for reading transaction logs. + * + */ +public interface TxnLog { + + /** + * roll the current + * log being appended to + * @throws IOException + */ + void rollLog() throws IOException; + /** + * Append a request to the transaction log + * @param hdr the transaction header + * @param r the transaction itself + * returns true iff something appended, otw false + * @throws IOException + */ + boolean append(TxnHeader hdr, Record r) throws IOException; + + /** + * Start reading the transaction logs + * from a given zxid + * @param zxid + * @return returns an iterator to read the + * next transaction in the logs. + * @throws IOException + */ + TxnIterator read(long zxid) throws IOException; + + /** + * the last zxid of the logged transactions. + * @return the last zxid of the logged transactions. + * @throws IOException + */ + long getLastLoggedZxid() throws IOException; + + /** + * truncate the log to get in sync with the + * leader. + * @param zxid the zxid to truncate at. + * @throws IOException + */ + boolean truncate(long zxid) throws IOException; + + /** + * the dbid for this transaction log. + * @return the dbid for this transaction log. + * @throws IOException + */ + long getDbId() throws IOException; + + /** + * commmit the trasaction and make sure + * they are persisted + * @throws IOException + */ + void commit() throws IOException; + + /** + * close the transactions logs + */ + void close() throws IOException; + /** + * an iterating interface for reading + * transaction logs. + */ + public interface TxnIterator { + /** + * return the transaction header. + * @return return the transaction header. + */ + TxnHeader getHeader(); + + /** + * return the transaction record. + * @return return the transaction record. + */ + Record getTxn(); + + /** + * go to the next transaction record. + * @throws IOException + */ + boolean next() throws IOException; + + /** + * close files and release the + * resources + * @throws IOException + */ + void close() throws IOException; + } +} + diff --git a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/persistence/Util.java b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/persistence/Util.java new file mode 100644 index 000000000..7ef7f9c41 --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/persistence/Util.java @@ -0,0 +1,326 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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. + */ + +package org.apache.zookeeper.server.persistence; + +import java.io.ByteArrayOutputStream; +import java.io.EOFException; +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.RandomAccessFile; +import java.io.Serializable; +import java.net.URI; +import java.nio.ByteBuffer; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; +import java.util.Comparator; +import java.util.List; +import java.util.Properties; + +import org.apache.jute.BinaryOutputArchive; +import org.apache.jute.InputArchive; +import org.apache.jute.OutputArchive; +import org.apache.jute.Record; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.apache.zookeeper.txn.TxnHeader; + +/** + * A collection of utility methods for dealing with file name parsing, + * low level I/O file operations and marshalling/unmarshalling. + */ +public class Util { + private static final Logger LOG = LoggerFactory.getLogger(Util.class); + private static final String SNAP_DIR="snapDir"; + private static final String LOG_DIR="logDir"; + private static final String DB_FORMAT_CONV="dbFormatConversion"; + private static final ByteBuffer fill = ByteBuffer.allocateDirect(1); + + public static String makeURIString(String dataDir, String dataLogDir, + String convPolicy){ + String uri="file:"+SNAP_DIR+"="+dataDir+";"+LOG_DIR+"="+dataLogDir; + if(convPolicy!=null) + uri+=";"+DB_FORMAT_CONV+"="+convPolicy; + return uri.replace('\\', '/'); + } + /** + * Given two directory files the method returns a well-formed + * logfile provider URI. This method is for backward compatibility with the + * existing code that only supports logfile persistence and expects these two + * parameters passed either on the command-line or in the configuration file. + * + * @param dataDir snapshot directory + * @param dataLogDir transaction log directory + * @return logfile provider URI + */ + public static URI makeFileLoggerURL(File dataDir, File dataLogDir){ + return URI.create(makeURIString(dataDir.getPath(),dataLogDir.getPath(),null)); + } + + public static URI makeFileLoggerURL(File dataDir, File dataLogDir,String convPolicy){ + return URI.create(makeURIString(dataDir.getPath(),dataLogDir.getPath(),convPolicy)); + } + + /** + * Creates a valid transaction log file name. + * + * @param zxid used as a file name suffix (extention) + * @return file name + */ + public static String makeLogName(long zxid) { + return "log." + Long.toHexString(zxid); + } + + /** + * Creates a snapshot file name. + * + * @param zxid used as a suffix + * @return file name + */ + public static String makeSnapshotName(long zxid) { + return "snapshot." + Long.toHexString(zxid); + } + + /** + * Extracts snapshot directory property value from the container. + * + * @param props properties container + * @return file representing the snapshot directory + */ + public static File getSnapDir(Properties props){ + return new File(props.getProperty(SNAP_DIR)); + } + + /** + * Extracts transaction log directory property value from the container. + * + * @param props properties container + * @return file representing the txn log directory + */ + public static File getLogDir(Properties props){ + return new File(props.getProperty(LOG_DIR)); + } + + /** + * Extracts the value of the dbFormatConversion attribute. + * + * @param props properties container + * @return value of the dbFormatConversion attribute + */ + public static String getFormatConversionPolicy(Properties props){ + return props.getProperty(DB_FORMAT_CONV); + } + + /** + * Extracts zxid from the file name. The file name should have been created + * using one of the {@link makeLogName} or {@link makeSnapshotName}. + * + * @param name the file name to parse + * @param prefix the file name prefix (snapshot or log) + * @return zxid + */ + public static long getZxidFromName(String name, String prefix) { + long zxid = -1; + String nameParts[] = name.split("\\."); + if (nameParts.length == 2 && nameParts[0].equals(prefix)) { + try { + zxid = Long.parseLong(nameParts[1], 16); + } catch (NumberFormatException e) { + } + } + return zxid; + } + + /** + * Verifies that the file is a valid snapshot. Snapshot may be invalid if + * it's incomplete as in a situation when the server dies while in the process + * of storing a snapshot. Any file that is not a snapshot is also + * an invalid snapshot. + * + * @param f file to verify + * @return true if the snapshot is valid + * @throws IOException + */ + public static boolean isValidSnapshot(File f) throws IOException { + if (f==null || Util.getZxidFromName(f.getName(), "snapshot") == -1) + return false; + + // Check for a valid snapshot + RandomAccessFile raf = new RandomAccessFile(f, "r"); + try { + // including the header and the last / bytes + // the snapshot should be atleast 10 bytes + if (raf.length() < 10) { + return false; + } + raf.seek(raf.length() - 5); + byte bytes[] = new byte[5]; + int readlen = 0; + int l; + while(readlen < 5 && + (l = raf.read(bytes, readlen, bytes.length - readlen)) >= 0) { + readlen += l; + } + if (readlen != bytes.length) { + LOG.info("Invalid snapshot " + f + + " too short, len = " + readlen); + return false; + } + ByteBuffer bb = ByteBuffer.wrap(bytes); + int len = bb.getInt(); + byte b = bb.get(); + if (len != 1 || b != '/') { + LOG.info("Invalid snapshot " + f + " len = " + len + + " byte = " + (b & 0xff)); + return false; + } + } finally { + raf.close(); + } + + return true; + } + + /** + * Grows the file to the specified number of bytes. This only happenes if + * the current file position is sufficiently close (less than 4K) to end of + * file. + * + * @param f output stream to pad + * @param currentSize application keeps track of the cuurent file size + * @param preAllocSize how many bytes to pad + * @return the new file size. It can be the same as currentSize if no + * padding was done. + * @throws IOException + */ + public static long padLogFile(FileOutputStream f,long currentSize, + long preAllocSize) throws IOException{ + long position = f.getChannel().position(); + if (position + 4096 >= currentSize) { + currentSize = currentSize + preAllocSize; + fill.position(0); + f.getChannel().write(fill, currentSize-fill.remaining()); + } + return currentSize; + } + + /** + * Reads a transaction entry from the input archive. + * @param ia archive to read from + * @return null if the entry is corrupted or EOF has been reached; a buffer + * (possible empty) containing serialized transaction record. + * @throws IOException + */ + public static byte[] readTxnBytes(InputArchive ia) throws IOException { + try{ + byte[] bytes = ia.readBuffer("txtEntry"); + // Since we preallocate, we define EOF to be an + // empty transaction + if (bytes.length == 0) + return bytes; + if (ia.readByte("EOF") != 'B') { + LOG.error("Last transaction was partial."); + return null; + } + return bytes; + }catch(EOFException e){} + return null; + } + + + /** + * Serializes transaction header and transaction data into a byte buffer. + * + * @param hdr transaction header + * @param txn transaction data + * @return serialized transaction record + * @throws IOException + */ + public static byte[] marshallTxnEntry(TxnHeader hdr, Record txn) + throws IOException { + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + OutputArchive boa = BinaryOutputArchive.getArchive(baos); + + hdr.serialize(boa, "hdr"); + if (txn != null) { + txn.serialize(boa, "txn"); + } + return baos.toByteArray(); + } + + /** + * Write the serialized transaction record to the output archive. + * + * @param oa output archive + * @param bytes serialized trasnaction record + * @throws IOException + */ + public static void writeTxnBytes(OutputArchive oa, byte[] bytes) + throws IOException { + oa.writeBuffer(bytes, "txnEntry"); + oa.writeByte((byte) 0x42, "EOR"); // 'B' + } + + + /** + * Compare file file names of form "prefix.version". Sort order result + * returned in order of version. + */ + private static class DataDirFileComparator + implements Comparator, Serializable + { + private static final long serialVersionUID = -2648639884525140318L; + + private String prefix; + private boolean ascending; + public DataDirFileComparator(String prefix, boolean ascending) { + this.prefix = prefix; + this.ascending = ascending; + } + + public int compare(File o1, File o2) { + long z1 = Util.getZxidFromName(o1.getName(), prefix); + long z2 = Util.getZxidFromName(o2.getName(), prefix); + int result = z1 < z2 ? -1 : (z1 > z2 ? 1 : 0); + return ascending ? result : -result; + } + } + + /** + * Sort the list of files. Recency as determined by the version component + * of the file name. + * + * @param files array of files + * @param prefix files not matching this prefix are assumed to have a + * version = -1) + * @param ascending true sorted in ascending order, false results in + * descending order + * @return sorted input files + */ + public static List sortDataDir(File[] files, String prefix, boolean ascending) + { + if(files==null) + return new ArrayList(0); + List filelist = Arrays.asList(files); + Collections.sort(filelist, new DataDirFileComparator(prefix, ascending)); + return filelist; + } + +} diff --git a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/quorum/AckRequestProcessor.java b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/quorum/AckRequestProcessor.java new file mode 100644 index 000000000..8e7e472e1 --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/quorum/AckRequestProcessor.java @@ -0,0 +1,54 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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. + */ + +package org.apache.zookeeper.server.quorum; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import org.apache.zookeeper.server.Request; +import org.apache.zookeeper.server.RequestProcessor; + + +/** + * This is a very simple RequestProcessor that simply forwards a request from a + * previous stage to the leader as an ACK. + */ +class AckRequestProcessor implements RequestProcessor { + private static final Logger LOG = LoggerFactory.getLogger(AckRequestProcessor.class); + Leader leader; + + AckRequestProcessor(Leader leader) { + this.leader = leader; + } + + /** + * Forward the request as an ACK to the leader + */ + public void processRequest(Request request) { + QuorumPeer self = leader.self; + if(self != null) + leader.processAck(self.getId(), request.zxid, null); + else + LOG.error("Null QuorumPeer"); + } + + public void shutdown() { + // XXX No need to do anything + } +} diff --git a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/quorum/AuthFastLeaderElection.java b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/quorum/AuthFastLeaderElection.java new file mode 100644 index 000000000..ad6019a7e --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/quorum/AuthFastLeaderElection.java @@ -0,0 +1,978 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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. + */ + +package org.apache.zookeeper.server.quorum; + +import java.io.IOException; +import java.net.DatagramPacket; +import java.net.DatagramSocket; +import java.net.InetSocketAddress; +import java.net.SocketException; +import java.nio.ByteBuffer; +import java.util.Collection; +import java.util.Collections; +import java.util.HashMap; +import java.util.HashSet; +import java.util.Set; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.LinkedBlockingQueue; +import java.util.concurrent.Semaphore; + +import java.util.concurrent.TimeUnit; +import java.util.Random; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import org.apache.zookeeper.jmx.MBeanRegistry; +import org.apache.zookeeper.server.quorum.Election; +import org.apache.zookeeper.server.quorum.Vote; +import org.apache.zookeeper.server.quorum.QuorumPeer.QuorumServer; +import org.apache.zookeeper.server.quorum.QuorumPeer.ServerState; + +/** + * @deprecated This class has been deprecated as of release 3.4.0. + */ +@Deprecated +public class AuthFastLeaderElection implements Election { + private static final Logger LOG = LoggerFactory.getLogger(AuthFastLeaderElection.class); + + /* Sequence numbers for messages */ + static int sequencer = 0; + static int maxTag = 0; + + /* + * Determine how much time a process has to wait once it believes that it + * has reached the end of leader election. + */ + static int finalizeWait = 100; + + /* + * Challenge counter to avoid replay attacks + */ + + static int challengeCounter = 0; + + /* + * Flag to determine whether to authenticate or not + */ + + private boolean authEnabled = false; + + static public class Notification { + /* + * Proposed leader + */ + long leader; + + /* + * zxid of the proposed leader + */ + long zxid; + + /* + * Epoch + */ + long epoch; + + /* + * current state of sender + */ + QuorumPeer.ServerState state; + + /* + * Address of the sender + */ + InetSocketAddress addr; + } + + /* + * Messages to send, both Notifications and Acks + */ + static public class ToSend { + static enum mType { + crequest, challenge, notification, ack + } + + ToSend(mType type, long tag, long leader, long zxid, long epoch, + ServerState state, InetSocketAddress addr) { + + switch (type) { + case crequest: + this.type = 0; + this.tag = tag; + this.leader = leader; + this.zxid = zxid; + this.epoch = epoch; + this.state = state; + this.addr = addr; + + break; + case challenge: + this.type = 1; + this.tag = tag; + this.leader = leader; + this.zxid = zxid; + this.epoch = epoch; + this.state = state; + this.addr = addr; + + break; + case notification: + this.type = 2; + this.leader = leader; + this.zxid = zxid; + this.epoch = epoch; + this.state = QuorumPeer.ServerState.LOOKING; + this.tag = tag; + this.addr = addr; + + break; + case ack: + this.type = 3; + this.tag = tag; + this.leader = leader; + this.zxid = zxid; + this.epoch = epoch; + this.state = state; + this.addr = addr; + + break; + default: + break; + } + } + + /* + * Message type: 0 notification, 1 acknowledgement + */ + int type; + + /* + * Proposed leader in the case of notification + */ + long leader; + + /* + * id contains the tag for acks, and zxid for notifications + */ + long zxid; + + /* + * Epoch + */ + long epoch; + + /* + * Current state; + */ + QuorumPeer.ServerState state; + + /* + * Message tag + */ + long tag; + + InetSocketAddress addr; + } + + LinkedBlockingQueue sendqueue; + + LinkedBlockingQueue recvqueue; + + private class Messenger { + + final DatagramSocket mySocket; + long lastProposedLeader; + long lastProposedZxid; + long lastEpoch; + final Set ackset; + final ConcurrentHashMap challengeMap; + final ConcurrentHashMap challengeMutex; + final ConcurrentHashMap ackMutex; + final ConcurrentHashMap> addrChallengeMap; + + class WorkerReceiver implements Runnable { + + DatagramSocket mySocket; + Messenger myMsg; + + WorkerReceiver(DatagramSocket s, Messenger msg) { + mySocket = s; + myMsg = msg; + } + + boolean saveChallenge(long tag, long challenge) { + Semaphore s = challengeMutex.get(tag); + if (s != null) { + synchronized (Messenger.this) { + challengeMap.put(tag, challenge); + challengeMutex.remove(tag); + } + + + s.release(); + } else { + LOG.error("No challenge mutex object"); + } + + + return true; + } + + public void run() { + byte responseBytes[] = new byte[48]; + ByteBuffer responseBuffer = ByteBuffer.wrap(responseBytes); + DatagramPacket responsePacket = new DatagramPacket( + responseBytes, responseBytes.length); + while (true) { + // Sleeps on receive + try { + responseBuffer.clear(); + mySocket.receive(responsePacket); + } catch (IOException e) { + LOG.warn("Ignoring exception receiving", e); + } + // Receive new message + if (responsePacket.getLength() != responseBytes.length) { + LOG.warn("Got a short response: " + + responsePacket.getLength() + " " + + responsePacket.toString()); + continue; + } + responseBuffer.clear(); + int type = responseBuffer.getInt(); + if ((type > 3) || (type < 0)) { + LOG.warn("Got bad Msg type: " + type); + continue; + } + long tag = responseBuffer.getLong(); + + QuorumPeer.ServerState ackstate = QuorumPeer.ServerState.LOOKING; + switch (responseBuffer.getInt()) { + case 0: + ackstate = QuorumPeer.ServerState.LOOKING; + break; + case 1: + ackstate = QuorumPeer.ServerState.LEADING; + break; + case 2: + ackstate = QuorumPeer.ServerState.FOLLOWING; + break; + } + + Vote current = self.getCurrentVote(); + + switch (type) { + case 0: + // Receive challenge request + ToSend c = new ToSend(ToSend.mType.challenge, tag, + current.getId(), current.getZxid(), + logicalclock, self.getPeerState(), + (InetSocketAddress) responsePacket + .getSocketAddress()); + sendqueue.offer(c); + break; + case 1: + // Receive challenge and store somewhere else + long challenge = responseBuffer.getLong(); + saveChallenge(tag, challenge); + + break; + case 2: + Notification n = new Notification(); + n.leader = responseBuffer.getLong(); + n.zxid = responseBuffer.getLong(); + n.epoch = responseBuffer.getLong(); + n.state = ackstate; + n.addr = (InetSocketAddress) responsePacket + .getSocketAddress(); + + if ((myMsg.lastEpoch <= n.epoch) + && ((n.zxid > myMsg.lastProposedZxid) + || ((n.zxid == myMsg.lastProposedZxid) + && (n.leader > myMsg.lastProposedLeader)))) { + myMsg.lastProposedZxid = n.zxid; + myMsg.lastProposedLeader = n.leader; + myMsg.lastEpoch = n.epoch; + } + + long recChallenge; + InetSocketAddress addr = (InetSocketAddress) responsePacket + .getSocketAddress(); + if (authEnabled) { + ConcurrentHashMap tmpMap = addrChallengeMap.get(addr); + if(tmpMap != null){ + if (tmpMap.get(tag) != null) { + recChallenge = responseBuffer.getLong(); + + if (tmpMap.get(tag) == recChallenge) { + recvqueue.offer(n); + + ToSend a = new ToSend(ToSend.mType.ack, + tag, current.getId(), + current.getZxid(), + logicalclock, self.getPeerState(), + addr); + + sendqueue.offer(a); + } else { + LOG.warn("Incorrect challenge: " + + recChallenge + ", " + + addrChallengeMap.toString()); + } + } else { + LOG.warn("No challenge for host: " + addr + + " " + tag); + } + } + } else { + recvqueue.offer(n); + + ToSend a = new ToSend(ToSend.mType.ack, tag, + current.getId(), current.getZxid(), + logicalclock, self.getPeerState(), + (InetSocketAddress) responsePacket + .getSocketAddress()); + + sendqueue.offer(a); + } + break; + + // Upon reception of an ack message, remove it from the + // queue + case 3: + Semaphore s = ackMutex.get(tag); + + if(s != null) + s.release(); + else LOG.error("Empty ack semaphore"); + + ackset.add(tag); + + if (authEnabled) { + ConcurrentHashMap tmpMap = addrChallengeMap.get(responsePacket + .getSocketAddress()); + if(tmpMap != null) { + tmpMap.remove(tag); + } else { + LOG.warn("No such address in the ensemble configuration " + responsePacket + .getSocketAddress()); + } + } + + if (ackstate != QuorumPeer.ServerState.LOOKING) { + Notification outofsync = new Notification(); + outofsync.leader = responseBuffer.getLong(); + outofsync.zxid = responseBuffer.getLong(); + outofsync.epoch = responseBuffer.getLong(); + outofsync.state = ackstate; + outofsync.addr = (InetSocketAddress) responsePacket + .getSocketAddress(); + + recvqueue.offer(outofsync); + } + + break; + // Default case + default: + LOG.warn("Received message of incorrect type " + type); + break; + } + } + } + } + + class WorkerSender implements Runnable { + + Random rand; + int maxAttempts; + int ackWait = finalizeWait; + + /* + * Receives a socket and max number of attempts as input + */ + + WorkerSender(int attempts) { + maxAttempts = attempts; + rand = new Random(java.lang.Thread.currentThread().getId() + + System.currentTimeMillis()); + } + + long genChallenge() { + byte buf[] = new byte[8]; + + buf[0] = (byte) ((challengeCounter & 0xff000000) >>> 24); + buf[1] = (byte) ((challengeCounter & 0x00ff0000) >>> 16); + buf[2] = (byte) ((challengeCounter & 0x0000ff00) >>> 8); + buf[3] = (byte) ((challengeCounter & 0x000000ff)); + + challengeCounter++; + int secret = rand.nextInt(java.lang.Integer.MAX_VALUE); + + buf[4] = (byte) ((secret & 0xff000000) >>> 24); + buf[5] = (byte) ((secret & 0x00ff0000) >>> 16); + buf[6] = (byte) ((secret & 0x0000ff00) >>> 8); + buf[7] = (byte) ((secret & 0x000000ff)); + + return (((long)(buf[0] & 0xFF)) << 56) + + (((long)(buf[1] & 0xFF)) << 48) + + (((long)(buf[2] & 0xFF)) << 40) + + (((long)(buf[3] & 0xFF)) << 32) + + (((long)(buf[4] & 0xFF)) << 24) + + (((long)(buf[5] & 0xFF)) << 16) + + (((long)(buf[6] & 0xFF)) << 8) + + ((long)(buf[7] & 0xFF)); + } + + public void run() { + while (true) { + try { + ToSend m = sendqueue.take(); + process(m); + } catch (InterruptedException e) { + break; + } + + } + } + + private void process(ToSend m) { + int attempts = 0; + byte zeroes[]; + byte requestBytes[] = new byte[48]; + DatagramPacket requestPacket = new DatagramPacket(requestBytes, + requestBytes.length); + ByteBuffer requestBuffer = ByteBuffer.wrap(requestBytes); + + switch (m.type) { + case 0: + /* + * Building challenge request packet to send + */ + requestBuffer.clear(); + requestBuffer.putInt(ToSend.mType.crequest.ordinal()); + requestBuffer.putLong(m.tag); + requestBuffer.putInt(m.state.ordinal()); + zeroes = new byte[32]; + requestBuffer.put(zeroes); + + requestPacket.setLength(48); + try { + requestPacket.setSocketAddress(m.addr); + } catch (IllegalArgumentException e) { + // Sun doesn't include the address that causes this + // exception to be thrown, so we wrap the exception + // in order to capture this critical detail. + throw new IllegalArgumentException( + "Unable to set socket address on packet, msg:" + + e.getMessage() + " with addr:" + m.addr, + e); + } + + try { + if (challengeMap.get(m.tag) == null) { + mySocket.send(requestPacket); + } + } catch (IOException e) { + LOG.warn("Exception while sending challenge: ", e); + } + + break; + case 1: + /* + * Building challenge packet to send + */ + + long newChallenge; + ConcurrentHashMap tmpMap = addrChallengeMap.get(m.addr); + if(tmpMap != null){ + Long tmpLong = tmpMap.get(m.tag); + if (tmpLong != null) { + newChallenge = tmpLong; + } else { + newChallenge = genChallenge(); + } + + tmpMap.put(m.tag, newChallenge); + + requestBuffer.clear(); + requestBuffer.putInt(ToSend.mType.challenge.ordinal()); + requestBuffer.putLong(m.tag); + requestBuffer.putInt(m.state.ordinal()); + requestBuffer.putLong(newChallenge); + zeroes = new byte[24]; + requestBuffer.put(zeroes); + + requestPacket.setLength(48); + try { + requestPacket.setSocketAddress(m.addr); + } catch (IllegalArgumentException e) { + // Sun doesn't include the address that causes this + // exception to be thrown, so we wrap the exception + // in order to capture this critical detail. + throw new IllegalArgumentException( + "Unable to set socket address on packet, msg:" + + e.getMessage() + " with addr:" + m.addr, + e); + } + + + try { + mySocket.send(requestPacket); + } catch (IOException e) { + LOG.warn("Exception while sending challenge: ", e); + } + } else { + LOG.error("Address is not in the configuration: " + m.addr); + } + + break; + case 2: + + /* + * Building notification packet to send + */ + + requestBuffer.clear(); + requestBuffer.putInt(m.type); + requestBuffer.putLong(m.tag); + requestBuffer.putInt(m.state.ordinal()); + requestBuffer.putLong(m.leader); + requestBuffer.putLong(m.zxid); + requestBuffer.putLong(m.epoch); + zeroes = new byte[8]; + requestBuffer.put(zeroes); + + requestPacket.setLength(48); + try { + requestPacket.setSocketAddress(m.addr); + } catch (IllegalArgumentException e) { + // Sun doesn't include the address that causes this + // exception to be thrown, so we wrap the exception + // in order to capture this critical detail. + throw new IllegalArgumentException( + "Unable to set socket address on packet, msg:" + + e.getMessage() + " with addr:" + m.addr, + e); + } + + + boolean myChallenge = false; + boolean myAck = false; + + while (attempts < maxAttempts) { + try { + /* + * Try to obtain a challenge only if does not have + * one yet + */ + + if (!myChallenge && authEnabled) { + ToSend crequest = new ToSend( + ToSend.mType.crequest, m.tag, m.leader, + m.zxid, m.epoch, + QuorumPeer.ServerState.LOOKING, m.addr); + sendqueue.offer(crequest); + + try { + double timeout = ackWait + * java.lang.Math.pow(2, attempts); + + Semaphore s = new Semaphore(0); + synchronized(Messenger.this) { + challengeMutex.put(m.tag, s); + s.tryAcquire((long) timeout, TimeUnit.MILLISECONDS); + myChallenge = challengeMap + .containsKey(m.tag); + } + } catch (InterruptedException e) { + LOG.warn("Challenge request exception: ", e); + } + } + + /* + * If don't have challenge yet, skip sending + * notification + */ + + if (authEnabled && !myChallenge) { + attempts++; + continue; + } + + if (authEnabled) { + requestBuffer.position(40); + Long tmpLong = challengeMap.get(m.tag); + if(tmpLong != null){ + requestBuffer.putLong(tmpLong); + } else { + LOG.warn("No challenge with tag: " + m.tag); + } + } + mySocket.send(requestPacket); + try { + Semaphore s = new Semaphore(0); + double timeout = ackWait + * java.lang.Math.pow(10, attempts); + ackMutex.put(m.tag, s); + s.tryAcquire((int) timeout, TimeUnit.MILLISECONDS); + } catch (InterruptedException e) { + LOG.warn("Ack exception: ", e); + } + + if(ackset.remove(m.tag)){ + myAck = true; + } + + } catch (IOException e) { + LOG.warn("Sending exception: ", e); + /* + * Do nothing, just try again + */ + } + if (myAck) { + /* + * Received ack successfully, so return + */ + challengeMap.remove(m.tag); + + return; + } else + attempts++; + } + /* + * Return message to queue for another attempt later if + * epoch hasn't changed. + */ + if (m.epoch == logicalclock) { + challengeMap.remove(m.tag); + sendqueue.offer(m); + } + break; + case 3: + + requestBuffer.clear(); + requestBuffer.putInt(m.type); + requestBuffer.putLong(m.tag); + requestBuffer.putInt(m.state.ordinal()); + requestBuffer.putLong(m.leader); + requestBuffer.putLong(m.zxid); + requestBuffer.putLong(m.epoch); + + requestPacket.setLength(48); + try { + requestPacket.setSocketAddress(m.addr); + } catch (IllegalArgumentException e) { + // Sun doesn't include the address that causes this + // exception to be thrown, so we wrap the exception + // in order to capture this critical detail. + throw new IllegalArgumentException( + "Unable to set socket address on packet, msg:" + + e.getMessage() + " with addr:" + m.addr, + e); + } + + + try { + mySocket.send(requestPacket); + } catch (IOException e) { + LOG.warn("Exception while sending ack: ", e); + } + break; + } + } + } + + public boolean queueEmpty() { + return (sendqueue.isEmpty() || ackset.isEmpty() || recvqueue + .isEmpty()); + } + + Messenger(int threads, DatagramSocket s) { + mySocket = s; + ackset = Collections.newSetFromMap(new ConcurrentHashMap()); + challengeMap = new ConcurrentHashMap(); + challengeMutex = new ConcurrentHashMap(); + ackMutex = new ConcurrentHashMap(); + addrChallengeMap = new ConcurrentHashMap>(); + lastProposedLeader = 0; + lastProposedZxid = 0; + lastEpoch = 0; + + for (int i = 0; i < threads; ++i) { + Thread t = new Thread(new WorkerSender(3), + "WorkerSender Thread: " + (i + 1)); + t.setDaemon(true); + t.start(); + } + + for (QuorumServer server : self.getVotingView().values()) { + InetSocketAddress saddr = new InetSocketAddress(server.addr + .getAddress(), port); + addrChallengeMap.put(saddr, new ConcurrentHashMap()); + } + + Thread t = new Thread(new WorkerReceiver(s, this), + "WorkerReceiver Thread"); + t.start(); + } + + } + + QuorumPeer self; + int port; + volatile long logicalclock; /* Election instance */ + DatagramSocket mySocket; + long proposedLeader; + long proposedZxid; + + public AuthFastLeaderElection(QuorumPeer self, + boolean auth) { + this.authEnabled = auth; + starter(self); + } + + public AuthFastLeaderElection(QuorumPeer self) { + starter(self); + } + + private void starter(QuorumPeer self) { + this.self = self; + port = self.getVotingView().get(self.getId()).electionAddr.getPort(); + proposedLeader = -1; + proposedZxid = -1; + + try { + mySocket = new DatagramSocket(port); + // mySocket.setSoTimeout(20000); + } catch (SocketException e1) { + e1.printStackTrace(); + throw new RuntimeException(); + } + sendqueue = new LinkedBlockingQueue(2 * self.getVotingView().size()); + recvqueue = new LinkedBlockingQueue(2 * self.getVotingView() + .size()); + new Messenger(self.getVotingView().size() * 2, mySocket); + } + + private void leaveInstance() { + logicalclock++; + } + + private void sendNotifications() { + for (QuorumServer server : self.getView().values()) { + + ToSend notmsg = new ToSend(ToSend.mType.notification, + AuthFastLeaderElection.sequencer++, proposedLeader, + proposedZxid, logicalclock, QuorumPeer.ServerState.LOOKING, + self.getView().get(server.id).electionAddr); + + sendqueue.offer(notmsg); + } + } + + private boolean totalOrderPredicate(long id, long zxid) { + if ((zxid > proposedZxid) + || ((zxid == proposedZxid) && (id > proposedLeader))) + return true; + else + return false; + + } + + private boolean termPredicate(HashMap votes, + long l, long zxid) { + + + Collection votesCast = votes.values(); + int count = 0; + /* + * First make the views consistent. Sometimes peers will have different + * zxids for a server depending on timing. + */ + for (Vote v : votesCast) { + if ((v.getId() == l) && (v.getZxid() == zxid)) + count++; + } + + if (count > (self.getVotingView().size() / 2)) + return true; + else + return false; + + } + + /** + * There is nothing to shutdown in this implementation of + * leader election, so we simply have an empty method. + */ + public void shutdown(){} + + /** + * Invoked in QuorumPeer to find or elect a new leader. + * + * @throws InterruptedException + */ + public Vote lookForLeader() throws InterruptedException { + try { + self.jmxLeaderElectionBean = new LeaderElectionBean(); + MBeanRegistry.getInstance().register( + self.jmxLeaderElectionBean, self.jmxLocalPeerBean); + } catch (Exception e) { + LOG.warn("Failed to register with JMX", e); + self.jmxLeaderElectionBean = null; + } + + try { + HashMap recvset = + new HashMap(); + + HashMap outofelection = + new HashMap(); + + logicalclock++; + + proposedLeader = self.getId(); + proposedZxid = self.getLastLoggedZxid(); + + LOG.info("Election tally"); + sendNotifications(); + + /* + * Loop in which we exchange notifications until we find a leader + */ + + while (self.getPeerState() == ServerState.LOOKING) { + /* + * Remove next notification from queue, times out after 2 times + * the termination time + */ + Notification n = recvqueue.poll(2 * finalizeWait, + TimeUnit.MILLISECONDS); + + /* + * Sends more notifications if haven't received enough. + * Otherwise processes new notification. + */ + if (n == null) { + if (((!outofelection.isEmpty()) || (recvset.size() > 1))) + sendNotifications(); + } else + switch (n.state) { + case LOOKING: + if (n.epoch > logicalclock) { + logicalclock = n.epoch; + recvset.clear(); + if (totalOrderPredicate(n.leader, n.zxid)) { + proposedLeader = n.leader; + proposedZxid = n.zxid; + } + sendNotifications(); + } else if (n.epoch < logicalclock) { + break; + } else if (totalOrderPredicate(n.leader, n.zxid)) { + proposedLeader = n.leader; + proposedZxid = n.zxid; + + sendNotifications(); + } + + recvset.put(n.addr, new Vote(n.leader, n.zxid)); + + // If have received from all nodes, then terminate + if (self.getVotingView().size() == recvset.size()) { + self.setPeerState((proposedLeader == self.getId()) ? + ServerState.LEADING: ServerState.FOLLOWING); + // if (self.state == ServerState.FOLLOWING) { + // Thread.sleep(100); + // } + leaveInstance(); + return new Vote(proposedLeader, proposedZxid); + + } else if (termPredicate(recvset, proposedLeader, + proposedZxid)) { + // Otherwise, wait for a fixed amount of time + LOG.info("Passed predicate"); + Thread.sleep(finalizeWait); + + // Notification probe = recvqueue.peek(); + + // Verify if there is any change in the proposed leader + while ((!recvqueue.isEmpty()) + && !totalOrderPredicate( + recvqueue.peek().leader, recvqueue + .peek().zxid)) { + recvqueue.poll(); + } + if (recvqueue.isEmpty()) { + // LOG.warn("Proposed leader: " + + // proposedLeader); + self.setPeerState( + (proposedLeader == self.getId()) ? + ServerState.LEADING : + ServerState.FOLLOWING); + + leaveInstance(); + return new Vote(proposedLeader, proposedZxid); + } + } + break; + case LEADING: + outofelection.put(n.addr, new Vote(n.leader, n.zxid)); + + if (termPredicate(outofelection, n.leader, n.zxid)) { + + self.setPeerState((n.leader == self.getId()) ? + ServerState.LEADING: ServerState.FOLLOWING); + + leaveInstance(); + return new Vote(n.leader, n.zxid); + } + break; + case FOLLOWING: + outofelection.put(n.addr, new Vote(n.leader, n.zxid)); + + if (termPredicate(outofelection, n.leader, n.zxid)) { + + self.setPeerState((n.leader == self.getId()) ? + ServerState.LEADING: ServerState.FOLLOWING); + + leaveInstance(); + return new Vote(n.leader, n.zxid); + } + break; + default: + break; + } + } + + return null; + } finally { + try { + if(self.jmxLeaderElectionBean != null){ + MBeanRegistry.getInstance().unregister( + self.jmxLeaderElectionBean); + } + } catch (Exception e) { + LOG.warn("Failed to unregister with JMX", e); + } + self.jmxLeaderElectionBean = null; + } + } +} diff --git a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/quorum/CommitProcessor.java b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/quorum/CommitProcessor.java new file mode 100644 index 000000000..a0c2cbdd0 --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/quorum/CommitProcessor.java @@ -0,0 +1,192 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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. + */ + +package org.apache.zookeeper.server.quorum; + +import java.util.ArrayList; +import java.util.LinkedList; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.apache.zookeeper.ZooDefs.OpCode; +import org.apache.zookeeper.server.Request; +import org.apache.zookeeper.server.RequestProcessor; + +/** + * This RequestProcessor matches the incoming committed requests with the + * locally submitted requests. The trick is that locally submitted requests that + * change the state of the system will come back as incoming committed requests, + * so we need to match them up. + */ +public class CommitProcessor extends Thread implements RequestProcessor { + private static final Logger LOG = LoggerFactory.getLogger(CommitProcessor.class); + + /** + * Requests that we are holding until the commit comes in. + */ + LinkedList queuedRequests = new LinkedList(); + + /** + * Requests that have been committed. + */ + LinkedList committedRequests = new LinkedList(); + + RequestProcessor nextProcessor; + ArrayList toProcess = new ArrayList(); + + /** + * This flag indicates whether we need to wait for a response to come back from the + * leader or we just let the sync operation flow through like a read. The flag will + * be true if the CommitProcessor is in a Leader pipeline. + */ + boolean matchSyncs; + + public CommitProcessor(RequestProcessor nextProcessor, String id, boolean matchSyncs) { + super("CommitProcessor:" + id); + this.nextProcessor = nextProcessor; + this.matchSyncs = matchSyncs; + } + + volatile boolean finished = false; + + @Override + public void run() { + try { + Request nextPending = null; + while (!finished) { + int len = toProcess.size(); + for (int i = 0; i < len; i++) { + nextProcessor.processRequest(toProcess.get(i)); + } + toProcess.clear(); + synchronized (this) { + if ((queuedRequests.size() == 0 || nextPending != null) + && committedRequests.size() == 0) { + wait(); + continue; + } + // First check and see if the commit came in for the pending + // request + if ((queuedRequests.size() == 0 || nextPending != null) + && committedRequests.size() > 0) { + Request r = committedRequests.remove(); + /* + * We match with nextPending so that we can move to the + * next request when it is committed. We also want to + * use nextPending because it has the cnxn member set + * properly. + */ + if (nextPending != null + && nextPending.sessionId == r.sessionId + && nextPending.cxid == r.cxid) { + // we want to send our version of the request. + // the pointer to the connection in the request + nextPending.hdr = r.hdr; + nextPending.txn = r.txn; + nextPending.zxid = r.zxid; + toProcess.add(nextPending); + nextPending = null; + } else { + // this request came from someone else so just + // send the commit packet + toProcess.add(r); + } + } + } + + // We haven't matched the pending requests, so go back to + // waiting + if (nextPending != null) { + continue; + } + + synchronized (this) { + // Process the next requests in the queuedRequests + while (nextPending == null && queuedRequests.size() > 0) { + Request request = queuedRequests.remove(); + switch (request.type) { + case OpCode.create: + case OpCode.delete: + case OpCode.setData: + case OpCode.multi: + case OpCode.setACL: + case OpCode.createSession: + case OpCode.closeSession: + nextPending = request; + break; + case OpCode.sync: + if (matchSyncs) { + nextPending = request; + } else { + toProcess.add(request); + } + break; + default: + toProcess.add(request); + } + } + } + } + } catch (InterruptedException e) { + LOG.warn("Interrupted exception while waiting", e); + } catch (Throwable e) { + LOG.error("Unexpected exception causing CommitProcessor to exit", e); + } + LOG.info("CommitProcessor exited loop!"); + } + + synchronized public void commit(Request request) { + if (!finished) { + if (request == null) { + LOG.warn("Committed a null!", + new Exception("committing a null! ")); + return; + } + if (LOG.isDebugEnabled()) { + LOG.debug("Committing request:: " + request); + } + committedRequests.add(request); + notifyAll(); + } + } + + synchronized public void processRequest(Request request) { + // request.addRQRec(">commit"); + if (LOG.isDebugEnabled()) { + LOG.debug("Processing request:: " + request); + } + + if (!finished) { + queuedRequests.add(request); + notifyAll(); + } + } + + public void shutdown() { + LOG.info("Shutting down"); + synchronized (this) { + finished = true; + queuedRequests.clear(); + notifyAll(); + } + if (nextProcessor != null) { + nextProcessor.shutdown(); + } + } + +} diff --git a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/quorum/Election.java b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/quorum/Election.java new file mode 100644 index 000000000..899063853 --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/quorum/Election.java @@ -0,0 +1,27 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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. + */ + +package org.apache.zookeeper.server.quorum; + + +import org.apache.zookeeper.server.quorum.Vote; + +public interface Election { + public Vote lookForLeader() throws InterruptedException; + public void shutdown(); +} diff --git a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/quorum/FastLeaderElection.java b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/quorum/FastLeaderElection.java new file mode 100644 index 000000000..6b79d04a1 --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/quorum/FastLeaderElection.java @@ -0,0 +1,999 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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. + */ + + +package org.apache.zookeeper.server.quorum; + +import java.io.IOException; +import java.nio.ByteBuffer; +import java.util.HashMap; +import java.util.HashSet; +import java.util.Map; +import java.util.concurrent.LinkedBlockingQueue; +import java.util.concurrent.TimeUnit; + +import org.apache.zookeeper.jmx.MBeanRegistry; +import org.apache.zookeeper.server.quorum.QuorumCnxManager.Message; +import org.apache.zookeeper.server.quorum.QuorumPeer.LearnerType; +import org.apache.zookeeper.server.quorum.QuorumPeer.QuorumServer; +import org.apache.zookeeper.server.quorum.QuorumPeer.ServerState; +import org.apache.zookeeper.server.util.ZxidUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + + +/** + * Implementation of leader election using TCP. It uses an object of the class + * QuorumCnxManager to manage connections. Otherwise, the algorithm is push-based + * as with the other UDP implementations. + * + * There are a few parameters that can be tuned to change its behavior. First, + * finalizeWait determines the amount of time to wait until deciding upon a leader. + * This is part of the leader election algorithm. + */ + + +public class FastLeaderElection implements Election { + private static final Logger LOG = LoggerFactory.getLogger(FastLeaderElection.class); + + /** + * Determine how much time a process has to wait + * once it believes that it has reached the end of + * leader election. + */ + final static int finalizeWait = 200; + + + /** + * Upper bound on the amount of time between two consecutive + * notification checks. This impacts the amount of time to get + * the system up again after long partitions. Currently 60 seconds. + */ + + final static int maxNotificationInterval = 60000; + + /** + * Connection manager. Fast leader election uses TCP for + * communication between peers, and QuorumCnxManager manages + * such connections. + */ + + QuorumCnxManager manager; + + + /** + * Notifications are messages that let other peers know that + * a given peer has changed its vote, either because it has + * joined leader election or because it learned of another + * peer with higher zxid or same zxid and higher server id + */ + + static public class Notification { + /* + * Format version, introduced in 3.4.6 + */ + + public final static int CURRENTVERSION = 0x1; + int version; + + /* + * Proposed leader + */ + long leader; + + /* + * zxid of the proposed leader + */ + long zxid; + + /* + * Epoch + */ + long electionEpoch; + + /* + * current state of sender + */ + QuorumPeer.ServerState state; + + /* + * Address of sender + */ + long sid; + + /* + * epoch of the proposed leader + */ + long peerEpoch; + + @Override + public String toString() { + return new String(Long.toHexString(version) + " (message format version), " + + leader + " (n.leader), 0x" + + Long.toHexString(zxid) + " (n.zxid), 0x" + + Long.toHexString(electionEpoch) + " (n.round), " + state + + " (n.state), " + sid + " (n.sid), 0x" + + Long.toHexString(peerEpoch) + " (n.peerEpoch) "); + } + } + + static ByteBuffer buildMsg(int state, + long leader, + long zxid, + long electionEpoch, + long epoch) { + byte requestBytes[] = new byte[40]; + ByteBuffer requestBuffer = ByteBuffer.wrap(requestBytes); + + /* + * Building notification packet to send + */ + + requestBuffer.clear(); + requestBuffer.putInt(state); + requestBuffer.putLong(leader); + requestBuffer.putLong(zxid); + requestBuffer.putLong(electionEpoch); + requestBuffer.putLong(epoch); + requestBuffer.putInt(Notification.CURRENTVERSION); + + return requestBuffer; + } + + /** + * Messages that a peer wants to send to other peers. + * These messages can be both Notifications and Acks + * of reception of notification. + */ + static public class ToSend { + static enum mType {crequest, challenge, notification, ack} + + ToSend(mType type, + long leader, + long zxid, + long electionEpoch, + ServerState state, + long sid, + long peerEpoch) { + + this.leader = leader; + this.zxid = zxid; + this.electionEpoch = electionEpoch; + this.state = state; + this.sid = sid; + this.peerEpoch = peerEpoch; + } + + /* + * Proposed leader in the case of notification + */ + long leader; + + /* + * id contains the tag for acks, and zxid for notifications + */ + long zxid; + + /* + * Epoch + */ + long electionEpoch; + + /* + * Current state; + */ + QuorumPeer.ServerState state; + + /* + * Address of recipient + */ + long sid; + + /* + * Leader epoch + */ + long peerEpoch; + } + + LinkedBlockingQueue sendqueue; + LinkedBlockingQueue recvqueue; + + /** + * Multi-threaded implementation of message handler. Messenger + * implements two sub-classes: WorkReceiver and WorkSender. The + * functionality of each is obvious from the name. Each of these + * spawns a new thread. + */ + + protected class Messenger { + + /** + * Receives messages from instance of QuorumCnxManager on + * method run(), and processes such messages. + */ + + class WorkerReceiver implements Runnable { + volatile boolean stop; + QuorumCnxManager manager; + + WorkerReceiver(QuorumCnxManager manager) { + this.stop = false; + this.manager = manager; + } + + public void run() { + + Message response; + while (!stop) { + // Sleeps on receive + try{ + response = manager.pollRecvQueue(3000, TimeUnit.MILLISECONDS); + if(response == null) continue; + + /* + * If it is from an observer, respond right away. + * Note that the following predicate assumes that + * if a server is not a follower, then it must be + * an observer. If we ever have any other type of + * learner in the future, we'll have to change the + * way we check for observers. + */ + if(!self.getVotingView().containsKey(response.sid)){ + Vote current = self.getCurrentVote(); + ToSend notmsg = new ToSend(ToSend.mType.notification, + current.getId(), + current.getZxid(), + logicalclock, + self.getPeerState(), + response.sid, + current.getPeerEpoch()); + + sendqueue.offer(notmsg); + } else { + // Receive new message + if (LOG.isDebugEnabled()) { + LOG.debug("Receive new notification message. My id = " + + self.getId()); + } + + /* + * We check for 28 bytes for backward compatibility + */ + if (response.buffer.capacity() < 28) { + LOG.error("Got a short response: " + + response.buffer.capacity()); + continue; + } + boolean backCompatibility = (response.buffer.capacity() == 28); + response.buffer.clear(); + + // Instantiate Notification and set its attributes + Notification n = new Notification(); + + // State of peer that sent this message + QuorumPeer.ServerState ackstate = QuorumPeer.ServerState.LOOKING; + switch (response.buffer.getInt()) { + case 0: + ackstate = QuorumPeer.ServerState.LOOKING; + break; + case 1: + ackstate = QuorumPeer.ServerState.FOLLOWING; + break; + case 2: + ackstate = QuorumPeer.ServerState.LEADING; + break; + case 3: + ackstate = QuorumPeer.ServerState.OBSERVING; + break; + default: + continue; + } + + n.leader = response.buffer.getLong(); + n.zxid = response.buffer.getLong(); + n.electionEpoch = response.buffer.getLong(); + n.state = ackstate; + n.sid = response.sid; + if(!backCompatibility){ + n.peerEpoch = response.buffer.getLong(); + } else { + if(LOG.isInfoEnabled()){ + LOG.info("Backward compatibility mode, server id=" + n.sid); + } + n.peerEpoch = ZxidUtils.getEpochFromZxid(n.zxid); + } + + /* + * Version added in 3.4.6 + */ + + n.version = (response.buffer.remaining() >= 4) ? + response.buffer.getInt() : 0x0; + + /* + * Print notification info + */ + if(LOG.isInfoEnabled()){ + printNotification(n); + } + + /* + * If this server is looking, then send proposed leader + */ + + if(self.getPeerState() == QuorumPeer.ServerState.LOOKING){ + recvqueue.offer(n); + + /* + * Send a notification back if the peer that sent this + * message is also looking and its logical clock is + * lagging behind. + */ + if((ackstate == QuorumPeer.ServerState.LOOKING) + && (n.electionEpoch < logicalclock)){ + Vote v = getVote(); + ToSend notmsg = new ToSend(ToSend.mType.notification, + v.getId(), + v.getZxid(), + logicalclock, + self.getPeerState(), + response.sid, + v.getPeerEpoch()); + sendqueue.offer(notmsg); + } + } else { + /* + * If this server is not looking, but the one that sent the ack + * is looking, then send back what it believes to be the leader. + */ + Vote current = self.getCurrentVote(); + if(ackstate == QuorumPeer.ServerState.LOOKING){ + if(LOG.isDebugEnabled()){ + LOG.debug("Sending new notification. My id = " + + self.getId() + " recipient=" + + response.sid + " zxid=0x" + + Long.toHexString(current.getZxid()) + + " leader=" + current.getId()); + } + + ToSend notmsg; + if(n.version > 0x0) { + notmsg = new ToSend( + ToSend.mType.notification, + current.getId(), + current.getZxid(), + current.getElectionEpoch(), + self.getPeerState(), + response.sid, + current.getPeerEpoch()); + + } else { + Vote bcVote = self.getBCVote(); + notmsg = new ToSend( + ToSend.mType.notification, + bcVote.getId(), + bcVote.getZxid(), + bcVote.getElectionEpoch(), + self.getPeerState(), + response.sid, + bcVote.getPeerEpoch()); + } + sendqueue.offer(notmsg); + } + } + } + } catch (InterruptedException e) { + System.out.println("Interrupted Exception while waiting for new message" + + e.toString()); + } + } + LOG.info("WorkerReceiver is down"); + } + } + + + /** + * This worker simply dequeues a message to send and + * and queues it on the manager's queue. + */ + + class WorkerSender implements Runnable { + volatile boolean stop; + QuorumCnxManager manager; + + WorkerSender(QuorumCnxManager manager){ + this.stop = false; + this.manager = manager; + } + + public void run() { + while (!stop) { + try { + ToSend m = sendqueue.poll(3000, TimeUnit.MILLISECONDS); + if(m == null) continue; + + process(m); + } catch (InterruptedException e) { + break; + } + } + LOG.info("WorkerSender is down"); + } + + /** + * Called by run() once there is a new message to send. + * + * @param m message to send + */ + void process(ToSend m) { + ByteBuffer requestBuffer = buildMsg(m.state.ordinal(), + m.leader, + m.zxid, + m.electionEpoch, + m.peerEpoch); + manager.toSend(m.sid, requestBuffer); + } + } + + /** + * Test if both send and receive queues are empty. + */ + public boolean queueEmpty() { + return (sendqueue.isEmpty() || recvqueue.isEmpty()); + } + + + WorkerSender ws; + WorkerReceiver wr; + + /** + * Constructor of class Messenger. + * + * @param manager Connection manager + */ + Messenger(QuorumCnxManager manager) { + + this.ws = new WorkerSender(manager); + + Thread t = new Thread(this.ws, + "WorkerSender[myid=" + self.getId() + "]"); + t.setDaemon(true); + t.start(); + + this.wr = new WorkerReceiver(manager); + + t = new Thread(this.wr, + "WorkerReceiver[myid=" + self.getId() + "]"); + t.setDaemon(true); + t.start(); + } + + /** + * Stops instances of WorkerSender and WorkerReceiver + */ + void halt(){ + this.ws.stop = true; + this.wr.stop = true; + } + + } + + QuorumPeer self; + Messenger messenger; + volatile long logicalclock; /* Election instance */ + long proposedLeader; + long proposedZxid; + long proposedEpoch; + + + /** + * Returns the current vlue of the logical clock counter + */ + public long getLogicalClock(){ + return logicalclock; + } + + /** + * Constructor of FastLeaderElection. It takes two parameters, one + * is the QuorumPeer object that instantiated this object, and the other + * is the connection manager. Such an object should be created only once + * by each peer during an instance of the ZooKeeper service. + * + * @param self QuorumPeer that created this object + * @param manager Connection manager + */ + public FastLeaderElection(QuorumPeer self, QuorumCnxManager manager){ + this.stop = false; + this.manager = manager; + starter(self, manager); + } + + /** + * This method is invoked by the constructor. Because it is a + * part of the starting procedure of the object that must be on + * any constructor of this class, it is probably best to keep as + * a separate method. As we have a single constructor currently, + * it is not strictly necessary to have it separate. + * + * @param self QuorumPeer that created this object + * @param manager Connection manager + */ + private void starter(QuorumPeer self, QuorumCnxManager manager) { + this.self = self; + proposedLeader = -1; + proposedZxid = -1; + + sendqueue = new LinkedBlockingQueue(); + recvqueue = new LinkedBlockingQueue(); + this.messenger = new Messenger(manager); + } + + private void leaveInstance(Vote v) { + if(LOG.isDebugEnabled()){ + LOG.debug("About to leave FLE instance: leader=" + + v.getId() + ", zxid=0x" + + Long.toHexString(v.getZxid()) + ", my id=" + self.getId() + + ", my state=" + self.getPeerState()); + } + recvqueue.clear(); + } + + public QuorumCnxManager getCnxManager(){ + return manager; + } + + volatile boolean stop; + public void shutdown(){ + stop = true; + LOG.debug("Shutting down connection manager"); + manager.halt(); + LOG.debug("Shutting down messenger"); + messenger.halt(); + LOG.debug("FLE is down"); + } + + + /** + * Send notifications to all peers upon a change in our vote + */ + private void sendNotifications() { + for (QuorumServer server : self.getVotingView().values()) { + long sid = server.id; + + ToSend notmsg = new ToSend(ToSend.mType.notification, + proposedLeader, + proposedZxid, + logicalclock, + QuorumPeer.ServerState.LOOKING, + sid, + proposedEpoch); + if(LOG.isDebugEnabled()){ + LOG.debug("Sending Notification: " + proposedLeader + " (n.leader), 0x" + + Long.toHexString(proposedZxid) + " (n.zxid), 0x" + Long.toHexString(logicalclock) + + " (n.round), " + sid + " (recipient), " + self.getId() + + " (myid), 0x" + Long.toHexString(proposedEpoch) + " (n.peerEpoch)"); + } + sendqueue.offer(notmsg); + } + } + + + private void printNotification(Notification n){ + LOG.info("Notification: " + n.toString() + + self.getPeerState() + " (my state)"); + } + + /** + * Check if a pair (server id, zxid) succeeds our + * current vote. + * + * @param id Server identifier + * @param zxid Last zxid observed by the issuer of this vote + */ + protected boolean totalOrderPredicate(long newId, long newZxid, long newEpoch, long curId, long curZxid, long curEpoch) { + LOG.debug("id: " + newId + ", proposed id: " + curId + ", zxid: 0x" + + Long.toHexString(newZxid) + ", proposed zxid: 0x" + Long.toHexString(curZxid)); + if(self.getQuorumVerifier().getWeight(newId) == 0){ + return false; + } + + /* + * We return true if one of the following three cases hold: + * 1- New epoch is higher + * 2- New epoch is the same as current epoch, but new zxid is higher + * 3- New epoch is the same as current epoch, new zxid is the same + * as current zxid, but server id is higher. + */ + + return ((newEpoch > curEpoch) || + ((newEpoch == curEpoch) && + ((newZxid > curZxid) || ((newZxid == curZxid) && (newId > curId))))); + } + + /** + * Termination predicate. Given a set of votes, determines if + * have sufficient to declare the end of the election round. + * + * @param votes Set of votes + * @param l Identifier of the vote received last + * @param zxid zxid of the the vote received last + */ + protected boolean termPredicate( + HashMap votes, + Vote vote) { + + HashSet set = new HashSet(); + + /* + * First make the views consistent. Sometimes peers will have + * different zxids for a server depending on timing. + */ + for (Map.Entry entry : votes.entrySet()) { + if (vote.equals(entry.getValue())){ + set.add(entry.getKey()); + } + } + + return self.getQuorumVerifier().containsQuorum(set); + } + + /** + * In the case there is a leader elected, and a quorum supporting + * this leader, we have to check if the leader has voted and acked + * that it is leading. We need this check to avoid that peers keep + * electing over and over a peer that has crashed and it is no + * longer leading. + * + * @param votes set of votes + * @param leader leader id + * @param electionEpoch epoch id + */ + protected boolean checkLeader( + HashMap votes, + long leader, + long electionEpoch){ + + boolean predicate = true; + + /* + * If everyone else thinks I'm the leader, I must be the leader. + * The other two checks are just for the case in which I'm not the + * leader. If I'm not the leader and I haven't received a message + * from leader stating that it is leading, then predicate is false. + */ + + if(leader != self.getId()){ + if(votes.get(leader) == null) predicate = false; + else if(votes.get(leader).getState() != ServerState.LEADING) predicate = false; + } else if(logicalclock != electionEpoch) { + predicate = false; + } + + return predicate; + } + + /** + * This predicate checks that a leader has been elected. It doesn't + * make a lot of sense without context (check lookForLeader) and it + * has been separated for testing purposes. + * + * @param recv map of received votes + * @param ooe map containing out of election votes (LEADING or FOLLOWING) + * @param n Notification + * @return + */ + protected boolean ooePredicate(HashMap recv, + HashMap ooe, + Notification n) { + + return (termPredicate(recv, new Vote(n.version, + n.leader, + n.zxid, + n.electionEpoch, + n.peerEpoch, + n.state)) + && checkLeader(ooe, n.leader, n.electionEpoch)); + + } + + synchronized void updateProposal(long leader, long zxid, long epoch){ + if(LOG.isDebugEnabled()){ + LOG.debug("Updating proposal: " + leader + " (newleader), 0x" + + Long.toHexString(zxid) + " (newzxid), " + proposedLeader + + " (oldleader), 0x" + Long.toHexString(proposedZxid) + " (oldzxid)"); + } + proposedLeader = leader; + proposedZxid = zxid; + proposedEpoch = epoch; + } + + synchronized Vote getVote(){ + return new Vote(proposedLeader, proposedZxid, proposedEpoch); + } + + /** + * A learning state can be either FOLLOWING or OBSERVING. + * This method simply decides which one depending on the + * role of the server. + * + * @return ServerState + */ + private ServerState learningState(){ + if(self.getLearnerType() == LearnerType.PARTICIPANT){ + LOG.debug("I'm a participant: " + self.getId()); + return ServerState.FOLLOWING; + } + else{ + LOG.debug("I'm an observer: " + self.getId()); + return ServerState.OBSERVING; + } + } + + /** + * Returns the initial vote value of server identifier. + * + * @return long + */ + private long getInitId(){ + if(self.getLearnerType() == LearnerType.PARTICIPANT) + return self.getId(); + else return Long.MIN_VALUE; + } + + /** + * Returns initial last logged zxid. + * + * @return long + */ + private long getInitLastLoggedZxid(){ + if(self.getLearnerType() == LearnerType.PARTICIPANT) + return self.getLastLoggedZxid(); + else return Long.MIN_VALUE; + } + + /** + * Returns the initial vote value of the peer epoch. + * + * @return long + */ + private long getPeerEpoch(){ + if(self.getLearnerType() == LearnerType.PARTICIPANT) + try { + return self.getCurrentEpoch(); + } catch(IOException e) { + RuntimeException re = new RuntimeException(e.getMessage()); + re.setStackTrace(e.getStackTrace()); + throw re; + } + else return Long.MIN_VALUE; + } + + /** + * Starts a new round of leader election. Whenever our QuorumPeer + * changes its state to LOOKING, this method is invoked, and it + * sends notifications to all other peers. + */ + public Vote lookForLeader() throws InterruptedException { + try { + self.jmxLeaderElectionBean = new LeaderElectionBean(); + MBeanRegistry.getInstance().register( + self.jmxLeaderElectionBean, self.jmxLocalPeerBean); + } catch (Exception e) { + LOG.warn("Failed to register with JMX", e); + self.jmxLeaderElectionBean = null; + } + if (self.start_fle == 0) { + self.start_fle = System.currentTimeMillis(); + } + try { + HashMap recvset = new HashMap(); + + HashMap outofelection = new HashMap(); + + int notTimeout = finalizeWait; + + synchronized(this){ + logicalclock++; + updateProposal(getInitId(), getInitLastLoggedZxid(), getPeerEpoch()); + } + + LOG.info("New election. My id = " + self.getId() + + ", proposed zxid=0x" + Long.toHexString(proposedZxid)); + sendNotifications(); + + /* + * Loop in which we exchange notifications until we find a leader + */ + + while ((self.getPeerState() == ServerState.LOOKING) && + (!stop)){ + /* + * Remove next notification from queue, times out after 2 times + * the termination time + */ + Notification n = recvqueue.poll(notTimeout, + TimeUnit.MILLISECONDS); + + /* + * Sends more notifications if haven't received enough. + * Otherwise processes new notification. + */ + if(n == null){ + if(manager.haveDelivered()){ + sendNotifications(); + } else { + manager.connectAll(); + } + + /* + * Exponential backoff + */ + int tmpTimeOut = notTimeout*2; + notTimeout = (tmpTimeOut < maxNotificationInterval? + tmpTimeOut : maxNotificationInterval); + LOG.info("Notification time out: " + notTimeout); + } + else if(self.getVotingView().containsKey(n.sid)) { + /* + * Only proceed if the vote comes from a replica in the + * voting view. + */ + switch (n.state) { + case LOOKING: + // If notification > current, replace and send messages out + if (n.electionEpoch > logicalclock) { + logicalclock = n.electionEpoch; + recvset.clear(); + if(totalOrderPredicate(n.leader, n.zxid, n.peerEpoch, + getInitId(), getInitLastLoggedZxid(), getPeerEpoch())) { + updateProposal(n.leader, n.zxid, n.peerEpoch); + } else { + updateProposal(getInitId(), + getInitLastLoggedZxid(), + getPeerEpoch()); + } + sendNotifications(); + } else if (n.electionEpoch < logicalclock) { + if(LOG.isDebugEnabled()){ + LOG.debug("Notification election epoch is smaller than logicalclock. n.electionEpoch = 0x" + + Long.toHexString(n.electionEpoch) + + ", logicalclock=0x" + Long.toHexString(logicalclock)); + } + break; + } else if (totalOrderPredicate(n.leader, n.zxid, n.peerEpoch, + proposedLeader, proposedZxid, proposedEpoch)) { + updateProposal(n.leader, n.zxid, n.peerEpoch); + sendNotifications(); + } + + if(LOG.isDebugEnabled()){ + LOG.debug("Adding vote: from=" + n.sid + + ", proposed leader=" + n.leader + + ", proposed zxid=0x" + Long.toHexString(n.zxid) + + ", proposed election epoch=0x" + Long.toHexString(n.electionEpoch)); + } + + recvset.put(n.sid, new Vote(n.leader, n.zxid, n.electionEpoch, n.peerEpoch)); + + if (termPredicate(recvset, + new Vote(proposedLeader, proposedZxid, + logicalclock, proposedEpoch))) { + + // Verify if there is any change in the proposed leader + while((n = recvqueue.poll(finalizeWait, + TimeUnit.MILLISECONDS)) != null){ + if(totalOrderPredicate(n.leader, n.zxid, n.peerEpoch, + proposedLeader, proposedZxid, proposedEpoch)){ + recvqueue.put(n); + break; + } + } + + /* + * This predicate is true once we don't read any new + * relevant message from the reception queue + */ + if (n == null) { + self.setPeerState((proposedLeader == self.getId()) ? + ServerState.LEADING: learningState()); + + Vote endVote = new Vote(proposedLeader, + proposedZxid, + logicalclock, + proposedEpoch); + leaveInstance(endVote); + return endVote; + } + } + break; + case OBSERVING: + LOG.debug("Notification from observer: " + n.sid); + break; + case FOLLOWING: + case LEADING: + /* + * Consider all notifications from the same epoch + * together. + */ + if(n.electionEpoch == logicalclock){ + recvset.put(n.sid, new Vote(n.leader, + n.zxid, + n.electionEpoch, + n.peerEpoch)); + + if(ooePredicate(recvset, outofelection, n)) { + self.setPeerState((n.leader == self.getId()) ? + ServerState.LEADING: learningState()); + + Vote endVote = new Vote(n.leader, + n.zxid, + n.electionEpoch, + n.peerEpoch); + leaveInstance(endVote); + return endVote; + } + } + + /* + * Before joining an established ensemble, verify + * a majority is following the same leader. + */ + outofelection.put(n.sid, new Vote(n.version, + n.leader, + n.zxid, + n.electionEpoch, + n.peerEpoch, + n.state)); + + if(ooePredicate(outofelection, outofelection, n)) { + synchronized(this){ + logicalclock = n.electionEpoch; + self.setPeerState((n.leader == self.getId()) ? + ServerState.LEADING: learningState()); + } + Vote endVote = new Vote(n.leader, + n.zxid, + n.electionEpoch, + n.peerEpoch); + leaveInstance(endVote); + return endVote; + } + break; + default: + LOG.warn("Notification state unrecognized: {} (n.state), {} (n.sid)", + n.state, n.sid); + break; + } + } else { + LOG.warn("Ignoring notification from non-cluster member " + n.sid); + } + } + return null; + } finally { + try { + if(self.jmxLeaderElectionBean != null){ + MBeanRegistry.getInstance().unregister( + self.jmxLeaderElectionBean); + } + } catch (Exception e) { + LOG.warn("Failed to unregister with JMX", e); + } + self.jmxLeaderElectionBean = null; + } + } +} diff --git a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/quorum/Follower.java b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/quorum/Follower.java new file mode 100644 index 000000000..ab3f288ed --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/quorum/Follower.java @@ -0,0 +1,169 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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. + */ + +package org.apache.zookeeper.server.quorum; + +import java.io.ByteArrayInputStream; +import java.io.IOException; +import java.net.InetSocketAddress; + +import org.apache.jute.BinaryInputArchive; +import org.apache.jute.Record; +import org.apache.zookeeper.server.util.SerializeUtils; +import org.apache.zookeeper.server.util.ZxidUtils; +import org.apache.zookeeper.txn.TxnHeader; + +/** + * This class has the control logic for the Follower. + */ +public class Follower extends Learner{ + + private long lastQueued; + // This is the same object as this.zk, but we cache the downcast op + final FollowerZooKeeperServer fzk; + + Follower(QuorumPeer self,FollowerZooKeeperServer zk) { + this.self = self; + this.zk=zk; + this.fzk = zk; + } + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(); + sb.append("Follower ").append(sock); + sb.append(" lastQueuedZxid:").append(lastQueued); + sb.append(" pendingRevalidationCount:") + .append(pendingRevalidations.size()); + return sb.toString(); + } + + /** + * the main method called by the follower to follow the leader + * + * @throws InterruptedException + */ + void followLeader() throws InterruptedException { + self.end_fle = System.currentTimeMillis(); + LOG.info("FOLLOWING - LEADER ELECTION TOOK - " + + (self.end_fle - self.start_fle)); + self.start_fle = 0; + self.end_fle = 0; + fzk.registerJMX(new FollowerBean(this, zk), self.jmxLocalPeerBean); + try { + InetSocketAddress addr = findLeader(); + try { + connectToLeader(addr); + long newEpochZxid = registerWithLeader(Leader.FOLLOWERINFO); + + //check to see if the leader zxid is lower than ours + //this should never happen but is just a safety check + long newEpoch = ZxidUtils.getEpochFromZxid(newEpochZxid); + if (newEpoch < self.getAcceptedEpoch()) { + LOG.error("Proposed leader epoch " + ZxidUtils.zxidToString(newEpochZxid) + + " is less than our accepted epoch " + ZxidUtils.zxidToString(self.getAcceptedEpoch())); + throw new IOException("Error: Epoch of leader is lower"); + } + syncWithLeader(newEpochZxid); + QuorumPacket qp = new QuorumPacket(); + while (self.isRunning()) { + readPacket(qp); + processPacket(qp); + } + } catch (IOException e) { + LOG.warn("Exception when following the leader", e); + try { + sock.close(); + } catch (IOException e1) { + e1.printStackTrace(); + } + + // clear pending revalidations + pendingRevalidations.clear(); + } + } finally { + zk.unregisterJMX((Learner)this); + } + } + + /** + * Examine the packet received in qp and dispatch based on its contents. + * @param qp + * @throws IOException + */ + protected void processPacket(QuorumPacket qp) throws IOException{ + switch (qp.getType()) { + case Leader.PING: + ping(qp); + break; + case Leader.PROPOSAL: + TxnHeader hdr = new TxnHeader(); + Record txn = SerializeUtils.deserializeTxn(qp.getData(), hdr); + if (hdr.getZxid() != lastQueued + 1) { + LOG.warn("Got zxid 0x" + + Long.toHexString(hdr.getZxid()) + + " expected 0x" + + Long.toHexString(lastQueued + 1)); + } + lastQueued = hdr.getZxid(); + fzk.logRequest(hdr, txn); + break; + case Leader.COMMIT: + fzk.commit(qp.getZxid()); + break; + case Leader.UPTODATE: + LOG.error("Received an UPTODATE message after Follower started"); + break; + case Leader.REVALIDATE: + revalidate(qp); + break; + case Leader.SYNC: + fzk.sync(); + break; + } + } + + /** + * The zxid of the last operation seen + * @return zxid + */ + public long getZxid() { + try { + synchronized (fzk) { + return fzk.getZxid(); + } + } catch (NullPointerException e) { + LOG.warn("error getting zxid", e); + } + return -1; + } + + /** + * The zxid of the last operation queued + * @return zxid + */ + protected long getLastQueued() { + return lastQueued; + } + + @Override + public void shutdown() { + LOG.info("shutdown called", new Exception("shutdown Follower")); + super.shutdown(); + } +} diff --git a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/quorum/FollowerBean.java b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/quorum/FollowerBean.java new file mode 100644 index 000000000..fd31fa2b6 --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/quorum/FollowerBean.java @@ -0,0 +1,50 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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. + */ + +package org.apache.zookeeper.server.quorum; + +import org.apache.zookeeper.server.ZooKeeperServer; +import org.apache.zookeeper.server.ZooKeeperServerBean; + +/** + * Follower MBean inteface implementation + */ +public class FollowerBean extends ZooKeeperServerBean implements FollowerMXBean { + private final Follower follower; + + public FollowerBean(Follower follower, ZooKeeperServer zks) { + super(zks); + this.follower = follower; + } + + public String getName() { + return "Follower"; + } + + public String getQuorumAddress() { + return follower.sock.toString(); + } + + public String getLastQueuedZxid() { + return "0x" + Long.toHexString(follower.getLastQueued()); + } + + public int getPendingRevalidationCount() { + return follower.getPendingRevalidationsCount(); + } +} diff --git a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/quorum/FollowerMXBean.java b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/quorum/FollowerMXBean.java new file mode 100644 index 000000000..ded0e1ca0 --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/quorum/FollowerMXBean.java @@ -0,0 +1,41 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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. + */ + +package org.apache.zookeeper.server.quorum; + +import org.apache.zookeeper.server.ZooKeeperServerMXBean; + +/** + * Follower MBean + */ +public interface FollowerMXBean extends ZooKeeperServerMXBean { + /** + * @return socket address + */ + public String getQuorumAddress(); + + /** + * @return last queued zxid + */ + public String getLastQueuedZxid(); + + /** + * @return count of pending revalidations + */ + public int getPendingRevalidationCount(); +} diff --git a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/quorum/FollowerRequestProcessor.java b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/quorum/FollowerRequestProcessor.java new file mode 100644 index 000000000..a1c8ce23d --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/quorum/FollowerRequestProcessor.java @@ -0,0 +1,112 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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. + */ + +package org.apache.zookeeper.server.quorum; + +import java.util.concurrent.LinkedBlockingQueue; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import org.apache.zookeeper.ZooDefs.OpCode; +import org.apache.zookeeper.server.RequestProcessor; +import org.apache.zookeeper.server.Request; +import org.apache.zookeeper.server.ZooTrace; + +/** + * This RequestProcessor forwards any requests that modify the state of the + * system to the Leader. + */ +public class FollowerRequestProcessor extends Thread implements + RequestProcessor { + private static final Logger LOG = LoggerFactory.getLogger(FollowerRequestProcessor.class); + + FollowerZooKeeperServer zks; + + RequestProcessor nextProcessor; + + LinkedBlockingQueue queuedRequests = new LinkedBlockingQueue(); + + boolean finished = false; + + public FollowerRequestProcessor(FollowerZooKeeperServer zks, + RequestProcessor nextProcessor) { + super("FollowerRequestProcessor:" + zks.getServerId()); + this.zks = zks; + this.nextProcessor = nextProcessor; + } + + @Override + public void run() { + try { + while (!finished) { + Request request = queuedRequests.take(); + if (LOG.isTraceEnabled()) { + ZooTrace.logRequest(LOG, ZooTrace.CLIENT_REQUEST_TRACE_MASK, + 'F', request, ""); + } + if (request == Request.requestOfDeath) { + break; + } + // We want to queue the request to be processed before we submit + // the request to the leader so that we are ready to receive + // the response + nextProcessor.processRequest(request); + + // We now ship the request to the leader. As with all + // other quorum operations, sync also follows this code + // path, but different from others, we need to keep track + // of the sync operations this follower has pending, so we + // add it to pendingSyncs. + switch (request.type) { + case OpCode.sync: + zks.pendingSyncs.add(request); + zks.getFollower().request(request); + break; + case OpCode.create: + case OpCode.delete: + case OpCode.setData: + case OpCode.setACL: + case OpCode.createSession: + case OpCode.closeSession: + case OpCode.multi: + zks.getFollower().request(request); + break; + } + } + } catch (Exception e) { + LOG.error("Unexpected exception causing exit", e); + } + LOG.info("FollowerRequestProcessor exited loop!"); + } + + public void processRequest(Request request) { + if (!finished) { + queuedRequests.add(request); + } + } + + public void shutdown() { + LOG.info("Shutting down"); + finished = true; + queuedRequests.clear(); + queuedRequests.add(Request.requestOfDeath); + nextProcessor.shutdown(); + } + +} diff --git a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/quorum/FollowerZooKeeperServer.java b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/quorum/FollowerZooKeeperServer.java new file mode 100644 index 000000000..95c77b5c8 --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/quorum/FollowerZooKeeperServer.java @@ -0,0 +1,164 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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. + */ + +package org.apache.zookeeper.server.quorum; + +import java.io.IOException; +import java.util.concurrent.ConcurrentLinkedQueue; +import java.util.concurrent.LinkedBlockingQueue; + +import org.apache.jute.Record; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.apache.zookeeper.server.FinalRequestProcessor; +import org.apache.zookeeper.server.Request; +import org.apache.zookeeper.server.RequestProcessor; +import org.apache.zookeeper.server.SyncRequestProcessor; +import org.apache.zookeeper.server.ZKDatabase; +import org.apache.zookeeper.server.persistence.FileTxnSnapLog; +import org.apache.zookeeper.txn.TxnHeader; + +/** + * Just like the standard ZooKeeperServer. We just replace the request + * processors: FollowerRequestProcessor -> CommitProcessor -> + * FinalRequestProcessor + * + * A SyncRequestProcessor is also spawned off to log proposals from the leader. + */ +public class FollowerZooKeeperServer extends LearnerZooKeeperServer { + private static final Logger LOG = + LoggerFactory.getLogger(FollowerZooKeeperServer.class); + + CommitProcessor commitProcessor; + + SyncRequestProcessor syncProcessor; + + /* + * Pending sync requests + */ + ConcurrentLinkedQueue pendingSyncs; + + /** + * @param port + * @param dataDir + * @throws IOException + */ + FollowerZooKeeperServer(FileTxnSnapLog logFactory,QuorumPeer self, + DataTreeBuilder treeBuilder, ZKDatabase zkDb) throws IOException { + super(logFactory, self.tickTime, self.minSessionTimeout, + self.maxSessionTimeout, treeBuilder, zkDb, self); + this.pendingSyncs = new ConcurrentLinkedQueue(); + } + + public Follower getFollower(){ + return self.follower; + } + + @Override + protected void setupRequestProcessors() { + RequestProcessor finalProcessor = new FinalRequestProcessor(this); + commitProcessor = new CommitProcessor(finalProcessor, + Long.toString(getServerId()), true); + commitProcessor.start(); + firstProcessor = new FollowerRequestProcessor(this, commitProcessor); + ((FollowerRequestProcessor) firstProcessor).start(); + syncProcessor = new SyncRequestProcessor(this, + new SendAckRequestProcessor((Learner)getFollower())); + syncProcessor.start(); + } + + LinkedBlockingQueue pendingTxns = new LinkedBlockingQueue(); + + public void logRequest(TxnHeader hdr, Record txn) { + Request request = new Request(null, hdr.getClientId(), hdr.getCxid(), + hdr.getType(), null, null); + request.hdr = hdr; + request.txn = txn; + request.zxid = hdr.getZxid(); + if ((request.zxid & 0xffffffffL) != 0) { + pendingTxns.add(request); + } + syncProcessor.processRequest(request); + } + + /** + * When a COMMIT message is received, eventually this method is called, + * which matches up the zxid from the COMMIT with (hopefully) the head of + * the pendingTxns queue and hands it to the commitProcessor to commit. + * @param zxid - must correspond to the head of pendingTxns if it exists + */ + public void commit(long zxid) { + if (pendingTxns.size() == 0) { + LOG.warn("Committing " + Long.toHexString(zxid) + + " without seeing txn"); + return; + } + long firstElementZxid = pendingTxns.element().zxid; + if (firstElementZxid != zxid) { + LOG.error("Committing zxid 0x" + Long.toHexString(zxid) + + " but next pending txn 0x" + + Long.toHexString(firstElementZxid)); + System.exit(12); + } + Request request = pendingTxns.remove(); + commitProcessor.commit(request); + } + + synchronized public void sync(){ + if(pendingSyncs.size() ==0){ + LOG.warn("Not expecting a sync."); + return; + } + + Request r = pendingSyncs.remove(); + commitProcessor.commit(r); + } + + @Override + public int getGlobalOutstandingLimit() { + return super.getGlobalOutstandingLimit() / (self.getQuorumSize() - 1); + } + + @Override + public void shutdown() { + LOG.info("Shutting down"); + try { + super.shutdown(); + } catch (Exception e) { + LOG.warn("Ignoring unexpected exception during shutdown", e); + } + try { + if (syncProcessor != null) { + syncProcessor.shutdown(); + } + } catch (Exception e) { + LOG.warn("Ignoring unexpected exception in syncprocessor shutdown", + e); + } + } + + @Override + public String getState() { + return "follower"; + } + + @Override + public Learner getLearner() { + return getFollower(); + } +} diff --git a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/quorum/Leader.java b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/quorum/Leader.java new file mode 100644 index 000000000..dd11a91dc --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/quorum/Leader.java @@ -0,0 +1,1055 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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. + */ + +package org.apache.zookeeper.server.quorum; + +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.net.BindException; +import java.net.InetSocketAddress; +import java.net.ServerSocket; +import java.net.Socket; +import java.net.SocketAddress; +import java.net.SocketException; +import java.util.ArrayList; +import java.util.Collections; +import java.util.HashMap; +import java.util.HashSet; +import java.util.Iterator; +import java.util.List; +import java.util.Set; +import java.util.concurrent.atomic.AtomicLong; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.ConcurrentLinkedQueue; +import java.util.concurrent.ConcurrentMap; + +import org.apache.jute.BinaryOutputArchive; +import org.apache.zookeeper.server.ZooKeeperServer; +import org.apache.zookeeper.server.FinalRequestProcessor; +import org.apache.zookeeper.server.Request; +import org.apache.zookeeper.server.RequestProcessor; +import org.apache.zookeeper.server.quorum.QuorumPeer.LearnerType; +import org.apache.zookeeper.server.quorum.flexible.QuorumVerifier; +import org.apache.zookeeper.server.util.ZxidUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * This class has the control logic for the Leader. + */ +public class Leader { + private static final Logger LOG = LoggerFactory.getLogger(Leader.class); + + static final private boolean nodelay = System.getProperty("leader.nodelay", "true").equals("true"); + static { + LOG.info("TCP NoDelay set to: " + nodelay); + } + + static public class Proposal { + public QuorumPacket packet; + + public HashSet ackSet = new HashSet(); + + public Request request; + + @Override + public String toString() { + return packet.getType() + ", " + packet.getZxid() + ", " + request; + } + } + + final LeaderZooKeeperServer zk; + + final QuorumPeer self; + + private boolean quorumFormed = false; + + // the follower acceptor thread + LearnerCnxAcceptor cnxAcceptor; + + // list of all the followers + private final HashSet learners = + new HashSet(); + + /** + * Returns a copy of the current learner snapshot + */ + public List getLearners() { + synchronized (learners) { + return new ArrayList(learners); + } + } + + // list of followers that are ready to follow (i.e synced with the leader) + private final HashSet forwardingFollowers = + new HashSet(); + + /** + * Returns a copy of the current forwarding follower snapshot + */ + public List getForwardingFollowers() { + synchronized (forwardingFollowers) { + return new ArrayList(forwardingFollowers); + } + } + + private void addForwardingFollower(LearnerHandler lh) { + synchronized (forwardingFollowers) { + forwardingFollowers.add(lh); + } + } + + private final HashSet observingLearners = + new HashSet(); + + /** + * Returns a copy of the current observer snapshot + */ + public List getObservingLearners() { + synchronized (observingLearners) { + return new ArrayList(observingLearners); + } + } + + private void addObserverLearnerHandler(LearnerHandler lh) { + synchronized (observingLearners) { + observingLearners.add(lh); + } + } + + // Pending sync requests. Must access under 'this' lock. + private final HashMap> pendingSyncs = + new HashMap>(); + + synchronized public int getNumPendingSyncs() { + return pendingSyncs.size(); + } + + //Follower counter + final AtomicLong followerCounter = new AtomicLong(-1); + + /** + * Adds peer to the leader. + * + * @param learner + * instance of learner handle + */ + void addLearnerHandler(LearnerHandler learner) { + synchronized (learners) { + learners.add(learner); + } + } + + /** + * Remove the learner from the learner list + * + * @param peer + */ + void removeLearnerHandler(LearnerHandler peer) { + synchronized (forwardingFollowers) { + forwardingFollowers.remove(peer); + } + synchronized (learners) { + learners.remove(peer); + } + synchronized (observingLearners) { + observingLearners.remove(peer); + } + } + + boolean isLearnerSynced(LearnerHandler peer){ + synchronized (forwardingFollowers) { + return forwardingFollowers.contains(peer); + } + } + + ServerSocket ss; + + Leader(QuorumPeer self,LeaderZooKeeperServer zk) throws IOException { + this.self = self; + try { + if (self.getQuorumListenOnAllIPs()) { + ss = new ServerSocket(self.getQuorumAddress().getPort()); + } else { + ss = new ServerSocket(); + } + ss.setReuseAddress(true); + if (!self.getQuorumListenOnAllIPs()) { + ss.bind(self.getQuorumAddress()); + } + } catch (BindException e) { + if (self.getQuorumListenOnAllIPs()) { + LOG.error("Couldn't bind to port " + self.getQuorumAddress().getPort(), e); + } else { + LOG.error("Couldn't bind to " + self.getQuorumAddress(), e); + } + throw e; + } + this.zk=zk; + } + + /** + * This message is for follower to expect diff + */ + final static int DIFF = 13; + + /** + * This is for follower to truncate its logs + */ + final static int TRUNC = 14; + + /** + * This is for follower to download the snapshots + */ + final static int SNAP = 15; + + /** + * This tells the leader that the connecting peer is actually an observer + */ + final static int OBSERVERINFO = 16; + + /** + * This message type is sent by the leader to indicate it's zxid and if + * needed, its database. + */ + final static int NEWLEADER = 10; + + /** + * This message type is sent by a follower to pass the last zxid. This is here + * for backward compatibility purposes. + */ + final static int FOLLOWERINFO = 11; + + /** + * This message type is sent by the leader to indicate that the follower is + * now uptodate andt can start responding to clients. + */ + final static int UPTODATE = 12; + + /** + * This message is the first that a follower receives from the leader. + * It has the protocol version and the epoch of the leader. + */ + public static final int LEADERINFO = 17; + + /** + * This message is used by the follow to ack a proposed epoch. + */ + public static final int ACKEPOCH = 18; + + /** + * This message type is sent to a leader to request and mutation operation. + * The payload will consist of a request header followed by a request. + */ + final static int REQUEST = 1; + + /** + * This message type is sent by a leader to propose a mutation. + */ + public final static int PROPOSAL = 2; + + /** + * This message type is sent by a follower after it has synced a proposal. + */ + final static int ACK = 3; + + /** + * This message type is sent by a leader to commit a proposal and cause + * followers to start serving the corresponding data. + */ + final static int COMMIT = 4; + + /** + * This message type is enchanged between follower and leader (initiated by + * follower) to determine liveliness. + */ + final static int PING = 5; + + /** + * This message type is to validate a session that should be active. + */ + final static int REVALIDATE = 6; + + /** + * This message is a reply to a synchronize command flushing the pipe + * between the leader and the follower. + */ + final static int SYNC = 7; + + /** + * This message type informs observers of a committed proposal. + */ + final static int INFORM = 8; + + ConcurrentMap outstandingProposals = new ConcurrentHashMap(); + + ConcurrentLinkedQueue toBeApplied = new ConcurrentLinkedQueue(); + + Proposal newLeaderProposal = new Proposal(); + + class LearnerCnxAcceptor extends Thread{ + private volatile boolean stop = false; + + @Override + public void run() { + try { + while (!stop) { + try{ + Socket s = ss.accept(); + // start with the initLimit, once the ack is processed + // in LearnerHandler switch to the syncLimit + s.setSoTimeout(self.tickTime * self.initLimit); + s.setTcpNoDelay(nodelay); + LearnerHandler fh = new LearnerHandler(s, Leader.this); + fh.start(); + } catch (SocketException e) { + if (stop) { + LOG.info("exception while shutting down acceptor: " + + e); + + // When Leader.shutdown() calls ss.close(), + // the call to accept throws an exception. + // We catch and set stop to true. + stop = true; + } else { + throw e; + } + } + } + } catch (Exception e) { + LOG.warn("Exception while accepting follower", e); + } + } + + public void halt() { + stop = true; + } + } + + StateSummary leaderStateSummary; + + long epoch = -1; + boolean waitingForNewEpoch = true; + volatile boolean readyToStart = false; + + /** + * This method is main function that is called to lead + * + * @throws IOException + * @throws InterruptedException + */ + void lead() throws IOException, InterruptedException { + self.end_fle = System.currentTimeMillis(); + LOG.info("LEADING - LEADER ELECTION TOOK - " + + (self.end_fle - self.start_fle)); + self.start_fle = 0; + self.end_fle = 0; + + zk.registerJMX(new LeaderBean(this, zk), self.jmxLocalPeerBean); + + try { + self.tick = 0; + zk.loadData(); + + leaderStateSummary = new StateSummary(self.getCurrentEpoch(), zk.getLastProcessedZxid()); + + // Start thread that waits for connection requests from + // new followers. + cnxAcceptor = new LearnerCnxAcceptor(); + cnxAcceptor.start(); + + readyToStart = true; + long epoch = getEpochToPropose(self.getId(), self.getAcceptedEpoch()); + + zk.setZxid(ZxidUtils.makeZxid(epoch, 0)); + + synchronized(this){ + lastProposed = zk.getZxid(); + } + + newLeaderProposal.packet = new QuorumPacket(NEWLEADER, zk.getZxid(), + null, null); + + + if ((newLeaderProposal.packet.getZxid() & 0xffffffffL) != 0) { + LOG.info("NEWLEADER proposal has Zxid of " + + Long.toHexString(newLeaderProposal.packet.getZxid())); + } + + waitForEpochAck(self.getId(), leaderStateSummary); + self.setCurrentEpoch(epoch); + + // We have to get at least a majority of servers in sync with + // us. We do this by waiting for the NEWLEADER packet to get + // acknowledged + try { + waitForNewLeaderAck(self.getId(), zk.getZxid(), LearnerType.PARTICIPANT); + } catch (InterruptedException e) { + shutdown("Waiting for a quorum of followers, only synced with sids: [ " + + getSidSetString(newLeaderProposal.ackSet) + " ]"); + HashSet followerSet = new HashSet(); + for (LearnerHandler f : learners) + followerSet.add(f.getSid()); + + if (self.getQuorumVerifier().containsQuorum(followerSet)) { + LOG.warn("Enough followers present. " + + "Perhaps the initTicks need to be increased."); + } + Thread.sleep(self.tickTime); + self.tick++; + return; + } + + startZkServer(); + + /** + * WARNING: do not use this for anything other than QA testing + * on a real cluster. Specifically to enable verification that quorum + * can handle the lower 32bit roll-over issue identified in + * ZOOKEEPER-1277. Without this option it would take a very long + * time (on order of a month say) to see the 4 billion writes + * necessary to cause the roll-over to occur. + * + * This field allows you to override the zxid of the server. Typically + * you'll want to set it to something like 0xfffffff0 and then + * start the quorum, run some operations and see the re-election. + */ + String initialZxid = System.getProperty("zookeeper.testingonly.initialZxid"); + if (initialZxid != null) { + long zxid = Long.parseLong(initialZxid); + zk.setZxid((zk.getZxid() & 0xffffffff00000000L) | zxid); + } + + if (!System.getProperty("zookeeper.leaderServes", "yes").equals("no")) { + self.cnxnFactory.setZooKeeperServer(zk); + } + // Everything is a go, simply start counting the ticks + // WARNING: I couldn't find any wait statement on a synchronized + // block that would be notified by this notifyAll() call, so + // I commented it out + //synchronized (this) { + // notifyAll(); + //} + // We ping twice a tick, so we only update the tick every other + // iteration + boolean tickSkip = true; + + while (true) { + Thread.sleep(self.tickTime / 2); + if (!tickSkip) { + self.tick++; + } + HashSet syncedSet = new HashSet(); + + // lock on the followers when we use it. + syncedSet.add(self.getId()); + + for (LearnerHandler f : getLearners()) { + // Synced set is used to check we have a supporting quorum, so only + // PARTICIPANT, not OBSERVER, learners should be used + if (f.synced() && f.getLearnerType() == LearnerType.PARTICIPANT) { + syncedSet.add(f.getSid()); + } + f.ping(); + } + + if (!tickSkip && !self.getQuorumVerifier().containsQuorum(syncedSet)) { + //if (!tickSkip && syncedCount < self.quorumPeers.size() / 2) { + // Lost quorum, shutdown + shutdown("Not sufficient followers synced, only synced with sids: [ " + + getSidSetString(syncedSet) + " ]"); + // make sure the order is the same! + // the leader goes to looking + return; + } + tickSkip = !tickSkip; + } + } finally { + zk.unregisterJMX(this); + } + } + + boolean isShutdown; + + /** + * Close down all the LearnerHandlers + */ + void shutdown(String reason) { + LOG.info("Shutting down"); + + if (isShutdown) { + return; + } + + LOG.info("Shutdown called", + new Exception("shutdown Leader! reason: " + reason)); + + if (cnxAcceptor != null) { + cnxAcceptor.halt(); + } + + // NIO should not accept conenctions + self.cnxnFactory.setZooKeeperServer(null); + try { + ss.close(); + } catch (IOException e) { + LOG.warn("Ignoring unexpected exception during close",e); + } + // clear all the connections + self.cnxnFactory.closeAll(); + // shutdown the previous zk + if (zk != null) { + zk.shutdown(); + } + synchronized (learners) { + for (Iterator it = learners.iterator(); it + .hasNext();) { + LearnerHandler f = it.next(); + it.remove(); + f.shutdown(); + } + } + isShutdown = true; + } + + /** + * Keep a count of acks that are received by the leader for a particular + * proposal + * + * @param zxid + * the zxid of the proposal sent out + * @param followerAddr + */ + synchronized public void processAck(long sid, long zxid, SocketAddress followerAddr) { + if (LOG.isTraceEnabled()) { + LOG.trace("Ack zxid: 0x{}", Long.toHexString(zxid)); + for (Proposal p : outstandingProposals.values()) { + long packetZxid = p.packet.getZxid(); + LOG.trace("outstanding proposal: 0x{}", + Long.toHexString(packetZxid)); + } + LOG.trace("outstanding proposals all"); + } + + if ((zxid & 0xffffffffL) == 0) { + /* + * We no longer process NEWLEADER ack by this method. However, + * the learner sends ack back to the leader after it gets UPTODATE + * so we just ignore the message. + */ + return; + } + + if (outstandingProposals.size() == 0) { + if (LOG.isDebugEnabled()) { + LOG.debug("outstanding is 0"); + } + return; + } + if (lastCommitted >= zxid) { + if (LOG.isDebugEnabled()) { + LOG.debug("proposal has already been committed, pzxid: 0x{} zxid: 0x{}", + Long.toHexString(lastCommitted), Long.toHexString(zxid)); + } + // The proposal has already been committed + return; + } + Proposal p = outstandingProposals.get(zxid); + if (p == null) { + LOG.warn("Trying to commit future proposal: zxid 0x{} from {}", + Long.toHexString(zxid), followerAddr); + return; + } + + p.ackSet.add(sid); + if (LOG.isDebugEnabled()) { + LOG.debug("Count for zxid: 0x{} is {}", + Long.toHexString(zxid), p.ackSet.size()); + } + if (self.getQuorumVerifier().containsQuorum(p.ackSet)){ + if (zxid != lastCommitted+1) { + LOG.warn("Commiting zxid 0x{} from {} not first!", + Long.toHexString(zxid), followerAddr); + LOG.warn("First is 0x{}", Long.toHexString(lastCommitted + 1)); + } + outstandingProposals.remove(zxid); + if (p.request != null) { + toBeApplied.add(p); + } + + if (p.request == null) { + LOG.warn("Going to commmit null request for proposal: {}", p); + } + commit(zxid); + inform(p); + zk.commitProcessor.commit(p.request); + if(pendingSyncs.containsKey(zxid)){ + for(LearnerSyncRequest r: pendingSyncs.remove(zxid)) { + sendSync(r); + } + } + } + } + + static class ToBeAppliedRequestProcessor implements RequestProcessor { + private RequestProcessor next; + + private ConcurrentLinkedQueue toBeApplied; + + /** + * This request processor simply maintains the toBeApplied list. For + * this to work next must be a FinalRequestProcessor and + * FinalRequestProcessor.processRequest MUST process the request + * synchronously! + * + * @param next + * a reference to the FinalRequestProcessor + */ + ToBeAppliedRequestProcessor(RequestProcessor next, + ConcurrentLinkedQueue toBeApplied) { + if (!(next instanceof FinalRequestProcessor)) { + throw new RuntimeException(ToBeAppliedRequestProcessor.class + .getName() + + " must be connected to " + + FinalRequestProcessor.class.getName() + + " not " + + next.getClass().getName()); + } + this.toBeApplied = toBeApplied; + this.next = next; + } + + /* + * (non-Javadoc) + * + * @see org.apache.zookeeper.server.RequestProcessor#processRequest(org.apache.zookeeper.server.Request) + */ + public void processRequest(Request request) throws RequestProcessorException { + // request.addRQRec(">tobe"); + next.processRequest(request); + Proposal p = toBeApplied.peek(); + if (p != null && p.request != null + && p.request.zxid == request.zxid) { + toBeApplied.remove(); + } + } + + /* + * (non-Javadoc) + * + * @see org.apache.zookeeper.server.RequestProcessor#shutdown() + */ + public void shutdown() { + LOG.info("Shutting down"); + next.shutdown(); + } + } + + /** + * send a packet to all the followers ready to follow + * + * @param qp + * the packet to be sent + */ + void sendPacket(QuorumPacket qp) { + synchronized (forwardingFollowers) { + for (LearnerHandler f : forwardingFollowers) { + f.queuePacket(qp); + } + } + } + + /** + * send a packet to all observers + */ + void sendObserverPacket(QuorumPacket qp) { + for (LearnerHandler f : getObservingLearners()) { + f.queuePacket(qp); + } + } + + long lastCommitted = -1; + + /** + * Create a commit packet and send it to all the members of the quorum + * + * @param zxid + */ + public void commit(long zxid) { + synchronized(this){ + lastCommitted = zxid; + } + QuorumPacket qp = new QuorumPacket(Leader.COMMIT, zxid, null, null); + sendPacket(qp); + } + + /** + * Create an inform packet and send it to all observers. + * @param zxid + * @param proposal + */ + public void inform(Proposal proposal) { + QuorumPacket qp = new QuorumPacket(Leader.INFORM, proposal.request.zxid, + proposal.packet.getData(), null); + sendObserverPacket(qp); + } + + long lastProposed; + + + /** + * Returns the current epoch of the leader. + * + * @return + */ + public long getEpoch(){ + return ZxidUtils.getEpochFromZxid(lastProposed); + } + + @SuppressWarnings("serial") + public static class XidRolloverException extends Exception { + public XidRolloverException(String message) { + super(message); + } + } + + /** + * create a proposal and send it out to all the members + * + * @param request + * @return the proposal that is queued to send to all the members + */ + public Proposal propose(Request request) throws XidRolloverException { + /** + * Address the rollover issue. All lower 32bits set indicate a new leader + * election. Force a re-election instead. See ZOOKEEPER-1277 + */ + if ((request.zxid & 0xffffffffL) == 0xffffffffL) { + String msg = + "zxid lower 32 bits have rolled over, forcing re-election, and therefore new epoch start"; + shutdown(msg); + throw new XidRolloverException(msg); + } + + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + BinaryOutputArchive boa = BinaryOutputArchive.getArchive(baos); + try { + request.hdr.serialize(boa, "hdr"); + if (request.txn != null) { + request.txn.serialize(boa, "txn"); + } + baos.close(); + } catch (IOException e) { + LOG.warn("This really should be impossible", e); + } + QuorumPacket pp = new QuorumPacket(Leader.PROPOSAL, request.zxid, + baos.toByteArray(), null); + + Proposal p = new Proposal(); + p.packet = pp; + p.request = request; + synchronized (this) { + if (LOG.isDebugEnabled()) { + LOG.debug("Proposing:: " + request); + } + + lastProposed = p.packet.getZxid(); + outstandingProposals.put(lastProposed, p); + sendPacket(pp); + } + return p; + } + + /** + * Process sync requests + * + * @param r the request + */ + + synchronized public void processSync(LearnerSyncRequest r){ + if(outstandingProposals.isEmpty()){ + sendSync(r); + } else { + List l = pendingSyncs.get(lastProposed); + if (l == null) { + l = new ArrayList(); + } + l.add(r); + pendingSyncs.put(lastProposed, l); + } + } + + /** + * Sends a sync message to the appropriate server + * + * @param f + * @param r + */ + + public void sendSync(LearnerSyncRequest r){ + QuorumPacket qp = new QuorumPacket(Leader.SYNC, 0, null, null); + r.fh.queuePacket(qp); + } + + /** + * lets the leader know that a follower is capable of following and is done + * syncing + * + * @param handler handler of the follower + * @return last proposed zxid + */ + synchronized public long startForwarding(LearnerHandler handler, + long lastSeenZxid) { + // Queue up any outstanding requests enabling the receipt of + // new requests + if (lastProposed > lastSeenZxid) { + for (Proposal p : toBeApplied) { + if (p.packet.getZxid() <= lastSeenZxid) { + continue; + } + handler.queuePacket(p.packet); + // Since the proposal has been committed we need to send the + // commit message also + QuorumPacket qp = new QuorumPacket(Leader.COMMIT, p.packet + .getZxid(), null, null); + handler.queuePacket(qp); + } + // Only participant need to get outstanding proposals + if (handler.getLearnerType() == LearnerType.PARTICIPANT) { + Listzxids = new ArrayList(outstandingProposals.keySet()); + Collections.sort(zxids); + for (Long zxid: zxids) { + if (zxid <= lastSeenZxid) { + continue; + } + handler.queuePacket(outstandingProposals.get(zxid).packet); + } + } + } + if (handler.getLearnerType() == LearnerType.PARTICIPANT) { + addForwardingFollower(handler); + } else { + addObserverLearnerHandler(handler); + } + + return lastProposed; + } + + private HashSet connectingFollowers = new HashSet(); + public long getEpochToPropose(long sid, long lastAcceptedEpoch) throws InterruptedException, IOException { + synchronized(connectingFollowers) { + if (!waitingForNewEpoch) { + return epoch; + } + if (lastAcceptedEpoch >= epoch) { + epoch = lastAcceptedEpoch+1; + } + connectingFollowers.add(sid); + QuorumVerifier verifier = self.getQuorumVerifier(); + if (connectingFollowers.contains(self.getId()) && + verifier.containsQuorum(connectingFollowers)) { + waitingForNewEpoch = false; + self.setAcceptedEpoch(epoch); + connectingFollowers.notifyAll(); + } else { + long start = System.currentTimeMillis(); + long cur = start; + long end = start + self.getInitLimit()*self.getTickTime(); + while(waitingForNewEpoch && cur < end) { + connectingFollowers.wait(end - cur); + cur = System.currentTimeMillis(); + } + if (waitingForNewEpoch) { + throw new InterruptedException("Timeout while waiting for epoch from quorum"); + } + } + return epoch; + } + } + + private HashSet electingFollowers = new HashSet(); + private boolean electionFinished = false; + public void waitForEpochAck(long id, StateSummary ss) throws IOException, InterruptedException { + synchronized(electingFollowers) { + if (electionFinished) { + return; + } + if (ss.getCurrentEpoch() != -1) { + if (ss.isMoreRecentThan(leaderStateSummary)) { + throw new IOException("Follower is ahead of the leader, leader summary: " + + leaderStateSummary.getCurrentEpoch() + + " (current epoch), " + + leaderStateSummary.getLastZxid() + + " (last zxid)"); + } + electingFollowers.add(id); + } + QuorumVerifier verifier = self.getQuorumVerifier(); + if (electingFollowers.contains(self.getId()) && verifier.containsQuorum(electingFollowers)) { + electionFinished = true; + electingFollowers.notifyAll(); + } else { + long start = System.currentTimeMillis(); + long cur = start; + long end = start + self.getInitLimit()*self.getTickTime(); + while(!electionFinished && cur < end) { + electingFollowers.wait(end - cur); + cur = System.currentTimeMillis(); + } + if (!electionFinished) { + throw new InterruptedException("Timeout while waiting for epoch to be acked by quorum"); + } + } + } + } + + /** + * Return a list of sid in set as string + */ + private String getSidSetString(Set sidSet) { + StringBuilder sids = new StringBuilder(); + Iterator iter = sidSet.iterator(); + while (iter.hasNext()) { + sids.append(iter.next()); + if (!iter.hasNext()) { + break; + } + sids.append(","); + } + return sids.toString(); + } + + /** + * Start up Leader ZooKeeper server and initialize zxid to the new epoch + */ + private synchronized void startZkServer() { + // Update lastCommitted and Db's zxid to a value representing the new epoch + lastCommitted = zk.getZxid(); + LOG.info("Have quorum of supporters, sids: [ " + + getSidSetString(newLeaderProposal.ackSet) + + " ]; starting up and setting last processed zxid: 0x{}", + Long.toHexString(zk.getZxid())); + zk.startup(); + /* + * Update the election vote here to ensure that all members of the + * ensemble report the same vote to new servers that start up and + * send leader election notifications to the ensemble. + * + * @see https://issues.apache.org/jira/browse/ZOOKEEPER-1732 + */ + self.updateElectionVote(getEpoch()); + + zk.getZKDatabase().setlastProcessedZxid(zk.getZxid()); + } + + /** + * Process NEWLEADER ack of a given sid and wait until the leader receives + * sufficient acks. + * + * @param sid + * @param learnerType + * @throws InterruptedException + */ + public void waitForNewLeaderAck(long sid, long zxid, LearnerType learnerType) + throws InterruptedException { + + synchronized (newLeaderProposal.ackSet) { + + if (quorumFormed) { + return; + } + + long currentZxid = newLeaderProposal.packet.getZxid(); + if (zxid != currentZxid) { + LOG.error("NEWLEADER ACK from sid: " + sid + + " is from a different epoch - current 0x" + + Long.toHexString(currentZxid) + " receieved 0x" + + Long.toHexString(zxid)); + return; + } + + if (learnerType == LearnerType.PARTICIPANT) { + newLeaderProposal.ackSet.add(sid); + } + + if (self.getQuorumVerifier().containsQuorum( + newLeaderProposal.ackSet)) { + quorumFormed = true; + newLeaderProposal.ackSet.notifyAll(); + } else { + long start = System.currentTimeMillis(); + long cur = start; + long end = start + self.getInitLimit() * self.getTickTime(); + while (!quorumFormed && cur < end) { + newLeaderProposal.ackSet.wait(end - cur); + cur = System.currentTimeMillis(); + } + if (!quorumFormed) { + throw new InterruptedException( + "Timeout while waiting for NEWLEADER to be acked by quorum"); + } + } + } + } + + /** + * Get string representation of a given packet type + * @param packetType + * @return string representing the packet type + */ + public static String getPacketType(int packetType) { + switch (packetType) { + case DIFF: + return "DIFF"; + case TRUNC: + return "TRUNC"; + case SNAP: + return "SNAP"; + case OBSERVERINFO: + return "OBSERVERINFO"; + case NEWLEADER: + return "NEWLEADER"; + case FOLLOWERINFO: + return "FOLLOWERINFO"; + case UPTODATE: + return "UPTODATE"; + case LEADERINFO: + return "LEADERINFO"; + case ACKEPOCH: + return "ACKEPOCH"; + case REQUEST: + return "REQUEST"; + case PROPOSAL: + return "PROPOSAL"; + case ACK: + return "ACK"; + case COMMIT: + return "COMMIT"; + case PING: + return "PING"; + case REVALIDATE: + return "REVALIDATE"; + case SYNC: + return "SYNC"; + case INFORM: + return "INFORM"; + default: + return "UNKNOWN"; + } + } +} diff --git a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/quorum/LeaderBean.java b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/quorum/LeaderBean.java new file mode 100644 index 000000000..b5a3a10ec --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/quorum/LeaderBean.java @@ -0,0 +1,53 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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. + */ + +package org.apache.zookeeper.server.quorum; + +import org.apache.zookeeper.server.ZooKeeperServerBean; +import org.apache.zookeeper.server.ZooKeeperServer; +import org.apache.zookeeper.server.quorum.LearnerHandler; +import org.apache.zookeeper.server.quorum.Leader; + +/** + * Leader MBean interface implementation. + */ +public class LeaderBean extends ZooKeeperServerBean implements LeaderMXBean { + private final Leader leader; + + public LeaderBean(Leader leader, ZooKeeperServer zks) { + super(zks); + this.leader = leader; + } + + public String getName() { + return "Leader"; + } + + public String getCurrentZxid() { + return "0x" + Long.toHexString(zks.getZxid()); + } + + public String followerInfo() { + StringBuilder sb = new StringBuilder(); + for (LearnerHandler handler : leader.getLearners()) { + sb.append(handler.toString()).append("\n"); + } + return sb.toString(); + } + +} diff --git a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/quorum/LeaderElection.java b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/quorum/LeaderElection.java new file mode 100644 index 000000000..a66ee789e --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/quorum/LeaderElection.java @@ -0,0 +1,295 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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. + */ + +package org.apache.zookeeper.server.quorum; + +import java.io.IOException; +import java.net.DatagramPacket; +import java.net.DatagramSocket; +import java.net.InetSocketAddress; +import java.net.SocketException; +import java.nio.ByteBuffer; +import java.util.Collection; +import java.util.HashMap; +import java.util.HashSet; +import java.util.Iterator; +import java.util.Map; +import java.util.Random; +import java.util.Map.Entry; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import org.apache.zookeeper.jmx.MBeanRegistry; +import org.apache.zookeeper.server.quorum.Vote; +import org.apache.zookeeper.server.quorum.QuorumPeer.LearnerType; +import org.apache.zookeeper.server.quorum.QuorumPeer.QuorumServer; +import org.apache.zookeeper.server.quorum.QuorumPeer.ServerState; + +/** + * @deprecated This class has been deprecated as of release 3.4.0. + */ +@Deprecated +public class LeaderElection implements Election { + private static final Logger LOG = LoggerFactory.getLogger(LeaderElection.class); + protected static final Random epochGen = new Random(); + + protected QuorumPeer self; + + public LeaderElection(QuorumPeer self) { + this.self = self; + } + + protected static class ElectionResult { + public Vote vote; + + public int count; + + public Vote winner; + + public int winningCount; + + public int numValidVotes; + } + + protected ElectionResult countVotes(HashMap votes, HashSet heardFrom) { + final ElectionResult result = new ElectionResult(); + // Initialize with null vote + result.vote = new Vote(Long.MIN_VALUE, Long.MIN_VALUE); + result.winner = new Vote(Long.MIN_VALUE, Long.MIN_VALUE); + + // First, filter out votes from unheard-from machines. Then + // make the views consistent. Sometimes peers will have + // different zxids for a server depending on timing. + final HashMap validVotes = new HashMap(); + final Map maxZxids = new HashMap(); + for (Map.Entry e : votes.entrySet()) { + // Only include votes from machines that we heard from + final Vote v = e.getValue(); + if (heardFrom.contains(v.getId())) { + validVotes.put(e.getKey(), v); + Long val = maxZxids.get(v.getId()); + if (val == null || val < v.getZxid()) { + maxZxids.put(v.getId(), v.getZxid()); + } + } + } + + // Make all zxids for a given vote id equal to the largest zxid seen for + // that id + for (Map.Entry e : validVotes.entrySet()) { + final Vote v = e.getValue(); + Long zxid = maxZxids.get(v.getId()); + if (v.getZxid() < zxid) { + // This is safe inside an iterator as per + // http://download.oracle.com/javase/1.5.0/docs/api/java/util/Map.Entry.html + e.setValue(new Vote(v.getId(), zxid, v.getElectionEpoch(), v.getPeerEpoch(), v.getState())); + } + } + + result.numValidVotes = validVotes.size(); + + final HashMap countTable = new HashMap(); + // Now do the tally + for (Vote v : validVotes.values()) { + Integer count = countTable.get(v); + if (count == null) { + count = 0; + } + countTable.put(v, count + 1); + if (v.getId() == result.vote.getId()) { + result.count++; + } else if (v.getZxid() > result.vote.getZxid() + || (v.getZxid() == result.vote.getZxid() && v.getId() > result.vote.getId())) { + result.vote = v; + result.count = 1; + } + } + result.winningCount = 0; + LOG.info("Election tally: "); + for (Entry entry : countTable.entrySet()) { + if (entry.getValue() > result.winningCount) { + result.winningCount = entry.getValue(); + result.winner = entry.getKey(); + } + LOG.info(entry.getKey().getId() + "\t-> " + entry.getValue()); + } + return result; + } + + /** + * There is nothing to shutdown in this implementation of + * leader election, so we simply have an empty method. + */ + public void shutdown(){} + + /** + * Invoked in QuorumPeer to find or elect a new leader. + * + * @throws InterruptedException + */ + public Vote lookForLeader() throws InterruptedException { + try { + self.jmxLeaderElectionBean = new LeaderElectionBean(); + MBeanRegistry.getInstance().register( + self.jmxLeaderElectionBean, self.jmxLocalPeerBean); + } catch (Exception e) { + LOG.warn("Failed to register with JMX", e); + self.jmxLeaderElectionBean = null; + } + + try { + self.setCurrentVote(new Vote(self.getId(), + self.getLastLoggedZxid())); + // We are going to look for a leader by casting a vote for ourself + byte requestBytes[] = new byte[4]; + ByteBuffer requestBuffer = ByteBuffer.wrap(requestBytes); + byte responseBytes[] = new byte[28]; + ByteBuffer responseBuffer = ByteBuffer.wrap(responseBytes); + /* The current vote for the leader. Initially me! */ + DatagramSocket s = null; + try { + s = new DatagramSocket(); + s.setSoTimeout(200); + } catch (SocketException e1) { + LOG.error("Socket exception when creating socket for leader election", e1); + System.exit(4); + } + DatagramPacket requestPacket = new DatagramPacket(requestBytes, + requestBytes.length); + DatagramPacket responsePacket = new DatagramPacket(responseBytes, + responseBytes.length); + int xid = epochGen.nextInt(); + while (self.isRunning()) { + HashMap votes = + new HashMap(self.getVotingView().size()); + + requestBuffer.clear(); + requestBuffer.putInt(xid); + requestPacket.setLength(4); + HashSet heardFrom = new HashSet(); + for (QuorumServer server : self.getVotingView().values()) { + LOG.info("Server address: " + server.addr); + try { + requestPacket.setSocketAddress(server.addr); + } catch (IllegalArgumentException e) { + // Sun doesn't include the address that causes this + // exception to be thrown, so we wrap the exception + // in order to capture this critical detail. + throw new IllegalArgumentException( + "Unable to set socket address on packet, msg:" + + e.getMessage() + " with addr:" + server.addr, + e); + } + + try { + s.send(requestPacket); + responsePacket.setLength(responseBytes.length); + s.receive(responsePacket); + if (responsePacket.getLength() != responseBytes.length) { + LOG.error("Got a short response: " + + responsePacket.getLength()); + continue; + } + responseBuffer.clear(); + int recvedXid = responseBuffer.getInt(); + if (recvedXid != xid) { + LOG.error("Got bad xid: expected " + xid + + " got " + recvedXid); + continue; + } + long peerId = responseBuffer.getLong(); + heardFrom.add(peerId); + //if(server.id != peerId){ + Vote vote = new Vote(responseBuffer.getLong(), + responseBuffer.getLong()); + InetSocketAddress addr = + (InetSocketAddress) responsePacket + .getSocketAddress(); + votes.put(addr, vote); + //} + } catch (IOException e) { + LOG.warn("Ignoring exception while looking for leader", + e); + // Errors are okay, since hosts may be + // down + } + } + + ElectionResult result = countVotes(votes, heardFrom); + // ZOOKEEPER-569: + // If no votes are received for live peers, reset to voting + // for ourselves as otherwise we may hang on to a vote + // for a dead peer + if (result.numValidVotes == 0) { + self.setCurrentVote(new Vote(self.getId(), + self.getLastLoggedZxid())); + } else { + if (result.winner.getId() >= 0) { + self.setCurrentVote(result.vote); + // To do: this doesn't use a quorum verifier + if (result.winningCount > (self.getVotingView().size() / 2)) { + self.setCurrentVote(result.winner); + s.close(); + Vote current = self.getCurrentVote(); + LOG.info("Found leader: my type is: " + self.getLearnerType()); + /* + * We want to make sure we implement the state machine + * correctly. If we are a PARTICIPANT, once a leader + * is elected we can move either to LEADING or + * FOLLOWING. However if we are an OBSERVER, it is an + * error to be elected as a Leader. + */ + if (self.getLearnerType() == LearnerType.OBSERVER) { + if (current.getId() == self.getId()) { + // This should never happen! + LOG.error("OBSERVER elected as leader!"); + Thread.sleep(100); + } + else { + self.setPeerState(ServerState.OBSERVING); + Thread.sleep(100); + return current; + } + } else { + self.setPeerState((current.getId() == self.getId()) + ? ServerState.LEADING: ServerState.FOLLOWING); + if (self.getPeerState() == ServerState.FOLLOWING) { + Thread.sleep(100); + } + return current; + } + } + } + } + Thread.sleep(1000); + } + return null; + } finally { + try { + if(self.jmxLeaderElectionBean != null){ + MBeanRegistry.getInstance().unregister( + self.jmxLeaderElectionBean); + } + } catch (Exception e) { + LOG.warn("Failed to unregister with JMX", e); + } + self.jmxLeaderElectionBean = null; + } + } +} diff --git a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/quorum/LeaderElectionBean.java b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/quorum/LeaderElectionBean.java new file mode 100644 index 000000000..7c20a58ca --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/quorum/LeaderElectionBean.java @@ -0,0 +1,42 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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. + */ + +package org.apache.zookeeper.server.quorum; + +import java.util.Date; + +import org.apache.zookeeper.jmx.ZKMBeanInfo; + +/** + * Leader election MBean interface implementation + */ +public class LeaderElectionBean implements LeaderElectionMXBean, ZKMBeanInfo { + private final Date startTime = new Date(); + + public String getName() { + return "LeaderElection"; + } + + public boolean isHidden() { + return false; + } + + public String getStartTime() { + return startTime.toString(); + } +} diff --git a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/quorum/LeaderElectionMXBean.java b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/quorum/LeaderElectionMXBean.java new file mode 100644 index 000000000..406d153c9 --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/quorum/LeaderElectionMXBean.java @@ -0,0 +1,31 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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. + */ + +package org.apache.zookeeper.server.quorum; + + +/** + * Leader election protocol MBean. + */ +public interface LeaderElectionMXBean { + /** + * + * @return the time when the leader election started + */ + public String getStartTime(); +} diff --git a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/quorum/LeaderMXBean.java b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/quorum/LeaderMXBean.java new file mode 100644 index 000000000..bf08104ec --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/quorum/LeaderMXBean.java @@ -0,0 +1,36 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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. + */ + +package org.apache.zookeeper.server.quorum; + +import org.apache.zookeeper.server.ZooKeeperServerMXBean; + +/** + * Leader MBean. + */ +public interface LeaderMXBean extends ZooKeeperServerMXBean { + /** + * Current zxid of cluster. + */ + public String getCurrentZxid(); + + /** + * @return information on current followers + */ + public String followerInfo(); +} diff --git a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/quorum/LeaderZooKeeperServer.java b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/quorum/LeaderZooKeeperServer.java new file mode 100644 index 000000000..575f73d41 --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/quorum/LeaderZooKeeperServer.java @@ -0,0 +1,180 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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. + */ + +package org.apache.zookeeper.server.quorum; + +import java.io.IOException; + +import org.apache.zookeeper.KeeperException.SessionExpiredException; +import org.apache.zookeeper.jmx.MBeanRegistry; +import org.apache.zookeeper.server.DataTreeBean; +import org.apache.zookeeper.server.FinalRequestProcessor; +import org.apache.zookeeper.server.PrepRequestProcessor; +import org.apache.zookeeper.server.RequestProcessor; +import org.apache.zookeeper.server.ServerCnxn; +import org.apache.zookeeper.server.SessionTrackerImpl; +import org.apache.zookeeper.server.ZKDatabase; +import org.apache.zookeeper.server.persistence.FileTxnSnapLog; + +/** + * + * Just like the standard ZooKeeperServer. We just replace the request + * processors: PrepRequestProcessor -> ProposalRequestProcessor -> + * CommitProcessor -> Leader.ToBeAppliedRequestProcessor -> + * FinalRequestProcessor + */ +public class LeaderZooKeeperServer extends QuorumZooKeeperServer { + CommitProcessor commitProcessor; + + /** + * @param port + * @param dataDir + * @throws IOException + */ + LeaderZooKeeperServer(FileTxnSnapLog logFactory, QuorumPeer self, + DataTreeBuilder treeBuilder, ZKDatabase zkDb) throws IOException { + super(logFactory, self.tickTime, self.minSessionTimeout, + self.maxSessionTimeout, treeBuilder, zkDb, self); + } + + public Leader getLeader(){ + return self.leader; + } + + @Override + protected void setupRequestProcessors() { + RequestProcessor finalProcessor = new FinalRequestProcessor(this); + RequestProcessor toBeAppliedProcessor = new Leader.ToBeAppliedRequestProcessor( + finalProcessor, getLeader().toBeApplied); + commitProcessor = new CommitProcessor(toBeAppliedProcessor, + Long.toString(getServerId()), false); + commitProcessor.start(); + ProposalRequestProcessor proposalProcessor = new ProposalRequestProcessor(this, + commitProcessor); + proposalProcessor.initialize(); + firstProcessor = new PrepRequestProcessor(this, proposalProcessor); + ((PrepRequestProcessor)firstProcessor).start(); + } + + @Override + public int getGlobalOutstandingLimit() { + return super.getGlobalOutstandingLimit() / (self.getQuorumSize() - 1); + } + + @Override + public void createSessionTracker() { + sessionTracker = new SessionTrackerImpl(this, getZKDatabase().getSessionWithTimeOuts(), + tickTime, self.getId()); + } + + @Override + protected void startSessionTracker() { + ((SessionTrackerImpl)sessionTracker).start(); + } + + + public boolean touch(long sess, int to) { + return sessionTracker.touchSession(sess, to); + } + + @Override + protected void registerJMX() { + // register with JMX + try { + jmxDataTreeBean = new DataTreeBean(getZKDatabase().getDataTree()); + MBeanRegistry.getInstance().register(jmxDataTreeBean, jmxServerBean); + } catch (Exception e) { + LOG.warn("Failed to register with JMX", e); + jmxDataTreeBean = null; + } + } + + public void registerJMX(LeaderBean leaderBean, + LocalPeerBean localPeerBean) + { + // register with JMX + if (self.jmxLeaderElectionBean != null) { + try { + MBeanRegistry.getInstance().unregister(self.jmxLeaderElectionBean); + } catch (Exception e) { + LOG.warn("Failed to register with JMX", e); + } + self.jmxLeaderElectionBean = null; + } + + try { + jmxServerBean = leaderBean; + MBeanRegistry.getInstance().register(leaderBean, localPeerBean); + } catch (Exception e) { + LOG.warn("Failed to register with JMX", e); + jmxServerBean = null; + } + } + + @Override + protected void unregisterJMX() { + // unregister from JMX + try { + if (jmxDataTreeBean != null) { + MBeanRegistry.getInstance().unregister(jmxDataTreeBean); + } + } catch (Exception e) { + LOG.warn("Failed to unregister with JMX", e); + } + jmxDataTreeBean = null; + } + + protected void unregisterJMX(Leader leader) { + // unregister from JMX + try { + if (jmxServerBean != null) { + MBeanRegistry.getInstance().unregister(jmxServerBean); + } + } catch (Exception e) { + LOG.warn("Failed to unregister with JMX", e); + } + jmxServerBean = null; + } + + @Override + public String getState() { + return "leader"; + } + + /** + * Returns the id of the associated QuorumPeer, which will do for a unique + * id of this server. + */ + @Override + public long getServerId() { + return self.getId(); + } + + @Override + protected void revalidateSession(ServerCnxn cnxn, long sessionId, + int sessionTimeout) throws IOException { + super.revalidateSession(cnxn, sessionId, sessionTimeout); + try { + // setowner as the leader itself, unless updated + // via the follower handlers + setOwner(sessionId, ServerCnxn.me); + } catch (SessionExpiredException e) { + // this is ok, it just means that the session revalidation failed. + } + } +} diff --git a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/quorum/Learner.java b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/quorum/Learner.java new file mode 100644 index 000000000..0af88449b --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/quorum/Learner.java @@ -0,0 +1,549 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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. + */ +package org.apache.zookeeper.server.quorum; + +import java.io.BufferedInputStream; +import java.io.BufferedOutputStream; +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; +import java.io.DataInputStream; +import java.io.DataOutputStream; +import java.io.File; +import java.io.IOException; +import java.net.ConnectException; +import java.net.InetSocketAddress; +import java.net.Socket; +import java.nio.ByteBuffer; +import java.util.HashMap; +import java.util.LinkedList; +import java.util.Map.Entry; +import java.util.concurrent.ConcurrentHashMap; + +import org.apache.jute.BinaryInputArchive; +import org.apache.jute.BinaryOutputArchive; +import org.apache.jute.InputArchive; +import org.apache.jute.OutputArchive; +import org.apache.jute.Record; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.apache.zookeeper.server.Request; +import org.apache.zookeeper.server.ServerCnxn; +import org.apache.zookeeper.server.ZooTrace; +import org.apache.zookeeper.server.quorum.QuorumPeer.QuorumServer; +import org.apache.zookeeper.server.util.SerializeUtils; +import org.apache.zookeeper.server.util.ZxidUtils; +import org.apache.zookeeper.txn.TxnHeader; + +/** + * This class is the superclass of two of the three main actors in a ZK + * ensemble: Followers and Observers. Both Followers and Observers share + * a good deal of code which is moved into Peer to avoid duplication. + */ +public class Learner { + static class PacketInFlight { + TxnHeader hdr; + Record rec; + } + QuorumPeer self; + LearnerZooKeeperServer zk; + + protected BufferedOutputStream bufferedOutput; + + protected Socket sock; + + /** + * Socket getter + * @return + */ + public Socket getSocket() { + return sock; + } + + protected InputArchive leaderIs; + protected OutputArchive leaderOs; + /** the protocol version of the leader */ + protected int leaderProtocolVersion = 0x01; + + protected static final Logger LOG = LoggerFactory.getLogger(Learner.class); + + static final private boolean nodelay = System.getProperty("follower.nodelay", "true").equals("true"); + static { + LOG.info("TCP NoDelay set to: " + nodelay); + } + + final ConcurrentHashMap pendingRevalidations = + new ConcurrentHashMap(); + + public int getPendingRevalidationsCount() { + return pendingRevalidations.size(); + } + + /** + * validate a session for a client + * + * @param clientId + * the client to be revalidated + * @param timeout + * the timeout for which the session is valid + * @return + * @throws IOException + */ + void validateSession(ServerCnxn cnxn, long clientId, int timeout) + throws IOException { + LOG.info("Revalidating client: 0x" + Long.toHexString(clientId)); + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + DataOutputStream dos = new DataOutputStream(baos); + dos.writeLong(clientId); + dos.writeInt(timeout); + dos.close(); + QuorumPacket qp = new QuorumPacket(Leader.REVALIDATE, -1, baos + .toByteArray(), null); + pendingRevalidations.put(clientId, cnxn); + if (LOG.isTraceEnabled()) { + ZooTrace.logTraceMessage(LOG, + ZooTrace.SESSION_TRACE_MASK, + "To validate session 0x" + + Long.toHexString(clientId)); + } + writePacket(qp, true); + } + + /** + * write a packet to the leader + * + * @param pp + * the proposal packet to be sent to the leader + * @throws IOException + */ + void writePacket(QuorumPacket pp, boolean flush) throws IOException { + synchronized (leaderOs) { + if (pp != null) { + leaderOs.writeRecord(pp, "packet"); + } + if (flush) { + bufferedOutput.flush(); + } + } + } + + /** + * read a packet from the leader + * + * @param pp + * the packet to be instantiated + * @throws IOException + */ + void readPacket(QuorumPacket pp) throws IOException { + synchronized (leaderIs) { + leaderIs.readRecord(pp, "packet"); + } + long traceMask = ZooTrace.SERVER_PACKET_TRACE_MASK; + if (pp.getType() == Leader.PING) { + traceMask = ZooTrace.SERVER_PING_TRACE_MASK; + } + if (LOG.isTraceEnabled()) { + ZooTrace.logQuorumPacket(LOG, traceMask, 'i', pp); + } + } + + /** + * send a request packet to the leader + * + * @param request + * the request from the client + * @throws IOException + */ + void request(Request request) throws IOException { + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + DataOutputStream oa = new DataOutputStream(baos); + oa.writeLong(request.sessionId); + oa.writeInt(request.cxid); + oa.writeInt(request.type); + if (request.request != null) { + request.request.rewind(); + int len = request.request.remaining(); + byte b[] = new byte[len]; + request.request.get(b); + request.request.rewind(); + oa.write(b); + } + oa.close(); + QuorumPacket qp = new QuorumPacket(Leader.REQUEST, -1, baos + .toByteArray(), request.authInfo); + writePacket(qp, true); + } + + /** + * Returns the address of the node we think is the leader. + */ + protected InetSocketAddress findLeader() { + InetSocketAddress addr = null; + // Find the leader by id + Vote current = self.getCurrentVote(); + for (QuorumServer s : self.getView().values()) { + if (s.id == current.getId()) { + addr = s.addr; + break; + } + } + if (addr == null) { + LOG.warn("Couldn't find the leader with id = " + + current.getId()); + } + return addr; + } + + /** + * Establish a connection with the Leader found by findLeader. Retries + * 5 times before giving up. + * @param addr - the address of the Leader to connect to. + * @throws IOException - if the socket connection fails on the 5th attempt + * @throws ConnectException + * @throws InterruptedException + */ + protected void connectToLeader(InetSocketAddress addr) + throws IOException, ConnectException, InterruptedException { + sock = new Socket(); + sock.setSoTimeout(self.tickTime * self.initLimit); + for (int tries = 0; tries < 5; tries++) { + try { + sock.connect(addr, self.tickTime * self.syncLimit); + sock.setTcpNoDelay(nodelay); + break; + } catch (IOException e) { + if (tries == 4) { + LOG.error("Unexpected exception",e); + throw e; + } else { + LOG.warn("Unexpected exception, tries="+tries+ + ", connecting to " + addr,e); + sock = new Socket(); + sock.setSoTimeout(self.tickTime * self.initLimit); + } + } + Thread.sleep(1000); + } + leaderIs = BinaryInputArchive.getArchive(new BufferedInputStream( + sock.getInputStream())); + bufferedOutput = new BufferedOutputStream(sock.getOutputStream()); + leaderOs = BinaryOutputArchive.getArchive(bufferedOutput); + } + + /** + * Once connected to the leader, perform the handshake protocol to + * establish a following / observing connection. + * @param pktType + * @return the zxid the Leader sends for synchronization purposes. + * @throws IOException + */ + protected long registerWithLeader(int pktType) throws IOException{ + /* + * Send follower info, including last zxid and sid + */ + long lastLoggedZxid = self.getLastLoggedZxid(); + QuorumPacket qp = new QuorumPacket(); + qp.setType(pktType); + qp.setZxid(ZxidUtils.makeZxid(self.getAcceptedEpoch(), 0)); + + /* + * Add sid to payload + */ + LearnerInfo li = new LearnerInfo(self.getId(), 0x10000); + ByteArrayOutputStream bsid = new ByteArrayOutputStream(); + BinaryOutputArchive boa = BinaryOutputArchive.getArchive(bsid); + boa.writeRecord(li, "LearnerInfo"); + qp.setData(bsid.toByteArray()); + + writePacket(qp, true); + readPacket(qp); + final long newEpoch = ZxidUtils.getEpochFromZxid(qp.getZxid()); + if (qp.getType() == Leader.LEADERINFO) { + // we are connected to a 1.0 server so accept the new epoch and read the next packet + leaderProtocolVersion = ByteBuffer.wrap(qp.getData()).getInt(); + byte epochBytes[] = new byte[4]; + final ByteBuffer wrappedEpochBytes = ByteBuffer.wrap(epochBytes); + if (newEpoch > self.getAcceptedEpoch()) { + wrappedEpochBytes.putInt((int)self.getCurrentEpoch()); + self.setAcceptedEpoch(newEpoch); + } else if (newEpoch == self.getAcceptedEpoch()) { + // since we have already acked an epoch equal to the leaders, we cannot ack + // again, but we still need to send our lastZxid to the leader so that we can + // sync with it if it does assume leadership of the epoch. + // the -1 indicates that this reply should not count as an ack for the new epoch + wrappedEpochBytes.putInt(-1); + } else { + throw new IOException("Leaders epoch, " + newEpoch + " is less than accepted epoch, " + self.getAcceptedEpoch()); + } + QuorumPacket ackNewEpoch = new QuorumPacket(Leader.ACKEPOCH, lastLoggedZxid, epochBytes, null); + writePacket(ackNewEpoch, true); + return ZxidUtils.makeZxid(newEpoch, 0); + } else { + if (newEpoch > self.getAcceptedEpoch()) { + self.setAcceptedEpoch(newEpoch); + } + if (qp.getType() != Leader.NEWLEADER) { + LOG.error("First packet should have been NEWLEADER"); + throw new IOException("First packet should have been NEWLEADER"); + } + return qp.getZxid(); + } + } + + /** + * Finally, synchronize our history with the Leader. + * @param newLeaderZxid + * @throws IOException + * @throws InterruptedException + */ + protected void syncWithLeader(long newLeaderZxid) throws IOException, InterruptedException{ + QuorumPacket ack = new QuorumPacket(Leader.ACK, 0, null, null); + QuorumPacket qp = new QuorumPacket(); + long newEpoch = ZxidUtils.getEpochFromZxid(newLeaderZxid); + + readPacket(qp); + LinkedList packetsCommitted = new LinkedList(); + LinkedList packetsNotCommitted = new LinkedList(); + synchronized (zk) { + if (qp.getType() == Leader.DIFF) { + LOG.info("Getting a diff from the leader 0x" + Long.toHexString(qp.getZxid())); + } + else if (qp.getType() == Leader.SNAP) { + LOG.info("Getting a snapshot from leader"); + // The leader is going to dump the database + // clear our own database and read + zk.getZKDatabase().clear(); + zk.getZKDatabase().deserializeSnapshot(leaderIs); + String signature = leaderIs.readString("signature"); + if (!signature.equals("BenWasHere")) { + LOG.error("Missing signature. Got " + signature); + throw new IOException("Missing signature"); + } + } else if (qp.getType() == Leader.TRUNC) { + //we need to truncate the log to the lastzxid of the leader + LOG.warn("Truncating log to get in sync with the leader 0x" + + Long.toHexString(qp.getZxid())); + boolean truncated=zk.getZKDatabase().truncateLog(qp.getZxid()); + if (!truncated) { + // not able to truncate the log + LOG.error("Not able to truncate the log " + + Long.toHexString(qp.getZxid())); + System.exit(13); + } + + } + else { + LOG.error("Got unexpected packet from leader " + + qp.getType() + " exiting ... " ); + System.exit(13); + + } + zk.getZKDatabase().setlastProcessedZxid(qp.getZxid()); + zk.createSessionTracker(); + + long lastQueued = 0; + + // in V1.0 we take a snapshot when we get the NEWLEADER message, but in pre V1.0 + // we take the snapshot at the UPDATE, since V1.0 also gets the UPDATE (after the NEWLEADER) + // we need to make sure that we don't take the snapshot twice. + boolean snapshotTaken = false; + // we are now going to start getting transactions to apply followed by an UPTODATE + outerLoop: + while (self.isRunning()) { + readPacket(qp); + switch(qp.getType()) { + case Leader.PROPOSAL: + PacketInFlight pif = new PacketInFlight(); + pif.hdr = new TxnHeader(); + pif.rec = SerializeUtils.deserializeTxn(qp.getData(), pif.hdr); + if (pif.hdr.getZxid() != lastQueued + 1) { + LOG.warn("Got zxid 0x" + + Long.toHexString(pif.hdr.getZxid()) + + " expected 0x" + + Long.toHexString(lastQueued + 1)); + } + lastQueued = pif.hdr.getZxid(); + packetsNotCommitted.add(pif); + break; + case Leader.COMMIT: + if (!snapshotTaken) { + pif = packetsNotCommitted.peekFirst(); + if (pif.hdr.getZxid() != qp.getZxid()) { + LOG.warn("Committing " + qp.getZxid() + ", but next proposal is " + pif.hdr.getZxid()); + } else { + zk.processTxn(pif.hdr, pif.rec); + packetsNotCommitted.remove(); + } + } else { + packetsCommitted.add(qp.getZxid()); + } + break; + case Leader.INFORM: + /* + * Only observer get this type of packet. We treat this + * as receiving PROPOSAL and COMMMIT. + */ + PacketInFlight packet = new PacketInFlight(); + packet.hdr = new TxnHeader(); + packet.rec = SerializeUtils.deserializeTxn(qp.getData(), packet.hdr); + // Log warning message if txn comes out-of-order + if (packet.hdr.getZxid() != lastQueued + 1) { + LOG.warn("Got zxid 0x" + + Long.toHexString(packet.hdr.getZxid()) + + " expected 0x" + + Long.toHexString(lastQueued + 1)); + } + lastQueued = packet.hdr.getZxid(); + if (!snapshotTaken) { + // Apply to db directly if we haven't taken the snapshot + zk.processTxn(packet.hdr, packet.rec); + } else { + packetsNotCommitted.add(packet); + packetsCommitted.add(qp.getZxid()); + } + break; + case Leader.UPTODATE: + if (!snapshotTaken) { // true for the pre v1.0 case + zk.takeSnapshot(); + self.setCurrentEpoch(newEpoch); + } + self.cnxnFactory.setZooKeeperServer(zk); + break outerLoop; + case Leader.NEWLEADER: // it will be NEWLEADER in v1.0 + // Create updatingEpoch file and remove it after current + // epoch is set. QuorumPeer.loadDataBase() uses this file to + // detect the case where the server was terminated after + // taking a snapshot but before setting the current epoch. + File updating = new File(self.getTxnFactory().getSnapDir(), + QuorumPeer.UPDATING_EPOCH_FILENAME); + if (!updating.exists() && !updating.createNewFile()) { + throw new IOException("Failed to create " + + updating.toString()); + } + zk.takeSnapshot(); + self.setCurrentEpoch(newEpoch); + if (!updating.delete()) { + throw new IOException("Failed to delete " + + updating.toString()); + } + snapshotTaken = true; + writePacket(new QuorumPacket(Leader.ACK, newLeaderZxid, null, null), true); + break; + } + } + } + ack.setZxid(ZxidUtils.makeZxid(newEpoch, 0)); + writePacket(ack, true); + sock.setSoTimeout(self.tickTime * self.syncLimit); + zk.startup(); + /* + * Update the election vote here to ensure that all members of the + * ensemble report the same vote to new servers that start up and + * send leader election notifications to the ensemble. + * + * @see https://issues.apache.org/jira/browse/ZOOKEEPER-1732 + */ + self.updateElectionVote(newEpoch); + + // We need to log the stuff that came in between the snapshot and the uptodate + if (zk instanceof FollowerZooKeeperServer) { + FollowerZooKeeperServer fzk = (FollowerZooKeeperServer)zk; + for(PacketInFlight p: packetsNotCommitted) { + fzk.logRequest(p.hdr, p.rec); + } + for(Long zxid: packetsCommitted) { + fzk.commit(zxid); + } + } else if (zk instanceof ObserverZooKeeperServer) { + // Similar to follower, we need to log requests between the snapshot + // and UPTODATE + ObserverZooKeeperServer ozk = (ObserverZooKeeperServer) zk; + for (PacketInFlight p : packetsNotCommitted) { + Long zxid = packetsCommitted.peekFirst(); + if (p.hdr.getZxid() != zxid) { + // log warning message if there is no matching commit + // old leader send outstanding proposal to observer + LOG.warn("Committing " + Long.toHexString(zxid) + + ", but next proposal is " + + Long.toHexString(p.hdr.getZxid())); + continue; + } + packetsCommitted.remove(); + Request request = new Request(null, p.hdr.getClientId(), + p.hdr.getCxid(), p.hdr.getType(), null, null); + request.txn = p.rec; + request.hdr = p.hdr; + ozk.commitRequest(request); + } + } else { + // New server type need to handle in-flight packets + throw new UnsupportedOperationException("Unknown server type"); + } + } + + protected void revalidate(QuorumPacket qp) throws IOException { + ByteArrayInputStream bis = new ByteArrayInputStream(qp + .getData()); + DataInputStream dis = new DataInputStream(bis); + long sessionId = dis.readLong(); + boolean valid = dis.readBoolean(); + ServerCnxn cnxn = pendingRevalidations + .remove(sessionId); + if (cnxn == null) { + LOG.warn("Missing session 0x" + + Long.toHexString(sessionId) + + " for validation"); + } else { + zk.finishSessionInit(cnxn, valid); + } + if (LOG.isTraceEnabled()) { + ZooTrace.logTraceMessage(LOG, + ZooTrace.SESSION_TRACE_MASK, + "Session 0x" + Long.toHexString(sessionId) + + " is valid: " + valid); + } + } + + protected void ping(QuorumPacket qp) throws IOException { + // Send back the ping with our session data + ByteArrayOutputStream bos = new ByteArrayOutputStream(); + DataOutputStream dos = new DataOutputStream(bos); + HashMap touchTable = zk + .getTouchSnapshot(); + for (Entry entry : touchTable.entrySet()) { + dos.writeLong(entry.getKey()); + dos.writeInt(entry.getValue()); + } + qp.setData(bos.toByteArray()); + writePacket(qp, true); + } + + + /** + * Shutdown the Peer + */ + public void shutdown() { + // set the zookeeper server to null + self.cnxnFactory.setZooKeeperServer(null); + // clear all the connections + self.cnxnFactory.closeAll(); + // shutdown previous zookeeper + if (zk != null) { + zk.shutdown(); + } + } +} diff --git a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/quorum/LearnerHandler.java b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/quorum/LearnerHandler.java new file mode 100644 index 000000000..01e79dc1b --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/quorum/LearnerHandler.java @@ -0,0 +1,700 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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. + */ + +package org.apache.zookeeper.server.quorum; + +import java.io.BufferedInputStream; +import java.io.BufferedOutputStream; +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; +import java.io.DataInputStream; +import java.io.DataOutputStream; +import java.io.IOException; +import java.net.Socket; +import java.nio.ByteBuffer; +import java.util.LinkedList; +import java.util.concurrent.LinkedBlockingQueue; +import java.util.concurrent.locks.ReentrantReadWriteLock; +import java.util.concurrent.locks.ReentrantReadWriteLock.ReadLock; + +import org.apache.jute.BinaryInputArchive; +import org.apache.jute.BinaryOutputArchive; +import org.apache.jute.Record; +import org.apache.zookeeper.KeeperException.SessionExpiredException; +import org.apache.zookeeper.ZooDefs.OpCode; +import org.apache.zookeeper.server.ByteBufferInputStream; +import org.apache.zookeeper.server.Request; +import org.apache.zookeeper.server.ZooTrace; +import org.apache.zookeeper.server.quorum.Leader.Proposal; +import org.apache.zookeeper.server.quorum.QuorumPeer.LearnerType; +import org.apache.zookeeper.server.util.SerializeUtils; +import org.apache.zookeeper.server.util.ZxidUtils; +import org.apache.zookeeper.txn.TxnHeader; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * There will be an instance of this class created by the Leader for each + * learner. All communication with a learner is handled by this + * class. + */ +public class LearnerHandler extends Thread { + private static final Logger LOG = LoggerFactory.getLogger(LearnerHandler.class); + + protected final Socket sock; + + public Socket getSocket() { + return sock; + } + + final Leader leader; + + /** Deadline for receiving the next ack. If we are bootstrapping then + * it's based on the initLimit, if we are done bootstrapping it's based + * on the syncLimit. Once the deadline is past this learner should + * be considered no longer "sync'd" with the leader. */ + volatile long tickOfNextAckDeadline; + + /** + * ZooKeeper server identifier of this learner + */ + protected long sid = 0; + + long getSid(){ + return sid; + } + + protected int version = 0x1; + + int getVersion() { + return version; + } + + /** + * The packets to be sent to the learner + */ + final LinkedBlockingQueue queuedPackets = + new LinkedBlockingQueue(); + + /** + * This class controls the time that the Leader has been + * waiting for acknowledgement of a proposal from this Learner. + * If the time is above syncLimit, the connection will be closed. + * It keeps track of only one proposal at a time, when the ACK for + * that proposal arrives, it switches to the last proposal received + * or clears the value if there is no pending proposal. + */ + private class SyncLimitCheck { + private boolean started = false; + private long currentZxid = 0; + private long currentTime = 0; + private long nextZxid = 0; + private long nextTime = 0; + + public synchronized void start() { + started = true; + } + + public synchronized void updateProposal(long zxid, long time) { + if (!started) { + return; + } + if (currentTime == 0) { + currentTime = time; + currentZxid = zxid; + } else { + nextTime = time; + nextZxid = zxid; + } + } + + public synchronized void updateAck(long zxid) { + if (currentZxid == zxid) { + currentTime = nextTime; + currentZxid = nextZxid; + nextTime = 0; + nextZxid = 0; + } else if (nextZxid == zxid) { + LOG.warn("ACK for " + zxid + " received before ACK for " + currentZxid + "!!!!"); + nextTime = 0; + nextZxid = 0; + } + } + + public synchronized boolean check(long time) { + if (currentTime == 0) { + return true; + } else { + long msDelay = (time - currentTime) / 1000000; + return (msDelay < (leader.self.tickTime * leader.self.syncLimit)); + } + } + }; + + private SyncLimitCheck syncLimitCheck = new SyncLimitCheck(); + + private BinaryInputArchive ia; + + private BinaryOutputArchive oa; + + private BufferedOutputStream bufferedOutput; + + LearnerHandler(Socket sock, Leader leader) throws IOException { + super("LearnerHandler-" + sock.getRemoteSocketAddress()); + this.sock = sock; + this.leader = leader; + leader.addLearnerHandler(this); + } + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(); + sb.append("LearnerHandler ").append(sock); + sb.append(" tickOfNextAckDeadline:").append(tickOfNextAckDeadline()); + sb.append(" synced?:").append(synced()); + sb.append(" queuedPacketLength:").append(queuedPackets.size()); + return sb.toString(); + } + + /** + * If this packet is queued, the sender thread will exit + */ + final QuorumPacket proposalOfDeath = new QuorumPacket(); + + private LearnerType learnerType = LearnerType.PARTICIPANT; + public LearnerType getLearnerType() { + return learnerType; + } + + /** + * This method will use the thread to send packets added to the + * queuedPackets list + * + * @throws InterruptedException + */ + private void sendPackets() throws InterruptedException { + long traceMask = ZooTrace.SERVER_PACKET_TRACE_MASK; + while (true) { + try { + QuorumPacket p; + p = queuedPackets.poll(); + if (p == null) { + bufferedOutput.flush(); + p = queuedPackets.take(); + } + + if (p == proposalOfDeath) { + // Packet of death! + break; + } + if (p.getType() == Leader.PING) { + traceMask = ZooTrace.SERVER_PING_TRACE_MASK; + } + if (p.getType() == Leader.PROPOSAL) { + syncLimitCheck.updateProposal(p.getZxid(), System.nanoTime()); + } + if (LOG.isTraceEnabled()) { + ZooTrace.logQuorumPacket(LOG, traceMask, 'o', p); + } + oa.writeRecord(p, "packet"); + } catch (IOException e) { + if (!sock.isClosed()) { + LOG.warn("Unexpected exception at " + this, e); + try { + // this will cause everything to shutdown on + // this learner handler and will help notify + // the learner/observer instantaneously + sock.close(); + } catch(IOException ie) { + LOG.warn("Error closing socket for handler " + this, ie); + } + } + break; + } + } + } + + static public String packetToString(QuorumPacket p) { + if (true) + return null; + String type = null; + String mess = null; + Record txn = null; + + switch (p.getType()) { + case Leader.ACK: + type = "ACK"; + break; + case Leader.COMMIT: + type = "COMMIT"; + break; + case Leader.FOLLOWERINFO: + type = "FOLLOWERINFO"; + break; + case Leader.NEWLEADER: + type = "NEWLEADER"; + break; + case Leader.PING: + type = "PING"; + break; + case Leader.PROPOSAL: + type = "PROPOSAL"; + TxnHeader hdr = new TxnHeader(); + try { + txn = SerializeUtils.deserializeTxn(p.getData(), hdr); + // mess = "transaction: " + txn.toString(); + } catch (IOException e) { + LOG.warn("Unexpected exception",e); + } + break; + case Leader.REQUEST: + type = "REQUEST"; + break; + case Leader.REVALIDATE: + type = "REVALIDATE"; + ByteArrayInputStream bis = new ByteArrayInputStream(p.getData()); + DataInputStream dis = new DataInputStream(bis); + try { + long id = dis.readLong(); + mess = " sessionid = " + id; + } catch (IOException e) { + LOG.warn("Unexpected exception", e); + } + + break; + case Leader.UPTODATE: + type = "UPTODATE"; + break; + default: + type = "UNKNOWN" + p.getType(); + } + String entry = null; + if (type != null) { + entry = type + " " + Long.toHexString(p.getZxid()) + " " + mess; + } + return entry; + } + + /** + * This thread will receive packets from the peer and process them and + * also listen to new connections from new peers. + */ + @Override + public void run() { + try { + tickOfNextAckDeadline = leader.self.tick + + leader.self.initLimit + leader.self.syncLimit; + + ia = BinaryInputArchive.getArchive(new BufferedInputStream(sock + .getInputStream())); + bufferedOutput = new BufferedOutputStream(sock.getOutputStream()); + oa = BinaryOutputArchive.getArchive(bufferedOutput); + + QuorumPacket qp = new QuorumPacket(); + ia.readRecord(qp, "packet"); + if(qp.getType() != Leader.FOLLOWERINFO && qp.getType() != Leader.OBSERVERINFO){ + LOG.error("First packet " + qp.toString() + + " is not FOLLOWERINFO or OBSERVERINFO!"); + return; + } + byte learnerInfoData[] = qp.getData(); + if (learnerInfoData != null) { + if (learnerInfoData.length == 8) { + ByteBuffer bbsid = ByteBuffer.wrap(learnerInfoData); + this.sid = bbsid.getLong(); + } else { + LearnerInfo li = new LearnerInfo(); + ByteBufferInputStream.byteBuffer2Record(ByteBuffer.wrap(learnerInfoData), li); + this.sid = li.getServerid(); + this.version = li.getProtocolVersion(); + } + } else { + this.sid = leader.followerCounter.getAndDecrement(); + } + + LOG.info("Follower sid: " + sid + " : info : " + + leader.self.quorumPeers.get(sid)); + + if (qp.getType() == Leader.OBSERVERINFO) { + learnerType = LearnerType.OBSERVER; + } + + long lastAcceptedEpoch = ZxidUtils.getEpochFromZxid(qp.getZxid()); + + long peerLastZxid; + StateSummary ss = null; + long zxid = qp.getZxid(); + long newEpoch = leader.getEpochToPropose(this.getSid(), lastAcceptedEpoch); + + if (this.getVersion() < 0x10000) { + // we are going to have to extrapolate the epoch information + long epoch = ZxidUtils.getEpochFromZxid(zxid); + ss = new StateSummary(epoch, zxid); + // fake the message + leader.waitForEpochAck(this.getSid(), ss); + } else { + byte ver[] = new byte[4]; + ByteBuffer.wrap(ver).putInt(0x10000); + QuorumPacket newEpochPacket = new QuorumPacket(Leader.LEADERINFO, ZxidUtils.makeZxid(newEpoch, 0), ver, null); + oa.writeRecord(newEpochPacket, "packet"); + bufferedOutput.flush(); + QuorumPacket ackEpochPacket = new QuorumPacket(); + ia.readRecord(ackEpochPacket, "packet"); + if (ackEpochPacket.getType() != Leader.ACKEPOCH) { + LOG.error(ackEpochPacket.toString() + + " is not ACKEPOCH"); + return; + } + ByteBuffer bbepoch = ByteBuffer.wrap(ackEpochPacket.getData()); + ss = new StateSummary(bbepoch.getInt(), ackEpochPacket.getZxid()); + leader.waitForEpochAck(this.getSid(), ss); + } + peerLastZxid = ss.getLastZxid(); + + /* the default to send to the follower */ + int packetToSend = Leader.SNAP; + long zxidToSend = 0; + long leaderLastZxid = 0; + /** the packets that the follower needs to get updates from **/ + long updates = peerLastZxid; + + /* we are sending the diff check if we have proposals in memory to be able to + * send a diff to the + */ + ReentrantReadWriteLock lock = leader.zk.getZKDatabase().getLogLock(); + ReadLock rl = lock.readLock(); + try { + rl.lock(); + final long maxCommittedLog = leader.zk.getZKDatabase().getmaxCommittedLog(); + final long minCommittedLog = leader.zk.getZKDatabase().getminCommittedLog(); + LOG.info("Synchronizing with Follower sid: " + sid + +" maxCommittedLog=0x"+Long.toHexString(maxCommittedLog) + +" minCommittedLog=0x"+Long.toHexString(minCommittedLog) + +" peerLastZxid=0x"+Long.toHexString(peerLastZxid)); + + LinkedList proposals = leader.zk.getZKDatabase().getCommittedLog(); + + if (proposals.size() != 0) { + LOG.debug("proposal size is {}", proposals.size()); + if ((maxCommittedLog >= peerLastZxid) + && (minCommittedLog <= peerLastZxid)) { + LOG.debug("Sending proposals to follower"); + + // as we look through proposals, this variable keeps track of previous + // proposal Id. + long prevProposalZxid = minCommittedLog; + + // Keep track of whether we are about to send the first packet. + // Before sending the first packet, we have to tell the learner + // whether to expect a trunc or a diff + boolean firstPacket=true; + + // If we are here, we can use committedLog to sync with + // follower. Then we only need to decide whether to + // send trunc or not + packetToSend = Leader.DIFF; + zxidToSend = maxCommittedLog; + + for (Proposal propose: proposals) { + // skip the proposals the peer already has + if (propose.packet.getZxid() <= peerLastZxid) { + prevProposalZxid = propose.packet.getZxid(); + continue; + } else { + // If we are sending the first packet, figure out whether to trunc + // in case the follower has some proposals that the leader doesn't + if (firstPacket) { + firstPacket = false; + // Does the peer have some proposals that the leader hasn't seen yet + if (prevProposalZxid < peerLastZxid) { + // send a trunc message before sending the diff + packetToSend = Leader.TRUNC; + zxidToSend = prevProposalZxid; + updates = zxidToSend; + } + } + queuePacket(propose.packet); + QuorumPacket qcommit = new QuorumPacket(Leader.COMMIT, propose.packet.getZxid(), + null, null); + queuePacket(qcommit); + } + } + } else if (peerLastZxid > maxCommittedLog) { + LOG.debug("Sending TRUNC to follower zxidToSend=0x{} updates=0x{}", + Long.toHexString(maxCommittedLog), + Long.toHexString(updates)); + + packetToSend = Leader.TRUNC; + zxidToSend = maxCommittedLog; + updates = zxidToSend; + } else { + LOG.warn("Unhandled proposal scenario"); + } + } else if (peerLastZxid == leader.zk.getZKDatabase().getDataTreeLastProcessedZxid()) { + // The leader may recently take a snapshot, so the committedLog + // is empty. We don't need to send snapshot if the follow + // is already sync with in-memory db. + LOG.debug("committedLog is empty but leader and follower " + + "are in sync, zxid=0x{}", + Long.toHexString(peerLastZxid)); + packetToSend = Leader.DIFF; + zxidToSend = peerLastZxid; + } else { + // just let the state transfer happen + LOG.debug("proposals is empty"); + } + + LOG.info("Sending " + Leader.getPacketType(packetToSend)); + leaderLastZxid = leader.startForwarding(this, updates); + + } finally { + rl.unlock(); + } + + QuorumPacket newLeaderQP = new QuorumPacket(Leader.NEWLEADER, + ZxidUtils.makeZxid(newEpoch, 0), null, null); + if (getVersion() < 0x10000) { + oa.writeRecord(newLeaderQP, "packet"); + } else { + queuedPackets.add(newLeaderQP); + } + bufferedOutput.flush(); + //Need to set the zxidToSend to the latest zxid + if (packetToSend == Leader.SNAP) { + zxidToSend = leader.zk.getZKDatabase().getDataTreeLastProcessedZxid(); + } + oa.writeRecord(new QuorumPacket(packetToSend, zxidToSend, null, null), "packet"); + bufferedOutput.flush(); + + /* if we are not truncating or sending a diff just send a snapshot */ + if (packetToSend == Leader.SNAP) { + LOG.info("Sending snapshot last zxid of peer is 0x" + + Long.toHexString(peerLastZxid) + " " + + " zxid of leader is 0x" + + Long.toHexString(leaderLastZxid) + + "sent zxid of db as 0x" + + Long.toHexString(zxidToSend)); + // Dump data to peer + leader.zk.getZKDatabase().serializeSnapshot(oa); + oa.writeString("BenWasHere", "signature"); + } + bufferedOutput.flush(); + + // Start sending packets + new Thread() { + public void run() { + Thread.currentThread().setName( + "Sender-" + sock.getRemoteSocketAddress()); + try { + sendPackets(); + } catch (InterruptedException e) { + LOG.warn("Unexpected interruption",e); + } + } + }.start(); + + /* + * Have to wait for the first ACK, wait until + * the leader is ready, and only then we can + * start processing messages. + */ + qp = new QuorumPacket(); + ia.readRecord(qp, "packet"); + if(qp.getType() != Leader.ACK){ + LOG.error("Next packet was supposed to be an ACK"); + return; + } + LOG.info("Received NEWLEADER-ACK message from " + getSid()); + leader.waitForNewLeaderAck(getSid(), qp.getZxid(), getLearnerType()); + + syncLimitCheck.start(); + + // now that the ack has been processed expect the syncLimit + sock.setSoTimeout(leader.self.tickTime * leader.self.syncLimit); + + /* + * Wait until leader starts up + */ + synchronized(leader.zk){ + while(!leader.zk.isRunning() && !this.isInterrupted()){ + leader.zk.wait(20); + } + } + // Mutation packets will be queued during the serialize, + // so we need to mark when the peer can actually start + // using the data + // + queuedPackets.add(new QuorumPacket(Leader.UPTODATE, -1, null, null)); + + while (true) { + qp = new QuorumPacket(); + ia.readRecord(qp, "packet"); + + long traceMask = ZooTrace.SERVER_PACKET_TRACE_MASK; + if (qp.getType() == Leader.PING) { + traceMask = ZooTrace.SERVER_PING_TRACE_MASK; + } + if (LOG.isTraceEnabled()) { + ZooTrace.logQuorumPacket(LOG, traceMask, 'i', qp); + } + tickOfNextAckDeadline = leader.self.tick + leader.self.syncLimit; + + + ByteBuffer bb; + long sessionId; + int cxid; + int type; + + switch (qp.getType()) { + case Leader.ACK: + if (this.learnerType == LearnerType.OBSERVER) { + if (LOG.isDebugEnabled()) { + LOG.debug("Received ACK from Observer " + this.sid); + } + } + syncLimitCheck.updateAck(qp.getZxid()); + leader.processAck(this.sid, qp.getZxid(), sock.getLocalSocketAddress()); + break; + case Leader.PING: + // Process the touches + ByteArrayInputStream bis = new ByteArrayInputStream(qp + .getData()); + DataInputStream dis = new DataInputStream(bis); + while (dis.available() > 0) { + long sess = dis.readLong(); + int to = dis.readInt(); + leader.zk.touch(sess, to); + } + break; + case Leader.REVALIDATE: + bis = new ByteArrayInputStream(qp.getData()); + dis = new DataInputStream(bis); + long id = dis.readLong(); + int to = dis.readInt(); + ByteArrayOutputStream bos = new ByteArrayOutputStream(); + DataOutputStream dos = new DataOutputStream(bos); + dos.writeLong(id); + boolean valid = leader.zk.touch(id, to); + if (valid) { + try { + //set the session owner + // as the follower that + // owns the session + leader.zk.setOwner(id, this); + } catch (SessionExpiredException e) { + LOG.error("Somehow session " + Long.toHexString(id) + " expired right after being renewed! (impossible)", e); + } + } + if (LOG.isTraceEnabled()) { + ZooTrace.logTraceMessage(LOG, + ZooTrace.SESSION_TRACE_MASK, + "Session 0x" + Long.toHexString(id) + + " is valid: "+ valid); + } + dos.writeBoolean(valid); + qp.setData(bos.toByteArray()); + queuedPackets.add(qp); + break; + case Leader.REQUEST: + bb = ByteBuffer.wrap(qp.getData()); + sessionId = bb.getLong(); + cxid = bb.getInt(); + type = bb.getInt(); + bb = bb.slice(); + Request si; + if(type == OpCode.sync){ + si = new LearnerSyncRequest(this, sessionId, cxid, type, bb, qp.getAuthinfo()); + } else { + si = new Request(null, sessionId, cxid, type, bb, qp.getAuthinfo()); + } + si.setOwner(this); + leader.zk.submitRequest(si); + break; + default: + } + } + } catch (IOException e) { + if (sock != null && !sock.isClosed()) { + LOG.error("Unexpected exception causing shutdown while sock " + + "still open", e); + //close the socket to make sure the + //other side can see it being close + try { + sock.close(); + } catch(IOException ie) { + // do nothing + } + } + } catch (InterruptedException e) { + LOG.error("Unexpected exception causing shutdown", e); + } finally { + LOG.warn("******* GOODBYE " + + (sock != null ? sock.getRemoteSocketAddress() : "") + + " ********"); + shutdown(); + } + } + + public void shutdown() { + // Send the packet of death + try { + queuedPackets.put(proposalOfDeath); + } catch (InterruptedException e) { + LOG.warn("Ignoring unexpected exception", e); + } + try { + if (sock != null && !sock.isClosed()) { + sock.close(); + } + } catch (IOException e) { + LOG.warn("Ignoring unexpected exception during socket close", e); + } + this.interrupt(); + leader.removeLearnerHandler(this); + } + + public long tickOfNextAckDeadline() { + return tickOfNextAckDeadline; + } + + /** + * ping calls from the leader to the peers + */ + public void ping() { + long id; + if (syncLimitCheck.check(System.nanoTime())) { + synchronized(leader) { + id = leader.lastProposed; + } + QuorumPacket ping = new QuorumPacket(Leader.PING, id, null, null); + queuePacket(ping); + } else { + LOG.warn("Closing connection to peer due to transaction timeout."); + shutdown(); + } + } + + void queuePacket(QuorumPacket p) { + queuedPackets.add(p); + } + + public boolean synced() { + return isAlive() + && leader.self.tick <= tickOfNextAckDeadline; + } +} diff --git a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/quorum/LearnerSessionTracker.java b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/quorum/LearnerSessionTracker.java new file mode 100644 index 000000000..318241970 --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/quorum/LearnerSessionTracker.java @@ -0,0 +1,96 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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. + */ + +package org.apache.zookeeper.server.quorum; + +import java.io.PrintWriter; +import java.util.HashMap; +import java.util.concurrent.ConcurrentHashMap; + +import org.apache.zookeeper.server.SessionTracker; +import org.apache.zookeeper.server.SessionTrackerImpl; + +/** + * This is really just a shell of a SessionTracker that tracks session activity + * to be forwarded to the Leader using a PING. + */ +public class LearnerSessionTracker implements SessionTracker { + SessionExpirer expirer; + + HashMap touchTable = new HashMap(); + long serverId = 1; + long nextSessionId=0; + + private ConcurrentHashMap sessionsWithTimeouts; + + public LearnerSessionTracker(SessionExpirer expirer, + ConcurrentHashMap sessionsWithTimeouts, long id) { + this.expirer = expirer; + this.sessionsWithTimeouts = sessionsWithTimeouts; + this.serverId = id; + nextSessionId = SessionTrackerImpl.initializeNextSession(this.serverId); + + } + + synchronized public void removeSession(long sessionId) { + sessionsWithTimeouts.remove(sessionId); + touchTable.remove(sessionId); + } + + public void shutdown() { + } + + synchronized public void addSession(long sessionId, int sessionTimeout) { + sessionsWithTimeouts.put(sessionId, sessionTimeout); + touchTable.put(sessionId, sessionTimeout); + } + + synchronized public boolean touchSession(long sessionId, int sessionTimeout) { + touchTable.put(sessionId, sessionTimeout); + return true; + } + + synchronized HashMap snapshot() { + HashMap oldTouchTable = touchTable; + touchTable = new HashMap(); + return oldTouchTable; + } + + + synchronized public long createSession(int sessionTimeout) { + return (nextSessionId++); + } + + public void checkSession(long sessionId, Object owner) { + // Nothing to do here. Sessions are checked at the Leader + } + + public void setOwner(long sessionId, Object owner) { + // Nothing to do here. Sessions are checked at the Leader + } + + public void dumpSessions(PrintWriter pwriter) { + // the original class didn't have tostring impl, so just + // dup what we had before + pwriter.println(toString()); + } + + public void setSessionClosing(long sessionId) { + // Nothing to do here. + } +} diff --git a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/quorum/LearnerSyncRequest.java b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/quorum/LearnerSyncRequest.java new file mode 100644 index 000000000..bfbc9a8fd --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/quorum/LearnerSyncRequest.java @@ -0,0 +1,34 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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. + */ + +package org.apache.zookeeper.server.quorum; + +import java.nio.ByteBuffer; +import java.util.List; + +import org.apache.zookeeper.data.Id; +import org.apache.zookeeper.server.Request; + +public class LearnerSyncRequest extends Request { + LearnerHandler fh; + public LearnerSyncRequest(LearnerHandler fh, long sessionId, int xid, int type, + ByteBuffer bb, List authInfo) { + super(null, sessionId, xid, type, bb, authInfo); + this.fh = fh; + } +} diff --git a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/quorum/LearnerZooKeeperServer.java b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/quorum/LearnerZooKeeperServer.java new file mode 100644 index 000000000..5dd133202 --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/quorum/LearnerZooKeeperServer.java @@ -0,0 +1,145 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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. + */ +package org.apache.zookeeper.server.quorum; + +import java.io.IOException; +import java.util.HashMap; + +import org.apache.zookeeper.jmx.MBeanRegistry; +import org.apache.zookeeper.server.DataTreeBean; +import org.apache.zookeeper.server.ServerCnxn; +import org.apache.zookeeper.server.ZKDatabase; +import org.apache.zookeeper.server.ZooKeeperServerBean; +import org.apache.zookeeper.server.persistence.FileTxnSnapLog; + +/** + * Parent class for all ZooKeeperServers for Learners + */ +public abstract class LearnerZooKeeperServer extends QuorumZooKeeperServer { + public LearnerZooKeeperServer(FileTxnSnapLog logFactory, int tickTime, + int minSessionTimeout, int maxSessionTimeout, + DataTreeBuilder treeBuilder, ZKDatabase zkDb, QuorumPeer self) + throws IOException + { + super(logFactory, tickTime, minSessionTimeout, maxSessionTimeout, + treeBuilder, zkDb, self); + } + + /** + * Abstract method to return the learner associated with this server. + * Since the Learner may change under our feet (when QuorumPeer reassigns + * it) we can't simply take a reference here. Instead, we need the + * subclasses to implement this. + */ + abstract public Learner getLearner(); + + /** + * Returns the current state of the session tracker. This is only currently + * used by a Learner to build a ping response packet. + * + */ + protected HashMap getTouchSnapshot() { + if (sessionTracker != null) { + return ((LearnerSessionTracker) sessionTracker).snapshot(); + } + return new HashMap(); + } + + /** + * Returns the id of the associated QuorumPeer, which will do for a unique + * id of this server. + */ + @Override + public long getServerId() { + return self.getId(); + } + + @Override + public void createSessionTracker() { + sessionTracker = new LearnerSessionTracker(this, getZKDatabase().getSessionWithTimeOuts(), + self.getId()); + } + + @Override + protected void startSessionTracker() {} + + @Override + protected void revalidateSession(ServerCnxn cnxn, long sessionId, + int sessionTimeout) throws IOException { + getLearner().validateSession(cnxn, sessionId, sessionTimeout); + } + + @Override + protected void registerJMX() { + // register with JMX + try { + jmxDataTreeBean = new DataTreeBean(getZKDatabase().getDataTree()); + MBeanRegistry.getInstance().register(jmxDataTreeBean, jmxServerBean); + } catch (Exception e) { + LOG.warn("Failed to register with JMX", e); + jmxDataTreeBean = null; + } + } + + public void registerJMX(ZooKeeperServerBean serverBean, + LocalPeerBean localPeerBean) + { + // register with JMX + if (self.jmxLeaderElectionBean != null) { + try { + MBeanRegistry.getInstance().unregister(self.jmxLeaderElectionBean); + } catch (Exception e) { + LOG.warn("Failed to register with JMX", e); + } + self.jmxLeaderElectionBean = null; + } + + try { + jmxServerBean = serverBean; + MBeanRegistry.getInstance().register(serverBean, localPeerBean); + } catch (Exception e) { + LOG.warn("Failed to register with JMX", e); + jmxServerBean = null; + } + } + + @Override + protected void unregisterJMX() { + // unregister from JMX + try { + if (jmxDataTreeBean != null) { + MBeanRegistry.getInstance().unregister(jmxDataTreeBean); + } + } catch (Exception e) { + LOG.warn("Failed to unregister with JMX", e); + } + jmxDataTreeBean = null; + } + + protected void unregisterJMX(Learner peer) { + // unregister from JMX + try { + if (jmxServerBean != null) { + MBeanRegistry.getInstance().unregister(jmxServerBean); + } + } catch (Exception e) { + LOG.warn("Failed to unregister with JMX", e); + } + jmxServerBean = null; + } +} diff --git a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/quorum/LocalPeerBean.java b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/quorum/LocalPeerBean.java new file mode 100644 index 000000000..03f3f06bf --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/quorum/LocalPeerBean.java @@ -0,0 +1,79 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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. + */ + +package org.apache.zookeeper.server.quorum; + + +/** + * Implementation of the local peer MBean interface. + */ +public class LocalPeerBean extends ServerBean implements LocalPeerMXBean { + private final QuorumPeer peer; + + public LocalPeerBean(QuorumPeer peer) { + this.peer = peer; + } + + public String getName() { + return "replica." + peer.getId(); + } + + public boolean isHidden() { + return false; + } + + public int getTickTime() { + return peer.getTickTime(); + } + + public int getMaxClientCnxnsPerHost() { + return peer.getMaxClientCnxnsPerHost(); + } + + public int getMinSessionTimeout() { + return peer.getMinSessionTimeout(); + } + + public int getMaxSessionTimeout() { + return peer.getMaxSessionTimeout(); + } + + public int getInitLimit() { + return peer.getInitLimit(); + } + + public int getSyncLimit() { + return peer.getSyncLimit(); + } + + public int getTick() { + return peer.getTick(); + } + + public String getState() { + return peer.getState().toString(); + } + + public String getQuorumAddress() { + return peer.getQuorumAddress().toString(); + } + + public int getElectionType() { + return peer.getElectionType(); + } +} diff --git a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/quorum/LocalPeerMXBean.java b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/quorum/LocalPeerMXBean.java new file mode 100644 index 000000000..eedf308c0 --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/quorum/LocalPeerMXBean.java @@ -0,0 +1,77 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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. + */ + +package org.apache.zookeeper.server.quorum; + + +/** + * A local zookeeper server MBean interface. Unlike the remote peer, the local + * peer provides complete state/statistics at runtime and can be managed (just + * like a standalone zookeeper server). + */ +public interface LocalPeerMXBean extends ServerMXBean { + + /** + * @return the number of milliseconds of each tick + */ + public int getTickTime(); + + /** Current maxClientCnxns allowed from a particular host */ + public int getMaxClientCnxnsPerHost(); + + /** + * @return the minimum number of milliseconds allowed for a session timeout + */ + public int getMinSessionTimeout(); + + /** + * @return the maximum number of milliseconds allowed for a session timeout + */ + public int getMaxSessionTimeout(); + + /** + * @return the number of ticks that the initial sync phase can take + */ + public int getInitLimit(); + + /** + * @return the number of ticks that can pass between sending a request + * and getting a acknowledgment + */ + public int getSyncLimit(); + + /** + * @return the current tick + */ + public int getTick(); + + /** + * @return the current server state + */ + public String getState(); + + /** + * @return the quorum address + */ + public String getQuorumAddress(); + + /** + * @return the election type + */ + public int getElectionType(); +} diff --git a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/quorum/Observer.java b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/quorum/Observer.java new file mode 100644 index 000000000..ee61a90c4 --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/quorum/Observer.java @@ -0,0 +1,141 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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. + */ + +package org.apache.zookeeper.server.quorum; + +import java.io.ByteArrayInputStream; +import java.io.IOException; +import java.net.InetSocketAddress; + +import org.apache.jute.BinaryInputArchive; +import org.apache.jute.Record; +import org.apache.zookeeper.server.ObserverBean; +import org.apache.zookeeper.server.Request; +import org.apache.zookeeper.server.util.SerializeUtils; +import org.apache.zookeeper.txn.TxnHeader; + +/** + * Observers are peers that do not take part in the atomic broadcast protocol. + * Instead, they are informed of successful proposals by the Leader. Observers + * therefore naturally act as a relay point for publishing the proposal stream + * and can relieve Followers of some of the connection load. Observers may + * submit proposals, but do not vote in their acceptance. + * + * See ZOOKEEPER-368 for a discussion of this feature. + */ +public class Observer extends Learner{ + + Observer(QuorumPeer self,ObserverZooKeeperServer observerZooKeeperServer) { + this.self = self; + this.zk=observerZooKeeperServer; + } + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(); + sb.append("Observer ").append(sock); + sb.append(" pendingRevalidationCount:") + .append(pendingRevalidations.size()); + return sb.toString(); + } + + /** + * the main method called by the observer to observe the leader + * + * @throws InterruptedException + */ + void observeLeader() throws InterruptedException { + zk.registerJMX(new ObserverBean(this, zk), self.jmxLocalPeerBean); + + try { + InetSocketAddress addr = findLeader(); + LOG.info("Observing " + addr); + try { + connectToLeader(addr); + long newLeaderZxid = registerWithLeader(Leader.OBSERVERINFO); + + syncWithLeader(newLeaderZxid); + QuorumPacket qp = new QuorumPacket(); + while (self.isRunning()) { + readPacket(qp); + processPacket(qp); + } + } catch (IOException e) { + LOG.warn("Exception when observing the leader", e); + try { + sock.close(); + } catch (IOException e1) { + e1.printStackTrace(); + } + + // clear pending revalidations + pendingRevalidations.clear(); + } + } finally { + zk.unregisterJMX(this); + } + } + + /** + * Controls the response of an observer to the receipt of a quorumpacket + * @param qp + * @throws IOException + */ + protected void processPacket(QuorumPacket qp) throws IOException{ + switch (qp.getType()) { + case Leader.PING: + ping(qp); + break; + case Leader.PROPOSAL: + LOG.warn("Ignoring proposal"); + break; + case Leader.COMMIT: + LOG.warn("Ignoring commit"); + break; + case Leader.UPTODATE: + LOG.error("Received an UPTODATE message after Observer started"); + break; + case Leader.REVALIDATE: + revalidate(qp); + break; + case Leader.SYNC: + ((ObserverZooKeeperServer)zk).sync(); + break; + case Leader.INFORM: + TxnHeader hdr = new TxnHeader(); + Record txn = SerializeUtils.deserializeTxn(qp.getData(), hdr); + Request request = new Request (null, hdr.getClientId(), + hdr.getCxid(), + hdr.getType(), null, null); + request.txn = txn; + request.hdr = hdr; + ObserverZooKeeperServer obs = (ObserverZooKeeperServer)zk; + obs.commitRequest(request); + break; + } + } + + /** + * Shutdown the Observer. + */ + public void shutdown() { + LOG.info("shutdown called", new Exception("shutdown Observer")); + super.shutdown(); + } +} + diff --git a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/quorum/ObserverMXBean.java b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/quorum/ObserverMXBean.java new file mode 100644 index 000000000..2c1799ab5 --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/quorum/ObserverMXBean.java @@ -0,0 +1,37 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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. + */ + +package org.apache.zookeeper.server.quorum; + +import org.apache.zookeeper.server.ZooKeeperServerMXBean; + +/** + * Observer MX Bean interface, implemented by ObserverBean + * + */ +public interface ObserverMXBean extends ZooKeeperServerMXBean { + /** + * @return count of pending revalidations + */ + public int getPendingRevalidationCount(); + + /** + * @return socket address + */ + public String getQuorumAddress(); +} diff --git a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/quorum/ObserverRequestProcessor.java b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/quorum/ObserverRequestProcessor.java new file mode 100644 index 000000000..e94414ff4 --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/quorum/ObserverRequestProcessor.java @@ -0,0 +1,126 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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. + */ + +package org.apache.zookeeper.server.quorum; + +import java.util.concurrent.LinkedBlockingQueue; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import org.apache.zookeeper.ZooDefs.OpCode; +import org.apache.zookeeper.server.RequestProcessor; +import org.apache.zookeeper.server.Request; +import org.apache.zookeeper.server.ZooTrace; + +/** + * This RequestProcessor forwards any requests that modify the state of the + * system to the Leader. + */ +public class ObserverRequestProcessor extends Thread implements + RequestProcessor { + private static final Logger LOG = LoggerFactory.getLogger(ObserverRequestProcessor.class); + + ObserverZooKeeperServer zks; + + RequestProcessor nextProcessor; + + // We keep a queue of requests. As requests get submitted they are + // stored here. The queue is drained in the run() method. + LinkedBlockingQueue queuedRequests = new LinkedBlockingQueue(); + + boolean finished = false; + + /** + * Constructor - takes an ObserverZooKeeperServer to associate with + * and the next processor to pass requests to after we're finished. + * @param zks + * @param nextProcessor + */ + public ObserverRequestProcessor(ObserverZooKeeperServer zks, + RequestProcessor nextProcessor) { + super("ObserverRequestProcessor:" + zks.getServerId()); + this.zks = zks; + this.nextProcessor = nextProcessor; + } + + @Override + public void run() { + try { + while (!finished) { + Request request = queuedRequests.take(); + if (LOG.isTraceEnabled()) { + ZooTrace.logRequest(LOG, ZooTrace.CLIENT_REQUEST_TRACE_MASK, + 'F', request, ""); + } + if (request == Request.requestOfDeath) { + break; + } + // We want to queue the request to be processed before we submit + // the request to the leader so that we are ready to receive + // the response + nextProcessor.processRequest(request); + + // We now ship the request to the leader. As with all + // other quorum operations, sync also follows this code + // path, but different from others, we need to keep track + // of the sync operations this Observer has pending, so we + // add it to pendingSyncs. + switch (request.type) { + case OpCode.sync: + zks.pendingSyncs.add(request); + zks.getObserver().request(request); + break; + case OpCode.create: + case OpCode.delete: + case OpCode.setData: + case OpCode.setACL: + case OpCode.createSession: + case OpCode.closeSession: + case OpCode.multi: + zks.getObserver().request(request); + break; + } + } + } catch (Exception e) { + LOG.error("Unexpected exception causing exit", e); + } + LOG.info("ObserverRequestProcessor exited loop!"); + } + + /** + * Simply queue the request, which will be processed in FIFO order. + */ + public void processRequest(Request request) { + if (!finished) { + queuedRequests.add(request); + } + } + + /** + * Shutdown the processor. + */ + public void shutdown() { + LOG.info("Shutting down"); + finished = true; + queuedRequests.clear(); + queuedRequests.add(Request.requestOfDeath); + nextProcessor.shutdown(); + } + +} diff --git a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/quorum/ObserverZooKeeperServer.java b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/quorum/ObserverZooKeeperServer.java new file mode 100644 index 000000000..4359b8dd2 --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/quorum/ObserverZooKeeperServer.java @@ -0,0 +1,147 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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. + */ +package org.apache.zookeeper.server.quorum; + +import java.io.IOException; +import java.util.concurrent.ConcurrentLinkedQueue; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.apache.zookeeper.server.FinalRequestProcessor; +import org.apache.zookeeper.server.Request; +import org.apache.zookeeper.server.RequestProcessor; +import org.apache.zookeeper.server.SyncRequestProcessor; +import org.apache.zookeeper.server.ZKDatabase; +import org.apache.zookeeper.server.persistence.FileTxnSnapLog; + +/** + * A ZooKeeperServer for the Observer node type. Not much is different, but + * we anticipate specializing the request processors in the future. + * + */ +public class ObserverZooKeeperServer extends LearnerZooKeeperServer { + private static final Logger LOG = + LoggerFactory.getLogger(ObserverZooKeeperServer.class); + + /** + * Enable since request processor for writing txnlog to disk and + * take periodic snapshot. Default is ON. + */ + + private boolean syncRequestProcessorEnabled = this.self.getSyncEnabled(); + + /* + * Request processors + */ + private CommitProcessor commitProcessor; + private SyncRequestProcessor syncProcessor; + + /* + * Pending sync requests + */ + ConcurrentLinkedQueue pendingSyncs = + new ConcurrentLinkedQueue(); + + ObserverZooKeeperServer(FileTxnSnapLog logFactory, QuorumPeer self, + DataTreeBuilder treeBuilder, ZKDatabase zkDb) throws IOException { + super(logFactory, self.tickTime, self.minSessionTimeout, + self.maxSessionTimeout, treeBuilder, zkDb, self); + LOG.info("syncEnabled =" + syncRequestProcessorEnabled); + } + + public Observer getObserver() { + return self.observer; + } + + @Override + public Learner getLearner() { + return self.observer; + } + + /** + * Unlike a Follower, which sees a full request only during the PROPOSAL + * phase, Observers get all the data required with the INFORM packet. + * This method commits a request that has been unpacked by from an INFORM + * received from the Leader. + * + * @param request + */ + public void commitRequest(Request request) { + if (syncRequestProcessorEnabled) { + // Write to txnlog and take periodic snapshot + syncProcessor.processRequest(request); + } + commitProcessor.commit(request); + } + + /** + * Set up the request processors for an Observer: + * firstProcesor->commitProcessor->finalProcessor + */ + @Override + protected void setupRequestProcessors() { + // We might consider changing the processor behaviour of + // Observers to, for example, remove the disk sync requirements. + // Currently, they behave almost exactly the same as followers. + RequestProcessor finalProcessor = new FinalRequestProcessor(this); + commitProcessor = new CommitProcessor(finalProcessor, + Long.toString(getServerId()), true); + commitProcessor.start(); + firstProcessor = new ObserverRequestProcessor(this, commitProcessor); + ((ObserverRequestProcessor) firstProcessor).start(); + + /* + * Observer should write to disk, so that the it won't request + * too old txn from the leader which may lead to getting an entire + * snapshot. + * + * However, this may degrade performance as it has to write to disk + * and do periodic snapshot which may double the memory requirements + */ + if (syncRequestProcessorEnabled) { + syncProcessor = new SyncRequestProcessor(this, null); + syncProcessor.start(); + } + } + + /* + * Process a sync request + */ + synchronized public void sync(){ + if(pendingSyncs.size() ==0){ + LOG.warn("Not expecting a sync."); + return; + } + + Request r = pendingSyncs.remove(); + commitProcessor.commit(r); + } + + @Override + public String getState() { + return "observer"; + }; + + @Override + public void shutdown() { + super.shutdown(); + if (syncRequestProcessorEnabled && syncProcessor != null) { + syncProcessor.shutdown(); + } + } +} diff --git a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/quorum/ProposalRequestProcessor.java b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/quorum/ProposalRequestProcessor.java new file mode 100644 index 000000000..641262e10 --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/quorum/ProposalRequestProcessor.java @@ -0,0 +1,93 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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. + */ + +package org.apache.zookeeper.server.quorum; + +import org.apache.zookeeper.server.Request; +import org.apache.zookeeper.server.RequestProcessor; +import org.apache.zookeeper.server.SyncRequestProcessor; +import org.apache.zookeeper.server.quorum.Leader.XidRolloverException; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * This RequestProcessor simply forwards requests to an AckRequestProcessor and + * SyncRequestProcessor. + */ +public class ProposalRequestProcessor implements RequestProcessor { + private static final Logger LOG = + LoggerFactory.getLogger(ProposalRequestProcessor.class); + + LeaderZooKeeperServer zks; + + RequestProcessor nextProcessor; + + SyncRequestProcessor syncProcessor; + + public ProposalRequestProcessor(LeaderZooKeeperServer zks, + RequestProcessor nextProcessor) { + this.zks = zks; + this.nextProcessor = nextProcessor; + AckRequestProcessor ackProcessor = new AckRequestProcessor(zks.getLeader()); + syncProcessor = new SyncRequestProcessor(zks, ackProcessor); + } + + /** + * initialize this processor + */ + public void initialize() { + syncProcessor.start(); + } + + public void processRequest(Request request) throws RequestProcessorException { + // LOG.warn("Ack>>> cxid = " + request.cxid + " type = " + + // request.type + " id = " + request.sessionId); + // request.addRQRec(">prop"); + + + /* In the following IF-THEN-ELSE block, we process syncs on the leader. + * If the sync is coming from a follower, then the follower + * handler adds it to syncHandler. Otherwise, if it is a client of + * the leader that issued the sync command, then syncHandler won't + * contain the handler. In this case, we add it to syncHandler, and + * call processRequest on the next processor. + */ + + if(request instanceof LearnerSyncRequest){ + zks.getLeader().processSync((LearnerSyncRequest)request); + } else { + nextProcessor.processRequest(request); + if (request.hdr != null) { + // We need to sync and get consensus on any transactions + try { + zks.getLeader().propose(request); + } catch (XidRolloverException e) { + throw new RequestProcessorException(e.getMessage(), e); + } + syncProcessor.processRequest(request); + } + } + } + + public void shutdown() { + LOG.info("Shutting down"); + nextProcessor.shutdown(); + syncProcessor.shutdown(); + } + +} diff --git a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/quorum/QuorumBean.java b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/quorum/QuorumBean.java new file mode 100644 index 000000000..ef4036aae --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/quorum/QuorumBean.java @@ -0,0 +1,44 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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. + */ + +package org.apache.zookeeper.server.quorum; + +import org.apache.zookeeper.jmx.ZKMBeanInfo; +import org.apache.zookeeper.server.quorum.QuorumPeer; + +public class QuorumBean implements QuorumMXBean, ZKMBeanInfo { + private final QuorumPeer peer; + private final String name; + + public QuorumBean(QuorumPeer peer){ + this.peer = peer; + name = "ReplicatedServer_id" + peer.getMyid(); + } + + public String getName() { + return name; + } + + public boolean isHidden() { + return false; + } + + public int getQuorumSize() { + return peer.getQuorumSize(); + } +} diff --git a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/quorum/QuorumCnxManager.java b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/quorum/QuorumCnxManager.java new file mode 100644 index 000000000..eacea312b --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/quorum/QuorumCnxManager.java @@ -0,0 +1,903 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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. + */ + +package org.apache.zookeeper.server.quorum; + +import java.io.DataInputStream; +import java.io.DataOutputStream; +import java.io.IOException; +import java.net.InetSocketAddress; +import java.net.ServerSocket; +import java.net.Socket; +import java.net.SocketException; +import java.nio.BufferUnderflowException; +import java.nio.ByteBuffer; +import java.nio.channels.UnresolvedAddressException; +import java.util.Enumeration; +import java.util.concurrent.ArrayBlockingQueue; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.TimeUnit; +import java.util.NoSuchElementException; +import java.util.concurrent.atomic.AtomicInteger; +import java.util.Date; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import org.apache.zookeeper.server.ZooKeeperServer; + +/** + * This class implements a connection manager for leader election using TCP. It + * maintains one connection for every pair of servers. The tricky part is to + * guarantee that there is exactly one connection for every pair of servers that + * are operating correctly and that can communicate over the network. + * + * If two servers try to start a connection concurrently, then the connection + * manager uses a very simple tie-breaking mechanism to decide which connection + * to drop based on the IP addressed of the two parties. + * + * For every peer, the manager maintains a queue of messages to send. If the + * connection to any particular peer drops, then the sender thread puts the + * message back on the list. As this implementation currently uses a queue + * implementation to maintain messages to send to another peer, we add the + * message to the tail of the queue, thus changing the order of messages. + * Although this is not a problem for the leader election, it could be a problem + * when consolidating peer communication. This is to be verified, though. + * + */ + +public class QuorumCnxManager { + private static final Logger LOG = LoggerFactory.getLogger(QuorumCnxManager.class); + + /* + * Maximum capacity of thread queues + */ + static final int RECV_CAPACITY = 100; + // Initialized to 1 to prevent sending + // stale notifications to peers + static final int SEND_CAPACITY = 1; + + static final int PACKETMAXSIZE = 1024 * 512; + /* + * Maximum number of attempts to connect to a peer + */ + + static final int MAX_CONNECTION_ATTEMPTS = 2; + + /* + * Negative counter for observer server ids. + */ + + private long observerCounter = -1; + + /* + * Connection time out value in milliseconds + */ + + private int cnxTO = 5000; + + /* + * Local IP address + */ + final QuorumPeer self; + + /* + * Mapping from Peer to Thread number + */ + final ConcurrentHashMap senderWorkerMap; + final ConcurrentHashMap> queueSendMap; + final ConcurrentHashMap lastMessageSent; + + /* + * Reception queue + */ + public final ArrayBlockingQueue recvQueue; + /* + * Object to synchronize access to recvQueue + */ + private final Object recvQLock = new Object(); + + /* + * Shutdown flag + */ + + volatile boolean shutdown = false; + + /* + * Listener thread + */ + public final Listener listener; + + /* + * Counter to count worker threads + */ + private AtomicInteger threadCnt = new AtomicInteger(0); + + static public class Message { + + Message(ByteBuffer buffer, long sid) { + this.buffer = buffer; + this.sid = sid; + } + + ByteBuffer buffer; + long sid; + } + + public QuorumCnxManager(QuorumPeer self) { + this.recvQueue = new ArrayBlockingQueue(RECV_CAPACITY); + this.queueSendMap = new ConcurrentHashMap>(); + this.senderWorkerMap = new ConcurrentHashMap(); + this.lastMessageSent = new ConcurrentHashMap(); + + String cnxToValue = System.getProperty("zookeeper.cnxTimeout"); + if(cnxToValue != null){ + this.cnxTO = new Integer(cnxToValue); + } + + this.self = self; + + // Starts listener thread that waits for connection requests + listener = new Listener(); + } + + /** + * Invokes initiateConnection for testing purposes + * + * @param sid + */ + public void testInitiateConnection(long sid) throws Exception { + if (LOG.isDebugEnabled()) { + LOG.debug("Opening channel to server " + sid); + } + Socket sock = new Socket(); + setSockOpts(sock); + sock.connect(self.getVotingView().get(sid).electionAddr, cnxTO); + initiateConnection(sock, sid); + } + + /** + * If this server has initiated the connection, then it gives up on the + * connection if it loses challenge. Otherwise, it keeps the connection. + */ + public boolean initiateConnection(Socket sock, Long sid) { + DataOutputStream dout = null; + try { + // Sending id and challenge + dout = new DataOutputStream(sock.getOutputStream()); + dout.writeLong(self.getId()); + dout.flush(); + } catch (IOException e) { + LOG.warn("Ignoring exception reading or writing challenge: ", e); + closeSocket(sock); + return false; + } + + // If lost the challenge, then drop the new connection + if (sid > self.getId()) { + LOG.info("Have smaller server identifier, so dropping the " + + "connection: (" + sid + ", " + self.getId() + ")"); + closeSocket(sock); + // Otherwise proceed with the connection + } else { + SendWorker sw = new SendWorker(sock, sid); + RecvWorker rw = new RecvWorker(sock, sid, sw); + sw.setRecv(rw); + + SendWorker vsw = senderWorkerMap.get(sid); + + if(vsw != null) + vsw.finish(); + + senderWorkerMap.put(sid, sw); + if (!queueSendMap.containsKey(sid)) { + queueSendMap.put(sid, new ArrayBlockingQueue( + SEND_CAPACITY)); + } + + sw.start(); + rw.start(); + + return true; + + } + return false; + } + + + + /** + * If this server receives a connection request, then it gives up on the new + * connection if it wins. Notice that it checks whether it has a connection + * to this server already or not. If it does, then it sends the smallest + * possible long value to lose the challenge. + * + */ + public boolean receiveConnection(Socket sock) { + Long sid = null; + + try { + // Read server id + DataInputStream din = new DataInputStream(sock.getInputStream()); + sid = din.readLong(); + if (sid < 0) { // this is not a server id but a protocol version (see ZOOKEEPER-1633) + sid = din.readLong(); + // next comes the #bytes in the remainder of the message + int num_remaining_bytes = din.readInt(); + byte[] b = new byte[num_remaining_bytes]; + // remove the remainder of the message from din + int num_read = din.read(b); + if (num_read != num_remaining_bytes) { + LOG.error("Read only " + num_read + " bytes out of " + num_remaining_bytes + " sent by server " + sid); + } + } + if (sid == QuorumPeer.OBSERVER_ID) { + /* + * Choose identifier at random. We need a value to identify + * the connection. + */ + + sid = observerCounter--; + LOG.info("Setting arbitrary identifier to observer: " + sid); + } + } catch (IOException e) { + closeSocket(sock); + LOG.warn("Exception reading or writing challenge: " + e.toString()); + return false; + } + + //If wins the challenge, then close the new connection. + if (sid < self.getId()) { + /* + * This replica might still believe that the connection to sid is + * up, so we have to shut down the workers before trying to open a + * new connection. + */ + SendWorker sw = senderWorkerMap.get(sid); + if (sw != null) { + sw.finish(); + } + + /* + * Now we start a new connection + */ + LOG.debug("Create new connection to server: " + sid); + closeSocket(sock); + connectOne(sid); + + // Otherwise start worker threads to receive data. + } else { + SendWorker sw = new SendWorker(sock, sid); + RecvWorker rw = new RecvWorker(sock, sid, sw); + sw.setRecv(rw); + + SendWorker vsw = senderWorkerMap.get(sid); + + if(vsw != null) + vsw.finish(); + + senderWorkerMap.put(sid, sw); + + if (!queueSendMap.containsKey(sid)) { + queueSendMap.put(sid, new ArrayBlockingQueue( + SEND_CAPACITY)); + } + + sw.start(); + rw.start(); + + return true; + } + return false; + } + + /** + * Processes invoke this message to queue a message to send. Currently, + * only leader election uses it. + */ + public void toSend(Long sid, ByteBuffer b) { + /* + * If sending message to myself, then simply enqueue it (loopback). + */ + if (self.getId() == sid) { + b.position(0); + addToRecvQueue(new Message(b.duplicate(), sid)); + /* + * Otherwise send to the corresponding thread to send. + */ + } else { + /* + * Start a new connection if doesn't have one already. + */ + if (!queueSendMap.containsKey(sid)) { + ArrayBlockingQueue bq = new ArrayBlockingQueue( + SEND_CAPACITY); + queueSendMap.put(sid, bq); + addToSendQueue(bq, b); + + } else { + ArrayBlockingQueue bq = queueSendMap.get(sid); + if(bq != null){ + addToSendQueue(bq, b); + } else { + LOG.error("No queue for server " + sid); + } + } + connectOne(sid); + + } + } + + /** + * Try to establish a connection to server with id sid. + * + * @param sid server id + */ + + synchronized void connectOne(long sid){ + if (senderWorkerMap.get(sid) == null){ + InetSocketAddress electionAddr; + if (self.quorumPeers.containsKey(sid)) { + electionAddr = self.quorumPeers.get(sid).electionAddr; + } else { + LOG.warn("Invalid server id: " + sid); + return; + } + try { + + if (LOG.isDebugEnabled()) { + LOG.debug("Opening channel to server " + sid); + } + Socket sock = new Socket(); + setSockOpts(sock); + sock.connect(self.getView().get(sid).electionAddr, cnxTO); + if (LOG.isDebugEnabled()) { + LOG.debug("Connected to server " + sid); + } + initiateConnection(sock, sid); + } catch (UnresolvedAddressException e) { + // Sun doesn't include the address that causes this + // exception to be thrown, also UAE cannot be wrapped cleanly + // so we log the exception in order to capture this critical + // detail. + LOG.warn("Cannot open channel to " + sid + + " at election address " + electionAddr, e); + throw e; + } catch (IOException e) { + LOG.warn("Cannot open channel to " + sid + + " at election address " + electionAddr, + e); + } + } else { + LOG.debug("There is a connection already for server " + sid); + } + } + + + /** + * Try to establish a connection with each server if one + * doesn't exist. + */ + + public void connectAll(){ + long sid; + for(Enumeration en = queueSendMap.keys(); + en.hasMoreElements();){ + sid = en.nextElement(); + connectOne(sid); + } + } + + + /** + * Check if all queues are empty, indicating that all messages have been delivered. + */ + boolean haveDelivered() { + for (ArrayBlockingQueue queue : queueSendMap.values()) { + LOG.debug("Queue size: " + queue.size()); + if (queue.size() == 0) { + return true; + } + } + + return false; + } + + /** + * Flag that it is time to wrap up all activities and interrupt the listener. + */ + public void halt() { + shutdown = true; + LOG.debug("Halting listener"); + listener.halt(); + + softHalt(); + } + + /** + * A soft halt simply finishes workers. + */ + public void softHalt() { + for (SendWorker sw : senderWorkerMap.values()) { + LOG.debug("Halting sender: " + sw); + sw.finish(); + } + } + + /** + * Helper method to set socket options. + * + * @param sock + * Reference to socket + */ + private void setSockOpts(Socket sock) throws SocketException { + sock.setTcpNoDelay(true); + sock.setSoTimeout(self.tickTime * self.syncLimit); + } + + /** + * Helper method to close a socket. + * + * @param sock + * Reference to socket + */ + private void closeSocket(Socket sock) { + try { + sock.close(); + } catch (IOException ie) { + LOG.error("Exception while closing", ie); + } + } + + /** + * Return number of worker threads + */ + public long getThreadCount() { + return threadCnt.get(); + } + /** + * Return reference to QuorumPeer + */ + public QuorumPeer getQuorumPeer() { + return self; + } + + /** + * Thread to listen on some port + */ + public class Listener extends Thread { + + volatile ServerSocket ss = null; + + /** + * Sleeps on accept(). + */ + @Override + public void run() { + int numRetries = 0; + InetSocketAddress addr; + while((!shutdown) && (numRetries < 3)){ + try { + ss = new ServerSocket(); + ss.setReuseAddress(true); + if (self.getQuorumListenOnAllIPs()) { + int port = self.quorumPeers.get(self.getId()).electionAddr.getPort(); + addr = new InetSocketAddress(port); + } else { + addr = self.quorumPeers.get(self.getId()).electionAddr; + } + LOG.info("My election bind port: " + addr.toString()); + setName(self.quorumPeers.get(self.getId()).electionAddr + .toString()); + ss.bind(addr); + while (!shutdown) { + Socket client = ss.accept(); + setSockOpts(client); + LOG.info("Received connection request " + + client.getRemoteSocketAddress()); + receiveConnection(client); + numRetries = 0; + } + } catch (IOException e) { + LOG.error("Exception while listening", e); + numRetries++; + try { + ss.close(); + Thread.sleep(1000); + } catch (IOException ie) { + LOG.error("Error closing server socket", ie); + } catch (InterruptedException ie) { + LOG.error("Interrupted while sleeping. " + + "Ignoring exception", ie); + } + } + } + LOG.info("Leaving listener"); + if (!shutdown) { + LOG.error("As I'm leaving the listener thread, " + + "I won't be able to participate in leader " + + "election any longer: " + + self.quorumPeers.get(self.getId()).electionAddr); + } + } + + /** + * Halts this listener thread. + */ + void halt(){ + try{ + LOG.debug("Trying to close listener: " + ss); + if(ss != null) { + LOG.debug("Closing listener: " + self.getId()); + ss.close(); + } + } catch (IOException e){ + LOG.warn("Exception when shutting down listener: " + e); + } + } + } + + /** + * Thread to send messages. Instance waits on a queue, and send a message as + * soon as there is one available. If connection breaks, then opens a new + * one. + */ + class SendWorker extends Thread { + Long sid; + Socket sock; + RecvWorker recvWorker; + volatile boolean running = true; + DataOutputStream dout; + + /** + * An instance of this thread receives messages to send + * through a queue and sends them to the server sid. + * + * @param sock + * Socket to remote peer + * @param sid + * Server identifier of remote peer + */ + SendWorker(Socket sock, Long sid) { + super("SendWorker:" + sid); + this.sid = sid; + this.sock = sock; + recvWorker = null; + try { + dout = new DataOutputStream(sock.getOutputStream()); + } catch (IOException e) { + LOG.error("Unable to access socket output stream", e); + closeSocket(sock); + running = false; + } + LOG.debug("Address of remote peer: " + this.sid); + } + + synchronized void setRecv(RecvWorker recvWorker) { + this.recvWorker = recvWorker; + } + + /** + * Returns RecvWorker that pairs up with this SendWorker. + * + * @return RecvWorker + */ + synchronized RecvWorker getRecvWorker(){ + return recvWorker; + } + + synchronized boolean finish() { + if (LOG.isDebugEnabled()) { + LOG.debug("Calling finish for " + sid); + } + + if(!running){ + /* + * Avoids running finish() twice. + */ + return running; + } + + running = false; + closeSocket(sock); + // channel = null; + + this.interrupt(); + if (recvWorker != null) { + recvWorker.finish(); + } + + if (LOG.isDebugEnabled()) { + LOG.debug("Removing entry from senderWorkerMap sid=" + sid); + } + senderWorkerMap.remove(sid, this); + threadCnt.decrementAndGet(); + return running; + } + + synchronized void send(ByteBuffer b) throws IOException { + byte[] msgBytes = new byte[b.capacity()]; + try { + b.position(0); + b.get(msgBytes); + } catch (BufferUnderflowException be) { + LOG.error("BufferUnderflowException ", be); + return; + } + dout.writeInt(b.capacity()); + dout.write(b.array()); + dout.flush(); + } + + @Override + public void run() { + threadCnt.incrementAndGet(); + try { + /** + * If there is nothing in the queue to send, then we + * send the lastMessage to ensure that the last message + * was received by the peer. The message could be dropped + * in case self or the peer shutdown their connection + * (and exit the thread) prior to reading/processing + * the last message. Duplicate messages are handled correctly + * by the peer. + * + * If the send queue is non-empty, then we have a recent + * message than that stored in lastMessage. To avoid sending + * stale message, we should send the message in the send queue. + */ + ArrayBlockingQueue bq = queueSendMap.get(sid); + if (bq == null || isSendQueueEmpty(bq)) { + ByteBuffer b = lastMessageSent.get(sid); + if (b != null) { + LOG.debug("Attempting to send lastMessage to sid=" + sid); + send(b); + } + } + } catch (IOException e) { + LOG.error("Failed to send last message. Shutting down thread.", e); + this.finish(); + } + + try { + while (running && !shutdown && sock != null) { + + ByteBuffer b = null; + try { + ArrayBlockingQueue bq = queueSendMap + .get(sid); + if (bq != null) { + b = pollSendQueue(bq, 1000, TimeUnit.MILLISECONDS); + } else { + LOG.error("No queue of incoming messages for " + + "server " + sid); + break; + } + + if(b != null){ + lastMessageSent.put(sid, b); + send(b); + } + } catch (InterruptedException e) { + LOG.warn("Interrupted while waiting for message on queue", + e); + } + } + } catch (Exception e) { + LOG.warn("Exception when using channel: for id " + sid + " my id = " + + self.getId() + " error = " + e); + } + this.finish(); + LOG.warn("Send worker leaving thread"); + } + } + + /** + * Thread to receive messages. Instance waits on a socket read. If the + * channel breaks, then removes itself from the pool of receivers. + */ + class RecvWorker extends Thread { + Long sid; + Socket sock; + volatile boolean running = true; + DataInputStream din; + final SendWorker sw; + + RecvWorker(Socket sock, Long sid, SendWorker sw) { + super("RecvWorker:" + sid); + this.sid = sid; + this.sock = sock; + this.sw = sw; + try { + din = new DataInputStream(sock.getInputStream()); + // OK to wait until socket disconnects while reading. + sock.setSoTimeout(0); + } catch (IOException e) { + LOG.error("Error while accessing socket for " + sid, e); + closeSocket(sock); + running = false; + } + } + + /** + * Shuts down this worker + * + * @return boolean Value of variable running + */ + synchronized boolean finish() { + if(!running){ + /* + * Avoids running finish() twice. + */ + return running; + } + running = false; + + this.interrupt(); + threadCnt.decrementAndGet(); + return running; + } + + @Override + public void run() { + threadCnt.incrementAndGet(); + try { + while (running && !shutdown && sock != null) { + /** + * Reads the first int to determine the length of the + * message + */ + int length = din.readInt(); + if (length <= 0 || length > PACKETMAXSIZE) { + throw new IOException( + "Received packet with invalid packet: " + + length); + } + /** + * Allocates a new ByteBuffer to receive the message + */ + byte[] msgArray = new byte[length]; + din.readFully(msgArray, 0, length); + ByteBuffer message = ByteBuffer.wrap(msgArray); + addToRecvQueue(new Message(message.duplicate(), sid)); + } + } catch (Exception e) { + LOG.warn("Connection broken for id " + sid + ", my id = " + + self.getId() + ", error = " , e); + } finally { + LOG.warn("Interrupting SendWorker"); + sw.finish(); + if (sock != null) { + closeSocket(sock); + } + } + } + } + + /** + * Inserts an element in the specified queue. If the Queue is full, this + * method removes an element from the head of the Queue and then inserts + * the element at the tail. It can happen that the an element is removed + * by another thread in {@link SendWorker#processMessage() processMessage} + * method before this method attempts to remove an element from the queue. + * This will cause {@link ArrayBlockingQueue#remove() remove} to throw an + * exception, which is safe to ignore. + * + * Unlike {@link #addToRecvQueue(Message) addToRecvQueue} this method does + * not need to be synchronized since there is only one thread that inserts + * an element in the queue and another thread that reads from the queue. + * + * @param queue + * Reference to the Queue + * @param buffer + * Reference to the buffer to be inserted in the queue + */ + private void addToSendQueue(ArrayBlockingQueue queue, + ByteBuffer buffer) { + if (queue.remainingCapacity() == 0) { + try { + queue.remove(); + } catch (NoSuchElementException ne) { + // element could be removed by poll() + LOG.debug("Trying to remove from an empty " + + "Queue. Ignoring exception " + ne); + } + } + try { + queue.add(buffer); + } catch (IllegalStateException ie) { + // This should never happen + LOG.error("Unable to insert an element in the queue " + ie); + } + } + + /** + * Returns true if queue is empty. + * @param queue + * Reference to the queue + * @return + * true if the specified queue is empty + */ + private boolean isSendQueueEmpty(ArrayBlockingQueue queue) { + return queue.isEmpty(); + } + + /** + * Retrieves and removes buffer at the head of this queue, + * waiting up to the specified wait time if necessary for an element to + * become available. + * + * {@link ArrayBlockingQueue#poll(long, java.util.concurrent.TimeUnit)} + */ + private ByteBuffer pollSendQueue(ArrayBlockingQueue queue, + long timeout, TimeUnit unit) throws InterruptedException { + return queue.poll(timeout, unit); + } + + /** + * Inserts an element in the {@link #recvQueue}. If the Queue is full, this + * methods removes an element from the head of the Queue and then inserts + * the element at the tail of the queue. + * + * This method is synchronized to achieve fairness between two threads that + * are trying to insert an element in the queue. Each thread checks if the + * queue is full, then removes the element at the head of the queue, and + * then inserts an element at the tail. This three-step process is done to + * prevent a thread from blocking while inserting an element in the queue. + * If we do not synchronize the call to this method, then a thread can grab + * a slot in the queue created by the second thread. This can cause the call + * to insert by the second thread to fail. + * Note that synchronizing this method does not block another thread + * from polling the queue since that synchronization is provided by the + * queue itself. + * + * @param msg + * Reference to the message to be inserted in the queue + */ + public void addToRecvQueue(Message msg) { + synchronized(recvQLock) { + if (recvQueue.remainingCapacity() == 0) { + try { + recvQueue.remove(); + } catch (NoSuchElementException ne) { + // element could be removed by poll() + LOG.debug("Trying to remove from an empty " + + "recvQueue. Ignoring exception " + ne); + } + } + try { + recvQueue.add(msg); + } catch (IllegalStateException ie) { + // This should never happen + LOG.error("Unable to insert element in the recvQueue " + ie); + } + } + } + + /** + * Retrieves and removes a message at the head of this queue, + * waiting up to the specified wait time if necessary for an element to + * become available. + * + * {@link ArrayBlockingQueue#poll(long, java.util.concurrent.TimeUnit)} + */ + public Message pollRecvQueue(long timeout, TimeUnit unit) + throws InterruptedException { + return recvQueue.poll(timeout, unit); + } +} diff --git a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/quorum/QuorumMXBean.java b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/quorum/QuorumMXBean.java new file mode 100644 index 000000000..2edce68d9 --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/quorum/QuorumMXBean.java @@ -0,0 +1,34 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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. + */ + +package org.apache.zookeeper.server.quorum; + +/** + * An MBean representing a zookeeper cluster nodes (aka quorum peers) + */ +public interface QuorumMXBean { + /** + * @return the name of the quorum + */ + public String getName(); + + /** + * @return configured number of peers in the quorum + */ + public int getQuorumSize(); +} diff --git a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/quorum/QuorumPeer.java b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/quorum/QuorumPeer.java new file mode 100644 index 000000000..df2a7413f --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/quorum/QuorumPeer.java @@ -0,0 +1,1249 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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. + */ +package org.apache.zookeeper.server.quorum; + +import java.io.BufferedReader; +import java.io.BufferedWriter; +import java.io.File; +import java.io.FileNotFoundException; +import java.io.FileReader; +import java.io.IOException; +import java.io.OutputStreamWriter; +import java.net.DatagramPacket; +import java.net.DatagramSocket; +import java.net.InetSocketAddress; +import java.net.SocketException; +import java.nio.ByteBuffer; +import java.util.ArrayList; +import java.util.Collections; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import org.apache.zookeeper.common.AtomicFileOutputStream; +import org.apache.zookeeper.jmx.MBeanRegistry; +import org.apache.zookeeper.jmx.ZKMBeanInfo; +import org.apache.zookeeper.server.ServerCnxnFactory; +import org.apache.zookeeper.server.ZKDatabase; +import org.apache.zookeeper.server.ZooKeeperServer; +import org.apache.zookeeper.server.persistence.FileTxnSnapLog; +import org.apache.zookeeper.server.quorum.flexible.QuorumMaj; +import org.apache.zookeeper.server.quorum.flexible.QuorumVerifier; +import org.apache.zookeeper.server.util.ZxidUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * This class manages the quorum protocol. There are three states this server + * can be in: + *
        + *
      1. Leader election - each server will elect a leader (proposing itself as a + * leader initially).
      2. + *
      3. Follower - the server will synchronize with the leader and replicate any + * transactions.
      4. + *
      5. Leader - the server will process requests and forward them to followers. + * A majority of followers must log the request before it can be accepted. + *
      + * + * This class will setup a datagram socket that will always respond with its + * view of the current leader. The response will take the form of: + * + *
      + * int xid;
      + *
      + * long myid;
      + *
      + * long leader_id;
      + *
      + * long leader_zxid;
      + * 
      + * + * The request for the current leader will consist solely of an xid: int xid; + */ +public class QuorumPeer extends Thread implements QuorumStats.Provider { + private static final Logger LOG = LoggerFactory.getLogger(QuorumPeer.class); + + QuorumBean jmxQuorumBean; + LocalPeerBean jmxLocalPeerBean; + LeaderElectionBean jmxLeaderElectionBean; + QuorumCnxManager qcm; + + /* ZKDatabase is a top level member of quorumpeer + * which will be used in all the zookeeperservers + * instantiated later. Also, it is created once on + * bootup and only thrown away in case of a truncate + * message from the leader + */ + private ZKDatabase zkDb; + + public static class QuorumServer { + public QuorumServer(long id, InetSocketAddress addr, + InetSocketAddress electionAddr) { + this.id = id; + this.addr = addr; + this.electionAddr = electionAddr; + } + + public QuorumServer(long id, InetSocketAddress addr) { + this.id = id; + this.addr = addr; + this.electionAddr = null; + } + + public QuorumServer(long id, InetSocketAddress addr, + InetSocketAddress electionAddr, LearnerType type) { + this.id = id; + this.addr = addr; + this.electionAddr = electionAddr; + this.type = type; + } + + public InetSocketAddress addr; + + public InetSocketAddress electionAddr; + + public long id; + + public LearnerType type = LearnerType.PARTICIPANT; + } + + public enum ServerState { + LOOKING, FOLLOWING, LEADING, OBSERVING; + } + + /* + * A peer can either be participating, which implies that it is willing to + * both vote in instances of consensus and to elect or become a Leader, or + * it may be observing in which case it isn't. + * + * We need this distinction to decide which ServerState to move to when + * conditions change (e.g. which state to become after LOOKING). + */ + public enum LearnerType { + PARTICIPANT, OBSERVER; + } + + /* + * To enable observers to have no identifier, we need a generic identifier + * at least for QuorumCnxManager. We use the following constant to as the + * value of such a generic identifier. + */ + + static final long OBSERVER_ID = Long.MAX_VALUE; + + /* + * Record leader election time + */ + public long start_fle, end_fle; + + /* + * Default value of peer is participant + */ + private LearnerType learnerType = LearnerType.PARTICIPANT; + + public LearnerType getLearnerType() { + return learnerType; + } + + /** + * Sets the LearnerType both in the QuorumPeer and in the peerMap + */ + public void setLearnerType(LearnerType p) { + learnerType = p; + if (quorumPeers.containsKey(this.myid)) { + this.quorumPeers.get(myid).type = p; + } else { + LOG.error("Setting LearnerType to " + p + " but " + myid + + " not in QuorumPeers. "); + } + + } + /** + * The servers that make up the cluster + */ + protected Map quorumPeers; + public int getQuorumSize(){ + return getVotingView().size(); + } + + /** + * QuorumVerifier implementation; default (majority). + */ + + private QuorumVerifier quorumConfig; + + /** + * My id + */ + private long myid; + + + /** + * get the id of this quorum peer. + */ + public long getId() { + return myid; + } + + /** + * This is who I think the leader currently is. + */ + volatile private Vote currentVote; + + /** + * ... and its counterpart for backward compatibility + */ + volatile private Vote bcVote; + + public synchronized Vote getCurrentVote(){ + return currentVote; + } + + public synchronized void setCurrentVote(Vote v){ + currentVote = v; + } + + synchronized Vote getBCVote() { + if (bcVote == null) { + return currentVote; + } else { + return bcVote; + } + } + + synchronized void setBCVote(Vote v) { + bcVote = v; + } + + volatile boolean running = true; + + /** + * The number of milliseconds of each tick + */ + protected int tickTime; + + /** + * Minimum number of milliseconds to allow for session timeout. + * A value of -1 indicates unset, use default. + */ + protected int minSessionTimeout = -1; + + /** + * Maximum number of milliseconds to allow for session timeout. + * A value of -1 indicates unset, use default. + */ + protected int maxSessionTimeout = -1; + + /** + * The number of ticks that the initial synchronization phase can take + */ + protected int initLimit; + + /** + * The number of ticks that can pass between sending a request and getting + * an acknowledgment + */ + protected int syncLimit; + + /** + * Enables/Disables sync request processor. This option is enabled + * by default and is to be used with observers. + */ + protected boolean syncEnabled = true; + + /** + * The current tick + */ + protected volatile int tick; + + /** + * Whether or not to listen on all IPs for the two quorum ports + * (broadcast and fast leader election). + */ + protected boolean quorumListenOnAllIPs = false; + + /** + * @deprecated As of release 3.4.0, this class has been deprecated, since + * it is used with one of the udp-based versions of leader election, which + * we are also deprecating. + * + * This class simply responds to requests for the current leader of this + * node. + *

      + * The request contains just an xid generated by the requestor. + *

      + * The response has the xid, the id of this server, the id of the leader, + * and the zxid of the leader. + * + * + */ + @Deprecated + class ResponderThread extends Thread { + ResponderThread() { + super("ResponderThread"); + } + + volatile boolean running = true; + + @Override + public void run() { + try { + byte b[] = new byte[36]; + ByteBuffer responseBuffer = ByteBuffer.wrap(b); + DatagramPacket packet = new DatagramPacket(b, b.length); + while (running) { + udpSocket.receive(packet); + if (packet.getLength() != 4) { + LOG.warn("Got more than just an xid! Len = " + + packet.getLength()); + } else { + responseBuffer.clear(); + responseBuffer.getInt(); // Skip the xid + responseBuffer.putLong(myid); + Vote current = getCurrentVote(); + switch (getPeerState()) { + case LOOKING: + responseBuffer.putLong(current.getId()); + responseBuffer.putLong(current.getZxid()); + break; + case LEADING: + responseBuffer.putLong(myid); + try { + long proposed; + synchronized(leader) { + proposed = leader.lastProposed; + } + responseBuffer.putLong(proposed); + } catch (NullPointerException npe) { + // This can happen in state transitions, + // just ignore the request + } + break; + case FOLLOWING: + responseBuffer.putLong(current.getId()); + try { + responseBuffer.putLong(follower.getZxid()); + } catch (NullPointerException npe) { + // This can happen in state transitions, + // just ignore the request + } + break; + case OBSERVING: + // Do nothing, Observers keep themselves to + // themselves. + break; + } + packet.setData(b); + udpSocket.send(packet); + } + packet.setLength(b.length); + } + } catch (RuntimeException e) { + LOG.warn("Unexpected runtime exception in ResponderThread",e); + } catch (IOException e) { + LOG.warn("Unexpected IO exception in ResponderThread",e); + } finally { + LOG.warn("QuorumPeer responder thread exited"); + } + } + } + + private ServerState state = ServerState.LOOKING; + + public synchronized void setPeerState(ServerState newState){ + state=newState; + } + + public synchronized ServerState getPeerState(){ + return state; + } + + DatagramSocket udpSocket; + + private InetSocketAddress myQuorumAddr; + + public InetSocketAddress getQuorumAddress(){ + return myQuorumAddr; + } + + private int electionType; + + Election electionAlg; + + ServerCnxnFactory cnxnFactory; + private FileTxnSnapLog logFactory = null; + + private final QuorumStats quorumStats; + + public QuorumPeer() { + super("QuorumPeer"); + quorumStats = new QuorumStats(this); + } + + + /** + * For backward compatibility purposes, we instantiate QuorumMaj by default. + */ + + public QuorumPeer(Map quorumPeers, File dataDir, + File dataLogDir, int electionType, + long myid, int tickTime, int initLimit, int syncLimit, + ServerCnxnFactory cnxnFactory) throws IOException { + this(quorumPeers, dataDir, dataLogDir, electionType, myid, tickTime, + initLimit, syncLimit, false, cnxnFactory, + new QuorumMaj(countParticipants(quorumPeers))); + } + + public QuorumPeer(Map quorumPeers, File dataDir, + File dataLogDir, int electionType, + long myid, int tickTime, int initLimit, int syncLimit, + boolean quorumListenOnAllIPs, + ServerCnxnFactory cnxnFactory, + QuorumVerifier quorumConfig) throws IOException { + this(); + this.cnxnFactory = cnxnFactory; + this.quorumPeers = quorumPeers; + this.electionType = electionType; + this.myid = myid; + this.tickTime = tickTime; + this.initLimit = initLimit; + this.syncLimit = syncLimit; + this.quorumListenOnAllIPs = quorumListenOnAllIPs; + this.logFactory = new FileTxnSnapLog(dataLogDir, dataDir); + this.zkDb = new ZKDatabase(this.logFactory); + if(quorumConfig == null) + this.quorumConfig = new QuorumMaj(countParticipants(quorumPeers)); + else this.quorumConfig = quorumConfig; + } + + QuorumStats quorumStats() { + return quorumStats; + } + + @Override + public synchronized void start() { + loadDataBase(); + cnxnFactory.start(); + startLeaderElection(); + super.start(); + } + + private void loadDataBase() { + File updating = new File(getTxnFactory().getSnapDir(), + UPDATING_EPOCH_FILENAME); + try { + zkDb.loadDataBase(); + + // load the epochs + long lastProcessedZxid = zkDb.getDataTree().lastProcessedZxid; + long epochOfZxid = ZxidUtils.getEpochFromZxid(lastProcessedZxid); + try { + currentEpoch = readLongFromFile(CURRENT_EPOCH_FILENAME); + if (epochOfZxid > currentEpoch && updating.exists()) { + LOG.info("{} found. The server was terminated after " + + "taking a snapshot but before updating current " + + "epoch. Setting current epoch to {}.", + UPDATING_EPOCH_FILENAME, epochOfZxid); + setCurrentEpoch(epochOfZxid); + if (!updating.delete()) { + throw new IOException("Failed to delete " + + updating.toString()); + } + } + } catch(FileNotFoundException e) { + // pick a reasonable epoch number + // this should only happen once when moving to a + // new code version + currentEpoch = epochOfZxid; + LOG.info(CURRENT_EPOCH_FILENAME + + " not found! Creating with a reasonable default of {}. This should only happen when you are upgrading your installation", + currentEpoch); + writeLongToFile(CURRENT_EPOCH_FILENAME, currentEpoch); + } + if (epochOfZxid > currentEpoch) { + throw new IOException("The current epoch, " + ZxidUtils.zxidToString(currentEpoch) + ", is older than the last zxid, " + lastProcessedZxid); + } + try { + acceptedEpoch = readLongFromFile(ACCEPTED_EPOCH_FILENAME); + } catch(FileNotFoundException e) { + // pick a reasonable epoch number + // this should only happen once when moving to a + // new code version + acceptedEpoch = epochOfZxid; + LOG.info(ACCEPTED_EPOCH_FILENAME + + " not found! Creating with a reasonable default of {}. This should only happen when you are upgrading your installation", + acceptedEpoch); + writeLongToFile(ACCEPTED_EPOCH_FILENAME, acceptedEpoch); + } + if (acceptedEpoch < currentEpoch) { + throw new IOException("The current epoch, " + ZxidUtils.zxidToString(currentEpoch) + " is less than the accepted epoch, " + ZxidUtils.zxidToString(acceptedEpoch)); + } + } catch(IOException ie) { + LOG.error("Unable to load database on disk", ie); + throw new RuntimeException("Unable to run quorum server ", ie); + } + } + + ResponderThread responder; + + synchronized public void stopLeaderElection() { + responder.running = false; + responder.interrupt(); + } + synchronized public void startLeaderElection() { + try { + currentVote = new Vote(myid, getLastLoggedZxid(), getCurrentEpoch()); + } catch(IOException e) { + RuntimeException re = new RuntimeException(e.getMessage()); + re.setStackTrace(e.getStackTrace()); + throw re; + } + for (QuorumServer p : getView().values()) { + if (p.id == myid) { + myQuorumAddr = p.addr; + break; + } + } + if (myQuorumAddr == null) { + throw new RuntimeException("My id " + myid + " not in the peer list"); + } + if (electionType == 0) { + try { + udpSocket = new DatagramSocket(myQuorumAddr.getPort()); + responder = new ResponderThread(); + responder.start(); + } catch (SocketException e) { + throw new RuntimeException(e); + } + } + this.electionAlg = createElectionAlgorithm(electionType); + } + + /** + * Count the number of nodes in the map that could be followers. + * @param peers + * @return The number of followers in the map + */ + protected static int countParticipants(Map peers) { + int count = 0; + for (QuorumServer q : peers.values()) { + if (q.type == LearnerType.PARTICIPANT) { + count++; + } + } + return count; + } + + /** + * This constructor is only used by the existing unit test code. + * It defaults to FileLogProvider persistence provider. + */ + public QuorumPeer(Map quorumPeers, File snapDir, + File logDir, int clientPort, int electionAlg, + long myid, int tickTime, int initLimit, int syncLimit) + throws IOException + { + this(quorumPeers, snapDir, logDir, electionAlg, + myid,tickTime, initLimit,syncLimit, false, + ServerCnxnFactory.createFactory(new InetSocketAddress(clientPort), -1), + new QuorumMaj(countParticipants(quorumPeers))); + } + + /** + * This constructor is only used by the existing unit test code. + * It defaults to FileLogProvider persistence provider. + */ + public QuorumPeer(Map quorumPeers, File snapDir, + File logDir, int clientPort, int electionAlg, + long myid, int tickTime, int initLimit, int syncLimit, + QuorumVerifier quorumConfig) + throws IOException + { + this(quorumPeers, snapDir, logDir, electionAlg, + myid,tickTime, initLimit,syncLimit, false, + ServerCnxnFactory.createFactory(new InetSocketAddress(clientPort), -1), + quorumConfig); + } + + /** + * returns the highest zxid that this host has seen + * + * @return the highest zxid for this host + */ + public long getLastLoggedZxid() { + if (!zkDb.isInitialized()) { + loadDataBase(); + } + return zkDb.getDataTreeLastProcessedZxid(); + } + + public Follower follower; + public Leader leader; + public Observer observer; + + protected Follower makeFollower(FileTxnSnapLog logFactory) throws IOException { + return new Follower(this, new FollowerZooKeeperServer(logFactory, + this,new ZooKeeperServer.BasicDataTreeBuilder(), this.zkDb)); + } + + protected Leader makeLeader(FileTxnSnapLog logFactory) throws IOException { + return new Leader(this, new LeaderZooKeeperServer(logFactory, + this,new ZooKeeperServer.BasicDataTreeBuilder(), this.zkDb)); + } + + protected Observer makeObserver(FileTxnSnapLog logFactory) throws IOException { + return new Observer(this, new ObserverZooKeeperServer(logFactory, + this, new ZooKeeperServer.BasicDataTreeBuilder(), this.zkDb)); + } + + protected Election createElectionAlgorithm(int electionAlgorithm){ + Election le=null; + + //TODO: use a factory rather than a switch + switch (electionAlgorithm) { + case 0: + le = new LeaderElection(this); + break; + case 1: + le = new AuthFastLeaderElection(this); + break; + case 2: + le = new AuthFastLeaderElection(this, true); + break; + case 3: + qcm = new QuorumCnxManager(this); + QuorumCnxManager.Listener listener = qcm.listener; + if(listener != null){ + listener.start(); + le = new FastLeaderElection(this, qcm); + } else { + LOG.error("Null listener when initializing cnx manager"); + } + break; + default: + assert false; + } + return le; + } + + protected Election makeLEStrategy(){ + LOG.debug("Initializing leader election protocol..."); + if (getElectionType() == 0) { + electionAlg = new LeaderElection(this); + } + return electionAlg; + } + + synchronized protected void setLeader(Leader newLeader){ + leader=newLeader; + } + + synchronized protected void setFollower(Follower newFollower){ + follower=newFollower; + } + + synchronized protected void setObserver(Observer newObserver){ + observer=newObserver; + } + + synchronized public ZooKeeperServer getActiveServer(){ + if(leader!=null) + return leader.zk; + else if(follower!=null) + return follower.zk; + else if (observer != null) + return observer.zk; + return null; + } + + @Override + public void run() { + setName("QuorumPeer" + "[myid=" + getId() + "]" + + cnxnFactory.getLocalAddress()); + + LOG.debug("Starting quorum peer"); + try { + jmxQuorumBean = new QuorumBean(this); + MBeanRegistry.getInstance().register(jmxQuorumBean, null); + for(QuorumServer s: getView().values()){ + ZKMBeanInfo p; + if (getId() == s.id) { + p = jmxLocalPeerBean = new LocalPeerBean(this); + try { + MBeanRegistry.getInstance().register(p, jmxQuorumBean); + } catch (Exception e) { + LOG.warn("Failed to register with JMX", e); + jmxLocalPeerBean = null; + } + } else { + p = new RemotePeerBean(s); + try { + MBeanRegistry.getInstance().register(p, jmxQuorumBean); + } catch (Exception e) { + LOG.warn("Failed to register with JMX", e); + } + } + } + } catch (Exception e) { + LOG.warn("Failed to register with JMX", e); + jmxQuorumBean = null; + } + + try { + /* + * Main loop + */ + while (running) { + switch (getPeerState()) { + case LOOKING: + LOG.info("LOOKING"); + + if (Boolean.getBoolean("readonlymode.enabled")) { + LOG.info("Attempting to start ReadOnlyZooKeeperServer"); + + // Create read-only server but don't start it immediately + final ReadOnlyZooKeeperServer roZk = new ReadOnlyZooKeeperServer( + logFactory, this, + new ZooKeeperServer.BasicDataTreeBuilder(), + this.zkDb); + + // Instead of starting roZk immediately, wait some grace + // period before we decide we're partitioned. + // + // Thread is used here because otherwise it would require + // changes in each of election strategy classes which is + // unnecessary code coupling. + Thread roZkMgr = new Thread() { + public void run() { + try { + // lower-bound grace period to 2 secs + sleep(Math.max(2000, tickTime)); + if (ServerState.LOOKING.equals(getPeerState())) { + roZk.startup(); + } + } catch (InterruptedException e) { + LOG.info("Interrupted while attempting to start ReadOnlyZooKeeperServer, not started"); + } catch (Exception e) { + LOG.error("FAILED to start ReadOnlyZooKeeperServer", e); + } + } + }; + try { + roZkMgr.start(); + setBCVote(null); + setCurrentVote(makeLEStrategy().lookForLeader()); + } catch (Exception e) { + LOG.warn("Unexpected exception",e); + setPeerState(ServerState.LOOKING); + } finally { + // If the thread is in the the grace period, interrupt + // to come out of waiting. + roZkMgr.interrupt(); + roZk.shutdown(); + } + } else { + try { + setBCVote(null); + setCurrentVote(makeLEStrategy().lookForLeader()); + } catch (Exception e) { + LOG.warn("Unexpected exception", e); + setPeerState(ServerState.LOOKING); + } + } + break; + case OBSERVING: + try { + LOG.info("OBSERVING"); + setObserver(makeObserver(logFactory)); + observer.observeLeader(); + } catch (Exception e) { + LOG.warn("Unexpected exception",e ); + } finally { + observer.shutdown(); + setObserver(null); + setPeerState(ServerState.LOOKING); + } + break; + case FOLLOWING: + try { + LOG.info("FOLLOWING"); + setFollower(makeFollower(logFactory)); + follower.followLeader(); + } catch (Exception e) { + LOG.warn("Unexpected exception",e); + } finally { + follower.shutdown(); + setFollower(null); + setPeerState(ServerState.LOOKING); + } + break; + case LEADING: + LOG.info("LEADING"); + try { + setLeader(makeLeader(logFactory)); + leader.lead(); + setLeader(null); + } catch (Exception e) { + LOG.warn("Unexpected exception",e); + } finally { + if (leader != null) { + leader.shutdown("Forcing shutdown"); + setLeader(null); + } + setPeerState(ServerState.LOOKING); + } + break; + } + } + } finally { + LOG.warn("QuorumPeer main thread exited"); + try { + MBeanRegistry.getInstance().unregisterAll(); + } catch (Exception e) { + LOG.warn("Failed to unregister with JMX", e); + } + jmxQuorumBean = null; + jmxLocalPeerBean = null; + } + } + + public void shutdown() { + running = false; + if (leader != null) { + leader.shutdown("quorum Peer shutdown"); + } + if (follower != null) { + follower.shutdown(); + } + cnxnFactory.shutdown(); + if(udpSocket != null) { + udpSocket.close(); + } + + if(getElectionAlg() != null){ + this.interrupt(); + getElectionAlg().shutdown(); + } + try { + zkDb.close(); + } catch (IOException ie) { + LOG.warn("Error closing logs ", ie); + } + } + + /** + * A 'view' is a node's current opinion of the membership of the entire + * ensemble. + */ + public Map getView() { + return Collections.unmodifiableMap(this.quorumPeers); + } + + /** + * Observers are not contained in this view, only nodes with + * PeerType=PARTICIPANT. + */ + public Map getVotingView() { + Map ret = + new HashMap(); + Map view = getView(); + for (QuorumServer server : view.values()) { + if (server.type == LearnerType.PARTICIPANT) { + ret.put(server.id, server); + } + } + return ret; + } + + /** + * Returns only observers, no followers. + */ + public Map getObservingView() { + Map ret = + new HashMap(); + Map view = getView(); + for (QuorumServer server : view.values()) { + if (server.type == LearnerType.OBSERVER) { + ret.put(server.id, server); + } + } + return ret; + } + + /** + * Check if a node is in the current view. With static membership, the + * result of this check will never change; only when dynamic membership + * is introduced will this be more useful. + */ + public boolean viewContains(Long sid) { + return this.quorumPeers.containsKey(sid); + } + + /** + * Only used by QuorumStats at the moment + */ + public String[] getQuorumPeers() { + List l = new ArrayList(); + synchronized (this) { + if (leader != null) { + for (LearnerHandler fh : leader.getLearners()) { + if (fh.getSocket() != null) { + String s = fh.getSocket().getRemoteSocketAddress().toString(); + if (leader.isLearnerSynced(fh)) + s += "*"; + l.add(s); + } + } + } else if (follower != null) { + l.add(follower.sock.getRemoteSocketAddress().toString()); + } + } + return l.toArray(new String[0]); + } + + public String getServerState() { + switch (getPeerState()) { + case LOOKING: + return QuorumStats.Provider.LOOKING_STATE; + case LEADING: + return QuorumStats.Provider.LEADING_STATE; + case FOLLOWING: + return QuorumStats.Provider.FOLLOWING_STATE; + case OBSERVING: + return QuorumStats.Provider.OBSERVING_STATE; + } + return QuorumStats.Provider.UNKNOWN_STATE; + } + + + /** + * get the id of this quorum peer. + */ + public long getMyid() { + return myid; + } + + /** + * set the id of this quorum peer. + */ + public void setMyid(long myid) { + this.myid = myid; + } + + /** + * Get the number of milliseconds of each tick + */ + public int getTickTime() { + return tickTime; + } + + /** + * Set the number of milliseconds of each tick + */ + public void setTickTime(int tickTime) { + LOG.info("tickTime set to " + tickTime); + this.tickTime = tickTime; + } + + /** Maximum number of connections allowed from particular host (ip) */ + public int getMaxClientCnxnsPerHost() { + ServerCnxnFactory fac = getCnxnFactory(); + if (fac == null) { + return -1; + } + return fac.getMaxClientCnxnsPerHost(); + } + + /** minimum session timeout in milliseconds */ + public int getMinSessionTimeout() { + return minSessionTimeout == -1 ? tickTime * 2 : minSessionTimeout; + } + + /** minimum session timeout in milliseconds */ + public void setMinSessionTimeout(int min) { + LOG.info("minSessionTimeout set to " + min); + this.minSessionTimeout = min; + } + + /** maximum session timeout in milliseconds */ + public int getMaxSessionTimeout() { + return maxSessionTimeout == -1 ? tickTime * 20 : maxSessionTimeout; + } + + /** minimum session timeout in milliseconds */ + public void setMaxSessionTimeout(int max) { + LOG.info("maxSessionTimeout set to " + max); + this.maxSessionTimeout = max; + } + + /** + * Get the number of ticks that the initial synchronization phase can take + */ + public int getInitLimit() { + return initLimit; + } + + /** + * Set the number of ticks that the initial synchronization phase can take + */ + public void setInitLimit(int initLimit) { + LOG.info("initLimit set to " + initLimit); + this.initLimit = initLimit; + } + + /** + * Get the current tick + */ + public int getTick() { + return tick; + } + + /** + * Return QuorumVerifier object + */ + + public QuorumVerifier getQuorumVerifier(){ + return quorumConfig; + + } + + public void setQuorumVerifier(QuorumVerifier quorumConfig){ + this.quorumConfig = quorumConfig; + } + + /** + * Get an instance of LeaderElection + */ + + public Election getElectionAlg(){ + return electionAlg; + } + + /** + * Get the synclimit + */ + public int getSyncLimit() { + return syncLimit; + } + + /** + * Set the synclimit + */ + public void setSyncLimit(int syncLimit) { + this.syncLimit = syncLimit; + } + + + /** + * The syncEnabled can also be set via a system property. + */ + public static final String SYNC_ENABLED = "zookeeper.observer.syncEnabled"; + + /** + * Return syncEnabled. + * + * @return + */ + public boolean getSyncEnabled() { + if (System.getProperty(SYNC_ENABLED) != null) { + LOG.info(SYNC_ENABLED + "=" + Boolean.getBoolean(SYNC_ENABLED)); + return Boolean.getBoolean(SYNC_ENABLED); + } else { + return syncEnabled; + } + } + + /** + * Set syncEnabled. + * + * @param syncEnabled + */ + public void setSyncEnabled(boolean syncEnabled) { + this.syncEnabled = syncEnabled; + } + + /** + * Gets the election type + */ + public int getElectionType() { + return electionType; + } + + /** + * Sets the election type + */ + public void setElectionType(int electionType) { + this.electionType = electionType; + } + + public boolean getQuorumListenOnAllIPs() { + return quorumListenOnAllIPs; + } + + public void setQuorumListenOnAllIPs(boolean quorumListenOnAllIPs) { + this.quorumListenOnAllIPs = quorumListenOnAllIPs; + } + + public ServerCnxnFactory getCnxnFactory() { + return cnxnFactory; + } + + public void setCnxnFactory(ServerCnxnFactory cnxnFactory) { + this.cnxnFactory = cnxnFactory; + } + + public void setQuorumPeers(Map quorumPeers) { + this.quorumPeers = quorumPeers; + } + + public int getClientPort() { + return cnxnFactory.getLocalPort(); + } + + public void setClientPortAddress(InetSocketAddress addr) { + } + + public void setTxnFactory(FileTxnSnapLog factory) { + this.logFactory = factory; + } + + public FileTxnSnapLog getTxnFactory() { + return this.logFactory; + } + + /** + * set zk database for this node + * @param database + */ + public void setZKDatabase(ZKDatabase database) { + this.zkDb = database; + } + + public void setRunning(boolean running) { + this.running = running; + } + + public boolean isRunning() { + return running; + } + + /** + * get reference to QuorumCnxManager + */ + public QuorumCnxManager getQuorumCnxManager() { + return qcm; + } + private long readLongFromFile(String name) throws IOException { + File file = new File(logFactory.getSnapDir(), name); + BufferedReader br = new BufferedReader(new FileReader(file)); + String line = ""; + try { + line = br.readLine(); + return Long.parseLong(line); + } catch(NumberFormatException e) { + throw new IOException("Found " + line + " in " + file); + } finally { + br.close(); + } + } + + private long acceptedEpoch = -1; + private long currentEpoch = -1; + + public static final String CURRENT_EPOCH_FILENAME = "currentEpoch"; + + public static final String ACCEPTED_EPOCH_FILENAME = "acceptedEpoch"; + + public static final String UPDATING_EPOCH_FILENAME = "updatingEpoch"; + + /** + * Write a long value to disk atomically. Either succeeds or an exception + * is thrown. + * @param name file name to write the long to + * @param value the long value to write to the named file + * @throws IOException if the file cannot be written atomically + */ + private void writeLongToFile(String name, long value) throws IOException { + File file = new File(logFactory.getSnapDir(), name); + AtomicFileOutputStream out = new AtomicFileOutputStream(file); + BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(out)); + boolean aborted = false; + try { + bw.write(Long.toString(value)); + bw.flush(); + + out.flush(); + } catch (IOException e) { + LOG.error("Failed to write new file " + file, e); + // worst case here the tmp file/resources(fd) are not cleaned up + // and the caller will be notified (IOException) + aborted = true; + out.abort(); + throw e; + } finally { + if (!aborted) { + // if the close operation (rename) fails we'll get notified. + // worst case the tmp file may still exist + out.close(); + } + } + } + + public long getCurrentEpoch() throws IOException { + if (currentEpoch == -1) { + currentEpoch = readLongFromFile(CURRENT_EPOCH_FILENAME); + } + return currentEpoch; + } + + public long getAcceptedEpoch() throws IOException { + if (acceptedEpoch == -1) { + acceptedEpoch = readLongFromFile(ACCEPTED_EPOCH_FILENAME); + } + return acceptedEpoch; + } + + public void setCurrentEpoch(long e) throws IOException { + currentEpoch = e; + writeLongToFile(CURRENT_EPOCH_FILENAME, e); + + } + + public void setAcceptedEpoch(long e) throws IOException { + acceptedEpoch = e; + writeLongToFile(ACCEPTED_EPOCH_FILENAME, e); + } + + /** + * Updates leader election info to avoid inconsistencies when + * a new server tries to join the ensemble. + * See ZOOKEEPER-1732 for more info. + */ + protected void updateElectionVote(long newEpoch) { + Vote currentVote = getCurrentVote(); + setBCVote(currentVote); + if (currentVote != null) { + setCurrentVote(new Vote(currentVote.getId(), + currentVote.getZxid(), + currentVote.getElectionEpoch(), + newEpoch, + currentVote.getState())); + } + } + +} diff --git a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/quorum/QuorumPeerConfig.java b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/quorum/QuorumPeerConfig.java new file mode 100644 index 000000000..59e048d66 --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/quorum/QuorumPeerConfig.java @@ -0,0 +1,425 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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. + */ + +package org.apache.zookeeper.server.quorum; + +import java.io.BufferedReader; +import java.io.File; +import java.io.FileInputStream; +import java.io.FileReader; +import java.io.IOException; +import java.net.InetAddress; +import java.net.InetSocketAddress; +import java.util.Collections; +import java.util.HashMap; +import java.util.Map; +import java.util.Properties; +import java.util.Map.Entry; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.slf4j.MDC; + +import org.apache.zookeeper.server.ZooKeeperServer; +import org.apache.zookeeper.server.quorum.QuorumPeer.LearnerType; +import org.apache.zookeeper.server.quorum.QuorumPeer.QuorumServer; +import org.apache.zookeeper.server.quorum.flexible.QuorumHierarchical; +import org.apache.zookeeper.server.quorum.flexible.QuorumMaj; +import org.apache.zookeeper.server.quorum.flexible.QuorumVerifier; + +public class QuorumPeerConfig { + private static final Logger LOG = LoggerFactory.getLogger(QuorumPeerConfig.class); + + protected InetSocketAddress clientPortAddress; + protected String dataDir; + protected String dataLogDir; + protected int tickTime = ZooKeeperServer.DEFAULT_TICK_TIME; + protected int maxClientCnxns = 60; + /** defaults to -1 if not set explicitly */ + protected int minSessionTimeout = -1; + /** defaults to -1 if not set explicitly */ + protected int maxSessionTimeout = -1; + + protected int initLimit; + protected int syncLimit; + protected int electionAlg = 3; + protected int electionPort = 2182; + protected boolean quorumListenOnAllIPs = false; + protected final HashMap servers = + new HashMap(); + protected final HashMap observers = + new HashMap(); + + protected long serverId; + protected HashMap serverWeight = new HashMap(); + protected HashMap serverGroup = new HashMap(); + protected int numGroups = 0; + protected QuorumVerifier quorumVerifier; + protected int snapRetainCount = 3; + protected int purgeInterval = 0; + protected boolean syncEnabled = true; + + protected LearnerType peerType = LearnerType.PARTICIPANT; + + /** + * Minimum snapshot retain count. + * @see org.apache.zookeeper.server.PurgeTxnLog#purge(File, File, int) + */ + private final int MIN_SNAP_RETAIN_COUNT = 3; + + @SuppressWarnings("serial") + public static class ConfigException extends Exception { + public ConfigException(String msg) { + super(msg); + } + public ConfigException(String msg, Exception e) { + super(msg, e); + } + } + + /** + * Parse a ZooKeeper configuration file + * @param path the patch of the configuration file + * @throws ConfigException error processing configuration + */ + public void parse(String path) throws ConfigException { + File configFile = new File(path); + + LOG.info("Reading configuration from: " + configFile); + + try { + if (!configFile.exists()) { + throw new IllegalArgumentException(configFile.toString() + + " file is missing"); + } + + Properties cfg = new Properties(); + FileInputStream in = new FileInputStream(configFile); + try { + cfg.load(in); + } finally { + in.close(); + } + + parseProperties(cfg); + } catch (IOException e) { + throw new ConfigException("Error processing " + path, e); + } catch (IllegalArgumentException e) { + throw new ConfigException("Error processing " + path, e); + } + } + + /** + * Parse config from a Properties. + * @param zkProp Properties to parse from. + * @throws IOException + * @throws ConfigException + */ + public void parseProperties(Properties zkProp) + throws IOException, ConfigException { + int clientPort = 0; + String clientPortAddress = null; + for (Entry entry : zkProp.entrySet()) { + String key = entry.getKey().toString().trim(); + String value = entry.getValue().toString().trim(); + if (key.equals("dataDir")) { + dataDir = value; + } else if (key.equals("dataLogDir")) { + dataLogDir = value; + } else if (key.equals("clientPort")) { + clientPort = Integer.parseInt(value); + } else if (key.equals("clientPortAddress")) { + clientPortAddress = value.trim(); + } else if (key.equals("tickTime")) { + tickTime = Integer.parseInt(value); + } else if (key.equals("maxClientCnxns")) { + maxClientCnxns = Integer.parseInt(value); + } else if (key.equals("minSessionTimeout")) { + minSessionTimeout = Integer.parseInt(value); + } else if (key.equals("maxSessionTimeout")) { + maxSessionTimeout = Integer.parseInt(value); + } else if (key.equals("initLimit")) { + initLimit = Integer.parseInt(value); + } else if (key.equals("syncLimit")) { + syncLimit = Integer.parseInt(value); + } else if (key.equals("electionAlg")) { + electionAlg = Integer.parseInt(value); + } else if (key.equals("quorumListenOnAllIPs")) { + quorumListenOnAllIPs = Boolean.parseBoolean(value); + } else if (key.equals("peerType")) { + if (value.toLowerCase().equals("observer")) { + peerType = LearnerType.OBSERVER; + } else if (value.toLowerCase().equals("participant")) { + peerType = LearnerType.PARTICIPANT; + } else + { + throw new ConfigException("Unrecognised peertype: " + value); + } + } else if (key.equals( "syncEnabled" )) { + syncEnabled = Boolean.parseBoolean(value); + } else if (key.equals("autopurge.snapRetainCount")) { + snapRetainCount = Integer.parseInt(value); + } else if (key.equals("autopurge.purgeInterval")) { + purgeInterval = Integer.parseInt(value); + } else if (key.startsWith("server.")) { + int dot = key.indexOf('.'); + long sid = Long.parseLong(key.substring(dot + 1)); + String parts[] = value.split(":"); + if ((parts.length != 2) && (parts.length != 3) && (parts.length !=4)) { + LOG.error(value + + " does not have the form host:port or host:port:port " + + " or host:port:port:type"); + } + InetSocketAddress addr = new InetSocketAddress(parts[0], + Integer.parseInt(parts[1])); + if (parts.length == 2) { + servers.put(Long.valueOf(sid), new QuorumServer(sid, addr)); + } else if (parts.length == 3) { + InetSocketAddress electionAddr = new InetSocketAddress( + parts[0], Integer.parseInt(parts[2])); + servers.put(Long.valueOf(sid), new QuorumServer(sid, addr, + electionAddr)); + } else if (parts.length == 4) { + InetSocketAddress electionAddr = new InetSocketAddress( + parts[0], Integer.parseInt(parts[2])); + LearnerType type = LearnerType.PARTICIPANT; + if (parts[3].toLowerCase().equals("observer")) { + type = LearnerType.OBSERVER; + observers.put(Long.valueOf(sid), new QuorumServer(sid, addr, + electionAddr,type)); + } else if (parts[3].toLowerCase().equals("participant")) { + type = LearnerType.PARTICIPANT; + servers.put(Long.valueOf(sid), new QuorumServer(sid, addr, + electionAddr,type)); + } else { + throw new ConfigException("Unrecognised peertype: " + value); + } + } + } else if (key.startsWith("group")) { + int dot = key.indexOf('.'); + long gid = Long.parseLong(key.substring(dot + 1)); + + numGroups++; + + String parts[] = value.split(":"); + for(String s : parts){ + long sid = Long.parseLong(s); + if(serverGroup.containsKey(sid)) + throw new ConfigException("Server " + sid + "is in multiple groups"); + else + serverGroup.put(sid, gid); + } + + } else if(key.startsWith("weight")) { + int dot = key.indexOf('.'); + long sid = Long.parseLong(key.substring(dot + 1)); + serverWeight.put(sid, Long.parseLong(value)); + } else { + System.setProperty("zookeeper." + key, value); + } + } + + // Reset to MIN_SNAP_RETAIN_COUNT if invalid (less than 3) + // PurgeTxnLog.purge(File, File, int) will not allow to purge less + // than 3. + if (snapRetainCount < MIN_SNAP_RETAIN_COUNT) { + LOG.warn("Invalid autopurge.snapRetainCount: " + snapRetainCount + + ". Defaulting to " + MIN_SNAP_RETAIN_COUNT); + snapRetainCount = MIN_SNAP_RETAIN_COUNT; + } + + if (dataDir == null) { + throw new IllegalArgumentException("dataDir is not set"); + } + if (dataLogDir == null) { + dataLogDir = dataDir; + } else { + if (!new File(dataLogDir).isDirectory()) { + throw new IllegalArgumentException("dataLogDir " + dataLogDir + + " is missing."); + } + } + if (clientPort == 0) { + throw new IllegalArgumentException("clientPort is not set"); + } + if (clientPortAddress != null) { + this.clientPortAddress = new InetSocketAddress( + InetAddress.getByName(clientPortAddress), clientPort); + } else { + this.clientPortAddress = new InetSocketAddress(clientPort); + } + + if (tickTime == 0) { + throw new IllegalArgumentException("tickTime is not set"); + } + if (minSessionTimeout > maxSessionTimeout) { + throw new IllegalArgumentException( + "minSessionTimeout must not be larger than maxSessionTimeout"); + } + if (servers.size() == 0) { + if (observers.size() > 0) { + throw new IllegalArgumentException("Observers w/o participants is an invalid configuration"); + } + // Not a quorum configuration so return immediately - not an error + // case (for b/w compatibility), server will default to standalone + // mode. + return; + } else if (servers.size() == 1) { + if (observers.size() > 0) { + throw new IllegalArgumentException("Observers w/o quorum is an invalid configuration"); + } + + // HBase currently adds a single server line to the config, for + // b/w compatibility reasons we need to keep this here. + LOG.error("Invalid configuration, only one server specified (ignoring)"); + servers.clear(); + } else if (servers.size() > 1) { + if (servers.size() == 2) { + LOG.warn("No server failure will be tolerated. " + + "You need at least 3 servers."); + } else if (servers.size() % 2 == 0) { + LOG.warn("Non-optimial configuration, consider an odd number of servers."); + } + if (initLimit == 0) { + throw new IllegalArgumentException("initLimit is not set"); + } + if (syncLimit == 0) { + throw new IllegalArgumentException("syncLimit is not set"); + } + /* + * If using FLE, then every server requires a separate election + * port. + */ + if (electionAlg != 0) { + for (QuorumServer s : servers.values()) { + if (s.electionAddr == null) + throw new IllegalArgumentException( + "Missing election port for server: " + s.id); + } + } + + /* + * Default of quorum config is majority + */ + if(serverGroup.size() > 0){ + if(servers.size() != serverGroup.size()) + throw new ConfigException("Every server must be in exactly one group"); + /* + * The deafult weight of a server is 1 + */ + for(QuorumServer s : servers.values()){ + if(!serverWeight.containsKey(s.id)) + serverWeight.put(s.id, (long) 1); + } + + /* + * Set the quorumVerifier to be QuorumHierarchical + */ + quorumVerifier = new QuorumHierarchical(numGroups, + serverWeight, serverGroup); + } else { + /* + * The default QuorumVerifier is QuorumMaj + */ + + LOG.info("Defaulting to majority quorums"); + quorumVerifier = new QuorumMaj(servers.size()); + } + + // Now add observers to servers, once the quorums have been + // figured out + servers.putAll(observers); + + File myIdFile = new File(dataDir, "myid"); + if (!myIdFile.exists()) { + throw new IllegalArgumentException(myIdFile.toString() + + " file is missing"); + } + BufferedReader br = new BufferedReader(new FileReader(myIdFile)); + String myIdString; + try { + myIdString = br.readLine(); + } finally { + br.close(); + } + try { + serverId = Long.parseLong(myIdString); + MDC.put("myid", myIdString); + } catch (NumberFormatException e) { + throw new IllegalArgumentException("serverid " + myIdString + + " is not a number"); + } + + // Warn about inconsistent peer type + LearnerType roleByServersList = observers.containsKey(serverId) ? LearnerType.OBSERVER + : LearnerType.PARTICIPANT; + if (roleByServersList != peerType) { + LOG.warn("Peer type from servers list (" + roleByServersList + + ") doesn't match peerType (" + peerType + + "). Defaulting to servers list."); + + peerType = roleByServersList; + } + } + } + + public InetSocketAddress getClientPortAddress() { return clientPortAddress; } + public String getDataDir() { return dataDir; } + public String getDataLogDir() { return dataLogDir; } + public int getTickTime() { return tickTime; } + public int getMaxClientCnxns() { return maxClientCnxns; } + public int getMinSessionTimeout() { return minSessionTimeout; } + public int getMaxSessionTimeout() { return maxSessionTimeout; } + + public int getInitLimit() { return initLimit; } + public int getSyncLimit() { return syncLimit; } + public int getElectionAlg() { return electionAlg; } + public int getElectionPort() { return electionPort; } + + public int getSnapRetainCount() { + return snapRetainCount; + } + + public int getPurgeInterval() { + return purgeInterval; + } + + public boolean getSyncEnabled() { + return syncEnabled; + } + + public QuorumVerifier getQuorumVerifier() { + return quorumVerifier; + } + + public Map getServers() { + return Collections.unmodifiableMap(servers); + } + + public long getServerId() { return serverId; } + + public boolean isDistributed() { return servers.size() > 1; } + + public LearnerType getPeerType() { + return peerType; + } + + public Boolean getQuorumListenOnAllIPs() { + return quorumListenOnAllIPs; + } +} diff --git a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/quorum/QuorumPeerMain.java b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/quorum/QuorumPeerMain.java new file mode 100644 index 000000000..e9c80070b --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/quorum/QuorumPeerMain.java @@ -0,0 +1,160 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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. + */ +package org.apache.zookeeper.server.quorum; + +import java.io.File; +import java.io.IOException; + +import javax.management.JMException; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.apache.zookeeper.jmx.ManagedUtil; +import org.apache.zookeeper.server.ServerCnxnFactory; +import org.apache.zookeeper.server.ZKDatabase; +import org.apache.zookeeper.server.DatadirCleanupManager; +import org.apache.zookeeper.server.ZooKeeperServerMain; +import org.apache.zookeeper.server.persistence.FileTxnSnapLog; +import org.apache.zookeeper.server.quorum.QuorumPeerConfig.ConfigException; + +/** + * + *

      Configuration file

      + * + * When the main() method of this class is used to start the program, the first + * argument is used as a path to the config file, which will be used to obtain + * configuration information. This file is a Properties file, so keys and + * values are separated by equals (=) and the key/value pairs are separated + * by new lines. The following is a general summary of keys used in the + * configuration file. For full details on this see the documentation in + * docs/index.html + *
        + *
      1. dataDir - The directory where the ZooKeeper data is stored.
      2. + *
      3. dataLogDir - The directory where the ZooKeeper transaction log is stored.
      4. + *
      5. clientPort - The port used to communicate with clients.
      6. + *
      7. tickTime - The duration of a tick in milliseconds. This is the basic + * unit of time in ZooKeeper.
      8. + *
      9. initLimit - The maximum number of ticks that a follower will wait to + * initially synchronize with a leader.
      10. + *
      11. syncLimit - The maximum number of ticks that a follower will wait for a + * message (including heartbeats) from the leader.
      12. + *
      13. server.id - This is the host:port[:port] that the server with the + * given id will use for the quorum protocol.
      14. + *
      + * In addition to the config file. There is a file in the data directory called + * "myid" that contains the server id as an ASCII decimal value. + * + */ +public class QuorumPeerMain { + private static final Logger LOG = LoggerFactory.getLogger(QuorumPeerMain.class); + + private static final String USAGE = "Usage: QuorumPeerMain configfile"; + + protected QuorumPeer quorumPeer; + + /** + * To start the replicated server specify the configuration file name on + * the command line. + * @param args path to the configfile + */ + public static void main(String[] args) { + QuorumPeerMain main = new QuorumPeerMain(); + try { + main.initializeAndRun(args); + } catch (IllegalArgumentException e) { + LOG.error("Invalid arguments, exiting abnormally", e); + LOG.info(USAGE); + System.err.println(USAGE); + System.exit(2); + } catch (ConfigException e) { + LOG.error("Invalid config, exiting abnormally", e); + System.err.println("Invalid config, exiting abnormally"); + System.exit(2); + } catch (Exception e) { + LOG.error("Unexpected exception, exiting abnormally", e); + System.exit(1); + } + LOG.info("Exiting normally"); + System.exit(0); + } + + protected void initializeAndRun(String[] args) + throws ConfigException, IOException + { + QuorumPeerConfig config = new QuorumPeerConfig(); + if (args.length == 1) { + config.parse(args[0]); + } + + // Start and schedule the the purge task + DatadirCleanupManager purgeMgr = new DatadirCleanupManager(config + .getDataDir(), config.getDataLogDir(), config + .getSnapRetainCount(), config.getPurgeInterval()); + purgeMgr.start(); + + if (args.length == 1 && config.servers.size() > 0) { + runFromConfig(config); + } else { + LOG.warn("Either no config or no quorum defined in config, running " + + " in standalone mode"); + // there is only server in the quorum -- run as standalone + ZooKeeperServerMain.main(args); + } + } + + public void runFromConfig(QuorumPeerConfig config) throws IOException { + try { + ManagedUtil.registerLog4jMBeans(); + } catch (JMException e) { + LOG.warn("Unable to register log4j JMX control", e); + } + + LOG.info("Starting quorum peer"); + try { + ServerCnxnFactory cnxnFactory = ServerCnxnFactory.createFactory(); + cnxnFactory.configure(config.getClientPortAddress(), + config.getMaxClientCnxns()); + + quorumPeer = new QuorumPeer(); + quorumPeer.setClientPortAddress(config.getClientPortAddress()); + quorumPeer.setTxnFactory(new FileTxnSnapLog( + new File(config.getDataLogDir()), + new File(config.getDataDir()))); + quorumPeer.setQuorumPeers(config.getServers()); + quorumPeer.setElectionType(config.getElectionAlg()); + quorumPeer.setMyid(config.getServerId()); + quorumPeer.setTickTime(config.getTickTime()); + quorumPeer.setMinSessionTimeout(config.getMinSessionTimeout()); + quorumPeer.setMaxSessionTimeout(config.getMaxSessionTimeout()); + quorumPeer.setInitLimit(config.getInitLimit()); + quorumPeer.setSyncLimit(config.getSyncLimit()); + quorumPeer.setQuorumVerifier(config.getQuorumVerifier()); + quorumPeer.setCnxnFactory(cnxnFactory); + quorumPeer.setZKDatabase(new ZKDatabase(quorumPeer.getTxnFactory())); + quorumPeer.setLearnerType(config.getPeerType()); + quorumPeer.setSyncEnabled(config.getSyncEnabled()); + quorumPeer.setQuorumListenOnAllIPs(config.getQuorumListenOnAllIPs()); + + quorumPeer.start(); + quorumPeer.join(); + } catch (InterruptedException e) { + // warn, but generally this is ok + LOG.warn("Quorum Peer interrupted", e); + } + } +} diff --git a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/quorum/QuorumStats.java b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/quorum/QuorumStats.java new file mode 100644 index 000000000..b6c62e442 --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/quorum/QuorumStats.java @@ -0,0 +1,68 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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. + */ + +package org.apache.zookeeper.server.quorum; + +public class QuorumStats { + private final Provider provider; + + public interface Provider { + static public final String UNKNOWN_STATE = "unknown"; + static public final String LOOKING_STATE = "leaderelection"; + static public final String LEADING_STATE = "leading"; + static public final String FOLLOWING_STATE = "following"; + static public final String OBSERVING_STATE = "observing"; + public String[] getQuorumPeers(); + public String getServerState(); + } + + protected QuorumStats(Provider provider) { + this.provider = provider; + } + + public String getServerState(){ + return provider.getServerState(); + } + + public String[] getQuorumPeers(){ + return provider.getQuorumPeers(); + } + + @Override + public String toString(){ + StringBuilder sb=new StringBuilder(super.toString()); + String state=getServerState(); + if(state.equals(Provider.LEADING_STATE)){ + sb.append("Followers:"); + for(String f: getQuorumPeers()){ + sb.append(" ").append(f); + } + sb.append("\n"); + }else if(state.equals(Provider.FOLLOWING_STATE) + || state.equals(Provider.OBSERVING_STATE)){ + sb.append("Leader: "); + String[] ldr=getQuorumPeers(); + if(ldr.length>0) + sb.append(ldr[0]); + else + sb.append("not connected"); + sb.append("\n"); + } + return sb.toString(); + } +} diff --git a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/quorum/QuorumZooKeeperServer.java b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/quorum/QuorumZooKeeperServer.java new file mode 100644 index 000000000..32096a7a1 --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/quorum/QuorumZooKeeperServer.java @@ -0,0 +1,60 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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. + */ +package org.apache.zookeeper.server.quorum; + +import java.io.PrintWriter; + +import org.apache.zookeeper.server.ZKDatabase; +import org.apache.zookeeper.server.ZooKeeperServer; +import org.apache.zookeeper.server.persistence.FileTxnSnapLog; + +/** + * Abstract base class for all ZooKeeperServers that participate in + * a quorum. + */ +public abstract class QuorumZooKeeperServer extends ZooKeeperServer { + protected final QuorumPeer self; + + protected QuorumZooKeeperServer(FileTxnSnapLog logFactory, int tickTime, + int minSessionTimeout, int maxSessionTimeout, + DataTreeBuilder treeBuilder, ZKDatabase zkDb, QuorumPeer self) + { + super(logFactory, tickTime, minSessionTimeout, maxSessionTimeout, + treeBuilder, zkDb); + this.self = self; + } + + @Override + public void dumpConf(PrintWriter pwriter) { + super.dumpConf(pwriter); + + pwriter.print("initLimit="); + pwriter.println(self.getInitLimit()); + pwriter.print("syncLimit="); + pwriter.println(self.getSyncLimit()); + pwriter.print("electionAlg="); + pwriter.println(self.getElectionType()); + pwriter.print("electionPort="); + pwriter.println(self.quorumPeers.get(self.getId()).electionAddr + .getPort()); + pwriter.print("quorumPort="); + pwriter.println(self.quorumPeers.get(self.getId()).addr.getPort()); + pwriter.print("peerType="); + pwriter.println(self.getLearnerType().ordinal()); + } +} diff --git a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/quorum/ReadOnlyBean.java b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/quorum/ReadOnlyBean.java new file mode 100644 index 000000000..a2b6fe3c7 --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/quorum/ReadOnlyBean.java @@ -0,0 +1,38 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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. + */ + +package org.apache.zookeeper.server.quorum; + +import org.apache.zookeeper.server.ZooKeeperServer; +import org.apache.zookeeper.server.ZooKeeperServerBean; + +/** + * ReadOnly MX Bean interface, implemented by ReadOnlyBean + * + */ +public class ReadOnlyBean extends ZooKeeperServerBean { + + public ReadOnlyBean(ZooKeeperServer zks) { + super(zks); + } + + public String getName() { + return "ReadOnlyServer"; + } + +} diff --git a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/quorum/ReadOnlyRequestProcessor.java b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/quorum/ReadOnlyRequestProcessor.java new file mode 100644 index 000000000..14c09988f --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/quorum/ReadOnlyRequestProcessor.java @@ -0,0 +1,128 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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. + */ + +package org.apache.zookeeper.server.quorum; + +import java.io.IOException; +import java.util.concurrent.LinkedBlockingQueue; + +import org.apache.zookeeper.KeeperException.Code; +import org.apache.zookeeper.ZooDefs.OpCode; +import org.apache.zookeeper.proto.ReplyHeader; +import org.apache.zookeeper.server.Request; +import org.apache.zookeeper.server.RequestProcessor; +import org.apache.zookeeper.server.ZooKeeperServer; +import org.apache.zookeeper.server.ZooTrace; +import org.apache.zookeeper.server.quorum.Leader.XidRolloverException; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * This processor is at the beginning of the ReadOnlyZooKeeperServer's + * processors chain. All it does is, it passes read-only operations (e.g. + * OpCode.getData, OpCode.exists) through to the next processor, but drops + * state-changing operations (e.g. OpCode.create, OpCode.setData). + */ +public class ReadOnlyRequestProcessor extends Thread implements RequestProcessor { + + private static final Logger LOG = LoggerFactory.getLogger(ReadOnlyRequestProcessor.class); + + private LinkedBlockingQueue queuedRequests = new LinkedBlockingQueue(); + + private boolean finished = false; + + private RequestProcessor nextProcessor; + + private ZooKeeperServer zks; + + public ReadOnlyRequestProcessor(ZooKeeperServer zks, RequestProcessor nextProcessor) { + super("ReadOnlyRequestProcessor:" + zks.getServerId()); + this.zks = zks; + this.nextProcessor = nextProcessor; + } + + public void run() { + try { + while (!finished) { + Request request = queuedRequests.take(); + + // log request + long traceMask = ZooTrace.CLIENT_REQUEST_TRACE_MASK; + if (request.type == OpCode.ping) { + traceMask = ZooTrace.CLIENT_PING_TRACE_MASK; + } + if (LOG.isTraceEnabled()) { + ZooTrace.logRequest(LOG, traceMask, 'R', request, ""); + } + if (Request.requestOfDeath == request) { + break; + } + + // filter read requests + switch (request.type) { + case OpCode.sync: + case OpCode.create: + case OpCode.delete: + case OpCode.setData: + case OpCode.setACL: + case OpCode.multi: + case OpCode.check: + ReplyHeader hdr = new ReplyHeader(request.cxid, zks.getZKDatabase() + .getDataTreeLastProcessedZxid(), Code.NOTREADONLY.intValue()); + try { + request.cnxn.sendResponse(hdr, null, null); + } catch (IOException e) { + LOG.error("IO exception while sending response", e); + } + continue; + } + + // proceed to the next processor + if (nextProcessor != null) { + nextProcessor.processRequest(request); + } + } + } catch (InterruptedException e) { + LOG.error("Unexpected interruption", e); + } catch (RequestProcessorException e) { + if (e.getCause() instanceof XidRolloverException) { + LOG.info(e.getCause().getMessage()); + } + LOG.error("Unexpected exception", e); + } catch (Exception e) { + LOG.error("Unexpected exception", e); + } + LOG.info("ReadOnlyRequestProcessor exited loop!"); + } + + @Override + public void processRequest(Request request) { + if (!finished) { + queuedRequests.add(request); + } + } + + @Override + public void shutdown() { + finished = true; + queuedRequests.clear(); + queuedRequests.add(Request.requestOfDeath); + nextProcessor.shutdown(); + } + +} diff --git a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/quorum/ReadOnlyZooKeeperServer.java b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/quorum/ReadOnlyZooKeeperServer.java new file mode 100644 index 000000000..3cbfcaa18 --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/quorum/ReadOnlyZooKeeperServer.java @@ -0,0 +1,146 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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. + */ + +package org.apache.zookeeper.server.quorum; + +import org.apache.zookeeper.jmx.MBeanRegistry; +import org.apache.zookeeper.server.DataTreeBean; +import org.apache.zookeeper.server.FinalRequestProcessor; +import org.apache.zookeeper.server.PrepRequestProcessor; +import org.apache.zookeeper.server.RequestProcessor; +import org.apache.zookeeper.server.ZKDatabase; +import org.apache.zookeeper.server.ZooKeeperServer; +import org.apache.zookeeper.server.ZooKeeperServerBean; +import org.apache.zookeeper.server.persistence.FileTxnSnapLog; + +/** + * A ZooKeeperServer which comes into play when peer is partitioned from the + * majority. Handles read-only clients, but drops connections from not-read-only + * ones. + *

      + * The very first processor in the chain of request processors is a + * ReadOnlyRequestProcessor which drops state-changing requests. + */ +public class ReadOnlyZooKeeperServer extends QuorumZooKeeperServer { + + private volatile boolean shutdown = false; + ReadOnlyZooKeeperServer(FileTxnSnapLog logFactory, QuorumPeer self, + DataTreeBuilder treeBuilder, ZKDatabase zkDb) { + super(logFactory, self.tickTime, self.minSessionTimeout, self.maxSessionTimeout, + treeBuilder, zkDb, self); + } + + @Override + protected void setupRequestProcessors() { + RequestProcessor finalProcessor = new FinalRequestProcessor(this); + RequestProcessor prepProcessor = new PrepRequestProcessor(this, finalProcessor); + ((PrepRequestProcessor) prepProcessor).start(); + firstProcessor = new ReadOnlyRequestProcessor(this, prepProcessor); + ((ReadOnlyRequestProcessor) firstProcessor).start(); + } + + @Override + public synchronized void startup() { + // check to avoid startup follows shutdown + if (shutdown) { + LOG.warn("Not starting Read-only server as startup follows shutdown!"); + return; + } + registerJMX(new ReadOnlyBean(this), self.jmxLocalPeerBean); + super.startup(); + self.cnxnFactory.setZooKeeperServer(this); + LOG.info("Read-only server started"); + } + + @Override + protected void registerJMX() { + // register with JMX + try { + jmxDataTreeBean = new DataTreeBean(getZKDatabase().getDataTree()); + MBeanRegistry.getInstance().register(jmxDataTreeBean, jmxServerBean); + } catch (Exception e) { + LOG.warn("Failed to register with JMX", e); + jmxDataTreeBean = null; + } + } + + public void registerJMX(ZooKeeperServerBean serverBean, LocalPeerBean localPeerBean) { + // register with JMX + try { + jmxServerBean = serverBean; + MBeanRegistry.getInstance().register(serverBean, localPeerBean); + } catch (Exception e) { + LOG.warn("Failed to register with JMX", e); + jmxServerBean = null; + } + } + + @Override + protected void unregisterJMX() { + // unregister from JMX + try { + if (jmxDataTreeBean != null) { + MBeanRegistry.getInstance().unregister(jmxDataTreeBean); + } + } catch (Exception e) { + LOG.warn("Failed to unregister with JMX", e); + } + jmxDataTreeBean = null; + } + + protected void unregisterJMX(ZooKeeperServer zks) { + // unregister from JMX + try { + if (jmxServerBean != null) { + MBeanRegistry.getInstance().unregister(jmxServerBean); + } + } catch (Exception e) { + LOG.warn("Failed to unregister with JMX", e); + } + jmxServerBean = null; + } + + @Override + public String getState() { + return "read-only"; + } + + /** + * Returns the id of the associated QuorumPeer, which will do for a unique + * id of this server. + */ + @Override + public long getServerId() { + return self.getId(); + } + + @Override + public synchronized void shutdown() { + shutdown = true; + unregisterJMX(this); + + // set peer's server to null + self.cnxnFactory.setZooKeeperServer(null); + // clear all the connections + self.cnxnFactory.closeAll(); + + // shutdown the server itself + super.shutdown(); + } + +} diff --git a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/quorum/RemotePeerBean.java b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/quorum/RemotePeerBean.java new file mode 100644 index 000000000..5841f6c52 --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/quorum/RemotePeerBean.java @@ -0,0 +1,45 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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. + */ + +package org.apache.zookeeper.server.quorum; + +import org.apache.zookeeper.jmx.ZKMBeanInfo; +import org.apache.zookeeper.server.quorum.QuorumPeer; + +/** + * A remote peer bean only provides limited information about the remote peer, + * and the peer cannot be managed remotely. + */ +public class RemotePeerBean implements RemotePeerMXBean,ZKMBeanInfo { + private QuorumPeer.QuorumServer peer; + + public RemotePeerBean(QuorumPeer.QuorumServer peer){ + this.peer=peer; + } + public String getName() { + return "replica."+peer.id; + } + public boolean isHidden() { + return false; + } + + public String getQuorumAddress() { + return peer.addr.getHostName()+":"+peer.addr.getPort(); + } + +} diff --git a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/quorum/RemotePeerMXBean.java b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/quorum/RemotePeerMXBean.java new file mode 100644 index 000000000..1d2ec6b0a --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/quorum/RemotePeerMXBean.java @@ -0,0 +1,33 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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. + */ + +package org.apache.zookeeper.server.quorum; + +/** + * A proxy for a remote quorum peer. + */ +public interface RemotePeerMXBean { + /** + * @return name of the peer + */ + public String getName(); + /** + * @return IP address of the quorum peer + */ + public String getQuorumAddress(); +} diff --git a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/quorum/SendAckRequestProcessor.java b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/quorum/SendAckRequestProcessor.java new file mode 100644 index 000000000..7f81a5ad8 --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/quorum/SendAckRequestProcessor.java @@ -0,0 +1,80 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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. + */ + +package org.apache.zookeeper.server.quorum; + +import java.io.Flushable; +import java.io.IOException; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import org.apache.zookeeper.ZooDefs.OpCode; +import org.apache.zookeeper.server.Request; +import org.apache.zookeeper.server.RequestProcessor; + +public class SendAckRequestProcessor implements RequestProcessor, Flushable { + private static final Logger LOG = LoggerFactory.getLogger(SendAckRequestProcessor.class); + + Learner learner; + + SendAckRequestProcessor(Learner peer) { + this.learner = peer; + } + + public void processRequest(Request si) { + if(si.type != OpCode.sync){ + QuorumPacket qp = new QuorumPacket(Leader.ACK, si.hdr.getZxid(), null, + null); + try { + learner.writePacket(qp, false); + } catch (IOException e) { + LOG.warn("Closing connection to leader, exception during packet send", e); + try { + if (!learner.sock.isClosed()) { + learner.sock.close(); + } + } catch (IOException e1) { + // Nothing to do, we are shutting things down, so an exception here is irrelevant + LOG.debug("Ignoring error closing the connection", e1); + } + } + } + } + + public void flush() throws IOException { + try { + learner.writePacket(null, true); + } catch(IOException e) { + LOG.warn("Closing connection to leader, exception during packet send", e); + try { + if (!learner.sock.isClosed()) { + learner.sock.close(); + } + } catch (IOException e1) { + // Nothing to do, we are shutting things down, so an exception here is irrelevant + LOG.debug("Ignoring error closing the connection", e1); + } + } + } + + public void shutdown() { + // Nothing needed + } + +} diff --git a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/quorum/ServerBean.java b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/quorum/ServerBean.java new file mode 100644 index 000000000..281c05bc0 --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/quorum/ServerBean.java @@ -0,0 +1,38 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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. + */ + +package org.apache.zookeeper.server.quorum; + +import java.util.Date; + +import org.apache.zookeeper.jmx.ZKMBeanInfo; + +/** + * An abstract base class for the leader and follower MBeans. + */ +public abstract class ServerBean implements ServerMXBean, ZKMBeanInfo { + private final Date startTime=new Date(); + + public boolean isHidden() { + return false; + } + + public String getStartTime() { + return startTime.toString(); + } +} diff --git a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/quorum/ServerMXBean.java b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/quorum/ServerMXBean.java new file mode 100644 index 000000000..df52aea70 --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/quorum/ServerMXBean.java @@ -0,0 +1,33 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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. + */ + +package org.apache.zookeeper.server.quorum; + +/** + * A quorum server MBean. + */ +public interface ServerMXBean { + /** + * @return name of the server MBean + */ + public String getName(); + /** + * @return the start time the server + */ + public String getStartTime(); +} diff --git a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/quorum/StateSummary.java b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/quorum/StateSummary.java new file mode 100644 index 000000000..aaaa4f869 --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/quorum/StateSummary.java @@ -0,0 +1,57 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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. + */ + +package org.apache.zookeeper.server.quorum; + +/** + * This class encapsulates the state comparison logic. Specifically, + * how two different states are compared. + */ +public class StateSummary { + private long currentEpoch; + private long lastZxid; + public StateSummary(long currentEpoch, long lastZxid) { + this.currentEpoch = currentEpoch; + this.lastZxid = lastZxid; + } + + public long getCurrentEpoch() { + return currentEpoch; + } + + public long getLastZxid() { + return lastZxid; + } + + public boolean isMoreRecentThan(StateSummary ss) { + return (currentEpoch > ss.currentEpoch) || (currentEpoch == ss.currentEpoch && lastZxid > ss.lastZxid); + } + @Override + public boolean equals(Object obj) { + if (!(obj instanceof StateSummary)) { + return false; + } + StateSummary ss = (StateSummary)obj; + return currentEpoch == ss.currentEpoch && lastZxid == ss.lastZxid; + } + + @Override + public int hashCode() { + return (int)(currentEpoch ^ lastZxid); + } +} diff --git a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/quorum/Vote.java b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/quorum/Vote.java new file mode 100644 index 000000000..aca9a9a21 --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/quorum/Vote.java @@ -0,0 +1,169 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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. + */ + +package org.apache.zookeeper.server.quorum; + +import org.apache.zookeeper.server.quorum.QuorumPeer.ServerState; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + + +public class Vote { + private static final Logger LOG = LoggerFactory.getLogger(Vote.class); + + public Vote(long id, + long zxid) { + this.version = 0x0; + this.id = id; + this.zxid = zxid; + this.electionEpoch = -1; + this.peerEpoch = -1; + this.state = ServerState.LOOKING; + } + + public Vote(long id, + long zxid, + long peerEpoch) { + this.version = 0x0; + this.id = id; + this.zxid = zxid; + this.electionEpoch = -1; + this.peerEpoch = peerEpoch; + this.state = ServerState.LOOKING; + } + + public Vote(long id, + long zxid, + long electionEpoch, + long peerEpoch) { + this.version = 0x0; + this.id = id; + this.zxid = zxid; + this.electionEpoch = electionEpoch; + this.peerEpoch = peerEpoch; + this.state = ServerState.LOOKING; + } + + public Vote(int version, + long id, + long zxid, + long electionEpoch, + long peerEpoch, + ServerState state) { + this.version = version; + this.id = id; + this.zxid = zxid; + this.electionEpoch = electionEpoch; + this.state = state; + this.peerEpoch = peerEpoch; + } + + public Vote(long id, + long zxid, + long electionEpoch, + long peerEpoch, + ServerState state) { + this.id = id; + this.zxid = zxid; + this.electionEpoch = electionEpoch; + this.state = state; + this.peerEpoch = peerEpoch; + this.version = 0x0; + } + + final private int version; + + final private long id; + + final private long zxid; + + final private long electionEpoch; + + final private long peerEpoch; + + public int getVersion() { + return version; + } + + public long getId() { + return id; + } + + public long getZxid() { + return zxid; + } + + public long getElectionEpoch() { + return electionEpoch; + } + + public long getPeerEpoch() { + return peerEpoch; + } + + public ServerState getState() { + return state; + } + + final private ServerState state; + + @Override + public boolean equals(Object o) { + if (!(o instanceof Vote)) { + return false; + } + Vote other = (Vote) o; + + + /* + * There are two things going on in the logic below. + * First, we compare votes of servers out of election + * using only id and peer epoch. Second, if one version + * is 0x0 and the other isn't, then we only use the + * leader id. This case is here to enable rolling upgrades. + * + * {@see https://issues.apache.org/jira/browse/ZOOKEEPER-1805} + */ + if ((state == ServerState.LOOKING) || + (other.state == ServerState.LOOKING)) { + return (id == other.id + && zxid == other.zxid + && electionEpoch == other.electionEpoch + && peerEpoch == other.peerEpoch); + } else { + if ((version > 0x0) ^ (other.version > 0x0)) { + return id == other.id; + } else { + return (id == other.id + && peerEpoch == other.peerEpoch); + } + } + } + + @Override + public int hashCode() { + return (int) (id & zxid); + } + + public String toString() { + return String.format("(%d, %s, %s)", + id, + Long.toHexString(zxid), + Long.toHexString(peerEpoch)); + } +} diff --git a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/quorum/flexible/QuorumHierarchical.java b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/quorum/flexible/QuorumHierarchical.java new file mode 100644 index 000000000..d37881f90 --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/quorum/flexible/QuorumHierarchical.java @@ -0,0 +1,273 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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. + */ + +package org.apache.zookeeper.server.quorum.flexible; + +import java.io.BufferedReader; +import java.io.File; +import java.io.FileInputStream; +import java.io.FileReader; +import java.io.IOException; +import java.util.HashSet; +import java.util.HashMap; +import java.util.Properties; +import java.util.Map.Entry; + + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import org.apache.zookeeper.server.quorum.QuorumPeerConfig.ConfigException; + + +/** + * This class implements a validator for hierarchical quorums. With this + * construction, zookeeper servers are split into disjoint groups, and + * each server has a weight. We obtain a quorum if we get more than half + * of the total weight of a group for a majority of groups. + * + * The configuration of quorums uses two parameters: group and weight. + * Groups are sets of ZooKeeper servers, and we set a group by passing + * a colon-separated list of server ids. It is also necessary to assign + * weights to server. Here is an example of a configuration that creates + * three groups and assigns a weight of 1 to each server: + * + * group.1=1:2:3 + * group.2=4:5:6 + * group.3=7:8:9 + * + * weight.1=1 + * weight.2=1 + * weight.3=1 + * weight.4=1 + * weight.5=1 + * weight.6=1 + * weight.7=1 + * weight.8=1 + * weight.9=1 + * + * Note that it is still necessary to define peers using the server keyword. + */ + +public class QuorumHierarchical implements QuorumVerifier { + private static final Logger LOG = LoggerFactory.getLogger(QuorumHierarchical.class); + + HashMap serverWeight; + HashMap serverGroup; + HashMap groupWeight; + + int numGroups; + + /** + * This contructor requires the quorum configuration + * to be declared in a separate file, and it takes the + * file as an input parameter. + */ + public QuorumHierarchical(String filename) + throws ConfigException { + this.serverWeight = new HashMap(); + this.serverGroup = new HashMap(); + this.groupWeight = new HashMap(); + this.numGroups = 0; + + readConfigFile(filename); + } + + /** + * This constructor takes a set of properties. We use + * it in the unit test for this feature. + */ + + public QuorumHierarchical(Properties qp) + throws ConfigException { + this.serverWeight = new HashMap(); + this.serverGroup = new HashMap(); + this.groupWeight = new HashMap(); + this.numGroups = 0; + + parse(qp); + + LOG.info(serverWeight.size() + ", " + serverGroup.size() + ", " + groupWeight.size()); + } + + /** + * This contructor takes the two hash maps needed to enable + * validating quorums. We use it with QuorumPeerConfig. That is, + * we declare weights and groups in the server configuration + * file along with the other parameters. + * @param numGroups + * @param serverWeight + * @param serverGroup + */ + public QuorumHierarchical(int numGroups, + HashMap serverWeight, + HashMap serverGroup) + { + this.serverWeight = serverWeight; + this.serverGroup = serverGroup; + this.groupWeight = new HashMap(); + + this.numGroups = numGroups; + computeGroupWeight(); + } + + + /** + * Returns the weight of a server. + * + * @param id + */ + public long getWeight(long id){ + return serverWeight.get(id); + } + + /** + * Reads a configration file. Called from the constructor + * that takes a file as an input. + */ + private void readConfigFile(String filename) + throws ConfigException{ + File configFile = new File(filename); + + LOG.info("Reading configuration from: " + configFile); + + try { + if (!configFile.exists()) { + throw new IllegalArgumentException(configFile.toString() + + " file is missing"); + } + + Properties cfg = new Properties(); + FileInputStream in = new FileInputStream(configFile); + try { + cfg.load(in); + } finally { + in.close(); + } + + parse(cfg); + } catch (IOException e) { + throw new ConfigException("Error processing " + filename, e); + } catch (IllegalArgumentException e) { + throw new ConfigException("Error processing " + filename, e); + } + + } + + + /** + * Parse properties if configuration given in a separate file. + */ + private void parse(Properties quorumProp){ + for (Entry entry : quorumProp.entrySet()) { + String key = entry.getKey().toString(); + String value = entry.getValue().toString(); + if (key.startsWith("group")) { + int dot = key.indexOf('.'); + long gid = Long.parseLong(key.substring(dot + 1)); + + numGroups++; + + String parts[] = value.split(":"); + for(String s : parts){ + long sid = Long.parseLong(s); + serverGroup.put(sid, gid); + } + + + } else if(key.startsWith("weight")) { + int dot = key.indexOf('.'); + long sid = Long.parseLong(key.substring(dot + 1)); + serverWeight.put(sid, Long.parseLong(value)); + } + } + + computeGroupWeight(); + } + + /** + * This method pre-computes the weights of groups to speed up processing + * when validating a given set. We compute the weights of groups in + * different places, so we have a separate method. + */ + private void computeGroupWeight(){ + for(long sid : serverGroup.keySet()){ + Long gid = serverGroup.get(sid); + if(!groupWeight.containsKey(gid)) + groupWeight.put(gid, serverWeight.get(sid)); + else { + long totalWeight = serverWeight.get(sid) + groupWeight.get(gid); + groupWeight.put(gid, totalWeight); + } + } + + /* + * Do not consider groups with weight zero + */ + for(long weight: groupWeight.values()){ + LOG.debug("Group weight: " + weight); + if(weight == ((long) 0)){ + numGroups--; + LOG.debug("One zero-weight group: " + 1 + ", " + numGroups); + } + } + } + + /** + * Verifies if a given set is a quorum. + */ + public boolean containsQuorum(HashSet set){ + HashMap expansion = new HashMap(); + + /* + * Adds up weights per group + */ + if(set.size() == 0) return false; + else LOG.debug("Set size: " + set.size()); + + for(long sid : set){ + Long gid = serverGroup.get(sid); + if(!expansion.containsKey(gid)) + expansion.put(gid, serverWeight.get(sid)); + else { + long totalWeight = serverWeight.get(sid) + expansion.get(gid); + expansion.put(gid, totalWeight); + } + } + + /* + * Check if all groups have majority + */ + int majGroupCounter = 0; + for(long gid : expansion.keySet()) { + LOG.debug("Group info: " + expansion.get(gid) + ", " + gid + ", " + groupWeight.get(gid)); + if(expansion.get(gid) > (groupWeight.get(gid) / 2) ) + majGroupCounter++; + } + + LOG.debug("Majority group counter: " + majGroupCounter + ", " + numGroups); + if((majGroupCounter > (numGroups / 2))){ + LOG.debug("Positive set size: " + set.size()); + return true; + } + else { + LOG.debug("Negative set size: " + set.size()); + return false; + } + } +} diff --git a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/quorum/flexible/QuorumMaj.java b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/quorum/flexible/QuorumMaj.java new file mode 100644 index 000000000..04773d711 --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/quorum/flexible/QuorumMaj.java @@ -0,0 +1,63 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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. + */ + +package org.apache.zookeeper.server.quorum.flexible; + +import java.util.HashSet; + +//import org.apache.zookeeper.server.quorum.QuorumCnxManager; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * This class implements a validator for majority quorums. The + * implementation is straightforward. + * + */ +public class QuorumMaj implements QuorumVerifier { + private static final Logger LOG = LoggerFactory.getLogger(QuorumMaj.class); + + int half; + + /** + * Defines a majority to avoid computing it every time. + * + * @param n number of servers + */ + public QuorumMaj(int n){ + this.half = n/2; + } + + /** + * Returns weight of 1 by default. + * + * @param id + */ + public long getWeight(long id){ + return (long) 1; + } + + /** + * Verifies if a set is a majority. + */ + public boolean containsQuorum(HashSet set){ + return (set.size() > half); + } + +} diff --git a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/quorum/flexible/QuorumVerifier.java b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/quorum/flexible/QuorumVerifier.java new file mode 100644 index 000000000..984036560 --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/quorum/flexible/QuorumVerifier.java @@ -0,0 +1,33 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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. + */ + +package org.apache.zookeeper.server.quorum.flexible; + +import java.util.HashSet; + +/** + * All quorum validators have to implement a method called + * containsQuorum, which verifies if a HashSet of server + * identifiers constitutes a quorum. + * + */ + +public interface QuorumVerifier { + long getWeight(long id); + boolean containsQuorum(HashSet set); +} diff --git a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/upgrade/DataNodeV1.java b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/upgrade/DataNodeV1.java new file mode 100644 index 000000000..6156d99b7 --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/upgrade/DataNodeV1.java @@ -0,0 +1,129 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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. + */ + +package org.apache.zookeeper.server.upgrade; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.HashSet; +import java.util.List; + +import org.apache.jute.Index; +import org.apache.jute.InputArchive; +import org.apache.jute.OutputArchive; +import org.apache.jute.Record; +import org.apache.zookeeper.data.ACL; +import org.apache.zookeeper.data.Stat; +import org.apache.zookeeper.data.StatPersistedV1; + +/** + * This class contains the data for a node in the data tree. + *

      + * A data node contains a reference to its parent, a byte array as its data, an + * array of ACLs, a stat object, and a set of its children's paths. + * + */ +public class DataNodeV1 implements Record { + DataNodeV1() { + // default rather than public constructor + } + + DataNodeV1(DataNodeV1 parent, byte data[], List acl, StatPersistedV1 stat) { + this.parent = parent; + this.data = data; + this.acl = acl; + this.stat = stat; + this.children = new HashSet(); + } + + + /** + * convenience method for creating DataNode + * fully + * @param children + */ + public void setChildren(HashSet children) { + this.children = children; + } + + /** + * convenience methods to get the children + * @return the children of this datanode + */ + public HashSet getChildren() { + return this.children; + } + + DataNodeV1 parent; + + byte data[]; + + List acl; + + public StatPersistedV1 stat; + + HashSet children = new HashSet(); + + public void copyStat(Stat to) { + to.setAversion(stat.getAversion()); + to.setCtime(stat.getCtime()); + to.setCversion(stat.getCversion()); + to.setCzxid(stat.getCzxid()); + to.setMtime(stat.getMtime()); + to.setMzxid(stat.getMzxid()); + to.setVersion(stat.getVersion()); + to.setEphemeralOwner(stat.getEphemeralOwner()); + to.setDataLength(data.length); + to.setNumChildren(children.size()); + } + + public void deserialize(InputArchive archive, String tag) + throws IOException { + archive.startRecord("node"); + data = archive.readBuffer("data"); + Index i = archive.startVector("acl"); + if (i != null) { + acl = new ArrayList(); + while (!i.done()) { + ACL a = new ACL(); + a.deserialize(archive, "aclEntry"); + acl.add(a); + i.incr(); + } + } + archive.endVector("acl"); + stat = new StatPersistedV1(); + stat.deserialize(archive, "stat"); + archive.endRecord("node"); + } + + synchronized public void serialize(OutputArchive archive, String tag) + throws IOException { + archive.startRecord(this, "node"); + archive.writeBuffer(data, "data"); + archive.startVector(acl, "acl"); + if (acl != null) { + for (ACL a : acl) { + a.serialize(archive, "aclEntry"); + } + } + archive.endVector(acl, "acl"); + stat.serialize(archive, "stat"); + archive.endRecord(this, "node"); + } +} diff --git a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/upgrade/DataTreeV1.java b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/upgrade/DataTreeV1.java new file mode 100644 index 000000000..e3d0633f6 --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/upgrade/DataTreeV1.java @@ -0,0 +1,584 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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. + */ + +package org.apache.zookeeper.server.upgrade; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.Collection; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.concurrent.ConcurrentHashMap; + +import org.apache.jute.InputArchive; +import org.apache.jute.OutputArchive; +import org.apache.jute.Record; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.apache.zookeeper.KeeperException; +import org.apache.zookeeper.Watcher; +import org.apache.zookeeper.KeeperException.Code; +import org.apache.zookeeper.KeeperException.NoNodeException; +import org.apache.zookeeper.Watcher.Event; +import org.apache.zookeeper.Watcher.Event.EventType; +import org.apache.zookeeper.ZooDefs.OpCode; +import org.apache.zookeeper.data.ACL; +import org.apache.zookeeper.data.Stat; +import org.apache.zookeeper.data.StatPersistedV1; +import org.apache.zookeeper.server.WatchManager; +import org.apache.zookeeper.txn.CreateTxn; +import org.apache.zookeeper.txn.DeleteTxn; +import org.apache.zookeeper.txn.ErrorTxn; +import org.apache.zookeeper.txn.SetACLTxn; +import org.apache.zookeeper.txn.SetDataTxn; +import org.apache.zookeeper.txn.TxnHeader; + +/** + * This class maintains the tree data structure. It doesn't have any networking + * or client connection code in it so that it can be tested in a stand alone + * way. + *

      + * The tree maintains two parallel data structures: a hashtable that maps from + * full paths to DataNodes and a tree of DataNodes. All accesses to a path is + * through the hashtable. The tree is traversed only when serializing to disk. + */ +public class DataTreeV1 { + private static final Logger LOG = LoggerFactory.getLogger(DataTreeV1.class); + + /** + * This hashtable provides a fast lookup to the datanodes. The tree is the + * source of truth and is where all the locking occurs + */ + private ConcurrentHashMap nodes = new ConcurrentHashMap(); + + private WatchManager dataWatches = new WatchManager(); + + private WatchManager childWatches = new WatchManager(); + + /** + * This hashtable lists the paths of the ephemeral nodes of a session. + */ + private Map> ephemerals = new ConcurrentHashMap>(); + + /** + * return the ephemerals for this tree + * @return the ephemerals for this tree + */ + public Map> getEphemeralsMap() { + return this.ephemerals; + } + + public void setEphemeralsMap(Map> ephemerals) { + this.ephemerals = ephemerals; + } + + @SuppressWarnings("unchecked") + public HashSet getEphemerals(long sessionId) { + HashSet retv = ephemerals.get(sessionId); + if (retv == null) { + return new HashSet(); + } + HashSet cloned = null; + synchronized(retv) { + cloned = (HashSet) retv.clone(); + } + return cloned; + } + + public Collection getSessions() { + return ephemerals.keySet(); + } + + public DataNodeV1 getNode(String path) { + return nodes.get(path); + } + + /** + * This is a pointer to the root of the DataTree. It is the source of truth, + * but we usually use the nodes hashmap to find nodes in the tree. + */ + private DataNodeV1 root = new DataNodeV1(null, new byte[0], null, new StatPersistedV1()); + + public DataTreeV1() { + /* Rather than fight it, let root have an alias */ + nodes.put("", root); + nodes.put("/", root); + } + + static public void copyStatPersisted(StatPersistedV1 from, StatPersistedV1 to) { + to.setAversion(from.getAversion()); + to.setCtime(from.getCtime()); + to.setCversion(from.getCversion()); + to.setCzxid(from.getCzxid()); + to.setMtime(from.getMtime()); + to.setMzxid(from.getMzxid()); + to.setVersion(from.getVersion()); + to.setEphemeralOwner(from.getEphemeralOwner()); + } + + static public void copyStat(Stat from, Stat to) { + to.setAversion(from.getAversion()); + to.setCtime(from.getCtime()); + to.setCversion(from.getCversion()); + to.setCzxid(from.getCzxid()); + to.setMtime(from.getMtime()); + to.setMzxid(from.getMzxid()); + to.setVersion(from.getVersion()); + to.setEphemeralOwner(from.getEphemeralOwner()); + to.setDataLength(from.getDataLength()); + to.setNumChildren(from.getNumChildren()); + } + + + // public void remooveInterest(String path, Watcher nw) { + // DataNode n = nodes.get(path); + // if (n == null) { + // synchronized (nonExistentWatches) { + // HashSet list = nonExistentWatches.get(path); + // if (list != null) { + // list.remove(nw); + // } + // } + // } + // synchronized (n) { + // n.dataWatchers.remove(nw); + // n.childWatchers.remove(nw); + // } + // } + + /** + * @param path + * @param data + * @param acl + * @param ephemeralOwner + * the session id that owns this node. -1 indicates this is + * not an ephemeral node. + * @param zxid + * @param time + * @return the patch of the created node + * @throws KeeperException + */ + public String createNode(String path, byte data[], List acl, + long ephemeralOwner, long zxid, long time) + throws KeeperException.NoNodeException, KeeperException.NodeExistsException { + int lastSlash = path.lastIndexOf('/'); + String parentName = path.substring(0, lastSlash); + String childName = path.substring(lastSlash + 1); + StatPersistedV1 stat = new StatPersistedV1(); + stat.setCtime(time); + stat.setMtime(time); + stat.setCzxid(zxid); + stat.setMzxid(zxid); + stat.setVersion(0); + stat.setAversion(0); + stat.setEphemeralOwner(ephemeralOwner); + DataNodeV1 parent = nodes.get(parentName); + if (parent == null) { + throw new KeeperException.NoNodeException(); + } + synchronized (parent) { + if (parent.children.contains(childName)) { + throw new KeeperException.NodeExistsException(); + } + int cver = parent.stat.getCversion(); + cver++; + parent.stat.setCversion(cver); + DataNodeV1 child = new DataNodeV1(parent, data, acl, stat); + parent.children.add(childName); + nodes.put(path, child); + if (ephemeralOwner != 0) { + HashSet list = ephemerals.get(ephemeralOwner); + if (list == null) { + list = new HashSet(); + ephemerals.put(ephemeralOwner, list); + } + synchronized(list) { + list.add(path); + } + } + } + dataWatches.triggerWatch(path, Event.EventType.NodeCreated); + childWatches.triggerWatch(parentName.equals("")?"/":parentName, Event.EventType.NodeChildrenChanged); + return path; + } + + public void deleteNode(String path) throws KeeperException.NoNodeException { + int lastSlash = path.lastIndexOf('/'); + String parentName = path.substring(0, lastSlash); + String childName = path.substring(lastSlash + 1); + DataNodeV1 node = nodes.get(path); + if (node == null) { + throw new KeeperException.NoNodeException(); + } + nodes.remove(path); + DataNodeV1 parent = nodes.get(parentName); + if (parent == null) { + throw new KeeperException.NoNodeException(); + } + synchronized (parent) { + parent.children.remove(childName); + parent.stat.setCversion(parent.stat.getCversion() + 1); + long eowner = node.stat.getEphemeralOwner(); + if (eowner != 0) { + HashSet nodes = ephemerals.get(eowner); + if (nodes != null) { + synchronized(nodes) { + nodes.remove(path); + } + } + } + node.parent = null; + } + Set processed = + dataWatches.triggerWatch(path, EventType.NodeDeleted); + childWatches.triggerWatch(path, EventType.NodeDeleted, processed); + childWatches.triggerWatch(parentName.equals("")?"/":parentName, EventType.NodeChildrenChanged); + } + + public Stat setData(String path, byte data[], int version, long zxid, + long time) throws KeeperException.NoNodeException { + Stat s = new Stat(); + DataNodeV1 n = nodes.get(path); + if (n == null) { + throw new KeeperException.NoNodeException(); + } + synchronized (n) { + n.data = data; + n.stat.setMtime(time); + n.stat.setMzxid(zxid); + n.stat.setVersion(version); + n.copyStat(s); + } + dataWatches.triggerWatch(path, EventType.NodeDataChanged); + return s; + } + + public byte[] getData(String path, Stat stat, Watcher watcher) throws KeeperException.NoNodeException { + DataNodeV1 n = nodes.get(path); + if (n == null) { + throw new KeeperException.NoNodeException(); + } + synchronized (n) { + n.copyStat(stat); + if (watcher != null) { + dataWatches.addWatch(path, watcher); + } + return n.data; + } + } + + public Stat statNode(String path, Watcher watcher) throws KeeperException.NoNodeException { + Stat stat = new Stat(); + DataNodeV1 n = nodes.get(path); + if (watcher != null) { + dataWatches.addWatch(path, watcher); + } + if (n == null) { + throw new KeeperException.NoNodeException(); + } + synchronized (n) { + n.copyStat(stat); + return stat; + } + } + + public ArrayList getChildren(String path, Stat stat, Watcher watcher) throws KeeperException.NoNodeException { + DataNodeV1 n = nodes.get(path); + if (n == null) { + throw new KeeperException.NoNodeException(); + } + synchronized (n) { + ArrayList children = new ArrayList(); + children.addAll(n.children); + if (watcher != null) { + childWatches.addWatch(path, watcher); + } + return children; + } + } + + public Stat setACL(String path, List acl, int version) throws KeeperException.NoNodeException { + Stat stat = new Stat(); + DataNodeV1 n = nodes.get(path); + if (n == null) { + throw new KeeperException.NoNodeException(); + } + synchronized (n) { + n.stat.setAversion(version); + n.acl = acl; + n.copyStat(stat); + return stat; + } + } + + @SuppressWarnings("unchecked") + public List getACL(String path, Stat stat) throws KeeperException.NoNodeException { + DataNodeV1 n = nodes.get(path); + if (n == null) { + throw new KeeperException.NoNodeException(); + } + synchronized (n) { + n.copyStat(stat); + return new ArrayList(n.acl); + } + } + + static public class ProcessTxnResult { + public long clientId; + + public int cxid; + + public long zxid; + + public int err; + + public int type; + + public String path; + + public Stat stat; + + /** + * Equality is defined as the clientId and the cxid being the same. This + * allows us to use hash tables to track completion of transactions. + * + * @see java.lang.Object#equals(java.lang.Object) + */ + @Override + public boolean equals(Object o) { + if (o instanceof ProcessTxnResult) { + ProcessTxnResult other = (ProcessTxnResult) o; + return other.clientId == clientId && other.cxid == cxid; + } + return false; + } + + /** + * See equals() to find the rational for how this hashcode is generated. + * + * @see ProcessTxnResult#equals(Object) + * @see java.lang.Object#hashCode() + */ + @Override + public int hashCode() { + return (int) ((clientId ^ cxid) % Integer.MAX_VALUE); + } + + } + + public volatile long lastProcessedZxid = 0; + + @SuppressWarnings("unchecked") + public ProcessTxnResult processTxn(TxnHeader header, Record txn) { + ProcessTxnResult rc = new ProcessTxnResult(); + + String debug = ""; + try { + rc.clientId = header.getClientId(); + rc.cxid = header.getCxid(); + rc.zxid = header.getZxid(); + rc.type = header.getType(); + rc.err = 0; + if (rc.zxid > lastProcessedZxid) { + lastProcessedZxid = rc.zxid; + } + switch (header.getType()) { + case OpCode.create: + CreateTxn createTxn = (CreateTxn) txn; + debug = "Create transaction for " + createTxn.getPath(); + createNode(createTxn.getPath(), createTxn.getData(), createTxn + .getAcl(), createTxn.getEphemeral() ? header + .getClientId() : 0, header.getZxid(), header.getTime()); + rc.path = createTxn.getPath(); + break; + case OpCode.delete: + DeleteTxn deleteTxn = (DeleteTxn) txn; + debug = "Delete transaction for " + deleteTxn.getPath(); + deleteNode(deleteTxn.getPath()); + break; + case OpCode.setData: + SetDataTxn setDataTxn = (SetDataTxn) txn; + debug = "Set data for transaction for " + setDataTxn.getPath(); + rc.stat = setData(setDataTxn.getPath(), setDataTxn.getData(), + setDataTxn.getVersion(), header.getZxid(), header + .getTime()); + break; + case OpCode.setACL: + SetACLTxn setACLTxn = (SetACLTxn) txn; + debug = "Set ACL for transaction for " + setACLTxn.getPath(); + rc.stat = setACL(setACLTxn.getPath(), setACLTxn.getAcl(), + setACLTxn.getVersion()); + break; + case OpCode.closeSession: + killSession(header.getClientId()); + break; + case OpCode.error: + ErrorTxn errTxn = (ErrorTxn) txn; + rc.err = errTxn.getErr(); + break; + } + } catch (KeeperException e) { + // These are expected errors since we take a lazy snapshot + if (initialized + || (e.code() != Code.NONODE + && e.code() != Code.NODEEXISTS)) { + LOG.warn("Failed:" + debug, e); + } + } + return rc; + } + + void killSession(long session) { + // the list is already removed from the ephemerals + // so we do not have to worry about synchronyzing on + // the list. This is only called from FinalRequestProcessor + // so there is no need for synchornization. The list is not + // changed here. Only create and delete change the list which + // are again called from FinalRequestProcessor in sequence. + HashSet list = ephemerals.remove(session); + if (list != null) { + for (String path : list) { + try { + deleteNode(path); + if (LOG.isDebugEnabled()) { + LOG.debug("Deleting ephemeral node " + path + + " for session 0x" + + Long.toHexString(session)); + } + } catch (NoNodeException e) { + LOG.warn("Ignoring NoNodeException for path " + path + + " while removing ephemeral for dead session 0x" + + Long.toHexString(session)); + } + } + } + } + + /** + * this method uses a stringbuilder to create a new + * path for children. This is faster than string + * appends ( str1 + str2). + * @param oa OutputArchive to write to. + * @param path a string builder. + * @throws IOException + * @throws InterruptedException + */ + void serializeNode(OutputArchive oa, StringBuilder path) + throws IOException, InterruptedException { + String pathString = path.toString(); + DataNodeV1 node = getNode(pathString); + if (node == null) { + return; + } + String children[] = null; + synchronized (node) { + scount++; + oa.writeString(pathString, "path"); + oa.writeRecord(node, "node"); + children = node.children.toArray(new String[node.children.size()]); + } + path.append('/'); + int off = path.length(); + if (children != null) { + for (String child : children) { + //since this is single buffer being resused + // we need + // to truncate the previous bytes of string. + path.delete(off, Integer.MAX_VALUE); + path.append(child); + serializeNode(oa, path); + } + } + } + + int scount; + + public boolean initialized = false; + + public void serialize(OutputArchive oa, String tag) throws IOException, + InterruptedException { + scount = 0; + serializeNode(oa, new StringBuilder("")); + // / marks end of stream + // we need to check if clear had been called in between the snapshot. + if (root != null) { + oa.writeString("/", "path"); + } + } + + public void deserialize(InputArchive ia, String tag) throws IOException { + nodes.clear(); + String path = ia.readString("path"); + while (!path.equals("/")) { + DataNodeV1 node = new DataNodeV1(); + ia.readRecord(node, "node"); + nodes.put(path, node); + int lastSlash = path.lastIndexOf('/'); + if (lastSlash == -1) { + root = node; + } else { + String parentPath = path.substring(0, lastSlash); + node.parent = nodes.get(parentPath); + node.parent.children.add(path.substring(lastSlash + 1)); + long eowner = node.stat.getEphemeralOwner(); + if (eowner != 0) { + HashSet list = ephemerals.get(eowner); + if (list == null) { + list = new HashSet(); + ephemerals.put(eowner, list); + } + list.add(path); + } + } + path = ia.readString("path"); + } + nodes.put("/", root); + } + + public String dumpEphemerals() { + Set keys = ephemerals.keySet(); + StringBuilder sb = new StringBuilder("Sessions with Ephemerals (" + + keys.size() + "):\n"); + for (long k : keys) { + sb.append("0x" + Long.toHexString(k)); + sb.append(":\n"); + HashSet tmp = ephemerals.get(k); + synchronized(tmp) { + for (String path : tmp) { + sb.append("\t" + path + "\n"); + } + } + } + return sb.toString(); + } + + public void removeCnxn(Watcher watcher) { + dataWatches.removeWatcher(watcher); + childWatches.removeWatcher(watcher); + } + + public void clear() { + root = null; + nodes.clear(); + ephemerals.clear(); + // dataWatches = null; + // childWatches = null; + } +} diff --git a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/upgrade/UpgradeMain.java b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/upgrade/UpgradeMain.java new file mode 100644 index 000000000..779c48187 --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/upgrade/UpgradeMain.java @@ -0,0 +1,181 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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. + */ + +package org.apache.zookeeper.server.upgrade; + +import java.io.File; +import java.io.IOException; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.apache.zookeeper.server.DataTree; +import org.apache.zookeeper.server.persistence.FileTxnSnapLog; + +/** + * This class upgrades the older database + * to a new database for the zookeeper + * servers. + * The way to run it is + * java -class path zookeeper.jar Upgrade dataDir snapShotDir + * or using zookeeper scripts with zkServer -upgrade dataDir snapShotDir + * it creates a backup in the dataDir/.bkup and snapShotDir/.bkup which + * can be retrieved back to the snapShotDir and dataDir + */ +public class UpgradeMain { + File snapShotDir; + File dataDir; + File bkupsnapShotDir; + File bkupdataDir; + File currentdataDir; + File currentsnapShotDir; + + private static final Logger LOG = LoggerFactory.getLogger(UpgradeMain.class); + private static final String USAGE = "Usage: UpgradeMain dataDir snapShotDir"; + private static final int LASTVERSION = 1; + private static final int CURRENTVERSION = FileTxnSnapLog.VERSION; + private static final String dirName = FileTxnSnapLog.version; + private static final String manual = "Please take manual steps to " + + "sanitize your database.\n Please read the upgrade manual"; + + /** + * upgrade class that takes the two file + * directories. + * @param dataDir the directory that contains the + * transaction logs + * @param snapShotDir the directory that contains + * the snapshots + */ + public UpgradeMain(File dataDir, File snapShotDir) { + this.snapShotDir = snapShotDir; + this.dataDir = dataDir; + this.bkupdataDir = new File(dataDir, dirName + LASTVERSION); + this.bkupsnapShotDir = new File(snapShotDir, dirName + LASTVERSION ); + this.currentsnapShotDir = new File(snapShotDir, dirName + CURRENTVERSION); + this.currentdataDir = new File(dataDir, dirName + CURRENTVERSION); + } + + /** + * create all the bkup directories and the current + * database directories + * @throws IOException + */ + private void createAllDirs() throws IOException { + String error = "backup directory " + bkupdataDir + " already exists"; + LOG.info("Creating previous version data dir " + bkupdataDir); + if (!bkupdataDir.mkdirs()) { + LOG.error(error); + LOG.error(manual); + throw new IOException(error); + } + LOG.info("Creating previous version snapshot dir " + bkupdataDir); + if (!bkupsnapShotDir.mkdirs() && !bkupsnapShotDir.exists()) { + LOG.error(error); + LOG.error(manual); + throw new IOException(error); + } + error = "current directory " + currentdataDir + " already exists"; + LOG.info("Creating current data dir " + currentdataDir); + if (!currentdataDir.mkdirs()) { + LOG.error(error); + LOG.error(manual); + throw new IOException(error); + } + LOG.info("Creating current snapshot dir " + currentdataDir); + if (!currentsnapShotDir.mkdirs() && !currentsnapShotDir.exists()) { + LOG.error(error); + LOG.error(manual); + throw new IOException(error); + } + } + + /** + * copy files from srcdir to dstdir that have the string + * filter in the srcdir filenames + * @param srcDir the source directory + * @param dstDir the destination directory + * @param filter the filter of filenames that + * need to be copied. + * @throws IOException + */ + void copyFiles(File srcDir, File dstDir, String filter) throws IOException { + File[] list = srcDir.listFiles(); + for (File file: list) { + String name = file.getName(); + if (name.startsWith(filter)) { + // we need to copy this file + File dest = new File(dstDir, name); + LOG.info("Renaming " + file + " to " + dest); + if (!file.renameTo(dest)) { + throw new IOException("Unable to rename " + + file + " to " + dest); + } + } + } + } + + /** + * run the upgrade + * @throws IOException + */ + public void runUpgrade() throws IOException { + if (!dataDir.exists()) { + throw new IOException(dataDir + " does not exist"); + } + if (!snapShotDir.exists()) { + throw new IOException(snapShotDir + " does not exist"); + } + // create the bkup directorya + createAllDirs(); + //copy all the files for backup + try { + copyFiles(dataDir, bkupdataDir, "log"); + copyFiles(snapShotDir, bkupsnapShotDir, "snapshot"); + } catch(IOException io) { + LOG.error("Failed in backing up."); + throw io; + } + + //evrything is backed up + // read old database and create + // an old snapshot + UpgradeSnapShotV1 upgrade = new UpgradeSnapShotV1(bkupdataDir, + bkupsnapShotDir); + LOG.info("Creating new data tree"); + DataTree dt = upgrade.getNewDataTree(); + FileTxnSnapLog filesnapLog = new FileTxnSnapLog(dataDir, + snapShotDir); + LOG.info("snapshotting the new datatree"); + filesnapLog.save(dt, upgrade.getSessionWithTimeOuts()); + //done saving. + LOG.info("Upgrade is complete"); + } + + public static void main(String[] argv) { + if (argv.length < 2) { + LOG.error(USAGE); + System.exit(-1); + } + try { + UpgradeMain upgrade = new UpgradeMain(new File(argv[0]), new File(argv[1])); + upgrade.runUpgrade(); + } catch(Throwable th) { + LOG.error("Upgrade Error: Please read the " + + "docs for manual failure recovery ", th); + } + } +} diff --git a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/upgrade/UpgradeSnapShot.java b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/upgrade/UpgradeSnapShot.java new file mode 100644 index 000000000..8cfbd93d7 --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/upgrade/UpgradeSnapShot.java @@ -0,0 +1,33 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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. + */ + +package org.apache.zookeeper.server.upgrade; + +import java.io.IOException; +import java.util.concurrent.ConcurrentHashMap; + +import org.apache.zookeeper.server.DataTree; + +/** + * interface for snapshot conversion. + * + */ +public interface UpgradeSnapShot { + public DataTree getNewDataTree() throws IOException; + public ConcurrentHashMap getSessionWithTimeOuts(); +} diff --git a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/upgrade/UpgradeSnapShotV1.java b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/upgrade/UpgradeSnapShotV1.java new file mode 100644 index 000000000..aecc4d2a6 --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/upgrade/UpgradeSnapShotV1.java @@ -0,0 +1,332 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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. + */ + +package org.apache.zookeeper.server.upgrade; + +import java.io.BufferedInputStream; +import java.io.ByteArrayInputStream; +import java.io.EOFException; +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; + +import org.apache.jute.BinaryInputArchive; +import org.apache.jute.InputArchive; +import org.apache.jute.Record; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.apache.zookeeper.ZooDefs.OpCode; +import org.apache.zookeeper.data.StatPersisted; +import org.apache.zookeeper.data.StatPersistedV1; +import org.apache.zookeeper.server.DataNode; +import org.apache.zookeeper.server.DataTree; +import org.apache.zookeeper.server.Request; +import org.apache.zookeeper.server.ZooTrace; +import org.apache.zookeeper.server.persistence.FileTxnLog; +import org.apache.zookeeper.server.persistence.Util; +import org.apache.zookeeper.server.util.SerializeUtils; +import org.apache.zookeeper.txn.CreateSessionTxn; +import org.apache.zookeeper.txn.TxnHeader; + +/** + * This class gets the old snapshot + * and the old dataDir and creates + * an brand new snapshot that is + * then converted to the new snapshot + * for upgrading. + */ +public class UpgradeSnapShotV1 implements UpgradeSnapShot { + private static final Logger LOG = LoggerFactory.getLogger(UpgradeSnapShotV1.class); + + ConcurrentHashMap sessionsWithTimeouts = + new ConcurrentHashMap(); + File dataDir; + File snapShotDir; + DataTreeV1 oldDataTree; + + /** + * upgrade from version 1 to version 2 + * @param dataDir + * @param snapShotDir + */ + public UpgradeSnapShotV1(File dataDir, File snapShotDir) { + this.dataDir = dataDir; + this.snapShotDir = snapShotDir; + oldDataTree = new DataTreeV1(); + } + + /** + * deseriluize from an inputarchive + * @param oldTree the tree to be created + * @param ia the input archive to be read from + * @param sessions the sessions to be created + * @throws IOException + */ + private void deserializeSnapshot(DataTreeV1 oldTree, InputArchive ia, + Map sessions) throws IOException { + int count = ia.readInt("count"); + while (count > 0) { + long id = ia.readLong("id"); + int to = ia.readInt("timeout"); + sessions.put(id, to); + if (LOG.isTraceEnabled()) { + ZooTrace.logTraceMessage(LOG, ZooTrace.SESSION_TRACE_MASK, + "loadData --- session in archive: " + id + + " with timeout: " + to); + } + count--; + } + oldTree.deserialize(ia, "tree"); + } + + /** + * play the log from this logstream into the datatree + * @param logStream + * @return + * @throws IOException + */ + public long playLog(InputArchive logStream) throws IOException { + long highestZxid = 0; + try { + while (true) { + byte[] bytes = logStream.readBuffer("txnEntry"); + if (bytes.length == 0) { + // Since we preallocate, we define EOF to be an + // empty transaction + throw new EOFException(); + } + TxnHeader hdr = new TxnHeader(); + Record txn = SerializeUtils.deserializeTxn(bytes, hdr); + if (logStream.readByte("EOR") != 'B') { + LOG.warn("Last transaction was partial."); + throw new EOFException("Last transaction was partial."); + } + if (hdr.getZxid() <= highestZxid && highestZxid != 0) { + LOG.error(highestZxid + "(higestZxid) >= " + + hdr.getZxid() + "(next log) for type " + + hdr.getType()); + } else { + highestZxid = hdr.getZxid(); + } + switch (hdr.getType()) { + case OpCode.createSession: + sessionsWithTimeouts.put(hdr.getClientId(), + ((CreateSessionTxn) txn).getTimeOut()); + if (LOG.isTraceEnabled()) { + ZooTrace.logTraceMessage(LOG, + ZooTrace.SESSION_TRACE_MASK, + "playLog --- create session in log: 0x" + + Long.toHexString(hdr.getClientId()) + + " with timeout: " + + ((CreateSessionTxn) txn).getTimeOut()); + } + // give dataTree a chance to sync its lastProcessedZxid + oldDataTree.processTxn(hdr, txn); + break; + case OpCode.closeSession: + sessionsWithTimeouts.remove(hdr.getClientId()); + if (LOG.isTraceEnabled()) { + ZooTrace.logTraceMessage(LOG, + ZooTrace.SESSION_TRACE_MASK, + "playLog --- close session in log: 0x" + + Long.toHexString(hdr.getClientId())); + } + oldDataTree.processTxn(hdr, txn); + break; + default: + oldDataTree.processTxn(hdr, txn); + } + Request r = new Request(null, 0, hdr.getCxid(), hdr.getType(), + null, null); + r.txn = txn; + r.hdr = hdr; + r.zxid = hdr.getZxid(); + } + } catch (EOFException e) { + // expected in some cases - see comments in try block + } + return highestZxid; + } + + + + /** + * apply the log files to the datatree + * @param oldTree the datatreee to apply the logs to + * @param logFiles the logs to be applied + * @throws IOException + */ + private long processLogFiles(DataTreeV1 oldTree, + File[] logFiles) throws IOException { + long zxid = 0; + for (File f: logFiles) { + LOG.info("Processing log file: " + f); + InputStream logIs = + new BufferedInputStream(new FileInputStream(f)); + zxid = playLog(BinaryInputArchive.getArchive(logIs)); + logIs.close(); + } + return zxid; + } + + /** + * create the old snapshot database + * apply logs to it and create the final + * database + * @throws IOException + */ + private void loadThisSnapShot() throws IOException { + // pick the most recent snapshot + File snapshot = findMostRecentSnapshot(); + if (snapshot == null) { + throw new IOException("Invalid snapshots " + + "or not snapshots in " + snapShotDir); + } + InputStream inputstream = new BufferedInputStream( + new FileInputStream(snapshot)); + InputArchive ia = BinaryInputArchive.getArchive(inputstream); + deserializeSnapshot(oldDataTree, ia, sessionsWithTimeouts); + //ok done with the snapshot + // now apply the logs + long snapshotZxid = oldDataTree.lastProcessedZxid; + File[] files = FileTxnLog.getLogFiles( + dataDir.listFiles(), snapshotZxid); + long zxid = processLogFiles(oldDataTree, files); + //check for this zxid to be sane + if (zxid != oldDataTree.lastProcessedZxid) { + LOG.error("Zxids not equal " + " log zxid " + + zxid + " datatree processed " + oldDataTree.lastProcessedZxid); + } + } + + /** + * find the most recent snapshot + * in the snapshot directory + * @return + * @throws IOException + */ + private File findMostRecentSnapshot() throws IOException { + List files = Util.sortDataDir(snapShotDir.listFiles(), + "snapshot", false); + for (File f: files) { + try { + if (Util.isValidSnapshot(f)) + return f; + } catch(IOException e) { + LOG.info("Invalid snapshot " + f, e); + } + } + return null; + } + + /** + * convert the old stat to new stat + * @param oldStat the old stat + * @return the new stat + */ + private StatPersisted convertStat(StatPersistedV1 oldStat) { + StatPersisted stat = new StatPersisted(); + stat.setAversion(oldStat.getAversion()); + stat.setCtime(oldStat.getCtime()); + stat.setCversion(oldStat.getCversion()); + stat.setCzxid(oldStat.getCzxid()); + stat.setEphemeralOwner(oldStat.getEphemeralOwner()); + stat.setMtime(oldStat.getMtime()); + stat.setMzxid(oldStat.getMzxid()); + stat.setVersion(oldStat.getVersion()); + return stat; + } + + /** + * convert a given old datanode to new datanode + * @param dt the new datatree + * @param parent the parent of the datanode to be constructed + * @param oldDataNode the old datanode + * @return the new datanode + */ + private DataNode convertDataNode(DataTree dt, DataNode parent, + DataNodeV1 oldDataNode) { + StatPersisted stat = convertStat(oldDataNode.stat); + DataNode dataNode = new DataNode(parent, oldDataNode.data, + dt.convertAcls(oldDataNode.acl), stat); + dataNode.setChildren(oldDataNode.children); + return dataNode; + } + + /** + * recurse through the old datatree and construct the + * new data tree + * @param dataTree the new datatree to be constructed + * @param path the path to start with + */ + private void recurseThroughDataTree(DataTree dataTree, String path) { + if (path == null) + return; + DataNodeV1 oldDataNode = oldDataTree.getNode(path); + HashSet children = oldDataNode.children; + DataNode parent = null; + if ("".equals(path)) { + parent = null; + } + else { + int lastSlash = path.lastIndexOf('/'); + String parentPath = path.substring(0, lastSlash); + parent = dataTree.getNode(parentPath); + } + DataNode thisDatNode = convertDataNode(dataTree, parent, + oldDataNode); + dataTree.addDataNode(path, thisDatNode); + if (children == null || children.size() == 0) { + return; + } + else { + for (String child: children) { + recurseThroughDataTree(dataTree, path + "/" +child); + } + } + } + + private DataTree convertThisSnapShot() throws IOException { + // create a datatree + DataTree dataTree = new DataTree(); + DataNodeV1 oldDataNode = oldDataTree.getNode(""); + if (oldDataNode == null) { + //should never happen + LOG.error("Upgrading from an empty snapshot."); + } + + recurseThroughDataTree(dataTree, ""); + dataTree.lastProcessedZxid = oldDataTree.lastProcessedZxid; + return dataTree; + } + + public DataTree getNewDataTree() throws IOException { + loadThisSnapShot(); + DataTree dt = convertThisSnapShot(); + return dt; + } + + public ConcurrentHashMap getSessionWithTimeOuts() { + return this.sessionsWithTimeouts; + } +} diff --git a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/util/KerberosUtil.java b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/util/KerberosUtil.java new file mode 100644 index 000000000..1434ff0ea --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/util/KerberosUtil.java @@ -0,0 +1,45 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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. + */ + +package org.apache.zookeeper.server.util; + +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; + +public class KerberosUtil { + + public static String getDefaultRealm() + throws ClassNotFoundException, NoSuchMethodException, + IllegalArgumentException, IllegalAccessException, + InvocationTargetException { + Object kerbConf; + Class classRef; + Method getInstanceMethod; + Method getDefaultRealmMethod; + if (System.getProperty("java.vendor").contains("IBM")) { + classRef = Class.forName("com.ibm.security.krb5.internal.Config"); + } else { + classRef = Class.forName("sun.security.krb5.Config"); + } + getInstanceMethod = classRef.getMethod("getInstance", new Class[0]); + kerbConf = getInstanceMethod.invoke(classRef, new Object[0]); + getDefaultRealmMethod = classRef.getDeclaredMethod("getDefaultRealm", + new Class[0]); + return (String)getDefaultRealmMethod.invoke(kerbConf, new Object[0]); + } +} diff --git a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/util/OSMXBean.java b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/util/OSMXBean.java new file mode 100644 index 000000000..b22824d09 --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/util/OSMXBean.java @@ -0,0 +1,182 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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. + */ + +package org.apache.zookeeper.server.util; + +import java.lang.management.ManagementFactory; +import java.lang.management.OperatingSystemMXBean; +import java.lang.management.RuntimeMXBean; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import java.lang.reflect.Method; + +/** + * This class is a wrapper for the implementation of + * com.sun.management.UnixOperatingSystemMXBean + * It will decide to use the sun api or its own implementation + * depending on the runtime (vendor) used. + */ +public class OSMXBean +{ + static final Logger LOG = LoggerFactory.getLogger(OSMXBean.class); + + private OperatingSystemMXBean osMbean; + + private static final boolean ibmvendor = + System.getProperty("java.vendor").contains("IBM"); + private static final boolean windows = + System.getProperty("os.name").startsWith("Windows"); + private static final boolean linux = + System.getProperty("os.name").startsWith("Linux"); + + /** + * Constructor. Get the running Operating System instance + */ + public OSMXBean () { + this.osMbean = ManagementFactory.getOperatingSystemMXBean(); + } + + /** + * Check if the OS is unix. If using the IBM java runtime, this + * will only work for linux. + * + * @return whether this is unix or not. + */ + public boolean getUnix() { + if (windows) { + return false; + } + return (ibmvendor ? linux : true); + } + + /** + * Load the implementation of UnixOperatingSystemMXBean for sun jvm + * and runs the desired method. + * @param mBeanMethodName : method to run from the interface UnixOperatingSystemMXBean + * @return the method result + */ + private Long getOSUnixMXBeanMethod (String mBeanMethodName) + { + Object unixos; + Class classRef; + Method mBeanMethod; + + try { + classRef = Class.forName("com.sun.management.UnixOperatingSystemMXBean"); + if (classRef.isInstance(osMbean)) { + mBeanMethod = classRef.getDeclaredMethod(mBeanMethodName, + new Class[0]); + unixos = classRef.cast(osMbean); + return (Long)mBeanMethod.invoke(unixos); + } + } catch(Exception e) { + LOG.warn("Not able to load class or method for com.sun.managment.UnixOperatingSystemMXBean.", e); + } + return null; + } + + /** + * Get the number of opened filed descriptor for the runtime jvm. + * If sun java, it will use the com.sun.management interfaces. + * Otherwise, this methods implements it (linux only). + * @return number of open file descriptors for the jvm + */ + public long getOpenFileDescriptorCount() + { + Long ofdc; + + if (!ibmvendor) { + ofdc = getOSUnixMXBeanMethod("getOpenFileDescriptorCount"); + return (ofdc != null ? ofdc.longValue () : -1); + } + + try { + //need to get the PID number of the process first + RuntimeMXBean rtmbean = ManagementFactory.getRuntimeMXBean(); + String rtname = rtmbean.getName(); + String[] pidhost = rtname.split("@"); + + //using linux bash commands to retrieve info + Process p = Runtime.getRuntime().exec( + new String[] { "bash", "-c", + "ls /proc/" + pidhost[0] + "/fdinfo | wc -l" }); + InputStream in = p.getInputStream(); + BufferedReader output = new BufferedReader( + new InputStreamReader(in)); + + try { + String openFileDesCount; + if ((openFileDesCount = output.readLine()) != null) { + return Long.parseLong(openFileDesCount); + } + } finally { + if (output != null) { + output.close(); + } + } + } catch (IOException ie) { + LOG.warn("Not able to get the number of open file descriptors", ie); + } + return -1; + } + + /** + * Get the number of the maximum file descriptors the system can use. + * If sun java, it will use the com.sun.management interfaces. + * Otherwise, this methods implements it (linux only). + * @return max number of file descriptors the operating system can use. + */ + public long getMaxFileDescriptorCount() + { + Long mfdc; + + if (!ibmvendor) { + mfdc = getOSUnixMXBeanMethod("getMaxFileDescriptorCount"); + return (mfdc != null ? mfdc.longValue () : -1); + } + + try { + //using linux bash commands to retrieve info + Process p = Runtime.getRuntime().exec( + new String[] { "bash", "-c", "ulimit -n" }); + InputStream in = p.getInputStream(); + BufferedReader output = new BufferedReader( + new InputStreamReader(in)); + + try { + String maxFileDesCount; + if ((maxFileDesCount = output.readLine()) != null) { + return Long.parseLong(maxFileDesCount); + } + } finally { + if (output != null) { + output.close(); + } + } + } catch (IOException ie) { + LOG.warn("Not able to get the max number of file descriptors", ie); + } + return -1; + } +} diff --git a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/util/Profiler.java b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/util/Profiler.java new file mode 100644 index 000000000..f81d27047 --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/util/Profiler.java @@ -0,0 +1,41 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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. + */ + +package org.apache.zookeeper.server.util; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class Profiler { + private static final Logger LOG = LoggerFactory.getLogger(Profiler.class); + + public interface Operation { + public T execute() throws Exception; + } + + public static T profile(Operation op, long timeout, String message) + throws Exception { + long start = System.currentTimeMillis(); + T res = op.execute(); + long end = System.currentTimeMillis(); + if (end - start > timeout) { + LOG.info("Elapsed "+(end - start) + " ms: " + message); + } + return res; + } +} diff --git a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/util/SerializeUtils.java b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/util/SerializeUtils.java new file mode 100644 index 000000000..f9647c458 --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/util/SerializeUtils.java @@ -0,0 +1,141 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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. + */ + +package org.apache.zookeeper.server.util; + +import java.io.ByteArrayInputStream; +import java.io.EOFException; +import java.io.IOException; +import java.util.HashMap; +import java.util.Map; +import java.util.Map.Entry; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import org.apache.jute.BinaryInputArchive; +import org.apache.jute.InputArchive; +import org.apache.jute.OutputArchive; +import org.apache.jute.Record; +import org.apache.zookeeper.ZooDefs.OpCode; +import org.apache.zookeeper.server.DataTree; +import org.apache.zookeeper.server.ZooTrace; +import org.apache.zookeeper.txn.CreateSessionTxn; +import org.apache.zookeeper.txn.CreateTxn; +import org.apache.zookeeper.txn.CreateTxnV0; +import org.apache.zookeeper.txn.DeleteTxn; +import org.apache.zookeeper.txn.ErrorTxn; +import org.apache.zookeeper.txn.SetACLTxn; +import org.apache.zookeeper.txn.SetDataTxn; +import org.apache.zookeeper.txn.TxnHeader; +import org.apache.zookeeper.txn.MultiTxn; + +public class SerializeUtils { + private static final Logger LOG = LoggerFactory.getLogger(SerializeUtils.class); + + public static Record deserializeTxn(byte txnBytes[], TxnHeader hdr) + throws IOException { + final ByteArrayInputStream bais = new ByteArrayInputStream(txnBytes); + InputArchive ia = BinaryInputArchive.getArchive(bais); + + hdr.deserialize(ia, "hdr"); + bais.mark(bais.available()); + Record txn = null; + switch (hdr.getType()) { + case OpCode.createSession: + // This isn't really an error txn; it just has the same + // format. The error represents the timeout + txn = new CreateSessionTxn(); + break; + case OpCode.closeSession: + return null; + case OpCode.create: + txn = new CreateTxn(); + break; + case OpCode.delete: + txn = new DeleteTxn(); + break; + case OpCode.setData: + txn = new SetDataTxn(); + break; + case OpCode.setACL: + txn = new SetACLTxn(); + break; + case OpCode.error: + txn = new ErrorTxn(); + break; + case OpCode.multi: + txn = new MultiTxn(); + break; + default: + throw new IOException("Unsupported Txn with type=%d" + hdr.getType()); + } + if (txn != null) { + try { + txn.deserialize(ia, "txn"); + } catch(EOFException e) { + // perhaps this is a V0 Create + if (hdr.getType() == OpCode.create) { + CreateTxn create = (CreateTxn)txn; + bais.reset(); + CreateTxnV0 createv0 = new CreateTxnV0(); + createv0.deserialize(ia, "txn"); + // cool now make it V1. a -1 parentCVersion will + // trigger fixup processing in processTxn + create.setPath(createv0.getPath()); + create.setData(createv0.getData()); + create.setAcl(createv0.getAcl()); + create.setEphemeral(createv0.getEphemeral()); + create.setParentCVersion(-1); + } else { + throw e; + } + } + } + return txn; + } + + public static void deserializeSnapshot(DataTree dt,InputArchive ia, + Map sessions) throws IOException { + int count = ia.readInt("count"); + while (count > 0) { + long id = ia.readLong("id"); + int to = ia.readInt("timeout"); + sessions.put(id, to); + if (LOG.isTraceEnabled()) { + ZooTrace.logTraceMessage(LOG, ZooTrace.SESSION_TRACE_MASK, + "loadData --- session in archive: " + id + + " with timeout: " + to); + } + count--; + } + dt.deserialize(ia, "tree"); + } + + public static void serializeSnapshot(DataTree dt,OutputArchive oa, + Map sessions) throws IOException { + HashMap sessSnap = new HashMap(sessions); + oa.writeInt(sessSnap.size(), "count"); + for (Entry entry : sessSnap.entrySet()) { + oa.writeLong(entry.getKey().longValue(), "id"); + oa.writeInt(entry.getValue().intValue(), "timeout"); + } + dt.serialize(oa, "tree"); + } + +} diff --git a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/util/ZxidUtils.java b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/util/ZxidUtils.java new file mode 100644 index 000000000..39e076a27 --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/util/ZxidUtils.java @@ -0,0 +1,34 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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. + */ + +package org.apache.zookeeper.server.util; + +public class ZxidUtils { + static public long getEpochFromZxid(long zxid) { + return zxid >> 32L; + } + static public long getCounterFromZxid(long zxid) { + return zxid & 0xffffffffL; + } + static public long makeZxid(long epoch, long counter) { + return (epoch << 32L) | (counter & 0xffffffffL); + } + static public String zxidToString(long zxid) { + return Long.toHexString(zxid); + } +} diff --git a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/version/util/VerGen.java b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/version/util/VerGen.java new file mode 100644 index 000000000..d4cbeb64e --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/version/util/VerGen.java @@ -0,0 +1,177 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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. + */ + +package org.apache.zookeeper.version.util; + +import java.io.File; +import java.io.FileWriter; +import java.io.IOException; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +public class VerGen { + private static final String PACKAGE_NAME = "org.apache.zookeeper.version"; + private static final String TYPE_NAME = "Info"; + + static void printUsage() { + System.out.print("Usage:\tjava -cp org.apache.zookeeper." + + "version.util.VerGen maj.min.micro[-qualifier] rev buildDate"); + System.exit(1); + } + + public static void generateFile(File outputDir, Version version, int rev, String buildDate) + { + String path = PACKAGE_NAME.replaceAll("\\.", "/"); + File pkgdir = new File(outputDir, path); + if (!pkgdir.exists()) { + // create the pkg directory + boolean ret = pkgdir.mkdirs(); + if (!ret) { + System.out.println("Cannnot create directory: " + path); + System.exit(1); + } + } else if (!pkgdir.isDirectory()) { + // not a directory + System.out.println(path + " is not a directory."); + System.exit(1); + } + File file = new File(pkgdir, TYPE_NAME + ".java"); + FileWriter w = null; + try { + w = new FileWriter(file); + w.write("// Do not edit!\n// File generated by org.apache.zookeeper" + + ".version.util.VerGen.\n"); + w.write("/**\n"); + w.write("* Licensed to the Apache Software Foundation (ASF) under one\n"); + w.write("* or more contributor license agreements. See the NOTICE file\n"); + w.write("* distributed with this work for additional information\n"); + w.write("* regarding copyright ownership. The ASF licenses this file\n"); + w.write("* to you under the Apache License, Version 2.0 (the\n"); + w.write("* \"License\"); you may not use this file except in compliance\n"); + w.write("* with the License. You may obtain a copy of the License at\n"); + w.write("*\n"); + w.write("* http://www.apache.org/licenses/LICENSE-2.0\n"); + w.write("*\n"); + w.write("* Unless required by applicable law or agreed to in writing, software\n"); + w.write("* distributed under the License is distributed on an \"AS IS\" BASIS,\n"); + w.write("* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n"); + w.write("* See the License for the specific language governing permissions and\n"); + w.write("* limitations under the License.\n"); + w.write("*/\n"); + w.write("\n"); + w.write("package " + PACKAGE_NAME + ";\n\n"); + w.write("public interface " + TYPE_NAME + " {\n"); + w.write(" public static final int MAJOR=" + version.maj + ";\n"); + w.write(" public static final int MINOR=" + version.min + ";\n"); + w.write(" public static final int MICRO=" + version.micro + ";\n"); + w.write(" public static final String QUALIFIER=" + + (version.qualifier == null ? null : + "\"" + version.qualifier + "\"") + + ";\n"); + if (rev < 0) { + System.out.println("Unknown REVISION number, using " + rev); + } + w.write(" public static final int REVISION=" + rev + ";\n"); + w.write(" public static final String BUILD_DATE=\"" + buildDate + + "\";\n"); + w.write("}\n"); + } catch (IOException e) { + System.out.println("Unable to generate version.Info file: " + + e.getMessage()); + System.exit(1); + } finally { + if (w != null) { + try { + w.close(); + } catch (IOException e) { + System.out.println("Unable to close file writer" + + e.getMessage()); + } + } + } + } + + public static class Version { + public int maj; + public int min; + public int micro; + public String qualifier; + } + + public static Version parseVersionString(String input) { + Version result = new Version(); + + Pattern p = Pattern.compile("^(\\d+)\\.(\\d+)\\.(\\d+)((\\.\\d+)*)(-(.+))?$"); + Matcher m = p.matcher(input); + + if (!m.matches()) { + return null; + } + result.maj = Integer.parseInt(m.group(1)); + result.min = Integer.parseInt(m.group(2)); + result.micro = Integer.parseInt(m.group(3)); + if (m.groupCount() == 7) { + result.qualifier = m.group(7); + } else { + result.qualifier = null; + } + return result; + } + + /** + * Emits a org.apache.zookeeper.version.Info interface file with version and + * revision information constants set to the values passed in as command + * line parameters. The file is created in the current directory.
      + * Usage: java org.apache.zookeeper.version.util.VerGen maj.min.micro[-qualifier] + * rev buildDate + * + * @param args + *

        + *
      • maj - major version number + *
      • min - minor version number + *
      • micro - minor minor version number + *
      • qualifier - optional qualifier (dash followed by qualifier text) + *
      • rev - current SVN revision number + *
      • buildDate - date the build + *
      + */ + public static void main(String[] args) { + if (args.length != 3) + printUsage(); + try { + Version version = parseVersionString(args[0]); + if (version == null) { + System.err.println( + "Invalid version number format, must be \"x.y.z(-.*)?\""); + System.exit(1); + } + int rev; + try { + rev = Integer.parseInt(args[1]); + } catch (NumberFormatException e) { + rev = -1; + } + generateFile(new File("."), version, rev, args[2]); + } catch (NumberFormatException e) { + System.err.println( + "All version-related parameters must be valid integers!"); + throw e; + } + } + +} diff --git a/pkg/registry/zookeeper-3.4.6/src/java/main/overview.html b/pkg/registry/zookeeper-3.4.6/src/java/main/overview.html new file mode 100644 index 000000000..db9b16f0f --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/java/main/overview.html @@ -0,0 +1,26 @@ + + + + + + ZooKeeper + + +ZooKeeper is a service for coordinating processes of distributed applications. + + diff --git a/pkg/registry/zookeeper-3.4.6/src/java/systest/README.txt b/pkg/registry/zookeeper-3.4.6/src/java/systest/README.txt new file mode 100644 index 000000000..8a2985c2e --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/java/systest/README.txt @@ -0,0 +1,62 @@ +To run the system test we need to create processing containers that we can +spawn tasks, called Instances, in. (how is that for a dangling preposition!?!) +Start up InstanceContainers first. Then run the system test. The system test +finds the InstanceContainers and directs them through ZooKeeper, so you are +going to need an instance of ZooKeeper running that they can all access. +The easiest way to do all of this is to use the zookeeper fat jar. + +Steps to run system test +------------------------ +1) transfer the fatjar from the release directory to all systems + participating in the test. fatjar is in contrib/fatjar directory. + + (developers can generate by running "ant jar compile-test" + targets in trunk, then compiling using "ant jar" in src/contrib/jarjar) + +2) run a zookeeper standalone instance (cluster is ok too) + +e.g. java -jar zookeeper--fatjar.jar server + +Note: you must provide zoo.cfg, see sample in conf directory + +3) on each host start the system test container + +e.g. java -jar zookeeper--fatjar.jar ic /sysTest + +name : name of the test container - must be unique + typically it's a good idea to name after the host to aid debugging + +zkHostPort : the host:port of the server from step 2) + +4) initiate the system test using the fatjar: + +java -jar build/contrib/fatjar/zookeeper--fatjar.jar systest org.apache.zookeeper.test.system.SimpleSysTest + +by default it will access the zk server started in 2) on localhost:2181 + +or you can specify a remote host:port using + -DsysTest.zkHostPort=:,:,... + +java -DsysTest.zkHostPort=hostA:2181 -jar build/contrib/fatjar/zookeeper--fatjar.jar systest org.apache.zookeeper.test.system.SimpleSysTest + +where hostA is running the zk server started in step 2) above + +InstanceContainers can also be used to run a the saturation benchmark. The +first two steps are the same as the system test. Step 3 is almost the same: + +3) start the InstanceContainer on each host: + +e.g. java -jar zookeeper--fatjar.jar ic + +note prefix can be /sysTest or any other path. If you do use /sysTest, make +sure the system test isn't running when you run the benchmark. + +4) run GenerateLoad using the following + +java -jar build/contrib/fatjar/zookeeper--fatjar.jar generateLoad #servers #clients + +Once GenerateLoad is started, it will read commands from stdin. Usually +the only command you need to know is "percentage" which sets the percentage +of writes to use in the requests. Once a percentage is set, the benchmark +will start. "percentage 0" will cause only reads to be issued and +"percentage 100" will cause only writes to be issued. diff --git a/pkg/registry/zookeeper-3.4.6/src/lastRevision.bat b/pkg/registry/zookeeper-3.4.6/src/lastRevision.bat new file mode 100644 index 000000000..e31a6b96c --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/lastRevision.bat @@ -0,0 +1,23 @@ +echo off +rem Licensed to the Apache Software Foundation (ASF) under one +rem or more contributor license agreements. See the NOTICE file +rem distributed with this work for additional information +rem regarding copyright ownership. The ASF licenses this file +rem to you under the Apache License, Version 2.0 (the +rem "License"); you may not use this file except in compliance +rem with the License. You may obtain a copy of the License at +rem +rem http://www.apache.org/licenses/LICENSE-2.0 +rem +rem Unless required by applicable law or agreed to in writing, software +rem distributed under the License is distributed on an "AS IS" BASIS, +rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +rem See the License for the specific language governing permissions and +rem limitations under the License. + +rem Find the current revision, store it in a file, for DOS +svn info | findstr Revision > %1 + +For /F "tokens=1,2 delims= " %%a In (%1) Do ( + echo lastRevision=%%b> %1 +) diff --git a/pkg/registry/zookeeper-3.4.6/src/lastRevision.sh b/pkg/registry/zookeeper-3.4.6/src/lastRevision.sh new file mode 100755 index 000000000..a462990e7 --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/lastRevision.sh @@ -0,0 +1,21 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you 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. + +# Find the current revision, store it in a file +FILE=$1 +LASTREV=`svn info | grep '^Revision' | sed -e 's/Revision: *//'` + +echo "lastRevision=${LASTREV}" > $FILE diff --git a/pkg/registry/zookeeper-3.4.6/src/packages/deb/init.d/zookeeper b/pkg/registry/zookeeper-3.4.6/src/packages/deb/init.d/zookeeper new file mode 100644 index 000000000..656076fc5 --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/packages/deb/init.d/zookeeper @@ -0,0 +1,140 @@ +#! /bin/sh + +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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. + +### BEGIN INIT INFO +# Provides: zookeeper +# Required-Start: $remote_fs $syslog +# Required-Stop: $remote_fs $syslog +# Default-Start: 2 3 4 5 +# Default-Stop: +# Short-Description: Apache ZooKeeper server +### END INIT INFO + +set -e + +# /etc/init.d/zookeeper: start and stop the Apache ZooKeeper daemon + +umask 022 + +. /usr/libexec/zkEnv.sh + +. /lib/lsb/init-functions + +ZOOPIDDIR=/var/lib/zookeeper/data +ZOOPIDFILE=${ZOOPIDDIR}/zookeeper_server.pid + +check_privsep_dir() { + # Create the PrivSep empty dir if necessary + if [ ! -d ${ZOOPIDDIR} ]; then + mkdir -p ${ZOOPIDDIR} + chown zookeeper:hadoop ${ZOOPIDDIR} + chmod 0775 ${ZOOPIDDIR} + fi +} + +# Are we running from init? +run_by_init() { + ([ "$previous" ] && [ "$runlevel" ]) || [ "$runlevel" = S ] +} + +check_for_no_start() { + # forget it if we're trying to start, and /etc/zookeeper/zookeeper_not_to_be_run exists + if [ -e /etc/zookeeper/zookeeper_not_to_be_run ]; then + if [ "$1" = log_end_msg ]; then + log_end_msg 0 + fi + if ! run_by_init; then + log_action_msg "Apache ZooKeeper server not in use (/etc/zookeeper/zookeeper_not_to_be_run)" + fi + exit 0 + fi +} + +export PATH="${PATH:+$PATH:}/usr/sbin:/usr/bin" + +case "$1" in + start) + check_for_no_start + check_privsep_dir + log_daemon_msg "Starting Apache ZooKeeper server" "zookeeper" + if start-stop-daemon --start --quiet --oknodo --pidfile ${ZOOPIDFILE} -c zookeeper -x ${ZOOKEEPER_PREFIX}/sbin/zkServer.sh start; then + log_end_msg 0 + else + log_end_msg 1 + fi + ;; + stop) + log_daemon_msg "Stopping Apache ZooKeeper server" "zookeeper" + if start-stop-daemon --stop --quiet --oknodo --pidfile ${ZOOPIDFILE}; then + log_end_msg 0 + else + log_end_msg 1 + fi + ;; + + restart) + check_privsep_dir + log_daemon_msg "Restarting Apache ZooKeeper server" "zookeeper" + start-stop-daemon --stop --quiet --oknodo --retry 30 --pidfile ${ZOOPIDFILE} + check_for_no_start log_end_msg + if start-stop-daemon --start --quiet --oknodo --pidfile ${ZOOPIDFILE} -c zookeeper -x ${ZOOKEEPER_PREFIX}/sbin/zkServer.sh start; then + log_end_msg 0 + else + log_end_msg 1 + fi + ;; + + try-restart) + check_privsep_dir + log_daemon_msg "Restarting Apache ZooKeeper server" "zookeeper" + set +e + start-stop-daemon --stop --quiet --retry 30 --pidfile ${ZOOPIDFILE} + RET="$?" + set -e + case $RET in + 0) + # old daemon stopped + check_for_no_start log_end_msg + if start-stop-daemon --start --quiet --oknodo --pidfile ${ZOOPIDFILE} -c zookeeper -x ${ZOOKEEPER_PREFIX}/sbin/zkServer.sh start; then + log_end_msg 0 + else + log_end_msg 1 + fi + ;; + 1) + # daemon not running + log_progress_msg "(not running)" + log_end_msg 0 + ;; + *) + # failed to stop + log_progress_msg "(failed to stop)" + log_end_msg 1 + ;; + esac + ;; + + status) + status_of_proc -p ${ZOOPIDFILE} ${JAVA_HOME}/bin/java zookeeper && exit 0 || exit $? + ;; + + *) + log_action_msg "Usage: /etc/init.d/zookeeper {start|stop|restart|try-restart|status}" + exit 1 +esac + +exit 0 diff --git a/pkg/registry/zookeeper-3.4.6/src/packages/deb/zookeeper.control/conffile b/pkg/registry/zookeeper-3.4.6/src/packages/deb/zookeeper.control/conffile new file mode 100644 index 000000000..6fdd65be1 --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/packages/deb/zookeeper.control/conffile @@ -0,0 +1,15 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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. +/etc/zookeeper diff --git a/pkg/registry/zookeeper-3.4.6/src/packages/deb/zookeeper.control/control b/pkg/registry/zookeeper-3.4.6/src/packages/deb/zookeeper.control/control new file mode 100644 index 000000000..c74690602 --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/packages/deb/zookeeper.control/control @@ -0,0 +1,23 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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. +Package: zookeeper +Version: @version@ +Section: misc +Priority: optional +Architecture: all +Depends: sun-java6-jre +Maintainer: Apache Software Foundation +Description: ZooKeeper is a centralized service for maintaining configuration information, naming, providing distributed synchronization, and providing group services. +Distribution: development diff --git a/pkg/registry/zookeeper-3.4.6/src/packages/deb/zookeeper.control/postinst b/pkg/registry/zookeeper-3.4.6/src/packages/deb/zookeeper.control/postinst new file mode 100644 index 000000000..a6cbd22d1 --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/packages/deb/zookeeper.control/postinst @@ -0,0 +1,23 @@ +#!/bin/sh + +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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. + +bash /usr/sbin/update-zookeeper-env.sh \ + --prefix=/usr \ + --conf-dir=/etc/zookeeper \ + --log-dir=/var/log/zookeeper \ + --pid-dir=/var/run/zookeeper \ + --var-dir=/var/lib/zookeeper diff --git a/pkg/registry/zookeeper-3.4.6/src/packages/deb/zookeeper.control/postrm b/pkg/registry/zookeeper-3.4.6/src/packages/deb/zookeeper.control/postrm new file mode 100644 index 000000000..27842b756 --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/packages/deb/zookeeper.control/postrm @@ -0,0 +1,19 @@ +#!/bin/sh + +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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. + +/usr/sbin/userdel zookeeper 2> /dev/null >/dev/null +exit 0 diff --git a/pkg/registry/zookeeper-3.4.6/src/packages/deb/zookeeper.control/preinst b/pkg/registry/zookeeper-3.4.6/src/packages/deb/zookeeper.control/preinst new file mode 100644 index 000000000..d4ca7f713 --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/packages/deb/zookeeper.control/preinst @@ -0,0 +1,20 @@ +#!/bin/sh + +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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. + +getent group hadoop 2>/dev/null >/dev/null || /usr/sbin/groupadd -r hadoop + +/usr/sbin/useradd --comment "ZooKeeper" --shell /bin/bash -M -r --groups hadoop --home /usr/share/zookeeper zookeeper 2> /dev/null || : diff --git a/pkg/registry/zookeeper-3.4.6/src/packages/deb/zookeeper.control/prerm b/pkg/registry/zookeeper-3.4.6/src/packages/deb/zookeeper.control/prerm new file mode 100644 index 000000000..c986688a7 --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/packages/deb/zookeeper.control/prerm @@ -0,0 +1,24 @@ +#!/bin/sh + +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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. + +/etc/init.d/zookeeper stop 2>/dev/null >/dev/null +bash /usr/sbin/update-zookeeper-env.sh \ + --prefix=/usr \ + --conf-dir=/etc/zookeeper \ + --log-dir=/var/log/zookeeper \ + --pid-dir=/var/run/zookeeper \ + --uninstal diff --git a/pkg/registry/zookeeper-3.4.6/src/packages/rpm/init.d/zookeeper b/pkg/registry/zookeeper-3.4.6/src/packages/rpm/init.d/zookeeper new file mode 100644 index 000000000..faeebb7a9 --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/packages/rpm/init.d/zookeeper @@ -0,0 +1,84 @@ +#!/bin/bash + +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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. + +# +# ZooKeeper +# +# chkconfig: 2345 89 9 +# description: zookeeper + +source /etc/rc.d/init.d/functions +source /usr/libexec/zkEnv.sh + +RETVAL=0 +PIDFILE="${ZOOPIDFILE}" +desc="ZooKeeper daemon" + +start() { + echo -n $"Starting $desc (zookeeper): " + daemon --user zookeeper zkServer.sh start + RETVAL=$? + echo + [ $RETVAL -eq 0 ] && touch /var/lock/subsys/zookeeper + return $RETVAL +} + +stop() { + echo -n $"Stopping $desc (zookeeper): " + daemon --user zookeeper zkServer.sh stop + RETVAL=$? + sleep 5 + echo + [ $RETVAL -eq 0 ] && rm -f /var/lock/subsys/zookeeper $PIDFILE +} + +restart() { + stop + start +} + +checkstatus(){ + status -p $PIDFILE ${JAVA_HOME}/bin/java + RETVAL=$? +} + +condrestart(){ + [ -e /var/lock/subsys/zookeeper ] && restart || : +} + +case "$1" in + start) + start + ;; + stop) + stop + ;; + status) + checkstatus + ;; + restart) + restart + ;; + condrestart) + condrestart + ;; + *) + echo $"Usage: $0 {start|stop|status|restart|condrestart}" + exit 1 +esac + +exit $RETVAL diff --git a/pkg/registry/zookeeper-3.4.6/src/packages/rpm/spec/zookeeper.spec b/pkg/registry/zookeeper-3.4.6/src/packages/rpm/spec/zookeeper.spec new file mode 100644 index 000000000..8e195c716 --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/packages/rpm/spec/zookeeper.spec @@ -0,0 +1,166 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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. + +# +# RPM Spec file for ZooKeeper version @version@ +# + +%define name zookeeper +%define version @version@ +%define release @package.release@ + +# Installation Locations +%define _prefix @package.prefix@ +%define _bin_dir %{_prefix}/bin +%define _conf_dir @package.conf.dir@ +%define _include_dir %{_prefix}/include +%define _lib_dir %{_prefix}/lib +%define _lib64_dir %{_prefix}/lib64 +%define _libexec_dir %{_prefix}/libexec +%define _log_dir @package.log.dir@ +%define _man_dir %{_prefix}/man +%define _pid_dir @package.pid.dir@ +%define _sbin_dir %{_prefix}/sbin +%define _share_dir %{_prefix}/share/zookeeper +%define _src_dir %{_prefix}/src +%define _var_dir @package.var.dir@ + +# Build time settings +%define _build_dir @package.build.dir@ +%define _final_name @final.name@ +%define _c_lib @c.lib@ +%define debug_package %{nil} + +# Disable brp-java-repack-jars for aspect J +%define __os_install_post \ + /usr/lib/rpm/redhat/brp-compress \ + %{!?__debug_package:/usr/lib/rpm/redhat/brp-strip %{__strip}} \ + /usr/lib/rpm/redhat/brp-strip-static-archive %{__strip} \ + /usr/lib/rpm/redhat/brp-strip-comment-note %{__strip} %{__objdump} \ + /usr/lib/rpm/brp-python-bytecompile %{nil} + +# RPM searches perl files for dependancies and this breaks for non packaged perl lib +# like thrift so disable this +%define _use_internal_dependency_generator 0 + +Summary: ZooKeeper is a centralized service for maintaining configuration information, naming, providing distributed synchronization, and providing group services. +License: Apache License, Version 2.0 +URL: http://zookeeper.apache.org/ +Vendor: Apache Software Foundation +Group: Development/Libraries +Name: %{name} +Version: %{version} +Release: %{release} +Source0: %{_final_name}.tar.gz +Source1: %{_final_name}-lib.tar.gz +Prefix: %{_prefix} +Prefix: %{_conf_dir} +Prefix: %{_log_dir} +Prefix: %{_pid_dir} +Prefix: %{_var_dir} +Requires: sh-utils, textutils, /usr/sbin/useradd, /usr/sbin/usermod, /sbin/chkconfig, /sbin/service, jdk >= 1.6 +AutoReqProv: no +Provides: zookeeper + +%description +ZooKeeper is a centralized service for maintaining configuration information, naming, providing distributed synchronization, and providing group services. All of these kinds of services are used in some form or another by distributed applications. Each time they are implemented there is a lot of work that goes into fixing the bugs and race conditions that are inevitable. Because of the difficulty of implementing these kinds of services, applications initially usually skimp on them ,which make them brittle in the presence of change and difficult to manage. Even when done correctly, different implementations of these services lead to management complexity when the applications are deployed. + +%package lib +Summary: ZooKeeper C binding library +Group: System/Libraries +#Requires: %{name} == %{version} +Provides: zookeeper-lib + +%description lib +ZooKeeper C client library for communicating with ZooKeeper Server. + +%prep +%setup -D -b 1 -n %{_final_name} +%setup -D -a 0 -n %{_final_name} + +%build +mkdir -p ${RPM_BUILD_DIR}%{_prefix} +mkdir -p ${RPM_BUILD_DIR}%{_bin_dir} +mkdir -p ${RPM_BUILD_DIR}%{_include_dir} +mkdir -p ${RPM_BUILD_DIR}%{_lib_dir} +%ifarch amd64 x86_64 +mkdir -p ${RPM_BUILD_DIR}%{_lib64_dir} +%endif +mkdir -p ${RPM_BUILD_DIR}%{_libexec_dir} +mkdir -p ${RPM_BUILD_DIR}%{_log_dir} +mkdir -p ${RPM_BUILD_DIR}%{_conf_dir} +mkdir -p ${RPM_BUILD_DIR}%{_man_dir} +mkdir -p ${RPM_BUILD_DIR}%{_pid_dir} +mkdir -p ${RPM_BUILD_DIR}%{_sbin_dir} +mkdir -p ${RPM_BUILD_DIR}%{_share_dir} +mkdir -p ${RPM_BUILD_DIR}%{_var_dir} +mkdir -p ${RPM_BUILD_DIR}/etc/init.d + +cp ${RPM_BUILD_DIR}/%{_final_name}/src/packages/rpm/init.d/zookeeper ${RPM_BUILD_DIR}/etc/init.d/zookeeper +cp ${RPM_BUILD_DIR}/%{_final_name}/src/packages/update-zookeeper-env.sh ${RPM_BUILD_DIR}/%{_final_name}/sbin/update-zookeeper-env.sh +chmod 0755 ${RPM_BUILD_DIR}/%{_final_name}/sbin/* +chmod 0755 ${RPM_BUILD_DIR}/etc/init.d/zookeeper + +######################### +#### INSTALL SECTION #### +######################### +%install +pushd ${RPM_BUILD_DIR} +mv ${RPM_BUILD_DIR}/%{_final_name}/bin/* ${RPM_BUILD_DIR}%{_bin_dir} +mv ${RPM_BUILD_DIR}/%{_final_name}/libexec/* ${RPM_BUILD_DIR}%{_libexec_dir} +mv ${RPM_BUILD_DIR}/%{_final_name}/share/zookeeper/* ${RPM_BUILD_DIR}%{_share_dir} +mv ${RPM_BUILD_DIR}/%{_final_name}/conf/* ${RPM_BUILD_DIR}%{_conf_dir} +mv ${RPM_BUILD_DIR}/%{_final_name}/sbin/* ${RPM_BUILD_DIR}%{_sbin_dir} +cp -f ${RPM_BUILD_DIR}%{_conf_dir}/zoo_sample.cfg ${RPM_BUILD_DIR}%{_conf_dir}/zoo.cfg +popd ${RPM_BUILD_DIR} +rm -rf ${RPM_BUILD_DIR}/%{_final_name} + +%pre +getent group hadoop 2>/dev/null >/dev/null || /usr/sbin/groupadd -r hadoop + +/usr/sbin/useradd --comment "ZooKeeper" --shell /bin/bash -M -r --groups hadoop --home %{_share_dir} zookeeper 2> /dev/null || : + +%post +bash ${RPM_INSTALL_PREFIX0}/sbin/update-zookeeper-env.sh \ + --prefix=${RPM_INSTALL_PREFIX0} \ + --conf-dir=${RPM_INSTALL_PREFIX1} \ + --log-dir=${RPM_INSTALL_PREFIX2} \ + --pid-dir=${RPM_INSTALL_PREFIX3} \ + --var-dir=${RPM_INSTALL_PREFIX4} + +%preun +bash ${RPM_INSTALL_PREFIX0}/sbin/update-zookeeper-env.sh \ + --prefix=${RPM_INSTALL_PREFIX0} \ + --conf-dir=${RPM_INSTALL_PREFIX1} \ + --log-dir=${RPM_INSTALL_PREFIX2} \ + --pid-dir=${RPM_INSTALL_PREFIX3} \ + --var-dir=${RPM_INSTALL_PREFIX4} \ + --uninstall + +%files +%defattr(-,root,root) +%attr(0755,root,hadoop) %{_log_dir} +%attr(0775,root,hadoop) %{_pid_dir} +%attr(0775,root,hadoop) /etc/init.d/zookeeper +%config(noreplace) %{_conf_dir}/* +%{_prefix} + +%post lib +/sbin/ldconfig + +%files lib +%defattr(-,root,root) +%{_prefix}/lib/* +%{_prefix}/bin diff --git a/pkg/registry/zookeeper-3.4.6/src/packages/templates/conf/zookeeper-env.sh b/pkg/registry/zookeeper-3.4.6/src/packages/templates/conf/zookeeper-env.sh new file mode 100755 index 000000000..a9efb63fb --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/packages/templates/conf/zookeeper-env.sh @@ -0,0 +1,16 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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. +export JAVA_HOME=${JAVA_HOME} +export ZOO_LOG_DIR=${LOG_DIR} diff --git a/pkg/registry/zookeeper-3.4.6/src/packages/update-zookeeper-env.sh b/pkg/registry/zookeeper-3.4.6/src/packages/update-zookeeper-env.sh new file mode 100755 index 000000000..842848741 --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/packages/update-zookeeper-env.sh @@ -0,0 +1,163 @@ +#!/usr/bin/env bash + +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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 script configures zookeeper-env.sh and zoo.cfg. + +usage() { + echo " +usage: $0 + Required parameters: + --prefix=PREFIX path to install into + + Optional parameters: + --arch=i386 OS Architecture + --conf-dir=/etc/zookeeper Configuration directory + --log-dir=/var/log/zookeeper Log directory + --pid-dir=/var/run PID file location + " + exit 1 +} + +template_generator() { + REGEX='(\$\{[a-zA-Z_][a-zA-Z_0-9]*\})' + cat $1 | + while read line ; do + while [[ "$line" =~ $REGEX ]] ; do + LHS=${BASH_REMATCH[1]} + RHS="$(eval echo "\"$LHS\"")" + line=${line//$LHS/$RHS} + done + echo $line >> $2 + done +} + +OPTS=$(getopt \ + -n $0 \ + -o '' \ + -l 'arch:' \ + -l 'prefix:' \ + -l 'conf-dir:' \ + -l 'log-dir:' \ + -l 'pid-dir:' \ + -l 'var-dir:' \ + -l 'uninstall' \ + -- "$@") + +if [ $? != 0 ] ; then + usage +fi + +eval set -- "${OPTS}" +while true ; do + case "$1" in + --arch) + ARCH=$2 ; shift 2 + ;; + --prefix) + PREFIX=$2 ; shift 2 + ;; + --log-dir) + LOG_DIR=$2 ; shift 2 + ;; + --lib-dir) + LIB_DIR=$2 ; shift 2 + ;; + --conf-dir) + CONF_DIR=$2 ; shift 2 + ;; + --pid-dir) + PID_DIR=$2 ; shift 2 + ;; + --uninstall) + UNINSTALL=1; shift + ;; + --var-dir) + VAR_DIR=$2 ; shift 2 + ;; + --) + shift ; break + ;; + *) + echo "Unknown option: $1" + usage + exit 1 + ;; + esac +done + +for var in PREFIX; do + if [ -z "$(eval "echo \$$var")" ]; then + echo Missing param: $var + usage + fi +done + +ARCH=${ARCH:-i386} +CONF_DIR=${CONF_DIR:-$PREFIX/etc/zookeeper} +LIB_DIR=${LIB_DIR:-$PREFIX/lib} +LOG_DIR=${LOG_DIR:-$PREFIX/var/log} +PID_DIR=${PID_DIR:-$PREFIX/var/run} +VAR_DIR=${VAR_DIR:-$PREFIX/var/lib} +UNINSTALL=${UNINSTALL:-0} + +if [ "${ARCH}" != "i386" ]; then + LIB_DIR=${LIB_DIR}64 +fi + +if [ "${UNINSTALL}" -eq "1" ]; then + # Remove symlinks + if [ -e ${PREFIX}/etc/zookeeper ]; then + rm -f ${PREFIX}/etc/zookeeper + fi +else + # Create symlinks + if [ ${CONF_DIR} != ${PREFIX}/etc/zookeeper ]; then + mkdir -p ${PREFIX}/etc + ln -sf ${CONF_DIR} ${PREFIX}/etc/zookeeper + fi + + mkdir -p ${LOG_DIR} + chown zookeeper:hadoop ${LOG_DIR} + chmod 755 ${LOG_DIR} + + if [ ! -d ${PID_DIR} ]; then + mkdir -p ${PID_DIR} + chown zookeeper:hadoop ${PID_DIR} + chmod 755 ${PID_DIR} + fi + + if [ ! -d ${VAR_DIR} ]; then + mkdir -p ${VAR_DIR}/data + chown -R zookeeper:hadoop ${VAR_DIR} + chmod -R 755 ${VAR_DIR} + fi + + TFILE="/tmp/$(basename $0).$$.tmp" + if [ -z "${JAVA_HOME}" ]; then + if [ -e /etc/debian_version ]; then + JAVA_HOME=/usr/lib/jvm/java-6-sun/jre + else + JAVA_HOME=/usr/java/default + fi + fi + template_generator ${PREFIX}/share/zookeeper/templates/conf/zookeeper-env.sh $TFILE + cp ${TFILE} ${CONF_DIR}/zookeeper-env.sh + rm -f ${TFILE} + template_generator ${PREFIX}/share/zookeeper/templates/conf/zoo.cfg $TFILE + cp ${TFILE} ${CONF_DIR}/zoo.cfg + rm -f ${TFILE} +fi diff --git a/pkg/registry/zookeeper-3.4.6/src/recipes/README.txt b/pkg/registry/zookeeper-3.4.6/src/recipes/README.txt new file mode 100644 index 000000000..4f880cdfb --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/recipes/README.txt @@ -0,0 +1,25 @@ +1) This source directory contains various Zookeeper recipe implementations. + +2) The recipe directory name should specify the name of the recipe you are implementing - eg. lock/. + +3) It would be great if you can provide both the java and c recipes for the zookeeper recipes. +The c recipes go in to recipe-name/src/c and the java implementation goes into recipe-name/src/java. + +4) The recipes hold high standards like our zookeeper c/java libraries, so make sure that you include +some unit testing with both the c and java recipe code. + +5) Also, please name your c client public methods as +zkr_recipe-name_methodname +(eg. zkr_lock_lock in lock/src/c) + +6) The various recipes are in ../../docs/recipes.html or +../../docs/reciped.pdf. Also, this is not an exhaustive list by any chance. +Zookeeper is used (and can be used) for more than what we have listed in the docs. + +7) To run the c tests in all the recipes, +- make sure the main zookeeper c libraries in +{top}/src/c/ are compiled. Run autoreconf -if;./configure; make. The libaries +will be installed in {top}/src/c/.libs. +- run autoreconf if;./configure;make run-check + in src/recipes/$recipename/src/c + diff --git a/pkg/registry/zookeeper-3.4.6/src/recipes/build-recipes.xml b/pkg/registry/zookeeper-3.4.6/src/recipes/build-recipes.xml new file mode 100644 index 000000000..dff659df9 --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/recipes/build-recipes.xml @@ -0,0 +1,177 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/pkg/registry/zookeeper-3.4.6/src/recipes/build.xml b/pkg/registry/zookeeper-3.4.6/src/recipes/build.xml new file mode 100644 index 000000000..cd7310478 --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/recipes/build.xml @@ -0,0 +1,79 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/pkg/registry/zookeeper-3.4.6/src/recipes/election/README.txt b/pkg/registry/zookeeper-3.4.6/src/recipes/election/README.txt new file mode 100644 index 000000000..10447ed4d --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/recipes/election/README.txt @@ -0,0 +1,27 @@ + + +1) This election interface recipe implements the leader election recipe +mentioned in ../../../docs/recipes.[html,pdf]. + +2) To compile the leader election java recipe you can just run ant jar from +this directory. +Please report any bugs on the jira + +http://issues.apache.org/jira/browse/ZOOKEEPER + + diff --git a/pkg/registry/zookeeper-3.4.6/src/recipes/election/build.xml b/pkg/registry/zookeeper-3.4.6/src/recipes/election/build.xml new file mode 100644 index 000000000..3e1bcb854 --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/recipes/election/build.xml @@ -0,0 +1,128 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Tests failed! + + + + + + + + + + + + + + + + + + diff --git a/pkg/registry/zookeeper-3.4.6/src/recipes/election/src/java/org/apache/zookeeper/recipes/leader/LeaderElectionAware.java b/pkg/registry/zookeeper-3.4.6/src/recipes/election/src/java/org/apache/zookeeper/recipes/leader/LeaderElectionAware.java new file mode 100644 index 000000000..6c32ebc9b --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/recipes/election/src/java/org/apache/zookeeper/recipes/leader/LeaderElectionAware.java @@ -0,0 +1,37 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + */ +package org.apache.zookeeper.recipes.leader; + +import org.apache.zookeeper.recipes.leader.LeaderElectionSupport.EventType; + +/** + * An interface to be implemented by clients that want to receive election + * events. + */ +public interface LeaderElectionAware { + + /** + * Called during each state transition. Current, low level events are provided + * at the beginning and end of each state. For instance, START may be followed + * by OFFER_START, OFFER_COMPLETE, DETERMINE_START, DETERMINE_COMPLETE, and so + * on. + * + * @param eventType + */ + public void onElectionEvent(EventType eventType); + +} diff --git a/pkg/registry/zookeeper-3.4.6/src/recipes/election/src/java/org/apache/zookeeper/recipes/leader/LeaderElectionSupport.java b/pkg/registry/zookeeper-3.4.6/src/recipes/election/src/java/org/apache/zookeeper/recipes/leader/LeaderElectionSupport.java new file mode 100644 index 000000000..8f8ae2060 --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/recipes/election/src/java/org/apache/zookeeper/recipes/leader/LeaderElectionSupport.java @@ -0,0 +1,461 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + */ +package org.apache.zookeeper.recipes.leader; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.HashSet; +import java.util.List; +import java.util.Set; + +import org.apache.zookeeper.CreateMode; +import org.apache.zookeeper.KeeperException; +import org.apache.zookeeper.WatchedEvent; +import org.apache.zookeeper.Watcher; +import org.apache.zookeeper.ZooDefs; +import org.apache.zookeeper.ZooKeeper; +import org.apache.zookeeper.data.Stat; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + *

      + * A leader election support library implementing the ZooKeeper election recipe. + *

      + *

      + * This support library is meant to simplify the construction of an exclusive + * leader system on top of Apache ZooKeeper. Any application that can become the + * leader (usually a process that provides a service, exclusively) would + * configure an instance of this class with their hostname, at least one + * listener (an implementation of {@link LeaderElectionAware}), and either an + * instance of {@link ZooKeeper} or the proper connection information. Once + * configured, invoking {@link #start()} will cause the client to connect to + * ZooKeeper and create a leader offer. The library then determines if it has + * been elected the leader using the algorithm described below. The client + * application can follow all state transitions via the listener callback. + *

      + *

      + * Leader election algorithm + *

      + *

      + * The library starts in a START state. Through each state transition, a state + * start and a state complete event are sent to all listeners. When + * {@link #start()} is called, a leader offer is created in ZooKeeper. A leader + * offer is an ephemeral sequential node that indicates a process that can act + * as a leader for this service. A read of all leader offers is then performed. + * The offer with the lowest sequence number is said to be the leader. The + * process elected leader will transition to the leader state. All other + * processes will transition to a ready state. Internally, the library creates a + * ZooKeeper watch on the leader offer with the sequence ID of N - 1 (where N is + * the process's sequence ID). If that offer disappears due to a process + * failure, the watching process will run through the election determination + * process again to see if it should become the leader. Note that sequence ID + * may not be contiguous due to failed processes. A process may revoke its offer + * to be the leader at any time by calling {@link #stop()}. + *

      + *

      + * Guarantees (not) Made and Caveats + *

      + *

      + *

        + *
      • It is possible for a (poorly implemented) process to create a leader + * offer, get the lowest sequence ID, but have something terrible occur where it + * maintains its connection to ZK (and thus its ephemeral leader offer node) but + * doesn't actually provide the service in question. It is up to the user to + * ensure any failure to become the leader - and whatever that means in the + * context of the user's application - results in a revocation of its leader + * offer (i.e. that {@link #stop()} is called).
      • + *
      • It is possible for ZK timeouts and retries to play a role in service + * liveliness. In other words, if process A has the lowest sequence ID but + * requires a few attempts to read the other leader offers' sequence IDs, + * election can seem slow. Users should apply timeouts during the determination + * process if they need to hit a specific SLA.
      • + *
      • The library makes a "best effort" to detect catastrophic failures of the + * process. It is possible that an unforeseen event results in (for instance) an + * unchecked exception that propagates passed normal error handling code. This + * normally doesn't matter as the same exception would almost certain destroy + * the entire process and thus the connection to ZK and the leader offer + * resulting in another round of leader determination.
      • + *
      + *

      + */ +public class LeaderElectionSupport implements Watcher { + + private static final Logger logger = LoggerFactory + .getLogger(LeaderElectionSupport.class); + + private ZooKeeper zooKeeper; + + private State state; + private Set listeners; + + private String rootNodeName; + private LeaderOffer leaderOffer; + private String hostName; + + public LeaderElectionSupport() { + state = State.STOP; + listeners = Collections.synchronizedSet(new HashSet()); + } + + /** + *

      + * Start the election process. This method will create a leader offer, + * determine its status, and either become the leader or become ready. If an + * instance of {@link ZooKeeper} has not yet been configured by the user, a + * new instance is created using the connectString and sessionTime specified. + *

      + *

      + * Any (anticipated) failures result in a failed event being sent to all + * listeners. + *

      + */ + public synchronized void start() { + state = State.START; + dispatchEvent(EventType.START); + + logger.info("Starting leader election support"); + + if (zooKeeper == null) { + throw new IllegalStateException( + "No instance of zookeeper provided. Hint: use setZooKeeper()"); + } + + if (hostName == null) { + throw new IllegalStateException( + "No hostname provided. Hint: use setHostName()"); + } + + try { + makeOffer(); + determineElectionStatus(); + } catch (KeeperException e) { + becomeFailed(e); + return; + } catch (InterruptedException e) { + becomeFailed(e); + return; + } + } + + /** + * Stops all election services, revokes any outstanding leader offers, and + * disconnects from ZooKeeper. + */ + public synchronized void stop() { + state = State.STOP; + dispatchEvent(EventType.STOP_START); + + logger.info("Stopping leader election support"); + + if (leaderOffer != null) { + try { + zooKeeper.delete(leaderOffer.getNodePath(), -1); + logger.info("Removed leader offer {}", leaderOffer.getNodePath()); + } catch (InterruptedException e) { + becomeFailed(e); + } catch (KeeperException e) { + becomeFailed(e); + } + } + + dispatchEvent(EventType.STOP_COMPLETE); + } + + private void makeOffer() throws KeeperException, InterruptedException { + state = State.OFFER; + dispatchEvent(EventType.OFFER_START); + + leaderOffer = new LeaderOffer(); + + leaderOffer.setHostName(hostName); + leaderOffer.setNodePath(zooKeeper.create(rootNodeName + "/" + "n_", + hostName.getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, + CreateMode.EPHEMERAL_SEQUENTIAL)); + + logger.debug("Created leader offer {}", leaderOffer); + + dispatchEvent(EventType.OFFER_COMPLETE); + } + + private void determineElectionStatus() throws KeeperException, + InterruptedException { + + state = State.DETERMINE; + dispatchEvent(EventType.DETERMINE_START); + + String[] components = leaderOffer.getNodePath().split("/"); + + leaderOffer.setId(Integer.valueOf(components[components.length - 1] + .substring("n_".length()))); + + List leaderOffers = toLeaderOffers(zooKeeper.getChildren( + rootNodeName, false)); + + /* + * For each leader offer, find out where we fit in. If we're first, we + * become the leader. If we're not elected the leader, attempt to stat the + * offer just less than us. If they exist, watch for their failure, but if + * they don't, become the leader. + */ + for (int i = 0; i < leaderOffers.size(); i++) { + LeaderOffer leaderOffer = leaderOffers.get(i); + + if (leaderOffer.getId().equals(this.leaderOffer.getId())) { + logger.debug("There are {} leader offers. I am {} in line.", + leaderOffers.size(), i); + + dispatchEvent(EventType.DETERMINE_COMPLETE); + + if (i == 0) { + becomeLeader(); + } else { + becomeReady(leaderOffers.get(i - 1)); + } + + /* Once we've figured out where we are, we're done. */ + break; + } + } + } + + private void becomeReady(LeaderOffer neighborLeaderOffer) + throws KeeperException, InterruptedException { + dispatchEvent(EventType.READY_START); + + logger.info("{} not elected leader. Watching node:{}", + leaderOffer.getNodePath(), neighborLeaderOffer.getNodePath()); + + /* + * Make sure to pass an explicit Watcher because we could be sharing this + * zooKeeper instance with someone else. + */ + Stat stat = zooKeeper.exists(neighborLeaderOffer.getNodePath(), this); + + if (stat != null) { + logger.debug( + "We're behind {} in line and they're alive. Keeping an eye on them.", + neighborLeaderOffer.getNodePath()); + state = State.READY; + dispatchEvent(EventType.READY_COMPLETE); + } else { + /* + * If the stat fails, the node has gone missing between the call to + * getChildren() and exists(). We need to try and become the leader. + */ + logger + .info( + "We were behind {} but it looks like they died. Back to determination.", + neighborLeaderOffer.getNodePath()); + determineElectionStatus(); + } + + } + + private void becomeLeader() { + state = State.ELECTED; + dispatchEvent(EventType.ELECTED_START); + + logger.info("Becoming leader with node:{}", leaderOffer.getNodePath()); + + dispatchEvent(EventType.ELECTED_COMPLETE); + } + + private void becomeFailed(Exception e) { + logger.error("Failed in state {} - Exception:{}", state, e); + + state = State.FAILED; + dispatchEvent(EventType.FAILED); + } + + /** + * Fetch the (user supplied) hostname of the current leader. Note that by the + * time this method returns, state could have changed so do not depend on this + * to be strongly consistent. This method has to read all leader offers from + * ZooKeeper to deterime who the leader is (i.e. there is no caching) so + * consider the performance implications of frequent invocation. If there are + * no leader offers this method returns null. + * + * @return hostname of the current leader + * @throws KeeperException + * @throws InterruptedException + */ + public String getLeaderHostName() throws KeeperException, + InterruptedException { + + List leaderOffers = toLeaderOffers(zooKeeper.getChildren( + rootNodeName, false)); + + if (leaderOffers.size() > 0) { + return leaderOffers.get(0).getHostName(); + } + + return null; + } + + private List toLeaderOffers(List strings) + throws KeeperException, InterruptedException { + + List leaderOffers = new ArrayList(strings.size()); + + /* + * Turn each child of rootNodeName into a leader offer. This is a tuple of + * the sequence number and the node name. + */ + for (String offer : strings) { + String hostName = new String(zooKeeper.getData( + rootNodeName + "/" + offer, false, null)); + + leaderOffers.add(new LeaderOffer(Integer.valueOf(offer.substring("n_" + .length())), rootNodeName + "/" + offer, hostName)); + } + + /* + * We sort leader offers by sequence number (which may not be zero-based or + * contiguous) and keep their paths handy for setting watches. + */ + Collections.sort(leaderOffers, new LeaderOffer.IdComparator()); + + return leaderOffers; + } + + @Override + public void process(WatchedEvent event) { + if (event.getType().equals(Watcher.Event.EventType.NodeDeleted)) { + if (!event.getPath().equals(leaderOffer.getNodePath()) + && state != State.STOP) { + logger.debug( + "Node {} deleted. Need to run through the election process.", + event.getPath()); + try { + determineElectionStatus(); + } catch (KeeperException e) { + becomeFailed(e); + } catch (InterruptedException e) { + becomeFailed(e); + } + } + } + } + + private void dispatchEvent(EventType eventType) { + logger.debug("Dispatching event:{}", eventType); + + synchronized (listeners) { + if (listeners.size() > 0) { + for (LeaderElectionAware observer : listeners) { + observer.onElectionEvent(eventType); + } + } + } + } + + /** + * Adds {@code listener} to the list of listeners who will receive events. + * + * @param listener + */ + public void addListener(LeaderElectionAware listener) { + listeners.add(listener); + } + + /** + * Remove {@code listener} from the list of listeners who receive events. + * + * @param listener + */ + public void removeListener(LeaderElectionAware listener) { + listeners.remove(listener); + } + + @Override + public String toString() { + return "{ state:" + state + " leaderOffer:" + leaderOffer + " zooKeeper:" + + zooKeeper + " hostName:" + hostName + " listeners:" + listeners + + " }"; + } + + /** + *

      + * Gets the ZooKeeper root node to use for this service. + *

      + *

      + * For instance, a root node of {@code /mycompany/myservice} would be the + * parent of all leader offers for this service. Obviously all processes that + * wish to contend for leader status need to use the same root node. Note: We + * assume this node already exists. + *

      + * + * @return a znode path + */ + public String getRootNodeName() { + return rootNodeName; + } + + /** + *

      + * Sets the ZooKeeper root node to use for this service. + *

      + *

      + * For instance, a root node of {@code /mycompany/myservice} would be the + * parent of all leader offers for this service. Obviously all processes that + * wish to contend for leader status need to use the same root node. Note: We + * assume this node already exists. + *

      + */ + public void setRootNodeName(String rootNodeName) { + this.rootNodeName = rootNodeName; + } + + /** + * The {@link ZooKeeper} instance to use for all operations. Provided this + * overrides any connectString or sessionTimeout set. + */ + public ZooKeeper getZooKeeper() { + return zooKeeper; + } + + public void setZooKeeper(ZooKeeper zooKeeper) { + this.zooKeeper = zooKeeper; + } + + /** + * The hostname of this process. Mostly used as a convenience for logging and + * to respond to {@link #getLeaderHostName()} requests. + */ + public String getHostName() { + return hostName; + } + + public void setHostName(String hostName) { + this.hostName = hostName; + } + + /** + * The type of event. + */ + public static enum EventType { + START, OFFER_START, OFFER_COMPLETE, DETERMINE_START, DETERMINE_COMPLETE, ELECTED_START, ELECTED_COMPLETE, READY_START, READY_COMPLETE, FAILED, STOP_START, STOP_COMPLETE, + } + + /** + * The internal state of the election support service. + */ + public static enum State { + START, OFFER, DETERMINE, ELECTED, READY, FAILED, STOP + } +} diff --git a/pkg/registry/zookeeper-3.4.6/src/recipes/election/src/java/org/apache/zookeeper/recipes/leader/LeaderOffer.java b/pkg/registry/zookeeper-3.4.6/src/recipes/election/src/java/org/apache/zookeeper/recipes/leader/LeaderOffer.java new file mode 100644 index 000000000..188a6d575 --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/recipes/election/src/java/org/apache/zookeeper/recipes/leader/LeaderOffer.java @@ -0,0 +1,84 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + */ +package org.apache.zookeeper.recipes.leader; + +import java.util.Comparator; + +/** + * A leader offer is a numeric id / path pair. The id is the sequential node id + * assigned by ZooKeeper where as the path is the absolute path to the ZNode. + */ +public class LeaderOffer { + + private Integer id; + private String nodePath; + private String hostName; + + public LeaderOffer() { + // Default constructor + } + + public LeaderOffer(Integer id, String nodePath, String hostName) { + this.id = id; + this.nodePath = nodePath; + this.hostName = hostName; + } + + @Override + public String toString() { + return "{ id:" + id + " nodePath:" + nodePath + " hostName:" + hostName + + " }"; + } + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public String getNodePath() { + return nodePath; + } + + public void setNodePath(String nodePath) { + this.nodePath = nodePath; + } + + public String getHostName() { + return hostName; + } + + public void setHostName(String hostName) { + this.hostName = hostName; + } + + /** + * Compare two instances of {@link LeaderOffer} using only the {code}id{code} + * member. + */ + public static class IdComparator implements Comparator { + + @Override + public int compare(LeaderOffer o1, LeaderOffer o2) { + return o1.getId().compareTo(o2.getId()); + } + + } + +} diff --git a/pkg/registry/zookeeper-3.4.6/src/recipes/lock/README.txt b/pkg/registry/zookeeper-3.4.6/src/recipes/lock/README.txt new file mode 100644 index 000000000..1fc4fbfc5 --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/recipes/lock/README.txt @@ -0,0 +1,28 @@ + + +1) This lock interface recipe implements the lock recipe +mentioned in ../../../docs/recipes.[html,pdf]. + +2) To compile the lock java recipe you can just run ant jar from +this directory. For compiling the c libarary go to src/c and read +the INSTALLATION instructions. +Please report any bugs on the jira + +http://issues.apache.org/jira/browse/ZOOKEEPER + + diff --git a/pkg/registry/zookeeper-3.4.6/src/recipes/lock/build.xml b/pkg/registry/zookeeper-3.4.6/src/recipes/lock/build.xml new file mode 100644 index 000000000..841cc0181 --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/recipes/lock/build.xml @@ -0,0 +1,128 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Tests failed! + + + + + + + + + + + + + + + + + + diff --git a/pkg/registry/zookeeper-3.4.6/src/recipes/lock/src/c/INSTALL b/pkg/registry/zookeeper-3.4.6/src/recipes/lock/src/c/INSTALL new file mode 100644 index 000000000..5458714e1 --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/recipes/lock/src/c/INSTALL @@ -0,0 +1,234 @@ +Installation Instructions +************************* + +Copyright (C) 1994, 1995, 1996, 1999, 2000, 2001, 2002, 2004, 2005, +2006 Free Software Foundation, Inc. + +This file is free documentation; the Free Software Foundation gives +unlimited permission to copy, distribute and modify it. + +Basic Installation +================== + +Briefly, the shell commands `./configure; make; make install' should +configure, build, and install this package. The following +more-detailed instructions are generic; see the `README' file for +instructions specific to this package. + + The `configure' shell script attempts to guess correct values for +various system-dependent variables used during compilation. It uses +those values to create a `Makefile' in each directory of the package. +It may also create one or more `.h' files containing system-dependent +definitions. Finally, it creates a shell script `config.status' that +you can run in the future to recreate the current configuration, and a +file `config.log' containing compiler output (useful mainly for +debugging `configure'). + + It can also use an optional file (typically called `config.cache' +and enabled with `--cache-file=config.cache' or simply `-C') that saves +the results of its tests to speed up reconfiguring. Caching is +disabled by default to prevent problems with accidental use of stale +cache files. + + If you need to do unusual things to compile the package, please try +to figure out how `configure' could check whether to do them, and mail +diffs or instructions to the address given in the `README' so they can +be considered for the next release. If you are using the cache, and at +some point `config.cache' contains results you don't want to keep, you +may remove or edit it. + + The file `configure.ac' (or `configure.in') is used to create +`configure' by a program called `autoconf'. You need `configure.ac' if +you want to change it or regenerate `configure' using a newer version +of `autoconf'. + +The simplest way to compile this package is: + + 1. `cd' to the directory containing the package's source code and type + `./configure' to configure the package for your system. + + Running `configure' might take a while. While running, it prints + some messages telling which features it is checking for. + + 2. Type `make' to compile the package. + + 3. Optionally, type `make check' to run any self-tests that come with + the package. + + 4. Type `make install' to install the programs and any data files and + documentation. + + 5. You can remove the program binaries and object files from the + source code directory by typing `make clean'. To also remove the + files that `configure' created (so you can compile the package for + a different kind of computer), type `make distclean'. There is + also a `make maintainer-clean' target, but that is intended mainly + for the package's developers. If you use it, you may have to get + all sorts of other programs in order to regenerate files that came + with the distribution. + +Compilers and Options +===================== + +Some systems require unusual options for compilation or linking that the +`configure' script does not know about. Run `./configure --help' for +details on some of the pertinent environment variables. + + You can give `configure' initial values for configuration parameters +by setting variables in the command line or in the environment. Here +is an example: + + ./configure CC=c99 CFLAGS=-g LIBS=-lposix + + *Note Defining Variables::, for more details. + +Compiling For Multiple Architectures +==================================== + +You can compile the package for more than one kind of computer at the +same time, by placing the object files for each architecture in their +own directory. To do this, you can use GNU `make'. `cd' to the +directory where you want the object files and executables to go and run +the `configure' script. `configure' automatically checks for the +source code in the directory that `configure' is in and in `..'. + + With a non-GNU `make', it is safer to compile the package for one +architecture at a time in the source code directory. After you have +installed the package for one architecture, use `make distclean' before +reconfiguring for another architecture. + +Installation Names +================== + +By default, `make install' installs the package's commands under +`/usr/local/bin', include files under `/usr/local/include', etc. You +can specify an installation prefix other than `/usr/local' by giving +`configure' the option `--prefix=PREFIX'. + + You can specify separate installation prefixes for +architecture-specific files and architecture-independent files. If you +pass the option `--exec-prefix=PREFIX' to `configure', the package uses +PREFIX as the prefix for installing programs and libraries. +Documentation and other data files still use the regular prefix. + + In addition, if you use an unusual directory layout you can give +options like `--bindir=DIR' to specify different values for particular +kinds of files. Run `configure --help' for a list of the directories +you can set and what kinds of files go in them. + + If the package supports it, you can cause programs to be installed +with an extra prefix or suffix on their names by giving `configure' the +option `--program-prefix=PREFIX' or `--program-suffix=SUFFIX'. + +Optional Features +================= + +Some packages pay attention to `--enable-FEATURE' options to +`configure', where FEATURE indicates an optional part of the package. +They may also pay attention to `--with-PACKAGE' options, where PACKAGE +is something like `gnu-as' or `x' (for the X Window System). The +`README' should mention any `--enable-' and `--with-' options that the +package recognizes. + + For packages that use the X Window System, `configure' can usually +find the X include and library files automatically, but if it doesn't, +you can use the `configure' options `--x-includes=DIR' and +`--x-libraries=DIR' to specify their locations. + +Specifying the System Type +========================== + +There may be some features `configure' cannot figure out automatically, +but needs to determine by the type of machine the package will run on. +Usually, assuming the package is built to be run on the _same_ +architectures, `configure' can figure that out, but if it prints a +message saying it cannot guess the machine type, give it the +`--build=TYPE' option. TYPE can either be a short name for the system +type, such as `sun4', or a canonical name which has the form: + + CPU-COMPANY-SYSTEM + +where SYSTEM can have one of these forms: + + OS KERNEL-OS + + See the file `config.sub' for the possible values of each field. If +`config.sub' isn't included in this package, then this package doesn't +need to know the machine type. + + If you are _building_ compiler tools for cross-compiling, you should +use the option `--target=TYPE' to select the type of system they will +produce code for. + + If you want to _use_ a cross compiler, that generates code for a +platform different from the build platform, you should specify the +"host" platform (i.e., that on which the generated programs will +eventually be run) with `--host=TYPE'. + +Sharing Defaults +================ + +If you want to set default values for `configure' scripts to share, you +can create a site shell script called `config.site' that gives default +values for variables like `CC', `cache_file', and `prefix'. +`configure' looks for `PREFIX/share/config.site' if it exists, then +`PREFIX/etc/config.site' if it exists. Or, you can set the +`CONFIG_SITE' environment variable to the location of the site script. +A warning: not all `configure' scripts look for a site script. + +Defining Variables +================== + +Variables not defined in a site shell script can be set in the +environment passed to `configure'. However, some packages may run +configure again during the build, and the customized values of these +variables may be lost. In order to avoid this problem, you should set +them in the `configure' command line, using `VAR=value'. For example: + + ./configure CC=/usr/local2/bin/gcc + +causes the specified `gcc' to be used as the C compiler (unless it is +overridden in the site shell script). + +Unfortunately, this technique does not work for `CONFIG_SHELL' due to +an Autoconf bug. Until the bug is fixed you can use this workaround: + + CONFIG_SHELL=/bin/bash /bin/bash ./configure CONFIG_SHELL=/bin/bash + +`configure' Invocation +====================== + +`configure' recognizes the following options to control how it operates. + +`--help' +`-h' + Print a summary of the options to `configure', and exit. + +`--version' +`-V' + Print the version of Autoconf used to generate the `configure' + script, and exit. + +`--cache-file=FILE' + Enable the cache: use and save the results of the tests in FILE, + traditionally `config.cache'. FILE defaults to `/dev/null' to + disable caching. + +`--config-cache' +`-C' + Alias for `--cache-file=config.cache'. + +`--quiet' +`--silent' +`-q' + Do not print messages saying which checks are being made. To + suppress all normal output, redirect it to `/dev/null' (any error + messages will still be shown). + +`--srcdir=DIR' + Look for the package's source code in directory DIR. Usually + `configure' can determine that directory automatically. + +`configure' also accepts some other, not widely useful, options. Run +`configure --help' for more details. + diff --git a/pkg/registry/zookeeper-3.4.6/src/recipes/lock/src/c/LICENSE b/pkg/registry/zookeeper-3.4.6/src/recipes/lock/src/c/LICENSE new file mode 100644 index 000000000..d64569567 --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/recipes/lock/src/c/LICENSE @@ -0,0 +1,202 @@ + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/pkg/registry/zookeeper-3.4.6/src/recipes/lock/src/c/Makefile.am b/pkg/registry/zookeeper-3.4.6/src/recipes/lock/src/c/Makefile.am new file mode 100644 index 000000000..9b36b43e1 --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/recipes/lock/src/c/Makefile.am @@ -0,0 +1,46 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you 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. + +include $(top_srcdir)/aminclude.am + +AM_CFLAGS = -Wall -fPIC -I${ZOOKEEPER_PATH}/include -I${ZOOKEEPER_PATH}/generated \ + -I$(top_srcdir)/include -I/usr/include +AM_CPPFLAGS = -Wall -I${ZOOKEEPER_PATH}/include -I${ZOOKEEPER_PATH}/generated\ + -I${top_srcdir}/include -I/usr/include +EXTRA_DIST = LICENSE +lib_LTLIBRARIES = libzoolock.la +libzoolock_la_SOURCES = src/zoo_lock.c include/zoo_lock.h +libzoolock_la_CPPFLAGS = -DDLOPEN_MODULE +libzoolock_la_LDFLAGS = -version-info 0:1:0 + +#run the tests now + +TEST_SOURCES = tests/TestDriver.cc tests/TestClient.cc tests/Util.cc + + +check_PROGRAMS = zklocktest +nodist_zklocktest_SOURCES = ${TEST_SOURCES} +zklocktest_LDADD = ${ZOOKEEPER_LD} libzoolock.la -lpthread ${CPPUNIT_LIBS} +zklocktest_CXXFLAGS = -DUSE_STATIC_LIB ${CPPUNIT_CFLAGS} + +run-check: check + ./zklocktest ${TEST_OPTIONS} + +clean-local: clean-check + ${RM} ${DX_CLEANFILES} + +clean-check: + ${RM} ${nodist_zklocktest_OBJECTS} diff --git a/pkg/registry/zookeeper-3.4.6/src/recipes/lock/src/c/README.txt b/pkg/registry/zookeeper-3.4.6/src/recipes/lock/src/c/README.txt new file mode 100644 index 000000000..326bba85d --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/recipes/lock/src/c/README.txt @@ -0,0 +1,28 @@ + Zookeeper C lock client library + + +INSTALLATION + +If you're building the client from a source checkout you need to +follow the steps outlined below. If you're building from a release +tar downloaded from Apache please skip to step 2. + +1) make sure that you compile the main zookeeper c client library. + +2) change directory to src/recipes/lock/src/c + and do a "autoreconf -if" to bootstrap + autoconf, automake and libtool. Please make sure you have autoconf + version 2.59 or greater installed. +3) do a "./configure [OPTIONS]" to generate the makefile. See INSTALL + for general information about running configure. + +4) do a "make" or "make install" to build the libraries and install them. + Alternatively, you can also build and run a unit test suite (and + you probably should). Please make sure you have cppunit-1.10.x or + higher installed before you execute step 4. Once ./configure has + finished, do a "make run-check". It will build the libraries, build + the tests and run them. +5) to generate doxygen documentation do a "make doxygen-doc". All + documentations will be placed to a new subfolder named docs. By + default only HTML documentation is generated. For information on + other document formats please use "./configure --help" diff --git a/pkg/registry/zookeeper-3.4.6/src/recipes/lock/src/c/acinclude.m4 b/pkg/registry/zookeeper-3.4.6/src/recipes/lock/src/c/acinclude.m4 new file mode 100644 index 000000000..d0041d8c2 --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/recipes/lock/src/c/acinclude.m4 @@ -0,0 +1,312 @@ +# This file is part of Autoconf. -*- Autoconf -*- + +# Copyright (C) 2004 Oren Ben-Kiki +# This file is distributed under the same terms as the Autoconf macro files. + +# Generate automatic documentation using Doxygen. Works in concert with the +# aminclude.m4 file and a compatible doxygen configuration file. Defines the +# following public macros: +# +# DX_???_FEATURE(ON|OFF) - control the default setting fo a Doxygen feature. +# Supported features are 'DOXYGEN' itself, 'DOT' for generating graphics, +# 'HTML' for plain HTML, 'CHM' for compressed HTML help (for MS users), 'CHI' +# for generating a seperate .chi file by the .chm file, and 'MAN', 'RTF', +# 'XML', 'PDF' and 'PS' for the appropriate output formats. The environment +# variable DOXYGEN_PAPER_SIZE may be specified to override the default 'a4wide' +# paper size. +# +# By default, HTML, PDF and PS documentation is generated as this seems to be +# the most popular and portable combination. MAN pages created by Doxygen are +# usually problematic, though by picking an appropriate subset and doing some +# massaging they might be better than nothing. CHM and RTF are specific for MS +# (note that you can't generate both HTML and CHM at the same time). The XML is +# rather useless unless you apply specialized post-processing to it. +# +# The macro mainly controls the default state of the feature. The use can +# override the default by specifying --enable or --disable. The macros ensure +# that contradictory flags are not given (e.g., --enable-doxygen-html and +# --enable-doxygen-chm, --enable-doxygen-anything with --disable-doxygen, etc.) +# Finally, each feature will be automatically disabled (with a warning) if the +# required programs are missing. +# +# Once all the feature defaults have been specified, call DX_INIT_DOXYGEN with +# the following parameters: a one-word name for the project for use as a +# filename base etc., an optional configuration file name (the default is +# 'Doxyfile', the same as Doxygen's default), and an optional output directory +# name (the default is 'doxygen-doc'). + +## ----------## +## Defaults. ## +## ----------## + +DX_ENV="" +AC_DEFUN([DX_FEATURE_doc], ON) +AC_DEFUN([DX_FEATURE_dot], ON) +AC_DEFUN([DX_FEATURE_man], OFF) +AC_DEFUN([DX_FEATURE_html], ON) +AC_DEFUN([DX_FEATURE_chm], OFF) +AC_DEFUN([DX_FEATURE_chi], OFF) +AC_DEFUN([DX_FEATURE_rtf], OFF) +AC_DEFUN([DX_FEATURE_xml], OFF) +AC_DEFUN([DX_FEATURE_pdf], ON) +AC_DEFUN([DX_FEATURE_ps], ON) + +## --------------- ## +## Private macros. ## +## --------------- ## + +# DX_ENV_APPEND(VARIABLE, VALUE) +# ------------------------------ +# Append VARIABLE="VALUE" to DX_ENV for invoking doxygen. +AC_DEFUN([DX_ENV_APPEND], [AC_SUBST([DX_ENV], ["$DX_ENV $1='$2'"])]) + +# DX_DIRNAME_EXPR +# --------------- +# Expand into a shell expression prints the directory part of a path. +AC_DEFUN([DX_DIRNAME_EXPR], + [[expr ".$1" : '\(\.\)[^/]*$' \| "x$1" : 'x\(.*\)/[^/]*$']]) + +# DX_IF_FEATURE(FEATURE, IF-ON, IF-OFF) +# ------------------------------------- +# Expands according to the M4 (static) status of the feature. +AC_DEFUN([DX_IF_FEATURE], [ifelse(DX_FEATURE_$1, ON, [$2], [$3])]) + +# DX_REQUIRE_PROG(VARIABLE, PROGRAM) +# ---------------------------------- +# Require the specified program to be found for the DX_CURRENT_FEATURE to work. +AC_DEFUN([DX_REQUIRE_PROG], [ +AC_PATH_TOOL([$1], [$2]) +if test "$DX_FLAG_$[DX_CURRENT_FEATURE$$1]" = 1; then + AC_MSG_WARN([$2 not found - will not DX_CURRENT_DESCRIPTION]) + AC_SUBST([DX_FLAG_]DX_CURRENT_FEATURE, 0) +fi +]) + +# DX_TEST_FEATURE(FEATURE) +# ------------------------ +# Expand to a shell expression testing whether the feature is active. +AC_DEFUN([DX_TEST_FEATURE], [test "$DX_FLAG_$1" = 1]) + +# DX_CHECK_DEPEND(REQUIRED_FEATURE, REQUIRED_STATE) +# ------------------------------------------------- +# Verify that a required features has the right state before trying to turn on +# the DX_CURRENT_FEATURE. +AC_DEFUN([DX_CHECK_DEPEND], [ +test "$DX_FLAG_$1" = "$2" \ +|| AC_MSG_ERROR([doxygen-DX_CURRENT_FEATURE ifelse([$2], 1, + requires, contradicts) doxygen-DX_CURRENT_FEATURE]) +]) + +# DX_CLEAR_DEPEND(FEATURE, REQUIRED_FEATURE, REQUIRED_STATE) +# ---------------------------------------------------------- +# Turn off the DX_CURRENT_FEATURE if the required feature is off. +AC_DEFUN([DX_CLEAR_DEPEND], [ +test "$DX_FLAG_$1" = "$2" || AC_SUBST([DX_FLAG_]DX_CURRENT_FEATURE, 0) +]) + +# DX_FEATURE_ARG(FEATURE, DESCRIPTION, +# CHECK_DEPEND, CLEAR_DEPEND, +# REQUIRE, DO-IF-ON, DO-IF-OFF) +# -------------------------------------------- +# Parse the command-line option controlling a feature. CHECK_DEPEND is called +# if the user explicitly turns the feature on (and invokes DX_CHECK_DEPEND), +# otherwise CLEAR_DEPEND is called to turn off the default state if a required +# feature is disabled (using DX_CLEAR_DEPEND). REQUIRE performs additional +# requirement tests (DX_REQUIRE_PROG). Finally, an automake flag is set and +# DO-IF-ON or DO-IF-OFF are called according to the final state of the feature. +AC_DEFUN([DX_ARG_ABLE], [ + AC_DEFUN([DX_CURRENT_FEATURE], [$1]) + AC_DEFUN([DX_CURRENT_DESCRIPTION], [$2]) + AC_ARG_ENABLE(doxygen-$1, + [AS_HELP_STRING(DX_IF_FEATURE([$1], [--disable-doxygen-$1], + [--enable-doxygen-$1]), + DX_IF_FEATURE([$1], [don't $2], [$2]))], + [ +case "$enableval" in +#( +y|Y|yes|Yes|YES) + AC_SUBST([DX_FLAG_$1], 1) + $3 +;; #( +n|N|no|No|NO) + AC_SUBST([DX_FLAG_$1], 0) +;; #( +*) + AC_MSG_ERROR([invalid value '$enableval' given to doxygen-$1]) +;; +esac +], [ +AC_SUBST([DX_FLAG_$1], [DX_IF_FEATURE([$1], 1, 0)]) +$4 +]) +if DX_TEST_FEATURE([$1]); then + $5 + : +fi +if DX_TEST_FEATURE([$1]); then + AM_CONDITIONAL(DX_COND_$1, :) + $6 + : +else + AM_CONDITIONAL(DX_COND_$1, false) + $7 + : +fi +]) + +## -------------- ## +## Public macros. ## +## -------------- ## + +# DX_XXX_FEATURE(DEFAULT_STATE) +# ----------------------------- +AC_DEFUN([DX_DOXYGEN_FEATURE], [AC_DEFUN([DX_FEATURE_doc], [$1])]) +AC_DEFUN([DX_MAN_FEATURE], [AC_DEFUN([DX_FEATURE_man], [$1])]) +AC_DEFUN([DX_HTML_FEATURE], [AC_DEFUN([DX_FEATURE_html], [$1])]) +AC_DEFUN([DX_CHM_FEATURE], [AC_DEFUN([DX_FEATURE_chm], [$1])]) +AC_DEFUN([DX_CHI_FEATURE], [AC_DEFUN([DX_FEATURE_chi], [$1])]) +AC_DEFUN([DX_RTF_FEATURE], [AC_DEFUN([DX_FEATURE_rtf], [$1])]) +AC_DEFUN([DX_XML_FEATURE], [AC_DEFUN([DX_FEATURE_xml], [$1])]) +AC_DEFUN([DX_XML_FEATURE], [AC_DEFUN([DX_FEATURE_xml], [$1])]) +AC_DEFUN([DX_PDF_FEATURE], [AC_DEFUN([DX_FEATURE_pdf], [$1])]) +AC_DEFUN([DX_PS_FEATURE], [AC_DEFUN([DX_FEATURE_ps], [$1])]) + +# DX_INIT_DOXYGEN(PROJECT, [CONFIG-FILE], [OUTPUT-DOC-DIR]) +# --------------------------------------------------------- +# PROJECT also serves as the base name for the documentation files. +# The default CONFIG-FILE is "Doxyfile" and OUTPUT-DOC-DIR is "doxygen-doc". +AC_DEFUN([DX_INIT_DOXYGEN], [ + +# Files: +AC_SUBST([DX_PROJECT], [$1]) +AC_SUBST([DX_CONFIG], [ifelse([$2], [], Doxyfile, [$2])]) +AC_SUBST([DX_DOCDIR], [ifelse([$3], [], doxygen-doc, [$3])]) + +# Environment variables used inside doxygen.cfg: +DX_ENV_APPEND(SRCDIR, $srcdir) +DX_ENV_APPEND(PROJECT, $DX_PROJECT) +DX_ENV_APPEND(DOCDIR, $DX_DOCDIR) +DX_ENV_APPEND(VERSION, $PACKAGE_VERSION) + +# Doxygen itself: +DX_ARG_ABLE(doc, [generate any doxygen documentation], + [], + [], + [DX_REQUIRE_PROG([DX_DOXYGEN], doxygen) + DX_REQUIRE_PROG([DX_PERL], perl)], + [DX_ENV_APPEND(PERL_PATH, $DX_PERL)]) + +# Dot for graphics: +DX_ARG_ABLE(dot, [generate graphics for doxygen documentation], + [DX_CHECK_DEPEND(doc, 1)], + [DX_CLEAR_DEPEND(doc, 1)], + [DX_REQUIRE_PROG([DX_DOT], dot)], + [DX_ENV_APPEND(HAVE_DOT, YES) + DX_ENV_APPEND(DOT_PATH, [`DX_DIRNAME_EXPR($DX_DOT)`])], + [DX_ENV_APPEND(HAVE_DOT, NO)]) + +# Man pages generation: +DX_ARG_ABLE(man, [generate doxygen manual pages], + [DX_CHECK_DEPEND(doc, 1)], + [DX_CLEAR_DEPEND(doc, 1)], + [], + [DX_ENV_APPEND(GENERATE_MAN, YES)], + [DX_ENV_APPEND(GENERATE_MAN, NO)]) + +# RTF file generation: +DX_ARG_ABLE(rtf, [generate doxygen RTF documentation], + [DX_CHECK_DEPEND(doc, 1)], + [DX_CLEAR_DEPEND(doc, 1)], + [], + [DX_ENV_APPEND(GENERATE_RTF, YES)], + [DX_ENV_APPEND(GENERATE_RTF, NO)]) + +# XML file generation: +DX_ARG_ABLE(xml, [generate doxygen XML documentation], + [DX_CHECK_DEPEND(doc, 1)], + [DX_CLEAR_DEPEND(doc, 1)], + [], + [DX_ENV_APPEND(GENERATE_XML, YES)], + [DX_ENV_APPEND(GENERATE_XML, NO)]) + +# (Compressed) HTML help generation: +DX_ARG_ABLE(chm, [generate doxygen compressed HTML help documentation], + [DX_CHECK_DEPEND(doc, 1)], + [DX_CLEAR_DEPEND(doc, 1)], + [DX_REQUIRE_PROG([DX_HHC], hhc)], + [DX_ENV_APPEND(HHC_PATH, $DX_HHC) + DX_ENV_APPEND(GENERATE_HTML, YES) + DX_ENV_APPEND(GENERATE_HTMLHELP, YES)], + [DX_ENV_APPEND(GENERATE_HTMLHELP, NO)]) + +# Seperate CHI file generation. +DX_ARG_ABLE(chi, [generate doxygen seperate compressed HTML help index file], + [DX_CHECK_DEPEND(chm, 1)], + [DX_CLEAR_DEPEND(chm, 1)], + [], + [DX_ENV_APPEND(GENERATE_CHI, YES)], + [DX_ENV_APPEND(GENERATE_CHI, NO)]) + +# Plain HTML pages generation: +DX_ARG_ABLE(html, [generate doxygen plain HTML documentation], + [DX_CHECK_DEPEND(doc, 1) DX_CHECK_DEPEND(chm, 0)], + [DX_CLEAR_DEPEND(doc, 1) DX_CLEAR_DEPEND(chm, 0)], + [], + [DX_ENV_APPEND(GENERATE_HTML, YES)], + [DX_TEST_FEATURE(chm) || DX_ENV_APPEND(GENERATE_HTML, NO)]) + +# PostScript file generation: +DX_ARG_ABLE(ps, [generate doxygen PostScript documentation], + [DX_CHECK_DEPEND(doc, 1)], + [DX_CLEAR_DEPEND(doc, 1)], + [DX_REQUIRE_PROG([DX_LATEX], latex) + DX_REQUIRE_PROG([DX_MAKEINDEX], makeindex) + DX_REQUIRE_PROG([DX_DVIPS], dvips) + DX_REQUIRE_PROG([DX_EGREP], egrep)]) + +# PDF file generation: +DX_ARG_ABLE(pdf, [generate doxygen PDF documentation], + [DX_CHECK_DEPEND(doc, 1)], + [DX_CLEAR_DEPEND(doc, 1)], + [DX_REQUIRE_PROG([DX_PDFLATEX], pdflatex) + DX_REQUIRE_PROG([DX_MAKEINDEX], makeindex) + DX_REQUIRE_PROG([DX_EGREP], egrep)]) + +# LaTeX generation for PS and/or PDF: +if DX_TEST_FEATURE(ps) || DX_TEST_FEATURE(pdf); then + AM_CONDITIONAL(DX_COND_latex, :) + DX_ENV_APPEND(GENERATE_LATEX, YES) +else + AM_CONDITIONAL(DX_COND_latex, false) + DX_ENV_APPEND(GENERATE_LATEX, NO) +fi + +# Paper size for PS and/or PDF: +AC_ARG_VAR(DOXYGEN_PAPER_SIZE, + [a4wide (default), a4, letter, legal or executive]) +case "$DOXYGEN_PAPER_SIZE" in +#( +"") + AC_SUBST(DOXYGEN_PAPER_SIZE, "") +;; #( +a4wide|a4|letter|legal|executive) + DX_ENV_APPEND(PAPER_SIZE, $DOXYGEN_PAPER_SIZE) +;; #( +*) + AC_MSG_ERROR([unknown DOXYGEN_PAPER_SIZE='$DOXYGEN_PAPER_SIZE']) +;; +esac + +#For debugging: +#echo DX_FLAG_doc=$DX_FLAG_doc +#echo DX_FLAG_dot=$DX_FLAG_dot +#echo DX_FLAG_man=$DX_FLAG_man +#echo DX_FLAG_html=$DX_FLAG_html +#echo DX_FLAG_chm=$DX_FLAG_chm +#echo DX_FLAG_chi=$DX_FLAG_chi +#echo DX_FLAG_rtf=$DX_FLAG_rtf +#echo DX_FLAG_xml=$DX_FLAG_xml +#echo DX_FLAG_pdf=$DX_FLAG_pdf +#echo DX_FLAG_ps=$DX_FLAG_ps +#echo DX_ENV=$DX_ENV +]) diff --git a/pkg/registry/zookeeper-3.4.6/src/recipes/lock/src/c/aminclude.am b/pkg/registry/zookeeper-3.4.6/src/recipes/lock/src/c/aminclude.am new file mode 100644 index 000000000..420049eca --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/recipes/lock/src/c/aminclude.am @@ -0,0 +1,186 @@ +# Copyright (C) 2004 Oren Ben-Kiki +# This file is distributed under the same terms as the Automake macro files. + +# Generate automatic documentation using Doxygen. Goals and variables values +# are controlled by the various DX_COND_??? conditionals set by autoconf. +# +# The provided goals are: +# doxygen-doc: Generate all doxygen documentation. +# doxygen-run: Run doxygen, which will generate some of the documentation +# (HTML, CHM, CHI, MAN, RTF, XML) but will not do the post +# processing required for the rest of it (PS, PDF, and some MAN). +# doxygen-man: Rename some doxygen generated man pages. +# doxygen-ps: Generate doxygen PostScript documentation. +# doxygen-pdf: Generate doxygen PDF documentation. +# +# Note that by default these are not integrated into the automake goals. If +# doxygen is used to generate man pages, you can achieve this integration by +# setting man3_MANS to the list of man pages generated and then adding the +# dependency: +# +# $(man3_MANS): doxygen-doc +# +# This will cause make to run doxygen and generate all the documentation. +# +# The following variable is intended for use in Makefile.am: +# +# DX_CLEANFILES = everything to clean. +# +# This is usually added to MOSTLYCLEANFILES. + +## --------------------------------- ## +## Format-independent Doxygen rules. ## +## --------------------------------- ## + +if DX_COND_doc + +## ------------------------------- ## +## Rules specific for HTML output. ## +## ------------------------------- ## + +if DX_COND_html + +DX_CLEAN_HTML = @DX_DOCDIR@/html + +endif DX_COND_html + +## ------------------------------ ## +## Rules specific for CHM output. ## +## ------------------------------ ## + +if DX_COND_chm + +DX_CLEAN_CHM = @DX_DOCDIR@/chm + +if DX_COND_chi + +DX_CLEAN_CHI = @DX_DOCDIR@/@PACKAGE@.chi + +endif DX_COND_chi + +endif DX_COND_chm + +## ------------------------------ ## +## Rules specific for MAN output. ## +## ------------------------------ ## + +if DX_COND_man + +DX_CLEAN_MAN = @DX_DOCDIR@/man + +endif DX_COND_man + +## ------------------------------ ## +## Rules specific for RTF output. ## +## ------------------------------ ## + +if DX_COND_rtf + +DX_CLEAN_RTF = @DX_DOCDIR@/rtf + +endif DX_COND_rtf + +## ------------------------------ ## +## Rules specific for XML output. ## +## ------------------------------ ## + +if DX_COND_xml + +DX_CLEAN_XML = @DX_DOCDIR@/xml + +endif DX_COND_xml + +## ----------------------------- ## +## Rules specific for PS output. ## +## ----------------------------- ## + +if DX_COND_ps + +DX_CLEAN_PS = @DX_DOCDIR@/@PACKAGE@.ps + +DX_PS_GOAL = doxygen-ps + +doxygen-ps: @DX_DOCDIR@/@PACKAGE@.ps + +@DX_DOCDIR@/@PACKAGE@.ps: @DX_DOCDIR@/@PACKAGE@.tag + cd @DX_DOCDIR@/latex; \ + rm -f *.aux *.toc *.idx *.ind *.ilg *.log *.out; \ + $(DX_LATEX) refman.tex; \ + $(MAKEINDEX_PATH) refman.idx; \ + $(DX_LATEX) refman.tex; \ + countdown=5; \ + while $(DX_EGREP) 'Rerun (LaTeX|to get cross-references right)' \ + refman.log > /dev/null 2>&1 \ + && test $$countdown -gt 0; do \ + $(DX_LATEX) refman.tex; \ + countdown=`expr $$countdown - 1`; \ + done; \ + $(DX_DVIPS) -o ../@PACKAGE@.ps refman.dvi + +endif DX_COND_ps + +## ------------------------------ ## +## Rules specific for PDF output. ## +## ------------------------------ ## + +if DX_COND_pdf + +DX_CLEAN_PDF = @DX_DOCDIR@/@PACKAGE@.pdf + +DX_PDF_GOAL = doxygen-pdf + +doxygen-pdf: @DX_DOCDIR@/@PACKAGE@.pdf + +@DX_DOCDIR@/@PACKAGE@.pdf: @DX_DOCDIR@/@PACKAGE@.tag + cd @DX_DOCDIR@/latex; \ + rm -f *.aux *.toc *.idx *.ind *.ilg *.log *.out; \ + $(DX_PDFLATEX) refman.tex; \ + $(DX_MAKEINDEX) refman.idx; \ + $(DX_PDFLATEX) refman.tex; \ + countdown=5; \ + while $(DX_EGREP) 'Rerun (LaTeX|to get cross-references right)' \ + refman.log > /dev/null 2>&1 \ + && test $$countdown -gt 0; do \ + $(DX_PDFLATEX) refman.tex; \ + countdown=`expr $$countdown - 1`; \ + done; \ + mv refman.pdf ../@PACKAGE@.pdf + +endif DX_COND_pdf + +## ------------------------------------------------- ## +## Rules specific for LaTeX (shared for PS and PDF). ## +## ------------------------------------------------- ## + +if DX_COND_latex + +DX_CLEAN_LATEX = @DX_DOCDIR@/latex + +endif DX_COND_latex + +.PHONY: doxygen-run doxygen-doc $(DX_PS_GOAL) $(DX_PDF_GOAL) + +.INTERMEDIATE: doxygen-run $(DX_PS_GOAL) $(DX_PDF_GOAL) + +doxygen-run: @DX_DOCDIR@/@PACKAGE@.tag + +doxygen-doc: doxygen-run $(DX_PS_GOAL) $(DX_PDF_GOAL) + +@DX_DOCDIR@/@PACKAGE@.tag: $(DX_CONFIG) $(pkginclude_HEADERS) + rm -rf @DX_DOCDIR@ + $(DX_ENV) $(DX_DOXYGEN) $(srcdir)/$(DX_CONFIG) + +DX_CLEANFILES = \ + @DX_DOCDIR@/@PACKAGE@.tag \ + -r \ + $(DX_CLEAN_HTML) \ + $(DX_CLEAN_CHM) \ + $(DX_CLEAN_CHI) \ + $(DX_CLEAN_MAN) \ + $(DX_CLEAN_RTF) \ + $(DX_CLEAN_XML) \ + $(DX_CLEAN_PS) \ + $(DX_CLEAN_PDF) \ + $(DX_CLEAN_LATEX) + +endif DX_COND_doc diff --git a/pkg/registry/zookeeper-3.4.6/src/recipes/lock/src/c/c-doc.Doxyfile b/pkg/registry/zookeeper-3.4.6/src/recipes/lock/src/c/c-doc.Doxyfile new file mode 100644 index 000000000..c56e86dc5 --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/recipes/lock/src/c/c-doc.Doxyfile @@ -0,0 +1,1252 @@ +# Doxyfile 1.4.7 + +# 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 (" ") + +#--------------------------------------------------------------------------- +# Project related 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 = $(PROJECT)-$(VERSION) + +# 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 = $(DOCDIR) + +# If the CREATE_SUBDIRS tag is set to YES, then doxygen will create +# 4096 sub-directories (in 2 levels) under the output directory of each output +# format and will distribute the generated files over these directories. +# Enabling this option can be useful when feeding doxygen a huge amount of +# source files, where putting all generated files in the same directory would +# otherwise cause performance problems for the file system. + +CREATE_SUBDIRS = NO + +# 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, Korean-en, Norwegian, +# Polish, Portuguese, Romanian, Russian, Serbian, Slovak, Slovene, Spanish, +# Swedish, and Ukrainian. + +OUTPUT_LANGUAGE = English + +# This tag can be used to specify the encoding used in the generated output. +# The encoding is not always determined by the language that is chosen, +# but also whether or not the output is meant for Windows or non-Windows users. +# In case there is a difference, setting the USE_WINDOWS_ENCODING tag to YES +# forces the Windows encoding (this is the default for the Windows binary), +# whereas setting the tag to NO uses a Unix-style encoding (the default for +# all platforms other than Windows). + +USE_WINDOWS_ENCODING = 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 + +# This tag implements a quasi-intelligent brief description abbreviator +# that is used to form the text in various listings. Each string +# in this list, if found as the leading text of the brief description, will be +# stripped from the text and the result after processing the whole list, is +# used as the annotated text. Otherwise, the brief description is used as-is. +# If left blank, the following values are used ("$name" is automatically +# replaced with the name of the entity): "The $name class" "The $name widget" +# "The $name file" "is" "provides" "specifies" "contains" +# "represents" "a" "an" "the" + +ABBREVIATE_BRIEF = + +# 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 = YES + +# 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. The tag can be used to show relative paths in the file list. +# If left blank the directory from which doxygen is run is used as the +# path to strip. + +STRIP_FROM_PATH = + +# The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of +# the path mentioned in the documentation of a class, which tells +# the reader which header file to include in order to use a class. +# If left blank only the name of the header file containing the class +# definition is used. Otherwise one should specify the include paths that +# are normally passed to the compiler using the -I flag. + +STRIP_FROM_INC_PATH = + +# 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 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 +# explicit @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 +# re-implements. + +INHERIT_DOCS = YES + +# If the SEPARATE_MEMBER_PAGES tag is set to YES, then doxygen will produce +# a new page for each member. If set to NO, the documentation of a member will +# be part of the file/class/namespace that contains it. + +SEPARATE_MEMBER_PAGES = 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 + +# 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 = + +# 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 + +# If you use STL classes (i.e. std::string, std::vector, etc.) but do not want to +# include (a tag file for) the STL sources as input, then you should +# set this tag to YES in order to let doxygen match functions declarations and +# definitions whose arguments contain STL classes (e.g. func(std::string); v.s. +# func(std::string) {}). This also make the inheritance and collaboration +# diagrams that involve STL classes more complete and accurate. + +BUILTIN_STL_SUPPORT = NO + +# 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 + +# Set the SUBGROUPING tag to YES (the default) to allow class member groups of +# the same type (for instance a group of public functions) to be put as a +# subgroup of that type (e.g. under the Public Functions section). Set it to +# NO to prevent subgrouping. Alternatively, this can be done per class using +# the \nosubgrouping command. + +SUBGROUPING = YES + +#--------------------------------------------------------------------------- +# Build related configuration options +#--------------------------------------------------------------------------- + +# 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 = NO + +# 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 = YES + +# 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 = YES + +# This flag is only useful for Objective-C code. When set to YES local +# methods, which are defined in the implementation section but not in +# the interface are included in the documentation. +# If set to NO (the default) only methods in the interface are included. + +EXTRACT_LOCAL_METHODS = 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 classes 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 HIDE_IN_BODY_DOCS tag is set to YES, Doxygen will hide any +# documentation blocks found inside the body of a function. +# If set to NO (the default) these blocks will be appended to the +# function's detailed documentation block. + +HIDE_IN_BODY_DOCS = NO + +# 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 + +# 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 +# and Mac users are advised to set this option to NO. + +CASE_SENSE_NAMES = YES + +# 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 SHOW_INCLUDE_FILES tag is set to YES (the default) then Doxygen +# will put a list of the files that are included by a file in the documentation +# of that file. + +SHOW_INCLUDE_FILES = NO + +# 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 the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the +# brief documentation of file, namespace and class members alphabetically +# by member name. If set to NO (the default) the members will appear in +# declaration order. + +SORT_BRIEF_DOCS = NO + +# If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be +# sorted by fully-qualified names, including namespaces. If set to +# NO (the default), the class list will be sorted only by class name, +# not including the namespace part. +# Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES. +# Note: This option applies only to the class list, not to the +# alphabetical list. + +SORT_BY_SCOPE_NAME = NO + +# 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 + +# 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 consists 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 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 = YES + +# If the sources in your project are distributed over multiple directories +# then setting the SHOW_DIRECTORIES tag to YES will show the directory hierarchy +# in the documentation. The default is NO. + +SHOW_DIRECTORIES = NO + +# The FILE_VERSION_FILTER tag can be used to specify a program or script that +# doxygen should invoke to get the current version for each file (typically from the +# version control system). Doxygen will invoke the program by executing (via +# popen()) the command , where is the value of +# the FILE_VERSION_FILTER tag, and is the name of an input file +# provided by doxygen. Whatever the program writes to standard output +# is used as the file version. See the manual for examples. + +FILE_VERSION_FILTER = + +#--------------------------------------------------------------------------- +# 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 + +# If WARN_IF_DOC_ERROR is set to YES, doxygen will generate warnings for +# potential errors in the documentation, such as not documenting some +# parameters in a documented function, or documenting parameters that +# don't exist or using markup commands wrongly. + +WARN_IF_DOC_ERROR = YES + +# This WARN_NO_PARAMDOC option can be abled to get warnings for +# functions that are documented, but have no documentation for their parameters +# or return value. If set to NO (the default) doxygen will only warn about +# wrong or incomplete parameter documentation, but not about the absence of +# documentation. + +WARN_NO_PARAMDOC = NO + +# 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. Optionally the format may contain +# $version, which will be replaced by the version of the file (if it could +# be obtained via FILE_VERSION_FILTER) + +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 = include/zoo_lock.h + +# 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 *.cs *.php *.php3 *.inc *.m *.mm *.py + +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. Note that the wildcards are matched +# against the file with absolute path, so to exclude all test directories +# for example use the pattern */test/* + +EXCLUDE_PATTERNS = + +# The EXAMPLE_PATH tag can be used to specify one or more files or +# directories that contain example code fragments that are included (see +# the \include command). + +EXAMPLE_PATH = + +# If the value of the EXAMPLE_PATH tag contains directories, you can use the +# EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp +# and *.h) to filter out the source-files in the directories. If left +# blank all files are included. + +EXAMPLE_PATTERNS = + +# If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be +# searched for input files to be used with the \include or \dontinclude +# commands irrespective of the value of the RECURSIVE tag. +# Possible values are YES and NO. If left blank NO is used. + +EXAMPLE_RECURSIVE = NO + +# The IMAGE_PATH tag can be used to specify one or more files or +# directories that contain image that are included in the documentation (see +# the \image command). + +IMAGE_PATH = + +# The INPUT_FILTER tag can be used to specify a program that doxygen should +# invoke to filter for each input file. Doxygen will invoke the filter program +# by executing (via popen()) the command , where +# is the value of the INPUT_FILTER tag, and is the name of an +# input file. Doxygen will then use the output that the filter program writes +# to standard output. If FILTER_PATTERNS is specified, this tag will be +# ignored. + +INPUT_FILTER = + +# The FILTER_PATTERNS tag can be used to specify filters on a per file pattern +# basis. Doxygen will compare the file name with each pattern and apply the +# filter if there is a match. The filters are a list of the form: +# pattern=filter (like *.cpp=my_cpp_filter). See INPUT_FILTER for further +# info on how filters are used. If FILTER_PATTERNS is empty, INPUT_FILTER +# is applied to all files. + +FILTER_PATTERNS = + +# 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. +# Note: To get rid of all source code in the generated output, make sure also +# VERBATIM_HEADERS is set to NO. + +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 + +# 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 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 = YES + +# 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 = YES + +# If the REFERENCES_LINK_SOURCE tag is set to YES (the default) +# and SOURCE_BROWSER tag is set to YES, then the hyperlinks from +# functions in REFERENCES_RELATION and REFERENCED_BY_RELATION lists will +# link to the source code. Otherwise they will link to the documentstion. + +REFERENCES_LINK_SOURCE = YES + +# If the USE_HTAGS tag is set to YES then the references to source code +# will point to the HTML generated by the htags(1) tool instead of doxygen +# built-in source browser. The htags tool is part of GNU's global source +# tagging system (see http://www.gnu.org/software/global/global.html). You +# will need version 4.8.6 or higher. + +USE_HTAGS = 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 + +#--------------------------------------------------------------------------- +# 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 = NO + +# 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 = $(GENERATE_HTML) + +# 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 = html + +# 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. Note that doxygen will try to copy +# the style sheet file to the HTML output directory, so don't put your own +# stylesheet in the HTML output directory as well, or it will be erased! + +HTML_STYLESHEET = + +# 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 = $(GENERATE_HTMLHELP) + +# 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 directory. + +CHM_FILE = ../$(PROJECT).chm + +# 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 = $(HHC_PATH) + +# 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 = $(GENERATE_CHI) + +# 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 = NO + +# 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, DHTML, CSS and frames is required (for instance Mozilla 1.0+, +# Netscape 6.0+, Internet explorer 5.0+, or Konqueror). 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 = $(GENERATE_LATEX) + +# 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 = $(PAPER_SIZE) + +# 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 = $(GENERATE_PDF) + +# 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 + +# If LATEX_HIDE_INDICES is set to YES then doxygen will not +# include the index chapters (such as File Index, Compound Index, etc.) +# in the output. + +LATEX_HIDE_INDICES = 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 optimized for Word 97 and may not look very pretty with +# other RTF readers or editors. + +GENERATE_RTF = $(GENERATE_RTF) + +# 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 assignments. 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 = $(GENERATE_MAN) + +# 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. + +GENERATE_XML = $(GENERATE_XML) + +# The XML_OUTPUT tag is used to specify where the XML 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 `xml' will be used as the default path. + +XML_OUTPUT = xml + +# 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 = + +# If the XML_PROGRAMLISTING tag is set to YES Doxygen will +# dump the program listings (including syntax highlighting +# and cross-referencing information) to the XML output. Note that +# enabling this will significantly increase the size of the XML output. + +XML_PROGRAMLISTING = YES + +#--------------------------------------------------------------------------- +# 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 Perl module output +#--------------------------------------------------------------------------- + +# If the GENERATE_PERLMOD tag is set to YES Doxygen will +# generate a Perl module file that captures the structure of +# the code including all documentation. Note that this +# feature is still experimental and incomplete at the +# moment. + +GENERATE_PERLMOD = NO + +# If the PERLMOD_LATEX tag is set to YES Doxygen will generate +# the necessary Makefile rules, Perl scripts and LaTeX code to be able +# to generate PDF and DVI output from the Perl module output. + +PERLMOD_LATEX = NO + +# If the PERLMOD_PRETTY tag is set to YES the Perl module output will be +# nicely formatted so it can be parsed by a human reader. This is useful +# if you want to understand what is going on. On the other hand, if this +# tag is set to NO the size of the Perl module output will be much smaller +# and Perl will parse it just the same. + +PERLMOD_PRETTY = YES + +# The names of the make variables in the generated doxyrules.make file +# are prefixed with the string contained in PERLMOD_MAKEVAR_PREFIX. +# This is useful so different doxyrules.make files included by the same +# Makefile don't overwrite each other's variables. + +PERLMOD_MAKEVAR_PREFIX = + +#--------------------------------------------------------------------------- +# 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 = YES + +# 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_DEFINED 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. To prevent a macro definition from being +# undefined via #undef or recursively expanded use the := operator +# instead of the = operator. + +PREDEFINED = + +# If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF 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::additions related to external references +#--------------------------------------------------------------------------- + +# The TAGFILES option can be used to specify one or more tagfiles. +# Optionally an initial location of the external documentation +# can be added for each tagfile. The format of a tag file without +# this location is as follows: +# TAGFILES = file1 file2 ... +# Adding location for the tag files is done as follows: +# TAGFILES = file1=loc1 "file2 = loc2" ... +# where "loc1" and "loc2" can be relative or absolute paths or +# URLs. If a location is present for each tag, the installdox tool +# does not have to be run to correct the links. +# Note that each tag file must have a unique name +# (where the name does NOT include the path) +# If a tag file is not located in the directory in which doxygen +# is run, you must also specify the path to the tagfile here. + +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 = $(DOCDIR)/$(PROJECT).tag + +# 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 superseded by the HAVE_DOT option below. This is only a +# fallback. It is recommended to install and use dot, since it yields 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 = $(HAVE_DOT) + +# 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 the GROUP_GRAPHS and HAVE_DOT tags are set to YES then doxygen +# will generate a graph for groups, showing the direct groups dependencies + +GROUP_GRAPHS = YES + +# If the UML_LOOK tag is set to YES doxygen will generate inheritance and +# collaboration diagrams in a style similar to the OMG's Unified Modeling +# Language. + +UML_LOOK = NO + +# If set to YES, the inheritance and collaboration graphs will show the +# relations between templates and their instances. + +TEMPLATE_RELATIONS = NO + +# 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 CALL_GRAPH and HAVE_DOT tags are set to YES then doxygen will +# generate a call dependency graph for every global function or class method. +# Note that enabling this option will significantly increase the time of a run. +# So in most cases it will be better to enable call graphs for selected +# functions only using the \callgraph command. + +CALL_GRAPH = NO + +# If the CALLER_GRAPH and HAVE_DOT tags are set to YES then doxygen will +# generate a caller dependency graph for every global function or class method. +# Note that enabling this option will significantly increase the time of a run. +# So in most cases it will be better to enable caller graphs for selected +# functions only using the \callergraph command. + +CALLER_GRAPH = NO + +# 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 + +# If the DIRECTORY_GRAPH, SHOW_DIRECTORIES and HAVE_DOT tags are set to YES +# then doxygen will show the dependencies a directory has on other directories +# in a graphical way. The dependency relations are determined by the #include +# relations between the files in the directories. + +DIRECTORY_GRAPH = 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 in the path. + +DOT_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 + +# The MAX_DOT_GRAPH_DEPTH tag can be used to set the maximum depth of the +# graphs generated by dot. A depth value of 3 means that only nodes reachable +# from the root by following a path via at most 3 edges will be shown. Nodes +# that lay further from the root node will be omitted. Note that setting this +# option to 1 or 2 may greatly reduce the computation time needed for large +# code bases. Also note that a graph may be further truncated if the graph's +# image dimensions are not sufficient to fit the graph (see MAX_DOT_GRAPH_WIDTH +# and MAX_DOT_GRAPH_HEIGHT). If 0 is used for the depth value (the default), +# the graph is not depth-constrained. + +MAX_DOT_GRAPH_DEPTH = 0 + +# Set the DOT_TRANSPARENT tag to YES to generate images with a transparent +# background. This is disabled by default, which results in a white background. +# Warning: Depending on the platform used, enabling this option may lead to +# badly anti-aliased labels on the edges of a graph (i.e. they become hard to +# read). + +DOT_TRANSPARENT = NO + +# Set the DOT_MULTI_TARGETS tag to YES allow dot to generate multiple output +# files in one run (i.e. multiple -o and -T options on the command line). This +# makes dot run faster, but since only newer versions of dot (>1.8.10) +# support this, this feature is disabled by default. + +DOT_MULTI_TARGETS = NO + +# 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 intermediate dot files that are used to generate +# the various graphs. + +DOT_CLEANUP = YES + +#--------------------------------------------------------------------------- +# Configuration::additions 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 diff --git a/pkg/registry/zookeeper-3.4.6/src/recipes/lock/src/c/configure.ac b/pkg/registry/zookeeper-3.4.6/src/recipes/lock/src/c/configure.ac new file mode 100644 index 000000000..3954123ee --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/recipes/lock/src/c/configure.ac @@ -0,0 +1,82 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you 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. +# -*- Autoconf -*- +# Process this file with autoconf to produce a configure script. + +AC_PREREQ(2.59) + +AC_INIT([zoolock], [3.2.0]) + +AC_CONFIG_SRCDIR([include/zoo_lock.h]) + +PACKAGE=zoolock +VERSION=1.0 + +AC_SUBST(PACKAGE) +AC_SUBST(VERSION) + +BUILD_PATH="`pwd`" + +# Checks for programs. +AC_LANG_CPLUSPLUS + +AM_INIT_AUTOMAKE([-Wall foreign]) +# Checks for libraries. + +#initialize Doxygen support +DX_HTML_FEATURE(ON) +DX_CHM_FEATURE(OFF) +DX_CHI_FEATURE(OFF) +DX_MAN_FEATURE(OFF) +DX_RTF_FEATURE(OFF) +DX_XML_FEATURE(OFF) +DX_PDF_FEATURE(OFF) +DX_PS_FEATURE(OFF) +DX_INIT_DOXYGEN([zookeeper-locks],[c-doc.Doxyfile],[docs]) + + +ZOOKEEPER_PATH=${BUILD_PATH}/../../../../../src/c +ZOOKEEPER_LD=-L${BUILD_PATH}/../../../../../src/c\ -lzookeeper_mt + +AC_SUBST(ZOOKEEPER_PATH) +AC_SUBST(ZOOKEEPER_LD) + +# Checks for header files. +AC_HEADER_DIRENT +AC_HEADER_STDC +AC_CHECK_HEADERS([fcntl.h stdlib.h string.h sys/time.h unistd.h]) + +# Checks for typedefs, structures, and compiler characteristics. +AC_HEADER_STDBOOL +AC_C_CONST +AC_TYPE_UID_T +AC_C_INLINE +AC_TYPE_OFF_T +AC_TYPE_SIZE_T +AC_STRUCT_ST_BLOCKS +AC_HEADER_TIME +AC_C_VOLATILE +AC_PROG_CC +AC_PROG_LIBTOOL +#check for cppunit +AM_PATH_CPPUNIT(1.10.2) +# Checks for library functions. +AC_FUNC_UTIME_NULL +AC_CHECK_FUNCS([gettimeofday memset mkdir rmdir strdup strerror strstr strtol strtoul strtoull utime]) + +AC_CONFIG_FILES([Makefile]) +AC_OUTPUT +AC_C_VOLATILE diff --git a/pkg/registry/zookeeper-3.4.6/src/recipes/lock/src/c/include/zoo_lock.h b/pkg/registry/zookeeper-3.4.6/src/recipes/lock/src/c/include/zoo_lock.h new file mode 100644 index 000000000..5c06bbf2f --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/recipes/lock/src/c/include/zoo_lock.h @@ -0,0 +1,168 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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. + */ +#ifndef ZOOKEEPER_LOCK_H_ +#define ZOOKEEPER_LOCK_H_ + +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif +/** + * \brief the call back function called on status change of lock + * + * the call back funtion is called with a rc of 0 if lock is acquired and + * with an rc of 1 if the lock is released + * \param rc the value to let us know if its locked or unlocked + * \param cbdata the callback data that we passed when initializing + * the zookeeper lock. + */ + +typedef void (* zkr_lock_completion) (int rc, void* cbdata); + +/** + * \file zoo_lock.h + * \brief zookeeper recipe for locking and leader election. + * this api implements a writelock on a given path in zookeeper. + * this api can also be used for leader election. + */ + +struct zkr_lock_mutex { + zhandle_t *zh; + char *path; + struct ACL_vector *acl; + char *id; + void *cbdata; + zkr_lock_completion completion; + pthread_mutex_t pmutex; + int isOwner; + char* ownerid; +}; + +typedef struct zkr_lock_mutex zkr_lock_mutex_t; + + +/** + * \brief initializing a zookeeper lock. + * + * this method instantiates the zookeeper mutex lock. + * \param mutex the mutex to initialize + * \param zh the zookeeper handle to use + * \param path the path in zookeeper to use for locking + * \param acl the acls to use in zookeeper. + * \return return 0 if successful. + */ +ZOOAPI int zkr_lock_init(zkr_lock_mutex_t *mutex, zhandle_t* zh, + char* path, struct ACL_vector *acl); + +/** + * \brief initializing a zookeeper lock. + * + * + * this method instantiates the zookeeper mutex lock with + * a completion function. + * + * \param mutex the mutex to initialize + * \param zh the zookeeper handle to use + * \param path the path in zookeeper to use for locking + * \param acl the acls to use in zookeeper. + * \param completion the callback thats called when lock + * is acquired and released. + * \param cbdata the callback method is called with data + * \return return 0 if successful. + */ +ZOOAPI int zkr_lock_init_cb(zkr_lock_mutex_t *mutex, zhandle_t* zh, + char* path, struct ACL_vector *acl, + zkr_lock_completion completion, void* cbdata); + +/** + * \brief lock the zookeeper mutex + * + * this method tries locking the mutex + * \param mutex the zookeeper mutex + * \return return 0 if there is no error. check + * with zkr_lock_isowner() if you have the lock + */ +ZOOAPI int zkr_lock_lock(zkr_lock_mutex_t *mutex); + +/** + * \brief unlock the zookeeper mutex + * + * this method unlocks the zookeeper mutex + * \param mutex the zookeeper mutex + * \return return 0 if there is not error in executing unlock. + * else returns non zero + */ +ZOOAPI int zkr_lock_unlock(zkr_lock_mutex_t *mutex); + +/** + * \brief set the callback function for zookeeper mutex + * + * this method sets the callback for zookeeper mutex + * \param mutex the zookeeper mutex + * \param callback the call back completion function + */ +ZOOAPI void zkr_lock_setcallback(zkr_lock_mutex_t *mutex, + zkr_lock_completion completion); + +/** + * \brief get the callback function for zookeeper mutex + * + * this method gets the callback funtion for zookeeper mutex + * \param mutex the zookeeper mutex + * \return the lock completion function + */ +ZOOAPI zkr_lock_completion zkr_lock_getcallback(zkr_lock_mutex_t *mutex); + +/** + * \brief destroy the mutex + * this method free the mutex + * \param mutex destroy the zookepeer lock. + * \return return 0 if destroyed. + */ +ZOOAPI int zkr_lock_destroy(zkr_lock_mutex_t* mutex); + +/** + * \brief return the parent path this mutex is using + * this method returns the parent path + * \param mutex the mutex + * \return return the parent path + */ +ZOOAPI char* zkr_lock_getpath(zkr_lock_mutex_t *mutex); + +/** + * \brief return if this mutex is owner of the lock + * this method returns if its owner or not + * \param mutex the mutex + * \return return true if is owner and false if not + */ +ZOOAPI int zkr_lock_isowner(zkr_lock_mutex_t *mutex); + +/** + * \brief return the id for this mutex + * this mutex retunrns the id string + * \param mutex the mutex + * \return the id for this mutex + */ +ZOOAPI char* zkr_lock_getid(zkr_lock_mutex_t *mutex); + +#ifdef __cplusplus +} +#endif +#endif //ZOOKEEPER_LOCK_H_ diff --git a/pkg/registry/zookeeper-3.4.6/src/recipes/lock/src/c/src/zoo_lock.c b/pkg/registry/zookeeper-3.4.6/src/recipes/lock/src/c/src/zoo_lock.c new file mode 100644 index 000000000..8a6d81763 --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/recipes/lock/src/c/src/zoo_lock.c @@ -0,0 +1,396 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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. + */ + +#ifdef DLL_EXPORT +#define USE_STATIC_LIB +#endif + +#if defined(__CYGWIN__) +#define USE_IPV6 +#endif + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#ifdef HAVE_SYS_UTSNAME_H +#include +#endif + +#ifdef HAVE_GETPWUID_R +#include +#endif + +#define IF_DEBUG(x) if (logLevel==ZOO_LOG_LEVEL_DEBUG) {x;} + + +ZOOAPI int zkr_lock_init(zkr_lock_mutex_t* mutex, zhandle_t* zh, + char* path, struct ACL_vector *acl) { + mutex->zh = zh; + mutex->path = path; + mutex->acl = acl; + mutex->completion = NULL; + mutex->cbdata = NULL; + mutex->id = NULL; + mutex->ownerid = NULL; + mutex->isOwner = 0; + pthread_mutex_init(&(mutex->pmutex), NULL); + return 0; +} + +ZOOAPI int zkr_lock_init_cb(zkr_lock_mutex_t *mutex, zhandle_t* zh, + char *path, struct ACL_vector *acl, + zkr_lock_completion completion, void* cbdata) { + mutex->zh = zh; + mutex->path = path; + mutex->acl = acl; + mutex->completion = completion; + mutex->cbdata = cbdata; + mutex->isOwner = 0; + mutex->ownerid = NULL; + mutex->id = NULL; + pthread_mutex_init(&(mutex->pmutex), NULL); + return 0; +} + +/** + * unlock the mutex + */ +ZOOAPI int zkr_lock_unlock(zkr_lock_mutex_t *mutex) { + pthread_mutex_lock(&(mutex->pmutex)); + zhandle_t *zh = mutex->zh; + if (mutex->id != NULL) { + int len = strlen(mutex->path) + strlen(mutex->id) + 2; + char buf[len]; + sprintf(buf, "%s/%s", mutex->path, mutex->id); + int ret = 0; + int count = 0; + struct timespec ts; + ts.tv_sec = 0; + ts.tv_nsec = (.5)*1000000; + ret = ZCONNECTIONLOSS; + while (ret == ZCONNECTIONLOSS && (count < 3)) { + ret = zoo_delete(zh, buf, -1); + if (ret == ZCONNECTIONLOSS) { + LOG_DEBUG(("connectionloss while deleting the node")); + nanosleep(&ts, 0); + count++; + } + } + if (ret == ZOK || ret == ZNONODE) { + zkr_lock_completion completion = mutex->completion; + if (completion != NULL) { + completion(1, mutex->cbdata); + } + + free(mutex->id); + mutex->id = NULL; + pthread_mutex_unlock(&(mutex->pmutex)); + return 0; + } + LOG_WARN(("not able to connect to server - giving up")); + pthread_mutex_unlock(&(mutex->pmutex)); + return ZCONNECTIONLOSS; + } + pthread_mutex_unlock(&(mutex->pmutex)); + return ZSYSTEMERROR; +} + +static void free_String_vector(struct String_vector *v) { + if (v->data) { + int32_t i; + for (i=0; icount; i++) { + free(v->data[i]); + } + free(v->data); + v->data = 0; + } +} + +static int vstrcmp(const void* str1, const void* str2) { + const char **a = (const char**)str1; + const char **b = (const char**) str2; + return strcmp(strrchr(*a, '-')+1, strrchr(*b, '-')+1); +} + +static void sort_children(struct String_vector *vector) { + qsort( vector->data, vector->count, sizeof(char*), &vstrcmp); +} + +static char* child_floor(char **sorted_data, int len, char *element) { + char* ret = NULL; + int i =0; + for (i=0; i < len; i++) { + if (strcmp(sorted_data[i], element) < 0) { + ret = sorted_data[i]; + } + } + return ret; +} + +static void lock_watcher_fn(zhandle_t* zh, int type, int state, + const char* path, void *watcherCtx) { + //callback that we registered + //should be called + zkr_lock_lock((zkr_lock_mutex_t*) watcherCtx); +} + +/** + * get the last name of the path + */ +static char* getName(char* str) { + char* name = strrchr(str, '/'); + if (name == NULL) + return NULL; + return strdup(name + 1); +} + +/** + * just a method to retry get children + */ +static int retry_getchildren(zhandle_t *zh, char* path, struct String_vector *vector, + struct timespec *ts, int retry) { + int ret = ZCONNECTIONLOSS; + int count = 0; + while (ret == ZCONNECTIONLOSS && count < retry) { + ret = zoo_get_children(zh, path, 0, vector); + if (ret == ZCONNECTIONLOSS) { + LOG_DEBUG(("connection loss to the server")); + nanosleep(ts, 0); + count++; + } + } + return ret; +} + +/** see if our node already exists + * if it does then we dup the name and + * return it + */ +static char* lookupnode(struct String_vector *vector, char *prefix) { + char *ret = NULL; + if (vector->data) { + int i = 0; + for (i = 0; i < vector->count; i++) { + char* child = vector->data[i]; + if (strncmp(prefix, child, strlen(prefix)) == 0) { + ret = strdup(child); + break; + } + } + } + return ret; +} + +/** retry zoo_wexists + */ +static int retry_zoowexists(zhandle_t *zh, char* path, watcher_fn watcher, void* ctx, + struct Stat *stat, struct timespec *ts, int retry) { + int ret = ZCONNECTIONLOSS; + int count = 0; + while (ret == ZCONNECTIONLOSS && count < retry) { + ret = zoo_wexists(zh, path, watcher, ctx, stat); + if (ret == ZCONNECTIONLOSS) { + LOG_DEBUG(("connectionloss while setting watch on my predecessor")); + nanosleep(ts, 0); + count++; + } + } + return ret; +} + +/** + * the main code that does the zookeeper leader + * election. this code creates its own ephemeral + * node on the given path and sees if its the first + * one on the list and claims to be a leader if and only + * if its the first one of children in the paretn path + */ +static int zkr_lock_operation(zkr_lock_mutex_t *mutex, struct timespec *ts) { + zhandle_t *zh = mutex->zh; + char *path = mutex->path; + char *id = mutex->id; + struct Stat stat; + char* owner_id = NULL; + int retry = 3; + do { + const clientid_t *cid = zoo_client_id(zh); + // get the session id + int64_t session = cid->client_id; + char prefix[30]; + int ret = 0; +#if defined(__x86_64__) + snprintf(prefix, 30, "x-%016lx-", session); +#else + snprintf(prefix, 30, "x-%016llx-", session); +#endif + struct String_vector vectorst; + vectorst.data = NULL; + vectorst.count = 0; + ret = ZCONNECTIONLOSS; + ret = retry_getchildren(zh, path, &vectorst, ts, retry); + if (ret != ZOK) + return ret; + struct String_vector *vector = &vectorst; + mutex->id = lookupnode(vector, prefix); + free_String_vector(vector); + if (mutex->id == NULL) { + int len = strlen(path) + strlen(prefix) + 2; + char buf[len]; + char retbuf[len+20]; + snprintf(buf, len, "%s/%s", path, prefix); + ret = ZCONNECTIONLOSS; + ret = zoo_create(zh, buf, NULL, 0, mutex->acl, + ZOO_EPHEMERAL|ZOO_SEQUENCE, retbuf, (len+20)); + + // do not want to retry the create since + // we would end up creating more than one child + if (ret != ZOK) { + LOG_WARN(("could not create zoo node %s", buf)); + return ret; + } + mutex->id = getName(retbuf); + } + + if (mutex->id != NULL) { + ret = ZCONNECTIONLOSS; + ret = retry_getchildren(zh, path, vector, ts, retry); + if (ret != ZOK) { + LOG_WARN(("could not connect to server")); + return ret; + } + //sort this list + sort_children(vector); + owner_id = vector->data[0]; + mutex->ownerid = strdup(owner_id); + id = mutex->id; + char* lessthanme = child_floor(vector->data, vector->count, id); + if (lessthanme != NULL) { + int flen = strlen(mutex->path) + strlen(lessthanme) + 2; + char last_child[flen]; + sprintf(last_child, "%s/%s",mutex->path, lessthanme); + ret = ZCONNECTIONLOSS; + ret = retry_zoowexists(zh, last_child, &lock_watcher_fn, mutex, + &stat, ts, retry); + // cannot watch my predecessor i am giving up + // we need to be able to watch the predecessor + // since if we do not become a leader the others + // will keep waiting + if (ret != ZOK) { + free_String_vector(vector); + LOG_WARN(("unable to watch my predecessor")); + ret = zkr_lock_unlock(mutex); + while (ret == 0) { + //we have to give up our leadership + // since we cannot watch out predecessor + ret = zkr_lock_unlock(mutex); + } + return ret; + } + // we are not the owner of the lock + mutex->isOwner = 0; + } + else { + // this is the case when we are the owner + // of the lock + if (strcmp(mutex->id, owner_id) == 0) { + LOG_DEBUG(("got the zoo lock owner - %s", mutex->id)); + mutex->isOwner = 1; + if (mutex->completion != NULL) { + mutex->completion(0, mutex->cbdata); + } + return ZOK; + } + } + free_String_vector(vector); + return ZOK; + } + } while (mutex->id == NULL); + return ZOK; +} + +ZOOAPI int zkr_lock_lock(zkr_lock_mutex_t *mutex) { + pthread_mutex_lock(&(mutex->pmutex)); + zhandle_t *zh = mutex->zh; + char *path = mutex->path; + struct Stat stat; + int exists = zoo_exists(zh, path, 0, &stat); + int count = 0; + struct timespec ts; + ts.tv_sec = 0; + ts.tv_nsec = (.5)*1000000; + // retry to see if the path exists and + // and create if the path does not exist + while ((exists == ZCONNECTIONLOSS || exists == ZNONODE) && (count <4)) { + count++; + // retry the operation + if (exists == ZCONNECTIONLOSS) + exists = zoo_exists(zh, path, 0, &stat); + else if (exists == ZNONODE) + exists = zoo_create(zh, path, NULL, 0, mutex->acl, 0, NULL, 0); + nanosleep(&ts, 0); + + } + + // need to check if we cannot still access the server + int check_retry = ZCONNECTIONLOSS; + count = 0; + while (check_retry != ZOK && count <4) { + check_retry = zkr_lock_operation(mutex, &ts); + if (check_retry != ZOK) { + nanosleep(&ts, 0); + count++; + } + } + pthread_mutex_unlock(&(mutex->pmutex)); + return zkr_lock_isowner(mutex); +} + + +ZOOAPI char* zkr_lock_getpath(zkr_lock_mutex_t *mutex) { + return mutex->path; +} + +ZOOAPI int zkr_lock_isowner(zkr_lock_mutex_t *mutex) { + return (mutex->id != NULL && mutex->ownerid != NULL + && (strcmp(mutex->id, mutex->ownerid) == 0)); +} + +ZOOAPI char* zkr_lock_getid(zkr_lock_mutex_t *mutex) { + return mutex->ownerid; +} + +ZOOAPI int zkr_lock_destroy(zkr_lock_mutex_t* mutex) { + if (mutex->id) + free(mutex->id); + mutex->path = NULL; + mutex->acl = NULL; + mutex->completion = NULL; + pthread_mutex_destroy(&(mutex->pmutex)); + mutex->isOwner = 0; + if (mutex->ownerid) + free(mutex->ownerid); + return 0; +} + diff --git a/pkg/registry/zookeeper-3.4.6/src/recipes/lock/src/c/tests/TestClient.cc b/pkg/registry/zookeeper-3.4.6/src/recipes/lock/src/c/tests/TestClient.cc new file mode 100644 index 000000000..2cc56cf34 --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/recipes/lock/src/c/tests/TestClient.cc @@ -0,0 +1,201 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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. + */ + +#include + +#include +#include +#include + + +using namespace std; + +#include +#include + +#include +#include + +static void yield(zhandle_t *zh, int i) +{ + sleep(i); +} + +typedef struct evt { + string path; + int type; +} evt_t; + +typedef struct watchCtx { +private: + list events; +public: + bool connected; + zhandle_t *zh; + + watchCtx() { + connected = false; + zh = 0; + } + ~watchCtx() { + if (zh) { + zookeeper_close(zh); + zh = 0; + } + } + + evt_t getEvent() { + evt_t evt; + evt = events.front(); + events.pop_front(); + return evt; + } + + int countEvents() { + int count; + count = events.size(); + return count; + } + + void putEvent(evt_t evt) { + events.push_back(evt); + } + + bool waitForConnected(zhandle_t *zh) { + time_t expires = time(0) + 10; + while(!connected && time(0) < expires) { + yield(zh, 1); + } + return connected; + } + bool waitForDisconnected(zhandle_t *zh) { + time_t expires = time(0) + 15; + while(connected && time(0) < expires) { + yield(zh, 1); + } + return !connected; + } +} watchctx_t; + +class Zookeeper_locktest : public CPPUNIT_NS::TestFixture +{ + CPPUNIT_TEST_SUITE(Zookeeper_locktest); + CPPUNIT_TEST(testlock); + CPPUNIT_TEST_SUITE_END(); + + static void watcher(zhandle_t *, int type, int state, const char *path,void*v){ + watchctx_t *ctx = (watchctx_t*)v; + + if (state == ZOO_CONNECTED_STATE) { + ctx->connected = true; + } else { + ctx->connected = false; + } + if (type != ZOO_SESSION_EVENT) { + evt_t evt; + evt.path = path; + evt.type = type; + ctx->putEvent(evt); + } + } + + static const char hostPorts[]; + + const char *getHostPorts() { + return hostPorts; + } + + zhandle_t *createClient(watchctx_t *ctx) { + zhandle_t *zk = zookeeper_init(hostPorts, watcher, 10000, 0, + ctx, 0); + ctx->zh = zk; + sleep(1); + return zk; + } + +public: + +#define ZKSERVER_CMD "./tests/zkServer.sh" + + void setUp() + { + char cmd[1024]; + sprintf(cmd, "%s startClean %s", ZKSERVER_CMD, getHostPorts()); + CPPUNIT_ASSERT(system(cmd) == 0); + } + + + void startServer() { + char cmd[1024]; + sprintf(cmd, "%s start %s", ZKSERVER_CMD, getHostPorts()); + CPPUNIT_ASSERT(system(cmd) == 0); + } + + void stopServer() { + tearDown(); + } + + void tearDown() + { + char cmd[1024]; + sprintf(cmd, "%s stop %s", ZKSERVER_CMD, getHostPorts()); + CPPUNIT_ASSERT(system(cmd) == 0); + } + + + void testlock() + { + watchctx_t ctx; + int rc; + struct Stat stat; + char buf[1024]; + int blen; + struct String_vector strings; + const char *testName; + zkr_lock_mutex_t mutexes[3]; + int count = 3; + int i = 0; + char* path = "/test-lock"; + for (i=0; i< 3; i++) { + zhandle_t *zh = createClient(&ctx); + zkr_lock_init(&mutexes[i], zh, path, &ZOO_OPEN_ACL_UNSAFE); + zkr_lock_lock(&mutexes[i]); + } + sleep(30); + zkr_lock_mutex leader = mutexes[0]; + zkr_lock_mutex mutex; + int ret = strcmp(leader.id, leader.ownerid); + CPPUNIT_ASSERT(ret == 0); + for(i=1; i < count; i++) { + mutex = mutexes[i]; + CPPUNIT_ASSERT(strcmp(mutex.id, mutex.ownerid) != 0); + } + zkr_lock_unlock(&leader); + sleep(30); + zkr_lock_mutex secondleader = mutexes[1]; + CPPUNIT_ASSERT(strcmp(secondleader.id , secondleader.ownerid) == 0); + for (i=2; i +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "Util.h" + +using namespace std; + +CPPUNIT_NS_BEGIN + +class EclipseOutputter: public CompilerOutputter +{ +public: + EclipseOutputter(TestResultCollector *result,ostream &stream): + CompilerOutputter(result,stream,"%p:%l: "),stream_(stream) + { + } + virtual void printFailedTestName( TestFailure *failure ){} + virtual void printFailureMessage( TestFailure *failure ) + { + stream_<<": "; + Message msg = failure->thrownException()->message(); + stream_<< msg.shortDescription(); + + string text; + for(int i=0; i the output must be in the compiler error format. + //bool selfTest = (argc > 1) && (std::string("-ide") == argv[1]); + globalTestConfig.addConfigFromCmdLine(argc,argv); + + // Create the event manager and test controller + CPPUNIT_NS::TestResult controller; + // Add a listener that colllects test result + CPPUNIT_NS::TestResultCollector result; + controller.addListener( &result ); + + // Add a listener that print dots as tests run. + // CPPUNIT_NS::TextTestProgressListener progress; + CPPUNIT_NS::BriefTestProgressListener progress; + controller.addListener( &progress ); + + CPPUNIT_NS::TestRunner runner; + runner.addTest( CPPUNIT_NS::TestFactoryRegistry::getRegistry().makeTest() ); + + try + { + cout << "Running " << globalTestConfig.getTestName(); + runner.run( controller, globalTestConfig.getTestName()); + cout< +#include +#include + +// number of elements in array +#define COUNTOF(array) sizeof(array)/sizeof(array[0]) + +#define DECLARE_WRAPPER(ret,sym,sig) \ + extern "C" ret __real_##sym sig; \ + extern "C" ret __wrap_##sym sig + +#define CALL_REAL(sym,params) \ + __real_##sym params + +// must include "src/zookeeper_log.h" to be able to use this macro +#define TEST_TRACE(x) \ + log_message(3,__LINE__,__func__,format_log_message x) + +extern const std::string EMPTY_STRING; + +// ***************************************************************************** +// A bit of wizardry to get to the bare type from a reference or a pointer +// to the type +template +struct TypeOp { + typedef T BareT; + typedef T ArgT; +}; + +// partial specialization for reference types +template +struct TypeOp{ + typedef T& ArgT; + typedef typename TypeOp::BareT BareT; +}; + +// partial specialization for pointers +template +struct TypeOp{ + typedef T* ArgT; + typedef typename TypeOp::BareT BareT; +}; + +// ***************************************************************************** +// Container utilities + +template +void putValue(std::map& map,const K& k, const V& v){ + typedef std::map Map; + typename Map::const_iterator it=map.find(k); + if(it==map.end()) + map.insert(typename Map::value_type(k,v)); + else + map[k]=v; +} + +template +bool getValue(const std::map& map,const K& k,V& v){ + typedef std::map Map; + typename Map::const_iterator it=map.find(k); + if(it==map.end()) + return false; + v=it->second; + return true; +} + +// ***************************************************************************** +// misc utils + +// millisecond sleep +void millisleep(int ms); +// evaluate given predicate until it returns true or the timeout +// (in millis) has expired +template +int ensureCondition(const Predicate& p,int timeout){ + int elapsed=0; + while(!p() && elapsed CmdLineOptList; +public: + typedef CmdLineOptList::const_iterator const_iterator; + TestConfig(){} + ~TestConfig(){} + void addConfigFromCmdLine(int argc, char* argv[]){ + if(argc>=2) + testName_=argv[1]; + for(int i=2; i /tmp/zk.log & + echo $! > /tmp/zk.pid + sleep 5 + ;; +stop) + # Already killed above + ;; +*) + echo "Unknown command " + $1 + exit 2 +esac + diff --git a/pkg/registry/zookeeper-3.4.6/src/recipes/lock/src/java/org/apache/zookeeper/recipes/lock/LockListener.java b/pkg/registry/zookeeper-3.4.6/src/recipes/lock/src/java/org/apache/zookeeper/recipes/lock/LockListener.java new file mode 100644 index 000000000..1c21ad661 --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/recipes/lock/src/java/org/apache/zookeeper/recipes/lock/LockListener.java @@ -0,0 +1,38 @@ +/** + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + */ +package org.apache.zookeeper.recipes.lock; + +/** + * This class has two methods which are call + * back methods when a lock is acquired and + * when the lock is released. + * + */ +public interface LockListener { + /** + * call back called when the lock + * is acquired + */ + public void lockAcquired(); + + /** + * call back called when the lock is + * released. + */ + public void lockReleased(); +} diff --git a/pkg/registry/zookeeper-3.4.6/src/recipes/lock/src/java/org/apache/zookeeper/recipes/lock/ProtocolSupport.java b/pkg/registry/zookeeper-3.4.6/src/recipes/lock/src/java/org/apache/zookeeper/recipes/lock/ProtocolSupport.java new file mode 100644 index 000000000..4efdb854d --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/recipes/lock/src/java/org/apache/zookeeper/recipes/lock/ProtocolSupport.java @@ -0,0 +1,193 @@ +/** + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + */ +package org.apache.zookeeper.recipes.lock; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.apache.zookeeper.CreateMode; +import org.apache.zookeeper.KeeperException; +import org.apache.zookeeper.ZooDefs; +import org.apache.zookeeper.ZooKeeper; +import org.apache.zookeeper.data.ACL; +import org.apache.zookeeper.data.Stat; +import org.apache.zookeeper.recipes.lock.ZooKeeperOperation; + +import java.util.List; +import java.util.concurrent.atomic.AtomicBoolean; + +/** + * A base class for protocol implementations which provides a number of higher + * level helper methods for working with ZooKeeper along with retrying synchronous + * operations if the connection to ZooKeeper closes such as + * {@link #retryOperation(ZooKeeperOperation)} + * + */ +class ProtocolSupport { + private static final Logger LOG = LoggerFactory.getLogger(ProtocolSupport.class); + + protected final ZooKeeper zookeeper; + private AtomicBoolean closed = new AtomicBoolean(false); + private long retryDelay = 500L; + private int retryCount = 10; + private List acl = ZooDefs.Ids.OPEN_ACL_UNSAFE; + + public ProtocolSupport(ZooKeeper zookeeper) { + this.zookeeper = zookeeper; + } + + /** + * Closes this strategy and releases any ZooKeeper resources; but keeps the + * ZooKeeper instance open + */ + public void close() { + if (closed.compareAndSet(false, true)) { + doClose(); + } + } + + /** + * return zookeeper client instance + * @return zookeeper client instance + */ + public ZooKeeper getZookeeper() { + return zookeeper; + } + + /** + * return the acl its using + * @return the acl. + */ + public List getAcl() { + return acl; + } + + /** + * set the acl + * @param acl the acl to set to + */ + public void setAcl(List acl) { + this.acl = acl; + } + + /** + * get the retry delay in milliseconds + * @return the retry delay + */ + public long getRetryDelay() { + return retryDelay; + } + + /** + * Sets the time waited between retry delays + * @param retryDelay the retry delay + */ + public void setRetryDelay(long retryDelay) { + this.retryDelay = retryDelay; + } + + /** + * Allow derived classes to perform + * some custom closing operations to release resources + */ + protected void doClose() { + } + + + /** + * Perform the given operation, retrying if the connection fails + * @return object. it needs to be cast to the callee's expected + * return type. + */ + protected Object retryOperation(ZooKeeperOperation operation) + throws KeeperException, InterruptedException { + KeeperException exception = null; + for (int i = 0; i < retryCount; i++) { + try { + return operation.execute(); + } catch (KeeperException.SessionExpiredException e) { + LOG.warn("Session expired for: " + zookeeper + " so reconnecting due to: " + e, e); + throw e; + } catch (KeeperException.ConnectionLossException e) { + if (exception == null) { + exception = e; + } + LOG.debug("Attempt " + i + " failed with connection loss so " + + "attempting to reconnect: " + e, e); + retryDelay(i); + } + } + throw exception; + } + + /** + * Ensures that the given path exists with no data, the current + * ACL and no flags + * @param path + */ + protected void ensurePathExists(String path) { + ensureExists(path, null, acl, CreateMode.PERSISTENT); + } + + /** + * Ensures that the given path exists with the given data, ACL and flags + * @param path + * @param acl + * @param flags + */ + protected void ensureExists(final String path, final byte[] data, + final List acl, final CreateMode flags) { + try { + retryOperation(new ZooKeeperOperation() { + public boolean execute() throws KeeperException, InterruptedException { + Stat stat = zookeeper.exists(path, false); + if (stat != null) { + return true; + } + zookeeper.create(path, data, acl, flags); + return true; + } + }); + } catch (KeeperException e) { + LOG.warn("Caught: " + e, e); + } catch (InterruptedException e) { + LOG.warn("Caught: " + e, e); + } + } + + /** + * Returns true if this protocol has been closed + * @return true if this protocol is closed + */ + protected boolean isClosed() { + return closed.get(); + } + + /** + * Performs a retry delay if this is not the first attempt + * @param attemptCount the number of the attempts performed so far + */ + protected void retryDelay(int attemptCount) { + if (attemptCount > 0) { + try { + Thread.sleep(attemptCount * retryDelay); + } catch (InterruptedException e) { + LOG.debug("Failed to sleep: " + e, e); + } + } + } +} diff --git a/pkg/registry/zookeeper-3.4.6/src/recipes/lock/src/java/org/apache/zookeeper/recipes/lock/WriteLock.java b/pkg/registry/zookeeper-3.4.6/src/recipes/lock/src/java/org/apache/zookeeper/recipes/lock/WriteLock.java new file mode 100644 index 000000000..5caebee46 --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/recipes/lock/src/java/org/apache/zookeeper/recipes/lock/WriteLock.java @@ -0,0 +1,296 @@ +/** + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + */ +package org.apache.zookeeper.recipes.lock; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.apache.zookeeper.KeeperException; +import org.apache.zookeeper.WatchedEvent; +import org.apache.zookeeper.Watcher; +import static org.apache.zookeeper.CreateMode.EPHEMERAL_SEQUENTIAL; +import org.apache.zookeeper.ZooKeeper; +import org.apache.zookeeper.data.ACL; +import org.apache.zookeeper.data.Stat; + +import java.util.List; +import java.util.SortedSet; +import java.util.TreeSet; + +/** + * A protocol to implement an exclusive + * write lock or to elect a leader.

      You invoke {@link #lock()} to + * start the process of grabbing the lock; you may get the lock then or it may be + * some time later.

      You can register a listener so that you are invoked + * when you get the lock; otherwise you can ask if you have the lock + * by calling {@link #isOwner()} + * + */ +public class WriteLock extends ProtocolSupport { + private static final Logger LOG = LoggerFactory.getLogger(WriteLock.class); + + private final String dir; + private String id; + private ZNodeName idName; + private String ownerId; + private String lastChildId; + private byte[] data = {0x12, 0x34}; + private LockListener callback; + private LockZooKeeperOperation zop; + + /** + * zookeeper contructor for writelock + * @param zookeeper zookeeper client instance + * @param dir the parent path you want to use for locking + * @param acls the acls that you want to use for all the paths, + * if null world read/write is used. + */ + public WriteLock(ZooKeeper zookeeper, String dir, List acl) { + super(zookeeper); + this.dir = dir; + if (acl != null) { + setAcl(acl); + } + this.zop = new LockZooKeeperOperation(); + } + + /** + * zookeeper contructor for writelock with callback + * @param zookeeper the zookeeper client instance + * @param dir the parent path you want to use for locking + * @param acl the acls that you want to use for all the paths + * @param callback the call back instance + */ + public WriteLock(ZooKeeper zookeeper, String dir, List acl, + LockListener callback) { + this(zookeeper, dir, acl); + this.callback = callback; + } + + /** + * return the current locklistener + * @return the locklistener + */ + public LockListener getLockListener() { + return this.callback; + } + + /** + * register a different call back listener + * @param callback the call back instance + */ + public void setLockListener(LockListener callback) { + this.callback = callback; + } + + /** + * Removes the lock or associated znode if + * you no longer require the lock. this also + * removes your request in the queue for locking + * in case you do not already hold the lock. + * @throws RuntimeException throws a runtime exception + * if it cannot connect to zookeeper. + */ + public synchronized void unlock() throws RuntimeException { + + if (!isClosed() && id != null) { + // we don't need to retry this operation in the case of failure + // as ZK will remove ephemeral files and we don't wanna hang + // this process when closing if we cannot reconnect to ZK + try { + + ZooKeeperOperation zopdel = new ZooKeeperOperation() { + public boolean execute() throws KeeperException, + InterruptedException { + zookeeper.delete(id, -1); + return Boolean.TRUE; + } + }; + zopdel.execute(); + } catch (InterruptedException e) { + LOG.warn("Caught: " + e, e); + //set that we have been interrupted. + Thread.currentThread().interrupt(); + } catch (KeeperException.NoNodeException e) { + // do nothing + } catch (KeeperException e) { + LOG.warn("Caught: " + e, e); + throw (RuntimeException) new RuntimeException(e.getMessage()). + initCause(e); + } + finally { + if (callback != null) { + callback.lockReleased(); + } + id = null; + } + } + } + + /** + * the watcher called on + * getting watch while watching + * my predecessor + */ + private class LockWatcher implements Watcher { + public void process(WatchedEvent event) { + // lets either become the leader or watch the new/updated node + LOG.debug("Watcher fired on path: " + event.getPath() + " state: " + + event.getState() + " type " + event.getType()); + try { + lock(); + } catch (Exception e) { + LOG.warn("Failed to acquire lock: " + e, e); + } + } + } + + /** + * a zoookeeper operation that is mainly responsible + * for all the magic required for locking. + */ + private class LockZooKeeperOperation implements ZooKeeperOperation { + + /** find if we have been created earler if not create our node + * + * @param prefix the prefix node + * @param zookeeper teh zookeeper client + * @param dir the dir paretn + * @throws KeeperException + * @throws InterruptedException + */ + private void findPrefixInChildren(String prefix, ZooKeeper zookeeper, String dir) + throws KeeperException, InterruptedException { + List names = zookeeper.getChildren(dir, false); + for (String name : names) { + if (name.startsWith(prefix)) { + id = name; + if (LOG.isDebugEnabled()) { + LOG.debug("Found id created last time: " + id); + } + break; + } + } + if (id == null) { + id = zookeeper.create(dir + "/" + prefix, data, + getAcl(), EPHEMERAL_SEQUENTIAL); + + if (LOG.isDebugEnabled()) { + LOG.debug("Created id: " + id); + } + } + + } + + /** + * the command that is run and retried for actually + * obtaining the lock + * @return if the command was successful or not + */ + public boolean execute() throws KeeperException, InterruptedException { + do { + if (id == null) { + long sessionId = zookeeper.getSessionId(); + String prefix = "x-" + sessionId + "-"; + // lets try look up the current ID if we failed + // in the middle of creating the znode + findPrefixInChildren(prefix, zookeeper, dir); + idName = new ZNodeName(id); + } + if (id != null) { + List names = zookeeper.getChildren(dir, false); + if (names.isEmpty()) { + LOG.warn("No children in: " + dir + " when we've just " + + "created one! Lets recreate it..."); + // lets force the recreation of the id + id = null; + } else { + // lets sort them explicitly (though they do seem to come back in order ususally :) + SortedSet sortedNames = new TreeSet(); + for (String name : names) { + sortedNames.add(new ZNodeName(dir + "/" + name)); + } + ownerId = sortedNames.first().getName(); + SortedSet lessThanMe = sortedNames.headSet(idName); + if (!lessThanMe.isEmpty()) { + ZNodeName lastChildName = lessThanMe.last(); + lastChildId = lastChildName.getName(); + if (LOG.isDebugEnabled()) { + LOG.debug("watching less than me node: " + lastChildId); + } + Stat stat = zookeeper.exists(lastChildId, new LockWatcher()); + if (stat != null) { + return Boolean.FALSE; + } else { + LOG.warn("Could not find the" + + " stats for less than me: " + lastChildName.getName()); + } + } else { + if (isOwner()) { + if (callback != null) { + callback.lockAcquired(); + } + return Boolean.TRUE; + } + } + } + } + } + while (id == null); + return Boolean.FALSE; + } + }; + + /** + * Attempts to acquire the exclusive write lock returning whether or not it was + * acquired. Note that the exclusive lock may be acquired some time later after + * this method has been invoked due to the current lock owner going away. + */ + public synchronized boolean lock() throws KeeperException, InterruptedException { + if (isClosed()) { + return false; + } + ensurePathExists(dir); + + return (Boolean) retryOperation(zop); + } + + /** + * return the parent dir for lock + * @return the parent dir used for locks. + */ + public String getDir() { + return dir; + } + + /** + * Returns true if this node is the owner of the + * lock (or the leader) + */ + public boolean isOwner() { + return id != null && ownerId != null && id.equals(ownerId); + } + + /** + * return the id for this lock + * @return the id for this lock + */ + public String getId() { + return this.id; + } +} + diff --git a/pkg/registry/zookeeper-3.4.6/src/recipes/lock/src/java/org/apache/zookeeper/recipes/lock/ZNodeName.java b/pkg/registry/zookeeper-3.4.6/src/recipes/lock/src/java/org/apache/zookeeper/recipes/lock/ZNodeName.java new file mode 100644 index 000000000..99b6616f9 --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/recipes/lock/src/java/org/apache/zookeeper/recipes/lock/ZNodeName.java @@ -0,0 +1,110 @@ +/** + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + */ +package org.apache.zookeeper.recipes.lock; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * Represents an ephemeral znode name which has an ordered sequence number + * and can be sorted in order + * + */ +class ZNodeName implements Comparable { + private final String name; + private String prefix; + private int sequence = -1; + private static final Logger LOG = LoggerFactory.getLogger(ZNodeName.class); + + public ZNodeName(String name) { + if (name == null) { + throw new NullPointerException("id cannot be null"); + } + this.name = name; + this.prefix = name; + int idx = name.lastIndexOf('-'); + if (idx >= 0) { + this.prefix = name.substring(0, idx); + try { + this.sequence = Integer.parseInt(name.substring(idx + 1)); + // If an exception occurred we misdetected a sequence suffix, + // so return -1. + } catch (NumberFormatException e) { + LOG.info("Number format exception for " + idx, e); + } catch (ArrayIndexOutOfBoundsException e) { + LOG.info("Array out of bounds for " + idx, e); + } + } + } + + @Override + public String toString() { + return name.toString(); + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + + ZNodeName sequence = (ZNodeName) o; + + if (!name.equals(sequence.name)) return false; + + return true; + } + + @Override + public int hashCode() { + return name.hashCode() + 37; + } + + public int compareTo(ZNodeName that) { + int answer = this.prefix.compareTo(that.prefix); + if (answer == 0) { + int s1 = this.sequence; + int s2 = that.sequence; + if (s1 == -1 && s2 == -1) { + return this.name.compareTo(that.name); + } + answer = s1 == -1 ? 1 : s2 == -1 ? -1 : s1 - s2; + } + return answer; + } + + /** + * Returns the name of the znode + */ + public String getName() { + return name; + } + + /** + * Returns the sequence number + */ + public int getZNodeName() { + return sequence; + } + + /** + * Returns the text prefix before the sequence number + */ + public String getPrefix() { + return prefix; + } +} diff --git a/pkg/registry/zookeeper-3.4.6/src/recipes/lock/src/java/org/apache/zookeeper/recipes/lock/ZooKeeperOperation.java b/pkg/registry/zookeeper-3.4.6/src/recipes/lock/src/java/org/apache/zookeeper/recipes/lock/ZooKeeperOperation.java new file mode 100644 index 000000000..54317ed95 --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/recipes/lock/src/java/org/apache/zookeeper/recipes/lock/ZooKeeperOperation.java @@ -0,0 +1,38 @@ +/** + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + */ +package org.apache.zookeeper.recipes.lock; + +import org.apache.zookeeper.KeeperException; + +/** + * A callback object which can be used for implementing retry-able operations in the + * {@link org.apache.zookeeper.recipes.lock.ProtocolSupport} class + * + */ +public interface ZooKeeperOperation { + + /** + * Performs the operation - which may be involved multiple times if the connection + * to ZooKeeper closes during this operation + * + * @return the result of the operation or null + * @throws KeeperException + * @throws InterruptedException + */ + public boolean execute() throws KeeperException, InterruptedException; +} diff --git a/pkg/registry/zookeeper-3.4.6/src/recipes/queue/README.txt b/pkg/registry/zookeeper-3.4.6/src/recipes/queue/README.txt new file mode 100644 index 000000000..d59a3c317 --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/recipes/queue/README.txt @@ -0,0 +1,30 @@ + + +1) This queue interface recipe implements the queue recipe +mentioned in ../../../docs/recipes.[html,pdf]. +A more detailed explanation is at http://www.cloudera.com/blog/2009/05/28/building-a-distributed-concurrent-queue-with-apache-zookeeper/ + +2) This recipe does not handle KeeperException.ConnectionLossException or ZCONNECTIONLOSS. It will only work correctly once ZOOKEEPER-22 https://issues.apache.org/jira/browse/ZOOKEEPER-22 is resolved. + +3) To compile the queue java recipe you can just run ant jar from +this directory. +Please report any bugs on the jira + +http://issues.apache.org/jira/browse/ZOOKEEPER + + diff --git a/pkg/registry/zookeeper-3.4.6/src/recipes/queue/build.xml b/pkg/registry/zookeeper-3.4.6/src/recipes/queue/build.xml new file mode 100644 index 000000000..0f3505ab9 --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/recipes/queue/build.xml @@ -0,0 +1,128 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Tests failed! + + + + + + + + + + + + + + + + + + diff --git a/pkg/registry/zookeeper-3.4.6/src/recipes/queue/src/c/INSTALL b/pkg/registry/zookeeper-3.4.6/src/recipes/queue/src/c/INSTALL new file mode 100644 index 000000000..5458714e1 --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/recipes/queue/src/c/INSTALL @@ -0,0 +1,234 @@ +Installation Instructions +************************* + +Copyright (C) 1994, 1995, 1996, 1999, 2000, 2001, 2002, 2004, 2005, +2006 Free Software Foundation, Inc. + +This file is free documentation; the Free Software Foundation gives +unlimited permission to copy, distribute and modify it. + +Basic Installation +================== + +Briefly, the shell commands `./configure; make; make install' should +configure, build, and install this package. The following +more-detailed instructions are generic; see the `README' file for +instructions specific to this package. + + The `configure' shell script attempts to guess correct values for +various system-dependent variables used during compilation. It uses +those values to create a `Makefile' in each directory of the package. +It may also create one or more `.h' files containing system-dependent +definitions. Finally, it creates a shell script `config.status' that +you can run in the future to recreate the current configuration, and a +file `config.log' containing compiler output (useful mainly for +debugging `configure'). + + It can also use an optional file (typically called `config.cache' +and enabled with `--cache-file=config.cache' or simply `-C') that saves +the results of its tests to speed up reconfiguring. Caching is +disabled by default to prevent problems with accidental use of stale +cache files. + + If you need to do unusual things to compile the package, please try +to figure out how `configure' could check whether to do them, and mail +diffs or instructions to the address given in the `README' so they can +be considered for the next release. If you are using the cache, and at +some point `config.cache' contains results you don't want to keep, you +may remove or edit it. + + The file `configure.ac' (or `configure.in') is used to create +`configure' by a program called `autoconf'. You need `configure.ac' if +you want to change it or regenerate `configure' using a newer version +of `autoconf'. + +The simplest way to compile this package is: + + 1. `cd' to the directory containing the package's source code and type + `./configure' to configure the package for your system. + + Running `configure' might take a while. While running, it prints + some messages telling which features it is checking for. + + 2. Type `make' to compile the package. + + 3. Optionally, type `make check' to run any self-tests that come with + the package. + + 4. Type `make install' to install the programs and any data files and + documentation. + + 5. You can remove the program binaries and object files from the + source code directory by typing `make clean'. To also remove the + files that `configure' created (so you can compile the package for + a different kind of computer), type `make distclean'. There is + also a `make maintainer-clean' target, but that is intended mainly + for the package's developers. If you use it, you may have to get + all sorts of other programs in order to regenerate files that came + with the distribution. + +Compilers and Options +===================== + +Some systems require unusual options for compilation or linking that the +`configure' script does not know about. Run `./configure --help' for +details on some of the pertinent environment variables. + + You can give `configure' initial values for configuration parameters +by setting variables in the command line or in the environment. Here +is an example: + + ./configure CC=c99 CFLAGS=-g LIBS=-lposix + + *Note Defining Variables::, for more details. + +Compiling For Multiple Architectures +==================================== + +You can compile the package for more than one kind of computer at the +same time, by placing the object files for each architecture in their +own directory. To do this, you can use GNU `make'. `cd' to the +directory where you want the object files and executables to go and run +the `configure' script. `configure' automatically checks for the +source code in the directory that `configure' is in and in `..'. + + With a non-GNU `make', it is safer to compile the package for one +architecture at a time in the source code directory. After you have +installed the package for one architecture, use `make distclean' before +reconfiguring for another architecture. + +Installation Names +================== + +By default, `make install' installs the package's commands under +`/usr/local/bin', include files under `/usr/local/include', etc. You +can specify an installation prefix other than `/usr/local' by giving +`configure' the option `--prefix=PREFIX'. + + You can specify separate installation prefixes for +architecture-specific files and architecture-independent files. If you +pass the option `--exec-prefix=PREFIX' to `configure', the package uses +PREFIX as the prefix for installing programs and libraries. +Documentation and other data files still use the regular prefix. + + In addition, if you use an unusual directory layout you can give +options like `--bindir=DIR' to specify different values for particular +kinds of files. Run `configure --help' for a list of the directories +you can set and what kinds of files go in them. + + If the package supports it, you can cause programs to be installed +with an extra prefix or suffix on their names by giving `configure' the +option `--program-prefix=PREFIX' or `--program-suffix=SUFFIX'. + +Optional Features +================= + +Some packages pay attention to `--enable-FEATURE' options to +`configure', where FEATURE indicates an optional part of the package. +They may also pay attention to `--with-PACKAGE' options, where PACKAGE +is something like `gnu-as' or `x' (for the X Window System). The +`README' should mention any `--enable-' and `--with-' options that the +package recognizes. + + For packages that use the X Window System, `configure' can usually +find the X include and library files automatically, but if it doesn't, +you can use the `configure' options `--x-includes=DIR' and +`--x-libraries=DIR' to specify their locations. + +Specifying the System Type +========================== + +There may be some features `configure' cannot figure out automatically, +but needs to determine by the type of machine the package will run on. +Usually, assuming the package is built to be run on the _same_ +architectures, `configure' can figure that out, but if it prints a +message saying it cannot guess the machine type, give it the +`--build=TYPE' option. TYPE can either be a short name for the system +type, such as `sun4', or a canonical name which has the form: + + CPU-COMPANY-SYSTEM + +where SYSTEM can have one of these forms: + + OS KERNEL-OS + + See the file `config.sub' for the possible values of each field. If +`config.sub' isn't included in this package, then this package doesn't +need to know the machine type. + + If you are _building_ compiler tools for cross-compiling, you should +use the option `--target=TYPE' to select the type of system they will +produce code for. + + If you want to _use_ a cross compiler, that generates code for a +platform different from the build platform, you should specify the +"host" platform (i.e., that on which the generated programs will +eventually be run) with `--host=TYPE'. + +Sharing Defaults +================ + +If you want to set default values for `configure' scripts to share, you +can create a site shell script called `config.site' that gives default +values for variables like `CC', `cache_file', and `prefix'. +`configure' looks for `PREFIX/share/config.site' if it exists, then +`PREFIX/etc/config.site' if it exists. Or, you can set the +`CONFIG_SITE' environment variable to the location of the site script. +A warning: not all `configure' scripts look for a site script. + +Defining Variables +================== + +Variables not defined in a site shell script can be set in the +environment passed to `configure'. However, some packages may run +configure again during the build, and the customized values of these +variables may be lost. In order to avoid this problem, you should set +them in the `configure' command line, using `VAR=value'. For example: + + ./configure CC=/usr/local2/bin/gcc + +causes the specified `gcc' to be used as the C compiler (unless it is +overridden in the site shell script). + +Unfortunately, this technique does not work for `CONFIG_SHELL' due to +an Autoconf bug. Until the bug is fixed you can use this workaround: + + CONFIG_SHELL=/bin/bash /bin/bash ./configure CONFIG_SHELL=/bin/bash + +`configure' Invocation +====================== + +`configure' recognizes the following options to control how it operates. + +`--help' +`-h' + Print a summary of the options to `configure', and exit. + +`--version' +`-V' + Print the version of Autoconf used to generate the `configure' + script, and exit. + +`--cache-file=FILE' + Enable the cache: use and save the results of the tests in FILE, + traditionally `config.cache'. FILE defaults to `/dev/null' to + disable caching. + +`--config-cache' +`-C' + Alias for `--cache-file=config.cache'. + +`--quiet' +`--silent' +`-q' + Do not print messages saying which checks are being made. To + suppress all normal output, redirect it to `/dev/null' (any error + messages will still be shown). + +`--srcdir=DIR' + Look for the package's source code in directory DIR. Usually + `configure' can determine that directory automatically. + +`configure' also accepts some other, not widely useful, options. Run +`configure --help' for more details. + diff --git a/pkg/registry/zookeeper-3.4.6/src/recipes/queue/src/c/LICENSE b/pkg/registry/zookeeper-3.4.6/src/recipes/queue/src/c/LICENSE new file mode 100644 index 000000000..d64569567 --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/recipes/queue/src/c/LICENSE @@ -0,0 +1,202 @@ + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/pkg/registry/zookeeper-3.4.6/src/recipes/queue/src/c/Makefile.am b/pkg/registry/zookeeper-3.4.6/src/recipes/queue/src/c/Makefile.am new file mode 100644 index 000000000..ecef3cc79 --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/recipes/queue/src/c/Makefile.am @@ -0,0 +1,46 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you 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. + +include $(top_srcdir)/aminclude.am + +AM_CFLAGS = -Wall -fPIC -I${ZOOKEEPER_PATH}/include -I${ZOOKEEPER_PATH}/generated \ + -I$(top_srcdir)/include -I/usr/include +AM_CPPFLAGS = -Wall -I${ZOOKEEPER_PATH}/include -I${ZOOKEEPER_PATH}/generated\ + -I${top_srcdir}/include -I/usr/include +EXTRA_DIST = LICENSE +lib_LTLIBRARIES = libzooqueue.la +libzooqueue_la_SOURCES = src/zoo_queue.c include/zoo_queue.h +libzooqueue_la_CPPFLAGS = -DDLOPEN_MODULE +libzooqueue_la_LDFLAGS = -version-info 0:1:0 + +#run the tests now + +TEST_SOURCES = tests/TestDriver.cc tests/TestClient.cc tests/Util.cc + + +check_PROGRAMS = zkqueuetest +nodist_zkqueuetest_SOURCES = ${TEST_SOURCES} +zkqueuetest_LDADD = ${ZOOKEEPER_LD} libzooqueue.la -lpthread ${CPPUNIT_LIBS} +zkqueuetest_CXXFLAGS = -DUSE_STATIC_LIB ${CPPUNIT_CFLAGS} + +run-check: check + ./zkqueuetest ${TEST_OPTIONS} + +clean-local: clean-check + ${RM} ${DX_CLEANFILES} + +clean-check: + ${RM} ${nodist_zkqueuetest_OBJECTS} diff --git a/pkg/registry/zookeeper-3.4.6/src/recipes/queue/src/c/README.txt b/pkg/registry/zookeeper-3.4.6/src/recipes/queue/src/c/README.txt new file mode 100644 index 000000000..7ef253fc9 --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/recipes/queue/src/c/README.txt @@ -0,0 +1,30 @@ + Zookeeper C queue client library + + +INSTALLATION + +If you're building the client from a source checkout you need to +follow the steps outlined below. If you're building from a release +tar downloaded from Apache please skip to step 2. + +This recipe does not handle ZCONNECTIONLOSS. It will only work correctly once ZOOKEEPER-22 https://issues.apache.org/jira/browse/ZOOKEEPER-22 is resolved. + +1) make sure that you compile the main zookeeper c client library. + +2) change directory to src/recipes/queue/src/c + and do a "autoreconf -if" to bootstrap + autoconf, automake and libtool. Please make sure you have autoconf + version 2.59 or greater installed. +3) do a "./configure [OPTIONS]" to generate the makefile. See INSTALL + for general information about running configure. + +4) do a "make" or "make install" to build the libraries and install them. + Alternatively, you can also build and run a unit test suite (and + you probably should). Please make sure you have cppunit-1.10.x or + higher installed before you execute step 4. Once ./configure has + finished, do a "make run-check". It will build the libraries, build + the tests and run them. +5) to generate doxygen documentation do a "make doxygen-doc". All + documentations will be placed to a new subfolder named docs. By + default only HTML documentation is generated. For information on + other document formats please use "./configure --help" diff --git a/pkg/registry/zookeeper-3.4.6/src/recipes/queue/src/c/acinclude.m4 b/pkg/registry/zookeeper-3.4.6/src/recipes/queue/src/c/acinclude.m4 new file mode 100644 index 000000000..d0041d8c2 --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/recipes/queue/src/c/acinclude.m4 @@ -0,0 +1,312 @@ +# This file is part of Autoconf. -*- Autoconf -*- + +# Copyright (C) 2004 Oren Ben-Kiki +# This file is distributed under the same terms as the Autoconf macro files. + +# Generate automatic documentation using Doxygen. Works in concert with the +# aminclude.m4 file and a compatible doxygen configuration file. Defines the +# following public macros: +# +# DX_???_FEATURE(ON|OFF) - control the default setting fo a Doxygen feature. +# Supported features are 'DOXYGEN' itself, 'DOT' for generating graphics, +# 'HTML' for plain HTML, 'CHM' for compressed HTML help (for MS users), 'CHI' +# for generating a seperate .chi file by the .chm file, and 'MAN', 'RTF', +# 'XML', 'PDF' and 'PS' for the appropriate output formats. The environment +# variable DOXYGEN_PAPER_SIZE may be specified to override the default 'a4wide' +# paper size. +# +# By default, HTML, PDF and PS documentation is generated as this seems to be +# the most popular and portable combination. MAN pages created by Doxygen are +# usually problematic, though by picking an appropriate subset and doing some +# massaging they might be better than nothing. CHM and RTF are specific for MS +# (note that you can't generate both HTML and CHM at the same time). The XML is +# rather useless unless you apply specialized post-processing to it. +# +# The macro mainly controls the default state of the feature. The use can +# override the default by specifying --enable or --disable. The macros ensure +# that contradictory flags are not given (e.g., --enable-doxygen-html and +# --enable-doxygen-chm, --enable-doxygen-anything with --disable-doxygen, etc.) +# Finally, each feature will be automatically disabled (with a warning) if the +# required programs are missing. +# +# Once all the feature defaults have been specified, call DX_INIT_DOXYGEN with +# the following parameters: a one-word name for the project for use as a +# filename base etc., an optional configuration file name (the default is +# 'Doxyfile', the same as Doxygen's default), and an optional output directory +# name (the default is 'doxygen-doc'). + +## ----------## +## Defaults. ## +## ----------## + +DX_ENV="" +AC_DEFUN([DX_FEATURE_doc], ON) +AC_DEFUN([DX_FEATURE_dot], ON) +AC_DEFUN([DX_FEATURE_man], OFF) +AC_DEFUN([DX_FEATURE_html], ON) +AC_DEFUN([DX_FEATURE_chm], OFF) +AC_DEFUN([DX_FEATURE_chi], OFF) +AC_DEFUN([DX_FEATURE_rtf], OFF) +AC_DEFUN([DX_FEATURE_xml], OFF) +AC_DEFUN([DX_FEATURE_pdf], ON) +AC_DEFUN([DX_FEATURE_ps], ON) + +## --------------- ## +## Private macros. ## +## --------------- ## + +# DX_ENV_APPEND(VARIABLE, VALUE) +# ------------------------------ +# Append VARIABLE="VALUE" to DX_ENV for invoking doxygen. +AC_DEFUN([DX_ENV_APPEND], [AC_SUBST([DX_ENV], ["$DX_ENV $1='$2'"])]) + +# DX_DIRNAME_EXPR +# --------------- +# Expand into a shell expression prints the directory part of a path. +AC_DEFUN([DX_DIRNAME_EXPR], + [[expr ".$1" : '\(\.\)[^/]*$' \| "x$1" : 'x\(.*\)/[^/]*$']]) + +# DX_IF_FEATURE(FEATURE, IF-ON, IF-OFF) +# ------------------------------------- +# Expands according to the M4 (static) status of the feature. +AC_DEFUN([DX_IF_FEATURE], [ifelse(DX_FEATURE_$1, ON, [$2], [$3])]) + +# DX_REQUIRE_PROG(VARIABLE, PROGRAM) +# ---------------------------------- +# Require the specified program to be found for the DX_CURRENT_FEATURE to work. +AC_DEFUN([DX_REQUIRE_PROG], [ +AC_PATH_TOOL([$1], [$2]) +if test "$DX_FLAG_$[DX_CURRENT_FEATURE$$1]" = 1; then + AC_MSG_WARN([$2 not found - will not DX_CURRENT_DESCRIPTION]) + AC_SUBST([DX_FLAG_]DX_CURRENT_FEATURE, 0) +fi +]) + +# DX_TEST_FEATURE(FEATURE) +# ------------------------ +# Expand to a shell expression testing whether the feature is active. +AC_DEFUN([DX_TEST_FEATURE], [test "$DX_FLAG_$1" = 1]) + +# DX_CHECK_DEPEND(REQUIRED_FEATURE, REQUIRED_STATE) +# ------------------------------------------------- +# Verify that a required features has the right state before trying to turn on +# the DX_CURRENT_FEATURE. +AC_DEFUN([DX_CHECK_DEPEND], [ +test "$DX_FLAG_$1" = "$2" \ +|| AC_MSG_ERROR([doxygen-DX_CURRENT_FEATURE ifelse([$2], 1, + requires, contradicts) doxygen-DX_CURRENT_FEATURE]) +]) + +# DX_CLEAR_DEPEND(FEATURE, REQUIRED_FEATURE, REQUIRED_STATE) +# ---------------------------------------------------------- +# Turn off the DX_CURRENT_FEATURE if the required feature is off. +AC_DEFUN([DX_CLEAR_DEPEND], [ +test "$DX_FLAG_$1" = "$2" || AC_SUBST([DX_FLAG_]DX_CURRENT_FEATURE, 0) +]) + +# DX_FEATURE_ARG(FEATURE, DESCRIPTION, +# CHECK_DEPEND, CLEAR_DEPEND, +# REQUIRE, DO-IF-ON, DO-IF-OFF) +# -------------------------------------------- +# Parse the command-line option controlling a feature. CHECK_DEPEND is called +# if the user explicitly turns the feature on (and invokes DX_CHECK_DEPEND), +# otherwise CLEAR_DEPEND is called to turn off the default state if a required +# feature is disabled (using DX_CLEAR_DEPEND). REQUIRE performs additional +# requirement tests (DX_REQUIRE_PROG). Finally, an automake flag is set and +# DO-IF-ON or DO-IF-OFF are called according to the final state of the feature. +AC_DEFUN([DX_ARG_ABLE], [ + AC_DEFUN([DX_CURRENT_FEATURE], [$1]) + AC_DEFUN([DX_CURRENT_DESCRIPTION], [$2]) + AC_ARG_ENABLE(doxygen-$1, + [AS_HELP_STRING(DX_IF_FEATURE([$1], [--disable-doxygen-$1], + [--enable-doxygen-$1]), + DX_IF_FEATURE([$1], [don't $2], [$2]))], + [ +case "$enableval" in +#( +y|Y|yes|Yes|YES) + AC_SUBST([DX_FLAG_$1], 1) + $3 +;; #( +n|N|no|No|NO) + AC_SUBST([DX_FLAG_$1], 0) +;; #( +*) + AC_MSG_ERROR([invalid value '$enableval' given to doxygen-$1]) +;; +esac +], [ +AC_SUBST([DX_FLAG_$1], [DX_IF_FEATURE([$1], 1, 0)]) +$4 +]) +if DX_TEST_FEATURE([$1]); then + $5 + : +fi +if DX_TEST_FEATURE([$1]); then + AM_CONDITIONAL(DX_COND_$1, :) + $6 + : +else + AM_CONDITIONAL(DX_COND_$1, false) + $7 + : +fi +]) + +## -------------- ## +## Public macros. ## +## -------------- ## + +# DX_XXX_FEATURE(DEFAULT_STATE) +# ----------------------------- +AC_DEFUN([DX_DOXYGEN_FEATURE], [AC_DEFUN([DX_FEATURE_doc], [$1])]) +AC_DEFUN([DX_MAN_FEATURE], [AC_DEFUN([DX_FEATURE_man], [$1])]) +AC_DEFUN([DX_HTML_FEATURE], [AC_DEFUN([DX_FEATURE_html], [$1])]) +AC_DEFUN([DX_CHM_FEATURE], [AC_DEFUN([DX_FEATURE_chm], [$1])]) +AC_DEFUN([DX_CHI_FEATURE], [AC_DEFUN([DX_FEATURE_chi], [$1])]) +AC_DEFUN([DX_RTF_FEATURE], [AC_DEFUN([DX_FEATURE_rtf], [$1])]) +AC_DEFUN([DX_XML_FEATURE], [AC_DEFUN([DX_FEATURE_xml], [$1])]) +AC_DEFUN([DX_XML_FEATURE], [AC_DEFUN([DX_FEATURE_xml], [$1])]) +AC_DEFUN([DX_PDF_FEATURE], [AC_DEFUN([DX_FEATURE_pdf], [$1])]) +AC_DEFUN([DX_PS_FEATURE], [AC_DEFUN([DX_FEATURE_ps], [$1])]) + +# DX_INIT_DOXYGEN(PROJECT, [CONFIG-FILE], [OUTPUT-DOC-DIR]) +# --------------------------------------------------------- +# PROJECT also serves as the base name for the documentation files. +# The default CONFIG-FILE is "Doxyfile" and OUTPUT-DOC-DIR is "doxygen-doc". +AC_DEFUN([DX_INIT_DOXYGEN], [ + +# Files: +AC_SUBST([DX_PROJECT], [$1]) +AC_SUBST([DX_CONFIG], [ifelse([$2], [], Doxyfile, [$2])]) +AC_SUBST([DX_DOCDIR], [ifelse([$3], [], doxygen-doc, [$3])]) + +# Environment variables used inside doxygen.cfg: +DX_ENV_APPEND(SRCDIR, $srcdir) +DX_ENV_APPEND(PROJECT, $DX_PROJECT) +DX_ENV_APPEND(DOCDIR, $DX_DOCDIR) +DX_ENV_APPEND(VERSION, $PACKAGE_VERSION) + +# Doxygen itself: +DX_ARG_ABLE(doc, [generate any doxygen documentation], + [], + [], + [DX_REQUIRE_PROG([DX_DOXYGEN], doxygen) + DX_REQUIRE_PROG([DX_PERL], perl)], + [DX_ENV_APPEND(PERL_PATH, $DX_PERL)]) + +# Dot for graphics: +DX_ARG_ABLE(dot, [generate graphics for doxygen documentation], + [DX_CHECK_DEPEND(doc, 1)], + [DX_CLEAR_DEPEND(doc, 1)], + [DX_REQUIRE_PROG([DX_DOT], dot)], + [DX_ENV_APPEND(HAVE_DOT, YES) + DX_ENV_APPEND(DOT_PATH, [`DX_DIRNAME_EXPR($DX_DOT)`])], + [DX_ENV_APPEND(HAVE_DOT, NO)]) + +# Man pages generation: +DX_ARG_ABLE(man, [generate doxygen manual pages], + [DX_CHECK_DEPEND(doc, 1)], + [DX_CLEAR_DEPEND(doc, 1)], + [], + [DX_ENV_APPEND(GENERATE_MAN, YES)], + [DX_ENV_APPEND(GENERATE_MAN, NO)]) + +# RTF file generation: +DX_ARG_ABLE(rtf, [generate doxygen RTF documentation], + [DX_CHECK_DEPEND(doc, 1)], + [DX_CLEAR_DEPEND(doc, 1)], + [], + [DX_ENV_APPEND(GENERATE_RTF, YES)], + [DX_ENV_APPEND(GENERATE_RTF, NO)]) + +# XML file generation: +DX_ARG_ABLE(xml, [generate doxygen XML documentation], + [DX_CHECK_DEPEND(doc, 1)], + [DX_CLEAR_DEPEND(doc, 1)], + [], + [DX_ENV_APPEND(GENERATE_XML, YES)], + [DX_ENV_APPEND(GENERATE_XML, NO)]) + +# (Compressed) HTML help generation: +DX_ARG_ABLE(chm, [generate doxygen compressed HTML help documentation], + [DX_CHECK_DEPEND(doc, 1)], + [DX_CLEAR_DEPEND(doc, 1)], + [DX_REQUIRE_PROG([DX_HHC], hhc)], + [DX_ENV_APPEND(HHC_PATH, $DX_HHC) + DX_ENV_APPEND(GENERATE_HTML, YES) + DX_ENV_APPEND(GENERATE_HTMLHELP, YES)], + [DX_ENV_APPEND(GENERATE_HTMLHELP, NO)]) + +# Seperate CHI file generation. +DX_ARG_ABLE(chi, [generate doxygen seperate compressed HTML help index file], + [DX_CHECK_DEPEND(chm, 1)], + [DX_CLEAR_DEPEND(chm, 1)], + [], + [DX_ENV_APPEND(GENERATE_CHI, YES)], + [DX_ENV_APPEND(GENERATE_CHI, NO)]) + +# Plain HTML pages generation: +DX_ARG_ABLE(html, [generate doxygen plain HTML documentation], + [DX_CHECK_DEPEND(doc, 1) DX_CHECK_DEPEND(chm, 0)], + [DX_CLEAR_DEPEND(doc, 1) DX_CLEAR_DEPEND(chm, 0)], + [], + [DX_ENV_APPEND(GENERATE_HTML, YES)], + [DX_TEST_FEATURE(chm) || DX_ENV_APPEND(GENERATE_HTML, NO)]) + +# PostScript file generation: +DX_ARG_ABLE(ps, [generate doxygen PostScript documentation], + [DX_CHECK_DEPEND(doc, 1)], + [DX_CLEAR_DEPEND(doc, 1)], + [DX_REQUIRE_PROG([DX_LATEX], latex) + DX_REQUIRE_PROG([DX_MAKEINDEX], makeindex) + DX_REQUIRE_PROG([DX_DVIPS], dvips) + DX_REQUIRE_PROG([DX_EGREP], egrep)]) + +# PDF file generation: +DX_ARG_ABLE(pdf, [generate doxygen PDF documentation], + [DX_CHECK_DEPEND(doc, 1)], + [DX_CLEAR_DEPEND(doc, 1)], + [DX_REQUIRE_PROG([DX_PDFLATEX], pdflatex) + DX_REQUIRE_PROG([DX_MAKEINDEX], makeindex) + DX_REQUIRE_PROG([DX_EGREP], egrep)]) + +# LaTeX generation for PS and/or PDF: +if DX_TEST_FEATURE(ps) || DX_TEST_FEATURE(pdf); then + AM_CONDITIONAL(DX_COND_latex, :) + DX_ENV_APPEND(GENERATE_LATEX, YES) +else + AM_CONDITIONAL(DX_COND_latex, false) + DX_ENV_APPEND(GENERATE_LATEX, NO) +fi + +# Paper size for PS and/or PDF: +AC_ARG_VAR(DOXYGEN_PAPER_SIZE, + [a4wide (default), a4, letter, legal or executive]) +case "$DOXYGEN_PAPER_SIZE" in +#( +"") + AC_SUBST(DOXYGEN_PAPER_SIZE, "") +;; #( +a4wide|a4|letter|legal|executive) + DX_ENV_APPEND(PAPER_SIZE, $DOXYGEN_PAPER_SIZE) +;; #( +*) + AC_MSG_ERROR([unknown DOXYGEN_PAPER_SIZE='$DOXYGEN_PAPER_SIZE']) +;; +esac + +#For debugging: +#echo DX_FLAG_doc=$DX_FLAG_doc +#echo DX_FLAG_dot=$DX_FLAG_dot +#echo DX_FLAG_man=$DX_FLAG_man +#echo DX_FLAG_html=$DX_FLAG_html +#echo DX_FLAG_chm=$DX_FLAG_chm +#echo DX_FLAG_chi=$DX_FLAG_chi +#echo DX_FLAG_rtf=$DX_FLAG_rtf +#echo DX_FLAG_xml=$DX_FLAG_xml +#echo DX_FLAG_pdf=$DX_FLAG_pdf +#echo DX_FLAG_ps=$DX_FLAG_ps +#echo DX_ENV=$DX_ENV +]) diff --git a/pkg/registry/zookeeper-3.4.6/src/recipes/queue/src/c/aminclude.am b/pkg/registry/zookeeper-3.4.6/src/recipes/queue/src/c/aminclude.am new file mode 100644 index 000000000..420049eca --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/recipes/queue/src/c/aminclude.am @@ -0,0 +1,186 @@ +# Copyright (C) 2004 Oren Ben-Kiki +# This file is distributed under the same terms as the Automake macro files. + +# Generate automatic documentation using Doxygen. Goals and variables values +# are controlled by the various DX_COND_??? conditionals set by autoconf. +# +# The provided goals are: +# doxygen-doc: Generate all doxygen documentation. +# doxygen-run: Run doxygen, which will generate some of the documentation +# (HTML, CHM, CHI, MAN, RTF, XML) but will not do the post +# processing required for the rest of it (PS, PDF, and some MAN). +# doxygen-man: Rename some doxygen generated man pages. +# doxygen-ps: Generate doxygen PostScript documentation. +# doxygen-pdf: Generate doxygen PDF documentation. +# +# Note that by default these are not integrated into the automake goals. If +# doxygen is used to generate man pages, you can achieve this integration by +# setting man3_MANS to the list of man pages generated and then adding the +# dependency: +# +# $(man3_MANS): doxygen-doc +# +# This will cause make to run doxygen and generate all the documentation. +# +# The following variable is intended for use in Makefile.am: +# +# DX_CLEANFILES = everything to clean. +# +# This is usually added to MOSTLYCLEANFILES. + +## --------------------------------- ## +## Format-independent Doxygen rules. ## +## --------------------------------- ## + +if DX_COND_doc + +## ------------------------------- ## +## Rules specific for HTML output. ## +## ------------------------------- ## + +if DX_COND_html + +DX_CLEAN_HTML = @DX_DOCDIR@/html + +endif DX_COND_html + +## ------------------------------ ## +## Rules specific for CHM output. ## +## ------------------------------ ## + +if DX_COND_chm + +DX_CLEAN_CHM = @DX_DOCDIR@/chm + +if DX_COND_chi + +DX_CLEAN_CHI = @DX_DOCDIR@/@PACKAGE@.chi + +endif DX_COND_chi + +endif DX_COND_chm + +## ------------------------------ ## +## Rules specific for MAN output. ## +## ------------------------------ ## + +if DX_COND_man + +DX_CLEAN_MAN = @DX_DOCDIR@/man + +endif DX_COND_man + +## ------------------------------ ## +## Rules specific for RTF output. ## +## ------------------------------ ## + +if DX_COND_rtf + +DX_CLEAN_RTF = @DX_DOCDIR@/rtf + +endif DX_COND_rtf + +## ------------------------------ ## +## Rules specific for XML output. ## +## ------------------------------ ## + +if DX_COND_xml + +DX_CLEAN_XML = @DX_DOCDIR@/xml + +endif DX_COND_xml + +## ----------------------------- ## +## Rules specific for PS output. ## +## ----------------------------- ## + +if DX_COND_ps + +DX_CLEAN_PS = @DX_DOCDIR@/@PACKAGE@.ps + +DX_PS_GOAL = doxygen-ps + +doxygen-ps: @DX_DOCDIR@/@PACKAGE@.ps + +@DX_DOCDIR@/@PACKAGE@.ps: @DX_DOCDIR@/@PACKAGE@.tag + cd @DX_DOCDIR@/latex; \ + rm -f *.aux *.toc *.idx *.ind *.ilg *.log *.out; \ + $(DX_LATEX) refman.tex; \ + $(MAKEINDEX_PATH) refman.idx; \ + $(DX_LATEX) refman.tex; \ + countdown=5; \ + while $(DX_EGREP) 'Rerun (LaTeX|to get cross-references right)' \ + refman.log > /dev/null 2>&1 \ + && test $$countdown -gt 0; do \ + $(DX_LATEX) refman.tex; \ + countdown=`expr $$countdown - 1`; \ + done; \ + $(DX_DVIPS) -o ../@PACKAGE@.ps refman.dvi + +endif DX_COND_ps + +## ------------------------------ ## +## Rules specific for PDF output. ## +## ------------------------------ ## + +if DX_COND_pdf + +DX_CLEAN_PDF = @DX_DOCDIR@/@PACKAGE@.pdf + +DX_PDF_GOAL = doxygen-pdf + +doxygen-pdf: @DX_DOCDIR@/@PACKAGE@.pdf + +@DX_DOCDIR@/@PACKAGE@.pdf: @DX_DOCDIR@/@PACKAGE@.tag + cd @DX_DOCDIR@/latex; \ + rm -f *.aux *.toc *.idx *.ind *.ilg *.log *.out; \ + $(DX_PDFLATEX) refman.tex; \ + $(DX_MAKEINDEX) refman.idx; \ + $(DX_PDFLATEX) refman.tex; \ + countdown=5; \ + while $(DX_EGREP) 'Rerun (LaTeX|to get cross-references right)' \ + refman.log > /dev/null 2>&1 \ + && test $$countdown -gt 0; do \ + $(DX_PDFLATEX) refman.tex; \ + countdown=`expr $$countdown - 1`; \ + done; \ + mv refman.pdf ../@PACKAGE@.pdf + +endif DX_COND_pdf + +## ------------------------------------------------- ## +## Rules specific for LaTeX (shared for PS and PDF). ## +## ------------------------------------------------- ## + +if DX_COND_latex + +DX_CLEAN_LATEX = @DX_DOCDIR@/latex + +endif DX_COND_latex + +.PHONY: doxygen-run doxygen-doc $(DX_PS_GOAL) $(DX_PDF_GOAL) + +.INTERMEDIATE: doxygen-run $(DX_PS_GOAL) $(DX_PDF_GOAL) + +doxygen-run: @DX_DOCDIR@/@PACKAGE@.tag + +doxygen-doc: doxygen-run $(DX_PS_GOAL) $(DX_PDF_GOAL) + +@DX_DOCDIR@/@PACKAGE@.tag: $(DX_CONFIG) $(pkginclude_HEADERS) + rm -rf @DX_DOCDIR@ + $(DX_ENV) $(DX_DOXYGEN) $(srcdir)/$(DX_CONFIG) + +DX_CLEANFILES = \ + @DX_DOCDIR@/@PACKAGE@.tag \ + -r \ + $(DX_CLEAN_HTML) \ + $(DX_CLEAN_CHM) \ + $(DX_CLEAN_CHI) \ + $(DX_CLEAN_MAN) \ + $(DX_CLEAN_RTF) \ + $(DX_CLEAN_XML) \ + $(DX_CLEAN_PS) \ + $(DX_CLEAN_PDF) \ + $(DX_CLEAN_LATEX) + +endif DX_COND_doc diff --git a/pkg/registry/zookeeper-3.4.6/src/recipes/queue/src/c/c-doc.Doxyfile b/pkg/registry/zookeeper-3.4.6/src/recipes/queue/src/c/c-doc.Doxyfile new file mode 100644 index 000000000..32e09a1c8 --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/recipes/queue/src/c/c-doc.Doxyfile @@ -0,0 +1,1252 @@ +# Doxyfile 1.4.7 + +# 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 (" ") + +#--------------------------------------------------------------------------- +# Project related 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 = $(PROJECT)-$(VERSION) + +# 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 = $(DOCDIR) + +# If the CREATE_SUBDIRS tag is set to YES, then doxygen will create +# 4096 sub-directories (in 2 levels) under the output directory of each output +# format and will distribute the generated files over these directories. +# Enabling this option can be useful when feeding doxygen a huge amount of +# source files, where putting all generated files in the same directory would +# otherwise cause performance problems for the file system. + +CREATE_SUBDIRS = NO + +# 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, Korean-en, Norwegian, +# Polish, Portuguese, Romanian, Russian, Serbian, Slovak, Slovene, Spanish, +# Swedish, and Ukrainian. + +OUTPUT_LANGUAGE = English + +# This tag can be used to specify the encoding used in the generated output. +# The encoding is not always determined by the language that is chosen, +# but also whether or not the output is meant for Windows or non-Windows users. +# In case there is a difference, setting the USE_WINDOWS_ENCODING tag to YES +# forces the Windows encoding (this is the default for the Windows binary), +# whereas setting the tag to NO uses a Unix-style encoding (the default for +# all platforms other than Windows). + +USE_WINDOWS_ENCODING = 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 + +# This tag implements a quasi-intelligent brief description abbreviator +# that is used to form the text in various listings. Each string +# in this list, if found as the leading text of the brief description, will be +# stripped from the text and the result after processing the whole list, is +# used as the annotated text. Otherwise, the brief description is used as-is. +# If left blank, the following values are used ("$name" is automatically +# replaced with the name of the entity): "The $name class" "The $name widget" +# "The $name file" "is" "provides" "specifies" "contains" +# "represents" "a" "an" "the" + +ABBREVIATE_BRIEF = + +# 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 = YES + +# 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. The tag can be used to show relative paths in the file list. +# If left blank the directory from which doxygen is run is used as the +# path to strip. + +STRIP_FROM_PATH = + +# The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of +# the path mentioned in the documentation of a class, which tells +# the reader which header file to include in order to use a class. +# If left blank only the name of the header file containing the class +# definition is used. Otherwise one should specify the include paths that +# are normally passed to the compiler using the -I flag. + +STRIP_FROM_INC_PATH = + +# 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 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 +# explicit @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 +# re-implements. + +INHERIT_DOCS = YES + +# If the SEPARATE_MEMBER_PAGES tag is set to YES, then doxygen will produce +# a new page for each member. If set to NO, the documentation of a member will +# be part of the file/class/namespace that contains it. + +SEPARATE_MEMBER_PAGES = 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 + +# 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 = + +# 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 + +# If you use STL classes (i.e. std::string, std::vector, etc.) but do not want to +# include (a tag file for) the STL sources as input, then you should +# set this tag to YES in order to let doxygen match functions declarations and +# definitions whose arguments contain STL classes (e.g. func(std::string); v.s. +# func(std::string) {}). This also make the inheritance and collaboration +# diagrams that involve STL classes more complete and accurate. + +BUILTIN_STL_SUPPORT = NO + +# 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 + +# Set the SUBGROUPING tag to YES (the default) to allow class member groups of +# the same type (for instance a group of public functions) to be put as a +# subgroup of that type (e.g. under the Public Functions section). Set it to +# NO to prevent subgrouping. Alternatively, this can be done per class using +# the \nosubgrouping command. + +SUBGROUPING = YES + +#--------------------------------------------------------------------------- +# Build related configuration options +#--------------------------------------------------------------------------- + +# 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 = NO + +# 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 = YES + +# 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 = YES + +# This flag is only useful for Objective-C code. When set to YES local +# methods, which are defined in the implementation section but not in +# the interface are included in the documentation. +# If set to NO (the default) only methods in the interface are included. + +EXTRACT_LOCAL_METHODS = 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 classes 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 HIDE_IN_BODY_DOCS tag is set to YES, Doxygen will hide any +# documentation blocks found inside the body of a function. +# If set to NO (the default) these blocks will be appended to the +# function's detailed documentation block. + +HIDE_IN_BODY_DOCS = NO + +# 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 + +# 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 +# and Mac users are advised to set this option to NO. + +CASE_SENSE_NAMES = YES + +# 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 SHOW_INCLUDE_FILES tag is set to YES (the default) then Doxygen +# will put a list of the files that are included by a file in the documentation +# of that file. + +SHOW_INCLUDE_FILES = NO + +# 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 the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the +# brief documentation of file, namespace and class members alphabetically +# by member name. If set to NO (the default) the members will appear in +# declaration order. + +SORT_BRIEF_DOCS = NO + +# If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be +# sorted by fully-qualified names, including namespaces. If set to +# NO (the default), the class list will be sorted only by class name, +# not including the namespace part. +# Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES. +# Note: This option applies only to the class list, not to the +# alphabetical list. + +SORT_BY_SCOPE_NAME = NO + +# 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 + +# 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 consists 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 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 = YES + +# If the sources in your project are distributed over multiple directories +# then setting the SHOW_DIRECTORIES tag to YES will show the directory hierarchy +# in the documentation. The default is NO. + +SHOW_DIRECTORIES = NO + +# The FILE_VERSION_FILTER tag can be used to specify a program or script that +# doxygen should invoke to get the current version for each file (typically from the +# version control system). Doxygen will invoke the program by executing (via +# popen()) the command , where is the value of +# the FILE_VERSION_FILTER tag, and is the name of an input file +# provided by doxygen. Whatever the program writes to standard output +# is used as the file version. See the manual for examples. + +FILE_VERSION_FILTER = + +#--------------------------------------------------------------------------- +# 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 + +# If WARN_IF_DOC_ERROR is set to YES, doxygen will generate warnings for +# potential errors in the documentation, such as not documenting some +# parameters in a documented function, or documenting parameters that +# don't exist or using markup commands wrongly. + +WARN_IF_DOC_ERROR = YES + +# This WARN_NO_PARAMDOC option can be abled to get warnings for +# functions that are documented, but have no documentation for their parameters +# or return value. If set to NO (the default) doxygen will only warn about +# wrong or incomplete parameter documentation, but not about the absence of +# documentation. + +WARN_NO_PARAMDOC = NO + +# 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. Optionally the format may contain +# $version, which will be replaced by the version of the file (if it could +# be obtained via FILE_VERSION_FILTER) + +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 = include/zoo_queue.h + +# 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 *.cs *.php *.php3 *.inc *.m *.mm *.py + +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. Note that the wildcards are matched +# against the file with absolute path, so to exclude all test directories +# for example use the pattern */test/* + +EXCLUDE_PATTERNS = + +# The EXAMPLE_PATH tag can be used to specify one or more files or +# directories that contain example code fragments that are included (see +# the \include command). + +EXAMPLE_PATH = + +# If the value of the EXAMPLE_PATH tag contains directories, you can use the +# EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp +# and *.h) to filter out the source-files in the directories. If left +# blank all files are included. + +EXAMPLE_PATTERNS = + +# If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be +# searched for input files to be used with the \include or \dontinclude +# commands irrespective of the value of the RECURSIVE tag. +# Possible values are YES and NO. If left blank NO is used. + +EXAMPLE_RECURSIVE = NO + +# The IMAGE_PATH tag can be used to specify one or more files or +# directories that contain image that are included in the documentation (see +# the \image command). + +IMAGE_PATH = + +# The INPUT_FILTER tag can be used to specify a program that doxygen should +# invoke to filter for each input file. Doxygen will invoke the filter program +# by executing (via popen()) the command , where +# is the value of the INPUT_FILTER tag, and is the name of an +# input file. Doxygen will then use the output that the filter program writes +# to standard output. If FILTER_PATTERNS is specified, this tag will be +# ignored. + +INPUT_FILTER = + +# The FILTER_PATTERNS tag can be used to specify filters on a per file pattern +# basis. Doxygen will compare the file name with each pattern and apply the +# filter if there is a match. The filters are a list of the form: +# pattern=filter (like *.cpp=my_cpp_filter). See INPUT_FILTER for further +# info on how filters are used. If FILTER_PATTERNS is empty, INPUT_FILTER +# is applied to all files. + +FILTER_PATTERNS = + +# 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. +# Note: To get rid of all source code in the generated output, make sure also +# VERBATIM_HEADERS is set to NO. + +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 + +# 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 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 = YES + +# 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 = YES + +# If the REFERENCES_LINK_SOURCE tag is set to YES (the default) +# and SOURCE_BROWSER tag is set to YES, then the hyperlinks from +# functions in REFERENCES_RELATION and REFERENCED_BY_RELATION lists will +# link to the source code. Otherwise they will link to the documentstion. + +REFERENCES_LINK_SOURCE = YES + +# If the USE_HTAGS tag is set to YES then the references to source code +# will point to the HTML generated by the htags(1) tool instead of doxygen +# built-in source browser. The htags tool is part of GNU's global source +# tagging system (see http://www.gnu.org/software/global/global.html). You +# will need version 4.8.6 or higher. + +USE_HTAGS = 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 + +#--------------------------------------------------------------------------- +# 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 = NO + +# 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 = $(GENERATE_HTML) + +# 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 = html + +# 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. Note that doxygen will try to copy +# the style sheet file to the HTML output directory, so don't put your own +# stylesheet in the HTML output directory as well, or it will be erased! + +HTML_STYLESHEET = + +# 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 = $(GENERATE_HTMLHELP) + +# 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 directory. + +CHM_FILE = ../$(PROJECT).chm + +# 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 = $(HHC_PATH) + +# 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 = $(GENERATE_CHI) + +# 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 = NO + +# 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, DHTML, CSS and frames is required (for instance Mozilla 1.0+, +# Netscape 6.0+, Internet explorer 5.0+, or Konqueror). 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 = $(GENERATE_LATEX) + +# 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 = $(PAPER_SIZE) + +# 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 = $(GENERATE_PDF) + +# 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 + +# If LATEX_HIDE_INDICES is set to YES then doxygen will not +# include the index chapters (such as File Index, Compound Index, etc.) +# in the output. + +LATEX_HIDE_INDICES = 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 optimized for Word 97 and may not look very pretty with +# other RTF readers or editors. + +GENERATE_RTF = $(GENERATE_RTF) + +# 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 assignments. 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 = $(GENERATE_MAN) + +# 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. + +GENERATE_XML = $(GENERATE_XML) + +# The XML_OUTPUT tag is used to specify where the XML 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 `xml' will be used as the default path. + +XML_OUTPUT = xml + +# 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 = + +# If the XML_PROGRAMLISTING tag is set to YES Doxygen will +# dump the program listings (including syntax highlighting +# and cross-referencing information) to the XML output. Note that +# enabling this will significantly increase the size of the XML output. + +XML_PROGRAMLISTING = YES + +#--------------------------------------------------------------------------- +# 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 Perl module output +#--------------------------------------------------------------------------- + +# If the GENERATE_PERLMOD tag is set to YES Doxygen will +# generate a Perl module file that captures the structure of +# the code including all documentation. Note that this +# feature is still experimental and incomplete at the +# moment. + +GENERATE_PERLMOD = NO + +# If the PERLMOD_LATEX tag is set to YES Doxygen will generate +# the necessary Makefile rules, Perl scripts and LaTeX code to be able +# to generate PDF and DVI output from the Perl module output. + +PERLMOD_LATEX = NO + +# If the PERLMOD_PRETTY tag is set to YES the Perl module output will be +# nicely formatted so it can be parsed by a human reader. This is useful +# if you want to understand what is going on. On the other hand, if this +# tag is set to NO the size of the Perl module output will be much smaller +# and Perl will parse it just the same. + +PERLMOD_PRETTY = YES + +# The names of the make variables in the generated doxyrules.make file +# are prefixed with the string contained in PERLMOD_MAKEVAR_PREFIX. +# This is useful so different doxyrules.make files included by the same +# Makefile don't overwrite each other's variables. + +PERLMOD_MAKEVAR_PREFIX = + +#--------------------------------------------------------------------------- +# 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 = YES + +# 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_DEFINED 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. To prevent a macro definition from being +# undefined via #undef or recursively expanded use the := operator +# instead of the = operator. + +PREDEFINED = + +# If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF 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::additions related to external references +#--------------------------------------------------------------------------- + +# The TAGFILES option can be used to specify one or more tagfiles. +# Optionally an initial location of the external documentation +# can be added for each tagfile. The format of a tag file without +# this location is as follows: +# TAGFILES = file1 file2 ... +# Adding location for the tag files is done as follows: +# TAGFILES = file1=loc1 "file2 = loc2" ... +# where "loc1" and "loc2" can be relative or absolute paths or +# URLs. If a location is present for each tag, the installdox tool +# does not have to be run to correct the links. +# Note that each tag file must have a unique name +# (where the name does NOT include the path) +# If a tag file is not located in the directory in which doxygen +# is run, you must also specify the path to the tagfile here. + +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 = $(DOCDIR)/$(PROJECT).tag + +# 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 superseded by the HAVE_DOT option below. This is only a +# fallback. It is recommended to install and use dot, since it yields 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 = $(HAVE_DOT) + +# 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 the GROUP_GRAPHS and HAVE_DOT tags are set to YES then doxygen +# will generate a graph for groups, showing the direct groups dependencies + +GROUP_GRAPHS = YES + +# If the UML_LOOK tag is set to YES doxygen will generate inheritance and +# collaboration diagrams in a style similar to the OMG's Unified Modeling +# Language. + +UML_LOOK = NO + +# If set to YES, the inheritance and collaboration graphs will show the +# relations between templates and their instances. + +TEMPLATE_RELATIONS = NO + +# 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 CALL_GRAPH and HAVE_DOT tags are set to YES then doxygen will +# generate a call dependency graph for every global function or class method. +# Note that enabling this option will significantly increase the time of a run. +# So in most cases it will be better to enable call graphs for selected +# functions only using the \callgraph command. + +CALL_GRAPH = NO + +# If the CALLER_GRAPH and HAVE_DOT tags are set to YES then doxygen will +# generate a caller dependency graph for every global function or class method. +# Note that enabling this option will significantly increase the time of a run. +# So in most cases it will be better to enable caller graphs for selected +# functions only using the \callergraph command. + +CALLER_GRAPH = NO + +# 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 + +# If the DIRECTORY_GRAPH, SHOW_DIRECTORIES and HAVE_DOT tags are set to YES +# then doxygen will show the dependencies a directory has on other directories +# in a graphical way. The dependency relations are determined by the #include +# relations between the files in the directories. + +DIRECTORY_GRAPH = 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 in the path. + +DOT_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 + +# The MAX_DOT_GRAPH_DEPTH tag can be used to set the maximum depth of the +# graphs generated by dot. A depth value of 3 means that only nodes reachable +# from the root by following a path via at most 3 edges will be shown. Nodes +# that lay further from the root node will be omitted. Note that setting this +# option to 1 or 2 may greatly reduce the computation time needed for large +# code bases. Also note that a graph may be further truncated if the graph's +# image dimensions are not sufficient to fit the graph (see MAX_DOT_GRAPH_WIDTH +# and MAX_DOT_GRAPH_HEIGHT). If 0 is used for the depth value (the default), +# the graph is not depth-constrained. + +MAX_DOT_GRAPH_DEPTH = 0 + +# Set the DOT_TRANSPARENT tag to YES to generate images with a transparent +# background. This is disabled by default, which results in a white background. +# Warning: Depending on the platform used, enabling this option may lead to +# badly anti-aliased labels on the edges of a graph (i.e. they become hard to +# read). + +DOT_TRANSPARENT = NO + +# Set the DOT_MULTI_TARGETS tag to YES allow dot to generate multiple output +# files in one run (i.e. multiple -o and -T options on the command line). This +# makes dot run faster, but since only newer versions of dot (>1.8.10) +# support this, this feature is disabled by default. + +DOT_MULTI_TARGETS = NO + +# 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 intermediate dot files that are used to generate +# the various graphs. + +DOT_CLEANUP = YES + +#--------------------------------------------------------------------------- +# Configuration::additions 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 diff --git a/pkg/registry/zookeeper-3.4.6/src/recipes/queue/src/c/configure.ac b/pkg/registry/zookeeper-3.4.6/src/recipes/queue/src/c/configure.ac new file mode 100644 index 000000000..a9fb7b130 --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/recipes/queue/src/c/configure.ac @@ -0,0 +1,82 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you 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. +# -*- Autoconf -*- +# Process this file with autoconf to produce a configure script. + +AC_PREREQ(2.59) + +AC_INIT([zooqueue], [3.2.0]) + +AC_CONFIG_SRCDIR([include/zoo_queue.h]) + +PACKAGE=zooqueue +VERSION=1.0 + +AC_SUBST(PACKAGE) +AC_SUBST(VERSION) + +BUILD_PATH="`pwd`" + +# Checks for programs. +AC_LANG_CPLUSPLUS + +AM_INIT_AUTOMAKE([-Wall foreign]) +# Checks for libraries. + +#initialize Doxygen support +DX_HTML_FEATURE(ON) +DX_CHM_FEATURE(OFF) +DX_CHI_FEATURE(OFF) +DX_MAN_FEATURE(OFF) +DX_RTF_FEATURE(OFF) +DX_XML_FEATURE(OFF) +DX_PDF_FEATURE(OFF) +DX_PS_FEATURE(OFF) +DX_INIT_DOXYGEN([zookeeper-queues],[c-doc.Doxyfile],[docs]) + + +ZOOKEEPER_PATH=${BUILD_PATH}/../../../../../src/c +ZOOKEEPER_LD=-L${BUILD_PATH}/../../../../../src/c\ -lzookeeper_mt + +AC_SUBST(ZOOKEEPER_PATH) +AC_SUBST(ZOOKEEPER_LD) + +# Checks for header files. +AC_HEADER_DIRENT +AC_HEADER_STDC +AC_CHECK_HEADERS([fcntl.h stdlib.h string.h sys/time.h unistd.h]) + +# Checks for typedefs, structures, and compiler characteristics. +AC_HEADER_STDBOOL +AC_C_CONST +AC_TYPE_UID_T +AC_C_INLINE +AC_TYPE_OFF_T +AC_TYPE_SIZE_T +AC_STRUCT_ST_BLOCKS +AC_HEADER_TIME +AC_C_VOLATILE +AC_PROG_CC +AC_PROG_LIBTOOL +#check for cppunit +AM_PATH_CPPUNIT(1.10.2) +# Checks for library functions. +AC_FUNC_UTIME_NULL +AC_CHECK_FUNCS([gettimeofday memset mkdir rmdir strdup strerror strstr strtol strtoul strtoull utime]) + +AC_CONFIG_FILES([Makefile]) +AC_OUTPUT +AC_C_VOLATILE diff --git a/pkg/registry/zookeeper-3.4.6/src/recipes/queue/src/c/include/zoo_queue.h b/pkg/registry/zookeeper-3.4.6/src/recipes/queue/src/c/include/zoo_queue.h new file mode 100644 index 000000000..ccc4602f6 --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/recipes/queue/src/c/include/zoo_queue.h @@ -0,0 +1,118 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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. + */ + +#ifndef ZOOKEEPER_QUEUE_H_ +#define ZOOKEEPER_QUEUE_H_ + +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + + +/** + * \file zoo_queue.h + * \brief zookeeper recipe for queues. + */ + + +struct zkr_queue { + zhandle_t *zh; + char *path; + struct ACL_vector *acl; + pthread_mutex_t pmutex; + char *node_name; + int node_name_length; + char *cached_create_path; +}; + +typedef struct zkr_queue zkr_queue_t; + + +/** + * \brief initializes a zookeeper queue + * + * this method instantiates a zookeeper queue + * \param queue the zookeeper queue to initialize + * \param zh the zookeeper handle to use + * \param path the path in zookeeper to use for the queue + * \param acl the acl to use in zookeeper. + * \return return 0 if successful. + */ +ZOOAPI int zkr_queue_init(zkr_queue_t *queue, zhandle_t* zh, char* path, struct ACL_vector *acl); + +/** + * \brief adds an element to a zookeeper queue + * + * this method adds an element to the back of a zookeeper queue. + * \param queue the zookeeper queue to add the element to + * \param data a pointer to a data buffer + * \param buffer_len the length of the buffer + * \return returns 0 (ZOK) if successful, otherwise returns a zookeeper error code. + */ +ZOOAPI int zkr_queue_offer(zkr_queue_t *queue, const char *data, int buffer_len); + +/** + * \brief returns the head of a zookeeper queue + * + * this method returns the head of a zookeeper queue without removing it. + * \param queue the zookeeper queue to add the element to + * \param buffer a pointer to a data buffer + * \param buffer_len a pointer to the length of the buffer + * \return returns 0 (ZOK) and sets *buffer_len to the length of data written if successful (-1 if the queue is empty). Otherwise it will set *buffer_len to -1 and return a zookeeper error code. + */ +ZOOAPI int zkr_queue_element(zkr_queue_t *queue, char *buffer, int *buffer_len); + +/** + * \brief returns the head of a zookeeper queue + * + * this method returns the head of a zookeeper queue without removing it. + * \param queue the zookeeper queue to get the head of + * \param buffer a pointer to a data buffer + * \param buffer_len a pointer to the length of the buffer + * \return returns 0 (ZOK) and sets *buffer_len to the length of data written if successful (-1 if the queue is empty). Otherwise it will set *buffer_len to -1 and return a zookeeper error code. + */ +ZOOAPI int zkr_queue_remove(zkr_queue_t *queue, char *buffer, int *buffer_len); + +/** + * \brief removes and returns the head of a zookeeper queue, blocks if necessary + * + * this method returns the head of a zookeeper queue without removing it. + * \param queue the zookeeper queue to remove and return the head of + * \param buffer a pointer to a data buffer + * \param buffer_len a pointer to the length of the buffer + * \return returns 0 (ZOK) and sets *buffer_len to the length of data written if successful. Otherwise it will set *buffer_len to -1 and return a zookeeper error code. + */ +ZOOAPI int zkr_queue_take(zkr_queue_t *queue, char *buffer, int *buffer_len); + +/** + * \brief destroys a zookeeper queue structure + * + * this destroys a zookeeper queue structure, this is only a local operation and will not affect + * the state of the queue on the zookeeper server. + * \param queue the zookeeper queue to destroy + */ +void zkr_queue_destroy(zkr_queue_t *queue); + + +#ifdef __cplusplus +} +#endif +#endif //ZOOKEEPER_QUEUE_H_ diff --git a/pkg/registry/zookeeper-3.4.6/src/recipes/queue/src/c/src/zoo_queue.c b/pkg/registry/zookeeper-3.4.6/src/recipes/queue/src/c/src/zoo_queue.c new file mode 100644 index 000000000..89ec24b6e --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/recipes/queue/src/c/src/zoo_queue.c @@ -0,0 +1,442 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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. + */ + +#ifdef DLL_EXPORT +#define USE_STATIC_LIB +#endif + +#if defined(__CYGWIN__) +#define USE_IPV6 +#endif + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#ifdef HAVE_SYS_UTSNAME_H +#include +#endif + +#ifdef HAVE_GETPWUID_R +#include +#endif + +#define IF_DEBUG(x) if (logLevel==ZOO_LOG_LEVEL_DEBUG) {x;} + + +static void free_String_vector(struct String_vector *v) { + if (v->data) { + int32_t i; + for (i=0; icount; i++) { + free(v->data[i]); + } + free(v->data); + v->data = 0; + } +} + + +static int vstrcmp(const void* str1, const void* str2) { + const char **a = (const char**)str1; + const char **b = (const char**) str2; + return strcmp(*a, *b); +} + +static void sort_children(struct String_vector *vector) { + qsort( vector->data, vector->count, sizeof(char*), &vstrcmp); +} + + +static void concat_path_nodename_n(char *buffer, int len, const char *path, const char *node_name){ + snprintf(buffer, len, "%s/%s", path, node_name); +} + +static char *concat_path_nodename(const char *path, const char *node_name){ + int node_path_length = strlen(path) + 1+ strlen(node_name) +1; + char *node_path = (char *) malloc(node_path_length * sizeof(char)); + concat_path_nodename_n(node_path, node_path_length, path, node_name); + return node_path; +} + + +static void zkr_queue_cache_create_path(zkr_queue_t *queue){ + if(queue->cached_create_path != NULL){ + free(queue->cached_create_path); + } + queue->cached_create_path = concat_path_nodename(queue->path, queue->node_name); +} + +ZOOAPI int zkr_queue_init(zkr_queue_t *queue, zhandle_t* zh, char* path, struct ACL_vector *acl){ + queue->zh = zh; + queue->path = path; + queue->node_name = "qn-"; + queue->node_name_length = strlen(queue->node_name); + queue->cached_create_path = NULL; + queue->acl = acl; + pthread_mutex_init(&(queue->pmutex), NULL); + zkr_queue_cache_create_path(queue); + return 0; +} + +static ZOOAPI int create_queue_root(zkr_queue_t *queue){ + return zoo_create(queue->zh, queue->path, NULL, 0, queue->acl, 0, NULL, 0 ); +} + +static int valid_child_name(zkr_queue_t *queue, const char *child_name){ + return strncmp(queue->node_name, child_name, queue->node_name_length); +} + +ZOOAPI int zkr_queue_offer(zkr_queue_t *queue, const char *data, int buffer_len){ + for(;;){ + int rc = zoo_create(queue->zh, queue->cached_create_path, data, buffer_len, queue->acl, ZOO_SEQUENCE, NULL, 0 ); + switch(rc){ + int create_root_rc; + case ZNONODE: + create_root_rc = create_queue_root(queue); + switch(create_root_rc){ + case ZNODEEXISTS: + case ZOK: + break; + default: + return create_root_rc; + } + break; + default: + return rc; + } + } +} + + +ZOOAPI int zkr_queue_element(zkr_queue_t *queue, char *buffer, int *buffer_len){ + int path_length = strlen(queue->path); + for(;;){ + struct String_vector stvector; + struct String_vector *vector = &stvector; + /*Get sorted children*/ + int get_children_rc = zoo_get_children(queue->zh, queue->path, 0, vector); + switch(get_children_rc){ + case ZOK: + break; + case ZNONODE: + *buffer_len = -1; + return ZOK; + default: + return get_children_rc; + } + if(stvector.count == 0){ + *buffer_len = -1; + return ZOK; + } + + sort_children(vector); + /*try all*/ + int i; + for(i=0; i < stvector.count; i++){ + char *child_name = stvector.data[i]; + int child_path_length = path_length + 1 + strlen(child_name) +1; + char child_path[child_path_length]; + concat_path_nodename_n(child_path, child_path_length, queue->path, child_name); + int get_rc = zoo_get(queue->zh, child_path, 0, buffer, buffer_len, NULL); + switch(get_rc){ + case ZOK: + free_String_vector(vector); + return ZOK; + case ZNONODE: + break; + default: + free_String_vector(vector); + return get_rc; + } + } + + free_String_vector(vector); + } +} + +ZOOAPI int zkr_queue_remove(zkr_queue_t *queue, char *buffer, int *buffer_len){ + int path_length = strlen(queue->path); + for(;;){ + struct String_vector stvector; + struct String_vector *vector = &stvector; + /*Get sorted children*/ + int get_children_rc = zoo_get_children(queue->zh, queue->path, 0, &stvector); + switch(get_children_rc){ + case ZOK: + break; + case ZNONODE: + *buffer_len = -1; + return ZOK; + + default: + *buffer_len = -1; + return get_children_rc; + } + if(stvector.count == 0){ + *buffer_len = -1; + return ZOK; + } + + sort_children(vector); + /*try all*/ + int i; + for( i=0; i < stvector.count; i++){ + char *child_name = stvector.data[i]; + int child_path_length = path_length + 1 + strlen(child_name) +1; + char child_path[child_path_length]; + concat_path_nodename_n(child_path, child_path_length, queue->path, child_name); + int get_rc = zoo_get(queue->zh, child_path, 0, buffer, buffer_len, NULL); + switch(get_rc){ + int delete_rc; + case ZOK: + delete_rc = zoo_delete(queue->zh, child_path, -1); + switch(delete_rc){ + case ZOK: + free_String_vector(vector); + return delete_rc; + case ZNONODE: + break; + default: + free_String_vector(vector); + *buffer_len = -1; + return delete_rc; + } + break; + case ZNONODE: + break; + default: + free_String_vector(vector); + *buffer_len = -1; + return get_rc; + } + } + free_String_vector(vector); + } +} + +/** + * The take_latch structure roughly emulates a Java CountdownLatch with 1 as the initial value. + * It is meant to be used by a setter thread and a waiter thread. + * + * This latch is specialized to be used with the queue, all latches created for the same queue structure will use the same mutex. + * + * The setter thread at some point will call take_latch_setter_trigger_latch() on the thread. + * + * The waiter thread creates the latch and at some point either calls take_latch_waiter_await()s or take_latch_waiter_mark_unneeded()s it. + * The await function will return after the setter thread has triggered the latch. + * The mark unneeded function will return immediately and avoid some unneeded initialization. + * + * Whichever thread is last to call their required function disposes of the latch. + * + * The latch may disposed if no threads will call the waiting, marking, or triggering functions using take_latch_destroy_syncrhonized(). + */ + +struct take_latch { + enum take_state {take_init, take_waiting, take_triggered, take_not_needed} state; + pthread_cond_t latch_condition; + zkr_queue_t *queue; +}; + + +typedef struct take_latch take_latch_t; + + +static void take_latch_init( take_latch_t *latch, zkr_queue_t *queue){ + pthread_mutex_t *mutex = &(queue->pmutex); + pthread_mutex_lock(mutex); + latch->state = take_init; + latch->queue = queue; + pthread_mutex_unlock(mutex); +} + +static take_latch_t *create_take_latch(zkr_queue_t *queue){ + take_latch_t *new_take_latch = (take_latch_t *) malloc(sizeof(take_latch_t)); + take_latch_init(new_take_latch, queue); + return new_take_latch; +} + + +//Only call this when you own the mutex +static void take_latch_destroy_unsafe(take_latch_t *latch){ + if(latch->state == take_waiting){ + pthread_cond_destroy(&(latch->latch_condition)); + } + free(latch); +} + +static void take_latch_destroy_synchronized(take_latch_t *latch){ + pthread_mutex_t *mutex = &(latch->queue->pmutex); + pthread_mutex_lock(mutex); + take_latch_destroy_unsafe(latch); + pthread_mutex_unlock(mutex); +} + +static void take_latch_setter_trigger_latch(take_latch_t *latch){ + pthread_mutex_t *mutex = &(latch->queue->pmutex); + pthread_mutex_lock(mutex); + switch(latch->state){ + case take_init: + latch->state = take_triggered; + break; + case take_not_needed: + take_latch_destroy_unsafe(latch); + break; + case take_triggered: + LOG_DEBUG(("Error! Latch was triggered twice.")); + break; + case take_waiting: + pthread_cond_signal(&(latch->latch_condition)); + break; + } + pthread_mutex_unlock(mutex); +} + +static void take_latch_waiter_await(take_latch_t *latch){ + pthread_mutex_t *mutex = &(latch->queue->pmutex); + pthread_mutex_lock(mutex); + switch(latch->state){ + case take_init: + pthread_cond_init(&(latch->latch_condition),NULL); + latch->state = take_waiting; + pthread_cond_wait(&(latch->latch_condition),mutex); + take_latch_destroy_unsafe(latch); + break; + case take_waiting: + LOG_DEBUG(("Error! Called await twice.")); + break; + case take_not_needed: + LOG_DEBUG(("Error! Waiting after marking not needed.")); + break; + case take_triggered: + take_latch_destroy_unsafe(latch); + break; + } + pthread_mutex_unlock(mutex); +} + +static void take_latch_waiter_mark_unneeded(take_latch_t *latch){ + pthread_mutex_t *mutex = &(latch->queue->pmutex); + pthread_mutex_lock(mutex); + switch(latch->state){ + case take_init: + latch->state = take_not_needed; + break; + case take_waiting: + LOG_DEBUG(("Error! Can't mark unneeded after waiting.")); + break; + case take_not_needed: + LOG_DEBUG(("Marked unneeded twice.")); + break; + case take_triggered: + take_latch_destroy_unsafe(latch); + break; + } + pthread_mutex_unlock(mutex); +} + +static void take_watcher(zhandle_t *zh, int type, int state, const char *path, void *watcherCtx){ + take_latch_t *latch = (take_latch_t *) watcherCtx; + take_latch_setter_trigger_latch(latch); +} + + + +ZOOAPI int zkr_queue_take(zkr_queue_t *queue, char *buffer, int *buffer_len){ + int path_length = strlen(queue->path); +take_attempt: + for(;;){ + struct String_vector stvector; + struct String_vector *vector = &stvector; + /*Get sorted children*/ + take_latch_t *take_latch = create_take_latch(queue); + int get_children_rc = zoo_wget_children(queue->zh, queue->path, take_watcher, take_latch, &stvector); + switch(get_children_rc){ + case ZOK: + break; + int create_queue_rc; + case ZNONODE: + take_latch_destroy_synchronized(take_latch); + create_queue_rc = create_queue_root(queue); + switch(create_queue_rc){ + case ZNODEEXISTS: + case ZOK: + goto take_attempt; + default: + *buffer_len = -1; + return create_queue_rc; + } + default: + take_latch_destroy_synchronized(take_latch); + *buffer_len = -1; + return get_children_rc; + } + if(stvector.count == 0){ + take_latch_waiter_await(take_latch); + }else{ + take_latch_waiter_mark_unneeded(take_latch); + } + + sort_children(vector); + /*try all*/ + int i; + for( i=0; i < stvector.count; i++){ + char *child_name = stvector.data[i]; + int child_path_length = path_length + 1 + strlen(child_name) +1; + char child_path[child_path_length]; + concat_path_nodename_n(child_path, child_path_length, queue->path, child_name); + int get_rc = zoo_get(queue->zh, child_path, 0, buffer, buffer_len, NULL); + switch(get_rc){ + int delete_rc; + case ZOK: + delete_rc = zoo_delete(queue->zh, child_path, -1); + switch(delete_rc){ + case ZOK: + free_String_vector(vector); + return delete_rc; + case ZNONODE: + break; + default: + free_String_vector(vector); + *buffer_len = -1; + return delete_rc; + } + break; + case ZNONODE: + break; + default: + free_String_vector(vector); + *buffer_len = -1; + return get_rc; + } + } + free_String_vector(vector); + } +} + +ZOOAPI void zkr_queue_destroy(zkr_queue_t *queue){ + pthread_mutex_destroy(&(queue->pmutex)); + if(queue->cached_create_path != NULL){ + free(queue->cached_create_path); + } +} diff --git a/pkg/registry/zookeeper-3.4.6/src/recipes/queue/src/c/tests/TestClient.cc b/pkg/registry/zookeeper-3.4.6/src/recipes/queue/src/c/tests/TestClient.cc new file mode 100644 index 000000000..5446d9b82 --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/recipes/queue/src/c/tests/TestClient.cc @@ -0,0 +1,452 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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. + */ + +#include + +#include +#include +#include +#include +#include + + +using namespace std; + +#include +#include + +#include +#include + +static void yield(zhandle_t *zh, int i) +{ + sleep(i); +} + +typedef struct evt { + string path; + int type; +} evt_t; + +typedef struct watchCtx { +private: + list events; +public: + bool connected; + zhandle_t *zh; + + watchCtx() { + connected = false; + zh = 0; + } + ~watchCtx() { + if (zh) { + zookeeper_close(zh); + zh = 0; + } + } + + evt_t getEvent() { + evt_t evt; + evt = events.front(); + events.pop_front(); + return evt; + } + + int countEvents() { + int count; + count = events.size(); + return count; + } + + void putEvent(evt_t evt) { + events.push_back(evt); + } + + bool waitForConnected(zhandle_t *zh) { + time_t expires = time(0) + 10; + while(!connected && time(0) < expires) { + yield(zh, 1); + } + return connected; + } + bool waitForDisconnected(zhandle_t *zh) { + time_t expires = time(0) + 15; + while(connected && time(0) < expires) { + yield(zh, 1); + } + return !connected; + } +} watchctx_t; + +extern "C" { + + const char *thread_test_string="Hello World!"; + + void *offer_thread_shared_queue(void *queue_handle){ + zkr_queue_t *queue = (zkr_queue_t *) queue_handle; + + int test_string_buffer_length = strlen(thread_test_string) + 1; + int offer_rc = zkr_queue_offer(queue, thread_test_string, test_string_buffer_length); + pthread_exit(NULL); + } + + void *take_thread_shared_queue(void *queue_handle){ + zkr_queue_t *queue = (zkr_queue_t *) queue_handle; + + int test_string_buffer_length = strlen(thread_test_string) + 1; + int receive_buffer_capacity = test_string_buffer_length; + int receive_buffer_length = receive_buffer_capacity; + char *receive_buffer = (char *) malloc(sizeof(char) * receive_buffer_capacity); + + int remove_rc = zkr_queue_take(queue, receive_buffer, &receive_buffer_length); + switch(remove_rc){ + case ZOK: + pthread_exit(receive_buffer); + default: + free(receive_buffer); + pthread_exit(NULL); + } + } + + int valid_test_string(void *result){ + char *result_string = (char *) result; + return !strncmp(result_string, thread_test_string, strlen(thread_test_string)); + } +} + +class Zookeeper_queuetest : public CPPUNIT_NS::TestFixture +{ + CPPUNIT_TEST_SUITE(Zookeeper_queuetest); + CPPUNIT_TEST(testInitDestroy); + CPPUNIT_TEST(testOffer1); + CPPUNIT_TEST(testOfferRemove1); + CPPUNIT_TEST(testOfferRemove2); + CPPUNIT_TEST(testOfferRemove3); + CPPUNIT_TEST(testOfferRemove4); + CPPUNIT_TEST(testOfferRemove5); + CPPUNIT_TEST(testOfferRemove6); + CPPUNIT_TEST(testOfferTake1); + CPPUNIT_TEST(testOfferTake2); + CPPUNIT_TEST(testOfferTake3); + CPPUNIT_TEST(testOfferTake4); + CPPUNIT_TEST(testOfferTake5); + CPPUNIT_TEST(testOfferTake6); + CPPUNIT_TEST_SUITE_END(); + + static void watcher(zhandle_t *, int type, int state, const char *path,void*v){ + watchctx_t *ctx = (watchctx_t*)v; + + if (state == ZOO_CONNECTED_STATE) { + ctx->connected = true; + } else { + ctx->connected = false; + } + if (type != ZOO_SESSION_EVENT) { + evt_t evt; + evt.path = path; + evt.type = type; + ctx->putEvent(evt); + } + } + + static const char hostPorts[]; + + const char *getHostPorts() { + return hostPorts; + } + + zhandle_t *createClient(watchctx_t *ctx) { + zhandle_t *zk = zookeeper_init(hostPorts, watcher, 10000, 0, + ctx, 0); + ctx->zh = zk; + sleep(1); + return zk; + } + +public: + +#define ZKSERVER_CMD "./tests/zkServer.sh" + + void setUp() + { + char cmd[1024]; + sprintf(cmd, "%s startClean %s", ZKSERVER_CMD, getHostPorts()); + CPPUNIT_ASSERT(system(cmd) == 0); + } + + + void startServer() { + char cmd[1024]; + sprintf(cmd, "%s start %s", ZKSERVER_CMD, getHostPorts()); + CPPUNIT_ASSERT(system(cmd) == 0); + } + + void stopServer() { + tearDown(); + } + + void tearDown() + { + char cmd[1024]; + sprintf(cmd, "%s stop %s", ZKSERVER_CMD, getHostPorts()); + CPPUNIT_ASSERT(system(cmd) == 0); + } + + void initializeQueuesAndHandles(int num_clients, zhandle_t *zoohandles[], + watchctx_t ctxs[], zkr_queue_t queues[], char *path){ + int i; + for(i=0; i< num_clients; i++){ + zoohandles[i] = createClient(&ctxs[i]); + zkr_queue_init(&queues[i], zoohandles[i], path, &ZOO_OPEN_ACL_UNSAFE); + } + } + + void cleanUpQueues(int num_clients, zkr_queue_t queues[]){ + int i; + for(i=0; i < num_clients; i++){ + zkr_queue_destroy(&queues[i]); + } + } + + void testInitDestroy(){ + int num_clients = 1; + watchctx_t ctxs[num_clients]; + zhandle_t *zoohandles[num_clients]; + zkr_queue_t queues[num_clients]; + char *path= (char *)"/testInitDestroy"; + + int i; + for(i=0; i< num_clients; i++){ + zoohandles[i] = createClient(&ctxs[i]); + zkr_queue_init(&queues[i], zoohandles[i], path, &ZOO_OPEN_ACL_UNSAFE); + } + + for(i=0; i< num_clients; i++){ + zkr_queue_destroy(&queues[i]); + } + + } + + void testOffer1(){ + int num_clients = 1; + watchctx_t ctxs[num_clients]; + zhandle_t *zoohandles[num_clients]; + zkr_queue_t queues[num_clients]; + char *path= (char *)"/testOffer1"; + + initializeQueuesAndHandles(num_clients, zoohandles, ctxs, queues, path); + + const char *test_string="Hello World!"; + int test_string_length = strlen(test_string); + int test_string_buffer_length = test_string_length + 1; + char buffer[test_string_buffer_length]; + + int offer_rc = zkr_queue_offer(&queues[0], test_string, test_string_buffer_length); + CPPUNIT_ASSERT(offer_rc == ZOK); + + int removed_element_buffer_length = test_string_buffer_length; + int remove_rc = zkr_queue_remove(&queues[0], buffer, &removed_element_buffer_length); + CPPUNIT_ASSERT(remove_rc == ZOK); + CPPUNIT_ASSERT(removed_element_buffer_length == test_string_buffer_length); + CPPUNIT_ASSERT(strncmp(test_string,buffer,test_string_length)==0); + + cleanUpQueues(num_clients,queues); + } + + void create_n_remove_m(char *path, int n, int m){ + int num_clients = 2; + watchctx_t ctxs[num_clients]; + zhandle_t *zoohandles[num_clients]; + zkr_queue_t queues[num_clients]; + + initializeQueuesAndHandles(num_clients, zoohandles, ctxs, queues, path); + + int i; + int max_digits = sizeof(int)*3; + const char *test_string = "Hello World!"; + int buffer_length = strlen(test_string) + max_digits + 1; + char correct_buffer[buffer_length]; + char receive_buffer[buffer_length]; + + for(i = 0; i < n; i++){ + snprintf(correct_buffer, buffer_length, "%s%d", test_string,i); + int offer_rc = zkr_queue_offer(&queues[0], correct_buffer, buffer_length); + CPPUNIT_ASSERT(offer_rc == ZOK); + } + printf("Offers\n"); + for(i=0; i=n){ + CPPUNIT_ASSERT(receive_buffer_length == -1); + }else{ + CPPUNIT_ASSERT(strncmp(correct_buffer,receive_buffer, buffer_length)==0); + } + } + + cleanUpQueues(num_clients,queues); + } + + void testOfferRemove1(){ + create_n_remove_m((char *)"/testOfferRemove1", 0,1); + } + + void testOfferRemove2(){ + create_n_remove_m((char *)"/testOfferRemove2", 1,1); + } + + void testOfferRemove3(){ + create_n_remove_m((char *)"/testOfferRemove3", 10,1); + } + + void testOfferRemove4(){ + create_n_remove_m((char *)"/testOfferRemove4", 10,10); + } + + void testOfferRemove5(){ + create_n_remove_m((char *)"/testOfferRemove5", 10,5); + } + + void testOfferRemove6(){ + create_n_remove_m((char *)"/testOfferRemove6", 10,11); + } + + void create_n_take_m(char *path, int n, int m){ + CPPUNIT_ASSERT(m<=n); + int num_clients = 2; + watchctx_t ctxs[num_clients]; + zhandle_t *zoohandles[num_clients]; + zkr_queue_t queues[num_clients]; + + initializeQueuesAndHandles(num_clients, zoohandles, ctxs, queues, path); + + int i; + int max_digits = sizeof(int)*3; + const char *test_string = "Hello World!"; + int buffer_length = strlen(test_string) + max_digits + 1; + char correct_buffer[buffer_length]; + char receive_buffer[buffer_length]; + + for(i = 0; i < n; i++){ + snprintf(correct_buffer, buffer_length, "%s%d", test_string,i); + int offer_rc = zkr_queue_offer(&queues[0], correct_buffer, buffer_length); + CPPUNIT_ASSERT(offer_rc == ZOK); + } + printf("Offers\n"); + for(i=0; i=n){ + CPPUNIT_ASSERT(receive_buffer_length == -1); + }else{ + CPPUNIT_ASSERT(strncmp(correct_buffer,receive_buffer, buffer_length)==0); + } + } + + cleanUpQueues(num_clients,queues); + } + + void testOfferTake1(){ + create_n_take_m((char *)"/testOfferTake1", 2,1); + } + + void testOfferTake2(){ + create_n_take_m((char *)"/testOfferTake2", 1,1); + } + + void testOfferTake3(){ + create_n_take_m((char *)"/testOfferTake3", 10,1); + } + + void testOfferTake4(){ + create_n_take_m((char *)"/testOfferTake4", 10,10); + } + + void testOfferTake5(){ + create_n_take_m((char *)"/testOfferTake5", 10,5); + } + + void testOfferTake6(){ + create_n_take_m((char *)"/testOfferTake6", 12,11); + } + + void testTakeThreaded(){ + int num_clients = 1; + watchctx_t ctxs[num_clients]; + zhandle_t *zoohandles[num_clients]; + zkr_queue_t queues[num_clients]; + char *path=(char *)"/testTakeThreaded"; + + initializeQueuesAndHandles(num_clients, zoohandles, ctxs, queues, path); + pthread_t take_thread; + + pthread_create(&take_thread, NULL, take_thread_shared_queue, (void *) &queues[0]); + + usleep(1000); + + pthread_t offer_thread; + pthread_create(&offer_thread, NULL, offer_thread_shared_queue, (void *) &queues[0]); + pthread_join(offer_thread, NULL); + + void *take_thread_result; + pthread_join(take_thread, &take_thread_result); + CPPUNIT_ASSERT(take_thread_result != NULL); + CPPUNIT_ASSERT(valid_test_string(take_thread_result)); + + cleanUpQueues(num_clients,queues); + } + + void testTakeThreaded2(){ + int num_clients = 1; + watchctx_t ctxs[num_clients]; + zhandle_t *zoohandles[num_clients]; + zkr_queue_t queues[num_clients]; + char *path=(char *)"/testTakeThreaded2"; + + initializeQueuesAndHandles(num_clients, zoohandles, ctxs, queues, path); + + int take_attempts; + int num_take_attempts = 2; + for(take_attempts=0; take_attempts < num_take_attempts; take_attempts++){ + pthread_t take_thread; + + pthread_create(&take_thread, NULL, take_thread_shared_queue, (void *) &queues[0]); + + usleep(1000); + + pthread_t offer_thread; + pthread_create(&offer_thread, NULL, offer_thread_shared_queue, (void *) &queues[0]); + pthread_join(offer_thread, NULL); + + void *take_thread_result; + pthread_join(take_thread, &take_thread_result); + CPPUNIT_ASSERT(take_thread_result != NULL); + CPPUNIT_ASSERT(valid_test_string(take_thread_result)); + + } + cleanUpQueues(num_clients,queues); + } +}; + +const char Zookeeper_queuetest::hostPorts[] = "127.0.0.1:22181"; +CPPUNIT_TEST_SUITE_REGISTRATION(Zookeeper_queuetest); diff --git a/pkg/registry/zookeeper-3.4.6/src/recipes/queue/src/c/tests/TestDriver.cc b/pkg/registry/zookeeper-3.4.6/src/recipes/queue/src/c/tests/TestDriver.cc new file mode 100644 index 000000000..2b818f450 --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/recipes/queue/src/c/tests/TestDriver.cc @@ -0,0 +1,114 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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. + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "Util.h" + +using namespace std; + +CPPUNIT_NS_BEGIN + +class EclipseOutputter: public CompilerOutputter +{ +public: + EclipseOutputter(TestResultCollector *result,ostream &stream): + CompilerOutputter(result,stream,"%p:%l: "),stream_(stream) + { + } + virtual void printFailedTestName( TestFailure *failure ){} + virtual void printFailureMessage( TestFailure *failure ) + { + stream_<<": "; + Message msg = failure->thrownException()->message(); + stream_<< msg.shortDescription(); + + string text; + for(int i=0; i the output must be in the compiler error format. + //bool selfTest = (argc > 1) && (std::string("-ide") == argv[1]); + globalTestConfig.addConfigFromCmdLine(argc,argv); + + // Create the event manager and test controller + CPPUNIT_NS::TestResult controller; + // Add a listener that colllects test result + CPPUNIT_NS::TestResultCollector result; + controller.addListener( &result ); + + // Add a listener that print dots as tests run. + // CPPUNIT_NS::TextTestProgressListener progress; + CPPUNIT_NS::BriefTestProgressListener progress; + controller.addListener( &progress ); + + CPPUNIT_NS::TestRunner runner; + runner.addTest( CPPUNIT_NS::TestFactoryRegistry::getRegistry().makeTest() ); + + try + { + cout << "Running " << globalTestConfig.getTestName(); + runner.run( controller, globalTestConfig.getTestName()); + cout< +#include +#include + +// number of elements in array +#define COUNTOF(array) sizeof(array)/sizeof(array[0]) + +#define DECLARE_WRAPPER(ret,sym,sig) \ + extern "C" ret __real_##sym sig; \ + extern "C" ret __wrap_##sym sig + +#define CALL_REAL(sym,params) \ + __real_##sym params + +// must include "src/zookeeper_log.h" to be able to use this macro +#define TEST_TRACE(x) \ + log_message(3,__LINE__,__func__,format_log_message x) + +extern const std::string EMPTY_STRING; + +// ***************************************************************************** +// A bit of wizardry to get to the bare type from a reference or a pointer +// to the type +template +struct TypeOp { + typedef T BareT; + typedef T ArgT; +}; + +// partial specialization for reference types +template +struct TypeOp{ + typedef T& ArgT; + typedef typename TypeOp::BareT BareT; +}; + +// partial specialization for pointers +template +struct TypeOp{ + typedef T* ArgT; + typedef typename TypeOp::BareT BareT; +}; + +// ***************************************************************************** +// Container utilities + +template +void putValue(std::map& map,const K& k, const V& v){ + typedef std::map Map; + typename Map::const_iterator it=map.find(k); + if(it==map.end()) + map.insert(typename Map::value_type(k,v)); + else + map[k]=v; +} + +template +bool getValue(const std::map& map,const K& k,V& v){ + typedef std::map Map; + typename Map::const_iterator it=map.find(k); + if(it==map.end()) + return false; + v=it->second; + return true; +} + +// ***************************************************************************** +// misc utils + +// millisecond sleep +void millisleep(int ms); +// evaluate given predicate until it returns true or the timeout +// (in millis) has expired +template +int ensureCondition(const Predicate& p,int timeout){ + int elapsed=0; + while(!p() && elapsed CmdLineOptList; +public: + typedef CmdLineOptList::const_iterator const_iterator; + TestConfig(){} + ~TestConfig(){} + void addConfigFromCmdLine(int argc, char* argv[]){ + if(argc>=2) + testName_=argv[1]; + for(int i=2; i /tmp/zk.log & + echo $! > /tmp/zk.pid + sleep 5 + ;; +stop) + # Already killed above + ;; +*) + echo "Unknown command " + $1 + exit 2 +esac + diff --git a/pkg/registry/zookeeper-3.4.6/src/recipes/queue/src/java/org/apache/zookeeper/recipes/queue/DistributedQueue.java b/pkg/registry/zookeeper-3.4.6/src/recipes/queue/src/java/org/apache/zookeeper/recipes/queue/DistributedQueue.java new file mode 100644 index 000000000..c5d7c83ec --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/recipes/queue/src/java/org/apache/zookeeper/recipes/queue/DistributedQueue.java @@ -0,0 +1,313 @@ +/** + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + */ + +package org.apache.zookeeper.recipes.queue; + +import java.util.List; +import java.util.NoSuchElementException; +import java.util.TreeMap; +import java.util.concurrent.CountDownLatch; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.apache.zookeeper.CreateMode; +import org.apache.zookeeper.KeeperException; +import org.apache.zookeeper.WatchedEvent; +import org.apache.zookeeper.Watcher; +import org.apache.zookeeper.ZooDefs; +import org.apache.zookeeper.ZooKeeper; +import org.apache.zookeeper.data.ACL; +import org.apache.zookeeper.data.Stat; + +/** + * + * A protocol to implement a distributed queue. + * + */ + +public class DistributedQueue { + private static final Logger LOG = LoggerFactory.getLogger(DistributedQueue.class); + + private final String dir; + + private ZooKeeper zookeeper; + private List acl = ZooDefs.Ids.OPEN_ACL_UNSAFE; + + private final String prefix = "qn-"; + + + public DistributedQueue(ZooKeeper zookeeper, String dir, List acl){ + this.dir = dir; + + if(acl != null){ + this.acl = acl; + } + this.zookeeper = zookeeper; + + } + + + + /** + * Returns a Map of the children, ordered by id. + * @param watcher optional watcher on getChildren() operation. + * @return map from id to child name for all children + */ + private TreeMap orderedChildren(Watcher watcher) throws KeeperException, InterruptedException { + TreeMap orderedChildren = new TreeMap(); + + List childNames = null; + try{ + childNames = zookeeper.getChildren(dir, watcher); + }catch (KeeperException.NoNodeException e){ + throw e; + } + + for(String childName : childNames){ + try{ + //Check format + if(!childName.regionMatches(0, prefix, 0, prefix.length())){ + LOG.warn("Found child node with improper name: " + childName); + continue; + } + String suffix = childName.substring(prefix.length()); + Long childId = new Long(suffix); + orderedChildren.put(childId,childName); + }catch(NumberFormatException e){ + LOG.warn("Found child node with improper format : " + childName + " " + e,e); + } + } + + return orderedChildren; + } + + /** + * Find the smallest child node. + * @return The name of the smallest child node. + */ + private String smallestChildName() throws KeeperException, InterruptedException { + long minId = Long.MAX_VALUE; + String minName = ""; + + List childNames = null; + + try{ + childNames = zookeeper.getChildren(dir, false); + }catch(KeeperException.NoNodeException e){ + LOG.warn("Caught: " +e,e); + return null; + } + + for(String childName : childNames){ + try{ + //Check format + if(!childName.regionMatches(0, prefix, 0, prefix.length())){ + LOG.warn("Found child node with improper name: " + childName); + continue; + } + String suffix = childName.substring(prefix.length()); + long childId = Long.parseLong(suffix); + if(childId < minId){ + minId = childId; + minName = childName; + } + }catch(NumberFormatException e){ + LOG.warn("Found child node with improper format : " + childName + " " + e,e); + } + } + + + if(minId < Long.MAX_VALUE){ + return minName; + }else{ + return null; + } + } + + /** + * Return the head of the queue without modifying the queue. + * @return the data at the head of the queue. + * @throws NoSuchElementException + * @throws KeeperException + * @throws InterruptedException + */ + public byte[] element() throws NoSuchElementException, KeeperException, InterruptedException { + TreeMap orderedChildren; + + // element, take, and remove follow the same pattern. + // We want to return the child node with the smallest sequence number. + // Since other clients are remove()ing and take()ing nodes concurrently, + // the child with the smallest sequence number in orderedChildren might be gone by the time we check. + // We don't call getChildren again until we have tried the rest of the nodes in sequence order. + while(true){ + try{ + orderedChildren = orderedChildren(null); + }catch(KeeperException.NoNodeException e){ + throw new NoSuchElementException(); + } + if(orderedChildren.size() == 0 ) throw new NoSuchElementException(); + + for(String headNode : orderedChildren.values()){ + if(headNode != null){ + try{ + return zookeeper.getData(dir+"/"+headNode, false, null); + }catch(KeeperException.NoNodeException e){ + //Another client removed the node first, try next + } + } + } + + } + } + + + /** + * Attempts to remove the head of the queue and return it. + * @return The former head of the queue + * @throws NoSuchElementException + * @throws KeeperException + * @throws InterruptedException + */ + public byte[] remove() throws NoSuchElementException, KeeperException, InterruptedException { + TreeMap orderedChildren; + // Same as for element. Should refactor this. + while(true){ + try{ + orderedChildren = orderedChildren(null); + }catch(KeeperException.NoNodeException e){ + throw new NoSuchElementException(); + } + if(orderedChildren.size() == 0) throw new NoSuchElementException(); + + for(String headNode : orderedChildren.values()){ + String path = dir +"/"+headNode; + try{ + byte[] data = zookeeper.getData(path, false, null); + zookeeper.delete(path, -1); + return data; + }catch(KeeperException.NoNodeException e){ + // Another client deleted the node first. + } + } + + } + } + + private class LatchChildWatcher implements Watcher { + + CountDownLatch latch; + + public LatchChildWatcher(){ + latch = new CountDownLatch(1); + } + + public void process(WatchedEvent event){ + LOG.debug("Watcher fired on path: " + event.getPath() + " state: " + + event.getState() + " type " + event.getType()); + latch.countDown(); + } + public void await() throws InterruptedException { + latch.await(); + } + } + + /** + * Removes the head of the queue and returns it, blocks until it succeeds. + * @return The former head of the queue + * @throws NoSuchElementException + * @throws KeeperException + * @throws InterruptedException + */ + public byte[] take() throws KeeperException, InterruptedException { + TreeMap orderedChildren; + // Same as for element. Should refactor this. + while(true){ + LatchChildWatcher childWatcher = new LatchChildWatcher(); + try{ + orderedChildren = orderedChildren(childWatcher); + }catch(KeeperException.NoNodeException e){ + zookeeper.create(dir, new byte[0], acl, CreateMode.PERSISTENT); + continue; + } + if(orderedChildren.size() == 0){ + childWatcher.await(); + continue; + } + + for(String headNode : orderedChildren.values()){ + String path = dir +"/"+headNode; + try{ + byte[] data = zookeeper.getData(path, false, null); + zookeeper.delete(path, -1); + return data; + }catch(KeeperException.NoNodeException e){ + // Another client deleted the node first. + } + } + } + } + + /** + * Inserts data into queue. + * @param data + * @return true if data was successfully added + */ + public boolean offer(byte[] data) throws KeeperException, InterruptedException{ + for(;;){ + try{ + zookeeper.create(dir+"/"+prefix, data, acl, CreateMode.PERSISTENT_SEQUENTIAL); + return true; + }catch(KeeperException.NoNodeException e){ + zookeeper.create(dir, new byte[0], acl, CreateMode.PERSISTENT); + } + } + + } + + /** + * Returns the data at the first element of the queue, or null if the queue is empty. + * @return data at the first element of the queue, or null. + * @throws KeeperException + * @throws InterruptedException + */ + public byte[] peek() throws KeeperException, InterruptedException{ + try{ + return element(); + }catch(NoSuchElementException e){ + return null; + } + } + + + /** + * Attempts to remove the head of the queue and return it. Returns null if the queue is empty. + * @return Head of the queue or null. + * @throws KeeperException + * @throws InterruptedException + */ + public byte[] poll() throws KeeperException, InterruptedException { + try{ + return remove(); + }catch(NoSuchElementException e){ + return null; + } + } + + + +} diff --git a/pkg/registry/zookeeper-3.4.6/src/zookeeper.jute b/pkg/registry/zookeeper-3.4.6/src/zookeeper.jute new file mode 100644 index 000000000..6521e54cd --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/src/zookeeper.jute @@ -0,0 +1,288 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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. + */ + +module org.apache.zookeeper.data { + class Id { + ustring scheme; + ustring id; + } + class ACL { + int perms; + Id id; + } + // information shared with the client + class Stat { + long czxid; // created zxid + long mzxid; // last modified zxid + long ctime; // created + long mtime; // last modified + int version; // version + int cversion; // child version + int aversion; // acl version + long ephemeralOwner; // owner id if ephemeral, 0 otw + int dataLength; //length of the data in the node + int numChildren; //number of children of this node + long pzxid; // last modified children + } + // information explicitly stored by the server persistently + class StatPersisted { + long czxid; // created zxid + long mzxid; // last modified zxid + long ctime; // created + long mtime; // last modified + int version; // version + int cversion; // child version + int aversion; // acl version + long ephemeralOwner; // owner id if ephemeral, 0 otw + long pzxid; // last modified children + } + + // information explicitly stored by the version 1 database of servers + class StatPersistedV1 { + long czxid; //created zxid + long mzxid; //last modified zxid + long ctime; //created + long mtime; //last modified + int version; //version + int cversion; //child version + int aversion; //acl version + long ephemeralOwner; //owner id if ephemeral. 0 otw + } +} + +module org.apache.zookeeper.proto { + class ConnectRequest { + int protocolVersion; + long lastZxidSeen; + int timeOut; + long sessionId; + buffer passwd; + } + class ConnectResponse { + int protocolVersion; + int timeOut; + long sessionId; + buffer passwd; + } + class SetWatches { + long relativeZxid; + vectordataWatches; + vectorexistWatches; + vectorchildWatches; + } + class RequestHeader { + int xid; + int type; + } + class MultiHeader { + int type; + boolean done; + int err; + } + class AuthPacket { + int type; + ustring scheme; + buffer auth; + } + class ReplyHeader { + int xid; + long zxid; + int err; + } + class GetDataRequest { + ustring path; + boolean watch; + } + class SetDataRequest { + ustring path; + buffer data; + int version; + } + class SetDataResponse { + org.apache.zookeeper.data.Stat stat; + } + class GetSASLRequest { + buffer token; + } + class SetSASLRequest { + buffer token; + } + class SetSASLResponse { + buffer token; + } + class CreateRequest { + ustring path; + buffer data; + vector acl; + int flags; + } + class DeleteRequest { + ustring path; + int version; + } + class GetChildrenRequest { + ustring path; + boolean watch; + } + class GetChildren2Request { + ustring path; + boolean watch; + } + class CheckVersionRequest { + ustring path; + int version; + } + class GetMaxChildrenRequest { + ustring path; + } + class GetMaxChildrenResponse { + int max; + } + class SetMaxChildrenRequest { + ustring path; + int max; + } + class SyncRequest { + ustring path; + } + class SyncResponse { + ustring path; + } + class GetACLRequest { + ustring path; + } + class SetACLRequest { + ustring path; + vector acl; + int version; + } + class SetACLResponse { + org.apache.zookeeper.data.Stat stat; + } + class WatcherEvent { + int type; // event type + int state; // state of the Keeper client runtime + ustring path; + } + class ErrorResponse { + int err; + } + class CreateResponse { + ustring path; + } + class ExistsRequest { + ustring path; + boolean watch; + } + class ExistsResponse { + org.apache.zookeeper.data.Stat stat; + } + class GetDataResponse { + buffer data; + org.apache.zookeeper.data.Stat stat; + } + class GetChildrenResponse { + vector children; + } + class GetChildren2Response { + vector children; + org.apache.zookeeper.data.Stat stat; + } + class GetACLResponse { + vector acl; + org.apache.zookeeper.data.Stat stat; + } +} + +module org.apache.zookeeper.server.quorum { + class LearnerInfo { + long serverid; + int protocolVersion; + } + class QuorumPacket { + int type; // Request, Ack, Commit, Ping + long zxid; + buffer data; // Only significant when type is request + vector authinfo; + } +} + +module org.apache.zookeeper.server.persistence { + class FileHeader { + int magic; + int version; + long dbid; + } +} + +module org.apache.zookeeper.txn { + class TxnHeader { + long clientId; + int cxid; + long zxid; + long time; + int type; + } + class CreateTxnV0 { + ustring path; + buffer data; + vector acl; + boolean ephemeral; + } + class CreateTxn { + ustring path; + buffer data; + vector acl; + boolean ephemeral; + int parentCVersion; + } + class DeleteTxn { + ustring path; + } + class SetDataTxn { + ustring path; + buffer data; + int version; + } + class CheckVersionTxn { + ustring path; + int version; + } + class SetACLTxn { + ustring path; + vector acl; + int version; + } + class SetMaxChildrenTxn { + ustring path; + int max; + } + class CreateSessionTxn { + int timeOut; + } + class ErrorTxn { + int err; + } + class Txn { + int type; + buffer data; + } + class MultiTxn { + vector txns; + } +} diff --git a/pkg/registry/zookeeper-3.4.6/zookeeper-3.4.6.jar.REMOVED.git-id b/pkg/registry/zookeeper-3.4.6/zookeeper-3.4.6.jar.REMOVED.git-id new file mode 100644 index 000000000..043b9185c --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/zookeeper-3.4.6.jar.REMOVED.git-id @@ -0,0 +1 @@ +8dcf8179fc7bc85d7a3be25fd2f1582b2e81c7bb \ No newline at end of file diff --git a/pkg/registry/zookeeper-3.4.6/zookeeper-3.4.6.jar.asc b/pkg/registry/zookeeper-3.4.6/zookeeper-3.4.6.jar.asc new file mode 100644 index 000000000..e7505de26 --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/zookeeper-3.4.6.jar.asc @@ -0,0 +1,17 @@ +-----BEGIN PGP SIGNATURE----- +Version: GnuPG v1.4.11 (GNU/Linux) + +iQIcBAABAgAGBQJTBd+1AAoJEJP7AlTSyA4yi7MP/2kz8a2kDT2QBaKkFOfGEIi+ +X/qL+EURa5hooSyWwqP2n/EB73/nJA/0nf3JFd9qdc2TuKKaCTHJtqVPg1rA3DBL +Qk7nLyGmQuDKEwq3B8rd+RzTKwR2yULMWisSfOpp1m7dct0kX2Q2s9Vw3YYr+CXX +HqLucSXWyibIow84QconzKf16eVeZvbBsrl/W+uv3mPq60iPuQtjrqkEnFOPD/yR +lYiv8FsCrmOfPz3jjkrzHULQFQJ7pAiQfGfB3T05unnnH/mEM/G5g6ORhQxYaz5i +nITU/UkD6YUJLWdpkMS8BkS+vQ9ZVCUjgRN2CpwXgHJDGLE8LxYOa8iBLH9KiRq4 +ArH9khmrh4QW4M/OTE+UOTTCp6yGVDqe7tNGizeKAcgRj0zqqYiDvADRt8t+nxwb +PKZN5PrDOWW1lB7gpHtOR3whqDTaSbUXhuJtwq0aK2iac/PPlxIReah2wjRu218V +mUpfUer5TeDG6bhscJ6McUEWbBB1bi2xF8N7IwnDaC5r8BHW3tmCEgIQGLwwrfx5 +h3AN5pckgEIvyhcaXCMUvl9/5+7fzNMyUbWZRTv+HWvAC5zdHTRiPx7K8A/4faRf +8hT/32zgvYNuX2wF5QkNOnLU0fxrhJ4T5bRHlMy9tBPjOaxnUfi1CcP1/t5U2Cet +rcVs7oAfaokmSKB/YalK +=jvDp +-----END PGP SIGNATURE----- diff --git a/pkg/registry/zookeeper-3.4.6/zookeeper-3.4.6.jar.md5 b/pkg/registry/zookeeper-3.4.6/zookeeper-3.4.6.jar.md5 new file mode 100644 index 000000000..73c43dc41 --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/zookeeper-3.4.6.jar.md5 @@ -0,0 +1 @@ +9aaec9ffbb5036f91f25a70fd4a14023 diff --git a/pkg/registry/zookeeper-3.4.6/zookeeper-3.4.6.jar.sha1 b/pkg/registry/zookeeper-3.4.6/zookeeper-3.4.6.jar.sha1 new file mode 100644 index 000000000..1125ca001 --- /dev/null +++ b/pkg/registry/zookeeper-3.4.6/zookeeper-3.4.6.jar.sha1 @@ -0,0 +1 @@ +27d477d3603af659999a90d7133dcd22434ac685 From 7c8bc3dd2dea882fb2df56a58a564d982146ccd4 Mon Sep 17 00:00:00 2001 From: zhangshen023 <1292369127@qq.com> Date: Thu, 29 Oct 2020 23:49:38 +0800 Subject: [PATCH 179/227] code optimization --- pkg/common/constant/dubbo_interface_url.go | 9 +++++++ pkg/registry/consul_registry.go | 6 ++--- pkg/registry/registry_load.go | 4 +-- pkg/registry/util.go | 11 ++++---- pkg/registry/zookeeper_registry.go | 13 ++++++---- pkg/registry/zookeeper_registry_test.go | 30 +++++++++++----------- 6 files changed, 43 insertions(+), 30 deletions(-) create mode 100644 pkg/common/constant/dubbo_interface_url.go diff --git a/pkg/common/constant/dubbo_interface_url.go b/pkg/common/constant/dubbo_interface_url.go new file mode 100644 index 000000000..91e504c4a --- /dev/null +++ b/pkg/common/constant/dubbo_interface_url.go @@ -0,0 +1,9 @@ +package constant + +const ( + NAME_KEY = "name" + GROUP_KEY = "group" + VERSION_KEY = "version" + INTERFACE_KEY = "interface" + RETRIES_KEY = "retries" +) diff --git a/pkg/registry/consul_registry.go b/pkg/registry/consul_registry.go index 11637c7ce..dba78c978 100644 --- a/pkg/registry/consul_registry.go +++ b/pkg/registry/consul_registry.go @@ -34,7 +34,7 @@ import ( ) func init() { - var _ RegistryLoad = new(ConsulRegistryLoad) + var _ Loader = new(ConsulRegistryLoad) } const ( @@ -49,7 +49,7 @@ type ConsulRegistryLoad struct { cluster string } -func newConsulRegistryLoad(address, cluster string) (RegistryLoad, error) { +func newConsulRegistryLoad(address, cluster string) (Loader, error) { config := &consul.Config{Address: address} client, err := consul.NewClient(config) if err != nil { @@ -86,7 +86,7 @@ func (crl *ConsulRegistryLoad) transfer2Url(service consul.AgentService) (common } methodsParam := strings.Split(params.Get(constant.METHODS_KEY), ",") - var methods []string + var methods = make([]string, len(methodsParam)) for _, method := range methodsParam { if method != "" { methods = append(methods, method) diff --git a/pkg/registry/registry_load.go b/pkg/registry/registry_load.go index 670521ca6..ba641cc4e 100644 --- a/pkg/registry/registry_load.go +++ b/pkg/registry/registry_load.go @@ -18,8 +18,8 @@ package registry import "github.com/apache/dubbo-go/common" -// RegistryLoad this interface defined for load services from different kinds registry, such as nacos,consul,zookeeper. -type RegistryLoad interface { +// Loader this interface defined for load services from different kinds registry, such as nacos,consul,zookeeper. +type Loader interface { // LoadAllServices load all services registered in registry LoadAllServices() ([]common.URL, error) // GetCluster get the registry name diff --git a/pkg/registry/util.go b/pkg/registry/util.go index 700636255..7b2a6736d 100644 --- a/pkg/registry/util.go +++ b/pkg/registry/util.go @@ -22,6 +22,7 @@ import ( import ( "github.com/dubbogo/dubbo-go-proxy/pkg/client/dubbo" + "github.com/dubbogo/dubbo-go-proxy/pkg/common/constant" "github.com/dubbogo/dubbo-go-proxy/pkg/config" ) @@ -32,12 +33,12 @@ func TransferURL2Api(url common.URL, clusterName string) []config.IntegrationReq irs = append(irs, config.IntegrationRequest{ RequestType: url.Protocol, DubboMetadata: dubbo.DubboMetadata{ - ApplicationName: url.GetParam("name", ""), - Group: url.GetParam("group", ""), - Version: url.GetParam("version", ""), - Interface: url.GetParam("interface", ""), + ApplicationName: url.GetParam(constant.NAME_KEY, ""), + Group: url.GetParam(constant.GROUP_KEY, ""), + Version: url.GetParam(constant.VERSION_KEY, ""), + Interface: url.GetParam(constant.INTERFACE_KEY, ""), Method: method, - Retries: url.GetParam("retries", ""), + Retries: url.GetParam(constant.RETRIES_KEY, ""), ClusterName: clusterName, ProtocolTypeStr: url.Protocol, }, diff --git a/pkg/registry/zookeeper_registry.go b/pkg/registry/zookeeper_registry.go index 99ec8c835..6f1059474 100644 --- a/pkg/registry/zookeeper_registry.go +++ b/pkg/registry/zookeeper_registry.go @@ -31,8 +31,12 @@ import ( "github.com/apache/dubbo-go/remoting/zookeeper" ) +const ( + rootPath = "/dubbo" +) + func init() { - var _ RegistryLoad = new(ZookeeperRegistryLoad) + var _ Loader = new(ZookeeperRegistryLoad) } // ConsulRegistryLoad load dubbo apis from consul registry @@ -43,7 +47,7 @@ type ZookeeperRegistryLoad struct { cluster string } -func newZookeeperRegistryLoad(address, cluster string) (RegistryLoad, error) { +func newZookeeperRegistryLoad(address, cluster string) (Loader, error) { newClient, err := zookeeper.NewZookeeperClient("zkClient", strings.Split(address, ","), 15*time.Second) if err != nil { logger.Warnf("newZookeeperClient error:%v", err) @@ -65,7 +69,6 @@ func (crl *ZookeeperRegistryLoad) GetCluster() (string, error) { // LoadAllServices load all services from consul registry func (crl *ZookeeperRegistryLoad) LoadAllServices() ([]common.URL, error) { - rootPath := "/dubbo" children, err := crl.client.GetChildren(rootPath) if err != nil { logger.Errorf("[zookeeper registry] get zk children error:%v", err) @@ -80,12 +83,12 @@ func (crl *ZookeeperRegistryLoad) LoadAllServices() ([]common.URL, error) { return nil, err } for _, url := range urlStrs { - dubboUrl, err := common.NewURL(url) + dubboURL, err := common.NewURL(url) if err != nil { logger.Warnf("[zookeeper registry] transfer zk info to url error:%v", err) continue } - urls = append(urls, dubboUrl) + urls = append(urls, dubboURL) } } return urls, nil diff --git a/pkg/registry/zookeeper_registry_test.go b/pkg/registry/zookeeper_registry_test.go index 981062d86..e07339400 100644 --- a/pkg/registry/zookeeper_registry_test.go +++ b/pkg/registry/zookeeper_registry_test.go @@ -38,7 +38,7 @@ import ( const providerUrlstr = "dubbo://127.0.0.1:20000/com.ikurento.user.UserProvider?methods.GetUser.retries=1" -func newMockZkRegistry(t *testing.T, providerUrl common.URL, opts ...zookeeper.Option) (*zk.TestCluster, error) { +func newMockZkRegistry(t *testing.T, providerURL common.URL, opts ...zookeeper.Option) (*zk.TestCluster, error) { var ( err error c *zk.TestCluster @@ -56,26 +56,26 @@ func newMockZkRegistry(t *testing.T, providerUrl common.URL, opts ...zookeeper.O ) params = url.Values{} - providerUrl.RangeParams(func(key, value string) bool { + providerURL.RangeParams(func(key, value string) bool { params.Add(key, value) return true }) - dubboPath = fmt.Sprintf("/dubbo/%s/%s", url.QueryEscape(providerUrl.Service()), common.DubboNodes[common.PROVIDER]) + dubboPath = fmt.Sprintf("/dubbo/%s/%s", url.QueryEscape(providerURL.Service()), common.DubboNodes[common.PROVIDER]) err = client.CreateWithValue(dubboPath, []byte("")) assert.Nil(t, err) - if len(providerUrl.Methods) > 0 { - params.Add(constant.METHODS_KEY, strings.Join(providerUrl.Methods, ",")) + if len(providerURL.Methods) > 0 { + params.Add(constant.METHODS_KEY, strings.Join(providerURL.Methods, ",")) } var host string - if providerUrl.Ip == "" { + if providerURL.Ip == "" { host = "" } else { - host = providerUrl.Ip + host = providerURL.Ip } - host += ":" + providerUrl.Port - rawURL = fmt.Sprintf("%s://%s%s?%s", providerUrl.Protocol, host, providerUrl.Path, params.Encode()) + host += ":" + providerURL.Port + rawURL = fmt.Sprintf("%s://%s%s?%s", providerURL.Protocol, host, providerURL.Path, params.Encode()) encodedURL = url.QueryEscape(rawURL) dubboPath = strings.ReplaceAll(dubboPath, "$", "%24") @@ -89,13 +89,13 @@ func newMockZkRegistry(t *testing.T, providerUrl common.URL, opts ...zookeeper.O return c, nil } -func registerProvider(providerUrl common.URL, t *testing.T) (*zk.TestCluster, error) { - return newMockZkRegistry(t, providerUrl) +func registerProvider(providerURL common.URL, t *testing.T) (*zk.TestCluster, error) { + return newMockZkRegistry(t, providerURL) } func TestZookeeperRegistryLoad_GetCluster(t *testing.T) { - providerUrl, _ := common.NewURL(providerUrlstr) - testCluster, err := registerProvider(providerUrl, t) + providerURL, _ := common.NewURL(providerUrlstr) + testCluster, err := registerProvider(providerURL, t) assert.Nil(t, err) defer testCluster.Stop() registryLoad, err := newZookeeperRegistryLoad("127.0.0.1:1111", "test-cluster") @@ -107,8 +107,8 @@ func TestZookeeperRegistryLoad_GetCluster(t *testing.T) { } func TestZookeeperRegistryLoad_LoadAllServices(t *testing.T) { - providerUrl, _ := common.NewURL(providerUrlstr) - testCluster, err := registerProvider(providerUrl, t) + providerURL, _ := common.NewURL(providerUrlstr) + testCluster, err := registerProvider(providerURL, t) assert.Nil(t, err) defer testCluster.Stop() registryLoad, err := newZookeeperRegistryLoad(fmt.Sprintf("%s:%s", "127.0.0.1", strconv.Itoa(testCluster.Servers[0].Port)), "test-cluster") From 6d2a86c6864f2ffbdc2f8ab799f33bfea88b18f1 Mon Sep 17 00:00:00 2001 From: shen <1292369127@qq.com> Date: Fri, 30 Oct 2020 13:57:17 +0800 Subject: [PATCH 180/227] fix bound Former-commit-id: c589425438a30e63e13ecbd775291e542e18ff99 Former-commit-id: bc9c3f26721fa52797129f0ac751acb1ad0823fd --- pkg/common/constant/dubbo_interface_url.go | 9 --------- pkg/common/constant/interface_url.go | 14 ++++++++++++++ pkg/registry/util.go | 10 +++++----- 3 files changed, 19 insertions(+), 14 deletions(-) delete mode 100644 pkg/common/constant/dubbo_interface_url.go create mode 100644 pkg/common/constant/interface_url.go diff --git a/pkg/common/constant/dubbo_interface_url.go b/pkg/common/constant/dubbo_interface_url.go deleted file mode 100644 index 91e504c4a..000000000 --- a/pkg/common/constant/dubbo_interface_url.go +++ /dev/null @@ -1,9 +0,0 @@ -package constant - -const ( - NAME_KEY = "name" - GROUP_KEY = "group" - VERSION_KEY = "version" - INTERFACE_KEY = "interface" - RETRIES_KEY = "retries" -) diff --git a/pkg/common/constant/interface_url.go b/pkg/common/constant/interface_url.go new file mode 100644 index 000000000..35e784416 --- /dev/null +++ b/pkg/common/constant/interface_url.go @@ -0,0 +1,14 @@ +package constant + +const ( + // NameKey name of interface + NameKey = "name" + // GroupKey group of interface + GroupKey = "group" + // VersionKey Version of interface + VersionKey = "version" + // InterfaceKey interface + InterfaceKey = "interface" + // RetriesKey retry times + RetriesKey = "retries" +) diff --git a/pkg/registry/util.go b/pkg/registry/util.go index 7b2a6736d..a159f7165 100644 --- a/pkg/registry/util.go +++ b/pkg/registry/util.go @@ -33,12 +33,12 @@ func TransferURL2Api(url common.URL, clusterName string) []config.IntegrationReq irs = append(irs, config.IntegrationRequest{ RequestType: url.Protocol, DubboMetadata: dubbo.DubboMetadata{ - ApplicationName: url.GetParam(constant.NAME_KEY, ""), - Group: url.GetParam(constant.GROUP_KEY, ""), - Version: url.GetParam(constant.VERSION_KEY, ""), - Interface: url.GetParam(constant.INTERFACE_KEY, ""), + ApplicationName: url.GetParam(constant.NameKey, ""), + Group: url.GetParam(constant.GroupKey, ""), + Version: url.GetParam(constant.VersionKey, ""), + Interface: url.GetParam(constant.InterfaceKey, ""), Method: method, - Retries: url.GetParam(constant.RETRIES_KEY, ""), + Retries: url.GetParam(constant.RetriesKey, ""), ClusterName: clusterName, ProtocolTypeStr: url.Protocol, }, From 4c748a7efc19e4f0b8c84db68bfc1b2f7969e7ad Mon Sep 17 00:00:00 2001 From: tiecheng Date: Fri, 30 Oct 2020 14:20:34 +0800 Subject: [PATCH 181/227] local run --- configs/conf.yaml | 12 +-- pkg/client/dubbo/dubbo_client.go | 62 ++++++++++--- pkg/proxy/proxy_start.go | 2 +- sample/proxy/api_config.yaml | 64 ++++++++++++++ sample/proxy/conf.yaml | 62 +++++++++++++ sample/sample.md | 2 + sample/server/app/server.go | 78 +++++++++++++++++ sample/server/app/user.go | 144 +++++++++++++++++++++++++++++++ sample/server/app/version.go | 22 +++++ sample/server/config/log.yml | 27 ++++++ sample/server/config/server.yml | 66 ++++++++++++++ 11 files changed, 523 insertions(+), 18 deletions(-) create mode 100644 sample/proxy/api_config.yaml create mode 100644 sample/proxy/conf.yaml create mode 100644 sample/sample.md create mode 100755 sample/server/app/server.go create mode 100755 sample/server/app/user.go create mode 100755 sample/server/app/version.go create mode 100755 sample/server/config/log.yml create mode 100755 sample/server/config/server.yml diff --git a/configs/conf.yaml b/configs/conf.yaml index a8d1b12de..3b71e9abe 100644 --- a/configs/conf.yaml +++ b/configs/conf.yaml @@ -49,13 +49,13 @@ static_resources: request_timeout: "10s" registries: "zookeeper": - - timeout: "3s" - address: "127.0.0.1:2182" - username: "" - password: "" + timeout: "3s" + address: "127.0.0.1:2182" + username: "" + password: "" "consul": - - timeout: "3s" - address: "127.0.0.1:8500" + timeout: "3s" + address: "127.0.0.1:8500" shutdown_config: timeout: "60s" step_timeout: "10s" diff --git a/pkg/client/dubbo/dubbo_client.go b/pkg/client/dubbo/dubbo_client.go index 8723ee612..187c8b858 100644 --- a/pkg/client/dubbo/dubbo_client.go +++ b/pkg/client/dubbo/dubbo_client.go @@ -20,6 +20,8 @@ package dubbo import ( "context" "encoding/json" + "errors" + "github.com/dubbogo/dubbo-go-proxy/pkg/model" "strings" "sync" "time" @@ -47,6 +49,8 @@ var ( _DubboClient *DubboClient onceClient = sync.Once{} dgCfg dg.ConsumerConfig + + clusterCache = make(map[string]*dg.ConsumerConfig, 4) ) // DubboClient client to generic invoke dubbo @@ -76,14 +80,37 @@ func NewDubboClient() *DubboClient { // Init init dubbo, config mapping can do here func (dc *DubboClient) Init() error { - dgCfg = dg.GetConsumerConfig() + // register config + for i := range config.GetBootstrap().StaticResources.Clusters { + cluster := config.GetBootstrap().StaticResources.Clusters[i] + clusterCache[cluster.Name] = &dg.ConsumerConfig{ + Registries: toDubboRegistries(cluster.Registries), + } + } + + //dgCfg = dg.GetConsumerConfig() //can change config here - dg.SetConsumerConfig(dgCfg) - dg.Load() + //dg.SetConsumerConfig(dgCfg) + //dg.Load() dc.GenericServicePool = make(map[string]*dg.GenericService) return nil } +func toDubboRegistries(registries map[string]model.Registry) map[string]*dg.RegistryConfig { + var result = make(map[string]*dg.RegistryConfig, 4) + for k, v := range registries { + result[k] = &dg.RegistryConfig{ + // TODO + Protocol: k, + TimeoutStr: v.Timeout, + Address: v.Address, + Username: v.Username, + Password: v.Password, + } + } + return result +} + // Close func (dc *DubboClient) Close() error { return nil @@ -92,7 +119,11 @@ func (dc *DubboClient) Close() error { // Call invoke service func (dc *DubboClient) Call(r *client.Request) (resp client.Response, err error) { dm := r.API.Method.IntegrationRequest - gs := dc.Get(dm.Interface, dm.Version, dm.Group, dm) + gs, err := dc.Get(r.API.ClusterName, dm.Interface, dm.Version, dm.Group, dm) + + if err != nil { + return client.Response{}, err + } var reqData []interface{} @@ -159,12 +190,21 @@ func (dc *DubboClient) check(key string) bool { } } -func (dc *DubboClient) create(key string, irequest config.IntegrationRequest) *dg.GenericService { +func (dc *DubboClient) create(clusterName, key string, irequest config.IntegrationRequest) (*dg.GenericService, error) { referenceConfig := dg.NewReferenceConfig(irequest.Interface, context.TODO()) referenceConfig.InterfaceName = irequest.Interface referenceConfig.Cluster = constant.DEFAULT_CLUSTER + + cl, ok := clusterCache[clusterName] + if !ok { + return nil, errors.New("cluster not exist") + } + if len(cl.Registries) < 1 { + return nil, errors.New("cluster no registries") + } + var registers []string - for k := range dgCfg.Registries { + for k := range cl.Registries { registers = append(registers, k) } referenceConfig.Registry = strings.Join(registers, ",") @@ -190,15 +230,15 @@ func (dc *DubboClient) create(key string, irequest config.IntegrationRequest) *d clientService := referenceConfig.GetRPCService().(*dg.GenericService) dc.GenericServicePool[key] = clientService - return clientService + return clientService, nil } // Get find a dubbo GenericService -func (dc *DubboClient) Get(interfaceName, version, group string, ir config.IntegrationRequest) *dg.GenericService { - key := strings.Join([]string{ir.ApplicationName, interfaceName, version, group}, "_") +func (dc *DubboClient) Get(clusterName, interfaceName, version, group string, ir config.IntegrationRequest) (*dg.GenericService, error) { + key := strings.Join([]string{clusterName, ir.ApplicationName, interfaceName, version, group}, "_") if dc.check(key) { - return dc.get(key) + return dc.get(key), nil } - return dc.create(key, ir) + return dc.create(clusterName, key, ir) } diff --git a/pkg/proxy/proxy_start.go b/pkg/proxy/proxy_start.go index 609c14bd3..8a180a141 100644 --- a/pkg/proxy/proxy_start.go +++ b/pkg/proxy/proxy_start.go @@ -18,11 +18,11 @@ package proxy import ( + "github.com/dubbogo/dubbo-go-proxy/pkg/client/dubbo" "sync" ) import ( - "github.com/dubbogo/dubbo-go-proxy/pkg/client/dubbo" "github.com/dubbogo/dubbo-go-proxy/pkg/config" _ "github.com/dubbogo/dubbo-go-proxy/pkg/filter" "github.com/dubbogo/dubbo-go-proxy/pkg/logger" diff --git a/sample/proxy/api_config.yaml b/sample/proxy/api_config.yaml new file mode 100644 index 000000000..6b4222813 --- /dev/null +++ b/sample/proxy/api_config.yaml @@ -0,0 +1,64 @@ +name: getUserByName +description: get user by name +resources: + - path: '/api/v1/test-dubbo/user' + type: restful + description: resource documentation + filters: + - filter0 + methods: + - httpVerb: GET + onAir: true + inboundRequest: + requestType: http + queryStrings: + - name: name + required: true + integrationRequest: + requestType: dubbo + mappingParams: + - name: queryStrings.name + mapTo: 1 + applicationName: "UserProvider" + interface: "com.ic.user.UserProvider" + method: "GetUserByName" + group: "test" + version: 1.0.0 + clusterName: "test_dubbo" + - path: '/api/v1/test-dubbo/user' + type: restful + description: resource documentation + filters: + - filter0 + methods: + - httpVerb: POST + onAir: true + inboundRequest: + requestType: http + requestBody: + - definitionName: userCreate + integrationRequest: + requestType: dubbo + applicationName: "UserProvider" + interface: "com.ic.user.UserProvider" + method: "CreateUser" + clusterName: "test_dubbo" + group: "test" + version: 1.0.0 +definitions: + - name: userCreate + schema: >- + { + "type" : "object", + "properties" : { + "id" : { + "type" : "integer" + }, + "name" : { + "type" : "string" + }, + "age" : { + "type" : "integer" + } + } + } diff --git a/sample/proxy/conf.yaml b/sample/proxy/conf.yaml new file mode 100644 index 000000000..3b71e9abe --- /dev/null +++ b/sample/proxy/conf.yaml @@ -0,0 +1,62 @@ +--- +static_resources: + listeners: + - name: "net/http" + address: + socket_address: + protocol_type: "HTTP" + address: "0.0.0.0" + port: 8888 + filter_chains: + - filter_chain_match: + domains: + - api.dubbo.com + - api.proxy.com + filters: + - name: dgp.filters.http_connect_manager + config: + route_config: + routes: + - match: + prefix: "/api/v1" + headers: + - name: "X-DGP-WAY" + value: "dubbo" + route: + cluster: "test_dubbo" + cluster_not_found_response_code: 505 + cors: + allow_origin: + - "*" + enabled: true + http_filters: + - name: dgp.filters.http.api + config: + - name: dgp.filters.http.router + config: + - name: dgp.filters.http_transfer_dubbo + config: + server_name: "test_http_dubbo" + generate_request_id: false + config: + idle_timeout: 5s + read_timeout: 5s + write_timeout: 5s + clusters: + - name: "test_dubbo" + lb_policy: "RoundRobin" + connect_timeout: "5s" + request_timeout: "10s" + registries: + "zookeeper": + timeout: "3s" + address: "127.0.0.1:2182" + username: "" + password: "" + "consul": + timeout: "3s" + address: "127.0.0.1:8500" + shutdown_config: + timeout: "60s" + step_timeout: "10s" + reject_policy: "immediacy" \ No newline at end of file diff --git a/sample/sample.md b/sample/sample.md new file mode 100644 index 000000000..662c1fd3a --- /dev/null +++ b/sample/sample.md @@ -0,0 +1,2 @@ +# 本地例子 + diff --git a/sample/server/app/server.go b/sample/server/app/server.go new file mode 100755 index 000000000..00d924a97 --- /dev/null +++ b/sample/server/app/server.go @@ -0,0 +1,78 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + */ + +package main + +import ( + "fmt" + "os" + "os/signal" + "syscall" + "time" +) + +import ( + hessian "github.com/apache/dubbo-go-hessian2" + "github.com/apache/dubbo-go/common/logger" + "github.com/apache/dubbo-go/config" + _ "github.com/apache/dubbo-go/protocol/dubbo" + _ "github.com/apache/dubbo-go/registry/protocol" + + _ "github.com/apache/dubbo-go/common/proxy/proxy_factory" + _ "github.com/apache/dubbo-go/filter/filter_impl" + + _ "github.com/apache/dubbo-go/cluster/cluster_impl" + _ "github.com/apache/dubbo-go/cluster/loadbalance" + _ "github.com/apache/dubbo-go/registry/zookeeper" +) + +var ( + survivalTimeout = int(3e9) +) + +// they are necessary: +// export CONF_PROVIDER_FILE_PATH="xxx" +// export APP_LOG_CONF_FILE="xxx" +func main() { + hessian.RegisterPOJO(&User{}) + config.Load() + + initSignal() +} + +func initSignal() { + signals := make(chan os.Signal, 1) + // It is not possible to block SIGKILL or syscall.SIGSTOP + signal.Notify(signals, os.Interrupt, os.Kill, syscall.SIGHUP, syscall.SIGQUIT, syscall.SIGTERM, syscall.SIGINT) + for { + sig := <-signals + logger.Infof("get signal %s", sig.String()) + switch sig { + case syscall.SIGHUP: + // reload() + default: + time.AfterFunc(time.Duration(survivalTimeout), func() { + logger.Warnf("app exit now by force...") + os.Exit(1) + }) + + // The program exits normally or timeout forcibly exits. + fmt.Println("provider app exit now...") + return + } + } +} diff --git a/sample/server/app/user.go b/sample/server/app/user.go new file mode 100755 index 000000000..27602514e --- /dev/null +++ b/sample/server/app/user.go @@ -0,0 +1,144 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + */ + +package main + +import ( + "context" + "errors" + "fmt" + "sync" + "time" +) + +import ( + hessian "github.com/apache/dubbo-go-hessian2" + "github.com/apache/dubbo-go/config" +) + +func init() { + config.SetProviderService(new(UserProvider)) + // ------for hessian2------ + hessian.RegisterPOJO(&User{}) + + cache = &UserDB{ + cacheMap: make(map[string]*User, 16), + lock: sync.Mutex{}, + } +} + +var cache *UserDB + +type UserDB struct { + // key is name, value is user obj + cacheMap map[string]*User + lock sync.Mutex +} + +func (db *UserDB) Add(u *User) bool { + db.lock.Lock() + defer db.lock.Unlock() + + db.cacheMap[u.Name] = u + return true +} + +func (db *UserDB) Get(n string) (*User, bool) { + db.lock.Lock() + defer db.lock.Unlock() + + r, ok := db.cacheMap[n] + return r, ok +} + +type User struct { + Id string + Name string + Age int32 + Time time.Time +} + +// version: 1.0.0 group: test +// methods: all +type UserProvider struct { +} + +func (u *UserProvider) CreateUser(ctx context.Context, user *User) (*User, error) { + println("Req QueryUser data:%#v", user) + if user == nil { + return nil, errors.New("not found") + } + _, ok := cache.Get(user.Name) + if ok { + return nil, errors.New("data is exist") + } + + cache.Add(user) + + return user, nil +} + +func (u *UserProvider) GetUserByName(ctx context.Context, name string) (*User, error) { + println("Req GetUserByName data:%#v", name) + r, ok := cache.Get(name) + if ok { + println("Req GetUserByName result:%#v", r) + return r, nil + } + + return nil, nil +} + +func (u *UserProvider) QueryUser(ctx context.Context, user *User) (*User, error) { + println("Req QueryUser data:%#v", user) + rsp := User{user.Id, user.Name, user.Age, time.Now()} + println("Req QueryUser data:%#v", rsp) + return &rsp, nil +} + +func (u *UserProvider) TwoSimpleParams(ctx context.Context, name string, age int32) (*User, error) { + println("Req TwoSimpleParams name:%s, age:%d", name, age) + rsp := User{"1", name, age, time.Now()} + println("Req TwoSimpleParams data:%#v", rsp) + return &rsp, nil +} + +func (u *UserProvider) TwoSimpleParamsWithError(ctx context.Context, name string, age int32) (*User, error) { + println("Req TwoSimpleParamsWithError name:%s, age:%d", name, age) + rsp := User{"1", name, age, time.Now()} + println("Req TwoSimpleParamsWithError data:%#v", rsp) + return &rsp, errors.New("TwoSimpleParams error") +} + +// 方法名称映射 +func (u *UserProvider) MethodMapper() map[string]string { + return map[string]string{ + "GetUserByName": "queryUserByName", + } +} + +func (u *UserProvider) Reference() string { + return "UserProvider" +} + +func (u User) JavaClassName() string { + return "com.ikurento.user.User" +} + +func println(format string, args ...interface{}) { + fmt.Printf("\033[32;40m"+format+"\033[0m\n", args...) +} diff --git a/sample/server/app/version.go b/sample/server/app/version.go new file mode 100755 index 000000000..ae51f45d9 --- /dev/null +++ b/sample/server/app/version.go @@ -0,0 +1,22 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + */ + +package main + +var ( + Version = "2.7.5" +) diff --git a/sample/server/config/log.yml b/sample/server/config/log.yml new file mode 100755 index 000000000..47f9e60f7 --- /dev/null +++ b/sample/server/config/log.yml @@ -0,0 +1,27 @@ +level: "info" +development: true +disableCaller: false +disableStacktrace: false +sampling: +encoding: "console" + +# encoder +encoderConfig: + messageKey: "message" + levelKey: "level" + timeKey: "time" + nameKey: "logger" + callerKey: "caller" + stacktraceKey: "stacktrace" + lineEnding: "" + levelEncoder: "capitalColor" + timeEncoder: "iso8601" + durationEncoder: "seconds" + callerEncoder: "short" + nameEncoder: "" + +outputPaths: + - "stderr" +errorOutputPaths: + - "stderr" +initialFields: diff --git a/sample/server/config/server.yml b/sample/server/config/server.yml new file mode 100755 index 000000000..101234a7d --- /dev/null +++ b/sample/server/config/server.yml @@ -0,0 +1,66 @@ +# dubbo server yaml configure file + + +# application config +application: + organization: "dubbogoproxy.com" + name: "User Micro Service" + module: "dubbogoproxy user-info server" + version: "0.0.1" + owner: "ZX" + environment: "dev" + +registries: + "zk1": + protocol: "zookeeper" + timeout: "3s" + address: "127.0.0.1:2181" + +services: + "UserProvider": + # 可以指定多个registry,使用逗号隔开;不指定默认向所有注册中心注册 + registry: "zk1" + protocol: "dubbo" + # 相当于dubbo.xml中的interface + interface: "com.ic.user.UserProvider" + loadbalance: "random" + warmup: "100" + cluster: "failover" + version: 1.0.0 + group: test + methods: + - name: "CreateUser" + retries: 1 + - name: "GetUser" + retries: 1 + loadbalance: "random" + - name: "QueryUser" + retries: 1 + loadbalance: "random" + - name: "TwoSimpleParams" + retries: 1 + loadbalance: "random" + +protocols: + "dubbo": + name: "dubbo" + port: 20000 + +protocol_conf: + dubbo: + session_number: 700 + session_timeout: "20s" + getty_session_param: + compress_encoding: false + tcp_no_delay: true + tcp_keep_alive: true + keep_alive_period: "120s" + tcp_r_buf_size: 262144 + tcp_w_buf_size: 65536 + pkg_rq_size: 1024 + pkg_wq_size: 512 + tcp_read_timeout: "1s" + tcp_write_timeout: "5s" + wait_timeout: "1s" + max_msg_len: 1024 + session_name: "server" From 37303a34fe8eb80df6465c0f6ff760c0174cf57c Mon Sep 17 00:00:00 2001 From: tiecheng Date: Fri, 30 Oct 2020 14:28:32 +0800 Subject: [PATCH 182/227] first test zk --- .github/workflows/github-actions.yml | 5 +++- .travis.yml | 8 ++++++ before_ut.sh | 43 ++++++++++++++++++++++++++++ 3 files changed, 55 insertions(+), 1 deletion(-) create mode 100755 before_ut.sh diff --git a/.github/workflows/github-actions.yml b/.github/workflows/github-actions.yml index e4816633c..3e93f2c60 100644 --- a/.github/workflows/github-actions.yml +++ b/.github/workflows/github-actions.yml @@ -68,7 +68,10 @@ jobs: /tmp/tools/license/license-header-checker -v -a -r -i vendor /tmp/tools/license/license.txt . go && [[ -z `git status -s` ]] - name: Go Test - run: GO111MODULE=on && go mod vendor && go test ./... -bench . -race -v -coverprofile=coverage.txt + run: | + chmod u+x before_ut.sh && ./before_ut.sh + go mod vendor && go test ./... -coverprofile=coverage.txt -covermode=atomic +# chmod +x integrate_test.sh && ./integrate_test.sh - name: Coverage run: bash <(curl -s https://codecov.io/bash) diff --git a/.travis.yml b/.travis.yml index e0dbd425e..514a0d5b2 100644 --- a/.travis.yml +++ b/.travis.yml @@ -9,8 +9,16 @@ install: true script: - go fmt ./... && [[ -z `git status -s` ]] + - sh before_validate_license.sh + - chmod u+x /tmp/tools/license/license-header-checker + - /tmp/tools/license/license-header-checker -v -a -r -i vendor /tmp/tools/license/license.txt . go && [[ -z `git status -s` ]] + # unit-test - echo 'start unit-test' + - chmod u+x before_ut.sh && ./before_ut.sh - go mod vendor && go test ./... -coverprofile=coverage.txt -covermode=atomic +after_success: + - bash <(curl -s https://codecov.io/bash) + notifications: webhooks: https://oapi.dingtalk.com/robot/send?access_token=e6b085c90561a7543cc5fde89e9c8108100460c15e955c0604fea180a500a0ad diff --git a/before_ut.sh b/before_ut.sh new file mode 100755 index 000000000..b55e424ef --- /dev/null +++ b/before_ut.sh @@ -0,0 +1,43 @@ +# +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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. + +zkJarName="zookeeper-3.4.9-fatjar.jar" +remoteJarUrl="https://github.com/dubbogo/resources/raw/master/zookeeper-4unitest/contrib/fatjar/${zkJarName}" +zkJarPath="remoting/zookeeper/zookeeper-4unittest/contrib/fatjar" +zkJar="${zkJarPath}/${zkJarName}" + +if [ ! -f "${zkJar}" ]; then + mkdir -p ${zkJarPath} + wget -P "${zkJarPath}" ${remoteJarUrl} +fi + +mkdir -p config_center/zookeeper/zookeeper-4unittest/contrib/fatjar +cp ${zkJar} config_center/zookeeper/zookeeper-4unittest/contrib/fatjar + +mkdir -p registry/zookeeper/zookeeper-4unittest/contrib/fatjar +cp ${zkJar} registry/zookeeper/zookeeper-4unittest/contrib/fatjar + +mkdir -p cluster/router/chain/zookeeper-4unittest/contrib/fatjar +cp ${zkJar} cluster/router/chain/zookeeper-4unittest/contrib/fatjar + +mkdir -p cluster/router/condition/zookeeper-4unittest/contrib/fatjar +cp ${zkJar} cluster/router/condition/zookeeper-4unittest/contrib/fatjar + +mkdir -p cluster/router/tag/zookeeper-4unittest/contrib/fatjar +cp ${zkJar} cluster/router/tag/zookeeper-4unittest/contrib/fatjar + +mkdir -p metadata/report/zookeeper/zookeeper-4unittest/contrib/fatjar +cp ${zkJar} metadata/report/zookeeper/zookeeper-4unittest/contrib/fatjar \ No newline at end of file From 5387a48c0b2af5e866f622fd3bee70a16b791a89 Mon Sep 17 00:00:00 2001 From: tiecheng Date: Fri, 30 Oct 2020 14:39:09 +0800 Subject: [PATCH 183/227] reset local --- configs/conf.yaml | 12 +-- pkg/client/dubbo/dubbo_client.go | 62 +++---------- pkg/proxy/proxy_start.go | 2 +- sample/proxy/api_config.yaml | 64 -------------- sample/proxy/conf.yaml | 62 ------------- sample/sample.md | 2 - sample/server/app/server.go | 78 ----------------- sample/server/app/user.go | 144 ------------------------------- sample/server/app/version.go | 22 ----- sample/server/config/log.yml | 27 ------ sample/server/config/server.yml | 66 -------------- 11 files changed, 18 insertions(+), 523 deletions(-) delete mode 100644 sample/proxy/api_config.yaml delete mode 100644 sample/proxy/conf.yaml delete mode 100644 sample/sample.md delete mode 100755 sample/server/app/server.go delete mode 100755 sample/server/app/user.go delete mode 100755 sample/server/app/version.go delete mode 100755 sample/server/config/log.yml delete mode 100755 sample/server/config/server.yml diff --git a/configs/conf.yaml b/configs/conf.yaml index 3b71e9abe..a8d1b12de 100644 --- a/configs/conf.yaml +++ b/configs/conf.yaml @@ -49,13 +49,13 @@ static_resources: request_timeout: "10s" registries: "zookeeper": - timeout: "3s" - address: "127.0.0.1:2182" - username: "" - password: "" + - timeout: "3s" + address: "127.0.0.1:2182" + username: "" + password: "" "consul": - timeout: "3s" - address: "127.0.0.1:8500" + - timeout: "3s" + address: "127.0.0.1:8500" shutdown_config: timeout: "60s" step_timeout: "10s" diff --git a/pkg/client/dubbo/dubbo_client.go b/pkg/client/dubbo/dubbo_client.go index 187c8b858..8723ee612 100644 --- a/pkg/client/dubbo/dubbo_client.go +++ b/pkg/client/dubbo/dubbo_client.go @@ -20,8 +20,6 @@ package dubbo import ( "context" "encoding/json" - "errors" - "github.com/dubbogo/dubbo-go-proxy/pkg/model" "strings" "sync" "time" @@ -49,8 +47,6 @@ var ( _DubboClient *DubboClient onceClient = sync.Once{} dgCfg dg.ConsumerConfig - - clusterCache = make(map[string]*dg.ConsumerConfig, 4) ) // DubboClient client to generic invoke dubbo @@ -80,37 +76,14 @@ func NewDubboClient() *DubboClient { // Init init dubbo, config mapping can do here func (dc *DubboClient) Init() error { - // register config - for i := range config.GetBootstrap().StaticResources.Clusters { - cluster := config.GetBootstrap().StaticResources.Clusters[i] - clusterCache[cluster.Name] = &dg.ConsumerConfig{ - Registries: toDubboRegistries(cluster.Registries), - } - } - - //dgCfg = dg.GetConsumerConfig() + dgCfg = dg.GetConsumerConfig() //can change config here - //dg.SetConsumerConfig(dgCfg) - //dg.Load() + dg.SetConsumerConfig(dgCfg) + dg.Load() dc.GenericServicePool = make(map[string]*dg.GenericService) return nil } -func toDubboRegistries(registries map[string]model.Registry) map[string]*dg.RegistryConfig { - var result = make(map[string]*dg.RegistryConfig, 4) - for k, v := range registries { - result[k] = &dg.RegistryConfig{ - // TODO - Protocol: k, - TimeoutStr: v.Timeout, - Address: v.Address, - Username: v.Username, - Password: v.Password, - } - } - return result -} - // Close func (dc *DubboClient) Close() error { return nil @@ -119,11 +92,7 @@ func (dc *DubboClient) Close() error { // Call invoke service func (dc *DubboClient) Call(r *client.Request) (resp client.Response, err error) { dm := r.API.Method.IntegrationRequest - gs, err := dc.Get(r.API.ClusterName, dm.Interface, dm.Version, dm.Group, dm) - - if err != nil { - return client.Response{}, err - } + gs := dc.Get(dm.Interface, dm.Version, dm.Group, dm) var reqData []interface{} @@ -190,21 +159,12 @@ func (dc *DubboClient) check(key string) bool { } } -func (dc *DubboClient) create(clusterName, key string, irequest config.IntegrationRequest) (*dg.GenericService, error) { +func (dc *DubboClient) create(key string, irequest config.IntegrationRequest) *dg.GenericService { referenceConfig := dg.NewReferenceConfig(irequest.Interface, context.TODO()) referenceConfig.InterfaceName = irequest.Interface referenceConfig.Cluster = constant.DEFAULT_CLUSTER - - cl, ok := clusterCache[clusterName] - if !ok { - return nil, errors.New("cluster not exist") - } - if len(cl.Registries) < 1 { - return nil, errors.New("cluster no registries") - } - var registers []string - for k := range cl.Registries { + for k := range dgCfg.Registries { registers = append(registers, k) } referenceConfig.Registry = strings.Join(registers, ",") @@ -230,15 +190,15 @@ func (dc *DubboClient) create(clusterName, key string, irequest config.Integrati clientService := referenceConfig.GetRPCService().(*dg.GenericService) dc.GenericServicePool[key] = clientService - return clientService, nil + return clientService } // Get find a dubbo GenericService -func (dc *DubboClient) Get(clusterName, interfaceName, version, group string, ir config.IntegrationRequest) (*dg.GenericService, error) { - key := strings.Join([]string{clusterName, ir.ApplicationName, interfaceName, version, group}, "_") +func (dc *DubboClient) Get(interfaceName, version, group string, ir config.IntegrationRequest) *dg.GenericService { + key := strings.Join([]string{ir.ApplicationName, interfaceName, version, group}, "_") if dc.check(key) { - return dc.get(key), nil + return dc.get(key) } - return dc.create(clusterName, key, ir) + return dc.create(key, ir) } diff --git a/pkg/proxy/proxy_start.go b/pkg/proxy/proxy_start.go index 8a180a141..609c14bd3 100644 --- a/pkg/proxy/proxy_start.go +++ b/pkg/proxy/proxy_start.go @@ -18,11 +18,11 @@ package proxy import ( - "github.com/dubbogo/dubbo-go-proxy/pkg/client/dubbo" "sync" ) import ( + "github.com/dubbogo/dubbo-go-proxy/pkg/client/dubbo" "github.com/dubbogo/dubbo-go-proxy/pkg/config" _ "github.com/dubbogo/dubbo-go-proxy/pkg/filter" "github.com/dubbogo/dubbo-go-proxy/pkg/logger" diff --git a/sample/proxy/api_config.yaml b/sample/proxy/api_config.yaml deleted file mode 100644 index 6b4222813..000000000 --- a/sample/proxy/api_config.yaml +++ /dev/null @@ -1,64 +0,0 @@ -name: getUserByName -description: get user by name -resources: - - path: '/api/v1/test-dubbo/user' - type: restful - description: resource documentation - filters: - - filter0 - methods: - - httpVerb: GET - onAir: true - inboundRequest: - requestType: http - queryStrings: - - name: name - required: true - integrationRequest: - requestType: dubbo - mappingParams: - - name: queryStrings.name - mapTo: 1 - applicationName: "UserProvider" - interface: "com.ic.user.UserProvider" - method: "GetUserByName" - group: "test" - version: 1.0.0 - clusterName: "test_dubbo" - - path: '/api/v1/test-dubbo/user' - type: restful - description: resource documentation - filters: - - filter0 - methods: - - httpVerb: POST - onAir: true - inboundRequest: - requestType: http - requestBody: - - definitionName: userCreate - integrationRequest: - requestType: dubbo - applicationName: "UserProvider" - interface: "com.ic.user.UserProvider" - method: "CreateUser" - clusterName: "test_dubbo" - group: "test" - version: 1.0.0 -definitions: - - name: userCreate - schema: >- - { - "type" : "object", - "properties" : { - "id" : { - "type" : "integer" - }, - "name" : { - "type" : "string" - }, - "age" : { - "type" : "integer" - } - } - } diff --git a/sample/proxy/conf.yaml b/sample/proxy/conf.yaml deleted file mode 100644 index 3b71e9abe..000000000 --- a/sample/proxy/conf.yaml +++ /dev/null @@ -1,62 +0,0 @@ ---- -static_resources: - listeners: - - name: "net/http" - address: - socket_address: - protocol_type: "HTTP" - address: "0.0.0.0" - port: 8888 - filter_chains: - - filter_chain_match: - domains: - - api.dubbo.com - - api.proxy.com - filters: - - name: dgp.filters.http_connect_manager - config: - route_config: - routes: - - match: - prefix: "/api/v1" - headers: - - name: "X-DGP-WAY" - value: "dubbo" - route: - cluster: "test_dubbo" - cluster_not_found_response_code: 505 - cors: - allow_origin: - - "*" - enabled: true - http_filters: - - name: dgp.filters.http.api - config: - - name: dgp.filters.http.router - config: - - name: dgp.filters.http_transfer_dubbo - config: - server_name: "test_http_dubbo" - generate_request_id: false - config: - idle_timeout: 5s - read_timeout: 5s - write_timeout: 5s - clusters: - - name: "test_dubbo" - lb_policy: "RoundRobin" - connect_timeout: "5s" - request_timeout: "10s" - registries: - "zookeeper": - timeout: "3s" - address: "127.0.0.1:2182" - username: "" - password: "" - "consul": - timeout: "3s" - address: "127.0.0.1:8500" - shutdown_config: - timeout: "60s" - step_timeout: "10s" - reject_policy: "immediacy" \ No newline at end of file diff --git a/sample/sample.md b/sample/sample.md deleted file mode 100644 index 662c1fd3a..000000000 --- a/sample/sample.md +++ /dev/null @@ -1,2 +0,0 @@ -# 本地例子 - diff --git a/sample/server/app/server.go b/sample/server/app/server.go deleted file mode 100755 index 00d924a97..000000000 --- a/sample/server/app/server.go +++ /dev/null @@ -1,78 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You 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. - */ - -package main - -import ( - "fmt" - "os" - "os/signal" - "syscall" - "time" -) - -import ( - hessian "github.com/apache/dubbo-go-hessian2" - "github.com/apache/dubbo-go/common/logger" - "github.com/apache/dubbo-go/config" - _ "github.com/apache/dubbo-go/protocol/dubbo" - _ "github.com/apache/dubbo-go/registry/protocol" - - _ "github.com/apache/dubbo-go/common/proxy/proxy_factory" - _ "github.com/apache/dubbo-go/filter/filter_impl" - - _ "github.com/apache/dubbo-go/cluster/cluster_impl" - _ "github.com/apache/dubbo-go/cluster/loadbalance" - _ "github.com/apache/dubbo-go/registry/zookeeper" -) - -var ( - survivalTimeout = int(3e9) -) - -// they are necessary: -// export CONF_PROVIDER_FILE_PATH="xxx" -// export APP_LOG_CONF_FILE="xxx" -func main() { - hessian.RegisterPOJO(&User{}) - config.Load() - - initSignal() -} - -func initSignal() { - signals := make(chan os.Signal, 1) - // It is not possible to block SIGKILL or syscall.SIGSTOP - signal.Notify(signals, os.Interrupt, os.Kill, syscall.SIGHUP, syscall.SIGQUIT, syscall.SIGTERM, syscall.SIGINT) - for { - sig := <-signals - logger.Infof("get signal %s", sig.String()) - switch sig { - case syscall.SIGHUP: - // reload() - default: - time.AfterFunc(time.Duration(survivalTimeout), func() { - logger.Warnf("app exit now by force...") - os.Exit(1) - }) - - // The program exits normally or timeout forcibly exits. - fmt.Println("provider app exit now...") - return - } - } -} diff --git a/sample/server/app/user.go b/sample/server/app/user.go deleted file mode 100755 index 27602514e..000000000 --- a/sample/server/app/user.go +++ /dev/null @@ -1,144 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You 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. - */ - -package main - -import ( - "context" - "errors" - "fmt" - "sync" - "time" -) - -import ( - hessian "github.com/apache/dubbo-go-hessian2" - "github.com/apache/dubbo-go/config" -) - -func init() { - config.SetProviderService(new(UserProvider)) - // ------for hessian2------ - hessian.RegisterPOJO(&User{}) - - cache = &UserDB{ - cacheMap: make(map[string]*User, 16), - lock: sync.Mutex{}, - } -} - -var cache *UserDB - -type UserDB struct { - // key is name, value is user obj - cacheMap map[string]*User - lock sync.Mutex -} - -func (db *UserDB) Add(u *User) bool { - db.lock.Lock() - defer db.lock.Unlock() - - db.cacheMap[u.Name] = u - return true -} - -func (db *UserDB) Get(n string) (*User, bool) { - db.lock.Lock() - defer db.lock.Unlock() - - r, ok := db.cacheMap[n] - return r, ok -} - -type User struct { - Id string - Name string - Age int32 - Time time.Time -} - -// version: 1.0.0 group: test -// methods: all -type UserProvider struct { -} - -func (u *UserProvider) CreateUser(ctx context.Context, user *User) (*User, error) { - println("Req QueryUser data:%#v", user) - if user == nil { - return nil, errors.New("not found") - } - _, ok := cache.Get(user.Name) - if ok { - return nil, errors.New("data is exist") - } - - cache.Add(user) - - return user, nil -} - -func (u *UserProvider) GetUserByName(ctx context.Context, name string) (*User, error) { - println("Req GetUserByName data:%#v", name) - r, ok := cache.Get(name) - if ok { - println("Req GetUserByName result:%#v", r) - return r, nil - } - - return nil, nil -} - -func (u *UserProvider) QueryUser(ctx context.Context, user *User) (*User, error) { - println("Req QueryUser data:%#v", user) - rsp := User{user.Id, user.Name, user.Age, time.Now()} - println("Req QueryUser data:%#v", rsp) - return &rsp, nil -} - -func (u *UserProvider) TwoSimpleParams(ctx context.Context, name string, age int32) (*User, error) { - println("Req TwoSimpleParams name:%s, age:%d", name, age) - rsp := User{"1", name, age, time.Now()} - println("Req TwoSimpleParams data:%#v", rsp) - return &rsp, nil -} - -func (u *UserProvider) TwoSimpleParamsWithError(ctx context.Context, name string, age int32) (*User, error) { - println("Req TwoSimpleParamsWithError name:%s, age:%d", name, age) - rsp := User{"1", name, age, time.Now()} - println("Req TwoSimpleParamsWithError data:%#v", rsp) - return &rsp, errors.New("TwoSimpleParams error") -} - -// 方法名称映射 -func (u *UserProvider) MethodMapper() map[string]string { - return map[string]string{ - "GetUserByName": "queryUserByName", - } -} - -func (u *UserProvider) Reference() string { - return "UserProvider" -} - -func (u User) JavaClassName() string { - return "com.ikurento.user.User" -} - -func println(format string, args ...interface{}) { - fmt.Printf("\033[32;40m"+format+"\033[0m\n", args...) -} diff --git a/sample/server/app/version.go b/sample/server/app/version.go deleted file mode 100755 index ae51f45d9..000000000 --- a/sample/server/app/version.go +++ /dev/null @@ -1,22 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You 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. - */ - -package main - -var ( - Version = "2.7.5" -) diff --git a/sample/server/config/log.yml b/sample/server/config/log.yml deleted file mode 100755 index 47f9e60f7..000000000 --- a/sample/server/config/log.yml +++ /dev/null @@ -1,27 +0,0 @@ -level: "info" -development: true -disableCaller: false -disableStacktrace: false -sampling: -encoding: "console" - -# encoder -encoderConfig: - messageKey: "message" - levelKey: "level" - timeKey: "time" - nameKey: "logger" - callerKey: "caller" - stacktraceKey: "stacktrace" - lineEnding: "" - levelEncoder: "capitalColor" - timeEncoder: "iso8601" - durationEncoder: "seconds" - callerEncoder: "short" - nameEncoder: "" - -outputPaths: - - "stderr" -errorOutputPaths: - - "stderr" -initialFields: diff --git a/sample/server/config/server.yml b/sample/server/config/server.yml deleted file mode 100755 index 101234a7d..000000000 --- a/sample/server/config/server.yml +++ /dev/null @@ -1,66 +0,0 @@ -# dubbo server yaml configure file - - -# application config -application: - organization: "dubbogoproxy.com" - name: "User Micro Service" - module: "dubbogoproxy user-info server" - version: "0.0.1" - owner: "ZX" - environment: "dev" - -registries: - "zk1": - protocol: "zookeeper" - timeout: "3s" - address: "127.0.0.1:2181" - -services: - "UserProvider": - # 可以指定多个registry,使用逗号隔开;不指定默认向所有注册中心注册 - registry: "zk1" - protocol: "dubbo" - # 相当于dubbo.xml中的interface - interface: "com.ic.user.UserProvider" - loadbalance: "random" - warmup: "100" - cluster: "failover" - version: 1.0.0 - group: test - methods: - - name: "CreateUser" - retries: 1 - - name: "GetUser" - retries: 1 - loadbalance: "random" - - name: "QueryUser" - retries: 1 - loadbalance: "random" - - name: "TwoSimpleParams" - retries: 1 - loadbalance: "random" - -protocols: - "dubbo": - name: "dubbo" - port: 20000 - -protocol_conf: - dubbo: - session_number: 700 - session_timeout: "20s" - getty_session_param: - compress_encoding: false - tcp_no_delay: true - tcp_keep_alive: true - keep_alive_period: "120s" - tcp_r_buf_size: 262144 - tcp_w_buf_size: 65536 - pkg_rq_size: 1024 - pkg_wq_size: 512 - tcp_read_timeout: "1s" - tcp_write_timeout: "5s" - wait_timeout: "1s" - max_msg_len: 1024 - session_name: "server" From 5ca992eb2e8ccffc7fd3838f84b903191358c716 Mon Sep 17 00:00:00 2001 From: tiecheng Date: Fri, 30 Oct 2020 14:58:37 +0800 Subject: [PATCH 184/227] download zk --- before_ut.sh | 22 ++-------------------- 1 file changed, 2 insertions(+), 20 deletions(-) diff --git a/before_ut.sh b/before_ut.sh index b55e424ef..2d6e27f6f 100755 --- a/before_ut.sh +++ b/before_ut.sh @@ -16,28 +16,10 @@ zkJarName="zookeeper-3.4.9-fatjar.jar" remoteJarUrl="https://github.com/dubbogo/resources/raw/master/zookeeper-4unitest/contrib/fatjar/${zkJarName}" -zkJarPath="remoting/zookeeper/zookeeper-4unittest/contrib/fatjar" +zkJarPath="registry/zookeeper/zookeeper-4unittest/contrib/fatjar" zkJar="${zkJarPath}/${zkJarName}" if [ ! -f "${zkJar}" ]; then mkdir -p ${zkJarPath} wget -P "${zkJarPath}" ${remoteJarUrl} -fi - -mkdir -p config_center/zookeeper/zookeeper-4unittest/contrib/fatjar -cp ${zkJar} config_center/zookeeper/zookeeper-4unittest/contrib/fatjar - -mkdir -p registry/zookeeper/zookeeper-4unittest/contrib/fatjar -cp ${zkJar} registry/zookeeper/zookeeper-4unittest/contrib/fatjar - -mkdir -p cluster/router/chain/zookeeper-4unittest/contrib/fatjar -cp ${zkJar} cluster/router/chain/zookeeper-4unittest/contrib/fatjar - -mkdir -p cluster/router/condition/zookeeper-4unittest/contrib/fatjar -cp ${zkJar} cluster/router/condition/zookeeper-4unittest/contrib/fatjar - -mkdir -p cluster/router/tag/zookeeper-4unittest/contrib/fatjar -cp ${zkJar} cluster/router/tag/zookeeper-4unittest/contrib/fatjar - -mkdir -p metadata/report/zookeeper/zookeeper-4unittest/contrib/fatjar -cp ${zkJar} metadata/report/zookeeper/zookeeper-4unittest/contrib/fatjar \ No newline at end of file +fi \ No newline at end of file From 260c8de3c61ef5d4f00e9e4c7a36cdea13e301b6 Mon Sep 17 00:00:00 2001 From: shen <1292369127@qq.com> Date: Fri, 30 Oct 2020 16:19:35 +0800 Subject: [PATCH 185/227] remove zookeeper folder Former-commit-id: 962c8e763b1659c3f6e63ba29c161571c530e64e Former-commit-id: 0adae99091123119294b7fab042177cbf57005c1 --- pkg/registry/zookeeper-3.4.6/CHANGES.txt | 2276 -- pkg/registry/zookeeper-3.4.6/LICENSE.txt | 202 - pkg/registry/zookeeper-3.4.6/NOTICE.txt | 5 - pkg/registry/zookeeper-3.4.6/README.txt | 36 - .../zookeeper-3.4.6/README_packaging.txt | 65 - pkg/registry/zookeeper-3.4.6/bin/README.txt | 6 - pkg/registry/zookeeper-3.4.6/bin/zkCleanup.sh | 51 - pkg/registry/zookeeper-3.4.6/bin/zkCli.cmd | 24 - pkg/registry/zookeeper-3.4.6/bin/zkCli.sh | 41 - pkg/registry/zookeeper-3.4.6/bin/zkEnv.cmd | 34 - pkg/registry/zookeeper-3.4.6/bin/zkEnv.sh | 115 - pkg/registry/zookeeper-3.4.6/bin/zkServer.cmd | 25 - pkg/registry/zookeeper-3.4.6/bin/zkServer.sh | 186 - pkg/registry/zookeeper-3.4.6/build.xml | 1805 -- .../zookeeper-3.4.6/conf/configuration.xsl | 24 - .../zookeeper-3.4.6/conf/log4j.properties | 58 - .../zookeeper-3.4.6/conf/zoo_sample.cfg | 28 - .../contrib/ZooInspector/build.xml | 152 - .../config/defaultConnectionSettings.cfg | 21 - .../config/defaultNodeVeiwers.cfg | 17 - .../ZooInspector/icons/edtsrclkup_co.gif | Bin 204 -> 0 bytes .../contrib/ZooInspector/icons/file_obj.gif | Bin 354 -> 0 bytes .../contrib/ZooInspector/icons/fldr_obj.gif | Bin 216 -> 0 bytes .../contrib/ZooInspector/icons/info_obj.gif | Bin 121 -> 0 bytes .../contrib/ZooInspector/icons/jspdecl.gif | Bin 190 -> 0 bytes .../contrib/ZooInspector/icons/launch_run.gif | Bin 379 -> 0 bytes .../ZooInspector/icons/launch_stop.gif | Bin 916 -> 0 bytes .../contrib/ZooInspector/icons/new_con.gif | Bin 353 -> 0 bytes .../contrib/ZooInspector/icons/refresh.gif | Bin 327 -> 0 bytes .../contrib/ZooInspector/icons/save_edit.gif | Bin 639 -> 0 bytes .../ZooInspector/icons/search_next.gif | Bin 332 -> 0 bytes .../ZooInspector/icons/search_prev.gif | Bin 323 -> 0 bytes .../contrib/ZooInspector/icons/trash.gif | Bin 132 -> 0 bytes .../ZooInspector/lib/jtoaster-1.0.4.jar | Bin 14975 -> 0 bytes .../licences/Apache Software Licence v2.0.txt | 202 - .../ZooInspector/licences/epl-v10.html | 261 - .../zookeeper/inspector/ZooInspector.java | 66 - .../BasicDataEncryptionManager.java | 50 - .../encryption/DataEncryptionManager.java | 39 - .../gui/NodeViewersChangeListener.java | 37 - .../gui/ZooInspectorAboutDialog.java | 80 - ...ooInspectorConnectionPropertiesDialog.java | 321 - .../gui/ZooInspectorIconResources.java | 118 - .../gui/ZooInspectorNodeViewersDialog.java | 605 - .../gui/ZooInspectorNodeViewersPanel.java | 140 - .../inspector/gui/ZooInspectorPanel.java | 361 - .../inspector/gui/ZooInspectorTreeViewer.java | 362 - .../apache/zookeeper/inspector/gui/about.html | 21 - .../gui/nodeviewer/NodeViewerACL.java | 187 - .../gui/nodeviewer/NodeViewerData.java | 146 - .../gui/nodeviewer/NodeViewerMetaData.java | 186 - .../nodeviewer/ZooInspectorNodeViewer.java | 138 - .../inspector/logger/LoggerFactory.java | 36 - .../inspector/manager/NodeListener.java | 37 - .../zookeeper/inspector/manager/Pair.java | 120 - .../manager/ZooInspectorManager.java | 139 - .../manager/ZooInspectorManagerImpl.java | 884 - .../manager/ZooInspectorNodeManager.java | 33 - .../manager/ZooInspectorNodeTreeManager.java | 43 - .../manager/ZooInspectorReadOnlyManager.java | 99 - .../zookeeper/retry/ZooKeeperRetry.java | 288 - .../zookeeper-3.4.6-ZooInspector.jar | Bin 100691 -> 0 bytes .../zookeeper-3.4.6/contrib/fatjar/build.xml | 74 - .../contrib/fatjar/conf/mainClasses | 10 - .../org/apache/zookeeper/util/FatJarMain.java | 126 - .../zookeeper-3.4.6-fatjar.jar.REMOVED.git-id | 1 - .../contrib/loggraph/build.xml | 70 - .../zookeeper/graph/FilterException.java | 22 - .../org/apache/zookeeper/graph/FilterOp.java | 75 - .../apache/zookeeper/graph/FilterParser.java | 131 - .../apache/zookeeper/graph/JsonGenerator.java | 223 - .../apache/zookeeper/graph/Log4JEntry.java | 40 - .../apache/zookeeper/graph/Log4JSource.java | 381 - .../org/apache/zookeeper/graph/LogEntry.java | 46 - .../apache/zookeeper/graph/LogIterator.java | 26 - .../org/apache/zookeeper/graph/LogServer.java | 66 - .../apache/zookeeper/graph/LogSkipList.java | 95 - .../org/apache/zookeeper/graph/LogSource.java | 33 - .../zookeeper/graph/MeasureThroughput.java | 103 - .../zookeeper/graph/MergedLogSource.java | 219 - .../graph/RandomAccessFileReader.java | 328 - .../zookeeper/graph/TransactionEntry.java | 59 - .../apache/zookeeper/graph/TxnLogSource.java | 376 - .../zookeeper/graph/filterops/AndOp.java | 33 - .../apache/zookeeper/graph/filterops/Arg.java | 36 - .../zookeeper/graph/filterops/EqualsOp.java | 44 - .../graph/filterops/GreaterThanOp.java | 70 - .../zookeeper/graph/filterops/LessThanOp.java | 69 - .../zookeeper/graph/filterops/NotOp.java | 31 - .../zookeeper/graph/filterops/NumberArg.java | 28 - .../zookeeper/graph/filterops/OrOp.java | 33 - .../zookeeper/graph/filterops/StringArg.java | 28 - .../zookeeper/graph/filterops/SymbolArg.java | 27 - .../zookeeper/graph/filterops/XorOp.java | 40 - .../zookeeper/graph/servlets/FileLoader.java | 60 - .../apache/zookeeper/graph/servlets/Fs.java | 69 - .../zookeeper/graph/servlets/GraphData.java | 85 - .../zookeeper/graph/servlets/JsonServlet.java | 85 - .../zookeeper/graph/servlets/NumEvents.java | 87 - .../graph/servlets/StaticContent.java | 50 - .../zookeeper/graph/servlets/Throughput.java | 125 - .../loggraph/zookeeper-3.4.6-loggraph.jar | Bin 139103 -> 0 bytes .../contrib/rest/zookeeper-3.4.6-rest.jar | Bin 41552 -> 0 bytes .../contrib/zkfuse/Makefile.am | 4 - .../zookeeper-3.4.6/contrib/zkfuse/README.txt | 63 - .../zookeeper-3.4.6/contrib/zkfuse/VERSION | 1 - .../zookeeper-3.4.6/contrib/zkfuse/build.xml | 61 - .../contrib/zkfuse/configure.ac | 72 - .../contrib/zkfuse/src/Makefile.am | 7 - .../contrib/zkfuse/src/blockingqueue.h | 154 - .../contrib/zkfuse/src/doxygen.cfg | 1242 - .../contrib/zkfuse/src/event.cc | 29 - .../contrib/zkfuse/src/event.h | 553 - .../zookeeper-3.4.6/contrib/zkfuse/src/log.cc | 36 - .../zookeeper-3.4.6/contrib/zkfuse/src/log.h | 116 - .../contrib/zkfuse/src/log4cxx.properties | 28 - .../contrib/zkfuse/src/mutex.h | 169 - .../contrib/zkfuse/src/thread.cc | 41 - .../contrib/zkfuse/src/thread.h | 99 - .../contrib/zkfuse/src/zkadapter.cc | 881 - .../contrib/zkfuse/src/zkadapter.h | 718 - .../contrib/zkfuse/src/zkfuse.cc | 4492 ---- .../zookeeper-3.4.6/contrib/zkperl/Changes | 65 - .../zookeeper-3.4.6/contrib/zkperl/LICENSE | 202 - .../zookeeper-3.4.6/contrib/zkperl/MANIFEST | 23 - .../contrib/zkperl/Makefile.PL | 73 - .../zookeeper-3.4.6/contrib/zkperl/NOTICE | 6 - .../zookeeper-3.4.6/contrib/zkperl/README | 86 - .../zookeeper-3.4.6/contrib/zkperl/VERSION | 1 - .../contrib/zkperl/ZooKeeper.pm | 1257 - .../contrib/zkperl/ZooKeeper.xs | 2669 -- .../zookeeper-3.4.6/contrib/zkperl/build.xml | 61 - .../contrib/zkperl/build/check_zk_version.c | 29 - .../contrib/zkperl/build/check_zk_version.h | 27 - .../contrib/zkperl/t/10_invalid.t | 773 - .../contrib/zkperl/t/15_thread.t | 121 - .../zookeeper-3.4.6/contrib/zkperl/t/20_tie.t | 353 - .../contrib/zkperl/t/22_stat_tie.t | 438 - .../contrib/zkperl/t/24_watch_tie.t | 292 - .../contrib/zkperl/t/30_connect.t | 202 - .../zookeeper-3.4.6/contrib/zkperl/t/35_log.t | 88 - .../contrib/zkperl/t/40_basic.t | 277 - .../contrib/zkperl/t/45_class.t | 408 - .../contrib/zkperl/t/50_access.t | 356 - .../contrib/zkperl/t/60_watch.t | 304 - .../zookeeper-3.4.6/contrib/zkperl/t/util.pl | 62 - .../zookeeper-3.4.6/contrib/zkperl/typemap | 38 - .../zookeeper-3.4.6/contrib/zkpython/README | 109 - .../zookeeper-3.4.6/contrib/zkpython/VERSION | 1 - .../contrib/zkpython/build.xml | 198 - .../zookeeper-3.4.6/contrib/zkpython/ivy.xml | 43 - .../contrib/zkpython/src/c/pyzk_docstrings.h | 594 - .../contrib/zkpython/src/c/zookeeper.c | 1664 -- .../contrib/zkpython/src/examples/README | 8 - .../src/examples/watch_znode_for_changes.py | 202 - .../src/packages/deb/zkpython.control/control | 23 - .../src/packages/rpm/spec/zkpython.spec | 81 - .../contrib/zkpython/src/python/setup.py | 36 - .../contrib/zkpython/src/python/zk.py | 76 - .../contrib/zktreeutil/Makefile.am | 4 - .../contrib/zktreeutil/README.txt | 74 - .../contrib/zktreeutil/VERSION | 1 - .../contrib/zktreeutil/build.xml | 61 - .../contrib/zktreeutil/configure.ac | 66 - .../contrib/zktreeutil/src/Makefile.am | 24 - .../contrib/zktreeutil/src/SimpleTree.h | 150 - .../contrib/zktreeutil/src/ZkAdaptor.cc | 513 - .../contrib/zktreeutil/src/ZkAdaptor.h | 327 - .../contrib/zktreeutil/src/ZkTreeUtil.cc | 705 - .../contrib/zktreeutil/src/ZkTreeUtil.h | 262 - .../contrib/zktreeutil/src/ZkTreeUtilMain.cc | 247 - .../contrib/zktreeutil/tests/zk_sample.xml | 44 - .../dist-maven/zookeeper-3.4.6-javadoc.jar | Bin 351986 -> 0 bytes .../zookeeper-3.4.6-javadoc.jar.asc | 17 - .../zookeeper-3.4.6-javadoc.jar.md5 | 1 - .../zookeeper-3.4.6-javadoc.jar.sha1 | 1 - .../dist-maven/zookeeper-3.4.6-sources.jar | Bin 554610 -> 0 bytes .../zookeeper-3.4.6-sources.jar.asc | 17 - .../zookeeper-3.4.6-sources.jar.md5 | 1 - .../zookeeper-3.4.6-sources.jar.sha1 | 1 - .../dist-maven/zookeeper-3.4.6-tests.jar | Bin 539262 -> 0 bytes .../dist-maven/zookeeper-3.4.6-tests.jar.asc | 17 - .../dist-maven/zookeeper-3.4.6-tests.jar.md5 | 1 - .../dist-maven/zookeeper-3.4.6-tests.jar.sha1 | 1 - .../dist-maven/zookeeper-3.4.6.jar.asc | 17 - .../dist-maven/zookeeper-3.4.6.jar.md5 | 1 - .../dist-maven/zookeeper-3.4.6.jar.sha1 | 1 - .../dist-maven/zookeeper-3.4.6.pom | 113 - .../dist-maven/zookeeper-3.4.6.pom.asc | 17 - .../dist-maven/zookeeper-3.4.6.pom.md5 | 1 - .../dist-maven/zookeeper-3.4.6.pom.sha1 | 1 - .../docs/api/allclasses-frame.html | 75 - .../docs/api/allclasses-noframe.html | 75 - .../docs/api/constant-values.html | 503 - .../docs/api/deprecated-list.html | 325 - .../zookeeper-3.4.6/docs/api/help-doc.html | 221 - .../zookeeper-3.4.6/docs/api/index-all.html | 1351 - .../zookeeper-3.4.6/docs/api/index.html | 67 - .../zookeeper/AsyncCallback.ACLCallback.html | 239 - .../AsyncCallback.Children2Callback.html | 239 - .../AsyncCallback.ChildrenCallback.html | 237 - .../zookeeper/AsyncCallback.DataCallback.html | 239 - .../zookeeper/AsyncCallback.StatCallback.html | 237 - .../AsyncCallback.StringCallback.html | 237 - .../zookeeper/AsyncCallback.VoidCallback.html | 235 - .../org/apache/zookeeper/AsyncCallback.html | 212 - .../api/org/apache/zookeeper/CreateMode.html | 421 - .../KeeperException.APIErrorException.html | 283 - .../KeeperException.AuthFailedException.html | 283 - ...KeeperException.BadArgumentsException.html | 295 - .../KeeperException.BadVersionException.html | 295 - .../zookeeper/KeeperException.Code.html | 694 - .../KeeperException.CodeDeprecated.html | 636 - ...eperException.ConnectionLossException.html | 283 - ...rException.DataInconsistencyException.html | 283 - .../KeeperException.InvalidACLException.html | 295 - ...perException.InvalidCallbackException.html | 283 - ...erException.MarshallingErrorException.html | 283 - .../KeeperException.NoAuthException.html | 283 - ...tion.NoChildrenForEphemeralsException.html | 295 - .../KeeperException.NoNodeException.html | 295 - .../KeeperException.NodeExistsException.html | 295 - .../KeeperException.NotEmptyException.html | 295 - .../KeeperException.NotReadOnlyException.html | 283 - ...erException.OperationTimeoutException.html | 283 - ...ception.RuntimeInconsistencyException.html | 283 - ...eperException.SessionExpiredException.html | 283 - ...KeeperException.SessionMovedException.html | 283 - .../KeeperException.SystemErrorException.html | 283 - ...eeperException.UnimplementedException.html | 283 - .../org/apache/zookeeper/KeeperException.html | 597 - .../apache/zookeeper/ServerAdminClient.html | 349 - .../org/apache/zookeeper/WatchedEvent.html | 342 - .../zookeeper/Watcher.Event.EventType.html | 389 - .../zookeeper/Watcher.Event.KeeperState.html | 472 - .../org/apache/zookeeper/Watcher.Event.html | 197 - .../api/org/apache/zookeeper/Watcher.html | 233 - .../api/org/apache/zookeeper/ZooDefs.Ids.html | 279 - .../org/apache/zookeeper/ZooDefs.OpCode.html | 478 - .../org/apache/zookeeper/ZooDefs.Perms.html | 282 - .../api/org/apache/zookeeper/ZooDefs.html | 292 - .../apache/zookeeper/ZooKeeper.States.html | 419 - .../api/org/apache/zookeeper/ZooKeeper.html | 1669 -- .../org/apache/zookeeper/ZooKeeperMain.html | 405 - .../class-use/AsyncCallback.ACLCallback.html | 161 - .../AsyncCallback.Children2Callback.html | 170 - .../AsyncCallback.ChildrenCallback.html | 170 - .../class-use/AsyncCallback.DataCallback.html | 170 - .../class-use/AsyncCallback.StatCallback.html | 190 - .../AsyncCallback.StringCallback.html | 163 - .../class-use/AsyncCallback.VoidCallback.html | 169 - .../zookeeper/class-use/AsyncCallback.html | 180 - .../zookeeper/class-use/CreateMode.html | 200 - .../KeeperException.APIErrorException.html | 116 - .../KeeperException.AuthFailedException.html | 116 - ...KeeperException.BadArgumentsException.html | 116 - .../KeeperException.BadVersionException.html | 116 - .../class-use/KeeperException.Code.html | 214 - .../KeeperException.CodeDeprecated.html | 159 - ...eperException.ConnectionLossException.html | 116 - ...rException.DataInconsistencyException.html | 116 - .../KeeperException.InvalidACLException.html | 116 - ...perException.InvalidCallbackException.html | 116 - ...erException.MarshallingErrorException.html | 116 - .../KeeperException.NoAuthException.html | 116 - ...tion.NoChildrenForEphemeralsException.html | 116 - .../KeeperException.NoNodeException.html | 116 - .../KeeperException.NodeExistsException.html | 116 - .../KeeperException.NotEmptyException.html | 116 - .../KeeperException.NotReadOnlyException.html | 116 - ...erException.OperationTimeoutException.html | 116 - ...ception.RuntimeInconsistencyException.html | 116 - ...eperException.SessionExpiredException.html | 116 - ...KeeperException.SessionMovedException.html | 116 - .../KeeperException.SystemErrorException.html | 116 - ...eeperException.UnimplementedException.html | 116 - .../zookeeper/class-use/KeeperException.html | 430 - .../class-use/ServerAdminClient.html | 116 - .../zookeeper/class-use/WatchedEvent.html | 156 - .../class-use/Watcher.Event.EventType.html | 188 - .../class-use/Watcher.Event.KeeperState.html | 188 - .../zookeeper/class-use/Watcher.Event.html | 116 - .../apache/zookeeper/class-use/Watcher.html | 275 - .../zookeeper/class-use/ZooDefs.Ids.html | 116 - .../zookeeper/class-use/ZooDefs.OpCode.html | 116 - .../zookeeper/class-use/ZooDefs.Perms.html | 116 - .../apache/zookeeper/class-use/ZooDefs.html | 116 - .../zookeeper/class-use/ZooKeeper.States.html | 169 - .../apache/zookeeper/class-use/ZooKeeper.html | 181 - .../zookeeper/class-use/ZooKeeperMain.html | 116 - .../zookeeper/client/FourLetterWordMain.html | 285 - .../client/class-use/FourLetterWordMain.html | 116 - .../zookeeper/client/package-frame.html | 19 - .../zookeeper/client/package-summary.html | 134 - .../apache/zookeeper/client/package-tree.html | 129 - .../apache/zookeeper/client/package-use.html | 116 - .../api/org/apache/zookeeper/data/ACL.html | 469 - .../api/org/apache/zookeeper/data/Id.html | 469 - .../api/org/apache/zookeeper/data/Stat.html | 721 - .../apache/zookeeper/data/StatPersisted.html | 665 - .../zookeeper/data/StatPersistedV1.html | 637 - .../apache/zookeeper/data/class-use/ACL.html | 242 - .../apache/zookeeper/data/class-use/Id.html | 211 - .../apache/zookeeper/data/class-use/Stat.html | 273 - .../data/class-use/StatPersisted.html | 116 - .../data/class-use/StatPersistedV1.html | 116 - .../apache/zookeeper/data/package-frame.html | 23 - .../zookeeper/data/package-summary.html | 150 - .../apache/zookeeper/data/package-tree.html | 133 - .../apache/zookeeper/data/package-use.html | 174 - .../org/apache/zookeeper/package-frame.html | 73 - .../org/apache/zookeeper/package-summary.html | 368 - .../org/apache/zookeeper/package-tree.html | 202 - .../api/org/apache/zookeeper/package-use.html | 219 - .../apache/zookeeper/server/LogFormatter.html | 261 - .../apache/zookeeper/server/PurgeTxnLog.html | 295 - .../zookeeper/server/SnapshotFormatter.html | 280 - .../zookeeper/server/ZooKeeperServerMain.html | 278 - .../server/class-use/LogFormatter.html | 116 - .../server/class-use/PurgeTxnLog.html | 116 - .../server/class-use/SnapshotFormatter.html | 116 - .../server/class-use/ZooKeeperServerMain.html | 116 - .../zookeeper/server/package-frame.html | 22 - .../zookeeper/server/package-summary.html | 241 - .../apache/zookeeper/server/package-tree.html | 132 - .../apache/zookeeper/server/package-use.html | 116 - .../server/quorum/QuorumPeerMain.html | 303 - .../quorum/class-use/QuorumPeerMain.html | 116 - .../server/quorum/package-frame.html | 19 - .../server/quorum/package-summary.html | 136 - .../zookeeper/server/quorum/package-tree.html | 129 - .../zookeeper/server/quorum/package-use.html | 116 - .../zookeeper/server/upgrade/UpgradeMain.html | 294 - .../server/upgrade/class-use/UpgradeMain.html | 116 - .../server/upgrade/package-frame.html | 19 - .../server/upgrade/package-summary.html | 138 - .../server/upgrade/package-tree.html | 129 - .../zookeeper/server/upgrade/package-use.html | 116 - .../docs/api/overview-frame.html | 25 - .../docs/api/overview-summary.html | 165 - .../docs/api/overview-tree.html | 219 - .../zookeeper-3.4.6/docs/api/package-list | 6 - .../docs/api/resources/background.gif | Bin 2313 -> 0 bytes .../docs/api/resources/tab.gif | Bin 291 -> 0 bytes .../docs/api/resources/titlebar.gif | Bin 10701 -> 0 bytes .../docs/api/resources/titlebar_end.gif | Bin 849 -> 0 bytes .../docs/api/serialized-form.html | 329 - .../docs/bookkeeperConfig.html | 384 - .../zookeeper-3.4.6/docs/bookkeeperConfig.pdf | Bin 13824 -> 0 bytes .../docs/bookkeeperOverview.html | 694 - .../docs/bookkeeperOverview.pdf | Bin 147596 -> 0 bytes .../docs/bookkeeperProgrammer.html | 1083 - .../docs/bookkeeperProgrammer.pdf | Bin 24991 -> 0 bytes .../docs/bookkeeperStarted.html | 448 - .../docs/bookkeeperStarted.pdf | Bin 17130 -> 0 bytes .../docs/bookkeeperStream.html | 612 - .../zookeeper-3.4.6/docs/bookkeeperStream.pdf | Bin 13215 -> 0 bytes .../zookeeper-3.4.6/docs/broken-links.xml | 2 - .../zookeeper-3.4.6/docs/images/2pc.jpg | Bin 15174 -> 0 bytes .../docs/images/bk-overview.jpg | Bin 124211 -> 0 bytes .../docs/images/built-with-forrest-button.png | Bin 1936 -> 0 bytes .../zookeeper-3.4.6/docs/images/favicon.ico | Bin 766 -> 0 bytes .../docs/images/hadoop-logo.jpg | Bin 9443 -> 0 bytes .../docs/images/instruction_arrow.png | Bin 285 -> 0 bytes .../zookeeper-3.4.6/docs/images/state_dia.jpg | Bin 51364 -> 0 bytes .../docs/images/zkcomponents.jpg | Bin 30831 -> 0 bytes .../docs/images/zknamespace.jpg | Bin 35414 -> 0 bytes .../docs/images/zkperfRW-3.2.jpg | Bin 41948 -> 0 bytes .../zookeeper-3.4.6/docs/images/zkperfRW.jpg | Bin 161542 -> 0 bytes .../docs/images/zkperfreliability.jpg | Bin 69825 -> 0 bytes .../zookeeper-3.4.6/docs/images/zkservice.jpg | Bin 86790 -> 0 bytes .../docs/images/zookeeper_small.gif | Bin 4847 -> 0 bytes pkg/registry/zookeeper-3.4.6/docs/index.html | 391 - pkg/registry/zookeeper-3.4.6/docs/index.pdf | Bin 13525 -> 0 bytes .../zookeeper-3.4.6/docs/javaExample.html | 908 - .../zookeeper-3.4.6/docs/javaExample.pdf | Bin 33852 -> 0 bytes .../zookeeper-3.4.6/docs/jdiff/changes.html | 32 - .../changes/alldiffs_index_additions.html | 612 - .../jdiff/changes/alldiffs_index_all.html | 791 - .../jdiff/changes/alldiffs_index_changes.html | 190 - .../changes/alldiffs_index_removals.html | 94 - .../docs/jdiff/changes/changes-summary.html | 70 - .../changes/classes_index_additions.html | 181 - .../docs/jdiff/changes/classes_index_all.html | 243 - .../jdiff/changes/classes_index_changes.html | 106 - .../jdiff/changes/classes_index_removals.html | 50 - .../changes/constructors_index_additions.html | 97 - .../jdiff/changes/constructors_index_all.html | 103 - .../changes/constructors_index_changes.html | 50 - .../changes/constructors_index_removals.html | 67 - .../jdiff/changes/fields_index_additions.html | 222 - .../docs/jdiff/changes/fields_index_all.html | 250 - .../jdiff/changes/fields_index_changes.html | 56 - .../jdiff/changes/fields_index_removals.html | 56 - .../docs/jdiff/changes/jdiff_help.html | 111 - .../docs/jdiff/changes/jdiff_statistics.html | 307 - .../jdiff/changes/jdiff_topleftframe.html | 40 - .../changes/methods_index_additions.html | 230 - .../docs/jdiff/changes/methods_index_all.html | 282 - .../jdiff/changes/methods_index_changes.html | 64 - .../jdiff/changes/methods_index_removals.html | 56 - .../org.apache.zookeeper.ClientCnxn.html | 240 - .../org.apache.zookeeper.Environment.html | 118 - ...KeeperException.BadArgumentsException.html | 100 - ...r.KeeperException.BadVersionException.html | 100 - ...apache.zookeeper.KeeperException.Code.html | 107 - ...r.KeeperException.InvalidACLException.html | 100 - ...tion.NoChildrenForEphemeralsException.html | 100 - ...eeper.KeeperException.NoNodeException.html | 100 - ...r.KeeperException.NodeExistsException.html | 100 - ...per.KeeperException.NotEmptyException.html | 100 - .../org.apache.zookeeper.KeeperException.html | 100 - ...e.zookeeper.Watcher.Event.KeeperState.html | 114 - .../org.apache.zookeeper.ZooDefs.OpCode.html | 121 - ...org.apache.zookeeper.ZooKeeper.States.html | 122 - .../org.apache.zookeeper.ZooKeeper.html | 236 - .../org.apache.zookeeper.ZooKeeperMain.html | 268 - .../changes/packages_index_additions.html | 51 - .../jdiff/changes/packages_index_all.html | 53 - .../jdiff/changes/packages_index_changes.html | 53 - .../changes/packages_index_removals.html | 51 - .../changes/pkg_org.apache.zookeeper.html | 371 - .../docs/jdiff/missingSinces.txt | 89 - ...for_zookeeper_3.1.1_to_zookeeper_3.4.6.xml | 702 - .../zookeeper-3.4.6/docs/linkmap.html | 434 - pkg/registry/zookeeper-3.4.6/docs/linkmap.pdf | Bin 12472 -> 0 bytes .../zookeeper-3.4.6/docs/recipes.html | 974 - pkg/registry/zookeeper-3.4.6/docs/recipes.pdf | Bin 31072 -> 0 bytes .../zookeeper-3.4.6/docs/releasenotes.html | 4799 ---- .../zookeeper-3.4.6/docs/releasenotes.pdf | Bin 118640 -> 0 bytes .../docs/skin/CommonMessages_de.xml | 23 - .../docs/skin/CommonMessages_en_US.xml | 23 - .../docs/skin/CommonMessages_es.xml | 23 - .../docs/skin/CommonMessages_fr.xml | 23 - .../docs/skin/images/README.txt | 1 - .../zookeeper-3.4.6/docs/skin/images/add.jpg | Bin 1142 -> 0 bytes .../docs/skin/images/apache-thanks.png | Bin 4840 -> 0 bytes .../docs/skin/images/built-with-cocoon.gif | Bin 2252 -> 0 bytes .../skin/images/built-with-forrest-button.png | Bin 1936 -> 0 bytes .../docs/skin/images/chapter.gif | Bin 49 -> 0 bytes .../docs/skin/images/chapter_open.gif | Bin 49 -> 0 bytes .../docs/skin/images/current.gif | Bin 54 -> 0 bytes .../docs/skin/images/error.png | Bin 1709 -> 0 bytes .../docs/skin/images/external-link.gif | Bin 71 -> 0 bytes .../zookeeper-3.4.6/docs/skin/images/fix.jpg | Bin 932 -> 0 bytes .../docs/skin/images/forrest-credit-logo.png | Bin 4633 -> 0 bytes .../zookeeper-3.4.6/docs/skin/images/hack.jpg | Bin 743 -> 0 bytes .../docs/skin/images/header_white_line.gif | Bin 37 -> 0 bytes .../zookeeper-3.4.6/docs/skin/images/info.png | Bin 1320 -> 0 bytes .../docs/skin/images/instruction_arrow.png | Bin 285 -> 0 bytes .../docs/skin/images/label.gif | Bin 54 -> 0 bytes .../zookeeper-3.4.6/docs/skin/images/page.gif | Bin 79 -> 0 bytes .../docs/skin/images/pdfdoc.gif | Bin 1008 -> 0 bytes .../docs/skin/images/poddoc.png | Bin 856 -> 0 bytes .../docs/skin/images/printer.gif | Bin 603 -> 0 bytes .../images/rc-b-l-15-1body-2menu-3menu.png | Bin 348 -> 0 bytes .../images/rc-b-r-15-1body-2menu-3menu.png | Bin 319 -> 0 bytes ...-5-1header-2tab-selected-3tab-selected.png | Bin 200 -> 0 bytes ...rc-t-l-5-1header-2searchbox-3searchbox.png | Bin 199 -> 0 bytes ...-5-1header-2tab-selected-3tab-selected.png | Bin 209 -> 0 bytes ...header-2tab-unselected-3tab-unselected.png | Bin 199 -> 0 bytes .../images/rc-t-r-15-1body-2menu-3menu.png | Bin 390 -> 0 bytes ...rc-t-r-5-1header-2searchbox-3searchbox.png | Bin 214 -> 0 bytes ...-5-1header-2tab-selected-3tab-selected.png | Bin 215 -> 0 bytes ...header-2tab-unselected-3tab-unselected.png | Bin 214 -> 0 bytes .../docs/skin/images/remove.jpg | Bin 1251 -> 0 bytes .../zookeeper-3.4.6/docs/skin/images/rss.png | Bin 360 -> 0 bytes .../docs/skin/images/spacer.gif | Bin 43 -> 0 bytes .../docs/skin/images/success.png | Bin 1291 -> 0 bytes .../docs/skin/images/txtdoc.png | Bin 784 -> 0 bytes .../docs/skin/images/update.jpg | Bin 990 -> 0 bytes .../docs/skin/images/valid-html401.png | Bin 2948 -> 0 bytes .../zookeeper-3.4.6/docs/skin/images/vcss.png | Bin 1134 -> 0 bytes .../docs/skin/images/warning.png | Bin 1215 -> 0 bytes .../docs/skin/images/xmldoc.gif | Bin 992 -> 0 bytes .../zookeeper-3.4.6/docs/skin/note.txt | 50 - .../zookeeper-3.4.6/docs/zookeeperAdmin.html | 1877 -- .../zookeeper-3.4.6/docs/zookeeperAdmin.pdf | Bin 74144 -> 0 bytes .../docs/zookeeperHierarchicalQuorums.html | 276 - .../docs/zookeeperHierarchicalQuorums.pdf | Bin 6660 -> 0 bytes .../docs/zookeeperInternals.html | 805 - .../docs/zookeeperInternals.pdf | Bin 48872 -> 0 bytes .../zookeeper-3.4.6/docs/zookeeperJMX.html | 479 - .../zookeeper-3.4.6/docs/zookeeperJMX.pdf | Bin 16498 -> 0 bytes .../docs/zookeeperObservers.html | 366 - .../docs/zookeeperObservers.pdf | Bin 12884 -> 0 bytes .../docs/zookeeperOtherInfo.html | 230 - .../docs/zookeeperOtherInfo.pdf | Bin 2947 -> 0 bytes .../zookeeper-3.4.6/docs/zookeeperOver.html | 704 - .../zookeeper-3.4.6/docs/zookeeperOver.pdf | Bin 302521 -> 0 bytes .../docs/zookeeperProgrammers.html | 2238 -- .../docs/zookeeperProgrammers.pdf | Bin 133888 -> 0 bytes .../zookeeper-3.4.6/docs/zookeeperQuotas.html | 291 - .../zookeeper-3.4.6/docs/zookeeperQuotas.pdf | Bin 11269 -> 0 bytes .../docs/zookeeperStarted.html | 645 - .../zookeeper-3.4.6/docs/zookeeperStarted.pdf | Bin 27581 -> 0 bytes .../docs/zookeeperTutorial.html | 894 - .../docs/zookeeperTutorial.pdf | Bin 30557 -> 0 bytes pkg/registry/zookeeper-3.4.6/ivy.xml | 77 - pkg/registry/zookeeper-3.4.6/ivysettings.xml | 46 - .../zookeeper-3.4.6/lib/cobertura/README.txt | 3 - .../lib/jdiff/zookeeper_3.1.1.xml | 2717 -- .../lib/jdiff/zookeeper_3.4.6-SNAPSHOT.xml | 4559 ---- .../lib/jdiff/zookeeper_3.4.6.xml | 4559 ---- .../lib/jline-0.9.94.LICENSE.txt | 33 - .../zookeeper-3.4.6/lib/jline-0.9.94.jar | Bin 87325 -> 0 bytes .../lib/log4j-1.2.16.LICENSE.txt | 202 - .../zookeeper-3.4.6/lib/log4j-1.2.16.jar | Bin 481535 -> 0 bytes .../lib/netty-3.7.0.Final.jar.REMOVED.git-id | 1 - .../zookeeper-3.4.6/lib/slf4j-api-1.6.1.jar | Bin 25496 -> 0 bytes .../lib/slf4j-log4j12-1.6.1.jar | Bin 9753 -> 0 bytes .../recipes/election/build.xml | 128 - .../recipes/leader/LeaderElectionAware.java | 37 - .../recipes/leader/LeaderElectionSupport.java | 461 - .../zookeeper/recipes/leader/LeaderOffer.java | 84 - .../zookeeper-3.4.6/recipes/lock/build.xml | 128 - .../recipes/lock/src/c/INSTALL | 234 - .../recipes/lock/src/c/LICENSE | 202 - .../recipes/lock/src/c/Makefile.am | 46 - .../recipes/lock/src/c/README.txt | 28 - .../recipes/lock/src/c/acinclude.m4 | 312 - .../recipes/lock/src/c/aminclude.am | 186 - .../recipes/lock/src/c/c-doc.Doxyfile | 1252 - .../recipes/lock/src/c/configure.ac | 82 - .../recipes/lock/src/c/include/zoo_lock.h | 168 - .../recipes/lock/src/c/src/zoo_lock.c | 396 - .../recipes/lock/src/c/tests/TestClient.cc | 201 - .../recipes/lock/src/c/tests/TestDriver.cc | 114 - .../recipes/lock/src/c/tests/Util.cc | 30 - .../recipes/lock/src/c/tests/Util.h | 134 - .../recipes/lock/src/c/tests/zkServer.sh | 75 - .../zookeeper/recipes/lock/LockListener.java | 38 - .../recipes/lock/ProtocolSupport.java | 193 - .../zookeeper/recipes/lock/WriteLock.java | 296 - .../zookeeper/recipes/lock/ZNodeName.java | 110 - .../recipes/lock/ZooKeeperOperation.java | 38 - .../zookeeper-3.4.6/recipes/queue/build.xml | 128 - .../recipes/queue/src/c/INSTALL | 234 - .../recipes/queue/src/c/LICENSE | 202 - .../recipes/queue/src/c/Makefile.am | 46 - .../recipes/queue/src/c/README.txt | 30 - .../recipes/queue/src/c/acinclude.m4 | 312 - .../recipes/queue/src/c/aminclude.am | 186 - .../recipes/queue/src/c/c-doc.Doxyfile | 1252 - .../recipes/queue/src/c/configure.ac | 82 - .../recipes/queue/src/c/include/zoo_queue.h | 118 - .../recipes/queue/src/c/src/zoo_queue.c | 442 - .../recipes/queue/src/c/tests/TestClient.cc | 452 - .../recipes/queue/src/c/tests/TestDriver.cc | 114 - .../recipes/queue/src/c/tests/Util.cc | 30 - .../recipes/queue/src/c/tests/Util.h | 134 - .../recipes/queue/src/c/tests/zkServer.sh | 75 - .../recipes/queue/DistributedQueue.java | 313 - pkg/registry/zookeeper-3.4.6/src/c/ChangeLog | 116 - pkg/registry/zookeeper-3.4.6/src/c/Cli.vcproj | 210 - pkg/registry/zookeeper-3.4.6/src/c/INSTALL | 234 - pkg/registry/zookeeper-3.4.6/src/c/LICENSE | 202 - .../zookeeper-3.4.6/src/c/Makefile.am | 108 - .../zookeeper-3.4.6/src/c/Makefile.in | 1782 -- pkg/registry/zookeeper-3.4.6/src/c/NOTICE.txt | 41 - pkg/registry/zookeeper-3.4.6/src/c/README | 129 - .../zookeeper-3.4.6/src/c/acinclude.m4 | 312 - pkg/registry/zookeeper-3.4.6/src/c/aclocal.m4 | 9706 -------- .../zookeeper-3.4.6/src/c/aminclude.am | 186 - .../src/c/autom4te.cache/output.0 | 8641 ------- .../src/c/autom4te.cache/output.1 | 20613 --------------- .../src/c/autom4te.cache/output.2 | 20471 --------------- .../src/c/autom4te.cache/output.3 | 20617 ---------------- .../src/c/autom4te.cache/requests | 673 - .../src/c/autom4te.cache/traces.0 | 1523 -- .../src/c/autom4te.cache/traces.1 | 1138 - .../src/c/autom4te.cache/traces.2 | 3183 --- .../src/c/autom4te.cache/traces.3 | 3272 --- .../zookeeper-3.4.6/src/c/c-doc.Doxyfile | 1252 - pkg/registry/zookeeper-3.4.6/src/c/compile | 343 - .../zookeeper-3.4.6/src/c/config.guess | 1530 -- .../zookeeper-3.4.6/src/c/config.h.in | 152 - pkg/registry/zookeeper-3.4.6/src/c/config.sub | 1782 -- pkg/registry/zookeeper-3.4.6/src/c/configure | 20613 --------------- .../zookeeper-3.4.6/src/c/configure.ac | 149 - pkg/registry/zookeeper-3.4.6/src/c/depcomp | 708 - .../src/c/generated/zookeeper.jute.c | 1315 - .../src/c/generated/zookeeper.jute.h | 485 - .../zookeeper-3.4.6/src/c/include/proto.h | 47 - .../zookeeper-3.4.6/src/c/include/recordio.h | 82 - .../zookeeper-3.4.6/src/c/include/winconfig.h | 191 - .../zookeeper-3.4.6/src/c/include/winstdint.h | 247 - .../zookeeper-3.4.6/src/c/include/zookeeper.h | 1583 -- .../src/c/include/zookeeper_log.h | 51 - .../src/c/include/zookeeper_version.h | 33 - pkg/registry/zookeeper-3.4.6/src/c/install-sh | 527 - pkg/registry/zookeeper-3.4.6/src/c/ltmain.sh | 9661 -------- pkg/registry/zookeeper-3.4.6/src/c/missing | 331 - pkg/registry/zookeeper-3.4.6/src/c/src/cli.c | 681 - .../src/c/src/hashtable/LICENSE.txt | 30 - .../src/c/src/hashtable/hashtable.c | 274 - .../src/c/src/hashtable/hashtable.h | 209 - .../src/c/src/hashtable/hashtable_itr.c | 176 - .../src/c/src/hashtable/hashtable_itr.h | 119 - .../src/c/src/hashtable/hashtable_private.h | 85 - .../zookeeper-3.4.6/src/c/src/load_gen.c | 286 - .../zookeeper-3.4.6/src/c/src/mt_adaptor.c | 530 - .../zookeeper-3.4.6/src/c/src/recordio.c | 360 - .../zookeeper-3.4.6/src/c/src/st_adaptor.c | 99 - .../zookeeper-3.4.6/src/c/src/winport.c | 292 - .../zookeeper-3.4.6/src/c/src/winport.h | 123 - .../zookeeper-3.4.6/src/c/src/zk_adaptor.h | 276 - .../zookeeper-3.4.6/src/c/src/zk_hashtable.c | 337 - .../zookeeper-3.4.6/src/c/src/zk_hashtable.h | 69 - .../zookeeper-3.4.6/src/c/src/zk_log.c | 176 - .../zookeeper-3.4.6/src/c/src/zookeeper.c | 3714 --- .../src/c/tests/CollectionUtil.h | 195 - .../src/c/tests/CppAssertHelper.h | 37 - .../zookeeper-3.4.6/src/c/tests/LibCMocks.cc | 333 - .../zookeeper-3.4.6/src/c/tests/LibCMocks.h | 408 - .../src/c/tests/LibCSymTable.cc | 83 - .../src/c/tests/LibCSymTable.h | 107 - .../zookeeper-3.4.6/src/c/tests/MocksBase.cc | 36 - .../zookeeper-3.4.6/src/c/tests/MocksBase.h | 36 - .../src/c/tests/PthreadMocks.cc | 106 - .../src/c/tests/PthreadMocks.h | 449 - .../zookeeper-3.4.6/src/c/tests/TestClient.cc | 1135 - .../src/c/tests/TestClientRetry.cc | 273 - .../zookeeper-3.4.6/src/c/tests/TestDriver.cc | 173 - .../zookeeper-3.4.6/src/c/tests/TestMulti.cc | 703 - .../src/c/tests/TestOperations.cc | 675 - .../src/c/tests/TestWatchers.cc | 773 - .../src/c/tests/TestZookeeperClose.cc | 472 - .../src/c/tests/TestZookeeperInit.cc | 301 - .../src/c/tests/ThreadingUtil.cc | 87 - .../src/c/tests/ThreadingUtil.h | 261 - .../zookeeper-3.4.6/src/c/tests/Util.cc | 51 - .../zookeeper-3.4.6/src/c/tests/Util.h | 137 - .../zookeeper-3.4.6/src/c/tests/Vector.h | 37 - .../zookeeper-3.4.6/src/c/tests/ZKMocks.cc | 519 - .../zookeeper-3.4.6/src/c/tests/ZKMocks.h | 509 - .../src/c/tests/wrappers-mt.opt | 3 - .../zookeeper-3.4.6/src/c/tests/wrappers.opt | 6 - .../zookeeper-3.4.6/src/c/tests/zkServer.sh | 161 - .../zookeeper-3.4.6/src/c/zookeeper.sln | 25 - .../zookeeper-3.4.6/src/c/zookeeper.vcproj | 300 - .../src/contrib/build-contrib.xml | 248 - .../zookeeper-3.4.6/src/contrib/build.xml | 88 - .../src/contrib/fatjar/README.txt | 2 - .../src/contrib/fatjar/build.xml | 74 - .../src/contrib/fatjar/conf/mainClasses | 10 - .../org/apache/zookeeper/util/FatJarMain.java | 126 - .../src/contrib/huebrowser/README | 62 - .../src/contrib/huebrowser/zkui/Makefile | 21 - .../src/contrib/huebrowser/zkui/setup.py | 46 - .../huebrowser/zkui/src/zkui/__init__.py | 16 - .../contrib/huebrowser/zkui/src/zkui/forms.py | 29 - .../huebrowser/zkui/src/zkui/models.py | 17 - .../contrib/huebrowser/zkui/src/zkui/rest.py | 230 - .../huebrowser/zkui/src/zkui/settings.py | 30 - .../zkui/src/zkui/static/art/line_icons.png | Bin 7499 -> 0 bytes .../zkui/src/zkui/static/art/zkui.png | Bin 4430 -> 0 bytes .../zkui/src/zkui/static/help/index.html | 26 - .../zkui/src/zkui/static/js/package.yml | 19 - .../contrib/huebrowser/zkui/src/zkui/stats.py | 170 - .../zkui/src/zkui/templates/clients.mako | 51 - .../zkui/src/zkui/templates/create.mako | 34 - .../zkui/src/zkui/templates/edit.mako | 34 - .../zkui/src/zkui/templates/index.mako | 54 - .../src/zkui/templates/shared_components.mako | 66 - .../zkui/src/zkui/templates/tree.mako | 75 - .../zkui/src/zkui/templates/view.mako | 128 - .../contrib/huebrowser/zkui/src/zkui/urls.py | 28 - .../contrib/huebrowser/zkui/src/zkui/utils.py | 33 - .../contrib/huebrowser/zkui/src/zkui/views.py | 165 - .../huebrowser/zkui/src/zkui/windmilltests.py | 23 - .../src/contrib/loggraph/README.txt | 69 - .../src/contrib/loggraph/bin/loggraph-dev.sh | 43 - .../src/contrib/loggraph/bin/loggraph.sh | 48 - .../src/contrib/loggraph/build.xml | 70 - .../src/contrib/loggraph/ivy.xml | 44 - .../zookeeper/graph/FilterException.java | 22 - .../org/apache/zookeeper/graph/FilterOp.java | 75 - .../apache/zookeeper/graph/FilterParser.java | 131 - .../apache/zookeeper/graph/JsonGenerator.java | 223 - .../apache/zookeeper/graph/Log4JEntry.java | 40 - .../apache/zookeeper/graph/Log4JSource.java | 381 - .../org/apache/zookeeper/graph/LogEntry.java | 46 - .../apache/zookeeper/graph/LogIterator.java | 26 - .../org/apache/zookeeper/graph/LogServer.java | 66 - .../apache/zookeeper/graph/LogSkipList.java | 95 - .../org/apache/zookeeper/graph/LogSource.java | 33 - .../zookeeper/graph/MeasureThroughput.java | 103 - .../zookeeper/graph/MergedLogSource.java | 219 - .../graph/RandomAccessFileReader.java | 328 - .../zookeeper/graph/TransactionEntry.java | 59 - .../apache/zookeeper/graph/TxnLogSource.java | 376 - .../zookeeper/graph/filterops/AndOp.java | 33 - .../apache/zookeeper/graph/filterops/Arg.java | 36 - .../zookeeper/graph/filterops/EqualsOp.java | 44 - .../graph/filterops/GreaterThanOp.java | 70 - .../zookeeper/graph/filterops/LessThanOp.java | 69 - .../zookeeper/graph/filterops/NotOp.java | 31 - .../zookeeper/graph/filterops/NumberArg.java | 28 - .../zookeeper/graph/filterops/OrOp.java | 33 - .../zookeeper/graph/filterops/StringArg.java | 28 - .../zookeeper/graph/filterops/SymbolArg.java | 27 - .../zookeeper/graph/filterops/XorOp.java | 40 - .../zookeeper/graph/servlets/FileLoader.java | 60 - .../apache/zookeeper/graph/servlets/Fs.java | 69 - .../zookeeper/graph/servlets/GraphData.java | 85 - .../zookeeper/graph/servlets/JsonServlet.java | 85 - .../zookeeper/graph/servlets/NumEvents.java | 87 - .../graph/servlets/StaticContent.java | 50 - .../zookeeper/graph/servlets/Throughput.java | 125 - .../apache/zookeeper/graph/log4j.properties | 11 - .../zookeeper/graph/resources/load-big.gif | Bin 1924 -> 0 bytes .../apache/zookeeper/graph/resources/load.gif | Bin 673 -> 0 bytes .../zookeeper/graph/resources/main.html | 60 - .../src/contrib/monitoring/JMX-RESOURCES | 38 - .../src/contrib/monitoring/README | 84 - .../src/contrib/monitoring/cacti/README | 56 - .../src/contrib/monitoring/check_zookeeper.py | 358 - .../src/contrib/monitoring/ganglia/README | 48 - .../contrib/monitoring/ganglia/Screenshot.png | Bin 111055 -> 0 bytes .../contrib/monitoring/ganglia/modpython.conf | 28 - .../monitoring/ganglia/zookeeper.pyconf | 49 - .../monitoring/ganglia/zookeeper_ganglia.py | 209 - .../src/contrib/monitoring/nagios/README.txt | 86 - .../monitoring/nagios/Screenshot-1.png | Bin 196668 -> 0 bytes .../contrib/monitoring/nagios/Screenshot.png | Bin 163646 -> 0 bytes .../contrib/monitoring/nagios/hostgroups.cfg | 25 - .../contrib/monitoring/nagios/services.cfg | 67 - .../contrib/monitoring/nagios/zookeeper.cfg | 30 - .../src/contrib/monitoring/test.py | 282 - .../src/contrib/rest/NOTICE.txt | 7 - .../src/contrib/rest/README.txt | 72 - .../zookeeper-3.4.6/src/contrib/rest/SPEC.txt | 355 - .../src/contrib/rest/build.xml | 167 - .../src/contrib/rest/conf/keys/README | 8 - .../src/contrib/rest/conf/keys/rest.cer | Bin 595 -> 0 bytes .../src/contrib/rest/conf/keys/rest.jks | Bin 1363 -> 0 bytes .../src/contrib/rest/conf/log4j.properties | 72 - .../src/contrib/rest/conf/rest.properties | 70 - .../zookeeper-3.4.6/src/contrib/rest/ivy.xml | 48 - .../zookeeper-3.4.6/src/contrib/rest/rest.sh | 90 - .../zookeeper/server/jersey/RestMain.java | 151 - .../server/jersey/ZooKeeperService.java | 242 - .../server/jersey/cfg/Credentials.java | 47 - .../zookeeper/server/jersey/cfg/Endpoint.java | 72 - .../zookeeper/server/jersey/cfg/HostPort.java | 51 - .../server/jersey/cfg/HostPortSet.java | 51 - .../zookeeper/server/jersey/cfg/RestCfg.java | 106 - .../server/jersey/filters/HTTPBasicAuth.java | 87 - .../server/jersey/jaxb/ZChildren.java | 80 - .../server/jersey/jaxb/ZChildrenJSON.java | 76 - .../zookeeper/server/jersey/jaxb/ZError.java | 41 - .../zookeeper/server/jersey/jaxb/ZPath.java | 63 - .../server/jersey/jaxb/ZSession.java | 55 - .../zookeeper/server/jersey/jaxb/ZStat.java | 106 - .../jersey/resources/JAXBContextResolver.java | 72 - .../resources/KeeperExceptionMapper.java | 86 - .../resources/RuntimeExceptionMapper.java | 55 - .../jersey/resources/SessionsResource.java | 135 - .../server/jersey/resources/ZErrorWriter.java | 63 - .../jersey/resources/ZNodeResource.java | 412 - .../src/contrib/rest/src/python/README.txt | 9 - .../rest/src/python/demo_master_election.py | 90 - .../src/contrib/rest/src/python/demo_queue.py | 99 - .../src/contrib/rest/src/python/test.py | 163 - .../contrib/rest/src/python/zk_dump_tree.py | 108 - .../src/contrib/rest/src/python/zkrest.py | 218 - .../src/contrib/zkfuse/Makefile.am | 4 - .../src/contrib/zkfuse/README.txt | 63 - .../src/contrib/zkfuse/build.xml | 61 - .../src/contrib/zkfuse/configure.ac | 72 - .../src/contrib/zkfuse/src/Makefile.am | 7 - .../src/contrib/zkfuse/src/blockingqueue.h | 154 - .../src/contrib/zkfuse/src/doxygen.cfg | 1242 - .../src/contrib/zkfuse/src/event.cc | 29 - .../src/contrib/zkfuse/src/event.h | 553 - .../src/contrib/zkfuse/src/log.cc | 36 - .../src/contrib/zkfuse/src/log.h | 116 - .../src/contrib/zkfuse/src/log4cxx.properties | 28 - .../src/contrib/zkfuse/src/mutex.h | 169 - .../src/contrib/zkfuse/src/thread.cc | 41 - .../src/contrib/zkfuse/src/thread.h | 99 - .../src/contrib/zkfuse/src/zkadapter.cc | 881 - .../src/contrib/zkfuse/src/zkadapter.h | 718 - .../src/contrib/zkfuse/src/zkfuse.cc | 4492 ---- .../src/contrib/zkperl/Changes | 65 - .../src/contrib/zkperl/LICENSE | 202 - .../src/contrib/zkperl/MANIFEST | 23 - .../src/contrib/zkperl/Makefile.PL | 73 - .../zookeeper-3.4.6/src/contrib/zkperl/NOTICE | 6 - .../zookeeper-3.4.6/src/contrib/zkperl/README | 86 - .../src/contrib/zkperl/ZooKeeper.pm | 1257 - .../src/contrib/zkperl/ZooKeeper.xs | 2669 -- .../src/contrib/zkperl/build.xml | 61 - .../contrib/zkperl/build/check_zk_version.c | 29 - .../contrib/zkperl/build/check_zk_version.h | 27 - .../src/contrib/zkperl/t/10_invalid.t | 773 - .../src/contrib/zkperl/t/15_thread.t | 121 - .../src/contrib/zkperl/t/20_tie.t | 353 - .../src/contrib/zkperl/t/22_stat_tie.t | 438 - .../src/contrib/zkperl/t/24_watch_tie.t | 292 - .../src/contrib/zkperl/t/30_connect.t | 202 - .../src/contrib/zkperl/t/35_log.t | 88 - .../src/contrib/zkperl/t/40_basic.t | 277 - .../src/contrib/zkperl/t/45_class.t | 408 - .../src/contrib/zkperl/t/50_access.t | 356 - .../src/contrib/zkperl/t/60_watch.t | 304 - .../src/contrib/zkperl/t/util.pl | 62 - .../src/contrib/zkperl/typemap | 38 - .../src/contrib/zkpython/README | 109 - .../src/contrib/zkpython/build.xml | 198 - .../src/contrib/zkpython/ivy.xml | 43 - .../contrib/zkpython/src/c/pyzk_docstrings.h | 594 - .../src/contrib/zkpython/src/c/zookeeper.c | 1664 -- .../src/contrib/zkpython/src/examples/README | 8 - .../src/examples/watch_znode_for_changes.py | 202 - .../src/packages/deb/zkpython.control/control | 23 - .../src/packages/rpm/spec/zkpython.spec | 81 - .../src/contrib/zkpython/src/python/setup.py | 36 - .../src/contrib/zkpython/src/python/zk.py | 76 - .../src/contrib/zktreeutil/Makefile.am | 4 - .../src/contrib/zktreeutil/README.txt | 74 - .../src/contrib/zktreeutil/build.xml | 61 - .../src/contrib/zktreeutil/configure.ac | 66 - .../src/contrib/zktreeutil/src/Makefile.am | 24 - .../src/contrib/zktreeutil/src/SimpleTree.h | 150 - .../src/contrib/zktreeutil/src/ZkAdaptor.cc | 513 - .../src/contrib/zktreeutil/src/ZkAdaptor.h | 327 - .../src/contrib/zktreeutil/src/ZkTreeUtil.cc | 705 - .../src/contrib/zktreeutil/src/ZkTreeUtil.h | 262 - .../contrib/zktreeutil/src/ZkTreeUtilMain.cc | 247 - .../contrib/zktreeutil/tests/zk_sample.xml | 44 - .../src/contrib/zooinspector/NOTICE.txt | 3 - .../src/contrib/zooinspector/README.txt | 94 - .../src/contrib/zooinspector/build.xml | 152 - .../config/defaultConnectionSettings.cfg | 21 - .../config/defaultNodeVeiwers.cfg | 17 - .../zooinspector/icons/edtsrclkup_co.gif | Bin 204 -> 0 bytes .../contrib/zooinspector/icons/file_obj.gif | Bin 354 -> 0 bytes .../contrib/zooinspector/icons/fldr_obj.gif | Bin 216 -> 0 bytes .../contrib/zooinspector/icons/info_obj.gif | Bin 121 -> 0 bytes .../contrib/zooinspector/icons/jspdecl.gif | Bin 190 -> 0 bytes .../contrib/zooinspector/icons/launch_run.gif | Bin 379 -> 0 bytes .../zooinspector/icons/launch_stop.gif | Bin 916 -> 0 bytes .../contrib/zooinspector/icons/new_con.gif | Bin 353 -> 0 bytes .../contrib/zooinspector/icons/refresh.gif | Bin 327 -> 0 bytes .../contrib/zooinspector/icons/save_edit.gif | Bin 639 -> 0 bytes .../zooinspector/icons/search_next.gif | Bin 332 -> 0 bytes .../zooinspector/icons/search_prev.gif | Bin 323 -> 0 bytes .../src/contrib/zooinspector/icons/trash.gif | Bin 132 -> 0 bytes .../src/contrib/zooinspector/ivy.xml | 48 - .../zooinspector/lib/jtoaster-1.0.4.jar | Bin 14975 -> 0 bytes .../contrib/zooinspector/lib/log4j.properties | 9 - .../licences/Apache Software Licence v2.0.txt | 202 - .../zooinspector/licences/epl-v10.html | 261 - .../zookeeper/inspector/ZooInspector.java | 66 - .../BasicDataEncryptionManager.java | 50 - .../encryption/DataEncryptionManager.java | 39 - .../gui/NodeViewersChangeListener.java | 37 - .../gui/ZooInspectorAboutDialog.java | 80 - ...ooInspectorConnectionPropertiesDialog.java | 321 - .../gui/ZooInspectorIconResources.java | 118 - .../gui/ZooInspectorNodeViewersDialog.java | 605 - .../gui/ZooInspectorNodeViewersPanel.java | 140 - .../inspector/gui/ZooInspectorPanel.java | 361 - .../inspector/gui/ZooInspectorTreeViewer.java | 362 - .../apache/zookeeper/inspector/gui/about.html | 21 - .../gui/nodeviewer/NodeViewerACL.java | 187 - .../gui/nodeviewer/NodeViewerData.java | 146 - .../gui/nodeviewer/NodeViewerMetaData.java | 186 - .../nodeviewer/ZooInspectorNodeViewer.java | 138 - .../inspector/logger/LoggerFactory.java | 36 - .../inspector/manager/NodeListener.java | 37 - .../zookeeper/inspector/manager/Pair.java | 120 - .../manager/ZooInspectorManager.java | 139 - .../manager/ZooInspectorManagerImpl.java | 884 - .../manager/ZooInspectorNodeManager.java | 33 - .../manager/ZooInspectorNodeTreeManager.java | 43 - .../manager/ZooInspectorReadOnlyManager.java | 99 - .../zookeeper/retry/ZooKeeperRetry.java | 288 - .../contrib/zooinspector/zooInspector-dev.sh | 18 - .../src/contrib/zooinspector/zooInspector.cmd | 18 - .../src/contrib/zooinspector/zooInspector.sh | 18 - .../src/docs/forrest.properties | 108 - .../src/docs/src/documentation/README.txt | 7 - .../src/docs/src/documentation/TODO.txt | 227 - .../classes/CatalogManager.properties | 37 - .../content/xdocs/bookkeeperConfig.xml | 156 - .../content/xdocs/bookkeeperOverview.xml | 419 - .../content/xdocs/bookkeeperProgrammer.xml | 678 - .../content/xdocs/bookkeeperStarted.xml | 208 - .../content/xdocs/bookkeeperStream.xml | 331 - .../src/documentation/content/xdocs/index.xml | 98 - .../content/xdocs/javaExample.xml | 663 - .../documentation/content/xdocs/recipes.xml | 637 - .../content/xdocs/releasenotes.xml | 2875 --- .../src/documentation/content/xdocs/site.xml | 103 - .../src/documentation/content/xdocs/tabs.xml | 36 - .../content/xdocs/zookeeperAdmin.xml | 1532 -- .../xdocs/zookeeperHierarchicalQuorums.xml | 75 - .../content/xdocs/zookeeperInternals.xml | 487 - .../content/xdocs/zookeeperJMX.xml | 236 - .../content/xdocs/zookeeperObservers.xml | 145 - .../content/xdocs/zookeeperOtherInfo.xml | 46 - .../content/xdocs/zookeeperOver.xml | 464 - .../content/xdocs/zookeeperProgrammers.xml | 1658 -- .../content/xdocs/zookeeperQuotas.xml | 72 - .../content/xdocs/zookeeperStarted.xml | 423 - .../content/xdocs/zookeeperTutorial.xml | 675 - .../documentation/resources/images/2pc.jpg | Bin 15174 -> 0 bytes .../resources/images/bk-overview.jpg | Bin 124211 -> 0 bytes .../resources/images/favicon.ico | Bin 766 -> 0 bytes .../resources/images/hadoop-logo.jpg | Bin 9443 -> 0 bytes .../resources/images/state_dia.dia | Bin 2597 -> 0 bytes .../resources/images/state_dia.jpg | Bin 51364 -> 0 bytes .../documentation/resources/images/zkarch.jpg | Bin 24535 -> 0 bytes .../resources/images/zkcomponents.jpg | Bin 30831 -> 0 bytes .../resources/images/zknamespace.jpg | Bin 35414 -> 0 bytes .../resources/images/zkperfRW-3.2.jpg | Bin 41948 -> 0 bytes .../resources/images/zkperfRW.jpg | Bin 161542 -> 0 bytes .../resources/images/zkperfreliability.jpg | Bin 69825 -> 0 bytes .../resources/images/zkservice.jpg | Bin 86790 -> 0 bytes .../resources/images/zookeeper_small.gif | Bin 4847 -> 0 bytes .../src/docs/src/documentation/skinconf.xml | 360 - .../zookeeper-3.4.6/src/docs/status.xml | 74 - .../zookeeper-3.4.6/src/java/OldChangeLog | 0 .../src/java/generated/.generated | 0 .../org/apache/zookeeper/data/ACL.java | 122 - .../org/apache/zookeeper/data/Id.java | 121 - .../org/apache/zookeeper/data/Stat.java | 283 - .../apache/zookeeper/data/StatPersisted.java | 247 - .../zookeeper/data/StatPersistedV1.java | 229 - .../apache/zookeeper/proto/AuthPacket.java | 143 - .../zookeeper/proto/CheckVersionRequest.java | 121 - .../zookeeper/proto/ConnectRequest.java | 179 - .../zookeeper/proto/ConnectResponse.java | 161 - .../apache/zookeeper/proto/CreateRequest.java | 173 - .../zookeeper/proto/CreateResponse.java | 103 - .../apache/zookeeper/proto/DeleteRequest.java | 121 - .../apache/zookeeper/proto/ErrorResponse.java | 103 - .../apache/zookeeper/proto/ExistsRequest.java | 121 - .../zookeeper/proto/ExistsResponse.java | 104 - .../apache/zookeeper/proto/GetACLRequest.java | 103 - .../zookeeper/proto/GetACLResponse.java | 142 - .../zookeeper/proto/GetChildren2Request.java | 121 - .../zookeeper/proto/GetChildren2Response.java | 141 - .../zookeeper/proto/GetChildrenRequest.java | 121 - .../zookeeper/proto/GetChildrenResponse.java | 124 - .../zookeeper/proto/GetDataRequest.java | 121 - .../zookeeper/proto/GetDataResponse.java | 126 - .../proto/GetMaxChildrenRequest.java | 103 - .../proto/GetMaxChildrenResponse.java | 103 - .../zookeeper/proto/GetSASLRequest.java | 107 - .../apache/zookeeper/proto/MultiHeader.java | 139 - .../apache/zookeeper/proto/ReplyHeader.java | 139 - .../apache/zookeeper/proto/RequestHeader.java | 121 - .../apache/zookeeper/proto/SetACLRequest.java | 157 - .../zookeeper/proto/SetACLResponse.java | 104 - .../zookeeper/proto/SetDataRequest.java | 143 - .../zookeeper/proto/SetDataResponse.java | 104 - .../proto/SetMaxChildrenRequest.java | 121 - .../zookeeper/proto/SetSASLRequest.java | 107 - .../zookeeper/proto/SetSASLResponse.java | 107 - .../apache/zookeeper/proto/SetWatches.java | 228 - .../apache/zookeeper/proto/SyncRequest.java | 103 - .../apache/zookeeper/proto/SyncResponse.java | 103 - .../apache/zookeeper/proto/WatcherEvent.java | 139 - .../server/persistence/FileHeader.java | 139 - .../zookeeper/server/quorum/LearnerInfo.java | 121 - .../zookeeper/server/quorum/QuorumPacket.java | 173 - .../apache/zookeeper/txn/CheckVersionTxn.java | 121 - .../zookeeper/txn/CreateSessionTxn.java | 103 - .../org/apache/zookeeper/txn/CreateTxn.java | 189 - .../org/apache/zookeeper/txn/CreateTxnV0.java | 173 - .../org/apache/zookeeper/txn/DeleteTxn.java | 103 - .../org/apache/zookeeper/txn/ErrorTxn.java | 103 - .../org/apache/zookeeper/txn/MultiTxn.java | 125 - .../org/apache/zookeeper/txn/SetACLTxn.java | 157 - .../org/apache/zookeeper/txn/SetDataTxn.java | 143 - .../zookeeper/txn/SetMaxChildrenTxn.java | 121 - .../org/apache/zookeeper/txn/Txn.java | 125 - .../org/apache/zookeeper/txn/TxnHeader.java | 175 - .../org/apache/zookeeper/version/Info.java | 30 - .../src/java/lib/cobertura/README.txt | 3 - .../src/java/lib/jdiff/zookeeper_3.1.1.xml | 2717 -- .../lib/jdiff/zookeeper_3.4.6-SNAPSHOT.xml | 4559 ---- .../src/java/lib/jdiff/zookeeper_3.4.6.xml | 4559 ---- .../src/java/lib/jline-0.9.94.LICENSE.txt | 33 - .../src/java/lib/log4j-1.2.16.LICENSE.txt | 202 - .../org/apache/jute/BinaryInputArchive.java | 126 - .../org/apache/jute/BinaryOutputArchive.java | 146 - .../main/org/apache/jute/CsvInputArchive.java | 208 - .../org/apache/jute/CsvOutputArchive.java | 150 - .../src/java/main/org/apache/jute/Index.java | 38 - .../main/org/apache/jute/InputArchive.java | 43 - .../main/org/apache/jute/OutputArchive.java | 47 - .../src/java/main/org/apache/jute/Record.java | 32 - .../main/org/apache/jute/RecordReader.java | 93 - .../main/org/apache/jute/RecordWriter.java | 113 - .../src/java/main/org/apache/jute/Utils.java | 282 - .../main/org/apache/jute/XmlInputArchive.java | 251 - .../org/apache/jute/XmlOutputArchive.java | 251 - .../org/apache/jute/compiler/CGenerator.java | 130 - .../apache/jute/compiler/CSharpGenerator.java | 53 - .../apache/jute/compiler/CppGenerator.java | 125 - .../org/apache/jute/compiler/JBoolean.java | 50 - .../org/apache/jute/compiler/JBuffer.java | 106 - .../main/org/apache/jute/compiler/JByte.java | 34 - .../org/apache/jute/compiler/JCompType.java | 66 - .../org/apache/jute/compiler/JDouble.java | 40 - .../main/org/apache/jute/compiler/JField.java | 140 - .../main/org/apache/jute/compiler/JFile.java | 84 - .../main/org/apache/jute/compiler/JFloat.java | 39 - .../main/org/apache/jute/compiler/JInt.java | 34 - .../main/org/apache/jute/compiler/JLong.java | 38 - .../main/org/apache/jute/compiler/JMap.java | 149 - .../org/apache/jute/compiler/JRecord.java | 761 - .../org/apache/jute/compiler/JString.java | 46 - .../main/org/apache/jute/compiler/JType.java | 204 - .../org/apache/jute/compiler/JVector.java | 153 - .../apache/jute/compiler/JavaGenerator.java | 57 - .../compiler/generated/ParseException.java | 210 - .../apache/jute/compiler/generated/Rcc.java | 525 - .../jute/compiler/generated/RccConstants.java | 88 - .../compiler/generated/RccTokenManager.java | 833 - .../compiler/generated/SimpleCharStream.java | 457 - .../apache/jute/compiler/generated/Token.java | 99 - .../compiler/generated/TokenMgrError.java | 151 - .../jute/compiler/generated/package.html | 28 - .../org/apache/jute/compiler/generated/rcc.jj | 374 - .../org/apache/jute/compiler/package.html | 30 - .../java/main/org/apache/jute/package.html | 801 - .../org/apache/zookeeper/AsyncCallback.java | 57 - .../main/org/apache/zookeeper/ClientCnxn.java | 1412 -- .../apache/zookeeper/ClientCnxnSocket.java | 174 - .../apache/zookeeper/ClientCnxnSocketNIO.java | 431 - .../apache/zookeeper/ClientWatchManager.java | 40 - .../main/org/apache/zookeeper/CreateMode.java | 92 - .../org/apache/zookeeper/Environment.java | 103 - .../apache/zookeeper/JLineZNodeCompletor.java | 84 - .../org/apache/zookeeper/KeeperException.java | 702 - .../java/main/org/apache/zookeeper/Login.java | 402 - .../org/apache/zookeeper/MultiResponse.java | 166 - .../zookeeper/MultiTransactionRecord.java | 160 - .../java/main/org/apache/zookeeper/Op.java | 351 - .../main/org/apache/zookeeper/OpResult.java | 185 - .../main/org/apache/zookeeper/Quotas.java | 68 - .../apache/zookeeper/ServerAdminClient.java | 313 - .../java/main/org/apache/zookeeper/Shell.java | 475 - .../main/org/apache/zookeeper/StatsTrack.java | 101 - .../org/apache/zookeeper/Transaction.java | 63 - .../main/org/apache/zookeeper/Version.java | 79 - .../org/apache/zookeeper/WatchedEvent.java | 79 - .../main/org/apache/zookeeper/Watcher.java | 149 - .../main/org/apache/zookeeper/ZKUtil.java | 124 - .../main/org/apache/zookeeper/ZooDefs.java | 119 - .../main/org/apache/zookeeper/ZooKeeper.java | 1788 -- .../org/apache/zookeeper/ZooKeeperMain.java | 859 - .../zookeeper/client/ConnectStringParser.java | 87 - .../zookeeper/client/FourLetterWordMain.java | 79 - .../apache/zookeeper/client/HostProvider.java | 61 - .../zookeeper/client/StaticHostProvider.java | 116 - .../zookeeper/client/ZooKeeperSaslClient.java | 584 - .../common/AtomicFileOutputStream.java | 115 - .../org/apache/zookeeper/common/IOUtils.java | 123 - .../org/apache/zookeeper/common/PathTrie.java | 293 - .../apache/zookeeper/common/PathUtils.java | 103 - .../org/apache/zookeeper/jmx/CommonNames.java | 29 - .../apache/zookeeper/jmx/MBeanRegistry.java | 215 - .../org/apache/zookeeper/jmx/ManagedUtil.java | 71 - .../org/apache/zookeeper/jmx/ZKMBeanInfo.java | 36 - .../server/ByteBufferInputStream.java | 82 - .../server/ByteBufferOutputStream.java | 52 - .../zookeeper/server/ConnectionBean.java | 173 - .../zookeeper/server/ConnectionMXBean.java | 98 - .../org/apache/zookeeper/server/DataNode.java | 173 - .../org/apache/zookeeper/server/DataTree.java | 1350 - .../apache/zookeeper/server/DataTreeBean.java | 61 - .../zookeeper/server/DataTreeMXBean.java | 47 - .../server/DatadirCleanupManager.java | 192 - .../server/FinalRequestProcessor.java | 418 - .../apache/zookeeper/server/LogFormatter.java | 106 - .../zookeeper/server/NIOServerCnxn.java | 1162 - .../server/NIOServerCnxnFactory.java | 309 - .../zookeeper/server/NettyServerCnxn.java | 856 - .../server/NettyServerCnxnFactory.java | 403 - .../apache/zookeeper/server/ObserverBean.java | 45 - .../server/PrepRequestProcessor.java | 766 - .../apache/zookeeper/server/PurgeTxnLog.java | 133 - .../org/apache/zookeeper/server/Request.java | 241 - .../zookeeper/server/RequestProcessor.java | 44 - .../apache/zookeeper/server/ServerCnxn.java | 452 - .../zookeeper/server/ServerCnxnFactory.java | 211 - .../apache/zookeeper/server/ServerConfig.java | 111 - .../apache/zookeeper/server/ServerStats.java | 139 - .../zookeeper/server/SessionTracker.java | 81 - .../zookeeper/server/SessionTrackerImpl.java | 279 - .../zookeeper/server/SnapshotFormatter.java | 128 - .../org/apache/zookeeper/server/Stats.java | 68 - .../server/SyncRequestProcessor.java | 235 - .../zookeeper/server/TraceFormatter.java | 123 - .../server/UnimplementedRequestProcessor.java | 48 - .../apache/zookeeper/server/WatchManager.java | 171 - .../apache/zookeeper/server/ZKDatabase.java | 502 - .../zookeeper/server/ZooKeeperSaslServer.java | 173 - .../zookeeper/server/ZooKeeperServer.java | 1012 - .../zookeeper/server/ZooKeeperServerBean.java | 147 - .../server/ZooKeeperServerMXBean.java | 110 - .../zookeeper/server/ZooKeeperServerMain.java | 134 - .../org/apache/zookeeper/server/ZooTrace.java | 93 - .../server/auth/AuthenticationProvider.java | 82 - .../auth/DigestAuthenticationProvider.java | 139 - .../server/auth/DigestLoginModule.java | 61 - .../server/auth/IPAuthenticationProvider.java | 117 - .../zookeeper/server/auth/KerberosName.java | 418 - .../server/auth/ProviderRegistry.java | 77 - .../auth/SASLAuthenticationProvider.java | 70 - .../auth/SaslServerCallbackHandler.java | 152 - .../org/apache/zookeeper/server/package.html | 101 - .../server/persistence/FileSnap.java | 250 - .../server/persistence/FileTxnLog.java | 684 - .../server/persistence/FileTxnSnapLog.java | 341 - .../server/persistence/SnapShot.java | 66 - .../zookeeper/server/persistence/TxnLog.java | 121 - .../zookeeper/server/persistence/Util.java | 326 - .../server/quorum/AckRequestProcessor.java | 54 - .../server/quorum/AuthFastLeaderElection.java | 978 - .../server/quorum/CommitProcessor.java | 192 - .../zookeeper/server/quorum/Election.java | 27 - .../server/quorum/FastLeaderElection.java | 999 - .../zookeeper/server/quorum/Follower.java | 169 - .../zookeeper/server/quorum/FollowerBean.java | 50 - .../server/quorum/FollowerMXBean.java | 41 - .../quorum/FollowerRequestProcessor.java | 112 - .../quorum/FollowerZooKeeperServer.java | 164 - .../zookeeper/server/quorum/Leader.java | 1055 - .../zookeeper/server/quorum/LeaderBean.java | 53 - .../server/quorum/LeaderElection.java | 295 - .../server/quorum/LeaderElectionBean.java | 42 - .../server/quorum/LeaderElectionMXBean.java | 31 - .../zookeeper/server/quorum/LeaderMXBean.java | 36 - .../server/quorum/LeaderZooKeeperServer.java | 180 - .../zookeeper/server/quorum/Learner.java | 549 - .../server/quorum/LearnerHandler.java | 700 - .../server/quorum/LearnerSessionTracker.java | 96 - .../server/quorum/LearnerSyncRequest.java | 34 - .../server/quorum/LearnerZooKeeperServer.java | 145 - .../server/quorum/LocalPeerBean.java | 79 - .../server/quorum/LocalPeerMXBean.java | 77 - .../zookeeper/server/quorum/Observer.java | 141 - .../server/quorum/ObserverMXBean.java | 37 - .../quorum/ObserverRequestProcessor.java | 126 - .../quorum/ObserverZooKeeperServer.java | 147 - .../quorum/ProposalRequestProcessor.java | 93 - .../zookeeper/server/quorum/QuorumBean.java | 44 - .../server/quorum/QuorumCnxManager.java | 903 - .../zookeeper/server/quorum/QuorumMXBean.java | 34 - .../zookeeper/server/quorum/QuorumPeer.java | 1249 - .../server/quorum/QuorumPeerConfig.java | 425 - .../server/quorum/QuorumPeerMain.java | 160 - .../zookeeper/server/quorum/QuorumStats.java | 68 - .../server/quorum/QuorumZooKeeperServer.java | 60 - .../zookeeper/server/quorum/ReadOnlyBean.java | 38 - .../quorum/ReadOnlyRequestProcessor.java | 128 - .../quorum/ReadOnlyZooKeeperServer.java | 146 - .../server/quorum/RemotePeerBean.java | 45 - .../server/quorum/RemotePeerMXBean.java | 33 - .../quorum/SendAckRequestProcessor.java | 80 - .../zookeeper/server/quorum/ServerBean.java | 38 - .../zookeeper/server/quorum/ServerMXBean.java | 33 - .../zookeeper/server/quorum/StateSummary.java | 57 - .../apache/zookeeper/server/quorum/Vote.java | 169 - .../quorum/flexible/QuorumHierarchical.java | 273 - .../server/quorum/flexible/QuorumMaj.java | 63 - .../quorum/flexible/QuorumVerifier.java | 33 - .../zookeeper/server/upgrade/DataNodeV1.java | 129 - .../zookeeper/server/upgrade/DataTreeV1.java | 584 - .../zookeeper/server/upgrade/UpgradeMain.java | 181 - .../server/upgrade/UpgradeSnapShot.java | 33 - .../server/upgrade/UpgradeSnapShotV1.java | 332 - .../zookeeper/server/util/KerberosUtil.java | 45 - .../zookeeper/server/util/OSMXBean.java | 182 - .../zookeeper/server/util/Profiler.java | 41 - .../zookeeper/server/util/SerializeUtils.java | 141 - .../zookeeper/server/util/ZxidUtils.java | 34 - .../apache/zookeeper/version/util/VerGen.java | 177 - .../src/java/main/overview.html | 26 - .../src/java/systest/README.txt | 62 - .../zookeeper-3.4.6/src/lastRevision.bat | 23 - .../zookeeper-3.4.6/src/lastRevision.sh | 21 - .../src/packages/deb/init.d/zookeeper | 140 - .../packages/deb/zookeeper.control/conffile | 15 - .../packages/deb/zookeeper.control/control | 23 - .../packages/deb/zookeeper.control/postinst | 23 - .../src/packages/deb/zookeeper.control/postrm | 19 - .../packages/deb/zookeeper.control/preinst | 20 - .../src/packages/deb/zookeeper.control/prerm | 24 - .../src/packages/rpm/init.d/zookeeper | 84 - .../src/packages/rpm/spec/zookeeper.spec | 166 - .../packages/templates/conf/zookeeper-env.sh | 16 - .../src/packages/update-zookeeper-env.sh | 163 - .../zookeeper-3.4.6/src/recipes/README.txt | 25 - .../src/recipes/build-recipes.xml | 177 - .../zookeeper-3.4.6/src/recipes/build.xml | 79 - .../src/recipes/election/README.txt | 27 - .../src/recipes/election/build.xml | 128 - .../recipes/leader/LeaderElectionAware.java | 37 - .../recipes/leader/LeaderElectionSupport.java | 461 - .../zookeeper/recipes/leader/LeaderOffer.java | 84 - .../src/recipes/lock/README.txt | 28 - .../src/recipes/lock/build.xml | 128 - .../src/recipes/lock/src/c/INSTALL | 234 - .../src/recipes/lock/src/c/LICENSE | 202 - .../src/recipes/lock/src/c/Makefile.am | 46 - .../src/recipes/lock/src/c/README.txt | 28 - .../src/recipes/lock/src/c/acinclude.m4 | 312 - .../src/recipes/lock/src/c/aminclude.am | 186 - .../src/recipes/lock/src/c/c-doc.Doxyfile | 1252 - .../src/recipes/lock/src/c/configure.ac | 82 - .../src/recipes/lock/src/c/include/zoo_lock.h | 168 - .../src/recipes/lock/src/c/src/zoo_lock.c | 396 - .../recipes/lock/src/c/tests/TestClient.cc | 201 - .../recipes/lock/src/c/tests/TestDriver.cc | 114 - .../src/recipes/lock/src/c/tests/Util.cc | 30 - .../src/recipes/lock/src/c/tests/Util.h | 134 - .../src/recipes/lock/src/c/tests/zkServer.sh | 75 - .../zookeeper/recipes/lock/LockListener.java | 38 - .../recipes/lock/ProtocolSupport.java | 193 - .../zookeeper/recipes/lock/WriteLock.java | 296 - .../zookeeper/recipes/lock/ZNodeName.java | 110 - .../recipes/lock/ZooKeeperOperation.java | 38 - .../src/recipes/queue/README.txt | 30 - .../src/recipes/queue/build.xml | 128 - .../src/recipes/queue/src/c/INSTALL | 234 - .../src/recipes/queue/src/c/LICENSE | 202 - .../src/recipes/queue/src/c/Makefile.am | 46 - .../src/recipes/queue/src/c/README.txt | 30 - .../src/recipes/queue/src/c/acinclude.m4 | 312 - .../src/recipes/queue/src/c/aminclude.am | 186 - .../src/recipes/queue/src/c/c-doc.Doxyfile | 1252 - .../src/recipes/queue/src/c/configure.ac | 82 - .../recipes/queue/src/c/include/zoo_queue.h | 118 - .../src/recipes/queue/src/c/src/zoo_queue.c | 442 - .../recipes/queue/src/c/tests/TestClient.cc | 452 - .../recipes/queue/src/c/tests/TestDriver.cc | 114 - .../src/recipes/queue/src/c/tests/Util.cc | 30 - .../src/recipes/queue/src/c/tests/Util.h | 134 - .../src/recipes/queue/src/c/tests/zkServer.sh | 75 - .../recipes/queue/DistributedQueue.java | 313 - .../zookeeper-3.4.6/src/zookeeper.jute | 288 - .../zookeeper-3.4.6.jar.REMOVED.git-id | 1 - .../zookeeper-3.4.6/zookeeper-3.4.6.jar.asc | 17 - .../zookeeper-3.4.6/zookeeper-3.4.6.jar.md5 | 1 - .../zookeeper-3.4.6/zookeeper-3.4.6.jar.sha1 | 1 - 1254 files changed, 397862 deletions(-) delete mode 100644 pkg/registry/zookeeper-3.4.6/CHANGES.txt delete mode 100644 pkg/registry/zookeeper-3.4.6/LICENSE.txt delete mode 100644 pkg/registry/zookeeper-3.4.6/NOTICE.txt delete mode 100644 pkg/registry/zookeeper-3.4.6/README.txt delete mode 100644 pkg/registry/zookeeper-3.4.6/README_packaging.txt delete mode 100755 pkg/registry/zookeeper-3.4.6/bin/README.txt delete mode 100755 pkg/registry/zookeeper-3.4.6/bin/zkCleanup.sh delete mode 100755 pkg/registry/zookeeper-3.4.6/bin/zkCli.cmd delete mode 100755 pkg/registry/zookeeper-3.4.6/bin/zkCli.sh delete mode 100755 pkg/registry/zookeeper-3.4.6/bin/zkEnv.cmd delete mode 100755 pkg/registry/zookeeper-3.4.6/bin/zkEnv.sh delete mode 100755 pkg/registry/zookeeper-3.4.6/bin/zkServer.cmd delete mode 100755 pkg/registry/zookeeper-3.4.6/bin/zkServer.sh delete mode 100644 pkg/registry/zookeeper-3.4.6/build.xml delete mode 100644 pkg/registry/zookeeper-3.4.6/conf/configuration.xsl delete mode 100644 pkg/registry/zookeeper-3.4.6/conf/log4j.properties delete mode 100644 pkg/registry/zookeeper-3.4.6/conf/zoo_sample.cfg delete mode 100644 pkg/registry/zookeeper-3.4.6/contrib/ZooInspector/build.xml delete mode 100644 pkg/registry/zookeeper-3.4.6/contrib/ZooInspector/config/defaultConnectionSettings.cfg delete mode 100644 pkg/registry/zookeeper-3.4.6/contrib/ZooInspector/config/defaultNodeVeiwers.cfg delete mode 100644 pkg/registry/zookeeper-3.4.6/contrib/ZooInspector/icons/edtsrclkup_co.gif delete mode 100644 pkg/registry/zookeeper-3.4.6/contrib/ZooInspector/icons/file_obj.gif delete mode 100644 pkg/registry/zookeeper-3.4.6/contrib/ZooInspector/icons/fldr_obj.gif delete mode 100644 pkg/registry/zookeeper-3.4.6/contrib/ZooInspector/icons/info_obj.gif delete mode 100644 pkg/registry/zookeeper-3.4.6/contrib/ZooInspector/icons/jspdecl.gif delete mode 100644 pkg/registry/zookeeper-3.4.6/contrib/ZooInspector/icons/launch_run.gif delete mode 100644 pkg/registry/zookeeper-3.4.6/contrib/ZooInspector/icons/launch_stop.gif delete mode 100644 pkg/registry/zookeeper-3.4.6/contrib/ZooInspector/icons/new_con.gif delete mode 100644 pkg/registry/zookeeper-3.4.6/contrib/ZooInspector/icons/refresh.gif delete mode 100644 pkg/registry/zookeeper-3.4.6/contrib/ZooInspector/icons/save_edit.gif delete mode 100644 pkg/registry/zookeeper-3.4.6/contrib/ZooInspector/icons/search_next.gif delete mode 100644 pkg/registry/zookeeper-3.4.6/contrib/ZooInspector/icons/search_prev.gif delete mode 100644 pkg/registry/zookeeper-3.4.6/contrib/ZooInspector/icons/trash.gif delete mode 100644 pkg/registry/zookeeper-3.4.6/contrib/ZooInspector/lib/jtoaster-1.0.4.jar delete mode 100644 pkg/registry/zookeeper-3.4.6/contrib/ZooInspector/licences/Apache Software Licence v2.0.txt delete mode 100644 pkg/registry/zookeeper-3.4.6/contrib/ZooInspector/licences/epl-v10.html delete mode 100644 pkg/registry/zookeeper-3.4.6/contrib/ZooInspector/src/java/org/apache/zookeeper/inspector/ZooInspector.java delete mode 100644 pkg/registry/zookeeper-3.4.6/contrib/ZooInspector/src/java/org/apache/zookeeper/inspector/encryption/BasicDataEncryptionManager.java delete mode 100644 pkg/registry/zookeeper-3.4.6/contrib/ZooInspector/src/java/org/apache/zookeeper/inspector/encryption/DataEncryptionManager.java delete mode 100644 pkg/registry/zookeeper-3.4.6/contrib/ZooInspector/src/java/org/apache/zookeeper/inspector/gui/NodeViewersChangeListener.java delete mode 100644 pkg/registry/zookeeper-3.4.6/contrib/ZooInspector/src/java/org/apache/zookeeper/inspector/gui/ZooInspectorAboutDialog.java delete mode 100644 pkg/registry/zookeeper-3.4.6/contrib/ZooInspector/src/java/org/apache/zookeeper/inspector/gui/ZooInspectorConnectionPropertiesDialog.java delete mode 100644 pkg/registry/zookeeper-3.4.6/contrib/ZooInspector/src/java/org/apache/zookeeper/inspector/gui/ZooInspectorIconResources.java delete mode 100644 pkg/registry/zookeeper-3.4.6/contrib/ZooInspector/src/java/org/apache/zookeeper/inspector/gui/ZooInspectorNodeViewersDialog.java delete mode 100644 pkg/registry/zookeeper-3.4.6/contrib/ZooInspector/src/java/org/apache/zookeeper/inspector/gui/ZooInspectorNodeViewersPanel.java delete mode 100644 pkg/registry/zookeeper-3.4.6/contrib/ZooInspector/src/java/org/apache/zookeeper/inspector/gui/ZooInspectorPanel.java delete mode 100644 pkg/registry/zookeeper-3.4.6/contrib/ZooInspector/src/java/org/apache/zookeeper/inspector/gui/ZooInspectorTreeViewer.java delete mode 100644 pkg/registry/zookeeper-3.4.6/contrib/ZooInspector/src/java/org/apache/zookeeper/inspector/gui/about.html delete mode 100644 pkg/registry/zookeeper-3.4.6/contrib/ZooInspector/src/java/org/apache/zookeeper/inspector/gui/nodeviewer/NodeViewerACL.java delete mode 100644 pkg/registry/zookeeper-3.4.6/contrib/ZooInspector/src/java/org/apache/zookeeper/inspector/gui/nodeviewer/NodeViewerData.java delete mode 100644 pkg/registry/zookeeper-3.4.6/contrib/ZooInspector/src/java/org/apache/zookeeper/inspector/gui/nodeviewer/NodeViewerMetaData.java delete mode 100644 pkg/registry/zookeeper-3.4.6/contrib/ZooInspector/src/java/org/apache/zookeeper/inspector/gui/nodeviewer/ZooInspectorNodeViewer.java delete mode 100644 pkg/registry/zookeeper-3.4.6/contrib/ZooInspector/src/java/org/apache/zookeeper/inspector/logger/LoggerFactory.java delete mode 100644 pkg/registry/zookeeper-3.4.6/contrib/ZooInspector/src/java/org/apache/zookeeper/inspector/manager/NodeListener.java delete mode 100644 pkg/registry/zookeeper-3.4.6/contrib/ZooInspector/src/java/org/apache/zookeeper/inspector/manager/Pair.java delete mode 100644 pkg/registry/zookeeper-3.4.6/contrib/ZooInspector/src/java/org/apache/zookeeper/inspector/manager/ZooInspectorManager.java delete mode 100644 pkg/registry/zookeeper-3.4.6/contrib/ZooInspector/src/java/org/apache/zookeeper/inspector/manager/ZooInspectorManagerImpl.java delete mode 100644 pkg/registry/zookeeper-3.4.6/contrib/ZooInspector/src/java/org/apache/zookeeper/inspector/manager/ZooInspectorNodeManager.java delete mode 100644 pkg/registry/zookeeper-3.4.6/contrib/ZooInspector/src/java/org/apache/zookeeper/inspector/manager/ZooInspectorNodeTreeManager.java delete mode 100644 pkg/registry/zookeeper-3.4.6/contrib/ZooInspector/src/java/org/apache/zookeeper/inspector/manager/ZooInspectorReadOnlyManager.java delete mode 100644 pkg/registry/zookeeper-3.4.6/contrib/ZooInspector/src/java/org/apache/zookeeper/retry/ZooKeeperRetry.java delete mode 100644 pkg/registry/zookeeper-3.4.6/contrib/ZooInspector/zookeeper-3.4.6-ZooInspector.jar delete mode 100644 pkg/registry/zookeeper-3.4.6/contrib/fatjar/build.xml delete mode 100644 pkg/registry/zookeeper-3.4.6/contrib/fatjar/conf/mainClasses delete mode 100644 pkg/registry/zookeeper-3.4.6/contrib/fatjar/src/java/org/apache/zookeeper/util/FatJarMain.java delete mode 100644 pkg/registry/zookeeper-3.4.6/contrib/fatjar/zookeeper-3.4.6-fatjar.jar.REMOVED.git-id delete mode 100644 pkg/registry/zookeeper-3.4.6/contrib/loggraph/build.xml delete mode 100644 pkg/registry/zookeeper-3.4.6/contrib/loggraph/src/java/org/apache/zookeeper/graph/FilterException.java delete mode 100644 pkg/registry/zookeeper-3.4.6/contrib/loggraph/src/java/org/apache/zookeeper/graph/FilterOp.java delete mode 100644 pkg/registry/zookeeper-3.4.6/contrib/loggraph/src/java/org/apache/zookeeper/graph/FilterParser.java delete mode 100644 pkg/registry/zookeeper-3.4.6/contrib/loggraph/src/java/org/apache/zookeeper/graph/JsonGenerator.java delete mode 100644 pkg/registry/zookeeper-3.4.6/contrib/loggraph/src/java/org/apache/zookeeper/graph/Log4JEntry.java delete mode 100644 pkg/registry/zookeeper-3.4.6/contrib/loggraph/src/java/org/apache/zookeeper/graph/Log4JSource.java delete mode 100644 pkg/registry/zookeeper-3.4.6/contrib/loggraph/src/java/org/apache/zookeeper/graph/LogEntry.java delete mode 100644 pkg/registry/zookeeper-3.4.6/contrib/loggraph/src/java/org/apache/zookeeper/graph/LogIterator.java delete mode 100644 pkg/registry/zookeeper-3.4.6/contrib/loggraph/src/java/org/apache/zookeeper/graph/LogServer.java delete mode 100644 pkg/registry/zookeeper-3.4.6/contrib/loggraph/src/java/org/apache/zookeeper/graph/LogSkipList.java delete mode 100644 pkg/registry/zookeeper-3.4.6/contrib/loggraph/src/java/org/apache/zookeeper/graph/LogSource.java delete mode 100644 pkg/registry/zookeeper-3.4.6/contrib/loggraph/src/java/org/apache/zookeeper/graph/MeasureThroughput.java delete mode 100644 pkg/registry/zookeeper-3.4.6/contrib/loggraph/src/java/org/apache/zookeeper/graph/MergedLogSource.java delete mode 100644 pkg/registry/zookeeper-3.4.6/contrib/loggraph/src/java/org/apache/zookeeper/graph/RandomAccessFileReader.java delete mode 100644 pkg/registry/zookeeper-3.4.6/contrib/loggraph/src/java/org/apache/zookeeper/graph/TransactionEntry.java delete mode 100644 pkg/registry/zookeeper-3.4.6/contrib/loggraph/src/java/org/apache/zookeeper/graph/TxnLogSource.java delete mode 100644 pkg/registry/zookeeper-3.4.6/contrib/loggraph/src/java/org/apache/zookeeper/graph/filterops/AndOp.java delete mode 100644 pkg/registry/zookeeper-3.4.6/contrib/loggraph/src/java/org/apache/zookeeper/graph/filterops/Arg.java delete mode 100644 pkg/registry/zookeeper-3.4.6/contrib/loggraph/src/java/org/apache/zookeeper/graph/filterops/EqualsOp.java delete mode 100644 pkg/registry/zookeeper-3.4.6/contrib/loggraph/src/java/org/apache/zookeeper/graph/filterops/GreaterThanOp.java delete mode 100644 pkg/registry/zookeeper-3.4.6/contrib/loggraph/src/java/org/apache/zookeeper/graph/filterops/LessThanOp.java delete mode 100644 pkg/registry/zookeeper-3.4.6/contrib/loggraph/src/java/org/apache/zookeeper/graph/filterops/NotOp.java delete mode 100644 pkg/registry/zookeeper-3.4.6/contrib/loggraph/src/java/org/apache/zookeeper/graph/filterops/NumberArg.java delete mode 100644 pkg/registry/zookeeper-3.4.6/contrib/loggraph/src/java/org/apache/zookeeper/graph/filterops/OrOp.java delete mode 100644 pkg/registry/zookeeper-3.4.6/contrib/loggraph/src/java/org/apache/zookeeper/graph/filterops/StringArg.java delete mode 100644 pkg/registry/zookeeper-3.4.6/contrib/loggraph/src/java/org/apache/zookeeper/graph/filterops/SymbolArg.java delete mode 100644 pkg/registry/zookeeper-3.4.6/contrib/loggraph/src/java/org/apache/zookeeper/graph/filterops/XorOp.java delete mode 100644 pkg/registry/zookeeper-3.4.6/contrib/loggraph/src/java/org/apache/zookeeper/graph/servlets/FileLoader.java delete mode 100644 pkg/registry/zookeeper-3.4.6/contrib/loggraph/src/java/org/apache/zookeeper/graph/servlets/Fs.java delete mode 100644 pkg/registry/zookeeper-3.4.6/contrib/loggraph/src/java/org/apache/zookeeper/graph/servlets/GraphData.java delete mode 100644 pkg/registry/zookeeper-3.4.6/contrib/loggraph/src/java/org/apache/zookeeper/graph/servlets/JsonServlet.java delete mode 100644 pkg/registry/zookeeper-3.4.6/contrib/loggraph/src/java/org/apache/zookeeper/graph/servlets/NumEvents.java delete mode 100644 pkg/registry/zookeeper-3.4.6/contrib/loggraph/src/java/org/apache/zookeeper/graph/servlets/StaticContent.java delete mode 100644 pkg/registry/zookeeper-3.4.6/contrib/loggraph/src/java/org/apache/zookeeper/graph/servlets/Throughput.java delete mode 100644 pkg/registry/zookeeper-3.4.6/contrib/loggraph/zookeeper-3.4.6-loggraph.jar delete mode 100644 pkg/registry/zookeeper-3.4.6/contrib/rest/zookeeper-3.4.6-rest.jar delete mode 100644 pkg/registry/zookeeper-3.4.6/contrib/zkfuse/Makefile.am delete mode 100644 pkg/registry/zookeeper-3.4.6/contrib/zkfuse/README.txt delete mode 100644 pkg/registry/zookeeper-3.4.6/contrib/zkfuse/VERSION delete mode 100644 pkg/registry/zookeeper-3.4.6/contrib/zkfuse/build.xml delete mode 100644 pkg/registry/zookeeper-3.4.6/contrib/zkfuse/configure.ac delete mode 100644 pkg/registry/zookeeper-3.4.6/contrib/zkfuse/src/Makefile.am delete mode 100644 pkg/registry/zookeeper-3.4.6/contrib/zkfuse/src/blockingqueue.h delete mode 100644 pkg/registry/zookeeper-3.4.6/contrib/zkfuse/src/doxygen.cfg delete mode 100644 pkg/registry/zookeeper-3.4.6/contrib/zkfuse/src/event.cc delete mode 100644 pkg/registry/zookeeper-3.4.6/contrib/zkfuse/src/event.h delete mode 100644 pkg/registry/zookeeper-3.4.6/contrib/zkfuse/src/log.cc delete mode 100644 pkg/registry/zookeeper-3.4.6/contrib/zkfuse/src/log.h delete mode 100644 pkg/registry/zookeeper-3.4.6/contrib/zkfuse/src/log4cxx.properties delete mode 100644 pkg/registry/zookeeper-3.4.6/contrib/zkfuse/src/mutex.h delete mode 100644 pkg/registry/zookeeper-3.4.6/contrib/zkfuse/src/thread.cc delete mode 100644 pkg/registry/zookeeper-3.4.6/contrib/zkfuse/src/thread.h delete mode 100644 pkg/registry/zookeeper-3.4.6/contrib/zkfuse/src/zkadapter.cc delete mode 100644 pkg/registry/zookeeper-3.4.6/contrib/zkfuse/src/zkadapter.h delete mode 100644 pkg/registry/zookeeper-3.4.6/contrib/zkfuse/src/zkfuse.cc delete mode 100644 pkg/registry/zookeeper-3.4.6/contrib/zkperl/Changes delete mode 100644 pkg/registry/zookeeper-3.4.6/contrib/zkperl/LICENSE delete mode 100644 pkg/registry/zookeeper-3.4.6/contrib/zkperl/MANIFEST delete mode 100644 pkg/registry/zookeeper-3.4.6/contrib/zkperl/Makefile.PL delete mode 100644 pkg/registry/zookeeper-3.4.6/contrib/zkperl/NOTICE delete mode 100644 pkg/registry/zookeeper-3.4.6/contrib/zkperl/README delete mode 100644 pkg/registry/zookeeper-3.4.6/contrib/zkperl/VERSION delete mode 100644 pkg/registry/zookeeper-3.4.6/contrib/zkperl/ZooKeeper.pm delete mode 100644 pkg/registry/zookeeper-3.4.6/contrib/zkperl/ZooKeeper.xs delete mode 100644 pkg/registry/zookeeper-3.4.6/contrib/zkperl/build.xml delete mode 100644 pkg/registry/zookeeper-3.4.6/contrib/zkperl/build/check_zk_version.c delete mode 100644 pkg/registry/zookeeper-3.4.6/contrib/zkperl/build/check_zk_version.h delete mode 100644 pkg/registry/zookeeper-3.4.6/contrib/zkperl/t/10_invalid.t delete mode 100644 pkg/registry/zookeeper-3.4.6/contrib/zkperl/t/15_thread.t delete mode 100644 pkg/registry/zookeeper-3.4.6/contrib/zkperl/t/20_tie.t delete mode 100644 pkg/registry/zookeeper-3.4.6/contrib/zkperl/t/22_stat_tie.t delete mode 100644 pkg/registry/zookeeper-3.4.6/contrib/zkperl/t/24_watch_tie.t delete mode 100644 pkg/registry/zookeeper-3.4.6/contrib/zkperl/t/30_connect.t delete mode 100644 pkg/registry/zookeeper-3.4.6/contrib/zkperl/t/35_log.t delete mode 100644 pkg/registry/zookeeper-3.4.6/contrib/zkperl/t/40_basic.t delete mode 100644 pkg/registry/zookeeper-3.4.6/contrib/zkperl/t/45_class.t delete mode 100644 pkg/registry/zookeeper-3.4.6/contrib/zkperl/t/50_access.t delete mode 100644 pkg/registry/zookeeper-3.4.6/contrib/zkperl/t/60_watch.t delete mode 100644 pkg/registry/zookeeper-3.4.6/contrib/zkperl/t/util.pl delete mode 100644 pkg/registry/zookeeper-3.4.6/contrib/zkperl/typemap delete mode 100644 pkg/registry/zookeeper-3.4.6/contrib/zkpython/README delete mode 100644 pkg/registry/zookeeper-3.4.6/contrib/zkpython/VERSION delete mode 100644 pkg/registry/zookeeper-3.4.6/contrib/zkpython/build.xml delete mode 100644 pkg/registry/zookeeper-3.4.6/contrib/zkpython/ivy.xml delete mode 100644 pkg/registry/zookeeper-3.4.6/contrib/zkpython/src/c/pyzk_docstrings.h delete mode 100644 pkg/registry/zookeeper-3.4.6/contrib/zkpython/src/c/zookeeper.c delete mode 100644 pkg/registry/zookeeper-3.4.6/contrib/zkpython/src/examples/README delete mode 100644 pkg/registry/zookeeper-3.4.6/contrib/zkpython/src/examples/watch_znode_for_changes.py delete mode 100644 pkg/registry/zookeeper-3.4.6/contrib/zkpython/src/packages/deb/zkpython.control/control delete mode 100644 pkg/registry/zookeeper-3.4.6/contrib/zkpython/src/packages/rpm/spec/zkpython.spec delete mode 100644 pkg/registry/zookeeper-3.4.6/contrib/zkpython/src/python/setup.py delete mode 100644 pkg/registry/zookeeper-3.4.6/contrib/zkpython/src/python/zk.py delete mode 100644 pkg/registry/zookeeper-3.4.6/contrib/zktreeutil/Makefile.am delete mode 100644 pkg/registry/zookeeper-3.4.6/contrib/zktreeutil/README.txt delete mode 100644 pkg/registry/zookeeper-3.4.6/contrib/zktreeutil/VERSION delete mode 100644 pkg/registry/zookeeper-3.4.6/contrib/zktreeutil/build.xml delete mode 100644 pkg/registry/zookeeper-3.4.6/contrib/zktreeutil/configure.ac delete mode 100644 pkg/registry/zookeeper-3.4.6/contrib/zktreeutil/src/Makefile.am delete mode 100644 pkg/registry/zookeeper-3.4.6/contrib/zktreeutil/src/SimpleTree.h delete mode 100644 pkg/registry/zookeeper-3.4.6/contrib/zktreeutil/src/ZkAdaptor.cc delete mode 100644 pkg/registry/zookeeper-3.4.6/contrib/zktreeutil/src/ZkAdaptor.h delete mode 100644 pkg/registry/zookeeper-3.4.6/contrib/zktreeutil/src/ZkTreeUtil.cc delete mode 100644 pkg/registry/zookeeper-3.4.6/contrib/zktreeutil/src/ZkTreeUtil.h delete mode 100644 pkg/registry/zookeeper-3.4.6/contrib/zktreeutil/src/ZkTreeUtilMain.cc delete mode 100644 pkg/registry/zookeeper-3.4.6/contrib/zktreeutil/tests/zk_sample.xml delete mode 100644 pkg/registry/zookeeper-3.4.6/dist-maven/zookeeper-3.4.6-javadoc.jar delete mode 100644 pkg/registry/zookeeper-3.4.6/dist-maven/zookeeper-3.4.6-javadoc.jar.asc delete mode 100644 pkg/registry/zookeeper-3.4.6/dist-maven/zookeeper-3.4.6-javadoc.jar.md5 delete mode 100644 pkg/registry/zookeeper-3.4.6/dist-maven/zookeeper-3.4.6-javadoc.jar.sha1 delete mode 100644 pkg/registry/zookeeper-3.4.6/dist-maven/zookeeper-3.4.6-sources.jar delete mode 100644 pkg/registry/zookeeper-3.4.6/dist-maven/zookeeper-3.4.6-sources.jar.asc delete mode 100644 pkg/registry/zookeeper-3.4.6/dist-maven/zookeeper-3.4.6-sources.jar.md5 delete mode 100644 pkg/registry/zookeeper-3.4.6/dist-maven/zookeeper-3.4.6-sources.jar.sha1 delete mode 100644 pkg/registry/zookeeper-3.4.6/dist-maven/zookeeper-3.4.6-tests.jar delete mode 100644 pkg/registry/zookeeper-3.4.6/dist-maven/zookeeper-3.4.6-tests.jar.asc delete mode 100644 pkg/registry/zookeeper-3.4.6/dist-maven/zookeeper-3.4.6-tests.jar.md5 delete mode 100644 pkg/registry/zookeeper-3.4.6/dist-maven/zookeeper-3.4.6-tests.jar.sha1 delete mode 100644 pkg/registry/zookeeper-3.4.6/dist-maven/zookeeper-3.4.6.jar.asc delete mode 100644 pkg/registry/zookeeper-3.4.6/dist-maven/zookeeper-3.4.6.jar.md5 delete mode 100644 pkg/registry/zookeeper-3.4.6/dist-maven/zookeeper-3.4.6.jar.sha1 delete mode 100644 pkg/registry/zookeeper-3.4.6/dist-maven/zookeeper-3.4.6.pom delete mode 100644 pkg/registry/zookeeper-3.4.6/dist-maven/zookeeper-3.4.6.pom.asc delete mode 100644 pkg/registry/zookeeper-3.4.6/dist-maven/zookeeper-3.4.6.pom.md5 delete mode 100644 pkg/registry/zookeeper-3.4.6/dist-maven/zookeeper-3.4.6.pom.sha1 delete mode 100644 pkg/registry/zookeeper-3.4.6/docs/api/allclasses-frame.html delete mode 100644 pkg/registry/zookeeper-3.4.6/docs/api/allclasses-noframe.html delete mode 100644 pkg/registry/zookeeper-3.4.6/docs/api/constant-values.html delete mode 100644 pkg/registry/zookeeper-3.4.6/docs/api/deprecated-list.html delete mode 100644 pkg/registry/zookeeper-3.4.6/docs/api/help-doc.html delete mode 100644 pkg/registry/zookeeper-3.4.6/docs/api/index-all.html delete mode 100644 pkg/registry/zookeeper-3.4.6/docs/api/index.html delete mode 100644 pkg/registry/zookeeper-3.4.6/docs/api/org/apache/zookeeper/AsyncCallback.ACLCallback.html delete mode 100644 pkg/registry/zookeeper-3.4.6/docs/api/org/apache/zookeeper/AsyncCallback.Children2Callback.html delete mode 100644 pkg/registry/zookeeper-3.4.6/docs/api/org/apache/zookeeper/AsyncCallback.ChildrenCallback.html delete mode 100644 pkg/registry/zookeeper-3.4.6/docs/api/org/apache/zookeeper/AsyncCallback.DataCallback.html delete mode 100644 pkg/registry/zookeeper-3.4.6/docs/api/org/apache/zookeeper/AsyncCallback.StatCallback.html delete mode 100644 pkg/registry/zookeeper-3.4.6/docs/api/org/apache/zookeeper/AsyncCallback.StringCallback.html delete mode 100644 pkg/registry/zookeeper-3.4.6/docs/api/org/apache/zookeeper/AsyncCallback.VoidCallback.html delete mode 100644 pkg/registry/zookeeper-3.4.6/docs/api/org/apache/zookeeper/AsyncCallback.html delete mode 100644 pkg/registry/zookeeper-3.4.6/docs/api/org/apache/zookeeper/CreateMode.html delete mode 100644 pkg/registry/zookeeper-3.4.6/docs/api/org/apache/zookeeper/KeeperException.APIErrorException.html delete mode 100644 pkg/registry/zookeeper-3.4.6/docs/api/org/apache/zookeeper/KeeperException.AuthFailedException.html delete mode 100644 pkg/registry/zookeeper-3.4.6/docs/api/org/apache/zookeeper/KeeperException.BadArgumentsException.html delete mode 100644 pkg/registry/zookeeper-3.4.6/docs/api/org/apache/zookeeper/KeeperException.BadVersionException.html delete mode 100644 pkg/registry/zookeeper-3.4.6/docs/api/org/apache/zookeeper/KeeperException.Code.html delete mode 100644 pkg/registry/zookeeper-3.4.6/docs/api/org/apache/zookeeper/KeeperException.CodeDeprecated.html delete mode 100644 pkg/registry/zookeeper-3.4.6/docs/api/org/apache/zookeeper/KeeperException.ConnectionLossException.html delete mode 100644 pkg/registry/zookeeper-3.4.6/docs/api/org/apache/zookeeper/KeeperException.DataInconsistencyException.html delete mode 100644 pkg/registry/zookeeper-3.4.6/docs/api/org/apache/zookeeper/KeeperException.InvalidACLException.html delete mode 100644 pkg/registry/zookeeper-3.4.6/docs/api/org/apache/zookeeper/KeeperException.InvalidCallbackException.html delete mode 100644 pkg/registry/zookeeper-3.4.6/docs/api/org/apache/zookeeper/KeeperException.MarshallingErrorException.html delete mode 100644 pkg/registry/zookeeper-3.4.6/docs/api/org/apache/zookeeper/KeeperException.NoAuthException.html delete mode 100644 pkg/registry/zookeeper-3.4.6/docs/api/org/apache/zookeeper/KeeperException.NoChildrenForEphemeralsException.html delete mode 100644 pkg/registry/zookeeper-3.4.6/docs/api/org/apache/zookeeper/KeeperException.NoNodeException.html delete mode 100644 pkg/registry/zookeeper-3.4.6/docs/api/org/apache/zookeeper/KeeperException.NodeExistsException.html delete mode 100644 pkg/registry/zookeeper-3.4.6/docs/api/org/apache/zookeeper/KeeperException.NotEmptyException.html delete mode 100644 pkg/registry/zookeeper-3.4.6/docs/api/org/apache/zookeeper/KeeperException.NotReadOnlyException.html delete mode 100644 pkg/registry/zookeeper-3.4.6/docs/api/org/apache/zookeeper/KeeperException.OperationTimeoutException.html delete mode 100644 pkg/registry/zookeeper-3.4.6/docs/api/org/apache/zookeeper/KeeperException.RuntimeInconsistencyException.html delete mode 100644 pkg/registry/zookeeper-3.4.6/docs/api/org/apache/zookeeper/KeeperException.SessionExpiredException.html delete mode 100644 pkg/registry/zookeeper-3.4.6/docs/api/org/apache/zookeeper/KeeperException.SessionMovedException.html delete mode 100644 pkg/registry/zookeeper-3.4.6/docs/api/org/apache/zookeeper/KeeperException.SystemErrorException.html delete mode 100644 pkg/registry/zookeeper-3.4.6/docs/api/org/apache/zookeeper/KeeperException.UnimplementedException.html delete mode 100644 pkg/registry/zookeeper-3.4.6/docs/api/org/apache/zookeeper/KeeperException.html delete mode 100644 pkg/registry/zookeeper-3.4.6/docs/api/org/apache/zookeeper/ServerAdminClient.html delete mode 100644 pkg/registry/zookeeper-3.4.6/docs/api/org/apache/zookeeper/WatchedEvent.html delete mode 100644 pkg/registry/zookeeper-3.4.6/docs/api/org/apache/zookeeper/Watcher.Event.EventType.html delete mode 100644 pkg/registry/zookeeper-3.4.6/docs/api/org/apache/zookeeper/Watcher.Event.KeeperState.html delete mode 100644 pkg/registry/zookeeper-3.4.6/docs/api/org/apache/zookeeper/Watcher.Event.html delete mode 100644 pkg/registry/zookeeper-3.4.6/docs/api/org/apache/zookeeper/Watcher.html delete mode 100644 pkg/registry/zookeeper-3.4.6/docs/api/org/apache/zookeeper/ZooDefs.Ids.html delete mode 100644 pkg/registry/zookeeper-3.4.6/docs/api/org/apache/zookeeper/ZooDefs.OpCode.html delete mode 100644 pkg/registry/zookeeper-3.4.6/docs/api/org/apache/zookeeper/ZooDefs.Perms.html delete mode 100644 pkg/registry/zookeeper-3.4.6/docs/api/org/apache/zookeeper/ZooDefs.html delete mode 100644 pkg/registry/zookeeper-3.4.6/docs/api/org/apache/zookeeper/ZooKeeper.States.html delete mode 100644 pkg/registry/zookeeper-3.4.6/docs/api/org/apache/zookeeper/ZooKeeper.html delete mode 100644 pkg/registry/zookeeper-3.4.6/docs/api/org/apache/zookeeper/ZooKeeperMain.html delete mode 100644 pkg/registry/zookeeper-3.4.6/docs/api/org/apache/zookeeper/class-use/AsyncCallback.ACLCallback.html delete mode 100644 pkg/registry/zookeeper-3.4.6/docs/api/org/apache/zookeeper/class-use/AsyncCallback.Children2Callback.html delete mode 100644 pkg/registry/zookeeper-3.4.6/docs/api/org/apache/zookeeper/class-use/AsyncCallback.ChildrenCallback.html delete mode 100644 pkg/registry/zookeeper-3.4.6/docs/api/org/apache/zookeeper/class-use/AsyncCallback.DataCallback.html delete mode 100644 pkg/registry/zookeeper-3.4.6/docs/api/org/apache/zookeeper/class-use/AsyncCallback.StatCallback.html delete mode 100644 pkg/registry/zookeeper-3.4.6/docs/api/org/apache/zookeeper/class-use/AsyncCallback.StringCallback.html delete mode 100644 pkg/registry/zookeeper-3.4.6/docs/api/org/apache/zookeeper/class-use/AsyncCallback.VoidCallback.html delete mode 100644 pkg/registry/zookeeper-3.4.6/docs/api/org/apache/zookeeper/class-use/AsyncCallback.html delete mode 100644 pkg/registry/zookeeper-3.4.6/docs/api/org/apache/zookeeper/class-use/CreateMode.html delete mode 100644 pkg/registry/zookeeper-3.4.6/docs/api/org/apache/zookeeper/class-use/KeeperException.APIErrorException.html delete mode 100644 pkg/registry/zookeeper-3.4.6/docs/api/org/apache/zookeeper/class-use/KeeperException.AuthFailedException.html delete mode 100644 pkg/registry/zookeeper-3.4.6/docs/api/org/apache/zookeeper/class-use/KeeperException.BadArgumentsException.html delete mode 100644 pkg/registry/zookeeper-3.4.6/docs/api/org/apache/zookeeper/class-use/KeeperException.BadVersionException.html delete mode 100644 pkg/registry/zookeeper-3.4.6/docs/api/org/apache/zookeeper/class-use/KeeperException.Code.html delete mode 100644 pkg/registry/zookeeper-3.4.6/docs/api/org/apache/zookeeper/class-use/KeeperException.CodeDeprecated.html delete mode 100644 pkg/registry/zookeeper-3.4.6/docs/api/org/apache/zookeeper/class-use/KeeperException.ConnectionLossException.html delete mode 100644 pkg/registry/zookeeper-3.4.6/docs/api/org/apache/zookeeper/class-use/KeeperException.DataInconsistencyException.html delete mode 100644 pkg/registry/zookeeper-3.4.6/docs/api/org/apache/zookeeper/class-use/KeeperException.InvalidACLException.html delete mode 100644 pkg/registry/zookeeper-3.4.6/docs/api/org/apache/zookeeper/class-use/KeeperException.InvalidCallbackException.html delete mode 100644 pkg/registry/zookeeper-3.4.6/docs/api/org/apache/zookeeper/class-use/KeeperException.MarshallingErrorException.html delete mode 100644 pkg/registry/zookeeper-3.4.6/docs/api/org/apache/zookeeper/class-use/KeeperException.NoAuthException.html delete mode 100644 pkg/registry/zookeeper-3.4.6/docs/api/org/apache/zookeeper/class-use/KeeperException.NoChildrenForEphemeralsException.html delete mode 100644 pkg/registry/zookeeper-3.4.6/docs/api/org/apache/zookeeper/class-use/KeeperException.NoNodeException.html delete mode 100644 pkg/registry/zookeeper-3.4.6/docs/api/org/apache/zookeeper/class-use/KeeperException.NodeExistsException.html delete mode 100644 pkg/registry/zookeeper-3.4.6/docs/api/org/apache/zookeeper/class-use/KeeperException.NotEmptyException.html delete mode 100644 pkg/registry/zookeeper-3.4.6/docs/api/org/apache/zookeeper/class-use/KeeperException.NotReadOnlyException.html delete mode 100644 pkg/registry/zookeeper-3.4.6/docs/api/org/apache/zookeeper/class-use/KeeperException.OperationTimeoutException.html delete mode 100644 pkg/registry/zookeeper-3.4.6/docs/api/org/apache/zookeeper/class-use/KeeperException.RuntimeInconsistencyException.html delete mode 100644 pkg/registry/zookeeper-3.4.6/docs/api/org/apache/zookeeper/class-use/KeeperException.SessionExpiredException.html delete mode 100644 pkg/registry/zookeeper-3.4.6/docs/api/org/apache/zookeeper/class-use/KeeperException.SessionMovedException.html delete mode 100644 pkg/registry/zookeeper-3.4.6/docs/api/org/apache/zookeeper/class-use/KeeperException.SystemErrorException.html delete mode 100644 pkg/registry/zookeeper-3.4.6/docs/api/org/apache/zookeeper/class-use/KeeperException.UnimplementedException.html delete mode 100644 pkg/registry/zookeeper-3.4.6/docs/api/org/apache/zookeeper/class-use/KeeperException.html delete mode 100644 pkg/registry/zookeeper-3.4.6/docs/api/org/apache/zookeeper/class-use/ServerAdminClient.html delete mode 100644 pkg/registry/zookeeper-3.4.6/docs/api/org/apache/zookeeper/class-use/WatchedEvent.html delete mode 100644 pkg/registry/zookeeper-3.4.6/docs/api/org/apache/zookeeper/class-use/Watcher.Event.EventType.html delete mode 100644 pkg/registry/zookeeper-3.4.6/docs/api/org/apache/zookeeper/class-use/Watcher.Event.KeeperState.html delete mode 100644 pkg/registry/zookeeper-3.4.6/docs/api/org/apache/zookeeper/class-use/Watcher.Event.html delete mode 100644 pkg/registry/zookeeper-3.4.6/docs/api/org/apache/zookeeper/class-use/Watcher.html delete mode 100644 pkg/registry/zookeeper-3.4.6/docs/api/org/apache/zookeeper/class-use/ZooDefs.Ids.html delete mode 100644 pkg/registry/zookeeper-3.4.6/docs/api/org/apache/zookeeper/class-use/ZooDefs.OpCode.html delete mode 100644 pkg/registry/zookeeper-3.4.6/docs/api/org/apache/zookeeper/class-use/ZooDefs.Perms.html delete mode 100644 pkg/registry/zookeeper-3.4.6/docs/api/org/apache/zookeeper/class-use/ZooDefs.html delete mode 100644 pkg/registry/zookeeper-3.4.6/docs/api/org/apache/zookeeper/class-use/ZooKeeper.States.html delete mode 100644 pkg/registry/zookeeper-3.4.6/docs/api/org/apache/zookeeper/class-use/ZooKeeper.html delete mode 100644 pkg/registry/zookeeper-3.4.6/docs/api/org/apache/zookeeper/class-use/ZooKeeperMain.html delete mode 100644 pkg/registry/zookeeper-3.4.6/docs/api/org/apache/zookeeper/client/FourLetterWordMain.html delete mode 100644 pkg/registry/zookeeper-3.4.6/docs/api/org/apache/zookeeper/client/class-use/FourLetterWordMain.html delete mode 100644 pkg/registry/zookeeper-3.4.6/docs/api/org/apache/zookeeper/client/package-frame.html delete mode 100644 pkg/registry/zookeeper-3.4.6/docs/api/org/apache/zookeeper/client/package-summary.html delete mode 100644 pkg/registry/zookeeper-3.4.6/docs/api/org/apache/zookeeper/client/package-tree.html delete mode 100644 pkg/registry/zookeeper-3.4.6/docs/api/org/apache/zookeeper/client/package-use.html delete mode 100644 pkg/registry/zookeeper-3.4.6/docs/api/org/apache/zookeeper/data/ACL.html delete mode 100644 pkg/registry/zookeeper-3.4.6/docs/api/org/apache/zookeeper/data/Id.html delete mode 100644 pkg/registry/zookeeper-3.4.6/docs/api/org/apache/zookeeper/data/Stat.html delete mode 100644 pkg/registry/zookeeper-3.4.6/docs/api/org/apache/zookeeper/data/StatPersisted.html delete mode 100644 pkg/registry/zookeeper-3.4.6/docs/api/org/apache/zookeeper/data/StatPersistedV1.html delete mode 100644 pkg/registry/zookeeper-3.4.6/docs/api/org/apache/zookeeper/data/class-use/ACL.html delete mode 100644 pkg/registry/zookeeper-3.4.6/docs/api/org/apache/zookeeper/data/class-use/Id.html delete mode 100644 pkg/registry/zookeeper-3.4.6/docs/api/org/apache/zookeeper/data/class-use/Stat.html delete mode 100644 pkg/registry/zookeeper-3.4.6/docs/api/org/apache/zookeeper/data/class-use/StatPersisted.html delete mode 100644 pkg/registry/zookeeper-3.4.6/docs/api/org/apache/zookeeper/data/class-use/StatPersistedV1.html delete mode 100644 pkg/registry/zookeeper-3.4.6/docs/api/org/apache/zookeeper/data/package-frame.html delete mode 100644 pkg/registry/zookeeper-3.4.6/docs/api/org/apache/zookeeper/data/package-summary.html delete mode 100644 pkg/registry/zookeeper-3.4.6/docs/api/org/apache/zookeeper/data/package-tree.html delete mode 100644 pkg/registry/zookeeper-3.4.6/docs/api/org/apache/zookeeper/data/package-use.html delete mode 100644 pkg/registry/zookeeper-3.4.6/docs/api/org/apache/zookeeper/package-frame.html delete mode 100644 pkg/registry/zookeeper-3.4.6/docs/api/org/apache/zookeeper/package-summary.html delete mode 100644 pkg/registry/zookeeper-3.4.6/docs/api/org/apache/zookeeper/package-tree.html delete mode 100644 pkg/registry/zookeeper-3.4.6/docs/api/org/apache/zookeeper/package-use.html delete mode 100644 pkg/registry/zookeeper-3.4.6/docs/api/org/apache/zookeeper/server/LogFormatter.html delete mode 100644 pkg/registry/zookeeper-3.4.6/docs/api/org/apache/zookeeper/server/PurgeTxnLog.html delete mode 100644 pkg/registry/zookeeper-3.4.6/docs/api/org/apache/zookeeper/server/SnapshotFormatter.html delete mode 100644 pkg/registry/zookeeper-3.4.6/docs/api/org/apache/zookeeper/server/ZooKeeperServerMain.html delete mode 100644 pkg/registry/zookeeper-3.4.6/docs/api/org/apache/zookeeper/server/class-use/LogFormatter.html delete mode 100644 pkg/registry/zookeeper-3.4.6/docs/api/org/apache/zookeeper/server/class-use/PurgeTxnLog.html delete mode 100644 pkg/registry/zookeeper-3.4.6/docs/api/org/apache/zookeeper/server/class-use/SnapshotFormatter.html delete mode 100644 pkg/registry/zookeeper-3.4.6/docs/api/org/apache/zookeeper/server/class-use/ZooKeeperServerMain.html delete mode 100644 pkg/registry/zookeeper-3.4.6/docs/api/org/apache/zookeeper/server/package-frame.html delete mode 100644 pkg/registry/zookeeper-3.4.6/docs/api/org/apache/zookeeper/server/package-summary.html delete mode 100644 pkg/registry/zookeeper-3.4.6/docs/api/org/apache/zookeeper/server/package-tree.html delete mode 100644 pkg/registry/zookeeper-3.4.6/docs/api/org/apache/zookeeper/server/package-use.html delete mode 100644 pkg/registry/zookeeper-3.4.6/docs/api/org/apache/zookeeper/server/quorum/QuorumPeerMain.html delete mode 100644 pkg/registry/zookeeper-3.4.6/docs/api/org/apache/zookeeper/server/quorum/class-use/QuorumPeerMain.html delete mode 100644 pkg/registry/zookeeper-3.4.6/docs/api/org/apache/zookeeper/server/quorum/package-frame.html delete mode 100644 pkg/registry/zookeeper-3.4.6/docs/api/org/apache/zookeeper/server/quorum/package-summary.html delete mode 100644 pkg/registry/zookeeper-3.4.6/docs/api/org/apache/zookeeper/server/quorum/package-tree.html delete mode 100644 pkg/registry/zookeeper-3.4.6/docs/api/org/apache/zookeeper/server/quorum/package-use.html delete mode 100644 pkg/registry/zookeeper-3.4.6/docs/api/org/apache/zookeeper/server/upgrade/UpgradeMain.html delete mode 100644 pkg/registry/zookeeper-3.4.6/docs/api/org/apache/zookeeper/server/upgrade/class-use/UpgradeMain.html delete mode 100644 pkg/registry/zookeeper-3.4.6/docs/api/org/apache/zookeeper/server/upgrade/package-frame.html delete mode 100644 pkg/registry/zookeeper-3.4.6/docs/api/org/apache/zookeeper/server/upgrade/package-summary.html delete mode 100644 pkg/registry/zookeeper-3.4.6/docs/api/org/apache/zookeeper/server/upgrade/package-tree.html delete mode 100644 pkg/registry/zookeeper-3.4.6/docs/api/org/apache/zookeeper/server/upgrade/package-use.html delete mode 100644 pkg/registry/zookeeper-3.4.6/docs/api/overview-frame.html delete mode 100644 pkg/registry/zookeeper-3.4.6/docs/api/overview-summary.html delete mode 100644 pkg/registry/zookeeper-3.4.6/docs/api/overview-tree.html delete mode 100644 pkg/registry/zookeeper-3.4.6/docs/api/package-list delete mode 100644 pkg/registry/zookeeper-3.4.6/docs/api/resources/background.gif delete mode 100644 pkg/registry/zookeeper-3.4.6/docs/api/resources/tab.gif delete mode 100644 pkg/registry/zookeeper-3.4.6/docs/api/resources/titlebar.gif delete mode 100644 pkg/registry/zookeeper-3.4.6/docs/api/resources/titlebar_end.gif delete mode 100644 pkg/registry/zookeeper-3.4.6/docs/api/serialized-form.html delete mode 100644 pkg/registry/zookeeper-3.4.6/docs/bookkeeperConfig.html delete mode 100644 pkg/registry/zookeeper-3.4.6/docs/bookkeeperConfig.pdf delete mode 100644 pkg/registry/zookeeper-3.4.6/docs/bookkeeperOverview.html delete mode 100644 pkg/registry/zookeeper-3.4.6/docs/bookkeeperOverview.pdf delete mode 100644 pkg/registry/zookeeper-3.4.6/docs/bookkeeperProgrammer.html delete mode 100644 pkg/registry/zookeeper-3.4.6/docs/bookkeeperProgrammer.pdf delete mode 100644 pkg/registry/zookeeper-3.4.6/docs/bookkeeperStarted.html delete mode 100644 pkg/registry/zookeeper-3.4.6/docs/bookkeeperStarted.pdf delete mode 100644 pkg/registry/zookeeper-3.4.6/docs/bookkeeperStream.html delete mode 100644 pkg/registry/zookeeper-3.4.6/docs/bookkeeperStream.pdf delete mode 100644 pkg/registry/zookeeper-3.4.6/docs/broken-links.xml delete mode 100644 pkg/registry/zookeeper-3.4.6/docs/images/2pc.jpg delete mode 100644 pkg/registry/zookeeper-3.4.6/docs/images/bk-overview.jpg delete mode 100644 pkg/registry/zookeeper-3.4.6/docs/images/built-with-forrest-button.png delete mode 100644 pkg/registry/zookeeper-3.4.6/docs/images/favicon.ico delete mode 100644 pkg/registry/zookeeper-3.4.6/docs/images/hadoop-logo.jpg delete mode 100644 pkg/registry/zookeeper-3.4.6/docs/images/instruction_arrow.png delete mode 100644 pkg/registry/zookeeper-3.4.6/docs/images/state_dia.jpg delete mode 100644 pkg/registry/zookeeper-3.4.6/docs/images/zkcomponents.jpg delete mode 100644 pkg/registry/zookeeper-3.4.6/docs/images/zknamespace.jpg delete mode 100644 pkg/registry/zookeeper-3.4.6/docs/images/zkperfRW-3.2.jpg delete mode 100644 pkg/registry/zookeeper-3.4.6/docs/images/zkperfRW.jpg delete mode 100644 pkg/registry/zookeeper-3.4.6/docs/images/zkperfreliability.jpg delete mode 100644 pkg/registry/zookeeper-3.4.6/docs/images/zkservice.jpg delete mode 100644 pkg/registry/zookeeper-3.4.6/docs/images/zookeeper_small.gif delete mode 100644 pkg/registry/zookeeper-3.4.6/docs/index.html delete mode 100644 pkg/registry/zookeeper-3.4.6/docs/index.pdf delete mode 100644 pkg/registry/zookeeper-3.4.6/docs/javaExample.html delete mode 100644 pkg/registry/zookeeper-3.4.6/docs/javaExample.pdf delete mode 100644 pkg/registry/zookeeper-3.4.6/docs/jdiff/changes.html delete mode 100644 pkg/registry/zookeeper-3.4.6/docs/jdiff/changes/alldiffs_index_additions.html delete mode 100644 pkg/registry/zookeeper-3.4.6/docs/jdiff/changes/alldiffs_index_all.html delete mode 100644 pkg/registry/zookeeper-3.4.6/docs/jdiff/changes/alldiffs_index_changes.html delete mode 100644 pkg/registry/zookeeper-3.4.6/docs/jdiff/changes/alldiffs_index_removals.html delete mode 100644 pkg/registry/zookeeper-3.4.6/docs/jdiff/changes/changes-summary.html delete mode 100644 pkg/registry/zookeeper-3.4.6/docs/jdiff/changes/classes_index_additions.html delete mode 100644 pkg/registry/zookeeper-3.4.6/docs/jdiff/changes/classes_index_all.html delete mode 100644 pkg/registry/zookeeper-3.4.6/docs/jdiff/changes/classes_index_changes.html delete mode 100644 pkg/registry/zookeeper-3.4.6/docs/jdiff/changes/classes_index_removals.html delete mode 100644 pkg/registry/zookeeper-3.4.6/docs/jdiff/changes/constructors_index_additions.html delete mode 100644 pkg/registry/zookeeper-3.4.6/docs/jdiff/changes/constructors_index_all.html delete mode 100644 pkg/registry/zookeeper-3.4.6/docs/jdiff/changes/constructors_index_changes.html delete mode 100644 pkg/registry/zookeeper-3.4.6/docs/jdiff/changes/constructors_index_removals.html delete mode 100644 pkg/registry/zookeeper-3.4.6/docs/jdiff/changes/fields_index_additions.html delete mode 100644 pkg/registry/zookeeper-3.4.6/docs/jdiff/changes/fields_index_all.html delete mode 100644 pkg/registry/zookeeper-3.4.6/docs/jdiff/changes/fields_index_changes.html delete mode 100644 pkg/registry/zookeeper-3.4.6/docs/jdiff/changes/fields_index_removals.html delete mode 100644 pkg/registry/zookeeper-3.4.6/docs/jdiff/changes/jdiff_help.html delete mode 100644 pkg/registry/zookeeper-3.4.6/docs/jdiff/changes/jdiff_statistics.html delete mode 100644 pkg/registry/zookeeper-3.4.6/docs/jdiff/changes/jdiff_topleftframe.html delete mode 100644 pkg/registry/zookeeper-3.4.6/docs/jdiff/changes/methods_index_additions.html delete mode 100644 pkg/registry/zookeeper-3.4.6/docs/jdiff/changes/methods_index_all.html delete mode 100644 pkg/registry/zookeeper-3.4.6/docs/jdiff/changes/methods_index_changes.html delete mode 100644 pkg/registry/zookeeper-3.4.6/docs/jdiff/changes/methods_index_removals.html delete mode 100644 pkg/registry/zookeeper-3.4.6/docs/jdiff/changes/org.apache.zookeeper.ClientCnxn.html delete mode 100644 pkg/registry/zookeeper-3.4.6/docs/jdiff/changes/org.apache.zookeeper.Environment.html delete mode 100644 pkg/registry/zookeeper-3.4.6/docs/jdiff/changes/org.apache.zookeeper.KeeperException.BadArgumentsException.html delete mode 100644 pkg/registry/zookeeper-3.4.6/docs/jdiff/changes/org.apache.zookeeper.KeeperException.BadVersionException.html delete mode 100644 pkg/registry/zookeeper-3.4.6/docs/jdiff/changes/org.apache.zookeeper.KeeperException.Code.html delete mode 100644 pkg/registry/zookeeper-3.4.6/docs/jdiff/changes/org.apache.zookeeper.KeeperException.InvalidACLException.html delete mode 100644 pkg/registry/zookeeper-3.4.6/docs/jdiff/changes/org.apache.zookeeper.KeeperException.NoChildrenForEphemeralsException.html delete mode 100644 pkg/registry/zookeeper-3.4.6/docs/jdiff/changes/org.apache.zookeeper.KeeperException.NoNodeException.html delete mode 100644 pkg/registry/zookeeper-3.4.6/docs/jdiff/changes/org.apache.zookeeper.KeeperException.NodeExistsException.html delete mode 100644 pkg/registry/zookeeper-3.4.6/docs/jdiff/changes/org.apache.zookeeper.KeeperException.NotEmptyException.html delete mode 100644 pkg/registry/zookeeper-3.4.6/docs/jdiff/changes/org.apache.zookeeper.KeeperException.html delete mode 100644 pkg/registry/zookeeper-3.4.6/docs/jdiff/changes/org.apache.zookeeper.Watcher.Event.KeeperState.html delete mode 100644 pkg/registry/zookeeper-3.4.6/docs/jdiff/changes/org.apache.zookeeper.ZooDefs.OpCode.html delete mode 100644 pkg/registry/zookeeper-3.4.6/docs/jdiff/changes/org.apache.zookeeper.ZooKeeper.States.html delete mode 100644 pkg/registry/zookeeper-3.4.6/docs/jdiff/changes/org.apache.zookeeper.ZooKeeper.html delete mode 100644 pkg/registry/zookeeper-3.4.6/docs/jdiff/changes/org.apache.zookeeper.ZooKeeperMain.html delete mode 100644 pkg/registry/zookeeper-3.4.6/docs/jdiff/changes/packages_index_additions.html delete mode 100644 pkg/registry/zookeeper-3.4.6/docs/jdiff/changes/packages_index_all.html delete mode 100644 pkg/registry/zookeeper-3.4.6/docs/jdiff/changes/packages_index_changes.html delete mode 100644 pkg/registry/zookeeper-3.4.6/docs/jdiff/changes/packages_index_removals.html delete mode 100644 pkg/registry/zookeeper-3.4.6/docs/jdiff/changes/pkg_org.apache.zookeeper.html delete mode 100644 pkg/registry/zookeeper-3.4.6/docs/jdiff/missingSinces.txt delete mode 100644 pkg/registry/zookeeper-3.4.6/docs/jdiff/user_comments_for_zookeeper_3.1.1_to_zookeeper_3.4.6.xml delete mode 100644 pkg/registry/zookeeper-3.4.6/docs/linkmap.html delete mode 100644 pkg/registry/zookeeper-3.4.6/docs/linkmap.pdf delete mode 100644 pkg/registry/zookeeper-3.4.6/docs/recipes.html delete mode 100644 pkg/registry/zookeeper-3.4.6/docs/recipes.pdf delete mode 100644 pkg/registry/zookeeper-3.4.6/docs/releasenotes.html delete mode 100644 pkg/registry/zookeeper-3.4.6/docs/releasenotes.pdf delete mode 100644 pkg/registry/zookeeper-3.4.6/docs/skin/CommonMessages_de.xml delete mode 100644 pkg/registry/zookeeper-3.4.6/docs/skin/CommonMessages_en_US.xml delete mode 100644 pkg/registry/zookeeper-3.4.6/docs/skin/CommonMessages_es.xml delete mode 100644 pkg/registry/zookeeper-3.4.6/docs/skin/CommonMessages_fr.xml delete mode 100644 pkg/registry/zookeeper-3.4.6/docs/skin/images/README.txt delete mode 100644 pkg/registry/zookeeper-3.4.6/docs/skin/images/add.jpg delete mode 100644 pkg/registry/zookeeper-3.4.6/docs/skin/images/apache-thanks.png delete mode 100644 pkg/registry/zookeeper-3.4.6/docs/skin/images/built-with-cocoon.gif delete mode 100644 pkg/registry/zookeeper-3.4.6/docs/skin/images/built-with-forrest-button.png delete mode 100644 pkg/registry/zookeeper-3.4.6/docs/skin/images/chapter.gif delete mode 100644 pkg/registry/zookeeper-3.4.6/docs/skin/images/chapter_open.gif delete mode 100644 pkg/registry/zookeeper-3.4.6/docs/skin/images/current.gif delete mode 100644 pkg/registry/zookeeper-3.4.6/docs/skin/images/error.png delete mode 100644 pkg/registry/zookeeper-3.4.6/docs/skin/images/external-link.gif delete mode 100644 pkg/registry/zookeeper-3.4.6/docs/skin/images/fix.jpg delete mode 100644 pkg/registry/zookeeper-3.4.6/docs/skin/images/forrest-credit-logo.png delete mode 100644 pkg/registry/zookeeper-3.4.6/docs/skin/images/hack.jpg delete mode 100644 pkg/registry/zookeeper-3.4.6/docs/skin/images/header_white_line.gif delete mode 100644 pkg/registry/zookeeper-3.4.6/docs/skin/images/info.png delete mode 100644 pkg/registry/zookeeper-3.4.6/docs/skin/images/instruction_arrow.png delete mode 100644 pkg/registry/zookeeper-3.4.6/docs/skin/images/label.gif delete mode 100644 pkg/registry/zookeeper-3.4.6/docs/skin/images/page.gif delete mode 100644 pkg/registry/zookeeper-3.4.6/docs/skin/images/pdfdoc.gif delete mode 100644 pkg/registry/zookeeper-3.4.6/docs/skin/images/poddoc.png delete mode 100644 pkg/registry/zookeeper-3.4.6/docs/skin/images/printer.gif delete mode 100644 pkg/registry/zookeeper-3.4.6/docs/skin/images/rc-b-l-15-1body-2menu-3menu.png delete mode 100644 pkg/registry/zookeeper-3.4.6/docs/skin/images/rc-b-r-15-1body-2menu-3menu.png delete mode 100644 pkg/registry/zookeeper-3.4.6/docs/skin/images/rc-b-r-5-1header-2tab-selected-3tab-selected.png delete mode 100644 pkg/registry/zookeeper-3.4.6/docs/skin/images/rc-t-l-5-1header-2searchbox-3searchbox.png delete mode 100644 pkg/registry/zookeeper-3.4.6/docs/skin/images/rc-t-l-5-1header-2tab-selected-3tab-selected.png delete mode 100644 pkg/registry/zookeeper-3.4.6/docs/skin/images/rc-t-l-5-1header-2tab-unselected-3tab-unselected.png delete mode 100644 pkg/registry/zookeeper-3.4.6/docs/skin/images/rc-t-r-15-1body-2menu-3menu.png delete mode 100644 pkg/registry/zookeeper-3.4.6/docs/skin/images/rc-t-r-5-1header-2searchbox-3searchbox.png delete mode 100644 pkg/registry/zookeeper-3.4.6/docs/skin/images/rc-t-r-5-1header-2tab-selected-3tab-selected.png delete mode 100644 pkg/registry/zookeeper-3.4.6/docs/skin/images/rc-t-r-5-1header-2tab-unselected-3tab-unselected.png delete mode 100644 pkg/registry/zookeeper-3.4.6/docs/skin/images/remove.jpg delete mode 100644 pkg/registry/zookeeper-3.4.6/docs/skin/images/rss.png delete mode 100644 pkg/registry/zookeeper-3.4.6/docs/skin/images/spacer.gif delete mode 100644 pkg/registry/zookeeper-3.4.6/docs/skin/images/success.png delete mode 100644 pkg/registry/zookeeper-3.4.6/docs/skin/images/txtdoc.png delete mode 100644 pkg/registry/zookeeper-3.4.6/docs/skin/images/update.jpg delete mode 100644 pkg/registry/zookeeper-3.4.6/docs/skin/images/valid-html401.png delete mode 100644 pkg/registry/zookeeper-3.4.6/docs/skin/images/vcss.png delete mode 100644 pkg/registry/zookeeper-3.4.6/docs/skin/images/warning.png delete mode 100644 pkg/registry/zookeeper-3.4.6/docs/skin/images/xmldoc.gif delete mode 100644 pkg/registry/zookeeper-3.4.6/docs/skin/note.txt delete mode 100644 pkg/registry/zookeeper-3.4.6/docs/zookeeperAdmin.html delete mode 100644 pkg/registry/zookeeper-3.4.6/docs/zookeeperAdmin.pdf delete mode 100644 pkg/registry/zookeeper-3.4.6/docs/zookeeperHierarchicalQuorums.html delete mode 100644 pkg/registry/zookeeper-3.4.6/docs/zookeeperHierarchicalQuorums.pdf delete mode 100644 pkg/registry/zookeeper-3.4.6/docs/zookeeperInternals.html delete mode 100644 pkg/registry/zookeeper-3.4.6/docs/zookeeperInternals.pdf delete mode 100644 pkg/registry/zookeeper-3.4.6/docs/zookeeperJMX.html delete mode 100644 pkg/registry/zookeeper-3.4.6/docs/zookeeperJMX.pdf delete mode 100644 pkg/registry/zookeeper-3.4.6/docs/zookeeperObservers.html delete mode 100644 pkg/registry/zookeeper-3.4.6/docs/zookeeperObservers.pdf delete mode 100644 pkg/registry/zookeeper-3.4.6/docs/zookeeperOtherInfo.html delete mode 100644 pkg/registry/zookeeper-3.4.6/docs/zookeeperOtherInfo.pdf delete mode 100644 pkg/registry/zookeeper-3.4.6/docs/zookeeperOver.html delete mode 100644 pkg/registry/zookeeper-3.4.6/docs/zookeeperOver.pdf delete mode 100644 pkg/registry/zookeeper-3.4.6/docs/zookeeperProgrammers.html delete mode 100644 pkg/registry/zookeeper-3.4.6/docs/zookeeperProgrammers.pdf delete mode 100644 pkg/registry/zookeeper-3.4.6/docs/zookeeperQuotas.html delete mode 100644 pkg/registry/zookeeper-3.4.6/docs/zookeeperQuotas.pdf delete mode 100644 pkg/registry/zookeeper-3.4.6/docs/zookeeperStarted.html delete mode 100644 pkg/registry/zookeeper-3.4.6/docs/zookeeperStarted.pdf delete mode 100644 pkg/registry/zookeeper-3.4.6/docs/zookeeperTutorial.html delete mode 100644 pkg/registry/zookeeper-3.4.6/docs/zookeeperTutorial.pdf delete mode 100644 pkg/registry/zookeeper-3.4.6/ivy.xml delete mode 100644 pkg/registry/zookeeper-3.4.6/ivysettings.xml delete mode 100644 pkg/registry/zookeeper-3.4.6/lib/cobertura/README.txt delete mode 100644 pkg/registry/zookeeper-3.4.6/lib/jdiff/zookeeper_3.1.1.xml delete mode 100644 pkg/registry/zookeeper-3.4.6/lib/jdiff/zookeeper_3.4.6-SNAPSHOT.xml delete mode 100644 pkg/registry/zookeeper-3.4.6/lib/jdiff/zookeeper_3.4.6.xml delete mode 100644 pkg/registry/zookeeper-3.4.6/lib/jline-0.9.94.LICENSE.txt delete mode 100644 pkg/registry/zookeeper-3.4.6/lib/jline-0.9.94.jar delete mode 100644 pkg/registry/zookeeper-3.4.6/lib/log4j-1.2.16.LICENSE.txt delete mode 100644 pkg/registry/zookeeper-3.4.6/lib/log4j-1.2.16.jar delete mode 100644 pkg/registry/zookeeper-3.4.6/lib/netty-3.7.0.Final.jar.REMOVED.git-id delete mode 100644 pkg/registry/zookeeper-3.4.6/lib/slf4j-api-1.6.1.jar delete mode 100644 pkg/registry/zookeeper-3.4.6/lib/slf4j-log4j12-1.6.1.jar delete mode 100644 pkg/registry/zookeeper-3.4.6/recipes/election/build.xml delete mode 100644 pkg/registry/zookeeper-3.4.6/recipes/election/src/java/org/apache/zookeeper/recipes/leader/LeaderElectionAware.java delete mode 100644 pkg/registry/zookeeper-3.4.6/recipes/election/src/java/org/apache/zookeeper/recipes/leader/LeaderElectionSupport.java delete mode 100644 pkg/registry/zookeeper-3.4.6/recipes/election/src/java/org/apache/zookeeper/recipes/leader/LeaderOffer.java delete mode 100644 pkg/registry/zookeeper-3.4.6/recipes/lock/build.xml delete mode 100644 pkg/registry/zookeeper-3.4.6/recipes/lock/src/c/INSTALL delete mode 100644 pkg/registry/zookeeper-3.4.6/recipes/lock/src/c/LICENSE delete mode 100644 pkg/registry/zookeeper-3.4.6/recipes/lock/src/c/Makefile.am delete mode 100644 pkg/registry/zookeeper-3.4.6/recipes/lock/src/c/README.txt delete mode 100644 pkg/registry/zookeeper-3.4.6/recipes/lock/src/c/acinclude.m4 delete mode 100644 pkg/registry/zookeeper-3.4.6/recipes/lock/src/c/aminclude.am delete mode 100644 pkg/registry/zookeeper-3.4.6/recipes/lock/src/c/c-doc.Doxyfile delete mode 100644 pkg/registry/zookeeper-3.4.6/recipes/lock/src/c/configure.ac delete mode 100644 pkg/registry/zookeeper-3.4.6/recipes/lock/src/c/include/zoo_lock.h delete mode 100644 pkg/registry/zookeeper-3.4.6/recipes/lock/src/c/src/zoo_lock.c delete mode 100644 pkg/registry/zookeeper-3.4.6/recipes/lock/src/c/tests/TestClient.cc delete mode 100644 pkg/registry/zookeeper-3.4.6/recipes/lock/src/c/tests/TestDriver.cc delete mode 100644 pkg/registry/zookeeper-3.4.6/recipes/lock/src/c/tests/Util.cc delete mode 100644 pkg/registry/zookeeper-3.4.6/recipes/lock/src/c/tests/Util.h delete mode 100755 pkg/registry/zookeeper-3.4.6/recipes/lock/src/c/tests/zkServer.sh delete mode 100644 pkg/registry/zookeeper-3.4.6/recipes/lock/src/java/org/apache/zookeeper/recipes/lock/LockListener.java delete mode 100644 pkg/registry/zookeeper-3.4.6/recipes/lock/src/java/org/apache/zookeeper/recipes/lock/ProtocolSupport.java delete mode 100644 pkg/registry/zookeeper-3.4.6/recipes/lock/src/java/org/apache/zookeeper/recipes/lock/WriteLock.java delete mode 100644 pkg/registry/zookeeper-3.4.6/recipes/lock/src/java/org/apache/zookeeper/recipes/lock/ZNodeName.java delete mode 100644 pkg/registry/zookeeper-3.4.6/recipes/lock/src/java/org/apache/zookeeper/recipes/lock/ZooKeeperOperation.java delete mode 100644 pkg/registry/zookeeper-3.4.6/recipes/queue/build.xml delete mode 100644 pkg/registry/zookeeper-3.4.6/recipes/queue/src/c/INSTALL delete mode 100644 pkg/registry/zookeeper-3.4.6/recipes/queue/src/c/LICENSE delete mode 100644 pkg/registry/zookeeper-3.4.6/recipes/queue/src/c/Makefile.am delete mode 100644 pkg/registry/zookeeper-3.4.6/recipes/queue/src/c/README.txt delete mode 100644 pkg/registry/zookeeper-3.4.6/recipes/queue/src/c/acinclude.m4 delete mode 100644 pkg/registry/zookeeper-3.4.6/recipes/queue/src/c/aminclude.am delete mode 100644 pkg/registry/zookeeper-3.4.6/recipes/queue/src/c/c-doc.Doxyfile delete mode 100644 pkg/registry/zookeeper-3.4.6/recipes/queue/src/c/configure.ac delete mode 100644 pkg/registry/zookeeper-3.4.6/recipes/queue/src/c/include/zoo_queue.h delete mode 100644 pkg/registry/zookeeper-3.4.6/recipes/queue/src/c/src/zoo_queue.c delete mode 100644 pkg/registry/zookeeper-3.4.6/recipes/queue/src/c/tests/TestClient.cc delete mode 100644 pkg/registry/zookeeper-3.4.6/recipes/queue/src/c/tests/TestDriver.cc delete mode 100644 pkg/registry/zookeeper-3.4.6/recipes/queue/src/c/tests/Util.cc delete mode 100644 pkg/registry/zookeeper-3.4.6/recipes/queue/src/c/tests/Util.h delete mode 100755 pkg/registry/zookeeper-3.4.6/recipes/queue/src/c/tests/zkServer.sh delete mode 100644 pkg/registry/zookeeper-3.4.6/recipes/queue/src/java/org/apache/zookeeper/recipes/queue/DistributedQueue.java delete mode 100644 pkg/registry/zookeeper-3.4.6/src/c/ChangeLog delete mode 100644 pkg/registry/zookeeper-3.4.6/src/c/Cli.vcproj delete mode 100644 pkg/registry/zookeeper-3.4.6/src/c/INSTALL delete mode 100644 pkg/registry/zookeeper-3.4.6/src/c/LICENSE delete mode 100644 pkg/registry/zookeeper-3.4.6/src/c/Makefile.am delete mode 100644 pkg/registry/zookeeper-3.4.6/src/c/Makefile.in delete mode 100644 pkg/registry/zookeeper-3.4.6/src/c/NOTICE.txt delete mode 100644 pkg/registry/zookeeper-3.4.6/src/c/README delete mode 100644 pkg/registry/zookeeper-3.4.6/src/c/acinclude.m4 delete mode 100644 pkg/registry/zookeeper-3.4.6/src/c/aclocal.m4 delete mode 100644 pkg/registry/zookeeper-3.4.6/src/c/aminclude.am delete mode 100644 pkg/registry/zookeeper-3.4.6/src/c/autom4te.cache/output.0 delete mode 100644 pkg/registry/zookeeper-3.4.6/src/c/autom4te.cache/output.1 delete mode 100644 pkg/registry/zookeeper-3.4.6/src/c/autom4te.cache/output.2 delete mode 100644 pkg/registry/zookeeper-3.4.6/src/c/autom4te.cache/output.3 delete mode 100644 pkg/registry/zookeeper-3.4.6/src/c/autom4te.cache/requests delete mode 100644 pkg/registry/zookeeper-3.4.6/src/c/autom4te.cache/traces.0 delete mode 100644 pkg/registry/zookeeper-3.4.6/src/c/autom4te.cache/traces.1 delete mode 100644 pkg/registry/zookeeper-3.4.6/src/c/autom4te.cache/traces.2 delete mode 100644 pkg/registry/zookeeper-3.4.6/src/c/autom4te.cache/traces.3 delete mode 100644 pkg/registry/zookeeper-3.4.6/src/c/c-doc.Doxyfile delete mode 100755 pkg/registry/zookeeper-3.4.6/src/c/compile delete mode 100755 pkg/registry/zookeeper-3.4.6/src/c/config.guess delete mode 100644 pkg/registry/zookeeper-3.4.6/src/c/config.h.in delete mode 100755 pkg/registry/zookeeper-3.4.6/src/c/config.sub delete mode 100755 pkg/registry/zookeeper-3.4.6/src/c/configure delete mode 100644 pkg/registry/zookeeper-3.4.6/src/c/configure.ac delete mode 100755 pkg/registry/zookeeper-3.4.6/src/c/depcomp delete mode 100644 pkg/registry/zookeeper-3.4.6/src/c/generated/zookeeper.jute.c delete mode 100644 pkg/registry/zookeeper-3.4.6/src/c/generated/zookeeper.jute.h delete mode 100644 pkg/registry/zookeeper-3.4.6/src/c/include/proto.h delete mode 100644 pkg/registry/zookeeper-3.4.6/src/c/include/recordio.h delete mode 100644 pkg/registry/zookeeper-3.4.6/src/c/include/winconfig.h delete mode 100644 pkg/registry/zookeeper-3.4.6/src/c/include/winstdint.h delete mode 100644 pkg/registry/zookeeper-3.4.6/src/c/include/zookeeper.h delete mode 100644 pkg/registry/zookeeper-3.4.6/src/c/include/zookeeper_log.h delete mode 100644 pkg/registry/zookeeper-3.4.6/src/c/include/zookeeper_version.h delete mode 100755 pkg/registry/zookeeper-3.4.6/src/c/install-sh delete mode 100755 pkg/registry/zookeeper-3.4.6/src/c/ltmain.sh delete mode 100755 pkg/registry/zookeeper-3.4.6/src/c/missing delete mode 100644 pkg/registry/zookeeper-3.4.6/src/c/src/cli.c delete mode 100644 pkg/registry/zookeeper-3.4.6/src/c/src/hashtable/LICENSE.txt delete mode 100644 pkg/registry/zookeeper-3.4.6/src/c/src/hashtable/hashtable.c delete mode 100644 pkg/registry/zookeeper-3.4.6/src/c/src/hashtable/hashtable.h delete mode 100644 pkg/registry/zookeeper-3.4.6/src/c/src/hashtable/hashtable_itr.c delete mode 100644 pkg/registry/zookeeper-3.4.6/src/c/src/hashtable/hashtable_itr.h delete mode 100644 pkg/registry/zookeeper-3.4.6/src/c/src/hashtable/hashtable_private.h delete mode 100644 pkg/registry/zookeeper-3.4.6/src/c/src/load_gen.c delete mode 100644 pkg/registry/zookeeper-3.4.6/src/c/src/mt_adaptor.c delete mode 100644 pkg/registry/zookeeper-3.4.6/src/c/src/recordio.c delete mode 100644 pkg/registry/zookeeper-3.4.6/src/c/src/st_adaptor.c delete mode 100644 pkg/registry/zookeeper-3.4.6/src/c/src/winport.c delete mode 100644 pkg/registry/zookeeper-3.4.6/src/c/src/winport.h delete mode 100644 pkg/registry/zookeeper-3.4.6/src/c/src/zk_adaptor.h delete mode 100644 pkg/registry/zookeeper-3.4.6/src/c/src/zk_hashtable.c delete mode 100644 pkg/registry/zookeeper-3.4.6/src/c/src/zk_hashtable.h delete mode 100644 pkg/registry/zookeeper-3.4.6/src/c/src/zk_log.c delete mode 100644 pkg/registry/zookeeper-3.4.6/src/c/src/zookeeper.c delete mode 100644 pkg/registry/zookeeper-3.4.6/src/c/tests/CollectionUtil.h delete mode 100644 pkg/registry/zookeeper-3.4.6/src/c/tests/CppAssertHelper.h delete mode 100644 pkg/registry/zookeeper-3.4.6/src/c/tests/LibCMocks.cc delete mode 100644 pkg/registry/zookeeper-3.4.6/src/c/tests/LibCMocks.h delete mode 100644 pkg/registry/zookeeper-3.4.6/src/c/tests/LibCSymTable.cc delete mode 100644 pkg/registry/zookeeper-3.4.6/src/c/tests/LibCSymTable.h delete mode 100644 pkg/registry/zookeeper-3.4.6/src/c/tests/MocksBase.cc delete mode 100644 pkg/registry/zookeeper-3.4.6/src/c/tests/MocksBase.h delete mode 100644 pkg/registry/zookeeper-3.4.6/src/c/tests/PthreadMocks.cc delete mode 100644 pkg/registry/zookeeper-3.4.6/src/c/tests/PthreadMocks.h delete mode 100644 pkg/registry/zookeeper-3.4.6/src/c/tests/TestClient.cc delete mode 100644 pkg/registry/zookeeper-3.4.6/src/c/tests/TestClientRetry.cc delete mode 100644 pkg/registry/zookeeper-3.4.6/src/c/tests/TestDriver.cc delete mode 100644 pkg/registry/zookeeper-3.4.6/src/c/tests/TestMulti.cc delete mode 100644 pkg/registry/zookeeper-3.4.6/src/c/tests/TestOperations.cc delete mode 100644 pkg/registry/zookeeper-3.4.6/src/c/tests/TestWatchers.cc delete mode 100644 pkg/registry/zookeeper-3.4.6/src/c/tests/TestZookeeperClose.cc delete mode 100644 pkg/registry/zookeeper-3.4.6/src/c/tests/TestZookeeperInit.cc delete mode 100644 pkg/registry/zookeeper-3.4.6/src/c/tests/ThreadingUtil.cc delete mode 100644 pkg/registry/zookeeper-3.4.6/src/c/tests/ThreadingUtil.h delete mode 100644 pkg/registry/zookeeper-3.4.6/src/c/tests/Util.cc delete mode 100644 pkg/registry/zookeeper-3.4.6/src/c/tests/Util.h delete mode 100644 pkg/registry/zookeeper-3.4.6/src/c/tests/Vector.h delete mode 100644 pkg/registry/zookeeper-3.4.6/src/c/tests/ZKMocks.cc delete mode 100644 pkg/registry/zookeeper-3.4.6/src/c/tests/ZKMocks.h delete mode 100644 pkg/registry/zookeeper-3.4.6/src/c/tests/wrappers-mt.opt delete mode 100644 pkg/registry/zookeeper-3.4.6/src/c/tests/wrappers.opt delete mode 100755 pkg/registry/zookeeper-3.4.6/src/c/tests/zkServer.sh delete mode 100644 pkg/registry/zookeeper-3.4.6/src/c/zookeeper.sln delete mode 100644 pkg/registry/zookeeper-3.4.6/src/c/zookeeper.vcproj delete mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/build-contrib.xml delete mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/build.xml delete mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/fatjar/README.txt delete mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/fatjar/build.xml delete mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/fatjar/conf/mainClasses delete mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/fatjar/src/java/org/apache/zookeeper/util/FatJarMain.java delete mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/huebrowser/README delete mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/huebrowser/zkui/Makefile delete mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/huebrowser/zkui/setup.py delete mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/huebrowser/zkui/src/zkui/__init__.py delete mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/huebrowser/zkui/src/zkui/forms.py delete mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/huebrowser/zkui/src/zkui/models.py delete mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/huebrowser/zkui/src/zkui/rest.py delete mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/huebrowser/zkui/src/zkui/settings.py delete mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/huebrowser/zkui/src/zkui/static/art/line_icons.png delete mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/huebrowser/zkui/src/zkui/static/art/zkui.png delete mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/huebrowser/zkui/src/zkui/static/help/index.html delete mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/huebrowser/zkui/src/zkui/static/js/package.yml delete mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/huebrowser/zkui/src/zkui/stats.py delete mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/huebrowser/zkui/src/zkui/templates/clients.mako delete mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/huebrowser/zkui/src/zkui/templates/create.mako delete mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/huebrowser/zkui/src/zkui/templates/edit.mako delete mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/huebrowser/zkui/src/zkui/templates/index.mako delete mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/huebrowser/zkui/src/zkui/templates/shared_components.mako delete mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/huebrowser/zkui/src/zkui/templates/tree.mako delete mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/huebrowser/zkui/src/zkui/templates/view.mako delete mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/huebrowser/zkui/src/zkui/urls.py delete mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/huebrowser/zkui/src/zkui/utils.py delete mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/huebrowser/zkui/src/zkui/views.py delete mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/huebrowser/zkui/src/zkui/windmilltests.py delete mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/loggraph/README.txt delete mode 100755 pkg/registry/zookeeper-3.4.6/src/contrib/loggraph/bin/loggraph-dev.sh delete mode 100755 pkg/registry/zookeeper-3.4.6/src/contrib/loggraph/bin/loggraph.sh delete mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/loggraph/build.xml delete mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/loggraph/ivy.xml delete mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/loggraph/src/java/org/apache/zookeeper/graph/FilterException.java delete mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/loggraph/src/java/org/apache/zookeeper/graph/FilterOp.java delete mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/loggraph/src/java/org/apache/zookeeper/graph/FilterParser.java delete mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/loggraph/src/java/org/apache/zookeeper/graph/JsonGenerator.java delete mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/loggraph/src/java/org/apache/zookeeper/graph/Log4JEntry.java delete mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/loggraph/src/java/org/apache/zookeeper/graph/Log4JSource.java delete mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/loggraph/src/java/org/apache/zookeeper/graph/LogEntry.java delete mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/loggraph/src/java/org/apache/zookeeper/graph/LogIterator.java delete mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/loggraph/src/java/org/apache/zookeeper/graph/LogServer.java delete mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/loggraph/src/java/org/apache/zookeeper/graph/LogSkipList.java delete mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/loggraph/src/java/org/apache/zookeeper/graph/LogSource.java delete mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/loggraph/src/java/org/apache/zookeeper/graph/MeasureThroughput.java delete mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/loggraph/src/java/org/apache/zookeeper/graph/MergedLogSource.java delete mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/loggraph/src/java/org/apache/zookeeper/graph/RandomAccessFileReader.java delete mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/loggraph/src/java/org/apache/zookeeper/graph/TransactionEntry.java delete mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/loggraph/src/java/org/apache/zookeeper/graph/TxnLogSource.java delete mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/loggraph/src/java/org/apache/zookeeper/graph/filterops/AndOp.java delete mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/loggraph/src/java/org/apache/zookeeper/graph/filterops/Arg.java delete mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/loggraph/src/java/org/apache/zookeeper/graph/filterops/EqualsOp.java delete mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/loggraph/src/java/org/apache/zookeeper/graph/filterops/GreaterThanOp.java delete mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/loggraph/src/java/org/apache/zookeeper/graph/filterops/LessThanOp.java delete mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/loggraph/src/java/org/apache/zookeeper/graph/filterops/NotOp.java delete mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/loggraph/src/java/org/apache/zookeeper/graph/filterops/NumberArg.java delete mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/loggraph/src/java/org/apache/zookeeper/graph/filterops/OrOp.java delete mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/loggraph/src/java/org/apache/zookeeper/graph/filterops/StringArg.java delete mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/loggraph/src/java/org/apache/zookeeper/graph/filterops/SymbolArg.java delete mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/loggraph/src/java/org/apache/zookeeper/graph/filterops/XorOp.java delete mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/loggraph/src/java/org/apache/zookeeper/graph/servlets/FileLoader.java delete mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/loggraph/src/java/org/apache/zookeeper/graph/servlets/Fs.java delete mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/loggraph/src/java/org/apache/zookeeper/graph/servlets/GraphData.java delete mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/loggraph/src/java/org/apache/zookeeper/graph/servlets/JsonServlet.java delete mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/loggraph/src/java/org/apache/zookeeper/graph/servlets/NumEvents.java delete mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/loggraph/src/java/org/apache/zookeeper/graph/servlets/StaticContent.java delete mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/loggraph/src/java/org/apache/zookeeper/graph/servlets/Throughput.java delete mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/loggraph/web/org/apache/zookeeper/graph/log4j.properties delete mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/loggraph/web/org/apache/zookeeper/graph/resources/load-big.gif delete mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/loggraph/web/org/apache/zookeeper/graph/resources/load.gif delete mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/loggraph/web/org/apache/zookeeper/graph/resources/main.html delete mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/monitoring/JMX-RESOURCES delete mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/monitoring/README delete mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/monitoring/cacti/README delete mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/monitoring/check_zookeeper.py delete mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/monitoring/ganglia/README delete mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/monitoring/ganglia/Screenshot.png delete mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/monitoring/ganglia/modpython.conf delete mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/monitoring/ganglia/zookeeper.pyconf delete mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/monitoring/ganglia/zookeeper_ganglia.py delete mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/monitoring/nagios/README.txt delete mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/monitoring/nagios/Screenshot-1.png delete mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/monitoring/nagios/Screenshot.png delete mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/monitoring/nagios/hostgroups.cfg delete mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/monitoring/nagios/services.cfg delete mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/monitoring/nagios/zookeeper.cfg delete mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/monitoring/test.py delete mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/rest/NOTICE.txt delete mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/rest/README.txt delete mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/rest/SPEC.txt delete mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/rest/build.xml delete mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/rest/conf/keys/README delete mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/rest/conf/keys/rest.cer delete mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/rest/conf/keys/rest.jks delete mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/rest/conf/log4j.properties delete mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/rest/conf/rest.properties delete mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/rest/ivy.xml delete mode 100755 pkg/registry/zookeeper-3.4.6/src/contrib/rest/rest.sh delete mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/rest/src/java/org/apache/zookeeper/server/jersey/RestMain.java delete mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/rest/src/java/org/apache/zookeeper/server/jersey/ZooKeeperService.java delete mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/rest/src/java/org/apache/zookeeper/server/jersey/cfg/Credentials.java delete mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/rest/src/java/org/apache/zookeeper/server/jersey/cfg/Endpoint.java delete mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/rest/src/java/org/apache/zookeeper/server/jersey/cfg/HostPort.java delete mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/rest/src/java/org/apache/zookeeper/server/jersey/cfg/HostPortSet.java delete mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/rest/src/java/org/apache/zookeeper/server/jersey/cfg/RestCfg.java delete mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/rest/src/java/org/apache/zookeeper/server/jersey/filters/HTTPBasicAuth.java delete mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/rest/src/java/org/apache/zookeeper/server/jersey/jaxb/ZChildren.java delete mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/rest/src/java/org/apache/zookeeper/server/jersey/jaxb/ZChildrenJSON.java delete mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/rest/src/java/org/apache/zookeeper/server/jersey/jaxb/ZError.java delete mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/rest/src/java/org/apache/zookeeper/server/jersey/jaxb/ZPath.java delete mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/rest/src/java/org/apache/zookeeper/server/jersey/jaxb/ZSession.java delete mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/rest/src/java/org/apache/zookeeper/server/jersey/jaxb/ZStat.java delete mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/rest/src/java/org/apache/zookeeper/server/jersey/resources/JAXBContextResolver.java delete mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/rest/src/java/org/apache/zookeeper/server/jersey/resources/KeeperExceptionMapper.java delete mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/rest/src/java/org/apache/zookeeper/server/jersey/resources/RuntimeExceptionMapper.java delete mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/rest/src/java/org/apache/zookeeper/server/jersey/resources/SessionsResource.java delete mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/rest/src/java/org/apache/zookeeper/server/jersey/resources/ZErrorWriter.java delete mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/rest/src/java/org/apache/zookeeper/server/jersey/resources/ZNodeResource.java delete mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/rest/src/python/README.txt delete mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/rest/src/python/demo_master_election.py delete mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/rest/src/python/demo_queue.py delete mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/rest/src/python/test.py delete mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/rest/src/python/zk_dump_tree.py delete mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/rest/src/python/zkrest.py delete mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/zkfuse/Makefile.am delete mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/zkfuse/README.txt delete mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/zkfuse/build.xml delete mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/zkfuse/configure.ac delete mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/zkfuse/src/Makefile.am delete mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/zkfuse/src/blockingqueue.h delete mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/zkfuse/src/doxygen.cfg delete mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/zkfuse/src/event.cc delete mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/zkfuse/src/event.h delete mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/zkfuse/src/log.cc delete mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/zkfuse/src/log.h delete mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/zkfuse/src/log4cxx.properties delete mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/zkfuse/src/mutex.h delete mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/zkfuse/src/thread.cc delete mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/zkfuse/src/thread.h delete mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/zkfuse/src/zkadapter.cc delete mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/zkfuse/src/zkadapter.h delete mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/zkfuse/src/zkfuse.cc delete mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/zkperl/Changes delete mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/zkperl/LICENSE delete mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/zkperl/MANIFEST delete mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/zkperl/Makefile.PL delete mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/zkperl/NOTICE delete mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/zkperl/README delete mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/zkperl/ZooKeeper.pm delete mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/zkperl/ZooKeeper.xs delete mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/zkperl/build.xml delete mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/zkperl/build/check_zk_version.c delete mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/zkperl/build/check_zk_version.h delete mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/zkperl/t/10_invalid.t delete mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/zkperl/t/15_thread.t delete mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/zkperl/t/20_tie.t delete mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/zkperl/t/22_stat_tie.t delete mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/zkperl/t/24_watch_tie.t delete mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/zkperl/t/30_connect.t delete mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/zkperl/t/35_log.t delete mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/zkperl/t/40_basic.t delete mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/zkperl/t/45_class.t delete mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/zkperl/t/50_access.t delete mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/zkperl/t/60_watch.t delete mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/zkperl/t/util.pl delete mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/zkperl/typemap delete mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/zkpython/README delete mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/zkpython/build.xml delete mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/zkpython/ivy.xml delete mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/zkpython/src/c/pyzk_docstrings.h delete mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/zkpython/src/c/zookeeper.c delete mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/zkpython/src/examples/README delete mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/zkpython/src/examples/watch_znode_for_changes.py delete mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/zkpython/src/packages/deb/zkpython.control/control delete mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/zkpython/src/packages/rpm/spec/zkpython.spec delete mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/zkpython/src/python/setup.py delete mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/zkpython/src/python/zk.py delete mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/zktreeutil/Makefile.am delete mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/zktreeutil/README.txt delete mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/zktreeutil/build.xml delete mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/zktreeutil/configure.ac delete mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/zktreeutil/src/Makefile.am delete mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/zktreeutil/src/SimpleTree.h delete mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/zktreeutil/src/ZkAdaptor.cc delete mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/zktreeutil/src/ZkAdaptor.h delete mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/zktreeutil/src/ZkTreeUtil.cc delete mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/zktreeutil/src/ZkTreeUtil.h delete mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/zktreeutil/src/ZkTreeUtilMain.cc delete mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/zktreeutil/tests/zk_sample.xml delete mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/zooinspector/NOTICE.txt delete mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/zooinspector/README.txt delete mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/zooinspector/build.xml delete mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/zooinspector/config/defaultConnectionSettings.cfg delete mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/zooinspector/config/defaultNodeVeiwers.cfg delete mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/zooinspector/icons/edtsrclkup_co.gif delete mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/zooinspector/icons/file_obj.gif delete mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/zooinspector/icons/fldr_obj.gif delete mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/zooinspector/icons/info_obj.gif delete mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/zooinspector/icons/jspdecl.gif delete mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/zooinspector/icons/launch_run.gif delete mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/zooinspector/icons/launch_stop.gif delete mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/zooinspector/icons/new_con.gif delete mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/zooinspector/icons/refresh.gif delete mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/zooinspector/icons/save_edit.gif delete mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/zooinspector/icons/search_next.gif delete mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/zooinspector/icons/search_prev.gif delete mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/zooinspector/icons/trash.gif delete mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/zooinspector/ivy.xml delete mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/zooinspector/lib/jtoaster-1.0.4.jar delete mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/zooinspector/lib/log4j.properties delete mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/zooinspector/licences/Apache Software Licence v2.0.txt delete mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/zooinspector/licences/epl-v10.html delete mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/zooinspector/src/java/org/apache/zookeeper/inspector/ZooInspector.java delete mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/zooinspector/src/java/org/apache/zookeeper/inspector/encryption/BasicDataEncryptionManager.java delete mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/zooinspector/src/java/org/apache/zookeeper/inspector/encryption/DataEncryptionManager.java delete mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/zooinspector/src/java/org/apache/zookeeper/inspector/gui/NodeViewersChangeListener.java delete mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/zooinspector/src/java/org/apache/zookeeper/inspector/gui/ZooInspectorAboutDialog.java delete mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/zooinspector/src/java/org/apache/zookeeper/inspector/gui/ZooInspectorConnectionPropertiesDialog.java delete mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/zooinspector/src/java/org/apache/zookeeper/inspector/gui/ZooInspectorIconResources.java delete mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/zooinspector/src/java/org/apache/zookeeper/inspector/gui/ZooInspectorNodeViewersDialog.java delete mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/zooinspector/src/java/org/apache/zookeeper/inspector/gui/ZooInspectorNodeViewersPanel.java delete mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/zooinspector/src/java/org/apache/zookeeper/inspector/gui/ZooInspectorPanel.java delete mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/zooinspector/src/java/org/apache/zookeeper/inspector/gui/ZooInspectorTreeViewer.java delete mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/zooinspector/src/java/org/apache/zookeeper/inspector/gui/about.html delete mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/zooinspector/src/java/org/apache/zookeeper/inspector/gui/nodeviewer/NodeViewerACL.java delete mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/zooinspector/src/java/org/apache/zookeeper/inspector/gui/nodeviewer/NodeViewerData.java delete mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/zooinspector/src/java/org/apache/zookeeper/inspector/gui/nodeviewer/NodeViewerMetaData.java delete mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/zooinspector/src/java/org/apache/zookeeper/inspector/gui/nodeviewer/ZooInspectorNodeViewer.java delete mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/zooinspector/src/java/org/apache/zookeeper/inspector/logger/LoggerFactory.java delete mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/zooinspector/src/java/org/apache/zookeeper/inspector/manager/NodeListener.java delete mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/zooinspector/src/java/org/apache/zookeeper/inspector/manager/Pair.java delete mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/zooinspector/src/java/org/apache/zookeeper/inspector/manager/ZooInspectorManager.java delete mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/zooinspector/src/java/org/apache/zookeeper/inspector/manager/ZooInspectorManagerImpl.java delete mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/zooinspector/src/java/org/apache/zookeeper/inspector/manager/ZooInspectorNodeManager.java delete mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/zooinspector/src/java/org/apache/zookeeper/inspector/manager/ZooInspectorNodeTreeManager.java delete mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/zooinspector/src/java/org/apache/zookeeper/inspector/manager/ZooInspectorReadOnlyManager.java delete mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/zooinspector/src/java/org/apache/zookeeper/retry/ZooKeeperRetry.java delete mode 100755 pkg/registry/zookeeper-3.4.6/src/contrib/zooinspector/zooInspector-dev.sh delete mode 100644 pkg/registry/zookeeper-3.4.6/src/contrib/zooinspector/zooInspector.cmd delete mode 100755 pkg/registry/zookeeper-3.4.6/src/contrib/zooinspector/zooInspector.sh delete mode 100644 pkg/registry/zookeeper-3.4.6/src/docs/forrest.properties delete mode 100644 pkg/registry/zookeeper-3.4.6/src/docs/src/documentation/README.txt delete mode 100644 pkg/registry/zookeeper-3.4.6/src/docs/src/documentation/TODO.txt delete mode 100644 pkg/registry/zookeeper-3.4.6/src/docs/src/documentation/classes/CatalogManager.properties delete mode 100644 pkg/registry/zookeeper-3.4.6/src/docs/src/documentation/content/xdocs/bookkeeperConfig.xml delete mode 100644 pkg/registry/zookeeper-3.4.6/src/docs/src/documentation/content/xdocs/bookkeeperOverview.xml delete mode 100644 pkg/registry/zookeeper-3.4.6/src/docs/src/documentation/content/xdocs/bookkeeperProgrammer.xml delete mode 100644 pkg/registry/zookeeper-3.4.6/src/docs/src/documentation/content/xdocs/bookkeeperStarted.xml delete mode 100644 pkg/registry/zookeeper-3.4.6/src/docs/src/documentation/content/xdocs/bookkeeperStream.xml delete mode 100644 pkg/registry/zookeeper-3.4.6/src/docs/src/documentation/content/xdocs/index.xml delete mode 100644 pkg/registry/zookeeper-3.4.6/src/docs/src/documentation/content/xdocs/javaExample.xml delete mode 100644 pkg/registry/zookeeper-3.4.6/src/docs/src/documentation/content/xdocs/recipes.xml delete mode 100644 pkg/registry/zookeeper-3.4.6/src/docs/src/documentation/content/xdocs/releasenotes.xml delete mode 100644 pkg/registry/zookeeper-3.4.6/src/docs/src/documentation/content/xdocs/site.xml delete mode 100644 pkg/registry/zookeeper-3.4.6/src/docs/src/documentation/content/xdocs/tabs.xml delete mode 100644 pkg/registry/zookeeper-3.4.6/src/docs/src/documentation/content/xdocs/zookeeperAdmin.xml delete mode 100644 pkg/registry/zookeeper-3.4.6/src/docs/src/documentation/content/xdocs/zookeeperHierarchicalQuorums.xml delete mode 100644 pkg/registry/zookeeper-3.4.6/src/docs/src/documentation/content/xdocs/zookeeperInternals.xml delete mode 100644 pkg/registry/zookeeper-3.4.6/src/docs/src/documentation/content/xdocs/zookeeperJMX.xml delete mode 100644 pkg/registry/zookeeper-3.4.6/src/docs/src/documentation/content/xdocs/zookeeperObservers.xml delete mode 100644 pkg/registry/zookeeper-3.4.6/src/docs/src/documentation/content/xdocs/zookeeperOtherInfo.xml delete mode 100644 pkg/registry/zookeeper-3.4.6/src/docs/src/documentation/content/xdocs/zookeeperOver.xml delete mode 100644 pkg/registry/zookeeper-3.4.6/src/docs/src/documentation/content/xdocs/zookeeperProgrammers.xml delete mode 100644 pkg/registry/zookeeper-3.4.6/src/docs/src/documentation/content/xdocs/zookeeperQuotas.xml delete mode 100644 pkg/registry/zookeeper-3.4.6/src/docs/src/documentation/content/xdocs/zookeeperStarted.xml delete mode 100644 pkg/registry/zookeeper-3.4.6/src/docs/src/documentation/content/xdocs/zookeeperTutorial.xml delete mode 100644 pkg/registry/zookeeper-3.4.6/src/docs/src/documentation/resources/images/2pc.jpg delete mode 100644 pkg/registry/zookeeper-3.4.6/src/docs/src/documentation/resources/images/bk-overview.jpg delete mode 100644 pkg/registry/zookeeper-3.4.6/src/docs/src/documentation/resources/images/favicon.ico delete mode 100644 pkg/registry/zookeeper-3.4.6/src/docs/src/documentation/resources/images/hadoop-logo.jpg delete mode 100644 pkg/registry/zookeeper-3.4.6/src/docs/src/documentation/resources/images/state_dia.dia delete mode 100644 pkg/registry/zookeeper-3.4.6/src/docs/src/documentation/resources/images/state_dia.jpg delete mode 100644 pkg/registry/zookeeper-3.4.6/src/docs/src/documentation/resources/images/zkarch.jpg delete mode 100644 pkg/registry/zookeeper-3.4.6/src/docs/src/documentation/resources/images/zkcomponents.jpg delete mode 100644 pkg/registry/zookeeper-3.4.6/src/docs/src/documentation/resources/images/zknamespace.jpg delete mode 100644 pkg/registry/zookeeper-3.4.6/src/docs/src/documentation/resources/images/zkperfRW-3.2.jpg delete mode 100644 pkg/registry/zookeeper-3.4.6/src/docs/src/documentation/resources/images/zkperfRW.jpg delete mode 100644 pkg/registry/zookeeper-3.4.6/src/docs/src/documentation/resources/images/zkperfreliability.jpg delete mode 100644 pkg/registry/zookeeper-3.4.6/src/docs/src/documentation/resources/images/zkservice.jpg delete mode 100644 pkg/registry/zookeeper-3.4.6/src/docs/src/documentation/resources/images/zookeeper_small.gif delete mode 100644 pkg/registry/zookeeper-3.4.6/src/docs/src/documentation/skinconf.xml delete mode 100644 pkg/registry/zookeeper-3.4.6/src/docs/status.xml delete mode 100644 pkg/registry/zookeeper-3.4.6/src/java/OldChangeLog delete mode 100644 pkg/registry/zookeeper-3.4.6/src/java/generated/.generated delete mode 100644 pkg/registry/zookeeper-3.4.6/src/java/generated/org/apache/zookeeper/data/ACL.java delete mode 100644 pkg/registry/zookeeper-3.4.6/src/java/generated/org/apache/zookeeper/data/Id.java delete mode 100644 pkg/registry/zookeeper-3.4.6/src/java/generated/org/apache/zookeeper/data/Stat.java delete mode 100644 pkg/registry/zookeeper-3.4.6/src/java/generated/org/apache/zookeeper/data/StatPersisted.java delete mode 100644 pkg/registry/zookeeper-3.4.6/src/java/generated/org/apache/zookeeper/data/StatPersistedV1.java delete mode 100644 pkg/registry/zookeeper-3.4.6/src/java/generated/org/apache/zookeeper/proto/AuthPacket.java delete mode 100644 pkg/registry/zookeeper-3.4.6/src/java/generated/org/apache/zookeeper/proto/CheckVersionRequest.java delete mode 100644 pkg/registry/zookeeper-3.4.6/src/java/generated/org/apache/zookeeper/proto/ConnectRequest.java delete mode 100644 pkg/registry/zookeeper-3.4.6/src/java/generated/org/apache/zookeeper/proto/ConnectResponse.java delete mode 100644 pkg/registry/zookeeper-3.4.6/src/java/generated/org/apache/zookeeper/proto/CreateRequest.java delete mode 100644 pkg/registry/zookeeper-3.4.6/src/java/generated/org/apache/zookeeper/proto/CreateResponse.java delete mode 100644 pkg/registry/zookeeper-3.4.6/src/java/generated/org/apache/zookeeper/proto/DeleteRequest.java delete mode 100644 pkg/registry/zookeeper-3.4.6/src/java/generated/org/apache/zookeeper/proto/ErrorResponse.java delete mode 100644 pkg/registry/zookeeper-3.4.6/src/java/generated/org/apache/zookeeper/proto/ExistsRequest.java delete mode 100644 pkg/registry/zookeeper-3.4.6/src/java/generated/org/apache/zookeeper/proto/ExistsResponse.java delete mode 100644 pkg/registry/zookeeper-3.4.6/src/java/generated/org/apache/zookeeper/proto/GetACLRequest.java delete mode 100644 pkg/registry/zookeeper-3.4.6/src/java/generated/org/apache/zookeeper/proto/GetACLResponse.java delete mode 100644 pkg/registry/zookeeper-3.4.6/src/java/generated/org/apache/zookeeper/proto/GetChildren2Request.java delete mode 100644 pkg/registry/zookeeper-3.4.6/src/java/generated/org/apache/zookeeper/proto/GetChildren2Response.java delete mode 100644 pkg/registry/zookeeper-3.4.6/src/java/generated/org/apache/zookeeper/proto/GetChildrenRequest.java delete mode 100644 pkg/registry/zookeeper-3.4.6/src/java/generated/org/apache/zookeeper/proto/GetChildrenResponse.java delete mode 100644 pkg/registry/zookeeper-3.4.6/src/java/generated/org/apache/zookeeper/proto/GetDataRequest.java delete mode 100644 pkg/registry/zookeeper-3.4.6/src/java/generated/org/apache/zookeeper/proto/GetDataResponse.java delete mode 100644 pkg/registry/zookeeper-3.4.6/src/java/generated/org/apache/zookeeper/proto/GetMaxChildrenRequest.java delete mode 100644 pkg/registry/zookeeper-3.4.6/src/java/generated/org/apache/zookeeper/proto/GetMaxChildrenResponse.java delete mode 100644 pkg/registry/zookeeper-3.4.6/src/java/generated/org/apache/zookeeper/proto/GetSASLRequest.java delete mode 100644 pkg/registry/zookeeper-3.4.6/src/java/generated/org/apache/zookeeper/proto/MultiHeader.java delete mode 100644 pkg/registry/zookeeper-3.4.6/src/java/generated/org/apache/zookeeper/proto/ReplyHeader.java delete mode 100644 pkg/registry/zookeeper-3.4.6/src/java/generated/org/apache/zookeeper/proto/RequestHeader.java delete mode 100644 pkg/registry/zookeeper-3.4.6/src/java/generated/org/apache/zookeeper/proto/SetACLRequest.java delete mode 100644 pkg/registry/zookeeper-3.4.6/src/java/generated/org/apache/zookeeper/proto/SetACLResponse.java delete mode 100644 pkg/registry/zookeeper-3.4.6/src/java/generated/org/apache/zookeeper/proto/SetDataRequest.java delete mode 100644 pkg/registry/zookeeper-3.4.6/src/java/generated/org/apache/zookeeper/proto/SetDataResponse.java delete mode 100644 pkg/registry/zookeeper-3.4.6/src/java/generated/org/apache/zookeeper/proto/SetMaxChildrenRequest.java delete mode 100644 pkg/registry/zookeeper-3.4.6/src/java/generated/org/apache/zookeeper/proto/SetSASLRequest.java delete mode 100644 pkg/registry/zookeeper-3.4.6/src/java/generated/org/apache/zookeeper/proto/SetSASLResponse.java delete mode 100644 pkg/registry/zookeeper-3.4.6/src/java/generated/org/apache/zookeeper/proto/SetWatches.java delete mode 100644 pkg/registry/zookeeper-3.4.6/src/java/generated/org/apache/zookeeper/proto/SyncRequest.java delete mode 100644 pkg/registry/zookeeper-3.4.6/src/java/generated/org/apache/zookeeper/proto/SyncResponse.java delete mode 100644 pkg/registry/zookeeper-3.4.6/src/java/generated/org/apache/zookeeper/proto/WatcherEvent.java delete mode 100644 pkg/registry/zookeeper-3.4.6/src/java/generated/org/apache/zookeeper/server/persistence/FileHeader.java delete mode 100644 pkg/registry/zookeeper-3.4.6/src/java/generated/org/apache/zookeeper/server/quorum/LearnerInfo.java delete mode 100644 pkg/registry/zookeeper-3.4.6/src/java/generated/org/apache/zookeeper/server/quorum/QuorumPacket.java delete mode 100644 pkg/registry/zookeeper-3.4.6/src/java/generated/org/apache/zookeeper/txn/CheckVersionTxn.java delete mode 100644 pkg/registry/zookeeper-3.4.6/src/java/generated/org/apache/zookeeper/txn/CreateSessionTxn.java delete mode 100644 pkg/registry/zookeeper-3.4.6/src/java/generated/org/apache/zookeeper/txn/CreateTxn.java delete mode 100644 pkg/registry/zookeeper-3.4.6/src/java/generated/org/apache/zookeeper/txn/CreateTxnV0.java delete mode 100644 pkg/registry/zookeeper-3.4.6/src/java/generated/org/apache/zookeeper/txn/DeleteTxn.java delete mode 100644 pkg/registry/zookeeper-3.4.6/src/java/generated/org/apache/zookeeper/txn/ErrorTxn.java delete mode 100644 pkg/registry/zookeeper-3.4.6/src/java/generated/org/apache/zookeeper/txn/MultiTxn.java delete mode 100644 pkg/registry/zookeeper-3.4.6/src/java/generated/org/apache/zookeeper/txn/SetACLTxn.java delete mode 100644 pkg/registry/zookeeper-3.4.6/src/java/generated/org/apache/zookeeper/txn/SetDataTxn.java delete mode 100644 pkg/registry/zookeeper-3.4.6/src/java/generated/org/apache/zookeeper/txn/SetMaxChildrenTxn.java delete mode 100644 pkg/registry/zookeeper-3.4.6/src/java/generated/org/apache/zookeeper/txn/Txn.java delete mode 100644 pkg/registry/zookeeper-3.4.6/src/java/generated/org/apache/zookeeper/txn/TxnHeader.java delete mode 100644 pkg/registry/zookeeper-3.4.6/src/java/generated/org/apache/zookeeper/version/Info.java delete mode 100644 pkg/registry/zookeeper-3.4.6/src/java/lib/cobertura/README.txt delete mode 100644 pkg/registry/zookeeper-3.4.6/src/java/lib/jdiff/zookeeper_3.1.1.xml delete mode 100644 pkg/registry/zookeeper-3.4.6/src/java/lib/jdiff/zookeeper_3.4.6-SNAPSHOT.xml delete mode 100644 pkg/registry/zookeeper-3.4.6/src/java/lib/jdiff/zookeeper_3.4.6.xml delete mode 100644 pkg/registry/zookeeper-3.4.6/src/java/lib/jline-0.9.94.LICENSE.txt delete mode 100644 pkg/registry/zookeeper-3.4.6/src/java/lib/log4j-1.2.16.LICENSE.txt delete mode 100644 pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/jute/BinaryInputArchive.java delete mode 100644 pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/jute/BinaryOutputArchive.java delete mode 100644 pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/jute/CsvInputArchive.java delete mode 100644 pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/jute/CsvOutputArchive.java delete mode 100644 pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/jute/Index.java delete mode 100644 pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/jute/InputArchive.java delete mode 100644 pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/jute/OutputArchive.java delete mode 100644 pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/jute/Record.java delete mode 100644 pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/jute/RecordReader.java delete mode 100644 pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/jute/RecordWriter.java delete mode 100644 pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/jute/Utils.java delete mode 100644 pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/jute/XmlInputArchive.java delete mode 100644 pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/jute/XmlOutputArchive.java delete mode 100644 pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/jute/compiler/CGenerator.java delete mode 100644 pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/jute/compiler/CSharpGenerator.java delete mode 100644 pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/jute/compiler/CppGenerator.java delete mode 100644 pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/jute/compiler/JBoolean.java delete mode 100644 pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/jute/compiler/JBuffer.java delete mode 100644 pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/jute/compiler/JByte.java delete mode 100644 pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/jute/compiler/JCompType.java delete mode 100644 pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/jute/compiler/JDouble.java delete mode 100644 pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/jute/compiler/JField.java delete mode 100644 pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/jute/compiler/JFile.java delete mode 100644 pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/jute/compiler/JFloat.java delete mode 100644 pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/jute/compiler/JInt.java delete mode 100644 pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/jute/compiler/JLong.java delete mode 100644 pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/jute/compiler/JMap.java delete mode 100644 pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/jute/compiler/JRecord.java delete mode 100644 pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/jute/compiler/JString.java delete mode 100644 pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/jute/compiler/JType.java delete mode 100644 pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/jute/compiler/JVector.java delete mode 100644 pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/jute/compiler/JavaGenerator.java delete mode 100644 pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/jute/compiler/generated/ParseException.java delete mode 100644 pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/jute/compiler/generated/Rcc.java delete mode 100644 pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/jute/compiler/generated/RccConstants.java delete mode 100644 pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/jute/compiler/generated/RccTokenManager.java delete mode 100644 pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/jute/compiler/generated/SimpleCharStream.java delete mode 100644 pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/jute/compiler/generated/Token.java delete mode 100644 pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/jute/compiler/generated/TokenMgrError.java delete mode 100644 pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/jute/compiler/generated/package.html delete mode 100644 pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/jute/compiler/generated/rcc.jj delete mode 100644 pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/jute/compiler/package.html delete mode 100644 pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/jute/package.html delete mode 100644 pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/AsyncCallback.java delete mode 100644 pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/ClientCnxn.java delete mode 100644 pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/ClientCnxnSocket.java delete mode 100644 pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/ClientCnxnSocketNIO.java delete mode 100644 pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/ClientWatchManager.java delete mode 100644 pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/CreateMode.java delete mode 100644 pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/Environment.java delete mode 100644 pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/JLineZNodeCompletor.java delete mode 100644 pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/KeeperException.java delete mode 100644 pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/Login.java delete mode 100644 pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/MultiResponse.java delete mode 100644 pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/MultiTransactionRecord.java delete mode 100644 pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/Op.java delete mode 100644 pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/OpResult.java delete mode 100644 pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/Quotas.java delete mode 100644 pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/ServerAdminClient.java delete mode 100644 pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/Shell.java delete mode 100644 pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/StatsTrack.java delete mode 100644 pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/Transaction.java delete mode 100644 pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/Version.java delete mode 100644 pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/WatchedEvent.java delete mode 100644 pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/Watcher.java delete mode 100644 pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/ZKUtil.java delete mode 100644 pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/ZooDefs.java delete mode 100644 pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/ZooKeeper.java delete mode 100644 pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/ZooKeeperMain.java delete mode 100644 pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/client/ConnectStringParser.java delete mode 100644 pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/client/FourLetterWordMain.java delete mode 100644 pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/client/HostProvider.java delete mode 100644 pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/client/StaticHostProvider.java delete mode 100644 pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/client/ZooKeeperSaslClient.java delete mode 100644 pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/common/AtomicFileOutputStream.java delete mode 100644 pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/common/IOUtils.java delete mode 100644 pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/common/PathTrie.java delete mode 100644 pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/common/PathUtils.java delete mode 100644 pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/jmx/CommonNames.java delete mode 100644 pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/jmx/MBeanRegistry.java delete mode 100644 pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/jmx/ManagedUtil.java delete mode 100644 pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/jmx/ZKMBeanInfo.java delete mode 100644 pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/ByteBufferInputStream.java delete mode 100644 pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/ByteBufferOutputStream.java delete mode 100644 pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/ConnectionBean.java delete mode 100644 pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/ConnectionMXBean.java delete mode 100644 pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/DataNode.java delete mode 100644 pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/DataTree.java delete mode 100644 pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/DataTreeBean.java delete mode 100644 pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/DataTreeMXBean.java delete mode 100644 pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/DatadirCleanupManager.java delete mode 100644 pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/FinalRequestProcessor.java delete mode 100644 pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/LogFormatter.java delete mode 100644 pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/NIOServerCnxn.java delete mode 100644 pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/NIOServerCnxnFactory.java delete mode 100644 pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/NettyServerCnxn.java delete mode 100644 pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/NettyServerCnxnFactory.java delete mode 100644 pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/ObserverBean.java delete mode 100644 pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/PrepRequestProcessor.java delete mode 100644 pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/PurgeTxnLog.java delete mode 100644 pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/Request.java delete mode 100644 pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/RequestProcessor.java delete mode 100644 pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/ServerCnxn.java delete mode 100644 pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/ServerCnxnFactory.java delete mode 100644 pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/ServerConfig.java delete mode 100644 pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/ServerStats.java delete mode 100644 pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/SessionTracker.java delete mode 100644 pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/SessionTrackerImpl.java delete mode 100644 pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/SnapshotFormatter.java delete mode 100644 pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/Stats.java delete mode 100644 pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/SyncRequestProcessor.java delete mode 100644 pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/TraceFormatter.java delete mode 100644 pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/UnimplementedRequestProcessor.java delete mode 100644 pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/WatchManager.java delete mode 100644 pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/ZKDatabase.java delete mode 100644 pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/ZooKeeperSaslServer.java delete mode 100644 pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/ZooKeeperServer.java delete mode 100644 pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/ZooKeeperServerBean.java delete mode 100644 pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/ZooKeeperServerMXBean.java delete mode 100644 pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/ZooKeeperServerMain.java delete mode 100644 pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/ZooTrace.java delete mode 100644 pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/auth/AuthenticationProvider.java delete mode 100644 pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/auth/DigestAuthenticationProvider.java delete mode 100644 pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/auth/DigestLoginModule.java delete mode 100644 pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/auth/IPAuthenticationProvider.java delete mode 100644 pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/auth/KerberosName.java delete mode 100644 pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/auth/ProviderRegistry.java delete mode 100644 pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/auth/SASLAuthenticationProvider.java delete mode 100644 pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/auth/SaslServerCallbackHandler.java delete mode 100644 pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/package.html delete mode 100644 pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/persistence/FileSnap.java delete mode 100644 pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/persistence/FileTxnLog.java delete mode 100644 pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/persistence/FileTxnSnapLog.java delete mode 100644 pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/persistence/SnapShot.java delete mode 100644 pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/persistence/TxnLog.java delete mode 100644 pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/persistence/Util.java delete mode 100644 pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/quorum/AckRequestProcessor.java delete mode 100644 pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/quorum/AuthFastLeaderElection.java delete mode 100644 pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/quorum/CommitProcessor.java delete mode 100644 pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/quorum/Election.java delete mode 100644 pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/quorum/FastLeaderElection.java delete mode 100644 pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/quorum/Follower.java delete mode 100644 pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/quorum/FollowerBean.java delete mode 100644 pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/quorum/FollowerMXBean.java delete mode 100644 pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/quorum/FollowerRequestProcessor.java delete mode 100644 pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/quorum/FollowerZooKeeperServer.java delete mode 100644 pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/quorum/Leader.java delete mode 100644 pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/quorum/LeaderBean.java delete mode 100644 pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/quorum/LeaderElection.java delete mode 100644 pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/quorum/LeaderElectionBean.java delete mode 100644 pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/quorum/LeaderElectionMXBean.java delete mode 100644 pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/quorum/LeaderMXBean.java delete mode 100644 pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/quorum/LeaderZooKeeperServer.java delete mode 100644 pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/quorum/Learner.java delete mode 100644 pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/quorum/LearnerHandler.java delete mode 100644 pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/quorum/LearnerSessionTracker.java delete mode 100644 pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/quorum/LearnerSyncRequest.java delete mode 100644 pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/quorum/LearnerZooKeeperServer.java delete mode 100644 pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/quorum/LocalPeerBean.java delete mode 100644 pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/quorum/LocalPeerMXBean.java delete mode 100644 pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/quorum/Observer.java delete mode 100644 pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/quorum/ObserverMXBean.java delete mode 100644 pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/quorum/ObserverRequestProcessor.java delete mode 100644 pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/quorum/ObserverZooKeeperServer.java delete mode 100644 pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/quorum/ProposalRequestProcessor.java delete mode 100644 pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/quorum/QuorumBean.java delete mode 100644 pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/quorum/QuorumCnxManager.java delete mode 100644 pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/quorum/QuorumMXBean.java delete mode 100644 pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/quorum/QuorumPeer.java delete mode 100644 pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/quorum/QuorumPeerConfig.java delete mode 100644 pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/quorum/QuorumPeerMain.java delete mode 100644 pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/quorum/QuorumStats.java delete mode 100644 pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/quorum/QuorumZooKeeperServer.java delete mode 100644 pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/quorum/ReadOnlyBean.java delete mode 100644 pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/quorum/ReadOnlyRequestProcessor.java delete mode 100644 pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/quorum/ReadOnlyZooKeeperServer.java delete mode 100644 pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/quorum/RemotePeerBean.java delete mode 100644 pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/quorum/RemotePeerMXBean.java delete mode 100644 pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/quorum/SendAckRequestProcessor.java delete mode 100644 pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/quorum/ServerBean.java delete mode 100644 pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/quorum/ServerMXBean.java delete mode 100644 pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/quorum/StateSummary.java delete mode 100644 pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/quorum/Vote.java delete mode 100644 pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/quorum/flexible/QuorumHierarchical.java delete mode 100644 pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/quorum/flexible/QuorumMaj.java delete mode 100644 pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/quorum/flexible/QuorumVerifier.java delete mode 100644 pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/upgrade/DataNodeV1.java delete mode 100644 pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/upgrade/DataTreeV1.java delete mode 100644 pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/upgrade/UpgradeMain.java delete mode 100644 pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/upgrade/UpgradeSnapShot.java delete mode 100644 pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/upgrade/UpgradeSnapShotV1.java delete mode 100644 pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/util/KerberosUtil.java delete mode 100644 pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/util/OSMXBean.java delete mode 100644 pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/util/Profiler.java delete mode 100644 pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/util/SerializeUtils.java delete mode 100644 pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/util/ZxidUtils.java delete mode 100644 pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/version/util/VerGen.java delete mode 100644 pkg/registry/zookeeper-3.4.6/src/java/main/overview.html delete mode 100644 pkg/registry/zookeeper-3.4.6/src/java/systest/README.txt delete mode 100644 pkg/registry/zookeeper-3.4.6/src/lastRevision.bat delete mode 100755 pkg/registry/zookeeper-3.4.6/src/lastRevision.sh delete mode 100644 pkg/registry/zookeeper-3.4.6/src/packages/deb/init.d/zookeeper delete mode 100644 pkg/registry/zookeeper-3.4.6/src/packages/deb/zookeeper.control/conffile delete mode 100644 pkg/registry/zookeeper-3.4.6/src/packages/deb/zookeeper.control/control delete mode 100644 pkg/registry/zookeeper-3.4.6/src/packages/deb/zookeeper.control/postinst delete mode 100644 pkg/registry/zookeeper-3.4.6/src/packages/deb/zookeeper.control/postrm delete mode 100644 pkg/registry/zookeeper-3.4.6/src/packages/deb/zookeeper.control/preinst delete mode 100644 pkg/registry/zookeeper-3.4.6/src/packages/deb/zookeeper.control/prerm delete mode 100644 pkg/registry/zookeeper-3.4.6/src/packages/rpm/init.d/zookeeper delete mode 100644 pkg/registry/zookeeper-3.4.6/src/packages/rpm/spec/zookeeper.spec delete mode 100755 pkg/registry/zookeeper-3.4.6/src/packages/templates/conf/zookeeper-env.sh delete mode 100755 pkg/registry/zookeeper-3.4.6/src/packages/update-zookeeper-env.sh delete mode 100644 pkg/registry/zookeeper-3.4.6/src/recipes/README.txt delete mode 100644 pkg/registry/zookeeper-3.4.6/src/recipes/build-recipes.xml delete mode 100644 pkg/registry/zookeeper-3.4.6/src/recipes/build.xml delete mode 100644 pkg/registry/zookeeper-3.4.6/src/recipes/election/README.txt delete mode 100644 pkg/registry/zookeeper-3.4.6/src/recipes/election/build.xml delete mode 100644 pkg/registry/zookeeper-3.4.6/src/recipes/election/src/java/org/apache/zookeeper/recipes/leader/LeaderElectionAware.java delete mode 100644 pkg/registry/zookeeper-3.4.6/src/recipes/election/src/java/org/apache/zookeeper/recipes/leader/LeaderElectionSupport.java delete mode 100644 pkg/registry/zookeeper-3.4.6/src/recipes/election/src/java/org/apache/zookeeper/recipes/leader/LeaderOffer.java delete mode 100644 pkg/registry/zookeeper-3.4.6/src/recipes/lock/README.txt delete mode 100644 pkg/registry/zookeeper-3.4.6/src/recipes/lock/build.xml delete mode 100644 pkg/registry/zookeeper-3.4.6/src/recipes/lock/src/c/INSTALL delete mode 100644 pkg/registry/zookeeper-3.4.6/src/recipes/lock/src/c/LICENSE delete mode 100644 pkg/registry/zookeeper-3.4.6/src/recipes/lock/src/c/Makefile.am delete mode 100644 pkg/registry/zookeeper-3.4.6/src/recipes/lock/src/c/README.txt delete mode 100644 pkg/registry/zookeeper-3.4.6/src/recipes/lock/src/c/acinclude.m4 delete mode 100644 pkg/registry/zookeeper-3.4.6/src/recipes/lock/src/c/aminclude.am delete mode 100644 pkg/registry/zookeeper-3.4.6/src/recipes/lock/src/c/c-doc.Doxyfile delete mode 100644 pkg/registry/zookeeper-3.4.6/src/recipes/lock/src/c/configure.ac delete mode 100644 pkg/registry/zookeeper-3.4.6/src/recipes/lock/src/c/include/zoo_lock.h delete mode 100644 pkg/registry/zookeeper-3.4.6/src/recipes/lock/src/c/src/zoo_lock.c delete mode 100644 pkg/registry/zookeeper-3.4.6/src/recipes/lock/src/c/tests/TestClient.cc delete mode 100644 pkg/registry/zookeeper-3.4.6/src/recipes/lock/src/c/tests/TestDriver.cc delete mode 100644 pkg/registry/zookeeper-3.4.6/src/recipes/lock/src/c/tests/Util.cc delete mode 100644 pkg/registry/zookeeper-3.4.6/src/recipes/lock/src/c/tests/Util.h delete mode 100755 pkg/registry/zookeeper-3.4.6/src/recipes/lock/src/c/tests/zkServer.sh delete mode 100644 pkg/registry/zookeeper-3.4.6/src/recipes/lock/src/java/org/apache/zookeeper/recipes/lock/LockListener.java delete mode 100644 pkg/registry/zookeeper-3.4.6/src/recipes/lock/src/java/org/apache/zookeeper/recipes/lock/ProtocolSupport.java delete mode 100644 pkg/registry/zookeeper-3.4.6/src/recipes/lock/src/java/org/apache/zookeeper/recipes/lock/WriteLock.java delete mode 100644 pkg/registry/zookeeper-3.4.6/src/recipes/lock/src/java/org/apache/zookeeper/recipes/lock/ZNodeName.java delete mode 100644 pkg/registry/zookeeper-3.4.6/src/recipes/lock/src/java/org/apache/zookeeper/recipes/lock/ZooKeeperOperation.java delete mode 100644 pkg/registry/zookeeper-3.4.6/src/recipes/queue/README.txt delete mode 100644 pkg/registry/zookeeper-3.4.6/src/recipes/queue/build.xml delete mode 100644 pkg/registry/zookeeper-3.4.6/src/recipes/queue/src/c/INSTALL delete mode 100644 pkg/registry/zookeeper-3.4.6/src/recipes/queue/src/c/LICENSE delete mode 100644 pkg/registry/zookeeper-3.4.6/src/recipes/queue/src/c/Makefile.am delete mode 100644 pkg/registry/zookeeper-3.4.6/src/recipes/queue/src/c/README.txt delete mode 100644 pkg/registry/zookeeper-3.4.6/src/recipes/queue/src/c/acinclude.m4 delete mode 100644 pkg/registry/zookeeper-3.4.6/src/recipes/queue/src/c/aminclude.am delete mode 100644 pkg/registry/zookeeper-3.4.6/src/recipes/queue/src/c/c-doc.Doxyfile delete mode 100644 pkg/registry/zookeeper-3.4.6/src/recipes/queue/src/c/configure.ac delete mode 100644 pkg/registry/zookeeper-3.4.6/src/recipes/queue/src/c/include/zoo_queue.h delete mode 100644 pkg/registry/zookeeper-3.4.6/src/recipes/queue/src/c/src/zoo_queue.c delete mode 100644 pkg/registry/zookeeper-3.4.6/src/recipes/queue/src/c/tests/TestClient.cc delete mode 100644 pkg/registry/zookeeper-3.4.6/src/recipes/queue/src/c/tests/TestDriver.cc delete mode 100644 pkg/registry/zookeeper-3.4.6/src/recipes/queue/src/c/tests/Util.cc delete mode 100644 pkg/registry/zookeeper-3.4.6/src/recipes/queue/src/c/tests/Util.h delete mode 100755 pkg/registry/zookeeper-3.4.6/src/recipes/queue/src/c/tests/zkServer.sh delete mode 100644 pkg/registry/zookeeper-3.4.6/src/recipes/queue/src/java/org/apache/zookeeper/recipes/queue/DistributedQueue.java delete mode 100644 pkg/registry/zookeeper-3.4.6/src/zookeeper.jute delete mode 100644 pkg/registry/zookeeper-3.4.6/zookeeper-3.4.6.jar.REMOVED.git-id delete mode 100644 pkg/registry/zookeeper-3.4.6/zookeeper-3.4.6.jar.asc delete mode 100644 pkg/registry/zookeeper-3.4.6/zookeeper-3.4.6.jar.md5 delete mode 100644 pkg/registry/zookeeper-3.4.6/zookeeper-3.4.6.jar.sha1 diff --git a/pkg/registry/zookeeper-3.4.6/CHANGES.txt b/pkg/registry/zookeeper-3.4.6/CHANGES.txt deleted file mode 100644 index 915fec2cb..000000000 --- a/pkg/registry/zookeeper-3.4.6/CHANGES.txt +++ /dev/null @@ -1,2276 +0,0 @@ -Release 3.4.6 - 2014-03-10 - -Backward compatible changes: - -BUGFIXES: - - ZOOKEEPER-1474. Cannot build Zookeeper with IBM Java: use of Sun - MXBean classes (Adalberto Medeiros via phunt) - - ZOOKEEPER-1596. Zab1_0Test should ensure that the file is closed - (Enis Soztutar via phunt) - - ZOOKEEPER-1513. "Unreasonable length" exception while starting a - server (Skye W-M via phunt) - - ZOOKEEPER-1581. change copyright in notice to 2012 (breed via phunt) - - ZOOKEEPER-753. log4j dependency in the pom needs to have exclusion - lists (Sean Busbey via phunt) - - ZOOKEEPER-1553. Findbugs configuration is missing some dependencies - (Sean Busbey via phunt) - - ZOOKEEPER-1478. Small bug in QuorumTest.testFollowersStartAfterLeader( ) - (Alexander Shraer via fpj, breed, phunt) - - ZOOKEEPER-1387. Wrong epoch file created - (Benjamin Busjaeger via breed, phunt) - - ZOOKEEPER-1578. org.apache.zookeeper.server.quorum.Zab1_0Test failed due to - hard code with 33556 port. (Li Ping via mahadev) - - ZOOKEEPER-1334. Zookeeper 3.4.x is not OSGi compliant - MANIFEST.MF - is flawed (Claus Ibsen via phunt) - - ZOOKEEPER-1535. ZK Shell/Cli re-executes last command on exit - (Edward Ribeiro via camille) - - ZOOKEEPER-1495. ZK client hangs when using a function not available - on the server. (Skye W-M via phunt) - - ZOOKEEPER-1613. The documentation still points to 2008 in the - copyright notice (Edward Ribeiro via phunt) - - ZOOKEEPER-1562. Memory leaks in zoo_multi API - (Deepak Jagtap via phunt) - - ZOOKEEPER-1645. ZooKeeper OSGi package imports not complete - (Arnoud Glimmerveen via phunt) - - ZOOKEEPER-1648. Fix WatcherTest in JDK7 - (Thawan Kooburat via phunt) - - ZOOKEEPER-1606. intermittent failures in ZkDatabaseCorruptionTest on - jenkins (lixiaofeng via phunt) - - ZOOKEEPER-1647. OSGi package import/export changes not applied to - bin-jar (Arnoud Glimmerveen via phunt) - - ZOOKEEPER-1633. Introduce a protocol version to connection initiation - message (Alexander Shraer via michim) - - ZOOKEEPER-1697. large snapshots can cause continuous quorum failure - (phunt via fpj) - - ZOOKEEPER-1706. Typo in Double Barriers example (Jingguo Yao via fpj) - - ZOOKEEPER-1642. Leader Loading Database Twice (fpj via camille) - - ZOOKEEPER-1663. scripts don't work when path contains spaces (Amichai Rothman via camille) - - ZOOKEEPER-1714 perl client segfaults if ZOO_READ_ACL_UNSAFE constant is used - (Botond Hejj via camille) - - ZOOKEEPER-1719. zkCli.sh, zkServer.sh and zkEnv.sh regression caused by ZOOKEEPER-1663 - (Marshall McMullen via camille) - - ZOOKEEPER-1702. ZooKeeper client may write operation packets before - receiving successful response to connection request, can cause TCP - RST (Chris Nauroth via phunt) - - ZOOKEEPER-1629. testTransactionLogCorruption occasionally fails. (shralex via camille) - - ZOOKEEPER-1731. Unsynchronized access to ServerCnxnFactory.connectionBeans results in - deadlock. (Dave Latham via camille) - - ZOOKEEPER-1713. wrong time calculation in zkfuse.cc (german via fpj) - - ZOOKEEPER-1379. 'printwatches, redo, history and connect '. client commands always print usage. This is not necessary (edward via fpj) - - ZOOKEEPER-1448: Node+Quota creation in transaction log can crash leader startup (Botond Hejj via fpj) - - ZOOKEEPER-1664. Kerberos auth doesn't work with native platform GSS integration. (Boaz Kelmer via camille) - - ZOOKEEPER-1750. Race condition producing NPE in NIOServerCnxn.toString - (Rakesh R via michim) - - ZOOKEEPER-1754. Read-only server allows to create znode (Rakesh R via fpj) - - ZOOKEEPER-1751. ClientCnxn#run could miss the second ping or connection get - dropped before a ping. (Jeffrey Zhong via mahadev) - - ZOOKEEPER-1657. Increased CPU usage by unnecessary SASL checks (Philip K. Warren via fpj) - - ZOOKEEPER-1753. ClientCnxn is not properly releasing the resources, - which are used to ping RwServer (Rakesh R via fpj) - - ZOOKEEPER-1096. Leader communication should listen on specified IP, not wildcard address (Jared Cantwell, German Blanco via fpj) - - ZOOKEEPER-87. Follower does not shut itself down if its too far behind the leader. (German Blanco via fpj) - - ZOOKEEPER-1603. StaticHostProviderTest testUpdateClientMigrateOrNot hangs (fpj) - - ZOOKEEPER-1696. Fail to run zookeeper client on Weblogic application server. - (Jeffrey Zhong via mahadev) - - ZOOKEEPER-1770. NullPointerException in SnapshotFormatter - (Germán Blanco via phunt) - - ZOOKEEPER-732. Improper translation of error into Python exception (Andrei Savu, Lei Zhang, fpj via fpj) - - ZOOKEEPER-1551. Observers ignore txns that come after snapshot and UPTODATE - (thawan, fpj via thawan) - - ZOOKEEPER-1774. QuorumPeerMainTest fails consistently with - "complains about host" assertion failure (phunt) - - ZOOKEEPER-877. zkpython does not work with python3.1 - (Daniel Enman via phunt) - - ZOOKEEPER-1624. PrepRequestProcessor abort multi-operation incorrectly. (thawan via camille) - - ZOOKEEPER-1610. Some classes are using == or != to compare - Long/String objects instead of .equals() (Edward Ribeiro via phunt) - - ZOOKEEPER-1646. mt c client tests fail on Ubuntu Raring (phunt) - - ZOOKEEPER-1558. Leader should not snapshot uncommitted state (fpj) - - ZOOKEEPER-1732. ZooKeeper server unable to join established - ensemble (German Blanco via fpj) - - ZOOKEEPER-1667. Watch event isn't handled correctly when - a client reestablish to a server (jacky007, fpj via fpj) - - ZOOKEEPER-1799. SaslAuthFailDesignatedClientTest.testAuth fails - frequently on SUSE (Jeffrey Zhong via phunt) - - ZOOKEEPER-1557. jenkins jdk7 test failure in - testBadSaslAuthNotifiesWatch (Eugene Koontz via phunt) - - ZOOKEEPER-1744. clientPortAddress breaks "zkServer.sh status" - (Nick Ohanian via phunt) - - ZOOKEEPER-1798. Fix race condition in testNormalObserverRun - (thawan, fpj via thawan) - - ZOOKEEPER-1808. Add version to FLE notifications for 3.4 branch (fpj) - - ZOOKEEPER-1812. ZooInspector reconnection always fails if first - connection fails (Benjamin Jaton via phunt) - - ZOOKEEPER-1597. Windows build failing (michim via fpj) - - ZOOKEEPER-1817. Fix don't care for b3.4 (fpj) - - ZOOKEEPER-1653. zookeeper fails to start because of inconsistent - epoch (michim via fpj) - - ZOOKEEPER-1821. very ugly warning when compiling load_gen.c - (german blanco via fpj) - - ZOOKEEPER-1632. fix memory leaks in cli_st (fpj via michim) - - ZOOKEEPER-1459. Standalone ZooKeeperServer is not closing - the transaction log files on shutdown (Rakesh R via fpj) - - ZOOKEEPER-1019. zkfuse doesn't list dependency on boost in README - (Raul Gutierrez Segales via michim) - - ZOOKEEPER-1834. Catch IOException in FileTxnLog (fpj via michim) - - ZOOKEEPER-1382. Zookeeper server holds onto dead/expired session ids in the watch data structures - (Germán Blanco and Michael Morello via camille) - - ZOOKEEPER-1837. Fix JMXEnv checks (potential race conditions) - (Germán Blanco via fpj) - - ZOOKEEPER-1839. Deadlock in NettyServerCnxn (Rakesh R via michim) - - ZOOKEEPER-1622. session ids will be negative in the year 2022 - (Eric Newton via phunt) - - ZOOKEEPER-1756. zookeeper_interest() in C client can return a timeval of 0 - (Eric Lindvall via michim) - - ZOOKEEPER-1388. Client side 'PathValidation' is missing for the - multi-transaction api. (Rakesh R via marshallm, phunt) - - ZOOKEEPER-1841. problem in QuorumTest (Germán via fpj) - - ZOOKEEPER-1733 FLETest#testLE is flaky oo.l windows boxes - (michim, Jeffrey Zhong via fpj) - - ZOOKEEPER-1849. Need to properly tear down tests in various - cases (Germán via fpj) - - ZOOKEEPER-1179. NettyServerCnxn does not properly close - socket on 4 letter word requests (Rakesh R, Germán Blanco - via fpj) - - ZOOKEEPER-1852. ServerCnxnFactory instance is not properly - cleanedup (Rakesh R via fpj) - - ZOOKEEPER-1414. QuorumPeerMainTest.testQuorum, testBadPackets are failing - intermittently (Rakesh R via michim) - - ZOOKEEPER-1057. zookeeper c-client, connection to offline server fails to - successfully fallback to second zk host (Germán Blanco via michim) - - ZOOKEEPER-1857. PrepRequestProcessotTest doesn't shutdown ZooKeeper server - (Germán Blanco via michim) - - ZOOKEEPER-1238. when the linger time was changed for NIO the patch missed - Netty (Skye Wanderman-Milne via fpj) - - ZOOKEEPER-1837. Fix JMXEnv checks (potential race conditions) - (Germán Blanco via fpj) - - ZOOKEEPER-1858. JMX checks - potential race conditions while stopping - and starting server (Rakesh R via fpj) - - ZOOKEEPER-1867. Bug in ZkDatabaseCorruptionTest (fpj) - - ZOOKEEPER-1872. QuorumPeer is not shutdown in few cases - (Rakesh R via fpj) - - ZOOKEEPER-1573. Unable to load database due to missing parent node - (Vinayakumar B via phunt, fpj) - - ZOOKEEPER-1811. The ZooKeeperSaslClient service name principal is - hardcoded to "zookeeper" (Harsh J via phunt) - - ZOOKEEPER-1873. Unnecessarily InstanceNotFoundException is coming when - unregister failed jmxbeans (Rakesh R via michim) - - ZOOKEEPER-1844. TruncateTest fails on windows (Rakesh R via fpj) - - ZOOKEEPER-1755. Concurrent operations of four letter 'dump' ephemeral - command and killSession causing NPE (Rakesh R via camille) - -IMPROVEMENTS: - - ZOOKEEPER-1564. Allow JUnit test build with IBM Java - (Paulo Ricardo Paz Vital via phunt) - - ZOOKEEPER-1598. Ability to support more digits in the version string - (Raja Aluri via phunt) - - ZOOKEEPER-1583. Document maxClientCnxns in conf/zoo_sample.cfg - (Christopher Tubbs via phunt) - - ZOOKEEPER-1584. Adding mvn-install target for deploying the - zookeeper artifacts to .m2 repository (Ashish Singh via phunt) - - ZOOKEEPER-1324. Remove Duplicate NEWLEADER packets from the - Leader to the Follower. (thawan, fpj via fpj) - - ZOOKEEPER-1615. minor typos in ZooKeeper Programmer's Guide web page - (Evan Zacks via phunt) - - ZOOKEEPER-1552. Enable sync request processor in Observer (thawan, fpj) - - ZOOKEEPER-1758. Add documentation for zookeeper.observer.syncEnabled flag - (thawan, fpj via thawan) - - ZOOKEEPER-1771. ZooInspector authentication (Benjamin Jaton via phunt) - - ZOOKEEPER-1627. Add org.apache.zookeeper.common to exported packages - in OSGi MANIFEST (Arnoud Glimmerveen via phunt) - - ZOOKEEPER-1666. Avoid Reverse DNS lookup if the hostname in - connection string is literal IP address. (George Cao via camille) - - ZOOKEEPER-1786. ZooKeeper data model documentation is incorrect - (Niraj Tolia via fpj) - - ZOOKEEPER-1715. Upgrade netty version (Sean Bridges via michim) - - ZOOKEEPER-1430. add maven deploy support to the build - (Giridharan Kesavan via phunt) - -Release 3.4.5 - 2012-09-30 - -Backward compatible changes: - -BUGFIXES: - - ZOOKEEPER-1376. zkServer.sh does not correctly check for - $SERVER_JVMFLAGS (Skye W-M via henryr) - - ZOOKEEPER-1550. ZooKeeperSaslClient does not finish anonymous login on - OpenJDK. (Eugene Koontz via mahadev) - - -Release 3.4.4 - 2012-09-17 - -Backward compatible changes: - -BUGFIXES: - - ZOOKEEPER-1466. QuorumCnxManager.shutdown missing synchronization. - (Patrick Hunt via mahadev) - - ZOOKEEPER-1386. avoid flaky URL redirection in "ant javadoc" : - replace "http://java.sun.com/javase/6/docs/api/" with - "http://download.oracle.com/javase/6/docs/api/" (Eugene Koontz via camille) - - ZOOKEEPER-1354. AuthTest.testBadAuthThenSendOtherCommands fails - intermittently (phunt via camille) - - ZOOKEEPER-1277. servers stop serving when lower 32bits of zxid roll - over (phunt) - - ZOOKEEPER-1412. java client watches inconsistently triggered on - reconnect (phunt) - - ZOOKEEPER-1344. ZooKeeper client multi-update command is not - considering the Chroot request (Rakesh R via phunt) - - ZOOKEEPER-1307. zkCli.sh is exiting when an Invalid ACL exception is - thrown from setACL command through client (Kavita Sharma via phunt) - - ZOOKEEPER-1390. some expensive debug code not protected by a check - for debug (breed via camille) - - ZOOKEEPER-1406. dpkg init scripts don't restart - missing - check_priv_sep_dir (Chris Beauchamp via phunt) - - ZOOKEEPER-1403. zkCli.sh script quoting issue (James Page via phunt) - - ZOOKEEPER-1384. test-cppunit overrides LD_LIBRARY_PATH and fails if - gcc is in non-standard location (Jay Shrauner via phunt) - - ZOOKEEPER-1419. Leader election never settles for a 5-node cluster - (flavio via camille) - - ZOOKEEPER-1256. ClientPortBindTest is failing on Mac OS X - (Daniel Gómez Ferro via phunt) - - ZOOKEEPER-1433. improve ZxidRolloverTest (test seems flakey) (phunt via henryr) - - ZOOKEEPER-1395. node-watcher double-free redux (Mike Lundy via henryr) - - ZOOKEEPER-1450. Backport of ZOOKEEPER-1294 fix to 3.4 and 3.3 (Norman Bishop via camille) - - ZOOKEEPER-1048. addauth command does not work in cli_mt/cli_st (allengao via michim) - - ZOOKEEPER-1339. C client doesn't build with --enable-debug (Eric Liang via michim) - - ZOOKEEPER-1318. In Python binding, get_children (and get and exists, and probably others) - with expired session doesn't raise exception properly (henryr via michim) - - ZOOKEEPER-1431. zkpython async calls leak memory (Kapil Thangavelu and Andre Cruz via henryr) - - ZOOKEEPER-1163. Memory leak in zk_hashtable.c:do_insert_watcher_object() - (Anupam Chanda via michim) - - ZOOKEEPER-1490. If the configured log directory does not exist - zookeeper will not start. Better to create the directory and start - (suja s via phunt) - - ZOOKEEPER-1210. Can't build ZooKeeper RPM with RPM >= 4.6.0 (i.e. on - RHEL 6 and Fedora >= 10) (Tadeusz Andrzej Kadłubowski via phunt) - - ZOOKEEPER-1236. Security uses proprietary Sun APIs - (Adalberto Medeiros via phunt) - - ZOOKEEPER-1471. Jute generates invalid C++ code - (Michi Mutsuzaki via phunt) - - ZOOKEEPER-1465. Cluster availability following new leader election - takes a long time with large datasets - is correlated to dataset size - (fpj and Thawan Kooburat via camille) - - ZOOKEEPER-1427. Writing to local files is done non-atomically (phunt) - - ZOOKEEPER-1489. Data loss after truncate on transaction log (phunt) - - ZOOKEEPER-1521. LearnerHandler initLimit/syncLimit problems - specifying follower socket timeout limits (phunt) - - ZOOKEEPER-1493. C Client: zookeeper_process doesn't invoke - completion callback if zookeeper_close has been called - (Michi Mutsuzaki via phunt and mahadev) - - ZOOKEEPER-1522. intermittent failures in Zab test due to NPE in - recursiveDelete test function (phunt via flavio) - - ZOOKEEPER-1514. FastLeaderElection - leader ignores the round - information when joining a quorum (flavio via henryr) - - ZOOKEEPER-1536 c client : memory leak in winport.c (brooklin via michim) - - ZOOKEEPER-1481 allow the C cli to run exists with a watcher (phunt via michim) - - ZOOKEEPER-1380. zkperl: _zk_release_watch doesn't remove items properly from - the watch list. (Botond Hejj via mahadev) - - ZOOKEEPER-1501. Nagios plugin always returns OK when it cannot connect to - zookeeper. (Brian Sutherland via mahadev) - - ZOOKEEPER-1494. C client: socket leak after receive timeout in - zookeeper_interest() (Michi Mutsuzaki via mahadev) - - ZOOKEEPER-1483. Fix leader election recipe documentation. (Michi Mutsuzaki - via mahadev) - - ZOOKEEPER-1496. Ephemeral node not getting cleared even after client has - exited (Rakesh R via mahadev) - -IMPROVEMENTS: - - ZOOKEEPER-1389. it would be nice if start-foreground used exec $JAVA - in order to get rid of the intermediate shell process - (Roman Shaposhnik via phunt) - - ZOOKEEPER-1377. add support for dumping a snapshot file content (similar to LogFormatter). (phunt via camille) - - ZOOKEEPER-1454. Document how to run autoreconf if cppunit is - installed in a non-standard directory (Michi Mutsuzaki via phunt) - - ZOOKEEPER-1503. remove redundant JAAS configuration code in SaslAuthTest and - SaslAuthFailTest (Eugene Koontz via phunt) - - ZOOKEEPER-1510. Should not log SASL errors for non-secure usage - (Todd Lipcon via phunt) - - ZOOKEEPER-1497. Allow server-side SASL login with JAAS configuration - to be programmatically set (rather than only by reading JAAS - configuration file) (Matteo Bertozzi via phunt) - - ZOOKEEPER-1437. Client uses session before SASL authentication complete. - (Eugene Koontz via mahadev) - - ZOOKEEPER-1361. Leader.lead iterates over 'learners' set without proper - synchronisation. (Henry Robinson via mahadev) - -Release 3.4.3 - 2012-02-06 - -Backward compatible changes: - -BUGFIXES: - - ZOOKEEPER-1089. zkServer.sh status does not work due to invalid - option of nc (Roman Shaposhnik via phunt) - - ZOOKEEPER-1345. Add a .gitignore file with general exclusions and - Eclipse project files excluded (Harsh J via phunt) - - ZOOKEEPER-1343. getEpochToPropose should check if lastAcceptedEpoch is greater or equal than epoch (fpj via breed) - - ZOOKEEPER-1358. In StaticHostProviderTest.java, testNextDoesNotSleepForZero tests that hostProvider.next(0) - doesn't sleep by checking that the latency of this call is less than 10sec (Alex Shraer via camille) - - ZOOKEEPER-1351. invalid test verification in MultiTransactionTest (phunt via camille) - - ZOOKEEPER-973. bind() could fail on Leader because it does not - setReuseAddress on its ServerSocket (Harsh J via phunt) - - ZOOKEEPER-1367. Data inconsistencies and unexpired ephemeral nodes after cluster restart. - (Bejamin Reed via mahadev) - - ZOOKEEPER-1353. C client test suite fails consistently. - (Clint Byrum via mahadev) - - ZOOKEEPER-1373. Hardcoded SASL login context name clashes with Hadoop security - configuration override. (Eugene Koontz and Thomas Weise via mahadev) - - ZOOKEEPER-1352. server.InvalidSnapshotTest is using connection timeouts that - are too short. (phunt via mahadev) - - ZOOKEEPER-1336. javadoc for multi is confusing, references functionality that doesn't - seem to exist (phunt via mahadev) - - ZOOKEEPER-1340. multi problem - typical user operations are - generating ERROR level messages in the server (phunt via mahadev) - - ZOOKEEPER-1374. C client multi-threaded test suite fails to - compile on ARM architectures. (James Page via mahadev) - - ZOOKEEPER-1337. multi's "Transaction" class is missing tests. - (phunt and camille via mahadev) - - ZOOKEEPER-1338. class cast exceptions may be thrown by multi - ErrorResult class (invalid equals) (phunt via mahadev) - -IMPROVEMENTS: - - ZOOKEEPER-1322. Cleanup/fix logging in Quorum code. (phunt via mahadev) - - ZOOKEEPER-1327. there are still remnants of hadoop urls. - (Harsh J via mahadev) - - -Release 3.4.2 - 2011-12-21 - -Backward compatible changes: - -BUGFIXES: - - ZOOKEEPER-1323. c client doesn't compile on freebsd - (michi mutsuzaki via phunt) - - ZOOKEEPER-1333. NPE in FileTxnSnapLog when restarting a cluster. - (Patrick Hunt and Andrew Mc Nair via mahadev) - -Release 3.4.1 - 2011-12-12 - -Backward compatible changes: - -BUGFIXES: - - ZOOKEEPER-1311. ZooKeeper test jar is broken (Ivan Kelly via phunt) - - ZOOKEEPER-1305. zookeeper.c:prepend_string func can dereference null ptr. - (Daniel Lescohier via mahadev) - - ZOOKEEPER-1316. zookeeper_init leaks memory if chroot is just '/'. - (Akira Kitada via mahadev) - - ZOOKEEPER-1315. zookeeper_init always reports sessionPasswd=. - (Akira Kitada via mahadev) - - ZOOKEEPER-1317. Possible segfault in zookeeper_init. - (Akira Kitada via mahadev) - - ZOOKEEPER-1319. Missing data after restarting+expanding a cluster. - (Patrick Hunt and Ben Reed via mahadev) - - ZOOKEEPER-1269. Multi deserialization issues (Camille Fournier via - mahadev) - -Release 3.4.0 - 2011-10-25 - -Non-backward compatible changes: - -BUGFIXES: - -Backward compatible changes: - -BUGFIXES: - - ZOOKEEPER-735. cppunit test testipv6 assumes that the machine is ipv6 - enabled. (mahadev) - - ZOOKEEPER-720. Use zookeeper-{version}-sources.jar instead of - zookeeper-{version}-src.jar to publish sources in the Maven repository - (paolo via phunt) - - ZOOKEEPER-722. zkServer.sh uses sh's builtin echo on BSD, behaves - incorrectly. (Ivan Kelly via phunt) - - ZOOKEEPER-741. root level create on REST proxy fails (phunt) - - ZOOKEEPER-631. zkpython's C code could do with a style clean-up - (henry robinson via phunt) - - ZOOKEEPER-746. learner outputs session id to log in dec (phunt via - henryr) - - ZOOKEEPER-738. zookeeper.jute.h fails to compile with -pedantic - (Jozef Hatala via phunt) - - ZOOKEEPER-734. QuorumPeerTestBase.java and ZooKeeperServerMainTest.java - do not handle windows path correctly (Vishal K via phunt) - - ZOOKEEPER-754. numerous misspellings "succesfully" - (Andrei Savu via phunt) - - ZOOKEEPER-749. OSGi metadata not included in binary only jar (phunt - via henryr) - - ZOOKEEPER-750. move maven artifacts into "dist-maven" subdir of the - release (package target) (phunt via henryr) - - ZOOKEEPER-758. zkpython segfaults on invalid acl with missing key - (Kapil Thangavelu via henryr) - - ZOOKEEPER-737. some 4 letter words may fail with netcat (nc). (mahadev) - - ZOOKEEPER-764. Observer elected leader due to inconsistent voting view - (henry via mahadev) - - ZOOKEEPER-763. Deadlock on close w/ zkpython / c client - (henry via phunt) - - ZOOKEEPER-774. Recipes tests are slightly outdated: they do not compile - against JUnit 4.8 (Sergey Doroshenko via phunt) - - ZOOKEEPER-772. zkpython segfaults when watcher from async get children is - invoked. (henry via phunt) - - ZOOKEEPER-636. configure.ac has instructions which override the contents of - CFLAGS and CXXFLAGS. (Maxim P. Dementiev via phunt) - - ZOOKEEPER-796. zkServer.sh should support an external PIDFILE variable - (Alex Newman via phunt) - - ZOOKEEPER-719. Add throttling to BookKeeper client (fpj via breed) - - ZOOKEEPER-814. monitoring scripts are missing apache license headers - (andrei savu via mahadev) - - ZOOKEEPER-783. committedLog in ZKDatabase is not properly synchronized - (henry via mahadev) - - ZOOKEEPER-790. Last processed zxid set prematurely while establishing - leadership (flavio via mahadev) - - ZOOKEEPER-795. eventThread isn't shutdown after a connection - "session expired" event coming (Sergey Doroshenko and Ben via mahadev) - - ZOOKEEPER-792. zkpython memory leak (Lei Zhang via henryr) - - ZOOKEEPER-854. BookKeeper does not compile due to changes in the ZooKeeper - code (Flavio via mahadev) - - ZOOKEEPER-861. Missing the test SSL certificate used for running junit tests. - (erwin tam via mahadev) - - ZOOKEEPER-867. ClientTest is failing on hudson - fd cleanup (phunt) - - ZOOKEEPER-785. Zookeeper 3.3.1 shouldn't infinite loop if someone creates a - server.0 line (phunt and Andrei Savu via breed) - - ZOOKEEPER-785. Zookeeper 3.3.1 shouldn't infinite loop if someone creates a - server.0 line (part 2) (phunt) - - ZOOKEEPER-870. Zookeeper trunk build broken. (mahadev via phunt) - - ZOOKEEPER-831. BookKeeper: Throttling improved for reads (breed via fpj) - - ZOOKEEPER-846. zookeeper client doesn't shut down cleanly on the close call - (phunt) - - ZOOKEEPER-804. c unit tests failing due to "assertion cptr failed" (michi - mutsuzaki via mahadev) - - ZOOKEEPER-844. handle auth failure in java client - (Camille Fournier via phunt) - - ZOOKEEPER-822. Leader election taking a long time to complete - (Vishal K via phunt) - - ZOOKEEPER-866. Hedwig Server stays in "disconnected" state when - connection to ZK dies but gets reconnected (erwin tam via breed) - - ZOOKEEPER-881. ZooKeeperServer.loadData loads database twice - (jared cantwell via breed) - - ZOOKEEPER-855. clientPortBindAddress should be clientPortAddress - (Jared Cantwell via fpj) - - ZOOKEEPER-888. c-client / zkpython: Double free corruption on - node watcher (Austin Shoemaker via henryr) - - ZOOKEEPER-893. ZooKeeper high cpu usage when invalid requests - (Thijs Terlouw via phunt) - - ZOOKEEPER-804. c unit tests failing due to "assertion cptr failed" - (second try - Jared Cantwell via phunt) - - ZOOKEEPER-820. update c unit tests to ensure "zombie" java server - processes don't cause failure (Michi Mutsuzaki via phunt) - - ZOOKEEPER-794. Callbacks are not invoked when the client is closed - (Alexis Midon via phunt) - - ZOOKEEPER-800. zoo_add_auth returns ZOK if zookeeper handle is in - ZOO_CLOSED_STATE (michi mutsuzaki via mahadev konar) - - ZOOKEEPER-904. super digest is not actually acting as a full superuser - (Camille Fournier via mahadev) - - ZOOKEEPER-897. C Client seg faults during close (jared cantwell via mahadev) - - ZOOKEEPER-898. C Client might not cleanup correctly during close - (jared cantwell via mahadev) - - ZOOKEEPER-907. Spurious "KeeperErrorCode = Session moved" messages (vishal k via breed) - - ZOOKEEPER-884. Remove LedgerSequence references from BookKeeper documentation and comments in tests (fpj via breed) - - ZOOKEEPER-916. Problem receiving messages from subscribed channels in c++ client (ivan via breed) - - ZOOKEEPER-930. Hedwig c++ client uses a non thread safe logging library (ivan via breed) - - ZOOKEEPER-900. FLE implementation should be improved to use non-blocking sockets (vishal via fpj) - - ZOOKEEPER-937. test -e not available on solaris /bin/sh (Erik Hetzner via mahadev) - - ZOOKEEPER-905. enhance zkServer.sh for easier zookeeper automation-izing (Nicholas Harteau via mahadev) - - ZOOKEEPER-913. Version parser fails to parse "3.3.2-dev" from build.xml (Anthony Urso and phunt via breed) - - ZOOKEEPER-957. zkCleanup.sh doesn't do anything (Ted Dunning via mahadev) - - ZOOKEEPER-958. Flag to turn off autoconsume in hedwig c++ client (Ivan Kelly - via mahadev) - - ZOOKEEPER-882. Startup loads last transaction from snapshot (j:ared via fpj) - - ZOOKEEPER-962. leader/follower coherence issue when follower is receiving a DIFF - (camille fournier via breed) - - ZOOKEEPER-902. Fix findbug issue in trunk "Malicious code vulnerability" - (flavio and phunt via phunt) - - ZOOKEEPER-985. Test BookieRecoveryTest fails on trunk. (fpj via breed) - - ZOOKEEPER-983. running zkServer.sh start remotely using ssh hangs (phunt) - - ZOOKEEPER-976. ZooKeeper startup script doesn't use JAVA_HOME (phunt) - - ZOOKEEPER-994 "eclipse" target in the build script doesnot include - libraray required for test classes in the classpath (MIS via phunt) - - ZOOKEEPER-1013 zkServer.sh usage message should mention all startup options - (eugene koontz via mahadev) - - ZOOKEEPER-1007. iarchive leak in C client (jeremy stribling via mahadev) - - ZOOKEEPER-993. Code improvements (MIS via fpj) - - ZOOKEEPER-1012. support distinct JVMFLAGS for zookeeper server in zkServer.sh - and zookeeper client in zkCli.sh (Eugene Koontz via breed) - - ZOOKEEPER-880. QuorumCnxManager$SendWorker grows without bounds (vishal via breed) - - ZOOKEEPER-1018. The connection permutation in get_addrs uses a weak and inefficient - shuffle (Stephen Tyree via breed) - - ZOOKEEPER-1028. In python bindings, zookeeper.set2() should return a stat dict but - instead returns None. (Chris Medaglia and Ivan Kelly via mahadev) - - ZOOKEEPER-975. new peer goes in LEADING state even if ensemble is online. (vishal via fpj) - - ZOOKEEPER-1049. Session expire/close flooding renders heartbeats to delay significantly. - (chang song via mahadev) - - ZOOKEEPER-1033. c client should install includes into INCDIR/zookeeper, not INCDIR/c-client-src - (Nicholas Harteau via mahadev) - - ZOOKEEPER-1061. Zookeeper stop fails if start called twice. (Ted Dunning via mahadev) - - ZOOKEEPER-1059. stat command isses on non-existing node causes NPE. (Bhallamudi Kamesh via mahadev) - - ZOOKEEPER-1058. fix typo in opToString for getData. (camille) - - ZOOKEEPER-1046. Creating a new sequential node results in a ZNODEEXISTS error. (Vishal K via camille) - - ZOOKEEPER-1069. Calling shutdown() on a QuorumPeer too quickly can lead to a corrupt log. (Vishal K via camille) - - ZOOKEEPER-1083. Javadoc for WatchedEvent not being generated. (Ivan Kelly via michim) - - ZOOKEEPER-1086. zookeeper test jar has non mavenised dependency. (Ivan Kelly via michim) - - ZOOKEEPER-335. zookeeper servers should commit the new leader txn to their logs. (breed) - - ZOOKEEPER-1081. modify leader/follower code to correctly deal with new leader (breed) - - ZOOKEEPER-1082. modify leader election to correctly take into account current epoch (fpj via breed) - - ZOOKEEPER-1060. QuorumPeer takes a long time to shutdown (Vishal via fpj) - - ZOOKEEPER-1087. ForceSync VM arguement not working when set to "no" (Nate Putnam via breed) - - ZOOKEEPER-1068. Documentation and default config suggest incorrect - location for Zookeeper state (Roman Shaposhnik via phunt) - - ZOOKEEPER-1103. In QuorumTest, use the same "for ( .. try { break } - catch { } )" pattern in testFollowersStartAfterLeaders as in - testSessionMove. (Eugene Koontz via phunt) - ZOOKEEPER-1046. Creating a new sequential node results in a ZNODEEXISTS error. (breed via camille) - - ZOOKEEPER-1097. Quota is not correctly rehydrated on snapshot reload (camille via henryr) - - ZOOKEEPER-1046. Small fix: Creating a new sequential node results in a ZNODEEXISTS error. (Vishal K via camille) - - ZOOKEEPER-782. Incorrect C API documentation for Watches. (mahadev via breed) - - ZOOKEEPER-1063. Dubious synchronization in Zookeeper and ClientCnxnSocketNIO classes (Yanick Dufresne via breed) - - ZOOKEEPER-1124. Multiop submitted to non-leader always fails due to timeout (Marshall McMullen via breed) - - ZOOKEEPER-1111. JMXEnv uses System.err instead of logging - (Ivan Kelly via phunt) - - ZOOKEEPER-1027. chroot not transparent in zoo_create() (Thijs Terlouw via - mahadev) - - ZOOKEEPER-1109. Zookeeper service is down when SyncRequestProcessor meets - any exception. (Laxman via mahadev) - - ZOOKEEPER-1134. ClientCnxnSocket string comparison using == rather than equals. - (phunt via mahadev) - - ZOOKEEPER-1119. zkServer stop command incorrectly reading comment lines in - zoo.cfg (phunt via mahadev) - - ZOOKEEPER-1090. Race condition while taking snapshot can lead to not restoring data tree correctly (Vishal K via breed) - - ZOOKEEPER-1138. release audit failing for a number of new files. (phunt via mahadev) - - ZOOKEEPER-1139. jenkins is reporting two warnings, fix these (phunt via mahadev) - - ZOOKEEPER-1142. incorrect stat output (phunt via mahadev) - - ZOOKEEPER-1144. ZooKeeperServer not starting on leader due to a race condition (Vishal K via camille) - - ZOOKEEPER-839. deleteRecursive does not belong to the other methods. - (mahadev) - - ZOOKEEPER-1146. significant regression in client (c/python) performance. - (phunt via mahadev) - - ZOOKEEPER-1150. fix for this patch to compile on windows. (dheeraj - via mahadev) - - ZOOKEEPER-1055. check for duplicate ACLs in addACL() and create(). - (Eugene Koontz via mahadev) - - ZOOKEEPER-1141. zkpython fails tests under python 2.4. (phunt via mahadev) - - ZOOKEEPER-1025. zkCli is overly sensitive to to spaces. (Laxman via camille) - - ZOOKEEPER-1117. zookeeper 3.3.3 fails to build with gcc >= 4.6.1 on - Debian/Ubuntu (James Page via mahadev) - - ZOOKEEPER-1140. server shutdown is not stopping threads. (laxman via mahadev) - - ZOOKEEPER-1051. SIGPIPE in Zookeeper 0.3.* when send'ing after - cluster disconnection (Stephen Tyree via mahadev) - - ZOOKEEPER-1168. ZooKeeper fails to run with IKVM (Andrew Finnell via phunt) - - ZOOKEEPER-1165. better eclipse support in tests (Warren Turkal via phunt) - - ZOOKEEPER-1154. Data inconsistency when the node(s) with the highest zxid is not present at the time of leader election. (Vishal Kathuria via camille) - - ZOOKEEPER-1156. Log truncation truncating log too much - can cause data loss. (Vishal Kathuria via camille) - - ZOOKEEPER-1160. test timeouts are too small (breed via phunt) - - ZOOKEEPER-731. Zookeeper#delete , #create - async versions miss a verb in the javadoc. (Thomas Koch via camille) - - ZOOKEEPER-1108. Various bugs in zoo_add_auth in C. (Dheeraj Agrawal via mahadev) - - ZOOKEEPER-981. Hang in zookeeper_close() in the multi-threaded C client. - (Jeremy Stribling via mahadev) - - ZOOKEEPER-1125. Intermittent java core test failures. (Vishar Kher via mahadev) - - ZOOKEEPER-961. Watch recovery after disconnection when connection string contains a prefix. - (Matthias Spycher via mahadev) - - ZOOKEEPER-1136. NEW_LEADER should be queued not sent to match the Zab 1.0 protocol - on the twiki (breed via mahadev) - - ZOOKEEPER-1189. For an invalid snapshot file(less than 10bytes size) RandomAccessFile - stream is leaking. (Rakesh R via mahadev) - - ZOOKEEPER-1185. Send AuthFailed event to client if SASL authentication fails. - (Eugene Kuntz via mahadev) - - ZOOKEEPER-1174. FD leak when network unreachable (Ted Dunning via camille) - - ZOOKEEPER-1203. Zookeeper systest is missing Junit Classes - (Prashant Gokhale via phunt) - - ZOOKEEPER-1206. Sequential node creation does not use always use - digits in node name given certain Locales. (Mark Miller via phunt) - - ZOOKEEPER-1212. zkServer.sh stop action is not conformat with LSB - para 20.2 Init Script Actions (Roman Shaposhnik via phunt) - - ZOOKEEPER-1190. ant package is not including many of the bin scripts - in the package (zkServer.sh for example) (Eric Yang via phunt) - - ZOOKEEPER-1181. Fix problems with Kerberos TGT renewal. - (Eugene Koontz via mahadev) - - ZOOKEEPER-1264. FollowerResyncConcurrencyTest failing intermittently. (phunt via camille) - - ZOOKEEPER-1268. problems with read only mode, intermittent test failures - and ERRORs in the log. (phunt via mahadev) - - ZOOKEEPER-1246. Dead code in PrepRequestProcessor catch Exception block. (camille) - - ZOOKEEPER-1271. testEarlyLeaderAbandonment failing on solaris - - clients not retrying connection (mahadev via phunt) - - ZOOKEEPER-1192. Leader.waitForEpochAck() checks waitingForNewEpoch instead - of checking electionFinished (Alexander Shraer via mahadev) - - ZOOKEEPER-1270. testEarlyLeaderAbandonment failing intermittently, - quorum formed, no serving. (Flavio, Camille and Alexander Shraer via mahadev) - - ZOOKEEPER-1264. FollowerResyncConcurrencyTest failing - intermittently. (breed, camille and Alex Shraer via camille) - - ZOOKEEPER-1282. Learner.java not following Zab 1.0 protocol - - setCurrentEpoch should be done upon receipt of NEWLEADER - (before acking it) and not upon receipt of UPTODATE (breed via camille) - - ZOOKEEPER-1291. AcceptedEpoch not updated at leader before it proposes the epoch to followers. (Alex Shraer via camille) - - ZOOKEEPER-1208. Ephemeral node not removed after the client session is long gone. (phunt via camille) - - ZOOKEEPER-1239. add logging/stats to identify fsync stalls. (phunt via camille) - - ZOOKEEPER-1299. Add winconfig.h file to ignore in release audit. (mahadev) - -IMPROVEMENTS: - ZOOKEEPER-724. Improve junit test integration - log harness information - (phunt via mahadev) - - ZOOKEEPER-766. forrest recipes docs don't mention the lock/queue recipe - implementations available in the release (phunt via mahadev) - - ZOOKEEPER-769: Leader can treat observers as quorum members - (Sergey Doroshenko via henryr) - - ZOOKEEPER-788: Add server id to message logs - (Ivan Kelly via flavio) - - ZOOKEEPER-789. Improve FLE log messages (flavio via phunt) - - ZOOKEEPER-798. Fixup loggraph for FLE changes (Ivan Kelly via phunt) - - ZOOKEEPER-797 c client source with AI_ADDRCONFIG cannot be compiled with - early glibc (Qian Ye via phunt) - - ZOOKEEPER-790. Last processed zxid set prematurely while establishing leadership - (fpj via breed) - - ZOOKEEPER-821. Add ZooKeeper version information to zkpython (Rich - Schumacher via mahadev) - - ZOOKEEPER-765. Add python example script (Travis and Andrei via mahadev) - - ZOOKEEPER-809. Improved REST Interface (Andrei Savu via phunt) - - ZOOKEEPER-733. use netty to handle client connections (breed and phunt) - - ZOOKEEPER-853. Make zookeeper.is_unrecoverable return True or False - in zkpython (Andrei Savu via henryr) - - ZOOKEEPER-864. Hedwig C++ client improvements (Ivan Kelly via breed) - - ZOOKEEPER-862. Hedwig created ledgers with hardcoded Bookkeeper ensemble and - quorum size. Make these a server config parameter instead. (Erwin T via breed) - - ZOOKEEPER-926. Fork Hadoop common's test-patch.sh and modify for Zookeeper. - (nigel) - - ZOOKEEPER-909. Extract NIO specific code from ClientCnxn - (Thomas Koch via phunt) - - ZOOKEEPER-908. Remove code duplication and inconsistent naming in - ClientCnxn.Packet creation (Thomas Koch via phunt) - - ZOOKEEPER-836. hostlist as string. (Thomas Koch via breed) - - ZOOKEEPER-921. zkPython incorrectly checks for existence of required - ACL elements (Nicholas Knight via henryr) - - ZOOKEEPER-963. Make Forrest work with JDK6 (Carl Steinbach via henryr) - - ZOOKEEPER-500. Async methods shouldnt throw exceptions (fpj via breed) - - ZOOKEEPER-977. passing null for path_buffer in zoo_create (breed via mahadev) - - ZOOKEEPER-465. Ledger size in bytes. (flavio via mahadev) - - ZOOKEEPER-980. allow configuration parameters for log4j.properties - (phunt via mahadev) - - ZOOKEEPER-1042. Generate zookeeper test jar for maven installation - (ivan kelly via breed) - - ZOOKEEPER-1030: Increase default for maxClientCnxns - (Todd Lipcon via breed/mahadev/phunt) - - ZOOKEEPER-850: Switch from log4j to slf4j (Olaf Krische via michim) - - ZOOKEEPER-874. FileTxnSnapLog.restore does not call listener (diogo via fpj) - - ZOOKEEPER-1052. Findbugs warning in QuorumPeer.ResponderThread.run() (fpj via michim) - - ZOOKEEPER-1094. Small improvements to LeaderElection and Vote classes (henryr via breed) - - ZOOKEEPER-1074. zkServer.sh is missing nohup/sleep, which are necessary - for remote invocation. (phunt via mahadev) - - ZOOKEEPER-965. Need a multi-update command to allow multiple znodes to be updated safely (Marshall McMullen and Ted Dunning via breed) - - ZOOKEEPER-1073. address a documentation issue in ZOOKEEPER-1030. (phunt via mahadev) - - ZOOKEEPER-1095. Simple leader election recipe - (Eric Sammer via henry and phunt) - - ZOOKEEPER-1076. some quorum tests are unnecessarily extending QuorumBase (phunt via mahadev) - - ZOOKEEPER-1143. quorum send & recv workers are missing thread names - (phunt via mahadev) - - ZOOKEEPER-1104. CLONE - In QuorumTest, use the same "for ( .. try { break } - catch { } )" pattern in testFollowersStartAfterLeaders as in testSessionMove. - (Eugene Koontz via mahadev) - - ZOOKEEPER-1034. perl bindings should automatically find the zookeeper - c-client headers (nicholas harteau via mahadev) - - ZOOKEEPER-1166. Please add a few svn:ignore properties (via phunt) - - ZOOKEEPER-1169. Fix compiler (eclipse) warnings in (generated) jute - code (Thomas Koch via phunt) - - ZOOKEEPER-1171. fix build for java 7 (phunt via mahadev) - - ZOOKEEPER-1201. Clean SaslServerCallbackHandler.java. (Thomas Koch - via mahadev) - - ZOOKEEPER-1321. Add number of client connections metric in JMX and srvr. (Neha Narkhede via camille) - -NEW FEATURES: - ZOOKEEPER-729. Java client API to recursively delete a subtree. - (Kay Kay via henry) - - ZOOKEEPER-747. Add C# generation to Jute (Eric Hauser via phunt) - - ZOOKEEPER-464. Need procedure to garbage collect ledgers - (erwin via fpj) - - ZOOKEEPER-773. Log visualisation (Ivan Kelly via phunt) - - ZOOKEEPER-744. Add monitoring four-letter word (Andrei Savu via phunt) - - ZOOKEEPER-712. Bookie recovery. (erwin tam via breed) - - ZOOKEEPER-799. Add tools and recipes for monitoring as a contrib - (Andrei Savu via phunt) - - ZOOKEEPER-808. Web-based Administrative Interface - (Andrei Savu via phunt) - - ZOOKEEPER-775. A large scale pub/sub system (Erwin, Ivan and Ben via - mahadev) - - ZOOKEEPER-1020. Implement function in C client to determine which host you're currently connected to. (stephen tyree via breed) - - ZOOKEEPER-1038. Move bookkeeper and hedwig code in subversion (breed) - - ZOOKEEPER-784. Server-side functionality for read-only mode (Sergey Doroshenko via henryr) - - ZOOKEEPER-992. MT Native Version of Windows C Client (Dheeraj Agrawal via michim) - - ZOOKEEPER-938. Support Kerberos authentication of clients. (Eugene Koontz - via mahadev) - - ZOOKEEPER-1152. Exceptions thrown from handleAuthentication can cause buffer corruption issues in NIOServer. (camille via breed) - - ZOOKEEPER-999. Create an package integration project (Eric Yang via phunt) - - ZOOKEEPER-1107. automating log and snapshot cleaning (Laxman via phunt) - -DEPRECATION: - ZOOKEEPER-1153. Deprecate AuthFLE and LE. (Flavio Junqueira via mahadev) - -Release 3.3.0 - 2010-03-24 - -Non-backward compatible changes: - -BUGFIXES: - -Backward compatible changes: - -BUGFIXES: - ZOOKEEPER-59. Synchronized block in NIOServerCnxn (fpj via breed) - - ZOOKEEPER-524. DBSizeTest is not really testing anything (breed) - - ZOOKEEPER-469. make sure CPPUNIT_CFLAGS isn't overwritten - (chris via mahadev) - - ZOOKEEPER-471. update zkperl for 3.2.x branch (chris via mahadev) - - ZOOKEEPER-470. include unistd.h for sleep() in c tests (chris via mahadev) - - ZOOKEEPR-460. bad testRetry in cppunit tests (hudson failure) - (giri via mahadev) - - ZOOKEEPER-467. Change log level in BookieHandle. (flavio via mahadev) - - ZOOKEEPER-482. ignore sigpipe in testRetry to avoid silent immediate - failure. (chris via mahadev) - - ZOOKEEPER-487. setdata on root (/) crashes the servers (mahadev via phunt) - - ZOOKEEPER-457. Make ZookeeperMain public, support for HBase (and other) - embedded clients (ryan rawson via phunt) - - ZOOKEEPER-481. Add lastMessageSent to QuorumCnxManager. (flavio via mahadev) - - ZOOKEEPER-479. QuorumHierarchical does not count groups correctly - (flavio via mahadev) - - ZOOKEEPER-466. crash on zookeeper_close() when using auth with empty cert - (Chris Darroch via phunt) - - ZOOKEEPER-480. FLE should perform leader check when node is not leading and - add vote of follower (flavio via mahadev) - - ZOOKEEPER-491. Prevent zero-weight servers from being elected. - (flavio via mahadev) - - ZOOKEEPER-447. zkServer.sh doesn't allow different config files to be - specified on the command line (henry robinson via phunt) - - ZOOKEEPER-493. patch for command line setquota (steve bendiola via phunt) - - ZOOKEEPER-311. handle small path lengths in zoo_create() - (chris barroch via breed) - - ZOOKEEPER-484. Clients get SESSION MOVED exception when switching from - follower to a leader. (mahadev) - - ZOOKEEPER-490. the java docs for session creation are misleading/incomplete - (phunt) - - ZOOKEEPER-501. CnxManagerTest failed on hudson. (flavio via mahadev) - - ZOOKEEPER-499. electionAlg should default to FLE (3) - regression - (phunt via mahadev) - - ZOOKEEPER-477. zkCleanup.sh is flaky (fernando via mahadev) - - ZOOKEEPER-498. Unending Leader Elections : WAN configuration - (flavio via mahadev) - - ZOOKEEPER-508. proposals and commits for DIFF and Truncate messages from the - leader to the followers is buggy. (mahadev and ben via mahadev) - - ZOOKEEPER-518. DEBUG message for outstanding proposals in leader should be - moved to trace. (phunt) - - ZOOKEEPER-533. ant error running clean twice (phunt via mahadev) - - ZOOKEEPER-535. ivy task does not enjoy being defined twice - (build error) (phunt via mahadev) - - ZOOKEEPER-420. build/test should not require install in zkpython - (henry robinson via phunt) - - ZOOKEEPER-538. zookeeper.async causes python to segfault - (henry robinson via phunt) - - ZOOKEEPER-542. c-client can spin when server unresponsive (Christian - Wiedmann via mahadev) - - ZOOKEEEPER-510. zkpython lumps all exceptions as IOError, needs specialized - exceptions for KeeperException types (henry & pat via mahadev) - - ZOOKEEPER-541. zkpython limited to 256 handles (henry robinson via phunt) - - ZOOKEEPER-554. zkpython can segfault when statting a deleted node - (henry robinson via phunt) - - ZOOKEEPER-512. FLE election fails to elect leader (flavio via mahadev) - - ZOOKEEPER-563. ant test for recipes is broken. (mahadev via phunt) - - ZOOKEEPER-562. c client can flood server with pings if tcp send queue - filled. (ben reed via mahadev) - - ZOOKEEPER-537. The zookeeper jar includes the java source files - (Thomas Dudziak via phunt) - - ZOOKEEPER-551. unnecessary SetWatches message on new session. - (phunt via flavio) - - ZOOKEEPER-566. "reqs" four letter word (command port) returns no information - (phunt via breed) - - ZOOKEEPER-567. javadoc for getchildren2 needs to mention "new in 3.3.0" - (phunt via breed) - - ZOOKEEPER-547. Sanity check in QuorumCnxn Manager and quorum communication - port. (mahadev via breed) - - ZOOKEEPER-532. java compiler should be target Java 1.5 - (hiram chirino and phunt via breed) - - ZOOKEEPER-519. Followerhandler should close the socket if it gets an exception - on a write. (mahadev via breed) - - ZOOKEEPER-570. AsyncHammerTest is broken, callbacks need to validate rc - parameter (phunt via breed) - - ZOOKEEPER-3. syncLimit has slightly different comments in the class header, - and > inline with the variable. (mahadev via breed) - - ZOOKEEPER-576. docs need to be updated for session moved exception and how - to handle it (breed via phunt) - - ZOOKEEPER-582. ZooKeeper can revert to old data when a snapshot is created - outside of normal processing (ben reed and mahadev via mahadev) - - ZOOKEEPER-597. ASyncHammerTest is failing intermittently on hudson trunk - (Patrick Hunt via mahadev) - - ZOOKEEPER-598. LearnerHandler is misspelt in the thread's constructor - (Henry Robinson via fpj) - - ZOOKEEPER-597. ASyncHammerTest is failing intermittently on hudson trunk (take 2) - (breed) - - ZOOKEEPER-597. ASyncHammerTest is failing intermittently on hudson trunk - (take 3) (phunt via mahadev) - - ZOOKEEPER-597. ASyncHammerTest is failing intermittently on hudson trunk - (take 4) (breed via mahadev) - - ZOOKEEPER-597. ASyncHammerTest is failing intermittently on hudson trunk - (take 5) (mahadev) - - ZOOKEEPER-611. hudson build failiure (mahadev) - - ZOOKEEPER-611. hudson build failure (take 2) (mahadev) - - ZOOKEEPER-615. wrong javadoc for create with a sequence flag - (mahadev via breed) - - ZOOKEEPER-588. remove unnecessary/annoying log of tostring error in - Request.toString() (phunt via breed) - - ZOOKEEPER-587. client should log timeout negotiated with server - (phunt via mahadev) - - ZOOKEEPER-610. cleanup final fields, esp those used for locking - (phunt via henry) - - ZOOKEEPER-614. Improper synchronisation in getClientCnxnCount - (henry via mahadev) - - ZOOKEEPER-609. ObserverTest failure "zk should not be connected expected not - same" (henry robinson via phunt) - - ZOOKEEPER-630. Trunk has duplicate ObserverTest.java files - (henry robinson via phunt) - - ZOOKEEPER-627. zkpython arbitrarily restricts the size of a 'get' to 512 - bytes (henry robinson via mahadev) - - ZOOKEEPER-534. The test target in contib/bookkeeper does not depend on jar - target. (phunt via mahadev) - - ZOOKEEPER-623. ClientBase in bookkeeper.util requires junit (fpj via breed) - - ZOOKEEPER-600. TODO pondering about allocation behavior in zkpython may be - removed (gustavo via mahadev) - - ZOOKEEPER-596. The last logged zxid calculated by zookeeper servers could - cause problems in leader election if data gets corrupted. (mahadev) - - ZOOKEEPER-637. Trunk build is failing (fpj via breed) - - ZOOKEEPER-637. Trunk build is failing - second patch (breed via fpj) - - ZOOKEEPER-644. Nightly build failed on hudson. (pat via mahadev) - - ZOOKEEPER-651: Log exception trace in QuorumCnxManager.SendWorker - (flavio via henry) - - ZOOKEEPER-608. Receipt of ACK from observer should not be logged as ERROR - (henry via mahadev) - - ZOOKEEPER-647. hudson failure in testLeaderShutdown (flavio via mahadev) - - ZOOKEEPER-574. the documentation on snapcount in the admin guide has the - wrong default (phunt via mahadev) - - ZOOKEEPER-656. SledgeHammer test - thread.run() deprecated (kay kay via mahadev) - - ZOOKEEPER-413. two flaws need addressing in the c tests that can cause false - positive failures (phunt via mahadev) - - ZOOKEEPER-495. c client logs an invalid error when zookeeper_init is called - with chroot (phunt via mahadev) - - ZOOKEEPER-589. When create a znode, a NULL ACL parameter cannot be accepted. - (breed via mahadev) - - ZOOKEEPER-673. Fix observer documentation regarding leader election (flavio - via mahadev) - - ZOOKEEPER-672. typo nits across documentation (Kay Kay via mahadev) - - ZOOKEEPER-668. Close method in LedgerInputStream doesn't do anything (flavio - via mahadev) - - ZOOKEEPER-569. Failure of elected leader can lead to never-ending leader - election (henry via flavio) - - ZOOKEEPER-669. watchedevent tostring should clearly output the - state/type/path (phunt via mahadev) - - ZOOKEEPER-683. LogFormatter fails to parse transactional log files (phunt - via mahadev) - - ZOOKEEPER-682. Event is not processed when the watcher is set to watch "/" - if chrooted (Scott Wang via mahadev) - - ZOOKEEPER-687. LENonterminatetest fails on some machines. (mahadev) - - ZOOKEEPER-681. Minor doc issue re unset maxClientCnxns (phunt via mahadev) - - ZOOKEEPER-622. Test for pending watches in send_set_watches should be moved - (ben and steven via mahadev) - - ZOOKEEPER-689. release build broken - ivysettings.xml not copied during - "package" (phunt via mahadev) - - ZOOKEEPER-59. Synchronized block in NIOServerCnxn (flavio via mahadev) - - ZOOKEEPER-691. Interface changed for NIOServer.Factory (breed via mahadev) - - ZOOKEEPER-685. Race in LENonTerminateTest (henry via breed) - - ZOOKEEPER-677. c client doesn't allow ipv6 numeric connect string - (breed & phunt & mahadev via breed) - - ZOOKEEPER-693. TestObserver stuck in tight notification loop in FLE - (flavio via phunt) - - ZOOKEEPER-696. NPE in the hudson logs, seems nioservercnxn closed twice - (phunt via mahadev) - - ZOOKEEPER-511. bad error handling in FollowerHandler.sendPackets - (mahadev via flavio) - - ZOOKEEPER-604. zk needs to prevent export of any symbol not listed in their - api (mahadev) - - ZOOKEEPER-121. SyncRequestProcessor is not closing log stream during - shutdown (mahadev) - - ZOOKEEPER-698. intermittent JMX test failures due to not verifying QuorumPeer - shutdown (phunt) - - ZOOKEEPER-121_2. SyncRequestProcessor is not closing log stream during - shutdown (breed via mahadev) - - ZOOKEEPER-121_3. SyncRequestProcessor is not closing log stream during - shutdown (mahadev via phunt) - - ZOOKEEPER-121_4. SyncRequestProcessor is not closing log stream during - shutdown (mahadev via breed) - - ZOOKEEPER-586. c client does not compile under cygwin (phunt, mahadev, breed via breed) - - ZOOKEEPER-624. The C Client cause core dump when receive error data from - Zookeeper Server (mahadev) - - ZOOKEEPER-591. The C Client cannot exit properly in some situation (mahadev) - - ZOOKEEPER-591_2. The C Client cannot exit properly in some situation - (mahadev via phunt) - - ZOOKEEPER-709. bookkeeper build failing with missing factory - (phunt) - - ZOOKEEPER-708. zkpython failing due to undefined symbol - deallocate_String_vector (mahadev via phunt) - - ZOOKEEPER-436. Bookies should auto register to ZooKeeper (erwin tam & fpj via breed) - - ZOOKEEPER-710. permanent ZSESSIONMOVED error after client app reconnects to zookeeper cluster (phunt via breed) - - ZOOKEEPER-718. the fatjar is missing libraries (ben via mahadev) - - ZOOKEEPER-717. add a preferred list to the instancemanager (breed via - mahadev) - -IMPROVEMENTS: - ZOOKEEPER-473. cleanup junit tests to eliminate false positives due to - "socket reuse" and failure to close client (phunt via mahadev) - - ZOOKEEPER-488. Fix zkServer.sh to add clover.jar in classpath - (Giridharan Kesavan via gkesavan) - - ZOOKEEPER-516. add support for 10 minute test ie "pre-commit" test (phunt) - - ZOOKEEPER-529. Use Ivy to pull dependencies and also generate pom (phunt - via mahadev) - - ZOOKEEPER-530. Memory corruption: Zookeeper c client IPv6 implementation - does not honor struct sockaddr_in6 size (isabel drost via mahadev) - - ZOOKEEPER-549. Refactor Followers and related classes into a Peer->Follower - hierarchy in preparation for Observers (henry robinson via mahadev) - - ZOOKEEPER-472. Making DataNode not instantiate a HashMap when the node is - ephmeral (Erik Holstad via mahadev) - - ZOOKEEPER-425. Add OSGi metadata to zookeeper.jar (david bosschaert via breed) - - ZOOKEEPER-599. Changes to FLE and QuorumCnxManager to support Observers - (fpj via breed) - - ZOOKEEPER-506. QuorumBase should use default leader election (fpj via breed) - - ZOOKEEPER-633. Fetch netty using ivy for bookkeeper (giri via fpj) - - ZOOKEEPER-544. improve client testability - allow test client to access - connected server location (phunt via breed) - - ZOOKEEPER-426. Windows versions of zookeeper scripts - (David Bosschaert via breed) - - ZOOKEEPER-638. upgrade ivy to 2.1.0 final from 2.1.0 release - candidate (phunt via breed) - - ZOOKEEPER-648. Fix releaseaudit warning count to zero (phunt via henry) - - ZOOKEEPER-626. ensure the c/java cli's print xid/sessionid/etc... in hex - (pat via mahadev) - - ZOOKEEPER-655. StringBuffer -> StringBuilder - conversion of references as - necessary (Kay Kay via henry) - - ZOOKEEPER-612. Make Zookeeper C client can be compiled by gcc of early - version (qian via mahadev) - - ZOOKEEPER-456. CREATOR_ALL_ACL has unnecessary PERMS.ADMIN in the - declartion. (phunt via mahadev) - - ZOOKEEPER-593. java client api does not allow client to access negotiated - session timeout (phunt via mahadev) - - ZOOKEEPER-507. BookKeeper client re-write (Utkarsh and ben via mahadev) - - ZOOKEEPER-665. Add BookKeeper streaming documentation (flavio via mahadev) - - ZOOKEEPER-664. BookKeeper API documentation (flavio via mahadev) - - ZOOKEEPER-607. improve bookkeeper overview (flavio via mahadev) - - ZOOKEEPER-485. Need ops documentation that details supervision of ZK server - processes. (phunt via mahadev) - - ZOOKEEPER-658. update forrest docs - AuthFLE no longer supported (flavio via - mahadev) - - ZOOKEEPER-640. make build.xml more configurable to ease packaging for linux - distros (phunt via mahadev) - - ZOOKEEPER-579. zkpython needs more test coverage for ACL code paths (henry - via mahadev) - - ZOOKEEPER-688. explain session expiration better in the docs & faq (phunt - via mahadev) - - ZOOKEEPER-663. hudson failure in ZKDatabaseCorruptionTest (mahadev via henryr) - - ZOOKEEPER-543. Tests for ZooKeeper examples (steven via mahadev) - - ZOOKEEPER-692. upgrade junit to latest version (4.8.1) (phunt via mahadev) - - ZOOKEEPER-601. allow configuration of session timeout min/max bounds (phunt - via mahadev) - -NEW FEATURES: - ZOOKEEPER-539. generate eclipse project via ant target. (phunt via mahadev) - - ZOOKEEPER-555. Add stat information to GetChildrenResponse. (Arni Jonson and - phunt via mahadev) - - ZOOKEEPER-550. Java Queue Recipe. (steven cheng via mahadev) - - ZOOKEEPER-368. Observers: core functionality (henry robinson via mahadev) - - ZOOKEEPER-496. zookeeper-tree utility for export, import and incremental - updates (anirban roy via breed) - - ZOOKEEPER-572. add ability for operator to examine state of watches - currently registered with a server (phunt via mahadev) - - ZOOKEEPER-678. Gui browser application to view and edit the contents of a - zookeeper instance (Colin Goodheart-Smithe via phunt) - - ZOOKEEPER-635. Server supports listening on a specified network address (phunt via breed) - -Release 3.2.0 - 2009-06-30 - -Non-backward compatible changes: - -BUGFIXES: - ZOOKEEPER-444. perms definition for PERMS_ALL differ in C and java (mahadev) - -Backward compatible changes: - -BUGFIXES: - ZOOKEEPER-303. Bin scripts dont work on a Mac. (tom white via mahadev) - - ZOOKEEPER-330. zookeeper standalone server does not startup with just a - port and datadir. (chris darroch and mahadev) - - ZOOKEEPER-319. add locking around auth info in zhandle_t. - (chris darroch via mahadev) - - ZOOKEEPER-320. call auth completion in free_completions(). - (chris darroch via mahadev) - - ZOOKEEPER-334. bookkeeper benchmark (testclient.java) has compiling errors. - (flavio and mahadev) - - ZOOKEEPER-281. autoreconf fails for /zookeeper-3.0.1/src/c/ (phunt) - - ZOOKEEPER-318. remove locking in zk_hashtable.c or add locking in - collect_keys() (chris darroch via mahadev) - - ZOOKEEPER-333. helgrind thread issues identified in mt c client code - (mahadev via phunt) - - ZOOKEEPER-309. core dump using zoo_get_acl() (mahadev via phunt) - - ZOOKEEPER-341. regression in QuorumPeerMain, - tickTime from config is lost, cannot start quorum (phunt via mahadev) - - ZOOKEEPER-360. WeakHashMap in Bookie.java causes NPE (flavio via mahadev) - - ZOOKEEPER-362. Issues with FLENewEpochTest. (fix bug in Fast leader election) - (flavio via mahadev) - - ZOOKEEPER-363. NPE when recovering ledger with no hint. (flavio via mahadev) - - ZOOKEEPER-370. Fix critical problems reported by findbugs. - (flavio via mahadev) - - ZOOKEEPER-347. zkfuse uses non-standard String. (patrick hunt via mahadev) - - ZOOKEEPER-355. make validatePath non public in Zookeeper client api. - (phunt via mahadev) - - ZOOKEEPER-374. Uninitialized struct variable in C causes warning which - is treated as an error (phunt via mahadev) - - ZOOKEEPER-337. improve logging in leader election lookForLeader method when - address resolution fails (phunt via mahadev) - - ZOOKEEPER-367. RecoveryTest failure - "unreasonable length" IOException - (mahadev via phunt) - - ZOOKEEPER-346. remove the kill command fro mthe client port. - (phunt via mahadev) - - ZOOKEEPER-377. running ant cppunit tests, a failure still results in - BUILD SUCCESSFUL (giri via mahadev) - - ZOOKEEPER-382. zookeeper cpp tests fails on 64 bit machines with gcc 4.1.2 - (mahadev via phunt) - - ZOOKEEPER-365. javadoc is wrong for setLast in LedgerHandle - (flavio via phunt) - - ZOOKEEPER-392. Change log4j properties in bookkeeper. (flavio via mahadev) - - ZOOKEEPER-400. Issues with procedure to close ledger. (flavio) - - ZOOKEEPER-405. nullpointer exception in zookeeper java shell. - (mahadev via breed) - - ZOOKEEPER-410. address all findbugs warnings in client/server classes. - (phunt via breed) - - ZOOKEEPER-403. cleanup javac compiler warnings. (flavio via breed) - - ZOOKEEPER-407. address all findbugs warnings in - org.apache.zookeeper.server.quorum.** packages. - (flavio via breed) - - ZOOKEEPER-411. Building zookeeper fails on RHEL 5 64 bit during test-cppunit - (mahadev via phunt) - - ZOOKEEPER-402. zookeeper c library segfaults on data for a node in zookeeper - being null. (mahadev via phunt) - - ZOOKEEPER-415. zookeeper c tests hang. (mahadev via phunt) - - ZOOKEEPER-385. crctest failed on hudson patch test (mahadev via phunt) - - ZOOKEEPER-192. trailing whitespace in config file can cause number format - exceptions (phunt via breed) - - ZOOKEEPER-409. address all findbugs warnings in jute related classes - (phunt via breed) - - ZOOKEEPER-416. bookkeeper jar includes unnnecessary files. - (flavio via mahadev) - - ZOOKEEPER-419. Reference counting bug in Python bindings causes abort errors - (henry robinson via phunt) - - ZOOKEEPER-421. zkpython run_tests.sh is missing #! - (henry robinson via phunt) - - ZOOKEEPER-406. address all findbugs warnings in persistence classes. - (phunt et al via breed) - - ZOOKEEPER-435. allow "super" admin digest based auth to be configurable - (phunt via breed) - - ZOOKEEPER-375. zoo_add_auth only retains most recent auth on re-sync. - (mahadev) - - ZOOKEEPER-433. getacl on root znode (/) fails. (phunt via mahadev) - - ZOOKEEPER-408. address all findbugs warnings in persistence classes. - (phunt, mahadev, flavio via mahadev) - - ZOOKEEPER-427. ZooKeeper server unexpectedly high CPU utilisation - (Sergey Zhuravlev via breed) - - ZOOKEEPER-446. some traces of the host auth scheme left (breed via mahadev) - - ZOOKEEPER-438. addauth fails to register auth on new client that's not yet - connected (breed via mahadev) - - ZOOKEEPER-448. png files do nto work with forrest. (mahadev) - - ZOOKEEPER-417. stray message problem when changing servers - (breed via mahadev) - - ZOOKEEPER-449. sesssionmoved in java code and ZCLOSING in C have the same - value. (mahadev) - - ZOOKEEPER-452. zookeeper performance graph should have percentage of reads - rather than percentage of writes - zkperfRW-3.2.jpg (mahadev) - - ZOOKEEPER-450. emphemeral cleanup not happening with session timeout. - (breed via mahadev) - - ZOOKEEPER-453. Worker is not removed in QuorumCnxManager upon crash. - (flavio via mahadev) - - ZOOKEEPER-454. allow compilation with jdk1.5 (phunt) - - ZOOKEEPER-455. zookeeper c client crashes with chroot specified in the string. - (phunt via mahadev) - - ZOOKEEPER-468. avoid compile warning in send_auth_info(). - -IMPROVEMENTS: - ZOOKEEPER-308. improve the atomic broadcast performance 3x. - (breed via mahadev) - - ZOOKEEPER-326. standalone server ignores tickTime configuration. - (chris darroch via mahadev) - - ZOOKEEPER-279. Allow specialization of quorum config parsing - (e.g. variable expansion in zoo.cfg) (Jean-Daniel Cryans via phunt) - - ZOOKEEPER-351. to run checkstyle (giridharan kesavan via mahadev) - - ZOOKEEPER-350. to run rats for releaseaudit. - (giridharan kesavan via mahadev) - - ZOOKEEPER-352. to add standard ant targets required by test-patch.sh script - (giridharan kesavan via mahadev) - - ZOOKEEPER-353. javadoc warnings needs to be fixed. - (giridharan kesavan via mahadev) - - ZOOKEEPER-354. to fix javadoc warning in the source files. (mahadev) - - ZOOKEEPER-349. to automate patch testing. (giridharan kesavan via mahadev) - - ZOOKEEPER-288. Cleanup and fixes to BookKeeper (flavio via mahadev) - - ZOOKEEPER-305. Replace timers with semaphores in FLENewEpochTest. - (flavio via mahadev) - - ZOOKEEPER-60. Get cppunit tests running as part of Hudson CI. - (girish via mahadev) - - ZOOKEEPER-343. add tests that specifically verify the zkmain and - qpmain classes. (phunt via mahadev) - - ZOOKEEPER-361. integrate cppunit testing as part of hudson patch process. - (giri via mahadev) - - ZOOKEEPER-373. One thread per bookie (flavio via mahadev) - - ZOOKEEPER-384. keeper exceptions missing path (phunt via mahadev) - - ZOOKEEPER-380. bookkeeper should have a streaming api so that its easier to - store checpoints/snapshots in bookkeeper. (mahadev via flavio) - - ZOOKEEPER-389. add help/usage to the c shell cli.c (phunt via mahadev) - - ZOOKEEPER-376. ant test target re-compiles cppunit code every time - (phunt via mahadev) - - ZOOKEEPER-391. bookeeper mainline code should not be calling - printStackTrace. (flavio via mahadev) - - ZOOKEEPER-300. zk jmx code is calling printStackTrace when creating bean - name (should not be) (phunt via mahadev) - - ZOOKEEPER-94. JMX tests are needed to verify that the JMX MBeans work - properly (phunt via mahadev) - - ZOOKEEPER-404. nightly build failed on hudson. - (henry robinson and pat via mahadev) - - ZOOKEEPER-345. the CLIs should allow addAuth to be invoked. - (henry robinson via breed) - - ZOOKEEPER-292. commit configure scripts (autotools) to svn for c projects and - include in release (phunt via breed) - - ZOOKEEPER-383. Asynchronous version of createLedger(). (flavio via mahadev) - - ZOOKEEPER-358. Throw exception when ledger does not exist. (flavio via breed) - - ZOOKEEPER-431. Expose methods to ease ZK integration. (Jean-Daniel via breed) - - ZOOKEEPER-396. race condition in zookeeper client library between - zookeeper_close and zoo_synchronous api. (mahadev) - - ZOOKEEPER-196. doxygen comment for state argument of watcher_fn typedef and - implementation differ ("...one of the *_STATE constants, otherwise -1") - (breed via mahadev) - - ZOOKEEPER-336. single bad client can cause server to stop accepting - connections (henry robinson via breed) - - ZOOKEEPER-434. the java shell should indicate connection status on command - prompt (henry robinson via breed) - - ZOOKEEPER-437. Variety of Documentation Updates (grant via mahadev) - - ZOOKEEPER-443. trace logging in watch notification not wrapped with - istraceneabled - inefficient (pat via mahadev) - - ZOOKEEPER-432. Various improvements to zkpython bindings. - (henry via mahadev) - - ZOOKEEPER-428. logging should be makred as warn rathen than error in - NIOServerCnxn. (phunt via mahadev) - - ZOOKEEPER-422. Java CLI should support ephemeral and sequential node creation - (henry via breed) - - ZOOKEEPER-315. add forrest docs for bookkeeper. (flavio via mahadev) - - ZOOKEEPER-329. document how to integrate 3rd party authentication into ZK - server ACLs. (breed via mahadev) - - ZOOKEEPER-356. Masking bookie failure during writes to a ledger - (flavio via breed) - - ZOOKEEPER-327. document effects (latency) of storing large amounts of data - in znodes. (breed via mahadev) - - ZOOKEEPER-264. docs should include a state transition diagram for client - state (breed via mahadev) - - ZOOKEEPER-440. update the performance documentation in forrest - (breed via phunt) - -NEW FEATURES: - - ZOOKEEPER-371. jdiff documentation included in build/release (giri via phunt) - - ZOOKEEPER-78. added a high level protocol/feature - for easy Leader - Election or exclusive Write Lock creation (mahadev via phunt) - - ZOOKEEPER-29. Flexible quorums (flavio via mahadev) - - ZOOKEEPER-378. perl binding for zookeeper (chris darroch via mahadev) - - ZOOKEEPER-386. improve java cli shell. (henry robinson via mahadev) - - ZOOKEEPER-36. REST access to ZooKeeper (phunt via mahadev) - - ZOOKEEPER-395. Python bindings. (henry robinson via mahadev) - - ZOOKEEPER-237. Add a Chroot request (phunt and mahadev) - - -Release 3.1.0 - 2009-02-06 - -Non-backward compatible changes: - -BUGFIXES: - - ZOOKEEPER-255. zoo_set() api does not return stat datastructure. - (avery ching via mahadev) - - ZOOKEEPER-246. review error code definition in both source and docs. - (pat via mahadev) - -Backward compatible changes: - -BUGFIXES: - ZOOKEEPER-211. Not all Mock tests are working (ben via phunt) - - ZOOKEEPER-223. change default level in root logger to INFO. - (pat via mahadev) - - ZOOKEEPER-212. fix the snapshot to be asynchronous. (mahadev and ben) - - ZOOKEEPER-213. fix programmer guide C api docs to be in sync with latest - zookeeper.h (pat via mahadev) - - ZOOKEEPER-219. fix events.poll timeout in watcher test to be longer. - (pat via mahadev) - - ZOOKEEPER-217. Fix errors in config to be thrown as Exceptions. (mahadev) - - ZOOKEEPER-228. fix apache header missing in DBTest. (mahadev) - - ZOOKEEPER-218. fix the error in the barrier example code. (pat via mahadev) - - ZOOKEEPER-206. documentation tab should contain the version number and - other small site changes. (pat via mahadev) - - ZOOKEEPER-226. fix exists calls that fail on server if node has null data. - (mahadev) - - ZOOKEEPER-204. SetWatches needs to be the first message after auth - messages to the server (ben via mahadev) - - ZOOKEEPER-208. Zookeeper C client uses API that are not thread safe, - causing crashes when multiple instances are active. - (austin shoemaker, chris daroch and ben reed via mahadev) - - ZOOKEEPER-227. gcc warning from recordio.h (chris darroch via mahadev) - - ZOOKEEPER-232. fix apache licence header in TestableZookeeper (mahadev) - - ZOOKEEPER-249. QuorumPeer.getClientPort() always returns -1. - (nitay joffe via mahadev) - - ZOOKEEPER-248. QuorumPeer should use Map interface instead of HashMap - implementation. (nitay joffe via mahadev) - - ZOOKEEPER-241. Build of a distro fails after clean target is run. - (patrick hunt via mahadev) - - ZOOKEEPER-245. update readme/quickstart to be release tar, rather than - source, based (patrick hunt via mahadev) - - ZOOKEEPER-251. NullPointerException stopping and starting Zookeeper servers - (mahadev via phunt) - - ZOOKEEPER-250. isvalidsnapshot should handle the case of 0 snapshot - files better. (mahadev via phunt) - - ZOOKEEPER-265. remove (deprecate) unused NoSyncConnected from KeeperState. - (phunt via mahadev) - - ZOOKEEPER-273. Zookeeper c client build should not depend on CPPUNIT. (pat -and runping via mahadev) - - ZOOKEEPER-268. tostring on jute generated objects can cause NPE. (pat via mahadev) - - ZOOKEEPER-267. java client incorrectly generating syncdisconnected event when in disconnected state. (pat via breed) - - ZOOKEEPER-263. document connection host:port as comma separated list in forrest docs (pat via breed) - - ZOOKEEPER-275. Bug in FastLeaderElection. (flavio via mahadev) - - ZOOKEEPER-272. getchildren can fail for large number of children. (mahadev) - - ZOOKEEPER-16. Need to do path validation. (pat, mahadev) - - ZOOKEEPER-252. PurgeTxnLog is not handling the new dataDir directory - structure (mahadev via phunt) - - ZOOKEEPER-291. regression for legacy code using KeeperException.Code - constants (due to 246). (pat via mahadev) - - ZOOKEEPER-255. zoo_set() api does not return stat datastructure. - (avery ching via mahadev) - - ZOOKEEPER-293. zoo_set needs to be abi compatible (3.1 changed the -signature), fix this by adding zoo_set2 (pat via mahadev) - - ZOOKEEPER-302. Quote values in JMX objectnames. (tom and pat via mahadev) - -IMPROVEMENTS: - - ZOOKEEPER-64. Log system env information when initializing server and - client (pat via mahadev) - - ZOOKEEPER-243. add SEQUENCE flag documentation to the programming guide. - (patrick hunt via mahadev) - - ZOOKEEPER-161. Content needed: "Designing a ZooKeeper Deployment" - (breed via phunt) - - ZOOKEEPER-247. fix formatting of C API in ACL section of programmer guide. - (patrick hunt via mahadev) - - ZOOKEEPER-230. Improvements to FLE. (Flavio via mahadev) - - ZOOKEEPER-225. c client should log an info message in zookeeper_init - detailing connection parameters. (pat via mahadev) - - ZOOKEEPER-222. print C client log message timestamp in human readable - form. (pat via mahadev) - - ZOOKEEPER-256. support use of JMX to manage log4j configuration at runtime. - (pat via mahadev) - - ZOOKEEPER-214. add new "stat reset" command to server admin port. - (pat via mahadev) - - ZOOKEEPER-258. docs incorrectly state max client timeout as 60 seconds - (it's based on server ticktime). (phunt via mahadev) - - ZOOKEEPER-135. Fat jar build target. (phunt and breed via mahadev) - - ZOOKEEPER-234. Eliminate using statics to initialize the sever. Should - allow server to be more embeddable in OSGi enviorments. (phunt) - - ZOOKEEPER-259. cleanup the logging levels used (use the correct level) - and messages generated. (phunt via breed) - - ZOOKEEPER-210. Require Java 6. (phunt via breed) - - ZOOKEEPER-177. needed: docs for JMX (phunt via mahadev) - - ZOOKEEPER-253. documentation of DataWatcher state transition is misleading -regarding auto watch reset on reconnect. (phunt via mahadev) - - ZOOKEEPER-269. connectionloss- add more documentation to detail. (phunt and -flavio via mahadev) - - ZOOKEEPER-260. document the recommended values for server id's - (mahadev via phunt) - - ZOOKEEPER-215. expand system test environment (breed via phunt) - - ZOOKEEPER-229. improve documentation regarding user's responsibility to - cleanup datadir (snaps/logs) (mahadev via phunt) - - ZOOKEEPER-69. ZooKeeper logo - - ZOOKEEPER-286. Make GenerateLoad use InstanceContainers. (breed via mahadev) - - ZOOKEEPER-220. programming guide watches section should clarify - server/clientlib role in data/child watch maint. (breed via phunt) - - ZOOKEEPER-289. add debug messages to nioserver select loop. (mahadev) - -NEW FEATURES: - - ZOOKEEPER-276. Bookkeeper contribution (Flavio and Luca Telloli via mahadev) - - ZOOKEEPER-231. Quotas in ZooKeeper. (mahadev) - -Release 3.0.0 - 2008-10-21 - -Non-backward compatible changes: - - ZOOKEEPER-43. Server side of auto reset watches. (breed via mahadev) - - ZOOKEEPER-132. Create Enum to replace CreateFlag in ZooKepper.create - method (Jakob Homan via phunt) - - ZOOKEEPER-139. Create Enums for WatcherEvent's KeeperState and EventType - (Jakob Homan via phunt) - - ZOOKEEPER-18. keeper state inconsistency (Jakob Homan via phunt) - - ZOOKEEPER-38. headers (version+) in log/snap files (Andrew Kornev and Mahadev - Konar via breed) - - ZOOKEEPER-8. Stat enchaned to include num of children and size - (phunt) - - ZOOKEEPER-6. List of problem identifiers in zookeeper.h - (phunt) - - ZOOKEEPER-7. Use enums rather than ints for types and state - (Jakob Homan via mahadev) - - ZOOKEEPER-27. Unique DB identifiers for servers and clients - (mahadev) - - ZOOKEEPER-32. CRCs for ZooKeeper data - (mahadev) - - ZOOKEEPER-33. Better ACL management - (mahadev) - -Backward compatible changes: - - BUGFIXES: - - ZOOKEEPER-203. fix datadir typo in releasenotes (phunt) - - ZOOKEEPER-145. write detailed release notes for users migrating from 2.x - to 3.0 (phunt) - - ZOOKEEPER-23. Auto reset of watches on reconnect (breed via phunt) - - ZOOKEEPER-191. forrest docs for upgrade. (mahadev via phunt) - - ZOOKEEPER-201. validate magic number when reading snapshot and transaction - logs (mahadev via phunt) - - ZOOKEEPER-200. the magic number for snapshot and log must be different - (currently same) (phunt) - - ZOOKEEPER-199. fix log messages in persistence code (mahadev via phunt) - - ZOOKEEPER-197. create checksums for snapshots (mahadev via phunt) - - ZOOKEEPER-198. apache license header missing from FollowerSyncRequest.java - (phunt) - - ZOOKEEPER-5. Upgrade Feature in Zookeeper server. (mahadev via phunt) - - ZOOKEEPER-194. Fix terminology in zookeeperAdmin.xml - (Flavio Paiva Junqueira) - - ZOOKEEPER-151. Document change to server configuration - (Flavio Paiva Junqueira) - - ZOOKEEPER-193. update java example doc to compile with latest zookeeper - (phunt) - - ZOOKEEPER-187. CreateMode api docs missing (phunt) - - ZOOKEEPER-186. add new "releasenotes.xml" to forrest documentation - (phunt) - - ZOOKEEPER-190. Reorg links to docs and navs to docs into related sections - (robbie via phunt) - - ZOOKEEPER-189. forrest build not validated xml of input documents - (robbie via phunt) - - ZOOKEEPER-188. Check that election port is present for all servers - (Flavio Paiva Junqueira via phunt) - - ZOOKEEPER-185. Improved version of FLETest (Flavio Paiva Junqueira) - - ZOOKEEPER-184. tests: An explicit include derective is needed for the usage - of memcpy(), memset(), strlen(), strdup() and free() functions - (Maxim P. Dementiev via phunt) - - ZOOKEEPER-183. Array subscript is above array bounds in od_completion(), - src/cli.c. (Maxim P. Dementiev via phunt) - - ZOOKEEPER-182. zookeeper_init accepts empty host-port string and returns - valid pointer to zhandle_t. (Maxim P. Dementiev via phunt) - - ZOOKEEPER-17. zookeeper_init doc needs clarification (phunt) - - ZOOKEEPER-181. Some Source Forge Documents did not get moved over: - javaExample, zookeeperTutorial, zookeeperInternals (robbie via phunt) - - ZOOKEEPER-180. Placeholder sections needed in document for new topics that - the umbrella jira discusses (robbie via phunt) - - ZOOKEEPER-179. Programmer's Guide "Basic Operations" section is missing - content (robbie via phunt) - - ZOOKEEPER-178. FLE test. (Flavio Paiva Junqueira) - - ZOOKEEPER-159. Cover two corner cases of leader election - (Flavio Paiva Junqueira via phunt) - - ZOOKEEPER-156. update programmer guide with acl details from old wiki page - (phunt) - - ZOOKEEPER-154. reliability graph diagram in overview doc needs context - (phunt) - - ZOOKEEPER-157. Peer can't find existing leader (Flavio Paiva Junqueira) - - ZOOKEEPER-155. improve "the zookeeper project" section of overview doc - (phunt) - - ZOOKEEPER-140. Deadlock in QuorumCnxManager (Flavio Paiva Junqueira) - - ZOOKEEPER-147. This is version of the documents with most of the [tbd...] - scrubbed out (robbie via phunt) - - ZOOKEEPER-150. zookeeper build broken (mahadev via phunt) - - ZOOKEEPER-136. sync causes hang in all followers of quorum. (breed) - - ZOOKEEPER-134. findbugs cleanup (phunt) - - ZOOKEEPER-133. hudson tests failing intermittently (phunt) - - ZOOKEEPER-144. add tostring support for watcher event, and enums for event - type/state (Jakob Homan via phunt) - - ZOOKEEPER-21. Improve zk ctor/watcher (state transition) docs (phunt) - - ZOOKEEPER-142. Provide Javadoc as to the maximum size of the data byte - array that may be stored within a znode (Jakob Homan via phunt) - - ZOOKEEPER-93. Create Documentation for Zookeeper (phunt) - - ZOOKEEPER-117. threading issues in Leader election (fpj via breed) - - ZOOKEEPER-137. client watcher objects can lose events (phunt via breed) - - ZOOKEEPER-131. Old leader election can elect a dead leader over and over - again (breed via mahadev) - - ZOOKEEPER-130. update build.xml to support apache release process - (phunt via mahadev) - - ZOOKEEPER-118. findbugs flagged switch statement in - followerrequestprocessor.run() (Flavio Paiva Junqueira via phunt) - - ZOOKEEPER-115. Potential NPE in QuorumCnxManager - (Flavio Paiva Junqueira) - - ZOOKEEPER-114. cleanup ugly event messages in zookeeper client - (Jakob Homan) - - ZOOKEEPER-112. src/java/main ZooKeeper.java has test code embedded into it. - (phunt) - - ZOOKEEPER-39. Use Watcher objects rather than boolean on read operations. - (Andrew Kornev) - - ZOOKEEPER-97. supports optional output directory in code generator. (Hiram - Chirino via phunt) - - ZOOKEEPER-101. Integrate ZooKeeper with "violations" feature on hudson - (phunt) - - ZOOKEEPER-105. Catch Zookeeper exceptions and print on the stderr. - (Anthony Urso via Mahadev) - - ZOOKEEPER-42. Change Leader Election to fast tcp. (Flavio Paiva Junqueira - via phunt) - - ZOOKEEPER-48. auth_id now handled correctly when no auth ids present - (Benjamin Reed via phunt) - - ZOOKEEPER-44. Create sequence flag children with prefixes of 0's so that - they can be lexicographically sorted. (Jakob Homan via mahadev) - - ZOOKEEPER-108. Fix sync operation reordering on a Quorum. - (Flavio Paiva Junqueira via Mahadev) - - ZOOKEEPER-25. Fuse module for Zookeeper. (Swee Lim, Bart, Patrick Hunt and - Andrew Kornev via Mahadev) - - ZOOKEEPER-58. Race condition on ClientCnxn.java (breed) - - ZOOKEEPER-56. Add clover support to build.xml. (Patrick Hunt via mahadev) - - ZOOKEEPER-75. register the ZooKeeper mailing lists with nabble.com (phunt) - - ZOOKEEPER-54. remove sleeps in the tests. (phunt) - - ZOOKEEPER-55. build.xml failes to retrieve a release number from SVN and - the ant target "dist" fails (Andrew Kornev) - - ZOOKEEPER-89. invoke WhenOwnerListener.whenNotOwner() when the ZK - connection fails (james strachan) - - ZOOKEEPER-90. invoke WhenOwnerListener.whenNotOwner() when the ZK - session expires and the znode is the leader (james strachan) - - ZOOKEEPER-82. Make the ZooKeeperServer more DI friendly. (Hiram Chirino via - mahadev) - - ZOOKEEPER-110. Build script relies on svnant, which is not compatible - with subversion 1.5 working copies (Jakob Homan) - - ZOOKEEPER-111. Significant cleanup of existing tests. (Patrick Hunt via - mahadev) - - ZOOKEEPER-122. Fix NPE in jute's Utils.toCSVString. (Anthony Urso via - mahadev) - - ZOOKEEPER-123. Fix the wrong class is specified for the logger. (Jakob Homan - via mahadev) - - ZOOKEEPER-2. Fix synchronization issues in QuorumPeer and FastLeader - election. (Flavio Paiva Junqueira via mahadev) - - ZOOKEEPER-125. Remove unwanted class declaration in FastLeaderElection. - (Flavio Paiva Junqueira via mahadev) - - ZOOKEEPER-61. Address (remove) use of sleep(#) in client/server test cases. - (phunt) - - ZOOKEEPER-75. cleanup the library directory (phunt) - - ZOOKEEPER-109. cleanup of NPE and Resource issue nits found by static - analysis (phunt) - - ZOOKEEPER-76. Commit 677109 removed the cobertura library, but not the - build targets. (phunt) - - ZOOKEEPER-63. Race condition in client close() operation. (phunt via breed) - - ZOOKEEPER-70. Add skeleton forrest doc structure for ZooKeeper (phunt) - - ZOOKEEPER-79. Document jacob's leader election on the wiki recipes page - (Flavio Junqueira) - - ZOOKEEPER-73. Move ZK wiki from SourceForge to Apache (phunt) - - ZOOKEEPER-72. Initial creation/setup of ZooKeeper ASF site. (phunt) - - ZOOKEEPER-71. Determine what to do re ZooKeeper Changelog(s) (mahadev) - - ZOOKEEPER-68. parseACLs in ZooKeeper.java fails to parse elements of ACL, - should be lastIndexOf rather than IndexOf (mahadev) - - ZOOKEEPER-130. update build.xml to support apache release process. - (phunt via mahadev) - - ZOOKEEPER-131. Fix Old leader election can elect a dead leader over and over - again. (breed via mahadev) - - ZOOKEEPER-137. client watcher objects can lose events (Patrick Hunt via breed) - - ZOOKEEPER-117. threading issues in Leader election (Flavio Junqueira and - Patrick Hunt via breed) - - ZOOKEEPER-128. test coverage on async client operations needs to be improved - (phunt) - - ZOOKEEPER-127. Use of non-standard election ports in config breaks services - (Mark Harwood and Flavio Junqueira via breed) - - ZOOKEEPER-53. tests failing on solaris. (phunt) - - ZOOKEEPER-172. FLE Test (Flavio Junqueira via breed) - - ZOOKEEPER-41. Sample startup script (mahadev) - - ZOOKEEPER-33. Better ACL management (Mahadev Konar) - - ZOOKEEPER-49. SetACL does not work (breed) - - ZOOKEEPER-20. Child watches are not triggered when the node is deleted - (phunt) - - ZOOKEEPER-15. handle failure better in build.xml:test (phunt) - - ZOOKEEPER-11. ArrayList is used instead of List (phunt) - - ZOOKEEPER-45. Restructure the SVN repository after initial import (phunt) - - ZOOKEEPER-1. Initial ZooKeeper code contribution from Yahoo! (phunt) diff --git a/pkg/registry/zookeeper-3.4.6/LICENSE.txt b/pkg/registry/zookeeper-3.4.6/LICENSE.txt deleted file mode 100644 index d64569567..000000000 --- a/pkg/registry/zookeeper-3.4.6/LICENSE.txt +++ /dev/null @@ -1,202 +0,0 @@ - - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "[]" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright [yyyy] [name of copyright owner] - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. diff --git a/pkg/registry/zookeeper-3.4.6/NOTICE.txt b/pkg/registry/zookeeper-3.4.6/NOTICE.txt deleted file mode 100644 index 35add9689..000000000 --- a/pkg/registry/zookeeper-3.4.6/NOTICE.txt +++ /dev/null @@ -1,5 +0,0 @@ -Apache ZooKeeper -Copyright 2009-2012 The Apache Software Foundation - -This product includes software developed at -The Apache Software Foundation (http://www.apache.org/). diff --git a/pkg/registry/zookeeper-3.4.6/README.txt b/pkg/registry/zookeeper-3.4.6/README.txt deleted file mode 100644 index d056f5afb..000000000 --- a/pkg/registry/zookeeper-3.4.6/README.txt +++ /dev/null @@ -1,36 +0,0 @@ -For the latest information about ZooKeeper, please visit our website at: - - http://zookeeper.apache.org/ - -and our wiki, at: - - https://cwiki.apache.org/confluence/display/ZOOKEEPER - -Full documentation for this release can also be found in docs/index.html - ---------------------------- -Packaging/release artifacts - -The release artifact contains the following jar file at the toplevel: - -zookeeper-.jar - legacy jar file which contains all classes - and source files. Prior to version 3.3.0 this - was the only jar file available. It has the - benefit of having the source included (for - debugging purposes) however is also larger as - a result - -The release artifact contains the following jar files in "dist-maven" directory: - -zookeeper-.jar - bin (binary) jar - contains only class (*.class) files -zookeeper--sources.jar - contains only src (*.java) files -zookeeper--javadoc.jar - contains only javadoc files - -These bin/src/javadoc jars were added specifically to support Maven/Ivy which have -the ability to pull these down automatically as part of your build process. -The content of the legacy jar and the bin+sources jar are the same. - -As of version 3.3.0 bin/sources/javadoc jars contained in dist-maven directory -are deployed to the Apache Maven repository after the release has been accepted -by Apache: - http://people.apache.org/repo/m2-ibiblio-rsync-repository/ diff --git a/pkg/registry/zookeeper-3.4.6/README_packaging.txt b/pkg/registry/zookeeper-3.4.6/README_packaging.txt deleted file mode 100644 index 48b69183b..000000000 --- a/pkg/registry/zookeeper-3.4.6/README_packaging.txt +++ /dev/null @@ -1,65 +0,0 @@ -README file for Packaging Notes - -Requirement ------------ - -gcc, cppunit and python-setuptools are required to build -C and python bindings. - -On RHEL machine: - -yum install cppunit -yum install python-setuptools - -On Ubuntu: - -apt-get --install cppunit -apt-get --install python-setuptools - -Package build command ---------------------- - -Command to build Debian package: ant deb -Command to build RPM Package: ant rpm - -rpm and deb packages are generated and placed in: - -build/zookeeper*.[rpm|deb] -build/contrib/**.[rpm|deb] - -Default package file structure layout - - /usr/bin - User executable - /usr/sbin - System executable - /usr/libexec - Configuration boot trap script - /usr/lib - Native libraries - /usr/share/doc/zookeeper - Documents - /usr/share/zookeeper - Project files - /usr/share/zookeeper/template/conf - Configuration template files - /etc/zookeeper - Configuration files - /etc/init.d/zookeeper - OS startup script - -Source file structure layout ---------------------- - -src/packages/update-zookeeper-env.sh - - setup environment variables and symlink $PREFIX/etc/zookeeper to - /etc/zookeeper. - - This script is designed to run in post installation, and pre-remove - phase of ZooKeeper package. - - Run update-zookeeper-env.sh -h to get a list of supported parameters. - -src/packages/template - - Standard configuration template - -src/packages/deb - Meta data for creating Debian package - -src/packages/deb/init.d - Daemon start/stop script for Debian flavor of Linux - -src/packages/rpm - Meta data for creating RPM package - -src/packages/rpm/init.d - Daemon start/stop script for Redhat flavor of Linux diff --git a/pkg/registry/zookeeper-3.4.6/bin/README.txt b/pkg/registry/zookeeper-3.4.6/bin/README.txt deleted file mode 100755 index e70506dd7..000000000 --- a/pkg/registry/zookeeper-3.4.6/bin/README.txt +++ /dev/null @@ -1,6 +0,0 @@ -This directory contain scripts that allow easy access (classpath in particular) -to the ZooKeeper server and command line client. - -Files ending in .sh are unix and cygwin compatible - -Files ending in .cmd are msdos/windows compatible diff --git a/pkg/registry/zookeeper-3.4.6/bin/zkCleanup.sh b/pkg/registry/zookeeper-3.4.6/bin/zkCleanup.sh deleted file mode 100755 index 38ee2e8be..000000000 --- a/pkg/registry/zookeeper-3.4.6/bin/zkCleanup.sh +++ /dev/null @@ -1,51 +0,0 @@ -#!/usr/bin/env bash - -# Licensed to the Apache Software Foundation (ASF) under one or more -# contributor license agreements. See the NOTICE file distributed with -# this work for additional information regarding copyright ownership. -# The ASF licenses this file to You 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 script cleans up old transaction logs and snapshots -# - -# -# If this scripted is run out of /usr/bin or some other system bin directory -# it should be linked to and not copied. Things like java jar files are found -# relative to the canonical path of this script. -# - -# use POSTIX interface, symlink is followed automatically -ZOOBIN="${BASH_SOURCE-$0}" -ZOOBIN="$(dirname "${ZOOBIN}")" -ZOOBINDIR="$(cd "${ZOOBIN}"; pwd)" - -if [ -e "$ZOOBIN/../libexec/zkEnv.sh" ]; then - . "$ZOOBINDIR"/../libexec/zkEnv.sh -else - . "$ZOOBINDIR"/zkEnv.sh -fi - -ZOODATADIR="$(grep "^[[:space:]]*dataDir=" "$ZOOCFG" | sed -e 's/.*=//')" -ZOODATALOGDIR="$(grep "^[[:space:]]*dataLogDir=" "$ZOOCFG" | sed -e 's/.*=//')" - -if [ "x$ZOODATALOGDIR" = "x" ] -then -"$JAVA" "-Dzookeeper.log.dir=${ZOO_LOG_DIR}" "-Dzookeeper.root.logger=${ZOO_LOG4J_PROP}" \ - -cp "$CLASSPATH" $JVMFLAGS \ - org.apache.zookeeper.server.PurgeTxnLog "$ZOODATADIR" $* -else -"$JAVA" "-Dzookeeper.log.dir=${ZOO_LOG_DIR}" "-Dzookeeper.root.logger=${ZOO_LOG4J_PROP}" \ - -cp "$CLASSPATH" $JVMFLAGS \ - org.apache.zookeeper.server.PurgeTxnLog "$ZOODATALOGDIR" "$ZOODATADIR" $* -fi diff --git a/pkg/registry/zookeeper-3.4.6/bin/zkCli.cmd b/pkg/registry/zookeeper-3.4.6/bin/zkCli.cmd deleted file mode 100755 index fc9bff869..000000000 --- a/pkg/registry/zookeeper-3.4.6/bin/zkCli.cmd +++ /dev/null @@ -1,24 +0,0 @@ -@echo off -REM Licensed to the Apache Software Foundation (ASF) under one or more -REM contributor license agreements. See the NOTICE file distributed with -REM this work for additional information regarding copyright ownership. -REM The ASF licenses this file to You under the Apache License, Version 2.0 -REM (the "License"); you may not use this file except in compliance with -REM the License. You may obtain a copy of the License at -REM -REM http://www.apache.org/licenses/LICENSE-2.0 -REM -REM Unless required by applicable law or agreed to in writing, software -REM distributed under the License is distributed on an "AS IS" BASIS, -REM WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -REM See the License for the specific language governing permissions and -REM limitations under the License. - -setlocal -call "%~dp0zkEnv.cmd" - -set ZOOMAIN=org.apache.zookeeper.ZooKeeperMain -java "-Dzookeeper.log.dir=%ZOO_LOG_DIR%" "-Dzookeeper.root.logger=%ZOO_LOG4J_PROP%" -cp "%CLASSPATH%" %ZOOMAIN% %* - -endlocal - diff --git a/pkg/registry/zookeeper-3.4.6/bin/zkCli.sh b/pkg/registry/zookeeper-3.4.6/bin/zkCli.sh deleted file mode 100755 index 992a91367..000000000 --- a/pkg/registry/zookeeper-3.4.6/bin/zkCli.sh +++ /dev/null @@ -1,41 +0,0 @@ -#!/usr/bin/env bash - -# Licensed to the Apache Software Foundation (ASF) under one or more -# contributor license agreements. See the NOTICE file distributed with -# this work for additional information regarding copyright ownership. -# The ASF licenses this file to You 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 script cleans up old transaction logs and snapshots -# - -# -# If this scripted is run out of /usr/bin or some other system bin directory -# it should be linked to and not copied. Things like java jar files are found -# relative to the canonical path of this script. -# - -# use POSTIX interface, symlink is followed automatically -ZOOBIN="${BASH_SOURCE-$0}" -ZOOBIN="$(dirname "${ZOOBIN}")" -ZOOBINDIR="$(cd "${ZOOBIN}"; pwd)" - -if [ -e "$ZOOBIN/../libexec/zkEnv.sh" ]; then - . "$ZOOBINDIR"/../libexec/zkEnv.sh -else - . "$ZOOBINDIR"/zkEnv.sh -fi - -"$JAVA" "-Dzookeeper.log.dir=${ZOO_LOG_DIR}" "-Dzookeeper.root.logger=${ZOO_LOG4J_PROP}" \ - -cp "$CLASSPATH" $CLIENT_JVMFLAGS $JVMFLAGS \ - org.apache.zookeeper.ZooKeeperMain "$@" diff --git a/pkg/registry/zookeeper-3.4.6/bin/zkEnv.cmd b/pkg/registry/zookeeper-3.4.6/bin/zkEnv.cmd deleted file mode 100755 index 5711e5645..000000000 --- a/pkg/registry/zookeeper-3.4.6/bin/zkEnv.cmd +++ /dev/null @@ -1,34 +0,0 @@ -@echo off -REM Licensed to the Apache Software Foundation (ASF) under one or more -REM contributor license agreements. See the NOTICE file distributed with -REM this work for additional information regarding copyright ownership. -REM The ASF licenses this file to You under the Apache License, Version 2.0 -REM (the "License"); you may not use this file except in compliance with -REM the License. You may obtain a copy of the License at -REM -REM http://www.apache.org/licenses/LICENSE-2.0 -REM -REM Unless required by applicable law or agreed to in writing, software -REM distributed under the License is distributed on an "AS IS" BASIS, -REM WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -REM See the License for the specific language governing permissions and -REM limitations under the License. - -set ZOOCFGDIR=%~dp0%..\conf -set ZOO_LOG_DIR=%~dp0%.. -set ZOO_LOG4J_PROP=INFO,CONSOLE - -REM for sanity sake assume Java 1.6 -REM see: http://java.sun.com/javase/6/docs/technotes/tools/windows/java.html - -REM add the zoocfg dir to classpath -set CLASSPATH=%ZOOCFGDIR% - -REM make it work in the release -SET CLASSPATH=%~dp0..\*;%~dp0..\lib\*;%CLASSPATH% - -REM make it work for developers -SET CLASSPATH=%~dp0..\build\classes;%~dp0..\build\lib\*;%CLASSPATH% - -set ZOOCFG=%ZOOCFGDIR%\zoo.cfg - diff --git a/pkg/registry/zookeeper-3.4.6/bin/zkEnv.sh b/pkg/registry/zookeeper-3.4.6/bin/zkEnv.sh deleted file mode 100755 index 43cbc2235..000000000 --- a/pkg/registry/zookeeper-3.4.6/bin/zkEnv.sh +++ /dev/null @@ -1,115 +0,0 @@ -#!/usr/bin/env bash - -# Licensed to the Apache Software Foundation (ASF) under one or more -# contributor license agreements. See the NOTICE file distributed with -# this work for additional information regarding copyright ownership. -# The ASF licenses this file to You 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 script should be sourced into other zookeeper -# scripts to setup the env variables - -# We use ZOOCFGDIR if defined, -# otherwise we use /etc/zookeeper -# or the conf directory that is -# a sibling of this script's directory - -ZOOBINDIR="${ZOOBINDIR:-/usr/bin}" -ZOOKEEPER_PREFIX="${ZOOBINDIR}/.." - -if [ "x$ZOOCFGDIR" = "x" ] -then - if [ -e "${ZOOKEEPER_PREFIX}/conf" ]; then - ZOOCFGDIR="$ZOOBINDIR/../conf" - else - ZOOCFGDIR="$ZOOBINDIR/../etc/zookeeper" - fi -fi - -if [ -f "${ZOOCFGDIR}/zookeeper-env.sh" ]; then - . "${ZOOCFGDIR}/zookeeper-env.sh" -fi - -if [ "x$ZOOCFG" = "x" ] -then - ZOOCFG="zoo.cfg" -fi - -ZOOCFG="$ZOOCFGDIR/$ZOOCFG" - -if [ -f "$ZOOCFGDIR/java.env" ] -then - . "$ZOOCFGDIR/java.env" -fi - -if [ "x${ZOO_LOG_DIR}" = "x" ] -then - ZOO_LOG_DIR="." -fi - -if [ "x${ZOO_LOG4J_PROP}" = "x" ] -then - ZOO_LOG4J_PROP="INFO,CONSOLE" -fi - -if [ "$JAVA_HOME" != "" ]; then - JAVA="$JAVA_HOME/bin/java" -else - JAVA=java -fi - -#add the zoocfg dir to classpath -CLASSPATH="$ZOOCFGDIR:$CLASSPATH" - -for i in "$ZOOBINDIR"/../src/java/lib/*.jar -do - CLASSPATH="$i:$CLASSPATH" -done - -#make it work in the binary package -#(use array for LIBPATH to account for spaces within wildcard expansion) -if [ -e "${ZOOKEEPER_PREFIX}"/share/zookeeper/zookeeper-*.jar ]; then - LIBPATH=("${ZOOKEEPER_PREFIX}"/share/zookeeper/*.jar) -else - #release tarball format - for i in "$ZOOBINDIR"/../zookeeper-*.jar - do - CLASSPATH="$i:$CLASSPATH" - done - LIBPATH=("${ZOOBINDIR}"/../lib/*.jar) -fi - -for i in "${LIBPATH[@]}" -do - CLASSPATH="$i:$CLASSPATH" -done - -#make it work for developers -for d in "$ZOOBINDIR"/../build/lib/*.jar -do - CLASSPATH="$d:$CLASSPATH" -done - -#make it work for developers -CLASSPATH="$ZOOBINDIR/../build/classes:$CLASSPATH" - -case "`uname`" in - CYGWIN*) cygwin=true ;; - *) cygwin=false ;; -esac - -if $cygwin -then - CLASSPATH=`cygpath -wp "$CLASSPATH"` -fi - -#echo "CLASSPATH=$CLASSPATH" \ No newline at end of file diff --git a/pkg/registry/zookeeper-3.4.6/bin/zkServer.cmd b/pkg/registry/zookeeper-3.4.6/bin/zkServer.cmd deleted file mode 100755 index 0f35415ff..000000000 --- a/pkg/registry/zookeeper-3.4.6/bin/zkServer.cmd +++ /dev/null @@ -1,25 +0,0 @@ -@echo off -REM Licensed to the Apache Software Foundation (ASF) under one or more -REM contributor license agreements. See the NOTICE file distributed with -REM this work for additional information regarding copyright ownership. -REM The ASF licenses this file to You under the Apache License, Version 2.0 -REM (the "License"); you may not use this file except in compliance with -REM the License. You may obtain a copy of the License at -REM -REM http://www.apache.org/licenses/LICENSE-2.0 -REM -REM Unless required by applicable law or agreed to in writing, software -REM distributed under the License is distributed on an "AS IS" BASIS, -REM WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -REM See the License for the specific language governing permissions and -REM limitations under the License. - -setlocal -call "%~dp0zkEnv.cmd" - -set ZOOMAIN=org.apache.zookeeper.server.quorum.QuorumPeerMain -echo on -java "-Dzookeeper.log.dir=%ZOO_LOG_DIR%" "-Dzookeeper.root.logger=%ZOO_LOG4J_PROP%" -cp "%CLASSPATH%" %ZOOMAIN% "%ZOOCFG%" %* - -endlocal - diff --git a/pkg/registry/zookeeper-3.4.6/bin/zkServer.sh b/pkg/registry/zookeeper-3.4.6/bin/zkServer.sh deleted file mode 100755 index 049098276..000000000 --- a/pkg/registry/zookeeper-3.4.6/bin/zkServer.sh +++ /dev/null @@ -1,186 +0,0 @@ -#!/usr/bin/env bash - -# Licensed to the Apache Software Foundation (ASF) under one or more -# contributor license agreements. See the NOTICE file distributed with -# this work for additional information regarding copyright ownership. -# The ASF licenses this file to You 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. - -# -# If this scripted is run out of /usr/bin or some other system bin directory -# it should be linked to and not copied. Things like java jar files are found -# relative to the canonical path of this script. -# - -# See the following page for extensive details on setting -# up the JVM to accept JMX remote management: -# http://java.sun.com/javase/6/docs/technotes/guides/management/agent.html -# by default we allow local JMX connections -if [ "x$JMXLOCALONLY" = "x" ] -then - JMXLOCALONLY=false -fi - -if [ "x$JMXDISABLE" = "x" ] -then - echo "JMX enabled by default" >&2 - # for some reason these two options are necessary on jdk6 on Ubuntu - # accord to the docs they are not necessary, but otw jconsole cannot - # do a local attach - ZOOMAIN="-Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.local.only=$JMXLOCALONLY org.apache.zookeeper.server.quorum.QuorumPeerMain" -else - echo "JMX disabled by user request" >&2 - ZOOMAIN="org.apache.zookeeper.server.quorum.QuorumPeerMain" -fi - -# use POSTIX interface, symlink is followed automatically -ZOOBIN="${BASH_SOURCE-$0}" -ZOOBIN="$(dirname "${ZOOBIN}")" -ZOOBINDIR="$(cd "${ZOOBIN}"; pwd)" - -if [ -e "$ZOOBIN/../libexec/zkEnv.sh" ]; then - . "$ZOOBINDIR/../libexec/zkEnv.sh" -else - . "$ZOOBINDIR/zkEnv.sh" -fi - -if [ "x$SERVER_JVMFLAGS" != "x" ] -then - JVMFLAGS="$SERVER_JVMFLAGS $JVMFLAGS" -fi - -if [ "x$2" != "x" ] -then - ZOOCFG="$ZOOCFGDIR/$2" -fi - -# if we give a more complicated path to the config, don't screw around in $ZOOCFGDIR -if [ "x$(dirname "$ZOOCFG")" != "x$ZOOCFGDIR" ] -then - ZOOCFG="$2" -fi - -if $cygwin -then - ZOOCFG=`cygpath -wp "$ZOOCFG"` - # cygwin has a "kill" in the shell itself, gets confused - KILL=/bin/kill -else - KILL=kill -fi - -echo "Using config: $ZOOCFG" >&2 - -if [ -z "$ZOOPIDFILE" ]; then - ZOO_DATADIR="$(grep "^[[:space:]]*dataDir" "$ZOOCFG" | sed -e 's/.*=//')" - if [ ! -d "$ZOO_DATADIR" ]; then - mkdir -p "$ZOO_DATADIR" - fi - ZOOPIDFILE="$ZOO_DATADIR/zookeeper_server.pid" -else - # ensure it exists, otw stop will fail - mkdir -p "$(dirname "$ZOOPIDFILE")" -fi - -if [ ! -w "$ZOO_LOG_DIR" ] ; then -mkdir -p "$ZOO_LOG_DIR" -fi - -_ZOO_DAEMON_OUT="$ZOO_LOG_DIR/zookeeper.out" - -case $1 in -start) - echo -n "Starting zookeeper ... " - if [ -f "$ZOOPIDFILE" ]; then - if kill -0 `cat "$ZOOPIDFILE"` > /dev/null 2>&1; then - echo $command already running as process `cat "$ZOOPIDFILE"`. - exit 0 - fi - fi - nohup "$JAVA" "-Dzookeeper.log.dir=${ZOO_LOG_DIR}" "-Dzookeeper.root.logger=${ZOO_LOG4J_PROP}" \ - -cp "$CLASSPATH" $JVMFLAGS $ZOOMAIN "$ZOOCFG" > "$_ZOO_DAEMON_OUT" 2>&1 < /dev/null & - if [ $? -eq 0 ] - then - if /bin/echo -n $! > "$ZOOPIDFILE" - then - sleep 1 - echo STARTED - else - echo FAILED TO WRITE PID - exit 1 - fi - else - echo SERVER DID NOT START - exit 1 - fi - ;; -start-foreground) - ZOO_CMD=(exec "$JAVA") - if [ "${ZOO_NOEXEC}" != "" ]; then - ZOO_CMD=("$JAVA") - fi - "${ZOO_CMD[@]}" "-Dzookeeper.log.dir=${ZOO_LOG_DIR}" "-Dzookeeper.root.logger=${ZOO_LOG4J_PROP}" \ - -cp "$CLASSPATH" $JVMFLAGS $ZOOMAIN "$ZOOCFG" - ;; -print-cmd) - echo "\"$JAVA\" -Dzookeeper.log.dir=\"${ZOO_LOG_DIR}\" -Dzookeeper.root.logger=\"${ZOO_LOG4J_PROP}\" -cp \"$CLASSPATH\" $JVMFLAGS $ZOOMAIN \"$ZOOCFG\" > \"$_ZOO_DAEMON_OUT\" 2>&1 < /dev/null" - ;; -stop) - echo -n "Stopping zookeeper ... " - if [ ! -f "$ZOOPIDFILE" ] - then - echo "no zookeeper to stop (could not find file $ZOOPIDFILE)" - else - $KILL -9 $(cat "$ZOOPIDFILE") - rm "$ZOOPIDFILE" - echo STOPPED - fi - exit 0 - ;; -upgrade) - shift - echo "upgrading the servers to 3.*" - "$JAVA" "-Dzookeeper.log.dir=${ZOO_LOG_DIR}" "-Dzookeeper.root.logger=${ZOO_LOG4J_PROP}" \ - -cp "$CLASSPATH" $JVMFLAGS org.apache.zookeeper.server.upgrade.UpgradeMain ${@} - echo "Upgrading ... " - ;; -restart) - shift - "$0" stop ${@} - sleep 3 - "$0" start ${@} - ;; -status) - # -q is necessary on some versions of linux where nc returns too quickly, and no stat result is output - clientPortAddress=`grep "^[[:space:]]*clientPortAddress[^[:alpha:]]" "$ZOOCFG" | sed -e 's/.*=//'` - if ! [ $clientPortAddress ] - then - clientPortAddress="localhost" - fi - clientPort=`grep "^[[:space:]]*clientPort[^[:alpha:]]" "$ZOOCFG" | sed -e 's/.*=//'` - STAT=`"$JAVA" "-Dzookeeper.log.dir=${ZOO_LOG_DIR}" "-Dzookeeper.root.logger=${ZOO_LOG4J_PROP}" \ - -cp "$CLASSPATH" $JVMFLAGS org.apache.zookeeper.client.FourLetterWordMain \ - $clientPortAddress $clientPort srvr 2> /dev/null \ - | grep Mode` - if [ "x$STAT" = "x" ] - then - echo "Error contacting service. It is probably not running." - exit 1 - else - echo $STAT - exit 0 - fi - ;; -*) - echo "Usage: $0 {start|start-foreground|stop|restart|status|upgrade|print-cmd}" >&2 - -esac diff --git a/pkg/registry/zookeeper-3.4.6/build.xml b/pkg/registry/zookeeper-3.4.6/build.xml deleted file mode 100644 index 442d52e99..000000000 --- a/pkg/registry/zookeeper-3.4.6/build.xml +++ /dev/null @@ -1,1805 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

      Eclipse Public License - v 1.0

      - -

      THE ACCOMPANYING PROGRAM IS PROVIDED UNDER THE TERMS OF THIS ECLIPSE -PUBLIC LICENSE ("AGREEMENT"). ANY USE, REPRODUCTION OR -DISTRIBUTION OF THE PROGRAM CONSTITUTES RECIPIENT'S ACCEPTANCE OF THIS -AGREEMENT.

      - -

      1. DEFINITIONS

      - -

      "Contribution" means:

      - -

      a) in the case of the initial Contributor, the initial -code and documentation distributed under this Agreement, and

      -

      b) in the case of each subsequent Contributor:

      -

      i) changes to the Program, and

      -

      ii) additions to the Program;

      -

      where such changes and/or additions to the Program -originate from and are distributed by that particular Contributor. A -Contribution 'originates' from a Contributor if it was added to the -Program by such Contributor itself or anyone acting on such -Contributor's behalf. Contributions do not include additions to the -Program which: (i) are separate modules of software distributed in -conjunction with the Program under their own license agreement, and (ii) -are not derivative works of the Program.

      - -

      "Contributor" means any person or entity that distributes -the Program.

      - -

      "Licensed Patents" mean patent claims licensable by a -Contributor which are necessarily infringed by the use or sale of its -Contribution alone or when combined with the Program.

      - -

      "Program" means the Contributions distributed in accordance -with this Agreement.

      - -

      "Recipient" means anyone who receives the Program under -this Agreement, including all Contributors.

      - -

      2. GRANT OF RIGHTS

      - -

      a) Subject to the terms of this Agreement, each -Contributor hereby grants Recipient a non-exclusive, worldwide, -royalty-free copyright license to reproduce, prepare derivative works -of, publicly display, publicly perform, distribute and sublicense the -Contribution of such Contributor, if any, and such derivative works, in -source code and object code form.

      - -

      b) Subject to the terms of this Agreement, each -Contributor hereby grants Recipient a non-exclusive, worldwide, -royalty-free patent license under Licensed Patents to make, use, sell, -offer to sell, import and otherwise transfer the Contribution of such -Contributor, if any, in source code and object code form. This patent -license shall apply to the combination of the Contribution and the -Program if, at the time the Contribution is added by the Contributor, -such addition of the Contribution causes such combination to be covered -by the Licensed Patents. The patent license shall not apply to any other -combinations which include the Contribution. No hardware per se is -licensed hereunder.

      - -

      c) Recipient understands that although each Contributor -grants the licenses to its Contributions set forth herein, no assurances -are provided by any Contributor that the Program does not infringe the -patent or other intellectual property rights of any other entity. Each -Contributor disclaims any liability to Recipient for claims brought by -any other entity based on infringement of intellectual property rights -or otherwise. As a condition to exercising the rights and licenses -granted hereunder, each Recipient hereby assumes sole responsibility to -secure any other intellectual property rights needed, if any. For -example, if a third party patent license is required to allow Recipient -to distribute the Program, it is Recipient's responsibility to acquire -that license before distributing the Program.

      - -

      d) Each Contributor represents that to its knowledge it -has sufficient copyright rights in its Contribution, if any, to grant -the copyright license set forth in this Agreement.

      - -

      3. REQUIREMENTS

      - -

      A Contributor may choose to distribute the Program in object code -form under its own license agreement, provided that:

      - -

      a) it complies with the terms and conditions of this -Agreement; and

      - -

      b) its license agreement:

      - -

      i) effectively disclaims on behalf of all Contributors -all warranties and conditions, express and implied, including warranties -or conditions of title and non-infringement, and implied warranties or -conditions of merchantability and fitness for a particular purpose;

      - -

      ii) effectively excludes on behalf of all Contributors -all liability for damages, including direct, indirect, special, -incidental and consequential damages, such as lost profits;

      - -

      iii) states that any provisions which differ from this -Agreement are offered by that Contributor alone and not by any other -party; and

      - -

      iv) states that source code for the Program is available -from such Contributor, and informs licensees how to obtain it in a -reasonable manner on or through a medium customarily used for software -exchange.

      - -

      When the Program is made available in source code form:

      - -

      a) it must be made available under this Agreement; and

      - -

      b) a copy of this Agreement must be included with each -copy of the Program.

      - -

      Contributors may not remove or alter any copyright notices contained -within the Program.

      - -

      Each Contributor must identify itself as the originator of its -Contribution, if any, in a manner that reasonably allows subsequent -Recipients to identify the originator of the Contribution.

      - -

      4. COMMERCIAL DISTRIBUTION

      - -

      Commercial distributors of software may accept certain -responsibilities with respect to end users, business partners and the -like. While this license is intended to facilitate the commercial use of -the Program, the Contributor who includes the Program in a commercial -product offering should do so in a manner which does not create -potential liability for other Contributors. Therefore, if a Contributor -includes the Program in a commercial product offering, such Contributor -("Commercial Contributor") hereby agrees to defend and -indemnify every other Contributor ("Indemnified Contributor") -against any losses, damages and costs (collectively "Losses") -arising from claims, lawsuits and other legal actions brought by a third -party against the Indemnified Contributor to the extent caused by the -acts or omissions of such Commercial Contributor in connection with its -distribution of the Program in a commercial product offering. The -obligations in this section do not apply to any claims or Losses -relating to any actual or alleged intellectual property infringement. In -order to qualify, an Indemnified Contributor must: a) promptly notify -the Commercial Contributor in writing of such claim, and b) allow the -Commercial Contributor to control, and cooperate with the Commercial -Contributor in, the defense and any related settlement negotiations. The -Indemnified Contributor may participate in any such claim at its own -expense.

      - -

      For example, a Contributor might include the Program in a commercial -product offering, Product X. That Contributor is then a Commercial -Contributor. If that Commercial Contributor then makes performance -claims, or offers warranties related to Product X, those performance -claims and warranties are such Commercial Contributor's responsibility -alone. Under this section, the Commercial Contributor would have to -defend claims against the other Contributors related to those -performance claims and warranties, and if a court requires any other -Contributor to pay any damages as a result, the Commercial Contributor -must pay those damages.

      - -

      5. NO WARRANTY

      - -

      EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, THE PROGRAM IS -PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS -OF ANY KIND, EITHER EXPRESS OR IMPLIED INCLUDING, WITHOUT LIMITATION, -ANY WARRANTIES OR CONDITIONS OF TITLE, NON-INFRINGEMENT, MERCHANTABILITY -OR FITNESS FOR A PARTICULAR PURPOSE. Each Recipient is solely -responsible for determining the appropriateness of using and -distributing the Program and assumes all risks associated with its -exercise of rights under this Agreement , including but not limited to -the risks and costs of program errors, compliance with applicable laws, -damage to or loss of data, programs or equipment, and unavailability or -interruption of operations.

      - -

      6. DISCLAIMER OF LIABILITY

      - -

      EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, NEITHER RECIPIENT -NOR ANY CONTRIBUTORS SHALL HAVE ANY LIABILITY FOR ANY DIRECT, INDIRECT, -INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING -WITHOUT LIMITATION LOST PROFITS), 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 OR -DISTRIBUTION OF THE PROGRAM OR THE EXERCISE OF ANY RIGHTS GRANTED -HEREUNDER, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.

      - -

      7. GENERAL

      - -

      If any provision of this Agreement is invalid or unenforceable under -applicable law, it shall not affect the validity or enforceability of -the remainder of the terms of this Agreement, and without further action -by the parties hereto, such provision shall be reformed to the minimum -extent necessary to make such provision valid and enforceable.

      - -

      If Recipient institutes patent litigation against any entity -(including a cross-claim or counterclaim in a lawsuit) alleging that the -Program itself (excluding combinations of the Program with other -software or hardware) infringes such Recipient's patent(s), then such -Recipient's rights granted under Section 2(b) shall terminate as of the -date such litigation is filed.

      - -

      All Recipient's rights under this Agreement shall terminate if it -fails to comply with any of the material terms or conditions of this -Agreement and does not cure such failure in a reasonable period of time -after becoming aware of such noncompliance. If all Recipient's rights -under this Agreement terminate, Recipient agrees to cease use and -distribution of the Program as soon as reasonably practicable. However, -Recipient's obligations under this Agreement and any licenses granted by -Recipient relating to the Program shall continue and survive.

      - -

      Everyone is permitted to copy and distribute copies of this -Agreement, but in order to avoid inconsistency the Agreement is -copyrighted and may only be modified in the following manner. The -Agreement Steward reserves the right to publish new versions (including -revisions) of this Agreement from time to time. No one other than the -Agreement Steward has the right to modify this Agreement. The Eclipse -Foundation is the initial Agreement Steward. The Eclipse Foundation may -assign the responsibility to serve as the Agreement Steward to a -suitable separate entity. Each new version of the Agreement will be -given a distinguishing version number. The Program (including -Contributions) may always be distributed subject to the version of the -Agreement under which it was received. In addition, after a new version -of the Agreement is published, Contributor may elect to distribute the -Program (including its Contributions) under the new version. Except as -expressly stated in Sections 2(a) and 2(b) above, Recipient receives no -rights or licenses to the intellectual property of any Contributor under -this Agreement, whether expressly, by implication, estoppel or -otherwise. All rights in the Program not expressly granted under this -Agreement are reserved.

      - -

      This Agreement is governed by the laws of the State of New York and -the intellectual property laws of the United States of America. No party -to this Agreement will bring a legal action under this Agreement more -than one year after the cause of action arose. Each party waives its -rights to a jury trial in any resulting litigation.

      - - - - diff --git a/pkg/registry/zookeeper-3.4.6/contrib/ZooInspector/src/java/org/apache/zookeeper/inspector/ZooInspector.java b/pkg/registry/zookeeper-3.4.6/contrib/ZooInspector/src/java/org/apache/zookeeper/inspector/ZooInspector.java deleted file mode 100644 index b637bfd4c..000000000 --- a/pkg/registry/zookeeper-3.4.6/contrib/ZooInspector/src/java/org/apache/zookeeper/inspector/ZooInspector.java +++ /dev/null @@ -1,66 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you 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. - */ -package org.apache.zookeeper.inspector; - -import java.awt.event.WindowAdapter; -import java.awt.event.WindowEvent; - -import javax.swing.JFrame; -import javax.swing.JOptionPane; -import javax.swing.UIManager; - -import org.apache.zookeeper.inspector.gui.ZooInspectorPanel; -import org.apache.zookeeper.inspector.logger.LoggerFactory; -import org.apache.zookeeper.inspector.manager.ZooInspectorManagerImpl; - -/** - * - */ -public class ZooInspector { - /** - * @param args - * - not used. The value of these parameters will have no effect - * on the application - */ - public static void main(String[] args) { - try { - UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); - JFrame frame = new JFrame("ZooInspector"); - frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); - final ZooInspectorPanel zooInspectorPanel = new ZooInspectorPanel( - new ZooInspectorManagerImpl()); - frame.addWindowListener(new WindowAdapter() { - @Override - public void windowClosed(WindowEvent e) { - super.windowClosed(e); - zooInspectorPanel.disconnect(true); - } - }); - - frame.setContentPane(zooInspectorPanel); - frame.setSize(1024, 768); - frame.setVisible(true); - } catch (Exception e) { - LoggerFactory.getLogger().error( - "Error occurred loading ZooInspector", e); - JOptionPane.showMessageDialog(null, - "ZooInspector failed to start: " + e.getMessage(), "Error", - JOptionPane.ERROR_MESSAGE); - } - } -} diff --git a/pkg/registry/zookeeper-3.4.6/contrib/ZooInspector/src/java/org/apache/zookeeper/inspector/encryption/BasicDataEncryptionManager.java b/pkg/registry/zookeeper-3.4.6/contrib/ZooInspector/src/java/org/apache/zookeeper/inspector/encryption/BasicDataEncryptionManager.java deleted file mode 100644 index a9e5ac477..000000000 --- a/pkg/registry/zookeeper-3.4.6/contrib/ZooInspector/src/java/org/apache/zookeeper/inspector/encryption/BasicDataEncryptionManager.java +++ /dev/null @@ -1,50 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you 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. - */ -package org.apache.zookeeper.inspector.encryption; - -/** - * - */ -public class BasicDataEncryptionManager implements DataEncryptionManager { - - /* - * (non-Javadoc) - * - * @see - * org.apache.zookeeper.inspector.encryption.DataEncryptionManager#decryptData - * (byte[]) - */ - public String decryptData(byte[] encrypted) throws Exception { - return new String(encrypted); - } - - /* - * (non-Javadoc) - * - * @see - * org.apache.zookeeper.inspector.encryption.DataEncryptionManager#encryptData - * (java.lang.String) - */ - public byte[] encryptData(String data) throws Exception { - if (data == null) { - return new byte[0]; - } - return data.getBytes(); - } - -} diff --git a/pkg/registry/zookeeper-3.4.6/contrib/ZooInspector/src/java/org/apache/zookeeper/inspector/encryption/DataEncryptionManager.java b/pkg/registry/zookeeper-3.4.6/contrib/ZooInspector/src/java/org/apache/zookeeper/inspector/encryption/DataEncryptionManager.java deleted file mode 100644 index 15a9ee435..000000000 --- a/pkg/registry/zookeeper-3.4.6/contrib/ZooInspector/src/java/org/apache/zookeeper/inspector/encryption/DataEncryptionManager.java +++ /dev/null @@ -1,39 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you 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. - */ -package org.apache.zookeeper.inspector.encryption; - -/** - * A class which describes how data should be encrypted and decrypted - */ -public interface DataEncryptionManager { - /** - * @param data - * - the data to be encrypted - * @return the encrypted data - * @throws Exception - */ - public byte[] encryptData(String data) throws Exception; - - /** - * @param encrypted - * - the data to be decrypted - * @return the decrypted data - * @throws Exception - */ - public String decryptData(byte[] encrypted) throws Exception; -} diff --git a/pkg/registry/zookeeper-3.4.6/contrib/ZooInspector/src/java/org/apache/zookeeper/inspector/gui/NodeViewersChangeListener.java b/pkg/registry/zookeeper-3.4.6/contrib/ZooInspector/src/java/org/apache/zookeeper/inspector/gui/NodeViewersChangeListener.java deleted file mode 100644 index b0b1e9801..000000000 --- a/pkg/registry/zookeeper-3.4.6/contrib/ZooInspector/src/java/org/apache/zookeeper/inspector/gui/NodeViewersChangeListener.java +++ /dev/null @@ -1,37 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you 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. - */ -package org.apache.zookeeper.inspector.gui; - -import java.util.List; - -import org.apache.zookeeper.inspector.gui.nodeviewer.ZooInspectorNodeViewer; - -/** - * A Listener for changes to the configuration of which node viewers are shown - */ -public interface NodeViewersChangeListener { - /** - * Called when the node viewers configuration is changed (i.e node viewers - * are added, removed or the order of the node viewers is changed) - * - * @param newViewers - * - a {@link List} of {@link ZooInspectorNodeViewer}s which are - * to be shown - */ - public void nodeViewersChanged(List newViewers); -} diff --git a/pkg/registry/zookeeper-3.4.6/contrib/ZooInspector/src/java/org/apache/zookeeper/inspector/gui/ZooInspectorAboutDialog.java b/pkg/registry/zookeeper-3.4.6/contrib/ZooInspector/src/java/org/apache/zookeeper/inspector/gui/ZooInspectorAboutDialog.java deleted file mode 100644 index fbae8f10f..000000000 --- a/pkg/registry/zookeeper-3.4.6/contrib/ZooInspector/src/java/org/apache/zookeeper/inspector/gui/ZooInspectorAboutDialog.java +++ /dev/null @@ -1,80 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you 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. - */ -package org.apache.zookeeper.inspector.gui; - -import java.awt.BorderLayout; -import java.awt.Dimension; -import java.awt.FlowLayout; -import java.awt.Frame; -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; -import java.io.IOException; - -import javax.swing.JButton; -import javax.swing.JDialog; -import javax.swing.JEditorPane; -import javax.swing.JPanel; - -import org.apache.zookeeper.inspector.logger.LoggerFactory; - -/** - * The About Dialog for the application - */ -public class ZooInspectorAboutDialog extends JDialog { - /** - * @param frame - * - the Frame from which the dialog is displayed - */ - public ZooInspectorAboutDialog(Frame frame) { - super(frame); - this.setLayout(new BorderLayout()); - this.setIconImage(ZooInspectorIconResources.getInformationIcon() - .getImage()); - this.setTitle("About ZooInspector"); - this.setModal(true); - this.setAlwaysOnTop(true); - this.setResizable(false); - JPanel panel = new JPanel(); - panel.setLayout(new BorderLayout()); - JEditorPane aboutPane = new JEditorPane(); - aboutPane.setEditable(false); - aboutPane.setOpaque(false); - java.net.URL aboutURL = ZooInspectorAboutDialog.class - .getResource("about.html"); - try { - aboutPane.setPage(aboutURL); - } catch (IOException e) { - LoggerFactory.getLogger().error( - "Error loading about.html, file may be corrupt", e); - } - panel.add(aboutPane, BorderLayout.CENTER); - panel.setPreferredSize(new Dimension(600, 200)); - JPanel buttonsPanel = new JPanel(); - buttonsPanel.setLayout(new FlowLayout(FlowLayout.CENTER, 10, 10)); - JButton okButton = new JButton("OK"); - okButton.addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent e) { - ZooInspectorAboutDialog.this.dispose(); - } - }); - buttonsPanel.add(okButton); - this.add(panel, BorderLayout.CENTER); - this.add(buttonsPanel, BorderLayout.SOUTH); - this.pack(); - } -} diff --git a/pkg/registry/zookeeper-3.4.6/contrib/ZooInspector/src/java/org/apache/zookeeper/inspector/gui/ZooInspectorConnectionPropertiesDialog.java b/pkg/registry/zookeeper-3.4.6/contrib/ZooInspector/src/java/org/apache/zookeeper/inspector/gui/ZooInspectorConnectionPropertiesDialog.java deleted file mode 100644 index c7db5243b..000000000 --- a/pkg/registry/zookeeper-3.4.6/contrib/ZooInspector/src/java/org/apache/zookeeper/inspector/gui/ZooInspectorConnectionPropertiesDialog.java +++ /dev/null @@ -1,321 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you 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. - */ -package org.apache.zookeeper.inspector.gui; - -import java.awt.BorderLayout; -import java.awt.GridBagConstraints; -import java.awt.GridBagLayout; -import java.awt.Insets; -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; -import java.io.File; -import java.io.FileReader; -import java.io.IOException; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.Properties; -import java.util.Map.Entry; - -import javax.swing.JButton; -import javax.swing.JComboBox; -import javax.swing.JComponent; -import javax.swing.JDialog; -import javax.swing.JFileChooser; -import javax.swing.JLabel; -import javax.swing.JOptionPane; -import javax.swing.JPanel; -import javax.swing.JTextField; - -import org.apache.zookeeper.inspector.logger.LoggerFactory; -import org.apache.zookeeper.inspector.manager.Pair; - -/** - * The connection properties dialog. This is used to determine the settings for - * connecting to a zookeeper instance - */ -public class ZooInspectorConnectionPropertiesDialog extends JDialog { - - private final HashMap components; - - /** - * @param lastConnectionProps - * - the last connection properties used. if this is the first - * conneciton since starting the applications this will be the - * default settings - * @param connectionPropertiesTemplateAndLabels - * - the connection properties and labels to show in this dialog - * @param zooInspectorPanel - * - the {@link ZooInspectorPanel} linked to this dialog - */ - public ZooInspectorConnectionPropertiesDialog( - Properties lastConnectionProps, - Pair>, Map> connectionPropertiesTemplateAndLabels, - final ZooInspectorPanel zooInspectorPanel) { - final Map> connectionPropertiesTemplate = connectionPropertiesTemplateAndLabels - .getKey(); - final Map connectionPropertiesLabels = connectionPropertiesTemplateAndLabels - .getValue(); - this.setLayout(new BorderLayout()); - this.setTitle("Connection Settings"); - this.setModal(true); - this.setAlwaysOnTop(true); - this.setResizable(false); - final JPanel options = new JPanel(); - final JFileChooser fileChooser = new JFileChooser(); - options.setLayout(new GridBagLayout()); - int i = 0; - components = new HashMap(); - for (Entry> entry : connectionPropertiesTemplate - .entrySet()) { - int rowPos = 2 * i + 1; - JLabel label = new JLabel(connectionPropertiesLabels.get(entry - .getKey())); - GridBagConstraints c1 = new GridBagConstraints(); - c1.gridx = 0; - c1.gridy = rowPos; - c1.gridwidth = 1; - c1.gridheight = 1; - c1.weightx = 0; - c1.weighty = 0; - c1.anchor = GridBagConstraints.WEST; - c1.fill = GridBagConstraints.HORIZONTAL; - c1.insets = new Insets(5, 5, 5, 5); - c1.ipadx = 0; - c1.ipady = 0; - options.add(label, c1); - if (entry.getValue().size() == 0) { - JTextField text = new JTextField(); - GridBagConstraints c2 = new GridBagConstraints(); - c2.gridx = 2; - c2.gridy = rowPos; - c2.gridwidth = 1; - c2.gridheight = 1; - c2.weightx = 0; - c2.weighty = 0; - c2.anchor = GridBagConstraints.WEST; - c2.fill = GridBagConstraints.HORIZONTAL; - c2.insets = new Insets(5, 5, 5, 5); - c2.ipadx = 0; - c2.ipady = 0; - options.add(text, c2); - components.put(entry.getKey(), text); - } else if (entry.getValue().size() == 1) { - JTextField text = new JTextField(entry.getValue().get(0)); - GridBagConstraints c2 = new GridBagConstraints(); - c2.gridx = 2; - c2.gridy = rowPos; - c2.gridwidth = 1; - c2.gridheight = 1; - c2.weightx = 0; - c2.weighty = 0; - c2.anchor = GridBagConstraints.WEST; - c2.fill = GridBagConstraints.HORIZONTAL; - c2.insets = new Insets(5, 5, 5, 5); - c2.ipadx = 0; - c2.ipady = 0; - options.add(text, c2); - components.put(entry.getKey(), text); - } else { - List list = entry.getValue(); - JComboBox combo = new JComboBox(list.toArray(new String[list - .size()])); - combo.setSelectedItem(list.get(0)); - GridBagConstraints c2 = new GridBagConstraints(); - c2.gridx = 2; - c2.gridy = rowPos; - c2.gridwidth = 1; - c2.gridheight = 1; - c2.weightx = 0; - c2.weighty = 0; - c2.anchor = GridBagConstraints.WEST; - c2.fill = GridBagConstraints.HORIZONTAL; - c2.insets = new Insets(5, 5, 5, 5); - c2.ipadx = 0; - c2.ipady = 0; - options.add(combo, c2); - components.put(entry.getKey(), combo); - } - i++; - } - loadConnectionProps(lastConnectionProps); - JPanel buttonsPanel = new JPanel(); - buttonsPanel.setLayout(new GridBagLayout()); - JButton loadPropsFileButton = new JButton("Load from file"); - loadPropsFileButton.addActionListener(new ActionListener() { - - public void actionPerformed(ActionEvent e) { - int result = fileChooser - .showOpenDialog(ZooInspectorConnectionPropertiesDialog.this); - if (result == JFileChooser.APPROVE_OPTION) { - File propsFilePath = fileChooser.getSelectedFile(); - Properties props = new Properties(); - try { - FileReader reader = new FileReader(propsFilePath); - try { - props.load(reader); - loadConnectionProps(props); - } finally { - reader.close(); - } - } catch (IOException ex) { - LoggerFactory - .getLogger() - .error( - "An Error occurred loading connection properties from file", - ex); - JOptionPane - .showMessageDialog( - ZooInspectorConnectionPropertiesDialog.this, - "An Error occurred loading connection properties from file", - "Error", JOptionPane.ERROR_MESSAGE); - } - options.revalidate(); - options.repaint(); - } - - } - }); - GridBagConstraints c3 = new GridBagConstraints(); - c3.gridx = 0; - c3.gridy = 0; - c3.gridwidth = 1; - c3.gridheight = 1; - c3.weightx = 0; - c3.weighty = 1; - c3.anchor = GridBagConstraints.SOUTHWEST; - c3.fill = GridBagConstraints.NONE; - c3.insets = new Insets(5, 5, 5, 5); - c3.ipadx = 0; - c3.ipady = 0; - buttonsPanel.add(loadPropsFileButton, c3); - JButton saveDefaultPropsFileButton = new JButton("Set As Default"); - saveDefaultPropsFileButton.addActionListener(new ActionListener() { - - public void actionPerformed(ActionEvent e) { - - Properties connectionProps = getConnectionProps(); - try { - zooInspectorPanel - .setdefaultConnectionProps(connectionProps); - } catch (IOException ex) { - LoggerFactory - .getLogger() - .error( - "An Error occurred saving the default connection properties file", - ex); - JOptionPane - .showMessageDialog( - ZooInspectorConnectionPropertiesDialog.this, - "An Error occurred saving the default connection properties file", - "Error", JOptionPane.ERROR_MESSAGE); - } - } - }); - GridBagConstraints c6 = new GridBagConstraints(); - c6.gridx = 1; - c6.gridy = 0; - c6.gridwidth = 1; - c6.gridheight = 1; - c6.weightx = 1; - c6.weighty = 1; - c6.anchor = GridBagConstraints.SOUTHWEST; - c6.fill = GridBagConstraints.NONE; - c6.insets = new Insets(5, 5, 5, 5); - c6.ipadx = 0; - c6.ipady = 0; - buttonsPanel.add(saveDefaultPropsFileButton, c6); - JButton okButton = new JButton("OK"); - okButton.addActionListener(new ActionListener() { - - public void actionPerformed(ActionEvent e) { - ZooInspectorConnectionPropertiesDialog.this.dispose(); - Properties connectionProps = getConnectionProps(); - zooInspectorPanel.connect(connectionProps); - } - }); - GridBagConstraints c4 = new GridBagConstraints(); - c4.gridx = 2; - c4.gridy = 0; - c4.gridwidth = 1; - c4.gridheight = 1; - c4.weightx = 0; - c4.weighty = 1; - c4.anchor = GridBagConstraints.SOUTH; - c4.fill = GridBagConstraints.HORIZONTAL; - c4.insets = new Insets(5, 5, 5, 5); - c4.ipadx = 0; - c4.ipady = 0; - buttonsPanel.add(okButton, c4); - JButton cancelButton = new JButton("Cancel"); - cancelButton.addActionListener(new ActionListener() { - - public void actionPerformed(ActionEvent e) { - ZooInspectorConnectionPropertiesDialog.this.dispose(); - } - }); - GridBagConstraints c5 = new GridBagConstraints(); - c5.gridx = 3; - c5.gridy = 0; - c5.gridwidth = 1; - c5.gridheight = 1; - c5.weightx = 0; - c5.weighty = 1; - c5.anchor = GridBagConstraints.SOUTH; - c5.fill = GridBagConstraints.HORIZONTAL; - c5.insets = new Insets(5, 5, 5, 5); - c5.ipadx = 0; - c5.ipady = 0; - buttonsPanel.add(cancelButton, c5); - this.add(options, BorderLayout.CENTER); - this.add(buttonsPanel, BorderLayout.SOUTH); - this.pack(); - } - - private void loadConnectionProps(Properties props) { - if (props != null) { - for (Object key : props.keySet()) { - String propsKey = (String) key; - if (components.containsKey(propsKey)) { - JComponent component = components.get(propsKey); - String value = props.getProperty(propsKey); - if (component instanceof JTextField) { - ((JTextField) component).setText(value); - } else if (component instanceof JComboBox) { - ((JComboBox) component).setSelectedItem(value); - } - } - } - } - } - - private Properties getConnectionProps() { - Properties connectionProps = new Properties(); - for (Entry entry : components.entrySet()) { - String value = null; - JComponent component = entry.getValue(); - if (component instanceof JTextField) { - value = ((JTextField) component).getText(); - } else if (component instanceof JComboBox) { - value = ((JComboBox) component).getSelectedItem().toString(); - } - connectionProps.put(entry.getKey(), value); - } - return connectionProps; - } -} diff --git a/pkg/registry/zookeeper-3.4.6/contrib/ZooInspector/src/java/org/apache/zookeeper/inspector/gui/ZooInspectorIconResources.java b/pkg/registry/zookeeper-3.4.6/contrib/ZooInspector/src/java/org/apache/zookeeper/inspector/gui/ZooInspectorIconResources.java deleted file mode 100644 index fa45ab31e..000000000 --- a/pkg/registry/zookeeper-3.4.6/contrib/ZooInspector/src/java/org/apache/zookeeper/inspector/gui/ZooInspectorIconResources.java +++ /dev/null @@ -1,118 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you 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. - */ -package org.apache.zookeeper.inspector.gui; - -import javax.swing.ImageIcon; - -/** - * A class containing static methods for retrieving {@link ImageIcon}s used in - * the application - */ -public class ZooInspectorIconResources { - - /** - * @return file icon - */ - public static ImageIcon getTreeLeafIcon() { - return new ImageIcon("icons/file_obj.gif"); //$NON-NLS-1$ - } - - /** - * @return folder open icon - */ - public static ImageIcon getTreeOpenIcon() { - return new ImageIcon("icons/fldr_obj.gif"); //$NON-NLS-1$ - } - - /** - * @return folder closed icon - */ - public static ImageIcon getTreeClosedIcon() { - return new ImageIcon("icons/fldr_obj.gif"); //$NON-NLS-1$ - } - - /** - * @return connect icon - */ - public static ImageIcon getConnectIcon() { - return new ImageIcon("icons/launch_run.gif"); //$NON-NLS-1$ - } - - /** - * @return disconnect icon - */ - public static ImageIcon getDisconnectIcon() { - return new ImageIcon("icons/launch_stop.gif"); //$NON-NLS-1$ - } - - /** - * @return save icon - */ - public static ImageIcon getSaveIcon() { - return new ImageIcon("icons/save_edit.gif"); //$NON-NLS-1$ - } - - /** - * @return add icon - */ - public static ImageIcon getAddNodeIcon() { - return new ImageIcon("icons/new_con.gif"); //$NON-NLS-1$ - } - - /** - * @return delete icon - */ - public static ImageIcon getDeleteNodeIcon() { - return new ImageIcon("icons/trash.gif"); //$NON-NLS-1$ - } - - /** - * @return refresh icon - */ - public static ImageIcon getRefreshIcon() { - return new ImageIcon("icons/refresh.gif"); //$NON-NLS-1$ - } - - /** - * @return information icon - */ - public static ImageIcon getInformationIcon() { - return new ImageIcon("icons/info_obj.gif"); //$NON-NLS-1$ - } - - /** - * @return node viewers icon - */ - public static ImageIcon getChangeNodeViewersIcon() { - return new ImageIcon("icons/edtsrclkup_co.gif"); //$NON-NLS-1$ - } - - /** - * @return up icon - */ - public static ImageIcon getUpIcon() { - return new ImageIcon("icons/search_prev.gif"); //$NON-NLS-1$ - } - - /** - * @return down icon - */ - public static ImageIcon getDownIcon() { - return new ImageIcon("icons/search_next.gif"); //$NON-NLS-1$ - } -} diff --git a/pkg/registry/zookeeper-3.4.6/contrib/ZooInspector/src/java/org/apache/zookeeper/inspector/gui/ZooInspectorNodeViewersDialog.java b/pkg/registry/zookeeper-3.4.6/contrib/ZooInspector/src/java/org/apache/zookeeper/inspector/gui/ZooInspectorNodeViewersDialog.java deleted file mode 100644 index fd0b00ac0..000000000 --- a/pkg/registry/zookeeper-3.4.6/contrib/ZooInspector/src/java/org/apache/zookeeper/inspector/gui/ZooInspectorNodeViewersDialog.java +++ /dev/null @@ -1,605 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you 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. - */ -package org.apache.zookeeper.inspector.gui; - -import java.awt.BorderLayout; -import java.awt.Component; -import java.awt.FlowLayout; -import java.awt.Frame; -import java.awt.GridBagConstraints; -import java.awt.GridBagLayout; -import java.awt.Insets; -import java.awt.datatransfer.Transferable; -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; -import java.io.File; -import java.io.IOException; -import java.util.ArrayList; -import java.util.Collection; -import java.util.List; - -import javax.swing.DefaultListCellRenderer; -import javax.swing.DefaultListModel; -import javax.swing.DropMode; -import javax.swing.JButton; -import javax.swing.JComponent; -import javax.swing.JDialog; -import javax.swing.JFileChooser; -import javax.swing.JLabel; -import javax.swing.JList; -import javax.swing.JOptionPane; -import javax.swing.JPanel; -import javax.swing.JScrollPane; -import javax.swing.JTextField; -import javax.swing.ListSelectionModel; -import javax.swing.TransferHandler; -import javax.swing.event.ListSelectionEvent; -import javax.swing.event.ListSelectionListener; - -import org.apache.zookeeper.inspector.gui.nodeviewer.ZooInspectorNodeViewer; -import org.apache.zookeeper.inspector.logger.LoggerFactory; -import org.apache.zookeeper.inspector.manager.ZooInspectorManager; - -/** - * A {@link JDialog} for configuring which {@link ZooInspectorNodeViewer}s to - * show in the application - */ -public class ZooInspectorNodeViewersDialog extends JDialog implements - ListSelectionListener { - - private final JButton upButton; - private final JButton downButton; - private final JButton removeButton; - private final JButton addButton; - private final JList viewersList; - private final JButton saveFileButton; - private final JButton loadFileButton; - private final JButton setDefaultsButton; - private final JFileChooser fileChooser = new JFileChooser(new File(".")); - - /** - * @param frame - * - the Frame from which the dialog is displayed - * @param currentViewers - * - the {@link ZooInspectorNodeViewer}s to show - * @param listeners - * - the {@link NodeViewersChangeListener}s which need to be - * notified of changes to the node viewers configuration - * @param manager - * - the {@link ZooInspectorManager} for the application - * - */ - public ZooInspectorNodeViewersDialog(Frame frame, - final List currentViewers, - final Collection listeners, - final ZooInspectorManager manager) { - super(frame); - final List newViewers = new ArrayList( - currentViewers); - this.setLayout(new BorderLayout()); - this.setIconImage(ZooInspectorIconResources.getChangeNodeViewersIcon() - .getImage()); - this.setTitle("About ZooInspector"); - this.setModal(true); - this.setAlwaysOnTop(true); - this.setResizable(true); - final JPanel panel = new JPanel(); - panel.setLayout(new GridBagLayout()); - viewersList = new JList(); - DefaultListModel model = new DefaultListModel(); - for (ZooInspectorNodeViewer viewer : newViewers) { - model.addElement(viewer); - } - viewersList.setModel(model); - viewersList.setCellRenderer(new DefaultListCellRenderer() { - @Override - public Component getListCellRendererComponent(JList list, - Object value, int index, boolean isSelected, - boolean cellHasFocus) { - ZooInspectorNodeViewer viewer = (ZooInspectorNodeViewer) value; - JLabel label = (JLabel) super.getListCellRendererComponent( - list, value, index, isSelected, cellHasFocus); - label.setText(viewer.getTitle()); - return label; - } - }); - viewersList.setDropMode(DropMode.INSERT); - viewersList.enableInputMethods(true); - viewersList.setDragEnabled(true); - viewersList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); - viewersList.getSelectionModel().addListSelectionListener(this); - viewersList.setTransferHandler(new TransferHandler() { - - @Override - public boolean canImport(TransferHandler.TransferSupport info) { - // we only import NodeViewers - if (!info - .isDataFlavorSupported(ZooInspectorNodeViewer.nodeViewerDataFlavor)) { - return false; - } - - JList.DropLocation dl = (JList.DropLocation) info - .getDropLocation(); - if (dl.getIndex() == -1) { - return false; - } - return true; - } - - @Override - public boolean importData(TransferHandler.TransferSupport info) { - JList.DropLocation dl = (JList.DropLocation) info - .getDropLocation(); - DefaultListModel listModel = (DefaultListModel) viewersList - .getModel(); - int index = dl.getIndex(); - boolean insert = dl.isInsert(); - // Get the string that is being dropped. - Transferable t = info.getTransferable(); - String data; - try { - data = (String) t - .getTransferData(ZooInspectorNodeViewer.nodeViewerDataFlavor); - } catch (Exception e) { - return false; - } - try { - ZooInspectorNodeViewer viewer = (ZooInspectorNodeViewer) Class - .forName(data).newInstance(); - if (listModel.contains(viewer)) { - listModel.removeElement(viewer); - } - if (insert) { - listModel.add(index, viewer); - } else { - listModel.set(index, viewer); - } - return true; - } catch (Exception e) { - LoggerFactory.getLogger().error( - "Error instantiating class: " + data, e); - return false; - } - - } - - @Override - public int getSourceActions(JComponent c) { - return MOVE; - } - - @Override - protected Transferable createTransferable(JComponent c) { - JList list = (JList) c; - ZooInspectorNodeViewer value = (ZooInspectorNodeViewer) list - .getSelectedValue(); - return value; - } - }); - JScrollPane scroller = new JScrollPane(viewersList); - GridBagConstraints c1 = new GridBagConstraints(); - c1.gridx = 0; - c1.gridy = 0; - c1.gridwidth = 3; - c1.gridheight = 3; - c1.weightx = 0; - c1.weighty = 1; - c1.anchor = GridBagConstraints.CENTER; - c1.fill = GridBagConstraints.BOTH; - c1.insets = new Insets(5, 5, 5, 5); - c1.ipadx = 0; - c1.ipady = 0; - panel.add(scroller, c1); - upButton = new JButton(ZooInspectorIconResources.getUpIcon()); - downButton = new JButton(ZooInspectorIconResources.getDownIcon()); - removeButton = new JButton(ZooInspectorIconResources - .getDeleteNodeIcon()); - addButton = new JButton(ZooInspectorIconResources.getAddNodeIcon()); - upButton.setEnabled(false); - downButton.setEnabled(false); - removeButton.setEnabled(false); - addButton.setEnabled(true); - upButton.setToolTipText("Move currently selected node viewer up"); - downButton.setToolTipText("Move currently selected node viewer down"); - removeButton.setToolTipText("Remove currently selected node viewer"); - addButton.setToolTipText("Add node viewer"); - final JTextField newViewerTextField = new JTextField(); - GridBagConstraints c2 = new GridBagConstraints(); - c2.gridx = 3; - c2.gridy = 0; - c2.gridwidth = 1; - c2.gridheight = 1; - c2.weightx = 0; - c2.weighty = 0; - c2.anchor = GridBagConstraints.NORTH; - c2.fill = GridBagConstraints.HORIZONTAL; - c2.insets = new Insets(5, 5, 5, 5); - c2.ipadx = 0; - c2.ipady = 0; - panel.add(upButton, c2); - GridBagConstraints c3 = new GridBagConstraints(); - c3.gridx = 3; - c3.gridy = 2; - c3.gridwidth = 1; - c3.gridheight = 1; - c3.weightx = 0; - c3.weighty = 0; - c3.anchor = GridBagConstraints.NORTH; - c3.fill = GridBagConstraints.HORIZONTAL; - c3.insets = new Insets(5, 5, 5, 5); - c3.ipadx = 0; - c3.ipady = 0; - panel.add(downButton, c3); - GridBagConstraints c4 = new GridBagConstraints(); - c4.gridx = 3; - c4.gridy = 1; - c4.gridwidth = 1; - c4.gridheight = 1; - c4.weightx = 0; - c4.weighty = 0; - c4.anchor = GridBagConstraints.NORTH; - c4.fill = GridBagConstraints.HORIZONTAL; - c4.insets = new Insets(5, 5, 5, 5); - c4.ipadx = 0; - c4.ipady = 0; - panel.add(removeButton, c4); - GridBagConstraints c5 = new GridBagConstraints(); - c5.gridx = 0; - c5.gridy = 3; - c5.gridwidth = 3; - c5.gridheight = 1; - c5.weightx = 0; - c5.weighty = 0; - c5.anchor = GridBagConstraints.CENTER; - c5.fill = GridBagConstraints.BOTH; - c5.insets = new Insets(5, 5, 5, 5); - c5.ipadx = 0; - c5.ipady = 0; - panel.add(newViewerTextField, c5); - GridBagConstraints c6 = new GridBagConstraints(); - c6.gridx = 3; - c6.gridy = 3; - c6.gridwidth = 1; - c6.gridheight = 1; - c6.weightx = 0; - c6.weighty = 0; - c6.anchor = GridBagConstraints.CENTER; - c6.fill = GridBagConstraints.BOTH; - c6.insets = new Insets(5, 5, 5, 5); - c6.ipadx = 0; - c6.ipady = 0; - panel.add(addButton, c6); - upButton.addActionListener(new ActionListener() { - - public void actionPerformed(ActionEvent e) { - DefaultListModel listModel = (DefaultListModel) viewersList - .getModel(); - ZooInspectorNodeViewer viewer = (ZooInspectorNodeViewer) viewersList - .getSelectedValue(); - int index = viewersList.getSelectedIndex(); - if (listModel.contains(viewer)) { - listModel.removeElementAt(index); - listModel.insertElementAt(viewer, index - 1); - viewersList.setSelectedValue(viewer, true); - } - } - }); - downButton.addActionListener(new ActionListener() { - - public void actionPerformed(ActionEvent e) { - DefaultListModel listModel = (DefaultListModel) viewersList - .getModel(); - ZooInspectorNodeViewer viewer = (ZooInspectorNodeViewer) viewersList - .getSelectedValue(); - int index = viewersList.getSelectedIndex(); - if (listModel.contains(viewer)) { - listModel.removeElementAt(index); - listModel.insertElementAt(viewer, index + 1); - viewersList.setSelectedValue(viewer, true); - } - } - }); - removeButton.addActionListener(new ActionListener() { - - public void actionPerformed(ActionEvent e) { - DefaultListModel listModel = (DefaultListModel) viewersList - .getModel(); - ZooInspectorNodeViewer viewer = (ZooInspectorNodeViewer) viewersList - .getSelectedValue(); - int index = viewersList.getSelectedIndex(); - if (listModel.contains(viewer)) { - listModel.removeElement(viewer); - viewersList - .setSelectedIndex(index == listModel.size() ? index - 1 - : index); - } - } - }); - addButton.addActionListener(new ActionListener() { - - public void actionPerformed(ActionEvent e) { - String className = newViewerTextField.getText(); - if (className == null || className.length() == 0) { - JOptionPane - .showMessageDialog( - ZooInspectorNodeViewersDialog.this, - "Please enter the full class name for a Node Viewer and click the add button", - "Input Error", JOptionPane.ERROR_MESSAGE); - } else { - try { - DefaultListModel listModel = (DefaultListModel) viewersList - .getModel(); - ZooInspectorNodeViewer viewer = (ZooInspectorNodeViewer) Class - .forName(className).newInstance(); - if (listModel.contains(viewer)) { - JOptionPane - .showMessageDialog( - ZooInspectorNodeViewersDialog.this, - "Node viewer already exists. Each node viewer can only be added once.", - "Input Error", - JOptionPane.ERROR_MESSAGE); - } else { - listModel.addElement(viewer); - } - } catch (Exception ex) { - LoggerFactory - .getLogger() - .error( - "An error occurred while instaniating the node viewer. ", - ex); - JOptionPane.showMessageDialog( - ZooInspectorNodeViewersDialog.this, - "An error occurred while instaniating the node viewer: " - + ex.getMessage(), "Error", - JOptionPane.ERROR_MESSAGE); - } - } - } - }); - saveFileButton = new JButton("Save"); - loadFileButton = new JButton("Load"); - setDefaultsButton = new JButton("Set As Defaults"); - saveFileButton - .setToolTipText("Save current node viewer configuration to file"); - loadFileButton - .setToolTipText("Load node viewer configuration frm file"); - setDefaultsButton - .setToolTipText("Set current configuration asd defaults"); - GridBagConstraints c7 = new GridBagConstraints(); - c7.gridx = 0; - c7.gridy = 4; - c7.gridwidth = 1; - c7.gridheight = 1; - c7.weightx = 1; - c7.weighty = 0; - c7.anchor = GridBagConstraints.WEST; - c7.fill = GridBagConstraints.VERTICAL; - c7.insets = new Insets(5, 5, 5, 5); - c7.ipadx = 0; - c7.ipady = 0; - panel.add(saveFileButton, c7); - GridBagConstraints c8 = new GridBagConstraints(); - c8.gridx = 1; - c8.gridy = 4; - c8.gridwidth = 1; - c8.gridheight = 1; - c8.weightx = 0; - c8.weighty = 0; - c8.anchor = GridBagConstraints.WEST; - c8.fill = GridBagConstraints.VERTICAL; - c8.insets = new Insets(5, 5, 5, 5); - c8.ipadx = 0; - c8.ipady = 0; - panel.add(loadFileButton, c8); - GridBagConstraints c9 = new GridBagConstraints(); - c9.gridx = 2; - c9.gridy = 4; - c9.gridwidth = 1; - c9.gridheight = 1; - c9.weightx = 0; - c9.weighty = 0; - c9.anchor = GridBagConstraints.WEST; - c9.fill = GridBagConstraints.VERTICAL; - c9.insets = new Insets(5, 5, 5, 5); - c9.ipadx = 0; - c9.ipady = 0; - panel.add(setDefaultsButton, c9); - saveFileButton.addActionListener(new ActionListener() { - - public void actionPerformed(ActionEvent e) { - int result = fileChooser - .showSaveDialog(ZooInspectorNodeViewersDialog.this); - if (result == JFileChooser.APPROVE_OPTION) { - File selectedFile = fileChooser.getSelectedFile(); - int answer = JOptionPane.YES_OPTION; - if (selectedFile.exists()) { - answer = JOptionPane - .showConfirmDialog( - ZooInspectorNodeViewersDialog.this, - "The specified file already exists. do you want to overwrite it?", - "Confirm Overwrite", - JOptionPane.YES_NO_OPTION, - JOptionPane.WARNING_MESSAGE); - } - if (answer == JOptionPane.YES_OPTION) { - DefaultListModel listModel = (DefaultListModel) viewersList - .getModel(); - List nodeViewersClassNames = new ArrayList(); - Object[] modelContents = listModel.toArray(); - for (Object o : modelContents) { - nodeViewersClassNames - .add(((ZooInspectorNodeViewer) o) - .getClass().getCanonicalName()); - } - try { - manager.saveNodeViewersFile(selectedFile, - nodeViewersClassNames); - } catch (IOException ex) { - LoggerFactory - .getLogger() - .error( - "Error saving node veiwer configuration from file.", - ex); - JOptionPane.showMessageDialog( - ZooInspectorNodeViewersDialog.this, - "Error saving node veiwer configuration from file: " - + ex.getMessage(), "Error", - JOptionPane.ERROR_MESSAGE); - } - } - } - } - }); - loadFileButton.addActionListener(new ActionListener() { - - public void actionPerformed(ActionEvent e) { - int result = fileChooser - .showOpenDialog(ZooInspectorNodeViewersDialog.this); - if (result == JFileChooser.APPROVE_OPTION) { - try { - List nodeViewersClassNames = manager - .loadNodeViewersFile(fileChooser - .getSelectedFile()); - List nodeViewers = new ArrayList(); - for (String nodeViewersClassName : nodeViewersClassNames) { - ZooInspectorNodeViewer viewer = (ZooInspectorNodeViewer) Class - .forName(nodeViewersClassName) - .newInstance(); - nodeViewers.add(viewer); - } - DefaultListModel model = new DefaultListModel(); - for (ZooInspectorNodeViewer viewer : nodeViewers) { - model.addElement(viewer); - } - viewersList.setModel(model); - panel.revalidate(); - panel.repaint(); - } catch (Exception ex) { - LoggerFactory - .getLogger() - .error( - "Error loading node veiwer configuration from file.", - ex); - JOptionPane.showMessageDialog( - ZooInspectorNodeViewersDialog.this, - "Error loading node veiwer configuration from file: " - + ex.getMessage(), "Error", - JOptionPane.ERROR_MESSAGE); - } - } - } - }); - setDefaultsButton.addActionListener(new ActionListener() { - - public void actionPerformed(ActionEvent e) { - int answer = JOptionPane - .showConfirmDialog( - ZooInspectorNodeViewersDialog.this, - "Are you sure you want to save this configuration as the default?", - "Confirm Set Defaults", - JOptionPane.YES_NO_OPTION, - JOptionPane.WARNING_MESSAGE); - if (answer == JOptionPane.YES_OPTION) { - DefaultListModel listModel = (DefaultListModel) viewersList - .getModel(); - List nodeViewersClassNames = new ArrayList(); - Object[] modelContents = listModel.toArray(); - for (Object o : modelContents) { - nodeViewersClassNames.add(((ZooInspectorNodeViewer) o) - .getClass().getCanonicalName()); - } - try { - manager - .setDefaultNodeViewerConfiguration(nodeViewersClassNames); - } catch (IOException ex) { - LoggerFactory - .getLogger() - .error( - "Error setting default node veiwer configuration.", - ex); - JOptionPane.showMessageDialog( - ZooInspectorNodeViewersDialog.this, - "Error setting default node veiwer configuration: " - + ex.getMessage(), "Error", - JOptionPane.ERROR_MESSAGE); - } - } - } - }); - - JPanel buttonsPanel = new JPanel(); - buttonsPanel.setLayout(new FlowLayout(FlowLayout.CENTER, 10, 10)); - JButton okButton = new JButton("OK"); - okButton.addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent e) { - ZooInspectorNodeViewersDialog.this.dispose(); - DefaultListModel listModel = (DefaultListModel) viewersList - .getModel(); - newViewers.clear(); - Object[] modelContents = listModel.toArray(); - for (Object o : modelContents) { - newViewers.add((ZooInspectorNodeViewer) o); - } - currentViewers.clear(); - currentViewers.addAll(newViewers); - for (NodeViewersChangeListener listener : listeners) { - listener.nodeViewersChanged(currentViewers); - } - } - }); - buttonsPanel.add(okButton); - JButton cancelButton = new JButton("Cancel"); - cancelButton.addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent e) { - ZooInspectorNodeViewersDialog.this.dispose(); - } - }); - buttonsPanel.add(cancelButton); - this.add(panel, BorderLayout.CENTER); - this.add(buttonsPanel, BorderLayout.SOUTH); - this.pack(); - } - - /* - * (non-Javadoc) - * - * @see - * javax.swing.event.ListSelectionListener#valueChanged(javax.swing.event - * .ListSelectionEvent) - */ - public void valueChanged(ListSelectionEvent e) { - int index = viewersList.getSelectedIndex(); - if (index == -1) { - removeButton.setEnabled(false); - upButton.setEnabled(false); - downButton.setEnabled(false); - } else { - removeButton.setEnabled(true); - if (index == 0) { - upButton.setEnabled(false); - } else { - upButton.setEnabled(true); - } - if (index == ((DefaultListModel) viewersList.getModel()).getSize()) { - downButton.setEnabled(false); - } else { - downButton.setEnabled(true); - } - } - } -} diff --git a/pkg/registry/zookeeper-3.4.6/contrib/ZooInspector/src/java/org/apache/zookeeper/inspector/gui/ZooInspectorNodeViewersPanel.java b/pkg/registry/zookeeper-3.4.6/contrib/ZooInspector/src/java/org/apache/zookeeper/inspector/gui/ZooInspectorNodeViewersPanel.java deleted file mode 100644 index 05c256b5a..000000000 --- a/pkg/registry/zookeeper-3.4.6/contrib/ZooInspector/src/java/org/apache/zookeeper/inspector/gui/ZooInspectorNodeViewersPanel.java +++ /dev/null @@ -1,140 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you 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. - */ -package org.apache.zookeeper.inspector.gui; - -import java.awt.BorderLayout; -import java.util.ArrayList; -import java.util.List; - -import javax.swing.JPanel; -import javax.swing.JTabbedPane; -import javax.swing.event.ChangeEvent; -import javax.swing.event.ChangeListener; -import javax.swing.event.TreeSelectionEvent; -import javax.swing.event.TreeSelectionListener; -import javax.swing.tree.TreePath; - -import org.apache.zookeeper.inspector.gui.nodeviewer.ZooInspectorNodeViewer; -import org.apache.zookeeper.inspector.manager.ZooInspectorManager; -import org.apache.zookeeper.inspector.manager.ZooInspectorNodeManager; - -/** - * This is the {@link JPanel} which contains the {@link ZooInspectorNodeViewer}s - */ -public class ZooInspectorNodeViewersPanel extends JPanel implements - TreeSelectionListener, ChangeListener { - - private final List nodeVeiwers = new ArrayList(); - private final List needsReload = new ArrayList(); - private final JTabbedPane tabbedPane; - private final List selectedNodes = new ArrayList(); - private final ZooInspectorNodeManager zooInspectorManager; - - /** - * @param zooInspectorManager - * - the {@link ZooInspectorManager} for the application - * @param nodeVeiwers - * - the {@link ZooInspectorNodeViewer}s to show - */ - public ZooInspectorNodeViewersPanel( - ZooInspectorNodeManager zooInspectorManager, - List nodeVeiwers) { - this.zooInspectorManager = zooInspectorManager; - this.setLayout(new BorderLayout()); - tabbedPane = new JTabbedPane(JTabbedPane.TOP, - JTabbedPane.WRAP_TAB_LAYOUT); - setNodeViewers(nodeVeiwers); - tabbedPane.addChangeListener(this); - this.add(tabbedPane, BorderLayout.CENTER); - reloadSelectedViewer(); - } - - /** - * @param nodeViewers - * - the {@link ZooInspectorNodeViewer}s to show - */ - public void setNodeViewers(List nodeViewers) { - this.nodeVeiwers.clear(); - this.nodeVeiwers.addAll(nodeViewers); - needsReload.clear(); - tabbedPane.removeAll(); - for (ZooInspectorNodeViewer nodeViewer : nodeVeiwers) { - nodeViewer.setZooInspectorManager(zooInspectorManager); - needsReload.add(true); - tabbedPane.add(nodeViewer.getTitle(), nodeViewer); - } - this.revalidate(); - this.repaint(); - } - - private void reloadSelectedViewer() { - int index = this.tabbedPane.getSelectedIndex(); - if (index != -1 && this.needsReload.get(index)) { - ZooInspectorNodeViewer viewer = this.nodeVeiwers.get(index); - viewer.nodeSelectionChanged(selectedNodes); - this.needsReload.set(index, false); - } - } - - /* - * (non-Javadoc) - * - * @see - * javax.swing.event.TreeSelectionListener#valueChanged(javax.swing.event - * .TreeSelectionEvent) - */ - public void valueChanged(TreeSelectionEvent e) { - TreePath[] paths = e.getPaths(); - selectedNodes.clear(); - for (TreePath path : paths) { - boolean appended = false; - StringBuilder sb = new StringBuilder(); - Object[] pathArray = path.getPath(); - for (Object o : pathArray) { - if (o != null) { - String nodeName = o.toString(); - if (nodeName != null) { - if (nodeName.length() > 0) { - appended = true; - sb.append("/"); //$NON-NLS-1$ - sb.append(o.toString()); - } - } - } - } - if (appended) { - selectedNodes.add(sb.toString()); - } - } - for (int i = 0; i < needsReload.size(); i++) { - this.needsReload.set(i, true); - } - reloadSelectedViewer(); - } - - /* - * (non-Javadoc) - * - * @see - * javax.swing.event.ChangeListener#stateChanged(javax.swing.event.ChangeEvent - * ) - */ - public void stateChanged(ChangeEvent e) { - reloadSelectedViewer(); - } -} diff --git a/pkg/registry/zookeeper-3.4.6/contrib/ZooInspector/src/java/org/apache/zookeeper/inspector/gui/ZooInspectorPanel.java b/pkg/registry/zookeeper-3.4.6/contrib/ZooInspector/src/java/org/apache/zookeeper/inspector/gui/ZooInspectorPanel.java deleted file mode 100644 index 7a4efafa4..000000000 --- a/pkg/registry/zookeeper-3.4.6/contrib/ZooInspector/src/java/org/apache/zookeeper/inspector/gui/ZooInspectorPanel.java +++ /dev/null @@ -1,361 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you 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. - */ -package org.apache.zookeeper.inspector.gui; - -import java.awt.BorderLayout; -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; -import java.io.IOException; -import java.util.ArrayList; -import java.util.List; -import java.util.Properties; -import java.util.concurrent.ExecutionException; - -import javax.swing.JButton; -import javax.swing.JOptionPane; -import javax.swing.JPanel; -import javax.swing.JScrollPane; -import javax.swing.JSplitPane; -import javax.swing.JToolBar; -import javax.swing.SwingWorker; - -import org.apache.zookeeper.inspector.gui.nodeviewer.ZooInspectorNodeViewer; -import org.apache.zookeeper.inspector.logger.LoggerFactory; -import org.apache.zookeeper.inspector.manager.ZooInspectorManager; - -/** - * The parent {@link JPanel} for the whole application - */ -public class ZooInspectorPanel extends JPanel implements - NodeViewersChangeListener { - private final JButton refreshButton; - private final JButton disconnectButton; - private final JButton connectButton; - private final ZooInspectorNodeViewersPanel nodeViewersPanel; - private final ZooInspectorTreeViewer treeViewer; - private final ZooInspectorManager zooInspectorManager; - private final JButton addNodeButton; - private final JButton deleteNodeButton; - private final JButton nodeViewersButton; - private final JButton aboutButton; - private final List listeners = new ArrayList(); - { - listeners.add(this); - } - - /** - * @param zooInspectorManager - * - the {@link ZooInspectorManager} for the application - */ - public ZooInspectorPanel(final ZooInspectorManager zooInspectorManager) { - this.zooInspectorManager = zooInspectorManager; - final ArrayList nodeViewers = new ArrayList(); - try { - List defaultNodeViewersClassNames = this.zooInspectorManager - .getDefaultNodeViewerConfiguration(); - for (String className : defaultNodeViewersClassNames) { - nodeViewers.add((ZooInspectorNodeViewer) Class.forName( - className).newInstance()); - } - } catch (Exception ex) { - LoggerFactory.getLogger().error( - "Error loading default node viewers.", ex); - JOptionPane.showMessageDialog(ZooInspectorPanel.this, - "Error loading default node viewers: " + ex.getMessage(), - "Error", JOptionPane.ERROR_MESSAGE); - } - nodeViewersPanel = new ZooInspectorNodeViewersPanel( - zooInspectorManager, nodeViewers); - treeViewer = new ZooInspectorTreeViewer(zooInspectorManager, - nodeViewersPanel); - this.setLayout(new BorderLayout()); - JToolBar toolbar = new JToolBar(); - toolbar.setFloatable(false); - connectButton = new JButton(ZooInspectorIconResources.getConnectIcon()); - disconnectButton = new JButton(ZooInspectorIconResources - .getDisconnectIcon()); - refreshButton = new JButton(ZooInspectorIconResources.getRefreshIcon()); - addNodeButton = new JButton(ZooInspectorIconResources.getAddNodeIcon()); - deleteNodeButton = new JButton(ZooInspectorIconResources - .getDeleteNodeIcon()); - nodeViewersButton = new JButton(ZooInspectorIconResources - .getChangeNodeViewersIcon()); - aboutButton = new JButton(ZooInspectorIconResources - .getInformationIcon()); - toolbar.add(connectButton); - toolbar.add(disconnectButton); - toolbar.add(refreshButton); - toolbar.add(addNodeButton); - toolbar.add(deleteNodeButton); - toolbar.add(nodeViewersButton); - toolbar.add(aboutButton); - aboutButton.setEnabled(true); - connectButton.setEnabled(true); - disconnectButton.setEnabled(false); - refreshButton.setEnabled(false); - addNodeButton.setEnabled(false); - deleteNodeButton.setEnabled(false); - nodeViewersButton.setEnabled(true); - nodeViewersButton.setToolTipText("Change Node Viewers"); - aboutButton.setToolTipText("About ZooInspector"); - connectButton.setToolTipText("Connect"); - disconnectButton.setToolTipText("Disconnect"); - refreshButton.setToolTipText("Refresh"); - addNodeButton.setToolTipText("Add Node"); - deleteNodeButton.setToolTipText("Delete Node"); - connectButton.addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent e) { - ZooInspectorConnectionPropertiesDialog zicpd = new ZooInspectorConnectionPropertiesDialog( - zooInspectorManager.getLastConnectionProps(), - zooInspectorManager.getConnectionPropertiesTemplate(), - ZooInspectorPanel.this); - zicpd.setVisible(true); - } - }); - disconnectButton.addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent e) { - disconnect(); - } - }); - refreshButton.addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent e) { - treeViewer.refreshView(); - } - }); - addNodeButton.addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent e) { - final List selectedNodes = treeViewer - .getSelectedNodes(); - if (selectedNodes.size() == 1) { - final String nodeName = JOptionPane.showInputDialog( - ZooInspectorPanel.this, - "Please Enter a name for the new node", - "Create Node", JOptionPane.INFORMATION_MESSAGE); - if (nodeName != null && nodeName.length() > 0) { - SwingWorker worker = new SwingWorker() { - - @Override - protected Boolean doInBackground() throws Exception { - return ZooInspectorPanel.this.zooInspectorManager - .createNode(selectedNodes.get(0), - nodeName); - } - - @Override - protected void done() { - treeViewer.refreshView(); - } - }; - worker.execute(); - } - } else { - JOptionPane.showMessageDialog(ZooInspectorPanel.this, - "Please select 1 parent node for the new node."); - } - } - }); - deleteNodeButton.addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent e) { - final List selectedNodes = treeViewer - .getSelectedNodes(); - if (selectedNodes.size() == 0) { - JOptionPane.showMessageDialog(ZooInspectorPanel.this, - "Please select at least 1 node to be deleted"); - } else { - int answer = JOptionPane.showConfirmDialog( - ZooInspectorPanel.this, - "Are you sure you want to delete the selected nodes?" - + "(This action cannot be reverted)", - "Confirm Delete", JOptionPane.YES_NO_OPTION, - JOptionPane.WARNING_MESSAGE); - if (answer == JOptionPane.YES_OPTION) { - SwingWorker worker = new SwingWorker() { - - @Override - protected Boolean doInBackground() throws Exception { - for (String nodePath : selectedNodes) { - ZooInspectorPanel.this.zooInspectorManager - .deleteNode(nodePath); - } - return true; - } - - @Override - protected void done() { - treeViewer.refreshView(); - } - }; - worker.execute(); - } - } - } - }); - nodeViewersButton.addActionListener(new ActionListener() { - - public void actionPerformed(ActionEvent e) { - ZooInspectorNodeViewersDialog nvd = new ZooInspectorNodeViewersDialog( - JOptionPane.getRootFrame(), nodeViewers, listeners, - zooInspectorManager); - nvd.setVisible(true); - } - }); - aboutButton.addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent e) { - ZooInspectorAboutDialog zicpd = new ZooInspectorAboutDialog( - JOptionPane.getRootFrame()); - zicpd.setVisible(true); - } - }); - JScrollPane treeScroller = new JScrollPane(treeViewer); - JSplitPane splitPane = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, - treeScroller, nodeViewersPanel); - splitPane.setResizeWeight(0.25); - this.add(splitPane, BorderLayout.CENTER); - this.add(toolbar, BorderLayout.NORTH); - } - - /** - * @param connectionProps - * the {@link Properties} for connecting to the zookeeper - * instance - */ - public void connect(final Properties connectionProps) { - SwingWorker worker = new SwingWorker() { - - @Override - protected Boolean doInBackground() throws Exception { - zooInspectorManager.setLastConnectionProps(connectionProps); - return zooInspectorManager.connect(connectionProps); - } - - @Override - protected void done() { - try { - if (get()) { - treeViewer.refreshView(); - connectButton.setEnabled(false); - disconnectButton.setEnabled(true); - refreshButton.setEnabled(true); - addNodeButton.setEnabled(true); - deleteNodeButton.setEnabled(true); - } else { - JOptionPane.showMessageDialog(ZooInspectorPanel.this, - "Unable to connect to zookeeper", "Error", - JOptionPane.ERROR_MESSAGE); - } - } catch (InterruptedException e) { - LoggerFactory - .getLogger() - .error( - "Error occurred while connecting to ZooKeeper server", - e); - } catch (ExecutionException e) { - LoggerFactory - .getLogger() - .error( - "Error occurred while connecting to ZooKeeper server", - e); - } - } - - }; - worker.execute(); - } - - /** - * - */ - public void disconnect() { - disconnect(false); - } - - /** - * @param wait - * - set this to true if the method should only return once the - * application has successfully disconnected - */ - public void disconnect(boolean wait) { - SwingWorker worker = new SwingWorker() { - - @Override - protected Boolean doInBackground() throws Exception { - return ZooInspectorPanel.this.zooInspectorManager.disconnect(); - } - - @Override - protected void done() { - try { - if (get()) { - treeViewer.clearView(); - connectButton.setEnabled(true); - disconnectButton.setEnabled(false); - refreshButton.setEnabled(false); - addNodeButton.setEnabled(false); - deleteNodeButton.setEnabled(false); - } - } catch (InterruptedException e) { - LoggerFactory - .getLogger() - .error( - "Error occurred while disconnecting from ZooKeeper server", - e); - } catch (ExecutionException e) { - LoggerFactory - .getLogger() - .error( - "Error occurred while disconnecting from ZooKeeper server", - e); - } - } - - }; - worker.execute(); - if (wait) { - while (!worker.isDone()) { - try { - Thread.sleep(100); - } catch (InterruptedException e) { - LoggerFactory - .getLogger() - .error( - "Error occurred while disconnecting from ZooKeeper server", - e); - } - } - } - } - - /* - * (non-Javadoc) - * - * @seeorg.apache.zookeeper.inspector.gui.NodeViewersChangeListener# - * nodeViewersChanged(java.util.List) - */ - public void nodeViewersChanged(List newViewers) { - this.nodeViewersPanel.setNodeViewers(newViewers); - } - - /** - * @param connectionProps - * @throws IOException - */ - public void setdefaultConnectionProps(Properties connectionProps) - throws IOException { - this.zooInspectorManager.saveDefaultConnectionFile(connectionProps); - } -} diff --git a/pkg/registry/zookeeper-3.4.6/contrib/ZooInspector/src/java/org/apache/zookeeper/inspector/gui/ZooInspectorTreeViewer.java b/pkg/registry/zookeeper-3.4.6/contrib/ZooInspector/src/java/org/apache/zookeeper/inspector/gui/ZooInspectorTreeViewer.java deleted file mode 100644 index 128b358eb..000000000 --- a/pkg/registry/zookeeper-3.4.6/contrib/ZooInspector/src/java/org/apache/zookeeper/inspector/gui/ZooInspectorTreeViewer.java +++ /dev/null @@ -1,362 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you 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. - */ -package org.apache.zookeeper.inspector.gui; - -import java.awt.BorderLayout; -import java.awt.Color; -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; -import java.awt.event.MouseAdapter; -import java.awt.event.MouseEvent; -import java.util.ArrayList; -import java.util.Collections; -import java.util.Enumeration; -import java.util.LinkedHashSet; -import java.util.List; -import java.util.Map; -import java.util.Set; - -import javax.swing.JMenuItem; -import javax.swing.JPanel; -import javax.swing.JPopupMenu; -import javax.swing.JTree; -import javax.swing.SwingWorker; -import javax.swing.event.TreeSelectionListener; -import javax.swing.tree.DefaultMutableTreeNode; -import javax.swing.tree.DefaultTreeCellRenderer; -import javax.swing.tree.DefaultTreeModel; -import javax.swing.tree.TreeNode; -import javax.swing.tree.TreePath; - -import org.apache.zookeeper.inspector.manager.NodeListener; -import org.apache.zookeeper.inspector.manager.ZooInspectorManager; - -import com.nitido.utils.toaster.Toaster; - -/** - * A {@link JPanel} for showing the tree view of all the nodes in the zookeeper - * instance - */ -public class ZooInspectorTreeViewer extends JPanel implements NodeListener { - private final ZooInspectorManager zooInspectorManager; - private final JTree tree; - private final Toaster toasterManager; - - /** - * @param zooInspectorManager - * - the {@link ZooInspectorManager} for the application - * @param listener - * - the {@link TreeSelectionListener} to listen for changes in - * the selected node on the node tree - */ - public ZooInspectorTreeViewer( - final ZooInspectorManager zooInspectorManager, - TreeSelectionListener listener) { - this.zooInspectorManager = zooInspectorManager; - this.setLayout(new BorderLayout()); - final JPopupMenu popupMenu = new JPopupMenu(); - final JMenuItem addNotify = new JMenuItem("Add Change Notification"); - this.toasterManager = new Toaster(); - this.toasterManager.setBorderColor(Color.BLACK); - this.toasterManager.setMessageColor(Color.BLACK); - this.toasterManager.setToasterColor(Color.WHITE); - addNotify.addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent e) { - List selectedNodes = getSelectedNodes(); - zooInspectorManager.addWatchers(selectedNodes, - ZooInspectorTreeViewer.this); - } - }); - final JMenuItem removeNotify = new JMenuItem( - "Remove Change Notification"); - removeNotify.addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent e) { - List selectedNodes = getSelectedNodes(); - zooInspectorManager.removeWatchers(selectedNodes); - } - }); - tree = new JTree(new DefaultMutableTreeNode()); - tree.setCellRenderer(new ZooInspectorTreeCellRenderer()); - tree.setEditable(false); - tree.getSelectionModel().addTreeSelectionListener(listener); - tree.addMouseListener(new MouseAdapter() { - @Override - public void mouseClicked(MouseEvent e) { - if (e.isPopupTrigger() || e.getButton() == MouseEvent.BUTTON3) { - // TODO only show add if a selected node isn't being - // watched, and only show remove if a selected node is being - // watched - popupMenu.removeAll(); - popupMenu.add(addNotify); - popupMenu.add(removeNotify); - popupMenu.show(ZooInspectorTreeViewer.this, e.getX(), e - .getY()); - } - } - }); - this.add(tree, BorderLayout.CENTER); - } - - /** - * Refresh the tree view - */ - public void refreshView() { - final Set expandedNodes = new LinkedHashSet(); - int rowCount = tree.getRowCount(); - for (int i = 0; i < rowCount; i++) { - TreePath path = tree.getPathForRow(i); - if (tree.isExpanded(path)) { - expandedNodes.add(path); - } - } - final TreePath[] selectedNodes = tree.getSelectionPaths(); - SwingWorker worker = new SwingWorker() { - - @Override - protected Boolean doInBackground() throws Exception { - tree.setModel(new DefaultTreeModel(new ZooInspectorTreeNode( - "/", null))); - return true; - } - - @Override - protected void done() { - for (TreePath path : expandedNodes) { - tree.expandPath(path); - } - tree.getSelectionModel().setSelectionPaths(selectedNodes); - } - }; - worker.execute(); - } - - /** - * clear the tree view of all nodes - */ - public void clearView() { - tree.setModel(new DefaultTreeModel(new DefaultMutableTreeNode())); - } - - /** - * @author Colin - * - */ - private static class ZooInspectorTreeCellRenderer extends - DefaultTreeCellRenderer { - public ZooInspectorTreeCellRenderer() { - setLeafIcon(ZooInspectorIconResources.getTreeLeafIcon()); - setOpenIcon(ZooInspectorIconResources.getTreeOpenIcon()); - setClosedIcon(ZooInspectorIconResources.getTreeClosedIcon()); - } - } - - /** - * @author Colin - * - */ - private class ZooInspectorTreeNode implements TreeNode { - private final String nodePath; - private final String nodeName; - private final ZooInspectorTreeNode parent; - - public ZooInspectorTreeNode(String nodePath, ZooInspectorTreeNode parent) { - this.parent = parent; - this.nodePath = nodePath; - int index = nodePath.lastIndexOf("/"); - if (index == -1) { - throw new IllegalArgumentException("Invalid node path" - + nodePath); - } - this.nodeName = nodePath.substring(index + 1); - } - - /* - * (non-Javadoc) - * - * @see javax.swing.tree.TreeNode#children() - */ - public Enumeration children() { - List children = zooInspectorManager - .getChildren(this.nodePath); - Collections.sort(children); - List returnChildren = new ArrayList(); - for (String child : children) { - returnChildren.add(new ZooInspectorTreeNode((this.nodePath - .equals("/") ? "" : this.nodePath) - + "/" + child, this)); - } - return Collections.enumeration(returnChildren); - } - - /* - * (non-Javadoc) - * - * @see javax.swing.tree.TreeNode#getAllowsChildren() - */ - public boolean getAllowsChildren() { - return zooInspectorManager.isAllowsChildren(this.nodePath); - } - - /* - * (non-Javadoc) - * - * @see javax.swing.tree.TreeNode#getChildAt(int) - */ - public TreeNode getChildAt(int childIndex) { - String child = zooInspectorManager.getNodeChild(this.nodePath, - childIndex); - if (child != null) { - return new ZooInspectorTreeNode((this.nodePath.equals("/") ? "" - : this.nodePath) - + "/" + child, this); - } - return null; - } - - /* - * (non-Javadoc) - * - * @see javax.swing.tree.TreeNode#getChildCount() - */ - public int getChildCount() { - return zooInspectorManager.getNumChildren(this.nodePath); - } - - /* - * (non-Javadoc) - * - * @see javax.swing.tree.TreeNode#getIndex(javax.swing.tree.TreeNode) - */ - public int getIndex(TreeNode node) { - return zooInspectorManager.getNodeIndex(this.nodePath); - } - - /* - * (non-Javadoc) - * - * @see javax.swing.tree.TreeNode#getParent() - */ - public TreeNode getParent() { - return this.parent; - } - - /* - * (non-Javadoc) - * - * @see javax.swing.tree.TreeNode#isLeaf() - */ - public boolean isLeaf() { - return !zooInspectorManager.hasChildren(this.nodePath); - } - - @Override - public String toString() { - return this.nodeName; - } - - @Override - public int hashCode() { - final int prime = 31; - int result = 1; - result = prime * result + getOuterType().hashCode(); - result = prime * result - + ((nodePath == null) ? 0 : nodePath.hashCode()); - result = prime * result - + ((parent == null) ? 0 : parent.hashCode()); - return result; - } - - @Override - public boolean equals(Object obj) { - if (this == obj) - return true; - if (obj == null) - return false; - if (getClass() != obj.getClass()) - return false; - ZooInspectorTreeNode other = (ZooInspectorTreeNode) obj; - if (!getOuterType().equals(other.getOuterType())) - return false; - if (nodePath == null) { - if (other.nodePath != null) - return false; - } else if (!nodePath.equals(other.nodePath)) - return false; - if (parent == null) { - if (other.parent != null) - return false; - } else if (!parent.equals(other.parent)) - return false; - return true; - } - - private ZooInspectorTreeViewer getOuterType() { - return ZooInspectorTreeViewer.this; - } - - } - - /** - * @return {@link List} of the currently selected nodes - */ - public List getSelectedNodes() { - TreePath[] paths = tree.getSelectionPaths(); - List selectedNodes = new ArrayList(); - if (paths != null) { - for (TreePath path : paths) { - StringBuilder sb = new StringBuilder(); - Object[] pathArray = path.getPath(); - for (Object o : pathArray) { - String nodeName = o.toString(); - if (nodeName.length() > 0) { - sb.append("/"); - sb.append(o.toString()); - } - } - selectedNodes.add(sb.toString()); - } - } - return selectedNodes; - } - - /* - * (non-Javadoc) - * - * @see - * org.apache.zookeeper.inspector.manager.NodeListener#processEvent(java - * .lang.String, java.lang.String, java.util.Map) - */ - public void processEvent(String nodePath, String eventType, - Map eventInfo) { - StringBuilder sb = new StringBuilder(); - sb.append("Node: "); - sb.append(nodePath); - sb.append("\nEvent: "); - sb.append(eventType); - if (eventInfo != null) { - for (Map.Entry entry : eventInfo.entrySet()) { - sb.append("\n"); - sb.append(entry.getKey()); - sb.append(": "); - sb.append(entry.getValue()); - } - } - this.toasterManager.showToaster(ZooInspectorIconResources - .getInformationIcon(), sb.toString()); - } -} diff --git a/pkg/registry/zookeeper-3.4.6/contrib/ZooInspector/src/java/org/apache/zookeeper/inspector/gui/about.html b/pkg/registry/zookeeper-3.4.6/contrib/ZooInspector/src/java/org/apache/zookeeper/inspector/gui/about.html deleted file mode 100644 index 17fb3dca2..000000000 --- a/pkg/registry/zookeeper-3.4.6/contrib/ZooInspector/src/java/org/apache/zookeeper/inspector/gui/about.html +++ /dev/null @@ -1,21 +0,0 @@ - - - - -ZooInspector v0.1 - - -

      ZooInspector was developed by Colin Goodheart-Smithe and is -available under the Apache Software Licence v2.0.

      -

      The Icons used were sourced from the Eclipse project (http://www.eclipse.org) and licensed -under the Eclipse Public Licence v1.0. [http://www.eclipse.org/org/documents/epl-v10.php] -

      -

      ZooKeeper is available from http://zookeeper.apache.org/ -and is licensed under an Apache Software Licence v2.0

      -

      The ApacheSoftware Licence v2.0 can be found at http://www.apache.org/licenses/LICENSE-2.0

      - - diff --git a/pkg/registry/zookeeper-3.4.6/contrib/ZooInspector/src/java/org/apache/zookeeper/inspector/gui/nodeviewer/NodeViewerACL.java b/pkg/registry/zookeeper-3.4.6/contrib/ZooInspector/src/java/org/apache/zookeeper/inspector/gui/nodeviewer/NodeViewerACL.java deleted file mode 100644 index 5ac203c28..000000000 --- a/pkg/registry/zookeeper-3.4.6/contrib/ZooInspector/src/java/org/apache/zookeeper/inspector/gui/nodeviewer/NodeViewerACL.java +++ /dev/null @@ -1,187 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you 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. - */ -package org.apache.zookeeper.inspector.gui.nodeviewer; - -import java.awt.BorderLayout; -import java.awt.Color; -import java.awt.GridBagConstraints; -import java.awt.GridBagLayout; -import java.awt.Insets; -import java.util.ArrayList; -import java.util.List; -import java.util.Map; -import java.util.concurrent.ExecutionException; - -import javax.swing.BorderFactory; -import javax.swing.JLabel; -import javax.swing.JPanel; -import javax.swing.JScrollPane; -import javax.swing.JTextField; -import javax.swing.SwingWorker; - -import org.apache.zookeeper.inspector.logger.LoggerFactory; -import org.apache.zookeeper.inspector.manager.ZooInspectorNodeManager; - -/** - * A node viewer for displaying the ACLs currently applied to the selected node - */ -public class NodeViewerACL extends ZooInspectorNodeViewer { - private ZooInspectorNodeManager zooInspectorManager; - private final JPanel aclDataPanel; - private String selectedNode; - - /** - * - */ - public NodeViewerACL() { - this.setLayout(new BorderLayout()); - this.aclDataPanel = new JPanel(); - this.aclDataPanel.setBackground(Color.WHITE); - JScrollPane scroller = new JScrollPane(this.aclDataPanel); - this.add(scroller, BorderLayout.CENTER); - } - - /* - * (non-Javadoc) - * - * @see - * org.apache.zookeeper.inspector.gui.nodeviewer.ZooInspectorNodeViewer# - * getTitle() - */ - @Override - public String getTitle() { - return "Node ACLs"; - } - - /* - * (non-Javadoc) - * - * @see - * org.apache.zookeeper.inspector.gui.nodeviewer.ZooInspectorNodeViewer# - * nodeSelectionChanged(java.util.Set) - */ - @Override - public void nodeSelectionChanged(List selectedNodes) { - this.aclDataPanel.removeAll(); - if (selectedNodes.size() > 0) { - this.selectedNode = selectedNodes.get(0); - SwingWorker>, Void> worker = new SwingWorker>, Void>() { - - @Override - protected List> doInBackground() - throws Exception { - return NodeViewerACL.this.zooInspectorManager - .getACLs(NodeViewerACL.this.selectedNode); - } - - @Override - protected void done() { - List> acls = null; - try { - acls = get(); - } catch (InterruptedException e) { - acls = new ArrayList>(); - LoggerFactory.getLogger().error( - "Error retrieving ACL Information for node: " - + NodeViewerACL.this.selectedNode, e); - } catch (ExecutionException e) { - acls = new ArrayList>(); - LoggerFactory.getLogger().error( - "Error retrieving ACL Information for node: " - + NodeViewerACL.this.selectedNode, e); - } - aclDataPanel.setLayout(new GridBagLayout()); - int j = 0; - for (Map data : acls) { - int rowPos = 2 * j + 1; - JPanel aclPanel = new JPanel(); - aclPanel.setBorder(BorderFactory - .createLineBorder(Color.BLACK)); - aclPanel.setBackground(Color.WHITE); - aclPanel.setLayout(new GridBagLayout()); - int i = 0; - for (Map.Entry entry : data.entrySet()) { - int rowPosACL = 2 * i + 1; - JLabel label = new JLabel(entry.getKey()); - JTextField text = new JTextField(entry.getValue()); - text.setEditable(false); - GridBagConstraints c1 = new GridBagConstraints(); - c1.gridx = 1; - c1.gridy = rowPosACL; - c1.gridwidth = 1; - c1.gridheight = 1; - c1.weightx = 0; - c1.weighty = 0; - c1.anchor = GridBagConstraints.NORTHWEST; - c1.fill = GridBagConstraints.BOTH; - c1.insets = new Insets(5, 5, 5, 5); - c1.ipadx = 0; - c1.ipady = 0; - aclPanel.add(label, c1); - GridBagConstraints c2 = new GridBagConstraints(); - c2.gridx = 3; - c2.gridy = rowPosACL; - c2.gridwidth = 1; - c2.gridheight = 1; - c2.weightx = 0; - c2.weighty = 0; - c2.anchor = GridBagConstraints.NORTHWEST; - c2.fill = GridBagConstraints.BOTH; - c2.insets = new Insets(5, 5, 5, 5); - c2.ipadx = 0; - c2.ipady = 0; - aclPanel.add(text, c2); - i++; - } - GridBagConstraints c = new GridBagConstraints(); - c.gridx = 1; - c.gridy = rowPos; - c.gridwidth = 1; - c.gridheight = 1; - c.weightx = 1; - c.weighty = 1; - c.anchor = GridBagConstraints.NORTHWEST; - c.fill = GridBagConstraints.NONE; - c.insets = new Insets(5, 5, 5, 5); - c.ipadx = 0; - c.ipady = 0; - aclDataPanel.add(aclPanel, c); - } - NodeViewerACL.this.aclDataPanel.revalidate(); - NodeViewerACL.this.aclDataPanel.repaint(); - } - }; - worker.execute(); - } - } - - /* - * (non-Javadoc) - * - * @see - * org.apache.zookeeper.inspector.gui.nodeviewer.ZooInspectorNodeViewer# - * setZooInspectorManager - * (org.apache.zookeeper.inspector.manager.ZooInspectorNodeManager) - */ - @Override - public void setZooInspectorManager( - ZooInspectorNodeManager zooInspectorManager) { - this.zooInspectorManager = zooInspectorManager; - } - -} diff --git a/pkg/registry/zookeeper-3.4.6/contrib/ZooInspector/src/java/org/apache/zookeeper/inspector/gui/nodeviewer/NodeViewerData.java b/pkg/registry/zookeeper-3.4.6/contrib/ZooInspector/src/java/org/apache/zookeeper/inspector/gui/nodeviewer/NodeViewerData.java deleted file mode 100644 index 001cb7b21..000000000 --- a/pkg/registry/zookeeper-3.4.6/contrib/ZooInspector/src/java/org/apache/zookeeper/inspector/gui/nodeviewer/NodeViewerData.java +++ /dev/null @@ -1,146 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you 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. - */ -package org.apache.zookeeper.inspector.gui.nodeviewer; - -import java.awt.BorderLayout; -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; -import java.util.List; -import java.util.concurrent.ExecutionException; - -import javax.swing.JButton; -import javax.swing.JOptionPane; -import javax.swing.JScrollPane; -import javax.swing.JTextPane; -import javax.swing.JToolBar; -import javax.swing.SwingWorker; - -import org.apache.zookeeper.inspector.gui.ZooInspectorIconResources; -import org.apache.zookeeper.inspector.logger.LoggerFactory; -import org.apache.zookeeper.inspector.manager.ZooInspectorNodeManager; - -/** - * A node viewer for displaying the data for the currently selected node - */ -public class NodeViewerData extends ZooInspectorNodeViewer { - private ZooInspectorNodeManager zooInspectorManager; - private final JTextPane dataArea; - private final JToolBar toolbar; - private String selectedNode; - - /** - * - */ - public NodeViewerData() { - this.setLayout(new BorderLayout()); - this.dataArea = new JTextPane(); - this.toolbar = new JToolBar(); - this.toolbar.setFloatable(false); - JScrollPane scroller = new JScrollPane(this.dataArea); - scroller - .setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_NEVER); - this.add(scroller, BorderLayout.CENTER); - this.add(this.toolbar, BorderLayout.NORTH); - JButton saveButton = new JButton(ZooInspectorIconResources - .getSaveIcon()); - saveButton.addActionListener(new ActionListener() { - - public void actionPerformed(ActionEvent e) { - if (selectedNode != null) { - if (JOptionPane.showConfirmDialog(NodeViewerData.this, - "Are you sure you want to save this node?" - + " (this action cannot be reverted)", - "Confirm Save", JOptionPane.YES_NO_OPTION, - JOptionPane.WARNING_MESSAGE) == JOptionPane.YES_OPTION) { - zooInspectorManager.setData(selectedNode, dataArea - .getText()); - } - } - } - }); - this.toolbar.add(saveButton); - - } - - /* - * (non-Javadoc) - * - * @see - * org.apache.zookeeper.inspector.gui.nodeviewer.ZooInspectorNodeViewer# - * getTitle() - */ - @Override - public String getTitle() { - return "Node Data"; - } - - /* - * (non-Javadoc) - * - * @see - * org.apache.zookeeper.inspector.gui.nodeviewer.ZooInspectorNodeViewer# - * nodeSelectionChanged(java.util.Set) - */ - @Override - public void nodeSelectionChanged(List selectedNodes) { - if (selectedNodes.size() > 0) { - this.selectedNode = selectedNodes.get(0); - SwingWorker worker = new SwingWorker() { - - @Override - protected String doInBackground() throws Exception { - return NodeViewerData.this.zooInspectorManager - .getData(NodeViewerData.this.selectedNode); - } - - @Override - protected void done() { - String data = ""; - try { - data = get(); - } catch (InterruptedException e) { - LoggerFactory.getLogger().error( - "Error retrieving data for node: " - + NodeViewerData.this.selectedNode, e); - } catch (ExecutionException e) { - LoggerFactory.getLogger().error( - "Error retrieving data for node: " - + NodeViewerData.this.selectedNode, e); - } - NodeViewerData.this.dataArea.setText(data); - } - }; - worker.execute(); - } - } - - /* - * (non-Javadoc) - * - * @see - * org.apache.zookeeper.inspector.gui.nodeviewer.ZooInspectorNodeViewer# - * setZooInspectorManager - * (org.apache.zookeeper.inspector.manager.ZooInspectorNodeManager) - */ - @Override - public void setZooInspectorManager( - ZooInspectorNodeManager zooInspectorManager) { - this.zooInspectorManager = zooInspectorManager; - } - -} diff --git a/pkg/registry/zookeeper-3.4.6/contrib/ZooInspector/src/java/org/apache/zookeeper/inspector/gui/nodeviewer/NodeViewerMetaData.java b/pkg/registry/zookeeper-3.4.6/contrib/ZooInspector/src/java/org/apache/zookeeper/inspector/gui/nodeviewer/NodeViewerMetaData.java deleted file mode 100644 index 5c2df8d88..000000000 --- a/pkg/registry/zookeeper-3.4.6/contrib/ZooInspector/src/java/org/apache/zookeeper/inspector/gui/nodeviewer/NodeViewerMetaData.java +++ /dev/null @@ -1,186 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you 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. - */ -package org.apache.zookeeper.inspector.gui.nodeviewer; - -import java.awt.BorderLayout; -import java.awt.Color; -import java.awt.GridBagConstraints; -import java.awt.GridBagLayout; -import java.awt.Insets; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.concurrent.ExecutionException; - -import javax.swing.JLabel; -import javax.swing.JPanel; -import javax.swing.JScrollPane; -import javax.swing.JTextField; -import javax.swing.SwingWorker; - -import org.apache.zookeeper.data.Stat; -import org.apache.zookeeper.inspector.logger.LoggerFactory; -import org.apache.zookeeper.inspector.manager.ZooInspectorNodeManager; - -/** - * A node viewer for displaying the meta data for the currently selected node. - * The meta data is essentially the information from the {@link Stat} for the - * node - */ -public class NodeViewerMetaData extends ZooInspectorNodeViewer { - private ZooInspectorNodeManager zooInspectorManager; - private final JPanel metaDataPanel; - private String selectedNode; - - /** - * - */ - public NodeViewerMetaData() { - this.setLayout(new BorderLayout()); - this.metaDataPanel = new JPanel(); - this.metaDataPanel.setBackground(Color.WHITE); - JScrollPane scroller = new JScrollPane(this.metaDataPanel); - this.add(scroller, BorderLayout.CENTER); - } - - /* - * (non-Javadoc) - * - * @see - * org.apache.zookeeper.inspector.gui.nodeviewer.ZooInspectorNodeViewer# - * getTitle() - */ - @Override - public String getTitle() { - return "Node Metadata"; - } - - /* - * (non-Javadoc) - * - * @see - * org.apache.zookeeper.inspector.gui.nodeviewer.ZooInspectorNodeViewer# - * nodeSelectionChanged(java.util.Set) - */ - @Override - public void nodeSelectionChanged(List selectedNodes) { - this.metaDataPanel.removeAll(); - if (selectedNodes.size() > 0) { - this.selectedNode = selectedNodes.get(0); - SwingWorker, Void> worker = new SwingWorker, Void>() { - - @Override - protected Map doInBackground() throws Exception { - return NodeViewerMetaData.this.zooInspectorManager - .getNodeMeta(NodeViewerMetaData.this.selectedNode); - } - - @Override - protected void done() { - Map data = null; - try { - data = get(); - } catch (InterruptedException e) { - data = new HashMap(); - LoggerFactory.getLogger().error( - "Error retrieving meta data for node: " - + NodeViewerMetaData.this.selectedNode, - e); - } catch (ExecutionException e) { - data = new HashMap(); - LoggerFactory.getLogger().error( - "Error retrieving meta data for node: " - + NodeViewerMetaData.this.selectedNode, - e); - } - NodeViewerMetaData.this.metaDataPanel - .setLayout(new GridBagLayout()); - JPanel infoPanel = new JPanel(); - infoPanel.setBackground(Color.WHITE); - infoPanel.setLayout(new GridBagLayout()); - int i = 0; - int rowPos = 0; - for (Map.Entry entry : data.entrySet()) { - rowPos = 2 * i + 1; - JLabel label = new JLabel(entry.getKey()); - JTextField text = new JTextField(entry.getValue()); - text.setEditable(false); - GridBagConstraints c1 = new GridBagConstraints(); - c1.gridx = 0; - c1.gridy = rowPos; - c1.gridwidth = 1; - c1.gridheight = 1; - c1.weightx = 0; - c1.weighty = 0; - c1.anchor = GridBagConstraints.WEST; - c1.fill = GridBagConstraints.HORIZONTAL; - c1.insets = new Insets(5, 5, 5, 5); - c1.ipadx = 0; - c1.ipady = 0; - infoPanel.add(label, c1); - GridBagConstraints c2 = new GridBagConstraints(); - c2.gridx = 2; - c2.gridy = rowPos; - c2.gridwidth = 1; - c2.gridheight = 1; - c2.weightx = 0; - c2.weighty = 0; - c2.anchor = GridBagConstraints.WEST; - c2.fill = GridBagConstraints.HORIZONTAL; - c2.insets = new Insets(5, 5, 5, 5); - c2.ipadx = 0; - c2.ipady = 0; - infoPanel.add(text, c2); - i++; - } - GridBagConstraints c = new GridBagConstraints(); - c.gridx = 1; - c.gridy = rowPos; - c.gridwidth = 1; - c.gridheight = 1; - c.weightx = 1; - c.weighty = 1; - c.anchor = GridBagConstraints.NORTHWEST; - c.fill = GridBagConstraints.NONE; - c.insets = new Insets(5, 5, 5, 5); - c.ipadx = 0; - c.ipady = 0; - NodeViewerMetaData.this.metaDataPanel.add(infoPanel, c); - NodeViewerMetaData.this.metaDataPanel.revalidate(); - NodeViewerMetaData.this.metaDataPanel.repaint(); - } - }; - worker.execute(); - } - } - - /* - * (non-Javadoc) - * - * @see - * org.apache.zookeeper.inspector.gui.nodeviewer.ZooInspectorNodeViewer# - * setZooInspectorManager - * (org.apache.zookeeper.inspector.manager.ZooInspectorNodeManager) - */ - @Override - public void setZooInspectorManager( - ZooInspectorNodeManager zooInspectorManager) { - this.zooInspectorManager = zooInspectorManager; - } - -} diff --git a/pkg/registry/zookeeper-3.4.6/contrib/ZooInspector/src/java/org/apache/zookeeper/inspector/gui/nodeviewer/ZooInspectorNodeViewer.java b/pkg/registry/zookeeper-3.4.6/contrib/ZooInspector/src/java/org/apache/zookeeper/inspector/gui/nodeviewer/ZooInspectorNodeViewer.java deleted file mode 100644 index 32119a85c..000000000 --- a/pkg/registry/zookeeper-3.4.6/contrib/ZooInspector/src/java/org/apache/zookeeper/inspector/gui/nodeviewer/ZooInspectorNodeViewer.java +++ /dev/null @@ -1,138 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you 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. - */ -package org.apache.zookeeper.inspector.gui.nodeviewer; - -import java.awt.datatransfer.DataFlavor; -import java.awt.datatransfer.Transferable; -import java.awt.datatransfer.UnsupportedFlavorException; -import java.io.IOException; -import java.util.List; - -import javax.swing.JPanel; - -import org.apache.zookeeper.inspector.manager.ZooInspectorNodeManager; - -/** - * A {@link JPanel} for displaying information about the currently selected - * node(s) - */ -public abstract class ZooInspectorNodeViewer extends JPanel implements - Transferable { - /** - * The {@link DataFlavor} used for DnD in the node viewer configuration - * dialog - */ - public static final DataFlavor nodeViewerDataFlavor = new DataFlavor( - ZooInspectorNodeViewer.class, "nodeviewer"); - - /** - * @param zooInspectorManager - */ - public abstract void setZooInspectorManager( - ZooInspectorNodeManager zooInspectorManager); - - /** - * Called whenever the selected nodes in the tree view changes. - * - * @param selectedNodes - * - the nodes currently selected in the tree view - * - */ - public abstract void nodeSelectionChanged(List selectedNodes); - - /** - * @return the title of the node viewer. this will be shown on the tab for - * this node viewer. - */ - public abstract String getTitle(); - - /* - * (non-Javadoc) - * - * @see - * java.awt.datatransfer.Transferable#getTransferData(java.awt.datatransfer - * .DataFlavor) - */ - public Object getTransferData(DataFlavor flavor) - throws UnsupportedFlavorException, IOException { - if (flavor.equals(nodeViewerDataFlavor)) { - return this.getClass().getCanonicalName(); - } else { - return null; - } - } - - /* - * (non-Javadoc) - * - * @see java.awt.datatransfer.Transferable#getTransferDataFlavors() - */ - public DataFlavor[] getTransferDataFlavors() { - return new DataFlavor[] { nodeViewerDataFlavor }; - } - - /* - * (non-Javadoc) - * - * @seejava.awt.datatransfer.Transferable#isDataFlavorSupported(java.awt. - * datatransfer.DataFlavor) - */ - public boolean isDataFlavorSupported(DataFlavor flavor) { - return flavor.equals(nodeViewerDataFlavor); - } - - /* - * (non-Javadoc) - * - * @see java.lang.Object#hashCode() - */ - @Override - public int hashCode() { - final int prime = 31; - int result = 1; - result = prime * result - + ((getTitle() == null) ? 0 : getTitle().hashCode()); - return result; - } - - /* - * (non-Javadoc) - * - * @see java.lang.Object#equals(java.lang.Object) - */ - @Override - public boolean equals(Object obj) { - if (this == obj) - return true; - if (obj == null) - return false; - if (getClass() != obj.getClass()) - return false; - ZooInspectorNodeViewer other = (ZooInspectorNodeViewer) obj; - if (getClass().getCanonicalName() != other.getClass() - .getCanonicalName()) { - return false; - } - if (getTitle() == null) { - if (other.getTitle() != null) - return false; - } else if (!getTitle().equals(other.getTitle())) - return false; - return true; - } -} diff --git a/pkg/registry/zookeeper-3.4.6/contrib/ZooInspector/src/java/org/apache/zookeeper/inspector/logger/LoggerFactory.java b/pkg/registry/zookeeper-3.4.6/contrib/ZooInspector/src/java/org/apache/zookeeper/inspector/logger/LoggerFactory.java deleted file mode 100644 index e4fae4169..000000000 --- a/pkg/registry/zookeeper-3.4.6/contrib/ZooInspector/src/java/org/apache/zookeeper/inspector/logger/LoggerFactory.java +++ /dev/null @@ -1,36 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you 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. - */ -package org.apache.zookeeper.inspector.logger; - -/** - * Provides a {@link Logger} for use across the entire application - * - */ -public class LoggerFactory -{ - private static final org.slf4j.Logger logger = org.slf4j.LoggerFactory.getLogger("org.apache.zookeeper.inspector"); //$NON-NLS-1$ - - /** - * @return {@link Logger} for ZooInspector - */ - public static org.slf4j.Logger getLogger() - { - return logger; - } - -} diff --git a/pkg/registry/zookeeper-3.4.6/contrib/ZooInspector/src/java/org/apache/zookeeper/inspector/manager/NodeListener.java b/pkg/registry/zookeeper-3.4.6/contrib/ZooInspector/src/java/org/apache/zookeeper/inspector/manager/NodeListener.java deleted file mode 100644 index fe55a45b8..000000000 --- a/pkg/registry/zookeeper-3.4.6/contrib/ZooInspector/src/java/org/apache/zookeeper/inspector/manager/NodeListener.java +++ /dev/null @@ -1,37 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you 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. - */ -package org.apache.zookeeper.inspector.manager; - -import java.util.Map; - -/** - * A Listener for Events on zookeeper nodes - */ -public interface NodeListener { - /** - * @param nodePath - * - the path of the node - * @param eventType - * - the event type - * @param eventInfo - * - a {@link Map} containing any other information about this - * event - */ - public void processEvent(String nodePath, String eventType, - Map eventInfo); -} diff --git a/pkg/registry/zookeeper-3.4.6/contrib/ZooInspector/src/java/org/apache/zookeeper/inspector/manager/Pair.java b/pkg/registry/zookeeper-3.4.6/contrib/ZooInspector/src/java/org/apache/zookeeper/inspector/manager/Pair.java deleted file mode 100644 index b72950c95..000000000 --- a/pkg/registry/zookeeper-3.4.6/contrib/ZooInspector/src/java/org/apache/zookeeper/inspector/manager/Pair.java +++ /dev/null @@ -1,120 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you 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. - */ -package org.apache.zookeeper.inspector.manager; - -/** - * A utility class for storing a pair of objects - * - * @param - * @param - */ -public class Pair { - private K key; - private V value; - - /** - * @param key - * @param value - */ - public Pair(K key, V value) { - this.key = key; - this.value = value; - } - - /** - * - */ - public Pair() { - // Do Nothing - } - - /** - * @return key - */ - public K getKey() { - return key; - } - - /** - * @param key - */ - public void setKey(K key) { - this.key = key; - } - - /** - * @return value - */ - public V getValue() { - return value; - } - - /** - * @param value - */ - public void setValue(V value) { - this.value = value; - } - - @Override - public String toString() { - return "Pair [" + key + ", " + value + "]"; - } - - /* - * (non-Javadoc) - * - * @see java.lang.Object#hashCode() - */ - @Override - public int hashCode() { - final int prime = 31; - int result = 1; - result = prime * result + ((key == null) ? 0 : key.hashCode()); - result = prime * result + ((value == null) ? 0 : value.hashCode()); - return result; - } - - /* - * (non-Javadoc) - * - * @see java.lang.Object#equals(java.lang.Object) - */ - @Override - public boolean equals(Object obj) { - if (this == obj) - return true; - if (obj == null) - return false; - if (getClass() != obj.getClass()) - return false; - Pair other = (Pair) obj; - if (key == null) { - if (other.key != null) - return false; - } else if (!key.equals(other.key)) - return false; - if (value == null) { - if (other.value != null) - return false; - } else if (!value.equals(other.value)) - return false; - return true; - } - -} diff --git a/pkg/registry/zookeeper-3.4.6/contrib/ZooInspector/src/java/org/apache/zookeeper/inspector/manager/ZooInspectorManager.java b/pkg/registry/zookeeper-3.4.6/contrib/ZooInspector/src/java/org/apache/zookeeper/inspector/manager/ZooInspectorManager.java deleted file mode 100644 index 74c3cb20e..000000000 --- a/pkg/registry/zookeeper-3.4.6/contrib/ZooInspector/src/java/org/apache/zookeeper/inspector/manager/ZooInspectorManager.java +++ /dev/null @@ -1,139 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you 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. - */ -package org.apache.zookeeper.inspector.manager; - -import java.io.File; -import java.io.IOException; -import java.util.Collection; -import java.util.List; -import java.util.Map; -import java.util.Properties; - -import javax.swing.JComboBox; -import javax.swing.JTextField; - -/** - * A Manager for all interactions between the application and the Zookeeper - * instance - */ -public interface ZooInspectorManager extends ZooInspectorNodeManager, - ZooInspectorNodeTreeManager { - - /** - * @param connectionProps - * @return true if successfully connected - */ - public boolean connect(Properties connectionProps); - - /** - * @return true if successfully disconnected - */ - public boolean disconnect(); - - /** - * @return a {@link Pair} containing the following: - * ]]> - - -
      - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Important: All versions, of all nodes, under the given node are deleted. -

      - If there is an error with deleting one of the sub-nodes in the tree, - this operation would abort and would be the responsibility of the app to handle the same. - - See {@link #delete(String, int)} for more details. - - @throws IllegalArgumentException if an invalid path is specified]]> - - - - - - - - - - - - Important: All versions, of all nodes, under the given node are deleted. -

      - If there is an error with deleting one of the sub-nodes in the tree, - this operation would abort and would be the responsibility of the app to handle the same. -

      - @param zk the zookeeper handle - @param pathRoot the path to be deleted - @param cb call back method - @param ctx the context the callback method is called with - @throws IllegalArgumentException if an invalid path is specified]]> - - - - - - - - - - Important: This is not an atomic snapshot of the tree ever, but the - state as it exists across multiple RPCs from zkClient to the ensemble. - For practical purposes, it is suggested to bring the clients to the ensemble - down (i.e. prevent writes to pathRoot) to 'simulate' a snapshot behavior. - - @param zk the zookeeper handle - @param pathRoot The znode path, for which the entire subtree needs to be listed. - @throws InterruptedException - @throws KeeperException]]> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Session establishment is asynchronous. This constructor will initiate - connection to the server and return immediately - potentially (usually) - before the session is fully established. The watcher argument specifies - the watcher that will be notified of any changes in state. This - notification can come at any point before or after the constructor call - has returned. -

      - The instantiated ZooKeeper client object will pick an arbitrary server - from the connectString and attempt to connect to it. If establishment of - the connection fails, another server in the connect string will be tried - (the order is non-deterministic, as we random shuffle the list), until a - connection is established. The client will continue attempts until the - session is explicitly closed. -

      - Added in 3.2.0: An optional "chroot" suffix may also be appended to the - connection string. This will run the client commands while interpreting - all paths relative to this root (similar to the unix chroot command). - - @param connectString - comma separated host:port pairs, each corresponding to a zk - server. e.g. "127.0.0.1:3000,127.0.0.1:3001,127.0.0.1:3002" If - the optional chroot suffix is used the example would look - like: "127.0.0.1:3000,127.0.0.1:3001,127.0.0.1:3002/app/a" - where the client would be rooted at "/app/a" and all paths - would be relative to this root - ie getting/setting/etc... - "/foo/bar" would result in operations being run on - "/app/a/foo/bar" (from the server perspective). - @param sessionTimeout - session timeout in milliseconds - @param watcher - a watcher object which will be notified of state changes, may - also be notified for node events - - @throws IOException - in cases of network failure - @throws IllegalArgumentException - if an invalid chroot path is specified]]> - - - - - - - Session establishment is asynchronous. This constructor will initiate - connection to the server and return immediately - potentially (usually) - before the session is fully established. The watcher argument specifies - the watcher that will be notified of any changes in state. This - notification can come at any point before or after the constructor call - has returned. -

      - The instantiated ZooKeeper client object will pick an arbitrary server - from the connectString and attempt to connect to it. If establishment of - the connection fails, another server in the connect string will be tried - (the order is non-deterministic, as we random shuffle the list), until a - connection is established. The client will continue attempts until the - session is explicitly closed. -

      - Added in 3.2.0: An optional "chroot" suffix may also be appended to the - connection string. This will run the client commands while interpreting - all paths relative to this root (similar to the unix chroot command). - - @param connectString - comma separated host:port pairs, each corresponding to a zk - server. e.g. "127.0.0.1:3000,127.0.0.1:3001,127.0.0.1:3002" If - the optional chroot suffix is used the example would look - like: "127.0.0.1:3000,127.0.0.1:3001,127.0.0.1:3002/app/a" - where the client would be rooted at "/app/a" and all paths - would be relative to this root - ie getting/setting/etc... - "/foo/bar" would result in operations being run on - "/app/a/foo/bar" (from the server perspective). - @param sessionTimeout - session timeout in milliseconds - @param watcher - a watcher object which will be notified of state changes, may - also be notified for node events - @param canBeReadOnly - (added in 3.4) whether the created client is allowed to go to - read-only mode in case of partitioning. Read-only mode - basically means that if the client can't find any majority - servers but there's partitioned server it could reach, it - connects to one in read-only mode, i.e. read requests are - allowed while write requests are not. It continues seeking for - majority in the background. - - @throws IOException - in cases of network failure - @throws IllegalArgumentException - if an invalid chroot path is specified]]> - - - - - - - Session establishment is asynchronous. This constructor will initiate - connection to the server and return immediately - potentially (usually) - before the session is fully established. The watcher argument specifies - the watcher that will be notified of any changes in state. This - notification can come at any point before or after the constructor call - has returned. -

      - The instantiated ZooKeeper client object will pick an arbitrary server - from the connectString and attempt to connect to it. If establishment of - the connection fails, another server in the connect string will be tried - (the order is non-deterministic, as we random shuffle the list), until a - connection is established. The client will continue attempts until the - session is explicitly closed (or the session is expired by the server). -

      - Added in 3.2.0: An optional "chroot" suffix may also be appended to the - connection string. This will run the client commands while interpreting - all paths relative to this root (similar to the unix chroot command). -

      - Use {@link #getSessionId} and {@link #getSessionPasswd} on an established - client connection, these values must be passed as sessionId and - sessionPasswd respectively if reconnecting. Otherwise, if not - reconnecting, use the other constructor which does not require these - parameters. - - @param connectString - comma separated host:port pairs, each corresponding to a zk - server. e.g. "127.0.0.1:3000,127.0.0.1:3001,127.0.0.1:3002" - If the optional chroot suffix is used the example would look - like: "127.0.0.1:3000,127.0.0.1:3001,127.0.0.1:3002/app/a" - where the client would be rooted at "/app/a" and all paths - would be relative to this root - ie getting/setting/etc... - "/foo/bar" would result in operations being run on - "/app/a/foo/bar" (from the server perspective). - @param sessionTimeout - session timeout in milliseconds - @param watcher - a watcher object which will be notified of state changes, may - also be notified for node events - @param sessionId - specific session id to use if reconnecting - @param sessionPasswd - password for this session - - @throws IOException in cases of network failure - @throws IllegalArgumentException if an invalid chroot path is specified - @throws IllegalArgumentException for an invalid list of ZooKeeper hosts]]> - - - - - - - Session establishment is asynchronous. This constructor will initiate - connection to the server and return immediately - potentially (usually) - before the session is fully established. The watcher argument specifies - the watcher that will be notified of any changes in state. This - notification can come at any point before or after the constructor call - has returned. -

      - The instantiated ZooKeeper client object will pick an arbitrary server - from the connectString and attempt to connect to it. If establishment of - the connection fails, another server in the connect string will be tried - (the order is non-deterministic, as we random shuffle the list), until a - connection is established. The client will continue attempts until the - session is explicitly closed (or the session is expired by the server). -

      - Added in 3.2.0: An optional "chroot" suffix may also be appended to the - connection string. This will run the client commands while interpreting - all paths relative to this root (similar to the unix chroot command). -

      - Use {@link #getSessionId} and {@link #getSessionPasswd} on an established - client connection, these values must be passed as sessionId and - sessionPasswd respectively if reconnecting. Otherwise, if not - reconnecting, use the other constructor which does not require these - parameters. - - @param connectString - comma separated host:port pairs, each corresponding to a zk - server. e.g. "127.0.0.1:3000,127.0.0.1:3001,127.0.0.1:3002" - If the optional chroot suffix is used the example would look - like: "127.0.0.1:3000,127.0.0.1:3001,127.0.0.1:3002/app/a" - where the client would be rooted at "/app/a" and all paths - would be relative to this root - ie getting/setting/etc... - "/foo/bar" would result in operations being run on - "/app/a/foo/bar" (from the server perspective). - @param sessionTimeout - session timeout in milliseconds - @param watcher - a watcher object which will be notified of state changes, may - also be notified for node events - @param sessionId - specific session id to use if reconnecting - @param sessionPasswd - password for this session - @param canBeReadOnly - (added in 3.4) whether the created client is allowed to go to - read-only mode in case of partitioning. Read-only mode - basically means that if the client can't find any majority - servers but there's partitioned server it could reach, it - connects to one in read-only mode, i.e. read requests are - allowed while write requests are not. It continues seeking for - majority in the background. - - @throws IOException in cases of network failure - @throws IllegalArgumentException if an invalid chroot path is specified]]> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - The flags argument specifies whether the created node will be ephemeral - or not. -

      - An ephemeral node will be removed by the ZooKeeper automatically when the - session associated with the creation of the node expires. -

      - The flags argument can also specify to create a sequential node. The - actual path name of a sequential node will be the given path plus a - suffix "i" where i is the current sequential number of the node. The sequence - number is always fixed length of 10 digits, 0 padded. Once - such a node is created, the sequential number will be incremented by one. -

      - If a node with the same actual path already exists in the ZooKeeper, a - KeeperException with error code KeeperException.NodeExists will be - thrown. Note that since a different actual path is used for each - invocation of creating sequential node with the same path argument, the - call will never throw "file exists" KeeperException. -

      - If the parent node does not exist in the ZooKeeper, a KeeperException - with error code KeeperException.NoNode will be thrown. -

      - An ephemeral node cannot have children. If the parent node of the given - path is ephemeral, a KeeperException with error code - KeeperException.NoChildrenForEphemerals will be thrown. -

      - This operation, if successful, will trigger all the watches left on the - node of the given path by exists and getData API calls, and the watches - left on the parent node by getChildren API calls. -

      - If a node is created successfully, the ZooKeeper server will trigger the - watches on the path left by exists calls, and the watches on the parent - of the node by getChildren calls. -

      - The maximum allowable size of the data array is 1 MB (1,048,576 bytes). - Arrays larger than this will cause a KeeperExecption to be thrown. - - @param path - the path for the node - @param data - the initial data for the node - @param acl - the acl for the node - @param createMode - specifying whether the node to be created is ephemeral - and/or sequential - @return the actual path of the created node - @throws KeeperException if the server returns a non-zero error code - @throws KeeperException.InvalidACLException if the ACL is invalid, null, or empty - @throws InterruptedException if the transaction is interrupted - @throws IllegalArgumentException if an invalid path is specified]]> - - - - - - - - - - - - - - - - - - - - - A KeeperException with error code KeeperException.NoNode will be thrown - if the nodes does not exist. -

      - A KeeperException with error code KeeperException.BadVersion will be - thrown if the given version does not match the node's version. -

      - A KeeperException with error code KeeperException.NotEmpty will be thrown - if the node has children. -

      - This operation, if successful, will trigger all the watches on the node - of the given path left by exists API calls, and the watches on the parent - node left by getChildren API calls. - - @param path - the path of the node to be deleted. - @param version - the expected node version. - @throws InterruptedException IF the server transaction is interrupted - @throws KeeperException If the server signals an error with a non-zero - return code. - @throws IllegalArgumentException if an invalid path is specified]]> - - - - - - - - - On success, a list of results is returned. - On failure, an exception is raised which contains partial results and - error details, see {@link KeeperException#getResults} -

      - Note: The maximum allowable size of all of the data arrays in all of - the setData operations in this single request is typically 1 MB - (1,048,576 bytes). This limit is specified on the server via - jute.maxbuffer. - Requests larger than this will cause a KeeperException to be - thrown. - - @param ops An iterable that contains the operations to be done. - These should be created using the factory methods on {@link Op}. - @return A list of results, one for each input Op, the order of - which exactly matches the order of the ops input - operations. - @throws InterruptedException If the operation was interrupted. - The operation may or may not have succeeded, but will not have - partially succeeded if this exception is thrown. - @throws KeeperException If the operation could not be completed - due to some error in doing one of the specified ops. - @throws IllegalArgumentException if an invalid path is specified - - @since 3.4.0]]> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - If the watch is non-null and the call is successful (no exception is thrown), - a watch will be left on the node with the given path. The watch will be - triggered by a successful operation that creates/delete the node or sets - the data on the node. - - @param path the node path - @param watcher explicit watcher - @return the stat of the node of the given path; return null if no such a - node exists. - @throws KeeperException If the server signals an error - @throws InterruptedException If the server transaction is interrupted. - @throws IllegalArgumentException if an invalid path is specified]]> - - - - - - - - - - If the watch is true and the call is successful (no exception is thrown), - a watch will be left on the node with the given path. The watch will be - triggered by a successful operation that creates/delete the node or sets - the data on the node. - - @param path - the node path - @param watch - whether need to watch this node - @return the stat of the node of the given path; return null if no such a - node exists. - @throws KeeperException If the server signals an error - @throws InterruptedException If the server transaction is interrupted.]]> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - If the watch is non-null and the call is successful (no exception is - thrown), a watch will be left on the node with the given path. The watch - will be triggered by a successful operation that sets data on the node, or - deletes the node. -

      - A KeeperException with error code KeeperException.NoNode will be thrown - if no node with the given path exists. - - @param path the given path - @param watcher explicit watcher - @param stat the stat of the node - @return the data of the node - @throws KeeperException If the server signals an error with a non-zero error code - @throws InterruptedException If the server transaction is interrupted. - @throws IllegalArgumentException if an invalid path is specified]]> - - - - - - - - - - - If the watch is true and the call is successful (no exception is - thrown), a watch will be left on the node with the given path. The watch - will be triggered by a successful operation that sets data on the node, or - deletes the node. -

      - A KeeperException with error code KeeperException.NoNode will be thrown - if no node with the given path exists. - - @param path the given path - @param watch whether need to watch this node - @param stat the stat of the node - @return the data of the node - @throws KeeperException If the server signals an error with a non-zero error code - @throws InterruptedException If the server transaction is interrupted.]]> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - This operation, if successful, will trigger all the watches on the node - of the given path left by getData calls. -

      - A KeeperException with error code KeeperException.NoNode will be thrown - if no node with the given path exists. -

      - A KeeperException with error code KeeperException.BadVersion will be - thrown if the given version does not match the node's version. -

      - The maximum allowable size of the data array is 1 MB (1,048,576 bytes). - Arrays larger than this will cause a KeeperException to be thrown. - - @param path - the path of the node - @param data - the data to set - @param version - the expected matching version - @return the state of the node - @throws InterruptedException If the server transaction is interrupted. - @throws KeeperException If the server signals an error with a non-zero error code. - @throws IllegalArgumentException if an invalid path is specified]]> - - - - - - - - - - - - - - - - - - - - A KeeperException with error code KeeperException.NoNode will be thrown - if no node with the given path exists. - - @param path - the given path for the node - @param stat - the stat of the node will be copied to this parameter. - @return the ACL array of the given node. - @throws InterruptedException If the server transaction is interrupted. - @throws KeeperException If the server signals an error with a non-zero error code. - @throws IllegalArgumentException if an invalid path is specified]]> - - - - - - - - - - - - - - - - - - - - A KeeperException with error code KeeperException.NoNode will be thrown - if no node with the given path exists. -

      - A KeeperException with error code KeeperException.BadVersion will be - thrown if the given version does not match the node's version. - - @param path - @param acl - @param version - @return the stat of the node. - @throws InterruptedException If the server transaction is interrupted. - @throws KeeperException If the server signals an error with a non-zero error code. - @throws org.apache.zookeeper.KeeperException.InvalidACLException If the acl is invalide. - @throws IllegalArgumentException if an invalid path is specified]]> - - - - - - - - - - - - - - - - - - - - If the watch is non-null and the call is successful (no exception is thrown), - a watch will be left on the node with the given path. The watch willbe - triggered by a successful operation that deletes the node of the given - path or creates/delete a child under the node. -

      - The list of children returned is not sorted and no guarantee is provided - as to its natural or lexical order. -

      - A KeeperException with error code KeeperException.NoNode will be thrown - if no node with the given path exists. - - @param path - @param watcher explicit watcher - @return an unordered array of children of the node with the given path - @throws InterruptedException If the server transaction is interrupted. - @throws KeeperException If the server signals an error with a non-zero error code. - @throws IllegalArgumentException if an invalid path is specified]]> - - - - - - - - - - If the watch is true and the call is successful (no exception is thrown), - a watch will be left on the node with the given path. The watch willbe - triggered by a successful operation that deletes the node of the given - path or creates/delete a child under the node. -

      - The list of children returned is not sorted and no guarantee is provided - as to its natural or lexical order. -

      - A KeeperException with error code KeeperException.NoNode will be thrown - if no node with the given path exists. - - @param path - @param watch - @return an unordered array of children of the node with the given path - @throws InterruptedException If the server transaction is interrupted. - @throws KeeperException If the server signals an error with a non-zero error code.]]> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - If the watch is non-null and the call is successful (no exception is thrown), - a watch will be left on the node with the given path. The watch willbe - triggered by a successful operation that deletes the node of the given - path or creates/delete a child under the node. -

      - The list of children returned is not sorted and no guarantee is provided - as to its natural or lexical order. -

      - A KeeperException with error code KeeperException.NoNode will be thrown - if no node with the given path exists. - - @since 3.3.0 - - @param path - @param watcher explicit watcher - @param stat stat of the znode designated by path - @return an unordered array of children of the node with the given path - @throws InterruptedException If the server transaction is interrupted. - @throws KeeperException If the server signals an error with a non-zero error code. - @throws IllegalArgumentException if an invalid path is specified]]> - - - - - - - - - - - If the watch is true and the call is successful (no exception is thrown), - a watch will be left on the node with the given path. The watch willbe - triggered by a successful operation that deletes the node of the given - path or creates/delete a child under the node. -

      - The list of children returned is not sorted and no guarantee is provided - as to its natural or lexical order. -

      - A KeeperException with error code KeeperException.NoNode will be thrown - if no node with the given path exists. - - @since 3.3.0 - - @param path - @param watch - @param stat stat of the znode designated by path - @return an unordered array of children of the node with the given path - @throws InterruptedException If the server transaction is interrupted. - @throws KeeperException If the server signals an error with a non-zero - error code.]]> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Once a connection to a server is established, a session ID is assigned to the - client. The client will send heart beats to the server periodically to keep - the session valid. -

      - The application can call ZooKeeper APIs through a client as long as the - session ID of the client remains valid. -

      - If for some reason, the client fails to send heart beats to the server for a - prolonged period of time (exceeding the sessionTimeout value, for instance), - the server will expire the session, and the session ID will become invalid. - The client object will no longer be usable. To make ZooKeeper API calls, the - application must create a new client object. -

      - If the ZooKeeper server the client currently connects to fails or otherwise - does not respond, the client will automatically try to connect to another - server before its session ID expires. If successful, the application can - continue to use the client. -

      - The ZooKeeper API methods are either synchronous or asynchronous. Synchronous - methods blocks until the server has responded. Asynchronous methods just queue - the request for sending and return immediately. They take a callback object that - will be executed either on successful execution of the request or on error with - an appropriate return code (rc) indicating the error. -

      - Some successful ZooKeeper API calls can leave watches on the "data nodes" in - the ZooKeeper server. Other successful ZooKeeper API calls can trigger those - watches. Once a watch is triggered, an event will be delivered to the client - which left the watch at the first place. Each watch can be triggered only - once. Thus, up to one event will be delivered to a client for every watch it - leaves. -

      - A client needs an object of a class implementing Watcher interface for - processing the events delivered to the client. - - When a client drops current connection and re-connects to a server, all the - existing watches are considered as being triggered but the undelivered events - are lost. To emulate this, the client will generate a special event to tell - the event handler a connection has been dropped. This special event has type - EventNone and state sKeeperStateDisconnected.]]> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/pkg/registry/zookeeper-3.4.6/lib/jdiff/zookeeper_3.4.6.xml b/pkg/registry/zookeeper-3.4.6/lib/jdiff/zookeeper_3.4.6.xml deleted file mode 100644 index f91f61149..000000000 --- a/pkg/registry/zookeeper-3.4.6/lib/jdiff/zookeeper_3.4.6.xml +++ /dev/null @@ -1,4559 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - null. - @param memoryLimit virtual memory limit - @return a String[] with the ulimit command arguments or - null if we are running on a non *nix platform or - if the limit is unspecified.]]> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Shell interface. - @param cmd shell command to execute. - @return the output of the executed command.]]> - - - - - - - - - Shell interface. - @param env the map of environment key=value - @param cmd shell command to execute. - @param timeout time in milliseconds after which script should be marked timeout - @return the output of the executed command.o]]> - - - - - - - - Shell interface. - @param env the map of environment key=value - @param cmd shell command to execute. - @return the output of the executed command.]]> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Shell can be used to run unix commands like du or - df. It also offers facilities to gate commands by - time-intervals.]]> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ShellCommandExecutorshould be used in cases where the output - of the command needs no explicit parsing and where the command, working - directory and the environment remains unchanged. The output of the command - is stored as-is and is expected to be small.]]> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

    4. --short - prints a short version string "1.2.3" -
    5. --revision - prints a short version string with the SVN - repository revision "1.2.3-94" -
    6. --full - prints the revision and the build date - ]]> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Important: All versions, of all nodes, under the given node are deleted. -

      - If there is an error with deleting one of the sub-nodes in the tree, - this operation would abort and would be the responsibility of the app to handle the same. - - See {@link #delete(String, int)} for more details. - - @throws IllegalArgumentException if an invalid path is specified]]> - - - - - - - - - - - - Important: All versions, of all nodes, under the given node are deleted. -

      - If there is an error with deleting one of the sub-nodes in the tree, - this operation would abort and would be the responsibility of the app to handle the same. -

      - @param zk the zookeeper handle - @param pathRoot the path to be deleted - @param cb call back method - @param ctx the context the callback method is called with - @throws IllegalArgumentException if an invalid path is specified]]> - - - - - - - - - - Important: This is not an atomic snapshot of the tree ever, but the - state as it exists across multiple RPCs from zkClient to the ensemble. - For practical purposes, it is suggested to bring the clients to the ensemble - down (i.e. prevent writes to pathRoot) to 'simulate' a snapshot behavior. - - @param zk the zookeeper handle - @param pathRoot The znode path, for which the entire subtree needs to be listed. - @throws InterruptedException - @throws KeeperException]]> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Session establishment is asynchronous. This constructor will initiate - connection to the server and return immediately - potentially (usually) - before the session is fully established. The watcher argument specifies - the watcher that will be notified of any changes in state. This - notification can come at any point before or after the constructor call - has returned. -

      - The instantiated ZooKeeper client object will pick an arbitrary server - from the connectString and attempt to connect to it. If establishment of - the connection fails, another server in the connect string will be tried - (the order is non-deterministic, as we random shuffle the list), until a - connection is established. The client will continue attempts until the - session is explicitly closed. -

      - Added in 3.2.0: An optional "chroot" suffix may also be appended to the - connection string. This will run the client commands while interpreting - all paths relative to this root (similar to the unix chroot command). - - @param connectString - comma separated host:port pairs, each corresponding to a zk - server. e.g. "127.0.0.1:3000,127.0.0.1:3001,127.0.0.1:3002" If - the optional chroot suffix is used the example would look - like: "127.0.0.1:3000,127.0.0.1:3001,127.0.0.1:3002/app/a" - where the client would be rooted at "/app/a" and all paths - would be relative to this root - ie getting/setting/etc... - "/foo/bar" would result in operations being run on - "/app/a/foo/bar" (from the server perspective). - @param sessionTimeout - session timeout in milliseconds - @param watcher - a watcher object which will be notified of state changes, may - also be notified for node events - - @throws IOException - in cases of network failure - @throws IllegalArgumentException - if an invalid chroot path is specified]]> - - - - - - - Session establishment is asynchronous. This constructor will initiate - connection to the server and return immediately - potentially (usually) - before the session is fully established. The watcher argument specifies - the watcher that will be notified of any changes in state. This - notification can come at any point before or after the constructor call - has returned. -

      - The instantiated ZooKeeper client object will pick an arbitrary server - from the connectString and attempt to connect to it. If establishment of - the connection fails, another server in the connect string will be tried - (the order is non-deterministic, as we random shuffle the list), until a - connection is established. The client will continue attempts until the - session is explicitly closed. -

      - Added in 3.2.0: An optional "chroot" suffix may also be appended to the - connection string. This will run the client commands while interpreting - all paths relative to this root (similar to the unix chroot command). - - @param connectString - comma separated host:port pairs, each corresponding to a zk - server. e.g. "127.0.0.1:3000,127.0.0.1:3001,127.0.0.1:3002" If - the optional chroot suffix is used the example would look - like: "127.0.0.1:3000,127.0.0.1:3001,127.0.0.1:3002/app/a" - where the client would be rooted at "/app/a" and all paths - would be relative to this root - ie getting/setting/etc... - "/foo/bar" would result in operations being run on - "/app/a/foo/bar" (from the server perspective). - @param sessionTimeout - session timeout in milliseconds - @param watcher - a watcher object which will be notified of state changes, may - also be notified for node events - @param canBeReadOnly - (added in 3.4) whether the created client is allowed to go to - read-only mode in case of partitioning. Read-only mode - basically means that if the client can't find any majority - servers but there's partitioned server it could reach, it - connects to one in read-only mode, i.e. read requests are - allowed while write requests are not. It continues seeking for - majority in the background. - - @throws IOException - in cases of network failure - @throws IllegalArgumentException - if an invalid chroot path is specified]]> - - - - - - - Session establishment is asynchronous. This constructor will initiate - connection to the server and return immediately - potentially (usually) - before the session is fully established. The watcher argument specifies - the watcher that will be notified of any changes in state. This - notification can come at any point before or after the constructor call - has returned. -

      - The instantiated ZooKeeper client object will pick an arbitrary server - from the connectString and attempt to connect to it. If establishment of - the connection fails, another server in the connect string will be tried - (the order is non-deterministic, as we random shuffle the list), until a - connection is established. The client will continue attempts until the - session is explicitly closed (or the session is expired by the server). -

      - Added in 3.2.0: An optional "chroot" suffix may also be appended to the - connection string. This will run the client commands while interpreting - all paths relative to this root (similar to the unix chroot command). -

      - Use {@link #getSessionId} and {@link #getSessionPasswd} on an established - client connection, these values must be passed as sessionId and - sessionPasswd respectively if reconnecting. Otherwise, if not - reconnecting, use the other constructor which does not require these - parameters. - - @param connectString - comma separated host:port pairs, each corresponding to a zk - server. e.g. "127.0.0.1:3000,127.0.0.1:3001,127.0.0.1:3002" - If the optional chroot suffix is used the example would look - like: "127.0.0.1:3000,127.0.0.1:3001,127.0.0.1:3002/app/a" - where the client would be rooted at "/app/a" and all paths - would be relative to this root - ie getting/setting/etc... - "/foo/bar" would result in operations being run on - "/app/a/foo/bar" (from the server perspective). - @param sessionTimeout - session timeout in milliseconds - @param watcher - a watcher object which will be notified of state changes, may - also be notified for node events - @param sessionId - specific session id to use if reconnecting - @param sessionPasswd - password for this session - - @throws IOException in cases of network failure - @throws IllegalArgumentException if an invalid chroot path is specified - @throws IllegalArgumentException for an invalid list of ZooKeeper hosts]]> - - - - - - - Session establishment is asynchronous. This constructor will initiate - connection to the server and return immediately - potentially (usually) - before the session is fully established. The watcher argument specifies - the watcher that will be notified of any changes in state. This - notification can come at any point before or after the constructor call - has returned. -

      - The instantiated ZooKeeper client object will pick an arbitrary server - from the connectString and attempt to connect to it. If establishment of - the connection fails, another server in the connect string will be tried - (the order is non-deterministic, as we random shuffle the list), until a - connection is established. The client will continue attempts until the - session is explicitly closed (or the session is expired by the server). -

      - Added in 3.2.0: An optional "chroot" suffix may also be appended to the - connection string. This will run the client commands while interpreting - all paths relative to this root (similar to the unix chroot command). -

      - Use {@link #getSessionId} and {@link #getSessionPasswd} on an established - client connection, these values must be passed as sessionId and - sessionPasswd respectively if reconnecting. Otherwise, if not - reconnecting, use the other constructor which does not require these - parameters. - - @param connectString - comma separated host:port pairs, each corresponding to a zk - server. e.g. "127.0.0.1:3000,127.0.0.1:3001,127.0.0.1:3002" - If the optional chroot suffix is used the example would look - like: "127.0.0.1:3000,127.0.0.1:3001,127.0.0.1:3002/app/a" - where the client would be rooted at "/app/a" and all paths - would be relative to this root - ie getting/setting/etc... - "/foo/bar" would result in operations being run on - "/app/a/foo/bar" (from the server perspective). - @param sessionTimeout - session timeout in milliseconds - @param watcher - a watcher object which will be notified of state changes, may - also be notified for node events - @param sessionId - specific session id to use if reconnecting - @param sessionPasswd - password for this session - @param canBeReadOnly - (added in 3.4) whether the created client is allowed to go to - read-only mode in case of partitioning. Read-only mode - basically means that if the client can't find any majority - servers but there's partitioned server it could reach, it - connects to one in read-only mode, i.e. read requests are - allowed while write requests are not. It continues seeking for - majority in the background. - - @throws IOException in cases of network failure - @throws IllegalArgumentException if an invalid chroot path is specified]]> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - The flags argument specifies whether the created node will be ephemeral - or not. -

      - An ephemeral node will be removed by the ZooKeeper automatically when the - session associated with the creation of the node expires. -

      - The flags argument can also specify to create a sequential node. The - actual path name of a sequential node will be the given path plus a - suffix "i" where i is the current sequential number of the node. The sequence - number is always fixed length of 10 digits, 0 padded. Once - such a node is created, the sequential number will be incremented by one. -

      - If a node with the same actual path already exists in the ZooKeeper, a - KeeperException with error code KeeperException.NodeExists will be - thrown. Note that since a different actual path is used for each - invocation of creating sequential node with the same path argument, the - call will never throw "file exists" KeeperException. -

      - If the parent node does not exist in the ZooKeeper, a KeeperException - with error code KeeperException.NoNode will be thrown. -

      - An ephemeral node cannot have children. If the parent node of the given - path is ephemeral, a KeeperException with error code - KeeperException.NoChildrenForEphemerals will be thrown. -

      - This operation, if successful, will trigger all the watches left on the - node of the given path by exists and getData API calls, and the watches - left on the parent node by getChildren API calls. -

      - If a node is created successfully, the ZooKeeper server will trigger the - watches on the path left by exists calls, and the watches on the parent - of the node by getChildren calls. -

      - The maximum allowable size of the data array is 1 MB (1,048,576 bytes). - Arrays larger than this will cause a KeeperExecption to be thrown. - - @param path - the path for the node - @param data - the initial data for the node - @param acl - the acl for the node - @param createMode - specifying whether the node to be created is ephemeral - and/or sequential - @return the actual path of the created node - @throws KeeperException if the server returns a non-zero error code - @throws KeeperException.InvalidACLException if the ACL is invalid, null, or empty - @throws InterruptedException if the transaction is interrupted - @throws IllegalArgumentException if an invalid path is specified]]> - - - - - - - - - - - - - - - - - - - - - A KeeperException with error code KeeperException.NoNode will be thrown - if the nodes does not exist. -

      - A KeeperException with error code KeeperException.BadVersion will be - thrown if the given version does not match the node's version. -

      - A KeeperException with error code KeeperException.NotEmpty will be thrown - if the node has children. -

      - This operation, if successful, will trigger all the watches on the node - of the given path left by exists API calls, and the watches on the parent - node left by getChildren API calls. - - @param path - the path of the node to be deleted. - @param version - the expected node version. - @throws InterruptedException IF the server transaction is interrupted - @throws KeeperException If the server signals an error with a non-zero - return code. - @throws IllegalArgumentException if an invalid path is specified]]> - - - - - - - - - On success, a list of results is returned. - On failure, an exception is raised which contains partial results and - error details, see {@link KeeperException#getResults} -

      - Note: The maximum allowable size of all of the data arrays in all of - the setData operations in this single request is typically 1 MB - (1,048,576 bytes). This limit is specified on the server via - jute.maxbuffer. - Requests larger than this will cause a KeeperException to be - thrown. - - @param ops An iterable that contains the operations to be done. - These should be created using the factory methods on {@link Op}. - @return A list of results, one for each input Op, the order of - which exactly matches the order of the ops input - operations. - @throws InterruptedException If the operation was interrupted. - The operation may or may not have succeeded, but will not have - partially succeeded if this exception is thrown. - @throws KeeperException If the operation could not be completed - due to some error in doing one of the specified ops. - @throws IllegalArgumentException if an invalid path is specified - - @since 3.4.0]]> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - If the watch is non-null and the call is successful (no exception is thrown), - a watch will be left on the node with the given path. The watch will be - triggered by a successful operation that creates/delete the node or sets - the data on the node. - - @param path the node path - @param watcher explicit watcher - @return the stat of the node of the given path; return null if no such a - node exists. - @throws KeeperException If the server signals an error - @throws InterruptedException If the server transaction is interrupted. - @throws IllegalArgumentException if an invalid path is specified]]> - - - - - - - - - - If the watch is true and the call is successful (no exception is thrown), - a watch will be left on the node with the given path. The watch will be - triggered by a successful operation that creates/delete the node or sets - the data on the node. - - @param path - the node path - @param watch - whether need to watch this node - @return the stat of the node of the given path; return null if no such a - node exists. - @throws KeeperException If the server signals an error - @throws InterruptedException If the server transaction is interrupted.]]> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - If the watch is non-null and the call is successful (no exception is - thrown), a watch will be left on the node with the given path. The watch - will be triggered by a successful operation that sets data on the node, or - deletes the node. -

      - A KeeperException with error code KeeperException.NoNode will be thrown - if no node with the given path exists. - - @param path the given path - @param watcher explicit watcher - @param stat the stat of the node - @return the data of the node - @throws KeeperException If the server signals an error with a non-zero error code - @throws InterruptedException If the server transaction is interrupted. - @throws IllegalArgumentException if an invalid path is specified]]> - - - - - - - - - - - If the watch is true and the call is successful (no exception is - thrown), a watch will be left on the node with the given path. The watch - will be triggered by a successful operation that sets data on the node, or - deletes the node. -

      - A KeeperException with error code KeeperException.NoNode will be thrown - if no node with the given path exists. - - @param path the given path - @param watch whether need to watch this node - @param stat the stat of the node - @return the data of the node - @throws KeeperException If the server signals an error with a non-zero error code - @throws InterruptedException If the server transaction is interrupted.]]> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - This operation, if successful, will trigger all the watches on the node - of the given path left by getData calls. -

      - A KeeperException with error code KeeperException.NoNode will be thrown - if no node with the given path exists. -

      - A KeeperException with error code KeeperException.BadVersion will be - thrown if the given version does not match the node's version. -

      - The maximum allowable size of the data array is 1 MB (1,048,576 bytes). - Arrays larger than this will cause a KeeperException to be thrown. - - @param path - the path of the node - @param data - the data to set - @param version - the expected matching version - @return the state of the node - @throws InterruptedException If the server transaction is interrupted. - @throws KeeperException If the server signals an error with a non-zero error code. - @throws IllegalArgumentException if an invalid path is specified]]> - - - - - - - - - - - - - - - - - - - - A KeeperException with error code KeeperException.NoNode will be thrown - if no node with the given path exists. - - @param path - the given path for the node - @param stat - the stat of the node will be copied to this parameter. - @return the ACL array of the given node. - @throws InterruptedException If the server transaction is interrupted. - @throws KeeperException If the server signals an error with a non-zero error code. - @throws IllegalArgumentException if an invalid path is specified]]> - - - - - - - - - - - - - - - - - - - - A KeeperException with error code KeeperException.NoNode will be thrown - if no node with the given path exists. -

      - A KeeperException with error code KeeperException.BadVersion will be - thrown if the given version does not match the node's version. - - @param path - @param acl - @param version - @return the stat of the node. - @throws InterruptedException If the server transaction is interrupted. - @throws KeeperException If the server signals an error with a non-zero error code. - @throws org.apache.zookeeper.KeeperException.InvalidACLException If the acl is invalide. - @throws IllegalArgumentException if an invalid path is specified]]> - - - - - - - - - - - - - - - - - - - - If the watch is non-null and the call is successful (no exception is thrown), - a watch will be left on the node with the given path. The watch willbe - triggered by a successful operation that deletes the node of the given - path or creates/delete a child under the node. -

      - The list of children returned is not sorted and no guarantee is provided - as to its natural or lexical order. -

      - A KeeperException with error code KeeperException.NoNode will be thrown - if no node with the given path exists. - - @param path - @param watcher explicit watcher - @return an unordered array of children of the node with the given path - @throws InterruptedException If the server transaction is interrupted. - @throws KeeperException If the server signals an error with a non-zero error code. - @throws IllegalArgumentException if an invalid path is specified]]> - - - - - - - - - - If the watch is true and the call is successful (no exception is thrown), - a watch will be left on the node with the given path. The watch willbe - triggered by a successful operation that deletes the node of the given - path or creates/delete a child under the node. -

      - The list of children returned is not sorted and no guarantee is provided - as to its natural or lexical order. -

      - A KeeperException with error code KeeperException.NoNode will be thrown - if no node with the given path exists. - - @param path - @param watch - @return an unordered array of children of the node with the given path - @throws InterruptedException If the server transaction is interrupted. - @throws KeeperException If the server signals an error with a non-zero error code.]]> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - If the watch is non-null and the call is successful (no exception is thrown), - a watch will be left on the node with the given path. The watch willbe - triggered by a successful operation that deletes the node of the given - path or creates/delete a child under the node. -

      - The list of children returned is not sorted and no guarantee is provided - as to its natural or lexical order. -

      - A KeeperException with error code KeeperException.NoNode will be thrown - if no node with the given path exists. - - @since 3.3.0 - - @param path - @param watcher explicit watcher - @param stat stat of the znode designated by path - @return an unordered array of children of the node with the given path - @throws InterruptedException If the server transaction is interrupted. - @throws KeeperException If the server signals an error with a non-zero error code. - @throws IllegalArgumentException if an invalid path is specified]]> - - - - - - - - - - - If the watch is true and the call is successful (no exception is thrown), - a watch will be left on the node with the given path. The watch willbe - triggered by a successful operation that deletes the node of the given - path or creates/delete a child under the node. -

      - The list of children returned is not sorted and no guarantee is provided - as to its natural or lexical order. -

      - A KeeperException with error code KeeperException.NoNode will be thrown - if no node with the given path exists. - - @since 3.3.0 - - @param path - @param watch - @param stat stat of the znode designated by path - @return an unordered array of children of the node with the given path - @throws InterruptedException If the server transaction is interrupted. - @throws KeeperException If the server signals an error with a non-zero - error code.]]> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Once a connection to a server is established, a session ID is assigned to the - client. The client will send heart beats to the server periodically to keep - the session valid. -

      - The application can call ZooKeeper APIs through a client as long as the - session ID of the client remains valid. -

      - If for some reason, the client fails to send heart beats to the server for a - prolonged period of time (exceeding the sessionTimeout value, for instance), - the server will expire the session, and the session ID will become invalid. - The client object will no longer be usable. To make ZooKeeper API calls, the - application must create a new client object. -

      - If the ZooKeeper server the client currently connects to fails or otherwise - does not respond, the client will automatically try to connect to another - server before its session ID expires. If successful, the application can - continue to use the client. -

      - The ZooKeeper API methods are either synchronous or asynchronous. Synchronous - methods blocks until the server has responded. Asynchronous methods just queue - the request for sending and return immediately. They take a callback object that - will be executed either on successful execution of the request or on error with - an appropriate return code (rc) indicating the error. -

      - Some successful ZooKeeper API calls can leave watches on the "data nodes" in - the ZooKeeper server. Other successful ZooKeeper API calls can trigger those - watches. Once a watch is triggered, an event will be delivered to the client - which left the watch at the first place. Each watch can be triggered only - once. Thus, up to one event will be delivered to a client for every watch it - leaves. -

      - A client needs an object of a class implementing Watcher interface for - processing the events delivered to the client. - - When a client drops current connection and re-connects to a server, all the - existing watches are considered as being triggered but the undelivered events - are lost. To emulate this, the client will generate a special event to tell - the event handler a connection has been dropped. This special event has type - EventNone and state sKeeperStateDisconnected.]]> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/pkg/registry/zookeeper-3.4.6/lib/jline-0.9.94.LICENSE.txt b/pkg/registry/zookeeper-3.4.6/lib/jline-0.9.94.LICENSE.txt deleted file mode 100644 index 1cdc44c21..000000000 --- a/pkg/registry/zookeeper-3.4.6/lib/jline-0.9.94.LICENSE.txt +++ /dev/null @@ -1,33 +0,0 @@ -Copyright (c) 2002-2006, Marc Prud'hommeaux -All rights reserved. - -Redistribution and use in source and binary forms, with or -without modification, are permitted provided that the following -conditions are met: - -Redistributions of source code must retain the above copyright -notice, this list of conditions and the following disclaimer. - -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. - -Neither the name of JLine nor the names of its contributors -may be used to endorse or promote products derived from this -software without specific prior written permission. - -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. - diff --git a/pkg/registry/zookeeper-3.4.6/lib/jline-0.9.94.jar b/pkg/registry/zookeeper-3.4.6/lib/jline-0.9.94.jar deleted file mode 100644 index dede3721dee71225c942ebcfa4e38250e1e893c2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 87325 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

      Y5qC;k%1U!?;t&iH#A^9N0vn>7fOhR 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 -o+ALO7?mx!OF3QAyE8xC_VXp@rcY;N!vJ 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%0D(0l}xubAF&V4B`Bb|aqh(GW1t_X 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 diff --git a/pkg/registry/zookeeper-3.4.6/lib/log4j-1.2.16.LICENSE.txt b/pkg/registry/zookeeper-3.4.6/lib/log4j-1.2.16.LICENSE.txt deleted file mode 100644 index 6279e5206..000000000 --- a/pkg/registry/zookeeper-3.4.6/lib/log4j-1.2.16.LICENSE.txt +++ /dev/null @@ -1,202 +0,0 @@ - - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "[]" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright 1999-2005 The Apache Software Foundation - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. diff --git a/pkg/registry/zookeeper-3.4.6/lib/log4j-1.2.16.jar b/pkg/registry/zookeeper-3.4.6/lib/log4j-1.2.16.jar deleted file mode 100644 index 5429a903e117a21f19144206555f9608185e5642..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 481535 zcmb5VV{~Z2vNampwrv|bwr$(CZQHhO+fH_DJK1sa_QiYW+%vv=zjxOf{jaM=_oy|i zy5^cKF9i&O0s!&%W$g0h0r;l}1povZdZo(^mAy1HmfemXVU$qXoOJJpDSFbD?V}*q^@#e4h-CG>;0B;WC#htyIhsQT> zJ*nyQObT9KVnv04(;ZN#(4a79>S8?p!#m(H;~Pj!;_i`sZh?sKK5GQ>chj=)%-wgF z?Q#?ta9xACR_EpcuWX`N%;WoV0dMjNH1F{mHt7~e#ndA-n5Ct>a7P)E_7or2^biW9 z>R=J=H)6o-_X_M(u3LqE&R~DUTCoCs@oNsCSu#U>h;QZ>5iF?i0KEjDF)qZK!N&z> z!|9%AA{1{KBlPj}w96jv)0NpbsO-otnRzs;N6i^xD)YT%x^MV}**FHMJ!Ka`wriUw zO*-1*3DH9gdoJS5#7?pBT`aR3nxdb3-M!AiSrGccc%U%S(MHgOu!gj>{t7e8u$P*G ziQxVQy%+k(L0F|i=aG5axp=l`(nO~^2b9iO=C>u46<7mkT&y)%`v+v}Qh%5OYLx-n zPSrmYe?&ANQ8?l&zpMt1o6oU%fttn=4b6Z6pg4GEr+Xg5g1T^Jo?dU9ZbG;#3a0h; zGfsAJ<3<6Y=C2-puisG+9+FS%e|k@G>J2Q2-xhlI|eiY}j?58lx-e674|5 z1=Gmr4Qt}plkC6)dRABLtrnSoGQTrC-a>);(bdZK(vu&em^j`!1*GUkhSyR?{9^8b z3*5UrzG8wfJr0}lZcX*KsCbuErZ`tMJ6PJx5R$9{g@shJ|8c8ndz?73=RhG0Ig>@I zQcW5;{2E%C8ghpkSgPR5B^uoALpwgbgF#4Z4`eWtm7Vi`Go}VK#(w4b!q;%YEmzK< zY`~UC7I)q7u@!Np&rW`1!cQ%osn<=VW7c9b{mhK;y=v20HRUv4!aRex zzX)}mI2WuC8tRYkDuvaA#6mi6NJV$dYqBCgRCg5?(}($KlwI{sS~v z5e5K2{=Wqu-=GQfpZNTT;X=oMMJ>WV8%j$EiO4F6Y-?&IZMLHN zzSR99Sqs(wwu@VP85277j$ROwpqr7ZBA8vb83we#Y619Lo*i@_Q^>SRW z#dv3@*SmT7=qR>18MW18>rU}{147@~-TLZAi&|-M_v-4@-J!Qrv%0_eBkQfbi*j&t zGPHgDJl6K=A|R(jzxLubh0lM$PO_KP(XQHZ^8_&2@djNtGo5Enwk69JW1ey~3_y;X zY?BkOLn^tX(k;0>8o5v*sJ^156hrE((U9zqJY&v`!;#@dLt3t{K-k?ef{RVcV z#cb<#(89p#J%5)?Ii~6|)Sx?>OQD+it^e%G4$*X*jGB)`vpgg)?y!zo^&|7)!Fj3* z!_5h??rcR$bJhA3-zHS*|9et&EB*|bbQBI={5LhBR3cI{0CRtnZgc>6cc3Qc4i*fT z`VxwuCMq9Gv2#G#fZbSaph<~^){=+Bw?M<%Q0(ztsMGzd`eG5jjU9nuqDs+FP@Jjm zWOVGoa7gb_iD{iR;7!vWsj{Hk=dB=&XfjfE?3@SXC$dI=q^hf9)x1Z09rjd?S~bE) zPT^tDi-n#7qT0ga#^3 zbyp+i1WJ5xA#;$qbCrYJT@mwh{n(vjGa*L_&}G;bv4AcNzkKj#-Lq@+6L))w0;czt z?KfzFeP!nr+$V0kku?RsrIqGu!`1{`GaMw4!UCtaVyJ(i9oA0+nqs|&xHcniewu@` zw0M@TkszkxEWQ(T0)Ux+9Xa^y0<`RV|Jk)X+^KC9743-q*`tvk)1OC3imQF8#dLcJ zV%ie_n?XiHp!)OA22BmXcpmZXaT(+X{-F|}1r*@=WWHqM;ShgYeK2>9L2NB3yj5dW zP8fBqaX|qs`U4=id_0rQq1k$beB8lo^n;|RUbXs1ViF~zKWP(CYm*n?^#?&n<_PTE zu>f0#-LRkMJtVCH^4`R_Ty;gt)%NhwzTtSIR9lf-AszL*=Z4>c`1J;)It{>(eaBDD~2IF5q3+@1H1fz_KezPxQkL zZ{5!fnLW4S-E~;1EsA5G%00~}l;-GMqE*$FaPi>VW=vaPg`kJUNj04?vTFdst*NA_ z5kyr93+3dJ1un@INo%`A$sbsLtA}Hp2uf_5^jP!c+T|q*@F;BekR$fT8RGHA>uk+X zzJ8K#L{gD}3cLNQGX6H~wgB8b?jSn?3nH0Go_wh0#Dn+9nuy)f$2S|63CO6zCcp6x zeTw?iS7yNq zs!hn7mkpE{6Ml3ZY$&2MQ11eNljQ&)x&%dG=O+`;QfnkYbp&B6UphjBWpY!|5R$Hl z|A2JiQ{y+KjJG%zp<_l%7ZNnF{f6bR<>ab-Xf~2^Kesp{7wlHfTsC4De5xkI+oz~q zJ2n>upV*ZAz$};}b48&@bM)Lq{3AqB7&l&TMvORM*$U((m2i6D?V33#_Q{3EZM=t0 zDQEj@cnhhb=coI%Qf{bx&nso*={GpouT z(b|QKn@FD9z2Vn;DD}8)!$V`ZMoc)h7L_{*;07-SQlK{p)|W4QTZ~RxbwJKlBb+<} zoxn%mt$xjVA`r`6afqi^*t6-9)dluk^&=lG*+*hDWDUNJdudK`YXk5vKBsx`i2M(~ zy&P!u(sw{)7|mEhc@p_~2O(!lPd=*?-uz1fYjS*)hVFcX=Y`VRgi`@TdDwpXA9RF~ z^#ELChkj&}IVece!HId0tD^dSH(}f48l@RpHIVQdXnoAwKRJ zE$AP_WuFC!$2;^ePAZOV(1iFa_5cDC_H%bQlE)^iBbYzHSi~}9oPe@fvt)g$#Uh{l z;2p32Ql`8K{UK3~OR(5RK~FjE1J=GOl$gl;c$wWb?Dh00Kk;J7f&3mgWug9*Y%>X* zJwnn5Kje!W-i0Oe6weq+>O2n7MuRJ}4bB<=>tph0mwD>7PIJ{*p6`*Xt`#6dLANPL7pqJz;B46|6< zBz#^lWx%MAlk@N@9tu70s99MqMpcK%T;%6t6kdl{YkP-&cW0X54G+ALy){N=Bzqzmc`C7wNul65c~3|~Auc0OHiwluFmagEj%+jtix3z;I9A>}Mu(a4l-7H- z7R8#NNMX@{J4NpND>1p|SG4{TyMPR)vvjL0TBdM{mueWkBSRjDM()}YVDh}nASO-5 zrZS-1F}7B=rUqDTnoNhco&BifvqC9CfInP(4k(a~OGp@x@UAmQUQj4zL`dR%@Xl>J zw9qFPtJ8@c5&V|q7$N=>LWPG&D3i+ADH`Fb0aI3-iI6Jl_oiWAl9(|WY55K96KjTi z{WC5H5kK;?630$C)ryJ{w)rK=-x6W}gTCbvZDG8}Fbu$)Ekl;6Dlj+9(;qu_KNjk7 zv2#!zp{OR%oD%vh4G;^amq9Hb&M#KW6nn(dxC%MNJG8fCemk9l7&UPdDeWVgMN}dq zGjp&Xp-PfBJEBbF(eA=FBL$Vcr7BZtZ@kSRMMf3lz=An7EPGszoX&CNW$F4U1MpHA z0ovK|x-Nj~a>Visft`Z2sh60p6F>Ymx}Pp$I#g{P{d{yr#pttj?;by-Y?maL_mj0c zy+otP42^*{u-pRG7T4`-0;Y{(XII{94a07d-l}DJTOS>7X&dagr(E(%1hGWm6tNq= z0SYfZ5ZOTbTTo6c!0!%I5I4h9*#zt!qn?hlsSLLiLNw($6ax zbUQ$Dp6MF$*qxId|Gjhz+#w&C3H3;yLh^6i#O0_uLW5;b`C3-nE9Bi!C@}~uko@};P zgcGg*=Y}C|>Se~OLxXN@kOM#MtzYMtJ3Sxm%?(=B$MKBj*3R+TL)-1J;d9jMrK1b1 zv)Ci-9kHyK4p#)3c10tj#Uw#y(xkrhl^=Pg(FKm{~yb!9%e2 z)!6v$48<|F41w+4rbQOEK673hQ_er%EMap4#qDQ3so2}|$8Si~bpY>6u*Kk0{&iSb zu7R=h7G_1M_DP_CEJwsavNqVTS5?YsBHhM&h@%?ww==4Y3^ZxT3PQX15+BR>qI92Y|EACd_TW5)^W8sX%ens53(=cj}5d$Ml zZU+L?Jg!C@`fa1iUfV}aLv!-UGP_dQNJQiq3ip~9rp?+h#!7KIMC{5SbKQ`EZ2%bE z9lY*F#{~8aa0&VN@CV(|9MWkkL8VfQzx#RtG52B+bZzerIDvKNMhb^B{Z%2xqqyl6 z3uY4!mf$KrSajm(q4Rodp=p}8Fo%@nGo5AWHZ4w|x@%N}$pKu73$7$b!p=NkE*5To zIh6f|)1#FDW@NKMc1AZ{dZk3UPfdg19`}B$1f30fJNTf+MPOmW;LqT772J{(4NBl; z9ys@Y5|vsrZX--^`mjR8I(V-`6i1Fu>>YMqq?HtWVxgQI?4Jv6Fk56jWG3S|<=!Zb zZLLs-y@sj-FxAe%%#qqeLIQQftw~?>XlC0^eVbs^XL3GXuYN#i;mEA5<<9&+)ENQQ`yy1xm~j@C#~7h9YwM6X!QebhltU zsMaL}K_;lO`)rc)q^+%;b>nvL6F?&tbhoPwb+K9@zYbwNRjU!h=2+m>(cSqfcp?GT8PPfn3=lQxy zZ8z!5TfTaTTKN`+0o2#zLPRj0>N2O)K>3J1G!ojIpx4Xe4LB0Q2NDP*kvm*2%bDJ1^o6swy&>cqI(xN@7m{x z-@o_lZ}yLuuJ8Z=rZoTD?Eh=e{&&JZntfS0<-c9K&-4Hk5Fvv9ewQ5MSmzm%z`PBl zXTTp&VRF`COlR%$Yj(Cy*KhvsjG8EjjKQ}O+u_?xK@<*|CD2s4^u8|vIm}j~tqOEI zQUwLehzdZphi%B>1IL&3{IBvcRAxrc`oizNJp_?g%V`Xu%^Zu$0i0*Bef6U zdpjFCdq+Ea6GvwY6DQvB9;iVE1b{tWIfwbL@i-R>XGID)Tb}?crp^+WW3--f%5^@_HS z(_!nvPuDw2IN5oUyY%9p_afOP-sxuYNR~W;W0XdSQOxH^O#0FRdb?XX+1Uw* z@R*S8%Q5-4m~&*f`Fn}e!tdgu0K!53Mr|x4JfVT&%n6N*GQfCo1#8B+5BDU*hGtgv9QH3q%vts@ z5pjnx8iUt^Mj~KVzfy8=_9!3qnDRjojxQsEVY)(osU?hXv^A4plWbUdpF}EYST1|k zjCQ5EiwM`B$OMlxf~m`ajG!ym@h}c!#X#@xoJSO6u59E?0A@a1peVweeeVhl1t-|; zIYk6}o*mLfY1c9)N@z~h>;ZQhpm>xRi5K@@bYMCUH}3X~>(}vl^f$iUZ}wuoe7!xq zy}ex=*zs9fj*d<~o(^sfPO!VP6Zg;bM|J3HWnIAm$@%Dil8eWA>&F!WY5Xf_noG~{ zT7dedg5SJ{eK3@HX3x_T8qynCL`%fgu^b|rC;~e2fjtrKr7L2sW5=(Zamsej_a$Em z5FyFZCWd5BW#bKIhy1m7b7Taf=to{TBrt&51uz1E^zGDmzV}ac5`$65cmfkQ_(KWQ z5u^p1A`D;6@W2gA#n7gr1+_%h10a2d@dDH-Faab(J!7FyaxT0^12TCT@rPwbd*g@$ z2RQ&V47z}@!6$cpKVpjFcX5OrFStQ{iUxto-MYWqzm)S={mCNaZxUJJQnUpQ6%&fH zfrga)B$YI#HOY(4(@jjwBH4M9oDQ-_G4pq=GK<75@q)o(N-YgU)`^Z9GFT12xp>bW z0^Tq^A_vv+TxKdGDDLd)vR>HLcGhlkyVh2c!{idvmfJ^7?NGJ{c6NGS+N!1iS)$8} zOkvSjniD_eD+i_asZ%tIm>Z)7Q8||CZeMO*w#YG^Kk6^M5+KygujKUrpSmS6kz$k* z$k7G(Q4Z_yJ$3IhTlUBmLV!3E=xnh zd|vvue@ahfXmf$czLLo)QY4*#hI!{|MJ{+?KSUY&$y{|C?APamLUreaB&`9XxXjd8 zLP>+VB=s`JbF-(SMZVnLUis@)&F7dwJ6A76Skqj|g_cGyhOEwuPajQszT?Fv9`MQ* zFfOj~?z_^Cgz6_o%5hnh&3^JV0IHICJCbOiXu&S0pWLIh;KQHMMVG$6-FAJzi^`KJ zYYK7DW?zw_+gP$SMSPmJ&pOs%`oYrZOm*Y9@DE7fY>>)mK7USl0<9;>K*jOe2GvJu zez`UQQ6cuf0~NL86jEZ%FX!D+UZznehQ(4=nS)igeV9|^S~>;hxVPuBNCs3|pEU$f zN?IL9(JAeU*o}TTxf?@w3U*@=?^SSvX_-4q`UtiS`Q*pduU1sqZy&d>EDGXxhYIqP z5dmiL6%qbw00k9DhJ6Mm;Op@Gg}=E5M|yZo4c^~qk9=K@LQ$x@pPGqwVx{76qX`tv zcH32|ma3vNgznl@R?U)8>2uzE@F%HJxIfewJ%dq`CQa{Yy;u*!9m2)%jp$} zdMvM+ngMea(PbR{AdQSNYY@hLOI>KQn|>dy`>R}BDAB9_H_E3yGoqXq!obO2(J_u) zh*UP2IaT$&@Qi?sDwItTgu3qCK;-T47g2k>bu}Q2khi&V`0LgW` zva$80)ghS4b@~H;*!DtZMRILs$0)~Lm8!eCl9FT?31D0Z=eJN!#=2%0ca~_3EV?P9 zr8#DqY|*KF>M<9$Nl=-k^>k>E{IecPf!#p1j9m^zGiT%^vnbfqan*QE6z~Z9Aycka zrj}_I){I!3_nzhX9a9UbdBP}-9f=0@nR(PHcg|;4P6)_5riGO?U)F-&u*4&_KQ^I< ze=-i^mDmbB(shP;h(Va+VIu?X@HN=~0C`!m<{Vm3nG) z7pC+2Z<2d{83t#UREYZ(r#De$8Hi#n-KYB=F>=N-C-p2_9HTd^hW16)tXg>4Uf$a( z8-l@%q3C3g;`ZndLT|a9$u{kM9(Pk0&(g&kdo3zCIdXCBm2X z@kh_D#eTc$qj^|h)c4!<0Y(h_wpP1bf++`6e|+;p1>&1;F}XW2Vak8*PNs?>_=P`^ z4ewl9fab~ydGRc=+7GojbYU=z)XmHjQ5)tFdO{>An8K-6WPjt1)_9Oy++qtGf1rNy zs5e8IY!&>{5b&m?Q&}Z{_^bHq=Al@k4OF+qB68GAlnpv?b;4YE>f+soqW@2GD$tNe zckV%@QEBPH#nKYk+V2vKCXB7+Xj<+ol4l)XK(!i%WEwsBD$UMGWgF3BqbS3dUy>l-`!c~rwbDLv174GejssDbNKVzizdqGI(w~jm zR8WzTw-B@~#B^jX!Fa9{>v{exm*^bS02>T1#O`POW^K^-cFA@ew-V$T-eS#?#l3jc za{zWFCo;t6U8DU|s;WOf#$i=klB%KENFaTzK40HK*3b+;x%;?WhNW8sdxd9{Y4Nlr zhiTa{Ipu+XLE<5bG%a5t#V=opWBwp$GZs1m*QLBtB!+O`bMdD8(#_hVHV^V0K&3%! zl~KL>ySh5H3ZDs!9@QMnhbaJz#u!ses<38xO6}p+3dlLqBjfY&)!l1UOY1fS2EA4D zr71Nc7Vd`8MVHmM^zJZIR3Q&KFsr>Ggzhsx9zKOo$7%BwH)9Ef1wRSiGA!ji6)kgl zKyD30ZVV!B#$<9}0#)KH{rX}m@H=?a2<#aXQ}IVZLr?$WJ|tA_!MbB$W&j_DJJVRo z6>tiejp-3uGh}UBkng-Y98S{AeN96nUR@->@XBU6y>cj8GIU+y=2*oQc zT9AO}B6e+mP(KLlQ-4d;W$Z!9?UcH^{N#osc10-X3jYJ-atcmM4GB)UaS%`aumlo5 z7@oQwA~mj)n|mh~)8*2#lHo^7Pi?M!1qdf5Mbb{edZB_&+9Be*Yj?vQK^7pB@I=Z) zqu>o>vH8yL@}U{(`U!<0j?wUHE%01qq@2cSvqucx62EAA}Xt&2etGJi2&+6eVevIb>Ut;Cyize^#;dS(@mDQjk zyck|K{($PnD^un@@29c{&fbt8 zZOu_-+A*X(UZIV`l&cIuP&32=-Wv~(b@OP_+pNg%IT4o(SQBHPmLdnTUu~7W*Y82^wNjT0Nd31LI{c)n&8Dd)qi%_hGIkIW;n3)P=4|EZ zyW_d%4`!qzN?#Uh9KpM|HYZoweCu5MywLsZd4*BM!fjrnkk}v<N(y?l3wh^l;L$%LKNINNs;tYZSo}v8o)Cq9 z@Lha1KvH zRAq*v_f0V7u~raYv)oTZK@8Et0>NIR6;B{_30LZbiiC$>zng{AW!m`(`C=f;OVbnR zLP;$FbdE$$dgqphgdW|99vBD^z9itdN*s?~j}ksX(|Nh6^%_%P(Js2)R~a#k*a|wF ziSG$=J8Y}hoti6aE)|;df@$^SD5x?WDG&0{!YppSwX{i|GiTK1tw;gCx`p8o%s5y; zuy4DsereHmwRR11)n>I)Bk3YrQ3oi-5~-lm~58@3V3DhEsvm%WLCei^RR|k-g*TK?G06b`EZueRIF=&hX;HjSB4pE(`o+^(+M5G#9nf*KTli~=UbAe9&!gZdCehTgigc-MTq)H{e5k4X9aVhZnS?5%rxbgE+PWlT;-L!D zJcrTeBr>dmI6#;C{SS2J0gyXPY}dC)Vqf-m%2k(L$|1wP(Wg(8nV7aMi^5VyrLk#I zSu#KKNvl*bJ+9OKMfHJ3u}s*;iONdd9!gHPT~;>T1a{l>6cw!HjB{PeVXbjnmcz8` zYZDJ&IDyDC@&18a0?V%NZyxkwxOTG_gz;UYB(r7%J7yho(~_B?38oA+VUke*Aq&JTm39Tq4~rnH$GVQH zI{GndXBnTaP8Iv&KHo?S4OH4oz3z^q`$OC)hPB~$J%6X45OQ)uSN`d-TK*HilYs?v z^q_&TCi>~RHDxU8y({!9v_5F#AAP|?a0fKsxa&hy!l>^N(5Z!?w9mz{axw!V$PC=& zY15`uMW2<*Pf{S^r|Mnzdhgu9Pb1Ctn2dK?#3;<}GBnxXX`aJ%f$aN*rknlbHKOX+ zDBntcN&_kJH!E|IkDS^6(A&IFZq#1=RmC{V{WEv+uap$XU+%=t(d>W4Ktcbfje)&^ zk-5qL$`tXxn*QG@tBrr*dhq{G4g~D&O>B)#9O;a#4V;{O;yLApexU@LIdMXEZ~z4d z7Xgxjwigr?LKKGQhYJg|tyhgC+-J5RNA!sf!0(9>=B_cSA+@f{tmcf54#LbgJdzL(kYR<5SYw;5nWutoJ6KB6CCWa{KgQY$a$%awOsZ0spzcw2Y;1 zm*po8_2zG&;OdP85!z5mGoS!U+cy@u6PGv#b>u)6us)!T?Aw=P=@HpS<~wYi1Gb1W zlHroH7A3;7ta)OE*XDnlQrY2G8SSF{iN&kayj!D55iB77E-YmfvXjt$|Ffb;c1_om zXJxTMq1Cdjx5aXAX@1Z1+#Jp%bn%i~z@@5m4PlvMdTB8tm`92RlM~V}-9P^>+u@TA zK~BfWa1@`d8E~Zl5H6AoLz@gs?WEdZsxGu$A5dxleHn_q&ax%AX^+hv+I1!mG=#U! z>CFG{!Y%!V8FOhs0D$7ZBCLOqaQ_+@^8YC?N>(P;CeC)Y{}G@VRV{mD6^w7$EYl=s zErRBf`PERObuycvNCNbPz+<8SB2XHUcpJw|>y4YxnNs=gfEQ?pa{9Bb90%`uIFw+_ z-C#_;?0c2n70eum(aoUP*Ss0mtWs?2-`Pn{f4q17ICp=@^?tk_rIZVy@q_1~LK^dsfJR!guSHky-*V#tmp$7!{{2A}B zlp)F(@d~e*1Ftw4dFWH=LGB7U?h=EWkY**^H3q3+d}T1%AJB#tgAGa#B~>L%-L;t) ztwawXKNdv6@@k_UL+uTPF_jK73(F3_QY$VjJkgq&$mUF7Xh-H*(v0#duu3gsmLxK= zN)2w5pOQyqLQ$RIPa7?}+s+UI1TkxiTdOij321lX2aO!o6_st?>-j4%Ic0Sl1T?J` zT~>Zi%Wv#BgaiFHEvCo^g;Y89dMpy!;>m}xa19q#T!5o2rCOaWotrG@lne7})Tk|M z-|!2x+G27}sQM#dK$w5xnV8B&R!wmbWO(0OU4q5M2%3_NtyKJ#D*#!WKP%UvK-nr0 zs$yafNt{!fb&h-3X;O4tJc`=nPreyoprXd|9BofCQ?sMt*4Wr%q}zr>a?~tVbIfql zvi!SjCL0>@F1VN@LNoTW)RiMm8c2;#iwww@Kw*C}PSF*dP?}rjkMdWSL+w+l* ztX7lK5qC*?ryZw{K-*$mAVjKApxha3eg=!h90{)%+4UwfMR{g1II4U2D8oR&H49%L=z1X6RsT>kF?zqc(8r)K zjuq}fkgztR-ocm1@E4nd5a1O;l-%XG*F~)R^0SUG>2wn&S6|P)bb{Sl*6W$trOS!dyDBa$lh_4JV#2I5nwir`!E#q2_pK6%C5ij$sI8h#pxq-{ z5Xzwf`)3s6-&F;a+EPO(Xj}RDz5PU?i{`UREa(XRB8ju4i4(^}MLM+$v}X>{qu0;? zmE-=mO^L;R${@9l16mC;z*qF3epi6H!Q?04-&;$L^b;<09NJL5=N2B|uAcr@k^_1k znmZxny!}y91H0~l73bW0AUSA`<|uociXZgv&xIr=)+5FH94O2*DTVa6*#HV1@}UU8RI{>vzzMM5?NCG4Kn)2I-Z;( z>(aLnJz8Ys^4pvtCSGJWzSJ0*rps+;tSsNZE>phz-UQ^Wu-Z-|8E4Hts@F%8?L=NKXlnJ%APPb8x2n>udG zYTNU~0@l@LEzzzSMx`7g?F9f?Gl21Qprt#$Aggu9q`M~_^o9{T1H;$`=rMPhw&nQ~ zd17YMd-(J3HH+uZ`JEmZ06-JmKi90^|8kgM{y)|%Cl6br|Mx^eB5dJgWZ-D5eF za@~(ALmS>W60&+%6-Bb5UUISB;SQbu)MV`g8BkG{ChAj#U20je{dTjh*|pxW+^t}* zs=C%}Dme67R@Po}z;%)E77__ExX+1=;nGbePImLqE_?S0%`gy4c|AiYWzNkSgbqPh zDqY~HCOy@oS-_wk$&{{EIKZ}O!X%@7?%NcXC_~bkz8y2g??jBO6{#3)eUFkFxf1`3 zpHabL;}A2kS+=FaQe`hP1jw31%K>4GhDVb33WLC0tpkzO7(wtx(=Ew52z8EXto3{M zBGtMEl=9LFemVM*#S2#Y;RRMN1eXP65ajQqpNOo5`8w@4Pb@wA0KCqG1maNL0j8$s z84%a-2;8EV=x6bPmIr8s5BUmp_=AId1!_9(%LF?V#sNxFB^MsL!;TSj1eYMO{5hyZ zA;+lc8=c_%jQl{Uamwg887G9{H%9USymUo+vYrQyaS9&&2t2x!e$Bj7R7h%B!oc>9 zV@ci?=N)G5KRJ>>~oegxUkH0AB`0ssip75@%{KKnrx||k6}s|7olMh zoiQqoQA`j+V~&K;Y=Wrh?7ZK^J2<27-yzF|Xqch+_kMuyU)cWRnE9`erT_m0S$hNL zzn#f{_5&%ZGSVn!7{0xBW^RAXKtxtM)lsQ08fmKe%{N0d)r56)eucbiX@zYYVB(mz zGB<^e z@Z4T~zkh~#-4&qbg)R8M2!a zt{`RQuP%Y9TIWlg&Kf4m5R(ztQ(F7jME;Jr!MMWL0r>Ax>GsO*7sPyg5?o znlDPlutcAT5IBhEIvq7wZ(&)iH%%5#&4f>N&`GQe3QfhO#Uyerv%R?S1tafO%%wm1 zBS=?=+x^B8v}}UPqL5~5*>k)gFoTES7}}Ygq877MSrhewqvROoQpxNs?j~6&6;N&> zxyr)YH6@QLMyxRfrNTnHuK3K?Wxa^`qPU>5U+1f!p>a@NOUm-ar4h$mPcu>%U8UD2 z%E_3MSst@cPU*Q6QnH_um^-O4QfQ0T6@tZiIH+Vq8efn(qP$ux?%Hu=8FF*qt?KA9 zMbeXhWBgFdM>d#U*8ZisF>4j(QYWBd(gLXml{sI!Cu6N#51ED99Z~~@)gUrD21O^3 z!dOla*Bl7++c-Xrmb$b`A3_9lXx=26q8&zPv>XUIH4up}L4emvr{ff8@auR%VWoFc zUTH>t&;KA<Wn!SRvc@1@huUb9N(DPk zZ@ed6RqT<8$C0ZP%LMS{`Tj)2{kjn*2!(2|LNAt{ffd{`)J0`9s$aJ)St3)ueXl-Hx3+&@Q*}A5dZ{l5fml47#uIdUO)bAc(Py^5!``L@F3&^^thEVIbymgY;iQOc#CU zW(PV`cgU)8MlwG~SGy_kE-J#`5L4bF75 z5sk%1quWd2xe*e@*b?9oqk%7W@9RfbhZCoB%eeP&-uZ*8VaYm{5CcZmU zfuAH%cYLLH$knlV5Bd&J0$YUzW%Wq_&bVXs&|MXoVBSHz&PjLV0{J<%e2d5I+7h;SJ7dk( zHQ^{e{t@>#4{zUoC7ts7J~s?cN#S+$7K7GIdD}ZS$cRSh3wC-0N;!C2jaHb?Nm3J8rO> z{K=ojd)U`{ZS~Iqa)oqP?{@>?NsRJ^fmpvD!h@M?5CgqRId)^^A&VLdan_^D?N7qW zeb{%0nK-b>;7t-T$wRF?ZM^5j?~OYRxrXj|1@xuZ6T|Y&jtY5=u>Mi*j{?#~x@+{$ zvv4QHR(qEZQ)BHe-9N?BRlB2w6D1a{ZdqzZeHyi2Z@v@~Ww8`ReTcAPy=pz?-QEt} zu99zWH;}lV?2l}5p-!W*P;YhhILrhCT`7-OvkNI=B*xJ)3HF?p20*8FUwdwDo9a0P z)*1C2+C_#A{S44&X^r>Z-0I4T4j*hM;b8~4#?!&;?pGdXiOwH{1f06L!$u5hd>2w3 z+oJO;!;DOKUDm^nNZ)5$s*M>5XI%}M9=#C{UpvBZkX}AcpKtCz#$X!6{YK4cwP;Sz zgx9DMr7;h|9=b+*)+~zeiS;@K9l~8cN!I7U&=Pi-q*kSLzo=nT5{3_*Imx|oDeV!& zm|E#3ZJw+TYK*n>G|Um0lxI^7`)zL5?xGF|m0;D}0!xo7Ikl9HL59ZYICK(<_>d?h zuLQh?1;xCyg%tzx1z1%S)X7%OKE!zHY7#k3{8!dACcSwRF+ANG8dGB`98J1&fQnnX zZS9;@QL2O2Zzc+(JHCYx=bfW#t{Eg?>DjUZF9&OuuNBs*V^{YFl02@mQMZ zrEyhC!vU77@lwn7dA;T&F+a(bQh`MaWW|AP)?fw8L9WIIyGJp=nPvnN3RzUX40}O# z6%RLWj0txNaeg6?m1`Er=JY4HL~M+zdbt6JTH{kx4J#yasO(p_Vgytl!krXul|yMP zyM4!C@q%r66#DOjWG_q6n~H^n0KIc}>JM`|FLtKq-)LYBftXOJ?me{^SUfA2q*I(w}gr`3de&?_9*1Dc&nFWWt zj%WPqb^Co>-(hhmmV6322wBb-uNdIM@v=Grvx<`Ld9InL)Xak>=NM@=XU5IRHVlD` znKjkhjZ=m>rW@i`6j2%`*ECNHvm2R{^D3neXY1j*GA8GfQlu%RjTUD?Cz-M3<*tBq z%l9VQ)kaA)>`^i7Mp1*&h*KB1!-eu+M_XulVQvV;xZ1xD0;b1|8WRMibs ze;;tL*`gMnONvW+VQr6zJzvXh6_mh8%hpm&c@7#3aHZp{`j3D`A+(gsYVj)kkjGpAxwbK@aMbe1pgVL#%PSoN>DEsx^jljo6)6-A zIkQhJ{w7c@6G_cLqR#kQ;^HB9P;J%nYY~`)o|J-; zl82={uxtuyk$(v;6E!*W=a|rF6K$!3NhZDwYv4I430K5I5BF*`N3?mOaV9i=L&i%q zhy7qw-JA1wy+Z|K4nDtB|3L%}%Apg4{m!tNH&~_u!A#;K(0R-(-X`%8K6Z9f9~EDt z2&cQNtQpS~CixwmtKpzihi4RydX0n2v2FQe&$#(U%(SmN$IQXCO9@PHejsAi>H1e zx|aGy-C)QoklcB#Awzv^QQ|C?T4z+77l$k&p;l&YVu2-qQdQV{{I)i)a+4i8B}=9y zQ3aV{BXcJbDhD|`Vpj%|O@SAkQ@adNF8gT5#I!K?8)fUeY?|Guv@eyJ5{k}~_bTfc zfMnZ3aU8)1TXN|nvyDsQFYUA%vUIvV488?p*K8b>oGs}Y*LpqkI}4Wd$J23S-ILRl+!o0_9tcL=V9Sf^Aa<~GL$NiQTk_PC}9xc0N0XpqK zam>1Z5)KjY`j?JAfEefY40z&r-4WyVNey+$yg}>sReG0nhd$hM;7i$GWj&F>>-CNw zAjuK!xr`1B+%ao(mMtL24|#$)ydY7}OtU>FzC6{XSEV1K@62L`6BombLYp29xEYag zW#x~{RyBle?X$7nC7JAPw*pj<@MKhkRz9}GGuOuAyw;RJAFKZCDarDHX1incOUSIu z8Ja#5$f~Z7>f;Xsg`8xPH`rr8Ws=w1Ba~4*;jZf)w~r~YDqlHl6%~Y!g84~hJ5b>= zMBQkJKhxCGMp}_>Ekz3sws~COj$^kV+&&C@@jMdB^~kyT_-}X@%#Mh4?;F)G9kBGG z&dEp1cD`w+gus;)NFD3(I4VpDlOb>cm+bh}$5iPv^iY9;0 z7#`2#Co91!v@|a>VkMs#W1iVBeh&_YdvlbO@h^p95I`kMNs@r1^Hv(|Xda!KI9h(< zZSgcOOX|AURNPaJBQldVWlph{{3{P8T}haT;9|nmE6yM#qZ>>+fccumiYJ-&U~tG$ zV^a}HY}SCZczfk-ZjP!9!{b4+IF~AeW8;X-^xX2BYI-4fKC>XnSkJ; zRLEHq(^bbY;**C5`Jv+gFFA~=m_E47RC7UL&HJ!o`2Udhj?tCA*}mw%V%xTD+qP{x zD^4o5ZQHhOJE_=41r?q2?(Vy9_wBRq8RLxgeq3X$5AS^Dn$J%Yrx+_C4V662mQP3d zWeSlU6qTTrEJ}HrLQNWe0VQO5ur^lsp_ce^&@JzPKad`kw6iexI5~$7vPy#p=Dr`iyMeP;b0?Y%{VWCE(AtMwfjX zezH42z!?87X^eZITDSZhl~L+l&Sch6Og%}d0(KcXw&SN<7li0J5>6$ZXz@l+yOnc- z`vcPc^udWkAL0$w(`Wr_0xuUttxP7pzVzC7%v&i-zHIMe?I;yvhg^pandGY)`+_*T zpgMb@Lj6m{mE=GwSrGm3>Oo64nQgp@kKEy; zFW|q8<~=y(u zzP3*(Tud`h)5eDEYM^Awl=<6-P3Y3eD(M}~#*N+`k{YQEd6gm@{ZjNz9K-#7`X$|Q z3NTR4SbNU$+V`GZU7yt6@W%<^#=_7TO!wI)xo*uHn%3C~42B4vcY?7QVz-69aZzzq zz?^Lp!0emDluP|i6WmOt?XNoo%Xi=Aw~jdFwFgKfxD}6bkMcmF@S|DXSzv38kk}OCIU9QV*b& ztJYxh9b-tTrzu^>pN6|<$Px&H9Y{P8%j1Al#0e4Yh-La6lgS*qEXmmH{Rm8k5W?eK zNAyY*nSe}e<%tnR>3G+9D&JS-Zs1$H6Q8`+YB68euj(+(UC)P7Ro4~{HQpzL;%bpa zi8o$*@$_#J!9bm)!PTL}5SC!Ktbny69UrhHq-0VU+e@v|8d z8EctS1wHX0gsE%VS8=A#&9Lznedy&RAz8@SSo@LZ}2G@0f@TGCmro{L6zs`O<+K12&j{D}Rx%46vzP$l`Mf?>X;1OI&~{P)WHk37Awp^K@x z{Xb#!Y%NG{q{%D%@`Z6yGlut9c68DL6mS7e*pEt|FrHnS}2EnckK+jx&(W@5yec; z?GG<@j&}j?ax<^p;H#i*auA;=aG>rks5?-@#92g<{Q6r2ejQr_SAxZ3DUD7%1H?|n zBl>qlD(yV-Gqb6wKpvDysYD)>DfZHb4U~9{sxr=zXLgK(fuioz+DZ3xW@eF09`vaZ zW|HCTM+nO{?Ii=m$6@VujI)8s1q-ytCk2`+?V`=#ve!2_u`!ZHOu#)o1MYTxfsnaD%-lkO z>NQA@RIr?=Tse~=J3%6px>ktDl_h3M0{7f|(cl4#+^t}P{V!1d<*ddZ+MU6^mf?>I z+JasTRjzQbm&*m2qm|Y!NSQM@Q6sHVv`A}S%JXC_UBJ&4>%IIRv{(#%a`NFVD~HgS zXS^G~@_U+mw0hlgS8R7(;4SJk^5|(5ryzm!GEFJv*`CFT2c4i{Gc7MvHd`0a=PiOd z4;SD-j2$zS%+Wd6&dN&tr_xzB3{)=6f}Rw#>+S3Q<-K7dVf|1K~-Ho-KN>@)Pgz(oA{t06^HKV zV{K0#ZCKHYO=@Qrovl7iq&@{o`|;!0LVf_nUlTyBM3YT~4l8Qv$^tE>5Mm37Upwy! zES&#hE4YDjbzNGg#charo+$-MDP7$6s2LKw5^Q`Y(59W)6srUU@R?3qVEYW9L7VKn zF)LAUEd8ZaLek>kqCCDA1Z%cf_uDXH&c-scUT`6==%F~JMuNo7#!OvHof03F$N100 zBcn8ogXea`U1Buigg}xfm2#5{h%sZ2^q4L0Ts3UQUBy;8VgqqUDkl=mvshYjf7-ma zNlJ`8WX$dIJbNy(i>ohGi)MoA`MwGAt&vg}EscAqAu z3R3~CRT?p0E8O{B8rJs;?pG28{Xp%!<7?F@iO?Q)LKS!DrBVw^rfM|u%x4Y}rcbMg+T!N;4-p(ba?M-26s5@A&C=7@C! zCKRZ`fFFFI+Q6eatJdr0aN;;$sMaUGQ3E8+v-&l|pX^ZO4=`KTsw1AmpA)O27`LTN zQ0c>ufcUgeG#Xu=n-Yzz3~4JOc%38-JxvwI^Ds5l4?kU`&AUks4l^9%!9m`-)bDKD z3&i(t#9|T2evfo{`sn!(@v6K-_f+mXyD!kCC7e_ZJT6F0q@_q*LYlOLJy6t_?@TGQ ze8hl6=kk|pi6aqH1Dx->Oj9n3*@CC`X_2!=OR$c*c#$x5@O$=zk>z=noBa*Cm=iQQ zl8fcc=>f~jK*iQArb~~eegrFs;a1gzwm+qe{-oatY`v$?99I3xD9-J1VQVDAV1^8C zG|N83)U?)8->F}*Q%~H^W5CeHUWQ=k;M?$AjpHddX$H7f-xw*^bMLu;3~X_esi%l@mgaMfSnP6nZs%%nuCiiy|LP5^D=9`{Qgg$mzjw=Rcq?nfi zKlhH$S;3`kUDoP&v_tfenhQ0h@=D1EDfN+Tr=|WnSvjten-WB4^Vf(6F14xuYh~;@ ze`g)bBbPE0?j{K5Xle6!wwp_Ee6+ZjB&-v8Q}+q*K@-z(t%%%h`s z!r9i{<2=SUEDi_aL3`}7Yp55CFfke*D{p|GE5n?!Cx;t>BN=xY-B6l2@GLlQuIe#M zbV7CCow~d3i`RY$wbSM|CsJFmnCYFCz1sQbwam_ev#nv*df7|!Au^w>g`-eWe?JH3qG zJo>1vc)g!WuZ&vsybg%Na9jd{cvkgs10NQ1H_-JWz1X|xLPx(%KRZTreS#Z%V<=z1 z%nnq!_E~HGkY&8svGxSBu?@mrIxPs$PrDj{J}nAZo{LQ`MPrQoz&bV{!5P}_Qs2eH zVUpz?=*-eT!4;J3yn(7{Q&k3uF+u}Z2G#3pg8MR+;g7)i5}iWe@co!Bsy#s>xdpyH zhCjQ&cck}=a(V}OxK+-0WghSuz4zmc=A6n->eMzLm=uD&9`^Zj{Rw%^E*Si(GjlIB zi>ivQCsH05mQ^ZeOy-ypo%c?0@XBI#=Pw_%ThcU!bjdy7FO+YP;!vR0rbIMp-98e@ zKb)K1@wK(&^YbEE^5SXpG)HJ#x!eoORlf8Zlk)q|uodS6^iwIek2nP!Oa^{Q3T3!a zSwN*Iu&mBifcIV$*q^09hejY;BW?eu7PLt9(NE$O;1F4G8L8&%59)GHR8@B6-&PfR ziAG-<%T6Y1xx}yRH%KCZa1nQV-9I_WX+h~;;|{f;RH7lxj^6X=RCa|ibvW3EV?53P zQ;n{Bd>fABR}k|tKQ<6^`hxK%b_XC;HrsFUD)>Z}L(Bi@RrJ^=(78-JL_rqhmQzOB zFj_ku0diOM)z5iiUx~}4tR5tchY(T1!Chb@qfk>qjJ#FoU!9sj@fT(3SDLB*NLabv ze+0UZEoE$Rtc;W{vR(HpVw+Q>6VLh{@2fdGhR@4xp)2?(!HFv*M*ZmSiWJ{NizQU& z$suYOLK+WDqimSG^j+-o{0(@kA(GBw@lv+!SSqEs1Gyh!rqt%0z8_&}`~l?=!*X;p zPfe|GojmN^aYNIk9!G0W?m=nA@B4upzhrcI-RKZ5y>xGi;>@GWV{Yke5Te&#%z9L! z=P!=I6T`2yIl1)2YSk%bORv01ePG3WPXRvKMj0~W^ugOc0{S9%?w)}Chu8YE^!9Y^ z_4D!7UfbhO8Y@4m(fxw*hi+z=WZ3TA2HEL?D2D+t5qRtYGh1;9oliZvad|vZP936R zE?t31QrK)lDX9p`_+WW7HUJoVZP1b(P{`e-Ah^ht|7o3db|7O zakOR^)xmM{zBC9wnI6`{{;*?b^Sb<=$Vikmi&Gw>F&qbA;AkzFXVfmCE<5dPjoA*4 z;|Ls4d6T#bIsuQp!GZqt_F{Q(cA@^(g#6;1$Z0z>511|IRsT%X|fIG)MVr4$aFL zk=vQeo(tH(l4ksZW5xovT%vBHvo{iGjJU!n!HqMHaP@&QGD68BCd8shhiympLFCd0 z>A7!2hrGh`Vj`K0xdU7G%y;aD*xQ&=4%@|hg9-7%Mb`mLw|rAfJdEpSmd7qe{U5E; z8hNp83M~m-Nxih1BiN1KKG%1dlpb+a=O-RKj3)N1^{JBUQG42n13s7{Us>0GK!s0I zDZ!F7!II9VwXhr*1AnZroq@5K&fQ~U-D+dqa%%(U43jE9owP?MaL`CH_jyd1i}ulY zNNN8%q;b^?p4>T1`msmtx)L1${=t#YV2^?-D#bUE3^b)2p;(yIS1L1XWZE&Td|baX zS(rIBLz;3XeQUby!pT*Re|ab|5?LVp$&Gx^PU-&|mf}dTiWS!=)mU?XyLh;NSHn_y z4W!1>4)a)}bVBi>dI_a)jOa_cr;g~$y0?ndgZ?`r_x7Sr%W_Wkw4j_XAc3sSV#
      d$%UM@zCiyG3zXz~%I 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∨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%0Ao>2bPD$nQmXX;mkRER5};S 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 }O5e6!ynv{ihgprhj@_^{_Ad4%F4 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 diff --git a/pkg/registry/zookeeper-3.4.6/lib/slf4j-log4j12-1.6.1.jar b/pkg/registry/zookeeper-3.4.6/lib/slf4j-log4j12-1.6.1.jar deleted file mode 100644 index 641159959c21651235677a4912bb58bc47cfef41..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9753 zcmb7q1yq&W7A{>P-LR#kyBkD8y0>(9cWp{Qx>Jzu?vU>8Zb>QWM)Ki3$K%y=&VBE# zG5G(@7;}FAidk#UDJKaDg#h+_h*xd${^!S^5BR6Iw1|=*ow$rBgWR8FaA0CjWLI~a zNSxqcU{(-dU>N^RCM_ru^9y^B|jt|syl5rh+FQHc&cC+SMRmcV0& z#Rw{I%T;Sz51kEGLS2B%PicD~^ zOptJ-EvPkVd~C$41}3M4Lm3)~8n zx*bgLZ>JMI88_M6O(uhlkLO>=6^s#zC0)jp-nt!}^KyQ)Xxi0DMx7-Q1$e+t#GYz{ zy>0cZLJ1|0&jEsNic@*k{@^1$M^|aI0cE*35#osBuALMrmdkZ60 zv;RSd{0p6_rH#d3#Bl%lEX~Ub>g6W^kiiE7qxd_ql(jLd+0(<=&`!`m*T%unj$YqF z*WNxS!Q2LY7PI%!nNGEmR$pJgjhz_=aqd(ICV33yl+hCkRri>uXVrzS%+Q;*e&VAt zUi4VD_(xXcn?UiTmgv~p4EO{c%9qDXEGfIy)r2<{DdIc_+fFw*2L_XxZwR}#$MCRM;;5Z3>R%RDdwyu76$>s@4L3Z^; z_KZmzIa#zmD>~vl)`V@@?f~&_cBwa|tmU1_Gz~8vHOd7|F0CLZy9C@`6JvYzcoT9R z>%)4kx5?rLqp9&0i{8|@kPw7iep|$ugVRQduk?n*jP=Xj_{N$^U~2tE z9p03h>AHz9sc`^KEexp{iM;e>A$ruwR@U@de}S0eyG2&1+Ry?;Zs!K(em$BrVVEGfv+pyV&igDBh8|bjlLOC8FjGHYt5DI>RH%0Q8}Hu zq)g-L(ZR0Jqbv~*d#NotVn8CiR^{?>%3kL@A8V@H#ZW`LE)<@QStRkwv1>i1uyk^0 zdAA@?RL!ne1pAxZMuuMj>vLw_$T)p-Dt6|^VUt>xDHRpG%G8}~T)LAwP;f?<9-J>n zRpD}w%RW>@S$U6%UrxNN2=_wu`0kiHch5DQWw=cTAt0jPQ$68O`05>A#E5fRI*+dC zOPA%)9&4(~_hg+W(hB^SMJM{g@?RnDRJ$n-nC&V2blb1=j1lQy^JjL4Nt;KQ^wz+M z^vEK2^}yo*%;}skygGE5*cm&GXyoWFi|wNAT5V5!M-rA%lfuJm(h$uQx#LKgDue7= zcyO3F*bm6nB8n*30mx{f{D^L85^ zcSB(TH+wYXPYHtk_)XNTH4dH9wl&Koo?ZDGwO#`%5av!8L+eUEx&U_EzxU^%yX zL_87Jm66&LHX*ly@+IBvkDvGu}gZRG7;*Wh#5gzDZmu?XZaXN!Uy zfV0svpFp-+mr@ZC_9O_xXhoTs2yg3c(bJA6^QxN*JAw*Lq{@QL+f^v>_)Egr8f-%t zT(BwG@B;%xy%k6q0>TPRZAd#hTXp*z`sGs8ViEc8Gfbp*fanVlia`bC5z6K*Em#X? zYHjW;C1{e*d)@igr?L1gr`9?|P#8J$dmIa6&WA83&hOPoGW>UpfYK$?A?DH_u@UAo z=KTTcN~}dC&Ip#J%ZKrAeL9zCTJnyV{K1RV;+Vhb@JbPn$r{p^K6Abk4ROJH#%j)o zeK>kJ95ww+zcbo*=d-MLG&5D^Gl&!oP(b{xQNM&)%fJdDVC$KccKlIlvDD&S3IH}A z*JL+W?Q8CYwbDJ3)-eqozl4F+w>Lh`&5gIOIHnaH%_Kr5iZVTeKp&gp`rSmr1UeP- zUa)}5!}wwLcK2$)!^*RgTg;Q%^0B8r0j!VLMQ6=jy)$bAmD$Wv+!rV7KCgNu?YO`p zPu`O{ut~9CnhiG3M(&j~A_RQ0LK-RRJ5z|*qdsMLwihws%JvQFMZk0LFS-J6Gtmu| zHr2XVbfMkGsGDM+(VgS1Zcd+1Qyh9j9QE1^we#sT;`G&vr4ZTEVh1{gKj@r#myr21U~#faWVZW(uhY@7l0GiMFOkr(^NFp=4IUkZ9(0zr-|R0k^ET zCqB<{xZJcf8t7V9$~t6t`& zMDKP+?>3W9isa5Y;H+e@-V?)bkQ9`O>A9=uxi3f!U@1d{mr#w`gs9QuG%d=@NyJ|??8V^<|Zn7?_+u4q46 zc3A295|CsVGH0MpH%~CqW>k-vWP!iC*aDT*xjRQIX;{T8bbcjwu1+=xl;13Gf+aqwUdi_R*)R z)X^p;UW(yoC&N(X3BFz+A_hc7=0=P!?CYKLpk25Hj{}0o36F?How)%0ZKi%?d0ymj z57BISX52D-Sji8a(Uaqd$sk&;dkXQpS+wNv+>I&y{sIaQq$kIuuumy(C!fXnp?%ln ziQJU)!eCvgfQV~PuFyrUtoTvkPjb^-9JZ)@ON^`ojI1p~8}5(ZiV>K316hC|>x53x;KST?vxbDuE%Q0MB!=piA$cR3LCx|J&GRB; z3D}Qu%{y{;$21XHity=@yTYw@V7?OA{&80M5)3_Y{O{wyn~DiK)CVF1B|lZj;C{e0 z!NImo6bvNE4lIIyFLGxjJQYePz)Ry~+r9BYQb4!S7Nd73ARy*3FU;sv>ZHjIzk7L4 z=K};s6pL7Ex85hZjD4MYL1Ha%X)$^_2QX3z*5LL-K0HM7fZDITXAvw5Rn1_r)x`mef%iFk3~ z(x3YhFTIu$Zh{UXiWY;8>WSp*Bk}izTdNJLBV8{I3=MQc1ph1t>>fHp5aLu`FRRn2 zV$~$?g!1)LpfR7p@a4eLHb$xJiPzhxuB_BpoL3rRYbl5!i)IPd(B959I@%L$UzjOG zyyxmv+AMq^QH-uh38vphWK$gA(%p6)XC9ixph~BXH`m7rtqa(jH;FSkA>#jiF?et11Lz2|0IKo{P03lKAMv-gvr=$TwWdIy$%%RT8J5$`slfHi;gRHVL`QvRKH~!r`=) zagWm!hquePARO?h0ON74(@Dg(w*BGsG!+&(})W)M!eW&#@)#{pDoSz-ds}rghL2N;K@T>oMko`&SazrZ{$}#OsPxsML^S{ z-lN5*%uCw_K5(}o9&Euy<*dI@FgsIvfLK?_ew;%OB@TG=(YBPPT!Yt)E0p zP_L%^*Ne*iX`n_{2k#fhlsSuCD^B@aFUViTp4?c^Y8Vm>EEE-_>m@&FJ)WH+gK_oYMAxBqN-qWL!w(J& zn5)R272;W$tAr2-%T8Z{2+}f8dI3woPQK@9y-YsO*(|8ru<;JfDa|P1h2IW+++D_k z%iVT@ehuxmf`UW$kxjqIwc3~y`AcedobY(5n7J}{?#%&%{}N;sF(a@##jI49PnCBl z@r@&ma&=KiKn{=Jg@>y1a|#BOQWbxPolUVB%=--9`1)LPwfg8{djSGOBW&*)%Hw zsyVjV>u$P&S3Q&V#zGY(9^PyI9nO(K4uo=1qKRRRY_qzwx?VFJ=4_o*DwX4m2@65X ziYzaJWqJ?|W1l<6e2Xg`p2}@Vw|*NG3T#m78gQB{z`2qFHY;f-VokXM&=aQ0bM*0f z@LHx$UXVL#bSOJ4q~QW4DfjAvRdX{pJcQVhc4XuY9eLYk@thppeXZGer%vEjcCTMV zBu;`?>|TRMINs&^r$u7cT|YKYXPLPjjpdi$Z1Wi7IkL=#$rRA3eu#r4HKwAj8SGM8 z+(hG?RRm&&72Txt6CBFlUHV(X546@0dL+-HTT?HtXli@~uIgqQHG-47t!mOmayC+@ z1NwU6vFWWJNS8N1UXjMV$QS6iTT*tWm(W*MlfIOF&tdtw(gqivUzT^^lf=dl%(}~n zTRoHjk^2F3mo+N{=P1)U9nu=an`Y=X9+wYQa-X*dm$wL3c|ks}n9eBtne*Tf98A#Q zT%m{&&vxq=8s$C%)YeY8srH;ug^4>v z!?B9-Uxb)UI4c-%D3%i!h`2cl*(8-lc=7?~Q|kvTur0gVS*kwltgwLn&CR$mpJ9PuT?B98gjv5b+-NS96e&P)73nDKV4r zWDfozQKIOe>tL$?N2cVpsg=QxL`fLXTygO&3LnH`C6J7KOBF&1J{vk(Z7r($`Aa$` zcE`+w07Q6c^#~Mf_0Vz+aespw-%~bkaz;b)Z*z$c`7&1n)J*ItGlcFXpZOY%M@vf| z@Aj^)z?5QN4sEmq!jiPajd>rvbkHOArss`id>0xh0&iO7kIPz{Pab!))0L>*4xvZu>Fsz+dHwf=KJ`CmP&(A4kc!Zu#4cF z#tAJOEkkqu+flM@IrdKAzS22oYE==@?z(nMI3l6YsQSrI@8LtU?MV&Obrg)G4M0or z4W?)qT;$-;Y*6B`dmi;_&vn%i2*3a7aO_ETaU>+=b+(LR;if?F%PLyZj)J_VGOGja|x>^-V?ImUvoIRjq2)?%zx5wb0nYjj(Oh~m+bg0EZtO3CRtQlR{) zib3k_8C@Qp@G=%k8pnYgm$>uS(tbOv*}_)M2i8$4J)s`OCDimgWq5GXVQLt`5Q{w2 zuDI9}L>A_r3MzdR-Il1Y%9z0WhLG<*-y1?Z*2ajOPHEBT7Pq%k4;sFq_l(*B z(v;E}RO-I+74e&Ai+-bdMTZbrU%XYbjLDEQlMLh=OaaF}A!sjpm0QZnt&ws?fYQSVXoGQU`l)L|Ixld6ZF zE_W+?v-y?zeq-H2?d34W6F@qRLCM=8aV;Ytj+X#r+@kP#5hZ@*6I|Is1!)nB#yjr_ zygnVCAEQU-Ls5lSRR9GQU-`gnKfwHIQI@0!3tFDyYMpKak0yz4eI+jly|kF;&q){$@b+qcMI)XdCUL}Y?-jAWg@rnmqXsx0iMfYMMb0X`Go z{>}xntx4)}Ho1yOHwvGm>7}k}2fn|KC+QV&V{LPsexMOuV>)-Y?>y-=Eil+@d0Inp zWokddKZSkp*1x%H42X8wklPsVF~GRgwlHTAipp7l&DI-)NlkD~6 z&zk2+4`On$YU~7uZI;o>j;i-x;3>iQdd<@&9U=(5;jQRg9ag!85u!AY4_mS|9WDP< z(@f&pp(;5W%=6LGu5s(UAt1MNOp$RZx0>{%>roBI%qVc;v~+mv%@C;n3-chf-gS{Q zi&U3-XArwING2DzCkc{kQ1esx;H^1DgS@SD5pASmQ!BeTa+z` z{X@dK13V4FvYyXczlSTX=w4(p*{h>4U+TVEI`wuQVN68*I6`Dxy$jbFtkPO~4M71I z3`D(r2{HKBg`#3Lq+N^|L}8SjbIr=YcF6Pbj=db~0|0J=Tfm-@)P+nq^#?29q#RB* z|C!X9zD%8MECehIn>}obp9;y~P-^Pn&?t924w_uSr0YW}w zJi>WWgBSUAS ztlpAhU=PV3ytoO7nbk3#$9LG5(dux6UXg7-2{x^!Mv5GjZIC^Ya_I~tCANEIAhtZh zKz;5#g6}Z7^BQ}H3tMxVY>)|EUSu?@0x^pB(Ey#MpnTfUwXn@~@;R z`?O=8NTD?}B03Pkl=_Sgkec64(OJjAd$Qw0P|@fml|?^H&|5NHhcrQpzZ1*+K>k3v z;UepE z$R4X7TBAWrwHI1yiad@cR(>>apW>+fgy>K88Tq5y&S6vs8p*+pL{!QL6@z;}af zUnefZpxy{49!?pp4y`xNp|yU3WbW2~K79Y3u8MV{w$w0NbMD)XP~eN*B5c6i%f3iW zdtM4q@0fb&KBIw|XQvU)6kwD+9O-IbXK~5CKW5fr(7}1AZOv(YNElY8kBIFcu-Cvv zrF5x}*Mdil0vmz%Bba`GSl$cyXj0+5Y;pQtb2MK34}Fa4hb^T`3M!)~B%Ka79miSH zkA3DA1nN#acJ8u7*e=qapyFm}IZT5Tt|A}?mmOS6NDEMvxRg6+Fw5k#gYFq9I}Kp< zt|6+ej(XFHjv+Cv<>Z+Bfe&?WuBVW)jf&RkMfH?`>4gNqgV)j-`FhX&tlE`CsQsgi zalU5P*UVOy1kMlx3Buf0kP*)!Z!(V)7j#Y7`*E5r<#Z z0MGP!yxH*&rnu!-9duwmOlf>|$(jLvM+!O4EbRWu+6=MdJxVrRSC+6&P~@FVi%<2F zoPJRwrMW}rxISg`Li2mCEqT4M5_KEa-eec_@R{XH3$bLXeZFaX$Mg0RVYw|*A`EQS zoicBVw6sPjp7FA=Mjo&5A?O=Vco|WLbamTMch!lMp3vhh`3~9?+gStNmc#kbG1!|j z##dx3T%D^0`GurhQlk_kC#M2G#Q5*U)bACyzly1rx=w~xe^uQ6PK^6^;-{(}{qI%1 z-wU?iTKcf;3y`OxX3)j?>6-A>3+kKXonE8yE6EHE zB_(pOj0$p%UcQVSNk2-ScpsG3nG*XAssn=%4wAEXE&N?*@A1_j!c80Gayg8wjL!^w z?*=MCtNG5{ndtG6S^e93Dkmy*w5rGiVL^)5w;xmk$%f~!)wn;QEUdk_Q$Cu8q(FV{ zE9f;!gh%4^ST_hdVpq3s19j*;36S63O&Z2 z4wUCRRG&CiC%^65oJ1p3@rSv(RLJ)DQJdz`qiC(@?gvlS!($p_q{p>{O3pcbExUpt z<~|zVcarDLC09 z7+7%s=&b|m-uk6Fg9kX{zVk{bY};otUbqZPGu!pG!bQUc`$u=nHKE~CnDejktI9J< zM|Lvk6D9@FP?fK@{E`()HE_Ki-xbYowQKT@u6XD(*Dz+(>NtQ305)1-#;An)V%RWE5XmH{@!lz#{#}Hednn9ljDaG`ggwXrtXjNop13MzCT+HelY)Y zv%wGcY;U+Hqx7?%;Xlm()_U-B?f;yf{s~Hh_`g7ZNml<3`g`*4Cn(9&s{d)Gzo!C! zNBlj1@Dq^<{cni>mQDB_^!F>oPf%a%e*yjbh2nS6--EKBp#FIO2KsA=_7m~%F7H>N zkp}#iUi|QuKZNG*%-{XxALF~kf&R|?(+&QwIeb^EpD-2w3+8uk`eSbY>`#BdW_w@$ zzk~kiU4KsapY7pK>}aCDZQ9Ru|2pCC*gvhKoFw#< - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Tests failed! - - - - - - - - - - - - - - - - - - diff --git a/pkg/registry/zookeeper-3.4.6/recipes/election/src/java/org/apache/zookeeper/recipes/leader/LeaderElectionAware.java b/pkg/registry/zookeeper-3.4.6/recipes/election/src/java/org/apache/zookeeper/recipes/leader/LeaderElectionAware.java deleted file mode 100644 index 6c32ebc9b..000000000 --- a/pkg/registry/zookeeper-3.4.6/recipes/election/src/java/org/apache/zookeeper/recipes/leader/LeaderElectionAware.java +++ /dev/null @@ -1,37 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You 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. - */ -package org.apache.zookeeper.recipes.leader; - -import org.apache.zookeeper.recipes.leader.LeaderElectionSupport.EventType; - -/** - * An interface to be implemented by clients that want to receive election - * events. - */ -public interface LeaderElectionAware { - - /** - * Called during each state transition. Current, low level events are provided - * at the beginning and end of each state. For instance, START may be followed - * by OFFER_START, OFFER_COMPLETE, DETERMINE_START, DETERMINE_COMPLETE, and so - * on. - * - * @param eventType - */ - public void onElectionEvent(EventType eventType); - -} diff --git a/pkg/registry/zookeeper-3.4.6/recipes/election/src/java/org/apache/zookeeper/recipes/leader/LeaderElectionSupport.java b/pkg/registry/zookeeper-3.4.6/recipes/election/src/java/org/apache/zookeeper/recipes/leader/LeaderElectionSupport.java deleted file mode 100644 index 8f8ae2060..000000000 --- a/pkg/registry/zookeeper-3.4.6/recipes/election/src/java/org/apache/zookeeper/recipes/leader/LeaderElectionSupport.java +++ /dev/null @@ -1,461 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You 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. - */ -package org.apache.zookeeper.recipes.leader; - -import java.util.ArrayList; -import java.util.Collections; -import java.util.HashSet; -import java.util.List; -import java.util.Set; - -import org.apache.zookeeper.CreateMode; -import org.apache.zookeeper.KeeperException; -import org.apache.zookeeper.WatchedEvent; -import org.apache.zookeeper.Watcher; -import org.apache.zookeeper.ZooDefs; -import org.apache.zookeeper.ZooKeeper; -import org.apache.zookeeper.data.Stat; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -/** - *

      - * A leader election support library implementing the ZooKeeper election recipe. - *

      - *

      - * This support library is meant to simplify the construction of an exclusive - * leader system on top of Apache ZooKeeper. Any application that can become the - * leader (usually a process that provides a service, exclusively) would - * configure an instance of this class with their hostname, at least one - * listener (an implementation of {@link LeaderElectionAware}), and either an - * instance of {@link ZooKeeper} or the proper connection information. Once - * configured, invoking {@link #start()} will cause the client to connect to - * ZooKeeper and create a leader offer. The library then determines if it has - * been elected the leader using the algorithm described below. The client - * application can follow all state transitions via the listener callback. - *

      - *

      - * Leader election algorithm - *

      - *

      - * The library starts in a START state. Through each state transition, a state - * start and a state complete event are sent to all listeners. When - * {@link #start()} is called, a leader offer is created in ZooKeeper. A leader - * offer is an ephemeral sequential node that indicates a process that can act - * as a leader for this service. A read of all leader offers is then performed. - * The offer with the lowest sequence number is said to be the leader. The - * process elected leader will transition to the leader state. All other - * processes will transition to a ready state. Internally, the library creates a - * ZooKeeper watch on the leader offer with the sequence ID of N - 1 (where N is - * the process's sequence ID). If that offer disappears due to a process - * failure, the watching process will run through the election determination - * process again to see if it should become the leader. Note that sequence ID - * may not be contiguous due to failed processes. A process may revoke its offer - * to be the leader at any time by calling {@link #stop()}. - *

      - *

      - * Guarantees (not) Made and Caveats - *

      - *

      - *

        - *
      • It is possible for a (poorly implemented) process to create a leader - * offer, get the lowest sequence ID, but have something terrible occur where it - * maintains its connection to ZK (and thus its ephemeral leader offer node) but - * doesn't actually provide the service in question. It is up to the user to - * ensure any failure to become the leader - and whatever that means in the - * context of the user's application - results in a revocation of its leader - * offer (i.e. that {@link #stop()} is called).
      • - *
      • It is possible for ZK timeouts and retries to play a role in service - * liveliness. In other words, if process A has the lowest sequence ID but - * requires a few attempts to read the other leader offers' sequence IDs, - * election can seem slow. Users should apply timeouts during the determination - * process if they need to hit a specific SLA.
      • - *
      • The library makes a "best effort" to detect catastrophic failures of the - * process. It is possible that an unforeseen event results in (for instance) an - * unchecked exception that propagates passed normal error handling code. This - * normally doesn't matter as the same exception would almost certain destroy - * the entire process and thus the connection to ZK and the leader offer - * resulting in another round of leader determination.
      • - *
      - *

      - */ -public class LeaderElectionSupport implements Watcher { - - private static final Logger logger = LoggerFactory - .getLogger(LeaderElectionSupport.class); - - private ZooKeeper zooKeeper; - - private State state; - private Set listeners; - - private String rootNodeName; - private LeaderOffer leaderOffer; - private String hostName; - - public LeaderElectionSupport() { - state = State.STOP; - listeners = Collections.synchronizedSet(new HashSet()); - } - - /** - *

      - * Start the election process. This method will create a leader offer, - * determine its status, and either become the leader or become ready. If an - * instance of {@link ZooKeeper} has not yet been configured by the user, a - * new instance is created using the connectString and sessionTime specified. - *

      - *

      - * Any (anticipated) failures result in a failed event being sent to all - * listeners. - *

      - */ - public synchronized void start() { - state = State.START; - dispatchEvent(EventType.START); - - logger.info("Starting leader election support"); - - if (zooKeeper == null) { - throw new IllegalStateException( - "No instance of zookeeper provided. Hint: use setZooKeeper()"); - } - - if (hostName == null) { - throw new IllegalStateException( - "No hostname provided. Hint: use setHostName()"); - } - - try { - makeOffer(); - determineElectionStatus(); - } catch (KeeperException e) { - becomeFailed(e); - return; - } catch (InterruptedException e) { - becomeFailed(e); - return; - } - } - - /** - * Stops all election services, revokes any outstanding leader offers, and - * disconnects from ZooKeeper. - */ - public synchronized void stop() { - state = State.STOP; - dispatchEvent(EventType.STOP_START); - - logger.info("Stopping leader election support"); - - if (leaderOffer != null) { - try { - zooKeeper.delete(leaderOffer.getNodePath(), -1); - logger.info("Removed leader offer {}", leaderOffer.getNodePath()); - } catch (InterruptedException e) { - becomeFailed(e); - } catch (KeeperException e) { - becomeFailed(e); - } - } - - dispatchEvent(EventType.STOP_COMPLETE); - } - - private void makeOffer() throws KeeperException, InterruptedException { - state = State.OFFER; - dispatchEvent(EventType.OFFER_START); - - leaderOffer = new LeaderOffer(); - - leaderOffer.setHostName(hostName); - leaderOffer.setNodePath(zooKeeper.create(rootNodeName + "/" + "n_", - hostName.getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, - CreateMode.EPHEMERAL_SEQUENTIAL)); - - logger.debug("Created leader offer {}", leaderOffer); - - dispatchEvent(EventType.OFFER_COMPLETE); - } - - private void determineElectionStatus() throws KeeperException, - InterruptedException { - - state = State.DETERMINE; - dispatchEvent(EventType.DETERMINE_START); - - String[] components = leaderOffer.getNodePath().split("/"); - - leaderOffer.setId(Integer.valueOf(components[components.length - 1] - .substring("n_".length()))); - - List leaderOffers = toLeaderOffers(zooKeeper.getChildren( - rootNodeName, false)); - - /* - * For each leader offer, find out where we fit in. If we're first, we - * become the leader. If we're not elected the leader, attempt to stat the - * offer just less than us. If they exist, watch for their failure, but if - * they don't, become the leader. - */ - for (int i = 0; i < leaderOffers.size(); i++) { - LeaderOffer leaderOffer = leaderOffers.get(i); - - if (leaderOffer.getId().equals(this.leaderOffer.getId())) { - logger.debug("There are {} leader offers. I am {} in line.", - leaderOffers.size(), i); - - dispatchEvent(EventType.DETERMINE_COMPLETE); - - if (i == 0) { - becomeLeader(); - } else { - becomeReady(leaderOffers.get(i - 1)); - } - - /* Once we've figured out where we are, we're done. */ - break; - } - } - } - - private void becomeReady(LeaderOffer neighborLeaderOffer) - throws KeeperException, InterruptedException { - dispatchEvent(EventType.READY_START); - - logger.info("{} not elected leader. Watching node:{}", - leaderOffer.getNodePath(), neighborLeaderOffer.getNodePath()); - - /* - * Make sure to pass an explicit Watcher because we could be sharing this - * zooKeeper instance with someone else. - */ - Stat stat = zooKeeper.exists(neighborLeaderOffer.getNodePath(), this); - - if (stat != null) { - logger.debug( - "We're behind {} in line and they're alive. Keeping an eye on them.", - neighborLeaderOffer.getNodePath()); - state = State.READY; - dispatchEvent(EventType.READY_COMPLETE); - } else { - /* - * If the stat fails, the node has gone missing between the call to - * getChildren() and exists(). We need to try and become the leader. - */ - logger - .info( - "We were behind {} but it looks like they died. Back to determination.", - neighborLeaderOffer.getNodePath()); - determineElectionStatus(); - } - - } - - private void becomeLeader() { - state = State.ELECTED; - dispatchEvent(EventType.ELECTED_START); - - logger.info("Becoming leader with node:{}", leaderOffer.getNodePath()); - - dispatchEvent(EventType.ELECTED_COMPLETE); - } - - private void becomeFailed(Exception e) { - logger.error("Failed in state {} - Exception:{}", state, e); - - state = State.FAILED; - dispatchEvent(EventType.FAILED); - } - - /** - * Fetch the (user supplied) hostname of the current leader. Note that by the - * time this method returns, state could have changed so do not depend on this - * to be strongly consistent. This method has to read all leader offers from - * ZooKeeper to deterime who the leader is (i.e. there is no caching) so - * consider the performance implications of frequent invocation. If there are - * no leader offers this method returns null. - * - * @return hostname of the current leader - * @throws KeeperException - * @throws InterruptedException - */ - public String getLeaderHostName() throws KeeperException, - InterruptedException { - - List leaderOffers = toLeaderOffers(zooKeeper.getChildren( - rootNodeName, false)); - - if (leaderOffers.size() > 0) { - return leaderOffers.get(0).getHostName(); - } - - return null; - } - - private List toLeaderOffers(List strings) - throws KeeperException, InterruptedException { - - List leaderOffers = new ArrayList(strings.size()); - - /* - * Turn each child of rootNodeName into a leader offer. This is a tuple of - * the sequence number and the node name. - */ - for (String offer : strings) { - String hostName = new String(zooKeeper.getData( - rootNodeName + "/" + offer, false, null)); - - leaderOffers.add(new LeaderOffer(Integer.valueOf(offer.substring("n_" - .length())), rootNodeName + "/" + offer, hostName)); - } - - /* - * We sort leader offers by sequence number (which may not be zero-based or - * contiguous) and keep their paths handy for setting watches. - */ - Collections.sort(leaderOffers, new LeaderOffer.IdComparator()); - - return leaderOffers; - } - - @Override - public void process(WatchedEvent event) { - if (event.getType().equals(Watcher.Event.EventType.NodeDeleted)) { - if (!event.getPath().equals(leaderOffer.getNodePath()) - && state != State.STOP) { - logger.debug( - "Node {} deleted. Need to run through the election process.", - event.getPath()); - try { - determineElectionStatus(); - } catch (KeeperException e) { - becomeFailed(e); - } catch (InterruptedException e) { - becomeFailed(e); - } - } - } - } - - private void dispatchEvent(EventType eventType) { - logger.debug("Dispatching event:{}", eventType); - - synchronized (listeners) { - if (listeners.size() > 0) { - for (LeaderElectionAware observer : listeners) { - observer.onElectionEvent(eventType); - } - } - } - } - - /** - * Adds {@code listener} to the list of listeners who will receive events. - * - * @param listener - */ - public void addListener(LeaderElectionAware listener) { - listeners.add(listener); - } - - /** - * Remove {@code listener} from the list of listeners who receive events. - * - * @param listener - */ - public void removeListener(LeaderElectionAware listener) { - listeners.remove(listener); - } - - @Override - public String toString() { - return "{ state:" + state + " leaderOffer:" + leaderOffer + " zooKeeper:" - + zooKeeper + " hostName:" + hostName + " listeners:" + listeners - + " }"; - } - - /** - *

      - * Gets the ZooKeeper root node to use for this service. - *

      - *

      - * For instance, a root node of {@code /mycompany/myservice} would be the - * parent of all leader offers for this service. Obviously all processes that - * wish to contend for leader status need to use the same root node. Note: We - * assume this node already exists. - *

      - * - * @return a znode path - */ - public String getRootNodeName() { - return rootNodeName; - } - - /** - *

      - * Sets the ZooKeeper root node to use for this service. - *

      - *

      - * For instance, a root node of {@code /mycompany/myservice} would be the - * parent of all leader offers for this service. Obviously all processes that - * wish to contend for leader status need to use the same root node. Note: We - * assume this node already exists. - *

      - */ - public void setRootNodeName(String rootNodeName) { - this.rootNodeName = rootNodeName; - } - - /** - * The {@link ZooKeeper} instance to use for all operations. Provided this - * overrides any connectString or sessionTimeout set. - */ - public ZooKeeper getZooKeeper() { - return zooKeeper; - } - - public void setZooKeeper(ZooKeeper zooKeeper) { - this.zooKeeper = zooKeeper; - } - - /** - * The hostname of this process. Mostly used as a convenience for logging and - * to respond to {@link #getLeaderHostName()} requests. - */ - public String getHostName() { - return hostName; - } - - public void setHostName(String hostName) { - this.hostName = hostName; - } - - /** - * The type of event. - */ - public static enum EventType { - START, OFFER_START, OFFER_COMPLETE, DETERMINE_START, DETERMINE_COMPLETE, ELECTED_START, ELECTED_COMPLETE, READY_START, READY_COMPLETE, FAILED, STOP_START, STOP_COMPLETE, - } - - /** - * The internal state of the election support service. - */ - public static enum State { - START, OFFER, DETERMINE, ELECTED, READY, FAILED, STOP - } -} diff --git a/pkg/registry/zookeeper-3.4.6/recipes/election/src/java/org/apache/zookeeper/recipes/leader/LeaderOffer.java b/pkg/registry/zookeeper-3.4.6/recipes/election/src/java/org/apache/zookeeper/recipes/leader/LeaderOffer.java deleted file mode 100644 index 188a6d575..000000000 --- a/pkg/registry/zookeeper-3.4.6/recipes/election/src/java/org/apache/zookeeper/recipes/leader/LeaderOffer.java +++ /dev/null @@ -1,84 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You 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. - */ -package org.apache.zookeeper.recipes.leader; - -import java.util.Comparator; - -/** - * A leader offer is a numeric id / path pair. The id is the sequential node id - * assigned by ZooKeeper where as the path is the absolute path to the ZNode. - */ -public class LeaderOffer { - - private Integer id; - private String nodePath; - private String hostName; - - public LeaderOffer() { - // Default constructor - } - - public LeaderOffer(Integer id, String nodePath, String hostName) { - this.id = id; - this.nodePath = nodePath; - this.hostName = hostName; - } - - @Override - public String toString() { - return "{ id:" + id + " nodePath:" + nodePath + " hostName:" + hostName - + " }"; - } - - public Integer getId() { - return id; - } - - public void setId(Integer id) { - this.id = id; - } - - public String getNodePath() { - return nodePath; - } - - public void setNodePath(String nodePath) { - this.nodePath = nodePath; - } - - public String getHostName() { - return hostName; - } - - public void setHostName(String hostName) { - this.hostName = hostName; - } - - /** - * Compare two instances of {@link LeaderOffer} using only the {code}id{code} - * member. - */ - public static class IdComparator implements Comparator { - - @Override - public int compare(LeaderOffer o1, LeaderOffer o2) { - return o1.getId().compareTo(o2.getId()); - } - - } - -} diff --git a/pkg/registry/zookeeper-3.4.6/recipes/lock/build.xml b/pkg/registry/zookeeper-3.4.6/recipes/lock/build.xml deleted file mode 100644 index 841cc0181..000000000 --- a/pkg/registry/zookeeper-3.4.6/recipes/lock/build.xml +++ /dev/null @@ -1,128 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Tests failed! - - - - - - - - - - - - - - - - - - diff --git a/pkg/registry/zookeeper-3.4.6/recipes/lock/src/c/INSTALL b/pkg/registry/zookeeper-3.4.6/recipes/lock/src/c/INSTALL deleted file mode 100644 index 5458714e1..000000000 --- a/pkg/registry/zookeeper-3.4.6/recipes/lock/src/c/INSTALL +++ /dev/null @@ -1,234 +0,0 @@ -Installation Instructions -************************* - -Copyright (C) 1994, 1995, 1996, 1999, 2000, 2001, 2002, 2004, 2005, -2006 Free Software Foundation, Inc. - -This file is free documentation; the Free Software Foundation gives -unlimited permission to copy, distribute and modify it. - -Basic Installation -================== - -Briefly, the shell commands `./configure; make; make install' should -configure, build, and install this package. The following -more-detailed instructions are generic; see the `README' file for -instructions specific to this package. - - The `configure' shell script attempts to guess correct values for -various system-dependent variables used during compilation. It uses -those values to create a `Makefile' in each directory of the package. -It may also create one or more `.h' files containing system-dependent -definitions. Finally, it creates a shell script `config.status' that -you can run in the future to recreate the current configuration, and a -file `config.log' containing compiler output (useful mainly for -debugging `configure'). - - It can also use an optional file (typically called `config.cache' -and enabled with `--cache-file=config.cache' or simply `-C') that saves -the results of its tests to speed up reconfiguring. Caching is -disabled by default to prevent problems with accidental use of stale -cache files. - - If you need to do unusual things to compile the package, please try -to figure out how `configure' could check whether to do them, and mail -diffs or instructions to the address given in the `README' so they can -be considered for the next release. If you are using the cache, and at -some point `config.cache' contains results you don't want to keep, you -may remove or edit it. - - The file `configure.ac' (or `configure.in') is used to create -`configure' by a program called `autoconf'. You need `configure.ac' if -you want to change it or regenerate `configure' using a newer version -of `autoconf'. - -The simplest way to compile this package is: - - 1. `cd' to the directory containing the package's source code and type - `./configure' to configure the package for your system. - - Running `configure' might take a while. While running, it prints - some messages telling which features it is checking for. - - 2. Type `make' to compile the package. - - 3. Optionally, type `make check' to run any self-tests that come with - the package. - - 4. Type `make install' to install the programs and any data files and - documentation. - - 5. You can remove the program binaries and object files from the - source code directory by typing `make clean'. To also remove the - files that `configure' created (so you can compile the package for - a different kind of computer), type `make distclean'. There is - also a `make maintainer-clean' target, but that is intended mainly - for the package's developers. If you use it, you may have to get - all sorts of other programs in order to regenerate files that came - with the distribution. - -Compilers and Options -===================== - -Some systems require unusual options for compilation or linking that the -`configure' script does not know about. Run `./configure --help' for -details on some of the pertinent environment variables. - - You can give `configure' initial values for configuration parameters -by setting variables in the command line or in the environment. Here -is an example: - - ./configure CC=c99 CFLAGS=-g LIBS=-lposix - - *Note Defining Variables::, for more details. - -Compiling For Multiple Architectures -==================================== - -You can compile the package for more than one kind of computer at the -same time, by placing the object files for each architecture in their -own directory. To do this, you can use GNU `make'. `cd' to the -directory where you want the object files and executables to go and run -the `configure' script. `configure' automatically checks for the -source code in the directory that `configure' is in and in `..'. - - With a non-GNU `make', it is safer to compile the package for one -architecture at a time in the source code directory. After you have -installed the package for one architecture, use `make distclean' before -reconfiguring for another architecture. - -Installation Names -================== - -By default, `make install' installs the package's commands under -`/usr/local/bin', include files under `/usr/local/include', etc. You -can specify an installation prefix other than `/usr/local' by giving -`configure' the option `--prefix=PREFIX'. - - You can specify separate installation prefixes for -architecture-specific files and architecture-independent files. If you -pass the option `--exec-prefix=PREFIX' to `configure', the package uses -PREFIX as the prefix for installing programs and libraries. -Documentation and other data files still use the regular prefix. - - In addition, if you use an unusual directory layout you can give -options like `--bindir=DIR' to specify different values for particular -kinds of files. Run `configure --help' for a list of the directories -you can set and what kinds of files go in them. - - If the package supports it, you can cause programs to be installed -with an extra prefix or suffix on their names by giving `configure' the -option `--program-prefix=PREFIX' or `--program-suffix=SUFFIX'. - -Optional Features -================= - -Some packages pay attention to `--enable-FEATURE' options to -`configure', where FEATURE indicates an optional part of the package. -They may also pay attention to `--with-PACKAGE' options, where PACKAGE -is something like `gnu-as' or `x' (for the X Window System). The -`README' should mention any `--enable-' and `--with-' options that the -package recognizes. - - For packages that use the X Window System, `configure' can usually -find the X include and library files automatically, but if it doesn't, -you can use the `configure' options `--x-includes=DIR' and -`--x-libraries=DIR' to specify their locations. - -Specifying the System Type -========================== - -There may be some features `configure' cannot figure out automatically, -but needs to determine by the type of machine the package will run on. -Usually, assuming the package is built to be run on the _same_ -architectures, `configure' can figure that out, but if it prints a -message saying it cannot guess the machine type, give it the -`--build=TYPE' option. TYPE can either be a short name for the system -type, such as `sun4', or a canonical name which has the form: - - CPU-COMPANY-SYSTEM - -where SYSTEM can have one of these forms: - - OS KERNEL-OS - - See the file `config.sub' for the possible values of each field. If -`config.sub' isn't included in this package, then this package doesn't -need to know the machine type. - - If you are _building_ compiler tools for cross-compiling, you should -use the option `--target=TYPE' to select the type of system they will -produce code for. - - If you want to _use_ a cross compiler, that generates code for a -platform different from the build platform, you should specify the -"host" platform (i.e., that on which the generated programs will -eventually be run) with `--host=TYPE'. - -Sharing Defaults -================ - -If you want to set default values for `configure' scripts to share, you -can create a site shell script called `config.site' that gives default -values for variables like `CC', `cache_file', and `prefix'. -`configure' looks for `PREFIX/share/config.site' if it exists, then -`PREFIX/etc/config.site' if it exists. Or, you can set the -`CONFIG_SITE' environment variable to the location of the site script. -A warning: not all `configure' scripts look for a site script. - -Defining Variables -================== - -Variables not defined in a site shell script can be set in the -environment passed to `configure'. However, some packages may run -configure again during the build, and the customized values of these -variables may be lost. In order to avoid this problem, you should set -them in the `configure' command line, using `VAR=value'. For example: - - ./configure CC=/usr/local2/bin/gcc - -causes the specified `gcc' to be used as the C compiler (unless it is -overridden in the site shell script). - -Unfortunately, this technique does not work for `CONFIG_SHELL' due to -an Autoconf bug. Until the bug is fixed you can use this workaround: - - CONFIG_SHELL=/bin/bash /bin/bash ./configure CONFIG_SHELL=/bin/bash - -`configure' Invocation -====================== - -`configure' recognizes the following options to control how it operates. - -`--help' -`-h' - Print a summary of the options to `configure', and exit. - -`--version' -`-V' - Print the version of Autoconf used to generate the `configure' - script, and exit. - -`--cache-file=FILE' - Enable the cache: use and save the results of the tests in FILE, - traditionally `config.cache'. FILE defaults to `/dev/null' to - disable caching. - -`--config-cache' -`-C' - Alias for `--cache-file=config.cache'. - -`--quiet' -`--silent' -`-q' - Do not print messages saying which checks are being made. To - suppress all normal output, redirect it to `/dev/null' (any error - messages will still be shown). - -`--srcdir=DIR' - Look for the package's source code in directory DIR. Usually - `configure' can determine that directory automatically. - -`configure' also accepts some other, not widely useful, options. Run -`configure --help' for more details. - diff --git a/pkg/registry/zookeeper-3.4.6/recipes/lock/src/c/LICENSE b/pkg/registry/zookeeper-3.4.6/recipes/lock/src/c/LICENSE deleted file mode 100644 index d64569567..000000000 --- a/pkg/registry/zookeeper-3.4.6/recipes/lock/src/c/LICENSE +++ /dev/null @@ -1,202 +0,0 @@ - - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "[]" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright [yyyy] [name of copyright owner] - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. diff --git a/pkg/registry/zookeeper-3.4.6/recipes/lock/src/c/Makefile.am b/pkg/registry/zookeeper-3.4.6/recipes/lock/src/c/Makefile.am deleted file mode 100644 index 9b36b43e1..000000000 --- a/pkg/registry/zookeeper-3.4.6/recipes/lock/src/c/Makefile.am +++ /dev/null @@ -1,46 +0,0 @@ -# Licensed to the Apache Software Foundation (ASF) under one -# or more contributor license agreements. See the NOTICE file -# distributed with this work for additional information -# regarding copyright ownership. The ASF licenses this file -# to you 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. - -include $(top_srcdir)/aminclude.am - -AM_CFLAGS = -Wall -fPIC -I${ZOOKEEPER_PATH}/include -I${ZOOKEEPER_PATH}/generated \ - -I$(top_srcdir)/include -I/usr/include -AM_CPPFLAGS = -Wall -I${ZOOKEEPER_PATH}/include -I${ZOOKEEPER_PATH}/generated\ - -I${top_srcdir}/include -I/usr/include -EXTRA_DIST = LICENSE -lib_LTLIBRARIES = libzoolock.la -libzoolock_la_SOURCES = src/zoo_lock.c include/zoo_lock.h -libzoolock_la_CPPFLAGS = -DDLOPEN_MODULE -libzoolock_la_LDFLAGS = -version-info 0:1:0 - -#run the tests now - -TEST_SOURCES = tests/TestDriver.cc tests/TestClient.cc tests/Util.cc - - -check_PROGRAMS = zklocktest -nodist_zklocktest_SOURCES = ${TEST_SOURCES} -zklocktest_LDADD = ${ZOOKEEPER_LD} libzoolock.la -lpthread ${CPPUNIT_LIBS} -zklocktest_CXXFLAGS = -DUSE_STATIC_LIB ${CPPUNIT_CFLAGS} - -run-check: check - ./zklocktest ${TEST_OPTIONS} - -clean-local: clean-check - ${RM} ${DX_CLEANFILES} - -clean-check: - ${RM} ${nodist_zklocktest_OBJECTS} diff --git a/pkg/registry/zookeeper-3.4.6/recipes/lock/src/c/README.txt b/pkg/registry/zookeeper-3.4.6/recipes/lock/src/c/README.txt deleted file mode 100644 index 326bba85d..000000000 --- a/pkg/registry/zookeeper-3.4.6/recipes/lock/src/c/README.txt +++ /dev/null @@ -1,28 +0,0 @@ - Zookeeper C lock client library - - -INSTALLATION - -If you're building the client from a source checkout you need to -follow the steps outlined below. If you're building from a release -tar downloaded from Apache please skip to step 2. - -1) make sure that you compile the main zookeeper c client library. - -2) change directory to src/recipes/lock/src/c - and do a "autoreconf -if" to bootstrap - autoconf, automake and libtool. Please make sure you have autoconf - version 2.59 or greater installed. -3) do a "./configure [OPTIONS]" to generate the makefile. See INSTALL - for general information about running configure. - -4) do a "make" or "make install" to build the libraries and install them. - Alternatively, you can also build and run a unit test suite (and - you probably should). Please make sure you have cppunit-1.10.x or - higher installed before you execute step 4. Once ./configure has - finished, do a "make run-check". It will build the libraries, build - the tests and run them. -5) to generate doxygen documentation do a "make doxygen-doc". All - documentations will be placed to a new subfolder named docs. By - default only HTML documentation is generated. For information on - other document formats please use "./configure --help" diff --git a/pkg/registry/zookeeper-3.4.6/recipes/lock/src/c/acinclude.m4 b/pkg/registry/zookeeper-3.4.6/recipes/lock/src/c/acinclude.m4 deleted file mode 100644 index d0041d8c2..000000000 --- a/pkg/registry/zookeeper-3.4.6/recipes/lock/src/c/acinclude.m4 +++ /dev/null @@ -1,312 +0,0 @@ -# This file is part of Autoconf. -*- Autoconf -*- - -# Copyright (C) 2004 Oren Ben-Kiki -# This file is distributed under the same terms as the Autoconf macro files. - -# Generate automatic documentation using Doxygen. Works in concert with the -# aminclude.m4 file and a compatible doxygen configuration file. Defines the -# following public macros: -# -# DX_???_FEATURE(ON|OFF) - control the default setting fo a Doxygen feature. -# Supported features are 'DOXYGEN' itself, 'DOT' for generating graphics, -# 'HTML' for plain HTML, 'CHM' for compressed HTML help (for MS users), 'CHI' -# for generating a seperate .chi file by the .chm file, and 'MAN', 'RTF', -# 'XML', 'PDF' and 'PS' for the appropriate output formats. The environment -# variable DOXYGEN_PAPER_SIZE may be specified to override the default 'a4wide' -# paper size. -# -# By default, HTML, PDF and PS documentation is generated as this seems to be -# the most popular and portable combination. MAN pages created by Doxygen are -# usually problematic, though by picking an appropriate subset and doing some -# massaging they might be better than nothing. CHM and RTF are specific for MS -# (note that you can't generate both HTML and CHM at the same time). The XML is -# rather useless unless you apply specialized post-processing to it. -# -# The macro mainly controls the default state of the feature. The use can -# override the default by specifying --enable or --disable. The macros ensure -# that contradictory flags are not given (e.g., --enable-doxygen-html and -# --enable-doxygen-chm, --enable-doxygen-anything with --disable-doxygen, etc.) -# Finally, each feature will be automatically disabled (with a warning) if the -# required programs are missing. -# -# Once all the feature defaults have been specified, call DX_INIT_DOXYGEN with -# the following parameters: a one-word name for the project for use as a -# filename base etc., an optional configuration file name (the default is -# 'Doxyfile', the same as Doxygen's default), and an optional output directory -# name (the default is 'doxygen-doc'). - -## ----------## -## Defaults. ## -## ----------## - -DX_ENV="" -AC_DEFUN([DX_FEATURE_doc], ON) -AC_DEFUN([DX_FEATURE_dot], ON) -AC_DEFUN([DX_FEATURE_man], OFF) -AC_DEFUN([DX_FEATURE_html], ON) -AC_DEFUN([DX_FEATURE_chm], OFF) -AC_DEFUN([DX_FEATURE_chi], OFF) -AC_DEFUN([DX_FEATURE_rtf], OFF) -AC_DEFUN([DX_FEATURE_xml], OFF) -AC_DEFUN([DX_FEATURE_pdf], ON) -AC_DEFUN([DX_FEATURE_ps], ON) - -## --------------- ## -## Private macros. ## -## --------------- ## - -# DX_ENV_APPEND(VARIABLE, VALUE) -# ------------------------------ -# Append VARIABLE="VALUE" to DX_ENV for invoking doxygen. -AC_DEFUN([DX_ENV_APPEND], [AC_SUBST([DX_ENV], ["$DX_ENV $1='$2'"])]) - -# DX_DIRNAME_EXPR -# --------------- -# Expand into a shell expression prints the directory part of a path. -AC_DEFUN([DX_DIRNAME_EXPR], - [[expr ".$1" : '\(\.\)[^/]*$' \| "x$1" : 'x\(.*\)/[^/]*$']]) - -# DX_IF_FEATURE(FEATURE, IF-ON, IF-OFF) -# ------------------------------------- -# Expands according to the M4 (static) status of the feature. -AC_DEFUN([DX_IF_FEATURE], [ifelse(DX_FEATURE_$1, ON, [$2], [$3])]) - -# DX_REQUIRE_PROG(VARIABLE, PROGRAM) -# ---------------------------------- -# Require the specified program to be found for the DX_CURRENT_FEATURE to work. -AC_DEFUN([DX_REQUIRE_PROG], [ -AC_PATH_TOOL([$1], [$2]) -if test "$DX_FLAG_$[DX_CURRENT_FEATURE$$1]" = 1; then - AC_MSG_WARN([$2 not found - will not DX_CURRENT_DESCRIPTION]) - AC_SUBST([DX_FLAG_]DX_CURRENT_FEATURE, 0) -fi -]) - -# DX_TEST_FEATURE(FEATURE) -# ------------------------ -# Expand to a shell expression testing whether the feature is active. -AC_DEFUN([DX_TEST_FEATURE], [test "$DX_FLAG_$1" = 1]) - -# DX_CHECK_DEPEND(REQUIRED_FEATURE, REQUIRED_STATE) -# ------------------------------------------------- -# Verify that a required features has the right state before trying to turn on -# the DX_CURRENT_FEATURE. -AC_DEFUN([DX_CHECK_DEPEND], [ -test "$DX_FLAG_$1" = "$2" \ -|| AC_MSG_ERROR([doxygen-DX_CURRENT_FEATURE ifelse([$2], 1, - requires, contradicts) doxygen-DX_CURRENT_FEATURE]) -]) - -# DX_CLEAR_DEPEND(FEATURE, REQUIRED_FEATURE, REQUIRED_STATE) -# ---------------------------------------------------------- -# Turn off the DX_CURRENT_FEATURE if the required feature is off. -AC_DEFUN([DX_CLEAR_DEPEND], [ -test "$DX_FLAG_$1" = "$2" || AC_SUBST([DX_FLAG_]DX_CURRENT_FEATURE, 0) -]) - -# DX_FEATURE_ARG(FEATURE, DESCRIPTION, -# CHECK_DEPEND, CLEAR_DEPEND, -# REQUIRE, DO-IF-ON, DO-IF-OFF) -# -------------------------------------------- -# Parse the command-line option controlling a feature. CHECK_DEPEND is called -# if the user explicitly turns the feature on (and invokes DX_CHECK_DEPEND), -# otherwise CLEAR_DEPEND is called to turn off the default state if a required -# feature is disabled (using DX_CLEAR_DEPEND). REQUIRE performs additional -# requirement tests (DX_REQUIRE_PROG). Finally, an automake flag is set and -# DO-IF-ON or DO-IF-OFF are called according to the final state of the feature. -AC_DEFUN([DX_ARG_ABLE], [ - AC_DEFUN([DX_CURRENT_FEATURE], [$1]) - AC_DEFUN([DX_CURRENT_DESCRIPTION], [$2]) - AC_ARG_ENABLE(doxygen-$1, - [AS_HELP_STRING(DX_IF_FEATURE([$1], [--disable-doxygen-$1], - [--enable-doxygen-$1]), - DX_IF_FEATURE([$1], [don't $2], [$2]))], - [ -case "$enableval" in -#( -y|Y|yes|Yes|YES) - AC_SUBST([DX_FLAG_$1], 1) - $3 -;; #( -n|N|no|No|NO) - AC_SUBST([DX_FLAG_$1], 0) -;; #( -*) - AC_MSG_ERROR([invalid value '$enableval' given to doxygen-$1]) -;; -esac -], [ -AC_SUBST([DX_FLAG_$1], [DX_IF_FEATURE([$1], 1, 0)]) -$4 -]) -if DX_TEST_FEATURE([$1]); then - $5 - : -fi -if DX_TEST_FEATURE([$1]); then - AM_CONDITIONAL(DX_COND_$1, :) - $6 - : -else - AM_CONDITIONAL(DX_COND_$1, false) - $7 - : -fi -]) - -## -------------- ## -## Public macros. ## -## -------------- ## - -# DX_XXX_FEATURE(DEFAULT_STATE) -# ----------------------------- -AC_DEFUN([DX_DOXYGEN_FEATURE], [AC_DEFUN([DX_FEATURE_doc], [$1])]) -AC_DEFUN([DX_MAN_FEATURE], [AC_DEFUN([DX_FEATURE_man], [$1])]) -AC_DEFUN([DX_HTML_FEATURE], [AC_DEFUN([DX_FEATURE_html], [$1])]) -AC_DEFUN([DX_CHM_FEATURE], [AC_DEFUN([DX_FEATURE_chm], [$1])]) -AC_DEFUN([DX_CHI_FEATURE], [AC_DEFUN([DX_FEATURE_chi], [$1])]) -AC_DEFUN([DX_RTF_FEATURE], [AC_DEFUN([DX_FEATURE_rtf], [$1])]) -AC_DEFUN([DX_XML_FEATURE], [AC_DEFUN([DX_FEATURE_xml], [$1])]) -AC_DEFUN([DX_XML_FEATURE], [AC_DEFUN([DX_FEATURE_xml], [$1])]) -AC_DEFUN([DX_PDF_FEATURE], [AC_DEFUN([DX_FEATURE_pdf], [$1])]) -AC_DEFUN([DX_PS_FEATURE], [AC_DEFUN([DX_FEATURE_ps], [$1])]) - -# DX_INIT_DOXYGEN(PROJECT, [CONFIG-FILE], [OUTPUT-DOC-DIR]) -# --------------------------------------------------------- -# PROJECT also serves as the base name for the documentation files. -# The default CONFIG-FILE is "Doxyfile" and OUTPUT-DOC-DIR is "doxygen-doc". -AC_DEFUN([DX_INIT_DOXYGEN], [ - -# Files: -AC_SUBST([DX_PROJECT], [$1]) -AC_SUBST([DX_CONFIG], [ifelse([$2], [], Doxyfile, [$2])]) -AC_SUBST([DX_DOCDIR], [ifelse([$3], [], doxygen-doc, [$3])]) - -# Environment variables used inside doxygen.cfg: -DX_ENV_APPEND(SRCDIR, $srcdir) -DX_ENV_APPEND(PROJECT, $DX_PROJECT) -DX_ENV_APPEND(DOCDIR, $DX_DOCDIR) -DX_ENV_APPEND(VERSION, $PACKAGE_VERSION) - -# Doxygen itself: -DX_ARG_ABLE(doc, [generate any doxygen documentation], - [], - [], - [DX_REQUIRE_PROG([DX_DOXYGEN], doxygen) - DX_REQUIRE_PROG([DX_PERL], perl)], - [DX_ENV_APPEND(PERL_PATH, $DX_PERL)]) - -# Dot for graphics: -DX_ARG_ABLE(dot, [generate graphics for doxygen documentation], - [DX_CHECK_DEPEND(doc, 1)], - [DX_CLEAR_DEPEND(doc, 1)], - [DX_REQUIRE_PROG([DX_DOT], dot)], - [DX_ENV_APPEND(HAVE_DOT, YES) - DX_ENV_APPEND(DOT_PATH, [`DX_DIRNAME_EXPR($DX_DOT)`])], - [DX_ENV_APPEND(HAVE_DOT, NO)]) - -# Man pages generation: -DX_ARG_ABLE(man, [generate doxygen manual pages], - [DX_CHECK_DEPEND(doc, 1)], - [DX_CLEAR_DEPEND(doc, 1)], - [], - [DX_ENV_APPEND(GENERATE_MAN, YES)], - [DX_ENV_APPEND(GENERATE_MAN, NO)]) - -# RTF file generation: -DX_ARG_ABLE(rtf, [generate doxygen RTF documentation], - [DX_CHECK_DEPEND(doc, 1)], - [DX_CLEAR_DEPEND(doc, 1)], - [], - [DX_ENV_APPEND(GENERATE_RTF, YES)], - [DX_ENV_APPEND(GENERATE_RTF, NO)]) - -# XML file generation: -DX_ARG_ABLE(xml, [generate doxygen XML documentation], - [DX_CHECK_DEPEND(doc, 1)], - [DX_CLEAR_DEPEND(doc, 1)], - [], - [DX_ENV_APPEND(GENERATE_XML, YES)], - [DX_ENV_APPEND(GENERATE_XML, NO)]) - -# (Compressed) HTML help generation: -DX_ARG_ABLE(chm, [generate doxygen compressed HTML help documentation], - [DX_CHECK_DEPEND(doc, 1)], - [DX_CLEAR_DEPEND(doc, 1)], - [DX_REQUIRE_PROG([DX_HHC], hhc)], - [DX_ENV_APPEND(HHC_PATH, $DX_HHC) - DX_ENV_APPEND(GENERATE_HTML, YES) - DX_ENV_APPEND(GENERATE_HTMLHELP, YES)], - [DX_ENV_APPEND(GENERATE_HTMLHELP, NO)]) - -# Seperate CHI file generation. -DX_ARG_ABLE(chi, [generate doxygen seperate compressed HTML help index file], - [DX_CHECK_DEPEND(chm, 1)], - [DX_CLEAR_DEPEND(chm, 1)], - [], - [DX_ENV_APPEND(GENERATE_CHI, YES)], - [DX_ENV_APPEND(GENERATE_CHI, NO)]) - -# Plain HTML pages generation: -DX_ARG_ABLE(html, [generate doxygen plain HTML documentation], - [DX_CHECK_DEPEND(doc, 1) DX_CHECK_DEPEND(chm, 0)], - [DX_CLEAR_DEPEND(doc, 1) DX_CLEAR_DEPEND(chm, 0)], - [], - [DX_ENV_APPEND(GENERATE_HTML, YES)], - [DX_TEST_FEATURE(chm) || DX_ENV_APPEND(GENERATE_HTML, NO)]) - -# PostScript file generation: -DX_ARG_ABLE(ps, [generate doxygen PostScript documentation], - [DX_CHECK_DEPEND(doc, 1)], - [DX_CLEAR_DEPEND(doc, 1)], - [DX_REQUIRE_PROG([DX_LATEX], latex) - DX_REQUIRE_PROG([DX_MAKEINDEX], makeindex) - DX_REQUIRE_PROG([DX_DVIPS], dvips) - DX_REQUIRE_PROG([DX_EGREP], egrep)]) - -# PDF file generation: -DX_ARG_ABLE(pdf, [generate doxygen PDF documentation], - [DX_CHECK_DEPEND(doc, 1)], - [DX_CLEAR_DEPEND(doc, 1)], - [DX_REQUIRE_PROG([DX_PDFLATEX], pdflatex) - DX_REQUIRE_PROG([DX_MAKEINDEX], makeindex) - DX_REQUIRE_PROG([DX_EGREP], egrep)]) - -# LaTeX generation for PS and/or PDF: -if DX_TEST_FEATURE(ps) || DX_TEST_FEATURE(pdf); then - AM_CONDITIONAL(DX_COND_latex, :) - DX_ENV_APPEND(GENERATE_LATEX, YES) -else - AM_CONDITIONAL(DX_COND_latex, false) - DX_ENV_APPEND(GENERATE_LATEX, NO) -fi - -# Paper size for PS and/or PDF: -AC_ARG_VAR(DOXYGEN_PAPER_SIZE, - [a4wide (default), a4, letter, legal or executive]) -case "$DOXYGEN_PAPER_SIZE" in -#( -"") - AC_SUBST(DOXYGEN_PAPER_SIZE, "") -;; #( -a4wide|a4|letter|legal|executive) - DX_ENV_APPEND(PAPER_SIZE, $DOXYGEN_PAPER_SIZE) -;; #( -*) - AC_MSG_ERROR([unknown DOXYGEN_PAPER_SIZE='$DOXYGEN_PAPER_SIZE']) -;; -esac - -#For debugging: -#echo DX_FLAG_doc=$DX_FLAG_doc -#echo DX_FLAG_dot=$DX_FLAG_dot -#echo DX_FLAG_man=$DX_FLAG_man -#echo DX_FLAG_html=$DX_FLAG_html -#echo DX_FLAG_chm=$DX_FLAG_chm -#echo DX_FLAG_chi=$DX_FLAG_chi -#echo DX_FLAG_rtf=$DX_FLAG_rtf -#echo DX_FLAG_xml=$DX_FLAG_xml -#echo DX_FLAG_pdf=$DX_FLAG_pdf -#echo DX_FLAG_ps=$DX_FLAG_ps -#echo DX_ENV=$DX_ENV -]) diff --git a/pkg/registry/zookeeper-3.4.6/recipes/lock/src/c/aminclude.am b/pkg/registry/zookeeper-3.4.6/recipes/lock/src/c/aminclude.am deleted file mode 100644 index 420049eca..000000000 --- a/pkg/registry/zookeeper-3.4.6/recipes/lock/src/c/aminclude.am +++ /dev/null @@ -1,186 +0,0 @@ -# Copyright (C) 2004 Oren Ben-Kiki -# This file is distributed under the same terms as the Automake macro files. - -# Generate automatic documentation using Doxygen. Goals and variables values -# are controlled by the various DX_COND_??? conditionals set by autoconf. -# -# The provided goals are: -# doxygen-doc: Generate all doxygen documentation. -# doxygen-run: Run doxygen, which will generate some of the documentation -# (HTML, CHM, CHI, MAN, RTF, XML) but will not do the post -# processing required for the rest of it (PS, PDF, and some MAN). -# doxygen-man: Rename some doxygen generated man pages. -# doxygen-ps: Generate doxygen PostScript documentation. -# doxygen-pdf: Generate doxygen PDF documentation. -# -# Note that by default these are not integrated into the automake goals. If -# doxygen is used to generate man pages, you can achieve this integration by -# setting man3_MANS to the list of man pages generated and then adding the -# dependency: -# -# $(man3_MANS): doxygen-doc -# -# This will cause make to run doxygen and generate all the documentation. -# -# The following variable is intended for use in Makefile.am: -# -# DX_CLEANFILES = everything to clean. -# -# This is usually added to MOSTLYCLEANFILES. - -## --------------------------------- ## -## Format-independent Doxygen rules. ## -## --------------------------------- ## - -if DX_COND_doc - -## ------------------------------- ## -## Rules specific for HTML output. ## -## ------------------------------- ## - -if DX_COND_html - -DX_CLEAN_HTML = @DX_DOCDIR@/html - -endif DX_COND_html - -## ------------------------------ ## -## Rules specific for CHM output. ## -## ------------------------------ ## - -if DX_COND_chm - -DX_CLEAN_CHM = @DX_DOCDIR@/chm - -if DX_COND_chi - -DX_CLEAN_CHI = @DX_DOCDIR@/@PACKAGE@.chi - -endif DX_COND_chi - -endif DX_COND_chm - -## ------------------------------ ## -## Rules specific for MAN output. ## -## ------------------------------ ## - -if DX_COND_man - -DX_CLEAN_MAN = @DX_DOCDIR@/man - -endif DX_COND_man - -## ------------------------------ ## -## Rules specific for RTF output. ## -## ------------------------------ ## - -if DX_COND_rtf - -DX_CLEAN_RTF = @DX_DOCDIR@/rtf - -endif DX_COND_rtf - -## ------------------------------ ## -## Rules specific for XML output. ## -## ------------------------------ ## - -if DX_COND_xml - -DX_CLEAN_XML = @DX_DOCDIR@/xml - -endif DX_COND_xml - -## ----------------------------- ## -## Rules specific for PS output. ## -## ----------------------------- ## - -if DX_COND_ps - -DX_CLEAN_PS = @DX_DOCDIR@/@PACKAGE@.ps - -DX_PS_GOAL = doxygen-ps - -doxygen-ps: @DX_DOCDIR@/@PACKAGE@.ps - -@DX_DOCDIR@/@PACKAGE@.ps: @DX_DOCDIR@/@PACKAGE@.tag - cd @DX_DOCDIR@/latex; \ - rm -f *.aux *.toc *.idx *.ind *.ilg *.log *.out; \ - $(DX_LATEX) refman.tex; \ - $(MAKEINDEX_PATH) refman.idx; \ - $(DX_LATEX) refman.tex; \ - countdown=5; \ - while $(DX_EGREP) 'Rerun (LaTeX|to get cross-references right)' \ - refman.log > /dev/null 2>&1 \ - && test $$countdown -gt 0; do \ - $(DX_LATEX) refman.tex; \ - countdown=`expr $$countdown - 1`; \ - done; \ - $(DX_DVIPS) -o ../@PACKAGE@.ps refman.dvi - -endif DX_COND_ps - -## ------------------------------ ## -## Rules specific for PDF output. ## -## ------------------------------ ## - -if DX_COND_pdf - -DX_CLEAN_PDF = @DX_DOCDIR@/@PACKAGE@.pdf - -DX_PDF_GOAL = doxygen-pdf - -doxygen-pdf: @DX_DOCDIR@/@PACKAGE@.pdf - -@DX_DOCDIR@/@PACKAGE@.pdf: @DX_DOCDIR@/@PACKAGE@.tag - cd @DX_DOCDIR@/latex; \ - rm -f *.aux *.toc *.idx *.ind *.ilg *.log *.out; \ - $(DX_PDFLATEX) refman.tex; \ - $(DX_MAKEINDEX) refman.idx; \ - $(DX_PDFLATEX) refman.tex; \ - countdown=5; \ - while $(DX_EGREP) 'Rerun (LaTeX|to get cross-references right)' \ - refman.log > /dev/null 2>&1 \ - && test $$countdown -gt 0; do \ - $(DX_PDFLATEX) refman.tex; \ - countdown=`expr $$countdown - 1`; \ - done; \ - mv refman.pdf ../@PACKAGE@.pdf - -endif DX_COND_pdf - -## ------------------------------------------------- ## -## Rules specific for LaTeX (shared for PS and PDF). ## -## ------------------------------------------------- ## - -if DX_COND_latex - -DX_CLEAN_LATEX = @DX_DOCDIR@/latex - -endif DX_COND_latex - -.PHONY: doxygen-run doxygen-doc $(DX_PS_GOAL) $(DX_PDF_GOAL) - -.INTERMEDIATE: doxygen-run $(DX_PS_GOAL) $(DX_PDF_GOAL) - -doxygen-run: @DX_DOCDIR@/@PACKAGE@.tag - -doxygen-doc: doxygen-run $(DX_PS_GOAL) $(DX_PDF_GOAL) - -@DX_DOCDIR@/@PACKAGE@.tag: $(DX_CONFIG) $(pkginclude_HEADERS) - rm -rf @DX_DOCDIR@ - $(DX_ENV) $(DX_DOXYGEN) $(srcdir)/$(DX_CONFIG) - -DX_CLEANFILES = \ - @DX_DOCDIR@/@PACKAGE@.tag \ - -r \ - $(DX_CLEAN_HTML) \ - $(DX_CLEAN_CHM) \ - $(DX_CLEAN_CHI) \ - $(DX_CLEAN_MAN) \ - $(DX_CLEAN_RTF) \ - $(DX_CLEAN_XML) \ - $(DX_CLEAN_PS) \ - $(DX_CLEAN_PDF) \ - $(DX_CLEAN_LATEX) - -endif DX_COND_doc diff --git a/pkg/registry/zookeeper-3.4.6/recipes/lock/src/c/c-doc.Doxyfile b/pkg/registry/zookeeper-3.4.6/recipes/lock/src/c/c-doc.Doxyfile deleted file mode 100644 index c56e86dc5..000000000 --- a/pkg/registry/zookeeper-3.4.6/recipes/lock/src/c/c-doc.Doxyfile +++ /dev/null @@ -1,1252 +0,0 @@ -# Doxyfile 1.4.7 - -# 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 (" ") - -#--------------------------------------------------------------------------- -# Project related 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 = $(PROJECT)-$(VERSION) - -# 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 = $(DOCDIR) - -# If the CREATE_SUBDIRS tag is set to YES, then doxygen will create -# 4096 sub-directories (in 2 levels) under the output directory of each output -# format and will distribute the generated files over these directories. -# Enabling this option can be useful when feeding doxygen a huge amount of -# source files, where putting all generated files in the same directory would -# otherwise cause performance problems for the file system. - -CREATE_SUBDIRS = NO - -# 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, Korean-en, Norwegian, -# Polish, Portuguese, Romanian, Russian, Serbian, Slovak, Slovene, Spanish, -# Swedish, and Ukrainian. - -OUTPUT_LANGUAGE = English - -# This tag can be used to specify the encoding used in the generated output. -# The encoding is not always determined by the language that is chosen, -# but also whether or not the output is meant for Windows or non-Windows users. -# In case there is a difference, setting the USE_WINDOWS_ENCODING tag to YES -# forces the Windows encoding (this is the default for the Windows binary), -# whereas setting the tag to NO uses a Unix-style encoding (the default for -# all platforms other than Windows). - -USE_WINDOWS_ENCODING = 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 - -# This tag implements a quasi-intelligent brief description abbreviator -# that is used to form the text in various listings. Each string -# in this list, if found as the leading text of the brief description, will be -# stripped from the text and the result after processing the whole list, is -# used as the annotated text. Otherwise, the brief description is used as-is. -# If left blank, the following values are used ("$name" is automatically -# replaced with the name of the entity): "The $name class" "The $name widget" -# "The $name file" "is" "provides" "specifies" "contains" -# "represents" "a" "an" "the" - -ABBREVIATE_BRIEF = - -# 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 = YES - -# 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. The tag can be used to show relative paths in the file list. -# If left blank the directory from which doxygen is run is used as the -# path to strip. - -STRIP_FROM_PATH = - -# The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of -# the path mentioned in the documentation of a class, which tells -# the reader which header file to include in order to use a class. -# If left blank only the name of the header file containing the class -# definition is used. Otherwise one should specify the include paths that -# are normally passed to the compiler using the -I flag. - -STRIP_FROM_INC_PATH = - -# 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 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 -# explicit @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 -# re-implements. - -INHERIT_DOCS = YES - -# If the SEPARATE_MEMBER_PAGES tag is set to YES, then doxygen will produce -# a new page for each member. If set to NO, the documentation of a member will -# be part of the file/class/namespace that contains it. - -SEPARATE_MEMBER_PAGES = 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 - -# 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 = - -# 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 - -# If you use STL classes (i.e. std::string, std::vector, etc.) but do not want to -# include (a tag file for) the STL sources as input, then you should -# set this tag to YES in order to let doxygen match functions declarations and -# definitions whose arguments contain STL classes (e.g. func(std::string); v.s. -# func(std::string) {}). This also make the inheritance and collaboration -# diagrams that involve STL classes more complete and accurate. - -BUILTIN_STL_SUPPORT = NO - -# 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 - -# Set the SUBGROUPING tag to YES (the default) to allow class member groups of -# the same type (for instance a group of public functions) to be put as a -# subgroup of that type (e.g. under the Public Functions section). Set it to -# NO to prevent subgrouping. Alternatively, this can be done per class using -# the \nosubgrouping command. - -SUBGROUPING = YES - -#--------------------------------------------------------------------------- -# Build related configuration options -#--------------------------------------------------------------------------- - -# 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 = NO - -# 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 = YES - -# 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 = YES - -# This flag is only useful for Objective-C code. When set to YES local -# methods, which are defined in the implementation section but not in -# the interface are included in the documentation. -# If set to NO (the default) only methods in the interface are included. - -EXTRACT_LOCAL_METHODS = 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 classes 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 HIDE_IN_BODY_DOCS tag is set to YES, Doxygen will hide any -# documentation blocks found inside the body of a function. -# If set to NO (the default) these blocks will be appended to the -# function's detailed documentation block. - -HIDE_IN_BODY_DOCS = NO - -# 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 - -# 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 -# and Mac users are advised to set this option to NO. - -CASE_SENSE_NAMES = YES - -# 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 SHOW_INCLUDE_FILES tag is set to YES (the default) then Doxygen -# will put a list of the files that are included by a file in the documentation -# of that file. - -SHOW_INCLUDE_FILES = NO - -# 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 the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the -# brief documentation of file, namespace and class members alphabetically -# by member name. If set to NO (the default) the members will appear in -# declaration order. - -SORT_BRIEF_DOCS = NO - -# If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be -# sorted by fully-qualified names, including namespaces. If set to -# NO (the default), the class list will be sorted only by class name, -# not including the namespace part. -# Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES. -# Note: This option applies only to the class list, not to the -# alphabetical list. - -SORT_BY_SCOPE_NAME = NO - -# 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 - -# 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 consists 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 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 = YES - -# If the sources in your project are distributed over multiple directories -# then setting the SHOW_DIRECTORIES tag to YES will show the directory hierarchy -# in the documentation. The default is NO. - -SHOW_DIRECTORIES = NO - -# The FILE_VERSION_FILTER tag can be used to specify a program or script that -# doxygen should invoke to get the current version for each file (typically from the -# version control system). Doxygen will invoke the program by executing (via -# popen()) the command , where is the value of -# the FILE_VERSION_FILTER tag, and is the name of an input file -# provided by doxygen. Whatever the program writes to standard output -# is used as the file version. See the manual for examples. - -FILE_VERSION_FILTER = - -#--------------------------------------------------------------------------- -# 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 - -# If WARN_IF_DOC_ERROR is set to YES, doxygen will generate warnings for -# potential errors in the documentation, such as not documenting some -# parameters in a documented function, or documenting parameters that -# don't exist or using markup commands wrongly. - -WARN_IF_DOC_ERROR = YES - -# This WARN_NO_PARAMDOC option can be abled to get warnings for -# functions that are documented, but have no documentation for their parameters -# or return value. If set to NO (the default) doxygen will only warn about -# wrong or incomplete parameter documentation, but not about the absence of -# documentation. - -WARN_NO_PARAMDOC = NO - -# 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. Optionally the format may contain -# $version, which will be replaced by the version of the file (if it could -# be obtained via FILE_VERSION_FILTER) - -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 = include/zoo_lock.h - -# 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 *.cs *.php *.php3 *.inc *.m *.mm *.py - -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. Note that the wildcards are matched -# against the file with absolute path, so to exclude all test directories -# for example use the pattern */test/* - -EXCLUDE_PATTERNS = - -# The EXAMPLE_PATH tag can be used to specify one or more files or -# directories that contain example code fragments that are included (see -# the \include command). - -EXAMPLE_PATH = - -# If the value of the EXAMPLE_PATH tag contains directories, you can use the -# EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp -# and *.h) to filter out the source-files in the directories. If left -# blank all files are included. - -EXAMPLE_PATTERNS = - -# If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be -# searched for input files to be used with the \include or \dontinclude -# commands irrespective of the value of the RECURSIVE tag. -# Possible values are YES and NO. If left blank NO is used. - -EXAMPLE_RECURSIVE = NO - -# The IMAGE_PATH tag can be used to specify one or more files or -# directories that contain image that are included in the documentation (see -# the \image command). - -IMAGE_PATH = - -# The INPUT_FILTER tag can be used to specify a program that doxygen should -# invoke to filter for each input file. Doxygen will invoke the filter program -# by executing (via popen()) the command , where -# is the value of the INPUT_FILTER tag, and is the name of an -# input file. Doxygen will then use the output that the filter program writes -# to standard output. If FILTER_PATTERNS is specified, this tag will be -# ignored. - -INPUT_FILTER = - -# The FILTER_PATTERNS tag can be used to specify filters on a per file pattern -# basis. Doxygen will compare the file name with each pattern and apply the -# filter if there is a match. The filters are a list of the form: -# pattern=filter (like *.cpp=my_cpp_filter). See INPUT_FILTER for further -# info on how filters are used. If FILTER_PATTERNS is empty, INPUT_FILTER -# is applied to all files. - -FILTER_PATTERNS = - -# 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. -# Note: To get rid of all source code in the generated output, make sure also -# VERBATIM_HEADERS is set to NO. - -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 - -# 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 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 = YES - -# 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 = YES - -# If the REFERENCES_LINK_SOURCE tag is set to YES (the default) -# and SOURCE_BROWSER tag is set to YES, then the hyperlinks from -# functions in REFERENCES_RELATION and REFERENCED_BY_RELATION lists will -# link to the source code. Otherwise they will link to the documentstion. - -REFERENCES_LINK_SOURCE = YES - -# If the USE_HTAGS tag is set to YES then the references to source code -# will point to the HTML generated by the htags(1) tool instead of doxygen -# built-in source browser. The htags tool is part of GNU's global source -# tagging system (see http://www.gnu.org/software/global/global.html). You -# will need version 4.8.6 or higher. - -USE_HTAGS = 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 - -#--------------------------------------------------------------------------- -# 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 = NO - -# 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 = $(GENERATE_HTML) - -# 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 = html - -# 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. Note that doxygen will try to copy -# the style sheet file to the HTML output directory, so don't put your own -# stylesheet in the HTML output directory as well, or it will be erased! - -HTML_STYLESHEET = - -# 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 = $(GENERATE_HTMLHELP) - -# 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 directory. - -CHM_FILE = ../$(PROJECT).chm - -# 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 = $(HHC_PATH) - -# 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 = $(GENERATE_CHI) - -# 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 = NO - -# 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, DHTML, CSS and frames is required (for instance Mozilla 1.0+, -# Netscape 6.0+, Internet explorer 5.0+, or Konqueror). 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 = $(GENERATE_LATEX) - -# 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 = $(PAPER_SIZE) - -# 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 = $(GENERATE_PDF) - -# 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 - -# If LATEX_HIDE_INDICES is set to YES then doxygen will not -# include the index chapters (such as File Index, Compound Index, etc.) -# in the output. - -LATEX_HIDE_INDICES = 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 optimized for Word 97 and may not look very pretty with -# other RTF readers or editors. - -GENERATE_RTF = $(GENERATE_RTF) - -# 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 assignments. 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 = $(GENERATE_MAN) - -# 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. - -GENERATE_XML = $(GENERATE_XML) - -# The XML_OUTPUT tag is used to specify where the XML 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 `xml' will be used as the default path. - -XML_OUTPUT = xml - -# 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 = - -# If the XML_PROGRAMLISTING tag is set to YES Doxygen will -# dump the program listings (including syntax highlighting -# and cross-referencing information) to the XML output. Note that -# enabling this will significantly increase the size of the XML output. - -XML_PROGRAMLISTING = YES - -#--------------------------------------------------------------------------- -# 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 Perl module output -#--------------------------------------------------------------------------- - -# If the GENERATE_PERLMOD tag is set to YES Doxygen will -# generate a Perl module file that captures the structure of -# the code including all documentation. Note that this -# feature is still experimental and incomplete at the -# moment. - -GENERATE_PERLMOD = NO - -# If the PERLMOD_LATEX tag is set to YES Doxygen will generate -# the necessary Makefile rules, Perl scripts and LaTeX code to be able -# to generate PDF and DVI output from the Perl module output. - -PERLMOD_LATEX = NO - -# If the PERLMOD_PRETTY tag is set to YES the Perl module output will be -# nicely formatted so it can be parsed by a human reader. This is useful -# if you want to understand what is going on. On the other hand, if this -# tag is set to NO the size of the Perl module output will be much smaller -# and Perl will parse it just the same. - -PERLMOD_PRETTY = YES - -# The names of the make variables in the generated doxyrules.make file -# are prefixed with the string contained in PERLMOD_MAKEVAR_PREFIX. -# This is useful so different doxyrules.make files included by the same -# Makefile don't overwrite each other's variables. - -PERLMOD_MAKEVAR_PREFIX = - -#--------------------------------------------------------------------------- -# 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 = YES - -# 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_DEFINED 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. To prevent a macro definition from being -# undefined via #undef or recursively expanded use the := operator -# instead of the = operator. - -PREDEFINED = - -# If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF 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::additions related to external references -#--------------------------------------------------------------------------- - -# The TAGFILES option can be used to specify one or more tagfiles. -# Optionally an initial location of the external documentation -# can be added for each tagfile. The format of a tag file without -# this location is as follows: -# TAGFILES = file1 file2 ... -# Adding location for the tag files is done as follows: -# TAGFILES = file1=loc1 "file2 = loc2" ... -# where "loc1" and "loc2" can be relative or absolute paths or -# URLs. If a location is present for each tag, the installdox tool -# does not have to be run to correct the links. -# Note that each tag file must have a unique name -# (where the name does NOT include the path) -# If a tag file is not located in the directory in which doxygen -# is run, you must also specify the path to the tagfile here. - -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 = $(DOCDIR)/$(PROJECT).tag - -# 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 superseded by the HAVE_DOT option below. This is only a -# fallback. It is recommended to install and use dot, since it yields 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 = $(HAVE_DOT) - -# 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 the GROUP_GRAPHS and HAVE_DOT tags are set to YES then doxygen -# will generate a graph for groups, showing the direct groups dependencies - -GROUP_GRAPHS = YES - -# If the UML_LOOK tag is set to YES doxygen will generate inheritance and -# collaboration diagrams in a style similar to the OMG's Unified Modeling -# Language. - -UML_LOOK = NO - -# If set to YES, the inheritance and collaboration graphs will show the -# relations between templates and their instances. - -TEMPLATE_RELATIONS = NO - -# 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 CALL_GRAPH and HAVE_DOT tags are set to YES then doxygen will -# generate a call dependency graph for every global function or class method. -# Note that enabling this option will significantly increase the time of a run. -# So in most cases it will be better to enable call graphs for selected -# functions only using the \callgraph command. - -CALL_GRAPH = NO - -# If the CALLER_GRAPH and HAVE_DOT tags are set to YES then doxygen will -# generate a caller dependency graph for every global function or class method. -# Note that enabling this option will significantly increase the time of a run. -# So in most cases it will be better to enable caller graphs for selected -# functions only using the \callergraph command. - -CALLER_GRAPH = NO - -# 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 - -# If the DIRECTORY_GRAPH, SHOW_DIRECTORIES and HAVE_DOT tags are set to YES -# then doxygen will show the dependencies a directory has on other directories -# in a graphical way. The dependency relations are determined by the #include -# relations between the files in the directories. - -DIRECTORY_GRAPH = 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 in the path. - -DOT_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 - -# The MAX_DOT_GRAPH_DEPTH tag can be used to set the maximum depth of the -# graphs generated by dot. A depth value of 3 means that only nodes reachable -# from the root by following a path via at most 3 edges will be shown. Nodes -# that lay further from the root node will be omitted. Note that setting this -# option to 1 or 2 may greatly reduce the computation time needed for large -# code bases. Also note that a graph may be further truncated if the graph's -# image dimensions are not sufficient to fit the graph (see MAX_DOT_GRAPH_WIDTH -# and MAX_DOT_GRAPH_HEIGHT). If 0 is used for the depth value (the default), -# the graph is not depth-constrained. - -MAX_DOT_GRAPH_DEPTH = 0 - -# Set the DOT_TRANSPARENT tag to YES to generate images with a transparent -# background. This is disabled by default, which results in a white background. -# Warning: Depending on the platform used, enabling this option may lead to -# badly anti-aliased labels on the edges of a graph (i.e. they become hard to -# read). - -DOT_TRANSPARENT = NO - -# Set the DOT_MULTI_TARGETS tag to YES allow dot to generate multiple output -# files in one run (i.e. multiple -o and -T options on the command line). This -# makes dot run faster, but since only newer versions of dot (>1.8.10) -# support this, this feature is disabled by default. - -DOT_MULTI_TARGETS = NO - -# 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 intermediate dot files that are used to generate -# the various graphs. - -DOT_CLEANUP = YES - -#--------------------------------------------------------------------------- -# Configuration::additions 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 diff --git a/pkg/registry/zookeeper-3.4.6/recipes/lock/src/c/configure.ac b/pkg/registry/zookeeper-3.4.6/recipes/lock/src/c/configure.ac deleted file mode 100644 index 3954123ee..000000000 --- a/pkg/registry/zookeeper-3.4.6/recipes/lock/src/c/configure.ac +++ /dev/null @@ -1,82 +0,0 @@ -# Licensed to the Apache Software Foundation (ASF) under one -# or more contributor license agreements. See the NOTICE file -# distributed with this work for additional information -# regarding copyright ownership. The ASF licenses this file -# to you 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. -# -*- Autoconf -*- -# Process this file with autoconf to produce a configure script. - -AC_PREREQ(2.59) - -AC_INIT([zoolock], [3.2.0]) - -AC_CONFIG_SRCDIR([include/zoo_lock.h]) - -PACKAGE=zoolock -VERSION=1.0 - -AC_SUBST(PACKAGE) -AC_SUBST(VERSION) - -BUILD_PATH="`pwd`" - -# Checks for programs. -AC_LANG_CPLUSPLUS - -AM_INIT_AUTOMAKE([-Wall foreign]) -# Checks for libraries. - -#initialize Doxygen support -DX_HTML_FEATURE(ON) -DX_CHM_FEATURE(OFF) -DX_CHI_FEATURE(OFF) -DX_MAN_FEATURE(OFF) -DX_RTF_FEATURE(OFF) -DX_XML_FEATURE(OFF) -DX_PDF_FEATURE(OFF) -DX_PS_FEATURE(OFF) -DX_INIT_DOXYGEN([zookeeper-locks],[c-doc.Doxyfile],[docs]) - - -ZOOKEEPER_PATH=${BUILD_PATH}/../../../../../src/c -ZOOKEEPER_LD=-L${BUILD_PATH}/../../../../../src/c\ -lzookeeper_mt - -AC_SUBST(ZOOKEEPER_PATH) -AC_SUBST(ZOOKEEPER_LD) - -# Checks for header files. -AC_HEADER_DIRENT -AC_HEADER_STDC -AC_CHECK_HEADERS([fcntl.h stdlib.h string.h sys/time.h unistd.h]) - -# Checks for typedefs, structures, and compiler characteristics. -AC_HEADER_STDBOOL -AC_C_CONST -AC_TYPE_UID_T -AC_C_INLINE -AC_TYPE_OFF_T -AC_TYPE_SIZE_T -AC_STRUCT_ST_BLOCKS -AC_HEADER_TIME -AC_C_VOLATILE -AC_PROG_CC -AC_PROG_LIBTOOL -#check for cppunit -AM_PATH_CPPUNIT(1.10.2) -# Checks for library functions. -AC_FUNC_UTIME_NULL -AC_CHECK_FUNCS([gettimeofday memset mkdir rmdir strdup strerror strstr strtol strtoul strtoull utime]) - -AC_CONFIG_FILES([Makefile]) -AC_OUTPUT -AC_C_VOLATILE diff --git a/pkg/registry/zookeeper-3.4.6/recipes/lock/src/c/include/zoo_lock.h b/pkg/registry/zookeeper-3.4.6/recipes/lock/src/c/include/zoo_lock.h deleted file mode 100644 index 5c06bbf2f..000000000 --- a/pkg/registry/zookeeper-3.4.6/recipes/lock/src/c/include/zoo_lock.h +++ /dev/null @@ -1,168 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you 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. - */ -#ifndef ZOOKEEPER_LOCK_H_ -#define ZOOKEEPER_LOCK_H_ - -#include -#include - -#ifdef __cplusplus -extern "C" { -#endif -/** - * \brief the call back function called on status change of lock - * - * the call back funtion is called with a rc of 0 if lock is acquired and - * with an rc of 1 if the lock is released - * \param rc the value to let us know if its locked or unlocked - * \param cbdata the callback data that we passed when initializing - * the zookeeper lock. - */ - -typedef void (* zkr_lock_completion) (int rc, void* cbdata); - -/** - * \file zoo_lock.h - * \brief zookeeper recipe for locking and leader election. - * this api implements a writelock on a given path in zookeeper. - * this api can also be used for leader election. - */ - -struct zkr_lock_mutex { - zhandle_t *zh; - char *path; - struct ACL_vector *acl; - char *id; - void *cbdata; - zkr_lock_completion completion; - pthread_mutex_t pmutex; - int isOwner; - char* ownerid; -}; - -typedef struct zkr_lock_mutex zkr_lock_mutex_t; - - -/** - * \brief initializing a zookeeper lock. - * - * this method instantiates the zookeeper mutex lock. - * \param mutex the mutex to initialize - * \param zh the zookeeper handle to use - * \param path the path in zookeeper to use for locking - * \param acl the acls to use in zookeeper. - * \return return 0 if successful. - */ -ZOOAPI int zkr_lock_init(zkr_lock_mutex_t *mutex, zhandle_t* zh, - char* path, struct ACL_vector *acl); - -/** - * \brief initializing a zookeeper lock. - * - * - * this method instantiates the zookeeper mutex lock with - * a completion function. - * - * \param mutex the mutex to initialize - * \param zh the zookeeper handle to use - * \param path the path in zookeeper to use for locking - * \param acl the acls to use in zookeeper. - * \param completion the callback thats called when lock - * is acquired and released. - * \param cbdata the callback method is called with data - * \return return 0 if successful. - */ -ZOOAPI int zkr_lock_init_cb(zkr_lock_mutex_t *mutex, zhandle_t* zh, - char* path, struct ACL_vector *acl, - zkr_lock_completion completion, void* cbdata); - -/** - * \brief lock the zookeeper mutex - * - * this method tries locking the mutex - * \param mutex the zookeeper mutex - * \return return 0 if there is no error. check - * with zkr_lock_isowner() if you have the lock - */ -ZOOAPI int zkr_lock_lock(zkr_lock_mutex_t *mutex); - -/** - * \brief unlock the zookeeper mutex - * - * this method unlocks the zookeeper mutex - * \param mutex the zookeeper mutex - * \return return 0 if there is not error in executing unlock. - * else returns non zero - */ -ZOOAPI int zkr_lock_unlock(zkr_lock_mutex_t *mutex); - -/** - * \brief set the callback function for zookeeper mutex - * - * this method sets the callback for zookeeper mutex - * \param mutex the zookeeper mutex - * \param callback the call back completion function - */ -ZOOAPI void zkr_lock_setcallback(zkr_lock_mutex_t *mutex, - zkr_lock_completion completion); - -/** - * \brief get the callback function for zookeeper mutex - * - * this method gets the callback funtion for zookeeper mutex - * \param mutex the zookeeper mutex - * \return the lock completion function - */ -ZOOAPI zkr_lock_completion zkr_lock_getcallback(zkr_lock_mutex_t *mutex); - -/** - * \brief destroy the mutex - * this method free the mutex - * \param mutex destroy the zookepeer lock. - * \return return 0 if destroyed. - */ -ZOOAPI int zkr_lock_destroy(zkr_lock_mutex_t* mutex); - -/** - * \brief return the parent path this mutex is using - * this method returns the parent path - * \param mutex the mutex - * \return return the parent path - */ -ZOOAPI char* zkr_lock_getpath(zkr_lock_mutex_t *mutex); - -/** - * \brief return if this mutex is owner of the lock - * this method returns if its owner or not - * \param mutex the mutex - * \return return true if is owner and false if not - */ -ZOOAPI int zkr_lock_isowner(zkr_lock_mutex_t *mutex); - -/** - * \brief return the id for this mutex - * this mutex retunrns the id string - * \param mutex the mutex - * \return the id for this mutex - */ -ZOOAPI char* zkr_lock_getid(zkr_lock_mutex_t *mutex); - -#ifdef __cplusplus -} -#endif -#endif //ZOOKEEPER_LOCK_H_ diff --git a/pkg/registry/zookeeper-3.4.6/recipes/lock/src/c/src/zoo_lock.c b/pkg/registry/zookeeper-3.4.6/recipes/lock/src/c/src/zoo_lock.c deleted file mode 100644 index 8a6d81763..000000000 --- a/pkg/registry/zookeeper-3.4.6/recipes/lock/src/c/src/zoo_lock.c +++ /dev/null @@ -1,396 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you 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. - */ - -#ifdef DLL_EXPORT -#define USE_STATIC_LIB -#endif - -#if defined(__CYGWIN__) -#define USE_IPV6 -#endif - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#ifdef HAVE_SYS_UTSNAME_H -#include -#endif - -#ifdef HAVE_GETPWUID_R -#include -#endif - -#define IF_DEBUG(x) if (logLevel==ZOO_LOG_LEVEL_DEBUG) {x;} - - -ZOOAPI int zkr_lock_init(zkr_lock_mutex_t* mutex, zhandle_t* zh, - char* path, struct ACL_vector *acl) { - mutex->zh = zh; - mutex->path = path; - mutex->acl = acl; - mutex->completion = NULL; - mutex->cbdata = NULL; - mutex->id = NULL; - mutex->ownerid = NULL; - mutex->isOwner = 0; - pthread_mutex_init(&(mutex->pmutex), NULL); - return 0; -} - -ZOOAPI int zkr_lock_init_cb(zkr_lock_mutex_t *mutex, zhandle_t* zh, - char *path, struct ACL_vector *acl, - zkr_lock_completion completion, void* cbdata) { - mutex->zh = zh; - mutex->path = path; - mutex->acl = acl; - mutex->completion = completion; - mutex->cbdata = cbdata; - mutex->isOwner = 0; - mutex->ownerid = NULL; - mutex->id = NULL; - pthread_mutex_init(&(mutex->pmutex), NULL); - return 0; -} - -/** - * unlock the mutex - */ -ZOOAPI int zkr_lock_unlock(zkr_lock_mutex_t *mutex) { - pthread_mutex_lock(&(mutex->pmutex)); - zhandle_t *zh = mutex->zh; - if (mutex->id != NULL) { - int len = strlen(mutex->path) + strlen(mutex->id) + 2; - char buf[len]; - sprintf(buf, "%s/%s", mutex->path, mutex->id); - int ret = 0; - int count = 0; - struct timespec ts; - ts.tv_sec = 0; - ts.tv_nsec = (.5)*1000000; - ret = ZCONNECTIONLOSS; - while (ret == ZCONNECTIONLOSS && (count < 3)) { - ret = zoo_delete(zh, buf, -1); - if (ret == ZCONNECTIONLOSS) { - LOG_DEBUG(("connectionloss while deleting the node")); - nanosleep(&ts, 0); - count++; - } - } - if (ret == ZOK || ret == ZNONODE) { - zkr_lock_completion completion = mutex->completion; - if (completion != NULL) { - completion(1, mutex->cbdata); - } - - free(mutex->id); - mutex->id = NULL; - pthread_mutex_unlock(&(mutex->pmutex)); - return 0; - } - LOG_WARN(("not able to connect to server - giving up")); - pthread_mutex_unlock(&(mutex->pmutex)); - return ZCONNECTIONLOSS; - } - pthread_mutex_unlock(&(mutex->pmutex)); - return ZSYSTEMERROR; -} - -static void free_String_vector(struct String_vector *v) { - if (v->data) { - int32_t i; - for (i=0; icount; i++) { - free(v->data[i]); - } - free(v->data); - v->data = 0; - } -} - -static int vstrcmp(const void* str1, const void* str2) { - const char **a = (const char**)str1; - const char **b = (const char**) str2; - return strcmp(strrchr(*a, '-')+1, strrchr(*b, '-')+1); -} - -static void sort_children(struct String_vector *vector) { - qsort( vector->data, vector->count, sizeof(char*), &vstrcmp); -} - -static char* child_floor(char **sorted_data, int len, char *element) { - char* ret = NULL; - int i =0; - for (i=0; i < len; i++) { - if (strcmp(sorted_data[i], element) < 0) { - ret = sorted_data[i]; - } - } - return ret; -} - -static void lock_watcher_fn(zhandle_t* zh, int type, int state, - const char* path, void *watcherCtx) { - //callback that we registered - //should be called - zkr_lock_lock((zkr_lock_mutex_t*) watcherCtx); -} - -/** - * get the last name of the path - */ -static char* getName(char* str) { - char* name = strrchr(str, '/'); - if (name == NULL) - return NULL; - return strdup(name + 1); -} - -/** - * just a method to retry get children - */ -static int retry_getchildren(zhandle_t *zh, char* path, struct String_vector *vector, - struct timespec *ts, int retry) { - int ret = ZCONNECTIONLOSS; - int count = 0; - while (ret == ZCONNECTIONLOSS && count < retry) { - ret = zoo_get_children(zh, path, 0, vector); - if (ret == ZCONNECTIONLOSS) { - LOG_DEBUG(("connection loss to the server")); - nanosleep(ts, 0); - count++; - } - } - return ret; -} - -/** see if our node already exists - * if it does then we dup the name and - * return it - */ -static char* lookupnode(struct String_vector *vector, char *prefix) { - char *ret = NULL; - if (vector->data) { - int i = 0; - for (i = 0; i < vector->count; i++) { - char* child = vector->data[i]; - if (strncmp(prefix, child, strlen(prefix)) == 0) { - ret = strdup(child); - break; - } - } - } - return ret; -} - -/** retry zoo_wexists - */ -static int retry_zoowexists(zhandle_t *zh, char* path, watcher_fn watcher, void* ctx, - struct Stat *stat, struct timespec *ts, int retry) { - int ret = ZCONNECTIONLOSS; - int count = 0; - while (ret == ZCONNECTIONLOSS && count < retry) { - ret = zoo_wexists(zh, path, watcher, ctx, stat); - if (ret == ZCONNECTIONLOSS) { - LOG_DEBUG(("connectionloss while setting watch on my predecessor")); - nanosleep(ts, 0); - count++; - } - } - return ret; -} - -/** - * the main code that does the zookeeper leader - * election. this code creates its own ephemeral - * node on the given path and sees if its the first - * one on the list and claims to be a leader if and only - * if its the first one of children in the paretn path - */ -static int zkr_lock_operation(zkr_lock_mutex_t *mutex, struct timespec *ts) { - zhandle_t *zh = mutex->zh; - char *path = mutex->path; - char *id = mutex->id; - struct Stat stat; - char* owner_id = NULL; - int retry = 3; - do { - const clientid_t *cid = zoo_client_id(zh); - // get the session id - int64_t session = cid->client_id; - char prefix[30]; - int ret = 0; -#if defined(__x86_64__) - snprintf(prefix, 30, "x-%016lx-", session); -#else - snprintf(prefix, 30, "x-%016llx-", session); -#endif - struct String_vector vectorst; - vectorst.data = NULL; - vectorst.count = 0; - ret = ZCONNECTIONLOSS; - ret = retry_getchildren(zh, path, &vectorst, ts, retry); - if (ret != ZOK) - return ret; - struct String_vector *vector = &vectorst; - mutex->id = lookupnode(vector, prefix); - free_String_vector(vector); - if (mutex->id == NULL) { - int len = strlen(path) + strlen(prefix) + 2; - char buf[len]; - char retbuf[len+20]; - snprintf(buf, len, "%s/%s", path, prefix); - ret = ZCONNECTIONLOSS; - ret = zoo_create(zh, buf, NULL, 0, mutex->acl, - ZOO_EPHEMERAL|ZOO_SEQUENCE, retbuf, (len+20)); - - // do not want to retry the create since - // we would end up creating more than one child - if (ret != ZOK) { - LOG_WARN(("could not create zoo node %s", buf)); - return ret; - } - mutex->id = getName(retbuf); - } - - if (mutex->id != NULL) { - ret = ZCONNECTIONLOSS; - ret = retry_getchildren(zh, path, vector, ts, retry); - if (ret != ZOK) { - LOG_WARN(("could not connect to server")); - return ret; - } - //sort this list - sort_children(vector); - owner_id = vector->data[0]; - mutex->ownerid = strdup(owner_id); - id = mutex->id; - char* lessthanme = child_floor(vector->data, vector->count, id); - if (lessthanme != NULL) { - int flen = strlen(mutex->path) + strlen(lessthanme) + 2; - char last_child[flen]; - sprintf(last_child, "%s/%s",mutex->path, lessthanme); - ret = ZCONNECTIONLOSS; - ret = retry_zoowexists(zh, last_child, &lock_watcher_fn, mutex, - &stat, ts, retry); - // cannot watch my predecessor i am giving up - // we need to be able to watch the predecessor - // since if we do not become a leader the others - // will keep waiting - if (ret != ZOK) { - free_String_vector(vector); - LOG_WARN(("unable to watch my predecessor")); - ret = zkr_lock_unlock(mutex); - while (ret == 0) { - //we have to give up our leadership - // since we cannot watch out predecessor - ret = zkr_lock_unlock(mutex); - } - return ret; - } - // we are not the owner of the lock - mutex->isOwner = 0; - } - else { - // this is the case when we are the owner - // of the lock - if (strcmp(mutex->id, owner_id) == 0) { - LOG_DEBUG(("got the zoo lock owner - %s", mutex->id)); - mutex->isOwner = 1; - if (mutex->completion != NULL) { - mutex->completion(0, mutex->cbdata); - } - return ZOK; - } - } - free_String_vector(vector); - return ZOK; - } - } while (mutex->id == NULL); - return ZOK; -} - -ZOOAPI int zkr_lock_lock(zkr_lock_mutex_t *mutex) { - pthread_mutex_lock(&(mutex->pmutex)); - zhandle_t *zh = mutex->zh; - char *path = mutex->path; - struct Stat stat; - int exists = zoo_exists(zh, path, 0, &stat); - int count = 0; - struct timespec ts; - ts.tv_sec = 0; - ts.tv_nsec = (.5)*1000000; - // retry to see if the path exists and - // and create if the path does not exist - while ((exists == ZCONNECTIONLOSS || exists == ZNONODE) && (count <4)) { - count++; - // retry the operation - if (exists == ZCONNECTIONLOSS) - exists = zoo_exists(zh, path, 0, &stat); - else if (exists == ZNONODE) - exists = zoo_create(zh, path, NULL, 0, mutex->acl, 0, NULL, 0); - nanosleep(&ts, 0); - - } - - // need to check if we cannot still access the server - int check_retry = ZCONNECTIONLOSS; - count = 0; - while (check_retry != ZOK && count <4) { - check_retry = zkr_lock_operation(mutex, &ts); - if (check_retry != ZOK) { - nanosleep(&ts, 0); - count++; - } - } - pthread_mutex_unlock(&(mutex->pmutex)); - return zkr_lock_isowner(mutex); -} - - -ZOOAPI char* zkr_lock_getpath(zkr_lock_mutex_t *mutex) { - return mutex->path; -} - -ZOOAPI int zkr_lock_isowner(zkr_lock_mutex_t *mutex) { - return (mutex->id != NULL && mutex->ownerid != NULL - && (strcmp(mutex->id, mutex->ownerid) == 0)); -} - -ZOOAPI char* zkr_lock_getid(zkr_lock_mutex_t *mutex) { - return mutex->ownerid; -} - -ZOOAPI int zkr_lock_destroy(zkr_lock_mutex_t* mutex) { - if (mutex->id) - free(mutex->id); - mutex->path = NULL; - mutex->acl = NULL; - mutex->completion = NULL; - pthread_mutex_destroy(&(mutex->pmutex)); - mutex->isOwner = 0; - if (mutex->ownerid) - free(mutex->ownerid); - return 0; -} - diff --git a/pkg/registry/zookeeper-3.4.6/recipes/lock/src/c/tests/TestClient.cc b/pkg/registry/zookeeper-3.4.6/recipes/lock/src/c/tests/TestClient.cc deleted file mode 100644 index 2cc56cf34..000000000 --- a/pkg/registry/zookeeper-3.4.6/recipes/lock/src/c/tests/TestClient.cc +++ /dev/null @@ -1,201 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you 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. - */ - -#include - -#include -#include -#include - - -using namespace std; - -#include -#include - -#include -#include - -static void yield(zhandle_t *zh, int i) -{ - sleep(i); -} - -typedef struct evt { - string path; - int type; -} evt_t; - -typedef struct watchCtx { -private: - list events; -public: - bool connected; - zhandle_t *zh; - - watchCtx() { - connected = false; - zh = 0; - } - ~watchCtx() { - if (zh) { - zookeeper_close(zh); - zh = 0; - } - } - - evt_t getEvent() { - evt_t evt; - evt = events.front(); - events.pop_front(); - return evt; - } - - int countEvents() { - int count; - count = events.size(); - return count; - } - - void putEvent(evt_t evt) { - events.push_back(evt); - } - - bool waitForConnected(zhandle_t *zh) { - time_t expires = time(0) + 10; - while(!connected && time(0) < expires) { - yield(zh, 1); - } - return connected; - } - bool waitForDisconnected(zhandle_t *zh) { - time_t expires = time(0) + 15; - while(connected && time(0) < expires) { - yield(zh, 1); - } - return !connected; - } -} watchctx_t; - -class Zookeeper_locktest : public CPPUNIT_NS::TestFixture -{ - CPPUNIT_TEST_SUITE(Zookeeper_locktest); - CPPUNIT_TEST(testlock); - CPPUNIT_TEST_SUITE_END(); - - static void watcher(zhandle_t *, int type, int state, const char *path,void*v){ - watchctx_t *ctx = (watchctx_t*)v; - - if (state == ZOO_CONNECTED_STATE) { - ctx->connected = true; - } else { - ctx->connected = false; - } - if (type != ZOO_SESSION_EVENT) { - evt_t evt; - evt.path = path; - evt.type = type; - ctx->putEvent(evt); - } - } - - static const char hostPorts[]; - - const char *getHostPorts() { - return hostPorts; - } - - zhandle_t *createClient(watchctx_t *ctx) { - zhandle_t *zk = zookeeper_init(hostPorts, watcher, 10000, 0, - ctx, 0); - ctx->zh = zk; - sleep(1); - return zk; - } - -public: - -#define ZKSERVER_CMD "./tests/zkServer.sh" - - void setUp() - { - char cmd[1024]; - sprintf(cmd, "%s startClean %s", ZKSERVER_CMD, getHostPorts()); - CPPUNIT_ASSERT(system(cmd) == 0); - } - - - void startServer() { - char cmd[1024]; - sprintf(cmd, "%s start %s", ZKSERVER_CMD, getHostPorts()); - CPPUNIT_ASSERT(system(cmd) == 0); - } - - void stopServer() { - tearDown(); - } - - void tearDown() - { - char cmd[1024]; - sprintf(cmd, "%s stop %s", ZKSERVER_CMD, getHostPorts()); - CPPUNIT_ASSERT(system(cmd) == 0); - } - - - void testlock() - { - watchctx_t ctx; - int rc; - struct Stat stat; - char buf[1024]; - int blen; - struct String_vector strings; - const char *testName; - zkr_lock_mutex_t mutexes[3]; - int count = 3; - int i = 0; - char* path = "/test-lock"; - for (i=0; i< 3; i++) { - zhandle_t *zh = createClient(&ctx); - zkr_lock_init(&mutexes[i], zh, path, &ZOO_OPEN_ACL_UNSAFE); - zkr_lock_lock(&mutexes[i]); - } - sleep(30); - zkr_lock_mutex leader = mutexes[0]; - zkr_lock_mutex mutex; - int ret = strcmp(leader.id, leader.ownerid); - CPPUNIT_ASSERT(ret == 0); - for(i=1; i < count; i++) { - mutex = mutexes[i]; - CPPUNIT_ASSERT(strcmp(mutex.id, mutex.ownerid) != 0); - } - zkr_lock_unlock(&leader); - sleep(30); - zkr_lock_mutex secondleader = mutexes[1]; - CPPUNIT_ASSERT(strcmp(secondleader.id , secondleader.ownerid) == 0); - for (i=2; i -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include "Util.h" - -using namespace std; - -CPPUNIT_NS_BEGIN - -class EclipseOutputter: public CompilerOutputter -{ -public: - EclipseOutputter(TestResultCollector *result,ostream &stream): - CompilerOutputter(result,stream,"%p:%l: "),stream_(stream) - { - } - virtual void printFailedTestName( TestFailure *failure ){} - virtual void printFailureMessage( TestFailure *failure ) - { - stream_<<": "; - Message msg = failure->thrownException()->message(); - stream_<< msg.shortDescription(); - - string text; - for(int i=0; i the output must be in the compiler error format. - //bool selfTest = (argc > 1) && (std::string("-ide") == argv[1]); - globalTestConfig.addConfigFromCmdLine(argc,argv); - - // Create the event manager and test controller - CPPUNIT_NS::TestResult controller; - // Add a listener that colllects test result - CPPUNIT_NS::TestResultCollector result; - controller.addListener( &result ); - - // Add a listener that print dots as tests run. - // CPPUNIT_NS::TextTestProgressListener progress; - CPPUNIT_NS::BriefTestProgressListener progress; - controller.addListener( &progress ); - - CPPUNIT_NS::TestRunner runner; - runner.addTest( CPPUNIT_NS::TestFactoryRegistry::getRegistry().makeTest() ); - - try - { - cout << "Running " << globalTestConfig.getTestName(); - runner.run( controller, globalTestConfig.getTestName()); - cout< -#include -#include - -// number of elements in array -#define COUNTOF(array) sizeof(array)/sizeof(array[0]) - -#define DECLARE_WRAPPER(ret,sym,sig) \ - extern "C" ret __real_##sym sig; \ - extern "C" ret __wrap_##sym sig - -#define CALL_REAL(sym,params) \ - __real_##sym params - -// must include "src/zookeeper_log.h" to be able to use this macro -#define TEST_TRACE(x) \ - log_message(3,__LINE__,__func__,format_log_message x) - -extern const std::string EMPTY_STRING; - -// ***************************************************************************** -// A bit of wizardry to get to the bare type from a reference or a pointer -// to the type -template -struct TypeOp { - typedef T BareT; - typedef T ArgT; -}; - -// partial specialization for reference types -template -struct TypeOp{ - typedef T& ArgT; - typedef typename TypeOp::BareT BareT; -}; - -// partial specialization for pointers -template -struct TypeOp{ - typedef T* ArgT; - typedef typename TypeOp::BareT BareT; -}; - -// ***************************************************************************** -// Container utilities - -template -void putValue(std::map& map,const K& k, const V& v){ - typedef std::map Map; - typename Map::const_iterator it=map.find(k); - if(it==map.end()) - map.insert(typename Map::value_type(k,v)); - else - map[k]=v; -} - -template -bool getValue(const std::map& map,const K& k,V& v){ - typedef std::map Map; - typename Map::const_iterator it=map.find(k); - if(it==map.end()) - return false; - v=it->second; - return true; -} - -// ***************************************************************************** -// misc utils - -// millisecond sleep -void millisleep(int ms); -// evaluate given predicate until it returns true or the timeout -// (in millis) has expired -template -int ensureCondition(const Predicate& p,int timeout){ - int elapsed=0; - while(!p() && elapsed CmdLineOptList; -public: - typedef CmdLineOptList::const_iterator const_iterator; - TestConfig(){} - ~TestConfig(){} - void addConfigFromCmdLine(int argc, char* argv[]){ - if(argc>=2) - testName_=argv[1]; - for(int i=2; i /tmp/zk.log & - echo $! > /tmp/zk.pid - sleep 5 - ;; -stop) - # Already killed above - ;; -*) - echo "Unknown command " + $1 - exit 2 -esac - diff --git a/pkg/registry/zookeeper-3.4.6/recipes/lock/src/java/org/apache/zookeeper/recipes/lock/LockListener.java b/pkg/registry/zookeeper-3.4.6/recipes/lock/src/java/org/apache/zookeeper/recipes/lock/LockListener.java deleted file mode 100644 index 1c21ad661..000000000 --- a/pkg/registry/zookeeper-3.4.6/recipes/lock/src/java/org/apache/zookeeper/recipes/lock/LockListener.java +++ /dev/null @@ -1,38 +0,0 @@ -/** - * - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You 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. - */ -package org.apache.zookeeper.recipes.lock; - -/** - * This class has two methods which are call - * back methods when a lock is acquired and - * when the lock is released. - * - */ -public interface LockListener { - /** - * call back called when the lock - * is acquired - */ - public void lockAcquired(); - - /** - * call back called when the lock is - * released. - */ - public void lockReleased(); -} diff --git a/pkg/registry/zookeeper-3.4.6/recipes/lock/src/java/org/apache/zookeeper/recipes/lock/ProtocolSupport.java b/pkg/registry/zookeeper-3.4.6/recipes/lock/src/java/org/apache/zookeeper/recipes/lock/ProtocolSupport.java deleted file mode 100644 index 4efdb854d..000000000 --- a/pkg/registry/zookeeper-3.4.6/recipes/lock/src/java/org/apache/zookeeper/recipes/lock/ProtocolSupport.java +++ /dev/null @@ -1,193 +0,0 @@ -/** - * - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You 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. - */ -package org.apache.zookeeper.recipes.lock; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.apache.zookeeper.CreateMode; -import org.apache.zookeeper.KeeperException; -import org.apache.zookeeper.ZooDefs; -import org.apache.zookeeper.ZooKeeper; -import org.apache.zookeeper.data.ACL; -import org.apache.zookeeper.data.Stat; -import org.apache.zookeeper.recipes.lock.ZooKeeperOperation; - -import java.util.List; -import java.util.concurrent.atomic.AtomicBoolean; - -/** - * A base class for protocol implementations which provides a number of higher - * level helper methods for working with ZooKeeper along with retrying synchronous - * operations if the connection to ZooKeeper closes such as - * {@link #retryOperation(ZooKeeperOperation)} - * - */ -class ProtocolSupport { - private static final Logger LOG = LoggerFactory.getLogger(ProtocolSupport.class); - - protected final ZooKeeper zookeeper; - private AtomicBoolean closed = new AtomicBoolean(false); - private long retryDelay = 500L; - private int retryCount = 10; - private List acl = ZooDefs.Ids.OPEN_ACL_UNSAFE; - - public ProtocolSupport(ZooKeeper zookeeper) { - this.zookeeper = zookeeper; - } - - /** - * Closes this strategy and releases any ZooKeeper resources; but keeps the - * ZooKeeper instance open - */ - public void close() { - if (closed.compareAndSet(false, true)) { - doClose(); - } - } - - /** - * return zookeeper client instance - * @return zookeeper client instance - */ - public ZooKeeper getZookeeper() { - return zookeeper; - } - - /** - * return the acl its using - * @return the acl. - */ - public List getAcl() { - return acl; - } - - /** - * set the acl - * @param acl the acl to set to - */ - public void setAcl(List acl) { - this.acl = acl; - } - - /** - * get the retry delay in milliseconds - * @return the retry delay - */ - public long getRetryDelay() { - return retryDelay; - } - - /** - * Sets the time waited between retry delays - * @param retryDelay the retry delay - */ - public void setRetryDelay(long retryDelay) { - this.retryDelay = retryDelay; - } - - /** - * Allow derived classes to perform - * some custom closing operations to release resources - */ - protected void doClose() { - } - - - /** - * Perform the given operation, retrying if the connection fails - * @return object. it needs to be cast to the callee's expected - * return type. - */ - protected Object retryOperation(ZooKeeperOperation operation) - throws KeeperException, InterruptedException { - KeeperException exception = null; - for (int i = 0; i < retryCount; i++) { - try { - return operation.execute(); - } catch (KeeperException.SessionExpiredException e) { - LOG.warn("Session expired for: " + zookeeper + " so reconnecting due to: " + e, e); - throw e; - } catch (KeeperException.ConnectionLossException e) { - if (exception == null) { - exception = e; - } - LOG.debug("Attempt " + i + " failed with connection loss so " + - "attempting to reconnect: " + e, e); - retryDelay(i); - } - } - throw exception; - } - - /** - * Ensures that the given path exists with no data, the current - * ACL and no flags - * @param path - */ - protected void ensurePathExists(String path) { - ensureExists(path, null, acl, CreateMode.PERSISTENT); - } - - /** - * Ensures that the given path exists with the given data, ACL and flags - * @param path - * @param acl - * @param flags - */ - protected void ensureExists(final String path, final byte[] data, - final List acl, final CreateMode flags) { - try { - retryOperation(new ZooKeeperOperation() { - public boolean execute() throws KeeperException, InterruptedException { - Stat stat = zookeeper.exists(path, false); - if (stat != null) { - return true; - } - zookeeper.create(path, data, acl, flags); - return true; - } - }); - } catch (KeeperException e) { - LOG.warn("Caught: " + e, e); - } catch (InterruptedException e) { - LOG.warn("Caught: " + e, e); - } - } - - /** - * Returns true if this protocol has been closed - * @return true if this protocol is closed - */ - protected boolean isClosed() { - return closed.get(); - } - - /** - * Performs a retry delay if this is not the first attempt - * @param attemptCount the number of the attempts performed so far - */ - protected void retryDelay(int attemptCount) { - if (attemptCount > 0) { - try { - Thread.sleep(attemptCount * retryDelay); - } catch (InterruptedException e) { - LOG.debug("Failed to sleep: " + e, e); - } - } - } -} diff --git a/pkg/registry/zookeeper-3.4.6/recipes/lock/src/java/org/apache/zookeeper/recipes/lock/WriteLock.java b/pkg/registry/zookeeper-3.4.6/recipes/lock/src/java/org/apache/zookeeper/recipes/lock/WriteLock.java deleted file mode 100644 index 5caebee46..000000000 --- a/pkg/registry/zookeeper-3.4.6/recipes/lock/src/java/org/apache/zookeeper/recipes/lock/WriteLock.java +++ /dev/null @@ -1,296 +0,0 @@ -/** - * - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You 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. - */ -package org.apache.zookeeper.recipes.lock; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.apache.zookeeper.KeeperException; -import org.apache.zookeeper.WatchedEvent; -import org.apache.zookeeper.Watcher; -import static org.apache.zookeeper.CreateMode.EPHEMERAL_SEQUENTIAL; -import org.apache.zookeeper.ZooKeeper; -import org.apache.zookeeper.data.ACL; -import org.apache.zookeeper.data.Stat; - -import java.util.List; -import java.util.SortedSet; -import java.util.TreeSet; - -/** - * A
      protocol to implement an exclusive - * write lock or to elect a leader.

      You invoke {@link #lock()} to - * start the process of grabbing the lock; you may get the lock then or it may be - * some time later.

      You can register a listener so that you are invoked - * when you get the lock; otherwise you can ask if you have the lock - * by calling {@link #isOwner()} - * - */ -public class WriteLock extends ProtocolSupport { - private static final Logger LOG = LoggerFactory.getLogger(WriteLock.class); - - private final String dir; - private String id; - private ZNodeName idName; - private String ownerId; - private String lastChildId; - private byte[] data = {0x12, 0x34}; - private LockListener callback; - private LockZooKeeperOperation zop; - - /** - * zookeeper contructor for writelock - * @param zookeeper zookeeper client instance - * @param dir the parent path you want to use for locking - * @param acls the acls that you want to use for all the paths, - * if null world read/write is used. - */ - public WriteLock(ZooKeeper zookeeper, String dir, List acl) { - super(zookeeper); - this.dir = dir; - if (acl != null) { - setAcl(acl); - } - this.zop = new LockZooKeeperOperation(); - } - - /** - * zookeeper contructor for writelock with callback - * @param zookeeper the zookeeper client instance - * @param dir the parent path you want to use for locking - * @param acl the acls that you want to use for all the paths - * @param callback the call back instance - */ - public WriteLock(ZooKeeper zookeeper, String dir, List acl, - LockListener callback) { - this(zookeeper, dir, acl); - this.callback = callback; - } - - /** - * return the current locklistener - * @return the locklistener - */ - public LockListener getLockListener() { - return this.callback; - } - - /** - * register a different call back listener - * @param callback the call back instance - */ - public void setLockListener(LockListener callback) { - this.callback = callback; - } - - /** - * Removes the lock or associated znode if - * you no longer require the lock. this also - * removes your request in the queue for locking - * in case you do not already hold the lock. - * @throws RuntimeException throws a runtime exception - * if it cannot connect to zookeeper. - */ - public synchronized void unlock() throws RuntimeException { - - if (!isClosed() && id != null) { - // we don't need to retry this operation in the case of failure - // as ZK will remove ephemeral files and we don't wanna hang - // this process when closing if we cannot reconnect to ZK - try { - - ZooKeeperOperation zopdel = new ZooKeeperOperation() { - public boolean execute() throws KeeperException, - InterruptedException { - zookeeper.delete(id, -1); - return Boolean.TRUE; - } - }; - zopdel.execute(); - } catch (InterruptedException e) { - LOG.warn("Caught: " + e, e); - //set that we have been interrupted. - Thread.currentThread().interrupt(); - } catch (KeeperException.NoNodeException e) { - // do nothing - } catch (KeeperException e) { - LOG.warn("Caught: " + e, e); - throw (RuntimeException) new RuntimeException(e.getMessage()). - initCause(e); - } - finally { - if (callback != null) { - callback.lockReleased(); - } - id = null; - } - } - } - - /** - * the watcher called on - * getting watch while watching - * my predecessor - */ - private class LockWatcher implements Watcher { - public void process(WatchedEvent event) { - // lets either become the leader or watch the new/updated node - LOG.debug("Watcher fired on path: " + event.getPath() + " state: " + - event.getState() + " type " + event.getType()); - try { - lock(); - } catch (Exception e) { - LOG.warn("Failed to acquire lock: " + e, e); - } - } - } - - /** - * a zoookeeper operation that is mainly responsible - * for all the magic required for locking. - */ - private class LockZooKeeperOperation implements ZooKeeperOperation { - - /** find if we have been created earler if not create our node - * - * @param prefix the prefix node - * @param zookeeper teh zookeeper client - * @param dir the dir paretn - * @throws KeeperException - * @throws InterruptedException - */ - private void findPrefixInChildren(String prefix, ZooKeeper zookeeper, String dir) - throws KeeperException, InterruptedException { - List names = zookeeper.getChildren(dir, false); - for (String name : names) { - if (name.startsWith(prefix)) { - id = name; - if (LOG.isDebugEnabled()) { - LOG.debug("Found id created last time: " + id); - } - break; - } - } - if (id == null) { - id = zookeeper.create(dir + "/" + prefix, data, - getAcl(), EPHEMERAL_SEQUENTIAL); - - if (LOG.isDebugEnabled()) { - LOG.debug("Created id: " + id); - } - } - - } - - /** - * the command that is run and retried for actually - * obtaining the lock - * @return if the command was successful or not - */ - public boolean execute() throws KeeperException, InterruptedException { - do { - if (id == null) { - long sessionId = zookeeper.getSessionId(); - String prefix = "x-" + sessionId + "-"; - // lets try look up the current ID if we failed - // in the middle of creating the znode - findPrefixInChildren(prefix, zookeeper, dir); - idName = new ZNodeName(id); - } - if (id != null) { - List names = zookeeper.getChildren(dir, false); - if (names.isEmpty()) { - LOG.warn("No children in: " + dir + " when we've just " + - "created one! Lets recreate it..."); - // lets force the recreation of the id - id = null; - } else { - // lets sort them explicitly (though they do seem to come back in order ususally :) - SortedSet sortedNames = new TreeSet(); - for (String name : names) { - sortedNames.add(new ZNodeName(dir + "/" + name)); - } - ownerId = sortedNames.first().getName(); - SortedSet lessThanMe = sortedNames.headSet(idName); - if (!lessThanMe.isEmpty()) { - ZNodeName lastChildName = lessThanMe.last(); - lastChildId = lastChildName.getName(); - if (LOG.isDebugEnabled()) { - LOG.debug("watching less than me node: " + lastChildId); - } - Stat stat = zookeeper.exists(lastChildId, new LockWatcher()); - if (stat != null) { - return Boolean.FALSE; - } else { - LOG.warn("Could not find the" + - " stats for less than me: " + lastChildName.getName()); - } - } else { - if (isOwner()) { - if (callback != null) { - callback.lockAcquired(); - } - return Boolean.TRUE; - } - } - } - } - } - while (id == null); - return Boolean.FALSE; - } - }; - - /** - * Attempts to acquire the exclusive write lock returning whether or not it was - * acquired. Note that the exclusive lock may be acquired some time later after - * this method has been invoked due to the current lock owner going away. - */ - public synchronized boolean lock() throws KeeperException, InterruptedException { - if (isClosed()) { - return false; - } - ensurePathExists(dir); - - return (Boolean) retryOperation(zop); - } - - /** - * return the parent dir for lock - * @return the parent dir used for locks. - */ - public String getDir() { - return dir; - } - - /** - * Returns true if this node is the owner of the - * lock (or the leader) - */ - public boolean isOwner() { - return id != null && ownerId != null && id.equals(ownerId); - } - - /** - * return the id for this lock - * @return the id for this lock - */ - public String getId() { - return this.id; - } -} - diff --git a/pkg/registry/zookeeper-3.4.6/recipes/lock/src/java/org/apache/zookeeper/recipes/lock/ZNodeName.java b/pkg/registry/zookeeper-3.4.6/recipes/lock/src/java/org/apache/zookeeper/recipes/lock/ZNodeName.java deleted file mode 100644 index 99b6616f9..000000000 --- a/pkg/registry/zookeeper-3.4.6/recipes/lock/src/java/org/apache/zookeeper/recipes/lock/ZNodeName.java +++ /dev/null @@ -1,110 +0,0 @@ -/** - * - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You 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. - */ -package org.apache.zookeeper.recipes.lock; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -/** - * Represents an ephemeral znode name which has an ordered sequence number - * and can be sorted in order - * - */ -class ZNodeName implements Comparable { - private final String name; - private String prefix; - private int sequence = -1; - private static final Logger LOG = LoggerFactory.getLogger(ZNodeName.class); - - public ZNodeName(String name) { - if (name == null) { - throw new NullPointerException("id cannot be null"); - } - this.name = name; - this.prefix = name; - int idx = name.lastIndexOf('-'); - if (idx >= 0) { - this.prefix = name.substring(0, idx); - try { - this.sequence = Integer.parseInt(name.substring(idx + 1)); - // If an exception occurred we misdetected a sequence suffix, - // so return -1. - } catch (NumberFormatException e) { - LOG.info("Number format exception for " + idx, e); - } catch (ArrayIndexOutOfBoundsException e) { - LOG.info("Array out of bounds for " + idx, e); - } - } - } - - @Override - public String toString() { - return name.toString(); - } - - @Override - public boolean equals(Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; - - ZNodeName sequence = (ZNodeName) o; - - if (!name.equals(sequence.name)) return false; - - return true; - } - - @Override - public int hashCode() { - return name.hashCode() + 37; - } - - public int compareTo(ZNodeName that) { - int answer = this.prefix.compareTo(that.prefix); - if (answer == 0) { - int s1 = this.sequence; - int s2 = that.sequence; - if (s1 == -1 && s2 == -1) { - return this.name.compareTo(that.name); - } - answer = s1 == -1 ? 1 : s2 == -1 ? -1 : s1 - s2; - } - return answer; - } - - /** - * Returns the name of the znode - */ - public String getName() { - return name; - } - - /** - * Returns the sequence number - */ - public int getZNodeName() { - return sequence; - } - - /** - * Returns the text prefix before the sequence number - */ - public String getPrefix() { - return prefix; - } -} diff --git a/pkg/registry/zookeeper-3.4.6/recipes/lock/src/java/org/apache/zookeeper/recipes/lock/ZooKeeperOperation.java b/pkg/registry/zookeeper-3.4.6/recipes/lock/src/java/org/apache/zookeeper/recipes/lock/ZooKeeperOperation.java deleted file mode 100644 index 54317ed95..000000000 --- a/pkg/registry/zookeeper-3.4.6/recipes/lock/src/java/org/apache/zookeeper/recipes/lock/ZooKeeperOperation.java +++ /dev/null @@ -1,38 +0,0 @@ -/** - * - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You 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. - */ -package org.apache.zookeeper.recipes.lock; - -import org.apache.zookeeper.KeeperException; - -/** - * A callback object which can be used for implementing retry-able operations in the - * {@link org.apache.zookeeper.recipes.lock.ProtocolSupport} class - * - */ -public interface ZooKeeperOperation { - - /** - * Performs the operation - which may be involved multiple times if the connection - * to ZooKeeper closes during this operation - * - * @return the result of the operation or null - * @throws KeeperException - * @throws InterruptedException - */ - public boolean execute() throws KeeperException, InterruptedException; -} diff --git a/pkg/registry/zookeeper-3.4.6/recipes/queue/build.xml b/pkg/registry/zookeeper-3.4.6/recipes/queue/build.xml deleted file mode 100644 index 0f3505ab9..000000000 --- a/pkg/registry/zookeeper-3.4.6/recipes/queue/build.xml +++ /dev/null @@ -1,128 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Tests failed! - - - - - - - - - - - - - - - - - - diff --git a/pkg/registry/zookeeper-3.4.6/recipes/queue/src/c/INSTALL b/pkg/registry/zookeeper-3.4.6/recipes/queue/src/c/INSTALL deleted file mode 100644 index 5458714e1..000000000 --- a/pkg/registry/zookeeper-3.4.6/recipes/queue/src/c/INSTALL +++ /dev/null @@ -1,234 +0,0 @@ -Installation Instructions -************************* - -Copyright (C) 1994, 1995, 1996, 1999, 2000, 2001, 2002, 2004, 2005, -2006 Free Software Foundation, Inc. - -This file is free documentation; the Free Software Foundation gives -unlimited permission to copy, distribute and modify it. - -Basic Installation -================== - -Briefly, the shell commands `./configure; make; make install' should -configure, build, and install this package. The following -more-detailed instructions are generic; see the `README' file for -instructions specific to this package. - - The `configure' shell script attempts to guess correct values for -various system-dependent variables used during compilation. It uses -those values to create a `Makefile' in each directory of the package. -It may also create one or more `.h' files containing system-dependent -definitions. Finally, it creates a shell script `config.status' that -you can run in the future to recreate the current configuration, and a -file `config.log' containing compiler output (useful mainly for -debugging `configure'). - - It can also use an optional file (typically called `config.cache' -and enabled with `--cache-file=config.cache' or simply `-C') that saves -the results of its tests to speed up reconfiguring. Caching is -disabled by default to prevent problems with accidental use of stale -cache files. - - If you need to do unusual things to compile the package, please try -to figure out how `configure' could check whether to do them, and mail -diffs or instructions to the address given in the `README' so they can -be considered for the next release. If you are using the cache, and at -some point `config.cache' contains results you don't want to keep, you -may remove or edit it. - - The file `configure.ac' (or `configure.in') is used to create -`configure' by a program called `autoconf'. You need `configure.ac' if -you want to change it or regenerate `configure' using a newer version -of `autoconf'. - -The simplest way to compile this package is: - - 1. `cd' to the directory containing the package's source code and type - `./configure' to configure the package for your system. - - Running `configure' might take a while. While running, it prints - some messages telling which features it is checking for. - - 2. Type `make' to compile the package. - - 3. Optionally, type `make check' to run any self-tests that come with - the package. - - 4. Type `make install' to install the programs and any data files and - documentation. - - 5. You can remove the program binaries and object files from the - source code directory by typing `make clean'. To also remove the - files that `configure' created (so you can compile the package for - a different kind of computer), type `make distclean'. There is - also a `make maintainer-clean' target, but that is intended mainly - for the package's developers. If you use it, you may have to get - all sorts of other programs in order to regenerate files that came - with the distribution. - -Compilers and Options -===================== - -Some systems require unusual options for compilation or linking that the -`configure' script does not know about. Run `./configure --help' for -details on some of the pertinent environment variables. - - You can give `configure' initial values for configuration parameters -by setting variables in the command line or in the environment. Here -is an example: - - ./configure CC=c99 CFLAGS=-g LIBS=-lposix - - *Note Defining Variables::, for more details. - -Compiling For Multiple Architectures -==================================== - -You can compile the package for more than one kind of computer at the -same time, by placing the object files for each architecture in their -own directory. To do this, you can use GNU `make'. `cd' to the -directory where you want the object files and executables to go and run -the `configure' script. `configure' automatically checks for the -source code in the directory that `configure' is in and in `..'. - - With a non-GNU `make', it is safer to compile the package for one -architecture at a time in the source code directory. After you have -installed the package for one architecture, use `make distclean' before -reconfiguring for another architecture. - -Installation Names -================== - -By default, `make install' installs the package's commands under -`/usr/local/bin', include files under `/usr/local/include', etc. You -can specify an installation prefix other than `/usr/local' by giving -`configure' the option `--prefix=PREFIX'. - - You can specify separate installation prefixes for -architecture-specific files and architecture-independent files. If you -pass the option `--exec-prefix=PREFIX' to `configure', the package uses -PREFIX as the prefix for installing programs and libraries. -Documentation and other data files still use the regular prefix. - - In addition, if you use an unusual directory layout you can give -options like `--bindir=DIR' to specify different values for particular -kinds of files. Run `configure --help' for a list of the directories -you can set and what kinds of files go in them. - - If the package supports it, you can cause programs to be installed -with an extra prefix or suffix on their names by giving `configure' the -option `--program-prefix=PREFIX' or `--program-suffix=SUFFIX'. - -Optional Features -================= - -Some packages pay attention to `--enable-FEATURE' options to -`configure', where FEATURE indicates an optional part of the package. -They may also pay attention to `--with-PACKAGE' options, where PACKAGE -is something like `gnu-as' or `x' (for the X Window System). The -`README' should mention any `--enable-' and `--with-' options that the -package recognizes. - - For packages that use the X Window System, `configure' can usually -find the X include and library files automatically, but if it doesn't, -you can use the `configure' options `--x-includes=DIR' and -`--x-libraries=DIR' to specify their locations. - -Specifying the System Type -========================== - -There may be some features `configure' cannot figure out automatically, -but needs to determine by the type of machine the package will run on. -Usually, assuming the package is built to be run on the _same_ -architectures, `configure' can figure that out, but if it prints a -message saying it cannot guess the machine type, give it the -`--build=TYPE' option. TYPE can either be a short name for the system -type, such as `sun4', or a canonical name which has the form: - - CPU-COMPANY-SYSTEM - -where SYSTEM can have one of these forms: - - OS KERNEL-OS - - See the file `config.sub' for the possible values of each field. If -`config.sub' isn't included in this package, then this package doesn't -need to know the machine type. - - If you are _building_ compiler tools for cross-compiling, you should -use the option `--target=TYPE' to select the type of system they will -produce code for. - - If you want to _use_ a cross compiler, that generates code for a -platform different from the build platform, you should specify the -"host" platform (i.e., that on which the generated programs will -eventually be run) with `--host=TYPE'. - -Sharing Defaults -================ - -If you want to set default values for `configure' scripts to share, you -can create a site shell script called `config.site' that gives default -values for variables like `CC', `cache_file', and `prefix'. -`configure' looks for `PREFIX/share/config.site' if it exists, then -`PREFIX/etc/config.site' if it exists. Or, you can set the -`CONFIG_SITE' environment variable to the location of the site script. -A warning: not all `configure' scripts look for a site script. - -Defining Variables -================== - -Variables not defined in a site shell script can be set in the -environment passed to `configure'. However, some packages may run -configure again during the build, and the customized values of these -variables may be lost. In order to avoid this problem, you should set -them in the `configure' command line, using `VAR=value'. For example: - - ./configure CC=/usr/local2/bin/gcc - -causes the specified `gcc' to be used as the C compiler (unless it is -overridden in the site shell script). - -Unfortunately, this technique does not work for `CONFIG_SHELL' due to -an Autoconf bug. Until the bug is fixed you can use this workaround: - - CONFIG_SHELL=/bin/bash /bin/bash ./configure CONFIG_SHELL=/bin/bash - -`configure' Invocation -====================== - -`configure' recognizes the following options to control how it operates. - -`--help' -`-h' - Print a summary of the options to `configure', and exit. - -`--version' -`-V' - Print the version of Autoconf used to generate the `configure' - script, and exit. - -`--cache-file=FILE' - Enable the cache: use and save the results of the tests in FILE, - traditionally `config.cache'. FILE defaults to `/dev/null' to - disable caching. - -`--config-cache' -`-C' - Alias for `--cache-file=config.cache'. - -`--quiet' -`--silent' -`-q' - Do not print messages saying which checks are being made. To - suppress all normal output, redirect it to `/dev/null' (any error - messages will still be shown). - -`--srcdir=DIR' - Look for the package's source code in directory DIR. Usually - `configure' can determine that directory automatically. - -`configure' also accepts some other, not widely useful, options. Run -`configure --help' for more details. - diff --git a/pkg/registry/zookeeper-3.4.6/recipes/queue/src/c/LICENSE b/pkg/registry/zookeeper-3.4.6/recipes/queue/src/c/LICENSE deleted file mode 100644 index d64569567..000000000 --- a/pkg/registry/zookeeper-3.4.6/recipes/queue/src/c/LICENSE +++ /dev/null @@ -1,202 +0,0 @@ - - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "[]" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright [yyyy] [name of copyright owner] - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. diff --git a/pkg/registry/zookeeper-3.4.6/recipes/queue/src/c/Makefile.am b/pkg/registry/zookeeper-3.4.6/recipes/queue/src/c/Makefile.am deleted file mode 100644 index ecef3cc79..000000000 --- a/pkg/registry/zookeeper-3.4.6/recipes/queue/src/c/Makefile.am +++ /dev/null @@ -1,46 +0,0 @@ -# Licensed to the Apache Software Foundation (ASF) under one -# or more contributor license agreements. See the NOTICE file -# distributed with this work for additional information -# regarding copyright ownership. The ASF licenses this file -# to you 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. - -include $(top_srcdir)/aminclude.am - -AM_CFLAGS = -Wall -fPIC -I${ZOOKEEPER_PATH}/include -I${ZOOKEEPER_PATH}/generated \ - -I$(top_srcdir)/include -I/usr/include -AM_CPPFLAGS = -Wall -I${ZOOKEEPER_PATH}/include -I${ZOOKEEPER_PATH}/generated\ - -I${top_srcdir}/include -I/usr/include -EXTRA_DIST = LICENSE -lib_LTLIBRARIES = libzooqueue.la -libzooqueue_la_SOURCES = src/zoo_queue.c include/zoo_queue.h -libzooqueue_la_CPPFLAGS = -DDLOPEN_MODULE -libzooqueue_la_LDFLAGS = -version-info 0:1:0 - -#run the tests now - -TEST_SOURCES = tests/TestDriver.cc tests/TestClient.cc tests/Util.cc - - -check_PROGRAMS = zkqueuetest -nodist_zkqueuetest_SOURCES = ${TEST_SOURCES} -zkqueuetest_LDADD = ${ZOOKEEPER_LD} libzooqueue.la -lpthread ${CPPUNIT_LIBS} -zkqueuetest_CXXFLAGS = -DUSE_STATIC_LIB ${CPPUNIT_CFLAGS} - -run-check: check - ./zkqueuetest ${TEST_OPTIONS} - -clean-local: clean-check - ${RM} ${DX_CLEANFILES} - -clean-check: - ${RM} ${nodist_zkqueuetest_OBJECTS} diff --git a/pkg/registry/zookeeper-3.4.6/recipes/queue/src/c/README.txt b/pkg/registry/zookeeper-3.4.6/recipes/queue/src/c/README.txt deleted file mode 100644 index 7ef253fc9..000000000 --- a/pkg/registry/zookeeper-3.4.6/recipes/queue/src/c/README.txt +++ /dev/null @@ -1,30 +0,0 @@ - Zookeeper C queue client library - - -INSTALLATION - -If you're building the client from a source checkout you need to -follow the steps outlined below. If you're building from a release -tar downloaded from Apache please skip to step 2. - -This recipe does not handle ZCONNECTIONLOSS. It will only work correctly once ZOOKEEPER-22 https://issues.apache.org/jira/browse/ZOOKEEPER-22 is resolved. - -1) make sure that you compile the main zookeeper c client library. - -2) change directory to src/recipes/queue/src/c - and do a "autoreconf -if" to bootstrap - autoconf, automake and libtool. Please make sure you have autoconf - version 2.59 or greater installed. -3) do a "./configure [OPTIONS]" to generate the makefile. See INSTALL - for general information about running configure. - -4) do a "make" or "make install" to build the libraries and install them. - Alternatively, you can also build and run a unit test suite (and - you probably should). Please make sure you have cppunit-1.10.x or - higher installed before you execute step 4. Once ./configure has - finished, do a "make run-check". It will build the libraries, build - the tests and run them. -5) to generate doxygen documentation do a "make doxygen-doc". All - documentations will be placed to a new subfolder named docs. By - default only HTML documentation is generated. For information on - other document formats please use "./configure --help" diff --git a/pkg/registry/zookeeper-3.4.6/recipes/queue/src/c/acinclude.m4 b/pkg/registry/zookeeper-3.4.6/recipes/queue/src/c/acinclude.m4 deleted file mode 100644 index d0041d8c2..000000000 --- a/pkg/registry/zookeeper-3.4.6/recipes/queue/src/c/acinclude.m4 +++ /dev/null @@ -1,312 +0,0 @@ -# This file is part of Autoconf. -*- Autoconf -*- - -# Copyright (C) 2004 Oren Ben-Kiki -# This file is distributed under the same terms as the Autoconf macro files. - -# Generate automatic documentation using Doxygen. Works in concert with the -# aminclude.m4 file and a compatible doxygen configuration file. Defines the -# following public macros: -# -# DX_???_FEATURE(ON|OFF) - control the default setting fo a Doxygen feature. -# Supported features are 'DOXYGEN' itself, 'DOT' for generating graphics, -# 'HTML' for plain HTML, 'CHM' for compressed HTML help (for MS users), 'CHI' -# for generating a seperate .chi file by the .chm file, and 'MAN', 'RTF', -# 'XML', 'PDF' and 'PS' for the appropriate output formats. The environment -# variable DOXYGEN_PAPER_SIZE may be specified to override the default 'a4wide' -# paper size. -# -# By default, HTML, PDF and PS documentation is generated as this seems to be -# the most popular and portable combination. MAN pages created by Doxygen are -# usually problematic, though by picking an appropriate subset and doing some -# massaging they might be better than nothing. CHM and RTF are specific for MS -# (note that you can't generate both HTML and CHM at the same time). The XML is -# rather useless unless you apply specialized post-processing to it. -# -# The macro mainly controls the default state of the feature. The use can -# override the default by specifying --enable or --disable. The macros ensure -# that contradictory flags are not given (e.g., --enable-doxygen-html and -# --enable-doxygen-chm, --enable-doxygen-anything with --disable-doxygen, etc.) -# Finally, each feature will be automatically disabled (with a warning) if the -# required programs are missing. -# -# Once all the feature defaults have been specified, call DX_INIT_DOXYGEN with -# the following parameters: a one-word name for the project for use as a -# filename base etc., an optional configuration file name (the default is -# 'Doxyfile', the same as Doxygen's default), and an optional output directory -# name (the default is 'doxygen-doc'). - -## ----------## -## Defaults. ## -## ----------## - -DX_ENV="" -AC_DEFUN([DX_FEATURE_doc], ON) -AC_DEFUN([DX_FEATURE_dot], ON) -AC_DEFUN([DX_FEATURE_man], OFF) -AC_DEFUN([DX_FEATURE_html], ON) -AC_DEFUN([DX_FEATURE_chm], OFF) -AC_DEFUN([DX_FEATURE_chi], OFF) -AC_DEFUN([DX_FEATURE_rtf], OFF) -AC_DEFUN([DX_FEATURE_xml], OFF) -AC_DEFUN([DX_FEATURE_pdf], ON) -AC_DEFUN([DX_FEATURE_ps], ON) - -## --------------- ## -## Private macros. ## -## --------------- ## - -# DX_ENV_APPEND(VARIABLE, VALUE) -# ------------------------------ -# Append VARIABLE="VALUE" to DX_ENV for invoking doxygen. -AC_DEFUN([DX_ENV_APPEND], [AC_SUBST([DX_ENV], ["$DX_ENV $1='$2'"])]) - -# DX_DIRNAME_EXPR -# --------------- -# Expand into a shell expression prints the directory part of a path. -AC_DEFUN([DX_DIRNAME_EXPR], - [[expr ".$1" : '\(\.\)[^/]*$' \| "x$1" : 'x\(.*\)/[^/]*$']]) - -# DX_IF_FEATURE(FEATURE, IF-ON, IF-OFF) -# ------------------------------------- -# Expands according to the M4 (static) status of the feature. -AC_DEFUN([DX_IF_FEATURE], [ifelse(DX_FEATURE_$1, ON, [$2], [$3])]) - -# DX_REQUIRE_PROG(VARIABLE, PROGRAM) -# ---------------------------------- -# Require the specified program to be found for the DX_CURRENT_FEATURE to work. -AC_DEFUN([DX_REQUIRE_PROG], [ -AC_PATH_TOOL([$1], [$2]) -if test "$DX_FLAG_$[DX_CURRENT_FEATURE$$1]" = 1; then - AC_MSG_WARN([$2 not found - will not DX_CURRENT_DESCRIPTION]) - AC_SUBST([DX_FLAG_]DX_CURRENT_FEATURE, 0) -fi -]) - -# DX_TEST_FEATURE(FEATURE) -# ------------------------ -# Expand to a shell expression testing whether the feature is active. -AC_DEFUN([DX_TEST_FEATURE], [test "$DX_FLAG_$1" = 1]) - -# DX_CHECK_DEPEND(REQUIRED_FEATURE, REQUIRED_STATE) -# ------------------------------------------------- -# Verify that a required features has the right state before trying to turn on -# the DX_CURRENT_FEATURE. -AC_DEFUN([DX_CHECK_DEPEND], [ -test "$DX_FLAG_$1" = "$2" \ -|| AC_MSG_ERROR([doxygen-DX_CURRENT_FEATURE ifelse([$2], 1, - requires, contradicts) doxygen-DX_CURRENT_FEATURE]) -]) - -# DX_CLEAR_DEPEND(FEATURE, REQUIRED_FEATURE, REQUIRED_STATE) -# ---------------------------------------------------------- -# Turn off the DX_CURRENT_FEATURE if the required feature is off. -AC_DEFUN([DX_CLEAR_DEPEND], [ -test "$DX_FLAG_$1" = "$2" || AC_SUBST([DX_FLAG_]DX_CURRENT_FEATURE, 0) -]) - -# DX_FEATURE_ARG(FEATURE, DESCRIPTION, -# CHECK_DEPEND, CLEAR_DEPEND, -# REQUIRE, DO-IF-ON, DO-IF-OFF) -# -------------------------------------------- -# Parse the command-line option controlling a feature. CHECK_DEPEND is called -# if the user explicitly turns the feature on (and invokes DX_CHECK_DEPEND), -# otherwise CLEAR_DEPEND is called to turn off the default state if a required -# feature is disabled (using DX_CLEAR_DEPEND). REQUIRE performs additional -# requirement tests (DX_REQUIRE_PROG). Finally, an automake flag is set and -# DO-IF-ON or DO-IF-OFF are called according to the final state of the feature. -AC_DEFUN([DX_ARG_ABLE], [ - AC_DEFUN([DX_CURRENT_FEATURE], [$1]) - AC_DEFUN([DX_CURRENT_DESCRIPTION], [$2]) - AC_ARG_ENABLE(doxygen-$1, - [AS_HELP_STRING(DX_IF_FEATURE([$1], [--disable-doxygen-$1], - [--enable-doxygen-$1]), - DX_IF_FEATURE([$1], [don't $2], [$2]))], - [ -case "$enableval" in -#( -y|Y|yes|Yes|YES) - AC_SUBST([DX_FLAG_$1], 1) - $3 -;; #( -n|N|no|No|NO) - AC_SUBST([DX_FLAG_$1], 0) -;; #( -*) - AC_MSG_ERROR([invalid value '$enableval' given to doxygen-$1]) -;; -esac -], [ -AC_SUBST([DX_FLAG_$1], [DX_IF_FEATURE([$1], 1, 0)]) -$4 -]) -if DX_TEST_FEATURE([$1]); then - $5 - : -fi -if DX_TEST_FEATURE([$1]); then - AM_CONDITIONAL(DX_COND_$1, :) - $6 - : -else - AM_CONDITIONAL(DX_COND_$1, false) - $7 - : -fi -]) - -## -------------- ## -## Public macros. ## -## -------------- ## - -# DX_XXX_FEATURE(DEFAULT_STATE) -# ----------------------------- -AC_DEFUN([DX_DOXYGEN_FEATURE], [AC_DEFUN([DX_FEATURE_doc], [$1])]) -AC_DEFUN([DX_MAN_FEATURE], [AC_DEFUN([DX_FEATURE_man], [$1])]) -AC_DEFUN([DX_HTML_FEATURE], [AC_DEFUN([DX_FEATURE_html], [$1])]) -AC_DEFUN([DX_CHM_FEATURE], [AC_DEFUN([DX_FEATURE_chm], [$1])]) -AC_DEFUN([DX_CHI_FEATURE], [AC_DEFUN([DX_FEATURE_chi], [$1])]) -AC_DEFUN([DX_RTF_FEATURE], [AC_DEFUN([DX_FEATURE_rtf], [$1])]) -AC_DEFUN([DX_XML_FEATURE], [AC_DEFUN([DX_FEATURE_xml], [$1])]) -AC_DEFUN([DX_XML_FEATURE], [AC_DEFUN([DX_FEATURE_xml], [$1])]) -AC_DEFUN([DX_PDF_FEATURE], [AC_DEFUN([DX_FEATURE_pdf], [$1])]) -AC_DEFUN([DX_PS_FEATURE], [AC_DEFUN([DX_FEATURE_ps], [$1])]) - -# DX_INIT_DOXYGEN(PROJECT, [CONFIG-FILE], [OUTPUT-DOC-DIR]) -# --------------------------------------------------------- -# PROJECT also serves as the base name for the documentation files. -# The default CONFIG-FILE is "Doxyfile" and OUTPUT-DOC-DIR is "doxygen-doc". -AC_DEFUN([DX_INIT_DOXYGEN], [ - -# Files: -AC_SUBST([DX_PROJECT], [$1]) -AC_SUBST([DX_CONFIG], [ifelse([$2], [], Doxyfile, [$2])]) -AC_SUBST([DX_DOCDIR], [ifelse([$3], [], doxygen-doc, [$3])]) - -# Environment variables used inside doxygen.cfg: -DX_ENV_APPEND(SRCDIR, $srcdir) -DX_ENV_APPEND(PROJECT, $DX_PROJECT) -DX_ENV_APPEND(DOCDIR, $DX_DOCDIR) -DX_ENV_APPEND(VERSION, $PACKAGE_VERSION) - -# Doxygen itself: -DX_ARG_ABLE(doc, [generate any doxygen documentation], - [], - [], - [DX_REQUIRE_PROG([DX_DOXYGEN], doxygen) - DX_REQUIRE_PROG([DX_PERL], perl)], - [DX_ENV_APPEND(PERL_PATH, $DX_PERL)]) - -# Dot for graphics: -DX_ARG_ABLE(dot, [generate graphics for doxygen documentation], - [DX_CHECK_DEPEND(doc, 1)], - [DX_CLEAR_DEPEND(doc, 1)], - [DX_REQUIRE_PROG([DX_DOT], dot)], - [DX_ENV_APPEND(HAVE_DOT, YES) - DX_ENV_APPEND(DOT_PATH, [`DX_DIRNAME_EXPR($DX_DOT)`])], - [DX_ENV_APPEND(HAVE_DOT, NO)]) - -# Man pages generation: -DX_ARG_ABLE(man, [generate doxygen manual pages], - [DX_CHECK_DEPEND(doc, 1)], - [DX_CLEAR_DEPEND(doc, 1)], - [], - [DX_ENV_APPEND(GENERATE_MAN, YES)], - [DX_ENV_APPEND(GENERATE_MAN, NO)]) - -# RTF file generation: -DX_ARG_ABLE(rtf, [generate doxygen RTF documentation], - [DX_CHECK_DEPEND(doc, 1)], - [DX_CLEAR_DEPEND(doc, 1)], - [], - [DX_ENV_APPEND(GENERATE_RTF, YES)], - [DX_ENV_APPEND(GENERATE_RTF, NO)]) - -# XML file generation: -DX_ARG_ABLE(xml, [generate doxygen XML documentation], - [DX_CHECK_DEPEND(doc, 1)], - [DX_CLEAR_DEPEND(doc, 1)], - [], - [DX_ENV_APPEND(GENERATE_XML, YES)], - [DX_ENV_APPEND(GENERATE_XML, NO)]) - -# (Compressed) HTML help generation: -DX_ARG_ABLE(chm, [generate doxygen compressed HTML help documentation], - [DX_CHECK_DEPEND(doc, 1)], - [DX_CLEAR_DEPEND(doc, 1)], - [DX_REQUIRE_PROG([DX_HHC], hhc)], - [DX_ENV_APPEND(HHC_PATH, $DX_HHC) - DX_ENV_APPEND(GENERATE_HTML, YES) - DX_ENV_APPEND(GENERATE_HTMLHELP, YES)], - [DX_ENV_APPEND(GENERATE_HTMLHELP, NO)]) - -# Seperate CHI file generation. -DX_ARG_ABLE(chi, [generate doxygen seperate compressed HTML help index file], - [DX_CHECK_DEPEND(chm, 1)], - [DX_CLEAR_DEPEND(chm, 1)], - [], - [DX_ENV_APPEND(GENERATE_CHI, YES)], - [DX_ENV_APPEND(GENERATE_CHI, NO)]) - -# Plain HTML pages generation: -DX_ARG_ABLE(html, [generate doxygen plain HTML documentation], - [DX_CHECK_DEPEND(doc, 1) DX_CHECK_DEPEND(chm, 0)], - [DX_CLEAR_DEPEND(doc, 1) DX_CLEAR_DEPEND(chm, 0)], - [], - [DX_ENV_APPEND(GENERATE_HTML, YES)], - [DX_TEST_FEATURE(chm) || DX_ENV_APPEND(GENERATE_HTML, NO)]) - -# PostScript file generation: -DX_ARG_ABLE(ps, [generate doxygen PostScript documentation], - [DX_CHECK_DEPEND(doc, 1)], - [DX_CLEAR_DEPEND(doc, 1)], - [DX_REQUIRE_PROG([DX_LATEX], latex) - DX_REQUIRE_PROG([DX_MAKEINDEX], makeindex) - DX_REQUIRE_PROG([DX_DVIPS], dvips) - DX_REQUIRE_PROG([DX_EGREP], egrep)]) - -# PDF file generation: -DX_ARG_ABLE(pdf, [generate doxygen PDF documentation], - [DX_CHECK_DEPEND(doc, 1)], - [DX_CLEAR_DEPEND(doc, 1)], - [DX_REQUIRE_PROG([DX_PDFLATEX], pdflatex) - DX_REQUIRE_PROG([DX_MAKEINDEX], makeindex) - DX_REQUIRE_PROG([DX_EGREP], egrep)]) - -# LaTeX generation for PS and/or PDF: -if DX_TEST_FEATURE(ps) || DX_TEST_FEATURE(pdf); then - AM_CONDITIONAL(DX_COND_latex, :) - DX_ENV_APPEND(GENERATE_LATEX, YES) -else - AM_CONDITIONAL(DX_COND_latex, false) - DX_ENV_APPEND(GENERATE_LATEX, NO) -fi - -# Paper size for PS and/or PDF: -AC_ARG_VAR(DOXYGEN_PAPER_SIZE, - [a4wide (default), a4, letter, legal or executive]) -case "$DOXYGEN_PAPER_SIZE" in -#( -"") - AC_SUBST(DOXYGEN_PAPER_SIZE, "") -;; #( -a4wide|a4|letter|legal|executive) - DX_ENV_APPEND(PAPER_SIZE, $DOXYGEN_PAPER_SIZE) -;; #( -*) - AC_MSG_ERROR([unknown DOXYGEN_PAPER_SIZE='$DOXYGEN_PAPER_SIZE']) -;; -esac - -#For debugging: -#echo DX_FLAG_doc=$DX_FLAG_doc -#echo DX_FLAG_dot=$DX_FLAG_dot -#echo DX_FLAG_man=$DX_FLAG_man -#echo DX_FLAG_html=$DX_FLAG_html -#echo DX_FLAG_chm=$DX_FLAG_chm -#echo DX_FLAG_chi=$DX_FLAG_chi -#echo DX_FLAG_rtf=$DX_FLAG_rtf -#echo DX_FLAG_xml=$DX_FLAG_xml -#echo DX_FLAG_pdf=$DX_FLAG_pdf -#echo DX_FLAG_ps=$DX_FLAG_ps -#echo DX_ENV=$DX_ENV -]) diff --git a/pkg/registry/zookeeper-3.4.6/recipes/queue/src/c/aminclude.am b/pkg/registry/zookeeper-3.4.6/recipes/queue/src/c/aminclude.am deleted file mode 100644 index 420049eca..000000000 --- a/pkg/registry/zookeeper-3.4.6/recipes/queue/src/c/aminclude.am +++ /dev/null @@ -1,186 +0,0 @@ -# Copyright (C) 2004 Oren Ben-Kiki -# This file is distributed under the same terms as the Automake macro files. - -# Generate automatic documentation using Doxygen. Goals and variables values -# are controlled by the various DX_COND_??? conditionals set by autoconf. -# -# The provided goals are: -# doxygen-doc: Generate all doxygen documentation. -# doxygen-run: Run doxygen, which will generate some of the documentation -# (HTML, CHM, CHI, MAN, RTF, XML) but will not do the post -# processing required for the rest of it (PS, PDF, and some MAN). -# doxygen-man: Rename some doxygen generated man pages. -# doxygen-ps: Generate doxygen PostScript documentation. -# doxygen-pdf: Generate doxygen PDF documentation. -# -# Note that by default these are not integrated into the automake goals. If -# doxygen is used to generate man pages, you can achieve this integration by -# setting man3_MANS to the list of man pages generated and then adding the -# dependency: -# -# $(man3_MANS): doxygen-doc -# -# This will cause make to run doxygen and generate all the documentation. -# -# The following variable is intended for use in Makefile.am: -# -# DX_CLEANFILES = everything to clean. -# -# This is usually added to MOSTLYCLEANFILES. - -## --------------------------------- ## -## Format-independent Doxygen rules. ## -## --------------------------------- ## - -if DX_COND_doc - -## ------------------------------- ## -## Rules specific for HTML output. ## -## ------------------------------- ## - -if DX_COND_html - -DX_CLEAN_HTML = @DX_DOCDIR@/html - -endif DX_COND_html - -## ------------------------------ ## -## Rules specific for CHM output. ## -## ------------------------------ ## - -if DX_COND_chm - -DX_CLEAN_CHM = @DX_DOCDIR@/chm - -if DX_COND_chi - -DX_CLEAN_CHI = @DX_DOCDIR@/@PACKAGE@.chi - -endif DX_COND_chi - -endif DX_COND_chm - -## ------------------------------ ## -## Rules specific for MAN output. ## -## ------------------------------ ## - -if DX_COND_man - -DX_CLEAN_MAN = @DX_DOCDIR@/man - -endif DX_COND_man - -## ------------------------------ ## -## Rules specific for RTF output. ## -## ------------------------------ ## - -if DX_COND_rtf - -DX_CLEAN_RTF = @DX_DOCDIR@/rtf - -endif DX_COND_rtf - -## ------------------------------ ## -## Rules specific for XML output. ## -## ------------------------------ ## - -if DX_COND_xml - -DX_CLEAN_XML = @DX_DOCDIR@/xml - -endif DX_COND_xml - -## ----------------------------- ## -## Rules specific for PS output. ## -## ----------------------------- ## - -if DX_COND_ps - -DX_CLEAN_PS = @DX_DOCDIR@/@PACKAGE@.ps - -DX_PS_GOAL = doxygen-ps - -doxygen-ps: @DX_DOCDIR@/@PACKAGE@.ps - -@DX_DOCDIR@/@PACKAGE@.ps: @DX_DOCDIR@/@PACKAGE@.tag - cd @DX_DOCDIR@/latex; \ - rm -f *.aux *.toc *.idx *.ind *.ilg *.log *.out; \ - $(DX_LATEX) refman.tex; \ - $(MAKEINDEX_PATH) refman.idx; \ - $(DX_LATEX) refman.tex; \ - countdown=5; \ - while $(DX_EGREP) 'Rerun (LaTeX|to get cross-references right)' \ - refman.log > /dev/null 2>&1 \ - && test $$countdown -gt 0; do \ - $(DX_LATEX) refman.tex; \ - countdown=`expr $$countdown - 1`; \ - done; \ - $(DX_DVIPS) -o ../@PACKAGE@.ps refman.dvi - -endif DX_COND_ps - -## ------------------------------ ## -## Rules specific for PDF output. ## -## ------------------------------ ## - -if DX_COND_pdf - -DX_CLEAN_PDF = @DX_DOCDIR@/@PACKAGE@.pdf - -DX_PDF_GOAL = doxygen-pdf - -doxygen-pdf: @DX_DOCDIR@/@PACKAGE@.pdf - -@DX_DOCDIR@/@PACKAGE@.pdf: @DX_DOCDIR@/@PACKAGE@.tag - cd @DX_DOCDIR@/latex; \ - rm -f *.aux *.toc *.idx *.ind *.ilg *.log *.out; \ - $(DX_PDFLATEX) refman.tex; \ - $(DX_MAKEINDEX) refman.idx; \ - $(DX_PDFLATEX) refman.tex; \ - countdown=5; \ - while $(DX_EGREP) 'Rerun (LaTeX|to get cross-references right)' \ - refman.log > /dev/null 2>&1 \ - && test $$countdown -gt 0; do \ - $(DX_PDFLATEX) refman.tex; \ - countdown=`expr $$countdown - 1`; \ - done; \ - mv refman.pdf ../@PACKAGE@.pdf - -endif DX_COND_pdf - -## ------------------------------------------------- ## -## Rules specific for LaTeX (shared for PS and PDF). ## -## ------------------------------------------------- ## - -if DX_COND_latex - -DX_CLEAN_LATEX = @DX_DOCDIR@/latex - -endif DX_COND_latex - -.PHONY: doxygen-run doxygen-doc $(DX_PS_GOAL) $(DX_PDF_GOAL) - -.INTERMEDIATE: doxygen-run $(DX_PS_GOAL) $(DX_PDF_GOAL) - -doxygen-run: @DX_DOCDIR@/@PACKAGE@.tag - -doxygen-doc: doxygen-run $(DX_PS_GOAL) $(DX_PDF_GOAL) - -@DX_DOCDIR@/@PACKAGE@.tag: $(DX_CONFIG) $(pkginclude_HEADERS) - rm -rf @DX_DOCDIR@ - $(DX_ENV) $(DX_DOXYGEN) $(srcdir)/$(DX_CONFIG) - -DX_CLEANFILES = \ - @DX_DOCDIR@/@PACKAGE@.tag \ - -r \ - $(DX_CLEAN_HTML) \ - $(DX_CLEAN_CHM) \ - $(DX_CLEAN_CHI) \ - $(DX_CLEAN_MAN) \ - $(DX_CLEAN_RTF) \ - $(DX_CLEAN_XML) \ - $(DX_CLEAN_PS) \ - $(DX_CLEAN_PDF) \ - $(DX_CLEAN_LATEX) - -endif DX_COND_doc diff --git a/pkg/registry/zookeeper-3.4.6/recipes/queue/src/c/c-doc.Doxyfile b/pkg/registry/zookeeper-3.4.6/recipes/queue/src/c/c-doc.Doxyfile deleted file mode 100644 index 32e09a1c8..000000000 --- a/pkg/registry/zookeeper-3.4.6/recipes/queue/src/c/c-doc.Doxyfile +++ /dev/null @@ -1,1252 +0,0 @@ -# Doxyfile 1.4.7 - -# 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 (" ") - -#--------------------------------------------------------------------------- -# Project related 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 = $(PROJECT)-$(VERSION) - -# 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 = $(DOCDIR) - -# If the CREATE_SUBDIRS tag is set to YES, then doxygen will create -# 4096 sub-directories (in 2 levels) under the output directory of each output -# format and will distribute the generated files over these directories. -# Enabling this option can be useful when feeding doxygen a huge amount of -# source files, where putting all generated files in the same directory would -# otherwise cause performance problems for the file system. - -CREATE_SUBDIRS = NO - -# 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, Korean-en, Norwegian, -# Polish, Portuguese, Romanian, Russian, Serbian, Slovak, Slovene, Spanish, -# Swedish, and Ukrainian. - -OUTPUT_LANGUAGE = English - -# This tag can be used to specify the encoding used in the generated output. -# The encoding is not always determined by the language that is chosen, -# but also whether or not the output is meant for Windows or non-Windows users. -# In case there is a difference, setting the USE_WINDOWS_ENCODING tag to YES -# forces the Windows encoding (this is the default for the Windows binary), -# whereas setting the tag to NO uses a Unix-style encoding (the default for -# all platforms other than Windows). - -USE_WINDOWS_ENCODING = 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 - -# This tag implements a quasi-intelligent brief description abbreviator -# that is used to form the text in various listings. Each string -# in this list, if found as the leading text of the brief description, will be -# stripped from the text and the result after processing the whole list, is -# used as the annotated text. Otherwise, the brief description is used as-is. -# If left blank, the following values are used ("$name" is automatically -# replaced with the name of the entity): "The $name class" "The $name widget" -# "The $name file" "is" "provides" "specifies" "contains" -# "represents" "a" "an" "the" - -ABBREVIATE_BRIEF = - -# 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 = YES - -# 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. The tag can be used to show relative paths in the file list. -# If left blank the directory from which doxygen is run is used as the -# path to strip. - -STRIP_FROM_PATH = - -# The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of -# the path mentioned in the documentation of a class, which tells -# the reader which header file to include in order to use a class. -# If left blank only the name of the header file containing the class -# definition is used. Otherwise one should specify the include paths that -# are normally passed to the compiler using the -I flag. - -STRIP_FROM_INC_PATH = - -# 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 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 -# explicit @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 -# re-implements. - -INHERIT_DOCS = YES - -# If the SEPARATE_MEMBER_PAGES tag is set to YES, then doxygen will produce -# a new page for each member. If set to NO, the documentation of a member will -# be part of the file/class/namespace that contains it. - -SEPARATE_MEMBER_PAGES = 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 - -# 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 = - -# 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 - -# If you use STL classes (i.e. std::string, std::vector, etc.) but do not want to -# include (a tag file for) the STL sources as input, then you should -# set this tag to YES in order to let doxygen match functions declarations and -# definitions whose arguments contain STL classes (e.g. func(std::string); v.s. -# func(std::string) {}). This also make the inheritance and collaboration -# diagrams that involve STL classes more complete and accurate. - -BUILTIN_STL_SUPPORT = NO - -# 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 - -# Set the SUBGROUPING tag to YES (the default) to allow class member groups of -# the same type (for instance a group of public functions) to be put as a -# subgroup of that type (e.g. under the Public Functions section). Set it to -# NO to prevent subgrouping. Alternatively, this can be done per class using -# the \nosubgrouping command. - -SUBGROUPING = YES - -#--------------------------------------------------------------------------- -# Build related configuration options -#--------------------------------------------------------------------------- - -# 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 = NO - -# 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 = YES - -# 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 = YES - -# This flag is only useful for Objective-C code. When set to YES local -# methods, which are defined in the implementation section but not in -# the interface are included in the documentation. -# If set to NO (the default) only methods in the interface are included. - -EXTRACT_LOCAL_METHODS = 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 classes 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 HIDE_IN_BODY_DOCS tag is set to YES, Doxygen will hide any -# documentation blocks found inside the body of a function. -# If set to NO (the default) these blocks will be appended to the -# function's detailed documentation block. - -HIDE_IN_BODY_DOCS = NO - -# 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 - -# 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 -# and Mac users are advised to set this option to NO. - -CASE_SENSE_NAMES = YES - -# 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 SHOW_INCLUDE_FILES tag is set to YES (the default) then Doxygen -# will put a list of the files that are included by a file in the documentation -# of that file. - -SHOW_INCLUDE_FILES = NO - -# 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 the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the -# brief documentation of file, namespace and class members alphabetically -# by member name. If set to NO (the default) the members will appear in -# declaration order. - -SORT_BRIEF_DOCS = NO - -# If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be -# sorted by fully-qualified names, including namespaces. If set to -# NO (the default), the class list will be sorted only by class name, -# not including the namespace part. -# Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES. -# Note: This option applies only to the class list, not to the -# alphabetical list. - -SORT_BY_SCOPE_NAME = NO - -# 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 - -# 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 consists 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 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 = YES - -# If the sources in your project are distributed over multiple directories -# then setting the SHOW_DIRECTORIES tag to YES will show the directory hierarchy -# in the documentation. The default is NO. - -SHOW_DIRECTORIES = NO - -# The FILE_VERSION_FILTER tag can be used to specify a program or script that -# doxygen should invoke to get the current version for each file (typically from the -# version control system). Doxygen will invoke the program by executing (via -# popen()) the command , where is the value of -# the FILE_VERSION_FILTER tag, and is the name of an input file -# provided by doxygen. Whatever the program writes to standard output -# is used as the file version. See the manual for examples. - -FILE_VERSION_FILTER = - -#--------------------------------------------------------------------------- -# 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 - -# If WARN_IF_DOC_ERROR is set to YES, doxygen will generate warnings for -# potential errors in the documentation, such as not documenting some -# parameters in a documented function, or documenting parameters that -# don't exist or using markup commands wrongly. - -WARN_IF_DOC_ERROR = YES - -# This WARN_NO_PARAMDOC option can be abled to get warnings for -# functions that are documented, but have no documentation for their parameters -# or return value. If set to NO (the default) doxygen will only warn about -# wrong or incomplete parameter documentation, but not about the absence of -# documentation. - -WARN_NO_PARAMDOC = NO - -# 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. Optionally the format may contain -# $version, which will be replaced by the version of the file (if it could -# be obtained via FILE_VERSION_FILTER) - -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 = include/zoo_queue.h - -# 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 *.cs *.php *.php3 *.inc *.m *.mm *.py - -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. Note that the wildcards are matched -# against the file with absolute path, so to exclude all test directories -# for example use the pattern */test/* - -EXCLUDE_PATTERNS = - -# The EXAMPLE_PATH tag can be used to specify one or more files or -# directories that contain example code fragments that are included (see -# the \include command). - -EXAMPLE_PATH = - -# If the value of the EXAMPLE_PATH tag contains directories, you can use the -# EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp -# and *.h) to filter out the source-files in the directories. If left -# blank all files are included. - -EXAMPLE_PATTERNS = - -# If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be -# searched for input files to be used with the \include or \dontinclude -# commands irrespective of the value of the RECURSIVE tag. -# Possible values are YES and NO. If left blank NO is used. - -EXAMPLE_RECURSIVE = NO - -# The IMAGE_PATH tag can be used to specify one or more files or -# directories that contain image that are included in the documentation (see -# the \image command). - -IMAGE_PATH = - -# The INPUT_FILTER tag can be used to specify a program that doxygen should -# invoke to filter for each input file. Doxygen will invoke the filter program -# by executing (via popen()) the command , where -# is the value of the INPUT_FILTER tag, and is the name of an -# input file. Doxygen will then use the output that the filter program writes -# to standard output. If FILTER_PATTERNS is specified, this tag will be -# ignored. - -INPUT_FILTER = - -# The FILTER_PATTERNS tag can be used to specify filters on a per file pattern -# basis. Doxygen will compare the file name with each pattern and apply the -# filter if there is a match. The filters are a list of the form: -# pattern=filter (like *.cpp=my_cpp_filter). See INPUT_FILTER for further -# info on how filters are used. If FILTER_PATTERNS is empty, INPUT_FILTER -# is applied to all files. - -FILTER_PATTERNS = - -# 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. -# Note: To get rid of all source code in the generated output, make sure also -# VERBATIM_HEADERS is set to NO. - -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 - -# 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 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 = YES - -# 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 = YES - -# If the REFERENCES_LINK_SOURCE tag is set to YES (the default) -# and SOURCE_BROWSER tag is set to YES, then the hyperlinks from -# functions in REFERENCES_RELATION and REFERENCED_BY_RELATION lists will -# link to the source code. Otherwise they will link to the documentstion. - -REFERENCES_LINK_SOURCE = YES - -# If the USE_HTAGS tag is set to YES then the references to source code -# will point to the HTML generated by the htags(1) tool instead of doxygen -# built-in source browser. The htags tool is part of GNU's global source -# tagging system (see http://www.gnu.org/software/global/global.html). You -# will need version 4.8.6 or higher. - -USE_HTAGS = 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 - -#--------------------------------------------------------------------------- -# 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 = NO - -# 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 = $(GENERATE_HTML) - -# 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 = html - -# 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. Note that doxygen will try to copy -# the style sheet file to the HTML output directory, so don't put your own -# stylesheet in the HTML output directory as well, or it will be erased! - -HTML_STYLESHEET = - -# 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 = $(GENERATE_HTMLHELP) - -# 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 directory. - -CHM_FILE = ../$(PROJECT).chm - -# 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 = $(HHC_PATH) - -# 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 = $(GENERATE_CHI) - -# 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 = NO - -# 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, DHTML, CSS and frames is required (for instance Mozilla 1.0+, -# Netscape 6.0+, Internet explorer 5.0+, or Konqueror). 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 = $(GENERATE_LATEX) - -# 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 = $(PAPER_SIZE) - -# 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 = $(GENERATE_PDF) - -# 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 - -# If LATEX_HIDE_INDICES is set to YES then doxygen will not -# include the index chapters (such as File Index, Compound Index, etc.) -# in the output. - -LATEX_HIDE_INDICES = 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 optimized for Word 97 and may not look very pretty with -# other RTF readers or editors. - -GENERATE_RTF = $(GENERATE_RTF) - -# 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 assignments. 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 = $(GENERATE_MAN) - -# 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. - -GENERATE_XML = $(GENERATE_XML) - -# The XML_OUTPUT tag is used to specify where the XML 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 `xml' will be used as the default path. - -XML_OUTPUT = xml - -# 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 = - -# If the XML_PROGRAMLISTING tag is set to YES Doxygen will -# dump the program listings (including syntax highlighting -# and cross-referencing information) to the XML output. Note that -# enabling this will significantly increase the size of the XML output. - -XML_PROGRAMLISTING = YES - -#--------------------------------------------------------------------------- -# 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 Perl module output -#--------------------------------------------------------------------------- - -# If the GENERATE_PERLMOD tag is set to YES Doxygen will -# generate a Perl module file that captures the structure of -# the code including all documentation. Note that this -# feature is still experimental and incomplete at the -# moment. - -GENERATE_PERLMOD = NO - -# If the PERLMOD_LATEX tag is set to YES Doxygen will generate -# the necessary Makefile rules, Perl scripts and LaTeX code to be able -# to generate PDF and DVI output from the Perl module output. - -PERLMOD_LATEX = NO - -# If the PERLMOD_PRETTY tag is set to YES the Perl module output will be -# nicely formatted so it can be parsed by a human reader. This is useful -# if you want to understand what is going on. On the other hand, if this -# tag is set to NO the size of the Perl module output will be much smaller -# and Perl will parse it just the same. - -PERLMOD_PRETTY = YES - -# The names of the make variables in the generated doxyrules.make file -# are prefixed with the string contained in PERLMOD_MAKEVAR_PREFIX. -# This is useful so different doxyrules.make files included by the same -# Makefile don't overwrite each other's variables. - -PERLMOD_MAKEVAR_PREFIX = - -#--------------------------------------------------------------------------- -# 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 = YES - -# 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_DEFINED 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. To prevent a macro definition from being -# undefined via #undef or recursively expanded use the := operator -# instead of the = operator. - -PREDEFINED = - -# If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF 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::additions related to external references -#--------------------------------------------------------------------------- - -# The TAGFILES option can be used to specify one or more tagfiles. -# Optionally an initial location of the external documentation -# can be added for each tagfile. The format of a tag file without -# this location is as follows: -# TAGFILES = file1 file2 ... -# Adding location for the tag files is done as follows: -# TAGFILES = file1=loc1 "file2 = loc2" ... -# where "loc1" and "loc2" can be relative or absolute paths or -# URLs. If a location is present for each tag, the installdox tool -# does not have to be run to correct the links. -# Note that each tag file must have a unique name -# (where the name does NOT include the path) -# If a tag file is not located in the directory in which doxygen -# is run, you must also specify the path to the tagfile here. - -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 = $(DOCDIR)/$(PROJECT).tag - -# 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 superseded by the HAVE_DOT option below. This is only a -# fallback. It is recommended to install and use dot, since it yields 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 = $(HAVE_DOT) - -# 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 the GROUP_GRAPHS and HAVE_DOT tags are set to YES then doxygen -# will generate a graph for groups, showing the direct groups dependencies - -GROUP_GRAPHS = YES - -# If the UML_LOOK tag is set to YES doxygen will generate inheritance and -# collaboration diagrams in a style similar to the OMG's Unified Modeling -# Language. - -UML_LOOK = NO - -# If set to YES, the inheritance and collaboration graphs will show the -# relations between templates and their instances. - -TEMPLATE_RELATIONS = NO - -# 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 CALL_GRAPH and HAVE_DOT tags are set to YES then doxygen will -# generate a call dependency graph for every global function or class method. -# Note that enabling this option will significantly increase the time of a run. -# So in most cases it will be better to enable call graphs for selected -# functions only using the \callgraph command. - -CALL_GRAPH = NO - -# If the CALLER_GRAPH and HAVE_DOT tags are set to YES then doxygen will -# generate a caller dependency graph for every global function or class method. -# Note that enabling this option will significantly increase the time of a run. -# So in most cases it will be better to enable caller graphs for selected -# functions only using the \callergraph command. - -CALLER_GRAPH = NO - -# 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 - -# If the DIRECTORY_GRAPH, SHOW_DIRECTORIES and HAVE_DOT tags are set to YES -# then doxygen will show the dependencies a directory has on other directories -# in a graphical way. The dependency relations are determined by the #include -# relations between the files in the directories. - -DIRECTORY_GRAPH = 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 in the path. - -DOT_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 - -# The MAX_DOT_GRAPH_DEPTH tag can be used to set the maximum depth of the -# graphs generated by dot. A depth value of 3 means that only nodes reachable -# from the root by following a path via at most 3 edges will be shown. Nodes -# that lay further from the root node will be omitted. Note that setting this -# option to 1 or 2 may greatly reduce the computation time needed for large -# code bases. Also note that a graph may be further truncated if the graph's -# image dimensions are not sufficient to fit the graph (see MAX_DOT_GRAPH_WIDTH -# and MAX_DOT_GRAPH_HEIGHT). If 0 is used for the depth value (the default), -# the graph is not depth-constrained. - -MAX_DOT_GRAPH_DEPTH = 0 - -# Set the DOT_TRANSPARENT tag to YES to generate images with a transparent -# background. This is disabled by default, which results in a white background. -# Warning: Depending on the platform used, enabling this option may lead to -# badly anti-aliased labels on the edges of a graph (i.e. they become hard to -# read). - -DOT_TRANSPARENT = NO - -# Set the DOT_MULTI_TARGETS tag to YES allow dot to generate multiple output -# files in one run (i.e. multiple -o and -T options on the command line). This -# makes dot run faster, but since only newer versions of dot (>1.8.10) -# support this, this feature is disabled by default. - -DOT_MULTI_TARGETS = NO - -# 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 intermediate dot files that are used to generate -# the various graphs. - -DOT_CLEANUP = YES - -#--------------------------------------------------------------------------- -# Configuration::additions 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 diff --git a/pkg/registry/zookeeper-3.4.6/recipes/queue/src/c/configure.ac b/pkg/registry/zookeeper-3.4.6/recipes/queue/src/c/configure.ac deleted file mode 100644 index a9fb7b130..000000000 --- a/pkg/registry/zookeeper-3.4.6/recipes/queue/src/c/configure.ac +++ /dev/null @@ -1,82 +0,0 @@ -# Licensed to the Apache Software Foundation (ASF) under one -# or more contributor license agreements. See the NOTICE file -# distributed with this work for additional information -# regarding copyright ownership. The ASF licenses this file -# to you 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. -# -*- Autoconf -*- -# Process this file with autoconf to produce a configure script. - -AC_PREREQ(2.59) - -AC_INIT([zooqueue], [3.2.0]) - -AC_CONFIG_SRCDIR([include/zoo_queue.h]) - -PACKAGE=zooqueue -VERSION=1.0 - -AC_SUBST(PACKAGE) -AC_SUBST(VERSION) - -BUILD_PATH="`pwd`" - -# Checks for programs. -AC_LANG_CPLUSPLUS - -AM_INIT_AUTOMAKE([-Wall foreign]) -# Checks for libraries. - -#initialize Doxygen support -DX_HTML_FEATURE(ON) -DX_CHM_FEATURE(OFF) -DX_CHI_FEATURE(OFF) -DX_MAN_FEATURE(OFF) -DX_RTF_FEATURE(OFF) -DX_XML_FEATURE(OFF) -DX_PDF_FEATURE(OFF) -DX_PS_FEATURE(OFF) -DX_INIT_DOXYGEN([zookeeper-queues],[c-doc.Doxyfile],[docs]) - - -ZOOKEEPER_PATH=${BUILD_PATH}/../../../../../src/c -ZOOKEEPER_LD=-L${BUILD_PATH}/../../../../../src/c\ -lzookeeper_mt - -AC_SUBST(ZOOKEEPER_PATH) -AC_SUBST(ZOOKEEPER_LD) - -# Checks for header files. -AC_HEADER_DIRENT -AC_HEADER_STDC -AC_CHECK_HEADERS([fcntl.h stdlib.h string.h sys/time.h unistd.h]) - -# Checks for typedefs, structures, and compiler characteristics. -AC_HEADER_STDBOOL -AC_C_CONST -AC_TYPE_UID_T -AC_C_INLINE -AC_TYPE_OFF_T -AC_TYPE_SIZE_T -AC_STRUCT_ST_BLOCKS -AC_HEADER_TIME -AC_C_VOLATILE -AC_PROG_CC -AC_PROG_LIBTOOL -#check for cppunit -AM_PATH_CPPUNIT(1.10.2) -# Checks for library functions. -AC_FUNC_UTIME_NULL -AC_CHECK_FUNCS([gettimeofday memset mkdir rmdir strdup strerror strstr strtol strtoul strtoull utime]) - -AC_CONFIG_FILES([Makefile]) -AC_OUTPUT -AC_C_VOLATILE diff --git a/pkg/registry/zookeeper-3.4.6/recipes/queue/src/c/include/zoo_queue.h b/pkg/registry/zookeeper-3.4.6/recipes/queue/src/c/include/zoo_queue.h deleted file mode 100644 index ccc4602f6..000000000 --- a/pkg/registry/zookeeper-3.4.6/recipes/queue/src/c/include/zoo_queue.h +++ /dev/null @@ -1,118 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you 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. - */ - -#ifndef ZOOKEEPER_QUEUE_H_ -#define ZOOKEEPER_QUEUE_H_ - -#include -#include - -#ifdef __cplusplus -extern "C" { -#endif - - -/** - * \file zoo_queue.h - * \brief zookeeper recipe for queues. - */ - - -struct zkr_queue { - zhandle_t *zh; - char *path; - struct ACL_vector *acl; - pthread_mutex_t pmutex; - char *node_name; - int node_name_length; - char *cached_create_path; -}; - -typedef struct zkr_queue zkr_queue_t; - - -/** - * \brief initializes a zookeeper queue - * - * this method instantiates a zookeeper queue - * \param queue the zookeeper queue to initialize - * \param zh the zookeeper handle to use - * \param path the path in zookeeper to use for the queue - * \param acl the acl to use in zookeeper. - * \return return 0 if successful. - */ -ZOOAPI int zkr_queue_init(zkr_queue_t *queue, zhandle_t* zh, char* path, struct ACL_vector *acl); - -/** - * \brief adds an element to a zookeeper queue - * - * this method adds an element to the back of a zookeeper queue. - * \param queue the zookeeper queue to add the element to - * \param data a pointer to a data buffer - * \param buffer_len the length of the buffer - * \return returns 0 (ZOK) if successful, otherwise returns a zookeeper error code. - */ -ZOOAPI int zkr_queue_offer(zkr_queue_t *queue, const char *data, int buffer_len); - -/** - * \brief returns the head of a zookeeper queue - * - * this method returns the head of a zookeeper queue without removing it. - * \param queue the zookeeper queue to add the element to - * \param buffer a pointer to a data buffer - * \param buffer_len a pointer to the length of the buffer - * \return returns 0 (ZOK) and sets *buffer_len to the length of data written if successful (-1 if the queue is empty). Otherwise it will set *buffer_len to -1 and return a zookeeper error code. - */ -ZOOAPI int zkr_queue_element(zkr_queue_t *queue, char *buffer, int *buffer_len); - -/** - * \brief returns the head of a zookeeper queue - * - * this method returns the head of a zookeeper queue without removing it. - * \param queue the zookeeper queue to get the head of - * \param buffer a pointer to a data buffer - * \param buffer_len a pointer to the length of the buffer - * \return returns 0 (ZOK) and sets *buffer_len to the length of data written if successful (-1 if the queue is empty). Otherwise it will set *buffer_len to -1 and return a zookeeper error code. - */ -ZOOAPI int zkr_queue_remove(zkr_queue_t *queue, char *buffer, int *buffer_len); - -/** - * \brief removes and returns the head of a zookeeper queue, blocks if necessary - * - * this method returns the head of a zookeeper queue without removing it. - * \param queue the zookeeper queue to remove and return the head of - * \param buffer a pointer to a data buffer - * \param buffer_len a pointer to the length of the buffer - * \return returns 0 (ZOK) and sets *buffer_len to the length of data written if successful. Otherwise it will set *buffer_len to -1 and return a zookeeper error code. - */ -ZOOAPI int zkr_queue_take(zkr_queue_t *queue, char *buffer, int *buffer_len); - -/** - * \brief destroys a zookeeper queue structure - * - * this destroys a zookeeper queue structure, this is only a local operation and will not affect - * the state of the queue on the zookeeper server. - * \param queue the zookeeper queue to destroy - */ -void zkr_queue_destroy(zkr_queue_t *queue); - - -#ifdef __cplusplus -} -#endif -#endif //ZOOKEEPER_QUEUE_H_ diff --git a/pkg/registry/zookeeper-3.4.6/recipes/queue/src/c/src/zoo_queue.c b/pkg/registry/zookeeper-3.4.6/recipes/queue/src/c/src/zoo_queue.c deleted file mode 100644 index 89ec24b6e..000000000 --- a/pkg/registry/zookeeper-3.4.6/recipes/queue/src/c/src/zoo_queue.c +++ /dev/null @@ -1,442 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you 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. - */ - -#ifdef DLL_EXPORT -#define USE_STATIC_LIB -#endif - -#if defined(__CYGWIN__) -#define USE_IPV6 -#endif - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#ifdef HAVE_SYS_UTSNAME_H -#include -#endif - -#ifdef HAVE_GETPWUID_R -#include -#endif - -#define IF_DEBUG(x) if (logLevel==ZOO_LOG_LEVEL_DEBUG) {x;} - - -static void free_String_vector(struct String_vector *v) { - if (v->data) { - int32_t i; - for (i=0; icount; i++) { - free(v->data[i]); - } - free(v->data); - v->data = 0; - } -} - - -static int vstrcmp(const void* str1, const void* str2) { - const char **a = (const char**)str1; - const char **b = (const char**) str2; - return strcmp(*a, *b); -} - -static void sort_children(struct String_vector *vector) { - qsort( vector->data, vector->count, sizeof(char*), &vstrcmp); -} - - -static void concat_path_nodename_n(char *buffer, int len, const char *path, const char *node_name){ - snprintf(buffer, len, "%s/%s", path, node_name); -} - -static char *concat_path_nodename(const char *path, const char *node_name){ - int node_path_length = strlen(path) + 1+ strlen(node_name) +1; - char *node_path = (char *) malloc(node_path_length * sizeof(char)); - concat_path_nodename_n(node_path, node_path_length, path, node_name); - return node_path; -} - - -static void zkr_queue_cache_create_path(zkr_queue_t *queue){ - if(queue->cached_create_path != NULL){ - free(queue->cached_create_path); - } - queue->cached_create_path = concat_path_nodename(queue->path, queue->node_name); -} - -ZOOAPI int zkr_queue_init(zkr_queue_t *queue, zhandle_t* zh, char* path, struct ACL_vector *acl){ - queue->zh = zh; - queue->path = path; - queue->node_name = "qn-"; - queue->node_name_length = strlen(queue->node_name); - queue->cached_create_path = NULL; - queue->acl = acl; - pthread_mutex_init(&(queue->pmutex), NULL); - zkr_queue_cache_create_path(queue); - return 0; -} - -static ZOOAPI int create_queue_root(zkr_queue_t *queue){ - return zoo_create(queue->zh, queue->path, NULL, 0, queue->acl, 0, NULL, 0 ); -} - -static int valid_child_name(zkr_queue_t *queue, const char *child_name){ - return strncmp(queue->node_name, child_name, queue->node_name_length); -} - -ZOOAPI int zkr_queue_offer(zkr_queue_t *queue, const char *data, int buffer_len){ - for(;;){ - int rc = zoo_create(queue->zh, queue->cached_create_path, data, buffer_len, queue->acl, ZOO_SEQUENCE, NULL, 0 ); - switch(rc){ - int create_root_rc; - case ZNONODE: - create_root_rc = create_queue_root(queue); - switch(create_root_rc){ - case ZNODEEXISTS: - case ZOK: - break; - default: - return create_root_rc; - } - break; - default: - return rc; - } - } -} - - -ZOOAPI int zkr_queue_element(zkr_queue_t *queue, char *buffer, int *buffer_len){ - int path_length = strlen(queue->path); - for(;;){ - struct String_vector stvector; - struct String_vector *vector = &stvector; - /*Get sorted children*/ - int get_children_rc = zoo_get_children(queue->zh, queue->path, 0, vector); - switch(get_children_rc){ - case ZOK: - break; - case ZNONODE: - *buffer_len = -1; - return ZOK; - default: - return get_children_rc; - } - if(stvector.count == 0){ - *buffer_len = -1; - return ZOK; - } - - sort_children(vector); - /*try all*/ - int i; - for(i=0; i < stvector.count; i++){ - char *child_name = stvector.data[i]; - int child_path_length = path_length + 1 + strlen(child_name) +1; - char child_path[child_path_length]; - concat_path_nodename_n(child_path, child_path_length, queue->path, child_name); - int get_rc = zoo_get(queue->zh, child_path, 0, buffer, buffer_len, NULL); - switch(get_rc){ - case ZOK: - free_String_vector(vector); - return ZOK; - case ZNONODE: - break; - default: - free_String_vector(vector); - return get_rc; - } - } - - free_String_vector(vector); - } -} - -ZOOAPI int zkr_queue_remove(zkr_queue_t *queue, char *buffer, int *buffer_len){ - int path_length = strlen(queue->path); - for(;;){ - struct String_vector stvector; - struct String_vector *vector = &stvector; - /*Get sorted children*/ - int get_children_rc = zoo_get_children(queue->zh, queue->path, 0, &stvector); - switch(get_children_rc){ - case ZOK: - break; - case ZNONODE: - *buffer_len = -1; - return ZOK; - - default: - *buffer_len = -1; - return get_children_rc; - } - if(stvector.count == 0){ - *buffer_len = -1; - return ZOK; - } - - sort_children(vector); - /*try all*/ - int i; - for( i=0; i < stvector.count; i++){ - char *child_name = stvector.data[i]; - int child_path_length = path_length + 1 + strlen(child_name) +1; - char child_path[child_path_length]; - concat_path_nodename_n(child_path, child_path_length, queue->path, child_name); - int get_rc = zoo_get(queue->zh, child_path, 0, buffer, buffer_len, NULL); - switch(get_rc){ - int delete_rc; - case ZOK: - delete_rc = zoo_delete(queue->zh, child_path, -1); - switch(delete_rc){ - case ZOK: - free_String_vector(vector); - return delete_rc; - case ZNONODE: - break; - default: - free_String_vector(vector); - *buffer_len = -1; - return delete_rc; - } - break; - case ZNONODE: - break; - default: - free_String_vector(vector); - *buffer_len = -1; - return get_rc; - } - } - free_String_vector(vector); - } -} - -/** - * The take_latch structure roughly emulates a Java CountdownLatch with 1 as the initial value. - * It is meant to be used by a setter thread and a waiter thread. - * - * This latch is specialized to be used with the queue, all latches created for the same queue structure will use the same mutex. - * - * The setter thread at some point will call take_latch_setter_trigger_latch() on the thread. - * - * The waiter thread creates the latch and at some point either calls take_latch_waiter_await()s or take_latch_waiter_mark_unneeded()s it. - * The await function will return after the setter thread has triggered the latch. - * The mark unneeded function will return immediately and avoid some unneeded initialization. - * - * Whichever thread is last to call their required function disposes of the latch. - * - * The latch may disposed if no threads will call the waiting, marking, or triggering functions using take_latch_destroy_syncrhonized(). - */ - -struct take_latch { - enum take_state {take_init, take_waiting, take_triggered, take_not_needed} state; - pthread_cond_t latch_condition; - zkr_queue_t *queue; -}; - - -typedef struct take_latch take_latch_t; - - -static void take_latch_init( take_latch_t *latch, zkr_queue_t *queue){ - pthread_mutex_t *mutex = &(queue->pmutex); - pthread_mutex_lock(mutex); - latch->state = take_init; - latch->queue = queue; - pthread_mutex_unlock(mutex); -} - -static take_latch_t *create_take_latch(zkr_queue_t *queue){ - take_latch_t *new_take_latch = (take_latch_t *) malloc(sizeof(take_latch_t)); - take_latch_init(new_take_latch, queue); - return new_take_latch; -} - - -//Only call this when you own the mutex -static void take_latch_destroy_unsafe(take_latch_t *latch){ - if(latch->state == take_waiting){ - pthread_cond_destroy(&(latch->latch_condition)); - } - free(latch); -} - -static void take_latch_destroy_synchronized(take_latch_t *latch){ - pthread_mutex_t *mutex = &(latch->queue->pmutex); - pthread_mutex_lock(mutex); - take_latch_destroy_unsafe(latch); - pthread_mutex_unlock(mutex); -} - -static void take_latch_setter_trigger_latch(take_latch_t *latch){ - pthread_mutex_t *mutex = &(latch->queue->pmutex); - pthread_mutex_lock(mutex); - switch(latch->state){ - case take_init: - latch->state = take_triggered; - break; - case take_not_needed: - take_latch_destroy_unsafe(latch); - break; - case take_triggered: - LOG_DEBUG(("Error! Latch was triggered twice.")); - break; - case take_waiting: - pthread_cond_signal(&(latch->latch_condition)); - break; - } - pthread_mutex_unlock(mutex); -} - -static void take_latch_waiter_await(take_latch_t *latch){ - pthread_mutex_t *mutex = &(latch->queue->pmutex); - pthread_mutex_lock(mutex); - switch(latch->state){ - case take_init: - pthread_cond_init(&(latch->latch_condition),NULL); - latch->state = take_waiting; - pthread_cond_wait(&(latch->latch_condition),mutex); - take_latch_destroy_unsafe(latch); - break; - case take_waiting: - LOG_DEBUG(("Error! Called await twice.")); - break; - case take_not_needed: - LOG_DEBUG(("Error! Waiting after marking not needed.")); - break; - case take_triggered: - take_latch_destroy_unsafe(latch); - break; - } - pthread_mutex_unlock(mutex); -} - -static void take_latch_waiter_mark_unneeded(take_latch_t *latch){ - pthread_mutex_t *mutex = &(latch->queue->pmutex); - pthread_mutex_lock(mutex); - switch(latch->state){ - case take_init: - latch->state = take_not_needed; - break; - case take_waiting: - LOG_DEBUG(("Error! Can't mark unneeded after waiting.")); - break; - case take_not_needed: - LOG_DEBUG(("Marked unneeded twice.")); - break; - case take_triggered: - take_latch_destroy_unsafe(latch); - break; - } - pthread_mutex_unlock(mutex); -} - -static void take_watcher(zhandle_t *zh, int type, int state, const char *path, void *watcherCtx){ - take_latch_t *latch = (take_latch_t *) watcherCtx; - take_latch_setter_trigger_latch(latch); -} - - - -ZOOAPI int zkr_queue_take(zkr_queue_t *queue, char *buffer, int *buffer_len){ - int path_length = strlen(queue->path); -take_attempt: - for(;;){ - struct String_vector stvector; - struct String_vector *vector = &stvector; - /*Get sorted children*/ - take_latch_t *take_latch = create_take_latch(queue); - int get_children_rc = zoo_wget_children(queue->zh, queue->path, take_watcher, take_latch, &stvector); - switch(get_children_rc){ - case ZOK: - break; - int create_queue_rc; - case ZNONODE: - take_latch_destroy_synchronized(take_latch); - create_queue_rc = create_queue_root(queue); - switch(create_queue_rc){ - case ZNODEEXISTS: - case ZOK: - goto take_attempt; - default: - *buffer_len = -1; - return create_queue_rc; - } - default: - take_latch_destroy_synchronized(take_latch); - *buffer_len = -1; - return get_children_rc; - } - if(stvector.count == 0){ - take_latch_waiter_await(take_latch); - }else{ - take_latch_waiter_mark_unneeded(take_latch); - } - - sort_children(vector); - /*try all*/ - int i; - for( i=0; i < stvector.count; i++){ - char *child_name = stvector.data[i]; - int child_path_length = path_length + 1 + strlen(child_name) +1; - char child_path[child_path_length]; - concat_path_nodename_n(child_path, child_path_length, queue->path, child_name); - int get_rc = zoo_get(queue->zh, child_path, 0, buffer, buffer_len, NULL); - switch(get_rc){ - int delete_rc; - case ZOK: - delete_rc = zoo_delete(queue->zh, child_path, -1); - switch(delete_rc){ - case ZOK: - free_String_vector(vector); - return delete_rc; - case ZNONODE: - break; - default: - free_String_vector(vector); - *buffer_len = -1; - return delete_rc; - } - break; - case ZNONODE: - break; - default: - free_String_vector(vector); - *buffer_len = -1; - return get_rc; - } - } - free_String_vector(vector); - } -} - -ZOOAPI void zkr_queue_destroy(zkr_queue_t *queue){ - pthread_mutex_destroy(&(queue->pmutex)); - if(queue->cached_create_path != NULL){ - free(queue->cached_create_path); - } -} diff --git a/pkg/registry/zookeeper-3.4.6/recipes/queue/src/c/tests/TestClient.cc b/pkg/registry/zookeeper-3.4.6/recipes/queue/src/c/tests/TestClient.cc deleted file mode 100644 index 5446d9b82..000000000 --- a/pkg/registry/zookeeper-3.4.6/recipes/queue/src/c/tests/TestClient.cc +++ /dev/null @@ -1,452 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you 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. - */ - -#include - -#include -#include -#include -#include -#include - - -using namespace std; - -#include -#include - -#include -#include - -static void yield(zhandle_t *zh, int i) -{ - sleep(i); -} - -typedef struct evt { - string path; - int type; -} evt_t; - -typedef struct watchCtx { -private: - list events; -public: - bool connected; - zhandle_t *zh; - - watchCtx() { - connected = false; - zh = 0; - } - ~watchCtx() { - if (zh) { - zookeeper_close(zh); - zh = 0; - } - } - - evt_t getEvent() { - evt_t evt; - evt = events.front(); - events.pop_front(); - return evt; - } - - int countEvents() { - int count; - count = events.size(); - return count; - } - - void putEvent(evt_t evt) { - events.push_back(evt); - } - - bool waitForConnected(zhandle_t *zh) { - time_t expires = time(0) + 10; - while(!connected && time(0) < expires) { - yield(zh, 1); - } - return connected; - } - bool waitForDisconnected(zhandle_t *zh) { - time_t expires = time(0) + 15; - while(connected && time(0) < expires) { - yield(zh, 1); - } - return !connected; - } -} watchctx_t; - -extern "C" { - - const char *thread_test_string="Hello World!"; - - void *offer_thread_shared_queue(void *queue_handle){ - zkr_queue_t *queue = (zkr_queue_t *) queue_handle; - - int test_string_buffer_length = strlen(thread_test_string) + 1; - int offer_rc = zkr_queue_offer(queue, thread_test_string, test_string_buffer_length); - pthread_exit(NULL); - } - - void *take_thread_shared_queue(void *queue_handle){ - zkr_queue_t *queue = (zkr_queue_t *) queue_handle; - - int test_string_buffer_length = strlen(thread_test_string) + 1; - int receive_buffer_capacity = test_string_buffer_length; - int receive_buffer_length = receive_buffer_capacity; - char *receive_buffer = (char *) malloc(sizeof(char) * receive_buffer_capacity); - - int remove_rc = zkr_queue_take(queue, receive_buffer, &receive_buffer_length); - switch(remove_rc){ - case ZOK: - pthread_exit(receive_buffer); - default: - free(receive_buffer); - pthread_exit(NULL); - } - } - - int valid_test_string(void *result){ - char *result_string = (char *) result; - return !strncmp(result_string, thread_test_string, strlen(thread_test_string)); - } -} - -class Zookeeper_queuetest : public CPPUNIT_NS::TestFixture -{ - CPPUNIT_TEST_SUITE(Zookeeper_queuetest); - CPPUNIT_TEST(testInitDestroy); - CPPUNIT_TEST(testOffer1); - CPPUNIT_TEST(testOfferRemove1); - CPPUNIT_TEST(testOfferRemove2); - CPPUNIT_TEST(testOfferRemove3); - CPPUNIT_TEST(testOfferRemove4); - CPPUNIT_TEST(testOfferRemove5); - CPPUNIT_TEST(testOfferRemove6); - CPPUNIT_TEST(testOfferTake1); - CPPUNIT_TEST(testOfferTake2); - CPPUNIT_TEST(testOfferTake3); - CPPUNIT_TEST(testOfferTake4); - CPPUNIT_TEST(testOfferTake5); - CPPUNIT_TEST(testOfferTake6); - CPPUNIT_TEST_SUITE_END(); - - static void watcher(zhandle_t *, int type, int state, const char *path,void*v){ - watchctx_t *ctx = (watchctx_t*)v; - - if (state == ZOO_CONNECTED_STATE) { - ctx->connected = true; - } else { - ctx->connected = false; - } - if (type != ZOO_SESSION_EVENT) { - evt_t evt; - evt.path = path; - evt.type = type; - ctx->putEvent(evt); - } - } - - static const char hostPorts[]; - - const char *getHostPorts() { - return hostPorts; - } - - zhandle_t *createClient(watchctx_t *ctx) { - zhandle_t *zk = zookeeper_init(hostPorts, watcher, 10000, 0, - ctx, 0); - ctx->zh = zk; - sleep(1); - return zk; - } - -public: - -#define ZKSERVER_CMD "./tests/zkServer.sh" - - void setUp() - { - char cmd[1024]; - sprintf(cmd, "%s startClean %s", ZKSERVER_CMD, getHostPorts()); - CPPUNIT_ASSERT(system(cmd) == 0); - } - - - void startServer() { - char cmd[1024]; - sprintf(cmd, "%s start %s", ZKSERVER_CMD, getHostPorts()); - CPPUNIT_ASSERT(system(cmd) == 0); - } - - void stopServer() { - tearDown(); - } - - void tearDown() - { - char cmd[1024]; - sprintf(cmd, "%s stop %s", ZKSERVER_CMD, getHostPorts()); - CPPUNIT_ASSERT(system(cmd) == 0); - } - - void initializeQueuesAndHandles(int num_clients, zhandle_t *zoohandles[], - watchctx_t ctxs[], zkr_queue_t queues[], char *path){ - int i; - for(i=0; i< num_clients; i++){ - zoohandles[i] = createClient(&ctxs[i]); - zkr_queue_init(&queues[i], zoohandles[i], path, &ZOO_OPEN_ACL_UNSAFE); - } - } - - void cleanUpQueues(int num_clients, zkr_queue_t queues[]){ - int i; - for(i=0; i < num_clients; i++){ - zkr_queue_destroy(&queues[i]); - } - } - - void testInitDestroy(){ - int num_clients = 1; - watchctx_t ctxs[num_clients]; - zhandle_t *zoohandles[num_clients]; - zkr_queue_t queues[num_clients]; - char *path= (char *)"/testInitDestroy"; - - int i; - for(i=0; i< num_clients; i++){ - zoohandles[i] = createClient(&ctxs[i]); - zkr_queue_init(&queues[i], zoohandles[i], path, &ZOO_OPEN_ACL_UNSAFE); - } - - for(i=0; i< num_clients; i++){ - zkr_queue_destroy(&queues[i]); - } - - } - - void testOffer1(){ - int num_clients = 1; - watchctx_t ctxs[num_clients]; - zhandle_t *zoohandles[num_clients]; - zkr_queue_t queues[num_clients]; - char *path= (char *)"/testOffer1"; - - initializeQueuesAndHandles(num_clients, zoohandles, ctxs, queues, path); - - const char *test_string="Hello World!"; - int test_string_length = strlen(test_string); - int test_string_buffer_length = test_string_length + 1; - char buffer[test_string_buffer_length]; - - int offer_rc = zkr_queue_offer(&queues[0], test_string, test_string_buffer_length); - CPPUNIT_ASSERT(offer_rc == ZOK); - - int removed_element_buffer_length = test_string_buffer_length; - int remove_rc = zkr_queue_remove(&queues[0], buffer, &removed_element_buffer_length); - CPPUNIT_ASSERT(remove_rc == ZOK); - CPPUNIT_ASSERT(removed_element_buffer_length == test_string_buffer_length); - CPPUNIT_ASSERT(strncmp(test_string,buffer,test_string_length)==0); - - cleanUpQueues(num_clients,queues); - } - - void create_n_remove_m(char *path, int n, int m){ - int num_clients = 2; - watchctx_t ctxs[num_clients]; - zhandle_t *zoohandles[num_clients]; - zkr_queue_t queues[num_clients]; - - initializeQueuesAndHandles(num_clients, zoohandles, ctxs, queues, path); - - int i; - int max_digits = sizeof(int)*3; - const char *test_string = "Hello World!"; - int buffer_length = strlen(test_string) + max_digits + 1; - char correct_buffer[buffer_length]; - char receive_buffer[buffer_length]; - - for(i = 0; i < n; i++){ - snprintf(correct_buffer, buffer_length, "%s%d", test_string,i); - int offer_rc = zkr_queue_offer(&queues[0], correct_buffer, buffer_length); - CPPUNIT_ASSERT(offer_rc == ZOK); - } - printf("Offers\n"); - for(i=0; i=n){ - CPPUNIT_ASSERT(receive_buffer_length == -1); - }else{ - CPPUNIT_ASSERT(strncmp(correct_buffer,receive_buffer, buffer_length)==0); - } - } - - cleanUpQueues(num_clients,queues); - } - - void testOfferRemove1(){ - create_n_remove_m((char *)"/testOfferRemove1", 0,1); - } - - void testOfferRemove2(){ - create_n_remove_m((char *)"/testOfferRemove2", 1,1); - } - - void testOfferRemove3(){ - create_n_remove_m((char *)"/testOfferRemove3", 10,1); - } - - void testOfferRemove4(){ - create_n_remove_m((char *)"/testOfferRemove4", 10,10); - } - - void testOfferRemove5(){ - create_n_remove_m((char *)"/testOfferRemove5", 10,5); - } - - void testOfferRemove6(){ - create_n_remove_m((char *)"/testOfferRemove6", 10,11); - } - - void create_n_take_m(char *path, int n, int m){ - CPPUNIT_ASSERT(m<=n); - int num_clients = 2; - watchctx_t ctxs[num_clients]; - zhandle_t *zoohandles[num_clients]; - zkr_queue_t queues[num_clients]; - - initializeQueuesAndHandles(num_clients, zoohandles, ctxs, queues, path); - - int i; - int max_digits = sizeof(int)*3; - const char *test_string = "Hello World!"; - int buffer_length = strlen(test_string) + max_digits + 1; - char correct_buffer[buffer_length]; - char receive_buffer[buffer_length]; - - for(i = 0; i < n; i++){ - snprintf(correct_buffer, buffer_length, "%s%d", test_string,i); - int offer_rc = zkr_queue_offer(&queues[0], correct_buffer, buffer_length); - CPPUNIT_ASSERT(offer_rc == ZOK); - } - printf("Offers\n"); - for(i=0; i=n){ - CPPUNIT_ASSERT(receive_buffer_length == -1); - }else{ - CPPUNIT_ASSERT(strncmp(correct_buffer,receive_buffer, buffer_length)==0); - } - } - - cleanUpQueues(num_clients,queues); - } - - void testOfferTake1(){ - create_n_take_m((char *)"/testOfferTake1", 2,1); - } - - void testOfferTake2(){ - create_n_take_m((char *)"/testOfferTake2", 1,1); - } - - void testOfferTake3(){ - create_n_take_m((char *)"/testOfferTake3", 10,1); - } - - void testOfferTake4(){ - create_n_take_m((char *)"/testOfferTake4", 10,10); - } - - void testOfferTake5(){ - create_n_take_m((char *)"/testOfferTake5", 10,5); - } - - void testOfferTake6(){ - create_n_take_m((char *)"/testOfferTake6", 12,11); - } - - void testTakeThreaded(){ - int num_clients = 1; - watchctx_t ctxs[num_clients]; - zhandle_t *zoohandles[num_clients]; - zkr_queue_t queues[num_clients]; - char *path=(char *)"/testTakeThreaded"; - - initializeQueuesAndHandles(num_clients, zoohandles, ctxs, queues, path); - pthread_t take_thread; - - pthread_create(&take_thread, NULL, take_thread_shared_queue, (void *) &queues[0]); - - usleep(1000); - - pthread_t offer_thread; - pthread_create(&offer_thread, NULL, offer_thread_shared_queue, (void *) &queues[0]); - pthread_join(offer_thread, NULL); - - void *take_thread_result; - pthread_join(take_thread, &take_thread_result); - CPPUNIT_ASSERT(take_thread_result != NULL); - CPPUNIT_ASSERT(valid_test_string(take_thread_result)); - - cleanUpQueues(num_clients,queues); - } - - void testTakeThreaded2(){ - int num_clients = 1; - watchctx_t ctxs[num_clients]; - zhandle_t *zoohandles[num_clients]; - zkr_queue_t queues[num_clients]; - char *path=(char *)"/testTakeThreaded2"; - - initializeQueuesAndHandles(num_clients, zoohandles, ctxs, queues, path); - - int take_attempts; - int num_take_attempts = 2; - for(take_attempts=0; take_attempts < num_take_attempts; take_attempts++){ - pthread_t take_thread; - - pthread_create(&take_thread, NULL, take_thread_shared_queue, (void *) &queues[0]); - - usleep(1000); - - pthread_t offer_thread; - pthread_create(&offer_thread, NULL, offer_thread_shared_queue, (void *) &queues[0]); - pthread_join(offer_thread, NULL); - - void *take_thread_result; - pthread_join(take_thread, &take_thread_result); - CPPUNIT_ASSERT(take_thread_result != NULL); - CPPUNIT_ASSERT(valid_test_string(take_thread_result)); - - } - cleanUpQueues(num_clients,queues); - } -}; - -const char Zookeeper_queuetest::hostPorts[] = "127.0.0.1:22181"; -CPPUNIT_TEST_SUITE_REGISTRATION(Zookeeper_queuetest); diff --git a/pkg/registry/zookeeper-3.4.6/recipes/queue/src/c/tests/TestDriver.cc b/pkg/registry/zookeeper-3.4.6/recipes/queue/src/c/tests/TestDriver.cc deleted file mode 100644 index 2b818f450..000000000 --- a/pkg/registry/zookeeper-3.4.6/recipes/queue/src/c/tests/TestDriver.cc +++ /dev/null @@ -1,114 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you 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. - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include "Util.h" - -using namespace std; - -CPPUNIT_NS_BEGIN - -class EclipseOutputter: public CompilerOutputter -{ -public: - EclipseOutputter(TestResultCollector *result,ostream &stream): - CompilerOutputter(result,stream,"%p:%l: "),stream_(stream) - { - } - virtual void printFailedTestName( TestFailure *failure ){} - virtual void printFailureMessage( TestFailure *failure ) - { - stream_<<": "; - Message msg = failure->thrownException()->message(); - stream_<< msg.shortDescription(); - - string text; - for(int i=0; i the output must be in the compiler error format. - //bool selfTest = (argc > 1) && (std::string("-ide") == argv[1]); - globalTestConfig.addConfigFromCmdLine(argc,argv); - - // Create the event manager and test controller - CPPUNIT_NS::TestResult controller; - // Add a listener that colllects test result - CPPUNIT_NS::TestResultCollector result; - controller.addListener( &result ); - - // Add a listener that print dots as tests run. - // CPPUNIT_NS::TextTestProgressListener progress; - CPPUNIT_NS::BriefTestProgressListener progress; - controller.addListener( &progress ); - - CPPUNIT_NS::TestRunner runner; - runner.addTest( CPPUNIT_NS::TestFactoryRegistry::getRegistry().makeTest() ); - - try - { - cout << "Running " << globalTestConfig.getTestName(); - runner.run( controller, globalTestConfig.getTestName()); - cout< -#include -#include - -// number of elements in array -#define COUNTOF(array) sizeof(array)/sizeof(array[0]) - -#define DECLARE_WRAPPER(ret,sym,sig) \ - extern "C" ret __real_##sym sig; \ - extern "C" ret __wrap_##sym sig - -#define CALL_REAL(sym,params) \ - __real_##sym params - -// must include "src/zookeeper_log.h" to be able to use this macro -#define TEST_TRACE(x) \ - log_message(3,__LINE__,__func__,format_log_message x) - -extern const std::string EMPTY_STRING; - -// ***************************************************************************** -// A bit of wizardry to get to the bare type from a reference or a pointer -// to the type -template -struct TypeOp { - typedef T BareT; - typedef T ArgT; -}; - -// partial specialization for reference types -template -struct TypeOp{ - typedef T& ArgT; - typedef typename TypeOp::BareT BareT; -}; - -// partial specialization for pointers -template -struct TypeOp{ - typedef T* ArgT; - typedef typename TypeOp::BareT BareT; -}; - -// ***************************************************************************** -// Container utilities - -template -void putValue(std::map& map,const K& k, const V& v){ - typedef std::map Map; - typename Map::const_iterator it=map.find(k); - if(it==map.end()) - map.insert(typename Map::value_type(k,v)); - else - map[k]=v; -} - -template -bool getValue(const std::map& map,const K& k,V& v){ - typedef std::map Map; - typename Map::const_iterator it=map.find(k); - if(it==map.end()) - return false; - v=it->second; - return true; -} - -// ***************************************************************************** -// misc utils - -// millisecond sleep -void millisleep(int ms); -// evaluate given predicate until it returns true or the timeout -// (in millis) has expired -template -int ensureCondition(const Predicate& p,int timeout){ - int elapsed=0; - while(!p() && elapsed CmdLineOptList; -public: - typedef CmdLineOptList::const_iterator const_iterator; - TestConfig(){} - ~TestConfig(){} - void addConfigFromCmdLine(int argc, char* argv[]){ - if(argc>=2) - testName_=argv[1]; - for(int i=2; i /tmp/zk.log & - echo $! > /tmp/zk.pid - sleep 5 - ;; -stop) - # Already killed above - ;; -*) - echo "Unknown command " + $1 - exit 2 -esac - diff --git a/pkg/registry/zookeeper-3.4.6/recipes/queue/src/java/org/apache/zookeeper/recipes/queue/DistributedQueue.java b/pkg/registry/zookeeper-3.4.6/recipes/queue/src/java/org/apache/zookeeper/recipes/queue/DistributedQueue.java deleted file mode 100644 index c5d7c83ec..000000000 --- a/pkg/registry/zookeeper-3.4.6/recipes/queue/src/java/org/apache/zookeeper/recipes/queue/DistributedQueue.java +++ /dev/null @@ -1,313 +0,0 @@ -/** - * - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You 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. - */ - -package org.apache.zookeeper.recipes.queue; - -import java.util.List; -import java.util.NoSuchElementException; -import java.util.TreeMap; -import java.util.concurrent.CountDownLatch; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.apache.zookeeper.CreateMode; -import org.apache.zookeeper.KeeperException; -import org.apache.zookeeper.WatchedEvent; -import org.apache.zookeeper.Watcher; -import org.apache.zookeeper.ZooDefs; -import org.apache.zookeeper.ZooKeeper; -import org.apache.zookeeper.data.ACL; -import org.apache.zookeeper.data.Stat; - -/** - * - * A protocol to implement a distributed queue. - * - */ - -public class DistributedQueue { - private static final Logger LOG = LoggerFactory.getLogger(DistributedQueue.class); - - private final String dir; - - private ZooKeeper zookeeper; - private List acl = ZooDefs.Ids.OPEN_ACL_UNSAFE; - - private final String prefix = "qn-"; - - - public DistributedQueue(ZooKeeper zookeeper, String dir, List acl){ - this.dir = dir; - - if(acl != null){ - this.acl = acl; - } - this.zookeeper = zookeeper; - - } - - - - /** - * Returns a Map of the children, ordered by id. - * @param watcher optional watcher on getChildren() operation. - * @return map from id to child name for all children - */ - private TreeMap orderedChildren(Watcher watcher) throws KeeperException, InterruptedException { - TreeMap orderedChildren = new TreeMap(); - - List childNames = null; - try{ - childNames = zookeeper.getChildren(dir, watcher); - }catch (KeeperException.NoNodeException e){ - throw e; - } - - for(String childName : childNames){ - try{ - //Check format - if(!childName.regionMatches(0, prefix, 0, prefix.length())){ - LOG.warn("Found child node with improper name: " + childName); - continue; - } - String suffix = childName.substring(prefix.length()); - Long childId = new Long(suffix); - orderedChildren.put(childId,childName); - }catch(NumberFormatException e){ - LOG.warn("Found child node with improper format : " + childName + " " + e,e); - } - } - - return orderedChildren; - } - - /** - * Find the smallest child node. - * @return The name of the smallest child node. - */ - private String smallestChildName() throws KeeperException, InterruptedException { - long minId = Long.MAX_VALUE; - String minName = ""; - - List childNames = null; - - try{ - childNames = zookeeper.getChildren(dir, false); - }catch(KeeperException.NoNodeException e){ - LOG.warn("Caught: " +e,e); - return null; - } - - for(String childName : childNames){ - try{ - //Check format - if(!childName.regionMatches(0, prefix, 0, prefix.length())){ - LOG.warn("Found child node with improper name: " + childName); - continue; - } - String suffix = childName.substring(prefix.length()); - long childId = Long.parseLong(suffix); - if(childId < minId){ - minId = childId; - minName = childName; - } - }catch(NumberFormatException e){ - LOG.warn("Found child node with improper format : " + childName + " " + e,e); - } - } - - - if(minId < Long.MAX_VALUE){ - return minName; - }else{ - return null; - } - } - - /** - * Return the head of the queue without modifying the queue. - * @return the data at the head of the queue. - * @throws NoSuchElementException - * @throws KeeperException - * @throws InterruptedException - */ - public byte[] element() throws NoSuchElementException, KeeperException, InterruptedException { - TreeMap orderedChildren; - - // element, take, and remove follow the same pattern. - // We want to return the child node with the smallest sequence number. - // Since other clients are remove()ing and take()ing nodes concurrently, - // the child with the smallest sequence number in orderedChildren might be gone by the time we check. - // We don't call getChildren again until we have tried the rest of the nodes in sequence order. - while(true){ - try{ - orderedChildren = orderedChildren(null); - }catch(KeeperException.NoNodeException e){ - throw new NoSuchElementException(); - } - if(orderedChildren.size() == 0 ) throw new NoSuchElementException(); - - for(String headNode : orderedChildren.values()){ - if(headNode != null){ - try{ - return zookeeper.getData(dir+"/"+headNode, false, null); - }catch(KeeperException.NoNodeException e){ - //Another client removed the node first, try next - } - } - } - - } - } - - - /** - * Attempts to remove the head of the queue and return it. - * @return The former head of the queue - * @throws NoSuchElementException - * @throws KeeperException - * @throws InterruptedException - */ - public byte[] remove() throws NoSuchElementException, KeeperException, InterruptedException { - TreeMap orderedChildren; - // Same as for element. Should refactor this. - while(true){ - try{ - orderedChildren = orderedChildren(null); - }catch(KeeperException.NoNodeException e){ - throw new NoSuchElementException(); - } - if(orderedChildren.size() == 0) throw new NoSuchElementException(); - - for(String headNode : orderedChildren.values()){ - String path = dir +"/"+headNode; - try{ - byte[] data = zookeeper.getData(path, false, null); - zookeeper.delete(path, -1); - return data; - }catch(KeeperException.NoNodeException e){ - // Another client deleted the node first. - } - } - - } - } - - private class LatchChildWatcher implements Watcher { - - CountDownLatch latch; - - public LatchChildWatcher(){ - latch = new CountDownLatch(1); - } - - public void process(WatchedEvent event){ - LOG.debug("Watcher fired on path: " + event.getPath() + " state: " + - event.getState() + " type " + event.getType()); - latch.countDown(); - } - public void await() throws InterruptedException { - latch.await(); - } - } - - /** - * Removes the head of the queue and returns it, blocks until it succeeds. - * @return The former head of the queue - * @throws NoSuchElementException - * @throws KeeperException - * @throws InterruptedException - */ - public byte[] take() throws KeeperException, InterruptedException { - TreeMap orderedChildren; - // Same as for element. Should refactor this. - while(true){ - LatchChildWatcher childWatcher = new LatchChildWatcher(); - try{ - orderedChildren = orderedChildren(childWatcher); - }catch(KeeperException.NoNodeException e){ - zookeeper.create(dir, new byte[0], acl, CreateMode.PERSISTENT); - continue; - } - if(orderedChildren.size() == 0){ - childWatcher.await(); - continue; - } - - for(String headNode : orderedChildren.values()){ - String path = dir +"/"+headNode; - try{ - byte[] data = zookeeper.getData(path, false, null); - zookeeper.delete(path, -1); - return data; - }catch(KeeperException.NoNodeException e){ - // Another client deleted the node first. - } - } - } - } - - /** - * Inserts data into queue. - * @param data - * @return true if data was successfully added - */ - public boolean offer(byte[] data) throws KeeperException, InterruptedException{ - for(;;){ - try{ - zookeeper.create(dir+"/"+prefix, data, acl, CreateMode.PERSISTENT_SEQUENTIAL); - return true; - }catch(KeeperException.NoNodeException e){ - zookeeper.create(dir, new byte[0], acl, CreateMode.PERSISTENT); - } - } - - } - - /** - * Returns the data at the first element of the queue, or null if the queue is empty. - * @return data at the first element of the queue, or null. - * @throws KeeperException - * @throws InterruptedException - */ - public byte[] peek() throws KeeperException, InterruptedException{ - try{ - return element(); - }catch(NoSuchElementException e){ - return null; - } - } - - - /** - * Attempts to remove the head of the queue and return it. Returns null if the queue is empty. - * @return Head of the queue or null. - * @throws KeeperException - * @throws InterruptedException - */ - public byte[] poll() throws KeeperException, InterruptedException { - try{ - return remove(); - }catch(NoSuchElementException e){ - return null; - } - } - - - -} diff --git a/pkg/registry/zookeeper-3.4.6/src/c/ChangeLog b/pkg/registry/zookeeper-3.4.6/src/c/ChangeLog deleted file mode 100644 index c85a6c0ad..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/c/ChangeLog +++ /dev/null @@ -1,116 +0,0 @@ -Release 2.1.1 -2008-04-30 Andrew Kornev - - * changed the distributino package name to "c-client-src" - -Release 2.1.0 -2008-04-30 Andrew Kornev - - * added the client latency diagnostics; the client prints a warning when the - reponse latency exceeds 20ms - - * modified logging format to report the znode path for which the zookeeper - operation is called - - * fixed a minor bug where error messages were missing for some of the newer - zookeeper error codes (ZCLOSING and ZNOTHING). - - * improved logging by adding the XID to the message to make it easy to match - requests to responses - - * fixed the bug causing sporadic session termination and timeouts - - * added a new return code to zookeeper_process() -- ZNOTHING -- - that indicates that the socket has no more data to read - - * more unit tests added - -Release 1.1.3 -2008-02-07 Andrew Kornev - - * get_xid() is not thread-safe (xid initialization race condition - in the multi-threaded mode). - - * the I/O thread doesnt automatically terminate on AUTH_FAILURE and - SESSION_EXPIRED events. - - * all session events should be processed on the completion thread. - - * PING operation doesnt atomically enqueue the completion and - send buffers like other operations do. - - * corrected zookeeper_init() doxygen docs. - - * new unit tests added. - - -Release 1.1.2 -2008-01-24 Andrew Kornev - - * fixed a race condition caused by the code in zookeeper_process() - and free_completions() setting sc->complete to 1 without proper - synchronization; - - * fixed zoo_get() not updating buffer_len value with the actual - buffer length on return; added missing enter_critical/leave_critical - calls to the async ZK operations. - - * Replaced select() with poll() to fix the problem with the FD_SET - macro causing stack corruption for FDs higher than 1024 - - * Added zoo_set_log_stream() to the public API. The function allows - applications to specify a different log file. - - * Removed unused declarations from zookeeper.h (ACL related) - - * changed zoo_get() signature to take a pointer to buffer length. - The function sets the parameter to the actual data length upon return. - - * the watcher callback now takes the zhandle as its first parameter. This - is to avoid a race condition in the multi-threaded client when a watcher - is called before zookeeper_init() has returned. - - * fixed zookeeper_close() resource leaks and race conditions, - fixed the race condition causing xid mismatch. - - * added support for cppunit, added new targets: "check" and "run-check" - to build and run unit tests. - - * Changed the signature of zookeeper_init(): it now takes a context pointer - as a parameter. This is to avoid a race condition in the multi-threaded client. - - * Using a self-pipe rather than SIGUSR1 to wake up select() in the I/O thread - - * Added the doxygen target to the autoconf scripts - - * Pulled out the logging functionality from zookeeper.c to zk_log.c/.h. - Fixed a minor issue with PING responses being unnecessarily put on - the completion queue rather than simply dropped. Make use of DLL_EXPORT - symbol for building shared lib on cygwin. - - * Implemented new Zookeeper operation sync() to flush the leader channel - to ensure that all updates have reached the followers. - - * Synchronous methods not being handled properly on disconnect - - * breed: fixed an incorrect parameter passed to zookeeper API by - the Sync API wrapper functions - - * breed: the set and delete commands now support both Sync and Async API. - Prefix the command name with an 'a' to call the Async API: aset, adelete - - * Make sure mutexes and condition variables are properly initialized - and destroyed - - * Fixed zookeeper_close() causing core dumps with mt_adaptor - - -Release 1.0.0 -2007-11-27 Andrew Kornev - - * configure.ac and Makefile.am added support for GNU autotools - - * recordio.c/.h updated jute IO routines to use bit-explicit integer types - (int32_t vs. int, and int64_t vs. long long) - - * README rough draft \ No newline at end of file diff --git a/pkg/registry/zookeeper-3.4.6/src/c/Cli.vcproj b/pkg/registry/zookeeper-3.4.6/src/c/Cli.vcproj deleted file mode 100644 index 39ed8a429..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/c/Cli.vcproj +++ /dev/null @@ -1,210 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/pkg/registry/zookeeper-3.4.6/src/c/INSTALL b/pkg/registry/zookeeper-3.4.6/src/c/INSTALL deleted file mode 100644 index 5458714e1..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/c/INSTALL +++ /dev/null @@ -1,234 +0,0 @@ -Installation Instructions -************************* - -Copyright (C) 1994, 1995, 1996, 1999, 2000, 2001, 2002, 2004, 2005, -2006 Free Software Foundation, Inc. - -This file is free documentation; the Free Software Foundation gives -unlimited permission to copy, distribute and modify it. - -Basic Installation -================== - -Briefly, the shell commands `./configure; make; make install' should -configure, build, and install this package. The following -more-detailed instructions are generic; see the `README' file for -instructions specific to this package. - - The `configure' shell script attempts to guess correct values for -various system-dependent variables used during compilation. It uses -those values to create a `Makefile' in each directory of the package. -It may also create one or more `.h' files containing system-dependent -definitions. Finally, it creates a shell script `config.status' that -you can run in the future to recreate the current configuration, and a -file `config.log' containing compiler output (useful mainly for -debugging `configure'). - - It can also use an optional file (typically called `config.cache' -and enabled with `--cache-file=config.cache' or simply `-C') that saves -the results of its tests to speed up reconfiguring. Caching is -disabled by default to prevent problems with accidental use of stale -cache files. - - If you need to do unusual things to compile the package, please try -to figure out how `configure' could check whether to do them, and mail -diffs or instructions to the address given in the `README' so they can -be considered for the next release. If you are using the cache, and at -some point `config.cache' contains results you don't want to keep, you -may remove or edit it. - - The file `configure.ac' (or `configure.in') is used to create -`configure' by a program called `autoconf'. You need `configure.ac' if -you want to change it or regenerate `configure' using a newer version -of `autoconf'. - -The simplest way to compile this package is: - - 1. `cd' to the directory containing the package's source code and type - `./configure' to configure the package for your system. - - Running `configure' might take a while. While running, it prints - some messages telling which features it is checking for. - - 2. Type `make' to compile the package. - - 3. Optionally, type `make check' to run any self-tests that come with - the package. - - 4. Type `make install' to install the programs and any data files and - documentation. - - 5. You can remove the program binaries and object files from the - source code directory by typing `make clean'. To also remove the - files that `configure' created (so you can compile the package for - a different kind of computer), type `make distclean'. There is - also a `make maintainer-clean' target, but that is intended mainly - for the package's developers. If you use it, you may have to get - all sorts of other programs in order to regenerate files that came - with the distribution. - -Compilers and Options -===================== - -Some systems require unusual options for compilation or linking that the -`configure' script does not know about. Run `./configure --help' for -details on some of the pertinent environment variables. - - You can give `configure' initial values for configuration parameters -by setting variables in the command line or in the environment. Here -is an example: - - ./configure CC=c99 CFLAGS=-g LIBS=-lposix - - *Note Defining Variables::, for more details. - -Compiling For Multiple Architectures -==================================== - -You can compile the package for more than one kind of computer at the -same time, by placing the object files for each architecture in their -own directory. To do this, you can use GNU `make'. `cd' to the -directory where you want the object files and executables to go and run -the `configure' script. `configure' automatically checks for the -source code in the directory that `configure' is in and in `..'. - - With a non-GNU `make', it is safer to compile the package for one -architecture at a time in the source code directory. After you have -installed the package for one architecture, use `make distclean' before -reconfiguring for another architecture. - -Installation Names -================== - -By default, `make install' installs the package's commands under -`/usr/local/bin', include files under `/usr/local/include', etc. You -can specify an installation prefix other than `/usr/local' by giving -`configure' the option `--prefix=PREFIX'. - - You can specify separate installation prefixes for -architecture-specific files and architecture-independent files. If you -pass the option `--exec-prefix=PREFIX' to `configure', the package uses -PREFIX as the prefix for installing programs and libraries. -Documentation and other data files still use the regular prefix. - - In addition, if you use an unusual directory layout you can give -options like `--bindir=DIR' to specify different values for particular -kinds of files. Run `configure --help' for a list of the directories -you can set and what kinds of files go in them. - - If the package supports it, you can cause programs to be installed -with an extra prefix or suffix on their names by giving `configure' the -option `--program-prefix=PREFIX' or `--program-suffix=SUFFIX'. - -Optional Features -================= - -Some packages pay attention to `--enable-FEATURE' options to -`configure', where FEATURE indicates an optional part of the package. -They may also pay attention to `--with-PACKAGE' options, where PACKAGE -is something like `gnu-as' or `x' (for the X Window System). The -`README' should mention any `--enable-' and `--with-' options that the -package recognizes. - - For packages that use the X Window System, `configure' can usually -find the X include and library files automatically, but if it doesn't, -you can use the `configure' options `--x-includes=DIR' and -`--x-libraries=DIR' to specify their locations. - -Specifying the System Type -========================== - -There may be some features `configure' cannot figure out automatically, -but needs to determine by the type of machine the package will run on. -Usually, assuming the package is built to be run on the _same_ -architectures, `configure' can figure that out, but if it prints a -message saying it cannot guess the machine type, give it the -`--build=TYPE' option. TYPE can either be a short name for the system -type, such as `sun4', or a canonical name which has the form: - - CPU-COMPANY-SYSTEM - -where SYSTEM can have one of these forms: - - OS KERNEL-OS - - See the file `config.sub' for the possible values of each field. If -`config.sub' isn't included in this package, then this package doesn't -need to know the machine type. - - If you are _building_ compiler tools for cross-compiling, you should -use the option `--target=TYPE' to select the type of system they will -produce code for. - - If you want to _use_ a cross compiler, that generates code for a -platform different from the build platform, you should specify the -"host" platform (i.e., that on which the generated programs will -eventually be run) with `--host=TYPE'. - -Sharing Defaults -================ - -If you want to set default values for `configure' scripts to share, you -can create a site shell script called `config.site' that gives default -values for variables like `CC', `cache_file', and `prefix'. -`configure' looks for `PREFIX/share/config.site' if it exists, then -`PREFIX/etc/config.site' if it exists. Or, you can set the -`CONFIG_SITE' environment variable to the location of the site script. -A warning: not all `configure' scripts look for a site script. - -Defining Variables -================== - -Variables not defined in a site shell script can be set in the -environment passed to `configure'. However, some packages may run -configure again during the build, and the customized values of these -variables may be lost. In order to avoid this problem, you should set -them in the `configure' command line, using `VAR=value'. For example: - - ./configure CC=/usr/local2/bin/gcc - -causes the specified `gcc' to be used as the C compiler (unless it is -overridden in the site shell script). - -Unfortunately, this technique does not work for `CONFIG_SHELL' due to -an Autoconf bug. Until the bug is fixed you can use this workaround: - - CONFIG_SHELL=/bin/bash /bin/bash ./configure CONFIG_SHELL=/bin/bash - -`configure' Invocation -====================== - -`configure' recognizes the following options to control how it operates. - -`--help' -`-h' - Print a summary of the options to `configure', and exit. - -`--version' -`-V' - Print the version of Autoconf used to generate the `configure' - script, and exit. - -`--cache-file=FILE' - Enable the cache: use and save the results of the tests in FILE, - traditionally `config.cache'. FILE defaults to `/dev/null' to - disable caching. - -`--config-cache' -`-C' - Alias for `--cache-file=config.cache'. - -`--quiet' -`--silent' -`-q' - Do not print messages saying which checks are being made. To - suppress all normal output, redirect it to `/dev/null' (any error - messages will still be shown). - -`--srcdir=DIR' - Look for the package's source code in directory DIR. Usually - `configure' can determine that directory automatically. - -`configure' also accepts some other, not widely useful, options. Run -`configure --help' for more details. - diff --git a/pkg/registry/zookeeper-3.4.6/src/c/LICENSE b/pkg/registry/zookeeper-3.4.6/src/c/LICENSE deleted file mode 100644 index d64569567..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/c/LICENSE +++ /dev/null @@ -1,202 +0,0 @@ - - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "[]" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright [yyyy] [name of copyright owner] - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. diff --git a/pkg/registry/zookeeper-3.4.6/src/c/Makefile.am b/pkg/registry/zookeeper-3.4.6/src/c/Makefile.am deleted file mode 100644 index dbf4080f5..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/c/Makefile.am +++ /dev/null @@ -1,108 +0,0 @@ -# need this for Doxygen integration -include $(top_srcdir)/aminclude.am - -AM_CPPFLAGS = -I${srcdir}/include -I${srcdir}/tests -I${srcdir}/generated -AM_CFLAGS = -Wall -Werror -AM_CXXFLAGS = -Wall $(USEIPV6) - -LIB_LDFLAGS = -no-undefined -version-info 2 - -pkginclude_HEADERS = include/zookeeper.h include/zookeeper_version.h include/zookeeper_log.h include/proto.h include/recordio.h generated/zookeeper.jute.h -EXTRA_DIST=LICENSE - -HASHTABLE_SRC = src/hashtable/hashtable_itr.h src/hashtable/hashtable_itr.c \ - src/hashtable/hashtable_private.h src/hashtable/hashtable.h src/hashtable/hashtable.c - -noinst_LTLIBRARIES = libhashtable.la -libhashtable_la_SOURCES = $(HASHTABLE_SRC) - -COMMON_SRC = src/zookeeper.c include/zookeeper.h include/zookeeper_version.h include/zookeeper_log.h\ - src/recordio.c include/recordio.h include/proto.h \ - src/zk_adaptor.h generated/zookeeper.jute.c \ - src/zookeeper_log.h src/zk_log.c src/zk_hashtable.h src/zk_hashtable.c - -# These are the symbols (classes, mostly) we want to export from our library. -EXPORT_SYMBOLS = '(zoo_|zookeeper_|zhandle|Z|format_log_message|log_message|logLevel|deallocate_|zerror|is_unrecoverable)' -noinst_LTLIBRARIES += libzkst.la -libzkst_la_SOURCES =$(COMMON_SRC) src/st_adaptor.c -libzkst_la_LIBADD = -lm - -lib_LTLIBRARIES = libzookeeper_st.la -libzookeeper_st_la_SOURCES = -libzookeeper_st_la_LIBADD=libzkst.la libhashtable.la -libzookeeper_st_la_DEPENDENCIES=libzkst.la libhashtable.la -libzookeeper_st_la_LDFLAGS = $(LIB_LDFLAGS) -export-symbols-regex $(EXPORT_SYMBOLS) - -if WANT_SYNCAPI -noinst_LTLIBRARIES += libzkmt.la -libzkmt_la_SOURCES =$(COMMON_SRC) src/mt_adaptor.c -libzkmt_la_CFLAGS = -DTHREADED -libzkmt_la_LIBADD = -lm - -lib_LTLIBRARIES += libzookeeper_mt.la -libzookeeper_mt_la_SOURCES = -libzookeeper_mt_la_LIBADD=libzkmt.la libhashtable.la -lpthread -libzookeeper_mt_la_DEPENDENCIES=libzkmt.la libhashtable.la -libzookeeper_mt_la_LDFLAGS = $(LIB_LDFLAGS) -export-symbols-regex $(EXPORT_SYMBOLS) -endif - -bin_PROGRAMS = cli_st - -cli_st_SOURCES = src/cli.c -cli_st_LDADD = libzookeeper_st.la - -if WANT_SYNCAPI -bin_PROGRAMS += cli_mt load_gen - -cli_mt_SOURCES = src/cli.c -cli_mt_LDADD = libzookeeper_mt.la -cli_mt_CFLAGS = -DTHREADED - -load_gen_SOURCES = src/load_gen.c -load_gen_LDADD = libzookeeper_mt.la -load_gen_CFLAGS = -DTHREADED - -endif - -######################################################################### -# build and run unit tests - -EXTRA_DIST+=$(wildcard ${srcdir}/tests/*.cc) $(wildcard ${srcdir}/tests/*.h) \ - ${srcdir}/tests/wrappers.opt ${srcdir}/tests/wrappers-mt.opt - -TEST_SOURCES = tests/TestDriver.cc tests/LibCMocks.cc tests/LibCSymTable.cc \ - tests/MocksBase.cc tests/ZKMocks.cc tests/Util.cc tests/ThreadingUtil.cc \ - tests/TestClientRetry.cc \ - tests/TestOperations.cc tests/TestZookeeperInit.cc \ - tests/TestZookeeperClose.cc tests/TestClient.cc \ - tests/TestMulti.cc tests/TestWatchers.cc - - -SYMBOL_WRAPPERS=$(shell cat ${srcdir}/tests/wrappers.opt) - -check_PROGRAMS = zktest-st -nodist_zktest_st_SOURCES = $(TEST_SOURCES) -zktest_st_LDADD = libzkst.la libhashtable.la $(CPPUNIT_LIBS) -zktest_st_CXXFLAGS = -DUSE_STATIC_LIB $(CPPUNIT_CFLAGS) $(USEIPV6) -zktest_st_LDFLAGS = -static-libtool-libs $(SYMBOL_WRAPPERS) - -if WANT_SYNCAPI - check_PROGRAMS += zktest-mt - nodist_zktest_mt_SOURCES = $(TEST_SOURCES) tests/PthreadMocks.cc - zktest_mt_LDADD = libzkmt.la libhashtable.la -lpthread $(CPPUNIT_LIBS) - zktest_mt_CXXFLAGS = -DUSE_STATIC_LIB -DTHREADED $(CPPUNIT_CFLAGS) $(USEIPV6) - SYMBOL_WRAPPERS_MT=$(SYMBOL_WRAPPERS) $(shell cat ${srcdir}/tests/wrappers-mt.opt) - zktest_mt_LDFLAGS = -static-libtool-libs $(SYMBOL_WRAPPERS_MT) -endif - -run-check: check - ./zktest-st $(TEST_OPTIONS) -if WANT_SYNCAPI - ./zktest-mt $(TEST_OPTIONS) -endif - -clean-local: clean-check - $(RM) $(DX_CLEANFILES) - -clean-check: - $(RM) $(nodist_zktest_st_OBJECTS) $(nodist_zktest_mt_OBJECTS) diff --git a/pkg/registry/zookeeper-3.4.6/src/c/Makefile.in b/pkg/registry/zookeeper-3.4.6/src/c/Makefile.in deleted file mode 100644 index b91747f91..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/c/Makefile.in +++ /dev/null @@ -1,1782 +0,0 @@ -# Makefile.in generated by automake 1.11.6 from Makefile.am. -# @configure_input@ - -# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, -# 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software -# Foundation, Inc. -# This Makefile.in is free software; the Free Software Foundation -# gives unlimited permission to copy and/or distribute it, -# with or without modifications, as long as this notice is preserved. - -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY, to the extent permitted by law; without -# even the implied warranty of MERCHANTABILITY or FITNESS FOR A -# PARTICULAR PURPOSE. - -@SET_MAKE@ - -# Copyright (C) 2004 Oren Ben-Kiki -# This file is distributed under the same terms as the Automake macro files. - -# Generate automatic documentation using Doxygen. Goals and variables values -# are controlled by the various DX_COND_??? conditionals set by autoconf. -# -# The provided goals are: -# doxygen-doc: Generate all doxygen documentation. -# doxygen-run: Run doxygen, which will generate some of the documentation -# (HTML, CHM, CHI, MAN, RTF, XML) but will not do the post -# processing required for the rest of it (PS, PDF, and some MAN). -# doxygen-man: Rename some doxygen generated man pages. -# doxygen-ps: Generate doxygen PostScript documentation. -# doxygen-pdf: Generate doxygen PDF documentation. -# -# Note that by default these are not integrated into the automake goals. If -# doxygen is used to generate man pages, you can achieve this integration by -# setting man3_MANS to the list of man pages generated and then adding the -# dependency: -# -# $(man3_MANS): doxygen-doc -# -# This will cause make to run doxygen and generate all the documentation. -# -# The following variable is intended for use in Makefile.am: -# -# DX_CLEANFILES = everything to clean. -# -# This is usually added to MOSTLYCLEANFILES. - - - -VPATH = @srcdir@ -am__make_dryrun = \ - { \ - am__dry=no; \ - case $$MAKEFLAGS in \ - *\\[\ \ ]*) \ - echo 'am--echo: ; @echo "AM" OK' | $(MAKE) -f - 2>/dev/null \ - | grep '^AM OK$$' >/dev/null || am__dry=yes;; \ - *) \ - for am__flg in $$MAKEFLAGS; do \ - case $$am__flg in \ - *=*|--*) ;; \ - *n*) am__dry=yes; break;; \ - esac; \ - done;; \ - esac; \ - test $$am__dry = yes; \ - } -pkgdatadir = $(datadir)/@PACKAGE@ -pkgincludedir = $(includedir)/@PACKAGE@ -pkglibdir = $(libdir)/@PACKAGE@ -pkglibexecdir = $(libexecdir)/@PACKAGE@ -am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd -install_sh_DATA = $(install_sh) -c -m 644 -install_sh_PROGRAM = $(install_sh) -c -install_sh_SCRIPT = $(install_sh) -c -INSTALL_HEADER = $(INSTALL_DATA) -transform = $(program_transform_name) -NORMAL_INSTALL = : -PRE_INSTALL = : -POST_INSTALL = : -NORMAL_UNINSTALL = : -PRE_UNINSTALL = : -POST_UNINSTALL = : -build_triplet = @build@ -host_triplet = @host@ -DIST_COMMON = README $(am__configure_deps) $(pkginclude_HEADERS) \ - $(srcdir)/Makefile.am $(srcdir)/Makefile.in \ - $(srcdir)/config.h.in $(top_srcdir)/aminclude.am \ - $(top_srcdir)/configure ChangeLog INSTALL compile config.guess \ - config.sub depcomp install-sh ltmain.sh missing -@WANT_SYNCAPI_TRUE@am__append_1 = libzkmt.la -@WANT_SYNCAPI_TRUE@am__append_2 = libzookeeper_mt.la -bin_PROGRAMS = cli_st$(EXEEXT) $(am__EXEEXT_1) -@WANT_SYNCAPI_TRUE@am__append_3 = cli_mt load_gen -check_PROGRAMS = zktest-st$(EXEEXT) $(am__EXEEXT_2) -@WANT_SYNCAPI_TRUE@am__append_4 = zktest-mt -subdir = . -ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 -am__aclocal_m4_deps = $(top_srcdir)/acinclude.m4 \ - $(top_srcdir)/configure.ac -am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ - $(ACLOCAL_M4) -am__CONFIG_DISTCLEAN_FILES = config.status config.cache config.log \ - configure.lineno config.status.lineno -mkinstalldirs = $(install_sh) -d -CONFIG_HEADER = config.h -CONFIG_CLEAN_FILES = -CONFIG_CLEAN_VPATH_FILES = -am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; -am__vpath_adj = case $$p in \ - $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ - *) f=$$p;; \ - esac; -am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; -am__install_max = 40 -am__nobase_strip_setup = \ - srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` -am__nobase_strip = \ - for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" -am__nobase_list = $(am__nobase_strip_setup); \ - for p in $$list; do echo "$$p $$p"; done | \ - sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ - $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ - if (++n[$$2] == $(am__install_max)) \ - { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ - END { for (dir in files) print dir, files[dir] }' -am__base_list = \ - sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ - sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' -am__uninstall_files_from_dir = { \ - test -z "$$files" \ - || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ - || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ - $(am__cd) "$$dir" && rm -f $$files; }; \ - } -am__installdirs = "$(DESTDIR)$(libdir)" "$(DESTDIR)$(bindir)" \ - "$(DESTDIR)$(pkgincludedir)" -LTLIBRARIES = $(lib_LTLIBRARIES) $(noinst_LTLIBRARIES) -libhashtable_la_LIBADD = -am__objects_1 = hashtable_itr.lo hashtable.lo -am_libhashtable_la_OBJECTS = $(am__objects_1) -libhashtable_la_OBJECTS = $(am_libhashtable_la_OBJECTS) -libzkmt_la_DEPENDENCIES = -am__libzkmt_la_SOURCES_DIST = src/zookeeper.c include/zookeeper.h \ - include/zookeeper_version.h include/zookeeper_log.h \ - src/recordio.c include/recordio.h include/proto.h \ - src/zk_adaptor.h generated/zookeeper.jute.c \ - src/zookeeper_log.h src/zk_log.c src/zk_hashtable.h \ - src/zk_hashtable.c src/mt_adaptor.c -am__objects_2 = libzkmt_la-zookeeper.lo libzkmt_la-recordio.lo \ - libzkmt_la-zookeeper.jute.lo libzkmt_la-zk_log.lo \ - libzkmt_la-zk_hashtable.lo -@WANT_SYNCAPI_TRUE@am_libzkmt_la_OBJECTS = $(am__objects_2) \ -@WANT_SYNCAPI_TRUE@ libzkmt_la-mt_adaptor.lo -libzkmt_la_OBJECTS = $(am_libzkmt_la_OBJECTS) -libzkmt_la_LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) \ - $(LIBTOOLFLAGS) --mode=link $(CCLD) $(libzkmt_la_CFLAGS) \ - $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ -@WANT_SYNCAPI_TRUE@am_libzkmt_la_rpath = -libzkst_la_DEPENDENCIES = -am__objects_3 = zookeeper.lo recordio.lo zookeeper.jute.lo zk_log.lo \ - zk_hashtable.lo -am_libzkst_la_OBJECTS = $(am__objects_3) st_adaptor.lo -libzkst_la_OBJECTS = $(am_libzkst_la_OBJECTS) -am_libzookeeper_mt_la_OBJECTS = -libzookeeper_mt_la_OBJECTS = $(am_libzookeeper_mt_la_OBJECTS) -libzookeeper_mt_la_LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) \ - $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ - $(libzookeeper_mt_la_LDFLAGS) $(LDFLAGS) -o $@ -@WANT_SYNCAPI_TRUE@am_libzookeeper_mt_la_rpath = -rpath $(libdir) -am_libzookeeper_st_la_OBJECTS = -libzookeeper_st_la_OBJECTS = $(am_libzookeeper_st_la_OBJECTS) -libzookeeper_st_la_LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) \ - $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ - $(libzookeeper_st_la_LDFLAGS) $(LDFLAGS) -o $@ -@WANT_SYNCAPI_TRUE@am__EXEEXT_1 = cli_mt$(EXEEXT) load_gen$(EXEEXT) -@WANT_SYNCAPI_TRUE@am__EXEEXT_2 = zktest-mt$(EXEEXT) -PROGRAMS = $(bin_PROGRAMS) -am__cli_mt_SOURCES_DIST = src/cli.c -@WANT_SYNCAPI_TRUE@am_cli_mt_OBJECTS = cli_mt-cli.$(OBJEXT) -cli_mt_OBJECTS = $(am_cli_mt_OBJECTS) -@WANT_SYNCAPI_TRUE@cli_mt_DEPENDENCIES = libzookeeper_mt.la -cli_mt_LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ - --mode=link $(CCLD) $(cli_mt_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \ - $(LDFLAGS) -o $@ -am_cli_st_OBJECTS = cli.$(OBJEXT) -cli_st_OBJECTS = $(am_cli_st_OBJECTS) -cli_st_DEPENDENCIES = libzookeeper_st.la -am__load_gen_SOURCES_DIST = src/load_gen.c -@WANT_SYNCAPI_TRUE@am_load_gen_OBJECTS = load_gen-load_gen.$(OBJEXT) -load_gen_OBJECTS = $(am_load_gen_OBJECTS) -@WANT_SYNCAPI_TRUE@load_gen_DEPENDENCIES = libzookeeper_mt.la -load_gen_LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ - --mode=link $(CCLD) $(load_gen_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \ - $(LDFLAGS) -o $@ -am__objects_4 = zktest_mt-TestDriver.$(OBJEXT) \ - zktest_mt-LibCMocks.$(OBJEXT) zktest_mt-LibCSymTable.$(OBJEXT) \ - zktest_mt-MocksBase.$(OBJEXT) zktest_mt-ZKMocks.$(OBJEXT) \ - zktest_mt-Util.$(OBJEXT) zktest_mt-ThreadingUtil.$(OBJEXT) \ - zktest_mt-TestClientRetry.$(OBJEXT) \ - zktest_mt-TestOperations.$(OBJEXT) \ - zktest_mt-TestZookeeperInit.$(OBJEXT) \ - zktest_mt-TestZookeeperClose.$(OBJEXT) \ - zktest_mt-TestClient.$(OBJEXT) zktest_mt-TestMulti.$(OBJEXT) \ - zktest_mt-TestWatchers.$(OBJEXT) -@WANT_SYNCAPI_TRUE@nodist_zktest_mt_OBJECTS = $(am__objects_4) \ -@WANT_SYNCAPI_TRUE@ zktest_mt-PthreadMocks.$(OBJEXT) -zktest_mt_OBJECTS = $(nodist_zktest_mt_OBJECTS) -am__DEPENDENCIES_1 = -@WANT_SYNCAPI_TRUE@zktest_mt_DEPENDENCIES = libzkmt.la libhashtable.la \ -@WANT_SYNCAPI_TRUE@ $(am__DEPENDENCIES_1) -zktest_mt_LINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) \ - $(LIBTOOLFLAGS) --mode=link $(CXXLD) $(zktest_mt_CXXFLAGS) \ - $(CXXFLAGS) $(zktest_mt_LDFLAGS) $(LDFLAGS) -o $@ -am__objects_5 = zktest_st-TestDriver.$(OBJEXT) \ - zktest_st-LibCMocks.$(OBJEXT) zktest_st-LibCSymTable.$(OBJEXT) \ - zktest_st-MocksBase.$(OBJEXT) zktest_st-ZKMocks.$(OBJEXT) \ - zktest_st-Util.$(OBJEXT) zktest_st-ThreadingUtil.$(OBJEXT) \ - zktest_st-TestClientRetry.$(OBJEXT) \ - zktest_st-TestOperations.$(OBJEXT) \ - zktest_st-TestZookeeperInit.$(OBJEXT) \ - zktest_st-TestZookeeperClose.$(OBJEXT) \ - zktest_st-TestClient.$(OBJEXT) zktest_st-TestMulti.$(OBJEXT) \ - zktest_st-TestWatchers.$(OBJEXT) -nodist_zktest_st_OBJECTS = $(am__objects_5) -zktest_st_OBJECTS = $(nodist_zktest_st_OBJECTS) -zktest_st_DEPENDENCIES = libzkst.la libhashtable.la \ - $(am__DEPENDENCIES_1) -zktest_st_LINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) \ - $(LIBTOOLFLAGS) --mode=link $(CXXLD) $(zktest_st_CXXFLAGS) \ - $(CXXFLAGS) $(zktest_st_LDFLAGS) $(LDFLAGS) -o $@ -DEFAULT_INCLUDES = -I.@am__isrc@ -depcomp = $(SHELL) $(top_srcdir)/depcomp -am__depfiles_maybe = depfiles -am__mv = mv -f -COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ - $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -LTCOMPILE = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ - --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ - $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -CCLD = $(CC) -LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ - --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \ - $(LDFLAGS) -o $@ -CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ - $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -LTCXXCOMPILE = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ - --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ - $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -CXXLD = $(CXX) -CXXLINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ - --mode=link $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) \ - $(LDFLAGS) -o $@ -SOURCES = $(libhashtable_la_SOURCES) $(libzkmt_la_SOURCES) \ - $(libzkst_la_SOURCES) $(libzookeeper_mt_la_SOURCES) \ - $(libzookeeper_st_la_SOURCES) $(cli_mt_SOURCES) \ - $(cli_st_SOURCES) $(load_gen_SOURCES) \ - $(nodist_zktest_mt_SOURCES) $(nodist_zktest_st_SOURCES) -DIST_SOURCES = $(libhashtable_la_SOURCES) \ - $(am__libzkmt_la_SOURCES_DIST) $(libzkst_la_SOURCES) \ - $(libzookeeper_mt_la_SOURCES) $(libzookeeper_st_la_SOURCES) \ - $(am__cli_mt_SOURCES_DIST) $(cli_st_SOURCES) \ - $(am__load_gen_SOURCES_DIST) -am__can_run_installinfo = \ - case $$AM_UPDATE_INFO_DIR in \ - n|no|NO) false;; \ - *) (install-info --version) >/dev/null 2>&1;; \ - esac -HEADERS = $(pkginclude_HEADERS) -ETAGS = etags -CTAGS = ctags -DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) -distdir = $(PACKAGE)-$(VERSION) -top_distdir = $(distdir) -am__remove_distdir = \ - if test -d "$(distdir)"; then \ - find "$(distdir)" -type d ! -perm -200 -exec chmod u+w {} ';' \ - && rm -rf "$(distdir)" \ - || { sleep 5 && rm -rf "$(distdir)"; }; \ - else :; fi -DIST_ARCHIVES = $(distdir).tar.gz -GZIP_ENV = --best -distuninstallcheck_listfiles = find . -type f -print -am__distuninstallcheck_listfiles = $(distuninstallcheck_listfiles) \ - | sed 's|^\./|$(prefix)/|' | grep -v '$(infodir)/dir$$' -distcleancheck_listfiles = find . -type f -print -ACLOCAL = @ACLOCAL@ -AMTAR = @AMTAR@ -AR = @AR@ -AUTOCONF = @AUTOCONF@ -AUTOHEADER = @AUTOHEADER@ -AUTOMAKE = @AUTOMAKE@ -AWK = @AWK@ -CC = @CC@ -CCDEPMODE = @CCDEPMODE@ -CFLAGS = @CFLAGS@ -CPP = @CPP@ -CPPFLAGS = @CPPFLAGS@ -CPPUNIT_CFLAGS = @CPPUNIT_CFLAGS@ -CPPUNIT_CONFIG = @CPPUNIT_CONFIG@ -CPPUNIT_LIBS = @CPPUNIT_LIBS@ -CXX = @CXX@ -CXXCPP = @CXXCPP@ -CXXDEPMODE = @CXXDEPMODE@ -CXXFLAGS = @CXXFLAGS@ -CYGPATH_W = @CYGPATH_W@ -DEFS = @DEFS@ -DEPDIR = @DEPDIR@ -DLLTOOL = @DLLTOOL@ -DOXYGEN_PAPER_SIZE = @DOXYGEN_PAPER_SIZE@ -DSYMUTIL = @DSYMUTIL@ -DUMPBIN = @DUMPBIN@ -DX_CONFIG = @DX_CONFIG@ -DX_DOCDIR = @DX_DOCDIR@ -DX_DOT = @DX_DOT@ -DX_DOXYGEN = @DX_DOXYGEN@ -DX_DVIPS = @DX_DVIPS@ -DX_EGREP = @DX_EGREP@ -DX_ENV = @DX_ENV@ -DX_FLAG_chi = @DX_FLAG_chi@ -DX_FLAG_chm = @DX_FLAG_chm@ -DX_FLAG_doc = @DX_FLAG_doc@ -DX_FLAG_dot = @DX_FLAG_dot@ -DX_FLAG_html = @DX_FLAG_html@ -DX_FLAG_man = @DX_FLAG_man@ -DX_FLAG_pdf = @DX_FLAG_pdf@ -DX_FLAG_ps = @DX_FLAG_ps@ -DX_FLAG_rtf = @DX_FLAG_rtf@ -DX_FLAG_xml = @DX_FLAG_xml@ -DX_HHC = @DX_HHC@ -DX_LATEX = @DX_LATEX@ -DX_MAKEINDEX = @DX_MAKEINDEX@ -DX_PDFLATEX = @DX_PDFLATEX@ -DX_PERL = @DX_PERL@ -DX_PROJECT = @DX_PROJECT@ -ECHO_C = @ECHO_C@ -ECHO_N = @ECHO_N@ -ECHO_T = @ECHO_T@ -EGREP = @EGREP@ -EXEEXT = @EXEEXT@ -FGREP = @FGREP@ -GREP = @GREP@ -INSTALL = @INSTALL@ -INSTALL_DATA = @INSTALL_DATA@ -INSTALL_PROGRAM = @INSTALL_PROGRAM@ -INSTALL_SCRIPT = @INSTALL_SCRIPT@ -INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ -LD = @LD@ -LDFLAGS = @LDFLAGS@ -LIBOBJS = @LIBOBJS@ -LIBS = @LIBS@ -LIBTOOL = @LIBTOOL@ -LIPO = @LIPO@ -LN_S = @LN_S@ -LTLIBOBJS = @LTLIBOBJS@ -MAKEINFO = @MAKEINFO@ -MANIFEST_TOOL = @MANIFEST_TOOL@ -MKDIR_P = @MKDIR_P@ -NM = @NM@ -NMEDIT = @NMEDIT@ -OBJDUMP = @OBJDUMP@ -OBJEXT = @OBJEXT@ -OTOOL = @OTOOL@ -OTOOL64 = @OTOOL64@ -PACKAGE = @PACKAGE@ -PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ -PACKAGE_NAME = @PACKAGE_NAME@ -PACKAGE_STRING = @PACKAGE_STRING@ -PACKAGE_TARNAME = @PACKAGE_TARNAME@ -PACKAGE_URL = @PACKAGE_URL@ -PACKAGE_VERSION = @PACKAGE_VERSION@ -PATH_SEPARATOR = @PATH_SEPARATOR@ -RANLIB = @RANLIB@ -SED = @SED@ -SET_MAKE = @SET_MAKE@ -SHELL = @SHELL@ -STRIP = @STRIP@ -USEIPV6 = @USEIPV6@ -VERSION = @VERSION@ -abs_builddir = @abs_builddir@ -abs_srcdir = @abs_srcdir@ -abs_top_builddir = @abs_top_builddir@ -abs_top_srcdir = @abs_top_srcdir@ -ac_ct_AR = @ac_ct_AR@ -ac_ct_CC = @ac_ct_CC@ -ac_ct_CXX = @ac_ct_CXX@ -ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ -am__include = @am__include@ -am__leading_dot = @am__leading_dot@ -am__quote = @am__quote@ -am__tar = @am__tar@ -am__untar = @am__untar@ -bindir = @bindir@ -build = @build@ -build_alias = @build_alias@ -build_cpu = @build_cpu@ -build_os = @build_os@ -build_vendor = @build_vendor@ -builddir = @builddir@ -datadir = @datadir@ -datarootdir = @datarootdir@ -docdir = @docdir@ -dvidir = @dvidir@ -exec_prefix = @exec_prefix@ -host = @host@ -host_alias = @host_alias@ -host_cpu = @host_cpu@ -host_os = @host_os@ -host_vendor = @host_vendor@ -htmldir = @htmldir@ -includedir = @includedir@ -infodir = @infodir@ -install_sh = @install_sh@ -libdir = @libdir@ -libexecdir = @libexecdir@ -localedir = @localedir@ -localstatedir = @localstatedir@ -mandir = @mandir@ -mkdir_p = @mkdir_p@ -oldincludedir = @oldincludedir@ -pdfdir = @pdfdir@ -prefix = @prefix@ -program_transform_name = @program_transform_name@ -psdir = @psdir@ -sbindir = @sbindir@ -sharedstatedir = @sharedstatedir@ -srcdir = @srcdir@ -sysconfdir = @sysconfdir@ -target_alias = @target_alias@ -top_build_prefix = @top_build_prefix@ -top_builddir = @top_builddir@ -top_srcdir = @top_srcdir@ -@DX_COND_doc_TRUE@@DX_COND_html_TRUE@DX_CLEAN_HTML = @DX_DOCDIR@/html -@DX_COND_chm_TRUE@@DX_COND_doc_TRUE@DX_CLEAN_CHM = @DX_DOCDIR@/chm -@DX_COND_chi_TRUE@@DX_COND_chm_TRUE@@DX_COND_doc_TRUE@DX_CLEAN_CHI = @DX_DOCDIR@/@PACKAGE@.chi -@DX_COND_doc_TRUE@@DX_COND_man_TRUE@DX_CLEAN_MAN = @DX_DOCDIR@/man -@DX_COND_doc_TRUE@@DX_COND_rtf_TRUE@DX_CLEAN_RTF = @DX_DOCDIR@/rtf -@DX_COND_doc_TRUE@@DX_COND_xml_TRUE@DX_CLEAN_XML = @DX_DOCDIR@/xml -@DX_COND_doc_TRUE@@DX_COND_ps_TRUE@DX_CLEAN_PS = @DX_DOCDIR@/@PACKAGE@.ps -@DX_COND_doc_TRUE@@DX_COND_ps_TRUE@DX_PS_GOAL = doxygen-ps -@DX_COND_doc_TRUE@@DX_COND_pdf_TRUE@DX_CLEAN_PDF = @DX_DOCDIR@/@PACKAGE@.pdf -@DX_COND_doc_TRUE@@DX_COND_pdf_TRUE@DX_PDF_GOAL = doxygen-pdf -@DX_COND_doc_TRUE@@DX_COND_latex_TRUE@DX_CLEAN_LATEX = @DX_DOCDIR@/latex -@DX_COND_doc_TRUE@DX_CLEANFILES = \ -@DX_COND_doc_TRUE@ @DX_DOCDIR@/@PACKAGE@.tag \ -@DX_COND_doc_TRUE@ -r \ -@DX_COND_doc_TRUE@ $(DX_CLEAN_HTML) \ -@DX_COND_doc_TRUE@ $(DX_CLEAN_CHM) \ -@DX_COND_doc_TRUE@ $(DX_CLEAN_CHI) \ -@DX_COND_doc_TRUE@ $(DX_CLEAN_MAN) \ -@DX_COND_doc_TRUE@ $(DX_CLEAN_RTF) \ -@DX_COND_doc_TRUE@ $(DX_CLEAN_XML) \ -@DX_COND_doc_TRUE@ $(DX_CLEAN_PS) \ -@DX_COND_doc_TRUE@ $(DX_CLEAN_PDF) \ -@DX_COND_doc_TRUE@ $(DX_CLEAN_LATEX) - - -# need this for Doxygen integration -AM_CPPFLAGS = -I${srcdir}/include -I${srcdir}/tests -I${srcdir}/generated -AM_CFLAGS = -Wall -Werror -AM_CXXFLAGS = -Wall $(USEIPV6) -LIB_LDFLAGS = -no-undefined -version-info 2 -pkginclude_HEADERS = include/zookeeper.h include/zookeeper_version.h include/zookeeper_log.h include/proto.h include/recordio.h generated/zookeeper.jute.h - -######################################################################### -# build and run unit tests -EXTRA_DIST = LICENSE $(wildcard ${srcdir}/tests/*.cc) $(wildcard \ - ${srcdir}/tests/*.h) ${srcdir}/tests/wrappers.opt \ - ${srcdir}/tests/wrappers-mt.opt -HASHTABLE_SRC = src/hashtable/hashtable_itr.h src/hashtable/hashtable_itr.c \ - src/hashtable/hashtable_private.h src/hashtable/hashtable.h src/hashtable/hashtable.c - -noinst_LTLIBRARIES = libhashtable.la libzkst.la $(am__append_1) -libhashtable_la_SOURCES = $(HASHTABLE_SRC) -COMMON_SRC = src/zookeeper.c include/zookeeper.h include/zookeeper_version.h include/zookeeper_log.h\ - src/recordio.c include/recordio.h include/proto.h \ - src/zk_adaptor.h generated/zookeeper.jute.c \ - src/zookeeper_log.h src/zk_log.c src/zk_hashtable.h src/zk_hashtable.c - - -# These are the symbols (classes, mostly) we want to export from our library. -EXPORT_SYMBOLS = '(zoo_|zookeeper_|zhandle|Z|format_log_message|log_message|logLevel|deallocate_|zerror|is_unrecoverable)' -libzkst_la_SOURCES = $(COMMON_SRC) src/st_adaptor.c -libzkst_la_LIBADD = -lm -lib_LTLIBRARIES = libzookeeper_st.la $(am__append_2) -libzookeeper_st_la_SOURCES = -libzookeeper_st_la_LIBADD = libzkst.la libhashtable.la -libzookeeper_st_la_DEPENDENCIES = libzkst.la libhashtable.la -libzookeeper_st_la_LDFLAGS = $(LIB_LDFLAGS) -export-symbols-regex $(EXPORT_SYMBOLS) -@WANT_SYNCAPI_TRUE@libzkmt_la_SOURCES = $(COMMON_SRC) src/mt_adaptor.c -@WANT_SYNCAPI_TRUE@libzkmt_la_CFLAGS = -DTHREADED -@WANT_SYNCAPI_TRUE@libzkmt_la_LIBADD = -lm -@WANT_SYNCAPI_TRUE@libzookeeper_mt_la_SOURCES = -@WANT_SYNCAPI_TRUE@libzookeeper_mt_la_LIBADD = libzkmt.la libhashtable.la -lpthread -@WANT_SYNCAPI_TRUE@libzookeeper_mt_la_DEPENDENCIES = libzkmt.la libhashtable.la -@WANT_SYNCAPI_TRUE@libzookeeper_mt_la_LDFLAGS = $(LIB_LDFLAGS) -export-symbols-regex $(EXPORT_SYMBOLS) -cli_st_SOURCES = src/cli.c -cli_st_LDADD = libzookeeper_st.la -@WANT_SYNCAPI_TRUE@cli_mt_SOURCES = src/cli.c -@WANT_SYNCAPI_TRUE@cli_mt_LDADD = libzookeeper_mt.la -@WANT_SYNCAPI_TRUE@cli_mt_CFLAGS = -DTHREADED -@WANT_SYNCAPI_TRUE@load_gen_SOURCES = src/load_gen.c -@WANT_SYNCAPI_TRUE@load_gen_LDADD = libzookeeper_mt.la -@WANT_SYNCAPI_TRUE@load_gen_CFLAGS = -DTHREADED -TEST_SOURCES = tests/TestDriver.cc tests/LibCMocks.cc tests/LibCSymTable.cc \ - tests/MocksBase.cc tests/ZKMocks.cc tests/Util.cc tests/ThreadingUtil.cc \ - tests/TestClientRetry.cc \ - tests/TestOperations.cc tests/TestZookeeperInit.cc \ - tests/TestZookeeperClose.cc tests/TestClient.cc \ - tests/TestMulti.cc tests/TestWatchers.cc - -SYMBOL_WRAPPERS = $(shell cat ${srcdir}/tests/wrappers.opt) -nodist_zktest_st_SOURCES = $(TEST_SOURCES) -zktest_st_LDADD = libzkst.la libhashtable.la $(CPPUNIT_LIBS) -zktest_st_CXXFLAGS = -DUSE_STATIC_LIB $(CPPUNIT_CFLAGS) $(USEIPV6) -zktest_st_LDFLAGS = -static-libtool-libs $(SYMBOL_WRAPPERS) -@WANT_SYNCAPI_TRUE@nodist_zktest_mt_SOURCES = $(TEST_SOURCES) tests/PthreadMocks.cc -@WANT_SYNCAPI_TRUE@zktest_mt_LDADD = libzkmt.la libhashtable.la -lpthread $(CPPUNIT_LIBS) -@WANT_SYNCAPI_TRUE@zktest_mt_CXXFLAGS = -DUSE_STATIC_LIB -DTHREADED $(CPPUNIT_CFLAGS) $(USEIPV6) -@WANT_SYNCAPI_TRUE@SYMBOL_WRAPPERS_MT = $(SYMBOL_WRAPPERS) $(shell cat ${srcdir}/tests/wrappers-mt.opt) -@WANT_SYNCAPI_TRUE@zktest_mt_LDFLAGS = -static-libtool-libs $(SYMBOL_WRAPPERS_MT) -all: config.h - $(MAKE) $(AM_MAKEFLAGS) all-am - -.SUFFIXES: -.SUFFIXES: .c .cc .lo .o .obj -am--refresh: Makefile - @: -$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(top_srcdir)/aminclude.am $(am__configure_deps) - @for dep in $?; do \ - case '$(am__configure_deps)' in \ - *$$dep*) \ - echo ' cd $(srcdir) && $(AUTOMAKE) --foreign'; \ - $(am__cd) $(srcdir) && $(AUTOMAKE) --foreign \ - && exit 0; \ - exit 1;; \ - esac; \ - done; \ - echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign Makefile'; \ - $(am__cd) $(top_srcdir) && \ - $(AUTOMAKE) --foreign Makefile -.PRECIOUS: Makefile -Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status - @case '$?' in \ - *config.status*) \ - echo ' $(SHELL) ./config.status'; \ - $(SHELL) ./config.status;; \ - *) \ - echo ' cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe)'; \ - cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe);; \ - esac; -$(top_srcdir)/aminclude.am: - -$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) - $(SHELL) ./config.status --recheck - -$(top_srcdir)/configure: $(am__configure_deps) - $(am__cd) $(srcdir) && $(AUTOCONF) -$(ACLOCAL_M4): $(am__aclocal_m4_deps) - $(am__cd) $(srcdir) && $(ACLOCAL) $(ACLOCAL_AMFLAGS) -$(am__aclocal_m4_deps): - -config.h: stamp-h1 - @if test ! -f $@; then rm -f stamp-h1; else :; fi - @if test ! -f $@; then $(MAKE) $(AM_MAKEFLAGS) stamp-h1; else :; fi - -stamp-h1: $(srcdir)/config.h.in $(top_builddir)/config.status - @rm -f stamp-h1 - cd $(top_builddir) && $(SHELL) ./config.status config.h -$(srcdir)/config.h.in: $(am__configure_deps) - ($(am__cd) $(top_srcdir) && $(AUTOHEADER)) - rm -f stamp-h1 - touch $@ - -distclean-hdr: - -rm -f config.h stamp-h1 -install-libLTLIBRARIES: $(lib_LTLIBRARIES) - @$(NORMAL_INSTALL) - @list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \ - list2=; for p in $$list; do \ - if test -f $$p; then \ - list2="$$list2 $$p"; \ - else :; fi; \ - done; \ - test -z "$$list2" || { \ - echo " $(MKDIR_P) '$(DESTDIR)$(libdir)'"; \ - $(MKDIR_P) "$(DESTDIR)$(libdir)" || exit 1; \ - echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(libdir)'"; \ - $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(libdir)"; \ - } - -uninstall-libLTLIBRARIES: - @$(NORMAL_UNINSTALL) - @list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \ - for p in $$list; do \ - $(am__strip_dir) \ - echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(libdir)/$$f'"; \ - $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(libdir)/$$f"; \ - done - -clean-libLTLIBRARIES: - -test -z "$(lib_LTLIBRARIES)" || rm -f $(lib_LTLIBRARIES) - @list='$(lib_LTLIBRARIES)'; for p in $$list; do \ - dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ - test "$$dir" != "$$p" || dir=.; \ - echo "rm -f \"$${dir}/so_locations\""; \ - rm -f "$${dir}/so_locations"; \ - done - -clean-noinstLTLIBRARIES: - -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) - @list='$(noinst_LTLIBRARIES)'; for p in $$list; do \ - dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ - test "$$dir" != "$$p" || dir=.; \ - echo "rm -f \"$${dir}/so_locations\""; \ - rm -f "$${dir}/so_locations"; \ - done -libhashtable.la: $(libhashtable_la_OBJECTS) $(libhashtable_la_DEPENDENCIES) $(EXTRA_libhashtable_la_DEPENDENCIES) - $(LINK) $(libhashtable_la_OBJECTS) $(libhashtable_la_LIBADD) $(LIBS) -libzkmt.la: $(libzkmt_la_OBJECTS) $(libzkmt_la_DEPENDENCIES) $(EXTRA_libzkmt_la_DEPENDENCIES) - $(libzkmt_la_LINK) $(am_libzkmt_la_rpath) $(libzkmt_la_OBJECTS) $(libzkmt_la_LIBADD) $(LIBS) -libzkst.la: $(libzkst_la_OBJECTS) $(libzkst_la_DEPENDENCIES) $(EXTRA_libzkst_la_DEPENDENCIES) - $(LINK) $(libzkst_la_OBJECTS) $(libzkst_la_LIBADD) $(LIBS) -libzookeeper_mt.la: $(libzookeeper_mt_la_OBJECTS) $(libzookeeper_mt_la_DEPENDENCIES) $(EXTRA_libzookeeper_mt_la_DEPENDENCIES) - $(libzookeeper_mt_la_LINK) $(am_libzookeeper_mt_la_rpath) $(libzookeeper_mt_la_OBJECTS) $(libzookeeper_mt_la_LIBADD) $(LIBS) -libzookeeper_st.la: $(libzookeeper_st_la_OBJECTS) $(libzookeeper_st_la_DEPENDENCIES) $(EXTRA_libzookeeper_st_la_DEPENDENCIES) - $(libzookeeper_st_la_LINK) -rpath $(libdir) $(libzookeeper_st_la_OBJECTS) $(libzookeeper_st_la_LIBADD) $(LIBS) -install-binPROGRAMS: $(bin_PROGRAMS) - @$(NORMAL_INSTALL) - @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \ - if test -n "$$list"; then \ - echo " $(MKDIR_P) '$(DESTDIR)$(bindir)'"; \ - $(MKDIR_P) "$(DESTDIR)$(bindir)" || exit 1; \ - fi; \ - for p in $$list; do echo "$$p $$p"; done | \ - sed 's/$(EXEEXT)$$//' | \ - while read p p1; do if test -f $$p || test -f $$p1; \ - then echo "$$p"; echo "$$p"; else :; fi; \ - done | \ - sed -e 'p;s,.*/,,;n;h' -e 's|.*|.|' \ - -e 'p;x;s,.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/' | \ - sed 'N;N;N;s,\n, ,g' | \ - $(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1 } \ - { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \ - if ($$2 == $$4) files[d] = files[d] " " $$1; \ - else { print "f", $$3 "/" $$4, $$1; } } \ - END { for (d in files) print "f", d, files[d] }' | \ - while read type dir files; do \ - if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \ - test -z "$$files" || { \ - echo " $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files '$(DESTDIR)$(bindir)$$dir'"; \ - $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files "$(DESTDIR)$(bindir)$$dir" || exit $$?; \ - } \ - ; done - -uninstall-binPROGRAMS: - @$(NORMAL_UNINSTALL) - @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \ - files=`for p in $$list; do echo "$$p"; done | \ - sed -e 'h;s,^.*/,,;s/$(EXEEXT)$$//;$(transform)' \ - -e 's/$$/$(EXEEXT)/' `; \ - test -n "$$list" || exit 0; \ - echo " ( cd '$(DESTDIR)$(bindir)' && rm -f" $$files ")"; \ - cd "$(DESTDIR)$(bindir)" && rm -f $$files - -clean-binPROGRAMS: - @list='$(bin_PROGRAMS)'; test -n "$$list" || exit 0; \ - echo " rm -f" $$list; \ - rm -f $$list || exit $$?; \ - test -n "$(EXEEXT)" || exit 0; \ - list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ - echo " rm -f" $$list; \ - rm -f $$list - -clean-checkPROGRAMS: - @list='$(check_PROGRAMS)'; test -n "$$list" || exit 0; \ - echo " rm -f" $$list; \ - rm -f $$list || exit $$?; \ - test -n "$(EXEEXT)" || exit 0; \ - list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ - echo " rm -f" $$list; \ - rm -f $$list -cli_mt$(EXEEXT): $(cli_mt_OBJECTS) $(cli_mt_DEPENDENCIES) $(EXTRA_cli_mt_DEPENDENCIES) - @rm -f cli_mt$(EXEEXT) - $(cli_mt_LINK) $(cli_mt_OBJECTS) $(cli_mt_LDADD) $(LIBS) -cli_st$(EXEEXT): $(cli_st_OBJECTS) $(cli_st_DEPENDENCIES) $(EXTRA_cli_st_DEPENDENCIES) - @rm -f cli_st$(EXEEXT) - $(LINK) $(cli_st_OBJECTS) $(cli_st_LDADD) $(LIBS) -load_gen$(EXEEXT): $(load_gen_OBJECTS) $(load_gen_DEPENDENCIES) $(EXTRA_load_gen_DEPENDENCIES) - @rm -f load_gen$(EXEEXT) - $(load_gen_LINK) $(load_gen_OBJECTS) $(load_gen_LDADD) $(LIBS) -zktest-mt$(EXEEXT): $(zktest_mt_OBJECTS) $(zktest_mt_DEPENDENCIES) $(EXTRA_zktest_mt_DEPENDENCIES) - @rm -f zktest-mt$(EXEEXT) - $(zktest_mt_LINK) $(zktest_mt_OBJECTS) $(zktest_mt_LDADD) $(LIBS) -zktest-st$(EXEEXT): $(zktest_st_OBJECTS) $(zktest_st_DEPENDENCIES) $(EXTRA_zktest_st_DEPENDENCIES) - @rm -f zktest-st$(EXEEXT) - $(zktest_st_LINK) $(zktest_st_OBJECTS) $(zktest_st_LDADD) $(LIBS) - -mostlyclean-compile: - -rm -f *.$(OBJEXT) - -distclean-compile: - -rm -f *.tab.c - -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cli.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cli_mt-cli.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hashtable.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hashtable_itr.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libzkmt_la-mt_adaptor.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libzkmt_la-recordio.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libzkmt_la-zk_hashtable.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libzkmt_la-zk_log.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libzkmt_la-zookeeper.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libzkmt_la-zookeeper.jute.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/load_gen-load_gen.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/recordio.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/st_adaptor.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/zk_hashtable.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/zk_log.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/zktest_mt-LibCMocks.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/zktest_mt-LibCSymTable.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/zktest_mt-MocksBase.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/zktest_mt-PthreadMocks.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/zktest_mt-TestClient.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/zktest_mt-TestClientRetry.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/zktest_mt-TestDriver.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/zktest_mt-TestMulti.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/zktest_mt-TestOperations.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/zktest_mt-TestWatchers.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/zktest_mt-TestZookeeperClose.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/zktest_mt-TestZookeeperInit.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/zktest_mt-ThreadingUtil.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/zktest_mt-Util.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/zktest_mt-ZKMocks.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/zktest_st-LibCMocks.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/zktest_st-LibCSymTable.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/zktest_st-MocksBase.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/zktest_st-TestClient.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/zktest_st-TestClientRetry.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/zktest_st-TestDriver.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/zktest_st-TestMulti.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/zktest_st-TestOperations.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/zktest_st-TestWatchers.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/zktest_st-TestZookeeperClose.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/zktest_st-TestZookeeperInit.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/zktest_st-ThreadingUtil.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/zktest_st-Util.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/zktest_st-ZKMocks.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/zookeeper.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/zookeeper.jute.Plo@am__quote@ - -.c.o: -@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(COMPILE) -c $< - -.c.obj: -@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'` - -.c.lo: -@am__fastdepCC_TRUE@ $(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $< - -hashtable_itr.lo: src/hashtable/hashtable_itr.c -@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT hashtable_itr.lo -MD -MP -MF $(DEPDIR)/hashtable_itr.Tpo -c -o hashtable_itr.lo `test -f 'src/hashtable/hashtable_itr.c' || echo '$(srcdir)/'`src/hashtable/hashtable_itr.c -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/hashtable_itr.Tpo $(DEPDIR)/hashtable_itr.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='src/hashtable/hashtable_itr.c' object='hashtable_itr.lo' libtool=yes @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o hashtable_itr.lo `test -f 'src/hashtable/hashtable_itr.c' || echo '$(srcdir)/'`src/hashtable/hashtable_itr.c - -hashtable.lo: src/hashtable/hashtable.c -@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT hashtable.lo -MD -MP -MF $(DEPDIR)/hashtable.Tpo -c -o hashtable.lo `test -f 'src/hashtable/hashtable.c' || echo '$(srcdir)/'`src/hashtable/hashtable.c -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/hashtable.Tpo $(DEPDIR)/hashtable.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='src/hashtable/hashtable.c' object='hashtable.lo' libtool=yes @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o hashtable.lo `test -f 'src/hashtable/hashtable.c' || echo '$(srcdir)/'`src/hashtable/hashtable.c - -libzkmt_la-zookeeper.lo: src/zookeeper.c -@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libzkmt_la_CFLAGS) $(CFLAGS) -MT libzkmt_la-zookeeper.lo -MD -MP -MF $(DEPDIR)/libzkmt_la-zookeeper.Tpo -c -o libzkmt_la-zookeeper.lo `test -f 'src/zookeeper.c' || echo '$(srcdir)/'`src/zookeeper.c -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libzkmt_la-zookeeper.Tpo $(DEPDIR)/libzkmt_la-zookeeper.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='src/zookeeper.c' object='libzkmt_la-zookeeper.lo' libtool=yes @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libzkmt_la_CFLAGS) $(CFLAGS) -c -o libzkmt_la-zookeeper.lo `test -f 'src/zookeeper.c' || echo '$(srcdir)/'`src/zookeeper.c - -libzkmt_la-recordio.lo: src/recordio.c -@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libzkmt_la_CFLAGS) $(CFLAGS) -MT libzkmt_la-recordio.lo -MD -MP -MF $(DEPDIR)/libzkmt_la-recordio.Tpo -c -o libzkmt_la-recordio.lo `test -f 'src/recordio.c' || echo '$(srcdir)/'`src/recordio.c -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libzkmt_la-recordio.Tpo $(DEPDIR)/libzkmt_la-recordio.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='src/recordio.c' object='libzkmt_la-recordio.lo' libtool=yes @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libzkmt_la_CFLAGS) $(CFLAGS) -c -o libzkmt_la-recordio.lo `test -f 'src/recordio.c' || echo '$(srcdir)/'`src/recordio.c - -libzkmt_la-zookeeper.jute.lo: generated/zookeeper.jute.c -@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libzkmt_la_CFLAGS) $(CFLAGS) -MT libzkmt_la-zookeeper.jute.lo -MD -MP -MF $(DEPDIR)/libzkmt_la-zookeeper.jute.Tpo -c -o libzkmt_la-zookeeper.jute.lo `test -f 'generated/zookeeper.jute.c' || echo '$(srcdir)/'`generated/zookeeper.jute.c -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libzkmt_la-zookeeper.jute.Tpo $(DEPDIR)/libzkmt_la-zookeeper.jute.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='generated/zookeeper.jute.c' object='libzkmt_la-zookeeper.jute.lo' libtool=yes @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libzkmt_la_CFLAGS) $(CFLAGS) -c -o libzkmt_la-zookeeper.jute.lo `test -f 'generated/zookeeper.jute.c' || echo '$(srcdir)/'`generated/zookeeper.jute.c - -libzkmt_la-zk_log.lo: src/zk_log.c -@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libzkmt_la_CFLAGS) $(CFLAGS) -MT libzkmt_la-zk_log.lo -MD -MP -MF $(DEPDIR)/libzkmt_la-zk_log.Tpo -c -o libzkmt_la-zk_log.lo `test -f 'src/zk_log.c' || echo '$(srcdir)/'`src/zk_log.c -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libzkmt_la-zk_log.Tpo $(DEPDIR)/libzkmt_la-zk_log.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='src/zk_log.c' object='libzkmt_la-zk_log.lo' libtool=yes @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libzkmt_la_CFLAGS) $(CFLAGS) -c -o libzkmt_la-zk_log.lo `test -f 'src/zk_log.c' || echo '$(srcdir)/'`src/zk_log.c - -libzkmt_la-zk_hashtable.lo: src/zk_hashtable.c -@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libzkmt_la_CFLAGS) $(CFLAGS) -MT libzkmt_la-zk_hashtable.lo -MD -MP -MF $(DEPDIR)/libzkmt_la-zk_hashtable.Tpo -c -o libzkmt_la-zk_hashtable.lo `test -f 'src/zk_hashtable.c' || echo '$(srcdir)/'`src/zk_hashtable.c -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libzkmt_la-zk_hashtable.Tpo $(DEPDIR)/libzkmt_la-zk_hashtable.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='src/zk_hashtable.c' object='libzkmt_la-zk_hashtable.lo' libtool=yes @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libzkmt_la_CFLAGS) $(CFLAGS) -c -o libzkmt_la-zk_hashtable.lo `test -f 'src/zk_hashtable.c' || echo '$(srcdir)/'`src/zk_hashtable.c - -libzkmt_la-mt_adaptor.lo: src/mt_adaptor.c -@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libzkmt_la_CFLAGS) $(CFLAGS) -MT libzkmt_la-mt_adaptor.lo -MD -MP -MF $(DEPDIR)/libzkmt_la-mt_adaptor.Tpo -c -o libzkmt_la-mt_adaptor.lo `test -f 'src/mt_adaptor.c' || echo '$(srcdir)/'`src/mt_adaptor.c -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libzkmt_la-mt_adaptor.Tpo $(DEPDIR)/libzkmt_la-mt_adaptor.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='src/mt_adaptor.c' object='libzkmt_la-mt_adaptor.lo' libtool=yes @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libzkmt_la_CFLAGS) $(CFLAGS) -c -o libzkmt_la-mt_adaptor.lo `test -f 'src/mt_adaptor.c' || echo '$(srcdir)/'`src/mt_adaptor.c - -zookeeper.lo: src/zookeeper.c -@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT zookeeper.lo -MD -MP -MF $(DEPDIR)/zookeeper.Tpo -c -o zookeeper.lo `test -f 'src/zookeeper.c' || echo '$(srcdir)/'`src/zookeeper.c -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/zookeeper.Tpo $(DEPDIR)/zookeeper.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='src/zookeeper.c' object='zookeeper.lo' libtool=yes @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o zookeeper.lo `test -f 'src/zookeeper.c' || echo '$(srcdir)/'`src/zookeeper.c - -recordio.lo: src/recordio.c -@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT recordio.lo -MD -MP -MF $(DEPDIR)/recordio.Tpo -c -o recordio.lo `test -f 'src/recordio.c' || echo '$(srcdir)/'`src/recordio.c -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/recordio.Tpo $(DEPDIR)/recordio.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='src/recordio.c' object='recordio.lo' libtool=yes @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o recordio.lo `test -f 'src/recordio.c' || echo '$(srcdir)/'`src/recordio.c - -zookeeper.jute.lo: generated/zookeeper.jute.c -@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT zookeeper.jute.lo -MD -MP -MF $(DEPDIR)/zookeeper.jute.Tpo -c -o zookeeper.jute.lo `test -f 'generated/zookeeper.jute.c' || echo '$(srcdir)/'`generated/zookeeper.jute.c -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/zookeeper.jute.Tpo $(DEPDIR)/zookeeper.jute.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='generated/zookeeper.jute.c' object='zookeeper.jute.lo' libtool=yes @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o zookeeper.jute.lo `test -f 'generated/zookeeper.jute.c' || echo '$(srcdir)/'`generated/zookeeper.jute.c - -zk_log.lo: src/zk_log.c -@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT zk_log.lo -MD -MP -MF $(DEPDIR)/zk_log.Tpo -c -o zk_log.lo `test -f 'src/zk_log.c' || echo '$(srcdir)/'`src/zk_log.c -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/zk_log.Tpo $(DEPDIR)/zk_log.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='src/zk_log.c' object='zk_log.lo' libtool=yes @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o zk_log.lo `test -f 'src/zk_log.c' || echo '$(srcdir)/'`src/zk_log.c - -zk_hashtable.lo: src/zk_hashtable.c -@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT zk_hashtable.lo -MD -MP -MF $(DEPDIR)/zk_hashtable.Tpo -c -o zk_hashtable.lo `test -f 'src/zk_hashtable.c' || echo '$(srcdir)/'`src/zk_hashtable.c -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/zk_hashtable.Tpo $(DEPDIR)/zk_hashtable.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='src/zk_hashtable.c' object='zk_hashtable.lo' libtool=yes @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o zk_hashtable.lo `test -f 'src/zk_hashtable.c' || echo '$(srcdir)/'`src/zk_hashtable.c - -st_adaptor.lo: src/st_adaptor.c -@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT st_adaptor.lo -MD -MP -MF $(DEPDIR)/st_adaptor.Tpo -c -o st_adaptor.lo `test -f 'src/st_adaptor.c' || echo '$(srcdir)/'`src/st_adaptor.c -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/st_adaptor.Tpo $(DEPDIR)/st_adaptor.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='src/st_adaptor.c' object='st_adaptor.lo' libtool=yes @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o st_adaptor.lo `test -f 'src/st_adaptor.c' || echo '$(srcdir)/'`src/st_adaptor.c - -cli_mt-cli.o: src/cli.c -@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cli_mt_CFLAGS) $(CFLAGS) -MT cli_mt-cli.o -MD -MP -MF $(DEPDIR)/cli_mt-cli.Tpo -c -o cli_mt-cli.o `test -f 'src/cli.c' || echo '$(srcdir)/'`src/cli.c -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/cli_mt-cli.Tpo $(DEPDIR)/cli_mt-cli.Po -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='src/cli.c' object='cli_mt-cli.o' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cli_mt_CFLAGS) $(CFLAGS) -c -o cli_mt-cli.o `test -f 'src/cli.c' || echo '$(srcdir)/'`src/cli.c - -cli_mt-cli.obj: src/cli.c -@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cli_mt_CFLAGS) $(CFLAGS) -MT cli_mt-cli.obj -MD -MP -MF $(DEPDIR)/cli_mt-cli.Tpo -c -o cli_mt-cli.obj `if test -f 'src/cli.c'; then $(CYGPATH_W) 'src/cli.c'; else $(CYGPATH_W) '$(srcdir)/src/cli.c'; fi` -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/cli_mt-cli.Tpo $(DEPDIR)/cli_mt-cli.Po -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='src/cli.c' object='cli_mt-cli.obj' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cli_mt_CFLAGS) $(CFLAGS) -c -o cli_mt-cli.obj `if test -f 'src/cli.c'; then $(CYGPATH_W) 'src/cli.c'; else $(CYGPATH_W) '$(srcdir)/src/cli.c'; fi` - -cli.o: src/cli.c -@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT cli.o -MD -MP -MF $(DEPDIR)/cli.Tpo -c -o cli.o `test -f 'src/cli.c' || echo '$(srcdir)/'`src/cli.c -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/cli.Tpo $(DEPDIR)/cli.Po -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='src/cli.c' object='cli.o' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o cli.o `test -f 'src/cli.c' || echo '$(srcdir)/'`src/cli.c - -cli.obj: src/cli.c -@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT cli.obj -MD -MP -MF $(DEPDIR)/cli.Tpo -c -o cli.obj `if test -f 'src/cli.c'; then $(CYGPATH_W) 'src/cli.c'; else $(CYGPATH_W) '$(srcdir)/src/cli.c'; fi` -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/cli.Tpo $(DEPDIR)/cli.Po -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='src/cli.c' object='cli.obj' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o cli.obj `if test -f 'src/cli.c'; then $(CYGPATH_W) 'src/cli.c'; else $(CYGPATH_W) '$(srcdir)/src/cli.c'; fi` - -load_gen-load_gen.o: src/load_gen.c -@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(load_gen_CFLAGS) $(CFLAGS) -MT load_gen-load_gen.o -MD -MP -MF $(DEPDIR)/load_gen-load_gen.Tpo -c -o load_gen-load_gen.o `test -f 'src/load_gen.c' || echo '$(srcdir)/'`src/load_gen.c -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/load_gen-load_gen.Tpo $(DEPDIR)/load_gen-load_gen.Po -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='src/load_gen.c' object='load_gen-load_gen.o' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(load_gen_CFLAGS) $(CFLAGS) -c -o load_gen-load_gen.o `test -f 'src/load_gen.c' || echo '$(srcdir)/'`src/load_gen.c - -load_gen-load_gen.obj: src/load_gen.c -@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(load_gen_CFLAGS) $(CFLAGS) -MT load_gen-load_gen.obj -MD -MP -MF $(DEPDIR)/load_gen-load_gen.Tpo -c -o load_gen-load_gen.obj `if test -f 'src/load_gen.c'; then $(CYGPATH_W) 'src/load_gen.c'; else $(CYGPATH_W) '$(srcdir)/src/load_gen.c'; fi` -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/load_gen-load_gen.Tpo $(DEPDIR)/load_gen-load_gen.Po -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='src/load_gen.c' object='load_gen-load_gen.obj' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(load_gen_CFLAGS) $(CFLAGS) -c -o load_gen-load_gen.obj `if test -f 'src/load_gen.c'; then $(CYGPATH_W) 'src/load_gen.c'; else $(CYGPATH_W) '$(srcdir)/src/load_gen.c'; fi` - -.cc.o: -@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< -@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ $< - -.cc.obj: -@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` -@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` - -.cc.lo: -@am__fastdepCXX_TRUE@ $(LTCXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< -@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCXX_FALSE@ $(LTCXXCOMPILE) -c -o $@ $< - -zktest_mt-TestDriver.o: tests/TestDriver.cc -@am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(zktest_mt_CXXFLAGS) $(CXXFLAGS) -MT zktest_mt-TestDriver.o -MD -MP -MF $(DEPDIR)/zktest_mt-TestDriver.Tpo -c -o zktest_mt-TestDriver.o `test -f 'tests/TestDriver.cc' || echo '$(srcdir)/'`tests/TestDriver.cc -@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/zktest_mt-TestDriver.Tpo $(DEPDIR)/zktest_mt-TestDriver.Po -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='tests/TestDriver.cc' object='zktest_mt-TestDriver.o' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(zktest_mt_CXXFLAGS) $(CXXFLAGS) -c -o zktest_mt-TestDriver.o `test -f 'tests/TestDriver.cc' || echo '$(srcdir)/'`tests/TestDriver.cc - -zktest_mt-TestDriver.obj: tests/TestDriver.cc -@am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(zktest_mt_CXXFLAGS) $(CXXFLAGS) -MT zktest_mt-TestDriver.obj -MD -MP -MF $(DEPDIR)/zktest_mt-TestDriver.Tpo -c -o zktest_mt-TestDriver.obj `if test -f 'tests/TestDriver.cc'; then $(CYGPATH_W) 'tests/TestDriver.cc'; else $(CYGPATH_W) '$(srcdir)/tests/TestDriver.cc'; fi` -@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/zktest_mt-TestDriver.Tpo $(DEPDIR)/zktest_mt-TestDriver.Po -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='tests/TestDriver.cc' object='zktest_mt-TestDriver.obj' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(zktest_mt_CXXFLAGS) $(CXXFLAGS) -c -o zktest_mt-TestDriver.obj `if test -f 'tests/TestDriver.cc'; then $(CYGPATH_W) 'tests/TestDriver.cc'; else $(CYGPATH_W) '$(srcdir)/tests/TestDriver.cc'; fi` - -zktest_mt-LibCMocks.o: tests/LibCMocks.cc -@am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(zktest_mt_CXXFLAGS) $(CXXFLAGS) -MT zktest_mt-LibCMocks.o -MD -MP -MF $(DEPDIR)/zktest_mt-LibCMocks.Tpo -c -o zktest_mt-LibCMocks.o `test -f 'tests/LibCMocks.cc' || echo '$(srcdir)/'`tests/LibCMocks.cc -@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/zktest_mt-LibCMocks.Tpo $(DEPDIR)/zktest_mt-LibCMocks.Po -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='tests/LibCMocks.cc' object='zktest_mt-LibCMocks.o' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(zktest_mt_CXXFLAGS) $(CXXFLAGS) -c -o zktest_mt-LibCMocks.o `test -f 'tests/LibCMocks.cc' || echo '$(srcdir)/'`tests/LibCMocks.cc - -zktest_mt-LibCMocks.obj: tests/LibCMocks.cc -@am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(zktest_mt_CXXFLAGS) $(CXXFLAGS) -MT zktest_mt-LibCMocks.obj -MD -MP -MF $(DEPDIR)/zktest_mt-LibCMocks.Tpo -c -o zktest_mt-LibCMocks.obj `if test -f 'tests/LibCMocks.cc'; then $(CYGPATH_W) 'tests/LibCMocks.cc'; else $(CYGPATH_W) '$(srcdir)/tests/LibCMocks.cc'; fi` -@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/zktest_mt-LibCMocks.Tpo $(DEPDIR)/zktest_mt-LibCMocks.Po -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='tests/LibCMocks.cc' object='zktest_mt-LibCMocks.obj' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(zktest_mt_CXXFLAGS) $(CXXFLAGS) -c -o zktest_mt-LibCMocks.obj `if test -f 'tests/LibCMocks.cc'; then $(CYGPATH_W) 'tests/LibCMocks.cc'; else $(CYGPATH_W) '$(srcdir)/tests/LibCMocks.cc'; fi` - -zktest_mt-LibCSymTable.o: tests/LibCSymTable.cc -@am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(zktest_mt_CXXFLAGS) $(CXXFLAGS) -MT zktest_mt-LibCSymTable.o -MD -MP -MF $(DEPDIR)/zktest_mt-LibCSymTable.Tpo -c -o zktest_mt-LibCSymTable.o `test -f 'tests/LibCSymTable.cc' || echo '$(srcdir)/'`tests/LibCSymTable.cc -@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/zktest_mt-LibCSymTable.Tpo $(DEPDIR)/zktest_mt-LibCSymTable.Po -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='tests/LibCSymTable.cc' object='zktest_mt-LibCSymTable.o' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(zktest_mt_CXXFLAGS) $(CXXFLAGS) -c -o zktest_mt-LibCSymTable.o `test -f 'tests/LibCSymTable.cc' || echo '$(srcdir)/'`tests/LibCSymTable.cc - -zktest_mt-LibCSymTable.obj: tests/LibCSymTable.cc -@am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(zktest_mt_CXXFLAGS) $(CXXFLAGS) -MT zktest_mt-LibCSymTable.obj -MD -MP -MF $(DEPDIR)/zktest_mt-LibCSymTable.Tpo -c -o zktest_mt-LibCSymTable.obj `if test -f 'tests/LibCSymTable.cc'; then $(CYGPATH_W) 'tests/LibCSymTable.cc'; else $(CYGPATH_W) '$(srcdir)/tests/LibCSymTable.cc'; fi` -@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/zktest_mt-LibCSymTable.Tpo $(DEPDIR)/zktest_mt-LibCSymTable.Po -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='tests/LibCSymTable.cc' object='zktest_mt-LibCSymTable.obj' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(zktest_mt_CXXFLAGS) $(CXXFLAGS) -c -o zktest_mt-LibCSymTable.obj `if test -f 'tests/LibCSymTable.cc'; then $(CYGPATH_W) 'tests/LibCSymTable.cc'; else $(CYGPATH_W) '$(srcdir)/tests/LibCSymTable.cc'; fi` - -zktest_mt-MocksBase.o: tests/MocksBase.cc -@am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(zktest_mt_CXXFLAGS) $(CXXFLAGS) -MT zktest_mt-MocksBase.o -MD -MP -MF $(DEPDIR)/zktest_mt-MocksBase.Tpo -c -o zktest_mt-MocksBase.o `test -f 'tests/MocksBase.cc' || echo '$(srcdir)/'`tests/MocksBase.cc -@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/zktest_mt-MocksBase.Tpo $(DEPDIR)/zktest_mt-MocksBase.Po -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='tests/MocksBase.cc' object='zktest_mt-MocksBase.o' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(zktest_mt_CXXFLAGS) $(CXXFLAGS) -c -o zktest_mt-MocksBase.o `test -f 'tests/MocksBase.cc' || echo '$(srcdir)/'`tests/MocksBase.cc - -zktest_mt-MocksBase.obj: tests/MocksBase.cc -@am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(zktest_mt_CXXFLAGS) $(CXXFLAGS) -MT zktest_mt-MocksBase.obj -MD -MP -MF $(DEPDIR)/zktest_mt-MocksBase.Tpo -c -o zktest_mt-MocksBase.obj `if test -f 'tests/MocksBase.cc'; then $(CYGPATH_W) 'tests/MocksBase.cc'; else $(CYGPATH_W) '$(srcdir)/tests/MocksBase.cc'; fi` -@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/zktest_mt-MocksBase.Tpo $(DEPDIR)/zktest_mt-MocksBase.Po -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='tests/MocksBase.cc' object='zktest_mt-MocksBase.obj' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(zktest_mt_CXXFLAGS) $(CXXFLAGS) -c -o zktest_mt-MocksBase.obj `if test -f 'tests/MocksBase.cc'; then $(CYGPATH_W) 'tests/MocksBase.cc'; else $(CYGPATH_W) '$(srcdir)/tests/MocksBase.cc'; fi` - -zktest_mt-ZKMocks.o: tests/ZKMocks.cc -@am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(zktest_mt_CXXFLAGS) $(CXXFLAGS) -MT zktest_mt-ZKMocks.o -MD -MP -MF $(DEPDIR)/zktest_mt-ZKMocks.Tpo -c -o zktest_mt-ZKMocks.o `test -f 'tests/ZKMocks.cc' || echo '$(srcdir)/'`tests/ZKMocks.cc -@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/zktest_mt-ZKMocks.Tpo $(DEPDIR)/zktest_mt-ZKMocks.Po -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='tests/ZKMocks.cc' object='zktest_mt-ZKMocks.o' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(zktest_mt_CXXFLAGS) $(CXXFLAGS) -c -o zktest_mt-ZKMocks.o `test -f 'tests/ZKMocks.cc' || echo '$(srcdir)/'`tests/ZKMocks.cc - -zktest_mt-ZKMocks.obj: tests/ZKMocks.cc -@am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(zktest_mt_CXXFLAGS) $(CXXFLAGS) -MT zktest_mt-ZKMocks.obj -MD -MP -MF $(DEPDIR)/zktest_mt-ZKMocks.Tpo -c -o zktest_mt-ZKMocks.obj `if test -f 'tests/ZKMocks.cc'; then $(CYGPATH_W) 'tests/ZKMocks.cc'; else $(CYGPATH_W) '$(srcdir)/tests/ZKMocks.cc'; fi` -@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/zktest_mt-ZKMocks.Tpo $(DEPDIR)/zktest_mt-ZKMocks.Po -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='tests/ZKMocks.cc' object='zktest_mt-ZKMocks.obj' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(zktest_mt_CXXFLAGS) $(CXXFLAGS) -c -o zktest_mt-ZKMocks.obj `if test -f 'tests/ZKMocks.cc'; then $(CYGPATH_W) 'tests/ZKMocks.cc'; else $(CYGPATH_W) '$(srcdir)/tests/ZKMocks.cc'; fi` - -zktest_mt-Util.o: tests/Util.cc -@am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(zktest_mt_CXXFLAGS) $(CXXFLAGS) -MT zktest_mt-Util.o -MD -MP -MF $(DEPDIR)/zktest_mt-Util.Tpo -c -o zktest_mt-Util.o `test -f 'tests/Util.cc' || echo '$(srcdir)/'`tests/Util.cc -@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/zktest_mt-Util.Tpo $(DEPDIR)/zktest_mt-Util.Po -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='tests/Util.cc' object='zktest_mt-Util.o' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(zktest_mt_CXXFLAGS) $(CXXFLAGS) -c -o zktest_mt-Util.o `test -f 'tests/Util.cc' || echo '$(srcdir)/'`tests/Util.cc - -zktest_mt-Util.obj: tests/Util.cc -@am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(zktest_mt_CXXFLAGS) $(CXXFLAGS) -MT zktest_mt-Util.obj -MD -MP -MF $(DEPDIR)/zktest_mt-Util.Tpo -c -o zktest_mt-Util.obj `if test -f 'tests/Util.cc'; then $(CYGPATH_W) 'tests/Util.cc'; else $(CYGPATH_W) '$(srcdir)/tests/Util.cc'; fi` -@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/zktest_mt-Util.Tpo $(DEPDIR)/zktest_mt-Util.Po -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='tests/Util.cc' object='zktest_mt-Util.obj' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(zktest_mt_CXXFLAGS) $(CXXFLAGS) -c -o zktest_mt-Util.obj `if test -f 'tests/Util.cc'; then $(CYGPATH_W) 'tests/Util.cc'; else $(CYGPATH_W) '$(srcdir)/tests/Util.cc'; fi` - -zktest_mt-ThreadingUtil.o: tests/ThreadingUtil.cc -@am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(zktest_mt_CXXFLAGS) $(CXXFLAGS) -MT zktest_mt-ThreadingUtil.o -MD -MP -MF $(DEPDIR)/zktest_mt-ThreadingUtil.Tpo -c -o zktest_mt-ThreadingUtil.o `test -f 'tests/ThreadingUtil.cc' || echo '$(srcdir)/'`tests/ThreadingUtil.cc -@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/zktest_mt-ThreadingUtil.Tpo $(DEPDIR)/zktest_mt-ThreadingUtil.Po -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='tests/ThreadingUtil.cc' object='zktest_mt-ThreadingUtil.o' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(zktest_mt_CXXFLAGS) $(CXXFLAGS) -c -o zktest_mt-ThreadingUtil.o `test -f 'tests/ThreadingUtil.cc' || echo '$(srcdir)/'`tests/ThreadingUtil.cc - -zktest_mt-ThreadingUtil.obj: tests/ThreadingUtil.cc -@am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(zktest_mt_CXXFLAGS) $(CXXFLAGS) -MT zktest_mt-ThreadingUtil.obj -MD -MP -MF $(DEPDIR)/zktest_mt-ThreadingUtil.Tpo -c -o zktest_mt-ThreadingUtil.obj `if test -f 'tests/ThreadingUtil.cc'; then $(CYGPATH_W) 'tests/ThreadingUtil.cc'; else $(CYGPATH_W) '$(srcdir)/tests/ThreadingUtil.cc'; fi` -@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/zktest_mt-ThreadingUtil.Tpo $(DEPDIR)/zktest_mt-ThreadingUtil.Po -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='tests/ThreadingUtil.cc' object='zktest_mt-ThreadingUtil.obj' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(zktest_mt_CXXFLAGS) $(CXXFLAGS) -c -o zktest_mt-ThreadingUtil.obj `if test -f 'tests/ThreadingUtil.cc'; then $(CYGPATH_W) 'tests/ThreadingUtil.cc'; else $(CYGPATH_W) '$(srcdir)/tests/ThreadingUtil.cc'; fi` - -zktest_mt-TestClientRetry.o: tests/TestClientRetry.cc -@am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(zktest_mt_CXXFLAGS) $(CXXFLAGS) -MT zktest_mt-TestClientRetry.o -MD -MP -MF $(DEPDIR)/zktest_mt-TestClientRetry.Tpo -c -o zktest_mt-TestClientRetry.o `test -f 'tests/TestClientRetry.cc' || echo '$(srcdir)/'`tests/TestClientRetry.cc -@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/zktest_mt-TestClientRetry.Tpo $(DEPDIR)/zktest_mt-TestClientRetry.Po -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='tests/TestClientRetry.cc' object='zktest_mt-TestClientRetry.o' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(zktest_mt_CXXFLAGS) $(CXXFLAGS) -c -o zktest_mt-TestClientRetry.o `test -f 'tests/TestClientRetry.cc' || echo '$(srcdir)/'`tests/TestClientRetry.cc - -zktest_mt-TestClientRetry.obj: tests/TestClientRetry.cc -@am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(zktest_mt_CXXFLAGS) $(CXXFLAGS) -MT zktest_mt-TestClientRetry.obj -MD -MP -MF $(DEPDIR)/zktest_mt-TestClientRetry.Tpo -c -o zktest_mt-TestClientRetry.obj `if test -f 'tests/TestClientRetry.cc'; then $(CYGPATH_W) 'tests/TestClientRetry.cc'; else $(CYGPATH_W) '$(srcdir)/tests/TestClientRetry.cc'; fi` -@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/zktest_mt-TestClientRetry.Tpo $(DEPDIR)/zktest_mt-TestClientRetry.Po -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='tests/TestClientRetry.cc' object='zktest_mt-TestClientRetry.obj' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(zktest_mt_CXXFLAGS) $(CXXFLAGS) -c -o zktest_mt-TestClientRetry.obj `if test -f 'tests/TestClientRetry.cc'; then $(CYGPATH_W) 'tests/TestClientRetry.cc'; else $(CYGPATH_W) '$(srcdir)/tests/TestClientRetry.cc'; fi` - -zktest_mt-TestOperations.o: tests/TestOperations.cc -@am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(zktest_mt_CXXFLAGS) $(CXXFLAGS) -MT zktest_mt-TestOperations.o -MD -MP -MF $(DEPDIR)/zktest_mt-TestOperations.Tpo -c -o zktest_mt-TestOperations.o `test -f 'tests/TestOperations.cc' || echo '$(srcdir)/'`tests/TestOperations.cc -@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/zktest_mt-TestOperations.Tpo $(DEPDIR)/zktest_mt-TestOperations.Po -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='tests/TestOperations.cc' object='zktest_mt-TestOperations.o' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(zktest_mt_CXXFLAGS) $(CXXFLAGS) -c -o zktest_mt-TestOperations.o `test -f 'tests/TestOperations.cc' || echo '$(srcdir)/'`tests/TestOperations.cc - -zktest_mt-TestOperations.obj: tests/TestOperations.cc -@am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(zktest_mt_CXXFLAGS) $(CXXFLAGS) -MT zktest_mt-TestOperations.obj -MD -MP -MF $(DEPDIR)/zktest_mt-TestOperations.Tpo -c -o zktest_mt-TestOperations.obj `if test -f 'tests/TestOperations.cc'; then $(CYGPATH_W) 'tests/TestOperations.cc'; else $(CYGPATH_W) '$(srcdir)/tests/TestOperations.cc'; fi` -@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/zktest_mt-TestOperations.Tpo $(DEPDIR)/zktest_mt-TestOperations.Po -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='tests/TestOperations.cc' object='zktest_mt-TestOperations.obj' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(zktest_mt_CXXFLAGS) $(CXXFLAGS) -c -o zktest_mt-TestOperations.obj `if test -f 'tests/TestOperations.cc'; then $(CYGPATH_W) 'tests/TestOperations.cc'; else $(CYGPATH_W) '$(srcdir)/tests/TestOperations.cc'; fi` - -zktest_mt-TestZookeeperInit.o: tests/TestZookeeperInit.cc -@am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(zktest_mt_CXXFLAGS) $(CXXFLAGS) -MT zktest_mt-TestZookeeperInit.o -MD -MP -MF $(DEPDIR)/zktest_mt-TestZookeeperInit.Tpo -c -o zktest_mt-TestZookeeperInit.o `test -f 'tests/TestZookeeperInit.cc' || echo '$(srcdir)/'`tests/TestZookeeperInit.cc -@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/zktest_mt-TestZookeeperInit.Tpo $(DEPDIR)/zktest_mt-TestZookeeperInit.Po -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='tests/TestZookeeperInit.cc' object='zktest_mt-TestZookeeperInit.o' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(zktest_mt_CXXFLAGS) $(CXXFLAGS) -c -o zktest_mt-TestZookeeperInit.o `test -f 'tests/TestZookeeperInit.cc' || echo '$(srcdir)/'`tests/TestZookeeperInit.cc - -zktest_mt-TestZookeeperInit.obj: tests/TestZookeeperInit.cc -@am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(zktest_mt_CXXFLAGS) $(CXXFLAGS) -MT zktest_mt-TestZookeeperInit.obj -MD -MP -MF $(DEPDIR)/zktest_mt-TestZookeeperInit.Tpo -c -o zktest_mt-TestZookeeperInit.obj `if test -f 'tests/TestZookeeperInit.cc'; then $(CYGPATH_W) 'tests/TestZookeeperInit.cc'; else $(CYGPATH_W) '$(srcdir)/tests/TestZookeeperInit.cc'; fi` -@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/zktest_mt-TestZookeeperInit.Tpo $(DEPDIR)/zktest_mt-TestZookeeperInit.Po -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='tests/TestZookeeperInit.cc' object='zktest_mt-TestZookeeperInit.obj' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(zktest_mt_CXXFLAGS) $(CXXFLAGS) -c -o zktest_mt-TestZookeeperInit.obj `if test -f 'tests/TestZookeeperInit.cc'; then $(CYGPATH_W) 'tests/TestZookeeperInit.cc'; else $(CYGPATH_W) '$(srcdir)/tests/TestZookeeperInit.cc'; fi` - -zktest_mt-TestZookeeperClose.o: tests/TestZookeeperClose.cc -@am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(zktest_mt_CXXFLAGS) $(CXXFLAGS) -MT zktest_mt-TestZookeeperClose.o -MD -MP -MF $(DEPDIR)/zktest_mt-TestZookeeperClose.Tpo -c -o zktest_mt-TestZookeeperClose.o `test -f 'tests/TestZookeeperClose.cc' || echo '$(srcdir)/'`tests/TestZookeeperClose.cc -@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/zktest_mt-TestZookeeperClose.Tpo $(DEPDIR)/zktest_mt-TestZookeeperClose.Po -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='tests/TestZookeeperClose.cc' object='zktest_mt-TestZookeeperClose.o' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(zktest_mt_CXXFLAGS) $(CXXFLAGS) -c -o zktest_mt-TestZookeeperClose.o `test -f 'tests/TestZookeeperClose.cc' || echo '$(srcdir)/'`tests/TestZookeeperClose.cc - -zktest_mt-TestZookeeperClose.obj: tests/TestZookeeperClose.cc -@am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(zktest_mt_CXXFLAGS) $(CXXFLAGS) -MT zktest_mt-TestZookeeperClose.obj -MD -MP -MF $(DEPDIR)/zktest_mt-TestZookeeperClose.Tpo -c -o zktest_mt-TestZookeeperClose.obj `if test -f 'tests/TestZookeeperClose.cc'; then $(CYGPATH_W) 'tests/TestZookeeperClose.cc'; else $(CYGPATH_W) '$(srcdir)/tests/TestZookeeperClose.cc'; fi` -@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/zktest_mt-TestZookeeperClose.Tpo $(DEPDIR)/zktest_mt-TestZookeeperClose.Po -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='tests/TestZookeeperClose.cc' object='zktest_mt-TestZookeeperClose.obj' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(zktest_mt_CXXFLAGS) $(CXXFLAGS) -c -o zktest_mt-TestZookeeperClose.obj `if test -f 'tests/TestZookeeperClose.cc'; then $(CYGPATH_W) 'tests/TestZookeeperClose.cc'; else $(CYGPATH_W) '$(srcdir)/tests/TestZookeeperClose.cc'; fi` - -zktest_mt-TestClient.o: tests/TestClient.cc -@am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(zktest_mt_CXXFLAGS) $(CXXFLAGS) -MT zktest_mt-TestClient.o -MD -MP -MF $(DEPDIR)/zktest_mt-TestClient.Tpo -c -o zktest_mt-TestClient.o `test -f 'tests/TestClient.cc' || echo '$(srcdir)/'`tests/TestClient.cc -@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/zktest_mt-TestClient.Tpo $(DEPDIR)/zktest_mt-TestClient.Po -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='tests/TestClient.cc' object='zktest_mt-TestClient.o' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(zktest_mt_CXXFLAGS) $(CXXFLAGS) -c -o zktest_mt-TestClient.o `test -f 'tests/TestClient.cc' || echo '$(srcdir)/'`tests/TestClient.cc - -zktest_mt-TestClient.obj: tests/TestClient.cc -@am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(zktest_mt_CXXFLAGS) $(CXXFLAGS) -MT zktest_mt-TestClient.obj -MD -MP -MF $(DEPDIR)/zktest_mt-TestClient.Tpo -c -o zktest_mt-TestClient.obj `if test -f 'tests/TestClient.cc'; then $(CYGPATH_W) 'tests/TestClient.cc'; else $(CYGPATH_W) '$(srcdir)/tests/TestClient.cc'; fi` -@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/zktest_mt-TestClient.Tpo $(DEPDIR)/zktest_mt-TestClient.Po -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='tests/TestClient.cc' object='zktest_mt-TestClient.obj' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(zktest_mt_CXXFLAGS) $(CXXFLAGS) -c -o zktest_mt-TestClient.obj `if test -f 'tests/TestClient.cc'; then $(CYGPATH_W) 'tests/TestClient.cc'; else $(CYGPATH_W) '$(srcdir)/tests/TestClient.cc'; fi` - -zktest_mt-TestMulti.o: tests/TestMulti.cc -@am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(zktest_mt_CXXFLAGS) $(CXXFLAGS) -MT zktest_mt-TestMulti.o -MD -MP -MF $(DEPDIR)/zktest_mt-TestMulti.Tpo -c -o zktest_mt-TestMulti.o `test -f 'tests/TestMulti.cc' || echo '$(srcdir)/'`tests/TestMulti.cc -@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/zktest_mt-TestMulti.Tpo $(DEPDIR)/zktest_mt-TestMulti.Po -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='tests/TestMulti.cc' object='zktest_mt-TestMulti.o' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(zktest_mt_CXXFLAGS) $(CXXFLAGS) -c -o zktest_mt-TestMulti.o `test -f 'tests/TestMulti.cc' || echo '$(srcdir)/'`tests/TestMulti.cc - -zktest_mt-TestMulti.obj: tests/TestMulti.cc -@am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(zktest_mt_CXXFLAGS) $(CXXFLAGS) -MT zktest_mt-TestMulti.obj -MD -MP -MF $(DEPDIR)/zktest_mt-TestMulti.Tpo -c -o zktest_mt-TestMulti.obj `if test -f 'tests/TestMulti.cc'; then $(CYGPATH_W) 'tests/TestMulti.cc'; else $(CYGPATH_W) '$(srcdir)/tests/TestMulti.cc'; fi` -@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/zktest_mt-TestMulti.Tpo $(DEPDIR)/zktest_mt-TestMulti.Po -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='tests/TestMulti.cc' object='zktest_mt-TestMulti.obj' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(zktest_mt_CXXFLAGS) $(CXXFLAGS) -c -o zktest_mt-TestMulti.obj `if test -f 'tests/TestMulti.cc'; then $(CYGPATH_W) 'tests/TestMulti.cc'; else $(CYGPATH_W) '$(srcdir)/tests/TestMulti.cc'; fi` - -zktest_mt-TestWatchers.o: tests/TestWatchers.cc -@am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(zktest_mt_CXXFLAGS) $(CXXFLAGS) -MT zktest_mt-TestWatchers.o -MD -MP -MF $(DEPDIR)/zktest_mt-TestWatchers.Tpo -c -o zktest_mt-TestWatchers.o `test -f 'tests/TestWatchers.cc' || echo '$(srcdir)/'`tests/TestWatchers.cc -@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/zktest_mt-TestWatchers.Tpo $(DEPDIR)/zktest_mt-TestWatchers.Po -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='tests/TestWatchers.cc' object='zktest_mt-TestWatchers.o' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(zktest_mt_CXXFLAGS) $(CXXFLAGS) -c -o zktest_mt-TestWatchers.o `test -f 'tests/TestWatchers.cc' || echo '$(srcdir)/'`tests/TestWatchers.cc - -zktest_mt-TestWatchers.obj: tests/TestWatchers.cc -@am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(zktest_mt_CXXFLAGS) $(CXXFLAGS) -MT zktest_mt-TestWatchers.obj -MD -MP -MF $(DEPDIR)/zktest_mt-TestWatchers.Tpo -c -o zktest_mt-TestWatchers.obj `if test -f 'tests/TestWatchers.cc'; then $(CYGPATH_W) 'tests/TestWatchers.cc'; else $(CYGPATH_W) '$(srcdir)/tests/TestWatchers.cc'; fi` -@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/zktest_mt-TestWatchers.Tpo $(DEPDIR)/zktest_mt-TestWatchers.Po -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='tests/TestWatchers.cc' object='zktest_mt-TestWatchers.obj' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(zktest_mt_CXXFLAGS) $(CXXFLAGS) -c -o zktest_mt-TestWatchers.obj `if test -f 'tests/TestWatchers.cc'; then $(CYGPATH_W) 'tests/TestWatchers.cc'; else $(CYGPATH_W) '$(srcdir)/tests/TestWatchers.cc'; fi` - -zktest_mt-PthreadMocks.o: tests/PthreadMocks.cc -@am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(zktest_mt_CXXFLAGS) $(CXXFLAGS) -MT zktest_mt-PthreadMocks.o -MD -MP -MF $(DEPDIR)/zktest_mt-PthreadMocks.Tpo -c -o zktest_mt-PthreadMocks.o `test -f 'tests/PthreadMocks.cc' || echo '$(srcdir)/'`tests/PthreadMocks.cc -@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/zktest_mt-PthreadMocks.Tpo $(DEPDIR)/zktest_mt-PthreadMocks.Po -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='tests/PthreadMocks.cc' object='zktest_mt-PthreadMocks.o' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(zktest_mt_CXXFLAGS) $(CXXFLAGS) -c -o zktest_mt-PthreadMocks.o `test -f 'tests/PthreadMocks.cc' || echo '$(srcdir)/'`tests/PthreadMocks.cc - -zktest_mt-PthreadMocks.obj: tests/PthreadMocks.cc -@am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(zktest_mt_CXXFLAGS) $(CXXFLAGS) -MT zktest_mt-PthreadMocks.obj -MD -MP -MF $(DEPDIR)/zktest_mt-PthreadMocks.Tpo -c -o zktest_mt-PthreadMocks.obj `if test -f 'tests/PthreadMocks.cc'; then $(CYGPATH_W) 'tests/PthreadMocks.cc'; else $(CYGPATH_W) '$(srcdir)/tests/PthreadMocks.cc'; fi` -@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/zktest_mt-PthreadMocks.Tpo $(DEPDIR)/zktest_mt-PthreadMocks.Po -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='tests/PthreadMocks.cc' object='zktest_mt-PthreadMocks.obj' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(zktest_mt_CXXFLAGS) $(CXXFLAGS) -c -o zktest_mt-PthreadMocks.obj `if test -f 'tests/PthreadMocks.cc'; then $(CYGPATH_W) 'tests/PthreadMocks.cc'; else $(CYGPATH_W) '$(srcdir)/tests/PthreadMocks.cc'; fi` - -zktest_st-TestDriver.o: tests/TestDriver.cc -@am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(zktest_st_CXXFLAGS) $(CXXFLAGS) -MT zktest_st-TestDriver.o -MD -MP -MF $(DEPDIR)/zktest_st-TestDriver.Tpo -c -o zktest_st-TestDriver.o `test -f 'tests/TestDriver.cc' || echo '$(srcdir)/'`tests/TestDriver.cc -@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/zktest_st-TestDriver.Tpo $(DEPDIR)/zktest_st-TestDriver.Po -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='tests/TestDriver.cc' object='zktest_st-TestDriver.o' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(zktest_st_CXXFLAGS) $(CXXFLAGS) -c -o zktest_st-TestDriver.o `test -f 'tests/TestDriver.cc' || echo '$(srcdir)/'`tests/TestDriver.cc - -zktest_st-TestDriver.obj: tests/TestDriver.cc -@am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(zktest_st_CXXFLAGS) $(CXXFLAGS) -MT zktest_st-TestDriver.obj -MD -MP -MF $(DEPDIR)/zktest_st-TestDriver.Tpo -c -o zktest_st-TestDriver.obj `if test -f 'tests/TestDriver.cc'; then $(CYGPATH_W) 'tests/TestDriver.cc'; else $(CYGPATH_W) '$(srcdir)/tests/TestDriver.cc'; fi` -@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/zktest_st-TestDriver.Tpo $(DEPDIR)/zktest_st-TestDriver.Po -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='tests/TestDriver.cc' object='zktest_st-TestDriver.obj' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(zktest_st_CXXFLAGS) $(CXXFLAGS) -c -o zktest_st-TestDriver.obj `if test -f 'tests/TestDriver.cc'; then $(CYGPATH_W) 'tests/TestDriver.cc'; else $(CYGPATH_W) '$(srcdir)/tests/TestDriver.cc'; fi` - -zktest_st-LibCMocks.o: tests/LibCMocks.cc -@am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(zktest_st_CXXFLAGS) $(CXXFLAGS) -MT zktest_st-LibCMocks.o -MD -MP -MF $(DEPDIR)/zktest_st-LibCMocks.Tpo -c -o zktest_st-LibCMocks.o `test -f 'tests/LibCMocks.cc' || echo '$(srcdir)/'`tests/LibCMocks.cc -@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/zktest_st-LibCMocks.Tpo $(DEPDIR)/zktest_st-LibCMocks.Po -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='tests/LibCMocks.cc' object='zktest_st-LibCMocks.o' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(zktest_st_CXXFLAGS) $(CXXFLAGS) -c -o zktest_st-LibCMocks.o `test -f 'tests/LibCMocks.cc' || echo '$(srcdir)/'`tests/LibCMocks.cc - -zktest_st-LibCMocks.obj: tests/LibCMocks.cc -@am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(zktest_st_CXXFLAGS) $(CXXFLAGS) -MT zktest_st-LibCMocks.obj -MD -MP -MF $(DEPDIR)/zktest_st-LibCMocks.Tpo -c -o zktest_st-LibCMocks.obj `if test -f 'tests/LibCMocks.cc'; then $(CYGPATH_W) 'tests/LibCMocks.cc'; else $(CYGPATH_W) '$(srcdir)/tests/LibCMocks.cc'; fi` -@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/zktest_st-LibCMocks.Tpo $(DEPDIR)/zktest_st-LibCMocks.Po -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='tests/LibCMocks.cc' object='zktest_st-LibCMocks.obj' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(zktest_st_CXXFLAGS) $(CXXFLAGS) -c -o zktest_st-LibCMocks.obj `if test -f 'tests/LibCMocks.cc'; then $(CYGPATH_W) 'tests/LibCMocks.cc'; else $(CYGPATH_W) '$(srcdir)/tests/LibCMocks.cc'; fi` - -zktest_st-LibCSymTable.o: tests/LibCSymTable.cc -@am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(zktest_st_CXXFLAGS) $(CXXFLAGS) -MT zktest_st-LibCSymTable.o -MD -MP -MF $(DEPDIR)/zktest_st-LibCSymTable.Tpo -c -o zktest_st-LibCSymTable.o `test -f 'tests/LibCSymTable.cc' || echo '$(srcdir)/'`tests/LibCSymTable.cc -@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/zktest_st-LibCSymTable.Tpo $(DEPDIR)/zktest_st-LibCSymTable.Po -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='tests/LibCSymTable.cc' object='zktest_st-LibCSymTable.o' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(zktest_st_CXXFLAGS) $(CXXFLAGS) -c -o zktest_st-LibCSymTable.o `test -f 'tests/LibCSymTable.cc' || echo '$(srcdir)/'`tests/LibCSymTable.cc - -zktest_st-LibCSymTable.obj: tests/LibCSymTable.cc -@am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(zktest_st_CXXFLAGS) $(CXXFLAGS) -MT zktest_st-LibCSymTable.obj -MD -MP -MF $(DEPDIR)/zktest_st-LibCSymTable.Tpo -c -o zktest_st-LibCSymTable.obj `if test -f 'tests/LibCSymTable.cc'; then $(CYGPATH_W) 'tests/LibCSymTable.cc'; else $(CYGPATH_W) '$(srcdir)/tests/LibCSymTable.cc'; fi` -@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/zktest_st-LibCSymTable.Tpo $(DEPDIR)/zktest_st-LibCSymTable.Po -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='tests/LibCSymTable.cc' object='zktest_st-LibCSymTable.obj' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(zktest_st_CXXFLAGS) $(CXXFLAGS) -c -o zktest_st-LibCSymTable.obj `if test -f 'tests/LibCSymTable.cc'; then $(CYGPATH_W) 'tests/LibCSymTable.cc'; else $(CYGPATH_W) '$(srcdir)/tests/LibCSymTable.cc'; fi` - -zktest_st-MocksBase.o: tests/MocksBase.cc -@am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(zktest_st_CXXFLAGS) $(CXXFLAGS) -MT zktest_st-MocksBase.o -MD -MP -MF $(DEPDIR)/zktest_st-MocksBase.Tpo -c -o zktest_st-MocksBase.o `test -f 'tests/MocksBase.cc' || echo '$(srcdir)/'`tests/MocksBase.cc -@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/zktest_st-MocksBase.Tpo $(DEPDIR)/zktest_st-MocksBase.Po -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='tests/MocksBase.cc' object='zktest_st-MocksBase.o' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(zktest_st_CXXFLAGS) $(CXXFLAGS) -c -o zktest_st-MocksBase.o `test -f 'tests/MocksBase.cc' || echo '$(srcdir)/'`tests/MocksBase.cc - -zktest_st-MocksBase.obj: tests/MocksBase.cc -@am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(zktest_st_CXXFLAGS) $(CXXFLAGS) -MT zktest_st-MocksBase.obj -MD -MP -MF $(DEPDIR)/zktest_st-MocksBase.Tpo -c -o zktest_st-MocksBase.obj `if test -f 'tests/MocksBase.cc'; then $(CYGPATH_W) 'tests/MocksBase.cc'; else $(CYGPATH_W) '$(srcdir)/tests/MocksBase.cc'; fi` -@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/zktest_st-MocksBase.Tpo $(DEPDIR)/zktest_st-MocksBase.Po -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='tests/MocksBase.cc' object='zktest_st-MocksBase.obj' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(zktest_st_CXXFLAGS) $(CXXFLAGS) -c -o zktest_st-MocksBase.obj `if test -f 'tests/MocksBase.cc'; then $(CYGPATH_W) 'tests/MocksBase.cc'; else $(CYGPATH_W) '$(srcdir)/tests/MocksBase.cc'; fi` - -zktest_st-ZKMocks.o: tests/ZKMocks.cc -@am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(zktest_st_CXXFLAGS) $(CXXFLAGS) -MT zktest_st-ZKMocks.o -MD -MP -MF $(DEPDIR)/zktest_st-ZKMocks.Tpo -c -o zktest_st-ZKMocks.o `test -f 'tests/ZKMocks.cc' || echo '$(srcdir)/'`tests/ZKMocks.cc -@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/zktest_st-ZKMocks.Tpo $(DEPDIR)/zktest_st-ZKMocks.Po -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='tests/ZKMocks.cc' object='zktest_st-ZKMocks.o' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(zktest_st_CXXFLAGS) $(CXXFLAGS) -c -o zktest_st-ZKMocks.o `test -f 'tests/ZKMocks.cc' || echo '$(srcdir)/'`tests/ZKMocks.cc - -zktest_st-ZKMocks.obj: tests/ZKMocks.cc -@am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(zktest_st_CXXFLAGS) $(CXXFLAGS) -MT zktest_st-ZKMocks.obj -MD -MP -MF $(DEPDIR)/zktest_st-ZKMocks.Tpo -c -o zktest_st-ZKMocks.obj `if test -f 'tests/ZKMocks.cc'; then $(CYGPATH_W) 'tests/ZKMocks.cc'; else $(CYGPATH_W) '$(srcdir)/tests/ZKMocks.cc'; fi` -@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/zktest_st-ZKMocks.Tpo $(DEPDIR)/zktest_st-ZKMocks.Po -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='tests/ZKMocks.cc' object='zktest_st-ZKMocks.obj' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(zktest_st_CXXFLAGS) $(CXXFLAGS) -c -o zktest_st-ZKMocks.obj `if test -f 'tests/ZKMocks.cc'; then $(CYGPATH_W) 'tests/ZKMocks.cc'; else $(CYGPATH_W) '$(srcdir)/tests/ZKMocks.cc'; fi` - -zktest_st-Util.o: tests/Util.cc -@am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(zktest_st_CXXFLAGS) $(CXXFLAGS) -MT zktest_st-Util.o -MD -MP -MF $(DEPDIR)/zktest_st-Util.Tpo -c -o zktest_st-Util.o `test -f 'tests/Util.cc' || echo '$(srcdir)/'`tests/Util.cc -@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/zktest_st-Util.Tpo $(DEPDIR)/zktest_st-Util.Po -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='tests/Util.cc' object='zktest_st-Util.o' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(zktest_st_CXXFLAGS) $(CXXFLAGS) -c -o zktest_st-Util.o `test -f 'tests/Util.cc' || echo '$(srcdir)/'`tests/Util.cc - -zktest_st-Util.obj: tests/Util.cc -@am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(zktest_st_CXXFLAGS) $(CXXFLAGS) -MT zktest_st-Util.obj -MD -MP -MF $(DEPDIR)/zktest_st-Util.Tpo -c -o zktest_st-Util.obj `if test -f 'tests/Util.cc'; then $(CYGPATH_W) 'tests/Util.cc'; else $(CYGPATH_W) '$(srcdir)/tests/Util.cc'; fi` -@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/zktest_st-Util.Tpo $(DEPDIR)/zktest_st-Util.Po -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='tests/Util.cc' object='zktest_st-Util.obj' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(zktest_st_CXXFLAGS) $(CXXFLAGS) -c -o zktest_st-Util.obj `if test -f 'tests/Util.cc'; then $(CYGPATH_W) 'tests/Util.cc'; else $(CYGPATH_W) '$(srcdir)/tests/Util.cc'; fi` - -zktest_st-ThreadingUtil.o: tests/ThreadingUtil.cc -@am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(zktest_st_CXXFLAGS) $(CXXFLAGS) -MT zktest_st-ThreadingUtil.o -MD -MP -MF $(DEPDIR)/zktest_st-ThreadingUtil.Tpo -c -o zktest_st-ThreadingUtil.o `test -f 'tests/ThreadingUtil.cc' || echo '$(srcdir)/'`tests/ThreadingUtil.cc -@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/zktest_st-ThreadingUtil.Tpo $(DEPDIR)/zktest_st-ThreadingUtil.Po -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='tests/ThreadingUtil.cc' object='zktest_st-ThreadingUtil.o' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(zktest_st_CXXFLAGS) $(CXXFLAGS) -c -o zktest_st-ThreadingUtil.o `test -f 'tests/ThreadingUtil.cc' || echo '$(srcdir)/'`tests/ThreadingUtil.cc - -zktest_st-ThreadingUtil.obj: tests/ThreadingUtil.cc -@am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(zktest_st_CXXFLAGS) $(CXXFLAGS) -MT zktest_st-ThreadingUtil.obj -MD -MP -MF $(DEPDIR)/zktest_st-ThreadingUtil.Tpo -c -o zktest_st-ThreadingUtil.obj `if test -f 'tests/ThreadingUtil.cc'; then $(CYGPATH_W) 'tests/ThreadingUtil.cc'; else $(CYGPATH_W) '$(srcdir)/tests/ThreadingUtil.cc'; fi` -@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/zktest_st-ThreadingUtil.Tpo $(DEPDIR)/zktest_st-ThreadingUtil.Po -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='tests/ThreadingUtil.cc' object='zktest_st-ThreadingUtil.obj' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(zktest_st_CXXFLAGS) $(CXXFLAGS) -c -o zktest_st-ThreadingUtil.obj `if test -f 'tests/ThreadingUtil.cc'; then $(CYGPATH_W) 'tests/ThreadingUtil.cc'; else $(CYGPATH_W) '$(srcdir)/tests/ThreadingUtil.cc'; fi` - -zktest_st-TestClientRetry.o: tests/TestClientRetry.cc -@am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(zktest_st_CXXFLAGS) $(CXXFLAGS) -MT zktest_st-TestClientRetry.o -MD -MP -MF $(DEPDIR)/zktest_st-TestClientRetry.Tpo -c -o zktest_st-TestClientRetry.o `test -f 'tests/TestClientRetry.cc' || echo '$(srcdir)/'`tests/TestClientRetry.cc -@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/zktest_st-TestClientRetry.Tpo $(DEPDIR)/zktest_st-TestClientRetry.Po -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='tests/TestClientRetry.cc' object='zktest_st-TestClientRetry.o' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(zktest_st_CXXFLAGS) $(CXXFLAGS) -c -o zktest_st-TestClientRetry.o `test -f 'tests/TestClientRetry.cc' || echo '$(srcdir)/'`tests/TestClientRetry.cc - -zktest_st-TestClientRetry.obj: tests/TestClientRetry.cc -@am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(zktest_st_CXXFLAGS) $(CXXFLAGS) -MT zktest_st-TestClientRetry.obj -MD -MP -MF $(DEPDIR)/zktest_st-TestClientRetry.Tpo -c -o zktest_st-TestClientRetry.obj `if test -f 'tests/TestClientRetry.cc'; then $(CYGPATH_W) 'tests/TestClientRetry.cc'; else $(CYGPATH_W) '$(srcdir)/tests/TestClientRetry.cc'; fi` -@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/zktest_st-TestClientRetry.Tpo $(DEPDIR)/zktest_st-TestClientRetry.Po -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='tests/TestClientRetry.cc' object='zktest_st-TestClientRetry.obj' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(zktest_st_CXXFLAGS) $(CXXFLAGS) -c -o zktest_st-TestClientRetry.obj `if test -f 'tests/TestClientRetry.cc'; then $(CYGPATH_W) 'tests/TestClientRetry.cc'; else $(CYGPATH_W) '$(srcdir)/tests/TestClientRetry.cc'; fi` - -zktest_st-TestOperations.o: tests/TestOperations.cc -@am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(zktest_st_CXXFLAGS) $(CXXFLAGS) -MT zktest_st-TestOperations.o -MD -MP -MF $(DEPDIR)/zktest_st-TestOperations.Tpo -c -o zktest_st-TestOperations.o `test -f 'tests/TestOperations.cc' || echo '$(srcdir)/'`tests/TestOperations.cc -@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/zktest_st-TestOperations.Tpo $(DEPDIR)/zktest_st-TestOperations.Po -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='tests/TestOperations.cc' object='zktest_st-TestOperations.o' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(zktest_st_CXXFLAGS) $(CXXFLAGS) -c -o zktest_st-TestOperations.o `test -f 'tests/TestOperations.cc' || echo '$(srcdir)/'`tests/TestOperations.cc - -zktest_st-TestOperations.obj: tests/TestOperations.cc -@am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(zktest_st_CXXFLAGS) $(CXXFLAGS) -MT zktest_st-TestOperations.obj -MD -MP -MF $(DEPDIR)/zktest_st-TestOperations.Tpo -c -o zktest_st-TestOperations.obj `if test -f 'tests/TestOperations.cc'; then $(CYGPATH_W) 'tests/TestOperations.cc'; else $(CYGPATH_W) '$(srcdir)/tests/TestOperations.cc'; fi` -@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/zktest_st-TestOperations.Tpo $(DEPDIR)/zktest_st-TestOperations.Po -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='tests/TestOperations.cc' object='zktest_st-TestOperations.obj' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(zktest_st_CXXFLAGS) $(CXXFLAGS) -c -o zktest_st-TestOperations.obj `if test -f 'tests/TestOperations.cc'; then $(CYGPATH_W) 'tests/TestOperations.cc'; else $(CYGPATH_W) '$(srcdir)/tests/TestOperations.cc'; fi` - -zktest_st-TestZookeeperInit.o: tests/TestZookeeperInit.cc -@am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(zktest_st_CXXFLAGS) $(CXXFLAGS) -MT zktest_st-TestZookeeperInit.o -MD -MP -MF $(DEPDIR)/zktest_st-TestZookeeperInit.Tpo -c -o zktest_st-TestZookeeperInit.o `test -f 'tests/TestZookeeperInit.cc' || echo '$(srcdir)/'`tests/TestZookeeperInit.cc -@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/zktest_st-TestZookeeperInit.Tpo $(DEPDIR)/zktest_st-TestZookeeperInit.Po -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='tests/TestZookeeperInit.cc' object='zktest_st-TestZookeeperInit.o' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(zktest_st_CXXFLAGS) $(CXXFLAGS) -c -o zktest_st-TestZookeeperInit.o `test -f 'tests/TestZookeeperInit.cc' || echo '$(srcdir)/'`tests/TestZookeeperInit.cc - -zktest_st-TestZookeeperInit.obj: tests/TestZookeeperInit.cc -@am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(zktest_st_CXXFLAGS) $(CXXFLAGS) -MT zktest_st-TestZookeeperInit.obj -MD -MP -MF $(DEPDIR)/zktest_st-TestZookeeperInit.Tpo -c -o zktest_st-TestZookeeperInit.obj `if test -f 'tests/TestZookeeperInit.cc'; then $(CYGPATH_W) 'tests/TestZookeeperInit.cc'; else $(CYGPATH_W) '$(srcdir)/tests/TestZookeeperInit.cc'; fi` -@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/zktest_st-TestZookeeperInit.Tpo $(DEPDIR)/zktest_st-TestZookeeperInit.Po -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='tests/TestZookeeperInit.cc' object='zktest_st-TestZookeeperInit.obj' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(zktest_st_CXXFLAGS) $(CXXFLAGS) -c -o zktest_st-TestZookeeperInit.obj `if test -f 'tests/TestZookeeperInit.cc'; then $(CYGPATH_W) 'tests/TestZookeeperInit.cc'; else $(CYGPATH_W) '$(srcdir)/tests/TestZookeeperInit.cc'; fi` - -zktest_st-TestZookeeperClose.o: tests/TestZookeeperClose.cc -@am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(zktest_st_CXXFLAGS) $(CXXFLAGS) -MT zktest_st-TestZookeeperClose.o -MD -MP -MF $(DEPDIR)/zktest_st-TestZookeeperClose.Tpo -c -o zktest_st-TestZookeeperClose.o `test -f 'tests/TestZookeeperClose.cc' || echo '$(srcdir)/'`tests/TestZookeeperClose.cc -@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/zktest_st-TestZookeeperClose.Tpo $(DEPDIR)/zktest_st-TestZookeeperClose.Po -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='tests/TestZookeeperClose.cc' object='zktest_st-TestZookeeperClose.o' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(zktest_st_CXXFLAGS) $(CXXFLAGS) -c -o zktest_st-TestZookeeperClose.o `test -f 'tests/TestZookeeperClose.cc' || echo '$(srcdir)/'`tests/TestZookeeperClose.cc - -zktest_st-TestZookeeperClose.obj: tests/TestZookeeperClose.cc -@am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(zktest_st_CXXFLAGS) $(CXXFLAGS) -MT zktest_st-TestZookeeperClose.obj -MD -MP -MF $(DEPDIR)/zktest_st-TestZookeeperClose.Tpo -c -o zktest_st-TestZookeeperClose.obj `if test -f 'tests/TestZookeeperClose.cc'; then $(CYGPATH_W) 'tests/TestZookeeperClose.cc'; else $(CYGPATH_W) '$(srcdir)/tests/TestZookeeperClose.cc'; fi` -@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/zktest_st-TestZookeeperClose.Tpo $(DEPDIR)/zktest_st-TestZookeeperClose.Po -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='tests/TestZookeeperClose.cc' object='zktest_st-TestZookeeperClose.obj' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(zktest_st_CXXFLAGS) $(CXXFLAGS) -c -o zktest_st-TestZookeeperClose.obj `if test -f 'tests/TestZookeeperClose.cc'; then $(CYGPATH_W) 'tests/TestZookeeperClose.cc'; else $(CYGPATH_W) '$(srcdir)/tests/TestZookeeperClose.cc'; fi` - -zktest_st-TestClient.o: tests/TestClient.cc -@am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(zktest_st_CXXFLAGS) $(CXXFLAGS) -MT zktest_st-TestClient.o -MD -MP -MF $(DEPDIR)/zktest_st-TestClient.Tpo -c -o zktest_st-TestClient.o `test -f 'tests/TestClient.cc' || echo '$(srcdir)/'`tests/TestClient.cc -@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/zktest_st-TestClient.Tpo $(DEPDIR)/zktest_st-TestClient.Po -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='tests/TestClient.cc' object='zktest_st-TestClient.o' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(zktest_st_CXXFLAGS) $(CXXFLAGS) -c -o zktest_st-TestClient.o `test -f 'tests/TestClient.cc' || echo '$(srcdir)/'`tests/TestClient.cc - -zktest_st-TestClient.obj: tests/TestClient.cc -@am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(zktest_st_CXXFLAGS) $(CXXFLAGS) -MT zktest_st-TestClient.obj -MD -MP -MF $(DEPDIR)/zktest_st-TestClient.Tpo -c -o zktest_st-TestClient.obj `if test -f 'tests/TestClient.cc'; then $(CYGPATH_W) 'tests/TestClient.cc'; else $(CYGPATH_W) '$(srcdir)/tests/TestClient.cc'; fi` -@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/zktest_st-TestClient.Tpo $(DEPDIR)/zktest_st-TestClient.Po -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='tests/TestClient.cc' object='zktest_st-TestClient.obj' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(zktest_st_CXXFLAGS) $(CXXFLAGS) -c -o zktest_st-TestClient.obj `if test -f 'tests/TestClient.cc'; then $(CYGPATH_W) 'tests/TestClient.cc'; else $(CYGPATH_W) '$(srcdir)/tests/TestClient.cc'; fi` - -zktest_st-TestMulti.o: tests/TestMulti.cc -@am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(zktest_st_CXXFLAGS) $(CXXFLAGS) -MT zktest_st-TestMulti.o -MD -MP -MF $(DEPDIR)/zktest_st-TestMulti.Tpo -c -o zktest_st-TestMulti.o `test -f 'tests/TestMulti.cc' || echo '$(srcdir)/'`tests/TestMulti.cc -@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/zktest_st-TestMulti.Tpo $(DEPDIR)/zktest_st-TestMulti.Po -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='tests/TestMulti.cc' object='zktest_st-TestMulti.o' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(zktest_st_CXXFLAGS) $(CXXFLAGS) -c -o zktest_st-TestMulti.o `test -f 'tests/TestMulti.cc' || echo '$(srcdir)/'`tests/TestMulti.cc - -zktest_st-TestMulti.obj: tests/TestMulti.cc -@am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(zktest_st_CXXFLAGS) $(CXXFLAGS) -MT zktest_st-TestMulti.obj -MD -MP -MF $(DEPDIR)/zktest_st-TestMulti.Tpo -c -o zktest_st-TestMulti.obj `if test -f 'tests/TestMulti.cc'; then $(CYGPATH_W) 'tests/TestMulti.cc'; else $(CYGPATH_W) '$(srcdir)/tests/TestMulti.cc'; fi` -@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/zktest_st-TestMulti.Tpo $(DEPDIR)/zktest_st-TestMulti.Po -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='tests/TestMulti.cc' object='zktest_st-TestMulti.obj' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(zktest_st_CXXFLAGS) $(CXXFLAGS) -c -o zktest_st-TestMulti.obj `if test -f 'tests/TestMulti.cc'; then $(CYGPATH_W) 'tests/TestMulti.cc'; else $(CYGPATH_W) '$(srcdir)/tests/TestMulti.cc'; fi` - -zktest_st-TestWatchers.o: tests/TestWatchers.cc -@am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(zktest_st_CXXFLAGS) $(CXXFLAGS) -MT zktest_st-TestWatchers.o -MD -MP -MF $(DEPDIR)/zktest_st-TestWatchers.Tpo -c -o zktest_st-TestWatchers.o `test -f 'tests/TestWatchers.cc' || echo '$(srcdir)/'`tests/TestWatchers.cc -@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/zktest_st-TestWatchers.Tpo $(DEPDIR)/zktest_st-TestWatchers.Po -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='tests/TestWatchers.cc' object='zktest_st-TestWatchers.o' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(zktest_st_CXXFLAGS) $(CXXFLAGS) -c -o zktest_st-TestWatchers.o `test -f 'tests/TestWatchers.cc' || echo '$(srcdir)/'`tests/TestWatchers.cc - -zktest_st-TestWatchers.obj: tests/TestWatchers.cc -@am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(zktest_st_CXXFLAGS) $(CXXFLAGS) -MT zktest_st-TestWatchers.obj -MD -MP -MF $(DEPDIR)/zktest_st-TestWatchers.Tpo -c -o zktest_st-TestWatchers.obj `if test -f 'tests/TestWatchers.cc'; then $(CYGPATH_W) 'tests/TestWatchers.cc'; else $(CYGPATH_W) '$(srcdir)/tests/TestWatchers.cc'; fi` -@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/zktest_st-TestWatchers.Tpo $(DEPDIR)/zktest_st-TestWatchers.Po -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='tests/TestWatchers.cc' object='zktest_st-TestWatchers.obj' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(zktest_st_CXXFLAGS) $(CXXFLAGS) -c -o zktest_st-TestWatchers.obj `if test -f 'tests/TestWatchers.cc'; then $(CYGPATH_W) 'tests/TestWatchers.cc'; else $(CYGPATH_W) '$(srcdir)/tests/TestWatchers.cc'; fi` - -mostlyclean-libtool: - -rm -f *.lo - -clean-libtool: - -rm -rf .libs _libs - -distclean-libtool: - -rm -f libtool config.lt -install-pkgincludeHEADERS: $(pkginclude_HEADERS) - @$(NORMAL_INSTALL) - @list='$(pkginclude_HEADERS)'; test -n "$(pkgincludedir)" || list=; \ - if test -n "$$list"; then \ - echo " $(MKDIR_P) '$(DESTDIR)$(pkgincludedir)'"; \ - $(MKDIR_P) "$(DESTDIR)$(pkgincludedir)" || exit 1; \ - fi; \ - for p in $$list; do \ - if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ - echo "$$d$$p"; \ - done | $(am__base_list) | \ - while read files; do \ - echo " $(INSTALL_HEADER) $$files '$(DESTDIR)$(pkgincludedir)'"; \ - $(INSTALL_HEADER) $$files "$(DESTDIR)$(pkgincludedir)" || exit $$?; \ - done - -uninstall-pkgincludeHEADERS: - @$(NORMAL_UNINSTALL) - @list='$(pkginclude_HEADERS)'; test -n "$(pkgincludedir)" || list=; \ - files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ - dir='$(DESTDIR)$(pkgincludedir)'; $(am__uninstall_files_from_dir) - -ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) - list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ - unique=`for i in $$list; do \ - if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ - done | \ - $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ - END { if (nonempty) { for (i in files) print i; }; }'`; \ - mkid -fID $$unique -tags: TAGS - -TAGS: $(HEADERS) $(SOURCES) config.h.in $(TAGS_DEPENDENCIES) \ - $(TAGS_FILES) $(LISP) - set x; \ - here=`pwd`; \ - list='$(SOURCES) $(HEADERS) config.h.in $(LISP) $(TAGS_FILES)'; \ - unique=`for i in $$list; do \ - if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ - done | \ - $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ - END { if (nonempty) { for (i in files) print i; }; }'`; \ - shift; \ - if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ - test -n "$$unique" || unique=$$empty_fix; \ - if test $$# -gt 0; then \ - $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ - "$$@" $$unique; \ - else \ - $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ - $$unique; \ - fi; \ - fi -ctags: CTAGS -CTAGS: $(HEADERS) $(SOURCES) config.h.in $(TAGS_DEPENDENCIES) \ - $(TAGS_FILES) $(LISP) - list='$(SOURCES) $(HEADERS) config.h.in $(LISP) $(TAGS_FILES)'; \ - unique=`for i in $$list; do \ - if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ - done | \ - $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ - END { if (nonempty) { for (i in files) print i; }; }'`; \ - test -z "$(CTAGS_ARGS)$$unique" \ - || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ - $$unique - -GTAGS: - here=`$(am__cd) $(top_builddir) && pwd` \ - && $(am__cd) $(top_srcdir) \ - && gtags -i $(GTAGS_ARGS) "$$here" - -distclean-tags: - -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags - -distdir: $(DISTFILES) - $(am__remove_distdir) - test -d "$(distdir)" || mkdir "$(distdir)" - @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ - topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ - list='$(DISTFILES)'; \ - dist_files=`for file in $$list; do echo $$file; done | \ - sed -e "s|^$$srcdirstrip/||;t" \ - -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ - case $$dist_files in \ - */*) $(MKDIR_P) `echo "$$dist_files" | \ - sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ - sort -u` ;; \ - esac; \ - for file in $$dist_files; do \ - if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ - if test -d $$d/$$file; then \ - dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ - if test -d "$(distdir)/$$file"; then \ - find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ - fi; \ - if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ - cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ - find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ - fi; \ - cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ - else \ - test -f "$(distdir)/$$file" \ - || cp -p $$d/$$file "$(distdir)/$$file" \ - || exit 1; \ - fi; \ - done - -test -n "$(am__skip_mode_fix)" \ - || find "$(distdir)" -type d ! -perm -755 \ - -exec chmod u+rwx,go+rx {} \; -o \ - ! -type d ! -perm -444 -links 1 -exec chmod a+r {} \; -o \ - ! -type d ! -perm -400 -exec chmod a+r {} \; -o \ - ! -type d ! -perm -444 -exec $(install_sh) -c -m a+r {} {} \; \ - || chmod -R a+r "$(distdir)" -dist-gzip: distdir - tardir=$(distdir) && $(am__tar) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz - $(am__remove_distdir) - -dist-bzip2: distdir - tardir=$(distdir) && $(am__tar) | BZIP2=$${BZIP2--9} bzip2 -c >$(distdir).tar.bz2 - $(am__remove_distdir) - -dist-lzip: distdir - tardir=$(distdir) && $(am__tar) | lzip -c $${LZIP_OPT--9} >$(distdir).tar.lz - $(am__remove_distdir) - -dist-lzma: distdir - tardir=$(distdir) && $(am__tar) | lzma -9 -c >$(distdir).tar.lzma - $(am__remove_distdir) - -dist-xz: distdir - tardir=$(distdir) && $(am__tar) | XZ_OPT=$${XZ_OPT--e} xz -c >$(distdir).tar.xz - $(am__remove_distdir) - -dist-tarZ: distdir - tardir=$(distdir) && $(am__tar) | compress -c >$(distdir).tar.Z - $(am__remove_distdir) - -dist-shar: distdir - shar $(distdir) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).shar.gz - $(am__remove_distdir) - -dist-zip: distdir - -rm -f $(distdir).zip - zip -rq $(distdir).zip $(distdir) - $(am__remove_distdir) - -dist dist-all: distdir - tardir=$(distdir) && $(am__tar) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz - $(am__remove_distdir) - -# This target untars the dist file and tries a VPATH configuration. Then -# it guarantees that the distribution is self-contained by making another -# tarfile. -distcheck: dist - case '$(DIST_ARCHIVES)' in \ - *.tar.gz*) \ - GZIP=$(GZIP_ENV) gzip -dc $(distdir).tar.gz | $(am__untar) ;;\ - *.tar.bz2*) \ - bzip2 -dc $(distdir).tar.bz2 | $(am__untar) ;;\ - *.tar.lzma*) \ - lzma -dc $(distdir).tar.lzma | $(am__untar) ;;\ - *.tar.lz*) \ - lzip -dc $(distdir).tar.lz | $(am__untar) ;;\ - *.tar.xz*) \ - xz -dc $(distdir).tar.xz | $(am__untar) ;;\ - *.tar.Z*) \ - uncompress -c $(distdir).tar.Z | $(am__untar) ;;\ - *.shar.gz*) \ - GZIP=$(GZIP_ENV) gzip -dc $(distdir).shar.gz | unshar ;;\ - *.zip*) \ - unzip $(distdir).zip ;;\ - esac - chmod -R a-w $(distdir); chmod u+w $(distdir) - mkdir $(distdir)/_build - mkdir $(distdir)/_inst - chmod a-w $(distdir) - test -d $(distdir)/_build || exit 0; \ - dc_install_base=`$(am__cd) $(distdir)/_inst && pwd | sed -e 's,^[^:\\/]:[\\/],/,'` \ - && dc_destdir="$${TMPDIR-/tmp}/am-dc-$$$$/" \ - && am__cwd=`pwd` \ - && $(am__cd) $(distdir)/_build \ - && ../configure --srcdir=.. --prefix="$$dc_install_base" \ - $(AM_DISTCHECK_CONFIGURE_FLAGS) \ - $(DISTCHECK_CONFIGURE_FLAGS) \ - && $(MAKE) $(AM_MAKEFLAGS) \ - && $(MAKE) $(AM_MAKEFLAGS) dvi \ - && $(MAKE) $(AM_MAKEFLAGS) check \ - && $(MAKE) $(AM_MAKEFLAGS) install \ - && $(MAKE) $(AM_MAKEFLAGS) installcheck \ - && $(MAKE) $(AM_MAKEFLAGS) uninstall \ - && $(MAKE) $(AM_MAKEFLAGS) distuninstallcheck_dir="$$dc_install_base" \ - distuninstallcheck \ - && chmod -R a-w "$$dc_install_base" \ - && ({ \ - (cd ../.. && umask 077 && mkdir "$$dc_destdir") \ - && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" install \ - && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" uninstall \ - && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" \ - distuninstallcheck_dir="$$dc_destdir" distuninstallcheck; \ - } || { rm -rf "$$dc_destdir"; exit 1; }) \ - && rm -rf "$$dc_destdir" \ - && $(MAKE) $(AM_MAKEFLAGS) dist \ - && rm -rf $(DIST_ARCHIVES) \ - && $(MAKE) $(AM_MAKEFLAGS) distcleancheck \ - && cd "$$am__cwd" \ - || exit 1 - $(am__remove_distdir) - @(echo "$(distdir) archives ready for distribution: "; \ - list='$(DIST_ARCHIVES)'; for i in $$list; do echo $$i; done) | \ - sed -e 1h -e 1s/./=/g -e 1p -e 1x -e '$$p' -e '$$x' -distuninstallcheck: - @test -n '$(distuninstallcheck_dir)' || { \ - echo 'ERROR: trying to run $@ with an empty' \ - '$$(distuninstallcheck_dir)' >&2; \ - exit 1; \ - }; \ - $(am__cd) '$(distuninstallcheck_dir)' || { \ - echo 'ERROR: cannot chdir into $(distuninstallcheck_dir)' >&2; \ - exit 1; \ - }; \ - test `$(am__distuninstallcheck_listfiles) | wc -l` -eq 0 \ - || { echo "ERROR: files left after uninstall:" ; \ - if test -n "$(DESTDIR)"; then \ - echo " (check DESTDIR support)"; \ - fi ; \ - $(distuninstallcheck_listfiles) ; \ - exit 1; } >&2 -distcleancheck: distclean - @if test '$(srcdir)' = . ; then \ - echo "ERROR: distcleancheck can only run from a VPATH build" ; \ - exit 1 ; \ - fi - @test `$(distcleancheck_listfiles) | wc -l` -eq 0 \ - || { echo "ERROR: files left in build directory after distclean:" ; \ - $(distcleancheck_listfiles) ; \ - exit 1; } >&2 -check-am: all-am - $(MAKE) $(AM_MAKEFLAGS) $(check_PROGRAMS) -check: check-am -all-am: Makefile $(LTLIBRARIES) $(PROGRAMS) $(HEADERS) config.h -install-binPROGRAMS: install-libLTLIBRARIES - -installdirs: - for dir in "$(DESTDIR)$(libdir)" "$(DESTDIR)$(bindir)" "$(DESTDIR)$(pkgincludedir)"; do \ - test -z "$$dir" || $(MKDIR_P) "$$dir"; \ - done -install: install-am -install-exec: install-exec-am -install-data: install-data-am -uninstall: uninstall-am - -install-am: all-am - @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am - -installcheck: installcheck-am -install-strip: - if test -z '$(STRIP)'; then \ - $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ - install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ - install; \ - else \ - $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ - install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ - "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ - fi -mostlyclean-generic: - -clean-generic: - -distclean-generic: - -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) - -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) - -maintainer-clean-generic: - @echo "This command is intended for maintainers to use" - @echo "it deletes files that may require special tools to rebuild." -clean: clean-am - -clean-am: clean-binPROGRAMS clean-checkPROGRAMS clean-generic \ - clean-libLTLIBRARIES clean-libtool clean-local \ - clean-noinstLTLIBRARIES mostlyclean-am - -distclean: distclean-am - -rm -f $(am__CONFIG_DISTCLEAN_FILES) - -rm -rf ./$(DEPDIR) - -rm -f Makefile -distclean-am: clean-am distclean-compile distclean-generic \ - distclean-hdr distclean-libtool distclean-tags - -dvi: dvi-am - -dvi-am: - -html: html-am - -html-am: - -info: info-am - -info-am: - -install-data-am: install-pkgincludeHEADERS - -install-dvi: install-dvi-am - -install-dvi-am: - -install-exec-am: install-binPROGRAMS install-libLTLIBRARIES - -install-html: install-html-am - -install-html-am: - -install-info: install-info-am - -install-info-am: - -install-man: - -install-pdf: install-pdf-am - -install-pdf-am: - -install-ps: install-ps-am - -install-ps-am: - -installcheck-am: - -maintainer-clean: maintainer-clean-am - -rm -f $(am__CONFIG_DISTCLEAN_FILES) - -rm -rf $(top_srcdir)/autom4te.cache - -rm -rf ./$(DEPDIR) - -rm -f Makefile -maintainer-clean-am: distclean-am maintainer-clean-generic - -mostlyclean: mostlyclean-am - -mostlyclean-am: mostlyclean-compile mostlyclean-generic \ - mostlyclean-libtool - -pdf: pdf-am - -pdf-am: - -ps: ps-am - -ps-am: - -uninstall-am: uninstall-binPROGRAMS uninstall-libLTLIBRARIES \ - uninstall-pkgincludeHEADERS - -.MAKE: all check-am install-am install-strip - -.PHONY: CTAGS GTAGS all all-am am--refresh check check-am clean \ - clean-binPROGRAMS clean-checkPROGRAMS clean-generic \ - clean-libLTLIBRARIES clean-libtool clean-local \ - clean-noinstLTLIBRARIES ctags dist dist-all dist-bzip2 \ - dist-gzip dist-lzip dist-lzma dist-shar dist-tarZ dist-xz \ - dist-zip distcheck distclean distclean-compile \ - distclean-generic distclean-hdr distclean-libtool \ - distclean-tags distcleancheck distdir distuninstallcheck dvi \ - dvi-am html html-am info info-am install install-am \ - install-binPROGRAMS install-data install-data-am install-dvi \ - install-dvi-am install-exec install-exec-am install-html \ - install-html-am install-info install-info-am \ - install-libLTLIBRARIES install-man install-pdf install-pdf-am \ - install-pkgincludeHEADERS install-ps install-ps-am \ - install-strip installcheck installcheck-am installdirs \ - maintainer-clean maintainer-clean-generic mostlyclean \ - mostlyclean-compile mostlyclean-generic mostlyclean-libtool \ - pdf pdf-am ps ps-am tags uninstall uninstall-am \ - uninstall-binPROGRAMS uninstall-libLTLIBRARIES \ - uninstall-pkgincludeHEADERS - - -@DX_COND_doc_TRUE@@DX_COND_ps_TRUE@doxygen-ps: @DX_DOCDIR@/@PACKAGE@.ps - -@DX_COND_doc_TRUE@@DX_COND_ps_TRUE@@DX_DOCDIR@/@PACKAGE@.ps: @DX_DOCDIR@/@PACKAGE@.tag -@DX_COND_doc_TRUE@@DX_COND_ps_TRUE@ cd @DX_DOCDIR@/latex; \ -@DX_COND_doc_TRUE@@DX_COND_ps_TRUE@ rm -f *.aux *.toc *.idx *.ind *.ilg *.log *.out; \ -@DX_COND_doc_TRUE@@DX_COND_ps_TRUE@ $(DX_LATEX) refman.tex; \ -@DX_COND_doc_TRUE@@DX_COND_ps_TRUE@ $(MAKEINDEX_PATH) refman.idx; \ -@DX_COND_doc_TRUE@@DX_COND_ps_TRUE@ $(DX_LATEX) refman.tex; \ -@DX_COND_doc_TRUE@@DX_COND_ps_TRUE@ countdown=5; \ -@DX_COND_doc_TRUE@@DX_COND_ps_TRUE@ while $(DX_EGREP) 'Rerun (LaTeX|to get cross-references right)' \ -@DX_COND_doc_TRUE@@DX_COND_ps_TRUE@ refman.log > /dev/null 2>&1 \ -@DX_COND_doc_TRUE@@DX_COND_ps_TRUE@ && test $$countdown -gt 0; do \ -@DX_COND_doc_TRUE@@DX_COND_ps_TRUE@ $(DX_LATEX) refman.tex; \ -@DX_COND_doc_TRUE@@DX_COND_ps_TRUE@ countdown=`expr $$countdown - 1`; \ -@DX_COND_doc_TRUE@@DX_COND_ps_TRUE@ done; \ -@DX_COND_doc_TRUE@@DX_COND_ps_TRUE@ $(DX_DVIPS) -o ../@PACKAGE@.ps refman.dvi - -@DX_COND_doc_TRUE@@DX_COND_pdf_TRUE@doxygen-pdf: @DX_DOCDIR@/@PACKAGE@.pdf - -@DX_COND_doc_TRUE@@DX_COND_pdf_TRUE@@DX_DOCDIR@/@PACKAGE@.pdf: @DX_DOCDIR@/@PACKAGE@.tag -@DX_COND_doc_TRUE@@DX_COND_pdf_TRUE@ cd @DX_DOCDIR@/latex; \ -@DX_COND_doc_TRUE@@DX_COND_pdf_TRUE@ rm -f *.aux *.toc *.idx *.ind *.ilg *.log *.out; \ -@DX_COND_doc_TRUE@@DX_COND_pdf_TRUE@ $(DX_PDFLATEX) refman.tex; \ -@DX_COND_doc_TRUE@@DX_COND_pdf_TRUE@ $(DX_MAKEINDEX) refman.idx; \ -@DX_COND_doc_TRUE@@DX_COND_pdf_TRUE@ $(DX_PDFLATEX) refman.tex; \ -@DX_COND_doc_TRUE@@DX_COND_pdf_TRUE@ countdown=5; \ -@DX_COND_doc_TRUE@@DX_COND_pdf_TRUE@ while $(DX_EGREP) 'Rerun (LaTeX|to get cross-references right)' \ -@DX_COND_doc_TRUE@@DX_COND_pdf_TRUE@ refman.log > /dev/null 2>&1 \ -@DX_COND_doc_TRUE@@DX_COND_pdf_TRUE@ && test $$countdown -gt 0; do \ -@DX_COND_doc_TRUE@@DX_COND_pdf_TRUE@ $(DX_PDFLATEX) refman.tex; \ -@DX_COND_doc_TRUE@@DX_COND_pdf_TRUE@ countdown=`expr $$countdown - 1`; \ -@DX_COND_doc_TRUE@@DX_COND_pdf_TRUE@ done; \ -@DX_COND_doc_TRUE@@DX_COND_pdf_TRUE@ mv refman.pdf ../@PACKAGE@.pdf - -@DX_COND_doc_TRUE@.PHONY: doxygen-run doxygen-doc $(DX_PS_GOAL) $(DX_PDF_GOAL) - -@DX_COND_doc_TRUE@.INTERMEDIATE: doxygen-run $(DX_PS_GOAL) $(DX_PDF_GOAL) - -@DX_COND_doc_TRUE@doxygen-run: @DX_DOCDIR@/@PACKAGE@.tag - -@DX_COND_doc_TRUE@doxygen-doc: doxygen-run $(DX_PS_GOAL) $(DX_PDF_GOAL) - -@DX_COND_doc_TRUE@@DX_DOCDIR@/@PACKAGE@.tag: $(DX_CONFIG) $(pkginclude_HEADERS) -@DX_COND_doc_TRUE@ rm -rf @DX_DOCDIR@ -@DX_COND_doc_TRUE@ $(DX_ENV) $(DX_DOXYGEN) $(srcdir)/$(DX_CONFIG) - -run-check: check - ./zktest-st $(TEST_OPTIONS) -@WANT_SYNCAPI_TRUE@ ./zktest-mt $(TEST_OPTIONS) - -clean-local: clean-check - $(RM) $(DX_CLEANFILES) - -clean-check: - $(RM) $(nodist_zktest_st_OBJECTS) $(nodist_zktest_mt_OBJECTS) - -# Tell versions [3.59,3.63) of GNU make to not export all variables. -# Otherwise a system limit (for SysV at least) may be exceeded. -.NOEXPORT: diff --git a/pkg/registry/zookeeper-3.4.6/src/c/NOTICE.txt b/pkg/registry/zookeeper-3.4.6/src/c/NOTICE.txt deleted file mode 100644 index 07ef1ad51..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/c/NOTICE.txt +++ /dev/null @@ -1,41 +0,0 @@ -Apache ZooKeeper -Copyright 2009-2011 The Apache Software Foundation - -This product includes software developed at -The Apache Software Foundation (http://www.apache.org/). - ----------- -include/winstdint.h is included only for Windows Client support, as follows: - -// ISO C9x compliant stdint.h for Microsoft Visual Studio -// Based on ISO/IEC 9899:TC2 Committee draft (May 6, 2005) WG14/N1124 -// -// Copyright (c) 2006-2008 Alexander Chemeris -// -// 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 name of the author may be used to endorse or promote products -// derived from this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED -// WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF -// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO -// EVENT SHALL THE AUTHOR 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. -// -/////////////////////////////////////////////////////////////////////////////// - ----------- diff --git a/pkg/registry/zookeeper-3.4.6/src/c/README b/pkg/registry/zookeeper-3.4.6/src/c/README deleted file mode 100644 index 0b31d0a7a..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/c/README +++ /dev/null @@ -1,129 +0,0 @@ - Zookeeper C client library - - -This package provides a C client interface to Zookeeper server. - -For the latest information about ZooKeeper, please visit our website at: - http://zookeeper.apache.org/ -and our wiki, at: - https://cwiki.apache.org/confluence/display/ZOOKEEPER - -Full documentation for this release can also be found in ../../docs/index.html - - -OVERVIEW - -The client supports two types of APIs -- synchronous and asynchronous. - -Asynchronous API provides non-blocking operations with completion callbacks and -relies on the application to implement event multiplexing on its behalf. - -On the other hand, Synchronous API provides a blocking flavor of -zookeeper operations and runs its own event loop in a separate thread. - -Sync and Async APIs can be mixed and matched within the same application. - -The package includes two shared libraries: zookeeper_st and -zookeeper_mt. The former only provides the Async API and is not -thread-safe. The only reason this library exists is to support the -platforms were pthread library is not available or unstable -(i.e. FreeBSD 4.x). In all other cases the application developers are -advised to link against zookeeper_mt as it includes support for both -Sync and Async API. - - -INSTALLATION - -If you're building the client from a source checkout you need to -follow the steps outlined below. If you're building from a release -tar downloaded from Apache please skip to step 2. - -1) do a "ant compile_jute" from the zookeeper top level directory (.../trunk). - This will create a directory named "generated" under src/c. Skip to step 3. -2) unzip/untar the source tarball and cd to the zookeeper-x.x.x/src/c directory -3) change directory to src/c and do a "autoreconf -if" to bootstrap - autoconf, automake and libtool. Please make sure you have autoconf - version 2.59 or greater installed. If cppunit is installed in a non-standard - directory, you need to specify where to find cppunit.m4. For example, if - cppunit is installed under /usr/local, run: - - ACLOCAL="aclocal -I /usr/local/share/aclocal" autoreconf -if - -4) do a "./configure [OPTIONS]" to generate the makefile. See INSTALL - for general information about running configure. Additionally, the - configure supports the following options: - --enable-debug enables optimization and enables debug info compiler - options, disabled by default - --without-syncapi disables Sync API support; zookeeper_mt library won't - be built, enabled by default - --disable-static do not build static libraries, enabled by default - --disable-shared do not build shared libraries, enabled by default - --without-cppunit do not build the test library, enabled by default. - -5) do a "make" or "make install" to build the libraries and install them. - Alternatively, you can also build and run a unit test suite (and - you probably should). Please make sure you have cppunit-1.10.x or - higher installed before you execute step 4. Once ./configure has - finished, do a "make run-check". It will build the libraries, build - the tests and run them. -6) to generate doxygen documentation do a "make doxygen-doc". All - documentations will be placed to a new subfolder named docs. By - default only HTML documentation is generated. For information on - other document formats please use "./configure --help" - - -USING THE CLIENT - -You can test your client by running a zookeeper server (see -instructions on the project wiki page on how to run it) and connecting -to it using the zookeeper shell application cli that is built as part -of the installation procedure. - -cli_mt (multithreaded, built against zookeeper_mt library) is shown in -this example, but you could also use cli_st (singlethreaded, built -against zookeeper_st library): - -$ cli_mt zookeeper_host:9876 - -This is a client application that gives you a shell for executing -simple zookeeper commands. Once successfully started and connected to -the server it displays a shell prompt. - -You can now enter zookeeper commands. For example, to create a node: - -> create /my_new_node - -To verify that the node's been created: - -> ls / - -You should see a list of nodes who are the children of the root node "/". - -Here's a list of command supported by the cli shell: - -ls -- list children of a znode identified by . The - command set a children watch on the znode. -get -- get the value of a znode at -set -- set the value of a znode at to -create [+e|+s] -- create a znode as a child of znode ; - use +e option to create an ephemeral znode, - use +s option to create a znode with a sequence number - appended to the name. The operation will fail if - the parent znode (the one identified by ) doesn't - exist. -delete -- delete the znode at . The command will fail if the znode - has children. -sync -- make sure all pending updates have been applied to znode at -exists -- returns a result code indicating whether the znode at - exists. The command also sets a znode watch. -myid -- prints out the current zookeeper session id. -quit -- exit the shell. - -In order to be able to use the zookeeper API in your application you have to -1) remember to include the zookeeper header - #include -2) use -DTHREADED compiler option to enable Sync API; in this case you should - be linking your code against zookeeper_mt library - -Please take a look at cli.c to understand how to use the two API types. -(TODO: some kind of short tutorial would be helpful, I guess) diff --git a/pkg/registry/zookeeper-3.4.6/src/c/acinclude.m4 b/pkg/registry/zookeeper-3.4.6/src/c/acinclude.m4 deleted file mode 100644 index d0041d8c2..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/c/acinclude.m4 +++ /dev/null @@ -1,312 +0,0 @@ -# This file is part of Autoconf. -*- Autoconf -*- - -# Copyright (C) 2004 Oren Ben-Kiki -# This file is distributed under the same terms as the Autoconf macro files. - -# Generate automatic documentation using Doxygen. Works in concert with the -# aminclude.m4 file and a compatible doxygen configuration file. Defines the -# following public macros: -# -# DX_???_FEATURE(ON|OFF) - control the default setting fo a Doxygen feature. -# Supported features are 'DOXYGEN' itself, 'DOT' for generating graphics, -# 'HTML' for plain HTML, 'CHM' for compressed HTML help (for MS users), 'CHI' -# for generating a seperate .chi file by the .chm file, and 'MAN', 'RTF', -# 'XML', 'PDF' and 'PS' for the appropriate output formats. The environment -# variable DOXYGEN_PAPER_SIZE may be specified to override the default 'a4wide' -# paper size. -# -# By default, HTML, PDF and PS documentation is generated as this seems to be -# the most popular and portable combination. MAN pages created by Doxygen are -# usually problematic, though by picking an appropriate subset and doing some -# massaging they might be better than nothing. CHM and RTF are specific for MS -# (note that you can't generate both HTML and CHM at the same time). The XML is -# rather useless unless you apply specialized post-processing to it. -# -# The macro mainly controls the default state of the feature. The use can -# override the default by specifying --enable or --disable. The macros ensure -# that contradictory flags are not given (e.g., --enable-doxygen-html and -# --enable-doxygen-chm, --enable-doxygen-anything with --disable-doxygen, etc.) -# Finally, each feature will be automatically disabled (with a warning) if the -# required programs are missing. -# -# Once all the feature defaults have been specified, call DX_INIT_DOXYGEN with -# the following parameters: a one-word name for the project for use as a -# filename base etc., an optional configuration file name (the default is -# 'Doxyfile', the same as Doxygen's default), and an optional output directory -# name (the default is 'doxygen-doc'). - -## ----------## -## Defaults. ## -## ----------## - -DX_ENV="" -AC_DEFUN([DX_FEATURE_doc], ON) -AC_DEFUN([DX_FEATURE_dot], ON) -AC_DEFUN([DX_FEATURE_man], OFF) -AC_DEFUN([DX_FEATURE_html], ON) -AC_DEFUN([DX_FEATURE_chm], OFF) -AC_DEFUN([DX_FEATURE_chi], OFF) -AC_DEFUN([DX_FEATURE_rtf], OFF) -AC_DEFUN([DX_FEATURE_xml], OFF) -AC_DEFUN([DX_FEATURE_pdf], ON) -AC_DEFUN([DX_FEATURE_ps], ON) - -## --------------- ## -## Private macros. ## -## --------------- ## - -# DX_ENV_APPEND(VARIABLE, VALUE) -# ------------------------------ -# Append VARIABLE="VALUE" to DX_ENV for invoking doxygen. -AC_DEFUN([DX_ENV_APPEND], [AC_SUBST([DX_ENV], ["$DX_ENV $1='$2'"])]) - -# DX_DIRNAME_EXPR -# --------------- -# Expand into a shell expression prints the directory part of a path. -AC_DEFUN([DX_DIRNAME_EXPR], - [[expr ".$1" : '\(\.\)[^/]*$' \| "x$1" : 'x\(.*\)/[^/]*$']]) - -# DX_IF_FEATURE(FEATURE, IF-ON, IF-OFF) -# ------------------------------------- -# Expands according to the M4 (static) status of the feature. -AC_DEFUN([DX_IF_FEATURE], [ifelse(DX_FEATURE_$1, ON, [$2], [$3])]) - -# DX_REQUIRE_PROG(VARIABLE, PROGRAM) -# ---------------------------------- -# Require the specified program to be found for the DX_CURRENT_FEATURE to work. -AC_DEFUN([DX_REQUIRE_PROG], [ -AC_PATH_TOOL([$1], [$2]) -if test "$DX_FLAG_$[DX_CURRENT_FEATURE$$1]" = 1; then - AC_MSG_WARN([$2 not found - will not DX_CURRENT_DESCRIPTION]) - AC_SUBST([DX_FLAG_]DX_CURRENT_FEATURE, 0) -fi -]) - -# DX_TEST_FEATURE(FEATURE) -# ------------------------ -# Expand to a shell expression testing whether the feature is active. -AC_DEFUN([DX_TEST_FEATURE], [test "$DX_FLAG_$1" = 1]) - -# DX_CHECK_DEPEND(REQUIRED_FEATURE, REQUIRED_STATE) -# ------------------------------------------------- -# Verify that a required features has the right state before trying to turn on -# the DX_CURRENT_FEATURE. -AC_DEFUN([DX_CHECK_DEPEND], [ -test "$DX_FLAG_$1" = "$2" \ -|| AC_MSG_ERROR([doxygen-DX_CURRENT_FEATURE ifelse([$2], 1, - requires, contradicts) doxygen-DX_CURRENT_FEATURE]) -]) - -# DX_CLEAR_DEPEND(FEATURE, REQUIRED_FEATURE, REQUIRED_STATE) -# ---------------------------------------------------------- -# Turn off the DX_CURRENT_FEATURE if the required feature is off. -AC_DEFUN([DX_CLEAR_DEPEND], [ -test "$DX_FLAG_$1" = "$2" || AC_SUBST([DX_FLAG_]DX_CURRENT_FEATURE, 0) -]) - -# DX_FEATURE_ARG(FEATURE, DESCRIPTION, -# CHECK_DEPEND, CLEAR_DEPEND, -# REQUIRE, DO-IF-ON, DO-IF-OFF) -# -------------------------------------------- -# Parse the command-line option controlling a feature. CHECK_DEPEND is called -# if the user explicitly turns the feature on (and invokes DX_CHECK_DEPEND), -# otherwise CLEAR_DEPEND is called to turn off the default state if a required -# feature is disabled (using DX_CLEAR_DEPEND). REQUIRE performs additional -# requirement tests (DX_REQUIRE_PROG). Finally, an automake flag is set and -# DO-IF-ON or DO-IF-OFF are called according to the final state of the feature. -AC_DEFUN([DX_ARG_ABLE], [ - AC_DEFUN([DX_CURRENT_FEATURE], [$1]) - AC_DEFUN([DX_CURRENT_DESCRIPTION], [$2]) - AC_ARG_ENABLE(doxygen-$1, - [AS_HELP_STRING(DX_IF_FEATURE([$1], [--disable-doxygen-$1], - [--enable-doxygen-$1]), - DX_IF_FEATURE([$1], [don't $2], [$2]))], - [ -case "$enableval" in -#( -y|Y|yes|Yes|YES) - AC_SUBST([DX_FLAG_$1], 1) - $3 -;; #( -n|N|no|No|NO) - AC_SUBST([DX_FLAG_$1], 0) -;; #( -*) - AC_MSG_ERROR([invalid value '$enableval' given to doxygen-$1]) -;; -esac -], [ -AC_SUBST([DX_FLAG_$1], [DX_IF_FEATURE([$1], 1, 0)]) -$4 -]) -if DX_TEST_FEATURE([$1]); then - $5 - : -fi -if DX_TEST_FEATURE([$1]); then - AM_CONDITIONAL(DX_COND_$1, :) - $6 - : -else - AM_CONDITIONAL(DX_COND_$1, false) - $7 - : -fi -]) - -## -------------- ## -## Public macros. ## -## -------------- ## - -# DX_XXX_FEATURE(DEFAULT_STATE) -# ----------------------------- -AC_DEFUN([DX_DOXYGEN_FEATURE], [AC_DEFUN([DX_FEATURE_doc], [$1])]) -AC_DEFUN([DX_MAN_FEATURE], [AC_DEFUN([DX_FEATURE_man], [$1])]) -AC_DEFUN([DX_HTML_FEATURE], [AC_DEFUN([DX_FEATURE_html], [$1])]) -AC_DEFUN([DX_CHM_FEATURE], [AC_DEFUN([DX_FEATURE_chm], [$1])]) -AC_DEFUN([DX_CHI_FEATURE], [AC_DEFUN([DX_FEATURE_chi], [$1])]) -AC_DEFUN([DX_RTF_FEATURE], [AC_DEFUN([DX_FEATURE_rtf], [$1])]) -AC_DEFUN([DX_XML_FEATURE], [AC_DEFUN([DX_FEATURE_xml], [$1])]) -AC_DEFUN([DX_XML_FEATURE], [AC_DEFUN([DX_FEATURE_xml], [$1])]) -AC_DEFUN([DX_PDF_FEATURE], [AC_DEFUN([DX_FEATURE_pdf], [$1])]) -AC_DEFUN([DX_PS_FEATURE], [AC_DEFUN([DX_FEATURE_ps], [$1])]) - -# DX_INIT_DOXYGEN(PROJECT, [CONFIG-FILE], [OUTPUT-DOC-DIR]) -# --------------------------------------------------------- -# PROJECT also serves as the base name for the documentation files. -# The default CONFIG-FILE is "Doxyfile" and OUTPUT-DOC-DIR is "doxygen-doc". -AC_DEFUN([DX_INIT_DOXYGEN], [ - -# Files: -AC_SUBST([DX_PROJECT], [$1]) -AC_SUBST([DX_CONFIG], [ifelse([$2], [], Doxyfile, [$2])]) -AC_SUBST([DX_DOCDIR], [ifelse([$3], [], doxygen-doc, [$3])]) - -# Environment variables used inside doxygen.cfg: -DX_ENV_APPEND(SRCDIR, $srcdir) -DX_ENV_APPEND(PROJECT, $DX_PROJECT) -DX_ENV_APPEND(DOCDIR, $DX_DOCDIR) -DX_ENV_APPEND(VERSION, $PACKAGE_VERSION) - -# Doxygen itself: -DX_ARG_ABLE(doc, [generate any doxygen documentation], - [], - [], - [DX_REQUIRE_PROG([DX_DOXYGEN], doxygen) - DX_REQUIRE_PROG([DX_PERL], perl)], - [DX_ENV_APPEND(PERL_PATH, $DX_PERL)]) - -# Dot for graphics: -DX_ARG_ABLE(dot, [generate graphics for doxygen documentation], - [DX_CHECK_DEPEND(doc, 1)], - [DX_CLEAR_DEPEND(doc, 1)], - [DX_REQUIRE_PROG([DX_DOT], dot)], - [DX_ENV_APPEND(HAVE_DOT, YES) - DX_ENV_APPEND(DOT_PATH, [`DX_DIRNAME_EXPR($DX_DOT)`])], - [DX_ENV_APPEND(HAVE_DOT, NO)]) - -# Man pages generation: -DX_ARG_ABLE(man, [generate doxygen manual pages], - [DX_CHECK_DEPEND(doc, 1)], - [DX_CLEAR_DEPEND(doc, 1)], - [], - [DX_ENV_APPEND(GENERATE_MAN, YES)], - [DX_ENV_APPEND(GENERATE_MAN, NO)]) - -# RTF file generation: -DX_ARG_ABLE(rtf, [generate doxygen RTF documentation], - [DX_CHECK_DEPEND(doc, 1)], - [DX_CLEAR_DEPEND(doc, 1)], - [], - [DX_ENV_APPEND(GENERATE_RTF, YES)], - [DX_ENV_APPEND(GENERATE_RTF, NO)]) - -# XML file generation: -DX_ARG_ABLE(xml, [generate doxygen XML documentation], - [DX_CHECK_DEPEND(doc, 1)], - [DX_CLEAR_DEPEND(doc, 1)], - [], - [DX_ENV_APPEND(GENERATE_XML, YES)], - [DX_ENV_APPEND(GENERATE_XML, NO)]) - -# (Compressed) HTML help generation: -DX_ARG_ABLE(chm, [generate doxygen compressed HTML help documentation], - [DX_CHECK_DEPEND(doc, 1)], - [DX_CLEAR_DEPEND(doc, 1)], - [DX_REQUIRE_PROG([DX_HHC], hhc)], - [DX_ENV_APPEND(HHC_PATH, $DX_HHC) - DX_ENV_APPEND(GENERATE_HTML, YES) - DX_ENV_APPEND(GENERATE_HTMLHELP, YES)], - [DX_ENV_APPEND(GENERATE_HTMLHELP, NO)]) - -# Seperate CHI file generation. -DX_ARG_ABLE(chi, [generate doxygen seperate compressed HTML help index file], - [DX_CHECK_DEPEND(chm, 1)], - [DX_CLEAR_DEPEND(chm, 1)], - [], - [DX_ENV_APPEND(GENERATE_CHI, YES)], - [DX_ENV_APPEND(GENERATE_CHI, NO)]) - -# Plain HTML pages generation: -DX_ARG_ABLE(html, [generate doxygen plain HTML documentation], - [DX_CHECK_DEPEND(doc, 1) DX_CHECK_DEPEND(chm, 0)], - [DX_CLEAR_DEPEND(doc, 1) DX_CLEAR_DEPEND(chm, 0)], - [], - [DX_ENV_APPEND(GENERATE_HTML, YES)], - [DX_TEST_FEATURE(chm) || DX_ENV_APPEND(GENERATE_HTML, NO)]) - -# PostScript file generation: -DX_ARG_ABLE(ps, [generate doxygen PostScript documentation], - [DX_CHECK_DEPEND(doc, 1)], - [DX_CLEAR_DEPEND(doc, 1)], - [DX_REQUIRE_PROG([DX_LATEX], latex) - DX_REQUIRE_PROG([DX_MAKEINDEX], makeindex) - DX_REQUIRE_PROG([DX_DVIPS], dvips) - DX_REQUIRE_PROG([DX_EGREP], egrep)]) - -# PDF file generation: -DX_ARG_ABLE(pdf, [generate doxygen PDF documentation], - [DX_CHECK_DEPEND(doc, 1)], - [DX_CLEAR_DEPEND(doc, 1)], - [DX_REQUIRE_PROG([DX_PDFLATEX], pdflatex) - DX_REQUIRE_PROG([DX_MAKEINDEX], makeindex) - DX_REQUIRE_PROG([DX_EGREP], egrep)]) - -# LaTeX generation for PS and/or PDF: -if DX_TEST_FEATURE(ps) || DX_TEST_FEATURE(pdf); then - AM_CONDITIONAL(DX_COND_latex, :) - DX_ENV_APPEND(GENERATE_LATEX, YES) -else - AM_CONDITIONAL(DX_COND_latex, false) - DX_ENV_APPEND(GENERATE_LATEX, NO) -fi - -# Paper size for PS and/or PDF: -AC_ARG_VAR(DOXYGEN_PAPER_SIZE, - [a4wide (default), a4, letter, legal or executive]) -case "$DOXYGEN_PAPER_SIZE" in -#( -"") - AC_SUBST(DOXYGEN_PAPER_SIZE, "") -;; #( -a4wide|a4|letter|legal|executive) - DX_ENV_APPEND(PAPER_SIZE, $DOXYGEN_PAPER_SIZE) -;; #( -*) - AC_MSG_ERROR([unknown DOXYGEN_PAPER_SIZE='$DOXYGEN_PAPER_SIZE']) -;; -esac - -#For debugging: -#echo DX_FLAG_doc=$DX_FLAG_doc -#echo DX_FLAG_dot=$DX_FLAG_dot -#echo DX_FLAG_man=$DX_FLAG_man -#echo DX_FLAG_html=$DX_FLAG_html -#echo DX_FLAG_chm=$DX_FLAG_chm -#echo DX_FLAG_chi=$DX_FLAG_chi -#echo DX_FLAG_rtf=$DX_FLAG_rtf -#echo DX_FLAG_xml=$DX_FLAG_xml -#echo DX_FLAG_pdf=$DX_FLAG_pdf -#echo DX_FLAG_ps=$DX_FLAG_ps -#echo DX_ENV=$DX_ENV -]) diff --git a/pkg/registry/zookeeper-3.4.6/src/c/aclocal.m4 b/pkg/registry/zookeeper-3.4.6/src/c/aclocal.m4 deleted file mode 100644 index 95e810ce1..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/c/aclocal.m4 +++ /dev/null @@ -1,9706 +0,0 @@ -# generated automatically by aclocal 1.11.6 -*- Autoconf -*- - -# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, -# 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software Foundation, -# Inc. -# This file is free software; the Free Software Foundation -# gives unlimited permission to copy and/or distribute it, -# with or without modifications, as long as this notice is preserved. - -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY, to the extent permitted by law; without -# even the implied warranty of MERCHANTABILITY or FITNESS FOR A -# PARTICULAR PURPOSE. - -m4_ifndef([AC_AUTOCONF_VERSION], - [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl -m4_if(m4_defn([AC_AUTOCONF_VERSION]), [2.69],, -[m4_warning([this file was generated for autoconf 2.69. -You have another version of autoconf. It may work, but is not guaranteed to. -If you have problems, you may need to regenerate the build system entirely. -To do so, use the procedure documented by the package, typically `autoreconf'.])]) - -dnl -dnl AM_PATH_CPPUNIT(MINIMUM-VERSION, [ACTION-IF-FOUND [, ACTION-IF-NOT-FOUND]]) -dnl -AC_DEFUN([AM_PATH_CPPUNIT], -[ - -AC_ARG_WITH(cppunit-prefix,[ --with-cppunit-prefix=PFX Prefix where CppUnit is installed (optional)], - cppunit_config_prefix="$withval", cppunit_config_prefix="") -AC_ARG_WITH(cppunit-exec-prefix,[ --with-cppunit-exec-prefix=PFX Exec prefix where CppUnit is installed (optional)], - cppunit_config_exec_prefix="$withval", cppunit_config_exec_prefix="") - - if test x$cppunit_config_exec_prefix != x ; then - cppunit_config_args="$cppunit_config_args --exec-prefix=$cppunit_config_exec_prefix" - if test x${CPPUNIT_CONFIG+set} != xset ; then - CPPUNIT_CONFIG=$cppunit_config_exec_prefix/bin/cppunit-config - fi - fi - if test x$cppunit_config_prefix != x ; then - cppunit_config_args="$cppunit_config_args --prefix=$cppunit_config_prefix" - if test x${CPPUNIT_CONFIG+set} != xset ; then - CPPUNIT_CONFIG=$cppunit_config_prefix/bin/cppunit-config - fi - fi - - AC_PATH_PROG(CPPUNIT_CONFIG, cppunit-config, no) - cppunit_version_min=$1 - - AC_MSG_CHECKING(for Cppunit - version >= $cppunit_version_min) - no_cppunit="" - if test "$CPPUNIT_CONFIG" = "no" ; then - AC_MSG_RESULT(no) - no_cppunit=yes - else - CPPUNIT_CFLAGS=`$CPPUNIT_CONFIG --cflags` - CPPUNIT_LIBS=`$CPPUNIT_CONFIG --libs` - cppunit_version=`$CPPUNIT_CONFIG --version` - - cppunit_major_version=`echo $cppunit_version | \ - sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\1/'` - cppunit_minor_version=`echo $cppunit_version | \ - sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\2/'` - cppunit_micro_version=`echo $cppunit_version | \ - sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\3/'` - - cppunit_major_min=`echo $cppunit_version_min | \ - sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\1/'` - if test "x${cppunit_major_min}" = "x" ; then - cppunit_major_min=0 - fi - - cppunit_minor_min=`echo $cppunit_version_min | \ - sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\2/'` - if test "x${cppunit_minor_min}" = "x" ; then - cppunit_minor_min=0 - fi - - cppunit_micro_min=`echo $cppunit_version_min | \ - sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\3/'` - if test "x${cppunit_micro_min}" = "x" ; then - cppunit_micro_min=0 - fi - - cppunit_version_proper=`expr \ - $cppunit_major_version \> $cppunit_major_min \| \ - $cppunit_major_version \= $cppunit_major_min \& \ - $cppunit_minor_version \> $cppunit_minor_min \| \ - $cppunit_major_version \= $cppunit_major_min \& \ - $cppunit_minor_version \= $cppunit_minor_min \& \ - $cppunit_micro_version \>= $cppunit_micro_min ` - - if test "$cppunit_version_proper" = "1" ; then - AC_MSG_RESULT([$cppunit_major_version.$cppunit_minor_version.$cppunit_micro_version]) - else - AC_MSG_RESULT(no) - no_cppunit=yes - fi - fi - - if test "x$no_cppunit" = x ; then - ifelse([$2], , :, [$2]) - else - CPPUNIT_CFLAGS="" - CPPUNIT_LIBS="" - ifelse([$3], , :, [$3]) - fi - - AC_SUBST(CPPUNIT_CFLAGS) - AC_SUBST(CPPUNIT_LIBS) -]) - - - - -# libtool.m4 - Configure libtool for the host system. -*-Autoconf-*- -# -# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005, -# 2006, 2007, 2008, 2009, 2010, 2011 Free Software -# Foundation, Inc. -# Written by Gordon Matzigkeit, 1996 -# -# This file is free software; the Free Software Foundation gives -# unlimited permission to copy and/or distribute it, with or without -# modifications, as long as this notice is preserved. - -m4_define([_LT_COPYING], [dnl -# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005, -# 2006, 2007, 2008, 2009, 2010, 2011 Free Software -# Foundation, Inc. -# Written by Gordon Matzigkeit, 1996 -# -# This file is part of GNU Libtool. -# -# GNU Libtool is free software; you can redistribute it and/or -# modify it under the terms of the GNU General Public License as -# published by the Free Software Foundation; either version 2 of -# the License, or (at your option) any later version. -# -# As a special exception to the GNU General Public License, -# if you distribute this file as part of a program or library that -# is built using GNU Libtool, you may include this file under the -# same distribution terms that you use for the rest of that program. -# -# GNU Libtool is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with GNU Libtool; see the file COPYING. If not, a copy -# can be downloaded from http://www.gnu.org/licenses/gpl.html, or -# obtained by writing to the Free Software Foundation, Inc., -# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. -]) - -# serial 57 LT_INIT - - -# LT_PREREQ(VERSION) -# ------------------ -# Complain and exit if this libtool version is less that VERSION. -m4_defun([LT_PREREQ], -[m4_if(m4_version_compare(m4_defn([LT_PACKAGE_VERSION]), [$1]), -1, - [m4_default([$3], - [m4_fatal([Libtool version $1 or higher is required], - 63)])], - [$2])]) - - -# _LT_CHECK_BUILDDIR -# ------------------ -# Complain if the absolute build directory name contains unusual characters -m4_defun([_LT_CHECK_BUILDDIR], -[case `pwd` in - *\ * | *\ *) - AC_MSG_WARN([Libtool does not cope well with whitespace in `pwd`]) ;; -esac -]) - - -# LT_INIT([OPTIONS]) -# ------------------ -AC_DEFUN([LT_INIT], -[AC_PREREQ([2.58])dnl We use AC_INCLUDES_DEFAULT -AC_REQUIRE([AC_CONFIG_AUX_DIR_DEFAULT])dnl -AC_BEFORE([$0], [LT_LANG])dnl -AC_BEFORE([$0], [LT_OUTPUT])dnl -AC_BEFORE([$0], [LTDL_INIT])dnl -m4_require([_LT_CHECK_BUILDDIR])dnl - -dnl Autoconf doesn't catch unexpanded LT_ macros by default: -m4_pattern_forbid([^_?LT_[A-Z_]+$])dnl -m4_pattern_allow([^(_LT_EOF|LT_DLGLOBAL|LT_DLLAZY_OR_NOW|LT_MULTI_MODULE)$])dnl -dnl aclocal doesn't pull ltoptions.m4, ltsugar.m4, or ltversion.m4 -dnl unless we require an AC_DEFUNed macro: -AC_REQUIRE([LTOPTIONS_VERSION])dnl -AC_REQUIRE([LTSUGAR_VERSION])dnl -AC_REQUIRE([LTVERSION_VERSION])dnl -AC_REQUIRE([LTOBSOLETE_VERSION])dnl -m4_require([_LT_PROG_LTMAIN])dnl - -_LT_SHELL_INIT([SHELL=${CONFIG_SHELL-/bin/sh}]) - -dnl Parse OPTIONS -_LT_SET_OPTIONS([$0], [$1]) - -# This can be used to rebuild libtool when needed -LIBTOOL_DEPS="$ltmain" - -# Always use our own libtool. -LIBTOOL='$(SHELL) $(top_builddir)/libtool' -AC_SUBST(LIBTOOL)dnl - -_LT_SETUP - -# Only expand once: -m4_define([LT_INIT]) -])# LT_INIT - -# Old names: -AU_ALIAS([AC_PROG_LIBTOOL], [LT_INIT]) -AU_ALIAS([AM_PROG_LIBTOOL], [LT_INIT]) -dnl aclocal-1.4 backwards compatibility: -dnl AC_DEFUN([AC_PROG_LIBTOOL], []) -dnl AC_DEFUN([AM_PROG_LIBTOOL], []) - - -# _LT_CC_BASENAME(CC) -# ------------------- -# Calculate cc_basename. Skip known compiler wrappers and cross-prefix. -m4_defun([_LT_CC_BASENAME], -[for cc_temp in $1""; do - case $cc_temp in - compile | *[[\\/]]compile | ccache | *[[\\/]]ccache ) ;; - distcc | *[[\\/]]distcc | purify | *[[\\/]]purify ) ;; - \-*) ;; - *) break;; - esac -done -cc_basename=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"` -]) - - -# _LT_FILEUTILS_DEFAULTS -# ---------------------- -# It is okay to use these file commands and assume they have been set -# sensibly after `m4_require([_LT_FILEUTILS_DEFAULTS])'. -m4_defun([_LT_FILEUTILS_DEFAULTS], -[: ${CP="cp -f"} -: ${MV="mv -f"} -: ${RM="rm -f"} -])# _LT_FILEUTILS_DEFAULTS - - -# _LT_SETUP -# --------- -m4_defun([_LT_SETUP], -[AC_REQUIRE([AC_CANONICAL_HOST])dnl -AC_REQUIRE([AC_CANONICAL_BUILD])dnl -AC_REQUIRE([_LT_PREPARE_SED_QUOTE_VARS])dnl -AC_REQUIRE([_LT_PROG_ECHO_BACKSLASH])dnl - -_LT_DECL([], [PATH_SEPARATOR], [1], [The PATH separator for the build system])dnl -dnl -_LT_DECL([], [host_alias], [0], [The host system])dnl -_LT_DECL([], [host], [0])dnl -_LT_DECL([], [host_os], [0])dnl -dnl -_LT_DECL([], [build_alias], [0], [The build system])dnl -_LT_DECL([], [build], [0])dnl -_LT_DECL([], [build_os], [0])dnl -dnl -AC_REQUIRE([AC_PROG_CC])dnl -AC_REQUIRE([LT_PATH_LD])dnl -AC_REQUIRE([LT_PATH_NM])dnl -dnl -AC_REQUIRE([AC_PROG_LN_S])dnl -test -z "$LN_S" && LN_S="ln -s" -_LT_DECL([], [LN_S], [1], [Whether we need soft or hard links])dnl -dnl -AC_REQUIRE([LT_CMD_MAX_LEN])dnl -_LT_DECL([objext], [ac_objext], [0], [Object file suffix (normally "o")])dnl -_LT_DECL([], [exeext], [0], [Executable file suffix (normally "")])dnl -dnl -m4_require([_LT_FILEUTILS_DEFAULTS])dnl -m4_require([_LT_CHECK_SHELL_FEATURES])dnl -m4_require([_LT_PATH_CONVERSION_FUNCTIONS])dnl -m4_require([_LT_CMD_RELOAD])dnl -m4_require([_LT_CHECK_MAGIC_METHOD])dnl -m4_require([_LT_CHECK_SHAREDLIB_FROM_LINKLIB])dnl -m4_require([_LT_CMD_OLD_ARCHIVE])dnl -m4_require([_LT_CMD_GLOBAL_SYMBOLS])dnl -m4_require([_LT_WITH_SYSROOT])dnl - -_LT_CONFIG_LIBTOOL_INIT([ -# See if we are running on zsh, and set the options which allow our -# commands through without removal of \ escapes INIT. -if test -n "\${ZSH_VERSION+set}" ; then - setopt NO_GLOB_SUBST -fi -]) -if test -n "${ZSH_VERSION+set}" ; then - setopt NO_GLOB_SUBST -fi - -_LT_CHECK_OBJDIR - -m4_require([_LT_TAG_COMPILER])dnl - -case $host_os in -aix3*) - # AIX sometimes has problems with the GCC collect2 program. For some - # reason, if we set the COLLECT_NAMES environment variable, the problems - # vanish in a puff of smoke. - if test "X${COLLECT_NAMES+set}" != Xset; then - COLLECT_NAMES= - export COLLECT_NAMES - fi - ;; -esac - -# Global variables: -ofile=libtool -can_build_shared=yes - -# All known linkers require a `.a' archive for static linking (except MSVC, -# which needs '.lib'). -libext=a - -with_gnu_ld="$lt_cv_prog_gnu_ld" - -old_CC="$CC" -old_CFLAGS="$CFLAGS" - -# Set sane defaults for various variables -test -z "$CC" && CC=cc -test -z "$LTCC" && LTCC=$CC -test -z "$LTCFLAGS" && LTCFLAGS=$CFLAGS -test -z "$LD" && LD=ld -test -z "$ac_objext" && ac_objext=o - -_LT_CC_BASENAME([$compiler]) - -# Only perform the check for file, if the check method requires it -test -z "$MAGIC_CMD" && MAGIC_CMD=file -case $deplibs_check_method in -file_magic*) - if test "$file_magic_cmd" = '$MAGIC_CMD'; then - _LT_PATH_MAGIC - fi - ;; -esac - -# Use C for the default configuration in the libtool script -LT_SUPPORTED_TAG([CC]) -_LT_LANG_C_CONFIG -_LT_LANG_DEFAULT_CONFIG -_LT_CONFIG_COMMANDS -])# _LT_SETUP - - -# _LT_PREPARE_SED_QUOTE_VARS -# -------------------------- -# Define a few sed substitution that help us do robust quoting. -m4_defun([_LT_PREPARE_SED_QUOTE_VARS], -[# Backslashify metacharacters that are still active within -# double-quoted strings. -sed_quote_subst='s/\([["`$\\]]\)/\\\1/g' - -# Same as above, but do not quote variable references. -double_quote_subst='s/\([["`\\]]\)/\\\1/g' - -# Sed substitution to delay expansion of an escaped shell variable in a -# double_quote_subst'ed string. -delay_variable_subst='s/\\\\\\\\\\\$/\\\\\\$/g' - -# Sed substitution to delay expansion of an escaped single quote. -delay_single_quote_subst='s/'\''/'\'\\\\\\\'\''/g' - -# Sed substitution to avoid accidental globbing in evaled expressions -no_glob_subst='s/\*/\\\*/g' -]) - -# _LT_PROG_LTMAIN -# --------------- -# Note that this code is called both from `configure', and `config.status' -# now that we use AC_CONFIG_COMMANDS to generate libtool. Notably, -# `config.status' has no value for ac_aux_dir unless we are using Automake, -# so we pass a copy along to make sure it has a sensible value anyway. -m4_defun([_LT_PROG_LTMAIN], -[m4_ifdef([AC_REQUIRE_AUX_FILE], [AC_REQUIRE_AUX_FILE([ltmain.sh])])dnl -_LT_CONFIG_LIBTOOL_INIT([ac_aux_dir='$ac_aux_dir']) -ltmain="$ac_aux_dir/ltmain.sh" -])# _LT_PROG_LTMAIN - - - -# So that we can recreate a full libtool script including additional -# tags, we accumulate the chunks of code to send to AC_CONFIG_COMMANDS -# in macros and then make a single call at the end using the `libtool' -# label. - - -# _LT_CONFIG_LIBTOOL_INIT([INIT-COMMANDS]) -# ---------------------------------------- -# Register INIT-COMMANDS to be passed to AC_CONFIG_COMMANDS later. -m4_define([_LT_CONFIG_LIBTOOL_INIT], -[m4_ifval([$1], - [m4_append([_LT_OUTPUT_LIBTOOL_INIT], - [$1 -])])]) - -# Initialize. -m4_define([_LT_OUTPUT_LIBTOOL_INIT]) - - -# _LT_CONFIG_LIBTOOL([COMMANDS]) -# ------------------------------ -# Register COMMANDS to be passed to AC_CONFIG_COMMANDS later. -m4_define([_LT_CONFIG_LIBTOOL], -[m4_ifval([$1], - [m4_append([_LT_OUTPUT_LIBTOOL_COMMANDS], - [$1 -])])]) - -# Initialize. -m4_define([_LT_OUTPUT_LIBTOOL_COMMANDS]) - - -# _LT_CONFIG_SAVE_COMMANDS([COMMANDS], [INIT_COMMANDS]) -# ----------------------------------------------------- -m4_defun([_LT_CONFIG_SAVE_COMMANDS], -[_LT_CONFIG_LIBTOOL([$1]) -_LT_CONFIG_LIBTOOL_INIT([$2]) -]) - - -# _LT_FORMAT_COMMENT([COMMENT]) -# ----------------------------- -# Add leading comment marks to the start of each line, and a trailing -# full-stop to the whole comment if one is not present already. -m4_define([_LT_FORMAT_COMMENT], -[m4_ifval([$1], [ -m4_bpatsubst([m4_bpatsubst([$1], [^ *], [# ])], - [['`$\]], [\\\&])]m4_bmatch([$1], [[!?.]$], [], [.]) -)]) - - - - - -# _LT_DECL([CONFIGNAME], VARNAME, VALUE, [DESCRIPTION], [IS-TAGGED?]) -# ------------------------------------------------------------------- -# CONFIGNAME is the name given to the value in the libtool script. -# VARNAME is the (base) name used in the configure script. -# VALUE may be 0, 1 or 2 for a computed quote escaped value based on -# VARNAME. Any other value will be used directly. -m4_define([_LT_DECL], -[lt_if_append_uniq([lt_decl_varnames], [$2], [, ], - [lt_dict_add_subkey([lt_decl_dict], [$2], [libtool_name], - [m4_ifval([$1], [$1], [$2])]) - lt_dict_add_subkey([lt_decl_dict], [$2], [value], [$3]) - m4_ifval([$4], - [lt_dict_add_subkey([lt_decl_dict], [$2], [description], [$4])]) - lt_dict_add_subkey([lt_decl_dict], [$2], - [tagged?], [m4_ifval([$5], [yes], [no])])]) -]) - - -# _LT_TAGDECL([CONFIGNAME], VARNAME, VALUE, [DESCRIPTION]) -# -------------------------------------------------------- -m4_define([_LT_TAGDECL], [_LT_DECL([$1], [$2], [$3], [$4], [yes])]) - - -# lt_decl_tag_varnames([SEPARATOR], [VARNAME1...]) -# ------------------------------------------------ -m4_define([lt_decl_tag_varnames], -[_lt_decl_filter([tagged?], [yes], $@)]) - - -# _lt_decl_filter(SUBKEY, VALUE, [SEPARATOR], [VARNAME1..]) -# --------------------------------------------------------- -m4_define([_lt_decl_filter], -[m4_case([$#], - [0], [m4_fatal([$0: too few arguments: $#])], - [1], [m4_fatal([$0: too few arguments: $#: $1])], - [2], [lt_dict_filter([lt_decl_dict], [$1], [$2], [], lt_decl_varnames)], - [3], [lt_dict_filter([lt_decl_dict], [$1], [$2], [$3], lt_decl_varnames)], - [lt_dict_filter([lt_decl_dict], $@)])[]dnl -]) - - -# lt_decl_quote_varnames([SEPARATOR], [VARNAME1...]) -# -------------------------------------------------- -m4_define([lt_decl_quote_varnames], -[_lt_decl_filter([value], [1], $@)]) - - -# lt_decl_dquote_varnames([SEPARATOR], [VARNAME1...]) -# --------------------------------------------------- -m4_define([lt_decl_dquote_varnames], -[_lt_decl_filter([value], [2], $@)]) - - -# lt_decl_varnames_tagged([SEPARATOR], [VARNAME1...]) -# --------------------------------------------------- -m4_define([lt_decl_varnames_tagged], -[m4_assert([$# <= 2])dnl -_$0(m4_quote(m4_default([$1], [[, ]])), - m4_ifval([$2], [[$2]], [m4_dquote(lt_decl_tag_varnames)]), - m4_split(m4_normalize(m4_quote(_LT_TAGS)), [ ]))]) -m4_define([_lt_decl_varnames_tagged], -[m4_ifval([$3], [lt_combine([$1], [$2], [_], $3)])]) - - -# lt_decl_all_varnames([SEPARATOR], [VARNAME1...]) -# ------------------------------------------------ -m4_define([lt_decl_all_varnames], -[_$0(m4_quote(m4_default([$1], [[, ]])), - m4_if([$2], [], - m4_quote(lt_decl_varnames), - m4_quote(m4_shift($@))))[]dnl -]) -m4_define([_lt_decl_all_varnames], -[lt_join($@, lt_decl_varnames_tagged([$1], - lt_decl_tag_varnames([[, ]], m4_shift($@))))dnl -]) - - -# _LT_CONFIG_STATUS_DECLARE([VARNAME]) -# ------------------------------------ -# Quote a variable value, and forward it to `config.status' so that its -# declaration there will have the same value as in `configure'. VARNAME -# must have a single quote delimited value for this to work. -m4_define([_LT_CONFIG_STATUS_DECLARE], -[$1='`$ECHO "$][$1" | $SED "$delay_single_quote_subst"`']) - - -# _LT_CONFIG_STATUS_DECLARATIONS -# ------------------------------ -# We delimit libtool config variables with single quotes, so when -# we write them to config.status, we have to be sure to quote all -# embedded single quotes properly. In configure, this macro expands -# each variable declared with _LT_DECL (and _LT_TAGDECL) into: -# -# ='`$ECHO "$" | $SED "$delay_single_quote_subst"`' -m4_defun([_LT_CONFIG_STATUS_DECLARATIONS], -[m4_foreach([_lt_var], m4_quote(lt_decl_all_varnames), - [m4_n([_LT_CONFIG_STATUS_DECLARE(_lt_var)])])]) - - -# _LT_LIBTOOL_TAGS -# ---------------- -# Output comment and list of tags supported by the script -m4_defun([_LT_LIBTOOL_TAGS], -[_LT_FORMAT_COMMENT([The names of the tagged configurations supported by this script])dnl -available_tags="_LT_TAGS"dnl -]) - - -# _LT_LIBTOOL_DECLARE(VARNAME, [TAG]) -# ----------------------------------- -# Extract the dictionary values for VARNAME (optionally with TAG) and -# expand to a commented shell variable setting: -# -# # Some comment about what VAR is for. -# visible_name=$lt_internal_name -m4_define([_LT_LIBTOOL_DECLARE], -[_LT_FORMAT_COMMENT(m4_quote(lt_dict_fetch([lt_decl_dict], [$1], - [description])))[]dnl -m4_pushdef([_libtool_name], - m4_quote(lt_dict_fetch([lt_decl_dict], [$1], [libtool_name])))[]dnl -m4_case(m4_quote(lt_dict_fetch([lt_decl_dict], [$1], [value])), - [0], [_libtool_name=[$]$1], - [1], [_libtool_name=$lt_[]$1], - [2], [_libtool_name=$lt_[]$1], - [_libtool_name=lt_dict_fetch([lt_decl_dict], [$1], [value])])[]dnl -m4_ifval([$2], [_$2])[]m4_popdef([_libtool_name])[]dnl -]) - - -# _LT_LIBTOOL_CONFIG_VARS -# ----------------------- -# Produce commented declarations of non-tagged libtool config variables -# suitable for insertion in the LIBTOOL CONFIG section of the `libtool' -# script. Tagged libtool config variables (even for the LIBTOOL CONFIG -# section) are produced by _LT_LIBTOOL_TAG_VARS. -m4_defun([_LT_LIBTOOL_CONFIG_VARS], -[m4_foreach([_lt_var], - m4_quote(_lt_decl_filter([tagged?], [no], [], lt_decl_varnames)), - [m4_n([_LT_LIBTOOL_DECLARE(_lt_var)])])]) - - -# _LT_LIBTOOL_TAG_VARS(TAG) -# ------------------------- -m4_define([_LT_LIBTOOL_TAG_VARS], -[m4_foreach([_lt_var], m4_quote(lt_decl_tag_varnames), - [m4_n([_LT_LIBTOOL_DECLARE(_lt_var, [$1])])])]) - - -# _LT_TAGVAR(VARNAME, [TAGNAME]) -# ------------------------------ -m4_define([_LT_TAGVAR], [m4_ifval([$2], [$1_$2], [$1])]) - - -# _LT_CONFIG_COMMANDS -# ------------------- -# Send accumulated output to $CONFIG_STATUS. Thanks to the lists of -# variables for single and double quote escaping we saved from calls -# to _LT_DECL, we can put quote escaped variables declarations -# into `config.status', and then the shell code to quote escape them in -# for loops in `config.status'. Finally, any additional code accumulated -# from calls to _LT_CONFIG_LIBTOOL_INIT is expanded. -m4_defun([_LT_CONFIG_COMMANDS], -[AC_PROVIDE_IFELSE([LT_OUTPUT], - dnl If the libtool generation code has been placed in $CONFIG_LT, - dnl instead of duplicating it all over again into config.status, - dnl then we will have config.status run $CONFIG_LT later, so it - dnl needs to know what name is stored there: - [AC_CONFIG_COMMANDS([libtool], - [$SHELL $CONFIG_LT || AS_EXIT(1)], [CONFIG_LT='$CONFIG_LT'])], - dnl If the libtool generation code is destined for config.status, - dnl expand the accumulated commands and init code now: - [AC_CONFIG_COMMANDS([libtool], - [_LT_OUTPUT_LIBTOOL_COMMANDS], [_LT_OUTPUT_LIBTOOL_COMMANDS_INIT])]) -])#_LT_CONFIG_COMMANDS - - -# Initialize. -m4_define([_LT_OUTPUT_LIBTOOL_COMMANDS_INIT], -[ - -# The HP-UX ksh and POSIX shell print the target directory to stdout -# if CDPATH is set. -(unset CDPATH) >/dev/null 2>&1 && unset CDPATH - -sed_quote_subst='$sed_quote_subst' -double_quote_subst='$double_quote_subst' -delay_variable_subst='$delay_variable_subst' -_LT_CONFIG_STATUS_DECLARATIONS -LTCC='$LTCC' -LTCFLAGS='$LTCFLAGS' -compiler='$compiler_DEFAULT' - -# A function that is used when there is no print builtin or printf. -func_fallback_echo () -{ - eval 'cat <<_LTECHO_EOF -\$[]1 -_LTECHO_EOF' -} - -# Quote evaled strings. -for var in lt_decl_all_varnames([[ \ -]], lt_decl_quote_varnames); do - case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in - *[[\\\\\\\`\\"\\\$]]*) - eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED \\"\\\$sed_quote_subst\\"\\\`\\\\\\"" - ;; - *) - eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\"" - ;; - esac -done - -# Double-quote double-evaled strings. -for var in lt_decl_all_varnames([[ \ -]], lt_decl_dquote_varnames); do - case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in - *[[\\\\\\\`\\"\\\$]]*) - eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED -e \\"\\\$double_quote_subst\\" -e \\"\\\$sed_quote_subst\\" -e \\"\\\$delay_variable_subst\\"\\\`\\\\\\"" - ;; - *) - eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\"" - ;; - esac -done - -_LT_OUTPUT_LIBTOOL_INIT -]) - -# _LT_GENERATED_FILE_INIT(FILE, [COMMENT]) -# ------------------------------------ -# Generate a child script FILE with all initialization necessary to -# reuse the environment learned by the parent script, and make the -# file executable. If COMMENT is supplied, it is inserted after the -# `#!' sequence but before initialization text begins. After this -# macro, additional text can be appended to FILE to form the body of -# the child script. The macro ends with non-zero status if the -# file could not be fully written (such as if the disk is full). -m4_ifdef([AS_INIT_GENERATED], -[m4_defun([_LT_GENERATED_FILE_INIT],[AS_INIT_GENERATED($@)])], -[m4_defun([_LT_GENERATED_FILE_INIT], -[m4_require([AS_PREPARE])]dnl -[m4_pushdef([AS_MESSAGE_LOG_FD])]dnl -[lt_write_fail=0 -cat >$1 <<_ASEOF || lt_write_fail=1 -#! $SHELL -# Generated by $as_me. -$2 -SHELL=\${CONFIG_SHELL-$SHELL} -export SHELL -_ASEOF -cat >>$1 <<\_ASEOF || lt_write_fail=1 -AS_SHELL_SANITIZE -_AS_PREPARE -exec AS_MESSAGE_FD>&1 -_ASEOF -test $lt_write_fail = 0 && chmod +x $1[]dnl -m4_popdef([AS_MESSAGE_LOG_FD])])])# _LT_GENERATED_FILE_INIT - -# LT_OUTPUT -# --------- -# This macro allows early generation of the libtool script (before -# AC_OUTPUT is called), incase it is used in configure for compilation -# tests. -AC_DEFUN([LT_OUTPUT], -[: ${CONFIG_LT=./config.lt} -AC_MSG_NOTICE([creating $CONFIG_LT]) -_LT_GENERATED_FILE_INIT(["$CONFIG_LT"], -[# Run this file to recreate a libtool stub with the current configuration.]) - -cat >>"$CONFIG_LT" <<\_LTEOF -lt_cl_silent=false -exec AS_MESSAGE_LOG_FD>>config.log -{ - echo - AS_BOX([Running $as_me.]) -} >&AS_MESSAGE_LOG_FD - -lt_cl_help="\ -\`$as_me' creates a local libtool stub from the current configuration, -for use in further configure time tests before the real libtool is -generated. - -Usage: $[0] [[OPTIONS]] - - -h, --help print this help, then exit - -V, --version print version number, then exit - -q, --quiet do not print progress messages - -d, --debug don't remove temporary files - -Report bugs to ." - -lt_cl_version="\ -m4_ifset([AC_PACKAGE_NAME], [AC_PACKAGE_NAME ])config.lt[]dnl -m4_ifset([AC_PACKAGE_VERSION], [ AC_PACKAGE_VERSION]) -configured by $[0], generated by m4_PACKAGE_STRING. - -Copyright (C) 2011 Free Software Foundation, Inc. -This config.lt script is free software; the Free Software Foundation -gives unlimited permision to copy, distribute and modify it." - -while test $[#] != 0 -do - case $[1] in - --version | --v* | -V ) - echo "$lt_cl_version"; exit 0 ;; - --help | --h* | -h ) - echo "$lt_cl_help"; exit 0 ;; - --debug | --d* | -d ) - debug=: ;; - --quiet | --q* | --silent | --s* | -q ) - lt_cl_silent=: ;; - - -*) AC_MSG_ERROR([unrecognized option: $[1] -Try \`$[0] --help' for more information.]) ;; - - *) AC_MSG_ERROR([unrecognized argument: $[1] -Try \`$[0] --help' for more information.]) ;; - esac - shift -done - -if $lt_cl_silent; then - exec AS_MESSAGE_FD>/dev/null -fi -_LTEOF - -cat >>"$CONFIG_LT" <<_LTEOF -_LT_OUTPUT_LIBTOOL_COMMANDS_INIT -_LTEOF - -cat >>"$CONFIG_LT" <<\_LTEOF -AC_MSG_NOTICE([creating $ofile]) -_LT_OUTPUT_LIBTOOL_COMMANDS -AS_EXIT(0) -_LTEOF -chmod +x "$CONFIG_LT" - -# configure is writing to config.log, but config.lt does its own redirection, -# appending to config.log, which fails on DOS, as config.log is still kept -# open by configure. Here we exec the FD to /dev/null, effectively closing -# config.log, so it can be properly (re)opened and appended to by config.lt. -lt_cl_success=: -test "$silent" = yes && - lt_config_lt_args="$lt_config_lt_args --quiet" -exec AS_MESSAGE_LOG_FD>/dev/null -$SHELL "$CONFIG_LT" $lt_config_lt_args || lt_cl_success=false -exec AS_MESSAGE_LOG_FD>>config.log -$lt_cl_success || AS_EXIT(1) -])# LT_OUTPUT - - -# _LT_CONFIG(TAG) -# --------------- -# If TAG is the built-in tag, create an initial libtool script with a -# default configuration from the untagged config vars. Otherwise add code -# to config.status for appending the configuration named by TAG from the -# matching tagged config vars. -m4_defun([_LT_CONFIG], -[m4_require([_LT_FILEUTILS_DEFAULTS])dnl -_LT_CONFIG_SAVE_COMMANDS([ - m4_define([_LT_TAG], m4_if([$1], [], [C], [$1]))dnl - m4_if(_LT_TAG, [C], [ - # See if we are running on zsh, and set the options which allow our - # commands through without removal of \ escapes. - if test -n "${ZSH_VERSION+set}" ; then - setopt NO_GLOB_SUBST - fi - - cfgfile="${ofile}T" - trap "$RM \"$cfgfile\"; exit 1" 1 2 15 - $RM "$cfgfile" - - cat <<_LT_EOF >> "$cfgfile" -#! $SHELL - -# `$ECHO "$ofile" | sed 's%^.*/%%'` - Provide generalized library-building support services. -# Generated automatically by $as_me ($PACKAGE$TIMESTAMP) $VERSION -# Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`: -# NOTE: Changes made to this file will be lost: look at ltmain.sh. -# -_LT_COPYING -_LT_LIBTOOL_TAGS - -# ### BEGIN LIBTOOL CONFIG -_LT_LIBTOOL_CONFIG_VARS -_LT_LIBTOOL_TAG_VARS -# ### END LIBTOOL CONFIG - -_LT_EOF - - case $host_os in - aix3*) - cat <<\_LT_EOF >> "$cfgfile" -# AIX sometimes has problems with the GCC collect2 program. For some -# reason, if we set the COLLECT_NAMES environment variable, the problems -# vanish in a puff of smoke. -if test "X${COLLECT_NAMES+set}" != Xset; then - COLLECT_NAMES= - export COLLECT_NAMES -fi -_LT_EOF - ;; - esac - - _LT_PROG_LTMAIN - - # We use sed instead of cat because bash on DJGPP gets confused if - # if finds mixed CR/LF and LF-only lines. Since sed operates in - # text mode, it properly converts lines to CR/LF. This bash problem - # is reportedly fixed, but why not run on old versions too? - sed '$q' "$ltmain" >> "$cfgfile" \ - || (rm -f "$cfgfile"; exit 1) - - _LT_PROG_REPLACE_SHELLFNS - - mv -f "$cfgfile" "$ofile" || - (rm -f "$ofile" && cp "$cfgfile" "$ofile" && rm -f "$cfgfile") - chmod +x "$ofile" -], -[cat <<_LT_EOF >> "$ofile" - -dnl Unfortunately we have to use $1 here, since _LT_TAG is not expanded -dnl in a comment (ie after a #). -# ### BEGIN LIBTOOL TAG CONFIG: $1 -_LT_LIBTOOL_TAG_VARS(_LT_TAG) -# ### END LIBTOOL TAG CONFIG: $1 -_LT_EOF -])dnl /m4_if -], -[m4_if([$1], [], [ - PACKAGE='$PACKAGE' - VERSION='$VERSION' - TIMESTAMP='$TIMESTAMP' - RM='$RM' - ofile='$ofile'], []) -])dnl /_LT_CONFIG_SAVE_COMMANDS -])# _LT_CONFIG - - -# LT_SUPPORTED_TAG(TAG) -# --------------------- -# Trace this macro to discover what tags are supported by the libtool -# --tag option, using: -# autoconf --trace 'LT_SUPPORTED_TAG:$1' -AC_DEFUN([LT_SUPPORTED_TAG], []) - - -# C support is built-in for now -m4_define([_LT_LANG_C_enabled], []) -m4_define([_LT_TAGS], []) - - -# LT_LANG(LANG) -# ------------- -# Enable libtool support for the given language if not already enabled. -AC_DEFUN([LT_LANG], -[AC_BEFORE([$0], [LT_OUTPUT])dnl -m4_case([$1], - [C], [_LT_LANG(C)], - [C++], [_LT_LANG(CXX)], - [Go], [_LT_LANG(GO)], - [Java], [_LT_LANG(GCJ)], - [Fortran 77], [_LT_LANG(F77)], - [Fortran], [_LT_LANG(FC)], - [Windows Resource], [_LT_LANG(RC)], - [m4_ifdef([_LT_LANG_]$1[_CONFIG], - [_LT_LANG($1)], - [m4_fatal([$0: unsupported language: "$1"])])])dnl -])# LT_LANG - - -# _LT_LANG(LANGNAME) -# ------------------ -m4_defun([_LT_LANG], -[m4_ifdef([_LT_LANG_]$1[_enabled], [], - [LT_SUPPORTED_TAG([$1])dnl - m4_append([_LT_TAGS], [$1 ])dnl - m4_define([_LT_LANG_]$1[_enabled], [])dnl - _LT_LANG_$1_CONFIG($1)])dnl -])# _LT_LANG - - -m4_ifndef([AC_PROG_GO], [ -# NOTE: This macro has been submitted for inclusion into # -# GNU Autoconf as AC_PROG_GO. When it is available in # -# a released version of Autoconf we should remove this # -# macro and use it instead. # -m4_defun([AC_PROG_GO], -[AC_LANG_PUSH(Go)dnl -AC_ARG_VAR([GOC], [Go compiler command])dnl -AC_ARG_VAR([GOFLAGS], [Go compiler flags])dnl -_AC_ARG_VAR_LDFLAGS()dnl -AC_CHECK_TOOL(GOC, gccgo) -if test -z "$GOC"; then - if test -n "$ac_tool_prefix"; then - AC_CHECK_PROG(GOC, [${ac_tool_prefix}gccgo], [${ac_tool_prefix}gccgo]) - fi -fi -if test -z "$GOC"; then - AC_CHECK_PROG(GOC, gccgo, gccgo, false) -fi -])#m4_defun -])#m4_ifndef - - -# _LT_LANG_DEFAULT_CONFIG -# ----------------------- -m4_defun([_LT_LANG_DEFAULT_CONFIG], -[AC_PROVIDE_IFELSE([AC_PROG_CXX], - [LT_LANG(CXX)], - [m4_define([AC_PROG_CXX], defn([AC_PROG_CXX])[LT_LANG(CXX)])]) - -AC_PROVIDE_IFELSE([AC_PROG_F77], - [LT_LANG(F77)], - [m4_define([AC_PROG_F77], defn([AC_PROG_F77])[LT_LANG(F77)])]) - -AC_PROVIDE_IFELSE([AC_PROG_FC], - [LT_LANG(FC)], - [m4_define([AC_PROG_FC], defn([AC_PROG_FC])[LT_LANG(FC)])]) - -dnl The call to [A][M_PROG_GCJ] is quoted like that to stop aclocal -dnl pulling things in needlessly. -AC_PROVIDE_IFELSE([AC_PROG_GCJ], - [LT_LANG(GCJ)], - [AC_PROVIDE_IFELSE([A][M_PROG_GCJ], - [LT_LANG(GCJ)], - [AC_PROVIDE_IFELSE([LT_PROG_GCJ], - [LT_LANG(GCJ)], - [m4_ifdef([AC_PROG_GCJ], - [m4_define([AC_PROG_GCJ], defn([AC_PROG_GCJ])[LT_LANG(GCJ)])]) - m4_ifdef([A][M_PROG_GCJ], - [m4_define([A][M_PROG_GCJ], defn([A][M_PROG_GCJ])[LT_LANG(GCJ)])]) - m4_ifdef([LT_PROG_GCJ], - [m4_define([LT_PROG_GCJ], defn([LT_PROG_GCJ])[LT_LANG(GCJ)])])])])]) - -AC_PROVIDE_IFELSE([AC_PROG_GO], - [LT_LANG(GO)], - [m4_define([AC_PROG_GO], defn([AC_PROG_GO])[LT_LANG(GO)])]) - -AC_PROVIDE_IFELSE([LT_PROG_RC], - [LT_LANG(RC)], - [m4_define([LT_PROG_RC], defn([LT_PROG_RC])[LT_LANG(RC)])]) -])# _LT_LANG_DEFAULT_CONFIG - -# Obsolete macros: -AU_DEFUN([AC_LIBTOOL_CXX], [LT_LANG(C++)]) -AU_DEFUN([AC_LIBTOOL_F77], [LT_LANG(Fortran 77)]) -AU_DEFUN([AC_LIBTOOL_FC], [LT_LANG(Fortran)]) -AU_DEFUN([AC_LIBTOOL_GCJ], [LT_LANG(Java)]) -AU_DEFUN([AC_LIBTOOL_RC], [LT_LANG(Windows Resource)]) -dnl aclocal-1.4 backwards compatibility: -dnl AC_DEFUN([AC_LIBTOOL_CXX], []) -dnl AC_DEFUN([AC_LIBTOOL_F77], []) -dnl AC_DEFUN([AC_LIBTOOL_FC], []) -dnl AC_DEFUN([AC_LIBTOOL_GCJ], []) -dnl AC_DEFUN([AC_LIBTOOL_RC], []) - - -# _LT_TAG_COMPILER -# ---------------- -m4_defun([_LT_TAG_COMPILER], -[AC_REQUIRE([AC_PROG_CC])dnl - -_LT_DECL([LTCC], [CC], [1], [A C compiler])dnl -_LT_DECL([LTCFLAGS], [CFLAGS], [1], [LTCC compiler flags])dnl -_LT_TAGDECL([CC], [compiler], [1], [A language specific compiler])dnl -_LT_TAGDECL([with_gcc], [GCC], [0], [Is the compiler the GNU compiler?])dnl - -# If no C compiler was specified, use CC. -LTCC=${LTCC-"$CC"} - -# If no C compiler flags were specified, use CFLAGS. -LTCFLAGS=${LTCFLAGS-"$CFLAGS"} - -# Allow CC to be a program name with arguments. -compiler=$CC -])# _LT_TAG_COMPILER - - -# _LT_COMPILER_BOILERPLATE -# ------------------------ -# Check for compiler boilerplate output or warnings with -# the simple compiler test code. -m4_defun([_LT_COMPILER_BOILERPLATE], -[m4_require([_LT_DECL_SED])dnl -ac_outfile=conftest.$ac_objext -echo "$lt_simple_compile_test_code" >conftest.$ac_ext -eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err -_lt_compiler_boilerplate=`cat conftest.err` -$RM conftest* -])# _LT_COMPILER_BOILERPLATE - - -# _LT_LINKER_BOILERPLATE -# ---------------------- -# Check for linker boilerplate output or warnings with -# the simple link test code. -m4_defun([_LT_LINKER_BOILERPLATE], -[m4_require([_LT_DECL_SED])dnl -ac_outfile=conftest.$ac_objext -echo "$lt_simple_link_test_code" >conftest.$ac_ext -eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err -_lt_linker_boilerplate=`cat conftest.err` -$RM -r conftest* -])# _LT_LINKER_BOILERPLATE - -# _LT_REQUIRED_DARWIN_CHECKS -# ------------------------- -m4_defun_once([_LT_REQUIRED_DARWIN_CHECKS],[ - case $host_os in - rhapsody* | darwin*) - AC_CHECK_TOOL([DSYMUTIL], [dsymutil], [:]) - AC_CHECK_TOOL([NMEDIT], [nmedit], [:]) - AC_CHECK_TOOL([LIPO], [lipo], [:]) - AC_CHECK_TOOL([OTOOL], [otool], [:]) - AC_CHECK_TOOL([OTOOL64], [otool64], [:]) - _LT_DECL([], [DSYMUTIL], [1], - [Tool to manipulate archived DWARF debug symbol files on Mac OS X]) - _LT_DECL([], [NMEDIT], [1], - [Tool to change global to local symbols on Mac OS X]) - _LT_DECL([], [LIPO], [1], - [Tool to manipulate fat objects and archives on Mac OS X]) - _LT_DECL([], [OTOOL], [1], - [ldd/readelf like tool for Mach-O binaries on Mac OS X]) - _LT_DECL([], [OTOOL64], [1], - [ldd/readelf like tool for 64 bit Mach-O binaries on Mac OS X 10.4]) - - AC_CACHE_CHECK([for -single_module linker flag],[lt_cv_apple_cc_single_mod], - [lt_cv_apple_cc_single_mod=no - if test -z "${LT_MULTI_MODULE}"; then - # By default we will add the -single_module flag. You can override - # by either setting the environment variable LT_MULTI_MODULE - # non-empty at configure time, or by adding -multi_module to the - # link flags. - rm -rf libconftest.dylib* - echo "int foo(void){return 1;}" > conftest.c - echo "$LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \ --dynamiclib -Wl,-single_module conftest.c" >&AS_MESSAGE_LOG_FD - $LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \ - -dynamiclib -Wl,-single_module conftest.c 2>conftest.err - _lt_result=$? - # If there is a non-empty error log, and "single_module" - # appears in it, assume the flag caused a linker warning - if test -s conftest.err && $GREP single_module conftest.err; then - cat conftest.err >&AS_MESSAGE_LOG_FD - # Otherwise, if the output was created with a 0 exit code from - # the compiler, it worked. - elif test -f libconftest.dylib && test $_lt_result -eq 0; then - lt_cv_apple_cc_single_mod=yes - else - cat conftest.err >&AS_MESSAGE_LOG_FD - fi - rm -rf libconftest.dylib* - rm -f conftest.* - fi]) - - AC_CACHE_CHECK([for -exported_symbols_list linker flag], - [lt_cv_ld_exported_symbols_list], - [lt_cv_ld_exported_symbols_list=no - save_LDFLAGS=$LDFLAGS - echo "_main" > conftest.sym - LDFLAGS="$LDFLAGS -Wl,-exported_symbols_list,conftest.sym" - AC_LINK_IFELSE([AC_LANG_PROGRAM([],[])], - [lt_cv_ld_exported_symbols_list=yes], - [lt_cv_ld_exported_symbols_list=no]) - LDFLAGS="$save_LDFLAGS" - ]) - - AC_CACHE_CHECK([for -force_load linker flag],[lt_cv_ld_force_load], - [lt_cv_ld_force_load=no - cat > conftest.c << _LT_EOF -int forced_loaded() { return 2;} -_LT_EOF - echo "$LTCC $LTCFLAGS -c -o conftest.o conftest.c" >&AS_MESSAGE_LOG_FD - $LTCC $LTCFLAGS -c -o conftest.o conftest.c 2>&AS_MESSAGE_LOG_FD - echo "$AR cru libconftest.a conftest.o" >&AS_MESSAGE_LOG_FD - $AR cru libconftest.a conftest.o 2>&AS_MESSAGE_LOG_FD - echo "$RANLIB libconftest.a" >&AS_MESSAGE_LOG_FD - $RANLIB libconftest.a 2>&AS_MESSAGE_LOG_FD - cat > conftest.c << _LT_EOF -int main() { return 0;} -_LT_EOF - echo "$LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a" >&AS_MESSAGE_LOG_FD - $LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a 2>conftest.err - _lt_result=$? - if test -s conftest.err && $GREP force_load conftest.err; then - cat conftest.err >&AS_MESSAGE_LOG_FD - elif test -f conftest && test $_lt_result -eq 0 && $GREP forced_load conftest >/dev/null 2>&1 ; then - lt_cv_ld_force_load=yes - else - cat conftest.err >&AS_MESSAGE_LOG_FD - fi - rm -f conftest.err libconftest.a conftest conftest.c - rm -rf conftest.dSYM - ]) - case $host_os in - rhapsody* | darwin1.[[012]]) - _lt_dar_allow_undefined='${wl}-undefined ${wl}suppress' ;; - darwin1.*) - _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;; - darwin*) # darwin 5.x on - # if running on 10.5 or later, the deployment target defaults - # to the OS version, if on x86, and 10.4, the deployment - # target defaults to 10.4. Don't you love it? - case ${MACOSX_DEPLOYMENT_TARGET-10.0},$host in - 10.0,*86*-darwin8*|10.0,*-darwin[[91]]*) - _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;; - 10.[[012]]*) - _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;; - 10.*) - _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;; - esac - ;; - esac - if test "$lt_cv_apple_cc_single_mod" = "yes"; then - _lt_dar_single_mod='$single_module' - fi - if test "$lt_cv_ld_exported_symbols_list" = "yes"; then - _lt_dar_export_syms=' ${wl}-exported_symbols_list,$output_objdir/${libname}-symbols.expsym' - else - _lt_dar_export_syms='~$NMEDIT -s $output_objdir/${libname}-symbols.expsym ${lib}' - fi - if test "$DSYMUTIL" != ":" && test "$lt_cv_ld_force_load" = "no"; then - _lt_dsymutil='~$DSYMUTIL $lib || :' - else - _lt_dsymutil= - fi - ;; - esac -]) - - -# _LT_DARWIN_LINKER_FEATURES([TAG]) -# --------------------------------- -# Checks for linker and compiler features on darwin -m4_defun([_LT_DARWIN_LINKER_FEATURES], -[ - m4_require([_LT_REQUIRED_DARWIN_CHECKS]) - _LT_TAGVAR(archive_cmds_need_lc, $1)=no - _LT_TAGVAR(hardcode_direct, $1)=no - _LT_TAGVAR(hardcode_automatic, $1)=yes - _LT_TAGVAR(hardcode_shlibpath_var, $1)=unsupported - if test "$lt_cv_ld_force_load" = "yes"; then - _LT_TAGVAR(whole_archive_flag_spec, $1)='`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience ${wl}-force_load,$conv\"; done; func_echo_all \"$new_convenience\"`' - m4_case([$1], [F77], [_LT_TAGVAR(compiler_needs_object, $1)=yes], - [FC], [_LT_TAGVAR(compiler_needs_object, $1)=yes]) - else - _LT_TAGVAR(whole_archive_flag_spec, $1)='' - fi - _LT_TAGVAR(link_all_deplibs, $1)=yes - _LT_TAGVAR(allow_undefined_flag, $1)="$_lt_dar_allow_undefined" - case $cc_basename in - ifort*) _lt_dar_can_shared=yes ;; - *) _lt_dar_can_shared=$GCC ;; - esac - if test "$_lt_dar_can_shared" = "yes"; then - output_verbose_link_cmd=func_echo_all - _LT_TAGVAR(archive_cmds, $1)="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod${_lt_dsymutil}" - _LT_TAGVAR(module_cmds, $1)="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dsymutil}" - _LT_TAGVAR(archive_expsym_cmds, $1)="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring ${_lt_dar_single_mod}${_lt_dar_export_syms}${_lt_dsymutil}" - _LT_TAGVAR(module_expsym_cmds, $1)="sed -e 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dar_export_syms}${_lt_dsymutil}" - m4_if([$1], [CXX], -[ if test "$lt_cv_apple_cc_single_mod" != "yes"; then - _LT_TAGVAR(archive_cmds, $1)="\$CC -r -keep_private_externs -nostdlib -o \${lib}-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \${lib}-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring${_lt_dsymutil}" - _LT_TAGVAR(archive_expsym_cmds, $1)="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -r -keep_private_externs -nostdlib -o \${lib}-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \${lib}-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring${_lt_dar_export_syms}${_lt_dsymutil}" - fi -],[]) - else - _LT_TAGVAR(ld_shlibs, $1)=no - fi -]) - -# _LT_SYS_MODULE_PATH_AIX([TAGNAME]) -# ---------------------------------- -# Links a minimal program and checks the executable -# for the system default hardcoded library path. In most cases, -# this is /usr/lib:/lib, but when the MPI compilers are used -# the location of the communication and MPI libs are included too. -# If we don't find anything, use the default library path according -# to the aix ld manual. -# Store the results from the different compilers for each TAGNAME. -# Allow to override them for all tags through lt_cv_aix_libpath. -m4_defun([_LT_SYS_MODULE_PATH_AIX], -[m4_require([_LT_DECL_SED])dnl -if test "${lt_cv_aix_libpath+set}" = set; then - aix_libpath=$lt_cv_aix_libpath -else - AC_CACHE_VAL([_LT_TAGVAR([lt_cv_aix_libpath_], [$1])], - [AC_LINK_IFELSE([AC_LANG_PROGRAM],[ - lt_aix_libpath_sed='[ - /Import File Strings/,/^$/ { - /^0/ { - s/^0 *\([^ ]*\) *$/\1/ - p - } - }]' - _LT_TAGVAR([lt_cv_aix_libpath_], [$1])=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` - # Check for a 64-bit object if we didn't find anything. - if test -z "$_LT_TAGVAR([lt_cv_aix_libpath_], [$1])"; then - _LT_TAGVAR([lt_cv_aix_libpath_], [$1])=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` - fi],[]) - if test -z "$_LT_TAGVAR([lt_cv_aix_libpath_], [$1])"; then - _LT_TAGVAR([lt_cv_aix_libpath_], [$1])="/usr/lib:/lib" - fi - ]) - aix_libpath=$_LT_TAGVAR([lt_cv_aix_libpath_], [$1]) -fi -])# _LT_SYS_MODULE_PATH_AIX - - -# _LT_SHELL_INIT(ARG) -# ------------------- -m4_define([_LT_SHELL_INIT], -[m4_divert_text([M4SH-INIT], [$1 -])])# _LT_SHELL_INIT - - - -# _LT_PROG_ECHO_BACKSLASH -# ----------------------- -# Find how we can fake an echo command that does not interpret backslash. -# In particular, with Autoconf 2.60 or later we add some code to the start -# of the generated configure script which will find a shell with a builtin -# printf (which we can use as an echo command). -m4_defun([_LT_PROG_ECHO_BACKSLASH], -[ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' -ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO -ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO$ECHO - -AC_MSG_CHECKING([how to print strings]) -# Test print first, because it will be a builtin if present. -if test "X`( print -r -- -n ) 2>/dev/null`" = X-n && \ - test "X`print -r -- $ECHO 2>/dev/null`" = "X$ECHO"; then - ECHO='print -r --' -elif test "X`printf %s $ECHO 2>/dev/null`" = "X$ECHO"; then - ECHO='printf %s\n' -else - # Use this function as a fallback that always works. - func_fallback_echo () - { - eval 'cat <<_LTECHO_EOF -$[]1 -_LTECHO_EOF' - } - ECHO='func_fallback_echo' -fi - -# func_echo_all arg... -# Invoke $ECHO with all args, space-separated. -func_echo_all () -{ - $ECHO "$*" -} - -case "$ECHO" in - printf*) AC_MSG_RESULT([printf]) ;; - print*) AC_MSG_RESULT([print -r]) ;; - *) AC_MSG_RESULT([cat]) ;; -esac - -m4_ifdef([_AS_DETECT_SUGGESTED], -[_AS_DETECT_SUGGESTED([ - test -n "${ZSH_VERSION+set}${BASH_VERSION+set}" || ( - ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' - ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO - ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO$ECHO - PATH=/empty FPATH=/empty; export PATH FPATH - test "X`printf %s $ECHO`" = "X$ECHO" \ - || test "X`print -r -- $ECHO`" = "X$ECHO" )])]) - -_LT_DECL([], [SHELL], [1], [Shell to use when invoking shell scripts]) -_LT_DECL([], [ECHO], [1], [An echo program that protects backslashes]) -])# _LT_PROG_ECHO_BACKSLASH - - -# _LT_WITH_SYSROOT -# ---------------- -AC_DEFUN([_LT_WITH_SYSROOT], -[AC_MSG_CHECKING([for sysroot]) -AC_ARG_WITH([sysroot], -[ --with-sysroot[=DIR] Search for dependent libraries within DIR - (or the compiler's sysroot if not specified).], -[], [with_sysroot=no]) - -dnl lt_sysroot will always be passed unquoted. We quote it here -dnl in case the user passed a directory name. -lt_sysroot= -case ${with_sysroot} in #( - yes) - if test "$GCC" = yes; then - lt_sysroot=`$CC --print-sysroot 2>/dev/null` - fi - ;; #( - /*) - lt_sysroot=`echo "$with_sysroot" | sed -e "$sed_quote_subst"` - ;; #( - no|'') - ;; #( - *) - AC_MSG_RESULT([${with_sysroot}]) - AC_MSG_ERROR([The sysroot must be an absolute path.]) - ;; -esac - - AC_MSG_RESULT([${lt_sysroot:-no}]) -_LT_DECL([], [lt_sysroot], [0], [The root where to search for ]dnl -[dependent libraries, and in which our libraries should be installed.])]) - -# _LT_ENABLE_LOCK -# --------------- -m4_defun([_LT_ENABLE_LOCK], -[AC_ARG_ENABLE([libtool-lock], - [AS_HELP_STRING([--disable-libtool-lock], - [avoid locking (might break parallel builds)])]) -test "x$enable_libtool_lock" != xno && enable_libtool_lock=yes - -# Some flags need to be propagated to the compiler or linker for good -# libtool support. -case $host in -ia64-*-hpux*) - # Find out which ABI we are using. - echo 'int i;' > conftest.$ac_ext - if AC_TRY_EVAL(ac_compile); then - case `/usr/bin/file conftest.$ac_objext` in - *ELF-32*) - HPUX_IA64_MODE="32" - ;; - *ELF-64*) - HPUX_IA64_MODE="64" - ;; - esac - fi - rm -rf conftest* - ;; -*-*-irix6*) - # Find out which ABI we are using. - echo '[#]line '$LINENO' "configure"' > conftest.$ac_ext - if AC_TRY_EVAL(ac_compile); then - if test "$lt_cv_prog_gnu_ld" = yes; then - case `/usr/bin/file conftest.$ac_objext` in - *32-bit*) - LD="${LD-ld} -melf32bsmip" - ;; - *N32*) - LD="${LD-ld} -melf32bmipn32" - ;; - *64-bit*) - LD="${LD-ld} -melf64bmip" - ;; - esac - else - case `/usr/bin/file conftest.$ac_objext` in - *32-bit*) - LD="${LD-ld} -32" - ;; - *N32*) - LD="${LD-ld} -n32" - ;; - *64-bit*) - LD="${LD-ld} -64" - ;; - esac - fi - fi - rm -rf conftest* - ;; - -x86_64-*kfreebsd*-gnu|x86_64-*linux*|ppc*-*linux*|powerpc*-*linux*| \ -s390*-*linux*|s390*-*tpf*|sparc*-*linux*) - # Find out which ABI we are using. - echo 'int i;' > conftest.$ac_ext - if AC_TRY_EVAL(ac_compile); then - case `/usr/bin/file conftest.o` in - *32-bit*) - case $host in - x86_64-*kfreebsd*-gnu) - LD="${LD-ld} -m elf_i386_fbsd" - ;; - x86_64-*linux*) - LD="${LD-ld} -m elf_i386" - ;; - ppc64-*linux*|powerpc64-*linux*) - LD="${LD-ld} -m elf32ppclinux" - ;; - s390x-*linux*) - LD="${LD-ld} -m elf_s390" - ;; - sparc64-*linux*) - LD="${LD-ld} -m elf32_sparc" - ;; - esac - ;; - *64-bit*) - case $host in - x86_64-*kfreebsd*-gnu) - LD="${LD-ld} -m elf_x86_64_fbsd" - ;; - x86_64-*linux*) - LD="${LD-ld} -m elf_x86_64" - ;; - ppc*-*linux*|powerpc*-*linux*) - LD="${LD-ld} -m elf64ppc" - ;; - s390*-*linux*|s390*-*tpf*) - LD="${LD-ld} -m elf64_s390" - ;; - sparc*-*linux*) - LD="${LD-ld} -m elf64_sparc" - ;; - esac - ;; - esac - fi - rm -rf conftest* - ;; - -*-*-sco3.2v5*) - # On SCO OpenServer 5, we need -belf to get full-featured binaries. - SAVE_CFLAGS="$CFLAGS" - CFLAGS="$CFLAGS -belf" - AC_CACHE_CHECK([whether the C compiler needs -belf], lt_cv_cc_needs_belf, - [AC_LANG_PUSH(C) - AC_LINK_IFELSE([AC_LANG_PROGRAM([[]],[[]])],[lt_cv_cc_needs_belf=yes],[lt_cv_cc_needs_belf=no]) - AC_LANG_POP]) - if test x"$lt_cv_cc_needs_belf" != x"yes"; then - # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf - CFLAGS="$SAVE_CFLAGS" - fi - ;; -*-*solaris*) - # Find out which ABI we are using. - echo 'int i;' > conftest.$ac_ext - if AC_TRY_EVAL(ac_compile); then - case `/usr/bin/file conftest.o` in - *64-bit*) - case $lt_cv_prog_gnu_ld in - yes*) - case $host in - i?86-*-solaris*) - LD="${LD-ld} -m elf_x86_64" - ;; - sparc*-*-solaris*) - LD="${LD-ld} -m elf64_sparc" - ;; - esac - # GNU ld 2.21 introduced _sol2 emulations. Use them if available. - if ${LD-ld} -V | grep _sol2 >/dev/null 2>&1; then - LD="${LD-ld}_sol2" - fi - ;; - *) - if ${LD-ld} -64 -r -o conftest2.o conftest.o >/dev/null 2>&1; then - LD="${LD-ld} -64" - fi - ;; - esac - ;; - esac - fi - rm -rf conftest* - ;; -esac - -need_locks="$enable_libtool_lock" -])# _LT_ENABLE_LOCK - - -# _LT_PROG_AR -# ----------- -m4_defun([_LT_PROG_AR], -[AC_CHECK_TOOLS(AR, [ar], false) -: ${AR=ar} -: ${AR_FLAGS=cru} -_LT_DECL([], [AR], [1], [The archiver]) -_LT_DECL([], [AR_FLAGS], [1], [Flags to create an archive]) - -AC_CACHE_CHECK([for archiver @FILE support], [lt_cv_ar_at_file], - [lt_cv_ar_at_file=no - AC_COMPILE_IFELSE([AC_LANG_PROGRAM], - [echo conftest.$ac_objext > conftest.lst - lt_ar_try='$AR $AR_FLAGS libconftest.a @conftest.lst >&AS_MESSAGE_LOG_FD' - AC_TRY_EVAL([lt_ar_try]) - if test "$ac_status" -eq 0; then - # Ensure the archiver fails upon bogus file names. - rm -f conftest.$ac_objext libconftest.a - AC_TRY_EVAL([lt_ar_try]) - if test "$ac_status" -ne 0; then - lt_cv_ar_at_file=@ - fi - fi - rm -f conftest.* libconftest.a - ]) - ]) - -if test "x$lt_cv_ar_at_file" = xno; then - archiver_list_spec= -else - archiver_list_spec=$lt_cv_ar_at_file -fi -_LT_DECL([], [archiver_list_spec], [1], - [How to feed a file listing to the archiver]) -])# _LT_PROG_AR - - -# _LT_CMD_OLD_ARCHIVE -# ------------------- -m4_defun([_LT_CMD_OLD_ARCHIVE], -[_LT_PROG_AR - -AC_CHECK_TOOL(STRIP, strip, :) -test -z "$STRIP" && STRIP=: -_LT_DECL([], [STRIP], [1], [A symbol stripping program]) - -AC_CHECK_TOOL(RANLIB, ranlib, :) -test -z "$RANLIB" && RANLIB=: -_LT_DECL([], [RANLIB], [1], - [Commands used to install an old-style archive]) - -# Determine commands to create old-style static archives. -old_archive_cmds='$AR $AR_FLAGS $oldlib$oldobjs' -old_postinstall_cmds='chmod 644 $oldlib' -old_postuninstall_cmds= - -if test -n "$RANLIB"; then - case $host_os in - openbsd*) - old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB -t \$tool_oldlib" - ;; - *) - old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB \$tool_oldlib" - ;; - esac - old_archive_cmds="$old_archive_cmds~\$RANLIB \$tool_oldlib" -fi - -case $host_os in - darwin*) - lock_old_archive_extraction=yes ;; - *) - lock_old_archive_extraction=no ;; -esac -_LT_DECL([], [old_postinstall_cmds], [2]) -_LT_DECL([], [old_postuninstall_cmds], [2]) -_LT_TAGDECL([], [old_archive_cmds], [2], - [Commands used to build an old-style archive]) -_LT_DECL([], [lock_old_archive_extraction], [0], - [Whether to use a lock for old archive extraction]) -])# _LT_CMD_OLD_ARCHIVE - - -# _LT_COMPILER_OPTION(MESSAGE, VARIABLE-NAME, FLAGS, -# [OUTPUT-FILE], [ACTION-SUCCESS], [ACTION-FAILURE]) -# ---------------------------------------------------------------- -# Check whether the given compiler option works -AC_DEFUN([_LT_COMPILER_OPTION], -[m4_require([_LT_FILEUTILS_DEFAULTS])dnl -m4_require([_LT_DECL_SED])dnl -AC_CACHE_CHECK([$1], [$2], - [$2=no - m4_if([$4], , [ac_outfile=conftest.$ac_objext], [ac_outfile=$4]) - echo "$lt_simple_compile_test_code" > conftest.$ac_ext - lt_compiler_flag="$3" - # Insert the option either (1) after the last *FLAGS variable, or - # (2) before a word containing "conftest.", or (3) at the end. - # Note that $ac_compile itself does not contain backslashes and begins - # with a dollar sign (not a hyphen), so the echo should work correctly. - # The option is referenced via a variable to avoid confusing sed. - lt_compile=`echo "$ac_compile" | $SED \ - -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ - -e 's: [[^ ]]*conftest\.: $lt_compiler_flag&:; t' \ - -e 's:$: $lt_compiler_flag:'` - (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&AS_MESSAGE_LOG_FD) - (eval "$lt_compile" 2>conftest.err) - ac_status=$? - cat conftest.err >&AS_MESSAGE_LOG_FD - echo "$as_me:$LINENO: \$? = $ac_status" >&AS_MESSAGE_LOG_FD - if (exit $ac_status) && test -s "$ac_outfile"; then - # The compiler can only warn and ignore the option if not recognized - # So say no if there are warnings other than the usual output. - $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp - $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 - if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then - $2=yes - fi - fi - $RM conftest* -]) - -if test x"[$]$2" = xyes; then - m4_if([$5], , :, [$5]) -else - m4_if([$6], , :, [$6]) -fi -])# _LT_COMPILER_OPTION - -# Old name: -AU_ALIAS([AC_LIBTOOL_COMPILER_OPTION], [_LT_COMPILER_OPTION]) -dnl aclocal-1.4 backwards compatibility: -dnl AC_DEFUN([AC_LIBTOOL_COMPILER_OPTION], []) - - -# _LT_LINKER_OPTION(MESSAGE, VARIABLE-NAME, FLAGS, -# [ACTION-SUCCESS], [ACTION-FAILURE]) -# ---------------------------------------------------- -# Check whether the given linker option works -AC_DEFUN([_LT_LINKER_OPTION], -[m4_require([_LT_FILEUTILS_DEFAULTS])dnl -m4_require([_LT_DECL_SED])dnl -AC_CACHE_CHECK([$1], [$2], - [$2=no - save_LDFLAGS="$LDFLAGS" - LDFLAGS="$LDFLAGS $3" - echo "$lt_simple_link_test_code" > conftest.$ac_ext - if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then - # The linker can only warn and ignore the option if not recognized - # So say no if there are warnings - if test -s conftest.err; then - # Append any errors to the config.log. - cat conftest.err 1>&AS_MESSAGE_LOG_FD - $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp - $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 - if diff conftest.exp conftest.er2 >/dev/null; then - $2=yes - fi - else - $2=yes - fi - fi - $RM -r conftest* - LDFLAGS="$save_LDFLAGS" -]) - -if test x"[$]$2" = xyes; then - m4_if([$4], , :, [$4]) -else - m4_if([$5], , :, [$5]) -fi -])# _LT_LINKER_OPTION - -# Old name: -AU_ALIAS([AC_LIBTOOL_LINKER_OPTION], [_LT_LINKER_OPTION]) -dnl aclocal-1.4 backwards compatibility: -dnl AC_DEFUN([AC_LIBTOOL_LINKER_OPTION], []) - - -# LT_CMD_MAX_LEN -#--------------- -AC_DEFUN([LT_CMD_MAX_LEN], -[AC_REQUIRE([AC_CANONICAL_HOST])dnl -# find the maximum length of command line arguments -AC_MSG_CHECKING([the maximum length of command line arguments]) -AC_CACHE_VAL([lt_cv_sys_max_cmd_len], [dnl - i=0 - teststring="ABCD" - - case $build_os in - msdosdjgpp*) - # On DJGPP, this test can blow up pretty badly due to problems in libc - # (any single argument exceeding 2000 bytes causes a buffer overrun - # during glob expansion). Even if it were fixed, the result of this - # check would be larger than it should be. - lt_cv_sys_max_cmd_len=12288; # 12K is about right - ;; - - gnu*) - # Under GNU Hurd, this test is not required because there is - # no limit to the length of command line arguments. - # Libtool will interpret -1 as no limit whatsoever - lt_cv_sys_max_cmd_len=-1; - ;; - - cygwin* | mingw* | cegcc*) - # On Win9x/ME, this test blows up -- it succeeds, but takes - # about 5 minutes as the teststring grows exponentially. - # Worse, since 9x/ME are not pre-emptively multitasking, - # you end up with a "frozen" computer, even though with patience - # the test eventually succeeds (with a max line length of 256k). - # Instead, let's just punt: use the minimum linelength reported by - # all of the supported platforms: 8192 (on NT/2K/XP). - lt_cv_sys_max_cmd_len=8192; - ;; - - mint*) - # On MiNT this can take a long time and run out of memory. - lt_cv_sys_max_cmd_len=8192; - ;; - - amigaos*) - # On AmigaOS with pdksh, this test takes hours, literally. - # So we just punt and use a minimum line length of 8192. - lt_cv_sys_max_cmd_len=8192; - ;; - - netbsd* | freebsd* | openbsd* | darwin* | dragonfly*) - # This has been around since 386BSD, at least. Likely further. - if test -x /sbin/sysctl; then - lt_cv_sys_max_cmd_len=`/sbin/sysctl -n kern.argmax` - elif test -x /usr/sbin/sysctl; then - lt_cv_sys_max_cmd_len=`/usr/sbin/sysctl -n kern.argmax` - else - lt_cv_sys_max_cmd_len=65536 # usable default for all BSDs - fi - # And add a safety zone - lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` - lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` - ;; - - interix*) - # We know the value 262144 and hardcode it with a safety zone (like BSD) - lt_cv_sys_max_cmd_len=196608 - ;; - - os2*) - # The test takes a long time on OS/2. - lt_cv_sys_max_cmd_len=8192 - ;; - - osf*) - # Dr. Hans Ekkehard Plesser reports seeing a kernel panic running configure - # due to this test when exec_disable_arg_limit is 1 on Tru64. It is not - # nice to cause kernel panics so lets avoid the loop below. - # First set a reasonable default. - lt_cv_sys_max_cmd_len=16384 - # - if test -x /sbin/sysconfig; then - case `/sbin/sysconfig -q proc exec_disable_arg_limit` in - *1*) lt_cv_sys_max_cmd_len=-1 ;; - esac - fi - ;; - sco3.2v5*) - lt_cv_sys_max_cmd_len=102400 - ;; - sysv5* | sco5v6* | sysv4.2uw2*) - kargmax=`grep ARG_MAX /etc/conf/cf.d/stune 2>/dev/null` - if test -n "$kargmax"; then - lt_cv_sys_max_cmd_len=`echo $kargmax | sed 's/.*[[ ]]//'` - else - lt_cv_sys_max_cmd_len=32768 - fi - ;; - *) - lt_cv_sys_max_cmd_len=`(getconf ARG_MAX) 2> /dev/null` - if test -n "$lt_cv_sys_max_cmd_len"; then - lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` - lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` - else - # Make teststring a little bigger before we do anything with it. - # a 1K string should be a reasonable start. - for i in 1 2 3 4 5 6 7 8 ; do - teststring=$teststring$teststring - done - SHELL=${SHELL-${CONFIG_SHELL-/bin/sh}} - # If test is not a shell built-in, we'll probably end up computing a - # maximum length that is only half of the actual maximum length, but - # we can't tell. - while { test "X"`env echo "$teststring$teststring" 2>/dev/null` \ - = "X$teststring$teststring"; } >/dev/null 2>&1 && - test $i != 17 # 1/2 MB should be enough - do - i=`expr $i + 1` - teststring=$teststring$teststring - done - # Only check the string length outside the loop. - lt_cv_sys_max_cmd_len=`expr "X$teststring" : ".*" 2>&1` - teststring= - # Add a significant safety factor because C++ compilers can tack on - # massive amounts of additional arguments before passing them to the - # linker. It appears as though 1/2 is a usable value. - lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 2` - fi - ;; - esac -]) -if test -n $lt_cv_sys_max_cmd_len ; then - AC_MSG_RESULT($lt_cv_sys_max_cmd_len) -else - AC_MSG_RESULT(none) -fi -max_cmd_len=$lt_cv_sys_max_cmd_len -_LT_DECL([], [max_cmd_len], [0], - [What is the maximum length of a command?]) -])# LT_CMD_MAX_LEN - -# Old name: -AU_ALIAS([AC_LIBTOOL_SYS_MAX_CMD_LEN], [LT_CMD_MAX_LEN]) -dnl aclocal-1.4 backwards compatibility: -dnl AC_DEFUN([AC_LIBTOOL_SYS_MAX_CMD_LEN], []) - - -# _LT_HEADER_DLFCN -# ---------------- -m4_defun([_LT_HEADER_DLFCN], -[AC_CHECK_HEADERS([dlfcn.h], [], [], [AC_INCLUDES_DEFAULT])dnl -])# _LT_HEADER_DLFCN - - -# _LT_TRY_DLOPEN_SELF (ACTION-IF-TRUE, ACTION-IF-TRUE-W-USCORE, -# ACTION-IF-FALSE, ACTION-IF-CROSS-COMPILING) -# ---------------------------------------------------------------- -m4_defun([_LT_TRY_DLOPEN_SELF], -[m4_require([_LT_HEADER_DLFCN])dnl -if test "$cross_compiling" = yes; then : - [$4] -else - lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 - lt_status=$lt_dlunknown - cat > conftest.$ac_ext <<_LT_EOF -[#line $LINENO "configure" -#include "confdefs.h" - -#if HAVE_DLFCN_H -#include -#endif - -#include - -#ifdef RTLD_GLOBAL -# define LT_DLGLOBAL RTLD_GLOBAL -#else -# ifdef DL_GLOBAL -# define LT_DLGLOBAL DL_GLOBAL -# else -# define LT_DLGLOBAL 0 -# endif -#endif - -/* We may have to define LT_DLLAZY_OR_NOW in the command line if we - find out it does not work in some platform. */ -#ifndef LT_DLLAZY_OR_NOW -# ifdef RTLD_LAZY -# define LT_DLLAZY_OR_NOW RTLD_LAZY -# else -# ifdef DL_LAZY -# define LT_DLLAZY_OR_NOW DL_LAZY -# else -# ifdef RTLD_NOW -# define LT_DLLAZY_OR_NOW RTLD_NOW -# else -# ifdef DL_NOW -# define LT_DLLAZY_OR_NOW DL_NOW -# else -# define LT_DLLAZY_OR_NOW 0 -# endif -# endif -# endif -# endif -#endif - -/* When -fvisbility=hidden is used, assume the code has been annotated - correspondingly for the symbols needed. */ -#if defined(__GNUC__) && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3)) -int fnord () __attribute__((visibility("default"))); -#endif - -int fnord () { return 42; } -int main () -{ - void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); - int status = $lt_dlunknown; - - if (self) - { - if (dlsym (self,"fnord")) status = $lt_dlno_uscore; - else - { - if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; - else puts (dlerror ()); - } - /* dlclose (self); */ - } - else - puts (dlerror ()); - - return status; -}] -_LT_EOF - if AC_TRY_EVAL(ac_link) && test -s conftest${ac_exeext} 2>/dev/null; then - (./conftest; exit; ) >&AS_MESSAGE_LOG_FD 2>/dev/null - lt_status=$? - case x$lt_status in - x$lt_dlno_uscore) $1 ;; - x$lt_dlneed_uscore) $2 ;; - x$lt_dlunknown|x*) $3 ;; - esac - else : - # compilation failed - $3 - fi -fi -rm -fr conftest* -])# _LT_TRY_DLOPEN_SELF - - -# LT_SYS_DLOPEN_SELF -# ------------------ -AC_DEFUN([LT_SYS_DLOPEN_SELF], -[m4_require([_LT_HEADER_DLFCN])dnl -if test "x$enable_dlopen" != xyes; then - enable_dlopen=unknown - enable_dlopen_self=unknown - enable_dlopen_self_static=unknown -else - lt_cv_dlopen=no - lt_cv_dlopen_libs= - - case $host_os in - beos*) - lt_cv_dlopen="load_add_on" - lt_cv_dlopen_libs= - lt_cv_dlopen_self=yes - ;; - - mingw* | pw32* | cegcc*) - lt_cv_dlopen="LoadLibrary" - lt_cv_dlopen_libs= - ;; - - cygwin*) - lt_cv_dlopen="dlopen" - lt_cv_dlopen_libs= - ;; - - darwin*) - # if libdl is installed we need to link against it - AC_CHECK_LIB([dl], [dlopen], - [lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl"],[ - lt_cv_dlopen="dyld" - lt_cv_dlopen_libs= - lt_cv_dlopen_self=yes - ]) - ;; - - *) - AC_CHECK_FUNC([shl_load], - [lt_cv_dlopen="shl_load"], - [AC_CHECK_LIB([dld], [shl_load], - [lt_cv_dlopen="shl_load" lt_cv_dlopen_libs="-ldld"], - [AC_CHECK_FUNC([dlopen], - [lt_cv_dlopen="dlopen"], - [AC_CHECK_LIB([dl], [dlopen], - [lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl"], - [AC_CHECK_LIB([svld], [dlopen], - [lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-lsvld"], - [AC_CHECK_LIB([dld], [dld_link], - [lt_cv_dlopen="dld_link" lt_cv_dlopen_libs="-ldld"]) - ]) - ]) - ]) - ]) - ]) - ;; - esac - - if test "x$lt_cv_dlopen" != xno; then - enable_dlopen=yes - else - enable_dlopen=no - fi - - case $lt_cv_dlopen in - dlopen) - save_CPPFLAGS="$CPPFLAGS" - test "x$ac_cv_header_dlfcn_h" = xyes && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H" - - save_LDFLAGS="$LDFLAGS" - wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\" - - save_LIBS="$LIBS" - LIBS="$lt_cv_dlopen_libs $LIBS" - - AC_CACHE_CHECK([whether a program can dlopen itself], - lt_cv_dlopen_self, [dnl - _LT_TRY_DLOPEN_SELF( - lt_cv_dlopen_self=yes, lt_cv_dlopen_self=yes, - lt_cv_dlopen_self=no, lt_cv_dlopen_self=cross) - ]) - - if test "x$lt_cv_dlopen_self" = xyes; then - wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $lt_prog_compiler_static\" - AC_CACHE_CHECK([whether a statically linked program can dlopen itself], - lt_cv_dlopen_self_static, [dnl - _LT_TRY_DLOPEN_SELF( - lt_cv_dlopen_self_static=yes, lt_cv_dlopen_self_static=yes, - lt_cv_dlopen_self_static=no, lt_cv_dlopen_self_static=cross) - ]) - fi - - CPPFLAGS="$save_CPPFLAGS" - LDFLAGS="$save_LDFLAGS" - LIBS="$save_LIBS" - ;; - esac - - case $lt_cv_dlopen_self in - yes|no) enable_dlopen_self=$lt_cv_dlopen_self ;; - *) enable_dlopen_self=unknown ;; - esac - - case $lt_cv_dlopen_self_static in - yes|no) enable_dlopen_self_static=$lt_cv_dlopen_self_static ;; - *) enable_dlopen_self_static=unknown ;; - esac -fi -_LT_DECL([dlopen_support], [enable_dlopen], [0], - [Whether dlopen is supported]) -_LT_DECL([dlopen_self], [enable_dlopen_self], [0], - [Whether dlopen of programs is supported]) -_LT_DECL([dlopen_self_static], [enable_dlopen_self_static], [0], - [Whether dlopen of statically linked programs is supported]) -])# LT_SYS_DLOPEN_SELF - -# Old name: -AU_ALIAS([AC_LIBTOOL_DLOPEN_SELF], [LT_SYS_DLOPEN_SELF]) -dnl aclocal-1.4 backwards compatibility: -dnl AC_DEFUN([AC_LIBTOOL_DLOPEN_SELF], []) - - -# _LT_COMPILER_C_O([TAGNAME]) -# --------------------------- -# Check to see if options -c and -o are simultaneously supported by compiler. -# This macro does not hard code the compiler like AC_PROG_CC_C_O. -m4_defun([_LT_COMPILER_C_O], -[m4_require([_LT_DECL_SED])dnl -m4_require([_LT_FILEUTILS_DEFAULTS])dnl -m4_require([_LT_TAG_COMPILER])dnl -AC_CACHE_CHECK([if $compiler supports -c -o file.$ac_objext], - [_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)], - [_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)=no - $RM -r conftest 2>/dev/null - mkdir conftest - cd conftest - mkdir out - echo "$lt_simple_compile_test_code" > conftest.$ac_ext - - lt_compiler_flag="-o out/conftest2.$ac_objext" - # Insert the option either (1) after the last *FLAGS variable, or - # (2) before a word containing "conftest.", or (3) at the end. - # Note that $ac_compile itself does not contain backslashes and begins - # with a dollar sign (not a hyphen), so the echo should work correctly. - lt_compile=`echo "$ac_compile" | $SED \ - -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ - -e 's: [[^ ]]*conftest\.: $lt_compiler_flag&:; t' \ - -e 's:$: $lt_compiler_flag:'` - (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&AS_MESSAGE_LOG_FD) - (eval "$lt_compile" 2>out/conftest.err) - ac_status=$? - cat out/conftest.err >&AS_MESSAGE_LOG_FD - echo "$as_me:$LINENO: \$? = $ac_status" >&AS_MESSAGE_LOG_FD - if (exit $ac_status) && test -s out/conftest2.$ac_objext - then - # The compiler can only warn and ignore the option if not recognized - # So say no if there are warnings - $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp - $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 - if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then - _LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)=yes - fi - fi - chmod u+w . 2>&AS_MESSAGE_LOG_FD - $RM conftest* - # SGI C++ compiler will create directory out/ii_files/ for - # template instantiation - test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files - $RM out/* && rmdir out - cd .. - $RM -r conftest - $RM conftest* -]) -_LT_TAGDECL([compiler_c_o], [lt_cv_prog_compiler_c_o], [1], - [Does compiler simultaneously support -c and -o options?]) -])# _LT_COMPILER_C_O - - -# _LT_COMPILER_FILE_LOCKS([TAGNAME]) -# ---------------------------------- -# Check to see if we can do hard links to lock some files if needed -m4_defun([_LT_COMPILER_FILE_LOCKS], -[m4_require([_LT_ENABLE_LOCK])dnl -m4_require([_LT_FILEUTILS_DEFAULTS])dnl -_LT_COMPILER_C_O([$1]) - -hard_links="nottested" -if test "$_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)" = no && test "$need_locks" != no; then - # do not overwrite the value of need_locks provided by the user - AC_MSG_CHECKING([if we can lock with hard links]) - hard_links=yes - $RM conftest* - ln conftest.a conftest.b 2>/dev/null && hard_links=no - touch conftest.a - ln conftest.a conftest.b 2>&5 || hard_links=no - ln conftest.a conftest.b 2>/dev/null && hard_links=no - AC_MSG_RESULT([$hard_links]) - if test "$hard_links" = no; then - AC_MSG_WARN([`$CC' does not support `-c -o', so `make -j' may be unsafe]) - need_locks=warn - fi -else - need_locks=no -fi -_LT_DECL([], [need_locks], [1], [Must we lock files when doing compilation?]) -])# _LT_COMPILER_FILE_LOCKS - - -# _LT_CHECK_OBJDIR -# ---------------- -m4_defun([_LT_CHECK_OBJDIR], -[AC_CACHE_CHECK([for objdir], [lt_cv_objdir], -[rm -f .libs 2>/dev/null -mkdir .libs 2>/dev/null -if test -d .libs; then - lt_cv_objdir=.libs -else - # MS-DOS does not allow filenames that begin with a dot. - lt_cv_objdir=_libs -fi -rmdir .libs 2>/dev/null]) -objdir=$lt_cv_objdir -_LT_DECL([], [objdir], [0], - [The name of the directory that contains temporary libtool files])dnl -m4_pattern_allow([LT_OBJDIR])dnl -AC_DEFINE_UNQUOTED(LT_OBJDIR, "$lt_cv_objdir/", - [Define to the sub-directory in which libtool stores uninstalled libraries.]) -])# _LT_CHECK_OBJDIR - - -# _LT_LINKER_HARDCODE_LIBPATH([TAGNAME]) -# -------------------------------------- -# Check hardcoding attributes. -m4_defun([_LT_LINKER_HARDCODE_LIBPATH], -[AC_MSG_CHECKING([how to hardcode library paths into programs]) -_LT_TAGVAR(hardcode_action, $1)= -if test -n "$_LT_TAGVAR(hardcode_libdir_flag_spec, $1)" || - test -n "$_LT_TAGVAR(runpath_var, $1)" || - test "X$_LT_TAGVAR(hardcode_automatic, $1)" = "Xyes" ; then - - # We can hardcode non-existent directories. - if test "$_LT_TAGVAR(hardcode_direct, $1)" != no && - # If the only mechanism to avoid hardcoding is shlibpath_var, we - # have to relink, otherwise we might link with an installed library - # when we should be linking with a yet-to-be-installed one - ## test "$_LT_TAGVAR(hardcode_shlibpath_var, $1)" != no && - test "$_LT_TAGVAR(hardcode_minus_L, $1)" != no; then - # Linking always hardcodes the temporary library directory. - _LT_TAGVAR(hardcode_action, $1)=relink - else - # We can link without hardcoding, and we can hardcode nonexisting dirs. - _LT_TAGVAR(hardcode_action, $1)=immediate - fi -else - # We cannot hardcode anything, or else we can only hardcode existing - # directories. - _LT_TAGVAR(hardcode_action, $1)=unsupported -fi -AC_MSG_RESULT([$_LT_TAGVAR(hardcode_action, $1)]) - -if test "$_LT_TAGVAR(hardcode_action, $1)" = relink || - test "$_LT_TAGVAR(inherit_rpath, $1)" = yes; then - # Fast installation is not supported - enable_fast_install=no -elif test "$shlibpath_overrides_runpath" = yes || - test "$enable_shared" = no; then - # Fast installation is not necessary - enable_fast_install=needless -fi -_LT_TAGDECL([], [hardcode_action], [0], - [How to hardcode a shared library path into an executable]) -])# _LT_LINKER_HARDCODE_LIBPATH - - -# _LT_CMD_STRIPLIB -# ---------------- -m4_defun([_LT_CMD_STRIPLIB], -[m4_require([_LT_DECL_EGREP]) -striplib= -old_striplib= -AC_MSG_CHECKING([whether stripping libraries is possible]) -if test -n "$STRIP" && $STRIP -V 2>&1 | $GREP "GNU strip" >/dev/null; then - test -z "$old_striplib" && old_striplib="$STRIP --strip-debug" - test -z "$striplib" && striplib="$STRIP --strip-unneeded" - AC_MSG_RESULT([yes]) -else -# FIXME - insert some real tests, host_os isn't really good enough - case $host_os in - darwin*) - if test -n "$STRIP" ; then - striplib="$STRIP -x" - old_striplib="$STRIP -S" - AC_MSG_RESULT([yes]) - else - AC_MSG_RESULT([no]) - fi - ;; - *) - AC_MSG_RESULT([no]) - ;; - esac -fi -_LT_DECL([], [old_striplib], [1], [Commands to strip libraries]) -_LT_DECL([], [striplib], [1]) -])# _LT_CMD_STRIPLIB - - -# _LT_SYS_DYNAMIC_LINKER([TAG]) -# ----------------------------- -# PORTME Fill in your ld.so characteristics -m4_defun([_LT_SYS_DYNAMIC_LINKER], -[AC_REQUIRE([AC_CANONICAL_HOST])dnl -m4_require([_LT_DECL_EGREP])dnl -m4_require([_LT_FILEUTILS_DEFAULTS])dnl -m4_require([_LT_DECL_OBJDUMP])dnl -m4_require([_LT_DECL_SED])dnl -m4_require([_LT_CHECK_SHELL_FEATURES])dnl -AC_MSG_CHECKING([dynamic linker characteristics]) -m4_if([$1], - [], [ -if test "$GCC" = yes; then - case $host_os in - darwin*) lt_awk_arg="/^libraries:/,/LR/" ;; - *) lt_awk_arg="/^libraries:/" ;; - esac - case $host_os in - mingw* | cegcc*) lt_sed_strip_eq="s,=\([[A-Za-z]]:\),\1,g" ;; - *) lt_sed_strip_eq="s,=/,/,g" ;; - esac - lt_search_path_spec=`$CC -print-search-dirs | awk $lt_awk_arg | $SED -e "s/^libraries://" -e $lt_sed_strip_eq` - case $lt_search_path_spec in - *\;*) - # if the path contains ";" then we assume it to be the separator - # otherwise default to the standard path separator (i.e. ":") - it is - # assumed that no part of a normal pathname contains ";" but that should - # okay in the real world where ";" in dirpaths is itself problematic. - lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED 's/;/ /g'` - ;; - *) - lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED "s/$PATH_SEPARATOR/ /g"` - ;; - esac - # Ok, now we have the path, separated by spaces, we can step through it - # and add multilib dir if necessary. - lt_tmp_lt_search_path_spec= - lt_multi_os_dir=`$CC $CPPFLAGS $CFLAGS $LDFLAGS -print-multi-os-directory 2>/dev/null` - for lt_sys_path in $lt_search_path_spec; do - if test -d "$lt_sys_path/$lt_multi_os_dir"; then - lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path/$lt_multi_os_dir" - else - test -d "$lt_sys_path" && \ - lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path" - fi - done - lt_search_path_spec=`$ECHO "$lt_tmp_lt_search_path_spec" | awk ' -BEGIN {RS=" "; FS="/|\n";} { - lt_foo=""; - lt_count=0; - for (lt_i = NF; lt_i > 0; lt_i--) { - if ($lt_i != "" && $lt_i != ".") { - if ($lt_i == "..") { - lt_count++; - } else { - if (lt_count == 0) { - lt_foo="/" $lt_i lt_foo; - } else { - lt_count--; - } - } - } - } - if (lt_foo != "") { lt_freq[[lt_foo]]++; } - if (lt_freq[[lt_foo]] == 1) { print lt_foo; } -}'` - # AWK program above erroneously prepends '/' to C:/dos/paths - # for these hosts. - case $host_os in - mingw* | cegcc*) lt_search_path_spec=`$ECHO "$lt_search_path_spec" |\ - $SED 's,/\([[A-Za-z]]:\),\1,g'` ;; - esac - sys_lib_search_path_spec=`$ECHO "$lt_search_path_spec" | $lt_NL2SP` -else - sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" -fi]) -library_names_spec= -libname_spec='lib$name' -soname_spec= -shrext_cmds=".so" -postinstall_cmds= -postuninstall_cmds= -finish_cmds= -finish_eval= -shlibpath_var= -shlibpath_overrides_runpath=unknown -version_type=none -dynamic_linker="$host_os ld.so" -sys_lib_dlsearch_path_spec="/lib /usr/lib" -need_lib_prefix=unknown -hardcode_into_libs=no - -# when you set need_version to no, make sure it does not cause -set_version -# flags to be left without arguments -need_version=unknown - -case $host_os in -aix3*) - version_type=linux # correct to gnu/linux during the next big refactor - library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a' - shlibpath_var=LIBPATH - - # AIX 3 has no versioning support, so we append a major version to the name. - soname_spec='${libname}${release}${shared_ext}$major' - ;; - -aix[[4-9]]*) - version_type=linux # correct to gnu/linux during the next big refactor - need_lib_prefix=no - need_version=no - hardcode_into_libs=yes - if test "$host_cpu" = ia64; then - # AIX 5 supports IA64 - library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}' - shlibpath_var=LD_LIBRARY_PATH - else - # With GCC up to 2.95.x, collect2 would create an import file - # for dependence libraries. The import file would start with - # the line `#! .'. This would cause the generated library to - # depend on `.', always an invalid library. This was fixed in - # development snapshots of GCC prior to 3.0. - case $host_os in - aix4 | aix4.[[01]] | aix4.[[01]].*) - if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)' - echo ' yes ' - echo '#endif'; } | ${CC} -E - | $GREP yes > /dev/null; then - : - else - can_build_shared=no - fi - ;; - esac - # AIX (on Power*) has no versioning support, so currently we can not hardcode correct - # soname into executable. Probably we can add versioning support to - # collect2, so additional links can be useful in future. - if test "$aix_use_runtimelinking" = yes; then - # If using run time linking (on AIX 4.2 or later) use lib.so - # instead of lib.a to let people know that these are not - # typical AIX shared libraries. - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - else - # We preserve .a as extension for shared libraries through AIX4.2 - # and later when we are not doing run time linking. - library_names_spec='${libname}${release}.a $libname.a' - soname_spec='${libname}${release}${shared_ext}$major' - fi - shlibpath_var=LIBPATH - fi - ;; - -amigaos*) - case $host_cpu in - powerpc) - # Since July 2007 AmigaOS4 officially supports .so libraries. - # When compiling the executable, add -use-dynld -Lsobjs: to the compileline. - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - ;; - m68k) - library_names_spec='$libname.ixlibrary $libname.a' - # Create ${libname}_ixlibrary.a entries in /sys/libs. - finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`func_echo_all "$lib" | $SED '\''s%^.*/\([[^/]]*\)\.ixlibrary$%\1%'\''`; test $RM /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done' - ;; - esac - ;; - -beos*) - library_names_spec='${libname}${shared_ext}' - dynamic_linker="$host_os ld.so" - shlibpath_var=LIBRARY_PATH - ;; - -bsdi[[45]]*) - version_type=linux # correct to gnu/linux during the next big refactor - need_version=no - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir' - shlibpath_var=LD_LIBRARY_PATH - sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib" - sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib" - # the default ld.so.conf also contains /usr/contrib/lib and - # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow - # libtool to hard-code these into programs - ;; - -cygwin* | mingw* | pw32* | cegcc*) - version_type=windows - shrext_cmds=".dll" - need_version=no - need_lib_prefix=no - - case $GCC,$cc_basename in - yes,*) - # gcc - library_names_spec='$libname.dll.a' - # DLL is installed to $(libdir)/../bin by postinstall_cmds - postinstall_cmds='base_file=`basename \${file}`~ - dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~ - dldir=$destdir/`dirname \$dlpath`~ - test -d \$dldir || mkdir -p \$dldir~ - $install_prog $dir/$dlname \$dldir/$dlname~ - chmod a+x \$dldir/$dlname~ - if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then - eval '\''$striplib \$dldir/$dlname'\'' || exit \$?; - fi' - postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ - dlpath=$dir/\$dldll~ - $RM \$dlpath' - shlibpath_overrides_runpath=yes - - case $host_os in - cygwin*) - # Cygwin DLLs use 'cyg' prefix rather than 'lib' - soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}' -m4_if([$1], [],[ - sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/lib/w32api"]) - ;; - mingw* | cegcc*) - # MinGW DLLs use traditional 'lib' prefix - soname_spec='${libname}`echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}' - ;; - pw32*) - # pw32 DLLs use 'pw' prefix rather than 'lib' - library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}' - ;; - esac - dynamic_linker='Win32 ld.exe' - ;; - - *,cl*) - # Native MSVC - libname_spec='$name' - soname_spec='${libname}`echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}' - library_names_spec='${libname}.dll.lib' - - case $build_os in - mingw*) - sys_lib_search_path_spec= - lt_save_ifs=$IFS - IFS=';' - for lt_path in $LIB - do - IFS=$lt_save_ifs - # Let DOS variable expansion print the short 8.3 style file name. - lt_path=`cd "$lt_path" 2>/dev/null && cmd //C "for %i in (".") do @echo %~si"` - sys_lib_search_path_spec="$sys_lib_search_path_spec $lt_path" - done - IFS=$lt_save_ifs - # Convert to MSYS style. - sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | sed -e 's|\\\\|/|g' -e 's| \\([[a-zA-Z]]\\):| /\\1|g' -e 's|^ ||'` - ;; - cygwin*) - # Convert to unix form, then to dos form, then back to unix form - # but this time dos style (no spaces!) so that the unix form looks - # like /cygdrive/c/PROGRA~1:/cygdr... - sys_lib_search_path_spec=`cygpath --path --unix "$LIB"` - sys_lib_search_path_spec=`cygpath --path --dos "$sys_lib_search_path_spec" 2>/dev/null` - sys_lib_search_path_spec=`cygpath --path --unix "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` - ;; - *) - sys_lib_search_path_spec="$LIB" - if $ECHO "$sys_lib_search_path_spec" | [$GREP ';[c-zC-Z]:/' >/dev/null]; then - # It is most probably a Windows format PATH. - sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` - else - sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` - fi - # FIXME: find the short name or the path components, as spaces are - # common. (e.g. "Program Files" -> "PROGRA~1") - ;; - esac - - # DLL is installed to $(libdir)/../bin by postinstall_cmds - postinstall_cmds='base_file=`basename \${file}`~ - dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~ - dldir=$destdir/`dirname \$dlpath`~ - test -d \$dldir || mkdir -p \$dldir~ - $install_prog $dir/$dlname \$dldir/$dlname' - postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ - dlpath=$dir/\$dldll~ - $RM \$dlpath' - shlibpath_overrides_runpath=yes - dynamic_linker='Win32 link.exe' - ;; - - *) - # Assume MSVC wrapper - library_names_spec='${libname}`echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext} $libname.lib' - dynamic_linker='Win32 ld.exe' - ;; - esac - # FIXME: first we should search . and the directory the executable is in - shlibpath_var=PATH - ;; - -darwin* | rhapsody*) - dynamic_linker="$host_os dyld" - version_type=darwin - need_lib_prefix=no - need_version=no - library_names_spec='${libname}${release}${major}$shared_ext ${libname}$shared_ext' - soname_spec='${libname}${release}${major}$shared_ext' - shlibpath_overrides_runpath=yes - shlibpath_var=DYLD_LIBRARY_PATH - shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`' -m4_if([$1], [],[ - sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/local/lib"]) - sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib' - ;; - -dgux*) - version_type=linux # correct to gnu/linux during the next big refactor - need_lib_prefix=no - need_version=no - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext' - soname_spec='${libname}${release}${shared_ext}$major' - shlibpath_var=LD_LIBRARY_PATH - ;; - -freebsd* | dragonfly*) - # DragonFly does not have aout. When/if they implement a new - # versioning mechanism, adjust this. - if test -x /usr/bin/objformat; then - objformat=`/usr/bin/objformat` - else - case $host_os in - freebsd[[23]].*) objformat=aout ;; - *) objformat=elf ;; - esac - fi - version_type=freebsd-$objformat - case $version_type in - freebsd-elf*) - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' - need_version=no - need_lib_prefix=no - ;; - freebsd-*) - library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix' - need_version=yes - ;; - esac - shlibpath_var=LD_LIBRARY_PATH - case $host_os in - freebsd2.*) - shlibpath_overrides_runpath=yes - ;; - freebsd3.[[01]]* | freebsdelf3.[[01]]*) - shlibpath_overrides_runpath=yes - hardcode_into_libs=yes - ;; - freebsd3.[[2-9]]* | freebsdelf3.[[2-9]]* | \ - freebsd4.[[0-5]] | freebsdelf4.[[0-5]] | freebsd4.1.1 | freebsdelf4.1.1) - shlibpath_overrides_runpath=no - hardcode_into_libs=yes - ;; - *) # from 4.6 on, and DragonFly - shlibpath_overrides_runpath=yes - hardcode_into_libs=yes - ;; - esac - ;; - -gnu*) - version_type=linux # correct to gnu/linux during the next big refactor - need_lib_prefix=no - need_version=no - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=no - hardcode_into_libs=yes - ;; - -haiku*) - version_type=linux # correct to gnu/linux during the next big refactor - need_lib_prefix=no - need_version=no - dynamic_linker="$host_os runtime_loader" - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - shlibpath_var=LIBRARY_PATH - shlibpath_overrides_runpath=yes - sys_lib_dlsearch_path_spec='/boot/home/config/lib /boot/common/lib /boot/system/lib' - hardcode_into_libs=yes - ;; - -hpux9* | hpux10* | hpux11*) - # Give a soname corresponding to the major version so that dld.sl refuses to - # link against other versions. - version_type=sunos - need_lib_prefix=no - need_version=no - case $host_cpu in - ia64*) - shrext_cmds='.so' - hardcode_into_libs=yes - dynamic_linker="$host_os dld.so" - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - if test "X$HPUX_IA64_MODE" = X32; then - sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib" - else - sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64" - fi - sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec - ;; - hppa*64*) - shrext_cmds='.sl' - hardcode_into_libs=yes - dynamic_linker="$host_os dld.sl" - shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH - shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64" - sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec - ;; - *) - shrext_cmds='.sl' - dynamic_linker="$host_os dld.sl" - shlibpath_var=SHLIB_PATH - shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - ;; - esac - # HP-UX runs *really* slowly unless shared libraries are mode 555, ... - postinstall_cmds='chmod 555 $lib' - # or fails outright, so override atomically: - install_override_mode=555 - ;; - -interix[[3-9]]*) - version_type=linux # correct to gnu/linux during the next big refactor - need_lib_prefix=no - need_version=no - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)' - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=no - hardcode_into_libs=yes - ;; - -irix5* | irix6* | nonstopux*) - case $host_os in - nonstopux*) version_type=nonstopux ;; - *) - if test "$lt_cv_prog_gnu_ld" = yes; then - version_type=linux # correct to gnu/linux during the next big refactor - else - version_type=irix - fi ;; - esac - need_lib_prefix=no - need_version=no - soname_spec='${libname}${release}${shared_ext}$major' - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}' - case $host_os in - irix5* | nonstopux*) - libsuff= shlibsuff= - ;; - *) - case $LD in # libtool.m4 will add one of these switches to LD - *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") - libsuff= shlibsuff= libmagic=32-bit;; - *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") - libsuff=32 shlibsuff=N32 libmagic=N32;; - *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") - libsuff=64 shlibsuff=64 libmagic=64-bit;; - *) libsuff= shlibsuff= libmagic=never-match;; - esac - ;; - esac - shlibpath_var=LD_LIBRARY${shlibsuff}_PATH - shlibpath_overrides_runpath=no - sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}" - sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}" - hardcode_into_libs=yes - ;; - -# No shared lib support for Linux oldld, aout, or coff. -linux*oldld* | linux*aout* | linux*coff*) - dynamic_linker=no - ;; - -# This must be glibc/ELF. -linux* | k*bsd*-gnu | kopensolaris*-gnu) - version_type=linux # correct to gnu/linux during the next big refactor - need_lib_prefix=no - need_version=no - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=no - - # Some binutils ld are patched to set DT_RUNPATH - AC_CACHE_VAL([lt_cv_shlibpath_overrides_runpath], - [lt_cv_shlibpath_overrides_runpath=no - save_LDFLAGS=$LDFLAGS - save_libdir=$libdir - eval "libdir=/foo; wl=\"$_LT_TAGVAR(lt_prog_compiler_wl, $1)\"; \ - LDFLAGS=\"\$LDFLAGS $_LT_TAGVAR(hardcode_libdir_flag_spec, $1)\"" - AC_LINK_IFELSE([AC_LANG_PROGRAM([],[])], - [AS_IF([ ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir" >/dev/null], - [lt_cv_shlibpath_overrides_runpath=yes])]) - LDFLAGS=$save_LDFLAGS - libdir=$save_libdir - ]) - shlibpath_overrides_runpath=$lt_cv_shlibpath_overrides_runpath - - # This implies no fast_install, which is unacceptable. - # Some rework will be needed to allow for fast_install - # before this can be enabled. - hardcode_into_libs=yes - - # Append ld.so.conf contents to the search path - if test -f /etc/ld.so.conf; then - lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \[$]2)); skip = 1; } { if (!skip) print \[$]0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[ ]*hwcap[ ]/d;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;s/"//g;/^$/d' | tr '\n' ' '` - sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra" - fi - - # We used to test for /lib/ld.so.1 and disable shared libraries on - # powerpc, because MkLinux only supported shared libraries with the - # GNU dynamic linker. Since this was broken with cross compilers, - # most powerpc-linux boxes support dynamic linking these days and - # people can always --disable-shared, the test was removed, and we - # assume the GNU/Linux dynamic linker is in use. - dynamic_linker='GNU/Linux ld.so' - ;; - -netbsdelf*-gnu) - version_type=linux - need_lib_prefix=no - need_version=no - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=no - hardcode_into_libs=yes - dynamic_linker='NetBSD ld.elf_so' - ;; - -netbsd*) - version_type=sunos - need_lib_prefix=no - need_version=no - if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' - finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' - dynamic_linker='NetBSD (a.out) ld.so' - else - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - dynamic_linker='NetBSD ld.elf_so' - fi - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=yes - hardcode_into_libs=yes - ;; - -newsos6) - version_type=linux # correct to gnu/linux during the next big refactor - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=yes - ;; - -*nto* | *qnx*) - version_type=qnx - need_lib_prefix=no - need_version=no - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=no - hardcode_into_libs=yes - dynamic_linker='ldqnx.so' - ;; - -openbsd*) - version_type=sunos - sys_lib_dlsearch_path_spec="/usr/lib" - need_lib_prefix=no - # Some older versions of OpenBSD (3.3 at least) *do* need versioned libs. - case $host_os in - openbsd3.3 | openbsd3.3.*) need_version=yes ;; - *) need_version=no ;; - esac - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' - finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' - shlibpath_var=LD_LIBRARY_PATH - if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then - case $host_os in - openbsd2.[[89]] | openbsd2.[[89]].*) - shlibpath_overrides_runpath=no - ;; - *) - shlibpath_overrides_runpath=yes - ;; - esac - else - shlibpath_overrides_runpath=yes - fi - ;; - -os2*) - libname_spec='$name' - shrext_cmds=".dll" - need_lib_prefix=no - library_names_spec='$libname${shared_ext} $libname.a' - dynamic_linker='OS/2 ld.exe' - shlibpath_var=LIBPATH - ;; - -osf3* | osf4* | osf5*) - version_type=osf - need_lib_prefix=no - need_version=no - soname_spec='${libname}${release}${shared_ext}$major' - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - shlibpath_var=LD_LIBRARY_PATH - sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib" - sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec" - ;; - -rdos*) - dynamic_linker=no - ;; - -solaris*) - version_type=linux # correct to gnu/linux during the next big refactor - need_lib_prefix=no - need_version=no - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=yes - hardcode_into_libs=yes - # ldd complains unless libraries are executable - postinstall_cmds='chmod +x $lib' - ;; - -sunos4*) - version_type=sunos - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' - finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir' - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=yes - if test "$with_gnu_ld" = yes; then - need_lib_prefix=no - fi - need_version=yes - ;; - -sysv4 | sysv4.3*) - version_type=linux # correct to gnu/linux during the next big refactor - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - shlibpath_var=LD_LIBRARY_PATH - case $host_vendor in - sni) - shlibpath_overrides_runpath=no - need_lib_prefix=no - runpath_var=LD_RUN_PATH - ;; - siemens) - need_lib_prefix=no - ;; - motorola) - need_lib_prefix=no - need_version=no - shlibpath_overrides_runpath=no - sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib' - ;; - esac - ;; - -sysv4*MP*) - if test -d /usr/nec ;then - version_type=linux # correct to gnu/linux during the next big refactor - library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}' - soname_spec='$libname${shared_ext}.$major' - shlibpath_var=LD_LIBRARY_PATH - fi - ;; - -sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) - version_type=freebsd-elf - need_lib_prefix=no - need_version=no - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=yes - hardcode_into_libs=yes - if test "$with_gnu_ld" = yes; then - sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib' - else - sys_lib_search_path_spec='/usr/ccs/lib /usr/lib' - case $host_os in - sco3.2v5*) - sys_lib_search_path_spec="$sys_lib_search_path_spec /lib" - ;; - esac - fi - sys_lib_dlsearch_path_spec='/usr/lib' - ;; - -tpf*) - # TPF is a cross-target only. Preferred cross-host = GNU/Linux. - version_type=linux # correct to gnu/linux during the next big refactor - need_lib_prefix=no - need_version=no - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=no - hardcode_into_libs=yes - ;; - -uts4*) - version_type=linux # correct to gnu/linux during the next big refactor - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - shlibpath_var=LD_LIBRARY_PATH - ;; - -*) - dynamic_linker=no - ;; -esac -AC_MSG_RESULT([$dynamic_linker]) -test "$dynamic_linker" = no && can_build_shared=no - -variables_saved_for_relink="PATH $shlibpath_var $runpath_var" -if test "$GCC" = yes; then - variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" -fi - -if test "${lt_cv_sys_lib_search_path_spec+set}" = set; then - sys_lib_search_path_spec="$lt_cv_sys_lib_search_path_spec" -fi -if test "${lt_cv_sys_lib_dlsearch_path_spec+set}" = set; then - sys_lib_dlsearch_path_spec="$lt_cv_sys_lib_dlsearch_path_spec" -fi - -_LT_DECL([], [variables_saved_for_relink], [1], - [Variables whose values should be saved in libtool wrapper scripts and - restored at link time]) -_LT_DECL([], [need_lib_prefix], [0], - [Do we need the "lib" prefix for modules?]) -_LT_DECL([], [need_version], [0], [Do we need a version for libraries?]) -_LT_DECL([], [version_type], [0], [Library versioning type]) -_LT_DECL([], [runpath_var], [0], [Shared library runtime path variable]) -_LT_DECL([], [shlibpath_var], [0],[Shared library path variable]) -_LT_DECL([], [shlibpath_overrides_runpath], [0], - [Is shlibpath searched before the hard-coded library search path?]) -_LT_DECL([], [libname_spec], [1], [Format of library name prefix]) -_LT_DECL([], [library_names_spec], [1], - [[List of archive names. First name is the real one, the rest are links. - The last name is the one that the linker finds with -lNAME]]) -_LT_DECL([], [soname_spec], [1], - [[The coded name of the library, if different from the real name]]) -_LT_DECL([], [install_override_mode], [1], - [Permission mode override for installation of shared libraries]) -_LT_DECL([], [postinstall_cmds], [2], - [Command to use after installation of a shared archive]) -_LT_DECL([], [postuninstall_cmds], [2], - [Command to use after uninstallation of a shared archive]) -_LT_DECL([], [finish_cmds], [2], - [Commands used to finish a libtool library installation in a directory]) -_LT_DECL([], [finish_eval], [1], - [[As "finish_cmds", except a single script fragment to be evaled but - not shown]]) -_LT_DECL([], [hardcode_into_libs], [0], - [Whether we should hardcode library paths into libraries]) -_LT_DECL([], [sys_lib_search_path_spec], [2], - [Compile-time system search path for libraries]) -_LT_DECL([], [sys_lib_dlsearch_path_spec], [2], - [Run-time system search path for libraries]) -])# _LT_SYS_DYNAMIC_LINKER - - -# _LT_PATH_TOOL_PREFIX(TOOL) -# -------------------------- -# find a file program which can recognize shared library -AC_DEFUN([_LT_PATH_TOOL_PREFIX], -[m4_require([_LT_DECL_EGREP])dnl -AC_MSG_CHECKING([for $1]) -AC_CACHE_VAL(lt_cv_path_MAGIC_CMD, -[case $MAGIC_CMD in -[[\\/*] | ?:[\\/]*]) - lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path. - ;; -*) - lt_save_MAGIC_CMD="$MAGIC_CMD" - lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR -dnl $ac_dummy forces splitting on constant user-supplied paths. -dnl POSIX.2 word splitting is done only on the output of word expansions, -dnl not every word. This closes a longstanding sh security hole. - ac_dummy="m4_if([$2], , $PATH, [$2])" - for ac_dir in $ac_dummy; do - IFS="$lt_save_ifs" - test -z "$ac_dir" && ac_dir=. - if test -f $ac_dir/$1; then - lt_cv_path_MAGIC_CMD="$ac_dir/$1" - if test -n "$file_magic_test_file"; then - case $deplibs_check_method in - "file_magic "*) - file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"` - MAGIC_CMD="$lt_cv_path_MAGIC_CMD" - if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null | - $EGREP "$file_magic_regex" > /dev/null; then - : - else - cat <<_LT_EOF 1>&2 - -*** Warning: the command libtool uses to detect shared libraries, -*** $file_magic_cmd, produces output that libtool cannot recognize. -*** The result is that libtool may fail to recognize shared libraries -*** as such. This will affect the creation of libtool libraries that -*** depend on shared libraries, but programs linked with such libtool -*** libraries will work regardless of this problem. Nevertheless, you -*** may want to report the problem to your system manager and/or to -*** bug-libtool@gnu.org - -_LT_EOF - fi ;; - esac - fi - break - fi - done - IFS="$lt_save_ifs" - MAGIC_CMD="$lt_save_MAGIC_CMD" - ;; -esac]) -MAGIC_CMD="$lt_cv_path_MAGIC_CMD" -if test -n "$MAGIC_CMD"; then - AC_MSG_RESULT($MAGIC_CMD) -else - AC_MSG_RESULT(no) -fi -_LT_DECL([], [MAGIC_CMD], [0], - [Used to examine libraries when file_magic_cmd begins with "file"])dnl -])# _LT_PATH_TOOL_PREFIX - -# Old name: -AU_ALIAS([AC_PATH_TOOL_PREFIX], [_LT_PATH_TOOL_PREFIX]) -dnl aclocal-1.4 backwards compatibility: -dnl AC_DEFUN([AC_PATH_TOOL_PREFIX], []) - - -# _LT_PATH_MAGIC -# -------------- -# find a file program which can recognize a shared library -m4_defun([_LT_PATH_MAGIC], -[_LT_PATH_TOOL_PREFIX(${ac_tool_prefix}file, /usr/bin$PATH_SEPARATOR$PATH) -if test -z "$lt_cv_path_MAGIC_CMD"; then - if test -n "$ac_tool_prefix"; then - _LT_PATH_TOOL_PREFIX(file, /usr/bin$PATH_SEPARATOR$PATH) - else - MAGIC_CMD=: - fi -fi -])# _LT_PATH_MAGIC - - -# LT_PATH_LD -# ---------- -# find the pathname to the GNU or non-GNU linker -AC_DEFUN([LT_PATH_LD], -[AC_REQUIRE([AC_PROG_CC])dnl -AC_REQUIRE([AC_CANONICAL_HOST])dnl -AC_REQUIRE([AC_CANONICAL_BUILD])dnl -m4_require([_LT_DECL_SED])dnl -m4_require([_LT_DECL_EGREP])dnl -m4_require([_LT_PROG_ECHO_BACKSLASH])dnl - -AC_ARG_WITH([gnu-ld], - [AS_HELP_STRING([--with-gnu-ld], - [assume the C compiler uses GNU ld @<:@default=no@:>@])], - [test "$withval" = no || with_gnu_ld=yes], - [with_gnu_ld=no])dnl - -ac_prog=ld -if test "$GCC" = yes; then - # Check if gcc -print-prog-name=ld gives a path. - AC_MSG_CHECKING([for ld used by $CC]) - case $host in - *-*-mingw*) - # gcc leaves a trailing carriage return which upsets mingw - ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;; - *) - ac_prog=`($CC -print-prog-name=ld) 2>&5` ;; - esac - case $ac_prog in - # Accept absolute paths. - [[\\/]]* | ?:[[\\/]]*) - re_direlt='/[[^/]][[^/]]*/\.\./' - # Canonicalize the pathname of ld - ac_prog=`$ECHO "$ac_prog"| $SED 's%\\\\%/%g'` - while $ECHO "$ac_prog" | $GREP "$re_direlt" > /dev/null 2>&1; do - ac_prog=`$ECHO $ac_prog| $SED "s%$re_direlt%/%"` - done - test -z "$LD" && LD="$ac_prog" - ;; - "") - # If it fails, then pretend we aren't using GCC. - ac_prog=ld - ;; - *) - # If it is relative, then search for the first ld in PATH. - with_gnu_ld=unknown - ;; - esac -elif test "$with_gnu_ld" = yes; then - AC_MSG_CHECKING([for GNU ld]) -else - AC_MSG_CHECKING([for non-GNU ld]) -fi -AC_CACHE_VAL(lt_cv_path_LD, -[if test -z "$LD"; then - lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR - for ac_dir in $PATH; do - IFS="$lt_save_ifs" - test -z "$ac_dir" && ac_dir=. - if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then - lt_cv_path_LD="$ac_dir/$ac_prog" - # Check to see if the program is GNU ld. I'd rather use --version, - # but apparently some variants of GNU ld only accept -v. - # Break only if it was the GNU/non-GNU ld that we prefer. - case `"$lt_cv_path_LD" -v 2>&1 &1 /dev/null 2>&1; then - lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL' - lt_cv_file_magic_cmd='func_win32_libid' - else - # Keep this pattern in sync with the one in func_win32_libid. - lt_cv_deplibs_check_method='file_magic file format (pei*-i386(.*architecture: i386)?|pe-arm-wince|pe-x86-64)' - lt_cv_file_magic_cmd='$OBJDUMP -f' - fi - ;; - -cegcc*) - # use the weaker test based on 'objdump'. See mingw*. - lt_cv_deplibs_check_method='file_magic file format pe-arm-.*little(.*architecture: arm)?' - lt_cv_file_magic_cmd='$OBJDUMP -f' - ;; - -darwin* | rhapsody*) - lt_cv_deplibs_check_method=pass_all - ;; - -freebsd* | dragonfly*) - if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then - case $host_cpu in - i*86 ) - # Not sure whether the presence of OpenBSD here was a mistake. - # Let's accept both of them until this is cleared up. - lt_cv_deplibs_check_method='file_magic (FreeBSD|OpenBSD|DragonFly)/i[[3-9]]86 (compact )?demand paged shared library' - lt_cv_file_magic_cmd=/usr/bin/file - lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*` - ;; - esac - else - lt_cv_deplibs_check_method=pass_all - fi - ;; - -gnu*) - lt_cv_deplibs_check_method=pass_all - ;; - -haiku*) - lt_cv_deplibs_check_method=pass_all - ;; - -hpux10.20* | hpux11*) - lt_cv_file_magic_cmd=/usr/bin/file - case $host_cpu in - ia64*) - lt_cv_deplibs_check_method='file_magic (s[[0-9]][[0-9]][[0-9]]|ELF-[[0-9]][[0-9]]) shared object file - IA64' - lt_cv_file_magic_test_file=/usr/lib/hpux32/libc.so - ;; - hppa*64*) - [lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF[ -][0-9][0-9])(-bit)?( [LM]SB)? shared object( file)?[, -]* PA-RISC [0-9]\.[0-9]'] - lt_cv_file_magic_test_file=/usr/lib/pa20_64/libc.sl - ;; - *) - lt_cv_deplibs_check_method='file_magic (s[[0-9]][[0-9]][[0-9]]|PA-RISC[[0-9]]\.[[0-9]]) shared library' - lt_cv_file_magic_test_file=/usr/lib/libc.sl - ;; - esac - ;; - -interix[[3-9]]*) - # PIC code is broken on Interix 3.x, that's why |\.a not |_pic\.a here - lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so|\.a)$' - ;; - -irix5* | irix6* | nonstopux*) - case $LD in - *-32|*"-32 ") libmagic=32-bit;; - *-n32|*"-n32 ") libmagic=N32;; - *-64|*"-64 ") libmagic=64-bit;; - *) libmagic=never-match;; - esac - lt_cv_deplibs_check_method=pass_all - ;; - -# This must be glibc/ELF. -linux* | k*bsd*-gnu | kopensolaris*-gnu) - lt_cv_deplibs_check_method=pass_all - ;; - -netbsd* | netbsdelf*-gnu) - if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then - lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|_pic\.a)$' - else - lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so|_pic\.a)$' - fi - ;; - -newos6*) - lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (executable|dynamic lib)' - lt_cv_file_magic_cmd=/usr/bin/file - lt_cv_file_magic_test_file=/usr/lib/libnls.so - ;; - -*nto* | *qnx*) - lt_cv_deplibs_check_method=pass_all - ;; - -openbsd*) - if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then - lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|\.so|_pic\.a)$' - else - lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|_pic\.a)$' - fi - ;; - -osf3* | osf4* | osf5*) - lt_cv_deplibs_check_method=pass_all - ;; - -rdos*) - lt_cv_deplibs_check_method=pass_all - ;; - -solaris*) - lt_cv_deplibs_check_method=pass_all - ;; - -sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) - lt_cv_deplibs_check_method=pass_all - ;; - -sysv4 | sysv4.3*) - case $host_vendor in - motorola) - lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (shared object|dynamic lib) M[[0-9]][[0-9]]* Version [[0-9]]' - lt_cv_file_magic_test_file=`echo /usr/lib/libc.so*` - ;; - ncr) - lt_cv_deplibs_check_method=pass_all - ;; - sequent) - lt_cv_file_magic_cmd='/bin/file' - lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[LM]]SB (shared object|dynamic lib )' - ;; - sni) - lt_cv_file_magic_cmd='/bin/file' - lt_cv_deplibs_check_method="file_magic ELF [[0-9]][[0-9]]*-bit [[LM]]SB dynamic lib" - lt_cv_file_magic_test_file=/lib/libc.so - ;; - siemens) - lt_cv_deplibs_check_method=pass_all - ;; - pc) - lt_cv_deplibs_check_method=pass_all - ;; - esac - ;; - -tpf*) - lt_cv_deplibs_check_method=pass_all - ;; -esac -]) - -file_magic_glob= -want_nocaseglob=no -if test "$build" = "$host"; then - case $host_os in - mingw* | pw32*) - if ( shopt | grep nocaseglob ) >/dev/null 2>&1; then - want_nocaseglob=yes - else - file_magic_glob=`echo aAbBcCdDeEfFgGhHiIjJkKlLmMnNoOpPqQrRsStTuUvVwWxXyYzZ | $SED -e "s/\(..\)/s\/[[\1]]\/[[\1]]\/g;/g"` - fi - ;; - esac -fi - -file_magic_cmd=$lt_cv_file_magic_cmd -deplibs_check_method=$lt_cv_deplibs_check_method -test -z "$deplibs_check_method" && deplibs_check_method=unknown - -_LT_DECL([], [deplibs_check_method], [1], - [Method to check whether dependent libraries are shared objects]) -_LT_DECL([], [file_magic_cmd], [1], - [Command to use when deplibs_check_method = "file_magic"]) -_LT_DECL([], [file_magic_glob], [1], - [How to find potential files when deplibs_check_method = "file_magic"]) -_LT_DECL([], [want_nocaseglob], [1], - [Find potential files using nocaseglob when deplibs_check_method = "file_magic"]) -])# _LT_CHECK_MAGIC_METHOD - - -# LT_PATH_NM -# ---------- -# find the pathname to a BSD- or MS-compatible name lister -AC_DEFUN([LT_PATH_NM], -[AC_REQUIRE([AC_PROG_CC])dnl -AC_CACHE_CHECK([for BSD- or MS-compatible name lister (nm)], lt_cv_path_NM, -[if test -n "$NM"; then - # Let the user override the test. - lt_cv_path_NM="$NM" -else - lt_nm_to_check="${ac_tool_prefix}nm" - if test -n "$ac_tool_prefix" && test "$build" = "$host"; then - lt_nm_to_check="$lt_nm_to_check nm" - fi - for lt_tmp_nm in $lt_nm_to_check; do - lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR - for ac_dir in $PATH /usr/ccs/bin/elf /usr/ccs/bin /usr/ucb /bin; do - IFS="$lt_save_ifs" - test -z "$ac_dir" && ac_dir=. - tmp_nm="$ac_dir/$lt_tmp_nm" - if test -f "$tmp_nm" || test -f "$tmp_nm$ac_exeext" ; then - # Check to see if the nm accepts a BSD-compat flag. - # Adding the `sed 1q' prevents false positives on HP-UX, which says: - # nm: unknown option "B" ignored - # Tru64's nm complains that /dev/null is an invalid object file - case `"$tmp_nm" -B /dev/null 2>&1 | sed '1q'` in - */dev/null* | *'Invalid file or object type'*) - lt_cv_path_NM="$tmp_nm -B" - break - ;; - *) - case `"$tmp_nm" -p /dev/null 2>&1 | sed '1q'` in - */dev/null*) - lt_cv_path_NM="$tmp_nm -p" - break - ;; - *) - lt_cv_path_NM=${lt_cv_path_NM="$tmp_nm"} # keep the first match, but - continue # so that we can try to find one that supports BSD flags - ;; - esac - ;; - esac - fi - done - IFS="$lt_save_ifs" - done - : ${lt_cv_path_NM=no} -fi]) -if test "$lt_cv_path_NM" != "no"; then - NM="$lt_cv_path_NM" -else - # Didn't find any BSD compatible name lister, look for dumpbin. - if test -n "$DUMPBIN"; then : - # Let the user override the test. - else - AC_CHECK_TOOLS(DUMPBIN, [dumpbin "link -dump"], :) - case `$DUMPBIN -symbols /dev/null 2>&1 | sed '1q'` in - *COFF*) - DUMPBIN="$DUMPBIN -symbols" - ;; - *) - DUMPBIN=: - ;; - esac - fi - AC_SUBST([DUMPBIN]) - if test "$DUMPBIN" != ":"; then - NM="$DUMPBIN" - fi -fi -test -z "$NM" && NM=nm -AC_SUBST([NM]) -_LT_DECL([], [NM], [1], [A BSD- or MS-compatible name lister])dnl - -AC_CACHE_CHECK([the name lister ($NM) interface], [lt_cv_nm_interface], - [lt_cv_nm_interface="BSD nm" - echo "int some_variable = 0;" > conftest.$ac_ext - (eval echo "\"\$as_me:$LINENO: $ac_compile\"" >&AS_MESSAGE_LOG_FD) - (eval "$ac_compile" 2>conftest.err) - cat conftest.err >&AS_MESSAGE_LOG_FD - (eval echo "\"\$as_me:$LINENO: $NM \\\"conftest.$ac_objext\\\"\"" >&AS_MESSAGE_LOG_FD) - (eval "$NM \"conftest.$ac_objext\"" 2>conftest.err > conftest.out) - cat conftest.err >&AS_MESSAGE_LOG_FD - (eval echo "\"\$as_me:$LINENO: output\"" >&AS_MESSAGE_LOG_FD) - cat conftest.out >&AS_MESSAGE_LOG_FD - if $GREP 'External.*some_variable' conftest.out > /dev/null; then - lt_cv_nm_interface="MS dumpbin" - fi - rm -f conftest*]) -])# LT_PATH_NM - -# Old names: -AU_ALIAS([AM_PROG_NM], [LT_PATH_NM]) -AU_ALIAS([AC_PROG_NM], [LT_PATH_NM]) -dnl aclocal-1.4 backwards compatibility: -dnl AC_DEFUN([AM_PROG_NM], []) -dnl AC_DEFUN([AC_PROG_NM], []) - -# _LT_CHECK_SHAREDLIB_FROM_LINKLIB -# -------------------------------- -# how to determine the name of the shared library -# associated with a specific link library. -# -- PORTME fill in with the dynamic library characteristics -m4_defun([_LT_CHECK_SHAREDLIB_FROM_LINKLIB], -[m4_require([_LT_DECL_EGREP]) -m4_require([_LT_DECL_OBJDUMP]) -m4_require([_LT_DECL_DLLTOOL]) -AC_CACHE_CHECK([how to associate runtime and link libraries], -lt_cv_sharedlib_from_linklib_cmd, -[lt_cv_sharedlib_from_linklib_cmd='unknown' - -case $host_os in -cygwin* | mingw* | pw32* | cegcc*) - # two different shell functions defined in ltmain.sh - # decide which to use based on capabilities of $DLLTOOL - case `$DLLTOOL --help 2>&1` in - *--identify-strict*) - lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib - ;; - *) - lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib_fallback - ;; - esac - ;; -*) - # fallback: assume linklib IS sharedlib - lt_cv_sharedlib_from_linklib_cmd="$ECHO" - ;; -esac -]) -sharedlib_from_linklib_cmd=$lt_cv_sharedlib_from_linklib_cmd -test -z "$sharedlib_from_linklib_cmd" && sharedlib_from_linklib_cmd=$ECHO - -_LT_DECL([], [sharedlib_from_linklib_cmd], [1], - [Command to associate shared and link libraries]) -])# _LT_CHECK_SHAREDLIB_FROM_LINKLIB - - -# _LT_PATH_MANIFEST_TOOL -# ---------------------- -# locate the manifest tool -m4_defun([_LT_PATH_MANIFEST_TOOL], -[AC_CHECK_TOOL(MANIFEST_TOOL, mt, :) -test -z "$MANIFEST_TOOL" && MANIFEST_TOOL=mt -AC_CACHE_CHECK([if $MANIFEST_TOOL is a manifest tool], [lt_cv_path_mainfest_tool], - [lt_cv_path_mainfest_tool=no - echo "$as_me:$LINENO: $MANIFEST_TOOL '-?'" >&AS_MESSAGE_LOG_FD - $MANIFEST_TOOL '-?' 2>conftest.err > conftest.out - cat conftest.err >&AS_MESSAGE_LOG_FD - if $GREP 'Manifest Tool' conftest.out > /dev/null; then - lt_cv_path_mainfest_tool=yes - fi - rm -f conftest*]) -if test "x$lt_cv_path_mainfest_tool" != xyes; then - MANIFEST_TOOL=: -fi -_LT_DECL([], [MANIFEST_TOOL], [1], [Manifest tool])dnl -])# _LT_PATH_MANIFEST_TOOL - - -# LT_LIB_M -# -------- -# check for math library -AC_DEFUN([LT_LIB_M], -[AC_REQUIRE([AC_CANONICAL_HOST])dnl -LIBM= -case $host in -*-*-beos* | *-*-cegcc* | *-*-cygwin* | *-*-haiku* | *-*-pw32* | *-*-darwin*) - # These system don't have libm, or don't need it - ;; -*-ncr-sysv4.3*) - AC_CHECK_LIB(mw, _mwvalidcheckl, LIBM="-lmw") - AC_CHECK_LIB(m, cos, LIBM="$LIBM -lm") - ;; -*) - AC_CHECK_LIB(m, cos, LIBM="-lm") - ;; -esac -AC_SUBST([LIBM]) -])# LT_LIB_M - -# Old name: -AU_ALIAS([AC_CHECK_LIBM], [LT_LIB_M]) -dnl aclocal-1.4 backwards compatibility: -dnl AC_DEFUN([AC_CHECK_LIBM], []) - - -# _LT_COMPILER_NO_RTTI([TAGNAME]) -# ------------------------------- -m4_defun([_LT_COMPILER_NO_RTTI], -[m4_require([_LT_TAG_COMPILER])dnl - -_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)= - -if test "$GCC" = yes; then - case $cc_basename in - nvcc*) - _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -Xcompiler -fno-builtin' ;; - *) - _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -fno-builtin' ;; - esac - - _LT_COMPILER_OPTION([if $compiler supports -fno-rtti -fno-exceptions], - lt_cv_prog_compiler_rtti_exceptions, - [-fno-rtti -fno-exceptions], [], - [_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)="$_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1) -fno-rtti -fno-exceptions"]) -fi -_LT_TAGDECL([no_builtin_flag], [lt_prog_compiler_no_builtin_flag], [1], - [Compiler flag to turn off builtin functions]) -])# _LT_COMPILER_NO_RTTI - - -# _LT_CMD_GLOBAL_SYMBOLS -# ---------------------- -m4_defun([_LT_CMD_GLOBAL_SYMBOLS], -[AC_REQUIRE([AC_CANONICAL_HOST])dnl -AC_REQUIRE([AC_PROG_CC])dnl -AC_REQUIRE([AC_PROG_AWK])dnl -AC_REQUIRE([LT_PATH_NM])dnl -AC_REQUIRE([LT_PATH_LD])dnl -m4_require([_LT_DECL_SED])dnl -m4_require([_LT_DECL_EGREP])dnl -m4_require([_LT_TAG_COMPILER])dnl - -# Check for command to grab the raw symbol name followed by C symbol from nm. -AC_MSG_CHECKING([command to parse $NM output from $compiler object]) -AC_CACHE_VAL([lt_cv_sys_global_symbol_pipe], -[ -# These are sane defaults that work on at least a few old systems. -# [They come from Ultrix. What could be older than Ultrix?!! ;)] - -# Character class describing NM global symbol codes. -symcode='[[BCDEGRST]]' - -# Regexp to match symbols that can be accessed directly from C. -sympat='\([[_A-Za-z]][[_A-Za-z0-9]]*\)' - -# Define system-specific variables. -case $host_os in -aix*) - symcode='[[BCDT]]' - ;; -cygwin* | mingw* | pw32* | cegcc*) - symcode='[[ABCDGISTW]]' - ;; -hpux*) - if test "$host_cpu" = ia64; then - symcode='[[ABCDEGRST]]' - fi - ;; -irix* | nonstopux*) - symcode='[[BCDEGRST]]' - ;; -osf*) - symcode='[[BCDEGQRST]]' - ;; -solaris*) - symcode='[[BDRT]]' - ;; -sco3.2v5*) - symcode='[[DT]]' - ;; -sysv4.2uw2*) - symcode='[[DT]]' - ;; -sysv5* | sco5v6* | unixware* | OpenUNIX*) - symcode='[[ABDT]]' - ;; -sysv4) - symcode='[[DFNSTU]]' - ;; -esac - -# If we're using GNU nm, then use its standard symbol codes. -case `$NM -V 2>&1` in -*GNU* | *'with BFD'*) - symcode='[[ABCDGIRSTW]]' ;; -esac - -# Transform an extracted symbol line into a proper C declaration. -# Some systems (esp. on ia64) link data and code symbols differently, -# so use this general approach. -lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^T .* \(.*\)$/extern int \1();/p' -e 's/^$symcode* .* \(.*\)$/extern char \1;/p'" - -# Transform an extracted symbol line into symbol name and symbol address -lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([[^ ]]*\)[[ ]]*$/ {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([[^ ]]*\) \([[^ ]]*\)$/ {\"\2\", (void *) \&\2},/p'" -lt_cv_sys_global_symbol_to_c_name_address_lib_prefix="sed -n -e 's/^: \([[^ ]]*\)[[ ]]*$/ {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([[^ ]]*\) \(lib[[^ ]]*\)$/ {\"\2\", (void *) \&\2},/p' -e 's/^$symcode* \([[^ ]]*\) \([[^ ]]*\)$/ {\"lib\2\", (void *) \&\2},/p'" - -# Handle CRLF in mingw tool chain -opt_cr= -case $build_os in -mingw*) - opt_cr=`$ECHO 'x\{0,1\}' | tr x '\015'` # option cr in regexp - ;; -esac - -# Try without a prefix underscore, then with it. -for ac_symprfx in "" "_"; do - - # Transform symcode, sympat, and symprfx into a raw symbol and a C symbol. - symxfrm="\\1 $ac_symprfx\\2 \\2" - - # Write the raw and C identifiers. - if test "$lt_cv_nm_interface" = "MS dumpbin"; then - # Fake it for dumpbin and say T for any non-static function - # and D for any global variable. - # Also find C++ and __fastcall symbols from MSVC++, - # which start with @ or ?. - lt_cv_sys_global_symbol_pipe="$AWK ['"\ -" {last_section=section; section=\$ 3};"\ -" /^COFF SYMBOL TABLE/{for(i in hide) delete hide[i]};"\ -" /Section length .*#relocs.*(pick any)/{hide[last_section]=1};"\ -" \$ 0!~/External *\|/{next};"\ -" / 0+ UNDEF /{next}; / UNDEF \([^|]\)*()/{next};"\ -" {if(hide[section]) next};"\ -" {f=0}; \$ 0~/\(\).*\|/{f=1}; {printf f ? \"T \" : \"D \"};"\ -" {split(\$ 0, a, /\||\r/); split(a[2], s)};"\ -" s[1]~/^[@?]/{print s[1], s[1]; next};"\ -" s[1]~prfx {split(s[1],t,\"@\"); print t[1], substr(t[1],length(prfx))}"\ -" ' prfx=^$ac_symprfx]" - else - lt_cv_sys_global_symbol_pipe="sed -n -e 's/^.*[[ ]]\($symcode$symcode*\)[[ ]][[ ]]*$ac_symprfx$sympat$opt_cr$/$symxfrm/p'" - fi - lt_cv_sys_global_symbol_pipe="$lt_cv_sys_global_symbol_pipe | sed '/ __gnu_lto/d'" - - # Check to see that the pipe works correctly. - pipe_works=no - - rm -f conftest* - cat > conftest.$ac_ext <<_LT_EOF -#ifdef __cplusplus -extern "C" { -#endif -char nm_test_var; -void nm_test_func(void); -void nm_test_func(void){} -#ifdef __cplusplus -} -#endif -int main(){nm_test_var='a';nm_test_func();return(0);} -_LT_EOF - - if AC_TRY_EVAL(ac_compile); then - # Now try to grab the symbols. - nlist=conftest.nm - if AC_TRY_EVAL(NM conftest.$ac_objext \| "$lt_cv_sys_global_symbol_pipe" \> $nlist) && test -s "$nlist"; then - # Try sorting and uniquifying the output. - if sort "$nlist" | uniq > "$nlist"T; then - mv -f "$nlist"T "$nlist" - else - rm -f "$nlist"T - fi - - # Make sure that we snagged all the symbols we need. - if $GREP ' nm_test_var$' "$nlist" >/dev/null; then - if $GREP ' nm_test_func$' "$nlist" >/dev/null; then - cat <<_LT_EOF > conftest.$ac_ext -/* Keep this code in sync between libtool.m4, ltmain, lt_system.h, and tests. */ -#if defined(_WIN32) || defined(__CYGWIN__) || defined(_WIN32_WCE) -/* DATA imports from DLLs on WIN32 con't be const, because runtime - relocations are performed -- see ld's documentation on pseudo-relocs. */ -# define LT@&t@_DLSYM_CONST -#elif defined(__osf__) -/* This system does not cope well with relocations in const data. */ -# define LT@&t@_DLSYM_CONST -#else -# define LT@&t@_DLSYM_CONST const -#endif - -#ifdef __cplusplus -extern "C" { -#endif - -_LT_EOF - # Now generate the symbol file. - eval "$lt_cv_sys_global_symbol_to_cdecl"' < "$nlist" | $GREP -v main >> conftest.$ac_ext' - - cat <<_LT_EOF >> conftest.$ac_ext - -/* The mapping between symbol names and symbols. */ -LT@&t@_DLSYM_CONST struct { - const char *name; - void *address; -} -lt__PROGRAM__LTX_preloaded_symbols[[]] = -{ - { "@PROGRAM@", (void *) 0 }, -_LT_EOF - $SED "s/^$symcode$symcode* \(.*\) \(.*\)$/ {\"\2\", (void *) \&\2},/" < "$nlist" | $GREP -v main >> conftest.$ac_ext - cat <<\_LT_EOF >> conftest.$ac_ext - {0, (void *) 0} -}; - -/* This works around a problem in FreeBSD linker */ -#ifdef FREEBSD_WORKAROUND -static const void *lt_preloaded_setup() { - return lt__PROGRAM__LTX_preloaded_symbols; -} -#endif - -#ifdef __cplusplus -} -#endif -_LT_EOF - # Now try linking the two files. - mv conftest.$ac_objext conftstm.$ac_objext - lt_globsym_save_LIBS=$LIBS - lt_globsym_save_CFLAGS=$CFLAGS - LIBS="conftstm.$ac_objext" - CFLAGS="$CFLAGS$_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)" - if AC_TRY_EVAL(ac_link) && test -s conftest${ac_exeext}; then - pipe_works=yes - fi - LIBS=$lt_globsym_save_LIBS - CFLAGS=$lt_globsym_save_CFLAGS - else - echo "cannot find nm_test_func in $nlist" >&AS_MESSAGE_LOG_FD - fi - else - echo "cannot find nm_test_var in $nlist" >&AS_MESSAGE_LOG_FD - fi - else - echo "cannot run $lt_cv_sys_global_symbol_pipe" >&AS_MESSAGE_LOG_FD - fi - else - echo "$progname: failed program was:" >&AS_MESSAGE_LOG_FD - cat conftest.$ac_ext >&5 - fi - rm -rf conftest* conftst* - - # Do not use the global_symbol_pipe unless it works. - if test "$pipe_works" = yes; then - break - else - lt_cv_sys_global_symbol_pipe= - fi -done -]) -if test -z "$lt_cv_sys_global_symbol_pipe"; then - lt_cv_sys_global_symbol_to_cdecl= -fi -if test -z "$lt_cv_sys_global_symbol_pipe$lt_cv_sys_global_symbol_to_cdecl"; then - AC_MSG_RESULT(failed) -else - AC_MSG_RESULT(ok) -fi - -# Response file support. -if test "$lt_cv_nm_interface" = "MS dumpbin"; then - nm_file_list_spec='@' -elif $NM --help 2>/dev/null | grep '[[@]]FILE' >/dev/null; then - nm_file_list_spec='@' -fi - -_LT_DECL([global_symbol_pipe], [lt_cv_sys_global_symbol_pipe], [1], - [Take the output of nm and produce a listing of raw symbols and C names]) -_LT_DECL([global_symbol_to_cdecl], [lt_cv_sys_global_symbol_to_cdecl], [1], - [Transform the output of nm in a proper C declaration]) -_LT_DECL([global_symbol_to_c_name_address], - [lt_cv_sys_global_symbol_to_c_name_address], [1], - [Transform the output of nm in a C name address pair]) -_LT_DECL([global_symbol_to_c_name_address_lib_prefix], - [lt_cv_sys_global_symbol_to_c_name_address_lib_prefix], [1], - [Transform the output of nm in a C name address pair when lib prefix is needed]) -_LT_DECL([], [nm_file_list_spec], [1], - [Specify filename containing input files for $NM]) -]) # _LT_CMD_GLOBAL_SYMBOLS - - -# _LT_COMPILER_PIC([TAGNAME]) -# --------------------------- -m4_defun([_LT_COMPILER_PIC], -[m4_require([_LT_TAG_COMPILER])dnl -_LT_TAGVAR(lt_prog_compiler_wl, $1)= -_LT_TAGVAR(lt_prog_compiler_pic, $1)= -_LT_TAGVAR(lt_prog_compiler_static, $1)= - -m4_if([$1], [CXX], [ - # C++ specific cases for pic, static, wl, etc. - if test "$GXX" = yes; then - _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' - _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' - - case $host_os in - aix*) - # All AIX code is PIC. - if test "$host_cpu" = ia64; then - # AIX 5 now supports IA64 processor - _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' - fi - ;; - - amigaos*) - case $host_cpu in - powerpc) - # see comment about AmigaOS4 .so support - _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' - ;; - m68k) - # FIXME: we need at least 68020 code to build shared libraries, but - # adding the `-m68020' flag to GCC prevents building anything better, - # like `-m68040'. - _LT_TAGVAR(lt_prog_compiler_pic, $1)='-m68020 -resident32 -malways-restore-a4' - ;; - esac - ;; - - beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) - # PIC is the default for these OSes. - ;; - mingw* | cygwin* | os2* | pw32* | cegcc*) - # This hack is so that the source file can tell whether it is being - # built for inclusion in a dll (and should export symbols for example). - # Although the cygwin gcc ignores -fPIC, still need this for old-style - # (--disable-auto-import) libraries - m4_if([$1], [GCJ], [], - [_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT']) - ;; - darwin* | rhapsody*) - # PIC is the default on this platform - # Common symbols not allowed in MH_DYLIB files - _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fno-common' - ;; - *djgpp*) - # DJGPP does not support shared libraries at all - _LT_TAGVAR(lt_prog_compiler_pic, $1)= - ;; - haiku*) - # PIC is the default for Haiku. - # The "-static" flag exists, but is broken. - _LT_TAGVAR(lt_prog_compiler_static, $1)= - ;; - interix[[3-9]]*) - # Interix 3.x gcc -fpic/-fPIC options generate broken code. - # Instead, we relocate shared libraries at runtime. - ;; - sysv4*MP*) - if test -d /usr/nec; then - _LT_TAGVAR(lt_prog_compiler_pic, $1)=-Kconform_pic - fi - ;; - hpux*) - # PIC is the default for 64-bit PA HP-UX, but not for 32-bit - # PA HP-UX. On IA64 HP-UX, PIC is the default but the pic flag - # sets the default TLS model and affects inlining. - case $host_cpu in - hppa*64*) - ;; - *) - _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' - ;; - esac - ;; - *qnx* | *nto*) - # QNX uses GNU C++, but need to define -shared option too, otherwise - # it will coredump. - _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared' - ;; - *) - _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' - ;; - esac - else - case $host_os in - aix[[4-9]]*) - # All AIX code is PIC. - if test "$host_cpu" = ia64; then - # AIX 5 now supports IA64 processor - _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' - else - _LT_TAGVAR(lt_prog_compiler_static, $1)='-bnso -bI:/lib/syscalls.exp' - fi - ;; - chorus*) - case $cc_basename in - cxch68*) - # Green Hills C++ Compiler - # _LT_TAGVAR(lt_prog_compiler_static, $1)="--no_auto_instantiation -u __main -u __premain -u _abort -r $COOL_DIR/lib/libOrb.a $MVME_DIR/lib/CC/libC.a $MVME_DIR/lib/classix/libcx.s.a" - ;; - esac - ;; - mingw* | cygwin* | os2* | pw32* | cegcc*) - # This hack is so that the source file can tell whether it is being - # built for inclusion in a dll (and should export symbols for example). - m4_if([$1], [GCJ], [], - [_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT']) - ;; - dgux*) - case $cc_basename in - ec++*) - _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' - ;; - ghcx*) - # Green Hills C++ Compiler - _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' - ;; - *) - ;; - esac - ;; - freebsd* | dragonfly*) - # FreeBSD uses GNU C++ - ;; - hpux9* | hpux10* | hpux11*) - case $cc_basename in - CC*) - _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' - _LT_TAGVAR(lt_prog_compiler_static, $1)='${wl}-a ${wl}archive' - if test "$host_cpu" != ia64; then - _LT_TAGVAR(lt_prog_compiler_pic, $1)='+Z' - fi - ;; - aCC*) - _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' - _LT_TAGVAR(lt_prog_compiler_static, $1)='${wl}-a ${wl}archive' - case $host_cpu in - hppa*64*|ia64*) - # +Z the default - ;; - *) - _LT_TAGVAR(lt_prog_compiler_pic, $1)='+Z' - ;; - esac - ;; - *) - ;; - esac - ;; - interix*) - # This is c89, which is MS Visual C++ (no shared libs) - # Anyone wants to do a port? - ;; - irix5* | irix6* | nonstopux*) - case $cc_basename in - CC*) - _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' - _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' - # CC pic flag -KPIC is the default. - ;; - *) - ;; - esac - ;; - linux* | k*bsd*-gnu | kopensolaris*-gnu) - case $cc_basename in - KCC*) - # KAI C++ Compiler - _LT_TAGVAR(lt_prog_compiler_wl, $1)='--backend -Wl,' - _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' - ;; - ecpc* ) - # old Intel C++ for x86_64 which still supported -KPIC. - _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' - _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' - _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' - ;; - icpc* ) - # Intel C++, used to be incompatible with GCC. - # ICC 10 doesn't accept -KPIC any more. - _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' - _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' - _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' - ;; - pgCC* | pgcpp*) - # Portland Group C++ compiler - _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' - _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fpic' - _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' - ;; - cxx*) - # Compaq C++ - # Make sure the PIC flag is empty. It appears that all Alpha - # Linux and Compaq Tru64 Unix objects are PIC. - _LT_TAGVAR(lt_prog_compiler_pic, $1)= - _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' - ;; - xlc* | xlC* | bgxl[[cC]]* | mpixl[[cC]]*) - # IBM XL 8.0, 9.0 on PPC and BlueGene - _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' - _LT_TAGVAR(lt_prog_compiler_pic, $1)='-qpic' - _LT_TAGVAR(lt_prog_compiler_static, $1)='-qstaticlink' - ;; - *) - case `$CC -V 2>&1 | sed 5q` in - *Sun\ C*) - # Sun C++ 5.9 - _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' - _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' - _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' - ;; - esac - ;; - esac - ;; - lynxos*) - ;; - m88k*) - ;; - mvs*) - case $cc_basename in - cxx*) - _LT_TAGVAR(lt_prog_compiler_pic, $1)='-W c,exportall' - ;; - *) - ;; - esac - ;; - netbsd* | netbsdelf*-gnu) - ;; - *qnx* | *nto*) - # QNX uses GNU C++, but need to define -shared option too, otherwise - # it will coredump. - _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared' - ;; - osf3* | osf4* | osf5*) - case $cc_basename in - KCC*) - _LT_TAGVAR(lt_prog_compiler_wl, $1)='--backend -Wl,' - ;; - RCC*) - # Rational C++ 2.4.1 - _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' - ;; - cxx*) - # Digital/Compaq C++ - _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' - # Make sure the PIC flag is empty. It appears that all Alpha - # Linux and Compaq Tru64 Unix objects are PIC. - _LT_TAGVAR(lt_prog_compiler_pic, $1)= - _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' - ;; - *) - ;; - esac - ;; - psos*) - ;; - solaris*) - case $cc_basename in - CC* | sunCC*) - # Sun C++ 4.2, 5.x and Centerline C++ - _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' - _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' - _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' - ;; - gcx*) - # Green Hills C++ Compiler - _LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC' - ;; - *) - ;; - esac - ;; - sunos4*) - case $cc_basename in - CC*) - # Sun C++ 4.x - _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' - _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' - ;; - lcc*) - # Lucid - _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' - ;; - *) - ;; - esac - ;; - sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) - case $cc_basename in - CC*) - _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' - _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' - _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' - ;; - esac - ;; - tandem*) - case $cc_basename in - NCC*) - # NonStop-UX NCC 3.20 - _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' - ;; - *) - ;; - esac - ;; - vxworks*) - ;; - *) - _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no - ;; - esac - fi -], -[ - if test "$GCC" = yes; then - _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' - _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' - - case $host_os in - aix*) - # All AIX code is PIC. - if test "$host_cpu" = ia64; then - # AIX 5 now supports IA64 processor - _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' - fi - ;; - - amigaos*) - case $host_cpu in - powerpc) - # see comment about AmigaOS4 .so support - _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' - ;; - m68k) - # FIXME: we need at least 68020 code to build shared libraries, but - # adding the `-m68020' flag to GCC prevents building anything better, - # like `-m68040'. - _LT_TAGVAR(lt_prog_compiler_pic, $1)='-m68020 -resident32 -malways-restore-a4' - ;; - esac - ;; - - beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) - # PIC is the default for these OSes. - ;; - - mingw* | cygwin* | pw32* | os2* | cegcc*) - # This hack is so that the source file can tell whether it is being - # built for inclusion in a dll (and should export symbols for example). - # Although the cygwin gcc ignores -fPIC, still need this for old-style - # (--disable-auto-import) libraries - m4_if([$1], [GCJ], [], - [_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT']) - ;; - - darwin* | rhapsody*) - # PIC is the default on this platform - # Common symbols not allowed in MH_DYLIB files - _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fno-common' - ;; - - haiku*) - # PIC is the default for Haiku. - # The "-static" flag exists, but is broken. - _LT_TAGVAR(lt_prog_compiler_static, $1)= - ;; - - hpux*) - # PIC is the default for 64-bit PA HP-UX, but not for 32-bit - # PA HP-UX. On IA64 HP-UX, PIC is the default but the pic flag - # sets the default TLS model and affects inlining. - case $host_cpu in - hppa*64*) - # +Z the default - ;; - *) - _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' - ;; - esac - ;; - - interix[[3-9]]*) - # Interix 3.x gcc -fpic/-fPIC options generate broken code. - # Instead, we relocate shared libraries at runtime. - ;; - - msdosdjgpp*) - # Just because we use GCC doesn't mean we suddenly get shared libraries - # on systems that don't support them. - _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no - enable_shared=no - ;; - - *nto* | *qnx*) - # QNX uses GNU C++, but need to define -shared option too, otherwise - # it will coredump. - _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared' - ;; - - sysv4*MP*) - if test -d /usr/nec; then - _LT_TAGVAR(lt_prog_compiler_pic, $1)=-Kconform_pic - fi - ;; - - *) - _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' - ;; - esac - - case $cc_basename in - nvcc*) # Cuda Compiler Driver 2.2 - _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Xlinker ' - if test -n "$_LT_TAGVAR(lt_prog_compiler_pic, $1)"; then - _LT_TAGVAR(lt_prog_compiler_pic, $1)="-Xcompiler $_LT_TAGVAR(lt_prog_compiler_pic, $1)" - fi - ;; - esac - else - # PORTME Check for flag to pass linker flags through the system compiler. - case $host_os in - aix*) - _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' - if test "$host_cpu" = ia64; then - # AIX 5 now supports IA64 processor - _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' - else - _LT_TAGVAR(lt_prog_compiler_static, $1)='-bnso -bI:/lib/syscalls.exp' - fi - ;; - - mingw* | cygwin* | pw32* | os2* | cegcc*) - # This hack is so that the source file can tell whether it is being - # built for inclusion in a dll (and should export symbols for example). - m4_if([$1], [GCJ], [], - [_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT']) - ;; - - hpux9* | hpux10* | hpux11*) - _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' - # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but - # not for PA HP-UX. - case $host_cpu in - hppa*64*|ia64*) - # +Z the default - ;; - *) - _LT_TAGVAR(lt_prog_compiler_pic, $1)='+Z' - ;; - esac - # Is there a better lt_prog_compiler_static that works with the bundled CC? - _LT_TAGVAR(lt_prog_compiler_static, $1)='${wl}-a ${wl}archive' - ;; - - irix5* | irix6* | nonstopux*) - _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' - # PIC (with -KPIC) is the default. - _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' - ;; - - linux* | k*bsd*-gnu | kopensolaris*-gnu) - case $cc_basename in - # old Intel for x86_64 which still supported -KPIC. - ecc*) - _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' - _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' - _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' - ;; - # icc used to be incompatible with GCC. - # ICC 10 doesn't accept -KPIC any more. - icc* | ifort*) - _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' - _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' - _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' - ;; - # Lahey Fortran 8.1. - lf95*) - _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' - _LT_TAGVAR(lt_prog_compiler_pic, $1)='--shared' - _LT_TAGVAR(lt_prog_compiler_static, $1)='--static' - ;; - nagfor*) - # NAG Fortran compiler - _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,-Wl,,' - _LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC' - _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' - ;; - pgcc* | pgf77* | pgf90* | pgf95* | pgfortran*) - # Portland Group compilers (*not* the Pentium gcc compiler, - # which looks to be a dead project) - _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' - _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fpic' - _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' - ;; - ccc*) - _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' - # All Alpha code is PIC. - _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' - ;; - xl* | bgxl* | bgf* | mpixl*) - # IBM XL C 8.0/Fortran 10.1, 11.1 on PPC and BlueGene - _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' - _LT_TAGVAR(lt_prog_compiler_pic, $1)='-qpic' - _LT_TAGVAR(lt_prog_compiler_static, $1)='-qstaticlink' - ;; - *) - case `$CC -V 2>&1 | sed 5q` in - *Sun\ Ceres\ Fortran* | *Sun*Fortran*\ [[1-7]].* | *Sun*Fortran*\ 8.[[0-3]]*) - # Sun Fortran 8.3 passes all unrecognized flags to the linker - _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' - _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' - _LT_TAGVAR(lt_prog_compiler_wl, $1)='' - ;; - *Sun\ F* | *Sun*Fortran*) - _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' - _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' - _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' - ;; - *Sun\ C*) - # Sun C 5.9 - _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' - _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' - _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' - ;; - *Intel*\ [[CF]]*Compiler*) - _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' - _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' - _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' - ;; - *Portland\ Group*) - _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' - _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fpic' - _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' - ;; - esac - ;; - esac - ;; - - newsos6) - _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' - _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' - ;; - - *nto* | *qnx*) - # QNX uses GNU C++, but need to define -shared option too, otherwise - # it will coredump. - _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared' - ;; - - osf3* | osf4* | osf5*) - _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' - # All OSF/1 code is PIC. - _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' - ;; - - rdos*) - _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' - ;; - - solaris*) - _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' - _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' - case $cc_basename in - f77* | f90* | f95* | sunf77* | sunf90* | sunf95*) - _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ';; - *) - _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,';; - esac - ;; - - sunos4*) - _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' - _LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC' - _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' - ;; - - sysv4 | sysv4.2uw2* | sysv4.3*) - _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' - _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' - _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' - ;; - - sysv4*MP*) - if test -d /usr/nec ;then - _LT_TAGVAR(lt_prog_compiler_pic, $1)='-Kconform_pic' - _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' - fi - ;; - - sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) - _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' - _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' - _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' - ;; - - unicos*) - _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' - _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no - ;; - - uts4*) - _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' - _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' - ;; - - *) - _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no - ;; - esac - fi -]) -case $host_os in - # For platforms which do not support PIC, -DPIC is meaningless: - *djgpp*) - _LT_TAGVAR(lt_prog_compiler_pic, $1)= - ;; - *) - _LT_TAGVAR(lt_prog_compiler_pic, $1)="$_LT_TAGVAR(lt_prog_compiler_pic, $1)@&t@m4_if([$1],[],[ -DPIC],[m4_if([$1],[CXX],[ -DPIC],[])])" - ;; -esac - -AC_CACHE_CHECK([for $compiler option to produce PIC], - [_LT_TAGVAR(lt_cv_prog_compiler_pic, $1)], - [_LT_TAGVAR(lt_cv_prog_compiler_pic, $1)=$_LT_TAGVAR(lt_prog_compiler_pic, $1)]) -_LT_TAGVAR(lt_prog_compiler_pic, $1)=$_LT_TAGVAR(lt_cv_prog_compiler_pic, $1) - -# -# Check to make sure the PIC flag actually works. -# -if test -n "$_LT_TAGVAR(lt_prog_compiler_pic, $1)"; then - _LT_COMPILER_OPTION([if $compiler PIC flag $_LT_TAGVAR(lt_prog_compiler_pic, $1) works], - [_LT_TAGVAR(lt_cv_prog_compiler_pic_works, $1)], - [$_LT_TAGVAR(lt_prog_compiler_pic, $1)@&t@m4_if([$1],[],[ -DPIC],[m4_if([$1],[CXX],[ -DPIC],[])])], [], - [case $_LT_TAGVAR(lt_prog_compiler_pic, $1) in - "" | " "*) ;; - *) _LT_TAGVAR(lt_prog_compiler_pic, $1)=" $_LT_TAGVAR(lt_prog_compiler_pic, $1)" ;; - esac], - [_LT_TAGVAR(lt_prog_compiler_pic, $1)= - _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no]) -fi -_LT_TAGDECL([pic_flag], [lt_prog_compiler_pic], [1], - [Additional compiler flags for building library objects]) - -_LT_TAGDECL([wl], [lt_prog_compiler_wl], [1], - [How to pass a linker flag through the compiler]) -# -# Check to make sure the static flag actually works. -# -wl=$_LT_TAGVAR(lt_prog_compiler_wl, $1) eval lt_tmp_static_flag=\"$_LT_TAGVAR(lt_prog_compiler_static, $1)\" -_LT_LINKER_OPTION([if $compiler static flag $lt_tmp_static_flag works], - _LT_TAGVAR(lt_cv_prog_compiler_static_works, $1), - $lt_tmp_static_flag, - [], - [_LT_TAGVAR(lt_prog_compiler_static, $1)=]) -_LT_TAGDECL([link_static_flag], [lt_prog_compiler_static], [1], - [Compiler flag to prevent dynamic linking]) -])# _LT_COMPILER_PIC - - -# _LT_LINKER_SHLIBS([TAGNAME]) -# ---------------------------- -# See if the linker supports building shared libraries. -m4_defun([_LT_LINKER_SHLIBS], -[AC_REQUIRE([LT_PATH_LD])dnl -AC_REQUIRE([LT_PATH_NM])dnl -m4_require([_LT_PATH_MANIFEST_TOOL])dnl -m4_require([_LT_FILEUTILS_DEFAULTS])dnl -m4_require([_LT_DECL_EGREP])dnl -m4_require([_LT_DECL_SED])dnl -m4_require([_LT_CMD_GLOBAL_SYMBOLS])dnl -m4_require([_LT_TAG_COMPILER])dnl -AC_MSG_CHECKING([whether the $compiler linker ($LD) supports shared libraries]) -m4_if([$1], [CXX], [ - _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' - _LT_TAGVAR(exclude_expsyms, $1)=['_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*'] - case $host_os in - aix[[4-9]]*) - # If we're using GNU nm, then we don't want the "-C" option. - # -C means demangle to AIX nm, but means don't demangle with GNU nm - # Also, AIX nm treats weak defined symbols like other global defined - # symbols, whereas GNU nm marks them as "W". - if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then - _LT_TAGVAR(export_symbols_cmds, $1)='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && ([substr](\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' - else - _LT_TAGVAR(export_symbols_cmds, $1)='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && ([substr](\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' - fi - ;; - pw32*) - _LT_TAGVAR(export_symbols_cmds, $1)="$ltdll_cmds" - ;; - cygwin* | mingw* | cegcc*) - case $cc_basename in - cl*) - _LT_TAGVAR(exclude_expsyms, $1)='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*' - ;; - *) - _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\([[^ ]]*\)/\1 DATA/;s/^.*[[ ]]__nm__\([[^ ]]*\)[[ ]][[^ ]]*/\1 DATA/;/^I[[ ]]/d;/^[[AITW]][[ ]]/s/.* //'\'' | sort | uniq > $export_symbols' - _LT_TAGVAR(exclude_expsyms, $1)=['[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname'] - ;; - esac - ;; - linux* | k*bsd*-gnu | gnu*) - _LT_TAGVAR(link_all_deplibs, $1)=no - ;; - *) - _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' - ;; - esac -], [ - runpath_var= - _LT_TAGVAR(allow_undefined_flag, $1)= - _LT_TAGVAR(always_export_symbols, $1)=no - _LT_TAGVAR(archive_cmds, $1)= - _LT_TAGVAR(archive_expsym_cmds, $1)= - _LT_TAGVAR(compiler_needs_object, $1)=no - _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no - _LT_TAGVAR(export_dynamic_flag_spec, $1)= - _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' - _LT_TAGVAR(hardcode_automatic, $1)=no - _LT_TAGVAR(hardcode_direct, $1)=no - _LT_TAGVAR(hardcode_direct_absolute, $1)=no - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)= - _LT_TAGVAR(hardcode_libdir_separator, $1)= - _LT_TAGVAR(hardcode_minus_L, $1)=no - _LT_TAGVAR(hardcode_shlibpath_var, $1)=unsupported - _LT_TAGVAR(inherit_rpath, $1)=no - _LT_TAGVAR(link_all_deplibs, $1)=unknown - _LT_TAGVAR(module_cmds, $1)= - _LT_TAGVAR(module_expsym_cmds, $1)= - _LT_TAGVAR(old_archive_from_new_cmds, $1)= - _LT_TAGVAR(old_archive_from_expsyms_cmds, $1)= - _LT_TAGVAR(thread_safe_flag_spec, $1)= - _LT_TAGVAR(whole_archive_flag_spec, $1)= - # include_expsyms should be a list of space-separated symbols to be *always* - # included in the symbol list - _LT_TAGVAR(include_expsyms, $1)= - # exclude_expsyms can be an extended regexp of symbols to exclude - # it will be wrapped by ` (' and `)$', so one must not match beginning or - # end of line. Example: `a|bc|.*d.*' will exclude the symbols `a' and `bc', - # as well as any symbol that contains `d'. - _LT_TAGVAR(exclude_expsyms, $1)=['_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*'] - # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out - # platforms (ab)use it in PIC code, but their linkers get confused if - # the symbol is explicitly referenced. Since portable code cannot - # rely on this symbol name, it's probably fine to never include it in - # preloaded symbol tables. - # Exclude shared library initialization/finalization symbols. -dnl Note also adjust exclude_expsyms for C++ above. - extract_expsyms_cmds= - - case $host_os in - cygwin* | mingw* | pw32* | cegcc*) - # FIXME: the MSVC++ port hasn't been tested in a loooong time - # When not using gcc, we currently assume that we are using - # Microsoft Visual C++. - if test "$GCC" != yes; then - with_gnu_ld=no - fi - ;; - interix*) - # we just hope/assume this is gcc and not c89 (= MSVC++) - with_gnu_ld=yes - ;; - openbsd*) - with_gnu_ld=no - ;; - linux* | k*bsd*-gnu | gnu*) - _LT_TAGVAR(link_all_deplibs, $1)=no - ;; - esac - - _LT_TAGVAR(ld_shlibs, $1)=yes - - # On some targets, GNU ld is compatible enough with the native linker - # that we're better off using the native interface for both. - lt_use_gnu_ld_interface=no - if test "$with_gnu_ld" = yes; then - case $host_os in - aix*) - # The AIX port of GNU ld has always aspired to compatibility - # with the native linker. However, as the warning in the GNU ld - # block says, versions before 2.19.5* couldn't really create working - # shared libraries, regardless of the interface used. - case `$LD -v 2>&1` in - *\ \(GNU\ Binutils\)\ 2.19.5*) ;; - *\ \(GNU\ Binutils\)\ 2.[[2-9]]*) ;; - *\ \(GNU\ Binutils\)\ [[3-9]]*) ;; - *) - lt_use_gnu_ld_interface=yes - ;; - esac - ;; - *) - lt_use_gnu_ld_interface=yes - ;; - esac - fi - - if test "$lt_use_gnu_ld_interface" = yes; then - # If archive_cmds runs LD, not CC, wlarc should be empty - wlarc='${wl}' - - # Set some defaults for GNU ld with shared library support. These - # are reset later if shared libraries are not supported. Putting them - # here allows them to be overridden if necessary. - runpath_var=LD_RUN_PATH - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' - _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' - # ancient GNU ld didn't support --whole-archive et. al. - if $LD --help 2>&1 | $GREP 'no-whole-archive' > /dev/null; then - _LT_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' - else - _LT_TAGVAR(whole_archive_flag_spec, $1)= - fi - supports_anon_versioning=no - case `$LD -v 2>&1` in - *GNU\ gold*) supports_anon_versioning=yes ;; - *\ [[01]].* | *\ 2.[[0-9]].* | *\ 2.10.*) ;; # catch versions < 2.11 - *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ... - *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ... - *\ 2.11.*) ;; # other 2.11 versions - *) supports_anon_versioning=yes ;; - esac - - # See if GNU ld supports shared libraries. - case $host_os in - aix[[3-9]]*) - # On AIX/PPC, the GNU linker is very broken - if test "$host_cpu" != ia64; then - _LT_TAGVAR(ld_shlibs, $1)=no - cat <<_LT_EOF 1>&2 - -*** Warning: the GNU linker, at least up to release 2.19, is reported -*** to be unable to reliably create shared libraries on AIX. -*** Therefore, libtool is disabling shared libraries support. If you -*** really care for shared libraries, you may want to install binutils -*** 2.20 or above, or modify your PATH so that a non-GNU linker is found. -*** You will then need to restart the configuration process. - -_LT_EOF - fi - ;; - - amigaos*) - case $host_cpu in - powerpc) - # see comment about AmigaOS4 .so support - _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' - _LT_TAGVAR(archive_expsym_cmds, $1)='' - ;; - m68k) - _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' - _LT_TAGVAR(hardcode_minus_L, $1)=yes - ;; - esac - ;; - - beos*) - if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then - _LT_TAGVAR(allow_undefined_flag, $1)=unsupported - # Joseph Beckenbach says some releases of gcc - # support --undefined. This deserves some investigation. FIXME - _LT_TAGVAR(archive_cmds, $1)='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' - else - _LT_TAGVAR(ld_shlibs, $1)=no - fi - ;; - - cygwin* | mingw* | pw32* | cegcc*) - # _LT_TAGVAR(hardcode_libdir_flag_spec, $1) is actually meaningless, - # as there is no search path for DLLs. - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' - _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-all-symbols' - _LT_TAGVAR(allow_undefined_flag, $1)=unsupported - _LT_TAGVAR(always_export_symbols, $1)=no - _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes - _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\([[^ ]]*\)/\1 DATA/;s/^.*[[ ]]__nm__\([[^ ]]*\)[[ ]][[^ ]]*/\1 DATA/;/^I[[ ]]/d;/^[[AITW]][[ ]]/s/.* //'\'' | sort | uniq > $export_symbols' - _LT_TAGVAR(exclude_expsyms, $1)=['[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname'] - - if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then - _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' - # If the export-symbols file already is a .def file (1st line - # is EXPORTS), use it as is; otherwise, prepend... - _LT_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then - cp $export_symbols $output_objdir/$soname.def; - else - echo EXPORTS > $output_objdir/$soname.def; - cat $export_symbols >> $output_objdir/$soname.def; - fi~ - $CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' - else - _LT_TAGVAR(ld_shlibs, $1)=no - fi - ;; - - haiku*) - _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' - _LT_TAGVAR(link_all_deplibs, $1)=yes - ;; - - interix[[3-9]]*) - _LT_TAGVAR(hardcode_direct, $1)=no - _LT_TAGVAR(hardcode_shlibpath_var, $1)=no - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' - _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' - # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. - # Instead, shared libraries are loaded at an image base (0x10000000 by - # default) and relocated if they conflict, which is a slow very memory - # consuming and fragmenting process. To avoid this, we pick a random, - # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link - # time. Moving up from 0x10000000 also allows more sbrk(2) space. - _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' - _LT_TAGVAR(archive_expsym_cmds, $1)='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' - ;; - - gnu* | linux* | tpf* | k*bsd*-gnu | kopensolaris*-gnu) - tmp_diet=no - if test "$host_os" = linux-dietlibc; then - case $cc_basename in - diet\ *) tmp_diet=yes;; # linux-dietlibc with static linking (!diet-dyn) - esac - fi - if $LD --help 2>&1 | $EGREP ': supported targets:.* elf' > /dev/null \ - && test "$tmp_diet" = no - then - tmp_addflag=' $pic_flag' - tmp_sharedflag='-shared' - case $cc_basename,$host_cpu in - pgcc*) # Portland Group C compiler - _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' - tmp_addflag=' $pic_flag' - ;; - pgf77* | pgf90* | pgf95* | pgfortran*) - # Portland Group f77 and f90 compilers - _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' - tmp_addflag=' $pic_flag -Mnomain' ;; - ecc*,ia64* | icc*,ia64*) # Intel C compiler on ia64 - tmp_addflag=' -i_dynamic' ;; - efc*,ia64* | ifort*,ia64*) # Intel Fortran compiler on ia64 - tmp_addflag=' -i_dynamic -nofor_main' ;; - ifc* | ifort*) # Intel Fortran compiler - tmp_addflag=' -nofor_main' ;; - lf95*) # Lahey Fortran 8.1 - _LT_TAGVAR(whole_archive_flag_spec, $1)= - tmp_sharedflag='--shared' ;; - xl[[cC]]* | bgxl[[cC]]* | mpixl[[cC]]*) # IBM XL C 8.0 on PPC (deal with xlf below) - tmp_sharedflag='-qmkshrobj' - tmp_addflag= ;; - nvcc*) # Cuda Compiler Driver 2.2 - _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' - _LT_TAGVAR(compiler_needs_object, $1)=yes - ;; - esac - case `$CC -V 2>&1 | sed 5q` in - *Sun\ C*) # Sun C 5.9 - _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' - _LT_TAGVAR(compiler_needs_object, $1)=yes - tmp_sharedflag='-G' ;; - *Sun\ F*) # Sun Fortran 8.3 - tmp_sharedflag='-G' ;; - esac - _LT_TAGVAR(archive_cmds, $1)='$CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' - - if test "x$supports_anon_versioning" = xyes; then - _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $output_objdir/$libname.ver~ - cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ - echo "local: *; };" >> $output_objdir/$libname.ver~ - $CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib' - fi - - case $cc_basename in - xlf* | bgf* | bgxlf* | mpixlf*) - # IBM XL Fortran 10.1 on PPC cannot create shared libs itself - _LT_TAGVAR(whole_archive_flag_spec, $1)='--whole-archive$convenience --no-whole-archive' - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' - _LT_TAGVAR(archive_cmds, $1)='$LD -shared $libobjs $deplibs $linker_flags -soname $soname -o $lib' - if test "x$supports_anon_versioning" = xyes; then - _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $output_objdir/$libname.ver~ - cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ - echo "local: *; };" >> $output_objdir/$libname.ver~ - $LD -shared $libobjs $deplibs $linker_flags -soname $soname -version-script $output_objdir/$libname.ver -o $lib' - fi - ;; - esac - else - _LT_TAGVAR(ld_shlibs, $1)=no - fi - ;; - - netbsd* | netbsdelf*-gnu) - if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then - _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib' - wlarc= - else - _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' - _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' - fi - ;; - - solaris*) - if $LD -v 2>&1 | $GREP 'BFD 2\.8' > /dev/null; then - _LT_TAGVAR(ld_shlibs, $1)=no - cat <<_LT_EOF 1>&2 - -*** Warning: The releases 2.8.* of the GNU linker cannot reliably -*** create shared libraries on Solaris systems. Therefore, libtool -*** is disabling shared libraries support. We urge you to upgrade GNU -*** binutils to release 2.9.1 or newer. Another option is to modify -*** your PATH or compiler configuration so that the native linker is -*** used, and then restart. - -_LT_EOF - elif $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then - _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' - _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' - else - _LT_TAGVAR(ld_shlibs, $1)=no - fi - ;; - - sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*) - case `$LD -v 2>&1` in - *\ [[01]].* | *\ 2.[[0-9]].* | *\ 2.1[[0-5]].*) - _LT_TAGVAR(ld_shlibs, $1)=no - cat <<_LT_EOF 1>&2 - -*** Warning: Releases of the GNU linker prior to 2.16.91.0.3 can not -*** reliably create shared libraries on SCO systems. Therefore, libtool -*** is disabling shared libraries support. We urge you to upgrade GNU -*** binutils to release 2.16.91.0.3 or newer. Another option is to modify -*** your PATH or compiler configuration so that the native linker is -*** used, and then restart. - -_LT_EOF - ;; - *) - # For security reasons, it is highly recommended that you always - # use absolute paths for naming shared libraries, and exclude the - # DT_RUNPATH tag from executables and libraries. But doing so - # requires that you compile everything twice, which is a pain. - if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' - _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' - _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' - else - _LT_TAGVAR(ld_shlibs, $1)=no - fi - ;; - esac - ;; - - sunos4*) - _LT_TAGVAR(archive_cmds, $1)='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags' - wlarc= - _LT_TAGVAR(hardcode_direct, $1)=yes - _LT_TAGVAR(hardcode_shlibpath_var, $1)=no - ;; - - *) - if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then - _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' - _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' - else - _LT_TAGVAR(ld_shlibs, $1)=no - fi - ;; - esac - - if test "$_LT_TAGVAR(ld_shlibs, $1)" = no; then - runpath_var= - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)= - _LT_TAGVAR(export_dynamic_flag_spec, $1)= - _LT_TAGVAR(whole_archive_flag_spec, $1)= - fi - else - # PORTME fill in a description of your system's linker (not GNU ld) - case $host_os in - aix3*) - _LT_TAGVAR(allow_undefined_flag, $1)=unsupported - _LT_TAGVAR(always_export_symbols, $1)=yes - _LT_TAGVAR(archive_expsym_cmds, $1)='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname' - # Note: this linker hardcodes the directories in LIBPATH if there - # are no directories specified by -L. - _LT_TAGVAR(hardcode_minus_L, $1)=yes - if test "$GCC" = yes && test -z "$lt_prog_compiler_static"; then - # Neither direct hardcoding nor static linking is supported with a - # broken collect2. - _LT_TAGVAR(hardcode_direct, $1)=unsupported - fi - ;; - - aix[[4-9]]*) - if test "$host_cpu" = ia64; then - # On IA64, the linker does run time linking by default, so we don't - # have to do anything special. - aix_use_runtimelinking=no - exp_sym_flag='-Bexport' - no_entry_flag="" - else - # If we're using GNU nm, then we don't want the "-C" option. - # -C means demangle to AIX nm, but means don't demangle with GNU nm - # Also, AIX nm treats weak defined symbols like other global - # defined symbols, whereas GNU nm marks them as "W". - if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then - _LT_TAGVAR(export_symbols_cmds, $1)='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && ([substr](\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' - else - _LT_TAGVAR(export_symbols_cmds, $1)='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && ([substr](\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' - fi - aix_use_runtimelinking=no - - # Test if we are trying to use run time linking or normal - # AIX style linking. If -brtl is somewhere in LDFLAGS, we - # need to do runtime linking. - case $host_os in aix4.[[23]]|aix4.[[23]].*|aix[[5-9]]*) - for ld_flag in $LDFLAGS; do - if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then - aix_use_runtimelinking=yes - break - fi - done - ;; - esac - - exp_sym_flag='-bexport' - no_entry_flag='-bnoentry' - fi - - # When large executables or shared objects are built, AIX ld can - # have problems creating the table of contents. If linking a library - # or program results in "error TOC overflow" add -mminimal-toc to - # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not - # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. - - _LT_TAGVAR(archive_cmds, $1)='' - _LT_TAGVAR(hardcode_direct, $1)=yes - _LT_TAGVAR(hardcode_direct_absolute, $1)=yes - _LT_TAGVAR(hardcode_libdir_separator, $1)=':' - _LT_TAGVAR(link_all_deplibs, $1)=yes - _LT_TAGVAR(file_list_spec, $1)='${wl}-f,' - - if test "$GCC" = yes; then - case $host_os in aix4.[[012]]|aix4.[[012]].*) - # We only want to do this on AIX 4.2 and lower, the check - # below for broken collect2 doesn't work under 4.3+ - collect2name=`${CC} -print-prog-name=collect2` - if test -f "$collect2name" && - strings "$collect2name" | $GREP resolve_lib_name >/dev/null - then - # We have reworked collect2 - : - else - # We have old collect2 - _LT_TAGVAR(hardcode_direct, $1)=unsupported - # It fails to find uninstalled libraries when the uninstalled - # path is not listed in the libpath. Setting hardcode_minus_L - # to unsupported forces relinking - _LT_TAGVAR(hardcode_minus_L, $1)=yes - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' - _LT_TAGVAR(hardcode_libdir_separator, $1)= - fi - ;; - esac - shared_flag='-shared' - if test "$aix_use_runtimelinking" = yes; then - shared_flag="$shared_flag "'${wl}-G' - fi - _LT_TAGVAR(link_all_deplibs, $1)=no - else - # not using gcc - if test "$host_cpu" = ia64; then - # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release - # chokes on -Wl,-G. The following line is correct: - shared_flag='-G' - else - if test "$aix_use_runtimelinking" = yes; then - shared_flag='${wl}-G' - else - shared_flag='${wl}-bM:SRE' - fi - fi - fi - - _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-bexpall' - # It seems that -bexpall does not export symbols beginning with - # underscore (_), so it is better to generate a list of symbols to export. - _LT_TAGVAR(always_export_symbols, $1)=yes - if test "$aix_use_runtimelinking" = yes; then - # Warning - without using the other runtime loading flags (-brtl), - # -berok will link without error, but may produce a broken library. - _LT_TAGVAR(allow_undefined_flag, $1)='-berok' - # Determine the default libpath from the value encoded in an - # empty executable. - _LT_SYS_MODULE_PATH_AIX([$1]) - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath" - _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then func_echo_all "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag" - else - if test "$host_cpu" = ia64; then - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $libdir:/usr/lib:/lib' - _LT_TAGVAR(allow_undefined_flag, $1)="-z nodefs" - _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols" - else - # Determine the default libpath from the value encoded in an - # empty executable. - _LT_SYS_MODULE_PATH_AIX([$1]) - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath" - # Warning - without using the other run time loading flags, - # -berok will link without error, but may produce a broken library. - _LT_TAGVAR(no_undefined_flag, $1)=' ${wl}-bernotok' - _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-berok' - if test "$with_gnu_ld" = yes; then - # We only use this code for GNU lds that support --whole-archive. - _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive$convenience ${wl}--no-whole-archive' - else - # Exported symbols can be pulled into shared objects from archives - _LT_TAGVAR(whole_archive_flag_spec, $1)='$convenience' - fi - _LT_TAGVAR(archive_cmds_need_lc, $1)=yes - # This is similar to how AIX traditionally builds its shared libraries. - _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' - fi - fi - ;; - - amigaos*) - case $host_cpu in - powerpc) - # see comment about AmigaOS4 .so support - _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' - _LT_TAGVAR(archive_expsym_cmds, $1)='' - ;; - m68k) - _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' - _LT_TAGVAR(hardcode_minus_L, $1)=yes - ;; - esac - ;; - - bsdi[[45]]*) - _LT_TAGVAR(export_dynamic_flag_spec, $1)=-rdynamic - ;; - - cygwin* | mingw* | pw32* | cegcc*) - # When not using gcc, we currently assume that we are using - # Microsoft Visual C++. - # hardcode_libdir_flag_spec is actually meaningless, as there is - # no search path for DLLs. - case $cc_basename in - cl*) - # Native MSVC - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=' ' - _LT_TAGVAR(allow_undefined_flag, $1)=unsupported - _LT_TAGVAR(always_export_symbols, $1)=yes - _LT_TAGVAR(file_list_spec, $1)='@' - # Tell ltmain to make .lib files, not .a files. - libext=lib - # Tell ltmain to make .dll files, not .so files. - shrext_cmds=".dll" - # FIXME: Setting linknames here is a bad hack. - _LT_TAGVAR(archive_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-dll~linknames=' - _LT_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then - sed -n -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' -e '1\\\!p' < $export_symbols > $output_objdir/$soname.exp; - else - sed -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' < $export_symbols > $output_objdir/$soname.exp; - fi~ - $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~ - linknames=' - # The linker will not automatically build a static lib if we build a DLL. - # _LT_TAGVAR(old_archive_from_new_cmds, $1)='true' - _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes - _LT_TAGVAR(exclude_expsyms, $1)='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*' - _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\([[^ ]]*\)/\1,DATA/'\'' | $SED -e '\''/^[[AITW]][[ ]]/s/.*[[ ]]//'\'' | sort | uniq > $export_symbols' - # Don't use ranlib - _LT_TAGVAR(old_postinstall_cmds, $1)='chmod 644 $oldlib' - _LT_TAGVAR(postlink_cmds, $1)='lt_outputfile="@OUTPUT@"~ - lt_tool_outputfile="@TOOL_OUTPUT@"~ - case $lt_outputfile in - *.exe|*.EXE) ;; - *) - lt_outputfile="$lt_outputfile.exe" - lt_tool_outputfile="$lt_tool_outputfile.exe" - ;; - esac~ - if test "$MANIFEST_TOOL" != ":" && test -f "$lt_outputfile.manifest"; then - $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1; - $RM "$lt_outputfile.manifest"; - fi' - ;; - *) - # Assume MSVC wrapper - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=' ' - _LT_TAGVAR(allow_undefined_flag, $1)=unsupported - # Tell ltmain to make .lib files, not .a files. - libext=lib - # Tell ltmain to make .dll files, not .so files. - shrext_cmds=".dll" - # FIXME: Setting linknames here is a bad hack. - _LT_TAGVAR(archive_cmds, $1)='$CC -o $lib $libobjs $compiler_flags `func_echo_all "$deplibs" | $SED '\''s/ -lc$//'\''` -link -dll~linknames=' - # The linker will automatically build a .lib file if we build a DLL. - _LT_TAGVAR(old_archive_from_new_cmds, $1)='true' - # FIXME: Should let the user specify the lib program. - _LT_TAGVAR(old_archive_cmds, $1)='lib -OUT:$oldlib$oldobjs$old_deplibs' - _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes - ;; - esac - ;; - - darwin* | rhapsody*) - _LT_DARWIN_LINKER_FEATURES($1) - ;; - - dgux*) - _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' - _LT_TAGVAR(hardcode_shlibpath_var, $1)=no - ;; - - # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor - # support. Future versions do this automatically, but an explicit c++rt0.o - # does not break anything, and helps significantly (at the cost of a little - # extra space). - freebsd2.2*) - _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o' - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' - _LT_TAGVAR(hardcode_direct, $1)=yes - _LT_TAGVAR(hardcode_shlibpath_var, $1)=no - ;; - - # Unfortunately, older versions of FreeBSD 2 do not have this feature. - freebsd2.*) - _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' - _LT_TAGVAR(hardcode_direct, $1)=yes - _LT_TAGVAR(hardcode_minus_L, $1)=yes - _LT_TAGVAR(hardcode_shlibpath_var, $1)=no - ;; - - # FreeBSD 3 and greater uses gcc -shared to do shared libraries. - freebsd* | dragonfly*) - _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' - _LT_TAGVAR(hardcode_direct, $1)=yes - _LT_TAGVAR(hardcode_shlibpath_var, $1)=no - ;; - - hpux9*) - if test "$GCC" = yes; then - _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -shared $pic_flag ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' - else - _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' - fi - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' - _LT_TAGVAR(hardcode_libdir_separator, $1)=: - _LT_TAGVAR(hardcode_direct, $1)=yes - - # hardcode_minus_L: Not really in the search PATH, - # but as the default location of the library. - _LT_TAGVAR(hardcode_minus_L, $1)=yes - _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' - ;; - - hpux10*) - if test "$GCC" = yes && test "$with_gnu_ld" = no; then - _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' - else - _LT_TAGVAR(archive_cmds, $1)='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' - fi - if test "$with_gnu_ld" = no; then - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' - _LT_TAGVAR(hardcode_libdir_separator, $1)=: - _LT_TAGVAR(hardcode_direct, $1)=yes - _LT_TAGVAR(hardcode_direct_absolute, $1)=yes - _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' - # hardcode_minus_L: Not really in the search PATH, - # but as the default location of the library. - _LT_TAGVAR(hardcode_minus_L, $1)=yes - fi - ;; - - hpux11*) - if test "$GCC" = yes && test "$with_gnu_ld" = no; then - case $host_cpu in - hppa*64*) - _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' - ;; - ia64*) - _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' - ;; - *) - _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' - ;; - esac - else - case $host_cpu in - hppa*64*) - _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' - ;; - ia64*) - _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' - ;; - *) - m4_if($1, [], [ - # Older versions of the 11.00 compiler do not understand -b yet - # (HP92453-01 A.11.01.20 doesn't, HP92453-01 B.11.X.35175-35176.GP does) - _LT_LINKER_OPTION([if $CC understands -b], - _LT_TAGVAR(lt_cv_prog_compiler__b, $1), [-b], - [_LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'], - [_LT_TAGVAR(archive_cmds, $1)='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags'])], - [_LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags']) - ;; - esac - fi - if test "$with_gnu_ld" = no; then - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' - _LT_TAGVAR(hardcode_libdir_separator, $1)=: - - case $host_cpu in - hppa*64*|ia64*) - _LT_TAGVAR(hardcode_direct, $1)=no - _LT_TAGVAR(hardcode_shlibpath_var, $1)=no - ;; - *) - _LT_TAGVAR(hardcode_direct, $1)=yes - _LT_TAGVAR(hardcode_direct_absolute, $1)=yes - _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' - - # hardcode_minus_L: Not really in the search PATH, - # but as the default location of the library. - _LT_TAGVAR(hardcode_minus_L, $1)=yes - ;; - esac - fi - ;; - - irix5* | irix6* | nonstopux*) - if test "$GCC" = yes; then - _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' - # Try to use the -exported_symbol ld option, if it does not - # work, assume that -exports_file does not work either and - # implicitly export all symbols. - # This should be the same for all languages, so no per-tag cache variable. - AC_CACHE_CHECK([whether the $host_os linker accepts -exported_symbol], - [lt_cv_irix_exported_symbol], - [save_LDFLAGS="$LDFLAGS" - LDFLAGS="$LDFLAGS -shared ${wl}-exported_symbol ${wl}foo ${wl}-update_registry ${wl}/dev/null" - AC_LINK_IFELSE( - [AC_LANG_SOURCE( - [AC_LANG_CASE([C], [[int foo (void) { return 0; }]], - [C++], [[int foo (void) { return 0; }]], - [Fortran 77], [[ - subroutine foo - end]], - [Fortran], [[ - subroutine foo - end]])])], - [lt_cv_irix_exported_symbol=yes], - [lt_cv_irix_exported_symbol=no]) - LDFLAGS="$save_LDFLAGS"]) - if test "$lt_cv_irix_exported_symbol" = yes; then - _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations ${wl}-exports_file ${wl}$export_symbols -o $lib' - fi - else - _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' - _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -exports_file $export_symbols -o $lib' - fi - _LT_TAGVAR(archive_cmds_need_lc, $1)='no' - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' - _LT_TAGVAR(hardcode_libdir_separator, $1)=: - _LT_TAGVAR(inherit_rpath, $1)=yes - _LT_TAGVAR(link_all_deplibs, $1)=yes - ;; - - netbsd* | netbsdelf*-gnu) - if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then - _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' # a.out - else - _LT_TAGVAR(archive_cmds, $1)='$LD -shared -o $lib $libobjs $deplibs $linker_flags' # ELF - fi - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' - _LT_TAGVAR(hardcode_direct, $1)=yes - _LT_TAGVAR(hardcode_shlibpath_var, $1)=no - ;; - - newsos6) - _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' - _LT_TAGVAR(hardcode_direct, $1)=yes - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' - _LT_TAGVAR(hardcode_libdir_separator, $1)=: - _LT_TAGVAR(hardcode_shlibpath_var, $1)=no - ;; - - *nto* | *qnx*) - ;; - - openbsd*) - if test -f /usr/libexec/ld.so; then - _LT_TAGVAR(hardcode_direct, $1)=yes - _LT_TAGVAR(hardcode_shlibpath_var, $1)=no - _LT_TAGVAR(hardcode_direct_absolute, $1)=yes - if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then - _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' - _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-retain-symbols-file,$export_symbols' - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' - _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' - else - case $host_os in - openbsd[[01]].* | openbsd2.[[0-7]] | openbsd2.[[0-7]].*) - _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' - ;; - *) - _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' - ;; - esac - fi - else - _LT_TAGVAR(ld_shlibs, $1)=no - fi - ;; - - os2*) - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' - _LT_TAGVAR(hardcode_minus_L, $1)=yes - _LT_TAGVAR(allow_undefined_flag, $1)=unsupported - _LT_TAGVAR(archive_cmds, $1)='$ECHO "LIBRARY $libname INITINSTANCE" > $output_objdir/$libname.def~$ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~echo DATA >> $output_objdir/$libname.def~echo " SINGLE NONSHARED" >> $output_objdir/$libname.def~echo EXPORTS >> $output_objdir/$libname.def~emxexp $libobjs >> $output_objdir/$libname.def~$CC -Zdll -Zcrtdll -o $lib $libobjs $deplibs $compiler_flags $output_objdir/$libname.def' - _LT_TAGVAR(old_archive_from_new_cmds, $1)='emximp -o $output_objdir/$libname.a $output_objdir/$libname.def' - ;; - - osf3*) - if test "$GCC" = yes; then - _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' - _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' - else - _LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*' - _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' - fi - _LT_TAGVAR(archive_cmds_need_lc, $1)='no' - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' - _LT_TAGVAR(hardcode_libdir_separator, $1)=: - ;; - - osf4* | osf5*) # as osf3* with the addition of -msym flag - if test "$GCC" = yes; then - _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' - _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $pic_flag $libobjs $deplibs $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' - else - _LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*' - _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' - _LT_TAGVAR(archive_expsym_cmds, $1)='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; printf "%s\\n" "-hidden">> $lib.exp~ - $CC -shared${allow_undefined_flag} ${wl}-input ${wl}$lib.exp $compiler_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib~$RM $lib.exp' - - # Both c and cxx compiler support -rpath directly - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir' - fi - _LT_TAGVAR(archive_cmds_need_lc, $1)='no' - _LT_TAGVAR(hardcode_libdir_separator, $1)=: - ;; - - solaris*) - _LT_TAGVAR(no_undefined_flag, $1)=' -z defs' - if test "$GCC" = yes; then - wlarc='${wl}' - _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag ${wl}-z ${wl}text ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' - _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ - $CC -shared $pic_flag ${wl}-z ${wl}text ${wl}-M ${wl}$lib.exp ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' - else - case `$CC -V 2>&1` in - *"Compilers 5.0"*) - wlarc='' - _LT_TAGVAR(archive_cmds, $1)='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags' - _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ - $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$RM $lib.exp' - ;; - *) - wlarc='${wl}' - _LT_TAGVAR(archive_cmds, $1)='$CC -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $compiler_flags' - _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ - $CC -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' - ;; - esac - fi - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' - _LT_TAGVAR(hardcode_shlibpath_var, $1)=no - case $host_os in - solaris2.[[0-5]] | solaris2.[[0-5]].*) ;; - *) - # The compiler driver will combine and reorder linker options, - # but understands `-z linker_flag'. GCC discards it without `$wl', - # but is careful enough not to reorder. - # Supported since Solaris 2.6 (maybe 2.5.1?) - if test "$GCC" = yes; then - _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract' - else - _LT_TAGVAR(whole_archive_flag_spec, $1)='-z allextract$convenience -z defaultextract' - fi - ;; - esac - _LT_TAGVAR(link_all_deplibs, $1)=yes - ;; - - sunos4*) - if test "x$host_vendor" = xsequent; then - # Use $CC to link under sequent, because it throws in some extra .o - # files that make .init and .fini sections work. - _LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h $soname -o $lib $libobjs $deplibs $compiler_flags' - else - _LT_TAGVAR(archive_cmds, $1)='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags' - fi - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' - _LT_TAGVAR(hardcode_direct, $1)=yes - _LT_TAGVAR(hardcode_minus_L, $1)=yes - _LT_TAGVAR(hardcode_shlibpath_var, $1)=no - ;; - - sysv4) - case $host_vendor in - sni) - _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' - _LT_TAGVAR(hardcode_direct, $1)=yes # is this really true??? - ;; - siemens) - ## LD is ld it makes a PLAMLIB - ## CC just makes a GrossModule. - _LT_TAGVAR(archive_cmds, $1)='$LD -G -o $lib $libobjs $deplibs $linker_flags' - _LT_TAGVAR(reload_cmds, $1)='$CC -r -o $output$reload_objs' - _LT_TAGVAR(hardcode_direct, $1)=no - ;; - motorola) - _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' - _LT_TAGVAR(hardcode_direct, $1)=no #Motorola manual says yes, but my tests say they lie - ;; - esac - runpath_var='LD_RUN_PATH' - _LT_TAGVAR(hardcode_shlibpath_var, $1)=no - ;; - - sysv4.3*) - _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' - _LT_TAGVAR(hardcode_shlibpath_var, $1)=no - _LT_TAGVAR(export_dynamic_flag_spec, $1)='-Bexport' - ;; - - sysv4*MP*) - if test -d /usr/nec; then - _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' - _LT_TAGVAR(hardcode_shlibpath_var, $1)=no - runpath_var=LD_RUN_PATH - hardcode_runpath_var=yes - _LT_TAGVAR(ld_shlibs, $1)=yes - fi - ;; - - sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[[01]].[[10]]* | unixware7* | sco3.2v5.0.[[024]]*) - _LT_TAGVAR(no_undefined_flag, $1)='${wl}-z,text' - _LT_TAGVAR(archive_cmds_need_lc, $1)=no - _LT_TAGVAR(hardcode_shlibpath_var, $1)=no - runpath_var='LD_RUN_PATH' - - if test "$GCC" = yes; then - _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' - _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' - else - _LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' - _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' - fi - ;; - - sysv5* | sco3.2v5* | sco5v6*) - # Note: We can NOT use -z defs as we might desire, because we do not - # link with -lc, and that would cause any symbols used from libc to - # always be unresolved, which means just about no library would - # ever link correctly. If we're not using GNU ld we use -z text - # though, which does catch some bad symbols but isn't as heavy-handed - # as -z defs. - _LT_TAGVAR(no_undefined_flag, $1)='${wl}-z,text' - _LT_TAGVAR(allow_undefined_flag, $1)='${wl}-z,nodefs' - _LT_TAGVAR(archive_cmds_need_lc, $1)=no - _LT_TAGVAR(hardcode_shlibpath_var, $1)=no - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R,$libdir' - _LT_TAGVAR(hardcode_libdir_separator, $1)=':' - _LT_TAGVAR(link_all_deplibs, $1)=yes - _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-Bexport' - runpath_var='LD_RUN_PATH' - - if test "$GCC" = yes; then - _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' - _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' - else - _LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' - _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' - fi - ;; - - uts4*) - _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' - _LT_TAGVAR(hardcode_shlibpath_var, $1)=no - ;; - - *) - _LT_TAGVAR(ld_shlibs, $1)=no - ;; - esac - - if test x$host_vendor = xsni; then - case $host in - sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) - _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-Blargedynsym' - ;; - esac - fi - fi -]) -AC_MSG_RESULT([$_LT_TAGVAR(ld_shlibs, $1)]) -test "$_LT_TAGVAR(ld_shlibs, $1)" = no && can_build_shared=no - -_LT_TAGVAR(with_gnu_ld, $1)=$with_gnu_ld - -_LT_DECL([], [libext], [0], [Old archive suffix (normally "a")])dnl -_LT_DECL([], [shrext_cmds], [1], [Shared library suffix (normally ".so")])dnl -_LT_DECL([], [extract_expsyms_cmds], [2], - [The commands to extract the exported symbol list from a shared archive]) - -# -# Do we need to explicitly link libc? -# -case "x$_LT_TAGVAR(archive_cmds_need_lc, $1)" in -x|xyes) - # Assume -lc should be added - _LT_TAGVAR(archive_cmds_need_lc, $1)=yes - - if test "$enable_shared" = yes && test "$GCC" = yes; then - case $_LT_TAGVAR(archive_cmds, $1) in - *'~'*) - # FIXME: we may have to deal with multi-command sequences. - ;; - '$CC '*) - # Test whether the compiler implicitly links with -lc since on some - # systems, -lgcc has to come before -lc. If gcc already passes -lc - # to ld, don't add -lc before -lgcc. - AC_CACHE_CHECK([whether -lc should be explicitly linked in], - [lt_cv_]_LT_TAGVAR(archive_cmds_need_lc, $1), - [$RM conftest* - echo "$lt_simple_compile_test_code" > conftest.$ac_ext - - if AC_TRY_EVAL(ac_compile) 2>conftest.err; then - soname=conftest - lib=conftest - libobjs=conftest.$ac_objext - deplibs= - wl=$_LT_TAGVAR(lt_prog_compiler_wl, $1) - pic_flag=$_LT_TAGVAR(lt_prog_compiler_pic, $1) - compiler_flags=-v - linker_flags=-v - verstring= - output_objdir=. - libname=conftest - lt_save_allow_undefined_flag=$_LT_TAGVAR(allow_undefined_flag, $1) - _LT_TAGVAR(allow_undefined_flag, $1)= - if AC_TRY_EVAL(_LT_TAGVAR(archive_cmds, $1) 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1) - then - lt_cv_[]_LT_TAGVAR(archive_cmds_need_lc, $1)=no - else - lt_cv_[]_LT_TAGVAR(archive_cmds_need_lc, $1)=yes - fi - _LT_TAGVAR(allow_undefined_flag, $1)=$lt_save_allow_undefined_flag - else - cat conftest.err 1>&5 - fi - $RM conftest* - ]) - _LT_TAGVAR(archive_cmds_need_lc, $1)=$lt_cv_[]_LT_TAGVAR(archive_cmds_need_lc, $1) - ;; - esac - fi - ;; -esac - -_LT_TAGDECL([build_libtool_need_lc], [archive_cmds_need_lc], [0], - [Whether or not to add -lc for building shared libraries]) -_LT_TAGDECL([allow_libtool_libs_with_static_runtimes], - [enable_shared_with_static_runtimes], [0], - [Whether or not to disallow shared libs when runtime libs are static]) -_LT_TAGDECL([], [export_dynamic_flag_spec], [1], - [Compiler flag to allow reflexive dlopens]) -_LT_TAGDECL([], [whole_archive_flag_spec], [1], - [Compiler flag to generate shared objects directly from archives]) -_LT_TAGDECL([], [compiler_needs_object], [1], - [Whether the compiler copes with passing no objects directly]) -_LT_TAGDECL([], [old_archive_from_new_cmds], [2], - [Create an old-style archive from a shared archive]) -_LT_TAGDECL([], [old_archive_from_expsyms_cmds], [2], - [Create a temporary old-style archive to link instead of a shared archive]) -_LT_TAGDECL([], [archive_cmds], [2], [Commands used to build a shared archive]) -_LT_TAGDECL([], [archive_expsym_cmds], [2]) -_LT_TAGDECL([], [module_cmds], [2], - [Commands used to build a loadable module if different from building - a shared archive.]) -_LT_TAGDECL([], [module_expsym_cmds], [2]) -_LT_TAGDECL([], [with_gnu_ld], [1], - [Whether we are building with GNU ld or not]) -_LT_TAGDECL([], [allow_undefined_flag], [1], - [Flag that allows shared libraries with undefined symbols to be built]) -_LT_TAGDECL([], [no_undefined_flag], [1], - [Flag that enforces no undefined symbols]) -_LT_TAGDECL([], [hardcode_libdir_flag_spec], [1], - [Flag to hardcode $libdir into a binary during linking. - This must work even if $libdir does not exist]) -_LT_TAGDECL([], [hardcode_libdir_separator], [1], - [Whether we need a single "-rpath" flag with a separated argument]) -_LT_TAGDECL([], [hardcode_direct], [0], - [Set to "yes" if using DIR/libNAME${shared_ext} during linking hardcodes - DIR into the resulting binary]) -_LT_TAGDECL([], [hardcode_direct_absolute], [0], - [Set to "yes" if using DIR/libNAME${shared_ext} during linking hardcodes - DIR into the resulting binary and the resulting library dependency is - "absolute", i.e impossible to change by setting ${shlibpath_var} if the - library is relocated]) -_LT_TAGDECL([], [hardcode_minus_L], [0], - [Set to "yes" if using the -LDIR flag during linking hardcodes DIR - into the resulting binary]) -_LT_TAGDECL([], [hardcode_shlibpath_var], [0], - [Set to "yes" if using SHLIBPATH_VAR=DIR during linking hardcodes DIR - into the resulting binary]) -_LT_TAGDECL([], [hardcode_automatic], [0], - [Set to "yes" if building a shared library automatically hardcodes DIR - into the library and all subsequent libraries and executables linked - against it]) -_LT_TAGDECL([], [inherit_rpath], [0], - [Set to yes if linker adds runtime paths of dependent libraries - to runtime path list]) -_LT_TAGDECL([], [link_all_deplibs], [0], - [Whether libtool must link a program against all its dependency libraries]) -_LT_TAGDECL([], [always_export_symbols], [0], - [Set to "yes" if exported symbols are required]) -_LT_TAGDECL([], [export_symbols_cmds], [2], - [The commands to list exported symbols]) -_LT_TAGDECL([], [exclude_expsyms], [1], - [Symbols that should not be listed in the preloaded symbols]) -_LT_TAGDECL([], [include_expsyms], [1], - [Symbols that must always be exported]) -_LT_TAGDECL([], [prelink_cmds], [2], - [Commands necessary for linking programs (against libraries) with templates]) -_LT_TAGDECL([], [postlink_cmds], [2], - [Commands necessary for finishing linking programs]) -_LT_TAGDECL([], [file_list_spec], [1], - [Specify filename containing input files]) -dnl FIXME: Not yet implemented -dnl _LT_TAGDECL([], [thread_safe_flag_spec], [1], -dnl [Compiler flag to generate thread safe objects]) -])# _LT_LINKER_SHLIBS - - -# _LT_LANG_C_CONFIG([TAG]) -# ------------------------ -# Ensure that the configuration variables for a C compiler are suitably -# defined. These variables are subsequently used by _LT_CONFIG to write -# the compiler configuration to `libtool'. -m4_defun([_LT_LANG_C_CONFIG], -[m4_require([_LT_DECL_EGREP])dnl -lt_save_CC="$CC" -AC_LANG_PUSH(C) - -# Source file extension for C test sources. -ac_ext=c - -# Object file extension for compiled C test sources. -objext=o -_LT_TAGVAR(objext, $1)=$objext - -# Code to be used in simple compile tests -lt_simple_compile_test_code="int some_variable = 0;" - -# Code to be used in simple link tests -lt_simple_link_test_code='int main(){return(0);}' - -_LT_TAG_COMPILER -# Save the default compiler, since it gets overwritten when the other -# tags are being tested, and _LT_TAGVAR(compiler, []) is a NOP. -compiler_DEFAULT=$CC - -# save warnings/boilerplate of simple test code -_LT_COMPILER_BOILERPLATE -_LT_LINKER_BOILERPLATE - -if test -n "$compiler"; then - _LT_COMPILER_NO_RTTI($1) - _LT_COMPILER_PIC($1) - _LT_COMPILER_C_O($1) - _LT_COMPILER_FILE_LOCKS($1) - _LT_LINKER_SHLIBS($1) - _LT_SYS_DYNAMIC_LINKER($1) - _LT_LINKER_HARDCODE_LIBPATH($1) - LT_SYS_DLOPEN_SELF - _LT_CMD_STRIPLIB - - # Report which library types will actually be built - AC_MSG_CHECKING([if libtool supports shared libraries]) - AC_MSG_RESULT([$can_build_shared]) - - AC_MSG_CHECKING([whether to build shared libraries]) - test "$can_build_shared" = "no" && enable_shared=no - - # On AIX, shared libraries and static libraries use the same namespace, and - # are all built from PIC. - case $host_os in - aix3*) - test "$enable_shared" = yes && enable_static=no - if test -n "$RANLIB"; then - archive_cmds="$archive_cmds~\$RANLIB \$lib" - postinstall_cmds='$RANLIB $lib' - fi - ;; - - aix[[4-9]]*) - if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then - test "$enable_shared" = yes && enable_static=no - fi - ;; - esac - AC_MSG_RESULT([$enable_shared]) - - AC_MSG_CHECKING([whether to build static libraries]) - # Make sure either enable_shared or enable_static is yes. - test "$enable_shared" = yes || enable_static=yes - AC_MSG_RESULT([$enable_static]) - - _LT_CONFIG($1) -fi -AC_LANG_POP -CC="$lt_save_CC" -])# _LT_LANG_C_CONFIG - - -# _LT_LANG_CXX_CONFIG([TAG]) -# -------------------------- -# Ensure that the configuration variables for a C++ compiler are suitably -# defined. These variables are subsequently used by _LT_CONFIG to write -# the compiler configuration to `libtool'. -m4_defun([_LT_LANG_CXX_CONFIG], -[m4_require([_LT_FILEUTILS_DEFAULTS])dnl -m4_require([_LT_DECL_EGREP])dnl -m4_require([_LT_PATH_MANIFEST_TOOL])dnl -if test -n "$CXX" && ( test "X$CXX" != "Xno" && - ( (test "X$CXX" = "Xg++" && `g++ -v >/dev/null 2>&1` ) || - (test "X$CXX" != "Xg++"))) ; then - AC_PROG_CXXCPP -else - _lt_caught_CXX_error=yes -fi - -AC_LANG_PUSH(C++) -_LT_TAGVAR(archive_cmds_need_lc, $1)=no -_LT_TAGVAR(allow_undefined_flag, $1)= -_LT_TAGVAR(always_export_symbols, $1)=no -_LT_TAGVAR(archive_expsym_cmds, $1)= -_LT_TAGVAR(compiler_needs_object, $1)=no -_LT_TAGVAR(export_dynamic_flag_spec, $1)= -_LT_TAGVAR(hardcode_direct, $1)=no -_LT_TAGVAR(hardcode_direct_absolute, $1)=no -_LT_TAGVAR(hardcode_libdir_flag_spec, $1)= -_LT_TAGVAR(hardcode_libdir_separator, $1)= -_LT_TAGVAR(hardcode_minus_L, $1)=no -_LT_TAGVAR(hardcode_shlibpath_var, $1)=unsupported -_LT_TAGVAR(hardcode_automatic, $1)=no -_LT_TAGVAR(inherit_rpath, $1)=no -_LT_TAGVAR(module_cmds, $1)= -_LT_TAGVAR(module_expsym_cmds, $1)= -_LT_TAGVAR(link_all_deplibs, $1)=unknown -_LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds -_LT_TAGVAR(reload_flag, $1)=$reload_flag -_LT_TAGVAR(reload_cmds, $1)=$reload_cmds -_LT_TAGVAR(no_undefined_flag, $1)= -_LT_TAGVAR(whole_archive_flag_spec, $1)= -_LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no - -# Source file extension for C++ test sources. -ac_ext=cpp - -# Object file extension for compiled C++ test sources. -objext=o -_LT_TAGVAR(objext, $1)=$objext - -# No sense in running all these tests if we already determined that -# the CXX compiler isn't working. Some variables (like enable_shared) -# are currently assumed to apply to all compilers on this platform, -# and will be corrupted by setting them based on a non-working compiler. -if test "$_lt_caught_CXX_error" != yes; then - # Code to be used in simple compile tests - lt_simple_compile_test_code="int some_variable = 0;" - - # Code to be used in simple link tests - lt_simple_link_test_code='int main(int, char *[[]]) { return(0); }' - - # ltmain only uses $CC for tagged configurations so make sure $CC is set. - _LT_TAG_COMPILER - - # save warnings/boilerplate of simple test code - _LT_COMPILER_BOILERPLATE - _LT_LINKER_BOILERPLATE - - # Allow CC to be a program name with arguments. - lt_save_CC=$CC - lt_save_CFLAGS=$CFLAGS - lt_save_LD=$LD - lt_save_GCC=$GCC - GCC=$GXX - lt_save_with_gnu_ld=$with_gnu_ld - lt_save_path_LD=$lt_cv_path_LD - if test -n "${lt_cv_prog_gnu_ldcxx+set}"; then - lt_cv_prog_gnu_ld=$lt_cv_prog_gnu_ldcxx - else - $as_unset lt_cv_prog_gnu_ld - fi - if test -n "${lt_cv_path_LDCXX+set}"; then - lt_cv_path_LD=$lt_cv_path_LDCXX - else - $as_unset lt_cv_path_LD - fi - test -z "${LDCXX+set}" || LD=$LDCXX - CC=${CXX-"c++"} - CFLAGS=$CXXFLAGS - compiler=$CC - _LT_TAGVAR(compiler, $1)=$CC - _LT_CC_BASENAME([$compiler]) - - if test -n "$compiler"; then - # We don't want -fno-exception when compiling C++ code, so set the - # no_builtin_flag separately - if test "$GXX" = yes; then - _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -fno-builtin' - else - _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)= - fi - - if test "$GXX" = yes; then - # Set up default GNU C++ configuration - - LT_PATH_LD - - # Check if GNU C++ uses GNU ld as the underlying linker, since the - # archiving commands below assume that GNU ld is being used. - if test "$with_gnu_ld" = yes; then - _LT_TAGVAR(archive_cmds, $1)='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' - _LT_TAGVAR(archive_expsym_cmds, $1)='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' - - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' - _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' - - # If archive_cmds runs LD, not CC, wlarc should be empty - # XXX I think wlarc can be eliminated in ltcf-cxx, but I need to - # investigate it a little bit more. (MM) - wlarc='${wl}' - - # ancient GNU ld didn't support --whole-archive et. al. - if eval "`$CC -print-prog-name=ld` --help 2>&1" | - $GREP 'no-whole-archive' > /dev/null; then - _LT_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' - else - _LT_TAGVAR(whole_archive_flag_spec, $1)= - fi - else - with_gnu_ld=no - wlarc= - - # A generic and very simple default shared library creation - # command for GNU C++ for the case where it uses the native - # linker, instead of GNU ld. If possible, this setting should - # overridden to take advantage of the native linker features on - # the platform it is being used on. - _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib' - fi - - # Commands to make compiler produce verbose output that lists - # what "hidden" libraries, object files and flags are used when - # linking a shared library. - output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' - - else - GXX=no - with_gnu_ld=no - wlarc= - fi - - # PORTME: fill in a description of your system's C++ link characteristics - AC_MSG_CHECKING([whether the $compiler linker ($LD) supports shared libraries]) - _LT_TAGVAR(ld_shlibs, $1)=yes - case $host_os in - aix3*) - # FIXME: insert proper C++ library support - _LT_TAGVAR(ld_shlibs, $1)=no - ;; - aix[[4-9]]*) - if test "$host_cpu" = ia64; then - # On IA64, the linker does run time linking by default, so we don't - # have to do anything special. - aix_use_runtimelinking=no - exp_sym_flag='-Bexport' - no_entry_flag="" - else - aix_use_runtimelinking=no - - # Test if we are trying to use run time linking or normal - # AIX style linking. If -brtl is somewhere in LDFLAGS, we - # need to do runtime linking. - case $host_os in aix4.[[23]]|aix4.[[23]].*|aix[[5-9]]*) - for ld_flag in $LDFLAGS; do - case $ld_flag in - *-brtl*) - aix_use_runtimelinking=yes - break - ;; - esac - done - ;; - esac - - exp_sym_flag='-bexport' - no_entry_flag='-bnoentry' - fi - - # When large executables or shared objects are built, AIX ld can - # have problems creating the table of contents. If linking a library - # or program results in "error TOC overflow" add -mminimal-toc to - # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not - # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. - - _LT_TAGVAR(archive_cmds, $1)='' - _LT_TAGVAR(hardcode_direct, $1)=yes - _LT_TAGVAR(hardcode_direct_absolute, $1)=yes - _LT_TAGVAR(hardcode_libdir_separator, $1)=':' - _LT_TAGVAR(link_all_deplibs, $1)=yes - _LT_TAGVAR(file_list_spec, $1)='${wl}-f,' - - if test "$GXX" = yes; then - case $host_os in aix4.[[012]]|aix4.[[012]].*) - # We only want to do this on AIX 4.2 and lower, the check - # below for broken collect2 doesn't work under 4.3+ - collect2name=`${CC} -print-prog-name=collect2` - if test -f "$collect2name" && - strings "$collect2name" | $GREP resolve_lib_name >/dev/null - then - # We have reworked collect2 - : - else - # We have old collect2 - _LT_TAGVAR(hardcode_direct, $1)=unsupported - # It fails to find uninstalled libraries when the uninstalled - # path is not listed in the libpath. Setting hardcode_minus_L - # to unsupported forces relinking - _LT_TAGVAR(hardcode_minus_L, $1)=yes - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' - _LT_TAGVAR(hardcode_libdir_separator, $1)= - fi - esac - shared_flag='-shared' - if test "$aix_use_runtimelinking" = yes; then - shared_flag="$shared_flag "'${wl}-G' - fi - else - # not using gcc - if test "$host_cpu" = ia64; then - # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release - # chokes on -Wl,-G. The following line is correct: - shared_flag='-G' - else - if test "$aix_use_runtimelinking" = yes; then - shared_flag='${wl}-G' - else - shared_flag='${wl}-bM:SRE' - fi - fi - fi - - _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-bexpall' - # It seems that -bexpall does not export symbols beginning with - # underscore (_), so it is better to generate a list of symbols to - # export. - _LT_TAGVAR(always_export_symbols, $1)=yes - if test "$aix_use_runtimelinking" = yes; then - # Warning - without using the other runtime loading flags (-brtl), - # -berok will link without error, but may produce a broken library. - _LT_TAGVAR(allow_undefined_flag, $1)='-berok' - # Determine the default libpath from the value encoded in an empty - # executable. - _LT_SYS_MODULE_PATH_AIX([$1]) - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath" - - _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then func_echo_all "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag" - else - if test "$host_cpu" = ia64; then - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $libdir:/usr/lib:/lib' - _LT_TAGVAR(allow_undefined_flag, $1)="-z nodefs" - _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols" - else - # Determine the default libpath from the value encoded in an - # empty executable. - _LT_SYS_MODULE_PATH_AIX([$1]) - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath" - # Warning - without using the other run time loading flags, - # -berok will link without error, but may produce a broken library. - _LT_TAGVAR(no_undefined_flag, $1)=' ${wl}-bernotok' - _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-berok' - if test "$with_gnu_ld" = yes; then - # We only use this code for GNU lds that support --whole-archive. - _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive$convenience ${wl}--no-whole-archive' - else - # Exported symbols can be pulled into shared objects from archives - _LT_TAGVAR(whole_archive_flag_spec, $1)='$convenience' - fi - _LT_TAGVAR(archive_cmds_need_lc, $1)=yes - # This is similar to how AIX traditionally builds its shared - # libraries. - _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' - fi - fi - ;; - - beos*) - if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then - _LT_TAGVAR(allow_undefined_flag, $1)=unsupported - # Joseph Beckenbach says some releases of gcc - # support --undefined. This deserves some investigation. FIXME - _LT_TAGVAR(archive_cmds, $1)='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' - else - _LT_TAGVAR(ld_shlibs, $1)=no - fi - ;; - - chorus*) - case $cc_basename in - *) - # FIXME: insert proper C++ library support - _LT_TAGVAR(ld_shlibs, $1)=no - ;; - esac - ;; - - cygwin* | mingw* | pw32* | cegcc*) - case $GXX,$cc_basename in - ,cl* | no,cl*) - # Native MSVC - # hardcode_libdir_flag_spec is actually meaningless, as there is - # no search path for DLLs. - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=' ' - _LT_TAGVAR(allow_undefined_flag, $1)=unsupported - _LT_TAGVAR(always_export_symbols, $1)=yes - _LT_TAGVAR(file_list_spec, $1)='@' - # Tell ltmain to make .lib files, not .a files. - libext=lib - # Tell ltmain to make .dll files, not .so files. - shrext_cmds=".dll" - # FIXME: Setting linknames here is a bad hack. - _LT_TAGVAR(archive_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-dll~linknames=' - _LT_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then - $SED -n -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' -e '1\\\!p' < $export_symbols > $output_objdir/$soname.exp; - else - $SED -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' < $export_symbols > $output_objdir/$soname.exp; - fi~ - $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~ - linknames=' - # The linker will not automatically build a static lib if we build a DLL. - # _LT_TAGVAR(old_archive_from_new_cmds, $1)='true' - _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes - # Don't use ranlib - _LT_TAGVAR(old_postinstall_cmds, $1)='chmod 644 $oldlib' - _LT_TAGVAR(postlink_cmds, $1)='lt_outputfile="@OUTPUT@"~ - lt_tool_outputfile="@TOOL_OUTPUT@"~ - case $lt_outputfile in - *.exe|*.EXE) ;; - *) - lt_outputfile="$lt_outputfile.exe" - lt_tool_outputfile="$lt_tool_outputfile.exe" - ;; - esac~ - func_to_tool_file "$lt_outputfile"~ - if test "$MANIFEST_TOOL" != ":" && test -f "$lt_outputfile.manifest"; then - $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1; - $RM "$lt_outputfile.manifest"; - fi' - ;; - *) - # g++ - # _LT_TAGVAR(hardcode_libdir_flag_spec, $1) is actually meaningless, - # as there is no search path for DLLs. - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' - _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-all-symbols' - _LT_TAGVAR(allow_undefined_flag, $1)=unsupported - _LT_TAGVAR(always_export_symbols, $1)=no - _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes - - if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then - _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' - # If the export-symbols file already is a .def file (1st line - # is EXPORTS), use it as is; otherwise, prepend... - _LT_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then - cp $export_symbols $output_objdir/$soname.def; - else - echo EXPORTS > $output_objdir/$soname.def; - cat $export_symbols >> $output_objdir/$soname.def; - fi~ - $CC -shared -nostdlib $output_objdir/$soname.def $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' - else - _LT_TAGVAR(ld_shlibs, $1)=no - fi - ;; - esac - ;; - darwin* | rhapsody*) - _LT_DARWIN_LINKER_FEATURES($1) - ;; - - dgux*) - case $cc_basename in - ec++*) - # FIXME: insert proper C++ library support - _LT_TAGVAR(ld_shlibs, $1)=no - ;; - ghcx*) - # Green Hills C++ Compiler - # FIXME: insert proper C++ library support - _LT_TAGVAR(ld_shlibs, $1)=no - ;; - *) - # FIXME: insert proper C++ library support - _LT_TAGVAR(ld_shlibs, $1)=no - ;; - esac - ;; - - freebsd2.*) - # C++ shared libraries reported to be fairly broken before - # switch to ELF - _LT_TAGVAR(ld_shlibs, $1)=no - ;; - - freebsd-elf*) - _LT_TAGVAR(archive_cmds_need_lc, $1)=no - ;; - - freebsd* | dragonfly*) - # FreeBSD 3 and later use GNU C++ and GNU ld with standard ELF - # conventions - _LT_TAGVAR(ld_shlibs, $1)=yes - ;; - - gnu*) - ;; - - haiku*) - _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' - _LT_TAGVAR(link_all_deplibs, $1)=yes - ;; - - hpux9*) - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' - _LT_TAGVAR(hardcode_libdir_separator, $1)=: - _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' - _LT_TAGVAR(hardcode_direct, $1)=yes - _LT_TAGVAR(hardcode_minus_L, $1)=yes # Not in the search PATH, - # but as the default - # location of the library. - - case $cc_basename in - CC*) - # FIXME: insert proper C++ library support - _LT_TAGVAR(ld_shlibs, $1)=no - ;; - aCC*) - _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -b ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' - # Commands to make compiler produce verbose output that lists - # what "hidden" libraries, object files and flags are used when - # linking a shared library. - # - # There doesn't appear to be a way to prevent this compiler from - # explicitly linking system object files so we need to strip them - # from the output so that they don't get included in the library - # dependencies. - output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $EGREP "\-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' - ;; - *) - if test "$GXX" = yes; then - _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -shared -nostdlib $pic_flag ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' - else - # FIXME: insert proper C++ library support - _LT_TAGVAR(ld_shlibs, $1)=no - fi - ;; - esac - ;; - - hpux10*|hpux11*) - if test $with_gnu_ld = no; then - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' - _LT_TAGVAR(hardcode_libdir_separator, $1)=: - - case $host_cpu in - hppa*64*|ia64*) - ;; - *) - _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' - ;; - esac - fi - case $host_cpu in - hppa*64*|ia64*) - _LT_TAGVAR(hardcode_direct, $1)=no - _LT_TAGVAR(hardcode_shlibpath_var, $1)=no - ;; - *) - _LT_TAGVAR(hardcode_direct, $1)=yes - _LT_TAGVAR(hardcode_direct_absolute, $1)=yes - _LT_TAGVAR(hardcode_minus_L, $1)=yes # Not in the search PATH, - # but as the default - # location of the library. - ;; - esac - - case $cc_basename in - CC*) - # FIXME: insert proper C++ library support - _LT_TAGVAR(ld_shlibs, $1)=no - ;; - aCC*) - case $host_cpu in - hppa*64*) - _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' - ;; - ia64*) - _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' - ;; - *) - _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' - ;; - esac - # Commands to make compiler produce verbose output that lists - # what "hidden" libraries, object files and flags are used when - # linking a shared library. - # - # There doesn't appear to be a way to prevent this compiler from - # explicitly linking system object files so we need to strip them - # from the output so that they don't get included in the library - # dependencies. - output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $GREP "\-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' - ;; - *) - if test "$GXX" = yes; then - if test $with_gnu_ld = no; then - case $host_cpu in - hppa*64*) - _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' - ;; - ia64*) - _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $pic_flag ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' - ;; - *) - _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' - ;; - esac - fi - else - # FIXME: insert proper C++ library support - _LT_TAGVAR(ld_shlibs, $1)=no - fi - ;; - esac - ;; - - interix[[3-9]]*) - _LT_TAGVAR(hardcode_direct, $1)=no - _LT_TAGVAR(hardcode_shlibpath_var, $1)=no - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' - _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' - # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. - # Instead, shared libraries are loaded at an image base (0x10000000 by - # default) and relocated if they conflict, which is a slow very memory - # consuming and fragmenting process. To avoid this, we pick a random, - # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link - # time. Moving up from 0x10000000 also allows more sbrk(2) space. - _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' - _LT_TAGVAR(archive_expsym_cmds, $1)='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' - ;; - irix5* | irix6*) - case $cc_basename in - CC*) - # SGI C++ - _LT_TAGVAR(archive_cmds, $1)='$CC -shared -all -multigot $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' - - # Archives containing C++ object files must be created using - # "CC -ar", where "CC" is the IRIX C++ compiler. This is - # necessary to make sure instantiated templates are included - # in the archive. - _LT_TAGVAR(old_archive_cmds, $1)='$CC -ar -WR,-u -o $oldlib $oldobjs' - ;; - *) - if test "$GXX" = yes; then - if test "$with_gnu_ld" = no; then - _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' - else - _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` -o $lib' - fi - fi - _LT_TAGVAR(link_all_deplibs, $1)=yes - ;; - esac - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' - _LT_TAGVAR(hardcode_libdir_separator, $1)=: - _LT_TAGVAR(inherit_rpath, $1)=yes - ;; - - linux* | k*bsd*-gnu | kopensolaris*-gnu) - case $cc_basename in - KCC*) - # Kuck and Associates, Inc. (KAI) C++ Compiler - - # KCC will only create a shared library if the output file - # ends with ".so" (or ".sl" for HP-UX), so rename the library - # to its proper name (with version) after linking. - _LT_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' - _LT_TAGVAR(archive_expsym_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib ${wl}-retain-symbols-file,$export_symbols; mv \$templib $lib' - # Commands to make compiler produce verbose output that lists - # what "hidden" libraries, object files and flags are used when - # linking a shared library. - # - # There doesn't appear to be a way to prevent this compiler from - # explicitly linking system object files so we need to strip them - # from the output so that they don't get included in the library - # dependencies. - output_verbose_link_cmd='templist=`$CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 | $GREP "ld"`; rm -f libconftest$shared_ext; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' - - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' - _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' - - # Archives containing C++ object files must be created using - # "CC -Bstatic", where "CC" is the KAI C++ compiler. - _LT_TAGVAR(old_archive_cmds, $1)='$CC -Bstatic -o $oldlib $oldobjs' - ;; - icpc* | ecpc* ) - # Intel C++ - with_gnu_ld=yes - # version 8.0 and above of icpc choke on multiply defined symbols - # if we add $predep_objects and $postdep_objects, however 7.1 and - # earlier do not add the objects themselves. - case `$CC -V 2>&1` in - *"Version 7."*) - _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' - _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' - ;; - *) # Version 8.0 or newer - tmp_idyn= - case $host_cpu in - ia64*) tmp_idyn=' -i_dynamic';; - esac - _LT_TAGVAR(archive_cmds, $1)='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' - _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' - ;; - esac - _LT_TAGVAR(archive_cmds_need_lc, $1)=no - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' - _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' - _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive$convenience ${wl}--no-whole-archive' - ;; - pgCC* | pgcpp*) - # Portland Group C++ compiler - case `$CC -V` in - *pgCC\ [[1-5]].* | *pgcpp\ [[1-5]].*) - _LT_TAGVAR(prelink_cmds, $1)='tpldir=Template.dir~ - rm -rf $tpldir~ - $CC --prelink_objects --instantiation_dir $tpldir $objs $libobjs $compile_deplibs~ - compile_command="$compile_command `find $tpldir -name \*.o | sort | $NL2SP`"' - _LT_TAGVAR(old_archive_cmds, $1)='tpldir=Template.dir~ - rm -rf $tpldir~ - $CC --prelink_objects --instantiation_dir $tpldir $oldobjs$old_deplibs~ - $AR $AR_FLAGS $oldlib$oldobjs$old_deplibs `find $tpldir -name \*.o | sort | $NL2SP`~ - $RANLIB $oldlib' - _LT_TAGVAR(archive_cmds, $1)='tpldir=Template.dir~ - rm -rf $tpldir~ - $CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~ - $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname -o $lib' - _LT_TAGVAR(archive_expsym_cmds, $1)='tpldir=Template.dir~ - rm -rf $tpldir~ - $CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~ - $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname ${wl}-retain-symbols-file ${wl}$export_symbols -o $lib' - ;; - *) # Version 6 and above use weak symbols - _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname -o $lib' - _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname ${wl}-retain-symbols-file ${wl}$export_symbols -o $lib' - ;; - esac - - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}--rpath ${wl}$libdir' - _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' - _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' - ;; - cxx*) - # Compaq C++ - _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' - _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib ${wl}-retain-symbols-file $wl$export_symbols' - - runpath_var=LD_RUN_PATH - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir' - _LT_TAGVAR(hardcode_libdir_separator, $1)=: - - # Commands to make compiler produce verbose output that lists - # what "hidden" libraries, object files and flags are used when - # linking a shared library. - # - # There doesn't appear to be a way to prevent this compiler from - # explicitly linking system object files so we need to strip them - # from the output so that they don't get included in the library - # dependencies. - output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld"`; templist=`func_echo_all "$templist" | $SED "s/\(^.*ld.*\)\( .*ld .*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "X$list" | $Xsed' - ;; - xl* | mpixl* | bgxl*) - # IBM XL 8.0 on PPC, with GNU ld - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' - _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' - _LT_TAGVAR(archive_cmds, $1)='$CC -qmkshrobj $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' - if test "x$supports_anon_versioning" = xyes; then - _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $output_objdir/$libname.ver~ - cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ - echo "local: *; };" >> $output_objdir/$libname.ver~ - $CC -qmkshrobj $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib' - fi - ;; - *) - case `$CC -V 2>&1 | sed 5q` in - *Sun\ C*) - # Sun C++ 5.9 - _LT_TAGVAR(no_undefined_flag, $1)=' -zdefs' - _LT_TAGVAR(archive_cmds, $1)='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' - _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file ${wl}$export_symbols' - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' - _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' - _LT_TAGVAR(compiler_needs_object, $1)=yes - - # Not sure whether something based on - # $CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 - # would be better. - output_verbose_link_cmd='func_echo_all' - - # Archives containing C++ object files must be created using - # "CC -xar", where "CC" is the Sun C++ compiler. This is - # necessary to make sure instantiated templates are included - # in the archive. - _LT_TAGVAR(old_archive_cmds, $1)='$CC -xar -o $oldlib $oldobjs' - ;; - esac - ;; - esac - ;; - - lynxos*) - # FIXME: insert proper C++ library support - _LT_TAGVAR(ld_shlibs, $1)=no - ;; - - m88k*) - # FIXME: insert proper C++ library support - _LT_TAGVAR(ld_shlibs, $1)=no - ;; - - mvs*) - case $cc_basename in - cxx*) - # FIXME: insert proper C++ library support - _LT_TAGVAR(ld_shlibs, $1)=no - ;; - *) - # FIXME: insert proper C++ library support - _LT_TAGVAR(ld_shlibs, $1)=no - ;; - esac - ;; - - netbsd*) - if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then - _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $predep_objects $libobjs $deplibs $postdep_objects $linker_flags' - wlarc= - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' - _LT_TAGVAR(hardcode_direct, $1)=yes - _LT_TAGVAR(hardcode_shlibpath_var, $1)=no - fi - # Workaround some broken pre-1.5 toolchains - output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP conftest.$objext | $SED -e "s:-lgcc -lc -lgcc::"' - ;; - - *nto* | *qnx*) - _LT_TAGVAR(ld_shlibs, $1)=yes - ;; - - openbsd2*) - # C++ shared libraries are fairly broken - _LT_TAGVAR(ld_shlibs, $1)=no - ;; - - openbsd*) - if test -f /usr/libexec/ld.so; then - _LT_TAGVAR(hardcode_direct, $1)=yes - _LT_TAGVAR(hardcode_shlibpath_var, $1)=no - _LT_TAGVAR(hardcode_direct_absolute, $1)=yes - _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib' - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' - if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then - _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file,$export_symbols -o $lib' - _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' - _LT_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' - fi - output_verbose_link_cmd=func_echo_all - else - _LT_TAGVAR(ld_shlibs, $1)=no - fi - ;; - - osf3* | osf4* | osf5*) - case $cc_basename in - KCC*) - # Kuck and Associates, Inc. (KAI) C++ Compiler - - # KCC will only create a shared library if the output file - # ends with ".so" (or ".sl" for HP-UX), so rename the library - # to its proper name (with version) after linking. - _LT_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo "$lib" | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' - - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' - _LT_TAGVAR(hardcode_libdir_separator, $1)=: - - # Archives containing C++ object files must be created using - # the KAI C++ compiler. - case $host in - osf3*) _LT_TAGVAR(old_archive_cmds, $1)='$CC -Bstatic -o $oldlib $oldobjs' ;; - *) _LT_TAGVAR(old_archive_cmds, $1)='$CC -o $oldlib $oldobjs' ;; - esac - ;; - RCC*) - # Rational C++ 2.4.1 - # FIXME: insert proper C++ library support - _LT_TAGVAR(ld_shlibs, $1)=no - ;; - cxx*) - case $host in - osf3*) - _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' - _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $soname `test -n "$verstring" && func_echo_all "${wl}-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' - ;; - *) - _LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*' - _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' - _LT_TAGVAR(archive_expsym_cmds, $1)='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done~ - echo "-hidden">> $lib.exp~ - $CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname ${wl}-input ${wl}$lib.exp `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib~ - $RM $lib.exp' - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir' - ;; - esac - - _LT_TAGVAR(hardcode_libdir_separator, $1)=: - - # Commands to make compiler produce verbose output that lists - # what "hidden" libraries, object files and flags are used when - # linking a shared library. - # - # There doesn't appear to be a way to prevent this compiler from - # explicitly linking system object files so we need to strip them - # from the output so that they don't get included in the library - # dependencies. - output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld" | $GREP -v "ld:"`; templist=`func_echo_all "$templist" | $SED "s/\(^.*ld.*\)\( .*ld.*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' - ;; - *) - if test "$GXX" = yes && test "$with_gnu_ld" = no; then - _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' - case $host in - osf3*) - _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' - ;; - *) - _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' - ;; - esac - - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' - _LT_TAGVAR(hardcode_libdir_separator, $1)=: - - # Commands to make compiler produce verbose output that lists - # what "hidden" libraries, object files and flags are used when - # linking a shared library. - output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' - - else - # FIXME: insert proper C++ library support - _LT_TAGVAR(ld_shlibs, $1)=no - fi - ;; - esac - ;; - - psos*) - # FIXME: insert proper C++ library support - _LT_TAGVAR(ld_shlibs, $1)=no - ;; - - sunos4*) - case $cc_basename in - CC*) - # Sun C++ 4.x - # FIXME: insert proper C++ library support - _LT_TAGVAR(ld_shlibs, $1)=no - ;; - lcc*) - # Lucid - # FIXME: insert proper C++ library support - _LT_TAGVAR(ld_shlibs, $1)=no - ;; - *) - # FIXME: insert proper C++ library support - _LT_TAGVAR(ld_shlibs, $1)=no - ;; - esac - ;; - - solaris*) - case $cc_basename in - CC* | sunCC*) - # Sun C++ 4.2, 5.x and Centerline C++ - _LT_TAGVAR(archive_cmds_need_lc,$1)=yes - _LT_TAGVAR(no_undefined_flag, $1)=' -zdefs' - _LT_TAGVAR(archive_cmds, $1)='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' - _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ - $CC -G${allow_undefined_flag} ${wl}-M ${wl}$lib.exp -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' - - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' - _LT_TAGVAR(hardcode_shlibpath_var, $1)=no - case $host_os in - solaris2.[[0-5]] | solaris2.[[0-5]].*) ;; - *) - # The compiler driver will combine and reorder linker options, - # but understands `-z linker_flag'. - # Supported since Solaris 2.6 (maybe 2.5.1?) - _LT_TAGVAR(whole_archive_flag_spec, $1)='-z allextract$convenience -z defaultextract' - ;; - esac - _LT_TAGVAR(link_all_deplibs, $1)=yes - - output_verbose_link_cmd='func_echo_all' - - # Archives containing C++ object files must be created using - # "CC -xar", where "CC" is the Sun C++ compiler. This is - # necessary to make sure instantiated templates are included - # in the archive. - _LT_TAGVAR(old_archive_cmds, $1)='$CC -xar -o $oldlib $oldobjs' - ;; - gcx*) - # Green Hills C++ Compiler - _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' - - # The C++ compiler must be used to create the archive. - _LT_TAGVAR(old_archive_cmds, $1)='$CC $LDFLAGS -archive -o $oldlib $oldobjs' - ;; - *) - # GNU C++ compiler with Solaris linker - if test "$GXX" = yes && test "$with_gnu_ld" = no; then - _LT_TAGVAR(no_undefined_flag, $1)=' ${wl}-z ${wl}defs' - if $CC --version | $GREP -v '^2\.7' > /dev/null; then - _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' - _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ - $CC -shared $pic_flag -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' - - # Commands to make compiler produce verbose output that lists - # what "hidden" libraries, object files and flags are used when - # linking a shared library. - output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' - else - # g++ 2.7 appears to require `-G' NOT `-shared' on this - # platform. - _LT_TAGVAR(archive_cmds, $1)='$CC -G -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' - _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ - $CC -G -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' - - # Commands to make compiler produce verbose output that lists - # what "hidden" libraries, object files and flags are used when - # linking a shared library. - output_verbose_link_cmd='$CC -G $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' - fi - - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $wl$libdir' - case $host_os in - solaris2.[[0-5]] | solaris2.[[0-5]].*) ;; - *) - _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract' - ;; - esac - fi - ;; - esac - ;; - - sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[[01]].[[10]]* | unixware7* | sco3.2v5.0.[[024]]*) - _LT_TAGVAR(no_undefined_flag, $1)='${wl}-z,text' - _LT_TAGVAR(archive_cmds_need_lc, $1)=no - _LT_TAGVAR(hardcode_shlibpath_var, $1)=no - runpath_var='LD_RUN_PATH' - - case $cc_basename in - CC*) - _LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' - _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' - ;; - *) - _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' - _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' - ;; - esac - ;; - - sysv5* | sco3.2v5* | sco5v6*) - # Note: We can NOT use -z defs as we might desire, because we do not - # link with -lc, and that would cause any symbols used from libc to - # always be unresolved, which means just about no library would - # ever link correctly. If we're not using GNU ld we use -z text - # though, which does catch some bad symbols but isn't as heavy-handed - # as -z defs. - _LT_TAGVAR(no_undefined_flag, $1)='${wl}-z,text' - _LT_TAGVAR(allow_undefined_flag, $1)='${wl}-z,nodefs' - _LT_TAGVAR(archive_cmds_need_lc, $1)=no - _LT_TAGVAR(hardcode_shlibpath_var, $1)=no - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R,$libdir' - _LT_TAGVAR(hardcode_libdir_separator, $1)=':' - _LT_TAGVAR(link_all_deplibs, $1)=yes - _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-Bexport' - runpath_var='LD_RUN_PATH' - - case $cc_basename in - CC*) - _LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' - _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' - _LT_TAGVAR(old_archive_cmds, $1)='$CC -Tprelink_objects $oldobjs~ - '"$_LT_TAGVAR(old_archive_cmds, $1)" - _LT_TAGVAR(reload_cmds, $1)='$CC -Tprelink_objects $reload_objs~ - '"$_LT_TAGVAR(reload_cmds, $1)" - ;; - *) - _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' - _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' - ;; - esac - ;; - - tandem*) - case $cc_basename in - NCC*) - # NonStop-UX NCC 3.20 - # FIXME: insert proper C++ library support - _LT_TAGVAR(ld_shlibs, $1)=no - ;; - *) - # FIXME: insert proper C++ library support - _LT_TAGVAR(ld_shlibs, $1)=no - ;; - esac - ;; - - vxworks*) - # FIXME: insert proper C++ library support - _LT_TAGVAR(ld_shlibs, $1)=no - ;; - - *) - # FIXME: insert proper C++ library support - _LT_TAGVAR(ld_shlibs, $1)=no - ;; - esac - - AC_MSG_RESULT([$_LT_TAGVAR(ld_shlibs, $1)]) - test "$_LT_TAGVAR(ld_shlibs, $1)" = no && can_build_shared=no - - _LT_TAGVAR(GCC, $1)="$GXX" - _LT_TAGVAR(LD, $1)="$LD" - - ## CAVEAT EMPTOR: - ## There is no encapsulation within the following macros, do not change - ## the running order or otherwise move them around unless you know exactly - ## what you are doing... - _LT_SYS_HIDDEN_LIBDEPS($1) - _LT_COMPILER_PIC($1) - _LT_COMPILER_C_O($1) - _LT_COMPILER_FILE_LOCKS($1) - _LT_LINKER_SHLIBS($1) - _LT_SYS_DYNAMIC_LINKER($1) - _LT_LINKER_HARDCODE_LIBPATH($1) - - _LT_CONFIG($1) - fi # test -n "$compiler" - - CC=$lt_save_CC - CFLAGS=$lt_save_CFLAGS - LDCXX=$LD - LD=$lt_save_LD - GCC=$lt_save_GCC - with_gnu_ld=$lt_save_with_gnu_ld - lt_cv_path_LDCXX=$lt_cv_path_LD - lt_cv_path_LD=$lt_save_path_LD - lt_cv_prog_gnu_ldcxx=$lt_cv_prog_gnu_ld - lt_cv_prog_gnu_ld=$lt_save_with_gnu_ld -fi # test "$_lt_caught_CXX_error" != yes - -AC_LANG_POP -])# _LT_LANG_CXX_CONFIG - - -# _LT_FUNC_STRIPNAME_CNF -# ---------------------- -# func_stripname_cnf prefix suffix name -# strip PREFIX and SUFFIX off of NAME. -# PREFIX and SUFFIX must not contain globbing or regex special -# characters, hashes, percent signs, but SUFFIX may contain a leading -# dot (in which case that matches only a dot). -# -# This function is identical to the (non-XSI) version of func_stripname, -# except this one can be used by m4 code that may be executed by configure, -# rather than the libtool script. -m4_defun([_LT_FUNC_STRIPNAME_CNF],[dnl -AC_REQUIRE([_LT_DECL_SED]) -AC_REQUIRE([_LT_PROG_ECHO_BACKSLASH]) -func_stripname_cnf () -{ - case ${2} in - .*) func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%\\\\${2}\$%%"`;; - *) func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%${2}\$%%"`;; - esac -} # func_stripname_cnf -])# _LT_FUNC_STRIPNAME_CNF - -# _LT_SYS_HIDDEN_LIBDEPS([TAGNAME]) -# --------------------------------- -# Figure out "hidden" library dependencies from verbose -# compiler output when linking a shared library. -# Parse the compiler output and extract the necessary -# objects, libraries and library flags. -m4_defun([_LT_SYS_HIDDEN_LIBDEPS], -[m4_require([_LT_FILEUTILS_DEFAULTS])dnl -AC_REQUIRE([_LT_FUNC_STRIPNAME_CNF])dnl -# Dependencies to place before and after the object being linked: -_LT_TAGVAR(predep_objects, $1)= -_LT_TAGVAR(postdep_objects, $1)= -_LT_TAGVAR(predeps, $1)= -_LT_TAGVAR(postdeps, $1)= -_LT_TAGVAR(compiler_lib_search_path, $1)= - -dnl we can't use the lt_simple_compile_test_code here, -dnl because it contains code intended for an executable, -dnl not a library. It's possible we should let each -dnl tag define a new lt_????_link_test_code variable, -dnl but it's only used here... -m4_if([$1], [], [cat > conftest.$ac_ext <<_LT_EOF -int a; -void foo (void) { a = 0; } -_LT_EOF -], [$1], [CXX], [cat > conftest.$ac_ext <<_LT_EOF -class Foo -{ -public: - Foo (void) { a = 0; } -private: - int a; -}; -_LT_EOF -], [$1], [F77], [cat > conftest.$ac_ext <<_LT_EOF - subroutine foo - implicit none - integer*4 a - a=0 - return - end -_LT_EOF -], [$1], [FC], [cat > conftest.$ac_ext <<_LT_EOF - subroutine foo - implicit none - integer a - a=0 - return - end -_LT_EOF -], [$1], [GCJ], [cat > conftest.$ac_ext <<_LT_EOF -public class foo { - private int a; - public void bar (void) { - a = 0; - } -}; -_LT_EOF -], [$1], [GO], [cat > conftest.$ac_ext <<_LT_EOF -package foo -func foo() { -} -_LT_EOF -]) - -_lt_libdeps_save_CFLAGS=$CFLAGS -case "$CC $CFLAGS " in #( -*\ -flto*\ *) CFLAGS="$CFLAGS -fno-lto" ;; -*\ -fwhopr*\ *) CFLAGS="$CFLAGS -fno-whopr" ;; -*\ -fuse-linker-plugin*\ *) CFLAGS="$CFLAGS -fno-use-linker-plugin" ;; -esac - -dnl Parse the compiler output and extract the necessary -dnl objects, libraries and library flags. -if AC_TRY_EVAL(ac_compile); then - # Parse the compiler output and extract the necessary - # objects, libraries and library flags. - - # Sentinel used to keep track of whether or not we are before - # the conftest object file. - pre_test_object_deps_done=no - - for p in `eval "$output_verbose_link_cmd"`; do - case ${prev}${p} in - - -L* | -R* | -l*) - # Some compilers place space between "-{L,R}" and the path. - # Remove the space. - if test $p = "-L" || - test $p = "-R"; then - prev=$p - continue - fi - - # Expand the sysroot to ease extracting the directories later. - if test -z "$prev"; then - case $p in - -L*) func_stripname_cnf '-L' '' "$p"; prev=-L; p=$func_stripname_result ;; - -R*) func_stripname_cnf '-R' '' "$p"; prev=-R; p=$func_stripname_result ;; - -l*) func_stripname_cnf '-l' '' "$p"; prev=-l; p=$func_stripname_result ;; - esac - fi - case $p in - =*) func_stripname_cnf '=' '' "$p"; p=$lt_sysroot$func_stripname_result ;; - esac - if test "$pre_test_object_deps_done" = no; then - case ${prev} in - -L | -R) - # Internal compiler library paths should come after those - # provided the user. The postdeps already come after the - # user supplied libs so there is no need to process them. - if test -z "$_LT_TAGVAR(compiler_lib_search_path, $1)"; then - _LT_TAGVAR(compiler_lib_search_path, $1)="${prev}${p}" - else - _LT_TAGVAR(compiler_lib_search_path, $1)="${_LT_TAGVAR(compiler_lib_search_path, $1)} ${prev}${p}" - fi - ;; - # The "-l" case would never come before the object being - # linked, so don't bother handling this case. - esac - else - if test -z "$_LT_TAGVAR(postdeps, $1)"; then - _LT_TAGVAR(postdeps, $1)="${prev}${p}" - else - _LT_TAGVAR(postdeps, $1)="${_LT_TAGVAR(postdeps, $1)} ${prev}${p}" - fi - fi - prev= - ;; - - *.lto.$objext) ;; # Ignore GCC LTO objects - *.$objext) - # This assumes that the test object file only shows up - # once in the compiler output. - if test "$p" = "conftest.$objext"; then - pre_test_object_deps_done=yes - continue - fi - - if test "$pre_test_object_deps_done" = no; then - if test -z "$_LT_TAGVAR(predep_objects, $1)"; then - _LT_TAGVAR(predep_objects, $1)="$p" - else - _LT_TAGVAR(predep_objects, $1)="$_LT_TAGVAR(predep_objects, $1) $p" - fi - else - if test -z "$_LT_TAGVAR(postdep_objects, $1)"; then - _LT_TAGVAR(postdep_objects, $1)="$p" - else - _LT_TAGVAR(postdep_objects, $1)="$_LT_TAGVAR(postdep_objects, $1) $p" - fi - fi - ;; - - *) ;; # Ignore the rest. - - esac - done - - # Clean up. - rm -f a.out a.exe -else - echo "libtool.m4: error: problem compiling $1 test program" -fi - -$RM -f confest.$objext -CFLAGS=$_lt_libdeps_save_CFLAGS - -# PORTME: override above test on systems where it is broken -m4_if([$1], [CXX], -[case $host_os in -interix[[3-9]]*) - # Interix 3.5 installs completely hosed .la files for C++, so rather than - # hack all around it, let's just trust "g++" to DTRT. - _LT_TAGVAR(predep_objects,$1)= - _LT_TAGVAR(postdep_objects,$1)= - _LT_TAGVAR(postdeps,$1)= - ;; - -linux*) - case `$CC -V 2>&1 | sed 5q` in - *Sun\ C*) - # Sun C++ 5.9 - - # The more standards-conforming stlport4 library is - # incompatible with the Cstd library. Avoid specifying - # it if it's in CXXFLAGS. Ignore libCrun as - # -library=stlport4 depends on it. - case " $CXX $CXXFLAGS " in - *" -library=stlport4 "*) - solaris_use_stlport4=yes - ;; - esac - - if test "$solaris_use_stlport4" != yes; then - _LT_TAGVAR(postdeps,$1)='-library=Cstd -library=Crun' - fi - ;; - esac - ;; - -solaris*) - case $cc_basename in - CC* | sunCC*) - # The more standards-conforming stlport4 library is - # incompatible with the Cstd library. Avoid specifying - # it if it's in CXXFLAGS. Ignore libCrun as - # -library=stlport4 depends on it. - case " $CXX $CXXFLAGS " in - *" -library=stlport4 "*) - solaris_use_stlport4=yes - ;; - esac - - # Adding this requires a known-good setup of shared libraries for - # Sun compiler versions before 5.6, else PIC objects from an old - # archive will be linked into the output, leading to subtle bugs. - if test "$solaris_use_stlport4" != yes; then - _LT_TAGVAR(postdeps,$1)='-library=Cstd -library=Crun' - fi - ;; - esac - ;; -esac -]) - -case " $_LT_TAGVAR(postdeps, $1) " in -*" -lc "*) _LT_TAGVAR(archive_cmds_need_lc, $1)=no ;; -esac - _LT_TAGVAR(compiler_lib_search_dirs, $1)= -if test -n "${_LT_TAGVAR(compiler_lib_search_path, $1)}"; then - _LT_TAGVAR(compiler_lib_search_dirs, $1)=`echo " ${_LT_TAGVAR(compiler_lib_search_path, $1)}" | ${SED} -e 's! -L! !g' -e 's!^ !!'` -fi -_LT_TAGDECL([], [compiler_lib_search_dirs], [1], - [The directories searched by this compiler when creating a shared library]) -_LT_TAGDECL([], [predep_objects], [1], - [Dependencies to place before and after the objects being linked to - create a shared library]) -_LT_TAGDECL([], [postdep_objects], [1]) -_LT_TAGDECL([], [predeps], [1]) -_LT_TAGDECL([], [postdeps], [1]) -_LT_TAGDECL([], [compiler_lib_search_path], [1], - [The library search path used internally by the compiler when linking - a shared library]) -])# _LT_SYS_HIDDEN_LIBDEPS - - -# _LT_LANG_F77_CONFIG([TAG]) -# -------------------------- -# Ensure that the configuration variables for a Fortran 77 compiler are -# suitably defined. These variables are subsequently used by _LT_CONFIG -# to write the compiler configuration to `libtool'. -m4_defun([_LT_LANG_F77_CONFIG], -[AC_LANG_PUSH(Fortran 77) -if test -z "$F77" || test "X$F77" = "Xno"; then - _lt_disable_F77=yes -fi - -_LT_TAGVAR(archive_cmds_need_lc, $1)=no -_LT_TAGVAR(allow_undefined_flag, $1)= -_LT_TAGVAR(always_export_symbols, $1)=no -_LT_TAGVAR(archive_expsym_cmds, $1)= -_LT_TAGVAR(export_dynamic_flag_spec, $1)= -_LT_TAGVAR(hardcode_direct, $1)=no -_LT_TAGVAR(hardcode_direct_absolute, $1)=no -_LT_TAGVAR(hardcode_libdir_flag_spec, $1)= -_LT_TAGVAR(hardcode_libdir_separator, $1)= -_LT_TAGVAR(hardcode_minus_L, $1)=no -_LT_TAGVAR(hardcode_automatic, $1)=no -_LT_TAGVAR(inherit_rpath, $1)=no -_LT_TAGVAR(module_cmds, $1)= -_LT_TAGVAR(module_expsym_cmds, $1)= -_LT_TAGVAR(link_all_deplibs, $1)=unknown -_LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds -_LT_TAGVAR(reload_flag, $1)=$reload_flag -_LT_TAGVAR(reload_cmds, $1)=$reload_cmds -_LT_TAGVAR(no_undefined_flag, $1)= -_LT_TAGVAR(whole_archive_flag_spec, $1)= -_LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no - -# Source file extension for f77 test sources. -ac_ext=f - -# Object file extension for compiled f77 test sources. -objext=o -_LT_TAGVAR(objext, $1)=$objext - -# No sense in running all these tests if we already determined that -# the F77 compiler isn't working. Some variables (like enable_shared) -# are currently assumed to apply to all compilers on this platform, -# and will be corrupted by setting them based on a non-working compiler. -if test "$_lt_disable_F77" != yes; then - # Code to be used in simple compile tests - lt_simple_compile_test_code="\ - subroutine t - return - end -" - - # Code to be used in simple link tests - lt_simple_link_test_code="\ - program t - end -" - - # ltmain only uses $CC for tagged configurations so make sure $CC is set. - _LT_TAG_COMPILER - - # save warnings/boilerplate of simple test code - _LT_COMPILER_BOILERPLATE - _LT_LINKER_BOILERPLATE - - # Allow CC to be a program name with arguments. - lt_save_CC="$CC" - lt_save_GCC=$GCC - lt_save_CFLAGS=$CFLAGS - CC=${F77-"f77"} - CFLAGS=$FFLAGS - compiler=$CC - _LT_TAGVAR(compiler, $1)=$CC - _LT_CC_BASENAME([$compiler]) - GCC=$G77 - if test -n "$compiler"; then - AC_MSG_CHECKING([if libtool supports shared libraries]) - AC_MSG_RESULT([$can_build_shared]) - - AC_MSG_CHECKING([whether to build shared libraries]) - test "$can_build_shared" = "no" && enable_shared=no - - # On AIX, shared libraries and static libraries use the same namespace, and - # are all built from PIC. - case $host_os in - aix3*) - test "$enable_shared" = yes && enable_static=no - if test -n "$RANLIB"; then - archive_cmds="$archive_cmds~\$RANLIB \$lib" - postinstall_cmds='$RANLIB $lib' - fi - ;; - aix[[4-9]]*) - if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then - test "$enable_shared" = yes && enable_static=no - fi - ;; - esac - AC_MSG_RESULT([$enable_shared]) - - AC_MSG_CHECKING([whether to build static libraries]) - # Make sure either enable_shared or enable_static is yes. - test "$enable_shared" = yes || enable_static=yes - AC_MSG_RESULT([$enable_static]) - - _LT_TAGVAR(GCC, $1)="$G77" - _LT_TAGVAR(LD, $1)="$LD" - - ## CAVEAT EMPTOR: - ## There is no encapsulation within the following macros, do not change - ## the running order or otherwise move them around unless you know exactly - ## what you are doing... - _LT_COMPILER_PIC($1) - _LT_COMPILER_C_O($1) - _LT_COMPILER_FILE_LOCKS($1) - _LT_LINKER_SHLIBS($1) - _LT_SYS_DYNAMIC_LINKER($1) - _LT_LINKER_HARDCODE_LIBPATH($1) - - _LT_CONFIG($1) - fi # test -n "$compiler" - - GCC=$lt_save_GCC - CC="$lt_save_CC" - CFLAGS="$lt_save_CFLAGS" -fi # test "$_lt_disable_F77" != yes - -AC_LANG_POP -])# _LT_LANG_F77_CONFIG - - -# _LT_LANG_FC_CONFIG([TAG]) -# ------------------------- -# Ensure that the configuration variables for a Fortran compiler are -# suitably defined. These variables are subsequently used by _LT_CONFIG -# to write the compiler configuration to `libtool'. -m4_defun([_LT_LANG_FC_CONFIG], -[AC_LANG_PUSH(Fortran) - -if test -z "$FC" || test "X$FC" = "Xno"; then - _lt_disable_FC=yes -fi - -_LT_TAGVAR(archive_cmds_need_lc, $1)=no -_LT_TAGVAR(allow_undefined_flag, $1)= -_LT_TAGVAR(always_export_symbols, $1)=no -_LT_TAGVAR(archive_expsym_cmds, $1)= -_LT_TAGVAR(export_dynamic_flag_spec, $1)= -_LT_TAGVAR(hardcode_direct, $1)=no -_LT_TAGVAR(hardcode_direct_absolute, $1)=no -_LT_TAGVAR(hardcode_libdir_flag_spec, $1)= -_LT_TAGVAR(hardcode_libdir_separator, $1)= -_LT_TAGVAR(hardcode_minus_L, $1)=no -_LT_TAGVAR(hardcode_automatic, $1)=no -_LT_TAGVAR(inherit_rpath, $1)=no -_LT_TAGVAR(module_cmds, $1)= -_LT_TAGVAR(module_expsym_cmds, $1)= -_LT_TAGVAR(link_all_deplibs, $1)=unknown -_LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds -_LT_TAGVAR(reload_flag, $1)=$reload_flag -_LT_TAGVAR(reload_cmds, $1)=$reload_cmds -_LT_TAGVAR(no_undefined_flag, $1)= -_LT_TAGVAR(whole_archive_flag_spec, $1)= -_LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no - -# Source file extension for fc test sources. -ac_ext=${ac_fc_srcext-f} - -# Object file extension for compiled fc test sources. -objext=o -_LT_TAGVAR(objext, $1)=$objext - -# No sense in running all these tests if we already determined that -# the FC compiler isn't working. Some variables (like enable_shared) -# are currently assumed to apply to all compilers on this platform, -# and will be corrupted by setting them based on a non-working compiler. -if test "$_lt_disable_FC" != yes; then - # Code to be used in simple compile tests - lt_simple_compile_test_code="\ - subroutine t - return - end -" - - # Code to be used in simple link tests - lt_simple_link_test_code="\ - program t - end -" - - # ltmain only uses $CC for tagged configurations so make sure $CC is set. - _LT_TAG_COMPILER - - # save warnings/boilerplate of simple test code - _LT_COMPILER_BOILERPLATE - _LT_LINKER_BOILERPLATE - - # Allow CC to be a program name with arguments. - lt_save_CC="$CC" - lt_save_GCC=$GCC - lt_save_CFLAGS=$CFLAGS - CC=${FC-"f95"} - CFLAGS=$FCFLAGS - compiler=$CC - GCC=$ac_cv_fc_compiler_gnu - - _LT_TAGVAR(compiler, $1)=$CC - _LT_CC_BASENAME([$compiler]) - - if test -n "$compiler"; then - AC_MSG_CHECKING([if libtool supports shared libraries]) - AC_MSG_RESULT([$can_build_shared]) - - AC_MSG_CHECKING([whether to build shared libraries]) - test "$can_build_shared" = "no" && enable_shared=no - - # On AIX, shared libraries and static libraries use the same namespace, and - # are all built from PIC. - case $host_os in - aix3*) - test "$enable_shared" = yes && enable_static=no - if test -n "$RANLIB"; then - archive_cmds="$archive_cmds~\$RANLIB \$lib" - postinstall_cmds='$RANLIB $lib' - fi - ;; - aix[[4-9]]*) - if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then - test "$enable_shared" = yes && enable_static=no - fi - ;; - esac - AC_MSG_RESULT([$enable_shared]) - - AC_MSG_CHECKING([whether to build static libraries]) - # Make sure either enable_shared or enable_static is yes. - test "$enable_shared" = yes || enable_static=yes - AC_MSG_RESULT([$enable_static]) - - _LT_TAGVAR(GCC, $1)="$ac_cv_fc_compiler_gnu" - _LT_TAGVAR(LD, $1)="$LD" - - ## CAVEAT EMPTOR: - ## There is no encapsulation within the following macros, do not change - ## the running order or otherwise move them around unless you know exactly - ## what you are doing... - _LT_SYS_HIDDEN_LIBDEPS($1) - _LT_COMPILER_PIC($1) - _LT_COMPILER_C_O($1) - _LT_COMPILER_FILE_LOCKS($1) - _LT_LINKER_SHLIBS($1) - _LT_SYS_DYNAMIC_LINKER($1) - _LT_LINKER_HARDCODE_LIBPATH($1) - - _LT_CONFIG($1) - fi # test -n "$compiler" - - GCC=$lt_save_GCC - CC=$lt_save_CC - CFLAGS=$lt_save_CFLAGS -fi # test "$_lt_disable_FC" != yes - -AC_LANG_POP -])# _LT_LANG_FC_CONFIG - - -# _LT_LANG_GCJ_CONFIG([TAG]) -# -------------------------- -# Ensure that the configuration variables for the GNU Java Compiler compiler -# are suitably defined. These variables are subsequently used by _LT_CONFIG -# to write the compiler configuration to `libtool'. -m4_defun([_LT_LANG_GCJ_CONFIG], -[AC_REQUIRE([LT_PROG_GCJ])dnl -AC_LANG_SAVE - -# Source file extension for Java test sources. -ac_ext=java - -# Object file extension for compiled Java test sources. -objext=o -_LT_TAGVAR(objext, $1)=$objext - -# Code to be used in simple compile tests -lt_simple_compile_test_code="class foo {}" - -# Code to be used in simple link tests -lt_simple_link_test_code='public class conftest { public static void main(String[[]] argv) {}; }' - -# ltmain only uses $CC for tagged configurations so make sure $CC is set. -_LT_TAG_COMPILER - -# save warnings/boilerplate of simple test code -_LT_COMPILER_BOILERPLATE -_LT_LINKER_BOILERPLATE - -# Allow CC to be a program name with arguments. -lt_save_CC=$CC -lt_save_CFLAGS=$CFLAGS -lt_save_GCC=$GCC -GCC=yes -CC=${GCJ-"gcj"} -CFLAGS=$GCJFLAGS -compiler=$CC -_LT_TAGVAR(compiler, $1)=$CC -_LT_TAGVAR(LD, $1)="$LD" -_LT_CC_BASENAME([$compiler]) - -# GCJ did not exist at the time GCC didn't implicitly link libc in. -_LT_TAGVAR(archive_cmds_need_lc, $1)=no - -_LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds -_LT_TAGVAR(reload_flag, $1)=$reload_flag -_LT_TAGVAR(reload_cmds, $1)=$reload_cmds - -if test -n "$compiler"; then - _LT_COMPILER_NO_RTTI($1) - _LT_COMPILER_PIC($1) - _LT_COMPILER_C_O($1) - _LT_COMPILER_FILE_LOCKS($1) - _LT_LINKER_SHLIBS($1) - _LT_LINKER_HARDCODE_LIBPATH($1) - - _LT_CONFIG($1) -fi - -AC_LANG_RESTORE - -GCC=$lt_save_GCC -CC=$lt_save_CC -CFLAGS=$lt_save_CFLAGS -])# _LT_LANG_GCJ_CONFIG - - -# _LT_LANG_GO_CONFIG([TAG]) -# -------------------------- -# Ensure that the configuration variables for the GNU Go compiler -# are suitably defined. These variables are subsequently used by _LT_CONFIG -# to write the compiler configuration to `libtool'. -m4_defun([_LT_LANG_GO_CONFIG], -[AC_REQUIRE([LT_PROG_GO])dnl -AC_LANG_SAVE - -# Source file extension for Go test sources. -ac_ext=go - -# Object file extension for compiled Go test sources. -objext=o -_LT_TAGVAR(objext, $1)=$objext - -# Code to be used in simple compile tests -lt_simple_compile_test_code="package main; func main() { }" - -# Code to be used in simple link tests -lt_simple_link_test_code='package main; func main() { }' - -# ltmain only uses $CC for tagged configurations so make sure $CC is set. -_LT_TAG_COMPILER - -# save warnings/boilerplate of simple test code -_LT_COMPILER_BOILERPLATE -_LT_LINKER_BOILERPLATE - -# Allow CC to be a program name with arguments. -lt_save_CC=$CC -lt_save_CFLAGS=$CFLAGS -lt_save_GCC=$GCC -GCC=yes -CC=${GOC-"gccgo"} -CFLAGS=$GOFLAGS -compiler=$CC -_LT_TAGVAR(compiler, $1)=$CC -_LT_TAGVAR(LD, $1)="$LD" -_LT_CC_BASENAME([$compiler]) - -# Go did not exist at the time GCC didn't implicitly link libc in. -_LT_TAGVAR(archive_cmds_need_lc, $1)=no - -_LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds -_LT_TAGVAR(reload_flag, $1)=$reload_flag -_LT_TAGVAR(reload_cmds, $1)=$reload_cmds - -if test -n "$compiler"; then - _LT_COMPILER_NO_RTTI($1) - _LT_COMPILER_PIC($1) - _LT_COMPILER_C_O($1) - _LT_COMPILER_FILE_LOCKS($1) - _LT_LINKER_SHLIBS($1) - _LT_LINKER_HARDCODE_LIBPATH($1) - - _LT_CONFIG($1) -fi - -AC_LANG_RESTORE - -GCC=$lt_save_GCC -CC=$lt_save_CC -CFLAGS=$lt_save_CFLAGS -])# _LT_LANG_GO_CONFIG - - -# _LT_LANG_RC_CONFIG([TAG]) -# ------------------------- -# Ensure that the configuration variables for the Windows resource compiler -# are suitably defined. These variables are subsequently used by _LT_CONFIG -# to write the compiler configuration to `libtool'. -m4_defun([_LT_LANG_RC_CONFIG], -[AC_REQUIRE([LT_PROG_RC])dnl -AC_LANG_SAVE - -# Source file extension for RC test sources. -ac_ext=rc - -# Object file extension for compiled RC test sources. -objext=o -_LT_TAGVAR(objext, $1)=$objext - -# Code to be used in simple compile tests -lt_simple_compile_test_code='sample MENU { MENUITEM "&Soup", 100, CHECKED }' - -# Code to be used in simple link tests -lt_simple_link_test_code="$lt_simple_compile_test_code" - -# ltmain only uses $CC for tagged configurations so make sure $CC is set. -_LT_TAG_COMPILER - -# save warnings/boilerplate of simple test code -_LT_COMPILER_BOILERPLATE -_LT_LINKER_BOILERPLATE - -# Allow CC to be a program name with arguments. -lt_save_CC="$CC" -lt_save_CFLAGS=$CFLAGS -lt_save_GCC=$GCC -GCC= -CC=${RC-"windres"} -CFLAGS= -compiler=$CC -_LT_TAGVAR(compiler, $1)=$CC -_LT_CC_BASENAME([$compiler]) -_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)=yes - -if test -n "$compiler"; then - : - _LT_CONFIG($1) -fi - -GCC=$lt_save_GCC -AC_LANG_RESTORE -CC=$lt_save_CC -CFLAGS=$lt_save_CFLAGS -])# _LT_LANG_RC_CONFIG - - -# LT_PROG_GCJ -# ----------- -AC_DEFUN([LT_PROG_GCJ], -[m4_ifdef([AC_PROG_GCJ], [AC_PROG_GCJ], - [m4_ifdef([A][M_PROG_GCJ], [A][M_PROG_GCJ], - [AC_CHECK_TOOL(GCJ, gcj,) - test "x${GCJFLAGS+set}" = xset || GCJFLAGS="-g -O2" - AC_SUBST(GCJFLAGS)])])[]dnl -]) - -# Old name: -AU_ALIAS([LT_AC_PROG_GCJ], [LT_PROG_GCJ]) -dnl aclocal-1.4 backwards compatibility: -dnl AC_DEFUN([LT_AC_PROG_GCJ], []) - - -# LT_PROG_GO -# ---------- -AC_DEFUN([LT_PROG_GO], -[AC_CHECK_TOOL(GOC, gccgo,) -]) - - -# LT_PROG_RC -# ---------- -AC_DEFUN([LT_PROG_RC], -[AC_CHECK_TOOL(RC, windres,) -]) - -# Old name: -AU_ALIAS([LT_AC_PROG_RC], [LT_PROG_RC]) -dnl aclocal-1.4 backwards compatibility: -dnl AC_DEFUN([LT_AC_PROG_RC], []) - - -# _LT_DECL_EGREP -# -------------- -# If we don't have a new enough Autoconf to choose the best grep -# available, choose the one first in the user's PATH. -m4_defun([_LT_DECL_EGREP], -[AC_REQUIRE([AC_PROG_EGREP])dnl -AC_REQUIRE([AC_PROG_FGREP])dnl -test -z "$GREP" && GREP=grep -_LT_DECL([], [GREP], [1], [A grep program that handles long lines]) -_LT_DECL([], [EGREP], [1], [An ERE matcher]) -_LT_DECL([], [FGREP], [1], [A literal string matcher]) -dnl Non-bleeding-edge autoconf doesn't subst GREP, so do it here too -AC_SUBST([GREP]) -]) - - -# _LT_DECL_OBJDUMP -# -------------- -# If we don't have a new enough Autoconf to choose the best objdump -# available, choose the one first in the user's PATH. -m4_defun([_LT_DECL_OBJDUMP], -[AC_CHECK_TOOL(OBJDUMP, objdump, false) -test -z "$OBJDUMP" && OBJDUMP=objdump -_LT_DECL([], [OBJDUMP], [1], [An object symbol dumper]) -AC_SUBST([OBJDUMP]) -]) - -# _LT_DECL_DLLTOOL -# ---------------- -# Ensure DLLTOOL variable is set. -m4_defun([_LT_DECL_DLLTOOL], -[AC_CHECK_TOOL(DLLTOOL, dlltool, false) -test -z "$DLLTOOL" && DLLTOOL=dlltool -_LT_DECL([], [DLLTOOL], [1], [DLL creation program]) -AC_SUBST([DLLTOOL]) -]) - -# _LT_DECL_SED -# ------------ -# Check for a fully-functional sed program, that truncates -# as few characters as possible. Prefer GNU sed if found. -m4_defun([_LT_DECL_SED], -[AC_PROG_SED -test -z "$SED" && SED=sed -Xsed="$SED -e 1s/^X//" -_LT_DECL([], [SED], [1], [A sed program that does not truncate output]) -_LT_DECL([], [Xsed], ["\$SED -e 1s/^X//"], - [Sed that helps us avoid accidentally triggering echo(1) options like -n]) -])# _LT_DECL_SED - -m4_ifndef([AC_PROG_SED], [ -# NOTE: This macro has been submitted for inclusion into # -# GNU Autoconf as AC_PROG_SED. When it is available in # -# a released version of Autoconf we should remove this # -# macro and use it instead. # - -m4_defun([AC_PROG_SED], -[AC_MSG_CHECKING([for a sed that does not truncate output]) -AC_CACHE_VAL(lt_cv_path_SED, -[# Loop through the user's path and test for sed and gsed. -# Then use that list of sed's as ones to test for truncation. -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for lt_ac_prog in sed gsed; do - for ac_exec_ext in '' $ac_executable_extensions; do - if $as_executable_p "$as_dir/$lt_ac_prog$ac_exec_ext"; then - lt_ac_sed_list="$lt_ac_sed_list $as_dir/$lt_ac_prog$ac_exec_ext" - fi - done - done -done -IFS=$as_save_IFS -lt_ac_max=0 -lt_ac_count=0 -# Add /usr/xpg4/bin/sed as it is typically found on Solaris -# along with /bin/sed that truncates output. -for lt_ac_sed in $lt_ac_sed_list /usr/xpg4/bin/sed; do - test ! -f $lt_ac_sed && continue - cat /dev/null > conftest.in - lt_ac_count=0 - echo $ECHO_N "0123456789$ECHO_C" >conftest.in - # Check for GNU sed and select it if it is found. - if "$lt_ac_sed" --version 2>&1 < /dev/null | grep 'GNU' > /dev/null; then - lt_cv_path_SED=$lt_ac_sed - break - fi - while true; do - cat conftest.in conftest.in >conftest.tmp - mv conftest.tmp conftest.in - cp conftest.in conftest.nl - echo >>conftest.nl - $lt_ac_sed -e 's/a$//' < conftest.nl >conftest.out || break - cmp -s conftest.out conftest.nl || break - # 10000 chars as input seems more than enough - test $lt_ac_count -gt 10 && break - lt_ac_count=`expr $lt_ac_count + 1` - if test $lt_ac_count -gt $lt_ac_max; then - lt_ac_max=$lt_ac_count - lt_cv_path_SED=$lt_ac_sed - fi - done -done -]) -SED=$lt_cv_path_SED -AC_SUBST([SED]) -AC_MSG_RESULT([$SED]) -])#AC_PROG_SED -])#m4_ifndef - -# Old name: -AU_ALIAS([LT_AC_PROG_SED], [AC_PROG_SED]) -dnl aclocal-1.4 backwards compatibility: -dnl AC_DEFUN([LT_AC_PROG_SED], []) - - -# _LT_CHECK_SHELL_FEATURES -# ------------------------ -# Find out whether the shell is Bourne or XSI compatible, -# or has some other useful features. -m4_defun([_LT_CHECK_SHELL_FEATURES], -[AC_MSG_CHECKING([whether the shell understands some XSI constructs]) -# Try some XSI features -xsi_shell=no -( _lt_dummy="a/b/c" - test "${_lt_dummy##*/},${_lt_dummy%/*},${_lt_dummy#??}"${_lt_dummy%"$_lt_dummy"}, \ - = c,a/b,b/c, \ - && eval 'test $(( 1 + 1 )) -eq 2 \ - && test "${#_lt_dummy}" -eq 5' ) >/dev/null 2>&1 \ - && xsi_shell=yes -AC_MSG_RESULT([$xsi_shell]) -_LT_CONFIG_LIBTOOL_INIT([xsi_shell='$xsi_shell']) - -AC_MSG_CHECKING([whether the shell understands "+="]) -lt_shell_append=no -( foo=bar; set foo baz; eval "$[1]+=\$[2]" && test "$foo" = barbaz ) \ - >/dev/null 2>&1 \ - && lt_shell_append=yes -AC_MSG_RESULT([$lt_shell_append]) -_LT_CONFIG_LIBTOOL_INIT([lt_shell_append='$lt_shell_append']) - -if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then - lt_unset=unset -else - lt_unset=false -fi -_LT_DECL([], [lt_unset], [0], [whether the shell understands "unset"])dnl - -# test EBCDIC or ASCII -case `echo X|tr X '\101'` in - A) # ASCII based system - # \n is not interpreted correctly by Solaris 8 /usr/ucb/tr - lt_SP2NL='tr \040 \012' - lt_NL2SP='tr \015\012 \040\040' - ;; - *) # EBCDIC based system - lt_SP2NL='tr \100 \n' - lt_NL2SP='tr \r\n \100\100' - ;; -esac -_LT_DECL([SP2NL], [lt_SP2NL], [1], [turn spaces into newlines])dnl -_LT_DECL([NL2SP], [lt_NL2SP], [1], [turn newlines into spaces])dnl -])# _LT_CHECK_SHELL_FEATURES - - -# _LT_PROG_FUNCTION_REPLACE (FUNCNAME, REPLACEMENT-BODY) -# ------------------------------------------------------ -# In `$cfgfile', look for function FUNCNAME delimited by `^FUNCNAME ()$' and -# '^} FUNCNAME ', and replace its body with REPLACEMENT-BODY. -m4_defun([_LT_PROG_FUNCTION_REPLACE], -[dnl { -sed -e '/^$1 ()$/,/^} # $1 /c\ -$1 ()\ -{\ -m4_bpatsubsts([$2], [$], [\\], [^\([ ]\)], [\\\1]) -} # Extended-shell $1 implementation' "$cfgfile" > $cfgfile.tmp \ - && mv -f "$cfgfile.tmp" "$cfgfile" \ - || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") -test 0 -eq $? || _lt_function_replace_fail=: -]) - - -# _LT_PROG_REPLACE_SHELLFNS -# ------------------------- -# Replace existing portable implementations of several shell functions with -# equivalent extended shell implementations where those features are available.. -m4_defun([_LT_PROG_REPLACE_SHELLFNS], -[if test x"$xsi_shell" = xyes; then - _LT_PROG_FUNCTION_REPLACE([func_dirname], [dnl - case ${1} in - */*) func_dirname_result="${1%/*}${2}" ;; - * ) func_dirname_result="${3}" ;; - esac]) - - _LT_PROG_FUNCTION_REPLACE([func_basename], [dnl - func_basename_result="${1##*/}"]) - - _LT_PROG_FUNCTION_REPLACE([func_dirname_and_basename], [dnl - case ${1} in - */*) func_dirname_result="${1%/*}${2}" ;; - * ) func_dirname_result="${3}" ;; - esac - func_basename_result="${1##*/}"]) - - _LT_PROG_FUNCTION_REPLACE([func_stripname], [dnl - # pdksh 5.2.14 does not do ${X%$Y} correctly if both X and Y are - # positional parameters, so assign one to ordinary parameter first. - func_stripname_result=${3} - func_stripname_result=${func_stripname_result#"${1}"} - func_stripname_result=${func_stripname_result%"${2}"}]) - - _LT_PROG_FUNCTION_REPLACE([func_split_long_opt], [dnl - func_split_long_opt_name=${1%%=*} - func_split_long_opt_arg=${1#*=}]) - - _LT_PROG_FUNCTION_REPLACE([func_split_short_opt], [dnl - func_split_short_opt_arg=${1#??} - func_split_short_opt_name=${1%"$func_split_short_opt_arg"}]) - - _LT_PROG_FUNCTION_REPLACE([func_lo2o], [dnl - case ${1} in - *.lo) func_lo2o_result=${1%.lo}.${objext} ;; - *) func_lo2o_result=${1} ;; - esac]) - - _LT_PROG_FUNCTION_REPLACE([func_xform], [ func_xform_result=${1%.*}.lo]) - - _LT_PROG_FUNCTION_REPLACE([func_arith], [ func_arith_result=$(( $[*] ))]) - - _LT_PROG_FUNCTION_REPLACE([func_len], [ func_len_result=${#1}]) -fi - -if test x"$lt_shell_append" = xyes; then - _LT_PROG_FUNCTION_REPLACE([func_append], [ eval "${1}+=\\${2}"]) - - _LT_PROG_FUNCTION_REPLACE([func_append_quoted], [dnl - func_quote_for_eval "${2}" -dnl m4 expansion turns \\\\ into \\, and then the shell eval turns that into \ - eval "${1}+=\\\\ \\$func_quote_for_eval_result"]) - - # Save a `func_append' function call where possible by direct use of '+=' - sed -e 's%func_append \([[a-zA-Z_]]\{1,\}\) "%\1+="%g' $cfgfile > $cfgfile.tmp \ - && mv -f "$cfgfile.tmp" "$cfgfile" \ - || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") - test 0 -eq $? || _lt_function_replace_fail=: -else - # Save a `func_append' function call even when '+=' is not available - sed -e 's%func_append \([[a-zA-Z_]]\{1,\}\) "%\1="$\1%g' $cfgfile > $cfgfile.tmp \ - && mv -f "$cfgfile.tmp" "$cfgfile" \ - || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") - test 0 -eq $? || _lt_function_replace_fail=: -fi - -if test x"$_lt_function_replace_fail" = x":"; then - AC_MSG_WARN([Unable to substitute extended shell functions in $ofile]) -fi -]) - -# _LT_PATH_CONVERSION_FUNCTIONS -# ----------------------------- -# Determine which file name conversion functions should be used by -# func_to_host_file (and, implicitly, by func_to_host_path). These are needed -# for certain cross-compile configurations and native mingw. -m4_defun([_LT_PATH_CONVERSION_FUNCTIONS], -[AC_REQUIRE([AC_CANONICAL_HOST])dnl -AC_REQUIRE([AC_CANONICAL_BUILD])dnl -AC_MSG_CHECKING([how to convert $build file names to $host format]) -AC_CACHE_VAL(lt_cv_to_host_file_cmd, -[case $host in - *-*-mingw* ) - case $build in - *-*-mingw* ) # actually msys - lt_cv_to_host_file_cmd=func_convert_file_msys_to_w32 - ;; - *-*-cygwin* ) - lt_cv_to_host_file_cmd=func_convert_file_cygwin_to_w32 - ;; - * ) # otherwise, assume *nix - lt_cv_to_host_file_cmd=func_convert_file_nix_to_w32 - ;; - esac - ;; - *-*-cygwin* ) - case $build in - *-*-mingw* ) # actually msys - lt_cv_to_host_file_cmd=func_convert_file_msys_to_cygwin - ;; - *-*-cygwin* ) - lt_cv_to_host_file_cmd=func_convert_file_noop - ;; - * ) # otherwise, assume *nix - lt_cv_to_host_file_cmd=func_convert_file_nix_to_cygwin - ;; - esac - ;; - * ) # unhandled hosts (and "normal" native builds) - lt_cv_to_host_file_cmd=func_convert_file_noop - ;; -esac -]) -to_host_file_cmd=$lt_cv_to_host_file_cmd -AC_MSG_RESULT([$lt_cv_to_host_file_cmd]) -_LT_DECL([to_host_file_cmd], [lt_cv_to_host_file_cmd], - [0], [convert $build file names to $host format])dnl - -AC_MSG_CHECKING([how to convert $build file names to toolchain format]) -AC_CACHE_VAL(lt_cv_to_tool_file_cmd, -[#assume ordinary cross tools, or native build. -lt_cv_to_tool_file_cmd=func_convert_file_noop -case $host in - *-*-mingw* ) - case $build in - *-*-mingw* ) # actually msys - lt_cv_to_tool_file_cmd=func_convert_file_msys_to_w32 - ;; - esac - ;; -esac -]) -to_tool_file_cmd=$lt_cv_to_tool_file_cmd -AC_MSG_RESULT([$lt_cv_to_tool_file_cmd]) -_LT_DECL([to_tool_file_cmd], [lt_cv_to_tool_file_cmd], - [0], [convert $build files to toolchain format])dnl -])# _LT_PATH_CONVERSION_FUNCTIONS - -# Helper functions for option handling. -*- Autoconf -*- -# -# Copyright (C) 2004, 2005, 2007, 2008, 2009 Free Software Foundation, -# Inc. -# Written by Gary V. Vaughan, 2004 -# -# This file is free software; the Free Software Foundation gives -# unlimited permission to copy and/or distribute it, with or without -# modifications, as long as this notice is preserved. - -# serial 7 ltoptions.m4 - -# This is to help aclocal find these macros, as it can't see m4_define. -AC_DEFUN([LTOPTIONS_VERSION], [m4_if([1])]) - - -# _LT_MANGLE_OPTION(MACRO-NAME, OPTION-NAME) -# ------------------------------------------ -m4_define([_LT_MANGLE_OPTION], -[[_LT_OPTION_]m4_bpatsubst($1__$2, [[^a-zA-Z0-9_]], [_])]) - - -# _LT_SET_OPTION(MACRO-NAME, OPTION-NAME) -# --------------------------------------- -# Set option OPTION-NAME for macro MACRO-NAME, and if there is a -# matching handler defined, dispatch to it. Other OPTION-NAMEs are -# saved as a flag. -m4_define([_LT_SET_OPTION], -[m4_define(_LT_MANGLE_OPTION([$1], [$2]))dnl -m4_ifdef(_LT_MANGLE_DEFUN([$1], [$2]), - _LT_MANGLE_DEFUN([$1], [$2]), - [m4_warning([Unknown $1 option `$2'])])[]dnl -]) - - -# _LT_IF_OPTION(MACRO-NAME, OPTION-NAME, IF-SET, [IF-NOT-SET]) -# ------------------------------------------------------------ -# Execute IF-SET if OPTION is set, IF-NOT-SET otherwise. -m4_define([_LT_IF_OPTION], -[m4_ifdef(_LT_MANGLE_OPTION([$1], [$2]), [$3], [$4])]) - - -# _LT_UNLESS_OPTIONS(MACRO-NAME, OPTION-LIST, IF-NOT-SET) -# ------------------------------------------------------- -# Execute IF-NOT-SET unless all options in OPTION-LIST for MACRO-NAME -# are set. -m4_define([_LT_UNLESS_OPTIONS], -[m4_foreach([_LT_Option], m4_split(m4_normalize([$2])), - [m4_ifdef(_LT_MANGLE_OPTION([$1], _LT_Option), - [m4_define([$0_found])])])[]dnl -m4_ifdef([$0_found], [m4_undefine([$0_found])], [$3 -])[]dnl -]) - - -# _LT_SET_OPTIONS(MACRO-NAME, OPTION-LIST) -# ---------------------------------------- -# OPTION-LIST is a space-separated list of Libtool options associated -# with MACRO-NAME. If any OPTION has a matching handler declared with -# LT_OPTION_DEFINE, dispatch to that macro; otherwise complain about -# the unknown option and exit. -m4_defun([_LT_SET_OPTIONS], -[# Set options -m4_foreach([_LT_Option], m4_split(m4_normalize([$2])), - [_LT_SET_OPTION([$1], _LT_Option)]) - -m4_if([$1],[LT_INIT],[ - dnl - dnl Simply set some default values (i.e off) if boolean options were not - dnl specified: - _LT_UNLESS_OPTIONS([LT_INIT], [dlopen], [enable_dlopen=no - ]) - _LT_UNLESS_OPTIONS([LT_INIT], [win32-dll], [enable_win32_dll=no - ]) - dnl - dnl If no reference was made to various pairs of opposing options, then - dnl we run the default mode handler for the pair. For example, if neither - dnl `shared' nor `disable-shared' was passed, we enable building of shared - dnl archives by default: - _LT_UNLESS_OPTIONS([LT_INIT], [shared disable-shared], [_LT_ENABLE_SHARED]) - _LT_UNLESS_OPTIONS([LT_INIT], [static disable-static], [_LT_ENABLE_STATIC]) - _LT_UNLESS_OPTIONS([LT_INIT], [pic-only no-pic], [_LT_WITH_PIC]) - _LT_UNLESS_OPTIONS([LT_INIT], [fast-install disable-fast-install], - [_LT_ENABLE_FAST_INSTALL]) - ]) -])# _LT_SET_OPTIONS - - - -# _LT_MANGLE_DEFUN(MACRO-NAME, OPTION-NAME) -# ----------------------------------------- -m4_define([_LT_MANGLE_DEFUN], -[[_LT_OPTION_DEFUN_]m4_bpatsubst(m4_toupper([$1__$2]), [[^A-Z0-9_]], [_])]) - - -# LT_OPTION_DEFINE(MACRO-NAME, OPTION-NAME, CODE) -# ----------------------------------------------- -m4_define([LT_OPTION_DEFINE], -[m4_define(_LT_MANGLE_DEFUN([$1], [$2]), [$3])[]dnl -])# LT_OPTION_DEFINE - - -# dlopen -# ------ -LT_OPTION_DEFINE([LT_INIT], [dlopen], [enable_dlopen=yes -]) - -AU_DEFUN([AC_LIBTOOL_DLOPEN], -[_LT_SET_OPTION([LT_INIT], [dlopen]) -AC_DIAGNOSE([obsolete], -[$0: Remove this warning and the call to _LT_SET_OPTION when you -put the `dlopen' option into LT_INIT's first parameter.]) -]) - -dnl aclocal-1.4 backwards compatibility: -dnl AC_DEFUN([AC_LIBTOOL_DLOPEN], []) - - -# win32-dll -# --------- -# Declare package support for building win32 dll's. -LT_OPTION_DEFINE([LT_INIT], [win32-dll], -[enable_win32_dll=yes - -case $host in -*-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-cegcc*) - AC_CHECK_TOOL(AS, as, false) - AC_CHECK_TOOL(DLLTOOL, dlltool, false) - AC_CHECK_TOOL(OBJDUMP, objdump, false) - ;; -esac - -test -z "$AS" && AS=as -_LT_DECL([], [AS], [1], [Assembler program])dnl - -test -z "$DLLTOOL" && DLLTOOL=dlltool -_LT_DECL([], [DLLTOOL], [1], [DLL creation program])dnl - -test -z "$OBJDUMP" && OBJDUMP=objdump -_LT_DECL([], [OBJDUMP], [1], [Object dumper program])dnl -])# win32-dll - -AU_DEFUN([AC_LIBTOOL_WIN32_DLL], -[AC_REQUIRE([AC_CANONICAL_HOST])dnl -_LT_SET_OPTION([LT_INIT], [win32-dll]) -AC_DIAGNOSE([obsolete], -[$0: Remove this warning and the call to _LT_SET_OPTION when you -put the `win32-dll' option into LT_INIT's first parameter.]) -]) - -dnl aclocal-1.4 backwards compatibility: -dnl AC_DEFUN([AC_LIBTOOL_WIN32_DLL], []) - - -# _LT_ENABLE_SHARED([DEFAULT]) -# ---------------------------- -# implement the --enable-shared flag, and supports the `shared' and -# `disable-shared' LT_INIT options. -# DEFAULT is either `yes' or `no'. If omitted, it defaults to `yes'. -m4_define([_LT_ENABLE_SHARED], -[m4_define([_LT_ENABLE_SHARED_DEFAULT], [m4_if($1, no, no, yes)])dnl -AC_ARG_ENABLE([shared], - [AS_HELP_STRING([--enable-shared@<:@=PKGS@:>@], - [build shared libraries @<:@default=]_LT_ENABLE_SHARED_DEFAULT[@:>@])], - [p=${PACKAGE-default} - case $enableval in - yes) enable_shared=yes ;; - no) enable_shared=no ;; - *) - enable_shared=no - # Look at the argument we got. We use all the common list separators. - lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," - for pkg in $enableval; do - IFS="$lt_save_ifs" - if test "X$pkg" = "X$p"; then - enable_shared=yes - fi - done - IFS="$lt_save_ifs" - ;; - esac], - [enable_shared=]_LT_ENABLE_SHARED_DEFAULT) - - _LT_DECL([build_libtool_libs], [enable_shared], [0], - [Whether or not to build shared libraries]) -])# _LT_ENABLE_SHARED - -LT_OPTION_DEFINE([LT_INIT], [shared], [_LT_ENABLE_SHARED([yes])]) -LT_OPTION_DEFINE([LT_INIT], [disable-shared], [_LT_ENABLE_SHARED([no])]) - -# Old names: -AC_DEFUN([AC_ENABLE_SHARED], -[_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[shared]) -]) - -AC_DEFUN([AC_DISABLE_SHARED], -[_LT_SET_OPTION([LT_INIT], [disable-shared]) -]) - -AU_DEFUN([AM_ENABLE_SHARED], [AC_ENABLE_SHARED($@)]) -AU_DEFUN([AM_DISABLE_SHARED], [AC_DISABLE_SHARED($@)]) - -dnl aclocal-1.4 backwards compatibility: -dnl AC_DEFUN([AM_ENABLE_SHARED], []) -dnl AC_DEFUN([AM_DISABLE_SHARED], []) - - - -# _LT_ENABLE_STATIC([DEFAULT]) -# ---------------------------- -# implement the --enable-static flag, and support the `static' and -# `disable-static' LT_INIT options. -# DEFAULT is either `yes' or `no'. If omitted, it defaults to `yes'. -m4_define([_LT_ENABLE_STATIC], -[m4_define([_LT_ENABLE_STATIC_DEFAULT], [m4_if($1, no, no, yes)])dnl -AC_ARG_ENABLE([static], - [AS_HELP_STRING([--enable-static@<:@=PKGS@:>@], - [build static libraries @<:@default=]_LT_ENABLE_STATIC_DEFAULT[@:>@])], - [p=${PACKAGE-default} - case $enableval in - yes) enable_static=yes ;; - no) enable_static=no ;; - *) - enable_static=no - # Look at the argument we got. We use all the common list separators. - lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," - for pkg in $enableval; do - IFS="$lt_save_ifs" - if test "X$pkg" = "X$p"; then - enable_static=yes - fi - done - IFS="$lt_save_ifs" - ;; - esac], - [enable_static=]_LT_ENABLE_STATIC_DEFAULT) - - _LT_DECL([build_old_libs], [enable_static], [0], - [Whether or not to build static libraries]) -])# _LT_ENABLE_STATIC - -LT_OPTION_DEFINE([LT_INIT], [static], [_LT_ENABLE_STATIC([yes])]) -LT_OPTION_DEFINE([LT_INIT], [disable-static], [_LT_ENABLE_STATIC([no])]) - -# Old names: -AC_DEFUN([AC_ENABLE_STATIC], -[_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[static]) -]) - -AC_DEFUN([AC_DISABLE_STATIC], -[_LT_SET_OPTION([LT_INIT], [disable-static]) -]) - -AU_DEFUN([AM_ENABLE_STATIC], [AC_ENABLE_STATIC($@)]) -AU_DEFUN([AM_DISABLE_STATIC], [AC_DISABLE_STATIC($@)]) - -dnl aclocal-1.4 backwards compatibility: -dnl AC_DEFUN([AM_ENABLE_STATIC], []) -dnl AC_DEFUN([AM_DISABLE_STATIC], []) - - - -# _LT_ENABLE_FAST_INSTALL([DEFAULT]) -# ---------------------------------- -# implement the --enable-fast-install flag, and support the `fast-install' -# and `disable-fast-install' LT_INIT options. -# DEFAULT is either `yes' or `no'. If omitted, it defaults to `yes'. -m4_define([_LT_ENABLE_FAST_INSTALL], -[m4_define([_LT_ENABLE_FAST_INSTALL_DEFAULT], [m4_if($1, no, no, yes)])dnl -AC_ARG_ENABLE([fast-install], - [AS_HELP_STRING([--enable-fast-install@<:@=PKGS@:>@], - [optimize for fast installation @<:@default=]_LT_ENABLE_FAST_INSTALL_DEFAULT[@:>@])], - [p=${PACKAGE-default} - case $enableval in - yes) enable_fast_install=yes ;; - no) enable_fast_install=no ;; - *) - enable_fast_install=no - # Look at the argument we got. We use all the common list separators. - lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," - for pkg in $enableval; do - IFS="$lt_save_ifs" - if test "X$pkg" = "X$p"; then - enable_fast_install=yes - fi - done - IFS="$lt_save_ifs" - ;; - esac], - [enable_fast_install=]_LT_ENABLE_FAST_INSTALL_DEFAULT) - -_LT_DECL([fast_install], [enable_fast_install], [0], - [Whether or not to optimize for fast installation])dnl -])# _LT_ENABLE_FAST_INSTALL - -LT_OPTION_DEFINE([LT_INIT], [fast-install], [_LT_ENABLE_FAST_INSTALL([yes])]) -LT_OPTION_DEFINE([LT_INIT], [disable-fast-install], [_LT_ENABLE_FAST_INSTALL([no])]) - -# Old names: -AU_DEFUN([AC_ENABLE_FAST_INSTALL], -[_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[fast-install]) -AC_DIAGNOSE([obsolete], -[$0: Remove this warning and the call to _LT_SET_OPTION when you put -the `fast-install' option into LT_INIT's first parameter.]) -]) - -AU_DEFUN([AC_DISABLE_FAST_INSTALL], -[_LT_SET_OPTION([LT_INIT], [disable-fast-install]) -AC_DIAGNOSE([obsolete], -[$0: Remove this warning and the call to _LT_SET_OPTION when you put -the `disable-fast-install' option into LT_INIT's first parameter.]) -]) - -dnl aclocal-1.4 backwards compatibility: -dnl AC_DEFUN([AC_ENABLE_FAST_INSTALL], []) -dnl AC_DEFUN([AM_DISABLE_FAST_INSTALL], []) - - -# _LT_WITH_PIC([MODE]) -# -------------------- -# implement the --with-pic flag, and support the `pic-only' and `no-pic' -# LT_INIT options. -# MODE is either `yes' or `no'. If omitted, it defaults to `both'. -m4_define([_LT_WITH_PIC], -[AC_ARG_WITH([pic], - [AS_HELP_STRING([--with-pic@<:@=PKGS@:>@], - [try to use only PIC/non-PIC objects @<:@default=use both@:>@])], - [lt_p=${PACKAGE-default} - case $withval in - yes|no) pic_mode=$withval ;; - *) - pic_mode=default - # Look at the argument we got. We use all the common list separators. - lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," - for lt_pkg in $withval; do - IFS="$lt_save_ifs" - if test "X$lt_pkg" = "X$lt_p"; then - pic_mode=yes - fi - done - IFS="$lt_save_ifs" - ;; - esac], - [pic_mode=default]) - -test -z "$pic_mode" && pic_mode=m4_default([$1], [default]) - -_LT_DECL([], [pic_mode], [0], [What type of objects to build])dnl -])# _LT_WITH_PIC - -LT_OPTION_DEFINE([LT_INIT], [pic-only], [_LT_WITH_PIC([yes])]) -LT_OPTION_DEFINE([LT_INIT], [no-pic], [_LT_WITH_PIC([no])]) - -# Old name: -AU_DEFUN([AC_LIBTOOL_PICMODE], -[_LT_SET_OPTION([LT_INIT], [pic-only]) -AC_DIAGNOSE([obsolete], -[$0: Remove this warning and the call to _LT_SET_OPTION when you -put the `pic-only' option into LT_INIT's first parameter.]) -]) - -dnl aclocal-1.4 backwards compatibility: -dnl AC_DEFUN([AC_LIBTOOL_PICMODE], []) - - -m4_define([_LTDL_MODE], []) -LT_OPTION_DEFINE([LTDL_INIT], [nonrecursive], - [m4_define([_LTDL_MODE], [nonrecursive])]) -LT_OPTION_DEFINE([LTDL_INIT], [recursive], - [m4_define([_LTDL_MODE], [recursive])]) -LT_OPTION_DEFINE([LTDL_INIT], [subproject], - [m4_define([_LTDL_MODE], [subproject])]) - -m4_define([_LTDL_TYPE], []) -LT_OPTION_DEFINE([LTDL_INIT], [installable], - [m4_define([_LTDL_TYPE], [installable])]) -LT_OPTION_DEFINE([LTDL_INIT], [convenience], - [m4_define([_LTDL_TYPE], [convenience])]) - -# ltsugar.m4 -- libtool m4 base layer. -*-Autoconf-*- -# -# Copyright (C) 2004, 2005, 2007, 2008 Free Software Foundation, Inc. -# Written by Gary V. Vaughan, 2004 -# -# This file is free software; the Free Software Foundation gives -# unlimited permission to copy and/or distribute it, with or without -# modifications, as long as this notice is preserved. - -# serial 6 ltsugar.m4 - -# This is to help aclocal find these macros, as it can't see m4_define. -AC_DEFUN([LTSUGAR_VERSION], [m4_if([0.1])]) - - -# lt_join(SEP, ARG1, [ARG2...]) -# ----------------------------- -# Produce ARG1SEPARG2...SEPARGn, omitting [] arguments and their -# associated separator. -# Needed until we can rely on m4_join from Autoconf 2.62, since all earlier -# versions in m4sugar had bugs. -m4_define([lt_join], -[m4_if([$#], [1], [], - [$#], [2], [[$2]], - [m4_if([$2], [], [], [[$2]_])$0([$1], m4_shift(m4_shift($@)))])]) -m4_define([_lt_join], -[m4_if([$#$2], [2], [], - [m4_if([$2], [], [], [[$1$2]])$0([$1], m4_shift(m4_shift($@)))])]) - - -# lt_car(LIST) -# lt_cdr(LIST) -# ------------ -# Manipulate m4 lists. -# These macros are necessary as long as will still need to support -# Autoconf-2.59 which quotes differently. -m4_define([lt_car], [[$1]]) -m4_define([lt_cdr], -[m4_if([$#], 0, [m4_fatal([$0: cannot be called without arguments])], - [$#], 1, [], - [m4_dquote(m4_shift($@))])]) -m4_define([lt_unquote], $1) - - -# lt_append(MACRO-NAME, STRING, [SEPARATOR]) -# ------------------------------------------ -# Redefine MACRO-NAME to hold its former content plus `SEPARATOR'`STRING'. -# Note that neither SEPARATOR nor STRING are expanded; they are appended -# to MACRO-NAME as is (leaving the expansion for when MACRO-NAME is invoked). -# No SEPARATOR is output if MACRO-NAME was previously undefined (different -# than defined and empty). -# -# This macro is needed until we can rely on Autoconf 2.62, since earlier -# versions of m4sugar mistakenly expanded SEPARATOR but not STRING. -m4_define([lt_append], -[m4_define([$1], - m4_ifdef([$1], [m4_defn([$1])[$3]])[$2])]) - - - -# lt_combine(SEP, PREFIX-LIST, INFIX, SUFFIX1, [SUFFIX2...]) -# ---------------------------------------------------------- -# Produce a SEP delimited list of all paired combinations of elements of -# PREFIX-LIST with SUFFIX1 through SUFFIXn. Each element of the list -# has the form PREFIXmINFIXSUFFIXn. -# Needed until we can rely on m4_combine added in Autoconf 2.62. -m4_define([lt_combine], -[m4_if(m4_eval([$# > 3]), [1], - [m4_pushdef([_Lt_sep], [m4_define([_Lt_sep], m4_defn([lt_car]))])]]dnl -[[m4_foreach([_Lt_prefix], [$2], - [m4_foreach([_Lt_suffix], - ]m4_dquote(m4_dquote(m4_shift(m4_shift(m4_shift($@)))))[, - [_Lt_sep([$1])[]m4_defn([_Lt_prefix])[$3]m4_defn([_Lt_suffix])])])])]) - - -# lt_if_append_uniq(MACRO-NAME, VARNAME, [SEPARATOR], [UNIQ], [NOT-UNIQ]) -# ----------------------------------------------------------------------- -# Iff MACRO-NAME does not yet contain VARNAME, then append it (delimited -# by SEPARATOR if supplied) and expand UNIQ, else NOT-UNIQ. -m4_define([lt_if_append_uniq], -[m4_ifdef([$1], - [m4_if(m4_index([$3]m4_defn([$1])[$3], [$3$2$3]), [-1], - [lt_append([$1], [$2], [$3])$4], - [$5])], - [lt_append([$1], [$2], [$3])$4])]) - - -# lt_dict_add(DICT, KEY, VALUE) -# ----------------------------- -m4_define([lt_dict_add], -[m4_define([$1($2)], [$3])]) - - -# lt_dict_add_subkey(DICT, KEY, SUBKEY, VALUE) -# -------------------------------------------- -m4_define([lt_dict_add_subkey], -[m4_define([$1($2:$3)], [$4])]) - - -# lt_dict_fetch(DICT, KEY, [SUBKEY]) -# ---------------------------------- -m4_define([lt_dict_fetch], -[m4_ifval([$3], - m4_ifdef([$1($2:$3)], [m4_defn([$1($2:$3)])]), - m4_ifdef([$1($2)], [m4_defn([$1($2)])]))]) - - -# lt_if_dict_fetch(DICT, KEY, [SUBKEY], VALUE, IF-TRUE, [IF-FALSE]) -# ----------------------------------------------------------------- -m4_define([lt_if_dict_fetch], -[m4_if(lt_dict_fetch([$1], [$2], [$3]), [$4], - [$5], - [$6])]) - - -# lt_dict_filter(DICT, [SUBKEY], VALUE, [SEPARATOR], KEY, [...]) -# -------------------------------------------------------------- -m4_define([lt_dict_filter], -[m4_if([$5], [], [], - [lt_join(m4_quote(m4_default([$4], [[, ]])), - lt_unquote(m4_split(m4_normalize(m4_foreach(_Lt_key, lt_car([m4_shiftn(4, $@)]), - [lt_if_dict_fetch([$1], _Lt_key, [$2], [$3], [_Lt_key ])])))))])[]dnl -]) - -# ltversion.m4 -- version numbers -*- Autoconf -*- -# -# Copyright (C) 2004 Free Software Foundation, Inc. -# Written by Scott James Remnant, 2004 -# -# This file is free software; the Free Software Foundation gives -# unlimited permission to copy and/or distribute it, with or without -# modifications, as long as this notice is preserved. - -# @configure_input@ - -# serial 3337 ltversion.m4 -# This file is part of GNU Libtool - -m4_define([LT_PACKAGE_VERSION], [2.4.2]) -m4_define([LT_PACKAGE_REVISION], [1.3337]) - -AC_DEFUN([LTVERSION_VERSION], -[macro_version='2.4.2' -macro_revision='1.3337' -_LT_DECL(, macro_version, 0, [Which release of libtool.m4 was used?]) -_LT_DECL(, macro_revision, 0) -]) - -# lt~obsolete.m4 -- aclocal satisfying obsolete definitions. -*-Autoconf-*- -# -# Copyright (C) 2004, 2005, 2007, 2009 Free Software Foundation, Inc. -# Written by Scott James Remnant, 2004. -# -# This file is free software; the Free Software Foundation gives -# unlimited permission to copy and/or distribute it, with or without -# modifications, as long as this notice is preserved. - -# serial 5 lt~obsolete.m4 - -# These exist entirely to fool aclocal when bootstrapping libtool. -# -# In the past libtool.m4 has provided macros via AC_DEFUN (or AU_DEFUN) -# which have later been changed to m4_define as they aren't part of the -# exported API, or moved to Autoconf or Automake where they belong. -# -# The trouble is, aclocal is a bit thick. It'll see the old AC_DEFUN -# in /usr/share/aclocal/libtool.m4 and remember it, then when it sees us -# using a macro with the same name in our local m4/libtool.m4 it'll -# pull the old libtool.m4 in (it doesn't see our shiny new m4_define -# and doesn't know about Autoconf macros at all.) -# -# So we provide this file, which has a silly filename so it's always -# included after everything else. This provides aclocal with the -# AC_DEFUNs it wants, but when m4 processes it, it doesn't do anything -# because those macros already exist, or will be overwritten later. -# We use AC_DEFUN over AU_DEFUN for compatibility with aclocal-1.6. -# -# Anytime we withdraw an AC_DEFUN or AU_DEFUN, remember to add it here. -# Yes, that means every name once taken will need to remain here until -# we give up compatibility with versions before 1.7, at which point -# we need to keep only those names which we still refer to. - -# This is to help aclocal find these macros, as it can't see m4_define. -AC_DEFUN([LTOBSOLETE_VERSION], [m4_if([1])]) - -m4_ifndef([AC_LIBTOOL_LINKER_OPTION], [AC_DEFUN([AC_LIBTOOL_LINKER_OPTION])]) -m4_ifndef([AC_PROG_EGREP], [AC_DEFUN([AC_PROG_EGREP])]) -m4_ifndef([_LT_AC_PROG_ECHO_BACKSLASH], [AC_DEFUN([_LT_AC_PROG_ECHO_BACKSLASH])]) -m4_ifndef([_LT_AC_SHELL_INIT], [AC_DEFUN([_LT_AC_SHELL_INIT])]) -m4_ifndef([_LT_AC_SYS_LIBPATH_AIX], [AC_DEFUN([_LT_AC_SYS_LIBPATH_AIX])]) -m4_ifndef([_LT_PROG_LTMAIN], [AC_DEFUN([_LT_PROG_LTMAIN])]) -m4_ifndef([_LT_AC_TAGVAR], [AC_DEFUN([_LT_AC_TAGVAR])]) -m4_ifndef([AC_LTDL_ENABLE_INSTALL], [AC_DEFUN([AC_LTDL_ENABLE_INSTALL])]) -m4_ifndef([AC_LTDL_PREOPEN], [AC_DEFUN([AC_LTDL_PREOPEN])]) -m4_ifndef([_LT_AC_SYS_COMPILER], [AC_DEFUN([_LT_AC_SYS_COMPILER])]) -m4_ifndef([_LT_AC_LOCK], [AC_DEFUN([_LT_AC_LOCK])]) -m4_ifndef([AC_LIBTOOL_SYS_OLD_ARCHIVE], [AC_DEFUN([AC_LIBTOOL_SYS_OLD_ARCHIVE])]) -m4_ifndef([_LT_AC_TRY_DLOPEN_SELF], [AC_DEFUN([_LT_AC_TRY_DLOPEN_SELF])]) -m4_ifndef([AC_LIBTOOL_PROG_CC_C_O], [AC_DEFUN([AC_LIBTOOL_PROG_CC_C_O])]) -m4_ifndef([AC_LIBTOOL_SYS_HARD_LINK_LOCKS], [AC_DEFUN([AC_LIBTOOL_SYS_HARD_LINK_LOCKS])]) -m4_ifndef([AC_LIBTOOL_OBJDIR], [AC_DEFUN([AC_LIBTOOL_OBJDIR])]) -m4_ifndef([AC_LTDL_OBJDIR], [AC_DEFUN([AC_LTDL_OBJDIR])]) -m4_ifndef([AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH], [AC_DEFUN([AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH])]) -m4_ifndef([AC_LIBTOOL_SYS_LIB_STRIP], [AC_DEFUN([AC_LIBTOOL_SYS_LIB_STRIP])]) -m4_ifndef([AC_PATH_MAGIC], [AC_DEFUN([AC_PATH_MAGIC])]) -m4_ifndef([AC_PROG_LD_GNU], [AC_DEFUN([AC_PROG_LD_GNU])]) -m4_ifndef([AC_PROG_LD_RELOAD_FLAG], [AC_DEFUN([AC_PROG_LD_RELOAD_FLAG])]) -m4_ifndef([AC_DEPLIBS_CHECK_METHOD], [AC_DEFUN([AC_DEPLIBS_CHECK_METHOD])]) -m4_ifndef([AC_LIBTOOL_PROG_COMPILER_NO_RTTI], [AC_DEFUN([AC_LIBTOOL_PROG_COMPILER_NO_RTTI])]) -m4_ifndef([AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE], [AC_DEFUN([AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE])]) -m4_ifndef([AC_LIBTOOL_PROG_COMPILER_PIC], [AC_DEFUN([AC_LIBTOOL_PROG_COMPILER_PIC])]) -m4_ifndef([AC_LIBTOOL_PROG_LD_SHLIBS], [AC_DEFUN([AC_LIBTOOL_PROG_LD_SHLIBS])]) -m4_ifndef([AC_LIBTOOL_POSTDEP_PREDEP], [AC_DEFUN([AC_LIBTOOL_POSTDEP_PREDEP])]) -m4_ifndef([LT_AC_PROG_EGREP], [AC_DEFUN([LT_AC_PROG_EGREP])]) -m4_ifndef([LT_AC_PROG_SED], [AC_DEFUN([LT_AC_PROG_SED])]) -m4_ifndef([_LT_CC_BASENAME], [AC_DEFUN([_LT_CC_BASENAME])]) -m4_ifndef([_LT_COMPILER_BOILERPLATE], [AC_DEFUN([_LT_COMPILER_BOILERPLATE])]) -m4_ifndef([_LT_LINKER_BOILERPLATE], [AC_DEFUN([_LT_LINKER_BOILERPLATE])]) -m4_ifndef([_AC_PROG_LIBTOOL], [AC_DEFUN([_AC_PROG_LIBTOOL])]) -m4_ifndef([AC_LIBTOOL_SETUP], [AC_DEFUN([AC_LIBTOOL_SETUP])]) -m4_ifndef([_LT_AC_CHECK_DLFCN], [AC_DEFUN([_LT_AC_CHECK_DLFCN])]) -m4_ifndef([AC_LIBTOOL_SYS_DYNAMIC_LINKER], [AC_DEFUN([AC_LIBTOOL_SYS_DYNAMIC_LINKER])]) -m4_ifndef([_LT_AC_TAGCONFIG], [AC_DEFUN([_LT_AC_TAGCONFIG])]) -m4_ifndef([AC_DISABLE_FAST_INSTALL], [AC_DEFUN([AC_DISABLE_FAST_INSTALL])]) -m4_ifndef([_LT_AC_LANG_CXX], [AC_DEFUN([_LT_AC_LANG_CXX])]) -m4_ifndef([_LT_AC_LANG_F77], [AC_DEFUN([_LT_AC_LANG_F77])]) -m4_ifndef([_LT_AC_LANG_GCJ], [AC_DEFUN([_LT_AC_LANG_GCJ])]) -m4_ifndef([AC_LIBTOOL_LANG_C_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_C_CONFIG])]) -m4_ifndef([_LT_AC_LANG_C_CONFIG], [AC_DEFUN([_LT_AC_LANG_C_CONFIG])]) -m4_ifndef([AC_LIBTOOL_LANG_CXX_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_CXX_CONFIG])]) -m4_ifndef([_LT_AC_LANG_CXX_CONFIG], [AC_DEFUN([_LT_AC_LANG_CXX_CONFIG])]) -m4_ifndef([AC_LIBTOOL_LANG_F77_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_F77_CONFIG])]) -m4_ifndef([_LT_AC_LANG_F77_CONFIG], [AC_DEFUN([_LT_AC_LANG_F77_CONFIG])]) -m4_ifndef([AC_LIBTOOL_LANG_GCJ_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_GCJ_CONFIG])]) -m4_ifndef([_LT_AC_LANG_GCJ_CONFIG], [AC_DEFUN([_LT_AC_LANG_GCJ_CONFIG])]) -m4_ifndef([AC_LIBTOOL_LANG_RC_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_RC_CONFIG])]) -m4_ifndef([_LT_AC_LANG_RC_CONFIG], [AC_DEFUN([_LT_AC_LANG_RC_CONFIG])]) -m4_ifndef([AC_LIBTOOL_CONFIG], [AC_DEFUN([AC_LIBTOOL_CONFIG])]) -m4_ifndef([_LT_AC_FILE_LTDLL_C], [AC_DEFUN([_LT_AC_FILE_LTDLL_C])]) -m4_ifndef([_LT_REQUIRED_DARWIN_CHECKS], [AC_DEFUN([_LT_REQUIRED_DARWIN_CHECKS])]) -m4_ifndef([_LT_AC_PROG_CXXCPP], [AC_DEFUN([_LT_AC_PROG_CXXCPP])]) -m4_ifndef([_LT_PREPARE_SED_QUOTE_VARS], [AC_DEFUN([_LT_PREPARE_SED_QUOTE_VARS])]) -m4_ifndef([_LT_PROG_ECHO_BACKSLASH], [AC_DEFUN([_LT_PROG_ECHO_BACKSLASH])]) -m4_ifndef([_LT_PROG_F77], [AC_DEFUN([_LT_PROG_F77])]) -m4_ifndef([_LT_PROG_FC], [AC_DEFUN([_LT_PROG_FC])]) -m4_ifndef([_LT_PROG_CXX], [AC_DEFUN([_LT_PROG_CXX])]) - -# Copyright (C) 2002, 2003, 2005, 2006, 2007, 2008, 2011 Free Software -# Foundation, Inc. -# -# This file is free software; the Free Software Foundation -# gives unlimited permission to copy and/or distribute it, -# with or without modifications, as long as this notice is preserved. - -# serial 1 - -# AM_AUTOMAKE_VERSION(VERSION) -# ---------------------------- -# Automake X.Y traces this macro to ensure aclocal.m4 has been -# generated from the m4 files accompanying Automake X.Y. -# (This private macro should not be called outside this file.) -AC_DEFUN([AM_AUTOMAKE_VERSION], -[am__api_version='1.11' -dnl Some users find AM_AUTOMAKE_VERSION and mistake it for a way to -dnl require some minimum version. Point them to the right macro. -m4_if([$1], [1.11.6], [], - [AC_FATAL([Do not call $0, use AM_INIT_AUTOMAKE([$1]).])])dnl -]) - -# _AM_AUTOCONF_VERSION(VERSION) -# ----------------------------- -# aclocal traces this macro to find the Autoconf version. -# This is a private macro too. Using m4_define simplifies -# the logic in aclocal, which can simply ignore this definition. -m4_define([_AM_AUTOCONF_VERSION], []) - -# AM_SET_CURRENT_AUTOMAKE_VERSION -# ------------------------------- -# Call AM_AUTOMAKE_VERSION and AM_AUTOMAKE_VERSION so they can be traced. -# This function is AC_REQUIREd by AM_INIT_AUTOMAKE. -AC_DEFUN([AM_SET_CURRENT_AUTOMAKE_VERSION], -[AM_AUTOMAKE_VERSION([1.11.6])dnl -m4_ifndef([AC_AUTOCONF_VERSION], - [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl -_AM_AUTOCONF_VERSION(m4_defn([AC_AUTOCONF_VERSION]))]) - -# AM_AUX_DIR_EXPAND -*- Autoconf -*- - -# Copyright (C) 2001, 2003, 2005, 2011 Free Software Foundation, Inc. -# -# This file is free software; the Free Software Foundation -# gives unlimited permission to copy and/or distribute it, -# with or without modifications, as long as this notice is preserved. - -# serial 1 - -# For projects using AC_CONFIG_AUX_DIR([foo]), Autoconf sets -# $ac_aux_dir to `$srcdir/foo'. In other projects, it is set to -# `$srcdir', `$srcdir/..', or `$srcdir/../..'. -# -# Of course, Automake must honor this variable whenever it calls a -# tool from the auxiliary directory. The problem is that $srcdir (and -# therefore $ac_aux_dir as well) can be either absolute or relative, -# depending on how configure is run. This is pretty annoying, since -# it makes $ac_aux_dir quite unusable in subdirectories: in the top -# source directory, any form will work fine, but in subdirectories a -# relative path needs to be adjusted first. -# -# $ac_aux_dir/missing -# fails when called from a subdirectory if $ac_aux_dir is relative -# $top_srcdir/$ac_aux_dir/missing -# fails if $ac_aux_dir is absolute, -# fails when called from a subdirectory in a VPATH build with -# a relative $ac_aux_dir -# -# The reason of the latter failure is that $top_srcdir and $ac_aux_dir -# are both prefixed by $srcdir. In an in-source build this is usually -# harmless because $srcdir is `.', but things will broke when you -# start a VPATH build or use an absolute $srcdir. -# -# So we could use something similar to $top_srcdir/$ac_aux_dir/missing, -# iff we strip the leading $srcdir from $ac_aux_dir. That would be: -# am_aux_dir='\$(top_srcdir)/'`expr "$ac_aux_dir" : "$srcdir//*\(.*\)"` -# and then we would define $MISSING as -# MISSING="\${SHELL} $am_aux_dir/missing" -# This will work as long as MISSING is not called from configure, because -# unfortunately $(top_srcdir) has no meaning in configure. -# However there are other variables, like CC, which are often used in -# configure, and could therefore not use this "fixed" $ac_aux_dir. -# -# Another solution, used here, is to always expand $ac_aux_dir to an -# absolute PATH. The drawback is that using absolute paths prevent a -# configured tree to be moved without reconfiguration. - -AC_DEFUN([AM_AUX_DIR_EXPAND], -[dnl Rely on autoconf to set up CDPATH properly. -AC_PREREQ([2.50])dnl -# expand $ac_aux_dir to an absolute path -am_aux_dir=`cd $ac_aux_dir && pwd` -]) - -# AM_CONDITIONAL -*- Autoconf -*- - -# Copyright (C) 1997, 2000, 2001, 2003, 2004, 2005, 2006, 2008 -# Free Software Foundation, Inc. -# -# This file is free software; the Free Software Foundation -# gives unlimited permission to copy and/or distribute it, -# with or without modifications, as long as this notice is preserved. - -# serial 9 - -# AM_CONDITIONAL(NAME, SHELL-CONDITION) -# ------------------------------------- -# Define a conditional. -AC_DEFUN([AM_CONDITIONAL], -[AC_PREREQ(2.52)dnl - ifelse([$1], [TRUE], [AC_FATAL([$0: invalid condition: $1])], - [$1], [FALSE], [AC_FATAL([$0: invalid condition: $1])])dnl -AC_SUBST([$1_TRUE])dnl -AC_SUBST([$1_FALSE])dnl -_AM_SUBST_NOTMAKE([$1_TRUE])dnl -_AM_SUBST_NOTMAKE([$1_FALSE])dnl -m4_define([_AM_COND_VALUE_$1], [$2])dnl -if $2; then - $1_TRUE= - $1_FALSE='#' -else - $1_TRUE='#' - $1_FALSE= -fi -AC_CONFIG_COMMANDS_PRE( -[if test -z "${$1_TRUE}" && test -z "${$1_FALSE}"; then - AC_MSG_ERROR([[conditional "$1" was never defined. -Usually this means the macro was only invoked conditionally.]]) -fi])]) - -# Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2009, -# 2010, 2011 Free Software Foundation, Inc. -# -# This file is free software; the Free Software Foundation -# gives unlimited permission to copy and/or distribute it, -# with or without modifications, as long as this notice is preserved. - -# serial 12 - -# There are a few dirty hacks below to avoid letting `AC_PROG_CC' be -# written in clear, in which case automake, when reading aclocal.m4, -# will think it sees a *use*, and therefore will trigger all it's -# C support machinery. Also note that it means that autoscan, seeing -# CC etc. in the Makefile, will ask for an AC_PROG_CC use... - - -# _AM_DEPENDENCIES(NAME) -# ---------------------- -# See how the compiler implements dependency checking. -# NAME is "CC", "CXX", "GCJ", or "OBJC". -# We try a few techniques and use that to set a single cache variable. -# -# We don't AC_REQUIRE the corresponding AC_PROG_CC since the latter was -# modified to invoke _AM_DEPENDENCIES(CC); we would have a circular -# dependency, and given that the user is not expected to run this macro, -# just rely on AC_PROG_CC. -AC_DEFUN([_AM_DEPENDENCIES], -[AC_REQUIRE([AM_SET_DEPDIR])dnl -AC_REQUIRE([AM_OUTPUT_DEPENDENCY_COMMANDS])dnl -AC_REQUIRE([AM_MAKE_INCLUDE])dnl -AC_REQUIRE([AM_DEP_TRACK])dnl - -ifelse([$1], CC, [depcc="$CC" am_compiler_list=], - [$1], CXX, [depcc="$CXX" am_compiler_list=], - [$1], OBJC, [depcc="$OBJC" am_compiler_list='gcc3 gcc'], - [$1], UPC, [depcc="$UPC" am_compiler_list=], - [$1], GCJ, [depcc="$GCJ" am_compiler_list='gcc3 gcc'], - [depcc="$$1" am_compiler_list=]) - -AC_CACHE_CHECK([dependency style of $depcc], - [am_cv_$1_dependencies_compiler_type], -[if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then - # We make a subdir and do the tests there. Otherwise we can end up - # making bogus files that we don't know about and never remove. For - # instance it was reported that on HP-UX the gcc test will end up - # making a dummy file named `D' -- because `-MD' means `put the output - # in D'. - rm -rf conftest.dir - mkdir conftest.dir - # Copy depcomp to subdir because otherwise we won't find it if we're - # using a relative directory. - cp "$am_depcomp" conftest.dir - cd conftest.dir - # We will build objects and dependencies in a subdirectory because - # it helps to detect inapplicable dependency modes. For instance - # both Tru64's cc and ICC support -MD to output dependencies as a - # side effect of compilation, but ICC will put the dependencies in - # the current directory while Tru64 will put them in the object - # directory. - mkdir sub - - am_cv_$1_dependencies_compiler_type=none - if test "$am_compiler_list" = ""; then - am_compiler_list=`sed -n ['s/^#*\([a-zA-Z0-9]*\))$/\1/p'] < ./depcomp` - fi - am__universal=false - m4_case([$1], [CC], - [case " $depcc " in #( - *\ -arch\ *\ -arch\ *) am__universal=true ;; - esac], - [CXX], - [case " $depcc " in #( - *\ -arch\ *\ -arch\ *) am__universal=true ;; - esac]) - - for depmode in $am_compiler_list; do - # Setup a source with many dependencies, because some compilers - # like to wrap large dependency lists on column 80 (with \), and - # we should not choose a depcomp mode which is confused by this. - # - # We need to recreate these files for each test, as the compiler may - # overwrite some of them when testing with obscure command lines. - # This happens at least with the AIX C compiler. - : > sub/conftest.c - for i in 1 2 3 4 5 6; do - echo '#include "conftst'$i'.h"' >> sub/conftest.c - # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with - # Solaris 8's {/usr,}/bin/sh. - touch sub/conftst$i.h - done - echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf - - # We check with `-c' and `-o' for the sake of the "dashmstdout" - # mode. It turns out that the SunPro C++ compiler does not properly - # handle `-M -o', and we need to detect this. Also, some Intel - # versions had trouble with output in subdirs - am__obj=sub/conftest.${OBJEXT-o} - am__minus_obj="-o $am__obj" - case $depmode in - gcc) - # This depmode causes a compiler race in universal mode. - test "$am__universal" = false || continue - ;; - nosideeffect) - # after this tag, mechanisms are not by side-effect, so they'll - # only be used when explicitly requested - if test "x$enable_dependency_tracking" = xyes; then - continue - else - break - fi - ;; - msvc7 | msvc7msys | msvisualcpp | msvcmsys) - # This compiler won't grok `-c -o', but also, the minuso test has - # not run yet. These depmodes are late enough in the game, and - # so weak that their functioning should not be impacted. - am__obj=conftest.${OBJEXT-o} - am__minus_obj= - ;; - none) break ;; - esac - if depmode=$depmode \ - source=sub/conftest.c object=$am__obj \ - depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ - $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ - >/dev/null 2>conftest.err && - grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && - grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && - grep $am__obj sub/conftest.Po > /dev/null 2>&1 && - ${MAKE-make} -s -f confmf > /dev/null 2>&1; then - # icc doesn't choke on unknown options, it will just issue warnings - # or remarks (even with -Werror). So we grep stderr for any message - # that says an option was ignored or not supported. - # When given -MP, icc 7.0 and 7.1 complain thusly: - # icc: Command line warning: ignoring option '-M'; no argument required - # The diagnosis changed in icc 8.0: - # icc: Command line remark: option '-MP' not supported - if (grep 'ignoring option' conftest.err || - grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else - am_cv_$1_dependencies_compiler_type=$depmode - break - fi - fi - done - - cd .. - rm -rf conftest.dir -else - am_cv_$1_dependencies_compiler_type=none -fi -]) -AC_SUBST([$1DEPMODE], [depmode=$am_cv_$1_dependencies_compiler_type]) -AM_CONDITIONAL([am__fastdep$1], [ - test "x$enable_dependency_tracking" != xno \ - && test "$am_cv_$1_dependencies_compiler_type" = gcc3]) -]) - - -# AM_SET_DEPDIR -# ------------- -# Choose a directory name for dependency files. -# This macro is AC_REQUIREd in _AM_DEPENDENCIES -AC_DEFUN([AM_SET_DEPDIR], -[AC_REQUIRE([AM_SET_LEADING_DOT])dnl -AC_SUBST([DEPDIR], ["${am__leading_dot}deps"])dnl -]) - - -# AM_DEP_TRACK -# ------------ -AC_DEFUN([AM_DEP_TRACK], -[AC_ARG_ENABLE(dependency-tracking, -[ --disable-dependency-tracking speeds up one-time build - --enable-dependency-tracking do not reject slow dependency extractors]) -if test "x$enable_dependency_tracking" != xno; then - am_depcomp="$ac_aux_dir/depcomp" - AMDEPBACKSLASH='\' - am__nodep='_no' -fi -AM_CONDITIONAL([AMDEP], [test "x$enable_dependency_tracking" != xno]) -AC_SUBST([AMDEPBACKSLASH])dnl -_AM_SUBST_NOTMAKE([AMDEPBACKSLASH])dnl -AC_SUBST([am__nodep])dnl -_AM_SUBST_NOTMAKE([am__nodep])dnl -]) - -# Generate code to set up dependency tracking. -*- Autoconf -*- - -# Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2008 -# Free Software Foundation, Inc. -# -# This file is free software; the Free Software Foundation -# gives unlimited permission to copy and/or distribute it, -# with or without modifications, as long as this notice is preserved. - -#serial 5 - -# _AM_OUTPUT_DEPENDENCY_COMMANDS -# ------------------------------ -AC_DEFUN([_AM_OUTPUT_DEPENDENCY_COMMANDS], -[{ - # Autoconf 2.62 quotes --file arguments for eval, but not when files - # are listed without --file. Let's play safe and only enable the eval - # if we detect the quoting. - case $CONFIG_FILES in - *\'*) eval set x "$CONFIG_FILES" ;; - *) set x $CONFIG_FILES ;; - esac - shift - for mf - do - # Strip MF so we end up with the name of the file. - mf=`echo "$mf" | sed -e 's/:.*$//'` - # Check whether this is an Automake generated Makefile or not. - # We used to match only the files named `Makefile.in', but - # some people rename them; so instead we look at the file content. - # Grep'ing the first line is not enough: some people post-process - # each Makefile.in and add a new line on top of each file to say so. - # Grep'ing the whole file is not good either: AIX grep has a line - # limit of 2048, but all sed's we know have understand at least 4000. - if sed -n 's,^#.*generated by automake.*,X,p' "$mf" | grep X >/dev/null 2>&1; then - dirpart=`AS_DIRNAME("$mf")` - else - continue - fi - # Extract the definition of DEPDIR, am__include, and am__quote - # from the Makefile without running `make'. - DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"` - test -z "$DEPDIR" && continue - am__include=`sed -n 's/^am__include = //p' < "$mf"` - test -z "am__include" && continue - am__quote=`sed -n 's/^am__quote = //p' < "$mf"` - # When using ansi2knr, U may be empty or an underscore; expand it - U=`sed -n 's/^U = //p' < "$mf"` - # Find all dependency output files, they are included files with - # $(DEPDIR) in their names. We invoke sed twice because it is the - # simplest approach to changing $(DEPDIR) to its actual value in the - # expansion. - for file in `sed -n " - s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \ - sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g' -e 's/\$U/'"$U"'/g'`; do - # Make sure the directory exists. - test -f "$dirpart/$file" && continue - fdir=`AS_DIRNAME(["$file"])` - AS_MKDIR_P([$dirpart/$fdir]) - # echo "creating $dirpart/$file" - echo '# dummy' > "$dirpart/$file" - done - done -} -])# _AM_OUTPUT_DEPENDENCY_COMMANDS - - -# AM_OUTPUT_DEPENDENCY_COMMANDS -# ----------------------------- -# This macro should only be invoked once -- use via AC_REQUIRE. -# -# This code is only required when automatic dependency tracking -# is enabled. FIXME. This creates each `.P' file that we will -# need in order to bootstrap the dependency handling code. -AC_DEFUN([AM_OUTPUT_DEPENDENCY_COMMANDS], -[AC_CONFIG_COMMANDS([depfiles], - [test x"$AMDEP_TRUE" != x"" || _AM_OUTPUT_DEPENDENCY_COMMANDS], - [AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir"]) -]) - -# Do all the work for Automake. -*- Autoconf -*- - -# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, -# 2005, 2006, 2008, 2009 Free Software Foundation, Inc. -# -# This file is free software; the Free Software Foundation -# gives unlimited permission to copy and/or distribute it, -# with or without modifications, as long as this notice is preserved. - -# serial 16 - -# This macro actually does too much. Some checks are only needed if -# your package does certain things. But this isn't really a big deal. - -# AM_INIT_AUTOMAKE(PACKAGE, VERSION, [NO-DEFINE]) -# AM_INIT_AUTOMAKE([OPTIONS]) -# ----------------------------------------------- -# The call with PACKAGE and VERSION arguments is the old style -# call (pre autoconf-2.50), which is being phased out. PACKAGE -# and VERSION should now be passed to AC_INIT and removed from -# the call to AM_INIT_AUTOMAKE. -# We support both call styles for the transition. After -# the next Automake release, Autoconf can make the AC_INIT -# arguments mandatory, and then we can depend on a new Autoconf -# release and drop the old call support. -AC_DEFUN([AM_INIT_AUTOMAKE], -[AC_PREREQ([2.62])dnl -dnl Autoconf wants to disallow AM_ names. We explicitly allow -dnl the ones we care about. -m4_pattern_allow([^AM_[A-Z]+FLAGS$])dnl -AC_REQUIRE([AM_SET_CURRENT_AUTOMAKE_VERSION])dnl -AC_REQUIRE([AC_PROG_INSTALL])dnl -if test "`cd $srcdir && pwd`" != "`pwd`"; then - # Use -I$(srcdir) only when $(srcdir) != ., so that make's output - # is not polluted with repeated "-I." - AC_SUBST([am__isrc], [' -I$(srcdir)'])_AM_SUBST_NOTMAKE([am__isrc])dnl - # test to see if srcdir already configured - if test -f $srcdir/config.status; then - AC_MSG_ERROR([source directory already configured; run "make distclean" there first]) - fi -fi - -# test whether we have cygpath -if test -z "$CYGPATH_W"; then - if (cygpath --version) >/dev/null 2>/dev/null; then - CYGPATH_W='cygpath -w' - else - CYGPATH_W=echo - fi -fi -AC_SUBST([CYGPATH_W]) - -# Define the identity of the package. -dnl Distinguish between old-style and new-style calls. -m4_ifval([$2], -[m4_ifval([$3], [_AM_SET_OPTION([no-define])])dnl - AC_SUBST([PACKAGE], [$1])dnl - AC_SUBST([VERSION], [$2])], -[_AM_SET_OPTIONS([$1])dnl -dnl Diagnose old-style AC_INIT with new-style AM_AUTOMAKE_INIT. -m4_if(m4_ifdef([AC_PACKAGE_NAME], 1)m4_ifdef([AC_PACKAGE_VERSION], 1), 11,, - [m4_fatal([AC_INIT should be called with package and version arguments])])dnl - AC_SUBST([PACKAGE], ['AC_PACKAGE_TARNAME'])dnl - AC_SUBST([VERSION], ['AC_PACKAGE_VERSION'])])dnl - -_AM_IF_OPTION([no-define],, -[AC_DEFINE_UNQUOTED(PACKAGE, "$PACKAGE", [Name of package]) - AC_DEFINE_UNQUOTED(VERSION, "$VERSION", [Version number of package])])dnl - -# Some tools Automake needs. -AC_REQUIRE([AM_SANITY_CHECK])dnl -AC_REQUIRE([AC_ARG_PROGRAM])dnl -AM_MISSING_PROG(ACLOCAL, aclocal-${am__api_version}) -AM_MISSING_PROG(AUTOCONF, autoconf) -AM_MISSING_PROG(AUTOMAKE, automake-${am__api_version}) -AM_MISSING_PROG(AUTOHEADER, autoheader) -AM_MISSING_PROG(MAKEINFO, makeinfo) -AC_REQUIRE([AM_PROG_INSTALL_SH])dnl -AC_REQUIRE([AM_PROG_INSTALL_STRIP])dnl -AC_REQUIRE([AM_PROG_MKDIR_P])dnl -# We need awk for the "check" target. The system "awk" is bad on -# some platforms. -AC_REQUIRE([AC_PROG_AWK])dnl -AC_REQUIRE([AC_PROG_MAKE_SET])dnl -AC_REQUIRE([AM_SET_LEADING_DOT])dnl -_AM_IF_OPTION([tar-ustar], [_AM_PROG_TAR([ustar])], - [_AM_IF_OPTION([tar-pax], [_AM_PROG_TAR([pax])], - [_AM_PROG_TAR([v7])])]) -_AM_IF_OPTION([no-dependencies],, -[AC_PROVIDE_IFELSE([AC_PROG_CC], - [_AM_DEPENDENCIES(CC)], - [define([AC_PROG_CC], - defn([AC_PROG_CC])[_AM_DEPENDENCIES(CC)])])dnl -AC_PROVIDE_IFELSE([AC_PROG_CXX], - [_AM_DEPENDENCIES(CXX)], - [define([AC_PROG_CXX], - defn([AC_PROG_CXX])[_AM_DEPENDENCIES(CXX)])])dnl -AC_PROVIDE_IFELSE([AC_PROG_OBJC], - [_AM_DEPENDENCIES(OBJC)], - [define([AC_PROG_OBJC], - defn([AC_PROG_OBJC])[_AM_DEPENDENCIES(OBJC)])])dnl -]) -_AM_IF_OPTION([silent-rules], [AC_REQUIRE([AM_SILENT_RULES])])dnl -dnl The `parallel-tests' driver may need to know about EXEEXT, so add the -dnl `am__EXEEXT' conditional if _AM_COMPILER_EXEEXT was seen. This macro -dnl is hooked onto _AC_COMPILER_EXEEXT early, see below. -AC_CONFIG_COMMANDS_PRE(dnl -[m4_provide_if([_AM_COMPILER_EXEEXT], - [AM_CONDITIONAL([am__EXEEXT], [test -n "$EXEEXT"])])])dnl -]) - -dnl Hook into `_AC_COMPILER_EXEEXT' early to learn its expansion. Do not -dnl add the conditional right here, as _AC_COMPILER_EXEEXT may be further -dnl mangled by Autoconf and run in a shell conditional statement. -m4_define([_AC_COMPILER_EXEEXT], -m4_defn([_AC_COMPILER_EXEEXT])[m4_provide([_AM_COMPILER_EXEEXT])]) - - -# When config.status generates a header, we must update the stamp-h file. -# This file resides in the same directory as the config header -# that is generated. The stamp files are numbered to have different names. - -# Autoconf calls _AC_AM_CONFIG_HEADER_HOOK (when defined) in the -# loop where config.status creates the headers, so we can generate -# our stamp files there. -AC_DEFUN([_AC_AM_CONFIG_HEADER_HOOK], -[# Compute $1's index in $config_headers. -_am_arg=$1 -_am_stamp_count=1 -for _am_header in $config_headers :; do - case $_am_header in - $_am_arg | $_am_arg:* ) - break ;; - * ) - _am_stamp_count=`expr $_am_stamp_count + 1` ;; - esac -done -echo "timestamp for $_am_arg" >`AS_DIRNAME(["$_am_arg"])`/stamp-h[]$_am_stamp_count]) - -# Copyright (C) 2001, 2003, 2005, 2008, 2011 Free Software Foundation, -# Inc. -# -# This file is free software; the Free Software Foundation -# gives unlimited permission to copy and/or distribute it, -# with or without modifications, as long as this notice is preserved. - -# serial 1 - -# AM_PROG_INSTALL_SH -# ------------------ -# Define $install_sh. -AC_DEFUN([AM_PROG_INSTALL_SH], -[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl -if test x"${install_sh}" != xset; then - case $am_aux_dir in - *\ * | *\ *) - install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;; - *) - install_sh="\${SHELL} $am_aux_dir/install-sh" - esac -fi -AC_SUBST(install_sh)]) - -# Copyright (C) 2003, 2005 Free Software Foundation, Inc. -# -# This file is free software; the Free Software Foundation -# gives unlimited permission to copy and/or distribute it, -# with or without modifications, as long as this notice is preserved. - -# serial 2 - -# Check whether the underlying file-system supports filenames -# with a leading dot. For instance MS-DOS doesn't. -AC_DEFUN([AM_SET_LEADING_DOT], -[rm -rf .tst 2>/dev/null -mkdir .tst 2>/dev/null -if test -d .tst; then - am__leading_dot=. -else - am__leading_dot=_ -fi -rmdir .tst 2>/dev/null -AC_SUBST([am__leading_dot])]) - -# Check to see how 'make' treats includes. -*- Autoconf -*- - -# Copyright (C) 2001, 2002, 2003, 2005, 2009 Free Software Foundation, Inc. -# -# This file is free software; the Free Software Foundation -# gives unlimited permission to copy and/or distribute it, -# with or without modifications, as long as this notice is preserved. - -# serial 4 - -# AM_MAKE_INCLUDE() -# ----------------- -# Check to see how make treats includes. -AC_DEFUN([AM_MAKE_INCLUDE], -[am_make=${MAKE-make} -cat > confinc << 'END' -am__doit: - @echo this is the am__doit target -.PHONY: am__doit -END -# If we don't find an include directive, just comment out the code. -AC_MSG_CHECKING([for style of include used by $am_make]) -am__include="#" -am__quote= -_am_result=none -# First try GNU make style include. -echo "include confinc" > confmf -# Ignore all kinds of additional output from `make'. -case `$am_make -s -f confmf 2> /dev/null` in #( -*the\ am__doit\ target*) - am__include=include - am__quote= - _am_result=GNU - ;; -esac -# Now try BSD make style include. -if test "$am__include" = "#"; then - echo '.include "confinc"' > confmf - case `$am_make -s -f confmf 2> /dev/null` in #( - *the\ am__doit\ target*) - am__include=.include - am__quote="\"" - _am_result=BSD - ;; - esac -fi -AC_SUBST([am__include]) -AC_SUBST([am__quote]) -AC_MSG_RESULT([$_am_result]) -rm -f confinc confmf -]) - -# Copyright (C) 1999, 2000, 2001, 2003, 2004, 2005, 2008 -# Free Software Foundation, Inc. -# -# This file is free software; the Free Software Foundation -# gives unlimited permission to copy and/or distribute it, -# with or without modifications, as long as this notice is preserved. - -# serial 6 - -# AM_PROG_CC_C_O -# -------------- -# Like AC_PROG_CC_C_O, but changed for automake. -AC_DEFUN([AM_PROG_CC_C_O], -[AC_REQUIRE([AC_PROG_CC_C_O])dnl -AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl -AC_REQUIRE_AUX_FILE([compile])dnl -# FIXME: we rely on the cache variable name because -# there is no other way. -set dummy $CC -am_cc=`echo $[2] | sed ['s/[^a-zA-Z0-9_]/_/g;s/^[0-9]/_/']` -eval am_t=\$ac_cv_prog_cc_${am_cc}_c_o -if test "$am_t" != yes; then - # Losing compiler, so override with the script. - # FIXME: It is wrong to rewrite CC. - # But if we don't then we get into trouble of one sort or another. - # A longer-term fix would be to have automake use am__CC in this case, - # and then we could set am__CC="\$(top_srcdir)/compile \$(CC)" - CC="$am_aux_dir/compile $CC" -fi -dnl Make sure AC_PROG_CC is never called again, or it will override our -dnl setting of CC. -m4_define([AC_PROG_CC], - [m4_fatal([AC_PROG_CC cannot be called after AM_PROG_CC_C_O])]) -]) - -# Fake the existence of programs that GNU maintainers use. -*- Autoconf -*- - -# Copyright (C) 1997, 1999, 2000, 2001, 2003, 2004, 2005, 2008 -# Free Software Foundation, Inc. -# -# This file is free software; the Free Software Foundation -# gives unlimited permission to copy and/or distribute it, -# with or without modifications, as long as this notice is preserved. - -# serial 6 - -# AM_MISSING_PROG(NAME, PROGRAM) -# ------------------------------ -AC_DEFUN([AM_MISSING_PROG], -[AC_REQUIRE([AM_MISSING_HAS_RUN]) -$1=${$1-"${am_missing_run}$2"} -AC_SUBST($1)]) - - -# AM_MISSING_HAS_RUN -# ------------------ -# Define MISSING if not defined so far and test if it supports --run. -# If it does, set am_missing_run to use it, otherwise, to nothing. -AC_DEFUN([AM_MISSING_HAS_RUN], -[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl -AC_REQUIRE_AUX_FILE([missing])dnl -if test x"${MISSING+set}" != xset; then - case $am_aux_dir in - *\ * | *\ *) - MISSING="\${SHELL} \"$am_aux_dir/missing\"" ;; - *) - MISSING="\${SHELL} $am_aux_dir/missing" ;; - esac -fi -# Use eval to expand $SHELL -if eval "$MISSING --run true"; then - am_missing_run="$MISSING --run " -else - am_missing_run= - AC_MSG_WARN([`missing' script is too old or missing]) -fi -]) - -# Copyright (C) 2003, 2004, 2005, 2006, 2011 Free Software Foundation, -# Inc. -# -# This file is free software; the Free Software Foundation -# gives unlimited permission to copy and/or distribute it, -# with or without modifications, as long as this notice is preserved. - -# serial 1 - -# AM_PROG_MKDIR_P -# --------------- -# Check for `mkdir -p'. -AC_DEFUN([AM_PROG_MKDIR_P], -[AC_PREREQ([2.60])dnl -AC_REQUIRE([AC_PROG_MKDIR_P])dnl -dnl Automake 1.8 to 1.9.6 used to define mkdir_p. We now use MKDIR_P, -dnl while keeping a definition of mkdir_p for backward compatibility. -dnl @MKDIR_P@ is magic: AC_OUTPUT adjusts its value for each Makefile. -dnl However we cannot define mkdir_p as $(MKDIR_P) for the sake of -dnl Makefile.ins that do not define MKDIR_P, so we do our own -dnl adjustment using top_builddir (which is defined more often than -dnl MKDIR_P). -AC_SUBST([mkdir_p], ["$MKDIR_P"])dnl -case $mkdir_p in - [[\\/$]]* | ?:[[\\/]]*) ;; - */*) mkdir_p="\$(top_builddir)/$mkdir_p" ;; -esac -]) - -# Helper functions for option handling. -*- Autoconf -*- - -# Copyright (C) 2001, 2002, 2003, 2005, 2008, 2010 Free Software -# Foundation, Inc. -# -# This file is free software; the Free Software Foundation -# gives unlimited permission to copy and/or distribute it, -# with or without modifications, as long as this notice is preserved. - -# serial 5 - -# _AM_MANGLE_OPTION(NAME) -# ----------------------- -AC_DEFUN([_AM_MANGLE_OPTION], -[[_AM_OPTION_]m4_bpatsubst($1, [[^a-zA-Z0-9_]], [_])]) - -# _AM_SET_OPTION(NAME) -# -------------------- -# Set option NAME. Presently that only means defining a flag for this option. -AC_DEFUN([_AM_SET_OPTION], -[m4_define(_AM_MANGLE_OPTION([$1]), 1)]) - -# _AM_SET_OPTIONS(OPTIONS) -# ------------------------ -# OPTIONS is a space-separated list of Automake options. -AC_DEFUN([_AM_SET_OPTIONS], -[m4_foreach_w([_AM_Option], [$1], [_AM_SET_OPTION(_AM_Option)])]) - -# _AM_IF_OPTION(OPTION, IF-SET, [IF-NOT-SET]) -# ------------------------------------------- -# Execute IF-SET if OPTION is set, IF-NOT-SET otherwise. -AC_DEFUN([_AM_IF_OPTION], -[m4_ifset(_AM_MANGLE_OPTION([$1]), [$2], [$3])]) - -# Check to make sure that the build environment is sane. -*- Autoconf -*- - -# Copyright (C) 1996, 1997, 2000, 2001, 2003, 2005, 2008 -# Free Software Foundation, Inc. -# -# This file is free software; the Free Software Foundation -# gives unlimited permission to copy and/or distribute it, -# with or without modifications, as long as this notice is preserved. - -# serial 5 - -# AM_SANITY_CHECK -# --------------- -AC_DEFUN([AM_SANITY_CHECK], -[AC_MSG_CHECKING([whether build environment is sane]) -# Just in case -sleep 1 -echo timestamp > conftest.file -# Reject unsafe characters in $srcdir or the absolute working directory -# name. Accept space and tab only in the latter. -am_lf=' -' -case `pwd` in - *[[\\\"\#\$\&\'\`$am_lf]]*) - AC_MSG_ERROR([unsafe absolute working directory name]);; -esac -case $srcdir in - *[[\\\"\#\$\&\'\`$am_lf\ \ ]]*) - AC_MSG_ERROR([unsafe srcdir value: `$srcdir']);; -esac - -# Do `set' in a subshell so we don't clobber the current shell's -# arguments. Must try -L first in case configure is actually a -# symlink; some systems play weird games with the mod time of symlinks -# (eg FreeBSD returns the mod time of the symlink's containing -# directory). -if ( - set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null` - if test "$[*]" = "X"; then - # -L didn't work. - set X `ls -t "$srcdir/configure" conftest.file` - fi - rm -f conftest.file - if test "$[*]" != "X $srcdir/configure conftest.file" \ - && test "$[*]" != "X conftest.file $srcdir/configure"; then - - # If neither matched, then we have a broken ls. This can happen - # if, for instance, CONFIG_SHELL is bash and it inherits a - # broken ls alias from the environment. This has actually - # happened. Such a system could not be considered "sane". - AC_MSG_ERROR([ls -t appears to fail. Make sure there is not a broken -alias in your environment]) - fi - - test "$[2]" = conftest.file - ) -then - # Ok. - : -else - AC_MSG_ERROR([newly created file is older than distributed files! -Check your system clock]) -fi -AC_MSG_RESULT(yes)]) - -# Copyright (C) 2001, 2003, 2005, 2011 Free Software Foundation, Inc. -# -# This file is free software; the Free Software Foundation -# gives unlimited permission to copy and/or distribute it, -# with or without modifications, as long as this notice is preserved. - -# serial 1 - -# AM_PROG_INSTALL_STRIP -# --------------------- -# One issue with vendor `install' (even GNU) is that you can't -# specify the program used to strip binaries. This is especially -# annoying in cross-compiling environments, where the build's strip -# is unlikely to handle the host's binaries. -# Fortunately install-sh will honor a STRIPPROG variable, so we -# always use install-sh in `make install-strip', and initialize -# STRIPPROG with the value of the STRIP variable (set by the user). -AC_DEFUN([AM_PROG_INSTALL_STRIP], -[AC_REQUIRE([AM_PROG_INSTALL_SH])dnl -# Installed binaries are usually stripped using `strip' when the user -# run `make install-strip'. However `strip' might not be the right -# tool to use in cross-compilation environments, therefore Automake -# will honor the `STRIP' environment variable to overrule this program. -dnl Don't test for $cross_compiling = yes, because it might be `maybe'. -if test "$cross_compiling" != no; then - AC_CHECK_TOOL([STRIP], [strip], :) -fi -INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s" -AC_SUBST([INSTALL_STRIP_PROGRAM])]) - -# Copyright (C) 2006, 2008, 2010 Free Software Foundation, Inc. -# -# This file is free software; the Free Software Foundation -# gives unlimited permission to copy and/or distribute it, -# with or without modifications, as long as this notice is preserved. - -# serial 3 - -# _AM_SUBST_NOTMAKE(VARIABLE) -# --------------------------- -# Prevent Automake from outputting VARIABLE = @VARIABLE@ in Makefile.in. -# This macro is traced by Automake. -AC_DEFUN([_AM_SUBST_NOTMAKE]) - -# AM_SUBST_NOTMAKE(VARIABLE) -# -------------------------- -# Public sister of _AM_SUBST_NOTMAKE. -AC_DEFUN([AM_SUBST_NOTMAKE], [_AM_SUBST_NOTMAKE($@)]) - -# Check how to create a tarball. -*- Autoconf -*- - -# Copyright (C) 2004, 2005, 2012 Free Software Foundation, Inc. -# -# This file is free software; the Free Software Foundation -# gives unlimited permission to copy and/or distribute it, -# with or without modifications, as long as this notice is preserved. - -# serial 2 - -# _AM_PROG_TAR(FORMAT) -# -------------------- -# Check how to create a tarball in format FORMAT. -# FORMAT should be one of `v7', `ustar', or `pax'. -# -# Substitute a variable $(am__tar) that is a command -# writing to stdout a FORMAT-tarball containing the directory -# $tardir. -# tardir=directory && $(am__tar) > result.tar -# -# Substitute a variable $(am__untar) that extract such -# a tarball read from stdin. -# $(am__untar) < result.tar -AC_DEFUN([_AM_PROG_TAR], -[# Always define AMTAR for backward compatibility. Yes, it's still used -# in the wild :-( We should find a proper way to deprecate it ... -AC_SUBST([AMTAR], ['$${TAR-tar}']) -m4_if([$1], [v7], - [am__tar='$${TAR-tar} chof - "$$tardir"' am__untar='$${TAR-tar} xf -'], - [m4_case([$1], [ustar],, [pax],, - [m4_fatal([Unknown tar format])]) -AC_MSG_CHECKING([how to create a $1 tar archive]) -# Loop over all known methods to create a tar archive until one works. -_am_tools='gnutar m4_if([$1], [ustar], [plaintar]) pax cpio none' -_am_tools=${am_cv_prog_tar_$1-$_am_tools} -# Do not fold the above two line into one, because Tru64 sh and -# Solaris sh will not grok spaces in the rhs of `-'. -for _am_tool in $_am_tools -do - case $_am_tool in - gnutar) - for _am_tar in tar gnutar gtar; - do - AM_RUN_LOG([$_am_tar --version]) && break - done - am__tar="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$$tardir"' - am__tar_="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$tardir"' - am__untar="$_am_tar -xf -" - ;; - plaintar) - # Must skip GNU tar: if it does not support --format= it doesn't create - # ustar tarball either. - (tar --version) >/dev/null 2>&1 && continue - am__tar='tar chf - "$$tardir"' - am__tar_='tar chf - "$tardir"' - am__untar='tar xf -' - ;; - pax) - am__tar='pax -L -x $1 -w "$$tardir"' - am__tar_='pax -L -x $1 -w "$tardir"' - am__untar='pax -r' - ;; - cpio) - am__tar='find "$$tardir" -print | cpio -o -H $1 -L' - am__tar_='find "$tardir" -print | cpio -o -H $1 -L' - am__untar='cpio -i -H $1 -d' - ;; - none) - am__tar=false - am__tar_=false - am__untar=false - ;; - esac - - # If the value was cached, stop now. We just wanted to have am__tar - # and am__untar set. - test -n "${am_cv_prog_tar_$1}" && break - - # tar/untar a dummy directory, and stop if the command works - rm -rf conftest.dir - mkdir conftest.dir - echo GrepMe > conftest.dir/file - AM_RUN_LOG([tardir=conftest.dir && eval $am__tar_ >conftest.tar]) - rm -rf conftest.dir - if test -s conftest.tar; then - AM_RUN_LOG([$am__untar /dev/null 2>&1 && break - fi -done -rm -rf conftest.dir - -AC_CACHE_VAL([am_cv_prog_tar_$1], [am_cv_prog_tar_$1=$_am_tool]) -AC_MSG_RESULT([$am_cv_prog_tar_$1])]) -AC_SUBST([am__tar]) -AC_SUBST([am__untar]) -]) # _AM_PROG_TAR - -m4_include([acinclude.m4]) diff --git a/pkg/registry/zookeeper-3.4.6/src/c/aminclude.am b/pkg/registry/zookeeper-3.4.6/src/c/aminclude.am deleted file mode 100644 index 420049eca..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/c/aminclude.am +++ /dev/null @@ -1,186 +0,0 @@ -# Copyright (C) 2004 Oren Ben-Kiki -# This file is distributed under the same terms as the Automake macro files. - -# Generate automatic documentation using Doxygen. Goals and variables values -# are controlled by the various DX_COND_??? conditionals set by autoconf. -# -# The provided goals are: -# doxygen-doc: Generate all doxygen documentation. -# doxygen-run: Run doxygen, which will generate some of the documentation -# (HTML, CHM, CHI, MAN, RTF, XML) but will not do the post -# processing required for the rest of it (PS, PDF, and some MAN). -# doxygen-man: Rename some doxygen generated man pages. -# doxygen-ps: Generate doxygen PostScript documentation. -# doxygen-pdf: Generate doxygen PDF documentation. -# -# Note that by default these are not integrated into the automake goals. If -# doxygen is used to generate man pages, you can achieve this integration by -# setting man3_MANS to the list of man pages generated and then adding the -# dependency: -# -# $(man3_MANS): doxygen-doc -# -# This will cause make to run doxygen and generate all the documentation. -# -# The following variable is intended for use in Makefile.am: -# -# DX_CLEANFILES = everything to clean. -# -# This is usually added to MOSTLYCLEANFILES. - -## --------------------------------- ## -## Format-independent Doxygen rules. ## -## --------------------------------- ## - -if DX_COND_doc - -## ------------------------------- ## -## Rules specific for HTML output. ## -## ------------------------------- ## - -if DX_COND_html - -DX_CLEAN_HTML = @DX_DOCDIR@/html - -endif DX_COND_html - -## ------------------------------ ## -## Rules specific for CHM output. ## -## ------------------------------ ## - -if DX_COND_chm - -DX_CLEAN_CHM = @DX_DOCDIR@/chm - -if DX_COND_chi - -DX_CLEAN_CHI = @DX_DOCDIR@/@PACKAGE@.chi - -endif DX_COND_chi - -endif DX_COND_chm - -## ------------------------------ ## -## Rules specific for MAN output. ## -## ------------------------------ ## - -if DX_COND_man - -DX_CLEAN_MAN = @DX_DOCDIR@/man - -endif DX_COND_man - -## ------------------------------ ## -## Rules specific for RTF output. ## -## ------------------------------ ## - -if DX_COND_rtf - -DX_CLEAN_RTF = @DX_DOCDIR@/rtf - -endif DX_COND_rtf - -## ------------------------------ ## -## Rules specific for XML output. ## -## ------------------------------ ## - -if DX_COND_xml - -DX_CLEAN_XML = @DX_DOCDIR@/xml - -endif DX_COND_xml - -## ----------------------------- ## -## Rules specific for PS output. ## -## ----------------------------- ## - -if DX_COND_ps - -DX_CLEAN_PS = @DX_DOCDIR@/@PACKAGE@.ps - -DX_PS_GOAL = doxygen-ps - -doxygen-ps: @DX_DOCDIR@/@PACKAGE@.ps - -@DX_DOCDIR@/@PACKAGE@.ps: @DX_DOCDIR@/@PACKAGE@.tag - cd @DX_DOCDIR@/latex; \ - rm -f *.aux *.toc *.idx *.ind *.ilg *.log *.out; \ - $(DX_LATEX) refman.tex; \ - $(MAKEINDEX_PATH) refman.idx; \ - $(DX_LATEX) refman.tex; \ - countdown=5; \ - while $(DX_EGREP) 'Rerun (LaTeX|to get cross-references right)' \ - refman.log > /dev/null 2>&1 \ - && test $$countdown -gt 0; do \ - $(DX_LATEX) refman.tex; \ - countdown=`expr $$countdown - 1`; \ - done; \ - $(DX_DVIPS) -o ../@PACKAGE@.ps refman.dvi - -endif DX_COND_ps - -## ------------------------------ ## -## Rules specific for PDF output. ## -## ------------------------------ ## - -if DX_COND_pdf - -DX_CLEAN_PDF = @DX_DOCDIR@/@PACKAGE@.pdf - -DX_PDF_GOAL = doxygen-pdf - -doxygen-pdf: @DX_DOCDIR@/@PACKAGE@.pdf - -@DX_DOCDIR@/@PACKAGE@.pdf: @DX_DOCDIR@/@PACKAGE@.tag - cd @DX_DOCDIR@/latex; \ - rm -f *.aux *.toc *.idx *.ind *.ilg *.log *.out; \ - $(DX_PDFLATEX) refman.tex; \ - $(DX_MAKEINDEX) refman.idx; \ - $(DX_PDFLATEX) refman.tex; \ - countdown=5; \ - while $(DX_EGREP) 'Rerun (LaTeX|to get cross-references right)' \ - refman.log > /dev/null 2>&1 \ - && test $$countdown -gt 0; do \ - $(DX_PDFLATEX) refman.tex; \ - countdown=`expr $$countdown - 1`; \ - done; \ - mv refman.pdf ../@PACKAGE@.pdf - -endif DX_COND_pdf - -## ------------------------------------------------- ## -## Rules specific for LaTeX (shared for PS and PDF). ## -## ------------------------------------------------- ## - -if DX_COND_latex - -DX_CLEAN_LATEX = @DX_DOCDIR@/latex - -endif DX_COND_latex - -.PHONY: doxygen-run doxygen-doc $(DX_PS_GOAL) $(DX_PDF_GOAL) - -.INTERMEDIATE: doxygen-run $(DX_PS_GOAL) $(DX_PDF_GOAL) - -doxygen-run: @DX_DOCDIR@/@PACKAGE@.tag - -doxygen-doc: doxygen-run $(DX_PS_GOAL) $(DX_PDF_GOAL) - -@DX_DOCDIR@/@PACKAGE@.tag: $(DX_CONFIG) $(pkginclude_HEADERS) - rm -rf @DX_DOCDIR@ - $(DX_ENV) $(DX_DOXYGEN) $(srcdir)/$(DX_CONFIG) - -DX_CLEANFILES = \ - @DX_DOCDIR@/@PACKAGE@.tag \ - -r \ - $(DX_CLEAN_HTML) \ - $(DX_CLEAN_CHM) \ - $(DX_CLEAN_CHI) \ - $(DX_CLEAN_MAN) \ - $(DX_CLEAN_RTF) \ - $(DX_CLEAN_XML) \ - $(DX_CLEAN_PS) \ - $(DX_CLEAN_PDF) \ - $(DX_CLEAN_LATEX) - -endif DX_COND_doc diff --git a/pkg/registry/zookeeper-3.4.6/src/c/autom4te.cache/output.0 b/pkg/registry/zookeeper-3.4.6/src/c/autom4te.cache/output.0 deleted file mode 100644 index a7d5bac9e..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/c/autom4te.cache/output.0 +++ /dev/null @@ -1,8641 +0,0 @@ -@%:@! /bin/sh -@%:@ Guess values for system-dependent variables and create Makefiles. -@%:@ Generated by GNU Autoconf 2.69 for zookeeper C client 3.4.5. -@%:@ -@%:@ Report bugs to . -@%:@ -@%:@ -@%:@ Copyright (C) 1992-1996, 1998-2012 Free Software Foundation, Inc. -@%:@ -@%:@ -@%:@ This configure script is free software; the Free Software Foundation -@%:@ gives unlimited permission to copy, distribute and modify it. -## -------------------- ## -## M4sh Initialization. ## -## -------------------- ## - -# Be more Bourne compatible -DUALCASE=1; export DUALCASE # for MKS sh -if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : - emulate sh - NULLCMD=: - # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which - # is contrary to our usage. Disable this feature. - alias -g '${1+"$@"}'='"$@"' - setopt NO_GLOB_SUBST -else - case `(set -o) 2>/dev/null` in @%:@( - *posix*) : - set -o posix ;; @%:@( - *) : - ;; -esac -fi - - -as_nl=' -' -export as_nl -# Printing a long string crashes Solaris 7 /usr/bin/printf. -as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' -as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo -as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo -# Prefer a ksh shell builtin over an external printf program on Solaris, -# but without wasting forks for bash or zsh. -if test -z "$BASH_VERSION$ZSH_VERSION" \ - && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then - as_echo='print -r --' - as_echo_n='print -rn --' -elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then - as_echo='printf %s\n' - as_echo_n='printf %s' -else - if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then - as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' - as_echo_n='/usr/ucb/echo -n' - else - as_echo_body='eval expr "X$1" : "X\\(.*\\)"' - as_echo_n_body='eval - arg=$1; - case $arg in @%:@( - *"$as_nl"*) - expr "X$arg" : "X\\(.*\\)$as_nl"; - arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; - esac; - expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" - ' - export as_echo_n_body - as_echo_n='sh -c $as_echo_n_body as_echo' - fi - export as_echo_body - as_echo='sh -c $as_echo_body as_echo' -fi - -# The user is always right. -if test "${PATH_SEPARATOR+set}" != set; then - PATH_SEPARATOR=: - (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { - (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || - PATH_SEPARATOR=';' - } -fi - - -# IFS -# We need space, tab and new line, in precisely that order. Quoting is -# there to prevent editors from complaining about space-tab. -# (If _AS_PATH_WALK were called with IFS unset, it would disable word -# splitting by setting IFS to empty value.) -IFS=" "" $as_nl" - -# Find who we are. Look in the path if we contain no directory separator. -as_myself= -case $0 in @%:@(( - *[\\/]* ) as_myself=$0 ;; - *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break - done -IFS=$as_save_IFS - - ;; -esac -# We did not find ourselves, most probably we were run as `sh COMMAND' -# in which case we are not to be found in the path. -if test "x$as_myself" = x; then - as_myself=$0 -fi -if test ! -f "$as_myself"; then - $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 - exit 1 -fi - -# Unset variables that we do not need and which cause bugs (e.g. in -# pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" -# suppresses any "Segmentation fault" message there. '((' could -# trigger a bug in pdksh 5.2.14. -for as_var in BASH_ENV ENV MAIL MAILPATH -do eval test x\${$as_var+set} = xset \ - && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : -done -PS1='$ ' -PS2='> ' -PS4='+ ' - -# NLS nuisances. -LC_ALL=C -export LC_ALL -LANGUAGE=C -export LANGUAGE - -# CDPATH. -(unset CDPATH) >/dev/null 2>&1 && unset CDPATH - -# Use a proper internal environment variable to ensure we don't fall - # into an infinite loop, continuously re-executing ourselves. - if test x"${_as_can_reexec}" != xno && test "x$CONFIG_SHELL" != x; then - _as_can_reexec=no; export _as_can_reexec; - # We cannot yet assume a decent shell, so we have to provide a -# neutralization value for shells without unset; and this also -# works around shells that cannot unset nonexistent variables. -# Preserve -v and -x to the replacement shell. -BASH_ENV=/dev/null -ENV=/dev/null -(unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV -case $- in @%:@ (((( - *v*x* | *x*v* ) as_opts=-vx ;; - *v* ) as_opts=-v ;; - *x* ) as_opts=-x ;; - * ) as_opts= ;; -esac -exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} -# Admittedly, this is quite paranoid, since all the known shells bail -# out after a failed `exec'. -$as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2 -as_fn_exit 255 - fi - # We don't want this to propagate to other subprocesses. - { _as_can_reexec=; unset _as_can_reexec;} -if test "x$CONFIG_SHELL" = x; then - as_bourne_compatible="if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then : - emulate sh - NULLCMD=: - # Pre-4.2 versions of Zsh do word splitting on \${1+\"\$@\"}, which - # is contrary to our usage. Disable this feature. - alias -g '\${1+\"\$@\"}'='\"\$@\"' - setopt NO_GLOB_SUBST -else - case \`(set -o) 2>/dev/null\` in @%:@( - *posix*) : - set -o posix ;; @%:@( - *) : - ;; -esac -fi -" - as_required="as_fn_return () { (exit \$1); } -as_fn_success () { as_fn_return 0; } -as_fn_failure () { as_fn_return 1; } -as_fn_ret_success () { return 0; } -as_fn_ret_failure () { return 1; } - -exitcode=0 -as_fn_success || { exitcode=1; echo as_fn_success failed.; } -as_fn_failure && { exitcode=1; echo as_fn_failure succeeded.; } -as_fn_ret_success || { exitcode=1; echo as_fn_ret_success failed.; } -as_fn_ret_failure && { exitcode=1; echo as_fn_ret_failure succeeded.; } -if ( set x; as_fn_ret_success y && test x = \"\$1\" ); then : - -else - exitcode=1; echo positional parameters were not saved. -fi -test x\$exitcode = x0 || exit 1 -test -x / || exit 1" - as_suggested=" as_lineno_1=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_1a=\$LINENO - as_lineno_2=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_2a=\$LINENO - eval 'test \"x\$as_lineno_1'\$as_run'\" != \"x\$as_lineno_2'\$as_run'\" && - test \"x\`expr \$as_lineno_1'\$as_run' + 1\`\" = \"x\$as_lineno_2'\$as_run'\"' || exit 1 -test \$(( 1 + 1 )) = 2 || exit 1" - if (eval "$as_required") 2>/dev/null; then : - as_have_required=yes -else - as_have_required=no -fi - if test x$as_have_required = xyes && (eval "$as_suggested") 2>/dev/null; then : - -else - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -as_found=false -for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - as_found=: - case $as_dir in @%:@( - /*) - for as_base in sh bash ksh sh5; do - # Try only shells that exist, to save several forks. - as_shell=$as_dir/$as_base - if { test -f "$as_shell" || test -f "$as_shell.exe"; } && - { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$as_shell"; } 2>/dev/null; then : - CONFIG_SHELL=$as_shell as_have_required=yes - if { $as_echo "$as_bourne_compatible""$as_suggested" | as_run=a "$as_shell"; } 2>/dev/null; then : - break 2 -fi -fi - done;; - esac - as_found=false -done -$as_found || { if { test -f "$SHELL" || test -f "$SHELL.exe"; } && - { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$SHELL"; } 2>/dev/null; then : - CONFIG_SHELL=$SHELL as_have_required=yes -fi; } -IFS=$as_save_IFS - - - if test "x$CONFIG_SHELL" != x; then : - export CONFIG_SHELL - # We cannot yet assume a decent shell, so we have to provide a -# neutralization value for shells without unset; and this also -# works around shells that cannot unset nonexistent variables. -# Preserve -v and -x to the replacement shell. -BASH_ENV=/dev/null -ENV=/dev/null -(unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV -case $- in @%:@ (((( - *v*x* | *x*v* ) as_opts=-vx ;; - *v* ) as_opts=-v ;; - *x* ) as_opts=-x ;; - * ) as_opts= ;; -esac -exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} -# Admittedly, this is quite paranoid, since all the known shells bail -# out after a failed `exec'. -$as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2 -exit 255 -fi - - if test x$as_have_required = xno; then : - $as_echo "$0: This script requires a shell more modern than all" - $as_echo "$0: the shells that I found on your system." - if test x${ZSH_VERSION+set} = xset ; then - $as_echo "$0: In particular, zsh $ZSH_VERSION has bugs and should" - $as_echo "$0: be upgraded to zsh 4.3.4 or later." - else - $as_echo "$0: Please tell bug-autoconf@gnu.org and -$0: user@zookeeper.apache.org about your system, including -$0: any error possibly output before this message. Then -$0: install a modern shell, or manually run the script -$0: under such a shell if you do have one." - fi - exit 1 -fi -fi -fi -SHELL=${CONFIG_SHELL-/bin/sh} -export SHELL -# Unset more variables known to interfere with behavior of common tools. -CLICOLOR_FORCE= GREP_OPTIONS= -unset CLICOLOR_FORCE GREP_OPTIONS - -## --------------------- ## -## M4sh Shell Functions. ## -## --------------------- ## -@%:@ as_fn_unset VAR -@%:@ --------------- -@%:@ Portably unset VAR. -as_fn_unset () -{ - { eval $1=; unset $1;} -} -as_unset=as_fn_unset - -@%:@ as_fn_set_status STATUS -@%:@ ----------------------- -@%:@ Set @S|@? to STATUS, without forking. -as_fn_set_status () -{ - return $1 -} @%:@ as_fn_set_status - -@%:@ as_fn_exit STATUS -@%:@ ----------------- -@%:@ Exit the shell with STATUS, even in a "trap 0" or "set -e" context. -as_fn_exit () -{ - set +e - as_fn_set_status $1 - exit $1 -} @%:@ as_fn_exit - -@%:@ as_fn_mkdir_p -@%:@ ------------- -@%:@ Create "@S|@as_dir" as a directory, including parents if necessary. -as_fn_mkdir_p () -{ - - case $as_dir in #( - -*) as_dir=./$as_dir;; - esac - test -d "$as_dir" || eval $as_mkdir_p || { - as_dirs= - while :; do - case $as_dir in #( - *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( - *) as_qdir=$as_dir;; - esac - as_dirs="'$as_qdir' $as_dirs" - as_dir=`$as_dirname -- "$as_dir" || -$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ - X"$as_dir" : 'X\(//\)[^/]' \| \ - X"$as_dir" : 'X\(//\)$' \| \ - X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || -$as_echo X"$as_dir" | - sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ - s//\1/ - q - } - /^X\(\/\/\)[^/].*/{ - s//\1/ - q - } - /^X\(\/\/\)$/{ - s//\1/ - q - } - /^X\(\/\).*/{ - s//\1/ - q - } - s/.*/./; q'` - test -d "$as_dir" && break - done - test -z "$as_dirs" || eval "mkdir $as_dirs" - } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" - - -} @%:@ as_fn_mkdir_p - -@%:@ as_fn_executable_p FILE -@%:@ ----------------------- -@%:@ Test if FILE is an executable regular file. -as_fn_executable_p () -{ - test -f "$1" && test -x "$1" -} @%:@ as_fn_executable_p -@%:@ as_fn_append VAR VALUE -@%:@ ---------------------- -@%:@ Append the text in VALUE to the end of the definition contained in VAR. Take -@%:@ advantage of any shell optimizations that allow amortized linear growth over -@%:@ repeated appends, instead of the typical quadratic growth present in naive -@%:@ implementations. -if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : - eval 'as_fn_append () - { - eval $1+=\$2 - }' -else - as_fn_append () - { - eval $1=\$$1\$2 - } -fi # as_fn_append - -@%:@ as_fn_arith ARG... -@%:@ ------------------ -@%:@ Perform arithmetic evaluation on the ARGs, and store the result in the -@%:@ global @S|@as_val. Take advantage of shells that can avoid forks. The arguments -@%:@ must be portable across @S|@(()) and expr. -if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : - eval 'as_fn_arith () - { - as_val=$(( $* )) - }' -else - as_fn_arith () - { - as_val=`expr "$@" || test $? -eq 1` - } -fi # as_fn_arith - - -@%:@ as_fn_error STATUS ERROR [LINENO LOG_FD] -@%:@ ---------------------------------------- -@%:@ Output "`basename @S|@0`: error: ERROR" to stderr. If LINENO and LOG_FD are -@%:@ provided, also output the error to LOG_FD, referencing LINENO. Then exit the -@%:@ script with STATUS, using 1 if that was 0. -as_fn_error () -{ - as_status=$1; test $as_status -eq 0 && as_status=1 - if test "$4"; then - as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack - $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 - fi - $as_echo "$as_me: error: $2" >&2 - as_fn_exit $as_status -} @%:@ as_fn_error - -if expr a : '\(a\)' >/dev/null 2>&1 && - test "X`expr 00001 : '.*\(...\)'`" = X001; then - as_expr=expr -else - as_expr=false -fi - -if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then - as_basename=basename -else - as_basename=false -fi - -if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then - as_dirname=dirname -else - as_dirname=false -fi - -as_me=`$as_basename -- "$0" || -$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ - X"$0" : 'X\(//\)$' \| \ - X"$0" : 'X\(/\)' \| . 2>/dev/null || -$as_echo X/"$0" | - sed '/^.*\/\([^/][^/]*\)\/*$/{ - s//\1/ - q - } - /^X\/\(\/\/\)$/{ - s//\1/ - q - } - /^X\/\(\/\).*/{ - s//\1/ - q - } - s/.*/./; q'` - -# Avoid depending upon Character Ranges. -as_cr_letters='abcdefghijklmnopqrstuvwxyz' -as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' -as_cr_Letters=$as_cr_letters$as_cr_LETTERS -as_cr_digits='0123456789' -as_cr_alnum=$as_cr_Letters$as_cr_digits - - - as_lineno_1=$LINENO as_lineno_1a=$LINENO - as_lineno_2=$LINENO as_lineno_2a=$LINENO - eval 'test "x$as_lineno_1'$as_run'" != "x$as_lineno_2'$as_run'" && - test "x`expr $as_lineno_1'$as_run' + 1`" = "x$as_lineno_2'$as_run'"' || { - # Blame Lee E. McMahon (1931-1989) for sed's syntax. :-) - sed -n ' - p - /[$]LINENO/= - ' <$as_myself | - sed ' - s/[$]LINENO.*/&-/ - t lineno - b - :lineno - N - :loop - s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/ - t loop - s/-\n.*// - ' >$as_me.lineno && - chmod +x "$as_me.lineno" || - { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; } - - # If we had to re-execute with $CONFIG_SHELL, we're ensured to have - # already done that, so ensure we don't try to do so again and fall - # in an infinite loop. This has already happened in practice. - _as_can_reexec=no; export _as_can_reexec - # Don't try to exec as it changes $[0], causing all sort of problems - # (the dirname of $[0] is not the place where we might find the - # original and so on. Autoconf is especially sensitive to this). - . "./$as_me.lineno" - # Exit status is that of the last command. - exit -} - -ECHO_C= ECHO_N= ECHO_T= -case `echo -n x` in @%:@((((( --n*) - case `echo 'xy\c'` in - *c*) ECHO_T=' ';; # ECHO_T is single tab character. - xy) ECHO_C='\c';; - *) echo `echo ksh88 bug on AIX 6.1` > /dev/null - ECHO_T=' ';; - esac;; -*) - ECHO_N='-n';; -esac - -rm -f conf$$ conf$$.exe conf$$.file -if test -d conf$$.dir; then - rm -f conf$$.dir/conf$$.file -else - rm -f conf$$.dir - mkdir conf$$.dir 2>/dev/null -fi -if (echo >conf$$.file) 2>/dev/null; then - if ln -s conf$$.file conf$$ 2>/dev/null; then - as_ln_s='ln -s' - # ... but there are two gotchas: - # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. - # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. - # In both cases, we have to default to `cp -pR'. - ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || - as_ln_s='cp -pR' - elif ln conf$$.file conf$$ 2>/dev/null; then - as_ln_s=ln - else - as_ln_s='cp -pR' - fi -else - as_ln_s='cp -pR' -fi -rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file -rmdir conf$$.dir 2>/dev/null - -if mkdir -p . 2>/dev/null; then - as_mkdir_p='mkdir -p "$as_dir"' -else - test -d ./-p && rmdir ./-p - as_mkdir_p=false -fi - -as_test_x='test -x' -as_executable_p=as_fn_executable_p - -# Sed expression to map a string onto a valid CPP name. -as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" - -# Sed expression to map a string onto a valid variable name. -as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" - - -test -n "$DJDIR" || exec 7<&0 &1 - -# Name of the host. -# hostname on some systems (SVR3.2, old GNU/Linux) returns a bogus exit status, -# so uname gets run too. -ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q` - -# -# Initializations. -# -ac_default_prefix=/usr/local -ac_clean_files= -ac_config_libobj_dir=. -LIB@&t@OBJS= -cross_compiling=no -subdirs= -MFLAGS= -MAKEFLAGS= - -# Identity of this package. -PACKAGE_NAME='zookeeper C client' -PACKAGE_TARNAME='zookeeper' -PACKAGE_VERSION='3.4.5' -PACKAGE_STRING='zookeeper C client 3.4.5' -PACKAGE_BUGREPORT='user@zookeeper.apache.org' -PACKAGE_URL='' - -ac_unique_file="src/zookeeper.c" -# Factoring default headers for most tests. -ac_includes_default="\ -#include -#ifdef HAVE_SYS_TYPES_H -# include -#endif -#ifdef HAVE_SYS_STAT_H -# include -#endif -#ifdef STDC_HEADERS -# include -# include -#else -# ifdef HAVE_STDLIB_H -# include -# endif -#endif -#ifdef HAVE_STRING_H -# if !defined STDC_HEADERS && defined HAVE_MEMORY_H -# include -# endif -# include -#endif -#ifdef HAVE_STRINGS_H -# include -#endif -#ifdef HAVE_INTTYPES_H -# include -#endif -#ifdef HAVE_STDINT_H -# include -#endif -#ifdef HAVE_UNISTD_H -# include -#endif" - -ac_subst_vars='am__EXEEXT_FALSE -am__EXEEXT_TRUE -LTLIBOBJS -LIB@&t@OBJS -USEIPV6 -EGREP -GREP -CPP -WANT_SYNCAPI_FALSE -WANT_SYNCAPI_TRUE -LN_S -am__fastdepCXX_FALSE -am__fastdepCXX_TRUE -CXXDEPMODE -ac_ct_CXX -CXXFLAGS -CXX -am__fastdepCC_FALSE -am__fastdepCC_TRUE -CCDEPMODE -am__nodep -AMDEPBACKSLASH -AMDEP_FALSE -AMDEP_TRUE -am__quote -am__include -DEPDIR -OBJEXT -EXEEXT -ac_ct_CC -CPPFLAGS -LDFLAGS -CFLAGS -CC -CPPUNIT_CFLAGS -am__untar -am__tar -AMTAR -am__leading_dot -SET_MAKE -AWK -mkdir_p -MKDIR_P -INSTALL_STRIP_PROGRAM -STRIP -install_sh -MAKEINFO -AUTOHEADER -AUTOMAKE -AUTOCONF -ACLOCAL -VERSION -PACKAGE -CYGPATH_W -am__isrc -INSTALL_DATA -INSTALL_SCRIPT -INSTALL_PROGRAM -DOXYGEN_PAPER_SIZE -DX_COND_latex_FALSE -DX_COND_latex_TRUE -DX_COND_pdf_FALSE -DX_COND_pdf_TRUE -DX_PDFLATEX -DX_FLAG_pdf -DX_COND_ps_FALSE -DX_COND_ps_TRUE -DX_EGREP -DX_DVIPS -DX_MAKEINDEX -DX_LATEX -DX_FLAG_ps -DX_COND_html_FALSE -DX_COND_html_TRUE -DX_FLAG_html -DX_COND_chi_FALSE -DX_COND_chi_TRUE -DX_FLAG_chi -DX_COND_chm_FALSE -DX_COND_chm_TRUE -DX_HHC -DX_FLAG_chm -DX_COND_xml_FALSE -DX_COND_xml_TRUE -DX_FLAG_xml -DX_COND_rtf_FALSE -DX_COND_rtf_TRUE -DX_FLAG_rtf -DX_COND_man_FALSE -DX_COND_man_TRUE -DX_FLAG_man -DX_COND_dot_FALSE -DX_COND_dot_TRUE -DX_DOT -DX_FLAG_dot -DX_COND_doc_FALSE -DX_COND_doc_TRUE -DX_PERL -DX_DOXYGEN -DX_FLAG_doc -DX_ENV -DX_DOCDIR -DX_CONFIG -DX_PROJECT -target_alias -host_alias -build_alias -LIBS -ECHO_T -ECHO_N -ECHO_C -DEFS -mandir -localedir -libdir -psdir -pdfdir -dvidir -htmldir -infodir -docdir -oldincludedir -includedir -localstatedir -sharedstatedir -sysconfdir -datadir -datarootdir -libexecdir -sbindir -bindir -program_transform_name -prefix -exec_prefix -PACKAGE_URL -PACKAGE_BUGREPORT -PACKAGE_STRING -PACKAGE_VERSION -PACKAGE_TARNAME -PACKAGE_NAME -PATH_SEPARATOR -SHELL' -ac_subst_files='' -ac_user_opts=' -enable_option_checking -enable_doxygen_doc -enable_doxygen_dot -enable_doxygen_man -enable_doxygen_rtf -enable_doxygen_xml -enable_doxygen_chm -enable_doxygen_chi -enable_doxygen_html -enable_doxygen_ps -enable_doxygen_pdf -with_cppunit -enable_dependency_tracking -enable_debug -with_syncapi -' - ac_precious_vars='build_alias -host_alias -target_alias -DOXYGEN_PAPER_SIZE -CC -CFLAGS -LDFLAGS -LIBS -CPPFLAGS -CXX -CXXFLAGS -CCC -CPP' - - -# Initialize some variables set by options. -ac_init_help= -ac_init_version=false -ac_unrecognized_opts= -ac_unrecognized_sep= -# The variables have the same names as the options, with -# dashes changed to underlines. -cache_file=/dev/null -exec_prefix=NONE -no_create= -no_recursion= -prefix=NONE -program_prefix=NONE -program_suffix=NONE -program_transform_name=s,x,x, -silent= -site= -srcdir= -verbose= -x_includes=NONE -x_libraries=NONE - -# Installation directory options. -# These are left unexpanded so users can "make install exec_prefix=/foo" -# and all the variables that are supposed to be based on exec_prefix -# by default will actually change. -# Use braces instead of parens because sh, perl, etc. also accept them. -# (The list follows the same order as the GNU Coding Standards.) -bindir='${exec_prefix}/bin' -sbindir='${exec_prefix}/sbin' -libexecdir='${exec_prefix}/libexec' -datarootdir='${prefix}/share' -datadir='${datarootdir}' -sysconfdir='${prefix}/etc' -sharedstatedir='${prefix}/com' -localstatedir='${prefix}/var' -includedir='${prefix}/include' -oldincludedir='/usr/include' -docdir='${datarootdir}/doc/${PACKAGE_TARNAME}' -infodir='${datarootdir}/info' -htmldir='${docdir}' -dvidir='${docdir}' -pdfdir='${docdir}' -psdir='${docdir}' -libdir='${exec_prefix}/lib' -localedir='${datarootdir}/locale' -mandir='${datarootdir}/man' - -ac_prev= -ac_dashdash= -for ac_option -do - # If the previous option needs an argument, assign it. - if test -n "$ac_prev"; then - eval $ac_prev=\$ac_option - ac_prev= - continue - fi - - case $ac_option in - *=?*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;; - *=) ac_optarg= ;; - *) ac_optarg=yes ;; - esac - - # Accept the important Cygnus configure options, so we can diagnose typos. - - case $ac_dashdash$ac_option in - --) - ac_dashdash=yes ;; - - -bindir | --bindir | --bindi | --bind | --bin | --bi) - ac_prev=bindir ;; - -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*) - bindir=$ac_optarg ;; - - -build | --build | --buil | --bui | --bu) - ac_prev=build_alias ;; - -build=* | --build=* | --buil=* | --bui=* | --bu=*) - build_alias=$ac_optarg ;; - - -cache-file | --cache-file | --cache-fil | --cache-fi \ - | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c) - ac_prev=cache_file ;; - -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \ - | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*) - cache_file=$ac_optarg ;; - - --config-cache | -C) - cache_file=config.cache ;; - - -datadir | --datadir | --datadi | --datad) - ac_prev=datadir ;; - -datadir=* | --datadir=* | --datadi=* | --datad=*) - datadir=$ac_optarg ;; - - -datarootdir | --datarootdir | --datarootdi | --datarootd | --dataroot \ - | --dataroo | --dataro | --datar) - ac_prev=datarootdir ;; - -datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \ - | --dataroot=* | --dataroo=* | --dataro=* | --datar=*) - datarootdir=$ac_optarg ;; - - -disable-* | --disable-*) - ac_useropt=`expr "x$ac_option" : 'x-*disable-\(.*\)'` - # Reject names that are not valid shell variable names. - expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && - as_fn_error $? "invalid feature name: $ac_useropt" - ac_useropt_orig=$ac_useropt - ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` - case $ac_user_opts in - *" -"enable_$ac_useropt" -"*) ;; - *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--disable-$ac_useropt_orig" - ac_unrecognized_sep=', ';; - esac - eval enable_$ac_useropt=no ;; - - -docdir | --docdir | --docdi | --doc | --do) - ac_prev=docdir ;; - -docdir=* | --docdir=* | --docdi=* | --doc=* | --do=*) - docdir=$ac_optarg ;; - - -dvidir | --dvidir | --dvidi | --dvid | --dvi | --dv) - ac_prev=dvidir ;; - -dvidir=* | --dvidir=* | --dvidi=* | --dvid=* | --dvi=* | --dv=*) - dvidir=$ac_optarg ;; - - -enable-* | --enable-*) - ac_useropt=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'` - # Reject names that are not valid shell variable names. - expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && - as_fn_error $? "invalid feature name: $ac_useropt" - ac_useropt_orig=$ac_useropt - ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` - case $ac_user_opts in - *" -"enable_$ac_useropt" -"*) ;; - *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--enable-$ac_useropt_orig" - ac_unrecognized_sep=', ';; - esac - eval enable_$ac_useropt=\$ac_optarg ;; - - -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \ - | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \ - | --exec | --exe | --ex) - ac_prev=exec_prefix ;; - -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \ - | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \ - | --exec=* | --exe=* | --ex=*) - exec_prefix=$ac_optarg ;; - - -gas | --gas | --ga | --g) - # Obsolete; use --with-gas. - with_gas=yes ;; - - -help | --help | --hel | --he | -h) - ac_init_help=long ;; - -help=r* | --help=r* | --hel=r* | --he=r* | -hr*) - ac_init_help=recursive ;; - -help=s* | --help=s* | --hel=s* | --he=s* | -hs*) - ac_init_help=short ;; - - -host | --host | --hos | --ho) - ac_prev=host_alias ;; - -host=* | --host=* | --hos=* | --ho=*) - host_alias=$ac_optarg ;; - - -htmldir | --htmldir | --htmldi | --htmld | --html | --htm | --ht) - ac_prev=htmldir ;; - -htmldir=* | --htmldir=* | --htmldi=* | --htmld=* | --html=* | --htm=* \ - | --ht=*) - htmldir=$ac_optarg ;; - - -includedir | --includedir | --includedi | --included | --include \ - | --includ | --inclu | --incl | --inc) - ac_prev=includedir ;; - -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \ - | --includ=* | --inclu=* | --incl=* | --inc=*) - includedir=$ac_optarg ;; - - -infodir | --infodir | --infodi | --infod | --info | --inf) - ac_prev=infodir ;; - -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*) - infodir=$ac_optarg ;; - - -libdir | --libdir | --libdi | --libd) - ac_prev=libdir ;; - -libdir=* | --libdir=* | --libdi=* | --libd=*) - libdir=$ac_optarg ;; - - -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \ - | --libexe | --libex | --libe) - ac_prev=libexecdir ;; - -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \ - | --libexe=* | --libex=* | --libe=*) - libexecdir=$ac_optarg ;; - - -localedir | --localedir | --localedi | --localed | --locale) - ac_prev=localedir ;; - -localedir=* | --localedir=* | --localedi=* | --localed=* | --locale=*) - localedir=$ac_optarg ;; - - -localstatedir | --localstatedir | --localstatedi | --localstated \ - | --localstate | --localstat | --localsta | --localst | --locals) - ac_prev=localstatedir ;; - -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \ - | --localstate=* | --localstat=* | --localsta=* | --localst=* | --locals=*) - localstatedir=$ac_optarg ;; - - -mandir | --mandir | --mandi | --mand | --man | --ma | --m) - ac_prev=mandir ;; - -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*) - mandir=$ac_optarg ;; - - -nfp | --nfp | --nf) - # Obsolete; use --without-fp. - with_fp=no ;; - - -no-create | --no-create | --no-creat | --no-crea | --no-cre \ - | --no-cr | --no-c | -n) - no_create=yes ;; - - -no-recursion | --no-recursion | --no-recursio | --no-recursi \ - | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) - no_recursion=yes ;; - - -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \ - | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \ - | --oldin | --oldi | --old | --ol | --o) - ac_prev=oldincludedir ;; - -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \ - | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \ - | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*) - oldincludedir=$ac_optarg ;; - - -prefix | --prefix | --prefi | --pref | --pre | --pr | --p) - ac_prev=prefix ;; - -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*) - prefix=$ac_optarg ;; - - -program-prefix | --program-prefix | --program-prefi | --program-pref \ - | --program-pre | --program-pr | --program-p) - ac_prev=program_prefix ;; - -program-prefix=* | --program-prefix=* | --program-prefi=* \ - | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*) - program_prefix=$ac_optarg ;; - - -program-suffix | --program-suffix | --program-suffi | --program-suff \ - | --program-suf | --program-su | --program-s) - ac_prev=program_suffix ;; - -program-suffix=* | --program-suffix=* | --program-suffi=* \ - | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*) - program_suffix=$ac_optarg ;; - - -program-transform-name | --program-transform-name \ - | --program-transform-nam | --program-transform-na \ - | --program-transform-n | --program-transform- \ - | --program-transform | --program-transfor \ - | --program-transfo | --program-transf \ - | --program-trans | --program-tran \ - | --progr-tra | --program-tr | --program-t) - ac_prev=program_transform_name ;; - -program-transform-name=* | --program-transform-name=* \ - | --program-transform-nam=* | --program-transform-na=* \ - | --program-transform-n=* | --program-transform-=* \ - | --program-transform=* | --program-transfor=* \ - | --program-transfo=* | --program-transf=* \ - | --program-trans=* | --program-tran=* \ - | --progr-tra=* | --program-tr=* | --program-t=*) - program_transform_name=$ac_optarg ;; - - -pdfdir | --pdfdir | --pdfdi | --pdfd | --pdf | --pd) - ac_prev=pdfdir ;; - -pdfdir=* | --pdfdir=* | --pdfdi=* | --pdfd=* | --pdf=* | --pd=*) - pdfdir=$ac_optarg ;; - - -psdir | --psdir | --psdi | --psd | --ps) - ac_prev=psdir ;; - -psdir=* | --psdir=* | --psdi=* | --psd=* | --ps=*) - psdir=$ac_optarg ;; - - -q | -quiet | --quiet | --quie | --qui | --qu | --q \ - | -silent | --silent | --silen | --sile | --sil) - silent=yes ;; - - -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb) - ac_prev=sbindir ;; - -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \ - | --sbi=* | --sb=*) - sbindir=$ac_optarg ;; - - -sharedstatedir | --sharedstatedir | --sharedstatedi \ - | --sharedstated | --sharedstate | --sharedstat | --sharedsta \ - | --sharedst | --shareds | --shared | --share | --shar \ - | --sha | --sh) - ac_prev=sharedstatedir ;; - -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \ - | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \ - | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \ - | --sha=* | --sh=*) - sharedstatedir=$ac_optarg ;; - - -site | --site | --sit) - ac_prev=site ;; - -site=* | --site=* | --sit=*) - site=$ac_optarg ;; - - -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) - ac_prev=srcdir ;; - -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) - srcdir=$ac_optarg ;; - - -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \ - | --syscon | --sysco | --sysc | --sys | --sy) - ac_prev=sysconfdir ;; - -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \ - | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*) - sysconfdir=$ac_optarg ;; - - -target | --target | --targe | --targ | --tar | --ta | --t) - ac_prev=target_alias ;; - -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*) - target_alias=$ac_optarg ;; - - -v | -verbose | --verbose | --verbos | --verbo | --verb) - verbose=yes ;; - - -version | --version | --versio | --versi | --vers | -V) - ac_init_version=: ;; - - -with-* | --with-*) - ac_useropt=`expr "x$ac_option" : 'x-*with-\([^=]*\)'` - # Reject names that are not valid shell variable names. - expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && - as_fn_error $? "invalid package name: $ac_useropt" - ac_useropt_orig=$ac_useropt - ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` - case $ac_user_opts in - *" -"with_$ac_useropt" -"*) ;; - *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--with-$ac_useropt_orig" - ac_unrecognized_sep=', ';; - esac - eval with_$ac_useropt=\$ac_optarg ;; - - -without-* | --without-*) - ac_useropt=`expr "x$ac_option" : 'x-*without-\(.*\)'` - # Reject names that are not valid shell variable names. - expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && - as_fn_error $? "invalid package name: $ac_useropt" - ac_useropt_orig=$ac_useropt - ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` - case $ac_user_opts in - *" -"with_$ac_useropt" -"*) ;; - *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--without-$ac_useropt_orig" - ac_unrecognized_sep=', ';; - esac - eval with_$ac_useropt=no ;; - - --x) - # Obsolete; use --with-x. - with_x=yes ;; - - -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \ - | --x-incl | --x-inc | --x-in | --x-i) - ac_prev=x_includes ;; - -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \ - | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*) - x_includes=$ac_optarg ;; - - -x-libraries | --x-libraries | --x-librarie | --x-librari \ - | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l) - ac_prev=x_libraries ;; - -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \ - | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*) - x_libraries=$ac_optarg ;; - - -*) as_fn_error $? "unrecognized option: \`$ac_option' -Try \`$0 --help' for more information" - ;; - - *=*) - ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='` - # Reject names that are not valid shell variable names. - case $ac_envvar in #( - '' | [0-9]* | *[!_$as_cr_alnum]* ) - as_fn_error $? "invalid variable name: \`$ac_envvar'" ;; - esac - eval $ac_envvar=\$ac_optarg - export $ac_envvar ;; - - *) - # FIXME: should be removed in autoconf 3.0. - $as_echo "$as_me: WARNING: you should use --build, --host, --target" >&2 - expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null && - $as_echo "$as_me: WARNING: invalid host type: $ac_option" >&2 - : "${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}" - ;; - - esac -done - -if test -n "$ac_prev"; then - ac_option=--`echo $ac_prev | sed 's/_/-/g'` - as_fn_error $? "missing argument to $ac_option" -fi - -if test -n "$ac_unrecognized_opts"; then - case $enable_option_checking in - no) ;; - fatal) as_fn_error $? "unrecognized options: $ac_unrecognized_opts" ;; - *) $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 ;; - esac -fi - -# Check all directory arguments for consistency. -for ac_var in exec_prefix prefix bindir sbindir libexecdir datarootdir \ - datadir sysconfdir sharedstatedir localstatedir includedir \ - oldincludedir docdir infodir htmldir dvidir pdfdir psdir \ - libdir localedir mandir -do - eval ac_val=\$$ac_var - # Remove trailing slashes. - case $ac_val in - */ ) - ac_val=`expr "X$ac_val" : 'X\(.*[^/]\)' \| "X$ac_val" : 'X\(.*\)'` - eval $ac_var=\$ac_val;; - esac - # Be sure to have absolute directory names. - case $ac_val in - [\\/$]* | ?:[\\/]* ) continue;; - NONE | '' ) case $ac_var in *prefix ) continue;; esac;; - esac - as_fn_error $? "expected an absolute directory name for --$ac_var: $ac_val" -done - -# There might be people who depend on the old broken behavior: `$host' -# used to hold the argument of --host etc. -# FIXME: To remove some day. -build=$build_alias -host=$host_alias -target=$target_alias - -# FIXME: To remove some day. -if test "x$host_alias" != x; then - if test "x$build_alias" = x; then - cross_compiling=maybe - elif test "x$build_alias" != "x$host_alias"; then - cross_compiling=yes - fi -fi - -ac_tool_prefix= -test -n "$host_alias" && ac_tool_prefix=$host_alias- - -test "$silent" = yes && exec 6>/dev/null - - -ac_pwd=`pwd` && test -n "$ac_pwd" && -ac_ls_di=`ls -di .` && -ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` || - as_fn_error $? "working directory cannot be determined" -test "X$ac_ls_di" = "X$ac_pwd_ls_di" || - as_fn_error $? "pwd does not report name of working directory" - - -# Find the source files, if location was not specified. -if test -z "$srcdir"; then - ac_srcdir_defaulted=yes - # Try the directory containing this script, then the parent directory. - ac_confdir=`$as_dirname -- "$as_myself" || -$as_expr X"$as_myself" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ - X"$as_myself" : 'X\(//\)[^/]' \| \ - X"$as_myself" : 'X\(//\)$' \| \ - X"$as_myself" : 'X\(/\)' \| . 2>/dev/null || -$as_echo X"$as_myself" | - sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ - s//\1/ - q - } - /^X\(\/\/\)[^/].*/{ - s//\1/ - q - } - /^X\(\/\/\)$/{ - s//\1/ - q - } - /^X\(\/\).*/{ - s//\1/ - q - } - s/.*/./; q'` - srcdir=$ac_confdir - if test ! -r "$srcdir/$ac_unique_file"; then - srcdir=.. - fi -else - ac_srcdir_defaulted=no -fi -if test ! -r "$srcdir/$ac_unique_file"; then - test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .." - as_fn_error $? "cannot find sources ($ac_unique_file) in $srcdir" -fi -ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work" -ac_abs_confdir=`( - cd "$srcdir" && test -r "./$ac_unique_file" || as_fn_error $? "$ac_msg" - pwd)` -# When building in place, set srcdir=. -if test "$ac_abs_confdir" = "$ac_pwd"; then - srcdir=. -fi -# Remove unnecessary trailing slashes from srcdir. -# Double slashes in file names in object file debugging info -# mess up M-x gdb in Emacs. -case $srcdir in -*/) srcdir=`expr "X$srcdir" : 'X\(.*[^/]\)' \| "X$srcdir" : 'X\(.*\)'`;; -esac -for ac_var in $ac_precious_vars; do - eval ac_env_${ac_var}_set=\${${ac_var}+set} - eval ac_env_${ac_var}_value=\$${ac_var} - eval ac_cv_env_${ac_var}_set=\${${ac_var}+set} - eval ac_cv_env_${ac_var}_value=\$${ac_var} -done - -# -# Report the --help message. -# -if test "$ac_init_help" = "long"; then - # Omit some internal or obsolete options to make the list less imposing. - # This message is too long to be a string in the A/UX 3.1 sh. - cat <<_ACEOF -\`configure' configures zookeeper C client 3.4.5 to adapt to many kinds of systems. - -Usage: $0 [OPTION]... [VAR=VALUE]... - -To assign environment variables (e.g., CC, CFLAGS...), specify them as -VAR=VALUE. See below for descriptions of some of the useful variables. - -Defaults for the options are specified in brackets. - -Configuration: - -h, --help display this help and exit - --help=short display options specific to this package - --help=recursive display the short help of all the included packages - -V, --version display version information and exit - -q, --quiet, --silent do not print \`checking ...' messages - --cache-file=FILE cache test results in FILE [disabled] - -C, --config-cache alias for \`--cache-file=config.cache' - -n, --no-create do not create output files - --srcdir=DIR find the sources in DIR [configure dir or \`..'] - -Installation directories: - --prefix=PREFIX install architecture-independent files in PREFIX - @<:@@S|@ac_default_prefix@:>@ - --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX - @<:@PREFIX@:>@ - -By default, \`make install' will install all the files in -\`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc. You can specify -an installation prefix other than \`$ac_default_prefix' using \`--prefix', -for instance \`--prefix=\$HOME'. - -For better control, use the options below. - -Fine tuning of the installation directories: - --bindir=DIR user executables [EPREFIX/bin] - --sbindir=DIR system admin executables [EPREFIX/sbin] - --libexecdir=DIR program executables [EPREFIX/libexec] - --sysconfdir=DIR read-only single-machine data [PREFIX/etc] - --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com] - --localstatedir=DIR modifiable single-machine data [PREFIX/var] - --libdir=DIR object code libraries [EPREFIX/lib] - --includedir=DIR C header files [PREFIX/include] - --oldincludedir=DIR C header files for non-gcc [/usr/include] - --datarootdir=DIR read-only arch.-independent data root [PREFIX/share] - --datadir=DIR read-only architecture-independent data [DATAROOTDIR] - --infodir=DIR info documentation [DATAROOTDIR/info] - --localedir=DIR locale-dependent data [DATAROOTDIR/locale] - --mandir=DIR man documentation [DATAROOTDIR/man] - --docdir=DIR documentation root @<:@DATAROOTDIR/doc/zookeeper@:>@ - --htmldir=DIR html documentation [DOCDIR] - --dvidir=DIR dvi documentation [DOCDIR] - --pdfdir=DIR pdf documentation [DOCDIR] - --psdir=DIR ps documentation [DOCDIR] -_ACEOF - - cat <<\_ACEOF - -Program names: - --program-prefix=PREFIX prepend PREFIX to installed program names - --program-suffix=SUFFIX append SUFFIX to installed program names - --program-transform-name=PROGRAM run sed PROGRAM on installed program names -_ACEOF -fi - -if test -n "$ac_init_help"; then - case $ac_init_help in - short | recursive ) echo "Configuration of zookeeper C client 3.4.5:";; - esac - cat <<\_ACEOF - -Optional Features: - --disable-option-checking ignore unrecognized --enable/--with options - --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) - --enable-FEATURE[=ARG] include FEATURE [ARG=yes] - --disable-doxygen-doc don't generate any doxygen documentation - --disable-doxygen-dot don't generate graphics for doxygen documentation - --enable-doxygen-man generate doxygen manual pages - --enable-doxygen-rtf generate doxygen RTF documentation - --enable-doxygen-xml generate doxygen XML documentation - --enable-doxygen-chm generate doxygen compressed HTML help documentation - --enable-doxygen-chi generate doxygen seperate compressed HTML help index - file - --disable-doxygen-html don't generate doxygen plain HTML documentation - --enable-doxygen-ps generate doxygen PostScript documentation - --enable-doxygen-pdf generate doxygen PDF documentation - --disable-dependency-tracking speeds up one-time build - --enable-dependency-tracking do not reject slow dependency extractors - --enable-debug enable debug build @<:@default=no@:>@ - -Optional Packages: - --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] - --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) - --without-cppunit do not use CPPUNIT - --with-syncapi build with support for SyncAPI @<:@default=yes@:>@ - -Some influential environment variables: - DOXYGEN_PAPER_SIZE - a4wide (default), a4, letter, legal or executive - CC C compiler command - CFLAGS C compiler flags - LDFLAGS linker flags, e.g. -L if you have libraries in a - nonstandard directory - LIBS libraries to pass to the linker, e.g. -l - CPPFLAGS (Objective) C/C++ preprocessor flags, e.g. -I if - you have headers in a nonstandard directory - CXX C++ compiler command - CXXFLAGS C++ compiler flags - CPP C preprocessor - -Use these variables to override the choices made by `configure' or to help -it to find libraries and programs with nonstandard names/locations. - -Report bugs to . -_ACEOF -ac_status=$? -fi - -if test "$ac_init_help" = "recursive"; then - # If there are subdirs, report their specific --help. - for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue - test -d "$ac_dir" || - { cd "$srcdir" && ac_pwd=`pwd` && srcdir=. && test -d "$ac_dir"; } || - continue - ac_builddir=. - -case "$ac_dir" in -.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; -*) - ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` - # A ".." for each directory in $ac_dir_suffix. - ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` - case $ac_top_builddir_sub in - "") ac_top_builddir_sub=. ac_top_build_prefix= ;; - *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; - esac ;; -esac -ac_abs_top_builddir=$ac_pwd -ac_abs_builddir=$ac_pwd$ac_dir_suffix -# for backward compatibility: -ac_top_builddir=$ac_top_build_prefix - -case $srcdir in - .) # We are building in place. - ac_srcdir=. - ac_top_srcdir=$ac_top_builddir_sub - ac_abs_top_srcdir=$ac_pwd ;; - [\\/]* | ?:[\\/]* ) # Absolute name. - ac_srcdir=$srcdir$ac_dir_suffix; - ac_top_srcdir=$srcdir - ac_abs_top_srcdir=$srcdir ;; - *) # Relative name. - ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix - ac_top_srcdir=$ac_top_build_prefix$srcdir - ac_abs_top_srcdir=$ac_pwd/$srcdir ;; -esac -ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix - - cd "$ac_dir" || { ac_status=$?; continue; } - # Check for guested configure. - if test -f "$ac_srcdir/configure.gnu"; then - echo && - $SHELL "$ac_srcdir/configure.gnu" --help=recursive - elif test -f "$ac_srcdir/configure"; then - echo && - $SHELL "$ac_srcdir/configure" --help=recursive - else - $as_echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2 - fi || ac_status=$? - cd "$ac_pwd" || { ac_status=$?; break; } - done -fi - -test -n "$ac_init_help" && exit $ac_status -if $ac_init_version; then - cat <<\_ACEOF -zookeeper C client configure 3.4.5 -generated by GNU Autoconf 2.69 - -Copyright (C) 2012 Free Software Foundation, Inc. -This configure script is free software; the Free Software Foundation -gives unlimited permission to copy, distribute and modify it. -_ACEOF - exit -fi - -## ------------------------ ## -## Autoconf initialization. ## -## ------------------------ ## - -@%:@ ac_fn_c_try_compile LINENO -@%:@ -------------------------- -@%:@ Try to compile conftest.@S|@ac_ext, and return whether this succeeded. -ac_fn_c_try_compile () -{ - as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack - rm -f conftest.$ac_objext - if { { ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 - (eval "$ac_compile") 2>conftest.err - ac_status=$? - if test -s conftest.err; then - grep -v '^ *+' conftest.err >conftest.er1 - cat conftest.er1 >&5 - mv -f conftest.er1 conftest.err - fi - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then : - ac_retval=0 -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_retval=1 -fi - eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno - as_fn_set_status $ac_retval - -} @%:@ ac_fn_c_try_compile - -@%:@ ac_fn_cxx_try_compile LINENO -@%:@ ---------------------------- -@%:@ Try to compile conftest.@S|@ac_ext, and return whether this succeeded. -ac_fn_cxx_try_compile () -{ - as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack - rm -f conftest.$ac_objext - if { { ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 - (eval "$ac_compile") 2>conftest.err - ac_status=$? - if test -s conftest.err; then - grep -v '^ *+' conftest.err >conftest.er1 - cat conftest.er1 >&5 - mv -f conftest.er1 conftest.err - fi - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } && { - test -z "$ac_cxx_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then : - ac_retval=0 -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_retval=1 -fi - eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno - as_fn_set_status $ac_retval - -} @%:@ ac_fn_cxx_try_compile - -@%:@ ac_fn_c_try_link LINENO -@%:@ ----------------------- -@%:@ Try to link conftest.@S|@ac_ext, and return whether this succeeded. -ac_fn_c_try_link () -{ - as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack - rm -f conftest.$ac_objext conftest$ac_exeext - if { { ac_try="$ac_link" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 - (eval "$ac_link") 2>conftest.err - ac_status=$? - if test -s conftest.err; then - grep -v '^ *+' conftest.err >conftest.er1 - cat conftest.er1 >&5 - mv -f conftest.er1 conftest.err - fi - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest$ac_exeext && { - test "$cross_compiling" = yes || - test -x conftest$ac_exeext - }; then : - ac_retval=0 -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_retval=1 -fi - # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information - # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would - # interfere with the next link command; also delete a directory that is - # left behind by Apple's compiler. We do this before executing the actions. - rm -rf conftest.dSYM conftest_ipa8_conftest.oo - eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno - as_fn_set_status $ac_retval - -} @%:@ ac_fn_c_try_link - -@%:@ ac_fn_c_try_cpp LINENO -@%:@ ---------------------- -@%:@ Try to preprocess conftest.@S|@ac_ext, and return whether this succeeded. -ac_fn_c_try_cpp () -{ - as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack - if { { ac_try="$ac_cpp conftest.$ac_ext" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 - (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err - ac_status=$? - if test -s conftest.err; then - grep -v '^ *+' conftest.err >conftest.er1 - cat conftest.er1 >&5 - mv -f conftest.er1 conftest.err - fi - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } > conftest.i && { - test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || - test ! -s conftest.err - }; then : - ac_retval=0 -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_retval=1 -fi - eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno - as_fn_set_status $ac_retval - -} @%:@ ac_fn_c_try_cpp - -@%:@ ac_fn_c_try_run LINENO -@%:@ ---------------------- -@%:@ Try to link conftest.@S|@ac_ext, and return whether this succeeded. Assumes -@%:@ that executables *can* be run. -ac_fn_c_try_run () -{ - as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack - if { { ac_try="$ac_link" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 - (eval "$ac_link") 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } && { ac_try='./conftest$ac_exeext' - { { case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 - (eval "$ac_try") 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; }; }; then : - ac_retval=0 -else - $as_echo "$as_me: program exited with status $ac_status" >&5 - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_retval=$ac_status -fi - rm -rf conftest.dSYM conftest_ipa8_conftest.oo - eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno - as_fn_set_status $ac_retval - -} @%:@ ac_fn_c_try_run - -@%:@ ac_fn_c_check_header_mongrel LINENO HEADER VAR INCLUDES -@%:@ ------------------------------------------------------- -@%:@ Tests whether HEADER exists, giving a warning if it cannot be compiled using -@%:@ the include files in INCLUDES and setting the cache variable VAR -@%:@ accordingly. -ac_fn_c_check_header_mongrel () -{ - as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack - if eval \${$3+:} false; then : - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 -$as_echo_n "checking for $2... " >&6; } -if eval \${$3+:} false; then : - $as_echo_n "(cached) " >&6 -fi -eval ac_res=\$$3 - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 -$as_echo "$ac_res" >&6; } -else - # Is the header compilable? -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 usability" >&5 -$as_echo_n "checking $2 usability... " >&6; } -cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -$4 -@%:@include <$2> -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - ac_header_compiler=yes -else - ac_header_compiler=no -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_compiler" >&5 -$as_echo "$ac_header_compiler" >&6; } - -# Is the header present? -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 presence" >&5 -$as_echo_n "checking $2 presence... " >&6; } -cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -@%:@include <$2> -_ACEOF -if ac_fn_c_try_cpp "$LINENO"; then : - ac_header_preproc=yes -else - ac_header_preproc=no -fi -rm -f conftest.err conftest.i conftest.$ac_ext -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_preproc" >&5 -$as_echo "$ac_header_preproc" >&6; } - -# So? What about this header? -case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in #(( - yes:no: ) - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&5 -$as_echo "$as_me: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&2;} - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 -$as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} - ;; - no:yes:* ) - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: present but cannot be compiled" >&5 -$as_echo "$as_me: WARNING: $2: present but cannot be compiled" >&2;} - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: check for missing prerequisite headers?" >&5 -$as_echo "$as_me: WARNING: $2: check for missing prerequisite headers?" >&2;} - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: see the Autoconf documentation" >&5 -$as_echo "$as_me: WARNING: $2: see the Autoconf documentation" >&2;} - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&5 -$as_echo "$as_me: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&2;} - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 -$as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} -( $as_echo "## ---------------------------------------- ## -## Report this to user@zookeeper.apache.org ## -## ---------------------------------------- ##" - ) | sed "s/^/$as_me: WARNING: /" >&2 - ;; -esac - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 -$as_echo_n "checking for $2... " >&6; } -if eval \${$3+:} false; then : - $as_echo_n "(cached) " >&6 -else - eval "$3=\$ac_header_compiler" -fi -eval ac_res=\$$3 - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 -$as_echo "$ac_res" >&6; } -fi - eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno - -} @%:@ ac_fn_c_check_header_mongrel - -@%:@ ac_fn_c_check_header_compile LINENO HEADER VAR INCLUDES -@%:@ ------------------------------------------------------- -@%:@ Tests whether HEADER exists and can be compiled using the include files in -@%:@ INCLUDES, setting the cache variable VAR accordingly. -ac_fn_c_check_header_compile () -{ - as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 -$as_echo_n "checking for $2... " >&6; } -if eval \${$3+:} false; then : - $as_echo_n "(cached) " >&6 -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -$4 -@%:@include <$2> -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - eval "$3=yes" -else - eval "$3=no" -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -fi -eval ac_res=\$$3 - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 -$as_echo "$ac_res" >&6; } - eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno - -} @%:@ ac_fn_c_check_header_compile - -@%:@ ac_fn_c_check_type LINENO TYPE VAR INCLUDES -@%:@ ------------------------------------------- -@%:@ Tests whether TYPE exists after having included INCLUDES, setting cache -@%:@ variable VAR accordingly. -ac_fn_c_check_type () -{ - as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 -$as_echo_n "checking for $2... " >&6; } -if eval \${$3+:} false; then : - $as_echo_n "(cached) " >&6 -else - eval "$3=no" - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -$4 -int -main () -{ -if (sizeof ($2)) - return 0; - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -$4 -int -main () -{ -if (sizeof (($2))) - return 0; - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - -else - eval "$3=yes" -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -fi -eval ac_res=\$$3 - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 -$as_echo "$ac_res" >&6; } - eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno - -} @%:@ ac_fn_c_check_type - -@%:@ ac_fn_c_check_func LINENO FUNC VAR -@%:@ ---------------------------------- -@%:@ Tests whether FUNC exists, setting the cache variable VAR accordingly -ac_fn_c_check_func () -{ - as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 -$as_echo_n "checking for $2... " >&6; } -if eval \${$3+:} false; then : - $as_echo_n "(cached) " >&6 -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -/* Define $2 to an innocuous variant, in case declares $2. - For example, HP-UX 11i declares gettimeofday. */ -#define $2 innocuous_$2 - -/* System header to define __stub macros and hopefully few prototypes, - which can conflict with char $2 (); below. - Prefer to if __STDC__ is defined, since - exists even on freestanding compilers. */ - -#ifdef __STDC__ -# include -#else -# include -#endif - -#undef $2 - -/* Override any GCC internal prototype to avoid an error. - Use char because int might match the return type of a GCC - builtin and then its argument prototype would still apply. */ -#ifdef __cplusplus -extern "C" -#endif -char $2 (); -/* The GNU C library defines this for functions which it implements - to always fail with ENOSYS. Some functions are actually named - something starting with __ and the normal name is an alias. */ -#if defined __stub_$2 || defined __stub___$2 -choke me -#endif - -int -main () -{ -return $2 (); - ; - return 0; -} -_ACEOF -if ac_fn_c_try_link "$LINENO"; then : - eval "$3=yes" -else - eval "$3=no" -fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext -fi -eval ac_res=\$$3 - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 -$as_echo "$ac_res" >&6; } - eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno - -} @%:@ ac_fn_c_check_func -cat >config.log <<_ACEOF -This file contains any messages produced by compilers while -running configure, to aid debugging if configure makes a mistake. - -It was created by zookeeper C client $as_me 3.4.5, which was -generated by GNU Autoconf 2.69. Invocation command line was - - $ $0 $@ - -_ACEOF -exec 5>>config.log -{ -cat <<_ASUNAME -## --------- ## -## Platform. ## -## --------- ## - -hostname = `(hostname || uname -n) 2>/dev/null | sed 1q` -uname -m = `(uname -m) 2>/dev/null || echo unknown` -uname -r = `(uname -r) 2>/dev/null || echo unknown` -uname -s = `(uname -s) 2>/dev/null || echo unknown` -uname -v = `(uname -v) 2>/dev/null || echo unknown` - -/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown` -/bin/uname -X = `(/bin/uname -X) 2>/dev/null || echo unknown` - -/bin/arch = `(/bin/arch) 2>/dev/null || echo unknown` -/usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null || echo unknown` -/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown` -/usr/bin/hostinfo = `(/usr/bin/hostinfo) 2>/dev/null || echo unknown` -/bin/machine = `(/bin/machine) 2>/dev/null || echo unknown` -/usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null || echo unknown` -/bin/universe = `(/bin/universe) 2>/dev/null || echo unknown` - -_ASUNAME - -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - $as_echo "PATH: $as_dir" - done -IFS=$as_save_IFS - -} >&5 - -cat >&5 <<_ACEOF - - -## ----------- ## -## Core tests. ## -## ----------- ## - -_ACEOF - - -# Keep a trace of the command line. -# Strip out --no-create and --no-recursion so they do not pile up. -# Strip out --silent because we don't want to record it for future runs. -# Also quote any args containing shell meta-characters. -# Make two passes to allow for proper duplicate-argument suppression. -ac_configure_args= -ac_configure_args0= -ac_configure_args1= -ac_must_keep_next=false -for ac_pass in 1 2 -do - for ac_arg - do - case $ac_arg in - -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;; - -q | -quiet | --quiet | --quie | --qui | --qu | --q \ - | -silent | --silent | --silen | --sile | --sil) - continue ;; - *\'*) - ac_arg=`$as_echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; - esac - case $ac_pass in - 1) as_fn_append ac_configure_args0 " '$ac_arg'" ;; - 2) - as_fn_append ac_configure_args1 " '$ac_arg'" - if test $ac_must_keep_next = true; then - ac_must_keep_next=false # Got value, back to normal. - else - case $ac_arg in - *=* | --config-cache | -C | -disable-* | --disable-* \ - | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \ - | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \ - | -with-* | --with-* | -without-* | --without-* | --x) - case "$ac_configure_args0 " in - "$ac_configure_args1"*" '$ac_arg' "* ) continue ;; - esac - ;; - -* ) ac_must_keep_next=true ;; - esac - fi - as_fn_append ac_configure_args " '$ac_arg'" - ;; - esac - done -done -{ ac_configure_args0=; unset ac_configure_args0;} -{ ac_configure_args1=; unset ac_configure_args1;} - -# When interrupted or exit'd, cleanup temporary files, and complete -# config.log. We remove comments because anyway the quotes in there -# would cause problems or look ugly. -# WARNING: Use '\'' to represent an apostrophe within the trap. -# WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug. -trap 'exit_status=$? - # Save into config.log some information that might help in debugging. - { - echo - - $as_echo "## ---------------- ## -## Cache variables. ## -## ---------------- ##" - echo - # The following way of writing the cache mishandles newlines in values, -( - for ac_var in `(set) 2>&1 | sed -n '\''s/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'\''`; do - eval ac_val=\$$ac_var - case $ac_val in #( - *${as_nl}*) - case $ac_var in #( - *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 -$as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; - esac - case $ac_var in #( - _ | IFS | as_nl) ;; #( - BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( - *) { eval $ac_var=; unset $ac_var;} ;; - esac ;; - esac - done - (set) 2>&1 | - case $as_nl`(ac_space='\'' '\''; set) 2>&1` in #( - *${as_nl}ac_space=\ *) - sed -n \ - "s/'\''/'\''\\\\'\'''\''/g; - s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\''\\2'\''/p" - ;; #( - *) - sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" - ;; - esac | - sort -) - echo - - $as_echo "## ----------------- ## -## Output variables. ## -## ----------------- ##" - echo - for ac_var in $ac_subst_vars - do - eval ac_val=\$$ac_var - case $ac_val in - *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; - esac - $as_echo "$ac_var='\''$ac_val'\''" - done | sort - echo - - if test -n "$ac_subst_files"; then - $as_echo "## ------------------- ## -## File substitutions. ## -## ------------------- ##" - echo - for ac_var in $ac_subst_files - do - eval ac_val=\$$ac_var - case $ac_val in - *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; - esac - $as_echo "$ac_var='\''$ac_val'\''" - done | sort - echo - fi - - if test -s confdefs.h; then - $as_echo "## ----------- ## -## confdefs.h. ## -## ----------- ##" - echo - cat confdefs.h - echo - fi - test "$ac_signal" != 0 && - $as_echo "$as_me: caught signal $ac_signal" - $as_echo "$as_me: exit $exit_status" - } >&5 - rm -f core *.core core.conftest.* && - rm -f -r conftest* confdefs* conf$$* $ac_clean_files && - exit $exit_status -' 0 -for ac_signal in 1 2 13 15; do - trap 'ac_signal='$ac_signal'; as_fn_exit 1' $ac_signal -done -ac_signal=0 - -# confdefs.h avoids OS command line length limits that DEFS can exceed. -rm -f -r conftest* confdefs.h - -$as_echo "/* confdefs.h */" > confdefs.h - -# Predefined preprocessor variables. - -cat >>confdefs.h <<_ACEOF -@%:@define PACKAGE_NAME "$PACKAGE_NAME" -_ACEOF - -cat >>confdefs.h <<_ACEOF -@%:@define PACKAGE_TARNAME "$PACKAGE_TARNAME" -_ACEOF - -cat >>confdefs.h <<_ACEOF -@%:@define PACKAGE_VERSION "$PACKAGE_VERSION" -_ACEOF - -cat >>confdefs.h <<_ACEOF -@%:@define PACKAGE_STRING "$PACKAGE_STRING" -_ACEOF - -cat >>confdefs.h <<_ACEOF -@%:@define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT" -_ACEOF - -cat >>confdefs.h <<_ACEOF -@%:@define PACKAGE_URL "$PACKAGE_URL" -_ACEOF - - -# Let the site file select an alternate cache file if it wants to. -# Prefer an explicitly selected file to automatically selected ones. -ac_site_file1=NONE -ac_site_file2=NONE -if test -n "$CONFIG_SITE"; then - # We do not want a PATH search for config.site. - case $CONFIG_SITE in @%:@(( - -*) ac_site_file1=./$CONFIG_SITE;; - */*) ac_site_file1=$CONFIG_SITE;; - *) ac_site_file1=./$CONFIG_SITE;; - esac -elif test "x$prefix" != xNONE; then - ac_site_file1=$prefix/share/config.site - ac_site_file2=$prefix/etc/config.site -else - ac_site_file1=$ac_default_prefix/share/config.site - ac_site_file2=$ac_default_prefix/etc/config.site -fi -for ac_site_file in "$ac_site_file1" "$ac_site_file2" -do - test "x$ac_site_file" = xNONE && continue - if test /dev/null != "$ac_site_file" && test -r "$ac_site_file"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: loading site script $ac_site_file" >&5 -$as_echo "$as_me: loading site script $ac_site_file" >&6;} - sed 's/^/| /' "$ac_site_file" >&5 - . "$ac_site_file" \ - || { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 -$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} -as_fn_error $? "failed to load site script $ac_site_file -See \`config.log' for more details" "$LINENO" 5; } - fi -done - -if test -r "$cache_file"; then - # Some versions of bash will fail to source /dev/null (special files - # actually), so we avoid doing that. DJGPP emulates it as a regular file. - if test /dev/null != "$cache_file" && test -f "$cache_file"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: loading cache $cache_file" >&5 -$as_echo "$as_me: loading cache $cache_file" >&6;} - case $cache_file in - [\\/]* | ?:[\\/]* ) . "$cache_file";; - *) . "./$cache_file";; - esac - fi -else - { $as_echo "$as_me:${as_lineno-$LINENO}: creating cache $cache_file" >&5 -$as_echo "$as_me: creating cache $cache_file" >&6;} - >$cache_file -fi - -# Check that the precious variables saved in the cache have kept the same -# value. -ac_cache_corrupted=false -for ac_var in $ac_precious_vars; do - eval ac_old_set=\$ac_cv_env_${ac_var}_set - eval ac_new_set=\$ac_env_${ac_var}_set - eval ac_old_val=\$ac_cv_env_${ac_var}_value - eval ac_new_val=\$ac_env_${ac_var}_value - case $ac_old_set,$ac_new_set in - set,) - { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5 -$as_echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;} - ac_cache_corrupted=: ;; - ,set) - { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was not set in the previous run" >&5 -$as_echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;} - ac_cache_corrupted=: ;; - ,);; - *) - if test "x$ac_old_val" != "x$ac_new_val"; then - # differences in whitespace do not lead to failure. - ac_old_val_w=`echo x $ac_old_val` - ac_new_val_w=`echo x $ac_new_val` - if test "$ac_old_val_w" != "$ac_new_val_w"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' has changed since the previous run:" >&5 -$as_echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;} - ac_cache_corrupted=: - else - { $as_echo "$as_me:${as_lineno-$LINENO}: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&5 -$as_echo "$as_me: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&2;} - eval $ac_var=\$ac_old_val - fi - { $as_echo "$as_me:${as_lineno-$LINENO}: former value: \`$ac_old_val'" >&5 -$as_echo "$as_me: former value: \`$ac_old_val'" >&2;} - { $as_echo "$as_me:${as_lineno-$LINENO}: current value: \`$ac_new_val'" >&5 -$as_echo "$as_me: current value: \`$ac_new_val'" >&2;} - fi;; - esac - # Pass precious variables to config.status. - if test "$ac_new_set" = set; then - case $ac_new_val in - *\'*) ac_arg=$ac_var=`$as_echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;; - *) ac_arg=$ac_var=$ac_new_val ;; - esac - case " $ac_configure_args " in - *" '$ac_arg' "*) ;; # Avoid dups. Use of quotes ensures accuracy. - *) as_fn_append ac_configure_args " '$ac_arg'" ;; - esac - fi -done -if $ac_cache_corrupted; then - { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 -$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} - { $as_echo "$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build" >&5 -$as_echo "$as_me: error: changes in the environment can compromise the build" >&2;} - as_fn_error $? "run \`make distclean' and/or \`rm $cache_file' and start over" "$LINENO" 5 -fi -## -------------------- ## -## Main body of script. ## -## -------------------- ## - -ac_ext=c -ac_cpp='$CPP $CPPFLAGS' -ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_c_compiler_gnu - - - - -# Save initial CFLAGS and CXXFLAGS values before AC_PROG_CC and AC_PROG_CXX -init_cflags="$CFLAGS" -init_cxxflags="$CXXFLAGS" - -# initialize Doxygen support - - - - - - - - - - -# Files: -DX_PROJECT=zookeeper - -DX_CONFIG=c-doc.Doxyfile - -DX_DOCDIR=docs - - -# Environment variables used inside doxygen.cfg: -DX_ENV="$DX_ENV SRCDIR='$srcdir'" - -DX_ENV="$DX_ENV PROJECT='$DX_PROJECT'" - -DX_ENV="$DX_ENV DOCDIR='$DX_DOCDIR'" - -DX_ENV="$DX_ENV VERSION='$PACKAGE_VERSION'" - - -# Doxygen itself: - - - - @%:@ Check whether --enable-doxygen-doc was given. -if test "${enable_doxygen_doc+set}" = set; then : - enableval=$enable_doxygen_doc; -case "$enableval" in -#( -y|Y|yes|Yes|YES) - DX_FLAG_doc=1 - - -;; #( -n|N|no|No|NO) - DX_FLAG_doc=0 - -;; #( -*) - as_fn_error $? "invalid value '$enableval' given to doxygen-doc" "$LINENO" 5 -;; -esac - -else - -DX_FLAG_doc=1 - - - -fi - -if test "$DX_FLAG_doc" = 1; then - -if test -n "$ac_tool_prefix"; then - # Extract the first word of "${ac_tool_prefix}doxygen", so it can be a program name with args. -set dummy ${ac_tool_prefix}doxygen; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_path_DX_DOXYGEN+:} false; then : - $as_echo_n "(cached) " >&6 -else - case $DX_DOXYGEN in - [\\/]* | ?:[\\/]*) - ac_cv_path_DX_DOXYGEN="$DX_DOXYGEN" # Let the user override the test with a path. - ;; - *) - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_path_DX_DOXYGEN="$as_dir/$ac_word$ac_exec_ext" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - - ;; -esac -fi -DX_DOXYGEN=$ac_cv_path_DX_DOXYGEN -if test -n "$DX_DOXYGEN"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DX_DOXYGEN" >&5 -$as_echo "$DX_DOXYGEN" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - -fi -if test -z "$ac_cv_path_DX_DOXYGEN"; then - ac_pt_DX_DOXYGEN=$DX_DOXYGEN - # Extract the first word of "doxygen", so it can be a program name with args. -set dummy doxygen; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_path_ac_pt_DX_DOXYGEN+:} false; then : - $as_echo_n "(cached) " >&6 -else - case $ac_pt_DX_DOXYGEN in - [\\/]* | ?:[\\/]*) - ac_cv_path_ac_pt_DX_DOXYGEN="$ac_pt_DX_DOXYGEN" # Let the user override the test with a path. - ;; - *) - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_path_ac_pt_DX_DOXYGEN="$as_dir/$ac_word$ac_exec_ext" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - - ;; -esac -fi -ac_pt_DX_DOXYGEN=$ac_cv_path_ac_pt_DX_DOXYGEN -if test -n "$ac_pt_DX_DOXYGEN"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_pt_DX_DOXYGEN" >&5 -$as_echo "$ac_pt_DX_DOXYGEN" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - if test "x$ac_pt_DX_DOXYGEN" = x; then - DX_DOXYGEN="" - else - case $cross_compiling:$ac_tool_warned in -yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} -ac_tool_warned=yes ;; -esac - DX_DOXYGEN=$ac_pt_DX_DOXYGEN - fi -else - DX_DOXYGEN="$ac_cv_path_DX_DOXYGEN" -fi - -if test "$DX_FLAG_$DX_CURRENT_FEATURE$DX_DOXYGEN" = 1; then - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: doxygen not found - will not generate any doxygen documentation" >&5 -$as_echo "$as_me: WARNING: doxygen not found - will not generate any doxygen documentation" >&2;} - DX_FLAG_doc=0 - -fi - - -if test -n "$ac_tool_prefix"; then - # Extract the first word of "${ac_tool_prefix}perl", so it can be a program name with args. -set dummy ${ac_tool_prefix}perl; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_path_DX_PERL+:} false; then : - $as_echo_n "(cached) " >&6 -else - case $DX_PERL in - [\\/]* | ?:[\\/]*) - ac_cv_path_DX_PERL="$DX_PERL" # Let the user override the test with a path. - ;; - *) - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_path_DX_PERL="$as_dir/$ac_word$ac_exec_ext" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - - ;; -esac -fi -DX_PERL=$ac_cv_path_DX_PERL -if test -n "$DX_PERL"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DX_PERL" >&5 -$as_echo "$DX_PERL" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - -fi -if test -z "$ac_cv_path_DX_PERL"; then - ac_pt_DX_PERL=$DX_PERL - # Extract the first word of "perl", so it can be a program name with args. -set dummy perl; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_path_ac_pt_DX_PERL+:} false; then : - $as_echo_n "(cached) " >&6 -else - case $ac_pt_DX_PERL in - [\\/]* | ?:[\\/]*) - ac_cv_path_ac_pt_DX_PERL="$ac_pt_DX_PERL" # Let the user override the test with a path. - ;; - *) - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_path_ac_pt_DX_PERL="$as_dir/$ac_word$ac_exec_ext" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - - ;; -esac -fi -ac_pt_DX_PERL=$ac_cv_path_ac_pt_DX_PERL -if test -n "$ac_pt_DX_PERL"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_pt_DX_PERL" >&5 -$as_echo "$ac_pt_DX_PERL" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - if test "x$ac_pt_DX_PERL" = x; then - DX_PERL="" - else - case $cross_compiling:$ac_tool_warned in -yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} -ac_tool_warned=yes ;; -esac - DX_PERL=$ac_pt_DX_PERL - fi -else - DX_PERL="$ac_cv_path_DX_PERL" -fi - -if test "$DX_FLAG_$DX_CURRENT_FEATURE$DX_PERL" = 1; then - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: perl not found - will not generate any doxygen documentation" >&5 -$as_echo "$as_me: WARNING: perl not found - will not generate any doxygen documentation" >&2;} - DX_FLAG_doc=0 - -fi - - : -fi -if test "$DX_FLAG_doc" = 1; then - if :; then - DX_COND_doc_TRUE= - DX_COND_doc_FALSE='#' -else - DX_COND_doc_TRUE='#' - DX_COND_doc_FALSE= -fi - - DX_ENV="$DX_ENV PERL_PATH='$DX_PERL'" - - : -else - if false; then - DX_COND_doc_TRUE= - DX_COND_doc_FALSE='#' -else - DX_COND_doc_TRUE='#' - DX_COND_doc_FALSE= -fi - - - : -fi - - -# Dot for graphics: - - - - @%:@ Check whether --enable-doxygen-dot was given. -if test "${enable_doxygen_dot+set}" = set; then : - enableval=$enable_doxygen_dot; -case "$enableval" in -#( -y|Y|yes|Yes|YES) - DX_FLAG_dot=1 - - -test "$DX_FLAG_doc" = "1" \ -|| as_fn_error $? "doxygen-dot requires doxygen-dot" "$LINENO" 5 - -;; #( -n|N|no|No|NO) - DX_FLAG_dot=0 - -;; #( -*) - as_fn_error $? "invalid value '$enableval' given to doxygen-dot" "$LINENO" 5 -;; -esac - -else - -DX_FLAG_dot=1 - - -test "$DX_FLAG_doc" = "1" || DX_FLAG_dot=0 - - - -fi - -if test "$DX_FLAG_dot" = 1; then - -if test -n "$ac_tool_prefix"; then - # Extract the first word of "${ac_tool_prefix}dot", so it can be a program name with args. -set dummy ${ac_tool_prefix}dot; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_path_DX_DOT+:} false; then : - $as_echo_n "(cached) " >&6 -else - case $DX_DOT in - [\\/]* | ?:[\\/]*) - ac_cv_path_DX_DOT="$DX_DOT" # Let the user override the test with a path. - ;; - *) - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_path_DX_DOT="$as_dir/$ac_word$ac_exec_ext" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - - ;; -esac -fi -DX_DOT=$ac_cv_path_DX_DOT -if test -n "$DX_DOT"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DX_DOT" >&5 -$as_echo "$DX_DOT" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - -fi -if test -z "$ac_cv_path_DX_DOT"; then - ac_pt_DX_DOT=$DX_DOT - # Extract the first word of "dot", so it can be a program name with args. -set dummy dot; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_path_ac_pt_DX_DOT+:} false; then : - $as_echo_n "(cached) " >&6 -else - case $ac_pt_DX_DOT in - [\\/]* | ?:[\\/]*) - ac_cv_path_ac_pt_DX_DOT="$ac_pt_DX_DOT" # Let the user override the test with a path. - ;; - *) - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_path_ac_pt_DX_DOT="$as_dir/$ac_word$ac_exec_ext" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - - ;; -esac -fi -ac_pt_DX_DOT=$ac_cv_path_ac_pt_DX_DOT -if test -n "$ac_pt_DX_DOT"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_pt_DX_DOT" >&5 -$as_echo "$ac_pt_DX_DOT" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - if test "x$ac_pt_DX_DOT" = x; then - DX_DOT="" - else - case $cross_compiling:$ac_tool_warned in -yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} -ac_tool_warned=yes ;; -esac - DX_DOT=$ac_pt_DX_DOT - fi -else - DX_DOT="$ac_cv_path_DX_DOT" -fi - -if test "$DX_FLAG_$DX_CURRENT_FEATURE$DX_DOT" = 1; then - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: dot not found - will not generate graphics for doxygen documentation" >&5 -$as_echo "$as_me: WARNING: dot not found - will not generate graphics for doxygen documentation" >&2;} - DX_FLAG_dot=0 - -fi - - : -fi -if test "$DX_FLAG_dot" = 1; then - if :; then - DX_COND_dot_TRUE= - DX_COND_dot_FALSE='#' -else - DX_COND_dot_TRUE='#' - DX_COND_dot_FALSE= -fi - - DX_ENV="$DX_ENV HAVE_DOT='YES'" - - DX_ENV="$DX_ENV DOT_PATH='`expr ".$DX_DOT" : '\(\.\)[^/]*$' \| "x$DX_DOT" : 'x\(.*\)/[^/]*$'`'" - - : -else - if false; then - DX_COND_dot_TRUE= - DX_COND_dot_FALSE='#' -else - DX_COND_dot_TRUE='#' - DX_COND_dot_FALSE= -fi - - DX_ENV="$DX_ENV HAVE_DOT='NO'" - - : -fi - - -# Man pages generation: - - - - @%:@ Check whether --enable-doxygen-man was given. -if test "${enable_doxygen_man+set}" = set; then : - enableval=$enable_doxygen_man; -case "$enableval" in -#( -y|Y|yes|Yes|YES) - DX_FLAG_man=1 - - -test "$DX_FLAG_doc" = "1" \ -|| as_fn_error $? "doxygen-man requires doxygen-man" "$LINENO" 5 - -;; #( -n|N|no|No|NO) - DX_FLAG_man=0 - -;; #( -*) - as_fn_error $? "invalid value '$enableval' given to doxygen-man" "$LINENO" 5 -;; -esac - -else - -DX_FLAG_man=0 - - -test "$DX_FLAG_doc" = "1" || DX_FLAG_man=0 - - - -fi - -if test "$DX_FLAG_man" = 1; then - - : -fi -if test "$DX_FLAG_man" = 1; then - if :; then - DX_COND_man_TRUE= - DX_COND_man_FALSE='#' -else - DX_COND_man_TRUE='#' - DX_COND_man_FALSE= -fi - - DX_ENV="$DX_ENV GENERATE_MAN='YES'" - - : -else - if false; then - DX_COND_man_TRUE= - DX_COND_man_FALSE='#' -else - DX_COND_man_TRUE='#' - DX_COND_man_FALSE= -fi - - DX_ENV="$DX_ENV GENERATE_MAN='NO'" - - : -fi - - -# RTF file generation: - - - - @%:@ Check whether --enable-doxygen-rtf was given. -if test "${enable_doxygen_rtf+set}" = set; then : - enableval=$enable_doxygen_rtf; -case "$enableval" in -#( -y|Y|yes|Yes|YES) - DX_FLAG_rtf=1 - - -test "$DX_FLAG_doc" = "1" \ -|| as_fn_error $? "doxygen-rtf requires doxygen-rtf" "$LINENO" 5 - -;; #( -n|N|no|No|NO) - DX_FLAG_rtf=0 - -;; #( -*) - as_fn_error $? "invalid value '$enableval' given to doxygen-rtf" "$LINENO" 5 -;; -esac - -else - -DX_FLAG_rtf=0 - - -test "$DX_FLAG_doc" = "1" || DX_FLAG_rtf=0 - - - -fi - -if test "$DX_FLAG_rtf" = 1; then - - : -fi -if test "$DX_FLAG_rtf" = 1; then - if :; then - DX_COND_rtf_TRUE= - DX_COND_rtf_FALSE='#' -else - DX_COND_rtf_TRUE='#' - DX_COND_rtf_FALSE= -fi - - DX_ENV="$DX_ENV GENERATE_RTF='YES'" - - : -else - if false; then - DX_COND_rtf_TRUE= - DX_COND_rtf_FALSE='#' -else - DX_COND_rtf_TRUE='#' - DX_COND_rtf_FALSE= -fi - - DX_ENV="$DX_ENV GENERATE_RTF='NO'" - - : -fi - - -# XML file generation: - - - - @%:@ Check whether --enable-doxygen-xml was given. -if test "${enable_doxygen_xml+set}" = set; then : - enableval=$enable_doxygen_xml; -case "$enableval" in -#( -y|Y|yes|Yes|YES) - DX_FLAG_xml=1 - - -test "$DX_FLAG_doc" = "1" \ -|| as_fn_error $? "doxygen-xml requires doxygen-xml" "$LINENO" 5 - -;; #( -n|N|no|No|NO) - DX_FLAG_xml=0 - -;; #( -*) - as_fn_error $? "invalid value '$enableval' given to doxygen-xml" "$LINENO" 5 -;; -esac - -else - -DX_FLAG_xml=0 - - -test "$DX_FLAG_doc" = "1" || DX_FLAG_xml=0 - - - -fi - -if test "$DX_FLAG_xml" = 1; then - - : -fi -if test "$DX_FLAG_xml" = 1; then - if :; then - DX_COND_xml_TRUE= - DX_COND_xml_FALSE='#' -else - DX_COND_xml_TRUE='#' - DX_COND_xml_FALSE= -fi - - DX_ENV="$DX_ENV GENERATE_XML='YES'" - - : -else - if false; then - DX_COND_xml_TRUE= - DX_COND_xml_FALSE='#' -else - DX_COND_xml_TRUE='#' - DX_COND_xml_FALSE= -fi - - DX_ENV="$DX_ENV GENERATE_XML='NO'" - - : -fi - - -# (Compressed) HTML help generation: - - - - @%:@ Check whether --enable-doxygen-chm was given. -if test "${enable_doxygen_chm+set}" = set; then : - enableval=$enable_doxygen_chm; -case "$enableval" in -#( -y|Y|yes|Yes|YES) - DX_FLAG_chm=1 - - -test "$DX_FLAG_doc" = "1" \ -|| as_fn_error $? "doxygen-chm requires doxygen-chm" "$LINENO" 5 - -;; #( -n|N|no|No|NO) - DX_FLAG_chm=0 - -;; #( -*) - as_fn_error $? "invalid value '$enableval' given to doxygen-chm" "$LINENO" 5 -;; -esac - -else - -DX_FLAG_chm=0 - - -test "$DX_FLAG_doc" = "1" || DX_FLAG_chm=0 - - - -fi - -if test "$DX_FLAG_chm" = 1; then - -if test -n "$ac_tool_prefix"; then - # Extract the first word of "${ac_tool_prefix}hhc", so it can be a program name with args. -set dummy ${ac_tool_prefix}hhc; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_path_DX_HHC+:} false; then : - $as_echo_n "(cached) " >&6 -else - case $DX_HHC in - [\\/]* | ?:[\\/]*) - ac_cv_path_DX_HHC="$DX_HHC" # Let the user override the test with a path. - ;; - *) - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_path_DX_HHC="$as_dir/$ac_word$ac_exec_ext" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - - ;; -esac -fi -DX_HHC=$ac_cv_path_DX_HHC -if test -n "$DX_HHC"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DX_HHC" >&5 -$as_echo "$DX_HHC" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - -fi -if test -z "$ac_cv_path_DX_HHC"; then - ac_pt_DX_HHC=$DX_HHC - # Extract the first word of "hhc", so it can be a program name with args. -set dummy hhc; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_path_ac_pt_DX_HHC+:} false; then : - $as_echo_n "(cached) " >&6 -else - case $ac_pt_DX_HHC in - [\\/]* | ?:[\\/]*) - ac_cv_path_ac_pt_DX_HHC="$ac_pt_DX_HHC" # Let the user override the test with a path. - ;; - *) - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_path_ac_pt_DX_HHC="$as_dir/$ac_word$ac_exec_ext" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - - ;; -esac -fi -ac_pt_DX_HHC=$ac_cv_path_ac_pt_DX_HHC -if test -n "$ac_pt_DX_HHC"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_pt_DX_HHC" >&5 -$as_echo "$ac_pt_DX_HHC" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - if test "x$ac_pt_DX_HHC" = x; then - DX_HHC="" - else - case $cross_compiling:$ac_tool_warned in -yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} -ac_tool_warned=yes ;; -esac - DX_HHC=$ac_pt_DX_HHC - fi -else - DX_HHC="$ac_cv_path_DX_HHC" -fi - -if test "$DX_FLAG_$DX_CURRENT_FEATURE$DX_HHC" = 1; then - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: hhc not found - will not generate doxygen compressed HTML help documentation" >&5 -$as_echo "$as_me: WARNING: hhc not found - will not generate doxygen compressed HTML help documentation" >&2;} - DX_FLAG_chm=0 - -fi - - : -fi -if test "$DX_FLAG_chm" = 1; then - if :; then - DX_COND_chm_TRUE= - DX_COND_chm_FALSE='#' -else - DX_COND_chm_TRUE='#' - DX_COND_chm_FALSE= -fi - - DX_ENV="$DX_ENV HHC_PATH='$DX_HHC'" - - DX_ENV="$DX_ENV GENERATE_HTML='YES'" - - DX_ENV="$DX_ENV GENERATE_HTMLHELP='YES'" - - : -else - if false; then - DX_COND_chm_TRUE= - DX_COND_chm_FALSE='#' -else - DX_COND_chm_TRUE='#' - DX_COND_chm_FALSE= -fi - - DX_ENV="$DX_ENV GENERATE_HTMLHELP='NO'" - - : -fi - - -# Seperate CHI file generation. - - - - @%:@ Check whether --enable-doxygen-chi was given. -if test "${enable_doxygen_chi+set}" = set; then : - enableval=$enable_doxygen_chi; -case "$enableval" in -#( -y|Y|yes|Yes|YES) - DX_FLAG_chi=1 - - -test "$DX_FLAG_chm" = "1" \ -|| as_fn_error $? "doxygen-chi requires doxygen-chi" "$LINENO" 5 - -;; #( -n|N|no|No|NO) - DX_FLAG_chi=0 - -;; #( -*) - as_fn_error $? "invalid value '$enableval' given to doxygen-chi" "$LINENO" 5 -;; -esac - -else - -DX_FLAG_chi=0 - - -test "$DX_FLAG_chm" = "1" || DX_FLAG_chi=0 - - - -fi - -if test "$DX_FLAG_chi" = 1; then - - : -fi -if test "$DX_FLAG_chi" = 1; then - if :; then - DX_COND_chi_TRUE= - DX_COND_chi_FALSE='#' -else - DX_COND_chi_TRUE='#' - DX_COND_chi_FALSE= -fi - - DX_ENV="$DX_ENV GENERATE_CHI='YES'" - - : -else - if false; then - DX_COND_chi_TRUE= - DX_COND_chi_FALSE='#' -else - DX_COND_chi_TRUE='#' - DX_COND_chi_FALSE= -fi - - DX_ENV="$DX_ENV GENERATE_CHI='NO'" - - : -fi - - -# Plain HTML pages generation: - - - - @%:@ Check whether --enable-doxygen-html was given. -if test "${enable_doxygen_html+set}" = set; then : - enableval=$enable_doxygen_html; -case "$enableval" in -#( -y|Y|yes|Yes|YES) - DX_FLAG_html=1 - - -test "$DX_FLAG_doc" = "1" \ -|| as_fn_error $? "doxygen-html requires doxygen-html" "$LINENO" 5 - -test "$DX_FLAG_chm" = "0" \ -|| as_fn_error $? "doxygen-html contradicts doxygen-html" "$LINENO" 5 - -;; #( -n|N|no|No|NO) - DX_FLAG_html=0 - -;; #( -*) - as_fn_error $? "invalid value '$enableval' given to doxygen-html" "$LINENO" 5 -;; -esac - -else - -DX_FLAG_html=1 - - -test "$DX_FLAG_doc" = "1" || DX_FLAG_html=0 - - -test "$DX_FLAG_chm" = "0" || DX_FLAG_html=0 - - - -fi - -if test "$DX_FLAG_html" = 1; then - - : -fi -if test "$DX_FLAG_html" = 1; then - if :; then - DX_COND_html_TRUE= - DX_COND_html_FALSE='#' -else - DX_COND_html_TRUE='#' - DX_COND_html_FALSE= -fi - - DX_ENV="$DX_ENV GENERATE_HTML='YES'" - - : -else - if false; then - DX_COND_html_TRUE= - DX_COND_html_FALSE='#' -else - DX_COND_html_TRUE='#' - DX_COND_html_FALSE= -fi - - test "$DX_FLAG_chm" = 1 || DX_ENV="$DX_ENV GENERATE_HTML='NO'" - - : -fi - - -# PostScript file generation: - - - - @%:@ Check whether --enable-doxygen-ps was given. -if test "${enable_doxygen_ps+set}" = set; then : - enableval=$enable_doxygen_ps; -case "$enableval" in -#( -y|Y|yes|Yes|YES) - DX_FLAG_ps=1 - - -test "$DX_FLAG_doc" = "1" \ -|| as_fn_error $? "doxygen-ps requires doxygen-ps" "$LINENO" 5 - -;; #( -n|N|no|No|NO) - DX_FLAG_ps=0 - -;; #( -*) - as_fn_error $? "invalid value '$enableval' given to doxygen-ps" "$LINENO" 5 -;; -esac - -else - -DX_FLAG_ps=0 - - -test "$DX_FLAG_doc" = "1" || DX_FLAG_ps=0 - - - -fi - -if test "$DX_FLAG_ps" = 1; then - -if test -n "$ac_tool_prefix"; then - # Extract the first word of "${ac_tool_prefix}latex", so it can be a program name with args. -set dummy ${ac_tool_prefix}latex; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_path_DX_LATEX+:} false; then : - $as_echo_n "(cached) " >&6 -else - case $DX_LATEX in - [\\/]* | ?:[\\/]*) - ac_cv_path_DX_LATEX="$DX_LATEX" # Let the user override the test with a path. - ;; - *) - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_path_DX_LATEX="$as_dir/$ac_word$ac_exec_ext" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - - ;; -esac -fi -DX_LATEX=$ac_cv_path_DX_LATEX -if test -n "$DX_LATEX"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DX_LATEX" >&5 -$as_echo "$DX_LATEX" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - -fi -if test -z "$ac_cv_path_DX_LATEX"; then - ac_pt_DX_LATEX=$DX_LATEX - # Extract the first word of "latex", so it can be a program name with args. -set dummy latex; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_path_ac_pt_DX_LATEX+:} false; then : - $as_echo_n "(cached) " >&6 -else - case $ac_pt_DX_LATEX in - [\\/]* | ?:[\\/]*) - ac_cv_path_ac_pt_DX_LATEX="$ac_pt_DX_LATEX" # Let the user override the test with a path. - ;; - *) - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_path_ac_pt_DX_LATEX="$as_dir/$ac_word$ac_exec_ext" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - - ;; -esac -fi -ac_pt_DX_LATEX=$ac_cv_path_ac_pt_DX_LATEX -if test -n "$ac_pt_DX_LATEX"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_pt_DX_LATEX" >&5 -$as_echo "$ac_pt_DX_LATEX" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - if test "x$ac_pt_DX_LATEX" = x; then - DX_LATEX="" - else - case $cross_compiling:$ac_tool_warned in -yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} -ac_tool_warned=yes ;; -esac - DX_LATEX=$ac_pt_DX_LATEX - fi -else - DX_LATEX="$ac_cv_path_DX_LATEX" -fi - -if test "$DX_FLAG_$DX_CURRENT_FEATURE$DX_LATEX" = 1; then - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: latex not found - will not generate doxygen PostScript documentation" >&5 -$as_echo "$as_me: WARNING: latex not found - will not generate doxygen PostScript documentation" >&2;} - DX_FLAG_ps=0 - -fi - - -if test -n "$ac_tool_prefix"; then - # Extract the first word of "${ac_tool_prefix}makeindex", so it can be a program name with args. -set dummy ${ac_tool_prefix}makeindex; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_path_DX_MAKEINDEX+:} false; then : - $as_echo_n "(cached) " >&6 -else - case $DX_MAKEINDEX in - [\\/]* | ?:[\\/]*) - ac_cv_path_DX_MAKEINDEX="$DX_MAKEINDEX" # Let the user override the test with a path. - ;; - *) - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_path_DX_MAKEINDEX="$as_dir/$ac_word$ac_exec_ext" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - - ;; -esac -fi -DX_MAKEINDEX=$ac_cv_path_DX_MAKEINDEX -if test -n "$DX_MAKEINDEX"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DX_MAKEINDEX" >&5 -$as_echo "$DX_MAKEINDEX" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - -fi -if test -z "$ac_cv_path_DX_MAKEINDEX"; then - ac_pt_DX_MAKEINDEX=$DX_MAKEINDEX - # Extract the first word of "makeindex", so it can be a program name with args. -set dummy makeindex; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_path_ac_pt_DX_MAKEINDEX+:} false; then : - $as_echo_n "(cached) " >&6 -else - case $ac_pt_DX_MAKEINDEX in - [\\/]* | ?:[\\/]*) - ac_cv_path_ac_pt_DX_MAKEINDEX="$ac_pt_DX_MAKEINDEX" # Let the user override the test with a path. - ;; - *) - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_path_ac_pt_DX_MAKEINDEX="$as_dir/$ac_word$ac_exec_ext" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - - ;; -esac -fi -ac_pt_DX_MAKEINDEX=$ac_cv_path_ac_pt_DX_MAKEINDEX -if test -n "$ac_pt_DX_MAKEINDEX"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_pt_DX_MAKEINDEX" >&5 -$as_echo "$ac_pt_DX_MAKEINDEX" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - if test "x$ac_pt_DX_MAKEINDEX" = x; then - DX_MAKEINDEX="" - else - case $cross_compiling:$ac_tool_warned in -yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} -ac_tool_warned=yes ;; -esac - DX_MAKEINDEX=$ac_pt_DX_MAKEINDEX - fi -else - DX_MAKEINDEX="$ac_cv_path_DX_MAKEINDEX" -fi - -if test "$DX_FLAG_$DX_CURRENT_FEATURE$DX_MAKEINDEX" = 1; then - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: makeindex not found - will not generate doxygen PostScript documentation" >&5 -$as_echo "$as_me: WARNING: makeindex not found - will not generate doxygen PostScript documentation" >&2;} - DX_FLAG_ps=0 - -fi - - -if test -n "$ac_tool_prefix"; then - # Extract the first word of "${ac_tool_prefix}dvips", so it can be a program name with args. -set dummy ${ac_tool_prefix}dvips; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_path_DX_DVIPS+:} false; then : - $as_echo_n "(cached) " >&6 -else - case $DX_DVIPS in - [\\/]* | ?:[\\/]*) - ac_cv_path_DX_DVIPS="$DX_DVIPS" # Let the user override the test with a path. - ;; - *) - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_path_DX_DVIPS="$as_dir/$ac_word$ac_exec_ext" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - - ;; -esac -fi -DX_DVIPS=$ac_cv_path_DX_DVIPS -if test -n "$DX_DVIPS"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DX_DVIPS" >&5 -$as_echo "$DX_DVIPS" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - -fi -if test -z "$ac_cv_path_DX_DVIPS"; then - ac_pt_DX_DVIPS=$DX_DVIPS - # Extract the first word of "dvips", so it can be a program name with args. -set dummy dvips; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_path_ac_pt_DX_DVIPS+:} false; then : - $as_echo_n "(cached) " >&6 -else - case $ac_pt_DX_DVIPS in - [\\/]* | ?:[\\/]*) - ac_cv_path_ac_pt_DX_DVIPS="$ac_pt_DX_DVIPS" # Let the user override the test with a path. - ;; - *) - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_path_ac_pt_DX_DVIPS="$as_dir/$ac_word$ac_exec_ext" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - - ;; -esac -fi -ac_pt_DX_DVIPS=$ac_cv_path_ac_pt_DX_DVIPS -if test -n "$ac_pt_DX_DVIPS"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_pt_DX_DVIPS" >&5 -$as_echo "$ac_pt_DX_DVIPS" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - if test "x$ac_pt_DX_DVIPS" = x; then - DX_DVIPS="" - else - case $cross_compiling:$ac_tool_warned in -yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} -ac_tool_warned=yes ;; -esac - DX_DVIPS=$ac_pt_DX_DVIPS - fi -else - DX_DVIPS="$ac_cv_path_DX_DVIPS" -fi - -if test "$DX_FLAG_$DX_CURRENT_FEATURE$DX_DVIPS" = 1; then - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: dvips not found - will not generate doxygen PostScript documentation" >&5 -$as_echo "$as_me: WARNING: dvips not found - will not generate doxygen PostScript documentation" >&2;} - DX_FLAG_ps=0 - -fi - - -if test -n "$ac_tool_prefix"; then - # Extract the first word of "${ac_tool_prefix}egrep", so it can be a program name with args. -set dummy ${ac_tool_prefix}egrep; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_path_DX_EGREP+:} false; then : - $as_echo_n "(cached) " >&6 -else - case $DX_EGREP in - [\\/]* | ?:[\\/]*) - ac_cv_path_DX_EGREP="$DX_EGREP" # Let the user override the test with a path. - ;; - *) - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_path_DX_EGREP="$as_dir/$ac_word$ac_exec_ext" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - - ;; -esac -fi -DX_EGREP=$ac_cv_path_DX_EGREP -if test -n "$DX_EGREP"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DX_EGREP" >&5 -$as_echo "$DX_EGREP" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - -fi -if test -z "$ac_cv_path_DX_EGREP"; then - ac_pt_DX_EGREP=$DX_EGREP - # Extract the first word of "egrep", so it can be a program name with args. -set dummy egrep; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_path_ac_pt_DX_EGREP+:} false; then : - $as_echo_n "(cached) " >&6 -else - case $ac_pt_DX_EGREP in - [\\/]* | ?:[\\/]*) - ac_cv_path_ac_pt_DX_EGREP="$ac_pt_DX_EGREP" # Let the user override the test with a path. - ;; - *) - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_path_ac_pt_DX_EGREP="$as_dir/$ac_word$ac_exec_ext" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - - ;; -esac -fi -ac_pt_DX_EGREP=$ac_cv_path_ac_pt_DX_EGREP -if test -n "$ac_pt_DX_EGREP"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_pt_DX_EGREP" >&5 -$as_echo "$ac_pt_DX_EGREP" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - if test "x$ac_pt_DX_EGREP" = x; then - DX_EGREP="" - else - case $cross_compiling:$ac_tool_warned in -yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} -ac_tool_warned=yes ;; -esac - DX_EGREP=$ac_pt_DX_EGREP - fi -else - DX_EGREP="$ac_cv_path_DX_EGREP" -fi - -if test "$DX_FLAG_$DX_CURRENT_FEATURE$DX_EGREP" = 1; then - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: egrep not found - will not generate doxygen PostScript documentation" >&5 -$as_echo "$as_me: WARNING: egrep not found - will not generate doxygen PostScript documentation" >&2;} - DX_FLAG_ps=0 - -fi - - : -fi -if test "$DX_FLAG_ps" = 1; then - if :; then - DX_COND_ps_TRUE= - DX_COND_ps_FALSE='#' -else - DX_COND_ps_TRUE='#' - DX_COND_ps_FALSE= -fi - - - : -else - if false; then - DX_COND_ps_TRUE= - DX_COND_ps_FALSE='#' -else - DX_COND_ps_TRUE='#' - DX_COND_ps_FALSE= -fi - - - : -fi - - -# PDF file generation: - - - - @%:@ Check whether --enable-doxygen-pdf was given. -if test "${enable_doxygen_pdf+set}" = set; then : - enableval=$enable_doxygen_pdf; -case "$enableval" in -#( -y|Y|yes|Yes|YES) - DX_FLAG_pdf=1 - - -test "$DX_FLAG_doc" = "1" \ -|| as_fn_error $? "doxygen-pdf requires doxygen-pdf" "$LINENO" 5 - -;; #( -n|N|no|No|NO) - DX_FLAG_pdf=0 - -;; #( -*) - as_fn_error $? "invalid value '$enableval' given to doxygen-pdf" "$LINENO" 5 -;; -esac - -else - -DX_FLAG_pdf=0 - - -test "$DX_FLAG_doc" = "1" || DX_FLAG_pdf=0 - - - -fi - -if test "$DX_FLAG_pdf" = 1; then - -if test -n "$ac_tool_prefix"; then - # Extract the first word of "${ac_tool_prefix}pdflatex", so it can be a program name with args. -set dummy ${ac_tool_prefix}pdflatex; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_path_DX_PDFLATEX+:} false; then : - $as_echo_n "(cached) " >&6 -else - case $DX_PDFLATEX in - [\\/]* | ?:[\\/]*) - ac_cv_path_DX_PDFLATEX="$DX_PDFLATEX" # Let the user override the test with a path. - ;; - *) - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_path_DX_PDFLATEX="$as_dir/$ac_word$ac_exec_ext" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - - ;; -esac -fi -DX_PDFLATEX=$ac_cv_path_DX_PDFLATEX -if test -n "$DX_PDFLATEX"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DX_PDFLATEX" >&5 -$as_echo "$DX_PDFLATEX" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - -fi -if test -z "$ac_cv_path_DX_PDFLATEX"; then - ac_pt_DX_PDFLATEX=$DX_PDFLATEX - # Extract the first word of "pdflatex", so it can be a program name with args. -set dummy pdflatex; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_path_ac_pt_DX_PDFLATEX+:} false; then : - $as_echo_n "(cached) " >&6 -else - case $ac_pt_DX_PDFLATEX in - [\\/]* | ?:[\\/]*) - ac_cv_path_ac_pt_DX_PDFLATEX="$ac_pt_DX_PDFLATEX" # Let the user override the test with a path. - ;; - *) - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_path_ac_pt_DX_PDFLATEX="$as_dir/$ac_word$ac_exec_ext" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - - ;; -esac -fi -ac_pt_DX_PDFLATEX=$ac_cv_path_ac_pt_DX_PDFLATEX -if test -n "$ac_pt_DX_PDFLATEX"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_pt_DX_PDFLATEX" >&5 -$as_echo "$ac_pt_DX_PDFLATEX" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - if test "x$ac_pt_DX_PDFLATEX" = x; then - DX_PDFLATEX="" - else - case $cross_compiling:$ac_tool_warned in -yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} -ac_tool_warned=yes ;; -esac - DX_PDFLATEX=$ac_pt_DX_PDFLATEX - fi -else - DX_PDFLATEX="$ac_cv_path_DX_PDFLATEX" -fi - -if test "$DX_FLAG_$DX_CURRENT_FEATURE$DX_PDFLATEX" = 1; then - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: pdflatex not found - will not generate doxygen PDF documentation" >&5 -$as_echo "$as_me: WARNING: pdflatex not found - will not generate doxygen PDF documentation" >&2;} - DX_FLAG_pdf=0 - -fi - - -if test -n "$ac_tool_prefix"; then - # Extract the first word of "${ac_tool_prefix}makeindex", so it can be a program name with args. -set dummy ${ac_tool_prefix}makeindex; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_path_DX_MAKEINDEX+:} false; then : - $as_echo_n "(cached) " >&6 -else - case $DX_MAKEINDEX in - [\\/]* | ?:[\\/]*) - ac_cv_path_DX_MAKEINDEX="$DX_MAKEINDEX" # Let the user override the test with a path. - ;; - *) - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_path_DX_MAKEINDEX="$as_dir/$ac_word$ac_exec_ext" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - - ;; -esac -fi -DX_MAKEINDEX=$ac_cv_path_DX_MAKEINDEX -if test -n "$DX_MAKEINDEX"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DX_MAKEINDEX" >&5 -$as_echo "$DX_MAKEINDEX" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - -fi -if test -z "$ac_cv_path_DX_MAKEINDEX"; then - ac_pt_DX_MAKEINDEX=$DX_MAKEINDEX - # Extract the first word of "makeindex", so it can be a program name with args. -set dummy makeindex; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_path_ac_pt_DX_MAKEINDEX+:} false; then : - $as_echo_n "(cached) " >&6 -else - case $ac_pt_DX_MAKEINDEX in - [\\/]* | ?:[\\/]*) - ac_cv_path_ac_pt_DX_MAKEINDEX="$ac_pt_DX_MAKEINDEX" # Let the user override the test with a path. - ;; - *) - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_path_ac_pt_DX_MAKEINDEX="$as_dir/$ac_word$ac_exec_ext" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - - ;; -esac -fi -ac_pt_DX_MAKEINDEX=$ac_cv_path_ac_pt_DX_MAKEINDEX -if test -n "$ac_pt_DX_MAKEINDEX"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_pt_DX_MAKEINDEX" >&5 -$as_echo "$ac_pt_DX_MAKEINDEX" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - if test "x$ac_pt_DX_MAKEINDEX" = x; then - DX_MAKEINDEX="" - else - case $cross_compiling:$ac_tool_warned in -yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} -ac_tool_warned=yes ;; -esac - DX_MAKEINDEX=$ac_pt_DX_MAKEINDEX - fi -else - DX_MAKEINDEX="$ac_cv_path_DX_MAKEINDEX" -fi - -if test "$DX_FLAG_$DX_CURRENT_FEATURE$DX_MAKEINDEX" = 1; then - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: makeindex not found - will not generate doxygen PDF documentation" >&5 -$as_echo "$as_me: WARNING: makeindex not found - will not generate doxygen PDF documentation" >&2;} - DX_FLAG_pdf=0 - -fi - - -if test -n "$ac_tool_prefix"; then - # Extract the first word of "${ac_tool_prefix}egrep", so it can be a program name with args. -set dummy ${ac_tool_prefix}egrep; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_path_DX_EGREP+:} false; then : - $as_echo_n "(cached) " >&6 -else - case $DX_EGREP in - [\\/]* | ?:[\\/]*) - ac_cv_path_DX_EGREP="$DX_EGREP" # Let the user override the test with a path. - ;; - *) - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_path_DX_EGREP="$as_dir/$ac_word$ac_exec_ext" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - - ;; -esac -fi -DX_EGREP=$ac_cv_path_DX_EGREP -if test -n "$DX_EGREP"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DX_EGREP" >&5 -$as_echo "$DX_EGREP" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - -fi -if test -z "$ac_cv_path_DX_EGREP"; then - ac_pt_DX_EGREP=$DX_EGREP - # Extract the first word of "egrep", so it can be a program name with args. -set dummy egrep; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_path_ac_pt_DX_EGREP+:} false; then : - $as_echo_n "(cached) " >&6 -else - case $ac_pt_DX_EGREP in - [\\/]* | ?:[\\/]*) - ac_cv_path_ac_pt_DX_EGREP="$ac_pt_DX_EGREP" # Let the user override the test with a path. - ;; - *) - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_path_ac_pt_DX_EGREP="$as_dir/$ac_word$ac_exec_ext" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - - ;; -esac -fi -ac_pt_DX_EGREP=$ac_cv_path_ac_pt_DX_EGREP -if test -n "$ac_pt_DX_EGREP"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_pt_DX_EGREP" >&5 -$as_echo "$ac_pt_DX_EGREP" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - if test "x$ac_pt_DX_EGREP" = x; then - DX_EGREP="" - else - case $cross_compiling:$ac_tool_warned in -yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} -ac_tool_warned=yes ;; -esac - DX_EGREP=$ac_pt_DX_EGREP - fi -else - DX_EGREP="$ac_cv_path_DX_EGREP" -fi - -if test "$DX_FLAG_$DX_CURRENT_FEATURE$DX_EGREP" = 1; then - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: egrep not found - will not generate doxygen PDF documentation" >&5 -$as_echo "$as_me: WARNING: egrep not found - will not generate doxygen PDF documentation" >&2;} - DX_FLAG_pdf=0 - -fi - - : -fi -if test "$DX_FLAG_pdf" = 1; then - if :; then - DX_COND_pdf_TRUE= - DX_COND_pdf_FALSE='#' -else - DX_COND_pdf_TRUE='#' - DX_COND_pdf_FALSE= -fi - - - : -else - if false; then - DX_COND_pdf_TRUE= - DX_COND_pdf_FALSE='#' -else - DX_COND_pdf_TRUE='#' - DX_COND_pdf_FALSE= -fi - - - : -fi - - -# LaTeX generation for PS and/or PDF: -if test "$DX_FLAG_ps" = 1 || test "$DX_FLAG_pdf" = 1; then - if :; then - DX_COND_latex_TRUE= - DX_COND_latex_FALSE='#' -else - DX_COND_latex_TRUE='#' - DX_COND_latex_FALSE= -fi - - DX_ENV="$DX_ENV GENERATE_LATEX='YES'" - -else - if false; then - DX_COND_latex_TRUE= - DX_COND_latex_FALSE='#' -else - DX_COND_latex_TRUE='#' - DX_COND_latex_FALSE= -fi - - DX_ENV="$DX_ENV GENERATE_LATEX='NO'" - -fi - -# Paper size for PS and/or PDF: - -case "$DOXYGEN_PAPER_SIZE" in -#( -"") - DOXYGEN_PAPER_SIZE="" - -;; #( -a4wide|a4|letter|legal|executive) - DX_ENV="$DX_ENV PAPER_SIZE='$DOXYGEN_PAPER_SIZE'" - -;; #( -*) - as_fn_error $? "unknown DOXYGEN_PAPER_SIZE='$DOXYGEN_PAPER_SIZE'" "$LINENO" 5 -;; -esac - -#For debugging: -#echo DX_FLAG_doc=$DX_FLAG_doc -#echo DX_FLAG_dot=$DX_FLAG_dot -#echo DX_FLAG_man=$DX_FLAG_man -#echo DX_FLAG_html=$DX_FLAG_html -#echo DX_FLAG_chm=$DX_FLAG_chm -#echo DX_FLAG_chi=$DX_FLAG_chi -#echo DX_FLAG_rtf=$DX_FLAG_rtf -#echo DX_FLAG_xml=$DX_FLAG_xml -#echo DX_FLAG_pdf=$DX_FLAG_pdf -#echo DX_FLAG_ps=$DX_FLAG_ps -#echo DX_ENV=$DX_ENV - - -# initialize automake -am__api_version='1.11' - -ac_aux_dir= -for ac_dir in "$srcdir" "$srcdir/.." "$srcdir/../.."; do - if test -f "$ac_dir/install-sh"; then - ac_aux_dir=$ac_dir - ac_install_sh="$ac_aux_dir/install-sh -c" - break - elif test -f "$ac_dir/install.sh"; then - ac_aux_dir=$ac_dir - ac_install_sh="$ac_aux_dir/install.sh -c" - break - elif test -f "$ac_dir/shtool"; then - ac_aux_dir=$ac_dir - ac_install_sh="$ac_aux_dir/shtool install -c" - break - fi -done -if test -z "$ac_aux_dir"; then - as_fn_error $? "cannot find install-sh, install.sh, or shtool in \"$srcdir\" \"$srcdir/..\" \"$srcdir/../..\"" "$LINENO" 5 -fi - -# These three variables are undocumented and unsupported, -# and are intended to be withdrawn in a future Autoconf release. -# They can cause serious problems if a builder's source tree is in a directory -# whose full name contains unusual characters. -ac_config_guess="$SHELL $ac_aux_dir/config.guess" # Please don't use this var. -ac_config_sub="$SHELL $ac_aux_dir/config.sub" # Please don't use this var. -ac_configure="$SHELL $ac_aux_dir/configure" # Please don't use this var. - - -# Find a good install program. We prefer a C program (faster), -# so one script is as good as another. But avoid the broken or -# incompatible versions: -# SysV /etc/install, /usr/sbin/install -# SunOS /usr/etc/install -# IRIX /sbin/install -# AIX /bin/install -# AmigaOS /C/install, which installs bootblocks on floppy discs -# AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag -# AFS /usr/afsws/bin/install, which mishandles nonexistent args -# SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff" -# OS/2's system install, which has a completely different semantic -# ./install, which can be erroneously created by make from ./install.sh. -# Reject install programs that cannot install multiple files. -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a BSD-compatible install" >&5 -$as_echo_n "checking for a BSD-compatible install... " >&6; } -if test -z "$INSTALL"; then -if ${ac_cv_path_install+:} false; then : - $as_echo_n "(cached) " >&6 -else - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - # Account for people who put trailing slashes in PATH elements. -case $as_dir/ in @%:@(( - ./ | .// | /[cC]/* | \ - /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \ - ?:[\\/]os2[\\/]install[\\/]* | ?:[\\/]OS2[\\/]INSTALL[\\/]* | \ - /usr/ucb/* ) ;; - *) - # OSF1 and SCO ODT 3.0 have their own names for install. - # Don't use installbsd from OSF since it installs stuff as root - # by default. - for ac_prog in ginstall scoinst install; do - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_prog$ac_exec_ext"; then - if test $ac_prog = install && - grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then - # AIX install. It has an incompatible calling convention. - : - elif test $ac_prog = install && - grep pwplus "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then - # program-specific install script used by HP pwplus--don't use. - : - else - rm -rf conftest.one conftest.two conftest.dir - echo one > conftest.one - echo two > conftest.two - mkdir conftest.dir - if "$as_dir/$ac_prog$ac_exec_ext" -c conftest.one conftest.two "`pwd`/conftest.dir" && - test -s conftest.one && test -s conftest.two && - test -s conftest.dir/conftest.one && - test -s conftest.dir/conftest.two - then - ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c" - break 3 - fi - fi - fi - done - done - ;; -esac - - done -IFS=$as_save_IFS - -rm -rf conftest.one conftest.two conftest.dir - -fi - if test "${ac_cv_path_install+set}" = set; then - INSTALL=$ac_cv_path_install - else - # As a last resort, use the slow shell script. Don't cache a - # value for INSTALL within a source directory, because that will - # break other packages using the cache if that directory is - # removed, or if the value is a relative name. - INSTALL=$ac_install_sh - fi -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $INSTALL" >&5 -$as_echo "$INSTALL" >&6; } - -# Use test -z because SunOS4 sh mishandles braces in ${var-val}. -# It thinks the first close brace ends the variable substitution. -test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}' - -test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}' - -test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644' - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether build environment is sane" >&5 -$as_echo_n "checking whether build environment is sane... " >&6; } -# Just in case -sleep 1 -echo timestamp > conftest.file -# Reject unsafe characters in $srcdir or the absolute working directory -# name. Accept space and tab only in the latter. -am_lf=' -' -case `pwd` in - *[\\\"\#\$\&\'\`$am_lf]*) - as_fn_error $? "unsafe absolute working directory name" "$LINENO" 5;; -esac -case $srcdir in - *[\\\"\#\$\&\'\`$am_lf\ \ ]*) - as_fn_error $? "unsafe srcdir value: \`$srcdir'" "$LINENO" 5;; -esac - -# Do `set' in a subshell so we don't clobber the current shell's -# arguments. Must try -L first in case configure is actually a -# symlink; some systems play weird games with the mod time of symlinks -# (eg FreeBSD returns the mod time of the symlink's containing -# directory). -if ( - set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null` - if test "$*" = "X"; then - # -L didn't work. - set X `ls -t "$srcdir/configure" conftest.file` - fi - rm -f conftest.file - if test "$*" != "X $srcdir/configure conftest.file" \ - && test "$*" != "X conftest.file $srcdir/configure"; then - - # If neither matched, then we have a broken ls. This can happen - # if, for instance, CONFIG_SHELL is bash and it inherits a - # broken ls alias from the environment. This has actually - # happened. Such a system could not be considered "sane". - as_fn_error $? "ls -t appears to fail. Make sure there is not a broken -alias in your environment" "$LINENO" 5 - fi - - test "$2" = conftest.file - ) -then - # Ok. - : -else - as_fn_error $? "newly created file is older than distributed files! -Check your system clock" "$LINENO" 5 -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; } -test "$program_prefix" != NONE && - program_transform_name="s&^&$program_prefix&;$program_transform_name" -# Use a double $ so make ignores it. -test "$program_suffix" != NONE && - program_transform_name="s&\$&$program_suffix&;$program_transform_name" -# Double any \ or $. -# By default was `s,x,x', remove it if useless. -ac_script='s/[\\$]/&&/g;s/;s,x,x,$//' -program_transform_name=`$as_echo "$program_transform_name" | sed "$ac_script"` - -# expand $ac_aux_dir to an absolute path -am_aux_dir=`cd $ac_aux_dir && pwd` - -if test x"${MISSING+set}" != xset; then - case $am_aux_dir in - *\ * | *\ *) - MISSING="\${SHELL} \"$am_aux_dir/missing\"" ;; - *) - MISSING="\${SHELL} $am_aux_dir/missing" ;; - esac -fi -# Use eval to expand $SHELL -if eval "$MISSING --run true"; then - am_missing_run="$MISSING --run " -else - am_missing_run= - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: \`missing' script is too old or missing" >&5 -$as_echo "$as_me: WARNING: \`missing' script is too old or missing" >&2;} -fi - -if test x"${install_sh}" != xset; then - case $am_aux_dir in - *\ * | *\ *) - install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;; - *) - install_sh="\${SHELL} $am_aux_dir/install-sh" - esac -fi - -# Installed binaries are usually stripped using `strip' when the user -# run `make install-strip'. However `strip' might not be the right -# tool to use in cross-compilation environments, therefore Automake -# will honor the `STRIP' environment variable to overrule this program. -if test "$cross_compiling" != no; then - if test -n "$ac_tool_prefix"; then - # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args. -set dummy ${ac_tool_prefix}strip; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_STRIP+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$STRIP"; then - ac_cv_prog_STRIP="$STRIP" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_STRIP="${ac_tool_prefix}strip" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -STRIP=$ac_cv_prog_STRIP -if test -n "$STRIP"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $STRIP" >&5 -$as_echo "$STRIP" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - -fi -if test -z "$ac_cv_prog_STRIP"; then - ac_ct_STRIP=$STRIP - # Extract the first word of "strip", so it can be a program name with args. -set dummy strip; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_ac_ct_STRIP+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$ac_ct_STRIP"; then - ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_ac_ct_STRIP="strip" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP -if test -n "$ac_ct_STRIP"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP" >&5 -$as_echo "$ac_ct_STRIP" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - if test "x$ac_ct_STRIP" = x; then - STRIP=":" - else - case $cross_compiling:$ac_tool_warned in -yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} -ac_tool_warned=yes ;; -esac - STRIP=$ac_ct_STRIP - fi -else - STRIP="$ac_cv_prog_STRIP" -fi - -fi -INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s" - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a thread-safe mkdir -p" >&5 -$as_echo_n "checking for a thread-safe mkdir -p... " >&6; } -if test -z "$MKDIR_P"; then - if ${ac_cv_path_mkdir+:} false; then : - $as_echo_n "(cached) " >&6 -else - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH$PATH_SEPARATOR/opt/sfw/bin -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_prog in mkdir gmkdir; do - for ac_exec_ext in '' $ac_executable_extensions; do - as_fn_executable_p "$as_dir/$ac_prog$ac_exec_ext" || continue - case `"$as_dir/$ac_prog$ac_exec_ext" --version 2>&1` in #( - 'mkdir (GNU coreutils) '* | \ - 'mkdir (coreutils) '* | \ - 'mkdir (fileutils) '4.1*) - ac_cv_path_mkdir=$as_dir/$ac_prog$ac_exec_ext - break 3;; - esac - done - done - done -IFS=$as_save_IFS - -fi - - test -d ./--version && rmdir ./--version - if test "${ac_cv_path_mkdir+set}" = set; then - MKDIR_P="$ac_cv_path_mkdir -p" - else - # As a last resort, use the slow shell script. Don't cache a - # value for MKDIR_P within a source directory, because that will - # break other packages using the cache if that directory is - # removed, or if the value is a relative name. - MKDIR_P="$ac_install_sh -d" - fi -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $MKDIR_P" >&5 -$as_echo "$MKDIR_P" >&6; } - -mkdir_p="$MKDIR_P" -case $mkdir_p in - [\\/$]* | ?:[\\/]*) ;; - */*) mkdir_p="\$(top_builddir)/$mkdir_p" ;; -esac - -for ac_prog in gawk mawk nawk awk -do - # Extract the first word of "$ac_prog", so it can be a program name with args. -set dummy $ac_prog; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_AWK+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$AWK"; then - ac_cv_prog_AWK="$AWK" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_AWK="$ac_prog" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -AWK=$ac_cv_prog_AWK -if test -n "$AWK"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AWK" >&5 -$as_echo "$AWK" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - - test -n "$AWK" && break -done - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} sets \$(MAKE)" >&5 -$as_echo_n "checking whether ${MAKE-make} sets \$(MAKE)... " >&6; } -set x ${MAKE-make} -ac_make=`$as_echo "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'` -if eval \${ac_cv_prog_make_${ac_make}_set+:} false; then : - $as_echo_n "(cached) " >&6 -else - cat >conftest.make <<\_ACEOF -SHELL = /bin/sh -all: - @echo '@@@%%%=$(MAKE)=@@@%%%' -_ACEOF -# GNU make sometimes prints "make[1]: Entering ...", which would confuse us. -case `${MAKE-make} -f conftest.make 2>/dev/null` in - *@@@%%%=?*=@@@%%%*) - eval ac_cv_prog_make_${ac_make}_set=yes;; - *) - eval ac_cv_prog_make_${ac_make}_set=no;; -esac -rm -f conftest.make -fi -if eval test \$ac_cv_prog_make_${ac_make}_set = yes; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; } - SET_MAKE= -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } - SET_MAKE="MAKE=${MAKE-make}" -fi - -rm -rf .tst 2>/dev/null -mkdir .tst 2>/dev/null -if test -d .tst; then - am__leading_dot=. -else - am__leading_dot=_ -fi -rmdir .tst 2>/dev/null - -if test "`cd $srcdir && pwd`" != "`pwd`"; then - # Use -I$(srcdir) only when $(srcdir) != ., so that make's output - # is not polluted with repeated "-I." - am__isrc=' -I$(srcdir)' - # test to see if srcdir already configured - if test -f $srcdir/config.status; then - as_fn_error $? "source directory already configured; run \"make distclean\" there first" "$LINENO" 5 - fi -fi - -# test whether we have cygpath -if test -z "$CYGPATH_W"; then - if (cygpath --version) >/dev/null 2>/dev/null; then - CYGPATH_W='cygpath -w' - else - CYGPATH_W=echo - fi -fi - - -# Define the identity of the package. - PACKAGE='zookeeper' - VERSION='3.4.5' - - -cat >>confdefs.h <<_ACEOF -@%:@define PACKAGE "$PACKAGE" -_ACEOF - - -cat >>confdefs.h <<_ACEOF -@%:@define VERSION "$VERSION" -_ACEOF - -# Some tools Automake needs. - -ACLOCAL=${ACLOCAL-"${am_missing_run}aclocal-${am__api_version}"} - - -AUTOCONF=${AUTOCONF-"${am_missing_run}autoconf"} - - -AUTOMAKE=${AUTOMAKE-"${am_missing_run}automake-${am__api_version}"} - - -AUTOHEADER=${AUTOHEADER-"${am_missing_run}autoheader"} - - -MAKEINFO=${MAKEINFO-"${am_missing_run}makeinfo"} - -# We need awk for the "check" target. The system "awk" is bad on -# some platforms. -# Always define AMTAR for backward compatibility. Yes, it's still used -# in the wild :-( We should find a proper way to deprecate it ... -AMTAR='$${TAR-tar}' - -am__tar='$${TAR-tar} chof - "$$tardir"' am__untar='$${TAR-tar} xf -' - - - - - -ac_config_headers="$ac_config_headers config.h" - - -# Checks for programs. - -@%:@ Check whether --with-cppunit was given. -if test "${with_cppunit+set}" = set; then : - withval=$with_cppunit; -fi - - -if test "$with_cppunit" = "no" ; then - CPPUNIT_PATH="No_CPPUNIT" - CPPUNIT_INCLUDE= - CPPUNIT_LIBS= -else - AM_PATH_CPPUNIT(1.10.2) -fi - -if test "$CALLER" = "ANT" ; then -CPPUNIT_CFLAGS="$CPPUNIT_CFLAGS -DZKSERVER_CMD=\"\\\"${base_dir}/src/c/tests/zkServer.sh\\\"\"" -else -CPPUNIT_CFLAGS="$CPPUNIT_CFLAGS -DZKSERVER_CMD=\"\\\"./tests/zkServer.sh\\\"\"" -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for generated/zookeeper.jute.c" >&5 -$as_echo_n "checking for generated/zookeeper.jute.c... " >&6; } -if ${ac_cv_file_generated_zookeeper_jute_c+:} false; then : - $as_echo_n "(cached) " >&6 -else - test "$cross_compiling" = yes && - as_fn_error $? "cannot check for file existence when cross compiling" "$LINENO" 5 -if test -r "generated/zookeeper.jute.c"; then - ac_cv_file_generated_zookeeper_jute_c=yes -else - ac_cv_file_generated_zookeeper_jute_c=no -fi -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_file_generated_zookeeper_jute_c" >&5 -$as_echo "$ac_cv_file_generated_zookeeper_jute_c" >&6; } -if test "x$ac_cv_file_generated_zookeeper_jute_c" = xyes; then : - -cat >>confdefs.h <<_ACEOF -@%:@define HAVE_GENERATED_ZOOKEEPER_JUTE_C 1 -_ACEOF - -else - as_fn_error $? "jute files are missing! Please run \"ant compile_jute\" while in the zookeeper top level directory." "$LINENO" 5 - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for generated/zookeeper.jute.h" >&5 -$as_echo_n "checking for generated/zookeeper.jute.h... " >&6; } -if ${ac_cv_file_generated_zookeeper_jute_h+:} false; then : - $as_echo_n "(cached) " >&6 -else - test "$cross_compiling" = yes && - as_fn_error $? "cannot check for file existence when cross compiling" "$LINENO" 5 -if test -r "generated/zookeeper.jute.h"; then - ac_cv_file_generated_zookeeper_jute_h=yes -else - ac_cv_file_generated_zookeeper_jute_h=no -fi -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_file_generated_zookeeper_jute_h" >&5 -$as_echo "$ac_cv_file_generated_zookeeper_jute_h" >&6; } -if test "x$ac_cv_file_generated_zookeeper_jute_h" = xyes; then : - -cat >>confdefs.h <<_ACEOF -@%:@define HAVE_GENERATED_ZOOKEEPER_JUTE_H 1 -_ACEOF - -else - as_fn_error $? "jute files are missing! Please run \"ant compile_jute\" while in the zookeeper top level directory." "$LINENO" 5 - -fi - -fi - - -ac_ext=c -ac_cpp='$CPP $CPPFLAGS' -ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_c_compiler_gnu -if test -n "$ac_tool_prefix"; then - # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args. -set dummy ${ac_tool_prefix}gcc; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_CC+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$CC"; then - ac_cv_prog_CC="$CC" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_CC="${ac_tool_prefix}gcc" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -CC=$ac_cv_prog_CC -if test -n "$CC"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 -$as_echo "$CC" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - -fi -if test -z "$ac_cv_prog_CC"; then - ac_ct_CC=$CC - # Extract the first word of "gcc", so it can be a program name with args. -set dummy gcc; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_ac_ct_CC+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$ac_ct_CC"; then - ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_ac_ct_CC="gcc" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -ac_ct_CC=$ac_cv_prog_ac_ct_CC -if test -n "$ac_ct_CC"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 -$as_echo "$ac_ct_CC" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - if test "x$ac_ct_CC" = x; then - CC="" - else - case $cross_compiling:$ac_tool_warned in -yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} -ac_tool_warned=yes ;; -esac - CC=$ac_ct_CC - fi -else - CC="$ac_cv_prog_CC" -fi - -if test -z "$CC"; then - if test -n "$ac_tool_prefix"; then - # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args. -set dummy ${ac_tool_prefix}cc; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_CC+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$CC"; then - ac_cv_prog_CC="$CC" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_CC="${ac_tool_prefix}cc" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -CC=$ac_cv_prog_CC -if test -n "$CC"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 -$as_echo "$CC" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - - fi -fi -if test -z "$CC"; then - # Extract the first word of "cc", so it can be a program name with args. -set dummy cc; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_CC+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$CC"; then - ac_cv_prog_CC="$CC" # Let the user override the test. -else - ac_prog_rejected=no -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then - ac_prog_rejected=yes - continue - fi - ac_cv_prog_CC="cc" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -if test $ac_prog_rejected = yes; then - # We found a bogon in the path, so make sure we never use it. - set dummy $ac_cv_prog_CC - shift - if test $@%:@ != 0; then - # We chose a different compiler from the bogus one. - # However, it has the same basename, so the bogon will be chosen - # first if we set CC to just the basename; use the full file name. - shift - ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@" - fi -fi -fi -fi -CC=$ac_cv_prog_CC -if test -n "$CC"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 -$as_echo "$CC" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - -fi -if test -z "$CC"; then - if test -n "$ac_tool_prefix"; then - for ac_prog in cl.exe - do - # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. -set dummy $ac_tool_prefix$ac_prog; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_CC+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$CC"; then - ac_cv_prog_CC="$CC" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_CC="$ac_tool_prefix$ac_prog" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -CC=$ac_cv_prog_CC -if test -n "$CC"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 -$as_echo "$CC" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - - test -n "$CC" && break - done -fi -if test -z "$CC"; then - ac_ct_CC=$CC - for ac_prog in cl.exe -do - # Extract the first word of "$ac_prog", so it can be a program name with args. -set dummy $ac_prog; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_ac_ct_CC+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$ac_ct_CC"; then - ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_ac_ct_CC="$ac_prog" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -ac_ct_CC=$ac_cv_prog_ac_ct_CC -if test -n "$ac_ct_CC"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 -$as_echo "$ac_ct_CC" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - - test -n "$ac_ct_CC" && break -done - - if test "x$ac_ct_CC" = x; then - CC="" - else - case $cross_compiling:$ac_tool_warned in -yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} -ac_tool_warned=yes ;; -esac - CC=$ac_ct_CC - fi -fi - -fi - - -test -z "$CC" && { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 -$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} -as_fn_error $? "no acceptable C compiler found in \$PATH -See \`config.log' for more details" "$LINENO" 5; } - -# Provide some information about the compiler. -$as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5 -set X $ac_compile -ac_compiler=$2 -for ac_option in --version -v -V -qversion; do - { { ac_try="$ac_compiler $ac_option >&5" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 - (eval "$ac_compiler $ac_option >&5") 2>conftest.err - ac_status=$? - if test -s conftest.err; then - sed '10a\ -... rest of stderr output deleted ... - 10q' conftest.err >conftest.er1 - cat conftest.er1 >&5 - fi - rm -f conftest.er1 conftest.err - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } -done - -cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -int -main () -{ - - ; - return 0; -} -_ACEOF -ac_clean_files_save=$ac_clean_files -ac_clean_files="$ac_clean_files a.out a.out.dSYM a.exe b.out" -# Try to create an executable without -o first, disregard a.out. -# It will help us diagnose broken compilers, and finding out an intuition -# of exeext. -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler works" >&5 -$as_echo_n "checking whether the C compiler works... " >&6; } -ac_link_default=`$as_echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'` - -# The possible output files: -ac_files="a.out conftest.exe conftest a.exe a_out.exe b.out conftest.*" - -ac_rmfiles= -for ac_file in $ac_files -do - case $ac_file in - *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; - * ) ac_rmfiles="$ac_rmfiles $ac_file";; - esac -done -rm -f $ac_rmfiles - -if { { ac_try="$ac_link_default" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 - (eval "$ac_link_default") 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; }; then : - # Autoconf-2.13 could set the ac_cv_exeext variable to `no'. -# So ignore a value of `no', otherwise this would lead to `EXEEXT = no' -# in a Makefile. We should not override ac_cv_exeext if it was cached, -# so that the user can short-circuit this test for compilers unknown to -# Autoconf. -for ac_file in $ac_files '' -do - test -f "$ac_file" || continue - case $ac_file in - *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) - ;; - [ab].out ) - # We found the default executable, but exeext='' is most - # certainly right. - break;; - *.* ) - if test "${ac_cv_exeext+set}" = set && test "$ac_cv_exeext" != no; - then :; else - ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` - fi - # We set ac_cv_exeext here because the later test for it is not - # safe: cross compilers may not add the suffix if given an `-o' - # argument, so we may need to know it at that point already. - # Even if this section looks crufty: it has the advantage of - # actually working. - break;; - * ) - break;; - esac -done -test "$ac_cv_exeext" = no && ac_cv_exeext= - -else - ac_file='' -fi -if test -z "$ac_file"; then : - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -$as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 -$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} -as_fn_error 77 "C compiler cannot create executables -See \`config.log' for more details" "$LINENO" 5; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; } -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler default output file name" >&5 -$as_echo_n "checking for C compiler default output file name... " >&6; } -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_file" >&5 -$as_echo "$ac_file" >&6; } -ac_exeext=$ac_cv_exeext - -rm -f -r a.out a.out.dSYM a.exe conftest$ac_cv_exeext b.out -ac_clean_files=$ac_clean_files_save -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of executables" >&5 -$as_echo_n "checking for suffix of executables... " >&6; } -if { { ac_try="$ac_link" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 - (eval "$ac_link") 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; }; then : - # If both `conftest.exe' and `conftest' are `present' (well, observable) -# catch `conftest.exe'. For instance with Cygwin, `ls conftest' will -# work properly (i.e., refer to `conftest.exe'), while it won't with -# `rm'. -for ac_file in conftest.exe conftest conftest.*; do - test -f "$ac_file" || continue - case $ac_file in - *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; - *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` - break;; - * ) break;; - esac -done -else - { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 -$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} -as_fn_error $? "cannot compute suffix of executables: cannot compile and link -See \`config.log' for more details" "$LINENO" 5; } -fi -rm -f conftest conftest$ac_cv_exeext -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_exeext" >&5 -$as_echo "$ac_cv_exeext" >&6; } - -rm -f conftest.$ac_ext -EXEEXT=$ac_cv_exeext -ac_exeext=$EXEEXT -cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -@%:@include -int -main () -{ -FILE *f = fopen ("conftest.out", "w"); - return ferror (f) || fclose (f) != 0; - - ; - return 0; -} -_ACEOF -ac_clean_files="$ac_clean_files conftest.out" -# Check that the compiler produces executables we can run. If not, either -# the compiler is broken, or we cross compile. -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are cross compiling" >&5 -$as_echo_n "checking whether we are cross compiling... " >&6; } -if test "$cross_compiling" != yes; then - { { ac_try="$ac_link" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 - (eval "$ac_link") 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } - if { ac_try='./conftest$ac_cv_exeext' - { { case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 - (eval "$ac_try") 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; }; }; then - cross_compiling=no - else - if test "$cross_compiling" = maybe; then - cross_compiling=yes - else - { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 -$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} -as_fn_error $? "cannot run C compiled programs. -If you meant to cross compile, use \`--host'. -See \`config.log' for more details" "$LINENO" 5; } - fi - fi -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $cross_compiling" >&5 -$as_echo "$cross_compiling" >&6; } - -rm -f conftest.$ac_ext conftest$ac_cv_exeext conftest.out -ac_clean_files=$ac_clean_files_save -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of object files" >&5 -$as_echo_n "checking for suffix of object files... " >&6; } -if ${ac_cv_objext+:} false; then : - $as_echo_n "(cached) " >&6 -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -int -main () -{ - - ; - return 0; -} -_ACEOF -rm -f conftest.o conftest.obj -if { { ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 - (eval "$ac_compile") 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; }; then : - for ac_file in conftest.o conftest.obj conftest.*; do - test -f "$ac_file" || continue; - case $ac_file in - *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM ) ;; - *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'` - break;; - esac -done -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 -$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} -as_fn_error $? "cannot compute suffix of object files: cannot compile -See \`config.log' for more details" "$LINENO" 5; } -fi -rm -f conftest.$ac_cv_objext conftest.$ac_ext -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_objext" >&5 -$as_echo "$ac_cv_objext" >&6; } -OBJEXT=$ac_cv_objext -ac_objext=$OBJEXT -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C compiler" >&5 -$as_echo_n "checking whether we are using the GNU C compiler... " >&6; } -if ${ac_cv_c_compiler_gnu+:} false; then : - $as_echo_n "(cached) " >&6 -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -int -main () -{ -#ifndef __GNUC__ - choke me -#endif - - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - ac_compiler_gnu=yes -else - ac_compiler_gnu=no -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -ac_cv_c_compiler_gnu=$ac_compiler_gnu - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5 -$as_echo "$ac_cv_c_compiler_gnu" >&6; } -if test $ac_compiler_gnu = yes; then - GCC=yes -else - GCC= -fi -ac_test_CFLAGS=${CFLAGS+set} -ac_save_CFLAGS=$CFLAGS -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5 -$as_echo_n "checking whether $CC accepts -g... " >&6; } -if ${ac_cv_prog_cc_g+:} false; then : - $as_echo_n "(cached) " >&6 -else - ac_save_c_werror_flag=$ac_c_werror_flag - ac_c_werror_flag=yes - ac_cv_prog_cc_g=no - CFLAGS="-g" - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -int -main () -{ - - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - ac_cv_prog_cc_g=yes -else - CFLAGS="" - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -int -main () -{ - - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - -else - ac_c_werror_flag=$ac_save_c_werror_flag - CFLAGS="-g" - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -int -main () -{ - - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - ac_cv_prog_cc_g=yes -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext - ac_c_werror_flag=$ac_save_c_werror_flag -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5 -$as_echo "$ac_cv_prog_cc_g" >&6; } -if test "$ac_test_CFLAGS" = set; then - CFLAGS=$ac_save_CFLAGS -elif test $ac_cv_prog_cc_g = yes; then - if test "$GCC" = yes; then - CFLAGS="-g -O2" - else - CFLAGS="-g" - fi -else - if test "$GCC" = yes; then - CFLAGS="-O2" - else - CFLAGS= - fi -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5 -$as_echo_n "checking for $CC option to accept ISO C89... " >&6; } -if ${ac_cv_prog_cc_c89+:} false; then : - $as_echo_n "(cached) " >&6 -else - ac_cv_prog_cc_c89=no -ac_save_CC=$CC -cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include -#include -struct stat; -/* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */ -struct buf { int x; }; -FILE * (*rcsopen) (struct buf *, struct stat *, int); -static char *e (p, i) - char **p; - int i; -{ - return p[i]; -} -static char *f (char * (*g) (char **, int), char **p, ...) -{ - char *s; - va_list v; - va_start (v,p); - s = g (p, va_arg (v,int)); - va_end (v); - return s; -} - -/* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has - function prototypes and stuff, but not '\xHH' hex character constants. - These don't provoke an error unfortunately, instead are silently treated - as 'x'. The following induces an error, until -std is added to get - proper ANSI mode. Curiously '\x00'!='x' always comes out true, for an - array size at least. It's necessary to write '\x00'==0 to get something - that's true only with -std. */ -int osf4_cc_array ['\x00' == 0 ? 1 : -1]; - -/* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters - inside strings and character constants. */ -#define FOO(x) 'x' -int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1]; - -int test (int i, double x); -struct s1 {int (*f) (int a);}; -struct s2 {int (*f) (double a);}; -int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int); -int argc; -char **argv; -int -main () -{ -return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]; - ; - return 0; -} -_ACEOF -for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \ - -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" -do - CC="$ac_save_CC $ac_arg" - if ac_fn_c_try_compile "$LINENO"; then : - ac_cv_prog_cc_c89=$ac_arg -fi -rm -f core conftest.err conftest.$ac_objext - test "x$ac_cv_prog_cc_c89" != "xno" && break -done -rm -f conftest.$ac_ext -CC=$ac_save_CC - -fi -# AC_CACHE_VAL -case "x$ac_cv_prog_cc_c89" in - x) - { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 -$as_echo "none needed" >&6; } ;; - xno) - { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 -$as_echo "unsupported" >&6; } ;; - *) - CC="$CC $ac_cv_prog_cc_c89" - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5 -$as_echo "$ac_cv_prog_cc_c89" >&6; } ;; -esac -if test "x$ac_cv_prog_cc_c89" != xno; then : - -fi - -ac_ext=c -ac_cpp='$CPP $CPPFLAGS' -ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_c_compiler_gnu -DEPDIR="${am__leading_dot}deps" - -ac_config_commands="$ac_config_commands depfiles" - - -am_make=${MAKE-make} -cat > confinc << 'END' -am__doit: - @echo this is the am__doit target -.PHONY: am__doit -END -# If we don't find an include directive, just comment out the code. -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for style of include used by $am_make" >&5 -$as_echo_n "checking for style of include used by $am_make... " >&6; } -am__include="#" -am__quote= -_am_result=none -# First try GNU make style include. -echo "include confinc" > confmf -# Ignore all kinds of additional output from `make'. -case `$am_make -s -f confmf 2> /dev/null` in #( -*the\ am__doit\ target*) - am__include=include - am__quote= - _am_result=GNU - ;; -esac -# Now try BSD make style include. -if test "$am__include" = "#"; then - echo '.include "confinc"' > confmf - case `$am_make -s -f confmf 2> /dev/null` in #( - *the\ am__doit\ target*) - am__include=.include - am__quote="\"" - _am_result=BSD - ;; - esac -fi - - -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $_am_result" >&5 -$as_echo "$_am_result" >&6; } -rm -f confinc confmf - -@%:@ Check whether --enable-dependency-tracking was given. -if test "${enable_dependency_tracking+set}" = set; then : - enableval=$enable_dependency_tracking; -fi - -if test "x$enable_dependency_tracking" != xno; then - am_depcomp="$ac_aux_dir/depcomp" - AMDEPBACKSLASH='\' - am__nodep='_no' -fi - if test "x$enable_dependency_tracking" != xno; then - AMDEP_TRUE= - AMDEP_FALSE='#' -else - AMDEP_TRUE='#' - AMDEP_FALSE= -fi - - - -depcc="$CC" am_compiler_list= - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5 -$as_echo_n "checking dependency style of $depcc... " >&6; } -if ${am_cv_CC_dependencies_compiler_type+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then - # We make a subdir and do the tests there. Otherwise we can end up - # making bogus files that we don't know about and never remove. For - # instance it was reported that on HP-UX the gcc test will end up - # making a dummy file named `D' -- because `-MD' means `put the output - # in D'. - rm -rf conftest.dir - mkdir conftest.dir - # Copy depcomp to subdir because otherwise we won't find it if we're - # using a relative directory. - cp "$am_depcomp" conftest.dir - cd conftest.dir - # We will build objects and dependencies in a subdirectory because - # it helps to detect inapplicable dependency modes. For instance - # both Tru64's cc and ICC support -MD to output dependencies as a - # side effect of compilation, but ICC will put the dependencies in - # the current directory while Tru64 will put them in the object - # directory. - mkdir sub - - am_cv_CC_dependencies_compiler_type=none - if test "$am_compiler_list" = ""; then - am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp` - fi - am__universal=false - case " $depcc " in #( - *\ -arch\ *\ -arch\ *) am__universal=true ;; - esac - - for depmode in $am_compiler_list; do - # Setup a source with many dependencies, because some compilers - # like to wrap large dependency lists on column 80 (with \), and - # we should not choose a depcomp mode which is confused by this. - # - # We need to recreate these files for each test, as the compiler may - # overwrite some of them when testing with obscure command lines. - # This happens at least with the AIX C compiler. - : > sub/conftest.c - for i in 1 2 3 4 5 6; do - echo '#include "conftst'$i'.h"' >> sub/conftest.c - # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with - # Solaris 8's {/usr,}/bin/sh. - touch sub/conftst$i.h - done - echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf - - # We check with `-c' and `-o' for the sake of the "dashmstdout" - # mode. It turns out that the SunPro C++ compiler does not properly - # handle `-M -o', and we need to detect this. Also, some Intel - # versions had trouble with output in subdirs - am__obj=sub/conftest.${OBJEXT-o} - am__minus_obj="-o $am__obj" - case $depmode in - gcc) - # This depmode causes a compiler race in universal mode. - test "$am__universal" = false || continue - ;; - nosideeffect) - # after this tag, mechanisms are not by side-effect, so they'll - # only be used when explicitly requested - if test "x$enable_dependency_tracking" = xyes; then - continue - else - break - fi - ;; - msvc7 | msvc7msys | msvisualcpp | msvcmsys) - # This compiler won't grok `-c -o', but also, the minuso test has - # not run yet. These depmodes are late enough in the game, and - # so weak that their functioning should not be impacted. - am__obj=conftest.${OBJEXT-o} - am__minus_obj= - ;; - none) break ;; - esac - if depmode=$depmode \ - source=sub/conftest.c object=$am__obj \ - depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ - $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ - >/dev/null 2>conftest.err && - grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && - grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && - grep $am__obj sub/conftest.Po > /dev/null 2>&1 && - ${MAKE-make} -s -f confmf > /dev/null 2>&1; then - # icc doesn't choke on unknown options, it will just issue warnings - # or remarks (even with -Werror). So we grep stderr for any message - # that says an option was ignored or not supported. - # When given -MP, icc 7.0 and 7.1 complain thusly: - # icc: Command line warning: ignoring option '-M'; no argument required - # The diagnosis changed in icc 8.0: - # icc: Command line remark: option '-MP' not supported - if (grep 'ignoring option' conftest.err || - grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else - am_cv_CC_dependencies_compiler_type=$depmode - break - fi - fi - done - - cd .. - rm -rf conftest.dir -else - am_cv_CC_dependencies_compiler_type=none -fi - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_CC_dependencies_compiler_type" >&5 -$as_echo "$am_cv_CC_dependencies_compiler_type" >&6; } -CCDEPMODE=depmode=$am_cv_CC_dependencies_compiler_type - - if - test "x$enable_dependency_tracking" != xno \ - && test "$am_cv_CC_dependencies_compiler_type" = gcc3; then - am__fastdepCC_TRUE= - am__fastdepCC_FALSE='#' -else - am__fastdepCC_TRUE='#' - am__fastdepCC_FALSE= -fi - - -if test "x$CC" != xcc; then - { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC and cc understand -c and -o together" >&5 -$as_echo_n "checking whether $CC and cc understand -c and -o together... " >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether cc understands -c and -o together" >&5 -$as_echo_n "checking whether cc understands -c and -o together... " >&6; } -fi -set dummy $CC; ac_cc=`$as_echo "$2" | - sed 's/[^a-zA-Z0-9_]/_/g;s/^[0-9]/_/'` -if eval \${ac_cv_prog_cc_${ac_cc}_c_o+:} false; then : - $as_echo_n "(cached) " >&6 -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -int -main () -{ - - ; - return 0; -} -_ACEOF -# Make sure it works both with $CC and with simple cc. -# We do the test twice because some compilers refuse to overwrite an -# existing .o file with -o, though they will create one. -ac_try='$CC -c conftest.$ac_ext -o conftest2.$ac_objext >&5' -rm -f conftest2.* -if { { case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 - (eval "$ac_try") 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } && - test -f conftest2.$ac_objext && { { case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 - (eval "$ac_try") 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; }; -then - eval ac_cv_prog_cc_${ac_cc}_c_o=yes - if test "x$CC" != xcc; then - # Test first that cc exists at all. - if { ac_try='cc -c conftest.$ac_ext >&5' - { { case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 - (eval "$ac_try") 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; }; }; then - ac_try='cc -c conftest.$ac_ext -o conftest2.$ac_objext >&5' - rm -f conftest2.* - if { { case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 - (eval "$ac_try") 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } && - test -f conftest2.$ac_objext && { { case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 - (eval "$ac_try") 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; }; - then - # cc works too. - : - else - # cc exists but doesn't like -o. - eval ac_cv_prog_cc_${ac_cc}_c_o=no - fi - fi - fi -else - eval ac_cv_prog_cc_${ac_cc}_c_o=no -fi -rm -f core conftest* - -fi -if eval test \$ac_cv_prog_cc_${ac_cc}_c_o = yes; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } - -$as_echo "@%:@define NO_MINUS_C_MINUS_O 1" >>confdefs.h - -fi - -# FIXME: we rely on the cache variable name because -# there is no other way. -set dummy $CC -am_cc=`echo $2 | sed 's/[^a-zA-Z0-9_]/_/g;s/^[0-9]/_/'` -eval am_t=\$ac_cv_prog_cc_${am_cc}_c_o -if test "$am_t" != yes; then - # Losing compiler, so override with the script. - # FIXME: It is wrong to rewrite CC. - # But if we don't then we get into trouble of one sort or another. - # A longer-term fix would be to have automake use am__CC in this case, - # and then we could set am__CC="\$(top_srcdir)/compile \$(CC)" - CC="$am_aux_dir/compile $CC" -fi - - -ac_ext=cpp -ac_cpp='$CXXCPP $CPPFLAGS' -ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_cxx_compiler_gnu -if test -z "$CXX"; then - if test -n "$CCC"; then - CXX=$CCC - else - if test -n "$ac_tool_prefix"; then - for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC - do - # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. -set dummy $ac_tool_prefix$ac_prog; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_CXX+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$CXX"; then - ac_cv_prog_CXX="$CXX" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_CXX="$ac_tool_prefix$ac_prog" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -CXX=$ac_cv_prog_CXX -if test -n "$CXX"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CXX" >&5 -$as_echo "$CXX" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - - test -n "$CXX" && break - done -fi -if test -z "$CXX"; then - ac_ct_CXX=$CXX - for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC -do - # Extract the first word of "$ac_prog", so it can be a program name with args. -set dummy $ac_prog; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_ac_ct_CXX+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$ac_ct_CXX"; then - ac_cv_prog_ac_ct_CXX="$ac_ct_CXX" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_ac_ct_CXX="$ac_prog" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -ac_ct_CXX=$ac_cv_prog_ac_ct_CXX -if test -n "$ac_ct_CXX"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CXX" >&5 -$as_echo "$ac_ct_CXX" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - - test -n "$ac_ct_CXX" && break -done - - if test "x$ac_ct_CXX" = x; then - CXX="g++" - else - case $cross_compiling:$ac_tool_warned in -yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} -ac_tool_warned=yes ;; -esac - CXX=$ac_ct_CXX - fi -fi - - fi -fi -# Provide some information about the compiler. -$as_echo "$as_me:${as_lineno-$LINENO}: checking for C++ compiler version" >&5 -set X $ac_compile -ac_compiler=$2 -for ac_option in --version -v -V -qversion; do - { { ac_try="$ac_compiler $ac_option >&5" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 - (eval "$ac_compiler $ac_option >&5") 2>conftest.err - ac_status=$? - if test -s conftest.err; then - sed '10a\ -... rest of stderr output deleted ... - 10q' conftest.err >conftest.er1 - cat conftest.er1 >&5 - fi - rm -f conftest.er1 conftest.err - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } -done - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C++ compiler" >&5 -$as_echo_n "checking whether we are using the GNU C++ compiler... " >&6; } -if ${ac_cv_cxx_compiler_gnu+:} false; then : - $as_echo_n "(cached) " >&6 -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -int -main () -{ -#ifndef __GNUC__ - choke me -#endif - - ; - return 0; -} -_ACEOF -if ac_fn_cxx_try_compile "$LINENO"; then : - ac_compiler_gnu=yes -else - ac_compiler_gnu=no -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -ac_cv_cxx_compiler_gnu=$ac_compiler_gnu - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_cxx_compiler_gnu" >&5 -$as_echo "$ac_cv_cxx_compiler_gnu" >&6; } -if test $ac_compiler_gnu = yes; then - GXX=yes -else - GXX= -fi -ac_test_CXXFLAGS=${CXXFLAGS+set} -ac_save_CXXFLAGS=$CXXFLAGS -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CXX accepts -g" >&5 -$as_echo_n "checking whether $CXX accepts -g... " >&6; } -if ${ac_cv_prog_cxx_g+:} false; then : - $as_echo_n "(cached) " >&6 -else - ac_save_cxx_werror_flag=$ac_cxx_werror_flag - ac_cxx_werror_flag=yes - ac_cv_prog_cxx_g=no - CXXFLAGS="-g" - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -int -main () -{ - - ; - return 0; -} -_ACEOF -if ac_fn_cxx_try_compile "$LINENO"; then : - ac_cv_prog_cxx_g=yes -else - CXXFLAGS="" - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -int -main () -{ - - ; - return 0; -} -_ACEOF -if ac_fn_cxx_try_compile "$LINENO"; then : - -else - ac_cxx_werror_flag=$ac_save_cxx_werror_flag - CXXFLAGS="-g" - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -int -main () -{ - - ; - return 0; -} -_ACEOF -if ac_fn_cxx_try_compile "$LINENO"; then : - ac_cv_prog_cxx_g=yes -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext - ac_cxx_werror_flag=$ac_save_cxx_werror_flag -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cxx_g" >&5 -$as_echo "$ac_cv_prog_cxx_g" >&6; } -if test "$ac_test_CXXFLAGS" = set; then - CXXFLAGS=$ac_save_CXXFLAGS -elif test $ac_cv_prog_cxx_g = yes; then - if test "$GXX" = yes; then - CXXFLAGS="-g -O2" - else - CXXFLAGS="-g" - fi -else - if test "$GXX" = yes; then - CXXFLAGS="-O2" - else - CXXFLAGS= - fi -fi -ac_ext=c -ac_cpp='$CPP $CPPFLAGS' -ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_c_compiler_gnu - -depcc="$CXX" am_compiler_list= - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5 -$as_echo_n "checking dependency style of $depcc... " >&6; } -if ${am_cv_CXX_dependencies_compiler_type+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then - # We make a subdir and do the tests there. Otherwise we can end up - # making bogus files that we don't know about and never remove. For - # instance it was reported that on HP-UX the gcc test will end up - # making a dummy file named `D' -- because `-MD' means `put the output - # in D'. - rm -rf conftest.dir - mkdir conftest.dir - # Copy depcomp to subdir because otherwise we won't find it if we're - # using a relative directory. - cp "$am_depcomp" conftest.dir - cd conftest.dir - # We will build objects and dependencies in a subdirectory because - # it helps to detect inapplicable dependency modes. For instance - # both Tru64's cc and ICC support -MD to output dependencies as a - # side effect of compilation, but ICC will put the dependencies in - # the current directory while Tru64 will put them in the object - # directory. - mkdir sub - - am_cv_CXX_dependencies_compiler_type=none - if test "$am_compiler_list" = ""; then - am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp` - fi - am__universal=false - case " $depcc " in #( - *\ -arch\ *\ -arch\ *) am__universal=true ;; - esac - - for depmode in $am_compiler_list; do - # Setup a source with many dependencies, because some compilers - # like to wrap large dependency lists on column 80 (with \), and - # we should not choose a depcomp mode which is confused by this. - # - # We need to recreate these files for each test, as the compiler may - # overwrite some of them when testing with obscure command lines. - # This happens at least with the AIX C compiler. - : > sub/conftest.c - for i in 1 2 3 4 5 6; do - echo '#include "conftst'$i'.h"' >> sub/conftest.c - # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with - # Solaris 8's {/usr,}/bin/sh. - touch sub/conftst$i.h - done - echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf - - # We check with `-c' and `-o' for the sake of the "dashmstdout" - # mode. It turns out that the SunPro C++ compiler does not properly - # handle `-M -o', and we need to detect this. Also, some Intel - # versions had trouble with output in subdirs - am__obj=sub/conftest.${OBJEXT-o} - am__minus_obj="-o $am__obj" - case $depmode in - gcc) - # This depmode causes a compiler race in universal mode. - test "$am__universal" = false || continue - ;; - nosideeffect) - # after this tag, mechanisms are not by side-effect, so they'll - # only be used when explicitly requested - if test "x$enable_dependency_tracking" = xyes; then - continue - else - break - fi - ;; - msvc7 | msvc7msys | msvisualcpp | msvcmsys) - # This compiler won't grok `-c -o', but also, the minuso test has - # not run yet. These depmodes are late enough in the game, and - # so weak that their functioning should not be impacted. - am__obj=conftest.${OBJEXT-o} - am__minus_obj= - ;; - none) break ;; - esac - if depmode=$depmode \ - source=sub/conftest.c object=$am__obj \ - depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ - $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ - >/dev/null 2>conftest.err && - grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && - grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && - grep $am__obj sub/conftest.Po > /dev/null 2>&1 && - ${MAKE-make} -s -f confmf > /dev/null 2>&1; then - # icc doesn't choke on unknown options, it will just issue warnings - # or remarks (even with -Werror). So we grep stderr for any message - # that says an option was ignored or not supported. - # When given -MP, icc 7.0 and 7.1 complain thusly: - # icc: Command line warning: ignoring option '-M'; no argument required - # The diagnosis changed in icc 8.0: - # icc: Command line remark: option '-MP' not supported - if (grep 'ignoring option' conftest.err || - grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else - am_cv_CXX_dependencies_compiler_type=$depmode - break - fi - fi - done - - cd .. - rm -rf conftest.dir -else - am_cv_CXX_dependencies_compiler_type=none -fi - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_CXX_dependencies_compiler_type" >&5 -$as_echo "$am_cv_CXX_dependencies_compiler_type" >&6; } -CXXDEPMODE=depmode=$am_cv_CXX_dependencies_compiler_type - - if - test "x$enable_dependency_tracking" != xno \ - && test "$am_cv_CXX_dependencies_compiler_type" = gcc3; then - am__fastdepCXX_TRUE= - am__fastdepCXX_FALSE='#' -else - am__fastdepCXX_TRUE='#' - am__fastdepCXX_FALSE= -fi - - - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ln -s works" >&5 -$as_echo_n "checking whether ln -s works... " >&6; } -LN_S=$as_ln_s -if test "$LN_S" = "ln -s"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no, using $LN_S" >&5 -$as_echo "no, using $LN_S" >&6; } -fi - - -# AC_DISABLE_SHARED -AC_PROG_LIBTOOL - -#enable -D_GNU_SOURCE since the return code value of getaddrinfo -#ifdefed with __USE_GNU -#features.h header undef's __USE_GNU and defines it only if _GNU_SOURCE is defined -#hence this define for gcc -@%:@ Check whether --enable-debug was given. -if test "${enable_debug+set}" = set; then : - enableval=$enable_debug; -else - enable_debug=no -fi - - -if test "x$enable_debug" = xyes; then - if test "x$init_cflags" = x; then - CFLAGS="" - fi - CFLAGS="$CFLAGS -g -O0 -D_GNU_SOURCE" -else - if test "x$init_cflags" = x; then - CFLAGS="-g -O2 -D_GNU_SOURCE" - fi -fi - -if test "x$enable_debug" = xyes; then - if test "x$init_cxxflags" = x; then - CXXFLAGS="" - fi - CXXFLAGS="$CXXFLAGS -g -O0" -else - if test "x$init_cxxflags" = x; then - CXXFLAGS="-g -O2" - fi -fi - - -@%:@ Check whether --with-syncapi was given. -if test "${with_syncapi+set}" = set; then : - withval=$with_syncapi; -else - with_syncapi=yes -fi - - -# Checks for libraries. - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for pthread_mutex_lock in -lpthread" >&5 -$as_echo_n "checking for pthread_mutex_lock in -lpthread... " >&6; } -if ${ac_cv_lib_pthread_pthread_mutex_lock+:} false; then : - $as_echo_n "(cached) " >&6 -else - ac_check_lib_save_LIBS=$LIBS -LIBS="-lpthread $LIBS" -cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -/* Override any GCC internal prototype to avoid an error. - Use char because int might match the return type of a GCC - builtin and then its argument prototype would still apply. */ -#ifdef __cplusplus -extern "C" -#endif -char pthread_mutex_lock (); -int -main () -{ -return pthread_mutex_lock (); - ; - return 0; -} -_ACEOF -if ac_fn_c_try_link "$LINENO"; then : - ac_cv_lib_pthread_pthread_mutex_lock=yes -else - ac_cv_lib_pthread_pthread_mutex_lock=no -fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext -LIBS=$ac_check_lib_save_LIBS -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_pthread_pthread_mutex_lock" >&5 -$as_echo "$ac_cv_lib_pthread_pthread_mutex_lock" >&6; } -if test "x$ac_cv_lib_pthread_pthread_mutex_lock" = xyes; then : - have_pthread=yes -else - have_pthread=no -fi - - -if test "x$with_syncapi" != xno && test "x$have_pthread" = xno; then - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cannot build SyncAPI -- pthread not found" >&5 -$as_echo "$as_me: WARNING: cannot build SyncAPI -- pthread not found" >&2;} - with_syncapi=no -fi -if test "x$with_syncapi" != xno; then - { $as_echo "$as_me:${as_lineno-$LINENO}: building with SyncAPI support" >&5 -$as_echo "$as_me: building with SyncAPI support" >&6;} -else - { $as_echo "$as_me:${as_lineno-$LINENO}: building without SyncAPI support" >&5 -$as_echo "$as_me: building without SyncAPI support" >&6;} -fi - - if test "x$with_syncapi" != xno; then - WANT_SYNCAPI_TRUE= - WANT_SYNCAPI_FALSE='#' -else - WANT_SYNCAPI_TRUE='#' - WANT_SYNCAPI_FALSE= -fi - - -# Checks for header files. -ac_ext=c -ac_cpp='$CPP $CPPFLAGS' -ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_c_compiler_gnu -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C preprocessor" >&5 -$as_echo_n "checking how to run the C preprocessor... " >&6; } -# On Suns, sometimes $CPP names a directory. -if test -n "$CPP" && test -d "$CPP"; then - CPP= -fi -if test -z "$CPP"; then - if ${ac_cv_prog_CPP+:} false; then : - $as_echo_n "(cached) " >&6 -else - # Double quotes because CPP needs to be expanded - for CPP in "$CC -E" "$CC -E -traditional-cpp" "/lib/cpp" - do - ac_preproc_ok=false -for ac_c_preproc_warn_flag in '' yes -do - # Use a header file that comes with gcc, so configuring glibc - # with a fresh cross-compiler works. - # Prefer to if __STDC__ is defined, since - # exists even on freestanding compilers. - # On the NeXT, cc -E runs the code through the compiler's parser, - # not just through cpp. "Syntax error" is here to catch this case. - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -@%:@ifdef __STDC__ -@%:@ include -@%:@else -@%:@ include -@%:@endif - Syntax error -_ACEOF -if ac_fn_c_try_cpp "$LINENO"; then : - -else - # Broken: fails on valid input. -continue -fi -rm -f conftest.err conftest.i conftest.$ac_ext - - # OK, works on sane cases. Now check whether nonexistent headers - # can be detected and how. - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -@%:@include -_ACEOF -if ac_fn_c_try_cpp "$LINENO"; then : - # Broken: success on invalid input. -continue -else - # Passes both tests. -ac_preproc_ok=: -break -fi -rm -f conftest.err conftest.i conftest.$ac_ext - -done -# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. -rm -f conftest.i conftest.err conftest.$ac_ext -if $ac_preproc_ok; then : - break -fi - - done - ac_cv_prog_CPP=$CPP - -fi - CPP=$ac_cv_prog_CPP -else - ac_cv_prog_CPP=$CPP -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $CPP" >&5 -$as_echo "$CPP" >&6; } -ac_preproc_ok=false -for ac_c_preproc_warn_flag in '' yes -do - # Use a header file that comes with gcc, so configuring glibc - # with a fresh cross-compiler works. - # Prefer to if __STDC__ is defined, since - # exists even on freestanding compilers. - # On the NeXT, cc -E runs the code through the compiler's parser, - # not just through cpp. "Syntax error" is here to catch this case. - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -@%:@ifdef __STDC__ -@%:@ include -@%:@else -@%:@ include -@%:@endif - Syntax error -_ACEOF -if ac_fn_c_try_cpp "$LINENO"; then : - -else - # Broken: fails on valid input. -continue -fi -rm -f conftest.err conftest.i conftest.$ac_ext - - # OK, works on sane cases. Now check whether nonexistent headers - # can be detected and how. - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -@%:@include -_ACEOF -if ac_fn_c_try_cpp "$LINENO"; then : - # Broken: success on invalid input. -continue -else - # Passes both tests. -ac_preproc_ok=: -break -fi -rm -f conftest.err conftest.i conftest.$ac_ext - -done -# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. -rm -f conftest.i conftest.err conftest.$ac_ext -if $ac_preproc_ok; then : - -else - { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 -$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} -as_fn_error $? "C preprocessor \"$CPP\" fails sanity check -See \`config.log' for more details" "$LINENO" 5; } -fi - -ac_ext=c -ac_cpp='$CPP $CPPFLAGS' -ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_c_compiler_gnu - - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for grep that handles long lines and -e" >&5 -$as_echo_n "checking for grep that handles long lines and -e... " >&6; } -if ${ac_cv_path_GREP+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -z "$GREP"; then - ac_path_GREP_found=false - # Loop through the user's path and test for each of PROGNAME-LIST - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_prog in grep ggrep; do - for ac_exec_ext in '' $ac_executable_extensions; do - ac_path_GREP="$as_dir/$ac_prog$ac_exec_ext" - as_fn_executable_p "$ac_path_GREP" || continue -# Check for GNU ac_path_GREP and select it if it is found. - # Check for GNU $ac_path_GREP -case `"$ac_path_GREP" --version 2>&1` in -*GNU*) - ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_found=:;; -*) - ac_count=0 - $as_echo_n 0123456789 >"conftest.in" - while : - do - cat "conftest.in" "conftest.in" >"conftest.tmp" - mv "conftest.tmp" "conftest.in" - cp "conftest.in" "conftest.nl" - $as_echo 'GREP' >> "conftest.nl" - "$ac_path_GREP" -e 'GREP$' -e '-(cannot match)-' < "conftest.nl" >"conftest.out" 2>/dev/null || break - diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break - as_fn_arith $ac_count + 1 && ac_count=$as_val - if test $ac_count -gt ${ac_path_GREP_max-0}; then - # Best one so far, save it but keep looking for a better one - ac_cv_path_GREP="$ac_path_GREP" - ac_path_GREP_max=$ac_count - fi - # 10*(2^10) chars as input seems more than enough - test $ac_count -gt 10 && break - done - rm -f conftest.in conftest.tmp conftest.nl conftest.out;; -esac - - $ac_path_GREP_found && break 3 - done - done - done -IFS=$as_save_IFS - if test -z "$ac_cv_path_GREP"; then - as_fn_error $? "no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 - fi -else - ac_cv_path_GREP=$GREP -fi - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_GREP" >&5 -$as_echo "$ac_cv_path_GREP" >&6; } - GREP="$ac_cv_path_GREP" - - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for egrep" >&5 -$as_echo_n "checking for egrep... " >&6; } -if ${ac_cv_path_EGREP+:} false; then : - $as_echo_n "(cached) " >&6 -else - if echo a | $GREP -E '(a|b)' >/dev/null 2>&1 - then ac_cv_path_EGREP="$GREP -E" - else - if test -z "$EGREP"; then - ac_path_EGREP_found=false - # Loop through the user's path and test for each of PROGNAME-LIST - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_prog in egrep; do - for ac_exec_ext in '' $ac_executable_extensions; do - ac_path_EGREP="$as_dir/$ac_prog$ac_exec_ext" - as_fn_executable_p "$ac_path_EGREP" || continue -# Check for GNU ac_path_EGREP and select it if it is found. - # Check for GNU $ac_path_EGREP -case `"$ac_path_EGREP" --version 2>&1` in -*GNU*) - ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_found=:;; -*) - ac_count=0 - $as_echo_n 0123456789 >"conftest.in" - while : - do - cat "conftest.in" "conftest.in" >"conftest.tmp" - mv "conftest.tmp" "conftest.in" - cp "conftest.in" "conftest.nl" - $as_echo 'EGREP' >> "conftest.nl" - "$ac_path_EGREP" 'EGREP$' < "conftest.nl" >"conftest.out" 2>/dev/null || break - diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break - as_fn_arith $ac_count + 1 && ac_count=$as_val - if test $ac_count -gt ${ac_path_EGREP_max-0}; then - # Best one so far, save it but keep looking for a better one - ac_cv_path_EGREP="$ac_path_EGREP" - ac_path_EGREP_max=$ac_count - fi - # 10*(2^10) chars as input seems more than enough - test $ac_count -gt 10 && break - done - rm -f conftest.in conftest.tmp conftest.nl conftest.out;; -esac - - $ac_path_EGREP_found && break 3 - done - done - done -IFS=$as_save_IFS - if test -z "$ac_cv_path_EGREP"; then - as_fn_error $? "no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 - fi -else - ac_cv_path_EGREP=$EGREP -fi - - fi -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_EGREP" >&5 -$as_echo "$ac_cv_path_EGREP" >&6; } - EGREP="$ac_cv_path_EGREP" - - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header files" >&5 -$as_echo_n "checking for ANSI C header files... " >&6; } -if ${ac_cv_header_stdc+:} false; then : - $as_echo_n "(cached) " >&6 -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include -#include -#include -#include - -int -main () -{ - - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - ac_cv_header_stdc=yes -else - ac_cv_header_stdc=no -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext - -if test $ac_cv_header_stdc = yes; then - # SunOS 4.x string.h does not declare mem*, contrary to ANSI. - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include - -_ACEOF -if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | - $EGREP "memchr" >/dev/null 2>&1; then : - -else - ac_cv_header_stdc=no -fi -rm -f conftest* - -fi - -if test $ac_cv_header_stdc = yes; then - # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include - -_ACEOF -if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | - $EGREP "free" >/dev/null 2>&1; then : - -else - ac_cv_header_stdc=no -fi -rm -f conftest* - -fi - -if test $ac_cv_header_stdc = yes; then - # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi. - if test "$cross_compiling" = yes; then : - : -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include -#include -#if ((' ' & 0x0FF) == 0x020) -# define ISLOWER(c) ('a' <= (c) && (c) <= 'z') -# define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c)) -#else -# define ISLOWER(c) \ - (('a' <= (c) && (c) <= 'i') \ - || ('j' <= (c) && (c) <= 'r') \ - || ('s' <= (c) && (c) <= 'z')) -# define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c)) -#endif - -#define XOR(e, f) (((e) && !(f)) || (!(e) && (f))) -int -main () -{ - int i; - for (i = 0; i < 256; i++) - if (XOR (islower (i), ISLOWER (i)) - || toupper (i) != TOUPPER (i)) - return 2; - return 0; -} -_ACEOF -if ac_fn_c_try_run "$LINENO"; then : - -else - ac_cv_header_stdc=no -fi -rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ - conftest.$ac_objext conftest.beam conftest.$ac_ext -fi - -fi -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdc" >&5 -$as_echo "$ac_cv_header_stdc" >&6; } -if test $ac_cv_header_stdc = yes; then - -$as_echo "@%:@define STDC_HEADERS 1" >>confdefs.h - -fi - -# On IRIX 5.3, sys/types and inttypes.h are conflicting. -for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \ - inttypes.h stdint.h unistd.h -do : - as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` -ac_fn_c_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default -" -if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : - cat >>confdefs.h <<_ACEOF -@%:@define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 -_ACEOF - -fi - -done - - -for ac_header in arpa/inet.h fcntl.h netdb.h netinet/in.h stdlib.h string.h sys/socket.h sys/time.h unistd.h sys/utsname.h -do : - as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` -ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default" -if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : - cat >>confdefs.h <<_ACEOF -@%:@define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 -_ACEOF - -fi - -done - - -# Checks for typedefs, structures, and compiler characteristics. -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for an ANSI C-conforming const" >&5 -$as_echo_n "checking for an ANSI C-conforming const... " >&6; } -if ${ac_cv_c_const+:} false; then : - $as_echo_n "(cached) " >&6 -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -int -main () -{ - -#ifndef __cplusplus - /* Ultrix mips cc rejects this sort of thing. */ - typedef int charset[2]; - const charset cs = { 0, 0 }; - /* SunOS 4.1.1 cc rejects this. */ - char const *const *pcpcc; - char **ppc; - /* NEC SVR4.0.2 mips cc rejects this. */ - struct point {int x, y;}; - static struct point const zero = {0,0}; - /* AIX XL C 1.02.0.0 rejects this. - It does not let you subtract one const X* pointer from another in - an arm of an if-expression whose if-part is not a constant - expression */ - const char *g = "string"; - pcpcc = &g + (g ? g-g : 0); - /* HPUX 7.0 cc rejects these. */ - ++pcpcc; - ppc = (char**) pcpcc; - pcpcc = (char const *const *) ppc; - { /* SCO 3.2v4 cc rejects this sort of thing. */ - char tx; - char *t = &tx; - char const *s = 0 ? (char *) 0 : (char const *) 0; - - *t++ = 0; - if (s) return 0; - } - { /* Someone thinks the Sun supposedly-ANSI compiler will reject this. */ - int x[] = {25, 17}; - const int *foo = &x[0]; - ++foo; - } - { /* Sun SC1.0 ANSI compiler rejects this -- but not the above. */ - typedef const int *iptr; - iptr p = 0; - ++p; - } - { /* AIX XL C 1.02.0.0 rejects this sort of thing, saying - "k.c", line 2.27: 1506-025 (S) Operand must be a modifiable lvalue. */ - struct s { int j; const int *ap[3]; } bx; - struct s *b = &bx; b->j = 5; - } - { /* ULTRIX-32 V3.1 (Rev 9) vcc rejects this */ - const int foo = 10; - if (!foo) return 0; - } - return !cs[0] && !zero.x; -#endif - - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - ac_cv_c_const=yes -else - ac_cv_c_const=no -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_const" >&5 -$as_echo "$ac_cv_c_const" >&6; } -if test $ac_cv_c_const = no; then - -$as_echo "@%:@define const /**/" >>confdefs.h - -fi - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for inline" >&5 -$as_echo_n "checking for inline... " >&6; } -if ${ac_cv_c_inline+:} false; then : - $as_echo_n "(cached) " >&6 -else - ac_cv_c_inline=no -for ac_kw in inline __inline__ __inline; do - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#ifndef __cplusplus -typedef int foo_t; -static $ac_kw foo_t static_foo () {return 0; } -$ac_kw foo_t foo () {return 0; } -#endif - -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - ac_cv_c_inline=$ac_kw -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext - test "$ac_cv_c_inline" != no && break -done - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_inline" >&5 -$as_echo "$ac_cv_c_inline" >&6; } - -case $ac_cv_c_inline in - inline | yes) ;; - *) - case $ac_cv_c_inline in - no) ac_val=;; - *) ac_val=$ac_cv_c_inline;; - esac - cat >>confdefs.h <<_ACEOF -#ifndef __cplusplus -#define inline $ac_val -#endif -_ACEOF - ;; -esac - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether time.h and sys/time.h may both be included" >&5 -$as_echo_n "checking whether time.h and sys/time.h may both be included... " >&6; } -if ${ac_cv_header_time+:} false; then : - $as_echo_n "(cached) " >&6 -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include -#include -#include - -int -main () -{ -if ((struct tm *) 0) -return 0; - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - ac_cv_header_time=yes -else - ac_cv_header_time=no -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_time" >&5 -$as_echo "$ac_cv_header_time" >&6; } -if test $ac_cv_header_time = yes; then - -$as_echo "@%:@define TIME_WITH_SYS_TIME 1" >>confdefs.h - -fi - -ac_fn_c_check_type "$LINENO" "nfds_t" "ac_cv_type_nfds_t" "#include -" -if test "x$ac_cv_type_nfds_t" = xyes; then : - -$as_echo "@%:@define POLL_NFDS_TYPE nfds_t" >>confdefs.h - -else - -$as_echo "@%:@define POLL_NFDS_TYPE unsigned int" >>confdefs.h - -fi - - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to enable ipv6" >&5 -$as_echo_n "checking whether to enable ipv6... " >&6; } - -if test "$cross_compiling" = yes; then : - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } - ipv6=no -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - /* is AF_INET6 available? */ -#include -#include -main() -{ - if (socket(AF_INET6, SOCK_STREAM, 0) < 0) - exit(1); - else - exit(0); -} - -_ACEOF -if ac_fn_c_try_run "$LINENO"; then : - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; } - ipv6=yes -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } - ipv6=no -fi -rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ - conftest.$ac_objext conftest.beam conftest.$ac_ext -fi - - -if test x"$ipv6" = xyes; then - USEIPV6="-DZOO_IPV6_ENABLED" - -fi - -# Checks for library functions. -for ac_func in getcwd gethostbyname gethostname getlogin getpwuid_r gettimeofday getuid memmove memset poll socket strchr strdup strerror strtol -do : - as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` -ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var" -if eval test \"x\$"$as_ac_var"\" = x"yes"; then : - cat >>confdefs.h <<_ACEOF -@%:@define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 -_ACEOF - -fi -done - - -ac_config_files="$ac_config_files Makefile" - -cat >confcache <<\_ACEOF -# This file is a shell script that caches the results of configure -# tests run on this system so they can be shared between configure -# scripts and configure runs, see configure's option --config-cache. -# It is not useful on other systems. If it contains results you don't -# want to keep, you may remove or edit it. -# -# config.status only pays attention to the cache file if you give it -# the --recheck option to rerun configure. -# -# `ac_cv_env_foo' variables (set or unset) will be overridden when -# loading this file, other *unset* `ac_cv_foo' will be assigned the -# following values. - -_ACEOF - -# The following way of writing the cache mishandles newlines in values, -# but we know of no workaround that is simple, portable, and efficient. -# So, we kill variables containing newlines. -# Ultrix sh set writes to stderr and can't be redirected directly, -# and sets the high bit in the cache file unless we assign to the vars. -( - for ac_var in `(set) 2>&1 | sed -n 's/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'`; do - eval ac_val=\$$ac_var - case $ac_val in #( - *${as_nl}*) - case $ac_var in #( - *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 -$as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; - esac - case $ac_var in #( - _ | IFS | as_nl) ;; #( - BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( - *) { eval $ac_var=; unset $ac_var;} ;; - esac ;; - esac - done - - (set) 2>&1 | - case $as_nl`(ac_space=' '; set) 2>&1` in #( - *${as_nl}ac_space=\ *) - # `set' does not quote correctly, so add quotes: double-quote - # substitution turns \\\\ into \\, and sed turns \\ into \. - sed -n \ - "s/'/'\\\\''/g; - s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p" - ;; #( - *) - # `set' quotes correctly as required by POSIX, so do not add quotes. - sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" - ;; - esac | - sort -) | - sed ' - /^ac_cv_env_/b end - t clear - :clear - s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/ - t end - s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/ - :end' >>confcache -if diff "$cache_file" confcache >/dev/null 2>&1; then :; else - if test -w "$cache_file"; then - if test "x$cache_file" != "x/dev/null"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5 -$as_echo "$as_me: updating cache $cache_file" >&6;} - if test ! -f "$cache_file" || test -h "$cache_file"; then - cat confcache >"$cache_file" - else - case $cache_file in #( - */* | ?:*) - mv -f confcache "$cache_file"$$ && - mv -f "$cache_file"$$ "$cache_file" ;; #( - *) - mv -f confcache "$cache_file" ;; - esac - fi - fi - else - { $as_echo "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5 -$as_echo "$as_me: not updating unwritable cache $cache_file" >&6;} - fi -fi -rm -f confcache - -test "x$prefix" = xNONE && prefix=$ac_default_prefix -# Let make expand exec_prefix. -test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' - -DEFS=-DHAVE_CONFIG_H - -ac_libobjs= -ac_ltlibobjs= -U= -for ac_i in : $LIB@&t@OBJS; do test "x$ac_i" = x: && continue - # 1. Remove the extension, and $U if already installed. - ac_script='s/\$U\././;s/\.o$//;s/\.obj$//' - ac_i=`$as_echo "$ac_i" | sed "$ac_script"` - # 2. Prepend LIBOBJDIR. When used with automake>=1.10 LIBOBJDIR - # will be set to the directory where LIBOBJS objects are built. - as_fn_append ac_libobjs " \${LIBOBJDIR}$ac_i\$U.$ac_objext" - as_fn_append ac_ltlibobjs " \${LIBOBJDIR}$ac_i"'$U.lo' -done -LIB@&t@OBJS=$ac_libobjs - -LTLIBOBJS=$ac_ltlibobjs - - -if test -z "${DX_COND_doc_TRUE}" && test -z "${DX_COND_doc_FALSE}"; then - as_fn_error $? "conditional \"DX_COND_doc\" was never defined. -Usually this means the macro was only invoked conditionally." "$LINENO" 5 -fi -if test -z "${DX_COND_doc_TRUE}" && test -z "${DX_COND_doc_FALSE}"; then - as_fn_error $? "conditional \"DX_COND_doc\" was never defined. -Usually this means the macro was only invoked conditionally." "$LINENO" 5 -fi -if test -z "${DX_COND_dot_TRUE}" && test -z "${DX_COND_dot_FALSE}"; then - as_fn_error $? "conditional \"DX_COND_dot\" was never defined. -Usually this means the macro was only invoked conditionally." "$LINENO" 5 -fi -if test -z "${DX_COND_dot_TRUE}" && test -z "${DX_COND_dot_FALSE}"; then - as_fn_error $? "conditional \"DX_COND_dot\" was never defined. -Usually this means the macro was only invoked conditionally." "$LINENO" 5 -fi -if test -z "${DX_COND_man_TRUE}" && test -z "${DX_COND_man_FALSE}"; then - as_fn_error $? "conditional \"DX_COND_man\" was never defined. -Usually this means the macro was only invoked conditionally." "$LINENO" 5 -fi -if test -z "${DX_COND_man_TRUE}" && test -z "${DX_COND_man_FALSE}"; then - as_fn_error $? "conditional \"DX_COND_man\" was never defined. -Usually this means the macro was only invoked conditionally." "$LINENO" 5 -fi -if test -z "${DX_COND_rtf_TRUE}" && test -z "${DX_COND_rtf_FALSE}"; then - as_fn_error $? "conditional \"DX_COND_rtf\" was never defined. -Usually this means the macro was only invoked conditionally." "$LINENO" 5 -fi -if test -z "${DX_COND_rtf_TRUE}" && test -z "${DX_COND_rtf_FALSE}"; then - as_fn_error $? "conditional \"DX_COND_rtf\" was never defined. -Usually this means the macro was only invoked conditionally." "$LINENO" 5 -fi -if test -z "${DX_COND_xml_TRUE}" && test -z "${DX_COND_xml_FALSE}"; then - as_fn_error $? "conditional \"DX_COND_xml\" was never defined. -Usually this means the macro was only invoked conditionally." "$LINENO" 5 -fi -if test -z "${DX_COND_xml_TRUE}" && test -z "${DX_COND_xml_FALSE}"; then - as_fn_error $? "conditional \"DX_COND_xml\" was never defined. -Usually this means the macro was only invoked conditionally." "$LINENO" 5 -fi -if test -z "${DX_COND_chm_TRUE}" && test -z "${DX_COND_chm_FALSE}"; then - as_fn_error $? "conditional \"DX_COND_chm\" was never defined. -Usually this means the macro was only invoked conditionally." "$LINENO" 5 -fi -if test -z "${DX_COND_chm_TRUE}" && test -z "${DX_COND_chm_FALSE}"; then - as_fn_error $? "conditional \"DX_COND_chm\" was never defined. -Usually this means the macro was only invoked conditionally." "$LINENO" 5 -fi -if test -z "${DX_COND_chi_TRUE}" && test -z "${DX_COND_chi_FALSE}"; then - as_fn_error $? "conditional \"DX_COND_chi\" was never defined. -Usually this means the macro was only invoked conditionally." "$LINENO" 5 -fi -if test -z "${DX_COND_chi_TRUE}" && test -z "${DX_COND_chi_FALSE}"; then - as_fn_error $? "conditional \"DX_COND_chi\" was never defined. -Usually this means the macro was only invoked conditionally." "$LINENO" 5 -fi -if test -z "${DX_COND_html_TRUE}" && test -z "${DX_COND_html_FALSE}"; then - as_fn_error $? "conditional \"DX_COND_html\" was never defined. -Usually this means the macro was only invoked conditionally." "$LINENO" 5 -fi -if test -z "${DX_COND_html_TRUE}" && test -z "${DX_COND_html_FALSE}"; then - as_fn_error $? "conditional \"DX_COND_html\" was never defined. -Usually this means the macro was only invoked conditionally." "$LINENO" 5 -fi -if test -z "${DX_COND_ps_TRUE}" && test -z "${DX_COND_ps_FALSE}"; then - as_fn_error $? "conditional \"DX_COND_ps\" was never defined. -Usually this means the macro was only invoked conditionally." "$LINENO" 5 -fi -if test -z "${DX_COND_ps_TRUE}" && test -z "${DX_COND_ps_FALSE}"; then - as_fn_error $? "conditional \"DX_COND_ps\" was never defined. -Usually this means the macro was only invoked conditionally." "$LINENO" 5 -fi -if test -z "${DX_COND_pdf_TRUE}" && test -z "${DX_COND_pdf_FALSE}"; then - as_fn_error $? "conditional \"DX_COND_pdf\" was never defined. -Usually this means the macro was only invoked conditionally." "$LINENO" 5 -fi -if test -z "${DX_COND_pdf_TRUE}" && test -z "${DX_COND_pdf_FALSE}"; then - as_fn_error $? "conditional \"DX_COND_pdf\" was never defined. -Usually this means the macro was only invoked conditionally." "$LINENO" 5 -fi -if test -z "${DX_COND_latex_TRUE}" && test -z "${DX_COND_latex_FALSE}"; then - as_fn_error $? "conditional \"DX_COND_latex\" was never defined. -Usually this means the macro was only invoked conditionally." "$LINENO" 5 -fi -if test -z "${DX_COND_latex_TRUE}" && test -z "${DX_COND_latex_FALSE}"; then - as_fn_error $? "conditional \"DX_COND_latex\" was never defined. -Usually this means the macro was only invoked conditionally." "$LINENO" 5 -fi - if test -n "$EXEEXT"; then - am__EXEEXT_TRUE= - am__EXEEXT_FALSE='#' -else - am__EXEEXT_TRUE='#' - am__EXEEXT_FALSE= -fi - -if test -z "${AMDEP_TRUE}" && test -z "${AMDEP_FALSE}"; then - as_fn_error $? "conditional \"AMDEP\" was never defined. -Usually this means the macro was only invoked conditionally." "$LINENO" 5 -fi -if test -z "${am__fastdepCC_TRUE}" && test -z "${am__fastdepCC_FALSE}"; then - as_fn_error $? "conditional \"am__fastdepCC\" was never defined. -Usually this means the macro was only invoked conditionally." "$LINENO" 5 -fi -if test -z "${am__fastdepCXX_TRUE}" && test -z "${am__fastdepCXX_FALSE}"; then - as_fn_error $? "conditional \"am__fastdepCXX\" was never defined. -Usually this means the macro was only invoked conditionally." "$LINENO" 5 -fi -if test -z "${WANT_SYNCAPI_TRUE}" && test -z "${WANT_SYNCAPI_FALSE}"; then - as_fn_error $? "conditional \"WANT_SYNCAPI\" was never defined. -Usually this means the macro was only invoked conditionally." "$LINENO" 5 -fi - -: "${CONFIG_STATUS=./config.status}" -ac_write_fail=0 -ac_clean_files_save=$ac_clean_files -ac_clean_files="$ac_clean_files $CONFIG_STATUS" -{ $as_echo "$as_me:${as_lineno-$LINENO}: creating $CONFIG_STATUS" >&5 -$as_echo "$as_me: creating $CONFIG_STATUS" >&6;} -as_write_fail=0 -cat >$CONFIG_STATUS <<_ASEOF || as_write_fail=1 -#! $SHELL -# Generated by $as_me. -# Run this file to recreate the current configuration. -# Compiler output produced by configure, useful for debugging -# configure, is in config.log if it exists. - -debug=false -ac_cs_recheck=false -ac_cs_silent=false - -SHELL=\${CONFIG_SHELL-$SHELL} -export SHELL -_ASEOF -cat >>$CONFIG_STATUS <<\_ASEOF || as_write_fail=1 -## -------------------- ## -## M4sh Initialization. ## -## -------------------- ## - -# Be more Bourne compatible -DUALCASE=1; export DUALCASE # for MKS sh -if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : - emulate sh - NULLCMD=: - # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which - # is contrary to our usage. Disable this feature. - alias -g '${1+"$@"}'='"$@"' - setopt NO_GLOB_SUBST -else - case `(set -o) 2>/dev/null` in @%:@( - *posix*) : - set -o posix ;; @%:@( - *) : - ;; -esac -fi - - -as_nl=' -' -export as_nl -# Printing a long string crashes Solaris 7 /usr/bin/printf. -as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' -as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo -as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo -# Prefer a ksh shell builtin over an external printf program on Solaris, -# but without wasting forks for bash or zsh. -if test -z "$BASH_VERSION$ZSH_VERSION" \ - && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then - as_echo='print -r --' - as_echo_n='print -rn --' -elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then - as_echo='printf %s\n' - as_echo_n='printf %s' -else - if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then - as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' - as_echo_n='/usr/ucb/echo -n' - else - as_echo_body='eval expr "X$1" : "X\\(.*\\)"' - as_echo_n_body='eval - arg=$1; - case $arg in @%:@( - *"$as_nl"*) - expr "X$arg" : "X\\(.*\\)$as_nl"; - arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; - esac; - expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" - ' - export as_echo_n_body - as_echo_n='sh -c $as_echo_n_body as_echo' - fi - export as_echo_body - as_echo='sh -c $as_echo_body as_echo' -fi - -# The user is always right. -if test "${PATH_SEPARATOR+set}" != set; then - PATH_SEPARATOR=: - (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { - (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || - PATH_SEPARATOR=';' - } -fi - - -# IFS -# We need space, tab and new line, in precisely that order. Quoting is -# there to prevent editors from complaining about space-tab. -# (If _AS_PATH_WALK were called with IFS unset, it would disable word -# splitting by setting IFS to empty value.) -IFS=" "" $as_nl" - -# Find who we are. Look in the path if we contain no directory separator. -as_myself= -case $0 in @%:@(( - *[\\/]* ) as_myself=$0 ;; - *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break - done -IFS=$as_save_IFS - - ;; -esac -# We did not find ourselves, most probably we were run as `sh COMMAND' -# in which case we are not to be found in the path. -if test "x$as_myself" = x; then - as_myself=$0 -fi -if test ! -f "$as_myself"; then - $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 - exit 1 -fi - -# Unset variables that we do not need and which cause bugs (e.g. in -# pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" -# suppresses any "Segmentation fault" message there. '((' could -# trigger a bug in pdksh 5.2.14. -for as_var in BASH_ENV ENV MAIL MAILPATH -do eval test x\${$as_var+set} = xset \ - && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : -done -PS1='$ ' -PS2='> ' -PS4='+ ' - -# NLS nuisances. -LC_ALL=C -export LC_ALL -LANGUAGE=C -export LANGUAGE - -# CDPATH. -(unset CDPATH) >/dev/null 2>&1 && unset CDPATH - - -@%:@ as_fn_error STATUS ERROR [LINENO LOG_FD] -@%:@ ---------------------------------------- -@%:@ Output "`basename @S|@0`: error: ERROR" to stderr. If LINENO and LOG_FD are -@%:@ provided, also output the error to LOG_FD, referencing LINENO. Then exit the -@%:@ script with STATUS, using 1 if that was 0. -as_fn_error () -{ - as_status=$1; test $as_status -eq 0 && as_status=1 - if test "$4"; then - as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack - $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 - fi - $as_echo "$as_me: error: $2" >&2 - as_fn_exit $as_status -} @%:@ as_fn_error - - -@%:@ as_fn_set_status STATUS -@%:@ ----------------------- -@%:@ Set @S|@? to STATUS, without forking. -as_fn_set_status () -{ - return $1 -} @%:@ as_fn_set_status - -@%:@ as_fn_exit STATUS -@%:@ ----------------- -@%:@ Exit the shell with STATUS, even in a "trap 0" or "set -e" context. -as_fn_exit () -{ - set +e - as_fn_set_status $1 - exit $1 -} @%:@ as_fn_exit - -@%:@ as_fn_unset VAR -@%:@ --------------- -@%:@ Portably unset VAR. -as_fn_unset () -{ - { eval $1=; unset $1;} -} -as_unset=as_fn_unset -@%:@ as_fn_append VAR VALUE -@%:@ ---------------------- -@%:@ Append the text in VALUE to the end of the definition contained in VAR. Take -@%:@ advantage of any shell optimizations that allow amortized linear growth over -@%:@ repeated appends, instead of the typical quadratic growth present in naive -@%:@ implementations. -if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : - eval 'as_fn_append () - { - eval $1+=\$2 - }' -else - as_fn_append () - { - eval $1=\$$1\$2 - } -fi # as_fn_append - -@%:@ as_fn_arith ARG... -@%:@ ------------------ -@%:@ Perform arithmetic evaluation on the ARGs, and store the result in the -@%:@ global @S|@as_val. Take advantage of shells that can avoid forks. The arguments -@%:@ must be portable across @S|@(()) and expr. -if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : - eval 'as_fn_arith () - { - as_val=$(( $* )) - }' -else - as_fn_arith () - { - as_val=`expr "$@" || test $? -eq 1` - } -fi # as_fn_arith - - -if expr a : '\(a\)' >/dev/null 2>&1 && - test "X`expr 00001 : '.*\(...\)'`" = X001; then - as_expr=expr -else - as_expr=false -fi - -if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then - as_basename=basename -else - as_basename=false -fi - -if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then - as_dirname=dirname -else - as_dirname=false -fi - -as_me=`$as_basename -- "$0" || -$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ - X"$0" : 'X\(//\)$' \| \ - X"$0" : 'X\(/\)' \| . 2>/dev/null || -$as_echo X/"$0" | - sed '/^.*\/\([^/][^/]*\)\/*$/{ - s//\1/ - q - } - /^X\/\(\/\/\)$/{ - s//\1/ - q - } - /^X\/\(\/\).*/{ - s//\1/ - q - } - s/.*/./; q'` - -# Avoid depending upon Character Ranges. -as_cr_letters='abcdefghijklmnopqrstuvwxyz' -as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' -as_cr_Letters=$as_cr_letters$as_cr_LETTERS -as_cr_digits='0123456789' -as_cr_alnum=$as_cr_Letters$as_cr_digits - -ECHO_C= ECHO_N= ECHO_T= -case `echo -n x` in @%:@((((( --n*) - case `echo 'xy\c'` in - *c*) ECHO_T=' ';; # ECHO_T is single tab character. - xy) ECHO_C='\c';; - *) echo `echo ksh88 bug on AIX 6.1` > /dev/null - ECHO_T=' ';; - esac;; -*) - ECHO_N='-n';; -esac - -rm -f conf$$ conf$$.exe conf$$.file -if test -d conf$$.dir; then - rm -f conf$$.dir/conf$$.file -else - rm -f conf$$.dir - mkdir conf$$.dir 2>/dev/null -fi -if (echo >conf$$.file) 2>/dev/null; then - if ln -s conf$$.file conf$$ 2>/dev/null; then - as_ln_s='ln -s' - # ... but there are two gotchas: - # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. - # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. - # In both cases, we have to default to `cp -pR'. - ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || - as_ln_s='cp -pR' - elif ln conf$$.file conf$$ 2>/dev/null; then - as_ln_s=ln - else - as_ln_s='cp -pR' - fi -else - as_ln_s='cp -pR' -fi -rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file -rmdir conf$$.dir 2>/dev/null - - -@%:@ as_fn_mkdir_p -@%:@ ------------- -@%:@ Create "@S|@as_dir" as a directory, including parents if necessary. -as_fn_mkdir_p () -{ - - case $as_dir in #( - -*) as_dir=./$as_dir;; - esac - test -d "$as_dir" || eval $as_mkdir_p || { - as_dirs= - while :; do - case $as_dir in #( - *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( - *) as_qdir=$as_dir;; - esac - as_dirs="'$as_qdir' $as_dirs" - as_dir=`$as_dirname -- "$as_dir" || -$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ - X"$as_dir" : 'X\(//\)[^/]' \| \ - X"$as_dir" : 'X\(//\)$' \| \ - X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || -$as_echo X"$as_dir" | - sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ - s//\1/ - q - } - /^X\(\/\/\)[^/].*/{ - s//\1/ - q - } - /^X\(\/\/\)$/{ - s//\1/ - q - } - /^X\(\/\).*/{ - s//\1/ - q - } - s/.*/./; q'` - test -d "$as_dir" && break - done - test -z "$as_dirs" || eval "mkdir $as_dirs" - } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" - - -} @%:@ as_fn_mkdir_p -if mkdir -p . 2>/dev/null; then - as_mkdir_p='mkdir -p "$as_dir"' -else - test -d ./-p && rmdir ./-p - as_mkdir_p=false -fi - - -@%:@ as_fn_executable_p FILE -@%:@ ----------------------- -@%:@ Test if FILE is an executable regular file. -as_fn_executable_p () -{ - test -f "$1" && test -x "$1" -} @%:@ as_fn_executable_p -as_test_x='test -x' -as_executable_p=as_fn_executable_p - -# Sed expression to map a string onto a valid CPP name. -as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" - -# Sed expression to map a string onto a valid variable name. -as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" - - -exec 6>&1 -## ----------------------------------- ## -## Main body of $CONFIG_STATUS script. ## -## ----------------------------------- ## -_ASEOF -test $as_write_fail = 0 && chmod +x $CONFIG_STATUS || ac_write_fail=1 - -cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 -# Save the log message, to keep $0 and so on meaningful, and to -# report actual input values of CONFIG_FILES etc. instead of their -# values after options handling. -ac_log=" -This file was extended by zookeeper C client $as_me 3.4.5, which was -generated by GNU Autoconf 2.69. Invocation command line was - - CONFIG_FILES = $CONFIG_FILES - CONFIG_HEADERS = $CONFIG_HEADERS - CONFIG_LINKS = $CONFIG_LINKS - CONFIG_COMMANDS = $CONFIG_COMMANDS - $ $0 $@ - -on `(hostname || uname -n) 2>/dev/null | sed 1q` -" - -_ACEOF - -case $ac_config_files in *" -"*) set x $ac_config_files; shift; ac_config_files=$*;; -esac - -case $ac_config_headers in *" -"*) set x $ac_config_headers; shift; ac_config_headers=$*;; -esac - - -cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 -# Files that config.status was made for. -config_files="$ac_config_files" -config_headers="$ac_config_headers" -config_commands="$ac_config_commands" - -_ACEOF - -cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 -ac_cs_usage="\ -\`$as_me' instantiates files and other configuration actions -from templates according to the current configuration. Unless the files -and actions are specified as TAGs, all are instantiated by default. - -Usage: $0 [OPTION]... [TAG]... - - -h, --help print this help, then exit - -V, --version print version number and configuration settings, then exit - --config print configuration, then exit - -q, --quiet, --silent - do not print progress messages - -d, --debug don't remove temporary files - --recheck update $as_me by reconfiguring in the same conditions - --file=FILE[:TEMPLATE] - instantiate the configuration file FILE - --header=FILE[:TEMPLATE] - instantiate the configuration header FILE - -Configuration files: -$config_files - -Configuration headers: -$config_headers - -Configuration commands: -$config_commands - -Report bugs to ." - -_ACEOF -cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 -ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" -ac_cs_version="\\ -zookeeper C client config.status 3.4.5 -configured by $0, generated by GNU Autoconf 2.69, - with options \\"\$ac_cs_config\\" - -Copyright (C) 2012 Free Software Foundation, Inc. -This config.status script is free software; the Free Software Foundation -gives unlimited permission to copy, distribute and modify it." - -ac_pwd='$ac_pwd' -srcdir='$srcdir' -INSTALL='$INSTALL' -MKDIR_P='$MKDIR_P' -AWK='$AWK' -test -n "\$AWK" || AWK=awk -_ACEOF - -cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 -# The default lists apply if the user does not specify any file. -ac_need_defaults=: -while test $# != 0 -do - case $1 in - --*=?*) - ac_option=`expr "X$1" : 'X\([^=]*\)='` - ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'` - ac_shift=: - ;; - --*=) - ac_option=`expr "X$1" : 'X\([^=]*\)='` - ac_optarg= - ac_shift=: - ;; - *) - ac_option=$1 - ac_optarg=$2 - ac_shift=shift - ;; - esac - - case $ac_option in - # Handling of the options. - -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) - ac_cs_recheck=: ;; - --version | --versio | --versi | --vers | --ver | --ve | --v | -V ) - $as_echo "$ac_cs_version"; exit ;; - --config | --confi | --conf | --con | --co | --c ) - $as_echo "$ac_cs_config"; exit ;; - --debug | --debu | --deb | --de | --d | -d ) - debug=: ;; - --file | --fil | --fi | --f ) - $ac_shift - case $ac_optarg in - *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; - '') as_fn_error $? "missing file argument" ;; - esac - as_fn_append CONFIG_FILES " '$ac_optarg'" - ac_need_defaults=false;; - --header | --heade | --head | --hea ) - $ac_shift - case $ac_optarg in - *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; - esac - as_fn_append CONFIG_HEADERS " '$ac_optarg'" - ac_need_defaults=false;; - --he | --h) - # Conflict between --help and --header - as_fn_error $? "ambiguous option: \`$1' -Try \`$0 --help' for more information.";; - --help | --hel | -h ) - $as_echo "$ac_cs_usage"; exit ;; - -q | -quiet | --quiet | --quie | --qui | --qu | --q \ - | -silent | --silent | --silen | --sile | --sil | --si | --s) - ac_cs_silent=: ;; - - # This is an error. - -*) as_fn_error $? "unrecognized option: \`$1' -Try \`$0 --help' for more information." ;; - - *) as_fn_append ac_config_targets " $1" - ac_need_defaults=false ;; - - esac - shift -done - -ac_configure_extra_args= - -if $ac_cs_silent; then - exec 6>/dev/null - ac_configure_extra_args="$ac_configure_extra_args --silent" -fi - -_ACEOF -cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 -if \$ac_cs_recheck; then - set X $SHELL '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion - shift - \$as_echo "running CONFIG_SHELL=$SHELL \$*" >&6 - CONFIG_SHELL='$SHELL' - export CONFIG_SHELL - exec "\$@" -fi - -_ACEOF -cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 -exec 5>>config.log -{ - echo - sed 'h;s/./-/g;s/^.../@%:@@%:@ /;s/...$/ @%:@@%:@/;p;x;p;x' <<_ASBOX -@%:@@%:@ Running $as_me. @%:@@%:@ -_ASBOX - $as_echo "$ac_log" -} >&5 - -_ACEOF -cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 -# -# INIT-COMMANDS -# -AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir" - -_ACEOF - -cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 - -# Handling of arguments. -for ac_config_target in $ac_config_targets -do - case $ac_config_target in - "config.h") CONFIG_HEADERS="$CONFIG_HEADERS config.h" ;; - "depfiles") CONFIG_COMMANDS="$CONFIG_COMMANDS depfiles" ;; - "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;; - - *) as_fn_error $? "invalid argument: \`$ac_config_target'" "$LINENO" 5;; - esac -done - - -# If the user did not use the arguments to specify the items to instantiate, -# then the envvar interface is used. Set only those that are not. -# We use the long form for the default assignment because of an extremely -# bizarre bug on SunOS 4.1.3. -if $ac_need_defaults; then - test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files - test "${CONFIG_HEADERS+set}" = set || CONFIG_HEADERS=$config_headers - test "${CONFIG_COMMANDS+set}" = set || CONFIG_COMMANDS=$config_commands -fi - -# Have a temporary directory for convenience. Make it in the build tree -# simply because there is no reason against having it here, and in addition, -# creating and moving files from /tmp can sometimes cause problems. -# Hook for its removal unless debugging. -# Note that there is a small window in which the directory will not be cleaned: -# after its creation but before its name has been assigned to `$tmp'. -$debug || -{ - tmp= ac_tmp= - trap 'exit_status=$? - : "${ac_tmp:=$tmp}" - { test ! -d "$ac_tmp" || rm -fr "$ac_tmp"; } && exit $exit_status -' 0 - trap 'as_fn_exit 1' 1 2 13 15 -} -# Create a (secure) tmp directory for tmp files. - -{ - tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` && - test -d "$tmp" -} || -{ - tmp=./conf$$-$RANDOM - (umask 077 && mkdir "$tmp") -} || as_fn_error $? "cannot create a temporary directory in ." "$LINENO" 5 -ac_tmp=$tmp - -# Set up the scripts for CONFIG_FILES section. -# No need to generate them if there are no CONFIG_FILES. -# This happens for instance with `./config.status config.h'. -if test -n "$CONFIG_FILES"; then - - -ac_cr=`echo X | tr X '\015'` -# On cygwin, bash can eat \r inside `` if the user requested igncr. -# But we know of no other shell where ac_cr would be empty at this -# point, so we can use a bashism as a fallback. -if test "x$ac_cr" = x; then - eval ac_cr=\$\'\\r\' -fi -ac_cs_awk_cr=`$AWK 'BEGIN { print "a\rb" }' /dev/null` -if test "$ac_cs_awk_cr" = "a${ac_cr}b"; then - ac_cs_awk_cr='\\r' -else - ac_cs_awk_cr=$ac_cr -fi - -echo 'BEGIN {' >"$ac_tmp/subs1.awk" && -_ACEOF - - -{ - echo "cat >conf$$subs.awk <<_ACEOF" && - echo "$ac_subst_vars" | sed 's/.*/&!$&$ac_delim/' && - echo "_ACEOF" -} >conf$$subs.sh || - as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 -ac_delim_num=`echo "$ac_subst_vars" | grep -c '^'` -ac_delim='%!_!# ' -for ac_last_try in false false false false false :; do - . ./conf$$subs.sh || - as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 - - ac_delim_n=`sed -n "s/.*$ac_delim\$/X/p" conf$$subs.awk | grep -c X` - if test $ac_delim_n = $ac_delim_num; then - break - elif $ac_last_try; then - as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 - else - ac_delim="$ac_delim!$ac_delim _$ac_delim!! " - fi -done -rm -f conf$$subs.sh - -cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 -cat >>"\$ac_tmp/subs1.awk" <<\\_ACAWK && -_ACEOF -sed -n ' -h -s/^/S["/; s/!.*/"]=/ -p -g -s/^[^!]*!// -:repl -t repl -s/'"$ac_delim"'$// -t delim -:nl -h -s/\(.\{148\}\)..*/\1/ -t more1 -s/["\\]/\\&/g; s/^/"/; s/$/\\n"\\/ -p -n -b repl -:more1 -s/["\\]/\\&/g; s/^/"/; s/$/"\\/ -p -g -s/.\{148\}// -t nl -:delim -h -s/\(.\{148\}\)..*/\1/ -t more2 -s/["\\]/\\&/g; s/^/"/; s/$/"/ -p -b -:more2 -s/["\\]/\\&/g; s/^/"/; s/$/"\\/ -p -g -s/.\{148\}// -t delim -' >$CONFIG_STATUS || ac_write_fail=1 -rm -f conf$$subs.awk -cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 -_ACAWK -cat >>"\$ac_tmp/subs1.awk" <<_ACAWK && - for (key in S) S_is_set[key] = 1 - FS = "" - -} -{ - line = $ 0 - nfields = split(line, field, "@") - substed = 0 - len = length(field[1]) - for (i = 2; i < nfields; i++) { - key = field[i] - keylen = length(key) - if (S_is_set[key]) { - value = S[key] - line = substr(line, 1, len) "" value "" substr(line, len + keylen + 3) - len += length(value) + length(field[++i]) - substed = 1 - } else - len += 1 + keylen - } - - print line -} - -_ACAWK -_ACEOF -cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 -if sed "s/$ac_cr//" < /dev/null > /dev/null 2>&1; then - sed "s/$ac_cr\$//; s/$ac_cr/$ac_cs_awk_cr/g" -else - cat -fi < "$ac_tmp/subs1.awk" > "$ac_tmp/subs.awk" \ - || as_fn_error $? "could not setup config files machinery" "$LINENO" 5 -_ACEOF - -# VPATH may cause trouble with some makes, so we remove sole $(srcdir), -# ${srcdir} and @srcdir@ entries from VPATH if srcdir is ".", strip leading and -# trailing colons and then remove the whole line if VPATH becomes empty -# (actually we leave an empty line to preserve line numbers). -if test "x$srcdir" = x.; then - ac_vpsub='/^[ ]*VPATH[ ]*=[ ]*/{ -h -s/// -s/^/:/ -s/[ ]*$/:/ -s/:\$(srcdir):/:/g -s/:\${srcdir}:/:/g -s/:@srcdir@:/:/g -s/^:*// -s/:*$// -x -s/\(=[ ]*\).*/\1/ -G -s/\n// -s/^[^=]*=[ ]*$// -}' -fi - -cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 -fi # test -n "$CONFIG_FILES" - -# Set up the scripts for CONFIG_HEADERS section. -# No need to generate them if there are no CONFIG_HEADERS. -# This happens for instance with `./config.status Makefile'. -if test -n "$CONFIG_HEADERS"; then -cat >"$ac_tmp/defines.awk" <<\_ACAWK || -BEGIN { -_ACEOF - -# Transform confdefs.h into an awk script `defines.awk', embedded as -# here-document in config.status, that substitutes the proper values into -# config.h.in to produce config.h. - -# Create a delimiter string that does not exist in confdefs.h, to ease -# handling of long lines. -ac_delim='%!_!# ' -for ac_last_try in false false :; do - ac_tt=`sed -n "/$ac_delim/p" confdefs.h` - if test -z "$ac_tt"; then - break - elif $ac_last_try; then - as_fn_error $? "could not make $CONFIG_HEADERS" "$LINENO" 5 - else - ac_delim="$ac_delim!$ac_delim _$ac_delim!! " - fi -done - -# For the awk script, D is an array of macro values keyed by name, -# likewise P contains macro parameters if any. Preserve backslash -# newline sequences. - -ac_word_re=[_$as_cr_Letters][_$as_cr_alnum]* -sed -n ' -s/.\{148\}/&'"$ac_delim"'/g -t rset -:rset -s/^[ ]*#[ ]*define[ ][ ]*/ / -t def -d -:def -s/\\$// -t bsnl -s/["\\]/\\&/g -s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\ -D["\1"]=" \3"/p -s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2"/p -d -:bsnl -s/["\\]/\\&/g -s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\ -D["\1"]=" \3\\\\\\n"\\/p -t cont -s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2\\\\\\n"\\/p -t cont -d -:cont -n -s/.\{148\}/&'"$ac_delim"'/g -t clear -:clear -s/\\$// -t bsnlc -s/["\\]/\\&/g; s/^/"/; s/$/"/p -d -:bsnlc -s/["\\]/\\&/g; s/^/"/; s/$/\\\\\\n"\\/p -b cont -' >$CONFIG_STATUS || ac_write_fail=1 - -cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 - for (key in D) D_is_set[key] = 1 - FS = "" -} -/^[\t ]*#[\t ]*(define|undef)[\t ]+$ac_word_re([\t (]|\$)/ { - line = \$ 0 - split(line, arg, " ") - if (arg[1] == "#") { - defundef = arg[2] - mac1 = arg[3] - } else { - defundef = substr(arg[1], 2) - mac1 = arg[2] - } - split(mac1, mac2, "(") #) - macro = mac2[1] - prefix = substr(line, 1, index(line, defundef) - 1) - if (D_is_set[macro]) { - # Preserve the white space surrounding the "#". - print prefix "define", macro P[macro] D[macro] - next - } else { - # Replace #undef with comments. This is necessary, for example, - # in the case of _POSIX_SOURCE, which is predefined and required - # on some systems where configure will not decide to define it. - if (defundef == "undef") { - print "/*", prefix defundef, macro, "*/" - next - } - } -} -{ print } -_ACAWK -_ACEOF -cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 - as_fn_error $? "could not setup config headers machinery" "$LINENO" 5 -fi # test -n "$CONFIG_HEADERS" - - -eval set X " :F $CONFIG_FILES :H $CONFIG_HEADERS :C $CONFIG_COMMANDS" -shift -for ac_tag -do - case $ac_tag in - :[FHLC]) ac_mode=$ac_tag; continue;; - esac - case $ac_mode$ac_tag in - :[FHL]*:*);; - :L* | :C*:*) as_fn_error $? "invalid tag \`$ac_tag'" "$LINENO" 5;; - :[FH]-) ac_tag=-:-;; - :[FH]*) ac_tag=$ac_tag:$ac_tag.in;; - esac - ac_save_IFS=$IFS - IFS=: - set x $ac_tag - IFS=$ac_save_IFS - shift - ac_file=$1 - shift - - case $ac_mode in - :L) ac_source=$1;; - :[FH]) - ac_file_inputs= - for ac_f - do - case $ac_f in - -) ac_f="$ac_tmp/stdin";; - *) # Look for the file first in the build tree, then in the source tree - # (if the path is not absolute). The absolute path cannot be DOS-style, - # because $ac_f cannot contain `:'. - test -f "$ac_f" || - case $ac_f in - [\\/$]*) false;; - *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";; - esac || - as_fn_error 1 "cannot find input file: \`$ac_f'" "$LINENO" 5;; - esac - case $ac_f in *\'*) ac_f=`$as_echo "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac - as_fn_append ac_file_inputs " '$ac_f'" - done - - # Let's still pretend it is `configure' which instantiates (i.e., don't - # use $as_me), people would be surprised to read: - # /* config.h. Generated by config.status. */ - configure_input='Generated from '` - $as_echo "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g' - `' by configure.' - if test x"$ac_file" != x-; then - configure_input="$ac_file. $configure_input" - { $as_echo "$as_me:${as_lineno-$LINENO}: creating $ac_file" >&5 -$as_echo "$as_me: creating $ac_file" >&6;} - fi - # Neutralize special characters interpreted by sed in replacement strings. - case $configure_input in #( - *\&* | *\|* | *\\* ) - ac_sed_conf_input=`$as_echo "$configure_input" | - sed 's/[\\\\&|]/\\\\&/g'`;; #( - *) ac_sed_conf_input=$configure_input;; - esac - - case $ac_tag in - *:-:* | *:-) cat >"$ac_tmp/stdin" \ - || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; - esac - ;; - esac - - ac_dir=`$as_dirname -- "$ac_file" || -$as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ - X"$ac_file" : 'X\(//\)[^/]' \| \ - X"$ac_file" : 'X\(//\)$' \| \ - X"$ac_file" : 'X\(/\)' \| . 2>/dev/null || -$as_echo X"$ac_file" | - sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ - s//\1/ - q - } - /^X\(\/\/\)[^/].*/{ - s//\1/ - q - } - /^X\(\/\/\)$/{ - s//\1/ - q - } - /^X\(\/\).*/{ - s//\1/ - q - } - s/.*/./; q'` - as_dir="$ac_dir"; as_fn_mkdir_p - ac_builddir=. - -case "$ac_dir" in -.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; -*) - ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` - # A ".." for each directory in $ac_dir_suffix. - ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` - case $ac_top_builddir_sub in - "") ac_top_builddir_sub=. ac_top_build_prefix= ;; - *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; - esac ;; -esac -ac_abs_top_builddir=$ac_pwd -ac_abs_builddir=$ac_pwd$ac_dir_suffix -# for backward compatibility: -ac_top_builddir=$ac_top_build_prefix - -case $srcdir in - .) # We are building in place. - ac_srcdir=. - ac_top_srcdir=$ac_top_builddir_sub - ac_abs_top_srcdir=$ac_pwd ;; - [\\/]* | ?:[\\/]* ) # Absolute name. - ac_srcdir=$srcdir$ac_dir_suffix; - ac_top_srcdir=$srcdir - ac_abs_top_srcdir=$srcdir ;; - *) # Relative name. - ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix - ac_top_srcdir=$ac_top_build_prefix$srcdir - ac_abs_top_srcdir=$ac_pwd/$srcdir ;; -esac -ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix - - - case $ac_mode in - :F) - # - # CONFIG_FILE - # - - case $INSTALL in - [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;; - *) ac_INSTALL=$ac_top_build_prefix$INSTALL ;; - esac - ac_MKDIR_P=$MKDIR_P - case $MKDIR_P in - [\\/$]* | ?:[\\/]* ) ;; - */*) ac_MKDIR_P=$ac_top_build_prefix$MKDIR_P ;; - esac -_ACEOF - -cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 -# If the template does not know about datarootdir, expand it. -# FIXME: This hack should be removed a few years after 2.60. -ac_datarootdir_hack=; ac_datarootdir_seen= -ac_sed_dataroot=' -/datarootdir/ { - p - q -} -/@datadir@/p -/@docdir@/p -/@infodir@/p -/@localedir@/p -/@mandir@/p' -case `eval "sed -n \"\$ac_sed_dataroot\" $ac_file_inputs"` in -*datarootdir*) ac_datarootdir_seen=yes;; -*@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*) - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5 -$as_echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;} -_ACEOF -cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 - ac_datarootdir_hack=' - s&@datadir@&$datadir&g - s&@docdir@&$docdir&g - s&@infodir@&$infodir&g - s&@localedir@&$localedir&g - s&@mandir@&$mandir&g - s&\\\${datarootdir}&$datarootdir&g' ;; -esac -_ACEOF - -# Neutralize VPATH when `$srcdir' = `.'. -# Shell code in configure.ac might set extrasub. -# FIXME: do we really want to maintain this feature? -cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 -ac_sed_extra="$ac_vpsub -$extrasub -_ACEOF -cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 -:t -/@[a-zA-Z_][a-zA-Z_0-9]*@/!b -s|@configure_input@|$ac_sed_conf_input|;t t -s&@top_builddir@&$ac_top_builddir_sub&;t t -s&@top_build_prefix@&$ac_top_build_prefix&;t t -s&@srcdir@&$ac_srcdir&;t t -s&@abs_srcdir@&$ac_abs_srcdir&;t t -s&@top_srcdir@&$ac_top_srcdir&;t t -s&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t -s&@builddir@&$ac_builddir&;t t -s&@abs_builddir@&$ac_abs_builddir&;t t -s&@abs_top_builddir@&$ac_abs_top_builddir&;t t -s&@INSTALL@&$ac_INSTALL&;t t -s&@MKDIR_P@&$ac_MKDIR_P&;t t -$ac_datarootdir_hack -" -eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$ac_tmp/subs.awk" \ - >$ac_tmp/out || as_fn_error $? "could not create $ac_file" "$LINENO" 5 - -test -z "$ac_datarootdir_hack$ac_datarootdir_seen" && - { ac_out=`sed -n '/\${datarootdir}/p' "$ac_tmp/out"`; test -n "$ac_out"; } && - { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' \ - "$ac_tmp/out"`; test -z "$ac_out"; } && - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \`datarootdir' -which seems to be undefined. Please make sure it is defined" >&5 -$as_echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir' -which seems to be undefined. Please make sure it is defined" >&2;} - - rm -f "$ac_tmp/stdin" - case $ac_file in - -) cat "$ac_tmp/out" && rm -f "$ac_tmp/out";; - *) rm -f "$ac_file" && mv "$ac_tmp/out" "$ac_file";; - esac \ - || as_fn_error $? "could not create $ac_file" "$LINENO" 5 - ;; - :H) - # - # CONFIG_HEADER - # - if test x"$ac_file" != x-; then - { - $as_echo "/* $configure_input */" \ - && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" - } >"$ac_tmp/config.h" \ - || as_fn_error $? "could not create $ac_file" "$LINENO" 5 - if diff "$ac_file" "$ac_tmp/config.h" >/dev/null 2>&1; then - { $as_echo "$as_me:${as_lineno-$LINENO}: $ac_file is unchanged" >&5 -$as_echo "$as_me: $ac_file is unchanged" >&6;} - else - rm -f "$ac_file" - mv "$ac_tmp/config.h" "$ac_file" \ - || as_fn_error $? "could not create $ac_file" "$LINENO" 5 - fi - else - $as_echo "/* $configure_input */" \ - && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" \ - || as_fn_error $? "could not create -" "$LINENO" 5 - fi -# Compute "$ac_file"'s index in $config_headers. -_am_arg="$ac_file" -_am_stamp_count=1 -for _am_header in $config_headers :; do - case $_am_header in - $_am_arg | $_am_arg:* ) - break ;; - * ) - _am_stamp_count=`expr $_am_stamp_count + 1` ;; - esac -done -echo "timestamp for $_am_arg" >`$as_dirname -- "$_am_arg" || -$as_expr X"$_am_arg" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ - X"$_am_arg" : 'X\(//\)[^/]' \| \ - X"$_am_arg" : 'X\(//\)$' \| \ - X"$_am_arg" : 'X\(/\)' \| . 2>/dev/null || -$as_echo X"$_am_arg" | - sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ - s//\1/ - q - } - /^X\(\/\/\)[^/].*/{ - s//\1/ - q - } - /^X\(\/\/\)$/{ - s//\1/ - q - } - /^X\(\/\).*/{ - s//\1/ - q - } - s/.*/./; q'`/stamp-h$_am_stamp_count - ;; - - :C) { $as_echo "$as_me:${as_lineno-$LINENO}: executing $ac_file commands" >&5 -$as_echo "$as_me: executing $ac_file commands" >&6;} - ;; - esac - - - case $ac_file$ac_mode in - "depfiles":C) test x"$AMDEP_TRUE" != x"" || { - # Autoconf 2.62 quotes --file arguments for eval, but not when files - # are listed without --file. Let's play safe and only enable the eval - # if we detect the quoting. - case $CONFIG_FILES in - *\'*) eval set x "$CONFIG_FILES" ;; - *) set x $CONFIG_FILES ;; - esac - shift - for mf - do - # Strip MF so we end up with the name of the file. - mf=`echo "$mf" | sed -e 's/:.*$//'` - # Check whether this is an Automake generated Makefile or not. - # We used to match only the files named `Makefile.in', but - # some people rename them; so instead we look at the file content. - # Grep'ing the first line is not enough: some people post-process - # each Makefile.in and add a new line on top of each file to say so. - # Grep'ing the whole file is not good either: AIX grep has a line - # limit of 2048, but all sed's we know have understand at least 4000. - if sed -n 's,^#.*generated by automake.*,X,p' "$mf" | grep X >/dev/null 2>&1; then - dirpart=`$as_dirname -- "$mf" || -$as_expr X"$mf" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ - X"$mf" : 'X\(//\)[^/]' \| \ - X"$mf" : 'X\(//\)$' \| \ - X"$mf" : 'X\(/\)' \| . 2>/dev/null || -$as_echo X"$mf" | - sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ - s//\1/ - q - } - /^X\(\/\/\)[^/].*/{ - s//\1/ - q - } - /^X\(\/\/\)$/{ - s//\1/ - q - } - /^X\(\/\).*/{ - s//\1/ - q - } - s/.*/./; q'` - else - continue - fi - # Extract the definition of DEPDIR, am__include, and am__quote - # from the Makefile without running `make'. - DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"` - test -z "$DEPDIR" && continue - am__include=`sed -n 's/^am__include = //p' < "$mf"` - test -z "am__include" && continue - am__quote=`sed -n 's/^am__quote = //p' < "$mf"` - # When using ansi2knr, U may be empty or an underscore; expand it - U=`sed -n 's/^U = //p' < "$mf"` - # Find all dependency output files, they are included files with - # $(DEPDIR) in their names. We invoke sed twice because it is the - # simplest approach to changing $(DEPDIR) to its actual value in the - # expansion. - for file in `sed -n " - s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \ - sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g' -e 's/\$U/'"$U"'/g'`; do - # Make sure the directory exists. - test -f "$dirpart/$file" && continue - fdir=`$as_dirname -- "$file" || -$as_expr X"$file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ - X"$file" : 'X\(//\)[^/]' \| \ - X"$file" : 'X\(//\)$' \| \ - X"$file" : 'X\(/\)' \| . 2>/dev/null || -$as_echo X"$file" | - sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ - s//\1/ - q - } - /^X\(\/\/\)[^/].*/{ - s//\1/ - q - } - /^X\(\/\/\)$/{ - s//\1/ - q - } - /^X\(\/\).*/{ - s//\1/ - q - } - s/.*/./; q'` - as_dir=$dirpart/$fdir; as_fn_mkdir_p - # echo "creating $dirpart/$file" - echo '# dummy' > "$dirpart/$file" - done - done -} - ;; - - esac -done # for ac_tag - - -as_fn_exit 0 -_ACEOF -ac_clean_files=$ac_clean_files_save - -test $ac_write_fail = 0 || - as_fn_error $? "write failure creating $CONFIG_STATUS" "$LINENO" 5 - - -# configure is writing to config.log, and then calls config.status. -# config.status does its own redirection, appending to config.log. -# Unfortunately, on DOS this fails, as config.log is still kept open -# by configure, so config.status won't be able to write to it; its -# output is simply discarded. So we exec the FD to /dev/null, -# effectively closing config.log, so it can be properly (re)opened and -# appended to by config.status. When coming back to configure, we -# need to make the FD available again. -if test "$no_create" != yes; then - ac_cs_success=: - ac_config_status_args= - test "$silent" = yes && - ac_config_status_args="$ac_config_status_args --quiet" - exec 5>/dev/null - $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false - exec 5>>config.log - # Use ||, not &&, to avoid exiting from the if with $? = 1, which - # would make configure fail if this is the last instruction. - $ac_cs_success || as_fn_exit 1 -fi -if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5 -$as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;} -fi - diff --git a/pkg/registry/zookeeper-3.4.6/src/c/autom4te.cache/output.1 b/pkg/registry/zookeeper-3.4.6/src/c/autom4te.cache/output.1 deleted file mode 100644 index 3bc7b3c9e..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/c/autom4te.cache/output.1 +++ /dev/null @@ -1,20613 +0,0 @@ -@%:@! /bin/sh -@%:@ Guess values for system-dependent variables and create Makefiles. -@%:@ Generated by GNU Autoconf 2.69 for zookeeper C client 3.4.6. -@%:@ -@%:@ Report bugs to . -@%:@ -@%:@ -@%:@ Copyright (C) 1992-1996, 1998-2012 Free Software Foundation, Inc. -@%:@ -@%:@ -@%:@ This configure script is free software; the Free Software Foundation -@%:@ gives unlimited permission to copy, distribute and modify it. -## -------------------- ## -## M4sh Initialization. ## -## -------------------- ## - -# Be more Bourne compatible -DUALCASE=1; export DUALCASE # for MKS sh -if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : - emulate sh - NULLCMD=: - # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which - # is contrary to our usage. Disable this feature. - alias -g '${1+"$@"}'='"$@"' - setopt NO_GLOB_SUBST -else - case `(set -o) 2>/dev/null` in @%:@( - *posix*) : - set -o posix ;; @%:@( - *) : - ;; -esac -fi - - -as_nl=' -' -export as_nl -# Printing a long string crashes Solaris 7 /usr/bin/printf. -as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' -as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo -as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo -# Prefer a ksh shell builtin over an external printf program on Solaris, -# but without wasting forks for bash or zsh. -if test -z "$BASH_VERSION$ZSH_VERSION" \ - && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then - as_echo='print -r --' - as_echo_n='print -rn --' -elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then - as_echo='printf %s\n' - as_echo_n='printf %s' -else - if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then - as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' - as_echo_n='/usr/ucb/echo -n' - else - as_echo_body='eval expr "X$1" : "X\\(.*\\)"' - as_echo_n_body='eval - arg=$1; - case $arg in @%:@( - *"$as_nl"*) - expr "X$arg" : "X\\(.*\\)$as_nl"; - arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; - esac; - expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" - ' - export as_echo_n_body - as_echo_n='sh -c $as_echo_n_body as_echo' - fi - export as_echo_body - as_echo='sh -c $as_echo_body as_echo' -fi - -# The user is always right. -if test "${PATH_SEPARATOR+set}" != set; then - PATH_SEPARATOR=: - (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { - (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || - PATH_SEPARATOR=';' - } -fi - - -# IFS -# We need space, tab and new line, in precisely that order. Quoting is -# there to prevent editors from complaining about space-tab. -# (If _AS_PATH_WALK were called with IFS unset, it would disable word -# splitting by setting IFS to empty value.) -IFS=" "" $as_nl" - -# Find who we are. Look in the path if we contain no directory separator. -as_myself= -case $0 in @%:@(( - *[\\/]* ) as_myself=$0 ;; - *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break - done -IFS=$as_save_IFS - - ;; -esac -# We did not find ourselves, most probably we were run as `sh COMMAND' -# in which case we are not to be found in the path. -if test "x$as_myself" = x; then - as_myself=$0 -fi -if test ! -f "$as_myself"; then - $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 - exit 1 -fi - -# Unset variables that we do not need and which cause bugs (e.g. in -# pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" -# suppresses any "Segmentation fault" message there. '((' could -# trigger a bug in pdksh 5.2.14. -for as_var in BASH_ENV ENV MAIL MAILPATH -do eval test x\${$as_var+set} = xset \ - && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : -done -PS1='$ ' -PS2='> ' -PS4='+ ' - -# NLS nuisances. -LC_ALL=C -export LC_ALL -LANGUAGE=C -export LANGUAGE - -# CDPATH. -(unset CDPATH) >/dev/null 2>&1 && unset CDPATH - -# Use a proper internal environment variable to ensure we don't fall - # into an infinite loop, continuously re-executing ourselves. - if test x"${_as_can_reexec}" != xno && test "x$CONFIG_SHELL" != x; then - _as_can_reexec=no; export _as_can_reexec; - # We cannot yet assume a decent shell, so we have to provide a -# neutralization value for shells without unset; and this also -# works around shells that cannot unset nonexistent variables. -# Preserve -v and -x to the replacement shell. -BASH_ENV=/dev/null -ENV=/dev/null -(unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV -case $- in @%:@ (((( - *v*x* | *x*v* ) as_opts=-vx ;; - *v* ) as_opts=-v ;; - *x* ) as_opts=-x ;; - * ) as_opts= ;; -esac -exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} -# Admittedly, this is quite paranoid, since all the known shells bail -# out after a failed `exec'. -$as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2 -as_fn_exit 255 - fi - # We don't want this to propagate to other subprocesses. - { _as_can_reexec=; unset _as_can_reexec;} -if test "x$CONFIG_SHELL" = x; then - as_bourne_compatible="if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then : - emulate sh - NULLCMD=: - # Pre-4.2 versions of Zsh do word splitting on \${1+\"\$@\"}, which - # is contrary to our usage. Disable this feature. - alias -g '\${1+\"\$@\"}'='\"\$@\"' - setopt NO_GLOB_SUBST -else - case \`(set -o) 2>/dev/null\` in @%:@( - *posix*) : - set -o posix ;; @%:@( - *) : - ;; -esac -fi -" - as_required="as_fn_return () { (exit \$1); } -as_fn_success () { as_fn_return 0; } -as_fn_failure () { as_fn_return 1; } -as_fn_ret_success () { return 0; } -as_fn_ret_failure () { return 1; } - -exitcode=0 -as_fn_success || { exitcode=1; echo as_fn_success failed.; } -as_fn_failure && { exitcode=1; echo as_fn_failure succeeded.; } -as_fn_ret_success || { exitcode=1; echo as_fn_ret_success failed.; } -as_fn_ret_failure && { exitcode=1; echo as_fn_ret_failure succeeded.; } -if ( set x; as_fn_ret_success y && test x = \"\$1\" ); then : - -else - exitcode=1; echo positional parameters were not saved. -fi -test x\$exitcode = x0 || exit 1 -test -x / || exit 1" - as_suggested=" as_lineno_1=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_1a=\$LINENO - as_lineno_2=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_2a=\$LINENO - eval 'test \"x\$as_lineno_1'\$as_run'\" != \"x\$as_lineno_2'\$as_run'\" && - test \"x\`expr \$as_lineno_1'\$as_run' + 1\`\" = \"x\$as_lineno_2'\$as_run'\"' || exit 1 - - test -n \"\${ZSH_VERSION+set}\${BASH_VERSION+set}\" || ( - ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' - ECHO=\$ECHO\$ECHO\$ECHO\$ECHO\$ECHO - ECHO=\$ECHO\$ECHO\$ECHO\$ECHO\$ECHO\$ECHO - PATH=/empty FPATH=/empty; export PATH FPATH - test \"X\`printf %s \$ECHO\`\" = \"X\$ECHO\" \\ - || test \"X\`print -r -- \$ECHO\`\" = \"X\$ECHO\" ) || exit 1 -test \$(( 1 + 1 )) = 2 || exit 1" - if (eval "$as_required") 2>/dev/null; then : - as_have_required=yes -else - as_have_required=no -fi - if test x$as_have_required = xyes && (eval "$as_suggested") 2>/dev/null; then : - -else - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -as_found=false -for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - as_found=: - case $as_dir in @%:@( - /*) - for as_base in sh bash ksh sh5; do - # Try only shells that exist, to save several forks. - as_shell=$as_dir/$as_base - if { test -f "$as_shell" || test -f "$as_shell.exe"; } && - { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$as_shell"; } 2>/dev/null; then : - CONFIG_SHELL=$as_shell as_have_required=yes - if { $as_echo "$as_bourne_compatible""$as_suggested" | as_run=a "$as_shell"; } 2>/dev/null; then : - break 2 -fi -fi - done;; - esac - as_found=false -done -$as_found || { if { test -f "$SHELL" || test -f "$SHELL.exe"; } && - { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$SHELL"; } 2>/dev/null; then : - CONFIG_SHELL=$SHELL as_have_required=yes -fi; } -IFS=$as_save_IFS - - - if test "x$CONFIG_SHELL" != x; then : - export CONFIG_SHELL - # We cannot yet assume a decent shell, so we have to provide a -# neutralization value for shells without unset; and this also -# works around shells that cannot unset nonexistent variables. -# Preserve -v and -x to the replacement shell. -BASH_ENV=/dev/null -ENV=/dev/null -(unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV -case $- in @%:@ (((( - *v*x* | *x*v* ) as_opts=-vx ;; - *v* ) as_opts=-v ;; - *x* ) as_opts=-x ;; - * ) as_opts= ;; -esac -exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} -# Admittedly, this is quite paranoid, since all the known shells bail -# out after a failed `exec'. -$as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2 -exit 255 -fi - - if test x$as_have_required = xno; then : - $as_echo "$0: This script requires a shell more modern than all" - $as_echo "$0: the shells that I found on your system." - if test x${ZSH_VERSION+set} = xset ; then - $as_echo "$0: In particular, zsh $ZSH_VERSION has bugs and should" - $as_echo "$0: be upgraded to zsh 4.3.4 or later." - else - $as_echo "$0: Please tell bug-autoconf@gnu.org and -$0: user@zookeeper.apache.org about your system, including -$0: any error possibly output before this message. Then -$0: install a modern shell, or manually run the script -$0: under such a shell if you do have one." - fi - exit 1 -fi -fi -fi -SHELL=${CONFIG_SHELL-/bin/sh} -export SHELL -# Unset more variables known to interfere with behavior of common tools. -CLICOLOR_FORCE= GREP_OPTIONS= -unset CLICOLOR_FORCE GREP_OPTIONS - -## --------------------- ## -## M4sh Shell Functions. ## -## --------------------- ## -@%:@ as_fn_unset VAR -@%:@ --------------- -@%:@ Portably unset VAR. -as_fn_unset () -{ - { eval $1=; unset $1;} -} -as_unset=as_fn_unset - -@%:@ as_fn_set_status STATUS -@%:@ ----------------------- -@%:@ Set @S|@? to STATUS, without forking. -as_fn_set_status () -{ - return $1 -} @%:@ as_fn_set_status - -@%:@ as_fn_exit STATUS -@%:@ ----------------- -@%:@ Exit the shell with STATUS, even in a "trap 0" or "set -e" context. -as_fn_exit () -{ - set +e - as_fn_set_status $1 - exit $1 -} @%:@ as_fn_exit - -@%:@ as_fn_mkdir_p -@%:@ ------------- -@%:@ Create "@S|@as_dir" as a directory, including parents if necessary. -as_fn_mkdir_p () -{ - - case $as_dir in #( - -*) as_dir=./$as_dir;; - esac - test -d "$as_dir" || eval $as_mkdir_p || { - as_dirs= - while :; do - case $as_dir in #( - *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( - *) as_qdir=$as_dir;; - esac - as_dirs="'$as_qdir' $as_dirs" - as_dir=`$as_dirname -- "$as_dir" || -$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ - X"$as_dir" : 'X\(//\)[^/]' \| \ - X"$as_dir" : 'X\(//\)$' \| \ - X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || -$as_echo X"$as_dir" | - sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ - s//\1/ - q - } - /^X\(\/\/\)[^/].*/{ - s//\1/ - q - } - /^X\(\/\/\)$/{ - s//\1/ - q - } - /^X\(\/\).*/{ - s//\1/ - q - } - s/.*/./; q'` - test -d "$as_dir" && break - done - test -z "$as_dirs" || eval "mkdir $as_dirs" - } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" - - -} @%:@ as_fn_mkdir_p - -@%:@ as_fn_executable_p FILE -@%:@ ----------------------- -@%:@ Test if FILE is an executable regular file. -as_fn_executable_p () -{ - test -f "$1" && test -x "$1" -} @%:@ as_fn_executable_p -@%:@ as_fn_append VAR VALUE -@%:@ ---------------------- -@%:@ Append the text in VALUE to the end of the definition contained in VAR. Take -@%:@ advantage of any shell optimizations that allow amortized linear growth over -@%:@ repeated appends, instead of the typical quadratic growth present in naive -@%:@ implementations. -if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : - eval 'as_fn_append () - { - eval $1+=\$2 - }' -else - as_fn_append () - { - eval $1=\$$1\$2 - } -fi # as_fn_append - -@%:@ as_fn_arith ARG... -@%:@ ------------------ -@%:@ Perform arithmetic evaluation on the ARGs, and store the result in the -@%:@ global @S|@as_val. Take advantage of shells that can avoid forks. The arguments -@%:@ must be portable across @S|@(()) and expr. -if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : - eval 'as_fn_arith () - { - as_val=$(( $* )) - }' -else - as_fn_arith () - { - as_val=`expr "$@" || test $? -eq 1` - } -fi # as_fn_arith - - -@%:@ as_fn_error STATUS ERROR [LINENO LOG_FD] -@%:@ ---------------------------------------- -@%:@ Output "`basename @S|@0`: error: ERROR" to stderr. If LINENO and LOG_FD are -@%:@ provided, also output the error to LOG_FD, referencing LINENO. Then exit the -@%:@ script with STATUS, using 1 if that was 0. -as_fn_error () -{ - as_status=$1; test $as_status -eq 0 && as_status=1 - if test "$4"; then - as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack - $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 - fi - $as_echo "$as_me: error: $2" >&2 - as_fn_exit $as_status -} @%:@ as_fn_error - -if expr a : '\(a\)' >/dev/null 2>&1 && - test "X`expr 00001 : '.*\(...\)'`" = X001; then - as_expr=expr -else - as_expr=false -fi - -if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then - as_basename=basename -else - as_basename=false -fi - -if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then - as_dirname=dirname -else - as_dirname=false -fi - -as_me=`$as_basename -- "$0" || -$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ - X"$0" : 'X\(//\)$' \| \ - X"$0" : 'X\(/\)' \| . 2>/dev/null || -$as_echo X/"$0" | - sed '/^.*\/\([^/][^/]*\)\/*$/{ - s//\1/ - q - } - /^X\/\(\/\/\)$/{ - s//\1/ - q - } - /^X\/\(\/\).*/{ - s//\1/ - q - } - s/.*/./; q'` - -# Avoid depending upon Character Ranges. -as_cr_letters='abcdefghijklmnopqrstuvwxyz' -as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' -as_cr_Letters=$as_cr_letters$as_cr_LETTERS -as_cr_digits='0123456789' -as_cr_alnum=$as_cr_Letters$as_cr_digits - - - as_lineno_1=$LINENO as_lineno_1a=$LINENO - as_lineno_2=$LINENO as_lineno_2a=$LINENO - eval 'test "x$as_lineno_1'$as_run'" != "x$as_lineno_2'$as_run'" && - test "x`expr $as_lineno_1'$as_run' + 1`" = "x$as_lineno_2'$as_run'"' || { - # Blame Lee E. McMahon (1931-1989) for sed's syntax. :-) - sed -n ' - p - /[$]LINENO/= - ' <$as_myself | - sed ' - s/[$]LINENO.*/&-/ - t lineno - b - :lineno - N - :loop - s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/ - t loop - s/-\n.*// - ' >$as_me.lineno && - chmod +x "$as_me.lineno" || - { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; } - - # If we had to re-execute with $CONFIG_SHELL, we're ensured to have - # already done that, so ensure we don't try to do so again and fall - # in an infinite loop. This has already happened in practice. - _as_can_reexec=no; export _as_can_reexec - # Don't try to exec as it changes $[0], causing all sort of problems - # (the dirname of $[0] is not the place where we might find the - # original and so on. Autoconf is especially sensitive to this). - . "./$as_me.lineno" - # Exit status is that of the last command. - exit -} - -ECHO_C= ECHO_N= ECHO_T= -case `echo -n x` in @%:@((((( --n*) - case `echo 'xy\c'` in - *c*) ECHO_T=' ';; # ECHO_T is single tab character. - xy) ECHO_C='\c';; - *) echo `echo ksh88 bug on AIX 6.1` > /dev/null - ECHO_T=' ';; - esac;; -*) - ECHO_N='-n';; -esac - -rm -f conf$$ conf$$.exe conf$$.file -if test -d conf$$.dir; then - rm -f conf$$.dir/conf$$.file -else - rm -f conf$$.dir - mkdir conf$$.dir 2>/dev/null -fi -if (echo >conf$$.file) 2>/dev/null; then - if ln -s conf$$.file conf$$ 2>/dev/null; then - as_ln_s='ln -s' - # ... but there are two gotchas: - # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. - # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. - # In both cases, we have to default to `cp -pR'. - ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || - as_ln_s='cp -pR' - elif ln conf$$.file conf$$ 2>/dev/null; then - as_ln_s=ln - else - as_ln_s='cp -pR' - fi -else - as_ln_s='cp -pR' -fi -rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file -rmdir conf$$.dir 2>/dev/null - -if mkdir -p . 2>/dev/null; then - as_mkdir_p='mkdir -p "$as_dir"' -else - test -d ./-p && rmdir ./-p - as_mkdir_p=false -fi - -as_test_x='test -x' -as_executable_p=as_fn_executable_p - -# Sed expression to map a string onto a valid CPP name. -as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" - -# Sed expression to map a string onto a valid variable name. -as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" - -SHELL=${CONFIG_SHELL-/bin/sh} - - -test -n "$DJDIR" || exec 7<&0 &1 - -# Name of the host. -# hostname on some systems (SVR3.2, old GNU/Linux) returns a bogus exit status, -# so uname gets run too. -ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q` - -# -# Initializations. -# -ac_default_prefix=/usr/local -ac_clean_files= -ac_config_libobj_dir=. -LIB@&t@OBJS= -cross_compiling=no -subdirs= -MFLAGS= -MAKEFLAGS= - -# Identity of this package. -PACKAGE_NAME='zookeeper C client' -PACKAGE_TARNAME='zookeeper' -PACKAGE_VERSION='3.4.6' -PACKAGE_STRING='zookeeper C client 3.4.6' -PACKAGE_BUGREPORT='user@zookeeper.apache.org' -PACKAGE_URL='' - -ac_unique_file="src/zookeeper.c" -# Factoring default headers for most tests. -ac_includes_default="\ -#include -#ifdef HAVE_SYS_TYPES_H -# include -#endif -#ifdef HAVE_SYS_STAT_H -# include -#endif -#ifdef STDC_HEADERS -# include -# include -#else -# ifdef HAVE_STDLIB_H -# include -# endif -#endif -#ifdef HAVE_STRING_H -# if !defined STDC_HEADERS && defined HAVE_MEMORY_H -# include -# endif -# include -#endif -#ifdef HAVE_STRINGS_H -# include -#endif -#ifdef HAVE_INTTYPES_H -# include -#endif -#ifdef HAVE_STDINT_H -# include -#endif -#ifdef HAVE_UNISTD_H -# include -#endif" - -ac_subst_vars='am__EXEEXT_FALSE -am__EXEEXT_TRUE -LTLIBOBJS -LIB@&t@OBJS -USEIPV6 -WANT_SYNCAPI_FALSE -WANT_SYNCAPI_TRUE -CXXCPP -CPP -OTOOL64 -OTOOL -LIPO -NMEDIT -DSYMUTIL -MANIFEST_TOOL -RANLIB -ac_ct_AR -AR -DLLTOOL -OBJDUMP -NM -ac_ct_DUMPBIN -DUMPBIN -LD -FGREP -EGREP -GREP -SED -host_os -host_vendor -host_cpu -host -build_os -build_vendor -build_cpu -build -LIBTOOL -LN_S -am__fastdepCXX_FALSE -am__fastdepCXX_TRUE -CXXDEPMODE -ac_ct_CXX -CXXFLAGS -CXX -am__fastdepCC_FALSE -am__fastdepCC_TRUE -CCDEPMODE -am__nodep -AMDEPBACKSLASH -AMDEP_FALSE -AMDEP_TRUE -am__quote -am__include -DEPDIR -OBJEXT -EXEEXT -ac_ct_CC -CPPFLAGS -LDFLAGS -CFLAGS -CC -CPPUNIT_LIBS -CPPUNIT_CFLAGS -CPPUNIT_CONFIG -am__untar -am__tar -AMTAR -am__leading_dot -SET_MAKE -AWK -mkdir_p -MKDIR_P -INSTALL_STRIP_PROGRAM -STRIP -install_sh -MAKEINFO -AUTOHEADER -AUTOMAKE -AUTOCONF -ACLOCAL -VERSION -PACKAGE -CYGPATH_W -am__isrc -INSTALL_DATA -INSTALL_SCRIPT -INSTALL_PROGRAM -DOXYGEN_PAPER_SIZE -DX_COND_latex_FALSE -DX_COND_latex_TRUE -DX_COND_pdf_FALSE -DX_COND_pdf_TRUE -DX_PDFLATEX -DX_FLAG_pdf -DX_COND_ps_FALSE -DX_COND_ps_TRUE -DX_EGREP -DX_DVIPS -DX_MAKEINDEX -DX_LATEX -DX_FLAG_ps -DX_COND_html_FALSE -DX_COND_html_TRUE -DX_FLAG_html -DX_COND_chi_FALSE -DX_COND_chi_TRUE -DX_FLAG_chi -DX_COND_chm_FALSE -DX_COND_chm_TRUE -DX_HHC -DX_FLAG_chm -DX_COND_xml_FALSE -DX_COND_xml_TRUE -DX_FLAG_xml -DX_COND_rtf_FALSE -DX_COND_rtf_TRUE -DX_FLAG_rtf -DX_COND_man_FALSE -DX_COND_man_TRUE -DX_FLAG_man -DX_COND_dot_FALSE -DX_COND_dot_TRUE -DX_DOT -DX_FLAG_dot -DX_COND_doc_FALSE -DX_COND_doc_TRUE -DX_PERL -DX_DOXYGEN -DX_FLAG_doc -DX_ENV -DX_DOCDIR -DX_CONFIG -DX_PROJECT -target_alias -host_alias -build_alias -LIBS -ECHO_T -ECHO_N -ECHO_C -DEFS -mandir -localedir -libdir -psdir -pdfdir -dvidir -htmldir -infodir -docdir -oldincludedir -includedir -localstatedir -sharedstatedir -sysconfdir -datadir -datarootdir -libexecdir -sbindir -bindir -program_transform_name -prefix -exec_prefix -PACKAGE_URL -PACKAGE_BUGREPORT -PACKAGE_STRING -PACKAGE_VERSION -PACKAGE_TARNAME -PACKAGE_NAME -PATH_SEPARATOR -SHELL' -ac_subst_files='' -ac_user_opts=' -enable_option_checking -enable_doxygen_doc -enable_doxygen_dot -enable_doxygen_man -enable_doxygen_rtf -enable_doxygen_xml -enable_doxygen_chm -enable_doxygen_chi -enable_doxygen_html -enable_doxygen_ps -enable_doxygen_pdf -with_cppunit -with_cppunit_prefix -with_cppunit_exec_prefix -enable_dependency_tracking -enable_shared -enable_static -with_pic -enable_fast_install -with_gnu_ld -with_sysroot -enable_libtool_lock -enable_debug -with_syncapi -' - ac_precious_vars='build_alias -host_alias -target_alias -DOXYGEN_PAPER_SIZE -CC -CFLAGS -LDFLAGS -LIBS -CPPFLAGS -CXX -CXXFLAGS -CCC -CPP -CXXCPP' - - -# Initialize some variables set by options. -ac_init_help= -ac_init_version=false -ac_unrecognized_opts= -ac_unrecognized_sep= -# The variables have the same names as the options, with -# dashes changed to underlines. -cache_file=/dev/null -exec_prefix=NONE -no_create= -no_recursion= -prefix=NONE -program_prefix=NONE -program_suffix=NONE -program_transform_name=s,x,x, -silent= -site= -srcdir= -verbose= -x_includes=NONE -x_libraries=NONE - -# Installation directory options. -# These are left unexpanded so users can "make install exec_prefix=/foo" -# and all the variables that are supposed to be based on exec_prefix -# by default will actually change. -# Use braces instead of parens because sh, perl, etc. also accept them. -# (The list follows the same order as the GNU Coding Standards.) -bindir='${exec_prefix}/bin' -sbindir='${exec_prefix}/sbin' -libexecdir='${exec_prefix}/libexec' -datarootdir='${prefix}/share' -datadir='${datarootdir}' -sysconfdir='${prefix}/etc' -sharedstatedir='${prefix}/com' -localstatedir='${prefix}/var' -includedir='${prefix}/include' -oldincludedir='/usr/include' -docdir='${datarootdir}/doc/${PACKAGE_TARNAME}' -infodir='${datarootdir}/info' -htmldir='${docdir}' -dvidir='${docdir}' -pdfdir='${docdir}' -psdir='${docdir}' -libdir='${exec_prefix}/lib' -localedir='${datarootdir}/locale' -mandir='${datarootdir}/man' - -ac_prev= -ac_dashdash= -for ac_option -do - # If the previous option needs an argument, assign it. - if test -n "$ac_prev"; then - eval $ac_prev=\$ac_option - ac_prev= - continue - fi - - case $ac_option in - *=?*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;; - *=) ac_optarg= ;; - *) ac_optarg=yes ;; - esac - - # Accept the important Cygnus configure options, so we can diagnose typos. - - case $ac_dashdash$ac_option in - --) - ac_dashdash=yes ;; - - -bindir | --bindir | --bindi | --bind | --bin | --bi) - ac_prev=bindir ;; - -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*) - bindir=$ac_optarg ;; - - -build | --build | --buil | --bui | --bu) - ac_prev=build_alias ;; - -build=* | --build=* | --buil=* | --bui=* | --bu=*) - build_alias=$ac_optarg ;; - - -cache-file | --cache-file | --cache-fil | --cache-fi \ - | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c) - ac_prev=cache_file ;; - -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \ - | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*) - cache_file=$ac_optarg ;; - - --config-cache | -C) - cache_file=config.cache ;; - - -datadir | --datadir | --datadi | --datad) - ac_prev=datadir ;; - -datadir=* | --datadir=* | --datadi=* | --datad=*) - datadir=$ac_optarg ;; - - -datarootdir | --datarootdir | --datarootdi | --datarootd | --dataroot \ - | --dataroo | --dataro | --datar) - ac_prev=datarootdir ;; - -datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \ - | --dataroot=* | --dataroo=* | --dataro=* | --datar=*) - datarootdir=$ac_optarg ;; - - -disable-* | --disable-*) - ac_useropt=`expr "x$ac_option" : 'x-*disable-\(.*\)'` - # Reject names that are not valid shell variable names. - expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && - as_fn_error $? "invalid feature name: $ac_useropt" - ac_useropt_orig=$ac_useropt - ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` - case $ac_user_opts in - *" -"enable_$ac_useropt" -"*) ;; - *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--disable-$ac_useropt_orig" - ac_unrecognized_sep=', ';; - esac - eval enable_$ac_useropt=no ;; - - -docdir | --docdir | --docdi | --doc | --do) - ac_prev=docdir ;; - -docdir=* | --docdir=* | --docdi=* | --doc=* | --do=*) - docdir=$ac_optarg ;; - - -dvidir | --dvidir | --dvidi | --dvid | --dvi | --dv) - ac_prev=dvidir ;; - -dvidir=* | --dvidir=* | --dvidi=* | --dvid=* | --dvi=* | --dv=*) - dvidir=$ac_optarg ;; - - -enable-* | --enable-*) - ac_useropt=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'` - # Reject names that are not valid shell variable names. - expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && - as_fn_error $? "invalid feature name: $ac_useropt" - ac_useropt_orig=$ac_useropt - ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` - case $ac_user_opts in - *" -"enable_$ac_useropt" -"*) ;; - *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--enable-$ac_useropt_orig" - ac_unrecognized_sep=', ';; - esac - eval enable_$ac_useropt=\$ac_optarg ;; - - -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \ - | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \ - | --exec | --exe | --ex) - ac_prev=exec_prefix ;; - -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \ - | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \ - | --exec=* | --exe=* | --ex=*) - exec_prefix=$ac_optarg ;; - - -gas | --gas | --ga | --g) - # Obsolete; use --with-gas. - with_gas=yes ;; - - -help | --help | --hel | --he | -h) - ac_init_help=long ;; - -help=r* | --help=r* | --hel=r* | --he=r* | -hr*) - ac_init_help=recursive ;; - -help=s* | --help=s* | --hel=s* | --he=s* | -hs*) - ac_init_help=short ;; - - -host | --host | --hos | --ho) - ac_prev=host_alias ;; - -host=* | --host=* | --hos=* | --ho=*) - host_alias=$ac_optarg ;; - - -htmldir | --htmldir | --htmldi | --htmld | --html | --htm | --ht) - ac_prev=htmldir ;; - -htmldir=* | --htmldir=* | --htmldi=* | --htmld=* | --html=* | --htm=* \ - | --ht=*) - htmldir=$ac_optarg ;; - - -includedir | --includedir | --includedi | --included | --include \ - | --includ | --inclu | --incl | --inc) - ac_prev=includedir ;; - -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \ - | --includ=* | --inclu=* | --incl=* | --inc=*) - includedir=$ac_optarg ;; - - -infodir | --infodir | --infodi | --infod | --info | --inf) - ac_prev=infodir ;; - -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*) - infodir=$ac_optarg ;; - - -libdir | --libdir | --libdi | --libd) - ac_prev=libdir ;; - -libdir=* | --libdir=* | --libdi=* | --libd=*) - libdir=$ac_optarg ;; - - -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \ - | --libexe | --libex | --libe) - ac_prev=libexecdir ;; - -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \ - | --libexe=* | --libex=* | --libe=*) - libexecdir=$ac_optarg ;; - - -localedir | --localedir | --localedi | --localed | --locale) - ac_prev=localedir ;; - -localedir=* | --localedir=* | --localedi=* | --localed=* | --locale=*) - localedir=$ac_optarg ;; - - -localstatedir | --localstatedir | --localstatedi | --localstated \ - | --localstate | --localstat | --localsta | --localst | --locals) - ac_prev=localstatedir ;; - -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \ - | --localstate=* | --localstat=* | --localsta=* | --localst=* | --locals=*) - localstatedir=$ac_optarg ;; - - -mandir | --mandir | --mandi | --mand | --man | --ma | --m) - ac_prev=mandir ;; - -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*) - mandir=$ac_optarg ;; - - -nfp | --nfp | --nf) - # Obsolete; use --without-fp. - with_fp=no ;; - - -no-create | --no-create | --no-creat | --no-crea | --no-cre \ - | --no-cr | --no-c | -n) - no_create=yes ;; - - -no-recursion | --no-recursion | --no-recursio | --no-recursi \ - | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) - no_recursion=yes ;; - - -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \ - | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \ - | --oldin | --oldi | --old | --ol | --o) - ac_prev=oldincludedir ;; - -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \ - | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \ - | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*) - oldincludedir=$ac_optarg ;; - - -prefix | --prefix | --prefi | --pref | --pre | --pr | --p) - ac_prev=prefix ;; - -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*) - prefix=$ac_optarg ;; - - -program-prefix | --program-prefix | --program-prefi | --program-pref \ - | --program-pre | --program-pr | --program-p) - ac_prev=program_prefix ;; - -program-prefix=* | --program-prefix=* | --program-prefi=* \ - | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*) - program_prefix=$ac_optarg ;; - - -program-suffix | --program-suffix | --program-suffi | --program-suff \ - | --program-suf | --program-su | --program-s) - ac_prev=program_suffix ;; - -program-suffix=* | --program-suffix=* | --program-suffi=* \ - | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*) - program_suffix=$ac_optarg ;; - - -program-transform-name | --program-transform-name \ - | --program-transform-nam | --program-transform-na \ - | --program-transform-n | --program-transform- \ - | --program-transform | --program-transfor \ - | --program-transfo | --program-transf \ - | --program-trans | --program-tran \ - | --progr-tra | --program-tr | --program-t) - ac_prev=program_transform_name ;; - -program-transform-name=* | --program-transform-name=* \ - | --program-transform-nam=* | --program-transform-na=* \ - | --program-transform-n=* | --program-transform-=* \ - | --program-transform=* | --program-transfor=* \ - | --program-transfo=* | --program-transf=* \ - | --program-trans=* | --program-tran=* \ - | --progr-tra=* | --program-tr=* | --program-t=*) - program_transform_name=$ac_optarg ;; - - -pdfdir | --pdfdir | --pdfdi | --pdfd | --pdf | --pd) - ac_prev=pdfdir ;; - -pdfdir=* | --pdfdir=* | --pdfdi=* | --pdfd=* | --pdf=* | --pd=*) - pdfdir=$ac_optarg ;; - - -psdir | --psdir | --psdi | --psd | --ps) - ac_prev=psdir ;; - -psdir=* | --psdir=* | --psdi=* | --psd=* | --ps=*) - psdir=$ac_optarg ;; - - -q | -quiet | --quiet | --quie | --qui | --qu | --q \ - | -silent | --silent | --silen | --sile | --sil) - silent=yes ;; - - -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb) - ac_prev=sbindir ;; - -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \ - | --sbi=* | --sb=*) - sbindir=$ac_optarg ;; - - -sharedstatedir | --sharedstatedir | --sharedstatedi \ - | --sharedstated | --sharedstate | --sharedstat | --sharedsta \ - | --sharedst | --shareds | --shared | --share | --shar \ - | --sha | --sh) - ac_prev=sharedstatedir ;; - -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \ - | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \ - | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \ - | --sha=* | --sh=*) - sharedstatedir=$ac_optarg ;; - - -site | --site | --sit) - ac_prev=site ;; - -site=* | --site=* | --sit=*) - site=$ac_optarg ;; - - -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) - ac_prev=srcdir ;; - -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) - srcdir=$ac_optarg ;; - - -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \ - | --syscon | --sysco | --sysc | --sys | --sy) - ac_prev=sysconfdir ;; - -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \ - | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*) - sysconfdir=$ac_optarg ;; - - -target | --target | --targe | --targ | --tar | --ta | --t) - ac_prev=target_alias ;; - -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*) - target_alias=$ac_optarg ;; - - -v | -verbose | --verbose | --verbos | --verbo | --verb) - verbose=yes ;; - - -version | --version | --versio | --versi | --vers | -V) - ac_init_version=: ;; - - -with-* | --with-*) - ac_useropt=`expr "x$ac_option" : 'x-*with-\([^=]*\)'` - # Reject names that are not valid shell variable names. - expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && - as_fn_error $? "invalid package name: $ac_useropt" - ac_useropt_orig=$ac_useropt - ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` - case $ac_user_opts in - *" -"with_$ac_useropt" -"*) ;; - *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--with-$ac_useropt_orig" - ac_unrecognized_sep=', ';; - esac - eval with_$ac_useropt=\$ac_optarg ;; - - -without-* | --without-*) - ac_useropt=`expr "x$ac_option" : 'x-*without-\(.*\)'` - # Reject names that are not valid shell variable names. - expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && - as_fn_error $? "invalid package name: $ac_useropt" - ac_useropt_orig=$ac_useropt - ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` - case $ac_user_opts in - *" -"with_$ac_useropt" -"*) ;; - *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--without-$ac_useropt_orig" - ac_unrecognized_sep=', ';; - esac - eval with_$ac_useropt=no ;; - - --x) - # Obsolete; use --with-x. - with_x=yes ;; - - -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \ - | --x-incl | --x-inc | --x-in | --x-i) - ac_prev=x_includes ;; - -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \ - | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*) - x_includes=$ac_optarg ;; - - -x-libraries | --x-libraries | --x-librarie | --x-librari \ - | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l) - ac_prev=x_libraries ;; - -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \ - | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*) - x_libraries=$ac_optarg ;; - - -*) as_fn_error $? "unrecognized option: \`$ac_option' -Try \`$0 --help' for more information" - ;; - - *=*) - ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='` - # Reject names that are not valid shell variable names. - case $ac_envvar in #( - '' | [0-9]* | *[!_$as_cr_alnum]* ) - as_fn_error $? "invalid variable name: \`$ac_envvar'" ;; - esac - eval $ac_envvar=\$ac_optarg - export $ac_envvar ;; - - *) - # FIXME: should be removed in autoconf 3.0. - $as_echo "$as_me: WARNING: you should use --build, --host, --target" >&2 - expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null && - $as_echo "$as_me: WARNING: invalid host type: $ac_option" >&2 - : "${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}" - ;; - - esac -done - -if test -n "$ac_prev"; then - ac_option=--`echo $ac_prev | sed 's/_/-/g'` - as_fn_error $? "missing argument to $ac_option" -fi - -if test -n "$ac_unrecognized_opts"; then - case $enable_option_checking in - no) ;; - fatal) as_fn_error $? "unrecognized options: $ac_unrecognized_opts" ;; - *) $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 ;; - esac -fi - -# Check all directory arguments for consistency. -for ac_var in exec_prefix prefix bindir sbindir libexecdir datarootdir \ - datadir sysconfdir sharedstatedir localstatedir includedir \ - oldincludedir docdir infodir htmldir dvidir pdfdir psdir \ - libdir localedir mandir -do - eval ac_val=\$$ac_var - # Remove trailing slashes. - case $ac_val in - */ ) - ac_val=`expr "X$ac_val" : 'X\(.*[^/]\)' \| "X$ac_val" : 'X\(.*\)'` - eval $ac_var=\$ac_val;; - esac - # Be sure to have absolute directory names. - case $ac_val in - [\\/$]* | ?:[\\/]* ) continue;; - NONE | '' ) case $ac_var in *prefix ) continue;; esac;; - esac - as_fn_error $? "expected an absolute directory name for --$ac_var: $ac_val" -done - -# There might be people who depend on the old broken behavior: `$host' -# used to hold the argument of --host etc. -# FIXME: To remove some day. -build=$build_alias -host=$host_alias -target=$target_alias - -# FIXME: To remove some day. -if test "x$host_alias" != x; then - if test "x$build_alias" = x; then - cross_compiling=maybe - elif test "x$build_alias" != "x$host_alias"; then - cross_compiling=yes - fi -fi - -ac_tool_prefix= -test -n "$host_alias" && ac_tool_prefix=$host_alias- - -test "$silent" = yes && exec 6>/dev/null - - -ac_pwd=`pwd` && test -n "$ac_pwd" && -ac_ls_di=`ls -di .` && -ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` || - as_fn_error $? "working directory cannot be determined" -test "X$ac_ls_di" = "X$ac_pwd_ls_di" || - as_fn_error $? "pwd does not report name of working directory" - - -# Find the source files, if location was not specified. -if test -z "$srcdir"; then - ac_srcdir_defaulted=yes - # Try the directory containing this script, then the parent directory. - ac_confdir=`$as_dirname -- "$as_myself" || -$as_expr X"$as_myself" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ - X"$as_myself" : 'X\(//\)[^/]' \| \ - X"$as_myself" : 'X\(//\)$' \| \ - X"$as_myself" : 'X\(/\)' \| . 2>/dev/null || -$as_echo X"$as_myself" | - sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ - s//\1/ - q - } - /^X\(\/\/\)[^/].*/{ - s//\1/ - q - } - /^X\(\/\/\)$/{ - s//\1/ - q - } - /^X\(\/\).*/{ - s//\1/ - q - } - s/.*/./; q'` - srcdir=$ac_confdir - if test ! -r "$srcdir/$ac_unique_file"; then - srcdir=.. - fi -else - ac_srcdir_defaulted=no -fi -if test ! -r "$srcdir/$ac_unique_file"; then - test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .." - as_fn_error $? "cannot find sources ($ac_unique_file) in $srcdir" -fi -ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work" -ac_abs_confdir=`( - cd "$srcdir" && test -r "./$ac_unique_file" || as_fn_error $? "$ac_msg" - pwd)` -# When building in place, set srcdir=. -if test "$ac_abs_confdir" = "$ac_pwd"; then - srcdir=. -fi -# Remove unnecessary trailing slashes from srcdir. -# Double slashes in file names in object file debugging info -# mess up M-x gdb in Emacs. -case $srcdir in -*/) srcdir=`expr "X$srcdir" : 'X\(.*[^/]\)' \| "X$srcdir" : 'X\(.*\)'`;; -esac -for ac_var in $ac_precious_vars; do - eval ac_env_${ac_var}_set=\${${ac_var}+set} - eval ac_env_${ac_var}_value=\$${ac_var} - eval ac_cv_env_${ac_var}_set=\${${ac_var}+set} - eval ac_cv_env_${ac_var}_value=\$${ac_var} -done - -# -# Report the --help message. -# -if test "$ac_init_help" = "long"; then - # Omit some internal or obsolete options to make the list less imposing. - # This message is too long to be a string in the A/UX 3.1 sh. - cat <<_ACEOF -\`configure' configures zookeeper C client 3.4.6 to adapt to many kinds of systems. - -Usage: $0 [OPTION]... [VAR=VALUE]... - -To assign environment variables (e.g., CC, CFLAGS...), specify them as -VAR=VALUE. See below for descriptions of some of the useful variables. - -Defaults for the options are specified in brackets. - -Configuration: - -h, --help display this help and exit - --help=short display options specific to this package - --help=recursive display the short help of all the included packages - -V, --version display version information and exit - -q, --quiet, --silent do not print \`checking ...' messages - --cache-file=FILE cache test results in FILE [disabled] - -C, --config-cache alias for \`--cache-file=config.cache' - -n, --no-create do not create output files - --srcdir=DIR find the sources in DIR [configure dir or \`..'] - -Installation directories: - --prefix=PREFIX install architecture-independent files in PREFIX - @<:@@S|@ac_default_prefix@:>@ - --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX - @<:@PREFIX@:>@ - -By default, \`make install' will install all the files in -\`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc. You can specify -an installation prefix other than \`$ac_default_prefix' using \`--prefix', -for instance \`--prefix=\$HOME'. - -For better control, use the options below. - -Fine tuning of the installation directories: - --bindir=DIR user executables [EPREFIX/bin] - --sbindir=DIR system admin executables [EPREFIX/sbin] - --libexecdir=DIR program executables [EPREFIX/libexec] - --sysconfdir=DIR read-only single-machine data [PREFIX/etc] - --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com] - --localstatedir=DIR modifiable single-machine data [PREFIX/var] - --libdir=DIR object code libraries [EPREFIX/lib] - --includedir=DIR C header files [PREFIX/include] - --oldincludedir=DIR C header files for non-gcc [/usr/include] - --datarootdir=DIR read-only arch.-independent data root [PREFIX/share] - --datadir=DIR read-only architecture-independent data [DATAROOTDIR] - --infodir=DIR info documentation [DATAROOTDIR/info] - --localedir=DIR locale-dependent data [DATAROOTDIR/locale] - --mandir=DIR man documentation [DATAROOTDIR/man] - --docdir=DIR documentation root @<:@DATAROOTDIR/doc/zookeeper@:>@ - --htmldir=DIR html documentation [DOCDIR] - --dvidir=DIR dvi documentation [DOCDIR] - --pdfdir=DIR pdf documentation [DOCDIR] - --psdir=DIR ps documentation [DOCDIR] -_ACEOF - - cat <<\_ACEOF - -Program names: - --program-prefix=PREFIX prepend PREFIX to installed program names - --program-suffix=SUFFIX append SUFFIX to installed program names - --program-transform-name=PROGRAM run sed PROGRAM on installed program names - -System types: - --build=BUILD configure for building on BUILD [guessed] - --host=HOST cross-compile to build programs to run on HOST [BUILD] -_ACEOF -fi - -if test -n "$ac_init_help"; then - case $ac_init_help in - short | recursive ) echo "Configuration of zookeeper C client 3.4.6:";; - esac - cat <<\_ACEOF - -Optional Features: - --disable-option-checking ignore unrecognized --enable/--with options - --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) - --enable-FEATURE[=ARG] include FEATURE [ARG=yes] - --disable-doxygen-doc don't generate any doxygen documentation - --disable-doxygen-dot don't generate graphics for doxygen documentation - --enable-doxygen-man generate doxygen manual pages - --enable-doxygen-rtf generate doxygen RTF documentation - --enable-doxygen-xml generate doxygen XML documentation - --enable-doxygen-chm generate doxygen compressed HTML help documentation - --enable-doxygen-chi generate doxygen seperate compressed HTML help index - file - --disable-doxygen-html don't generate doxygen plain HTML documentation - --enable-doxygen-ps generate doxygen PostScript documentation - --enable-doxygen-pdf generate doxygen PDF documentation - --disable-dependency-tracking speeds up one-time build - --enable-dependency-tracking do not reject slow dependency extractors - --enable-shared@<:@=PKGS@:>@ build shared libraries @<:@default=yes@:>@ - --enable-static@<:@=PKGS@:>@ build static libraries @<:@default=yes@:>@ - --enable-fast-install@<:@=PKGS@:>@ - optimize for fast installation @<:@default=yes@:>@ - --disable-libtool-lock avoid locking (might break parallel builds) - --enable-debug enable debug build @<:@default=no@:>@ - -Optional Packages: - --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] - --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) - --without-cppunit do not use CPPUNIT - --with-cppunit-prefix=PFX Prefix where CppUnit is installed (optional) - --with-cppunit-exec-prefix=PFX Exec prefix where CppUnit is installed (optional) - --with-pic@<:@=PKGS@:>@ try to use only PIC/non-PIC objects @<:@default=use - both@:>@ - --with-gnu-ld assume the C compiler uses GNU ld @<:@default=no@:>@ - --with-sysroot=DIR Search for dependent libraries within DIR - (or the compiler's sysroot if not specified). - --with-syncapi build with support for SyncAPI @<:@default=yes@:>@ - -Some influential environment variables: - DOXYGEN_PAPER_SIZE - a4wide (default), a4, letter, legal or executive - CC C compiler command - CFLAGS C compiler flags - LDFLAGS linker flags, e.g. -L if you have libraries in a - nonstandard directory - LIBS libraries to pass to the linker, e.g. -l - CPPFLAGS (Objective) C/C++ preprocessor flags, e.g. -I if - you have headers in a nonstandard directory - CXX C++ compiler command - CXXFLAGS C++ compiler flags - CPP C preprocessor - CXXCPP C++ preprocessor - -Use these variables to override the choices made by `configure' or to help -it to find libraries and programs with nonstandard names/locations. - -Report bugs to . -_ACEOF -ac_status=$? -fi - -if test "$ac_init_help" = "recursive"; then - # If there are subdirs, report their specific --help. - for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue - test -d "$ac_dir" || - { cd "$srcdir" && ac_pwd=`pwd` && srcdir=. && test -d "$ac_dir"; } || - continue - ac_builddir=. - -case "$ac_dir" in -.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; -*) - ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` - # A ".." for each directory in $ac_dir_suffix. - ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` - case $ac_top_builddir_sub in - "") ac_top_builddir_sub=. ac_top_build_prefix= ;; - *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; - esac ;; -esac -ac_abs_top_builddir=$ac_pwd -ac_abs_builddir=$ac_pwd$ac_dir_suffix -# for backward compatibility: -ac_top_builddir=$ac_top_build_prefix - -case $srcdir in - .) # We are building in place. - ac_srcdir=. - ac_top_srcdir=$ac_top_builddir_sub - ac_abs_top_srcdir=$ac_pwd ;; - [\\/]* | ?:[\\/]* ) # Absolute name. - ac_srcdir=$srcdir$ac_dir_suffix; - ac_top_srcdir=$srcdir - ac_abs_top_srcdir=$srcdir ;; - *) # Relative name. - ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix - ac_top_srcdir=$ac_top_build_prefix$srcdir - ac_abs_top_srcdir=$ac_pwd/$srcdir ;; -esac -ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix - - cd "$ac_dir" || { ac_status=$?; continue; } - # Check for guested configure. - if test -f "$ac_srcdir/configure.gnu"; then - echo && - $SHELL "$ac_srcdir/configure.gnu" --help=recursive - elif test -f "$ac_srcdir/configure"; then - echo && - $SHELL "$ac_srcdir/configure" --help=recursive - else - $as_echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2 - fi || ac_status=$? - cd "$ac_pwd" || { ac_status=$?; break; } - done -fi - -test -n "$ac_init_help" && exit $ac_status -if $ac_init_version; then - cat <<\_ACEOF -zookeeper C client configure 3.4.6 -generated by GNU Autoconf 2.69 - -Copyright (C) 2012 Free Software Foundation, Inc. -This configure script is free software; the Free Software Foundation -gives unlimited permission to copy, distribute and modify it. -_ACEOF - exit -fi - -## ------------------------ ## -## Autoconf initialization. ## -## ------------------------ ## - -@%:@ ac_fn_c_try_compile LINENO -@%:@ -------------------------- -@%:@ Try to compile conftest.@S|@ac_ext, and return whether this succeeded. -ac_fn_c_try_compile () -{ - as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack - rm -f conftest.$ac_objext - if { { ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 - (eval "$ac_compile") 2>conftest.err - ac_status=$? - if test -s conftest.err; then - grep -v '^ *+' conftest.err >conftest.er1 - cat conftest.er1 >&5 - mv -f conftest.er1 conftest.err - fi - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then : - ac_retval=0 -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_retval=1 -fi - eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno - as_fn_set_status $ac_retval - -} @%:@ ac_fn_c_try_compile - -@%:@ ac_fn_cxx_try_compile LINENO -@%:@ ---------------------------- -@%:@ Try to compile conftest.@S|@ac_ext, and return whether this succeeded. -ac_fn_cxx_try_compile () -{ - as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack - rm -f conftest.$ac_objext - if { { ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 - (eval "$ac_compile") 2>conftest.err - ac_status=$? - if test -s conftest.err; then - grep -v '^ *+' conftest.err >conftest.er1 - cat conftest.er1 >&5 - mv -f conftest.er1 conftest.err - fi - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } && { - test -z "$ac_cxx_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then : - ac_retval=0 -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_retval=1 -fi - eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno - as_fn_set_status $ac_retval - -} @%:@ ac_fn_cxx_try_compile - -@%:@ ac_fn_c_try_link LINENO -@%:@ ----------------------- -@%:@ Try to link conftest.@S|@ac_ext, and return whether this succeeded. -ac_fn_c_try_link () -{ - as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack - rm -f conftest.$ac_objext conftest$ac_exeext - if { { ac_try="$ac_link" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 - (eval "$ac_link") 2>conftest.err - ac_status=$? - if test -s conftest.err; then - grep -v '^ *+' conftest.err >conftest.er1 - cat conftest.er1 >&5 - mv -f conftest.er1 conftest.err - fi - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest$ac_exeext && { - test "$cross_compiling" = yes || - test -x conftest$ac_exeext - }; then : - ac_retval=0 -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_retval=1 -fi - # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information - # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would - # interfere with the next link command; also delete a directory that is - # left behind by Apple's compiler. We do this before executing the actions. - rm -rf conftest.dSYM conftest_ipa8_conftest.oo - eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno - as_fn_set_status $ac_retval - -} @%:@ ac_fn_c_try_link - -@%:@ ac_fn_c_check_header_compile LINENO HEADER VAR INCLUDES -@%:@ ------------------------------------------------------- -@%:@ Tests whether HEADER exists and can be compiled using the include files in -@%:@ INCLUDES, setting the cache variable VAR accordingly. -ac_fn_c_check_header_compile () -{ - as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 -$as_echo_n "checking for $2... " >&6; } -if eval \${$3+:} false; then : - $as_echo_n "(cached) " >&6 -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -$4 -@%:@include <$2> -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - eval "$3=yes" -else - eval "$3=no" -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -fi -eval ac_res=\$$3 - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 -$as_echo "$ac_res" >&6; } - eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno - -} @%:@ ac_fn_c_check_header_compile - -@%:@ ac_fn_c_try_cpp LINENO -@%:@ ---------------------- -@%:@ Try to preprocess conftest.@S|@ac_ext, and return whether this succeeded. -ac_fn_c_try_cpp () -{ - as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack - if { { ac_try="$ac_cpp conftest.$ac_ext" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 - (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err - ac_status=$? - if test -s conftest.err; then - grep -v '^ *+' conftest.err >conftest.er1 - cat conftest.er1 >&5 - mv -f conftest.er1 conftest.err - fi - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } > conftest.i && { - test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || - test ! -s conftest.err - }; then : - ac_retval=0 -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_retval=1 -fi - eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno - as_fn_set_status $ac_retval - -} @%:@ ac_fn_c_try_cpp - -@%:@ ac_fn_c_try_run LINENO -@%:@ ---------------------- -@%:@ Try to link conftest.@S|@ac_ext, and return whether this succeeded. Assumes -@%:@ that executables *can* be run. -ac_fn_c_try_run () -{ - as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack - if { { ac_try="$ac_link" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 - (eval "$ac_link") 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } && { ac_try='./conftest$ac_exeext' - { { case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 - (eval "$ac_try") 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; }; }; then : - ac_retval=0 -else - $as_echo "$as_me: program exited with status $ac_status" >&5 - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_retval=$ac_status -fi - rm -rf conftest.dSYM conftest_ipa8_conftest.oo - eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno - as_fn_set_status $ac_retval - -} @%:@ ac_fn_c_try_run - -@%:@ ac_fn_c_check_func LINENO FUNC VAR -@%:@ ---------------------------------- -@%:@ Tests whether FUNC exists, setting the cache variable VAR accordingly -ac_fn_c_check_func () -{ - as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 -$as_echo_n "checking for $2... " >&6; } -if eval \${$3+:} false; then : - $as_echo_n "(cached) " >&6 -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -/* Define $2 to an innocuous variant, in case declares $2. - For example, HP-UX 11i declares gettimeofday. */ -#define $2 innocuous_$2 - -/* System header to define __stub macros and hopefully few prototypes, - which can conflict with char $2 (); below. - Prefer to if __STDC__ is defined, since - exists even on freestanding compilers. */ - -#ifdef __STDC__ -# include -#else -# include -#endif - -#undef $2 - -/* Override any GCC internal prototype to avoid an error. - Use char because int might match the return type of a GCC - builtin and then its argument prototype would still apply. */ -#ifdef __cplusplus -extern "C" -#endif -char $2 (); -/* The GNU C library defines this for functions which it implements - to always fail with ENOSYS. Some functions are actually named - something starting with __ and the normal name is an alias. */ -#if defined __stub_$2 || defined __stub___$2 -choke me -#endif - -int -main () -{ -return $2 (); - ; - return 0; -} -_ACEOF -if ac_fn_c_try_link "$LINENO"; then : - eval "$3=yes" -else - eval "$3=no" -fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext -fi -eval ac_res=\$$3 - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 -$as_echo "$ac_res" >&6; } - eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno - -} @%:@ ac_fn_c_check_func - -@%:@ ac_fn_cxx_try_cpp LINENO -@%:@ ------------------------ -@%:@ Try to preprocess conftest.@S|@ac_ext, and return whether this succeeded. -ac_fn_cxx_try_cpp () -{ - as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack - if { { ac_try="$ac_cpp conftest.$ac_ext" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 - (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err - ac_status=$? - if test -s conftest.err; then - grep -v '^ *+' conftest.err >conftest.er1 - cat conftest.er1 >&5 - mv -f conftest.er1 conftest.err - fi - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } > conftest.i && { - test -z "$ac_cxx_preproc_warn_flag$ac_cxx_werror_flag" || - test ! -s conftest.err - }; then : - ac_retval=0 -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_retval=1 -fi - eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno - as_fn_set_status $ac_retval - -} @%:@ ac_fn_cxx_try_cpp - -@%:@ ac_fn_cxx_try_link LINENO -@%:@ ------------------------- -@%:@ Try to link conftest.@S|@ac_ext, and return whether this succeeded. -ac_fn_cxx_try_link () -{ - as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack - rm -f conftest.$ac_objext conftest$ac_exeext - if { { ac_try="$ac_link" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 - (eval "$ac_link") 2>conftest.err - ac_status=$? - if test -s conftest.err; then - grep -v '^ *+' conftest.err >conftest.er1 - cat conftest.er1 >&5 - mv -f conftest.er1 conftest.err - fi - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } && { - test -z "$ac_cxx_werror_flag" || - test ! -s conftest.err - } && test -s conftest$ac_exeext && { - test "$cross_compiling" = yes || - test -x conftest$ac_exeext - }; then : - ac_retval=0 -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_retval=1 -fi - # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information - # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would - # interfere with the next link command; also delete a directory that is - # left behind by Apple's compiler. We do this before executing the actions. - rm -rf conftest.dSYM conftest_ipa8_conftest.oo - eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno - as_fn_set_status $ac_retval - -} @%:@ ac_fn_cxx_try_link - -@%:@ ac_fn_c_check_header_mongrel LINENO HEADER VAR INCLUDES -@%:@ ------------------------------------------------------- -@%:@ Tests whether HEADER exists, giving a warning if it cannot be compiled using -@%:@ the include files in INCLUDES and setting the cache variable VAR -@%:@ accordingly. -ac_fn_c_check_header_mongrel () -{ - as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack - if eval \${$3+:} false; then : - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 -$as_echo_n "checking for $2... " >&6; } -if eval \${$3+:} false; then : - $as_echo_n "(cached) " >&6 -fi -eval ac_res=\$$3 - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 -$as_echo "$ac_res" >&6; } -else - # Is the header compilable? -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 usability" >&5 -$as_echo_n "checking $2 usability... " >&6; } -cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -$4 -@%:@include <$2> -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - ac_header_compiler=yes -else - ac_header_compiler=no -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_compiler" >&5 -$as_echo "$ac_header_compiler" >&6; } - -# Is the header present? -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 presence" >&5 -$as_echo_n "checking $2 presence... " >&6; } -cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -@%:@include <$2> -_ACEOF -if ac_fn_c_try_cpp "$LINENO"; then : - ac_header_preproc=yes -else - ac_header_preproc=no -fi -rm -f conftest.err conftest.i conftest.$ac_ext -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_preproc" >&5 -$as_echo "$ac_header_preproc" >&6; } - -# So? What about this header? -case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in #(( - yes:no: ) - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&5 -$as_echo "$as_me: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&2;} - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 -$as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} - ;; - no:yes:* ) - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: present but cannot be compiled" >&5 -$as_echo "$as_me: WARNING: $2: present but cannot be compiled" >&2;} - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: check for missing prerequisite headers?" >&5 -$as_echo "$as_me: WARNING: $2: check for missing prerequisite headers?" >&2;} - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: see the Autoconf documentation" >&5 -$as_echo "$as_me: WARNING: $2: see the Autoconf documentation" >&2;} - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&5 -$as_echo "$as_me: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&2;} - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 -$as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} -( $as_echo "## ---------------------------------------- ## -## Report this to user@zookeeper.apache.org ## -## ---------------------------------------- ##" - ) | sed "s/^/$as_me: WARNING: /" >&2 - ;; -esac - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 -$as_echo_n "checking for $2... " >&6; } -if eval \${$3+:} false; then : - $as_echo_n "(cached) " >&6 -else - eval "$3=\$ac_header_compiler" -fi -eval ac_res=\$$3 - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 -$as_echo "$ac_res" >&6; } -fi - eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno - -} @%:@ ac_fn_c_check_header_mongrel - -@%:@ ac_fn_c_check_type LINENO TYPE VAR INCLUDES -@%:@ ------------------------------------------- -@%:@ Tests whether TYPE exists after having included INCLUDES, setting cache -@%:@ variable VAR accordingly. -ac_fn_c_check_type () -{ - as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 -$as_echo_n "checking for $2... " >&6; } -if eval \${$3+:} false; then : - $as_echo_n "(cached) " >&6 -else - eval "$3=no" - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -$4 -int -main () -{ -if (sizeof ($2)) - return 0; - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -$4 -int -main () -{ -if (sizeof (($2))) - return 0; - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - -else - eval "$3=yes" -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -fi -eval ac_res=\$$3 - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 -$as_echo "$ac_res" >&6; } - eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno - -} @%:@ ac_fn_c_check_type -cat >config.log <<_ACEOF -This file contains any messages produced by compilers while -running configure, to aid debugging if configure makes a mistake. - -It was created by zookeeper C client $as_me 3.4.6, which was -generated by GNU Autoconf 2.69. Invocation command line was - - $ $0 $@ - -_ACEOF -exec 5>>config.log -{ -cat <<_ASUNAME -## --------- ## -## Platform. ## -## --------- ## - -hostname = `(hostname || uname -n) 2>/dev/null | sed 1q` -uname -m = `(uname -m) 2>/dev/null || echo unknown` -uname -r = `(uname -r) 2>/dev/null || echo unknown` -uname -s = `(uname -s) 2>/dev/null || echo unknown` -uname -v = `(uname -v) 2>/dev/null || echo unknown` - -/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown` -/bin/uname -X = `(/bin/uname -X) 2>/dev/null || echo unknown` - -/bin/arch = `(/bin/arch) 2>/dev/null || echo unknown` -/usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null || echo unknown` -/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown` -/usr/bin/hostinfo = `(/usr/bin/hostinfo) 2>/dev/null || echo unknown` -/bin/machine = `(/bin/machine) 2>/dev/null || echo unknown` -/usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null || echo unknown` -/bin/universe = `(/bin/universe) 2>/dev/null || echo unknown` - -_ASUNAME - -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - $as_echo "PATH: $as_dir" - done -IFS=$as_save_IFS - -} >&5 - -cat >&5 <<_ACEOF - - -## ----------- ## -## Core tests. ## -## ----------- ## - -_ACEOF - - -# Keep a trace of the command line. -# Strip out --no-create and --no-recursion so they do not pile up. -# Strip out --silent because we don't want to record it for future runs. -# Also quote any args containing shell meta-characters. -# Make two passes to allow for proper duplicate-argument suppression. -ac_configure_args= -ac_configure_args0= -ac_configure_args1= -ac_must_keep_next=false -for ac_pass in 1 2 -do - for ac_arg - do - case $ac_arg in - -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;; - -q | -quiet | --quiet | --quie | --qui | --qu | --q \ - | -silent | --silent | --silen | --sile | --sil) - continue ;; - *\'*) - ac_arg=`$as_echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; - esac - case $ac_pass in - 1) as_fn_append ac_configure_args0 " '$ac_arg'" ;; - 2) - as_fn_append ac_configure_args1 " '$ac_arg'" - if test $ac_must_keep_next = true; then - ac_must_keep_next=false # Got value, back to normal. - else - case $ac_arg in - *=* | --config-cache | -C | -disable-* | --disable-* \ - | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \ - | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \ - | -with-* | --with-* | -without-* | --without-* | --x) - case "$ac_configure_args0 " in - "$ac_configure_args1"*" '$ac_arg' "* ) continue ;; - esac - ;; - -* ) ac_must_keep_next=true ;; - esac - fi - as_fn_append ac_configure_args " '$ac_arg'" - ;; - esac - done -done -{ ac_configure_args0=; unset ac_configure_args0;} -{ ac_configure_args1=; unset ac_configure_args1;} - -# When interrupted or exit'd, cleanup temporary files, and complete -# config.log. We remove comments because anyway the quotes in there -# would cause problems or look ugly. -# WARNING: Use '\'' to represent an apostrophe within the trap. -# WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug. -trap 'exit_status=$? - # Save into config.log some information that might help in debugging. - { - echo - - $as_echo "## ---------------- ## -## Cache variables. ## -## ---------------- ##" - echo - # The following way of writing the cache mishandles newlines in values, -( - for ac_var in `(set) 2>&1 | sed -n '\''s/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'\''`; do - eval ac_val=\$$ac_var - case $ac_val in #( - *${as_nl}*) - case $ac_var in #( - *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 -$as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; - esac - case $ac_var in #( - _ | IFS | as_nl) ;; #( - BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( - *) { eval $ac_var=; unset $ac_var;} ;; - esac ;; - esac - done - (set) 2>&1 | - case $as_nl`(ac_space='\'' '\''; set) 2>&1` in #( - *${as_nl}ac_space=\ *) - sed -n \ - "s/'\''/'\''\\\\'\'''\''/g; - s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\''\\2'\''/p" - ;; #( - *) - sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" - ;; - esac | - sort -) - echo - - $as_echo "## ----------------- ## -## Output variables. ## -## ----------------- ##" - echo - for ac_var in $ac_subst_vars - do - eval ac_val=\$$ac_var - case $ac_val in - *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; - esac - $as_echo "$ac_var='\''$ac_val'\''" - done | sort - echo - - if test -n "$ac_subst_files"; then - $as_echo "## ------------------- ## -## File substitutions. ## -## ------------------- ##" - echo - for ac_var in $ac_subst_files - do - eval ac_val=\$$ac_var - case $ac_val in - *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; - esac - $as_echo "$ac_var='\''$ac_val'\''" - done | sort - echo - fi - - if test -s confdefs.h; then - $as_echo "## ----------- ## -## confdefs.h. ## -## ----------- ##" - echo - cat confdefs.h - echo - fi - test "$ac_signal" != 0 && - $as_echo "$as_me: caught signal $ac_signal" - $as_echo "$as_me: exit $exit_status" - } >&5 - rm -f core *.core core.conftest.* && - rm -f -r conftest* confdefs* conf$$* $ac_clean_files && - exit $exit_status -' 0 -for ac_signal in 1 2 13 15; do - trap 'ac_signal='$ac_signal'; as_fn_exit 1' $ac_signal -done -ac_signal=0 - -# confdefs.h avoids OS command line length limits that DEFS can exceed. -rm -f -r conftest* confdefs.h - -$as_echo "/* confdefs.h */" > confdefs.h - -# Predefined preprocessor variables. - -cat >>confdefs.h <<_ACEOF -@%:@define PACKAGE_NAME "$PACKAGE_NAME" -_ACEOF - -cat >>confdefs.h <<_ACEOF -@%:@define PACKAGE_TARNAME "$PACKAGE_TARNAME" -_ACEOF - -cat >>confdefs.h <<_ACEOF -@%:@define PACKAGE_VERSION "$PACKAGE_VERSION" -_ACEOF - -cat >>confdefs.h <<_ACEOF -@%:@define PACKAGE_STRING "$PACKAGE_STRING" -_ACEOF - -cat >>confdefs.h <<_ACEOF -@%:@define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT" -_ACEOF - -cat >>confdefs.h <<_ACEOF -@%:@define PACKAGE_URL "$PACKAGE_URL" -_ACEOF - - -# Let the site file select an alternate cache file if it wants to. -# Prefer an explicitly selected file to automatically selected ones. -ac_site_file1=NONE -ac_site_file2=NONE -if test -n "$CONFIG_SITE"; then - # We do not want a PATH search for config.site. - case $CONFIG_SITE in @%:@(( - -*) ac_site_file1=./$CONFIG_SITE;; - */*) ac_site_file1=$CONFIG_SITE;; - *) ac_site_file1=./$CONFIG_SITE;; - esac -elif test "x$prefix" != xNONE; then - ac_site_file1=$prefix/share/config.site - ac_site_file2=$prefix/etc/config.site -else - ac_site_file1=$ac_default_prefix/share/config.site - ac_site_file2=$ac_default_prefix/etc/config.site -fi -for ac_site_file in "$ac_site_file1" "$ac_site_file2" -do - test "x$ac_site_file" = xNONE && continue - if test /dev/null != "$ac_site_file" && test -r "$ac_site_file"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: loading site script $ac_site_file" >&5 -$as_echo "$as_me: loading site script $ac_site_file" >&6;} - sed 's/^/| /' "$ac_site_file" >&5 - . "$ac_site_file" \ - || { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 -$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} -as_fn_error $? "failed to load site script $ac_site_file -See \`config.log' for more details" "$LINENO" 5; } - fi -done - -if test -r "$cache_file"; then - # Some versions of bash will fail to source /dev/null (special files - # actually), so we avoid doing that. DJGPP emulates it as a regular file. - if test /dev/null != "$cache_file" && test -f "$cache_file"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: loading cache $cache_file" >&5 -$as_echo "$as_me: loading cache $cache_file" >&6;} - case $cache_file in - [\\/]* | ?:[\\/]* ) . "$cache_file";; - *) . "./$cache_file";; - esac - fi -else - { $as_echo "$as_me:${as_lineno-$LINENO}: creating cache $cache_file" >&5 -$as_echo "$as_me: creating cache $cache_file" >&6;} - >$cache_file -fi - -# Check that the precious variables saved in the cache have kept the same -# value. -ac_cache_corrupted=false -for ac_var in $ac_precious_vars; do - eval ac_old_set=\$ac_cv_env_${ac_var}_set - eval ac_new_set=\$ac_env_${ac_var}_set - eval ac_old_val=\$ac_cv_env_${ac_var}_value - eval ac_new_val=\$ac_env_${ac_var}_value - case $ac_old_set,$ac_new_set in - set,) - { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5 -$as_echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;} - ac_cache_corrupted=: ;; - ,set) - { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was not set in the previous run" >&5 -$as_echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;} - ac_cache_corrupted=: ;; - ,);; - *) - if test "x$ac_old_val" != "x$ac_new_val"; then - # differences in whitespace do not lead to failure. - ac_old_val_w=`echo x $ac_old_val` - ac_new_val_w=`echo x $ac_new_val` - if test "$ac_old_val_w" != "$ac_new_val_w"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' has changed since the previous run:" >&5 -$as_echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;} - ac_cache_corrupted=: - else - { $as_echo "$as_me:${as_lineno-$LINENO}: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&5 -$as_echo "$as_me: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&2;} - eval $ac_var=\$ac_old_val - fi - { $as_echo "$as_me:${as_lineno-$LINENO}: former value: \`$ac_old_val'" >&5 -$as_echo "$as_me: former value: \`$ac_old_val'" >&2;} - { $as_echo "$as_me:${as_lineno-$LINENO}: current value: \`$ac_new_val'" >&5 -$as_echo "$as_me: current value: \`$ac_new_val'" >&2;} - fi;; - esac - # Pass precious variables to config.status. - if test "$ac_new_set" = set; then - case $ac_new_val in - *\'*) ac_arg=$ac_var=`$as_echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;; - *) ac_arg=$ac_var=$ac_new_val ;; - esac - case " $ac_configure_args " in - *" '$ac_arg' "*) ;; # Avoid dups. Use of quotes ensures accuracy. - *) as_fn_append ac_configure_args " '$ac_arg'" ;; - esac - fi -done -if $ac_cache_corrupted; then - { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 -$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} - { $as_echo "$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build" >&5 -$as_echo "$as_me: error: changes in the environment can compromise the build" >&2;} - as_fn_error $? "run \`make distclean' and/or \`rm $cache_file' and start over" "$LINENO" 5 -fi -## -------------------- ## -## Main body of script. ## -## -------------------- ## - -ac_ext=c -ac_cpp='$CPP $CPPFLAGS' -ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_c_compiler_gnu - - - - -# Save initial CFLAGS and CXXFLAGS values before AC_PROG_CC and AC_PROG_CXX -init_cflags="$CFLAGS" -init_cxxflags="$CXXFLAGS" - -# initialize Doxygen support - - - - - - - - - - -# Files: -DX_PROJECT=zookeeper - -DX_CONFIG=c-doc.Doxyfile - -DX_DOCDIR=docs - - -# Environment variables used inside doxygen.cfg: -DX_ENV="$DX_ENV SRCDIR='$srcdir'" - -DX_ENV="$DX_ENV PROJECT='$DX_PROJECT'" - -DX_ENV="$DX_ENV DOCDIR='$DX_DOCDIR'" - -DX_ENV="$DX_ENV VERSION='$PACKAGE_VERSION'" - - -# Doxygen itself: - - - - @%:@ Check whether --enable-doxygen-doc was given. -if test "${enable_doxygen_doc+set}" = set; then : - enableval=$enable_doxygen_doc; -case "$enableval" in -#( -y|Y|yes|Yes|YES) - DX_FLAG_doc=1 - - -;; #( -n|N|no|No|NO) - DX_FLAG_doc=0 - -;; #( -*) - as_fn_error $? "invalid value '$enableval' given to doxygen-doc" "$LINENO" 5 -;; -esac - -else - -DX_FLAG_doc=1 - - - -fi - -if test "$DX_FLAG_doc" = 1; then - -if test -n "$ac_tool_prefix"; then - # Extract the first word of "${ac_tool_prefix}doxygen", so it can be a program name with args. -set dummy ${ac_tool_prefix}doxygen; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_path_DX_DOXYGEN+:} false; then : - $as_echo_n "(cached) " >&6 -else - case $DX_DOXYGEN in - [\\/]* | ?:[\\/]*) - ac_cv_path_DX_DOXYGEN="$DX_DOXYGEN" # Let the user override the test with a path. - ;; - *) - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_path_DX_DOXYGEN="$as_dir/$ac_word$ac_exec_ext" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - - ;; -esac -fi -DX_DOXYGEN=$ac_cv_path_DX_DOXYGEN -if test -n "$DX_DOXYGEN"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DX_DOXYGEN" >&5 -$as_echo "$DX_DOXYGEN" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - -fi -if test -z "$ac_cv_path_DX_DOXYGEN"; then - ac_pt_DX_DOXYGEN=$DX_DOXYGEN - # Extract the first word of "doxygen", so it can be a program name with args. -set dummy doxygen; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_path_ac_pt_DX_DOXYGEN+:} false; then : - $as_echo_n "(cached) " >&6 -else - case $ac_pt_DX_DOXYGEN in - [\\/]* | ?:[\\/]*) - ac_cv_path_ac_pt_DX_DOXYGEN="$ac_pt_DX_DOXYGEN" # Let the user override the test with a path. - ;; - *) - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_path_ac_pt_DX_DOXYGEN="$as_dir/$ac_word$ac_exec_ext" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - - ;; -esac -fi -ac_pt_DX_DOXYGEN=$ac_cv_path_ac_pt_DX_DOXYGEN -if test -n "$ac_pt_DX_DOXYGEN"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_pt_DX_DOXYGEN" >&5 -$as_echo "$ac_pt_DX_DOXYGEN" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - if test "x$ac_pt_DX_DOXYGEN" = x; then - DX_DOXYGEN="" - else - case $cross_compiling:$ac_tool_warned in -yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} -ac_tool_warned=yes ;; -esac - DX_DOXYGEN=$ac_pt_DX_DOXYGEN - fi -else - DX_DOXYGEN="$ac_cv_path_DX_DOXYGEN" -fi - -if test "$DX_FLAG_$DX_CURRENT_FEATURE$DX_DOXYGEN" = 1; then - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: doxygen not found - will not generate any doxygen documentation" >&5 -$as_echo "$as_me: WARNING: doxygen not found - will not generate any doxygen documentation" >&2;} - DX_FLAG_doc=0 - -fi - - -if test -n "$ac_tool_prefix"; then - # Extract the first word of "${ac_tool_prefix}perl", so it can be a program name with args. -set dummy ${ac_tool_prefix}perl; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_path_DX_PERL+:} false; then : - $as_echo_n "(cached) " >&6 -else - case $DX_PERL in - [\\/]* | ?:[\\/]*) - ac_cv_path_DX_PERL="$DX_PERL" # Let the user override the test with a path. - ;; - *) - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_path_DX_PERL="$as_dir/$ac_word$ac_exec_ext" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - - ;; -esac -fi -DX_PERL=$ac_cv_path_DX_PERL -if test -n "$DX_PERL"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DX_PERL" >&5 -$as_echo "$DX_PERL" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - -fi -if test -z "$ac_cv_path_DX_PERL"; then - ac_pt_DX_PERL=$DX_PERL - # Extract the first word of "perl", so it can be a program name with args. -set dummy perl; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_path_ac_pt_DX_PERL+:} false; then : - $as_echo_n "(cached) " >&6 -else - case $ac_pt_DX_PERL in - [\\/]* | ?:[\\/]*) - ac_cv_path_ac_pt_DX_PERL="$ac_pt_DX_PERL" # Let the user override the test with a path. - ;; - *) - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_path_ac_pt_DX_PERL="$as_dir/$ac_word$ac_exec_ext" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - - ;; -esac -fi -ac_pt_DX_PERL=$ac_cv_path_ac_pt_DX_PERL -if test -n "$ac_pt_DX_PERL"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_pt_DX_PERL" >&5 -$as_echo "$ac_pt_DX_PERL" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - if test "x$ac_pt_DX_PERL" = x; then - DX_PERL="" - else - case $cross_compiling:$ac_tool_warned in -yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} -ac_tool_warned=yes ;; -esac - DX_PERL=$ac_pt_DX_PERL - fi -else - DX_PERL="$ac_cv_path_DX_PERL" -fi - -if test "$DX_FLAG_$DX_CURRENT_FEATURE$DX_PERL" = 1; then - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: perl not found - will not generate any doxygen documentation" >&5 -$as_echo "$as_me: WARNING: perl not found - will not generate any doxygen documentation" >&2;} - DX_FLAG_doc=0 - -fi - - : -fi -if test "$DX_FLAG_doc" = 1; then - if :; then - DX_COND_doc_TRUE= - DX_COND_doc_FALSE='#' -else - DX_COND_doc_TRUE='#' - DX_COND_doc_FALSE= -fi - - DX_ENV="$DX_ENV PERL_PATH='$DX_PERL'" - - : -else - if false; then - DX_COND_doc_TRUE= - DX_COND_doc_FALSE='#' -else - DX_COND_doc_TRUE='#' - DX_COND_doc_FALSE= -fi - - - : -fi - - -# Dot for graphics: - - - - @%:@ Check whether --enable-doxygen-dot was given. -if test "${enable_doxygen_dot+set}" = set; then : - enableval=$enable_doxygen_dot; -case "$enableval" in -#( -y|Y|yes|Yes|YES) - DX_FLAG_dot=1 - - -test "$DX_FLAG_doc" = "1" \ -|| as_fn_error $? "doxygen-dot requires doxygen-dot" "$LINENO" 5 - -;; #( -n|N|no|No|NO) - DX_FLAG_dot=0 - -;; #( -*) - as_fn_error $? "invalid value '$enableval' given to doxygen-dot" "$LINENO" 5 -;; -esac - -else - -DX_FLAG_dot=1 - - -test "$DX_FLAG_doc" = "1" || DX_FLAG_dot=0 - - - -fi - -if test "$DX_FLAG_dot" = 1; then - -if test -n "$ac_tool_prefix"; then - # Extract the first word of "${ac_tool_prefix}dot", so it can be a program name with args. -set dummy ${ac_tool_prefix}dot; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_path_DX_DOT+:} false; then : - $as_echo_n "(cached) " >&6 -else - case $DX_DOT in - [\\/]* | ?:[\\/]*) - ac_cv_path_DX_DOT="$DX_DOT" # Let the user override the test with a path. - ;; - *) - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_path_DX_DOT="$as_dir/$ac_word$ac_exec_ext" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - - ;; -esac -fi -DX_DOT=$ac_cv_path_DX_DOT -if test -n "$DX_DOT"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DX_DOT" >&5 -$as_echo "$DX_DOT" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - -fi -if test -z "$ac_cv_path_DX_DOT"; then - ac_pt_DX_DOT=$DX_DOT - # Extract the first word of "dot", so it can be a program name with args. -set dummy dot; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_path_ac_pt_DX_DOT+:} false; then : - $as_echo_n "(cached) " >&6 -else - case $ac_pt_DX_DOT in - [\\/]* | ?:[\\/]*) - ac_cv_path_ac_pt_DX_DOT="$ac_pt_DX_DOT" # Let the user override the test with a path. - ;; - *) - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_path_ac_pt_DX_DOT="$as_dir/$ac_word$ac_exec_ext" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - - ;; -esac -fi -ac_pt_DX_DOT=$ac_cv_path_ac_pt_DX_DOT -if test -n "$ac_pt_DX_DOT"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_pt_DX_DOT" >&5 -$as_echo "$ac_pt_DX_DOT" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - if test "x$ac_pt_DX_DOT" = x; then - DX_DOT="" - else - case $cross_compiling:$ac_tool_warned in -yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} -ac_tool_warned=yes ;; -esac - DX_DOT=$ac_pt_DX_DOT - fi -else - DX_DOT="$ac_cv_path_DX_DOT" -fi - -if test "$DX_FLAG_$DX_CURRENT_FEATURE$DX_DOT" = 1; then - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: dot not found - will not generate graphics for doxygen documentation" >&5 -$as_echo "$as_me: WARNING: dot not found - will not generate graphics for doxygen documentation" >&2;} - DX_FLAG_dot=0 - -fi - - : -fi -if test "$DX_FLAG_dot" = 1; then - if :; then - DX_COND_dot_TRUE= - DX_COND_dot_FALSE='#' -else - DX_COND_dot_TRUE='#' - DX_COND_dot_FALSE= -fi - - DX_ENV="$DX_ENV HAVE_DOT='YES'" - - DX_ENV="$DX_ENV DOT_PATH='`expr ".$DX_DOT" : '\(\.\)[^/]*$' \| "x$DX_DOT" : 'x\(.*\)/[^/]*$'`'" - - : -else - if false; then - DX_COND_dot_TRUE= - DX_COND_dot_FALSE='#' -else - DX_COND_dot_TRUE='#' - DX_COND_dot_FALSE= -fi - - DX_ENV="$DX_ENV HAVE_DOT='NO'" - - : -fi - - -# Man pages generation: - - - - @%:@ Check whether --enable-doxygen-man was given. -if test "${enable_doxygen_man+set}" = set; then : - enableval=$enable_doxygen_man; -case "$enableval" in -#( -y|Y|yes|Yes|YES) - DX_FLAG_man=1 - - -test "$DX_FLAG_doc" = "1" \ -|| as_fn_error $? "doxygen-man requires doxygen-man" "$LINENO" 5 - -;; #( -n|N|no|No|NO) - DX_FLAG_man=0 - -;; #( -*) - as_fn_error $? "invalid value '$enableval' given to doxygen-man" "$LINENO" 5 -;; -esac - -else - -DX_FLAG_man=0 - - -test "$DX_FLAG_doc" = "1" || DX_FLAG_man=0 - - - -fi - -if test "$DX_FLAG_man" = 1; then - - : -fi -if test "$DX_FLAG_man" = 1; then - if :; then - DX_COND_man_TRUE= - DX_COND_man_FALSE='#' -else - DX_COND_man_TRUE='#' - DX_COND_man_FALSE= -fi - - DX_ENV="$DX_ENV GENERATE_MAN='YES'" - - : -else - if false; then - DX_COND_man_TRUE= - DX_COND_man_FALSE='#' -else - DX_COND_man_TRUE='#' - DX_COND_man_FALSE= -fi - - DX_ENV="$DX_ENV GENERATE_MAN='NO'" - - : -fi - - -# RTF file generation: - - - - @%:@ Check whether --enable-doxygen-rtf was given. -if test "${enable_doxygen_rtf+set}" = set; then : - enableval=$enable_doxygen_rtf; -case "$enableval" in -#( -y|Y|yes|Yes|YES) - DX_FLAG_rtf=1 - - -test "$DX_FLAG_doc" = "1" \ -|| as_fn_error $? "doxygen-rtf requires doxygen-rtf" "$LINENO" 5 - -;; #( -n|N|no|No|NO) - DX_FLAG_rtf=0 - -;; #( -*) - as_fn_error $? "invalid value '$enableval' given to doxygen-rtf" "$LINENO" 5 -;; -esac - -else - -DX_FLAG_rtf=0 - - -test "$DX_FLAG_doc" = "1" || DX_FLAG_rtf=0 - - - -fi - -if test "$DX_FLAG_rtf" = 1; then - - : -fi -if test "$DX_FLAG_rtf" = 1; then - if :; then - DX_COND_rtf_TRUE= - DX_COND_rtf_FALSE='#' -else - DX_COND_rtf_TRUE='#' - DX_COND_rtf_FALSE= -fi - - DX_ENV="$DX_ENV GENERATE_RTF='YES'" - - : -else - if false; then - DX_COND_rtf_TRUE= - DX_COND_rtf_FALSE='#' -else - DX_COND_rtf_TRUE='#' - DX_COND_rtf_FALSE= -fi - - DX_ENV="$DX_ENV GENERATE_RTF='NO'" - - : -fi - - -# XML file generation: - - - - @%:@ Check whether --enable-doxygen-xml was given. -if test "${enable_doxygen_xml+set}" = set; then : - enableval=$enable_doxygen_xml; -case "$enableval" in -#( -y|Y|yes|Yes|YES) - DX_FLAG_xml=1 - - -test "$DX_FLAG_doc" = "1" \ -|| as_fn_error $? "doxygen-xml requires doxygen-xml" "$LINENO" 5 - -;; #( -n|N|no|No|NO) - DX_FLAG_xml=0 - -;; #( -*) - as_fn_error $? "invalid value '$enableval' given to doxygen-xml" "$LINENO" 5 -;; -esac - -else - -DX_FLAG_xml=0 - - -test "$DX_FLAG_doc" = "1" || DX_FLAG_xml=0 - - - -fi - -if test "$DX_FLAG_xml" = 1; then - - : -fi -if test "$DX_FLAG_xml" = 1; then - if :; then - DX_COND_xml_TRUE= - DX_COND_xml_FALSE='#' -else - DX_COND_xml_TRUE='#' - DX_COND_xml_FALSE= -fi - - DX_ENV="$DX_ENV GENERATE_XML='YES'" - - : -else - if false; then - DX_COND_xml_TRUE= - DX_COND_xml_FALSE='#' -else - DX_COND_xml_TRUE='#' - DX_COND_xml_FALSE= -fi - - DX_ENV="$DX_ENV GENERATE_XML='NO'" - - : -fi - - -# (Compressed) HTML help generation: - - - - @%:@ Check whether --enable-doxygen-chm was given. -if test "${enable_doxygen_chm+set}" = set; then : - enableval=$enable_doxygen_chm; -case "$enableval" in -#( -y|Y|yes|Yes|YES) - DX_FLAG_chm=1 - - -test "$DX_FLAG_doc" = "1" \ -|| as_fn_error $? "doxygen-chm requires doxygen-chm" "$LINENO" 5 - -;; #( -n|N|no|No|NO) - DX_FLAG_chm=0 - -;; #( -*) - as_fn_error $? "invalid value '$enableval' given to doxygen-chm" "$LINENO" 5 -;; -esac - -else - -DX_FLAG_chm=0 - - -test "$DX_FLAG_doc" = "1" || DX_FLAG_chm=0 - - - -fi - -if test "$DX_FLAG_chm" = 1; then - -if test -n "$ac_tool_prefix"; then - # Extract the first word of "${ac_tool_prefix}hhc", so it can be a program name with args. -set dummy ${ac_tool_prefix}hhc; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_path_DX_HHC+:} false; then : - $as_echo_n "(cached) " >&6 -else - case $DX_HHC in - [\\/]* | ?:[\\/]*) - ac_cv_path_DX_HHC="$DX_HHC" # Let the user override the test with a path. - ;; - *) - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_path_DX_HHC="$as_dir/$ac_word$ac_exec_ext" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - - ;; -esac -fi -DX_HHC=$ac_cv_path_DX_HHC -if test -n "$DX_HHC"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DX_HHC" >&5 -$as_echo "$DX_HHC" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - -fi -if test -z "$ac_cv_path_DX_HHC"; then - ac_pt_DX_HHC=$DX_HHC - # Extract the first word of "hhc", so it can be a program name with args. -set dummy hhc; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_path_ac_pt_DX_HHC+:} false; then : - $as_echo_n "(cached) " >&6 -else - case $ac_pt_DX_HHC in - [\\/]* | ?:[\\/]*) - ac_cv_path_ac_pt_DX_HHC="$ac_pt_DX_HHC" # Let the user override the test with a path. - ;; - *) - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_path_ac_pt_DX_HHC="$as_dir/$ac_word$ac_exec_ext" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - - ;; -esac -fi -ac_pt_DX_HHC=$ac_cv_path_ac_pt_DX_HHC -if test -n "$ac_pt_DX_HHC"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_pt_DX_HHC" >&5 -$as_echo "$ac_pt_DX_HHC" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - if test "x$ac_pt_DX_HHC" = x; then - DX_HHC="" - else - case $cross_compiling:$ac_tool_warned in -yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} -ac_tool_warned=yes ;; -esac - DX_HHC=$ac_pt_DX_HHC - fi -else - DX_HHC="$ac_cv_path_DX_HHC" -fi - -if test "$DX_FLAG_$DX_CURRENT_FEATURE$DX_HHC" = 1; then - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: hhc not found - will not generate doxygen compressed HTML help documentation" >&5 -$as_echo "$as_me: WARNING: hhc not found - will not generate doxygen compressed HTML help documentation" >&2;} - DX_FLAG_chm=0 - -fi - - : -fi -if test "$DX_FLAG_chm" = 1; then - if :; then - DX_COND_chm_TRUE= - DX_COND_chm_FALSE='#' -else - DX_COND_chm_TRUE='#' - DX_COND_chm_FALSE= -fi - - DX_ENV="$DX_ENV HHC_PATH='$DX_HHC'" - - DX_ENV="$DX_ENV GENERATE_HTML='YES'" - - DX_ENV="$DX_ENV GENERATE_HTMLHELP='YES'" - - : -else - if false; then - DX_COND_chm_TRUE= - DX_COND_chm_FALSE='#' -else - DX_COND_chm_TRUE='#' - DX_COND_chm_FALSE= -fi - - DX_ENV="$DX_ENV GENERATE_HTMLHELP='NO'" - - : -fi - - -# Seperate CHI file generation. - - - - @%:@ Check whether --enable-doxygen-chi was given. -if test "${enable_doxygen_chi+set}" = set; then : - enableval=$enable_doxygen_chi; -case "$enableval" in -#( -y|Y|yes|Yes|YES) - DX_FLAG_chi=1 - - -test "$DX_FLAG_chm" = "1" \ -|| as_fn_error $? "doxygen-chi requires doxygen-chi" "$LINENO" 5 - -;; #( -n|N|no|No|NO) - DX_FLAG_chi=0 - -;; #( -*) - as_fn_error $? "invalid value '$enableval' given to doxygen-chi" "$LINENO" 5 -;; -esac - -else - -DX_FLAG_chi=0 - - -test "$DX_FLAG_chm" = "1" || DX_FLAG_chi=0 - - - -fi - -if test "$DX_FLAG_chi" = 1; then - - : -fi -if test "$DX_FLAG_chi" = 1; then - if :; then - DX_COND_chi_TRUE= - DX_COND_chi_FALSE='#' -else - DX_COND_chi_TRUE='#' - DX_COND_chi_FALSE= -fi - - DX_ENV="$DX_ENV GENERATE_CHI='YES'" - - : -else - if false; then - DX_COND_chi_TRUE= - DX_COND_chi_FALSE='#' -else - DX_COND_chi_TRUE='#' - DX_COND_chi_FALSE= -fi - - DX_ENV="$DX_ENV GENERATE_CHI='NO'" - - : -fi - - -# Plain HTML pages generation: - - - - @%:@ Check whether --enable-doxygen-html was given. -if test "${enable_doxygen_html+set}" = set; then : - enableval=$enable_doxygen_html; -case "$enableval" in -#( -y|Y|yes|Yes|YES) - DX_FLAG_html=1 - - -test "$DX_FLAG_doc" = "1" \ -|| as_fn_error $? "doxygen-html requires doxygen-html" "$LINENO" 5 - -test "$DX_FLAG_chm" = "0" \ -|| as_fn_error $? "doxygen-html contradicts doxygen-html" "$LINENO" 5 - -;; #( -n|N|no|No|NO) - DX_FLAG_html=0 - -;; #( -*) - as_fn_error $? "invalid value '$enableval' given to doxygen-html" "$LINENO" 5 -;; -esac - -else - -DX_FLAG_html=1 - - -test "$DX_FLAG_doc" = "1" || DX_FLAG_html=0 - - -test "$DX_FLAG_chm" = "0" || DX_FLAG_html=0 - - - -fi - -if test "$DX_FLAG_html" = 1; then - - : -fi -if test "$DX_FLAG_html" = 1; then - if :; then - DX_COND_html_TRUE= - DX_COND_html_FALSE='#' -else - DX_COND_html_TRUE='#' - DX_COND_html_FALSE= -fi - - DX_ENV="$DX_ENV GENERATE_HTML='YES'" - - : -else - if false; then - DX_COND_html_TRUE= - DX_COND_html_FALSE='#' -else - DX_COND_html_TRUE='#' - DX_COND_html_FALSE= -fi - - test "$DX_FLAG_chm" = 1 || DX_ENV="$DX_ENV GENERATE_HTML='NO'" - - : -fi - - -# PostScript file generation: - - - - @%:@ Check whether --enable-doxygen-ps was given. -if test "${enable_doxygen_ps+set}" = set; then : - enableval=$enable_doxygen_ps; -case "$enableval" in -#( -y|Y|yes|Yes|YES) - DX_FLAG_ps=1 - - -test "$DX_FLAG_doc" = "1" \ -|| as_fn_error $? "doxygen-ps requires doxygen-ps" "$LINENO" 5 - -;; #( -n|N|no|No|NO) - DX_FLAG_ps=0 - -;; #( -*) - as_fn_error $? "invalid value '$enableval' given to doxygen-ps" "$LINENO" 5 -;; -esac - -else - -DX_FLAG_ps=0 - - -test "$DX_FLAG_doc" = "1" || DX_FLAG_ps=0 - - - -fi - -if test "$DX_FLAG_ps" = 1; then - -if test -n "$ac_tool_prefix"; then - # Extract the first word of "${ac_tool_prefix}latex", so it can be a program name with args. -set dummy ${ac_tool_prefix}latex; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_path_DX_LATEX+:} false; then : - $as_echo_n "(cached) " >&6 -else - case $DX_LATEX in - [\\/]* | ?:[\\/]*) - ac_cv_path_DX_LATEX="$DX_LATEX" # Let the user override the test with a path. - ;; - *) - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_path_DX_LATEX="$as_dir/$ac_word$ac_exec_ext" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - - ;; -esac -fi -DX_LATEX=$ac_cv_path_DX_LATEX -if test -n "$DX_LATEX"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DX_LATEX" >&5 -$as_echo "$DX_LATEX" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - -fi -if test -z "$ac_cv_path_DX_LATEX"; then - ac_pt_DX_LATEX=$DX_LATEX - # Extract the first word of "latex", so it can be a program name with args. -set dummy latex; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_path_ac_pt_DX_LATEX+:} false; then : - $as_echo_n "(cached) " >&6 -else - case $ac_pt_DX_LATEX in - [\\/]* | ?:[\\/]*) - ac_cv_path_ac_pt_DX_LATEX="$ac_pt_DX_LATEX" # Let the user override the test with a path. - ;; - *) - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_path_ac_pt_DX_LATEX="$as_dir/$ac_word$ac_exec_ext" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - - ;; -esac -fi -ac_pt_DX_LATEX=$ac_cv_path_ac_pt_DX_LATEX -if test -n "$ac_pt_DX_LATEX"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_pt_DX_LATEX" >&5 -$as_echo "$ac_pt_DX_LATEX" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - if test "x$ac_pt_DX_LATEX" = x; then - DX_LATEX="" - else - case $cross_compiling:$ac_tool_warned in -yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} -ac_tool_warned=yes ;; -esac - DX_LATEX=$ac_pt_DX_LATEX - fi -else - DX_LATEX="$ac_cv_path_DX_LATEX" -fi - -if test "$DX_FLAG_$DX_CURRENT_FEATURE$DX_LATEX" = 1; then - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: latex not found - will not generate doxygen PostScript documentation" >&5 -$as_echo "$as_me: WARNING: latex not found - will not generate doxygen PostScript documentation" >&2;} - DX_FLAG_ps=0 - -fi - - -if test -n "$ac_tool_prefix"; then - # Extract the first word of "${ac_tool_prefix}makeindex", so it can be a program name with args. -set dummy ${ac_tool_prefix}makeindex; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_path_DX_MAKEINDEX+:} false; then : - $as_echo_n "(cached) " >&6 -else - case $DX_MAKEINDEX in - [\\/]* | ?:[\\/]*) - ac_cv_path_DX_MAKEINDEX="$DX_MAKEINDEX" # Let the user override the test with a path. - ;; - *) - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_path_DX_MAKEINDEX="$as_dir/$ac_word$ac_exec_ext" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - - ;; -esac -fi -DX_MAKEINDEX=$ac_cv_path_DX_MAKEINDEX -if test -n "$DX_MAKEINDEX"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DX_MAKEINDEX" >&5 -$as_echo "$DX_MAKEINDEX" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - -fi -if test -z "$ac_cv_path_DX_MAKEINDEX"; then - ac_pt_DX_MAKEINDEX=$DX_MAKEINDEX - # Extract the first word of "makeindex", so it can be a program name with args. -set dummy makeindex; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_path_ac_pt_DX_MAKEINDEX+:} false; then : - $as_echo_n "(cached) " >&6 -else - case $ac_pt_DX_MAKEINDEX in - [\\/]* | ?:[\\/]*) - ac_cv_path_ac_pt_DX_MAKEINDEX="$ac_pt_DX_MAKEINDEX" # Let the user override the test with a path. - ;; - *) - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_path_ac_pt_DX_MAKEINDEX="$as_dir/$ac_word$ac_exec_ext" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - - ;; -esac -fi -ac_pt_DX_MAKEINDEX=$ac_cv_path_ac_pt_DX_MAKEINDEX -if test -n "$ac_pt_DX_MAKEINDEX"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_pt_DX_MAKEINDEX" >&5 -$as_echo "$ac_pt_DX_MAKEINDEX" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - if test "x$ac_pt_DX_MAKEINDEX" = x; then - DX_MAKEINDEX="" - else - case $cross_compiling:$ac_tool_warned in -yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} -ac_tool_warned=yes ;; -esac - DX_MAKEINDEX=$ac_pt_DX_MAKEINDEX - fi -else - DX_MAKEINDEX="$ac_cv_path_DX_MAKEINDEX" -fi - -if test "$DX_FLAG_$DX_CURRENT_FEATURE$DX_MAKEINDEX" = 1; then - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: makeindex not found - will not generate doxygen PostScript documentation" >&5 -$as_echo "$as_me: WARNING: makeindex not found - will not generate doxygen PostScript documentation" >&2;} - DX_FLAG_ps=0 - -fi - - -if test -n "$ac_tool_prefix"; then - # Extract the first word of "${ac_tool_prefix}dvips", so it can be a program name with args. -set dummy ${ac_tool_prefix}dvips; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_path_DX_DVIPS+:} false; then : - $as_echo_n "(cached) " >&6 -else - case $DX_DVIPS in - [\\/]* | ?:[\\/]*) - ac_cv_path_DX_DVIPS="$DX_DVIPS" # Let the user override the test with a path. - ;; - *) - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_path_DX_DVIPS="$as_dir/$ac_word$ac_exec_ext" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - - ;; -esac -fi -DX_DVIPS=$ac_cv_path_DX_DVIPS -if test -n "$DX_DVIPS"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DX_DVIPS" >&5 -$as_echo "$DX_DVIPS" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - -fi -if test -z "$ac_cv_path_DX_DVIPS"; then - ac_pt_DX_DVIPS=$DX_DVIPS - # Extract the first word of "dvips", so it can be a program name with args. -set dummy dvips; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_path_ac_pt_DX_DVIPS+:} false; then : - $as_echo_n "(cached) " >&6 -else - case $ac_pt_DX_DVIPS in - [\\/]* | ?:[\\/]*) - ac_cv_path_ac_pt_DX_DVIPS="$ac_pt_DX_DVIPS" # Let the user override the test with a path. - ;; - *) - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_path_ac_pt_DX_DVIPS="$as_dir/$ac_word$ac_exec_ext" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - - ;; -esac -fi -ac_pt_DX_DVIPS=$ac_cv_path_ac_pt_DX_DVIPS -if test -n "$ac_pt_DX_DVIPS"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_pt_DX_DVIPS" >&5 -$as_echo "$ac_pt_DX_DVIPS" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - if test "x$ac_pt_DX_DVIPS" = x; then - DX_DVIPS="" - else - case $cross_compiling:$ac_tool_warned in -yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} -ac_tool_warned=yes ;; -esac - DX_DVIPS=$ac_pt_DX_DVIPS - fi -else - DX_DVIPS="$ac_cv_path_DX_DVIPS" -fi - -if test "$DX_FLAG_$DX_CURRENT_FEATURE$DX_DVIPS" = 1; then - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: dvips not found - will not generate doxygen PostScript documentation" >&5 -$as_echo "$as_me: WARNING: dvips not found - will not generate doxygen PostScript documentation" >&2;} - DX_FLAG_ps=0 - -fi - - -if test -n "$ac_tool_prefix"; then - # Extract the first word of "${ac_tool_prefix}egrep", so it can be a program name with args. -set dummy ${ac_tool_prefix}egrep; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_path_DX_EGREP+:} false; then : - $as_echo_n "(cached) " >&6 -else - case $DX_EGREP in - [\\/]* | ?:[\\/]*) - ac_cv_path_DX_EGREP="$DX_EGREP" # Let the user override the test with a path. - ;; - *) - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_path_DX_EGREP="$as_dir/$ac_word$ac_exec_ext" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - - ;; -esac -fi -DX_EGREP=$ac_cv_path_DX_EGREP -if test -n "$DX_EGREP"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DX_EGREP" >&5 -$as_echo "$DX_EGREP" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - -fi -if test -z "$ac_cv_path_DX_EGREP"; then - ac_pt_DX_EGREP=$DX_EGREP - # Extract the first word of "egrep", so it can be a program name with args. -set dummy egrep; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_path_ac_pt_DX_EGREP+:} false; then : - $as_echo_n "(cached) " >&6 -else - case $ac_pt_DX_EGREP in - [\\/]* | ?:[\\/]*) - ac_cv_path_ac_pt_DX_EGREP="$ac_pt_DX_EGREP" # Let the user override the test with a path. - ;; - *) - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_path_ac_pt_DX_EGREP="$as_dir/$ac_word$ac_exec_ext" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - - ;; -esac -fi -ac_pt_DX_EGREP=$ac_cv_path_ac_pt_DX_EGREP -if test -n "$ac_pt_DX_EGREP"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_pt_DX_EGREP" >&5 -$as_echo "$ac_pt_DX_EGREP" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - if test "x$ac_pt_DX_EGREP" = x; then - DX_EGREP="" - else - case $cross_compiling:$ac_tool_warned in -yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} -ac_tool_warned=yes ;; -esac - DX_EGREP=$ac_pt_DX_EGREP - fi -else - DX_EGREP="$ac_cv_path_DX_EGREP" -fi - -if test "$DX_FLAG_$DX_CURRENT_FEATURE$DX_EGREP" = 1; then - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: egrep not found - will not generate doxygen PostScript documentation" >&5 -$as_echo "$as_me: WARNING: egrep not found - will not generate doxygen PostScript documentation" >&2;} - DX_FLAG_ps=0 - -fi - - : -fi -if test "$DX_FLAG_ps" = 1; then - if :; then - DX_COND_ps_TRUE= - DX_COND_ps_FALSE='#' -else - DX_COND_ps_TRUE='#' - DX_COND_ps_FALSE= -fi - - - : -else - if false; then - DX_COND_ps_TRUE= - DX_COND_ps_FALSE='#' -else - DX_COND_ps_TRUE='#' - DX_COND_ps_FALSE= -fi - - - : -fi - - -# PDF file generation: - - - - @%:@ Check whether --enable-doxygen-pdf was given. -if test "${enable_doxygen_pdf+set}" = set; then : - enableval=$enable_doxygen_pdf; -case "$enableval" in -#( -y|Y|yes|Yes|YES) - DX_FLAG_pdf=1 - - -test "$DX_FLAG_doc" = "1" \ -|| as_fn_error $? "doxygen-pdf requires doxygen-pdf" "$LINENO" 5 - -;; #( -n|N|no|No|NO) - DX_FLAG_pdf=0 - -;; #( -*) - as_fn_error $? "invalid value '$enableval' given to doxygen-pdf" "$LINENO" 5 -;; -esac - -else - -DX_FLAG_pdf=0 - - -test "$DX_FLAG_doc" = "1" || DX_FLAG_pdf=0 - - - -fi - -if test "$DX_FLAG_pdf" = 1; then - -if test -n "$ac_tool_prefix"; then - # Extract the first word of "${ac_tool_prefix}pdflatex", so it can be a program name with args. -set dummy ${ac_tool_prefix}pdflatex; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_path_DX_PDFLATEX+:} false; then : - $as_echo_n "(cached) " >&6 -else - case $DX_PDFLATEX in - [\\/]* | ?:[\\/]*) - ac_cv_path_DX_PDFLATEX="$DX_PDFLATEX" # Let the user override the test with a path. - ;; - *) - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_path_DX_PDFLATEX="$as_dir/$ac_word$ac_exec_ext" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - - ;; -esac -fi -DX_PDFLATEX=$ac_cv_path_DX_PDFLATEX -if test -n "$DX_PDFLATEX"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DX_PDFLATEX" >&5 -$as_echo "$DX_PDFLATEX" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - -fi -if test -z "$ac_cv_path_DX_PDFLATEX"; then - ac_pt_DX_PDFLATEX=$DX_PDFLATEX - # Extract the first word of "pdflatex", so it can be a program name with args. -set dummy pdflatex; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_path_ac_pt_DX_PDFLATEX+:} false; then : - $as_echo_n "(cached) " >&6 -else - case $ac_pt_DX_PDFLATEX in - [\\/]* | ?:[\\/]*) - ac_cv_path_ac_pt_DX_PDFLATEX="$ac_pt_DX_PDFLATEX" # Let the user override the test with a path. - ;; - *) - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_path_ac_pt_DX_PDFLATEX="$as_dir/$ac_word$ac_exec_ext" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - - ;; -esac -fi -ac_pt_DX_PDFLATEX=$ac_cv_path_ac_pt_DX_PDFLATEX -if test -n "$ac_pt_DX_PDFLATEX"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_pt_DX_PDFLATEX" >&5 -$as_echo "$ac_pt_DX_PDFLATEX" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - if test "x$ac_pt_DX_PDFLATEX" = x; then - DX_PDFLATEX="" - else - case $cross_compiling:$ac_tool_warned in -yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} -ac_tool_warned=yes ;; -esac - DX_PDFLATEX=$ac_pt_DX_PDFLATEX - fi -else - DX_PDFLATEX="$ac_cv_path_DX_PDFLATEX" -fi - -if test "$DX_FLAG_$DX_CURRENT_FEATURE$DX_PDFLATEX" = 1; then - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: pdflatex not found - will not generate doxygen PDF documentation" >&5 -$as_echo "$as_me: WARNING: pdflatex not found - will not generate doxygen PDF documentation" >&2;} - DX_FLAG_pdf=0 - -fi - - -if test -n "$ac_tool_prefix"; then - # Extract the first word of "${ac_tool_prefix}makeindex", so it can be a program name with args. -set dummy ${ac_tool_prefix}makeindex; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_path_DX_MAKEINDEX+:} false; then : - $as_echo_n "(cached) " >&6 -else - case $DX_MAKEINDEX in - [\\/]* | ?:[\\/]*) - ac_cv_path_DX_MAKEINDEX="$DX_MAKEINDEX" # Let the user override the test with a path. - ;; - *) - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_path_DX_MAKEINDEX="$as_dir/$ac_word$ac_exec_ext" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - - ;; -esac -fi -DX_MAKEINDEX=$ac_cv_path_DX_MAKEINDEX -if test -n "$DX_MAKEINDEX"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DX_MAKEINDEX" >&5 -$as_echo "$DX_MAKEINDEX" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - -fi -if test -z "$ac_cv_path_DX_MAKEINDEX"; then - ac_pt_DX_MAKEINDEX=$DX_MAKEINDEX - # Extract the first word of "makeindex", so it can be a program name with args. -set dummy makeindex; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_path_ac_pt_DX_MAKEINDEX+:} false; then : - $as_echo_n "(cached) " >&6 -else - case $ac_pt_DX_MAKEINDEX in - [\\/]* | ?:[\\/]*) - ac_cv_path_ac_pt_DX_MAKEINDEX="$ac_pt_DX_MAKEINDEX" # Let the user override the test with a path. - ;; - *) - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_path_ac_pt_DX_MAKEINDEX="$as_dir/$ac_word$ac_exec_ext" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - - ;; -esac -fi -ac_pt_DX_MAKEINDEX=$ac_cv_path_ac_pt_DX_MAKEINDEX -if test -n "$ac_pt_DX_MAKEINDEX"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_pt_DX_MAKEINDEX" >&5 -$as_echo "$ac_pt_DX_MAKEINDEX" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - if test "x$ac_pt_DX_MAKEINDEX" = x; then - DX_MAKEINDEX="" - else - case $cross_compiling:$ac_tool_warned in -yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} -ac_tool_warned=yes ;; -esac - DX_MAKEINDEX=$ac_pt_DX_MAKEINDEX - fi -else - DX_MAKEINDEX="$ac_cv_path_DX_MAKEINDEX" -fi - -if test "$DX_FLAG_$DX_CURRENT_FEATURE$DX_MAKEINDEX" = 1; then - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: makeindex not found - will not generate doxygen PDF documentation" >&5 -$as_echo "$as_me: WARNING: makeindex not found - will not generate doxygen PDF documentation" >&2;} - DX_FLAG_pdf=0 - -fi - - -if test -n "$ac_tool_prefix"; then - # Extract the first word of "${ac_tool_prefix}egrep", so it can be a program name with args. -set dummy ${ac_tool_prefix}egrep; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_path_DX_EGREP+:} false; then : - $as_echo_n "(cached) " >&6 -else - case $DX_EGREP in - [\\/]* | ?:[\\/]*) - ac_cv_path_DX_EGREP="$DX_EGREP" # Let the user override the test with a path. - ;; - *) - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_path_DX_EGREP="$as_dir/$ac_word$ac_exec_ext" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - - ;; -esac -fi -DX_EGREP=$ac_cv_path_DX_EGREP -if test -n "$DX_EGREP"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DX_EGREP" >&5 -$as_echo "$DX_EGREP" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - -fi -if test -z "$ac_cv_path_DX_EGREP"; then - ac_pt_DX_EGREP=$DX_EGREP - # Extract the first word of "egrep", so it can be a program name with args. -set dummy egrep; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_path_ac_pt_DX_EGREP+:} false; then : - $as_echo_n "(cached) " >&6 -else - case $ac_pt_DX_EGREP in - [\\/]* | ?:[\\/]*) - ac_cv_path_ac_pt_DX_EGREP="$ac_pt_DX_EGREP" # Let the user override the test with a path. - ;; - *) - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_path_ac_pt_DX_EGREP="$as_dir/$ac_word$ac_exec_ext" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - - ;; -esac -fi -ac_pt_DX_EGREP=$ac_cv_path_ac_pt_DX_EGREP -if test -n "$ac_pt_DX_EGREP"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_pt_DX_EGREP" >&5 -$as_echo "$ac_pt_DX_EGREP" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - if test "x$ac_pt_DX_EGREP" = x; then - DX_EGREP="" - else - case $cross_compiling:$ac_tool_warned in -yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} -ac_tool_warned=yes ;; -esac - DX_EGREP=$ac_pt_DX_EGREP - fi -else - DX_EGREP="$ac_cv_path_DX_EGREP" -fi - -if test "$DX_FLAG_$DX_CURRENT_FEATURE$DX_EGREP" = 1; then - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: egrep not found - will not generate doxygen PDF documentation" >&5 -$as_echo "$as_me: WARNING: egrep not found - will not generate doxygen PDF documentation" >&2;} - DX_FLAG_pdf=0 - -fi - - : -fi -if test "$DX_FLAG_pdf" = 1; then - if :; then - DX_COND_pdf_TRUE= - DX_COND_pdf_FALSE='#' -else - DX_COND_pdf_TRUE='#' - DX_COND_pdf_FALSE= -fi - - - : -else - if false; then - DX_COND_pdf_TRUE= - DX_COND_pdf_FALSE='#' -else - DX_COND_pdf_TRUE='#' - DX_COND_pdf_FALSE= -fi - - - : -fi - - -# LaTeX generation for PS and/or PDF: -if test "$DX_FLAG_ps" = 1 || test "$DX_FLAG_pdf" = 1; then - if :; then - DX_COND_latex_TRUE= - DX_COND_latex_FALSE='#' -else - DX_COND_latex_TRUE='#' - DX_COND_latex_FALSE= -fi - - DX_ENV="$DX_ENV GENERATE_LATEX='YES'" - -else - if false; then - DX_COND_latex_TRUE= - DX_COND_latex_FALSE='#' -else - DX_COND_latex_TRUE='#' - DX_COND_latex_FALSE= -fi - - DX_ENV="$DX_ENV GENERATE_LATEX='NO'" - -fi - -# Paper size for PS and/or PDF: - -case "$DOXYGEN_PAPER_SIZE" in -#( -"") - DOXYGEN_PAPER_SIZE="" - -;; #( -a4wide|a4|letter|legal|executive) - DX_ENV="$DX_ENV PAPER_SIZE='$DOXYGEN_PAPER_SIZE'" - -;; #( -*) - as_fn_error $? "unknown DOXYGEN_PAPER_SIZE='$DOXYGEN_PAPER_SIZE'" "$LINENO" 5 -;; -esac - -#For debugging: -#echo DX_FLAG_doc=$DX_FLAG_doc -#echo DX_FLAG_dot=$DX_FLAG_dot -#echo DX_FLAG_man=$DX_FLAG_man -#echo DX_FLAG_html=$DX_FLAG_html -#echo DX_FLAG_chm=$DX_FLAG_chm -#echo DX_FLAG_chi=$DX_FLAG_chi -#echo DX_FLAG_rtf=$DX_FLAG_rtf -#echo DX_FLAG_xml=$DX_FLAG_xml -#echo DX_FLAG_pdf=$DX_FLAG_pdf -#echo DX_FLAG_ps=$DX_FLAG_ps -#echo DX_ENV=$DX_ENV - - -# initialize automake -am__api_version='1.11' - -ac_aux_dir= -for ac_dir in "$srcdir" "$srcdir/.." "$srcdir/../.."; do - if test -f "$ac_dir/install-sh"; then - ac_aux_dir=$ac_dir - ac_install_sh="$ac_aux_dir/install-sh -c" - break - elif test -f "$ac_dir/install.sh"; then - ac_aux_dir=$ac_dir - ac_install_sh="$ac_aux_dir/install.sh -c" - break - elif test -f "$ac_dir/shtool"; then - ac_aux_dir=$ac_dir - ac_install_sh="$ac_aux_dir/shtool install -c" - break - fi -done -if test -z "$ac_aux_dir"; then - as_fn_error $? "cannot find install-sh, install.sh, or shtool in \"$srcdir\" \"$srcdir/..\" \"$srcdir/../..\"" "$LINENO" 5 -fi - -# These three variables are undocumented and unsupported, -# and are intended to be withdrawn in a future Autoconf release. -# They can cause serious problems if a builder's source tree is in a directory -# whose full name contains unusual characters. -ac_config_guess="$SHELL $ac_aux_dir/config.guess" # Please don't use this var. -ac_config_sub="$SHELL $ac_aux_dir/config.sub" # Please don't use this var. -ac_configure="$SHELL $ac_aux_dir/configure" # Please don't use this var. - - -# Find a good install program. We prefer a C program (faster), -# so one script is as good as another. But avoid the broken or -# incompatible versions: -# SysV /etc/install, /usr/sbin/install -# SunOS /usr/etc/install -# IRIX /sbin/install -# AIX /bin/install -# AmigaOS /C/install, which installs bootblocks on floppy discs -# AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag -# AFS /usr/afsws/bin/install, which mishandles nonexistent args -# SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff" -# OS/2's system install, which has a completely different semantic -# ./install, which can be erroneously created by make from ./install.sh. -# Reject install programs that cannot install multiple files. -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a BSD-compatible install" >&5 -$as_echo_n "checking for a BSD-compatible install... " >&6; } -if test -z "$INSTALL"; then -if ${ac_cv_path_install+:} false; then : - $as_echo_n "(cached) " >&6 -else - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - # Account for people who put trailing slashes in PATH elements. -case $as_dir/ in @%:@(( - ./ | .// | /[cC]/* | \ - /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \ - ?:[\\/]os2[\\/]install[\\/]* | ?:[\\/]OS2[\\/]INSTALL[\\/]* | \ - /usr/ucb/* ) ;; - *) - # OSF1 and SCO ODT 3.0 have their own names for install. - # Don't use installbsd from OSF since it installs stuff as root - # by default. - for ac_prog in ginstall scoinst install; do - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_prog$ac_exec_ext"; then - if test $ac_prog = install && - grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then - # AIX install. It has an incompatible calling convention. - : - elif test $ac_prog = install && - grep pwplus "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then - # program-specific install script used by HP pwplus--don't use. - : - else - rm -rf conftest.one conftest.two conftest.dir - echo one > conftest.one - echo two > conftest.two - mkdir conftest.dir - if "$as_dir/$ac_prog$ac_exec_ext" -c conftest.one conftest.two "`pwd`/conftest.dir" && - test -s conftest.one && test -s conftest.two && - test -s conftest.dir/conftest.one && - test -s conftest.dir/conftest.two - then - ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c" - break 3 - fi - fi - fi - done - done - ;; -esac - - done -IFS=$as_save_IFS - -rm -rf conftest.one conftest.two conftest.dir - -fi - if test "${ac_cv_path_install+set}" = set; then - INSTALL=$ac_cv_path_install - else - # As a last resort, use the slow shell script. Don't cache a - # value for INSTALL within a source directory, because that will - # break other packages using the cache if that directory is - # removed, or if the value is a relative name. - INSTALL=$ac_install_sh - fi -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $INSTALL" >&5 -$as_echo "$INSTALL" >&6; } - -# Use test -z because SunOS4 sh mishandles braces in ${var-val}. -# It thinks the first close brace ends the variable substitution. -test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}' - -test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}' - -test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644' - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether build environment is sane" >&5 -$as_echo_n "checking whether build environment is sane... " >&6; } -# Just in case -sleep 1 -echo timestamp > conftest.file -# Reject unsafe characters in $srcdir or the absolute working directory -# name. Accept space and tab only in the latter. -am_lf=' -' -case `pwd` in - *[\\\"\#\$\&\'\`$am_lf]*) - as_fn_error $? "unsafe absolute working directory name" "$LINENO" 5;; -esac -case $srcdir in - *[\\\"\#\$\&\'\`$am_lf\ \ ]*) - as_fn_error $? "unsafe srcdir value: \`$srcdir'" "$LINENO" 5;; -esac - -# Do `set' in a subshell so we don't clobber the current shell's -# arguments. Must try -L first in case configure is actually a -# symlink; some systems play weird games with the mod time of symlinks -# (eg FreeBSD returns the mod time of the symlink's containing -# directory). -if ( - set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null` - if test "$*" = "X"; then - # -L didn't work. - set X `ls -t "$srcdir/configure" conftest.file` - fi - rm -f conftest.file - if test "$*" != "X $srcdir/configure conftest.file" \ - && test "$*" != "X conftest.file $srcdir/configure"; then - - # If neither matched, then we have a broken ls. This can happen - # if, for instance, CONFIG_SHELL is bash and it inherits a - # broken ls alias from the environment. This has actually - # happened. Such a system could not be considered "sane". - as_fn_error $? "ls -t appears to fail. Make sure there is not a broken -alias in your environment" "$LINENO" 5 - fi - - test "$2" = conftest.file - ) -then - # Ok. - : -else - as_fn_error $? "newly created file is older than distributed files! -Check your system clock" "$LINENO" 5 -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; } -test "$program_prefix" != NONE && - program_transform_name="s&^&$program_prefix&;$program_transform_name" -# Use a double $ so make ignores it. -test "$program_suffix" != NONE && - program_transform_name="s&\$&$program_suffix&;$program_transform_name" -# Double any \ or $. -# By default was `s,x,x', remove it if useless. -ac_script='s/[\\$]/&&/g;s/;s,x,x,$//' -program_transform_name=`$as_echo "$program_transform_name" | sed "$ac_script"` - -# expand $ac_aux_dir to an absolute path -am_aux_dir=`cd $ac_aux_dir && pwd` - -if test x"${MISSING+set}" != xset; then - case $am_aux_dir in - *\ * | *\ *) - MISSING="\${SHELL} \"$am_aux_dir/missing\"" ;; - *) - MISSING="\${SHELL} $am_aux_dir/missing" ;; - esac -fi -# Use eval to expand $SHELL -if eval "$MISSING --run true"; then - am_missing_run="$MISSING --run " -else - am_missing_run= - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: \`missing' script is too old or missing" >&5 -$as_echo "$as_me: WARNING: \`missing' script is too old or missing" >&2;} -fi - -if test x"${install_sh}" != xset; then - case $am_aux_dir in - *\ * | *\ *) - install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;; - *) - install_sh="\${SHELL} $am_aux_dir/install-sh" - esac -fi - -# Installed binaries are usually stripped using `strip' when the user -# run `make install-strip'. However `strip' might not be the right -# tool to use in cross-compilation environments, therefore Automake -# will honor the `STRIP' environment variable to overrule this program. -if test "$cross_compiling" != no; then - if test -n "$ac_tool_prefix"; then - # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args. -set dummy ${ac_tool_prefix}strip; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_STRIP+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$STRIP"; then - ac_cv_prog_STRIP="$STRIP" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_STRIP="${ac_tool_prefix}strip" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -STRIP=$ac_cv_prog_STRIP -if test -n "$STRIP"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $STRIP" >&5 -$as_echo "$STRIP" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - -fi -if test -z "$ac_cv_prog_STRIP"; then - ac_ct_STRIP=$STRIP - # Extract the first word of "strip", so it can be a program name with args. -set dummy strip; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_ac_ct_STRIP+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$ac_ct_STRIP"; then - ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_ac_ct_STRIP="strip" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP -if test -n "$ac_ct_STRIP"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP" >&5 -$as_echo "$ac_ct_STRIP" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - if test "x$ac_ct_STRIP" = x; then - STRIP=":" - else - case $cross_compiling:$ac_tool_warned in -yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} -ac_tool_warned=yes ;; -esac - STRIP=$ac_ct_STRIP - fi -else - STRIP="$ac_cv_prog_STRIP" -fi - -fi -INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s" - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a thread-safe mkdir -p" >&5 -$as_echo_n "checking for a thread-safe mkdir -p... " >&6; } -if test -z "$MKDIR_P"; then - if ${ac_cv_path_mkdir+:} false; then : - $as_echo_n "(cached) " >&6 -else - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH$PATH_SEPARATOR/opt/sfw/bin -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_prog in mkdir gmkdir; do - for ac_exec_ext in '' $ac_executable_extensions; do - as_fn_executable_p "$as_dir/$ac_prog$ac_exec_ext" || continue - case `"$as_dir/$ac_prog$ac_exec_ext" --version 2>&1` in #( - 'mkdir (GNU coreutils) '* | \ - 'mkdir (coreutils) '* | \ - 'mkdir (fileutils) '4.1*) - ac_cv_path_mkdir=$as_dir/$ac_prog$ac_exec_ext - break 3;; - esac - done - done - done -IFS=$as_save_IFS - -fi - - test -d ./--version && rmdir ./--version - if test "${ac_cv_path_mkdir+set}" = set; then - MKDIR_P="$ac_cv_path_mkdir -p" - else - # As a last resort, use the slow shell script. Don't cache a - # value for MKDIR_P within a source directory, because that will - # break other packages using the cache if that directory is - # removed, or if the value is a relative name. - MKDIR_P="$ac_install_sh -d" - fi -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $MKDIR_P" >&5 -$as_echo "$MKDIR_P" >&6; } - -mkdir_p="$MKDIR_P" -case $mkdir_p in - [\\/$]* | ?:[\\/]*) ;; - */*) mkdir_p="\$(top_builddir)/$mkdir_p" ;; -esac - -for ac_prog in gawk mawk nawk awk -do - # Extract the first word of "$ac_prog", so it can be a program name with args. -set dummy $ac_prog; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_AWK+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$AWK"; then - ac_cv_prog_AWK="$AWK" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_AWK="$ac_prog" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -AWK=$ac_cv_prog_AWK -if test -n "$AWK"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AWK" >&5 -$as_echo "$AWK" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - - test -n "$AWK" && break -done - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} sets \$(MAKE)" >&5 -$as_echo_n "checking whether ${MAKE-make} sets \$(MAKE)... " >&6; } -set x ${MAKE-make} -ac_make=`$as_echo "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'` -if eval \${ac_cv_prog_make_${ac_make}_set+:} false; then : - $as_echo_n "(cached) " >&6 -else - cat >conftest.make <<\_ACEOF -SHELL = /bin/sh -all: - @echo '@@@%%%=$(MAKE)=@@@%%%' -_ACEOF -# GNU make sometimes prints "make[1]: Entering ...", which would confuse us. -case `${MAKE-make} -f conftest.make 2>/dev/null` in - *@@@%%%=?*=@@@%%%*) - eval ac_cv_prog_make_${ac_make}_set=yes;; - *) - eval ac_cv_prog_make_${ac_make}_set=no;; -esac -rm -f conftest.make -fi -if eval test \$ac_cv_prog_make_${ac_make}_set = yes; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; } - SET_MAKE= -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } - SET_MAKE="MAKE=${MAKE-make}" -fi - -rm -rf .tst 2>/dev/null -mkdir .tst 2>/dev/null -if test -d .tst; then - am__leading_dot=. -else - am__leading_dot=_ -fi -rmdir .tst 2>/dev/null - -if test "`cd $srcdir && pwd`" != "`pwd`"; then - # Use -I$(srcdir) only when $(srcdir) != ., so that make's output - # is not polluted with repeated "-I." - am__isrc=' -I$(srcdir)' - # test to see if srcdir already configured - if test -f $srcdir/config.status; then - as_fn_error $? "source directory already configured; run \"make distclean\" there first" "$LINENO" 5 - fi -fi - -# test whether we have cygpath -if test -z "$CYGPATH_W"; then - if (cygpath --version) >/dev/null 2>/dev/null; then - CYGPATH_W='cygpath -w' - else - CYGPATH_W=echo - fi -fi - - -# Define the identity of the package. - PACKAGE='zookeeper' - VERSION='3.4.6' - - -cat >>confdefs.h <<_ACEOF -@%:@define PACKAGE "$PACKAGE" -_ACEOF - - -cat >>confdefs.h <<_ACEOF -@%:@define VERSION "$VERSION" -_ACEOF - -# Some tools Automake needs. - -ACLOCAL=${ACLOCAL-"${am_missing_run}aclocal-${am__api_version}"} - - -AUTOCONF=${AUTOCONF-"${am_missing_run}autoconf"} - - -AUTOMAKE=${AUTOMAKE-"${am_missing_run}automake-${am__api_version}"} - - -AUTOHEADER=${AUTOHEADER-"${am_missing_run}autoheader"} - - -MAKEINFO=${MAKEINFO-"${am_missing_run}makeinfo"} - -# We need awk for the "check" target. The system "awk" is bad on -# some platforms. -# Always define AMTAR for backward compatibility. Yes, it's still used -# in the wild :-( We should find a proper way to deprecate it ... -AMTAR='$${TAR-tar}' - -am__tar='$${TAR-tar} chof - "$$tardir"' am__untar='$${TAR-tar} xf -' - - - - - -ac_config_headers="$ac_config_headers config.h" - - -# Checks for programs. - -@%:@ Check whether --with-cppunit was given. -if test "${with_cppunit+set}" = set; then : - withval=$with_cppunit; -fi - - -if test "$with_cppunit" = "no" ; then - CPPUNIT_PATH="No_CPPUNIT" - CPPUNIT_INCLUDE= - CPPUNIT_LIBS= -else - - - -@%:@ Check whether --with-cppunit-prefix was given. -if test "${with_cppunit_prefix+set}" = set; then : - withval=$with_cppunit_prefix; cppunit_config_prefix="$withval" -else - cppunit_config_prefix="" -fi - - -@%:@ Check whether --with-cppunit-exec-prefix was given. -if test "${with_cppunit_exec_prefix+set}" = set; then : - withval=$with_cppunit_exec_prefix; cppunit_config_exec_prefix="$withval" -else - cppunit_config_exec_prefix="" -fi - - - if test x$cppunit_config_exec_prefix != x ; then - cppunit_config_args="$cppunit_config_args --exec-prefix=$cppunit_config_exec_prefix" - if test x${CPPUNIT_CONFIG+set} != xset ; then - CPPUNIT_CONFIG=$cppunit_config_exec_prefix/bin/cppunit-config - fi - fi - if test x$cppunit_config_prefix != x ; then - cppunit_config_args="$cppunit_config_args --prefix=$cppunit_config_prefix" - if test x${CPPUNIT_CONFIG+set} != xset ; then - CPPUNIT_CONFIG=$cppunit_config_prefix/bin/cppunit-config - fi - fi - - # Extract the first word of "cppunit-config", so it can be a program name with args. -set dummy cppunit-config; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_path_CPPUNIT_CONFIG+:} false; then : - $as_echo_n "(cached) " >&6 -else - case $CPPUNIT_CONFIG in - [\\/]* | ?:[\\/]*) - ac_cv_path_CPPUNIT_CONFIG="$CPPUNIT_CONFIG" # Let the user override the test with a path. - ;; - *) - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_path_CPPUNIT_CONFIG="$as_dir/$ac_word$ac_exec_ext" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - - test -z "$ac_cv_path_CPPUNIT_CONFIG" && ac_cv_path_CPPUNIT_CONFIG="no" - ;; -esac -fi -CPPUNIT_CONFIG=$ac_cv_path_CPPUNIT_CONFIG -if test -n "$CPPUNIT_CONFIG"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CPPUNIT_CONFIG" >&5 -$as_echo "$CPPUNIT_CONFIG" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - - cppunit_version_min=1.10.2 - - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Cppunit - version >= $cppunit_version_min" >&5 -$as_echo_n "checking for Cppunit - version >= $cppunit_version_min... " >&6; } - no_cppunit="" - if test "$CPPUNIT_CONFIG" = "no" ; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } - no_cppunit=yes - else - CPPUNIT_CFLAGS=`$CPPUNIT_CONFIG --cflags` - CPPUNIT_LIBS=`$CPPUNIT_CONFIG --libs` - cppunit_version=`$CPPUNIT_CONFIG --version` - - cppunit_major_version=`echo $cppunit_version | \ - sed 's/\([0-9]*\).\([0-9]*\).\([0-9]*\)/\1/'` - cppunit_minor_version=`echo $cppunit_version | \ - sed 's/\([0-9]*\).\([0-9]*\).\([0-9]*\)/\2/'` - cppunit_micro_version=`echo $cppunit_version | \ - sed 's/\([0-9]*\).\([0-9]*\).\([0-9]*\)/\3/'` - - cppunit_major_min=`echo $cppunit_version_min | \ - sed 's/\([0-9]*\).\([0-9]*\).\([0-9]*\)/\1/'` - if test "x${cppunit_major_min}" = "x" ; then - cppunit_major_min=0 - fi - - cppunit_minor_min=`echo $cppunit_version_min | \ - sed 's/\([0-9]*\).\([0-9]*\).\([0-9]*\)/\2/'` - if test "x${cppunit_minor_min}" = "x" ; then - cppunit_minor_min=0 - fi - - cppunit_micro_min=`echo $cppunit_version_min | \ - sed 's/\([0-9]*\).\([0-9]*\).\([0-9]*\)/\3/'` - if test "x${cppunit_micro_min}" = "x" ; then - cppunit_micro_min=0 - fi - - cppunit_version_proper=`expr \ - $cppunit_major_version \> $cppunit_major_min \| \ - $cppunit_major_version \= $cppunit_major_min \& \ - $cppunit_minor_version \> $cppunit_minor_min \| \ - $cppunit_major_version \= $cppunit_major_min \& \ - $cppunit_minor_version \= $cppunit_minor_min \& \ - $cppunit_micro_version \>= $cppunit_micro_min ` - - if test "$cppunit_version_proper" = "1" ; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $cppunit_major_version.$cppunit_minor_version.$cppunit_micro_version" >&5 -$as_echo "$cppunit_major_version.$cppunit_minor_version.$cppunit_micro_version" >&6; } - else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } - no_cppunit=yes - fi - fi - - if test "x$no_cppunit" = x ; then - : - else - CPPUNIT_CFLAGS="" - CPPUNIT_LIBS="" - : - fi - - - - -fi - -if test "$CALLER" = "ANT" ; then -CPPUNIT_CFLAGS="$CPPUNIT_CFLAGS -DZKSERVER_CMD=\"\\\"${base_dir}/src/c/tests/zkServer.sh\\\"\"" -else -CPPUNIT_CFLAGS="$CPPUNIT_CFLAGS -DZKSERVER_CMD=\"\\\"./tests/zkServer.sh\\\"\"" -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for generated/zookeeper.jute.c" >&5 -$as_echo_n "checking for generated/zookeeper.jute.c... " >&6; } -if ${ac_cv_file_generated_zookeeper_jute_c+:} false; then : - $as_echo_n "(cached) " >&6 -else - test "$cross_compiling" = yes && - as_fn_error $? "cannot check for file existence when cross compiling" "$LINENO" 5 -if test -r "generated/zookeeper.jute.c"; then - ac_cv_file_generated_zookeeper_jute_c=yes -else - ac_cv_file_generated_zookeeper_jute_c=no -fi -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_file_generated_zookeeper_jute_c" >&5 -$as_echo "$ac_cv_file_generated_zookeeper_jute_c" >&6; } -if test "x$ac_cv_file_generated_zookeeper_jute_c" = xyes; then : - -cat >>confdefs.h <<_ACEOF -@%:@define HAVE_GENERATED_ZOOKEEPER_JUTE_C 1 -_ACEOF - -else - as_fn_error $? "jute files are missing! Please run \"ant compile_jute\" while in the zookeeper top level directory." "$LINENO" 5 - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for generated/zookeeper.jute.h" >&5 -$as_echo_n "checking for generated/zookeeper.jute.h... " >&6; } -if ${ac_cv_file_generated_zookeeper_jute_h+:} false; then : - $as_echo_n "(cached) " >&6 -else - test "$cross_compiling" = yes && - as_fn_error $? "cannot check for file existence when cross compiling" "$LINENO" 5 -if test -r "generated/zookeeper.jute.h"; then - ac_cv_file_generated_zookeeper_jute_h=yes -else - ac_cv_file_generated_zookeeper_jute_h=no -fi -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_file_generated_zookeeper_jute_h" >&5 -$as_echo "$ac_cv_file_generated_zookeeper_jute_h" >&6; } -if test "x$ac_cv_file_generated_zookeeper_jute_h" = xyes; then : - -cat >>confdefs.h <<_ACEOF -@%:@define HAVE_GENERATED_ZOOKEEPER_JUTE_H 1 -_ACEOF - -else - as_fn_error $? "jute files are missing! Please run \"ant compile_jute\" while in the zookeeper top level directory." "$LINENO" 5 - -fi - -fi - - -ac_ext=c -ac_cpp='$CPP $CPPFLAGS' -ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_c_compiler_gnu -if test -n "$ac_tool_prefix"; then - # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args. -set dummy ${ac_tool_prefix}gcc; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_CC+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$CC"; then - ac_cv_prog_CC="$CC" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_CC="${ac_tool_prefix}gcc" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -CC=$ac_cv_prog_CC -if test -n "$CC"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 -$as_echo "$CC" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - -fi -if test -z "$ac_cv_prog_CC"; then - ac_ct_CC=$CC - # Extract the first word of "gcc", so it can be a program name with args. -set dummy gcc; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_ac_ct_CC+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$ac_ct_CC"; then - ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_ac_ct_CC="gcc" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -ac_ct_CC=$ac_cv_prog_ac_ct_CC -if test -n "$ac_ct_CC"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 -$as_echo "$ac_ct_CC" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - if test "x$ac_ct_CC" = x; then - CC="" - else - case $cross_compiling:$ac_tool_warned in -yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} -ac_tool_warned=yes ;; -esac - CC=$ac_ct_CC - fi -else - CC="$ac_cv_prog_CC" -fi - -if test -z "$CC"; then - if test -n "$ac_tool_prefix"; then - # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args. -set dummy ${ac_tool_prefix}cc; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_CC+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$CC"; then - ac_cv_prog_CC="$CC" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_CC="${ac_tool_prefix}cc" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -CC=$ac_cv_prog_CC -if test -n "$CC"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 -$as_echo "$CC" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - - fi -fi -if test -z "$CC"; then - # Extract the first word of "cc", so it can be a program name with args. -set dummy cc; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_CC+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$CC"; then - ac_cv_prog_CC="$CC" # Let the user override the test. -else - ac_prog_rejected=no -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then - ac_prog_rejected=yes - continue - fi - ac_cv_prog_CC="cc" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -if test $ac_prog_rejected = yes; then - # We found a bogon in the path, so make sure we never use it. - set dummy $ac_cv_prog_CC - shift - if test $@%:@ != 0; then - # We chose a different compiler from the bogus one. - # However, it has the same basename, so the bogon will be chosen - # first if we set CC to just the basename; use the full file name. - shift - ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@" - fi -fi -fi -fi -CC=$ac_cv_prog_CC -if test -n "$CC"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 -$as_echo "$CC" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - -fi -if test -z "$CC"; then - if test -n "$ac_tool_prefix"; then - for ac_prog in cl.exe - do - # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. -set dummy $ac_tool_prefix$ac_prog; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_CC+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$CC"; then - ac_cv_prog_CC="$CC" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_CC="$ac_tool_prefix$ac_prog" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -CC=$ac_cv_prog_CC -if test -n "$CC"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 -$as_echo "$CC" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - - test -n "$CC" && break - done -fi -if test -z "$CC"; then - ac_ct_CC=$CC - for ac_prog in cl.exe -do - # Extract the first word of "$ac_prog", so it can be a program name with args. -set dummy $ac_prog; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_ac_ct_CC+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$ac_ct_CC"; then - ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_ac_ct_CC="$ac_prog" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -ac_ct_CC=$ac_cv_prog_ac_ct_CC -if test -n "$ac_ct_CC"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 -$as_echo "$ac_ct_CC" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - - test -n "$ac_ct_CC" && break -done - - if test "x$ac_ct_CC" = x; then - CC="" - else - case $cross_compiling:$ac_tool_warned in -yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} -ac_tool_warned=yes ;; -esac - CC=$ac_ct_CC - fi -fi - -fi - - -test -z "$CC" && { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 -$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} -as_fn_error $? "no acceptable C compiler found in \$PATH -See \`config.log' for more details" "$LINENO" 5; } - -# Provide some information about the compiler. -$as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5 -set X $ac_compile -ac_compiler=$2 -for ac_option in --version -v -V -qversion; do - { { ac_try="$ac_compiler $ac_option >&5" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 - (eval "$ac_compiler $ac_option >&5") 2>conftest.err - ac_status=$? - if test -s conftest.err; then - sed '10a\ -... rest of stderr output deleted ... - 10q' conftest.err >conftest.er1 - cat conftest.er1 >&5 - fi - rm -f conftest.er1 conftest.err - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } -done - -cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -int -main () -{ - - ; - return 0; -} -_ACEOF -ac_clean_files_save=$ac_clean_files -ac_clean_files="$ac_clean_files a.out a.out.dSYM a.exe b.out" -# Try to create an executable without -o first, disregard a.out. -# It will help us diagnose broken compilers, and finding out an intuition -# of exeext. -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler works" >&5 -$as_echo_n "checking whether the C compiler works... " >&6; } -ac_link_default=`$as_echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'` - -# The possible output files: -ac_files="a.out conftest.exe conftest a.exe a_out.exe b.out conftest.*" - -ac_rmfiles= -for ac_file in $ac_files -do - case $ac_file in - *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; - * ) ac_rmfiles="$ac_rmfiles $ac_file";; - esac -done -rm -f $ac_rmfiles - -if { { ac_try="$ac_link_default" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 - (eval "$ac_link_default") 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; }; then : - # Autoconf-2.13 could set the ac_cv_exeext variable to `no'. -# So ignore a value of `no', otherwise this would lead to `EXEEXT = no' -# in a Makefile. We should not override ac_cv_exeext if it was cached, -# so that the user can short-circuit this test for compilers unknown to -# Autoconf. -for ac_file in $ac_files '' -do - test -f "$ac_file" || continue - case $ac_file in - *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) - ;; - [ab].out ) - # We found the default executable, but exeext='' is most - # certainly right. - break;; - *.* ) - if test "${ac_cv_exeext+set}" = set && test "$ac_cv_exeext" != no; - then :; else - ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` - fi - # We set ac_cv_exeext here because the later test for it is not - # safe: cross compilers may not add the suffix if given an `-o' - # argument, so we may need to know it at that point already. - # Even if this section looks crufty: it has the advantage of - # actually working. - break;; - * ) - break;; - esac -done -test "$ac_cv_exeext" = no && ac_cv_exeext= - -else - ac_file='' -fi -if test -z "$ac_file"; then : - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -$as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 -$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} -as_fn_error 77 "C compiler cannot create executables -See \`config.log' for more details" "$LINENO" 5; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; } -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler default output file name" >&5 -$as_echo_n "checking for C compiler default output file name... " >&6; } -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_file" >&5 -$as_echo "$ac_file" >&6; } -ac_exeext=$ac_cv_exeext - -rm -f -r a.out a.out.dSYM a.exe conftest$ac_cv_exeext b.out -ac_clean_files=$ac_clean_files_save -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of executables" >&5 -$as_echo_n "checking for suffix of executables... " >&6; } -if { { ac_try="$ac_link" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 - (eval "$ac_link") 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; }; then : - # If both `conftest.exe' and `conftest' are `present' (well, observable) -# catch `conftest.exe'. For instance with Cygwin, `ls conftest' will -# work properly (i.e., refer to `conftest.exe'), while it won't with -# `rm'. -for ac_file in conftest.exe conftest conftest.*; do - test -f "$ac_file" || continue - case $ac_file in - *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; - *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` - break;; - * ) break;; - esac -done -else - { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 -$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} -as_fn_error $? "cannot compute suffix of executables: cannot compile and link -See \`config.log' for more details" "$LINENO" 5; } -fi -rm -f conftest conftest$ac_cv_exeext -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_exeext" >&5 -$as_echo "$ac_cv_exeext" >&6; } - -rm -f conftest.$ac_ext -EXEEXT=$ac_cv_exeext -ac_exeext=$EXEEXT -cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -@%:@include -int -main () -{ -FILE *f = fopen ("conftest.out", "w"); - return ferror (f) || fclose (f) != 0; - - ; - return 0; -} -_ACEOF -ac_clean_files="$ac_clean_files conftest.out" -# Check that the compiler produces executables we can run. If not, either -# the compiler is broken, or we cross compile. -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are cross compiling" >&5 -$as_echo_n "checking whether we are cross compiling... " >&6; } -if test "$cross_compiling" != yes; then - { { ac_try="$ac_link" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 - (eval "$ac_link") 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } - if { ac_try='./conftest$ac_cv_exeext' - { { case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 - (eval "$ac_try") 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; }; }; then - cross_compiling=no - else - if test "$cross_compiling" = maybe; then - cross_compiling=yes - else - { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 -$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} -as_fn_error $? "cannot run C compiled programs. -If you meant to cross compile, use \`--host'. -See \`config.log' for more details" "$LINENO" 5; } - fi - fi -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $cross_compiling" >&5 -$as_echo "$cross_compiling" >&6; } - -rm -f conftest.$ac_ext conftest$ac_cv_exeext conftest.out -ac_clean_files=$ac_clean_files_save -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of object files" >&5 -$as_echo_n "checking for suffix of object files... " >&6; } -if ${ac_cv_objext+:} false; then : - $as_echo_n "(cached) " >&6 -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -int -main () -{ - - ; - return 0; -} -_ACEOF -rm -f conftest.o conftest.obj -if { { ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 - (eval "$ac_compile") 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; }; then : - for ac_file in conftest.o conftest.obj conftest.*; do - test -f "$ac_file" || continue; - case $ac_file in - *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM ) ;; - *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'` - break;; - esac -done -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 -$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} -as_fn_error $? "cannot compute suffix of object files: cannot compile -See \`config.log' for more details" "$LINENO" 5; } -fi -rm -f conftest.$ac_cv_objext conftest.$ac_ext -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_objext" >&5 -$as_echo "$ac_cv_objext" >&6; } -OBJEXT=$ac_cv_objext -ac_objext=$OBJEXT -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C compiler" >&5 -$as_echo_n "checking whether we are using the GNU C compiler... " >&6; } -if ${ac_cv_c_compiler_gnu+:} false; then : - $as_echo_n "(cached) " >&6 -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -int -main () -{ -#ifndef __GNUC__ - choke me -#endif - - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - ac_compiler_gnu=yes -else - ac_compiler_gnu=no -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -ac_cv_c_compiler_gnu=$ac_compiler_gnu - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5 -$as_echo "$ac_cv_c_compiler_gnu" >&6; } -if test $ac_compiler_gnu = yes; then - GCC=yes -else - GCC= -fi -ac_test_CFLAGS=${CFLAGS+set} -ac_save_CFLAGS=$CFLAGS -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5 -$as_echo_n "checking whether $CC accepts -g... " >&6; } -if ${ac_cv_prog_cc_g+:} false; then : - $as_echo_n "(cached) " >&6 -else - ac_save_c_werror_flag=$ac_c_werror_flag - ac_c_werror_flag=yes - ac_cv_prog_cc_g=no - CFLAGS="-g" - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -int -main () -{ - - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - ac_cv_prog_cc_g=yes -else - CFLAGS="" - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -int -main () -{ - - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - -else - ac_c_werror_flag=$ac_save_c_werror_flag - CFLAGS="-g" - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -int -main () -{ - - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - ac_cv_prog_cc_g=yes -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext - ac_c_werror_flag=$ac_save_c_werror_flag -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5 -$as_echo "$ac_cv_prog_cc_g" >&6; } -if test "$ac_test_CFLAGS" = set; then - CFLAGS=$ac_save_CFLAGS -elif test $ac_cv_prog_cc_g = yes; then - if test "$GCC" = yes; then - CFLAGS="-g -O2" - else - CFLAGS="-g" - fi -else - if test "$GCC" = yes; then - CFLAGS="-O2" - else - CFLAGS= - fi -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5 -$as_echo_n "checking for $CC option to accept ISO C89... " >&6; } -if ${ac_cv_prog_cc_c89+:} false; then : - $as_echo_n "(cached) " >&6 -else - ac_cv_prog_cc_c89=no -ac_save_CC=$CC -cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include -#include -struct stat; -/* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */ -struct buf { int x; }; -FILE * (*rcsopen) (struct buf *, struct stat *, int); -static char *e (p, i) - char **p; - int i; -{ - return p[i]; -} -static char *f (char * (*g) (char **, int), char **p, ...) -{ - char *s; - va_list v; - va_start (v,p); - s = g (p, va_arg (v,int)); - va_end (v); - return s; -} - -/* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has - function prototypes and stuff, but not '\xHH' hex character constants. - These don't provoke an error unfortunately, instead are silently treated - as 'x'. The following induces an error, until -std is added to get - proper ANSI mode. Curiously '\x00'!='x' always comes out true, for an - array size at least. It's necessary to write '\x00'==0 to get something - that's true only with -std. */ -int osf4_cc_array ['\x00' == 0 ? 1 : -1]; - -/* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters - inside strings and character constants. */ -#define FOO(x) 'x' -int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1]; - -int test (int i, double x); -struct s1 {int (*f) (int a);}; -struct s2 {int (*f) (double a);}; -int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int); -int argc; -char **argv; -int -main () -{ -return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]; - ; - return 0; -} -_ACEOF -for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \ - -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" -do - CC="$ac_save_CC $ac_arg" - if ac_fn_c_try_compile "$LINENO"; then : - ac_cv_prog_cc_c89=$ac_arg -fi -rm -f core conftest.err conftest.$ac_objext - test "x$ac_cv_prog_cc_c89" != "xno" && break -done -rm -f conftest.$ac_ext -CC=$ac_save_CC - -fi -# AC_CACHE_VAL -case "x$ac_cv_prog_cc_c89" in - x) - { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 -$as_echo "none needed" >&6; } ;; - xno) - { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 -$as_echo "unsupported" >&6; } ;; - *) - CC="$CC $ac_cv_prog_cc_c89" - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5 -$as_echo "$ac_cv_prog_cc_c89" >&6; } ;; -esac -if test "x$ac_cv_prog_cc_c89" != xno; then : - -fi - -ac_ext=c -ac_cpp='$CPP $CPPFLAGS' -ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_c_compiler_gnu -DEPDIR="${am__leading_dot}deps" - -ac_config_commands="$ac_config_commands depfiles" - - -am_make=${MAKE-make} -cat > confinc << 'END' -am__doit: - @echo this is the am__doit target -.PHONY: am__doit -END -# If we don't find an include directive, just comment out the code. -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for style of include used by $am_make" >&5 -$as_echo_n "checking for style of include used by $am_make... " >&6; } -am__include="#" -am__quote= -_am_result=none -# First try GNU make style include. -echo "include confinc" > confmf -# Ignore all kinds of additional output from `make'. -case `$am_make -s -f confmf 2> /dev/null` in #( -*the\ am__doit\ target*) - am__include=include - am__quote= - _am_result=GNU - ;; -esac -# Now try BSD make style include. -if test "$am__include" = "#"; then - echo '.include "confinc"' > confmf - case `$am_make -s -f confmf 2> /dev/null` in #( - *the\ am__doit\ target*) - am__include=.include - am__quote="\"" - _am_result=BSD - ;; - esac -fi - - -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $_am_result" >&5 -$as_echo "$_am_result" >&6; } -rm -f confinc confmf - -@%:@ Check whether --enable-dependency-tracking was given. -if test "${enable_dependency_tracking+set}" = set; then : - enableval=$enable_dependency_tracking; -fi - -if test "x$enable_dependency_tracking" != xno; then - am_depcomp="$ac_aux_dir/depcomp" - AMDEPBACKSLASH='\' - am__nodep='_no' -fi - if test "x$enable_dependency_tracking" != xno; then - AMDEP_TRUE= - AMDEP_FALSE='#' -else - AMDEP_TRUE='#' - AMDEP_FALSE= -fi - - - -depcc="$CC" am_compiler_list= - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5 -$as_echo_n "checking dependency style of $depcc... " >&6; } -if ${am_cv_CC_dependencies_compiler_type+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then - # We make a subdir and do the tests there. Otherwise we can end up - # making bogus files that we don't know about and never remove. For - # instance it was reported that on HP-UX the gcc test will end up - # making a dummy file named `D' -- because `-MD' means `put the output - # in D'. - rm -rf conftest.dir - mkdir conftest.dir - # Copy depcomp to subdir because otherwise we won't find it if we're - # using a relative directory. - cp "$am_depcomp" conftest.dir - cd conftest.dir - # We will build objects and dependencies in a subdirectory because - # it helps to detect inapplicable dependency modes. For instance - # both Tru64's cc and ICC support -MD to output dependencies as a - # side effect of compilation, but ICC will put the dependencies in - # the current directory while Tru64 will put them in the object - # directory. - mkdir sub - - am_cv_CC_dependencies_compiler_type=none - if test "$am_compiler_list" = ""; then - am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp` - fi - am__universal=false - case " $depcc " in #( - *\ -arch\ *\ -arch\ *) am__universal=true ;; - esac - - for depmode in $am_compiler_list; do - # Setup a source with many dependencies, because some compilers - # like to wrap large dependency lists on column 80 (with \), and - # we should not choose a depcomp mode which is confused by this. - # - # We need to recreate these files for each test, as the compiler may - # overwrite some of them when testing with obscure command lines. - # This happens at least with the AIX C compiler. - : > sub/conftest.c - for i in 1 2 3 4 5 6; do - echo '#include "conftst'$i'.h"' >> sub/conftest.c - # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with - # Solaris 8's {/usr,}/bin/sh. - touch sub/conftst$i.h - done - echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf - - # We check with `-c' and `-o' for the sake of the "dashmstdout" - # mode. It turns out that the SunPro C++ compiler does not properly - # handle `-M -o', and we need to detect this. Also, some Intel - # versions had trouble with output in subdirs - am__obj=sub/conftest.${OBJEXT-o} - am__minus_obj="-o $am__obj" - case $depmode in - gcc) - # This depmode causes a compiler race in universal mode. - test "$am__universal" = false || continue - ;; - nosideeffect) - # after this tag, mechanisms are not by side-effect, so they'll - # only be used when explicitly requested - if test "x$enable_dependency_tracking" = xyes; then - continue - else - break - fi - ;; - msvc7 | msvc7msys | msvisualcpp | msvcmsys) - # This compiler won't grok `-c -o', but also, the minuso test has - # not run yet. These depmodes are late enough in the game, and - # so weak that their functioning should not be impacted. - am__obj=conftest.${OBJEXT-o} - am__minus_obj= - ;; - none) break ;; - esac - if depmode=$depmode \ - source=sub/conftest.c object=$am__obj \ - depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ - $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ - >/dev/null 2>conftest.err && - grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && - grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && - grep $am__obj sub/conftest.Po > /dev/null 2>&1 && - ${MAKE-make} -s -f confmf > /dev/null 2>&1; then - # icc doesn't choke on unknown options, it will just issue warnings - # or remarks (even with -Werror). So we grep stderr for any message - # that says an option was ignored or not supported. - # When given -MP, icc 7.0 and 7.1 complain thusly: - # icc: Command line warning: ignoring option '-M'; no argument required - # The diagnosis changed in icc 8.0: - # icc: Command line remark: option '-MP' not supported - if (grep 'ignoring option' conftest.err || - grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else - am_cv_CC_dependencies_compiler_type=$depmode - break - fi - fi - done - - cd .. - rm -rf conftest.dir -else - am_cv_CC_dependencies_compiler_type=none -fi - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_CC_dependencies_compiler_type" >&5 -$as_echo "$am_cv_CC_dependencies_compiler_type" >&6; } -CCDEPMODE=depmode=$am_cv_CC_dependencies_compiler_type - - if - test "x$enable_dependency_tracking" != xno \ - && test "$am_cv_CC_dependencies_compiler_type" = gcc3; then - am__fastdepCC_TRUE= - am__fastdepCC_FALSE='#' -else - am__fastdepCC_TRUE='#' - am__fastdepCC_FALSE= -fi - - -if test "x$CC" != xcc; then - { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC and cc understand -c and -o together" >&5 -$as_echo_n "checking whether $CC and cc understand -c and -o together... " >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether cc understands -c and -o together" >&5 -$as_echo_n "checking whether cc understands -c and -o together... " >&6; } -fi -set dummy $CC; ac_cc=`$as_echo "$2" | - sed 's/[^a-zA-Z0-9_]/_/g;s/^[0-9]/_/'` -if eval \${ac_cv_prog_cc_${ac_cc}_c_o+:} false; then : - $as_echo_n "(cached) " >&6 -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -int -main () -{ - - ; - return 0; -} -_ACEOF -# Make sure it works both with $CC and with simple cc. -# We do the test twice because some compilers refuse to overwrite an -# existing .o file with -o, though they will create one. -ac_try='$CC -c conftest.$ac_ext -o conftest2.$ac_objext >&5' -rm -f conftest2.* -if { { case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 - (eval "$ac_try") 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } && - test -f conftest2.$ac_objext && { { case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 - (eval "$ac_try") 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; }; -then - eval ac_cv_prog_cc_${ac_cc}_c_o=yes - if test "x$CC" != xcc; then - # Test first that cc exists at all. - if { ac_try='cc -c conftest.$ac_ext >&5' - { { case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 - (eval "$ac_try") 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; }; }; then - ac_try='cc -c conftest.$ac_ext -o conftest2.$ac_objext >&5' - rm -f conftest2.* - if { { case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 - (eval "$ac_try") 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } && - test -f conftest2.$ac_objext && { { case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 - (eval "$ac_try") 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; }; - then - # cc works too. - : - else - # cc exists but doesn't like -o. - eval ac_cv_prog_cc_${ac_cc}_c_o=no - fi - fi - fi -else - eval ac_cv_prog_cc_${ac_cc}_c_o=no -fi -rm -f core conftest* - -fi -if eval test \$ac_cv_prog_cc_${ac_cc}_c_o = yes; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } - -$as_echo "@%:@define NO_MINUS_C_MINUS_O 1" >>confdefs.h - -fi - -# FIXME: we rely on the cache variable name because -# there is no other way. -set dummy $CC -am_cc=`echo $2 | sed 's/[^a-zA-Z0-9_]/_/g;s/^[0-9]/_/'` -eval am_t=\$ac_cv_prog_cc_${am_cc}_c_o -if test "$am_t" != yes; then - # Losing compiler, so override with the script. - # FIXME: It is wrong to rewrite CC. - # But if we don't then we get into trouble of one sort or another. - # A longer-term fix would be to have automake use am__CC in this case, - # and then we could set am__CC="\$(top_srcdir)/compile \$(CC)" - CC="$am_aux_dir/compile $CC" -fi - - -ac_ext=cpp -ac_cpp='$CXXCPP $CPPFLAGS' -ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_cxx_compiler_gnu -if test -z "$CXX"; then - if test -n "$CCC"; then - CXX=$CCC - else - if test -n "$ac_tool_prefix"; then - for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC - do - # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. -set dummy $ac_tool_prefix$ac_prog; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_CXX+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$CXX"; then - ac_cv_prog_CXX="$CXX" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_CXX="$ac_tool_prefix$ac_prog" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -CXX=$ac_cv_prog_CXX -if test -n "$CXX"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CXX" >&5 -$as_echo "$CXX" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - - test -n "$CXX" && break - done -fi -if test -z "$CXX"; then - ac_ct_CXX=$CXX - for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC -do - # Extract the first word of "$ac_prog", so it can be a program name with args. -set dummy $ac_prog; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_ac_ct_CXX+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$ac_ct_CXX"; then - ac_cv_prog_ac_ct_CXX="$ac_ct_CXX" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_ac_ct_CXX="$ac_prog" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -ac_ct_CXX=$ac_cv_prog_ac_ct_CXX -if test -n "$ac_ct_CXX"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CXX" >&5 -$as_echo "$ac_ct_CXX" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - - test -n "$ac_ct_CXX" && break -done - - if test "x$ac_ct_CXX" = x; then - CXX="g++" - else - case $cross_compiling:$ac_tool_warned in -yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} -ac_tool_warned=yes ;; -esac - CXX=$ac_ct_CXX - fi -fi - - fi -fi -# Provide some information about the compiler. -$as_echo "$as_me:${as_lineno-$LINENO}: checking for C++ compiler version" >&5 -set X $ac_compile -ac_compiler=$2 -for ac_option in --version -v -V -qversion; do - { { ac_try="$ac_compiler $ac_option >&5" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 - (eval "$ac_compiler $ac_option >&5") 2>conftest.err - ac_status=$? - if test -s conftest.err; then - sed '10a\ -... rest of stderr output deleted ... - 10q' conftest.err >conftest.er1 - cat conftest.er1 >&5 - fi - rm -f conftest.er1 conftest.err - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } -done - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C++ compiler" >&5 -$as_echo_n "checking whether we are using the GNU C++ compiler... " >&6; } -if ${ac_cv_cxx_compiler_gnu+:} false; then : - $as_echo_n "(cached) " >&6 -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -int -main () -{ -#ifndef __GNUC__ - choke me -#endif - - ; - return 0; -} -_ACEOF -if ac_fn_cxx_try_compile "$LINENO"; then : - ac_compiler_gnu=yes -else - ac_compiler_gnu=no -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -ac_cv_cxx_compiler_gnu=$ac_compiler_gnu - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_cxx_compiler_gnu" >&5 -$as_echo "$ac_cv_cxx_compiler_gnu" >&6; } -if test $ac_compiler_gnu = yes; then - GXX=yes -else - GXX= -fi -ac_test_CXXFLAGS=${CXXFLAGS+set} -ac_save_CXXFLAGS=$CXXFLAGS -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CXX accepts -g" >&5 -$as_echo_n "checking whether $CXX accepts -g... " >&6; } -if ${ac_cv_prog_cxx_g+:} false; then : - $as_echo_n "(cached) " >&6 -else - ac_save_cxx_werror_flag=$ac_cxx_werror_flag - ac_cxx_werror_flag=yes - ac_cv_prog_cxx_g=no - CXXFLAGS="-g" - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -int -main () -{ - - ; - return 0; -} -_ACEOF -if ac_fn_cxx_try_compile "$LINENO"; then : - ac_cv_prog_cxx_g=yes -else - CXXFLAGS="" - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -int -main () -{ - - ; - return 0; -} -_ACEOF -if ac_fn_cxx_try_compile "$LINENO"; then : - -else - ac_cxx_werror_flag=$ac_save_cxx_werror_flag - CXXFLAGS="-g" - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -int -main () -{ - - ; - return 0; -} -_ACEOF -if ac_fn_cxx_try_compile "$LINENO"; then : - ac_cv_prog_cxx_g=yes -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext - ac_cxx_werror_flag=$ac_save_cxx_werror_flag -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cxx_g" >&5 -$as_echo "$ac_cv_prog_cxx_g" >&6; } -if test "$ac_test_CXXFLAGS" = set; then - CXXFLAGS=$ac_save_CXXFLAGS -elif test $ac_cv_prog_cxx_g = yes; then - if test "$GXX" = yes; then - CXXFLAGS="-g -O2" - else - CXXFLAGS="-g" - fi -else - if test "$GXX" = yes; then - CXXFLAGS="-O2" - else - CXXFLAGS= - fi -fi -ac_ext=c -ac_cpp='$CPP $CPPFLAGS' -ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_c_compiler_gnu - -depcc="$CXX" am_compiler_list= - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5 -$as_echo_n "checking dependency style of $depcc... " >&6; } -if ${am_cv_CXX_dependencies_compiler_type+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then - # We make a subdir and do the tests there. Otherwise we can end up - # making bogus files that we don't know about and never remove. For - # instance it was reported that on HP-UX the gcc test will end up - # making a dummy file named `D' -- because `-MD' means `put the output - # in D'. - rm -rf conftest.dir - mkdir conftest.dir - # Copy depcomp to subdir because otherwise we won't find it if we're - # using a relative directory. - cp "$am_depcomp" conftest.dir - cd conftest.dir - # We will build objects and dependencies in a subdirectory because - # it helps to detect inapplicable dependency modes. For instance - # both Tru64's cc and ICC support -MD to output dependencies as a - # side effect of compilation, but ICC will put the dependencies in - # the current directory while Tru64 will put them in the object - # directory. - mkdir sub - - am_cv_CXX_dependencies_compiler_type=none - if test "$am_compiler_list" = ""; then - am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp` - fi - am__universal=false - case " $depcc " in #( - *\ -arch\ *\ -arch\ *) am__universal=true ;; - esac - - for depmode in $am_compiler_list; do - # Setup a source with many dependencies, because some compilers - # like to wrap large dependency lists on column 80 (with \), and - # we should not choose a depcomp mode which is confused by this. - # - # We need to recreate these files for each test, as the compiler may - # overwrite some of them when testing with obscure command lines. - # This happens at least with the AIX C compiler. - : > sub/conftest.c - for i in 1 2 3 4 5 6; do - echo '#include "conftst'$i'.h"' >> sub/conftest.c - # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with - # Solaris 8's {/usr,}/bin/sh. - touch sub/conftst$i.h - done - echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf - - # We check with `-c' and `-o' for the sake of the "dashmstdout" - # mode. It turns out that the SunPro C++ compiler does not properly - # handle `-M -o', and we need to detect this. Also, some Intel - # versions had trouble with output in subdirs - am__obj=sub/conftest.${OBJEXT-o} - am__minus_obj="-o $am__obj" - case $depmode in - gcc) - # This depmode causes a compiler race in universal mode. - test "$am__universal" = false || continue - ;; - nosideeffect) - # after this tag, mechanisms are not by side-effect, so they'll - # only be used when explicitly requested - if test "x$enable_dependency_tracking" = xyes; then - continue - else - break - fi - ;; - msvc7 | msvc7msys | msvisualcpp | msvcmsys) - # This compiler won't grok `-c -o', but also, the minuso test has - # not run yet. These depmodes are late enough in the game, and - # so weak that their functioning should not be impacted. - am__obj=conftest.${OBJEXT-o} - am__minus_obj= - ;; - none) break ;; - esac - if depmode=$depmode \ - source=sub/conftest.c object=$am__obj \ - depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ - $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ - >/dev/null 2>conftest.err && - grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && - grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && - grep $am__obj sub/conftest.Po > /dev/null 2>&1 && - ${MAKE-make} -s -f confmf > /dev/null 2>&1; then - # icc doesn't choke on unknown options, it will just issue warnings - # or remarks (even with -Werror). So we grep stderr for any message - # that says an option was ignored or not supported. - # When given -MP, icc 7.0 and 7.1 complain thusly: - # icc: Command line warning: ignoring option '-M'; no argument required - # The diagnosis changed in icc 8.0: - # icc: Command line remark: option '-MP' not supported - if (grep 'ignoring option' conftest.err || - grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else - am_cv_CXX_dependencies_compiler_type=$depmode - break - fi - fi - done - - cd .. - rm -rf conftest.dir -else - am_cv_CXX_dependencies_compiler_type=none -fi - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_CXX_dependencies_compiler_type" >&5 -$as_echo "$am_cv_CXX_dependencies_compiler_type" >&6; } -CXXDEPMODE=depmode=$am_cv_CXX_dependencies_compiler_type - - if - test "x$enable_dependency_tracking" != xno \ - && test "$am_cv_CXX_dependencies_compiler_type" = gcc3; then - am__fastdepCXX_TRUE= - am__fastdepCXX_FALSE='#' -else - am__fastdepCXX_TRUE='#' - am__fastdepCXX_FALSE= -fi - - - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ln -s works" >&5 -$as_echo_n "checking whether ln -s works... " >&6; } -LN_S=$as_ln_s -if test "$LN_S" = "ln -s"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no, using $LN_S" >&5 -$as_echo "no, using $LN_S" >&6; } -fi - - -# AC_DISABLE_SHARED -case `pwd` in - *\ * | *\ *) - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Libtool does not cope well with whitespace in \`pwd\`" >&5 -$as_echo "$as_me: WARNING: Libtool does not cope well with whitespace in \`pwd\`" >&2;} ;; -esac - - - -macro_version='2.4.2' -macro_revision='1.3337' - - - - - - - - - - - - - -ltmain="$ac_aux_dir/ltmain.sh" - -# Make sure we can run config.sub. -$SHELL "$ac_aux_dir/config.sub" sun4 >/dev/null 2>&1 || - as_fn_error $? "cannot run $SHELL $ac_aux_dir/config.sub" "$LINENO" 5 - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking build system type" >&5 -$as_echo_n "checking build system type... " >&6; } -if ${ac_cv_build+:} false; then : - $as_echo_n "(cached) " >&6 -else - ac_build_alias=$build_alias -test "x$ac_build_alias" = x && - ac_build_alias=`$SHELL "$ac_aux_dir/config.guess"` -test "x$ac_build_alias" = x && - as_fn_error $? "cannot guess build type; you must specify one" "$LINENO" 5 -ac_cv_build=`$SHELL "$ac_aux_dir/config.sub" $ac_build_alias` || - as_fn_error $? "$SHELL $ac_aux_dir/config.sub $ac_build_alias failed" "$LINENO" 5 - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_build" >&5 -$as_echo "$ac_cv_build" >&6; } -case $ac_cv_build in -*-*-*) ;; -*) as_fn_error $? "invalid value of canonical build" "$LINENO" 5;; -esac -build=$ac_cv_build -ac_save_IFS=$IFS; IFS='-' -set x $ac_cv_build -shift -build_cpu=$1 -build_vendor=$2 -shift; shift -# Remember, the first character of IFS is used to create $*, -# except with old shells: -build_os=$* -IFS=$ac_save_IFS -case $build_os in *\ *) build_os=`echo "$build_os" | sed 's/ /-/g'`;; esac - - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking host system type" >&5 -$as_echo_n "checking host system type... " >&6; } -if ${ac_cv_host+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test "x$host_alias" = x; then - ac_cv_host=$ac_cv_build -else - ac_cv_host=`$SHELL "$ac_aux_dir/config.sub" $host_alias` || - as_fn_error $? "$SHELL $ac_aux_dir/config.sub $host_alias failed" "$LINENO" 5 -fi - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_host" >&5 -$as_echo "$ac_cv_host" >&6; } -case $ac_cv_host in -*-*-*) ;; -*) as_fn_error $? "invalid value of canonical host" "$LINENO" 5;; -esac -host=$ac_cv_host -ac_save_IFS=$IFS; IFS='-' -set x $ac_cv_host -shift -host_cpu=$1 -host_vendor=$2 -shift; shift -# Remember, the first character of IFS is used to create $*, -# except with old shells: -host_os=$* -IFS=$ac_save_IFS -case $host_os in *\ *) host_os=`echo "$host_os" | sed 's/ /-/g'`;; esac - - -# Backslashify metacharacters that are still active within -# double-quoted strings. -sed_quote_subst='s/\(["`$\\]\)/\\\1/g' - -# Same as above, but do not quote variable references. -double_quote_subst='s/\(["`\\]\)/\\\1/g' - -# Sed substitution to delay expansion of an escaped shell variable in a -# double_quote_subst'ed string. -delay_variable_subst='s/\\\\\\\\\\\$/\\\\\\$/g' - -# Sed substitution to delay expansion of an escaped single quote. -delay_single_quote_subst='s/'\''/'\'\\\\\\\'\''/g' - -# Sed substitution to avoid accidental globbing in evaled expressions -no_glob_subst='s/\*/\\\*/g' - -ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' -ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO -ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO$ECHO - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to print strings" >&5 -$as_echo_n "checking how to print strings... " >&6; } -# Test print first, because it will be a builtin if present. -if test "X`( print -r -- -n ) 2>/dev/null`" = X-n && \ - test "X`print -r -- $ECHO 2>/dev/null`" = "X$ECHO"; then - ECHO='print -r --' -elif test "X`printf %s $ECHO 2>/dev/null`" = "X$ECHO"; then - ECHO='printf %s\n' -else - # Use this function as a fallback that always works. - func_fallback_echo () - { - eval 'cat <<_LTECHO_EOF -$1 -_LTECHO_EOF' - } - ECHO='func_fallback_echo' -fi - -# func_echo_all arg... -# Invoke $ECHO with all args, space-separated. -func_echo_all () -{ - $ECHO "" -} - -case "$ECHO" in - printf*) { $as_echo "$as_me:${as_lineno-$LINENO}: result: printf" >&5 -$as_echo "printf" >&6; } ;; - print*) { $as_echo "$as_me:${as_lineno-$LINENO}: result: print -r" >&5 -$as_echo "print -r" >&6; } ;; - *) { $as_echo "$as_me:${as_lineno-$LINENO}: result: cat" >&5 -$as_echo "cat" >&6; } ;; -esac - - - - - - - - - - - - - - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a sed that does not truncate output" >&5 -$as_echo_n "checking for a sed that does not truncate output... " >&6; } -if ${ac_cv_path_SED+:} false; then : - $as_echo_n "(cached) " >&6 -else - ac_script=s/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb/ - for ac_i in 1 2 3 4 5 6 7; do - ac_script="$ac_script$as_nl$ac_script" - done - echo "$ac_script" 2>/dev/null | sed 99q >conftest.sed - { ac_script=; unset ac_script;} - if test -z "$SED"; then - ac_path_SED_found=false - # Loop through the user's path and test for each of PROGNAME-LIST - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_prog in sed gsed; do - for ac_exec_ext in '' $ac_executable_extensions; do - ac_path_SED="$as_dir/$ac_prog$ac_exec_ext" - as_fn_executable_p "$ac_path_SED" || continue -# Check for GNU ac_path_SED and select it if it is found. - # Check for GNU $ac_path_SED -case `"$ac_path_SED" --version 2>&1` in -*GNU*) - ac_cv_path_SED="$ac_path_SED" ac_path_SED_found=:;; -*) - ac_count=0 - $as_echo_n 0123456789 >"conftest.in" - while : - do - cat "conftest.in" "conftest.in" >"conftest.tmp" - mv "conftest.tmp" "conftest.in" - cp "conftest.in" "conftest.nl" - $as_echo '' >> "conftest.nl" - "$ac_path_SED" -f conftest.sed < "conftest.nl" >"conftest.out" 2>/dev/null || break - diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break - as_fn_arith $ac_count + 1 && ac_count=$as_val - if test $ac_count -gt ${ac_path_SED_max-0}; then - # Best one so far, save it but keep looking for a better one - ac_cv_path_SED="$ac_path_SED" - ac_path_SED_max=$ac_count - fi - # 10*(2^10) chars as input seems more than enough - test $ac_count -gt 10 && break - done - rm -f conftest.in conftest.tmp conftest.nl conftest.out;; -esac - - $ac_path_SED_found && break 3 - done - done - done -IFS=$as_save_IFS - if test -z "$ac_cv_path_SED"; then - as_fn_error $? "no acceptable sed could be found in \$PATH" "$LINENO" 5 - fi -else - ac_cv_path_SED=$SED -fi - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_SED" >&5 -$as_echo "$ac_cv_path_SED" >&6; } - SED="$ac_cv_path_SED" - rm -f conftest.sed - -test -z "$SED" && SED=sed -Xsed="$SED -e 1s/^X//" - - - - - - - - - - - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for grep that handles long lines and -e" >&5 -$as_echo_n "checking for grep that handles long lines and -e... " >&6; } -if ${ac_cv_path_GREP+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -z "$GREP"; then - ac_path_GREP_found=false - # Loop through the user's path and test for each of PROGNAME-LIST - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_prog in grep ggrep; do - for ac_exec_ext in '' $ac_executable_extensions; do - ac_path_GREP="$as_dir/$ac_prog$ac_exec_ext" - as_fn_executable_p "$ac_path_GREP" || continue -# Check for GNU ac_path_GREP and select it if it is found. - # Check for GNU $ac_path_GREP -case `"$ac_path_GREP" --version 2>&1` in -*GNU*) - ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_found=:;; -*) - ac_count=0 - $as_echo_n 0123456789 >"conftest.in" - while : - do - cat "conftest.in" "conftest.in" >"conftest.tmp" - mv "conftest.tmp" "conftest.in" - cp "conftest.in" "conftest.nl" - $as_echo 'GREP' >> "conftest.nl" - "$ac_path_GREP" -e 'GREP$' -e '-(cannot match)-' < "conftest.nl" >"conftest.out" 2>/dev/null || break - diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break - as_fn_arith $ac_count + 1 && ac_count=$as_val - if test $ac_count -gt ${ac_path_GREP_max-0}; then - # Best one so far, save it but keep looking for a better one - ac_cv_path_GREP="$ac_path_GREP" - ac_path_GREP_max=$ac_count - fi - # 10*(2^10) chars as input seems more than enough - test $ac_count -gt 10 && break - done - rm -f conftest.in conftest.tmp conftest.nl conftest.out;; -esac - - $ac_path_GREP_found && break 3 - done - done - done -IFS=$as_save_IFS - if test -z "$ac_cv_path_GREP"; then - as_fn_error $? "no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 - fi -else - ac_cv_path_GREP=$GREP -fi - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_GREP" >&5 -$as_echo "$ac_cv_path_GREP" >&6; } - GREP="$ac_cv_path_GREP" - - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for egrep" >&5 -$as_echo_n "checking for egrep... " >&6; } -if ${ac_cv_path_EGREP+:} false; then : - $as_echo_n "(cached) " >&6 -else - if echo a | $GREP -E '(a|b)' >/dev/null 2>&1 - then ac_cv_path_EGREP="$GREP -E" - else - if test -z "$EGREP"; then - ac_path_EGREP_found=false - # Loop through the user's path and test for each of PROGNAME-LIST - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_prog in egrep; do - for ac_exec_ext in '' $ac_executable_extensions; do - ac_path_EGREP="$as_dir/$ac_prog$ac_exec_ext" - as_fn_executable_p "$ac_path_EGREP" || continue -# Check for GNU ac_path_EGREP and select it if it is found. - # Check for GNU $ac_path_EGREP -case `"$ac_path_EGREP" --version 2>&1` in -*GNU*) - ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_found=:;; -*) - ac_count=0 - $as_echo_n 0123456789 >"conftest.in" - while : - do - cat "conftest.in" "conftest.in" >"conftest.tmp" - mv "conftest.tmp" "conftest.in" - cp "conftest.in" "conftest.nl" - $as_echo 'EGREP' >> "conftest.nl" - "$ac_path_EGREP" 'EGREP$' < "conftest.nl" >"conftest.out" 2>/dev/null || break - diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break - as_fn_arith $ac_count + 1 && ac_count=$as_val - if test $ac_count -gt ${ac_path_EGREP_max-0}; then - # Best one so far, save it but keep looking for a better one - ac_cv_path_EGREP="$ac_path_EGREP" - ac_path_EGREP_max=$ac_count - fi - # 10*(2^10) chars as input seems more than enough - test $ac_count -gt 10 && break - done - rm -f conftest.in conftest.tmp conftest.nl conftest.out;; -esac - - $ac_path_EGREP_found && break 3 - done - done - done -IFS=$as_save_IFS - if test -z "$ac_cv_path_EGREP"; then - as_fn_error $? "no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 - fi -else - ac_cv_path_EGREP=$EGREP -fi - - fi -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_EGREP" >&5 -$as_echo "$ac_cv_path_EGREP" >&6; } - EGREP="$ac_cv_path_EGREP" - - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for fgrep" >&5 -$as_echo_n "checking for fgrep... " >&6; } -if ${ac_cv_path_FGREP+:} false; then : - $as_echo_n "(cached) " >&6 -else - if echo 'ab*c' | $GREP -F 'ab*c' >/dev/null 2>&1 - then ac_cv_path_FGREP="$GREP -F" - else - if test -z "$FGREP"; then - ac_path_FGREP_found=false - # Loop through the user's path and test for each of PROGNAME-LIST - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_prog in fgrep; do - for ac_exec_ext in '' $ac_executable_extensions; do - ac_path_FGREP="$as_dir/$ac_prog$ac_exec_ext" - as_fn_executable_p "$ac_path_FGREP" || continue -# Check for GNU ac_path_FGREP and select it if it is found. - # Check for GNU $ac_path_FGREP -case `"$ac_path_FGREP" --version 2>&1` in -*GNU*) - ac_cv_path_FGREP="$ac_path_FGREP" ac_path_FGREP_found=:;; -*) - ac_count=0 - $as_echo_n 0123456789 >"conftest.in" - while : - do - cat "conftest.in" "conftest.in" >"conftest.tmp" - mv "conftest.tmp" "conftest.in" - cp "conftest.in" "conftest.nl" - $as_echo 'FGREP' >> "conftest.nl" - "$ac_path_FGREP" FGREP < "conftest.nl" >"conftest.out" 2>/dev/null || break - diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break - as_fn_arith $ac_count + 1 && ac_count=$as_val - if test $ac_count -gt ${ac_path_FGREP_max-0}; then - # Best one so far, save it but keep looking for a better one - ac_cv_path_FGREP="$ac_path_FGREP" - ac_path_FGREP_max=$ac_count - fi - # 10*(2^10) chars as input seems more than enough - test $ac_count -gt 10 && break - done - rm -f conftest.in conftest.tmp conftest.nl conftest.out;; -esac - - $ac_path_FGREP_found && break 3 - done - done - done -IFS=$as_save_IFS - if test -z "$ac_cv_path_FGREP"; then - as_fn_error $? "no acceptable fgrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 - fi -else - ac_cv_path_FGREP=$FGREP -fi - - fi -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_FGREP" >&5 -$as_echo "$ac_cv_path_FGREP" >&6; } - FGREP="$ac_cv_path_FGREP" - - -test -z "$GREP" && GREP=grep - - - - - - - - - - - - - - - - - - - -@%:@ Check whether --with-gnu-ld was given. -if test "${with_gnu_ld+set}" = set; then : - withval=$with_gnu_ld; test "$withval" = no || with_gnu_ld=yes -else - with_gnu_ld=no -fi - -ac_prog=ld -if test "$GCC" = yes; then - # Check if gcc -print-prog-name=ld gives a path. - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ld used by $CC" >&5 -$as_echo_n "checking for ld used by $CC... " >&6; } - case $host in - *-*-mingw*) - # gcc leaves a trailing carriage return which upsets mingw - ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;; - *) - ac_prog=`($CC -print-prog-name=ld) 2>&5` ;; - esac - case $ac_prog in - # Accept absolute paths. - [\\/]* | ?:[\\/]*) - re_direlt='/[^/][^/]*/\.\./' - # Canonicalize the pathname of ld - ac_prog=`$ECHO "$ac_prog"| $SED 's%\\\\%/%g'` - while $ECHO "$ac_prog" | $GREP "$re_direlt" > /dev/null 2>&1; do - ac_prog=`$ECHO $ac_prog| $SED "s%$re_direlt%/%"` - done - test -z "$LD" && LD="$ac_prog" - ;; - "") - # If it fails, then pretend we aren't using GCC. - ac_prog=ld - ;; - *) - # If it is relative, then search for the first ld in PATH. - with_gnu_ld=unknown - ;; - esac -elif test "$with_gnu_ld" = yes; then - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU ld" >&5 -$as_echo_n "checking for GNU ld... " >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for non-GNU ld" >&5 -$as_echo_n "checking for non-GNU ld... " >&6; } -fi -if ${lt_cv_path_LD+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -z "$LD"; then - lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR - for ac_dir in $PATH; do - IFS="$lt_save_ifs" - test -z "$ac_dir" && ac_dir=. - if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then - lt_cv_path_LD="$ac_dir/$ac_prog" - # Check to see if the program is GNU ld. I'd rather use --version, - # but apparently some variants of GNU ld only accept -v. - # Break only if it was the GNU/non-GNU ld that we prefer. - case `"$lt_cv_path_LD" -v 2>&1 &5 -$as_echo "$LD" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi -test -z "$LD" && as_fn_error $? "no acceptable ld found in \$PATH" "$LINENO" 5 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if the linker ($LD) is GNU ld" >&5 -$as_echo_n "checking if the linker ($LD) is GNU ld... " >&6; } -if ${lt_cv_prog_gnu_ld+:} false; then : - $as_echo_n "(cached) " >&6 -else - # I'd rather use --version here, but apparently some GNU lds only accept -v. -case `$LD -v 2>&1 &5 -$as_echo "$lt_cv_prog_gnu_ld" >&6; } -with_gnu_ld=$lt_cv_prog_gnu_ld - - - - - - - - - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for BSD- or MS-compatible name lister (nm)" >&5 -$as_echo_n "checking for BSD- or MS-compatible name lister (nm)... " >&6; } -if ${lt_cv_path_NM+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$NM"; then - # Let the user override the test. - lt_cv_path_NM="$NM" -else - lt_nm_to_check="${ac_tool_prefix}nm" - if test -n "$ac_tool_prefix" && test "$build" = "$host"; then - lt_nm_to_check="$lt_nm_to_check nm" - fi - for lt_tmp_nm in $lt_nm_to_check; do - lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR - for ac_dir in $PATH /usr/ccs/bin/elf /usr/ccs/bin /usr/ucb /bin; do - IFS="$lt_save_ifs" - test -z "$ac_dir" && ac_dir=. - tmp_nm="$ac_dir/$lt_tmp_nm" - if test -f "$tmp_nm" || test -f "$tmp_nm$ac_exeext" ; then - # Check to see if the nm accepts a BSD-compat flag. - # Adding the `sed 1q' prevents false positives on HP-UX, which says: - # nm: unknown option "B" ignored - # Tru64's nm complains that /dev/null is an invalid object file - case `"$tmp_nm" -B /dev/null 2>&1 | sed '1q'` in - */dev/null* | *'Invalid file or object type'*) - lt_cv_path_NM="$tmp_nm -B" - break - ;; - *) - case `"$tmp_nm" -p /dev/null 2>&1 | sed '1q'` in - */dev/null*) - lt_cv_path_NM="$tmp_nm -p" - break - ;; - *) - lt_cv_path_NM=${lt_cv_path_NM="$tmp_nm"} # keep the first match, but - continue # so that we can try to find one that supports BSD flags - ;; - esac - ;; - esac - fi - done - IFS="$lt_save_ifs" - done - : ${lt_cv_path_NM=no} -fi -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_path_NM" >&5 -$as_echo "$lt_cv_path_NM" >&6; } -if test "$lt_cv_path_NM" != "no"; then - NM="$lt_cv_path_NM" -else - # Didn't find any BSD compatible name lister, look for dumpbin. - if test -n "$DUMPBIN"; then : - # Let the user override the test. - else - if test -n "$ac_tool_prefix"; then - for ac_prog in dumpbin "link -dump" - do - # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. -set dummy $ac_tool_prefix$ac_prog; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_DUMPBIN+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$DUMPBIN"; then - ac_cv_prog_DUMPBIN="$DUMPBIN" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_DUMPBIN="$ac_tool_prefix$ac_prog" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -DUMPBIN=$ac_cv_prog_DUMPBIN -if test -n "$DUMPBIN"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DUMPBIN" >&5 -$as_echo "$DUMPBIN" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - - test -n "$DUMPBIN" && break - done -fi -if test -z "$DUMPBIN"; then - ac_ct_DUMPBIN=$DUMPBIN - for ac_prog in dumpbin "link -dump" -do - # Extract the first word of "$ac_prog", so it can be a program name with args. -set dummy $ac_prog; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_ac_ct_DUMPBIN+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$ac_ct_DUMPBIN"; then - ac_cv_prog_ac_ct_DUMPBIN="$ac_ct_DUMPBIN" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_ac_ct_DUMPBIN="$ac_prog" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -ac_ct_DUMPBIN=$ac_cv_prog_ac_ct_DUMPBIN -if test -n "$ac_ct_DUMPBIN"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DUMPBIN" >&5 -$as_echo "$ac_ct_DUMPBIN" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - - test -n "$ac_ct_DUMPBIN" && break -done - - if test "x$ac_ct_DUMPBIN" = x; then - DUMPBIN=":" - else - case $cross_compiling:$ac_tool_warned in -yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} -ac_tool_warned=yes ;; -esac - DUMPBIN=$ac_ct_DUMPBIN - fi -fi - - case `$DUMPBIN -symbols /dev/null 2>&1 | sed '1q'` in - *COFF*) - DUMPBIN="$DUMPBIN -symbols" - ;; - *) - DUMPBIN=: - ;; - esac - fi - - if test "$DUMPBIN" != ":"; then - NM="$DUMPBIN" - fi -fi -test -z "$NM" && NM=nm - - - - - - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking the name lister ($NM) interface" >&5 -$as_echo_n "checking the name lister ($NM) interface... " >&6; } -if ${lt_cv_nm_interface+:} false; then : - $as_echo_n "(cached) " >&6 -else - lt_cv_nm_interface="BSD nm" - echo "int some_variable = 0;" > conftest.$ac_ext - (eval echo "\"\$as_me:$LINENO: $ac_compile\"" >&5) - (eval "$ac_compile" 2>conftest.err) - cat conftest.err >&5 - (eval echo "\"\$as_me:$LINENO: $NM \\\"conftest.$ac_objext\\\"\"" >&5) - (eval "$NM \"conftest.$ac_objext\"" 2>conftest.err > conftest.out) - cat conftest.err >&5 - (eval echo "\"\$as_me:$LINENO: output\"" >&5) - cat conftest.out >&5 - if $GREP 'External.*some_variable' conftest.out > /dev/null; then - lt_cv_nm_interface="MS dumpbin" - fi - rm -f conftest* -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_nm_interface" >&5 -$as_echo "$lt_cv_nm_interface" >&6; } - -# find the maximum length of command line arguments -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking the maximum length of command line arguments" >&5 -$as_echo_n "checking the maximum length of command line arguments... " >&6; } -if ${lt_cv_sys_max_cmd_len+:} false; then : - $as_echo_n "(cached) " >&6 -else - i=0 - teststring="ABCD" - - case $build_os in - msdosdjgpp*) - # On DJGPP, this test can blow up pretty badly due to problems in libc - # (any single argument exceeding 2000 bytes causes a buffer overrun - # during glob expansion). Even if it were fixed, the result of this - # check would be larger than it should be. - lt_cv_sys_max_cmd_len=12288; # 12K is about right - ;; - - gnu*) - # Under GNU Hurd, this test is not required because there is - # no limit to the length of command line arguments. - # Libtool will interpret -1 as no limit whatsoever - lt_cv_sys_max_cmd_len=-1; - ;; - - cygwin* | mingw* | cegcc*) - # On Win9x/ME, this test blows up -- it succeeds, but takes - # about 5 minutes as the teststring grows exponentially. - # Worse, since 9x/ME are not pre-emptively multitasking, - # you end up with a "frozen" computer, even though with patience - # the test eventually succeeds (with a max line length of 256k). - # Instead, let's just punt: use the minimum linelength reported by - # all of the supported platforms: 8192 (on NT/2K/XP). - lt_cv_sys_max_cmd_len=8192; - ;; - - mint*) - # On MiNT this can take a long time and run out of memory. - lt_cv_sys_max_cmd_len=8192; - ;; - - amigaos*) - # On AmigaOS with pdksh, this test takes hours, literally. - # So we just punt and use a minimum line length of 8192. - lt_cv_sys_max_cmd_len=8192; - ;; - - netbsd* | freebsd* | openbsd* | darwin* | dragonfly*) - # This has been around since 386BSD, at least. Likely further. - if test -x /sbin/sysctl; then - lt_cv_sys_max_cmd_len=`/sbin/sysctl -n kern.argmax` - elif test -x /usr/sbin/sysctl; then - lt_cv_sys_max_cmd_len=`/usr/sbin/sysctl -n kern.argmax` - else - lt_cv_sys_max_cmd_len=65536 # usable default for all BSDs - fi - # And add a safety zone - lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` - lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` - ;; - - interix*) - # We know the value 262144 and hardcode it with a safety zone (like BSD) - lt_cv_sys_max_cmd_len=196608 - ;; - - os2*) - # The test takes a long time on OS/2. - lt_cv_sys_max_cmd_len=8192 - ;; - - osf*) - # Dr. Hans Ekkehard Plesser reports seeing a kernel panic running configure - # due to this test when exec_disable_arg_limit is 1 on Tru64. It is not - # nice to cause kernel panics so lets avoid the loop below. - # First set a reasonable default. - lt_cv_sys_max_cmd_len=16384 - # - if test -x /sbin/sysconfig; then - case `/sbin/sysconfig -q proc exec_disable_arg_limit` in - *1*) lt_cv_sys_max_cmd_len=-1 ;; - esac - fi - ;; - sco3.2v5*) - lt_cv_sys_max_cmd_len=102400 - ;; - sysv5* | sco5v6* | sysv4.2uw2*) - kargmax=`grep ARG_MAX /etc/conf/cf.d/stune 2>/dev/null` - if test -n "$kargmax"; then - lt_cv_sys_max_cmd_len=`echo $kargmax | sed 's/.*[ ]//'` - else - lt_cv_sys_max_cmd_len=32768 - fi - ;; - *) - lt_cv_sys_max_cmd_len=`(getconf ARG_MAX) 2> /dev/null` - if test -n "$lt_cv_sys_max_cmd_len"; then - lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` - lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` - else - # Make teststring a little bigger before we do anything with it. - # a 1K string should be a reasonable start. - for i in 1 2 3 4 5 6 7 8 ; do - teststring=$teststring$teststring - done - SHELL=${SHELL-${CONFIG_SHELL-/bin/sh}} - # If test is not a shell built-in, we'll probably end up computing a - # maximum length that is only half of the actual maximum length, but - # we can't tell. - while { test "X"`env echo "$teststring$teststring" 2>/dev/null` \ - = "X$teststring$teststring"; } >/dev/null 2>&1 && - test $i != 17 # 1/2 MB should be enough - do - i=`expr $i + 1` - teststring=$teststring$teststring - done - # Only check the string length outside the loop. - lt_cv_sys_max_cmd_len=`expr "X$teststring" : ".*" 2>&1` - teststring= - # Add a significant safety factor because C++ compilers can tack on - # massive amounts of additional arguments before passing them to the - # linker. It appears as though 1/2 is a usable value. - lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 2` - fi - ;; - esac - -fi - -if test -n $lt_cv_sys_max_cmd_len ; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_sys_max_cmd_len" >&5 -$as_echo "$lt_cv_sys_max_cmd_len" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: none" >&5 -$as_echo "none" >&6; } -fi -max_cmd_len=$lt_cv_sys_max_cmd_len - - - - - - -: ${CP="cp -f"} -: ${MV="mv -f"} -: ${RM="rm -f"} - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the shell understands some XSI constructs" >&5 -$as_echo_n "checking whether the shell understands some XSI constructs... " >&6; } -# Try some XSI features -xsi_shell=no -( _lt_dummy="a/b/c" - test "${_lt_dummy##*/},${_lt_dummy%/*},${_lt_dummy#??}"${_lt_dummy%"$_lt_dummy"}, \ - = c,a/b,b/c, \ - && eval 'test $(( 1 + 1 )) -eq 2 \ - && test "${#_lt_dummy}" -eq 5' ) >/dev/null 2>&1 \ - && xsi_shell=yes -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $xsi_shell" >&5 -$as_echo "$xsi_shell" >&6; } - - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the shell understands \"+=\"" >&5 -$as_echo_n "checking whether the shell understands \"+=\"... " >&6; } -lt_shell_append=no -( foo=bar; set foo baz; eval "$1+=\$2" && test "$foo" = barbaz ) \ - >/dev/null 2>&1 \ - && lt_shell_append=yes -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_shell_append" >&5 -$as_echo "$lt_shell_append" >&6; } - - -if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then - lt_unset=unset -else - lt_unset=false -fi - - - - - -# test EBCDIC or ASCII -case `echo X|tr X '\101'` in - A) # ASCII based system - # \n is not interpreted correctly by Solaris 8 /usr/ucb/tr - lt_SP2NL='tr \040 \012' - lt_NL2SP='tr \015\012 \040\040' - ;; - *) # EBCDIC based system - lt_SP2NL='tr \100 \n' - lt_NL2SP='tr \r\n \100\100' - ;; -esac - - - - - - - - - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to convert $build file names to $host format" >&5 -$as_echo_n "checking how to convert $build file names to $host format... " >&6; } -if ${lt_cv_to_host_file_cmd+:} false; then : - $as_echo_n "(cached) " >&6 -else - case $host in - *-*-mingw* ) - case $build in - *-*-mingw* ) # actually msys - lt_cv_to_host_file_cmd=func_convert_file_msys_to_w32 - ;; - *-*-cygwin* ) - lt_cv_to_host_file_cmd=func_convert_file_cygwin_to_w32 - ;; - * ) # otherwise, assume *nix - lt_cv_to_host_file_cmd=func_convert_file_nix_to_w32 - ;; - esac - ;; - *-*-cygwin* ) - case $build in - *-*-mingw* ) # actually msys - lt_cv_to_host_file_cmd=func_convert_file_msys_to_cygwin - ;; - *-*-cygwin* ) - lt_cv_to_host_file_cmd=func_convert_file_noop - ;; - * ) # otherwise, assume *nix - lt_cv_to_host_file_cmd=func_convert_file_nix_to_cygwin - ;; - esac - ;; - * ) # unhandled hosts (and "normal" native builds) - lt_cv_to_host_file_cmd=func_convert_file_noop - ;; -esac - -fi - -to_host_file_cmd=$lt_cv_to_host_file_cmd -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_to_host_file_cmd" >&5 -$as_echo "$lt_cv_to_host_file_cmd" >&6; } - - - - - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to convert $build file names to toolchain format" >&5 -$as_echo_n "checking how to convert $build file names to toolchain format... " >&6; } -if ${lt_cv_to_tool_file_cmd+:} false; then : - $as_echo_n "(cached) " >&6 -else - #assume ordinary cross tools, or native build. -lt_cv_to_tool_file_cmd=func_convert_file_noop -case $host in - *-*-mingw* ) - case $build in - *-*-mingw* ) # actually msys - lt_cv_to_tool_file_cmd=func_convert_file_msys_to_w32 - ;; - esac - ;; -esac - -fi - -to_tool_file_cmd=$lt_cv_to_tool_file_cmd -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_to_tool_file_cmd" >&5 -$as_echo "$lt_cv_to_tool_file_cmd" >&6; } - - - - - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $LD option to reload object files" >&5 -$as_echo_n "checking for $LD option to reload object files... " >&6; } -if ${lt_cv_ld_reload_flag+:} false; then : - $as_echo_n "(cached) " >&6 -else - lt_cv_ld_reload_flag='-r' -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_reload_flag" >&5 -$as_echo "$lt_cv_ld_reload_flag" >&6; } -reload_flag=$lt_cv_ld_reload_flag -case $reload_flag in -"" | " "*) ;; -*) reload_flag=" $reload_flag" ;; -esac -reload_cmds='$LD$reload_flag -o $output$reload_objs' -case $host_os in - cygwin* | mingw* | pw32* | cegcc*) - if test "$GCC" != yes; then - reload_cmds=false - fi - ;; - darwin*) - if test "$GCC" = yes; then - reload_cmds='$LTCC $LTCFLAGS -nostdlib ${wl}-r -o $output$reload_objs' - else - reload_cmds='$LD$reload_flag -o $output$reload_objs' - fi - ;; -esac - - - - - - - - - -if test -n "$ac_tool_prefix"; then - # Extract the first word of "${ac_tool_prefix}objdump", so it can be a program name with args. -set dummy ${ac_tool_prefix}objdump; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_OBJDUMP+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$OBJDUMP"; then - ac_cv_prog_OBJDUMP="$OBJDUMP" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_OBJDUMP="${ac_tool_prefix}objdump" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -OBJDUMP=$ac_cv_prog_OBJDUMP -if test -n "$OBJDUMP"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OBJDUMP" >&5 -$as_echo "$OBJDUMP" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - -fi -if test -z "$ac_cv_prog_OBJDUMP"; then - ac_ct_OBJDUMP=$OBJDUMP - # Extract the first word of "objdump", so it can be a program name with args. -set dummy objdump; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_ac_ct_OBJDUMP+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$ac_ct_OBJDUMP"; then - ac_cv_prog_ac_ct_OBJDUMP="$ac_ct_OBJDUMP" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_ac_ct_OBJDUMP="objdump" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -ac_ct_OBJDUMP=$ac_cv_prog_ac_ct_OBJDUMP -if test -n "$ac_ct_OBJDUMP"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OBJDUMP" >&5 -$as_echo "$ac_ct_OBJDUMP" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - if test "x$ac_ct_OBJDUMP" = x; then - OBJDUMP="false" - else - case $cross_compiling:$ac_tool_warned in -yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} -ac_tool_warned=yes ;; -esac - OBJDUMP=$ac_ct_OBJDUMP - fi -else - OBJDUMP="$ac_cv_prog_OBJDUMP" -fi - -test -z "$OBJDUMP" && OBJDUMP=objdump - - - - - - - - - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to recognize dependent libraries" >&5 -$as_echo_n "checking how to recognize dependent libraries... " >&6; } -if ${lt_cv_deplibs_check_method+:} false; then : - $as_echo_n "(cached) " >&6 -else - lt_cv_file_magic_cmd='$MAGIC_CMD' -lt_cv_file_magic_test_file= -lt_cv_deplibs_check_method='unknown' -# Need to set the preceding variable on all platforms that support -# interlibrary dependencies. -# 'none' -- dependencies not supported. -# `unknown' -- same as none, but documents that we really don't know. -# 'pass_all' -- all dependencies passed with no checks. -# 'test_compile' -- check by making test program. -# 'file_magic [[regex]]' -- check by looking for files in library path -# which responds to the $file_magic_cmd with a given extended regex. -# If you have `file' or equivalent on your system and you're not sure -# whether `pass_all' will *always* work, you probably want this one. - -case $host_os in -aix[4-9]*) - lt_cv_deplibs_check_method=pass_all - ;; - -beos*) - lt_cv_deplibs_check_method=pass_all - ;; - -bsdi[45]*) - lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (shared object|dynamic lib)' - lt_cv_file_magic_cmd='/usr/bin/file -L' - lt_cv_file_magic_test_file=/shlib/libc.so - ;; - -cygwin*) - # func_win32_libid is a shell function defined in ltmain.sh - lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL' - lt_cv_file_magic_cmd='func_win32_libid' - ;; - -mingw* | pw32*) - # Base MSYS/MinGW do not provide the 'file' command needed by - # func_win32_libid shell function, so use a weaker test based on 'objdump', - # unless we find 'file', for example because we are cross-compiling. - # func_win32_libid assumes BSD nm, so disallow it if using MS dumpbin. - if ( test "$lt_cv_nm_interface" = "BSD nm" && file / ) >/dev/null 2>&1; then - lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL' - lt_cv_file_magic_cmd='func_win32_libid' - else - # Keep this pattern in sync with the one in func_win32_libid. - lt_cv_deplibs_check_method='file_magic file format (pei*-i386(.*architecture: i386)?|pe-arm-wince|pe-x86-64)' - lt_cv_file_magic_cmd='$OBJDUMP -f' - fi - ;; - -cegcc*) - # use the weaker test based on 'objdump'. See mingw*. - lt_cv_deplibs_check_method='file_magic file format pe-arm-.*little(.*architecture: arm)?' - lt_cv_file_magic_cmd='$OBJDUMP -f' - ;; - -darwin* | rhapsody*) - lt_cv_deplibs_check_method=pass_all - ;; - -freebsd* | dragonfly*) - if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then - case $host_cpu in - i*86 ) - # Not sure whether the presence of OpenBSD here was a mistake. - # Let's accept both of them until this is cleared up. - lt_cv_deplibs_check_method='file_magic (FreeBSD|OpenBSD|DragonFly)/i[3-9]86 (compact )?demand paged shared library' - lt_cv_file_magic_cmd=/usr/bin/file - lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*` - ;; - esac - else - lt_cv_deplibs_check_method=pass_all - fi - ;; - -gnu*) - lt_cv_deplibs_check_method=pass_all - ;; - -haiku*) - lt_cv_deplibs_check_method=pass_all - ;; - -hpux10.20* | hpux11*) - lt_cv_file_magic_cmd=/usr/bin/file - case $host_cpu in - ia64*) - lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF-[0-9][0-9]) shared object file - IA64' - lt_cv_file_magic_test_file=/usr/lib/hpux32/libc.so - ;; - hppa*64*) - lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF[ -][0-9][0-9])(-bit)?( [LM]SB)? shared object( file)?[, -]* PA-RISC [0-9]\.[0-9]' - lt_cv_file_magic_test_file=/usr/lib/pa20_64/libc.sl - ;; - *) - lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|PA-RISC[0-9]\.[0-9]) shared library' - lt_cv_file_magic_test_file=/usr/lib/libc.sl - ;; - esac - ;; - -interix[3-9]*) - # PIC code is broken on Interix 3.x, that's why |\.a not |_pic\.a here - lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so|\.a)$' - ;; - -irix5* | irix6* | nonstopux*) - case $LD in - *-32|*"-32 ") libmagic=32-bit;; - *-n32|*"-n32 ") libmagic=N32;; - *-64|*"-64 ") libmagic=64-bit;; - *) libmagic=never-match;; - esac - lt_cv_deplibs_check_method=pass_all - ;; - -# This must be glibc/ELF. -linux* | k*bsd*-gnu | kopensolaris*-gnu) - lt_cv_deplibs_check_method=pass_all - ;; - -netbsd* | netbsdelf*-gnu) - if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then - lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|_pic\.a)$' - else - lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so|_pic\.a)$' - fi - ;; - -newos6*) - lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (executable|dynamic lib)' - lt_cv_file_magic_cmd=/usr/bin/file - lt_cv_file_magic_test_file=/usr/lib/libnls.so - ;; - -*nto* | *qnx*) - lt_cv_deplibs_check_method=pass_all - ;; - -openbsd*) - if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then - lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|\.so|_pic\.a)$' - else - lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|_pic\.a)$' - fi - ;; - -osf3* | osf4* | osf5*) - lt_cv_deplibs_check_method=pass_all - ;; - -rdos*) - lt_cv_deplibs_check_method=pass_all - ;; - -solaris*) - lt_cv_deplibs_check_method=pass_all - ;; - -sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) - lt_cv_deplibs_check_method=pass_all - ;; - -sysv4 | sysv4.3*) - case $host_vendor in - motorola) - lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (shared object|dynamic lib) M[0-9][0-9]* Version [0-9]' - lt_cv_file_magic_test_file=`echo /usr/lib/libc.so*` - ;; - ncr) - lt_cv_deplibs_check_method=pass_all - ;; - sequent) - lt_cv_file_magic_cmd='/bin/file' - lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [LM]SB (shared object|dynamic lib )' - ;; - sni) - lt_cv_file_magic_cmd='/bin/file' - lt_cv_deplibs_check_method="file_magic ELF [0-9][0-9]*-bit [LM]SB dynamic lib" - lt_cv_file_magic_test_file=/lib/libc.so - ;; - siemens) - lt_cv_deplibs_check_method=pass_all - ;; - pc) - lt_cv_deplibs_check_method=pass_all - ;; - esac - ;; - -tpf*) - lt_cv_deplibs_check_method=pass_all - ;; -esac - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_deplibs_check_method" >&5 -$as_echo "$lt_cv_deplibs_check_method" >&6; } - -file_magic_glob= -want_nocaseglob=no -if test "$build" = "$host"; then - case $host_os in - mingw* | pw32*) - if ( shopt | grep nocaseglob ) >/dev/null 2>&1; then - want_nocaseglob=yes - else - file_magic_glob=`echo aAbBcCdDeEfFgGhHiIjJkKlLmMnNoOpPqQrRsStTuUvVwWxXyYzZ | $SED -e "s/\(..\)/s\/[\1]\/[\1]\/g;/g"` - fi - ;; - esac -fi - -file_magic_cmd=$lt_cv_file_magic_cmd -deplibs_check_method=$lt_cv_deplibs_check_method -test -z "$deplibs_check_method" && deplibs_check_method=unknown - - - - - - - - - - - - - - - - - - - - - - -if test -n "$ac_tool_prefix"; then - # Extract the first word of "${ac_tool_prefix}dlltool", so it can be a program name with args. -set dummy ${ac_tool_prefix}dlltool; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_DLLTOOL+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$DLLTOOL"; then - ac_cv_prog_DLLTOOL="$DLLTOOL" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_DLLTOOL="${ac_tool_prefix}dlltool" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -DLLTOOL=$ac_cv_prog_DLLTOOL -if test -n "$DLLTOOL"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DLLTOOL" >&5 -$as_echo "$DLLTOOL" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - -fi -if test -z "$ac_cv_prog_DLLTOOL"; then - ac_ct_DLLTOOL=$DLLTOOL - # Extract the first word of "dlltool", so it can be a program name with args. -set dummy dlltool; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_ac_ct_DLLTOOL+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$ac_ct_DLLTOOL"; then - ac_cv_prog_ac_ct_DLLTOOL="$ac_ct_DLLTOOL" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_ac_ct_DLLTOOL="dlltool" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -ac_ct_DLLTOOL=$ac_cv_prog_ac_ct_DLLTOOL -if test -n "$ac_ct_DLLTOOL"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DLLTOOL" >&5 -$as_echo "$ac_ct_DLLTOOL" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - if test "x$ac_ct_DLLTOOL" = x; then - DLLTOOL="false" - else - case $cross_compiling:$ac_tool_warned in -yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} -ac_tool_warned=yes ;; -esac - DLLTOOL=$ac_ct_DLLTOOL - fi -else - DLLTOOL="$ac_cv_prog_DLLTOOL" -fi - -test -z "$DLLTOOL" && DLLTOOL=dlltool - - - - - - - - - - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to associate runtime and link libraries" >&5 -$as_echo_n "checking how to associate runtime and link libraries... " >&6; } -if ${lt_cv_sharedlib_from_linklib_cmd+:} false; then : - $as_echo_n "(cached) " >&6 -else - lt_cv_sharedlib_from_linklib_cmd='unknown' - -case $host_os in -cygwin* | mingw* | pw32* | cegcc*) - # two different shell functions defined in ltmain.sh - # decide which to use based on capabilities of $DLLTOOL - case `$DLLTOOL --help 2>&1` in - *--identify-strict*) - lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib - ;; - *) - lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib_fallback - ;; - esac - ;; -*) - # fallback: assume linklib IS sharedlib - lt_cv_sharedlib_from_linklib_cmd="$ECHO" - ;; -esac - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_sharedlib_from_linklib_cmd" >&5 -$as_echo "$lt_cv_sharedlib_from_linklib_cmd" >&6; } -sharedlib_from_linklib_cmd=$lt_cv_sharedlib_from_linklib_cmd -test -z "$sharedlib_from_linklib_cmd" && sharedlib_from_linklib_cmd=$ECHO - - - - - - - - -if test -n "$ac_tool_prefix"; then - for ac_prog in ar - do - # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. -set dummy $ac_tool_prefix$ac_prog; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_AR+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$AR"; then - ac_cv_prog_AR="$AR" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_AR="$ac_tool_prefix$ac_prog" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -AR=$ac_cv_prog_AR -if test -n "$AR"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AR" >&5 -$as_echo "$AR" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - - test -n "$AR" && break - done -fi -if test -z "$AR"; then - ac_ct_AR=$AR - for ac_prog in ar -do - # Extract the first word of "$ac_prog", so it can be a program name with args. -set dummy $ac_prog; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_ac_ct_AR+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$ac_ct_AR"; then - ac_cv_prog_ac_ct_AR="$ac_ct_AR" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_ac_ct_AR="$ac_prog" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -ac_ct_AR=$ac_cv_prog_ac_ct_AR -if test -n "$ac_ct_AR"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_AR" >&5 -$as_echo "$ac_ct_AR" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - - test -n "$ac_ct_AR" && break -done - - if test "x$ac_ct_AR" = x; then - AR="false" - else - case $cross_compiling:$ac_tool_warned in -yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} -ac_tool_warned=yes ;; -esac - AR=$ac_ct_AR - fi -fi - -: ${AR=ar} -: ${AR_FLAGS=cru} - - - - - - - - - - - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for archiver @FILE support" >&5 -$as_echo_n "checking for archiver @FILE support... " >&6; } -if ${lt_cv_ar_at_file+:} false; then : - $as_echo_n "(cached) " >&6 -else - lt_cv_ar_at_file=no - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -int -main () -{ - - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - echo conftest.$ac_objext > conftest.lst - lt_ar_try='$AR $AR_FLAGS libconftest.a @conftest.lst >&5' - { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$lt_ar_try\""; } >&5 - (eval $lt_ar_try) 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } - if test "$ac_status" -eq 0; then - # Ensure the archiver fails upon bogus file names. - rm -f conftest.$ac_objext libconftest.a - { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$lt_ar_try\""; } >&5 - (eval $lt_ar_try) 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } - if test "$ac_status" -ne 0; then - lt_cv_ar_at_file=@ - fi - fi - rm -f conftest.* libconftest.a - -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ar_at_file" >&5 -$as_echo "$lt_cv_ar_at_file" >&6; } - -if test "x$lt_cv_ar_at_file" = xno; then - archiver_list_spec= -else - archiver_list_spec=$lt_cv_ar_at_file -fi - - - - - - - -if test -n "$ac_tool_prefix"; then - # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args. -set dummy ${ac_tool_prefix}strip; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_STRIP+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$STRIP"; then - ac_cv_prog_STRIP="$STRIP" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_STRIP="${ac_tool_prefix}strip" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -STRIP=$ac_cv_prog_STRIP -if test -n "$STRIP"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $STRIP" >&5 -$as_echo "$STRIP" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - -fi -if test -z "$ac_cv_prog_STRIP"; then - ac_ct_STRIP=$STRIP - # Extract the first word of "strip", so it can be a program name with args. -set dummy strip; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_ac_ct_STRIP+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$ac_ct_STRIP"; then - ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_ac_ct_STRIP="strip" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP -if test -n "$ac_ct_STRIP"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP" >&5 -$as_echo "$ac_ct_STRIP" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - if test "x$ac_ct_STRIP" = x; then - STRIP=":" - else - case $cross_compiling:$ac_tool_warned in -yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} -ac_tool_warned=yes ;; -esac - STRIP=$ac_ct_STRIP - fi -else - STRIP="$ac_cv_prog_STRIP" -fi - -test -z "$STRIP" && STRIP=: - - - - - - -if test -n "$ac_tool_prefix"; then - # Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args. -set dummy ${ac_tool_prefix}ranlib; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_RANLIB+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$RANLIB"; then - ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -RANLIB=$ac_cv_prog_RANLIB -if test -n "$RANLIB"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $RANLIB" >&5 -$as_echo "$RANLIB" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - -fi -if test -z "$ac_cv_prog_RANLIB"; then - ac_ct_RANLIB=$RANLIB - # Extract the first word of "ranlib", so it can be a program name with args. -set dummy ranlib; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_ac_ct_RANLIB+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$ac_ct_RANLIB"; then - ac_cv_prog_ac_ct_RANLIB="$ac_ct_RANLIB" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_ac_ct_RANLIB="ranlib" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -ac_ct_RANLIB=$ac_cv_prog_ac_ct_RANLIB -if test -n "$ac_ct_RANLIB"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_RANLIB" >&5 -$as_echo "$ac_ct_RANLIB" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - if test "x$ac_ct_RANLIB" = x; then - RANLIB=":" - else - case $cross_compiling:$ac_tool_warned in -yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} -ac_tool_warned=yes ;; -esac - RANLIB=$ac_ct_RANLIB - fi -else - RANLIB="$ac_cv_prog_RANLIB" -fi - -test -z "$RANLIB" && RANLIB=: - - - - - - -# Determine commands to create old-style static archives. -old_archive_cmds='$AR $AR_FLAGS $oldlib$oldobjs' -old_postinstall_cmds='chmod 644 $oldlib' -old_postuninstall_cmds= - -if test -n "$RANLIB"; then - case $host_os in - openbsd*) - old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB -t \$tool_oldlib" - ;; - *) - old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB \$tool_oldlib" - ;; - esac - old_archive_cmds="$old_archive_cmds~\$RANLIB \$tool_oldlib" -fi - -case $host_os in - darwin*) - lock_old_archive_extraction=yes ;; - *) - lock_old_archive_extraction=no ;; -esac - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -# If no C compiler was specified, use CC. -LTCC=${LTCC-"$CC"} - -# If no C compiler flags were specified, use CFLAGS. -LTCFLAGS=${LTCFLAGS-"$CFLAGS"} - -# Allow CC to be a program name with arguments. -compiler=$CC - - -# Check for command to grab the raw symbol name followed by C symbol from nm. -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking command to parse $NM output from $compiler object" >&5 -$as_echo_n "checking command to parse $NM output from $compiler object... " >&6; } -if ${lt_cv_sys_global_symbol_pipe+:} false; then : - $as_echo_n "(cached) " >&6 -else - -# These are sane defaults that work on at least a few old systems. -# [They come from Ultrix. What could be older than Ultrix?!! ;)] - -# Character class describing NM global symbol codes. -symcode='[BCDEGRST]' - -# Regexp to match symbols that can be accessed directly from C. -sympat='\([_A-Za-z][_A-Za-z0-9]*\)' - -# Define system-specific variables. -case $host_os in -aix*) - symcode='[BCDT]' - ;; -cygwin* | mingw* | pw32* | cegcc*) - symcode='[ABCDGISTW]' - ;; -hpux*) - if test "$host_cpu" = ia64; then - symcode='[ABCDEGRST]' - fi - ;; -irix* | nonstopux*) - symcode='[BCDEGRST]' - ;; -osf*) - symcode='[BCDEGQRST]' - ;; -solaris*) - symcode='[BDRT]' - ;; -sco3.2v5*) - symcode='[DT]' - ;; -sysv4.2uw2*) - symcode='[DT]' - ;; -sysv5* | sco5v6* | unixware* | OpenUNIX*) - symcode='[ABDT]' - ;; -sysv4) - symcode='[DFNSTU]' - ;; -esac - -# If we're using GNU nm, then use its standard symbol codes. -case `$NM -V 2>&1` in -*GNU* | *'with BFD'*) - symcode='[ABCDGIRSTW]' ;; -esac - -# Transform an extracted symbol line into a proper C declaration. -# Some systems (esp. on ia64) link data and code symbols differently, -# so use this general approach. -lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^T .* \(.*\)$/extern int \1();/p' -e 's/^$symcode* .* \(.*\)$/extern char \1;/p'" - -# Transform an extracted symbol line into symbol name and symbol address -lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([^ ]*\)[ ]*$/ {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([^ ]*\) \([^ ]*\)$/ {\"\2\", (void *) \&\2},/p'" -lt_cv_sys_global_symbol_to_c_name_address_lib_prefix="sed -n -e 's/^: \([^ ]*\)[ ]*$/ {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([^ ]*\) \(lib[^ ]*\)$/ {\"\2\", (void *) \&\2},/p' -e 's/^$symcode* \([^ ]*\) \([^ ]*\)$/ {\"lib\2\", (void *) \&\2},/p'" - -# Handle CRLF in mingw tool chain -opt_cr= -case $build_os in -mingw*) - opt_cr=`$ECHO 'x\{0,1\}' | tr x '\015'` # option cr in regexp - ;; -esac - -# Try without a prefix underscore, then with it. -for ac_symprfx in "" "_"; do - - # Transform symcode, sympat, and symprfx into a raw symbol and a C symbol. - symxfrm="\\1 $ac_symprfx\\2 \\2" - - # Write the raw and C identifiers. - if test "$lt_cv_nm_interface" = "MS dumpbin"; then - # Fake it for dumpbin and say T for any non-static function - # and D for any global variable. - # Also find C++ and __fastcall symbols from MSVC++, - # which start with @ or ?. - lt_cv_sys_global_symbol_pipe="$AWK '"\ -" {last_section=section; section=\$ 3};"\ -" /^COFF SYMBOL TABLE/{for(i in hide) delete hide[i]};"\ -" /Section length .*#relocs.*(pick any)/{hide[last_section]=1};"\ -" \$ 0!~/External *\|/{next};"\ -" / 0+ UNDEF /{next}; / UNDEF \([^|]\)*()/{next};"\ -" {if(hide[section]) next};"\ -" {f=0}; \$ 0~/\(\).*\|/{f=1}; {printf f ? \"T \" : \"D \"};"\ -" {split(\$ 0, a, /\||\r/); split(a[2], s)};"\ -" s[1]~/^[@?]/{print s[1], s[1]; next};"\ -" s[1]~prfx {split(s[1],t,\"@\"); print t[1], substr(t[1],length(prfx))}"\ -" ' prfx=^$ac_symprfx" - else - lt_cv_sys_global_symbol_pipe="sed -n -e 's/^.*[ ]\($symcode$symcode*\)[ ][ ]*$ac_symprfx$sympat$opt_cr$/$symxfrm/p'" - fi - lt_cv_sys_global_symbol_pipe="$lt_cv_sys_global_symbol_pipe | sed '/ __gnu_lto/d'" - - # Check to see that the pipe works correctly. - pipe_works=no - - rm -f conftest* - cat > conftest.$ac_ext <<_LT_EOF -#ifdef __cplusplus -extern "C" { -#endif -char nm_test_var; -void nm_test_func(void); -void nm_test_func(void){} -#ifdef __cplusplus -} -#endif -int main(){nm_test_var='a';nm_test_func();return(0);} -_LT_EOF - - if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 - (eval $ac_compile) 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; }; then - # Now try to grab the symbols. - nlist=conftest.nm - if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$NM conftest.$ac_objext \| "$lt_cv_sys_global_symbol_pipe" \> $nlist\""; } >&5 - (eval $NM conftest.$ac_objext \| "$lt_cv_sys_global_symbol_pipe" \> $nlist) 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } && test -s "$nlist"; then - # Try sorting and uniquifying the output. - if sort "$nlist" | uniq > "$nlist"T; then - mv -f "$nlist"T "$nlist" - else - rm -f "$nlist"T - fi - - # Make sure that we snagged all the symbols we need. - if $GREP ' nm_test_var$' "$nlist" >/dev/null; then - if $GREP ' nm_test_func$' "$nlist" >/dev/null; then - cat <<_LT_EOF > conftest.$ac_ext -/* Keep this code in sync between libtool.m4, ltmain, lt_system.h, and tests. */ -#if defined(_WIN32) || defined(__CYGWIN__) || defined(_WIN32_WCE) -/* DATA imports from DLLs on WIN32 con't be const, because runtime - relocations are performed -- see ld's documentation on pseudo-relocs. */ -# define LT@&t@_DLSYM_CONST -#elif defined(__osf__) -/* This system does not cope well with relocations in const data. */ -# define LT@&t@_DLSYM_CONST -#else -# define LT@&t@_DLSYM_CONST const -#endif - -#ifdef __cplusplus -extern "C" { -#endif - -_LT_EOF - # Now generate the symbol file. - eval "$lt_cv_sys_global_symbol_to_cdecl"' < "$nlist" | $GREP -v main >> conftest.$ac_ext' - - cat <<_LT_EOF >> conftest.$ac_ext - -/* The mapping between symbol names and symbols. */ -LT@&t@_DLSYM_CONST struct { - const char *name; - void *address; -} -lt__PROGRAM__LTX_preloaded_symbols[] = -{ - { "@PROGRAM@", (void *) 0 }, -_LT_EOF - $SED "s/^$symcode$symcode* \(.*\) \(.*\)$/ {\"\2\", (void *) \&\2},/" < "$nlist" | $GREP -v main >> conftest.$ac_ext - cat <<\_LT_EOF >> conftest.$ac_ext - {0, (void *) 0} -}; - -/* This works around a problem in FreeBSD linker */ -#ifdef FREEBSD_WORKAROUND -static const void *lt_preloaded_setup() { - return lt__PROGRAM__LTX_preloaded_symbols; -} -#endif - -#ifdef __cplusplus -} -#endif -_LT_EOF - # Now try linking the two files. - mv conftest.$ac_objext conftstm.$ac_objext - lt_globsym_save_LIBS=$LIBS - lt_globsym_save_CFLAGS=$CFLAGS - LIBS="conftstm.$ac_objext" - CFLAGS="$CFLAGS$lt_prog_compiler_no_builtin_flag" - if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5 - (eval $ac_link) 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } && test -s conftest${ac_exeext}; then - pipe_works=yes - fi - LIBS=$lt_globsym_save_LIBS - CFLAGS=$lt_globsym_save_CFLAGS - else - echo "cannot find nm_test_func in $nlist" >&5 - fi - else - echo "cannot find nm_test_var in $nlist" >&5 - fi - else - echo "cannot run $lt_cv_sys_global_symbol_pipe" >&5 - fi - else - echo "$progname: failed program was:" >&5 - cat conftest.$ac_ext >&5 - fi - rm -rf conftest* conftst* - - # Do not use the global_symbol_pipe unless it works. - if test "$pipe_works" = yes; then - break - else - lt_cv_sys_global_symbol_pipe= - fi -done - -fi - -if test -z "$lt_cv_sys_global_symbol_pipe"; then - lt_cv_sys_global_symbol_to_cdecl= -fi -if test -z "$lt_cv_sys_global_symbol_pipe$lt_cv_sys_global_symbol_to_cdecl"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: failed" >&5 -$as_echo "failed" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: ok" >&5 -$as_echo "ok" >&6; } -fi - -# Response file support. -if test "$lt_cv_nm_interface" = "MS dumpbin"; then - nm_file_list_spec='@' -elif $NM --help 2>/dev/null | grep '[@]FILE' >/dev/null; then - nm_file_list_spec='@' -fi - - - - - - - - - - - - - - - - - - - - - - - - - - - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for sysroot" >&5 -$as_echo_n "checking for sysroot... " >&6; } - -@%:@ Check whether --with-sysroot was given. -if test "${with_sysroot+set}" = set; then : - withval=$with_sysroot; -else - with_sysroot=no -fi - - -lt_sysroot= -case ${with_sysroot} in #( - yes) - if test "$GCC" = yes; then - lt_sysroot=`$CC --print-sysroot 2>/dev/null` - fi - ;; #( - /*) - lt_sysroot=`echo "$with_sysroot" | sed -e "$sed_quote_subst"` - ;; #( - no|'') - ;; #( - *) - { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${with_sysroot}" >&5 -$as_echo "${with_sysroot}" >&6; } - as_fn_error $? "The sysroot must be an absolute path." "$LINENO" 5 - ;; -esac - - { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${lt_sysroot:-no}" >&5 -$as_echo "${lt_sysroot:-no}" >&6; } - - - - - -@%:@ Check whether --enable-libtool-lock was given. -if test "${enable_libtool_lock+set}" = set; then : - enableval=$enable_libtool_lock; -fi - -test "x$enable_libtool_lock" != xno && enable_libtool_lock=yes - -# Some flags need to be propagated to the compiler or linker for good -# libtool support. -case $host in -ia64-*-hpux*) - # Find out which ABI we are using. - echo 'int i;' > conftest.$ac_ext - if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 - (eval $ac_compile) 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; }; then - case `/usr/bin/file conftest.$ac_objext` in - *ELF-32*) - HPUX_IA64_MODE="32" - ;; - *ELF-64*) - HPUX_IA64_MODE="64" - ;; - esac - fi - rm -rf conftest* - ;; -*-*-irix6*) - # Find out which ABI we are using. - echo '#line '$LINENO' "configure"' > conftest.$ac_ext - if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 - (eval $ac_compile) 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; }; then - if test "$lt_cv_prog_gnu_ld" = yes; then - case `/usr/bin/file conftest.$ac_objext` in - *32-bit*) - LD="${LD-ld} -melf32bsmip" - ;; - *N32*) - LD="${LD-ld} -melf32bmipn32" - ;; - *64-bit*) - LD="${LD-ld} -melf64bmip" - ;; - esac - else - case `/usr/bin/file conftest.$ac_objext` in - *32-bit*) - LD="${LD-ld} -32" - ;; - *N32*) - LD="${LD-ld} -n32" - ;; - *64-bit*) - LD="${LD-ld} -64" - ;; - esac - fi - fi - rm -rf conftest* - ;; - -x86_64-*kfreebsd*-gnu|x86_64-*linux*|ppc*-*linux*|powerpc*-*linux*| \ -s390*-*linux*|s390*-*tpf*|sparc*-*linux*) - # Find out which ABI we are using. - echo 'int i;' > conftest.$ac_ext - if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 - (eval $ac_compile) 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; }; then - case `/usr/bin/file conftest.o` in - *32-bit*) - case $host in - x86_64-*kfreebsd*-gnu) - LD="${LD-ld} -m elf_i386_fbsd" - ;; - x86_64-*linux*) - LD="${LD-ld} -m elf_i386" - ;; - ppc64-*linux*|powerpc64-*linux*) - LD="${LD-ld} -m elf32ppclinux" - ;; - s390x-*linux*) - LD="${LD-ld} -m elf_s390" - ;; - sparc64-*linux*) - LD="${LD-ld} -m elf32_sparc" - ;; - esac - ;; - *64-bit*) - case $host in - x86_64-*kfreebsd*-gnu) - LD="${LD-ld} -m elf_x86_64_fbsd" - ;; - x86_64-*linux*) - LD="${LD-ld} -m elf_x86_64" - ;; - ppc*-*linux*|powerpc*-*linux*) - LD="${LD-ld} -m elf64ppc" - ;; - s390*-*linux*|s390*-*tpf*) - LD="${LD-ld} -m elf64_s390" - ;; - sparc*-*linux*) - LD="${LD-ld} -m elf64_sparc" - ;; - esac - ;; - esac - fi - rm -rf conftest* - ;; - -*-*-sco3.2v5*) - # On SCO OpenServer 5, we need -belf to get full-featured binaries. - SAVE_CFLAGS="$CFLAGS" - CFLAGS="$CFLAGS -belf" - { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler needs -belf" >&5 -$as_echo_n "checking whether the C compiler needs -belf... " >&6; } -if ${lt_cv_cc_needs_belf+:} false; then : - $as_echo_n "(cached) " >&6 -else - ac_ext=c -ac_cpp='$CPP $CPPFLAGS' -ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_c_compiler_gnu - - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -int -main () -{ - - ; - return 0; -} -_ACEOF -if ac_fn_c_try_link "$LINENO"; then : - lt_cv_cc_needs_belf=yes -else - lt_cv_cc_needs_belf=no -fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext - ac_ext=c -ac_cpp='$CPP $CPPFLAGS' -ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_c_compiler_gnu - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_cc_needs_belf" >&5 -$as_echo "$lt_cv_cc_needs_belf" >&6; } - if test x"$lt_cv_cc_needs_belf" != x"yes"; then - # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf - CFLAGS="$SAVE_CFLAGS" - fi - ;; -*-*solaris*) - # Find out which ABI we are using. - echo 'int i;' > conftest.$ac_ext - if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 - (eval $ac_compile) 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; }; then - case `/usr/bin/file conftest.o` in - *64-bit*) - case $lt_cv_prog_gnu_ld in - yes*) - case $host in - i?86-*-solaris*) - LD="${LD-ld} -m elf_x86_64" - ;; - sparc*-*-solaris*) - LD="${LD-ld} -m elf64_sparc" - ;; - esac - # GNU ld 2.21 introduced _sol2 emulations. Use them if available. - if ${LD-ld} -V | grep _sol2 >/dev/null 2>&1; then - LD="${LD-ld}_sol2" - fi - ;; - *) - if ${LD-ld} -64 -r -o conftest2.o conftest.o >/dev/null 2>&1; then - LD="${LD-ld} -64" - fi - ;; - esac - ;; - esac - fi - rm -rf conftest* - ;; -esac - -need_locks="$enable_libtool_lock" - -if test -n "$ac_tool_prefix"; then - # Extract the first word of "${ac_tool_prefix}mt", so it can be a program name with args. -set dummy ${ac_tool_prefix}mt; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_MANIFEST_TOOL+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$MANIFEST_TOOL"; then - ac_cv_prog_MANIFEST_TOOL="$MANIFEST_TOOL" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_MANIFEST_TOOL="${ac_tool_prefix}mt" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -MANIFEST_TOOL=$ac_cv_prog_MANIFEST_TOOL -if test -n "$MANIFEST_TOOL"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MANIFEST_TOOL" >&5 -$as_echo "$MANIFEST_TOOL" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - -fi -if test -z "$ac_cv_prog_MANIFEST_TOOL"; then - ac_ct_MANIFEST_TOOL=$MANIFEST_TOOL - # Extract the first word of "mt", so it can be a program name with args. -set dummy mt; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_ac_ct_MANIFEST_TOOL+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$ac_ct_MANIFEST_TOOL"; then - ac_cv_prog_ac_ct_MANIFEST_TOOL="$ac_ct_MANIFEST_TOOL" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_ac_ct_MANIFEST_TOOL="mt" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -ac_ct_MANIFEST_TOOL=$ac_cv_prog_ac_ct_MANIFEST_TOOL -if test -n "$ac_ct_MANIFEST_TOOL"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_MANIFEST_TOOL" >&5 -$as_echo "$ac_ct_MANIFEST_TOOL" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - if test "x$ac_ct_MANIFEST_TOOL" = x; then - MANIFEST_TOOL=":" - else - case $cross_compiling:$ac_tool_warned in -yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} -ac_tool_warned=yes ;; -esac - MANIFEST_TOOL=$ac_ct_MANIFEST_TOOL - fi -else - MANIFEST_TOOL="$ac_cv_prog_MANIFEST_TOOL" -fi - -test -z "$MANIFEST_TOOL" && MANIFEST_TOOL=mt -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if $MANIFEST_TOOL is a manifest tool" >&5 -$as_echo_n "checking if $MANIFEST_TOOL is a manifest tool... " >&6; } -if ${lt_cv_path_mainfest_tool+:} false; then : - $as_echo_n "(cached) " >&6 -else - lt_cv_path_mainfest_tool=no - echo "$as_me:$LINENO: $MANIFEST_TOOL '-?'" >&5 - $MANIFEST_TOOL '-?' 2>conftest.err > conftest.out - cat conftest.err >&5 - if $GREP 'Manifest Tool' conftest.out > /dev/null; then - lt_cv_path_mainfest_tool=yes - fi - rm -f conftest* -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_path_mainfest_tool" >&5 -$as_echo "$lt_cv_path_mainfest_tool" >&6; } -if test "x$lt_cv_path_mainfest_tool" != xyes; then - MANIFEST_TOOL=: -fi - - - - - - - case $host_os in - rhapsody* | darwin*) - if test -n "$ac_tool_prefix"; then - # Extract the first word of "${ac_tool_prefix}dsymutil", so it can be a program name with args. -set dummy ${ac_tool_prefix}dsymutil; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_DSYMUTIL+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$DSYMUTIL"; then - ac_cv_prog_DSYMUTIL="$DSYMUTIL" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_DSYMUTIL="${ac_tool_prefix}dsymutil" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -DSYMUTIL=$ac_cv_prog_DSYMUTIL -if test -n "$DSYMUTIL"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DSYMUTIL" >&5 -$as_echo "$DSYMUTIL" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - -fi -if test -z "$ac_cv_prog_DSYMUTIL"; then - ac_ct_DSYMUTIL=$DSYMUTIL - # Extract the first word of "dsymutil", so it can be a program name with args. -set dummy dsymutil; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_ac_ct_DSYMUTIL+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$ac_ct_DSYMUTIL"; then - ac_cv_prog_ac_ct_DSYMUTIL="$ac_ct_DSYMUTIL" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_ac_ct_DSYMUTIL="dsymutil" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -ac_ct_DSYMUTIL=$ac_cv_prog_ac_ct_DSYMUTIL -if test -n "$ac_ct_DSYMUTIL"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DSYMUTIL" >&5 -$as_echo "$ac_ct_DSYMUTIL" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - if test "x$ac_ct_DSYMUTIL" = x; then - DSYMUTIL=":" - else - case $cross_compiling:$ac_tool_warned in -yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} -ac_tool_warned=yes ;; -esac - DSYMUTIL=$ac_ct_DSYMUTIL - fi -else - DSYMUTIL="$ac_cv_prog_DSYMUTIL" -fi - - if test -n "$ac_tool_prefix"; then - # Extract the first word of "${ac_tool_prefix}nmedit", so it can be a program name with args. -set dummy ${ac_tool_prefix}nmedit; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_NMEDIT+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$NMEDIT"; then - ac_cv_prog_NMEDIT="$NMEDIT" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_NMEDIT="${ac_tool_prefix}nmedit" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -NMEDIT=$ac_cv_prog_NMEDIT -if test -n "$NMEDIT"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $NMEDIT" >&5 -$as_echo "$NMEDIT" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - -fi -if test -z "$ac_cv_prog_NMEDIT"; then - ac_ct_NMEDIT=$NMEDIT - # Extract the first word of "nmedit", so it can be a program name with args. -set dummy nmedit; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_ac_ct_NMEDIT+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$ac_ct_NMEDIT"; then - ac_cv_prog_ac_ct_NMEDIT="$ac_ct_NMEDIT" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_ac_ct_NMEDIT="nmedit" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -ac_ct_NMEDIT=$ac_cv_prog_ac_ct_NMEDIT -if test -n "$ac_ct_NMEDIT"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_NMEDIT" >&5 -$as_echo "$ac_ct_NMEDIT" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - if test "x$ac_ct_NMEDIT" = x; then - NMEDIT=":" - else - case $cross_compiling:$ac_tool_warned in -yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} -ac_tool_warned=yes ;; -esac - NMEDIT=$ac_ct_NMEDIT - fi -else - NMEDIT="$ac_cv_prog_NMEDIT" -fi - - if test -n "$ac_tool_prefix"; then - # Extract the first word of "${ac_tool_prefix}lipo", so it can be a program name with args. -set dummy ${ac_tool_prefix}lipo; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_LIPO+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$LIPO"; then - ac_cv_prog_LIPO="$LIPO" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_LIPO="${ac_tool_prefix}lipo" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -LIPO=$ac_cv_prog_LIPO -if test -n "$LIPO"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LIPO" >&5 -$as_echo "$LIPO" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - -fi -if test -z "$ac_cv_prog_LIPO"; then - ac_ct_LIPO=$LIPO - # Extract the first word of "lipo", so it can be a program name with args. -set dummy lipo; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_ac_ct_LIPO+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$ac_ct_LIPO"; then - ac_cv_prog_ac_ct_LIPO="$ac_ct_LIPO" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_ac_ct_LIPO="lipo" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -ac_ct_LIPO=$ac_cv_prog_ac_ct_LIPO -if test -n "$ac_ct_LIPO"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_LIPO" >&5 -$as_echo "$ac_ct_LIPO" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - if test "x$ac_ct_LIPO" = x; then - LIPO=":" - else - case $cross_compiling:$ac_tool_warned in -yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} -ac_tool_warned=yes ;; -esac - LIPO=$ac_ct_LIPO - fi -else - LIPO="$ac_cv_prog_LIPO" -fi - - if test -n "$ac_tool_prefix"; then - # Extract the first word of "${ac_tool_prefix}otool", so it can be a program name with args. -set dummy ${ac_tool_prefix}otool; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_OTOOL+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$OTOOL"; then - ac_cv_prog_OTOOL="$OTOOL" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_OTOOL="${ac_tool_prefix}otool" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -OTOOL=$ac_cv_prog_OTOOL -if test -n "$OTOOL"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OTOOL" >&5 -$as_echo "$OTOOL" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - -fi -if test -z "$ac_cv_prog_OTOOL"; then - ac_ct_OTOOL=$OTOOL - # Extract the first word of "otool", so it can be a program name with args. -set dummy otool; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_ac_ct_OTOOL+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$ac_ct_OTOOL"; then - ac_cv_prog_ac_ct_OTOOL="$ac_ct_OTOOL" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_ac_ct_OTOOL="otool" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -ac_ct_OTOOL=$ac_cv_prog_ac_ct_OTOOL -if test -n "$ac_ct_OTOOL"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OTOOL" >&5 -$as_echo "$ac_ct_OTOOL" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - if test "x$ac_ct_OTOOL" = x; then - OTOOL=":" - else - case $cross_compiling:$ac_tool_warned in -yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} -ac_tool_warned=yes ;; -esac - OTOOL=$ac_ct_OTOOL - fi -else - OTOOL="$ac_cv_prog_OTOOL" -fi - - if test -n "$ac_tool_prefix"; then - # Extract the first word of "${ac_tool_prefix}otool64", so it can be a program name with args. -set dummy ${ac_tool_prefix}otool64; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_OTOOL64+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$OTOOL64"; then - ac_cv_prog_OTOOL64="$OTOOL64" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_OTOOL64="${ac_tool_prefix}otool64" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -OTOOL64=$ac_cv_prog_OTOOL64 -if test -n "$OTOOL64"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OTOOL64" >&5 -$as_echo "$OTOOL64" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - -fi -if test -z "$ac_cv_prog_OTOOL64"; then - ac_ct_OTOOL64=$OTOOL64 - # Extract the first word of "otool64", so it can be a program name with args. -set dummy otool64; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_ac_ct_OTOOL64+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$ac_ct_OTOOL64"; then - ac_cv_prog_ac_ct_OTOOL64="$ac_ct_OTOOL64" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_ac_ct_OTOOL64="otool64" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -ac_ct_OTOOL64=$ac_cv_prog_ac_ct_OTOOL64 -if test -n "$ac_ct_OTOOL64"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OTOOL64" >&5 -$as_echo "$ac_ct_OTOOL64" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - if test "x$ac_ct_OTOOL64" = x; then - OTOOL64=":" - else - case $cross_compiling:$ac_tool_warned in -yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} -ac_tool_warned=yes ;; -esac - OTOOL64=$ac_ct_OTOOL64 - fi -else - OTOOL64="$ac_cv_prog_OTOOL64" -fi - - - - - - - - - - - - - - - - - - - - - - - - - - - - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -single_module linker flag" >&5 -$as_echo_n "checking for -single_module linker flag... " >&6; } -if ${lt_cv_apple_cc_single_mod+:} false; then : - $as_echo_n "(cached) " >&6 -else - lt_cv_apple_cc_single_mod=no - if test -z "${LT_MULTI_MODULE}"; then - # By default we will add the -single_module flag. You can override - # by either setting the environment variable LT_MULTI_MODULE - # non-empty at configure time, or by adding -multi_module to the - # link flags. - rm -rf libconftest.dylib* - echo "int foo(void){return 1;}" > conftest.c - echo "$LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \ --dynamiclib -Wl,-single_module conftest.c" >&5 - $LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \ - -dynamiclib -Wl,-single_module conftest.c 2>conftest.err - _lt_result=$? - # If there is a non-empty error log, and "single_module" - # appears in it, assume the flag caused a linker warning - if test -s conftest.err && $GREP single_module conftest.err; then - cat conftest.err >&5 - # Otherwise, if the output was created with a 0 exit code from - # the compiler, it worked. - elif test -f libconftest.dylib && test $_lt_result -eq 0; then - lt_cv_apple_cc_single_mod=yes - else - cat conftest.err >&5 - fi - rm -rf libconftest.dylib* - rm -f conftest.* - fi -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_apple_cc_single_mod" >&5 -$as_echo "$lt_cv_apple_cc_single_mod" >&6; } - - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -exported_symbols_list linker flag" >&5 -$as_echo_n "checking for -exported_symbols_list linker flag... " >&6; } -if ${lt_cv_ld_exported_symbols_list+:} false; then : - $as_echo_n "(cached) " >&6 -else - lt_cv_ld_exported_symbols_list=no - save_LDFLAGS=$LDFLAGS - echo "_main" > conftest.sym - LDFLAGS="$LDFLAGS -Wl,-exported_symbols_list,conftest.sym" - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -int -main () -{ - - ; - return 0; -} -_ACEOF -if ac_fn_c_try_link "$LINENO"; then : - lt_cv_ld_exported_symbols_list=yes -else - lt_cv_ld_exported_symbols_list=no -fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext - LDFLAGS="$save_LDFLAGS" - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_exported_symbols_list" >&5 -$as_echo "$lt_cv_ld_exported_symbols_list" >&6; } - - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -force_load linker flag" >&5 -$as_echo_n "checking for -force_load linker flag... " >&6; } -if ${lt_cv_ld_force_load+:} false; then : - $as_echo_n "(cached) " >&6 -else - lt_cv_ld_force_load=no - cat > conftest.c << _LT_EOF -int forced_loaded() { return 2;} -_LT_EOF - echo "$LTCC $LTCFLAGS -c -o conftest.o conftest.c" >&5 - $LTCC $LTCFLAGS -c -o conftest.o conftest.c 2>&5 - echo "$AR cru libconftest.a conftest.o" >&5 - $AR cru libconftest.a conftest.o 2>&5 - echo "$RANLIB libconftest.a" >&5 - $RANLIB libconftest.a 2>&5 - cat > conftest.c << _LT_EOF -int main() { return 0;} -_LT_EOF - echo "$LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a" >&5 - $LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a 2>conftest.err - _lt_result=$? - if test -s conftest.err && $GREP force_load conftest.err; then - cat conftest.err >&5 - elif test -f conftest && test $_lt_result -eq 0 && $GREP forced_load conftest >/dev/null 2>&1 ; then - lt_cv_ld_force_load=yes - else - cat conftest.err >&5 - fi - rm -f conftest.err libconftest.a conftest conftest.c - rm -rf conftest.dSYM - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_force_load" >&5 -$as_echo "$lt_cv_ld_force_load" >&6; } - case $host_os in - rhapsody* | darwin1.[012]) - _lt_dar_allow_undefined='${wl}-undefined ${wl}suppress' ;; - darwin1.*) - _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;; - darwin*) # darwin 5.x on - # if running on 10.5 or later, the deployment target defaults - # to the OS version, if on x86, and 10.4, the deployment - # target defaults to 10.4. Don't you love it? - case ${MACOSX_DEPLOYMENT_TARGET-10.0},$host in - 10.0,*86*-darwin8*|10.0,*-darwin[91]*) - _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;; - 10.[012]*) - _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;; - 10.*) - _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;; - esac - ;; - esac - if test "$lt_cv_apple_cc_single_mod" = "yes"; then - _lt_dar_single_mod='$single_module' - fi - if test "$lt_cv_ld_exported_symbols_list" = "yes"; then - _lt_dar_export_syms=' ${wl}-exported_symbols_list,$output_objdir/${libname}-symbols.expsym' - else - _lt_dar_export_syms='~$NMEDIT -s $output_objdir/${libname}-symbols.expsym ${lib}' - fi - if test "$DSYMUTIL" != ":" && test "$lt_cv_ld_force_load" = "no"; then - _lt_dsymutil='~$DSYMUTIL $lib || :' - else - _lt_dsymutil= - fi - ;; - esac - -ac_ext=c -ac_cpp='$CPP $CPPFLAGS' -ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_c_compiler_gnu -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C preprocessor" >&5 -$as_echo_n "checking how to run the C preprocessor... " >&6; } -# On Suns, sometimes $CPP names a directory. -if test -n "$CPP" && test -d "$CPP"; then - CPP= -fi -if test -z "$CPP"; then - if ${ac_cv_prog_CPP+:} false; then : - $as_echo_n "(cached) " >&6 -else - # Double quotes because CPP needs to be expanded - for CPP in "$CC -E" "$CC -E -traditional-cpp" "/lib/cpp" - do - ac_preproc_ok=false -for ac_c_preproc_warn_flag in '' yes -do - # Use a header file that comes with gcc, so configuring glibc - # with a fresh cross-compiler works. - # Prefer to if __STDC__ is defined, since - # exists even on freestanding compilers. - # On the NeXT, cc -E runs the code through the compiler's parser, - # not just through cpp. "Syntax error" is here to catch this case. - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -@%:@ifdef __STDC__ -@%:@ include -@%:@else -@%:@ include -@%:@endif - Syntax error -_ACEOF -if ac_fn_c_try_cpp "$LINENO"; then : - -else - # Broken: fails on valid input. -continue -fi -rm -f conftest.err conftest.i conftest.$ac_ext - - # OK, works on sane cases. Now check whether nonexistent headers - # can be detected and how. - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -@%:@include -_ACEOF -if ac_fn_c_try_cpp "$LINENO"; then : - # Broken: success on invalid input. -continue -else - # Passes both tests. -ac_preproc_ok=: -break -fi -rm -f conftest.err conftest.i conftest.$ac_ext - -done -# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. -rm -f conftest.i conftest.err conftest.$ac_ext -if $ac_preproc_ok; then : - break -fi - - done - ac_cv_prog_CPP=$CPP - -fi - CPP=$ac_cv_prog_CPP -else - ac_cv_prog_CPP=$CPP -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $CPP" >&5 -$as_echo "$CPP" >&6; } -ac_preproc_ok=false -for ac_c_preproc_warn_flag in '' yes -do - # Use a header file that comes with gcc, so configuring glibc - # with a fresh cross-compiler works. - # Prefer to if __STDC__ is defined, since - # exists even on freestanding compilers. - # On the NeXT, cc -E runs the code through the compiler's parser, - # not just through cpp. "Syntax error" is here to catch this case. - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -@%:@ifdef __STDC__ -@%:@ include -@%:@else -@%:@ include -@%:@endif - Syntax error -_ACEOF -if ac_fn_c_try_cpp "$LINENO"; then : - -else - # Broken: fails on valid input. -continue -fi -rm -f conftest.err conftest.i conftest.$ac_ext - - # OK, works on sane cases. Now check whether nonexistent headers - # can be detected and how. - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -@%:@include -_ACEOF -if ac_fn_c_try_cpp "$LINENO"; then : - # Broken: success on invalid input. -continue -else - # Passes both tests. -ac_preproc_ok=: -break -fi -rm -f conftest.err conftest.i conftest.$ac_ext - -done -# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. -rm -f conftest.i conftest.err conftest.$ac_ext -if $ac_preproc_ok; then : - -else - { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 -$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} -as_fn_error $? "C preprocessor \"$CPP\" fails sanity check -See \`config.log' for more details" "$LINENO" 5; } -fi - -ac_ext=c -ac_cpp='$CPP $CPPFLAGS' -ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_c_compiler_gnu - - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header files" >&5 -$as_echo_n "checking for ANSI C header files... " >&6; } -if ${ac_cv_header_stdc+:} false; then : - $as_echo_n "(cached) " >&6 -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include -#include -#include -#include - -int -main () -{ - - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - ac_cv_header_stdc=yes -else - ac_cv_header_stdc=no -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext - -if test $ac_cv_header_stdc = yes; then - # SunOS 4.x string.h does not declare mem*, contrary to ANSI. - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include - -_ACEOF -if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | - $EGREP "memchr" >/dev/null 2>&1; then : - -else - ac_cv_header_stdc=no -fi -rm -f conftest* - -fi - -if test $ac_cv_header_stdc = yes; then - # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include - -_ACEOF -if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | - $EGREP "free" >/dev/null 2>&1; then : - -else - ac_cv_header_stdc=no -fi -rm -f conftest* - -fi - -if test $ac_cv_header_stdc = yes; then - # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi. - if test "$cross_compiling" = yes; then : - : -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include -#include -#if ((' ' & 0x0FF) == 0x020) -# define ISLOWER(c) ('a' <= (c) && (c) <= 'z') -# define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c)) -#else -# define ISLOWER(c) \ - (('a' <= (c) && (c) <= 'i') \ - || ('j' <= (c) && (c) <= 'r') \ - || ('s' <= (c) && (c) <= 'z')) -# define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c)) -#endif - -#define XOR(e, f) (((e) && !(f)) || (!(e) && (f))) -int -main () -{ - int i; - for (i = 0; i < 256; i++) - if (XOR (islower (i), ISLOWER (i)) - || toupper (i) != TOUPPER (i)) - return 2; - return 0; -} -_ACEOF -if ac_fn_c_try_run "$LINENO"; then : - -else - ac_cv_header_stdc=no -fi -rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ - conftest.$ac_objext conftest.beam conftest.$ac_ext -fi - -fi -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdc" >&5 -$as_echo "$ac_cv_header_stdc" >&6; } -if test $ac_cv_header_stdc = yes; then - -$as_echo "@%:@define STDC_HEADERS 1" >>confdefs.h - -fi - -# On IRIX 5.3, sys/types and inttypes.h are conflicting. -for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \ - inttypes.h stdint.h unistd.h -do : - as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` -ac_fn_c_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default -" -if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : - cat >>confdefs.h <<_ACEOF -@%:@define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 -_ACEOF - -fi - -done - - -for ac_header in dlfcn.h -do : - ac_fn_c_check_header_compile "$LINENO" "dlfcn.h" "ac_cv_header_dlfcn_h" "$ac_includes_default -" -if test "x$ac_cv_header_dlfcn_h" = xyes; then : - cat >>confdefs.h <<_ACEOF -@%:@define HAVE_DLFCN_H 1 -_ACEOF - -fi - -done - - - - -func_stripname_cnf () -{ - case ${2} in - .*) func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%\\\\${2}\$%%"`;; - *) func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%${2}\$%%"`;; - esac -} # func_stripname_cnf - - - - - -# Set options - - - - enable_dlopen=no - - - enable_win32_dll=no - - - @%:@ Check whether --enable-shared was given. -if test "${enable_shared+set}" = set; then : - enableval=$enable_shared; p=${PACKAGE-default} - case $enableval in - yes) enable_shared=yes ;; - no) enable_shared=no ;; - *) - enable_shared=no - # Look at the argument we got. We use all the common list separators. - lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," - for pkg in $enableval; do - IFS="$lt_save_ifs" - if test "X$pkg" = "X$p"; then - enable_shared=yes - fi - done - IFS="$lt_save_ifs" - ;; - esac -else - enable_shared=yes -fi - - - - - - - - - - @%:@ Check whether --enable-static was given. -if test "${enable_static+set}" = set; then : - enableval=$enable_static; p=${PACKAGE-default} - case $enableval in - yes) enable_static=yes ;; - no) enable_static=no ;; - *) - enable_static=no - # Look at the argument we got. We use all the common list separators. - lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," - for pkg in $enableval; do - IFS="$lt_save_ifs" - if test "X$pkg" = "X$p"; then - enable_static=yes - fi - done - IFS="$lt_save_ifs" - ;; - esac -else - enable_static=yes -fi - - - - - - - - - - -@%:@ Check whether --with-pic was given. -if test "${with_pic+set}" = set; then : - withval=$with_pic; lt_p=${PACKAGE-default} - case $withval in - yes|no) pic_mode=$withval ;; - *) - pic_mode=default - # Look at the argument we got. We use all the common list separators. - lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," - for lt_pkg in $withval; do - IFS="$lt_save_ifs" - if test "X$lt_pkg" = "X$lt_p"; then - pic_mode=yes - fi - done - IFS="$lt_save_ifs" - ;; - esac -else - pic_mode=default -fi - - -test -z "$pic_mode" && pic_mode=default - - - - - - - - @%:@ Check whether --enable-fast-install was given. -if test "${enable_fast_install+set}" = set; then : - enableval=$enable_fast_install; p=${PACKAGE-default} - case $enableval in - yes) enable_fast_install=yes ;; - no) enable_fast_install=no ;; - *) - enable_fast_install=no - # Look at the argument we got. We use all the common list separators. - lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," - for pkg in $enableval; do - IFS="$lt_save_ifs" - if test "X$pkg" = "X$p"; then - enable_fast_install=yes - fi - done - IFS="$lt_save_ifs" - ;; - esac -else - enable_fast_install=yes -fi - - - - - - - - - - - -# This can be used to rebuild libtool when needed -LIBTOOL_DEPS="$ltmain" - -# Always use our own libtool. -LIBTOOL='$(SHELL) $(top_builddir)/libtool' - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -test -z "$LN_S" && LN_S="ln -s" - - - - - - - - - - - - - - -if test -n "${ZSH_VERSION+set}" ; then - setopt NO_GLOB_SUBST -fi - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for objdir" >&5 -$as_echo_n "checking for objdir... " >&6; } -if ${lt_cv_objdir+:} false; then : - $as_echo_n "(cached) " >&6 -else - rm -f .libs 2>/dev/null -mkdir .libs 2>/dev/null -if test -d .libs; then - lt_cv_objdir=.libs -else - # MS-DOS does not allow filenames that begin with a dot. - lt_cv_objdir=_libs -fi -rmdir .libs 2>/dev/null -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_objdir" >&5 -$as_echo "$lt_cv_objdir" >&6; } -objdir=$lt_cv_objdir - - - - - -cat >>confdefs.h <<_ACEOF -@%:@define LT_OBJDIR "$lt_cv_objdir/" -_ACEOF - - - - -case $host_os in -aix3*) - # AIX sometimes has problems with the GCC collect2 program. For some - # reason, if we set the COLLECT_NAMES environment variable, the problems - # vanish in a puff of smoke. - if test "X${COLLECT_NAMES+set}" != Xset; then - COLLECT_NAMES= - export COLLECT_NAMES - fi - ;; -esac - -# Global variables: -ofile=libtool -can_build_shared=yes - -# All known linkers require a `.a' archive for static linking (except MSVC, -# which needs '.lib'). -libext=a - -with_gnu_ld="$lt_cv_prog_gnu_ld" - -old_CC="$CC" -old_CFLAGS="$CFLAGS" - -# Set sane defaults for various variables -test -z "$CC" && CC=cc -test -z "$LTCC" && LTCC=$CC -test -z "$LTCFLAGS" && LTCFLAGS=$CFLAGS -test -z "$LD" && LD=ld -test -z "$ac_objext" && ac_objext=o - -for cc_temp in $compiler""; do - case $cc_temp in - compile | *[\\/]compile | ccache | *[\\/]ccache ) ;; - distcc | *[\\/]distcc | purify | *[\\/]purify ) ;; - \-*) ;; - *) break;; - esac -done -cc_basename=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"` - - -# Only perform the check for file, if the check method requires it -test -z "$MAGIC_CMD" && MAGIC_CMD=file -case $deplibs_check_method in -file_magic*) - if test "$file_magic_cmd" = '$MAGIC_CMD'; then - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ${ac_tool_prefix}file" >&5 -$as_echo_n "checking for ${ac_tool_prefix}file... " >&6; } -if ${lt_cv_path_MAGIC_CMD+:} false; then : - $as_echo_n "(cached) " >&6 -else - case $MAGIC_CMD in -[\\/*] | ?:[\\/]*) - lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path. - ;; -*) - lt_save_MAGIC_CMD="$MAGIC_CMD" - lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR - ac_dummy="/usr/bin$PATH_SEPARATOR$PATH" - for ac_dir in $ac_dummy; do - IFS="$lt_save_ifs" - test -z "$ac_dir" && ac_dir=. - if test -f $ac_dir/${ac_tool_prefix}file; then - lt_cv_path_MAGIC_CMD="$ac_dir/${ac_tool_prefix}file" - if test -n "$file_magic_test_file"; then - case $deplibs_check_method in - "file_magic "*) - file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"` - MAGIC_CMD="$lt_cv_path_MAGIC_CMD" - if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null | - $EGREP "$file_magic_regex" > /dev/null; then - : - else - cat <<_LT_EOF 1>&2 - -*** Warning: the command libtool uses to detect shared libraries, -*** $file_magic_cmd, produces output that libtool cannot recognize. -*** The result is that libtool may fail to recognize shared libraries -*** as such. This will affect the creation of libtool libraries that -*** depend on shared libraries, but programs linked with such libtool -*** libraries will work regardless of this problem. Nevertheless, you -*** may want to report the problem to your system manager and/or to -*** bug-libtool@gnu.org - -_LT_EOF - fi ;; - esac - fi - break - fi - done - IFS="$lt_save_ifs" - MAGIC_CMD="$lt_save_MAGIC_CMD" - ;; -esac -fi - -MAGIC_CMD="$lt_cv_path_MAGIC_CMD" -if test -n "$MAGIC_CMD"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MAGIC_CMD" >&5 -$as_echo "$MAGIC_CMD" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - - - - -if test -z "$lt_cv_path_MAGIC_CMD"; then - if test -n "$ac_tool_prefix"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for file" >&5 -$as_echo_n "checking for file... " >&6; } -if ${lt_cv_path_MAGIC_CMD+:} false; then : - $as_echo_n "(cached) " >&6 -else - case $MAGIC_CMD in -[\\/*] | ?:[\\/]*) - lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path. - ;; -*) - lt_save_MAGIC_CMD="$MAGIC_CMD" - lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR - ac_dummy="/usr/bin$PATH_SEPARATOR$PATH" - for ac_dir in $ac_dummy; do - IFS="$lt_save_ifs" - test -z "$ac_dir" && ac_dir=. - if test -f $ac_dir/file; then - lt_cv_path_MAGIC_CMD="$ac_dir/file" - if test -n "$file_magic_test_file"; then - case $deplibs_check_method in - "file_magic "*) - file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"` - MAGIC_CMD="$lt_cv_path_MAGIC_CMD" - if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null | - $EGREP "$file_magic_regex" > /dev/null; then - : - else - cat <<_LT_EOF 1>&2 - -*** Warning: the command libtool uses to detect shared libraries, -*** $file_magic_cmd, produces output that libtool cannot recognize. -*** The result is that libtool may fail to recognize shared libraries -*** as such. This will affect the creation of libtool libraries that -*** depend on shared libraries, but programs linked with such libtool -*** libraries will work regardless of this problem. Nevertheless, you -*** may want to report the problem to your system manager and/or to -*** bug-libtool@gnu.org - -_LT_EOF - fi ;; - esac - fi - break - fi - done - IFS="$lt_save_ifs" - MAGIC_CMD="$lt_save_MAGIC_CMD" - ;; -esac -fi - -MAGIC_CMD="$lt_cv_path_MAGIC_CMD" -if test -n "$MAGIC_CMD"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MAGIC_CMD" >&5 -$as_echo "$MAGIC_CMD" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - - else - MAGIC_CMD=: - fi -fi - - fi - ;; -esac - -# Use C for the default configuration in the libtool script - -lt_save_CC="$CC" -ac_ext=c -ac_cpp='$CPP $CPPFLAGS' -ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_c_compiler_gnu - - -# Source file extension for C test sources. -ac_ext=c - -# Object file extension for compiled C test sources. -objext=o -objext=$objext - -# Code to be used in simple compile tests -lt_simple_compile_test_code="int some_variable = 0;" - -# Code to be used in simple link tests -lt_simple_link_test_code='int main(){return(0);}' - - - - - - - -# If no C compiler was specified, use CC. -LTCC=${LTCC-"$CC"} - -# If no C compiler flags were specified, use CFLAGS. -LTCFLAGS=${LTCFLAGS-"$CFLAGS"} - -# Allow CC to be a program name with arguments. -compiler=$CC - -# Save the default compiler, since it gets overwritten when the other -# tags are being tested, and _LT_TAGVAR(compiler, []) is a NOP. -compiler_DEFAULT=$CC - -# save warnings/boilerplate of simple test code -ac_outfile=conftest.$ac_objext -echo "$lt_simple_compile_test_code" >conftest.$ac_ext -eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err -_lt_compiler_boilerplate=`cat conftest.err` -$RM conftest* - -ac_outfile=conftest.$ac_objext -echo "$lt_simple_link_test_code" >conftest.$ac_ext -eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err -_lt_linker_boilerplate=`cat conftest.err` -$RM -r conftest* - - -if test -n "$compiler"; then - -lt_prog_compiler_no_builtin_flag= - -if test "$GCC" = yes; then - case $cc_basename in - nvcc*) - lt_prog_compiler_no_builtin_flag=' -Xcompiler -fno-builtin' ;; - *) - lt_prog_compiler_no_builtin_flag=' -fno-builtin' ;; - esac - - { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -fno-rtti -fno-exceptions" >&5 -$as_echo_n "checking if $compiler supports -fno-rtti -fno-exceptions... " >&6; } -if ${lt_cv_prog_compiler_rtti_exceptions+:} false; then : - $as_echo_n "(cached) " >&6 -else - lt_cv_prog_compiler_rtti_exceptions=no - ac_outfile=conftest.$ac_objext - echo "$lt_simple_compile_test_code" > conftest.$ac_ext - lt_compiler_flag="-fno-rtti -fno-exceptions" - # Insert the option either (1) after the last *FLAGS variable, or - # (2) before a word containing "conftest.", or (3) at the end. - # Note that $ac_compile itself does not contain backslashes and begins - # with a dollar sign (not a hyphen), so the echo should work correctly. - # The option is referenced via a variable to avoid confusing sed. - lt_compile=`echo "$ac_compile" | $SED \ - -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ - -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ - -e 's:$: $lt_compiler_flag:'` - (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) - (eval "$lt_compile" 2>conftest.err) - ac_status=$? - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - if (exit $ac_status) && test -s "$ac_outfile"; then - # The compiler can only warn and ignore the option if not recognized - # So say no if there are warnings other than the usual output. - $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp - $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 - if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then - lt_cv_prog_compiler_rtti_exceptions=yes - fi - fi - $RM conftest* - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_rtti_exceptions" >&5 -$as_echo "$lt_cv_prog_compiler_rtti_exceptions" >&6; } - -if test x"$lt_cv_prog_compiler_rtti_exceptions" = xyes; then - lt_prog_compiler_no_builtin_flag="$lt_prog_compiler_no_builtin_flag -fno-rtti -fno-exceptions" -else - : -fi - -fi - - - - - - - lt_prog_compiler_wl= -lt_prog_compiler_pic= -lt_prog_compiler_static= - - - if test "$GCC" = yes; then - lt_prog_compiler_wl='-Wl,' - lt_prog_compiler_static='-static' - - case $host_os in - aix*) - # All AIX code is PIC. - if test "$host_cpu" = ia64; then - # AIX 5 now supports IA64 processor - lt_prog_compiler_static='-Bstatic' - fi - ;; - - amigaos*) - case $host_cpu in - powerpc) - # see comment about AmigaOS4 .so support - lt_prog_compiler_pic='-fPIC' - ;; - m68k) - # FIXME: we need at least 68020 code to build shared libraries, but - # adding the `-m68020' flag to GCC prevents building anything better, - # like `-m68040'. - lt_prog_compiler_pic='-m68020 -resident32 -malways-restore-a4' - ;; - esac - ;; - - beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) - # PIC is the default for these OSes. - ;; - - mingw* | cygwin* | pw32* | os2* | cegcc*) - # This hack is so that the source file can tell whether it is being - # built for inclusion in a dll (and should export symbols for example). - # Although the cygwin gcc ignores -fPIC, still need this for old-style - # (--disable-auto-import) libraries - lt_prog_compiler_pic='-DDLL_EXPORT' - ;; - - darwin* | rhapsody*) - # PIC is the default on this platform - # Common symbols not allowed in MH_DYLIB files - lt_prog_compiler_pic='-fno-common' - ;; - - haiku*) - # PIC is the default for Haiku. - # The "-static" flag exists, but is broken. - lt_prog_compiler_static= - ;; - - hpux*) - # PIC is the default for 64-bit PA HP-UX, but not for 32-bit - # PA HP-UX. On IA64 HP-UX, PIC is the default but the pic flag - # sets the default TLS model and affects inlining. - case $host_cpu in - hppa*64*) - # +Z the default - ;; - *) - lt_prog_compiler_pic='-fPIC' - ;; - esac - ;; - - interix[3-9]*) - # Interix 3.x gcc -fpic/-fPIC options generate broken code. - # Instead, we relocate shared libraries at runtime. - ;; - - msdosdjgpp*) - # Just because we use GCC doesn't mean we suddenly get shared libraries - # on systems that don't support them. - lt_prog_compiler_can_build_shared=no - enable_shared=no - ;; - - *nto* | *qnx*) - # QNX uses GNU C++, but need to define -shared option too, otherwise - # it will coredump. - lt_prog_compiler_pic='-fPIC -shared' - ;; - - sysv4*MP*) - if test -d /usr/nec; then - lt_prog_compiler_pic=-Kconform_pic - fi - ;; - - *) - lt_prog_compiler_pic='-fPIC' - ;; - esac - - case $cc_basename in - nvcc*) # Cuda Compiler Driver 2.2 - lt_prog_compiler_wl='-Xlinker ' - if test -n "$lt_prog_compiler_pic"; then - lt_prog_compiler_pic="-Xcompiler $lt_prog_compiler_pic" - fi - ;; - esac - else - # PORTME Check for flag to pass linker flags through the system compiler. - case $host_os in - aix*) - lt_prog_compiler_wl='-Wl,' - if test "$host_cpu" = ia64; then - # AIX 5 now supports IA64 processor - lt_prog_compiler_static='-Bstatic' - else - lt_prog_compiler_static='-bnso -bI:/lib/syscalls.exp' - fi - ;; - - mingw* | cygwin* | pw32* | os2* | cegcc*) - # This hack is so that the source file can tell whether it is being - # built for inclusion in a dll (and should export symbols for example). - lt_prog_compiler_pic='-DDLL_EXPORT' - ;; - - hpux9* | hpux10* | hpux11*) - lt_prog_compiler_wl='-Wl,' - # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but - # not for PA HP-UX. - case $host_cpu in - hppa*64*|ia64*) - # +Z the default - ;; - *) - lt_prog_compiler_pic='+Z' - ;; - esac - # Is there a better lt_prog_compiler_static that works with the bundled CC? - lt_prog_compiler_static='${wl}-a ${wl}archive' - ;; - - irix5* | irix6* | nonstopux*) - lt_prog_compiler_wl='-Wl,' - # PIC (with -KPIC) is the default. - lt_prog_compiler_static='-non_shared' - ;; - - linux* | k*bsd*-gnu | kopensolaris*-gnu) - case $cc_basename in - # old Intel for x86_64 which still supported -KPIC. - ecc*) - lt_prog_compiler_wl='-Wl,' - lt_prog_compiler_pic='-KPIC' - lt_prog_compiler_static='-static' - ;; - # icc used to be incompatible with GCC. - # ICC 10 doesn't accept -KPIC any more. - icc* | ifort*) - lt_prog_compiler_wl='-Wl,' - lt_prog_compiler_pic='-fPIC' - lt_prog_compiler_static='-static' - ;; - # Lahey Fortran 8.1. - lf95*) - lt_prog_compiler_wl='-Wl,' - lt_prog_compiler_pic='--shared' - lt_prog_compiler_static='--static' - ;; - nagfor*) - # NAG Fortran compiler - lt_prog_compiler_wl='-Wl,-Wl,,' - lt_prog_compiler_pic='-PIC' - lt_prog_compiler_static='-Bstatic' - ;; - pgcc* | pgf77* | pgf90* | pgf95* | pgfortran*) - # Portland Group compilers (*not* the Pentium gcc compiler, - # which looks to be a dead project) - lt_prog_compiler_wl='-Wl,' - lt_prog_compiler_pic='-fpic' - lt_prog_compiler_static='-Bstatic' - ;; - ccc*) - lt_prog_compiler_wl='-Wl,' - # All Alpha code is PIC. - lt_prog_compiler_static='-non_shared' - ;; - xl* | bgxl* | bgf* | mpixl*) - # IBM XL C 8.0/Fortran 10.1, 11.1 on PPC and BlueGene - lt_prog_compiler_wl='-Wl,' - lt_prog_compiler_pic='-qpic' - lt_prog_compiler_static='-qstaticlink' - ;; - *) - case `$CC -V 2>&1 | sed 5q` in - *Sun\ Ceres\ Fortran* | *Sun*Fortran*\ [1-7].* | *Sun*Fortran*\ 8.[0-3]*) - # Sun Fortran 8.3 passes all unrecognized flags to the linker - lt_prog_compiler_pic='-KPIC' - lt_prog_compiler_static='-Bstatic' - lt_prog_compiler_wl='' - ;; - *Sun\ F* | *Sun*Fortran*) - lt_prog_compiler_pic='-KPIC' - lt_prog_compiler_static='-Bstatic' - lt_prog_compiler_wl='-Qoption ld ' - ;; - *Sun\ C*) - # Sun C 5.9 - lt_prog_compiler_pic='-KPIC' - lt_prog_compiler_static='-Bstatic' - lt_prog_compiler_wl='-Wl,' - ;; - *Intel*\ [CF]*Compiler*) - lt_prog_compiler_wl='-Wl,' - lt_prog_compiler_pic='-fPIC' - lt_prog_compiler_static='-static' - ;; - *Portland\ Group*) - lt_prog_compiler_wl='-Wl,' - lt_prog_compiler_pic='-fpic' - lt_prog_compiler_static='-Bstatic' - ;; - esac - ;; - esac - ;; - - newsos6) - lt_prog_compiler_pic='-KPIC' - lt_prog_compiler_static='-Bstatic' - ;; - - *nto* | *qnx*) - # QNX uses GNU C++, but need to define -shared option too, otherwise - # it will coredump. - lt_prog_compiler_pic='-fPIC -shared' - ;; - - osf3* | osf4* | osf5*) - lt_prog_compiler_wl='-Wl,' - # All OSF/1 code is PIC. - lt_prog_compiler_static='-non_shared' - ;; - - rdos*) - lt_prog_compiler_static='-non_shared' - ;; - - solaris*) - lt_prog_compiler_pic='-KPIC' - lt_prog_compiler_static='-Bstatic' - case $cc_basename in - f77* | f90* | f95* | sunf77* | sunf90* | sunf95*) - lt_prog_compiler_wl='-Qoption ld ';; - *) - lt_prog_compiler_wl='-Wl,';; - esac - ;; - - sunos4*) - lt_prog_compiler_wl='-Qoption ld ' - lt_prog_compiler_pic='-PIC' - lt_prog_compiler_static='-Bstatic' - ;; - - sysv4 | sysv4.2uw2* | sysv4.3*) - lt_prog_compiler_wl='-Wl,' - lt_prog_compiler_pic='-KPIC' - lt_prog_compiler_static='-Bstatic' - ;; - - sysv4*MP*) - if test -d /usr/nec ;then - lt_prog_compiler_pic='-Kconform_pic' - lt_prog_compiler_static='-Bstatic' - fi - ;; - - sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) - lt_prog_compiler_wl='-Wl,' - lt_prog_compiler_pic='-KPIC' - lt_prog_compiler_static='-Bstatic' - ;; - - unicos*) - lt_prog_compiler_wl='-Wl,' - lt_prog_compiler_can_build_shared=no - ;; - - uts4*) - lt_prog_compiler_pic='-pic' - lt_prog_compiler_static='-Bstatic' - ;; - - *) - lt_prog_compiler_can_build_shared=no - ;; - esac - fi - -case $host_os in - # For platforms which do not support PIC, -DPIC is meaningless: - *djgpp*) - lt_prog_compiler_pic= - ;; - *) - lt_prog_compiler_pic="$lt_prog_compiler_pic@&t@ -DPIC" - ;; -esac - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $compiler option to produce PIC" >&5 -$as_echo_n "checking for $compiler option to produce PIC... " >&6; } -if ${lt_cv_prog_compiler_pic+:} false; then : - $as_echo_n "(cached) " >&6 -else - lt_cv_prog_compiler_pic=$lt_prog_compiler_pic -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic" >&5 -$as_echo "$lt_cv_prog_compiler_pic" >&6; } -lt_prog_compiler_pic=$lt_cv_prog_compiler_pic - -# -# Check to make sure the PIC flag actually works. -# -if test -n "$lt_prog_compiler_pic"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler PIC flag $lt_prog_compiler_pic works" >&5 -$as_echo_n "checking if $compiler PIC flag $lt_prog_compiler_pic works... " >&6; } -if ${lt_cv_prog_compiler_pic_works+:} false; then : - $as_echo_n "(cached) " >&6 -else - lt_cv_prog_compiler_pic_works=no - ac_outfile=conftest.$ac_objext - echo "$lt_simple_compile_test_code" > conftest.$ac_ext - lt_compiler_flag="$lt_prog_compiler_pic@&t@ -DPIC" - # Insert the option either (1) after the last *FLAGS variable, or - # (2) before a word containing "conftest.", or (3) at the end. - # Note that $ac_compile itself does not contain backslashes and begins - # with a dollar sign (not a hyphen), so the echo should work correctly. - # The option is referenced via a variable to avoid confusing sed. - lt_compile=`echo "$ac_compile" | $SED \ - -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ - -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ - -e 's:$: $lt_compiler_flag:'` - (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) - (eval "$lt_compile" 2>conftest.err) - ac_status=$? - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - if (exit $ac_status) && test -s "$ac_outfile"; then - # The compiler can only warn and ignore the option if not recognized - # So say no if there are warnings other than the usual output. - $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp - $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 - if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then - lt_cv_prog_compiler_pic_works=yes - fi - fi - $RM conftest* - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic_works" >&5 -$as_echo "$lt_cv_prog_compiler_pic_works" >&6; } - -if test x"$lt_cv_prog_compiler_pic_works" = xyes; then - case $lt_prog_compiler_pic in - "" | " "*) ;; - *) lt_prog_compiler_pic=" $lt_prog_compiler_pic" ;; - esac -else - lt_prog_compiler_pic= - lt_prog_compiler_can_build_shared=no -fi - -fi - - - - - - - - - - - -# -# Check to make sure the static flag actually works. -# -wl=$lt_prog_compiler_wl eval lt_tmp_static_flag=\"$lt_prog_compiler_static\" -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler static flag $lt_tmp_static_flag works" >&5 -$as_echo_n "checking if $compiler static flag $lt_tmp_static_flag works... " >&6; } -if ${lt_cv_prog_compiler_static_works+:} false; then : - $as_echo_n "(cached) " >&6 -else - lt_cv_prog_compiler_static_works=no - save_LDFLAGS="$LDFLAGS" - LDFLAGS="$LDFLAGS $lt_tmp_static_flag" - echo "$lt_simple_link_test_code" > conftest.$ac_ext - if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then - # The linker can only warn and ignore the option if not recognized - # So say no if there are warnings - if test -s conftest.err; then - # Append any errors to the config.log. - cat conftest.err 1>&5 - $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp - $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 - if diff conftest.exp conftest.er2 >/dev/null; then - lt_cv_prog_compiler_static_works=yes - fi - else - lt_cv_prog_compiler_static_works=yes - fi - fi - $RM -r conftest* - LDFLAGS="$save_LDFLAGS" - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_static_works" >&5 -$as_echo "$lt_cv_prog_compiler_static_works" >&6; } - -if test x"$lt_cv_prog_compiler_static_works" = xyes; then - : -else - lt_prog_compiler_static= -fi - - - - - - - - { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5 -$as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; } -if ${lt_cv_prog_compiler_c_o+:} false; then : - $as_echo_n "(cached) " >&6 -else - lt_cv_prog_compiler_c_o=no - $RM -r conftest 2>/dev/null - mkdir conftest - cd conftest - mkdir out - echo "$lt_simple_compile_test_code" > conftest.$ac_ext - - lt_compiler_flag="-o out/conftest2.$ac_objext" - # Insert the option either (1) after the last *FLAGS variable, or - # (2) before a word containing "conftest.", or (3) at the end. - # Note that $ac_compile itself does not contain backslashes and begins - # with a dollar sign (not a hyphen), so the echo should work correctly. - lt_compile=`echo "$ac_compile" | $SED \ - -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ - -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ - -e 's:$: $lt_compiler_flag:'` - (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) - (eval "$lt_compile" 2>out/conftest.err) - ac_status=$? - cat out/conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - if (exit $ac_status) && test -s out/conftest2.$ac_objext - then - # The compiler can only warn and ignore the option if not recognized - # So say no if there are warnings - $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp - $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 - if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then - lt_cv_prog_compiler_c_o=yes - fi - fi - chmod u+w . 2>&5 - $RM conftest* - # SGI C++ compiler will create directory out/ii_files/ for - # template instantiation - test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files - $RM out/* && rmdir out - cd .. - $RM -r conftest - $RM conftest* - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o" >&5 -$as_echo "$lt_cv_prog_compiler_c_o" >&6; } - - - - - - - { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5 -$as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; } -if ${lt_cv_prog_compiler_c_o+:} false; then : - $as_echo_n "(cached) " >&6 -else - lt_cv_prog_compiler_c_o=no - $RM -r conftest 2>/dev/null - mkdir conftest - cd conftest - mkdir out - echo "$lt_simple_compile_test_code" > conftest.$ac_ext - - lt_compiler_flag="-o out/conftest2.$ac_objext" - # Insert the option either (1) after the last *FLAGS variable, or - # (2) before a word containing "conftest.", or (3) at the end. - # Note that $ac_compile itself does not contain backslashes and begins - # with a dollar sign (not a hyphen), so the echo should work correctly. - lt_compile=`echo "$ac_compile" | $SED \ - -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ - -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ - -e 's:$: $lt_compiler_flag:'` - (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) - (eval "$lt_compile" 2>out/conftest.err) - ac_status=$? - cat out/conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - if (exit $ac_status) && test -s out/conftest2.$ac_objext - then - # The compiler can only warn and ignore the option if not recognized - # So say no if there are warnings - $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp - $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 - if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then - lt_cv_prog_compiler_c_o=yes - fi - fi - chmod u+w . 2>&5 - $RM conftest* - # SGI C++ compiler will create directory out/ii_files/ for - # template instantiation - test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files - $RM out/* && rmdir out - cd .. - $RM -r conftest - $RM conftest* - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o" >&5 -$as_echo "$lt_cv_prog_compiler_c_o" >&6; } - - - - -hard_links="nottested" -if test "$lt_cv_prog_compiler_c_o" = no && test "$need_locks" != no; then - # do not overwrite the value of need_locks provided by the user - { $as_echo "$as_me:${as_lineno-$LINENO}: checking if we can lock with hard links" >&5 -$as_echo_n "checking if we can lock with hard links... " >&6; } - hard_links=yes - $RM conftest* - ln conftest.a conftest.b 2>/dev/null && hard_links=no - touch conftest.a - ln conftest.a conftest.b 2>&5 || hard_links=no - ln conftest.a conftest.b 2>/dev/null && hard_links=no - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $hard_links" >&5 -$as_echo "$hard_links" >&6; } - if test "$hard_links" = no; then - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&5 -$as_echo "$as_me: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&2;} - need_locks=warn - fi -else - need_locks=no -fi - - - - - - - { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $compiler linker ($LD) supports shared libraries" >&5 -$as_echo_n "checking whether the $compiler linker ($LD) supports shared libraries... " >&6; } - - runpath_var= - allow_undefined_flag= - always_export_symbols=no - archive_cmds= - archive_expsym_cmds= - compiler_needs_object=no - enable_shared_with_static_runtimes=no - export_dynamic_flag_spec= - export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' - hardcode_automatic=no - hardcode_direct=no - hardcode_direct_absolute=no - hardcode_libdir_flag_spec= - hardcode_libdir_separator= - hardcode_minus_L=no - hardcode_shlibpath_var=unsupported - inherit_rpath=no - link_all_deplibs=unknown - module_cmds= - module_expsym_cmds= - old_archive_from_new_cmds= - old_archive_from_expsyms_cmds= - thread_safe_flag_spec= - whole_archive_flag_spec= - # include_expsyms should be a list of space-separated symbols to be *always* - # included in the symbol list - include_expsyms= - # exclude_expsyms can be an extended regexp of symbols to exclude - # it will be wrapped by ` (' and `)$', so one must not match beginning or - # end of line. Example: `a|bc|.*d.*' will exclude the symbols `a' and `bc', - # as well as any symbol that contains `d'. - exclude_expsyms='_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*' - # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out - # platforms (ab)use it in PIC code, but their linkers get confused if - # the symbol is explicitly referenced. Since portable code cannot - # rely on this symbol name, it's probably fine to never include it in - # preloaded symbol tables. - # Exclude shared library initialization/finalization symbols. - extract_expsyms_cmds= - - case $host_os in - cygwin* | mingw* | pw32* | cegcc*) - # FIXME: the MSVC++ port hasn't been tested in a loooong time - # When not using gcc, we currently assume that we are using - # Microsoft Visual C++. - if test "$GCC" != yes; then - with_gnu_ld=no - fi - ;; - interix*) - # we just hope/assume this is gcc and not c89 (= MSVC++) - with_gnu_ld=yes - ;; - openbsd*) - with_gnu_ld=no - ;; - linux* | k*bsd*-gnu | gnu*) - link_all_deplibs=no - ;; - esac - - ld_shlibs=yes - - # On some targets, GNU ld is compatible enough with the native linker - # that we're better off using the native interface for both. - lt_use_gnu_ld_interface=no - if test "$with_gnu_ld" = yes; then - case $host_os in - aix*) - # The AIX port of GNU ld has always aspired to compatibility - # with the native linker. However, as the warning in the GNU ld - # block says, versions before 2.19.5* couldn't really create working - # shared libraries, regardless of the interface used. - case `$LD -v 2>&1` in - *\ \(GNU\ Binutils\)\ 2.19.5*) ;; - *\ \(GNU\ Binutils\)\ 2.[2-9]*) ;; - *\ \(GNU\ Binutils\)\ [3-9]*) ;; - *) - lt_use_gnu_ld_interface=yes - ;; - esac - ;; - *) - lt_use_gnu_ld_interface=yes - ;; - esac - fi - - if test "$lt_use_gnu_ld_interface" = yes; then - # If archive_cmds runs LD, not CC, wlarc should be empty - wlarc='${wl}' - - # Set some defaults for GNU ld with shared library support. These - # are reset later if shared libraries are not supported. Putting them - # here allows them to be overridden if necessary. - runpath_var=LD_RUN_PATH - hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' - export_dynamic_flag_spec='${wl}--export-dynamic' - # ancient GNU ld didn't support --whole-archive et. al. - if $LD --help 2>&1 | $GREP 'no-whole-archive' > /dev/null; then - whole_archive_flag_spec="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' - else - whole_archive_flag_spec= - fi - supports_anon_versioning=no - case `$LD -v 2>&1` in - *GNU\ gold*) supports_anon_versioning=yes ;; - *\ [01].* | *\ 2.[0-9].* | *\ 2.10.*) ;; # catch versions < 2.11 - *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ... - *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ... - *\ 2.11.*) ;; # other 2.11 versions - *) supports_anon_versioning=yes ;; - esac - - # See if GNU ld supports shared libraries. - case $host_os in - aix[3-9]*) - # On AIX/PPC, the GNU linker is very broken - if test "$host_cpu" != ia64; then - ld_shlibs=no - cat <<_LT_EOF 1>&2 - -*** Warning: the GNU linker, at least up to release 2.19, is reported -*** to be unable to reliably create shared libraries on AIX. -*** Therefore, libtool is disabling shared libraries support. If you -*** really care for shared libraries, you may want to install binutils -*** 2.20 or above, or modify your PATH so that a non-GNU linker is found. -*** You will then need to restart the configuration process. - -_LT_EOF - fi - ;; - - amigaos*) - case $host_cpu in - powerpc) - # see comment about AmigaOS4 .so support - archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' - archive_expsym_cmds='' - ;; - m68k) - archive_cmds='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' - hardcode_libdir_flag_spec='-L$libdir' - hardcode_minus_L=yes - ;; - esac - ;; - - beos*) - if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then - allow_undefined_flag=unsupported - # Joseph Beckenbach says some releases of gcc - # support --undefined. This deserves some investigation. FIXME - archive_cmds='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' - else - ld_shlibs=no - fi - ;; - - cygwin* | mingw* | pw32* | cegcc*) - # _LT_TAGVAR(hardcode_libdir_flag_spec, ) is actually meaningless, - # as there is no search path for DLLs. - hardcode_libdir_flag_spec='-L$libdir' - export_dynamic_flag_spec='${wl}--export-all-symbols' - allow_undefined_flag=unsupported - always_export_symbols=no - enable_shared_with_static_runtimes=yes - export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1 DATA/;s/^.*[ ]__nm__\([^ ]*\)[ ][^ ]*/\1 DATA/;/^I[ ]/d;/^[AITW][ ]/s/.* //'\'' | sort | uniq > $export_symbols' - exclude_expsyms='[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname' - - if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then - archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' - # If the export-symbols file already is a .def file (1st line - # is EXPORTS), use it as is; otherwise, prepend... - archive_expsym_cmds='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then - cp $export_symbols $output_objdir/$soname.def; - else - echo EXPORTS > $output_objdir/$soname.def; - cat $export_symbols >> $output_objdir/$soname.def; - fi~ - $CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' - else - ld_shlibs=no - fi - ;; - - haiku*) - archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' - link_all_deplibs=yes - ;; - - interix[3-9]*) - hardcode_direct=no - hardcode_shlibpath_var=no - hardcode_libdir_flag_spec='${wl}-rpath,$libdir' - export_dynamic_flag_spec='${wl}-E' - # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. - # Instead, shared libraries are loaded at an image base (0x10000000 by - # default) and relocated if they conflict, which is a slow very memory - # consuming and fragmenting process. To avoid this, we pick a random, - # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link - # time. Moving up from 0x10000000 also allows more sbrk(2) space. - archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' - archive_expsym_cmds='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' - ;; - - gnu* | linux* | tpf* | k*bsd*-gnu | kopensolaris*-gnu) - tmp_diet=no - if test "$host_os" = linux-dietlibc; then - case $cc_basename in - diet\ *) tmp_diet=yes;; # linux-dietlibc with static linking (!diet-dyn) - esac - fi - if $LD --help 2>&1 | $EGREP ': supported targets:.* elf' > /dev/null \ - && test "$tmp_diet" = no - then - tmp_addflag=' $pic_flag' - tmp_sharedflag='-shared' - case $cc_basename,$host_cpu in - pgcc*) # Portland Group C compiler - whole_archive_flag_spec='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' - tmp_addflag=' $pic_flag' - ;; - pgf77* | pgf90* | pgf95* | pgfortran*) - # Portland Group f77 and f90 compilers - whole_archive_flag_spec='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' - tmp_addflag=' $pic_flag -Mnomain' ;; - ecc*,ia64* | icc*,ia64*) # Intel C compiler on ia64 - tmp_addflag=' -i_dynamic' ;; - efc*,ia64* | ifort*,ia64*) # Intel Fortran compiler on ia64 - tmp_addflag=' -i_dynamic -nofor_main' ;; - ifc* | ifort*) # Intel Fortran compiler - tmp_addflag=' -nofor_main' ;; - lf95*) # Lahey Fortran 8.1 - whole_archive_flag_spec= - tmp_sharedflag='--shared' ;; - xl[cC]* | bgxl[cC]* | mpixl[cC]*) # IBM XL C 8.0 on PPC (deal with xlf below) - tmp_sharedflag='-qmkshrobj' - tmp_addflag= ;; - nvcc*) # Cuda Compiler Driver 2.2 - whole_archive_flag_spec='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' - compiler_needs_object=yes - ;; - esac - case `$CC -V 2>&1 | sed 5q` in - *Sun\ C*) # Sun C 5.9 - whole_archive_flag_spec='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' - compiler_needs_object=yes - tmp_sharedflag='-G' ;; - *Sun\ F*) # Sun Fortran 8.3 - tmp_sharedflag='-G' ;; - esac - archive_cmds='$CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' - - if test "x$supports_anon_versioning" = xyes; then - archive_expsym_cmds='echo "{ global:" > $output_objdir/$libname.ver~ - cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ - echo "local: *; };" >> $output_objdir/$libname.ver~ - $CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib' - fi - - case $cc_basename in - xlf* | bgf* | bgxlf* | mpixlf*) - # IBM XL Fortran 10.1 on PPC cannot create shared libs itself - whole_archive_flag_spec='--whole-archive$convenience --no-whole-archive' - hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' - archive_cmds='$LD -shared $libobjs $deplibs $linker_flags -soname $soname -o $lib' - if test "x$supports_anon_versioning" = xyes; then - archive_expsym_cmds='echo "{ global:" > $output_objdir/$libname.ver~ - cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ - echo "local: *; };" >> $output_objdir/$libname.ver~ - $LD -shared $libobjs $deplibs $linker_flags -soname $soname -version-script $output_objdir/$libname.ver -o $lib' - fi - ;; - esac - else - ld_shlibs=no - fi - ;; - - netbsd* | netbsdelf*-gnu) - if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then - archive_cmds='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib' - wlarc= - else - archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' - archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' - fi - ;; - - solaris*) - if $LD -v 2>&1 | $GREP 'BFD 2\.8' > /dev/null; then - ld_shlibs=no - cat <<_LT_EOF 1>&2 - -*** Warning: The releases 2.8.* of the GNU linker cannot reliably -*** create shared libraries on Solaris systems. Therefore, libtool -*** is disabling shared libraries support. We urge you to upgrade GNU -*** binutils to release 2.9.1 or newer. Another option is to modify -*** your PATH or compiler configuration so that the native linker is -*** used, and then restart. - -_LT_EOF - elif $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then - archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' - archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' - else - ld_shlibs=no - fi - ;; - - sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*) - case `$LD -v 2>&1` in - *\ [01].* | *\ 2.[0-9].* | *\ 2.1[0-5].*) - ld_shlibs=no - cat <<_LT_EOF 1>&2 - -*** Warning: Releases of the GNU linker prior to 2.16.91.0.3 can not -*** reliably create shared libraries on SCO systems. Therefore, libtool -*** is disabling shared libraries support. We urge you to upgrade GNU -*** binutils to release 2.16.91.0.3 or newer. Another option is to modify -*** your PATH or compiler configuration so that the native linker is -*** used, and then restart. - -_LT_EOF - ;; - *) - # For security reasons, it is highly recommended that you always - # use absolute paths for naming shared libraries, and exclude the - # DT_RUNPATH tag from executables and libraries. But doing so - # requires that you compile everything twice, which is a pain. - if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then - hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' - archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' - archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' - else - ld_shlibs=no - fi - ;; - esac - ;; - - sunos4*) - archive_cmds='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags' - wlarc= - hardcode_direct=yes - hardcode_shlibpath_var=no - ;; - - *) - if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then - archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' - archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' - else - ld_shlibs=no - fi - ;; - esac - - if test "$ld_shlibs" = no; then - runpath_var= - hardcode_libdir_flag_spec= - export_dynamic_flag_spec= - whole_archive_flag_spec= - fi - else - # PORTME fill in a description of your system's linker (not GNU ld) - case $host_os in - aix3*) - allow_undefined_flag=unsupported - always_export_symbols=yes - archive_expsym_cmds='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname' - # Note: this linker hardcodes the directories in LIBPATH if there - # are no directories specified by -L. - hardcode_minus_L=yes - if test "$GCC" = yes && test -z "$lt_prog_compiler_static"; then - # Neither direct hardcoding nor static linking is supported with a - # broken collect2. - hardcode_direct=unsupported - fi - ;; - - aix[4-9]*) - if test "$host_cpu" = ia64; then - # On IA64, the linker does run time linking by default, so we don't - # have to do anything special. - aix_use_runtimelinking=no - exp_sym_flag='-Bexport' - no_entry_flag="" - else - # If we're using GNU nm, then we don't want the "-C" option. - # -C means demangle to AIX nm, but means don't demangle with GNU nm - # Also, AIX nm treats weak defined symbols like other global - # defined symbols, whereas GNU nm marks them as "W". - if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then - export_symbols_cmds='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && (substr(\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' - else - export_symbols_cmds='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && (substr(\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' - fi - aix_use_runtimelinking=no - - # Test if we are trying to use run time linking or normal - # AIX style linking. If -brtl is somewhere in LDFLAGS, we - # need to do runtime linking. - case $host_os in aix4.[23]|aix4.[23].*|aix[5-9]*) - for ld_flag in $LDFLAGS; do - if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then - aix_use_runtimelinking=yes - break - fi - done - ;; - esac - - exp_sym_flag='-bexport' - no_entry_flag='-bnoentry' - fi - - # When large executables or shared objects are built, AIX ld can - # have problems creating the table of contents. If linking a library - # or program results in "error TOC overflow" add -mminimal-toc to - # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not - # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. - - archive_cmds='' - hardcode_direct=yes - hardcode_direct_absolute=yes - hardcode_libdir_separator=':' - link_all_deplibs=yes - file_list_spec='${wl}-f,' - - if test "$GCC" = yes; then - case $host_os in aix4.[012]|aix4.[012].*) - # We only want to do this on AIX 4.2 and lower, the check - # below for broken collect2 doesn't work under 4.3+ - collect2name=`${CC} -print-prog-name=collect2` - if test -f "$collect2name" && - strings "$collect2name" | $GREP resolve_lib_name >/dev/null - then - # We have reworked collect2 - : - else - # We have old collect2 - hardcode_direct=unsupported - # It fails to find uninstalled libraries when the uninstalled - # path is not listed in the libpath. Setting hardcode_minus_L - # to unsupported forces relinking - hardcode_minus_L=yes - hardcode_libdir_flag_spec='-L$libdir' - hardcode_libdir_separator= - fi - ;; - esac - shared_flag='-shared' - if test "$aix_use_runtimelinking" = yes; then - shared_flag="$shared_flag "'${wl}-G' - fi - link_all_deplibs=no - else - # not using gcc - if test "$host_cpu" = ia64; then - # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release - # chokes on -Wl,-G. The following line is correct: - shared_flag='-G' - else - if test "$aix_use_runtimelinking" = yes; then - shared_flag='${wl}-G' - else - shared_flag='${wl}-bM:SRE' - fi - fi - fi - - export_dynamic_flag_spec='${wl}-bexpall' - # It seems that -bexpall does not export symbols beginning with - # underscore (_), so it is better to generate a list of symbols to export. - always_export_symbols=yes - if test "$aix_use_runtimelinking" = yes; then - # Warning - without using the other runtime loading flags (-brtl), - # -berok will link without error, but may produce a broken library. - allow_undefined_flag='-berok' - # Determine the default libpath from the value encoded in an - # empty executable. - if test "${lt_cv_aix_libpath+set}" = set; then - aix_libpath=$lt_cv_aix_libpath -else - if ${lt_cv_aix_libpath_+:} false; then : - $as_echo_n "(cached) " >&6 -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -int -main () -{ - - ; - return 0; -} -_ACEOF -if ac_fn_c_try_link "$LINENO"; then : - - lt_aix_libpath_sed=' - /Import File Strings/,/^$/ { - /^0/ { - s/^0 *\([^ ]*\) *$/\1/ - p - } - }' - lt_cv_aix_libpath_=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` - # Check for a 64-bit object if we didn't find anything. - if test -z "$lt_cv_aix_libpath_"; then - lt_cv_aix_libpath_=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` - fi -fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext - if test -z "$lt_cv_aix_libpath_"; then - lt_cv_aix_libpath_="/usr/lib:/lib" - fi - -fi - - aix_libpath=$lt_cv_aix_libpath_ -fi - - hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath" - archive_expsym_cmds='$CC -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then func_echo_all "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag" - else - if test "$host_cpu" = ia64; then - hardcode_libdir_flag_spec='${wl}-R $libdir:/usr/lib:/lib' - allow_undefined_flag="-z nodefs" - archive_expsym_cmds="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols" - else - # Determine the default libpath from the value encoded in an - # empty executable. - if test "${lt_cv_aix_libpath+set}" = set; then - aix_libpath=$lt_cv_aix_libpath -else - if ${lt_cv_aix_libpath_+:} false; then : - $as_echo_n "(cached) " >&6 -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -int -main () -{ - - ; - return 0; -} -_ACEOF -if ac_fn_c_try_link "$LINENO"; then : - - lt_aix_libpath_sed=' - /Import File Strings/,/^$/ { - /^0/ { - s/^0 *\([^ ]*\) *$/\1/ - p - } - }' - lt_cv_aix_libpath_=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` - # Check for a 64-bit object if we didn't find anything. - if test -z "$lt_cv_aix_libpath_"; then - lt_cv_aix_libpath_=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` - fi -fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext - if test -z "$lt_cv_aix_libpath_"; then - lt_cv_aix_libpath_="/usr/lib:/lib" - fi - -fi - - aix_libpath=$lt_cv_aix_libpath_ -fi - - hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath" - # Warning - without using the other run time loading flags, - # -berok will link without error, but may produce a broken library. - no_undefined_flag=' ${wl}-bernotok' - allow_undefined_flag=' ${wl}-berok' - if test "$with_gnu_ld" = yes; then - # We only use this code for GNU lds that support --whole-archive. - whole_archive_flag_spec='${wl}--whole-archive$convenience ${wl}--no-whole-archive' - else - # Exported symbols can be pulled into shared objects from archives - whole_archive_flag_spec='$convenience' - fi - archive_cmds_need_lc=yes - # This is similar to how AIX traditionally builds its shared libraries. - archive_expsym_cmds="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' - fi - fi - ;; - - amigaos*) - case $host_cpu in - powerpc) - # see comment about AmigaOS4 .so support - archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' - archive_expsym_cmds='' - ;; - m68k) - archive_cmds='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' - hardcode_libdir_flag_spec='-L$libdir' - hardcode_minus_L=yes - ;; - esac - ;; - - bsdi[45]*) - export_dynamic_flag_spec=-rdynamic - ;; - - cygwin* | mingw* | pw32* | cegcc*) - # When not using gcc, we currently assume that we are using - # Microsoft Visual C++. - # hardcode_libdir_flag_spec is actually meaningless, as there is - # no search path for DLLs. - case $cc_basename in - cl*) - # Native MSVC - hardcode_libdir_flag_spec=' ' - allow_undefined_flag=unsupported - always_export_symbols=yes - file_list_spec='@' - # Tell ltmain to make .lib files, not .a files. - libext=lib - # Tell ltmain to make .dll files, not .so files. - shrext_cmds=".dll" - # FIXME: Setting linknames here is a bad hack. - archive_cmds='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-dll~linknames=' - archive_expsym_cmds='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then - sed -n -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' -e '1\\\!p' < $export_symbols > $output_objdir/$soname.exp; - else - sed -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' < $export_symbols > $output_objdir/$soname.exp; - fi~ - $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~ - linknames=' - # The linker will not automatically build a static lib if we build a DLL. - # _LT_TAGVAR(old_archive_from_new_cmds, )='true' - enable_shared_with_static_runtimes=yes - exclude_expsyms='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*' - export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1,DATA/'\'' | $SED -e '\''/^[AITW][ ]/s/.*[ ]//'\'' | sort | uniq > $export_symbols' - # Don't use ranlib - old_postinstall_cmds='chmod 644 $oldlib' - postlink_cmds='lt_outputfile="@OUTPUT@"~ - lt_tool_outputfile="@TOOL_OUTPUT@"~ - case $lt_outputfile in - *.exe|*.EXE) ;; - *) - lt_outputfile="$lt_outputfile.exe" - lt_tool_outputfile="$lt_tool_outputfile.exe" - ;; - esac~ - if test "$MANIFEST_TOOL" != ":" && test -f "$lt_outputfile.manifest"; then - $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1; - $RM "$lt_outputfile.manifest"; - fi' - ;; - *) - # Assume MSVC wrapper - hardcode_libdir_flag_spec=' ' - allow_undefined_flag=unsupported - # Tell ltmain to make .lib files, not .a files. - libext=lib - # Tell ltmain to make .dll files, not .so files. - shrext_cmds=".dll" - # FIXME: Setting linknames here is a bad hack. - archive_cmds='$CC -o $lib $libobjs $compiler_flags `func_echo_all "$deplibs" | $SED '\''s/ -lc$//'\''` -link -dll~linknames=' - # The linker will automatically build a .lib file if we build a DLL. - old_archive_from_new_cmds='true' - # FIXME: Should let the user specify the lib program. - old_archive_cmds='lib -OUT:$oldlib$oldobjs$old_deplibs' - enable_shared_with_static_runtimes=yes - ;; - esac - ;; - - darwin* | rhapsody*) - - - archive_cmds_need_lc=no - hardcode_direct=no - hardcode_automatic=yes - hardcode_shlibpath_var=unsupported - if test "$lt_cv_ld_force_load" = "yes"; then - whole_archive_flag_spec='`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience ${wl}-force_load,$conv\"; done; func_echo_all \"$new_convenience\"`' - - else - whole_archive_flag_spec='' - fi - link_all_deplibs=yes - allow_undefined_flag="$_lt_dar_allow_undefined" - case $cc_basename in - ifort*) _lt_dar_can_shared=yes ;; - *) _lt_dar_can_shared=$GCC ;; - esac - if test "$_lt_dar_can_shared" = "yes"; then - output_verbose_link_cmd=func_echo_all - archive_cmds="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod${_lt_dsymutil}" - module_cmds="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dsymutil}" - archive_expsym_cmds="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring ${_lt_dar_single_mod}${_lt_dar_export_syms}${_lt_dsymutil}" - module_expsym_cmds="sed -e 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dar_export_syms}${_lt_dsymutil}" - - else - ld_shlibs=no - fi - - ;; - - dgux*) - archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' - hardcode_libdir_flag_spec='-L$libdir' - hardcode_shlibpath_var=no - ;; - - # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor - # support. Future versions do this automatically, but an explicit c++rt0.o - # does not break anything, and helps significantly (at the cost of a little - # extra space). - freebsd2.2*) - archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o' - hardcode_libdir_flag_spec='-R$libdir' - hardcode_direct=yes - hardcode_shlibpath_var=no - ;; - - # Unfortunately, older versions of FreeBSD 2 do not have this feature. - freebsd2.*) - archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' - hardcode_direct=yes - hardcode_minus_L=yes - hardcode_shlibpath_var=no - ;; - - # FreeBSD 3 and greater uses gcc -shared to do shared libraries. - freebsd* | dragonfly*) - archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' - hardcode_libdir_flag_spec='-R$libdir' - hardcode_direct=yes - hardcode_shlibpath_var=no - ;; - - hpux9*) - if test "$GCC" = yes; then - archive_cmds='$RM $output_objdir/$soname~$CC -shared $pic_flag ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' - else - archive_cmds='$RM $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' - fi - hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' - hardcode_libdir_separator=: - hardcode_direct=yes - - # hardcode_minus_L: Not really in the search PATH, - # but as the default location of the library. - hardcode_minus_L=yes - export_dynamic_flag_spec='${wl}-E' - ;; - - hpux10*) - if test "$GCC" = yes && test "$with_gnu_ld" = no; then - archive_cmds='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' - else - archive_cmds='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' - fi - if test "$with_gnu_ld" = no; then - hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' - hardcode_libdir_separator=: - hardcode_direct=yes - hardcode_direct_absolute=yes - export_dynamic_flag_spec='${wl}-E' - # hardcode_minus_L: Not really in the search PATH, - # but as the default location of the library. - hardcode_minus_L=yes - fi - ;; - - hpux11*) - if test "$GCC" = yes && test "$with_gnu_ld" = no; then - case $host_cpu in - hppa*64*) - archive_cmds='$CC -shared ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' - ;; - ia64*) - archive_cmds='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' - ;; - *) - archive_cmds='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' - ;; - esac - else - case $host_cpu in - hppa*64*) - archive_cmds='$CC -b ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' - ;; - ia64*) - archive_cmds='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' - ;; - *) - - # Older versions of the 11.00 compiler do not understand -b yet - # (HP92453-01 A.11.01.20 doesn't, HP92453-01 B.11.X.35175-35176.GP does) - { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $CC understands -b" >&5 -$as_echo_n "checking if $CC understands -b... " >&6; } -if ${lt_cv_prog_compiler__b+:} false; then : - $as_echo_n "(cached) " >&6 -else - lt_cv_prog_compiler__b=no - save_LDFLAGS="$LDFLAGS" - LDFLAGS="$LDFLAGS -b" - echo "$lt_simple_link_test_code" > conftest.$ac_ext - if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then - # The linker can only warn and ignore the option if not recognized - # So say no if there are warnings - if test -s conftest.err; then - # Append any errors to the config.log. - cat conftest.err 1>&5 - $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp - $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 - if diff conftest.exp conftest.er2 >/dev/null; then - lt_cv_prog_compiler__b=yes - fi - else - lt_cv_prog_compiler__b=yes - fi - fi - $RM -r conftest* - LDFLAGS="$save_LDFLAGS" - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler__b" >&5 -$as_echo "$lt_cv_prog_compiler__b" >&6; } - -if test x"$lt_cv_prog_compiler__b" = xyes; then - archive_cmds='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' -else - archive_cmds='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' -fi - - ;; - esac - fi - if test "$with_gnu_ld" = no; then - hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' - hardcode_libdir_separator=: - - case $host_cpu in - hppa*64*|ia64*) - hardcode_direct=no - hardcode_shlibpath_var=no - ;; - *) - hardcode_direct=yes - hardcode_direct_absolute=yes - export_dynamic_flag_spec='${wl}-E' - - # hardcode_minus_L: Not really in the search PATH, - # but as the default location of the library. - hardcode_minus_L=yes - ;; - esac - fi - ;; - - irix5* | irix6* | nonstopux*) - if test "$GCC" = yes; then - archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' - # Try to use the -exported_symbol ld option, if it does not - # work, assume that -exports_file does not work either and - # implicitly export all symbols. - # This should be the same for all languages, so no per-tag cache variable. - { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $host_os linker accepts -exported_symbol" >&5 -$as_echo_n "checking whether the $host_os linker accepts -exported_symbol... " >&6; } -if ${lt_cv_irix_exported_symbol+:} false; then : - $as_echo_n "(cached) " >&6 -else - save_LDFLAGS="$LDFLAGS" - LDFLAGS="$LDFLAGS -shared ${wl}-exported_symbol ${wl}foo ${wl}-update_registry ${wl}/dev/null" - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -int foo (void) { return 0; } -_ACEOF -if ac_fn_c_try_link "$LINENO"; then : - lt_cv_irix_exported_symbol=yes -else - lt_cv_irix_exported_symbol=no -fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext - LDFLAGS="$save_LDFLAGS" -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_irix_exported_symbol" >&5 -$as_echo "$lt_cv_irix_exported_symbol" >&6; } - if test "$lt_cv_irix_exported_symbol" = yes; then - archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations ${wl}-exports_file ${wl}$export_symbols -o $lib' - fi - else - archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' - archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -exports_file $export_symbols -o $lib' - fi - archive_cmds_need_lc='no' - hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' - hardcode_libdir_separator=: - inherit_rpath=yes - link_all_deplibs=yes - ;; - - netbsd* | netbsdelf*-gnu) - if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then - archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' # a.out - else - archive_cmds='$LD -shared -o $lib $libobjs $deplibs $linker_flags' # ELF - fi - hardcode_libdir_flag_spec='-R$libdir' - hardcode_direct=yes - hardcode_shlibpath_var=no - ;; - - newsos6) - archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' - hardcode_direct=yes - hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' - hardcode_libdir_separator=: - hardcode_shlibpath_var=no - ;; - - *nto* | *qnx*) - ;; - - openbsd*) - if test -f /usr/libexec/ld.so; then - hardcode_direct=yes - hardcode_shlibpath_var=no - hardcode_direct_absolute=yes - if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then - archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' - archive_expsym_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-retain-symbols-file,$export_symbols' - hardcode_libdir_flag_spec='${wl}-rpath,$libdir' - export_dynamic_flag_spec='${wl}-E' - else - case $host_os in - openbsd[01].* | openbsd2.[0-7] | openbsd2.[0-7].*) - archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' - hardcode_libdir_flag_spec='-R$libdir' - ;; - *) - archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' - hardcode_libdir_flag_spec='${wl}-rpath,$libdir' - ;; - esac - fi - else - ld_shlibs=no - fi - ;; - - os2*) - hardcode_libdir_flag_spec='-L$libdir' - hardcode_minus_L=yes - allow_undefined_flag=unsupported - archive_cmds='$ECHO "LIBRARY $libname INITINSTANCE" > $output_objdir/$libname.def~$ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~echo DATA >> $output_objdir/$libname.def~echo " SINGLE NONSHARED" >> $output_objdir/$libname.def~echo EXPORTS >> $output_objdir/$libname.def~emxexp $libobjs >> $output_objdir/$libname.def~$CC -Zdll -Zcrtdll -o $lib $libobjs $deplibs $compiler_flags $output_objdir/$libname.def' - old_archive_from_new_cmds='emximp -o $output_objdir/$libname.a $output_objdir/$libname.def' - ;; - - osf3*) - if test "$GCC" = yes; then - allow_undefined_flag=' ${wl}-expect_unresolved ${wl}\*' - archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' - else - allow_undefined_flag=' -expect_unresolved \*' - archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' - fi - archive_cmds_need_lc='no' - hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' - hardcode_libdir_separator=: - ;; - - osf4* | osf5*) # as osf3* with the addition of -msym flag - if test "$GCC" = yes; then - allow_undefined_flag=' ${wl}-expect_unresolved ${wl}\*' - archive_cmds='$CC -shared${allow_undefined_flag} $pic_flag $libobjs $deplibs $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' - hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' - else - allow_undefined_flag=' -expect_unresolved \*' - archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' - archive_expsym_cmds='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; printf "%s\\n" "-hidden">> $lib.exp~ - $CC -shared${allow_undefined_flag} ${wl}-input ${wl}$lib.exp $compiler_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib~$RM $lib.exp' - - # Both c and cxx compiler support -rpath directly - hardcode_libdir_flag_spec='-rpath $libdir' - fi - archive_cmds_need_lc='no' - hardcode_libdir_separator=: - ;; - - solaris*) - no_undefined_flag=' -z defs' - if test "$GCC" = yes; then - wlarc='${wl}' - archive_cmds='$CC -shared $pic_flag ${wl}-z ${wl}text ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' - archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ - $CC -shared $pic_flag ${wl}-z ${wl}text ${wl}-M ${wl}$lib.exp ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' - else - case `$CC -V 2>&1` in - *"Compilers 5.0"*) - wlarc='' - archive_cmds='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags' - archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ - $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$RM $lib.exp' - ;; - *) - wlarc='${wl}' - archive_cmds='$CC -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $compiler_flags' - archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ - $CC -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' - ;; - esac - fi - hardcode_libdir_flag_spec='-R$libdir' - hardcode_shlibpath_var=no - case $host_os in - solaris2.[0-5] | solaris2.[0-5].*) ;; - *) - # The compiler driver will combine and reorder linker options, - # but understands `-z linker_flag'. GCC discards it without `$wl', - # but is careful enough not to reorder. - # Supported since Solaris 2.6 (maybe 2.5.1?) - if test "$GCC" = yes; then - whole_archive_flag_spec='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract' - else - whole_archive_flag_spec='-z allextract$convenience -z defaultextract' - fi - ;; - esac - link_all_deplibs=yes - ;; - - sunos4*) - if test "x$host_vendor" = xsequent; then - # Use $CC to link under sequent, because it throws in some extra .o - # files that make .init and .fini sections work. - archive_cmds='$CC -G ${wl}-h $soname -o $lib $libobjs $deplibs $compiler_flags' - else - archive_cmds='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags' - fi - hardcode_libdir_flag_spec='-L$libdir' - hardcode_direct=yes - hardcode_minus_L=yes - hardcode_shlibpath_var=no - ;; - - sysv4) - case $host_vendor in - sni) - archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' - hardcode_direct=yes # is this really true??? - ;; - siemens) - ## LD is ld it makes a PLAMLIB - ## CC just makes a GrossModule. - archive_cmds='$LD -G -o $lib $libobjs $deplibs $linker_flags' - reload_cmds='$CC -r -o $output$reload_objs' - hardcode_direct=no - ;; - motorola) - archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' - hardcode_direct=no #Motorola manual says yes, but my tests say they lie - ;; - esac - runpath_var='LD_RUN_PATH' - hardcode_shlibpath_var=no - ;; - - sysv4.3*) - archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' - hardcode_shlibpath_var=no - export_dynamic_flag_spec='-Bexport' - ;; - - sysv4*MP*) - if test -d /usr/nec; then - archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' - hardcode_shlibpath_var=no - runpath_var=LD_RUN_PATH - hardcode_runpath_var=yes - ld_shlibs=yes - fi - ;; - - sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7* | sco3.2v5.0.[024]*) - no_undefined_flag='${wl}-z,text' - archive_cmds_need_lc=no - hardcode_shlibpath_var=no - runpath_var='LD_RUN_PATH' - - if test "$GCC" = yes; then - archive_cmds='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' - archive_expsym_cmds='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' - else - archive_cmds='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' - archive_expsym_cmds='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' - fi - ;; - - sysv5* | sco3.2v5* | sco5v6*) - # Note: We can NOT use -z defs as we might desire, because we do not - # link with -lc, and that would cause any symbols used from libc to - # always be unresolved, which means just about no library would - # ever link correctly. If we're not using GNU ld we use -z text - # though, which does catch some bad symbols but isn't as heavy-handed - # as -z defs. - no_undefined_flag='${wl}-z,text' - allow_undefined_flag='${wl}-z,nodefs' - archive_cmds_need_lc=no - hardcode_shlibpath_var=no - hardcode_libdir_flag_spec='${wl}-R,$libdir' - hardcode_libdir_separator=':' - link_all_deplibs=yes - export_dynamic_flag_spec='${wl}-Bexport' - runpath_var='LD_RUN_PATH' - - if test "$GCC" = yes; then - archive_cmds='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' - archive_expsym_cmds='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' - else - archive_cmds='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' - archive_expsym_cmds='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' - fi - ;; - - uts4*) - archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' - hardcode_libdir_flag_spec='-L$libdir' - hardcode_shlibpath_var=no - ;; - - *) - ld_shlibs=no - ;; - esac - - if test x$host_vendor = xsni; then - case $host in - sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) - export_dynamic_flag_spec='${wl}-Blargedynsym' - ;; - esac - fi - fi - -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ld_shlibs" >&5 -$as_echo "$ld_shlibs" >&6; } -test "$ld_shlibs" = no && can_build_shared=no - -with_gnu_ld=$with_gnu_ld - - - - - - - - - - - - - - - -# -# Do we need to explicitly link libc? -# -case "x$archive_cmds_need_lc" in -x|xyes) - # Assume -lc should be added - archive_cmds_need_lc=yes - - if test "$enable_shared" = yes && test "$GCC" = yes; then - case $archive_cmds in - *'~'*) - # FIXME: we may have to deal with multi-command sequences. - ;; - '$CC '*) - # Test whether the compiler implicitly links with -lc since on some - # systems, -lgcc has to come before -lc. If gcc already passes -lc - # to ld, don't add -lc before -lgcc. - { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether -lc should be explicitly linked in" >&5 -$as_echo_n "checking whether -lc should be explicitly linked in... " >&6; } -if ${lt_cv_archive_cmds_need_lc+:} false; then : - $as_echo_n "(cached) " >&6 -else - $RM conftest* - echo "$lt_simple_compile_test_code" > conftest.$ac_ext - - if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 - (eval $ac_compile) 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } 2>conftest.err; then - soname=conftest - lib=conftest - libobjs=conftest.$ac_objext - deplibs= - wl=$lt_prog_compiler_wl - pic_flag=$lt_prog_compiler_pic - compiler_flags=-v - linker_flags=-v - verstring= - output_objdir=. - libname=conftest - lt_save_allow_undefined_flag=$allow_undefined_flag - allow_undefined_flag= - if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$archive_cmds 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1\""; } >&5 - (eval $archive_cmds 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1) 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } - then - lt_cv_archive_cmds_need_lc=no - else - lt_cv_archive_cmds_need_lc=yes - fi - allow_undefined_flag=$lt_save_allow_undefined_flag - else - cat conftest.err 1>&5 - fi - $RM conftest* - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_archive_cmds_need_lc" >&5 -$as_echo "$lt_cv_archive_cmds_need_lc" >&6; } - archive_cmds_need_lc=$lt_cv_archive_cmds_need_lc - ;; - esac - fi - ;; -esac - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - { $as_echo "$as_me:${as_lineno-$LINENO}: checking dynamic linker characteristics" >&5 -$as_echo_n "checking dynamic linker characteristics... " >&6; } - -if test "$GCC" = yes; then - case $host_os in - darwin*) lt_awk_arg="/^libraries:/,/LR/" ;; - *) lt_awk_arg="/^libraries:/" ;; - esac - case $host_os in - mingw* | cegcc*) lt_sed_strip_eq="s,=\([A-Za-z]:\),\1,g" ;; - *) lt_sed_strip_eq="s,=/,/,g" ;; - esac - lt_search_path_spec=`$CC -print-search-dirs | awk $lt_awk_arg | $SED -e "s/^libraries://" -e $lt_sed_strip_eq` - case $lt_search_path_spec in - *\;*) - # if the path contains ";" then we assume it to be the separator - # otherwise default to the standard path separator (i.e. ":") - it is - # assumed that no part of a normal pathname contains ";" but that should - # okay in the real world where ";" in dirpaths is itself problematic. - lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED 's/;/ /g'` - ;; - *) - lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED "s/$PATH_SEPARATOR/ /g"` - ;; - esac - # Ok, now we have the path, separated by spaces, we can step through it - # and add multilib dir if necessary. - lt_tmp_lt_search_path_spec= - lt_multi_os_dir=`$CC $CPPFLAGS $CFLAGS $LDFLAGS -print-multi-os-directory 2>/dev/null` - for lt_sys_path in $lt_search_path_spec; do - if test -d "$lt_sys_path/$lt_multi_os_dir"; then - lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path/$lt_multi_os_dir" - else - test -d "$lt_sys_path" && \ - lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path" - fi - done - lt_search_path_spec=`$ECHO "$lt_tmp_lt_search_path_spec" | awk ' -BEGIN {RS=" "; FS="/|\n";} { - lt_foo=""; - lt_count=0; - for (lt_i = NF; lt_i > 0; lt_i--) { - if ($lt_i != "" && $lt_i != ".") { - if ($lt_i == "..") { - lt_count++; - } else { - if (lt_count == 0) { - lt_foo="/" $lt_i lt_foo; - } else { - lt_count--; - } - } - } - } - if (lt_foo != "") { lt_freq[lt_foo]++; } - if (lt_freq[lt_foo] == 1) { print lt_foo; } -}'` - # AWK program above erroneously prepends '/' to C:/dos/paths - # for these hosts. - case $host_os in - mingw* | cegcc*) lt_search_path_spec=`$ECHO "$lt_search_path_spec" |\ - $SED 's,/\([A-Za-z]:\),\1,g'` ;; - esac - sys_lib_search_path_spec=`$ECHO "$lt_search_path_spec" | $lt_NL2SP` -else - sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" -fi -library_names_spec= -libname_spec='lib$name' -soname_spec= -shrext_cmds=".so" -postinstall_cmds= -postuninstall_cmds= -finish_cmds= -finish_eval= -shlibpath_var= -shlibpath_overrides_runpath=unknown -version_type=none -dynamic_linker="$host_os ld.so" -sys_lib_dlsearch_path_spec="/lib /usr/lib" -need_lib_prefix=unknown -hardcode_into_libs=no - -# when you set need_version to no, make sure it does not cause -set_version -# flags to be left without arguments -need_version=unknown - -case $host_os in -aix3*) - version_type=linux # correct to gnu/linux during the next big refactor - library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a' - shlibpath_var=LIBPATH - - # AIX 3 has no versioning support, so we append a major version to the name. - soname_spec='${libname}${release}${shared_ext}$major' - ;; - -aix[4-9]*) - version_type=linux # correct to gnu/linux during the next big refactor - need_lib_prefix=no - need_version=no - hardcode_into_libs=yes - if test "$host_cpu" = ia64; then - # AIX 5 supports IA64 - library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}' - shlibpath_var=LD_LIBRARY_PATH - else - # With GCC up to 2.95.x, collect2 would create an import file - # for dependence libraries. The import file would start with - # the line `#! .'. This would cause the generated library to - # depend on `.', always an invalid library. This was fixed in - # development snapshots of GCC prior to 3.0. - case $host_os in - aix4 | aix4.[01] | aix4.[01].*) - if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)' - echo ' yes ' - echo '#endif'; } | ${CC} -E - | $GREP yes > /dev/null; then - : - else - can_build_shared=no - fi - ;; - esac - # AIX (on Power*) has no versioning support, so currently we can not hardcode correct - # soname into executable. Probably we can add versioning support to - # collect2, so additional links can be useful in future. - if test "$aix_use_runtimelinking" = yes; then - # If using run time linking (on AIX 4.2 or later) use lib.so - # instead of lib.a to let people know that these are not - # typical AIX shared libraries. - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - else - # We preserve .a as extension for shared libraries through AIX4.2 - # and later when we are not doing run time linking. - library_names_spec='${libname}${release}.a $libname.a' - soname_spec='${libname}${release}${shared_ext}$major' - fi - shlibpath_var=LIBPATH - fi - ;; - -amigaos*) - case $host_cpu in - powerpc) - # Since July 2007 AmigaOS4 officially supports .so libraries. - # When compiling the executable, add -use-dynld -Lsobjs: to the compileline. - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - ;; - m68k) - library_names_spec='$libname.ixlibrary $libname.a' - # Create ${libname}_ixlibrary.a entries in /sys/libs. - finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`func_echo_all "$lib" | $SED '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; test $RM /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done' - ;; - esac - ;; - -beos*) - library_names_spec='${libname}${shared_ext}' - dynamic_linker="$host_os ld.so" - shlibpath_var=LIBRARY_PATH - ;; - -bsdi[45]*) - version_type=linux # correct to gnu/linux during the next big refactor - need_version=no - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir' - shlibpath_var=LD_LIBRARY_PATH - sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib" - sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib" - # the default ld.so.conf also contains /usr/contrib/lib and - # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow - # libtool to hard-code these into programs - ;; - -cygwin* | mingw* | pw32* | cegcc*) - version_type=windows - shrext_cmds=".dll" - need_version=no - need_lib_prefix=no - - case $GCC,$cc_basename in - yes,*) - # gcc - library_names_spec='$libname.dll.a' - # DLL is installed to $(libdir)/../bin by postinstall_cmds - postinstall_cmds='base_file=`basename \${file}`~ - dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~ - dldir=$destdir/`dirname \$dlpath`~ - test -d \$dldir || mkdir -p \$dldir~ - $install_prog $dir/$dlname \$dldir/$dlname~ - chmod a+x \$dldir/$dlname~ - if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then - eval '\''$striplib \$dldir/$dlname'\'' || exit \$?; - fi' - postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ - dlpath=$dir/\$dldll~ - $RM \$dlpath' - shlibpath_overrides_runpath=yes - - case $host_os in - cygwin*) - # Cygwin DLLs use 'cyg' prefix rather than 'lib' - soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' - - sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/lib/w32api" - ;; - mingw* | cegcc*) - # MinGW DLLs use traditional 'lib' prefix - soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' - ;; - pw32*) - # pw32 DLLs use 'pw' prefix rather than 'lib' - library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' - ;; - esac - dynamic_linker='Win32 ld.exe' - ;; - - *,cl*) - # Native MSVC - libname_spec='$name' - soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' - library_names_spec='${libname}.dll.lib' - - case $build_os in - mingw*) - sys_lib_search_path_spec= - lt_save_ifs=$IFS - IFS=';' - for lt_path in $LIB - do - IFS=$lt_save_ifs - # Let DOS variable expansion print the short 8.3 style file name. - lt_path=`cd "$lt_path" 2>/dev/null && cmd //C "for %i in (".") do @echo %~si"` - sys_lib_search_path_spec="$sys_lib_search_path_spec $lt_path" - done - IFS=$lt_save_ifs - # Convert to MSYS style. - sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | sed -e 's|\\\\|/|g' -e 's| \\([a-zA-Z]\\):| /\\1|g' -e 's|^ ||'` - ;; - cygwin*) - # Convert to unix form, then to dos form, then back to unix form - # but this time dos style (no spaces!) so that the unix form looks - # like /cygdrive/c/PROGRA~1:/cygdr... - sys_lib_search_path_spec=`cygpath --path --unix "$LIB"` - sys_lib_search_path_spec=`cygpath --path --dos "$sys_lib_search_path_spec" 2>/dev/null` - sys_lib_search_path_spec=`cygpath --path --unix "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` - ;; - *) - sys_lib_search_path_spec="$LIB" - if $ECHO "$sys_lib_search_path_spec" | $GREP ';[c-zC-Z]:/' >/dev/null; then - # It is most probably a Windows format PATH. - sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` - else - sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` - fi - # FIXME: find the short name or the path components, as spaces are - # common. (e.g. "Program Files" -> "PROGRA~1") - ;; - esac - - # DLL is installed to $(libdir)/../bin by postinstall_cmds - postinstall_cmds='base_file=`basename \${file}`~ - dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~ - dldir=$destdir/`dirname \$dlpath`~ - test -d \$dldir || mkdir -p \$dldir~ - $install_prog $dir/$dlname \$dldir/$dlname' - postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ - dlpath=$dir/\$dldll~ - $RM \$dlpath' - shlibpath_overrides_runpath=yes - dynamic_linker='Win32 link.exe' - ;; - - *) - # Assume MSVC wrapper - library_names_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext} $libname.lib' - dynamic_linker='Win32 ld.exe' - ;; - esac - # FIXME: first we should search . and the directory the executable is in - shlibpath_var=PATH - ;; - -darwin* | rhapsody*) - dynamic_linker="$host_os dyld" - version_type=darwin - need_lib_prefix=no - need_version=no - library_names_spec='${libname}${release}${major}$shared_ext ${libname}$shared_ext' - soname_spec='${libname}${release}${major}$shared_ext' - shlibpath_overrides_runpath=yes - shlibpath_var=DYLD_LIBRARY_PATH - shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`' - - sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/local/lib" - sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib' - ;; - -dgux*) - version_type=linux # correct to gnu/linux during the next big refactor - need_lib_prefix=no - need_version=no - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext' - soname_spec='${libname}${release}${shared_ext}$major' - shlibpath_var=LD_LIBRARY_PATH - ;; - -freebsd* | dragonfly*) - # DragonFly does not have aout. When/if they implement a new - # versioning mechanism, adjust this. - if test -x /usr/bin/objformat; then - objformat=`/usr/bin/objformat` - else - case $host_os in - freebsd[23].*) objformat=aout ;; - *) objformat=elf ;; - esac - fi - version_type=freebsd-$objformat - case $version_type in - freebsd-elf*) - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' - need_version=no - need_lib_prefix=no - ;; - freebsd-*) - library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix' - need_version=yes - ;; - esac - shlibpath_var=LD_LIBRARY_PATH - case $host_os in - freebsd2.*) - shlibpath_overrides_runpath=yes - ;; - freebsd3.[01]* | freebsdelf3.[01]*) - shlibpath_overrides_runpath=yes - hardcode_into_libs=yes - ;; - freebsd3.[2-9]* | freebsdelf3.[2-9]* | \ - freebsd4.[0-5] | freebsdelf4.[0-5] | freebsd4.1.1 | freebsdelf4.1.1) - shlibpath_overrides_runpath=no - hardcode_into_libs=yes - ;; - *) # from 4.6 on, and DragonFly - shlibpath_overrides_runpath=yes - hardcode_into_libs=yes - ;; - esac - ;; - -gnu*) - version_type=linux # correct to gnu/linux during the next big refactor - need_lib_prefix=no - need_version=no - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=no - hardcode_into_libs=yes - ;; - -haiku*) - version_type=linux # correct to gnu/linux during the next big refactor - need_lib_prefix=no - need_version=no - dynamic_linker="$host_os runtime_loader" - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - shlibpath_var=LIBRARY_PATH - shlibpath_overrides_runpath=yes - sys_lib_dlsearch_path_spec='/boot/home/config/lib /boot/common/lib /boot/system/lib' - hardcode_into_libs=yes - ;; - -hpux9* | hpux10* | hpux11*) - # Give a soname corresponding to the major version so that dld.sl refuses to - # link against other versions. - version_type=sunos - need_lib_prefix=no - need_version=no - case $host_cpu in - ia64*) - shrext_cmds='.so' - hardcode_into_libs=yes - dynamic_linker="$host_os dld.so" - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - if test "X$HPUX_IA64_MODE" = X32; then - sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib" - else - sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64" - fi - sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec - ;; - hppa*64*) - shrext_cmds='.sl' - hardcode_into_libs=yes - dynamic_linker="$host_os dld.sl" - shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH - shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64" - sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec - ;; - *) - shrext_cmds='.sl' - dynamic_linker="$host_os dld.sl" - shlibpath_var=SHLIB_PATH - shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - ;; - esac - # HP-UX runs *really* slowly unless shared libraries are mode 555, ... - postinstall_cmds='chmod 555 $lib' - # or fails outright, so override atomically: - install_override_mode=555 - ;; - -interix[3-9]*) - version_type=linux # correct to gnu/linux during the next big refactor - need_lib_prefix=no - need_version=no - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)' - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=no - hardcode_into_libs=yes - ;; - -irix5* | irix6* | nonstopux*) - case $host_os in - nonstopux*) version_type=nonstopux ;; - *) - if test "$lt_cv_prog_gnu_ld" = yes; then - version_type=linux # correct to gnu/linux during the next big refactor - else - version_type=irix - fi ;; - esac - need_lib_prefix=no - need_version=no - soname_spec='${libname}${release}${shared_ext}$major' - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}' - case $host_os in - irix5* | nonstopux*) - libsuff= shlibsuff= - ;; - *) - case $LD in # libtool.m4 will add one of these switches to LD - *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") - libsuff= shlibsuff= libmagic=32-bit;; - *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") - libsuff=32 shlibsuff=N32 libmagic=N32;; - *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") - libsuff=64 shlibsuff=64 libmagic=64-bit;; - *) libsuff= shlibsuff= libmagic=never-match;; - esac - ;; - esac - shlibpath_var=LD_LIBRARY${shlibsuff}_PATH - shlibpath_overrides_runpath=no - sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}" - sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}" - hardcode_into_libs=yes - ;; - -# No shared lib support for Linux oldld, aout, or coff. -linux*oldld* | linux*aout* | linux*coff*) - dynamic_linker=no - ;; - -# This must be glibc/ELF. -linux* | k*bsd*-gnu | kopensolaris*-gnu) - version_type=linux # correct to gnu/linux during the next big refactor - need_lib_prefix=no - need_version=no - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=no - - # Some binutils ld are patched to set DT_RUNPATH - if ${lt_cv_shlibpath_overrides_runpath+:} false; then : - $as_echo_n "(cached) " >&6 -else - lt_cv_shlibpath_overrides_runpath=no - save_LDFLAGS=$LDFLAGS - save_libdir=$libdir - eval "libdir=/foo; wl=\"$lt_prog_compiler_wl\"; \ - LDFLAGS=\"\$LDFLAGS $hardcode_libdir_flag_spec\"" - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -int -main () -{ - - ; - return 0; -} -_ACEOF -if ac_fn_c_try_link "$LINENO"; then : - if ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir" >/dev/null; then : - lt_cv_shlibpath_overrides_runpath=yes -fi -fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext - LDFLAGS=$save_LDFLAGS - libdir=$save_libdir - -fi - - shlibpath_overrides_runpath=$lt_cv_shlibpath_overrides_runpath - - # This implies no fast_install, which is unacceptable. - # Some rework will be needed to allow for fast_install - # before this can be enabled. - hardcode_into_libs=yes - - # Append ld.so.conf contents to the search path - if test -f /etc/ld.so.conf; then - lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \$2)); skip = 1; } { if (!skip) print \$0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[ ]*hwcap[ ]/d;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;s/"//g;/^$/d' | tr '\n' ' '` - sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra" - fi - - # We used to test for /lib/ld.so.1 and disable shared libraries on - # powerpc, because MkLinux only supported shared libraries with the - # GNU dynamic linker. Since this was broken with cross compilers, - # most powerpc-linux boxes support dynamic linking these days and - # people can always --disable-shared, the test was removed, and we - # assume the GNU/Linux dynamic linker is in use. - dynamic_linker='GNU/Linux ld.so' - ;; - -netbsdelf*-gnu) - version_type=linux - need_lib_prefix=no - need_version=no - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=no - hardcode_into_libs=yes - dynamic_linker='NetBSD ld.elf_so' - ;; - -netbsd*) - version_type=sunos - need_lib_prefix=no - need_version=no - if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' - finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' - dynamic_linker='NetBSD (a.out) ld.so' - else - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - dynamic_linker='NetBSD ld.elf_so' - fi - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=yes - hardcode_into_libs=yes - ;; - -newsos6) - version_type=linux # correct to gnu/linux during the next big refactor - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=yes - ;; - -*nto* | *qnx*) - version_type=qnx - need_lib_prefix=no - need_version=no - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=no - hardcode_into_libs=yes - dynamic_linker='ldqnx.so' - ;; - -openbsd*) - version_type=sunos - sys_lib_dlsearch_path_spec="/usr/lib" - need_lib_prefix=no - # Some older versions of OpenBSD (3.3 at least) *do* need versioned libs. - case $host_os in - openbsd3.3 | openbsd3.3.*) need_version=yes ;; - *) need_version=no ;; - esac - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' - finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' - shlibpath_var=LD_LIBRARY_PATH - if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then - case $host_os in - openbsd2.[89] | openbsd2.[89].*) - shlibpath_overrides_runpath=no - ;; - *) - shlibpath_overrides_runpath=yes - ;; - esac - else - shlibpath_overrides_runpath=yes - fi - ;; - -os2*) - libname_spec='$name' - shrext_cmds=".dll" - need_lib_prefix=no - library_names_spec='$libname${shared_ext} $libname.a' - dynamic_linker='OS/2 ld.exe' - shlibpath_var=LIBPATH - ;; - -osf3* | osf4* | osf5*) - version_type=osf - need_lib_prefix=no - need_version=no - soname_spec='${libname}${release}${shared_ext}$major' - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - shlibpath_var=LD_LIBRARY_PATH - sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib" - sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec" - ;; - -rdos*) - dynamic_linker=no - ;; - -solaris*) - version_type=linux # correct to gnu/linux during the next big refactor - need_lib_prefix=no - need_version=no - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=yes - hardcode_into_libs=yes - # ldd complains unless libraries are executable - postinstall_cmds='chmod +x $lib' - ;; - -sunos4*) - version_type=sunos - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' - finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir' - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=yes - if test "$with_gnu_ld" = yes; then - need_lib_prefix=no - fi - need_version=yes - ;; - -sysv4 | sysv4.3*) - version_type=linux # correct to gnu/linux during the next big refactor - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - shlibpath_var=LD_LIBRARY_PATH - case $host_vendor in - sni) - shlibpath_overrides_runpath=no - need_lib_prefix=no - runpath_var=LD_RUN_PATH - ;; - siemens) - need_lib_prefix=no - ;; - motorola) - need_lib_prefix=no - need_version=no - shlibpath_overrides_runpath=no - sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib' - ;; - esac - ;; - -sysv4*MP*) - if test -d /usr/nec ;then - version_type=linux # correct to gnu/linux during the next big refactor - library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}' - soname_spec='$libname${shared_ext}.$major' - shlibpath_var=LD_LIBRARY_PATH - fi - ;; - -sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) - version_type=freebsd-elf - need_lib_prefix=no - need_version=no - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=yes - hardcode_into_libs=yes - if test "$with_gnu_ld" = yes; then - sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib' - else - sys_lib_search_path_spec='/usr/ccs/lib /usr/lib' - case $host_os in - sco3.2v5*) - sys_lib_search_path_spec="$sys_lib_search_path_spec /lib" - ;; - esac - fi - sys_lib_dlsearch_path_spec='/usr/lib' - ;; - -tpf*) - # TPF is a cross-target only. Preferred cross-host = GNU/Linux. - version_type=linux # correct to gnu/linux during the next big refactor - need_lib_prefix=no - need_version=no - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=no - hardcode_into_libs=yes - ;; - -uts4*) - version_type=linux # correct to gnu/linux during the next big refactor - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - shlibpath_var=LD_LIBRARY_PATH - ;; - -*) - dynamic_linker=no - ;; -esac -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $dynamic_linker" >&5 -$as_echo "$dynamic_linker" >&6; } -test "$dynamic_linker" = no && can_build_shared=no - -variables_saved_for_relink="PATH $shlibpath_var $runpath_var" -if test "$GCC" = yes; then - variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" -fi - -if test "${lt_cv_sys_lib_search_path_spec+set}" = set; then - sys_lib_search_path_spec="$lt_cv_sys_lib_search_path_spec" -fi -if test "${lt_cv_sys_lib_dlsearch_path_spec+set}" = set; then - sys_lib_dlsearch_path_spec="$lt_cv_sys_lib_dlsearch_path_spec" -fi - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to hardcode library paths into programs" >&5 -$as_echo_n "checking how to hardcode library paths into programs... " >&6; } -hardcode_action= -if test -n "$hardcode_libdir_flag_spec" || - test -n "$runpath_var" || - test "X$hardcode_automatic" = "Xyes" ; then - - # We can hardcode non-existent directories. - if test "$hardcode_direct" != no && - # If the only mechanism to avoid hardcoding is shlibpath_var, we - # have to relink, otherwise we might link with an installed library - # when we should be linking with a yet-to-be-installed one - ## test "$_LT_TAGVAR(hardcode_shlibpath_var, )" != no && - test "$hardcode_minus_L" != no; then - # Linking always hardcodes the temporary library directory. - hardcode_action=relink - else - # We can link without hardcoding, and we can hardcode nonexisting dirs. - hardcode_action=immediate - fi -else - # We cannot hardcode anything, or else we can only hardcode existing - # directories. - hardcode_action=unsupported -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $hardcode_action" >&5 -$as_echo "$hardcode_action" >&6; } - -if test "$hardcode_action" = relink || - test "$inherit_rpath" = yes; then - # Fast installation is not supported - enable_fast_install=no -elif test "$shlibpath_overrides_runpath" = yes || - test "$enable_shared" = no; then - # Fast installation is not necessary - enable_fast_install=needless -fi - - - - - - - if test "x$enable_dlopen" != xyes; then - enable_dlopen=unknown - enable_dlopen_self=unknown - enable_dlopen_self_static=unknown -else - lt_cv_dlopen=no - lt_cv_dlopen_libs= - - case $host_os in - beos*) - lt_cv_dlopen="load_add_on" - lt_cv_dlopen_libs= - lt_cv_dlopen_self=yes - ;; - - mingw* | pw32* | cegcc*) - lt_cv_dlopen="LoadLibrary" - lt_cv_dlopen_libs= - ;; - - cygwin*) - lt_cv_dlopen="dlopen" - lt_cv_dlopen_libs= - ;; - - darwin*) - # if libdl is installed we need to link against it - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5 -$as_echo_n "checking for dlopen in -ldl... " >&6; } -if ${ac_cv_lib_dl_dlopen+:} false; then : - $as_echo_n "(cached) " >&6 -else - ac_check_lib_save_LIBS=$LIBS -LIBS="-ldl $LIBS" -cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -/* Override any GCC internal prototype to avoid an error. - Use char because int might match the return type of a GCC - builtin and then its argument prototype would still apply. */ -#ifdef __cplusplus -extern "C" -#endif -char dlopen (); -int -main () -{ -return dlopen (); - ; - return 0; -} -_ACEOF -if ac_fn_c_try_link "$LINENO"; then : - ac_cv_lib_dl_dlopen=yes -else - ac_cv_lib_dl_dlopen=no -fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext -LIBS=$ac_check_lib_save_LIBS -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5 -$as_echo "$ac_cv_lib_dl_dlopen" >&6; } -if test "x$ac_cv_lib_dl_dlopen" = xyes; then : - lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl" -else - - lt_cv_dlopen="dyld" - lt_cv_dlopen_libs= - lt_cv_dlopen_self=yes - -fi - - ;; - - *) - ac_fn_c_check_func "$LINENO" "shl_load" "ac_cv_func_shl_load" -if test "x$ac_cv_func_shl_load" = xyes; then : - lt_cv_dlopen="shl_load" -else - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for shl_load in -ldld" >&5 -$as_echo_n "checking for shl_load in -ldld... " >&6; } -if ${ac_cv_lib_dld_shl_load+:} false; then : - $as_echo_n "(cached) " >&6 -else - ac_check_lib_save_LIBS=$LIBS -LIBS="-ldld $LIBS" -cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -/* Override any GCC internal prototype to avoid an error. - Use char because int might match the return type of a GCC - builtin and then its argument prototype would still apply. */ -#ifdef __cplusplus -extern "C" -#endif -char shl_load (); -int -main () -{ -return shl_load (); - ; - return 0; -} -_ACEOF -if ac_fn_c_try_link "$LINENO"; then : - ac_cv_lib_dld_shl_load=yes -else - ac_cv_lib_dld_shl_load=no -fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext -LIBS=$ac_check_lib_save_LIBS -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dld_shl_load" >&5 -$as_echo "$ac_cv_lib_dld_shl_load" >&6; } -if test "x$ac_cv_lib_dld_shl_load" = xyes; then : - lt_cv_dlopen="shl_load" lt_cv_dlopen_libs="-ldld" -else - ac_fn_c_check_func "$LINENO" "dlopen" "ac_cv_func_dlopen" -if test "x$ac_cv_func_dlopen" = xyes; then : - lt_cv_dlopen="dlopen" -else - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5 -$as_echo_n "checking for dlopen in -ldl... " >&6; } -if ${ac_cv_lib_dl_dlopen+:} false; then : - $as_echo_n "(cached) " >&6 -else - ac_check_lib_save_LIBS=$LIBS -LIBS="-ldl $LIBS" -cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -/* Override any GCC internal prototype to avoid an error. - Use char because int might match the return type of a GCC - builtin and then its argument prototype would still apply. */ -#ifdef __cplusplus -extern "C" -#endif -char dlopen (); -int -main () -{ -return dlopen (); - ; - return 0; -} -_ACEOF -if ac_fn_c_try_link "$LINENO"; then : - ac_cv_lib_dl_dlopen=yes -else - ac_cv_lib_dl_dlopen=no -fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext -LIBS=$ac_check_lib_save_LIBS -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5 -$as_echo "$ac_cv_lib_dl_dlopen" >&6; } -if test "x$ac_cv_lib_dl_dlopen" = xyes; then : - lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl" -else - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -lsvld" >&5 -$as_echo_n "checking for dlopen in -lsvld... " >&6; } -if ${ac_cv_lib_svld_dlopen+:} false; then : - $as_echo_n "(cached) " >&6 -else - ac_check_lib_save_LIBS=$LIBS -LIBS="-lsvld $LIBS" -cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -/* Override any GCC internal prototype to avoid an error. - Use char because int might match the return type of a GCC - builtin and then its argument prototype would still apply. */ -#ifdef __cplusplus -extern "C" -#endif -char dlopen (); -int -main () -{ -return dlopen (); - ; - return 0; -} -_ACEOF -if ac_fn_c_try_link "$LINENO"; then : - ac_cv_lib_svld_dlopen=yes -else - ac_cv_lib_svld_dlopen=no -fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext -LIBS=$ac_check_lib_save_LIBS -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_svld_dlopen" >&5 -$as_echo "$ac_cv_lib_svld_dlopen" >&6; } -if test "x$ac_cv_lib_svld_dlopen" = xyes; then : - lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-lsvld" -else - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dld_link in -ldld" >&5 -$as_echo_n "checking for dld_link in -ldld... " >&6; } -if ${ac_cv_lib_dld_dld_link+:} false; then : - $as_echo_n "(cached) " >&6 -else - ac_check_lib_save_LIBS=$LIBS -LIBS="-ldld $LIBS" -cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -/* Override any GCC internal prototype to avoid an error. - Use char because int might match the return type of a GCC - builtin and then its argument prototype would still apply. */ -#ifdef __cplusplus -extern "C" -#endif -char dld_link (); -int -main () -{ -return dld_link (); - ; - return 0; -} -_ACEOF -if ac_fn_c_try_link "$LINENO"; then : - ac_cv_lib_dld_dld_link=yes -else - ac_cv_lib_dld_dld_link=no -fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext -LIBS=$ac_check_lib_save_LIBS -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dld_dld_link" >&5 -$as_echo "$ac_cv_lib_dld_dld_link" >&6; } -if test "x$ac_cv_lib_dld_dld_link" = xyes; then : - lt_cv_dlopen="dld_link" lt_cv_dlopen_libs="-ldld" -fi - - -fi - - -fi - - -fi - - -fi - - -fi - - ;; - esac - - if test "x$lt_cv_dlopen" != xno; then - enable_dlopen=yes - else - enable_dlopen=no - fi - - case $lt_cv_dlopen in - dlopen) - save_CPPFLAGS="$CPPFLAGS" - test "x$ac_cv_header_dlfcn_h" = xyes && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H" - - save_LDFLAGS="$LDFLAGS" - wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\" - - save_LIBS="$LIBS" - LIBS="$lt_cv_dlopen_libs $LIBS" - - { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether a program can dlopen itself" >&5 -$as_echo_n "checking whether a program can dlopen itself... " >&6; } -if ${lt_cv_dlopen_self+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test "$cross_compiling" = yes; then : - lt_cv_dlopen_self=cross -else - lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 - lt_status=$lt_dlunknown - cat > conftest.$ac_ext <<_LT_EOF -#line $LINENO "configure" -#include "confdefs.h" - -#if HAVE_DLFCN_H -#include -#endif - -#include - -#ifdef RTLD_GLOBAL -# define LT_DLGLOBAL RTLD_GLOBAL -#else -# ifdef DL_GLOBAL -# define LT_DLGLOBAL DL_GLOBAL -# else -# define LT_DLGLOBAL 0 -# endif -#endif - -/* We may have to define LT_DLLAZY_OR_NOW in the command line if we - find out it does not work in some platform. */ -#ifndef LT_DLLAZY_OR_NOW -# ifdef RTLD_LAZY -# define LT_DLLAZY_OR_NOW RTLD_LAZY -# else -# ifdef DL_LAZY -# define LT_DLLAZY_OR_NOW DL_LAZY -# else -# ifdef RTLD_NOW -# define LT_DLLAZY_OR_NOW RTLD_NOW -# else -# ifdef DL_NOW -# define LT_DLLAZY_OR_NOW DL_NOW -# else -# define LT_DLLAZY_OR_NOW 0 -# endif -# endif -# endif -# endif -#endif - -/* When -fvisbility=hidden is used, assume the code has been annotated - correspondingly for the symbols needed. */ -#if defined(__GNUC__) && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3)) -int fnord () __attribute__((visibility("default"))); -#endif - -int fnord () { return 42; } -int main () -{ - void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); - int status = $lt_dlunknown; - - if (self) - { - if (dlsym (self,"fnord")) status = $lt_dlno_uscore; - else - { - if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; - else puts (dlerror ()); - } - /* dlclose (self); */ - } - else - puts (dlerror ()); - - return status; -} -_LT_EOF - if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5 - (eval $ac_link) 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } && test -s conftest${ac_exeext} 2>/dev/null; then - (./conftest; exit; ) >&5 2>/dev/null - lt_status=$? - case x$lt_status in - x$lt_dlno_uscore) lt_cv_dlopen_self=yes ;; - x$lt_dlneed_uscore) lt_cv_dlopen_self=yes ;; - x$lt_dlunknown|x*) lt_cv_dlopen_self=no ;; - esac - else : - # compilation failed - lt_cv_dlopen_self=no - fi -fi -rm -fr conftest* - - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_dlopen_self" >&5 -$as_echo "$lt_cv_dlopen_self" >&6; } - - if test "x$lt_cv_dlopen_self" = xyes; then - wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $lt_prog_compiler_static\" - { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether a statically linked program can dlopen itself" >&5 -$as_echo_n "checking whether a statically linked program can dlopen itself... " >&6; } -if ${lt_cv_dlopen_self_static+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test "$cross_compiling" = yes; then : - lt_cv_dlopen_self_static=cross -else - lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 - lt_status=$lt_dlunknown - cat > conftest.$ac_ext <<_LT_EOF -#line $LINENO "configure" -#include "confdefs.h" - -#if HAVE_DLFCN_H -#include -#endif - -#include - -#ifdef RTLD_GLOBAL -# define LT_DLGLOBAL RTLD_GLOBAL -#else -# ifdef DL_GLOBAL -# define LT_DLGLOBAL DL_GLOBAL -# else -# define LT_DLGLOBAL 0 -# endif -#endif - -/* We may have to define LT_DLLAZY_OR_NOW in the command line if we - find out it does not work in some platform. */ -#ifndef LT_DLLAZY_OR_NOW -# ifdef RTLD_LAZY -# define LT_DLLAZY_OR_NOW RTLD_LAZY -# else -# ifdef DL_LAZY -# define LT_DLLAZY_OR_NOW DL_LAZY -# else -# ifdef RTLD_NOW -# define LT_DLLAZY_OR_NOW RTLD_NOW -# else -# ifdef DL_NOW -# define LT_DLLAZY_OR_NOW DL_NOW -# else -# define LT_DLLAZY_OR_NOW 0 -# endif -# endif -# endif -# endif -#endif - -/* When -fvisbility=hidden is used, assume the code has been annotated - correspondingly for the symbols needed. */ -#if defined(__GNUC__) && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3)) -int fnord () __attribute__((visibility("default"))); -#endif - -int fnord () { return 42; } -int main () -{ - void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); - int status = $lt_dlunknown; - - if (self) - { - if (dlsym (self,"fnord")) status = $lt_dlno_uscore; - else - { - if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; - else puts (dlerror ()); - } - /* dlclose (self); */ - } - else - puts (dlerror ()); - - return status; -} -_LT_EOF - if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5 - (eval $ac_link) 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } && test -s conftest${ac_exeext} 2>/dev/null; then - (./conftest; exit; ) >&5 2>/dev/null - lt_status=$? - case x$lt_status in - x$lt_dlno_uscore) lt_cv_dlopen_self_static=yes ;; - x$lt_dlneed_uscore) lt_cv_dlopen_self_static=yes ;; - x$lt_dlunknown|x*) lt_cv_dlopen_self_static=no ;; - esac - else : - # compilation failed - lt_cv_dlopen_self_static=no - fi -fi -rm -fr conftest* - - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_dlopen_self_static" >&5 -$as_echo "$lt_cv_dlopen_self_static" >&6; } - fi - - CPPFLAGS="$save_CPPFLAGS" - LDFLAGS="$save_LDFLAGS" - LIBS="$save_LIBS" - ;; - esac - - case $lt_cv_dlopen_self in - yes|no) enable_dlopen_self=$lt_cv_dlopen_self ;; - *) enable_dlopen_self=unknown ;; - esac - - case $lt_cv_dlopen_self_static in - yes|no) enable_dlopen_self_static=$lt_cv_dlopen_self_static ;; - *) enable_dlopen_self_static=unknown ;; - esac -fi - - - - - - - - - - - - - - - - - -striplib= -old_striplib= -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether stripping libraries is possible" >&5 -$as_echo_n "checking whether stripping libraries is possible... " >&6; } -if test -n "$STRIP" && $STRIP -V 2>&1 | $GREP "GNU strip" >/dev/null; then - test -z "$old_striplib" && old_striplib="$STRIP --strip-debug" - test -z "$striplib" && striplib="$STRIP --strip-unneeded" - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; } -else -# FIXME - insert some real tests, host_os isn't really good enough - case $host_os in - darwin*) - if test -n "$STRIP" ; then - striplib="$STRIP -x" - old_striplib="$STRIP -S" - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; } - else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } - fi - ;; - *) - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } - ;; - esac -fi - - - - - - - - - - - - - # Report which library types will actually be built - { $as_echo "$as_me:${as_lineno-$LINENO}: checking if libtool supports shared libraries" >&5 -$as_echo_n "checking if libtool supports shared libraries... " >&6; } - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $can_build_shared" >&5 -$as_echo "$can_build_shared" >&6; } - - { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build shared libraries" >&5 -$as_echo_n "checking whether to build shared libraries... " >&6; } - test "$can_build_shared" = "no" && enable_shared=no - - # On AIX, shared libraries and static libraries use the same namespace, and - # are all built from PIC. - case $host_os in - aix3*) - test "$enable_shared" = yes && enable_static=no - if test -n "$RANLIB"; then - archive_cmds="$archive_cmds~\$RANLIB \$lib" - postinstall_cmds='$RANLIB $lib' - fi - ;; - - aix[4-9]*) - if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then - test "$enable_shared" = yes && enable_static=no - fi - ;; - esac - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_shared" >&5 -$as_echo "$enable_shared" >&6; } - - { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build static libraries" >&5 -$as_echo_n "checking whether to build static libraries... " >&6; } - # Make sure either enable_shared or enable_static is yes. - test "$enable_shared" = yes || enable_static=yes - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_static" >&5 -$as_echo "$enable_static" >&6; } - - - - -fi -ac_ext=c -ac_cpp='$CPP $CPPFLAGS' -ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_c_compiler_gnu - -CC="$lt_save_CC" - - if test -n "$CXX" && ( test "X$CXX" != "Xno" && - ( (test "X$CXX" = "Xg++" && `g++ -v >/dev/null 2>&1` ) || - (test "X$CXX" != "Xg++"))) ; then - ac_ext=cpp -ac_cpp='$CXXCPP $CPPFLAGS' -ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_cxx_compiler_gnu -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C++ preprocessor" >&5 -$as_echo_n "checking how to run the C++ preprocessor... " >&6; } -if test -z "$CXXCPP"; then - if ${ac_cv_prog_CXXCPP+:} false; then : - $as_echo_n "(cached) " >&6 -else - # Double quotes because CXXCPP needs to be expanded - for CXXCPP in "$CXX -E" "/lib/cpp" - do - ac_preproc_ok=false -for ac_cxx_preproc_warn_flag in '' yes -do - # Use a header file that comes with gcc, so configuring glibc - # with a fresh cross-compiler works. - # Prefer to if __STDC__ is defined, since - # exists even on freestanding compilers. - # On the NeXT, cc -E runs the code through the compiler's parser, - # not just through cpp. "Syntax error" is here to catch this case. - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -@%:@ifdef __STDC__ -@%:@ include -@%:@else -@%:@ include -@%:@endif - Syntax error -_ACEOF -if ac_fn_cxx_try_cpp "$LINENO"; then : - -else - # Broken: fails on valid input. -continue -fi -rm -f conftest.err conftest.i conftest.$ac_ext - - # OK, works on sane cases. Now check whether nonexistent headers - # can be detected and how. - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -@%:@include -_ACEOF -if ac_fn_cxx_try_cpp "$LINENO"; then : - # Broken: success on invalid input. -continue -else - # Passes both tests. -ac_preproc_ok=: -break -fi -rm -f conftest.err conftest.i conftest.$ac_ext - -done -# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. -rm -f conftest.i conftest.err conftest.$ac_ext -if $ac_preproc_ok; then : - break -fi - - done - ac_cv_prog_CXXCPP=$CXXCPP - -fi - CXXCPP=$ac_cv_prog_CXXCPP -else - ac_cv_prog_CXXCPP=$CXXCPP -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $CXXCPP" >&5 -$as_echo "$CXXCPP" >&6; } -ac_preproc_ok=false -for ac_cxx_preproc_warn_flag in '' yes -do - # Use a header file that comes with gcc, so configuring glibc - # with a fresh cross-compiler works. - # Prefer to if __STDC__ is defined, since - # exists even on freestanding compilers. - # On the NeXT, cc -E runs the code through the compiler's parser, - # not just through cpp. "Syntax error" is here to catch this case. - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -@%:@ifdef __STDC__ -@%:@ include -@%:@else -@%:@ include -@%:@endif - Syntax error -_ACEOF -if ac_fn_cxx_try_cpp "$LINENO"; then : - -else - # Broken: fails on valid input. -continue -fi -rm -f conftest.err conftest.i conftest.$ac_ext - - # OK, works on sane cases. Now check whether nonexistent headers - # can be detected and how. - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -@%:@include -_ACEOF -if ac_fn_cxx_try_cpp "$LINENO"; then : - # Broken: success on invalid input. -continue -else - # Passes both tests. -ac_preproc_ok=: -break -fi -rm -f conftest.err conftest.i conftest.$ac_ext - -done -# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. -rm -f conftest.i conftest.err conftest.$ac_ext -if $ac_preproc_ok; then : - -else - { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 -$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} -as_fn_error $? "C++ preprocessor \"$CXXCPP\" fails sanity check -See \`config.log' for more details" "$LINENO" 5; } -fi - -ac_ext=c -ac_cpp='$CPP $CPPFLAGS' -ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_c_compiler_gnu - -else - _lt_caught_CXX_error=yes -fi - -ac_ext=cpp -ac_cpp='$CXXCPP $CPPFLAGS' -ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_cxx_compiler_gnu - -archive_cmds_need_lc_CXX=no -allow_undefined_flag_CXX= -always_export_symbols_CXX=no -archive_expsym_cmds_CXX= -compiler_needs_object_CXX=no -export_dynamic_flag_spec_CXX= -hardcode_direct_CXX=no -hardcode_direct_absolute_CXX=no -hardcode_libdir_flag_spec_CXX= -hardcode_libdir_separator_CXX= -hardcode_minus_L_CXX=no -hardcode_shlibpath_var_CXX=unsupported -hardcode_automatic_CXX=no -inherit_rpath_CXX=no -module_cmds_CXX= -module_expsym_cmds_CXX= -link_all_deplibs_CXX=unknown -old_archive_cmds_CXX=$old_archive_cmds -reload_flag_CXX=$reload_flag -reload_cmds_CXX=$reload_cmds -no_undefined_flag_CXX= -whole_archive_flag_spec_CXX= -enable_shared_with_static_runtimes_CXX=no - -# Source file extension for C++ test sources. -ac_ext=cpp - -# Object file extension for compiled C++ test sources. -objext=o -objext_CXX=$objext - -# No sense in running all these tests if we already determined that -# the CXX compiler isn't working. Some variables (like enable_shared) -# are currently assumed to apply to all compilers on this platform, -# and will be corrupted by setting them based on a non-working compiler. -if test "$_lt_caught_CXX_error" != yes; then - # Code to be used in simple compile tests - lt_simple_compile_test_code="int some_variable = 0;" - - # Code to be used in simple link tests - lt_simple_link_test_code='int main(int, char *[]) { return(0); }' - - # ltmain only uses $CC for tagged configurations so make sure $CC is set. - - - - - - -# If no C compiler was specified, use CC. -LTCC=${LTCC-"$CC"} - -# If no C compiler flags were specified, use CFLAGS. -LTCFLAGS=${LTCFLAGS-"$CFLAGS"} - -# Allow CC to be a program name with arguments. -compiler=$CC - - - # save warnings/boilerplate of simple test code - ac_outfile=conftest.$ac_objext -echo "$lt_simple_compile_test_code" >conftest.$ac_ext -eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err -_lt_compiler_boilerplate=`cat conftest.err` -$RM conftest* - - ac_outfile=conftest.$ac_objext -echo "$lt_simple_link_test_code" >conftest.$ac_ext -eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err -_lt_linker_boilerplate=`cat conftest.err` -$RM -r conftest* - - - # Allow CC to be a program name with arguments. - lt_save_CC=$CC - lt_save_CFLAGS=$CFLAGS - lt_save_LD=$LD - lt_save_GCC=$GCC - GCC=$GXX - lt_save_with_gnu_ld=$with_gnu_ld - lt_save_path_LD=$lt_cv_path_LD - if test -n "${lt_cv_prog_gnu_ldcxx+set}"; then - lt_cv_prog_gnu_ld=$lt_cv_prog_gnu_ldcxx - else - $as_unset lt_cv_prog_gnu_ld - fi - if test -n "${lt_cv_path_LDCXX+set}"; then - lt_cv_path_LD=$lt_cv_path_LDCXX - else - $as_unset lt_cv_path_LD - fi - test -z "${LDCXX+set}" || LD=$LDCXX - CC=${CXX-"c++"} - CFLAGS=$CXXFLAGS - compiler=$CC - compiler_CXX=$CC - for cc_temp in $compiler""; do - case $cc_temp in - compile | *[\\/]compile | ccache | *[\\/]ccache ) ;; - distcc | *[\\/]distcc | purify | *[\\/]purify ) ;; - \-*) ;; - *) break;; - esac -done -cc_basename=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"` - - - if test -n "$compiler"; then - # We don't want -fno-exception when compiling C++ code, so set the - # no_builtin_flag separately - if test "$GXX" = yes; then - lt_prog_compiler_no_builtin_flag_CXX=' -fno-builtin' - else - lt_prog_compiler_no_builtin_flag_CXX= - fi - - if test "$GXX" = yes; then - # Set up default GNU C++ configuration - - - -@%:@ Check whether --with-gnu-ld was given. -if test "${with_gnu_ld+set}" = set; then : - withval=$with_gnu_ld; test "$withval" = no || with_gnu_ld=yes -else - with_gnu_ld=no -fi - -ac_prog=ld -if test "$GCC" = yes; then - # Check if gcc -print-prog-name=ld gives a path. - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ld used by $CC" >&5 -$as_echo_n "checking for ld used by $CC... " >&6; } - case $host in - *-*-mingw*) - # gcc leaves a trailing carriage return which upsets mingw - ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;; - *) - ac_prog=`($CC -print-prog-name=ld) 2>&5` ;; - esac - case $ac_prog in - # Accept absolute paths. - [\\/]* | ?:[\\/]*) - re_direlt='/[^/][^/]*/\.\./' - # Canonicalize the pathname of ld - ac_prog=`$ECHO "$ac_prog"| $SED 's%\\\\%/%g'` - while $ECHO "$ac_prog" | $GREP "$re_direlt" > /dev/null 2>&1; do - ac_prog=`$ECHO $ac_prog| $SED "s%$re_direlt%/%"` - done - test -z "$LD" && LD="$ac_prog" - ;; - "") - # If it fails, then pretend we aren't using GCC. - ac_prog=ld - ;; - *) - # If it is relative, then search for the first ld in PATH. - with_gnu_ld=unknown - ;; - esac -elif test "$with_gnu_ld" = yes; then - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU ld" >&5 -$as_echo_n "checking for GNU ld... " >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for non-GNU ld" >&5 -$as_echo_n "checking for non-GNU ld... " >&6; } -fi -if ${lt_cv_path_LD+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -z "$LD"; then - lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR - for ac_dir in $PATH; do - IFS="$lt_save_ifs" - test -z "$ac_dir" && ac_dir=. - if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then - lt_cv_path_LD="$ac_dir/$ac_prog" - # Check to see if the program is GNU ld. I'd rather use --version, - # but apparently some variants of GNU ld only accept -v. - # Break only if it was the GNU/non-GNU ld that we prefer. - case `"$lt_cv_path_LD" -v 2>&1 &5 -$as_echo "$LD" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi -test -z "$LD" && as_fn_error $? "no acceptable ld found in \$PATH" "$LINENO" 5 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if the linker ($LD) is GNU ld" >&5 -$as_echo_n "checking if the linker ($LD) is GNU ld... " >&6; } -if ${lt_cv_prog_gnu_ld+:} false; then : - $as_echo_n "(cached) " >&6 -else - # I'd rather use --version here, but apparently some GNU lds only accept -v. -case `$LD -v 2>&1 &5 -$as_echo "$lt_cv_prog_gnu_ld" >&6; } -with_gnu_ld=$lt_cv_prog_gnu_ld - - - - - - - - # Check if GNU C++ uses GNU ld as the underlying linker, since the - # archiving commands below assume that GNU ld is being used. - if test "$with_gnu_ld" = yes; then - archive_cmds_CXX='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' - archive_expsym_cmds_CXX='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' - - hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir' - export_dynamic_flag_spec_CXX='${wl}--export-dynamic' - - # If archive_cmds runs LD, not CC, wlarc should be empty - # XXX I think wlarc can be eliminated in ltcf-cxx, but I need to - # investigate it a little bit more. (MM) - wlarc='${wl}' - - # ancient GNU ld didn't support --whole-archive et. al. - if eval "`$CC -print-prog-name=ld` --help 2>&1" | - $GREP 'no-whole-archive' > /dev/null; then - whole_archive_flag_spec_CXX="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' - else - whole_archive_flag_spec_CXX= - fi - else - with_gnu_ld=no - wlarc= - - # A generic and very simple default shared library creation - # command for GNU C++ for the case where it uses the native - # linker, instead of GNU ld. If possible, this setting should - # overridden to take advantage of the native linker features on - # the platform it is being used on. - archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib' - fi - - # Commands to make compiler produce verbose output that lists - # what "hidden" libraries, object files and flags are used when - # linking a shared library. - output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' - - else - GXX=no - with_gnu_ld=no - wlarc= - fi - - # PORTME: fill in a description of your system's C++ link characteristics - { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $compiler linker ($LD) supports shared libraries" >&5 -$as_echo_n "checking whether the $compiler linker ($LD) supports shared libraries... " >&6; } - ld_shlibs_CXX=yes - case $host_os in - aix3*) - # FIXME: insert proper C++ library support - ld_shlibs_CXX=no - ;; - aix[4-9]*) - if test "$host_cpu" = ia64; then - # On IA64, the linker does run time linking by default, so we don't - # have to do anything special. - aix_use_runtimelinking=no - exp_sym_flag='-Bexport' - no_entry_flag="" - else - aix_use_runtimelinking=no - - # Test if we are trying to use run time linking or normal - # AIX style linking. If -brtl is somewhere in LDFLAGS, we - # need to do runtime linking. - case $host_os in aix4.[23]|aix4.[23].*|aix[5-9]*) - for ld_flag in $LDFLAGS; do - case $ld_flag in - *-brtl*) - aix_use_runtimelinking=yes - break - ;; - esac - done - ;; - esac - - exp_sym_flag='-bexport' - no_entry_flag='-bnoentry' - fi - - # When large executables or shared objects are built, AIX ld can - # have problems creating the table of contents. If linking a library - # or program results in "error TOC overflow" add -mminimal-toc to - # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not - # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. - - archive_cmds_CXX='' - hardcode_direct_CXX=yes - hardcode_direct_absolute_CXX=yes - hardcode_libdir_separator_CXX=':' - link_all_deplibs_CXX=yes - file_list_spec_CXX='${wl}-f,' - - if test "$GXX" = yes; then - case $host_os in aix4.[012]|aix4.[012].*) - # We only want to do this on AIX 4.2 and lower, the check - # below for broken collect2 doesn't work under 4.3+ - collect2name=`${CC} -print-prog-name=collect2` - if test -f "$collect2name" && - strings "$collect2name" | $GREP resolve_lib_name >/dev/null - then - # We have reworked collect2 - : - else - # We have old collect2 - hardcode_direct_CXX=unsupported - # It fails to find uninstalled libraries when the uninstalled - # path is not listed in the libpath. Setting hardcode_minus_L - # to unsupported forces relinking - hardcode_minus_L_CXX=yes - hardcode_libdir_flag_spec_CXX='-L$libdir' - hardcode_libdir_separator_CXX= - fi - esac - shared_flag='-shared' - if test "$aix_use_runtimelinking" = yes; then - shared_flag="$shared_flag "'${wl}-G' - fi - else - # not using gcc - if test "$host_cpu" = ia64; then - # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release - # chokes on -Wl,-G. The following line is correct: - shared_flag='-G' - else - if test "$aix_use_runtimelinking" = yes; then - shared_flag='${wl}-G' - else - shared_flag='${wl}-bM:SRE' - fi - fi - fi - - export_dynamic_flag_spec_CXX='${wl}-bexpall' - # It seems that -bexpall does not export symbols beginning with - # underscore (_), so it is better to generate a list of symbols to - # export. - always_export_symbols_CXX=yes - if test "$aix_use_runtimelinking" = yes; then - # Warning - without using the other runtime loading flags (-brtl), - # -berok will link without error, but may produce a broken library. - allow_undefined_flag_CXX='-berok' - # Determine the default libpath from the value encoded in an empty - # executable. - if test "${lt_cv_aix_libpath+set}" = set; then - aix_libpath=$lt_cv_aix_libpath -else - if ${lt_cv_aix_libpath__CXX+:} false; then : - $as_echo_n "(cached) " >&6 -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -int -main () -{ - - ; - return 0; -} -_ACEOF -if ac_fn_cxx_try_link "$LINENO"; then : - - lt_aix_libpath_sed=' - /Import File Strings/,/^$/ { - /^0/ { - s/^0 *\([^ ]*\) *$/\1/ - p - } - }' - lt_cv_aix_libpath__CXX=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` - # Check for a 64-bit object if we didn't find anything. - if test -z "$lt_cv_aix_libpath__CXX"; then - lt_cv_aix_libpath__CXX=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` - fi -fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext - if test -z "$lt_cv_aix_libpath__CXX"; then - lt_cv_aix_libpath__CXX="/usr/lib:/lib" - fi - -fi - - aix_libpath=$lt_cv_aix_libpath__CXX -fi - - hardcode_libdir_flag_spec_CXX='${wl}-blibpath:$libdir:'"$aix_libpath" - - archive_expsym_cmds_CXX='$CC -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then func_echo_all "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag" - else - if test "$host_cpu" = ia64; then - hardcode_libdir_flag_spec_CXX='${wl}-R $libdir:/usr/lib:/lib' - allow_undefined_flag_CXX="-z nodefs" - archive_expsym_cmds_CXX="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols" - else - # Determine the default libpath from the value encoded in an - # empty executable. - if test "${lt_cv_aix_libpath+set}" = set; then - aix_libpath=$lt_cv_aix_libpath -else - if ${lt_cv_aix_libpath__CXX+:} false; then : - $as_echo_n "(cached) " >&6 -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -int -main () -{ - - ; - return 0; -} -_ACEOF -if ac_fn_cxx_try_link "$LINENO"; then : - - lt_aix_libpath_sed=' - /Import File Strings/,/^$/ { - /^0/ { - s/^0 *\([^ ]*\) *$/\1/ - p - } - }' - lt_cv_aix_libpath__CXX=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` - # Check for a 64-bit object if we didn't find anything. - if test -z "$lt_cv_aix_libpath__CXX"; then - lt_cv_aix_libpath__CXX=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` - fi -fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext - if test -z "$lt_cv_aix_libpath__CXX"; then - lt_cv_aix_libpath__CXX="/usr/lib:/lib" - fi - -fi - - aix_libpath=$lt_cv_aix_libpath__CXX -fi - - hardcode_libdir_flag_spec_CXX='${wl}-blibpath:$libdir:'"$aix_libpath" - # Warning - without using the other run time loading flags, - # -berok will link without error, but may produce a broken library. - no_undefined_flag_CXX=' ${wl}-bernotok' - allow_undefined_flag_CXX=' ${wl}-berok' - if test "$with_gnu_ld" = yes; then - # We only use this code for GNU lds that support --whole-archive. - whole_archive_flag_spec_CXX='${wl}--whole-archive$convenience ${wl}--no-whole-archive' - else - # Exported symbols can be pulled into shared objects from archives - whole_archive_flag_spec_CXX='$convenience' - fi - archive_cmds_need_lc_CXX=yes - # This is similar to how AIX traditionally builds its shared - # libraries. - archive_expsym_cmds_CXX="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' - fi - fi - ;; - - beos*) - if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then - allow_undefined_flag_CXX=unsupported - # Joseph Beckenbach says some releases of gcc - # support --undefined. This deserves some investigation. FIXME - archive_cmds_CXX='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' - else - ld_shlibs_CXX=no - fi - ;; - - chorus*) - case $cc_basename in - *) - # FIXME: insert proper C++ library support - ld_shlibs_CXX=no - ;; - esac - ;; - - cygwin* | mingw* | pw32* | cegcc*) - case $GXX,$cc_basename in - ,cl* | no,cl*) - # Native MSVC - # hardcode_libdir_flag_spec is actually meaningless, as there is - # no search path for DLLs. - hardcode_libdir_flag_spec_CXX=' ' - allow_undefined_flag_CXX=unsupported - always_export_symbols_CXX=yes - file_list_spec_CXX='@' - # Tell ltmain to make .lib files, not .a files. - libext=lib - # Tell ltmain to make .dll files, not .so files. - shrext_cmds=".dll" - # FIXME: Setting linknames here is a bad hack. - archive_cmds_CXX='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-dll~linknames=' - archive_expsym_cmds_CXX='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then - $SED -n -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' -e '1\\\!p' < $export_symbols > $output_objdir/$soname.exp; - else - $SED -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' < $export_symbols > $output_objdir/$soname.exp; - fi~ - $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~ - linknames=' - # The linker will not automatically build a static lib if we build a DLL. - # _LT_TAGVAR(old_archive_from_new_cmds, CXX)='true' - enable_shared_with_static_runtimes_CXX=yes - # Don't use ranlib - old_postinstall_cmds_CXX='chmod 644 $oldlib' - postlink_cmds_CXX='lt_outputfile="@OUTPUT@"~ - lt_tool_outputfile="@TOOL_OUTPUT@"~ - case $lt_outputfile in - *.exe|*.EXE) ;; - *) - lt_outputfile="$lt_outputfile.exe" - lt_tool_outputfile="$lt_tool_outputfile.exe" - ;; - esac~ - func_to_tool_file "$lt_outputfile"~ - if test "$MANIFEST_TOOL" != ":" && test -f "$lt_outputfile.manifest"; then - $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1; - $RM "$lt_outputfile.manifest"; - fi' - ;; - *) - # g++ - # _LT_TAGVAR(hardcode_libdir_flag_spec, CXX) is actually meaningless, - # as there is no search path for DLLs. - hardcode_libdir_flag_spec_CXX='-L$libdir' - export_dynamic_flag_spec_CXX='${wl}--export-all-symbols' - allow_undefined_flag_CXX=unsupported - always_export_symbols_CXX=no - enable_shared_with_static_runtimes_CXX=yes - - if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then - archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' - # If the export-symbols file already is a .def file (1st line - # is EXPORTS), use it as is; otherwise, prepend... - archive_expsym_cmds_CXX='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then - cp $export_symbols $output_objdir/$soname.def; - else - echo EXPORTS > $output_objdir/$soname.def; - cat $export_symbols >> $output_objdir/$soname.def; - fi~ - $CC -shared -nostdlib $output_objdir/$soname.def $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' - else - ld_shlibs_CXX=no - fi - ;; - esac - ;; - darwin* | rhapsody*) - - - archive_cmds_need_lc_CXX=no - hardcode_direct_CXX=no - hardcode_automatic_CXX=yes - hardcode_shlibpath_var_CXX=unsupported - if test "$lt_cv_ld_force_load" = "yes"; then - whole_archive_flag_spec_CXX='`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience ${wl}-force_load,$conv\"; done; func_echo_all \"$new_convenience\"`' - - else - whole_archive_flag_spec_CXX='' - fi - link_all_deplibs_CXX=yes - allow_undefined_flag_CXX="$_lt_dar_allow_undefined" - case $cc_basename in - ifort*) _lt_dar_can_shared=yes ;; - *) _lt_dar_can_shared=$GCC ;; - esac - if test "$_lt_dar_can_shared" = "yes"; then - output_verbose_link_cmd=func_echo_all - archive_cmds_CXX="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod${_lt_dsymutil}" - module_cmds_CXX="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dsymutil}" - archive_expsym_cmds_CXX="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring ${_lt_dar_single_mod}${_lt_dar_export_syms}${_lt_dsymutil}" - module_expsym_cmds_CXX="sed -e 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dar_export_syms}${_lt_dsymutil}" - if test "$lt_cv_apple_cc_single_mod" != "yes"; then - archive_cmds_CXX="\$CC -r -keep_private_externs -nostdlib -o \${lib}-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \${lib}-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring${_lt_dsymutil}" - archive_expsym_cmds_CXX="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -r -keep_private_externs -nostdlib -o \${lib}-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \${lib}-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring${_lt_dar_export_syms}${_lt_dsymutil}" - fi - - else - ld_shlibs_CXX=no - fi - - ;; - - dgux*) - case $cc_basename in - ec++*) - # FIXME: insert proper C++ library support - ld_shlibs_CXX=no - ;; - ghcx*) - # Green Hills C++ Compiler - # FIXME: insert proper C++ library support - ld_shlibs_CXX=no - ;; - *) - # FIXME: insert proper C++ library support - ld_shlibs_CXX=no - ;; - esac - ;; - - freebsd2.*) - # C++ shared libraries reported to be fairly broken before - # switch to ELF - ld_shlibs_CXX=no - ;; - - freebsd-elf*) - archive_cmds_need_lc_CXX=no - ;; - - freebsd* | dragonfly*) - # FreeBSD 3 and later use GNU C++ and GNU ld with standard ELF - # conventions - ld_shlibs_CXX=yes - ;; - - gnu*) - ;; - - haiku*) - archive_cmds_CXX='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' - link_all_deplibs_CXX=yes - ;; - - hpux9*) - hardcode_libdir_flag_spec_CXX='${wl}+b ${wl}$libdir' - hardcode_libdir_separator_CXX=: - export_dynamic_flag_spec_CXX='${wl}-E' - hardcode_direct_CXX=yes - hardcode_minus_L_CXX=yes # Not in the search PATH, - # but as the default - # location of the library. - - case $cc_basename in - CC*) - # FIXME: insert proper C++ library support - ld_shlibs_CXX=no - ;; - aCC*) - archive_cmds_CXX='$RM $output_objdir/$soname~$CC -b ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' - # Commands to make compiler produce verbose output that lists - # what "hidden" libraries, object files and flags are used when - # linking a shared library. - # - # There doesn't appear to be a way to prevent this compiler from - # explicitly linking system object files so we need to strip them - # from the output so that they don't get included in the library - # dependencies. - output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $EGREP "\-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' - ;; - *) - if test "$GXX" = yes; then - archive_cmds_CXX='$RM $output_objdir/$soname~$CC -shared -nostdlib $pic_flag ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' - else - # FIXME: insert proper C++ library support - ld_shlibs_CXX=no - fi - ;; - esac - ;; - - hpux10*|hpux11*) - if test $with_gnu_ld = no; then - hardcode_libdir_flag_spec_CXX='${wl}+b ${wl}$libdir' - hardcode_libdir_separator_CXX=: - - case $host_cpu in - hppa*64*|ia64*) - ;; - *) - export_dynamic_flag_spec_CXX='${wl}-E' - ;; - esac - fi - case $host_cpu in - hppa*64*|ia64*) - hardcode_direct_CXX=no - hardcode_shlibpath_var_CXX=no - ;; - *) - hardcode_direct_CXX=yes - hardcode_direct_absolute_CXX=yes - hardcode_minus_L_CXX=yes # Not in the search PATH, - # but as the default - # location of the library. - ;; - esac - - case $cc_basename in - CC*) - # FIXME: insert proper C++ library support - ld_shlibs_CXX=no - ;; - aCC*) - case $host_cpu in - hppa*64*) - archive_cmds_CXX='$CC -b ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' - ;; - ia64*) - archive_cmds_CXX='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' - ;; - *) - archive_cmds_CXX='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' - ;; - esac - # Commands to make compiler produce verbose output that lists - # what "hidden" libraries, object files and flags are used when - # linking a shared library. - # - # There doesn't appear to be a way to prevent this compiler from - # explicitly linking system object files so we need to strip them - # from the output so that they don't get included in the library - # dependencies. - output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $GREP "\-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' - ;; - *) - if test "$GXX" = yes; then - if test $with_gnu_ld = no; then - case $host_cpu in - hppa*64*) - archive_cmds_CXX='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' - ;; - ia64*) - archive_cmds_CXX='$CC -shared -nostdlib $pic_flag ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' - ;; - *) - archive_cmds_CXX='$CC -shared -nostdlib $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' - ;; - esac - fi - else - # FIXME: insert proper C++ library support - ld_shlibs_CXX=no - fi - ;; - esac - ;; - - interix[3-9]*) - hardcode_direct_CXX=no - hardcode_shlibpath_var_CXX=no - hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir' - export_dynamic_flag_spec_CXX='${wl}-E' - # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. - # Instead, shared libraries are loaded at an image base (0x10000000 by - # default) and relocated if they conflict, which is a slow very memory - # consuming and fragmenting process. To avoid this, we pick a random, - # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link - # time. Moving up from 0x10000000 also allows more sbrk(2) space. - archive_cmds_CXX='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' - archive_expsym_cmds_CXX='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' - ;; - irix5* | irix6*) - case $cc_basename in - CC*) - # SGI C++ - archive_cmds_CXX='$CC -shared -all -multigot $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' - - # Archives containing C++ object files must be created using - # "CC -ar", where "CC" is the IRIX C++ compiler. This is - # necessary to make sure instantiated templates are included - # in the archive. - old_archive_cmds_CXX='$CC -ar -WR,-u -o $oldlib $oldobjs' - ;; - *) - if test "$GXX" = yes; then - if test "$with_gnu_ld" = no; then - archive_cmds_CXX='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' - else - archive_cmds_CXX='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` -o $lib' - fi - fi - link_all_deplibs_CXX=yes - ;; - esac - hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir' - hardcode_libdir_separator_CXX=: - inherit_rpath_CXX=yes - ;; - - linux* | k*bsd*-gnu | kopensolaris*-gnu) - case $cc_basename in - KCC*) - # Kuck and Associates, Inc. (KAI) C++ Compiler - - # KCC will only create a shared library if the output file - # ends with ".so" (or ".sl" for HP-UX), so rename the library - # to its proper name (with version) after linking. - archive_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' - archive_expsym_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib ${wl}-retain-symbols-file,$export_symbols; mv \$templib $lib' - # Commands to make compiler produce verbose output that lists - # what "hidden" libraries, object files and flags are used when - # linking a shared library. - # - # There doesn't appear to be a way to prevent this compiler from - # explicitly linking system object files so we need to strip them - # from the output so that they don't get included in the library - # dependencies. - output_verbose_link_cmd='templist=`$CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 | $GREP "ld"`; rm -f libconftest$shared_ext; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' - - hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir' - export_dynamic_flag_spec_CXX='${wl}--export-dynamic' - - # Archives containing C++ object files must be created using - # "CC -Bstatic", where "CC" is the KAI C++ compiler. - old_archive_cmds_CXX='$CC -Bstatic -o $oldlib $oldobjs' - ;; - icpc* | ecpc* ) - # Intel C++ - with_gnu_ld=yes - # version 8.0 and above of icpc choke on multiply defined symbols - # if we add $predep_objects and $postdep_objects, however 7.1 and - # earlier do not add the objects themselves. - case `$CC -V 2>&1` in - *"Version 7."*) - archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' - archive_expsym_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' - ;; - *) # Version 8.0 or newer - tmp_idyn= - case $host_cpu in - ia64*) tmp_idyn=' -i_dynamic';; - esac - archive_cmds_CXX='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' - archive_expsym_cmds_CXX='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' - ;; - esac - archive_cmds_need_lc_CXX=no - hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir' - export_dynamic_flag_spec_CXX='${wl}--export-dynamic' - whole_archive_flag_spec_CXX='${wl}--whole-archive$convenience ${wl}--no-whole-archive' - ;; - pgCC* | pgcpp*) - # Portland Group C++ compiler - case `$CC -V` in - *pgCC\ [1-5].* | *pgcpp\ [1-5].*) - prelink_cmds_CXX='tpldir=Template.dir~ - rm -rf $tpldir~ - $CC --prelink_objects --instantiation_dir $tpldir $objs $libobjs $compile_deplibs~ - compile_command="$compile_command `find $tpldir -name \*.o | sort | $NL2SP`"' - old_archive_cmds_CXX='tpldir=Template.dir~ - rm -rf $tpldir~ - $CC --prelink_objects --instantiation_dir $tpldir $oldobjs$old_deplibs~ - $AR $AR_FLAGS $oldlib$oldobjs$old_deplibs `find $tpldir -name \*.o | sort | $NL2SP`~ - $RANLIB $oldlib' - archive_cmds_CXX='tpldir=Template.dir~ - rm -rf $tpldir~ - $CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~ - $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname -o $lib' - archive_expsym_cmds_CXX='tpldir=Template.dir~ - rm -rf $tpldir~ - $CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~ - $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname ${wl}-retain-symbols-file ${wl}$export_symbols -o $lib' - ;; - *) # Version 6 and above use weak symbols - archive_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname -o $lib' - archive_expsym_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname ${wl}-retain-symbols-file ${wl}$export_symbols -o $lib' - ;; - esac - - hardcode_libdir_flag_spec_CXX='${wl}--rpath ${wl}$libdir' - export_dynamic_flag_spec_CXX='${wl}--export-dynamic' - whole_archive_flag_spec_CXX='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' - ;; - cxx*) - # Compaq C++ - archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' - archive_expsym_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib ${wl}-retain-symbols-file $wl$export_symbols' - - runpath_var=LD_RUN_PATH - hardcode_libdir_flag_spec_CXX='-rpath $libdir' - hardcode_libdir_separator_CXX=: - - # Commands to make compiler produce verbose output that lists - # what "hidden" libraries, object files and flags are used when - # linking a shared library. - # - # There doesn't appear to be a way to prevent this compiler from - # explicitly linking system object files so we need to strip them - # from the output so that they don't get included in the library - # dependencies. - output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld"`; templist=`func_echo_all "$templist" | $SED "s/\(^.*ld.*\)\( .*ld .*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "X$list" | $Xsed' - ;; - xl* | mpixl* | bgxl*) - # IBM XL 8.0 on PPC, with GNU ld - hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir' - export_dynamic_flag_spec_CXX='${wl}--export-dynamic' - archive_cmds_CXX='$CC -qmkshrobj $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' - if test "x$supports_anon_versioning" = xyes; then - archive_expsym_cmds_CXX='echo "{ global:" > $output_objdir/$libname.ver~ - cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ - echo "local: *; };" >> $output_objdir/$libname.ver~ - $CC -qmkshrobj $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib' - fi - ;; - *) - case `$CC -V 2>&1 | sed 5q` in - *Sun\ C*) - # Sun C++ 5.9 - no_undefined_flag_CXX=' -zdefs' - archive_cmds_CXX='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' - archive_expsym_cmds_CXX='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file ${wl}$export_symbols' - hardcode_libdir_flag_spec_CXX='-R$libdir' - whole_archive_flag_spec_CXX='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' - compiler_needs_object_CXX=yes - - # Not sure whether something based on - # $CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 - # would be better. - output_verbose_link_cmd='func_echo_all' - - # Archives containing C++ object files must be created using - # "CC -xar", where "CC" is the Sun C++ compiler. This is - # necessary to make sure instantiated templates are included - # in the archive. - old_archive_cmds_CXX='$CC -xar -o $oldlib $oldobjs' - ;; - esac - ;; - esac - ;; - - lynxos*) - # FIXME: insert proper C++ library support - ld_shlibs_CXX=no - ;; - - m88k*) - # FIXME: insert proper C++ library support - ld_shlibs_CXX=no - ;; - - mvs*) - case $cc_basename in - cxx*) - # FIXME: insert proper C++ library support - ld_shlibs_CXX=no - ;; - *) - # FIXME: insert proper C++ library support - ld_shlibs_CXX=no - ;; - esac - ;; - - netbsd*) - if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then - archive_cmds_CXX='$LD -Bshareable -o $lib $predep_objects $libobjs $deplibs $postdep_objects $linker_flags' - wlarc= - hardcode_libdir_flag_spec_CXX='-R$libdir' - hardcode_direct_CXX=yes - hardcode_shlibpath_var_CXX=no - fi - # Workaround some broken pre-1.5 toolchains - output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP conftest.$objext | $SED -e "s:-lgcc -lc -lgcc::"' - ;; - - *nto* | *qnx*) - ld_shlibs_CXX=yes - ;; - - openbsd2*) - # C++ shared libraries are fairly broken - ld_shlibs_CXX=no - ;; - - openbsd*) - if test -f /usr/libexec/ld.so; then - hardcode_direct_CXX=yes - hardcode_shlibpath_var_CXX=no - hardcode_direct_absolute_CXX=yes - archive_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib' - hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir' - if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then - archive_expsym_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file,$export_symbols -o $lib' - export_dynamic_flag_spec_CXX='${wl}-E' - whole_archive_flag_spec_CXX="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' - fi - output_verbose_link_cmd=func_echo_all - else - ld_shlibs_CXX=no - fi - ;; - - osf3* | osf4* | osf5*) - case $cc_basename in - KCC*) - # Kuck and Associates, Inc. (KAI) C++ Compiler - - # KCC will only create a shared library if the output file - # ends with ".so" (or ".sl" for HP-UX), so rename the library - # to its proper name (with version) after linking. - archive_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo "$lib" | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' - - hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir' - hardcode_libdir_separator_CXX=: - - # Archives containing C++ object files must be created using - # the KAI C++ compiler. - case $host in - osf3*) old_archive_cmds_CXX='$CC -Bstatic -o $oldlib $oldobjs' ;; - *) old_archive_cmds_CXX='$CC -o $oldlib $oldobjs' ;; - esac - ;; - RCC*) - # Rational C++ 2.4.1 - # FIXME: insert proper C++ library support - ld_shlibs_CXX=no - ;; - cxx*) - case $host in - osf3*) - allow_undefined_flag_CXX=' ${wl}-expect_unresolved ${wl}\*' - archive_cmds_CXX='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $soname `test -n "$verstring" && func_echo_all "${wl}-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' - hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir' - ;; - *) - allow_undefined_flag_CXX=' -expect_unresolved \*' - archive_cmds_CXX='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' - archive_expsym_cmds_CXX='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done~ - echo "-hidden">> $lib.exp~ - $CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname ${wl}-input ${wl}$lib.exp `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib~ - $RM $lib.exp' - hardcode_libdir_flag_spec_CXX='-rpath $libdir' - ;; - esac - - hardcode_libdir_separator_CXX=: - - # Commands to make compiler produce verbose output that lists - # what "hidden" libraries, object files and flags are used when - # linking a shared library. - # - # There doesn't appear to be a way to prevent this compiler from - # explicitly linking system object files so we need to strip them - # from the output so that they don't get included in the library - # dependencies. - output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld" | $GREP -v "ld:"`; templist=`func_echo_all "$templist" | $SED "s/\(^.*ld.*\)\( .*ld.*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' - ;; - *) - if test "$GXX" = yes && test "$with_gnu_ld" = no; then - allow_undefined_flag_CXX=' ${wl}-expect_unresolved ${wl}\*' - case $host in - osf3*) - archive_cmds_CXX='$CC -shared -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' - ;; - *) - archive_cmds_CXX='$CC -shared $pic_flag -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' - ;; - esac - - hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir' - hardcode_libdir_separator_CXX=: - - # Commands to make compiler produce verbose output that lists - # what "hidden" libraries, object files and flags are used when - # linking a shared library. - output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' - - else - # FIXME: insert proper C++ library support - ld_shlibs_CXX=no - fi - ;; - esac - ;; - - psos*) - # FIXME: insert proper C++ library support - ld_shlibs_CXX=no - ;; - - sunos4*) - case $cc_basename in - CC*) - # Sun C++ 4.x - # FIXME: insert proper C++ library support - ld_shlibs_CXX=no - ;; - lcc*) - # Lucid - # FIXME: insert proper C++ library support - ld_shlibs_CXX=no - ;; - *) - # FIXME: insert proper C++ library support - ld_shlibs_CXX=no - ;; - esac - ;; - - solaris*) - case $cc_basename in - CC* | sunCC*) - # Sun C++ 4.2, 5.x and Centerline C++ - archive_cmds_need_lc_CXX=yes - no_undefined_flag_CXX=' -zdefs' - archive_cmds_CXX='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' - archive_expsym_cmds_CXX='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ - $CC -G${allow_undefined_flag} ${wl}-M ${wl}$lib.exp -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' - - hardcode_libdir_flag_spec_CXX='-R$libdir' - hardcode_shlibpath_var_CXX=no - case $host_os in - solaris2.[0-5] | solaris2.[0-5].*) ;; - *) - # The compiler driver will combine and reorder linker options, - # but understands `-z linker_flag'. - # Supported since Solaris 2.6 (maybe 2.5.1?) - whole_archive_flag_spec_CXX='-z allextract$convenience -z defaultextract' - ;; - esac - link_all_deplibs_CXX=yes - - output_verbose_link_cmd='func_echo_all' - - # Archives containing C++ object files must be created using - # "CC -xar", where "CC" is the Sun C++ compiler. This is - # necessary to make sure instantiated templates are included - # in the archive. - old_archive_cmds_CXX='$CC -xar -o $oldlib $oldobjs' - ;; - gcx*) - # Green Hills C++ Compiler - archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' - - # The C++ compiler must be used to create the archive. - old_archive_cmds_CXX='$CC $LDFLAGS -archive -o $oldlib $oldobjs' - ;; - *) - # GNU C++ compiler with Solaris linker - if test "$GXX" = yes && test "$with_gnu_ld" = no; then - no_undefined_flag_CXX=' ${wl}-z ${wl}defs' - if $CC --version | $GREP -v '^2\.7' > /dev/null; then - archive_cmds_CXX='$CC -shared $pic_flag -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' - archive_expsym_cmds_CXX='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ - $CC -shared $pic_flag -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' - - # Commands to make compiler produce verbose output that lists - # what "hidden" libraries, object files and flags are used when - # linking a shared library. - output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' - else - # g++ 2.7 appears to require `-G' NOT `-shared' on this - # platform. - archive_cmds_CXX='$CC -G -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' - archive_expsym_cmds_CXX='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ - $CC -G -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' - - # Commands to make compiler produce verbose output that lists - # what "hidden" libraries, object files and flags are used when - # linking a shared library. - output_verbose_link_cmd='$CC -G $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' - fi - - hardcode_libdir_flag_spec_CXX='${wl}-R $wl$libdir' - case $host_os in - solaris2.[0-5] | solaris2.[0-5].*) ;; - *) - whole_archive_flag_spec_CXX='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract' - ;; - esac - fi - ;; - esac - ;; - - sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7* | sco3.2v5.0.[024]*) - no_undefined_flag_CXX='${wl}-z,text' - archive_cmds_need_lc_CXX=no - hardcode_shlibpath_var_CXX=no - runpath_var='LD_RUN_PATH' - - case $cc_basename in - CC*) - archive_cmds_CXX='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' - archive_expsym_cmds_CXX='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' - ;; - *) - archive_cmds_CXX='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' - archive_expsym_cmds_CXX='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' - ;; - esac - ;; - - sysv5* | sco3.2v5* | sco5v6*) - # Note: We can NOT use -z defs as we might desire, because we do not - # link with -lc, and that would cause any symbols used from libc to - # always be unresolved, which means just about no library would - # ever link correctly. If we're not using GNU ld we use -z text - # though, which does catch some bad symbols but isn't as heavy-handed - # as -z defs. - no_undefined_flag_CXX='${wl}-z,text' - allow_undefined_flag_CXX='${wl}-z,nodefs' - archive_cmds_need_lc_CXX=no - hardcode_shlibpath_var_CXX=no - hardcode_libdir_flag_spec_CXX='${wl}-R,$libdir' - hardcode_libdir_separator_CXX=':' - link_all_deplibs_CXX=yes - export_dynamic_flag_spec_CXX='${wl}-Bexport' - runpath_var='LD_RUN_PATH' - - case $cc_basename in - CC*) - archive_cmds_CXX='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' - archive_expsym_cmds_CXX='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' - old_archive_cmds_CXX='$CC -Tprelink_objects $oldobjs~ - '"$old_archive_cmds_CXX" - reload_cmds_CXX='$CC -Tprelink_objects $reload_objs~ - '"$reload_cmds_CXX" - ;; - *) - archive_cmds_CXX='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' - archive_expsym_cmds_CXX='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' - ;; - esac - ;; - - tandem*) - case $cc_basename in - NCC*) - # NonStop-UX NCC 3.20 - # FIXME: insert proper C++ library support - ld_shlibs_CXX=no - ;; - *) - # FIXME: insert proper C++ library support - ld_shlibs_CXX=no - ;; - esac - ;; - - vxworks*) - # FIXME: insert proper C++ library support - ld_shlibs_CXX=no - ;; - - *) - # FIXME: insert proper C++ library support - ld_shlibs_CXX=no - ;; - esac - - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ld_shlibs_CXX" >&5 -$as_echo "$ld_shlibs_CXX" >&6; } - test "$ld_shlibs_CXX" = no && can_build_shared=no - - GCC_CXX="$GXX" - LD_CXX="$LD" - - ## CAVEAT EMPTOR: - ## There is no encapsulation within the following macros, do not change - ## the running order or otherwise move them around unless you know exactly - ## what you are doing... - # Dependencies to place before and after the object being linked: -predep_objects_CXX= -postdep_objects_CXX= -predeps_CXX= -postdeps_CXX= -compiler_lib_search_path_CXX= - -cat > conftest.$ac_ext <<_LT_EOF -class Foo -{ -public: - Foo (void) { a = 0; } -private: - int a; -}; -_LT_EOF - - -_lt_libdeps_save_CFLAGS=$CFLAGS -case "$CC $CFLAGS " in #( -*\ -flto*\ *) CFLAGS="$CFLAGS -fno-lto" ;; -*\ -fwhopr*\ *) CFLAGS="$CFLAGS -fno-whopr" ;; -*\ -fuse-linker-plugin*\ *) CFLAGS="$CFLAGS -fno-use-linker-plugin" ;; -esac - -if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 - (eval $ac_compile) 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; }; then - # Parse the compiler output and extract the necessary - # objects, libraries and library flags. - - # Sentinel used to keep track of whether or not we are before - # the conftest object file. - pre_test_object_deps_done=no - - for p in `eval "$output_verbose_link_cmd"`; do - case ${prev}${p} in - - -L* | -R* | -l*) - # Some compilers place space between "-{L,R}" and the path. - # Remove the space. - if test $p = "-L" || - test $p = "-R"; then - prev=$p - continue - fi - - # Expand the sysroot to ease extracting the directories later. - if test -z "$prev"; then - case $p in - -L*) func_stripname_cnf '-L' '' "$p"; prev=-L; p=$func_stripname_result ;; - -R*) func_stripname_cnf '-R' '' "$p"; prev=-R; p=$func_stripname_result ;; - -l*) func_stripname_cnf '-l' '' "$p"; prev=-l; p=$func_stripname_result ;; - esac - fi - case $p in - =*) func_stripname_cnf '=' '' "$p"; p=$lt_sysroot$func_stripname_result ;; - esac - if test "$pre_test_object_deps_done" = no; then - case ${prev} in - -L | -R) - # Internal compiler library paths should come after those - # provided the user. The postdeps already come after the - # user supplied libs so there is no need to process them. - if test -z "$compiler_lib_search_path_CXX"; then - compiler_lib_search_path_CXX="${prev}${p}" - else - compiler_lib_search_path_CXX="${compiler_lib_search_path_CXX} ${prev}${p}" - fi - ;; - # The "-l" case would never come before the object being - # linked, so don't bother handling this case. - esac - else - if test -z "$postdeps_CXX"; then - postdeps_CXX="${prev}${p}" - else - postdeps_CXX="${postdeps_CXX} ${prev}${p}" - fi - fi - prev= - ;; - - *.lto.$objext) ;; # Ignore GCC LTO objects - *.$objext) - # This assumes that the test object file only shows up - # once in the compiler output. - if test "$p" = "conftest.$objext"; then - pre_test_object_deps_done=yes - continue - fi - - if test "$pre_test_object_deps_done" = no; then - if test -z "$predep_objects_CXX"; then - predep_objects_CXX="$p" - else - predep_objects_CXX="$predep_objects_CXX $p" - fi - else - if test -z "$postdep_objects_CXX"; then - postdep_objects_CXX="$p" - else - postdep_objects_CXX="$postdep_objects_CXX $p" - fi - fi - ;; - - *) ;; # Ignore the rest. - - esac - done - - # Clean up. - rm -f a.out a.exe -else - echo "libtool.m4: error: problem compiling CXX test program" -fi - -$RM -f confest.$objext -CFLAGS=$_lt_libdeps_save_CFLAGS - -# PORTME: override above test on systems where it is broken -case $host_os in -interix[3-9]*) - # Interix 3.5 installs completely hosed .la files for C++, so rather than - # hack all around it, let's just trust "g++" to DTRT. - predep_objects_CXX= - postdep_objects_CXX= - postdeps_CXX= - ;; - -linux*) - case `$CC -V 2>&1 | sed 5q` in - *Sun\ C*) - # Sun C++ 5.9 - - # The more standards-conforming stlport4 library is - # incompatible with the Cstd library. Avoid specifying - # it if it's in CXXFLAGS. Ignore libCrun as - # -library=stlport4 depends on it. - case " $CXX $CXXFLAGS " in - *" -library=stlport4 "*) - solaris_use_stlport4=yes - ;; - esac - - if test "$solaris_use_stlport4" != yes; then - postdeps_CXX='-library=Cstd -library=Crun' - fi - ;; - esac - ;; - -solaris*) - case $cc_basename in - CC* | sunCC*) - # The more standards-conforming stlport4 library is - # incompatible with the Cstd library. Avoid specifying - # it if it's in CXXFLAGS. Ignore libCrun as - # -library=stlport4 depends on it. - case " $CXX $CXXFLAGS " in - *" -library=stlport4 "*) - solaris_use_stlport4=yes - ;; - esac - - # Adding this requires a known-good setup of shared libraries for - # Sun compiler versions before 5.6, else PIC objects from an old - # archive will be linked into the output, leading to subtle bugs. - if test "$solaris_use_stlport4" != yes; then - postdeps_CXX='-library=Cstd -library=Crun' - fi - ;; - esac - ;; -esac - - -case " $postdeps_CXX " in -*" -lc "*) archive_cmds_need_lc_CXX=no ;; -esac - compiler_lib_search_dirs_CXX= -if test -n "${compiler_lib_search_path_CXX}"; then - compiler_lib_search_dirs_CXX=`echo " ${compiler_lib_search_path_CXX}" | ${SED} -e 's! -L! !g' -e 's!^ !!'` -fi - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - lt_prog_compiler_wl_CXX= -lt_prog_compiler_pic_CXX= -lt_prog_compiler_static_CXX= - - - # C++ specific cases for pic, static, wl, etc. - if test "$GXX" = yes; then - lt_prog_compiler_wl_CXX='-Wl,' - lt_prog_compiler_static_CXX='-static' - - case $host_os in - aix*) - # All AIX code is PIC. - if test "$host_cpu" = ia64; then - # AIX 5 now supports IA64 processor - lt_prog_compiler_static_CXX='-Bstatic' - fi - ;; - - amigaos*) - case $host_cpu in - powerpc) - # see comment about AmigaOS4 .so support - lt_prog_compiler_pic_CXX='-fPIC' - ;; - m68k) - # FIXME: we need at least 68020 code to build shared libraries, but - # adding the `-m68020' flag to GCC prevents building anything better, - # like `-m68040'. - lt_prog_compiler_pic_CXX='-m68020 -resident32 -malways-restore-a4' - ;; - esac - ;; - - beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) - # PIC is the default for these OSes. - ;; - mingw* | cygwin* | os2* | pw32* | cegcc*) - # This hack is so that the source file can tell whether it is being - # built for inclusion in a dll (and should export symbols for example). - # Although the cygwin gcc ignores -fPIC, still need this for old-style - # (--disable-auto-import) libraries - lt_prog_compiler_pic_CXX='-DDLL_EXPORT' - ;; - darwin* | rhapsody*) - # PIC is the default on this platform - # Common symbols not allowed in MH_DYLIB files - lt_prog_compiler_pic_CXX='-fno-common' - ;; - *djgpp*) - # DJGPP does not support shared libraries at all - lt_prog_compiler_pic_CXX= - ;; - haiku*) - # PIC is the default for Haiku. - # The "-static" flag exists, but is broken. - lt_prog_compiler_static_CXX= - ;; - interix[3-9]*) - # Interix 3.x gcc -fpic/-fPIC options generate broken code. - # Instead, we relocate shared libraries at runtime. - ;; - sysv4*MP*) - if test -d /usr/nec; then - lt_prog_compiler_pic_CXX=-Kconform_pic - fi - ;; - hpux*) - # PIC is the default for 64-bit PA HP-UX, but not for 32-bit - # PA HP-UX. On IA64 HP-UX, PIC is the default but the pic flag - # sets the default TLS model and affects inlining. - case $host_cpu in - hppa*64*) - ;; - *) - lt_prog_compiler_pic_CXX='-fPIC' - ;; - esac - ;; - *qnx* | *nto*) - # QNX uses GNU C++, but need to define -shared option too, otherwise - # it will coredump. - lt_prog_compiler_pic_CXX='-fPIC -shared' - ;; - *) - lt_prog_compiler_pic_CXX='-fPIC' - ;; - esac - else - case $host_os in - aix[4-9]*) - # All AIX code is PIC. - if test "$host_cpu" = ia64; then - # AIX 5 now supports IA64 processor - lt_prog_compiler_static_CXX='-Bstatic' - else - lt_prog_compiler_static_CXX='-bnso -bI:/lib/syscalls.exp' - fi - ;; - chorus*) - case $cc_basename in - cxch68*) - # Green Hills C++ Compiler - # _LT_TAGVAR(lt_prog_compiler_static, CXX)="--no_auto_instantiation -u __main -u __premain -u _abort -r $COOL_DIR/lib/libOrb.a $MVME_DIR/lib/CC/libC.a $MVME_DIR/lib/classix/libcx.s.a" - ;; - esac - ;; - mingw* | cygwin* | os2* | pw32* | cegcc*) - # This hack is so that the source file can tell whether it is being - # built for inclusion in a dll (and should export symbols for example). - lt_prog_compiler_pic_CXX='-DDLL_EXPORT' - ;; - dgux*) - case $cc_basename in - ec++*) - lt_prog_compiler_pic_CXX='-KPIC' - ;; - ghcx*) - # Green Hills C++ Compiler - lt_prog_compiler_pic_CXX='-pic' - ;; - *) - ;; - esac - ;; - freebsd* | dragonfly*) - # FreeBSD uses GNU C++ - ;; - hpux9* | hpux10* | hpux11*) - case $cc_basename in - CC*) - lt_prog_compiler_wl_CXX='-Wl,' - lt_prog_compiler_static_CXX='${wl}-a ${wl}archive' - if test "$host_cpu" != ia64; then - lt_prog_compiler_pic_CXX='+Z' - fi - ;; - aCC*) - lt_prog_compiler_wl_CXX='-Wl,' - lt_prog_compiler_static_CXX='${wl}-a ${wl}archive' - case $host_cpu in - hppa*64*|ia64*) - # +Z the default - ;; - *) - lt_prog_compiler_pic_CXX='+Z' - ;; - esac - ;; - *) - ;; - esac - ;; - interix*) - # This is c89, which is MS Visual C++ (no shared libs) - # Anyone wants to do a port? - ;; - irix5* | irix6* | nonstopux*) - case $cc_basename in - CC*) - lt_prog_compiler_wl_CXX='-Wl,' - lt_prog_compiler_static_CXX='-non_shared' - # CC pic flag -KPIC is the default. - ;; - *) - ;; - esac - ;; - linux* | k*bsd*-gnu | kopensolaris*-gnu) - case $cc_basename in - KCC*) - # KAI C++ Compiler - lt_prog_compiler_wl_CXX='--backend -Wl,' - lt_prog_compiler_pic_CXX='-fPIC' - ;; - ecpc* ) - # old Intel C++ for x86_64 which still supported -KPIC. - lt_prog_compiler_wl_CXX='-Wl,' - lt_prog_compiler_pic_CXX='-KPIC' - lt_prog_compiler_static_CXX='-static' - ;; - icpc* ) - # Intel C++, used to be incompatible with GCC. - # ICC 10 doesn't accept -KPIC any more. - lt_prog_compiler_wl_CXX='-Wl,' - lt_prog_compiler_pic_CXX='-fPIC' - lt_prog_compiler_static_CXX='-static' - ;; - pgCC* | pgcpp*) - # Portland Group C++ compiler - lt_prog_compiler_wl_CXX='-Wl,' - lt_prog_compiler_pic_CXX='-fpic' - lt_prog_compiler_static_CXX='-Bstatic' - ;; - cxx*) - # Compaq C++ - # Make sure the PIC flag is empty. It appears that all Alpha - # Linux and Compaq Tru64 Unix objects are PIC. - lt_prog_compiler_pic_CXX= - lt_prog_compiler_static_CXX='-non_shared' - ;; - xlc* | xlC* | bgxl[cC]* | mpixl[cC]*) - # IBM XL 8.0, 9.0 on PPC and BlueGene - lt_prog_compiler_wl_CXX='-Wl,' - lt_prog_compiler_pic_CXX='-qpic' - lt_prog_compiler_static_CXX='-qstaticlink' - ;; - *) - case `$CC -V 2>&1 | sed 5q` in - *Sun\ C*) - # Sun C++ 5.9 - lt_prog_compiler_pic_CXX='-KPIC' - lt_prog_compiler_static_CXX='-Bstatic' - lt_prog_compiler_wl_CXX='-Qoption ld ' - ;; - esac - ;; - esac - ;; - lynxos*) - ;; - m88k*) - ;; - mvs*) - case $cc_basename in - cxx*) - lt_prog_compiler_pic_CXX='-W c,exportall' - ;; - *) - ;; - esac - ;; - netbsd* | netbsdelf*-gnu) - ;; - *qnx* | *nto*) - # QNX uses GNU C++, but need to define -shared option too, otherwise - # it will coredump. - lt_prog_compiler_pic_CXX='-fPIC -shared' - ;; - osf3* | osf4* | osf5*) - case $cc_basename in - KCC*) - lt_prog_compiler_wl_CXX='--backend -Wl,' - ;; - RCC*) - # Rational C++ 2.4.1 - lt_prog_compiler_pic_CXX='-pic' - ;; - cxx*) - # Digital/Compaq C++ - lt_prog_compiler_wl_CXX='-Wl,' - # Make sure the PIC flag is empty. It appears that all Alpha - # Linux and Compaq Tru64 Unix objects are PIC. - lt_prog_compiler_pic_CXX= - lt_prog_compiler_static_CXX='-non_shared' - ;; - *) - ;; - esac - ;; - psos*) - ;; - solaris*) - case $cc_basename in - CC* | sunCC*) - # Sun C++ 4.2, 5.x and Centerline C++ - lt_prog_compiler_pic_CXX='-KPIC' - lt_prog_compiler_static_CXX='-Bstatic' - lt_prog_compiler_wl_CXX='-Qoption ld ' - ;; - gcx*) - # Green Hills C++ Compiler - lt_prog_compiler_pic_CXX='-PIC' - ;; - *) - ;; - esac - ;; - sunos4*) - case $cc_basename in - CC*) - # Sun C++ 4.x - lt_prog_compiler_pic_CXX='-pic' - lt_prog_compiler_static_CXX='-Bstatic' - ;; - lcc*) - # Lucid - lt_prog_compiler_pic_CXX='-pic' - ;; - *) - ;; - esac - ;; - sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) - case $cc_basename in - CC*) - lt_prog_compiler_wl_CXX='-Wl,' - lt_prog_compiler_pic_CXX='-KPIC' - lt_prog_compiler_static_CXX='-Bstatic' - ;; - esac - ;; - tandem*) - case $cc_basename in - NCC*) - # NonStop-UX NCC 3.20 - lt_prog_compiler_pic_CXX='-KPIC' - ;; - *) - ;; - esac - ;; - vxworks*) - ;; - *) - lt_prog_compiler_can_build_shared_CXX=no - ;; - esac - fi - -case $host_os in - # For platforms which do not support PIC, -DPIC is meaningless: - *djgpp*) - lt_prog_compiler_pic_CXX= - ;; - *) - lt_prog_compiler_pic_CXX="$lt_prog_compiler_pic_CXX@&t@ -DPIC" - ;; -esac - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $compiler option to produce PIC" >&5 -$as_echo_n "checking for $compiler option to produce PIC... " >&6; } -if ${lt_cv_prog_compiler_pic_CXX+:} false; then : - $as_echo_n "(cached) " >&6 -else - lt_cv_prog_compiler_pic_CXX=$lt_prog_compiler_pic_CXX -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic_CXX" >&5 -$as_echo "$lt_cv_prog_compiler_pic_CXX" >&6; } -lt_prog_compiler_pic_CXX=$lt_cv_prog_compiler_pic_CXX - -# -# Check to make sure the PIC flag actually works. -# -if test -n "$lt_prog_compiler_pic_CXX"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler PIC flag $lt_prog_compiler_pic_CXX works" >&5 -$as_echo_n "checking if $compiler PIC flag $lt_prog_compiler_pic_CXX works... " >&6; } -if ${lt_cv_prog_compiler_pic_works_CXX+:} false; then : - $as_echo_n "(cached) " >&6 -else - lt_cv_prog_compiler_pic_works_CXX=no - ac_outfile=conftest.$ac_objext - echo "$lt_simple_compile_test_code" > conftest.$ac_ext - lt_compiler_flag="$lt_prog_compiler_pic_CXX@&t@ -DPIC" - # Insert the option either (1) after the last *FLAGS variable, or - # (2) before a word containing "conftest.", or (3) at the end. - # Note that $ac_compile itself does not contain backslashes and begins - # with a dollar sign (not a hyphen), so the echo should work correctly. - # The option is referenced via a variable to avoid confusing sed. - lt_compile=`echo "$ac_compile" | $SED \ - -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ - -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ - -e 's:$: $lt_compiler_flag:'` - (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) - (eval "$lt_compile" 2>conftest.err) - ac_status=$? - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - if (exit $ac_status) && test -s "$ac_outfile"; then - # The compiler can only warn and ignore the option if not recognized - # So say no if there are warnings other than the usual output. - $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp - $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 - if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then - lt_cv_prog_compiler_pic_works_CXX=yes - fi - fi - $RM conftest* - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic_works_CXX" >&5 -$as_echo "$lt_cv_prog_compiler_pic_works_CXX" >&6; } - -if test x"$lt_cv_prog_compiler_pic_works_CXX" = xyes; then - case $lt_prog_compiler_pic_CXX in - "" | " "*) ;; - *) lt_prog_compiler_pic_CXX=" $lt_prog_compiler_pic_CXX" ;; - esac -else - lt_prog_compiler_pic_CXX= - lt_prog_compiler_can_build_shared_CXX=no -fi - -fi - - - - - -# -# Check to make sure the static flag actually works. -# -wl=$lt_prog_compiler_wl_CXX eval lt_tmp_static_flag=\"$lt_prog_compiler_static_CXX\" -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler static flag $lt_tmp_static_flag works" >&5 -$as_echo_n "checking if $compiler static flag $lt_tmp_static_flag works... " >&6; } -if ${lt_cv_prog_compiler_static_works_CXX+:} false; then : - $as_echo_n "(cached) " >&6 -else - lt_cv_prog_compiler_static_works_CXX=no - save_LDFLAGS="$LDFLAGS" - LDFLAGS="$LDFLAGS $lt_tmp_static_flag" - echo "$lt_simple_link_test_code" > conftest.$ac_ext - if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then - # The linker can only warn and ignore the option if not recognized - # So say no if there are warnings - if test -s conftest.err; then - # Append any errors to the config.log. - cat conftest.err 1>&5 - $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp - $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 - if diff conftest.exp conftest.er2 >/dev/null; then - lt_cv_prog_compiler_static_works_CXX=yes - fi - else - lt_cv_prog_compiler_static_works_CXX=yes - fi - fi - $RM -r conftest* - LDFLAGS="$save_LDFLAGS" - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_static_works_CXX" >&5 -$as_echo "$lt_cv_prog_compiler_static_works_CXX" >&6; } - -if test x"$lt_cv_prog_compiler_static_works_CXX" = xyes; then - : -else - lt_prog_compiler_static_CXX= -fi - - - - - { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5 -$as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; } -if ${lt_cv_prog_compiler_c_o_CXX+:} false; then : - $as_echo_n "(cached) " >&6 -else - lt_cv_prog_compiler_c_o_CXX=no - $RM -r conftest 2>/dev/null - mkdir conftest - cd conftest - mkdir out - echo "$lt_simple_compile_test_code" > conftest.$ac_ext - - lt_compiler_flag="-o out/conftest2.$ac_objext" - # Insert the option either (1) after the last *FLAGS variable, or - # (2) before a word containing "conftest.", or (3) at the end. - # Note that $ac_compile itself does not contain backslashes and begins - # with a dollar sign (not a hyphen), so the echo should work correctly. - lt_compile=`echo "$ac_compile" | $SED \ - -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ - -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ - -e 's:$: $lt_compiler_flag:'` - (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) - (eval "$lt_compile" 2>out/conftest.err) - ac_status=$? - cat out/conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - if (exit $ac_status) && test -s out/conftest2.$ac_objext - then - # The compiler can only warn and ignore the option if not recognized - # So say no if there are warnings - $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp - $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 - if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then - lt_cv_prog_compiler_c_o_CXX=yes - fi - fi - chmod u+w . 2>&5 - $RM conftest* - # SGI C++ compiler will create directory out/ii_files/ for - # template instantiation - test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files - $RM out/* && rmdir out - cd .. - $RM -r conftest - $RM conftest* - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o_CXX" >&5 -$as_echo "$lt_cv_prog_compiler_c_o_CXX" >&6; } - - - - { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5 -$as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; } -if ${lt_cv_prog_compiler_c_o_CXX+:} false; then : - $as_echo_n "(cached) " >&6 -else - lt_cv_prog_compiler_c_o_CXX=no - $RM -r conftest 2>/dev/null - mkdir conftest - cd conftest - mkdir out - echo "$lt_simple_compile_test_code" > conftest.$ac_ext - - lt_compiler_flag="-o out/conftest2.$ac_objext" - # Insert the option either (1) after the last *FLAGS variable, or - # (2) before a word containing "conftest.", or (3) at the end. - # Note that $ac_compile itself does not contain backslashes and begins - # with a dollar sign (not a hyphen), so the echo should work correctly. - lt_compile=`echo "$ac_compile" | $SED \ - -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ - -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ - -e 's:$: $lt_compiler_flag:'` - (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) - (eval "$lt_compile" 2>out/conftest.err) - ac_status=$? - cat out/conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - if (exit $ac_status) && test -s out/conftest2.$ac_objext - then - # The compiler can only warn and ignore the option if not recognized - # So say no if there are warnings - $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp - $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 - if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then - lt_cv_prog_compiler_c_o_CXX=yes - fi - fi - chmod u+w . 2>&5 - $RM conftest* - # SGI C++ compiler will create directory out/ii_files/ for - # template instantiation - test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files - $RM out/* && rmdir out - cd .. - $RM -r conftest - $RM conftest* - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o_CXX" >&5 -$as_echo "$lt_cv_prog_compiler_c_o_CXX" >&6; } - - - - -hard_links="nottested" -if test "$lt_cv_prog_compiler_c_o_CXX" = no && test "$need_locks" != no; then - # do not overwrite the value of need_locks provided by the user - { $as_echo "$as_me:${as_lineno-$LINENO}: checking if we can lock with hard links" >&5 -$as_echo_n "checking if we can lock with hard links... " >&6; } - hard_links=yes - $RM conftest* - ln conftest.a conftest.b 2>/dev/null && hard_links=no - touch conftest.a - ln conftest.a conftest.b 2>&5 || hard_links=no - ln conftest.a conftest.b 2>/dev/null && hard_links=no - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $hard_links" >&5 -$as_echo "$hard_links" >&6; } - if test "$hard_links" = no; then - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&5 -$as_echo "$as_me: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&2;} - need_locks=warn - fi -else - need_locks=no -fi - - - - { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $compiler linker ($LD) supports shared libraries" >&5 -$as_echo_n "checking whether the $compiler linker ($LD) supports shared libraries... " >&6; } - - export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' - exclude_expsyms_CXX='_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*' - case $host_os in - aix[4-9]*) - # If we're using GNU nm, then we don't want the "-C" option. - # -C means demangle to AIX nm, but means don't demangle with GNU nm - # Also, AIX nm treats weak defined symbols like other global defined - # symbols, whereas GNU nm marks them as "W". - if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then - export_symbols_cmds_CXX='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && (substr(\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' - else - export_symbols_cmds_CXX='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && (substr(\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' - fi - ;; - pw32*) - export_symbols_cmds_CXX="$ltdll_cmds" - ;; - cygwin* | mingw* | cegcc*) - case $cc_basename in - cl*) - exclude_expsyms_CXX='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*' - ;; - *) - export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1 DATA/;s/^.*[ ]__nm__\([^ ]*\)[ ][^ ]*/\1 DATA/;/^I[ ]/d;/^[AITW][ ]/s/.* //'\'' | sort | uniq > $export_symbols' - exclude_expsyms_CXX='[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname' - ;; - esac - ;; - linux* | k*bsd*-gnu | gnu*) - link_all_deplibs_CXX=no - ;; - *) - export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' - ;; - esac - -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ld_shlibs_CXX" >&5 -$as_echo "$ld_shlibs_CXX" >&6; } -test "$ld_shlibs_CXX" = no && can_build_shared=no - -with_gnu_ld_CXX=$with_gnu_ld - - - - - - -# -# Do we need to explicitly link libc? -# -case "x$archive_cmds_need_lc_CXX" in -x|xyes) - # Assume -lc should be added - archive_cmds_need_lc_CXX=yes - - if test "$enable_shared" = yes && test "$GCC" = yes; then - case $archive_cmds_CXX in - *'~'*) - # FIXME: we may have to deal with multi-command sequences. - ;; - '$CC '*) - # Test whether the compiler implicitly links with -lc since on some - # systems, -lgcc has to come before -lc. If gcc already passes -lc - # to ld, don't add -lc before -lgcc. - { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether -lc should be explicitly linked in" >&5 -$as_echo_n "checking whether -lc should be explicitly linked in... " >&6; } -if ${lt_cv_archive_cmds_need_lc_CXX+:} false; then : - $as_echo_n "(cached) " >&6 -else - $RM conftest* - echo "$lt_simple_compile_test_code" > conftest.$ac_ext - - if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 - (eval $ac_compile) 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } 2>conftest.err; then - soname=conftest - lib=conftest - libobjs=conftest.$ac_objext - deplibs= - wl=$lt_prog_compiler_wl_CXX - pic_flag=$lt_prog_compiler_pic_CXX - compiler_flags=-v - linker_flags=-v - verstring= - output_objdir=. - libname=conftest - lt_save_allow_undefined_flag=$allow_undefined_flag_CXX - allow_undefined_flag_CXX= - if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$archive_cmds_CXX 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1\""; } >&5 - (eval $archive_cmds_CXX 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1) 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } - then - lt_cv_archive_cmds_need_lc_CXX=no - else - lt_cv_archive_cmds_need_lc_CXX=yes - fi - allow_undefined_flag_CXX=$lt_save_allow_undefined_flag - else - cat conftest.err 1>&5 - fi - $RM conftest* - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_archive_cmds_need_lc_CXX" >&5 -$as_echo "$lt_cv_archive_cmds_need_lc_CXX" >&6; } - archive_cmds_need_lc_CXX=$lt_cv_archive_cmds_need_lc_CXX - ;; - esac - fi - ;; -esac - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - { $as_echo "$as_me:${as_lineno-$LINENO}: checking dynamic linker characteristics" >&5 -$as_echo_n "checking dynamic linker characteristics... " >&6; } - -library_names_spec= -libname_spec='lib$name' -soname_spec= -shrext_cmds=".so" -postinstall_cmds= -postuninstall_cmds= -finish_cmds= -finish_eval= -shlibpath_var= -shlibpath_overrides_runpath=unknown -version_type=none -dynamic_linker="$host_os ld.so" -sys_lib_dlsearch_path_spec="/lib /usr/lib" -need_lib_prefix=unknown -hardcode_into_libs=no - -# when you set need_version to no, make sure it does not cause -set_version -# flags to be left without arguments -need_version=unknown - -case $host_os in -aix3*) - version_type=linux # correct to gnu/linux during the next big refactor - library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a' - shlibpath_var=LIBPATH - - # AIX 3 has no versioning support, so we append a major version to the name. - soname_spec='${libname}${release}${shared_ext}$major' - ;; - -aix[4-9]*) - version_type=linux # correct to gnu/linux during the next big refactor - need_lib_prefix=no - need_version=no - hardcode_into_libs=yes - if test "$host_cpu" = ia64; then - # AIX 5 supports IA64 - library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}' - shlibpath_var=LD_LIBRARY_PATH - else - # With GCC up to 2.95.x, collect2 would create an import file - # for dependence libraries. The import file would start with - # the line `#! .'. This would cause the generated library to - # depend on `.', always an invalid library. This was fixed in - # development snapshots of GCC prior to 3.0. - case $host_os in - aix4 | aix4.[01] | aix4.[01].*) - if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)' - echo ' yes ' - echo '#endif'; } | ${CC} -E - | $GREP yes > /dev/null; then - : - else - can_build_shared=no - fi - ;; - esac - # AIX (on Power*) has no versioning support, so currently we can not hardcode correct - # soname into executable. Probably we can add versioning support to - # collect2, so additional links can be useful in future. - if test "$aix_use_runtimelinking" = yes; then - # If using run time linking (on AIX 4.2 or later) use lib.so - # instead of lib.a to let people know that these are not - # typical AIX shared libraries. - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - else - # We preserve .a as extension for shared libraries through AIX4.2 - # and later when we are not doing run time linking. - library_names_spec='${libname}${release}.a $libname.a' - soname_spec='${libname}${release}${shared_ext}$major' - fi - shlibpath_var=LIBPATH - fi - ;; - -amigaos*) - case $host_cpu in - powerpc) - # Since July 2007 AmigaOS4 officially supports .so libraries. - # When compiling the executable, add -use-dynld -Lsobjs: to the compileline. - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - ;; - m68k) - library_names_spec='$libname.ixlibrary $libname.a' - # Create ${libname}_ixlibrary.a entries in /sys/libs. - finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`func_echo_all "$lib" | $SED '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; test $RM /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done' - ;; - esac - ;; - -beos*) - library_names_spec='${libname}${shared_ext}' - dynamic_linker="$host_os ld.so" - shlibpath_var=LIBRARY_PATH - ;; - -bsdi[45]*) - version_type=linux # correct to gnu/linux during the next big refactor - need_version=no - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir' - shlibpath_var=LD_LIBRARY_PATH - sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib" - sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib" - # the default ld.so.conf also contains /usr/contrib/lib and - # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow - # libtool to hard-code these into programs - ;; - -cygwin* | mingw* | pw32* | cegcc*) - version_type=windows - shrext_cmds=".dll" - need_version=no - need_lib_prefix=no - - case $GCC,$cc_basename in - yes,*) - # gcc - library_names_spec='$libname.dll.a' - # DLL is installed to $(libdir)/../bin by postinstall_cmds - postinstall_cmds='base_file=`basename \${file}`~ - dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~ - dldir=$destdir/`dirname \$dlpath`~ - test -d \$dldir || mkdir -p \$dldir~ - $install_prog $dir/$dlname \$dldir/$dlname~ - chmod a+x \$dldir/$dlname~ - if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then - eval '\''$striplib \$dldir/$dlname'\'' || exit \$?; - fi' - postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ - dlpath=$dir/\$dldll~ - $RM \$dlpath' - shlibpath_overrides_runpath=yes - - case $host_os in - cygwin*) - # Cygwin DLLs use 'cyg' prefix rather than 'lib' - soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' - - ;; - mingw* | cegcc*) - # MinGW DLLs use traditional 'lib' prefix - soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' - ;; - pw32*) - # pw32 DLLs use 'pw' prefix rather than 'lib' - library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' - ;; - esac - dynamic_linker='Win32 ld.exe' - ;; - - *,cl*) - # Native MSVC - libname_spec='$name' - soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' - library_names_spec='${libname}.dll.lib' - - case $build_os in - mingw*) - sys_lib_search_path_spec= - lt_save_ifs=$IFS - IFS=';' - for lt_path in $LIB - do - IFS=$lt_save_ifs - # Let DOS variable expansion print the short 8.3 style file name. - lt_path=`cd "$lt_path" 2>/dev/null && cmd //C "for %i in (".") do @echo %~si"` - sys_lib_search_path_spec="$sys_lib_search_path_spec $lt_path" - done - IFS=$lt_save_ifs - # Convert to MSYS style. - sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | sed -e 's|\\\\|/|g' -e 's| \\([a-zA-Z]\\):| /\\1|g' -e 's|^ ||'` - ;; - cygwin*) - # Convert to unix form, then to dos form, then back to unix form - # but this time dos style (no spaces!) so that the unix form looks - # like /cygdrive/c/PROGRA~1:/cygdr... - sys_lib_search_path_spec=`cygpath --path --unix "$LIB"` - sys_lib_search_path_spec=`cygpath --path --dos "$sys_lib_search_path_spec" 2>/dev/null` - sys_lib_search_path_spec=`cygpath --path --unix "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` - ;; - *) - sys_lib_search_path_spec="$LIB" - if $ECHO "$sys_lib_search_path_spec" | $GREP ';[c-zC-Z]:/' >/dev/null; then - # It is most probably a Windows format PATH. - sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` - else - sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` - fi - # FIXME: find the short name or the path components, as spaces are - # common. (e.g. "Program Files" -> "PROGRA~1") - ;; - esac - - # DLL is installed to $(libdir)/../bin by postinstall_cmds - postinstall_cmds='base_file=`basename \${file}`~ - dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~ - dldir=$destdir/`dirname \$dlpath`~ - test -d \$dldir || mkdir -p \$dldir~ - $install_prog $dir/$dlname \$dldir/$dlname' - postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ - dlpath=$dir/\$dldll~ - $RM \$dlpath' - shlibpath_overrides_runpath=yes - dynamic_linker='Win32 link.exe' - ;; - - *) - # Assume MSVC wrapper - library_names_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext} $libname.lib' - dynamic_linker='Win32 ld.exe' - ;; - esac - # FIXME: first we should search . and the directory the executable is in - shlibpath_var=PATH - ;; - -darwin* | rhapsody*) - dynamic_linker="$host_os dyld" - version_type=darwin - need_lib_prefix=no - need_version=no - library_names_spec='${libname}${release}${major}$shared_ext ${libname}$shared_ext' - soname_spec='${libname}${release}${major}$shared_ext' - shlibpath_overrides_runpath=yes - shlibpath_var=DYLD_LIBRARY_PATH - shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`' - - sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib' - ;; - -dgux*) - version_type=linux # correct to gnu/linux during the next big refactor - need_lib_prefix=no - need_version=no - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext' - soname_spec='${libname}${release}${shared_ext}$major' - shlibpath_var=LD_LIBRARY_PATH - ;; - -freebsd* | dragonfly*) - # DragonFly does not have aout. When/if they implement a new - # versioning mechanism, adjust this. - if test -x /usr/bin/objformat; then - objformat=`/usr/bin/objformat` - else - case $host_os in - freebsd[23].*) objformat=aout ;; - *) objformat=elf ;; - esac - fi - version_type=freebsd-$objformat - case $version_type in - freebsd-elf*) - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' - need_version=no - need_lib_prefix=no - ;; - freebsd-*) - library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix' - need_version=yes - ;; - esac - shlibpath_var=LD_LIBRARY_PATH - case $host_os in - freebsd2.*) - shlibpath_overrides_runpath=yes - ;; - freebsd3.[01]* | freebsdelf3.[01]*) - shlibpath_overrides_runpath=yes - hardcode_into_libs=yes - ;; - freebsd3.[2-9]* | freebsdelf3.[2-9]* | \ - freebsd4.[0-5] | freebsdelf4.[0-5] | freebsd4.1.1 | freebsdelf4.1.1) - shlibpath_overrides_runpath=no - hardcode_into_libs=yes - ;; - *) # from 4.6 on, and DragonFly - shlibpath_overrides_runpath=yes - hardcode_into_libs=yes - ;; - esac - ;; - -gnu*) - version_type=linux # correct to gnu/linux during the next big refactor - need_lib_prefix=no - need_version=no - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=no - hardcode_into_libs=yes - ;; - -haiku*) - version_type=linux # correct to gnu/linux during the next big refactor - need_lib_prefix=no - need_version=no - dynamic_linker="$host_os runtime_loader" - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - shlibpath_var=LIBRARY_PATH - shlibpath_overrides_runpath=yes - sys_lib_dlsearch_path_spec='/boot/home/config/lib /boot/common/lib /boot/system/lib' - hardcode_into_libs=yes - ;; - -hpux9* | hpux10* | hpux11*) - # Give a soname corresponding to the major version so that dld.sl refuses to - # link against other versions. - version_type=sunos - need_lib_prefix=no - need_version=no - case $host_cpu in - ia64*) - shrext_cmds='.so' - hardcode_into_libs=yes - dynamic_linker="$host_os dld.so" - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - if test "X$HPUX_IA64_MODE" = X32; then - sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib" - else - sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64" - fi - sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec - ;; - hppa*64*) - shrext_cmds='.sl' - hardcode_into_libs=yes - dynamic_linker="$host_os dld.sl" - shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH - shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64" - sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec - ;; - *) - shrext_cmds='.sl' - dynamic_linker="$host_os dld.sl" - shlibpath_var=SHLIB_PATH - shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - ;; - esac - # HP-UX runs *really* slowly unless shared libraries are mode 555, ... - postinstall_cmds='chmod 555 $lib' - # or fails outright, so override atomically: - install_override_mode=555 - ;; - -interix[3-9]*) - version_type=linux # correct to gnu/linux during the next big refactor - need_lib_prefix=no - need_version=no - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)' - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=no - hardcode_into_libs=yes - ;; - -irix5* | irix6* | nonstopux*) - case $host_os in - nonstopux*) version_type=nonstopux ;; - *) - if test "$lt_cv_prog_gnu_ld" = yes; then - version_type=linux # correct to gnu/linux during the next big refactor - else - version_type=irix - fi ;; - esac - need_lib_prefix=no - need_version=no - soname_spec='${libname}${release}${shared_ext}$major' - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}' - case $host_os in - irix5* | nonstopux*) - libsuff= shlibsuff= - ;; - *) - case $LD in # libtool.m4 will add one of these switches to LD - *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") - libsuff= shlibsuff= libmagic=32-bit;; - *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") - libsuff=32 shlibsuff=N32 libmagic=N32;; - *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") - libsuff=64 shlibsuff=64 libmagic=64-bit;; - *) libsuff= shlibsuff= libmagic=never-match;; - esac - ;; - esac - shlibpath_var=LD_LIBRARY${shlibsuff}_PATH - shlibpath_overrides_runpath=no - sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}" - sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}" - hardcode_into_libs=yes - ;; - -# No shared lib support for Linux oldld, aout, or coff. -linux*oldld* | linux*aout* | linux*coff*) - dynamic_linker=no - ;; - -# This must be glibc/ELF. -linux* | k*bsd*-gnu | kopensolaris*-gnu) - version_type=linux # correct to gnu/linux during the next big refactor - need_lib_prefix=no - need_version=no - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=no - - # Some binutils ld are patched to set DT_RUNPATH - if ${lt_cv_shlibpath_overrides_runpath+:} false; then : - $as_echo_n "(cached) " >&6 -else - lt_cv_shlibpath_overrides_runpath=no - save_LDFLAGS=$LDFLAGS - save_libdir=$libdir - eval "libdir=/foo; wl=\"$lt_prog_compiler_wl_CXX\"; \ - LDFLAGS=\"\$LDFLAGS $hardcode_libdir_flag_spec_CXX\"" - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -int -main () -{ - - ; - return 0; -} -_ACEOF -if ac_fn_cxx_try_link "$LINENO"; then : - if ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir" >/dev/null; then : - lt_cv_shlibpath_overrides_runpath=yes -fi -fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext - LDFLAGS=$save_LDFLAGS - libdir=$save_libdir - -fi - - shlibpath_overrides_runpath=$lt_cv_shlibpath_overrides_runpath - - # This implies no fast_install, which is unacceptable. - # Some rework will be needed to allow for fast_install - # before this can be enabled. - hardcode_into_libs=yes - - # Append ld.so.conf contents to the search path - if test -f /etc/ld.so.conf; then - lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \$2)); skip = 1; } { if (!skip) print \$0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[ ]*hwcap[ ]/d;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;s/"//g;/^$/d' | tr '\n' ' '` - sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra" - fi - - # We used to test for /lib/ld.so.1 and disable shared libraries on - # powerpc, because MkLinux only supported shared libraries with the - # GNU dynamic linker. Since this was broken with cross compilers, - # most powerpc-linux boxes support dynamic linking these days and - # people can always --disable-shared, the test was removed, and we - # assume the GNU/Linux dynamic linker is in use. - dynamic_linker='GNU/Linux ld.so' - ;; - -netbsdelf*-gnu) - version_type=linux - need_lib_prefix=no - need_version=no - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=no - hardcode_into_libs=yes - dynamic_linker='NetBSD ld.elf_so' - ;; - -netbsd*) - version_type=sunos - need_lib_prefix=no - need_version=no - if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' - finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' - dynamic_linker='NetBSD (a.out) ld.so' - else - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - dynamic_linker='NetBSD ld.elf_so' - fi - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=yes - hardcode_into_libs=yes - ;; - -newsos6) - version_type=linux # correct to gnu/linux during the next big refactor - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=yes - ;; - -*nto* | *qnx*) - version_type=qnx - need_lib_prefix=no - need_version=no - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=no - hardcode_into_libs=yes - dynamic_linker='ldqnx.so' - ;; - -openbsd*) - version_type=sunos - sys_lib_dlsearch_path_spec="/usr/lib" - need_lib_prefix=no - # Some older versions of OpenBSD (3.3 at least) *do* need versioned libs. - case $host_os in - openbsd3.3 | openbsd3.3.*) need_version=yes ;; - *) need_version=no ;; - esac - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' - finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' - shlibpath_var=LD_LIBRARY_PATH - if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then - case $host_os in - openbsd2.[89] | openbsd2.[89].*) - shlibpath_overrides_runpath=no - ;; - *) - shlibpath_overrides_runpath=yes - ;; - esac - else - shlibpath_overrides_runpath=yes - fi - ;; - -os2*) - libname_spec='$name' - shrext_cmds=".dll" - need_lib_prefix=no - library_names_spec='$libname${shared_ext} $libname.a' - dynamic_linker='OS/2 ld.exe' - shlibpath_var=LIBPATH - ;; - -osf3* | osf4* | osf5*) - version_type=osf - need_lib_prefix=no - need_version=no - soname_spec='${libname}${release}${shared_ext}$major' - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - shlibpath_var=LD_LIBRARY_PATH - sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib" - sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec" - ;; - -rdos*) - dynamic_linker=no - ;; - -solaris*) - version_type=linux # correct to gnu/linux during the next big refactor - need_lib_prefix=no - need_version=no - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=yes - hardcode_into_libs=yes - # ldd complains unless libraries are executable - postinstall_cmds='chmod +x $lib' - ;; - -sunos4*) - version_type=sunos - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' - finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir' - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=yes - if test "$with_gnu_ld" = yes; then - need_lib_prefix=no - fi - need_version=yes - ;; - -sysv4 | sysv4.3*) - version_type=linux # correct to gnu/linux during the next big refactor - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - shlibpath_var=LD_LIBRARY_PATH - case $host_vendor in - sni) - shlibpath_overrides_runpath=no - need_lib_prefix=no - runpath_var=LD_RUN_PATH - ;; - siemens) - need_lib_prefix=no - ;; - motorola) - need_lib_prefix=no - need_version=no - shlibpath_overrides_runpath=no - sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib' - ;; - esac - ;; - -sysv4*MP*) - if test -d /usr/nec ;then - version_type=linux # correct to gnu/linux during the next big refactor - library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}' - soname_spec='$libname${shared_ext}.$major' - shlibpath_var=LD_LIBRARY_PATH - fi - ;; - -sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) - version_type=freebsd-elf - need_lib_prefix=no - need_version=no - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=yes - hardcode_into_libs=yes - if test "$with_gnu_ld" = yes; then - sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib' - else - sys_lib_search_path_spec='/usr/ccs/lib /usr/lib' - case $host_os in - sco3.2v5*) - sys_lib_search_path_spec="$sys_lib_search_path_spec /lib" - ;; - esac - fi - sys_lib_dlsearch_path_spec='/usr/lib' - ;; - -tpf*) - # TPF is a cross-target only. Preferred cross-host = GNU/Linux. - version_type=linux # correct to gnu/linux during the next big refactor - need_lib_prefix=no - need_version=no - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=no - hardcode_into_libs=yes - ;; - -uts4*) - version_type=linux # correct to gnu/linux during the next big refactor - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - shlibpath_var=LD_LIBRARY_PATH - ;; - -*) - dynamic_linker=no - ;; -esac -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $dynamic_linker" >&5 -$as_echo "$dynamic_linker" >&6; } -test "$dynamic_linker" = no && can_build_shared=no - -variables_saved_for_relink="PATH $shlibpath_var $runpath_var" -if test "$GCC" = yes; then - variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" -fi - -if test "${lt_cv_sys_lib_search_path_spec+set}" = set; then - sys_lib_search_path_spec="$lt_cv_sys_lib_search_path_spec" -fi -if test "${lt_cv_sys_lib_dlsearch_path_spec+set}" = set; then - sys_lib_dlsearch_path_spec="$lt_cv_sys_lib_dlsearch_path_spec" -fi - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to hardcode library paths into programs" >&5 -$as_echo_n "checking how to hardcode library paths into programs... " >&6; } -hardcode_action_CXX= -if test -n "$hardcode_libdir_flag_spec_CXX" || - test -n "$runpath_var_CXX" || - test "X$hardcode_automatic_CXX" = "Xyes" ; then - - # We can hardcode non-existent directories. - if test "$hardcode_direct_CXX" != no && - # If the only mechanism to avoid hardcoding is shlibpath_var, we - # have to relink, otherwise we might link with an installed library - # when we should be linking with a yet-to-be-installed one - ## test "$_LT_TAGVAR(hardcode_shlibpath_var, CXX)" != no && - test "$hardcode_minus_L_CXX" != no; then - # Linking always hardcodes the temporary library directory. - hardcode_action_CXX=relink - else - # We can link without hardcoding, and we can hardcode nonexisting dirs. - hardcode_action_CXX=immediate - fi -else - # We cannot hardcode anything, or else we can only hardcode existing - # directories. - hardcode_action_CXX=unsupported -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $hardcode_action_CXX" >&5 -$as_echo "$hardcode_action_CXX" >&6; } - -if test "$hardcode_action_CXX" = relink || - test "$inherit_rpath_CXX" = yes; then - # Fast installation is not supported - enable_fast_install=no -elif test "$shlibpath_overrides_runpath" = yes || - test "$enable_shared" = no; then - # Fast installation is not necessary - enable_fast_install=needless -fi - - - - - - - - fi # test -n "$compiler" - - CC=$lt_save_CC - CFLAGS=$lt_save_CFLAGS - LDCXX=$LD - LD=$lt_save_LD - GCC=$lt_save_GCC - with_gnu_ld=$lt_save_with_gnu_ld - lt_cv_path_LDCXX=$lt_cv_path_LD - lt_cv_path_LD=$lt_save_path_LD - lt_cv_prog_gnu_ldcxx=$lt_cv_prog_gnu_ld - lt_cv_prog_gnu_ld=$lt_save_with_gnu_ld -fi # test "$_lt_caught_CXX_error" != yes - -ac_ext=c -ac_cpp='$CPP $CPPFLAGS' -ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_c_compiler_gnu - - - - - - - - - - - - - - - - ac_config_commands="$ac_config_commands libtool" - - - - -# Only expand once: - - - -#enable -D_GNU_SOURCE since the return code value of getaddrinfo -#ifdefed with __USE_GNU -#features.h header undef's __USE_GNU and defines it only if _GNU_SOURCE is defined -#hence this define for gcc -@%:@ Check whether --enable-debug was given. -if test "${enable_debug+set}" = set; then : - enableval=$enable_debug; -else - enable_debug=no -fi - - -if test "x$enable_debug" = xyes; then - if test "x$init_cflags" = x; then - CFLAGS="" - fi - CFLAGS="$CFLAGS -g -O0 -D_GNU_SOURCE" -else - if test "x$init_cflags" = x; then - CFLAGS="-g -O2 -D_GNU_SOURCE" - fi -fi - -if test "x$enable_debug" = xyes; then - if test "x$init_cxxflags" = x; then - CXXFLAGS="" - fi - CXXFLAGS="$CXXFLAGS -g -O0" -else - if test "x$init_cxxflags" = x; then - CXXFLAGS="-g -O2" - fi -fi - - -@%:@ Check whether --with-syncapi was given. -if test "${with_syncapi+set}" = set; then : - withval=$with_syncapi; -else - with_syncapi=yes -fi - - -# Checks for libraries. -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for pthread_mutex_lock in -lpthread" >&5 -$as_echo_n "checking for pthread_mutex_lock in -lpthread... " >&6; } -if ${ac_cv_lib_pthread_pthread_mutex_lock+:} false; then : - $as_echo_n "(cached) " >&6 -else - ac_check_lib_save_LIBS=$LIBS -LIBS="-lpthread $LIBS" -cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -/* Override any GCC internal prototype to avoid an error. - Use char because int might match the return type of a GCC - builtin and then its argument prototype would still apply. */ -#ifdef __cplusplus -extern "C" -#endif -char pthread_mutex_lock (); -int -main () -{ -return pthread_mutex_lock (); - ; - return 0; -} -_ACEOF -if ac_fn_c_try_link "$LINENO"; then : - ac_cv_lib_pthread_pthread_mutex_lock=yes -else - ac_cv_lib_pthread_pthread_mutex_lock=no -fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext -LIBS=$ac_check_lib_save_LIBS -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_pthread_pthread_mutex_lock" >&5 -$as_echo "$ac_cv_lib_pthread_pthread_mutex_lock" >&6; } -if test "x$ac_cv_lib_pthread_pthread_mutex_lock" = xyes; then : - have_pthread=yes -else - have_pthread=no -fi - - -if test "x$with_syncapi" != xno && test "x$have_pthread" = xno; then - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cannot build SyncAPI -- pthread not found" >&5 -$as_echo "$as_me: WARNING: cannot build SyncAPI -- pthread not found" >&2;} - with_syncapi=no -fi -if test "x$with_syncapi" != xno; then - { $as_echo "$as_me:${as_lineno-$LINENO}: building with SyncAPI support" >&5 -$as_echo "$as_me: building with SyncAPI support" >&6;} -else - { $as_echo "$as_me:${as_lineno-$LINENO}: building without SyncAPI support" >&5 -$as_echo "$as_me: building without SyncAPI support" >&6;} -fi - - if test "x$with_syncapi" != xno; then - WANT_SYNCAPI_TRUE= - WANT_SYNCAPI_FALSE='#' -else - WANT_SYNCAPI_TRUE='#' - WANT_SYNCAPI_FALSE= -fi - - -# Checks for header files. -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header files" >&5 -$as_echo_n "checking for ANSI C header files... " >&6; } -if ${ac_cv_header_stdc+:} false; then : - $as_echo_n "(cached) " >&6 -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include -#include -#include -#include - -int -main () -{ - - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - ac_cv_header_stdc=yes -else - ac_cv_header_stdc=no -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext - -if test $ac_cv_header_stdc = yes; then - # SunOS 4.x string.h does not declare mem*, contrary to ANSI. - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include - -_ACEOF -if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | - $EGREP "memchr" >/dev/null 2>&1; then : - -else - ac_cv_header_stdc=no -fi -rm -f conftest* - -fi - -if test $ac_cv_header_stdc = yes; then - # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include - -_ACEOF -if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | - $EGREP "free" >/dev/null 2>&1; then : - -else - ac_cv_header_stdc=no -fi -rm -f conftest* - -fi - -if test $ac_cv_header_stdc = yes; then - # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi. - if test "$cross_compiling" = yes; then : - : -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include -#include -#if ((' ' & 0x0FF) == 0x020) -# define ISLOWER(c) ('a' <= (c) && (c) <= 'z') -# define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c)) -#else -# define ISLOWER(c) \ - (('a' <= (c) && (c) <= 'i') \ - || ('j' <= (c) && (c) <= 'r') \ - || ('s' <= (c) && (c) <= 'z')) -# define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c)) -#endif - -#define XOR(e, f) (((e) && !(f)) || (!(e) && (f))) -int -main () -{ - int i; - for (i = 0; i < 256; i++) - if (XOR (islower (i), ISLOWER (i)) - || toupper (i) != TOUPPER (i)) - return 2; - return 0; -} -_ACEOF -if ac_fn_c_try_run "$LINENO"; then : - -else - ac_cv_header_stdc=no -fi -rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ - conftest.$ac_objext conftest.beam conftest.$ac_ext -fi - -fi -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdc" >&5 -$as_echo "$ac_cv_header_stdc" >&6; } -if test $ac_cv_header_stdc = yes; then - -$as_echo "@%:@define STDC_HEADERS 1" >>confdefs.h - -fi - -for ac_header in arpa/inet.h fcntl.h netdb.h netinet/in.h stdlib.h string.h sys/socket.h sys/time.h unistd.h sys/utsname.h -do : - as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` -ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default" -if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : - cat >>confdefs.h <<_ACEOF -@%:@define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 -_ACEOF - -fi - -done - - -# Checks for typedefs, structures, and compiler characteristics. -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for an ANSI C-conforming const" >&5 -$as_echo_n "checking for an ANSI C-conforming const... " >&6; } -if ${ac_cv_c_const+:} false; then : - $as_echo_n "(cached) " >&6 -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -int -main () -{ - -#ifndef __cplusplus - /* Ultrix mips cc rejects this sort of thing. */ - typedef int charset[2]; - const charset cs = { 0, 0 }; - /* SunOS 4.1.1 cc rejects this. */ - char const *const *pcpcc; - char **ppc; - /* NEC SVR4.0.2 mips cc rejects this. */ - struct point {int x, y;}; - static struct point const zero = {0,0}; - /* AIX XL C 1.02.0.0 rejects this. - It does not let you subtract one const X* pointer from another in - an arm of an if-expression whose if-part is not a constant - expression */ - const char *g = "string"; - pcpcc = &g + (g ? g-g : 0); - /* HPUX 7.0 cc rejects these. */ - ++pcpcc; - ppc = (char**) pcpcc; - pcpcc = (char const *const *) ppc; - { /* SCO 3.2v4 cc rejects this sort of thing. */ - char tx; - char *t = &tx; - char const *s = 0 ? (char *) 0 : (char const *) 0; - - *t++ = 0; - if (s) return 0; - } - { /* Someone thinks the Sun supposedly-ANSI compiler will reject this. */ - int x[] = {25, 17}; - const int *foo = &x[0]; - ++foo; - } - { /* Sun SC1.0 ANSI compiler rejects this -- but not the above. */ - typedef const int *iptr; - iptr p = 0; - ++p; - } - { /* AIX XL C 1.02.0.0 rejects this sort of thing, saying - "k.c", line 2.27: 1506-025 (S) Operand must be a modifiable lvalue. */ - struct s { int j; const int *ap[3]; } bx; - struct s *b = &bx; b->j = 5; - } - { /* ULTRIX-32 V3.1 (Rev 9) vcc rejects this */ - const int foo = 10; - if (!foo) return 0; - } - return !cs[0] && !zero.x; -#endif - - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - ac_cv_c_const=yes -else - ac_cv_c_const=no -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_const" >&5 -$as_echo "$ac_cv_c_const" >&6; } -if test $ac_cv_c_const = no; then - -$as_echo "@%:@define const /**/" >>confdefs.h - -fi - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for inline" >&5 -$as_echo_n "checking for inline... " >&6; } -if ${ac_cv_c_inline+:} false; then : - $as_echo_n "(cached) " >&6 -else - ac_cv_c_inline=no -for ac_kw in inline __inline__ __inline; do - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#ifndef __cplusplus -typedef int foo_t; -static $ac_kw foo_t static_foo () {return 0; } -$ac_kw foo_t foo () {return 0; } -#endif - -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - ac_cv_c_inline=$ac_kw -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext - test "$ac_cv_c_inline" != no && break -done - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_inline" >&5 -$as_echo "$ac_cv_c_inline" >&6; } - -case $ac_cv_c_inline in - inline | yes) ;; - *) - case $ac_cv_c_inline in - no) ac_val=;; - *) ac_val=$ac_cv_c_inline;; - esac - cat >>confdefs.h <<_ACEOF -#ifndef __cplusplus -#define inline $ac_val -#endif -_ACEOF - ;; -esac - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether time.h and sys/time.h may both be included" >&5 -$as_echo_n "checking whether time.h and sys/time.h may both be included... " >&6; } -if ${ac_cv_header_time+:} false; then : - $as_echo_n "(cached) " >&6 -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include -#include -#include - -int -main () -{ -if ((struct tm *) 0) -return 0; - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - ac_cv_header_time=yes -else - ac_cv_header_time=no -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_time" >&5 -$as_echo "$ac_cv_header_time" >&6; } -if test $ac_cv_header_time = yes; then - -$as_echo "@%:@define TIME_WITH_SYS_TIME 1" >>confdefs.h - -fi - -ac_fn_c_check_type "$LINENO" "nfds_t" "ac_cv_type_nfds_t" "#include -" -if test "x$ac_cv_type_nfds_t" = xyes; then : - -$as_echo "@%:@define POLL_NFDS_TYPE nfds_t" >>confdefs.h - -else - -$as_echo "@%:@define POLL_NFDS_TYPE unsigned int" >>confdefs.h - -fi - - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to enable ipv6" >&5 -$as_echo_n "checking whether to enable ipv6... " >&6; } - -if test "$cross_compiling" = yes; then : - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } - ipv6=no -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - /* is AF_INET6 available? */ -#include -#include -main() -{ - if (socket(AF_INET6, SOCK_STREAM, 0) < 0) - exit(1); - else - exit(0); -} - -_ACEOF -if ac_fn_c_try_run "$LINENO"; then : - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; } - ipv6=yes -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } - ipv6=no -fi -rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ - conftest.$ac_objext conftest.beam conftest.$ac_ext -fi - - -if test x"$ipv6" = xyes; then - USEIPV6="-DZOO_IPV6_ENABLED" - -fi - -# Checks for library functions. -for ac_func in getcwd gethostbyname gethostname getlogin getpwuid_r gettimeofday getuid memmove memset poll socket strchr strdup strerror strtol -do : - as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` -ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var" -if eval test \"x\$"$as_ac_var"\" = x"yes"; then : - cat >>confdefs.h <<_ACEOF -@%:@define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 -_ACEOF - -fi -done - - -ac_config_files="$ac_config_files Makefile" - -cat >confcache <<\_ACEOF -# This file is a shell script that caches the results of configure -# tests run on this system so they can be shared between configure -# scripts and configure runs, see configure's option --config-cache. -# It is not useful on other systems. If it contains results you don't -# want to keep, you may remove or edit it. -# -# config.status only pays attention to the cache file if you give it -# the --recheck option to rerun configure. -# -# `ac_cv_env_foo' variables (set or unset) will be overridden when -# loading this file, other *unset* `ac_cv_foo' will be assigned the -# following values. - -_ACEOF - -# The following way of writing the cache mishandles newlines in values, -# but we know of no workaround that is simple, portable, and efficient. -# So, we kill variables containing newlines. -# Ultrix sh set writes to stderr and can't be redirected directly, -# and sets the high bit in the cache file unless we assign to the vars. -( - for ac_var in `(set) 2>&1 | sed -n 's/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'`; do - eval ac_val=\$$ac_var - case $ac_val in #( - *${as_nl}*) - case $ac_var in #( - *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 -$as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; - esac - case $ac_var in #( - _ | IFS | as_nl) ;; #( - BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( - *) { eval $ac_var=; unset $ac_var;} ;; - esac ;; - esac - done - - (set) 2>&1 | - case $as_nl`(ac_space=' '; set) 2>&1` in #( - *${as_nl}ac_space=\ *) - # `set' does not quote correctly, so add quotes: double-quote - # substitution turns \\\\ into \\, and sed turns \\ into \. - sed -n \ - "s/'/'\\\\''/g; - s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p" - ;; #( - *) - # `set' quotes correctly as required by POSIX, so do not add quotes. - sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" - ;; - esac | - sort -) | - sed ' - /^ac_cv_env_/b end - t clear - :clear - s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/ - t end - s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/ - :end' >>confcache -if diff "$cache_file" confcache >/dev/null 2>&1; then :; else - if test -w "$cache_file"; then - if test "x$cache_file" != "x/dev/null"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5 -$as_echo "$as_me: updating cache $cache_file" >&6;} - if test ! -f "$cache_file" || test -h "$cache_file"; then - cat confcache >"$cache_file" - else - case $cache_file in #( - */* | ?:*) - mv -f confcache "$cache_file"$$ && - mv -f "$cache_file"$$ "$cache_file" ;; #( - *) - mv -f confcache "$cache_file" ;; - esac - fi - fi - else - { $as_echo "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5 -$as_echo "$as_me: not updating unwritable cache $cache_file" >&6;} - fi -fi -rm -f confcache - -test "x$prefix" = xNONE && prefix=$ac_default_prefix -# Let make expand exec_prefix. -test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' - -DEFS=-DHAVE_CONFIG_H - -ac_libobjs= -ac_ltlibobjs= -U= -for ac_i in : $LIB@&t@OBJS; do test "x$ac_i" = x: && continue - # 1. Remove the extension, and $U if already installed. - ac_script='s/\$U\././;s/\.o$//;s/\.obj$//' - ac_i=`$as_echo "$ac_i" | sed "$ac_script"` - # 2. Prepend LIBOBJDIR. When used with automake>=1.10 LIBOBJDIR - # will be set to the directory where LIBOBJS objects are built. - as_fn_append ac_libobjs " \${LIBOBJDIR}$ac_i\$U.$ac_objext" - as_fn_append ac_ltlibobjs " \${LIBOBJDIR}$ac_i"'$U.lo' -done -LIB@&t@OBJS=$ac_libobjs - -LTLIBOBJS=$ac_ltlibobjs - - -if test -z "${DX_COND_doc_TRUE}" && test -z "${DX_COND_doc_FALSE}"; then - as_fn_error $? "conditional \"DX_COND_doc\" was never defined. -Usually this means the macro was only invoked conditionally." "$LINENO" 5 -fi -if test -z "${DX_COND_doc_TRUE}" && test -z "${DX_COND_doc_FALSE}"; then - as_fn_error $? "conditional \"DX_COND_doc\" was never defined. -Usually this means the macro was only invoked conditionally." "$LINENO" 5 -fi -if test -z "${DX_COND_dot_TRUE}" && test -z "${DX_COND_dot_FALSE}"; then - as_fn_error $? "conditional \"DX_COND_dot\" was never defined. -Usually this means the macro was only invoked conditionally." "$LINENO" 5 -fi -if test -z "${DX_COND_dot_TRUE}" && test -z "${DX_COND_dot_FALSE}"; then - as_fn_error $? "conditional \"DX_COND_dot\" was never defined. -Usually this means the macro was only invoked conditionally." "$LINENO" 5 -fi -if test -z "${DX_COND_man_TRUE}" && test -z "${DX_COND_man_FALSE}"; then - as_fn_error $? "conditional \"DX_COND_man\" was never defined. -Usually this means the macro was only invoked conditionally." "$LINENO" 5 -fi -if test -z "${DX_COND_man_TRUE}" && test -z "${DX_COND_man_FALSE}"; then - as_fn_error $? "conditional \"DX_COND_man\" was never defined. -Usually this means the macro was only invoked conditionally." "$LINENO" 5 -fi -if test -z "${DX_COND_rtf_TRUE}" && test -z "${DX_COND_rtf_FALSE}"; then - as_fn_error $? "conditional \"DX_COND_rtf\" was never defined. -Usually this means the macro was only invoked conditionally." "$LINENO" 5 -fi -if test -z "${DX_COND_rtf_TRUE}" && test -z "${DX_COND_rtf_FALSE}"; then - as_fn_error $? "conditional \"DX_COND_rtf\" was never defined. -Usually this means the macro was only invoked conditionally." "$LINENO" 5 -fi -if test -z "${DX_COND_xml_TRUE}" && test -z "${DX_COND_xml_FALSE}"; then - as_fn_error $? "conditional \"DX_COND_xml\" was never defined. -Usually this means the macro was only invoked conditionally." "$LINENO" 5 -fi -if test -z "${DX_COND_xml_TRUE}" && test -z "${DX_COND_xml_FALSE}"; then - as_fn_error $? "conditional \"DX_COND_xml\" was never defined. -Usually this means the macro was only invoked conditionally." "$LINENO" 5 -fi -if test -z "${DX_COND_chm_TRUE}" && test -z "${DX_COND_chm_FALSE}"; then - as_fn_error $? "conditional \"DX_COND_chm\" was never defined. -Usually this means the macro was only invoked conditionally." "$LINENO" 5 -fi -if test -z "${DX_COND_chm_TRUE}" && test -z "${DX_COND_chm_FALSE}"; then - as_fn_error $? "conditional \"DX_COND_chm\" was never defined. -Usually this means the macro was only invoked conditionally." "$LINENO" 5 -fi -if test -z "${DX_COND_chi_TRUE}" && test -z "${DX_COND_chi_FALSE}"; then - as_fn_error $? "conditional \"DX_COND_chi\" was never defined. -Usually this means the macro was only invoked conditionally." "$LINENO" 5 -fi -if test -z "${DX_COND_chi_TRUE}" && test -z "${DX_COND_chi_FALSE}"; then - as_fn_error $? "conditional \"DX_COND_chi\" was never defined. -Usually this means the macro was only invoked conditionally." "$LINENO" 5 -fi -if test -z "${DX_COND_html_TRUE}" && test -z "${DX_COND_html_FALSE}"; then - as_fn_error $? "conditional \"DX_COND_html\" was never defined. -Usually this means the macro was only invoked conditionally." "$LINENO" 5 -fi -if test -z "${DX_COND_html_TRUE}" && test -z "${DX_COND_html_FALSE}"; then - as_fn_error $? "conditional \"DX_COND_html\" was never defined. -Usually this means the macro was only invoked conditionally." "$LINENO" 5 -fi -if test -z "${DX_COND_ps_TRUE}" && test -z "${DX_COND_ps_FALSE}"; then - as_fn_error $? "conditional \"DX_COND_ps\" was never defined. -Usually this means the macro was only invoked conditionally." "$LINENO" 5 -fi -if test -z "${DX_COND_ps_TRUE}" && test -z "${DX_COND_ps_FALSE}"; then - as_fn_error $? "conditional \"DX_COND_ps\" was never defined. -Usually this means the macro was only invoked conditionally." "$LINENO" 5 -fi -if test -z "${DX_COND_pdf_TRUE}" && test -z "${DX_COND_pdf_FALSE}"; then - as_fn_error $? "conditional \"DX_COND_pdf\" was never defined. -Usually this means the macro was only invoked conditionally." "$LINENO" 5 -fi -if test -z "${DX_COND_pdf_TRUE}" && test -z "${DX_COND_pdf_FALSE}"; then - as_fn_error $? "conditional \"DX_COND_pdf\" was never defined. -Usually this means the macro was only invoked conditionally." "$LINENO" 5 -fi -if test -z "${DX_COND_latex_TRUE}" && test -z "${DX_COND_latex_FALSE}"; then - as_fn_error $? "conditional \"DX_COND_latex\" was never defined. -Usually this means the macro was only invoked conditionally." "$LINENO" 5 -fi -if test -z "${DX_COND_latex_TRUE}" && test -z "${DX_COND_latex_FALSE}"; then - as_fn_error $? "conditional \"DX_COND_latex\" was never defined. -Usually this means the macro was only invoked conditionally." "$LINENO" 5 -fi - if test -n "$EXEEXT"; then - am__EXEEXT_TRUE= - am__EXEEXT_FALSE='#' -else - am__EXEEXT_TRUE='#' - am__EXEEXT_FALSE= -fi - -if test -z "${AMDEP_TRUE}" && test -z "${AMDEP_FALSE}"; then - as_fn_error $? "conditional \"AMDEP\" was never defined. -Usually this means the macro was only invoked conditionally." "$LINENO" 5 -fi -if test -z "${am__fastdepCC_TRUE}" && test -z "${am__fastdepCC_FALSE}"; then - as_fn_error $? "conditional \"am__fastdepCC\" was never defined. -Usually this means the macro was only invoked conditionally." "$LINENO" 5 -fi -if test -z "${am__fastdepCXX_TRUE}" && test -z "${am__fastdepCXX_FALSE}"; then - as_fn_error $? "conditional \"am__fastdepCXX\" was never defined. -Usually this means the macro was only invoked conditionally." "$LINENO" 5 -fi -if test -z "${WANT_SYNCAPI_TRUE}" && test -z "${WANT_SYNCAPI_FALSE}"; then - as_fn_error $? "conditional \"WANT_SYNCAPI\" was never defined. -Usually this means the macro was only invoked conditionally." "$LINENO" 5 -fi - -: "${CONFIG_STATUS=./config.status}" -ac_write_fail=0 -ac_clean_files_save=$ac_clean_files -ac_clean_files="$ac_clean_files $CONFIG_STATUS" -{ $as_echo "$as_me:${as_lineno-$LINENO}: creating $CONFIG_STATUS" >&5 -$as_echo "$as_me: creating $CONFIG_STATUS" >&6;} -as_write_fail=0 -cat >$CONFIG_STATUS <<_ASEOF || as_write_fail=1 -#! $SHELL -# Generated by $as_me. -# Run this file to recreate the current configuration. -# Compiler output produced by configure, useful for debugging -# configure, is in config.log if it exists. - -debug=false -ac_cs_recheck=false -ac_cs_silent=false - -SHELL=\${CONFIG_SHELL-$SHELL} -export SHELL -_ASEOF -cat >>$CONFIG_STATUS <<\_ASEOF || as_write_fail=1 -## -------------------- ## -## M4sh Initialization. ## -## -------------------- ## - -# Be more Bourne compatible -DUALCASE=1; export DUALCASE # for MKS sh -if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : - emulate sh - NULLCMD=: - # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which - # is contrary to our usage. Disable this feature. - alias -g '${1+"$@"}'='"$@"' - setopt NO_GLOB_SUBST -else - case `(set -o) 2>/dev/null` in @%:@( - *posix*) : - set -o posix ;; @%:@( - *) : - ;; -esac -fi - - -as_nl=' -' -export as_nl -# Printing a long string crashes Solaris 7 /usr/bin/printf. -as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' -as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo -as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo -# Prefer a ksh shell builtin over an external printf program on Solaris, -# but without wasting forks for bash or zsh. -if test -z "$BASH_VERSION$ZSH_VERSION" \ - && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then - as_echo='print -r --' - as_echo_n='print -rn --' -elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then - as_echo='printf %s\n' - as_echo_n='printf %s' -else - if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then - as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' - as_echo_n='/usr/ucb/echo -n' - else - as_echo_body='eval expr "X$1" : "X\\(.*\\)"' - as_echo_n_body='eval - arg=$1; - case $arg in @%:@( - *"$as_nl"*) - expr "X$arg" : "X\\(.*\\)$as_nl"; - arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; - esac; - expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" - ' - export as_echo_n_body - as_echo_n='sh -c $as_echo_n_body as_echo' - fi - export as_echo_body - as_echo='sh -c $as_echo_body as_echo' -fi - -# The user is always right. -if test "${PATH_SEPARATOR+set}" != set; then - PATH_SEPARATOR=: - (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { - (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || - PATH_SEPARATOR=';' - } -fi - - -# IFS -# We need space, tab and new line, in precisely that order. Quoting is -# there to prevent editors from complaining about space-tab. -# (If _AS_PATH_WALK were called with IFS unset, it would disable word -# splitting by setting IFS to empty value.) -IFS=" "" $as_nl" - -# Find who we are. Look in the path if we contain no directory separator. -as_myself= -case $0 in @%:@(( - *[\\/]* ) as_myself=$0 ;; - *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break - done -IFS=$as_save_IFS - - ;; -esac -# We did not find ourselves, most probably we were run as `sh COMMAND' -# in which case we are not to be found in the path. -if test "x$as_myself" = x; then - as_myself=$0 -fi -if test ! -f "$as_myself"; then - $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 - exit 1 -fi - -# Unset variables that we do not need and which cause bugs (e.g. in -# pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" -# suppresses any "Segmentation fault" message there. '((' could -# trigger a bug in pdksh 5.2.14. -for as_var in BASH_ENV ENV MAIL MAILPATH -do eval test x\${$as_var+set} = xset \ - && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : -done -PS1='$ ' -PS2='> ' -PS4='+ ' - -# NLS nuisances. -LC_ALL=C -export LC_ALL -LANGUAGE=C -export LANGUAGE - -# CDPATH. -(unset CDPATH) >/dev/null 2>&1 && unset CDPATH - - -@%:@ as_fn_error STATUS ERROR [LINENO LOG_FD] -@%:@ ---------------------------------------- -@%:@ Output "`basename @S|@0`: error: ERROR" to stderr. If LINENO and LOG_FD are -@%:@ provided, also output the error to LOG_FD, referencing LINENO. Then exit the -@%:@ script with STATUS, using 1 if that was 0. -as_fn_error () -{ - as_status=$1; test $as_status -eq 0 && as_status=1 - if test "$4"; then - as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack - $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 - fi - $as_echo "$as_me: error: $2" >&2 - as_fn_exit $as_status -} @%:@ as_fn_error - - -@%:@ as_fn_set_status STATUS -@%:@ ----------------------- -@%:@ Set @S|@? to STATUS, without forking. -as_fn_set_status () -{ - return $1 -} @%:@ as_fn_set_status - -@%:@ as_fn_exit STATUS -@%:@ ----------------- -@%:@ Exit the shell with STATUS, even in a "trap 0" or "set -e" context. -as_fn_exit () -{ - set +e - as_fn_set_status $1 - exit $1 -} @%:@ as_fn_exit - -@%:@ as_fn_unset VAR -@%:@ --------------- -@%:@ Portably unset VAR. -as_fn_unset () -{ - { eval $1=; unset $1;} -} -as_unset=as_fn_unset -@%:@ as_fn_append VAR VALUE -@%:@ ---------------------- -@%:@ Append the text in VALUE to the end of the definition contained in VAR. Take -@%:@ advantage of any shell optimizations that allow amortized linear growth over -@%:@ repeated appends, instead of the typical quadratic growth present in naive -@%:@ implementations. -if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : - eval 'as_fn_append () - { - eval $1+=\$2 - }' -else - as_fn_append () - { - eval $1=\$$1\$2 - } -fi # as_fn_append - -@%:@ as_fn_arith ARG... -@%:@ ------------------ -@%:@ Perform arithmetic evaluation on the ARGs, and store the result in the -@%:@ global @S|@as_val. Take advantage of shells that can avoid forks. The arguments -@%:@ must be portable across @S|@(()) and expr. -if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : - eval 'as_fn_arith () - { - as_val=$(( $* )) - }' -else - as_fn_arith () - { - as_val=`expr "$@" || test $? -eq 1` - } -fi # as_fn_arith - - -if expr a : '\(a\)' >/dev/null 2>&1 && - test "X`expr 00001 : '.*\(...\)'`" = X001; then - as_expr=expr -else - as_expr=false -fi - -if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then - as_basename=basename -else - as_basename=false -fi - -if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then - as_dirname=dirname -else - as_dirname=false -fi - -as_me=`$as_basename -- "$0" || -$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ - X"$0" : 'X\(//\)$' \| \ - X"$0" : 'X\(/\)' \| . 2>/dev/null || -$as_echo X/"$0" | - sed '/^.*\/\([^/][^/]*\)\/*$/{ - s//\1/ - q - } - /^X\/\(\/\/\)$/{ - s//\1/ - q - } - /^X\/\(\/\).*/{ - s//\1/ - q - } - s/.*/./; q'` - -# Avoid depending upon Character Ranges. -as_cr_letters='abcdefghijklmnopqrstuvwxyz' -as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' -as_cr_Letters=$as_cr_letters$as_cr_LETTERS -as_cr_digits='0123456789' -as_cr_alnum=$as_cr_Letters$as_cr_digits - -ECHO_C= ECHO_N= ECHO_T= -case `echo -n x` in @%:@((((( --n*) - case `echo 'xy\c'` in - *c*) ECHO_T=' ';; # ECHO_T is single tab character. - xy) ECHO_C='\c';; - *) echo `echo ksh88 bug on AIX 6.1` > /dev/null - ECHO_T=' ';; - esac;; -*) - ECHO_N='-n';; -esac - -rm -f conf$$ conf$$.exe conf$$.file -if test -d conf$$.dir; then - rm -f conf$$.dir/conf$$.file -else - rm -f conf$$.dir - mkdir conf$$.dir 2>/dev/null -fi -if (echo >conf$$.file) 2>/dev/null; then - if ln -s conf$$.file conf$$ 2>/dev/null; then - as_ln_s='ln -s' - # ... but there are two gotchas: - # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. - # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. - # In both cases, we have to default to `cp -pR'. - ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || - as_ln_s='cp -pR' - elif ln conf$$.file conf$$ 2>/dev/null; then - as_ln_s=ln - else - as_ln_s='cp -pR' - fi -else - as_ln_s='cp -pR' -fi -rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file -rmdir conf$$.dir 2>/dev/null - - -@%:@ as_fn_mkdir_p -@%:@ ------------- -@%:@ Create "@S|@as_dir" as a directory, including parents if necessary. -as_fn_mkdir_p () -{ - - case $as_dir in #( - -*) as_dir=./$as_dir;; - esac - test -d "$as_dir" || eval $as_mkdir_p || { - as_dirs= - while :; do - case $as_dir in #( - *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( - *) as_qdir=$as_dir;; - esac - as_dirs="'$as_qdir' $as_dirs" - as_dir=`$as_dirname -- "$as_dir" || -$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ - X"$as_dir" : 'X\(//\)[^/]' \| \ - X"$as_dir" : 'X\(//\)$' \| \ - X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || -$as_echo X"$as_dir" | - sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ - s//\1/ - q - } - /^X\(\/\/\)[^/].*/{ - s//\1/ - q - } - /^X\(\/\/\)$/{ - s//\1/ - q - } - /^X\(\/\).*/{ - s//\1/ - q - } - s/.*/./; q'` - test -d "$as_dir" && break - done - test -z "$as_dirs" || eval "mkdir $as_dirs" - } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" - - -} @%:@ as_fn_mkdir_p -if mkdir -p . 2>/dev/null; then - as_mkdir_p='mkdir -p "$as_dir"' -else - test -d ./-p && rmdir ./-p - as_mkdir_p=false -fi - - -@%:@ as_fn_executable_p FILE -@%:@ ----------------------- -@%:@ Test if FILE is an executable regular file. -as_fn_executable_p () -{ - test -f "$1" && test -x "$1" -} @%:@ as_fn_executable_p -as_test_x='test -x' -as_executable_p=as_fn_executable_p - -# Sed expression to map a string onto a valid CPP name. -as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" - -# Sed expression to map a string onto a valid variable name. -as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" - - -exec 6>&1 -## ----------------------------------- ## -## Main body of $CONFIG_STATUS script. ## -## ----------------------------------- ## -_ASEOF -test $as_write_fail = 0 && chmod +x $CONFIG_STATUS || ac_write_fail=1 - -cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 -# Save the log message, to keep $0 and so on meaningful, and to -# report actual input values of CONFIG_FILES etc. instead of their -# values after options handling. -ac_log=" -This file was extended by zookeeper C client $as_me 3.4.6, which was -generated by GNU Autoconf 2.69. Invocation command line was - - CONFIG_FILES = $CONFIG_FILES - CONFIG_HEADERS = $CONFIG_HEADERS - CONFIG_LINKS = $CONFIG_LINKS - CONFIG_COMMANDS = $CONFIG_COMMANDS - $ $0 $@ - -on `(hostname || uname -n) 2>/dev/null | sed 1q` -" - -_ACEOF - -case $ac_config_files in *" -"*) set x $ac_config_files; shift; ac_config_files=$*;; -esac - -case $ac_config_headers in *" -"*) set x $ac_config_headers; shift; ac_config_headers=$*;; -esac - - -cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 -# Files that config.status was made for. -config_files="$ac_config_files" -config_headers="$ac_config_headers" -config_commands="$ac_config_commands" - -_ACEOF - -cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 -ac_cs_usage="\ -\`$as_me' instantiates files and other configuration actions -from templates according to the current configuration. Unless the files -and actions are specified as TAGs, all are instantiated by default. - -Usage: $0 [OPTION]... [TAG]... - - -h, --help print this help, then exit - -V, --version print version number and configuration settings, then exit - --config print configuration, then exit - -q, --quiet, --silent - do not print progress messages - -d, --debug don't remove temporary files - --recheck update $as_me by reconfiguring in the same conditions - --file=FILE[:TEMPLATE] - instantiate the configuration file FILE - --header=FILE[:TEMPLATE] - instantiate the configuration header FILE - -Configuration files: -$config_files - -Configuration headers: -$config_headers - -Configuration commands: -$config_commands - -Report bugs to ." - -_ACEOF -cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 -ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" -ac_cs_version="\\ -zookeeper C client config.status 3.4.6 -configured by $0, generated by GNU Autoconf 2.69, - with options \\"\$ac_cs_config\\" - -Copyright (C) 2012 Free Software Foundation, Inc. -This config.status script is free software; the Free Software Foundation -gives unlimited permission to copy, distribute and modify it." - -ac_pwd='$ac_pwd' -srcdir='$srcdir' -INSTALL='$INSTALL' -MKDIR_P='$MKDIR_P' -AWK='$AWK' -test -n "\$AWK" || AWK=awk -_ACEOF - -cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 -# The default lists apply if the user does not specify any file. -ac_need_defaults=: -while test $# != 0 -do - case $1 in - --*=?*) - ac_option=`expr "X$1" : 'X\([^=]*\)='` - ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'` - ac_shift=: - ;; - --*=) - ac_option=`expr "X$1" : 'X\([^=]*\)='` - ac_optarg= - ac_shift=: - ;; - *) - ac_option=$1 - ac_optarg=$2 - ac_shift=shift - ;; - esac - - case $ac_option in - # Handling of the options. - -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) - ac_cs_recheck=: ;; - --version | --versio | --versi | --vers | --ver | --ve | --v | -V ) - $as_echo "$ac_cs_version"; exit ;; - --config | --confi | --conf | --con | --co | --c ) - $as_echo "$ac_cs_config"; exit ;; - --debug | --debu | --deb | --de | --d | -d ) - debug=: ;; - --file | --fil | --fi | --f ) - $ac_shift - case $ac_optarg in - *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; - '') as_fn_error $? "missing file argument" ;; - esac - as_fn_append CONFIG_FILES " '$ac_optarg'" - ac_need_defaults=false;; - --header | --heade | --head | --hea ) - $ac_shift - case $ac_optarg in - *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; - esac - as_fn_append CONFIG_HEADERS " '$ac_optarg'" - ac_need_defaults=false;; - --he | --h) - # Conflict between --help and --header - as_fn_error $? "ambiguous option: \`$1' -Try \`$0 --help' for more information.";; - --help | --hel | -h ) - $as_echo "$ac_cs_usage"; exit ;; - -q | -quiet | --quiet | --quie | --qui | --qu | --q \ - | -silent | --silent | --silen | --sile | --sil | --si | --s) - ac_cs_silent=: ;; - - # This is an error. - -*) as_fn_error $? "unrecognized option: \`$1' -Try \`$0 --help' for more information." ;; - - *) as_fn_append ac_config_targets " $1" - ac_need_defaults=false ;; - - esac - shift -done - -ac_configure_extra_args= - -if $ac_cs_silent; then - exec 6>/dev/null - ac_configure_extra_args="$ac_configure_extra_args --silent" -fi - -_ACEOF -cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 -if \$ac_cs_recheck; then - set X $SHELL '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion - shift - \$as_echo "running CONFIG_SHELL=$SHELL \$*" >&6 - CONFIG_SHELL='$SHELL' - export CONFIG_SHELL - exec "\$@" -fi - -_ACEOF -cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 -exec 5>>config.log -{ - echo - sed 'h;s/./-/g;s/^.../@%:@@%:@ /;s/...$/ @%:@@%:@/;p;x;p;x' <<_ASBOX -@%:@@%:@ Running $as_me. @%:@@%:@ -_ASBOX - $as_echo "$ac_log" -} >&5 - -_ACEOF -cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 -# -# INIT-COMMANDS -# -AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir" - - -# The HP-UX ksh and POSIX shell print the target directory to stdout -# if CDPATH is set. -(unset CDPATH) >/dev/null 2>&1 && unset CDPATH - -sed_quote_subst='$sed_quote_subst' -double_quote_subst='$double_quote_subst' -delay_variable_subst='$delay_variable_subst' -macro_version='`$ECHO "$macro_version" | $SED "$delay_single_quote_subst"`' -macro_revision='`$ECHO "$macro_revision" | $SED "$delay_single_quote_subst"`' -enable_shared='`$ECHO "$enable_shared" | $SED "$delay_single_quote_subst"`' -enable_static='`$ECHO "$enable_static" | $SED "$delay_single_quote_subst"`' -pic_mode='`$ECHO "$pic_mode" | $SED "$delay_single_quote_subst"`' -enable_fast_install='`$ECHO "$enable_fast_install" | $SED "$delay_single_quote_subst"`' -SHELL='`$ECHO "$SHELL" | $SED "$delay_single_quote_subst"`' -ECHO='`$ECHO "$ECHO" | $SED "$delay_single_quote_subst"`' -PATH_SEPARATOR='`$ECHO "$PATH_SEPARATOR" | $SED "$delay_single_quote_subst"`' -host_alias='`$ECHO "$host_alias" | $SED "$delay_single_quote_subst"`' -host='`$ECHO "$host" | $SED "$delay_single_quote_subst"`' -host_os='`$ECHO "$host_os" | $SED "$delay_single_quote_subst"`' -build_alias='`$ECHO "$build_alias" | $SED "$delay_single_quote_subst"`' -build='`$ECHO "$build" | $SED "$delay_single_quote_subst"`' -build_os='`$ECHO "$build_os" | $SED "$delay_single_quote_subst"`' -SED='`$ECHO "$SED" | $SED "$delay_single_quote_subst"`' -Xsed='`$ECHO "$Xsed" | $SED "$delay_single_quote_subst"`' -GREP='`$ECHO "$GREP" | $SED "$delay_single_quote_subst"`' -EGREP='`$ECHO "$EGREP" | $SED "$delay_single_quote_subst"`' -FGREP='`$ECHO "$FGREP" | $SED "$delay_single_quote_subst"`' -LD='`$ECHO "$LD" | $SED "$delay_single_quote_subst"`' -NM='`$ECHO "$NM" | $SED "$delay_single_quote_subst"`' -LN_S='`$ECHO "$LN_S" | $SED "$delay_single_quote_subst"`' -max_cmd_len='`$ECHO "$max_cmd_len" | $SED "$delay_single_quote_subst"`' -ac_objext='`$ECHO "$ac_objext" | $SED "$delay_single_quote_subst"`' -exeext='`$ECHO "$exeext" | $SED "$delay_single_quote_subst"`' -lt_unset='`$ECHO "$lt_unset" | $SED "$delay_single_quote_subst"`' -lt_SP2NL='`$ECHO "$lt_SP2NL" | $SED "$delay_single_quote_subst"`' -lt_NL2SP='`$ECHO "$lt_NL2SP" | $SED "$delay_single_quote_subst"`' -lt_cv_to_host_file_cmd='`$ECHO "$lt_cv_to_host_file_cmd" | $SED "$delay_single_quote_subst"`' -lt_cv_to_tool_file_cmd='`$ECHO "$lt_cv_to_tool_file_cmd" | $SED "$delay_single_quote_subst"`' -reload_flag='`$ECHO "$reload_flag" | $SED "$delay_single_quote_subst"`' -reload_cmds='`$ECHO "$reload_cmds" | $SED "$delay_single_quote_subst"`' -OBJDUMP='`$ECHO "$OBJDUMP" | $SED "$delay_single_quote_subst"`' -deplibs_check_method='`$ECHO "$deplibs_check_method" | $SED "$delay_single_quote_subst"`' -file_magic_cmd='`$ECHO "$file_magic_cmd" | $SED "$delay_single_quote_subst"`' -file_magic_glob='`$ECHO "$file_magic_glob" | $SED "$delay_single_quote_subst"`' -want_nocaseglob='`$ECHO "$want_nocaseglob" | $SED "$delay_single_quote_subst"`' -DLLTOOL='`$ECHO "$DLLTOOL" | $SED "$delay_single_quote_subst"`' -sharedlib_from_linklib_cmd='`$ECHO "$sharedlib_from_linklib_cmd" | $SED "$delay_single_quote_subst"`' -AR='`$ECHO "$AR" | $SED "$delay_single_quote_subst"`' -AR_FLAGS='`$ECHO "$AR_FLAGS" | $SED "$delay_single_quote_subst"`' -archiver_list_spec='`$ECHO "$archiver_list_spec" | $SED "$delay_single_quote_subst"`' -STRIP='`$ECHO "$STRIP" | $SED "$delay_single_quote_subst"`' -RANLIB='`$ECHO "$RANLIB" | $SED "$delay_single_quote_subst"`' -old_postinstall_cmds='`$ECHO "$old_postinstall_cmds" | $SED "$delay_single_quote_subst"`' -old_postuninstall_cmds='`$ECHO "$old_postuninstall_cmds" | $SED "$delay_single_quote_subst"`' -old_archive_cmds='`$ECHO "$old_archive_cmds" | $SED "$delay_single_quote_subst"`' -lock_old_archive_extraction='`$ECHO "$lock_old_archive_extraction" | $SED "$delay_single_quote_subst"`' -CC='`$ECHO "$CC" | $SED "$delay_single_quote_subst"`' -CFLAGS='`$ECHO "$CFLAGS" | $SED "$delay_single_quote_subst"`' -compiler='`$ECHO "$compiler" | $SED "$delay_single_quote_subst"`' -GCC='`$ECHO "$GCC" | $SED "$delay_single_quote_subst"`' -lt_cv_sys_global_symbol_pipe='`$ECHO "$lt_cv_sys_global_symbol_pipe" | $SED "$delay_single_quote_subst"`' -lt_cv_sys_global_symbol_to_cdecl='`$ECHO "$lt_cv_sys_global_symbol_to_cdecl" | $SED "$delay_single_quote_subst"`' -lt_cv_sys_global_symbol_to_c_name_address='`$ECHO "$lt_cv_sys_global_symbol_to_c_name_address" | $SED "$delay_single_quote_subst"`' -lt_cv_sys_global_symbol_to_c_name_address_lib_prefix='`$ECHO "$lt_cv_sys_global_symbol_to_c_name_address_lib_prefix" | $SED "$delay_single_quote_subst"`' -nm_file_list_spec='`$ECHO "$nm_file_list_spec" | $SED "$delay_single_quote_subst"`' -lt_sysroot='`$ECHO "$lt_sysroot" | $SED "$delay_single_quote_subst"`' -objdir='`$ECHO "$objdir" | $SED "$delay_single_quote_subst"`' -MAGIC_CMD='`$ECHO "$MAGIC_CMD" | $SED "$delay_single_quote_subst"`' -lt_prog_compiler_no_builtin_flag='`$ECHO "$lt_prog_compiler_no_builtin_flag" | $SED "$delay_single_quote_subst"`' -lt_prog_compiler_pic='`$ECHO "$lt_prog_compiler_pic" | $SED "$delay_single_quote_subst"`' -lt_prog_compiler_wl='`$ECHO "$lt_prog_compiler_wl" | $SED "$delay_single_quote_subst"`' -lt_prog_compiler_static='`$ECHO "$lt_prog_compiler_static" | $SED "$delay_single_quote_subst"`' -lt_cv_prog_compiler_c_o='`$ECHO "$lt_cv_prog_compiler_c_o" | $SED "$delay_single_quote_subst"`' -need_locks='`$ECHO "$need_locks" | $SED "$delay_single_quote_subst"`' -MANIFEST_TOOL='`$ECHO "$MANIFEST_TOOL" | $SED "$delay_single_quote_subst"`' -DSYMUTIL='`$ECHO "$DSYMUTIL" | $SED "$delay_single_quote_subst"`' -NMEDIT='`$ECHO "$NMEDIT" | $SED "$delay_single_quote_subst"`' -LIPO='`$ECHO "$LIPO" | $SED "$delay_single_quote_subst"`' -OTOOL='`$ECHO "$OTOOL" | $SED "$delay_single_quote_subst"`' -OTOOL64='`$ECHO "$OTOOL64" | $SED "$delay_single_quote_subst"`' -libext='`$ECHO "$libext" | $SED "$delay_single_quote_subst"`' -shrext_cmds='`$ECHO "$shrext_cmds" | $SED "$delay_single_quote_subst"`' -extract_expsyms_cmds='`$ECHO "$extract_expsyms_cmds" | $SED "$delay_single_quote_subst"`' -archive_cmds_need_lc='`$ECHO "$archive_cmds_need_lc" | $SED "$delay_single_quote_subst"`' -enable_shared_with_static_runtimes='`$ECHO "$enable_shared_with_static_runtimes" | $SED "$delay_single_quote_subst"`' -export_dynamic_flag_spec='`$ECHO "$export_dynamic_flag_spec" | $SED "$delay_single_quote_subst"`' -whole_archive_flag_spec='`$ECHO "$whole_archive_flag_spec" | $SED "$delay_single_quote_subst"`' -compiler_needs_object='`$ECHO "$compiler_needs_object" | $SED "$delay_single_quote_subst"`' -old_archive_from_new_cmds='`$ECHO "$old_archive_from_new_cmds" | $SED "$delay_single_quote_subst"`' -old_archive_from_expsyms_cmds='`$ECHO "$old_archive_from_expsyms_cmds" | $SED "$delay_single_quote_subst"`' -archive_cmds='`$ECHO "$archive_cmds" | $SED "$delay_single_quote_subst"`' -archive_expsym_cmds='`$ECHO "$archive_expsym_cmds" | $SED "$delay_single_quote_subst"`' -module_cmds='`$ECHO "$module_cmds" | $SED "$delay_single_quote_subst"`' -module_expsym_cmds='`$ECHO "$module_expsym_cmds" | $SED "$delay_single_quote_subst"`' -with_gnu_ld='`$ECHO "$with_gnu_ld" | $SED "$delay_single_quote_subst"`' -allow_undefined_flag='`$ECHO "$allow_undefined_flag" | $SED "$delay_single_quote_subst"`' -no_undefined_flag='`$ECHO "$no_undefined_flag" | $SED "$delay_single_quote_subst"`' -hardcode_libdir_flag_spec='`$ECHO "$hardcode_libdir_flag_spec" | $SED "$delay_single_quote_subst"`' -hardcode_libdir_separator='`$ECHO "$hardcode_libdir_separator" | $SED "$delay_single_quote_subst"`' -hardcode_direct='`$ECHO "$hardcode_direct" | $SED "$delay_single_quote_subst"`' -hardcode_direct_absolute='`$ECHO "$hardcode_direct_absolute" | $SED "$delay_single_quote_subst"`' -hardcode_minus_L='`$ECHO "$hardcode_minus_L" | $SED "$delay_single_quote_subst"`' -hardcode_shlibpath_var='`$ECHO "$hardcode_shlibpath_var" | $SED "$delay_single_quote_subst"`' -hardcode_automatic='`$ECHO "$hardcode_automatic" | $SED "$delay_single_quote_subst"`' -inherit_rpath='`$ECHO "$inherit_rpath" | $SED "$delay_single_quote_subst"`' -link_all_deplibs='`$ECHO "$link_all_deplibs" | $SED "$delay_single_quote_subst"`' -always_export_symbols='`$ECHO "$always_export_symbols" | $SED "$delay_single_quote_subst"`' -export_symbols_cmds='`$ECHO "$export_symbols_cmds" | $SED "$delay_single_quote_subst"`' -exclude_expsyms='`$ECHO "$exclude_expsyms" | $SED "$delay_single_quote_subst"`' -include_expsyms='`$ECHO "$include_expsyms" | $SED "$delay_single_quote_subst"`' -prelink_cmds='`$ECHO "$prelink_cmds" | $SED "$delay_single_quote_subst"`' -postlink_cmds='`$ECHO "$postlink_cmds" | $SED "$delay_single_quote_subst"`' -file_list_spec='`$ECHO "$file_list_spec" | $SED "$delay_single_quote_subst"`' -variables_saved_for_relink='`$ECHO "$variables_saved_for_relink" | $SED "$delay_single_quote_subst"`' -need_lib_prefix='`$ECHO "$need_lib_prefix" | $SED "$delay_single_quote_subst"`' -need_version='`$ECHO "$need_version" | $SED "$delay_single_quote_subst"`' -version_type='`$ECHO "$version_type" | $SED "$delay_single_quote_subst"`' -runpath_var='`$ECHO "$runpath_var" | $SED "$delay_single_quote_subst"`' -shlibpath_var='`$ECHO "$shlibpath_var" | $SED "$delay_single_quote_subst"`' -shlibpath_overrides_runpath='`$ECHO "$shlibpath_overrides_runpath" | $SED "$delay_single_quote_subst"`' -libname_spec='`$ECHO "$libname_spec" | $SED "$delay_single_quote_subst"`' -library_names_spec='`$ECHO "$library_names_spec" | $SED "$delay_single_quote_subst"`' -soname_spec='`$ECHO "$soname_spec" | $SED "$delay_single_quote_subst"`' -install_override_mode='`$ECHO "$install_override_mode" | $SED "$delay_single_quote_subst"`' -postinstall_cmds='`$ECHO "$postinstall_cmds" | $SED "$delay_single_quote_subst"`' -postuninstall_cmds='`$ECHO "$postuninstall_cmds" | $SED "$delay_single_quote_subst"`' -finish_cmds='`$ECHO "$finish_cmds" | $SED "$delay_single_quote_subst"`' -finish_eval='`$ECHO "$finish_eval" | $SED "$delay_single_quote_subst"`' -hardcode_into_libs='`$ECHO "$hardcode_into_libs" | $SED "$delay_single_quote_subst"`' -sys_lib_search_path_spec='`$ECHO "$sys_lib_search_path_spec" | $SED "$delay_single_quote_subst"`' -sys_lib_dlsearch_path_spec='`$ECHO "$sys_lib_dlsearch_path_spec" | $SED "$delay_single_quote_subst"`' -hardcode_action='`$ECHO "$hardcode_action" | $SED "$delay_single_quote_subst"`' -enable_dlopen='`$ECHO "$enable_dlopen" | $SED "$delay_single_quote_subst"`' -enable_dlopen_self='`$ECHO "$enable_dlopen_self" | $SED "$delay_single_quote_subst"`' -enable_dlopen_self_static='`$ECHO "$enable_dlopen_self_static" | $SED "$delay_single_quote_subst"`' -old_striplib='`$ECHO "$old_striplib" | $SED "$delay_single_quote_subst"`' -striplib='`$ECHO "$striplib" | $SED "$delay_single_quote_subst"`' -compiler_lib_search_dirs='`$ECHO "$compiler_lib_search_dirs" | $SED "$delay_single_quote_subst"`' -predep_objects='`$ECHO "$predep_objects" | $SED "$delay_single_quote_subst"`' -postdep_objects='`$ECHO "$postdep_objects" | $SED "$delay_single_quote_subst"`' -predeps='`$ECHO "$predeps" | $SED "$delay_single_quote_subst"`' -postdeps='`$ECHO "$postdeps" | $SED "$delay_single_quote_subst"`' -compiler_lib_search_path='`$ECHO "$compiler_lib_search_path" | $SED "$delay_single_quote_subst"`' -LD_CXX='`$ECHO "$LD_CXX" | $SED "$delay_single_quote_subst"`' -reload_flag_CXX='`$ECHO "$reload_flag_CXX" | $SED "$delay_single_quote_subst"`' -reload_cmds_CXX='`$ECHO "$reload_cmds_CXX" | $SED "$delay_single_quote_subst"`' -old_archive_cmds_CXX='`$ECHO "$old_archive_cmds_CXX" | $SED "$delay_single_quote_subst"`' -compiler_CXX='`$ECHO "$compiler_CXX" | $SED "$delay_single_quote_subst"`' -GCC_CXX='`$ECHO "$GCC_CXX" | $SED "$delay_single_quote_subst"`' -lt_prog_compiler_no_builtin_flag_CXX='`$ECHO "$lt_prog_compiler_no_builtin_flag_CXX" | $SED "$delay_single_quote_subst"`' -lt_prog_compiler_pic_CXX='`$ECHO "$lt_prog_compiler_pic_CXX" | $SED "$delay_single_quote_subst"`' -lt_prog_compiler_wl_CXX='`$ECHO "$lt_prog_compiler_wl_CXX" | $SED "$delay_single_quote_subst"`' -lt_prog_compiler_static_CXX='`$ECHO "$lt_prog_compiler_static_CXX" | $SED "$delay_single_quote_subst"`' -lt_cv_prog_compiler_c_o_CXX='`$ECHO "$lt_cv_prog_compiler_c_o_CXX" | $SED "$delay_single_quote_subst"`' -archive_cmds_need_lc_CXX='`$ECHO "$archive_cmds_need_lc_CXX" | $SED "$delay_single_quote_subst"`' -enable_shared_with_static_runtimes_CXX='`$ECHO "$enable_shared_with_static_runtimes_CXX" | $SED "$delay_single_quote_subst"`' -export_dynamic_flag_spec_CXX='`$ECHO "$export_dynamic_flag_spec_CXX" | $SED "$delay_single_quote_subst"`' -whole_archive_flag_spec_CXX='`$ECHO "$whole_archive_flag_spec_CXX" | $SED "$delay_single_quote_subst"`' -compiler_needs_object_CXX='`$ECHO "$compiler_needs_object_CXX" | $SED "$delay_single_quote_subst"`' -old_archive_from_new_cmds_CXX='`$ECHO "$old_archive_from_new_cmds_CXX" | $SED "$delay_single_quote_subst"`' -old_archive_from_expsyms_cmds_CXX='`$ECHO "$old_archive_from_expsyms_cmds_CXX" | $SED "$delay_single_quote_subst"`' -archive_cmds_CXX='`$ECHO "$archive_cmds_CXX" | $SED "$delay_single_quote_subst"`' -archive_expsym_cmds_CXX='`$ECHO "$archive_expsym_cmds_CXX" | $SED "$delay_single_quote_subst"`' -module_cmds_CXX='`$ECHO "$module_cmds_CXX" | $SED "$delay_single_quote_subst"`' -module_expsym_cmds_CXX='`$ECHO "$module_expsym_cmds_CXX" | $SED "$delay_single_quote_subst"`' -with_gnu_ld_CXX='`$ECHO "$with_gnu_ld_CXX" | $SED "$delay_single_quote_subst"`' -allow_undefined_flag_CXX='`$ECHO "$allow_undefined_flag_CXX" | $SED "$delay_single_quote_subst"`' -no_undefined_flag_CXX='`$ECHO "$no_undefined_flag_CXX" | $SED "$delay_single_quote_subst"`' -hardcode_libdir_flag_spec_CXX='`$ECHO "$hardcode_libdir_flag_spec_CXX" | $SED "$delay_single_quote_subst"`' -hardcode_libdir_separator_CXX='`$ECHO "$hardcode_libdir_separator_CXX" | $SED "$delay_single_quote_subst"`' -hardcode_direct_CXX='`$ECHO "$hardcode_direct_CXX" | $SED "$delay_single_quote_subst"`' -hardcode_direct_absolute_CXX='`$ECHO "$hardcode_direct_absolute_CXX" | $SED "$delay_single_quote_subst"`' -hardcode_minus_L_CXX='`$ECHO "$hardcode_minus_L_CXX" | $SED "$delay_single_quote_subst"`' -hardcode_shlibpath_var_CXX='`$ECHO "$hardcode_shlibpath_var_CXX" | $SED "$delay_single_quote_subst"`' -hardcode_automatic_CXX='`$ECHO "$hardcode_automatic_CXX" | $SED "$delay_single_quote_subst"`' -inherit_rpath_CXX='`$ECHO "$inherit_rpath_CXX" | $SED "$delay_single_quote_subst"`' -link_all_deplibs_CXX='`$ECHO "$link_all_deplibs_CXX" | $SED "$delay_single_quote_subst"`' -always_export_symbols_CXX='`$ECHO "$always_export_symbols_CXX" | $SED "$delay_single_quote_subst"`' -export_symbols_cmds_CXX='`$ECHO "$export_symbols_cmds_CXX" | $SED "$delay_single_quote_subst"`' -exclude_expsyms_CXX='`$ECHO "$exclude_expsyms_CXX" | $SED "$delay_single_quote_subst"`' -include_expsyms_CXX='`$ECHO "$include_expsyms_CXX" | $SED "$delay_single_quote_subst"`' -prelink_cmds_CXX='`$ECHO "$prelink_cmds_CXX" | $SED "$delay_single_quote_subst"`' -postlink_cmds_CXX='`$ECHO "$postlink_cmds_CXX" | $SED "$delay_single_quote_subst"`' -file_list_spec_CXX='`$ECHO "$file_list_spec_CXX" | $SED "$delay_single_quote_subst"`' -hardcode_action_CXX='`$ECHO "$hardcode_action_CXX" | $SED "$delay_single_quote_subst"`' -compiler_lib_search_dirs_CXX='`$ECHO "$compiler_lib_search_dirs_CXX" | $SED "$delay_single_quote_subst"`' -predep_objects_CXX='`$ECHO "$predep_objects_CXX" | $SED "$delay_single_quote_subst"`' -postdep_objects_CXX='`$ECHO "$postdep_objects_CXX" | $SED "$delay_single_quote_subst"`' -predeps_CXX='`$ECHO "$predeps_CXX" | $SED "$delay_single_quote_subst"`' -postdeps_CXX='`$ECHO "$postdeps_CXX" | $SED "$delay_single_quote_subst"`' -compiler_lib_search_path_CXX='`$ECHO "$compiler_lib_search_path_CXX" | $SED "$delay_single_quote_subst"`' - -LTCC='$LTCC' -LTCFLAGS='$LTCFLAGS' -compiler='$compiler_DEFAULT' - -# A function that is used when there is no print builtin or printf. -func_fallback_echo () -{ - eval 'cat <<_LTECHO_EOF -\$1 -_LTECHO_EOF' -} - -# Quote evaled strings. -for var in SHELL \ -ECHO \ -PATH_SEPARATOR \ -SED \ -GREP \ -EGREP \ -FGREP \ -LD \ -NM \ -LN_S \ -lt_SP2NL \ -lt_NL2SP \ -reload_flag \ -OBJDUMP \ -deplibs_check_method \ -file_magic_cmd \ -file_magic_glob \ -want_nocaseglob \ -DLLTOOL \ -sharedlib_from_linklib_cmd \ -AR \ -AR_FLAGS \ -archiver_list_spec \ -STRIP \ -RANLIB \ -CC \ -CFLAGS \ -compiler \ -lt_cv_sys_global_symbol_pipe \ -lt_cv_sys_global_symbol_to_cdecl \ -lt_cv_sys_global_symbol_to_c_name_address \ -lt_cv_sys_global_symbol_to_c_name_address_lib_prefix \ -nm_file_list_spec \ -lt_prog_compiler_no_builtin_flag \ -lt_prog_compiler_pic \ -lt_prog_compiler_wl \ -lt_prog_compiler_static \ -lt_cv_prog_compiler_c_o \ -need_locks \ -MANIFEST_TOOL \ -DSYMUTIL \ -NMEDIT \ -LIPO \ -OTOOL \ -OTOOL64 \ -shrext_cmds \ -export_dynamic_flag_spec \ -whole_archive_flag_spec \ -compiler_needs_object \ -with_gnu_ld \ -allow_undefined_flag \ -no_undefined_flag \ -hardcode_libdir_flag_spec \ -hardcode_libdir_separator \ -exclude_expsyms \ -include_expsyms \ -file_list_spec \ -variables_saved_for_relink \ -libname_spec \ -library_names_spec \ -soname_spec \ -install_override_mode \ -finish_eval \ -old_striplib \ -striplib \ -compiler_lib_search_dirs \ -predep_objects \ -postdep_objects \ -predeps \ -postdeps \ -compiler_lib_search_path \ -LD_CXX \ -reload_flag_CXX \ -compiler_CXX \ -lt_prog_compiler_no_builtin_flag_CXX \ -lt_prog_compiler_pic_CXX \ -lt_prog_compiler_wl_CXX \ -lt_prog_compiler_static_CXX \ -lt_cv_prog_compiler_c_o_CXX \ -export_dynamic_flag_spec_CXX \ -whole_archive_flag_spec_CXX \ -compiler_needs_object_CXX \ -with_gnu_ld_CXX \ -allow_undefined_flag_CXX \ -no_undefined_flag_CXX \ -hardcode_libdir_flag_spec_CXX \ -hardcode_libdir_separator_CXX \ -exclude_expsyms_CXX \ -include_expsyms_CXX \ -file_list_spec_CXX \ -compiler_lib_search_dirs_CXX \ -predep_objects_CXX \ -postdep_objects_CXX \ -predeps_CXX \ -postdeps_CXX \ -compiler_lib_search_path_CXX; do - case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in - *[\\\\\\\`\\"\\\$]*) - eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED \\"\\\$sed_quote_subst\\"\\\`\\\\\\"" - ;; - *) - eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\"" - ;; - esac -done - -# Double-quote double-evaled strings. -for var in reload_cmds \ -old_postinstall_cmds \ -old_postuninstall_cmds \ -old_archive_cmds \ -extract_expsyms_cmds \ -old_archive_from_new_cmds \ -old_archive_from_expsyms_cmds \ -archive_cmds \ -archive_expsym_cmds \ -module_cmds \ -module_expsym_cmds \ -export_symbols_cmds \ -prelink_cmds \ -postlink_cmds \ -postinstall_cmds \ -postuninstall_cmds \ -finish_cmds \ -sys_lib_search_path_spec \ -sys_lib_dlsearch_path_spec \ -reload_cmds_CXX \ -old_archive_cmds_CXX \ -old_archive_from_new_cmds_CXX \ -old_archive_from_expsyms_cmds_CXX \ -archive_cmds_CXX \ -archive_expsym_cmds_CXX \ -module_cmds_CXX \ -module_expsym_cmds_CXX \ -export_symbols_cmds_CXX \ -prelink_cmds_CXX \ -postlink_cmds_CXX; do - case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in - *[\\\\\\\`\\"\\\$]*) - eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED -e \\"\\\$double_quote_subst\\" -e \\"\\\$sed_quote_subst\\" -e \\"\\\$delay_variable_subst\\"\\\`\\\\\\"" - ;; - *) - eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\"" - ;; - esac -done - -ac_aux_dir='$ac_aux_dir' -xsi_shell='$xsi_shell' -lt_shell_append='$lt_shell_append' - -# See if we are running on zsh, and set the options which allow our -# commands through without removal of \ escapes INIT. -if test -n "\${ZSH_VERSION+set}" ; then - setopt NO_GLOB_SUBST -fi - - - PACKAGE='$PACKAGE' - VERSION='$VERSION' - TIMESTAMP='$TIMESTAMP' - RM='$RM' - ofile='$ofile' - - - - - - -_ACEOF - -cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 - -# Handling of arguments. -for ac_config_target in $ac_config_targets -do - case $ac_config_target in - "config.h") CONFIG_HEADERS="$CONFIG_HEADERS config.h" ;; - "depfiles") CONFIG_COMMANDS="$CONFIG_COMMANDS depfiles" ;; - "libtool") CONFIG_COMMANDS="$CONFIG_COMMANDS libtool" ;; - "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;; - - *) as_fn_error $? "invalid argument: \`$ac_config_target'" "$LINENO" 5;; - esac -done - - -# If the user did not use the arguments to specify the items to instantiate, -# then the envvar interface is used. Set only those that are not. -# We use the long form for the default assignment because of an extremely -# bizarre bug on SunOS 4.1.3. -if $ac_need_defaults; then - test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files - test "${CONFIG_HEADERS+set}" = set || CONFIG_HEADERS=$config_headers - test "${CONFIG_COMMANDS+set}" = set || CONFIG_COMMANDS=$config_commands -fi - -# Have a temporary directory for convenience. Make it in the build tree -# simply because there is no reason against having it here, and in addition, -# creating and moving files from /tmp can sometimes cause problems. -# Hook for its removal unless debugging. -# Note that there is a small window in which the directory will not be cleaned: -# after its creation but before its name has been assigned to `$tmp'. -$debug || -{ - tmp= ac_tmp= - trap 'exit_status=$? - : "${ac_tmp:=$tmp}" - { test ! -d "$ac_tmp" || rm -fr "$ac_tmp"; } && exit $exit_status -' 0 - trap 'as_fn_exit 1' 1 2 13 15 -} -# Create a (secure) tmp directory for tmp files. - -{ - tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` && - test -d "$tmp" -} || -{ - tmp=./conf$$-$RANDOM - (umask 077 && mkdir "$tmp") -} || as_fn_error $? "cannot create a temporary directory in ." "$LINENO" 5 -ac_tmp=$tmp - -# Set up the scripts for CONFIG_FILES section. -# No need to generate them if there are no CONFIG_FILES. -# This happens for instance with `./config.status config.h'. -if test -n "$CONFIG_FILES"; then - - -ac_cr=`echo X | tr X '\015'` -# On cygwin, bash can eat \r inside `` if the user requested igncr. -# But we know of no other shell where ac_cr would be empty at this -# point, so we can use a bashism as a fallback. -if test "x$ac_cr" = x; then - eval ac_cr=\$\'\\r\' -fi -ac_cs_awk_cr=`$AWK 'BEGIN { print "a\rb" }' /dev/null` -if test "$ac_cs_awk_cr" = "a${ac_cr}b"; then - ac_cs_awk_cr='\\r' -else - ac_cs_awk_cr=$ac_cr -fi - -echo 'BEGIN {' >"$ac_tmp/subs1.awk" && -_ACEOF - - -{ - echo "cat >conf$$subs.awk <<_ACEOF" && - echo "$ac_subst_vars" | sed 's/.*/&!$&$ac_delim/' && - echo "_ACEOF" -} >conf$$subs.sh || - as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 -ac_delim_num=`echo "$ac_subst_vars" | grep -c '^'` -ac_delim='%!_!# ' -for ac_last_try in false false false false false :; do - . ./conf$$subs.sh || - as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 - - ac_delim_n=`sed -n "s/.*$ac_delim\$/X/p" conf$$subs.awk | grep -c X` - if test $ac_delim_n = $ac_delim_num; then - break - elif $ac_last_try; then - as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 - else - ac_delim="$ac_delim!$ac_delim _$ac_delim!! " - fi -done -rm -f conf$$subs.sh - -cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 -cat >>"\$ac_tmp/subs1.awk" <<\\_ACAWK && -_ACEOF -sed -n ' -h -s/^/S["/; s/!.*/"]=/ -p -g -s/^[^!]*!// -:repl -t repl -s/'"$ac_delim"'$// -t delim -:nl -h -s/\(.\{148\}\)..*/\1/ -t more1 -s/["\\]/\\&/g; s/^/"/; s/$/\\n"\\/ -p -n -b repl -:more1 -s/["\\]/\\&/g; s/^/"/; s/$/"\\/ -p -g -s/.\{148\}// -t nl -:delim -h -s/\(.\{148\}\)..*/\1/ -t more2 -s/["\\]/\\&/g; s/^/"/; s/$/"/ -p -b -:more2 -s/["\\]/\\&/g; s/^/"/; s/$/"\\/ -p -g -s/.\{148\}// -t delim -' >$CONFIG_STATUS || ac_write_fail=1 -rm -f conf$$subs.awk -cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 -_ACAWK -cat >>"\$ac_tmp/subs1.awk" <<_ACAWK && - for (key in S) S_is_set[key] = 1 - FS = "" - -} -{ - line = $ 0 - nfields = split(line, field, "@") - substed = 0 - len = length(field[1]) - for (i = 2; i < nfields; i++) { - key = field[i] - keylen = length(key) - if (S_is_set[key]) { - value = S[key] - line = substr(line, 1, len) "" value "" substr(line, len + keylen + 3) - len += length(value) + length(field[++i]) - substed = 1 - } else - len += 1 + keylen - } - - print line -} - -_ACAWK -_ACEOF -cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 -if sed "s/$ac_cr//" < /dev/null > /dev/null 2>&1; then - sed "s/$ac_cr\$//; s/$ac_cr/$ac_cs_awk_cr/g" -else - cat -fi < "$ac_tmp/subs1.awk" > "$ac_tmp/subs.awk" \ - || as_fn_error $? "could not setup config files machinery" "$LINENO" 5 -_ACEOF - -# VPATH may cause trouble with some makes, so we remove sole $(srcdir), -# ${srcdir} and @srcdir@ entries from VPATH if srcdir is ".", strip leading and -# trailing colons and then remove the whole line if VPATH becomes empty -# (actually we leave an empty line to preserve line numbers). -if test "x$srcdir" = x.; then - ac_vpsub='/^[ ]*VPATH[ ]*=[ ]*/{ -h -s/// -s/^/:/ -s/[ ]*$/:/ -s/:\$(srcdir):/:/g -s/:\${srcdir}:/:/g -s/:@srcdir@:/:/g -s/^:*// -s/:*$// -x -s/\(=[ ]*\).*/\1/ -G -s/\n// -s/^[^=]*=[ ]*$// -}' -fi - -cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 -fi # test -n "$CONFIG_FILES" - -# Set up the scripts for CONFIG_HEADERS section. -# No need to generate them if there are no CONFIG_HEADERS. -# This happens for instance with `./config.status Makefile'. -if test -n "$CONFIG_HEADERS"; then -cat >"$ac_tmp/defines.awk" <<\_ACAWK || -BEGIN { -_ACEOF - -# Transform confdefs.h into an awk script `defines.awk', embedded as -# here-document in config.status, that substitutes the proper values into -# config.h.in to produce config.h. - -# Create a delimiter string that does not exist in confdefs.h, to ease -# handling of long lines. -ac_delim='%!_!# ' -for ac_last_try in false false :; do - ac_tt=`sed -n "/$ac_delim/p" confdefs.h` - if test -z "$ac_tt"; then - break - elif $ac_last_try; then - as_fn_error $? "could not make $CONFIG_HEADERS" "$LINENO" 5 - else - ac_delim="$ac_delim!$ac_delim _$ac_delim!! " - fi -done - -# For the awk script, D is an array of macro values keyed by name, -# likewise P contains macro parameters if any. Preserve backslash -# newline sequences. - -ac_word_re=[_$as_cr_Letters][_$as_cr_alnum]* -sed -n ' -s/.\{148\}/&'"$ac_delim"'/g -t rset -:rset -s/^[ ]*#[ ]*define[ ][ ]*/ / -t def -d -:def -s/\\$// -t bsnl -s/["\\]/\\&/g -s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\ -D["\1"]=" \3"/p -s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2"/p -d -:bsnl -s/["\\]/\\&/g -s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\ -D["\1"]=" \3\\\\\\n"\\/p -t cont -s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2\\\\\\n"\\/p -t cont -d -:cont -n -s/.\{148\}/&'"$ac_delim"'/g -t clear -:clear -s/\\$// -t bsnlc -s/["\\]/\\&/g; s/^/"/; s/$/"/p -d -:bsnlc -s/["\\]/\\&/g; s/^/"/; s/$/\\\\\\n"\\/p -b cont -' >$CONFIG_STATUS || ac_write_fail=1 - -cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 - for (key in D) D_is_set[key] = 1 - FS = "" -} -/^[\t ]*#[\t ]*(define|undef)[\t ]+$ac_word_re([\t (]|\$)/ { - line = \$ 0 - split(line, arg, " ") - if (arg[1] == "#") { - defundef = arg[2] - mac1 = arg[3] - } else { - defundef = substr(arg[1], 2) - mac1 = arg[2] - } - split(mac1, mac2, "(") #) - macro = mac2[1] - prefix = substr(line, 1, index(line, defundef) - 1) - if (D_is_set[macro]) { - # Preserve the white space surrounding the "#". - print prefix "define", macro P[macro] D[macro] - next - } else { - # Replace #undef with comments. This is necessary, for example, - # in the case of _POSIX_SOURCE, which is predefined and required - # on some systems where configure will not decide to define it. - if (defundef == "undef") { - print "/*", prefix defundef, macro, "*/" - next - } - } -} -{ print } -_ACAWK -_ACEOF -cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 - as_fn_error $? "could not setup config headers machinery" "$LINENO" 5 -fi # test -n "$CONFIG_HEADERS" - - -eval set X " :F $CONFIG_FILES :H $CONFIG_HEADERS :C $CONFIG_COMMANDS" -shift -for ac_tag -do - case $ac_tag in - :[FHLC]) ac_mode=$ac_tag; continue;; - esac - case $ac_mode$ac_tag in - :[FHL]*:*);; - :L* | :C*:*) as_fn_error $? "invalid tag \`$ac_tag'" "$LINENO" 5;; - :[FH]-) ac_tag=-:-;; - :[FH]*) ac_tag=$ac_tag:$ac_tag.in;; - esac - ac_save_IFS=$IFS - IFS=: - set x $ac_tag - IFS=$ac_save_IFS - shift - ac_file=$1 - shift - - case $ac_mode in - :L) ac_source=$1;; - :[FH]) - ac_file_inputs= - for ac_f - do - case $ac_f in - -) ac_f="$ac_tmp/stdin";; - *) # Look for the file first in the build tree, then in the source tree - # (if the path is not absolute). The absolute path cannot be DOS-style, - # because $ac_f cannot contain `:'. - test -f "$ac_f" || - case $ac_f in - [\\/$]*) false;; - *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";; - esac || - as_fn_error 1 "cannot find input file: \`$ac_f'" "$LINENO" 5;; - esac - case $ac_f in *\'*) ac_f=`$as_echo "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac - as_fn_append ac_file_inputs " '$ac_f'" - done - - # Let's still pretend it is `configure' which instantiates (i.e., don't - # use $as_me), people would be surprised to read: - # /* config.h. Generated by config.status. */ - configure_input='Generated from '` - $as_echo "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g' - `' by configure.' - if test x"$ac_file" != x-; then - configure_input="$ac_file. $configure_input" - { $as_echo "$as_me:${as_lineno-$LINENO}: creating $ac_file" >&5 -$as_echo "$as_me: creating $ac_file" >&6;} - fi - # Neutralize special characters interpreted by sed in replacement strings. - case $configure_input in #( - *\&* | *\|* | *\\* ) - ac_sed_conf_input=`$as_echo "$configure_input" | - sed 's/[\\\\&|]/\\\\&/g'`;; #( - *) ac_sed_conf_input=$configure_input;; - esac - - case $ac_tag in - *:-:* | *:-) cat >"$ac_tmp/stdin" \ - || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; - esac - ;; - esac - - ac_dir=`$as_dirname -- "$ac_file" || -$as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ - X"$ac_file" : 'X\(//\)[^/]' \| \ - X"$ac_file" : 'X\(//\)$' \| \ - X"$ac_file" : 'X\(/\)' \| . 2>/dev/null || -$as_echo X"$ac_file" | - sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ - s//\1/ - q - } - /^X\(\/\/\)[^/].*/{ - s//\1/ - q - } - /^X\(\/\/\)$/{ - s//\1/ - q - } - /^X\(\/\).*/{ - s//\1/ - q - } - s/.*/./; q'` - as_dir="$ac_dir"; as_fn_mkdir_p - ac_builddir=. - -case "$ac_dir" in -.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; -*) - ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` - # A ".." for each directory in $ac_dir_suffix. - ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` - case $ac_top_builddir_sub in - "") ac_top_builddir_sub=. ac_top_build_prefix= ;; - *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; - esac ;; -esac -ac_abs_top_builddir=$ac_pwd -ac_abs_builddir=$ac_pwd$ac_dir_suffix -# for backward compatibility: -ac_top_builddir=$ac_top_build_prefix - -case $srcdir in - .) # We are building in place. - ac_srcdir=. - ac_top_srcdir=$ac_top_builddir_sub - ac_abs_top_srcdir=$ac_pwd ;; - [\\/]* | ?:[\\/]* ) # Absolute name. - ac_srcdir=$srcdir$ac_dir_suffix; - ac_top_srcdir=$srcdir - ac_abs_top_srcdir=$srcdir ;; - *) # Relative name. - ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix - ac_top_srcdir=$ac_top_build_prefix$srcdir - ac_abs_top_srcdir=$ac_pwd/$srcdir ;; -esac -ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix - - - case $ac_mode in - :F) - # - # CONFIG_FILE - # - - case $INSTALL in - [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;; - *) ac_INSTALL=$ac_top_build_prefix$INSTALL ;; - esac - ac_MKDIR_P=$MKDIR_P - case $MKDIR_P in - [\\/$]* | ?:[\\/]* ) ;; - */*) ac_MKDIR_P=$ac_top_build_prefix$MKDIR_P ;; - esac -_ACEOF - -cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 -# If the template does not know about datarootdir, expand it. -# FIXME: This hack should be removed a few years after 2.60. -ac_datarootdir_hack=; ac_datarootdir_seen= -ac_sed_dataroot=' -/datarootdir/ { - p - q -} -/@datadir@/p -/@docdir@/p -/@infodir@/p -/@localedir@/p -/@mandir@/p' -case `eval "sed -n \"\$ac_sed_dataroot\" $ac_file_inputs"` in -*datarootdir*) ac_datarootdir_seen=yes;; -*@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*) - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5 -$as_echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;} -_ACEOF -cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 - ac_datarootdir_hack=' - s&@datadir@&$datadir&g - s&@docdir@&$docdir&g - s&@infodir@&$infodir&g - s&@localedir@&$localedir&g - s&@mandir@&$mandir&g - s&\\\${datarootdir}&$datarootdir&g' ;; -esac -_ACEOF - -# Neutralize VPATH when `$srcdir' = `.'. -# Shell code in configure.ac might set extrasub. -# FIXME: do we really want to maintain this feature? -cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 -ac_sed_extra="$ac_vpsub -$extrasub -_ACEOF -cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 -:t -/@[a-zA-Z_][a-zA-Z_0-9]*@/!b -s|@configure_input@|$ac_sed_conf_input|;t t -s&@top_builddir@&$ac_top_builddir_sub&;t t -s&@top_build_prefix@&$ac_top_build_prefix&;t t -s&@srcdir@&$ac_srcdir&;t t -s&@abs_srcdir@&$ac_abs_srcdir&;t t -s&@top_srcdir@&$ac_top_srcdir&;t t -s&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t -s&@builddir@&$ac_builddir&;t t -s&@abs_builddir@&$ac_abs_builddir&;t t -s&@abs_top_builddir@&$ac_abs_top_builddir&;t t -s&@INSTALL@&$ac_INSTALL&;t t -s&@MKDIR_P@&$ac_MKDIR_P&;t t -$ac_datarootdir_hack -" -eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$ac_tmp/subs.awk" \ - >$ac_tmp/out || as_fn_error $? "could not create $ac_file" "$LINENO" 5 - -test -z "$ac_datarootdir_hack$ac_datarootdir_seen" && - { ac_out=`sed -n '/\${datarootdir}/p' "$ac_tmp/out"`; test -n "$ac_out"; } && - { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' \ - "$ac_tmp/out"`; test -z "$ac_out"; } && - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \`datarootdir' -which seems to be undefined. Please make sure it is defined" >&5 -$as_echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir' -which seems to be undefined. Please make sure it is defined" >&2;} - - rm -f "$ac_tmp/stdin" - case $ac_file in - -) cat "$ac_tmp/out" && rm -f "$ac_tmp/out";; - *) rm -f "$ac_file" && mv "$ac_tmp/out" "$ac_file";; - esac \ - || as_fn_error $? "could not create $ac_file" "$LINENO" 5 - ;; - :H) - # - # CONFIG_HEADER - # - if test x"$ac_file" != x-; then - { - $as_echo "/* $configure_input */" \ - && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" - } >"$ac_tmp/config.h" \ - || as_fn_error $? "could not create $ac_file" "$LINENO" 5 - if diff "$ac_file" "$ac_tmp/config.h" >/dev/null 2>&1; then - { $as_echo "$as_me:${as_lineno-$LINENO}: $ac_file is unchanged" >&5 -$as_echo "$as_me: $ac_file is unchanged" >&6;} - else - rm -f "$ac_file" - mv "$ac_tmp/config.h" "$ac_file" \ - || as_fn_error $? "could not create $ac_file" "$LINENO" 5 - fi - else - $as_echo "/* $configure_input */" \ - && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" \ - || as_fn_error $? "could not create -" "$LINENO" 5 - fi -# Compute "$ac_file"'s index in $config_headers. -_am_arg="$ac_file" -_am_stamp_count=1 -for _am_header in $config_headers :; do - case $_am_header in - $_am_arg | $_am_arg:* ) - break ;; - * ) - _am_stamp_count=`expr $_am_stamp_count + 1` ;; - esac -done -echo "timestamp for $_am_arg" >`$as_dirname -- "$_am_arg" || -$as_expr X"$_am_arg" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ - X"$_am_arg" : 'X\(//\)[^/]' \| \ - X"$_am_arg" : 'X\(//\)$' \| \ - X"$_am_arg" : 'X\(/\)' \| . 2>/dev/null || -$as_echo X"$_am_arg" | - sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ - s//\1/ - q - } - /^X\(\/\/\)[^/].*/{ - s//\1/ - q - } - /^X\(\/\/\)$/{ - s//\1/ - q - } - /^X\(\/\).*/{ - s//\1/ - q - } - s/.*/./; q'`/stamp-h$_am_stamp_count - ;; - - :C) { $as_echo "$as_me:${as_lineno-$LINENO}: executing $ac_file commands" >&5 -$as_echo "$as_me: executing $ac_file commands" >&6;} - ;; - esac - - - case $ac_file$ac_mode in - "depfiles":C) test x"$AMDEP_TRUE" != x"" || { - # Autoconf 2.62 quotes --file arguments for eval, but not when files - # are listed without --file. Let's play safe and only enable the eval - # if we detect the quoting. - case $CONFIG_FILES in - *\'*) eval set x "$CONFIG_FILES" ;; - *) set x $CONFIG_FILES ;; - esac - shift - for mf - do - # Strip MF so we end up with the name of the file. - mf=`echo "$mf" | sed -e 's/:.*$//'` - # Check whether this is an Automake generated Makefile or not. - # We used to match only the files named `Makefile.in', but - # some people rename them; so instead we look at the file content. - # Grep'ing the first line is not enough: some people post-process - # each Makefile.in and add a new line on top of each file to say so. - # Grep'ing the whole file is not good either: AIX grep has a line - # limit of 2048, but all sed's we know have understand at least 4000. - if sed -n 's,^#.*generated by automake.*,X,p' "$mf" | grep X >/dev/null 2>&1; then - dirpart=`$as_dirname -- "$mf" || -$as_expr X"$mf" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ - X"$mf" : 'X\(//\)[^/]' \| \ - X"$mf" : 'X\(//\)$' \| \ - X"$mf" : 'X\(/\)' \| . 2>/dev/null || -$as_echo X"$mf" | - sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ - s//\1/ - q - } - /^X\(\/\/\)[^/].*/{ - s//\1/ - q - } - /^X\(\/\/\)$/{ - s//\1/ - q - } - /^X\(\/\).*/{ - s//\1/ - q - } - s/.*/./; q'` - else - continue - fi - # Extract the definition of DEPDIR, am__include, and am__quote - # from the Makefile without running `make'. - DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"` - test -z "$DEPDIR" && continue - am__include=`sed -n 's/^am__include = //p' < "$mf"` - test -z "am__include" && continue - am__quote=`sed -n 's/^am__quote = //p' < "$mf"` - # When using ansi2knr, U may be empty or an underscore; expand it - U=`sed -n 's/^U = //p' < "$mf"` - # Find all dependency output files, they are included files with - # $(DEPDIR) in their names. We invoke sed twice because it is the - # simplest approach to changing $(DEPDIR) to its actual value in the - # expansion. - for file in `sed -n " - s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \ - sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g' -e 's/\$U/'"$U"'/g'`; do - # Make sure the directory exists. - test -f "$dirpart/$file" && continue - fdir=`$as_dirname -- "$file" || -$as_expr X"$file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ - X"$file" : 'X\(//\)[^/]' \| \ - X"$file" : 'X\(//\)$' \| \ - X"$file" : 'X\(/\)' \| . 2>/dev/null || -$as_echo X"$file" | - sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ - s//\1/ - q - } - /^X\(\/\/\)[^/].*/{ - s//\1/ - q - } - /^X\(\/\/\)$/{ - s//\1/ - q - } - /^X\(\/\).*/{ - s//\1/ - q - } - s/.*/./; q'` - as_dir=$dirpart/$fdir; as_fn_mkdir_p - # echo "creating $dirpart/$file" - echo '# dummy' > "$dirpart/$file" - done - done -} - ;; - "libtool":C) - - # See if we are running on zsh, and set the options which allow our - # commands through without removal of \ escapes. - if test -n "${ZSH_VERSION+set}" ; then - setopt NO_GLOB_SUBST - fi - - cfgfile="${ofile}T" - trap "$RM \"$cfgfile\"; exit 1" 1 2 15 - $RM "$cfgfile" - - cat <<_LT_EOF >> "$cfgfile" -#! $SHELL - -# `$ECHO "$ofile" | sed 's%^.*/%%'` - Provide generalized library-building support services. -# Generated automatically by $as_me ($PACKAGE$TIMESTAMP) $VERSION -# Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`: -# NOTE: Changes made to this file will be lost: look at ltmain.sh. -# -# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005, -# 2006, 2007, 2008, 2009, 2010, 2011 Free Software -# Foundation, Inc. -# Written by Gordon Matzigkeit, 1996 -# -# This file is part of GNU Libtool. -# -# GNU Libtool is free software; you can redistribute it and/or -# modify it under the terms of the GNU General Public License as -# published by the Free Software Foundation; either version 2 of -# the License, or (at your option) any later version. -# -# As a special exception to the GNU General Public License, -# if you distribute this file as part of a program or library that -# is built using GNU Libtool, you may include this file under the -# same distribution terms that you use for the rest of that program. -# -# GNU Libtool is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with GNU Libtool; see the file COPYING. If not, a copy -# can be downloaded from http://www.gnu.org/licenses/gpl.html, or -# obtained by writing to the Free Software Foundation, Inc., -# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - - -# The names of the tagged configurations supported by this script. -available_tags="CXX " - -# ### BEGIN LIBTOOL CONFIG - -# Which release of libtool.m4 was used? -macro_version=$macro_version -macro_revision=$macro_revision - -# Whether or not to build shared libraries. -build_libtool_libs=$enable_shared - -# Whether or not to build static libraries. -build_old_libs=$enable_static - -# What type of objects to build. -pic_mode=$pic_mode - -# Whether or not to optimize for fast installation. -fast_install=$enable_fast_install - -# Shell to use when invoking shell scripts. -SHELL=$lt_SHELL - -# An echo program that protects backslashes. -ECHO=$lt_ECHO - -# The PATH separator for the build system. -PATH_SEPARATOR=$lt_PATH_SEPARATOR - -# The host system. -host_alias=$host_alias -host=$host -host_os=$host_os - -# The build system. -build_alias=$build_alias -build=$build -build_os=$build_os - -# A sed program that does not truncate output. -SED=$lt_SED - -# Sed that helps us avoid accidentally triggering echo(1) options like -n. -Xsed="\$SED -e 1s/^X//" - -# A grep program that handles long lines. -GREP=$lt_GREP - -# An ERE matcher. -EGREP=$lt_EGREP - -# A literal string matcher. -FGREP=$lt_FGREP - -# A BSD- or MS-compatible name lister. -NM=$lt_NM - -# Whether we need soft or hard links. -LN_S=$lt_LN_S - -# What is the maximum length of a command? -max_cmd_len=$max_cmd_len - -# Object file suffix (normally "o"). -objext=$ac_objext - -# Executable file suffix (normally ""). -exeext=$exeext - -# whether the shell understands "unset". -lt_unset=$lt_unset - -# turn spaces into newlines. -SP2NL=$lt_lt_SP2NL - -# turn newlines into spaces. -NL2SP=$lt_lt_NL2SP - -# convert \$build file names to \$host format. -to_host_file_cmd=$lt_cv_to_host_file_cmd - -# convert \$build files to toolchain format. -to_tool_file_cmd=$lt_cv_to_tool_file_cmd - -# An object symbol dumper. -OBJDUMP=$lt_OBJDUMP - -# Method to check whether dependent libraries are shared objects. -deplibs_check_method=$lt_deplibs_check_method - -# Command to use when deplibs_check_method = "file_magic". -file_magic_cmd=$lt_file_magic_cmd - -# How to find potential files when deplibs_check_method = "file_magic". -file_magic_glob=$lt_file_magic_glob - -# Find potential files using nocaseglob when deplibs_check_method = "file_magic". -want_nocaseglob=$lt_want_nocaseglob - -# DLL creation program. -DLLTOOL=$lt_DLLTOOL - -# Command to associate shared and link libraries. -sharedlib_from_linklib_cmd=$lt_sharedlib_from_linklib_cmd - -# The archiver. -AR=$lt_AR - -# Flags to create an archive. -AR_FLAGS=$lt_AR_FLAGS - -# How to feed a file listing to the archiver. -archiver_list_spec=$lt_archiver_list_spec - -# A symbol stripping program. -STRIP=$lt_STRIP - -# Commands used to install an old-style archive. -RANLIB=$lt_RANLIB -old_postinstall_cmds=$lt_old_postinstall_cmds -old_postuninstall_cmds=$lt_old_postuninstall_cmds - -# Whether to use a lock for old archive extraction. -lock_old_archive_extraction=$lock_old_archive_extraction - -# A C compiler. -LTCC=$lt_CC - -# LTCC compiler flags. -LTCFLAGS=$lt_CFLAGS - -# Take the output of nm and produce a listing of raw symbols and C names. -global_symbol_pipe=$lt_lt_cv_sys_global_symbol_pipe - -# Transform the output of nm in a proper C declaration. -global_symbol_to_cdecl=$lt_lt_cv_sys_global_symbol_to_cdecl - -# Transform the output of nm in a C name address pair. -global_symbol_to_c_name_address=$lt_lt_cv_sys_global_symbol_to_c_name_address - -# Transform the output of nm in a C name address pair when lib prefix is needed. -global_symbol_to_c_name_address_lib_prefix=$lt_lt_cv_sys_global_symbol_to_c_name_address_lib_prefix - -# Specify filename containing input files for \$NM. -nm_file_list_spec=$lt_nm_file_list_spec - -# The root where to search for dependent libraries,and in which our libraries should be installed. -lt_sysroot=$lt_sysroot - -# The name of the directory that contains temporary libtool files. -objdir=$objdir - -# Used to examine libraries when file_magic_cmd begins with "file". -MAGIC_CMD=$MAGIC_CMD - -# Must we lock files when doing compilation? -need_locks=$lt_need_locks - -# Manifest tool. -MANIFEST_TOOL=$lt_MANIFEST_TOOL - -# Tool to manipulate archived DWARF debug symbol files on Mac OS X. -DSYMUTIL=$lt_DSYMUTIL - -# Tool to change global to local symbols on Mac OS X. -NMEDIT=$lt_NMEDIT - -# Tool to manipulate fat objects and archives on Mac OS X. -LIPO=$lt_LIPO - -# ldd/readelf like tool for Mach-O binaries on Mac OS X. -OTOOL=$lt_OTOOL - -# ldd/readelf like tool for 64 bit Mach-O binaries on Mac OS X 10.4. -OTOOL64=$lt_OTOOL64 - -# Old archive suffix (normally "a"). -libext=$libext - -# Shared library suffix (normally ".so"). -shrext_cmds=$lt_shrext_cmds - -# The commands to extract the exported symbol list from a shared archive. -extract_expsyms_cmds=$lt_extract_expsyms_cmds - -# Variables whose values should be saved in libtool wrapper scripts and -# restored at link time. -variables_saved_for_relink=$lt_variables_saved_for_relink - -# Do we need the "lib" prefix for modules? -need_lib_prefix=$need_lib_prefix - -# Do we need a version for libraries? -need_version=$need_version - -# Library versioning type. -version_type=$version_type - -# Shared library runtime path variable. -runpath_var=$runpath_var - -# Shared library path variable. -shlibpath_var=$shlibpath_var - -# Is shlibpath searched before the hard-coded library search path? -shlibpath_overrides_runpath=$shlibpath_overrides_runpath - -# Format of library name prefix. -libname_spec=$lt_libname_spec - -# List of archive names. First name is the real one, the rest are links. -# The last name is the one that the linker finds with -lNAME -library_names_spec=$lt_library_names_spec - -# The coded name of the library, if different from the real name. -soname_spec=$lt_soname_spec - -# Permission mode override for installation of shared libraries. -install_override_mode=$lt_install_override_mode - -# Command to use after installation of a shared archive. -postinstall_cmds=$lt_postinstall_cmds - -# Command to use after uninstallation of a shared archive. -postuninstall_cmds=$lt_postuninstall_cmds - -# Commands used to finish a libtool library installation in a directory. -finish_cmds=$lt_finish_cmds - -# As "finish_cmds", except a single script fragment to be evaled but -# not shown. -finish_eval=$lt_finish_eval - -# Whether we should hardcode library paths into libraries. -hardcode_into_libs=$hardcode_into_libs - -# Compile-time system search path for libraries. -sys_lib_search_path_spec=$lt_sys_lib_search_path_spec - -# Run-time system search path for libraries. -sys_lib_dlsearch_path_spec=$lt_sys_lib_dlsearch_path_spec - -# Whether dlopen is supported. -dlopen_support=$enable_dlopen - -# Whether dlopen of programs is supported. -dlopen_self=$enable_dlopen_self - -# Whether dlopen of statically linked programs is supported. -dlopen_self_static=$enable_dlopen_self_static - -# Commands to strip libraries. -old_striplib=$lt_old_striplib -striplib=$lt_striplib - - -# The linker used to build libraries. -LD=$lt_LD - -# How to create reloadable object files. -reload_flag=$lt_reload_flag -reload_cmds=$lt_reload_cmds - -# Commands used to build an old-style archive. -old_archive_cmds=$lt_old_archive_cmds - -# A language specific compiler. -CC=$lt_compiler - -# Is the compiler the GNU compiler? -with_gcc=$GCC - -# Compiler flag to turn off builtin functions. -no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag - -# Additional compiler flags for building library objects. -pic_flag=$lt_lt_prog_compiler_pic - -# How to pass a linker flag through the compiler. -wl=$lt_lt_prog_compiler_wl - -# Compiler flag to prevent dynamic linking. -link_static_flag=$lt_lt_prog_compiler_static - -# Does compiler simultaneously support -c and -o options? -compiler_c_o=$lt_lt_cv_prog_compiler_c_o - -# Whether or not to add -lc for building shared libraries. -build_libtool_need_lc=$archive_cmds_need_lc - -# Whether or not to disallow shared libs when runtime libs are static. -allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes - -# Compiler flag to allow reflexive dlopens. -export_dynamic_flag_spec=$lt_export_dynamic_flag_spec - -# Compiler flag to generate shared objects directly from archives. -whole_archive_flag_spec=$lt_whole_archive_flag_spec - -# Whether the compiler copes with passing no objects directly. -compiler_needs_object=$lt_compiler_needs_object - -# Create an old-style archive from a shared archive. -old_archive_from_new_cmds=$lt_old_archive_from_new_cmds - -# Create a temporary old-style archive to link instead of a shared archive. -old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds - -# Commands used to build a shared archive. -archive_cmds=$lt_archive_cmds -archive_expsym_cmds=$lt_archive_expsym_cmds - -# Commands used to build a loadable module if different from building -# a shared archive. -module_cmds=$lt_module_cmds -module_expsym_cmds=$lt_module_expsym_cmds - -# Whether we are building with GNU ld or not. -with_gnu_ld=$lt_with_gnu_ld - -# Flag that allows shared libraries with undefined symbols to be built. -allow_undefined_flag=$lt_allow_undefined_flag - -# Flag that enforces no undefined symbols. -no_undefined_flag=$lt_no_undefined_flag - -# Flag to hardcode \$libdir into a binary during linking. -# This must work even if \$libdir does not exist -hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec - -# Whether we need a single "-rpath" flag with a separated argument. -hardcode_libdir_separator=$lt_hardcode_libdir_separator - -# Set to "yes" if using DIR/libNAME\${shared_ext} during linking hardcodes -# DIR into the resulting binary. -hardcode_direct=$hardcode_direct - -# Set to "yes" if using DIR/libNAME\${shared_ext} during linking hardcodes -# DIR into the resulting binary and the resulting library dependency is -# "absolute",i.e impossible to change by setting \${shlibpath_var} if the -# library is relocated. -hardcode_direct_absolute=$hardcode_direct_absolute - -# Set to "yes" if using the -LDIR flag during linking hardcodes DIR -# into the resulting binary. -hardcode_minus_L=$hardcode_minus_L - -# Set to "yes" if using SHLIBPATH_VAR=DIR during linking hardcodes DIR -# into the resulting binary. -hardcode_shlibpath_var=$hardcode_shlibpath_var - -# Set to "yes" if building a shared library automatically hardcodes DIR -# into the library and all subsequent libraries and executables linked -# against it. -hardcode_automatic=$hardcode_automatic - -# Set to yes if linker adds runtime paths of dependent libraries -# to runtime path list. -inherit_rpath=$inherit_rpath - -# Whether libtool must link a program against all its dependency libraries. -link_all_deplibs=$link_all_deplibs - -# Set to "yes" if exported symbols are required. -always_export_symbols=$always_export_symbols - -# The commands to list exported symbols. -export_symbols_cmds=$lt_export_symbols_cmds - -# Symbols that should not be listed in the preloaded symbols. -exclude_expsyms=$lt_exclude_expsyms - -# Symbols that must always be exported. -include_expsyms=$lt_include_expsyms - -# Commands necessary for linking programs (against libraries) with templates. -prelink_cmds=$lt_prelink_cmds - -# Commands necessary for finishing linking programs. -postlink_cmds=$lt_postlink_cmds - -# Specify filename containing input files. -file_list_spec=$lt_file_list_spec - -# How to hardcode a shared library path into an executable. -hardcode_action=$hardcode_action - -# The directories searched by this compiler when creating a shared library. -compiler_lib_search_dirs=$lt_compiler_lib_search_dirs - -# Dependencies to place before and after the objects being linked to -# create a shared library. -predep_objects=$lt_predep_objects -postdep_objects=$lt_postdep_objects -predeps=$lt_predeps -postdeps=$lt_postdeps - -# The library search path used internally by the compiler when linking -# a shared library. -compiler_lib_search_path=$lt_compiler_lib_search_path - -# ### END LIBTOOL CONFIG - -_LT_EOF - - case $host_os in - aix3*) - cat <<\_LT_EOF >> "$cfgfile" -# AIX sometimes has problems with the GCC collect2 program. For some -# reason, if we set the COLLECT_NAMES environment variable, the problems -# vanish in a puff of smoke. -if test "X${COLLECT_NAMES+set}" != Xset; then - COLLECT_NAMES= - export COLLECT_NAMES -fi -_LT_EOF - ;; - esac - - -ltmain="$ac_aux_dir/ltmain.sh" - - - # We use sed instead of cat because bash on DJGPP gets confused if - # if finds mixed CR/LF and LF-only lines. Since sed operates in - # text mode, it properly converts lines to CR/LF. This bash problem - # is reportedly fixed, but why not run on old versions too? - sed '$q' "$ltmain" >> "$cfgfile" \ - || (rm -f "$cfgfile"; exit 1) - - if test x"$xsi_shell" = xyes; then - sed -e '/^func_dirname ()$/,/^} # func_dirname /c\ -func_dirname ()\ -{\ -\ case ${1} in\ -\ */*) func_dirname_result="${1%/*}${2}" ;;\ -\ * ) func_dirname_result="${3}" ;;\ -\ esac\ -} # Extended-shell func_dirname implementation' "$cfgfile" > $cfgfile.tmp \ - && mv -f "$cfgfile.tmp" "$cfgfile" \ - || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") -test 0 -eq $? || _lt_function_replace_fail=: - - - sed -e '/^func_basename ()$/,/^} # func_basename /c\ -func_basename ()\ -{\ -\ func_basename_result="${1##*/}"\ -} # Extended-shell func_basename implementation' "$cfgfile" > $cfgfile.tmp \ - && mv -f "$cfgfile.tmp" "$cfgfile" \ - || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") -test 0 -eq $? || _lt_function_replace_fail=: - - - sed -e '/^func_dirname_and_basename ()$/,/^} # func_dirname_and_basename /c\ -func_dirname_and_basename ()\ -{\ -\ case ${1} in\ -\ */*) func_dirname_result="${1%/*}${2}" ;;\ -\ * ) func_dirname_result="${3}" ;;\ -\ esac\ -\ func_basename_result="${1##*/}"\ -} # Extended-shell func_dirname_and_basename implementation' "$cfgfile" > $cfgfile.tmp \ - && mv -f "$cfgfile.tmp" "$cfgfile" \ - || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") -test 0 -eq $? || _lt_function_replace_fail=: - - - sed -e '/^func_stripname ()$/,/^} # func_stripname /c\ -func_stripname ()\ -{\ -\ # pdksh 5.2.14 does not do ${X%$Y} correctly if both X and Y are\ -\ # positional parameters, so assign one to ordinary parameter first.\ -\ func_stripname_result=${3}\ -\ func_stripname_result=${func_stripname_result#"${1}"}\ -\ func_stripname_result=${func_stripname_result%"${2}"}\ -} # Extended-shell func_stripname implementation' "$cfgfile" > $cfgfile.tmp \ - && mv -f "$cfgfile.tmp" "$cfgfile" \ - || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") -test 0 -eq $? || _lt_function_replace_fail=: - - - sed -e '/^func_split_long_opt ()$/,/^} # func_split_long_opt /c\ -func_split_long_opt ()\ -{\ -\ func_split_long_opt_name=${1%%=*}\ -\ func_split_long_opt_arg=${1#*=}\ -} # Extended-shell func_split_long_opt implementation' "$cfgfile" > $cfgfile.tmp \ - && mv -f "$cfgfile.tmp" "$cfgfile" \ - || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") -test 0 -eq $? || _lt_function_replace_fail=: - - - sed -e '/^func_split_short_opt ()$/,/^} # func_split_short_opt /c\ -func_split_short_opt ()\ -{\ -\ func_split_short_opt_arg=${1#??}\ -\ func_split_short_opt_name=${1%"$func_split_short_opt_arg"}\ -} # Extended-shell func_split_short_opt implementation' "$cfgfile" > $cfgfile.tmp \ - && mv -f "$cfgfile.tmp" "$cfgfile" \ - || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") -test 0 -eq $? || _lt_function_replace_fail=: - - - sed -e '/^func_lo2o ()$/,/^} # func_lo2o /c\ -func_lo2o ()\ -{\ -\ case ${1} in\ -\ *.lo) func_lo2o_result=${1%.lo}.${objext} ;;\ -\ *) func_lo2o_result=${1} ;;\ -\ esac\ -} # Extended-shell func_lo2o implementation' "$cfgfile" > $cfgfile.tmp \ - && mv -f "$cfgfile.tmp" "$cfgfile" \ - || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") -test 0 -eq $? || _lt_function_replace_fail=: - - - sed -e '/^func_xform ()$/,/^} # func_xform /c\ -func_xform ()\ -{\ - func_xform_result=${1%.*}.lo\ -} # Extended-shell func_xform implementation' "$cfgfile" > $cfgfile.tmp \ - && mv -f "$cfgfile.tmp" "$cfgfile" \ - || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") -test 0 -eq $? || _lt_function_replace_fail=: - - - sed -e '/^func_arith ()$/,/^} # func_arith /c\ -func_arith ()\ -{\ - func_arith_result=$(( $* ))\ -} # Extended-shell func_arith implementation' "$cfgfile" > $cfgfile.tmp \ - && mv -f "$cfgfile.tmp" "$cfgfile" \ - || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") -test 0 -eq $? || _lt_function_replace_fail=: - - - sed -e '/^func_len ()$/,/^} # func_len /c\ -func_len ()\ -{\ - func_len_result=${#1}\ -} # Extended-shell func_len implementation' "$cfgfile" > $cfgfile.tmp \ - && mv -f "$cfgfile.tmp" "$cfgfile" \ - || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") -test 0 -eq $? || _lt_function_replace_fail=: - -fi - -if test x"$lt_shell_append" = xyes; then - sed -e '/^func_append ()$/,/^} # func_append /c\ -func_append ()\ -{\ - eval "${1}+=\\${2}"\ -} # Extended-shell func_append implementation' "$cfgfile" > $cfgfile.tmp \ - && mv -f "$cfgfile.tmp" "$cfgfile" \ - || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") -test 0 -eq $? || _lt_function_replace_fail=: - - - sed -e '/^func_append_quoted ()$/,/^} # func_append_quoted /c\ -func_append_quoted ()\ -{\ -\ func_quote_for_eval "${2}"\ -\ eval "${1}+=\\\\ \\$func_quote_for_eval_result"\ -} # Extended-shell func_append_quoted implementation' "$cfgfile" > $cfgfile.tmp \ - && mv -f "$cfgfile.tmp" "$cfgfile" \ - || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") -test 0 -eq $? || _lt_function_replace_fail=: - - - # Save a `func_append' function call where possible by direct use of '+=' - sed -e 's%func_append \([a-zA-Z_]\{1,\}\) "%\1+="%g' $cfgfile > $cfgfile.tmp \ - && mv -f "$cfgfile.tmp" "$cfgfile" \ - || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") - test 0 -eq $? || _lt_function_replace_fail=: -else - # Save a `func_append' function call even when '+=' is not available - sed -e 's%func_append \([a-zA-Z_]\{1,\}\) "%\1="$\1%g' $cfgfile > $cfgfile.tmp \ - && mv -f "$cfgfile.tmp" "$cfgfile" \ - || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") - test 0 -eq $? || _lt_function_replace_fail=: -fi - -if test x"$_lt_function_replace_fail" = x":"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Unable to substitute extended shell functions in $ofile" >&5 -$as_echo "$as_me: WARNING: Unable to substitute extended shell functions in $ofile" >&2;} -fi - - - mv -f "$cfgfile" "$ofile" || - (rm -f "$ofile" && cp "$cfgfile" "$ofile" && rm -f "$cfgfile") - chmod +x "$ofile" - - - cat <<_LT_EOF >> "$ofile" - -# ### BEGIN LIBTOOL TAG CONFIG: CXX - -# The linker used to build libraries. -LD=$lt_LD_CXX - -# How to create reloadable object files. -reload_flag=$lt_reload_flag_CXX -reload_cmds=$lt_reload_cmds_CXX - -# Commands used to build an old-style archive. -old_archive_cmds=$lt_old_archive_cmds_CXX - -# A language specific compiler. -CC=$lt_compiler_CXX - -# Is the compiler the GNU compiler? -with_gcc=$GCC_CXX - -# Compiler flag to turn off builtin functions. -no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag_CXX - -# Additional compiler flags for building library objects. -pic_flag=$lt_lt_prog_compiler_pic_CXX - -# How to pass a linker flag through the compiler. -wl=$lt_lt_prog_compiler_wl_CXX - -# Compiler flag to prevent dynamic linking. -link_static_flag=$lt_lt_prog_compiler_static_CXX - -# Does compiler simultaneously support -c and -o options? -compiler_c_o=$lt_lt_cv_prog_compiler_c_o_CXX - -# Whether or not to add -lc for building shared libraries. -build_libtool_need_lc=$archive_cmds_need_lc_CXX - -# Whether or not to disallow shared libs when runtime libs are static. -allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes_CXX - -# Compiler flag to allow reflexive dlopens. -export_dynamic_flag_spec=$lt_export_dynamic_flag_spec_CXX - -# Compiler flag to generate shared objects directly from archives. -whole_archive_flag_spec=$lt_whole_archive_flag_spec_CXX - -# Whether the compiler copes with passing no objects directly. -compiler_needs_object=$lt_compiler_needs_object_CXX - -# Create an old-style archive from a shared archive. -old_archive_from_new_cmds=$lt_old_archive_from_new_cmds_CXX - -# Create a temporary old-style archive to link instead of a shared archive. -old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds_CXX - -# Commands used to build a shared archive. -archive_cmds=$lt_archive_cmds_CXX -archive_expsym_cmds=$lt_archive_expsym_cmds_CXX - -# Commands used to build a loadable module if different from building -# a shared archive. -module_cmds=$lt_module_cmds_CXX -module_expsym_cmds=$lt_module_expsym_cmds_CXX - -# Whether we are building with GNU ld or not. -with_gnu_ld=$lt_with_gnu_ld_CXX - -# Flag that allows shared libraries with undefined symbols to be built. -allow_undefined_flag=$lt_allow_undefined_flag_CXX - -# Flag that enforces no undefined symbols. -no_undefined_flag=$lt_no_undefined_flag_CXX - -# Flag to hardcode \$libdir into a binary during linking. -# This must work even if \$libdir does not exist -hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec_CXX - -# Whether we need a single "-rpath" flag with a separated argument. -hardcode_libdir_separator=$lt_hardcode_libdir_separator_CXX - -# Set to "yes" if using DIR/libNAME\${shared_ext} during linking hardcodes -# DIR into the resulting binary. -hardcode_direct=$hardcode_direct_CXX - -# Set to "yes" if using DIR/libNAME\${shared_ext} during linking hardcodes -# DIR into the resulting binary and the resulting library dependency is -# "absolute",i.e impossible to change by setting \${shlibpath_var} if the -# library is relocated. -hardcode_direct_absolute=$hardcode_direct_absolute_CXX - -# Set to "yes" if using the -LDIR flag during linking hardcodes DIR -# into the resulting binary. -hardcode_minus_L=$hardcode_minus_L_CXX - -# Set to "yes" if using SHLIBPATH_VAR=DIR during linking hardcodes DIR -# into the resulting binary. -hardcode_shlibpath_var=$hardcode_shlibpath_var_CXX - -# Set to "yes" if building a shared library automatically hardcodes DIR -# into the library and all subsequent libraries and executables linked -# against it. -hardcode_automatic=$hardcode_automatic_CXX - -# Set to yes if linker adds runtime paths of dependent libraries -# to runtime path list. -inherit_rpath=$inherit_rpath_CXX - -# Whether libtool must link a program against all its dependency libraries. -link_all_deplibs=$link_all_deplibs_CXX - -# Set to "yes" if exported symbols are required. -always_export_symbols=$always_export_symbols_CXX - -# The commands to list exported symbols. -export_symbols_cmds=$lt_export_symbols_cmds_CXX - -# Symbols that should not be listed in the preloaded symbols. -exclude_expsyms=$lt_exclude_expsyms_CXX - -# Symbols that must always be exported. -include_expsyms=$lt_include_expsyms_CXX - -# Commands necessary for linking programs (against libraries) with templates. -prelink_cmds=$lt_prelink_cmds_CXX - -# Commands necessary for finishing linking programs. -postlink_cmds=$lt_postlink_cmds_CXX - -# Specify filename containing input files. -file_list_spec=$lt_file_list_spec_CXX - -# How to hardcode a shared library path into an executable. -hardcode_action=$hardcode_action_CXX - -# The directories searched by this compiler when creating a shared library. -compiler_lib_search_dirs=$lt_compiler_lib_search_dirs_CXX - -# Dependencies to place before and after the objects being linked to -# create a shared library. -predep_objects=$lt_predep_objects_CXX -postdep_objects=$lt_postdep_objects_CXX -predeps=$lt_predeps_CXX -postdeps=$lt_postdeps_CXX - -# The library search path used internally by the compiler when linking -# a shared library. -compiler_lib_search_path=$lt_compiler_lib_search_path_CXX - -# ### END LIBTOOL TAG CONFIG: CXX -_LT_EOF - - ;; - - esac -done # for ac_tag - - -as_fn_exit 0 -_ACEOF -ac_clean_files=$ac_clean_files_save - -test $ac_write_fail = 0 || - as_fn_error $? "write failure creating $CONFIG_STATUS" "$LINENO" 5 - - -# configure is writing to config.log, and then calls config.status. -# config.status does its own redirection, appending to config.log. -# Unfortunately, on DOS this fails, as config.log is still kept open -# by configure, so config.status won't be able to write to it; its -# output is simply discarded. So we exec the FD to /dev/null, -# effectively closing config.log, so it can be properly (re)opened and -# appended to by config.status. When coming back to configure, we -# need to make the FD available again. -if test "$no_create" != yes; then - ac_cs_success=: - ac_config_status_args= - test "$silent" = yes && - ac_config_status_args="$ac_config_status_args --quiet" - exec 5>/dev/null - $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false - exec 5>>config.log - # Use ||, not &&, to avoid exiting from the if with $? = 1, which - # would make configure fail if this is the last instruction. - $ac_cs_success || as_fn_exit 1 -fi -if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5 -$as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;} -fi - diff --git a/pkg/registry/zookeeper-3.4.6/src/c/autom4te.cache/output.2 b/pkg/registry/zookeeper-3.4.6/src/c/autom4te.cache/output.2 deleted file mode 100644 index b05991cdf..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/c/autom4te.cache/output.2 +++ /dev/null @@ -1,20471 +0,0 @@ -@%:@! /bin/sh -@%:@ Guess values for system-dependent variables and create Makefiles. -@%:@ Generated by GNU Autoconf 2.69 for zookeeper C client 3.4.5. -@%:@ -@%:@ Report bugs to . -@%:@ -@%:@ -@%:@ Copyright (C) 1992-1996, 1998-2012 Free Software Foundation, Inc. -@%:@ -@%:@ -@%:@ This configure script is free software; the Free Software Foundation -@%:@ gives unlimited permission to copy, distribute and modify it. -## -------------------- ## -## M4sh Initialization. ## -## -------------------- ## - -# Be more Bourne compatible -DUALCASE=1; export DUALCASE # for MKS sh -if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : - emulate sh - NULLCMD=: - # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which - # is contrary to our usage. Disable this feature. - alias -g '${1+"$@"}'='"$@"' - setopt NO_GLOB_SUBST -else - case `(set -o) 2>/dev/null` in @%:@( - *posix*) : - set -o posix ;; @%:@( - *) : - ;; -esac -fi - - -as_nl=' -' -export as_nl -# Printing a long string crashes Solaris 7 /usr/bin/printf. -as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' -as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo -as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo -# Prefer a ksh shell builtin over an external printf program on Solaris, -# but without wasting forks for bash or zsh. -if test -z "$BASH_VERSION$ZSH_VERSION" \ - && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then - as_echo='print -r --' - as_echo_n='print -rn --' -elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then - as_echo='printf %s\n' - as_echo_n='printf %s' -else - if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then - as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' - as_echo_n='/usr/ucb/echo -n' - else - as_echo_body='eval expr "X$1" : "X\\(.*\\)"' - as_echo_n_body='eval - arg=$1; - case $arg in @%:@( - *"$as_nl"*) - expr "X$arg" : "X\\(.*\\)$as_nl"; - arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; - esac; - expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" - ' - export as_echo_n_body - as_echo_n='sh -c $as_echo_n_body as_echo' - fi - export as_echo_body - as_echo='sh -c $as_echo_body as_echo' -fi - -# The user is always right. -if test "${PATH_SEPARATOR+set}" != set; then - PATH_SEPARATOR=: - (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { - (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || - PATH_SEPARATOR=';' - } -fi - - -# IFS -# We need space, tab and new line, in precisely that order. Quoting is -# there to prevent editors from complaining about space-tab. -# (If _AS_PATH_WALK were called with IFS unset, it would disable word -# splitting by setting IFS to empty value.) -IFS=" "" $as_nl" - -# Find who we are. Look in the path if we contain no directory separator. -as_myself= -case $0 in @%:@(( - *[\\/]* ) as_myself=$0 ;; - *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break - done -IFS=$as_save_IFS - - ;; -esac -# We did not find ourselves, most probably we were run as `sh COMMAND' -# in which case we are not to be found in the path. -if test "x$as_myself" = x; then - as_myself=$0 -fi -if test ! -f "$as_myself"; then - $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 - exit 1 -fi - -# Unset variables that we do not need and which cause bugs (e.g. in -# pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" -# suppresses any "Segmentation fault" message there. '((' could -# trigger a bug in pdksh 5.2.14. -for as_var in BASH_ENV ENV MAIL MAILPATH -do eval test x\${$as_var+set} = xset \ - && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : -done -PS1='$ ' -PS2='> ' -PS4='+ ' - -# NLS nuisances. -LC_ALL=C -export LC_ALL -LANGUAGE=C -export LANGUAGE - -# CDPATH. -(unset CDPATH) >/dev/null 2>&1 && unset CDPATH - -# Use a proper internal environment variable to ensure we don't fall - # into an infinite loop, continuously re-executing ourselves. - if test x"${_as_can_reexec}" != xno && test "x$CONFIG_SHELL" != x; then - _as_can_reexec=no; export _as_can_reexec; - # We cannot yet assume a decent shell, so we have to provide a -# neutralization value for shells without unset; and this also -# works around shells that cannot unset nonexistent variables. -# Preserve -v and -x to the replacement shell. -BASH_ENV=/dev/null -ENV=/dev/null -(unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV -case $- in @%:@ (((( - *v*x* | *x*v* ) as_opts=-vx ;; - *v* ) as_opts=-v ;; - *x* ) as_opts=-x ;; - * ) as_opts= ;; -esac -exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} -# Admittedly, this is quite paranoid, since all the known shells bail -# out after a failed `exec'. -$as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2 -as_fn_exit 255 - fi - # We don't want this to propagate to other subprocesses. - { _as_can_reexec=; unset _as_can_reexec;} -if test "x$CONFIG_SHELL" = x; then - as_bourne_compatible="if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then : - emulate sh - NULLCMD=: - # Pre-4.2 versions of Zsh do word splitting on \${1+\"\$@\"}, which - # is contrary to our usage. Disable this feature. - alias -g '\${1+\"\$@\"}'='\"\$@\"' - setopt NO_GLOB_SUBST -else - case \`(set -o) 2>/dev/null\` in @%:@( - *posix*) : - set -o posix ;; @%:@( - *) : - ;; -esac -fi -" - as_required="as_fn_return () { (exit \$1); } -as_fn_success () { as_fn_return 0; } -as_fn_failure () { as_fn_return 1; } -as_fn_ret_success () { return 0; } -as_fn_ret_failure () { return 1; } - -exitcode=0 -as_fn_success || { exitcode=1; echo as_fn_success failed.; } -as_fn_failure && { exitcode=1; echo as_fn_failure succeeded.; } -as_fn_ret_success || { exitcode=1; echo as_fn_ret_success failed.; } -as_fn_ret_failure && { exitcode=1; echo as_fn_ret_failure succeeded.; } -if ( set x; as_fn_ret_success y && test x = \"\$1\" ); then : - -else - exitcode=1; echo positional parameters were not saved. -fi -test x\$exitcode = x0 || exit 1 -test -x / || exit 1" - as_suggested=" as_lineno_1=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_1a=\$LINENO - as_lineno_2=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_2a=\$LINENO - eval 'test \"x\$as_lineno_1'\$as_run'\" != \"x\$as_lineno_2'\$as_run'\" && - test \"x\`expr \$as_lineno_1'\$as_run' + 1\`\" = \"x\$as_lineno_2'\$as_run'\"' || exit 1 - - test -n \"\${ZSH_VERSION+set}\${BASH_VERSION+set}\" || ( - ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' - ECHO=\$ECHO\$ECHO\$ECHO\$ECHO\$ECHO - ECHO=\$ECHO\$ECHO\$ECHO\$ECHO\$ECHO\$ECHO - PATH=/empty FPATH=/empty; export PATH FPATH - test \"X\`printf %s \$ECHO\`\" = \"X\$ECHO\" \\ - || test \"X\`print -r -- \$ECHO\`\" = \"X\$ECHO\" ) || exit 1 -test \$(( 1 + 1 )) = 2 || exit 1" - if (eval "$as_required") 2>/dev/null; then : - as_have_required=yes -else - as_have_required=no -fi - if test x$as_have_required = xyes && (eval "$as_suggested") 2>/dev/null; then : - -else - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -as_found=false -for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - as_found=: - case $as_dir in @%:@( - /*) - for as_base in sh bash ksh sh5; do - # Try only shells that exist, to save several forks. - as_shell=$as_dir/$as_base - if { test -f "$as_shell" || test -f "$as_shell.exe"; } && - { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$as_shell"; } 2>/dev/null; then : - CONFIG_SHELL=$as_shell as_have_required=yes - if { $as_echo "$as_bourne_compatible""$as_suggested" | as_run=a "$as_shell"; } 2>/dev/null; then : - break 2 -fi -fi - done;; - esac - as_found=false -done -$as_found || { if { test -f "$SHELL" || test -f "$SHELL.exe"; } && - { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$SHELL"; } 2>/dev/null; then : - CONFIG_SHELL=$SHELL as_have_required=yes -fi; } -IFS=$as_save_IFS - - - if test "x$CONFIG_SHELL" != x; then : - export CONFIG_SHELL - # We cannot yet assume a decent shell, so we have to provide a -# neutralization value for shells without unset; and this also -# works around shells that cannot unset nonexistent variables. -# Preserve -v and -x to the replacement shell. -BASH_ENV=/dev/null -ENV=/dev/null -(unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV -case $- in @%:@ (((( - *v*x* | *x*v* ) as_opts=-vx ;; - *v* ) as_opts=-v ;; - *x* ) as_opts=-x ;; - * ) as_opts= ;; -esac -exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} -# Admittedly, this is quite paranoid, since all the known shells bail -# out after a failed `exec'. -$as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2 -exit 255 -fi - - if test x$as_have_required = xno; then : - $as_echo "$0: This script requires a shell more modern than all" - $as_echo "$0: the shells that I found on your system." - if test x${ZSH_VERSION+set} = xset ; then - $as_echo "$0: In particular, zsh $ZSH_VERSION has bugs and should" - $as_echo "$0: be upgraded to zsh 4.3.4 or later." - else - $as_echo "$0: Please tell bug-autoconf@gnu.org and -$0: user@zookeeper.apache.org about your system, including -$0: any error possibly output before this message. Then -$0: install a modern shell, or manually run the script -$0: under such a shell if you do have one." - fi - exit 1 -fi -fi -fi -SHELL=${CONFIG_SHELL-/bin/sh} -export SHELL -# Unset more variables known to interfere with behavior of common tools. -CLICOLOR_FORCE= GREP_OPTIONS= -unset CLICOLOR_FORCE GREP_OPTIONS - -## --------------------- ## -## M4sh Shell Functions. ## -## --------------------- ## -@%:@ as_fn_unset VAR -@%:@ --------------- -@%:@ Portably unset VAR. -as_fn_unset () -{ - { eval $1=; unset $1;} -} -as_unset=as_fn_unset - -@%:@ as_fn_set_status STATUS -@%:@ ----------------------- -@%:@ Set @S|@? to STATUS, without forking. -as_fn_set_status () -{ - return $1 -} @%:@ as_fn_set_status - -@%:@ as_fn_exit STATUS -@%:@ ----------------- -@%:@ Exit the shell with STATUS, even in a "trap 0" or "set -e" context. -as_fn_exit () -{ - set +e - as_fn_set_status $1 - exit $1 -} @%:@ as_fn_exit - -@%:@ as_fn_mkdir_p -@%:@ ------------- -@%:@ Create "@S|@as_dir" as a directory, including parents if necessary. -as_fn_mkdir_p () -{ - - case $as_dir in #( - -*) as_dir=./$as_dir;; - esac - test -d "$as_dir" || eval $as_mkdir_p || { - as_dirs= - while :; do - case $as_dir in #( - *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( - *) as_qdir=$as_dir;; - esac - as_dirs="'$as_qdir' $as_dirs" - as_dir=`$as_dirname -- "$as_dir" || -$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ - X"$as_dir" : 'X\(//\)[^/]' \| \ - X"$as_dir" : 'X\(//\)$' \| \ - X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || -$as_echo X"$as_dir" | - sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ - s//\1/ - q - } - /^X\(\/\/\)[^/].*/{ - s//\1/ - q - } - /^X\(\/\/\)$/{ - s//\1/ - q - } - /^X\(\/\).*/{ - s//\1/ - q - } - s/.*/./; q'` - test -d "$as_dir" && break - done - test -z "$as_dirs" || eval "mkdir $as_dirs" - } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" - - -} @%:@ as_fn_mkdir_p - -@%:@ as_fn_executable_p FILE -@%:@ ----------------------- -@%:@ Test if FILE is an executable regular file. -as_fn_executable_p () -{ - test -f "$1" && test -x "$1" -} @%:@ as_fn_executable_p -@%:@ as_fn_append VAR VALUE -@%:@ ---------------------- -@%:@ Append the text in VALUE to the end of the definition contained in VAR. Take -@%:@ advantage of any shell optimizations that allow amortized linear growth over -@%:@ repeated appends, instead of the typical quadratic growth present in naive -@%:@ implementations. -if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : - eval 'as_fn_append () - { - eval $1+=\$2 - }' -else - as_fn_append () - { - eval $1=\$$1\$2 - } -fi # as_fn_append - -@%:@ as_fn_arith ARG... -@%:@ ------------------ -@%:@ Perform arithmetic evaluation on the ARGs, and store the result in the -@%:@ global @S|@as_val. Take advantage of shells that can avoid forks. The arguments -@%:@ must be portable across @S|@(()) and expr. -if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : - eval 'as_fn_arith () - { - as_val=$(( $* )) - }' -else - as_fn_arith () - { - as_val=`expr "$@" || test $? -eq 1` - } -fi # as_fn_arith - - -@%:@ as_fn_error STATUS ERROR [LINENO LOG_FD] -@%:@ ---------------------------------------- -@%:@ Output "`basename @S|@0`: error: ERROR" to stderr. If LINENO and LOG_FD are -@%:@ provided, also output the error to LOG_FD, referencing LINENO. Then exit the -@%:@ script with STATUS, using 1 if that was 0. -as_fn_error () -{ - as_status=$1; test $as_status -eq 0 && as_status=1 - if test "$4"; then - as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack - $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 - fi - $as_echo "$as_me: error: $2" >&2 - as_fn_exit $as_status -} @%:@ as_fn_error - -if expr a : '\(a\)' >/dev/null 2>&1 && - test "X`expr 00001 : '.*\(...\)'`" = X001; then - as_expr=expr -else - as_expr=false -fi - -if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then - as_basename=basename -else - as_basename=false -fi - -if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then - as_dirname=dirname -else - as_dirname=false -fi - -as_me=`$as_basename -- "$0" || -$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ - X"$0" : 'X\(//\)$' \| \ - X"$0" : 'X\(/\)' \| . 2>/dev/null || -$as_echo X/"$0" | - sed '/^.*\/\([^/][^/]*\)\/*$/{ - s//\1/ - q - } - /^X\/\(\/\/\)$/{ - s//\1/ - q - } - /^X\/\(\/\).*/{ - s//\1/ - q - } - s/.*/./; q'` - -# Avoid depending upon Character Ranges. -as_cr_letters='abcdefghijklmnopqrstuvwxyz' -as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' -as_cr_Letters=$as_cr_letters$as_cr_LETTERS -as_cr_digits='0123456789' -as_cr_alnum=$as_cr_Letters$as_cr_digits - - - as_lineno_1=$LINENO as_lineno_1a=$LINENO - as_lineno_2=$LINENO as_lineno_2a=$LINENO - eval 'test "x$as_lineno_1'$as_run'" != "x$as_lineno_2'$as_run'" && - test "x`expr $as_lineno_1'$as_run' + 1`" = "x$as_lineno_2'$as_run'"' || { - # Blame Lee E. McMahon (1931-1989) for sed's syntax. :-) - sed -n ' - p - /[$]LINENO/= - ' <$as_myself | - sed ' - s/[$]LINENO.*/&-/ - t lineno - b - :lineno - N - :loop - s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/ - t loop - s/-\n.*// - ' >$as_me.lineno && - chmod +x "$as_me.lineno" || - { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; } - - # If we had to re-execute with $CONFIG_SHELL, we're ensured to have - # already done that, so ensure we don't try to do so again and fall - # in an infinite loop. This has already happened in practice. - _as_can_reexec=no; export _as_can_reexec - # Don't try to exec as it changes $[0], causing all sort of problems - # (the dirname of $[0] is not the place where we might find the - # original and so on. Autoconf is especially sensitive to this). - . "./$as_me.lineno" - # Exit status is that of the last command. - exit -} - -ECHO_C= ECHO_N= ECHO_T= -case `echo -n x` in @%:@((((( --n*) - case `echo 'xy\c'` in - *c*) ECHO_T=' ';; # ECHO_T is single tab character. - xy) ECHO_C='\c';; - *) echo `echo ksh88 bug on AIX 6.1` > /dev/null - ECHO_T=' ';; - esac;; -*) - ECHO_N='-n';; -esac - -rm -f conf$$ conf$$.exe conf$$.file -if test -d conf$$.dir; then - rm -f conf$$.dir/conf$$.file -else - rm -f conf$$.dir - mkdir conf$$.dir 2>/dev/null -fi -if (echo >conf$$.file) 2>/dev/null; then - if ln -s conf$$.file conf$$ 2>/dev/null; then - as_ln_s='ln -s' - # ... but there are two gotchas: - # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. - # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. - # In both cases, we have to default to `cp -pR'. - ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || - as_ln_s='cp -pR' - elif ln conf$$.file conf$$ 2>/dev/null; then - as_ln_s=ln - else - as_ln_s='cp -pR' - fi -else - as_ln_s='cp -pR' -fi -rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file -rmdir conf$$.dir 2>/dev/null - -if mkdir -p . 2>/dev/null; then - as_mkdir_p='mkdir -p "$as_dir"' -else - test -d ./-p && rmdir ./-p - as_mkdir_p=false -fi - -as_test_x='test -x' -as_executable_p=as_fn_executable_p - -# Sed expression to map a string onto a valid CPP name. -as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" - -# Sed expression to map a string onto a valid variable name. -as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" - -SHELL=${CONFIG_SHELL-/bin/sh} - - -test -n "$DJDIR" || exec 7<&0 &1 - -# Name of the host. -# hostname on some systems (SVR3.2, old GNU/Linux) returns a bogus exit status, -# so uname gets run too. -ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q` - -# -# Initializations. -# -ac_default_prefix=/usr/local -ac_clean_files= -ac_config_libobj_dir=. -LIB@&t@OBJS= -cross_compiling=no -subdirs= -MFLAGS= -MAKEFLAGS= - -# Identity of this package. -PACKAGE_NAME='zookeeper C client' -PACKAGE_TARNAME='zookeeper' -PACKAGE_VERSION='3.4.5' -PACKAGE_STRING='zookeeper C client 3.4.5' -PACKAGE_BUGREPORT='user@zookeeper.apache.org' -PACKAGE_URL='' - -ac_unique_file="src/zookeeper.c" -# Factoring default headers for most tests. -ac_includes_default="\ -#include -#ifdef HAVE_SYS_TYPES_H -# include -#endif -#ifdef HAVE_SYS_STAT_H -# include -#endif -#ifdef STDC_HEADERS -# include -# include -#else -# ifdef HAVE_STDLIB_H -# include -# endif -#endif -#ifdef HAVE_STRING_H -# if !defined STDC_HEADERS && defined HAVE_MEMORY_H -# include -# endif -# include -#endif -#ifdef HAVE_STRINGS_H -# include -#endif -#ifdef HAVE_INTTYPES_H -# include -#endif -#ifdef HAVE_STDINT_H -# include -#endif -#ifdef HAVE_UNISTD_H -# include -#endif" - -ac_subst_vars='am__EXEEXT_FALSE -am__EXEEXT_TRUE -LTLIBOBJS -LIB@&t@OBJS -USEIPV6 -WANT_SYNCAPI_FALSE -WANT_SYNCAPI_TRUE -CXXCPP -CPP -OTOOL64 -OTOOL -LIPO -NMEDIT -DSYMUTIL -MANIFEST_TOOL -RANLIB -ac_ct_AR -AR -DLLTOOL -OBJDUMP -NM -ac_ct_DUMPBIN -DUMPBIN -LD -FGREP -EGREP -GREP -SED -host_os -host_vendor -host_cpu -host -build_os -build_vendor -build_cpu -build -LIBTOOL -LN_S -am__fastdepCXX_FALSE -am__fastdepCXX_TRUE -CXXDEPMODE -ac_ct_CXX -CXXFLAGS -CXX -am__fastdepCC_FALSE -am__fastdepCC_TRUE -CCDEPMODE -am__nodep -AMDEPBACKSLASH -AMDEP_FALSE -AMDEP_TRUE -am__quote -am__include -DEPDIR -OBJEXT -EXEEXT -ac_ct_CC -CPPFLAGS -LDFLAGS -CFLAGS -CC -CPPUNIT_CFLAGS -am__untar -am__tar -AMTAR -am__leading_dot -SET_MAKE -AWK -mkdir_p -MKDIR_P -INSTALL_STRIP_PROGRAM -STRIP -install_sh -MAKEINFO -AUTOHEADER -AUTOMAKE -AUTOCONF -ACLOCAL -VERSION -PACKAGE -CYGPATH_W -am__isrc -INSTALL_DATA -INSTALL_SCRIPT -INSTALL_PROGRAM -DOXYGEN_PAPER_SIZE -DX_COND_latex_FALSE -DX_COND_latex_TRUE -DX_COND_pdf_FALSE -DX_COND_pdf_TRUE -DX_PDFLATEX -DX_FLAG_pdf -DX_COND_ps_FALSE -DX_COND_ps_TRUE -DX_EGREP -DX_DVIPS -DX_MAKEINDEX -DX_LATEX -DX_FLAG_ps -DX_COND_html_FALSE -DX_COND_html_TRUE -DX_FLAG_html -DX_COND_chi_FALSE -DX_COND_chi_TRUE -DX_FLAG_chi -DX_COND_chm_FALSE -DX_COND_chm_TRUE -DX_HHC -DX_FLAG_chm -DX_COND_xml_FALSE -DX_COND_xml_TRUE -DX_FLAG_xml -DX_COND_rtf_FALSE -DX_COND_rtf_TRUE -DX_FLAG_rtf -DX_COND_man_FALSE -DX_COND_man_TRUE -DX_FLAG_man -DX_COND_dot_FALSE -DX_COND_dot_TRUE -DX_DOT -DX_FLAG_dot -DX_COND_doc_FALSE -DX_COND_doc_TRUE -DX_PERL -DX_DOXYGEN -DX_FLAG_doc -DX_ENV -DX_DOCDIR -DX_CONFIG -DX_PROJECT -target_alias -host_alias -build_alias -LIBS -ECHO_T -ECHO_N -ECHO_C -DEFS -mandir -localedir -libdir -psdir -pdfdir -dvidir -htmldir -infodir -docdir -oldincludedir -includedir -localstatedir -sharedstatedir -sysconfdir -datadir -datarootdir -libexecdir -sbindir -bindir -program_transform_name -prefix -exec_prefix -PACKAGE_URL -PACKAGE_BUGREPORT -PACKAGE_STRING -PACKAGE_VERSION -PACKAGE_TARNAME -PACKAGE_NAME -PATH_SEPARATOR -SHELL' -ac_subst_files='' -ac_user_opts=' -enable_option_checking -enable_doxygen_doc -enable_doxygen_dot -enable_doxygen_man -enable_doxygen_rtf -enable_doxygen_xml -enable_doxygen_chm -enable_doxygen_chi -enable_doxygen_html -enable_doxygen_ps -enable_doxygen_pdf -with_cppunit -enable_dependency_tracking -enable_shared -enable_static -with_pic -enable_fast_install -with_gnu_ld -with_sysroot -enable_libtool_lock -enable_debug -with_syncapi -' - ac_precious_vars='build_alias -host_alias -target_alias -DOXYGEN_PAPER_SIZE -CC -CFLAGS -LDFLAGS -LIBS -CPPFLAGS -CXX -CXXFLAGS -CCC -CPP -CXXCPP' - - -# Initialize some variables set by options. -ac_init_help= -ac_init_version=false -ac_unrecognized_opts= -ac_unrecognized_sep= -# The variables have the same names as the options, with -# dashes changed to underlines. -cache_file=/dev/null -exec_prefix=NONE -no_create= -no_recursion= -prefix=NONE -program_prefix=NONE -program_suffix=NONE -program_transform_name=s,x,x, -silent= -site= -srcdir= -verbose= -x_includes=NONE -x_libraries=NONE - -# Installation directory options. -# These are left unexpanded so users can "make install exec_prefix=/foo" -# and all the variables that are supposed to be based on exec_prefix -# by default will actually change. -# Use braces instead of parens because sh, perl, etc. also accept them. -# (The list follows the same order as the GNU Coding Standards.) -bindir='${exec_prefix}/bin' -sbindir='${exec_prefix}/sbin' -libexecdir='${exec_prefix}/libexec' -datarootdir='${prefix}/share' -datadir='${datarootdir}' -sysconfdir='${prefix}/etc' -sharedstatedir='${prefix}/com' -localstatedir='${prefix}/var' -includedir='${prefix}/include' -oldincludedir='/usr/include' -docdir='${datarootdir}/doc/${PACKAGE_TARNAME}' -infodir='${datarootdir}/info' -htmldir='${docdir}' -dvidir='${docdir}' -pdfdir='${docdir}' -psdir='${docdir}' -libdir='${exec_prefix}/lib' -localedir='${datarootdir}/locale' -mandir='${datarootdir}/man' - -ac_prev= -ac_dashdash= -for ac_option -do - # If the previous option needs an argument, assign it. - if test -n "$ac_prev"; then - eval $ac_prev=\$ac_option - ac_prev= - continue - fi - - case $ac_option in - *=?*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;; - *=) ac_optarg= ;; - *) ac_optarg=yes ;; - esac - - # Accept the important Cygnus configure options, so we can diagnose typos. - - case $ac_dashdash$ac_option in - --) - ac_dashdash=yes ;; - - -bindir | --bindir | --bindi | --bind | --bin | --bi) - ac_prev=bindir ;; - -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*) - bindir=$ac_optarg ;; - - -build | --build | --buil | --bui | --bu) - ac_prev=build_alias ;; - -build=* | --build=* | --buil=* | --bui=* | --bu=*) - build_alias=$ac_optarg ;; - - -cache-file | --cache-file | --cache-fil | --cache-fi \ - | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c) - ac_prev=cache_file ;; - -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \ - | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*) - cache_file=$ac_optarg ;; - - --config-cache | -C) - cache_file=config.cache ;; - - -datadir | --datadir | --datadi | --datad) - ac_prev=datadir ;; - -datadir=* | --datadir=* | --datadi=* | --datad=*) - datadir=$ac_optarg ;; - - -datarootdir | --datarootdir | --datarootdi | --datarootd | --dataroot \ - | --dataroo | --dataro | --datar) - ac_prev=datarootdir ;; - -datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \ - | --dataroot=* | --dataroo=* | --dataro=* | --datar=*) - datarootdir=$ac_optarg ;; - - -disable-* | --disable-*) - ac_useropt=`expr "x$ac_option" : 'x-*disable-\(.*\)'` - # Reject names that are not valid shell variable names. - expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && - as_fn_error $? "invalid feature name: $ac_useropt" - ac_useropt_orig=$ac_useropt - ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` - case $ac_user_opts in - *" -"enable_$ac_useropt" -"*) ;; - *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--disable-$ac_useropt_orig" - ac_unrecognized_sep=', ';; - esac - eval enable_$ac_useropt=no ;; - - -docdir | --docdir | --docdi | --doc | --do) - ac_prev=docdir ;; - -docdir=* | --docdir=* | --docdi=* | --doc=* | --do=*) - docdir=$ac_optarg ;; - - -dvidir | --dvidir | --dvidi | --dvid | --dvi | --dv) - ac_prev=dvidir ;; - -dvidir=* | --dvidir=* | --dvidi=* | --dvid=* | --dvi=* | --dv=*) - dvidir=$ac_optarg ;; - - -enable-* | --enable-*) - ac_useropt=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'` - # Reject names that are not valid shell variable names. - expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && - as_fn_error $? "invalid feature name: $ac_useropt" - ac_useropt_orig=$ac_useropt - ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` - case $ac_user_opts in - *" -"enable_$ac_useropt" -"*) ;; - *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--enable-$ac_useropt_orig" - ac_unrecognized_sep=', ';; - esac - eval enable_$ac_useropt=\$ac_optarg ;; - - -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \ - | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \ - | --exec | --exe | --ex) - ac_prev=exec_prefix ;; - -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \ - | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \ - | --exec=* | --exe=* | --ex=*) - exec_prefix=$ac_optarg ;; - - -gas | --gas | --ga | --g) - # Obsolete; use --with-gas. - with_gas=yes ;; - - -help | --help | --hel | --he | -h) - ac_init_help=long ;; - -help=r* | --help=r* | --hel=r* | --he=r* | -hr*) - ac_init_help=recursive ;; - -help=s* | --help=s* | --hel=s* | --he=s* | -hs*) - ac_init_help=short ;; - - -host | --host | --hos | --ho) - ac_prev=host_alias ;; - -host=* | --host=* | --hos=* | --ho=*) - host_alias=$ac_optarg ;; - - -htmldir | --htmldir | --htmldi | --htmld | --html | --htm | --ht) - ac_prev=htmldir ;; - -htmldir=* | --htmldir=* | --htmldi=* | --htmld=* | --html=* | --htm=* \ - | --ht=*) - htmldir=$ac_optarg ;; - - -includedir | --includedir | --includedi | --included | --include \ - | --includ | --inclu | --incl | --inc) - ac_prev=includedir ;; - -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \ - | --includ=* | --inclu=* | --incl=* | --inc=*) - includedir=$ac_optarg ;; - - -infodir | --infodir | --infodi | --infod | --info | --inf) - ac_prev=infodir ;; - -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*) - infodir=$ac_optarg ;; - - -libdir | --libdir | --libdi | --libd) - ac_prev=libdir ;; - -libdir=* | --libdir=* | --libdi=* | --libd=*) - libdir=$ac_optarg ;; - - -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \ - | --libexe | --libex | --libe) - ac_prev=libexecdir ;; - -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \ - | --libexe=* | --libex=* | --libe=*) - libexecdir=$ac_optarg ;; - - -localedir | --localedir | --localedi | --localed | --locale) - ac_prev=localedir ;; - -localedir=* | --localedir=* | --localedi=* | --localed=* | --locale=*) - localedir=$ac_optarg ;; - - -localstatedir | --localstatedir | --localstatedi | --localstated \ - | --localstate | --localstat | --localsta | --localst | --locals) - ac_prev=localstatedir ;; - -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \ - | --localstate=* | --localstat=* | --localsta=* | --localst=* | --locals=*) - localstatedir=$ac_optarg ;; - - -mandir | --mandir | --mandi | --mand | --man | --ma | --m) - ac_prev=mandir ;; - -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*) - mandir=$ac_optarg ;; - - -nfp | --nfp | --nf) - # Obsolete; use --without-fp. - with_fp=no ;; - - -no-create | --no-create | --no-creat | --no-crea | --no-cre \ - | --no-cr | --no-c | -n) - no_create=yes ;; - - -no-recursion | --no-recursion | --no-recursio | --no-recursi \ - | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) - no_recursion=yes ;; - - -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \ - | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \ - | --oldin | --oldi | --old | --ol | --o) - ac_prev=oldincludedir ;; - -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \ - | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \ - | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*) - oldincludedir=$ac_optarg ;; - - -prefix | --prefix | --prefi | --pref | --pre | --pr | --p) - ac_prev=prefix ;; - -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*) - prefix=$ac_optarg ;; - - -program-prefix | --program-prefix | --program-prefi | --program-pref \ - | --program-pre | --program-pr | --program-p) - ac_prev=program_prefix ;; - -program-prefix=* | --program-prefix=* | --program-prefi=* \ - | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*) - program_prefix=$ac_optarg ;; - - -program-suffix | --program-suffix | --program-suffi | --program-suff \ - | --program-suf | --program-su | --program-s) - ac_prev=program_suffix ;; - -program-suffix=* | --program-suffix=* | --program-suffi=* \ - | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*) - program_suffix=$ac_optarg ;; - - -program-transform-name | --program-transform-name \ - | --program-transform-nam | --program-transform-na \ - | --program-transform-n | --program-transform- \ - | --program-transform | --program-transfor \ - | --program-transfo | --program-transf \ - | --program-trans | --program-tran \ - | --progr-tra | --program-tr | --program-t) - ac_prev=program_transform_name ;; - -program-transform-name=* | --program-transform-name=* \ - | --program-transform-nam=* | --program-transform-na=* \ - | --program-transform-n=* | --program-transform-=* \ - | --program-transform=* | --program-transfor=* \ - | --program-transfo=* | --program-transf=* \ - | --program-trans=* | --program-tran=* \ - | --progr-tra=* | --program-tr=* | --program-t=*) - program_transform_name=$ac_optarg ;; - - -pdfdir | --pdfdir | --pdfdi | --pdfd | --pdf | --pd) - ac_prev=pdfdir ;; - -pdfdir=* | --pdfdir=* | --pdfdi=* | --pdfd=* | --pdf=* | --pd=*) - pdfdir=$ac_optarg ;; - - -psdir | --psdir | --psdi | --psd | --ps) - ac_prev=psdir ;; - -psdir=* | --psdir=* | --psdi=* | --psd=* | --ps=*) - psdir=$ac_optarg ;; - - -q | -quiet | --quiet | --quie | --qui | --qu | --q \ - | -silent | --silent | --silen | --sile | --sil) - silent=yes ;; - - -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb) - ac_prev=sbindir ;; - -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \ - | --sbi=* | --sb=*) - sbindir=$ac_optarg ;; - - -sharedstatedir | --sharedstatedir | --sharedstatedi \ - | --sharedstated | --sharedstate | --sharedstat | --sharedsta \ - | --sharedst | --shareds | --shared | --share | --shar \ - | --sha | --sh) - ac_prev=sharedstatedir ;; - -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \ - | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \ - | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \ - | --sha=* | --sh=*) - sharedstatedir=$ac_optarg ;; - - -site | --site | --sit) - ac_prev=site ;; - -site=* | --site=* | --sit=*) - site=$ac_optarg ;; - - -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) - ac_prev=srcdir ;; - -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) - srcdir=$ac_optarg ;; - - -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \ - | --syscon | --sysco | --sysc | --sys | --sy) - ac_prev=sysconfdir ;; - -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \ - | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*) - sysconfdir=$ac_optarg ;; - - -target | --target | --targe | --targ | --tar | --ta | --t) - ac_prev=target_alias ;; - -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*) - target_alias=$ac_optarg ;; - - -v | -verbose | --verbose | --verbos | --verbo | --verb) - verbose=yes ;; - - -version | --version | --versio | --versi | --vers | -V) - ac_init_version=: ;; - - -with-* | --with-*) - ac_useropt=`expr "x$ac_option" : 'x-*with-\([^=]*\)'` - # Reject names that are not valid shell variable names. - expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && - as_fn_error $? "invalid package name: $ac_useropt" - ac_useropt_orig=$ac_useropt - ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` - case $ac_user_opts in - *" -"with_$ac_useropt" -"*) ;; - *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--with-$ac_useropt_orig" - ac_unrecognized_sep=', ';; - esac - eval with_$ac_useropt=\$ac_optarg ;; - - -without-* | --without-*) - ac_useropt=`expr "x$ac_option" : 'x-*without-\(.*\)'` - # Reject names that are not valid shell variable names. - expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && - as_fn_error $? "invalid package name: $ac_useropt" - ac_useropt_orig=$ac_useropt - ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` - case $ac_user_opts in - *" -"with_$ac_useropt" -"*) ;; - *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--without-$ac_useropt_orig" - ac_unrecognized_sep=', ';; - esac - eval with_$ac_useropt=no ;; - - --x) - # Obsolete; use --with-x. - with_x=yes ;; - - -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \ - | --x-incl | --x-inc | --x-in | --x-i) - ac_prev=x_includes ;; - -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \ - | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*) - x_includes=$ac_optarg ;; - - -x-libraries | --x-libraries | --x-librarie | --x-librari \ - | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l) - ac_prev=x_libraries ;; - -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \ - | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*) - x_libraries=$ac_optarg ;; - - -*) as_fn_error $? "unrecognized option: \`$ac_option' -Try \`$0 --help' for more information" - ;; - - *=*) - ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='` - # Reject names that are not valid shell variable names. - case $ac_envvar in #( - '' | [0-9]* | *[!_$as_cr_alnum]* ) - as_fn_error $? "invalid variable name: \`$ac_envvar'" ;; - esac - eval $ac_envvar=\$ac_optarg - export $ac_envvar ;; - - *) - # FIXME: should be removed in autoconf 3.0. - $as_echo "$as_me: WARNING: you should use --build, --host, --target" >&2 - expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null && - $as_echo "$as_me: WARNING: invalid host type: $ac_option" >&2 - : "${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}" - ;; - - esac -done - -if test -n "$ac_prev"; then - ac_option=--`echo $ac_prev | sed 's/_/-/g'` - as_fn_error $? "missing argument to $ac_option" -fi - -if test -n "$ac_unrecognized_opts"; then - case $enable_option_checking in - no) ;; - fatal) as_fn_error $? "unrecognized options: $ac_unrecognized_opts" ;; - *) $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 ;; - esac -fi - -# Check all directory arguments for consistency. -for ac_var in exec_prefix prefix bindir sbindir libexecdir datarootdir \ - datadir sysconfdir sharedstatedir localstatedir includedir \ - oldincludedir docdir infodir htmldir dvidir pdfdir psdir \ - libdir localedir mandir -do - eval ac_val=\$$ac_var - # Remove trailing slashes. - case $ac_val in - */ ) - ac_val=`expr "X$ac_val" : 'X\(.*[^/]\)' \| "X$ac_val" : 'X\(.*\)'` - eval $ac_var=\$ac_val;; - esac - # Be sure to have absolute directory names. - case $ac_val in - [\\/$]* | ?:[\\/]* ) continue;; - NONE | '' ) case $ac_var in *prefix ) continue;; esac;; - esac - as_fn_error $? "expected an absolute directory name for --$ac_var: $ac_val" -done - -# There might be people who depend on the old broken behavior: `$host' -# used to hold the argument of --host etc. -# FIXME: To remove some day. -build=$build_alias -host=$host_alias -target=$target_alias - -# FIXME: To remove some day. -if test "x$host_alias" != x; then - if test "x$build_alias" = x; then - cross_compiling=maybe - elif test "x$build_alias" != "x$host_alias"; then - cross_compiling=yes - fi -fi - -ac_tool_prefix= -test -n "$host_alias" && ac_tool_prefix=$host_alias- - -test "$silent" = yes && exec 6>/dev/null - - -ac_pwd=`pwd` && test -n "$ac_pwd" && -ac_ls_di=`ls -di .` && -ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` || - as_fn_error $? "working directory cannot be determined" -test "X$ac_ls_di" = "X$ac_pwd_ls_di" || - as_fn_error $? "pwd does not report name of working directory" - - -# Find the source files, if location was not specified. -if test -z "$srcdir"; then - ac_srcdir_defaulted=yes - # Try the directory containing this script, then the parent directory. - ac_confdir=`$as_dirname -- "$as_myself" || -$as_expr X"$as_myself" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ - X"$as_myself" : 'X\(//\)[^/]' \| \ - X"$as_myself" : 'X\(//\)$' \| \ - X"$as_myself" : 'X\(/\)' \| . 2>/dev/null || -$as_echo X"$as_myself" | - sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ - s//\1/ - q - } - /^X\(\/\/\)[^/].*/{ - s//\1/ - q - } - /^X\(\/\/\)$/{ - s//\1/ - q - } - /^X\(\/\).*/{ - s//\1/ - q - } - s/.*/./; q'` - srcdir=$ac_confdir - if test ! -r "$srcdir/$ac_unique_file"; then - srcdir=.. - fi -else - ac_srcdir_defaulted=no -fi -if test ! -r "$srcdir/$ac_unique_file"; then - test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .." - as_fn_error $? "cannot find sources ($ac_unique_file) in $srcdir" -fi -ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work" -ac_abs_confdir=`( - cd "$srcdir" && test -r "./$ac_unique_file" || as_fn_error $? "$ac_msg" - pwd)` -# When building in place, set srcdir=. -if test "$ac_abs_confdir" = "$ac_pwd"; then - srcdir=. -fi -# Remove unnecessary trailing slashes from srcdir. -# Double slashes in file names in object file debugging info -# mess up M-x gdb in Emacs. -case $srcdir in -*/) srcdir=`expr "X$srcdir" : 'X\(.*[^/]\)' \| "X$srcdir" : 'X\(.*\)'`;; -esac -for ac_var in $ac_precious_vars; do - eval ac_env_${ac_var}_set=\${${ac_var}+set} - eval ac_env_${ac_var}_value=\$${ac_var} - eval ac_cv_env_${ac_var}_set=\${${ac_var}+set} - eval ac_cv_env_${ac_var}_value=\$${ac_var} -done - -# -# Report the --help message. -# -if test "$ac_init_help" = "long"; then - # Omit some internal or obsolete options to make the list less imposing. - # This message is too long to be a string in the A/UX 3.1 sh. - cat <<_ACEOF -\`configure' configures zookeeper C client 3.4.5 to adapt to many kinds of systems. - -Usage: $0 [OPTION]... [VAR=VALUE]... - -To assign environment variables (e.g., CC, CFLAGS...), specify them as -VAR=VALUE. See below for descriptions of some of the useful variables. - -Defaults for the options are specified in brackets. - -Configuration: - -h, --help display this help and exit - --help=short display options specific to this package - --help=recursive display the short help of all the included packages - -V, --version display version information and exit - -q, --quiet, --silent do not print \`checking ...' messages - --cache-file=FILE cache test results in FILE [disabled] - -C, --config-cache alias for \`--cache-file=config.cache' - -n, --no-create do not create output files - --srcdir=DIR find the sources in DIR [configure dir or \`..'] - -Installation directories: - --prefix=PREFIX install architecture-independent files in PREFIX - @<:@@S|@ac_default_prefix@:>@ - --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX - @<:@PREFIX@:>@ - -By default, \`make install' will install all the files in -\`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc. You can specify -an installation prefix other than \`$ac_default_prefix' using \`--prefix', -for instance \`--prefix=\$HOME'. - -For better control, use the options below. - -Fine tuning of the installation directories: - --bindir=DIR user executables [EPREFIX/bin] - --sbindir=DIR system admin executables [EPREFIX/sbin] - --libexecdir=DIR program executables [EPREFIX/libexec] - --sysconfdir=DIR read-only single-machine data [PREFIX/etc] - --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com] - --localstatedir=DIR modifiable single-machine data [PREFIX/var] - --libdir=DIR object code libraries [EPREFIX/lib] - --includedir=DIR C header files [PREFIX/include] - --oldincludedir=DIR C header files for non-gcc [/usr/include] - --datarootdir=DIR read-only arch.-independent data root [PREFIX/share] - --datadir=DIR read-only architecture-independent data [DATAROOTDIR] - --infodir=DIR info documentation [DATAROOTDIR/info] - --localedir=DIR locale-dependent data [DATAROOTDIR/locale] - --mandir=DIR man documentation [DATAROOTDIR/man] - --docdir=DIR documentation root @<:@DATAROOTDIR/doc/zookeeper@:>@ - --htmldir=DIR html documentation [DOCDIR] - --dvidir=DIR dvi documentation [DOCDIR] - --pdfdir=DIR pdf documentation [DOCDIR] - --psdir=DIR ps documentation [DOCDIR] -_ACEOF - - cat <<\_ACEOF - -Program names: - --program-prefix=PREFIX prepend PREFIX to installed program names - --program-suffix=SUFFIX append SUFFIX to installed program names - --program-transform-name=PROGRAM run sed PROGRAM on installed program names - -System types: - --build=BUILD configure for building on BUILD [guessed] - --host=HOST cross-compile to build programs to run on HOST [BUILD] -_ACEOF -fi - -if test -n "$ac_init_help"; then - case $ac_init_help in - short | recursive ) echo "Configuration of zookeeper C client 3.4.5:";; - esac - cat <<\_ACEOF - -Optional Features: - --disable-option-checking ignore unrecognized --enable/--with options - --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) - --enable-FEATURE[=ARG] include FEATURE [ARG=yes] - --disable-doxygen-doc don't generate any doxygen documentation - --disable-doxygen-dot don't generate graphics for doxygen documentation - --enable-doxygen-man generate doxygen manual pages - --enable-doxygen-rtf generate doxygen RTF documentation - --enable-doxygen-xml generate doxygen XML documentation - --enable-doxygen-chm generate doxygen compressed HTML help documentation - --enable-doxygen-chi generate doxygen seperate compressed HTML help index - file - --disable-doxygen-html don't generate doxygen plain HTML documentation - --enable-doxygen-ps generate doxygen PostScript documentation - --enable-doxygen-pdf generate doxygen PDF documentation - --disable-dependency-tracking speeds up one-time build - --enable-dependency-tracking do not reject slow dependency extractors - --enable-shared@<:@=PKGS@:>@ build shared libraries @<:@default=yes@:>@ - --enable-static@<:@=PKGS@:>@ build static libraries @<:@default=yes@:>@ - --enable-fast-install@<:@=PKGS@:>@ - optimize for fast installation @<:@default=yes@:>@ - --disable-libtool-lock avoid locking (might break parallel builds) - --enable-debug enable debug build @<:@default=no@:>@ - -Optional Packages: - --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] - --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) - --without-cppunit do not use CPPUNIT - --with-pic@<:@=PKGS@:>@ try to use only PIC/non-PIC objects @<:@default=use - both@:>@ - --with-gnu-ld assume the C compiler uses GNU ld @<:@default=no@:>@ - --with-sysroot=DIR Search for dependent libraries within DIR - (or the compiler's sysroot if not specified). - --with-syncapi build with support for SyncAPI @<:@default=yes@:>@ - -Some influential environment variables: - DOXYGEN_PAPER_SIZE - a4wide (default), a4, letter, legal or executive - CC C compiler command - CFLAGS C compiler flags - LDFLAGS linker flags, e.g. -L if you have libraries in a - nonstandard directory - LIBS libraries to pass to the linker, e.g. -l - CPPFLAGS (Objective) C/C++ preprocessor flags, e.g. -I if - you have headers in a nonstandard directory - CXX C++ compiler command - CXXFLAGS C++ compiler flags - CPP C preprocessor - CXXCPP C++ preprocessor - -Use these variables to override the choices made by `configure' or to help -it to find libraries and programs with nonstandard names/locations. - -Report bugs to . -_ACEOF -ac_status=$? -fi - -if test "$ac_init_help" = "recursive"; then - # If there are subdirs, report their specific --help. - for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue - test -d "$ac_dir" || - { cd "$srcdir" && ac_pwd=`pwd` && srcdir=. && test -d "$ac_dir"; } || - continue - ac_builddir=. - -case "$ac_dir" in -.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; -*) - ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` - # A ".." for each directory in $ac_dir_suffix. - ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` - case $ac_top_builddir_sub in - "") ac_top_builddir_sub=. ac_top_build_prefix= ;; - *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; - esac ;; -esac -ac_abs_top_builddir=$ac_pwd -ac_abs_builddir=$ac_pwd$ac_dir_suffix -# for backward compatibility: -ac_top_builddir=$ac_top_build_prefix - -case $srcdir in - .) # We are building in place. - ac_srcdir=. - ac_top_srcdir=$ac_top_builddir_sub - ac_abs_top_srcdir=$ac_pwd ;; - [\\/]* | ?:[\\/]* ) # Absolute name. - ac_srcdir=$srcdir$ac_dir_suffix; - ac_top_srcdir=$srcdir - ac_abs_top_srcdir=$srcdir ;; - *) # Relative name. - ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix - ac_top_srcdir=$ac_top_build_prefix$srcdir - ac_abs_top_srcdir=$ac_pwd/$srcdir ;; -esac -ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix - - cd "$ac_dir" || { ac_status=$?; continue; } - # Check for guested configure. - if test -f "$ac_srcdir/configure.gnu"; then - echo && - $SHELL "$ac_srcdir/configure.gnu" --help=recursive - elif test -f "$ac_srcdir/configure"; then - echo && - $SHELL "$ac_srcdir/configure" --help=recursive - else - $as_echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2 - fi || ac_status=$? - cd "$ac_pwd" || { ac_status=$?; break; } - done -fi - -test -n "$ac_init_help" && exit $ac_status -if $ac_init_version; then - cat <<\_ACEOF -zookeeper C client configure 3.4.5 -generated by GNU Autoconf 2.69 - -Copyright (C) 2012 Free Software Foundation, Inc. -This configure script is free software; the Free Software Foundation -gives unlimited permission to copy, distribute and modify it. -_ACEOF - exit -fi - -## ------------------------ ## -## Autoconf initialization. ## -## ------------------------ ## - -@%:@ ac_fn_c_try_compile LINENO -@%:@ -------------------------- -@%:@ Try to compile conftest.@S|@ac_ext, and return whether this succeeded. -ac_fn_c_try_compile () -{ - as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack - rm -f conftest.$ac_objext - if { { ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 - (eval "$ac_compile") 2>conftest.err - ac_status=$? - if test -s conftest.err; then - grep -v '^ *+' conftest.err >conftest.er1 - cat conftest.er1 >&5 - mv -f conftest.er1 conftest.err - fi - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then : - ac_retval=0 -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_retval=1 -fi - eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno - as_fn_set_status $ac_retval - -} @%:@ ac_fn_c_try_compile - -@%:@ ac_fn_cxx_try_compile LINENO -@%:@ ---------------------------- -@%:@ Try to compile conftest.@S|@ac_ext, and return whether this succeeded. -ac_fn_cxx_try_compile () -{ - as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack - rm -f conftest.$ac_objext - if { { ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 - (eval "$ac_compile") 2>conftest.err - ac_status=$? - if test -s conftest.err; then - grep -v '^ *+' conftest.err >conftest.er1 - cat conftest.er1 >&5 - mv -f conftest.er1 conftest.err - fi - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } && { - test -z "$ac_cxx_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then : - ac_retval=0 -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_retval=1 -fi - eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno - as_fn_set_status $ac_retval - -} @%:@ ac_fn_cxx_try_compile - -@%:@ ac_fn_c_try_link LINENO -@%:@ ----------------------- -@%:@ Try to link conftest.@S|@ac_ext, and return whether this succeeded. -ac_fn_c_try_link () -{ - as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack - rm -f conftest.$ac_objext conftest$ac_exeext - if { { ac_try="$ac_link" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 - (eval "$ac_link") 2>conftest.err - ac_status=$? - if test -s conftest.err; then - grep -v '^ *+' conftest.err >conftest.er1 - cat conftest.er1 >&5 - mv -f conftest.er1 conftest.err - fi - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest$ac_exeext && { - test "$cross_compiling" = yes || - test -x conftest$ac_exeext - }; then : - ac_retval=0 -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_retval=1 -fi - # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information - # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would - # interfere with the next link command; also delete a directory that is - # left behind by Apple's compiler. We do this before executing the actions. - rm -rf conftest.dSYM conftest_ipa8_conftest.oo - eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno - as_fn_set_status $ac_retval - -} @%:@ ac_fn_c_try_link - -@%:@ ac_fn_c_check_header_compile LINENO HEADER VAR INCLUDES -@%:@ ------------------------------------------------------- -@%:@ Tests whether HEADER exists and can be compiled using the include files in -@%:@ INCLUDES, setting the cache variable VAR accordingly. -ac_fn_c_check_header_compile () -{ - as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 -$as_echo_n "checking for $2... " >&6; } -if eval \${$3+:} false; then : - $as_echo_n "(cached) " >&6 -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -$4 -@%:@include <$2> -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - eval "$3=yes" -else - eval "$3=no" -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -fi -eval ac_res=\$$3 - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 -$as_echo "$ac_res" >&6; } - eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno - -} @%:@ ac_fn_c_check_header_compile - -@%:@ ac_fn_c_try_cpp LINENO -@%:@ ---------------------- -@%:@ Try to preprocess conftest.@S|@ac_ext, and return whether this succeeded. -ac_fn_c_try_cpp () -{ - as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack - if { { ac_try="$ac_cpp conftest.$ac_ext" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 - (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err - ac_status=$? - if test -s conftest.err; then - grep -v '^ *+' conftest.err >conftest.er1 - cat conftest.er1 >&5 - mv -f conftest.er1 conftest.err - fi - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } > conftest.i && { - test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || - test ! -s conftest.err - }; then : - ac_retval=0 -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_retval=1 -fi - eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno - as_fn_set_status $ac_retval - -} @%:@ ac_fn_c_try_cpp - -@%:@ ac_fn_c_try_run LINENO -@%:@ ---------------------- -@%:@ Try to link conftest.@S|@ac_ext, and return whether this succeeded. Assumes -@%:@ that executables *can* be run. -ac_fn_c_try_run () -{ - as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack - if { { ac_try="$ac_link" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 - (eval "$ac_link") 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } && { ac_try='./conftest$ac_exeext' - { { case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 - (eval "$ac_try") 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; }; }; then : - ac_retval=0 -else - $as_echo "$as_me: program exited with status $ac_status" >&5 - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_retval=$ac_status -fi - rm -rf conftest.dSYM conftest_ipa8_conftest.oo - eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno - as_fn_set_status $ac_retval - -} @%:@ ac_fn_c_try_run - -@%:@ ac_fn_c_check_func LINENO FUNC VAR -@%:@ ---------------------------------- -@%:@ Tests whether FUNC exists, setting the cache variable VAR accordingly -ac_fn_c_check_func () -{ - as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 -$as_echo_n "checking for $2... " >&6; } -if eval \${$3+:} false; then : - $as_echo_n "(cached) " >&6 -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -/* Define $2 to an innocuous variant, in case declares $2. - For example, HP-UX 11i declares gettimeofday. */ -#define $2 innocuous_$2 - -/* System header to define __stub macros and hopefully few prototypes, - which can conflict with char $2 (); below. - Prefer to if __STDC__ is defined, since - exists even on freestanding compilers. */ - -#ifdef __STDC__ -# include -#else -# include -#endif - -#undef $2 - -/* Override any GCC internal prototype to avoid an error. - Use char because int might match the return type of a GCC - builtin and then its argument prototype would still apply. */ -#ifdef __cplusplus -extern "C" -#endif -char $2 (); -/* The GNU C library defines this for functions which it implements - to always fail with ENOSYS. Some functions are actually named - something starting with __ and the normal name is an alias. */ -#if defined __stub_$2 || defined __stub___$2 -choke me -#endif - -int -main () -{ -return $2 (); - ; - return 0; -} -_ACEOF -if ac_fn_c_try_link "$LINENO"; then : - eval "$3=yes" -else - eval "$3=no" -fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext -fi -eval ac_res=\$$3 - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 -$as_echo "$ac_res" >&6; } - eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno - -} @%:@ ac_fn_c_check_func - -@%:@ ac_fn_cxx_try_cpp LINENO -@%:@ ------------------------ -@%:@ Try to preprocess conftest.@S|@ac_ext, and return whether this succeeded. -ac_fn_cxx_try_cpp () -{ - as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack - if { { ac_try="$ac_cpp conftest.$ac_ext" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 - (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err - ac_status=$? - if test -s conftest.err; then - grep -v '^ *+' conftest.err >conftest.er1 - cat conftest.er1 >&5 - mv -f conftest.er1 conftest.err - fi - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } > conftest.i && { - test -z "$ac_cxx_preproc_warn_flag$ac_cxx_werror_flag" || - test ! -s conftest.err - }; then : - ac_retval=0 -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_retval=1 -fi - eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno - as_fn_set_status $ac_retval - -} @%:@ ac_fn_cxx_try_cpp - -@%:@ ac_fn_cxx_try_link LINENO -@%:@ ------------------------- -@%:@ Try to link conftest.@S|@ac_ext, and return whether this succeeded. -ac_fn_cxx_try_link () -{ - as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack - rm -f conftest.$ac_objext conftest$ac_exeext - if { { ac_try="$ac_link" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 - (eval "$ac_link") 2>conftest.err - ac_status=$? - if test -s conftest.err; then - grep -v '^ *+' conftest.err >conftest.er1 - cat conftest.er1 >&5 - mv -f conftest.er1 conftest.err - fi - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } && { - test -z "$ac_cxx_werror_flag" || - test ! -s conftest.err - } && test -s conftest$ac_exeext && { - test "$cross_compiling" = yes || - test -x conftest$ac_exeext - }; then : - ac_retval=0 -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_retval=1 -fi - # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information - # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would - # interfere with the next link command; also delete a directory that is - # left behind by Apple's compiler. We do this before executing the actions. - rm -rf conftest.dSYM conftest_ipa8_conftest.oo - eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno - as_fn_set_status $ac_retval - -} @%:@ ac_fn_cxx_try_link - -@%:@ ac_fn_c_check_header_mongrel LINENO HEADER VAR INCLUDES -@%:@ ------------------------------------------------------- -@%:@ Tests whether HEADER exists, giving a warning if it cannot be compiled using -@%:@ the include files in INCLUDES and setting the cache variable VAR -@%:@ accordingly. -ac_fn_c_check_header_mongrel () -{ - as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack - if eval \${$3+:} false; then : - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 -$as_echo_n "checking for $2... " >&6; } -if eval \${$3+:} false; then : - $as_echo_n "(cached) " >&6 -fi -eval ac_res=\$$3 - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 -$as_echo "$ac_res" >&6; } -else - # Is the header compilable? -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 usability" >&5 -$as_echo_n "checking $2 usability... " >&6; } -cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -$4 -@%:@include <$2> -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - ac_header_compiler=yes -else - ac_header_compiler=no -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_compiler" >&5 -$as_echo "$ac_header_compiler" >&6; } - -# Is the header present? -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 presence" >&5 -$as_echo_n "checking $2 presence... " >&6; } -cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -@%:@include <$2> -_ACEOF -if ac_fn_c_try_cpp "$LINENO"; then : - ac_header_preproc=yes -else - ac_header_preproc=no -fi -rm -f conftest.err conftest.i conftest.$ac_ext -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_preproc" >&5 -$as_echo "$ac_header_preproc" >&6; } - -# So? What about this header? -case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in #(( - yes:no: ) - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&5 -$as_echo "$as_me: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&2;} - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 -$as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} - ;; - no:yes:* ) - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: present but cannot be compiled" >&5 -$as_echo "$as_me: WARNING: $2: present but cannot be compiled" >&2;} - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: check for missing prerequisite headers?" >&5 -$as_echo "$as_me: WARNING: $2: check for missing prerequisite headers?" >&2;} - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: see the Autoconf documentation" >&5 -$as_echo "$as_me: WARNING: $2: see the Autoconf documentation" >&2;} - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&5 -$as_echo "$as_me: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&2;} - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 -$as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} -( $as_echo "## ---------------------------------------- ## -## Report this to user@zookeeper.apache.org ## -## ---------------------------------------- ##" - ) | sed "s/^/$as_me: WARNING: /" >&2 - ;; -esac - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 -$as_echo_n "checking for $2... " >&6; } -if eval \${$3+:} false; then : - $as_echo_n "(cached) " >&6 -else - eval "$3=\$ac_header_compiler" -fi -eval ac_res=\$$3 - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 -$as_echo "$ac_res" >&6; } -fi - eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno - -} @%:@ ac_fn_c_check_header_mongrel - -@%:@ ac_fn_c_check_type LINENO TYPE VAR INCLUDES -@%:@ ------------------------------------------- -@%:@ Tests whether TYPE exists after having included INCLUDES, setting cache -@%:@ variable VAR accordingly. -ac_fn_c_check_type () -{ - as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 -$as_echo_n "checking for $2... " >&6; } -if eval \${$3+:} false; then : - $as_echo_n "(cached) " >&6 -else - eval "$3=no" - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -$4 -int -main () -{ -if (sizeof ($2)) - return 0; - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -$4 -int -main () -{ -if (sizeof (($2))) - return 0; - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - -else - eval "$3=yes" -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -fi -eval ac_res=\$$3 - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 -$as_echo "$ac_res" >&6; } - eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno - -} @%:@ ac_fn_c_check_type -cat >config.log <<_ACEOF -This file contains any messages produced by compilers while -running configure, to aid debugging if configure makes a mistake. - -It was created by zookeeper C client $as_me 3.4.5, which was -generated by GNU Autoconf 2.69. Invocation command line was - - $ $0 $@ - -_ACEOF -exec 5>>config.log -{ -cat <<_ASUNAME -## --------- ## -## Platform. ## -## --------- ## - -hostname = `(hostname || uname -n) 2>/dev/null | sed 1q` -uname -m = `(uname -m) 2>/dev/null || echo unknown` -uname -r = `(uname -r) 2>/dev/null || echo unknown` -uname -s = `(uname -s) 2>/dev/null || echo unknown` -uname -v = `(uname -v) 2>/dev/null || echo unknown` - -/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown` -/bin/uname -X = `(/bin/uname -X) 2>/dev/null || echo unknown` - -/bin/arch = `(/bin/arch) 2>/dev/null || echo unknown` -/usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null || echo unknown` -/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown` -/usr/bin/hostinfo = `(/usr/bin/hostinfo) 2>/dev/null || echo unknown` -/bin/machine = `(/bin/machine) 2>/dev/null || echo unknown` -/usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null || echo unknown` -/bin/universe = `(/bin/universe) 2>/dev/null || echo unknown` - -_ASUNAME - -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - $as_echo "PATH: $as_dir" - done -IFS=$as_save_IFS - -} >&5 - -cat >&5 <<_ACEOF - - -## ----------- ## -## Core tests. ## -## ----------- ## - -_ACEOF - - -# Keep a trace of the command line. -# Strip out --no-create and --no-recursion so they do not pile up. -# Strip out --silent because we don't want to record it for future runs. -# Also quote any args containing shell meta-characters. -# Make two passes to allow for proper duplicate-argument suppression. -ac_configure_args= -ac_configure_args0= -ac_configure_args1= -ac_must_keep_next=false -for ac_pass in 1 2 -do - for ac_arg - do - case $ac_arg in - -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;; - -q | -quiet | --quiet | --quie | --qui | --qu | --q \ - | -silent | --silent | --silen | --sile | --sil) - continue ;; - *\'*) - ac_arg=`$as_echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; - esac - case $ac_pass in - 1) as_fn_append ac_configure_args0 " '$ac_arg'" ;; - 2) - as_fn_append ac_configure_args1 " '$ac_arg'" - if test $ac_must_keep_next = true; then - ac_must_keep_next=false # Got value, back to normal. - else - case $ac_arg in - *=* | --config-cache | -C | -disable-* | --disable-* \ - | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \ - | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \ - | -with-* | --with-* | -without-* | --without-* | --x) - case "$ac_configure_args0 " in - "$ac_configure_args1"*" '$ac_arg' "* ) continue ;; - esac - ;; - -* ) ac_must_keep_next=true ;; - esac - fi - as_fn_append ac_configure_args " '$ac_arg'" - ;; - esac - done -done -{ ac_configure_args0=; unset ac_configure_args0;} -{ ac_configure_args1=; unset ac_configure_args1;} - -# When interrupted or exit'd, cleanup temporary files, and complete -# config.log. We remove comments because anyway the quotes in there -# would cause problems or look ugly. -# WARNING: Use '\'' to represent an apostrophe within the trap. -# WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug. -trap 'exit_status=$? - # Save into config.log some information that might help in debugging. - { - echo - - $as_echo "## ---------------- ## -## Cache variables. ## -## ---------------- ##" - echo - # The following way of writing the cache mishandles newlines in values, -( - for ac_var in `(set) 2>&1 | sed -n '\''s/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'\''`; do - eval ac_val=\$$ac_var - case $ac_val in #( - *${as_nl}*) - case $ac_var in #( - *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 -$as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; - esac - case $ac_var in #( - _ | IFS | as_nl) ;; #( - BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( - *) { eval $ac_var=; unset $ac_var;} ;; - esac ;; - esac - done - (set) 2>&1 | - case $as_nl`(ac_space='\'' '\''; set) 2>&1` in #( - *${as_nl}ac_space=\ *) - sed -n \ - "s/'\''/'\''\\\\'\'''\''/g; - s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\''\\2'\''/p" - ;; #( - *) - sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" - ;; - esac | - sort -) - echo - - $as_echo "## ----------------- ## -## Output variables. ## -## ----------------- ##" - echo - for ac_var in $ac_subst_vars - do - eval ac_val=\$$ac_var - case $ac_val in - *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; - esac - $as_echo "$ac_var='\''$ac_val'\''" - done | sort - echo - - if test -n "$ac_subst_files"; then - $as_echo "## ------------------- ## -## File substitutions. ## -## ------------------- ##" - echo - for ac_var in $ac_subst_files - do - eval ac_val=\$$ac_var - case $ac_val in - *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; - esac - $as_echo "$ac_var='\''$ac_val'\''" - done | sort - echo - fi - - if test -s confdefs.h; then - $as_echo "## ----------- ## -## confdefs.h. ## -## ----------- ##" - echo - cat confdefs.h - echo - fi - test "$ac_signal" != 0 && - $as_echo "$as_me: caught signal $ac_signal" - $as_echo "$as_me: exit $exit_status" - } >&5 - rm -f core *.core core.conftest.* && - rm -f -r conftest* confdefs* conf$$* $ac_clean_files && - exit $exit_status -' 0 -for ac_signal in 1 2 13 15; do - trap 'ac_signal='$ac_signal'; as_fn_exit 1' $ac_signal -done -ac_signal=0 - -# confdefs.h avoids OS command line length limits that DEFS can exceed. -rm -f -r conftest* confdefs.h - -$as_echo "/* confdefs.h */" > confdefs.h - -# Predefined preprocessor variables. - -cat >>confdefs.h <<_ACEOF -@%:@define PACKAGE_NAME "$PACKAGE_NAME" -_ACEOF - -cat >>confdefs.h <<_ACEOF -@%:@define PACKAGE_TARNAME "$PACKAGE_TARNAME" -_ACEOF - -cat >>confdefs.h <<_ACEOF -@%:@define PACKAGE_VERSION "$PACKAGE_VERSION" -_ACEOF - -cat >>confdefs.h <<_ACEOF -@%:@define PACKAGE_STRING "$PACKAGE_STRING" -_ACEOF - -cat >>confdefs.h <<_ACEOF -@%:@define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT" -_ACEOF - -cat >>confdefs.h <<_ACEOF -@%:@define PACKAGE_URL "$PACKAGE_URL" -_ACEOF - - -# Let the site file select an alternate cache file if it wants to. -# Prefer an explicitly selected file to automatically selected ones. -ac_site_file1=NONE -ac_site_file2=NONE -if test -n "$CONFIG_SITE"; then - # We do not want a PATH search for config.site. - case $CONFIG_SITE in @%:@(( - -*) ac_site_file1=./$CONFIG_SITE;; - */*) ac_site_file1=$CONFIG_SITE;; - *) ac_site_file1=./$CONFIG_SITE;; - esac -elif test "x$prefix" != xNONE; then - ac_site_file1=$prefix/share/config.site - ac_site_file2=$prefix/etc/config.site -else - ac_site_file1=$ac_default_prefix/share/config.site - ac_site_file2=$ac_default_prefix/etc/config.site -fi -for ac_site_file in "$ac_site_file1" "$ac_site_file2" -do - test "x$ac_site_file" = xNONE && continue - if test /dev/null != "$ac_site_file" && test -r "$ac_site_file"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: loading site script $ac_site_file" >&5 -$as_echo "$as_me: loading site script $ac_site_file" >&6;} - sed 's/^/| /' "$ac_site_file" >&5 - . "$ac_site_file" \ - || { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 -$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} -as_fn_error $? "failed to load site script $ac_site_file -See \`config.log' for more details" "$LINENO" 5; } - fi -done - -if test -r "$cache_file"; then - # Some versions of bash will fail to source /dev/null (special files - # actually), so we avoid doing that. DJGPP emulates it as a regular file. - if test /dev/null != "$cache_file" && test -f "$cache_file"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: loading cache $cache_file" >&5 -$as_echo "$as_me: loading cache $cache_file" >&6;} - case $cache_file in - [\\/]* | ?:[\\/]* ) . "$cache_file";; - *) . "./$cache_file";; - esac - fi -else - { $as_echo "$as_me:${as_lineno-$LINENO}: creating cache $cache_file" >&5 -$as_echo "$as_me: creating cache $cache_file" >&6;} - >$cache_file -fi - -# Check that the precious variables saved in the cache have kept the same -# value. -ac_cache_corrupted=false -for ac_var in $ac_precious_vars; do - eval ac_old_set=\$ac_cv_env_${ac_var}_set - eval ac_new_set=\$ac_env_${ac_var}_set - eval ac_old_val=\$ac_cv_env_${ac_var}_value - eval ac_new_val=\$ac_env_${ac_var}_value - case $ac_old_set,$ac_new_set in - set,) - { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5 -$as_echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;} - ac_cache_corrupted=: ;; - ,set) - { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was not set in the previous run" >&5 -$as_echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;} - ac_cache_corrupted=: ;; - ,);; - *) - if test "x$ac_old_val" != "x$ac_new_val"; then - # differences in whitespace do not lead to failure. - ac_old_val_w=`echo x $ac_old_val` - ac_new_val_w=`echo x $ac_new_val` - if test "$ac_old_val_w" != "$ac_new_val_w"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' has changed since the previous run:" >&5 -$as_echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;} - ac_cache_corrupted=: - else - { $as_echo "$as_me:${as_lineno-$LINENO}: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&5 -$as_echo "$as_me: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&2;} - eval $ac_var=\$ac_old_val - fi - { $as_echo "$as_me:${as_lineno-$LINENO}: former value: \`$ac_old_val'" >&5 -$as_echo "$as_me: former value: \`$ac_old_val'" >&2;} - { $as_echo "$as_me:${as_lineno-$LINENO}: current value: \`$ac_new_val'" >&5 -$as_echo "$as_me: current value: \`$ac_new_val'" >&2;} - fi;; - esac - # Pass precious variables to config.status. - if test "$ac_new_set" = set; then - case $ac_new_val in - *\'*) ac_arg=$ac_var=`$as_echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;; - *) ac_arg=$ac_var=$ac_new_val ;; - esac - case " $ac_configure_args " in - *" '$ac_arg' "*) ;; # Avoid dups. Use of quotes ensures accuracy. - *) as_fn_append ac_configure_args " '$ac_arg'" ;; - esac - fi -done -if $ac_cache_corrupted; then - { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 -$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} - { $as_echo "$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build" >&5 -$as_echo "$as_me: error: changes in the environment can compromise the build" >&2;} - as_fn_error $? "run \`make distclean' and/or \`rm $cache_file' and start over" "$LINENO" 5 -fi -## -------------------- ## -## Main body of script. ## -## -------------------- ## - -ac_ext=c -ac_cpp='$CPP $CPPFLAGS' -ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_c_compiler_gnu - - - - -# Save initial CFLAGS and CXXFLAGS values before AC_PROG_CC and AC_PROG_CXX -init_cflags="$CFLAGS" -init_cxxflags="$CXXFLAGS" - -# initialize Doxygen support - - - - - - - - - - -# Files: -DX_PROJECT=zookeeper - -DX_CONFIG=c-doc.Doxyfile - -DX_DOCDIR=docs - - -# Environment variables used inside doxygen.cfg: -DX_ENV="$DX_ENV SRCDIR='$srcdir'" - -DX_ENV="$DX_ENV PROJECT='$DX_PROJECT'" - -DX_ENV="$DX_ENV DOCDIR='$DX_DOCDIR'" - -DX_ENV="$DX_ENV VERSION='$PACKAGE_VERSION'" - - -# Doxygen itself: - - - - @%:@ Check whether --enable-doxygen-doc was given. -if test "${enable_doxygen_doc+set}" = set; then : - enableval=$enable_doxygen_doc; -case "$enableval" in -#( -y|Y|yes|Yes|YES) - DX_FLAG_doc=1 - - -;; #( -n|N|no|No|NO) - DX_FLAG_doc=0 - -;; #( -*) - as_fn_error $? "invalid value '$enableval' given to doxygen-doc" "$LINENO" 5 -;; -esac - -else - -DX_FLAG_doc=1 - - - -fi - -if test "$DX_FLAG_doc" = 1; then - -if test -n "$ac_tool_prefix"; then - # Extract the first word of "${ac_tool_prefix}doxygen", so it can be a program name with args. -set dummy ${ac_tool_prefix}doxygen; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_path_DX_DOXYGEN+:} false; then : - $as_echo_n "(cached) " >&6 -else - case $DX_DOXYGEN in - [\\/]* | ?:[\\/]*) - ac_cv_path_DX_DOXYGEN="$DX_DOXYGEN" # Let the user override the test with a path. - ;; - *) - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_path_DX_DOXYGEN="$as_dir/$ac_word$ac_exec_ext" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - - ;; -esac -fi -DX_DOXYGEN=$ac_cv_path_DX_DOXYGEN -if test -n "$DX_DOXYGEN"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DX_DOXYGEN" >&5 -$as_echo "$DX_DOXYGEN" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - -fi -if test -z "$ac_cv_path_DX_DOXYGEN"; then - ac_pt_DX_DOXYGEN=$DX_DOXYGEN - # Extract the first word of "doxygen", so it can be a program name with args. -set dummy doxygen; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_path_ac_pt_DX_DOXYGEN+:} false; then : - $as_echo_n "(cached) " >&6 -else - case $ac_pt_DX_DOXYGEN in - [\\/]* | ?:[\\/]*) - ac_cv_path_ac_pt_DX_DOXYGEN="$ac_pt_DX_DOXYGEN" # Let the user override the test with a path. - ;; - *) - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_path_ac_pt_DX_DOXYGEN="$as_dir/$ac_word$ac_exec_ext" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - - ;; -esac -fi -ac_pt_DX_DOXYGEN=$ac_cv_path_ac_pt_DX_DOXYGEN -if test -n "$ac_pt_DX_DOXYGEN"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_pt_DX_DOXYGEN" >&5 -$as_echo "$ac_pt_DX_DOXYGEN" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - if test "x$ac_pt_DX_DOXYGEN" = x; then - DX_DOXYGEN="" - else - case $cross_compiling:$ac_tool_warned in -yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} -ac_tool_warned=yes ;; -esac - DX_DOXYGEN=$ac_pt_DX_DOXYGEN - fi -else - DX_DOXYGEN="$ac_cv_path_DX_DOXYGEN" -fi - -if test "$DX_FLAG_$DX_CURRENT_FEATURE$DX_DOXYGEN" = 1; then - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: doxygen not found - will not generate any doxygen documentation" >&5 -$as_echo "$as_me: WARNING: doxygen not found - will not generate any doxygen documentation" >&2;} - DX_FLAG_doc=0 - -fi - - -if test -n "$ac_tool_prefix"; then - # Extract the first word of "${ac_tool_prefix}perl", so it can be a program name with args. -set dummy ${ac_tool_prefix}perl; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_path_DX_PERL+:} false; then : - $as_echo_n "(cached) " >&6 -else - case $DX_PERL in - [\\/]* | ?:[\\/]*) - ac_cv_path_DX_PERL="$DX_PERL" # Let the user override the test with a path. - ;; - *) - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_path_DX_PERL="$as_dir/$ac_word$ac_exec_ext" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - - ;; -esac -fi -DX_PERL=$ac_cv_path_DX_PERL -if test -n "$DX_PERL"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DX_PERL" >&5 -$as_echo "$DX_PERL" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - -fi -if test -z "$ac_cv_path_DX_PERL"; then - ac_pt_DX_PERL=$DX_PERL - # Extract the first word of "perl", so it can be a program name with args. -set dummy perl; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_path_ac_pt_DX_PERL+:} false; then : - $as_echo_n "(cached) " >&6 -else - case $ac_pt_DX_PERL in - [\\/]* | ?:[\\/]*) - ac_cv_path_ac_pt_DX_PERL="$ac_pt_DX_PERL" # Let the user override the test with a path. - ;; - *) - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_path_ac_pt_DX_PERL="$as_dir/$ac_word$ac_exec_ext" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - - ;; -esac -fi -ac_pt_DX_PERL=$ac_cv_path_ac_pt_DX_PERL -if test -n "$ac_pt_DX_PERL"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_pt_DX_PERL" >&5 -$as_echo "$ac_pt_DX_PERL" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - if test "x$ac_pt_DX_PERL" = x; then - DX_PERL="" - else - case $cross_compiling:$ac_tool_warned in -yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} -ac_tool_warned=yes ;; -esac - DX_PERL=$ac_pt_DX_PERL - fi -else - DX_PERL="$ac_cv_path_DX_PERL" -fi - -if test "$DX_FLAG_$DX_CURRENT_FEATURE$DX_PERL" = 1; then - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: perl not found - will not generate any doxygen documentation" >&5 -$as_echo "$as_me: WARNING: perl not found - will not generate any doxygen documentation" >&2;} - DX_FLAG_doc=0 - -fi - - : -fi -if test "$DX_FLAG_doc" = 1; then - if :; then - DX_COND_doc_TRUE= - DX_COND_doc_FALSE='#' -else - DX_COND_doc_TRUE='#' - DX_COND_doc_FALSE= -fi - - DX_ENV="$DX_ENV PERL_PATH='$DX_PERL'" - - : -else - if false; then - DX_COND_doc_TRUE= - DX_COND_doc_FALSE='#' -else - DX_COND_doc_TRUE='#' - DX_COND_doc_FALSE= -fi - - - : -fi - - -# Dot for graphics: - - - - @%:@ Check whether --enable-doxygen-dot was given. -if test "${enable_doxygen_dot+set}" = set; then : - enableval=$enable_doxygen_dot; -case "$enableval" in -#( -y|Y|yes|Yes|YES) - DX_FLAG_dot=1 - - -test "$DX_FLAG_doc" = "1" \ -|| as_fn_error $? "doxygen-dot requires doxygen-dot" "$LINENO" 5 - -;; #( -n|N|no|No|NO) - DX_FLAG_dot=0 - -;; #( -*) - as_fn_error $? "invalid value '$enableval' given to doxygen-dot" "$LINENO" 5 -;; -esac - -else - -DX_FLAG_dot=1 - - -test "$DX_FLAG_doc" = "1" || DX_FLAG_dot=0 - - - -fi - -if test "$DX_FLAG_dot" = 1; then - -if test -n "$ac_tool_prefix"; then - # Extract the first word of "${ac_tool_prefix}dot", so it can be a program name with args. -set dummy ${ac_tool_prefix}dot; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_path_DX_DOT+:} false; then : - $as_echo_n "(cached) " >&6 -else - case $DX_DOT in - [\\/]* | ?:[\\/]*) - ac_cv_path_DX_DOT="$DX_DOT" # Let the user override the test with a path. - ;; - *) - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_path_DX_DOT="$as_dir/$ac_word$ac_exec_ext" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - - ;; -esac -fi -DX_DOT=$ac_cv_path_DX_DOT -if test -n "$DX_DOT"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DX_DOT" >&5 -$as_echo "$DX_DOT" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - -fi -if test -z "$ac_cv_path_DX_DOT"; then - ac_pt_DX_DOT=$DX_DOT - # Extract the first word of "dot", so it can be a program name with args. -set dummy dot; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_path_ac_pt_DX_DOT+:} false; then : - $as_echo_n "(cached) " >&6 -else - case $ac_pt_DX_DOT in - [\\/]* | ?:[\\/]*) - ac_cv_path_ac_pt_DX_DOT="$ac_pt_DX_DOT" # Let the user override the test with a path. - ;; - *) - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_path_ac_pt_DX_DOT="$as_dir/$ac_word$ac_exec_ext" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - - ;; -esac -fi -ac_pt_DX_DOT=$ac_cv_path_ac_pt_DX_DOT -if test -n "$ac_pt_DX_DOT"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_pt_DX_DOT" >&5 -$as_echo "$ac_pt_DX_DOT" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - if test "x$ac_pt_DX_DOT" = x; then - DX_DOT="" - else - case $cross_compiling:$ac_tool_warned in -yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} -ac_tool_warned=yes ;; -esac - DX_DOT=$ac_pt_DX_DOT - fi -else - DX_DOT="$ac_cv_path_DX_DOT" -fi - -if test "$DX_FLAG_$DX_CURRENT_FEATURE$DX_DOT" = 1; then - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: dot not found - will not generate graphics for doxygen documentation" >&5 -$as_echo "$as_me: WARNING: dot not found - will not generate graphics for doxygen documentation" >&2;} - DX_FLAG_dot=0 - -fi - - : -fi -if test "$DX_FLAG_dot" = 1; then - if :; then - DX_COND_dot_TRUE= - DX_COND_dot_FALSE='#' -else - DX_COND_dot_TRUE='#' - DX_COND_dot_FALSE= -fi - - DX_ENV="$DX_ENV HAVE_DOT='YES'" - - DX_ENV="$DX_ENV DOT_PATH='`expr ".$DX_DOT" : '\(\.\)[^/]*$' \| "x$DX_DOT" : 'x\(.*\)/[^/]*$'`'" - - : -else - if false; then - DX_COND_dot_TRUE= - DX_COND_dot_FALSE='#' -else - DX_COND_dot_TRUE='#' - DX_COND_dot_FALSE= -fi - - DX_ENV="$DX_ENV HAVE_DOT='NO'" - - : -fi - - -# Man pages generation: - - - - @%:@ Check whether --enable-doxygen-man was given. -if test "${enable_doxygen_man+set}" = set; then : - enableval=$enable_doxygen_man; -case "$enableval" in -#( -y|Y|yes|Yes|YES) - DX_FLAG_man=1 - - -test "$DX_FLAG_doc" = "1" \ -|| as_fn_error $? "doxygen-man requires doxygen-man" "$LINENO" 5 - -;; #( -n|N|no|No|NO) - DX_FLAG_man=0 - -;; #( -*) - as_fn_error $? "invalid value '$enableval' given to doxygen-man" "$LINENO" 5 -;; -esac - -else - -DX_FLAG_man=0 - - -test "$DX_FLAG_doc" = "1" || DX_FLAG_man=0 - - - -fi - -if test "$DX_FLAG_man" = 1; then - - : -fi -if test "$DX_FLAG_man" = 1; then - if :; then - DX_COND_man_TRUE= - DX_COND_man_FALSE='#' -else - DX_COND_man_TRUE='#' - DX_COND_man_FALSE= -fi - - DX_ENV="$DX_ENV GENERATE_MAN='YES'" - - : -else - if false; then - DX_COND_man_TRUE= - DX_COND_man_FALSE='#' -else - DX_COND_man_TRUE='#' - DX_COND_man_FALSE= -fi - - DX_ENV="$DX_ENV GENERATE_MAN='NO'" - - : -fi - - -# RTF file generation: - - - - @%:@ Check whether --enable-doxygen-rtf was given. -if test "${enable_doxygen_rtf+set}" = set; then : - enableval=$enable_doxygen_rtf; -case "$enableval" in -#( -y|Y|yes|Yes|YES) - DX_FLAG_rtf=1 - - -test "$DX_FLAG_doc" = "1" \ -|| as_fn_error $? "doxygen-rtf requires doxygen-rtf" "$LINENO" 5 - -;; #( -n|N|no|No|NO) - DX_FLAG_rtf=0 - -;; #( -*) - as_fn_error $? "invalid value '$enableval' given to doxygen-rtf" "$LINENO" 5 -;; -esac - -else - -DX_FLAG_rtf=0 - - -test "$DX_FLAG_doc" = "1" || DX_FLAG_rtf=0 - - - -fi - -if test "$DX_FLAG_rtf" = 1; then - - : -fi -if test "$DX_FLAG_rtf" = 1; then - if :; then - DX_COND_rtf_TRUE= - DX_COND_rtf_FALSE='#' -else - DX_COND_rtf_TRUE='#' - DX_COND_rtf_FALSE= -fi - - DX_ENV="$DX_ENV GENERATE_RTF='YES'" - - : -else - if false; then - DX_COND_rtf_TRUE= - DX_COND_rtf_FALSE='#' -else - DX_COND_rtf_TRUE='#' - DX_COND_rtf_FALSE= -fi - - DX_ENV="$DX_ENV GENERATE_RTF='NO'" - - : -fi - - -# XML file generation: - - - - @%:@ Check whether --enable-doxygen-xml was given. -if test "${enable_doxygen_xml+set}" = set; then : - enableval=$enable_doxygen_xml; -case "$enableval" in -#( -y|Y|yes|Yes|YES) - DX_FLAG_xml=1 - - -test "$DX_FLAG_doc" = "1" \ -|| as_fn_error $? "doxygen-xml requires doxygen-xml" "$LINENO" 5 - -;; #( -n|N|no|No|NO) - DX_FLAG_xml=0 - -;; #( -*) - as_fn_error $? "invalid value '$enableval' given to doxygen-xml" "$LINENO" 5 -;; -esac - -else - -DX_FLAG_xml=0 - - -test "$DX_FLAG_doc" = "1" || DX_FLAG_xml=0 - - - -fi - -if test "$DX_FLAG_xml" = 1; then - - : -fi -if test "$DX_FLAG_xml" = 1; then - if :; then - DX_COND_xml_TRUE= - DX_COND_xml_FALSE='#' -else - DX_COND_xml_TRUE='#' - DX_COND_xml_FALSE= -fi - - DX_ENV="$DX_ENV GENERATE_XML='YES'" - - : -else - if false; then - DX_COND_xml_TRUE= - DX_COND_xml_FALSE='#' -else - DX_COND_xml_TRUE='#' - DX_COND_xml_FALSE= -fi - - DX_ENV="$DX_ENV GENERATE_XML='NO'" - - : -fi - - -# (Compressed) HTML help generation: - - - - @%:@ Check whether --enable-doxygen-chm was given. -if test "${enable_doxygen_chm+set}" = set; then : - enableval=$enable_doxygen_chm; -case "$enableval" in -#( -y|Y|yes|Yes|YES) - DX_FLAG_chm=1 - - -test "$DX_FLAG_doc" = "1" \ -|| as_fn_error $? "doxygen-chm requires doxygen-chm" "$LINENO" 5 - -;; #( -n|N|no|No|NO) - DX_FLAG_chm=0 - -;; #( -*) - as_fn_error $? "invalid value '$enableval' given to doxygen-chm" "$LINENO" 5 -;; -esac - -else - -DX_FLAG_chm=0 - - -test "$DX_FLAG_doc" = "1" || DX_FLAG_chm=0 - - - -fi - -if test "$DX_FLAG_chm" = 1; then - -if test -n "$ac_tool_prefix"; then - # Extract the first word of "${ac_tool_prefix}hhc", so it can be a program name with args. -set dummy ${ac_tool_prefix}hhc; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_path_DX_HHC+:} false; then : - $as_echo_n "(cached) " >&6 -else - case $DX_HHC in - [\\/]* | ?:[\\/]*) - ac_cv_path_DX_HHC="$DX_HHC" # Let the user override the test with a path. - ;; - *) - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_path_DX_HHC="$as_dir/$ac_word$ac_exec_ext" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - - ;; -esac -fi -DX_HHC=$ac_cv_path_DX_HHC -if test -n "$DX_HHC"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DX_HHC" >&5 -$as_echo "$DX_HHC" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - -fi -if test -z "$ac_cv_path_DX_HHC"; then - ac_pt_DX_HHC=$DX_HHC - # Extract the first word of "hhc", so it can be a program name with args. -set dummy hhc; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_path_ac_pt_DX_HHC+:} false; then : - $as_echo_n "(cached) " >&6 -else - case $ac_pt_DX_HHC in - [\\/]* | ?:[\\/]*) - ac_cv_path_ac_pt_DX_HHC="$ac_pt_DX_HHC" # Let the user override the test with a path. - ;; - *) - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_path_ac_pt_DX_HHC="$as_dir/$ac_word$ac_exec_ext" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - - ;; -esac -fi -ac_pt_DX_HHC=$ac_cv_path_ac_pt_DX_HHC -if test -n "$ac_pt_DX_HHC"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_pt_DX_HHC" >&5 -$as_echo "$ac_pt_DX_HHC" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - if test "x$ac_pt_DX_HHC" = x; then - DX_HHC="" - else - case $cross_compiling:$ac_tool_warned in -yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} -ac_tool_warned=yes ;; -esac - DX_HHC=$ac_pt_DX_HHC - fi -else - DX_HHC="$ac_cv_path_DX_HHC" -fi - -if test "$DX_FLAG_$DX_CURRENT_FEATURE$DX_HHC" = 1; then - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: hhc not found - will not generate doxygen compressed HTML help documentation" >&5 -$as_echo "$as_me: WARNING: hhc not found - will not generate doxygen compressed HTML help documentation" >&2;} - DX_FLAG_chm=0 - -fi - - : -fi -if test "$DX_FLAG_chm" = 1; then - if :; then - DX_COND_chm_TRUE= - DX_COND_chm_FALSE='#' -else - DX_COND_chm_TRUE='#' - DX_COND_chm_FALSE= -fi - - DX_ENV="$DX_ENV HHC_PATH='$DX_HHC'" - - DX_ENV="$DX_ENV GENERATE_HTML='YES'" - - DX_ENV="$DX_ENV GENERATE_HTMLHELP='YES'" - - : -else - if false; then - DX_COND_chm_TRUE= - DX_COND_chm_FALSE='#' -else - DX_COND_chm_TRUE='#' - DX_COND_chm_FALSE= -fi - - DX_ENV="$DX_ENV GENERATE_HTMLHELP='NO'" - - : -fi - - -# Seperate CHI file generation. - - - - @%:@ Check whether --enable-doxygen-chi was given. -if test "${enable_doxygen_chi+set}" = set; then : - enableval=$enable_doxygen_chi; -case "$enableval" in -#( -y|Y|yes|Yes|YES) - DX_FLAG_chi=1 - - -test "$DX_FLAG_chm" = "1" \ -|| as_fn_error $? "doxygen-chi requires doxygen-chi" "$LINENO" 5 - -;; #( -n|N|no|No|NO) - DX_FLAG_chi=0 - -;; #( -*) - as_fn_error $? "invalid value '$enableval' given to doxygen-chi" "$LINENO" 5 -;; -esac - -else - -DX_FLAG_chi=0 - - -test "$DX_FLAG_chm" = "1" || DX_FLAG_chi=0 - - - -fi - -if test "$DX_FLAG_chi" = 1; then - - : -fi -if test "$DX_FLAG_chi" = 1; then - if :; then - DX_COND_chi_TRUE= - DX_COND_chi_FALSE='#' -else - DX_COND_chi_TRUE='#' - DX_COND_chi_FALSE= -fi - - DX_ENV="$DX_ENV GENERATE_CHI='YES'" - - : -else - if false; then - DX_COND_chi_TRUE= - DX_COND_chi_FALSE='#' -else - DX_COND_chi_TRUE='#' - DX_COND_chi_FALSE= -fi - - DX_ENV="$DX_ENV GENERATE_CHI='NO'" - - : -fi - - -# Plain HTML pages generation: - - - - @%:@ Check whether --enable-doxygen-html was given. -if test "${enable_doxygen_html+set}" = set; then : - enableval=$enable_doxygen_html; -case "$enableval" in -#( -y|Y|yes|Yes|YES) - DX_FLAG_html=1 - - -test "$DX_FLAG_doc" = "1" \ -|| as_fn_error $? "doxygen-html requires doxygen-html" "$LINENO" 5 - -test "$DX_FLAG_chm" = "0" \ -|| as_fn_error $? "doxygen-html contradicts doxygen-html" "$LINENO" 5 - -;; #( -n|N|no|No|NO) - DX_FLAG_html=0 - -;; #( -*) - as_fn_error $? "invalid value '$enableval' given to doxygen-html" "$LINENO" 5 -;; -esac - -else - -DX_FLAG_html=1 - - -test "$DX_FLAG_doc" = "1" || DX_FLAG_html=0 - - -test "$DX_FLAG_chm" = "0" || DX_FLAG_html=0 - - - -fi - -if test "$DX_FLAG_html" = 1; then - - : -fi -if test "$DX_FLAG_html" = 1; then - if :; then - DX_COND_html_TRUE= - DX_COND_html_FALSE='#' -else - DX_COND_html_TRUE='#' - DX_COND_html_FALSE= -fi - - DX_ENV="$DX_ENV GENERATE_HTML='YES'" - - : -else - if false; then - DX_COND_html_TRUE= - DX_COND_html_FALSE='#' -else - DX_COND_html_TRUE='#' - DX_COND_html_FALSE= -fi - - test "$DX_FLAG_chm" = 1 || DX_ENV="$DX_ENV GENERATE_HTML='NO'" - - : -fi - - -# PostScript file generation: - - - - @%:@ Check whether --enable-doxygen-ps was given. -if test "${enable_doxygen_ps+set}" = set; then : - enableval=$enable_doxygen_ps; -case "$enableval" in -#( -y|Y|yes|Yes|YES) - DX_FLAG_ps=1 - - -test "$DX_FLAG_doc" = "1" \ -|| as_fn_error $? "doxygen-ps requires doxygen-ps" "$LINENO" 5 - -;; #( -n|N|no|No|NO) - DX_FLAG_ps=0 - -;; #( -*) - as_fn_error $? "invalid value '$enableval' given to doxygen-ps" "$LINENO" 5 -;; -esac - -else - -DX_FLAG_ps=0 - - -test "$DX_FLAG_doc" = "1" || DX_FLAG_ps=0 - - - -fi - -if test "$DX_FLAG_ps" = 1; then - -if test -n "$ac_tool_prefix"; then - # Extract the first word of "${ac_tool_prefix}latex", so it can be a program name with args. -set dummy ${ac_tool_prefix}latex; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_path_DX_LATEX+:} false; then : - $as_echo_n "(cached) " >&6 -else - case $DX_LATEX in - [\\/]* | ?:[\\/]*) - ac_cv_path_DX_LATEX="$DX_LATEX" # Let the user override the test with a path. - ;; - *) - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_path_DX_LATEX="$as_dir/$ac_word$ac_exec_ext" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - - ;; -esac -fi -DX_LATEX=$ac_cv_path_DX_LATEX -if test -n "$DX_LATEX"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DX_LATEX" >&5 -$as_echo "$DX_LATEX" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - -fi -if test -z "$ac_cv_path_DX_LATEX"; then - ac_pt_DX_LATEX=$DX_LATEX - # Extract the first word of "latex", so it can be a program name with args. -set dummy latex; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_path_ac_pt_DX_LATEX+:} false; then : - $as_echo_n "(cached) " >&6 -else - case $ac_pt_DX_LATEX in - [\\/]* | ?:[\\/]*) - ac_cv_path_ac_pt_DX_LATEX="$ac_pt_DX_LATEX" # Let the user override the test with a path. - ;; - *) - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_path_ac_pt_DX_LATEX="$as_dir/$ac_word$ac_exec_ext" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - - ;; -esac -fi -ac_pt_DX_LATEX=$ac_cv_path_ac_pt_DX_LATEX -if test -n "$ac_pt_DX_LATEX"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_pt_DX_LATEX" >&5 -$as_echo "$ac_pt_DX_LATEX" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - if test "x$ac_pt_DX_LATEX" = x; then - DX_LATEX="" - else - case $cross_compiling:$ac_tool_warned in -yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} -ac_tool_warned=yes ;; -esac - DX_LATEX=$ac_pt_DX_LATEX - fi -else - DX_LATEX="$ac_cv_path_DX_LATEX" -fi - -if test "$DX_FLAG_$DX_CURRENT_FEATURE$DX_LATEX" = 1; then - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: latex not found - will not generate doxygen PostScript documentation" >&5 -$as_echo "$as_me: WARNING: latex not found - will not generate doxygen PostScript documentation" >&2;} - DX_FLAG_ps=0 - -fi - - -if test -n "$ac_tool_prefix"; then - # Extract the first word of "${ac_tool_prefix}makeindex", so it can be a program name with args. -set dummy ${ac_tool_prefix}makeindex; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_path_DX_MAKEINDEX+:} false; then : - $as_echo_n "(cached) " >&6 -else - case $DX_MAKEINDEX in - [\\/]* | ?:[\\/]*) - ac_cv_path_DX_MAKEINDEX="$DX_MAKEINDEX" # Let the user override the test with a path. - ;; - *) - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_path_DX_MAKEINDEX="$as_dir/$ac_word$ac_exec_ext" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - - ;; -esac -fi -DX_MAKEINDEX=$ac_cv_path_DX_MAKEINDEX -if test -n "$DX_MAKEINDEX"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DX_MAKEINDEX" >&5 -$as_echo "$DX_MAKEINDEX" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - -fi -if test -z "$ac_cv_path_DX_MAKEINDEX"; then - ac_pt_DX_MAKEINDEX=$DX_MAKEINDEX - # Extract the first word of "makeindex", so it can be a program name with args. -set dummy makeindex; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_path_ac_pt_DX_MAKEINDEX+:} false; then : - $as_echo_n "(cached) " >&6 -else - case $ac_pt_DX_MAKEINDEX in - [\\/]* | ?:[\\/]*) - ac_cv_path_ac_pt_DX_MAKEINDEX="$ac_pt_DX_MAKEINDEX" # Let the user override the test with a path. - ;; - *) - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_path_ac_pt_DX_MAKEINDEX="$as_dir/$ac_word$ac_exec_ext" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - - ;; -esac -fi -ac_pt_DX_MAKEINDEX=$ac_cv_path_ac_pt_DX_MAKEINDEX -if test -n "$ac_pt_DX_MAKEINDEX"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_pt_DX_MAKEINDEX" >&5 -$as_echo "$ac_pt_DX_MAKEINDEX" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - if test "x$ac_pt_DX_MAKEINDEX" = x; then - DX_MAKEINDEX="" - else - case $cross_compiling:$ac_tool_warned in -yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} -ac_tool_warned=yes ;; -esac - DX_MAKEINDEX=$ac_pt_DX_MAKEINDEX - fi -else - DX_MAKEINDEX="$ac_cv_path_DX_MAKEINDEX" -fi - -if test "$DX_FLAG_$DX_CURRENT_FEATURE$DX_MAKEINDEX" = 1; then - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: makeindex not found - will not generate doxygen PostScript documentation" >&5 -$as_echo "$as_me: WARNING: makeindex not found - will not generate doxygen PostScript documentation" >&2;} - DX_FLAG_ps=0 - -fi - - -if test -n "$ac_tool_prefix"; then - # Extract the first word of "${ac_tool_prefix}dvips", so it can be a program name with args. -set dummy ${ac_tool_prefix}dvips; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_path_DX_DVIPS+:} false; then : - $as_echo_n "(cached) " >&6 -else - case $DX_DVIPS in - [\\/]* | ?:[\\/]*) - ac_cv_path_DX_DVIPS="$DX_DVIPS" # Let the user override the test with a path. - ;; - *) - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_path_DX_DVIPS="$as_dir/$ac_word$ac_exec_ext" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - - ;; -esac -fi -DX_DVIPS=$ac_cv_path_DX_DVIPS -if test -n "$DX_DVIPS"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DX_DVIPS" >&5 -$as_echo "$DX_DVIPS" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - -fi -if test -z "$ac_cv_path_DX_DVIPS"; then - ac_pt_DX_DVIPS=$DX_DVIPS - # Extract the first word of "dvips", so it can be a program name with args. -set dummy dvips; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_path_ac_pt_DX_DVIPS+:} false; then : - $as_echo_n "(cached) " >&6 -else - case $ac_pt_DX_DVIPS in - [\\/]* | ?:[\\/]*) - ac_cv_path_ac_pt_DX_DVIPS="$ac_pt_DX_DVIPS" # Let the user override the test with a path. - ;; - *) - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_path_ac_pt_DX_DVIPS="$as_dir/$ac_word$ac_exec_ext" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - - ;; -esac -fi -ac_pt_DX_DVIPS=$ac_cv_path_ac_pt_DX_DVIPS -if test -n "$ac_pt_DX_DVIPS"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_pt_DX_DVIPS" >&5 -$as_echo "$ac_pt_DX_DVIPS" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - if test "x$ac_pt_DX_DVIPS" = x; then - DX_DVIPS="" - else - case $cross_compiling:$ac_tool_warned in -yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} -ac_tool_warned=yes ;; -esac - DX_DVIPS=$ac_pt_DX_DVIPS - fi -else - DX_DVIPS="$ac_cv_path_DX_DVIPS" -fi - -if test "$DX_FLAG_$DX_CURRENT_FEATURE$DX_DVIPS" = 1; then - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: dvips not found - will not generate doxygen PostScript documentation" >&5 -$as_echo "$as_me: WARNING: dvips not found - will not generate doxygen PostScript documentation" >&2;} - DX_FLAG_ps=0 - -fi - - -if test -n "$ac_tool_prefix"; then - # Extract the first word of "${ac_tool_prefix}egrep", so it can be a program name with args. -set dummy ${ac_tool_prefix}egrep; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_path_DX_EGREP+:} false; then : - $as_echo_n "(cached) " >&6 -else - case $DX_EGREP in - [\\/]* | ?:[\\/]*) - ac_cv_path_DX_EGREP="$DX_EGREP" # Let the user override the test with a path. - ;; - *) - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_path_DX_EGREP="$as_dir/$ac_word$ac_exec_ext" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - - ;; -esac -fi -DX_EGREP=$ac_cv_path_DX_EGREP -if test -n "$DX_EGREP"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DX_EGREP" >&5 -$as_echo "$DX_EGREP" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - -fi -if test -z "$ac_cv_path_DX_EGREP"; then - ac_pt_DX_EGREP=$DX_EGREP - # Extract the first word of "egrep", so it can be a program name with args. -set dummy egrep; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_path_ac_pt_DX_EGREP+:} false; then : - $as_echo_n "(cached) " >&6 -else - case $ac_pt_DX_EGREP in - [\\/]* | ?:[\\/]*) - ac_cv_path_ac_pt_DX_EGREP="$ac_pt_DX_EGREP" # Let the user override the test with a path. - ;; - *) - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_path_ac_pt_DX_EGREP="$as_dir/$ac_word$ac_exec_ext" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - - ;; -esac -fi -ac_pt_DX_EGREP=$ac_cv_path_ac_pt_DX_EGREP -if test -n "$ac_pt_DX_EGREP"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_pt_DX_EGREP" >&5 -$as_echo "$ac_pt_DX_EGREP" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - if test "x$ac_pt_DX_EGREP" = x; then - DX_EGREP="" - else - case $cross_compiling:$ac_tool_warned in -yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} -ac_tool_warned=yes ;; -esac - DX_EGREP=$ac_pt_DX_EGREP - fi -else - DX_EGREP="$ac_cv_path_DX_EGREP" -fi - -if test "$DX_FLAG_$DX_CURRENT_FEATURE$DX_EGREP" = 1; then - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: egrep not found - will not generate doxygen PostScript documentation" >&5 -$as_echo "$as_me: WARNING: egrep not found - will not generate doxygen PostScript documentation" >&2;} - DX_FLAG_ps=0 - -fi - - : -fi -if test "$DX_FLAG_ps" = 1; then - if :; then - DX_COND_ps_TRUE= - DX_COND_ps_FALSE='#' -else - DX_COND_ps_TRUE='#' - DX_COND_ps_FALSE= -fi - - - : -else - if false; then - DX_COND_ps_TRUE= - DX_COND_ps_FALSE='#' -else - DX_COND_ps_TRUE='#' - DX_COND_ps_FALSE= -fi - - - : -fi - - -# PDF file generation: - - - - @%:@ Check whether --enable-doxygen-pdf was given. -if test "${enable_doxygen_pdf+set}" = set; then : - enableval=$enable_doxygen_pdf; -case "$enableval" in -#( -y|Y|yes|Yes|YES) - DX_FLAG_pdf=1 - - -test "$DX_FLAG_doc" = "1" \ -|| as_fn_error $? "doxygen-pdf requires doxygen-pdf" "$LINENO" 5 - -;; #( -n|N|no|No|NO) - DX_FLAG_pdf=0 - -;; #( -*) - as_fn_error $? "invalid value '$enableval' given to doxygen-pdf" "$LINENO" 5 -;; -esac - -else - -DX_FLAG_pdf=0 - - -test "$DX_FLAG_doc" = "1" || DX_FLAG_pdf=0 - - - -fi - -if test "$DX_FLAG_pdf" = 1; then - -if test -n "$ac_tool_prefix"; then - # Extract the first word of "${ac_tool_prefix}pdflatex", so it can be a program name with args. -set dummy ${ac_tool_prefix}pdflatex; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_path_DX_PDFLATEX+:} false; then : - $as_echo_n "(cached) " >&6 -else - case $DX_PDFLATEX in - [\\/]* | ?:[\\/]*) - ac_cv_path_DX_PDFLATEX="$DX_PDFLATEX" # Let the user override the test with a path. - ;; - *) - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_path_DX_PDFLATEX="$as_dir/$ac_word$ac_exec_ext" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - - ;; -esac -fi -DX_PDFLATEX=$ac_cv_path_DX_PDFLATEX -if test -n "$DX_PDFLATEX"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DX_PDFLATEX" >&5 -$as_echo "$DX_PDFLATEX" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - -fi -if test -z "$ac_cv_path_DX_PDFLATEX"; then - ac_pt_DX_PDFLATEX=$DX_PDFLATEX - # Extract the first word of "pdflatex", so it can be a program name with args. -set dummy pdflatex; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_path_ac_pt_DX_PDFLATEX+:} false; then : - $as_echo_n "(cached) " >&6 -else - case $ac_pt_DX_PDFLATEX in - [\\/]* | ?:[\\/]*) - ac_cv_path_ac_pt_DX_PDFLATEX="$ac_pt_DX_PDFLATEX" # Let the user override the test with a path. - ;; - *) - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_path_ac_pt_DX_PDFLATEX="$as_dir/$ac_word$ac_exec_ext" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - - ;; -esac -fi -ac_pt_DX_PDFLATEX=$ac_cv_path_ac_pt_DX_PDFLATEX -if test -n "$ac_pt_DX_PDFLATEX"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_pt_DX_PDFLATEX" >&5 -$as_echo "$ac_pt_DX_PDFLATEX" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - if test "x$ac_pt_DX_PDFLATEX" = x; then - DX_PDFLATEX="" - else - case $cross_compiling:$ac_tool_warned in -yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} -ac_tool_warned=yes ;; -esac - DX_PDFLATEX=$ac_pt_DX_PDFLATEX - fi -else - DX_PDFLATEX="$ac_cv_path_DX_PDFLATEX" -fi - -if test "$DX_FLAG_$DX_CURRENT_FEATURE$DX_PDFLATEX" = 1; then - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: pdflatex not found - will not generate doxygen PDF documentation" >&5 -$as_echo "$as_me: WARNING: pdflatex not found - will not generate doxygen PDF documentation" >&2;} - DX_FLAG_pdf=0 - -fi - - -if test -n "$ac_tool_prefix"; then - # Extract the first word of "${ac_tool_prefix}makeindex", so it can be a program name with args. -set dummy ${ac_tool_prefix}makeindex; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_path_DX_MAKEINDEX+:} false; then : - $as_echo_n "(cached) " >&6 -else - case $DX_MAKEINDEX in - [\\/]* | ?:[\\/]*) - ac_cv_path_DX_MAKEINDEX="$DX_MAKEINDEX" # Let the user override the test with a path. - ;; - *) - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_path_DX_MAKEINDEX="$as_dir/$ac_word$ac_exec_ext" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - - ;; -esac -fi -DX_MAKEINDEX=$ac_cv_path_DX_MAKEINDEX -if test -n "$DX_MAKEINDEX"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DX_MAKEINDEX" >&5 -$as_echo "$DX_MAKEINDEX" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - -fi -if test -z "$ac_cv_path_DX_MAKEINDEX"; then - ac_pt_DX_MAKEINDEX=$DX_MAKEINDEX - # Extract the first word of "makeindex", so it can be a program name with args. -set dummy makeindex; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_path_ac_pt_DX_MAKEINDEX+:} false; then : - $as_echo_n "(cached) " >&6 -else - case $ac_pt_DX_MAKEINDEX in - [\\/]* | ?:[\\/]*) - ac_cv_path_ac_pt_DX_MAKEINDEX="$ac_pt_DX_MAKEINDEX" # Let the user override the test with a path. - ;; - *) - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_path_ac_pt_DX_MAKEINDEX="$as_dir/$ac_word$ac_exec_ext" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - - ;; -esac -fi -ac_pt_DX_MAKEINDEX=$ac_cv_path_ac_pt_DX_MAKEINDEX -if test -n "$ac_pt_DX_MAKEINDEX"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_pt_DX_MAKEINDEX" >&5 -$as_echo "$ac_pt_DX_MAKEINDEX" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - if test "x$ac_pt_DX_MAKEINDEX" = x; then - DX_MAKEINDEX="" - else - case $cross_compiling:$ac_tool_warned in -yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} -ac_tool_warned=yes ;; -esac - DX_MAKEINDEX=$ac_pt_DX_MAKEINDEX - fi -else - DX_MAKEINDEX="$ac_cv_path_DX_MAKEINDEX" -fi - -if test "$DX_FLAG_$DX_CURRENT_FEATURE$DX_MAKEINDEX" = 1; then - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: makeindex not found - will not generate doxygen PDF documentation" >&5 -$as_echo "$as_me: WARNING: makeindex not found - will not generate doxygen PDF documentation" >&2;} - DX_FLAG_pdf=0 - -fi - - -if test -n "$ac_tool_prefix"; then - # Extract the first word of "${ac_tool_prefix}egrep", so it can be a program name with args. -set dummy ${ac_tool_prefix}egrep; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_path_DX_EGREP+:} false; then : - $as_echo_n "(cached) " >&6 -else - case $DX_EGREP in - [\\/]* | ?:[\\/]*) - ac_cv_path_DX_EGREP="$DX_EGREP" # Let the user override the test with a path. - ;; - *) - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_path_DX_EGREP="$as_dir/$ac_word$ac_exec_ext" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - - ;; -esac -fi -DX_EGREP=$ac_cv_path_DX_EGREP -if test -n "$DX_EGREP"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DX_EGREP" >&5 -$as_echo "$DX_EGREP" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - -fi -if test -z "$ac_cv_path_DX_EGREP"; then - ac_pt_DX_EGREP=$DX_EGREP - # Extract the first word of "egrep", so it can be a program name with args. -set dummy egrep; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_path_ac_pt_DX_EGREP+:} false; then : - $as_echo_n "(cached) " >&6 -else - case $ac_pt_DX_EGREP in - [\\/]* | ?:[\\/]*) - ac_cv_path_ac_pt_DX_EGREP="$ac_pt_DX_EGREP" # Let the user override the test with a path. - ;; - *) - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_path_ac_pt_DX_EGREP="$as_dir/$ac_word$ac_exec_ext" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - - ;; -esac -fi -ac_pt_DX_EGREP=$ac_cv_path_ac_pt_DX_EGREP -if test -n "$ac_pt_DX_EGREP"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_pt_DX_EGREP" >&5 -$as_echo "$ac_pt_DX_EGREP" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - if test "x$ac_pt_DX_EGREP" = x; then - DX_EGREP="" - else - case $cross_compiling:$ac_tool_warned in -yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} -ac_tool_warned=yes ;; -esac - DX_EGREP=$ac_pt_DX_EGREP - fi -else - DX_EGREP="$ac_cv_path_DX_EGREP" -fi - -if test "$DX_FLAG_$DX_CURRENT_FEATURE$DX_EGREP" = 1; then - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: egrep not found - will not generate doxygen PDF documentation" >&5 -$as_echo "$as_me: WARNING: egrep not found - will not generate doxygen PDF documentation" >&2;} - DX_FLAG_pdf=0 - -fi - - : -fi -if test "$DX_FLAG_pdf" = 1; then - if :; then - DX_COND_pdf_TRUE= - DX_COND_pdf_FALSE='#' -else - DX_COND_pdf_TRUE='#' - DX_COND_pdf_FALSE= -fi - - - : -else - if false; then - DX_COND_pdf_TRUE= - DX_COND_pdf_FALSE='#' -else - DX_COND_pdf_TRUE='#' - DX_COND_pdf_FALSE= -fi - - - : -fi - - -# LaTeX generation for PS and/or PDF: -if test "$DX_FLAG_ps" = 1 || test "$DX_FLAG_pdf" = 1; then - if :; then - DX_COND_latex_TRUE= - DX_COND_latex_FALSE='#' -else - DX_COND_latex_TRUE='#' - DX_COND_latex_FALSE= -fi - - DX_ENV="$DX_ENV GENERATE_LATEX='YES'" - -else - if false; then - DX_COND_latex_TRUE= - DX_COND_latex_FALSE='#' -else - DX_COND_latex_TRUE='#' - DX_COND_latex_FALSE= -fi - - DX_ENV="$DX_ENV GENERATE_LATEX='NO'" - -fi - -# Paper size for PS and/or PDF: - -case "$DOXYGEN_PAPER_SIZE" in -#( -"") - DOXYGEN_PAPER_SIZE="" - -;; #( -a4wide|a4|letter|legal|executive) - DX_ENV="$DX_ENV PAPER_SIZE='$DOXYGEN_PAPER_SIZE'" - -;; #( -*) - as_fn_error $? "unknown DOXYGEN_PAPER_SIZE='$DOXYGEN_PAPER_SIZE'" "$LINENO" 5 -;; -esac - -#For debugging: -#echo DX_FLAG_doc=$DX_FLAG_doc -#echo DX_FLAG_dot=$DX_FLAG_dot -#echo DX_FLAG_man=$DX_FLAG_man -#echo DX_FLAG_html=$DX_FLAG_html -#echo DX_FLAG_chm=$DX_FLAG_chm -#echo DX_FLAG_chi=$DX_FLAG_chi -#echo DX_FLAG_rtf=$DX_FLAG_rtf -#echo DX_FLAG_xml=$DX_FLAG_xml -#echo DX_FLAG_pdf=$DX_FLAG_pdf -#echo DX_FLAG_ps=$DX_FLAG_ps -#echo DX_ENV=$DX_ENV - - -# initialize automake -am__api_version='1.11' - -ac_aux_dir= -for ac_dir in "$srcdir" "$srcdir/.." "$srcdir/../.."; do - if test -f "$ac_dir/install-sh"; then - ac_aux_dir=$ac_dir - ac_install_sh="$ac_aux_dir/install-sh -c" - break - elif test -f "$ac_dir/install.sh"; then - ac_aux_dir=$ac_dir - ac_install_sh="$ac_aux_dir/install.sh -c" - break - elif test -f "$ac_dir/shtool"; then - ac_aux_dir=$ac_dir - ac_install_sh="$ac_aux_dir/shtool install -c" - break - fi -done -if test -z "$ac_aux_dir"; then - as_fn_error $? "cannot find install-sh, install.sh, or shtool in \"$srcdir\" \"$srcdir/..\" \"$srcdir/../..\"" "$LINENO" 5 -fi - -# These three variables are undocumented and unsupported, -# and are intended to be withdrawn in a future Autoconf release. -# They can cause serious problems if a builder's source tree is in a directory -# whose full name contains unusual characters. -ac_config_guess="$SHELL $ac_aux_dir/config.guess" # Please don't use this var. -ac_config_sub="$SHELL $ac_aux_dir/config.sub" # Please don't use this var. -ac_configure="$SHELL $ac_aux_dir/configure" # Please don't use this var. - - -# Find a good install program. We prefer a C program (faster), -# so one script is as good as another. But avoid the broken or -# incompatible versions: -# SysV /etc/install, /usr/sbin/install -# SunOS /usr/etc/install -# IRIX /sbin/install -# AIX /bin/install -# AmigaOS /C/install, which installs bootblocks on floppy discs -# AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag -# AFS /usr/afsws/bin/install, which mishandles nonexistent args -# SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff" -# OS/2's system install, which has a completely different semantic -# ./install, which can be erroneously created by make from ./install.sh. -# Reject install programs that cannot install multiple files. -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a BSD-compatible install" >&5 -$as_echo_n "checking for a BSD-compatible install... " >&6; } -if test -z "$INSTALL"; then -if ${ac_cv_path_install+:} false; then : - $as_echo_n "(cached) " >&6 -else - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - # Account for people who put trailing slashes in PATH elements. -case $as_dir/ in @%:@(( - ./ | .// | /[cC]/* | \ - /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \ - ?:[\\/]os2[\\/]install[\\/]* | ?:[\\/]OS2[\\/]INSTALL[\\/]* | \ - /usr/ucb/* ) ;; - *) - # OSF1 and SCO ODT 3.0 have their own names for install. - # Don't use installbsd from OSF since it installs stuff as root - # by default. - for ac_prog in ginstall scoinst install; do - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_prog$ac_exec_ext"; then - if test $ac_prog = install && - grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then - # AIX install. It has an incompatible calling convention. - : - elif test $ac_prog = install && - grep pwplus "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then - # program-specific install script used by HP pwplus--don't use. - : - else - rm -rf conftest.one conftest.two conftest.dir - echo one > conftest.one - echo two > conftest.two - mkdir conftest.dir - if "$as_dir/$ac_prog$ac_exec_ext" -c conftest.one conftest.two "`pwd`/conftest.dir" && - test -s conftest.one && test -s conftest.two && - test -s conftest.dir/conftest.one && - test -s conftest.dir/conftest.two - then - ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c" - break 3 - fi - fi - fi - done - done - ;; -esac - - done -IFS=$as_save_IFS - -rm -rf conftest.one conftest.two conftest.dir - -fi - if test "${ac_cv_path_install+set}" = set; then - INSTALL=$ac_cv_path_install - else - # As a last resort, use the slow shell script. Don't cache a - # value for INSTALL within a source directory, because that will - # break other packages using the cache if that directory is - # removed, or if the value is a relative name. - INSTALL=$ac_install_sh - fi -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $INSTALL" >&5 -$as_echo "$INSTALL" >&6; } - -# Use test -z because SunOS4 sh mishandles braces in ${var-val}. -# It thinks the first close brace ends the variable substitution. -test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}' - -test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}' - -test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644' - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether build environment is sane" >&5 -$as_echo_n "checking whether build environment is sane... " >&6; } -# Just in case -sleep 1 -echo timestamp > conftest.file -# Reject unsafe characters in $srcdir or the absolute working directory -# name. Accept space and tab only in the latter. -am_lf=' -' -case `pwd` in - *[\\\"\#\$\&\'\`$am_lf]*) - as_fn_error $? "unsafe absolute working directory name" "$LINENO" 5;; -esac -case $srcdir in - *[\\\"\#\$\&\'\`$am_lf\ \ ]*) - as_fn_error $? "unsafe srcdir value: \`$srcdir'" "$LINENO" 5;; -esac - -# Do `set' in a subshell so we don't clobber the current shell's -# arguments. Must try -L first in case configure is actually a -# symlink; some systems play weird games with the mod time of symlinks -# (eg FreeBSD returns the mod time of the symlink's containing -# directory). -if ( - set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null` - if test "$*" = "X"; then - # -L didn't work. - set X `ls -t "$srcdir/configure" conftest.file` - fi - rm -f conftest.file - if test "$*" != "X $srcdir/configure conftest.file" \ - && test "$*" != "X conftest.file $srcdir/configure"; then - - # If neither matched, then we have a broken ls. This can happen - # if, for instance, CONFIG_SHELL is bash and it inherits a - # broken ls alias from the environment. This has actually - # happened. Such a system could not be considered "sane". - as_fn_error $? "ls -t appears to fail. Make sure there is not a broken -alias in your environment" "$LINENO" 5 - fi - - test "$2" = conftest.file - ) -then - # Ok. - : -else - as_fn_error $? "newly created file is older than distributed files! -Check your system clock" "$LINENO" 5 -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; } -test "$program_prefix" != NONE && - program_transform_name="s&^&$program_prefix&;$program_transform_name" -# Use a double $ so make ignores it. -test "$program_suffix" != NONE && - program_transform_name="s&\$&$program_suffix&;$program_transform_name" -# Double any \ or $. -# By default was `s,x,x', remove it if useless. -ac_script='s/[\\$]/&&/g;s/;s,x,x,$//' -program_transform_name=`$as_echo "$program_transform_name" | sed "$ac_script"` - -# expand $ac_aux_dir to an absolute path -am_aux_dir=`cd $ac_aux_dir && pwd` - -if test x"${MISSING+set}" != xset; then - case $am_aux_dir in - *\ * | *\ *) - MISSING="\${SHELL} \"$am_aux_dir/missing\"" ;; - *) - MISSING="\${SHELL} $am_aux_dir/missing" ;; - esac -fi -# Use eval to expand $SHELL -if eval "$MISSING --run true"; then - am_missing_run="$MISSING --run " -else - am_missing_run= - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: \`missing' script is too old or missing" >&5 -$as_echo "$as_me: WARNING: \`missing' script is too old or missing" >&2;} -fi - -if test x"${install_sh}" != xset; then - case $am_aux_dir in - *\ * | *\ *) - install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;; - *) - install_sh="\${SHELL} $am_aux_dir/install-sh" - esac -fi - -# Installed binaries are usually stripped using `strip' when the user -# run `make install-strip'. However `strip' might not be the right -# tool to use in cross-compilation environments, therefore Automake -# will honor the `STRIP' environment variable to overrule this program. -if test "$cross_compiling" != no; then - if test -n "$ac_tool_prefix"; then - # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args. -set dummy ${ac_tool_prefix}strip; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_STRIP+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$STRIP"; then - ac_cv_prog_STRIP="$STRIP" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_STRIP="${ac_tool_prefix}strip" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -STRIP=$ac_cv_prog_STRIP -if test -n "$STRIP"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $STRIP" >&5 -$as_echo "$STRIP" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - -fi -if test -z "$ac_cv_prog_STRIP"; then - ac_ct_STRIP=$STRIP - # Extract the first word of "strip", so it can be a program name with args. -set dummy strip; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_ac_ct_STRIP+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$ac_ct_STRIP"; then - ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_ac_ct_STRIP="strip" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP -if test -n "$ac_ct_STRIP"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP" >&5 -$as_echo "$ac_ct_STRIP" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - if test "x$ac_ct_STRIP" = x; then - STRIP=":" - else - case $cross_compiling:$ac_tool_warned in -yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} -ac_tool_warned=yes ;; -esac - STRIP=$ac_ct_STRIP - fi -else - STRIP="$ac_cv_prog_STRIP" -fi - -fi -INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s" - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a thread-safe mkdir -p" >&5 -$as_echo_n "checking for a thread-safe mkdir -p... " >&6; } -if test -z "$MKDIR_P"; then - if ${ac_cv_path_mkdir+:} false; then : - $as_echo_n "(cached) " >&6 -else - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH$PATH_SEPARATOR/opt/sfw/bin -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_prog in mkdir gmkdir; do - for ac_exec_ext in '' $ac_executable_extensions; do - as_fn_executable_p "$as_dir/$ac_prog$ac_exec_ext" || continue - case `"$as_dir/$ac_prog$ac_exec_ext" --version 2>&1` in #( - 'mkdir (GNU coreutils) '* | \ - 'mkdir (coreutils) '* | \ - 'mkdir (fileutils) '4.1*) - ac_cv_path_mkdir=$as_dir/$ac_prog$ac_exec_ext - break 3;; - esac - done - done - done -IFS=$as_save_IFS - -fi - - test -d ./--version && rmdir ./--version - if test "${ac_cv_path_mkdir+set}" = set; then - MKDIR_P="$ac_cv_path_mkdir -p" - else - # As a last resort, use the slow shell script. Don't cache a - # value for MKDIR_P within a source directory, because that will - # break other packages using the cache if that directory is - # removed, or if the value is a relative name. - MKDIR_P="$ac_install_sh -d" - fi -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $MKDIR_P" >&5 -$as_echo "$MKDIR_P" >&6; } - -mkdir_p="$MKDIR_P" -case $mkdir_p in - [\\/$]* | ?:[\\/]*) ;; - */*) mkdir_p="\$(top_builddir)/$mkdir_p" ;; -esac - -for ac_prog in gawk mawk nawk awk -do - # Extract the first word of "$ac_prog", so it can be a program name with args. -set dummy $ac_prog; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_AWK+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$AWK"; then - ac_cv_prog_AWK="$AWK" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_AWK="$ac_prog" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -AWK=$ac_cv_prog_AWK -if test -n "$AWK"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AWK" >&5 -$as_echo "$AWK" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - - test -n "$AWK" && break -done - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} sets \$(MAKE)" >&5 -$as_echo_n "checking whether ${MAKE-make} sets \$(MAKE)... " >&6; } -set x ${MAKE-make} -ac_make=`$as_echo "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'` -if eval \${ac_cv_prog_make_${ac_make}_set+:} false; then : - $as_echo_n "(cached) " >&6 -else - cat >conftest.make <<\_ACEOF -SHELL = /bin/sh -all: - @echo '@@@%%%=$(MAKE)=@@@%%%' -_ACEOF -# GNU make sometimes prints "make[1]: Entering ...", which would confuse us. -case `${MAKE-make} -f conftest.make 2>/dev/null` in - *@@@%%%=?*=@@@%%%*) - eval ac_cv_prog_make_${ac_make}_set=yes;; - *) - eval ac_cv_prog_make_${ac_make}_set=no;; -esac -rm -f conftest.make -fi -if eval test \$ac_cv_prog_make_${ac_make}_set = yes; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; } - SET_MAKE= -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } - SET_MAKE="MAKE=${MAKE-make}" -fi - -rm -rf .tst 2>/dev/null -mkdir .tst 2>/dev/null -if test -d .tst; then - am__leading_dot=. -else - am__leading_dot=_ -fi -rmdir .tst 2>/dev/null - -if test "`cd $srcdir && pwd`" != "`pwd`"; then - # Use -I$(srcdir) only when $(srcdir) != ., so that make's output - # is not polluted with repeated "-I." - am__isrc=' -I$(srcdir)' - # test to see if srcdir already configured - if test -f $srcdir/config.status; then - as_fn_error $? "source directory already configured; run \"make distclean\" there first" "$LINENO" 5 - fi -fi - -# test whether we have cygpath -if test -z "$CYGPATH_W"; then - if (cygpath --version) >/dev/null 2>/dev/null; then - CYGPATH_W='cygpath -w' - else - CYGPATH_W=echo - fi -fi - - -# Define the identity of the package. - PACKAGE='zookeeper' - VERSION='3.4.5' - - -cat >>confdefs.h <<_ACEOF -@%:@define PACKAGE "$PACKAGE" -_ACEOF - - -cat >>confdefs.h <<_ACEOF -@%:@define VERSION "$VERSION" -_ACEOF - -# Some tools Automake needs. - -ACLOCAL=${ACLOCAL-"${am_missing_run}aclocal-${am__api_version}"} - - -AUTOCONF=${AUTOCONF-"${am_missing_run}autoconf"} - - -AUTOMAKE=${AUTOMAKE-"${am_missing_run}automake-${am__api_version}"} - - -AUTOHEADER=${AUTOHEADER-"${am_missing_run}autoheader"} - - -MAKEINFO=${MAKEINFO-"${am_missing_run}makeinfo"} - -# We need awk for the "check" target. The system "awk" is bad on -# some platforms. -# Always define AMTAR for backward compatibility. Yes, it's still used -# in the wild :-( We should find a proper way to deprecate it ... -AMTAR='$${TAR-tar}' - -am__tar='$${TAR-tar} chof - "$$tardir"' am__untar='$${TAR-tar} xf -' - - - - - -ac_config_headers="$ac_config_headers config.h" - - -# Checks for programs. - -@%:@ Check whether --with-cppunit was given. -if test "${with_cppunit+set}" = set; then : - withval=$with_cppunit; -fi - - -if test "$with_cppunit" = "no" ; then - CPPUNIT_PATH="No_CPPUNIT" - CPPUNIT_INCLUDE= - CPPUNIT_LIBS= -else - AM_PATH_CPPUNIT(1.10.2) -fi - -if test "$CALLER" = "ANT" ; then -CPPUNIT_CFLAGS="$CPPUNIT_CFLAGS -DZKSERVER_CMD=\"\\\"${base_dir}/src/c/tests/zkServer.sh\\\"\"" -else -CPPUNIT_CFLAGS="$CPPUNIT_CFLAGS -DZKSERVER_CMD=\"\\\"./tests/zkServer.sh\\\"\"" -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for generated/zookeeper.jute.c" >&5 -$as_echo_n "checking for generated/zookeeper.jute.c... " >&6; } -if ${ac_cv_file_generated_zookeeper_jute_c+:} false; then : - $as_echo_n "(cached) " >&6 -else - test "$cross_compiling" = yes && - as_fn_error $? "cannot check for file existence when cross compiling" "$LINENO" 5 -if test -r "generated/zookeeper.jute.c"; then - ac_cv_file_generated_zookeeper_jute_c=yes -else - ac_cv_file_generated_zookeeper_jute_c=no -fi -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_file_generated_zookeeper_jute_c" >&5 -$as_echo "$ac_cv_file_generated_zookeeper_jute_c" >&6; } -if test "x$ac_cv_file_generated_zookeeper_jute_c" = xyes; then : - -cat >>confdefs.h <<_ACEOF -@%:@define HAVE_GENERATED_ZOOKEEPER_JUTE_C 1 -_ACEOF - -else - as_fn_error $? "jute files are missing! Please run \"ant compile_jute\" while in the zookeeper top level directory." "$LINENO" 5 - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for generated/zookeeper.jute.h" >&5 -$as_echo_n "checking for generated/zookeeper.jute.h... " >&6; } -if ${ac_cv_file_generated_zookeeper_jute_h+:} false; then : - $as_echo_n "(cached) " >&6 -else - test "$cross_compiling" = yes && - as_fn_error $? "cannot check for file existence when cross compiling" "$LINENO" 5 -if test -r "generated/zookeeper.jute.h"; then - ac_cv_file_generated_zookeeper_jute_h=yes -else - ac_cv_file_generated_zookeeper_jute_h=no -fi -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_file_generated_zookeeper_jute_h" >&5 -$as_echo "$ac_cv_file_generated_zookeeper_jute_h" >&6; } -if test "x$ac_cv_file_generated_zookeeper_jute_h" = xyes; then : - -cat >>confdefs.h <<_ACEOF -@%:@define HAVE_GENERATED_ZOOKEEPER_JUTE_H 1 -_ACEOF - -else - as_fn_error $? "jute files are missing! Please run \"ant compile_jute\" while in the zookeeper top level directory." "$LINENO" 5 - -fi - -fi - - -ac_ext=c -ac_cpp='$CPP $CPPFLAGS' -ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_c_compiler_gnu -if test -n "$ac_tool_prefix"; then - # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args. -set dummy ${ac_tool_prefix}gcc; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_CC+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$CC"; then - ac_cv_prog_CC="$CC" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_CC="${ac_tool_prefix}gcc" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -CC=$ac_cv_prog_CC -if test -n "$CC"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 -$as_echo "$CC" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - -fi -if test -z "$ac_cv_prog_CC"; then - ac_ct_CC=$CC - # Extract the first word of "gcc", so it can be a program name with args. -set dummy gcc; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_ac_ct_CC+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$ac_ct_CC"; then - ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_ac_ct_CC="gcc" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -ac_ct_CC=$ac_cv_prog_ac_ct_CC -if test -n "$ac_ct_CC"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 -$as_echo "$ac_ct_CC" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - if test "x$ac_ct_CC" = x; then - CC="" - else - case $cross_compiling:$ac_tool_warned in -yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} -ac_tool_warned=yes ;; -esac - CC=$ac_ct_CC - fi -else - CC="$ac_cv_prog_CC" -fi - -if test -z "$CC"; then - if test -n "$ac_tool_prefix"; then - # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args. -set dummy ${ac_tool_prefix}cc; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_CC+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$CC"; then - ac_cv_prog_CC="$CC" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_CC="${ac_tool_prefix}cc" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -CC=$ac_cv_prog_CC -if test -n "$CC"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 -$as_echo "$CC" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - - fi -fi -if test -z "$CC"; then - # Extract the first word of "cc", so it can be a program name with args. -set dummy cc; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_CC+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$CC"; then - ac_cv_prog_CC="$CC" # Let the user override the test. -else - ac_prog_rejected=no -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then - ac_prog_rejected=yes - continue - fi - ac_cv_prog_CC="cc" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -if test $ac_prog_rejected = yes; then - # We found a bogon in the path, so make sure we never use it. - set dummy $ac_cv_prog_CC - shift - if test $@%:@ != 0; then - # We chose a different compiler from the bogus one. - # However, it has the same basename, so the bogon will be chosen - # first if we set CC to just the basename; use the full file name. - shift - ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@" - fi -fi -fi -fi -CC=$ac_cv_prog_CC -if test -n "$CC"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 -$as_echo "$CC" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - -fi -if test -z "$CC"; then - if test -n "$ac_tool_prefix"; then - for ac_prog in cl.exe - do - # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. -set dummy $ac_tool_prefix$ac_prog; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_CC+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$CC"; then - ac_cv_prog_CC="$CC" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_CC="$ac_tool_prefix$ac_prog" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -CC=$ac_cv_prog_CC -if test -n "$CC"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 -$as_echo "$CC" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - - test -n "$CC" && break - done -fi -if test -z "$CC"; then - ac_ct_CC=$CC - for ac_prog in cl.exe -do - # Extract the first word of "$ac_prog", so it can be a program name with args. -set dummy $ac_prog; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_ac_ct_CC+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$ac_ct_CC"; then - ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_ac_ct_CC="$ac_prog" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -ac_ct_CC=$ac_cv_prog_ac_ct_CC -if test -n "$ac_ct_CC"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 -$as_echo "$ac_ct_CC" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - - test -n "$ac_ct_CC" && break -done - - if test "x$ac_ct_CC" = x; then - CC="" - else - case $cross_compiling:$ac_tool_warned in -yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} -ac_tool_warned=yes ;; -esac - CC=$ac_ct_CC - fi -fi - -fi - - -test -z "$CC" && { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 -$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} -as_fn_error $? "no acceptable C compiler found in \$PATH -See \`config.log' for more details" "$LINENO" 5; } - -# Provide some information about the compiler. -$as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5 -set X $ac_compile -ac_compiler=$2 -for ac_option in --version -v -V -qversion; do - { { ac_try="$ac_compiler $ac_option >&5" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 - (eval "$ac_compiler $ac_option >&5") 2>conftest.err - ac_status=$? - if test -s conftest.err; then - sed '10a\ -... rest of stderr output deleted ... - 10q' conftest.err >conftest.er1 - cat conftest.er1 >&5 - fi - rm -f conftest.er1 conftest.err - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } -done - -cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -int -main () -{ - - ; - return 0; -} -_ACEOF -ac_clean_files_save=$ac_clean_files -ac_clean_files="$ac_clean_files a.out a.out.dSYM a.exe b.out" -# Try to create an executable without -o first, disregard a.out. -# It will help us diagnose broken compilers, and finding out an intuition -# of exeext. -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler works" >&5 -$as_echo_n "checking whether the C compiler works... " >&6; } -ac_link_default=`$as_echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'` - -# The possible output files: -ac_files="a.out conftest.exe conftest a.exe a_out.exe b.out conftest.*" - -ac_rmfiles= -for ac_file in $ac_files -do - case $ac_file in - *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; - * ) ac_rmfiles="$ac_rmfiles $ac_file";; - esac -done -rm -f $ac_rmfiles - -if { { ac_try="$ac_link_default" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 - (eval "$ac_link_default") 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; }; then : - # Autoconf-2.13 could set the ac_cv_exeext variable to `no'. -# So ignore a value of `no', otherwise this would lead to `EXEEXT = no' -# in a Makefile. We should not override ac_cv_exeext if it was cached, -# so that the user can short-circuit this test for compilers unknown to -# Autoconf. -for ac_file in $ac_files '' -do - test -f "$ac_file" || continue - case $ac_file in - *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) - ;; - [ab].out ) - # We found the default executable, but exeext='' is most - # certainly right. - break;; - *.* ) - if test "${ac_cv_exeext+set}" = set && test "$ac_cv_exeext" != no; - then :; else - ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` - fi - # We set ac_cv_exeext here because the later test for it is not - # safe: cross compilers may not add the suffix if given an `-o' - # argument, so we may need to know it at that point already. - # Even if this section looks crufty: it has the advantage of - # actually working. - break;; - * ) - break;; - esac -done -test "$ac_cv_exeext" = no && ac_cv_exeext= - -else - ac_file='' -fi -if test -z "$ac_file"; then : - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -$as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 -$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} -as_fn_error 77 "C compiler cannot create executables -See \`config.log' for more details" "$LINENO" 5; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; } -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler default output file name" >&5 -$as_echo_n "checking for C compiler default output file name... " >&6; } -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_file" >&5 -$as_echo "$ac_file" >&6; } -ac_exeext=$ac_cv_exeext - -rm -f -r a.out a.out.dSYM a.exe conftest$ac_cv_exeext b.out -ac_clean_files=$ac_clean_files_save -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of executables" >&5 -$as_echo_n "checking for suffix of executables... " >&6; } -if { { ac_try="$ac_link" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 - (eval "$ac_link") 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; }; then : - # If both `conftest.exe' and `conftest' are `present' (well, observable) -# catch `conftest.exe'. For instance with Cygwin, `ls conftest' will -# work properly (i.e., refer to `conftest.exe'), while it won't with -# `rm'. -for ac_file in conftest.exe conftest conftest.*; do - test -f "$ac_file" || continue - case $ac_file in - *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; - *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` - break;; - * ) break;; - esac -done -else - { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 -$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} -as_fn_error $? "cannot compute suffix of executables: cannot compile and link -See \`config.log' for more details" "$LINENO" 5; } -fi -rm -f conftest conftest$ac_cv_exeext -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_exeext" >&5 -$as_echo "$ac_cv_exeext" >&6; } - -rm -f conftest.$ac_ext -EXEEXT=$ac_cv_exeext -ac_exeext=$EXEEXT -cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -@%:@include -int -main () -{ -FILE *f = fopen ("conftest.out", "w"); - return ferror (f) || fclose (f) != 0; - - ; - return 0; -} -_ACEOF -ac_clean_files="$ac_clean_files conftest.out" -# Check that the compiler produces executables we can run. If not, either -# the compiler is broken, or we cross compile. -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are cross compiling" >&5 -$as_echo_n "checking whether we are cross compiling... " >&6; } -if test "$cross_compiling" != yes; then - { { ac_try="$ac_link" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 - (eval "$ac_link") 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } - if { ac_try='./conftest$ac_cv_exeext' - { { case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 - (eval "$ac_try") 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; }; }; then - cross_compiling=no - else - if test "$cross_compiling" = maybe; then - cross_compiling=yes - else - { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 -$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} -as_fn_error $? "cannot run C compiled programs. -If you meant to cross compile, use \`--host'. -See \`config.log' for more details" "$LINENO" 5; } - fi - fi -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $cross_compiling" >&5 -$as_echo "$cross_compiling" >&6; } - -rm -f conftest.$ac_ext conftest$ac_cv_exeext conftest.out -ac_clean_files=$ac_clean_files_save -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of object files" >&5 -$as_echo_n "checking for suffix of object files... " >&6; } -if ${ac_cv_objext+:} false; then : - $as_echo_n "(cached) " >&6 -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -int -main () -{ - - ; - return 0; -} -_ACEOF -rm -f conftest.o conftest.obj -if { { ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 - (eval "$ac_compile") 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; }; then : - for ac_file in conftest.o conftest.obj conftest.*; do - test -f "$ac_file" || continue; - case $ac_file in - *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM ) ;; - *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'` - break;; - esac -done -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 -$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} -as_fn_error $? "cannot compute suffix of object files: cannot compile -See \`config.log' for more details" "$LINENO" 5; } -fi -rm -f conftest.$ac_cv_objext conftest.$ac_ext -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_objext" >&5 -$as_echo "$ac_cv_objext" >&6; } -OBJEXT=$ac_cv_objext -ac_objext=$OBJEXT -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C compiler" >&5 -$as_echo_n "checking whether we are using the GNU C compiler... " >&6; } -if ${ac_cv_c_compiler_gnu+:} false; then : - $as_echo_n "(cached) " >&6 -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -int -main () -{ -#ifndef __GNUC__ - choke me -#endif - - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - ac_compiler_gnu=yes -else - ac_compiler_gnu=no -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -ac_cv_c_compiler_gnu=$ac_compiler_gnu - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5 -$as_echo "$ac_cv_c_compiler_gnu" >&6; } -if test $ac_compiler_gnu = yes; then - GCC=yes -else - GCC= -fi -ac_test_CFLAGS=${CFLAGS+set} -ac_save_CFLAGS=$CFLAGS -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5 -$as_echo_n "checking whether $CC accepts -g... " >&6; } -if ${ac_cv_prog_cc_g+:} false; then : - $as_echo_n "(cached) " >&6 -else - ac_save_c_werror_flag=$ac_c_werror_flag - ac_c_werror_flag=yes - ac_cv_prog_cc_g=no - CFLAGS="-g" - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -int -main () -{ - - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - ac_cv_prog_cc_g=yes -else - CFLAGS="" - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -int -main () -{ - - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - -else - ac_c_werror_flag=$ac_save_c_werror_flag - CFLAGS="-g" - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -int -main () -{ - - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - ac_cv_prog_cc_g=yes -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext - ac_c_werror_flag=$ac_save_c_werror_flag -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5 -$as_echo "$ac_cv_prog_cc_g" >&6; } -if test "$ac_test_CFLAGS" = set; then - CFLAGS=$ac_save_CFLAGS -elif test $ac_cv_prog_cc_g = yes; then - if test "$GCC" = yes; then - CFLAGS="-g -O2" - else - CFLAGS="-g" - fi -else - if test "$GCC" = yes; then - CFLAGS="-O2" - else - CFLAGS= - fi -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5 -$as_echo_n "checking for $CC option to accept ISO C89... " >&6; } -if ${ac_cv_prog_cc_c89+:} false; then : - $as_echo_n "(cached) " >&6 -else - ac_cv_prog_cc_c89=no -ac_save_CC=$CC -cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include -#include -struct stat; -/* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */ -struct buf { int x; }; -FILE * (*rcsopen) (struct buf *, struct stat *, int); -static char *e (p, i) - char **p; - int i; -{ - return p[i]; -} -static char *f (char * (*g) (char **, int), char **p, ...) -{ - char *s; - va_list v; - va_start (v,p); - s = g (p, va_arg (v,int)); - va_end (v); - return s; -} - -/* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has - function prototypes and stuff, but not '\xHH' hex character constants. - These don't provoke an error unfortunately, instead are silently treated - as 'x'. The following induces an error, until -std is added to get - proper ANSI mode. Curiously '\x00'!='x' always comes out true, for an - array size at least. It's necessary to write '\x00'==0 to get something - that's true only with -std. */ -int osf4_cc_array ['\x00' == 0 ? 1 : -1]; - -/* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters - inside strings and character constants. */ -#define FOO(x) 'x' -int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1]; - -int test (int i, double x); -struct s1 {int (*f) (int a);}; -struct s2 {int (*f) (double a);}; -int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int); -int argc; -char **argv; -int -main () -{ -return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]; - ; - return 0; -} -_ACEOF -for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \ - -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" -do - CC="$ac_save_CC $ac_arg" - if ac_fn_c_try_compile "$LINENO"; then : - ac_cv_prog_cc_c89=$ac_arg -fi -rm -f core conftest.err conftest.$ac_objext - test "x$ac_cv_prog_cc_c89" != "xno" && break -done -rm -f conftest.$ac_ext -CC=$ac_save_CC - -fi -# AC_CACHE_VAL -case "x$ac_cv_prog_cc_c89" in - x) - { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 -$as_echo "none needed" >&6; } ;; - xno) - { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 -$as_echo "unsupported" >&6; } ;; - *) - CC="$CC $ac_cv_prog_cc_c89" - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5 -$as_echo "$ac_cv_prog_cc_c89" >&6; } ;; -esac -if test "x$ac_cv_prog_cc_c89" != xno; then : - -fi - -ac_ext=c -ac_cpp='$CPP $CPPFLAGS' -ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_c_compiler_gnu -DEPDIR="${am__leading_dot}deps" - -ac_config_commands="$ac_config_commands depfiles" - - -am_make=${MAKE-make} -cat > confinc << 'END' -am__doit: - @echo this is the am__doit target -.PHONY: am__doit -END -# If we don't find an include directive, just comment out the code. -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for style of include used by $am_make" >&5 -$as_echo_n "checking for style of include used by $am_make... " >&6; } -am__include="#" -am__quote= -_am_result=none -# First try GNU make style include. -echo "include confinc" > confmf -# Ignore all kinds of additional output from `make'. -case `$am_make -s -f confmf 2> /dev/null` in #( -*the\ am__doit\ target*) - am__include=include - am__quote= - _am_result=GNU - ;; -esac -# Now try BSD make style include. -if test "$am__include" = "#"; then - echo '.include "confinc"' > confmf - case `$am_make -s -f confmf 2> /dev/null` in #( - *the\ am__doit\ target*) - am__include=.include - am__quote="\"" - _am_result=BSD - ;; - esac -fi - - -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $_am_result" >&5 -$as_echo "$_am_result" >&6; } -rm -f confinc confmf - -@%:@ Check whether --enable-dependency-tracking was given. -if test "${enable_dependency_tracking+set}" = set; then : - enableval=$enable_dependency_tracking; -fi - -if test "x$enable_dependency_tracking" != xno; then - am_depcomp="$ac_aux_dir/depcomp" - AMDEPBACKSLASH='\' - am__nodep='_no' -fi - if test "x$enable_dependency_tracking" != xno; then - AMDEP_TRUE= - AMDEP_FALSE='#' -else - AMDEP_TRUE='#' - AMDEP_FALSE= -fi - - - -depcc="$CC" am_compiler_list= - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5 -$as_echo_n "checking dependency style of $depcc... " >&6; } -if ${am_cv_CC_dependencies_compiler_type+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then - # We make a subdir and do the tests there. Otherwise we can end up - # making bogus files that we don't know about and never remove. For - # instance it was reported that on HP-UX the gcc test will end up - # making a dummy file named `D' -- because `-MD' means `put the output - # in D'. - rm -rf conftest.dir - mkdir conftest.dir - # Copy depcomp to subdir because otherwise we won't find it if we're - # using a relative directory. - cp "$am_depcomp" conftest.dir - cd conftest.dir - # We will build objects and dependencies in a subdirectory because - # it helps to detect inapplicable dependency modes. For instance - # both Tru64's cc and ICC support -MD to output dependencies as a - # side effect of compilation, but ICC will put the dependencies in - # the current directory while Tru64 will put them in the object - # directory. - mkdir sub - - am_cv_CC_dependencies_compiler_type=none - if test "$am_compiler_list" = ""; then - am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp` - fi - am__universal=false - case " $depcc " in #( - *\ -arch\ *\ -arch\ *) am__universal=true ;; - esac - - for depmode in $am_compiler_list; do - # Setup a source with many dependencies, because some compilers - # like to wrap large dependency lists on column 80 (with \), and - # we should not choose a depcomp mode which is confused by this. - # - # We need to recreate these files for each test, as the compiler may - # overwrite some of them when testing with obscure command lines. - # This happens at least with the AIX C compiler. - : > sub/conftest.c - for i in 1 2 3 4 5 6; do - echo '#include "conftst'$i'.h"' >> sub/conftest.c - # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with - # Solaris 8's {/usr,}/bin/sh. - touch sub/conftst$i.h - done - echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf - - # We check with `-c' and `-o' for the sake of the "dashmstdout" - # mode. It turns out that the SunPro C++ compiler does not properly - # handle `-M -o', and we need to detect this. Also, some Intel - # versions had trouble with output in subdirs - am__obj=sub/conftest.${OBJEXT-o} - am__minus_obj="-o $am__obj" - case $depmode in - gcc) - # This depmode causes a compiler race in universal mode. - test "$am__universal" = false || continue - ;; - nosideeffect) - # after this tag, mechanisms are not by side-effect, so they'll - # only be used when explicitly requested - if test "x$enable_dependency_tracking" = xyes; then - continue - else - break - fi - ;; - msvc7 | msvc7msys | msvisualcpp | msvcmsys) - # This compiler won't grok `-c -o', but also, the minuso test has - # not run yet. These depmodes are late enough in the game, and - # so weak that their functioning should not be impacted. - am__obj=conftest.${OBJEXT-o} - am__minus_obj= - ;; - none) break ;; - esac - if depmode=$depmode \ - source=sub/conftest.c object=$am__obj \ - depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ - $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ - >/dev/null 2>conftest.err && - grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && - grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && - grep $am__obj sub/conftest.Po > /dev/null 2>&1 && - ${MAKE-make} -s -f confmf > /dev/null 2>&1; then - # icc doesn't choke on unknown options, it will just issue warnings - # or remarks (even with -Werror). So we grep stderr for any message - # that says an option was ignored or not supported. - # When given -MP, icc 7.0 and 7.1 complain thusly: - # icc: Command line warning: ignoring option '-M'; no argument required - # The diagnosis changed in icc 8.0: - # icc: Command line remark: option '-MP' not supported - if (grep 'ignoring option' conftest.err || - grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else - am_cv_CC_dependencies_compiler_type=$depmode - break - fi - fi - done - - cd .. - rm -rf conftest.dir -else - am_cv_CC_dependencies_compiler_type=none -fi - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_CC_dependencies_compiler_type" >&5 -$as_echo "$am_cv_CC_dependencies_compiler_type" >&6; } -CCDEPMODE=depmode=$am_cv_CC_dependencies_compiler_type - - if - test "x$enable_dependency_tracking" != xno \ - && test "$am_cv_CC_dependencies_compiler_type" = gcc3; then - am__fastdepCC_TRUE= - am__fastdepCC_FALSE='#' -else - am__fastdepCC_TRUE='#' - am__fastdepCC_FALSE= -fi - - -if test "x$CC" != xcc; then - { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC and cc understand -c and -o together" >&5 -$as_echo_n "checking whether $CC and cc understand -c and -o together... " >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether cc understands -c and -o together" >&5 -$as_echo_n "checking whether cc understands -c and -o together... " >&6; } -fi -set dummy $CC; ac_cc=`$as_echo "$2" | - sed 's/[^a-zA-Z0-9_]/_/g;s/^[0-9]/_/'` -if eval \${ac_cv_prog_cc_${ac_cc}_c_o+:} false; then : - $as_echo_n "(cached) " >&6 -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -int -main () -{ - - ; - return 0; -} -_ACEOF -# Make sure it works both with $CC and with simple cc. -# We do the test twice because some compilers refuse to overwrite an -# existing .o file with -o, though they will create one. -ac_try='$CC -c conftest.$ac_ext -o conftest2.$ac_objext >&5' -rm -f conftest2.* -if { { case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 - (eval "$ac_try") 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } && - test -f conftest2.$ac_objext && { { case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 - (eval "$ac_try") 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; }; -then - eval ac_cv_prog_cc_${ac_cc}_c_o=yes - if test "x$CC" != xcc; then - # Test first that cc exists at all. - if { ac_try='cc -c conftest.$ac_ext >&5' - { { case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 - (eval "$ac_try") 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; }; }; then - ac_try='cc -c conftest.$ac_ext -o conftest2.$ac_objext >&5' - rm -f conftest2.* - if { { case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 - (eval "$ac_try") 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } && - test -f conftest2.$ac_objext && { { case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 - (eval "$ac_try") 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; }; - then - # cc works too. - : - else - # cc exists but doesn't like -o. - eval ac_cv_prog_cc_${ac_cc}_c_o=no - fi - fi - fi -else - eval ac_cv_prog_cc_${ac_cc}_c_o=no -fi -rm -f core conftest* - -fi -if eval test \$ac_cv_prog_cc_${ac_cc}_c_o = yes; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } - -$as_echo "@%:@define NO_MINUS_C_MINUS_O 1" >>confdefs.h - -fi - -# FIXME: we rely on the cache variable name because -# there is no other way. -set dummy $CC -am_cc=`echo $2 | sed 's/[^a-zA-Z0-9_]/_/g;s/^[0-9]/_/'` -eval am_t=\$ac_cv_prog_cc_${am_cc}_c_o -if test "$am_t" != yes; then - # Losing compiler, so override with the script. - # FIXME: It is wrong to rewrite CC. - # But if we don't then we get into trouble of one sort or another. - # A longer-term fix would be to have automake use am__CC in this case, - # and then we could set am__CC="\$(top_srcdir)/compile \$(CC)" - CC="$am_aux_dir/compile $CC" -fi - - -ac_ext=cpp -ac_cpp='$CXXCPP $CPPFLAGS' -ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_cxx_compiler_gnu -if test -z "$CXX"; then - if test -n "$CCC"; then - CXX=$CCC - else - if test -n "$ac_tool_prefix"; then - for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC - do - # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. -set dummy $ac_tool_prefix$ac_prog; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_CXX+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$CXX"; then - ac_cv_prog_CXX="$CXX" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_CXX="$ac_tool_prefix$ac_prog" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -CXX=$ac_cv_prog_CXX -if test -n "$CXX"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CXX" >&5 -$as_echo "$CXX" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - - test -n "$CXX" && break - done -fi -if test -z "$CXX"; then - ac_ct_CXX=$CXX - for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC -do - # Extract the first word of "$ac_prog", so it can be a program name with args. -set dummy $ac_prog; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_ac_ct_CXX+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$ac_ct_CXX"; then - ac_cv_prog_ac_ct_CXX="$ac_ct_CXX" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_ac_ct_CXX="$ac_prog" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -ac_ct_CXX=$ac_cv_prog_ac_ct_CXX -if test -n "$ac_ct_CXX"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CXX" >&5 -$as_echo "$ac_ct_CXX" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - - test -n "$ac_ct_CXX" && break -done - - if test "x$ac_ct_CXX" = x; then - CXX="g++" - else - case $cross_compiling:$ac_tool_warned in -yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} -ac_tool_warned=yes ;; -esac - CXX=$ac_ct_CXX - fi -fi - - fi -fi -# Provide some information about the compiler. -$as_echo "$as_me:${as_lineno-$LINENO}: checking for C++ compiler version" >&5 -set X $ac_compile -ac_compiler=$2 -for ac_option in --version -v -V -qversion; do - { { ac_try="$ac_compiler $ac_option >&5" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 - (eval "$ac_compiler $ac_option >&5") 2>conftest.err - ac_status=$? - if test -s conftest.err; then - sed '10a\ -... rest of stderr output deleted ... - 10q' conftest.err >conftest.er1 - cat conftest.er1 >&5 - fi - rm -f conftest.er1 conftest.err - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } -done - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C++ compiler" >&5 -$as_echo_n "checking whether we are using the GNU C++ compiler... " >&6; } -if ${ac_cv_cxx_compiler_gnu+:} false; then : - $as_echo_n "(cached) " >&6 -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -int -main () -{ -#ifndef __GNUC__ - choke me -#endif - - ; - return 0; -} -_ACEOF -if ac_fn_cxx_try_compile "$LINENO"; then : - ac_compiler_gnu=yes -else - ac_compiler_gnu=no -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -ac_cv_cxx_compiler_gnu=$ac_compiler_gnu - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_cxx_compiler_gnu" >&5 -$as_echo "$ac_cv_cxx_compiler_gnu" >&6; } -if test $ac_compiler_gnu = yes; then - GXX=yes -else - GXX= -fi -ac_test_CXXFLAGS=${CXXFLAGS+set} -ac_save_CXXFLAGS=$CXXFLAGS -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CXX accepts -g" >&5 -$as_echo_n "checking whether $CXX accepts -g... " >&6; } -if ${ac_cv_prog_cxx_g+:} false; then : - $as_echo_n "(cached) " >&6 -else - ac_save_cxx_werror_flag=$ac_cxx_werror_flag - ac_cxx_werror_flag=yes - ac_cv_prog_cxx_g=no - CXXFLAGS="-g" - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -int -main () -{ - - ; - return 0; -} -_ACEOF -if ac_fn_cxx_try_compile "$LINENO"; then : - ac_cv_prog_cxx_g=yes -else - CXXFLAGS="" - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -int -main () -{ - - ; - return 0; -} -_ACEOF -if ac_fn_cxx_try_compile "$LINENO"; then : - -else - ac_cxx_werror_flag=$ac_save_cxx_werror_flag - CXXFLAGS="-g" - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -int -main () -{ - - ; - return 0; -} -_ACEOF -if ac_fn_cxx_try_compile "$LINENO"; then : - ac_cv_prog_cxx_g=yes -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext - ac_cxx_werror_flag=$ac_save_cxx_werror_flag -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cxx_g" >&5 -$as_echo "$ac_cv_prog_cxx_g" >&6; } -if test "$ac_test_CXXFLAGS" = set; then - CXXFLAGS=$ac_save_CXXFLAGS -elif test $ac_cv_prog_cxx_g = yes; then - if test "$GXX" = yes; then - CXXFLAGS="-g -O2" - else - CXXFLAGS="-g" - fi -else - if test "$GXX" = yes; then - CXXFLAGS="-O2" - else - CXXFLAGS= - fi -fi -ac_ext=c -ac_cpp='$CPP $CPPFLAGS' -ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_c_compiler_gnu - -depcc="$CXX" am_compiler_list= - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5 -$as_echo_n "checking dependency style of $depcc... " >&6; } -if ${am_cv_CXX_dependencies_compiler_type+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then - # We make a subdir and do the tests there. Otherwise we can end up - # making bogus files that we don't know about and never remove. For - # instance it was reported that on HP-UX the gcc test will end up - # making a dummy file named `D' -- because `-MD' means `put the output - # in D'. - rm -rf conftest.dir - mkdir conftest.dir - # Copy depcomp to subdir because otherwise we won't find it if we're - # using a relative directory. - cp "$am_depcomp" conftest.dir - cd conftest.dir - # We will build objects and dependencies in a subdirectory because - # it helps to detect inapplicable dependency modes. For instance - # both Tru64's cc and ICC support -MD to output dependencies as a - # side effect of compilation, but ICC will put the dependencies in - # the current directory while Tru64 will put them in the object - # directory. - mkdir sub - - am_cv_CXX_dependencies_compiler_type=none - if test "$am_compiler_list" = ""; then - am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp` - fi - am__universal=false - case " $depcc " in #( - *\ -arch\ *\ -arch\ *) am__universal=true ;; - esac - - for depmode in $am_compiler_list; do - # Setup a source with many dependencies, because some compilers - # like to wrap large dependency lists on column 80 (with \), and - # we should not choose a depcomp mode which is confused by this. - # - # We need to recreate these files for each test, as the compiler may - # overwrite some of them when testing with obscure command lines. - # This happens at least with the AIX C compiler. - : > sub/conftest.c - for i in 1 2 3 4 5 6; do - echo '#include "conftst'$i'.h"' >> sub/conftest.c - # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with - # Solaris 8's {/usr,}/bin/sh. - touch sub/conftst$i.h - done - echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf - - # We check with `-c' and `-o' for the sake of the "dashmstdout" - # mode. It turns out that the SunPro C++ compiler does not properly - # handle `-M -o', and we need to detect this. Also, some Intel - # versions had trouble with output in subdirs - am__obj=sub/conftest.${OBJEXT-o} - am__minus_obj="-o $am__obj" - case $depmode in - gcc) - # This depmode causes a compiler race in universal mode. - test "$am__universal" = false || continue - ;; - nosideeffect) - # after this tag, mechanisms are not by side-effect, so they'll - # only be used when explicitly requested - if test "x$enable_dependency_tracking" = xyes; then - continue - else - break - fi - ;; - msvc7 | msvc7msys | msvisualcpp | msvcmsys) - # This compiler won't grok `-c -o', but also, the minuso test has - # not run yet. These depmodes are late enough in the game, and - # so weak that their functioning should not be impacted. - am__obj=conftest.${OBJEXT-o} - am__minus_obj= - ;; - none) break ;; - esac - if depmode=$depmode \ - source=sub/conftest.c object=$am__obj \ - depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ - $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ - >/dev/null 2>conftest.err && - grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && - grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && - grep $am__obj sub/conftest.Po > /dev/null 2>&1 && - ${MAKE-make} -s -f confmf > /dev/null 2>&1; then - # icc doesn't choke on unknown options, it will just issue warnings - # or remarks (even with -Werror). So we grep stderr for any message - # that says an option was ignored or not supported. - # When given -MP, icc 7.0 and 7.1 complain thusly: - # icc: Command line warning: ignoring option '-M'; no argument required - # The diagnosis changed in icc 8.0: - # icc: Command line remark: option '-MP' not supported - if (grep 'ignoring option' conftest.err || - grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else - am_cv_CXX_dependencies_compiler_type=$depmode - break - fi - fi - done - - cd .. - rm -rf conftest.dir -else - am_cv_CXX_dependencies_compiler_type=none -fi - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_CXX_dependencies_compiler_type" >&5 -$as_echo "$am_cv_CXX_dependencies_compiler_type" >&6; } -CXXDEPMODE=depmode=$am_cv_CXX_dependencies_compiler_type - - if - test "x$enable_dependency_tracking" != xno \ - && test "$am_cv_CXX_dependencies_compiler_type" = gcc3; then - am__fastdepCXX_TRUE= - am__fastdepCXX_FALSE='#' -else - am__fastdepCXX_TRUE='#' - am__fastdepCXX_FALSE= -fi - - - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ln -s works" >&5 -$as_echo_n "checking whether ln -s works... " >&6; } -LN_S=$as_ln_s -if test "$LN_S" = "ln -s"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no, using $LN_S" >&5 -$as_echo "no, using $LN_S" >&6; } -fi - - -# AC_DISABLE_SHARED -case `pwd` in - *\ * | *\ *) - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Libtool does not cope well with whitespace in \`pwd\`" >&5 -$as_echo "$as_me: WARNING: Libtool does not cope well with whitespace in \`pwd\`" >&2;} ;; -esac - - - -macro_version='2.4.2' -macro_revision='1.3337' - - - - - - - - - - - - - -ltmain="$ac_aux_dir/ltmain.sh" - -# Make sure we can run config.sub. -$SHELL "$ac_aux_dir/config.sub" sun4 >/dev/null 2>&1 || - as_fn_error $? "cannot run $SHELL $ac_aux_dir/config.sub" "$LINENO" 5 - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking build system type" >&5 -$as_echo_n "checking build system type... " >&6; } -if ${ac_cv_build+:} false; then : - $as_echo_n "(cached) " >&6 -else - ac_build_alias=$build_alias -test "x$ac_build_alias" = x && - ac_build_alias=`$SHELL "$ac_aux_dir/config.guess"` -test "x$ac_build_alias" = x && - as_fn_error $? "cannot guess build type; you must specify one" "$LINENO" 5 -ac_cv_build=`$SHELL "$ac_aux_dir/config.sub" $ac_build_alias` || - as_fn_error $? "$SHELL $ac_aux_dir/config.sub $ac_build_alias failed" "$LINENO" 5 - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_build" >&5 -$as_echo "$ac_cv_build" >&6; } -case $ac_cv_build in -*-*-*) ;; -*) as_fn_error $? "invalid value of canonical build" "$LINENO" 5;; -esac -build=$ac_cv_build -ac_save_IFS=$IFS; IFS='-' -set x $ac_cv_build -shift -build_cpu=$1 -build_vendor=$2 -shift; shift -# Remember, the first character of IFS is used to create $*, -# except with old shells: -build_os=$* -IFS=$ac_save_IFS -case $build_os in *\ *) build_os=`echo "$build_os" | sed 's/ /-/g'`;; esac - - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking host system type" >&5 -$as_echo_n "checking host system type... " >&6; } -if ${ac_cv_host+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test "x$host_alias" = x; then - ac_cv_host=$ac_cv_build -else - ac_cv_host=`$SHELL "$ac_aux_dir/config.sub" $host_alias` || - as_fn_error $? "$SHELL $ac_aux_dir/config.sub $host_alias failed" "$LINENO" 5 -fi - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_host" >&5 -$as_echo "$ac_cv_host" >&6; } -case $ac_cv_host in -*-*-*) ;; -*) as_fn_error $? "invalid value of canonical host" "$LINENO" 5;; -esac -host=$ac_cv_host -ac_save_IFS=$IFS; IFS='-' -set x $ac_cv_host -shift -host_cpu=$1 -host_vendor=$2 -shift; shift -# Remember, the first character of IFS is used to create $*, -# except with old shells: -host_os=$* -IFS=$ac_save_IFS -case $host_os in *\ *) host_os=`echo "$host_os" | sed 's/ /-/g'`;; esac - - -# Backslashify metacharacters that are still active within -# double-quoted strings. -sed_quote_subst='s/\(["`$\\]\)/\\\1/g' - -# Same as above, but do not quote variable references. -double_quote_subst='s/\(["`\\]\)/\\\1/g' - -# Sed substitution to delay expansion of an escaped shell variable in a -# double_quote_subst'ed string. -delay_variable_subst='s/\\\\\\\\\\\$/\\\\\\$/g' - -# Sed substitution to delay expansion of an escaped single quote. -delay_single_quote_subst='s/'\''/'\'\\\\\\\'\''/g' - -# Sed substitution to avoid accidental globbing in evaled expressions -no_glob_subst='s/\*/\\\*/g' - -ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' -ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO -ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO$ECHO - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to print strings" >&5 -$as_echo_n "checking how to print strings... " >&6; } -# Test print first, because it will be a builtin if present. -if test "X`( print -r -- -n ) 2>/dev/null`" = X-n && \ - test "X`print -r -- $ECHO 2>/dev/null`" = "X$ECHO"; then - ECHO='print -r --' -elif test "X`printf %s $ECHO 2>/dev/null`" = "X$ECHO"; then - ECHO='printf %s\n' -else - # Use this function as a fallback that always works. - func_fallback_echo () - { - eval 'cat <<_LTECHO_EOF -$1 -_LTECHO_EOF' - } - ECHO='func_fallback_echo' -fi - -# func_echo_all arg... -# Invoke $ECHO with all args, space-separated. -func_echo_all () -{ - $ECHO "" -} - -case "$ECHO" in - printf*) { $as_echo "$as_me:${as_lineno-$LINENO}: result: printf" >&5 -$as_echo "printf" >&6; } ;; - print*) { $as_echo "$as_me:${as_lineno-$LINENO}: result: print -r" >&5 -$as_echo "print -r" >&6; } ;; - *) { $as_echo "$as_me:${as_lineno-$LINENO}: result: cat" >&5 -$as_echo "cat" >&6; } ;; -esac - - - - - - - - - - - - - - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a sed that does not truncate output" >&5 -$as_echo_n "checking for a sed that does not truncate output... " >&6; } -if ${ac_cv_path_SED+:} false; then : - $as_echo_n "(cached) " >&6 -else - ac_script=s/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb/ - for ac_i in 1 2 3 4 5 6 7; do - ac_script="$ac_script$as_nl$ac_script" - done - echo "$ac_script" 2>/dev/null | sed 99q >conftest.sed - { ac_script=; unset ac_script;} - if test -z "$SED"; then - ac_path_SED_found=false - # Loop through the user's path and test for each of PROGNAME-LIST - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_prog in sed gsed; do - for ac_exec_ext in '' $ac_executable_extensions; do - ac_path_SED="$as_dir/$ac_prog$ac_exec_ext" - as_fn_executable_p "$ac_path_SED" || continue -# Check for GNU ac_path_SED and select it if it is found. - # Check for GNU $ac_path_SED -case `"$ac_path_SED" --version 2>&1` in -*GNU*) - ac_cv_path_SED="$ac_path_SED" ac_path_SED_found=:;; -*) - ac_count=0 - $as_echo_n 0123456789 >"conftest.in" - while : - do - cat "conftest.in" "conftest.in" >"conftest.tmp" - mv "conftest.tmp" "conftest.in" - cp "conftest.in" "conftest.nl" - $as_echo '' >> "conftest.nl" - "$ac_path_SED" -f conftest.sed < "conftest.nl" >"conftest.out" 2>/dev/null || break - diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break - as_fn_arith $ac_count + 1 && ac_count=$as_val - if test $ac_count -gt ${ac_path_SED_max-0}; then - # Best one so far, save it but keep looking for a better one - ac_cv_path_SED="$ac_path_SED" - ac_path_SED_max=$ac_count - fi - # 10*(2^10) chars as input seems more than enough - test $ac_count -gt 10 && break - done - rm -f conftest.in conftest.tmp conftest.nl conftest.out;; -esac - - $ac_path_SED_found && break 3 - done - done - done -IFS=$as_save_IFS - if test -z "$ac_cv_path_SED"; then - as_fn_error $? "no acceptable sed could be found in \$PATH" "$LINENO" 5 - fi -else - ac_cv_path_SED=$SED -fi - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_SED" >&5 -$as_echo "$ac_cv_path_SED" >&6; } - SED="$ac_cv_path_SED" - rm -f conftest.sed - -test -z "$SED" && SED=sed -Xsed="$SED -e 1s/^X//" - - - - - - - - - - - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for grep that handles long lines and -e" >&5 -$as_echo_n "checking for grep that handles long lines and -e... " >&6; } -if ${ac_cv_path_GREP+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -z "$GREP"; then - ac_path_GREP_found=false - # Loop through the user's path and test for each of PROGNAME-LIST - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_prog in grep ggrep; do - for ac_exec_ext in '' $ac_executable_extensions; do - ac_path_GREP="$as_dir/$ac_prog$ac_exec_ext" - as_fn_executable_p "$ac_path_GREP" || continue -# Check for GNU ac_path_GREP and select it if it is found. - # Check for GNU $ac_path_GREP -case `"$ac_path_GREP" --version 2>&1` in -*GNU*) - ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_found=:;; -*) - ac_count=0 - $as_echo_n 0123456789 >"conftest.in" - while : - do - cat "conftest.in" "conftest.in" >"conftest.tmp" - mv "conftest.tmp" "conftest.in" - cp "conftest.in" "conftest.nl" - $as_echo 'GREP' >> "conftest.nl" - "$ac_path_GREP" -e 'GREP$' -e '-(cannot match)-' < "conftest.nl" >"conftest.out" 2>/dev/null || break - diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break - as_fn_arith $ac_count + 1 && ac_count=$as_val - if test $ac_count -gt ${ac_path_GREP_max-0}; then - # Best one so far, save it but keep looking for a better one - ac_cv_path_GREP="$ac_path_GREP" - ac_path_GREP_max=$ac_count - fi - # 10*(2^10) chars as input seems more than enough - test $ac_count -gt 10 && break - done - rm -f conftest.in conftest.tmp conftest.nl conftest.out;; -esac - - $ac_path_GREP_found && break 3 - done - done - done -IFS=$as_save_IFS - if test -z "$ac_cv_path_GREP"; then - as_fn_error $? "no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 - fi -else - ac_cv_path_GREP=$GREP -fi - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_GREP" >&5 -$as_echo "$ac_cv_path_GREP" >&6; } - GREP="$ac_cv_path_GREP" - - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for egrep" >&5 -$as_echo_n "checking for egrep... " >&6; } -if ${ac_cv_path_EGREP+:} false; then : - $as_echo_n "(cached) " >&6 -else - if echo a | $GREP -E '(a|b)' >/dev/null 2>&1 - then ac_cv_path_EGREP="$GREP -E" - else - if test -z "$EGREP"; then - ac_path_EGREP_found=false - # Loop through the user's path and test for each of PROGNAME-LIST - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_prog in egrep; do - for ac_exec_ext in '' $ac_executable_extensions; do - ac_path_EGREP="$as_dir/$ac_prog$ac_exec_ext" - as_fn_executable_p "$ac_path_EGREP" || continue -# Check for GNU ac_path_EGREP and select it if it is found. - # Check for GNU $ac_path_EGREP -case `"$ac_path_EGREP" --version 2>&1` in -*GNU*) - ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_found=:;; -*) - ac_count=0 - $as_echo_n 0123456789 >"conftest.in" - while : - do - cat "conftest.in" "conftest.in" >"conftest.tmp" - mv "conftest.tmp" "conftest.in" - cp "conftest.in" "conftest.nl" - $as_echo 'EGREP' >> "conftest.nl" - "$ac_path_EGREP" 'EGREP$' < "conftest.nl" >"conftest.out" 2>/dev/null || break - diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break - as_fn_arith $ac_count + 1 && ac_count=$as_val - if test $ac_count -gt ${ac_path_EGREP_max-0}; then - # Best one so far, save it but keep looking for a better one - ac_cv_path_EGREP="$ac_path_EGREP" - ac_path_EGREP_max=$ac_count - fi - # 10*(2^10) chars as input seems more than enough - test $ac_count -gt 10 && break - done - rm -f conftest.in conftest.tmp conftest.nl conftest.out;; -esac - - $ac_path_EGREP_found && break 3 - done - done - done -IFS=$as_save_IFS - if test -z "$ac_cv_path_EGREP"; then - as_fn_error $? "no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 - fi -else - ac_cv_path_EGREP=$EGREP -fi - - fi -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_EGREP" >&5 -$as_echo "$ac_cv_path_EGREP" >&6; } - EGREP="$ac_cv_path_EGREP" - - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for fgrep" >&5 -$as_echo_n "checking for fgrep... " >&6; } -if ${ac_cv_path_FGREP+:} false; then : - $as_echo_n "(cached) " >&6 -else - if echo 'ab*c' | $GREP -F 'ab*c' >/dev/null 2>&1 - then ac_cv_path_FGREP="$GREP -F" - else - if test -z "$FGREP"; then - ac_path_FGREP_found=false - # Loop through the user's path and test for each of PROGNAME-LIST - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_prog in fgrep; do - for ac_exec_ext in '' $ac_executable_extensions; do - ac_path_FGREP="$as_dir/$ac_prog$ac_exec_ext" - as_fn_executable_p "$ac_path_FGREP" || continue -# Check for GNU ac_path_FGREP and select it if it is found. - # Check for GNU $ac_path_FGREP -case `"$ac_path_FGREP" --version 2>&1` in -*GNU*) - ac_cv_path_FGREP="$ac_path_FGREP" ac_path_FGREP_found=:;; -*) - ac_count=0 - $as_echo_n 0123456789 >"conftest.in" - while : - do - cat "conftest.in" "conftest.in" >"conftest.tmp" - mv "conftest.tmp" "conftest.in" - cp "conftest.in" "conftest.nl" - $as_echo 'FGREP' >> "conftest.nl" - "$ac_path_FGREP" FGREP < "conftest.nl" >"conftest.out" 2>/dev/null || break - diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break - as_fn_arith $ac_count + 1 && ac_count=$as_val - if test $ac_count -gt ${ac_path_FGREP_max-0}; then - # Best one so far, save it but keep looking for a better one - ac_cv_path_FGREP="$ac_path_FGREP" - ac_path_FGREP_max=$ac_count - fi - # 10*(2^10) chars as input seems more than enough - test $ac_count -gt 10 && break - done - rm -f conftest.in conftest.tmp conftest.nl conftest.out;; -esac - - $ac_path_FGREP_found && break 3 - done - done - done -IFS=$as_save_IFS - if test -z "$ac_cv_path_FGREP"; then - as_fn_error $? "no acceptable fgrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 - fi -else - ac_cv_path_FGREP=$FGREP -fi - - fi -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_FGREP" >&5 -$as_echo "$ac_cv_path_FGREP" >&6; } - FGREP="$ac_cv_path_FGREP" - - -test -z "$GREP" && GREP=grep - - - - - - - - - - - - - - - - - - - -@%:@ Check whether --with-gnu-ld was given. -if test "${with_gnu_ld+set}" = set; then : - withval=$with_gnu_ld; test "$withval" = no || with_gnu_ld=yes -else - with_gnu_ld=no -fi - -ac_prog=ld -if test "$GCC" = yes; then - # Check if gcc -print-prog-name=ld gives a path. - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ld used by $CC" >&5 -$as_echo_n "checking for ld used by $CC... " >&6; } - case $host in - *-*-mingw*) - # gcc leaves a trailing carriage return which upsets mingw - ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;; - *) - ac_prog=`($CC -print-prog-name=ld) 2>&5` ;; - esac - case $ac_prog in - # Accept absolute paths. - [\\/]* | ?:[\\/]*) - re_direlt='/[^/][^/]*/\.\./' - # Canonicalize the pathname of ld - ac_prog=`$ECHO "$ac_prog"| $SED 's%\\\\%/%g'` - while $ECHO "$ac_prog" | $GREP "$re_direlt" > /dev/null 2>&1; do - ac_prog=`$ECHO $ac_prog| $SED "s%$re_direlt%/%"` - done - test -z "$LD" && LD="$ac_prog" - ;; - "") - # If it fails, then pretend we aren't using GCC. - ac_prog=ld - ;; - *) - # If it is relative, then search for the first ld in PATH. - with_gnu_ld=unknown - ;; - esac -elif test "$with_gnu_ld" = yes; then - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU ld" >&5 -$as_echo_n "checking for GNU ld... " >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for non-GNU ld" >&5 -$as_echo_n "checking for non-GNU ld... " >&6; } -fi -if ${lt_cv_path_LD+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -z "$LD"; then - lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR - for ac_dir in $PATH; do - IFS="$lt_save_ifs" - test -z "$ac_dir" && ac_dir=. - if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then - lt_cv_path_LD="$ac_dir/$ac_prog" - # Check to see if the program is GNU ld. I'd rather use --version, - # but apparently some variants of GNU ld only accept -v. - # Break only if it was the GNU/non-GNU ld that we prefer. - case `"$lt_cv_path_LD" -v 2>&1 &5 -$as_echo "$LD" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi -test -z "$LD" && as_fn_error $? "no acceptable ld found in \$PATH" "$LINENO" 5 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if the linker ($LD) is GNU ld" >&5 -$as_echo_n "checking if the linker ($LD) is GNU ld... " >&6; } -if ${lt_cv_prog_gnu_ld+:} false; then : - $as_echo_n "(cached) " >&6 -else - # I'd rather use --version here, but apparently some GNU lds only accept -v. -case `$LD -v 2>&1 &5 -$as_echo "$lt_cv_prog_gnu_ld" >&6; } -with_gnu_ld=$lt_cv_prog_gnu_ld - - - - - - - - - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for BSD- or MS-compatible name lister (nm)" >&5 -$as_echo_n "checking for BSD- or MS-compatible name lister (nm)... " >&6; } -if ${lt_cv_path_NM+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$NM"; then - # Let the user override the test. - lt_cv_path_NM="$NM" -else - lt_nm_to_check="${ac_tool_prefix}nm" - if test -n "$ac_tool_prefix" && test "$build" = "$host"; then - lt_nm_to_check="$lt_nm_to_check nm" - fi - for lt_tmp_nm in $lt_nm_to_check; do - lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR - for ac_dir in $PATH /usr/ccs/bin/elf /usr/ccs/bin /usr/ucb /bin; do - IFS="$lt_save_ifs" - test -z "$ac_dir" && ac_dir=. - tmp_nm="$ac_dir/$lt_tmp_nm" - if test -f "$tmp_nm" || test -f "$tmp_nm$ac_exeext" ; then - # Check to see if the nm accepts a BSD-compat flag. - # Adding the `sed 1q' prevents false positives on HP-UX, which says: - # nm: unknown option "B" ignored - # Tru64's nm complains that /dev/null is an invalid object file - case `"$tmp_nm" -B /dev/null 2>&1 | sed '1q'` in - */dev/null* | *'Invalid file or object type'*) - lt_cv_path_NM="$tmp_nm -B" - break - ;; - *) - case `"$tmp_nm" -p /dev/null 2>&1 | sed '1q'` in - */dev/null*) - lt_cv_path_NM="$tmp_nm -p" - break - ;; - *) - lt_cv_path_NM=${lt_cv_path_NM="$tmp_nm"} # keep the first match, but - continue # so that we can try to find one that supports BSD flags - ;; - esac - ;; - esac - fi - done - IFS="$lt_save_ifs" - done - : ${lt_cv_path_NM=no} -fi -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_path_NM" >&5 -$as_echo "$lt_cv_path_NM" >&6; } -if test "$lt_cv_path_NM" != "no"; then - NM="$lt_cv_path_NM" -else - # Didn't find any BSD compatible name lister, look for dumpbin. - if test -n "$DUMPBIN"; then : - # Let the user override the test. - else - if test -n "$ac_tool_prefix"; then - for ac_prog in dumpbin "link -dump" - do - # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. -set dummy $ac_tool_prefix$ac_prog; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_DUMPBIN+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$DUMPBIN"; then - ac_cv_prog_DUMPBIN="$DUMPBIN" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_DUMPBIN="$ac_tool_prefix$ac_prog" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -DUMPBIN=$ac_cv_prog_DUMPBIN -if test -n "$DUMPBIN"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DUMPBIN" >&5 -$as_echo "$DUMPBIN" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - - test -n "$DUMPBIN" && break - done -fi -if test -z "$DUMPBIN"; then - ac_ct_DUMPBIN=$DUMPBIN - for ac_prog in dumpbin "link -dump" -do - # Extract the first word of "$ac_prog", so it can be a program name with args. -set dummy $ac_prog; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_ac_ct_DUMPBIN+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$ac_ct_DUMPBIN"; then - ac_cv_prog_ac_ct_DUMPBIN="$ac_ct_DUMPBIN" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_ac_ct_DUMPBIN="$ac_prog" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -ac_ct_DUMPBIN=$ac_cv_prog_ac_ct_DUMPBIN -if test -n "$ac_ct_DUMPBIN"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DUMPBIN" >&5 -$as_echo "$ac_ct_DUMPBIN" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - - test -n "$ac_ct_DUMPBIN" && break -done - - if test "x$ac_ct_DUMPBIN" = x; then - DUMPBIN=":" - else - case $cross_compiling:$ac_tool_warned in -yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} -ac_tool_warned=yes ;; -esac - DUMPBIN=$ac_ct_DUMPBIN - fi -fi - - case `$DUMPBIN -symbols /dev/null 2>&1 | sed '1q'` in - *COFF*) - DUMPBIN="$DUMPBIN -symbols" - ;; - *) - DUMPBIN=: - ;; - esac - fi - - if test "$DUMPBIN" != ":"; then - NM="$DUMPBIN" - fi -fi -test -z "$NM" && NM=nm - - - - - - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking the name lister ($NM) interface" >&5 -$as_echo_n "checking the name lister ($NM) interface... " >&6; } -if ${lt_cv_nm_interface+:} false; then : - $as_echo_n "(cached) " >&6 -else - lt_cv_nm_interface="BSD nm" - echo "int some_variable = 0;" > conftest.$ac_ext - (eval echo "\"\$as_me:$LINENO: $ac_compile\"" >&5) - (eval "$ac_compile" 2>conftest.err) - cat conftest.err >&5 - (eval echo "\"\$as_me:$LINENO: $NM \\\"conftest.$ac_objext\\\"\"" >&5) - (eval "$NM \"conftest.$ac_objext\"" 2>conftest.err > conftest.out) - cat conftest.err >&5 - (eval echo "\"\$as_me:$LINENO: output\"" >&5) - cat conftest.out >&5 - if $GREP 'External.*some_variable' conftest.out > /dev/null; then - lt_cv_nm_interface="MS dumpbin" - fi - rm -f conftest* -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_nm_interface" >&5 -$as_echo "$lt_cv_nm_interface" >&6; } - -# find the maximum length of command line arguments -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking the maximum length of command line arguments" >&5 -$as_echo_n "checking the maximum length of command line arguments... " >&6; } -if ${lt_cv_sys_max_cmd_len+:} false; then : - $as_echo_n "(cached) " >&6 -else - i=0 - teststring="ABCD" - - case $build_os in - msdosdjgpp*) - # On DJGPP, this test can blow up pretty badly due to problems in libc - # (any single argument exceeding 2000 bytes causes a buffer overrun - # during glob expansion). Even if it were fixed, the result of this - # check would be larger than it should be. - lt_cv_sys_max_cmd_len=12288; # 12K is about right - ;; - - gnu*) - # Under GNU Hurd, this test is not required because there is - # no limit to the length of command line arguments. - # Libtool will interpret -1 as no limit whatsoever - lt_cv_sys_max_cmd_len=-1; - ;; - - cygwin* | mingw* | cegcc*) - # On Win9x/ME, this test blows up -- it succeeds, but takes - # about 5 minutes as the teststring grows exponentially. - # Worse, since 9x/ME are not pre-emptively multitasking, - # you end up with a "frozen" computer, even though with patience - # the test eventually succeeds (with a max line length of 256k). - # Instead, let's just punt: use the minimum linelength reported by - # all of the supported platforms: 8192 (on NT/2K/XP). - lt_cv_sys_max_cmd_len=8192; - ;; - - mint*) - # On MiNT this can take a long time and run out of memory. - lt_cv_sys_max_cmd_len=8192; - ;; - - amigaos*) - # On AmigaOS with pdksh, this test takes hours, literally. - # So we just punt and use a minimum line length of 8192. - lt_cv_sys_max_cmd_len=8192; - ;; - - netbsd* | freebsd* | openbsd* | darwin* | dragonfly*) - # This has been around since 386BSD, at least. Likely further. - if test -x /sbin/sysctl; then - lt_cv_sys_max_cmd_len=`/sbin/sysctl -n kern.argmax` - elif test -x /usr/sbin/sysctl; then - lt_cv_sys_max_cmd_len=`/usr/sbin/sysctl -n kern.argmax` - else - lt_cv_sys_max_cmd_len=65536 # usable default for all BSDs - fi - # And add a safety zone - lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` - lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` - ;; - - interix*) - # We know the value 262144 and hardcode it with a safety zone (like BSD) - lt_cv_sys_max_cmd_len=196608 - ;; - - os2*) - # The test takes a long time on OS/2. - lt_cv_sys_max_cmd_len=8192 - ;; - - osf*) - # Dr. Hans Ekkehard Plesser reports seeing a kernel panic running configure - # due to this test when exec_disable_arg_limit is 1 on Tru64. It is not - # nice to cause kernel panics so lets avoid the loop below. - # First set a reasonable default. - lt_cv_sys_max_cmd_len=16384 - # - if test -x /sbin/sysconfig; then - case `/sbin/sysconfig -q proc exec_disable_arg_limit` in - *1*) lt_cv_sys_max_cmd_len=-1 ;; - esac - fi - ;; - sco3.2v5*) - lt_cv_sys_max_cmd_len=102400 - ;; - sysv5* | sco5v6* | sysv4.2uw2*) - kargmax=`grep ARG_MAX /etc/conf/cf.d/stune 2>/dev/null` - if test -n "$kargmax"; then - lt_cv_sys_max_cmd_len=`echo $kargmax | sed 's/.*[ ]//'` - else - lt_cv_sys_max_cmd_len=32768 - fi - ;; - *) - lt_cv_sys_max_cmd_len=`(getconf ARG_MAX) 2> /dev/null` - if test -n "$lt_cv_sys_max_cmd_len"; then - lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` - lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` - else - # Make teststring a little bigger before we do anything with it. - # a 1K string should be a reasonable start. - for i in 1 2 3 4 5 6 7 8 ; do - teststring=$teststring$teststring - done - SHELL=${SHELL-${CONFIG_SHELL-/bin/sh}} - # If test is not a shell built-in, we'll probably end up computing a - # maximum length that is only half of the actual maximum length, but - # we can't tell. - while { test "X"`env echo "$teststring$teststring" 2>/dev/null` \ - = "X$teststring$teststring"; } >/dev/null 2>&1 && - test $i != 17 # 1/2 MB should be enough - do - i=`expr $i + 1` - teststring=$teststring$teststring - done - # Only check the string length outside the loop. - lt_cv_sys_max_cmd_len=`expr "X$teststring" : ".*" 2>&1` - teststring= - # Add a significant safety factor because C++ compilers can tack on - # massive amounts of additional arguments before passing them to the - # linker. It appears as though 1/2 is a usable value. - lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 2` - fi - ;; - esac - -fi - -if test -n $lt_cv_sys_max_cmd_len ; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_sys_max_cmd_len" >&5 -$as_echo "$lt_cv_sys_max_cmd_len" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: none" >&5 -$as_echo "none" >&6; } -fi -max_cmd_len=$lt_cv_sys_max_cmd_len - - - - - - -: ${CP="cp -f"} -: ${MV="mv -f"} -: ${RM="rm -f"} - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the shell understands some XSI constructs" >&5 -$as_echo_n "checking whether the shell understands some XSI constructs... " >&6; } -# Try some XSI features -xsi_shell=no -( _lt_dummy="a/b/c" - test "${_lt_dummy##*/},${_lt_dummy%/*},${_lt_dummy#??}"${_lt_dummy%"$_lt_dummy"}, \ - = c,a/b,b/c, \ - && eval 'test $(( 1 + 1 )) -eq 2 \ - && test "${#_lt_dummy}" -eq 5' ) >/dev/null 2>&1 \ - && xsi_shell=yes -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $xsi_shell" >&5 -$as_echo "$xsi_shell" >&6; } - - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the shell understands \"+=\"" >&5 -$as_echo_n "checking whether the shell understands \"+=\"... " >&6; } -lt_shell_append=no -( foo=bar; set foo baz; eval "$1+=\$2" && test "$foo" = barbaz ) \ - >/dev/null 2>&1 \ - && lt_shell_append=yes -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_shell_append" >&5 -$as_echo "$lt_shell_append" >&6; } - - -if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then - lt_unset=unset -else - lt_unset=false -fi - - - - - -# test EBCDIC or ASCII -case `echo X|tr X '\101'` in - A) # ASCII based system - # \n is not interpreted correctly by Solaris 8 /usr/ucb/tr - lt_SP2NL='tr \040 \012' - lt_NL2SP='tr \015\012 \040\040' - ;; - *) # EBCDIC based system - lt_SP2NL='tr \100 \n' - lt_NL2SP='tr \r\n \100\100' - ;; -esac - - - - - - - - - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to convert $build file names to $host format" >&5 -$as_echo_n "checking how to convert $build file names to $host format... " >&6; } -if ${lt_cv_to_host_file_cmd+:} false; then : - $as_echo_n "(cached) " >&6 -else - case $host in - *-*-mingw* ) - case $build in - *-*-mingw* ) # actually msys - lt_cv_to_host_file_cmd=func_convert_file_msys_to_w32 - ;; - *-*-cygwin* ) - lt_cv_to_host_file_cmd=func_convert_file_cygwin_to_w32 - ;; - * ) # otherwise, assume *nix - lt_cv_to_host_file_cmd=func_convert_file_nix_to_w32 - ;; - esac - ;; - *-*-cygwin* ) - case $build in - *-*-mingw* ) # actually msys - lt_cv_to_host_file_cmd=func_convert_file_msys_to_cygwin - ;; - *-*-cygwin* ) - lt_cv_to_host_file_cmd=func_convert_file_noop - ;; - * ) # otherwise, assume *nix - lt_cv_to_host_file_cmd=func_convert_file_nix_to_cygwin - ;; - esac - ;; - * ) # unhandled hosts (and "normal" native builds) - lt_cv_to_host_file_cmd=func_convert_file_noop - ;; -esac - -fi - -to_host_file_cmd=$lt_cv_to_host_file_cmd -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_to_host_file_cmd" >&5 -$as_echo "$lt_cv_to_host_file_cmd" >&6; } - - - - - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to convert $build file names to toolchain format" >&5 -$as_echo_n "checking how to convert $build file names to toolchain format... " >&6; } -if ${lt_cv_to_tool_file_cmd+:} false; then : - $as_echo_n "(cached) " >&6 -else - #assume ordinary cross tools, or native build. -lt_cv_to_tool_file_cmd=func_convert_file_noop -case $host in - *-*-mingw* ) - case $build in - *-*-mingw* ) # actually msys - lt_cv_to_tool_file_cmd=func_convert_file_msys_to_w32 - ;; - esac - ;; -esac - -fi - -to_tool_file_cmd=$lt_cv_to_tool_file_cmd -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_to_tool_file_cmd" >&5 -$as_echo "$lt_cv_to_tool_file_cmd" >&6; } - - - - - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $LD option to reload object files" >&5 -$as_echo_n "checking for $LD option to reload object files... " >&6; } -if ${lt_cv_ld_reload_flag+:} false; then : - $as_echo_n "(cached) " >&6 -else - lt_cv_ld_reload_flag='-r' -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_reload_flag" >&5 -$as_echo "$lt_cv_ld_reload_flag" >&6; } -reload_flag=$lt_cv_ld_reload_flag -case $reload_flag in -"" | " "*) ;; -*) reload_flag=" $reload_flag" ;; -esac -reload_cmds='$LD$reload_flag -o $output$reload_objs' -case $host_os in - cygwin* | mingw* | pw32* | cegcc*) - if test "$GCC" != yes; then - reload_cmds=false - fi - ;; - darwin*) - if test "$GCC" = yes; then - reload_cmds='$LTCC $LTCFLAGS -nostdlib ${wl}-r -o $output$reload_objs' - else - reload_cmds='$LD$reload_flag -o $output$reload_objs' - fi - ;; -esac - - - - - - - - - -if test -n "$ac_tool_prefix"; then - # Extract the first word of "${ac_tool_prefix}objdump", so it can be a program name with args. -set dummy ${ac_tool_prefix}objdump; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_OBJDUMP+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$OBJDUMP"; then - ac_cv_prog_OBJDUMP="$OBJDUMP" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_OBJDUMP="${ac_tool_prefix}objdump" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -OBJDUMP=$ac_cv_prog_OBJDUMP -if test -n "$OBJDUMP"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OBJDUMP" >&5 -$as_echo "$OBJDUMP" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - -fi -if test -z "$ac_cv_prog_OBJDUMP"; then - ac_ct_OBJDUMP=$OBJDUMP - # Extract the first word of "objdump", so it can be a program name with args. -set dummy objdump; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_ac_ct_OBJDUMP+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$ac_ct_OBJDUMP"; then - ac_cv_prog_ac_ct_OBJDUMP="$ac_ct_OBJDUMP" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_ac_ct_OBJDUMP="objdump" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -ac_ct_OBJDUMP=$ac_cv_prog_ac_ct_OBJDUMP -if test -n "$ac_ct_OBJDUMP"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OBJDUMP" >&5 -$as_echo "$ac_ct_OBJDUMP" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - if test "x$ac_ct_OBJDUMP" = x; then - OBJDUMP="false" - else - case $cross_compiling:$ac_tool_warned in -yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} -ac_tool_warned=yes ;; -esac - OBJDUMP=$ac_ct_OBJDUMP - fi -else - OBJDUMP="$ac_cv_prog_OBJDUMP" -fi - -test -z "$OBJDUMP" && OBJDUMP=objdump - - - - - - - - - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to recognize dependent libraries" >&5 -$as_echo_n "checking how to recognize dependent libraries... " >&6; } -if ${lt_cv_deplibs_check_method+:} false; then : - $as_echo_n "(cached) " >&6 -else - lt_cv_file_magic_cmd='$MAGIC_CMD' -lt_cv_file_magic_test_file= -lt_cv_deplibs_check_method='unknown' -# Need to set the preceding variable on all platforms that support -# interlibrary dependencies. -# 'none' -- dependencies not supported. -# `unknown' -- same as none, but documents that we really don't know. -# 'pass_all' -- all dependencies passed with no checks. -# 'test_compile' -- check by making test program. -# 'file_magic [[regex]]' -- check by looking for files in library path -# which responds to the $file_magic_cmd with a given extended regex. -# If you have `file' or equivalent on your system and you're not sure -# whether `pass_all' will *always* work, you probably want this one. - -case $host_os in -aix[4-9]*) - lt_cv_deplibs_check_method=pass_all - ;; - -beos*) - lt_cv_deplibs_check_method=pass_all - ;; - -bsdi[45]*) - lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (shared object|dynamic lib)' - lt_cv_file_magic_cmd='/usr/bin/file -L' - lt_cv_file_magic_test_file=/shlib/libc.so - ;; - -cygwin*) - # func_win32_libid is a shell function defined in ltmain.sh - lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL' - lt_cv_file_magic_cmd='func_win32_libid' - ;; - -mingw* | pw32*) - # Base MSYS/MinGW do not provide the 'file' command needed by - # func_win32_libid shell function, so use a weaker test based on 'objdump', - # unless we find 'file', for example because we are cross-compiling. - # func_win32_libid assumes BSD nm, so disallow it if using MS dumpbin. - if ( test "$lt_cv_nm_interface" = "BSD nm" && file / ) >/dev/null 2>&1; then - lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL' - lt_cv_file_magic_cmd='func_win32_libid' - else - # Keep this pattern in sync with the one in func_win32_libid. - lt_cv_deplibs_check_method='file_magic file format (pei*-i386(.*architecture: i386)?|pe-arm-wince|pe-x86-64)' - lt_cv_file_magic_cmd='$OBJDUMP -f' - fi - ;; - -cegcc*) - # use the weaker test based on 'objdump'. See mingw*. - lt_cv_deplibs_check_method='file_magic file format pe-arm-.*little(.*architecture: arm)?' - lt_cv_file_magic_cmd='$OBJDUMP -f' - ;; - -darwin* | rhapsody*) - lt_cv_deplibs_check_method=pass_all - ;; - -freebsd* | dragonfly*) - if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then - case $host_cpu in - i*86 ) - # Not sure whether the presence of OpenBSD here was a mistake. - # Let's accept both of them until this is cleared up. - lt_cv_deplibs_check_method='file_magic (FreeBSD|OpenBSD|DragonFly)/i[3-9]86 (compact )?demand paged shared library' - lt_cv_file_magic_cmd=/usr/bin/file - lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*` - ;; - esac - else - lt_cv_deplibs_check_method=pass_all - fi - ;; - -gnu*) - lt_cv_deplibs_check_method=pass_all - ;; - -haiku*) - lt_cv_deplibs_check_method=pass_all - ;; - -hpux10.20* | hpux11*) - lt_cv_file_magic_cmd=/usr/bin/file - case $host_cpu in - ia64*) - lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF-[0-9][0-9]) shared object file - IA64' - lt_cv_file_magic_test_file=/usr/lib/hpux32/libc.so - ;; - hppa*64*) - lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF[ -][0-9][0-9])(-bit)?( [LM]SB)? shared object( file)?[, -]* PA-RISC [0-9]\.[0-9]' - lt_cv_file_magic_test_file=/usr/lib/pa20_64/libc.sl - ;; - *) - lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|PA-RISC[0-9]\.[0-9]) shared library' - lt_cv_file_magic_test_file=/usr/lib/libc.sl - ;; - esac - ;; - -interix[3-9]*) - # PIC code is broken on Interix 3.x, that's why |\.a not |_pic\.a here - lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so|\.a)$' - ;; - -irix5* | irix6* | nonstopux*) - case $LD in - *-32|*"-32 ") libmagic=32-bit;; - *-n32|*"-n32 ") libmagic=N32;; - *-64|*"-64 ") libmagic=64-bit;; - *) libmagic=never-match;; - esac - lt_cv_deplibs_check_method=pass_all - ;; - -# This must be glibc/ELF. -linux* | k*bsd*-gnu | kopensolaris*-gnu) - lt_cv_deplibs_check_method=pass_all - ;; - -netbsd* | netbsdelf*-gnu) - if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then - lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|_pic\.a)$' - else - lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so|_pic\.a)$' - fi - ;; - -newos6*) - lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (executable|dynamic lib)' - lt_cv_file_magic_cmd=/usr/bin/file - lt_cv_file_magic_test_file=/usr/lib/libnls.so - ;; - -*nto* | *qnx*) - lt_cv_deplibs_check_method=pass_all - ;; - -openbsd*) - if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then - lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|\.so|_pic\.a)$' - else - lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|_pic\.a)$' - fi - ;; - -osf3* | osf4* | osf5*) - lt_cv_deplibs_check_method=pass_all - ;; - -rdos*) - lt_cv_deplibs_check_method=pass_all - ;; - -solaris*) - lt_cv_deplibs_check_method=pass_all - ;; - -sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) - lt_cv_deplibs_check_method=pass_all - ;; - -sysv4 | sysv4.3*) - case $host_vendor in - motorola) - lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (shared object|dynamic lib) M[0-9][0-9]* Version [0-9]' - lt_cv_file_magic_test_file=`echo /usr/lib/libc.so*` - ;; - ncr) - lt_cv_deplibs_check_method=pass_all - ;; - sequent) - lt_cv_file_magic_cmd='/bin/file' - lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [LM]SB (shared object|dynamic lib )' - ;; - sni) - lt_cv_file_magic_cmd='/bin/file' - lt_cv_deplibs_check_method="file_magic ELF [0-9][0-9]*-bit [LM]SB dynamic lib" - lt_cv_file_magic_test_file=/lib/libc.so - ;; - siemens) - lt_cv_deplibs_check_method=pass_all - ;; - pc) - lt_cv_deplibs_check_method=pass_all - ;; - esac - ;; - -tpf*) - lt_cv_deplibs_check_method=pass_all - ;; -esac - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_deplibs_check_method" >&5 -$as_echo "$lt_cv_deplibs_check_method" >&6; } - -file_magic_glob= -want_nocaseglob=no -if test "$build" = "$host"; then - case $host_os in - mingw* | pw32*) - if ( shopt | grep nocaseglob ) >/dev/null 2>&1; then - want_nocaseglob=yes - else - file_magic_glob=`echo aAbBcCdDeEfFgGhHiIjJkKlLmMnNoOpPqQrRsStTuUvVwWxXyYzZ | $SED -e "s/\(..\)/s\/[\1]\/[\1]\/g;/g"` - fi - ;; - esac -fi - -file_magic_cmd=$lt_cv_file_magic_cmd -deplibs_check_method=$lt_cv_deplibs_check_method -test -z "$deplibs_check_method" && deplibs_check_method=unknown - - - - - - - - - - - - - - - - - - - - - - -if test -n "$ac_tool_prefix"; then - # Extract the first word of "${ac_tool_prefix}dlltool", so it can be a program name with args. -set dummy ${ac_tool_prefix}dlltool; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_DLLTOOL+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$DLLTOOL"; then - ac_cv_prog_DLLTOOL="$DLLTOOL" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_DLLTOOL="${ac_tool_prefix}dlltool" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -DLLTOOL=$ac_cv_prog_DLLTOOL -if test -n "$DLLTOOL"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DLLTOOL" >&5 -$as_echo "$DLLTOOL" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - -fi -if test -z "$ac_cv_prog_DLLTOOL"; then - ac_ct_DLLTOOL=$DLLTOOL - # Extract the first word of "dlltool", so it can be a program name with args. -set dummy dlltool; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_ac_ct_DLLTOOL+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$ac_ct_DLLTOOL"; then - ac_cv_prog_ac_ct_DLLTOOL="$ac_ct_DLLTOOL" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_ac_ct_DLLTOOL="dlltool" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -ac_ct_DLLTOOL=$ac_cv_prog_ac_ct_DLLTOOL -if test -n "$ac_ct_DLLTOOL"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DLLTOOL" >&5 -$as_echo "$ac_ct_DLLTOOL" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - if test "x$ac_ct_DLLTOOL" = x; then - DLLTOOL="false" - else - case $cross_compiling:$ac_tool_warned in -yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} -ac_tool_warned=yes ;; -esac - DLLTOOL=$ac_ct_DLLTOOL - fi -else - DLLTOOL="$ac_cv_prog_DLLTOOL" -fi - -test -z "$DLLTOOL" && DLLTOOL=dlltool - - - - - - - - - - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to associate runtime and link libraries" >&5 -$as_echo_n "checking how to associate runtime and link libraries... " >&6; } -if ${lt_cv_sharedlib_from_linklib_cmd+:} false; then : - $as_echo_n "(cached) " >&6 -else - lt_cv_sharedlib_from_linklib_cmd='unknown' - -case $host_os in -cygwin* | mingw* | pw32* | cegcc*) - # two different shell functions defined in ltmain.sh - # decide which to use based on capabilities of $DLLTOOL - case `$DLLTOOL --help 2>&1` in - *--identify-strict*) - lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib - ;; - *) - lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib_fallback - ;; - esac - ;; -*) - # fallback: assume linklib IS sharedlib - lt_cv_sharedlib_from_linklib_cmd="$ECHO" - ;; -esac - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_sharedlib_from_linklib_cmd" >&5 -$as_echo "$lt_cv_sharedlib_from_linklib_cmd" >&6; } -sharedlib_from_linklib_cmd=$lt_cv_sharedlib_from_linklib_cmd -test -z "$sharedlib_from_linklib_cmd" && sharedlib_from_linklib_cmd=$ECHO - - - - - - - - -if test -n "$ac_tool_prefix"; then - for ac_prog in ar - do - # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. -set dummy $ac_tool_prefix$ac_prog; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_AR+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$AR"; then - ac_cv_prog_AR="$AR" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_AR="$ac_tool_prefix$ac_prog" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -AR=$ac_cv_prog_AR -if test -n "$AR"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AR" >&5 -$as_echo "$AR" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - - test -n "$AR" && break - done -fi -if test -z "$AR"; then - ac_ct_AR=$AR - for ac_prog in ar -do - # Extract the first word of "$ac_prog", so it can be a program name with args. -set dummy $ac_prog; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_ac_ct_AR+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$ac_ct_AR"; then - ac_cv_prog_ac_ct_AR="$ac_ct_AR" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_ac_ct_AR="$ac_prog" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -ac_ct_AR=$ac_cv_prog_ac_ct_AR -if test -n "$ac_ct_AR"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_AR" >&5 -$as_echo "$ac_ct_AR" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - - test -n "$ac_ct_AR" && break -done - - if test "x$ac_ct_AR" = x; then - AR="false" - else - case $cross_compiling:$ac_tool_warned in -yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} -ac_tool_warned=yes ;; -esac - AR=$ac_ct_AR - fi -fi - -: ${AR=ar} -: ${AR_FLAGS=cru} - - - - - - - - - - - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for archiver @FILE support" >&5 -$as_echo_n "checking for archiver @FILE support... " >&6; } -if ${lt_cv_ar_at_file+:} false; then : - $as_echo_n "(cached) " >&6 -else - lt_cv_ar_at_file=no - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -int -main () -{ - - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - echo conftest.$ac_objext > conftest.lst - lt_ar_try='$AR $AR_FLAGS libconftest.a @conftest.lst >&5' - { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$lt_ar_try\""; } >&5 - (eval $lt_ar_try) 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } - if test "$ac_status" -eq 0; then - # Ensure the archiver fails upon bogus file names. - rm -f conftest.$ac_objext libconftest.a - { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$lt_ar_try\""; } >&5 - (eval $lt_ar_try) 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } - if test "$ac_status" -ne 0; then - lt_cv_ar_at_file=@ - fi - fi - rm -f conftest.* libconftest.a - -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ar_at_file" >&5 -$as_echo "$lt_cv_ar_at_file" >&6; } - -if test "x$lt_cv_ar_at_file" = xno; then - archiver_list_spec= -else - archiver_list_spec=$lt_cv_ar_at_file -fi - - - - - - - -if test -n "$ac_tool_prefix"; then - # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args. -set dummy ${ac_tool_prefix}strip; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_STRIP+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$STRIP"; then - ac_cv_prog_STRIP="$STRIP" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_STRIP="${ac_tool_prefix}strip" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -STRIP=$ac_cv_prog_STRIP -if test -n "$STRIP"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $STRIP" >&5 -$as_echo "$STRIP" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - -fi -if test -z "$ac_cv_prog_STRIP"; then - ac_ct_STRIP=$STRIP - # Extract the first word of "strip", so it can be a program name with args. -set dummy strip; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_ac_ct_STRIP+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$ac_ct_STRIP"; then - ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_ac_ct_STRIP="strip" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP -if test -n "$ac_ct_STRIP"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP" >&5 -$as_echo "$ac_ct_STRIP" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - if test "x$ac_ct_STRIP" = x; then - STRIP=":" - else - case $cross_compiling:$ac_tool_warned in -yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} -ac_tool_warned=yes ;; -esac - STRIP=$ac_ct_STRIP - fi -else - STRIP="$ac_cv_prog_STRIP" -fi - -test -z "$STRIP" && STRIP=: - - - - - - -if test -n "$ac_tool_prefix"; then - # Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args. -set dummy ${ac_tool_prefix}ranlib; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_RANLIB+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$RANLIB"; then - ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -RANLIB=$ac_cv_prog_RANLIB -if test -n "$RANLIB"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $RANLIB" >&5 -$as_echo "$RANLIB" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - -fi -if test -z "$ac_cv_prog_RANLIB"; then - ac_ct_RANLIB=$RANLIB - # Extract the first word of "ranlib", so it can be a program name with args. -set dummy ranlib; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_ac_ct_RANLIB+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$ac_ct_RANLIB"; then - ac_cv_prog_ac_ct_RANLIB="$ac_ct_RANLIB" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_ac_ct_RANLIB="ranlib" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -ac_ct_RANLIB=$ac_cv_prog_ac_ct_RANLIB -if test -n "$ac_ct_RANLIB"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_RANLIB" >&5 -$as_echo "$ac_ct_RANLIB" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - if test "x$ac_ct_RANLIB" = x; then - RANLIB=":" - else - case $cross_compiling:$ac_tool_warned in -yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} -ac_tool_warned=yes ;; -esac - RANLIB=$ac_ct_RANLIB - fi -else - RANLIB="$ac_cv_prog_RANLIB" -fi - -test -z "$RANLIB" && RANLIB=: - - - - - - -# Determine commands to create old-style static archives. -old_archive_cmds='$AR $AR_FLAGS $oldlib$oldobjs' -old_postinstall_cmds='chmod 644 $oldlib' -old_postuninstall_cmds= - -if test -n "$RANLIB"; then - case $host_os in - openbsd*) - old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB -t \$tool_oldlib" - ;; - *) - old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB \$tool_oldlib" - ;; - esac - old_archive_cmds="$old_archive_cmds~\$RANLIB \$tool_oldlib" -fi - -case $host_os in - darwin*) - lock_old_archive_extraction=yes ;; - *) - lock_old_archive_extraction=no ;; -esac - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -# If no C compiler was specified, use CC. -LTCC=${LTCC-"$CC"} - -# If no C compiler flags were specified, use CFLAGS. -LTCFLAGS=${LTCFLAGS-"$CFLAGS"} - -# Allow CC to be a program name with arguments. -compiler=$CC - - -# Check for command to grab the raw symbol name followed by C symbol from nm. -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking command to parse $NM output from $compiler object" >&5 -$as_echo_n "checking command to parse $NM output from $compiler object... " >&6; } -if ${lt_cv_sys_global_symbol_pipe+:} false; then : - $as_echo_n "(cached) " >&6 -else - -# These are sane defaults that work on at least a few old systems. -# [They come from Ultrix. What could be older than Ultrix?!! ;)] - -# Character class describing NM global symbol codes. -symcode='[BCDEGRST]' - -# Regexp to match symbols that can be accessed directly from C. -sympat='\([_A-Za-z][_A-Za-z0-9]*\)' - -# Define system-specific variables. -case $host_os in -aix*) - symcode='[BCDT]' - ;; -cygwin* | mingw* | pw32* | cegcc*) - symcode='[ABCDGISTW]' - ;; -hpux*) - if test "$host_cpu" = ia64; then - symcode='[ABCDEGRST]' - fi - ;; -irix* | nonstopux*) - symcode='[BCDEGRST]' - ;; -osf*) - symcode='[BCDEGQRST]' - ;; -solaris*) - symcode='[BDRT]' - ;; -sco3.2v5*) - symcode='[DT]' - ;; -sysv4.2uw2*) - symcode='[DT]' - ;; -sysv5* | sco5v6* | unixware* | OpenUNIX*) - symcode='[ABDT]' - ;; -sysv4) - symcode='[DFNSTU]' - ;; -esac - -# If we're using GNU nm, then use its standard symbol codes. -case `$NM -V 2>&1` in -*GNU* | *'with BFD'*) - symcode='[ABCDGIRSTW]' ;; -esac - -# Transform an extracted symbol line into a proper C declaration. -# Some systems (esp. on ia64) link data and code symbols differently, -# so use this general approach. -lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^T .* \(.*\)$/extern int \1();/p' -e 's/^$symcode* .* \(.*\)$/extern char \1;/p'" - -# Transform an extracted symbol line into symbol name and symbol address -lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([^ ]*\)[ ]*$/ {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([^ ]*\) \([^ ]*\)$/ {\"\2\", (void *) \&\2},/p'" -lt_cv_sys_global_symbol_to_c_name_address_lib_prefix="sed -n -e 's/^: \([^ ]*\)[ ]*$/ {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([^ ]*\) \(lib[^ ]*\)$/ {\"\2\", (void *) \&\2},/p' -e 's/^$symcode* \([^ ]*\) \([^ ]*\)$/ {\"lib\2\", (void *) \&\2},/p'" - -# Handle CRLF in mingw tool chain -opt_cr= -case $build_os in -mingw*) - opt_cr=`$ECHO 'x\{0,1\}' | tr x '\015'` # option cr in regexp - ;; -esac - -# Try without a prefix underscore, then with it. -for ac_symprfx in "" "_"; do - - # Transform symcode, sympat, and symprfx into a raw symbol and a C symbol. - symxfrm="\\1 $ac_symprfx\\2 \\2" - - # Write the raw and C identifiers. - if test "$lt_cv_nm_interface" = "MS dumpbin"; then - # Fake it for dumpbin and say T for any non-static function - # and D for any global variable. - # Also find C++ and __fastcall symbols from MSVC++, - # which start with @ or ?. - lt_cv_sys_global_symbol_pipe="$AWK '"\ -" {last_section=section; section=\$ 3};"\ -" /^COFF SYMBOL TABLE/{for(i in hide) delete hide[i]};"\ -" /Section length .*#relocs.*(pick any)/{hide[last_section]=1};"\ -" \$ 0!~/External *\|/{next};"\ -" / 0+ UNDEF /{next}; / UNDEF \([^|]\)*()/{next};"\ -" {if(hide[section]) next};"\ -" {f=0}; \$ 0~/\(\).*\|/{f=1}; {printf f ? \"T \" : \"D \"};"\ -" {split(\$ 0, a, /\||\r/); split(a[2], s)};"\ -" s[1]~/^[@?]/{print s[1], s[1]; next};"\ -" s[1]~prfx {split(s[1],t,\"@\"); print t[1], substr(t[1],length(prfx))}"\ -" ' prfx=^$ac_symprfx" - else - lt_cv_sys_global_symbol_pipe="sed -n -e 's/^.*[ ]\($symcode$symcode*\)[ ][ ]*$ac_symprfx$sympat$opt_cr$/$symxfrm/p'" - fi - lt_cv_sys_global_symbol_pipe="$lt_cv_sys_global_symbol_pipe | sed '/ __gnu_lto/d'" - - # Check to see that the pipe works correctly. - pipe_works=no - - rm -f conftest* - cat > conftest.$ac_ext <<_LT_EOF -#ifdef __cplusplus -extern "C" { -#endif -char nm_test_var; -void nm_test_func(void); -void nm_test_func(void){} -#ifdef __cplusplus -} -#endif -int main(){nm_test_var='a';nm_test_func();return(0);} -_LT_EOF - - if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 - (eval $ac_compile) 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; }; then - # Now try to grab the symbols. - nlist=conftest.nm - if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$NM conftest.$ac_objext \| "$lt_cv_sys_global_symbol_pipe" \> $nlist\""; } >&5 - (eval $NM conftest.$ac_objext \| "$lt_cv_sys_global_symbol_pipe" \> $nlist) 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } && test -s "$nlist"; then - # Try sorting and uniquifying the output. - if sort "$nlist" | uniq > "$nlist"T; then - mv -f "$nlist"T "$nlist" - else - rm -f "$nlist"T - fi - - # Make sure that we snagged all the symbols we need. - if $GREP ' nm_test_var$' "$nlist" >/dev/null; then - if $GREP ' nm_test_func$' "$nlist" >/dev/null; then - cat <<_LT_EOF > conftest.$ac_ext -/* Keep this code in sync between libtool.m4, ltmain, lt_system.h, and tests. */ -#if defined(_WIN32) || defined(__CYGWIN__) || defined(_WIN32_WCE) -/* DATA imports from DLLs on WIN32 con't be const, because runtime - relocations are performed -- see ld's documentation on pseudo-relocs. */ -# define LT@&t@_DLSYM_CONST -#elif defined(__osf__) -/* This system does not cope well with relocations in const data. */ -# define LT@&t@_DLSYM_CONST -#else -# define LT@&t@_DLSYM_CONST const -#endif - -#ifdef __cplusplus -extern "C" { -#endif - -_LT_EOF - # Now generate the symbol file. - eval "$lt_cv_sys_global_symbol_to_cdecl"' < "$nlist" | $GREP -v main >> conftest.$ac_ext' - - cat <<_LT_EOF >> conftest.$ac_ext - -/* The mapping between symbol names and symbols. */ -LT@&t@_DLSYM_CONST struct { - const char *name; - void *address; -} -lt__PROGRAM__LTX_preloaded_symbols[] = -{ - { "@PROGRAM@", (void *) 0 }, -_LT_EOF - $SED "s/^$symcode$symcode* \(.*\) \(.*\)$/ {\"\2\", (void *) \&\2},/" < "$nlist" | $GREP -v main >> conftest.$ac_ext - cat <<\_LT_EOF >> conftest.$ac_ext - {0, (void *) 0} -}; - -/* This works around a problem in FreeBSD linker */ -#ifdef FREEBSD_WORKAROUND -static const void *lt_preloaded_setup() { - return lt__PROGRAM__LTX_preloaded_symbols; -} -#endif - -#ifdef __cplusplus -} -#endif -_LT_EOF - # Now try linking the two files. - mv conftest.$ac_objext conftstm.$ac_objext - lt_globsym_save_LIBS=$LIBS - lt_globsym_save_CFLAGS=$CFLAGS - LIBS="conftstm.$ac_objext" - CFLAGS="$CFLAGS$lt_prog_compiler_no_builtin_flag" - if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5 - (eval $ac_link) 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } && test -s conftest${ac_exeext}; then - pipe_works=yes - fi - LIBS=$lt_globsym_save_LIBS - CFLAGS=$lt_globsym_save_CFLAGS - else - echo "cannot find nm_test_func in $nlist" >&5 - fi - else - echo "cannot find nm_test_var in $nlist" >&5 - fi - else - echo "cannot run $lt_cv_sys_global_symbol_pipe" >&5 - fi - else - echo "$progname: failed program was:" >&5 - cat conftest.$ac_ext >&5 - fi - rm -rf conftest* conftst* - - # Do not use the global_symbol_pipe unless it works. - if test "$pipe_works" = yes; then - break - else - lt_cv_sys_global_symbol_pipe= - fi -done - -fi - -if test -z "$lt_cv_sys_global_symbol_pipe"; then - lt_cv_sys_global_symbol_to_cdecl= -fi -if test -z "$lt_cv_sys_global_symbol_pipe$lt_cv_sys_global_symbol_to_cdecl"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: failed" >&5 -$as_echo "failed" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: ok" >&5 -$as_echo "ok" >&6; } -fi - -# Response file support. -if test "$lt_cv_nm_interface" = "MS dumpbin"; then - nm_file_list_spec='@' -elif $NM --help 2>/dev/null | grep '[@]FILE' >/dev/null; then - nm_file_list_spec='@' -fi - - - - - - - - - - - - - - - - - - - - - - - - - - - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for sysroot" >&5 -$as_echo_n "checking for sysroot... " >&6; } - -@%:@ Check whether --with-sysroot was given. -if test "${with_sysroot+set}" = set; then : - withval=$with_sysroot; -else - with_sysroot=no -fi - - -lt_sysroot= -case ${with_sysroot} in #( - yes) - if test "$GCC" = yes; then - lt_sysroot=`$CC --print-sysroot 2>/dev/null` - fi - ;; #( - /*) - lt_sysroot=`echo "$with_sysroot" | sed -e "$sed_quote_subst"` - ;; #( - no|'') - ;; #( - *) - { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${with_sysroot}" >&5 -$as_echo "${with_sysroot}" >&6; } - as_fn_error $? "The sysroot must be an absolute path." "$LINENO" 5 - ;; -esac - - { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${lt_sysroot:-no}" >&5 -$as_echo "${lt_sysroot:-no}" >&6; } - - - - - -@%:@ Check whether --enable-libtool-lock was given. -if test "${enable_libtool_lock+set}" = set; then : - enableval=$enable_libtool_lock; -fi - -test "x$enable_libtool_lock" != xno && enable_libtool_lock=yes - -# Some flags need to be propagated to the compiler or linker for good -# libtool support. -case $host in -ia64-*-hpux*) - # Find out which ABI we are using. - echo 'int i;' > conftest.$ac_ext - if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 - (eval $ac_compile) 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; }; then - case `/usr/bin/file conftest.$ac_objext` in - *ELF-32*) - HPUX_IA64_MODE="32" - ;; - *ELF-64*) - HPUX_IA64_MODE="64" - ;; - esac - fi - rm -rf conftest* - ;; -*-*-irix6*) - # Find out which ABI we are using. - echo '#line '$LINENO' "configure"' > conftest.$ac_ext - if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 - (eval $ac_compile) 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; }; then - if test "$lt_cv_prog_gnu_ld" = yes; then - case `/usr/bin/file conftest.$ac_objext` in - *32-bit*) - LD="${LD-ld} -melf32bsmip" - ;; - *N32*) - LD="${LD-ld} -melf32bmipn32" - ;; - *64-bit*) - LD="${LD-ld} -melf64bmip" - ;; - esac - else - case `/usr/bin/file conftest.$ac_objext` in - *32-bit*) - LD="${LD-ld} -32" - ;; - *N32*) - LD="${LD-ld} -n32" - ;; - *64-bit*) - LD="${LD-ld} -64" - ;; - esac - fi - fi - rm -rf conftest* - ;; - -x86_64-*kfreebsd*-gnu|x86_64-*linux*|ppc*-*linux*|powerpc*-*linux*| \ -s390*-*linux*|s390*-*tpf*|sparc*-*linux*) - # Find out which ABI we are using. - echo 'int i;' > conftest.$ac_ext - if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 - (eval $ac_compile) 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; }; then - case `/usr/bin/file conftest.o` in - *32-bit*) - case $host in - x86_64-*kfreebsd*-gnu) - LD="${LD-ld} -m elf_i386_fbsd" - ;; - x86_64-*linux*) - LD="${LD-ld} -m elf_i386" - ;; - ppc64-*linux*|powerpc64-*linux*) - LD="${LD-ld} -m elf32ppclinux" - ;; - s390x-*linux*) - LD="${LD-ld} -m elf_s390" - ;; - sparc64-*linux*) - LD="${LD-ld} -m elf32_sparc" - ;; - esac - ;; - *64-bit*) - case $host in - x86_64-*kfreebsd*-gnu) - LD="${LD-ld} -m elf_x86_64_fbsd" - ;; - x86_64-*linux*) - LD="${LD-ld} -m elf_x86_64" - ;; - ppc*-*linux*|powerpc*-*linux*) - LD="${LD-ld} -m elf64ppc" - ;; - s390*-*linux*|s390*-*tpf*) - LD="${LD-ld} -m elf64_s390" - ;; - sparc*-*linux*) - LD="${LD-ld} -m elf64_sparc" - ;; - esac - ;; - esac - fi - rm -rf conftest* - ;; - -*-*-sco3.2v5*) - # On SCO OpenServer 5, we need -belf to get full-featured binaries. - SAVE_CFLAGS="$CFLAGS" - CFLAGS="$CFLAGS -belf" - { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler needs -belf" >&5 -$as_echo_n "checking whether the C compiler needs -belf... " >&6; } -if ${lt_cv_cc_needs_belf+:} false; then : - $as_echo_n "(cached) " >&6 -else - ac_ext=c -ac_cpp='$CPP $CPPFLAGS' -ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_c_compiler_gnu - - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -int -main () -{ - - ; - return 0; -} -_ACEOF -if ac_fn_c_try_link "$LINENO"; then : - lt_cv_cc_needs_belf=yes -else - lt_cv_cc_needs_belf=no -fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext - ac_ext=c -ac_cpp='$CPP $CPPFLAGS' -ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_c_compiler_gnu - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_cc_needs_belf" >&5 -$as_echo "$lt_cv_cc_needs_belf" >&6; } - if test x"$lt_cv_cc_needs_belf" != x"yes"; then - # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf - CFLAGS="$SAVE_CFLAGS" - fi - ;; -*-*solaris*) - # Find out which ABI we are using. - echo 'int i;' > conftest.$ac_ext - if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 - (eval $ac_compile) 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; }; then - case `/usr/bin/file conftest.o` in - *64-bit*) - case $lt_cv_prog_gnu_ld in - yes*) - case $host in - i?86-*-solaris*) - LD="${LD-ld} -m elf_x86_64" - ;; - sparc*-*-solaris*) - LD="${LD-ld} -m elf64_sparc" - ;; - esac - # GNU ld 2.21 introduced _sol2 emulations. Use them if available. - if ${LD-ld} -V | grep _sol2 >/dev/null 2>&1; then - LD="${LD-ld}_sol2" - fi - ;; - *) - if ${LD-ld} -64 -r -o conftest2.o conftest.o >/dev/null 2>&1; then - LD="${LD-ld} -64" - fi - ;; - esac - ;; - esac - fi - rm -rf conftest* - ;; -esac - -need_locks="$enable_libtool_lock" - -if test -n "$ac_tool_prefix"; then - # Extract the first word of "${ac_tool_prefix}mt", so it can be a program name with args. -set dummy ${ac_tool_prefix}mt; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_MANIFEST_TOOL+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$MANIFEST_TOOL"; then - ac_cv_prog_MANIFEST_TOOL="$MANIFEST_TOOL" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_MANIFEST_TOOL="${ac_tool_prefix}mt" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -MANIFEST_TOOL=$ac_cv_prog_MANIFEST_TOOL -if test -n "$MANIFEST_TOOL"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MANIFEST_TOOL" >&5 -$as_echo "$MANIFEST_TOOL" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - -fi -if test -z "$ac_cv_prog_MANIFEST_TOOL"; then - ac_ct_MANIFEST_TOOL=$MANIFEST_TOOL - # Extract the first word of "mt", so it can be a program name with args. -set dummy mt; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_ac_ct_MANIFEST_TOOL+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$ac_ct_MANIFEST_TOOL"; then - ac_cv_prog_ac_ct_MANIFEST_TOOL="$ac_ct_MANIFEST_TOOL" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_ac_ct_MANIFEST_TOOL="mt" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -ac_ct_MANIFEST_TOOL=$ac_cv_prog_ac_ct_MANIFEST_TOOL -if test -n "$ac_ct_MANIFEST_TOOL"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_MANIFEST_TOOL" >&5 -$as_echo "$ac_ct_MANIFEST_TOOL" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - if test "x$ac_ct_MANIFEST_TOOL" = x; then - MANIFEST_TOOL=":" - else - case $cross_compiling:$ac_tool_warned in -yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} -ac_tool_warned=yes ;; -esac - MANIFEST_TOOL=$ac_ct_MANIFEST_TOOL - fi -else - MANIFEST_TOOL="$ac_cv_prog_MANIFEST_TOOL" -fi - -test -z "$MANIFEST_TOOL" && MANIFEST_TOOL=mt -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if $MANIFEST_TOOL is a manifest tool" >&5 -$as_echo_n "checking if $MANIFEST_TOOL is a manifest tool... " >&6; } -if ${lt_cv_path_mainfest_tool+:} false; then : - $as_echo_n "(cached) " >&6 -else - lt_cv_path_mainfest_tool=no - echo "$as_me:$LINENO: $MANIFEST_TOOL '-?'" >&5 - $MANIFEST_TOOL '-?' 2>conftest.err > conftest.out - cat conftest.err >&5 - if $GREP 'Manifest Tool' conftest.out > /dev/null; then - lt_cv_path_mainfest_tool=yes - fi - rm -f conftest* -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_path_mainfest_tool" >&5 -$as_echo "$lt_cv_path_mainfest_tool" >&6; } -if test "x$lt_cv_path_mainfest_tool" != xyes; then - MANIFEST_TOOL=: -fi - - - - - - - case $host_os in - rhapsody* | darwin*) - if test -n "$ac_tool_prefix"; then - # Extract the first word of "${ac_tool_prefix}dsymutil", so it can be a program name with args. -set dummy ${ac_tool_prefix}dsymutil; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_DSYMUTIL+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$DSYMUTIL"; then - ac_cv_prog_DSYMUTIL="$DSYMUTIL" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_DSYMUTIL="${ac_tool_prefix}dsymutil" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -DSYMUTIL=$ac_cv_prog_DSYMUTIL -if test -n "$DSYMUTIL"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DSYMUTIL" >&5 -$as_echo "$DSYMUTIL" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - -fi -if test -z "$ac_cv_prog_DSYMUTIL"; then - ac_ct_DSYMUTIL=$DSYMUTIL - # Extract the first word of "dsymutil", so it can be a program name with args. -set dummy dsymutil; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_ac_ct_DSYMUTIL+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$ac_ct_DSYMUTIL"; then - ac_cv_prog_ac_ct_DSYMUTIL="$ac_ct_DSYMUTIL" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_ac_ct_DSYMUTIL="dsymutil" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -ac_ct_DSYMUTIL=$ac_cv_prog_ac_ct_DSYMUTIL -if test -n "$ac_ct_DSYMUTIL"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DSYMUTIL" >&5 -$as_echo "$ac_ct_DSYMUTIL" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - if test "x$ac_ct_DSYMUTIL" = x; then - DSYMUTIL=":" - else - case $cross_compiling:$ac_tool_warned in -yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} -ac_tool_warned=yes ;; -esac - DSYMUTIL=$ac_ct_DSYMUTIL - fi -else - DSYMUTIL="$ac_cv_prog_DSYMUTIL" -fi - - if test -n "$ac_tool_prefix"; then - # Extract the first word of "${ac_tool_prefix}nmedit", so it can be a program name with args. -set dummy ${ac_tool_prefix}nmedit; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_NMEDIT+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$NMEDIT"; then - ac_cv_prog_NMEDIT="$NMEDIT" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_NMEDIT="${ac_tool_prefix}nmedit" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -NMEDIT=$ac_cv_prog_NMEDIT -if test -n "$NMEDIT"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $NMEDIT" >&5 -$as_echo "$NMEDIT" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - -fi -if test -z "$ac_cv_prog_NMEDIT"; then - ac_ct_NMEDIT=$NMEDIT - # Extract the first word of "nmedit", so it can be a program name with args. -set dummy nmedit; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_ac_ct_NMEDIT+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$ac_ct_NMEDIT"; then - ac_cv_prog_ac_ct_NMEDIT="$ac_ct_NMEDIT" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_ac_ct_NMEDIT="nmedit" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -ac_ct_NMEDIT=$ac_cv_prog_ac_ct_NMEDIT -if test -n "$ac_ct_NMEDIT"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_NMEDIT" >&5 -$as_echo "$ac_ct_NMEDIT" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - if test "x$ac_ct_NMEDIT" = x; then - NMEDIT=":" - else - case $cross_compiling:$ac_tool_warned in -yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} -ac_tool_warned=yes ;; -esac - NMEDIT=$ac_ct_NMEDIT - fi -else - NMEDIT="$ac_cv_prog_NMEDIT" -fi - - if test -n "$ac_tool_prefix"; then - # Extract the first word of "${ac_tool_prefix}lipo", so it can be a program name with args. -set dummy ${ac_tool_prefix}lipo; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_LIPO+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$LIPO"; then - ac_cv_prog_LIPO="$LIPO" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_LIPO="${ac_tool_prefix}lipo" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -LIPO=$ac_cv_prog_LIPO -if test -n "$LIPO"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LIPO" >&5 -$as_echo "$LIPO" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - -fi -if test -z "$ac_cv_prog_LIPO"; then - ac_ct_LIPO=$LIPO - # Extract the first word of "lipo", so it can be a program name with args. -set dummy lipo; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_ac_ct_LIPO+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$ac_ct_LIPO"; then - ac_cv_prog_ac_ct_LIPO="$ac_ct_LIPO" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_ac_ct_LIPO="lipo" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -ac_ct_LIPO=$ac_cv_prog_ac_ct_LIPO -if test -n "$ac_ct_LIPO"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_LIPO" >&5 -$as_echo "$ac_ct_LIPO" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - if test "x$ac_ct_LIPO" = x; then - LIPO=":" - else - case $cross_compiling:$ac_tool_warned in -yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} -ac_tool_warned=yes ;; -esac - LIPO=$ac_ct_LIPO - fi -else - LIPO="$ac_cv_prog_LIPO" -fi - - if test -n "$ac_tool_prefix"; then - # Extract the first word of "${ac_tool_prefix}otool", so it can be a program name with args. -set dummy ${ac_tool_prefix}otool; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_OTOOL+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$OTOOL"; then - ac_cv_prog_OTOOL="$OTOOL" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_OTOOL="${ac_tool_prefix}otool" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -OTOOL=$ac_cv_prog_OTOOL -if test -n "$OTOOL"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OTOOL" >&5 -$as_echo "$OTOOL" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - -fi -if test -z "$ac_cv_prog_OTOOL"; then - ac_ct_OTOOL=$OTOOL - # Extract the first word of "otool", so it can be a program name with args. -set dummy otool; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_ac_ct_OTOOL+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$ac_ct_OTOOL"; then - ac_cv_prog_ac_ct_OTOOL="$ac_ct_OTOOL" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_ac_ct_OTOOL="otool" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -ac_ct_OTOOL=$ac_cv_prog_ac_ct_OTOOL -if test -n "$ac_ct_OTOOL"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OTOOL" >&5 -$as_echo "$ac_ct_OTOOL" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - if test "x$ac_ct_OTOOL" = x; then - OTOOL=":" - else - case $cross_compiling:$ac_tool_warned in -yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} -ac_tool_warned=yes ;; -esac - OTOOL=$ac_ct_OTOOL - fi -else - OTOOL="$ac_cv_prog_OTOOL" -fi - - if test -n "$ac_tool_prefix"; then - # Extract the first word of "${ac_tool_prefix}otool64", so it can be a program name with args. -set dummy ${ac_tool_prefix}otool64; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_OTOOL64+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$OTOOL64"; then - ac_cv_prog_OTOOL64="$OTOOL64" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_OTOOL64="${ac_tool_prefix}otool64" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -OTOOL64=$ac_cv_prog_OTOOL64 -if test -n "$OTOOL64"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OTOOL64" >&5 -$as_echo "$OTOOL64" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - -fi -if test -z "$ac_cv_prog_OTOOL64"; then - ac_ct_OTOOL64=$OTOOL64 - # Extract the first word of "otool64", so it can be a program name with args. -set dummy otool64; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_ac_ct_OTOOL64+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$ac_ct_OTOOL64"; then - ac_cv_prog_ac_ct_OTOOL64="$ac_ct_OTOOL64" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_ac_ct_OTOOL64="otool64" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -ac_ct_OTOOL64=$ac_cv_prog_ac_ct_OTOOL64 -if test -n "$ac_ct_OTOOL64"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OTOOL64" >&5 -$as_echo "$ac_ct_OTOOL64" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - if test "x$ac_ct_OTOOL64" = x; then - OTOOL64=":" - else - case $cross_compiling:$ac_tool_warned in -yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} -ac_tool_warned=yes ;; -esac - OTOOL64=$ac_ct_OTOOL64 - fi -else - OTOOL64="$ac_cv_prog_OTOOL64" -fi - - - - - - - - - - - - - - - - - - - - - - - - - - - - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -single_module linker flag" >&5 -$as_echo_n "checking for -single_module linker flag... " >&6; } -if ${lt_cv_apple_cc_single_mod+:} false; then : - $as_echo_n "(cached) " >&6 -else - lt_cv_apple_cc_single_mod=no - if test -z "${LT_MULTI_MODULE}"; then - # By default we will add the -single_module flag. You can override - # by either setting the environment variable LT_MULTI_MODULE - # non-empty at configure time, or by adding -multi_module to the - # link flags. - rm -rf libconftest.dylib* - echo "int foo(void){return 1;}" > conftest.c - echo "$LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \ --dynamiclib -Wl,-single_module conftest.c" >&5 - $LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \ - -dynamiclib -Wl,-single_module conftest.c 2>conftest.err - _lt_result=$? - # If there is a non-empty error log, and "single_module" - # appears in it, assume the flag caused a linker warning - if test -s conftest.err && $GREP single_module conftest.err; then - cat conftest.err >&5 - # Otherwise, if the output was created with a 0 exit code from - # the compiler, it worked. - elif test -f libconftest.dylib && test $_lt_result -eq 0; then - lt_cv_apple_cc_single_mod=yes - else - cat conftest.err >&5 - fi - rm -rf libconftest.dylib* - rm -f conftest.* - fi -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_apple_cc_single_mod" >&5 -$as_echo "$lt_cv_apple_cc_single_mod" >&6; } - - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -exported_symbols_list linker flag" >&5 -$as_echo_n "checking for -exported_symbols_list linker flag... " >&6; } -if ${lt_cv_ld_exported_symbols_list+:} false; then : - $as_echo_n "(cached) " >&6 -else - lt_cv_ld_exported_symbols_list=no - save_LDFLAGS=$LDFLAGS - echo "_main" > conftest.sym - LDFLAGS="$LDFLAGS -Wl,-exported_symbols_list,conftest.sym" - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -int -main () -{ - - ; - return 0; -} -_ACEOF -if ac_fn_c_try_link "$LINENO"; then : - lt_cv_ld_exported_symbols_list=yes -else - lt_cv_ld_exported_symbols_list=no -fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext - LDFLAGS="$save_LDFLAGS" - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_exported_symbols_list" >&5 -$as_echo "$lt_cv_ld_exported_symbols_list" >&6; } - - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -force_load linker flag" >&5 -$as_echo_n "checking for -force_load linker flag... " >&6; } -if ${lt_cv_ld_force_load+:} false; then : - $as_echo_n "(cached) " >&6 -else - lt_cv_ld_force_load=no - cat > conftest.c << _LT_EOF -int forced_loaded() { return 2;} -_LT_EOF - echo "$LTCC $LTCFLAGS -c -o conftest.o conftest.c" >&5 - $LTCC $LTCFLAGS -c -o conftest.o conftest.c 2>&5 - echo "$AR cru libconftest.a conftest.o" >&5 - $AR cru libconftest.a conftest.o 2>&5 - echo "$RANLIB libconftest.a" >&5 - $RANLIB libconftest.a 2>&5 - cat > conftest.c << _LT_EOF -int main() { return 0;} -_LT_EOF - echo "$LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a" >&5 - $LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a 2>conftest.err - _lt_result=$? - if test -s conftest.err && $GREP force_load conftest.err; then - cat conftest.err >&5 - elif test -f conftest && test $_lt_result -eq 0 && $GREP forced_load conftest >/dev/null 2>&1 ; then - lt_cv_ld_force_load=yes - else - cat conftest.err >&5 - fi - rm -f conftest.err libconftest.a conftest conftest.c - rm -rf conftest.dSYM - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_force_load" >&5 -$as_echo "$lt_cv_ld_force_load" >&6; } - case $host_os in - rhapsody* | darwin1.[012]) - _lt_dar_allow_undefined='${wl}-undefined ${wl}suppress' ;; - darwin1.*) - _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;; - darwin*) # darwin 5.x on - # if running on 10.5 or later, the deployment target defaults - # to the OS version, if on x86, and 10.4, the deployment - # target defaults to 10.4. Don't you love it? - case ${MACOSX_DEPLOYMENT_TARGET-10.0},$host in - 10.0,*86*-darwin8*|10.0,*-darwin[91]*) - _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;; - 10.[012]*) - _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;; - 10.*) - _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;; - esac - ;; - esac - if test "$lt_cv_apple_cc_single_mod" = "yes"; then - _lt_dar_single_mod='$single_module' - fi - if test "$lt_cv_ld_exported_symbols_list" = "yes"; then - _lt_dar_export_syms=' ${wl}-exported_symbols_list,$output_objdir/${libname}-symbols.expsym' - else - _lt_dar_export_syms='~$NMEDIT -s $output_objdir/${libname}-symbols.expsym ${lib}' - fi - if test "$DSYMUTIL" != ":" && test "$lt_cv_ld_force_load" = "no"; then - _lt_dsymutil='~$DSYMUTIL $lib || :' - else - _lt_dsymutil= - fi - ;; - esac - -ac_ext=c -ac_cpp='$CPP $CPPFLAGS' -ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_c_compiler_gnu -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C preprocessor" >&5 -$as_echo_n "checking how to run the C preprocessor... " >&6; } -# On Suns, sometimes $CPP names a directory. -if test -n "$CPP" && test -d "$CPP"; then - CPP= -fi -if test -z "$CPP"; then - if ${ac_cv_prog_CPP+:} false; then : - $as_echo_n "(cached) " >&6 -else - # Double quotes because CPP needs to be expanded - for CPP in "$CC -E" "$CC -E -traditional-cpp" "/lib/cpp" - do - ac_preproc_ok=false -for ac_c_preproc_warn_flag in '' yes -do - # Use a header file that comes with gcc, so configuring glibc - # with a fresh cross-compiler works. - # Prefer to if __STDC__ is defined, since - # exists even on freestanding compilers. - # On the NeXT, cc -E runs the code through the compiler's parser, - # not just through cpp. "Syntax error" is here to catch this case. - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -@%:@ifdef __STDC__ -@%:@ include -@%:@else -@%:@ include -@%:@endif - Syntax error -_ACEOF -if ac_fn_c_try_cpp "$LINENO"; then : - -else - # Broken: fails on valid input. -continue -fi -rm -f conftest.err conftest.i conftest.$ac_ext - - # OK, works on sane cases. Now check whether nonexistent headers - # can be detected and how. - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -@%:@include -_ACEOF -if ac_fn_c_try_cpp "$LINENO"; then : - # Broken: success on invalid input. -continue -else - # Passes both tests. -ac_preproc_ok=: -break -fi -rm -f conftest.err conftest.i conftest.$ac_ext - -done -# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. -rm -f conftest.i conftest.err conftest.$ac_ext -if $ac_preproc_ok; then : - break -fi - - done - ac_cv_prog_CPP=$CPP - -fi - CPP=$ac_cv_prog_CPP -else - ac_cv_prog_CPP=$CPP -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $CPP" >&5 -$as_echo "$CPP" >&6; } -ac_preproc_ok=false -for ac_c_preproc_warn_flag in '' yes -do - # Use a header file that comes with gcc, so configuring glibc - # with a fresh cross-compiler works. - # Prefer to if __STDC__ is defined, since - # exists even on freestanding compilers. - # On the NeXT, cc -E runs the code through the compiler's parser, - # not just through cpp. "Syntax error" is here to catch this case. - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -@%:@ifdef __STDC__ -@%:@ include -@%:@else -@%:@ include -@%:@endif - Syntax error -_ACEOF -if ac_fn_c_try_cpp "$LINENO"; then : - -else - # Broken: fails on valid input. -continue -fi -rm -f conftest.err conftest.i conftest.$ac_ext - - # OK, works on sane cases. Now check whether nonexistent headers - # can be detected and how. - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -@%:@include -_ACEOF -if ac_fn_c_try_cpp "$LINENO"; then : - # Broken: success on invalid input. -continue -else - # Passes both tests. -ac_preproc_ok=: -break -fi -rm -f conftest.err conftest.i conftest.$ac_ext - -done -# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. -rm -f conftest.i conftest.err conftest.$ac_ext -if $ac_preproc_ok; then : - -else - { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 -$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} -as_fn_error $? "C preprocessor \"$CPP\" fails sanity check -See \`config.log' for more details" "$LINENO" 5; } -fi - -ac_ext=c -ac_cpp='$CPP $CPPFLAGS' -ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_c_compiler_gnu - - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header files" >&5 -$as_echo_n "checking for ANSI C header files... " >&6; } -if ${ac_cv_header_stdc+:} false; then : - $as_echo_n "(cached) " >&6 -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include -#include -#include -#include - -int -main () -{ - - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - ac_cv_header_stdc=yes -else - ac_cv_header_stdc=no -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext - -if test $ac_cv_header_stdc = yes; then - # SunOS 4.x string.h does not declare mem*, contrary to ANSI. - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include - -_ACEOF -if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | - $EGREP "memchr" >/dev/null 2>&1; then : - -else - ac_cv_header_stdc=no -fi -rm -f conftest* - -fi - -if test $ac_cv_header_stdc = yes; then - # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include - -_ACEOF -if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | - $EGREP "free" >/dev/null 2>&1; then : - -else - ac_cv_header_stdc=no -fi -rm -f conftest* - -fi - -if test $ac_cv_header_stdc = yes; then - # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi. - if test "$cross_compiling" = yes; then : - : -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include -#include -#if ((' ' & 0x0FF) == 0x020) -# define ISLOWER(c) ('a' <= (c) && (c) <= 'z') -# define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c)) -#else -# define ISLOWER(c) \ - (('a' <= (c) && (c) <= 'i') \ - || ('j' <= (c) && (c) <= 'r') \ - || ('s' <= (c) && (c) <= 'z')) -# define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c)) -#endif - -#define XOR(e, f) (((e) && !(f)) || (!(e) && (f))) -int -main () -{ - int i; - for (i = 0; i < 256; i++) - if (XOR (islower (i), ISLOWER (i)) - || toupper (i) != TOUPPER (i)) - return 2; - return 0; -} -_ACEOF -if ac_fn_c_try_run "$LINENO"; then : - -else - ac_cv_header_stdc=no -fi -rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ - conftest.$ac_objext conftest.beam conftest.$ac_ext -fi - -fi -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdc" >&5 -$as_echo "$ac_cv_header_stdc" >&6; } -if test $ac_cv_header_stdc = yes; then - -$as_echo "@%:@define STDC_HEADERS 1" >>confdefs.h - -fi - -# On IRIX 5.3, sys/types and inttypes.h are conflicting. -for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \ - inttypes.h stdint.h unistd.h -do : - as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` -ac_fn_c_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default -" -if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : - cat >>confdefs.h <<_ACEOF -@%:@define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 -_ACEOF - -fi - -done - - -for ac_header in dlfcn.h -do : - ac_fn_c_check_header_compile "$LINENO" "dlfcn.h" "ac_cv_header_dlfcn_h" "$ac_includes_default -" -if test "x$ac_cv_header_dlfcn_h" = xyes; then : - cat >>confdefs.h <<_ACEOF -@%:@define HAVE_DLFCN_H 1 -_ACEOF - -fi - -done - - - - -func_stripname_cnf () -{ - case ${2} in - .*) func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%\\\\${2}\$%%"`;; - *) func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%${2}\$%%"`;; - esac -} # func_stripname_cnf - - - - - -# Set options - - - - enable_dlopen=no - - - enable_win32_dll=no - - - @%:@ Check whether --enable-shared was given. -if test "${enable_shared+set}" = set; then : - enableval=$enable_shared; p=${PACKAGE-default} - case $enableval in - yes) enable_shared=yes ;; - no) enable_shared=no ;; - *) - enable_shared=no - # Look at the argument we got. We use all the common list separators. - lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," - for pkg in $enableval; do - IFS="$lt_save_ifs" - if test "X$pkg" = "X$p"; then - enable_shared=yes - fi - done - IFS="$lt_save_ifs" - ;; - esac -else - enable_shared=yes -fi - - - - - - - - - - @%:@ Check whether --enable-static was given. -if test "${enable_static+set}" = set; then : - enableval=$enable_static; p=${PACKAGE-default} - case $enableval in - yes) enable_static=yes ;; - no) enable_static=no ;; - *) - enable_static=no - # Look at the argument we got. We use all the common list separators. - lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," - for pkg in $enableval; do - IFS="$lt_save_ifs" - if test "X$pkg" = "X$p"; then - enable_static=yes - fi - done - IFS="$lt_save_ifs" - ;; - esac -else - enable_static=yes -fi - - - - - - - - - - -@%:@ Check whether --with-pic was given. -if test "${with_pic+set}" = set; then : - withval=$with_pic; lt_p=${PACKAGE-default} - case $withval in - yes|no) pic_mode=$withval ;; - *) - pic_mode=default - # Look at the argument we got. We use all the common list separators. - lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," - for lt_pkg in $withval; do - IFS="$lt_save_ifs" - if test "X$lt_pkg" = "X$lt_p"; then - pic_mode=yes - fi - done - IFS="$lt_save_ifs" - ;; - esac -else - pic_mode=default -fi - - -test -z "$pic_mode" && pic_mode=default - - - - - - - - @%:@ Check whether --enable-fast-install was given. -if test "${enable_fast_install+set}" = set; then : - enableval=$enable_fast_install; p=${PACKAGE-default} - case $enableval in - yes) enable_fast_install=yes ;; - no) enable_fast_install=no ;; - *) - enable_fast_install=no - # Look at the argument we got. We use all the common list separators. - lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," - for pkg in $enableval; do - IFS="$lt_save_ifs" - if test "X$pkg" = "X$p"; then - enable_fast_install=yes - fi - done - IFS="$lt_save_ifs" - ;; - esac -else - enable_fast_install=yes -fi - - - - - - - - - - - -# This can be used to rebuild libtool when needed -LIBTOOL_DEPS="$ltmain" - -# Always use our own libtool. -LIBTOOL='$(SHELL) $(top_builddir)/libtool' - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -test -z "$LN_S" && LN_S="ln -s" - - - - - - - - - - - - - - -if test -n "${ZSH_VERSION+set}" ; then - setopt NO_GLOB_SUBST -fi - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for objdir" >&5 -$as_echo_n "checking for objdir... " >&6; } -if ${lt_cv_objdir+:} false; then : - $as_echo_n "(cached) " >&6 -else - rm -f .libs 2>/dev/null -mkdir .libs 2>/dev/null -if test -d .libs; then - lt_cv_objdir=.libs -else - # MS-DOS does not allow filenames that begin with a dot. - lt_cv_objdir=_libs -fi -rmdir .libs 2>/dev/null -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_objdir" >&5 -$as_echo "$lt_cv_objdir" >&6; } -objdir=$lt_cv_objdir - - - - - -cat >>confdefs.h <<_ACEOF -@%:@define LT_OBJDIR "$lt_cv_objdir/" -_ACEOF - - - - -case $host_os in -aix3*) - # AIX sometimes has problems with the GCC collect2 program. For some - # reason, if we set the COLLECT_NAMES environment variable, the problems - # vanish in a puff of smoke. - if test "X${COLLECT_NAMES+set}" != Xset; then - COLLECT_NAMES= - export COLLECT_NAMES - fi - ;; -esac - -# Global variables: -ofile=libtool -can_build_shared=yes - -# All known linkers require a `.a' archive for static linking (except MSVC, -# which needs '.lib'). -libext=a - -with_gnu_ld="$lt_cv_prog_gnu_ld" - -old_CC="$CC" -old_CFLAGS="$CFLAGS" - -# Set sane defaults for various variables -test -z "$CC" && CC=cc -test -z "$LTCC" && LTCC=$CC -test -z "$LTCFLAGS" && LTCFLAGS=$CFLAGS -test -z "$LD" && LD=ld -test -z "$ac_objext" && ac_objext=o - -for cc_temp in $compiler""; do - case $cc_temp in - compile | *[\\/]compile | ccache | *[\\/]ccache ) ;; - distcc | *[\\/]distcc | purify | *[\\/]purify ) ;; - \-*) ;; - *) break;; - esac -done -cc_basename=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"` - - -# Only perform the check for file, if the check method requires it -test -z "$MAGIC_CMD" && MAGIC_CMD=file -case $deplibs_check_method in -file_magic*) - if test "$file_magic_cmd" = '$MAGIC_CMD'; then - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ${ac_tool_prefix}file" >&5 -$as_echo_n "checking for ${ac_tool_prefix}file... " >&6; } -if ${lt_cv_path_MAGIC_CMD+:} false; then : - $as_echo_n "(cached) " >&6 -else - case $MAGIC_CMD in -[\\/*] | ?:[\\/]*) - lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path. - ;; -*) - lt_save_MAGIC_CMD="$MAGIC_CMD" - lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR - ac_dummy="/usr/bin$PATH_SEPARATOR$PATH" - for ac_dir in $ac_dummy; do - IFS="$lt_save_ifs" - test -z "$ac_dir" && ac_dir=. - if test -f $ac_dir/${ac_tool_prefix}file; then - lt_cv_path_MAGIC_CMD="$ac_dir/${ac_tool_prefix}file" - if test -n "$file_magic_test_file"; then - case $deplibs_check_method in - "file_magic "*) - file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"` - MAGIC_CMD="$lt_cv_path_MAGIC_CMD" - if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null | - $EGREP "$file_magic_regex" > /dev/null; then - : - else - cat <<_LT_EOF 1>&2 - -*** Warning: the command libtool uses to detect shared libraries, -*** $file_magic_cmd, produces output that libtool cannot recognize. -*** The result is that libtool may fail to recognize shared libraries -*** as such. This will affect the creation of libtool libraries that -*** depend on shared libraries, but programs linked with such libtool -*** libraries will work regardless of this problem. Nevertheless, you -*** may want to report the problem to your system manager and/or to -*** bug-libtool@gnu.org - -_LT_EOF - fi ;; - esac - fi - break - fi - done - IFS="$lt_save_ifs" - MAGIC_CMD="$lt_save_MAGIC_CMD" - ;; -esac -fi - -MAGIC_CMD="$lt_cv_path_MAGIC_CMD" -if test -n "$MAGIC_CMD"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MAGIC_CMD" >&5 -$as_echo "$MAGIC_CMD" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - - - - -if test -z "$lt_cv_path_MAGIC_CMD"; then - if test -n "$ac_tool_prefix"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for file" >&5 -$as_echo_n "checking for file... " >&6; } -if ${lt_cv_path_MAGIC_CMD+:} false; then : - $as_echo_n "(cached) " >&6 -else - case $MAGIC_CMD in -[\\/*] | ?:[\\/]*) - lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path. - ;; -*) - lt_save_MAGIC_CMD="$MAGIC_CMD" - lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR - ac_dummy="/usr/bin$PATH_SEPARATOR$PATH" - for ac_dir in $ac_dummy; do - IFS="$lt_save_ifs" - test -z "$ac_dir" && ac_dir=. - if test -f $ac_dir/file; then - lt_cv_path_MAGIC_CMD="$ac_dir/file" - if test -n "$file_magic_test_file"; then - case $deplibs_check_method in - "file_magic "*) - file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"` - MAGIC_CMD="$lt_cv_path_MAGIC_CMD" - if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null | - $EGREP "$file_magic_regex" > /dev/null; then - : - else - cat <<_LT_EOF 1>&2 - -*** Warning: the command libtool uses to detect shared libraries, -*** $file_magic_cmd, produces output that libtool cannot recognize. -*** The result is that libtool may fail to recognize shared libraries -*** as such. This will affect the creation of libtool libraries that -*** depend on shared libraries, but programs linked with such libtool -*** libraries will work regardless of this problem. Nevertheless, you -*** may want to report the problem to your system manager and/or to -*** bug-libtool@gnu.org - -_LT_EOF - fi ;; - esac - fi - break - fi - done - IFS="$lt_save_ifs" - MAGIC_CMD="$lt_save_MAGIC_CMD" - ;; -esac -fi - -MAGIC_CMD="$lt_cv_path_MAGIC_CMD" -if test -n "$MAGIC_CMD"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MAGIC_CMD" >&5 -$as_echo "$MAGIC_CMD" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - - else - MAGIC_CMD=: - fi -fi - - fi - ;; -esac - -# Use C for the default configuration in the libtool script - -lt_save_CC="$CC" -ac_ext=c -ac_cpp='$CPP $CPPFLAGS' -ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_c_compiler_gnu - - -# Source file extension for C test sources. -ac_ext=c - -# Object file extension for compiled C test sources. -objext=o -objext=$objext - -# Code to be used in simple compile tests -lt_simple_compile_test_code="int some_variable = 0;" - -# Code to be used in simple link tests -lt_simple_link_test_code='int main(){return(0);}' - - - - - - - -# If no C compiler was specified, use CC. -LTCC=${LTCC-"$CC"} - -# If no C compiler flags were specified, use CFLAGS. -LTCFLAGS=${LTCFLAGS-"$CFLAGS"} - -# Allow CC to be a program name with arguments. -compiler=$CC - -# Save the default compiler, since it gets overwritten when the other -# tags are being tested, and _LT_TAGVAR(compiler, []) is a NOP. -compiler_DEFAULT=$CC - -# save warnings/boilerplate of simple test code -ac_outfile=conftest.$ac_objext -echo "$lt_simple_compile_test_code" >conftest.$ac_ext -eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err -_lt_compiler_boilerplate=`cat conftest.err` -$RM conftest* - -ac_outfile=conftest.$ac_objext -echo "$lt_simple_link_test_code" >conftest.$ac_ext -eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err -_lt_linker_boilerplate=`cat conftest.err` -$RM -r conftest* - - -## CAVEAT EMPTOR: -## There is no encapsulation within the following macros, do not change -## the running order or otherwise move them around unless you know exactly -## what you are doing... -if test -n "$compiler"; then - -lt_prog_compiler_no_builtin_flag= - -if test "$GCC" = yes; then - case $cc_basename in - nvcc*) - lt_prog_compiler_no_builtin_flag=' -Xcompiler -fno-builtin' ;; - *) - lt_prog_compiler_no_builtin_flag=' -fno-builtin' ;; - esac - - { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -fno-rtti -fno-exceptions" >&5 -$as_echo_n "checking if $compiler supports -fno-rtti -fno-exceptions... " >&6; } -if ${lt_cv_prog_compiler_rtti_exceptions+:} false; then : - $as_echo_n "(cached) " >&6 -else - lt_cv_prog_compiler_rtti_exceptions=no - ac_outfile=conftest.$ac_objext - echo "$lt_simple_compile_test_code" > conftest.$ac_ext - lt_compiler_flag="-fno-rtti -fno-exceptions" - # Insert the option either (1) after the last *FLAGS variable, or - # (2) before a word containing "conftest.", or (3) at the end. - # Note that $ac_compile itself does not contain backslashes and begins - # with a dollar sign (not a hyphen), so the echo should work correctly. - # The option is referenced via a variable to avoid confusing sed. - lt_compile=`echo "$ac_compile" | $SED \ - -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ - -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ - -e 's:$: $lt_compiler_flag:'` - (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) - (eval "$lt_compile" 2>conftest.err) - ac_status=$? - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - if (exit $ac_status) && test -s "$ac_outfile"; then - # The compiler can only warn and ignore the option if not recognized - # So say no if there are warnings other than the usual output. - $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp - $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 - if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then - lt_cv_prog_compiler_rtti_exceptions=yes - fi - fi - $RM conftest* - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_rtti_exceptions" >&5 -$as_echo "$lt_cv_prog_compiler_rtti_exceptions" >&6; } - -if test x"$lt_cv_prog_compiler_rtti_exceptions" = xyes; then - lt_prog_compiler_no_builtin_flag="$lt_prog_compiler_no_builtin_flag -fno-rtti -fno-exceptions" -else - : -fi - -fi - - - - - - - lt_prog_compiler_wl= -lt_prog_compiler_pic= -lt_prog_compiler_static= - - - if test "$GCC" = yes; then - lt_prog_compiler_wl='-Wl,' - lt_prog_compiler_static='-static' - - case $host_os in - aix*) - # All AIX code is PIC. - if test "$host_cpu" = ia64; then - # AIX 5 now supports IA64 processor - lt_prog_compiler_static='-Bstatic' - fi - ;; - - amigaos*) - case $host_cpu in - powerpc) - # see comment about AmigaOS4 .so support - lt_prog_compiler_pic='-fPIC' - ;; - m68k) - # FIXME: we need at least 68020 code to build shared libraries, but - # adding the `-m68020' flag to GCC prevents building anything better, - # like `-m68040'. - lt_prog_compiler_pic='-m68020 -resident32 -malways-restore-a4' - ;; - esac - ;; - - beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) - # PIC is the default for these OSes. - ;; - - mingw* | cygwin* | pw32* | os2* | cegcc*) - # This hack is so that the source file can tell whether it is being - # built for inclusion in a dll (and should export symbols for example). - # Although the cygwin gcc ignores -fPIC, still need this for old-style - # (--disable-auto-import) libraries - lt_prog_compiler_pic='-DDLL_EXPORT' - ;; - - darwin* | rhapsody*) - # PIC is the default on this platform - # Common symbols not allowed in MH_DYLIB files - lt_prog_compiler_pic='-fno-common' - ;; - - haiku*) - # PIC is the default for Haiku. - # The "-static" flag exists, but is broken. - lt_prog_compiler_static= - ;; - - hpux*) - # PIC is the default for 64-bit PA HP-UX, but not for 32-bit - # PA HP-UX. On IA64 HP-UX, PIC is the default but the pic flag - # sets the default TLS model and affects inlining. - case $host_cpu in - hppa*64*) - # +Z the default - ;; - *) - lt_prog_compiler_pic='-fPIC' - ;; - esac - ;; - - interix[3-9]*) - # Interix 3.x gcc -fpic/-fPIC options generate broken code. - # Instead, we relocate shared libraries at runtime. - ;; - - msdosdjgpp*) - # Just because we use GCC doesn't mean we suddenly get shared libraries - # on systems that don't support them. - lt_prog_compiler_can_build_shared=no - enable_shared=no - ;; - - *nto* | *qnx*) - # QNX uses GNU C++, but need to define -shared option too, otherwise - # it will coredump. - lt_prog_compiler_pic='-fPIC -shared' - ;; - - sysv4*MP*) - if test -d /usr/nec; then - lt_prog_compiler_pic=-Kconform_pic - fi - ;; - - *) - lt_prog_compiler_pic='-fPIC' - ;; - esac - - case $cc_basename in - nvcc*) # Cuda Compiler Driver 2.2 - lt_prog_compiler_wl='-Xlinker ' - if test -n "$lt_prog_compiler_pic"; then - lt_prog_compiler_pic="-Xcompiler $lt_prog_compiler_pic" - fi - ;; - esac - else - # PORTME Check for flag to pass linker flags through the system compiler. - case $host_os in - aix*) - lt_prog_compiler_wl='-Wl,' - if test "$host_cpu" = ia64; then - # AIX 5 now supports IA64 processor - lt_prog_compiler_static='-Bstatic' - else - lt_prog_compiler_static='-bnso -bI:/lib/syscalls.exp' - fi - ;; - - mingw* | cygwin* | pw32* | os2* | cegcc*) - # This hack is so that the source file can tell whether it is being - # built for inclusion in a dll (and should export symbols for example). - lt_prog_compiler_pic='-DDLL_EXPORT' - ;; - - hpux9* | hpux10* | hpux11*) - lt_prog_compiler_wl='-Wl,' - # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but - # not for PA HP-UX. - case $host_cpu in - hppa*64*|ia64*) - # +Z the default - ;; - *) - lt_prog_compiler_pic='+Z' - ;; - esac - # Is there a better lt_prog_compiler_static that works with the bundled CC? - lt_prog_compiler_static='${wl}-a ${wl}archive' - ;; - - irix5* | irix6* | nonstopux*) - lt_prog_compiler_wl='-Wl,' - # PIC (with -KPIC) is the default. - lt_prog_compiler_static='-non_shared' - ;; - - linux* | k*bsd*-gnu | kopensolaris*-gnu) - case $cc_basename in - # old Intel for x86_64 which still supported -KPIC. - ecc*) - lt_prog_compiler_wl='-Wl,' - lt_prog_compiler_pic='-KPIC' - lt_prog_compiler_static='-static' - ;; - # icc used to be incompatible with GCC. - # ICC 10 doesn't accept -KPIC any more. - icc* | ifort*) - lt_prog_compiler_wl='-Wl,' - lt_prog_compiler_pic='-fPIC' - lt_prog_compiler_static='-static' - ;; - # Lahey Fortran 8.1. - lf95*) - lt_prog_compiler_wl='-Wl,' - lt_prog_compiler_pic='--shared' - lt_prog_compiler_static='--static' - ;; - nagfor*) - # NAG Fortran compiler - lt_prog_compiler_wl='-Wl,-Wl,,' - lt_prog_compiler_pic='-PIC' - lt_prog_compiler_static='-Bstatic' - ;; - pgcc* | pgf77* | pgf90* | pgf95* | pgfortran*) - # Portland Group compilers (*not* the Pentium gcc compiler, - # which looks to be a dead project) - lt_prog_compiler_wl='-Wl,' - lt_prog_compiler_pic='-fpic' - lt_prog_compiler_static='-Bstatic' - ;; - ccc*) - lt_prog_compiler_wl='-Wl,' - # All Alpha code is PIC. - lt_prog_compiler_static='-non_shared' - ;; - xl* | bgxl* | bgf* | mpixl*) - # IBM XL C 8.0/Fortran 10.1, 11.1 on PPC and BlueGene - lt_prog_compiler_wl='-Wl,' - lt_prog_compiler_pic='-qpic' - lt_prog_compiler_static='-qstaticlink' - ;; - *) - case `$CC -V 2>&1 | sed 5q` in - *Sun\ Ceres\ Fortran* | *Sun*Fortran*\ [1-7].* | *Sun*Fortran*\ 8.[0-3]*) - # Sun Fortran 8.3 passes all unrecognized flags to the linker - lt_prog_compiler_pic='-KPIC' - lt_prog_compiler_static='-Bstatic' - lt_prog_compiler_wl='' - ;; - *Sun\ F* | *Sun*Fortran*) - lt_prog_compiler_pic='-KPIC' - lt_prog_compiler_static='-Bstatic' - lt_prog_compiler_wl='-Qoption ld ' - ;; - *Sun\ C*) - # Sun C 5.9 - lt_prog_compiler_pic='-KPIC' - lt_prog_compiler_static='-Bstatic' - lt_prog_compiler_wl='-Wl,' - ;; - *Intel*\ [CF]*Compiler*) - lt_prog_compiler_wl='-Wl,' - lt_prog_compiler_pic='-fPIC' - lt_prog_compiler_static='-static' - ;; - *Portland\ Group*) - lt_prog_compiler_wl='-Wl,' - lt_prog_compiler_pic='-fpic' - lt_prog_compiler_static='-Bstatic' - ;; - esac - ;; - esac - ;; - - newsos6) - lt_prog_compiler_pic='-KPIC' - lt_prog_compiler_static='-Bstatic' - ;; - - *nto* | *qnx*) - # QNX uses GNU C++, but need to define -shared option too, otherwise - # it will coredump. - lt_prog_compiler_pic='-fPIC -shared' - ;; - - osf3* | osf4* | osf5*) - lt_prog_compiler_wl='-Wl,' - # All OSF/1 code is PIC. - lt_prog_compiler_static='-non_shared' - ;; - - rdos*) - lt_prog_compiler_static='-non_shared' - ;; - - solaris*) - lt_prog_compiler_pic='-KPIC' - lt_prog_compiler_static='-Bstatic' - case $cc_basename in - f77* | f90* | f95* | sunf77* | sunf90* | sunf95*) - lt_prog_compiler_wl='-Qoption ld ';; - *) - lt_prog_compiler_wl='-Wl,';; - esac - ;; - - sunos4*) - lt_prog_compiler_wl='-Qoption ld ' - lt_prog_compiler_pic='-PIC' - lt_prog_compiler_static='-Bstatic' - ;; - - sysv4 | sysv4.2uw2* | sysv4.3*) - lt_prog_compiler_wl='-Wl,' - lt_prog_compiler_pic='-KPIC' - lt_prog_compiler_static='-Bstatic' - ;; - - sysv4*MP*) - if test -d /usr/nec ;then - lt_prog_compiler_pic='-Kconform_pic' - lt_prog_compiler_static='-Bstatic' - fi - ;; - - sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) - lt_prog_compiler_wl='-Wl,' - lt_prog_compiler_pic='-KPIC' - lt_prog_compiler_static='-Bstatic' - ;; - - unicos*) - lt_prog_compiler_wl='-Wl,' - lt_prog_compiler_can_build_shared=no - ;; - - uts4*) - lt_prog_compiler_pic='-pic' - lt_prog_compiler_static='-Bstatic' - ;; - - *) - lt_prog_compiler_can_build_shared=no - ;; - esac - fi - -case $host_os in - # For platforms which do not support PIC, -DPIC is meaningless: - *djgpp*) - lt_prog_compiler_pic= - ;; - *) - lt_prog_compiler_pic="$lt_prog_compiler_pic@&t@ -DPIC" - ;; -esac - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $compiler option to produce PIC" >&5 -$as_echo_n "checking for $compiler option to produce PIC... " >&6; } -if ${lt_cv_prog_compiler_pic+:} false; then : - $as_echo_n "(cached) " >&6 -else - lt_cv_prog_compiler_pic=$lt_prog_compiler_pic -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic" >&5 -$as_echo "$lt_cv_prog_compiler_pic" >&6; } -lt_prog_compiler_pic=$lt_cv_prog_compiler_pic - -# -# Check to make sure the PIC flag actually works. -# -if test -n "$lt_prog_compiler_pic"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler PIC flag $lt_prog_compiler_pic works" >&5 -$as_echo_n "checking if $compiler PIC flag $lt_prog_compiler_pic works... " >&6; } -if ${lt_cv_prog_compiler_pic_works+:} false; then : - $as_echo_n "(cached) " >&6 -else - lt_cv_prog_compiler_pic_works=no - ac_outfile=conftest.$ac_objext - echo "$lt_simple_compile_test_code" > conftest.$ac_ext - lt_compiler_flag="$lt_prog_compiler_pic@&t@ -DPIC" - # Insert the option either (1) after the last *FLAGS variable, or - # (2) before a word containing "conftest.", or (3) at the end. - # Note that $ac_compile itself does not contain backslashes and begins - # with a dollar sign (not a hyphen), so the echo should work correctly. - # The option is referenced via a variable to avoid confusing sed. - lt_compile=`echo "$ac_compile" | $SED \ - -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ - -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ - -e 's:$: $lt_compiler_flag:'` - (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) - (eval "$lt_compile" 2>conftest.err) - ac_status=$? - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - if (exit $ac_status) && test -s "$ac_outfile"; then - # The compiler can only warn and ignore the option if not recognized - # So say no if there are warnings other than the usual output. - $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp - $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 - if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then - lt_cv_prog_compiler_pic_works=yes - fi - fi - $RM conftest* - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic_works" >&5 -$as_echo "$lt_cv_prog_compiler_pic_works" >&6; } - -if test x"$lt_cv_prog_compiler_pic_works" = xyes; then - case $lt_prog_compiler_pic in - "" | " "*) ;; - *) lt_prog_compiler_pic=" $lt_prog_compiler_pic" ;; - esac -else - lt_prog_compiler_pic= - lt_prog_compiler_can_build_shared=no -fi - -fi - - - - - - - - - - - -# -# Check to make sure the static flag actually works. -# -wl=$lt_prog_compiler_wl eval lt_tmp_static_flag=\"$lt_prog_compiler_static\" -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler static flag $lt_tmp_static_flag works" >&5 -$as_echo_n "checking if $compiler static flag $lt_tmp_static_flag works... " >&6; } -if ${lt_cv_prog_compiler_static_works+:} false; then : - $as_echo_n "(cached) " >&6 -else - lt_cv_prog_compiler_static_works=no - save_LDFLAGS="$LDFLAGS" - LDFLAGS="$LDFLAGS $lt_tmp_static_flag" - echo "$lt_simple_link_test_code" > conftest.$ac_ext - if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then - # The linker can only warn and ignore the option if not recognized - # So say no if there are warnings - if test -s conftest.err; then - # Append any errors to the config.log. - cat conftest.err 1>&5 - $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp - $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 - if diff conftest.exp conftest.er2 >/dev/null; then - lt_cv_prog_compiler_static_works=yes - fi - else - lt_cv_prog_compiler_static_works=yes - fi - fi - $RM -r conftest* - LDFLAGS="$save_LDFLAGS" - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_static_works" >&5 -$as_echo "$lt_cv_prog_compiler_static_works" >&6; } - -if test x"$lt_cv_prog_compiler_static_works" = xyes; then - : -else - lt_prog_compiler_static= -fi - - - - - - - - { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5 -$as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; } -if ${lt_cv_prog_compiler_c_o+:} false; then : - $as_echo_n "(cached) " >&6 -else - lt_cv_prog_compiler_c_o=no - $RM -r conftest 2>/dev/null - mkdir conftest - cd conftest - mkdir out - echo "$lt_simple_compile_test_code" > conftest.$ac_ext - - lt_compiler_flag="-o out/conftest2.$ac_objext" - # Insert the option either (1) after the last *FLAGS variable, or - # (2) before a word containing "conftest.", or (3) at the end. - # Note that $ac_compile itself does not contain backslashes and begins - # with a dollar sign (not a hyphen), so the echo should work correctly. - lt_compile=`echo "$ac_compile" | $SED \ - -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ - -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ - -e 's:$: $lt_compiler_flag:'` - (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) - (eval "$lt_compile" 2>out/conftest.err) - ac_status=$? - cat out/conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - if (exit $ac_status) && test -s out/conftest2.$ac_objext - then - # The compiler can only warn and ignore the option if not recognized - # So say no if there are warnings - $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp - $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 - if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then - lt_cv_prog_compiler_c_o=yes - fi - fi - chmod u+w . 2>&5 - $RM conftest* - # SGI C++ compiler will create directory out/ii_files/ for - # template instantiation - test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files - $RM out/* && rmdir out - cd .. - $RM -r conftest - $RM conftest* - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o" >&5 -$as_echo "$lt_cv_prog_compiler_c_o" >&6; } - - - - - - - { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5 -$as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; } -if ${lt_cv_prog_compiler_c_o+:} false; then : - $as_echo_n "(cached) " >&6 -else - lt_cv_prog_compiler_c_o=no - $RM -r conftest 2>/dev/null - mkdir conftest - cd conftest - mkdir out - echo "$lt_simple_compile_test_code" > conftest.$ac_ext - - lt_compiler_flag="-o out/conftest2.$ac_objext" - # Insert the option either (1) after the last *FLAGS variable, or - # (2) before a word containing "conftest.", or (3) at the end. - # Note that $ac_compile itself does not contain backslashes and begins - # with a dollar sign (not a hyphen), so the echo should work correctly. - lt_compile=`echo "$ac_compile" | $SED \ - -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ - -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ - -e 's:$: $lt_compiler_flag:'` - (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) - (eval "$lt_compile" 2>out/conftest.err) - ac_status=$? - cat out/conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - if (exit $ac_status) && test -s out/conftest2.$ac_objext - then - # The compiler can only warn and ignore the option if not recognized - # So say no if there are warnings - $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp - $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 - if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then - lt_cv_prog_compiler_c_o=yes - fi - fi - chmod u+w . 2>&5 - $RM conftest* - # SGI C++ compiler will create directory out/ii_files/ for - # template instantiation - test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files - $RM out/* && rmdir out - cd .. - $RM -r conftest - $RM conftest* - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o" >&5 -$as_echo "$lt_cv_prog_compiler_c_o" >&6; } - - - - -hard_links="nottested" -if test "$lt_cv_prog_compiler_c_o" = no && test "$need_locks" != no; then - # do not overwrite the value of need_locks provided by the user - { $as_echo "$as_me:${as_lineno-$LINENO}: checking if we can lock with hard links" >&5 -$as_echo_n "checking if we can lock with hard links... " >&6; } - hard_links=yes - $RM conftest* - ln conftest.a conftest.b 2>/dev/null && hard_links=no - touch conftest.a - ln conftest.a conftest.b 2>&5 || hard_links=no - ln conftest.a conftest.b 2>/dev/null && hard_links=no - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $hard_links" >&5 -$as_echo "$hard_links" >&6; } - if test "$hard_links" = no; then - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&5 -$as_echo "$as_me: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&2;} - need_locks=warn - fi -else - need_locks=no -fi - - - - - - - { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $compiler linker ($LD) supports shared libraries" >&5 -$as_echo_n "checking whether the $compiler linker ($LD) supports shared libraries... " >&6; } - - runpath_var= - allow_undefined_flag= - always_export_symbols=no - archive_cmds= - archive_expsym_cmds= - compiler_needs_object=no - enable_shared_with_static_runtimes=no - export_dynamic_flag_spec= - export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' - hardcode_automatic=no - hardcode_direct=no - hardcode_direct_absolute=no - hardcode_libdir_flag_spec= - hardcode_libdir_separator= - hardcode_minus_L=no - hardcode_shlibpath_var=unsupported - inherit_rpath=no - link_all_deplibs=unknown - module_cmds= - module_expsym_cmds= - old_archive_from_new_cmds= - old_archive_from_expsyms_cmds= - thread_safe_flag_spec= - whole_archive_flag_spec= - # include_expsyms should be a list of space-separated symbols to be *always* - # included in the symbol list - include_expsyms= - # exclude_expsyms can be an extended regexp of symbols to exclude - # it will be wrapped by ` (' and `)$', so one must not match beginning or - # end of line. Example: `a|bc|.*d.*' will exclude the symbols `a' and `bc', - # as well as any symbol that contains `d'. - exclude_expsyms='_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*' - # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out - # platforms (ab)use it in PIC code, but their linkers get confused if - # the symbol is explicitly referenced. Since portable code cannot - # rely on this symbol name, it's probably fine to never include it in - # preloaded symbol tables. - # Exclude shared library initialization/finalization symbols. - extract_expsyms_cmds= - - case $host_os in - cygwin* | mingw* | pw32* | cegcc*) - # FIXME: the MSVC++ port hasn't been tested in a loooong time - # When not using gcc, we currently assume that we are using - # Microsoft Visual C++. - if test "$GCC" != yes; then - with_gnu_ld=no - fi - ;; - interix*) - # we just hope/assume this is gcc and not c89 (= MSVC++) - with_gnu_ld=yes - ;; - openbsd*) - with_gnu_ld=no - ;; - linux* | k*bsd*-gnu | gnu*) - link_all_deplibs=no - ;; - esac - - ld_shlibs=yes - - # On some targets, GNU ld is compatible enough with the native linker - # that we're better off using the native interface for both. - lt_use_gnu_ld_interface=no - if test "$with_gnu_ld" = yes; then - case $host_os in - aix*) - # The AIX port of GNU ld has always aspired to compatibility - # with the native linker. However, as the warning in the GNU ld - # block says, versions before 2.19.5* couldn't really create working - # shared libraries, regardless of the interface used. - case `$LD -v 2>&1` in - *\ \(GNU\ Binutils\)\ 2.19.5*) ;; - *\ \(GNU\ Binutils\)\ 2.[2-9]*) ;; - *\ \(GNU\ Binutils\)\ [3-9]*) ;; - *) - lt_use_gnu_ld_interface=yes - ;; - esac - ;; - *) - lt_use_gnu_ld_interface=yes - ;; - esac - fi - - if test "$lt_use_gnu_ld_interface" = yes; then - # If archive_cmds runs LD, not CC, wlarc should be empty - wlarc='${wl}' - - # Set some defaults for GNU ld with shared library support. These - # are reset later if shared libraries are not supported. Putting them - # here allows them to be overridden if necessary. - runpath_var=LD_RUN_PATH - hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' - export_dynamic_flag_spec='${wl}--export-dynamic' - # ancient GNU ld didn't support --whole-archive et. al. - if $LD --help 2>&1 | $GREP 'no-whole-archive' > /dev/null; then - whole_archive_flag_spec="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' - else - whole_archive_flag_spec= - fi - supports_anon_versioning=no - case `$LD -v 2>&1` in - *GNU\ gold*) supports_anon_versioning=yes ;; - *\ [01].* | *\ 2.[0-9].* | *\ 2.10.*) ;; # catch versions < 2.11 - *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ... - *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ... - *\ 2.11.*) ;; # other 2.11 versions - *) supports_anon_versioning=yes ;; - esac - - # See if GNU ld supports shared libraries. - case $host_os in - aix[3-9]*) - # On AIX/PPC, the GNU linker is very broken - if test "$host_cpu" != ia64; then - ld_shlibs=no - cat <<_LT_EOF 1>&2 - -*** Warning: the GNU linker, at least up to release 2.19, is reported -*** to be unable to reliably create shared libraries on AIX. -*** Therefore, libtool is disabling shared libraries support. If you -*** really care for shared libraries, you may want to install binutils -*** 2.20 or above, or modify your PATH so that a non-GNU linker is found. -*** You will then need to restart the configuration process. - -_LT_EOF - fi - ;; - - amigaos*) - case $host_cpu in - powerpc) - # see comment about AmigaOS4 .so support - archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' - archive_expsym_cmds='' - ;; - m68k) - archive_cmds='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' - hardcode_libdir_flag_spec='-L$libdir' - hardcode_minus_L=yes - ;; - esac - ;; - - beos*) - if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then - allow_undefined_flag=unsupported - # Joseph Beckenbach says some releases of gcc - # support --undefined. This deserves some investigation. FIXME - archive_cmds='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' - else - ld_shlibs=no - fi - ;; - - cygwin* | mingw* | pw32* | cegcc*) - # _LT_TAGVAR(hardcode_libdir_flag_spec, ) is actually meaningless, - # as there is no search path for DLLs. - hardcode_libdir_flag_spec='-L$libdir' - export_dynamic_flag_spec='${wl}--export-all-symbols' - allow_undefined_flag=unsupported - always_export_symbols=no - enable_shared_with_static_runtimes=yes - export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1 DATA/;s/^.*[ ]__nm__\([^ ]*\)[ ][^ ]*/\1 DATA/;/^I[ ]/d;/^[AITW][ ]/s/.* //'\'' | sort | uniq > $export_symbols' - exclude_expsyms='[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname' - - if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then - archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' - # If the export-symbols file already is a .def file (1st line - # is EXPORTS), use it as is; otherwise, prepend... - archive_expsym_cmds='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then - cp $export_symbols $output_objdir/$soname.def; - else - echo EXPORTS > $output_objdir/$soname.def; - cat $export_symbols >> $output_objdir/$soname.def; - fi~ - $CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' - else - ld_shlibs=no - fi - ;; - - haiku*) - archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' - link_all_deplibs=yes - ;; - - interix[3-9]*) - hardcode_direct=no - hardcode_shlibpath_var=no - hardcode_libdir_flag_spec='${wl}-rpath,$libdir' - export_dynamic_flag_spec='${wl}-E' - # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. - # Instead, shared libraries are loaded at an image base (0x10000000 by - # default) and relocated if they conflict, which is a slow very memory - # consuming and fragmenting process. To avoid this, we pick a random, - # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link - # time. Moving up from 0x10000000 also allows more sbrk(2) space. - archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' - archive_expsym_cmds='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' - ;; - - gnu* | linux* | tpf* | k*bsd*-gnu | kopensolaris*-gnu) - tmp_diet=no - if test "$host_os" = linux-dietlibc; then - case $cc_basename in - diet\ *) tmp_diet=yes;; # linux-dietlibc with static linking (!diet-dyn) - esac - fi - if $LD --help 2>&1 | $EGREP ': supported targets:.* elf' > /dev/null \ - && test "$tmp_diet" = no - then - tmp_addflag=' $pic_flag' - tmp_sharedflag='-shared' - case $cc_basename,$host_cpu in - pgcc*) # Portland Group C compiler - whole_archive_flag_spec='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' - tmp_addflag=' $pic_flag' - ;; - pgf77* | pgf90* | pgf95* | pgfortran*) - # Portland Group f77 and f90 compilers - whole_archive_flag_spec='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' - tmp_addflag=' $pic_flag -Mnomain' ;; - ecc*,ia64* | icc*,ia64*) # Intel C compiler on ia64 - tmp_addflag=' -i_dynamic' ;; - efc*,ia64* | ifort*,ia64*) # Intel Fortran compiler on ia64 - tmp_addflag=' -i_dynamic -nofor_main' ;; - ifc* | ifort*) # Intel Fortran compiler - tmp_addflag=' -nofor_main' ;; - lf95*) # Lahey Fortran 8.1 - whole_archive_flag_spec= - tmp_sharedflag='--shared' ;; - xl[cC]* | bgxl[cC]* | mpixl[cC]*) # IBM XL C 8.0 on PPC (deal with xlf below) - tmp_sharedflag='-qmkshrobj' - tmp_addflag= ;; - nvcc*) # Cuda Compiler Driver 2.2 - whole_archive_flag_spec='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' - compiler_needs_object=yes - ;; - esac - case `$CC -V 2>&1 | sed 5q` in - *Sun\ C*) # Sun C 5.9 - whole_archive_flag_spec='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' - compiler_needs_object=yes - tmp_sharedflag='-G' ;; - *Sun\ F*) # Sun Fortran 8.3 - tmp_sharedflag='-G' ;; - esac - archive_cmds='$CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' - - if test "x$supports_anon_versioning" = xyes; then - archive_expsym_cmds='echo "{ global:" > $output_objdir/$libname.ver~ - cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ - echo "local: *; };" >> $output_objdir/$libname.ver~ - $CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib' - fi - - case $cc_basename in - xlf* | bgf* | bgxlf* | mpixlf*) - # IBM XL Fortran 10.1 on PPC cannot create shared libs itself - whole_archive_flag_spec='--whole-archive$convenience --no-whole-archive' - hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' - archive_cmds='$LD -shared $libobjs $deplibs $linker_flags -soname $soname -o $lib' - if test "x$supports_anon_versioning" = xyes; then - archive_expsym_cmds='echo "{ global:" > $output_objdir/$libname.ver~ - cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ - echo "local: *; };" >> $output_objdir/$libname.ver~ - $LD -shared $libobjs $deplibs $linker_flags -soname $soname -version-script $output_objdir/$libname.ver -o $lib' - fi - ;; - esac - else - ld_shlibs=no - fi - ;; - - netbsd* | netbsdelf*-gnu) - if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then - archive_cmds='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib' - wlarc= - else - archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' - archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' - fi - ;; - - solaris*) - if $LD -v 2>&1 | $GREP 'BFD 2\.8' > /dev/null; then - ld_shlibs=no - cat <<_LT_EOF 1>&2 - -*** Warning: The releases 2.8.* of the GNU linker cannot reliably -*** create shared libraries on Solaris systems. Therefore, libtool -*** is disabling shared libraries support. We urge you to upgrade GNU -*** binutils to release 2.9.1 or newer. Another option is to modify -*** your PATH or compiler configuration so that the native linker is -*** used, and then restart. - -_LT_EOF - elif $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then - archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' - archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' - else - ld_shlibs=no - fi - ;; - - sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*) - case `$LD -v 2>&1` in - *\ [01].* | *\ 2.[0-9].* | *\ 2.1[0-5].*) - ld_shlibs=no - cat <<_LT_EOF 1>&2 - -*** Warning: Releases of the GNU linker prior to 2.16.91.0.3 can not -*** reliably create shared libraries on SCO systems. Therefore, libtool -*** is disabling shared libraries support. We urge you to upgrade GNU -*** binutils to release 2.16.91.0.3 or newer. Another option is to modify -*** your PATH or compiler configuration so that the native linker is -*** used, and then restart. - -_LT_EOF - ;; - *) - # For security reasons, it is highly recommended that you always - # use absolute paths for naming shared libraries, and exclude the - # DT_RUNPATH tag from executables and libraries. But doing so - # requires that you compile everything twice, which is a pain. - if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then - hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' - archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' - archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' - else - ld_shlibs=no - fi - ;; - esac - ;; - - sunos4*) - archive_cmds='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags' - wlarc= - hardcode_direct=yes - hardcode_shlibpath_var=no - ;; - - *) - if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then - archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' - archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' - else - ld_shlibs=no - fi - ;; - esac - - if test "$ld_shlibs" = no; then - runpath_var= - hardcode_libdir_flag_spec= - export_dynamic_flag_spec= - whole_archive_flag_spec= - fi - else - # PORTME fill in a description of your system's linker (not GNU ld) - case $host_os in - aix3*) - allow_undefined_flag=unsupported - always_export_symbols=yes - archive_expsym_cmds='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname' - # Note: this linker hardcodes the directories in LIBPATH if there - # are no directories specified by -L. - hardcode_minus_L=yes - if test "$GCC" = yes && test -z "$lt_prog_compiler_static"; then - # Neither direct hardcoding nor static linking is supported with a - # broken collect2. - hardcode_direct=unsupported - fi - ;; - - aix[4-9]*) - if test "$host_cpu" = ia64; then - # On IA64, the linker does run time linking by default, so we don't - # have to do anything special. - aix_use_runtimelinking=no - exp_sym_flag='-Bexport' - no_entry_flag="" - else - # If we're using GNU nm, then we don't want the "-C" option. - # -C means demangle to AIX nm, but means don't demangle with GNU nm - # Also, AIX nm treats weak defined symbols like other global - # defined symbols, whereas GNU nm marks them as "W". - if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then - export_symbols_cmds='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && (substr(\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' - else - export_symbols_cmds='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && (substr(\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' - fi - aix_use_runtimelinking=no - - # Test if we are trying to use run time linking or normal - # AIX style linking. If -brtl is somewhere in LDFLAGS, we - # need to do runtime linking. - case $host_os in aix4.[23]|aix4.[23].*|aix[5-9]*) - for ld_flag in $LDFLAGS; do - if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then - aix_use_runtimelinking=yes - break - fi - done - ;; - esac - - exp_sym_flag='-bexport' - no_entry_flag='-bnoentry' - fi - - # When large executables or shared objects are built, AIX ld can - # have problems creating the table of contents. If linking a library - # or program results in "error TOC overflow" add -mminimal-toc to - # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not - # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. - - archive_cmds='' - hardcode_direct=yes - hardcode_direct_absolute=yes - hardcode_libdir_separator=':' - link_all_deplibs=yes - file_list_spec='${wl}-f,' - - if test "$GCC" = yes; then - case $host_os in aix4.[012]|aix4.[012].*) - # We only want to do this on AIX 4.2 and lower, the check - # below for broken collect2 doesn't work under 4.3+ - collect2name=`${CC} -print-prog-name=collect2` - if test -f "$collect2name" && - strings "$collect2name" | $GREP resolve_lib_name >/dev/null - then - # We have reworked collect2 - : - else - # We have old collect2 - hardcode_direct=unsupported - # It fails to find uninstalled libraries when the uninstalled - # path is not listed in the libpath. Setting hardcode_minus_L - # to unsupported forces relinking - hardcode_minus_L=yes - hardcode_libdir_flag_spec='-L$libdir' - hardcode_libdir_separator= - fi - ;; - esac - shared_flag='-shared' - if test "$aix_use_runtimelinking" = yes; then - shared_flag="$shared_flag "'${wl}-G' - fi - link_all_deplibs=no - else - # not using gcc - if test "$host_cpu" = ia64; then - # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release - # chokes on -Wl,-G. The following line is correct: - shared_flag='-G' - else - if test "$aix_use_runtimelinking" = yes; then - shared_flag='${wl}-G' - else - shared_flag='${wl}-bM:SRE' - fi - fi - fi - - export_dynamic_flag_spec='${wl}-bexpall' - # It seems that -bexpall does not export symbols beginning with - # underscore (_), so it is better to generate a list of symbols to export. - always_export_symbols=yes - if test "$aix_use_runtimelinking" = yes; then - # Warning - without using the other runtime loading flags (-brtl), - # -berok will link without error, but may produce a broken library. - allow_undefined_flag='-berok' - # Determine the default libpath from the value encoded in an - # empty executable. - if test "${lt_cv_aix_libpath+set}" = set; then - aix_libpath=$lt_cv_aix_libpath -else - if ${lt_cv_aix_libpath_+:} false; then : - $as_echo_n "(cached) " >&6 -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -int -main () -{ - - ; - return 0; -} -_ACEOF -if ac_fn_c_try_link "$LINENO"; then : - - lt_aix_libpath_sed=' - /Import File Strings/,/^$/ { - /^0/ { - s/^0 *\([^ ]*\) *$/\1/ - p - } - }' - lt_cv_aix_libpath_=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` - # Check for a 64-bit object if we didn't find anything. - if test -z "$lt_cv_aix_libpath_"; then - lt_cv_aix_libpath_=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` - fi -fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext - if test -z "$lt_cv_aix_libpath_"; then - lt_cv_aix_libpath_="/usr/lib:/lib" - fi - -fi - - aix_libpath=$lt_cv_aix_libpath_ -fi - - hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath" - archive_expsym_cmds='$CC -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then func_echo_all "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag" - else - if test "$host_cpu" = ia64; then - hardcode_libdir_flag_spec='${wl}-R $libdir:/usr/lib:/lib' - allow_undefined_flag="-z nodefs" - archive_expsym_cmds="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols" - else - # Determine the default libpath from the value encoded in an - # empty executable. - if test "${lt_cv_aix_libpath+set}" = set; then - aix_libpath=$lt_cv_aix_libpath -else - if ${lt_cv_aix_libpath_+:} false; then : - $as_echo_n "(cached) " >&6 -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -int -main () -{ - - ; - return 0; -} -_ACEOF -if ac_fn_c_try_link "$LINENO"; then : - - lt_aix_libpath_sed=' - /Import File Strings/,/^$/ { - /^0/ { - s/^0 *\([^ ]*\) *$/\1/ - p - } - }' - lt_cv_aix_libpath_=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` - # Check for a 64-bit object if we didn't find anything. - if test -z "$lt_cv_aix_libpath_"; then - lt_cv_aix_libpath_=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` - fi -fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext - if test -z "$lt_cv_aix_libpath_"; then - lt_cv_aix_libpath_="/usr/lib:/lib" - fi - -fi - - aix_libpath=$lt_cv_aix_libpath_ -fi - - hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath" - # Warning - without using the other run time loading flags, - # -berok will link without error, but may produce a broken library. - no_undefined_flag=' ${wl}-bernotok' - allow_undefined_flag=' ${wl}-berok' - if test "$with_gnu_ld" = yes; then - # We only use this code for GNU lds that support --whole-archive. - whole_archive_flag_spec='${wl}--whole-archive$convenience ${wl}--no-whole-archive' - else - # Exported symbols can be pulled into shared objects from archives - whole_archive_flag_spec='$convenience' - fi - archive_cmds_need_lc=yes - # This is similar to how AIX traditionally builds its shared libraries. - archive_expsym_cmds="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' - fi - fi - ;; - - amigaos*) - case $host_cpu in - powerpc) - # see comment about AmigaOS4 .so support - archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' - archive_expsym_cmds='' - ;; - m68k) - archive_cmds='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' - hardcode_libdir_flag_spec='-L$libdir' - hardcode_minus_L=yes - ;; - esac - ;; - - bsdi[45]*) - export_dynamic_flag_spec=-rdynamic - ;; - - cygwin* | mingw* | pw32* | cegcc*) - # When not using gcc, we currently assume that we are using - # Microsoft Visual C++. - # hardcode_libdir_flag_spec is actually meaningless, as there is - # no search path for DLLs. - case $cc_basename in - cl*) - # Native MSVC - hardcode_libdir_flag_spec=' ' - allow_undefined_flag=unsupported - always_export_symbols=yes - file_list_spec='@' - # Tell ltmain to make .lib files, not .a files. - libext=lib - # Tell ltmain to make .dll files, not .so files. - shrext_cmds=".dll" - # FIXME: Setting linknames here is a bad hack. - archive_cmds='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-dll~linknames=' - archive_expsym_cmds='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then - sed -n -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' -e '1\\\!p' < $export_symbols > $output_objdir/$soname.exp; - else - sed -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' < $export_symbols > $output_objdir/$soname.exp; - fi~ - $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~ - linknames=' - # The linker will not automatically build a static lib if we build a DLL. - # _LT_TAGVAR(old_archive_from_new_cmds, )='true' - enable_shared_with_static_runtimes=yes - exclude_expsyms='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*' - export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1,DATA/'\'' | $SED -e '\''/^[AITW][ ]/s/.*[ ]//'\'' | sort | uniq > $export_symbols' - # Don't use ranlib - old_postinstall_cmds='chmod 644 $oldlib' - postlink_cmds='lt_outputfile="@OUTPUT@"~ - lt_tool_outputfile="@TOOL_OUTPUT@"~ - case $lt_outputfile in - *.exe|*.EXE) ;; - *) - lt_outputfile="$lt_outputfile.exe" - lt_tool_outputfile="$lt_tool_outputfile.exe" - ;; - esac~ - if test "$MANIFEST_TOOL" != ":" && test -f "$lt_outputfile.manifest"; then - $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1; - $RM "$lt_outputfile.manifest"; - fi' - ;; - *) - # Assume MSVC wrapper - hardcode_libdir_flag_spec=' ' - allow_undefined_flag=unsupported - # Tell ltmain to make .lib files, not .a files. - libext=lib - # Tell ltmain to make .dll files, not .so files. - shrext_cmds=".dll" - # FIXME: Setting linknames here is a bad hack. - archive_cmds='$CC -o $lib $libobjs $compiler_flags `func_echo_all "$deplibs" | $SED '\''s/ -lc$//'\''` -link -dll~linknames=' - # The linker will automatically build a .lib file if we build a DLL. - old_archive_from_new_cmds='true' - # FIXME: Should let the user specify the lib program. - old_archive_cmds='lib -OUT:$oldlib$oldobjs$old_deplibs' - enable_shared_with_static_runtimes=yes - ;; - esac - ;; - - darwin* | rhapsody*) - - - archive_cmds_need_lc=no - hardcode_direct=no - hardcode_automatic=yes - hardcode_shlibpath_var=unsupported - if test "$lt_cv_ld_force_load" = "yes"; then - whole_archive_flag_spec='`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience ${wl}-force_load,$conv\"; done; func_echo_all \"$new_convenience\"`' - - else - whole_archive_flag_spec='' - fi - link_all_deplibs=yes - allow_undefined_flag="$_lt_dar_allow_undefined" - case $cc_basename in - ifort*) _lt_dar_can_shared=yes ;; - *) _lt_dar_can_shared=$GCC ;; - esac - if test "$_lt_dar_can_shared" = "yes"; then - output_verbose_link_cmd=func_echo_all - archive_cmds="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod${_lt_dsymutil}" - module_cmds="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dsymutil}" - archive_expsym_cmds="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring ${_lt_dar_single_mod}${_lt_dar_export_syms}${_lt_dsymutil}" - module_expsym_cmds="sed -e 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dar_export_syms}${_lt_dsymutil}" - - else - ld_shlibs=no - fi - - ;; - - dgux*) - archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' - hardcode_libdir_flag_spec='-L$libdir' - hardcode_shlibpath_var=no - ;; - - # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor - # support. Future versions do this automatically, but an explicit c++rt0.o - # does not break anything, and helps significantly (at the cost of a little - # extra space). - freebsd2.2*) - archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o' - hardcode_libdir_flag_spec='-R$libdir' - hardcode_direct=yes - hardcode_shlibpath_var=no - ;; - - # Unfortunately, older versions of FreeBSD 2 do not have this feature. - freebsd2.*) - archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' - hardcode_direct=yes - hardcode_minus_L=yes - hardcode_shlibpath_var=no - ;; - - # FreeBSD 3 and greater uses gcc -shared to do shared libraries. - freebsd* | dragonfly*) - archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' - hardcode_libdir_flag_spec='-R$libdir' - hardcode_direct=yes - hardcode_shlibpath_var=no - ;; - - hpux9*) - if test "$GCC" = yes; then - archive_cmds='$RM $output_objdir/$soname~$CC -shared $pic_flag ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' - else - archive_cmds='$RM $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' - fi - hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' - hardcode_libdir_separator=: - hardcode_direct=yes - - # hardcode_minus_L: Not really in the search PATH, - # but as the default location of the library. - hardcode_minus_L=yes - export_dynamic_flag_spec='${wl}-E' - ;; - - hpux10*) - if test "$GCC" = yes && test "$with_gnu_ld" = no; then - archive_cmds='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' - else - archive_cmds='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' - fi - if test "$with_gnu_ld" = no; then - hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' - hardcode_libdir_separator=: - hardcode_direct=yes - hardcode_direct_absolute=yes - export_dynamic_flag_spec='${wl}-E' - # hardcode_minus_L: Not really in the search PATH, - # but as the default location of the library. - hardcode_minus_L=yes - fi - ;; - - hpux11*) - if test "$GCC" = yes && test "$with_gnu_ld" = no; then - case $host_cpu in - hppa*64*) - archive_cmds='$CC -shared ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' - ;; - ia64*) - archive_cmds='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' - ;; - *) - archive_cmds='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' - ;; - esac - else - case $host_cpu in - hppa*64*) - archive_cmds='$CC -b ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' - ;; - ia64*) - archive_cmds='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' - ;; - *) - - # Older versions of the 11.00 compiler do not understand -b yet - # (HP92453-01 A.11.01.20 doesn't, HP92453-01 B.11.X.35175-35176.GP does) - { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $CC understands -b" >&5 -$as_echo_n "checking if $CC understands -b... " >&6; } -if ${lt_cv_prog_compiler__b+:} false; then : - $as_echo_n "(cached) " >&6 -else - lt_cv_prog_compiler__b=no - save_LDFLAGS="$LDFLAGS" - LDFLAGS="$LDFLAGS -b" - echo "$lt_simple_link_test_code" > conftest.$ac_ext - if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then - # The linker can only warn and ignore the option if not recognized - # So say no if there are warnings - if test -s conftest.err; then - # Append any errors to the config.log. - cat conftest.err 1>&5 - $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp - $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 - if diff conftest.exp conftest.er2 >/dev/null; then - lt_cv_prog_compiler__b=yes - fi - else - lt_cv_prog_compiler__b=yes - fi - fi - $RM -r conftest* - LDFLAGS="$save_LDFLAGS" - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler__b" >&5 -$as_echo "$lt_cv_prog_compiler__b" >&6; } - -if test x"$lt_cv_prog_compiler__b" = xyes; then - archive_cmds='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' -else - archive_cmds='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' -fi - - ;; - esac - fi - if test "$with_gnu_ld" = no; then - hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' - hardcode_libdir_separator=: - - case $host_cpu in - hppa*64*|ia64*) - hardcode_direct=no - hardcode_shlibpath_var=no - ;; - *) - hardcode_direct=yes - hardcode_direct_absolute=yes - export_dynamic_flag_spec='${wl}-E' - - # hardcode_minus_L: Not really in the search PATH, - # but as the default location of the library. - hardcode_minus_L=yes - ;; - esac - fi - ;; - - irix5* | irix6* | nonstopux*) - if test "$GCC" = yes; then - archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' - # Try to use the -exported_symbol ld option, if it does not - # work, assume that -exports_file does not work either and - # implicitly export all symbols. - # This should be the same for all languages, so no per-tag cache variable. - { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $host_os linker accepts -exported_symbol" >&5 -$as_echo_n "checking whether the $host_os linker accepts -exported_symbol... " >&6; } -if ${lt_cv_irix_exported_symbol+:} false; then : - $as_echo_n "(cached) " >&6 -else - save_LDFLAGS="$LDFLAGS" - LDFLAGS="$LDFLAGS -shared ${wl}-exported_symbol ${wl}foo ${wl}-update_registry ${wl}/dev/null" - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -int foo (void) { return 0; } -_ACEOF -if ac_fn_c_try_link "$LINENO"; then : - lt_cv_irix_exported_symbol=yes -else - lt_cv_irix_exported_symbol=no -fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext - LDFLAGS="$save_LDFLAGS" -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_irix_exported_symbol" >&5 -$as_echo "$lt_cv_irix_exported_symbol" >&6; } - if test "$lt_cv_irix_exported_symbol" = yes; then - archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations ${wl}-exports_file ${wl}$export_symbols -o $lib' - fi - else - archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' - archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -exports_file $export_symbols -o $lib' - fi - archive_cmds_need_lc='no' - hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' - hardcode_libdir_separator=: - inherit_rpath=yes - link_all_deplibs=yes - ;; - - netbsd* | netbsdelf*-gnu) - if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then - archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' # a.out - else - archive_cmds='$LD -shared -o $lib $libobjs $deplibs $linker_flags' # ELF - fi - hardcode_libdir_flag_spec='-R$libdir' - hardcode_direct=yes - hardcode_shlibpath_var=no - ;; - - newsos6) - archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' - hardcode_direct=yes - hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' - hardcode_libdir_separator=: - hardcode_shlibpath_var=no - ;; - - *nto* | *qnx*) - ;; - - openbsd*) - if test -f /usr/libexec/ld.so; then - hardcode_direct=yes - hardcode_shlibpath_var=no - hardcode_direct_absolute=yes - if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then - archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' - archive_expsym_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-retain-symbols-file,$export_symbols' - hardcode_libdir_flag_spec='${wl}-rpath,$libdir' - export_dynamic_flag_spec='${wl}-E' - else - case $host_os in - openbsd[01].* | openbsd2.[0-7] | openbsd2.[0-7].*) - archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' - hardcode_libdir_flag_spec='-R$libdir' - ;; - *) - archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' - hardcode_libdir_flag_spec='${wl}-rpath,$libdir' - ;; - esac - fi - else - ld_shlibs=no - fi - ;; - - os2*) - hardcode_libdir_flag_spec='-L$libdir' - hardcode_minus_L=yes - allow_undefined_flag=unsupported - archive_cmds='$ECHO "LIBRARY $libname INITINSTANCE" > $output_objdir/$libname.def~$ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~echo DATA >> $output_objdir/$libname.def~echo " SINGLE NONSHARED" >> $output_objdir/$libname.def~echo EXPORTS >> $output_objdir/$libname.def~emxexp $libobjs >> $output_objdir/$libname.def~$CC -Zdll -Zcrtdll -o $lib $libobjs $deplibs $compiler_flags $output_objdir/$libname.def' - old_archive_from_new_cmds='emximp -o $output_objdir/$libname.a $output_objdir/$libname.def' - ;; - - osf3*) - if test "$GCC" = yes; then - allow_undefined_flag=' ${wl}-expect_unresolved ${wl}\*' - archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' - else - allow_undefined_flag=' -expect_unresolved \*' - archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' - fi - archive_cmds_need_lc='no' - hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' - hardcode_libdir_separator=: - ;; - - osf4* | osf5*) # as osf3* with the addition of -msym flag - if test "$GCC" = yes; then - allow_undefined_flag=' ${wl}-expect_unresolved ${wl}\*' - archive_cmds='$CC -shared${allow_undefined_flag} $pic_flag $libobjs $deplibs $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' - hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' - else - allow_undefined_flag=' -expect_unresolved \*' - archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' - archive_expsym_cmds='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; printf "%s\\n" "-hidden">> $lib.exp~ - $CC -shared${allow_undefined_flag} ${wl}-input ${wl}$lib.exp $compiler_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib~$RM $lib.exp' - - # Both c and cxx compiler support -rpath directly - hardcode_libdir_flag_spec='-rpath $libdir' - fi - archive_cmds_need_lc='no' - hardcode_libdir_separator=: - ;; - - solaris*) - no_undefined_flag=' -z defs' - if test "$GCC" = yes; then - wlarc='${wl}' - archive_cmds='$CC -shared $pic_flag ${wl}-z ${wl}text ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' - archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ - $CC -shared $pic_flag ${wl}-z ${wl}text ${wl}-M ${wl}$lib.exp ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' - else - case `$CC -V 2>&1` in - *"Compilers 5.0"*) - wlarc='' - archive_cmds='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags' - archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ - $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$RM $lib.exp' - ;; - *) - wlarc='${wl}' - archive_cmds='$CC -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $compiler_flags' - archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ - $CC -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' - ;; - esac - fi - hardcode_libdir_flag_spec='-R$libdir' - hardcode_shlibpath_var=no - case $host_os in - solaris2.[0-5] | solaris2.[0-5].*) ;; - *) - # The compiler driver will combine and reorder linker options, - # but understands `-z linker_flag'. GCC discards it without `$wl', - # but is careful enough not to reorder. - # Supported since Solaris 2.6 (maybe 2.5.1?) - if test "$GCC" = yes; then - whole_archive_flag_spec='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract' - else - whole_archive_flag_spec='-z allextract$convenience -z defaultextract' - fi - ;; - esac - link_all_deplibs=yes - ;; - - sunos4*) - if test "x$host_vendor" = xsequent; then - # Use $CC to link under sequent, because it throws in some extra .o - # files that make .init and .fini sections work. - archive_cmds='$CC -G ${wl}-h $soname -o $lib $libobjs $deplibs $compiler_flags' - else - archive_cmds='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags' - fi - hardcode_libdir_flag_spec='-L$libdir' - hardcode_direct=yes - hardcode_minus_L=yes - hardcode_shlibpath_var=no - ;; - - sysv4) - case $host_vendor in - sni) - archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' - hardcode_direct=yes # is this really true??? - ;; - siemens) - ## LD is ld it makes a PLAMLIB - ## CC just makes a GrossModule. - archive_cmds='$LD -G -o $lib $libobjs $deplibs $linker_flags' - reload_cmds='$CC -r -o $output$reload_objs' - hardcode_direct=no - ;; - motorola) - archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' - hardcode_direct=no #Motorola manual says yes, but my tests say they lie - ;; - esac - runpath_var='LD_RUN_PATH' - hardcode_shlibpath_var=no - ;; - - sysv4.3*) - archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' - hardcode_shlibpath_var=no - export_dynamic_flag_spec='-Bexport' - ;; - - sysv4*MP*) - if test -d /usr/nec; then - archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' - hardcode_shlibpath_var=no - runpath_var=LD_RUN_PATH - hardcode_runpath_var=yes - ld_shlibs=yes - fi - ;; - - sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7* | sco3.2v5.0.[024]*) - no_undefined_flag='${wl}-z,text' - archive_cmds_need_lc=no - hardcode_shlibpath_var=no - runpath_var='LD_RUN_PATH' - - if test "$GCC" = yes; then - archive_cmds='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' - archive_expsym_cmds='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' - else - archive_cmds='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' - archive_expsym_cmds='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' - fi - ;; - - sysv5* | sco3.2v5* | sco5v6*) - # Note: We can NOT use -z defs as we might desire, because we do not - # link with -lc, and that would cause any symbols used from libc to - # always be unresolved, which means just about no library would - # ever link correctly. If we're not using GNU ld we use -z text - # though, which does catch some bad symbols but isn't as heavy-handed - # as -z defs. - no_undefined_flag='${wl}-z,text' - allow_undefined_flag='${wl}-z,nodefs' - archive_cmds_need_lc=no - hardcode_shlibpath_var=no - hardcode_libdir_flag_spec='${wl}-R,$libdir' - hardcode_libdir_separator=':' - link_all_deplibs=yes - export_dynamic_flag_spec='${wl}-Bexport' - runpath_var='LD_RUN_PATH' - - if test "$GCC" = yes; then - archive_cmds='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' - archive_expsym_cmds='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' - else - archive_cmds='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' - archive_expsym_cmds='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' - fi - ;; - - uts4*) - archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' - hardcode_libdir_flag_spec='-L$libdir' - hardcode_shlibpath_var=no - ;; - - *) - ld_shlibs=no - ;; - esac - - if test x$host_vendor = xsni; then - case $host in - sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) - export_dynamic_flag_spec='${wl}-Blargedynsym' - ;; - esac - fi - fi - -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ld_shlibs" >&5 -$as_echo "$ld_shlibs" >&6; } -test "$ld_shlibs" = no && can_build_shared=no - -with_gnu_ld=$with_gnu_ld - - - - - - - - - - - - - - - -# -# Do we need to explicitly link libc? -# -case "x$archive_cmds_need_lc" in -x|xyes) - # Assume -lc should be added - archive_cmds_need_lc=yes - - if test "$enable_shared" = yes && test "$GCC" = yes; then - case $archive_cmds in - *'~'*) - # FIXME: we may have to deal with multi-command sequences. - ;; - '$CC '*) - # Test whether the compiler implicitly links with -lc since on some - # systems, -lgcc has to come before -lc. If gcc already passes -lc - # to ld, don't add -lc before -lgcc. - { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether -lc should be explicitly linked in" >&5 -$as_echo_n "checking whether -lc should be explicitly linked in... " >&6; } -if ${lt_cv_archive_cmds_need_lc+:} false; then : - $as_echo_n "(cached) " >&6 -else - $RM conftest* - echo "$lt_simple_compile_test_code" > conftest.$ac_ext - - if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 - (eval $ac_compile) 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } 2>conftest.err; then - soname=conftest - lib=conftest - libobjs=conftest.$ac_objext - deplibs= - wl=$lt_prog_compiler_wl - pic_flag=$lt_prog_compiler_pic - compiler_flags=-v - linker_flags=-v - verstring= - output_objdir=. - libname=conftest - lt_save_allow_undefined_flag=$allow_undefined_flag - allow_undefined_flag= - if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$archive_cmds 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1\""; } >&5 - (eval $archive_cmds 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1) 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } - then - lt_cv_archive_cmds_need_lc=no - else - lt_cv_archive_cmds_need_lc=yes - fi - allow_undefined_flag=$lt_save_allow_undefined_flag - else - cat conftest.err 1>&5 - fi - $RM conftest* - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_archive_cmds_need_lc" >&5 -$as_echo "$lt_cv_archive_cmds_need_lc" >&6; } - archive_cmds_need_lc=$lt_cv_archive_cmds_need_lc - ;; - esac - fi - ;; -esac - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - { $as_echo "$as_me:${as_lineno-$LINENO}: checking dynamic linker characteristics" >&5 -$as_echo_n "checking dynamic linker characteristics... " >&6; } - -if test "$GCC" = yes; then - case $host_os in - darwin*) lt_awk_arg="/^libraries:/,/LR/" ;; - *) lt_awk_arg="/^libraries:/" ;; - esac - case $host_os in - mingw* | cegcc*) lt_sed_strip_eq="s,=\([A-Za-z]:\),\1,g" ;; - *) lt_sed_strip_eq="s,=/,/,g" ;; - esac - lt_search_path_spec=`$CC -print-search-dirs | awk $lt_awk_arg | $SED -e "s/^libraries://" -e $lt_sed_strip_eq` - case $lt_search_path_spec in - *\;*) - # if the path contains ";" then we assume it to be the separator - # otherwise default to the standard path separator (i.e. ":") - it is - # assumed that no part of a normal pathname contains ";" but that should - # okay in the real world where ";" in dirpaths is itself problematic. - lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED 's/;/ /g'` - ;; - *) - lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED "s/$PATH_SEPARATOR/ /g"` - ;; - esac - # Ok, now we have the path, separated by spaces, we can step through it - # and add multilib dir if necessary. - lt_tmp_lt_search_path_spec= - lt_multi_os_dir=`$CC $CPPFLAGS $CFLAGS $LDFLAGS -print-multi-os-directory 2>/dev/null` - for lt_sys_path in $lt_search_path_spec; do - if test -d "$lt_sys_path/$lt_multi_os_dir"; then - lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path/$lt_multi_os_dir" - else - test -d "$lt_sys_path" && \ - lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path" - fi - done - lt_search_path_spec=`$ECHO "$lt_tmp_lt_search_path_spec" | awk ' -BEGIN {RS=" "; FS="/|\n";} { - lt_foo=""; - lt_count=0; - for (lt_i = NF; lt_i > 0; lt_i--) { - if ($lt_i != "" && $lt_i != ".") { - if ($lt_i == "..") { - lt_count++; - } else { - if (lt_count == 0) { - lt_foo="/" $lt_i lt_foo; - } else { - lt_count--; - } - } - } - } - if (lt_foo != "") { lt_freq[lt_foo]++; } - if (lt_freq[lt_foo] == 1) { print lt_foo; } -}'` - # AWK program above erroneously prepends '/' to C:/dos/paths - # for these hosts. - case $host_os in - mingw* | cegcc*) lt_search_path_spec=`$ECHO "$lt_search_path_spec" |\ - $SED 's,/\([A-Za-z]:\),\1,g'` ;; - esac - sys_lib_search_path_spec=`$ECHO "$lt_search_path_spec" | $lt_NL2SP` -else - sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" -fi -library_names_spec= -libname_spec='lib$name' -soname_spec= -shrext_cmds=".so" -postinstall_cmds= -postuninstall_cmds= -finish_cmds= -finish_eval= -shlibpath_var= -shlibpath_overrides_runpath=unknown -version_type=none -dynamic_linker="$host_os ld.so" -sys_lib_dlsearch_path_spec="/lib /usr/lib" -need_lib_prefix=unknown -hardcode_into_libs=no - -# when you set need_version to no, make sure it does not cause -set_version -# flags to be left without arguments -need_version=unknown - -case $host_os in -aix3*) - version_type=linux # correct to gnu/linux during the next big refactor - library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a' - shlibpath_var=LIBPATH - - # AIX 3 has no versioning support, so we append a major version to the name. - soname_spec='${libname}${release}${shared_ext}$major' - ;; - -aix[4-9]*) - version_type=linux # correct to gnu/linux during the next big refactor - need_lib_prefix=no - need_version=no - hardcode_into_libs=yes - if test "$host_cpu" = ia64; then - # AIX 5 supports IA64 - library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}' - shlibpath_var=LD_LIBRARY_PATH - else - # With GCC up to 2.95.x, collect2 would create an import file - # for dependence libraries. The import file would start with - # the line `#! .'. This would cause the generated library to - # depend on `.', always an invalid library. This was fixed in - # development snapshots of GCC prior to 3.0. - case $host_os in - aix4 | aix4.[01] | aix4.[01].*) - if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)' - echo ' yes ' - echo '#endif'; } | ${CC} -E - | $GREP yes > /dev/null; then - : - else - can_build_shared=no - fi - ;; - esac - # AIX (on Power*) has no versioning support, so currently we can not hardcode correct - # soname into executable. Probably we can add versioning support to - # collect2, so additional links can be useful in future. - if test "$aix_use_runtimelinking" = yes; then - # If using run time linking (on AIX 4.2 or later) use lib.so - # instead of lib.a to let people know that these are not - # typical AIX shared libraries. - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - else - # We preserve .a as extension for shared libraries through AIX4.2 - # and later when we are not doing run time linking. - library_names_spec='${libname}${release}.a $libname.a' - soname_spec='${libname}${release}${shared_ext}$major' - fi - shlibpath_var=LIBPATH - fi - ;; - -amigaos*) - case $host_cpu in - powerpc) - # Since July 2007 AmigaOS4 officially supports .so libraries. - # When compiling the executable, add -use-dynld -Lsobjs: to the compileline. - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - ;; - m68k) - library_names_spec='$libname.ixlibrary $libname.a' - # Create ${libname}_ixlibrary.a entries in /sys/libs. - finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`func_echo_all "$lib" | $SED '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; test $RM /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done' - ;; - esac - ;; - -beos*) - library_names_spec='${libname}${shared_ext}' - dynamic_linker="$host_os ld.so" - shlibpath_var=LIBRARY_PATH - ;; - -bsdi[45]*) - version_type=linux # correct to gnu/linux during the next big refactor - need_version=no - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir' - shlibpath_var=LD_LIBRARY_PATH - sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib" - sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib" - # the default ld.so.conf also contains /usr/contrib/lib and - # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow - # libtool to hard-code these into programs - ;; - -cygwin* | mingw* | pw32* | cegcc*) - version_type=windows - shrext_cmds=".dll" - need_version=no - need_lib_prefix=no - - case $GCC,$cc_basename in - yes,*) - # gcc - library_names_spec='$libname.dll.a' - # DLL is installed to $(libdir)/../bin by postinstall_cmds - postinstall_cmds='base_file=`basename \${file}`~ - dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~ - dldir=$destdir/`dirname \$dlpath`~ - test -d \$dldir || mkdir -p \$dldir~ - $install_prog $dir/$dlname \$dldir/$dlname~ - chmod a+x \$dldir/$dlname~ - if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then - eval '\''$striplib \$dldir/$dlname'\'' || exit \$?; - fi' - postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ - dlpath=$dir/\$dldll~ - $RM \$dlpath' - shlibpath_overrides_runpath=yes - - case $host_os in - cygwin*) - # Cygwin DLLs use 'cyg' prefix rather than 'lib' - soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' - - sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/lib/w32api" - ;; - mingw* | cegcc*) - # MinGW DLLs use traditional 'lib' prefix - soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' - ;; - pw32*) - # pw32 DLLs use 'pw' prefix rather than 'lib' - library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' - ;; - esac - dynamic_linker='Win32 ld.exe' - ;; - - *,cl*) - # Native MSVC - libname_spec='$name' - soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' - library_names_spec='${libname}.dll.lib' - - case $build_os in - mingw*) - sys_lib_search_path_spec= - lt_save_ifs=$IFS - IFS=';' - for lt_path in $LIB - do - IFS=$lt_save_ifs - # Let DOS variable expansion print the short 8.3 style file name. - lt_path=`cd "$lt_path" 2>/dev/null && cmd //C "for %i in (".") do @echo %~si"` - sys_lib_search_path_spec="$sys_lib_search_path_spec $lt_path" - done - IFS=$lt_save_ifs - # Convert to MSYS style. - sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | sed -e 's|\\\\|/|g' -e 's| \\([a-zA-Z]\\):| /\\1|g' -e 's|^ ||'` - ;; - cygwin*) - # Convert to unix form, then to dos form, then back to unix form - # but this time dos style (no spaces!) so that the unix form looks - # like /cygdrive/c/PROGRA~1:/cygdr... - sys_lib_search_path_spec=`cygpath --path --unix "$LIB"` - sys_lib_search_path_spec=`cygpath --path --dos "$sys_lib_search_path_spec" 2>/dev/null` - sys_lib_search_path_spec=`cygpath --path --unix "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` - ;; - *) - sys_lib_search_path_spec="$LIB" - if $ECHO "$sys_lib_search_path_spec" | $GREP ';[c-zC-Z]:/' >/dev/null; then - # It is most probably a Windows format PATH. - sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` - else - sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` - fi - # FIXME: find the short name or the path components, as spaces are - # common. (e.g. "Program Files" -> "PROGRA~1") - ;; - esac - - # DLL is installed to $(libdir)/../bin by postinstall_cmds - postinstall_cmds='base_file=`basename \${file}`~ - dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~ - dldir=$destdir/`dirname \$dlpath`~ - test -d \$dldir || mkdir -p \$dldir~ - $install_prog $dir/$dlname \$dldir/$dlname' - postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ - dlpath=$dir/\$dldll~ - $RM \$dlpath' - shlibpath_overrides_runpath=yes - dynamic_linker='Win32 link.exe' - ;; - - *) - # Assume MSVC wrapper - library_names_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext} $libname.lib' - dynamic_linker='Win32 ld.exe' - ;; - esac - # FIXME: first we should search . and the directory the executable is in - shlibpath_var=PATH - ;; - -darwin* | rhapsody*) - dynamic_linker="$host_os dyld" - version_type=darwin - need_lib_prefix=no - need_version=no - library_names_spec='${libname}${release}${major}$shared_ext ${libname}$shared_ext' - soname_spec='${libname}${release}${major}$shared_ext' - shlibpath_overrides_runpath=yes - shlibpath_var=DYLD_LIBRARY_PATH - shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`' - - sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/local/lib" - sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib' - ;; - -dgux*) - version_type=linux # correct to gnu/linux during the next big refactor - need_lib_prefix=no - need_version=no - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext' - soname_spec='${libname}${release}${shared_ext}$major' - shlibpath_var=LD_LIBRARY_PATH - ;; - -freebsd* | dragonfly*) - # DragonFly does not have aout. When/if they implement a new - # versioning mechanism, adjust this. - if test -x /usr/bin/objformat; then - objformat=`/usr/bin/objformat` - else - case $host_os in - freebsd[23].*) objformat=aout ;; - *) objformat=elf ;; - esac - fi - version_type=freebsd-$objformat - case $version_type in - freebsd-elf*) - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' - need_version=no - need_lib_prefix=no - ;; - freebsd-*) - library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix' - need_version=yes - ;; - esac - shlibpath_var=LD_LIBRARY_PATH - case $host_os in - freebsd2.*) - shlibpath_overrides_runpath=yes - ;; - freebsd3.[01]* | freebsdelf3.[01]*) - shlibpath_overrides_runpath=yes - hardcode_into_libs=yes - ;; - freebsd3.[2-9]* | freebsdelf3.[2-9]* | \ - freebsd4.[0-5] | freebsdelf4.[0-5] | freebsd4.1.1 | freebsdelf4.1.1) - shlibpath_overrides_runpath=no - hardcode_into_libs=yes - ;; - *) # from 4.6 on, and DragonFly - shlibpath_overrides_runpath=yes - hardcode_into_libs=yes - ;; - esac - ;; - -gnu*) - version_type=linux # correct to gnu/linux during the next big refactor - need_lib_prefix=no - need_version=no - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=no - hardcode_into_libs=yes - ;; - -haiku*) - version_type=linux # correct to gnu/linux during the next big refactor - need_lib_prefix=no - need_version=no - dynamic_linker="$host_os runtime_loader" - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - shlibpath_var=LIBRARY_PATH - shlibpath_overrides_runpath=yes - sys_lib_dlsearch_path_spec='/boot/home/config/lib /boot/common/lib /boot/system/lib' - hardcode_into_libs=yes - ;; - -hpux9* | hpux10* | hpux11*) - # Give a soname corresponding to the major version so that dld.sl refuses to - # link against other versions. - version_type=sunos - need_lib_prefix=no - need_version=no - case $host_cpu in - ia64*) - shrext_cmds='.so' - hardcode_into_libs=yes - dynamic_linker="$host_os dld.so" - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - if test "X$HPUX_IA64_MODE" = X32; then - sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib" - else - sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64" - fi - sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec - ;; - hppa*64*) - shrext_cmds='.sl' - hardcode_into_libs=yes - dynamic_linker="$host_os dld.sl" - shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH - shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64" - sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec - ;; - *) - shrext_cmds='.sl' - dynamic_linker="$host_os dld.sl" - shlibpath_var=SHLIB_PATH - shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - ;; - esac - # HP-UX runs *really* slowly unless shared libraries are mode 555, ... - postinstall_cmds='chmod 555 $lib' - # or fails outright, so override atomically: - install_override_mode=555 - ;; - -interix[3-9]*) - version_type=linux # correct to gnu/linux during the next big refactor - need_lib_prefix=no - need_version=no - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)' - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=no - hardcode_into_libs=yes - ;; - -irix5* | irix6* | nonstopux*) - case $host_os in - nonstopux*) version_type=nonstopux ;; - *) - if test "$lt_cv_prog_gnu_ld" = yes; then - version_type=linux # correct to gnu/linux during the next big refactor - else - version_type=irix - fi ;; - esac - need_lib_prefix=no - need_version=no - soname_spec='${libname}${release}${shared_ext}$major' - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}' - case $host_os in - irix5* | nonstopux*) - libsuff= shlibsuff= - ;; - *) - case $LD in # libtool.m4 will add one of these switches to LD - *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") - libsuff= shlibsuff= libmagic=32-bit;; - *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") - libsuff=32 shlibsuff=N32 libmagic=N32;; - *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") - libsuff=64 shlibsuff=64 libmagic=64-bit;; - *) libsuff= shlibsuff= libmagic=never-match;; - esac - ;; - esac - shlibpath_var=LD_LIBRARY${shlibsuff}_PATH - shlibpath_overrides_runpath=no - sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}" - sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}" - hardcode_into_libs=yes - ;; - -# No shared lib support for Linux oldld, aout, or coff. -linux*oldld* | linux*aout* | linux*coff*) - dynamic_linker=no - ;; - -# This must be glibc/ELF. -linux* | k*bsd*-gnu | kopensolaris*-gnu) - version_type=linux # correct to gnu/linux during the next big refactor - need_lib_prefix=no - need_version=no - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=no - - # Some binutils ld are patched to set DT_RUNPATH - if ${lt_cv_shlibpath_overrides_runpath+:} false; then : - $as_echo_n "(cached) " >&6 -else - lt_cv_shlibpath_overrides_runpath=no - save_LDFLAGS=$LDFLAGS - save_libdir=$libdir - eval "libdir=/foo; wl=\"$lt_prog_compiler_wl\"; \ - LDFLAGS=\"\$LDFLAGS $hardcode_libdir_flag_spec\"" - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -int -main () -{ - - ; - return 0; -} -_ACEOF -if ac_fn_c_try_link "$LINENO"; then : - if ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir" >/dev/null; then : - lt_cv_shlibpath_overrides_runpath=yes -fi -fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext - LDFLAGS=$save_LDFLAGS - libdir=$save_libdir - -fi - - shlibpath_overrides_runpath=$lt_cv_shlibpath_overrides_runpath - - # This implies no fast_install, which is unacceptable. - # Some rework will be needed to allow for fast_install - # before this can be enabled. - hardcode_into_libs=yes - - # Append ld.so.conf contents to the search path - if test -f /etc/ld.so.conf; then - lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \$2)); skip = 1; } { if (!skip) print \$0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[ ]*hwcap[ ]/d;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;s/"//g;/^$/d' | tr '\n' ' '` - sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra" - fi - - # We used to test for /lib/ld.so.1 and disable shared libraries on - # powerpc, because MkLinux only supported shared libraries with the - # GNU dynamic linker. Since this was broken with cross compilers, - # most powerpc-linux boxes support dynamic linking these days and - # people can always --disable-shared, the test was removed, and we - # assume the GNU/Linux dynamic linker is in use. - dynamic_linker='GNU/Linux ld.so' - ;; - -netbsdelf*-gnu) - version_type=linux - need_lib_prefix=no - need_version=no - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=no - hardcode_into_libs=yes - dynamic_linker='NetBSD ld.elf_so' - ;; - -netbsd*) - version_type=sunos - need_lib_prefix=no - need_version=no - if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' - finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' - dynamic_linker='NetBSD (a.out) ld.so' - else - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - dynamic_linker='NetBSD ld.elf_so' - fi - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=yes - hardcode_into_libs=yes - ;; - -newsos6) - version_type=linux # correct to gnu/linux during the next big refactor - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=yes - ;; - -*nto* | *qnx*) - version_type=qnx - need_lib_prefix=no - need_version=no - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=no - hardcode_into_libs=yes - dynamic_linker='ldqnx.so' - ;; - -openbsd*) - version_type=sunos - sys_lib_dlsearch_path_spec="/usr/lib" - need_lib_prefix=no - # Some older versions of OpenBSD (3.3 at least) *do* need versioned libs. - case $host_os in - openbsd3.3 | openbsd3.3.*) need_version=yes ;; - *) need_version=no ;; - esac - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' - finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' - shlibpath_var=LD_LIBRARY_PATH - if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then - case $host_os in - openbsd2.[89] | openbsd2.[89].*) - shlibpath_overrides_runpath=no - ;; - *) - shlibpath_overrides_runpath=yes - ;; - esac - else - shlibpath_overrides_runpath=yes - fi - ;; - -os2*) - libname_spec='$name' - shrext_cmds=".dll" - need_lib_prefix=no - library_names_spec='$libname${shared_ext} $libname.a' - dynamic_linker='OS/2 ld.exe' - shlibpath_var=LIBPATH - ;; - -osf3* | osf4* | osf5*) - version_type=osf - need_lib_prefix=no - need_version=no - soname_spec='${libname}${release}${shared_ext}$major' - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - shlibpath_var=LD_LIBRARY_PATH - sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib" - sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec" - ;; - -rdos*) - dynamic_linker=no - ;; - -solaris*) - version_type=linux # correct to gnu/linux during the next big refactor - need_lib_prefix=no - need_version=no - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=yes - hardcode_into_libs=yes - # ldd complains unless libraries are executable - postinstall_cmds='chmod +x $lib' - ;; - -sunos4*) - version_type=sunos - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' - finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir' - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=yes - if test "$with_gnu_ld" = yes; then - need_lib_prefix=no - fi - need_version=yes - ;; - -sysv4 | sysv4.3*) - version_type=linux # correct to gnu/linux during the next big refactor - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - shlibpath_var=LD_LIBRARY_PATH - case $host_vendor in - sni) - shlibpath_overrides_runpath=no - need_lib_prefix=no - runpath_var=LD_RUN_PATH - ;; - siemens) - need_lib_prefix=no - ;; - motorola) - need_lib_prefix=no - need_version=no - shlibpath_overrides_runpath=no - sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib' - ;; - esac - ;; - -sysv4*MP*) - if test -d /usr/nec ;then - version_type=linux # correct to gnu/linux during the next big refactor - library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}' - soname_spec='$libname${shared_ext}.$major' - shlibpath_var=LD_LIBRARY_PATH - fi - ;; - -sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) - version_type=freebsd-elf - need_lib_prefix=no - need_version=no - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=yes - hardcode_into_libs=yes - if test "$with_gnu_ld" = yes; then - sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib' - else - sys_lib_search_path_spec='/usr/ccs/lib /usr/lib' - case $host_os in - sco3.2v5*) - sys_lib_search_path_spec="$sys_lib_search_path_spec /lib" - ;; - esac - fi - sys_lib_dlsearch_path_spec='/usr/lib' - ;; - -tpf*) - # TPF is a cross-target only. Preferred cross-host = GNU/Linux. - version_type=linux # correct to gnu/linux during the next big refactor - need_lib_prefix=no - need_version=no - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=no - hardcode_into_libs=yes - ;; - -uts4*) - version_type=linux # correct to gnu/linux during the next big refactor - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - shlibpath_var=LD_LIBRARY_PATH - ;; - -*) - dynamic_linker=no - ;; -esac -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $dynamic_linker" >&5 -$as_echo "$dynamic_linker" >&6; } -test "$dynamic_linker" = no && can_build_shared=no - -variables_saved_for_relink="PATH $shlibpath_var $runpath_var" -if test "$GCC" = yes; then - variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" -fi - -if test "${lt_cv_sys_lib_search_path_spec+set}" = set; then - sys_lib_search_path_spec="$lt_cv_sys_lib_search_path_spec" -fi -if test "${lt_cv_sys_lib_dlsearch_path_spec+set}" = set; then - sys_lib_dlsearch_path_spec="$lt_cv_sys_lib_dlsearch_path_spec" -fi - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to hardcode library paths into programs" >&5 -$as_echo_n "checking how to hardcode library paths into programs... " >&6; } -hardcode_action= -if test -n "$hardcode_libdir_flag_spec" || - test -n "$runpath_var" || - test "X$hardcode_automatic" = "Xyes" ; then - - # We can hardcode non-existent directories. - if test "$hardcode_direct" != no && - # If the only mechanism to avoid hardcoding is shlibpath_var, we - # have to relink, otherwise we might link with an installed library - # when we should be linking with a yet-to-be-installed one - ## test "$_LT_TAGVAR(hardcode_shlibpath_var, )" != no && - test "$hardcode_minus_L" != no; then - # Linking always hardcodes the temporary library directory. - hardcode_action=relink - else - # We can link without hardcoding, and we can hardcode nonexisting dirs. - hardcode_action=immediate - fi -else - # We cannot hardcode anything, or else we can only hardcode existing - # directories. - hardcode_action=unsupported -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $hardcode_action" >&5 -$as_echo "$hardcode_action" >&6; } - -if test "$hardcode_action" = relink || - test "$inherit_rpath" = yes; then - # Fast installation is not supported - enable_fast_install=no -elif test "$shlibpath_overrides_runpath" = yes || - test "$enable_shared" = no; then - # Fast installation is not necessary - enable_fast_install=needless -fi - - - - - - - if test "x$enable_dlopen" != xyes; then - enable_dlopen=unknown - enable_dlopen_self=unknown - enable_dlopen_self_static=unknown -else - lt_cv_dlopen=no - lt_cv_dlopen_libs= - - case $host_os in - beos*) - lt_cv_dlopen="load_add_on" - lt_cv_dlopen_libs= - lt_cv_dlopen_self=yes - ;; - - mingw* | pw32* | cegcc*) - lt_cv_dlopen="LoadLibrary" - lt_cv_dlopen_libs= - ;; - - cygwin*) - lt_cv_dlopen="dlopen" - lt_cv_dlopen_libs= - ;; - - darwin*) - # if libdl is installed we need to link against it - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5 -$as_echo_n "checking for dlopen in -ldl... " >&6; } -if ${ac_cv_lib_dl_dlopen+:} false; then : - $as_echo_n "(cached) " >&6 -else - ac_check_lib_save_LIBS=$LIBS -LIBS="-ldl $LIBS" -cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -/* Override any GCC internal prototype to avoid an error. - Use char because int might match the return type of a GCC - builtin and then its argument prototype would still apply. */ -#ifdef __cplusplus -extern "C" -#endif -char dlopen (); -int -main () -{ -return dlopen (); - ; - return 0; -} -_ACEOF -if ac_fn_c_try_link "$LINENO"; then : - ac_cv_lib_dl_dlopen=yes -else - ac_cv_lib_dl_dlopen=no -fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext -LIBS=$ac_check_lib_save_LIBS -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5 -$as_echo "$ac_cv_lib_dl_dlopen" >&6; } -if test "x$ac_cv_lib_dl_dlopen" = xyes; then : - lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl" -else - - lt_cv_dlopen="dyld" - lt_cv_dlopen_libs= - lt_cv_dlopen_self=yes - -fi - - ;; - - *) - ac_fn_c_check_func "$LINENO" "shl_load" "ac_cv_func_shl_load" -if test "x$ac_cv_func_shl_load" = xyes; then : - lt_cv_dlopen="shl_load" -else - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for shl_load in -ldld" >&5 -$as_echo_n "checking for shl_load in -ldld... " >&6; } -if ${ac_cv_lib_dld_shl_load+:} false; then : - $as_echo_n "(cached) " >&6 -else - ac_check_lib_save_LIBS=$LIBS -LIBS="-ldld $LIBS" -cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -/* Override any GCC internal prototype to avoid an error. - Use char because int might match the return type of a GCC - builtin and then its argument prototype would still apply. */ -#ifdef __cplusplus -extern "C" -#endif -char shl_load (); -int -main () -{ -return shl_load (); - ; - return 0; -} -_ACEOF -if ac_fn_c_try_link "$LINENO"; then : - ac_cv_lib_dld_shl_load=yes -else - ac_cv_lib_dld_shl_load=no -fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext -LIBS=$ac_check_lib_save_LIBS -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dld_shl_load" >&5 -$as_echo "$ac_cv_lib_dld_shl_load" >&6; } -if test "x$ac_cv_lib_dld_shl_load" = xyes; then : - lt_cv_dlopen="shl_load" lt_cv_dlopen_libs="-ldld" -else - ac_fn_c_check_func "$LINENO" "dlopen" "ac_cv_func_dlopen" -if test "x$ac_cv_func_dlopen" = xyes; then : - lt_cv_dlopen="dlopen" -else - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5 -$as_echo_n "checking for dlopen in -ldl... " >&6; } -if ${ac_cv_lib_dl_dlopen+:} false; then : - $as_echo_n "(cached) " >&6 -else - ac_check_lib_save_LIBS=$LIBS -LIBS="-ldl $LIBS" -cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -/* Override any GCC internal prototype to avoid an error. - Use char because int might match the return type of a GCC - builtin and then its argument prototype would still apply. */ -#ifdef __cplusplus -extern "C" -#endif -char dlopen (); -int -main () -{ -return dlopen (); - ; - return 0; -} -_ACEOF -if ac_fn_c_try_link "$LINENO"; then : - ac_cv_lib_dl_dlopen=yes -else - ac_cv_lib_dl_dlopen=no -fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext -LIBS=$ac_check_lib_save_LIBS -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5 -$as_echo "$ac_cv_lib_dl_dlopen" >&6; } -if test "x$ac_cv_lib_dl_dlopen" = xyes; then : - lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl" -else - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -lsvld" >&5 -$as_echo_n "checking for dlopen in -lsvld... " >&6; } -if ${ac_cv_lib_svld_dlopen+:} false; then : - $as_echo_n "(cached) " >&6 -else - ac_check_lib_save_LIBS=$LIBS -LIBS="-lsvld $LIBS" -cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -/* Override any GCC internal prototype to avoid an error. - Use char because int might match the return type of a GCC - builtin and then its argument prototype would still apply. */ -#ifdef __cplusplus -extern "C" -#endif -char dlopen (); -int -main () -{ -return dlopen (); - ; - return 0; -} -_ACEOF -if ac_fn_c_try_link "$LINENO"; then : - ac_cv_lib_svld_dlopen=yes -else - ac_cv_lib_svld_dlopen=no -fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext -LIBS=$ac_check_lib_save_LIBS -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_svld_dlopen" >&5 -$as_echo "$ac_cv_lib_svld_dlopen" >&6; } -if test "x$ac_cv_lib_svld_dlopen" = xyes; then : - lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-lsvld" -else - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dld_link in -ldld" >&5 -$as_echo_n "checking for dld_link in -ldld... " >&6; } -if ${ac_cv_lib_dld_dld_link+:} false; then : - $as_echo_n "(cached) " >&6 -else - ac_check_lib_save_LIBS=$LIBS -LIBS="-ldld $LIBS" -cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -/* Override any GCC internal prototype to avoid an error. - Use char because int might match the return type of a GCC - builtin and then its argument prototype would still apply. */ -#ifdef __cplusplus -extern "C" -#endif -char dld_link (); -int -main () -{ -return dld_link (); - ; - return 0; -} -_ACEOF -if ac_fn_c_try_link "$LINENO"; then : - ac_cv_lib_dld_dld_link=yes -else - ac_cv_lib_dld_dld_link=no -fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext -LIBS=$ac_check_lib_save_LIBS -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dld_dld_link" >&5 -$as_echo "$ac_cv_lib_dld_dld_link" >&6; } -if test "x$ac_cv_lib_dld_dld_link" = xyes; then : - lt_cv_dlopen="dld_link" lt_cv_dlopen_libs="-ldld" -fi - - -fi - - -fi - - -fi - - -fi - - -fi - - ;; - esac - - if test "x$lt_cv_dlopen" != xno; then - enable_dlopen=yes - else - enable_dlopen=no - fi - - case $lt_cv_dlopen in - dlopen) - save_CPPFLAGS="$CPPFLAGS" - test "x$ac_cv_header_dlfcn_h" = xyes && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H" - - save_LDFLAGS="$LDFLAGS" - wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\" - - save_LIBS="$LIBS" - LIBS="$lt_cv_dlopen_libs $LIBS" - - { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether a program can dlopen itself" >&5 -$as_echo_n "checking whether a program can dlopen itself... " >&6; } -if ${lt_cv_dlopen_self+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test "$cross_compiling" = yes; then : - lt_cv_dlopen_self=cross -else - lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 - lt_status=$lt_dlunknown - cat > conftest.$ac_ext <<_LT_EOF -#line $LINENO "configure" -#include "confdefs.h" - -#if HAVE_DLFCN_H -#include -#endif - -#include - -#ifdef RTLD_GLOBAL -# define LT_DLGLOBAL RTLD_GLOBAL -#else -# ifdef DL_GLOBAL -# define LT_DLGLOBAL DL_GLOBAL -# else -# define LT_DLGLOBAL 0 -# endif -#endif - -/* We may have to define LT_DLLAZY_OR_NOW in the command line if we - find out it does not work in some platform. */ -#ifndef LT_DLLAZY_OR_NOW -# ifdef RTLD_LAZY -# define LT_DLLAZY_OR_NOW RTLD_LAZY -# else -# ifdef DL_LAZY -# define LT_DLLAZY_OR_NOW DL_LAZY -# else -# ifdef RTLD_NOW -# define LT_DLLAZY_OR_NOW RTLD_NOW -# else -# ifdef DL_NOW -# define LT_DLLAZY_OR_NOW DL_NOW -# else -# define LT_DLLAZY_OR_NOW 0 -# endif -# endif -# endif -# endif -#endif - -/* When -fvisbility=hidden is used, assume the code has been annotated - correspondingly for the symbols needed. */ -#if defined(__GNUC__) && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3)) -int fnord () __attribute__((visibility("default"))); -#endif - -int fnord () { return 42; } -int main () -{ - void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); - int status = $lt_dlunknown; - - if (self) - { - if (dlsym (self,"fnord")) status = $lt_dlno_uscore; - else - { - if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; - else puts (dlerror ()); - } - /* dlclose (self); */ - } - else - puts (dlerror ()); - - return status; -} -_LT_EOF - if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5 - (eval $ac_link) 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } && test -s conftest${ac_exeext} 2>/dev/null; then - (./conftest; exit; ) >&5 2>/dev/null - lt_status=$? - case x$lt_status in - x$lt_dlno_uscore) lt_cv_dlopen_self=yes ;; - x$lt_dlneed_uscore) lt_cv_dlopen_self=yes ;; - x$lt_dlunknown|x*) lt_cv_dlopen_self=no ;; - esac - else : - # compilation failed - lt_cv_dlopen_self=no - fi -fi -rm -fr conftest* - - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_dlopen_self" >&5 -$as_echo "$lt_cv_dlopen_self" >&6; } - - if test "x$lt_cv_dlopen_self" = xyes; then - wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $lt_prog_compiler_static\" - { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether a statically linked program can dlopen itself" >&5 -$as_echo_n "checking whether a statically linked program can dlopen itself... " >&6; } -if ${lt_cv_dlopen_self_static+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test "$cross_compiling" = yes; then : - lt_cv_dlopen_self_static=cross -else - lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 - lt_status=$lt_dlunknown - cat > conftest.$ac_ext <<_LT_EOF -#line $LINENO "configure" -#include "confdefs.h" - -#if HAVE_DLFCN_H -#include -#endif - -#include - -#ifdef RTLD_GLOBAL -# define LT_DLGLOBAL RTLD_GLOBAL -#else -# ifdef DL_GLOBAL -# define LT_DLGLOBAL DL_GLOBAL -# else -# define LT_DLGLOBAL 0 -# endif -#endif - -/* We may have to define LT_DLLAZY_OR_NOW in the command line if we - find out it does not work in some platform. */ -#ifndef LT_DLLAZY_OR_NOW -# ifdef RTLD_LAZY -# define LT_DLLAZY_OR_NOW RTLD_LAZY -# else -# ifdef DL_LAZY -# define LT_DLLAZY_OR_NOW DL_LAZY -# else -# ifdef RTLD_NOW -# define LT_DLLAZY_OR_NOW RTLD_NOW -# else -# ifdef DL_NOW -# define LT_DLLAZY_OR_NOW DL_NOW -# else -# define LT_DLLAZY_OR_NOW 0 -# endif -# endif -# endif -# endif -#endif - -/* When -fvisbility=hidden is used, assume the code has been annotated - correspondingly for the symbols needed. */ -#if defined(__GNUC__) && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3)) -int fnord () __attribute__((visibility("default"))); -#endif - -int fnord () { return 42; } -int main () -{ - void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); - int status = $lt_dlunknown; - - if (self) - { - if (dlsym (self,"fnord")) status = $lt_dlno_uscore; - else - { - if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; - else puts (dlerror ()); - } - /* dlclose (self); */ - } - else - puts (dlerror ()); - - return status; -} -_LT_EOF - if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5 - (eval $ac_link) 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } && test -s conftest${ac_exeext} 2>/dev/null; then - (./conftest; exit; ) >&5 2>/dev/null - lt_status=$? - case x$lt_status in - x$lt_dlno_uscore) lt_cv_dlopen_self_static=yes ;; - x$lt_dlneed_uscore) lt_cv_dlopen_self_static=yes ;; - x$lt_dlunknown|x*) lt_cv_dlopen_self_static=no ;; - esac - else : - # compilation failed - lt_cv_dlopen_self_static=no - fi -fi -rm -fr conftest* - - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_dlopen_self_static" >&5 -$as_echo "$lt_cv_dlopen_self_static" >&6; } - fi - - CPPFLAGS="$save_CPPFLAGS" - LDFLAGS="$save_LDFLAGS" - LIBS="$save_LIBS" - ;; - esac - - case $lt_cv_dlopen_self in - yes|no) enable_dlopen_self=$lt_cv_dlopen_self ;; - *) enable_dlopen_self=unknown ;; - esac - - case $lt_cv_dlopen_self_static in - yes|no) enable_dlopen_self_static=$lt_cv_dlopen_self_static ;; - *) enable_dlopen_self_static=unknown ;; - esac -fi - - - - - - - - - - - - - - - - - -striplib= -old_striplib= -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether stripping libraries is possible" >&5 -$as_echo_n "checking whether stripping libraries is possible... " >&6; } -if test -n "$STRIP" && $STRIP -V 2>&1 | $GREP "GNU strip" >/dev/null; then - test -z "$old_striplib" && old_striplib="$STRIP --strip-debug" - test -z "$striplib" && striplib="$STRIP --strip-unneeded" - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; } -else -# FIXME - insert some real tests, host_os isn't really good enough - case $host_os in - darwin*) - if test -n "$STRIP" ; then - striplib="$STRIP -x" - old_striplib="$STRIP -S" - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; } - else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } - fi - ;; - *) - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } - ;; - esac -fi - - - - - - - - - - - - - # Report which library types will actually be built - { $as_echo "$as_me:${as_lineno-$LINENO}: checking if libtool supports shared libraries" >&5 -$as_echo_n "checking if libtool supports shared libraries... " >&6; } - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $can_build_shared" >&5 -$as_echo "$can_build_shared" >&6; } - - { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build shared libraries" >&5 -$as_echo_n "checking whether to build shared libraries... " >&6; } - test "$can_build_shared" = "no" && enable_shared=no - - # On AIX, shared libraries and static libraries use the same namespace, and - # are all built from PIC. - case $host_os in - aix3*) - test "$enable_shared" = yes && enable_static=no - if test -n "$RANLIB"; then - archive_cmds="$archive_cmds~\$RANLIB \$lib" - postinstall_cmds='$RANLIB $lib' - fi - ;; - - aix[4-9]*) - if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then - test "$enable_shared" = yes && enable_static=no - fi - ;; - esac - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_shared" >&5 -$as_echo "$enable_shared" >&6; } - - { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build static libraries" >&5 -$as_echo_n "checking whether to build static libraries... " >&6; } - # Make sure either enable_shared or enable_static is yes. - test "$enable_shared" = yes || enable_static=yes - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_static" >&5 -$as_echo "$enable_static" >&6; } - - - - -fi -ac_ext=c -ac_cpp='$CPP $CPPFLAGS' -ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_c_compiler_gnu - -CC="$lt_save_CC" - - if test -n "$CXX" && ( test "X$CXX" != "Xno" && - ( (test "X$CXX" = "Xg++" && `g++ -v >/dev/null 2>&1` ) || - (test "X$CXX" != "Xg++"))) ; then - ac_ext=cpp -ac_cpp='$CXXCPP $CPPFLAGS' -ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_cxx_compiler_gnu -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C++ preprocessor" >&5 -$as_echo_n "checking how to run the C++ preprocessor... " >&6; } -if test -z "$CXXCPP"; then - if ${ac_cv_prog_CXXCPP+:} false; then : - $as_echo_n "(cached) " >&6 -else - # Double quotes because CXXCPP needs to be expanded - for CXXCPP in "$CXX -E" "/lib/cpp" - do - ac_preproc_ok=false -for ac_cxx_preproc_warn_flag in '' yes -do - # Use a header file that comes with gcc, so configuring glibc - # with a fresh cross-compiler works. - # Prefer to if __STDC__ is defined, since - # exists even on freestanding compilers. - # On the NeXT, cc -E runs the code through the compiler's parser, - # not just through cpp. "Syntax error" is here to catch this case. - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -@%:@ifdef __STDC__ -@%:@ include -@%:@else -@%:@ include -@%:@endif - Syntax error -_ACEOF -if ac_fn_cxx_try_cpp "$LINENO"; then : - -else - # Broken: fails on valid input. -continue -fi -rm -f conftest.err conftest.i conftest.$ac_ext - - # OK, works on sane cases. Now check whether nonexistent headers - # can be detected and how. - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -@%:@include -_ACEOF -if ac_fn_cxx_try_cpp "$LINENO"; then : - # Broken: success on invalid input. -continue -else - # Passes both tests. -ac_preproc_ok=: -break -fi -rm -f conftest.err conftest.i conftest.$ac_ext - -done -# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. -rm -f conftest.i conftest.err conftest.$ac_ext -if $ac_preproc_ok; then : - break -fi - - done - ac_cv_prog_CXXCPP=$CXXCPP - -fi - CXXCPP=$ac_cv_prog_CXXCPP -else - ac_cv_prog_CXXCPP=$CXXCPP -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $CXXCPP" >&5 -$as_echo "$CXXCPP" >&6; } -ac_preproc_ok=false -for ac_cxx_preproc_warn_flag in '' yes -do - # Use a header file that comes with gcc, so configuring glibc - # with a fresh cross-compiler works. - # Prefer to if __STDC__ is defined, since - # exists even on freestanding compilers. - # On the NeXT, cc -E runs the code through the compiler's parser, - # not just through cpp. "Syntax error" is here to catch this case. - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -@%:@ifdef __STDC__ -@%:@ include -@%:@else -@%:@ include -@%:@endif - Syntax error -_ACEOF -if ac_fn_cxx_try_cpp "$LINENO"; then : - -else - # Broken: fails on valid input. -continue -fi -rm -f conftest.err conftest.i conftest.$ac_ext - - # OK, works on sane cases. Now check whether nonexistent headers - # can be detected and how. - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -@%:@include -_ACEOF -if ac_fn_cxx_try_cpp "$LINENO"; then : - # Broken: success on invalid input. -continue -else - # Passes both tests. -ac_preproc_ok=: -break -fi -rm -f conftest.err conftest.i conftest.$ac_ext - -done -# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. -rm -f conftest.i conftest.err conftest.$ac_ext -if $ac_preproc_ok; then : - -else - { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 -$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} -as_fn_error $? "C++ preprocessor \"$CXXCPP\" fails sanity check -See \`config.log' for more details" "$LINENO" 5; } -fi - -ac_ext=c -ac_cpp='$CPP $CPPFLAGS' -ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_c_compiler_gnu - -else - _lt_caught_CXX_error=yes -fi - -ac_ext=cpp -ac_cpp='$CXXCPP $CPPFLAGS' -ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_cxx_compiler_gnu - -archive_cmds_need_lc_CXX=no -allow_undefined_flag_CXX= -always_export_symbols_CXX=no -archive_expsym_cmds_CXX= -compiler_needs_object_CXX=no -export_dynamic_flag_spec_CXX= -hardcode_direct_CXX=no -hardcode_direct_absolute_CXX=no -hardcode_libdir_flag_spec_CXX= -hardcode_libdir_separator_CXX= -hardcode_minus_L_CXX=no -hardcode_shlibpath_var_CXX=unsupported -hardcode_automatic_CXX=no -inherit_rpath_CXX=no -module_cmds_CXX= -module_expsym_cmds_CXX= -link_all_deplibs_CXX=unknown -old_archive_cmds_CXX=$old_archive_cmds -reload_flag_CXX=$reload_flag -reload_cmds_CXX=$reload_cmds -no_undefined_flag_CXX= -whole_archive_flag_spec_CXX= -enable_shared_with_static_runtimes_CXX=no - -# Source file extension for C++ test sources. -ac_ext=cpp - -# Object file extension for compiled C++ test sources. -objext=o -objext_CXX=$objext - -# No sense in running all these tests if we already determined that -# the CXX compiler isn't working. Some variables (like enable_shared) -# are currently assumed to apply to all compilers on this platform, -# and will be corrupted by setting them based on a non-working compiler. -if test "$_lt_caught_CXX_error" != yes; then - # Code to be used in simple compile tests - lt_simple_compile_test_code="int some_variable = 0;" - - # Code to be used in simple link tests - lt_simple_link_test_code='int main(int, char *[]) { return(0); }' - - # ltmain only uses $CC for tagged configurations so make sure $CC is set. - - - - - - -# If no C compiler was specified, use CC. -LTCC=${LTCC-"$CC"} - -# If no C compiler flags were specified, use CFLAGS. -LTCFLAGS=${LTCFLAGS-"$CFLAGS"} - -# Allow CC to be a program name with arguments. -compiler=$CC - - - # save warnings/boilerplate of simple test code - ac_outfile=conftest.$ac_objext -echo "$lt_simple_compile_test_code" >conftest.$ac_ext -eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err -_lt_compiler_boilerplate=`cat conftest.err` -$RM conftest* - - ac_outfile=conftest.$ac_objext -echo "$lt_simple_link_test_code" >conftest.$ac_ext -eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err -_lt_linker_boilerplate=`cat conftest.err` -$RM -r conftest* - - - # Allow CC to be a program name with arguments. - lt_save_CC=$CC - lt_save_CFLAGS=$CFLAGS - lt_save_LD=$LD - lt_save_GCC=$GCC - GCC=$GXX - lt_save_with_gnu_ld=$with_gnu_ld - lt_save_path_LD=$lt_cv_path_LD - if test -n "${lt_cv_prog_gnu_ldcxx+set}"; then - lt_cv_prog_gnu_ld=$lt_cv_prog_gnu_ldcxx - else - $as_unset lt_cv_prog_gnu_ld - fi - if test -n "${lt_cv_path_LDCXX+set}"; then - lt_cv_path_LD=$lt_cv_path_LDCXX - else - $as_unset lt_cv_path_LD - fi - test -z "${LDCXX+set}" || LD=$LDCXX - CC=${CXX-"c++"} - CFLAGS=$CXXFLAGS - compiler=$CC - compiler_CXX=$CC - for cc_temp in $compiler""; do - case $cc_temp in - compile | *[\\/]compile | ccache | *[\\/]ccache ) ;; - distcc | *[\\/]distcc | purify | *[\\/]purify ) ;; - \-*) ;; - *) break;; - esac -done -cc_basename=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"` - - - if test -n "$compiler"; then - # We don't want -fno-exception when compiling C++ code, so set the - # no_builtin_flag separately - if test "$GXX" = yes; then - lt_prog_compiler_no_builtin_flag_CXX=' -fno-builtin' - else - lt_prog_compiler_no_builtin_flag_CXX= - fi - - if test "$GXX" = yes; then - # Set up default GNU C++ configuration - - - -@%:@ Check whether --with-gnu-ld was given. -if test "${with_gnu_ld+set}" = set; then : - withval=$with_gnu_ld; test "$withval" = no || with_gnu_ld=yes -else - with_gnu_ld=no -fi - -ac_prog=ld -if test "$GCC" = yes; then - # Check if gcc -print-prog-name=ld gives a path. - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ld used by $CC" >&5 -$as_echo_n "checking for ld used by $CC... " >&6; } - case $host in - *-*-mingw*) - # gcc leaves a trailing carriage return which upsets mingw - ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;; - *) - ac_prog=`($CC -print-prog-name=ld) 2>&5` ;; - esac - case $ac_prog in - # Accept absolute paths. - [\\/]* | ?:[\\/]*) - re_direlt='/[^/][^/]*/\.\./' - # Canonicalize the pathname of ld - ac_prog=`$ECHO "$ac_prog"| $SED 's%\\\\%/%g'` - while $ECHO "$ac_prog" | $GREP "$re_direlt" > /dev/null 2>&1; do - ac_prog=`$ECHO $ac_prog| $SED "s%$re_direlt%/%"` - done - test -z "$LD" && LD="$ac_prog" - ;; - "") - # If it fails, then pretend we aren't using GCC. - ac_prog=ld - ;; - *) - # If it is relative, then search for the first ld in PATH. - with_gnu_ld=unknown - ;; - esac -elif test "$with_gnu_ld" = yes; then - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU ld" >&5 -$as_echo_n "checking for GNU ld... " >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for non-GNU ld" >&5 -$as_echo_n "checking for non-GNU ld... " >&6; } -fi -if ${lt_cv_path_LD+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -z "$LD"; then - lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR - for ac_dir in $PATH; do - IFS="$lt_save_ifs" - test -z "$ac_dir" && ac_dir=. - if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then - lt_cv_path_LD="$ac_dir/$ac_prog" - # Check to see if the program is GNU ld. I'd rather use --version, - # but apparently some variants of GNU ld only accept -v. - # Break only if it was the GNU/non-GNU ld that we prefer. - case `"$lt_cv_path_LD" -v 2>&1 &5 -$as_echo "$LD" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi -test -z "$LD" && as_fn_error $? "no acceptable ld found in \$PATH" "$LINENO" 5 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if the linker ($LD) is GNU ld" >&5 -$as_echo_n "checking if the linker ($LD) is GNU ld... " >&6; } -if ${lt_cv_prog_gnu_ld+:} false; then : - $as_echo_n "(cached) " >&6 -else - # I'd rather use --version here, but apparently some GNU lds only accept -v. -case `$LD -v 2>&1 &5 -$as_echo "$lt_cv_prog_gnu_ld" >&6; } -with_gnu_ld=$lt_cv_prog_gnu_ld - - - - - - - - # Check if GNU C++ uses GNU ld as the underlying linker, since the - # archiving commands below assume that GNU ld is being used. - if test "$with_gnu_ld" = yes; then - archive_cmds_CXX='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' - archive_expsym_cmds_CXX='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' - - hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir' - export_dynamic_flag_spec_CXX='${wl}--export-dynamic' - - # If archive_cmds runs LD, not CC, wlarc should be empty - # XXX I think wlarc can be eliminated in ltcf-cxx, but I need to - # investigate it a little bit more. (MM) - wlarc='${wl}' - - # ancient GNU ld didn't support --whole-archive et. al. - if eval "`$CC -print-prog-name=ld` --help 2>&1" | - $GREP 'no-whole-archive' > /dev/null; then - whole_archive_flag_spec_CXX="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' - else - whole_archive_flag_spec_CXX= - fi - else - with_gnu_ld=no - wlarc= - - # A generic and very simple default shared library creation - # command for GNU C++ for the case where it uses the native - # linker, instead of GNU ld. If possible, this setting should - # overridden to take advantage of the native linker features on - # the platform it is being used on. - archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib' - fi - - # Commands to make compiler produce verbose output that lists - # what "hidden" libraries, object files and flags are used when - # linking a shared library. - output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' - - else - GXX=no - with_gnu_ld=no - wlarc= - fi - - # PORTME: fill in a description of your system's C++ link characteristics - { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $compiler linker ($LD) supports shared libraries" >&5 -$as_echo_n "checking whether the $compiler linker ($LD) supports shared libraries... " >&6; } - ld_shlibs_CXX=yes - case $host_os in - aix3*) - # FIXME: insert proper C++ library support - ld_shlibs_CXX=no - ;; - aix[4-9]*) - if test "$host_cpu" = ia64; then - # On IA64, the linker does run time linking by default, so we don't - # have to do anything special. - aix_use_runtimelinking=no - exp_sym_flag='-Bexport' - no_entry_flag="" - else - aix_use_runtimelinking=no - - # Test if we are trying to use run time linking or normal - # AIX style linking. If -brtl is somewhere in LDFLAGS, we - # need to do runtime linking. - case $host_os in aix4.[23]|aix4.[23].*|aix[5-9]*) - for ld_flag in $LDFLAGS; do - case $ld_flag in - *-brtl*) - aix_use_runtimelinking=yes - break - ;; - esac - done - ;; - esac - - exp_sym_flag='-bexport' - no_entry_flag='-bnoentry' - fi - - # When large executables or shared objects are built, AIX ld can - # have problems creating the table of contents. If linking a library - # or program results in "error TOC overflow" add -mminimal-toc to - # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not - # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. - - archive_cmds_CXX='' - hardcode_direct_CXX=yes - hardcode_direct_absolute_CXX=yes - hardcode_libdir_separator_CXX=':' - link_all_deplibs_CXX=yes - file_list_spec_CXX='${wl}-f,' - - if test "$GXX" = yes; then - case $host_os in aix4.[012]|aix4.[012].*) - # We only want to do this on AIX 4.2 and lower, the check - # below for broken collect2 doesn't work under 4.3+ - collect2name=`${CC} -print-prog-name=collect2` - if test -f "$collect2name" && - strings "$collect2name" | $GREP resolve_lib_name >/dev/null - then - # We have reworked collect2 - : - else - # We have old collect2 - hardcode_direct_CXX=unsupported - # It fails to find uninstalled libraries when the uninstalled - # path is not listed in the libpath. Setting hardcode_minus_L - # to unsupported forces relinking - hardcode_minus_L_CXX=yes - hardcode_libdir_flag_spec_CXX='-L$libdir' - hardcode_libdir_separator_CXX= - fi - esac - shared_flag='-shared' - if test "$aix_use_runtimelinking" = yes; then - shared_flag="$shared_flag "'${wl}-G' - fi - else - # not using gcc - if test "$host_cpu" = ia64; then - # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release - # chokes on -Wl,-G. The following line is correct: - shared_flag='-G' - else - if test "$aix_use_runtimelinking" = yes; then - shared_flag='${wl}-G' - else - shared_flag='${wl}-bM:SRE' - fi - fi - fi - - export_dynamic_flag_spec_CXX='${wl}-bexpall' - # It seems that -bexpall does not export symbols beginning with - # underscore (_), so it is better to generate a list of symbols to - # export. - always_export_symbols_CXX=yes - if test "$aix_use_runtimelinking" = yes; then - # Warning - without using the other runtime loading flags (-brtl), - # -berok will link without error, but may produce a broken library. - allow_undefined_flag_CXX='-berok' - # Determine the default libpath from the value encoded in an empty - # executable. - if test "${lt_cv_aix_libpath+set}" = set; then - aix_libpath=$lt_cv_aix_libpath -else - if ${lt_cv_aix_libpath__CXX+:} false; then : - $as_echo_n "(cached) " >&6 -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -int -main () -{ - - ; - return 0; -} -_ACEOF -if ac_fn_cxx_try_link "$LINENO"; then : - - lt_aix_libpath_sed=' - /Import File Strings/,/^$/ { - /^0/ { - s/^0 *\([^ ]*\) *$/\1/ - p - } - }' - lt_cv_aix_libpath__CXX=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` - # Check for a 64-bit object if we didn't find anything. - if test -z "$lt_cv_aix_libpath__CXX"; then - lt_cv_aix_libpath__CXX=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` - fi -fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext - if test -z "$lt_cv_aix_libpath__CXX"; then - lt_cv_aix_libpath__CXX="/usr/lib:/lib" - fi - -fi - - aix_libpath=$lt_cv_aix_libpath__CXX -fi - - hardcode_libdir_flag_spec_CXX='${wl}-blibpath:$libdir:'"$aix_libpath" - - archive_expsym_cmds_CXX='$CC -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then func_echo_all "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag" - else - if test "$host_cpu" = ia64; then - hardcode_libdir_flag_spec_CXX='${wl}-R $libdir:/usr/lib:/lib' - allow_undefined_flag_CXX="-z nodefs" - archive_expsym_cmds_CXX="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols" - else - # Determine the default libpath from the value encoded in an - # empty executable. - if test "${lt_cv_aix_libpath+set}" = set; then - aix_libpath=$lt_cv_aix_libpath -else - if ${lt_cv_aix_libpath__CXX+:} false; then : - $as_echo_n "(cached) " >&6 -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -int -main () -{ - - ; - return 0; -} -_ACEOF -if ac_fn_cxx_try_link "$LINENO"; then : - - lt_aix_libpath_sed=' - /Import File Strings/,/^$/ { - /^0/ { - s/^0 *\([^ ]*\) *$/\1/ - p - } - }' - lt_cv_aix_libpath__CXX=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` - # Check for a 64-bit object if we didn't find anything. - if test -z "$lt_cv_aix_libpath__CXX"; then - lt_cv_aix_libpath__CXX=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` - fi -fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext - if test -z "$lt_cv_aix_libpath__CXX"; then - lt_cv_aix_libpath__CXX="/usr/lib:/lib" - fi - -fi - - aix_libpath=$lt_cv_aix_libpath__CXX -fi - - hardcode_libdir_flag_spec_CXX='${wl}-blibpath:$libdir:'"$aix_libpath" - # Warning - without using the other run time loading flags, - # -berok will link without error, but may produce a broken library. - no_undefined_flag_CXX=' ${wl}-bernotok' - allow_undefined_flag_CXX=' ${wl}-berok' - if test "$with_gnu_ld" = yes; then - # We only use this code for GNU lds that support --whole-archive. - whole_archive_flag_spec_CXX='${wl}--whole-archive$convenience ${wl}--no-whole-archive' - else - # Exported symbols can be pulled into shared objects from archives - whole_archive_flag_spec_CXX='$convenience' - fi - archive_cmds_need_lc_CXX=yes - # This is similar to how AIX traditionally builds its shared - # libraries. - archive_expsym_cmds_CXX="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' - fi - fi - ;; - - beos*) - if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then - allow_undefined_flag_CXX=unsupported - # Joseph Beckenbach says some releases of gcc - # support --undefined. This deserves some investigation. FIXME - archive_cmds_CXX='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' - else - ld_shlibs_CXX=no - fi - ;; - - chorus*) - case $cc_basename in - *) - # FIXME: insert proper C++ library support - ld_shlibs_CXX=no - ;; - esac - ;; - - cygwin* | mingw* | pw32* | cegcc*) - case $GXX,$cc_basename in - ,cl* | no,cl*) - # Native MSVC - # hardcode_libdir_flag_spec is actually meaningless, as there is - # no search path for DLLs. - hardcode_libdir_flag_spec_CXX=' ' - allow_undefined_flag_CXX=unsupported - always_export_symbols_CXX=yes - file_list_spec_CXX='@' - # Tell ltmain to make .lib files, not .a files. - libext=lib - # Tell ltmain to make .dll files, not .so files. - shrext_cmds=".dll" - # FIXME: Setting linknames here is a bad hack. - archive_cmds_CXX='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-dll~linknames=' - archive_expsym_cmds_CXX='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then - $SED -n -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' -e '1\\\!p' < $export_symbols > $output_objdir/$soname.exp; - else - $SED -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' < $export_symbols > $output_objdir/$soname.exp; - fi~ - $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~ - linknames=' - # The linker will not automatically build a static lib if we build a DLL. - # _LT_TAGVAR(old_archive_from_new_cmds, CXX)='true' - enable_shared_with_static_runtimes_CXX=yes - # Don't use ranlib - old_postinstall_cmds_CXX='chmod 644 $oldlib' - postlink_cmds_CXX='lt_outputfile="@OUTPUT@"~ - lt_tool_outputfile="@TOOL_OUTPUT@"~ - case $lt_outputfile in - *.exe|*.EXE) ;; - *) - lt_outputfile="$lt_outputfile.exe" - lt_tool_outputfile="$lt_tool_outputfile.exe" - ;; - esac~ - func_to_tool_file "$lt_outputfile"~ - if test "$MANIFEST_TOOL" != ":" && test -f "$lt_outputfile.manifest"; then - $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1; - $RM "$lt_outputfile.manifest"; - fi' - ;; - *) - # g++ - # _LT_TAGVAR(hardcode_libdir_flag_spec, CXX) is actually meaningless, - # as there is no search path for DLLs. - hardcode_libdir_flag_spec_CXX='-L$libdir' - export_dynamic_flag_spec_CXX='${wl}--export-all-symbols' - allow_undefined_flag_CXX=unsupported - always_export_symbols_CXX=no - enable_shared_with_static_runtimes_CXX=yes - - if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then - archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' - # If the export-symbols file already is a .def file (1st line - # is EXPORTS), use it as is; otherwise, prepend... - archive_expsym_cmds_CXX='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then - cp $export_symbols $output_objdir/$soname.def; - else - echo EXPORTS > $output_objdir/$soname.def; - cat $export_symbols >> $output_objdir/$soname.def; - fi~ - $CC -shared -nostdlib $output_objdir/$soname.def $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' - else - ld_shlibs_CXX=no - fi - ;; - esac - ;; - darwin* | rhapsody*) - - - archive_cmds_need_lc_CXX=no - hardcode_direct_CXX=no - hardcode_automatic_CXX=yes - hardcode_shlibpath_var_CXX=unsupported - if test "$lt_cv_ld_force_load" = "yes"; then - whole_archive_flag_spec_CXX='`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience ${wl}-force_load,$conv\"; done; func_echo_all \"$new_convenience\"`' - - else - whole_archive_flag_spec_CXX='' - fi - link_all_deplibs_CXX=yes - allow_undefined_flag_CXX="$_lt_dar_allow_undefined" - case $cc_basename in - ifort*) _lt_dar_can_shared=yes ;; - *) _lt_dar_can_shared=$GCC ;; - esac - if test "$_lt_dar_can_shared" = "yes"; then - output_verbose_link_cmd=func_echo_all - archive_cmds_CXX="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod${_lt_dsymutil}" - module_cmds_CXX="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dsymutil}" - archive_expsym_cmds_CXX="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring ${_lt_dar_single_mod}${_lt_dar_export_syms}${_lt_dsymutil}" - module_expsym_cmds_CXX="sed -e 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dar_export_syms}${_lt_dsymutil}" - if test "$lt_cv_apple_cc_single_mod" != "yes"; then - archive_cmds_CXX="\$CC -r -keep_private_externs -nostdlib -o \${lib}-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \${lib}-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring${_lt_dsymutil}" - archive_expsym_cmds_CXX="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -r -keep_private_externs -nostdlib -o \${lib}-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \${lib}-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring${_lt_dar_export_syms}${_lt_dsymutil}" - fi - - else - ld_shlibs_CXX=no - fi - - ;; - - dgux*) - case $cc_basename in - ec++*) - # FIXME: insert proper C++ library support - ld_shlibs_CXX=no - ;; - ghcx*) - # Green Hills C++ Compiler - # FIXME: insert proper C++ library support - ld_shlibs_CXX=no - ;; - *) - # FIXME: insert proper C++ library support - ld_shlibs_CXX=no - ;; - esac - ;; - - freebsd2.*) - # C++ shared libraries reported to be fairly broken before - # switch to ELF - ld_shlibs_CXX=no - ;; - - freebsd-elf*) - archive_cmds_need_lc_CXX=no - ;; - - freebsd* | dragonfly*) - # FreeBSD 3 and later use GNU C++ and GNU ld with standard ELF - # conventions - ld_shlibs_CXX=yes - ;; - - gnu*) - ;; - - haiku*) - archive_cmds_CXX='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' - link_all_deplibs_CXX=yes - ;; - - hpux9*) - hardcode_libdir_flag_spec_CXX='${wl}+b ${wl}$libdir' - hardcode_libdir_separator_CXX=: - export_dynamic_flag_spec_CXX='${wl}-E' - hardcode_direct_CXX=yes - hardcode_minus_L_CXX=yes # Not in the search PATH, - # but as the default - # location of the library. - - case $cc_basename in - CC*) - # FIXME: insert proper C++ library support - ld_shlibs_CXX=no - ;; - aCC*) - archive_cmds_CXX='$RM $output_objdir/$soname~$CC -b ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' - # Commands to make compiler produce verbose output that lists - # what "hidden" libraries, object files and flags are used when - # linking a shared library. - # - # There doesn't appear to be a way to prevent this compiler from - # explicitly linking system object files so we need to strip them - # from the output so that they don't get included in the library - # dependencies. - output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $EGREP "\-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' - ;; - *) - if test "$GXX" = yes; then - archive_cmds_CXX='$RM $output_objdir/$soname~$CC -shared -nostdlib $pic_flag ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' - else - # FIXME: insert proper C++ library support - ld_shlibs_CXX=no - fi - ;; - esac - ;; - - hpux10*|hpux11*) - if test $with_gnu_ld = no; then - hardcode_libdir_flag_spec_CXX='${wl}+b ${wl}$libdir' - hardcode_libdir_separator_CXX=: - - case $host_cpu in - hppa*64*|ia64*) - ;; - *) - export_dynamic_flag_spec_CXX='${wl}-E' - ;; - esac - fi - case $host_cpu in - hppa*64*|ia64*) - hardcode_direct_CXX=no - hardcode_shlibpath_var_CXX=no - ;; - *) - hardcode_direct_CXX=yes - hardcode_direct_absolute_CXX=yes - hardcode_minus_L_CXX=yes # Not in the search PATH, - # but as the default - # location of the library. - ;; - esac - - case $cc_basename in - CC*) - # FIXME: insert proper C++ library support - ld_shlibs_CXX=no - ;; - aCC*) - case $host_cpu in - hppa*64*) - archive_cmds_CXX='$CC -b ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' - ;; - ia64*) - archive_cmds_CXX='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' - ;; - *) - archive_cmds_CXX='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' - ;; - esac - # Commands to make compiler produce verbose output that lists - # what "hidden" libraries, object files and flags are used when - # linking a shared library. - # - # There doesn't appear to be a way to prevent this compiler from - # explicitly linking system object files so we need to strip them - # from the output so that they don't get included in the library - # dependencies. - output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $GREP "\-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' - ;; - *) - if test "$GXX" = yes; then - if test $with_gnu_ld = no; then - case $host_cpu in - hppa*64*) - archive_cmds_CXX='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' - ;; - ia64*) - archive_cmds_CXX='$CC -shared -nostdlib $pic_flag ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' - ;; - *) - archive_cmds_CXX='$CC -shared -nostdlib $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' - ;; - esac - fi - else - # FIXME: insert proper C++ library support - ld_shlibs_CXX=no - fi - ;; - esac - ;; - - interix[3-9]*) - hardcode_direct_CXX=no - hardcode_shlibpath_var_CXX=no - hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir' - export_dynamic_flag_spec_CXX='${wl}-E' - # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. - # Instead, shared libraries are loaded at an image base (0x10000000 by - # default) and relocated if they conflict, which is a slow very memory - # consuming and fragmenting process. To avoid this, we pick a random, - # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link - # time. Moving up from 0x10000000 also allows more sbrk(2) space. - archive_cmds_CXX='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' - archive_expsym_cmds_CXX='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' - ;; - irix5* | irix6*) - case $cc_basename in - CC*) - # SGI C++ - archive_cmds_CXX='$CC -shared -all -multigot $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' - - # Archives containing C++ object files must be created using - # "CC -ar", where "CC" is the IRIX C++ compiler. This is - # necessary to make sure instantiated templates are included - # in the archive. - old_archive_cmds_CXX='$CC -ar -WR,-u -o $oldlib $oldobjs' - ;; - *) - if test "$GXX" = yes; then - if test "$with_gnu_ld" = no; then - archive_cmds_CXX='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' - else - archive_cmds_CXX='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` -o $lib' - fi - fi - link_all_deplibs_CXX=yes - ;; - esac - hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir' - hardcode_libdir_separator_CXX=: - inherit_rpath_CXX=yes - ;; - - linux* | k*bsd*-gnu | kopensolaris*-gnu) - case $cc_basename in - KCC*) - # Kuck and Associates, Inc. (KAI) C++ Compiler - - # KCC will only create a shared library if the output file - # ends with ".so" (or ".sl" for HP-UX), so rename the library - # to its proper name (with version) after linking. - archive_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' - archive_expsym_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib ${wl}-retain-symbols-file,$export_symbols; mv \$templib $lib' - # Commands to make compiler produce verbose output that lists - # what "hidden" libraries, object files and flags are used when - # linking a shared library. - # - # There doesn't appear to be a way to prevent this compiler from - # explicitly linking system object files so we need to strip them - # from the output so that they don't get included in the library - # dependencies. - output_verbose_link_cmd='templist=`$CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 | $GREP "ld"`; rm -f libconftest$shared_ext; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' - - hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir' - export_dynamic_flag_spec_CXX='${wl}--export-dynamic' - - # Archives containing C++ object files must be created using - # "CC -Bstatic", where "CC" is the KAI C++ compiler. - old_archive_cmds_CXX='$CC -Bstatic -o $oldlib $oldobjs' - ;; - icpc* | ecpc* ) - # Intel C++ - with_gnu_ld=yes - # version 8.0 and above of icpc choke on multiply defined symbols - # if we add $predep_objects and $postdep_objects, however 7.1 and - # earlier do not add the objects themselves. - case `$CC -V 2>&1` in - *"Version 7."*) - archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' - archive_expsym_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' - ;; - *) # Version 8.0 or newer - tmp_idyn= - case $host_cpu in - ia64*) tmp_idyn=' -i_dynamic';; - esac - archive_cmds_CXX='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' - archive_expsym_cmds_CXX='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' - ;; - esac - archive_cmds_need_lc_CXX=no - hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir' - export_dynamic_flag_spec_CXX='${wl}--export-dynamic' - whole_archive_flag_spec_CXX='${wl}--whole-archive$convenience ${wl}--no-whole-archive' - ;; - pgCC* | pgcpp*) - # Portland Group C++ compiler - case `$CC -V` in - *pgCC\ [1-5].* | *pgcpp\ [1-5].*) - prelink_cmds_CXX='tpldir=Template.dir~ - rm -rf $tpldir~ - $CC --prelink_objects --instantiation_dir $tpldir $objs $libobjs $compile_deplibs~ - compile_command="$compile_command `find $tpldir -name \*.o | sort | $NL2SP`"' - old_archive_cmds_CXX='tpldir=Template.dir~ - rm -rf $tpldir~ - $CC --prelink_objects --instantiation_dir $tpldir $oldobjs$old_deplibs~ - $AR $AR_FLAGS $oldlib$oldobjs$old_deplibs `find $tpldir -name \*.o | sort | $NL2SP`~ - $RANLIB $oldlib' - archive_cmds_CXX='tpldir=Template.dir~ - rm -rf $tpldir~ - $CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~ - $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname -o $lib' - archive_expsym_cmds_CXX='tpldir=Template.dir~ - rm -rf $tpldir~ - $CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~ - $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname ${wl}-retain-symbols-file ${wl}$export_symbols -o $lib' - ;; - *) # Version 6 and above use weak symbols - archive_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname -o $lib' - archive_expsym_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname ${wl}-retain-symbols-file ${wl}$export_symbols -o $lib' - ;; - esac - - hardcode_libdir_flag_spec_CXX='${wl}--rpath ${wl}$libdir' - export_dynamic_flag_spec_CXX='${wl}--export-dynamic' - whole_archive_flag_spec_CXX='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' - ;; - cxx*) - # Compaq C++ - archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' - archive_expsym_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib ${wl}-retain-symbols-file $wl$export_symbols' - - runpath_var=LD_RUN_PATH - hardcode_libdir_flag_spec_CXX='-rpath $libdir' - hardcode_libdir_separator_CXX=: - - # Commands to make compiler produce verbose output that lists - # what "hidden" libraries, object files and flags are used when - # linking a shared library. - # - # There doesn't appear to be a way to prevent this compiler from - # explicitly linking system object files so we need to strip them - # from the output so that they don't get included in the library - # dependencies. - output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld"`; templist=`func_echo_all "$templist" | $SED "s/\(^.*ld.*\)\( .*ld .*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "X$list" | $Xsed' - ;; - xl* | mpixl* | bgxl*) - # IBM XL 8.0 on PPC, with GNU ld - hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir' - export_dynamic_flag_spec_CXX='${wl}--export-dynamic' - archive_cmds_CXX='$CC -qmkshrobj $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' - if test "x$supports_anon_versioning" = xyes; then - archive_expsym_cmds_CXX='echo "{ global:" > $output_objdir/$libname.ver~ - cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ - echo "local: *; };" >> $output_objdir/$libname.ver~ - $CC -qmkshrobj $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib' - fi - ;; - *) - case `$CC -V 2>&1 | sed 5q` in - *Sun\ C*) - # Sun C++ 5.9 - no_undefined_flag_CXX=' -zdefs' - archive_cmds_CXX='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' - archive_expsym_cmds_CXX='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file ${wl}$export_symbols' - hardcode_libdir_flag_spec_CXX='-R$libdir' - whole_archive_flag_spec_CXX='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' - compiler_needs_object_CXX=yes - - # Not sure whether something based on - # $CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 - # would be better. - output_verbose_link_cmd='func_echo_all' - - # Archives containing C++ object files must be created using - # "CC -xar", where "CC" is the Sun C++ compiler. This is - # necessary to make sure instantiated templates are included - # in the archive. - old_archive_cmds_CXX='$CC -xar -o $oldlib $oldobjs' - ;; - esac - ;; - esac - ;; - - lynxos*) - # FIXME: insert proper C++ library support - ld_shlibs_CXX=no - ;; - - m88k*) - # FIXME: insert proper C++ library support - ld_shlibs_CXX=no - ;; - - mvs*) - case $cc_basename in - cxx*) - # FIXME: insert proper C++ library support - ld_shlibs_CXX=no - ;; - *) - # FIXME: insert proper C++ library support - ld_shlibs_CXX=no - ;; - esac - ;; - - netbsd*) - if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then - archive_cmds_CXX='$LD -Bshareable -o $lib $predep_objects $libobjs $deplibs $postdep_objects $linker_flags' - wlarc= - hardcode_libdir_flag_spec_CXX='-R$libdir' - hardcode_direct_CXX=yes - hardcode_shlibpath_var_CXX=no - fi - # Workaround some broken pre-1.5 toolchains - output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP conftest.$objext | $SED -e "s:-lgcc -lc -lgcc::"' - ;; - - *nto* | *qnx*) - ld_shlibs_CXX=yes - ;; - - openbsd2*) - # C++ shared libraries are fairly broken - ld_shlibs_CXX=no - ;; - - openbsd*) - if test -f /usr/libexec/ld.so; then - hardcode_direct_CXX=yes - hardcode_shlibpath_var_CXX=no - hardcode_direct_absolute_CXX=yes - archive_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib' - hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir' - if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then - archive_expsym_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file,$export_symbols -o $lib' - export_dynamic_flag_spec_CXX='${wl}-E' - whole_archive_flag_spec_CXX="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' - fi - output_verbose_link_cmd=func_echo_all - else - ld_shlibs_CXX=no - fi - ;; - - osf3* | osf4* | osf5*) - case $cc_basename in - KCC*) - # Kuck and Associates, Inc. (KAI) C++ Compiler - - # KCC will only create a shared library if the output file - # ends with ".so" (or ".sl" for HP-UX), so rename the library - # to its proper name (with version) after linking. - archive_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo "$lib" | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' - - hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir' - hardcode_libdir_separator_CXX=: - - # Archives containing C++ object files must be created using - # the KAI C++ compiler. - case $host in - osf3*) old_archive_cmds_CXX='$CC -Bstatic -o $oldlib $oldobjs' ;; - *) old_archive_cmds_CXX='$CC -o $oldlib $oldobjs' ;; - esac - ;; - RCC*) - # Rational C++ 2.4.1 - # FIXME: insert proper C++ library support - ld_shlibs_CXX=no - ;; - cxx*) - case $host in - osf3*) - allow_undefined_flag_CXX=' ${wl}-expect_unresolved ${wl}\*' - archive_cmds_CXX='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $soname `test -n "$verstring" && func_echo_all "${wl}-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' - hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir' - ;; - *) - allow_undefined_flag_CXX=' -expect_unresolved \*' - archive_cmds_CXX='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' - archive_expsym_cmds_CXX='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done~ - echo "-hidden">> $lib.exp~ - $CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname ${wl}-input ${wl}$lib.exp `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib~ - $RM $lib.exp' - hardcode_libdir_flag_spec_CXX='-rpath $libdir' - ;; - esac - - hardcode_libdir_separator_CXX=: - - # Commands to make compiler produce verbose output that lists - # what "hidden" libraries, object files and flags are used when - # linking a shared library. - # - # There doesn't appear to be a way to prevent this compiler from - # explicitly linking system object files so we need to strip them - # from the output so that they don't get included in the library - # dependencies. - output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld" | $GREP -v "ld:"`; templist=`func_echo_all "$templist" | $SED "s/\(^.*ld.*\)\( .*ld.*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' - ;; - *) - if test "$GXX" = yes && test "$with_gnu_ld" = no; then - allow_undefined_flag_CXX=' ${wl}-expect_unresolved ${wl}\*' - case $host in - osf3*) - archive_cmds_CXX='$CC -shared -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' - ;; - *) - archive_cmds_CXX='$CC -shared $pic_flag -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' - ;; - esac - - hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir' - hardcode_libdir_separator_CXX=: - - # Commands to make compiler produce verbose output that lists - # what "hidden" libraries, object files and flags are used when - # linking a shared library. - output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' - - else - # FIXME: insert proper C++ library support - ld_shlibs_CXX=no - fi - ;; - esac - ;; - - psos*) - # FIXME: insert proper C++ library support - ld_shlibs_CXX=no - ;; - - sunos4*) - case $cc_basename in - CC*) - # Sun C++ 4.x - # FIXME: insert proper C++ library support - ld_shlibs_CXX=no - ;; - lcc*) - # Lucid - # FIXME: insert proper C++ library support - ld_shlibs_CXX=no - ;; - *) - # FIXME: insert proper C++ library support - ld_shlibs_CXX=no - ;; - esac - ;; - - solaris*) - case $cc_basename in - CC* | sunCC*) - # Sun C++ 4.2, 5.x and Centerline C++ - archive_cmds_need_lc_CXX=yes - no_undefined_flag_CXX=' -zdefs' - archive_cmds_CXX='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' - archive_expsym_cmds_CXX='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ - $CC -G${allow_undefined_flag} ${wl}-M ${wl}$lib.exp -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' - - hardcode_libdir_flag_spec_CXX='-R$libdir' - hardcode_shlibpath_var_CXX=no - case $host_os in - solaris2.[0-5] | solaris2.[0-5].*) ;; - *) - # The compiler driver will combine and reorder linker options, - # but understands `-z linker_flag'. - # Supported since Solaris 2.6 (maybe 2.5.1?) - whole_archive_flag_spec_CXX='-z allextract$convenience -z defaultextract' - ;; - esac - link_all_deplibs_CXX=yes - - output_verbose_link_cmd='func_echo_all' - - # Archives containing C++ object files must be created using - # "CC -xar", where "CC" is the Sun C++ compiler. This is - # necessary to make sure instantiated templates are included - # in the archive. - old_archive_cmds_CXX='$CC -xar -o $oldlib $oldobjs' - ;; - gcx*) - # Green Hills C++ Compiler - archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' - - # The C++ compiler must be used to create the archive. - old_archive_cmds_CXX='$CC $LDFLAGS -archive -o $oldlib $oldobjs' - ;; - *) - # GNU C++ compiler with Solaris linker - if test "$GXX" = yes && test "$with_gnu_ld" = no; then - no_undefined_flag_CXX=' ${wl}-z ${wl}defs' - if $CC --version | $GREP -v '^2\.7' > /dev/null; then - archive_cmds_CXX='$CC -shared $pic_flag -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' - archive_expsym_cmds_CXX='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ - $CC -shared $pic_flag -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' - - # Commands to make compiler produce verbose output that lists - # what "hidden" libraries, object files and flags are used when - # linking a shared library. - output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' - else - # g++ 2.7 appears to require `-G' NOT `-shared' on this - # platform. - archive_cmds_CXX='$CC -G -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' - archive_expsym_cmds_CXX='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ - $CC -G -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' - - # Commands to make compiler produce verbose output that lists - # what "hidden" libraries, object files and flags are used when - # linking a shared library. - output_verbose_link_cmd='$CC -G $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' - fi - - hardcode_libdir_flag_spec_CXX='${wl}-R $wl$libdir' - case $host_os in - solaris2.[0-5] | solaris2.[0-5].*) ;; - *) - whole_archive_flag_spec_CXX='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract' - ;; - esac - fi - ;; - esac - ;; - - sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7* | sco3.2v5.0.[024]*) - no_undefined_flag_CXX='${wl}-z,text' - archive_cmds_need_lc_CXX=no - hardcode_shlibpath_var_CXX=no - runpath_var='LD_RUN_PATH' - - case $cc_basename in - CC*) - archive_cmds_CXX='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' - archive_expsym_cmds_CXX='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' - ;; - *) - archive_cmds_CXX='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' - archive_expsym_cmds_CXX='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' - ;; - esac - ;; - - sysv5* | sco3.2v5* | sco5v6*) - # Note: We can NOT use -z defs as we might desire, because we do not - # link with -lc, and that would cause any symbols used from libc to - # always be unresolved, which means just about no library would - # ever link correctly. If we're not using GNU ld we use -z text - # though, which does catch some bad symbols but isn't as heavy-handed - # as -z defs. - no_undefined_flag_CXX='${wl}-z,text' - allow_undefined_flag_CXX='${wl}-z,nodefs' - archive_cmds_need_lc_CXX=no - hardcode_shlibpath_var_CXX=no - hardcode_libdir_flag_spec_CXX='${wl}-R,$libdir' - hardcode_libdir_separator_CXX=':' - link_all_deplibs_CXX=yes - export_dynamic_flag_spec_CXX='${wl}-Bexport' - runpath_var='LD_RUN_PATH' - - case $cc_basename in - CC*) - archive_cmds_CXX='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' - archive_expsym_cmds_CXX='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' - old_archive_cmds_CXX='$CC -Tprelink_objects $oldobjs~ - '"$old_archive_cmds_CXX" - reload_cmds_CXX='$CC -Tprelink_objects $reload_objs~ - '"$reload_cmds_CXX" - ;; - *) - archive_cmds_CXX='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' - archive_expsym_cmds_CXX='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' - ;; - esac - ;; - - tandem*) - case $cc_basename in - NCC*) - # NonStop-UX NCC 3.20 - # FIXME: insert proper C++ library support - ld_shlibs_CXX=no - ;; - *) - # FIXME: insert proper C++ library support - ld_shlibs_CXX=no - ;; - esac - ;; - - vxworks*) - # FIXME: insert proper C++ library support - ld_shlibs_CXX=no - ;; - - *) - # FIXME: insert proper C++ library support - ld_shlibs_CXX=no - ;; - esac - - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ld_shlibs_CXX" >&5 -$as_echo "$ld_shlibs_CXX" >&6; } - test "$ld_shlibs_CXX" = no && can_build_shared=no - - GCC_CXX="$GXX" - LD_CXX="$LD" - - ## CAVEAT EMPTOR: - ## There is no encapsulation within the following macros, do not change - ## the running order or otherwise move them around unless you know exactly - ## what you are doing... - # Dependencies to place before and after the object being linked: -predep_objects_CXX= -postdep_objects_CXX= -predeps_CXX= -postdeps_CXX= -compiler_lib_search_path_CXX= - -cat > conftest.$ac_ext <<_LT_EOF -class Foo -{ -public: - Foo (void) { a = 0; } -private: - int a; -}; -_LT_EOF - - -_lt_libdeps_save_CFLAGS=$CFLAGS -case "$CC $CFLAGS " in #( -*\ -flto*\ *) CFLAGS="$CFLAGS -fno-lto" ;; -*\ -fwhopr*\ *) CFLAGS="$CFLAGS -fno-whopr" ;; -*\ -fuse-linker-plugin*\ *) CFLAGS="$CFLAGS -fno-use-linker-plugin" ;; -esac - -if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 - (eval $ac_compile) 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; }; then - # Parse the compiler output and extract the necessary - # objects, libraries and library flags. - - # Sentinel used to keep track of whether or not we are before - # the conftest object file. - pre_test_object_deps_done=no - - for p in `eval "$output_verbose_link_cmd"`; do - case ${prev}${p} in - - -L* | -R* | -l*) - # Some compilers place space between "-{L,R}" and the path. - # Remove the space. - if test $p = "-L" || - test $p = "-R"; then - prev=$p - continue - fi - - # Expand the sysroot to ease extracting the directories later. - if test -z "$prev"; then - case $p in - -L*) func_stripname_cnf '-L' '' "$p"; prev=-L; p=$func_stripname_result ;; - -R*) func_stripname_cnf '-R' '' "$p"; prev=-R; p=$func_stripname_result ;; - -l*) func_stripname_cnf '-l' '' "$p"; prev=-l; p=$func_stripname_result ;; - esac - fi - case $p in - =*) func_stripname_cnf '=' '' "$p"; p=$lt_sysroot$func_stripname_result ;; - esac - if test "$pre_test_object_deps_done" = no; then - case ${prev} in - -L | -R) - # Internal compiler library paths should come after those - # provided the user. The postdeps already come after the - # user supplied libs so there is no need to process them. - if test -z "$compiler_lib_search_path_CXX"; then - compiler_lib_search_path_CXX="${prev}${p}" - else - compiler_lib_search_path_CXX="${compiler_lib_search_path_CXX} ${prev}${p}" - fi - ;; - # The "-l" case would never come before the object being - # linked, so don't bother handling this case. - esac - else - if test -z "$postdeps_CXX"; then - postdeps_CXX="${prev}${p}" - else - postdeps_CXX="${postdeps_CXX} ${prev}${p}" - fi - fi - prev= - ;; - - *.lto.$objext) ;; # Ignore GCC LTO objects - *.$objext) - # This assumes that the test object file only shows up - # once in the compiler output. - if test "$p" = "conftest.$objext"; then - pre_test_object_deps_done=yes - continue - fi - - if test "$pre_test_object_deps_done" = no; then - if test -z "$predep_objects_CXX"; then - predep_objects_CXX="$p" - else - predep_objects_CXX="$predep_objects_CXX $p" - fi - else - if test -z "$postdep_objects_CXX"; then - postdep_objects_CXX="$p" - else - postdep_objects_CXX="$postdep_objects_CXX $p" - fi - fi - ;; - - *) ;; # Ignore the rest. - - esac - done - - # Clean up. - rm -f a.out a.exe -else - echo "libtool.m4: error: problem compiling CXX test program" -fi - -$RM -f confest.$objext -CFLAGS=$_lt_libdeps_save_CFLAGS - -# PORTME: override above test on systems where it is broken -case $host_os in -interix[3-9]*) - # Interix 3.5 installs completely hosed .la files for C++, so rather than - # hack all around it, let's just trust "g++" to DTRT. - predep_objects_CXX= - postdep_objects_CXX= - postdeps_CXX= - ;; - -linux*) - case `$CC -V 2>&1 | sed 5q` in - *Sun\ C*) - # Sun C++ 5.9 - - # The more standards-conforming stlport4 library is - # incompatible with the Cstd library. Avoid specifying - # it if it's in CXXFLAGS. Ignore libCrun as - # -library=stlport4 depends on it. - case " $CXX $CXXFLAGS " in - *" -library=stlport4 "*) - solaris_use_stlport4=yes - ;; - esac - - if test "$solaris_use_stlport4" != yes; then - postdeps_CXX='-library=Cstd -library=Crun' - fi - ;; - esac - ;; - -solaris*) - case $cc_basename in - CC* | sunCC*) - # The more standards-conforming stlport4 library is - # incompatible with the Cstd library. Avoid specifying - # it if it's in CXXFLAGS. Ignore libCrun as - # -library=stlport4 depends on it. - case " $CXX $CXXFLAGS " in - *" -library=stlport4 "*) - solaris_use_stlport4=yes - ;; - esac - - # Adding this requires a known-good setup of shared libraries for - # Sun compiler versions before 5.6, else PIC objects from an old - # archive will be linked into the output, leading to subtle bugs. - if test "$solaris_use_stlport4" != yes; then - postdeps_CXX='-library=Cstd -library=Crun' - fi - ;; - esac - ;; -esac - - -case " $postdeps_CXX " in -*" -lc "*) archive_cmds_need_lc_CXX=no ;; -esac - compiler_lib_search_dirs_CXX= -if test -n "${compiler_lib_search_path_CXX}"; then - compiler_lib_search_dirs_CXX=`echo " ${compiler_lib_search_path_CXX}" | ${SED} -e 's! -L! !g' -e 's!^ !!'` -fi - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - lt_prog_compiler_wl_CXX= -lt_prog_compiler_pic_CXX= -lt_prog_compiler_static_CXX= - - - # C++ specific cases for pic, static, wl, etc. - if test "$GXX" = yes; then - lt_prog_compiler_wl_CXX='-Wl,' - lt_prog_compiler_static_CXX='-static' - - case $host_os in - aix*) - # All AIX code is PIC. - if test "$host_cpu" = ia64; then - # AIX 5 now supports IA64 processor - lt_prog_compiler_static_CXX='-Bstatic' - fi - ;; - - amigaos*) - case $host_cpu in - powerpc) - # see comment about AmigaOS4 .so support - lt_prog_compiler_pic_CXX='-fPIC' - ;; - m68k) - # FIXME: we need at least 68020 code to build shared libraries, but - # adding the `-m68020' flag to GCC prevents building anything better, - # like `-m68040'. - lt_prog_compiler_pic_CXX='-m68020 -resident32 -malways-restore-a4' - ;; - esac - ;; - - beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) - # PIC is the default for these OSes. - ;; - mingw* | cygwin* | os2* | pw32* | cegcc*) - # This hack is so that the source file can tell whether it is being - # built for inclusion in a dll (and should export symbols for example). - # Although the cygwin gcc ignores -fPIC, still need this for old-style - # (--disable-auto-import) libraries - lt_prog_compiler_pic_CXX='-DDLL_EXPORT' - ;; - darwin* | rhapsody*) - # PIC is the default on this platform - # Common symbols not allowed in MH_DYLIB files - lt_prog_compiler_pic_CXX='-fno-common' - ;; - *djgpp*) - # DJGPP does not support shared libraries at all - lt_prog_compiler_pic_CXX= - ;; - haiku*) - # PIC is the default for Haiku. - # The "-static" flag exists, but is broken. - lt_prog_compiler_static_CXX= - ;; - interix[3-9]*) - # Interix 3.x gcc -fpic/-fPIC options generate broken code. - # Instead, we relocate shared libraries at runtime. - ;; - sysv4*MP*) - if test -d /usr/nec; then - lt_prog_compiler_pic_CXX=-Kconform_pic - fi - ;; - hpux*) - # PIC is the default for 64-bit PA HP-UX, but not for 32-bit - # PA HP-UX. On IA64 HP-UX, PIC is the default but the pic flag - # sets the default TLS model and affects inlining. - case $host_cpu in - hppa*64*) - ;; - *) - lt_prog_compiler_pic_CXX='-fPIC' - ;; - esac - ;; - *qnx* | *nto*) - # QNX uses GNU C++, but need to define -shared option too, otherwise - # it will coredump. - lt_prog_compiler_pic_CXX='-fPIC -shared' - ;; - *) - lt_prog_compiler_pic_CXX='-fPIC' - ;; - esac - else - case $host_os in - aix[4-9]*) - # All AIX code is PIC. - if test "$host_cpu" = ia64; then - # AIX 5 now supports IA64 processor - lt_prog_compiler_static_CXX='-Bstatic' - else - lt_prog_compiler_static_CXX='-bnso -bI:/lib/syscalls.exp' - fi - ;; - chorus*) - case $cc_basename in - cxch68*) - # Green Hills C++ Compiler - # _LT_TAGVAR(lt_prog_compiler_static, CXX)="--no_auto_instantiation -u __main -u __premain -u _abort -r $COOL_DIR/lib/libOrb.a $MVME_DIR/lib/CC/libC.a $MVME_DIR/lib/classix/libcx.s.a" - ;; - esac - ;; - mingw* | cygwin* | os2* | pw32* | cegcc*) - # This hack is so that the source file can tell whether it is being - # built for inclusion in a dll (and should export symbols for example). - lt_prog_compiler_pic_CXX='-DDLL_EXPORT' - ;; - dgux*) - case $cc_basename in - ec++*) - lt_prog_compiler_pic_CXX='-KPIC' - ;; - ghcx*) - # Green Hills C++ Compiler - lt_prog_compiler_pic_CXX='-pic' - ;; - *) - ;; - esac - ;; - freebsd* | dragonfly*) - # FreeBSD uses GNU C++ - ;; - hpux9* | hpux10* | hpux11*) - case $cc_basename in - CC*) - lt_prog_compiler_wl_CXX='-Wl,' - lt_prog_compiler_static_CXX='${wl}-a ${wl}archive' - if test "$host_cpu" != ia64; then - lt_prog_compiler_pic_CXX='+Z' - fi - ;; - aCC*) - lt_prog_compiler_wl_CXX='-Wl,' - lt_prog_compiler_static_CXX='${wl}-a ${wl}archive' - case $host_cpu in - hppa*64*|ia64*) - # +Z the default - ;; - *) - lt_prog_compiler_pic_CXX='+Z' - ;; - esac - ;; - *) - ;; - esac - ;; - interix*) - # This is c89, which is MS Visual C++ (no shared libs) - # Anyone wants to do a port? - ;; - irix5* | irix6* | nonstopux*) - case $cc_basename in - CC*) - lt_prog_compiler_wl_CXX='-Wl,' - lt_prog_compiler_static_CXX='-non_shared' - # CC pic flag -KPIC is the default. - ;; - *) - ;; - esac - ;; - linux* | k*bsd*-gnu | kopensolaris*-gnu) - case $cc_basename in - KCC*) - # KAI C++ Compiler - lt_prog_compiler_wl_CXX='--backend -Wl,' - lt_prog_compiler_pic_CXX='-fPIC' - ;; - ecpc* ) - # old Intel C++ for x86_64 which still supported -KPIC. - lt_prog_compiler_wl_CXX='-Wl,' - lt_prog_compiler_pic_CXX='-KPIC' - lt_prog_compiler_static_CXX='-static' - ;; - icpc* ) - # Intel C++, used to be incompatible with GCC. - # ICC 10 doesn't accept -KPIC any more. - lt_prog_compiler_wl_CXX='-Wl,' - lt_prog_compiler_pic_CXX='-fPIC' - lt_prog_compiler_static_CXX='-static' - ;; - pgCC* | pgcpp*) - # Portland Group C++ compiler - lt_prog_compiler_wl_CXX='-Wl,' - lt_prog_compiler_pic_CXX='-fpic' - lt_prog_compiler_static_CXX='-Bstatic' - ;; - cxx*) - # Compaq C++ - # Make sure the PIC flag is empty. It appears that all Alpha - # Linux and Compaq Tru64 Unix objects are PIC. - lt_prog_compiler_pic_CXX= - lt_prog_compiler_static_CXX='-non_shared' - ;; - xlc* | xlC* | bgxl[cC]* | mpixl[cC]*) - # IBM XL 8.0, 9.0 on PPC and BlueGene - lt_prog_compiler_wl_CXX='-Wl,' - lt_prog_compiler_pic_CXX='-qpic' - lt_prog_compiler_static_CXX='-qstaticlink' - ;; - *) - case `$CC -V 2>&1 | sed 5q` in - *Sun\ C*) - # Sun C++ 5.9 - lt_prog_compiler_pic_CXX='-KPIC' - lt_prog_compiler_static_CXX='-Bstatic' - lt_prog_compiler_wl_CXX='-Qoption ld ' - ;; - esac - ;; - esac - ;; - lynxos*) - ;; - m88k*) - ;; - mvs*) - case $cc_basename in - cxx*) - lt_prog_compiler_pic_CXX='-W c,exportall' - ;; - *) - ;; - esac - ;; - netbsd* | netbsdelf*-gnu) - ;; - *qnx* | *nto*) - # QNX uses GNU C++, but need to define -shared option too, otherwise - # it will coredump. - lt_prog_compiler_pic_CXX='-fPIC -shared' - ;; - osf3* | osf4* | osf5*) - case $cc_basename in - KCC*) - lt_prog_compiler_wl_CXX='--backend -Wl,' - ;; - RCC*) - # Rational C++ 2.4.1 - lt_prog_compiler_pic_CXX='-pic' - ;; - cxx*) - # Digital/Compaq C++ - lt_prog_compiler_wl_CXX='-Wl,' - # Make sure the PIC flag is empty. It appears that all Alpha - # Linux and Compaq Tru64 Unix objects are PIC. - lt_prog_compiler_pic_CXX= - lt_prog_compiler_static_CXX='-non_shared' - ;; - *) - ;; - esac - ;; - psos*) - ;; - solaris*) - case $cc_basename in - CC* | sunCC*) - # Sun C++ 4.2, 5.x and Centerline C++ - lt_prog_compiler_pic_CXX='-KPIC' - lt_prog_compiler_static_CXX='-Bstatic' - lt_prog_compiler_wl_CXX='-Qoption ld ' - ;; - gcx*) - # Green Hills C++ Compiler - lt_prog_compiler_pic_CXX='-PIC' - ;; - *) - ;; - esac - ;; - sunos4*) - case $cc_basename in - CC*) - # Sun C++ 4.x - lt_prog_compiler_pic_CXX='-pic' - lt_prog_compiler_static_CXX='-Bstatic' - ;; - lcc*) - # Lucid - lt_prog_compiler_pic_CXX='-pic' - ;; - *) - ;; - esac - ;; - sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) - case $cc_basename in - CC*) - lt_prog_compiler_wl_CXX='-Wl,' - lt_prog_compiler_pic_CXX='-KPIC' - lt_prog_compiler_static_CXX='-Bstatic' - ;; - esac - ;; - tandem*) - case $cc_basename in - NCC*) - # NonStop-UX NCC 3.20 - lt_prog_compiler_pic_CXX='-KPIC' - ;; - *) - ;; - esac - ;; - vxworks*) - ;; - *) - lt_prog_compiler_can_build_shared_CXX=no - ;; - esac - fi - -case $host_os in - # For platforms which do not support PIC, -DPIC is meaningless: - *djgpp*) - lt_prog_compiler_pic_CXX= - ;; - *) - lt_prog_compiler_pic_CXX="$lt_prog_compiler_pic_CXX@&t@ -DPIC" - ;; -esac - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $compiler option to produce PIC" >&5 -$as_echo_n "checking for $compiler option to produce PIC... " >&6; } -if ${lt_cv_prog_compiler_pic_CXX+:} false; then : - $as_echo_n "(cached) " >&6 -else - lt_cv_prog_compiler_pic_CXX=$lt_prog_compiler_pic_CXX -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic_CXX" >&5 -$as_echo "$lt_cv_prog_compiler_pic_CXX" >&6; } -lt_prog_compiler_pic_CXX=$lt_cv_prog_compiler_pic_CXX - -# -# Check to make sure the PIC flag actually works. -# -if test -n "$lt_prog_compiler_pic_CXX"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler PIC flag $lt_prog_compiler_pic_CXX works" >&5 -$as_echo_n "checking if $compiler PIC flag $lt_prog_compiler_pic_CXX works... " >&6; } -if ${lt_cv_prog_compiler_pic_works_CXX+:} false; then : - $as_echo_n "(cached) " >&6 -else - lt_cv_prog_compiler_pic_works_CXX=no - ac_outfile=conftest.$ac_objext - echo "$lt_simple_compile_test_code" > conftest.$ac_ext - lt_compiler_flag="$lt_prog_compiler_pic_CXX@&t@ -DPIC" - # Insert the option either (1) after the last *FLAGS variable, or - # (2) before a word containing "conftest.", or (3) at the end. - # Note that $ac_compile itself does not contain backslashes and begins - # with a dollar sign (not a hyphen), so the echo should work correctly. - # The option is referenced via a variable to avoid confusing sed. - lt_compile=`echo "$ac_compile" | $SED \ - -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ - -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ - -e 's:$: $lt_compiler_flag:'` - (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) - (eval "$lt_compile" 2>conftest.err) - ac_status=$? - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - if (exit $ac_status) && test -s "$ac_outfile"; then - # The compiler can only warn and ignore the option if not recognized - # So say no if there are warnings other than the usual output. - $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp - $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 - if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then - lt_cv_prog_compiler_pic_works_CXX=yes - fi - fi - $RM conftest* - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic_works_CXX" >&5 -$as_echo "$lt_cv_prog_compiler_pic_works_CXX" >&6; } - -if test x"$lt_cv_prog_compiler_pic_works_CXX" = xyes; then - case $lt_prog_compiler_pic_CXX in - "" | " "*) ;; - *) lt_prog_compiler_pic_CXX=" $lt_prog_compiler_pic_CXX" ;; - esac -else - lt_prog_compiler_pic_CXX= - lt_prog_compiler_can_build_shared_CXX=no -fi - -fi - - - - - -# -# Check to make sure the static flag actually works. -# -wl=$lt_prog_compiler_wl_CXX eval lt_tmp_static_flag=\"$lt_prog_compiler_static_CXX\" -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler static flag $lt_tmp_static_flag works" >&5 -$as_echo_n "checking if $compiler static flag $lt_tmp_static_flag works... " >&6; } -if ${lt_cv_prog_compiler_static_works_CXX+:} false; then : - $as_echo_n "(cached) " >&6 -else - lt_cv_prog_compiler_static_works_CXX=no - save_LDFLAGS="$LDFLAGS" - LDFLAGS="$LDFLAGS $lt_tmp_static_flag" - echo "$lt_simple_link_test_code" > conftest.$ac_ext - if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then - # The linker can only warn and ignore the option if not recognized - # So say no if there are warnings - if test -s conftest.err; then - # Append any errors to the config.log. - cat conftest.err 1>&5 - $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp - $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 - if diff conftest.exp conftest.er2 >/dev/null; then - lt_cv_prog_compiler_static_works_CXX=yes - fi - else - lt_cv_prog_compiler_static_works_CXX=yes - fi - fi - $RM -r conftest* - LDFLAGS="$save_LDFLAGS" - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_static_works_CXX" >&5 -$as_echo "$lt_cv_prog_compiler_static_works_CXX" >&6; } - -if test x"$lt_cv_prog_compiler_static_works_CXX" = xyes; then - : -else - lt_prog_compiler_static_CXX= -fi - - - - - { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5 -$as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; } -if ${lt_cv_prog_compiler_c_o_CXX+:} false; then : - $as_echo_n "(cached) " >&6 -else - lt_cv_prog_compiler_c_o_CXX=no - $RM -r conftest 2>/dev/null - mkdir conftest - cd conftest - mkdir out - echo "$lt_simple_compile_test_code" > conftest.$ac_ext - - lt_compiler_flag="-o out/conftest2.$ac_objext" - # Insert the option either (1) after the last *FLAGS variable, or - # (2) before a word containing "conftest.", or (3) at the end. - # Note that $ac_compile itself does not contain backslashes and begins - # with a dollar sign (not a hyphen), so the echo should work correctly. - lt_compile=`echo "$ac_compile" | $SED \ - -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ - -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ - -e 's:$: $lt_compiler_flag:'` - (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) - (eval "$lt_compile" 2>out/conftest.err) - ac_status=$? - cat out/conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - if (exit $ac_status) && test -s out/conftest2.$ac_objext - then - # The compiler can only warn and ignore the option if not recognized - # So say no if there are warnings - $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp - $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 - if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then - lt_cv_prog_compiler_c_o_CXX=yes - fi - fi - chmod u+w . 2>&5 - $RM conftest* - # SGI C++ compiler will create directory out/ii_files/ for - # template instantiation - test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files - $RM out/* && rmdir out - cd .. - $RM -r conftest - $RM conftest* - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o_CXX" >&5 -$as_echo "$lt_cv_prog_compiler_c_o_CXX" >&6; } - - - - { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5 -$as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; } -if ${lt_cv_prog_compiler_c_o_CXX+:} false; then : - $as_echo_n "(cached) " >&6 -else - lt_cv_prog_compiler_c_o_CXX=no - $RM -r conftest 2>/dev/null - mkdir conftest - cd conftest - mkdir out - echo "$lt_simple_compile_test_code" > conftest.$ac_ext - - lt_compiler_flag="-o out/conftest2.$ac_objext" - # Insert the option either (1) after the last *FLAGS variable, or - # (2) before a word containing "conftest.", or (3) at the end. - # Note that $ac_compile itself does not contain backslashes and begins - # with a dollar sign (not a hyphen), so the echo should work correctly. - lt_compile=`echo "$ac_compile" | $SED \ - -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ - -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ - -e 's:$: $lt_compiler_flag:'` - (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) - (eval "$lt_compile" 2>out/conftest.err) - ac_status=$? - cat out/conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - if (exit $ac_status) && test -s out/conftest2.$ac_objext - then - # The compiler can only warn and ignore the option if not recognized - # So say no if there are warnings - $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp - $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 - if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then - lt_cv_prog_compiler_c_o_CXX=yes - fi - fi - chmod u+w . 2>&5 - $RM conftest* - # SGI C++ compiler will create directory out/ii_files/ for - # template instantiation - test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files - $RM out/* && rmdir out - cd .. - $RM -r conftest - $RM conftest* - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o_CXX" >&5 -$as_echo "$lt_cv_prog_compiler_c_o_CXX" >&6; } - - - - -hard_links="nottested" -if test "$lt_cv_prog_compiler_c_o_CXX" = no && test "$need_locks" != no; then - # do not overwrite the value of need_locks provided by the user - { $as_echo "$as_me:${as_lineno-$LINENO}: checking if we can lock with hard links" >&5 -$as_echo_n "checking if we can lock with hard links... " >&6; } - hard_links=yes - $RM conftest* - ln conftest.a conftest.b 2>/dev/null && hard_links=no - touch conftest.a - ln conftest.a conftest.b 2>&5 || hard_links=no - ln conftest.a conftest.b 2>/dev/null && hard_links=no - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $hard_links" >&5 -$as_echo "$hard_links" >&6; } - if test "$hard_links" = no; then - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&5 -$as_echo "$as_me: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&2;} - need_locks=warn - fi -else - need_locks=no -fi - - - - { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $compiler linker ($LD) supports shared libraries" >&5 -$as_echo_n "checking whether the $compiler linker ($LD) supports shared libraries... " >&6; } - - export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' - exclude_expsyms_CXX='_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*' - case $host_os in - aix[4-9]*) - # If we're using GNU nm, then we don't want the "-C" option. - # -C means demangle to AIX nm, but means don't demangle with GNU nm - # Also, AIX nm treats weak defined symbols like other global defined - # symbols, whereas GNU nm marks them as "W". - if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then - export_symbols_cmds_CXX='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && (substr(\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' - else - export_symbols_cmds_CXX='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && (substr(\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' - fi - ;; - pw32*) - export_symbols_cmds_CXX="$ltdll_cmds" - ;; - cygwin* | mingw* | cegcc*) - case $cc_basename in - cl*) - exclude_expsyms_CXX='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*' - ;; - *) - export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1 DATA/;s/^.*[ ]__nm__\([^ ]*\)[ ][^ ]*/\1 DATA/;/^I[ ]/d;/^[AITW][ ]/s/.* //'\'' | sort | uniq > $export_symbols' - exclude_expsyms_CXX='[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname' - ;; - esac - ;; - linux* | k*bsd*-gnu | gnu*) - link_all_deplibs_CXX=no - ;; - *) - export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' - ;; - esac - -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ld_shlibs_CXX" >&5 -$as_echo "$ld_shlibs_CXX" >&6; } -test "$ld_shlibs_CXX" = no && can_build_shared=no - -with_gnu_ld_CXX=$with_gnu_ld - - - - - - -# -# Do we need to explicitly link libc? -# -case "x$archive_cmds_need_lc_CXX" in -x|xyes) - # Assume -lc should be added - archive_cmds_need_lc_CXX=yes - - if test "$enable_shared" = yes && test "$GCC" = yes; then - case $archive_cmds_CXX in - *'~'*) - # FIXME: we may have to deal with multi-command sequences. - ;; - '$CC '*) - # Test whether the compiler implicitly links with -lc since on some - # systems, -lgcc has to come before -lc. If gcc already passes -lc - # to ld, don't add -lc before -lgcc. - { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether -lc should be explicitly linked in" >&5 -$as_echo_n "checking whether -lc should be explicitly linked in... " >&6; } -if ${lt_cv_archive_cmds_need_lc_CXX+:} false; then : - $as_echo_n "(cached) " >&6 -else - $RM conftest* - echo "$lt_simple_compile_test_code" > conftest.$ac_ext - - if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 - (eval $ac_compile) 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } 2>conftest.err; then - soname=conftest - lib=conftest - libobjs=conftest.$ac_objext - deplibs= - wl=$lt_prog_compiler_wl_CXX - pic_flag=$lt_prog_compiler_pic_CXX - compiler_flags=-v - linker_flags=-v - verstring= - output_objdir=. - libname=conftest - lt_save_allow_undefined_flag=$allow_undefined_flag_CXX - allow_undefined_flag_CXX= - if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$archive_cmds_CXX 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1\""; } >&5 - (eval $archive_cmds_CXX 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1) 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } - then - lt_cv_archive_cmds_need_lc_CXX=no - else - lt_cv_archive_cmds_need_lc_CXX=yes - fi - allow_undefined_flag_CXX=$lt_save_allow_undefined_flag - else - cat conftest.err 1>&5 - fi - $RM conftest* - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_archive_cmds_need_lc_CXX" >&5 -$as_echo "$lt_cv_archive_cmds_need_lc_CXX" >&6; } - archive_cmds_need_lc_CXX=$lt_cv_archive_cmds_need_lc_CXX - ;; - esac - fi - ;; -esac - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - { $as_echo "$as_me:${as_lineno-$LINENO}: checking dynamic linker characteristics" >&5 -$as_echo_n "checking dynamic linker characteristics... " >&6; } - -library_names_spec= -libname_spec='lib$name' -soname_spec= -shrext_cmds=".so" -postinstall_cmds= -postuninstall_cmds= -finish_cmds= -finish_eval= -shlibpath_var= -shlibpath_overrides_runpath=unknown -version_type=none -dynamic_linker="$host_os ld.so" -sys_lib_dlsearch_path_spec="/lib /usr/lib" -need_lib_prefix=unknown -hardcode_into_libs=no - -# when you set need_version to no, make sure it does not cause -set_version -# flags to be left without arguments -need_version=unknown - -case $host_os in -aix3*) - version_type=linux # correct to gnu/linux during the next big refactor - library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a' - shlibpath_var=LIBPATH - - # AIX 3 has no versioning support, so we append a major version to the name. - soname_spec='${libname}${release}${shared_ext}$major' - ;; - -aix[4-9]*) - version_type=linux # correct to gnu/linux during the next big refactor - need_lib_prefix=no - need_version=no - hardcode_into_libs=yes - if test "$host_cpu" = ia64; then - # AIX 5 supports IA64 - library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}' - shlibpath_var=LD_LIBRARY_PATH - else - # With GCC up to 2.95.x, collect2 would create an import file - # for dependence libraries. The import file would start with - # the line `#! .'. This would cause the generated library to - # depend on `.', always an invalid library. This was fixed in - # development snapshots of GCC prior to 3.0. - case $host_os in - aix4 | aix4.[01] | aix4.[01].*) - if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)' - echo ' yes ' - echo '#endif'; } | ${CC} -E - | $GREP yes > /dev/null; then - : - else - can_build_shared=no - fi - ;; - esac - # AIX (on Power*) has no versioning support, so currently we can not hardcode correct - # soname into executable. Probably we can add versioning support to - # collect2, so additional links can be useful in future. - if test "$aix_use_runtimelinking" = yes; then - # If using run time linking (on AIX 4.2 or later) use lib.so - # instead of lib.a to let people know that these are not - # typical AIX shared libraries. - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - else - # We preserve .a as extension for shared libraries through AIX4.2 - # and later when we are not doing run time linking. - library_names_spec='${libname}${release}.a $libname.a' - soname_spec='${libname}${release}${shared_ext}$major' - fi - shlibpath_var=LIBPATH - fi - ;; - -amigaos*) - case $host_cpu in - powerpc) - # Since July 2007 AmigaOS4 officially supports .so libraries. - # When compiling the executable, add -use-dynld -Lsobjs: to the compileline. - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - ;; - m68k) - library_names_spec='$libname.ixlibrary $libname.a' - # Create ${libname}_ixlibrary.a entries in /sys/libs. - finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`func_echo_all "$lib" | $SED '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; test $RM /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done' - ;; - esac - ;; - -beos*) - library_names_spec='${libname}${shared_ext}' - dynamic_linker="$host_os ld.so" - shlibpath_var=LIBRARY_PATH - ;; - -bsdi[45]*) - version_type=linux # correct to gnu/linux during the next big refactor - need_version=no - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir' - shlibpath_var=LD_LIBRARY_PATH - sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib" - sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib" - # the default ld.so.conf also contains /usr/contrib/lib and - # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow - # libtool to hard-code these into programs - ;; - -cygwin* | mingw* | pw32* | cegcc*) - version_type=windows - shrext_cmds=".dll" - need_version=no - need_lib_prefix=no - - case $GCC,$cc_basename in - yes,*) - # gcc - library_names_spec='$libname.dll.a' - # DLL is installed to $(libdir)/../bin by postinstall_cmds - postinstall_cmds='base_file=`basename \${file}`~ - dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~ - dldir=$destdir/`dirname \$dlpath`~ - test -d \$dldir || mkdir -p \$dldir~ - $install_prog $dir/$dlname \$dldir/$dlname~ - chmod a+x \$dldir/$dlname~ - if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then - eval '\''$striplib \$dldir/$dlname'\'' || exit \$?; - fi' - postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ - dlpath=$dir/\$dldll~ - $RM \$dlpath' - shlibpath_overrides_runpath=yes - - case $host_os in - cygwin*) - # Cygwin DLLs use 'cyg' prefix rather than 'lib' - soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' - - ;; - mingw* | cegcc*) - # MinGW DLLs use traditional 'lib' prefix - soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' - ;; - pw32*) - # pw32 DLLs use 'pw' prefix rather than 'lib' - library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' - ;; - esac - dynamic_linker='Win32 ld.exe' - ;; - - *,cl*) - # Native MSVC - libname_spec='$name' - soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' - library_names_spec='${libname}.dll.lib' - - case $build_os in - mingw*) - sys_lib_search_path_spec= - lt_save_ifs=$IFS - IFS=';' - for lt_path in $LIB - do - IFS=$lt_save_ifs - # Let DOS variable expansion print the short 8.3 style file name. - lt_path=`cd "$lt_path" 2>/dev/null && cmd //C "for %i in (".") do @echo %~si"` - sys_lib_search_path_spec="$sys_lib_search_path_spec $lt_path" - done - IFS=$lt_save_ifs - # Convert to MSYS style. - sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | sed -e 's|\\\\|/|g' -e 's| \\([a-zA-Z]\\):| /\\1|g' -e 's|^ ||'` - ;; - cygwin*) - # Convert to unix form, then to dos form, then back to unix form - # but this time dos style (no spaces!) so that the unix form looks - # like /cygdrive/c/PROGRA~1:/cygdr... - sys_lib_search_path_spec=`cygpath --path --unix "$LIB"` - sys_lib_search_path_spec=`cygpath --path --dos "$sys_lib_search_path_spec" 2>/dev/null` - sys_lib_search_path_spec=`cygpath --path --unix "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` - ;; - *) - sys_lib_search_path_spec="$LIB" - if $ECHO "$sys_lib_search_path_spec" | $GREP ';[c-zC-Z]:/' >/dev/null; then - # It is most probably a Windows format PATH. - sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` - else - sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` - fi - # FIXME: find the short name or the path components, as spaces are - # common. (e.g. "Program Files" -> "PROGRA~1") - ;; - esac - - # DLL is installed to $(libdir)/../bin by postinstall_cmds - postinstall_cmds='base_file=`basename \${file}`~ - dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~ - dldir=$destdir/`dirname \$dlpath`~ - test -d \$dldir || mkdir -p \$dldir~ - $install_prog $dir/$dlname \$dldir/$dlname' - postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ - dlpath=$dir/\$dldll~ - $RM \$dlpath' - shlibpath_overrides_runpath=yes - dynamic_linker='Win32 link.exe' - ;; - - *) - # Assume MSVC wrapper - library_names_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext} $libname.lib' - dynamic_linker='Win32 ld.exe' - ;; - esac - # FIXME: first we should search . and the directory the executable is in - shlibpath_var=PATH - ;; - -darwin* | rhapsody*) - dynamic_linker="$host_os dyld" - version_type=darwin - need_lib_prefix=no - need_version=no - library_names_spec='${libname}${release}${major}$shared_ext ${libname}$shared_ext' - soname_spec='${libname}${release}${major}$shared_ext' - shlibpath_overrides_runpath=yes - shlibpath_var=DYLD_LIBRARY_PATH - shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`' - - sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib' - ;; - -dgux*) - version_type=linux # correct to gnu/linux during the next big refactor - need_lib_prefix=no - need_version=no - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext' - soname_spec='${libname}${release}${shared_ext}$major' - shlibpath_var=LD_LIBRARY_PATH - ;; - -freebsd* | dragonfly*) - # DragonFly does not have aout. When/if they implement a new - # versioning mechanism, adjust this. - if test -x /usr/bin/objformat; then - objformat=`/usr/bin/objformat` - else - case $host_os in - freebsd[23].*) objformat=aout ;; - *) objformat=elf ;; - esac - fi - version_type=freebsd-$objformat - case $version_type in - freebsd-elf*) - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' - need_version=no - need_lib_prefix=no - ;; - freebsd-*) - library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix' - need_version=yes - ;; - esac - shlibpath_var=LD_LIBRARY_PATH - case $host_os in - freebsd2.*) - shlibpath_overrides_runpath=yes - ;; - freebsd3.[01]* | freebsdelf3.[01]*) - shlibpath_overrides_runpath=yes - hardcode_into_libs=yes - ;; - freebsd3.[2-9]* | freebsdelf3.[2-9]* | \ - freebsd4.[0-5] | freebsdelf4.[0-5] | freebsd4.1.1 | freebsdelf4.1.1) - shlibpath_overrides_runpath=no - hardcode_into_libs=yes - ;; - *) # from 4.6 on, and DragonFly - shlibpath_overrides_runpath=yes - hardcode_into_libs=yes - ;; - esac - ;; - -gnu*) - version_type=linux # correct to gnu/linux during the next big refactor - need_lib_prefix=no - need_version=no - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=no - hardcode_into_libs=yes - ;; - -haiku*) - version_type=linux # correct to gnu/linux during the next big refactor - need_lib_prefix=no - need_version=no - dynamic_linker="$host_os runtime_loader" - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - shlibpath_var=LIBRARY_PATH - shlibpath_overrides_runpath=yes - sys_lib_dlsearch_path_spec='/boot/home/config/lib /boot/common/lib /boot/system/lib' - hardcode_into_libs=yes - ;; - -hpux9* | hpux10* | hpux11*) - # Give a soname corresponding to the major version so that dld.sl refuses to - # link against other versions. - version_type=sunos - need_lib_prefix=no - need_version=no - case $host_cpu in - ia64*) - shrext_cmds='.so' - hardcode_into_libs=yes - dynamic_linker="$host_os dld.so" - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - if test "X$HPUX_IA64_MODE" = X32; then - sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib" - else - sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64" - fi - sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec - ;; - hppa*64*) - shrext_cmds='.sl' - hardcode_into_libs=yes - dynamic_linker="$host_os dld.sl" - shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH - shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64" - sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec - ;; - *) - shrext_cmds='.sl' - dynamic_linker="$host_os dld.sl" - shlibpath_var=SHLIB_PATH - shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - ;; - esac - # HP-UX runs *really* slowly unless shared libraries are mode 555, ... - postinstall_cmds='chmod 555 $lib' - # or fails outright, so override atomically: - install_override_mode=555 - ;; - -interix[3-9]*) - version_type=linux # correct to gnu/linux during the next big refactor - need_lib_prefix=no - need_version=no - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)' - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=no - hardcode_into_libs=yes - ;; - -irix5* | irix6* | nonstopux*) - case $host_os in - nonstopux*) version_type=nonstopux ;; - *) - if test "$lt_cv_prog_gnu_ld" = yes; then - version_type=linux # correct to gnu/linux during the next big refactor - else - version_type=irix - fi ;; - esac - need_lib_prefix=no - need_version=no - soname_spec='${libname}${release}${shared_ext}$major' - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}' - case $host_os in - irix5* | nonstopux*) - libsuff= shlibsuff= - ;; - *) - case $LD in # libtool.m4 will add one of these switches to LD - *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") - libsuff= shlibsuff= libmagic=32-bit;; - *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") - libsuff=32 shlibsuff=N32 libmagic=N32;; - *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") - libsuff=64 shlibsuff=64 libmagic=64-bit;; - *) libsuff= shlibsuff= libmagic=never-match;; - esac - ;; - esac - shlibpath_var=LD_LIBRARY${shlibsuff}_PATH - shlibpath_overrides_runpath=no - sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}" - sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}" - hardcode_into_libs=yes - ;; - -# No shared lib support for Linux oldld, aout, or coff. -linux*oldld* | linux*aout* | linux*coff*) - dynamic_linker=no - ;; - -# This must be glibc/ELF. -linux* | k*bsd*-gnu | kopensolaris*-gnu) - version_type=linux # correct to gnu/linux during the next big refactor - need_lib_prefix=no - need_version=no - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=no - - # Some binutils ld are patched to set DT_RUNPATH - if ${lt_cv_shlibpath_overrides_runpath+:} false; then : - $as_echo_n "(cached) " >&6 -else - lt_cv_shlibpath_overrides_runpath=no - save_LDFLAGS=$LDFLAGS - save_libdir=$libdir - eval "libdir=/foo; wl=\"$lt_prog_compiler_wl_CXX\"; \ - LDFLAGS=\"\$LDFLAGS $hardcode_libdir_flag_spec_CXX\"" - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -int -main () -{ - - ; - return 0; -} -_ACEOF -if ac_fn_cxx_try_link "$LINENO"; then : - if ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir" >/dev/null; then : - lt_cv_shlibpath_overrides_runpath=yes -fi -fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext - LDFLAGS=$save_LDFLAGS - libdir=$save_libdir - -fi - - shlibpath_overrides_runpath=$lt_cv_shlibpath_overrides_runpath - - # This implies no fast_install, which is unacceptable. - # Some rework will be needed to allow for fast_install - # before this can be enabled. - hardcode_into_libs=yes - - # Append ld.so.conf contents to the search path - if test -f /etc/ld.so.conf; then - lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \$2)); skip = 1; } { if (!skip) print \$0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[ ]*hwcap[ ]/d;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;s/"//g;/^$/d' | tr '\n' ' '` - sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra" - fi - - # We used to test for /lib/ld.so.1 and disable shared libraries on - # powerpc, because MkLinux only supported shared libraries with the - # GNU dynamic linker. Since this was broken with cross compilers, - # most powerpc-linux boxes support dynamic linking these days and - # people can always --disable-shared, the test was removed, and we - # assume the GNU/Linux dynamic linker is in use. - dynamic_linker='GNU/Linux ld.so' - ;; - -netbsdelf*-gnu) - version_type=linux - need_lib_prefix=no - need_version=no - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=no - hardcode_into_libs=yes - dynamic_linker='NetBSD ld.elf_so' - ;; - -netbsd*) - version_type=sunos - need_lib_prefix=no - need_version=no - if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' - finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' - dynamic_linker='NetBSD (a.out) ld.so' - else - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - dynamic_linker='NetBSD ld.elf_so' - fi - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=yes - hardcode_into_libs=yes - ;; - -newsos6) - version_type=linux # correct to gnu/linux during the next big refactor - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=yes - ;; - -*nto* | *qnx*) - version_type=qnx - need_lib_prefix=no - need_version=no - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=no - hardcode_into_libs=yes - dynamic_linker='ldqnx.so' - ;; - -openbsd*) - version_type=sunos - sys_lib_dlsearch_path_spec="/usr/lib" - need_lib_prefix=no - # Some older versions of OpenBSD (3.3 at least) *do* need versioned libs. - case $host_os in - openbsd3.3 | openbsd3.3.*) need_version=yes ;; - *) need_version=no ;; - esac - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' - finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' - shlibpath_var=LD_LIBRARY_PATH - if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then - case $host_os in - openbsd2.[89] | openbsd2.[89].*) - shlibpath_overrides_runpath=no - ;; - *) - shlibpath_overrides_runpath=yes - ;; - esac - else - shlibpath_overrides_runpath=yes - fi - ;; - -os2*) - libname_spec='$name' - shrext_cmds=".dll" - need_lib_prefix=no - library_names_spec='$libname${shared_ext} $libname.a' - dynamic_linker='OS/2 ld.exe' - shlibpath_var=LIBPATH - ;; - -osf3* | osf4* | osf5*) - version_type=osf - need_lib_prefix=no - need_version=no - soname_spec='${libname}${release}${shared_ext}$major' - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - shlibpath_var=LD_LIBRARY_PATH - sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib" - sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec" - ;; - -rdos*) - dynamic_linker=no - ;; - -solaris*) - version_type=linux # correct to gnu/linux during the next big refactor - need_lib_prefix=no - need_version=no - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=yes - hardcode_into_libs=yes - # ldd complains unless libraries are executable - postinstall_cmds='chmod +x $lib' - ;; - -sunos4*) - version_type=sunos - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' - finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir' - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=yes - if test "$with_gnu_ld" = yes; then - need_lib_prefix=no - fi - need_version=yes - ;; - -sysv4 | sysv4.3*) - version_type=linux # correct to gnu/linux during the next big refactor - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - shlibpath_var=LD_LIBRARY_PATH - case $host_vendor in - sni) - shlibpath_overrides_runpath=no - need_lib_prefix=no - runpath_var=LD_RUN_PATH - ;; - siemens) - need_lib_prefix=no - ;; - motorola) - need_lib_prefix=no - need_version=no - shlibpath_overrides_runpath=no - sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib' - ;; - esac - ;; - -sysv4*MP*) - if test -d /usr/nec ;then - version_type=linux # correct to gnu/linux during the next big refactor - library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}' - soname_spec='$libname${shared_ext}.$major' - shlibpath_var=LD_LIBRARY_PATH - fi - ;; - -sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) - version_type=freebsd-elf - need_lib_prefix=no - need_version=no - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=yes - hardcode_into_libs=yes - if test "$with_gnu_ld" = yes; then - sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib' - else - sys_lib_search_path_spec='/usr/ccs/lib /usr/lib' - case $host_os in - sco3.2v5*) - sys_lib_search_path_spec="$sys_lib_search_path_spec /lib" - ;; - esac - fi - sys_lib_dlsearch_path_spec='/usr/lib' - ;; - -tpf*) - # TPF is a cross-target only. Preferred cross-host = GNU/Linux. - version_type=linux # correct to gnu/linux during the next big refactor - need_lib_prefix=no - need_version=no - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=no - hardcode_into_libs=yes - ;; - -uts4*) - version_type=linux # correct to gnu/linux during the next big refactor - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - shlibpath_var=LD_LIBRARY_PATH - ;; - -*) - dynamic_linker=no - ;; -esac -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $dynamic_linker" >&5 -$as_echo "$dynamic_linker" >&6; } -test "$dynamic_linker" = no && can_build_shared=no - -variables_saved_for_relink="PATH $shlibpath_var $runpath_var" -if test "$GCC" = yes; then - variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" -fi - -if test "${lt_cv_sys_lib_search_path_spec+set}" = set; then - sys_lib_search_path_spec="$lt_cv_sys_lib_search_path_spec" -fi -if test "${lt_cv_sys_lib_dlsearch_path_spec+set}" = set; then - sys_lib_dlsearch_path_spec="$lt_cv_sys_lib_dlsearch_path_spec" -fi - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to hardcode library paths into programs" >&5 -$as_echo_n "checking how to hardcode library paths into programs... " >&6; } -hardcode_action_CXX= -if test -n "$hardcode_libdir_flag_spec_CXX" || - test -n "$runpath_var_CXX" || - test "X$hardcode_automatic_CXX" = "Xyes" ; then - - # We can hardcode non-existent directories. - if test "$hardcode_direct_CXX" != no && - # If the only mechanism to avoid hardcoding is shlibpath_var, we - # have to relink, otherwise we might link with an installed library - # when we should be linking with a yet-to-be-installed one - ## test "$_LT_TAGVAR(hardcode_shlibpath_var, CXX)" != no && - test "$hardcode_minus_L_CXX" != no; then - # Linking always hardcodes the temporary library directory. - hardcode_action_CXX=relink - else - # We can link without hardcoding, and we can hardcode nonexisting dirs. - hardcode_action_CXX=immediate - fi -else - # We cannot hardcode anything, or else we can only hardcode existing - # directories. - hardcode_action_CXX=unsupported -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $hardcode_action_CXX" >&5 -$as_echo "$hardcode_action_CXX" >&6; } - -if test "$hardcode_action_CXX" = relink || - test "$inherit_rpath_CXX" = yes; then - # Fast installation is not supported - enable_fast_install=no -elif test "$shlibpath_overrides_runpath" = yes || - test "$enable_shared" = no; then - # Fast installation is not necessary - enable_fast_install=needless -fi - - - - - - - - fi # test -n "$compiler" - - CC=$lt_save_CC - CFLAGS=$lt_save_CFLAGS - LDCXX=$LD - LD=$lt_save_LD - GCC=$lt_save_GCC - with_gnu_ld=$lt_save_with_gnu_ld - lt_cv_path_LDCXX=$lt_cv_path_LD - lt_cv_path_LD=$lt_save_path_LD - lt_cv_prog_gnu_ldcxx=$lt_cv_prog_gnu_ld - lt_cv_prog_gnu_ld=$lt_save_with_gnu_ld -fi # test "$_lt_caught_CXX_error" != yes - -ac_ext=c -ac_cpp='$CPP $CPPFLAGS' -ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_c_compiler_gnu - - - - - - - - - - - - - - - - ac_config_commands="$ac_config_commands libtool" - - - - -# Only expand once: - - - -#enable -D_GNU_SOURCE since the return code value of getaddrinfo -#ifdefed with __USE_GNU -#features.h header undef's __USE_GNU and defines it only if _GNU_SOURCE is defined -#hence this define for gcc -@%:@ Check whether --enable-debug was given. -if test "${enable_debug+set}" = set; then : - enableval=$enable_debug; -else - enable_debug=no -fi - - -if test "x$enable_debug" = xyes; then - if test "x$init_cflags" = x; then - CFLAGS="" - fi - CFLAGS="$CFLAGS -g -O0 -D_GNU_SOURCE" -else - if test "x$init_cflags" = x; then - CFLAGS="-g -O2 -D_GNU_SOURCE" - fi -fi - -if test "x$enable_debug" = xyes; then - if test "x$init_cxxflags" = x; then - CXXFLAGS="" - fi - CXXFLAGS="$CXXFLAGS -g -O0" -else - if test "x$init_cxxflags" = x; then - CXXFLAGS="-g -O2" - fi -fi - - -@%:@ Check whether --with-syncapi was given. -if test "${with_syncapi+set}" = set; then : - withval=$with_syncapi; -else - with_syncapi=yes -fi - - -# Checks for libraries. -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for pthread_mutex_lock in -lpthread" >&5 -$as_echo_n "checking for pthread_mutex_lock in -lpthread... " >&6; } -if ${ac_cv_lib_pthread_pthread_mutex_lock+:} false; then : - $as_echo_n "(cached) " >&6 -else - ac_check_lib_save_LIBS=$LIBS -LIBS="-lpthread $LIBS" -cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -/* Override any GCC internal prototype to avoid an error. - Use char because int might match the return type of a GCC - builtin and then its argument prototype would still apply. */ -#ifdef __cplusplus -extern "C" -#endif -char pthread_mutex_lock (); -int -main () -{ -return pthread_mutex_lock (); - ; - return 0; -} -_ACEOF -if ac_fn_c_try_link "$LINENO"; then : - ac_cv_lib_pthread_pthread_mutex_lock=yes -else - ac_cv_lib_pthread_pthread_mutex_lock=no -fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext -LIBS=$ac_check_lib_save_LIBS -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_pthread_pthread_mutex_lock" >&5 -$as_echo "$ac_cv_lib_pthread_pthread_mutex_lock" >&6; } -if test "x$ac_cv_lib_pthread_pthread_mutex_lock" = xyes; then : - have_pthread=yes -else - have_pthread=no -fi - - -if test "x$with_syncapi" != xno && test "x$have_pthread" = xno; then - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cannot build SyncAPI -- pthread not found" >&5 -$as_echo "$as_me: WARNING: cannot build SyncAPI -- pthread not found" >&2;} - with_syncapi=no -fi -if test "x$with_syncapi" != xno; then - { $as_echo "$as_me:${as_lineno-$LINENO}: building with SyncAPI support" >&5 -$as_echo "$as_me: building with SyncAPI support" >&6;} -else - { $as_echo "$as_me:${as_lineno-$LINENO}: building without SyncAPI support" >&5 -$as_echo "$as_me: building without SyncAPI support" >&6;} -fi - - if test "x$with_syncapi" != xno; then - WANT_SYNCAPI_TRUE= - WANT_SYNCAPI_FALSE='#' -else - WANT_SYNCAPI_TRUE='#' - WANT_SYNCAPI_FALSE= -fi - - -# Checks for header files. -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header files" >&5 -$as_echo_n "checking for ANSI C header files... " >&6; } -if ${ac_cv_header_stdc+:} false; then : - $as_echo_n "(cached) " >&6 -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include -#include -#include -#include - -int -main () -{ - - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - ac_cv_header_stdc=yes -else - ac_cv_header_stdc=no -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext - -if test $ac_cv_header_stdc = yes; then - # SunOS 4.x string.h does not declare mem*, contrary to ANSI. - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include - -_ACEOF -if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | - $EGREP "memchr" >/dev/null 2>&1; then : - -else - ac_cv_header_stdc=no -fi -rm -f conftest* - -fi - -if test $ac_cv_header_stdc = yes; then - # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include - -_ACEOF -if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | - $EGREP "free" >/dev/null 2>&1; then : - -else - ac_cv_header_stdc=no -fi -rm -f conftest* - -fi - -if test $ac_cv_header_stdc = yes; then - # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi. - if test "$cross_compiling" = yes; then : - : -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include -#include -#if ((' ' & 0x0FF) == 0x020) -# define ISLOWER(c) ('a' <= (c) && (c) <= 'z') -# define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c)) -#else -# define ISLOWER(c) \ - (('a' <= (c) && (c) <= 'i') \ - || ('j' <= (c) && (c) <= 'r') \ - || ('s' <= (c) && (c) <= 'z')) -# define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c)) -#endif - -#define XOR(e, f) (((e) && !(f)) || (!(e) && (f))) -int -main () -{ - int i; - for (i = 0; i < 256; i++) - if (XOR (islower (i), ISLOWER (i)) - || toupper (i) != TOUPPER (i)) - return 2; - return 0; -} -_ACEOF -if ac_fn_c_try_run "$LINENO"; then : - -else - ac_cv_header_stdc=no -fi -rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ - conftest.$ac_objext conftest.beam conftest.$ac_ext -fi - -fi -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdc" >&5 -$as_echo "$ac_cv_header_stdc" >&6; } -if test $ac_cv_header_stdc = yes; then - -$as_echo "@%:@define STDC_HEADERS 1" >>confdefs.h - -fi - -for ac_header in arpa/inet.h fcntl.h netdb.h netinet/in.h stdlib.h string.h sys/socket.h sys/time.h unistd.h sys/utsname.h -do : - as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` -ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default" -if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : - cat >>confdefs.h <<_ACEOF -@%:@define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 -_ACEOF - -fi - -done - - -# Checks for typedefs, structures, and compiler characteristics. -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for an ANSI C-conforming const" >&5 -$as_echo_n "checking for an ANSI C-conforming const... " >&6; } -if ${ac_cv_c_const+:} false; then : - $as_echo_n "(cached) " >&6 -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -int -main () -{ - -#ifndef __cplusplus - /* Ultrix mips cc rejects this sort of thing. */ - typedef int charset[2]; - const charset cs = { 0, 0 }; - /* SunOS 4.1.1 cc rejects this. */ - char const *const *pcpcc; - char **ppc; - /* NEC SVR4.0.2 mips cc rejects this. */ - struct point {int x, y;}; - static struct point const zero = {0,0}; - /* AIX XL C 1.02.0.0 rejects this. - It does not let you subtract one const X* pointer from another in - an arm of an if-expression whose if-part is not a constant - expression */ - const char *g = "string"; - pcpcc = &g + (g ? g-g : 0); - /* HPUX 7.0 cc rejects these. */ - ++pcpcc; - ppc = (char**) pcpcc; - pcpcc = (char const *const *) ppc; - { /* SCO 3.2v4 cc rejects this sort of thing. */ - char tx; - char *t = &tx; - char const *s = 0 ? (char *) 0 : (char const *) 0; - - *t++ = 0; - if (s) return 0; - } - { /* Someone thinks the Sun supposedly-ANSI compiler will reject this. */ - int x[] = {25, 17}; - const int *foo = &x[0]; - ++foo; - } - { /* Sun SC1.0 ANSI compiler rejects this -- but not the above. */ - typedef const int *iptr; - iptr p = 0; - ++p; - } - { /* AIX XL C 1.02.0.0 rejects this sort of thing, saying - "k.c", line 2.27: 1506-025 (S) Operand must be a modifiable lvalue. */ - struct s { int j; const int *ap[3]; } bx; - struct s *b = &bx; b->j = 5; - } - { /* ULTRIX-32 V3.1 (Rev 9) vcc rejects this */ - const int foo = 10; - if (!foo) return 0; - } - return !cs[0] && !zero.x; -#endif - - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - ac_cv_c_const=yes -else - ac_cv_c_const=no -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_const" >&5 -$as_echo "$ac_cv_c_const" >&6; } -if test $ac_cv_c_const = no; then - -$as_echo "@%:@define const /**/" >>confdefs.h - -fi - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for inline" >&5 -$as_echo_n "checking for inline... " >&6; } -if ${ac_cv_c_inline+:} false; then : - $as_echo_n "(cached) " >&6 -else - ac_cv_c_inline=no -for ac_kw in inline __inline__ __inline; do - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#ifndef __cplusplus -typedef int foo_t; -static $ac_kw foo_t static_foo () {return 0; } -$ac_kw foo_t foo () {return 0; } -#endif - -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - ac_cv_c_inline=$ac_kw -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext - test "$ac_cv_c_inline" != no && break -done - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_inline" >&5 -$as_echo "$ac_cv_c_inline" >&6; } - -case $ac_cv_c_inline in - inline | yes) ;; - *) - case $ac_cv_c_inline in - no) ac_val=;; - *) ac_val=$ac_cv_c_inline;; - esac - cat >>confdefs.h <<_ACEOF -#ifndef __cplusplus -#define inline $ac_val -#endif -_ACEOF - ;; -esac - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether time.h and sys/time.h may both be included" >&5 -$as_echo_n "checking whether time.h and sys/time.h may both be included... " >&6; } -if ${ac_cv_header_time+:} false; then : - $as_echo_n "(cached) " >&6 -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include -#include -#include - -int -main () -{ -if ((struct tm *) 0) -return 0; - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - ac_cv_header_time=yes -else - ac_cv_header_time=no -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_time" >&5 -$as_echo "$ac_cv_header_time" >&6; } -if test $ac_cv_header_time = yes; then - -$as_echo "@%:@define TIME_WITH_SYS_TIME 1" >>confdefs.h - -fi - -ac_fn_c_check_type "$LINENO" "nfds_t" "ac_cv_type_nfds_t" "#include -" -if test "x$ac_cv_type_nfds_t" = xyes; then : - -$as_echo "@%:@define POLL_NFDS_TYPE nfds_t" >>confdefs.h - -else - -$as_echo "@%:@define POLL_NFDS_TYPE unsigned int" >>confdefs.h - -fi - - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to enable ipv6" >&5 -$as_echo_n "checking whether to enable ipv6... " >&6; } - -if test "$cross_compiling" = yes; then : - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } - ipv6=no -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - /* is AF_INET6 available? */ -#include -#include -main() -{ - if (socket(AF_INET6, SOCK_STREAM, 0) < 0) - exit(1); - else - exit(0); -} - -_ACEOF -if ac_fn_c_try_run "$LINENO"; then : - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; } - ipv6=yes -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } - ipv6=no -fi -rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ - conftest.$ac_objext conftest.beam conftest.$ac_ext -fi - - -if test x"$ipv6" = xyes; then - USEIPV6="-DZOO_IPV6_ENABLED" - -fi - -# Checks for library functions. -for ac_func in getcwd gethostbyname gethostname getlogin getpwuid_r gettimeofday getuid memmove memset poll socket strchr strdup strerror strtol -do : - as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` -ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var" -if eval test \"x\$"$as_ac_var"\" = x"yes"; then : - cat >>confdefs.h <<_ACEOF -@%:@define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 -_ACEOF - -fi -done - - -ac_config_files="$ac_config_files Makefile" - -cat >confcache <<\_ACEOF -# This file is a shell script that caches the results of configure -# tests run on this system so they can be shared between configure -# scripts and configure runs, see configure's option --config-cache. -# It is not useful on other systems. If it contains results you don't -# want to keep, you may remove or edit it. -# -# config.status only pays attention to the cache file if you give it -# the --recheck option to rerun configure. -# -# `ac_cv_env_foo' variables (set or unset) will be overridden when -# loading this file, other *unset* `ac_cv_foo' will be assigned the -# following values. - -_ACEOF - -# The following way of writing the cache mishandles newlines in values, -# but we know of no workaround that is simple, portable, and efficient. -# So, we kill variables containing newlines. -# Ultrix sh set writes to stderr and can't be redirected directly, -# and sets the high bit in the cache file unless we assign to the vars. -( - for ac_var in `(set) 2>&1 | sed -n 's/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'`; do - eval ac_val=\$$ac_var - case $ac_val in #( - *${as_nl}*) - case $ac_var in #( - *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 -$as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; - esac - case $ac_var in #( - _ | IFS | as_nl) ;; #( - BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( - *) { eval $ac_var=; unset $ac_var;} ;; - esac ;; - esac - done - - (set) 2>&1 | - case $as_nl`(ac_space=' '; set) 2>&1` in #( - *${as_nl}ac_space=\ *) - # `set' does not quote correctly, so add quotes: double-quote - # substitution turns \\\\ into \\, and sed turns \\ into \. - sed -n \ - "s/'/'\\\\''/g; - s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p" - ;; #( - *) - # `set' quotes correctly as required by POSIX, so do not add quotes. - sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" - ;; - esac | - sort -) | - sed ' - /^ac_cv_env_/b end - t clear - :clear - s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/ - t end - s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/ - :end' >>confcache -if diff "$cache_file" confcache >/dev/null 2>&1; then :; else - if test -w "$cache_file"; then - if test "x$cache_file" != "x/dev/null"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5 -$as_echo "$as_me: updating cache $cache_file" >&6;} - if test ! -f "$cache_file" || test -h "$cache_file"; then - cat confcache >"$cache_file" - else - case $cache_file in #( - */* | ?:*) - mv -f confcache "$cache_file"$$ && - mv -f "$cache_file"$$ "$cache_file" ;; #( - *) - mv -f confcache "$cache_file" ;; - esac - fi - fi - else - { $as_echo "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5 -$as_echo "$as_me: not updating unwritable cache $cache_file" >&6;} - fi -fi -rm -f confcache - -test "x$prefix" = xNONE && prefix=$ac_default_prefix -# Let make expand exec_prefix. -test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' - -DEFS=-DHAVE_CONFIG_H - -ac_libobjs= -ac_ltlibobjs= -U= -for ac_i in : $LIB@&t@OBJS; do test "x$ac_i" = x: && continue - # 1. Remove the extension, and $U if already installed. - ac_script='s/\$U\././;s/\.o$//;s/\.obj$//' - ac_i=`$as_echo "$ac_i" | sed "$ac_script"` - # 2. Prepend LIBOBJDIR. When used with automake>=1.10 LIBOBJDIR - # will be set to the directory where LIBOBJS objects are built. - as_fn_append ac_libobjs " \${LIBOBJDIR}$ac_i\$U.$ac_objext" - as_fn_append ac_ltlibobjs " \${LIBOBJDIR}$ac_i"'$U.lo' -done -LIB@&t@OBJS=$ac_libobjs - -LTLIBOBJS=$ac_ltlibobjs - - -if test -z "${DX_COND_doc_TRUE}" && test -z "${DX_COND_doc_FALSE}"; then - as_fn_error $? "conditional \"DX_COND_doc\" was never defined. -Usually this means the macro was only invoked conditionally." "$LINENO" 5 -fi -if test -z "${DX_COND_doc_TRUE}" && test -z "${DX_COND_doc_FALSE}"; then - as_fn_error $? "conditional \"DX_COND_doc\" was never defined. -Usually this means the macro was only invoked conditionally." "$LINENO" 5 -fi -if test -z "${DX_COND_dot_TRUE}" && test -z "${DX_COND_dot_FALSE}"; then - as_fn_error $? "conditional \"DX_COND_dot\" was never defined. -Usually this means the macro was only invoked conditionally." "$LINENO" 5 -fi -if test -z "${DX_COND_dot_TRUE}" && test -z "${DX_COND_dot_FALSE}"; then - as_fn_error $? "conditional \"DX_COND_dot\" was never defined. -Usually this means the macro was only invoked conditionally." "$LINENO" 5 -fi -if test -z "${DX_COND_man_TRUE}" && test -z "${DX_COND_man_FALSE}"; then - as_fn_error $? "conditional \"DX_COND_man\" was never defined. -Usually this means the macro was only invoked conditionally." "$LINENO" 5 -fi -if test -z "${DX_COND_man_TRUE}" && test -z "${DX_COND_man_FALSE}"; then - as_fn_error $? "conditional \"DX_COND_man\" was never defined. -Usually this means the macro was only invoked conditionally." "$LINENO" 5 -fi -if test -z "${DX_COND_rtf_TRUE}" && test -z "${DX_COND_rtf_FALSE}"; then - as_fn_error $? "conditional \"DX_COND_rtf\" was never defined. -Usually this means the macro was only invoked conditionally." "$LINENO" 5 -fi -if test -z "${DX_COND_rtf_TRUE}" && test -z "${DX_COND_rtf_FALSE}"; then - as_fn_error $? "conditional \"DX_COND_rtf\" was never defined. -Usually this means the macro was only invoked conditionally." "$LINENO" 5 -fi -if test -z "${DX_COND_xml_TRUE}" && test -z "${DX_COND_xml_FALSE}"; then - as_fn_error $? "conditional \"DX_COND_xml\" was never defined. -Usually this means the macro was only invoked conditionally." "$LINENO" 5 -fi -if test -z "${DX_COND_xml_TRUE}" && test -z "${DX_COND_xml_FALSE}"; then - as_fn_error $? "conditional \"DX_COND_xml\" was never defined. -Usually this means the macro was only invoked conditionally." "$LINENO" 5 -fi -if test -z "${DX_COND_chm_TRUE}" && test -z "${DX_COND_chm_FALSE}"; then - as_fn_error $? "conditional \"DX_COND_chm\" was never defined. -Usually this means the macro was only invoked conditionally." "$LINENO" 5 -fi -if test -z "${DX_COND_chm_TRUE}" && test -z "${DX_COND_chm_FALSE}"; then - as_fn_error $? "conditional \"DX_COND_chm\" was never defined. -Usually this means the macro was only invoked conditionally." "$LINENO" 5 -fi -if test -z "${DX_COND_chi_TRUE}" && test -z "${DX_COND_chi_FALSE}"; then - as_fn_error $? "conditional \"DX_COND_chi\" was never defined. -Usually this means the macro was only invoked conditionally." "$LINENO" 5 -fi -if test -z "${DX_COND_chi_TRUE}" && test -z "${DX_COND_chi_FALSE}"; then - as_fn_error $? "conditional \"DX_COND_chi\" was never defined. -Usually this means the macro was only invoked conditionally." "$LINENO" 5 -fi -if test -z "${DX_COND_html_TRUE}" && test -z "${DX_COND_html_FALSE}"; then - as_fn_error $? "conditional \"DX_COND_html\" was never defined. -Usually this means the macro was only invoked conditionally." "$LINENO" 5 -fi -if test -z "${DX_COND_html_TRUE}" && test -z "${DX_COND_html_FALSE}"; then - as_fn_error $? "conditional \"DX_COND_html\" was never defined. -Usually this means the macro was only invoked conditionally." "$LINENO" 5 -fi -if test -z "${DX_COND_ps_TRUE}" && test -z "${DX_COND_ps_FALSE}"; then - as_fn_error $? "conditional \"DX_COND_ps\" was never defined. -Usually this means the macro was only invoked conditionally." "$LINENO" 5 -fi -if test -z "${DX_COND_ps_TRUE}" && test -z "${DX_COND_ps_FALSE}"; then - as_fn_error $? "conditional \"DX_COND_ps\" was never defined. -Usually this means the macro was only invoked conditionally." "$LINENO" 5 -fi -if test -z "${DX_COND_pdf_TRUE}" && test -z "${DX_COND_pdf_FALSE}"; then - as_fn_error $? "conditional \"DX_COND_pdf\" was never defined. -Usually this means the macro was only invoked conditionally." "$LINENO" 5 -fi -if test -z "${DX_COND_pdf_TRUE}" && test -z "${DX_COND_pdf_FALSE}"; then - as_fn_error $? "conditional \"DX_COND_pdf\" was never defined. -Usually this means the macro was only invoked conditionally." "$LINENO" 5 -fi -if test -z "${DX_COND_latex_TRUE}" && test -z "${DX_COND_latex_FALSE}"; then - as_fn_error $? "conditional \"DX_COND_latex\" was never defined. -Usually this means the macro was only invoked conditionally." "$LINENO" 5 -fi -if test -z "${DX_COND_latex_TRUE}" && test -z "${DX_COND_latex_FALSE}"; then - as_fn_error $? "conditional \"DX_COND_latex\" was never defined. -Usually this means the macro was only invoked conditionally." "$LINENO" 5 -fi - if test -n "$EXEEXT"; then - am__EXEEXT_TRUE= - am__EXEEXT_FALSE='#' -else - am__EXEEXT_TRUE='#' - am__EXEEXT_FALSE= -fi - -if test -z "${AMDEP_TRUE}" && test -z "${AMDEP_FALSE}"; then - as_fn_error $? "conditional \"AMDEP\" was never defined. -Usually this means the macro was only invoked conditionally." "$LINENO" 5 -fi -if test -z "${am__fastdepCC_TRUE}" && test -z "${am__fastdepCC_FALSE}"; then - as_fn_error $? "conditional \"am__fastdepCC\" was never defined. -Usually this means the macro was only invoked conditionally." "$LINENO" 5 -fi -if test -z "${am__fastdepCXX_TRUE}" && test -z "${am__fastdepCXX_FALSE}"; then - as_fn_error $? "conditional \"am__fastdepCXX\" was never defined. -Usually this means the macro was only invoked conditionally." "$LINENO" 5 -fi -if test -z "${WANT_SYNCAPI_TRUE}" && test -z "${WANT_SYNCAPI_FALSE}"; then - as_fn_error $? "conditional \"WANT_SYNCAPI\" was never defined. -Usually this means the macro was only invoked conditionally." "$LINENO" 5 -fi - -: "${CONFIG_STATUS=./config.status}" -ac_write_fail=0 -ac_clean_files_save=$ac_clean_files -ac_clean_files="$ac_clean_files $CONFIG_STATUS" -{ $as_echo "$as_me:${as_lineno-$LINENO}: creating $CONFIG_STATUS" >&5 -$as_echo "$as_me: creating $CONFIG_STATUS" >&6;} -as_write_fail=0 -cat >$CONFIG_STATUS <<_ASEOF || as_write_fail=1 -#! $SHELL -# Generated by $as_me. -# Run this file to recreate the current configuration. -# Compiler output produced by configure, useful for debugging -# configure, is in config.log if it exists. - -debug=false -ac_cs_recheck=false -ac_cs_silent=false - -SHELL=\${CONFIG_SHELL-$SHELL} -export SHELL -_ASEOF -cat >>$CONFIG_STATUS <<\_ASEOF || as_write_fail=1 -## -------------------- ## -## M4sh Initialization. ## -## -------------------- ## - -# Be more Bourne compatible -DUALCASE=1; export DUALCASE # for MKS sh -if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : - emulate sh - NULLCMD=: - # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which - # is contrary to our usage. Disable this feature. - alias -g '${1+"$@"}'='"$@"' - setopt NO_GLOB_SUBST -else - case `(set -o) 2>/dev/null` in @%:@( - *posix*) : - set -o posix ;; @%:@( - *) : - ;; -esac -fi - - -as_nl=' -' -export as_nl -# Printing a long string crashes Solaris 7 /usr/bin/printf. -as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' -as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo -as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo -# Prefer a ksh shell builtin over an external printf program on Solaris, -# but without wasting forks for bash or zsh. -if test -z "$BASH_VERSION$ZSH_VERSION" \ - && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then - as_echo='print -r --' - as_echo_n='print -rn --' -elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then - as_echo='printf %s\n' - as_echo_n='printf %s' -else - if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then - as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' - as_echo_n='/usr/ucb/echo -n' - else - as_echo_body='eval expr "X$1" : "X\\(.*\\)"' - as_echo_n_body='eval - arg=$1; - case $arg in @%:@( - *"$as_nl"*) - expr "X$arg" : "X\\(.*\\)$as_nl"; - arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; - esac; - expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" - ' - export as_echo_n_body - as_echo_n='sh -c $as_echo_n_body as_echo' - fi - export as_echo_body - as_echo='sh -c $as_echo_body as_echo' -fi - -# The user is always right. -if test "${PATH_SEPARATOR+set}" != set; then - PATH_SEPARATOR=: - (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { - (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || - PATH_SEPARATOR=';' - } -fi - - -# IFS -# We need space, tab and new line, in precisely that order. Quoting is -# there to prevent editors from complaining about space-tab. -# (If _AS_PATH_WALK were called with IFS unset, it would disable word -# splitting by setting IFS to empty value.) -IFS=" "" $as_nl" - -# Find who we are. Look in the path if we contain no directory separator. -as_myself= -case $0 in @%:@(( - *[\\/]* ) as_myself=$0 ;; - *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break - done -IFS=$as_save_IFS - - ;; -esac -# We did not find ourselves, most probably we were run as `sh COMMAND' -# in which case we are not to be found in the path. -if test "x$as_myself" = x; then - as_myself=$0 -fi -if test ! -f "$as_myself"; then - $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 - exit 1 -fi - -# Unset variables that we do not need and which cause bugs (e.g. in -# pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" -# suppresses any "Segmentation fault" message there. '((' could -# trigger a bug in pdksh 5.2.14. -for as_var in BASH_ENV ENV MAIL MAILPATH -do eval test x\${$as_var+set} = xset \ - && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : -done -PS1='$ ' -PS2='> ' -PS4='+ ' - -# NLS nuisances. -LC_ALL=C -export LC_ALL -LANGUAGE=C -export LANGUAGE - -# CDPATH. -(unset CDPATH) >/dev/null 2>&1 && unset CDPATH - - -@%:@ as_fn_error STATUS ERROR [LINENO LOG_FD] -@%:@ ---------------------------------------- -@%:@ Output "`basename @S|@0`: error: ERROR" to stderr. If LINENO and LOG_FD are -@%:@ provided, also output the error to LOG_FD, referencing LINENO. Then exit the -@%:@ script with STATUS, using 1 if that was 0. -as_fn_error () -{ - as_status=$1; test $as_status -eq 0 && as_status=1 - if test "$4"; then - as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack - $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 - fi - $as_echo "$as_me: error: $2" >&2 - as_fn_exit $as_status -} @%:@ as_fn_error - - -@%:@ as_fn_set_status STATUS -@%:@ ----------------------- -@%:@ Set @S|@? to STATUS, without forking. -as_fn_set_status () -{ - return $1 -} @%:@ as_fn_set_status - -@%:@ as_fn_exit STATUS -@%:@ ----------------- -@%:@ Exit the shell with STATUS, even in a "trap 0" or "set -e" context. -as_fn_exit () -{ - set +e - as_fn_set_status $1 - exit $1 -} @%:@ as_fn_exit - -@%:@ as_fn_unset VAR -@%:@ --------------- -@%:@ Portably unset VAR. -as_fn_unset () -{ - { eval $1=; unset $1;} -} -as_unset=as_fn_unset -@%:@ as_fn_append VAR VALUE -@%:@ ---------------------- -@%:@ Append the text in VALUE to the end of the definition contained in VAR. Take -@%:@ advantage of any shell optimizations that allow amortized linear growth over -@%:@ repeated appends, instead of the typical quadratic growth present in naive -@%:@ implementations. -if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : - eval 'as_fn_append () - { - eval $1+=\$2 - }' -else - as_fn_append () - { - eval $1=\$$1\$2 - } -fi # as_fn_append - -@%:@ as_fn_arith ARG... -@%:@ ------------------ -@%:@ Perform arithmetic evaluation on the ARGs, and store the result in the -@%:@ global @S|@as_val. Take advantage of shells that can avoid forks. The arguments -@%:@ must be portable across @S|@(()) and expr. -if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : - eval 'as_fn_arith () - { - as_val=$(( $* )) - }' -else - as_fn_arith () - { - as_val=`expr "$@" || test $? -eq 1` - } -fi # as_fn_arith - - -if expr a : '\(a\)' >/dev/null 2>&1 && - test "X`expr 00001 : '.*\(...\)'`" = X001; then - as_expr=expr -else - as_expr=false -fi - -if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then - as_basename=basename -else - as_basename=false -fi - -if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then - as_dirname=dirname -else - as_dirname=false -fi - -as_me=`$as_basename -- "$0" || -$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ - X"$0" : 'X\(//\)$' \| \ - X"$0" : 'X\(/\)' \| . 2>/dev/null || -$as_echo X/"$0" | - sed '/^.*\/\([^/][^/]*\)\/*$/{ - s//\1/ - q - } - /^X\/\(\/\/\)$/{ - s//\1/ - q - } - /^X\/\(\/\).*/{ - s//\1/ - q - } - s/.*/./; q'` - -# Avoid depending upon Character Ranges. -as_cr_letters='abcdefghijklmnopqrstuvwxyz' -as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' -as_cr_Letters=$as_cr_letters$as_cr_LETTERS -as_cr_digits='0123456789' -as_cr_alnum=$as_cr_Letters$as_cr_digits - -ECHO_C= ECHO_N= ECHO_T= -case `echo -n x` in @%:@((((( --n*) - case `echo 'xy\c'` in - *c*) ECHO_T=' ';; # ECHO_T is single tab character. - xy) ECHO_C='\c';; - *) echo `echo ksh88 bug on AIX 6.1` > /dev/null - ECHO_T=' ';; - esac;; -*) - ECHO_N='-n';; -esac - -rm -f conf$$ conf$$.exe conf$$.file -if test -d conf$$.dir; then - rm -f conf$$.dir/conf$$.file -else - rm -f conf$$.dir - mkdir conf$$.dir 2>/dev/null -fi -if (echo >conf$$.file) 2>/dev/null; then - if ln -s conf$$.file conf$$ 2>/dev/null; then - as_ln_s='ln -s' - # ... but there are two gotchas: - # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. - # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. - # In both cases, we have to default to `cp -pR'. - ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || - as_ln_s='cp -pR' - elif ln conf$$.file conf$$ 2>/dev/null; then - as_ln_s=ln - else - as_ln_s='cp -pR' - fi -else - as_ln_s='cp -pR' -fi -rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file -rmdir conf$$.dir 2>/dev/null - - -@%:@ as_fn_mkdir_p -@%:@ ------------- -@%:@ Create "@S|@as_dir" as a directory, including parents if necessary. -as_fn_mkdir_p () -{ - - case $as_dir in #( - -*) as_dir=./$as_dir;; - esac - test -d "$as_dir" || eval $as_mkdir_p || { - as_dirs= - while :; do - case $as_dir in #( - *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( - *) as_qdir=$as_dir;; - esac - as_dirs="'$as_qdir' $as_dirs" - as_dir=`$as_dirname -- "$as_dir" || -$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ - X"$as_dir" : 'X\(//\)[^/]' \| \ - X"$as_dir" : 'X\(//\)$' \| \ - X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || -$as_echo X"$as_dir" | - sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ - s//\1/ - q - } - /^X\(\/\/\)[^/].*/{ - s//\1/ - q - } - /^X\(\/\/\)$/{ - s//\1/ - q - } - /^X\(\/\).*/{ - s//\1/ - q - } - s/.*/./; q'` - test -d "$as_dir" && break - done - test -z "$as_dirs" || eval "mkdir $as_dirs" - } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" - - -} @%:@ as_fn_mkdir_p -if mkdir -p . 2>/dev/null; then - as_mkdir_p='mkdir -p "$as_dir"' -else - test -d ./-p && rmdir ./-p - as_mkdir_p=false -fi - - -@%:@ as_fn_executable_p FILE -@%:@ ----------------------- -@%:@ Test if FILE is an executable regular file. -as_fn_executable_p () -{ - test -f "$1" && test -x "$1" -} @%:@ as_fn_executable_p -as_test_x='test -x' -as_executable_p=as_fn_executable_p - -# Sed expression to map a string onto a valid CPP name. -as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" - -# Sed expression to map a string onto a valid variable name. -as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" - - -exec 6>&1 -## ----------------------------------- ## -## Main body of $CONFIG_STATUS script. ## -## ----------------------------------- ## -_ASEOF -test $as_write_fail = 0 && chmod +x $CONFIG_STATUS || ac_write_fail=1 - -cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 -# Save the log message, to keep $0 and so on meaningful, and to -# report actual input values of CONFIG_FILES etc. instead of their -# values after options handling. -ac_log=" -This file was extended by zookeeper C client $as_me 3.4.5, which was -generated by GNU Autoconf 2.69. Invocation command line was - - CONFIG_FILES = $CONFIG_FILES - CONFIG_HEADERS = $CONFIG_HEADERS - CONFIG_LINKS = $CONFIG_LINKS - CONFIG_COMMANDS = $CONFIG_COMMANDS - $ $0 $@ - -on `(hostname || uname -n) 2>/dev/null | sed 1q` -" - -_ACEOF - -case $ac_config_files in *" -"*) set x $ac_config_files; shift; ac_config_files=$*;; -esac - -case $ac_config_headers in *" -"*) set x $ac_config_headers; shift; ac_config_headers=$*;; -esac - - -cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 -# Files that config.status was made for. -config_files="$ac_config_files" -config_headers="$ac_config_headers" -config_commands="$ac_config_commands" - -_ACEOF - -cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 -ac_cs_usage="\ -\`$as_me' instantiates files and other configuration actions -from templates according to the current configuration. Unless the files -and actions are specified as TAGs, all are instantiated by default. - -Usage: $0 [OPTION]... [TAG]... - - -h, --help print this help, then exit - -V, --version print version number and configuration settings, then exit - --config print configuration, then exit - -q, --quiet, --silent - do not print progress messages - -d, --debug don't remove temporary files - --recheck update $as_me by reconfiguring in the same conditions - --file=FILE[:TEMPLATE] - instantiate the configuration file FILE - --header=FILE[:TEMPLATE] - instantiate the configuration header FILE - -Configuration files: -$config_files - -Configuration headers: -$config_headers - -Configuration commands: -$config_commands - -Report bugs to ." - -_ACEOF -cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 -ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" -ac_cs_version="\\ -zookeeper C client config.status 3.4.5 -configured by $0, generated by GNU Autoconf 2.69, - with options \\"\$ac_cs_config\\" - -Copyright (C) 2012 Free Software Foundation, Inc. -This config.status script is free software; the Free Software Foundation -gives unlimited permission to copy, distribute and modify it." - -ac_pwd='$ac_pwd' -srcdir='$srcdir' -INSTALL='$INSTALL' -MKDIR_P='$MKDIR_P' -AWK='$AWK' -test -n "\$AWK" || AWK=awk -_ACEOF - -cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 -# The default lists apply if the user does not specify any file. -ac_need_defaults=: -while test $# != 0 -do - case $1 in - --*=?*) - ac_option=`expr "X$1" : 'X\([^=]*\)='` - ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'` - ac_shift=: - ;; - --*=) - ac_option=`expr "X$1" : 'X\([^=]*\)='` - ac_optarg= - ac_shift=: - ;; - *) - ac_option=$1 - ac_optarg=$2 - ac_shift=shift - ;; - esac - - case $ac_option in - # Handling of the options. - -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) - ac_cs_recheck=: ;; - --version | --versio | --versi | --vers | --ver | --ve | --v | -V ) - $as_echo "$ac_cs_version"; exit ;; - --config | --confi | --conf | --con | --co | --c ) - $as_echo "$ac_cs_config"; exit ;; - --debug | --debu | --deb | --de | --d | -d ) - debug=: ;; - --file | --fil | --fi | --f ) - $ac_shift - case $ac_optarg in - *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; - '') as_fn_error $? "missing file argument" ;; - esac - as_fn_append CONFIG_FILES " '$ac_optarg'" - ac_need_defaults=false;; - --header | --heade | --head | --hea ) - $ac_shift - case $ac_optarg in - *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; - esac - as_fn_append CONFIG_HEADERS " '$ac_optarg'" - ac_need_defaults=false;; - --he | --h) - # Conflict between --help and --header - as_fn_error $? "ambiguous option: \`$1' -Try \`$0 --help' for more information.";; - --help | --hel | -h ) - $as_echo "$ac_cs_usage"; exit ;; - -q | -quiet | --quiet | --quie | --qui | --qu | --q \ - | -silent | --silent | --silen | --sile | --sil | --si | --s) - ac_cs_silent=: ;; - - # This is an error. - -*) as_fn_error $? "unrecognized option: \`$1' -Try \`$0 --help' for more information." ;; - - *) as_fn_append ac_config_targets " $1" - ac_need_defaults=false ;; - - esac - shift -done - -ac_configure_extra_args= - -if $ac_cs_silent; then - exec 6>/dev/null - ac_configure_extra_args="$ac_configure_extra_args --silent" -fi - -_ACEOF -cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 -if \$ac_cs_recheck; then - set X $SHELL '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion - shift - \$as_echo "running CONFIG_SHELL=$SHELL \$*" >&6 - CONFIG_SHELL='$SHELL' - export CONFIG_SHELL - exec "\$@" -fi - -_ACEOF -cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 -exec 5>>config.log -{ - echo - sed 'h;s/./-/g;s/^.../@%:@@%:@ /;s/...$/ @%:@@%:@/;p;x;p;x' <<_ASBOX -@%:@@%:@ Running $as_me. @%:@@%:@ -_ASBOX - $as_echo "$ac_log" -} >&5 - -_ACEOF -cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 -# -# INIT-COMMANDS -# -AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir" - - -# The HP-UX ksh and POSIX shell print the target directory to stdout -# if CDPATH is set. -(unset CDPATH) >/dev/null 2>&1 && unset CDPATH - -sed_quote_subst='$sed_quote_subst' -double_quote_subst='$double_quote_subst' -delay_variable_subst='$delay_variable_subst' -macro_version='`$ECHO "$macro_version" | $SED "$delay_single_quote_subst"`' -macro_revision='`$ECHO "$macro_revision" | $SED "$delay_single_quote_subst"`' -enable_shared='`$ECHO "$enable_shared" | $SED "$delay_single_quote_subst"`' -enable_static='`$ECHO "$enable_static" | $SED "$delay_single_quote_subst"`' -pic_mode='`$ECHO "$pic_mode" | $SED "$delay_single_quote_subst"`' -enable_fast_install='`$ECHO "$enable_fast_install" | $SED "$delay_single_quote_subst"`' -SHELL='`$ECHO "$SHELL" | $SED "$delay_single_quote_subst"`' -ECHO='`$ECHO "$ECHO" | $SED "$delay_single_quote_subst"`' -PATH_SEPARATOR='`$ECHO "$PATH_SEPARATOR" | $SED "$delay_single_quote_subst"`' -host_alias='`$ECHO "$host_alias" | $SED "$delay_single_quote_subst"`' -host='`$ECHO "$host" | $SED "$delay_single_quote_subst"`' -host_os='`$ECHO "$host_os" | $SED "$delay_single_quote_subst"`' -build_alias='`$ECHO "$build_alias" | $SED "$delay_single_quote_subst"`' -build='`$ECHO "$build" | $SED "$delay_single_quote_subst"`' -build_os='`$ECHO "$build_os" | $SED "$delay_single_quote_subst"`' -SED='`$ECHO "$SED" | $SED "$delay_single_quote_subst"`' -Xsed='`$ECHO "$Xsed" | $SED "$delay_single_quote_subst"`' -GREP='`$ECHO "$GREP" | $SED "$delay_single_quote_subst"`' -EGREP='`$ECHO "$EGREP" | $SED "$delay_single_quote_subst"`' -FGREP='`$ECHO "$FGREP" | $SED "$delay_single_quote_subst"`' -LD='`$ECHO "$LD" | $SED "$delay_single_quote_subst"`' -NM='`$ECHO "$NM" | $SED "$delay_single_quote_subst"`' -LN_S='`$ECHO "$LN_S" | $SED "$delay_single_quote_subst"`' -max_cmd_len='`$ECHO "$max_cmd_len" | $SED "$delay_single_quote_subst"`' -ac_objext='`$ECHO "$ac_objext" | $SED "$delay_single_quote_subst"`' -exeext='`$ECHO "$exeext" | $SED "$delay_single_quote_subst"`' -lt_unset='`$ECHO "$lt_unset" | $SED "$delay_single_quote_subst"`' -lt_SP2NL='`$ECHO "$lt_SP2NL" | $SED "$delay_single_quote_subst"`' -lt_NL2SP='`$ECHO "$lt_NL2SP" | $SED "$delay_single_quote_subst"`' -lt_cv_to_host_file_cmd='`$ECHO "$lt_cv_to_host_file_cmd" | $SED "$delay_single_quote_subst"`' -lt_cv_to_tool_file_cmd='`$ECHO "$lt_cv_to_tool_file_cmd" | $SED "$delay_single_quote_subst"`' -reload_flag='`$ECHO "$reload_flag" | $SED "$delay_single_quote_subst"`' -reload_cmds='`$ECHO "$reload_cmds" | $SED "$delay_single_quote_subst"`' -OBJDUMP='`$ECHO "$OBJDUMP" | $SED "$delay_single_quote_subst"`' -deplibs_check_method='`$ECHO "$deplibs_check_method" | $SED "$delay_single_quote_subst"`' -file_magic_cmd='`$ECHO "$file_magic_cmd" | $SED "$delay_single_quote_subst"`' -file_magic_glob='`$ECHO "$file_magic_glob" | $SED "$delay_single_quote_subst"`' -want_nocaseglob='`$ECHO "$want_nocaseglob" | $SED "$delay_single_quote_subst"`' -DLLTOOL='`$ECHO "$DLLTOOL" | $SED "$delay_single_quote_subst"`' -sharedlib_from_linklib_cmd='`$ECHO "$sharedlib_from_linklib_cmd" | $SED "$delay_single_quote_subst"`' -AR='`$ECHO "$AR" | $SED "$delay_single_quote_subst"`' -AR_FLAGS='`$ECHO "$AR_FLAGS" | $SED "$delay_single_quote_subst"`' -archiver_list_spec='`$ECHO "$archiver_list_spec" | $SED "$delay_single_quote_subst"`' -STRIP='`$ECHO "$STRIP" | $SED "$delay_single_quote_subst"`' -RANLIB='`$ECHO "$RANLIB" | $SED "$delay_single_quote_subst"`' -old_postinstall_cmds='`$ECHO "$old_postinstall_cmds" | $SED "$delay_single_quote_subst"`' -old_postuninstall_cmds='`$ECHO "$old_postuninstall_cmds" | $SED "$delay_single_quote_subst"`' -old_archive_cmds='`$ECHO "$old_archive_cmds" | $SED "$delay_single_quote_subst"`' -lock_old_archive_extraction='`$ECHO "$lock_old_archive_extraction" | $SED "$delay_single_quote_subst"`' -CC='`$ECHO "$CC" | $SED "$delay_single_quote_subst"`' -CFLAGS='`$ECHO "$CFLAGS" | $SED "$delay_single_quote_subst"`' -compiler='`$ECHO "$compiler" | $SED "$delay_single_quote_subst"`' -GCC='`$ECHO "$GCC" | $SED "$delay_single_quote_subst"`' -lt_cv_sys_global_symbol_pipe='`$ECHO "$lt_cv_sys_global_symbol_pipe" | $SED "$delay_single_quote_subst"`' -lt_cv_sys_global_symbol_to_cdecl='`$ECHO "$lt_cv_sys_global_symbol_to_cdecl" | $SED "$delay_single_quote_subst"`' -lt_cv_sys_global_symbol_to_c_name_address='`$ECHO "$lt_cv_sys_global_symbol_to_c_name_address" | $SED "$delay_single_quote_subst"`' -lt_cv_sys_global_symbol_to_c_name_address_lib_prefix='`$ECHO "$lt_cv_sys_global_symbol_to_c_name_address_lib_prefix" | $SED "$delay_single_quote_subst"`' -nm_file_list_spec='`$ECHO "$nm_file_list_spec" | $SED "$delay_single_quote_subst"`' -lt_sysroot='`$ECHO "$lt_sysroot" | $SED "$delay_single_quote_subst"`' -objdir='`$ECHO "$objdir" | $SED "$delay_single_quote_subst"`' -MAGIC_CMD='`$ECHO "$MAGIC_CMD" | $SED "$delay_single_quote_subst"`' -lt_prog_compiler_no_builtin_flag='`$ECHO "$lt_prog_compiler_no_builtin_flag" | $SED "$delay_single_quote_subst"`' -lt_prog_compiler_pic='`$ECHO "$lt_prog_compiler_pic" | $SED "$delay_single_quote_subst"`' -lt_prog_compiler_wl='`$ECHO "$lt_prog_compiler_wl" | $SED "$delay_single_quote_subst"`' -lt_prog_compiler_static='`$ECHO "$lt_prog_compiler_static" | $SED "$delay_single_quote_subst"`' -lt_cv_prog_compiler_c_o='`$ECHO "$lt_cv_prog_compiler_c_o" | $SED "$delay_single_quote_subst"`' -need_locks='`$ECHO "$need_locks" | $SED "$delay_single_quote_subst"`' -MANIFEST_TOOL='`$ECHO "$MANIFEST_TOOL" | $SED "$delay_single_quote_subst"`' -DSYMUTIL='`$ECHO "$DSYMUTIL" | $SED "$delay_single_quote_subst"`' -NMEDIT='`$ECHO "$NMEDIT" | $SED "$delay_single_quote_subst"`' -LIPO='`$ECHO "$LIPO" | $SED "$delay_single_quote_subst"`' -OTOOL='`$ECHO "$OTOOL" | $SED "$delay_single_quote_subst"`' -OTOOL64='`$ECHO "$OTOOL64" | $SED "$delay_single_quote_subst"`' -libext='`$ECHO "$libext" | $SED "$delay_single_quote_subst"`' -shrext_cmds='`$ECHO "$shrext_cmds" | $SED "$delay_single_quote_subst"`' -extract_expsyms_cmds='`$ECHO "$extract_expsyms_cmds" | $SED "$delay_single_quote_subst"`' -archive_cmds_need_lc='`$ECHO "$archive_cmds_need_lc" | $SED "$delay_single_quote_subst"`' -enable_shared_with_static_runtimes='`$ECHO "$enable_shared_with_static_runtimes" | $SED "$delay_single_quote_subst"`' -export_dynamic_flag_spec='`$ECHO "$export_dynamic_flag_spec" | $SED "$delay_single_quote_subst"`' -whole_archive_flag_spec='`$ECHO "$whole_archive_flag_spec" | $SED "$delay_single_quote_subst"`' -compiler_needs_object='`$ECHO "$compiler_needs_object" | $SED "$delay_single_quote_subst"`' -old_archive_from_new_cmds='`$ECHO "$old_archive_from_new_cmds" | $SED "$delay_single_quote_subst"`' -old_archive_from_expsyms_cmds='`$ECHO "$old_archive_from_expsyms_cmds" | $SED "$delay_single_quote_subst"`' -archive_cmds='`$ECHO "$archive_cmds" | $SED "$delay_single_quote_subst"`' -archive_expsym_cmds='`$ECHO "$archive_expsym_cmds" | $SED "$delay_single_quote_subst"`' -module_cmds='`$ECHO "$module_cmds" | $SED "$delay_single_quote_subst"`' -module_expsym_cmds='`$ECHO "$module_expsym_cmds" | $SED "$delay_single_quote_subst"`' -with_gnu_ld='`$ECHO "$with_gnu_ld" | $SED "$delay_single_quote_subst"`' -allow_undefined_flag='`$ECHO "$allow_undefined_flag" | $SED "$delay_single_quote_subst"`' -no_undefined_flag='`$ECHO "$no_undefined_flag" | $SED "$delay_single_quote_subst"`' -hardcode_libdir_flag_spec='`$ECHO "$hardcode_libdir_flag_spec" | $SED "$delay_single_quote_subst"`' -hardcode_libdir_separator='`$ECHO "$hardcode_libdir_separator" | $SED "$delay_single_quote_subst"`' -hardcode_direct='`$ECHO "$hardcode_direct" | $SED "$delay_single_quote_subst"`' -hardcode_direct_absolute='`$ECHO "$hardcode_direct_absolute" | $SED "$delay_single_quote_subst"`' -hardcode_minus_L='`$ECHO "$hardcode_minus_L" | $SED "$delay_single_quote_subst"`' -hardcode_shlibpath_var='`$ECHO "$hardcode_shlibpath_var" | $SED "$delay_single_quote_subst"`' -hardcode_automatic='`$ECHO "$hardcode_automatic" | $SED "$delay_single_quote_subst"`' -inherit_rpath='`$ECHO "$inherit_rpath" | $SED "$delay_single_quote_subst"`' -link_all_deplibs='`$ECHO "$link_all_deplibs" | $SED "$delay_single_quote_subst"`' -always_export_symbols='`$ECHO "$always_export_symbols" | $SED "$delay_single_quote_subst"`' -export_symbols_cmds='`$ECHO "$export_symbols_cmds" | $SED "$delay_single_quote_subst"`' -exclude_expsyms='`$ECHO "$exclude_expsyms" | $SED "$delay_single_quote_subst"`' -include_expsyms='`$ECHO "$include_expsyms" | $SED "$delay_single_quote_subst"`' -prelink_cmds='`$ECHO "$prelink_cmds" | $SED "$delay_single_quote_subst"`' -postlink_cmds='`$ECHO "$postlink_cmds" | $SED "$delay_single_quote_subst"`' -file_list_spec='`$ECHO "$file_list_spec" | $SED "$delay_single_quote_subst"`' -variables_saved_for_relink='`$ECHO "$variables_saved_for_relink" | $SED "$delay_single_quote_subst"`' -need_lib_prefix='`$ECHO "$need_lib_prefix" | $SED "$delay_single_quote_subst"`' -need_version='`$ECHO "$need_version" | $SED "$delay_single_quote_subst"`' -version_type='`$ECHO "$version_type" | $SED "$delay_single_quote_subst"`' -runpath_var='`$ECHO "$runpath_var" | $SED "$delay_single_quote_subst"`' -shlibpath_var='`$ECHO "$shlibpath_var" | $SED "$delay_single_quote_subst"`' -shlibpath_overrides_runpath='`$ECHO "$shlibpath_overrides_runpath" | $SED "$delay_single_quote_subst"`' -libname_spec='`$ECHO "$libname_spec" | $SED "$delay_single_quote_subst"`' -library_names_spec='`$ECHO "$library_names_spec" | $SED "$delay_single_quote_subst"`' -soname_spec='`$ECHO "$soname_spec" | $SED "$delay_single_quote_subst"`' -install_override_mode='`$ECHO "$install_override_mode" | $SED "$delay_single_quote_subst"`' -postinstall_cmds='`$ECHO "$postinstall_cmds" | $SED "$delay_single_quote_subst"`' -postuninstall_cmds='`$ECHO "$postuninstall_cmds" | $SED "$delay_single_quote_subst"`' -finish_cmds='`$ECHO "$finish_cmds" | $SED "$delay_single_quote_subst"`' -finish_eval='`$ECHO "$finish_eval" | $SED "$delay_single_quote_subst"`' -hardcode_into_libs='`$ECHO "$hardcode_into_libs" | $SED "$delay_single_quote_subst"`' -sys_lib_search_path_spec='`$ECHO "$sys_lib_search_path_spec" | $SED "$delay_single_quote_subst"`' -sys_lib_dlsearch_path_spec='`$ECHO "$sys_lib_dlsearch_path_spec" | $SED "$delay_single_quote_subst"`' -hardcode_action='`$ECHO "$hardcode_action" | $SED "$delay_single_quote_subst"`' -enable_dlopen='`$ECHO "$enable_dlopen" | $SED "$delay_single_quote_subst"`' -enable_dlopen_self='`$ECHO "$enable_dlopen_self" | $SED "$delay_single_quote_subst"`' -enable_dlopen_self_static='`$ECHO "$enable_dlopen_self_static" | $SED "$delay_single_quote_subst"`' -old_striplib='`$ECHO "$old_striplib" | $SED "$delay_single_quote_subst"`' -striplib='`$ECHO "$striplib" | $SED "$delay_single_quote_subst"`' -compiler_lib_search_dirs='`$ECHO "$compiler_lib_search_dirs" | $SED "$delay_single_quote_subst"`' -predep_objects='`$ECHO "$predep_objects" | $SED "$delay_single_quote_subst"`' -postdep_objects='`$ECHO "$postdep_objects" | $SED "$delay_single_quote_subst"`' -predeps='`$ECHO "$predeps" | $SED "$delay_single_quote_subst"`' -postdeps='`$ECHO "$postdeps" | $SED "$delay_single_quote_subst"`' -compiler_lib_search_path='`$ECHO "$compiler_lib_search_path" | $SED "$delay_single_quote_subst"`' -LD_CXX='`$ECHO "$LD_CXX" | $SED "$delay_single_quote_subst"`' -reload_flag_CXX='`$ECHO "$reload_flag_CXX" | $SED "$delay_single_quote_subst"`' -reload_cmds_CXX='`$ECHO "$reload_cmds_CXX" | $SED "$delay_single_quote_subst"`' -old_archive_cmds_CXX='`$ECHO "$old_archive_cmds_CXX" | $SED "$delay_single_quote_subst"`' -compiler_CXX='`$ECHO "$compiler_CXX" | $SED "$delay_single_quote_subst"`' -GCC_CXX='`$ECHO "$GCC_CXX" | $SED "$delay_single_quote_subst"`' -lt_prog_compiler_no_builtin_flag_CXX='`$ECHO "$lt_prog_compiler_no_builtin_flag_CXX" | $SED "$delay_single_quote_subst"`' -lt_prog_compiler_pic_CXX='`$ECHO "$lt_prog_compiler_pic_CXX" | $SED "$delay_single_quote_subst"`' -lt_prog_compiler_wl_CXX='`$ECHO "$lt_prog_compiler_wl_CXX" | $SED "$delay_single_quote_subst"`' -lt_prog_compiler_static_CXX='`$ECHO "$lt_prog_compiler_static_CXX" | $SED "$delay_single_quote_subst"`' -lt_cv_prog_compiler_c_o_CXX='`$ECHO "$lt_cv_prog_compiler_c_o_CXX" | $SED "$delay_single_quote_subst"`' -archive_cmds_need_lc_CXX='`$ECHO "$archive_cmds_need_lc_CXX" | $SED "$delay_single_quote_subst"`' -enable_shared_with_static_runtimes_CXX='`$ECHO "$enable_shared_with_static_runtimes_CXX" | $SED "$delay_single_quote_subst"`' -export_dynamic_flag_spec_CXX='`$ECHO "$export_dynamic_flag_spec_CXX" | $SED "$delay_single_quote_subst"`' -whole_archive_flag_spec_CXX='`$ECHO "$whole_archive_flag_spec_CXX" | $SED "$delay_single_quote_subst"`' -compiler_needs_object_CXX='`$ECHO "$compiler_needs_object_CXX" | $SED "$delay_single_quote_subst"`' -old_archive_from_new_cmds_CXX='`$ECHO "$old_archive_from_new_cmds_CXX" | $SED "$delay_single_quote_subst"`' -old_archive_from_expsyms_cmds_CXX='`$ECHO "$old_archive_from_expsyms_cmds_CXX" | $SED "$delay_single_quote_subst"`' -archive_cmds_CXX='`$ECHO "$archive_cmds_CXX" | $SED "$delay_single_quote_subst"`' -archive_expsym_cmds_CXX='`$ECHO "$archive_expsym_cmds_CXX" | $SED "$delay_single_quote_subst"`' -module_cmds_CXX='`$ECHO "$module_cmds_CXX" | $SED "$delay_single_quote_subst"`' -module_expsym_cmds_CXX='`$ECHO "$module_expsym_cmds_CXX" | $SED "$delay_single_quote_subst"`' -with_gnu_ld_CXX='`$ECHO "$with_gnu_ld_CXX" | $SED "$delay_single_quote_subst"`' -allow_undefined_flag_CXX='`$ECHO "$allow_undefined_flag_CXX" | $SED "$delay_single_quote_subst"`' -no_undefined_flag_CXX='`$ECHO "$no_undefined_flag_CXX" | $SED "$delay_single_quote_subst"`' -hardcode_libdir_flag_spec_CXX='`$ECHO "$hardcode_libdir_flag_spec_CXX" | $SED "$delay_single_quote_subst"`' -hardcode_libdir_separator_CXX='`$ECHO "$hardcode_libdir_separator_CXX" | $SED "$delay_single_quote_subst"`' -hardcode_direct_CXX='`$ECHO "$hardcode_direct_CXX" | $SED "$delay_single_quote_subst"`' -hardcode_direct_absolute_CXX='`$ECHO "$hardcode_direct_absolute_CXX" | $SED "$delay_single_quote_subst"`' -hardcode_minus_L_CXX='`$ECHO "$hardcode_minus_L_CXX" | $SED "$delay_single_quote_subst"`' -hardcode_shlibpath_var_CXX='`$ECHO "$hardcode_shlibpath_var_CXX" | $SED "$delay_single_quote_subst"`' -hardcode_automatic_CXX='`$ECHO "$hardcode_automatic_CXX" | $SED "$delay_single_quote_subst"`' -inherit_rpath_CXX='`$ECHO "$inherit_rpath_CXX" | $SED "$delay_single_quote_subst"`' -link_all_deplibs_CXX='`$ECHO "$link_all_deplibs_CXX" | $SED "$delay_single_quote_subst"`' -always_export_symbols_CXX='`$ECHO "$always_export_symbols_CXX" | $SED "$delay_single_quote_subst"`' -export_symbols_cmds_CXX='`$ECHO "$export_symbols_cmds_CXX" | $SED "$delay_single_quote_subst"`' -exclude_expsyms_CXX='`$ECHO "$exclude_expsyms_CXX" | $SED "$delay_single_quote_subst"`' -include_expsyms_CXX='`$ECHO "$include_expsyms_CXX" | $SED "$delay_single_quote_subst"`' -prelink_cmds_CXX='`$ECHO "$prelink_cmds_CXX" | $SED "$delay_single_quote_subst"`' -postlink_cmds_CXX='`$ECHO "$postlink_cmds_CXX" | $SED "$delay_single_quote_subst"`' -file_list_spec_CXX='`$ECHO "$file_list_spec_CXX" | $SED "$delay_single_quote_subst"`' -hardcode_action_CXX='`$ECHO "$hardcode_action_CXX" | $SED "$delay_single_quote_subst"`' -compiler_lib_search_dirs_CXX='`$ECHO "$compiler_lib_search_dirs_CXX" | $SED "$delay_single_quote_subst"`' -predep_objects_CXX='`$ECHO "$predep_objects_CXX" | $SED "$delay_single_quote_subst"`' -postdep_objects_CXX='`$ECHO "$postdep_objects_CXX" | $SED "$delay_single_quote_subst"`' -predeps_CXX='`$ECHO "$predeps_CXX" | $SED "$delay_single_quote_subst"`' -postdeps_CXX='`$ECHO "$postdeps_CXX" | $SED "$delay_single_quote_subst"`' -compiler_lib_search_path_CXX='`$ECHO "$compiler_lib_search_path_CXX" | $SED "$delay_single_quote_subst"`' - -LTCC='$LTCC' -LTCFLAGS='$LTCFLAGS' -compiler='$compiler_DEFAULT' - -# A function that is used when there is no print builtin or printf. -func_fallback_echo () -{ - eval 'cat <<_LTECHO_EOF -\$1 -_LTECHO_EOF' -} - -# Quote evaled strings. -for var in SHELL \ -ECHO \ -PATH_SEPARATOR \ -SED \ -GREP \ -EGREP \ -FGREP \ -LD \ -NM \ -LN_S \ -lt_SP2NL \ -lt_NL2SP \ -reload_flag \ -OBJDUMP \ -deplibs_check_method \ -file_magic_cmd \ -file_magic_glob \ -want_nocaseglob \ -DLLTOOL \ -sharedlib_from_linklib_cmd \ -AR \ -AR_FLAGS \ -archiver_list_spec \ -STRIP \ -RANLIB \ -CC \ -CFLAGS \ -compiler \ -lt_cv_sys_global_symbol_pipe \ -lt_cv_sys_global_symbol_to_cdecl \ -lt_cv_sys_global_symbol_to_c_name_address \ -lt_cv_sys_global_symbol_to_c_name_address_lib_prefix \ -nm_file_list_spec \ -lt_prog_compiler_no_builtin_flag \ -lt_prog_compiler_pic \ -lt_prog_compiler_wl \ -lt_prog_compiler_static \ -lt_cv_prog_compiler_c_o \ -need_locks \ -MANIFEST_TOOL \ -DSYMUTIL \ -NMEDIT \ -LIPO \ -OTOOL \ -OTOOL64 \ -shrext_cmds \ -export_dynamic_flag_spec \ -whole_archive_flag_spec \ -compiler_needs_object \ -with_gnu_ld \ -allow_undefined_flag \ -no_undefined_flag \ -hardcode_libdir_flag_spec \ -hardcode_libdir_separator \ -exclude_expsyms \ -include_expsyms \ -file_list_spec \ -variables_saved_for_relink \ -libname_spec \ -library_names_spec \ -soname_spec \ -install_override_mode \ -finish_eval \ -old_striplib \ -striplib \ -compiler_lib_search_dirs \ -predep_objects \ -postdep_objects \ -predeps \ -postdeps \ -compiler_lib_search_path \ -LD_CXX \ -reload_flag_CXX \ -compiler_CXX \ -lt_prog_compiler_no_builtin_flag_CXX \ -lt_prog_compiler_pic_CXX \ -lt_prog_compiler_wl_CXX \ -lt_prog_compiler_static_CXX \ -lt_cv_prog_compiler_c_o_CXX \ -export_dynamic_flag_spec_CXX \ -whole_archive_flag_spec_CXX \ -compiler_needs_object_CXX \ -with_gnu_ld_CXX \ -allow_undefined_flag_CXX \ -no_undefined_flag_CXX \ -hardcode_libdir_flag_spec_CXX \ -hardcode_libdir_separator_CXX \ -exclude_expsyms_CXX \ -include_expsyms_CXX \ -file_list_spec_CXX \ -compiler_lib_search_dirs_CXX \ -predep_objects_CXX \ -postdep_objects_CXX \ -predeps_CXX \ -postdeps_CXX \ -compiler_lib_search_path_CXX; do - case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in - *[\\\\\\\`\\"\\\$]*) - eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED \\"\\\$sed_quote_subst\\"\\\`\\\\\\"" - ;; - *) - eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\"" - ;; - esac -done - -# Double-quote double-evaled strings. -for var in reload_cmds \ -old_postinstall_cmds \ -old_postuninstall_cmds \ -old_archive_cmds \ -extract_expsyms_cmds \ -old_archive_from_new_cmds \ -old_archive_from_expsyms_cmds \ -archive_cmds \ -archive_expsym_cmds \ -module_cmds \ -module_expsym_cmds \ -export_symbols_cmds \ -prelink_cmds \ -postlink_cmds \ -postinstall_cmds \ -postuninstall_cmds \ -finish_cmds \ -sys_lib_search_path_spec \ -sys_lib_dlsearch_path_spec \ -reload_cmds_CXX \ -old_archive_cmds_CXX \ -old_archive_from_new_cmds_CXX \ -old_archive_from_expsyms_cmds_CXX \ -archive_cmds_CXX \ -archive_expsym_cmds_CXX \ -module_cmds_CXX \ -module_expsym_cmds_CXX \ -export_symbols_cmds_CXX \ -prelink_cmds_CXX \ -postlink_cmds_CXX; do - case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in - *[\\\\\\\`\\"\\\$]*) - eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED -e \\"\\\$double_quote_subst\\" -e \\"\\\$sed_quote_subst\\" -e \\"\\\$delay_variable_subst\\"\\\`\\\\\\"" - ;; - *) - eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\"" - ;; - esac -done - -ac_aux_dir='$ac_aux_dir' -xsi_shell='$xsi_shell' -lt_shell_append='$lt_shell_append' - -# See if we are running on zsh, and set the options which allow our -# commands through without removal of \ escapes INIT. -if test -n "\${ZSH_VERSION+set}" ; then - setopt NO_GLOB_SUBST -fi - - - PACKAGE='$PACKAGE' - VERSION='$VERSION' - TIMESTAMP='$TIMESTAMP' - RM='$RM' - ofile='$ofile' - - - - - - -_ACEOF - -cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 - -# Handling of arguments. -for ac_config_target in $ac_config_targets -do - case $ac_config_target in - "config.h") CONFIG_HEADERS="$CONFIG_HEADERS config.h" ;; - "depfiles") CONFIG_COMMANDS="$CONFIG_COMMANDS depfiles" ;; - "libtool") CONFIG_COMMANDS="$CONFIG_COMMANDS libtool" ;; - "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;; - - *) as_fn_error $? "invalid argument: \`$ac_config_target'" "$LINENO" 5;; - esac -done - - -# If the user did not use the arguments to specify the items to instantiate, -# then the envvar interface is used. Set only those that are not. -# We use the long form for the default assignment because of an extremely -# bizarre bug on SunOS 4.1.3. -if $ac_need_defaults; then - test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files - test "${CONFIG_HEADERS+set}" = set || CONFIG_HEADERS=$config_headers - test "${CONFIG_COMMANDS+set}" = set || CONFIG_COMMANDS=$config_commands -fi - -# Have a temporary directory for convenience. Make it in the build tree -# simply because there is no reason against having it here, and in addition, -# creating and moving files from /tmp can sometimes cause problems. -# Hook for its removal unless debugging. -# Note that there is a small window in which the directory will not be cleaned: -# after its creation but before its name has been assigned to `$tmp'. -$debug || -{ - tmp= ac_tmp= - trap 'exit_status=$? - : "${ac_tmp:=$tmp}" - { test ! -d "$ac_tmp" || rm -fr "$ac_tmp"; } && exit $exit_status -' 0 - trap 'as_fn_exit 1' 1 2 13 15 -} -# Create a (secure) tmp directory for tmp files. - -{ - tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` && - test -d "$tmp" -} || -{ - tmp=./conf$$-$RANDOM - (umask 077 && mkdir "$tmp") -} || as_fn_error $? "cannot create a temporary directory in ." "$LINENO" 5 -ac_tmp=$tmp - -# Set up the scripts for CONFIG_FILES section. -# No need to generate them if there are no CONFIG_FILES. -# This happens for instance with `./config.status config.h'. -if test -n "$CONFIG_FILES"; then - - -ac_cr=`echo X | tr X '\015'` -# On cygwin, bash can eat \r inside `` if the user requested igncr. -# But we know of no other shell where ac_cr would be empty at this -# point, so we can use a bashism as a fallback. -if test "x$ac_cr" = x; then - eval ac_cr=\$\'\\r\' -fi -ac_cs_awk_cr=`$AWK 'BEGIN { print "a\rb" }' /dev/null` -if test "$ac_cs_awk_cr" = "a${ac_cr}b"; then - ac_cs_awk_cr='\\r' -else - ac_cs_awk_cr=$ac_cr -fi - -echo 'BEGIN {' >"$ac_tmp/subs1.awk" && -_ACEOF - - -{ - echo "cat >conf$$subs.awk <<_ACEOF" && - echo "$ac_subst_vars" | sed 's/.*/&!$&$ac_delim/' && - echo "_ACEOF" -} >conf$$subs.sh || - as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 -ac_delim_num=`echo "$ac_subst_vars" | grep -c '^'` -ac_delim='%!_!# ' -for ac_last_try in false false false false false :; do - . ./conf$$subs.sh || - as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 - - ac_delim_n=`sed -n "s/.*$ac_delim\$/X/p" conf$$subs.awk | grep -c X` - if test $ac_delim_n = $ac_delim_num; then - break - elif $ac_last_try; then - as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 - else - ac_delim="$ac_delim!$ac_delim _$ac_delim!! " - fi -done -rm -f conf$$subs.sh - -cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 -cat >>"\$ac_tmp/subs1.awk" <<\\_ACAWK && -_ACEOF -sed -n ' -h -s/^/S["/; s/!.*/"]=/ -p -g -s/^[^!]*!// -:repl -t repl -s/'"$ac_delim"'$// -t delim -:nl -h -s/\(.\{148\}\)..*/\1/ -t more1 -s/["\\]/\\&/g; s/^/"/; s/$/\\n"\\/ -p -n -b repl -:more1 -s/["\\]/\\&/g; s/^/"/; s/$/"\\/ -p -g -s/.\{148\}// -t nl -:delim -h -s/\(.\{148\}\)..*/\1/ -t more2 -s/["\\]/\\&/g; s/^/"/; s/$/"/ -p -b -:more2 -s/["\\]/\\&/g; s/^/"/; s/$/"\\/ -p -g -s/.\{148\}// -t delim -' >$CONFIG_STATUS || ac_write_fail=1 -rm -f conf$$subs.awk -cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 -_ACAWK -cat >>"\$ac_tmp/subs1.awk" <<_ACAWK && - for (key in S) S_is_set[key] = 1 - FS = "" - -} -{ - line = $ 0 - nfields = split(line, field, "@") - substed = 0 - len = length(field[1]) - for (i = 2; i < nfields; i++) { - key = field[i] - keylen = length(key) - if (S_is_set[key]) { - value = S[key] - line = substr(line, 1, len) "" value "" substr(line, len + keylen + 3) - len += length(value) + length(field[++i]) - substed = 1 - } else - len += 1 + keylen - } - - print line -} - -_ACAWK -_ACEOF -cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 -if sed "s/$ac_cr//" < /dev/null > /dev/null 2>&1; then - sed "s/$ac_cr\$//; s/$ac_cr/$ac_cs_awk_cr/g" -else - cat -fi < "$ac_tmp/subs1.awk" > "$ac_tmp/subs.awk" \ - || as_fn_error $? "could not setup config files machinery" "$LINENO" 5 -_ACEOF - -# VPATH may cause trouble with some makes, so we remove sole $(srcdir), -# ${srcdir} and @srcdir@ entries from VPATH if srcdir is ".", strip leading and -# trailing colons and then remove the whole line if VPATH becomes empty -# (actually we leave an empty line to preserve line numbers). -if test "x$srcdir" = x.; then - ac_vpsub='/^[ ]*VPATH[ ]*=[ ]*/{ -h -s/// -s/^/:/ -s/[ ]*$/:/ -s/:\$(srcdir):/:/g -s/:\${srcdir}:/:/g -s/:@srcdir@:/:/g -s/^:*// -s/:*$// -x -s/\(=[ ]*\).*/\1/ -G -s/\n// -s/^[^=]*=[ ]*$// -}' -fi - -cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 -fi # test -n "$CONFIG_FILES" - -# Set up the scripts for CONFIG_HEADERS section. -# No need to generate them if there are no CONFIG_HEADERS. -# This happens for instance with `./config.status Makefile'. -if test -n "$CONFIG_HEADERS"; then -cat >"$ac_tmp/defines.awk" <<\_ACAWK || -BEGIN { -_ACEOF - -# Transform confdefs.h into an awk script `defines.awk', embedded as -# here-document in config.status, that substitutes the proper values into -# config.h.in to produce config.h. - -# Create a delimiter string that does not exist in confdefs.h, to ease -# handling of long lines. -ac_delim='%!_!# ' -for ac_last_try in false false :; do - ac_tt=`sed -n "/$ac_delim/p" confdefs.h` - if test -z "$ac_tt"; then - break - elif $ac_last_try; then - as_fn_error $? "could not make $CONFIG_HEADERS" "$LINENO" 5 - else - ac_delim="$ac_delim!$ac_delim _$ac_delim!! " - fi -done - -# For the awk script, D is an array of macro values keyed by name, -# likewise P contains macro parameters if any. Preserve backslash -# newline sequences. - -ac_word_re=[_$as_cr_Letters][_$as_cr_alnum]* -sed -n ' -s/.\{148\}/&'"$ac_delim"'/g -t rset -:rset -s/^[ ]*#[ ]*define[ ][ ]*/ / -t def -d -:def -s/\\$// -t bsnl -s/["\\]/\\&/g -s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\ -D["\1"]=" \3"/p -s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2"/p -d -:bsnl -s/["\\]/\\&/g -s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\ -D["\1"]=" \3\\\\\\n"\\/p -t cont -s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2\\\\\\n"\\/p -t cont -d -:cont -n -s/.\{148\}/&'"$ac_delim"'/g -t clear -:clear -s/\\$// -t bsnlc -s/["\\]/\\&/g; s/^/"/; s/$/"/p -d -:bsnlc -s/["\\]/\\&/g; s/^/"/; s/$/\\\\\\n"\\/p -b cont -' >$CONFIG_STATUS || ac_write_fail=1 - -cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 - for (key in D) D_is_set[key] = 1 - FS = "" -} -/^[\t ]*#[\t ]*(define|undef)[\t ]+$ac_word_re([\t (]|\$)/ { - line = \$ 0 - split(line, arg, " ") - if (arg[1] == "#") { - defundef = arg[2] - mac1 = arg[3] - } else { - defundef = substr(arg[1], 2) - mac1 = arg[2] - } - split(mac1, mac2, "(") #) - macro = mac2[1] - prefix = substr(line, 1, index(line, defundef) - 1) - if (D_is_set[macro]) { - # Preserve the white space surrounding the "#". - print prefix "define", macro P[macro] D[macro] - next - } else { - # Replace #undef with comments. This is necessary, for example, - # in the case of _POSIX_SOURCE, which is predefined and required - # on some systems where configure will not decide to define it. - if (defundef == "undef") { - print "/*", prefix defundef, macro, "*/" - next - } - } -} -{ print } -_ACAWK -_ACEOF -cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 - as_fn_error $? "could not setup config headers machinery" "$LINENO" 5 -fi # test -n "$CONFIG_HEADERS" - - -eval set X " :F $CONFIG_FILES :H $CONFIG_HEADERS :C $CONFIG_COMMANDS" -shift -for ac_tag -do - case $ac_tag in - :[FHLC]) ac_mode=$ac_tag; continue;; - esac - case $ac_mode$ac_tag in - :[FHL]*:*);; - :L* | :C*:*) as_fn_error $? "invalid tag \`$ac_tag'" "$LINENO" 5;; - :[FH]-) ac_tag=-:-;; - :[FH]*) ac_tag=$ac_tag:$ac_tag.in;; - esac - ac_save_IFS=$IFS - IFS=: - set x $ac_tag - IFS=$ac_save_IFS - shift - ac_file=$1 - shift - - case $ac_mode in - :L) ac_source=$1;; - :[FH]) - ac_file_inputs= - for ac_f - do - case $ac_f in - -) ac_f="$ac_tmp/stdin";; - *) # Look for the file first in the build tree, then in the source tree - # (if the path is not absolute). The absolute path cannot be DOS-style, - # because $ac_f cannot contain `:'. - test -f "$ac_f" || - case $ac_f in - [\\/$]*) false;; - *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";; - esac || - as_fn_error 1 "cannot find input file: \`$ac_f'" "$LINENO" 5;; - esac - case $ac_f in *\'*) ac_f=`$as_echo "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac - as_fn_append ac_file_inputs " '$ac_f'" - done - - # Let's still pretend it is `configure' which instantiates (i.e., don't - # use $as_me), people would be surprised to read: - # /* config.h. Generated by config.status. */ - configure_input='Generated from '` - $as_echo "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g' - `' by configure.' - if test x"$ac_file" != x-; then - configure_input="$ac_file. $configure_input" - { $as_echo "$as_me:${as_lineno-$LINENO}: creating $ac_file" >&5 -$as_echo "$as_me: creating $ac_file" >&6;} - fi - # Neutralize special characters interpreted by sed in replacement strings. - case $configure_input in #( - *\&* | *\|* | *\\* ) - ac_sed_conf_input=`$as_echo "$configure_input" | - sed 's/[\\\\&|]/\\\\&/g'`;; #( - *) ac_sed_conf_input=$configure_input;; - esac - - case $ac_tag in - *:-:* | *:-) cat >"$ac_tmp/stdin" \ - || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; - esac - ;; - esac - - ac_dir=`$as_dirname -- "$ac_file" || -$as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ - X"$ac_file" : 'X\(//\)[^/]' \| \ - X"$ac_file" : 'X\(//\)$' \| \ - X"$ac_file" : 'X\(/\)' \| . 2>/dev/null || -$as_echo X"$ac_file" | - sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ - s//\1/ - q - } - /^X\(\/\/\)[^/].*/{ - s//\1/ - q - } - /^X\(\/\/\)$/{ - s//\1/ - q - } - /^X\(\/\).*/{ - s//\1/ - q - } - s/.*/./; q'` - as_dir="$ac_dir"; as_fn_mkdir_p - ac_builddir=. - -case "$ac_dir" in -.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; -*) - ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` - # A ".." for each directory in $ac_dir_suffix. - ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` - case $ac_top_builddir_sub in - "") ac_top_builddir_sub=. ac_top_build_prefix= ;; - *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; - esac ;; -esac -ac_abs_top_builddir=$ac_pwd -ac_abs_builddir=$ac_pwd$ac_dir_suffix -# for backward compatibility: -ac_top_builddir=$ac_top_build_prefix - -case $srcdir in - .) # We are building in place. - ac_srcdir=. - ac_top_srcdir=$ac_top_builddir_sub - ac_abs_top_srcdir=$ac_pwd ;; - [\\/]* | ?:[\\/]* ) # Absolute name. - ac_srcdir=$srcdir$ac_dir_suffix; - ac_top_srcdir=$srcdir - ac_abs_top_srcdir=$srcdir ;; - *) # Relative name. - ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix - ac_top_srcdir=$ac_top_build_prefix$srcdir - ac_abs_top_srcdir=$ac_pwd/$srcdir ;; -esac -ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix - - - case $ac_mode in - :F) - # - # CONFIG_FILE - # - - case $INSTALL in - [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;; - *) ac_INSTALL=$ac_top_build_prefix$INSTALL ;; - esac - ac_MKDIR_P=$MKDIR_P - case $MKDIR_P in - [\\/$]* | ?:[\\/]* ) ;; - */*) ac_MKDIR_P=$ac_top_build_prefix$MKDIR_P ;; - esac -_ACEOF - -cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 -# If the template does not know about datarootdir, expand it. -# FIXME: This hack should be removed a few years after 2.60. -ac_datarootdir_hack=; ac_datarootdir_seen= -ac_sed_dataroot=' -/datarootdir/ { - p - q -} -/@datadir@/p -/@docdir@/p -/@infodir@/p -/@localedir@/p -/@mandir@/p' -case `eval "sed -n \"\$ac_sed_dataroot\" $ac_file_inputs"` in -*datarootdir*) ac_datarootdir_seen=yes;; -*@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*) - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5 -$as_echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;} -_ACEOF -cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 - ac_datarootdir_hack=' - s&@datadir@&$datadir&g - s&@docdir@&$docdir&g - s&@infodir@&$infodir&g - s&@localedir@&$localedir&g - s&@mandir@&$mandir&g - s&\\\${datarootdir}&$datarootdir&g' ;; -esac -_ACEOF - -# Neutralize VPATH when `$srcdir' = `.'. -# Shell code in configure.ac might set extrasub. -# FIXME: do we really want to maintain this feature? -cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 -ac_sed_extra="$ac_vpsub -$extrasub -_ACEOF -cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 -:t -/@[a-zA-Z_][a-zA-Z_0-9]*@/!b -s|@configure_input@|$ac_sed_conf_input|;t t -s&@top_builddir@&$ac_top_builddir_sub&;t t -s&@top_build_prefix@&$ac_top_build_prefix&;t t -s&@srcdir@&$ac_srcdir&;t t -s&@abs_srcdir@&$ac_abs_srcdir&;t t -s&@top_srcdir@&$ac_top_srcdir&;t t -s&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t -s&@builddir@&$ac_builddir&;t t -s&@abs_builddir@&$ac_abs_builddir&;t t -s&@abs_top_builddir@&$ac_abs_top_builddir&;t t -s&@INSTALL@&$ac_INSTALL&;t t -s&@MKDIR_P@&$ac_MKDIR_P&;t t -$ac_datarootdir_hack -" -eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$ac_tmp/subs.awk" \ - >$ac_tmp/out || as_fn_error $? "could not create $ac_file" "$LINENO" 5 - -test -z "$ac_datarootdir_hack$ac_datarootdir_seen" && - { ac_out=`sed -n '/\${datarootdir}/p' "$ac_tmp/out"`; test -n "$ac_out"; } && - { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' \ - "$ac_tmp/out"`; test -z "$ac_out"; } && - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \`datarootdir' -which seems to be undefined. Please make sure it is defined" >&5 -$as_echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir' -which seems to be undefined. Please make sure it is defined" >&2;} - - rm -f "$ac_tmp/stdin" - case $ac_file in - -) cat "$ac_tmp/out" && rm -f "$ac_tmp/out";; - *) rm -f "$ac_file" && mv "$ac_tmp/out" "$ac_file";; - esac \ - || as_fn_error $? "could not create $ac_file" "$LINENO" 5 - ;; - :H) - # - # CONFIG_HEADER - # - if test x"$ac_file" != x-; then - { - $as_echo "/* $configure_input */" \ - && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" - } >"$ac_tmp/config.h" \ - || as_fn_error $? "could not create $ac_file" "$LINENO" 5 - if diff "$ac_file" "$ac_tmp/config.h" >/dev/null 2>&1; then - { $as_echo "$as_me:${as_lineno-$LINENO}: $ac_file is unchanged" >&5 -$as_echo "$as_me: $ac_file is unchanged" >&6;} - else - rm -f "$ac_file" - mv "$ac_tmp/config.h" "$ac_file" \ - || as_fn_error $? "could not create $ac_file" "$LINENO" 5 - fi - else - $as_echo "/* $configure_input */" \ - && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" \ - || as_fn_error $? "could not create -" "$LINENO" 5 - fi -# Compute "$ac_file"'s index in $config_headers. -_am_arg="$ac_file" -_am_stamp_count=1 -for _am_header in $config_headers :; do - case $_am_header in - $_am_arg | $_am_arg:* ) - break ;; - * ) - _am_stamp_count=`expr $_am_stamp_count + 1` ;; - esac -done -echo "timestamp for $_am_arg" >`$as_dirname -- "$_am_arg" || -$as_expr X"$_am_arg" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ - X"$_am_arg" : 'X\(//\)[^/]' \| \ - X"$_am_arg" : 'X\(//\)$' \| \ - X"$_am_arg" : 'X\(/\)' \| . 2>/dev/null || -$as_echo X"$_am_arg" | - sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ - s//\1/ - q - } - /^X\(\/\/\)[^/].*/{ - s//\1/ - q - } - /^X\(\/\/\)$/{ - s//\1/ - q - } - /^X\(\/\).*/{ - s//\1/ - q - } - s/.*/./; q'`/stamp-h$_am_stamp_count - ;; - - :C) { $as_echo "$as_me:${as_lineno-$LINENO}: executing $ac_file commands" >&5 -$as_echo "$as_me: executing $ac_file commands" >&6;} - ;; - esac - - - case $ac_file$ac_mode in - "depfiles":C) test x"$AMDEP_TRUE" != x"" || { - # Autoconf 2.62 quotes --file arguments for eval, but not when files - # are listed without --file. Let's play safe and only enable the eval - # if we detect the quoting. - case $CONFIG_FILES in - *\'*) eval set x "$CONFIG_FILES" ;; - *) set x $CONFIG_FILES ;; - esac - shift - for mf - do - # Strip MF so we end up with the name of the file. - mf=`echo "$mf" | sed -e 's/:.*$//'` - # Check whether this is an Automake generated Makefile or not. - # We used to match only the files named `Makefile.in', but - # some people rename them; so instead we look at the file content. - # Grep'ing the first line is not enough: some people post-process - # each Makefile.in and add a new line on top of each file to say so. - # Grep'ing the whole file is not good either: AIX grep has a line - # limit of 2048, but all sed's we know have understand at least 4000. - if sed -n 's,^#.*generated by automake.*,X,p' "$mf" | grep X >/dev/null 2>&1; then - dirpart=`$as_dirname -- "$mf" || -$as_expr X"$mf" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ - X"$mf" : 'X\(//\)[^/]' \| \ - X"$mf" : 'X\(//\)$' \| \ - X"$mf" : 'X\(/\)' \| . 2>/dev/null || -$as_echo X"$mf" | - sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ - s//\1/ - q - } - /^X\(\/\/\)[^/].*/{ - s//\1/ - q - } - /^X\(\/\/\)$/{ - s//\1/ - q - } - /^X\(\/\).*/{ - s//\1/ - q - } - s/.*/./; q'` - else - continue - fi - # Extract the definition of DEPDIR, am__include, and am__quote - # from the Makefile without running `make'. - DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"` - test -z "$DEPDIR" && continue - am__include=`sed -n 's/^am__include = //p' < "$mf"` - test -z "am__include" && continue - am__quote=`sed -n 's/^am__quote = //p' < "$mf"` - # When using ansi2knr, U may be empty or an underscore; expand it - U=`sed -n 's/^U = //p' < "$mf"` - # Find all dependency output files, they are included files with - # $(DEPDIR) in their names. We invoke sed twice because it is the - # simplest approach to changing $(DEPDIR) to its actual value in the - # expansion. - for file in `sed -n " - s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \ - sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g' -e 's/\$U/'"$U"'/g'`; do - # Make sure the directory exists. - test -f "$dirpart/$file" && continue - fdir=`$as_dirname -- "$file" || -$as_expr X"$file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ - X"$file" : 'X\(//\)[^/]' \| \ - X"$file" : 'X\(//\)$' \| \ - X"$file" : 'X\(/\)' \| . 2>/dev/null || -$as_echo X"$file" | - sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ - s//\1/ - q - } - /^X\(\/\/\)[^/].*/{ - s//\1/ - q - } - /^X\(\/\/\)$/{ - s//\1/ - q - } - /^X\(\/\).*/{ - s//\1/ - q - } - s/.*/./; q'` - as_dir=$dirpart/$fdir; as_fn_mkdir_p - # echo "creating $dirpart/$file" - echo '# dummy' > "$dirpart/$file" - done - done -} - ;; - "libtool":C) - - # See if we are running on zsh, and set the options which allow our - # commands through without removal of \ escapes. - if test -n "${ZSH_VERSION+set}" ; then - setopt NO_GLOB_SUBST - fi - - cfgfile="${ofile}T" - trap "$RM \"$cfgfile\"; exit 1" 1 2 15 - $RM "$cfgfile" - - cat <<_LT_EOF >> "$cfgfile" -#! $SHELL - -# `$ECHO "$ofile" | sed 's%^.*/%%'` - Provide generalized library-building support services. -# Generated automatically by $as_me ($PACKAGE$TIMESTAMP) $VERSION -# Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`: -# NOTE: Changes made to this file will be lost: look at ltmain.sh. -# -# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005, -# 2006, 2007, 2008, 2009, 2010, 2011 Free Software -# Foundation, Inc. -# Written by Gordon Matzigkeit, 1996 -# -# This file is part of GNU Libtool. -# -# GNU Libtool is free software; you can redistribute it and/or -# modify it under the terms of the GNU General Public License as -# published by the Free Software Foundation; either version 2 of -# the License, or (at your option) any later version. -# -# As a special exception to the GNU General Public License, -# if you distribute this file as part of a program or library that -# is built using GNU Libtool, you may include this file under the -# same distribution terms that you use for the rest of that program. -# -# GNU Libtool is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with GNU Libtool; see the file COPYING. If not, a copy -# can be downloaded from http://www.gnu.org/licenses/gpl.html, or -# obtained by writing to the Free Software Foundation, Inc., -# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - - -# The names of the tagged configurations supported by this script. -available_tags="CXX " - -# ### BEGIN LIBTOOL CONFIG - -# Which release of libtool.m4 was used? -macro_version=$macro_version -macro_revision=$macro_revision - -# Whether or not to build shared libraries. -build_libtool_libs=$enable_shared - -# Whether or not to build static libraries. -build_old_libs=$enable_static - -# What type of objects to build. -pic_mode=$pic_mode - -# Whether or not to optimize for fast installation. -fast_install=$enable_fast_install - -# Shell to use when invoking shell scripts. -SHELL=$lt_SHELL - -# An echo program that protects backslashes. -ECHO=$lt_ECHO - -# The PATH separator for the build system. -PATH_SEPARATOR=$lt_PATH_SEPARATOR - -# The host system. -host_alias=$host_alias -host=$host -host_os=$host_os - -# The build system. -build_alias=$build_alias -build=$build -build_os=$build_os - -# A sed program that does not truncate output. -SED=$lt_SED - -# Sed that helps us avoid accidentally triggering echo(1) options like -n. -Xsed="\$SED -e 1s/^X//" - -# A grep program that handles long lines. -GREP=$lt_GREP - -# An ERE matcher. -EGREP=$lt_EGREP - -# A literal string matcher. -FGREP=$lt_FGREP - -# A BSD- or MS-compatible name lister. -NM=$lt_NM - -# Whether we need soft or hard links. -LN_S=$lt_LN_S - -# What is the maximum length of a command? -max_cmd_len=$max_cmd_len - -# Object file suffix (normally "o"). -objext=$ac_objext - -# Executable file suffix (normally ""). -exeext=$exeext - -# whether the shell understands "unset". -lt_unset=$lt_unset - -# turn spaces into newlines. -SP2NL=$lt_lt_SP2NL - -# turn newlines into spaces. -NL2SP=$lt_lt_NL2SP - -# convert \$build file names to \$host format. -to_host_file_cmd=$lt_cv_to_host_file_cmd - -# convert \$build files to toolchain format. -to_tool_file_cmd=$lt_cv_to_tool_file_cmd - -# An object symbol dumper. -OBJDUMP=$lt_OBJDUMP - -# Method to check whether dependent libraries are shared objects. -deplibs_check_method=$lt_deplibs_check_method - -# Command to use when deplibs_check_method = "file_magic". -file_magic_cmd=$lt_file_magic_cmd - -# How to find potential files when deplibs_check_method = "file_magic". -file_magic_glob=$lt_file_magic_glob - -# Find potential files using nocaseglob when deplibs_check_method = "file_magic". -want_nocaseglob=$lt_want_nocaseglob - -# DLL creation program. -DLLTOOL=$lt_DLLTOOL - -# Command to associate shared and link libraries. -sharedlib_from_linklib_cmd=$lt_sharedlib_from_linklib_cmd - -# The archiver. -AR=$lt_AR - -# Flags to create an archive. -AR_FLAGS=$lt_AR_FLAGS - -# How to feed a file listing to the archiver. -archiver_list_spec=$lt_archiver_list_spec - -# A symbol stripping program. -STRIP=$lt_STRIP - -# Commands used to install an old-style archive. -RANLIB=$lt_RANLIB -old_postinstall_cmds=$lt_old_postinstall_cmds -old_postuninstall_cmds=$lt_old_postuninstall_cmds - -# Whether to use a lock for old archive extraction. -lock_old_archive_extraction=$lock_old_archive_extraction - -# A C compiler. -LTCC=$lt_CC - -# LTCC compiler flags. -LTCFLAGS=$lt_CFLAGS - -# Take the output of nm and produce a listing of raw symbols and C names. -global_symbol_pipe=$lt_lt_cv_sys_global_symbol_pipe - -# Transform the output of nm in a proper C declaration. -global_symbol_to_cdecl=$lt_lt_cv_sys_global_symbol_to_cdecl - -# Transform the output of nm in a C name address pair. -global_symbol_to_c_name_address=$lt_lt_cv_sys_global_symbol_to_c_name_address - -# Transform the output of nm in a C name address pair when lib prefix is needed. -global_symbol_to_c_name_address_lib_prefix=$lt_lt_cv_sys_global_symbol_to_c_name_address_lib_prefix - -# Specify filename containing input files for \$NM. -nm_file_list_spec=$lt_nm_file_list_spec - -# The root where to search for dependent libraries,and in which our libraries should be installed. -lt_sysroot=$lt_sysroot - -# The name of the directory that contains temporary libtool files. -objdir=$objdir - -# Used to examine libraries when file_magic_cmd begins with "file". -MAGIC_CMD=$MAGIC_CMD - -# Must we lock files when doing compilation? -need_locks=$lt_need_locks - -# Manifest tool. -MANIFEST_TOOL=$lt_MANIFEST_TOOL - -# Tool to manipulate archived DWARF debug symbol files on Mac OS X. -DSYMUTIL=$lt_DSYMUTIL - -# Tool to change global to local symbols on Mac OS X. -NMEDIT=$lt_NMEDIT - -# Tool to manipulate fat objects and archives on Mac OS X. -LIPO=$lt_LIPO - -# ldd/readelf like tool for Mach-O binaries on Mac OS X. -OTOOL=$lt_OTOOL - -# ldd/readelf like tool for 64 bit Mach-O binaries on Mac OS X 10.4. -OTOOL64=$lt_OTOOL64 - -# Old archive suffix (normally "a"). -libext=$libext - -# Shared library suffix (normally ".so"). -shrext_cmds=$lt_shrext_cmds - -# The commands to extract the exported symbol list from a shared archive. -extract_expsyms_cmds=$lt_extract_expsyms_cmds - -# Variables whose values should be saved in libtool wrapper scripts and -# restored at link time. -variables_saved_for_relink=$lt_variables_saved_for_relink - -# Do we need the "lib" prefix for modules? -need_lib_prefix=$need_lib_prefix - -# Do we need a version for libraries? -need_version=$need_version - -# Library versioning type. -version_type=$version_type - -# Shared library runtime path variable. -runpath_var=$runpath_var - -# Shared library path variable. -shlibpath_var=$shlibpath_var - -# Is shlibpath searched before the hard-coded library search path? -shlibpath_overrides_runpath=$shlibpath_overrides_runpath - -# Format of library name prefix. -libname_spec=$lt_libname_spec - -# List of archive names. First name is the real one, the rest are links. -# The last name is the one that the linker finds with -lNAME -library_names_spec=$lt_library_names_spec - -# The coded name of the library, if different from the real name. -soname_spec=$lt_soname_spec - -# Permission mode override for installation of shared libraries. -install_override_mode=$lt_install_override_mode - -# Command to use after installation of a shared archive. -postinstall_cmds=$lt_postinstall_cmds - -# Command to use after uninstallation of a shared archive. -postuninstall_cmds=$lt_postuninstall_cmds - -# Commands used to finish a libtool library installation in a directory. -finish_cmds=$lt_finish_cmds - -# As "finish_cmds", except a single script fragment to be evaled but -# not shown. -finish_eval=$lt_finish_eval - -# Whether we should hardcode library paths into libraries. -hardcode_into_libs=$hardcode_into_libs - -# Compile-time system search path for libraries. -sys_lib_search_path_spec=$lt_sys_lib_search_path_spec - -# Run-time system search path for libraries. -sys_lib_dlsearch_path_spec=$lt_sys_lib_dlsearch_path_spec - -# Whether dlopen is supported. -dlopen_support=$enable_dlopen - -# Whether dlopen of programs is supported. -dlopen_self=$enable_dlopen_self - -# Whether dlopen of statically linked programs is supported. -dlopen_self_static=$enable_dlopen_self_static - -# Commands to strip libraries. -old_striplib=$lt_old_striplib -striplib=$lt_striplib - - -# The linker used to build libraries. -LD=$lt_LD - -# How to create reloadable object files. -reload_flag=$lt_reload_flag -reload_cmds=$lt_reload_cmds - -# Commands used to build an old-style archive. -old_archive_cmds=$lt_old_archive_cmds - -# A language specific compiler. -CC=$lt_compiler - -# Is the compiler the GNU compiler? -with_gcc=$GCC - -# Compiler flag to turn off builtin functions. -no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag - -# Additional compiler flags for building library objects. -pic_flag=$lt_lt_prog_compiler_pic - -# How to pass a linker flag through the compiler. -wl=$lt_lt_prog_compiler_wl - -# Compiler flag to prevent dynamic linking. -link_static_flag=$lt_lt_prog_compiler_static - -# Does compiler simultaneously support -c and -o options? -compiler_c_o=$lt_lt_cv_prog_compiler_c_o - -# Whether or not to add -lc for building shared libraries. -build_libtool_need_lc=$archive_cmds_need_lc - -# Whether or not to disallow shared libs when runtime libs are static. -allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes - -# Compiler flag to allow reflexive dlopens. -export_dynamic_flag_spec=$lt_export_dynamic_flag_spec - -# Compiler flag to generate shared objects directly from archives. -whole_archive_flag_spec=$lt_whole_archive_flag_spec - -# Whether the compiler copes with passing no objects directly. -compiler_needs_object=$lt_compiler_needs_object - -# Create an old-style archive from a shared archive. -old_archive_from_new_cmds=$lt_old_archive_from_new_cmds - -# Create a temporary old-style archive to link instead of a shared archive. -old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds - -# Commands used to build a shared archive. -archive_cmds=$lt_archive_cmds -archive_expsym_cmds=$lt_archive_expsym_cmds - -# Commands used to build a loadable module if different from building -# a shared archive. -module_cmds=$lt_module_cmds -module_expsym_cmds=$lt_module_expsym_cmds - -# Whether we are building with GNU ld or not. -with_gnu_ld=$lt_with_gnu_ld - -# Flag that allows shared libraries with undefined symbols to be built. -allow_undefined_flag=$lt_allow_undefined_flag - -# Flag that enforces no undefined symbols. -no_undefined_flag=$lt_no_undefined_flag - -# Flag to hardcode \$libdir into a binary during linking. -# This must work even if \$libdir does not exist -hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec - -# Whether we need a single "-rpath" flag with a separated argument. -hardcode_libdir_separator=$lt_hardcode_libdir_separator - -# Set to "yes" if using DIR/libNAME\${shared_ext} during linking hardcodes -# DIR into the resulting binary. -hardcode_direct=$hardcode_direct - -# Set to "yes" if using DIR/libNAME\${shared_ext} during linking hardcodes -# DIR into the resulting binary and the resulting library dependency is -# "absolute",i.e impossible to change by setting \${shlibpath_var} if the -# library is relocated. -hardcode_direct_absolute=$hardcode_direct_absolute - -# Set to "yes" if using the -LDIR flag during linking hardcodes DIR -# into the resulting binary. -hardcode_minus_L=$hardcode_minus_L - -# Set to "yes" if using SHLIBPATH_VAR=DIR during linking hardcodes DIR -# into the resulting binary. -hardcode_shlibpath_var=$hardcode_shlibpath_var - -# Set to "yes" if building a shared library automatically hardcodes DIR -# into the library and all subsequent libraries and executables linked -# against it. -hardcode_automatic=$hardcode_automatic - -# Set to yes if linker adds runtime paths of dependent libraries -# to runtime path list. -inherit_rpath=$inherit_rpath - -# Whether libtool must link a program against all its dependency libraries. -link_all_deplibs=$link_all_deplibs - -# Set to "yes" if exported symbols are required. -always_export_symbols=$always_export_symbols - -# The commands to list exported symbols. -export_symbols_cmds=$lt_export_symbols_cmds - -# Symbols that should not be listed in the preloaded symbols. -exclude_expsyms=$lt_exclude_expsyms - -# Symbols that must always be exported. -include_expsyms=$lt_include_expsyms - -# Commands necessary for linking programs (against libraries) with templates. -prelink_cmds=$lt_prelink_cmds - -# Commands necessary for finishing linking programs. -postlink_cmds=$lt_postlink_cmds - -# Specify filename containing input files. -file_list_spec=$lt_file_list_spec - -# How to hardcode a shared library path into an executable. -hardcode_action=$hardcode_action - -# The directories searched by this compiler when creating a shared library. -compiler_lib_search_dirs=$lt_compiler_lib_search_dirs - -# Dependencies to place before and after the objects being linked to -# create a shared library. -predep_objects=$lt_predep_objects -postdep_objects=$lt_postdep_objects -predeps=$lt_predeps -postdeps=$lt_postdeps - -# The library search path used internally by the compiler when linking -# a shared library. -compiler_lib_search_path=$lt_compiler_lib_search_path - -# ### END LIBTOOL CONFIG - -_LT_EOF - - case $host_os in - aix3*) - cat <<\_LT_EOF >> "$cfgfile" -# AIX sometimes has problems with the GCC collect2 program. For some -# reason, if we set the COLLECT_NAMES environment variable, the problems -# vanish in a puff of smoke. -if test "X${COLLECT_NAMES+set}" != Xset; then - COLLECT_NAMES= - export COLLECT_NAMES -fi -_LT_EOF - ;; - esac - - -ltmain="$ac_aux_dir/ltmain.sh" - - - # We use sed instead of cat because bash on DJGPP gets confused if - # if finds mixed CR/LF and LF-only lines. Since sed operates in - # text mode, it properly converts lines to CR/LF. This bash problem - # is reportedly fixed, but why not run on old versions too? - sed '$q' "$ltmain" >> "$cfgfile" \ - || (rm -f "$cfgfile"; exit 1) - - if test x"$xsi_shell" = xyes; then - sed -e '/^func_dirname ()$/,/^} # func_dirname /c\ -func_dirname ()\ -{\ -\ case ${1} in\ -\ */*) func_dirname_result="${1%/*}${2}" ;;\ -\ * ) func_dirname_result="${3}" ;;\ -\ esac\ -} # Extended-shell func_dirname implementation' "$cfgfile" > $cfgfile.tmp \ - && mv -f "$cfgfile.tmp" "$cfgfile" \ - || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") -test 0 -eq $? || _lt_function_replace_fail=: - - - sed -e '/^func_basename ()$/,/^} # func_basename /c\ -func_basename ()\ -{\ -\ func_basename_result="${1##*/}"\ -} # Extended-shell func_basename implementation' "$cfgfile" > $cfgfile.tmp \ - && mv -f "$cfgfile.tmp" "$cfgfile" \ - || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") -test 0 -eq $? || _lt_function_replace_fail=: - - - sed -e '/^func_dirname_and_basename ()$/,/^} # func_dirname_and_basename /c\ -func_dirname_and_basename ()\ -{\ -\ case ${1} in\ -\ */*) func_dirname_result="${1%/*}${2}" ;;\ -\ * ) func_dirname_result="${3}" ;;\ -\ esac\ -\ func_basename_result="${1##*/}"\ -} # Extended-shell func_dirname_and_basename implementation' "$cfgfile" > $cfgfile.tmp \ - && mv -f "$cfgfile.tmp" "$cfgfile" \ - || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") -test 0 -eq $? || _lt_function_replace_fail=: - - - sed -e '/^func_stripname ()$/,/^} # func_stripname /c\ -func_stripname ()\ -{\ -\ # pdksh 5.2.14 does not do ${X%$Y} correctly if both X and Y are\ -\ # positional parameters, so assign one to ordinary parameter first.\ -\ func_stripname_result=${3}\ -\ func_stripname_result=${func_stripname_result#"${1}"}\ -\ func_stripname_result=${func_stripname_result%"${2}"}\ -} # Extended-shell func_stripname implementation' "$cfgfile" > $cfgfile.tmp \ - && mv -f "$cfgfile.tmp" "$cfgfile" \ - || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") -test 0 -eq $? || _lt_function_replace_fail=: - - - sed -e '/^func_split_long_opt ()$/,/^} # func_split_long_opt /c\ -func_split_long_opt ()\ -{\ -\ func_split_long_opt_name=${1%%=*}\ -\ func_split_long_opt_arg=${1#*=}\ -} # Extended-shell func_split_long_opt implementation' "$cfgfile" > $cfgfile.tmp \ - && mv -f "$cfgfile.tmp" "$cfgfile" \ - || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") -test 0 -eq $? || _lt_function_replace_fail=: - - - sed -e '/^func_split_short_opt ()$/,/^} # func_split_short_opt /c\ -func_split_short_opt ()\ -{\ -\ func_split_short_opt_arg=${1#??}\ -\ func_split_short_opt_name=${1%"$func_split_short_opt_arg"}\ -} # Extended-shell func_split_short_opt implementation' "$cfgfile" > $cfgfile.tmp \ - && mv -f "$cfgfile.tmp" "$cfgfile" \ - || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") -test 0 -eq $? || _lt_function_replace_fail=: - - - sed -e '/^func_lo2o ()$/,/^} # func_lo2o /c\ -func_lo2o ()\ -{\ -\ case ${1} in\ -\ *.lo) func_lo2o_result=${1%.lo}.${objext} ;;\ -\ *) func_lo2o_result=${1} ;;\ -\ esac\ -} # Extended-shell func_lo2o implementation' "$cfgfile" > $cfgfile.tmp \ - && mv -f "$cfgfile.tmp" "$cfgfile" \ - || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") -test 0 -eq $? || _lt_function_replace_fail=: - - - sed -e '/^func_xform ()$/,/^} # func_xform /c\ -func_xform ()\ -{\ - func_xform_result=${1%.*}.lo\ -} # Extended-shell func_xform implementation' "$cfgfile" > $cfgfile.tmp \ - && mv -f "$cfgfile.tmp" "$cfgfile" \ - || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") -test 0 -eq $? || _lt_function_replace_fail=: - - - sed -e '/^func_arith ()$/,/^} # func_arith /c\ -func_arith ()\ -{\ - func_arith_result=$(( $* ))\ -} # Extended-shell func_arith implementation' "$cfgfile" > $cfgfile.tmp \ - && mv -f "$cfgfile.tmp" "$cfgfile" \ - || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") -test 0 -eq $? || _lt_function_replace_fail=: - - - sed -e '/^func_len ()$/,/^} # func_len /c\ -func_len ()\ -{\ - func_len_result=${#1}\ -} # Extended-shell func_len implementation' "$cfgfile" > $cfgfile.tmp \ - && mv -f "$cfgfile.tmp" "$cfgfile" \ - || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") -test 0 -eq $? || _lt_function_replace_fail=: - -fi - -if test x"$lt_shell_append" = xyes; then - sed -e '/^func_append ()$/,/^} # func_append /c\ -func_append ()\ -{\ - eval "${1}+=\\${2}"\ -} # Extended-shell func_append implementation' "$cfgfile" > $cfgfile.tmp \ - && mv -f "$cfgfile.tmp" "$cfgfile" \ - || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") -test 0 -eq $? || _lt_function_replace_fail=: - - - sed -e '/^func_append_quoted ()$/,/^} # func_append_quoted /c\ -func_append_quoted ()\ -{\ -\ func_quote_for_eval "${2}"\ -\ eval "${1}+=\\\\ \\$func_quote_for_eval_result"\ -} # Extended-shell func_append_quoted implementation' "$cfgfile" > $cfgfile.tmp \ - && mv -f "$cfgfile.tmp" "$cfgfile" \ - || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") -test 0 -eq $? || _lt_function_replace_fail=: - - - # Save a `func_append' function call where possible by direct use of '+=' - sed -e 's%func_append \([a-zA-Z_]\{1,\}\) "%\1+="%g' $cfgfile > $cfgfile.tmp \ - && mv -f "$cfgfile.tmp" "$cfgfile" \ - || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") - test 0 -eq $? || _lt_function_replace_fail=: -else - # Save a `func_append' function call even when '+=' is not available - sed -e 's%func_append \([a-zA-Z_]\{1,\}\) "%\1="$\1%g' $cfgfile > $cfgfile.tmp \ - && mv -f "$cfgfile.tmp" "$cfgfile" \ - || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") - test 0 -eq $? || _lt_function_replace_fail=: -fi - -if test x"$_lt_function_replace_fail" = x":"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Unable to substitute extended shell functions in $ofile" >&5 -$as_echo "$as_me: WARNING: Unable to substitute extended shell functions in $ofile" >&2;} -fi - - - mv -f "$cfgfile" "$ofile" || - (rm -f "$ofile" && cp "$cfgfile" "$ofile" && rm -f "$cfgfile") - chmod +x "$ofile" - - - cat <<_LT_EOF >> "$ofile" - -# ### BEGIN LIBTOOL TAG CONFIG: CXX - -# The linker used to build libraries. -LD=$lt_LD_CXX - -# How to create reloadable object files. -reload_flag=$lt_reload_flag_CXX -reload_cmds=$lt_reload_cmds_CXX - -# Commands used to build an old-style archive. -old_archive_cmds=$lt_old_archive_cmds_CXX - -# A language specific compiler. -CC=$lt_compiler_CXX - -# Is the compiler the GNU compiler? -with_gcc=$GCC_CXX - -# Compiler flag to turn off builtin functions. -no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag_CXX - -# Additional compiler flags for building library objects. -pic_flag=$lt_lt_prog_compiler_pic_CXX - -# How to pass a linker flag through the compiler. -wl=$lt_lt_prog_compiler_wl_CXX - -# Compiler flag to prevent dynamic linking. -link_static_flag=$lt_lt_prog_compiler_static_CXX - -# Does compiler simultaneously support -c and -o options? -compiler_c_o=$lt_lt_cv_prog_compiler_c_o_CXX - -# Whether or not to add -lc for building shared libraries. -build_libtool_need_lc=$archive_cmds_need_lc_CXX - -# Whether or not to disallow shared libs when runtime libs are static. -allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes_CXX - -# Compiler flag to allow reflexive dlopens. -export_dynamic_flag_spec=$lt_export_dynamic_flag_spec_CXX - -# Compiler flag to generate shared objects directly from archives. -whole_archive_flag_spec=$lt_whole_archive_flag_spec_CXX - -# Whether the compiler copes with passing no objects directly. -compiler_needs_object=$lt_compiler_needs_object_CXX - -# Create an old-style archive from a shared archive. -old_archive_from_new_cmds=$lt_old_archive_from_new_cmds_CXX - -# Create a temporary old-style archive to link instead of a shared archive. -old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds_CXX - -# Commands used to build a shared archive. -archive_cmds=$lt_archive_cmds_CXX -archive_expsym_cmds=$lt_archive_expsym_cmds_CXX - -# Commands used to build a loadable module if different from building -# a shared archive. -module_cmds=$lt_module_cmds_CXX -module_expsym_cmds=$lt_module_expsym_cmds_CXX - -# Whether we are building with GNU ld or not. -with_gnu_ld=$lt_with_gnu_ld_CXX - -# Flag that allows shared libraries with undefined symbols to be built. -allow_undefined_flag=$lt_allow_undefined_flag_CXX - -# Flag that enforces no undefined symbols. -no_undefined_flag=$lt_no_undefined_flag_CXX - -# Flag to hardcode \$libdir into a binary during linking. -# This must work even if \$libdir does not exist -hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec_CXX - -# Whether we need a single "-rpath" flag with a separated argument. -hardcode_libdir_separator=$lt_hardcode_libdir_separator_CXX - -# Set to "yes" if using DIR/libNAME\${shared_ext} during linking hardcodes -# DIR into the resulting binary. -hardcode_direct=$hardcode_direct_CXX - -# Set to "yes" if using DIR/libNAME\${shared_ext} during linking hardcodes -# DIR into the resulting binary and the resulting library dependency is -# "absolute",i.e impossible to change by setting \${shlibpath_var} if the -# library is relocated. -hardcode_direct_absolute=$hardcode_direct_absolute_CXX - -# Set to "yes" if using the -LDIR flag during linking hardcodes DIR -# into the resulting binary. -hardcode_minus_L=$hardcode_minus_L_CXX - -# Set to "yes" if using SHLIBPATH_VAR=DIR during linking hardcodes DIR -# into the resulting binary. -hardcode_shlibpath_var=$hardcode_shlibpath_var_CXX - -# Set to "yes" if building a shared library automatically hardcodes DIR -# into the library and all subsequent libraries and executables linked -# against it. -hardcode_automatic=$hardcode_automatic_CXX - -# Set to yes if linker adds runtime paths of dependent libraries -# to runtime path list. -inherit_rpath=$inherit_rpath_CXX - -# Whether libtool must link a program against all its dependency libraries. -link_all_deplibs=$link_all_deplibs_CXX - -# Set to "yes" if exported symbols are required. -always_export_symbols=$always_export_symbols_CXX - -# The commands to list exported symbols. -export_symbols_cmds=$lt_export_symbols_cmds_CXX - -# Symbols that should not be listed in the preloaded symbols. -exclude_expsyms=$lt_exclude_expsyms_CXX - -# Symbols that must always be exported. -include_expsyms=$lt_include_expsyms_CXX - -# Commands necessary for linking programs (against libraries) with templates. -prelink_cmds=$lt_prelink_cmds_CXX - -# Commands necessary for finishing linking programs. -postlink_cmds=$lt_postlink_cmds_CXX - -# Specify filename containing input files. -file_list_spec=$lt_file_list_spec_CXX - -# How to hardcode a shared library path into an executable. -hardcode_action=$hardcode_action_CXX - -# The directories searched by this compiler when creating a shared library. -compiler_lib_search_dirs=$lt_compiler_lib_search_dirs_CXX - -# Dependencies to place before and after the objects being linked to -# create a shared library. -predep_objects=$lt_predep_objects_CXX -postdep_objects=$lt_postdep_objects_CXX -predeps=$lt_predeps_CXX -postdeps=$lt_postdeps_CXX - -# The library search path used internally by the compiler when linking -# a shared library. -compiler_lib_search_path=$lt_compiler_lib_search_path_CXX - -# ### END LIBTOOL TAG CONFIG: CXX -_LT_EOF - - ;; - - esac -done # for ac_tag - - -as_fn_exit 0 -_ACEOF -ac_clean_files=$ac_clean_files_save - -test $ac_write_fail = 0 || - as_fn_error $? "write failure creating $CONFIG_STATUS" "$LINENO" 5 - - -# configure is writing to config.log, and then calls config.status. -# config.status does its own redirection, appending to config.log. -# Unfortunately, on DOS this fails, as config.log is still kept open -# by configure, so config.status won't be able to write to it; its -# output is simply discarded. So we exec the FD to /dev/null, -# effectively closing config.log, so it can be properly (re)opened and -# appended to by config.status. When coming back to configure, we -# need to make the FD available again. -if test "$no_create" != yes; then - ac_cs_success=: - ac_config_status_args= - test "$silent" = yes && - ac_config_status_args="$ac_config_status_args --quiet" - exec 5>/dev/null - $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false - exec 5>>config.log - # Use ||, not &&, to avoid exiting from the if with $? = 1, which - # would make configure fail if this is the last instruction. - $ac_cs_success || as_fn_exit 1 -fi -if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5 -$as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;} -fi - diff --git a/pkg/registry/zookeeper-3.4.6/src/c/autom4te.cache/output.3 b/pkg/registry/zookeeper-3.4.6/src/c/autom4te.cache/output.3 deleted file mode 100644 index 2ec15cfb8..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/c/autom4te.cache/output.3 +++ /dev/null @@ -1,20617 +0,0 @@ -@%:@! /bin/sh -@%:@ Guess values for system-dependent variables and create Makefiles. -@%:@ Generated by GNU Autoconf 2.69 for zookeeper C client 3.4.6. -@%:@ -@%:@ Report bugs to . -@%:@ -@%:@ -@%:@ Copyright (C) 1992-1996, 1998-2012 Free Software Foundation, Inc. -@%:@ -@%:@ -@%:@ This configure script is free software; the Free Software Foundation -@%:@ gives unlimited permission to copy, distribute and modify it. -## -------------------- ## -## M4sh Initialization. ## -## -------------------- ## - -# Be more Bourne compatible -DUALCASE=1; export DUALCASE # for MKS sh -if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : - emulate sh - NULLCMD=: - # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which - # is contrary to our usage. Disable this feature. - alias -g '${1+"$@"}'='"$@"' - setopt NO_GLOB_SUBST -else - case `(set -o) 2>/dev/null` in @%:@( - *posix*) : - set -o posix ;; @%:@( - *) : - ;; -esac -fi - - -as_nl=' -' -export as_nl -# Printing a long string crashes Solaris 7 /usr/bin/printf. -as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' -as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo -as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo -# Prefer a ksh shell builtin over an external printf program on Solaris, -# but without wasting forks for bash or zsh. -if test -z "$BASH_VERSION$ZSH_VERSION" \ - && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then - as_echo='print -r --' - as_echo_n='print -rn --' -elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then - as_echo='printf %s\n' - as_echo_n='printf %s' -else - if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then - as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' - as_echo_n='/usr/ucb/echo -n' - else - as_echo_body='eval expr "X$1" : "X\\(.*\\)"' - as_echo_n_body='eval - arg=$1; - case $arg in @%:@( - *"$as_nl"*) - expr "X$arg" : "X\\(.*\\)$as_nl"; - arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; - esac; - expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" - ' - export as_echo_n_body - as_echo_n='sh -c $as_echo_n_body as_echo' - fi - export as_echo_body - as_echo='sh -c $as_echo_body as_echo' -fi - -# The user is always right. -if test "${PATH_SEPARATOR+set}" != set; then - PATH_SEPARATOR=: - (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { - (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || - PATH_SEPARATOR=';' - } -fi - - -# IFS -# We need space, tab and new line, in precisely that order. Quoting is -# there to prevent editors from complaining about space-tab. -# (If _AS_PATH_WALK were called with IFS unset, it would disable word -# splitting by setting IFS to empty value.) -IFS=" "" $as_nl" - -# Find who we are. Look in the path if we contain no directory separator. -as_myself= -case $0 in @%:@(( - *[\\/]* ) as_myself=$0 ;; - *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break - done -IFS=$as_save_IFS - - ;; -esac -# We did not find ourselves, most probably we were run as `sh COMMAND' -# in which case we are not to be found in the path. -if test "x$as_myself" = x; then - as_myself=$0 -fi -if test ! -f "$as_myself"; then - $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 - exit 1 -fi - -# Unset variables that we do not need and which cause bugs (e.g. in -# pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" -# suppresses any "Segmentation fault" message there. '((' could -# trigger a bug in pdksh 5.2.14. -for as_var in BASH_ENV ENV MAIL MAILPATH -do eval test x\${$as_var+set} = xset \ - && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : -done -PS1='$ ' -PS2='> ' -PS4='+ ' - -# NLS nuisances. -LC_ALL=C -export LC_ALL -LANGUAGE=C -export LANGUAGE - -# CDPATH. -(unset CDPATH) >/dev/null 2>&1 && unset CDPATH - -# Use a proper internal environment variable to ensure we don't fall - # into an infinite loop, continuously re-executing ourselves. - if test x"${_as_can_reexec}" != xno && test "x$CONFIG_SHELL" != x; then - _as_can_reexec=no; export _as_can_reexec; - # We cannot yet assume a decent shell, so we have to provide a -# neutralization value for shells without unset; and this also -# works around shells that cannot unset nonexistent variables. -# Preserve -v and -x to the replacement shell. -BASH_ENV=/dev/null -ENV=/dev/null -(unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV -case $- in @%:@ (((( - *v*x* | *x*v* ) as_opts=-vx ;; - *v* ) as_opts=-v ;; - *x* ) as_opts=-x ;; - * ) as_opts= ;; -esac -exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} -# Admittedly, this is quite paranoid, since all the known shells bail -# out after a failed `exec'. -$as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2 -as_fn_exit 255 - fi - # We don't want this to propagate to other subprocesses. - { _as_can_reexec=; unset _as_can_reexec;} -if test "x$CONFIG_SHELL" = x; then - as_bourne_compatible="if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then : - emulate sh - NULLCMD=: - # Pre-4.2 versions of Zsh do word splitting on \${1+\"\$@\"}, which - # is contrary to our usage. Disable this feature. - alias -g '\${1+\"\$@\"}'='\"\$@\"' - setopt NO_GLOB_SUBST -else - case \`(set -o) 2>/dev/null\` in @%:@( - *posix*) : - set -o posix ;; @%:@( - *) : - ;; -esac -fi -" - as_required="as_fn_return () { (exit \$1); } -as_fn_success () { as_fn_return 0; } -as_fn_failure () { as_fn_return 1; } -as_fn_ret_success () { return 0; } -as_fn_ret_failure () { return 1; } - -exitcode=0 -as_fn_success || { exitcode=1; echo as_fn_success failed.; } -as_fn_failure && { exitcode=1; echo as_fn_failure succeeded.; } -as_fn_ret_success || { exitcode=1; echo as_fn_ret_success failed.; } -as_fn_ret_failure && { exitcode=1; echo as_fn_ret_failure succeeded.; } -if ( set x; as_fn_ret_success y && test x = \"\$1\" ); then : - -else - exitcode=1; echo positional parameters were not saved. -fi -test x\$exitcode = x0 || exit 1 -test -x / || exit 1" - as_suggested=" as_lineno_1=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_1a=\$LINENO - as_lineno_2=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_2a=\$LINENO - eval 'test \"x\$as_lineno_1'\$as_run'\" != \"x\$as_lineno_2'\$as_run'\" && - test \"x\`expr \$as_lineno_1'\$as_run' + 1\`\" = \"x\$as_lineno_2'\$as_run'\"' || exit 1 - - test -n \"\${ZSH_VERSION+set}\${BASH_VERSION+set}\" || ( - ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' - ECHO=\$ECHO\$ECHO\$ECHO\$ECHO\$ECHO - ECHO=\$ECHO\$ECHO\$ECHO\$ECHO\$ECHO\$ECHO - PATH=/empty FPATH=/empty; export PATH FPATH - test \"X\`printf %s \$ECHO\`\" = \"X\$ECHO\" \\ - || test \"X\`print -r -- \$ECHO\`\" = \"X\$ECHO\" ) || exit 1 -test \$(( 1 + 1 )) = 2 || exit 1" - if (eval "$as_required") 2>/dev/null; then : - as_have_required=yes -else - as_have_required=no -fi - if test x$as_have_required = xyes && (eval "$as_suggested") 2>/dev/null; then : - -else - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -as_found=false -for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - as_found=: - case $as_dir in @%:@( - /*) - for as_base in sh bash ksh sh5; do - # Try only shells that exist, to save several forks. - as_shell=$as_dir/$as_base - if { test -f "$as_shell" || test -f "$as_shell.exe"; } && - { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$as_shell"; } 2>/dev/null; then : - CONFIG_SHELL=$as_shell as_have_required=yes - if { $as_echo "$as_bourne_compatible""$as_suggested" | as_run=a "$as_shell"; } 2>/dev/null; then : - break 2 -fi -fi - done;; - esac - as_found=false -done -$as_found || { if { test -f "$SHELL" || test -f "$SHELL.exe"; } && - { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$SHELL"; } 2>/dev/null; then : - CONFIG_SHELL=$SHELL as_have_required=yes -fi; } -IFS=$as_save_IFS - - - if test "x$CONFIG_SHELL" != x; then : - export CONFIG_SHELL - # We cannot yet assume a decent shell, so we have to provide a -# neutralization value for shells without unset; and this also -# works around shells that cannot unset nonexistent variables. -# Preserve -v and -x to the replacement shell. -BASH_ENV=/dev/null -ENV=/dev/null -(unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV -case $- in @%:@ (((( - *v*x* | *x*v* ) as_opts=-vx ;; - *v* ) as_opts=-v ;; - *x* ) as_opts=-x ;; - * ) as_opts= ;; -esac -exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} -# Admittedly, this is quite paranoid, since all the known shells bail -# out after a failed `exec'. -$as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2 -exit 255 -fi - - if test x$as_have_required = xno; then : - $as_echo "$0: This script requires a shell more modern than all" - $as_echo "$0: the shells that I found on your system." - if test x${ZSH_VERSION+set} = xset ; then - $as_echo "$0: In particular, zsh $ZSH_VERSION has bugs and should" - $as_echo "$0: be upgraded to zsh 4.3.4 or later." - else - $as_echo "$0: Please tell bug-autoconf@gnu.org and -$0: user@zookeeper.apache.org about your system, including -$0: any error possibly output before this message. Then -$0: install a modern shell, or manually run the script -$0: under such a shell if you do have one." - fi - exit 1 -fi -fi -fi -SHELL=${CONFIG_SHELL-/bin/sh} -export SHELL -# Unset more variables known to interfere with behavior of common tools. -CLICOLOR_FORCE= GREP_OPTIONS= -unset CLICOLOR_FORCE GREP_OPTIONS - -## --------------------- ## -## M4sh Shell Functions. ## -## --------------------- ## -@%:@ as_fn_unset VAR -@%:@ --------------- -@%:@ Portably unset VAR. -as_fn_unset () -{ - { eval $1=; unset $1;} -} -as_unset=as_fn_unset - -@%:@ as_fn_set_status STATUS -@%:@ ----------------------- -@%:@ Set @S|@? to STATUS, without forking. -as_fn_set_status () -{ - return $1 -} @%:@ as_fn_set_status - -@%:@ as_fn_exit STATUS -@%:@ ----------------- -@%:@ Exit the shell with STATUS, even in a "trap 0" or "set -e" context. -as_fn_exit () -{ - set +e - as_fn_set_status $1 - exit $1 -} @%:@ as_fn_exit - -@%:@ as_fn_mkdir_p -@%:@ ------------- -@%:@ Create "@S|@as_dir" as a directory, including parents if necessary. -as_fn_mkdir_p () -{ - - case $as_dir in #( - -*) as_dir=./$as_dir;; - esac - test -d "$as_dir" || eval $as_mkdir_p || { - as_dirs= - while :; do - case $as_dir in #( - *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( - *) as_qdir=$as_dir;; - esac - as_dirs="'$as_qdir' $as_dirs" - as_dir=`$as_dirname -- "$as_dir" || -$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ - X"$as_dir" : 'X\(//\)[^/]' \| \ - X"$as_dir" : 'X\(//\)$' \| \ - X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || -$as_echo X"$as_dir" | - sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ - s//\1/ - q - } - /^X\(\/\/\)[^/].*/{ - s//\1/ - q - } - /^X\(\/\/\)$/{ - s//\1/ - q - } - /^X\(\/\).*/{ - s//\1/ - q - } - s/.*/./; q'` - test -d "$as_dir" && break - done - test -z "$as_dirs" || eval "mkdir $as_dirs" - } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" - - -} @%:@ as_fn_mkdir_p - -@%:@ as_fn_executable_p FILE -@%:@ ----------------------- -@%:@ Test if FILE is an executable regular file. -as_fn_executable_p () -{ - test -f "$1" && test -x "$1" -} @%:@ as_fn_executable_p -@%:@ as_fn_append VAR VALUE -@%:@ ---------------------- -@%:@ Append the text in VALUE to the end of the definition contained in VAR. Take -@%:@ advantage of any shell optimizations that allow amortized linear growth over -@%:@ repeated appends, instead of the typical quadratic growth present in naive -@%:@ implementations. -if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : - eval 'as_fn_append () - { - eval $1+=\$2 - }' -else - as_fn_append () - { - eval $1=\$$1\$2 - } -fi # as_fn_append - -@%:@ as_fn_arith ARG... -@%:@ ------------------ -@%:@ Perform arithmetic evaluation on the ARGs, and store the result in the -@%:@ global @S|@as_val. Take advantage of shells that can avoid forks. The arguments -@%:@ must be portable across @S|@(()) and expr. -if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : - eval 'as_fn_arith () - { - as_val=$(( $* )) - }' -else - as_fn_arith () - { - as_val=`expr "$@" || test $? -eq 1` - } -fi # as_fn_arith - - -@%:@ as_fn_error STATUS ERROR [LINENO LOG_FD] -@%:@ ---------------------------------------- -@%:@ Output "`basename @S|@0`: error: ERROR" to stderr. If LINENO and LOG_FD are -@%:@ provided, also output the error to LOG_FD, referencing LINENO. Then exit the -@%:@ script with STATUS, using 1 if that was 0. -as_fn_error () -{ - as_status=$1; test $as_status -eq 0 && as_status=1 - if test "$4"; then - as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack - $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 - fi - $as_echo "$as_me: error: $2" >&2 - as_fn_exit $as_status -} @%:@ as_fn_error - -if expr a : '\(a\)' >/dev/null 2>&1 && - test "X`expr 00001 : '.*\(...\)'`" = X001; then - as_expr=expr -else - as_expr=false -fi - -if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then - as_basename=basename -else - as_basename=false -fi - -if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then - as_dirname=dirname -else - as_dirname=false -fi - -as_me=`$as_basename -- "$0" || -$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ - X"$0" : 'X\(//\)$' \| \ - X"$0" : 'X\(/\)' \| . 2>/dev/null || -$as_echo X/"$0" | - sed '/^.*\/\([^/][^/]*\)\/*$/{ - s//\1/ - q - } - /^X\/\(\/\/\)$/{ - s//\1/ - q - } - /^X\/\(\/\).*/{ - s//\1/ - q - } - s/.*/./; q'` - -# Avoid depending upon Character Ranges. -as_cr_letters='abcdefghijklmnopqrstuvwxyz' -as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' -as_cr_Letters=$as_cr_letters$as_cr_LETTERS -as_cr_digits='0123456789' -as_cr_alnum=$as_cr_Letters$as_cr_digits - - - as_lineno_1=$LINENO as_lineno_1a=$LINENO - as_lineno_2=$LINENO as_lineno_2a=$LINENO - eval 'test "x$as_lineno_1'$as_run'" != "x$as_lineno_2'$as_run'" && - test "x`expr $as_lineno_1'$as_run' + 1`" = "x$as_lineno_2'$as_run'"' || { - # Blame Lee E. McMahon (1931-1989) for sed's syntax. :-) - sed -n ' - p - /[$]LINENO/= - ' <$as_myself | - sed ' - s/[$]LINENO.*/&-/ - t lineno - b - :lineno - N - :loop - s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/ - t loop - s/-\n.*// - ' >$as_me.lineno && - chmod +x "$as_me.lineno" || - { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; } - - # If we had to re-execute with $CONFIG_SHELL, we're ensured to have - # already done that, so ensure we don't try to do so again and fall - # in an infinite loop. This has already happened in practice. - _as_can_reexec=no; export _as_can_reexec - # Don't try to exec as it changes $[0], causing all sort of problems - # (the dirname of $[0] is not the place where we might find the - # original and so on. Autoconf is especially sensitive to this). - . "./$as_me.lineno" - # Exit status is that of the last command. - exit -} - -ECHO_C= ECHO_N= ECHO_T= -case `echo -n x` in @%:@((((( --n*) - case `echo 'xy\c'` in - *c*) ECHO_T=' ';; # ECHO_T is single tab character. - xy) ECHO_C='\c';; - *) echo `echo ksh88 bug on AIX 6.1` > /dev/null - ECHO_T=' ';; - esac;; -*) - ECHO_N='-n';; -esac - -rm -f conf$$ conf$$.exe conf$$.file -if test -d conf$$.dir; then - rm -f conf$$.dir/conf$$.file -else - rm -f conf$$.dir - mkdir conf$$.dir 2>/dev/null -fi -if (echo >conf$$.file) 2>/dev/null; then - if ln -s conf$$.file conf$$ 2>/dev/null; then - as_ln_s='ln -s' - # ... but there are two gotchas: - # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. - # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. - # In both cases, we have to default to `cp -pR'. - ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || - as_ln_s='cp -pR' - elif ln conf$$.file conf$$ 2>/dev/null; then - as_ln_s=ln - else - as_ln_s='cp -pR' - fi -else - as_ln_s='cp -pR' -fi -rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file -rmdir conf$$.dir 2>/dev/null - -if mkdir -p . 2>/dev/null; then - as_mkdir_p='mkdir -p "$as_dir"' -else - test -d ./-p && rmdir ./-p - as_mkdir_p=false -fi - -as_test_x='test -x' -as_executable_p=as_fn_executable_p - -# Sed expression to map a string onto a valid CPP name. -as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" - -# Sed expression to map a string onto a valid variable name. -as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" - -SHELL=${CONFIG_SHELL-/bin/sh} - - -test -n "$DJDIR" || exec 7<&0 &1 - -# Name of the host. -# hostname on some systems (SVR3.2, old GNU/Linux) returns a bogus exit status, -# so uname gets run too. -ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q` - -# -# Initializations. -# -ac_default_prefix=/usr/local -ac_clean_files= -ac_config_libobj_dir=. -LIB@&t@OBJS= -cross_compiling=no -subdirs= -MFLAGS= -MAKEFLAGS= - -# Identity of this package. -PACKAGE_NAME='zookeeper C client' -PACKAGE_TARNAME='zookeeper' -PACKAGE_VERSION='3.4.6' -PACKAGE_STRING='zookeeper C client 3.4.6' -PACKAGE_BUGREPORT='user@zookeeper.apache.org' -PACKAGE_URL='' - -ac_unique_file="src/zookeeper.c" -# Factoring default headers for most tests. -ac_includes_default="\ -#include -#ifdef HAVE_SYS_TYPES_H -# include -#endif -#ifdef HAVE_SYS_STAT_H -# include -#endif -#ifdef STDC_HEADERS -# include -# include -#else -# ifdef HAVE_STDLIB_H -# include -# endif -#endif -#ifdef HAVE_STRING_H -# if !defined STDC_HEADERS && defined HAVE_MEMORY_H -# include -# endif -# include -#endif -#ifdef HAVE_STRINGS_H -# include -#endif -#ifdef HAVE_INTTYPES_H -# include -#endif -#ifdef HAVE_STDINT_H -# include -#endif -#ifdef HAVE_UNISTD_H -# include -#endif" - -ac_subst_vars='am__EXEEXT_FALSE -am__EXEEXT_TRUE -LTLIBOBJS -LIB@&t@OBJS -USEIPV6 -WANT_SYNCAPI_FALSE -WANT_SYNCAPI_TRUE -CXXCPP -CPP -OTOOL64 -OTOOL -LIPO -NMEDIT -DSYMUTIL -MANIFEST_TOOL -RANLIB -ac_ct_AR -AR -DLLTOOL -OBJDUMP -NM -ac_ct_DUMPBIN -DUMPBIN -LD -FGREP -EGREP -GREP -SED -host_os -host_vendor -host_cpu -host -build_os -build_vendor -build_cpu -build -LIBTOOL -LN_S -am__fastdepCXX_FALSE -am__fastdepCXX_TRUE -CXXDEPMODE -ac_ct_CXX -CXXFLAGS -CXX -am__fastdepCC_FALSE -am__fastdepCC_TRUE -CCDEPMODE -am__nodep -AMDEPBACKSLASH -AMDEP_FALSE -AMDEP_TRUE -am__quote -am__include -DEPDIR -OBJEXT -EXEEXT -ac_ct_CC -CPPFLAGS -LDFLAGS -CFLAGS -CC -CPPUNIT_LIBS -CPPUNIT_CFLAGS -CPPUNIT_CONFIG -am__untar -am__tar -AMTAR -am__leading_dot -SET_MAKE -AWK -mkdir_p -MKDIR_P -INSTALL_STRIP_PROGRAM -STRIP -install_sh -MAKEINFO -AUTOHEADER -AUTOMAKE -AUTOCONF -ACLOCAL -VERSION -PACKAGE -CYGPATH_W -am__isrc -INSTALL_DATA -INSTALL_SCRIPT -INSTALL_PROGRAM -DOXYGEN_PAPER_SIZE -DX_COND_latex_FALSE -DX_COND_latex_TRUE -DX_COND_pdf_FALSE -DX_COND_pdf_TRUE -DX_PDFLATEX -DX_FLAG_pdf -DX_COND_ps_FALSE -DX_COND_ps_TRUE -DX_EGREP -DX_DVIPS -DX_MAKEINDEX -DX_LATEX -DX_FLAG_ps -DX_COND_html_FALSE -DX_COND_html_TRUE -DX_FLAG_html -DX_COND_chi_FALSE -DX_COND_chi_TRUE -DX_FLAG_chi -DX_COND_chm_FALSE -DX_COND_chm_TRUE -DX_HHC -DX_FLAG_chm -DX_COND_xml_FALSE -DX_COND_xml_TRUE -DX_FLAG_xml -DX_COND_rtf_FALSE -DX_COND_rtf_TRUE -DX_FLAG_rtf -DX_COND_man_FALSE -DX_COND_man_TRUE -DX_FLAG_man -DX_COND_dot_FALSE -DX_COND_dot_TRUE -DX_DOT -DX_FLAG_dot -DX_COND_doc_FALSE -DX_COND_doc_TRUE -DX_PERL -DX_DOXYGEN -DX_FLAG_doc -DX_ENV -DX_DOCDIR -DX_CONFIG -DX_PROJECT -target_alias -host_alias -build_alias -LIBS -ECHO_T -ECHO_N -ECHO_C -DEFS -mandir -localedir -libdir -psdir -pdfdir -dvidir -htmldir -infodir -docdir -oldincludedir -includedir -localstatedir -sharedstatedir -sysconfdir -datadir -datarootdir -libexecdir -sbindir -bindir -program_transform_name -prefix -exec_prefix -PACKAGE_URL -PACKAGE_BUGREPORT -PACKAGE_STRING -PACKAGE_VERSION -PACKAGE_TARNAME -PACKAGE_NAME -PATH_SEPARATOR -SHELL' -ac_subst_files='' -ac_user_opts=' -enable_option_checking -enable_doxygen_doc -enable_doxygen_dot -enable_doxygen_man -enable_doxygen_rtf -enable_doxygen_xml -enable_doxygen_chm -enable_doxygen_chi -enable_doxygen_html -enable_doxygen_ps -enable_doxygen_pdf -with_cppunit -with_cppunit_prefix -with_cppunit_exec_prefix -enable_dependency_tracking -enable_shared -enable_static -with_pic -enable_fast_install -with_gnu_ld -with_sysroot -enable_libtool_lock -enable_debug -with_syncapi -' - ac_precious_vars='build_alias -host_alias -target_alias -DOXYGEN_PAPER_SIZE -CC -CFLAGS -LDFLAGS -LIBS -CPPFLAGS -CXX -CXXFLAGS -CCC -CPP -CXXCPP' - - -# Initialize some variables set by options. -ac_init_help= -ac_init_version=false -ac_unrecognized_opts= -ac_unrecognized_sep= -# The variables have the same names as the options, with -# dashes changed to underlines. -cache_file=/dev/null -exec_prefix=NONE -no_create= -no_recursion= -prefix=NONE -program_prefix=NONE -program_suffix=NONE -program_transform_name=s,x,x, -silent= -site= -srcdir= -verbose= -x_includes=NONE -x_libraries=NONE - -# Installation directory options. -# These are left unexpanded so users can "make install exec_prefix=/foo" -# and all the variables that are supposed to be based on exec_prefix -# by default will actually change. -# Use braces instead of parens because sh, perl, etc. also accept them. -# (The list follows the same order as the GNU Coding Standards.) -bindir='${exec_prefix}/bin' -sbindir='${exec_prefix}/sbin' -libexecdir='${exec_prefix}/libexec' -datarootdir='${prefix}/share' -datadir='${datarootdir}' -sysconfdir='${prefix}/etc' -sharedstatedir='${prefix}/com' -localstatedir='${prefix}/var' -includedir='${prefix}/include' -oldincludedir='/usr/include' -docdir='${datarootdir}/doc/${PACKAGE_TARNAME}' -infodir='${datarootdir}/info' -htmldir='${docdir}' -dvidir='${docdir}' -pdfdir='${docdir}' -psdir='${docdir}' -libdir='${exec_prefix}/lib' -localedir='${datarootdir}/locale' -mandir='${datarootdir}/man' - -ac_prev= -ac_dashdash= -for ac_option -do - # If the previous option needs an argument, assign it. - if test -n "$ac_prev"; then - eval $ac_prev=\$ac_option - ac_prev= - continue - fi - - case $ac_option in - *=?*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;; - *=) ac_optarg= ;; - *) ac_optarg=yes ;; - esac - - # Accept the important Cygnus configure options, so we can diagnose typos. - - case $ac_dashdash$ac_option in - --) - ac_dashdash=yes ;; - - -bindir | --bindir | --bindi | --bind | --bin | --bi) - ac_prev=bindir ;; - -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*) - bindir=$ac_optarg ;; - - -build | --build | --buil | --bui | --bu) - ac_prev=build_alias ;; - -build=* | --build=* | --buil=* | --bui=* | --bu=*) - build_alias=$ac_optarg ;; - - -cache-file | --cache-file | --cache-fil | --cache-fi \ - | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c) - ac_prev=cache_file ;; - -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \ - | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*) - cache_file=$ac_optarg ;; - - --config-cache | -C) - cache_file=config.cache ;; - - -datadir | --datadir | --datadi | --datad) - ac_prev=datadir ;; - -datadir=* | --datadir=* | --datadi=* | --datad=*) - datadir=$ac_optarg ;; - - -datarootdir | --datarootdir | --datarootdi | --datarootd | --dataroot \ - | --dataroo | --dataro | --datar) - ac_prev=datarootdir ;; - -datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \ - | --dataroot=* | --dataroo=* | --dataro=* | --datar=*) - datarootdir=$ac_optarg ;; - - -disable-* | --disable-*) - ac_useropt=`expr "x$ac_option" : 'x-*disable-\(.*\)'` - # Reject names that are not valid shell variable names. - expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && - as_fn_error $? "invalid feature name: $ac_useropt" - ac_useropt_orig=$ac_useropt - ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` - case $ac_user_opts in - *" -"enable_$ac_useropt" -"*) ;; - *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--disable-$ac_useropt_orig" - ac_unrecognized_sep=', ';; - esac - eval enable_$ac_useropt=no ;; - - -docdir | --docdir | --docdi | --doc | --do) - ac_prev=docdir ;; - -docdir=* | --docdir=* | --docdi=* | --doc=* | --do=*) - docdir=$ac_optarg ;; - - -dvidir | --dvidir | --dvidi | --dvid | --dvi | --dv) - ac_prev=dvidir ;; - -dvidir=* | --dvidir=* | --dvidi=* | --dvid=* | --dvi=* | --dv=*) - dvidir=$ac_optarg ;; - - -enable-* | --enable-*) - ac_useropt=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'` - # Reject names that are not valid shell variable names. - expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && - as_fn_error $? "invalid feature name: $ac_useropt" - ac_useropt_orig=$ac_useropt - ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` - case $ac_user_opts in - *" -"enable_$ac_useropt" -"*) ;; - *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--enable-$ac_useropt_orig" - ac_unrecognized_sep=', ';; - esac - eval enable_$ac_useropt=\$ac_optarg ;; - - -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \ - | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \ - | --exec | --exe | --ex) - ac_prev=exec_prefix ;; - -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \ - | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \ - | --exec=* | --exe=* | --ex=*) - exec_prefix=$ac_optarg ;; - - -gas | --gas | --ga | --g) - # Obsolete; use --with-gas. - with_gas=yes ;; - - -help | --help | --hel | --he | -h) - ac_init_help=long ;; - -help=r* | --help=r* | --hel=r* | --he=r* | -hr*) - ac_init_help=recursive ;; - -help=s* | --help=s* | --hel=s* | --he=s* | -hs*) - ac_init_help=short ;; - - -host | --host | --hos | --ho) - ac_prev=host_alias ;; - -host=* | --host=* | --hos=* | --ho=*) - host_alias=$ac_optarg ;; - - -htmldir | --htmldir | --htmldi | --htmld | --html | --htm | --ht) - ac_prev=htmldir ;; - -htmldir=* | --htmldir=* | --htmldi=* | --htmld=* | --html=* | --htm=* \ - | --ht=*) - htmldir=$ac_optarg ;; - - -includedir | --includedir | --includedi | --included | --include \ - | --includ | --inclu | --incl | --inc) - ac_prev=includedir ;; - -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \ - | --includ=* | --inclu=* | --incl=* | --inc=*) - includedir=$ac_optarg ;; - - -infodir | --infodir | --infodi | --infod | --info | --inf) - ac_prev=infodir ;; - -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*) - infodir=$ac_optarg ;; - - -libdir | --libdir | --libdi | --libd) - ac_prev=libdir ;; - -libdir=* | --libdir=* | --libdi=* | --libd=*) - libdir=$ac_optarg ;; - - -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \ - | --libexe | --libex | --libe) - ac_prev=libexecdir ;; - -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \ - | --libexe=* | --libex=* | --libe=*) - libexecdir=$ac_optarg ;; - - -localedir | --localedir | --localedi | --localed | --locale) - ac_prev=localedir ;; - -localedir=* | --localedir=* | --localedi=* | --localed=* | --locale=*) - localedir=$ac_optarg ;; - - -localstatedir | --localstatedir | --localstatedi | --localstated \ - | --localstate | --localstat | --localsta | --localst | --locals) - ac_prev=localstatedir ;; - -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \ - | --localstate=* | --localstat=* | --localsta=* | --localst=* | --locals=*) - localstatedir=$ac_optarg ;; - - -mandir | --mandir | --mandi | --mand | --man | --ma | --m) - ac_prev=mandir ;; - -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*) - mandir=$ac_optarg ;; - - -nfp | --nfp | --nf) - # Obsolete; use --without-fp. - with_fp=no ;; - - -no-create | --no-create | --no-creat | --no-crea | --no-cre \ - | --no-cr | --no-c | -n) - no_create=yes ;; - - -no-recursion | --no-recursion | --no-recursio | --no-recursi \ - | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) - no_recursion=yes ;; - - -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \ - | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \ - | --oldin | --oldi | --old | --ol | --o) - ac_prev=oldincludedir ;; - -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \ - | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \ - | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*) - oldincludedir=$ac_optarg ;; - - -prefix | --prefix | --prefi | --pref | --pre | --pr | --p) - ac_prev=prefix ;; - -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*) - prefix=$ac_optarg ;; - - -program-prefix | --program-prefix | --program-prefi | --program-pref \ - | --program-pre | --program-pr | --program-p) - ac_prev=program_prefix ;; - -program-prefix=* | --program-prefix=* | --program-prefi=* \ - | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*) - program_prefix=$ac_optarg ;; - - -program-suffix | --program-suffix | --program-suffi | --program-suff \ - | --program-suf | --program-su | --program-s) - ac_prev=program_suffix ;; - -program-suffix=* | --program-suffix=* | --program-suffi=* \ - | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*) - program_suffix=$ac_optarg ;; - - -program-transform-name | --program-transform-name \ - | --program-transform-nam | --program-transform-na \ - | --program-transform-n | --program-transform- \ - | --program-transform | --program-transfor \ - | --program-transfo | --program-transf \ - | --program-trans | --program-tran \ - | --progr-tra | --program-tr | --program-t) - ac_prev=program_transform_name ;; - -program-transform-name=* | --program-transform-name=* \ - | --program-transform-nam=* | --program-transform-na=* \ - | --program-transform-n=* | --program-transform-=* \ - | --program-transform=* | --program-transfor=* \ - | --program-transfo=* | --program-transf=* \ - | --program-trans=* | --program-tran=* \ - | --progr-tra=* | --program-tr=* | --program-t=*) - program_transform_name=$ac_optarg ;; - - -pdfdir | --pdfdir | --pdfdi | --pdfd | --pdf | --pd) - ac_prev=pdfdir ;; - -pdfdir=* | --pdfdir=* | --pdfdi=* | --pdfd=* | --pdf=* | --pd=*) - pdfdir=$ac_optarg ;; - - -psdir | --psdir | --psdi | --psd | --ps) - ac_prev=psdir ;; - -psdir=* | --psdir=* | --psdi=* | --psd=* | --ps=*) - psdir=$ac_optarg ;; - - -q | -quiet | --quiet | --quie | --qui | --qu | --q \ - | -silent | --silent | --silen | --sile | --sil) - silent=yes ;; - - -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb) - ac_prev=sbindir ;; - -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \ - | --sbi=* | --sb=*) - sbindir=$ac_optarg ;; - - -sharedstatedir | --sharedstatedir | --sharedstatedi \ - | --sharedstated | --sharedstate | --sharedstat | --sharedsta \ - | --sharedst | --shareds | --shared | --share | --shar \ - | --sha | --sh) - ac_prev=sharedstatedir ;; - -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \ - | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \ - | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \ - | --sha=* | --sh=*) - sharedstatedir=$ac_optarg ;; - - -site | --site | --sit) - ac_prev=site ;; - -site=* | --site=* | --sit=*) - site=$ac_optarg ;; - - -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) - ac_prev=srcdir ;; - -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) - srcdir=$ac_optarg ;; - - -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \ - | --syscon | --sysco | --sysc | --sys | --sy) - ac_prev=sysconfdir ;; - -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \ - | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*) - sysconfdir=$ac_optarg ;; - - -target | --target | --targe | --targ | --tar | --ta | --t) - ac_prev=target_alias ;; - -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*) - target_alias=$ac_optarg ;; - - -v | -verbose | --verbose | --verbos | --verbo | --verb) - verbose=yes ;; - - -version | --version | --versio | --versi | --vers | -V) - ac_init_version=: ;; - - -with-* | --with-*) - ac_useropt=`expr "x$ac_option" : 'x-*with-\([^=]*\)'` - # Reject names that are not valid shell variable names. - expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && - as_fn_error $? "invalid package name: $ac_useropt" - ac_useropt_orig=$ac_useropt - ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` - case $ac_user_opts in - *" -"with_$ac_useropt" -"*) ;; - *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--with-$ac_useropt_orig" - ac_unrecognized_sep=', ';; - esac - eval with_$ac_useropt=\$ac_optarg ;; - - -without-* | --without-*) - ac_useropt=`expr "x$ac_option" : 'x-*without-\(.*\)'` - # Reject names that are not valid shell variable names. - expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && - as_fn_error $? "invalid package name: $ac_useropt" - ac_useropt_orig=$ac_useropt - ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` - case $ac_user_opts in - *" -"with_$ac_useropt" -"*) ;; - *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--without-$ac_useropt_orig" - ac_unrecognized_sep=', ';; - esac - eval with_$ac_useropt=no ;; - - --x) - # Obsolete; use --with-x. - with_x=yes ;; - - -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \ - | --x-incl | --x-inc | --x-in | --x-i) - ac_prev=x_includes ;; - -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \ - | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*) - x_includes=$ac_optarg ;; - - -x-libraries | --x-libraries | --x-librarie | --x-librari \ - | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l) - ac_prev=x_libraries ;; - -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \ - | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*) - x_libraries=$ac_optarg ;; - - -*) as_fn_error $? "unrecognized option: \`$ac_option' -Try \`$0 --help' for more information" - ;; - - *=*) - ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='` - # Reject names that are not valid shell variable names. - case $ac_envvar in #( - '' | [0-9]* | *[!_$as_cr_alnum]* ) - as_fn_error $? "invalid variable name: \`$ac_envvar'" ;; - esac - eval $ac_envvar=\$ac_optarg - export $ac_envvar ;; - - *) - # FIXME: should be removed in autoconf 3.0. - $as_echo "$as_me: WARNING: you should use --build, --host, --target" >&2 - expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null && - $as_echo "$as_me: WARNING: invalid host type: $ac_option" >&2 - : "${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}" - ;; - - esac -done - -if test -n "$ac_prev"; then - ac_option=--`echo $ac_prev | sed 's/_/-/g'` - as_fn_error $? "missing argument to $ac_option" -fi - -if test -n "$ac_unrecognized_opts"; then - case $enable_option_checking in - no) ;; - fatal) as_fn_error $? "unrecognized options: $ac_unrecognized_opts" ;; - *) $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 ;; - esac -fi - -# Check all directory arguments for consistency. -for ac_var in exec_prefix prefix bindir sbindir libexecdir datarootdir \ - datadir sysconfdir sharedstatedir localstatedir includedir \ - oldincludedir docdir infodir htmldir dvidir pdfdir psdir \ - libdir localedir mandir -do - eval ac_val=\$$ac_var - # Remove trailing slashes. - case $ac_val in - */ ) - ac_val=`expr "X$ac_val" : 'X\(.*[^/]\)' \| "X$ac_val" : 'X\(.*\)'` - eval $ac_var=\$ac_val;; - esac - # Be sure to have absolute directory names. - case $ac_val in - [\\/$]* | ?:[\\/]* ) continue;; - NONE | '' ) case $ac_var in *prefix ) continue;; esac;; - esac - as_fn_error $? "expected an absolute directory name for --$ac_var: $ac_val" -done - -# There might be people who depend on the old broken behavior: `$host' -# used to hold the argument of --host etc. -# FIXME: To remove some day. -build=$build_alias -host=$host_alias -target=$target_alias - -# FIXME: To remove some day. -if test "x$host_alias" != x; then - if test "x$build_alias" = x; then - cross_compiling=maybe - elif test "x$build_alias" != "x$host_alias"; then - cross_compiling=yes - fi -fi - -ac_tool_prefix= -test -n "$host_alias" && ac_tool_prefix=$host_alias- - -test "$silent" = yes && exec 6>/dev/null - - -ac_pwd=`pwd` && test -n "$ac_pwd" && -ac_ls_di=`ls -di .` && -ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` || - as_fn_error $? "working directory cannot be determined" -test "X$ac_ls_di" = "X$ac_pwd_ls_di" || - as_fn_error $? "pwd does not report name of working directory" - - -# Find the source files, if location was not specified. -if test -z "$srcdir"; then - ac_srcdir_defaulted=yes - # Try the directory containing this script, then the parent directory. - ac_confdir=`$as_dirname -- "$as_myself" || -$as_expr X"$as_myself" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ - X"$as_myself" : 'X\(//\)[^/]' \| \ - X"$as_myself" : 'X\(//\)$' \| \ - X"$as_myself" : 'X\(/\)' \| . 2>/dev/null || -$as_echo X"$as_myself" | - sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ - s//\1/ - q - } - /^X\(\/\/\)[^/].*/{ - s//\1/ - q - } - /^X\(\/\/\)$/{ - s//\1/ - q - } - /^X\(\/\).*/{ - s//\1/ - q - } - s/.*/./; q'` - srcdir=$ac_confdir - if test ! -r "$srcdir/$ac_unique_file"; then - srcdir=.. - fi -else - ac_srcdir_defaulted=no -fi -if test ! -r "$srcdir/$ac_unique_file"; then - test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .." - as_fn_error $? "cannot find sources ($ac_unique_file) in $srcdir" -fi -ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work" -ac_abs_confdir=`( - cd "$srcdir" && test -r "./$ac_unique_file" || as_fn_error $? "$ac_msg" - pwd)` -# When building in place, set srcdir=. -if test "$ac_abs_confdir" = "$ac_pwd"; then - srcdir=. -fi -# Remove unnecessary trailing slashes from srcdir. -# Double slashes in file names in object file debugging info -# mess up M-x gdb in Emacs. -case $srcdir in -*/) srcdir=`expr "X$srcdir" : 'X\(.*[^/]\)' \| "X$srcdir" : 'X\(.*\)'`;; -esac -for ac_var in $ac_precious_vars; do - eval ac_env_${ac_var}_set=\${${ac_var}+set} - eval ac_env_${ac_var}_value=\$${ac_var} - eval ac_cv_env_${ac_var}_set=\${${ac_var}+set} - eval ac_cv_env_${ac_var}_value=\$${ac_var} -done - -# -# Report the --help message. -# -if test "$ac_init_help" = "long"; then - # Omit some internal or obsolete options to make the list less imposing. - # This message is too long to be a string in the A/UX 3.1 sh. - cat <<_ACEOF -\`configure' configures zookeeper C client 3.4.6 to adapt to many kinds of systems. - -Usage: $0 [OPTION]... [VAR=VALUE]... - -To assign environment variables (e.g., CC, CFLAGS...), specify them as -VAR=VALUE. See below for descriptions of some of the useful variables. - -Defaults for the options are specified in brackets. - -Configuration: - -h, --help display this help and exit - --help=short display options specific to this package - --help=recursive display the short help of all the included packages - -V, --version display version information and exit - -q, --quiet, --silent do not print \`checking ...' messages - --cache-file=FILE cache test results in FILE [disabled] - -C, --config-cache alias for \`--cache-file=config.cache' - -n, --no-create do not create output files - --srcdir=DIR find the sources in DIR [configure dir or \`..'] - -Installation directories: - --prefix=PREFIX install architecture-independent files in PREFIX - @<:@@S|@ac_default_prefix@:>@ - --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX - @<:@PREFIX@:>@ - -By default, \`make install' will install all the files in -\`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc. You can specify -an installation prefix other than \`$ac_default_prefix' using \`--prefix', -for instance \`--prefix=\$HOME'. - -For better control, use the options below. - -Fine tuning of the installation directories: - --bindir=DIR user executables [EPREFIX/bin] - --sbindir=DIR system admin executables [EPREFIX/sbin] - --libexecdir=DIR program executables [EPREFIX/libexec] - --sysconfdir=DIR read-only single-machine data [PREFIX/etc] - --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com] - --localstatedir=DIR modifiable single-machine data [PREFIX/var] - --libdir=DIR object code libraries [EPREFIX/lib] - --includedir=DIR C header files [PREFIX/include] - --oldincludedir=DIR C header files for non-gcc [/usr/include] - --datarootdir=DIR read-only arch.-independent data root [PREFIX/share] - --datadir=DIR read-only architecture-independent data [DATAROOTDIR] - --infodir=DIR info documentation [DATAROOTDIR/info] - --localedir=DIR locale-dependent data [DATAROOTDIR/locale] - --mandir=DIR man documentation [DATAROOTDIR/man] - --docdir=DIR documentation root @<:@DATAROOTDIR/doc/zookeeper@:>@ - --htmldir=DIR html documentation [DOCDIR] - --dvidir=DIR dvi documentation [DOCDIR] - --pdfdir=DIR pdf documentation [DOCDIR] - --psdir=DIR ps documentation [DOCDIR] -_ACEOF - - cat <<\_ACEOF - -Program names: - --program-prefix=PREFIX prepend PREFIX to installed program names - --program-suffix=SUFFIX append SUFFIX to installed program names - --program-transform-name=PROGRAM run sed PROGRAM on installed program names - -System types: - --build=BUILD configure for building on BUILD [guessed] - --host=HOST cross-compile to build programs to run on HOST [BUILD] -_ACEOF -fi - -if test -n "$ac_init_help"; then - case $ac_init_help in - short | recursive ) echo "Configuration of zookeeper C client 3.4.6:";; - esac - cat <<\_ACEOF - -Optional Features: - --disable-option-checking ignore unrecognized --enable/--with options - --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) - --enable-FEATURE[=ARG] include FEATURE [ARG=yes] - --disable-doxygen-doc don't generate any doxygen documentation - --disable-doxygen-dot don't generate graphics for doxygen documentation - --enable-doxygen-man generate doxygen manual pages - --enable-doxygen-rtf generate doxygen RTF documentation - --enable-doxygen-xml generate doxygen XML documentation - --enable-doxygen-chm generate doxygen compressed HTML help documentation - --enable-doxygen-chi generate doxygen seperate compressed HTML help index - file - --disable-doxygen-html don't generate doxygen plain HTML documentation - --enable-doxygen-ps generate doxygen PostScript documentation - --enable-doxygen-pdf generate doxygen PDF documentation - --disable-dependency-tracking speeds up one-time build - --enable-dependency-tracking do not reject slow dependency extractors - --enable-shared@<:@=PKGS@:>@ build shared libraries @<:@default=yes@:>@ - --enable-static@<:@=PKGS@:>@ build static libraries @<:@default=yes@:>@ - --enable-fast-install@<:@=PKGS@:>@ - optimize for fast installation @<:@default=yes@:>@ - --disable-libtool-lock avoid locking (might break parallel builds) - --enable-debug enable debug build @<:@default=no@:>@ - -Optional Packages: - --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] - --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) - --without-cppunit do not use CPPUNIT - --with-cppunit-prefix=PFX Prefix where CppUnit is installed (optional) - --with-cppunit-exec-prefix=PFX Exec prefix where CppUnit is installed (optional) - --with-pic@<:@=PKGS@:>@ try to use only PIC/non-PIC objects @<:@default=use - both@:>@ - --with-gnu-ld assume the C compiler uses GNU ld @<:@default=no@:>@ - --with-sysroot=DIR Search for dependent libraries within DIR - (or the compiler's sysroot if not specified). - --with-syncapi build with support for SyncAPI @<:@default=yes@:>@ - -Some influential environment variables: - DOXYGEN_PAPER_SIZE - a4wide (default), a4, letter, legal or executive - CC C compiler command - CFLAGS C compiler flags - LDFLAGS linker flags, e.g. -L if you have libraries in a - nonstandard directory - LIBS libraries to pass to the linker, e.g. -l - CPPFLAGS (Objective) C/C++ preprocessor flags, e.g. -I if - you have headers in a nonstandard directory - CXX C++ compiler command - CXXFLAGS C++ compiler flags - CPP C preprocessor - CXXCPP C++ preprocessor - -Use these variables to override the choices made by `configure' or to help -it to find libraries and programs with nonstandard names/locations. - -Report bugs to . -_ACEOF -ac_status=$? -fi - -if test "$ac_init_help" = "recursive"; then - # If there are subdirs, report their specific --help. - for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue - test -d "$ac_dir" || - { cd "$srcdir" && ac_pwd=`pwd` && srcdir=. && test -d "$ac_dir"; } || - continue - ac_builddir=. - -case "$ac_dir" in -.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; -*) - ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` - # A ".." for each directory in $ac_dir_suffix. - ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` - case $ac_top_builddir_sub in - "") ac_top_builddir_sub=. ac_top_build_prefix= ;; - *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; - esac ;; -esac -ac_abs_top_builddir=$ac_pwd -ac_abs_builddir=$ac_pwd$ac_dir_suffix -# for backward compatibility: -ac_top_builddir=$ac_top_build_prefix - -case $srcdir in - .) # We are building in place. - ac_srcdir=. - ac_top_srcdir=$ac_top_builddir_sub - ac_abs_top_srcdir=$ac_pwd ;; - [\\/]* | ?:[\\/]* ) # Absolute name. - ac_srcdir=$srcdir$ac_dir_suffix; - ac_top_srcdir=$srcdir - ac_abs_top_srcdir=$srcdir ;; - *) # Relative name. - ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix - ac_top_srcdir=$ac_top_build_prefix$srcdir - ac_abs_top_srcdir=$ac_pwd/$srcdir ;; -esac -ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix - - cd "$ac_dir" || { ac_status=$?; continue; } - # Check for guested configure. - if test -f "$ac_srcdir/configure.gnu"; then - echo && - $SHELL "$ac_srcdir/configure.gnu" --help=recursive - elif test -f "$ac_srcdir/configure"; then - echo && - $SHELL "$ac_srcdir/configure" --help=recursive - else - $as_echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2 - fi || ac_status=$? - cd "$ac_pwd" || { ac_status=$?; break; } - done -fi - -test -n "$ac_init_help" && exit $ac_status -if $ac_init_version; then - cat <<\_ACEOF -zookeeper C client configure 3.4.6 -generated by GNU Autoconf 2.69 - -Copyright (C) 2012 Free Software Foundation, Inc. -This configure script is free software; the Free Software Foundation -gives unlimited permission to copy, distribute and modify it. -_ACEOF - exit -fi - -## ------------------------ ## -## Autoconf initialization. ## -## ------------------------ ## - -@%:@ ac_fn_c_try_compile LINENO -@%:@ -------------------------- -@%:@ Try to compile conftest.@S|@ac_ext, and return whether this succeeded. -ac_fn_c_try_compile () -{ - as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack - rm -f conftest.$ac_objext - if { { ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 - (eval "$ac_compile") 2>conftest.err - ac_status=$? - if test -s conftest.err; then - grep -v '^ *+' conftest.err >conftest.er1 - cat conftest.er1 >&5 - mv -f conftest.er1 conftest.err - fi - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then : - ac_retval=0 -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_retval=1 -fi - eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno - as_fn_set_status $ac_retval - -} @%:@ ac_fn_c_try_compile - -@%:@ ac_fn_cxx_try_compile LINENO -@%:@ ---------------------------- -@%:@ Try to compile conftest.@S|@ac_ext, and return whether this succeeded. -ac_fn_cxx_try_compile () -{ - as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack - rm -f conftest.$ac_objext - if { { ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 - (eval "$ac_compile") 2>conftest.err - ac_status=$? - if test -s conftest.err; then - grep -v '^ *+' conftest.err >conftest.er1 - cat conftest.er1 >&5 - mv -f conftest.er1 conftest.err - fi - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } && { - test -z "$ac_cxx_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then : - ac_retval=0 -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_retval=1 -fi - eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno - as_fn_set_status $ac_retval - -} @%:@ ac_fn_cxx_try_compile - -@%:@ ac_fn_c_try_link LINENO -@%:@ ----------------------- -@%:@ Try to link conftest.@S|@ac_ext, and return whether this succeeded. -ac_fn_c_try_link () -{ - as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack - rm -f conftest.$ac_objext conftest$ac_exeext - if { { ac_try="$ac_link" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 - (eval "$ac_link") 2>conftest.err - ac_status=$? - if test -s conftest.err; then - grep -v '^ *+' conftest.err >conftest.er1 - cat conftest.er1 >&5 - mv -f conftest.er1 conftest.err - fi - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest$ac_exeext && { - test "$cross_compiling" = yes || - test -x conftest$ac_exeext - }; then : - ac_retval=0 -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_retval=1 -fi - # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information - # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would - # interfere with the next link command; also delete a directory that is - # left behind by Apple's compiler. We do this before executing the actions. - rm -rf conftest.dSYM conftest_ipa8_conftest.oo - eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno - as_fn_set_status $ac_retval - -} @%:@ ac_fn_c_try_link - -@%:@ ac_fn_c_check_header_compile LINENO HEADER VAR INCLUDES -@%:@ ------------------------------------------------------- -@%:@ Tests whether HEADER exists and can be compiled using the include files in -@%:@ INCLUDES, setting the cache variable VAR accordingly. -ac_fn_c_check_header_compile () -{ - as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 -$as_echo_n "checking for $2... " >&6; } -if eval \${$3+:} false; then : - $as_echo_n "(cached) " >&6 -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -$4 -@%:@include <$2> -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - eval "$3=yes" -else - eval "$3=no" -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -fi -eval ac_res=\$$3 - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 -$as_echo "$ac_res" >&6; } - eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno - -} @%:@ ac_fn_c_check_header_compile - -@%:@ ac_fn_c_try_cpp LINENO -@%:@ ---------------------- -@%:@ Try to preprocess conftest.@S|@ac_ext, and return whether this succeeded. -ac_fn_c_try_cpp () -{ - as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack - if { { ac_try="$ac_cpp conftest.$ac_ext" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 - (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err - ac_status=$? - if test -s conftest.err; then - grep -v '^ *+' conftest.err >conftest.er1 - cat conftest.er1 >&5 - mv -f conftest.er1 conftest.err - fi - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } > conftest.i && { - test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || - test ! -s conftest.err - }; then : - ac_retval=0 -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_retval=1 -fi - eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno - as_fn_set_status $ac_retval - -} @%:@ ac_fn_c_try_cpp - -@%:@ ac_fn_c_try_run LINENO -@%:@ ---------------------- -@%:@ Try to link conftest.@S|@ac_ext, and return whether this succeeded. Assumes -@%:@ that executables *can* be run. -ac_fn_c_try_run () -{ - as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack - if { { ac_try="$ac_link" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 - (eval "$ac_link") 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } && { ac_try='./conftest$ac_exeext' - { { case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 - (eval "$ac_try") 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; }; }; then : - ac_retval=0 -else - $as_echo "$as_me: program exited with status $ac_status" >&5 - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_retval=$ac_status -fi - rm -rf conftest.dSYM conftest_ipa8_conftest.oo - eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno - as_fn_set_status $ac_retval - -} @%:@ ac_fn_c_try_run - -@%:@ ac_fn_c_check_func LINENO FUNC VAR -@%:@ ---------------------------------- -@%:@ Tests whether FUNC exists, setting the cache variable VAR accordingly -ac_fn_c_check_func () -{ - as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 -$as_echo_n "checking for $2... " >&6; } -if eval \${$3+:} false; then : - $as_echo_n "(cached) " >&6 -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -/* Define $2 to an innocuous variant, in case declares $2. - For example, HP-UX 11i declares gettimeofday. */ -#define $2 innocuous_$2 - -/* System header to define __stub macros and hopefully few prototypes, - which can conflict with char $2 (); below. - Prefer to if __STDC__ is defined, since - exists even on freestanding compilers. */ - -#ifdef __STDC__ -# include -#else -# include -#endif - -#undef $2 - -/* Override any GCC internal prototype to avoid an error. - Use char because int might match the return type of a GCC - builtin and then its argument prototype would still apply. */ -#ifdef __cplusplus -extern "C" -#endif -char $2 (); -/* The GNU C library defines this for functions which it implements - to always fail with ENOSYS. Some functions are actually named - something starting with __ and the normal name is an alias. */ -#if defined __stub_$2 || defined __stub___$2 -choke me -#endif - -int -main () -{ -return $2 (); - ; - return 0; -} -_ACEOF -if ac_fn_c_try_link "$LINENO"; then : - eval "$3=yes" -else - eval "$3=no" -fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext -fi -eval ac_res=\$$3 - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 -$as_echo "$ac_res" >&6; } - eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno - -} @%:@ ac_fn_c_check_func - -@%:@ ac_fn_cxx_try_cpp LINENO -@%:@ ------------------------ -@%:@ Try to preprocess conftest.@S|@ac_ext, and return whether this succeeded. -ac_fn_cxx_try_cpp () -{ - as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack - if { { ac_try="$ac_cpp conftest.$ac_ext" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 - (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err - ac_status=$? - if test -s conftest.err; then - grep -v '^ *+' conftest.err >conftest.er1 - cat conftest.er1 >&5 - mv -f conftest.er1 conftest.err - fi - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } > conftest.i && { - test -z "$ac_cxx_preproc_warn_flag$ac_cxx_werror_flag" || - test ! -s conftest.err - }; then : - ac_retval=0 -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_retval=1 -fi - eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno - as_fn_set_status $ac_retval - -} @%:@ ac_fn_cxx_try_cpp - -@%:@ ac_fn_cxx_try_link LINENO -@%:@ ------------------------- -@%:@ Try to link conftest.@S|@ac_ext, and return whether this succeeded. -ac_fn_cxx_try_link () -{ - as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack - rm -f conftest.$ac_objext conftest$ac_exeext - if { { ac_try="$ac_link" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 - (eval "$ac_link") 2>conftest.err - ac_status=$? - if test -s conftest.err; then - grep -v '^ *+' conftest.err >conftest.er1 - cat conftest.er1 >&5 - mv -f conftest.er1 conftest.err - fi - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } && { - test -z "$ac_cxx_werror_flag" || - test ! -s conftest.err - } && test -s conftest$ac_exeext && { - test "$cross_compiling" = yes || - test -x conftest$ac_exeext - }; then : - ac_retval=0 -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_retval=1 -fi - # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information - # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would - # interfere with the next link command; also delete a directory that is - # left behind by Apple's compiler. We do this before executing the actions. - rm -rf conftest.dSYM conftest_ipa8_conftest.oo - eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno - as_fn_set_status $ac_retval - -} @%:@ ac_fn_cxx_try_link - -@%:@ ac_fn_c_check_header_mongrel LINENO HEADER VAR INCLUDES -@%:@ ------------------------------------------------------- -@%:@ Tests whether HEADER exists, giving a warning if it cannot be compiled using -@%:@ the include files in INCLUDES and setting the cache variable VAR -@%:@ accordingly. -ac_fn_c_check_header_mongrel () -{ - as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack - if eval \${$3+:} false; then : - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 -$as_echo_n "checking for $2... " >&6; } -if eval \${$3+:} false; then : - $as_echo_n "(cached) " >&6 -fi -eval ac_res=\$$3 - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 -$as_echo "$ac_res" >&6; } -else - # Is the header compilable? -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 usability" >&5 -$as_echo_n "checking $2 usability... " >&6; } -cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -$4 -@%:@include <$2> -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - ac_header_compiler=yes -else - ac_header_compiler=no -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_compiler" >&5 -$as_echo "$ac_header_compiler" >&6; } - -# Is the header present? -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 presence" >&5 -$as_echo_n "checking $2 presence... " >&6; } -cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -@%:@include <$2> -_ACEOF -if ac_fn_c_try_cpp "$LINENO"; then : - ac_header_preproc=yes -else - ac_header_preproc=no -fi -rm -f conftest.err conftest.i conftest.$ac_ext -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_preproc" >&5 -$as_echo "$ac_header_preproc" >&6; } - -# So? What about this header? -case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in #(( - yes:no: ) - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&5 -$as_echo "$as_me: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&2;} - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 -$as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} - ;; - no:yes:* ) - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: present but cannot be compiled" >&5 -$as_echo "$as_me: WARNING: $2: present but cannot be compiled" >&2;} - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: check for missing prerequisite headers?" >&5 -$as_echo "$as_me: WARNING: $2: check for missing prerequisite headers?" >&2;} - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: see the Autoconf documentation" >&5 -$as_echo "$as_me: WARNING: $2: see the Autoconf documentation" >&2;} - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&5 -$as_echo "$as_me: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&2;} - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 -$as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} -( $as_echo "## ---------------------------------------- ## -## Report this to user@zookeeper.apache.org ## -## ---------------------------------------- ##" - ) | sed "s/^/$as_me: WARNING: /" >&2 - ;; -esac - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 -$as_echo_n "checking for $2... " >&6; } -if eval \${$3+:} false; then : - $as_echo_n "(cached) " >&6 -else - eval "$3=\$ac_header_compiler" -fi -eval ac_res=\$$3 - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 -$as_echo "$ac_res" >&6; } -fi - eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno - -} @%:@ ac_fn_c_check_header_mongrel - -@%:@ ac_fn_c_check_type LINENO TYPE VAR INCLUDES -@%:@ ------------------------------------------- -@%:@ Tests whether TYPE exists after having included INCLUDES, setting cache -@%:@ variable VAR accordingly. -ac_fn_c_check_type () -{ - as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 -$as_echo_n "checking for $2... " >&6; } -if eval \${$3+:} false; then : - $as_echo_n "(cached) " >&6 -else - eval "$3=no" - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -$4 -int -main () -{ -if (sizeof ($2)) - return 0; - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -$4 -int -main () -{ -if (sizeof (($2))) - return 0; - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - -else - eval "$3=yes" -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -fi -eval ac_res=\$$3 - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 -$as_echo "$ac_res" >&6; } - eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno - -} @%:@ ac_fn_c_check_type -cat >config.log <<_ACEOF -This file contains any messages produced by compilers while -running configure, to aid debugging if configure makes a mistake. - -It was created by zookeeper C client $as_me 3.4.6, which was -generated by GNU Autoconf 2.69. Invocation command line was - - $ $0 $@ - -_ACEOF -exec 5>>config.log -{ -cat <<_ASUNAME -## --------- ## -## Platform. ## -## --------- ## - -hostname = `(hostname || uname -n) 2>/dev/null | sed 1q` -uname -m = `(uname -m) 2>/dev/null || echo unknown` -uname -r = `(uname -r) 2>/dev/null || echo unknown` -uname -s = `(uname -s) 2>/dev/null || echo unknown` -uname -v = `(uname -v) 2>/dev/null || echo unknown` - -/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown` -/bin/uname -X = `(/bin/uname -X) 2>/dev/null || echo unknown` - -/bin/arch = `(/bin/arch) 2>/dev/null || echo unknown` -/usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null || echo unknown` -/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown` -/usr/bin/hostinfo = `(/usr/bin/hostinfo) 2>/dev/null || echo unknown` -/bin/machine = `(/bin/machine) 2>/dev/null || echo unknown` -/usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null || echo unknown` -/bin/universe = `(/bin/universe) 2>/dev/null || echo unknown` - -_ASUNAME - -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - $as_echo "PATH: $as_dir" - done -IFS=$as_save_IFS - -} >&5 - -cat >&5 <<_ACEOF - - -## ----------- ## -## Core tests. ## -## ----------- ## - -_ACEOF - - -# Keep a trace of the command line. -# Strip out --no-create and --no-recursion so they do not pile up. -# Strip out --silent because we don't want to record it for future runs. -# Also quote any args containing shell meta-characters. -# Make two passes to allow for proper duplicate-argument suppression. -ac_configure_args= -ac_configure_args0= -ac_configure_args1= -ac_must_keep_next=false -for ac_pass in 1 2 -do - for ac_arg - do - case $ac_arg in - -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;; - -q | -quiet | --quiet | --quie | --qui | --qu | --q \ - | -silent | --silent | --silen | --sile | --sil) - continue ;; - *\'*) - ac_arg=`$as_echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; - esac - case $ac_pass in - 1) as_fn_append ac_configure_args0 " '$ac_arg'" ;; - 2) - as_fn_append ac_configure_args1 " '$ac_arg'" - if test $ac_must_keep_next = true; then - ac_must_keep_next=false # Got value, back to normal. - else - case $ac_arg in - *=* | --config-cache | -C | -disable-* | --disable-* \ - | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \ - | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \ - | -with-* | --with-* | -without-* | --without-* | --x) - case "$ac_configure_args0 " in - "$ac_configure_args1"*" '$ac_arg' "* ) continue ;; - esac - ;; - -* ) ac_must_keep_next=true ;; - esac - fi - as_fn_append ac_configure_args " '$ac_arg'" - ;; - esac - done -done -{ ac_configure_args0=; unset ac_configure_args0;} -{ ac_configure_args1=; unset ac_configure_args1;} - -# When interrupted or exit'd, cleanup temporary files, and complete -# config.log. We remove comments because anyway the quotes in there -# would cause problems or look ugly. -# WARNING: Use '\'' to represent an apostrophe within the trap. -# WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug. -trap 'exit_status=$? - # Save into config.log some information that might help in debugging. - { - echo - - $as_echo "## ---------------- ## -## Cache variables. ## -## ---------------- ##" - echo - # The following way of writing the cache mishandles newlines in values, -( - for ac_var in `(set) 2>&1 | sed -n '\''s/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'\''`; do - eval ac_val=\$$ac_var - case $ac_val in #( - *${as_nl}*) - case $ac_var in #( - *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 -$as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; - esac - case $ac_var in #( - _ | IFS | as_nl) ;; #( - BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( - *) { eval $ac_var=; unset $ac_var;} ;; - esac ;; - esac - done - (set) 2>&1 | - case $as_nl`(ac_space='\'' '\''; set) 2>&1` in #( - *${as_nl}ac_space=\ *) - sed -n \ - "s/'\''/'\''\\\\'\'''\''/g; - s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\''\\2'\''/p" - ;; #( - *) - sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" - ;; - esac | - sort -) - echo - - $as_echo "## ----------------- ## -## Output variables. ## -## ----------------- ##" - echo - for ac_var in $ac_subst_vars - do - eval ac_val=\$$ac_var - case $ac_val in - *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; - esac - $as_echo "$ac_var='\''$ac_val'\''" - done | sort - echo - - if test -n "$ac_subst_files"; then - $as_echo "## ------------------- ## -## File substitutions. ## -## ------------------- ##" - echo - for ac_var in $ac_subst_files - do - eval ac_val=\$$ac_var - case $ac_val in - *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; - esac - $as_echo "$ac_var='\''$ac_val'\''" - done | sort - echo - fi - - if test -s confdefs.h; then - $as_echo "## ----------- ## -## confdefs.h. ## -## ----------- ##" - echo - cat confdefs.h - echo - fi - test "$ac_signal" != 0 && - $as_echo "$as_me: caught signal $ac_signal" - $as_echo "$as_me: exit $exit_status" - } >&5 - rm -f core *.core core.conftest.* && - rm -f -r conftest* confdefs* conf$$* $ac_clean_files && - exit $exit_status -' 0 -for ac_signal in 1 2 13 15; do - trap 'ac_signal='$ac_signal'; as_fn_exit 1' $ac_signal -done -ac_signal=0 - -# confdefs.h avoids OS command line length limits that DEFS can exceed. -rm -f -r conftest* confdefs.h - -$as_echo "/* confdefs.h */" > confdefs.h - -# Predefined preprocessor variables. - -cat >>confdefs.h <<_ACEOF -@%:@define PACKAGE_NAME "$PACKAGE_NAME" -_ACEOF - -cat >>confdefs.h <<_ACEOF -@%:@define PACKAGE_TARNAME "$PACKAGE_TARNAME" -_ACEOF - -cat >>confdefs.h <<_ACEOF -@%:@define PACKAGE_VERSION "$PACKAGE_VERSION" -_ACEOF - -cat >>confdefs.h <<_ACEOF -@%:@define PACKAGE_STRING "$PACKAGE_STRING" -_ACEOF - -cat >>confdefs.h <<_ACEOF -@%:@define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT" -_ACEOF - -cat >>confdefs.h <<_ACEOF -@%:@define PACKAGE_URL "$PACKAGE_URL" -_ACEOF - - -# Let the site file select an alternate cache file if it wants to. -# Prefer an explicitly selected file to automatically selected ones. -ac_site_file1=NONE -ac_site_file2=NONE -if test -n "$CONFIG_SITE"; then - # We do not want a PATH search for config.site. - case $CONFIG_SITE in @%:@(( - -*) ac_site_file1=./$CONFIG_SITE;; - */*) ac_site_file1=$CONFIG_SITE;; - *) ac_site_file1=./$CONFIG_SITE;; - esac -elif test "x$prefix" != xNONE; then - ac_site_file1=$prefix/share/config.site - ac_site_file2=$prefix/etc/config.site -else - ac_site_file1=$ac_default_prefix/share/config.site - ac_site_file2=$ac_default_prefix/etc/config.site -fi -for ac_site_file in "$ac_site_file1" "$ac_site_file2" -do - test "x$ac_site_file" = xNONE && continue - if test /dev/null != "$ac_site_file" && test -r "$ac_site_file"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: loading site script $ac_site_file" >&5 -$as_echo "$as_me: loading site script $ac_site_file" >&6;} - sed 's/^/| /' "$ac_site_file" >&5 - . "$ac_site_file" \ - || { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 -$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} -as_fn_error $? "failed to load site script $ac_site_file -See \`config.log' for more details" "$LINENO" 5; } - fi -done - -if test -r "$cache_file"; then - # Some versions of bash will fail to source /dev/null (special files - # actually), so we avoid doing that. DJGPP emulates it as a regular file. - if test /dev/null != "$cache_file" && test -f "$cache_file"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: loading cache $cache_file" >&5 -$as_echo "$as_me: loading cache $cache_file" >&6;} - case $cache_file in - [\\/]* | ?:[\\/]* ) . "$cache_file";; - *) . "./$cache_file";; - esac - fi -else - { $as_echo "$as_me:${as_lineno-$LINENO}: creating cache $cache_file" >&5 -$as_echo "$as_me: creating cache $cache_file" >&6;} - >$cache_file -fi - -# Check that the precious variables saved in the cache have kept the same -# value. -ac_cache_corrupted=false -for ac_var in $ac_precious_vars; do - eval ac_old_set=\$ac_cv_env_${ac_var}_set - eval ac_new_set=\$ac_env_${ac_var}_set - eval ac_old_val=\$ac_cv_env_${ac_var}_value - eval ac_new_val=\$ac_env_${ac_var}_value - case $ac_old_set,$ac_new_set in - set,) - { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5 -$as_echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;} - ac_cache_corrupted=: ;; - ,set) - { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was not set in the previous run" >&5 -$as_echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;} - ac_cache_corrupted=: ;; - ,);; - *) - if test "x$ac_old_val" != "x$ac_new_val"; then - # differences in whitespace do not lead to failure. - ac_old_val_w=`echo x $ac_old_val` - ac_new_val_w=`echo x $ac_new_val` - if test "$ac_old_val_w" != "$ac_new_val_w"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' has changed since the previous run:" >&5 -$as_echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;} - ac_cache_corrupted=: - else - { $as_echo "$as_me:${as_lineno-$LINENO}: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&5 -$as_echo "$as_me: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&2;} - eval $ac_var=\$ac_old_val - fi - { $as_echo "$as_me:${as_lineno-$LINENO}: former value: \`$ac_old_val'" >&5 -$as_echo "$as_me: former value: \`$ac_old_val'" >&2;} - { $as_echo "$as_me:${as_lineno-$LINENO}: current value: \`$ac_new_val'" >&5 -$as_echo "$as_me: current value: \`$ac_new_val'" >&2;} - fi;; - esac - # Pass precious variables to config.status. - if test "$ac_new_set" = set; then - case $ac_new_val in - *\'*) ac_arg=$ac_var=`$as_echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;; - *) ac_arg=$ac_var=$ac_new_val ;; - esac - case " $ac_configure_args " in - *" '$ac_arg' "*) ;; # Avoid dups. Use of quotes ensures accuracy. - *) as_fn_append ac_configure_args " '$ac_arg'" ;; - esac - fi -done -if $ac_cache_corrupted; then - { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 -$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} - { $as_echo "$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build" >&5 -$as_echo "$as_me: error: changes in the environment can compromise the build" >&2;} - as_fn_error $? "run \`make distclean' and/or \`rm $cache_file' and start over" "$LINENO" 5 -fi -## -------------------- ## -## Main body of script. ## -## -------------------- ## - -ac_ext=c -ac_cpp='$CPP $CPPFLAGS' -ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_c_compiler_gnu - - - - -# Save initial CFLAGS and CXXFLAGS values before AC_PROG_CC and AC_PROG_CXX -init_cflags="$CFLAGS" -init_cxxflags="$CXXFLAGS" - -# initialize Doxygen support - - - - - - - - - - -# Files: -DX_PROJECT=zookeeper - -DX_CONFIG=c-doc.Doxyfile - -DX_DOCDIR=docs - - -# Environment variables used inside doxygen.cfg: -DX_ENV="$DX_ENV SRCDIR='$srcdir'" - -DX_ENV="$DX_ENV PROJECT='$DX_PROJECT'" - -DX_ENV="$DX_ENV DOCDIR='$DX_DOCDIR'" - -DX_ENV="$DX_ENV VERSION='$PACKAGE_VERSION'" - - -# Doxygen itself: - - - - @%:@ Check whether --enable-doxygen-doc was given. -if test "${enable_doxygen_doc+set}" = set; then : - enableval=$enable_doxygen_doc; -case "$enableval" in -#( -y|Y|yes|Yes|YES) - DX_FLAG_doc=1 - - -;; #( -n|N|no|No|NO) - DX_FLAG_doc=0 - -;; #( -*) - as_fn_error $? "invalid value '$enableval' given to doxygen-doc" "$LINENO" 5 -;; -esac - -else - -DX_FLAG_doc=1 - - - -fi - -if test "$DX_FLAG_doc" = 1; then - -if test -n "$ac_tool_prefix"; then - # Extract the first word of "${ac_tool_prefix}doxygen", so it can be a program name with args. -set dummy ${ac_tool_prefix}doxygen; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_path_DX_DOXYGEN+:} false; then : - $as_echo_n "(cached) " >&6 -else - case $DX_DOXYGEN in - [\\/]* | ?:[\\/]*) - ac_cv_path_DX_DOXYGEN="$DX_DOXYGEN" # Let the user override the test with a path. - ;; - *) - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_path_DX_DOXYGEN="$as_dir/$ac_word$ac_exec_ext" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - - ;; -esac -fi -DX_DOXYGEN=$ac_cv_path_DX_DOXYGEN -if test -n "$DX_DOXYGEN"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DX_DOXYGEN" >&5 -$as_echo "$DX_DOXYGEN" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - -fi -if test -z "$ac_cv_path_DX_DOXYGEN"; then - ac_pt_DX_DOXYGEN=$DX_DOXYGEN - # Extract the first word of "doxygen", so it can be a program name with args. -set dummy doxygen; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_path_ac_pt_DX_DOXYGEN+:} false; then : - $as_echo_n "(cached) " >&6 -else - case $ac_pt_DX_DOXYGEN in - [\\/]* | ?:[\\/]*) - ac_cv_path_ac_pt_DX_DOXYGEN="$ac_pt_DX_DOXYGEN" # Let the user override the test with a path. - ;; - *) - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_path_ac_pt_DX_DOXYGEN="$as_dir/$ac_word$ac_exec_ext" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - - ;; -esac -fi -ac_pt_DX_DOXYGEN=$ac_cv_path_ac_pt_DX_DOXYGEN -if test -n "$ac_pt_DX_DOXYGEN"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_pt_DX_DOXYGEN" >&5 -$as_echo "$ac_pt_DX_DOXYGEN" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - if test "x$ac_pt_DX_DOXYGEN" = x; then - DX_DOXYGEN="" - else - case $cross_compiling:$ac_tool_warned in -yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} -ac_tool_warned=yes ;; -esac - DX_DOXYGEN=$ac_pt_DX_DOXYGEN - fi -else - DX_DOXYGEN="$ac_cv_path_DX_DOXYGEN" -fi - -if test "$DX_FLAG_$DX_CURRENT_FEATURE$DX_DOXYGEN" = 1; then - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: doxygen not found - will not generate any doxygen documentation" >&5 -$as_echo "$as_me: WARNING: doxygen not found - will not generate any doxygen documentation" >&2;} - DX_FLAG_doc=0 - -fi - - -if test -n "$ac_tool_prefix"; then - # Extract the first word of "${ac_tool_prefix}perl", so it can be a program name with args. -set dummy ${ac_tool_prefix}perl; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_path_DX_PERL+:} false; then : - $as_echo_n "(cached) " >&6 -else - case $DX_PERL in - [\\/]* | ?:[\\/]*) - ac_cv_path_DX_PERL="$DX_PERL" # Let the user override the test with a path. - ;; - *) - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_path_DX_PERL="$as_dir/$ac_word$ac_exec_ext" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - - ;; -esac -fi -DX_PERL=$ac_cv_path_DX_PERL -if test -n "$DX_PERL"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DX_PERL" >&5 -$as_echo "$DX_PERL" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - -fi -if test -z "$ac_cv_path_DX_PERL"; then - ac_pt_DX_PERL=$DX_PERL - # Extract the first word of "perl", so it can be a program name with args. -set dummy perl; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_path_ac_pt_DX_PERL+:} false; then : - $as_echo_n "(cached) " >&6 -else - case $ac_pt_DX_PERL in - [\\/]* | ?:[\\/]*) - ac_cv_path_ac_pt_DX_PERL="$ac_pt_DX_PERL" # Let the user override the test with a path. - ;; - *) - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_path_ac_pt_DX_PERL="$as_dir/$ac_word$ac_exec_ext" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - - ;; -esac -fi -ac_pt_DX_PERL=$ac_cv_path_ac_pt_DX_PERL -if test -n "$ac_pt_DX_PERL"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_pt_DX_PERL" >&5 -$as_echo "$ac_pt_DX_PERL" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - if test "x$ac_pt_DX_PERL" = x; then - DX_PERL="" - else - case $cross_compiling:$ac_tool_warned in -yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} -ac_tool_warned=yes ;; -esac - DX_PERL=$ac_pt_DX_PERL - fi -else - DX_PERL="$ac_cv_path_DX_PERL" -fi - -if test "$DX_FLAG_$DX_CURRENT_FEATURE$DX_PERL" = 1; then - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: perl not found - will not generate any doxygen documentation" >&5 -$as_echo "$as_me: WARNING: perl not found - will not generate any doxygen documentation" >&2;} - DX_FLAG_doc=0 - -fi - - : -fi -if test "$DX_FLAG_doc" = 1; then - if :; then - DX_COND_doc_TRUE= - DX_COND_doc_FALSE='#' -else - DX_COND_doc_TRUE='#' - DX_COND_doc_FALSE= -fi - - DX_ENV="$DX_ENV PERL_PATH='$DX_PERL'" - - : -else - if false; then - DX_COND_doc_TRUE= - DX_COND_doc_FALSE='#' -else - DX_COND_doc_TRUE='#' - DX_COND_doc_FALSE= -fi - - - : -fi - - -# Dot for graphics: - - - - @%:@ Check whether --enable-doxygen-dot was given. -if test "${enable_doxygen_dot+set}" = set; then : - enableval=$enable_doxygen_dot; -case "$enableval" in -#( -y|Y|yes|Yes|YES) - DX_FLAG_dot=1 - - -test "$DX_FLAG_doc" = "1" \ -|| as_fn_error $? "doxygen-dot requires doxygen-dot" "$LINENO" 5 - -;; #( -n|N|no|No|NO) - DX_FLAG_dot=0 - -;; #( -*) - as_fn_error $? "invalid value '$enableval' given to doxygen-dot" "$LINENO" 5 -;; -esac - -else - -DX_FLAG_dot=1 - - -test "$DX_FLAG_doc" = "1" || DX_FLAG_dot=0 - - - -fi - -if test "$DX_FLAG_dot" = 1; then - -if test -n "$ac_tool_prefix"; then - # Extract the first word of "${ac_tool_prefix}dot", so it can be a program name with args. -set dummy ${ac_tool_prefix}dot; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_path_DX_DOT+:} false; then : - $as_echo_n "(cached) " >&6 -else - case $DX_DOT in - [\\/]* | ?:[\\/]*) - ac_cv_path_DX_DOT="$DX_DOT" # Let the user override the test with a path. - ;; - *) - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_path_DX_DOT="$as_dir/$ac_word$ac_exec_ext" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - - ;; -esac -fi -DX_DOT=$ac_cv_path_DX_DOT -if test -n "$DX_DOT"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DX_DOT" >&5 -$as_echo "$DX_DOT" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - -fi -if test -z "$ac_cv_path_DX_DOT"; then - ac_pt_DX_DOT=$DX_DOT - # Extract the first word of "dot", so it can be a program name with args. -set dummy dot; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_path_ac_pt_DX_DOT+:} false; then : - $as_echo_n "(cached) " >&6 -else - case $ac_pt_DX_DOT in - [\\/]* | ?:[\\/]*) - ac_cv_path_ac_pt_DX_DOT="$ac_pt_DX_DOT" # Let the user override the test with a path. - ;; - *) - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_path_ac_pt_DX_DOT="$as_dir/$ac_word$ac_exec_ext" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - - ;; -esac -fi -ac_pt_DX_DOT=$ac_cv_path_ac_pt_DX_DOT -if test -n "$ac_pt_DX_DOT"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_pt_DX_DOT" >&5 -$as_echo "$ac_pt_DX_DOT" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - if test "x$ac_pt_DX_DOT" = x; then - DX_DOT="" - else - case $cross_compiling:$ac_tool_warned in -yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} -ac_tool_warned=yes ;; -esac - DX_DOT=$ac_pt_DX_DOT - fi -else - DX_DOT="$ac_cv_path_DX_DOT" -fi - -if test "$DX_FLAG_$DX_CURRENT_FEATURE$DX_DOT" = 1; then - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: dot not found - will not generate graphics for doxygen documentation" >&5 -$as_echo "$as_me: WARNING: dot not found - will not generate graphics for doxygen documentation" >&2;} - DX_FLAG_dot=0 - -fi - - : -fi -if test "$DX_FLAG_dot" = 1; then - if :; then - DX_COND_dot_TRUE= - DX_COND_dot_FALSE='#' -else - DX_COND_dot_TRUE='#' - DX_COND_dot_FALSE= -fi - - DX_ENV="$DX_ENV HAVE_DOT='YES'" - - DX_ENV="$DX_ENV DOT_PATH='`expr ".$DX_DOT" : '\(\.\)[^/]*$' \| "x$DX_DOT" : 'x\(.*\)/[^/]*$'`'" - - : -else - if false; then - DX_COND_dot_TRUE= - DX_COND_dot_FALSE='#' -else - DX_COND_dot_TRUE='#' - DX_COND_dot_FALSE= -fi - - DX_ENV="$DX_ENV HAVE_DOT='NO'" - - : -fi - - -# Man pages generation: - - - - @%:@ Check whether --enable-doxygen-man was given. -if test "${enable_doxygen_man+set}" = set; then : - enableval=$enable_doxygen_man; -case "$enableval" in -#( -y|Y|yes|Yes|YES) - DX_FLAG_man=1 - - -test "$DX_FLAG_doc" = "1" \ -|| as_fn_error $? "doxygen-man requires doxygen-man" "$LINENO" 5 - -;; #( -n|N|no|No|NO) - DX_FLAG_man=0 - -;; #( -*) - as_fn_error $? "invalid value '$enableval' given to doxygen-man" "$LINENO" 5 -;; -esac - -else - -DX_FLAG_man=0 - - -test "$DX_FLAG_doc" = "1" || DX_FLAG_man=0 - - - -fi - -if test "$DX_FLAG_man" = 1; then - - : -fi -if test "$DX_FLAG_man" = 1; then - if :; then - DX_COND_man_TRUE= - DX_COND_man_FALSE='#' -else - DX_COND_man_TRUE='#' - DX_COND_man_FALSE= -fi - - DX_ENV="$DX_ENV GENERATE_MAN='YES'" - - : -else - if false; then - DX_COND_man_TRUE= - DX_COND_man_FALSE='#' -else - DX_COND_man_TRUE='#' - DX_COND_man_FALSE= -fi - - DX_ENV="$DX_ENV GENERATE_MAN='NO'" - - : -fi - - -# RTF file generation: - - - - @%:@ Check whether --enable-doxygen-rtf was given. -if test "${enable_doxygen_rtf+set}" = set; then : - enableval=$enable_doxygen_rtf; -case "$enableval" in -#( -y|Y|yes|Yes|YES) - DX_FLAG_rtf=1 - - -test "$DX_FLAG_doc" = "1" \ -|| as_fn_error $? "doxygen-rtf requires doxygen-rtf" "$LINENO" 5 - -;; #( -n|N|no|No|NO) - DX_FLAG_rtf=0 - -;; #( -*) - as_fn_error $? "invalid value '$enableval' given to doxygen-rtf" "$LINENO" 5 -;; -esac - -else - -DX_FLAG_rtf=0 - - -test "$DX_FLAG_doc" = "1" || DX_FLAG_rtf=0 - - - -fi - -if test "$DX_FLAG_rtf" = 1; then - - : -fi -if test "$DX_FLAG_rtf" = 1; then - if :; then - DX_COND_rtf_TRUE= - DX_COND_rtf_FALSE='#' -else - DX_COND_rtf_TRUE='#' - DX_COND_rtf_FALSE= -fi - - DX_ENV="$DX_ENV GENERATE_RTF='YES'" - - : -else - if false; then - DX_COND_rtf_TRUE= - DX_COND_rtf_FALSE='#' -else - DX_COND_rtf_TRUE='#' - DX_COND_rtf_FALSE= -fi - - DX_ENV="$DX_ENV GENERATE_RTF='NO'" - - : -fi - - -# XML file generation: - - - - @%:@ Check whether --enable-doxygen-xml was given. -if test "${enable_doxygen_xml+set}" = set; then : - enableval=$enable_doxygen_xml; -case "$enableval" in -#( -y|Y|yes|Yes|YES) - DX_FLAG_xml=1 - - -test "$DX_FLAG_doc" = "1" \ -|| as_fn_error $? "doxygen-xml requires doxygen-xml" "$LINENO" 5 - -;; #( -n|N|no|No|NO) - DX_FLAG_xml=0 - -;; #( -*) - as_fn_error $? "invalid value '$enableval' given to doxygen-xml" "$LINENO" 5 -;; -esac - -else - -DX_FLAG_xml=0 - - -test "$DX_FLAG_doc" = "1" || DX_FLAG_xml=0 - - - -fi - -if test "$DX_FLAG_xml" = 1; then - - : -fi -if test "$DX_FLAG_xml" = 1; then - if :; then - DX_COND_xml_TRUE= - DX_COND_xml_FALSE='#' -else - DX_COND_xml_TRUE='#' - DX_COND_xml_FALSE= -fi - - DX_ENV="$DX_ENV GENERATE_XML='YES'" - - : -else - if false; then - DX_COND_xml_TRUE= - DX_COND_xml_FALSE='#' -else - DX_COND_xml_TRUE='#' - DX_COND_xml_FALSE= -fi - - DX_ENV="$DX_ENV GENERATE_XML='NO'" - - : -fi - - -# (Compressed) HTML help generation: - - - - @%:@ Check whether --enable-doxygen-chm was given. -if test "${enable_doxygen_chm+set}" = set; then : - enableval=$enable_doxygen_chm; -case "$enableval" in -#( -y|Y|yes|Yes|YES) - DX_FLAG_chm=1 - - -test "$DX_FLAG_doc" = "1" \ -|| as_fn_error $? "doxygen-chm requires doxygen-chm" "$LINENO" 5 - -;; #( -n|N|no|No|NO) - DX_FLAG_chm=0 - -;; #( -*) - as_fn_error $? "invalid value '$enableval' given to doxygen-chm" "$LINENO" 5 -;; -esac - -else - -DX_FLAG_chm=0 - - -test "$DX_FLAG_doc" = "1" || DX_FLAG_chm=0 - - - -fi - -if test "$DX_FLAG_chm" = 1; then - -if test -n "$ac_tool_prefix"; then - # Extract the first word of "${ac_tool_prefix}hhc", so it can be a program name with args. -set dummy ${ac_tool_prefix}hhc; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_path_DX_HHC+:} false; then : - $as_echo_n "(cached) " >&6 -else - case $DX_HHC in - [\\/]* | ?:[\\/]*) - ac_cv_path_DX_HHC="$DX_HHC" # Let the user override the test with a path. - ;; - *) - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_path_DX_HHC="$as_dir/$ac_word$ac_exec_ext" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - - ;; -esac -fi -DX_HHC=$ac_cv_path_DX_HHC -if test -n "$DX_HHC"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DX_HHC" >&5 -$as_echo "$DX_HHC" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - -fi -if test -z "$ac_cv_path_DX_HHC"; then - ac_pt_DX_HHC=$DX_HHC - # Extract the first word of "hhc", so it can be a program name with args. -set dummy hhc; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_path_ac_pt_DX_HHC+:} false; then : - $as_echo_n "(cached) " >&6 -else - case $ac_pt_DX_HHC in - [\\/]* | ?:[\\/]*) - ac_cv_path_ac_pt_DX_HHC="$ac_pt_DX_HHC" # Let the user override the test with a path. - ;; - *) - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_path_ac_pt_DX_HHC="$as_dir/$ac_word$ac_exec_ext" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - - ;; -esac -fi -ac_pt_DX_HHC=$ac_cv_path_ac_pt_DX_HHC -if test -n "$ac_pt_DX_HHC"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_pt_DX_HHC" >&5 -$as_echo "$ac_pt_DX_HHC" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - if test "x$ac_pt_DX_HHC" = x; then - DX_HHC="" - else - case $cross_compiling:$ac_tool_warned in -yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} -ac_tool_warned=yes ;; -esac - DX_HHC=$ac_pt_DX_HHC - fi -else - DX_HHC="$ac_cv_path_DX_HHC" -fi - -if test "$DX_FLAG_$DX_CURRENT_FEATURE$DX_HHC" = 1; then - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: hhc not found - will not generate doxygen compressed HTML help documentation" >&5 -$as_echo "$as_me: WARNING: hhc not found - will not generate doxygen compressed HTML help documentation" >&2;} - DX_FLAG_chm=0 - -fi - - : -fi -if test "$DX_FLAG_chm" = 1; then - if :; then - DX_COND_chm_TRUE= - DX_COND_chm_FALSE='#' -else - DX_COND_chm_TRUE='#' - DX_COND_chm_FALSE= -fi - - DX_ENV="$DX_ENV HHC_PATH='$DX_HHC'" - - DX_ENV="$DX_ENV GENERATE_HTML='YES'" - - DX_ENV="$DX_ENV GENERATE_HTMLHELP='YES'" - - : -else - if false; then - DX_COND_chm_TRUE= - DX_COND_chm_FALSE='#' -else - DX_COND_chm_TRUE='#' - DX_COND_chm_FALSE= -fi - - DX_ENV="$DX_ENV GENERATE_HTMLHELP='NO'" - - : -fi - - -# Seperate CHI file generation. - - - - @%:@ Check whether --enable-doxygen-chi was given. -if test "${enable_doxygen_chi+set}" = set; then : - enableval=$enable_doxygen_chi; -case "$enableval" in -#( -y|Y|yes|Yes|YES) - DX_FLAG_chi=1 - - -test "$DX_FLAG_chm" = "1" \ -|| as_fn_error $? "doxygen-chi requires doxygen-chi" "$LINENO" 5 - -;; #( -n|N|no|No|NO) - DX_FLAG_chi=0 - -;; #( -*) - as_fn_error $? "invalid value '$enableval' given to doxygen-chi" "$LINENO" 5 -;; -esac - -else - -DX_FLAG_chi=0 - - -test "$DX_FLAG_chm" = "1" || DX_FLAG_chi=0 - - - -fi - -if test "$DX_FLAG_chi" = 1; then - - : -fi -if test "$DX_FLAG_chi" = 1; then - if :; then - DX_COND_chi_TRUE= - DX_COND_chi_FALSE='#' -else - DX_COND_chi_TRUE='#' - DX_COND_chi_FALSE= -fi - - DX_ENV="$DX_ENV GENERATE_CHI='YES'" - - : -else - if false; then - DX_COND_chi_TRUE= - DX_COND_chi_FALSE='#' -else - DX_COND_chi_TRUE='#' - DX_COND_chi_FALSE= -fi - - DX_ENV="$DX_ENV GENERATE_CHI='NO'" - - : -fi - - -# Plain HTML pages generation: - - - - @%:@ Check whether --enable-doxygen-html was given. -if test "${enable_doxygen_html+set}" = set; then : - enableval=$enable_doxygen_html; -case "$enableval" in -#( -y|Y|yes|Yes|YES) - DX_FLAG_html=1 - - -test "$DX_FLAG_doc" = "1" \ -|| as_fn_error $? "doxygen-html requires doxygen-html" "$LINENO" 5 - -test "$DX_FLAG_chm" = "0" \ -|| as_fn_error $? "doxygen-html contradicts doxygen-html" "$LINENO" 5 - -;; #( -n|N|no|No|NO) - DX_FLAG_html=0 - -;; #( -*) - as_fn_error $? "invalid value '$enableval' given to doxygen-html" "$LINENO" 5 -;; -esac - -else - -DX_FLAG_html=1 - - -test "$DX_FLAG_doc" = "1" || DX_FLAG_html=0 - - -test "$DX_FLAG_chm" = "0" || DX_FLAG_html=0 - - - -fi - -if test "$DX_FLAG_html" = 1; then - - : -fi -if test "$DX_FLAG_html" = 1; then - if :; then - DX_COND_html_TRUE= - DX_COND_html_FALSE='#' -else - DX_COND_html_TRUE='#' - DX_COND_html_FALSE= -fi - - DX_ENV="$DX_ENV GENERATE_HTML='YES'" - - : -else - if false; then - DX_COND_html_TRUE= - DX_COND_html_FALSE='#' -else - DX_COND_html_TRUE='#' - DX_COND_html_FALSE= -fi - - test "$DX_FLAG_chm" = 1 || DX_ENV="$DX_ENV GENERATE_HTML='NO'" - - : -fi - - -# PostScript file generation: - - - - @%:@ Check whether --enable-doxygen-ps was given. -if test "${enable_doxygen_ps+set}" = set; then : - enableval=$enable_doxygen_ps; -case "$enableval" in -#( -y|Y|yes|Yes|YES) - DX_FLAG_ps=1 - - -test "$DX_FLAG_doc" = "1" \ -|| as_fn_error $? "doxygen-ps requires doxygen-ps" "$LINENO" 5 - -;; #( -n|N|no|No|NO) - DX_FLAG_ps=0 - -;; #( -*) - as_fn_error $? "invalid value '$enableval' given to doxygen-ps" "$LINENO" 5 -;; -esac - -else - -DX_FLAG_ps=0 - - -test "$DX_FLAG_doc" = "1" || DX_FLAG_ps=0 - - - -fi - -if test "$DX_FLAG_ps" = 1; then - -if test -n "$ac_tool_prefix"; then - # Extract the first word of "${ac_tool_prefix}latex", so it can be a program name with args. -set dummy ${ac_tool_prefix}latex; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_path_DX_LATEX+:} false; then : - $as_echo_n "(cached) " >&6 -else - case $DX_LATEX in - [\\/]* | ?:[\\/]*) - ac_cv_path_DX_LATEX="$DX_LATEX" # Let the user override the test with a path. - ;; - *) - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_path_DX_LATEX="$as_dir/$ac_word$ac_exec_ext" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - - ;; -esac -fi -DX_LATEX=$ac_cv_path_DX_LATEX -if test -n "$DX_LATEX"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DX_LATEX" >&5 -$as_echo "$DX_LATEX" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - -fi -if test -z "$ac_cv_path_DX_LATEX"; then - ac_pt_DX_LATEX=$DX_LATEX - # Extract the first word of "latex", so it can be a program name with args. -set dummy latex; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_path_ac_pt_DX_LATEX+:} false; then : - $as_echo_n "(cached) " >&6 -else - case $ac_pt_DX_LATEX in - [\\/]* | ?:[\\/]*) - ac_cv_path_ac_pt_DX_LATEX="$ac_pt_DX_LATEX" # Let the user override the test with a path. - ;; - *) - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_path_ac_pt_DX_LATEX="$as_dir/$ac_word$ac_exec_ext" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - - ;; -esac -fi -ac_pt_DX_LATEX=$ac_cv_path_ac_pt_DX_LATEX -if test -n "$ac_pt_DX_LATEX"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_pt_DX_LATEX" >&5 -$as_echo "$ac_pt_DX_LATEX" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - if test "x$ac_pt_DX_LATEX" = x; then - DX_LATEX="" - else - case $cross_compiling:$ac_tool_warned in -yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} -ac_tool_warned=yes ;; -esac - DX_LATEX=$ac_pt_DX_LATEX - fi -else - DX_LATEX="$ac_cv_path_DX_LATEX" -fi - -if test "$DX_FLAG_$DX_CURRENT_FEATURE$DX_LATEX" = 1; then - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: latex not found - will not generate doxygen PostScript documentation" >&5 -$as_echo "$as_me: WARNING: latex not found - will not generate doxygen PostScript documentation" >&2;} - DX_FLAG_ps=0 - -fi - - -if test -n "$ac_tool_prefix"; then - # Extract the first word of "${ac_tool_prefix}makeindex", so it can be a program name with args. -set dummy ${ac_tool_prefix}makeindex; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_path_DX_MAKEINDEX+:} false; then : - $as_echo_n "(cached) " >&6 -else - case $DX_MAKEINDEX in - [\\/]* | ?:[\\/]*) - ac_cv_path_DX_MAKEINDEX="$DX_MAKEINDEX" # Let the user override the test with a path. - ;; - *) - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_path_DX_MAKEINDEX="$as_dir/$ac_word$ac_exec_ext" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - - ;; -esac -fi -DX_MAKEINDEX=$ac_cv_path_DX_MAKEINDEX -if test -n "$DX_MAKEINDEX"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DX_MAKEINDEX" >&5 -$as_echo "$DX_MAKEINDEX" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - -fi -if test -z "$ac_cv_path_DX_MAKEINDEX"; then - ac_pt_DX_MAKEINDEX=$DX_MAKEINDEX - # Extract the first word of "makeindex", so it can be a program name with args. -set dummy makeindex; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_path_ac_pt_DX_MAKEINDEX+:} false; then : - $as_echo_n "(cached) " >&6 -else - case $ac_pt_DX_MAKEINDEX in - [\\/]* | ?:[\\/]*) - ac_cv_path_ac_pt_DX_MAKEINDEX="$ac_pt_DX_MAKEINDEX" # Let the user override the test with a path. - ;; - *) - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_path_ac_pt_DX_MAKEINDEX="$as_dir/$ac_word$ac_exec_ext" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - - ;; -esac -fi -ac_pt_DX_MAKEINDEX=$ac_cv_path_ac_pt_DX_MAKEINDEX -if test -n "$ac_pt_DX_MAKEINDEX"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_pt_DX_MAKEINDEX" >&5 -$as_echo "$ac_pt_DX_MAKEINDEX" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - if test "x$ac_pt_DX_MAKEINDEX" = x; then - DX_MAKEINDEX="" - else - case $cross_compiling:$ac_tool_warned in -yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} -ac_tool_warned=yes ;; -esac - DX_MAKEINDEX=$ac_pt_DX_MAKEINDEX - fi -else - DX_MAKEINDEX="$ac_cv_path_DX_MAKEINDEX" -fi - -if test "$DX_FLAG_$DX_CURRENT_FEATURE$DX_MAKEINDEX" = 1; then - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: makeindex not found - will not generate doxygen PostScript documentation" >&5 -$as_echo "$as_me: WARNING: makeindex not found - will not generate doxygen PostScript documentation" >&2;} - DX_FLAG_ps=0 - -fi - - -if test -n "$ac_tool_prefix"; then - # Extract the first word of "${ac_tool_prefix}dvips", so it can be a program name with args. -set dummy ${ac_tool_prefix}dvips; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_path_DX_DVIPS+:} false; then : - $as_echo_n "(cached) " >&6 -else - case $DX_DVIPS in - [\\/]* | ?:[\\/]*) - ac_cv_path_DX_DVIPS="$DX_DVIPS" # Let the user override the test with a path. - ;; - *) - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_path_DX_DVIPS="$as_dir/$ac_word$ac_exec_ext" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - - ;; -esac -fi -DX_DVIPS=$ac_cv_path_DX_DVIPS -if test -n "$DX_DVIPS"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DX_DVIPS" >&5 -$as_echo "$DX_DVIPS" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - -fi -if test -z "$ac_cv_path_DX_DVIPS"; then - ac_pt_DX_DVIPS=$DX_DVIPS - # Extract the first word of "dvips", so it can be a program name with args. -set dummy dvips; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_path_ac_pt_DX_DVIPS+:} false; then : - $as_echo_n "(cached) " >&6 -else - case $ac_pt_DX_DVIPS in - [\\/]* | ?:[\\/]*) - ac_cv_path_ac_pt_DX_DVIPS="$ac_pt_DX_DVIPS" # Let the user override the test with a path. - ;; - *) - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_path_ac_pt_DX_DVIPS="$as_dir/$ac_word$ac_exec_ext" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - - ;; -esac -fi -ac_pt_DX_DVIPS=$ac_cv_path_ac_pt_DX_DVIPS -if test -n "$ac_pt_DX_DVIPS"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_pt_DX_DVIPS" >&5 -$as_echo "$ac_pt_DX_DVIPS" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - if test "x$ac_pt_DX_DVIPS" = x; then - DX_DVIPS="" - else - case $cross_compiling:$ac_tool_warned in -yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} -ac_tool_warned=yes ;; -esac - DX_DVIPS=$ac_pt_DX_DVIPS - fi -else - DX_DVIPS="$ac_cv_path_DX_DVIPS" -fi - -if test "$DX_FLAG_$DX_CURRENT_FEATURE$DX_DVIPS" = 1; then - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: dvips not found - will not generate doxygen PostScript documentation" >&5 -$as_echo "$as_me: WARNING: dvips not found - will not generate doxygen PostScript documentation" >&2;} - DX_FLAG_ps=0 - -fi - - -if test -n "$ac_tool_prefix"; then - # Extract the first word of "${ac_tool_prefix}egrep", so it can be a program name with args. -set dummy ${ac_tool_prefix}egrep; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_path_DX_EGREP+:} false; then : - $as_echo_n "(cached) " >&6 -else - case $DX_EGREP in - [\\/]* | ?:[\\/]*) - ac_cv_path_DX_EGREP="$DX_EGREP" # Let the user override the test with a path. - ;; - *) - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_path_DX_EGREP="$as_dir/$ac_word$ac_exec_ext" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - - ;; -esac -fi -DX_EGREP=$ac_cv_path_DX_EGREP -if test -n "$DX_EGREP"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DX_EGREP" >&5 -$as_echo "$DX_EGREP" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - -fi -if test -z "$ac_cv_path_DX_EGREP"; then - ac_pt_DX_EGREP=$DX_EGREP - # Extract the first word of "egrep", so it can be a program name with args. -set dummy egrep; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_path_ac_pt_DX_EGREP+:} false; then : - $as_echo_n "(cached) " >&6 -else - case $ac_pt_DX_EGREP in - [\\/]* | ?:[\\/]*) - ac_cv_path_ac_pt_DX_EGREP="$ac_pt_DX_EGREP" # Let the user override the test with a path. - ;; - *) - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_path_ac_pt_DX_EGREP="$as_dir/$ac_word$ac_exec_ext" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - - ;; -esac -fi -ac_pt_DX_EGREP=$ac_cv_path_ac_pt_DX_EGREP -if test -n "$ac_pt_DX_EGREP"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_pt_DX_EGREP" >&5 -$as_echo "$ac_pt_DX_EGREP" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - if test "x$ac_pt_DX_EGREP" = x; then - DX_EGREP="" - else - case $cross_compiling:$ac_tool_warned in -yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} -ac_tool_warned=yes ;; -esac - DX_EGREP=$ac_pt_DX_EGREP - fi -else - DX_EGREP="$ac_cv_path_DX_EGREP" -fi - -if test "$DX_FLAG_$DX_CURRENT_FEATURE$DX_EGREP" = 1; then - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: egrep not found - will not generate doxygen PostScript documentation" >&5 -$as_echo "$as_me: WARNING: egrep not found - will not generate doxygen PostScript documentation" >&2;} - DX_FLAG_ps=0 - -fi - - : -fi -if test "$DX_FLAG_ps" = 1; then - if :; then - DX_COND_ps_TRUE= - DX_COND_ps_FALSE='#' -else - DX_COND_ps_TRUE='#' - DX_COND_ps_FALSE= -fi - - - : -else - if false; then - DX_COND_ps_TRUE= - DX_COND_ps_FALSE='#' -else - DX_COND_ps_TRUE='#' - DX_COND_ps_FALSE= -fi - - - : -fi - - -# PDF file generation: - - - - @%:@ Check whether --enable-doxygen-pdf was given. -if test "${enable_doxygen_pdf+set}" = set; then : - enableval=$enable_doxygen_pdf; -case "$enableval" in -#( -y|Y|yes|Yes|YES) - DX_FLAG_pdf=1 - - -test "$DX_FLAG_doc" = "1" \ -|| as_fn_error $? "doxygen-pdf requires doxygen-pdf" "$LINENO" 5 - -;; #( -n|N|no|No|NO) - DX_FLAG_pdf=0 - -;; #( -*) - as_fn_error $? "invalid value '$enableval' given to doxygen-pdf" "$LINENO" 5 -;; -esac - -else - -DX_FLAG_pdf=0 - - -test "$DX_FLAG_doc" = "1" || DX_FLAG_pdf=0 - - - -fi - -if test "$DX_FLAG_pdf" = 1; then - -if test -n "$ac_tool_prefix"; then - # Extract the first word of "${ac_tool_prefix}pdflatex", so it can be a program name with args. -set dummy ${ac_tool_prefix}pdflatex; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_path_DX_PDFLATEX+:} false; then : - $as_echo_n "(cached) " >&6 -else - case $DX_PDFLATEX in - [\\/]* | ?:[\\/]*) - ac_cv_path_DX_PDFLATEX="$DX_PDFLATEX" # Let the user override the test with a path. - ;; - *) - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_path_DX_PDFLATEX="$as_dir/$ac_word$ac_exec_ext" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - - ;; -esac -fi -DX_PDFLATEX=$ac_cv_path_DX_PDFLATEX -if test -n "$DX_PDFLATEX"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DX_PDFLATEX" >&5 -$as_echo "$DX_PDFLATEX" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - -fi -if test -z "$ac_cv_path_DX_PDFLATEX"; then - ac_pt_DX_PDFLATEX=$DX_PDFLATEX - # Extract the first word of "pdflatex", so it can be a program name with args. -set dummy pdflatex; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_path_ac_pt_DX_PDFLATEX+:} false; then : - $as_echo_n "(cached) " >&6 -else - case $ac_pt_DX_PDFLATEX in - [\\/]* | ?:[\\/]*) - ac_cv_path_ac_pt_DX_PDFLATEX="$ac_pt_DX_PDFLATEX" # Let the user override the test with a path. - ;; - *) - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_path_ac_pt_DX_PDFLATEX="$as_dir/$ac_word$ac_exec_ext" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - - ;; -esac -fi -ac_pt_DX_PDFLATEX=$ac_cv_path_ac_pt_DX_PDFLATEX -if test -n "$ac_pt_DX_PDFLATEX"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_pt_DX_PDFLATEX" >&5 -$as_echo "$ac_pt_DX_PDFLATEX" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - if test "x$ac_pt_DX_PDFLATEX" = x; then - DX_PDFLATEX="" - else - case $cross_compiling:$ac_tool_warned in -yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} -ac_tool_warned=yes ;; -esac - DX_PDFLATEX=$ac_pt_DX_PDFLATEX - fi -else - DX_PDFLATEX="$ac_cv_path_DX_PDFLATEX" -fi - -if test "$DX_FLAG_$DX_CURRENT_FEATURE$DX_PDFLATEX" = 1; then - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: pdflatex not found - will not generate doxygen PDF documentation" >&5 -$as_echo "$as_me: WARNING: pdflatex not found - will not generate doxygen PDF documentation" >&2;} - DX_FLAG_pdf=0 - -fi - - -if test -n "$ac_tool_prefix"; then - # Extract the first word of "${ac_tool_prefix}makeindex", so it can be a program name with args. -set dummy ${ac_tool_prefix}makeindex; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_path_DX_MAKEINDEX+:} false; then : - $as_echo_n "(cached) " >&6 -else - case $DX_MAKEINDEX in - [\\/]* | ?:[\\/]*) - ac_cv_path_DX_MAKEINDEX="$DX_MAKEINDEX" # Let the user override the test with a path. - ;; - *) - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_path_DX_MAKEINDEX="$as_dir/$ac_word$ac_exec_ext" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - - ;; -esac -fi -DX_MAKEINDEX=$ac_cv_path_DX_MAKEINDEX -if test -n "$DX_MAKEINDEX"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DX_MAKEINDEX" >&5 -$as_echo "$DX_MAKEINDEX" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - -fi -if test -z "$ac_cv_path_DX_MAKEINDEX"; then - ac_pt_DX_MAKEINDEX=$DX_MAKEINDEX - # Extract the first word of "makeindex", so it can be a program name with args. -set dummy makeindex; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_path_ac_pt_DX_MAKEINDEX+:} false; then : - $as_echo_n "(cached) " >&6 -else - case $ac_pt_DX_MAKEINDEX in - [\\/]* | ?:[\\/]*) - ac_cv_path_ac_pt_DX_MAKEINDEX="$ac_pt_DX_MAKEINDEX" # Let the user override the test with a path. - ;; - *) - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_path_ac_pt_DX_MAKEINDEX="$as_dir/$ac_word$ac_exec_ext" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - - ;; -esac -fi -ac_pt_DX_MAKEINDEX=$ac_cv_path_ac_pt_DX_MAKEINDEX -if test -n "$ac_pt_DX_MAKEINDEX"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_pt_DX_MAKEINDEX" >&5 -$as_echo "$ac_pt_DX_MAKEINDEX" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - if test "x$ac_pt_DX_MAKEINDEX" = x; then - DX_MAKEINDEX="" - else - case $cross_compiling:$ac_tool_warned in -yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} -ac_tool_warned=yes ;; -esac - DX_MAKEINDEX=$ac_pt_DX_MAKEINDEX - fi -else - DX_MAKEINDEX="$ac_cv_path_DX_MAKEINDEX" -fi - -if test "$DX_FLAG_$DX_CURRENT_FEATURE$DX_MAKEINDEX" = 1; then - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: makeindex not found - will not generate doxygen PDF documentation" >&5 -$as_echo "$as_me: WARNING: makeindex not found - will not generate doxygen PDF documentation" >&2;} - DX_FLAG_pdf=0 - -fi - - -if test -n "$ac_tool_prefix"; then - # Extract the first word of "${ac_tool_prefix}egrep", so it can be a program name with args. -set dummy ${ac_tool_prefix}egrep; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_path_DX_EGREP+:} false; then : - $as_echo_n "(cached) " >&6 -else - case $DX_EGREP in - [\\/]* | ?:[\\/]*) - ac_cv_path_DX_EGREP="$DX_EGREP" # Let the user override the test with a path. - ;; - *) - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_path_DX_EGREP="$as_dir/$ac_word$ac_exec_ext" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - - ;; -esac -fi -DX_EGREP=$ac_cv_path_DX_EGREP -if test -n "$DX_EGREP"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DX_EGREP" >&5 -$as_echo "$DX_EGREP" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - -fi -if test -z "$ac_cv_path_DX_EGREP"; then - ac_pt_DX_EGREP=$DX_EGREP - # Extract the first word of "egrep", so it can be a program name with args. -set dummy egrep; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_path_ac_pt_DX_EGREP+:} false; then : - $as_echo_n "(cached) " >&6 -else - case $ac_pt_DX_EGREP in - [\\/]* | ?:[\\/]*) - ac_cv_path_ac_pt_DX_EGREP="$ac_pt_DX_EGREP" # Let the user override the test with a path. - ;; - *) - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_path_ac_pt_DX_EGREP="$as_dir/$ac_word$ac_exec_ext" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - - ;; -esac -fi -ac_pt_DX_EGREP=$ac_cv_path_ac_pt_DX_EGREP -if test -n "$ac_pt_DX_EGREP"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_pt_DX_EGREP" >&5 -$as_echo "$ac_pt_DX_EGREP" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - if test "x$ac_pt_DX_EGREP" = x; then - DX_EGREP="" - else - case $cross_compiling:$ac_tool_warned in -yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} -ac_tool_warned=yes ;; -esac - DX_EGREP=$ac_pt_DX_EGREP - fi -else - DX_EGREP="$ac_cv_path_DX_EGREP" -fi - -if test "$DX_FLAG_$DX_CURRENT_FEATURE$DX_EGREP" = 1; then - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: egrep not found - will not generate doxygen PDF documentation" >&5 -$as_echo "$as_me: WARNING: egrep not found - will not generate doxygen PDF documentation" >&2;} - DX_FLAG_pdf=0 - -fi - - : -fi -if test "$DX_FLAG_pdf" = 1; then - if :; then - DX_COND_pdf_TRUE= - DX_COND_pdf_FALSE='#' -else - DX_COND_pdf_TRUE='#' - DX_COND_pdf_FALSE= -fi - - - : -else - if false; then - DX_COND_pdf_TRUE= - DX_COND_pdf_FALSE='#' -else - DX_COND_pdf_TRUE='#' - DX_COND_pdf_FALSE= -fi - - - : -fi - - -# LaTeX generation for PS and/or PDF: -if test "$DX_FLAG_ps" = 1 || test "$DX_FLAG_pdf" = 1; then - if :; then - DX_COND_latex_TRUE= - DX_COND_latex_FALSE='#' -else - DX_COND_latex_TRUE='#' - DX_COND_latex_FALSE= -fi - - DX_ENV="$DX_ENV GENERATE_LATEX='YES'" - -else - if false; then - DX_COND_latex_TRUE= - DX_COND_latex_FALSE='#' -else - DX_COND_latex_TRUE='#' - DX_COND_latex_FALSE= -fi - - DX_ENV="$DX_ENV GENERATE_LATEX='NO'" - -fi - -# Paper size for PS and/or PDF: - -case "$DOXYGEN_PAPER_SIZE" in -#( -"") - DOXYGEN_PAPER_SIZE="" - -;; #( -a4wide|a4|letter|legal|executive) - DX_ENV="$DX_ENV PAPER_SIZE='$DOXYGEN_PAPER_SIZE'" - -;; #( -*) - as_fn_error $? "unknown DOXYGEN_PAPER_SIZE='$DOXYGEN_PAPER_SIZE'" "$LINENO" 5 -;; -esac - -#For debugging: -#echo DX_FLAG_doc=$DX_FLAG_doc -#echo DX_FLAG_dot=$DX_FLAG_dot -#echo DX_FLAG_man=$DX_FLAG_man -#echo DX_FLAG_html=$DX_FLAG_html -#echo DX_FLAG_chm=$DX_FLAG_chm -#echo DX_FLAG_chi=$DX_FLAG_chi -#echo DX_FLAG_rtf=$DX_FLAG_rtf -#echo DX_FLAG_xml=$DX_FLAG_xml -#echo DX_FLAG_pdf=$DX_FLAG_pdf -#echo DX_FLAG_ps=$DX_FLAG_ps -#echo DX_ENV=$DX_ENV - - -# initialize automake -am__api_version='1.11' - -ac_aux_dir= -for ac_dir in "$srcdir" "$srcdir/.." "$srcdir/../.."; do - if test -f "$ac_dir/install-sh"; then - ac_aux_dir=$ac_dir - ac_install_sh="$ac_aux_dir/install-sh -c" - break - elif test -f "$ac_dir/install.sh"; then - ac_aux_dir=$ac_dir - ac_install_sh="$ac_aux_dir/install.sh -c" - break - elif test -f "$ac_dir/shtool"; then - ac_aux_dir=$ac_dir - ac_install_sh="$ac_aux_dir/shtool install -c" - break - fi -done -if test -z "$ac_aux_dir"; then - as_fn_error $? "cannot find install-sh, install.sh, or shtool in \"$srcdir\" \"$srcdir/..\" \"$srcdir/../..\"" "$LINENO" 5 -fi - -# These three variables are undocumented and unsupported, -# and are intended to be withdrawn in a future Autoconf release. -# They can cause serious problems if a builder's source tree is in a directory -# whose full name contains unusual characters. -ac_config_guess="$SHELL $ac_aux_dir/config.guess" # Please don't use this var. -ac_config_sub="$SHELL $ac_aux_dir/config.sub" # Please don't use this var. -ac_configure="$SHELL $ac_aux_dir/configure" # Please don't use this var. - - -# Find a good install program. We prefer a C program (faster), -# so one script is as good as another. But avoid the broken or -# incompatible versions: -# SysV /etc/install, /usr/sbin/install -# SunOS /usr/etc/install -# IRIX /sbin/install -# AIX /bin/install -# AmigaOS /C/install, which installs bootblocks on floppy discs -# AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag -# AFS /usr/afsws/bin/install, which mishandles nonexistent args -# SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff" -# OS/2's system install, which has a completely different semantic -# ./install, which can be erroneously created by make from ./install.sh. -# Reject install programs that cannot install multiple files. -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a BSD-compatible install" >&5 -$as_echo_n "checking for a BSD-compatible install... " >&6; } -if test -z "$INSTALL"; then -if ${ac_cv_path_install+:} false; then : - $as_echo_n "(cached) " >&6 -else - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - # Account for people who put trailing slashes in PATH elements. -case $as_dir/ in @%:@(( - ./ | .// | /[cC]/* | \ - /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \ - ?:[\\/]os2[\\/]install[\\/]* | ?:[\\/]OS2[\\/]INSTALL[\\/]* | \ - /usr/ucb/* ) ;; - *) - # OSF1 and SCO ODT 3.0 have their own names for install. - # Don't use installbsd from OSF since it installs stuff as root - # by default. - for ac_prog in ginstall scoinst install; do - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_prog$ac_exec_ext"; then - if test $ac_prog = install && - grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then - # AIX install. It has an incompatible calling convention. - : - elif test $ac_prog = install && - grep pwplus "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then - # program-specific install script used by HP pwplus--don't use. - : - else - rm -rf conftest.one conftest.two conftest.dir - echo one > conftest.one - echo two > conftest.two - mkdir conftest.dir - if "$as_dir/$ac_prog$ac_exec_ext" -c conftest.one conftest.two "`pwd`/conftest.dir" && - test -s conftest.one && test -s conftest.two && - test -s conftest.dir/conftest.one && - test -s conftest.dir/conftest.two - then - ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c" - break 3 - fi - fi - fi - done - done - ;; -esac - - done -IFS=$as_save_IFS - -rm -rf conftest.one conftest.two conftest.dir - -fi - if test "${ac_cv_path_install+set}" = set; then - INSTALL=$ac_cv_path_install - else - # As a last resort, use the slow shell script. Don't cache a - # value for INSTALL within a source directory, because that will - # break other packages using the cache if that directory is - # removed, or if the value is a relative name. - INSTALL=$ac_install_sh - fi -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $INSTALL" >&5 -$as_echo "$INSTALL" >&6; } - -# Use test -z because SunOS4 sh mishandles braces in ${var-val}. -# It thinks the first close brace ends the variable substitution. -test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}' - -test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}' - -test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644' - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether build environment is sane" >&5 -$as_echo_n "checking whether build environment is sane... " >&6; } -# Just in case -sleep 1 -echo timestamp > conftest.file -# Reject unsafe characters in $srcdir or the absolute working directory -# name. Accept space and tab only in the latter. -am_lf=' -' -case `pwd` in - *[\\\"\#\$\&\'\`$am_lf]*) - as_fn_error $? "unsafe absolute working directory name" "$LINENO" 5;; -esac -case $srcdir in - *[\\\"\#\$\&\'\`$am_lf\ \ ]*) - as_fn_error $? "unsafe srcdir value: \`$srcdir'" "$LINENO" 5;; -esac - -# Do `set' in a subshell so we don't clobber the current shell's -# arguments. Must try -L first in case configure is actually a -# symlink; some systems play weird games with the mod time of symlinks -# (eg FreeBSD returns the mod time of the symlink's containing -# directory). -if ( - set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null` - if test "$*" = "X"; then - # -L didn't work. - set X `ls -t "$srcdir/configure" conftest.file` - fi - rm -f conftest.file - if test "$*" != "X $srcdir/configure conftest.file" \ - && test "$*" != "X conftest.file $srcdir/configure"; then - - # If neither matched, then we have a broken ls. This can happen - # if, for instance, CONFIG_SHELL is bash and it inherits a - # broken ls alias from the environment. This has actually - # happened. Such a system could not be considered "sane". - as_fn_error $? "ls -t appears to fail. Make sure there is not a broken -alias in your environment" "$LINENO" 5 - fi - - test "$2" = conftest.file - ) -then - # Ok. - : -else - as_fn_error $? "newly created file is older than distributed files! -Check your system clock" "$LINENO" 5 -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; } -test "$program_prefix" != NONE && - program_transform_name="s&^&$program_prefix&;$program_transform_name" -# Use a double $ so make ignores it. -test "$program_suffix" != NONE && - program_transform_name="s&\$&$program_suffix&;$program_transform_name" -# Double any \ or $. -# By default was `s,x,x', remove it if useless. -ac_script='s/[\\$]/&&/g;s/;s,x,x,$//' -program_transform_name=`$as_echo "$program_transform_name" | sed "$ac_script"` - -# expand $ac_aux_dir to an absolute path -am_aux_dir=`cd $ac_aux_dir && pwd` - -if test x"${MISSING+set}" != xset; then - case $am_aux_dir in - *\ * | *\ *) - MISSING="\${SHELL} \"$am_aux_dir/missing\"" ;; - *) - MISSING="\${SHELL} $am_aux_dir/missing" ;; - esac -fi -# Use eval to expand $SHELL -if eval "$MISSING --run true"; then - am_missing_run="$MISSING --run " -else - am_missing_run= - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: \`missing' script is too old or missing" >&5 -$as_echo "$as_me: WARNING: \`missing' script is too old or missing" >&2;} -fi - -if test x"${install_sh}" != xset; then - case $am_aux_dir in - *\ * | *\ *) - install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;; - *) - install_sh="\${SHELL} $am_aux_dir/install-sh" - esac -fi - -# Installed binaries are usually stripped using `strip' when the user -# run `make install-strip'. However `strip' might not be the right -# tool to use in cross-compilation environments, therefore Automake -# will honor the `STRIP' environment variable to overrule this program. -if test "$cross_compiling" != no; then - if test -n "$ac_tool_prefix"; then - # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args. -set dummy ${ac_tool_prefix}strip; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_STRIP+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$STRIP"; then - ac_cv_prog_STRIP="$STRIP" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_STRIP="${ac_tool_prefix}strip" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -STRIP=$ac_cv_prog_STRIP -if test -n "$STRIP"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $STRIP" >&5 -$as_echo "$STRIP" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - -fi -if test -z "$ac_cv_prog_STRIP"; then - ac_ct_STRIP=$STRIP - # Extract the first word of "strip", so it can be a program name with args. -set dummy strip; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_ac_ct_STRIP+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$ac_ct_STRIP"; then - ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_ac_ct_STRIP="strip" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP -if test -n "$ac_ct_STRIP"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP" >&5 -$as_echo "$ac_ct_STRIP" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - if test "x$ac_ct_STRIP" = x; then - STRIP=":" - else - case $cross_compiling:$ac_tool_warned in -yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} -ac_tool_warned=yes ;; -esac - STRIP=$ac_ct_STRIP - fi -else - STRIP="$ac_cv_prog_STRIP" -fi - -fi -INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s" - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a thread-safe mkdir -p" >&5 -$as_echo_n "checking for a thread-safe mkdir -p... " >&6; } -if test -z "$MKDIR_P"; then - if ${ac_cv_path_mkdir+:} false; then : - $as_echo_n "(cached) " >&6 -else - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH$PATH_SEPARATOR/opt/sfw/bin -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_prog in mkdir gmkdir; do - for ac_exec_ext in '' $ac_executable_extensions; do - as_fn_executable_p "$as_dir/$ac_prog$ac_exec_ext" || continue - case `"$as_dir/$ac_prog$ac_exec_ext" --version 2>&1` in #( - 'mkdir (GNU coreutils) '* | \ - 'mkdir (coreutils) '* | \ - 'mkdir (fileutils) '4.1*) - ac_cv_path_mkdir=$as_dir/$ac_prog$ac_exec_ext - break 3;; - esac - done - done - done -IFS=$as_save_IFS - -fi - - test -d ./--version && rmdir ./--version - if test "${ac_cv_path_mkdir+set}" = set; then - MKDIR_P="$ac_cv_path_mkdir -p" - else - # As a last resort, use the slow shell script. Don't cache a - # value for MKDIR_P within a source directory, because that will - # break other packages using the cache if that directory is - # removed, or if the value is a relative name. - MKDIR_P="$ac_install_sh -d" - fi -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $MKDIR_P" >&5 -$as_echo "$MKDIR_P" >&6; } - -mkdir_p="$MKDIR_P" -case $mkdir_p in - [\\/$]* | ?:[\\/]*) ;; - */*) mkdir_p="\$(top_builddir)/$mkdir_p" ;; -esac - -for ac_prog in gawk mawk nawk awk -do - # Extract the first word of "$ac_prog", so it can be a program name with args. -set dummy $ac_prog; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_AWK+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$AWK"; then - ac_cv_prog_AWK="$AWK" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_AWK="$ac_prog" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -AWK=$ac_cv_prog_AWK -if test -n "$AWK"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AWK" >&5 -$as_echo "$AWK" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - - test -n "$AWK" && break -done - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} sets \$(MAKE)" >&5 -$as_echo_n "checking whether ${MAKE-make} sets \$(MAKE)... " >&6; } -set x ${MAKE-make} -ac_make=`$as_echo "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'` -if eval \${ac_cv_prog_make_${ac_make}_set+:} false; then : - $as_echo_n "(cached) " >&6 -else - cat >conftest.make <<\_ACEOF -SHELL = /bin/sh -all: - @echo '@@@%%%=$(MAKE)=@@@%%%' -_ACEOF -# GNU make sometimes prints "make[1]: Entering ...", which would confuse us. -case `${MAKE-make} -f conftest.make 2>/dev/null` in - *@@@%%%=?*=@@@%%%*) - eval ac_cv_prog_make_${ac_make}_set=yes;; - *) - eval ac_cv_prog_make_${ac_make}_set=no;; -esac -rm -f conftest.make -fi -if eval test \$ac_cv_prog_make_${ac_make}_set = yes; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; } - SET_MAKE= -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } - SET_MAKE="MAKE=${MAKE-make}" -fi - -rm -rf .tst 2>/dev/null -mkdir .tst 2>/dev/null -if test -d .tst; then - am__leading_dot=. -else - am__leading_dot=_ -fi -rmdir .tst 2>/dev/null - -if test "`cd $srcdir && pwd`" != "`pwd`"; then - # Use -I$(srcdir) only when $(srcdir) != ., so that make's output - # is not polluted with repeated "-I." - am__isrc=' -I$(srcdir)' - # test to see if srcdir already configured - if test -f $srcdir/config.status; then - as_fn_error $? "source directory already configured; run \"make distclean\" there first" "$LINENO" 5 - fi -fi - -# test whether we have cygpath -if test -z "$CYGPATH_W"; then - if (cygpath --version) >/dev/null 2>/dev/null; then - CYGPATH_W='cygpath -w' - else - CYGPATH_W=echo - fi -fi - - -# Define the identity of the package. - PACKAGE='zookeeper' - VERSION='3.4.6' - - -cat >>confdefs.h <<_ACEOF -@%:@define PACKAGE "$PACKAGE" -_ACEOF - - -cat >>confdefs.h <<_ACEOF -@%:@define VERSION "$VERSION" -_ACEOF - -# Some tools Automake needs. - -ACLOCAL=${ACLOCAL-"${am_missing_run}aclocal-${am__api_version}"} - - -AUTOCONF=${AUTOCONF-"${am_missing_run}autoconf"} - - -AUTOMAKE=${AUTOMAKE-"${am_missing_run}automake-${am__api_version}"} - - -AUTOHEADER=${AUTOHEADER-"${am_missing_run}autoheader"} - - -MAKEINFO=${MAKEINFO-"${am_missing_run}makeinfo"} - -# We need awk for the "check" target. The system "awk" is bad on -# some platforms. -# Always define AMTAR for backward compatibility. Yes, it's still used -# in the wild :-( We should find a proper way to deprecate it ... -AMTAR='$${TAR-tar}' - -am__tar='$${TAR-tar} chof - "$$tardir"' am__untar='$${TAR-tar} xf -' - - - - - -ac_config_headers="$ac_config_headers config.h" - - -# Checks for programs. - -@%:@ Check whether --with-cppunit was given. -if test "${with_cppunit+set}" = set; then : - withval=$with_cppunit; -fi - - -if test "$with_cppunit" = "no" ; then - CPPUNIT_PATH="No_CPPUNIT" - CPPUNIT_INCLUDE= - CPPUNIT_LIBS= -else - - - -@%:@ Check whether --with-cppunit-prefix was given. -if test "${with_cppunit_prefix+set}" = set; then : - withval=$with_cppunit_prefix; cppunit_config_prefix="$withval" -else - cppunit_config_prefix="" -fi - - -@%:@ Check whether --with-cppunit-exec-prefix was given. -if test "${with_cppunit_exec_prefix+set}" = set; then : - withval=$with_cppunit_exec_prefix; cppunit_config_exec_prefix="$withval" -else - cppunit_config_exec_prefix="" -fi - - - if test x$cppunit_config_exec_prefix != x ; then - cppunit_config_args="$cppunit_config_args --exec-prefix=$cppunit_config_exec_prefix" - if test x${CPPUNIT_CONFIG+set} != xset ; then - CPPUNIT_CONFIG=$cppunit_config_exec_prefix/bin/cppunit-config - fi - fi - if test x$cppunit_config_prefix != x ; then - cppunit_config_args="$cppunit_config_args --prefix=$cppunit_config_prefix" - if test x${CPPUNIT_CONFIG+set} != xset ; then - CPPUNIT_CONFIG=$cppunit_config_prefix/bin/cppunit-config - fi - fi - - # Extract the first word of "cppunit-config", so it can be a program name with args. -set dummy cppunit-config; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_path_CPPUNIT_CONFIG+:} false; then : - $as_echo_n "(cached) " >&6 -else - case $CPPUNIT_CONFIG in - [\\/]* | ?:[\\/]*) - ac_cv_path_CPPUNIT_CONFIG="$CPPUNIT_CONFIG" # Let the user override the test with a path. - ;; - *) - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_path_CPPUNIT_CONFIG="$as_dir/$ac_word$ac_exec_ext" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - - test -z "$ac_cv_path_CPPUNIT_CONFIG" && ac_cv_path_CPPUNIT_CONFIG="no" - ;; -esac -fi -CPPUNIT_CONFIG=$ac_cv_path_CPPUNIT_CONFIG -if test -n "$CPPUNIT_CONFIG"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CPPUNIT_CONFIG" >&5 -$as_echo "$CPPUNIT_CONFIG" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - - cppunit_version_min=1.10.2 - - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Cppunit - version >= $cppunit_version_min" >&5 -$as_echo_n "checking for Cppunit - version >= $cppunit_version_min... " >&6; } - no_cppunit="" - if test "$CPPUNIT_CONFIG" = "no" ; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } - no_cppunit=yes - else - CPPUNIT_CFLAGS=`$CPPUNIT_CONFIG --cflags` - CPPUNIT_LIBS=`$CPPUNIT_CONFIG --libs` - cppunit_version=`$CPPUNIT_CONFIG --version` - - cppunit_major_version=`echo $cppunit_version | \ - sed 's/\([0-9]*\).\([0-9]*\).\([0-9]*\)/\1/'` - cppunit_minor_version=`echo $cppunit_version | \ - sed 's/\([0-9]*\).\([0-9]*\).\([0-9]*\)/\2/'` - cppunit_micro_version=`echo $cppunit_version | \ - sed 's/\([0-9]*\).\([0-9]*\).\([0-9]*\)/\3/'` - - cppunit_major_min=`echo $cppunit_version_min | \ - sed 's/\([0-9]*\).\([0-9]*\).\([0-9]*\)/\1/'` - if test "x${cppunit_major_min}" = "x" ; then - cppunit_major_min=0 - fi - - cppunit_minor_min=`echo $cppunit_version_min | \ - sed 's/\([0-9]*\).\([0-9]*\).\([0-9]*\)/\2/'` - if test "x${cppunit_minor_min}" = "x" ; then - cppunit_minor_min=0 - fi - - cppunit_micro_min=`echo $cppunit_version_min | \ - sed 's/\([0-9]*\).\([0-9]*\).\([0-9]*\)/\3/'` - if test "x${cppunit_micro_min}" = "x" ; then - cppunit_micro_min=0 - fi - - cppunit_version_proper=`expr \ - $cppunit_major_version \> $cppunit_major_min \| \ - $cppunit_major_version \= $cppunit_major_min \& \ - $cppunit_minor_version \> $cppunit_minor_min \| \ - $cppunit_major_version \= $cppunit_major_min \& \ - $cppunit_minor_version \= $cppunit_minor_min \& \ - $cppunit_micro_version \>= $cppunit_micro_min ` - - if test "$cppunit_version_proper" = "1" ; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $cppunit_major_version.$cppunit_minor_version.$cppunit_micro_version" >&5 -$as_echo "$cppunit_major_version.$cppunit_minor_version.$cppunit_micro_version" >&6; } - else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } - no_cppunit=yes - fi - fi - - if test "x$no_cppunit" = x ; then - : - else - CPPUNIT_CFLAGS="" - CPPUNIT_LIBS="" - : - fi - - - - -fi - -if test "$CALLER" = "ANT" ; then -CPPUNIT_CFLAGS="$CPPUNIT_CFLAGS -DZKSERVER_CMD=\"\\\"${base_dir}/src/c/tests/zkServer.sh\\\"\"" -else -CPPUNIT_CFLAGS="$CPPUNIT_CFLAGS -DZKSERVER_CMD=\"\\\"./tests/zkServer.sh\\\"\"" -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for generated/zookeeper.jute.c" >&5 -$as_echo_n "checking for generated/zookeeper.jute.c... " >&6; } -if ${ac_cv_file_generated_zookeeper_jute_c+:} false; then : - $as_echo_n "(cached) " >&6 -else - test "$cross_compiling" = yes && - as_fn_error $? "cannot check for file existence when cross compiling" "$LINENO" 5 -if test -r "generated/zookeeper.jute.c"; then - ac_cv_file_generated_zookeeper_jute_c=yes -else - ac_cv_file_generated_zookeeper_jute_c=no -fi -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_file_generated_zookeeper_jute_c" >&5 -$as_echo "$ac_cv_file_generated_zookeeper_jute_c" >&6; } -if test "x$ac_cv_file_generated_zookeeper_jute_c" = xyes; then : - -cat >>confdefs.h <<_ACEOF -@%:@define HAVE_GENERATED_ZOOKEEPER_JUTE_C 1 -_ACEOF - -else - as_fn_error $? "jute files are missing! Please run \"ant compile_jute\" while in the zookeeper top level directory." "$LINENO" 5 - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for generated/zookeeper.jute.h" >&5 -$as_echo_n "checking for generated/zookeeper.jute.h... " >&6; } -if ${ac_cv_file_generated_zookeeper_jute_h+:} false; then : - $as_echo_n "(cached) " >&6 -else - test "$cross_compiling" = yes && - as_fn_error $? "cannot check for file existence when cross compiling" "$LINENO" 5 -if test -r "generated/zookeeper.jute.h"; then - ac_cv_file_generated_zookeeper_jute_h=yes -else - ac_cv_file_generated_zookeeper_jute_h=no -fi -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_file_generated_zookeeper_jute_h" >&5 -$as_echo "$ac_cv_file_generated_zookeeper_jute_h" >&6; } -if test "x$ac_cv_file_generated_zookeeper_jute_h" = xyes; then : - -cat >>confdefs.h <<_ACEOF -@%:@define HAVE_GENERATED_ZOOKEEPER_JUTE_H 1 -_ACEOF - -else - as_fn_error $? "jute files are missing! Please run \"ant compile_jute\" while in the zookeeper top level directory." "$LINENO" 5 - -fi - -fi - - -ac_ext=c -ac_cpp='$CPP $CPPFLAGS' -ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_c_compiler_gnu -if test -n "$ac_tool_prefix"; then - # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args. -set dummy ${ac_tool_prefix}gcc; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_CC+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$CC"; then - ac_cv_prog_CC="$CC" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_CC="${ac_tool_prefix}gcc" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -CC=$ac_cv_prog_CC -if test -n "$CC"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 -$as_echo "$CC" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - -fi -if test -z "$ac_cv_prog_CC"; then - ac_ct_CC=$CC - # Extract the first word of "gcc", so it can be a program name with args. -set dummy gcc; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_ac_ct_CC+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$ac_ct_CC"; then - ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_ac_ct_CC="gcc" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -ac_ct_CC=$ac_cv_prog_ac_ct_CC -if test -n "$ac_ct_CC"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 -$as_echo "$ac_ct_CC" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - if test "x$ac_ct_CC" = x; then - CC="" - else - case $cross_compiling:$ac_tool_warned in -yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} -ac_tool_warned=yes ;; -esac - CC=$ac_ct_CC - fi -else - CC="$ac_cv_prog_CC" -fi - -if test -z "$CC"; then - if test -n "$ac_tool_prefix"; then - # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args. -set dummy ${ac_tool_prefix}cc; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_CC+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$CC"; then - ac_cv_prog_CC="$CC" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_CC="${ac_tool_prefix}cc" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -CC=$ac_cv_prog_CC -if test -n "$CC"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 -$as_echo "$CC" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - - fi -fi -if test -z "$CC"; then - # Extract the first word of "cc", so it can be a program name with args. -set dummy cc; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_CC+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$CC"; then - ac_cv_prog_CC="$CC" # Let the user override the test. -else - ac_prog_rejected=no -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then - ac_prog_rejected=yes - continue - fi - ac_cv_prog_CC="cc" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -if test $ac_prog_rejected = yes; then - # We found a bogon in the path, so make sure we never use it. - set dummy $ac_cv_prog_CC - shift - if test $@%:@ != 0; then - # We chose a different compiler from the bogus one. - # However, it has the same basename, so the bogon will be chosen - # first if we set CC to just the basename; use the full file name. - shift - ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@" - fi -fi -fi -fi -CC=$ac_cv_prog_CC -if test -n "$CC"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 -$as_echo "$CC" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - -fi -if test -z "$CC"; then - if test -n "$ac_tool_prefix"; then - for ac_prog in cl.exe - do - # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. -set dummy $ac_tool_prefix$ac_prog; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_CC+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$CC"; then - ac_cv_prog_CC="$CC" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_CC="$ac_tool_prefix$ac_prog" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -CC=$ac_cv_prog_CC -if test -n "$CC"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 -$as_echo "$CC" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - - test -n "$CC" && break - done -fi -if test -z "$CC"; then - ac_ct_CC=$CC - for ac_prog in cl.exe -do - # Extract the first word of "$ac_prog", so it can be a program name with args. -set dummy $ac_prog; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_ac_ct_CC+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$ac_ct_CC"; then - ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_ac_ct_CC="$ac_prog" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -ac_ct_CC=$ac_cv_prog_ac_ct_CC -if test -n "$ac_ct_CC"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 -$as_echo "$ac_ct_CC" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - - test -n "$ac_ct_CC" && break -done - - if test "x$ac_ct_CC" = x; then - CC="" - else - case $cross_compiling:$ac_tool_warned in -yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} -ac_tool_warned=yes ;; -esac - CC=$ac_ct_CC - fi -fi - -fi - - -test -z "$CC" && { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 -$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} -as_fn_error $? "no acceptable C compiler found in \$PATH -See \`config.log' for more details" "$LINENO" 5; } - -# Provide some information about the compiler. -$as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5 -set X $ac_compile -ac_compiler=$2 -for ac_option in --version -v -V -qversion; do - { { ac_try="$ac_compiler $ac_option >&5" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 - (eval "$ac_compiler $ac_option >&5") 2>conftest.err - ac_status=$? - if test -s conftest.err; then - sed '10a\ -... rest of stderr output deleted ... - 10q' conftest.err >conftest.er1 - cat conftest.er1 >&5 - fi - rm -f conftest.er1 conftest.err - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } -done - -cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -int -main () -{ - - ; - return 0; -} -_ACEOF -ac_clean_files_save=$ac_clean_files -ac_clean_files="$ac_clean_files a.out a.out.dSYM a.exe b.out" -# Try to create an executable without -o first, disregard a.out. -# It will help us diagnose broken compilers, and finding out an intuition -# of exeext. -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler works" >&5 -$as_echo_n "checking whether the C compiler works... " >&6; } -ac_link_default=`$as_echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'` - -# The possible output files: -ac_files="a.out conftest.exe conftest a.exe a_out.exe b.out conftest.*" - -ac_rmfiles= -for ac_file in $ac_files -do - case $ac_file in - *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; - * ) ac_rmfiles="$ac_rmfiles $ac_file";; - esac -done -rm -f $ac_rmfiles - -if { { ac_try="$ac_link_default" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 - (eval "$ac_link_default") 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; }; then : - # Autoconf-2.13 could set the ac_cv_exeext variable to `no'. -# So ignore a value of `no', otherwise this would lead to `EXEEXT = no' -# in a Makefile. We should not override ac_cv_exeext if it was cached, -# so that the user can short-circuit this test for compilers unknown to -# Autoconf. -for ac_file in $ac_files '' -do - test -f "$ac_file" || continue - case $ac_file in - *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) - ;; - [ab].out ) - # We found the default executable, but exeext='' is most - # certainly right. - break;; - *.* ) - if test "${ac_cv_exeext+set}" = set && test "$ac_cv_exeext" != no; - then :; else - ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` - fi - # We set ac_cv_exeext here because the later test for it is not - # safe: cross compilers may not add the suffix if given an `-o' - # argument, so we may need to know it at that point already. - # Even if this section looks crufty: it has the advantage of - # actually working. - break;; - * ) - break;; - esac -done -test "$ac_cv_exeext" = no && ac_cv_exeext= - -else - ac_file='' -fi -if test -z "$ac_file"; then : - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -$as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 -$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} -as_fn_error 77 "C compiler cannot create executables -See \`config.log' for more details" "$LINENO" 5; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; } -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler default output file name" >&5 -$as_echo_n "checking for C compiler default output file name... " >&6; } -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_file" >&5 -$as_echo "$ac_file" >&6; } -ac_exeext=$ac_cv_exeext - -rm -f -r a.out a.out.dSYM a.exe conftest$ac_cv_exeext b.out -ac_clean_files=$ac_clean_files_save -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of executables" >&5 -$as_echo_n "checking for suffix of executables... " >&6; } -if { { ac_try="$ac_link" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 - (eval "$ac_link") 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; }; then : - # If both `conftest.exe' and `conftest' are `present' (well, observable) -# catch `conftest.exe'. For instance with Cygwin, `ls conftest' will -# work properly (i.e., refer to `conftest.exe'), while it won't with -# `rm'. -for ac_file in conftest.exe conftest conftest.*; do - test -f "$ac_file" || continue - case $ac_file in - *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; - *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` - break;; - * ) break;; - esac -done -else - { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 -$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} -as_fn_error $? "cannot compute suffix of executables: cannot compile and link -See \`config.log' for more details" "$LINENO" 5; } -fi -rm -f conftest conftest$ac_cv_exeext -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_exeext" >&5 -$as_echo "$ac_cv_exeext" >&6; } - -rm -f conftest.$ac_ext -EXEEXT=$ac_cv_exeext -ac_exeext=$EXEEXT -cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -@%:@include -int -main () -{ -FILE *f = fopen ("conftest.out", "w"); - return ferror (f) || fclose (f) != 0; - - ; - return 0; -} -_ACEOF -ac_clean_files="$ac_clean_files conftest.out" -# Check that the compiler produces executables we can run. If not, either -# the compiler is broken, or we cross compile. -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are cross compiling" >&5 -$as_echo_n "checking whether we are cross compiling... " >&6; } -if test "$cross_compiling" != yes; then - { { ac_try="$ac_link" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 - (eval "$ac_link") 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } - if { ac_try='./conftest$ac_cv_exeext' - { { case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 - (eval "$ac_try") 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; }; }; then - cross_compiling=no - else - if test "$cross_compiling" = maybe; then - cross_compiling=yes - else - { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 -$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} -as_fn_error $? "cannot run C compiled programs. -If you meant to cross compile, use \`--host'. -See \`config.log' for more details" "$LINENO" 5; } - fi - fi -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $cross_compiling" >&5 -$as_echo "$cross_compiling" >&6; } - -rm -f conftest.$ac_ext conftest$ac_cv_exeext conftest.out -ac_clean_files=$ac_clean_files_save -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of object files" >&5 -$as_echo_n "checking for suffix of object files... " >&6; } -if ${ac_cv_objext+:} false; then : - $as_echo_n "(cached) " >&6 -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -int -main () -{ - - ; - return 0; -} -_ACEOF -rm -f conftest.o conftest.obj -if { { ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 - (eval "$ac_compile") 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; }; then : - for ac_file in conftest.o conftest.obj conftest.*; do - test -f "$ac_file" || continue; - case $ac_file in - *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM ) ;; - *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'` - break;; - esac -done -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 -$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} -as_fn_error $? "cannot compute suffix of object files: cannot compile -See \`config.log' for more details" "$LINENO" 5; } -fi -rm -f conftest.$ac_cv_objext conftest.$ac_ext -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_objext" >&5 -$as_echo "$ac_cv_objext" >&6; } -OBJEXT=$ac_cv_objext -ac_objext=$OBJEXT -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C compiler" >&5 -$as_echo_n "checking whether we are using the GNU C compiler... " >&6; } -if ${ac_cv_c_compiler_gnu+:} false; then : - $as_echo_n "(cached) " >&6 -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -int -main () -{ -#ifndef __GNUC__ - choke me -#endif - - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - ac_compiler_gnu=yes -else - ac_compiler_gnu=no -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -ac_cv_c_compiler_gnu=$ac_compiler_gnu - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5 -$as_echo "$ac_cv_c_compiler_gnu" >&6; } -if test $ac_compiler_gnu = yes; then - GCC=yes -else - GCC= -fi -ac_test_CFLAGS=${CFLAGS+set} -ac_save_CFLAGS=$CFLAGS -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5 -$as_echo_n "checking whether $CC accepts -g... " >&6; } -if ${ac_cv_prog_cc_g+:} false; then : - $as_echo_n "(cached) " >&6 -else - ac_save_c_werror_flag=$ac_c_werror_flag - ac_c_werror_flag=yes - ac_cv_prog_cc_g=no - CFLAGS="-g" - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -int -main () -{ - - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - ac_cv_prog_cc_g=yes -else - CFLAGS="" - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -int -main () -{ - - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - -else - ac_c_werror_flag=$ac_save_c_werror_flag - CFLAGS="-g" - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -int -main () -{ - - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - ac_cv_prog_cc_g=yes -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext - ac_c_werror_flag=$ac_save_c_werror_flag -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5 -$as_echo "$ac_cv_prog_cc_g" >&6; } -if test "$ac_test_CFLAGS" = set; then - CFLAGS=$ac_save_CFLAGS -elif test $ac_cv_prog_cc_g = yes; then - if test "$GCC" = yes; then - CFLAGS="-g -O2" - else - CFLAGS="-g" - fi -else - if test "$GCC" = yes; then - CFLAGS="-O2" - else - CFLAGS= - fi -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5 -$as_echo_n "checking for $CC option to accept ISO C89... " >&6; } -if ${ac_cv_prog_cc_c89+:} false; then : - $as_echo_n "(cached) " >&6 -else - ac_cv_prog_cc_c89=no -ac_save_CC=$CC -cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include -#include -struct stat; -/* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */ -struct buf { int x; }; -FILE * (*rcsopen) (struct buf *, struct stat *, int); -static char *e (p, i) - char **p; - int i; -{ - return p[i]; -} -static char *f (char * (*g) (char **, int), char **p, ...) -{ - char *s; - va_list v; - va_start (v,p); - s = g (p, va_arg (v,int)); - va_end (v); - return s; -} - -/* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has - function prototypes and stuff, but not '\xHH' hex character constants. - These don't provoke an error unfortunately, instead are silently treated - as 'x'. The following induces an error, until -std is added to get - proper ANSI mode. Curiously '\x00'!='x' always comes out true, for an - array size at least. It's necessary to write '\x00'==0 to get something - that's true only with -std. */ -int osf4_cc_array ['\x00' == 0 ? 1 : -1]; - -/* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters - inside strings and character constants. */ -#define FOO(x) 'x' -int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1]; - -int test (int i, double x); -struct s1 {int (*f) (int a);}; -struct s2 {int (*f) (double a);}; -int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int); -int argc; -char **argv; -int -main () -{ -return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]; - ; - return 0; -} -_ACEOF -for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \ - -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" -do - CC="$ac_save_CC $ac_arg" - if ac_fn_c_try_compile "$LINENO"; then : - ac_cv_prog_cc_c89=$ac_arg -fi -rm -f core conftest.err conftest.$ac_objext - test "x$ac_cv_prog_cc_c89" != "xno" && break -done -rm -f conftest.$ac_ext -CC=$ac_save_CC - -fi -# AC_CACHE_VAL -case "x$ac_cv_prog_cc_c89" in - x) - { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 -$as_echo "none needed" >&6; } ;; - xno) - { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 -$as_echo "unsupported" >&6; } ;; - *) - CC="$CC $ac_cv_prog_cc_c89" - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5 -$as_echo "$ac_cv_prog_cc_c89" >&6; } ;; -esac -if test "x$ac_cv_prog_cc_c89" != xno; then : - -fi - -ac_ext=c -ac_cpp='$CPP $CPPFLAGS' -ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_c_compiler_gnu -DEPDIR="${am__leading_dot}deps" - -ac_config_commands="$ac_config_commands depfiles" - - -am_make=${MAKE-make} -cat > confinc << 'END' -am__doit: - @echo this is the am__doit target -.PHONY: am__doit -END -# If we don't find an include directive, just comment out the code. -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for style of include used by $am_make" >&5 -$as_echo_n "checking for style of include used by $am_make... " >&6; } -am__include="#" -am__quote= -_am_result=none -# First try GNU make style include. -echo "include confinc" > confmf -# Ignore all kinds of additional output from `make'. -case `$am_make -s -f confmf 2> /dev/null` in #( -*the\ am__doit\ target*) - am__include=include - am__quote= - _am_result=GNU - ;; -esac -# Now try BSD make style include. -if test "$am__include" = "#"; then - echo '.include "confinc"' > confmf - case `$am_make -s -f confmf 2> /dev/null` in #( - *the\ am__doit\ target*) - am__include=.include - am__quote="\"" - _am_result=BSD - ;; - esac -fi - - -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $_am_result" >&5 -$as_echo "$_am_result" >&6; } -rm -f confinc confmf - -@%:@ Check whether --enable-dependency-tracking was given. -if test "${enable_dependency_tracking+set}" = set; then : - enableval=$enable_dependency_tracking; -fi - -if test "x$enable_dependency_tracking" != xno; then - am_depcomp="$ac_aux_dir/depcomp" - AMDEPBACKSLASH='\' - am__nodep='_no' -fi - if test "x$enable_dependency_tracking" != xno; then - AMDEP_TRUE= - AMDEP_FALSE='#' -else - AMDEP_TRUE='#' - AMDEP_FALSE= -fi - - - -depcc="$CC" am_compiler_list= - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5 -$as_echo_n "checking dependency style of $depcc... " >&6; } -if ${am_cv_CC_dependencies_compiler_type+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then - # We make a subdir and do the tests there. Otherwise we can end up - # making bogus files that we don't know about and never remove. For - # instance it was reported that on HP-UX the gcc test will end up - # making a dummy file named `D' -- because `-MD' means `put the output - # in D'. - rm -rf conftest.dir - mkdir conftest.dir - # Copy depcomp to subdir because otherwise we won't find it if we're - # using a relative directory. - cp "$am_depcomp" conftest.dir - cd conftest.dir - # We will build objects and dependencies in a subdirectory because - # it helps to detect inapplicable dependency modes. For instance - # both Tru64's cc and ICC support -MD to output dependencies as a - # side effect of compilation, but ICC will put the dependencies in - # the current directory while Tru64 will put them in the object - # directory. - mkdir sub - - am_cv_CC_dependencies_compiler_type=none - if test "$am_compiler_list" = ""; then - am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp` - fi - am__universal=false - case " $depcc " in #( - *\ -arch\ *\ -arch\ *) am__universal=true ;; - esac - - for depmode in $am_compiler_list; do - # Setup a source with many dependencies, because some compilers - # like to wrap large dependency lists on column 80 (with \), and - # we should not choose a depcomp mode which is confused by this. - # - # We need to recreate these files for each test, as the compiler may - # overwrite some of them when testing with obscure command lines. - # This happens at least with the AIX C compiler. - : > sub/conftest.c - for i in 1 2 3 4 5 6; do - echo '#include "conftst'$i'.h"' >> sub/conftest.c - # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with - # Solaris 8's {/usr,}/bin/sh. - touch sub/conftst$i.h - done - echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf - - # We check with `-c' and `-o' for the sake of the "dashmstdout" - # mode. It turns out that the SunPro C++ compiler does not properly - # handle `-M -o', and we need to detect this. Also, some Intel - # versions had trouble with output in subdirs - am__obj=sub/conftest.${OBJEXT-o} - am__minus_obj="-o $am__obj" - case $depmode in - gcc) - # This depmode causes a compiler race in universal mode. - test "$am__universal" = false || continue - ;; - nosideeffect) - # after this tag, mechanisms are not by side-effect, so they'll - # only be used when explicitly requested - if test "x$enable_dependency_tracking" = xyes; then - continue - else - break - fi - ;; - msvc7 | msvc7msys | msvisualcpp | msvcmsys) - # This compiler won't grok `-c -o', but also, the minuso test has - # not run yet. These depmodes are late enough in the game, and - # so weak that their functioning should not be impacted. - am__obj=conftest.${OBJEXT-o} - am__minus_obj= - ;; - none) break ;; - esac - if depmode=$depmode \ - source=sub/conftest.c object=$am__obj \ - depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ - $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ - >/dev/null 2>conftest.err && - grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && - grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && - grep $am__obj sub/conftest.Po > /dev/null 2>&1 && - ${MAKE-make} -s -f confmf > /dev/null 2>&1; then - # icc doesn't choke on unknown options, it will just issue warnings - # or remarks (even with -Werror). So we grep stderr for any message - # that says an option was ignored or not supported. - # When given -MP, icc 7.0 and 7.1 complain thusly: - # icc: Command line warning: ignoring option '-M'; no argument required - # The diagnosis changed in icc 8.0: - # icc: Command line remark: option '-MP' not supported - if (grep 'ignoring option' conftest.err || - grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else - am_cv_CC_dependencies_compiler_type=$depmode - break - fi - fi - done - - cd .. - rm -rf conftest.dir -else - am_cv_CC_dependencies_compiler_type=none -fi - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_CC_dependencies_compiler_type" >&5 -$as_echo "$am_cv_CC_dependencies_compiler_type" >&6; } -CCDEPMODE=depmode=$am_cv_CC_dependencies_compiler_type - - if - test "x$enable_dependency_tracking" != xno \ - && test "$am_cv_CC_dependencies_compiler_type" = gcc3; then - am__fastdepCC_TRUE= - am__fastdepCC_FALSE='#' -else - am__fastdepCC_TRUE='#' - am__fastdepCC_FALSE= -fi - - -if test "x$CC" != xcc; then - { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC and cc understand -c and -o together" >&5 -$as_echo_n "checking whether $CC and cc understand -c and -o together... " >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether cc understands -c and -o together" >&5 -$as_echo_n "checking whether cc understands -c and -o together... " >&6; } -fi -set dummy $CC; ac_cc=`$as_echo "$2" | - sed 's/[^a-zA-Z0-9_]/_/g;s/^[0-9]/_/'` -if eval \${ac_cv_prog_cc_${ac_cc}_c_o+:} false; then : - $as_echo_n "(cached) " >&6 -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -int -main () -{ - - ; - return 0; -} -_ACEOF -# Make sure it works both with $CC and with simple cc. -# We do the test twice because some compilers refuse to overwrite an -# existing .o file with -o, though they will create one. -ac_try='$CC -c conftest.$ac_ext -o conftest2.$ac_objext >&5' -rm -f conftest2.* -if { { case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 - (eval "$ac_try") 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } && - test -f conftest2.$ac_objext && { { case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 - (eval "$ac_try") 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; }; -then - eval ac_cv_prog_cc_${ac_cc}_c_o=yes - if test "x$CC" != xcc; then - # Test first that cc exists at all. - if { ac_try='cc -c conftest.$ac_ext >&5' - { { case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 - (eval "$ac_try") 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; }; }; then - ac_try='cc -c conftest.$ac_ext -o conftest2.$ac_objext >&5' - rm -f conftest2.* - if { { case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 - (eval "$ac_try") 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } && - test -f conftest2.$ac_objext && { { case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 - (eval "$ac_try") 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; }; - then - # cc works too. - : - else - # cc exists but doesn't like -o. - eval ac_cv_prog_cc_${ac_cc}_c_o=no - fi - fi - fi -else - eval ac_cv_prog_cc_${ac_cc}_c_o=no -fi -rm -f core conftest* - -fi -if eval test \$ac_cv_prog_cc_${ac_cc}_c_o = yes; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } - -$as_echo "@%:@define NO_MINUS_C_MINUS_O 1" >>confdefs.h - -fi - -# FIXME: we rely on the cache variable name because -# there is no other way. -set dummy $CC -am_cc=`echo $2 | sed 's/[^a-zA-Z0-9_]/_/g;s/^[0-9]/_/'` -eval am_t=\$ac_cv_prog_cc_${am_cc}_c_o -if test "$am_t" != yes; then - # Losing compiler, so override with the script. - # FIXME: It is wrong to rewrite CC. - # But if we don't then we get into trouble of one sort or another. - # A longer-term fix would be to have automake use am__CC in this case, - # and then we could set am__CC="\$(top_srcdir)/compile \$(CC)" - CC="$am_aux_dir/compile $CC" -fi - - -ac_ext=cpp -ac_cpp='$CXXCPP $CPPFLAGS' -ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_cxx_compiler_gnu -if test -z "$CXX"; then - if test -n "$CCC"; then - CXX=$CCC - else - if test -n "$ac_tool_prefix"; then - for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC - do - # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. -set dummy $ac_tool_prefix$ac_prog; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_CXX+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$CXX"; then - ac_cv_prog_CXX="$CXX" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_CXX="$ac_tool_prefix$ac_prog" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -CXX=$ac_cv_prog_CXX -if test -n "$CXX"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CXX" >&5 -$as_echo "$CXX" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - - test -n "$CXX" && break - done -fi -if test -z "$CXX"; then - ac_ct_CXX=$CXX - for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC -do - # Extract the first word of "$ac_prog", so it can be a program name with args. -set dummy $ac_prog; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_ac_ct_CXX+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$ac_ct_CXX"; then - ac_cv_prog_ac_ct_CXX="$ac_ct_CXX" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_ac_ct_CXX="$ac_prog" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -ac_ct_CXX=$ac_cv_prog_ac_ct_CXX -if test -n "$ac_ct_CXX"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CXX" >&5 -$as_echo "$ac_ct_CXX" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - - test -n "$ac_ct_CXX" && break -done - - if test "x$ac_ct_CXX" = x; then - CXX="g++" - else - case $cross_compiling:$ac_tool_warned in -yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} -ac_tool_warned=yes ;; -esac - CXX=$ac_ct_CXX - fi -fi - - fi -fi -# Provide some information about the compiler. -$as_echo "$as_me:${as_lineno-$LINENO}: checking for C++ compiler version" >&5 -set X $ac_compile -ac_compiler=$2 -for ac_option in --version -v -V -qversion; do - { { ac_try="$ac_compiler $ac_option >&5" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 - (eval "$ac_compiler $ac_option >&5") 2>conftest.err - ac_status=$? - if test -s conftest.err; then - sed '10a\ -... rest of stderr output deleted ... - 10q' conftest.err >conftest.er1 - cat conftest.er1 >&5 - fi - rm -f conftest.er1 conftest.err - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } -done - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C++ compiler" >&5 -$as_echo_n "checking whether we are using the GNU C++ compiler... " >&6; } -if ${ac_cv_cxx_compiler_gnu+:} false; then : - $as_echo_n "(cached) " >&6 -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -int -main () -{ -#ifndef __GNUC__ - choke me -#endif - - ; - return 0; -} -_ACEOF -if ac_fn_cxx_try_compile "$LINENO"; then : - ac_compiler_gnu=yes -else - ac_compiler_gnu=no -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -ac_cv_cxx_compiler_gnu=$ac_compiler_gnu - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_cxx_compiler_gnu" >&5 -$as_echo "$ac_cv_cxx_compiler_gnu" >&6; } -if test $ac_compiler_gnu = yes; then - GXX=yes -else - GXX= -fi -ac_test_CXXFLAGS=${CXXFLAGS+set} -ac_save_CXXFLAGS=$CXXFLAGS -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CXX accepts -g" >&5 -$as_echo_n "checking whether $CXX accepts -g... " >&6; } -if ${ac_cv_prog_cxx_g+:} false; then : - $as_echo_n "(cached) " >&6 -else - ac_save_cxx_werror_flag=$ac_cxx_werror_flag - ac_cxx_werror_flag=yes - ac_cv_prog_cxx_g=no - CXXFLAGS="-g" - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -int -main () -{ - - ; - return 0; -} -_ACEOF -if ac_fn_cxx_try_compile "$LINENO"; then : - ac_cv_prog_cxx_g=yes -else - CXXFLAGS="" - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -int -main () -{ - - ; - return 0; -} -_ACEOF -if ac_fn_cxx_try_compile "$LINENO"; then : - -else - ac_cxx_werror_flag=$ac_save_cxx_werror_flag - CXXFLAGS="-g" - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -int -main () -{ - - ; - return 0; -} -_ACEOF -if ac_fn_cxx_try_compile "$LINENO"; then : - ac_cv_prog_cxx_g=yes -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext - ac_cxx_werror_flag=$ac_save_cxx_werror_flag -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cxx_g" >&5 -$as_echo "$ac_cv_prog_cxx_g" >&6; } -if test "$ac_test_CXXFLAGS" = set; then - CXXFLAGS=$ac_save_CXXFLAGS -elif test $ac_cv_prog_cxx_g = yes; then - if test "$GXX" = yes; then - CXXFLAGS="-g -O2" - else - CXXFLAGS="-g" - fi -else - if test "$GXX" = yes; then - CXXFLAGS="-O2" - else - CXXFLAGS= - fi -fi -ac_ext=c -ac_cpp='$CPP $CPPFLAGS' -ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_c_compiler_gnu - -depcc="$CXX" am_compiler_list= - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5 -$as_echo_n "checking dependency style of $depcc... " >&6; } -if ${am_cv_CXX_dependencies_compiler_type+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then - # We make a subdir and do the tests there. Otherwise we can end up - # making bogus files that we don't know about and never remove. For - # instance it was reported that on HP-UX the gcc test will end up - # making a dummy file named `D' -- because `-MD' means `put the output - # in D'. - rm -rf conftest.dir - mkdir conftest.dir - # Copy depcomp to subdir because otherwise we won't find it if we're - # using a relative directory. - cp "$am_depcomp" conftest.dir - cd conftest.dir - # We will build objects and dependencies in a subdirectory because - # it helps to detect inapplicable dependency modes. For instance - # both Tru64's cc and ICC support -MD to output dependencies as a - # side effect of compilation, but ICC will put the dependencies in - # the current directory while Tru64 will put them in the object - # directory. - mkdir sub - - am_cv_CXX_dependencies_compiler_type=none - if test "$am_compiler_list" = ""; then - am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp` - fi - am__universal=false - case " $depcc " in #( - *\ -arch\ *\ -arch\ *) am__universal=true ;; - esac - - for depmode in $am_compiler_list; do - # Setup a source with many dependencies, because some compilers - # like to wrap large dependency lists on column 80 (with \), and - # we should not choose a depcomp mode which is confused by this. - # - # We need to recreate these files for each test, as the compiler may - # overwrite some of them when testing with obscure command lines. - # This happens at least with the AIX C compiler. - : > sub/conftest.c - for i in 1 2 3 4 5 6; do - echo '#include "conftst'$i'.h"' >> sub/conftest.c - # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with - # Solaris 8's {/usr,}/bin/sh. - touch sub/conftst$i.h - done - echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf - - # We check with `-c' and `-o' for the sake of the "dashmstdout" - # mode. It turns out that the SunPro C++ compiler does not properly - # handle `-M -o', and we need to detect this. Also, some Intel - # versions had trouble with output in subdirs - am__obj=sub/conftest.${OBJEXT-o} - am__minus_obj="-o $am__obj" - case $depmode in - gcc) - # This depmode causes a compiler race in universal mode. - test "$am__universal" = false || continue - ;; - nosideeffect) - # after this tag, mechanisms are not by side-effect, so they'll - # only be used when explicitly requested - if test "x$enable_dependency_tracking" = xyes; then - continue - else - break - fi - ;; - msvc7 | msvc7msys | msvisualcpp | msvcmsys) - # This compiler won't grok `-c -o', but also, the minuso test has - # not run yet. These depmodes are late enough in the game, and - # so weak that their functioning should not be impacted. - am__obj=conftest.${OBJEXT-o} - am__minus_obj= - ;; - none) break ;; - esac - if depmode=$depmode \ - source=sub/conftest.c object=$am__obj \ - depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ - $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ - >/dev/null 2>conftest.err && - grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && - grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && - grep $am__obj sub/conftest.Po > /dev/null 2>&1 && - ${MAKE-make} -s -f confmf > /dev/null 2>&1; then - # icc doesn't choke on unknown options, it will just issue warnings - # or remarks (even with -Werror). So we grep stderr for any message - # that says an option was ignored or not supported. - # When given -MP, icc 7.0 and 7.1 complain thusly: - # icc: Command line warning: ignoring option '-M'; no argument required - # The diagnosis changed in icc 8.0: - # icc: Command line remark: option '-MP' not supported - if (grep 'ignoring option' conftest.err || - grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else - am_cv_CXX_dependencies_compiler_type=$depmode - break - fi - fi - done - - cd .. - rm -rf conftest.dir -else - am_cv_CXX_dependencies_compiler_type=none -fi - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_CXX_dependencies_compiler_type" >&5 -$as_echo "$am_cv_CXX_dependencies_compiler_type" >&6; } -CXXDEPMODE=depmode=$am_cv_CXX_dependencies_compiler_type - - if - test "x$enable_dependency_tracking" != xno \ - && test "$am_cv_CXX_dependencies_compiler_type" = gcc3; then - am__fastdepCXX_TRUE= - am__fastdepCXX_FALSE='#' -else - am__fastdepCXX_TRUE='#' - am__fastdepCXX_FALSE= -fi - - - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ln -s works" >&5 -$as_echo_n "checking whether ln -s works... " >&6; } -LN_S=$as_ln_s -if test "$LN_S" = "ln -s"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no, using $LN_S" >&5 -$as_echo "no, using $LN_S" >&6; } -fi - - -# AC_DISABLE_SHARED -case `pwd` in - *\ * | *\ *) - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Libtool does not cope well with whitespace in \`pwd\`" >&5 -$as_echo "$as_me: WARNING: Libtool does not cope well with whitespace in \`pwd\`" >&2;} ;; -esac - - - -macro_version='2.4.2' -macro_revision='1.3337' - - - - - - - - - - - - - -ltmain="$ac_aux_dir/ltmain.sh" - -# Make sure we can run config.sub. -$SHELL "$ac_aux_dir/config.sub" sun4 >/dev/null 2>&1 || - as_fn_error $? "cannot run $SHELL $ac_aux_dir/config.sub" "$LINENO" 5 - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking build system type" >&5 -$as_echo_n "checking build system type... " >&6; } -if ${ac_cv_build+:} false; then : - $as_echo_n "(cached) " >&6 -else - ac_build_alias=$build_alias -test "x$ac_build_alias" = x && - ac_build_alias=`$SHELL "$ac_aux_dir/config.guess"` -test "x$ac_build_alias" = x && - as_fn_error $? "cannot guess build type; you must specify one" "$LINENO" 5 -ac_cv_build=`$SHELL "$ac_aux_dir/config.sub" $ac_build_alias` || - as_fn_error $? "$SHELL $ac_aux_dir/config.sub $ac_build_alias failed" "$LINENO" 5 - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_build" >&5 -$as_echo "$ac_cv_build" >&6; } -case $ac_cv_build in -*-*-*) ;; -*) as_fn_error $? "invalid value of canonical build" "$LINENO" 5;; -esac -build=$ac_cv_build -ac_save_IFS=$IFS; IFS='-' -set x $ac_cv_build -shift -build_cpu=$1 -build_vendor=$2 -shift; shift -# Remember, the first character of IFS is used to create $*, -# except with old shells: -build_os=$* -IFS=$ac_save_IFS -case $build_os in *\ *) build_os=`echo "$build_os" | sed 's/ /-/g'`;; esac - - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking host system type" >&5 -$as_echo_n "checking host system type... " >&6; } -if ${ac_cv_host+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test "x$host_alias" = x; then - ac_cv_host=$ac_cv_build -else - ac_cv_host=`$SHELL "$ac_aux_dir/config.sub" $host_alias` || - as_fn_error $? "$SHELL $ac_aux_dir/config.sub $host_alias failed" "$LINENO" 5 -fi - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_host" >&5 -$as_echo "$ac_cv_host" >&6; } -case $ac_cv_host in -*-*-*) ;; -*) as_fn_error $? "invalid value of canonical host" "$LINENO" 5;; -esac -host=$ac_cv_host -ac_save_IFS=$IFS; IFS='-' -set x $ac_cv_host -shift -host_cpu=$1 -host_vendor=$2 -shift; shift -# Remember, the first character of IFS is used to create $*, -# except with old shells: -host_os=$* -IFS=$ac_save_IFS -case $host_os in *\ *) host_os=`echo "$host_os" | sed 's/ /-/g'`;; esac - - -# Backslashify metacharacters that are still active within -# double-quoted strings. -sed_quote_subst='s/\(["`$\\]\)/\\\1/g' - -# Same as above, but do not quote variable references. -double_quote_subst='s/\(["`\\]\)/\\\1/g' - -# Sed substitution to delay expansion of an escaped shell variable in a -# double_quote_subst'ed string. -delay_variable_subst='s/\\\\\\\\\\\$/\\\\\\$/g' - -# Sed substitution to delay expansion of an escaped single quote. -delay_single_quote_subst='s/'\''/'\'\\\\\\\'\''/g' - -# Sed substitution to avoid accidental globbing in evaled expressions -no_glob_subst='s/\*/\\\*/g' - -ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' -ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO -ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO$ECHO - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to print strings" >&5 -$as_echo_n "checking how to print strings... " >&6; } -# Test print first, because it will be a builtin if present. -if test "X`( print -r -- -n ) 2>/dev/null`" = X-n && \ - test "X`print -r -- $ECHO 2>/dev/null`" = "X$ECHO"; then - ECHO='print -r --' -elif test "X`printf %s $ECHO 2>/dev/null`" = "X$ECHO"; then - ECHO='printf %s\n' -else - # Use this function as a fallback that always works. - func_fallback_echo () - { - eval 'cat <<_LTECHO_EOF -$1 -_LTECHO_EOF' - } - ECHO='func_fallback_echo' -fi - -# func_echo_all arg... -# Invoke $ECHO with all args, space-separated. -func_echo_all () -{ - $ECHO "" -} - -case "$ECHO" in - printf*) { $as_echo "$as_me:${as_lineno-$LINENO}: result: printf" >&5 -$as_echo "printf" >&6; } ;; - print*) { $as_echo "$as_me:${as_lineno-$LINENO}: result: print -r" >&5 -$as_echo "print -r" >&6; } ;; - *) { $as_echo "$as_me:${as_lineno-$LINENO}: result: cat" >&5 -$as_echo "cat" >&6; } ;; -esac - - - - - - - - - - - - - - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a sed that does not truncate output" >&5 -$as_echo_n "checking for a sed that does not truncate output... " >&6; } -if ${ac_cv_path_SED+:} false; then : - $as_echo_n "(cached) " >&6 -else - ac_script=s/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb/ - for ac_i in 1 2 3 4 5 6 7; do - ac_script="$ac_script$as_nl$ac_script" - done - echo "$ac_script" 2>/dev/null | sed 99q >conftest.sed - { ac_script=; unset ac_script;} - if test -z "$SED"; then - ac_path_SED_found=false - # Loop through the user's path and test for each of PROGNAME-LIST - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_prog in sed gsed; do - for ac_exec_ext in '' $ac_executable_extensions; do - ac_path_SED="$as_dir/$ac_prog$ac_exec_ext" - as_fn_executable_p "$ac_path_SED" || continue -# Check for GNU ac_path_SED and select it if it is found. - # Check for GNU $ac_path_SED -case `"$ac_path_SED" --version 2>&1` in -*GNU*) - ac_cv_path_SED="$ac_path_SED" ac_path_SED_found=:;; -*) - ac_count=0 - $as_echo_n 0123456789 >"conftest.in" - while : - do - cat "conftest.in" "conftest.in" >"conftest.tmp" - mv "conftest.tmp" "conftest.in" - cp "conftest.in" "conftest.nl" - $as_echo '' >> "conftest.nl" - "$ac_path_SED" -f conftest.sed < "conftest.nl" >"conftest.out" 2>/dev/null || break - diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break - as_fn_arith $ac_count + 1 && ac_count=$as_val - if test $ac_count -gt ${ac_path_SED_max-0}; then - # Best one so far, save it but keep looking for a better one - ac_cv_path_SED="$ac_path_SED" - ac_path_SED_max=$ac_count - fi - # 10*(2^10) chars as input seems more than enough - test $ac_count -gt 10 && break - done - rm -f conftest.in conftest.tmp conftest.nl conftest.out;; -esac - - $ac_path_SED_found && break 3 - done - done - done -IFS=$as_save_IFS - if test -z "$ac_cv_path_SED"; then - as_fn_error $? "no acceptable sed could be found in \$PATH" "$LINENO" 5 - fi -else - ac_cv_path_SED=$SED -fi - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_SED" >&5 -$as_echo "$ac_cv_path_SED" >&6; } - SED="$ac_cv_path_SED" - rm -f conftest.sed - -test -z "$SED" && SED=sed -Xsed="$SED -e 1s/^X//" - - - - - - - - - - - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for grep that handles long lines and -e" >&5 -$as_echo_n "checking for grep that handles long lines and -e... " >&6; } -if ${ac_cv_path_GREP+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -z "$GREP"; then - ac_path_GREP_found=false - # Loop through the user's path and test for each of PROGNAME-LIST - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_prog in grep ggrep; do - for ac_exec_ext in '' $ac_executable_extensions; do - ac_path_GREP="$as_dir/$ac_prog$ac_exec_ext" - as_fn_executable_p "$ac_path_GREP" || continue -# Check for GNU ac_path_GREP and select it if it is found. - # Check for GNU $ac_path_GREP -case `"$ac_path_GREP" --version 2>&1` in -*GNU*) - ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_found=:;; -*) - ac_count=0 - $as_echo_n 0123456789 >"conftest.in" - while : - do - cat "conftest.in" "conftest.in" >"conftest.tmp" - mv "conftest.tmp" "conftest.in" - cp "conftest.in" "conftest.nl" - $as_echo 'GREP' >> "conftest.nl" - "$ac_path_GREP" -e 'GREP$' -e '-(cannot match)-' < "conftest.nl" >"conftest.out" 2>/dev/null || break - diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break - as_fn_arith $ac_count + 1 && ac_count=$as_val - if test $ac_count -gt ${ac_path_GREP_max-0}; then - # Best one so far, save it but keep looking for a better one - ac_cv_path_GREP="$ac_path_GREP" - ac_path_GREP_max=$ac_count - fi - # 10*(2^10) chars as input seems more than enough - test $ac_count -gt 10 && break - done - rm -f conftest.in conftest.tmp conftest.nl conftest.out;; -esac - - $ac_path_GREP_found && break 3 - done - done - done -IFS=$as_save_IFS - if test -z "$ac_cv_path_GREP"; then - as_fn_error $? "no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 - fi -else - ac_cv_path_GREP=$GREP -fi - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_GREP" >&5 -$as_echo "$ac_cv_path_GREP" >&6; } - GREP="$ac_cv_path_GREP" - - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for egrep" >&5 -$as_echo_n "checking for egrep... " >&6; } -if ${ac_cv_path_EGREP+:} false; then : - $as_echo_n "(cached) " >&6 -else - if echo a | $GREP -E '(a|b)' >/dev/null 2>&1 - then ac_cv_path_EGREP="$GREP -E" - else - if test -z "$EGREP"; then - ac_path_EGREP_found=false - # Loop through the user's path and test for each of PROGNAME-LIST - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_prog in egrep; do - for ac_exec_ext in '' $ac_executable_extensions; do - ac_path_EGREP="$as_dir/$ac_prog$ac_exec_ext" - as_fn_executable_p "$ac_path_EGREP" || continue -# Check for GNU ac_path_EGREP and select it if it is found. - # Check for GNU $ac_path_EGREP -case `"$ac_path_EGREP" --version 2>&1` in -*GNU*) - ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_found=:;; -*) - ac_count=0 - $as_echo_n 0123456789 >"conftest.in" - while : - do - cat "conftest.in" "conftest.in" >"conftest.tmp" - mv "conftest.tmp" "conftest.in" - cp "conftest.in" "conftest.nl" - $as_echo 'EGREP' >> "conftest.nl" - "$ac_path_EGREP" 'EGREP$' < "conftest.nl" >"conftest.out" 2>/dev/null || break - diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break - as_fn_arith $ac_count + 1 && ac_count=$as_val - if test $ac_count -gt ${ac_path_EGREP_max-0}; then - # Best one so far, save it but keep looking for a better one - ac_cv_path_EGREP="$ac_path_EGREP" - ac_path_EGREP_max=$ac_count - fi - # 10*(2^10) chars as input seems more than enough - test $ac_count -gt 10 && break - done - rm -f conftest.in conftest.tmp conftest.nl conftest.out;; -esac - - $ac_path_EGREP_found && break 3 - done - done - done -IFS=$as_save_IFS - if test -z "$ac_cv_path_EGREP"; then - as_fn_error $? "no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 - fi -else - ac_cv_path_EGREP=$EGREP -fi - - fi -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_EGREP" >&5 -$as_echo "$ac_cv_path_EGREP" >&6; } - EGREP="$ac_cv_path_EGREP" - - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for fgrep" >&5 -$as_echo_n "checking for fgrep... " >&6; } -if ${ac_cv_path_FGREP+:} false; then : - $as_echo_n "(cached) " >&6 -else - if echo 'ab*c' | $GREP -F 'ab*c' >/dev/null 2>&1 - then ac_cv_path_FGREP="$GREP -F" - else - if test -z "$FGREP"; then - ac_path_FGREP_found=false - # Loop through the user's path and test for each of PROGNAME-LIST - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_prog in fgrep; do - for ac_exec_ext in '' $ac_executable_extensions; do - ac_path_FGREP="$as_dir/$ac_prog$ac_exec_ext" - as_fn_executable_p "$ac_path_FGREP" || continue -# Check for GNU ac_path_FGREP and select it if it is found. - # Check for GNU $ac_path_FGREP -case `"$ac_path_FGREP" --version 2>&1` in -*GNU*) - ac_cv_path_FGREP="$ac_path_FGREP" ac_path_FGREP_found=:;; -*) - ac_count=0 - $as_echo_n 0123456789 >"conftest.in" - while : - do - cat "conftest.in" "conftest.in" >"conftest.tmp" - mv "conftest.tmp" "conftest.in" - cp "conftest.in" "conftest.nl" - $as_echo 'FGREP' >> "conftest.nl" - "$ac_path_FGREP" FGREP < "conftest.nl" >"conftest.out" 2>/dev/null || break - diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break - as_fn_arith $ac_count + 1 && ac_count=$as_val - if test $ac_count -gt ${ac_path_FGREP_max-0}; then - # Best one so far, save it but keep looking for a better one - ac_cv_path_FGREP="$ac_path_FGREP" - ac_path_FGREP_max=$ac_count - fi - # 10*(2^10) chars as input seems more than enough - test $ac_count -gt 10 && break - done - rm -f conftest.in conftest.tmp conftest.nl conftest.out;; -esac - - $ac_path_FGREP_found && break 3 - done - done - done -IFS=$as_save_IFS - if test -z "$ac_cv_path_FGREP"; then - as_fn_error $? "no acceptable fgrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 - fi -else - ac_cv_path_FGREP=$FGREP -fi - - fi -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_FGREP" >&5 -$as_echo "$ac_cv_path_FGREP" >&6; } - FGREP="$ac_cv_path_FGREP" - - -test -z "$GREP" && GREP=grep - - - - - - - - - - - - - - - - - - - -@%:@ Check whether --with-gnu-ld was given. -if test "${with_gnu_ld+set}" = set; then : - withval=$with_gnu_ld; test "$withval" = no || with_gnu_ld=yes -else - with_gnu_ld=no -fi - -ac_prog=ld -if test "$GCC" = yes; then - # Check if gcc -print-prog-name=ld gives a path. - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ld used by $CC" >&5 -$as_echo_n "checking for ld used by $CC... " >&6; } - case $host in - *-*-mingw*) - # gcc leaves a trailing carriage return which upsets mingw - ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;; - *) - ac_prog=`($CC -print-prog-name=ld) 2>&5` ;; - esac - case $ac_prog in - # Accept absolute paths. - [\\/]* | ?:[\\/]*) - re_direlt='/[^/][^/]*/\.\./' - # Canonicalize the pathname of ld - ac_prog=`$ECHO "$ac_prog"| $SED 's%\\\\%/%g'` - while $ECHO "$ac_prog" | $GREP "$re_direlt" > /dev/null 2>&1; do - ac_prog=`$ECHO $ac_prog| $SED "s%$re_direlt%/%"` - done - test -z "$LD" && LD="$ac_prog" - ;; - "") - # If it fails, then pretend we aren't using GCC. - ac_prog=ld - ;; - *) - # If it is relative, then search for the first ld in PATH. - with_gnu_ld=unknown - ;; - esac -elif test "$with_gnu_ld" = yes; then - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU ld" >&5 -$as_echo_n "checking for GNU ld... " >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for non-GNU ld" >&5 -$as_echo_n "checking for non-GNU ld... " >&6; } -fi -if ${lt_cv_path_LD+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -z "$LD"; then - lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR - for ac_dir in $PATH; do - IFS="$lt_save_ifs" - test -z "$ac_dir" && ac_dir=. - if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then - lt_cv_path_LD="$ac_dir/$ac_prog" - # Check to see if the program is GNU ld. I'd rather use --version, - # but apparently some variants of GNU ld only accept -v. - # Break only if it was the GNU/non-GNU ld that we prefer. - case `"$lt_cv_path_LD" -v 2>&1 &5 -$as_echo "$LD" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi -test -z "$LD" && as_fn_error $? "no acceptable ld found in \$PATH" "$LINENO" 5 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if the linker ($LD) is GNU ld" >&5 -$as_echo_n "checking if the linker ($LD) is GNU ld... " >&6; } -if ${lt_cv_prog_gnu_ld+:} false; then : - $as_echo_n "(cached) " >&6 -else - # I'd rather use --version here, but apparently some GNU lds only accept -v. -case `$LD -v 2>&1 &5 -$as_echo "$lt_cv_prog_gnu_ld" >&6; } -with_gnu_ld=$lt_cv_prog_gnu_ld - - - - - - - - - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for BSD- or MS-compatible name lister (nm)" >&5 -$as_echo_n "checking for BSD- or MS-compatible name lister (nm)... " >&6; } -if ${lt_cv_path_NM+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$NM"; then - # Let the user override the test. - lt_cv_path_NM="$NM" -else - lt_nm_to_check="${ac_tool_prefix}nm" - if test -n "$ac_tool_prefix" && test "$build" = "$host"; then - lt_nm_to_check="$lt_nm_to_check nm" - fi - for lt_tmp_nm in $lt_nm_to_check; do - lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR - for ac_dir in $PATH /usr/ccs/bin/elf /usr/ccs/bin /usr/ucb /bin; do - IFS="$lt_save_ifs" - test -z "$ac_dir" && ac_dir=. - tmp_nm="$ac_dir/$lt_tmp_nm" - if test -f "$tmp_nm" || test -f "$tmp_nm$ac_exeext" ; then - # Check to see if the nm accepts a BSD-compat flag. - # Adding the `sed 1q' prevents false positives on HP-UX, which says: - # nm: unknown option "B" ignored - # Tru64's nm complains that /dev/null is an invalid object file - case `"$tmp_nm" -B /dev/null 2>&1 | sed '1q'` in - */dev/null* | *'Invalid file or object type'*) - lt_cv_path_NM="$tmp_nm -B" - break - ;; - *) - case `"$tmp_nm" -p /dev/null 2>&1 | sed '1q'` in - */dev/null*) - lt_cv_path_NM="$tmp_nm -p" - break - ;; - *) - lt_cv_path_NM=${lt_cv_path_NM="$tmp_nm"} # keep the first match, but - continue # so that we can try to find one that supports BSD flags - ;; - esac - ;; - esac - fi - done - IFS="$lt_save_ifs" - done - : ${lt_cv_path_NM=no} -fi -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_path_NM" >&5 -$as_echo "$lt_cv_path_NM" >&6; } -if test "$lt_cv_path_NM" != "no"; then - NM="$lt_cv_path_NM" -else - # Didn't find any BSD compatible name lister, look for dumpbin. - if test -n "$DUMPBIN"; then : - # Let the user override the test. - else - if test -n "$ac_tool_prefix"; then - for ac_prog in dumpbin "link -dump" - do - # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. -set dummy $ac_tool_prefix$ac_prog; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_DUMPBIN+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$DUMPBIN"; then - ac_cv_prog_DUMPBIN="$DUMPBIN" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_DUMPBIN="$ac_tool_prefix$ac_prog" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -DUMPBIN=$ac_cv_prog_DUMPBIN -if test -n "$DUMPBIN"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DUMPBIN" >&5 -$as_echo "$DUMPBIN" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - - test -n "$DUMPBIN" && break - done -fi -if test -z "$DUMPBIN"; then - ac_ct_DUMPBIN=$DUMPBIN - for ac_prog in dumpbin "link -dump" -do - # Extract the first word of "$ac_prog", so it can be a program name with args. -set dummy $ac_prog; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_ac_ct_DUMPBIN+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$ac_ct_DUMPBIN"; then - ac_cv_prog_ac_ct_DUMPBIN="$ac_ct_DUMPBIN" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_ac_ct_DUMPBIN="$ac_prog" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -ac_ct_DUMPBIN=$ac_cv_prog_ac_ct_DUMPBIN -if test -n "$ac_ct_DUMPBIN"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DUMPBIN" >&5 -$as_echo "$ac_ct_DUMPBIN" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - - test -n "$ac_ct_DUMPBIN" && break -done - - if test "x$ac_ct_DUMPBIN" = x; then - DUMPBIN=":" - else - case $cross_compiling:$ac_tool_warned in -yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} -ac_tool_warned=yes ;; -esac - DUMPBIN=$ac_ct_DUMPBIN - fi -fi - - case `$DUMPBIN -symbols /dev/null 2>&1 | sed '1q'` in - *COFF*) - DUMPBIN="$DUMPBIN -symbols" - ;; - *) - DUMPBIN=: - ;; - esac - fi - - if test "$DUMPBIN" != ":"; then - NM="$DUMPBIN" - fi -fi -test -z "$NM" && NM=nm - - - - - - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking the name lister ($NM) interface" >&5 -$as_echo_n "checking the name lister ($NM) interface... " >&6; } -if ${lt_cv_nm_interface+:} false; then : - $as_echo_n "(cached) " >&6 -else - lt_cv_nm_interface="BSD nm" - echo "int some_variable = 0;" > conftest.$ac_ext - (eval echo "\"\$as_me:$LINENO: $ac_compile\"" >&5) - (eval "$ac_compile" 2>conftest.err) - cat conftest.err >&5 - (eval echo "\"\$as_me:$LINENO: $NM \\\"conftest.$ac_objext\\\"\"" >&5) - (eval "$NM \"conftest.$ac_objext\"" 2>conftest.err > conftest.out) - cat conftest.err >&5 - (eval echo "\"\$as_me:$LINENO: output\"" >&5) - cat conftest.out >&5 - if $GREP 'External.*some_variable' conftest.out > /dev/null; then - lt_cv_nm_interface="MS dumpbin" - fi - rm -f conftest* -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_nm_interface" >&5 -$as_echo "$lt_cv_nm_interface" >&6; } - -# find the maximum length of command line arguments -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking the maximum length of command line arguments" >&5 -$as_echo_n "checking the maximum length of command line arguments... " >&6; } -if ${lt_cv_sys_max_cmd_len+:} false; then : - $as_echo_n "(cached) " >&6 -else - i=0 - teststring="ABCD" - - case $build_os in - msdosdjgpp*) - # On DJGPP, this test can blow up pretty badly due to problems in libc - # (any single argument exceeding 2000 bytes causes a buffer overrun - # during glob expansion). Even if it were fixed, the result of this - # check would be larger than it should be. - lt_cv_sys_max_cmd_len=12288; # 12K is about right - ;; - - gnu*) - # Under GNU Hurd, this test is not required because there is - # no limit to the length of command line arguments. - # Libtool will interpret -1 as no limit whatsoever - lt_cv_sys_max_cmd_len=-1; - ;; - - cygwin* | mingw* | cegcc*) - # On Win9x/ME, this test blows up -- it succeeds, but takes - # about 5 minutes as the teststring grows exponentially. - # Worse, since 9x/ME are not pre-emptively multitasking, - # you end up with a "frozen" computer, even though with patience - # the test eventually succeeds (with a max line length of 256k). - # Instead, let's just punt: use the minimum linelength reported by - # all of the supported platforms: 8192 (on NT/2K/XP). - lt_cv_sys_max_cmd_len=8192; - ;; - - mint*) - # On MiNT this can take a long time and run out of memory. - lt_cv_sys_max_cmd_len=8192; - ;; - - amigaos*) - # On AmigaOS with pdksh, this test takes hours, literally. - # So we just punt and use a minimum line length of 8192. - lt_cv_sys_max_cmd_len=8192; - ;; - - netbsd* | freebsd* | openbsd* | darwin* | dragonfly*) - # This has been around since 386BSD, at least. Likely further. - if test -x /sbin/sysctl; then - lt_cv_sys_max_cmd_len=`/sbin/sysctl -n kern.argmax` - elif test -x /usr/sbin/sysctl; then - lt_cv_sys_max_cmd_len=`/usr/sbin/sysctl -n kern.argmax` - else - lt_cv_sys_max_cmd_len=65536 # usable default for all BSDs - fi - # And add a safety zone - lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` - lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` - ;; - - interix*) - # We know the value 262144 and hardcode it with a safety zone (like BSD) - lt_cv_sys_max_cmd_len=196608 - ;; - - os2*) - # The test takes a long time on OS/2. - lt_cv_sys_max_cmd_len=8192 - ;; - - osf*) - # Dr. Hans Ekkehard Plesser reports seeing a kernel panic running configure - # due to this test when exec_disable_arg_limit is 1 on Tru64. It is not - # nice to cause kernel panics so lets avoid the loop below. - # First set a reasonable default. - lt_cv_sys_max_cmd_len=16384 - # - if test -x /sbin/sysconfig; then - case `/sbin/sysconfig -q proc exec_disable_arg_limit` in - *1*) lt_cv_sys_max_cmd_len=-1 ;; - esac - fi - ;; - sco3.2v5*) - lt_cv_sys_max_cmd_len=102400 - ;; - sysv5* | sco5v6* | sysv4.2uw2*) - kargmax=`grep ARG_MAX /etc/conf/cf.d/stune 2>/dev/null` - if test -n "$kargmax"; then - lt_cv_sys_max_cmd_len=`echo $kargmax | sed 's/.*[ ]//'` - else - lt_cv_sys_max_cmd_len=32768 - fi - ;; - *) - lt_cv_sys_max_cmd_len=`(getconf ARG_MAX) 2> /dev/null` - if test -n "$lt_cv_sys_max_cmd_len"; then - lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` - lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` - else - # Make teststring a little bigger before we do anything with it. - # a 1K string should be a reasonable start. - for i in 1 2 3 4 5 6 7 8 ; do - teststring=$teststring$teststring - done - SHELL=${SHELL-${CONFIG_SHELL-/bin/sh}} - # If test is not a shell built-in, we'll probably end up computing a - # maximum length that is only half of the actual maximum length, but - # we can't tell. - while { test "X"`env echo "$teststring$teststring" 2>/dev/null` \ - = "X$teststring$teststring"; } >/dev/null 2>&1 && - test $i != 17 # 1/2 MB should be enough - do - i=`expr $i + 1` - teststring=$teststring$teststring - done - # Only check the string length outside the loop. - lt_cv_sys_max_cmd_len=`expr "X$teststring" : ".*" 2>&1` - teststring= - # Add a significant safety factor because C++ compilers can tack on - # massive amounts of additional arguments before passing them to the - # linker. It appears as though 1/2 is a usable value. - lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 2` - fi - ;; - esac - -fi - -if test -n $lt_cv_sys_max_cmd_len ; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_sys_max_cmd_len" >&5 -$as_echo "$lt_cv_sys_max_cmd_len" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: none" >&5 -$as_echo "none" >&6; } -fi -max_cmd_len=$lt_cv_sys_max_cmd_len - - - - - - -: ${CP="cp -f"} -: ${MV="mv -f"} -: ${RM="rm -f"} - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the shell understands some XSI constructs" >&5 -$as_echo_n "checking whether the shell understands some XSI constructs... " >&6; } -# Try some XSI features -xsi_shell=no -( _lt_dummy="a/b/c" - test "${_lt_dummy##*/},${_lt_dummy%/*},${_lt_dummy#??}"${_lt_dummy%"$_lt_dummy"}, \ - = c,a/b,b/c, \ - && eval 'test $(( 1 + 1 )) -eq 2 \ - && test "${#_lt_dummy}" -eq 5' ) >/dev/null 2>&1 \ - && xsi_shell=yes -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $xsi_shell" >&5 -$as_echo "$xsi_shell" >&6; } - - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the shell understands \"+=\"" >&5 -$as_echo_n "checking whether the shell understands \"+=\"... " >&6; } -lt_shell_append=no -( foo=bar; set foo baz; eval "$1+=\$2" && test "$foo" = barbaz ) \ - >/dev/null 2>&1 \ - && lt_shell_append=yes -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_shell_append" >&5 -$as_echo "$lt_shell_append" >&6; } - - -if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then - lt_unset=unset -else - lt_unset=false -fi - - - - - -# test EBCDIC or ASCII -case `echo X|tr X '\101'` in - A) # ASCII based system - # \n is not interpreted correctly by Solaris 8 /usr/ucb/tr - lt_SP2NL='tr \040 \012' - lt_NL2SP='tr \015\012 \040\040' - ;; - *) # EBCDIC based system - lt_SP2NL='tr \100 \n' - lt_NL2SP='tr \r\n \100\100' - ;; -esac - - - - - - - - - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to convert $build file names to $host format" >&5 -$as_echo_n "checking how to convert $build file names to $host format... " >&6; } -if ${lt_cv_to_host_file_cmd+:} false; then : - $as_echo_n "(cached) " >&6 -else - case $host in - *-*-mingw* ) - case $build in - *-*-mingw* ) # actually msys - lt_cv_to_host_file_cmd=func_convert_file_msys_to_w32 - ;; - *-*-cygwin* ) - lt_cv_to_host_file_cmd=func_convert_file_cygwin_to_w32 - ;; - * ) # otherwise, assume *nix - lt_cv_to_host_file_cmd=func_convert_file_nix_to_w32 - ;; - esac - ;; - *-*-cygwin* ) - case $build in - *-*-mingw* ) # actually msys - lt_cv_to_host_file_cmd=func_convert_file_msys_to_cygwin - ;; - *-*-cygwin* ) - lt_cv_to_host_file_cmd=func_convert_file_noop - ;; - * ) # otherwise, assume *nix - lt_cv_to_host_file_cmd=func_convert_file_nix_to_cygwin - ;; - esac - ;; - * ) # unhandled hosts (and "normal" native builds) - lt_cv_to_host_file_cmd=func_convert_file_noop - ;; -esac - -fi - -to_host_file_cmd=$lt_cv_to_host_file_cmd -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_to_host_file_cmd" >&5 -$as_echo "$lt_cv_to_host_file_cmd" >&6; } - - - - - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to convert $build file names to toolchain format" >&5 -$as_echo_n "checking how to convert $build file names to toolchain format... " >&6; } -if ${lt_cv_to_tool_file_cmd+:} false; then : - $as_echo_n "(cached) " >&6 -else - #assume ordinary cross tools, or native build. -lt_cv_to_tool_file_cmd=func_convert_file_noop -case $host in - *-*-mingw* ) - case $build in - *-*-mingw* ) # actually msys - lt_cv_to_tool_file_cmd=func_convert_file_msys_to_w32 - ;; - esac - ;; -esac - -fi - -to_tool_file_cmd=$lt_cv_to_tool_file_cmd -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_to_tool_file_cmd" >&5 -$as_echo "$lt_cv_to_tool_file_cmd" >&6; } - - - - - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $LD option to reload object files" >&5 -$as_echo_n "checking for $LD option to reload object files... " >&6; } -if ${lt_cv_ld_reload_flag+:} false; then : - $as_echo_n "(cached) " >&6 -else - lt_cv_ld_reload_flag='-r' -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_reload_flag" >&5 -$as_echo "$lt_cv_ld_reload_flag" >&6; } -reload_flag=$lt_cv_ld_reload_flag -case $reload_flag in -"" | " "*) ;; -*) reload_flag=" $reload_flag" ;; -esac -reload_cmds='$LD$reload_flag -o $output$reload_objs' -case $host_os in - cygwin* | mingw* | pw32* | cegcc*) - if test "$GCC" != yes; then - reload_cmds=false - fi - ;; - darwin*) - if test "$GCC" = yes; then - reload_cmds='$LTCC $LTCFLAGS -nostdlib ${wl}-r -o $output$reload_objs' - else - reload_cmds='$LD$reload_flag -o $output$reload_objs' - fi - ;; -esac - - - - - - - - - -if test -n "$ac_tool_prefix"; then - # Extract the first word of "${ac_tool_prefix}objdump", so it can be a program name with args. -set dummy ${ac_tool_prefix}objdump; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_OBJDUMP+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$OBJDUMP"; then - ac_cv_prog_OBJDUMP="$OBJDUMP" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_OBJDUMP="${ac_tool_prefix}objdump" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -OBJDUMP=$ac_cv_prog_OBJDUMP -if test -n "$OBJDUMP"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OBJDUMP" >&5 -$as_echo "$OBJDUMP" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - -fi -if test -z "$ac_cv_prog_OBJDUMP"; then - ac_ct_OBJDUMP=$OBJDUMP - # Extract the first word of "objdump", so it can be a program name with args. -set dummy objdump; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_ac_ct_OBJDUMP+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$ac_ct_OBJDUMP"; then - ac_cv_prog_ac_ct_OBJDUMP="$ac_ct_OBJDUMP" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_ac_ct_OBJDUMP="objdump" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -ac_ct_OBJDUMP=$ac_cv_prog_ac_ct_OBJDUMP -if test -n "$ac_ct_OBJDUMP"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OBJDUMP" >&5 -$as_echo "$ac_ct_OBJDUMP" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - if test "x$ac_ct_OBJDUMP" = x; then - OBJDUMP="false" - else - case $cross_compiling:$ac_tool_warned in -yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} -ac_tool_warned=yes ;; -esac - OBJDUMP=$ac_ct_OBJDUMP - fi -else - OBJDUMP="$ac_cv_prog_OBJDUMP" -fi - -test -z "$OBJDUMP" && OBJDUMP=objdump - - - - - - - - - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to recognize dependent libraries" >&5 -$as_echo_n "checking how to recognize dependent libraries... " >&6; } -if ${lt_cv_deplibs_check_method+:} false; then : - $as_echo_n "(cached) " >&6 -else - lt_cv_file_magic_cmd='$MAGIC_CMD' -lt_cv_file_magic_test_file= -lt_cv_deplibs_check_method='unknown' -# Need to set the preceding variable on all platforms that support -# interlibrary dependencies. -# 'none' -- dependencies not supported. -# `unknown' -- same as none, but documents that we really don't know. -# 'pass_all' -- all dependencies passed with no checks. -# 'test_compile' -- check by making test program. -# 'file_magic [[regex]]' -- check by looking for files in library path -# which responds to the $file_magic_cmd with a given extended regex. -# If you have `file' or equivalent on your system and you're not sure -# whether `pass_all' will *always* work, you probably want this one. - -case $host_os in -aix[4-9]*) - lt_cv_deplibs_check_method=pass_all - ;; - -beos*) - lt_cv_deplibs_check_method=pass_all - ;; - -bsdi[45]*) - lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (shared object|dynamic lib)' - lt_cv_file_magic_cmd='/usr/bin/file -L' - lt_cv_file_magic_test_file=/shlib/libc.so - ;; - -cygwin*) - # func_win32_libid is a shell function defined in ltmain.sh - lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL' - lt_cv_file_magic_cmd='func_win32_libid' - ;; - -mingw* | pw32*) - # Base MSYS/MinGW do not provide the 'file' command needed by - # func_win32_libid shell function, so use a weaker test based on 'objdump', - # unless we find 'file', for example because we are cross-compiling. - # func_win32_libid assumes BSD nm, so disallow it if using MS dumpbin. - if ( test "$lt_cv_nm_interface" = "BSD nm" && file / ) >/dev/null 2>&1; then - lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL' - lt_cv_file_magic_cmd='func_win32_libid' - else - # Keep this pattern in sync with the one in func_win32_libid. - lt_cv_deplibs_check_method='file_magic file format (pei*-i386(.*architecture: i386)?|pe-arm-wince|pe-x86-64)' - lt_cv_file_magic_cmd='$OBJDUMP -f' - fi - ;; - -cegcc*) - # use the weaker test based on 'objdump'. See mingw*. - lt_cv_deplibs_check_method='file_magic file format pe-arm-.*little(.*architecture: arm)?' - lt_cv_file_magic_cmd='$OBJDUMP -f' - ;; - -darwin* | rhapsody*) - lt_cv_deplibs_check_method=pass_all - ;; - -freebsd* | dragonfly*) - if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then - case $host_cpu in - i*86 ) - # Not sure whether the presence of OpenBSD here was a mistake. - # Let's accept both of them until this is cleared up. - lt_cv_deplibs_check_method='file_magic (FreeBSD|OpenBSD|DragonFly)/i[3-9]86 (compact )?demand paged shared library' - lt_cv_file_magic_cmd=/usr/bin/file - lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*` - ;; - esac - else - lt_cv_deplibs_check_method=pass_all - fi - ;; - -gnu*) - lt_cv_deplibs_check_method=pass_all - ;; - -haiku*) - lt_cv_deplibs_check_method=pass_all - ;; - -hpux10.20* | hpux11*) - lt_cv_file_magic_cmd=/usr/bin/file - case $host_cpu in - ia64*) - lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF-[0-9][0-9]) shared object file - IA64' - lt_cv_file_magic_test_file=/usr/lib/hpux32/libc.so - ;; - hppa*64*) - lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF[ -][0-9][0-9])(-bit)?( [LM]SB)? shared object( file)?[, -]* PA-RISC [0-9]\.[0-9]' - lt_cv_file_magic_test_file=/usr/lib/pa20_64/libc.sl - ;; - *) - lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|PA-RISC[0-9]\.[0-9]) shared library' - lt_cv_file_magic_test_file=/usr/lib/libc.sl - ;; - esac - ;; - -interix[3-9]*) - # PIC code is broken on Interix 3.x, that's why |\.a not |_pic\.a here - lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so|\.a)$' - ;; - -irix5* | irix6* | nonstopux*) - case $LD in - *-32|*"-32 ") libmagic=32-bit;; - *-n32|*"-n32 ") libmagic=N32;; - *-64|*"-64 ") libmagic=64-bit;; - *) libmagic=never-match;; - esac - lt_cv_deplibs_check_method=pass_all - ;; - -# This must be glibc/ELF. -linux* | k*bsd*-gnu | kopensolaris*-gnu) - lt_cv_deplibs_check_method=pass_all - ;; - -netbsd* | netbsdelf*-gnu) - if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then - lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|_pic\.a)$' - else - lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so|_pic\.a)$' - fi - ;; - -newos6*) - lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (executable|dynamic lib)' - lt_cv_file_magic_cmd=/usr/bin/file - lt_cv_file_magic_test_file=/usr/lib/libnls.so - ;; - -*nto* | *qnx*) - lt_cv_deplibs_check_method=pass_all - ;; - -openbsd*) - if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then - lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|\.so|_pic\.a)$' - else - lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|_pic\.a)$' - fi - ;; - -osf3* | osf4* | osf5*) - lt_cv_deplibs_check_method=pass_all - ;; - -rdos*) - lt_cv_deplibs_check_method=pass_all - ;; - -solaris*) - lt_cv_deplibs_check_method=pass_all - ;; - -sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) - lt_cv_deplibs_check_method=pass_all - ;; - -sysv4 | sysv4.3*) - case $host_vendor in - motorola) - lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (shared object|dynamic lib) M[0-9][0-9]* Version [0-9]' - lt_cv_file_magic_test_file=`echo /usr/lib/libc.so*` - ;; - ncr) - lt_cv_deplibs_check_method=pass_all - ;; - sequent) - lt_cv_file_magic_cmd='/bin/file' - lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [LM]SB (shared object|dynamic lib )' - ;; - sni) - lt_cv_file_magic_cmd='/bin/file' - lt_cv_deplibs_check_method="file_magic ELF [0-9][0-9]*-bit [LM]SB dynamic lib" - lt_cv_file_magic_test_file=/lib/libc.so - ;; - siemens) - lt_cv_deplibs_check_method=pass_all - ;; - pc) - lt_cv_deplibs_check_method=pass_all - ;; - esac - ;; - -tpf*) - lt_cv_deplibs_check_method=pass_all - ;; -esac - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_deplibs_check_method" >&5 -$as_echo "$lt_cv_deplibs_check_method" >&6; } - -file_magic_glob= -want_nocaseglob=no -if test "$build" = "$host"; then - case $host_os in - mingw* | pw32*) - if ( shopt | grep nocaseglob ) >/dev/null 2>&1; then - want_nocaseglob=yes - else - file_magic_glob=`echo aAbBcCdDeEfFgGhHiIjJkKlLmMnNoOpPqQrRsStTuUvVwWxXyYzZ | $SED -e "s/\(..\)/s\/[\1]\/[\1]\/g;/g"` - fi - ;; - esac -fi - -file_magic_cmd=$lt_cv_file_magic_cmd -deplibs_check_method=$lt_cv_deplibs_check_method -test -z "$deplibs_check_method" && deplibs_check_method=unknown - - - - - - - - - - - - - - - - - - - - - - -if test -n "$ac_tool_prefix"; then - # Extract the first word of "${ac_tool_prefix}dlltool", so it can be a program name with args. -set dummy ${ac_tool_prefix}dlltool; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_DLLTOOL+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$DLLTOOL"; then - ac_cv_prog_DLLTOOL="$DLLTOOL" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_DLLTOOL="${ac_tool_prefix}dlltool" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -DLLTOOL=$ac_cv_prog_DLLTOOL -if test -n "$DLLTOOL"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DLLTOOL" >&5 -$as_echo "$DLLTOOL" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - -fi -if test -z "$ac_cv_prog_DLLTOOL"; then - ac_ct_DLLTOOL=$DLLTOOL - # Extract the first word of "dlltool", so it can be a program name with args. -set dummy dlltool; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_ac_ct_DLLTOOL+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$ac_ct_DLLTOOL"; then - ac_cv_prog_ac_ct_DLLTOOL="$ac_ct_DLLTOOL" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_ac_ct_DLLTOOL="dlltool" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -ac_ct_DLLTOOL=$ac_cv_prog_ac_ct_DLLTOOL -if test -n "$ac_ct_DLLTOOL"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DLLTOOL" >&5 -$as_echo "$ac_ct_DLLTOOL" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - if test "x$ac_ct_DLLTOOL" = x; then - DLLTOOL="false" - else - case $cross_compiling:$ac_tool_warned in -yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} -ac_tool_warned=yes ;; -esac - DLLTOOL=$ac_ct_DLLTOOL - fi -else - DLLTOOL="$ac_cv_prog_DLLTOOL" -fi - -test -z "$DLLTOOL" && DLLTOOL=dlltool - - - - - - - - - - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to associate runtime and link libraries" >&5 -$as_echo_n "checking how to associate runtime and link libraries... " >&6; } -if ${lt_cv_sharedlib_from_linklib_cmd+:} false; then : - $as_echo_n "(cached) " >&6 -else - lt_cv_sharedlib_from_linklib_cmd='unknown' - -case $host_os in -cygwin* | mingw* | pw32* | cegcc*) - # two different shell functions defined in ltmain.sh - # decide which to use based on capabilities of $DLLTOOL - case `$DLLTOOL --help 2>&1` in - *--identify-strict*) - lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib - ;; - *) - lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib_fallback - ;; - esac - ;; -*) - # fallback: assume linklib IS sharedlib - lt_cv_sharedlib_from_linklib_cmd="$ECHO" - ;; -esac - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_sharedlib_from_linklib_cmd" >&5 -$as_echo "$lt_cv_sharedlib_from_linklib_cmd" >&6; } -sharedlib_from_linklib_cmd=$lt_cv_sharedlib_from_linklib_cmd -test -z "$sharedlib_from_linklib_cmd" && sharedlib_from_linklib_cmd=$ECHO - - - - - - - - -if test -n "$ac_tool_prefix"; then - for ac_prog in ar - do - # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. -set dummy $ac_tool_prefix$ac_prog; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_AR+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$AR"; then - ac_cv_prog_AR="$AR" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_AR="$ac_tool_prefix$ac_prog" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -AR=$ac_cv_prog_AR -if test -n "$AR"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AR" >&5 -$as_echo "$AR" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - - test -n "$AR" && break - done -fi -if test -z "$AR"; then - ac_ct_AR=$AR - for ac_prog in ar -do - # Extract the first word of "$ac_prog", so it can be a program name with args. -set dummy $ac_prog; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_ac_ct_AR+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$ac_ct_AR"; then - ac_cv_prog_ac_ct_AR="$ac_ct_AR" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_ac_ct_AR="$ac_prog" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -ac_ct_AR=$ac_cv_prog_ac_ct_AR -if test -n "$ac_ct_AR"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_AR" >&5 -$as_echo "$ac_ct_AR" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - - test -n "$ac_ct_AR" && break -done - - if test "x$ac_ct_AR" = x; then - AR="false" - else - case $cross_compiling:$ac_tool_warned in -yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} -ac_tool_warned=yes ;; -esac - AR=$ac_ct_AR - fi -fi - -: ${AR=ar} -: ${AR_FLAGS=cru} - - - - - - - - - - - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for archiver @FILE support" >&5 -$as_echo_n "checking for archiver @FILE support... " >&6; } -if ${lt_cv_ar_at_file+:} false; then : - $as_echo_n "(cached) " >&6 -else - lt_cv_ar_at_file=no - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -int -main () -{ - - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - echo conftest.$ac_objext > conftest.lst - lt_ar_try='$AR $AR_FLAGS libconftest.a @conftest.lst >&5' - { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$lt_ar_try\""; } >&5 - (eval $lt_ar_try) 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } - if test "$ac_status" -eq 0; then - # Ensure the archiver fails upon bogus file names. - rm -f conftest.$ac_objext libconftest.a - { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$lt_ar_try\""; } >&5 - (eval $lt_ar_try) 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } - if test "$ac_status" -ne 0; then - lt_cv_ar_at_file=@ - fi - fi - rm -f conftest.* libconftest.a - -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ar_at_file" >&5 -$as_echo "$lt_cv_ar_at_file" >&6; } - -if test "x$lt_cv_ar_at_file" = xno; then - archiver_list_spec= -else - archiver_list_spec=$lt_cv_ar_at_file -fi - - - - - - - -if test -n "$ac_tool_prefix"; then - # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args. -set dummy ${ac_tool_prefix}strip; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_STRIP+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$STRIP"; then - ac_cv_prog_STRIP="$STRIP" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_STRIP="${ac_tool_prefix}strip" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -STRIP=$ac_cv_prog_STRIP -if test -n "$STRIP"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $STRIP" >&5 -$as_echo "$STRIP" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - -fi -if test -z "$ac_cv_prog_STRIP"; then - ac_ct_STRIP=$STRIP - # Extract the first word of "strip", so it can be a program name with args. -set dummy strip; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_ac_ct_STRIP+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$ac_ct_STRIP"; then - ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_ac_ct_STRIP="strip" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP -if test -n "$ac_ct_STRIP"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP" >&5 -$as_echo "$ac_ct_STRIP" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - if test "x$ac_ct_STRIP" = x; then - STRIP=":" - else - case $cross_compiling:$ac_tool_warned in -yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} -ac_tool_warned=yes ;; -esac - STRIP=$ac_ct_STRIP - fi -else - STRIP="$ac_cv_prog_STRIP" -fi - -test -z "$STRIP" && STRIP=: - - - - - - -if test -n "$ac_tool_prefix"; then - # Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args. -set dummy ${ac_tool_prefix}ranlib; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_RANLIB+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$RANLIB"; then - ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -RANLIB=$ac_cv_prog_RANLIB -if test -n "$RANLIB"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $RANLIB" >&5 -$as_echo "$RANLIB" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - -fi -if test -z "$ac_cv_prog_RANLIB"; then - ac_ct_RANLIB=$RANLIB - # Extract the first word of "ranlib", so it can be a program name with args. -set dummy ranlib; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_ac_ct_RANLIB+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$ac_ct_RANLIB"; then - ac_cv_prog_ac_ct_RANLIB="$ac_ct_RANLIB" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_ac_ct_RANLIB="ranlib" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -ac_ct_RANLIB=$ac_cv_prog_ac_ct_RANLIB -if test -n "$ac_ct_RANLIB"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_RANLIB" >&5 -$as_echo "$ac_ct_RANLIB" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - if test "x$ac_ct_RANLIB" = x; then - RANLIB=":" - else - case $cross_compiling:$ac_tool_warned in -yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} -ac_tool_warned=yes ;; -esac - RANLIB=$ac_ct_RANLIB - fi -else - RANLIB="$ac_cv_prog_RANLIB" -fi - -test -z "$RANLIB" && RANLIB=: - - - - - - -# Determine commands to create old-style static archives. -old_archive_cmds='$AR $AR_FLAGS $oldlib$oldobjs' -old_postinstall_cmds='chmod 644 $oldlib' -old_postuninstall_cmds= - -if test -n "$RANLIB"; then - case $host_os in - openbsd*) - old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB -t \$tool_oldlib" - ;; - *) - old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB \$tool_oldlib" - ;; - esac - old_archive_cmds="$old_archive_cmds~\$RANLIB \$tool_oldlib" -fi - -case $host_os in - darwin*) - lock_old_archive_extraction=yes ;; - *) - lock_old_archive_extraction=no ;; -esac - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -# If no C compiler was specified, use CC. -LTCC=${LTCC-"$CC"} - -# If no C compiler flags were specified, use CFLAGS. -LTCFLAGS=${LTCFLAGS-"$CFLAGS"} - -# Allow CC to be a program name with arguments. -compiler=$CC - - -# Check for command to grab the raw symbol name followed by C symbol from nm. -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking command to parse $NM output from $compiler object" >&5 -$as_echo_n "checking command to parse $NM output from $compiler object... " >&6; } -if ${lt_cv_sys_global_symbol_pipe+:} false; then : - $as_echo_n "(cached) " >&6 -else - -# These are sane defaults that work on at least a few old systems. -# [They come from Ultrix. What could be older than Ultrix?!! ;)] - -# Character class describing NM global symbol codes. -symcode='[BCDEGRST]' - -# Regexp to match symbols that can be accessed directly from C. -sympat='\([_A-Za-z][_A-Za-z0-9]*\)' - -# Define system-specific variables. -case $host_os in -aix*) - symcode='[BCDT]' - ;; -cygwin* | mingw* | pw32* | cegcc*) - symcode='[ABCDGISTW]' - ;; -hpux*) - if test "$host_cpu" = ia64; then - symcode='[ABCDEGRST]' - fi - ;; -irix* | nonstopux*) - symcode='[BCDEGRST]' - ;; -osf*) - symcode='[BCDEGQRST]' - ;; -solaris*) - symcode='[BDRT]' - ;; -sco3.2v5*) - symcode='[DT]' - ;; -sysv4.2uw2*) - symcode='[DT]' - ;; -sysv5* | sco5v6* | unixware* | OpenUNIX*) - symcode='[ABDT]' - ;; -sysv4) - symcode='[DFNSTU]' - ;; -esac - -# If we're using GNU nm, then use its standard symbol codes. -case `$NM -V 2>&1` in -*GNU* | *'with BFD'*) - symcode='[ABCDGIRSTW]' ;; -esac - -# Transform an extracted symbol line into a proper C declaration. -# Some systems (esp. on ia64) link data and code symbols differently, -# so use this general approach. -lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^T .* \(.*\)$/extern int \1();/p' -e 's/^$symcode* .* \(.*\)$/extern char \1;/p'" - -# Transform an extracted symbol line into symbol name and symbol address -lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([^ ]*\)[ ]*$/ {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([^ ]*\) \([^ ]*\)$/ {\"\2\", (void *) \&\2},/p'" -lt_cv_sys_global_symbol_to_c_name_address_lib_prefix="sed -n -e 's/^: \([^ ]*\)[ ]*$/ {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([^ ]*\) \(lib[^ ]*\)$/ {\"\2\", (void *) \&\2},/p' -e 's/^$symcode* \([^ ]*\) \([^ ]*\)$/ {\"lib\2\", (void *) \&\2},/p'" - -# Handle CRLF in mingw tool chain -opt_cr= -case $build_os in -mingw*) - opt_cr=`$ECHO 'x\{0,1\}' | tr x '\015'` # option cr in regexp - ;; -esac - -# Try without a prefix underscore, then with it. -for ac_symprfx in "" "_"; do - - # Transform symcode, sympat, and symprfx into a raw symbol and a C symbol. - symxfrm="\\1 $ac_symprfx\\2 \\2" - - # Write the raw and C identifiers. - if test "$lt_cv_nm_interface" = "MS dumpbin"; then - # Fake it for dumpbin and say T for any non-static function - # and D for any global variable. - # Also find C++ and __fastcall symbols from MSVC++, - # which start with @ or ?. - lt_cv_sys_global_symbol_pipe="$AWK '"\ -" {last_section=section; section=\$ 3};"\ -" /^COFF SYMBOL TABLE/{for(i in hide) delete hide[i]};"\ -" /Section length .*#relocs.*(pick any)/{hide[last_section]=1};"\ -" \$ 0!~/External *\|/{next};"\ -" / 0+ UNDEF /{next}; / UNDEF \([^|]\)*()/{next};"\ -" {if(hide[section]) next};"\ -" {f=0}; \$ 0~/\(\).*\|/{f=1}; {printf f ? \"T \" : \"D \"};"\ -" {split(\$ 0, a, /\||\r/); split(a[2], s)};"\ -" s[1]~/^[@?]/{print s[1], s[1]; next};"\ -" s[1]~prfx {split(s[1],t,\"@\"); print t[1], substr(t[1],length(prfx))}"\ -" ' prfx=^$ac_symprfx" - else - lt_cv_sys_global_symbol_pipe="sed -n -e 's/^.*[ ]\($symcode$symcode*\)[ ][ ]*$ac_symprfx$sympat$opt_cr$/$symxfrm/p'" - fi - lt_cv_sys_global_symbol_pipe="$lt_cv_sys_global_symbol_pipe | sed '/ __gnu_lto/d'" - - # Check to see that the pipe works correctly. - pipe_works=no - - rm -f conftest* - cat > conftest.$ac_ext <<_LT_EOF -#ifdef __cplusplus -extern "C" { -#endif -char nm_test_var; -void nm_test_func(void); -void nm_test_func(void){} -#ifdef __cplusplus -} -#endif -int main(){nm_test_var='a';nm_test_func();return(0);} -_LT_EOF - - if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 - (eval $ac_compile) 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; }; then - # Now try to grab the symbols. - nlist=conftest.nm - if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$NM conftest.$ac_objext \| "$lt_cv_sys_global_symbol_pipe" \> $nlist\""; } >&5 - (eval $NM conftest.$ac_objext \| "$lt_cv_sys_global_symbol_pipe" \> $nlist) 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } && test -s "$nlist"; then - # Try sorting and uniquifying the output. - if sort "$nlist" | uniq > "$nlist"T; then - mv -f "$nlist"T "$nlist" - else - rm -f "$nlist"T - fi - - # Make sure that we snagged all the symbols we need. - if $GREP ' nm_test_var$' "$nlist" >/dev/null; then - if $GREP ' nm_test_func$' "$nlist" >/dev/null; then - cat <<_LT_EOF > conftest.$ac_ext -/* Keep this code in sync between libtool.m4, ltmain, lt_system.h, and tests. */ -#if defined(_WIN32) || defined(__CYGWIN__) || defined(_WIN32_WCE) -/* DATA imports from DLLs on WIN32 con't be const, because runtime - relocations are performed -- see ld's documentation on pseudo-relocs. */ -# define LT@&t@_DLSYM_CONST -#elif defined(__osf__) -/* This system does not cope well with relocations in const data. */ -# define LT@&t@_DLSYM_CONST -#else -# define LT@&t@_DLSYM_CONST const -#endif - -#ifdef __cplusplus -extern "C" { -#endif - -_LT_EOF - # Now generate the symbol file. - eval "$lt_cv_sys_global_symbol_to_cdecl"' < "$nlist" | $GREP -v main >> conftest.$ac_ext' - - cat <<_LT_EOF >> conftest.$ac_ext - -/* The mapping between symbol names and symbols. */ -LT@&t@_DLSYM_CONST struct { - const char *name; - void *address; -} -lt__PROGRAM__LTX_preloaded_symbols[] = -{ - { "@PROGRAM@", (void *) 0 }, -_LT_EOF - $SED "s/^$symcode$symcode* \(.*\) \(.*\)$/ {\"\2\", (void *) \&\2},/" < "$nlist" | $GREP -v main >> conftest.$ac_ext - cat <<\_LT_EOF >> conftest.$ac_ext - {0, (void *) 0} -}; - -/* This works around a problem in FreeBSD linker */ -#ifdef FREEBSD_WORKAROUND -static const void *lt_preloaded_setup() { - return lt__PROGRAM__LTX_preloaded_symbols; -} -#endif - -#ifdef __cplusplus -} -#endif -_LT_EOF - # Now try linking the two files. - mv conftest.$ac_objext conftstm.$ac_objext - lt_globsym_save_LIBS=$LIBS - lt_globsym_save_CFLAGS=$CFLAGS - LIBS="conftstm.$ac_objext" - CFLAGS="$CFLAGS$lt_prog_compiler_no_builtin_flag" - if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5 - (eval $ac_link) 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } && test -s conftest${ac_exeext}; then - pipe_works=yes - fi - LIBS=$lt_globsym_save_LIBS - CFLAGS=$lt_globsym_save_CFLAGS - else - echo "cannot find nm_test_func in $nlist" >&5 - fi - else - echo "cannot find nm_test_var in $nlist" >&5 - fi - else - echo "cannot run $lt_cv_sys_global_symbol_pipe" >&5 - fi - else - echo "$progname: failed program was:" >&5 - cat conftest.$ac_ext >&5 - fi - rm -rf conftest* conftst* - - # Do not use the global_symbol_pipe unless it works. - if test "$pipe_works" = yes; then - break - else - lt_cv_sys_global_symbol_pipe= - fi -done - -fi - -if test -z "$lt_cv_sys_global_symbol_pipe"; then - lt_cv_sys_global_symbol_to_cdecl= -fi -if test -z "$lt_cv_sys_global_symbol_pipe$lt_cv_sys_global_symbol_to_cdecl"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: failed" >&5 -$as_echo "failed" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: ok" >&5 -$as_echo "ok" >&6; } -fi - -# Response file support. -if test "$lt_cv_nm_interface" = "MS dumpbin"; then - nm_file_list_spec='@' -elif $NM --help 2>/dev/null | grep '[@]FILE' >/dev/null; then - nm_file_list_spec='@' -fi - - - - - - - - - - - - - - - - - - - - - - - - - - - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for sysroot" >&5 -$as_echo_n "checking for sysroot... " >&6; } - -@%:@ Check whether --with-sysroot was given. -if test "${with_sysroot+set}" = set; then : - withval=$with_sysroot; -else - with_sysroot=no -fi - - -lt_sysroot= -case ${with_sysroot} in #( - yes) - if test "$GCC" = yes; then - lt_sysroot=`$CC --print-sysroot 2>/dev/null` - fi - ;; #( - /*) - lt_sysroot=`echo "$with_sysroot" | sed -e "$sed_quote_subst"` - ;; #( - no|'') - ;; #( - *) - { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${with_sysroot}" >&5 -$as_echo "${with_sysroot}" >&6; } - as_fn_error $? "The sysroot must be an absolute path." "$LINENO" 5 - ;; -esac - - { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${lt_sysroot:-no}" >&5 -$as_echo "${lt_sysroot:-no}" >&6; } - - - - - -@%:@ Check whether --enable-libtool-lock was given. -if test "${enable_libtool_lock+set}" = set; then : - enableval=$enable_libtool_lock; -fi - -test "x$enable_libtool_lock" != xno && enable_libtool_lock=yes - -# Some flags need to be propagated to the compiler or linker for good -# libtool support. -case $host in -ia64-*-hpux*) - # Find out which ABI we are using. - echo 'int i;' > conftest.$ac_ext - if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 - (eval $ac_compile) 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; }; then - case `/usr/bin/file conftest.$ac_objext` in - *ELF-32*) - HPUX_IA64_MODE="32" - ;; - *ELF-64*) - HPUX_IA64_MODE="64" - ;; - esac - fi - rm -rf conftest* - ;; -*-*-irix6*) - # Find out which ABI we are using. - echo '#line '$LINENO' "configure"' > conftest.$ac_ext - if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 - (eval $ac_compile) 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; }; then - if test "$lt_cv_prog_gnu_ld" = yes; then - case `/usr/bin/file conftest.$ac_objext` in - *32-bit*) - LD="${LD-ld} -melf32bsmip" - ;; - *N32*) - LD="${LD-ld} -melf32bmipn32" - ;; - *64-bit*) - LD="${LD-ld} -melf64bmip" - ;; - esac - else - case `/usr/bin/file conftest.$ac_objext` in - *32-bit*) - LD="${LD-ld} -32" - ;; - *N32*) - LD="${LD-ld} -n32" - ;; - *64-bit*) - LD="${LD-ld} -64" - ;; - esac - fi - fi - rm -rf conftest* - ;; - -x86_64-*kfreebsd*-gnu|x86_64-*linux*|ppc*-*linux*|powerpc*-*linux*| \ -s390*-*linux*|s390*-*tpf*|sparc*-*linux*) - # Find out which ABI we are using. - echo 'int i;' > conftest.$ac_ext - if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 - (eval $ac_compile) 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; }; then - case `/usr/bin/file conftest.o` in - *32-bit*) - case $host in - x86_64-*kfreebsd*-gnu) - LD="${LD-ld} -m elf_i386_fbsd" - ;; - x86_64-*linux*) - LD="${LD-ld} -m elf_i386" - ;; - ppc64-*linux*|powerpc64-*linux*) - LD="${LD-ld} -m elf32ppclinux" - ;; - s390x-*linux*) - LD="${LD-ld} -m elf_s390" - ;; - sparc64-*linux*) - LD="${LD-ld} -m elf32_sparc" - ;; - esac - ;; - *64-bit*) - case $host in - x86_64-*kfreebsd*-gnu) - LD="${LD-ld} -m elf_x86_64_fbsd" - ;; - x86_64-*linux*) - LD="${LD-ld} -m elf_x86_64" - ;; - ppc*-*linux*|powerpc*-*linux*) - LD="${LD-ld} -m elf64ppc" - ;; - s390*-*linux*|s390*-*tpf*) - LD="${LD-ld} -m elf64_s390" - ;; - sparc*-*linux*) - LD="${LD-ld} -m elf64_sparc" - ;; - esac - ;; - esac - fi - rm -rf conftest* - ;; - -*-*-sco3.2v5*) - # On SCO OpenServer 5, we need -belf to get full-featured binaries. - SAVE_CFLAGS="$CFLAGS" - CFLAGS="$CFLAGS -belf" - { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler needs -belf" >&5 -$as_echo_n "checking whether the C compiler needs -belf... " >&6; } -if ${lt_cv_cc_needs_belf+:} false; then : - $as_echo_n "(cached) " >&6 -else - ac_ext=c -ac_cpp='$CPP $CPPFLAGS' -ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_c_compiler_gnu - - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -int -main () -{ - - ; - return 0; -} -_ACEOF -if ac_fn_c_try_link "$LINENO"; then : - lt_cv_cc_needs_belf=yes -else - lt_cv_cc_needs_belf=no -fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext - ac_ext=c -ac_cpp='$CPP $CPPFLAGS' -ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_c_compiler_gnu - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_cc_needs_belf" >&5 -$as_echo "$lt_cv_cc_needs_belf" >&6; } - if test x"$lt_cv_cc_needs_belf" != x"yes"; then - # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf - CFLAGS="$SAVE_CFLAGS" - fi - ;; -*-*solaris*) - # Find out which ABI we are using. - echo 'int i;' > conftest.$ac_ext - if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 - (eval $ac_compile) 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; }; then - case `/usr/bin/file conftest.o` in - *64-bit*) - case $lt_cv_prog_gnu_ld in - yes*) - case $host in - i?86-*-solaris*) - LD="${LD-ld} -m elf_x86_64" - ;; - sparc*-*-solaris*) - LD="${LD-ld} -m elf64_sparc" - ;; - esac - # GNU ld 2.21 introduced _sol2 emulations. Use them if available. - if ${LD-ld} -V | grep _sol2 >/dev/null 2>&1; then - LD="${LD-ld}_sol2" - fi - ;; - *) - if ${LD-ld} -64 -r -o conftest2.o conftest.o >/dev/null 2>&1; then - LD="${LD-ld} -64" - fi - ;; - esac - ;; - esac - fi - rm -rf conftest* - ;; -esac - -need_locks="$enable_libtool_lock" - -if test -n "$ac_tool_prefix"; then - # Extract the first word of "${ac_tool_prefix}mt", so it can be a program name with args. -set dummy ${ac_tool_prefix}mt; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_MANIFEST_TOOL+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$MANIFEST_TOOL"; then - ac_cv_prog_MANIFEST_TOOL="$MANIFEST_TOOL" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_MANIFEST_TOOL="${ac_tool_prefix}mt" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -MANIFEST_TOOL=$ac_cv_prog_MANIFEST_TOOL -if test -n "$MANIFEST_TOOL"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MANIFEST_TOOL" >&5 -$as_echo "$MANIFEST_TOOL" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - -fi -if test -z "$ac_cv_prog_MANIFEST_TOOL"; then - ac_ct_MANIFEST_TOOL=$MANIFEST_TOOL - # Extract the first word of "mt", so it can be a program name with args. -set dummy mt; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_ac_ct_MANIFEST_TOOL+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$ac_ct_MANIFEST_TOOL"; then - ac_cv_prog_ac_ct_MANIFEST_TOOL="$ac_ct_MANIFEST_TOOL" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_ac_ct_MANIFEST_TOOL="mt" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -ac_ct_MANIFEST_TOOL=$ac_cv_prog_ac_ct_MANIFEST_TOOL -if test -n "$ac_ct_MANIFEST_TOOL"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_MANIFEST_TOOL" >&5 -$as_echo "$ac_ct_MANIFEST_TOOL" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - if test "x$ac_ct_MANIFEST_TOOL" = x; then - MANIFEST_TOOL=":" - else - case $cross_compiling:$ac_tool_warned in -yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} -ac_tool_warned=yes ;; -esac - MANIFEST_TOOL=$ac_ct_MANIFEST_TOOL - fi -else - MANIFEST_TOOL="$ac_cv_prog_MANIFEST_TOOL" -fi - -test -z "$MANIFEST_TOOL" && MANIFEST_TOOL=mt -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if $MANIFEST_TOOL is a manifest tool" >&5 -$as_echo_n "checking if $MANIFEST_TOOL is a manifest tool... " >&6; } -if ${lt_cv_path_mainfest_tool+:} false; then : - $as_echo_n "(cached) " >&6 -else - lt_cv_path_mainfest_tool=no - echo "$as_me:$LINENO: $MANIFEST_TOOL '-?'" >&5 - $MANIFEST_TOOL '-?' 2>conftest.err > conftest.out - cat conftest.err >&5 - if $GREP 'Manifest Tool' conftest.out > /dev/null; then - lt_cv_path_mainfest_tool=yes - fi - rm -f conftest* -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_path_mainfest_tool" >&5 -$as_echo "$lt_cv_path_mainfest_tool" >&6; } -if test "x$lt_cv_path_mainfest_tool" != xyes; then - MANIFEST_TOOL=: -fi - - - - - - - case $host_os in - rhapsody* | darwin*) - if test -n "$ac_tool_prefix"; then - # Extract the first word of "${ac_tool_prefix}dsymutil", so it can be a program name with args. -set dummy ${ac_tool_prefix}dsymutil; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_DSYMUTIL+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$DSYMUTIL"; then - ac_cv_prog_DSYMUTIL="$DSYMUTIL" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_DSYMUTIL="${ac_tool_prefix}dsymutil" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -DSYMUTIL=$ac_cv_prog_DSYMUTIL -if test -n "$DSYMUTIL"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DSYMUTIL" >&5 -$as_echo "$DSYMUTIL" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - -fi -if test -z "$ac_cv_prog_DSYMUTIL"; then - ac_ct_DSYMUTIL=$DSYMUTIL - # Extract the first word of "dsymutil", so it can be a program name with args. -set dummy dsymutil; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_ac_ct_DSYMUTIL+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$ac_ct_DSYMUTIL"; then - ac_cv_prog_ac_ct_DSYMUTIL="$ac_ct_DSYMUTIL" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_ac_ct_DSYMUTIL="dsymutil" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -ac_ct_DSYMUTIL=$ac_cv_prog_ac_ct_DSYMUTIL -if test -n "$ac_ct_DSYMUTIL"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DSYMUTIL" >&5 -$as_echo "$ac_ct_DSYMUTIL" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - if test "x$ac_ct_DSYMUTIL" = x; then - DSYMUTIL=":" - else - case $cross_compiling:$ac_tool_warned in -yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} -ac_tool_warned=yes ;; -esac - DSYMUTIL=$ac_ct_DSYMUTIL - fi -else - DSYMUTIL="$ac_cv_prog_DSYMUTIL" -fi - - if test -n "$ac_tool_prefix"; then - # Extract the first word of "${ac_tool_prefix}nmedit", so it can be a program name with args. -set dummy ${ac_tool_prefix}nmedit; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_NMEDIT+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$NMEDIT"; then - ac_cv_prog_NMEDIT="$NMEDIT" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_NMEDIT="${ac_tool_prefix}nmedit" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -NMEDIT=$ac_cv_prog_NMEDIT -if test -n "$NMEDIT"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $NMEDIT" >&5 -$as_echo "$NMEDIT" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - -fi -if test -z "$ac_cv_prog_NMEDIT"; then - ac_ct_NMEDIT=$NMEDIT - # Extract the first word of "nmedit", so it can be a program name with args. -set dummy nmedit; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_ac_ct_NMEDIT+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$ac_ct_NMEDIT"; then - ac_cv_prog_ac_ct_NMEDIT="$ac_ct_NMEDIT" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_ac_ct_NMEDIT="nmedit" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -ac_ct_NMEDIT=$ac_cv_prog_ac_ct_NMEDIT -if test -n "$ac_ct_NMEDIT"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_NMEDIT" >&5 -$as_echo "$ac_ct_NMEDIT" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - if test "x$ac_ct_NMEDIT" = x; then - NMEDIT=":" - else - case $cross_compiling:$ac_tool_warned in -yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} -ac_tool_warned=yes ;; -esac - NMEDIT=$ac_ct_NMEDIT - fi -else - NMEDIT="$ac_cv_prog_NMEDIT" -fi - - if test -n "$ac_tool_prefix"; then - # Extract the first word of "${ac_tool_prefix}lipo", so it can be a program name with args. -set dummy ${ac_tool_prefix}lipo; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_LIPO+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$LIPO"; then - ac_cv_prog_LIPO="$LIPO" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_LIPO="${ac_tool_prefix}lipo" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -LIPO=$ac_cv_prog_LIPO -if test -n "$LIPO"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LIPO" >&5 -$as_echo "$LIPO" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - -fi -if test -z "$ac_cv_prog_LIPO"; then - ac_ct_LIPO=$LIPO - # Extract the first word of "lipo", so it can be a program name with args. -set dummy lipo; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_ac_ct_LIPO+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$ac_ct_LIPO"; then - ac_cv_prog_ac_ct_LIPO="$ac_ct_LIPO" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_ac_ct_LIPO="lipo" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -ac_ct_LIPO=$ac_cv_prog_ac_ct_LIPO -if test -n "$ac_ct_LIPO"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_LIPO" >&5 -$as_echo "$ac_ct_LIPO" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - if test "x$ac_ct_LIPO" = x; then - LIPO=":" - else - case $cross_compiling:$ac_tool_warned in -yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} -ac_tool_warned=yes ;; -esac - LIPO=$ac_ct_LIPO - fi -else - LIPO="$ac_cv_prog_LIPO" -fi - - if test -n "$ac_tool_prefix"; then - # Extract the first word of "${ac_tool_prefix}otool", so it can be a program name with args. -set dummy ${ac_tool_prefix}otool; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_OTOOL+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$OTOOL"; then - ac_cv_prog_OTOOL="$OTOOL" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_OTOOL="${ac_tool_prefix}otool" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -OTOOL=$ac_cv_prog_OTOOL -if test -n "$OTOOL"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OTOOL" >&5 -$as_echo "$OTOOL" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - -fi -if test -z "$ac_cv_prog_OTOOL"; then - ac_ct_OTOOL=$OTOOL - # Extract the first word of "otool", so it can be a program name with args. -set dummy otool; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_ac_ct_OTOOL+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$ac_ct_OTOOL"; then - ac_cv_prog_ac_ct_OTOOL="$ac_ct_OTOOL" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_ac_ct_OTOOL="otool" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -ac_ct_OTOOL=$ac_cv_prog_ac_ct_OTOOL -if test -n "$ac_ct_OTOOL"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OTOOL" >&5 -$as_echo "$ac_ct_OTOOL" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - if test "x$ac_ct_OTOOL" = x; then - OTOOL=":" - else - case $cross_compiling:$ac_tool_warned in -yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} -ac_tool_warned=yes ;; -esac - OTOOL=$ac_ct_OTOOL - fi -else - OTOOL="$ac_cv_prog_OTOOL" -fi - - if test -n "$ac_tool_prefix"; then - # Extract the first word of "${ac_tool_prefix}otool64", so it can be a program name with args. -set dummy ${ac_tool_prefix}otool64; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_OTOOL64+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$OTOOL64"; then - ac_cv_prog_OTOOL64="$OTOOL64" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_OTOOL64="${ac_tool_prefix}otool64" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -OTOOL64=$ac_cv_prog_OTOOL64 -if test -n "$OTOOL64"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OTOOL64" >&5 -$as_echo "$OTOOL64" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - -fi -if test -z "$ac_cv_prog_OTOOL64"; then - ac_ct_OTOOL64=$OTOOL64 - # Extract the first word of "otool64", so it can be a program name with args. -set dummy otool64; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_ac_ct_OTOOL64+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$ac_ct_OTOOL64"; then - ac_cv_prog_ac_ct_OTOOL64="$ac_ct_OTOOL64" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_ac_ct_OTOOL64="otool64" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -ac_ct_OTOOL64=$ac_cv_prog_ac_ct_OTOOL64 -if test -n "$ac_ct_OTOOL64"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OTOOL64" >&5 -$as_echo "$ac_ct_OTOOL64" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - if test "x$ac_ct_OTOOL64" = x; then - OTOOL64=":" - else - case $cross_compiling:$ac_tool_warned in -yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} -ac_tool_warned=yes ;; -esac - OTOOL64=$ac_ct_OTOOL64 - fi -else - OTOOL64="$ac_cv_prog_OTOOL64" -fi - - - - - - - - - - - - - - - - - - - - - - - - - - - - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -single_module linker flag" >&5 -$as_echo_n "checking for -single_module linker flag... " >&6; } -if ${lt_cv_apple_cc_single_mod+:} false; then : - $as_echo_n "(cached) " >&6 -else - lt_cv_apple_cc_single_mod=no - if test -z "${LT_MULTI_MODULE}"; then - # By default we will add the -single_module flag. You can override - # by either setting the environment variable LT_MULTI_MODULE - # non-empty at configure time, or by adding -multi_module to the - # link flags. - rm -rf libconftest.dylib* - echo "int foo(void){return 1;}" > conftest.c - echo "$LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \ --dynamiclib -Wl,-single_module conftest.c" >&5 - $LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \ - -dynamiclib -Wl,-single_module conftest.c 2>conftest.err - _lt_result=$? - # If there is a non-empty error log, and "single_module" - # appears in it, assume the flag caused a linker warning - if test -s conftest.err && $GREP single_module conftest.err; then - cat conftest.err >&5 - # Otherwise, if the output was created with a 0 exit code from - # the compiler, it worked. - elif test -f libconftest.dylib && test $_lt_result -eq 0; then - lt_cv_apple_cc_single_mod=yes - else - cat conftest.err >&5 - fi - rm -rf libconftest.dylib* - rm -f conftest.* - fi -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_apple_cc_single_mod" >&5 -$as_echo "$lt_cv_apple_cc_single_mod" >&6; } - - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -exported_symbols_list linker flag" >&5 -$as_echo_n "checking for -exported_symbols_list linker flag... " >&6; } -if ${lt_cv_ld_exported_symbols_list+:} false; then : - $as_echo_n "(cached) " >&6 -else - lt_cv_ld_exported_symbols_list=no - save_LDFLAGS=$LDFLAGS - echo "_main" > conftest.sym - LDFLAGS="$LDFLAGS -Wl,-exported_symbols_list,conftest.sym" - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -int -main () -{ - - ; - return 0; -} -_ACEOF -if ac_fn_c_try_link "$LINENO"; then : - lt_cv_ld_exported_symbols_list=yes -else - lt_cv_ld_exported_symbols_list=no -fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext - LDFLAGS="$save_LDFLAGS" - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_exported_symbols_list" >&5 -$as_echo "$lt_cv_ld_exported_symbols_list" >&6; } - - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -force_load linker flag" >&5 -$as_echo_n "checking for -force_load linker flag... " >&6; } -if ${lt_cv_ld_force_load+:} false; then : - $as_echo_n "(cached) " >&6 -else - lt_cv_ld_force_load=no - cat > conftest.c << _LT_EOF -int forced_loaded() { return 2;} -_LT_EOF - echo "$LTCC $LTCFLAGS -c -o conftest.o conftest.c" >&5 - $LTCC $LTCFLAGS -c -o conftest.o conftest.c 2>&5 - echo "$AR cru libconftest.a conftest.o" >&5 - $AR cru libconftest.a conftest.o 2>&5 - echo "$RANLIB libconftest.a" >&5 - $RANLIB libconftest.a 2>&5 - cat > conftest.c << _LT_EOF -int main() { return 0;} -_LT_EOF - echo "$LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a" >&5 - $LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a 2>conftest.err - _lt_result=$? - if test -s conftest.err && $GREP force_load conftest.err; then - cat conftest.err >&5 - elif test -f conftest && test $_lt_result -eq 0 && $GREP forced_load conftest >/dev/null 2>&1 ; then - lt_cv_ld_force_load=yes - else - cat conftest.err >&5 - fi - rm -f conftest.err libconftest.a conftest conftest.c - rm -rf conftest.dSYM - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_force_load" >&5 -$as_echo "$lt_cv_ld_force_load" >&6; } - case $host_os in - rhapsody* | darwin1.[012]) - _lt_dar_allow_undefined='${wl}-undefined ${wl}suppress' ;; - darwin1.*) - _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;; - darwin*) # darwin 5.x on - # if running on 10.5 or later, the deployment target defaults - # to the OS version, if on x86, and 10.4, the deployment - # target defaults to 10.4. Don't you love it? - case ${MACOSX_DEPLOYMENT_TARGET-10.0},$host in - 10.0,*86*-darwin8*|10.0,*-darwin[91]*) - _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;; - 10.[012]*) - _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;; - 10.*) - _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;; - esac - ;; - esac - if test "$lt_cv_apple_cc_single_mod" = "yes"; then - _lt_dar_single_mod='$single_module' - fi - if test "$lt_cv_ld_exported_symbols_list" = "yes"; then - _lt_dar_export_syms=' ${wl}-exported_symbols_list,$output_objdir/${libname}-symbols.expsym' - else - _lt_dar_export_syms='~$NMEDIT -s $output_objdir/${libname}-symbols.expsym ${lib}' - fi - if test "$DSYMUTIL" != ":" && test "$lt_cv_ld_force_load" = "no"; then - _lt_dsymutil='~$DSYMUTIL $lib || :' - else - _lt_dsymutil= - fi - ;; - esac - -ac_ext=c -ac_cpp='$CPP $CPPFLAGS' -ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_c_compiler_gnu -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C preprocessor" >&5 -$as_echo_n "checking how to run the C preprocessor... " >&6; } -# On Suns, sometimes $CPP names a directory. -if test -n "$CPP" && test -d "$CPP"; then - CPP= -fi -if test -z "$CPP"; then - if ${ac_cv_prog_CPP+:} false; then : - $as_echo_n "(cached) " >&6 -else - # Double quotes because CPP needs to be expanded - for CPP in "$CC -E" "$CC -E -traditional-cpp" "/lib/cpp" - do - ac_preproc_ok=false -for ac_c_preproc_warn_flag in '' yes -do - # Use a header file that comes with gcc, so configuring glibc - # with a fresh cross-compiler works. - # Prefer to if __STDC__ is defined, since - # exists even on freestanding compilers. - # On the NeXT, cc -E runs the code through the compiler's parser, - # not just through cpp. "Syntax error" is here to catch this case. - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -@%:@ifdef __STDC__ -@%:@ include -@%:@else -@%:@ include -@%:@endif - Syntax error -_ACEOF -if ac_fn_c_try_cpp "$LINENO"; then : - -else - # Broken: fails on valid input. -continue -fi -rm -f conftest.err conftest.i conftest.$ac_ext - - # OK, works on sane cases. Now check whether nonexistent headers - # can be detected and how. - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -@%:@include -_ACEOF -if ac_fn_c_try_cpp "$LINENO"; then : - # Broken: success on invalid input. -continue -else - # Passes both tests. -ac_preproc_ok=: -break -fi -rm -f conftest.err conftest.i conftest.$ac_ext - -done -# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. -rm -f conftest.i conftest.err conftest.$ac_ext -if $ac_preproc_ok; then : - break -fi - - done - ac_cv_prog_CPP=$CPP - -fi - CPP=$ac_cv_prog_CPP -else - ac_cv_prog_CPP=$CPP -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $CPP" >&5 -$as_echo "$CPP" >&6; } -ac_preproc_ok=false -for ac_c_preproc_warn_flag in '' yes -do - # Use a header file that comes with gcc, so configuring glibc - # with a fresh cross-compiler works. - # Prefer to if __STDC__ is defined, since - # exists even on freestanding compilers. - # On the NeXT, cc -E runs the code through the compiler's parser, - # not just through cpp. "Syntax error" is here to catch this case. - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -@%:@ifdef __STDC__ -@%:@ include -@%:@else -@%:@ include -@%:@endif - Syntax error -_ACEOF -if ac_fn_c_try_cpp "$LINENO"; then : - -else - # Broken: fails on valid input. -continue -fi -rm -f conftest.err conftest.i conftest.$ac_ext - - # OK, works on sane cases. Now check whether nonexistent headers - # can be detected and how. - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -@%:@include -_ACEOF -if ac_fn_c_try_cpp "$LINENO"; then : - # Broken: success on invalid input. -continue -else - # Passes both tests. -ac_preproc_ok=: -break -fi -rm -f conftest.err conftest.i conftest.$ac_ext - -done -# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. -rm -f conftest.i conftest.err conftest.$ac_ext -if $ac_preproc_ok; then : - -else - { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 -$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} -as_fn_error $? "C preprocessor \"$CPP\" fails sanity check -See \`config.log' for more details" "$LINENO" 5; } -fi - -ac_ext=c -ac_cpp='$CPP $CPPFLAGS' -ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_c_compiler_gnu - - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header files" >&5 -$as_echo_n "checking for ANSI C header files... " >&6; } -if ${ac_cv_header_stdc+:} false; then : - $as_echo_n "(cached) " >&6 -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include -#include -#include -#include - -int -main () -{ - - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - ac_cv_header_stdc=yes -else - ac_cv_header_stdc=no -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext - -if test $ac_cv_header_stdc = yes; then - # SunOS 4.x string.h does not declare mem*, contrary to ANSI. - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include - -_ACEOF -if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | - $EGREP "memchr" >/dev/null 2>&1; then : - -else - ac_cv_header_stdc=no -fi -rm -f conftest* - -fi - -if test $ac_cv_header_stdc = yes; then - # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include - -_ACEOF -if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | - $EGREP "free" >/dev/null 2>&1; then : - -else - ac_cv_header_stdc=no -fi -rm -f conftest* - -fi - -if test $ac_cv_header_stdc = yes; then - # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi. - if test "$cross_compiling" = yes; then : - : -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include -#include -#if ((' ' & 0x0FF) == 0x020) -# define ISLOWER(c) ('a' <= (c) && (c) <= 'z') -# define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c)) -#else -# define ISLOWER(c) \ - (('a' <= (c) && (c) <= 'i') \ - || ('j' <= (c) && (c) <= 'r') \ - || ('s' <= (c) && (c) <= 'z')) -# define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c)) -#endif - -#define XOR(e, f) (((e) && !(f)) || (!(e) && (f))) -int -main () -{ - int i; - for (i = 0; i < 256; i++) - if (XOR (islower (i), ISLOWER (i)) - || toupper (i) != TOUPPER (i)) - return 2; - return 0; -} -_ACEOF -if ac_fn_c_try_run "$LINENO"; then : - -else - ac_cv_header_stdc=no -fi -rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ - conftest.$ac_objext conftest.beam conftest.$ac_ext -fi - -fi -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdc" >&5 -$as_echo "$ac_cv_header_stdc" >&6; } -if test $ac_cv_header_stdc = yes; then - -$as_echo "@%:@define STDC_HEADERS 1" >>confdefs.h - -fi - -# On IRIX 5.3, sys/types and inttypes.h are conflicting. -for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \ - inttypes.h stdint.h unistd.h -do : - as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` -ac_fn_c_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default -" -if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : - cat >>confdefs.h <<_ACEOF -@%:@define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 -_ACEOF - -fi - -done - - -for ac_header in dlfcn.h -do : - ac_fn_c_check_header_compile "$LINENO" "dlfcn.h" "ac_cv_header_dlfcn_h" "$ac_includes_default -" -if test "x$ac_cv_header_dlfcn_h" = xyes; then : - cat >>confdefs.h <<_ACEOF -@%:@define HAVE_DLFCN_H 1 -_ACEOF - -fi - -done - - - - -func_stripname_cnf () -{ - case ${2} in - .*) func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%\\\\${2}\$%%"`;; - *) func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%${2}\$%%"`;; - esac -} # func_stripname_cnf - - - - - -# Set options - - - - enable_dlopen=no - - - enable_win32_dll=no - - - @%:@ Check whether --enable-shared was given. -if test "${enable_shared+set}" = set; then : - enableval=$enable_shared; p=${PACKAGE-default} - case $enableval in - yes) enable_shared=yes ;; - no) enable_shared=no ;; - *) - enable_shared=no - # Look at the argument we got. We use all the common list separators. - lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," - for pkg in $enableval; do - IFS="$lt_save_ifs" - if test "X$pkg" = "X$p"; then - enable_shared=yes - fi - done - IFS="$lt_save_ifs" - ;; - esac -else - enable_shared=yes -fi - - - - - - - - - - @%:@ Check whether --enable-static was given. -if test "${enable_static+set}" = set; then : - enableval=$enable_static; p=${PACKAGE-default} - case $enableval in - yes) enable_static=yes ;; - no) enable_static=no ;; - *) - enable_static=no - # Look at the argument we got. We use all the common list separators. - lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," - for pkg in $enableval; do - IFS="$lt_save_ifs" - if test "X$pkg" = "X$p"; then - enable_static=yes - fi - done - IFS="$lt_save_ifs" - ;; - esac -else - enable_static=yes -fi - - - - - - - - - - -@%:@ Check whether --with-pic was given. -if test "${with_pic+set}" = set; then : - withval=$with_pic; lt_p=${PACKAGE-default} - case $withval in - yes|no) pic_mode=$withval ;; - *) - pic_mode=default - # Look at the argument we got. We use all the common list separators. - lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," - for lt_pkg in $withval; do - IFS="$lt_save_ifs" - if test "X$lt_pkg" = "X$lt_p"; then - pic_mode=yes - fi - done - IFS="$lt_save_ifs" - ;; - esac -else - pic_mode=default -fi - - -test -z "$pic_mode" && pic_mode=default - - - - - - - - @%:@ Check whether --enable-fast-install was given. -if test "${enable_fast_install+set}" = set; then : - enableval=$enable_fast_install; p=${PACKAGE-default} - case $enableval in - yes) enable_fast_install=yes ;; - no) enable_fast_install=no ;; - *) - enable_fast_install=no - # Look at the argument we got. We use all the common list separators. - lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," - for pkg in $enableval; do - IFS="$lt_save_ifs" - if test "X$pkg" = "X$p"; then - enable_fast_install=yes - fi - done - IFS="$lt_save_ifs" - ;; - esac -else - enable_fast_install=yes -fi - - - - - - - - - - - -# This can be used to rebuild libtool when needed -LIBTOOL_DEPS="$ltmain" - -# Always use our own libtool. -LIBTOOL='$(SHELL) $(top_builddir)/libtool' - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -test -z "$LN_S" && LN_S="ln -s" - - - - - - - - - - - - - - -if test -n "${ZSH_VERSION+set}" ; then - setopt NO_GLOB_SUBST -fi - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for objdir" >&5 -$as_echo_n "checking for objdir... " >&6; } -if ${lt_cv_objdir+:} false; then : - $as_echo_n "(cached) " >&6 -else - rm -f .libs 2>/dev/null -mkdir .libs 2>/dev/null -if test -d .libs; then - lt_cv_objdir=.libs -else - # MS-DOS does not allow filenames that begin with a dot. - lt_cv_objdir=_libs -fi -rmdir .libs 2>/dev/null -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_objdir" >&5 -$as_echo "$lt_cv_objdir" >&6; } -objdir=$lt_cv_objdir - - - - - -cat >>confdefs.h <<_ACEOF -@%:@define LT_OBJDIR "$lt_cv_objdir/" -_ACEOF - - - - -case $host_os in -aix3*) - # AIX sometimes has problems with the GCC collect2 program. For some - # reason, if we set the COLLECT_NAMES environment variable, the problems - # vanish in a puff of smoke. - if test "X${COLLECT_NAMES+set}" != Xset; then - COLLECT_NAMES= - export COLLECT_NAMES - fi - ;; -esac - -# Global variables: -ofile=libtool -can_build_shared=yes - -# All known linkers require a `.a' archive for static linking (except MSVC, -# which needs '.lib'). -libext=a - -with_gnu_ld="$lt_cv_prog_gnu_ld" - -old_CC="$CC" -old_CFLAGS="$CFLAGS" - -# Set sane defaults for various variables -test -z "$CC" && CC=cc -test -z "$LTCC" && LTCC=$CC -test -z "$LTCFLAGS" && LTCFLAGS=$CFLAGS -test -z "$LD" && LD=ld -test -z "$ac_objext" && ac_objext=o - -for cc_temp in $compiler""; do - case $cc_temp in - compile | *[\\/]compile | ccache | *[\\/]ccache ) ;; - distcc | *[\\/]distcc | purify | *[\\/]purify ) ;; - \-*) ;; - *) break;; - esac -done -cc_basename=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"` - - -# Only perform the check for file, if the check method requires it -test -z "$MAGIC_CMD" && MAGIC_CMD=file -case $deplibs_check_method in -file_magic*) - if test "$file_magic_cmd" = '$MAGIC_CMD'; then - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ${ac_tool_prefix}file" >&5 -$as_echo_n "checking for ${ac_tool_prefix}file... " >&6; } -if ${lt_cv_path_MAGIC_CMD+:} false; then : - $as_echo_n "(cached) " >&6 -else - case $MAGIC_CMD in -[\\/*] | ?:[\\/]*) - lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path. - ;; -*) - lt_save_MAGIC_CMD="$MAGIC_CMD" - lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR - ac_dummy="/usr/bin$PATH_SEPARATOR$PATH" - for ac_dir in $ac_dummy; do - IFS="$lt_save_ifs" - test -z "$ac_dir" && ac_dir=. - if test -f $ac_dir/${ac_tool_prefix}file; then - lt_cv_path_MAGIC_CMD="$ac_dir/${ac_tool_prefix}file" - if test -n "$file_magic_test_file"; then - case $deplibs_check_method in - "file_magic "*) - file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"` - MAGIC_CMD="$lt_cv_path_MAGIC_CMD" - if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null | - $EGREP "$file_magic_regex" > /dev/null; then - : - else - cat <<_LT_EOF 1>&2 - -*** Warning: the command libtool uses to detect shared libraries, -*** $file_magic_cmd, produces output that libtool cannot recognize. -*** The result is that libtool may fail to recognize shared libraries -*** as such. This will affect the creation of libtool libraries that -*** depend on shared libraries, but programs linked with such libtool -*** libraries will work regardless of this problem. Nevertheless, you -*** may want to report the problem to your system manager and/or to -*** bug-libtool@gnu.org - -_LT_EOF - fi ;; - esac - fi - break - fi - done - IFS="$lt_save_ifs" - MAGIC_CMD="$lt_save_MAGIC_CMD" - ;; -esac -fi - -MAGIC_CMD="$lt_cv_path_MAGIC_CMD" -if test -n "$MAGIC_CMD"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MAGIC_CMD" >&5 -$as_echo "$MAGIC_CMD" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - - - - -if test -z "$lt_cv_path_MAGIC_CMD"; then - if test -n "$ac_tool_prefix"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for file" >&5 -$as_echo_n "checking for file... " >&6; } -if ${lt_cv_path_MAGIC_CMD+:} false; then : - $as_echo_n "(cached) " >&6 -else - case $MAGIC_CMD in -[\\/*] | ?:[\\/]*) - lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path. - ;; -*) - lt_save_MAGIC_CMD="$MAGIC_CMD" - lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR - ac_dummy="/usr/bin$PATH_SEPARATOR$PATH" - for ac_dir in $ac_dummy; do - IFS="$lt_save_ifs" - test -z "$ac_dir" && ac_dir=. - if test -f $ac_dir/file; then - lt_cv_path_MAGIC_CMD="$ac_dir/file" - if test -n "$file_magic_test_file"; then - case $deplibs_check_method in - "file_magic "*) - file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"` - MAGIC_CMD="$lt_cv_path_MAGIC_CMD" - if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null | - $EGREP "$file_magic_regex" > /dev/null; then - : - else - cat <<_LT_EOF 1>&2 - -*** Warning: the command libtool uses to detect shared libraries, -*** $file_magic_cmd, produces output that libtool cannot recognize. -*** The result is that libtool may fail to recognize shared libraries -*** as such. This will affect the creation of libtool libraries that -*** depend on shared libraries, but programs linked with such libtool -*** libraries will work regardless of this problem. Nevertheless, you -*** may want to report the problem to your system manager and/or to -*** bug-libtool@gnu.org - -_LT_EOF - fi ;; - esac - fi - break - fi - done - IFS="$lt_save_ifs" - MAGIC_CMD="$lt_save_MAGIC_CMD" - ;; -esac -fi - -MAGIC_CMD="$lt_cv_path_MAGIC_CMD" -if test -n "$MAGIC_CMD"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MAGIC_CMD" >&5 -$as_echo "$MAGIC_CMD" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - - else - MAGIC_CMD=: - fi -fi - - fi - ;; -esac - -# Use C for the default configuration in the libtool script - -lt_save_CC="$CC" -ac_ext=c -ac_cpp='$CPP $CPPFLAGS' -ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_c_compiler_gnu - - -# Source file extension for C test sources. -ac_ext=c - -# Object file extension for compiled C test sources. -objext=o -objext=$objext - -# Code to be used in simple compile tests -lt_simple_compile_test_code="int some_variable = 0;" - -# Code to be used in simple link tests -lt_simple_link_test_code='int main(){return(0);}' - - - - - - - -# If no C compiler was specified, use CC. -LTCC=${LTCC-"$CC"} - -# If no C compiler flags were specified, use CFLAGS. -LTCFLAGS=${LTCFLAGS-"$CFLAGS"} - -# Allow CC to be a program name with arguments. -compiler=$CC - -# Save the default compiler, since it gets overwritten when the other -# tags are being tested, and _LT_TAGVAR(compiler, []) is a NOP. -compiler_DEFAULT=$CC - -# save warnings/boilerplate of simple test code -ac_outfile=conftest.$ac_objext -echo "$lt_simple_compile_test_code" >conftest.$ac_ext -eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err -_lt_compiler_boilerplate=`cat conftest.err` -$RM conftest* - -ac_outfile=conftest.$ac_objext -echo "$lt_simple_link_test_code" >conftest.$ac_ext -eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err -_lt_linker_boilerplate=`cat conftest.err` -$RM -r conftest* - - -## CAVEAT EMPTOR: -## There is no encapsulation within the following macros, do not change -## the running order or otherwise move them around unless you know exactly -## what you are doing... -if test -n "$compiler"; then - -lt_prog_compiler_no_builtin_flag= - -if test "$GCC" = yes; then - case $cc_basename in - nvcc*) - lt_prog_compiler_no_builtin_flag=' -Xcompiler -fno-builtin' ;; - *) - lt_prog_compiler_no_builtin_flag=' -fno-builtin' ;; - esac - - { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -fno-rtti -fno-exceptions" >&5 -$as_echo_n "checking if $compiler supports -fno-rtti -fno-exceptions... " >&6; } -if ${lt_cv_prog_compiler_rtti_exceptions+:} false; then : - $as_echo_n "(cached) " >&6 -else - lt_cv_prog_compiler_rtti_exceptions=no - ac_outfile=conftest.$ac_objext - echo "$lt_simple_compile_test_code" > conftest.$ac_ext - lt_compiler_flag="-fno-rtti -fno-exceptions" - # Insert the option either (1) after the last *FLAGS variable, or - # (2) before a word containing "conftest.", or (3) at the end. - # Note that $ac_compile itself does not contain backslashes and begins - # with a dollar sign (not a hyphen), so the echo should work correctly. - # The option is referenced via a variable to avoid confusing sed. - lt_compile=`echo "$ac_compile" | $SED \ - -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ - -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ - -e 's:$: $lt_compiler_flag:'` - (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) - (eval "$lt_compile" 2>conftest.err) - ac_status=$? - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - if (exit $ac_status) && test -s "$ac_outfile"; then - # The compiler can only warn and ignore the option if not recognized - # So say no if there are warnings other than the usual output. - $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp - $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 - if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then - lt_cv_prog_compiler_rtti_exceptions=yes - fi - fi - $RM conftest* - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_rtti_exceptions" >&5 -$as_echo "$lt_cv_prog_compiler_rtti_exceptions" >&6; } - -if test x"$lt_cv_prog_compiler_rtti_exceptions" = xyes; then - lt_prog_compiler_no_builtin_flag="$lt_prog_compiler_no_builtin_flag -fno-rtti -fno-exceptions" -else - : -fi - -fi - - - - - - - lt_prog_compiler_wl= -lt_prog_compiler_pic= -lt_prog_compiler_static= - - - if test "$GCC" = yes; then - lt_prog_compiler_wl='-Wl,' - lt_prog_compiler_static='-static' - - case $host_os in - aix*) - # All AIX code is PIC. - if test "$host_cpu" = ia64; then - # AIX 5 now supports IA64 processor - lt_prog_compiler_static='-Bstatic' - fi - ;; - - amigaos*) - case $host_cpu in - powerpc) - # see comment about AmigaOS4 .so support - lt_prog_compiler_pic='-fPIC' - ;; - m68k) - # FIXME: we need at least 68020 code to build shared libraries, but - # adding the `-m68020' flag to GCC prevents building anything better, - # like `-m68040'. - lt_prog_compiler_pic='-m68020 -resident32 -malways-restore-a4' - ;; - esac - ;; - - beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) - # PIC is the default for these OSes. - ;; - - mingw* | cygwin* | pw32* | os2* | cegcc*) - # This hack is so that the source file can tell whether it is being - # built for inclusion in a dll (and should export symbols for example). - # Although the cygwin gcc ignores -fPIC, still need this for old-style - # (--disable-auto-import) libraries - lt_prog_compiler_pic='-DDLL_EXPORT' - ;; - - darwin* | rhapsody*) - # PIC is the default on this platform - # Common symbols not allowed in MH_DYLIB files - lt_prog_compiler_pic='-fno-common' - ;; - - haiku*) - # PIC is the default for Haiku. - # The "-static" flag exists, but is broken. - lt_prog_compiler_static= - ;; - - hpux*) - # PIC is the default for 64-bit PA HP-UX, but not for 32-bit - # PA HP-UX. On IA64 HP-UX, PIC is the default but the pic flag - # sets the default TLS model and affects inlining. - case $host_cpu in - hppa*64*) - # +Z the default - ;; - *) - lt_prog_compiler_pic='-fPIC' - ;; - esac - ;; - - interix[3-9]*) - # Interix 3.x gcc -fpic/-fPIC options generate broken code. - # Instead, we relocate shared libraries at runtime. - ;; - - msdosdjgpp*) - # Just because we use GCC doesn't mean we suddenly get shared libraries - # on systems that don't support them. - lt_prog_compiler_can_build_shared=no - enable_shared=no - ;; - - *nto* | *qnx*) - # QNX uses GNU C++, but need to define -shared option too, otherwise - # it will coredump. - lt_prog_compiler_pic='-fPIC -shared' - ;; - - sysv4*MP*) - if test -d /usr/nec; then - lt_prog_compiler_pic=-Kconform_pic - fi - ;; - - *) - lt_prog_compiler_pic='-fPIC' - ;; - esac - - case $cc_basename in - nvcc*) # Cuda Compiler Driver 2.2 - lt_prog_compiler_wl='-Xlinker ' - if test -n "$lt_prog_compiler_pic"; then - lt_prog_compiler_pic="-Xcompiler $lt_prog_compiler_pic" - fi - ;; - esac - else - # PORTME Check for flag to pass linker flags through the system compiler. - case $host_os in - aix*) - lt_prog_compiler_wl='-Wl,' - if test "$host_cpu" = ia64; then - # AIX 5 now supports IA64 processor - lt_prog_compiler_static='-Bstatic' - else - lt_prog_compiler_static='-bnso -bI:/lib/syscalls.exp' - fi - ;; - - mingw* | cygwin* | pw32* | os2* | cegcc*) - # This hack is so that the source file can tell whether it is being - # built for inclusion in a dll (and should export symbols for example). - lt_prog_compiler_pic='-DDLL_EXPORT' - ;; - - hpux9* | hpux10* | hpux11*) - lt_prog_compiler_wl='-Wl,' - # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but - # not for PA HP-UX. - case $host_cpu in - hppa*64*|ia64*) - # +Z the default - ;; - *) - lt_prog_compiler_pic='+Z' - ;; - esac - # Is there a better lt_prog_compiler_static that works with the bundled CC? - lt_prog_compiler_static='${wl}-a ${wl}archive' - ;; - - irix5* | irix6* | nonstopux*) - lt_prog_compiler_wl='-Wl,' - # PIC (with -KPIC) is the default. - lt_prog_compiler_static='-non_shared' - ;; - - linux* | k*bsd*-gnu | kopensolaris*-gnu) - case $cc_basename in - # old Intel for x86_64 which still supported -KPIC. - ecc*) - lt_prog_compiler_wl='-Wl,' - lt_prog_compiler_pic='-KPIC' - lt_prog_compiler_static='-static' - ;; - # icc used to be incompatible with GCC. - # ICC 10 doesn't accept -KPIC any more. - icc* | ifort*) - lt_prog_compiler_wl='-Wl,' - lt_prog_compiler_pic='-fPIC' - lt_prog_compiler_static='-static' - ;; - # Lahey Fortran 8.1. - lf95*) - lt_prog_compiler_wl='-Wl,' - lt_prog_compiler_pic='--shared' - lt_prog_compiler_static='--static' - ;; - nagfor*) - # NAG Fortran compiler - lt_prog_compiler_wl='-Wl,-Wl,,' - lt_prog_compiler_pic='-PIC' - lt_prog_compiler_static='-Bstatic' - ;; - pgcc* | pgf77* | pgf90* | pgf95* | pgfortran*) - # Portland Group compilers (*not* the Pentium gcc compiler, - # which looks to be a dead project) - lt_prog_compiler_wl='-Wl,' - lt_prog_compiler_pic='-fpic' - lt_prog_compiler_static='-Bstatic' - ;; - ccc*) - lt_prog_compiler_wl='-Wl,' - # All Alpha code is PIC. - lt_prog_compiler_static='-non_shared' - ;; - xl* | bgxl* | bgf* | mpixl*) - # IBM XL C 8.0/Fortran 10.1, 11.1 on PPC and BlueGene - lt_prog_compiler_wl='-Wl,' - lt_prog_compiler_pic='-qpic' - lt_prog_compiler_static='-qstaticlink' - ;; - *) - case `$CC -V 2>&1 | sed 5q` in - *Sun\ Ceres\ Fortran* | *Sun*Fortran*\ [1-7].* | *Sun*Fortran*\ 8.[0-3]*) - # Sun Fortran 8.3 passes all unrecognized flags to the linker - lt_prog_compiler_pic='-KPIC' - lt_prog_compiler_static='-Bstatic' - lt_prog_compiler_wl='' - ;; - *Sun\ F* | *Sun*Fortran*) - lt_prog_compiler_pic='-KPIC' - lt_prog_compiler_static='-Bstatic' - lt_prog_compiler_wl='-Qoption ld ' - ;; - *Sun\ C*) - # Sun C 5.9 - lt_prog_compiler_pic='-KPIC' - lt_prog_compiler_static='-Bstatic' - lt_prog_compiler_wl='-Wl,' - ;; - *Intel*\ [CF]*Compiler*) - lt_prog_compiler_wl='-Wl,' - lt_prog_compiler_pic='-fPIC' - lt_prog_compiler_static='-static' - ;; - *Portland\ Group*) - lt_prog_compiler_wl='-Wl,' - lt_prog_compiler_pic='-fpic' - lt_prog_compiler_static='-Bstatic' - ;; - esac - ;; - esac - ;; - - newsos6) - lt_prog_compiler_pic='-KPIC' - lt_prog_compiler_static='-Bstatic' - ;; - - *nto* | *qnx*) - # QNX uses GNU C++, but need to define -shared option too, otherwise - # it will coredump. - lt_prog_compiler_pic='-fPIC -shared' - ;; - - osf3* | osf4* | osf5*) - lt_prog_compiler_wl='-Wl,' - # All OSF/1 code is PIC. - lt_prog_compiler_static='-non_shared' - ;; - - rdos*) - lt_prog_compiler_static='-non_shared' - ;; - - solaris*) - lt_prog_compiler_pic='-KPIC' - lt_prog_compiler_static='-Bstatic' - case $cc_basename in - f77* | f90* | f95* | sunf77* | sunf90* | sunf95*) - lt_prog_compiler_wl='-Qoption ld ';; - *) - lt_prog_compiler_wl='-Wl,';; - esac - ;; - - sunos4*) - lt_prog_compiler_wl='-Qoption ld ' - lt_prog_compiler_pic='-PIC' - lt_prog_compiler_static='-Bstatic' - ;; - - sysv4 | sysv4.2uw2* | sysv4.3*) - lt_prog_compiler_wl='-Wl,' - lt_prog_compiler_pic='-KPIC' - lt_prog_compiler_static='-Bstatic' - ;; - - sysv4*MP*) - if test -d /usr/nec ;then - lt_prog_compiler_pic='-Kconform_pic' - lt_prog_compiler_static='-Bstatic' - fi - ;; - - sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) - lt_prog_compiler_wl='-Wl,' - lt_prog_compiler_pic='-KPIC' - lt_prog_compiler_static='-Bstatic' - ;; - - unicos*) - lt_prog_compiler_wl='-Wl,' - lt_prog_compiler_can_build_shared=no - ;; - - uts4*) - lt_prog_compiler_pic='-pic' - lt_prog_compiler_static='-Bstatic' - ;; - - *) - lt_prog_compiler_can_build_shared=no - ;; - esac - fi - -case $host_os in - # For platforms which do not support PIC, -DPIC is meaningless: - *djgpp*) - lt_prog_compiler_pic= - ;; - *) - lt_prog_compiler_pic="$lt_prog_compiler_pic@&t@ -DPIC" - ;; -esac - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $compiler option to produce PIC" >&5 -$as_echo_n "checking for $compiler option to produce PIC... " >&6; } -if ${lt_cv_prog_compiler_pic+:} false; then : - $as_echo_n "(cached) " >&6 -else - lt_cv_prog_compiler_pic=$lt_prog_compiler_pic -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic" >&5 -$as_echo "$lt_cv_prog_compiler_pic" >&6; } -lt_prog_compiler_pic=$lt_cv_prog_compiler_pic - -# -# Check to make sure the PIC flag actually works. -# -if test -n "$lt_prog_compiler_pic"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler PIC flag $lt_prog_compiler_pic works" >&5 -$as_echo_n "checking if $compiler PIC flag $lt_prog_compiler_pic works... " >&6; } -if ${lt_cv_prog_compiler_pic_works+:} false; then : - $as_echo_n "(cached) " >&6 -else - lt_cv_prog_compiler_pic_works=no - ac_outfile=conftest.$ac_objext - echo "$lt_simple_compile_test_code" > conftest.$ac_ext - lt_compiler_flag="$lt_prog_compiler_pic@&t@ -DPIC" - # Insert the option either (1) after the last *FLAGS variable, or - # (2) before a word containing "conftest.", or (3) at the end. - # Note that $ac_compile itself does not contain backslashes and begins - # with a dollar sign (not a hyphen), so the echo should work correctly. - # The option is referenced via a variable to avoid confusing sed. - lt_compile=`echo "$ac_compile" | $SED \ - -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ - -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ - -e 's:$: $lt_compiler_flag:'` - (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) - (eval "$lt_compile" 2>conftest.err) - ac_status=$? - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - if (exit $ac_status) && test -s "$ac_outfile"; then - # The compiler can only warn and ignore the option if not recognized - # So say no if there are warnings other than the usual output. - $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp - $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 - if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then - lt_cv_prog_compiler_pic_works=yes - fi - fi - $RM conftest* - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic_works" >&5 -$as_echo "$lt_cv_prog_compiler_pic_works" >&6; } - -if test x"$lt_cv_prog_compiler_pic_works" = xyes; then - case $lt_prog_compiler_pic in - "" | " "*) ;; - *) lt_prog_compiler_pic=" $lt_prog_compiler_pic" ;; - esac -else - lt_prog_compiler_pic= - lt_prog_compiler_can_build_shared=no -fi - -fi - - - - - - - - - - - -# -# Check to make sure the static flag actually works. -# -wl=$lt_prog_compiler_wl eval lt_tmp_static_flag=\"$lt_prog_compiler_static\" -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler static flag $lt_tmp_static_flag works" >&5 -$as_echo_n "checking if $compiler static flag $lt_tmp_static_flag works... " >&6; } -if ${lt_cv_prog_compiler_static_works+:} false; then : - $as_echo_n "(cached) " >&6 -else - lt_cv_prog_compiler_static_works=no - save_LDFLAGS="$LDFLAGS" - LDFLAGS="$LDFLAGS $lt_tmp_static_flag" - echo "$lt_simple_link_test_code" > conftest.$ac_ext - if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then - # The linker can only warn and ignore the option if not recognized - # So say no if there are warnings - if test -s conftest.err; then - # Append any errors to the config.log. - cat conftest.err 1>&5 - $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp - $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 - if diff conftest.exp conftest.er2 >/dev/null; then - lt_cv_prog_compiler_static_works=yes - fi - else - lt_cv_prog_compiler_static_works=yes - fi - fi - $RM -r conftest* - LDFLAGS="$save_LDFLAGS" - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_static_works" >&5 -$as_echo "$lt_cv_prog_compiler_static_works" >&6; } - -if test x"$lt_cv_prog_compiler_static_works" = xyes; then - : -else - lt_prog_compiler_static= -fi - - - - - - - - { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5 -$as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; } -if ${lt_cv_prog_compiler_c_o+:} false; then : - $as_echo_n "(cached) " >&6 -else - lt_cv_prog_compiler_c_o=no - $RM -r conftest 2>/dev/null - mkdir conftest - cd conftest - mkdir out - echo "$lt_simple_compile_test_code" > conftest.$ac_ext - - lt_compiler_flag="-o out/conftest2.$ac_objext" - # Insert the option either (1) after the last *FLAGS variable, or - # (2) before a word containing "conftest.", or (3) at the end. - # Note that $ac_compile itself does not contain backslashes and begins - # with a dollar sign (not a hyphen), so the echo should work correctly. - lt_compile=`echo "$ac_compile" | $SED \ - -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ - -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ - -e 's:$: $lt_compiler_flag:'` - (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) - (eval "$lt_compile" 2>out/conftest.err) - ac_status=$? - cat out/conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - if (exit $ac_status) && test -s out/conftest2.$ac_objext - then - # The compiler can only warn and ignore the option if not recognized - # So say no if there are warnings - $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp - $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 - if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then - lt_cv_prog_compiler_c_o=yes - fi - fi - chmod u+w . 2>&5 - $RM conftest* - # SGI C++ compiler will create directory out/ii_files/ for - # template instantiation - test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files - $RM out/* && rmdir out - cd .. - $RM -r conftest - $RM conftest* - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o" >&5 -$as_echo "$lt_cv_prog_compiler_c_o" >&6; } - - - - - - - { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5 -$as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; } -if ${lt_cv_prog_compiler_c_o+:} false; then : - $as_echo_n "(cached) " >&6 -else - lt_cv_prog_compiler_c_o=no - $RM -r conftest 2>/dev/null - mkdir conftest - cd conftest - mkdir out - echo "$lt_simple_compile_test_code" > conftest.$ac_ext - - lt_compiler_flag="-o out/conftest2.$ac_objext" - # Insert the option either (1) after the last *FLAGS variable, or - # (2) before a word containing "conftest.", or (3) at the end. - # Note that $ac_compile itself does not contain backslashes and begins - # with a dollar sign (not a hyphen), so the echo should work correctly. - lt_compile=`echo "$ac_compile" | $SED \ - -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ - -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ - -e 's:$: $lt_compiler_flag:'` - (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) - (eval "$lt_compile" 2>out/conftest.err) - ac_status=$? - cat out/conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - if (exit $ac_status) && test -s out/conftest2.$ac_objext - then - # The compiler can only warn and ignore the option if not recognized - # So say no if there are warnings - $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp - $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 - if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then - lt_cv_prog_compiler_c_o=yes - fi - fi - chmod u+w . 2>&5 - $RM conftest* - # SGI C++ compiler will create directory out/ii_files/ for - # template instantiation - test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files - $RM out/* && rmdir out - cd .. - $RM -r conftest - $RM conftest* - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o" >&5 -$as_echo "$lt_cv_prog_compiler_c_o" >&6; } - - - - -hard_links="nottested" -if test "$lt_cv_prog_compiler_c_o" = no && test "$need_locks" != no; then - # do not overwrite the value of need_locks provided by the user - { $as_echo "$as_me:${as_lineno-$LINENO}: checking if we can lock with hard links" >&5 -$as_echo_n "checking if we can lock with hard links... " >&6; } - hard_links=yes - $RM conftest* - ln conftest.a conftest.b 2>/dev/null && hard_links=no - touch conftest.a - ln conftest.a conftest.b 2>&5 || hard_links=no - ln conftest.a conftest.b 2>/dev/null && hard_links=no - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $hard_links" >&5 -$as_echo "$hard_links" >&6; } - if test "$hard_links" = no; then - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&5 -$as_echo "$as_me: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&2;} - need_locks=warn - fi -else - need_locks=no -fi - - - - - - - { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $compiler linker ($LD) supports shared libraries" >&5 -$as_echo_n "checking whether the $compiler linker ($LD) supports shared libraries... " >&6; } - - runpath_var= - allow_undefined_flag= - always_export_symbols=no - archive_cmds= - archive_expsym_cmds= - compiler_needs_object=no - enable_shared_with_static_runtimes=no - export_dynamic_flag_spec= - export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' - hardcode_automatic=no - hardcode_direct=no - hardcode_direct_absolute=no - hardcode_libdir_flag_spec= - hardcode_libdir_separator= - hardcode_minus_L=no - hardcode_shlibpath_var=unsupported - inherit_rpath=no - link_all_deplibs=unknown - module_cmds= - module_expsym_cmds= - old_archive_from_new_cmds= - old_archive_from_expsyms_cmds= - thread_safe_flag_spec= - whole_archive_flag_spec= - # include_expsyms should be a list of space-separated symbols to be *always* - # included in the symbol list - include_expsyms= - # exclude_expsyms can be an extended regexp of symbols to exclude - # it will be wrapped by ` (' and `)$', so one must not match beginning or - # end of line. Example: `a|bc|.*d.*' will exclude the symbols `a' and `bc', - # as well as any symbol that contains `d'. - exclude_expsyms='_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*' - # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out - # platforms (ab)use it in PIC code, but their linkers get confused if - # the symbol is explicitly referenced. Since portable code cannot - # rely on this symbol name, it's probably fine to never include it in - # preloaded symbol tables. - # Exclude shared library initialization/finalization symbols. - extract_expsyms_cmds= - - case $host_os in - cygwin* | mingw* | pw32* | cegcc*) - # FIXME: the MSVC++ port hasn't been tested in a loooong time - # When not using gcc, we currently assume that we are using - # Microsoft Visual C++. - if test "$GCC" != yes; then - with_gnu_ld=no - fi - ;; - interix*) - # we just hope/assume this is gcc and not c89 (= MSVC++) - with_gnu_ld=yes - ;; - openbsd*) - with_gnu_ld=no - ;; - linux* | k*bsd*-gnu | gnu*) - link_all_deplibs=no - ;; - esac - - ld_shlibs=yes - - # On some targets, GNU ld is compatible enough with the native linker - # that we're better off using the native interface for both. - lt_use_gnu_ld_interface=no - if test "$with_gnu_ld" = yes; then - case $host_os in - aix*) - # The AIX port of GNU ld has always aspired to compatibility - # with the native linker. However, as the warning in the GNU ld - # block says, versions before 2.19.5* couldn't really create working - # shared libraries, regardless of the interface used. - case `$LD -v 2>&1` in - *\ \(GNU\ Binutils\)\ 2.19.5*) ;; - *\ \(GNU\ Binutils\)\ 2.[2-9]*) ;; - *\ \(GNU\ Binutils\)\ [3-9]*) ;; - *) - lt_use_gnu_ld_interface=yes - ;; - esac - ;; - *) - lt_use_gnu_ld_interface=yes - ;; - esac - fi - - if test "$lt_use_gnu_ld_interface" = yes; then - # If archive_cmds runs LD, not CC, wlarc should be empty - wlarc='${wl}' - - # Set some defaults for GNU ld with shared library support. These - # are reset later if shared libraries are not supported. Putting them - # here allows them to be overridden if necessary. - runpath_var=LD_RUN_PATH - hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' - export_dynamic_flag_spec='${wl}--export-dynamic' - # ancient GNU ld didn't support --whole-archive et. al. - if $LD --help 2>&1 | $GREP 'no-whole-archive' > /dev/null; then - whole_archive_flag_spec="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' - else - whole_archive_flag_spec= - fi - supports_anon_versioning=no - case `$LD -v 2>&1` in - *GNU\ gold*) supports_anon_versioning=yes ;; - *\ [01].* | *\ 2.[0-9].* | *\ 2.10.*) ;; # catch versions < 2.11 - *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ... - *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ... - *\ 2.11.*) ;; # other 2.11 versions - *) supports_anon_versioning=yes ;; - esac - - # See if GNU ld supports shared libraries. - case $host_os in - aix[3-9]*) - # On AIX/PPC, the GNU linker is very broken - if test "$host_cpu" != ia64; then - ld_shlibs=no - cat <<_LT_EOF 1>&2 - -*** Warning: the GNU linker, at least up to release 2.19, is reported -*** to be unable to reliably create shared libraries on AIX. -*** Therefore, libtool is disabling shared libraries support. If you -*** really care for shared libraries, you may want to install binutils -*** 2.20 or above, or modify your PATH so that a non-GNU linker is found. -*** You will then need to restart the configuration process. - -_LT_EOF - fi - ;; - - amigaos*) - case $host_cpu in - powerpc) - # see comment about AmigaOS4 .so support - archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' - archive_expsym_cmds='' - ;; - m68k) - archive_cmds='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' - hardcode_libdir_flag_spec='-L$libdir' - hardcode_minus_L=yes - ;; - esac - ;; - - beos*) - if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then - allow_undefined_flag=unsupported - # Joseph Beckenbach says some releases of gcc - # support --undefined. This deserves some investigation. FIXME - archive_cmds='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' - else - ld_shlibs=no - fi - ;; - - cygwin* | mingw* | pw32* | cegcc*) - # _LT_TAGVAR(hardcode_libdir_flag_spec, ) is actually meaningless, - # as there is no search path for DLLs. - hardcode_libdir_flag_spec='-L$libdir' - export_dynamic_flag_spec='${wl}--export-all-symbols' - allow_undefined_flag=unsupported - always_export_symbols=no - enable_shared_with_static_runtimes=yes - export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1 DATA/;s/^.*[ ]__nm__\([^ ]*\)[ ][^ ]*/\1 DATA/;/^I[ ]/d;/^[AITW][ ]/s/.* //'\'' | sort | uniq > $export_symbols' - exclude_expsyms='[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname' - - if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then - archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' - # If the export-symbols file already is a .def file (1st line - # is EXPORTS), use it as is; otherwise, prepend... - archive_expsym_cmds='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then - cp $export_symbols $output_objdir/$soname.def; - else - echo EXPORTS > $output_objdir/$soname.def; - cat $export_symbols >> $output_objdir/$soname.def; - fi~ - $CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' - else - ld_shlibs=no - fi - ;; - - haiku*) - archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' - link_all_deplibs=yes - ;; - - interix[3-9]*) - hardcode_direct=no - hardcode_shlibpath_var=no - hardcode_libdir_flag_spec='${wl}-rpath,$libdir' - export_dynamic_flag_spec='${wl}-E' - # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. - # Instead, shared libraries are loaded at an image base (0x10000000 by - # default) and relocated if they conflict, which is a slow very memory - # consuming and fragmenting process. To avoid this, we pick a random, - # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link - # time. Moving up from 0x10000000 also allows more sbrk(2) space. - archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' - archive_expsym_cmds='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' - ;; - - gnu* | linux* | tpf* | k*bsd*-gnu | kopensolaris*-gnu) - tmp_diet=no - if test "$host_os" = linux-dietlibc; then - case $cc_basename in - diet\ *) tmp_diet=yes;; # linux-dietlibc with static linking (!diet-dyn) - esac - fi - if $LD --help 2>&1 | $EGREP ': supported targets:.* elf' > /dev/null \ - && test "$tmp_diet" = no - then - tmp_addflag=' $pic_flag' - tmp_sharedflag='-shared' - case $cc_basename,$host_cpu in - pgcc*) # Portland Group C compiler - whole_archive_flag_spec='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' - tmp_addflag=' $pic_flag' - ;; - pgf77* | pgf90* | pgf95* | pgfortran*) - # Portland Group f77 and f90 compilers - whole_archive_flag_spec='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' - tmp_addflag=' $pic_flag -Mnomain' ;; - ecc*,ia64* | icc*,ia64*) # Intel C compiler on ia64 - tmp_addflag=' -i_dynamic' ;; - efc*,ia64* | ifort*,ia64*) # Intel Fortran compiler on ia64 - tmp_addflag=' -i_dynamic -nofor_main' ;; - ifc* | ifort*) # Intel Fortran compiler - tmp_addflag=' -nofor_main' ;; - lf95*) # Lahey Fortran 8.1 - whole_archive_flag_spec= - tmp_sharedflag='--shared' ;; - xl[cC]* | bgxl[cC]* | mpixl[cC]*) # IBM XL C 8.0 on PPC (deal with xlf below) - tmp_sharedflag='-qmkshrobj' - tmp_addflag= ;; - nvcc*) # Cuda Compiler Driver 2.2 - whole_archive_flag_spec='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' - compiler_needs_object=yes - ;; - esac - case `$CC -V 2>&1 | sed 5q` in - *Sun\ C*) # Sun C 5.9 - whole_archive_flag_spec='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' - compiler_needs_object=yes - tmp_sharedflag='-G' ;; - *Sun\ F*) # Sun Fortran 8.3 - tmp_sharedflag='-G' ;; - esac - archive_cmds='$CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' - - if test "x$supports_anon_versioning" = xyes; then - archive_expsym_cmds='echo "{ global:" > $output_objdir/$libname.ver~ - cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ - echo "local: *; };" >> $output_objdir/$libname.ver~ - $CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib' - fi - - case $cc_basename in - xlf* | bgf* | bgxlf* | mpixlf*) - # IBM XL Fortran 10.1 on PPC cannot create shared libs itself - whole_archive_flag_spec='--whole-archive$convenience --no-whole-archive' - hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' - archive_cmds='$LD -shared $libobjs $deplibs $linker_flags -soname $soname -o $lib' - if test "x$supports_anon_versioning" = xyes; then - archive_expsym_cmds='echo "{ global:" > $output_objdir/$libname.ver~ - cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ - echo "local: *; };" >> $output_objdir/$libname.ver~ - $LD -shared $libobjs $deplibs $linker_flags -soname $soname -version-script $output_objdir/$libname.ver -o $lib' - fi - ;; - esac - else - ld_shlibs=no - fi - ;; - - netbsd* | netbsdelf*-gnu) - if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then - archive_cmds='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib' - wlarc= - else - archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' - archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' - fi - ;; - - solaris*) - if $LD -v 2>&1 | $GREP 'BFD 2\.8' > /dev/null; then - ld_shlibs=no - cat <<_LT_EOF 1>&2 - -*** Warning: The releases 2.8.* of the GNU linker cannot reliably -*** create shared libraries on Solaris systems. Therefore, libtool -*** is disabling shared libraries support. We urge you to upgrade GNU -*** binutils to release 2.9.1 or newer. Another option is to modify -*** your PATH or compiler configuration so that the native linker is -*** used, and then restart. - -_LT_EOF - elif $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then - archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' - archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' - else - ld_shlibs=no - fi - ;; - - sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*) - case `$LD -v 2>&1` in - *\ [01].* | *\ 2.[0-9].* | *\ 2.1[0-5].*) - ld_shlibs=no - cat <<_LT_EOF 1>&2 - -*** Warning: Releases of the GNU linker prior to 2.16.91.0.3 can not -*** reliably create shared libraries on SCO systems. Therefore, libtool -*** is disabling shared libraries support. We urge you to upgrade GNU -*** binutils to release 2.16.91.0.3 or newer. Another option is to modify -*** your PATH or compiler configuration so that the native linker is -*** used, and then restart. - -_LT_EOF - ;; - *) - # For security reasons, it is highly recommended that you always - # use absolute paths for naming shared libraries, and exclude the - # DT_RUNPATH tag from executables and libraries. But doing so - # requires that you compile everything twice, which is a pain. - if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then - hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' - archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' - archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' - else - ld_shlibs=no - fi - ;; - esac - ;; - - sunos4*) - archive_cmds='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags' - wlarc= - hardcode_direct=yes - hardcode_shlibpath_var=no - ;; - - *) - if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then - archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' - archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' - else - ld_shlibs=no - fi - ;; - esac - - if test "$ld_shlibs" = no; then - runpath_var= - hardcode_libdir_flag_spec= - export_dynamic_flag_spec= - whole_archive_flag_spec= - fi - else - # PORTME fill in a description of your system's linker (not GNU ld) - case $host_os in - aix3*) - allow_undefined_flag=unsupported - always_export_symbols=yes - archive_expsym_cmds='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname' - # Note: this linker hardcodes the directories in LIBPATH if there - # are no directories specified by -L. - hardcode_minus_L=yes - if test "$GCC" = yes && test -z "$lt_prog_compiler_static"; then - # Neither direct hardcoding nor static linking is supported with a - # broken collect2. - hardcode_direct=unsupported - fi - ;; - - aix[4-9]*) - if test "$host_cpu" = ia64; then - # On IA64, the linker does run time linking by default, so we don't - # have to do anything special. - aix_use_runtimelinking=no - exp_sym_flag='-Bexport' - no_entry_flag="" - else - # If we're using GNU nm, then we don't want the "-C" option. - # -C means demangle to AIX nm, but means don't demangle with GNU nm - # Also, AIX nm treats weak defined symbols like other global - # defined symbols, whereas GNU nm marks them as "W". - if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then - export_symbols_cmds='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && (substr(\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' - else - export_symbols_cmds='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && (substr(\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' - fi - aix_use_runtimelinking=no - - # Test if we are trying to use run time linking or normal - # AIX style linking. If -brtl is somewhere in LDFLAGS, we - # need to do runtime linking. - case $host_os in aix4.[23]|aix4.[23].*|aix[5-9]*) - for ld_flag in $LDFLAGS; do - if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then - aix_use_runtimelinking=yes - break - fi - done - ;; - esac - - exp_sym_flag='-bexport' - no_entry_flag='-bnoentry' - fi - - # When large executables or shared objects are built, AIX ld can - # have problems creating the table of contents. If linking a library - # or program results in "error TOC overflow" add -mminimal-toc to - # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not - # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. - - archive_cmds='' - hardcode_direct=yes - hardcode_direct_absolute=yes - hardcode_libdir_separator=':' - link_all_deplibs=yes - file_list_spec='${wl}-f,' - - if test "$GCC" = yes; then - case $host_os in aix4.[012]|aix4.[012].*) - # We only want to do this on AIX 4.2 and lower, the check - # below for broken collect2 doesn't work under 4.3+ - collect2name=`${CC} -print-prog-name=collect2` - if test -f "$collect2name" && - strings "$collect2name" | $GREP resolve_lib_name >/dev/null - then - # We have reworked collect2 - : - else - # We have old collect2 - hardcode_direct=unsupported - # It fails to find uninstalled libraries when the uninstalled - # path is not listed in the libpath. Setting hardcode_minus_L - # to unsupported forces relinking - hardcode_minus_L=yes - hardcode_libdir_flag_spec='-L$libdir' - hardcode_libdir_separator= - fi - ;; - esac - shared_flag='-shared' - if test "$aix_use_runtimelinking" = yes; then - shared_flag="$shared_flag "'${wl}-G' - fi - link_all_deplibs=no - else - # not using gcc - if test "$host_cpu" = ia64; then - # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release - # chokes on -Wl,-G. The following line is correct: - shared_flag='-G' - else - if test "$aix_use_runtimelinking" = yes; then - shared_flag='${wl}-G' - else - shared_flag='${wl}-bM:SRE' - fi - fi - fi - - export_dynamic_flag_spec='${wl}-bexpall' - # It seems that -bexpall does not export symbols beginning with - # underscore (_), so it is better to generate a list of symbols to export. - always_export_symbols=yes - if test "$aix_use_runtimelinking" = yes; then - # Warning - without using the other runtime loading flags (-brtl), - # -berok will link without error, but may produce a broken library. - allow_undefined_flag='-berok' - # Determine the default libpath from the value encoded in an - # empty executable. - if test "${lt_cv_aix_libpath+set}" = set; then - aix_libpath=$lt_cv_aix_libpath -else - if ${lt_cv_aix_libpath_+:} false; then : - $as_echo_n "(cached) " >&6 -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -int -main () -{ - - ; - return 0; -} -_ACEOF -if ac_fn_c_try_link "$LINENO"; then : - - lt_aix_libpath_sed=' - /Import File Strings/,/^$/ { - /^0/ { - s/^0 *\([^ ]*\) *$/\1/ - p - } - }' - lt_cv_aix_libpath_=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` - # Check for a 64-bit object if we didn't find anything. - if test -z "$lt_cv_aix_libpath_"; then - lt_cv_aix_libpath_=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` - fi -fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext - if test -z "$lt_cv_aix_libpath_"; then - lt_cv_aix_libpath_="/usr/lib:/lib" - fi - -fi - - aix_libpath=$lt_cv_aix_libpath_ -fi - - hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath" - archive_expsym_cmds='$CC -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then func_echo_all "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag" - else - if test "$host_cpu" = ia64; then - hardcode_libdir_flag_spec='${wl}-R $libdir:/usr/lib:/lib' - allow_undefined_flag="-z nodefs" - archive_expsym_cmds="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols" - else - # Determine the default libpath from the value encoded in an - # empty executable. - if test "${lt_cv_aix_libpath+set}" = set; then - aix_libpath=$lt_cv_aix_libpath -else - if ${lt_cv_aix_libpath_+:} false; then : - $as_echo_n "(cached) " >&6 -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -int -main () -{ - - ; - return 0; -} -_ACEOF -if ac_fn_c_try_link "$LINENO"; then : - - lt_aix_libpath_sed=' - /Import File Strings/,/^$/ { - /^0/ { - s/^0 *\([^ ]*\) *$/\1/ - p - } - }' - lt_cv_aix_libpath_=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` - # Check for a 64-bit object if we didn't find anything. - if test -z "$lt_cv_aix_libpath_"; then - lt_cv_aix_libpath_=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` - fi -fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext - if test -z "$lt_cv_aix_libpath_"; then - lt_cv_aix_libpath_="/usr/lib:/lib" - fi - -fi - - aix_libpath=$lt_cv_aix_libpath_ -fi - - hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath" - # Warning - without using the other run time loading flags, - # -berok will link without error, but may produce a broken library. - no_undefined_flag=' ${wl}-bernotok' - allow_undefined_flag=' ${wl}-berok' - if test "$with_gnu_ld" = yes; then - # We only use this code for GNU lds that support --whole-archive. - whole_archive_flag_spec='${wl}--whole-archive$convenience ${wl}--no-whole-archive' - else - # Exported symbols can be pulled into shared objects from archives - whole_archive_flag_spec='$convenience' - fi - archive_cmds_need_lc=yes - # This is similar to how AIX traditionally builds its shared libraries. - archive_expsym_cmds="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' - fi - fi - ;; - - amigaos*) - case $host_cpu in - powerpc) - # see comment about AmigaOS4 .so support - archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' - archive_expsym_cmds='' - ;; - m68k) - archive_cmds='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' - hardcode_libdir_flag_spec='-L$libdir' - hardcode_minus_L=yes - ;; - esac - ;; - - bsdi[45]*) - export_dynamic_flag_spec=-rdynamic - ;; - - cygwin* | mingw* | pw32* | cegcc*) - # When not using gcc, we currently assume that we are using - # Microsoft Visual C++. - # hardcode_libdir_flag_spec is actually meaningless, as there is - # no search path for DLLs. - case $cc_basename in - cl*) - # Native MSVC - hardcode_libdir_flag_spec=' ' - allow_undefined_flag=unsupported - always_export_symbols=yes - file_list_spec='@' - # Tell ltmain to make .lib files, not .a files. - libext=lib - # Tell ltmain to make .dll files, not .so files. - shrext_cmds=".dll" - # FIXME: Setting linknames here is a bad hack. - archive_cmds='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-dll~linknames=' - archive_expsym_cmds='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then - sed -n -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' -e '1\\\!p' < $export_symbols > $output_objdir/$soname.exp; - else - sed -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' < $export_symbols > $output_objdir/$soname.exp; - fi~ - $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~ - linknames=' - # The linker will not automatically build a static lib if we build a DLL. - # _LT_TAGVAR(old_archive_from_new_cmds, )='true' - enable_shared_with_static_runtimes=yes - exclude_expsyms='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*' - export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1,DATA/'\'' | $SED -e '\''/^[AITW][ ]/s/.*[ ]//'\'' | sort | uniq > $export_symbols' - # Don't use ranlib - old_postinstall_cmds='chmod 644 $oldlib' - postlink_cmds='lt_outputfile="@OUTPUT@"~ - lt_tool_outputfile="@TOOL_OUTPUT@"~ - case $lt_outputfile in - *.exe|*.EXE) ;; - *) - lt_outputfile="$lt_outputfile.exe" - lt_tool_outputfile="$lt_tool_outputfile.exe" - ;; - esac~ - if test "$MANIFEST_TOOL" != ":" && test -f "$lt_outputfile.manifest"; then - $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1; - $RM "$lt_outputfile.manifest"; - fi' - ;; - *) - # Assume MSVC wrapper - hardcode_libdir_flag_spec=' ' - allow_undefined_flag=unsupported - # Tell ltmain to make .lib files, not .a files. - libext=lib - # Tell ltmain to make .dll files, not .so files. - shrext_cmds=".dll" - # FIXME: Setting linknames here is a bad hack. - archive_cmds='$CC -o $lib $libobjs $compiler_flags `func_echo_all "$deplibs" | $SED '\''s/ -lc$//'\''` -link -dll~linknames=' - # The linker will automatically build a .lib file if we build a DLL. - old_archive_from_new_cmds='true' - # FIXME: Should let the user specify the lib program. - old_archive_cmds='lib -OUT:$oldlib$oldobjs$old_deplibs' - enable_shared_with_static_runtimes=yes - ;; - esac - ;; - - darwin* | rhapsody*) - - - archive_cmds_need_lc=no - hardcode_direct=no - hardcode_automatic=yes - hardcode_shlibpath_var=unsupported - if test "$lt_cv_ld_force_load" = "yes"; then - whole_archive_flag_spec='`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience ${wl}-force_load,$conv\"; done; func_echo_all \"$new_convenience\"`' - - else - whole_archive_flag_spec='' - fi - link_all_deplibs=yes - allow_undefined_flag="$_lt_dar_allow_undefined" - case $cc_basename in - ifort*) _lt_dar_can_shared=yes ;; - *) _lt_dar_can_shared=$GCC ;; - esac - if test "$_lt_dar_can_shared" = "yes"; then - output_verbose_link_cmd=func_echo_all - archive_cmds="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod${_lt_dsymutil}" - module_cmds="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dsymutil}" - archive_expsym_cmds="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring ${_lt_dar_single_mod}${_lt_dar_export_syms}${_lt_dsymutil}" - module_expsym_cmds="sed -e 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dar_export_syms}${_lt_dsymutil}" - - else - ld_shlibs=no - fi - - ;; - - dgux*) - archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' - hardcode_libdir_flag_spec='-L$libdir' - hardcode_shlibpath_var=no - ;; - - # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor - # support. Future versions do this automatically, but an explicit c++rt0.o - # does not break anything, and helps significantly (at the cost of a little - # extra space). - freebsd2.2*) - archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o' - hardcode_libdir_flag_spec='-R$libdir' - hardcode_direct=yes - hardcode_shlibpath_var=no - ;; - - # Unfortunately, older versions of FreeBSD 2 do not have this feature. - freebsd2.*) - archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' - hardcode_direct=yes - hardcode_minus_L=yes - hardcode_shlibpath_var=no - ;; - - # FreeBSD 3 and greater uses gcc -shared to do shared libraries. - freebsd* | dragonfly*) - archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' - hardcode_libdir_flag_spec='-R$libdir' - hardcode_direct=yes - hardcode_shlibpath_var=no - ;; - - hpux9*) - if test "$GCC" = yes; then - archive_cmds='$RM $output_objdir/$soname~$CC -shared $pic_flag ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' - else - archive_cmds='$RM $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' - fi - hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' - hardcode_libdir_separator=: - hardcode_direct=yes - - # hardcode_minus_L: Not really in the search PATH, - # but as the default location of the library. - hardcode_minus_L=yes - export_dynamic_flag_spec='${wl}-E' - ;; - - hpux10*) - if test "$GCC" = yes && test "$with_gnu_ld" = no; then - archive_cmds='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' - else - archive_cmds='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' - fi - if test "$with_gnu_ld" = no; then - hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' - hardcode_libdir_separator=: - hardcode_direct=yes - hardcode_direct_absolute=yes - export_dynamic_flag_spec='${wl}-E' - # hardcode_minus_L: Not really in the search PATH, - # but as the default location of the library. - hardcode_minus_L=yes - fi - ;; - - hpux11*) - if test "$GCC" = yes && test "$with_gnu_ld" = no; then - case $host_cpu in - hppa*64*) - archive_cmds='$CC -shared ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' - ;; - ia64*) - archive_cmds='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' - ;; - *) - archive_cmds='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' - ;; - esac - else - case $host_cpu in - hppa*64*) - archive_cmds='$CC -b ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' - ;; - ia64*) - archive_cmds='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' - ;; - *) - - # Older versions of the 11.00 compiler do not understand -b yet - # (HP92453-01 A.11.01.20 doesn't, HP92453-01 B.11.X.35175-35176.GP does) - { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $CC understands -b" >&5 -$as_echo_n "checking if $CC understands -b... " >&6; } -if ${lt_cv_prog_compiler__b+:} false; then : - $as_echo_n "(cached) " >&6 -else - lt_cv_prog_compiler__b=no - save_LDFLAGS="$LDFLAGS" - LDFLAGS="$LDFLAGS -b" - echo "$lt_simple_link_test_code" > conftest.$ac_ext - if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then - # The linker can only warn and ignore the option if not recognized - # So say no if there are warnings - if test -s conftest.err; then - # Append any errors to the config.log. - cat conftest.err 1>&5 - $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp - $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 - if diff conftest.exp conftest.er2 >/dev/null; then - lt_cv_prog_compiler__b=yes - fi - else - lt_cv_prog_compiler__b=yes - fi - fi - $RM -r conftest* - LDFLAGS="$save_LDFLAGS" - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler__b" >&5 -$as_echo "$lt_cv_prog_compiler__b" >&6; } - -if test x"$lt_cv_prog_compiler__b" = xyes; then - archive_cmds='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' -else - archive_cmds='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' -fi - - ;; - esac - fi - if test "$with_gnu_ld" = no; then - hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' - hardcode_libdir_separator=: - - case $host_cpu in - hppa*64*|ia64*) - hardcode_direct=no - hardcode_shlibpath_var=no - ;; - *) - hardcode_direct=yes - hardcode_direct_absolute=yes - export_dynamic_flag_spec='${wl}-E' - - # hardcode_minus_L: Not really in the search PATH, - # but as the default location of the library. - hardcode_minus_L=yes - ;; - esac - fi - ;; - - irix5* | irix6* | nonstopux*) - if test "$GCC" = yes; then - archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' - # Try to use the -exported_symbol ld option, if it does not - # work, assume that -exports_file does not work either and - # implicitly export all symbols. - # This should be the same for all languages, so no per-tag cache variable. - { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $host_os linker accepts -exported_symbol" >&5 -$as_echo_n "checking whether the $host_os linker accepts -exported_symbol... " >&6; } -if ${lt_cv_irix_exported_symbol+:} false; then : - $as_echo_n "(cached) " >&6 -else - save_LDFLAGS="$LDFLAGS" - LDFLAGS="$LDFLAGS -shared ${wl}-exported_symbol ${wl}foo ${wl}-update_registry ${wl}/dev/null" - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -int foo (void) { return 0; } -_ACEOF -if ac_fn_c_try_link "$LINENO"; then : - lt_cv_irix_exported_symbol=yes -else - lt_cv_irix_exported_symbol=no -fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext - LDFLAGS="$save_LDFLAGS" -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_irix_exported_symbol" >&5 -$as_echo "$lt_cv_irix_exported_symbol" >&6; } - if test "$lt_cv_irix_exported_symbol" = yes; then - archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations ${wl}-exports_file ${wl}$export_symbols -o $lib' - fi - else - archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' - archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -exports_file $export_symbols -o $lib' - fi - archive_cmds_need_lc='no' - hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' - hardcode_libdir_separator=: - inherit_rpath=yes - link_all_deplibs=yes - ;; - - netbsd* | netbsdelf*-gnu) - if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then - archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' # a.out - else - archive_cmds='$LD -shared -o $lib $libobjs $deplibs $linker_flags' # ELF - fi - hardcode_libdir_flag_spec='-R$libdir' - hardcode_direct=yes - hardcode_shlibpath_var=no - ;; - - newsos6) - archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' - hardcode_direct=yes - hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' - hardcode_libdir_separator=: - hardcode_shlibpath_var=no - ;; - - *nto* | *qnx*) - ;; - - openbsd*) - if test -f /usr/libexec/ld.so; then - hardcode_direct=yes - hardcode_shlibpath_var=no - hardcode_direct_absolute=yes - if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then - archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' - archive_expsym_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-retain-symbols-file,$export_symbols' - hardcode_libdir_flag_spec='${wl}-rpath,$libdir' - export_dynamic_flag_spec='${wl}-E' - else - case $host_os in - openbsd[01].* | openbsd2.[0-7] | openbsd2.[0-7].*) - archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' - hardcode_libdir_flag_spec='-R$libdir' - ;; - *) - archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' - hardcode_libdir_flag_spec='${wl}-rpath,$libdir' - ;; - esac - fi - else - ld_shlibs=no - fi - ;; - - os2*) - hardcode_libdir_flag_spec='-L$libdir' - hardcode_minus_L=yes - allow_undefined_flag=unsupported - archive_cmds='$ECHO "LIBRARY $libname INITINSTANCE" > $output_objdir/$libname.def~$ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~echo DATA >> $output_objdir/$libname.def~echo " SINGLE NONSHARED" >> $output_objdir/$libname.def~echo EXPORTS >> $output_objdir/$libname.def~emxexp $libobjs >> $output_objdir/$libname.def~$CC -Zdll -Zcrtdll -o $lib $libobjs $deplibs $compiler_flags $output_objdir/$libname.def' - old_archive_from_new_cmds='emximp -o $output_objdir/$libname.a $output_objdir/$libname.def' - ;; - - osf3*) - if test "$GCC" = yes; then - allow_undefined_flag=' ${wl}-expect_unresolved ${wl}\*' - archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' - else - allow_undefined_flag=' -expect_unresolved \*' - archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' - fi - archive_cmds_need_lc='no' - hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' - hardcode_libdir_separator=: - ;; - - osf4* | osf5*) # as osf3* with the addition of -msym flag - if test "$GCC" = yes; then - allow_undefined_flag=' ${wl}-expect_unresolved ${wl}\*' - archive_cmds='$CC -shared${allow_undefined_flag} $pic_flag $libobjs $deplibs $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' - hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' - else - allow_undefined_flag=' -expect_unresolved \*' - archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' - archive_expsym_cmds='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; printf "%s\\n" "-hidden">> $lib.exp~ - $CC -shared${allow_undefined_flag} ${wl}-input ${wl}$lib.exp $compiler_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib~$RM $lib.exp' - - # Both c and cxx compiler support -rpath directly - hardcode_libdir_flag_spec='-rpath $libdir' - fi - archive_cmds_need_lc='no' - hardcode_libdir_separator=: - ;; - - solaris*) - no_undefined_flag=' -z defs' - if test "$GCC" = yes; then - wlarc='${wl}' - archive_cmds='$CC -shared $pic_flag ${wl}-z ${wl}text ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' - archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ - $CC -shared $pic_flag ${wl}-z ${wl}text ${wl}-M ${wl}$lib.exp ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' - else - case `$CC -V 2>&1` in - *"Compilers 5.0"*) - wlarc='' - archive_cmds='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags' - archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ - $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$RM $lib.exp' - ;; - *) - wlarc='${wl}' - archive_cmds='$CC -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $compiler_flags' - archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ - $CC -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' - ;; - esac - fi - hardcode_libdir_flag_spec='-R$libdir' - hardcode_shlibpath_var=no - case $host_os in - solaris2.[0-5] | solaris2.[0-5].*) ;; - *) - # The compiler driver will combine and reorder linker options, - # but understands `-z linker_flag'. GCC discards it without `$wl', - # but is careful enough not to reorder. - # Supported since Solaris 2.6 (maybe 2.5.1?) - if test "$GCC" = yes; then - whole_archive_flag_spec='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract' - else - whole_archive_flag_spec='-z allextract$convenience -z defaultextract' - fi - ;; - esac - link_all_deplibs=yes - ;; - - sunos4*) - if test "x$host_vendor" = xsequent; then - # Use $CC to link under sequent, because it throws in some extra .o - # files that make .init and .fini sections work. - archive_cmds='$CC -G ${wl}-h $soname -o $lib $libobjs $deplibs $compiler_flags' - else - archive_cmds='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags' - fi - hardcode_libdir_flag_spec='-L$libdir' - hardcode_direct=yes - hardcode_minus_L=yes - hardcode_shlibpath_var=no - ;; - - sysv4) - case $host_vendor in - sni) - archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' - hardcode_direct=yes # is this really true??? - ;; - siemens) - ## LD is ld it makes a PLAMLIB - ## CC just makes a GrossModule. - archive_cmds='$LD -G -o $lib $libobjs $deplibs $linker_flags' - reload_cmds='$CC -r -o $output$reload_objs' - hardcode_direct=no - ;; - motorola) - archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' - hardcode_direct=no #Motorola manual says yes, but my tests say they lie - ;; - esac - runpath_var='LD_RUN_PATH' - hardcode_shlibpath_var=no - ;; - - sysv4.3*) - archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' - hardcode_shlibpath_var=no - export_dynamic_flag_spec='-Bexport' - ;; - - sysv4*MP*) - if test -d /usr/nec; then - archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' - hardcode_shlibpath_var=no - runpath_var=LD_RUN_PATH - hardcode_runpath_var=yes - ld_shlibs=yes - fi - ;; - - sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7* | sco3.2v5.0.[024]*) - no_undefined_flag='${wl}-z,text' - archive_cmds_need_lc=no - hardcode_shlibpath_var=no - runpath_var='LD_RUN_PATH' - - if test "$GCC" = yes; then - archive_cmds='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' - archive_expsym_cmds='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' - else - archive_cmds='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' - archive_expsym_cmds='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' - fi - ;; - - sysv5* | sco3.2v5* | sco5v6*) - # Note: We can NOT use -z defs as we might desire, because we do not - # link with -lc, and that would cause any symbols used from libc to - # always be unresolved, which means just about no library would - # ever link correctly. If we're not using GNU ld we use -z text - # though, which does catch some bad symbols but isn't as heavy-handed - # as -z defs. - no_undefined_flag='${wl}-z,text' - allow_undefined_flag='${wl}-z,nodefs' - archive_cmds_need_lc=no - hardcode_shlibpath_var=no - hardcode_libdir_flag_spec='${wl}-R,$libdir' - hardcode_libdir_separator=':' - link_all_deplibs=yes - export_dynamic_flag_spec='${wl}-Bexport' - runpath_var='LD_RUN_PATH' - - if test "$GCC" = yes; then - archive_cmds='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' - archive_expsym_cmds='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' - else - archive_cmds='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' - archive_expsym_cmds='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' - fi - ;; - - uts4*) - archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' - hardcode_libdir_flag_spec='-L$libdir' - hardcode_shlibpath_var=no - ;; - - *) - ld_shlibs=no - ;; - esac - - if test x$host_vendor = xsni; then - case $host in - sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) - export_dynamic_flag_spec='${wl}-Blargedynsym' - ;; - esac - fi - fi - -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ld_shlibs" >&5 -$as_echo "$ld_shlibs" >&6; } -test "$ld_shlibs" = no && can_build_shared=no - -with_gnu_ld=$with_gnu_ld - - - - - - - - - - - - - - - -# -# Do we need to explicitly link libc? -# -case "x$archive_cmds_need_lc" in -x|xyes) - # Assume -lc should be added - archive_cmds_need_lc=yes - - if test "$enable_shared" = yes && test "$GCC" = yes; then - case $archive_cmds in - *'~'*) - # FIXME: we may have to deal with multi-command sequences. - ;; - '$CC '*) - # Test whether the compiler implicitly links with -lc since on some - # systems, -lgcc has to come before -lc. If gcc already passes -lc - # to ld, don't add -lc before -lgcc. - { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether -lc should be explicitly linked in" >&5 -$as_echo_n "checking whether -lc should be explicitly linked in... " >&6; } -if ${lt_cv_archive_cmds_need_lc+:} false; then : - $as_echo_n "(cached) " >&6 -else - $RM conftest* - echo "$lt_simple_compile_test_code" > conftest.$ac_ext - - if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 - (eval $ac_compile) 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } 2>conftest.err; then - soname=conftest - lib=conftest - libobjs=conftest.$ac_objext - deplibs= - wl=$lt_prog_compiler_wl - pic_flag=$lt_prog_compiler_pic - compiler_flags=-v - linker_flags=-v - verstring= - output_objdir=. - libname=conftest - lt_save_allow_undefined_flag=$allow_undefined_flag - allow_undefined_flag= - if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$archive_cmds 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1\""; } >&5 - (eval $archive_cmds 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1) 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } - then - lt_cv_archive_cmds_need_lc=no - else - lt_cv_archive_cmds_need_lc=yes - fi - allow_undefined_flag=$lt_save_allow_undefined_flag - else - cat conftest.err 1>&5 - fi - $RM conftest* - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_archive_cmds_need_lc" >&5 -$as_echo "$lt_cv_archive_cmds_need_lc" >&6; } - archive_cmds_need_lc=$lt_cv_archive_cmds_need_lc - ;; - esac - fi - ;; -esac - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - { $as_echo "$as_me:${as_lineno-$LINENO}: checking dynamic linker characteristics" >&5 -$as_echo_n "checking dynamic linker characteristics... " >&6; } - -if test "$GCC" = yes; then - case $host_os in - darwin*) lt_awk_arg="/^libraries:/,/LR/" ;; - *) lt_awk_arg="/^libraries:/" ;; - esac - case $host_os in - mingw* | cegcc*) lt_sed_strip_eq="s,=\([A-Za-z]:\),\1,g" ;; - *) lt_sed_strip_eq="s,=/,/,g" ;; - esac - lt_search_path_spec=`$CC -print-search-dirs | awk $lt_awk_arg | $SED -e "s/^libraries://" -e $lt_sed_strip_eq` - case $lt_search_path_spec in - *\;*) - # if the path contains ";" then we assume it to be the separator - # otherwise default to the standard path separator (i.e. ":") - it is - # assumed that no part of a normal pathname contains ";" but that should - # okay in the real world where ";" in dirpaths is itself problematic. - lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED 's/;/ /g'` - ;; - *) - lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED "s/$PATH_SEPARATOR/ /g"` - ;; - esac - # Ok, now we have the path, separated by spaces, we can step through it - # and add multilib dir if necessary. - lt_tmp_lt_search_path_spec= - lt_multi_os_dir=`$CC $CPPFLAGS $CFLAGS $LDFLAGS -print-multi-os-directory 2>/dev/null` - for lt_sys_path in $lt_search_path_spec; do - if test -d "$lt_sys_path/$lt_multi_os_dir"; then - lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path/$lt_multi_os_dir" - else - test -d "$lt_sys_path" && \ - lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path" - fi - done - lt_search_path_spec=`$ECHO "$lt_tmp_lt_search_path_spec" | awk ' -BEGIN {RS=" "; FS="/|\n";} { - lt_foo=""; - lt_count=0; - for (lt_i = NF; lt_i > 0; lt_i--) { - if ($lt_i != "" && $lt_i != ".") { - if ($lt_i == "..") { - lt_count++; - } else { - if (lt_count == 0) { - lt_foo="/" $lt_i lt_foo; - } else { - lt_count--; - } - } - } - } - if (lt_foo != "") { lt_freq[lt_foo]++; } - if (lt_freq[lt_foo] == 1) { print lt_foo; } -}'` - # AWK program above erroneously prepends '/' to C:/dos/paths - # for these hosts. - case $host_os in - mingw* | cegcc*) lt_search_path_spec=`$ECHO "$lt_search_path_spec" |\ - $SED 's,/\([A-Za-z]:\),\1,g'` ;; - esac - sys_lib_search_path_spec=`$ECHO "$lt_search_path_spec" | $lt_NL2SP` -else - sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" -fi -library_names_spec= -libname_spec='lib$name' -soname_spec= -shrext_cmds=".so" -postinstall_cmds= -postuninstall_cmds= -finish_cmds= -finish_eval= -shlibpath_var= -shlibpath_overrides_runpath=unknown -version_type=none -dynamic_linker="$host_os ld.so" -sys_lib_dlsearch_path_spec="/lib /usr/lib" -need_lib_prefix=unknown -hardcode_into_libs=no - -# when you set need_version to no, make sure it does not cause -set_version -# flags to be left without arguments -need_version=unknown - -case $host_os in -aix3*) - version_type=linux # correct to gnu/linux during the next big refactor - library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a' - shlibpath_var=LIBPATH - - # AIX 3 has no versioning support, so we append a major version to the name. - soname_spec='${libname}${release}${shared_ext}$major' - ;; - -aix[4-9]*) - version_type=linux # correct to gnu/linux during the next big refactor - need_lib_prefix=no - need_version=no - hardcode_into_libs=yes - if test "$host_cpu" = ia64; then - # AIX 5 supports IA64 - library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}' - shlibpath_var=LD_LIBRARY_PATH - else - # With GCC up to 2.95.x, collect2 would create an import file - # for dependence libraries. The import file would start with - # the line `#! .'. This would cause the generated library to - # depend on `.', always an invalid library. This was fixed in - # development snapshots of GCC prior to 3.0. - case $host_os in - aix4 | aix4.[01] | aix4.[01].*) - if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)' - echo ' yes ' - echo '#endif'; } | ${CC} -E - | $GREP yes > /dev/null; then - : - else - can_build_shared=no - fi - ;; - esac - # AIX (on Power*) has no versioning support, so currently we can not hardcode correct - # soname into executable. Probably we can add versioning support to - # collect2, so additional links can be useful in future. - if test "$aix_use_runtimelinking" = yes; then - # If using run time linking (on AIX 4.2 or later) use lib.so - # instead of lib.a to let people know that these are not - # typical AIX shared libraries. - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - else - # We preserve .a as extension for shared libraries through AIX4.2 - # and later when we are not doing run time linking. - library_names_spec='${libname}${release}.a $libname.a' - soname_spec='${libname}${release}${shared_ext}$major' - fi - shlibpath_var=LIBPATH - fi - ;; - -amigaos*) - case $host_cpu in - powerpc) - # Since July 2007 AmigaOS4 officially supports .so libraries. - # When compiling the executable, add -use-dynld -Lsobjs: to the compileline. - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - ;; - m68k) - library_names_spec='$libname.ixlibrary $libname.a' - # Create ${libname}_ixlibrary.a entries in /sys/libs. - finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`func_echo_all "$lib" | $SED '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; test $RM /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done' - ;; - esac - ;; - -beos*) - library_names_spec='${libname}${shared_ext}' - dynamic_linker="$host_os ld.so" - shlibpath_var=LIBRARY_PATH - ;; - -bsdi[45]*) - version_type=linux # correct to gnu/linux during the next big refactor - need_version=no - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir' - shlibpath_var=LD_LIBRARY_PATH - sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib" - sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib" - # the default ld.so.conf also contains /usr/contrib/lib and - # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow - # libtool to hard-code these into programs - ;; - -cygwin* | mingw* | pw32* | cegcc*) - version_type=windows - shrext_cmds=".dll" - need_version=no - need_lib_prefix=no - - case $GCC,$cc_basename in - yes,*) - # gcc - library_names_spec='$libname.dll.a' - # DLL is installed to $(libdir)/../bin by postinstall_cmds - postinstall_cmds='base_file=`basename \${file}`~ - dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~ - dldir=$destdir/`dirname \$dlpath`~ - test -d \$dldir || mkdir -p \$dldir~ - $install_prog $dir/$dlname \$dldir/$dlname~ - chmod a+x \$dldir/$dlname~ - if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then - eval '\''$striplib \$dldir/$dlname'\'' || exit \$?; - fi' - postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ - dlpath=$dir/\$dldll~ - $RM \$dlpath' - shlibpath_overrides_runpath=yes - - case $host_os in - cygwin*) - # Cygwin DLLs use 'cyg' prefix rather than 'lib' - soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' - - sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/lib/w32api" - ;; - mingw* | cegcc*) - # MinGW DLLs use traditional 'lib' prefix - soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' - ;; - pw32*) - # pw32 DLLs use 'pw' prefix rather than 'lib' - library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' - ;; - esac - dynamic_linker='Win32 ld.exe' - ;; - - *,cl*) - # Native MSVC - libname_spec='$name' - soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' - library_names_spec='${libname}.dll.lib' - - case $build_os in - mingw*) - sys_lib_search_path_spec= - lt_save_ifs=$IFS - IFS=';' - for lt_path in $LIB - do - IFS=$lt_save_ifs - # Let DOS variable expansion print the short 8.3 style file name. - lt_path=`cd "$lt_path" 2>/dev/null && cmd //C "for %i in (".") do @echo %~si"` - sys_lib_search_path_spec="$sys_lib_search_path_spec $lt_path" - done - IFS=$lt_save_ifs - # Convert to MSYS style. - sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | sed -e 's|\\\\|/|g' -e 's| \\([a-zA-Z]\\):| /\\1|g' -e 's|^ ||'` - ;; - cygwin*) - # Convert to unix form, then to dos form, then back to unix form - # but this time dos style (no spaces!) so that the unix form looks - # like /cygdrive/c/PROGRA~1:/cygdr... - sys_lib_search_path_spec=`cygpath --path --unix "$LIB"` - sys_lib_search_path_spec=`cygpath --path --dos "$sys_lib_search_path_spec" 2>/dev/null` - sys_lib_search_path_spec=`cygpath --path --unix "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` - ;; - *) - sys_lib_search_path_spec="$LIB" - if $ECHO "$sys_lib_search_path_spec" | $GREP ';[c-zC-Z]:/' >/dev/null; then - # It is most probably a Windows format PATH. - sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` - else - sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` - fi - # FIXME: find the short name or the path components, as spaces are - # common. (e.g. "Program Files" -> "PROGRA~1") - ;; - esac - - # DLL is installed to $(libdir)/../bin by postinstall_cmds - postinstall_cmds='base_file=`basename \${file}`~ - dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~ - dldir=$destdir/`dirname \$dlpath`~ - test -d \$dldir || mkdir -p \$dldir~ - $install_prog $dir/$dlname \$dldir/$dlname' - postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ - dlpath=$dir/\$dldll~ - $RM \$dlpath' - shlibpath_overrides_runpath=yes - dynamic_linker='Win32 link.exe' - ;; - - *) - # Assume MSVC wrapper - library_names_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext} $libname.lib' - dynamic_linker='Win32 ld.exe' - ;; - esac - # FIXME: first we should search . and the directory the executable is in - shlibpath_var=PATH - ;; - -darwin* | rhapsody*) - dynamic_linker="$host_os dyld" - version_type=darwin - need_lib_prefix=no - need_version=no - library_names_spec='${libname}${release}${major}$shared_ext ${libname}$shared_ext' - soname_spec='${libname}${release}${major}$shared_ext' - shlibpath_overrides_runpath=yes - shlibpath_var=DYLD_LIBRARY_PATH - shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`' - - sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/local/lib" - sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib' - ;; - -dgux*) - version_type=linux # correct to gnu/linux during the next big refactor - need_lib_prefix=no - need_version=no - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext' - soname_spec='${libname}${release}${shared_ext}$major' - shlibpath_var=LD_LIBRARY_PATH - ;; - -freebsd* | dragonfly*) - # DragonFly does not have aout. When/if they implement a new - # versioning mechanism, adjust this. - if test -x /usr/bin/objformat; then - objformat=`/usr/bin/objformat` - else - case $host_os in - freebsd[23].*) objformat=aout ;; - *) objformat=elf ;; - esac - fi - version_type=freebsd-$objformat - case $version_type in - freebsd-elf*) - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' - need_version=no - need_lib_prefix=no - ;; - freebsd-*) - library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix' - need_version=yes - ;; - esac - shlibpath_var=LD_LIBRARY_PATH - case $host_os in - freebsd2.*) - shlibpath_overrides_runpath=yes - ;; - freebsd3.[01]* | freebsdelf3.[01]*) - shlibpath_overrides_runpath=yes - hardcode_into_libs=yes - ;; - freebsd3.[2-9]* | freebsdelf3.[2-9]* | \ - freebsd4.[0-5] | freebsdelf4.[0-5] | freebsd4.1.1 | freebsdelf4.1.1) - shlibpath_overrides_runpath=no - hardcode_into_libs=yes - ;; - *) # from 4.6 on, and DragonFly - shlibpath_overrides_runpath=yes - hardcode_into_libs=yes - ;; - esac - ;; - -gnu*) - version_type=linux # correct to gnu/linux during the next big refactor - need_lib_prefix=no - need_version=no - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=no - hardcode_into_libs=yes - ;; - -haiku*) - version_type=linux # correct to gnu/linux during the next big refactor - need_lib_prefix=no - need_version=no - dynamic_linker="$host_os runtime_loader" - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - shlibpath_var=LIBRARY_PATH - shlibpath_overrides_runpath=yes - sys_lib_dlsearch_path_spec='/boot/home/config/lib /boot/common/lib /boot/system/lib' - hardcode_into_libs=yes - ;; - -hpux9* | hpux10* | hpux11*) - # Give a soname corresponding to the major version so that dld.sl refuses to - # link against other versions. - version_type=sunos - need_lib_prefix=no - need_version=no - case $host_cpu in - ia64*) - shrext_cmds='.so' - hardcode_into_libs=yes - dynamic_linker="$host_os dld.so" - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - if test "X$HPUX_IA64_MODE" = X32; then - sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib" - else - sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64" - fi - sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec - ;; - hppa*64*) - shrext_cmds='.sl' - hardcode_into_libs=yes - dynamic_linker="$host_os dld.sl" - shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH - shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64" - sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec - ;; - *) - shrext_cmds='.sl' - dynamic_linker="$host_os dld.sl" - shlibpath_var=SHLIB_PATH - shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - ;; - esac - # HP-UX runs *really* slowly unless shared libraries are mode 555, ... - postinstall_cmds='chmod 555 $lib' - # or fails outright, so override atomically: - install_override_mode=555 - ;; - -interix[3-9]*) - version_type=linux # correct to gnu/linux during the next big refactor - need_lib_prefix=no - need_version=no - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)' - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=no - hardcode_into_libs=yes - ;; - -irix5* | irix6* | nonstopux*) - case $host_os in - nonstopux*) version_type=nonstopux ;; - *) - if test "$lt_cv_prog_gnu_ld" = yes; then - version_type=linux # correct to gnu/linux during the next big refactor - else - version_type=irix - fi ;; - esac - need_lib_prefix=no - need_version=no - soname_spec='${libname}${release}${shared_ext}$major' - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}' - case $host_os in - irix5* | nonstopux*) - libsuff= shlibsuff= - ;; - *) - case $LD in # libtool.m4 will add one of these switches to LD - *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") - libsuff= shlibsuff= libmagic=32-bit;; - *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") - libsuff=32 shlibsuff=N32 libmagic=N32;; - *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") - libsuff=64 shlibsuff=64 libmagic=64-bit;; - *) libsuff= shlibsuff= libmagic=never-match;; - esac - ;; - esac - shlibpath_var=LD_LIBRARY${shlibsuff}_PATH - shlibpath_overrides_runpath=no - sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}" - sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}" - hardcode_into_libs=yes - ;; - -# No shared lib support for Linux oldld, aout, or coff. -linux*oldld* | linux*aout* | linux*coff*) - dynamic_linker=no - ;; - -# This must be glibc/ELF. -linux* | k*bsd*-gnu | kopensolaris*-gnu) - version_type=linux # correct to gnu/linux during the next big refactor - need_lib_prefix=no - need_version=no - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=no - - # Some binutils ld are patched to set DT_RUNPATH - if ${lt_cv_shlibpath_overrides_runpath+:} false; then : - $as_echo_n "(cached) " >&6 -else - lt_cv_shlibpath_overrides_runpath=no - save_LDFLAGS=$LDFLAGS - save_libdir=$libdir - eval "libdir=/foo; wl=\"$lt_prog_compiler_wl\"; \ - LDFLAGS=\"\$LDFLAGS $hardcode_libdir_flag_spec\"" - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -int -main () -{ - - ; - return 0; -} -_ACEOF -if ac_fn_c_try_link "$LINENO"; then : - if ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir" >/dev/null; then : - lt_cv_shlibpath_overrides_runpath=yes -fi -fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext - LDFLAGS=$save_LDFLAGS - libdir=$save_libdir - -fi - - shlibpath_overrides_runpath=$lt_cv_shlibpath_overrides_runpath - - # This implies no fast_install, which is unacceptable. - # Some rework will be needed to allow for fast_install - # before this can be enabled. - hardcode_into_libs=yes - - # Append ld.so.conf contents to the search path - if test -f /etc/ld.so.conf; then - lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \$2)); skip = 1; } { if (!skip) print \$0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[ ]*hwcap[ ]/d;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;s/"//g;/^$/d' | tr '\n' ' '` - sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra" - fi - - # We used to test for /lib/ld.so.1 and disable shared libraries on - # powerpc, because MkLinux only supported shared libraries with the - # GNU dynamic linker. Since this was broken with cross compilers, - # most powerpc-linux boxes support dynamic linking these days and - # people can always --disable-shared, the test was removed, and we - # assume the GNU/Linux dynamic linker is in use. - dynamic_linker='GNU/Linux ld.so' - ;; - -netbsdelf*-gnu) - version_type=linux - need_lib_prefix=no - need_version=no - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=no - hardcode_into_libs=yes - dynamic_linker='NetBSD ld.elf_so' - ;; - -netbsd*) - version_type=sunos - need_lib_prefix=no - need_version=no - if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' - finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' - dynamic_linker='NetBSD (a.out) ld.so' - else - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - dynamic_linker='NetBSD ld.elf_so' - fi - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=yes - hardcode_into_libs=yes - ;; - -newsos6) - version_type=linux # correct to gnu/linux during the next big refactor - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=yes - ;; - -*nto* | *qnx*) - version_type=qnx - need_lib_prefix=no - need_version=no - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=no - hardcode_into_libs=yes - dynamic_linker='ldqnx.so' - ;; - -openbsd*) - version_type=sunos - sys_lib_dlsearch_path_spec="/usr/lib" - need_lib_prefix=no - # Some older versions of OpenBSD (3.3 at least) *do* need versioned libs. - case $host_os in - openbsd3.3 | openbsd3.3.*) need_version=yes ;; - *) need_version=no ;; - esac - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' - finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' - shlibpath_var=LD_LIBRARY_PATH - if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then - case $host_os in - openbsd2.[89] | openbsd2.[89].*) - shlibpath_overrides_runpath=no - ;; - *) - shlibpath_overrides_runpath=yes - ;; - esac - else - shlibpath_overrides_runpath=yes - fi - ;; - -os2*) - libname_spec='$name' - shrext_cmds=".dll" - need_lib_prefix=no - library_names_spec='$libname${shared_ext} $libname.a' - dynamic_linker='OS/2 ld.exe' - shlibpath_var=LIBPATH - ;; - -osf3* | osf4* | osf5*) - version_type=osf - need_lib_prefix=no - need_version=no - soname_spec='${libname}${release}${shared_ext}$major' - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - shlibpath_var=LD_LIBRARY_PATH - sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib" - sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec" - ;; - -rdos*) - dynamic_linker=no - ;; - -solaris*) - version_type=linux # correct to gnu/linux during the next big refactor - need_lib_prefix=no - need_version=no - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=yes - hardcode_into_libs=yes - # ldd complains unless libraries are executable - postinstall_cmds='chmod +x $lib' - ;; - -sunos4*) - version_type=sunos - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' - finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir' - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=yes - if test "$with_gnu_ld" = yes; then - need_lib_prefix=no - fi - need_version=yes - ;; - -sysv4 | sysv4.3*) - version_type=linux # correct to gnu/linux during the next big refactor - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - shlibpath_var=LD_LIBRARY_PATH - case $host_vendor in - sni) - shlibpath_overrides_runpath=no - need_lib_prefix=no - runpath_var=LD_RUN_PATH - ;; - siemens) - need_lib_prefix=no - ;; - motorola) - need_lib_prefix=no - need_version=no - shlibpath_overrides_runpath=no - sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib' - ;; - esac - ;; - -sysv4*MP*) - if test -d /usr/nec ;then - version_type=linux # correct to gnu/linux during the next big refactor - library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}' - soname_spec='$libname${shared_ext}.$major' - shlibpath_var=LD_LIBRARY_PATH - fi - ;; - -sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) - version_type=freebsd-elf - need_lib_prefix=no - need_version=no - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=yes - hardcode_into_libs=yes - if test "$with_gnu_ld" = yes; then - sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib' - else - sys_lib_search_path_spec='/usr/ccs/lib /usr/lib' - case $host_os in - sco3.2v5*) - sys_lib_search_path_spec="$sys_lib_search_path_spec /lib" - ;; - esac - fi - sys_lib_dlsearch_path_spec='/usr/lib' - ;; - -tpf*) - # TPF is a cross-target only. Preferred cross-host = GNU/Linux. - version_type=linux # correct to gnu/linux during the next big refactor - need_lib_prefix=no - need_version=no - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=no - hardcode_into_libs=yes - ;; - -uts4*) - version_type=linux # correct to gnu/linux during the next big refactor - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - shlibpath_var=LD_LIBRARY_PATH - ;; - -*) - dynamic_linker=no - ;; -esac -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $dynamic_linker" >&5 -$as_echo "$dynamic_linker" >&6; } -test "$dynamic_linker" = no && can_build_shared=no - -variables_saved_for_relink="PATH $shlibpath_var $runpath_var" -if test "$GCC" = yes; then - variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" -fi - -if test "${lt_cv_sys_lib_search_path_spec+set}" = set; then - sys_lib_search_path_spec="$lt_cv_sys_lib_search_path_spec" -fi -if test "${lt_cv_sys_lib_dlsearch_path_spec+set}" = set; then - sys_lib_dlsearch_path_spec="$lt_cv_sys_lib_dlsearch_path_spec" -fi - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to hardcode library paths into programs" >&5 -$as_echo_n "checking how to hardcode library paths into programs... " >&6; } -hardcode_action= -if test -n "$hardcode_libdir_flag_spec" || - test -n "$runpath_var" || - test "X$hardcode_automatic" = "Xyes" ; then - - # We can hardcode non-existent directories. - if test "$hardcode_direct" != no && - # If the only mechanism to avoid hardcoding is shlibpath_var, we - # have to relink, otherwise we might link with an installed library - # when we should be linking with a yet-to-be-installed one - ## test "$_LT_TAGVAR(hardcode_shlibpath_var, )" != no && - test "$hardcode_minus_L" != no; then - # Linking always hardcodes the temporary library directory. - hardcode_action=relink - else - # We can link without hardcoding, and we can hardcode nonexisting dirs. - hardcode_action=immediate - fi -else - # We cannot hardcode anything, or else we can only hardcode existing - # directories. - hardcode_action=unsupported -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $hardcode_action" >&5 -$as_echo "$hardcode_action" >&6; } - -if test "$hardcode_action" = relink || - test "$inherit_rpath" = yes; then - # Fast installation is not supported - enable_fast_install=no -elif test "$shlibpath_overrides_runpath" = yes || - test "$enable_shared" = no; then - # Fast installation is not necessary - enable_fast_install=needless -fi - - - - - - - if test "x$enable_dlopen" != xyes; then - enable_dlopen=unknown - enable_dlopen_self=unknown - enable_dlopen_self_static=unknown -else - lt_cv_dlopen=no - lt_cv_dlopen_libs= - - case $host_os in - beos*) - lt_cv_dlopen="load_add_on" - lt_cv_dlopen_libs= - lt_cv_dlopen_self=yes - ;; - - mingw* | pw32* | cegcc*) - lt_cv_dlopen="LoadLibrary" - lt_cv_dlopen_libs= - ;; - - cygwin*) - lt_cv_dlopen="dlopen" - lt_cv_dlopen_libs= - ;; - - darwin*) - # if libdl is installed we need to link against it - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5 -$as_echo_n "checking for dlopen in -ldl... " >&6; } -if ${ac_cv_lib_dl_dlopen+:} false; then : - $as_echo_n "(cached) " >&6 -else - ac_check_lib_save_LIBS=$LIBS -LIBS="-ldl $LIBS" -cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -/* Override any GCC internal prototype to avoid an error. - Use char because int might match the return type of a GCC - builtin and then its argument prototype would still apply. */ -#ifdef __cplusplus -extern "C" -#endif -char dlopen (); -int -main () -{ -return dlopen (); - ; - return 0; -} -_ACEOF -if ac_fn_c_try_link "$LINENO"; then : - ac_cv_lib_dl_dlopen=yes -else - ac_cv_lib_dl_dlopen=no -fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext -LIBS=$ac_check_lib_save_LIBS -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5 -$as_echo "$ac_cv_lib_dl_dlopen" >&6; } -if test "x$ac_cv_lib_dl_dlopen" = xyes; then : - lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl" -else - - lt_cv_dlopen="dyld" - lt_cv_dlopen_libs= - lt_cv_dlopen_self=yes - -fi - - ;; - - *) - ac_fn_c_check_func "$LINENO" "shl_load" "ac_cv_func_shl_load" -if test "x$ac_cv_func_shl_load" = xyes; then : - lt_cv_dlopen="shl_load" -else - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for shl_load in -ldld" >&5 -$as_echo_n "checking for shl_load in -ldld... " >&6; } -if ${ac_cv_lib_dld_shl_load+:} false; then : - $as_echo_n "(cached) " >&6 -else - ac_check_lib_save_LIBS=$LIBS -LIBS="-ldld $LIBS" -cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -/* Override any GCC internal prototype to avoid an error. - Use char because int might match the return type of a GCC - builtin and then its argument prototype would still apply. */ -#ifdef __cplusplus -extern "C" -#endif -char shl_load (); -int -main () -{ -return shl_load (); - ; - return 0; -} -_ACEOF -if ac_fn_c_try_link "$LINENO"; then : - ac_cv_lib_dld_shl_load=yes -else - ac_cv_lib_dld_shl_load=no -fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext -LIBS=$ac_check_lib_save_LIBS -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dld_shl_load" >&5 -$as_echo "$ac_cv_lib_dld_shl_load" >&6; } -if test "x$ac_cv_lib_dld_shl_load" = xyes; then : - lt_cv_dlopen="shl_load" lt_cv_dlopen_libs="-ldld" -else - ac_fn_c_check_func "$LINENO" "dlopen" "ac_cv_func_dlopen" -if test "x$ac_cv_func_dlopen" = xyes; then : - lt_cv_dlopen="dlopen" -else - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5 -$as_echo_n "checking for dlopen in -ldl... " >&6; } -if ${ac_cv_lib_dl_dlopen+:} false; then : - $as_echo_n "(cached) " >&6 -else - ac_check_lib_save_LIBS=$LIBS -LIBS="-ldl $LIBS" -cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -/* Override any GCC internal prototype to avoid an error. - Use char because int might match the return type of a GCC - builtin and then its argument prototype would still apply. */ -#ifdef __cplusplus -extern "C" -#endif -char dlopen (); -int -main () -{ -return dlopen (); - ; - return 0; -} -_ACEOF -if ac_fn_c_try_link "$LINENO"; then : - ac_cv_lib_dl_dlopen=yes -else - ac_cv_lib_dl_dlopen=no -fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext -LIBS=$ac_check_lib_save_LIBS -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5 -$as_echo "$ac_cv_lib_dl_dlopen" >&6; } -if test "x$ac_cv_lib_dl_dlopen" = xyes; then : - lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl" -else - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -lsvld" >&5 -$as_echo_n "checking for dlopen in -lsvld... " >&6; } -if ${ac_cv_lib_svld_dlopen+:} false; then : - $as_echo_n "(cached) " >&6 -else - ac_check_lib_save_LIBS=$LIBS -LIBS="-lsvld $LIBS" -cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -/* Override any GCC internal prototype to avoid an error. - Use char because int might match the return type of a GCC - builtin and then its argument prototype would still apply. */ -#ifdef __cplusplus -extern "C" -#endif -char dlopen (); -int -main () -{ -return dlopen (); - ; - return 0; -} -_ACEOF -if ac_fn_c_try_link "$LINENO"; then : - ac_cv_lib_svld_dlopen=yes -else - ac_cv_lib_svld_dlopen=no -fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext -LIBS=$ac_check_lib_save_LIBS -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_svld_dlopen" >&5 -$as_echo "$ac_cv_lib_svld_dlopen" >&6; } -if test "x$ac_cv_lib_svld_dlopen" = xyes; then : - lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-lsvld" -else - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dld_link in -ldld" >&5 -$as_echo_n "checking for dld_link in -ldld... " >&6; } -if ${ac_cv_lib_dld_dld_link+:} false; then : - $as_echo_n "(cached) " >&6 -else - ac_check_lib_save_LIBS=$LIBS -LIBS="-ldld $LIBS" -cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -/* Override any GCC internal prototype to avoid an error. - Use char because int might match the return type of a GCC - builtin and then its argument prototype would still apply. */ -#ifdef __cplusplus -extern "C" -#endif -char dld_link (); -int -main () -{ -return dld_link (); - ; - return 0; -} -_ACEOF -if ac_fn_c_try_link "$LINENO"; then : - ac_cv_lib_dld_dld_link=yes -else - ac_cv_lib_dld_dld_link=no -fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext -LIBS=$ac_check_lib_save_LIBS -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dld_dld_link" >&5 -$as_echo "$ac_cv_lib_dld_dld_link" >&6; } -if test "x$ac_cv_lib_dld_dld_link" = xyes; then : - lt_cv_dlopen="dld_link" lt_cv_dlopen_libs="-ldld" -fi - - -fi - - -fi - - -fi - - -fi - - -fi - - ;; - esac - - if test "x$lt_cv_dlopen" != xno; then - enable_dlopen=yes - else - enable_dlopen=no - fi - - case $lt_cv_dlopen in - dlopen) - save_CPPFLAGS="$CPPFLAGS" - test "x$ac_cv_header_dlfcn_h" = xyes && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H" - - save_LDFLAGS="$LDFLAGS" - wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\" - - save_LIBS="$LIBS" - LIBS="$lt_cv_dlopen_libs $LIBS" - - { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether a program can dlopen itself" >&5 -$as_echo_n "checking whether a program can dlopen itself... " >&6; } -if ${lt_cv_dlopen_self+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test "$cross_compiling" = yes; then : - lt_cv_dlopen_self=cross -else - lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 - lt_status=$lt_dlunknown - cat > conftest.$ac_ext <<_LT_EOF -#line $LINENO "configure" -#include "confdefs.h" - -#if HAVE_DLFCN_H -#include -#endif - -#include - -#ifdef RTLD_GLOBAL -# define LT_DLGLOBAL RTLD_GLOBAL -#else -# ifdef DL_GLOBAL -# define LT_DLGLOBAL DL_GLOBAL -# else -# define LT_DLGLOBAL 0 -# endif -#endif - -/* We may have to define LT_DLLAZY_OR_NOW in the command line if we - find out it does not work in some platform. */ -#ifndef LT_DLLAZY_OR_NOW -# ifdef RTLD_LAZY -# define LT_DLLAZY_OR_NOW RTLD_LAZY -# else -# ifdef DL_LAZY -# define LT_DLLAZY_OR_NOW DL_LAZY -# else -# ifdef RTLD_NOW -# define LT_DLLAZY_OR_NOW RTLD_NOW -# else -# ifdef DL_NOW -# define LT_DLLAZY_OR_NOW DL_NOW -# else -# define LT_DLLAZY_OR_NOW 0 -# endif -# endif -# endif -# endif -#endif - -/* When -fvisbility=hidden is used, assume the code has been annotated - correspondingly for the symbols needed. */ -#if defined(__GNUC__) && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3)) -int fnord () __attribute__((visibility("default"))); -#endif - -int fnord () { return 42; } -int main () -{ - void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); - int status = $lt_dlunknown; - - if (self) - { - if (dlsym (self,"fnord")) status = $lt_dlno_uscore; - else - { - if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; - else puts (dlerror ()); - } - /* dlclose (self); */ - } - else - puts (dlerror ()); - - return status; -} -_LT_EOF - if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5 - (eval $ac_link) 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } && test -s conftest${ac_exeext} 2>/dev/null; then - (./conftest; exit; ) >&5 2>/dev/null - lt_status=$? - case x$lt_status in - x$lt_dlno_uscore) lt_cv_dlopen_self=yes ;; - x$lt_dlneed_uscore) lt_cv_dlopen_self=yes ;; - x$lt_dlunknown|x*) lt_cv_dlopen_self=no ;; - esac - else : - # compilation failed - lt_cv_dlopen_self=no - fi -fi -rm -fr conftest* - - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_dlopen_self" >&5 -$as_echo "$lt_cv_dlopen_self" >&6; } - - if test "x$lt_cv_dlopen_self" = xyes; then - wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $lt_prog_compiler_static\" - { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether a statically linked program can dlopen itself" >&5 -$as_echo_n "checking whether a statically linked program can dlopen itself... " >&6; } -if ${lt_cv_dlopen_self_static+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test "$cross_compiling" = yes; then : - lt_cv_dlopen_self_static=cross -else - lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 - lt_status=$lt_dlunknown - cat > conftest.$ac_ext <<_LT_EOF -#line $LINENO "configure" -#include "confdefs.h" - -#if HAVE_DLFCN_H -#include -#endif - -#include - -#ifdef RTLD_GLOBAL -# define LT_DLGLOBAL RTLD_GLOBAL -#else -# ifdef DL_GLOBAL -# define LT_DLGLOBAL DL_GLOBAL -# else -# define LT_DLGLOBAL 0 -# endif -#endif - -/* We may have to define LT_DLLAZY_OR_NOW in the command line if we - find out it does not work in some platform. */ -#ifndef LT_DLLAZY_OR_NOW -# ifdef RTLD_LAZY -# define LT_DLLAZY_OR_NOW RTLD_LAZY -# else -# ifdef DL_LAZY -# define LT_DLLAZY_OR_NOW DL_LAZY -# else -# ifdef RTLD_NOW -# define LT_DLLAZY_OR_NOW RTLD_NOW -# else -# ifdef DL_NOW -# define LT_DLLAZY_OR_NOW DL_NOW -# else -# define LT_DLLAZY_OR_NOW 0 -# endif -# endif -# endif -# endif -#endif - -/* When -fvisbility=hidden is used, assume the code has been annotated - correspondingly for the symbols needed. */ -#if defined(__GNUC__) && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3)) -int fnord () __attribute__((visibility("default"))); -#endif - -int fnord () { return 42; } -int main () -{ - void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); - int status = $lt_dlunknown; - - if (self) - { - if (dlsym (self,"fnord")) status = $lt_dlno_uscore; - else - { - if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; - else puts (dlerror ()); - } - /* dlclose (self); */ - } - else - puts (dlerror ()); - - return status; -} -_LT_EOF - if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5 - (eval $ac_link) 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } && test -s conftest${ac_exeext} 2>/dev/null; then - (./conftest; exit; ) >&5 2>/dev/null - lt_status=$? - case x$lt_status in - x$lt_dlno_uscore) lt_cv_dlopen_self_static=yes ;; - x$lt_dlneed_uscore) lt_cv_dlopen_self_static=yes ;; - x$lt_dlunknown|x*) lt_cv_dlopen_self_static=no ;; - esac - else : - # compilation failed - lt_cv_dlopen_self_static=no - fi -fi -rm -fr conftest* - - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_dlopen_self_static" >&5 -$as_echo "$lt_cv_dlopen_self_static" >&6; } - fi - - CPPFLAGS="$save_CPPFLAGS" - LDFLAGS="$save_LDFLAGS" - LIBS="$save_LIBS" - ;; - esac - - case $lt_cv_dlopen_self in - yes|no) enable_dlopen_self=$lt_cv_dlopen_self ;; - *) enable_dlopen_self=unknown ;; - esac - - case $lt_cv_dlopen_self_static in - yes|no) enable_dlopen_self_static=$lt_cv_dlopen_self_static ;; - *) enable_dlopen_self_static=unknown ;; - esac -fi - - - - - - - - - - - - - - - - - -striplib= -old_striplib= -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether stripping libraries is possible" >&5 -$as_echo_n "checking whether stripping libraries is possible... " >&6; } -if test -n "$STRIP" && $STRIP -V 2>&1 | $GREP "GNU strip" >/dev/null; then - test -z "$old_striplib" && old_striplib="$STRIP --strip-debug" - test -z "$striplib" && striplib="$STRIP --strip-unneeded" - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; } -else -# FIXME - insert some real tests, host_os isn't really good enough - case $host_os in - darwin*) - if test -n "$STRIP" ; then - striplib="$STRIP -x" - old_striplib="$STRIP -S" - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; } - else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } - fi - ;; - *) - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } - ;; - esac -fi - - - - - - - - - - - - - # Report which library types will actually be built - { $as_echo "$as_me:${as_lineno-$LINENO}: checking if libtool supports shared libraries" >&5 -$as_echo_n "checking if libtool supports shared libraries... " >&6; } - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $can_build_shared" >&5 -$as_echo "$can_build_shared" >&6; } - - { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build shared libraries" >&5 -$as_echo_n "checking whether to build shared libraries... " >&6; } - test "$can_build_shared" = "no" && enable_shared=no - - # On AIX, shared libraries and static libraries use the same namespace, and - # are all built from PIC. - case $host_os in - aix3*) - test "$enable_shared" = yes && enable_static=no - if test -n "$RANLIB"; then - archive_cmds="$archive_cmds~\$RANLIB \$lib" - postinstall_cmds='$RANLIB $lib' - fi - ;; - - aix[4-9]*) - if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then - test "$enable_shared" = yes && enable_static=no - fi - ;; - esac - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_shared" >&5 -$as_echo "$enable_shared" >&6; } - - { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build static libraries" >&5 -$as_echo_n "checking whether to build static libraries... " >&6; } - # Make sure either enable_shared or enable_static is yes. - test "$enable_shared" = yes || enable_static=yes - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_static" >&5 -$as_echo "$enable_static" >&6; } - - - - -fi -ac_ext=c -ac_cpp='$CPP $CPPFLAGS' -ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_c_compiler_gnu - -CC="$lt_save_CC" - - if test -n "$CXX" && ( test "X$CXX" != "Xno" && - ( (test "X$CXX" = "Xg++" && `g++ -v >/dev/null 2>&1` ) || - (test "X$CXX" != "Xg++"))) ; then - ac_ext=cpp -ac_cpp='$CXXCPP $CPPFLAGS' -ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_cxx_compiler_gnu -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C++ preprocessor" >&5 -$as_echo_n "checking how to run the C++ preprocessor... " >&6; } -if test -z "$CXXCPP"; then - if ${ac_cv_prog_CXXCPP+:} false; then : - $as_echo_n "(cached) " >&6 -else - # Double quotes because CXXCPP needs to be expanded - for CXXCPP in "$CXX -E" "/lib/cpp" - do - ac_preproc_ok=false -for ac_cxx_preproc_warn_flag in '' yes -do - # Use a header file that comes with gcc, so configuring glibc - # with a fresh cross-compiler works. - # Prefer to if __STDC__ is defined, since - # exists even on freestanding compilers. - # On the NeXT, cc -E runs the code through the compiler's parser, - # not just through cpp. "Syntax error" is here to catch this case. - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -@%:@ifdef __STDC__ -@%:@ include -@%:@else -@%:@ include -@%:@endif - Syntax error -_ACEOF -if ac_fn_cxx_try_cpp "$LINENO"; then : - -else - # Broken: fails on valid input. -continue -fi -rm -f conftest.err conftest.i conftest.$ac_ext - - # OK, works on sane cases. Now check whether nonexistent headers - # can be detected and how. - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -@%:@include -_ACEOF -if ac_fn_cxx_try_cpp "$LINENO"; then : - # Broken: success on invalid input. -continue -else - # Passes both tests. -ac_preproc_ok=: -break -fi -rm -f conftest.err conftest.i conftest.$ac_ext - -done -# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. -rm -f conftest.i conftest.err conftest.$ac_ext -if $ac_preproc_ok; then : - break -fi - - done - ac_cv_prog_CXXCPP=$CXXCPP - -fi - CXXCPP=$ac_cv_prog_CXXCPP -else - ac_cv_prog_CXXCPP=$CXXCPP -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $CXXCPP" >&5 -$as_echo "$CXXCPP" >&6; } -ac_preproc_ok=false -for ac_cxx_preproc_warn_flag in '' yes -do - # Use a header file that comes with gcc, so configuring glibc - # with a fresh cross-compiler works. - # Prefer to if __STDC__ is defined, since - # exists even on freestanding compilers. - # On the NeXT, cc -E runs the code through the compiler's parser, - # not just through cpp. "Syntax error" is here to catch this case. - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -@%:@ifdef __STDC__ -@%:@ include -@%:@else -@%:@ include -@%:@endif - Syntax error -_ACEOF -if ac_fn_cxx_try_cpp "$LINENO"; then : - -else - # Broken: fails on valid input. -continue -fi -rm -f conftest.err conftest.i conftest.$ac_ext - - # OK, works on sane cases. Now check whether nonexistent headers - # can be detected and how. - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -@%:@include -_ACEOF -if ac_fn_cxx_try_cpp "$LINENO"; then : - # Broken: success on invalid input. -continue -else - # Passes both tests. -ac_preproc_ok=: -break -fi -rm -f conftest.err conftest.i conftest.$ac_ext - -done -# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. -rm -f conftest.i conftest.err conftest.$ac_ext -if $ac_preproc_ok; then : - -else - { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 -$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} -as_fn_error $? "C++ preprocessor \"$CXXCPP\" fails sanity check -See \`config.log' for more details" "$LINENO" 5; } -fi - -ac_ext=c -ac_cpp='$CPP $CPPFLAGS' -ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_c_compiler_gnu - -else - _lt_caught_CXX_error=yes -fi - -ac_ext=cpp -ac_cpp='$CXXCPP $CPPFLAGS' -ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_cxx_compiler_gnu - -archive_cmds_need_lc_CXX=no -allow_undefined_flag_CXX= -always_export_symbols_CXX=no -archive_expsym_cmds_CXX= -compiler_needs_object_CXX=no -export_dynamic_flag_spec_CXX= -hardcode_direct_CXX=no -hardcode_direct_absolute_CXX=no -hardcode_libdir_flag_spec_CXX= -hardcode_libdir_separator_CXX= -hardcode_minus_L_CXX=no -hardcode_shlibpath_var_CXX=unsupported -hardcode_automatic_CXX=no -inherit_rpath_CXX=no -module_cmds_CXX= -module_expsym_cmds_CXX= -link_all_deplibs_CXX=unknown -old_archive_cmds_CXX=$old_archive_cmds -reload_flag_CXX=$reload_flag -reload_cmds_CXX=$reload_cmds -no_undefined_flag_CXX= -whole_archive_flag_spec_CXX= -enable_shared_with_static_runtimes_CXX=no - -# Source file extension for C++ test sources. -ac_ext=cpp - -# Object file extension for compiled C++ test sources. -objext=o -objext_CXX=$objext - -# No sense in running all these tests if we already determined that -# the CXX compiler isn't working. Some variables (like enable_shared) -# are currently assumed to apply to all compilers on this platform, -# and will be corrupted by setting them based on a non-working compiler. -if test "$_lt_caught_CXX_error" != yes; then - # Code to be used in simple compile tests - lt_simple_compile_test_code="int some_variable = 0;" - - # Code to be used in simple link tests - lt_simple_link_test_code='int main(int, char *[]) { return(0); }' - - # ltmain only uses $CC for tagged configurations so make sure $CC is set. - - - - - - -# If no C compiler was specified, use CC. -LTCC=${LTCC-"$CC"} - -# If no C compiler flags were specified, use CFLAGS. -LTCFLAGS=${LTCFLAGS-"$CFLAGS"} - -# Allow CC to be a program name with arguments. -compiler=$CC - - - # save warnings/boilerplate of simple test code - ac_outfile=conftest.$ac_objext -echo "$lt_simple_compile_test_code" >conftest.$ac_ext -eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err -_lt_compiler_boilerplate=`cat conftest.err` -$RM conftest* - - ac_outfile=conftest.$ac_objext -echo "$lt_simple_link_test_code" >conftest.$ac_ext -eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err -_lt_linker_boilerplate=`cat conftest.err` -$RM -r conftest* - - - # Allow CC to be a program name with arguments. - lt_save_CC=$CC - lt_save_CFLAGS=$CFLAGS - lt_save_LD=$LD - lt_save_GCC=$GCC - GCC=$GXX - lt_save_with_gnu_ld=$with_gnu_ld - lt_save_path_LD=$lt_cv_path_LD - if test -n "${lt_cv_prog_gnu_ldcxx+set}"; then - lt_cv_prog_gnu_ld=$lt_cv_prog_gnu_ldcxx - else - $as_unset lt_cv_prog_gnu_ld - fi - if test -n "${lt_cv_path_LDCXX+set}"; then - lt_cv_path_LD=$lt_cv_path_LDCXX - else - $as_unset lt_cv_path_LD - fi - test -z "${LDCXX+set}" || LD=$LDCXX - CC=${CXX-"c++"} - CFLAGS=$CXXFLAGS - compiler=$CC - compiler_CXX=$CC - for cc_temp in $compiler""; do - case $cc_temp in - compile | *[\\/]compile | ccache | *[\\/]ccache ) ;; - distcc | *[\\/]distcc | purify | *[\\/]purify ) ;; - \-*) ;; - *) break;; - esac -done -cc_basename=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"` - - - if test -n "$compiler"; then - # We don't want -fno-exception when compiling C++ code, so set the - # no_builtin_flag separately - if test "$GXX" = yes; then - lt_prog_compiler_no_builtin_flag_CXX=' -fno-builtin' - else - lt_prog_compiler_no_builtin_flag_CXX= - fi - - if test "$GXX" = yes; then - # Set up default GNU C++ configuration - - - -@%:@ Check whether --with-gnu-ld was given. -if test "${with_gnu_ld+set}" = set; then : - withval=$with_gnu_ld; test "$withval" = no || with_gnu_ld=yes -else - with_gnu_ld=no -fi - -ac_prog=ld -if test "$GCC" = yes; then - # Check if gcc -print-prog-name=ld gives a path. - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ld used by $CC" >&5 -$as_echo_n "checking for ld used by $CC... " >&6; } - case $host in - *-*-mingw*) - # gcc leaves a trailing carriage return which upsets mingw - ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;; - *) - ac_prog=`($CC -print-prog-name=ld) 2>&5` ;; - esac - case $ac_prog in - # Accept absolute paths. - [\\/]* | ?:[\\/]*) - re_direlt='/[^/][^/]*/\.\./' - # Canonicalize the pathname of ld - ac_prog=`$ECHO "$ac_prog"| $SED 's%\\\\%/%g'` - while $ECHO "$ac_prog" | $GREP "$re_direlt" > /dev/null 2>&1; do - ac_prog=`$ECHO $ac_prog| $SED "s%$re_direlt%/%"` - done - test -z "$LD" && LD="$ac_prog" - ;; - "") - # If it fails, then pretend we aren't using GCC. - ac_prog=ld - ;; - *) - # If it is relative, then search for the first ld in PATH. - with_gnu_ld=unknown - ;; - esac -elif test "$with_gnu_ld" = yes; then - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU ld" >&5 -$as_echo_n "checking for GNU ld... " >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for non-GNU ld" >&5 -$as_echo_n "checking for non-GNU ld... " >&6; } -fi -if ${lt_cv_path_LD+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -z "$LD"; then - lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR - for ac_dir in $PATH; do - IFS="$lt_save_ifs" - test -z "$ac_dir" && ac_dir=. - if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then - lt_cv_path_LD="$ac_dir/$ac_prog" - # Check to see if the program is GNU ld. I'd rather use --version, - # but apparently some variants of GNU ld only accept -v. - # Break only if it was the GNU/non-GNU ld that we prefer. - case `"$lt_cv_path_LD" -v 2>&1 &5 -$as_echo "$LD" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi -test -z "$LD" && as_fn_error $? "no acceptable ld found in \$PATH" "$LINENO" 5 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if the linker ($LD) is GNU ld" >&5 -$as_echo_n "checking if the linker ($LD) is GNU ld... " >&6; } -if ${lt_cv_prog_gnu_ld+:} false; then : - $as_echo_n "(cached) " >&6 -else - # I'd rather use --version here, but apparently some GNU lds only accept -v. -case `$LD -v 2>&1 &5 -$as_echo "$lt_cv_prog_gnu_ld" >&6; } -with_gnu_ld=$lt_cv_prog_gnu_ld - - - - - - - - # Check if GNU C++ uses GNU ld as the underlying linker, since the - # archiving commands below assume that GNU ld is being used. - if test "$with_gnu_ld" = yes; then - archive_cmds_CXX='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' - archive_expsym_cmds_CXX='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' - - hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir' - export_dynamic_flag_spec_CXX='${wl}--export-dynamic' - - # If archive_cmds runs LD, not CC, wlarc should be empty - # XXX I think wlarc can be eliminated in ltcf-cxx, but I need to - # investigate it a little bit more. (MM) - wlarc='${wl}' - - # ancient GNU ld didn't support --whole-archive et. al. - if eval "`$CC -print-prog-name=ld` --help 2>&1" | - $GREP 'no-whole-archive' > /dev/null; then - whole_archive_flag_spec_CXX="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' - else - whole_archive_flag_spec_CXX= - fi - else - with_gnu_ld=no - wlarc= - - # A generic and very simple default shared library creation - # command for GNU C++ for the case where it uses the native - # linker, instead of GNU ld. If possible, this setting should - # overridden to take advantage of the native linker features on - # the platform it is being used on. - archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib' - fi - - # Commands to make compiler produce verbose output that lists - # what "hidden" libraries, object files and flags are used when - # linking a shared library. - output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' - - else - GXX=no - with_gnu_ld=no - wlarc= - fi - - # PORTME: fill in a description of your system's C++ link characteristics - { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $compiler linker ($LD) supports shared libraries" >&5 -$as_echo_n "checking whether the $compiler linker ($LD) supports shared libraries... " >&6; } - ld_shlibs_CXX=yes - case $host_os in - aix3*) - # FIXME: insert proper C++ library support - ld_shlibs_CXX=no - ;; - aix[4-9]*) - if test "$host_cpu" = ia64; then - # On IA64, the linker does run time linking by default, so we don't - # have to do anything special. - aix_use_runtimelinking=no - exp_sym_flag='-Bexport' - no_entry_flag="" - else - aix_use_runtimelinking=no - - # Test if we are trying to use run time linking or normal - # AIX style linking. If -brtl is somewhere in LDFLAGS, we - # need to do runtime linking. - case $host_os in aix4.[23]|aix4.[23].*|aix[5-9]*) - for ld_flag in $LDFLAGS; do - case $ld_flag in - *-brtl*) - aix_use_runtimelinking=yes - break - ;; - esac - done - ;; - esac - - exp_sym_flag='-bexport' - no_entry_flag='-bnoentry' - fi - - # When large executables or shared objects are built, AIX ld can - # have problems creating the table of contents. If linking a library - # or program results in "error TOC overflow" add -mminimal-toc to - # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not - # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. - - archive_cmds_CXX='' - hardcode_direct_CXX=yes - hardcode_direct_absolute_CXX=yes - hardcode_libdir_separator_CXX=':' - link_all_deplibs_CXX=yes - file_list_spec_CXX='${wl}-f,' - - if test "$GXX" = yes; then - case $host_os in aix4.[012]|aix4.[012].*) - # We only want to do this on AIX 4.2 and lower, the check - # below for broken collect2 doesn't work under 4.3+ - collect2name=`${CC} -print-prog-name=collect2` - if test -f "$collect2name" && - strings "$collect2name" | $GREP resolve_lib_name >/dev/null - then - # We have reworked collect2 - : - else - # We have old collect2 - hardcode_direct_CXX=unsupported - # It fails to find uninstalled libraries when the uninstalled - # path is not listed in the libpath. Setting hardcode_minus_L - # to unsupported forces relinking - hardcode_minus_L_CXX=yes - hardcode_libdir_flag_spec_CXX='-L$libdir' - hardcode_libdir_separator_CXX= - fi - esac - shared_flag='-shared' - if test "$aix_use_runtimelinking" = yes; then - shared_flag="$shared_flag "'${wl}-G' - fi - else - # not using gcc - if test "$host_cpu" = ia64; then - # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release - # chokes on -Wl,-G. The following line is correct: - shared_flag='-G' - else - if test "$aix_use_runtimelinking" = yes; then - shared_flag='${wl}-G' - else - shared_flag='${wl}-bM:SRE' - fi - fi - fi - - export_dynamic_flag_spec_CXX='${wl}-bexpall' - # It seems that -bexpall does not export symbols beginning with - # underscore (_), so it is better to generate a list of symbols to - # export. - always_export_symbols_CXX=yes - if test "$aix_use_runtimelinking" = yes; then - # Warning - without using the other runtime loading flags (-brtl), - # -berok will link without error, but may produce a broken library. - allow_undefined_flag_CXX='-berok' - # Determine the default libpath from the value encoded in an empty - # executable. - if test "${lt_cv_aix_libpath+set}" = set; then - aix_libpath=$lt_cv_aix_libpath -else - if ${lt_cv_aix_libpath__CXX+:} false; then : - $as_echo_n "(cached) " >&6 -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -int -main () -{ - - ; - return 0; -} -_ACEOF -if ac_fn_cxx_try_link "$LINENO"; then : - - lt_aix_libpath_sed=' - /Import File Strings/,/^$/ { - /^0/ { - s/^0 *\([^ ]*\) *$/\1/ - p - } - }' - lt_cv_aix_libpath__CXX=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` - # Check for a 64-bit object if we didn't find anything. - if test -z "$lt_cv_aix_libpath__CXX"; then - lt_cv_aix_libpath__CXX=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` - fi -fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext - if test -z "$lt_cv_aix_libpath__CXX"; then - lt_cv_aix_libpath__CXX="/usr/lib:/lib" - fi - -fi - - aix_libpath=$lt_cv_aix_libpath__CXX -fi - - hardcode_libdir_flag_spec_CXX='${wl}-blibpath:$libdir:'"$aix_libpath" - - archive_expsym_cmds_CXX='$CC -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then func_echo_all "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag" - else - if test "$host_cpu" = ia64; then - hardcode_libdir_flag_spec_CXX='${wl}-R $libdir:/usr/lib:/lib' - allow_undefined_flag_CXX="-z nodefs" - archive_expsym_cmds_CXX="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols" - else - # Determine the default libpath from the value encoded in an - # empty executable. - if test "${lt_cv_aix_libpath+set}" = set; then - aix_libpath=$lt_cv_aix_libpath -else - if ${lt_cv_aix_libpath__CXX+:} false; then : - $as_echo_n "(cached) " >&6 -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -int -main () -{ - - ; - return 0; -} -_ACEOF -if ac_fn_cxx_try_link "$LINENO"; then : - - lt_aix_libpath_sed=' - /Import File Strings/,/^$/ { - /^0/ { - s/^0 *\([^ ]*\) *$/\1/ - p - } - }' - lt_cv_aix_libpath__CXX=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` - # Check for a 64-bit object if we didn't find anything. - if test -z "$lt_cv_aix_libpath__CXX"; then - lt_cv_aix_libpath__CXX=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` - fi -fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext - if test -z "$lt_cv_aix_libpath__CXX"; then - lt_cv_aix_libpath__CXX="/usr/lib:/lib" - fi - -fi - - aix_libpath=$lt_cv_aix_libpath__CXX -fi - - hardcode_libdir_flag_spec_CXX='${wl}-blibpath:$libdir:'"$aix_libpath" - # Warning - without using the other run time loading flags, - # -berok will link without error, but may produce a broken library. - no_undefined_flag_CXX=' ${wl}-bernotok' - allow_undefined_flag_CXX=' ${wl}-berok' - if test "$with_gnu_ld" = yes; then - # We only use this code for GNU lds that support --whole-archive. - whole_archive_flag_spec_CXX='${wl}--whole-archive$convenience ${wl}--no-whole-archive' - else - # Exported symbols can be pulled into shared objects from archives - whole_archive_flag_spec_CXX='$convenience' - fi - archive_cmds_need_lc_CXX=yes - # This is similar to how AIX traditionally builds its shared - # libraries. - archive_expsym_cmds_CXX="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' - fi - fi - ;; - - beos*) - if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then - allow_undefined_flag_CXX=unsupported - # Joseph Beckenbach says some releases of gcc - # support --undefined. This deserves some investigation. FIXME - archive_cmds_CXX='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' - else - ld_shlibs_CXX=no - fi - ;; - - chorus*) - case $cc_basename in - *) - # FIXME: insert proper C++ library support - ld_shlibs_CXX=no - ;; - esac - ;; - - cygwin* | mingw* | pw32* | cegcc*) - case $GXX,$cc_basename in - ,cl* | no,cl*) - # Native MSVC - # hardcode_libdir_flag_spec is actually meaningless, as there is - # no search path for DLLs. - hardcode_libdir_flag_spec_CXX=' ' - allow_undefined_flag_CXX=unsupported - always_export_symbols_CXX=yes - file_list_spec_CXX='@' - # Tell ltmain to make .lib files, not .a files. - libext=lib - # Tell ltmain to make .dll files, not .so files. - shrext_cmds=".dll" - # FIXME: Setting linknames here is a bad hack. - archive_cmds_CXX='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-dll~linknames=' - archive_expsym_cmds_CXX='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then - $SED -n -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' -e '1\\\!p' < $export_symbols > $output_objdir/$soname.exp; - else - $SED -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' < $export_symbols > $output_objdir/$soname.exp; - fi~ - $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~ - linknames=' - # The linker will not automatically build a static lib if we build a DLL. - # _LT_TAGVAR(old_archive_from_new_cmds, CXX)='true' - enable_shared_with_static_runtimes_CXX=yes - # Don't use ranlib - old_postinstall_cmds_CXX='chmod 644 $oldlib' - postlink_cmds_CXX='lt_outputfile="@OUTPUT@"~ - lt_tool_outputfile="@TOOL_OUTPUT@"~ - case $lt_outputfile in - *.exe|*.EXE) ;; - *) - lt_outputfile="$lt_outputfile.exe" - lt_tool_outputfile="$lt_tool_outputfile.exe" - ;; - esac~ - func_to_tool_file "$lt_outputfile"~ - if test "$MANIFEST_TOOL" != ":" && test -f "$lt_outputfile.manifest"; then - $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1; - $RM "$lt_outputfile.manifest"; - fi' - ;; - *) - # g++ - # _LT_TAGVAR(hardcode_libdir_flag_spec, CXX) is actually meaningless, - # as there is no search path for DLLs. - hardcode_libdir_flag_spec_CXX='-L$libdir' - export_dynamic_flag_spec_CXX='${wl}--export-all-symbols' - allow_undefined_flag_CXX=unsupported - always_export_symbols_CXX=no - enable_shared_with_static_runtimes_CXX=yes - - if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then - archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' - # If the export-symbols file already is a .def file (1st line - # is EXPORTS), use it as is; otherwise, prepend... - archive_expsym_cmds_CXX='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then - cp $export_symbols $output_objdir/$soname.def; - else - echo EXPORTS > $output_objdir/$soname.def; - cat $export_symbols >> $output_objdir/$soname.def; - fi~ - $CC -shared -nostdlib $output_objdir/$soname.def $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' - else - ld_shlibs_CXX=no - fi - ;; - esac - ;; - darwin* | rhapsody*) - - - archive_cmds_need_lc_CXX=no - hardcode_direct_CXX=no - hardcode_automatic_CXX=yes - hardcode_shlibpath_var_CXX=unsupported - if test "$lt_cv_ld_force_load" = "yes"; then - whole_archive_flag_spec_CXX='`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience ${wl}-force_load,$conv\"; done; func_echo_all \"$new_convenience\"`' - - else - whole_archive_flag_spec_CXX='' - fi - link_all_deplibs_CXX=yes - allow_undefined_flag_CXX="$_lt_dar_allow_undefined" - case $cc_basename in - ifort*) _lt_dar_can_shared=yes ;; - *) _lt_dar_can_shared=$GCC ;; - esac - if test "$_lt_dar_can_shared" = "yes"; then - output_verbose_link_cmd=func_echo_all - archive_cmds_CXX="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod${_lt_dsymutil}" - module_cmds_CXX="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dsymutil}" - archive_expsym_cmds_CXX="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring ${_lt_dar_single_mod}${_lt_dar_export_syms}${_lt_dsymutil}" - module_expsym_cmds_CXX="sed -e 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dar_export_syms}${_lt_dsymutil}" - if test "$lt_cv_apple_cc_single_mod" != "yes"; then - archive_cmds_CXX="\$CC -r -keep_private_externs -nostdlib -o \${lib}-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \${lib}-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring${_lt_dsymutil}" - archive_expsym_cmds_CXX="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -r -keep_private_externs -nostdlib -o \${lib}-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \${lib}-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring${_lt_dar_export_syms}${_lt_dsymutil}" - fi - - else - ld_shlibs_CXX=no - fi - - ;; - - dgux*) - case $cc_basename in - ec++*) - # FIXME: insert proper C++ library support - ld_shlibs_CXX=no - ;; - ghcx*) - # Green Hills C++ Compiler - # FIXME: insert proper C++ library support - ld_shlibs_CXX=no - ;; - *) - # FIXME: insert proper C++ library support - ld_shlibs_CXX=no - ;; - esac - ;; - - freebsd2.*) - # C++ shared libraries reported to be fairly broken before - # switch to ELF - ld_shlibs_CXX=no - ;; - - freebsd-elf*) - archive_cmds_need_lc_CXX=no - ;; - - freebsd* | dragonfly*) - # FreeBSD 3 and later use GNU C++ and GNU ld with standard ELF - # conventions - ld_shlibs_CXX=yes - ;; - - gnu*) - ;; - - haiku*) - archive_cmds_CXX='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' - link_all_deplibs_CXX=yes - ;; - - hpux9*) - hardcode_libdir_flag_spec_CXX='${wl}+b ${wl}$libdir' - hardcode_libdir_separator_CXX=: - export_dynamic_flag_spec_CXX='${wl}-E' - hardcode_direct_CXX=yes - hardcode_minus_L_CXX=yes # Not in the search PATH, - # but as the default - # location of the library. - - case $cc_basename in - CC*) - # FIXME: insert proper C++ library support - ld_shlibs_CXX=no - ;; - aCC*) - archive_cmds_CXX='$RM $output_objdir/$soname~$CC -b ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' - # Commands to make compiler produce verbose output that lists - # what "hidden" libraries, object files and flags are used when - # linking a shared library. - # - # There doesn't appear to be a way to prevent this compiler from - # explicitly linking system object files so we need to strip them - # from the output so that they don't get included in the library - # dependencies. - output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $EGREP "\-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' - ;; - *) - if test "$GXX" = yes; then - archive_cmds_CXX='$RM $output_objdir/$soname~$CC -shared -nostdlib $pic_flag ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' - else - # FIXME: insert proper C++ library support - ld_shlibs_CXX=no - fi - ;; - esac - ;; - - hpux10*|hpux11*) - if test $with_gnu_ld = no; then - hardcode_libdir_flag_spec_CXX='${wl}+b ${wl}$libdir' - hardcode_libdir_separator_CXX=: - - case $host_cpu in - hppa*64*|ia64*) - ;; - *) - export_dynamic_flag_spec_CXX='${wl}-E' - ;; - esac - fi - case $host_cpu in - hppa*64*|ia64*) - hardcode_direct_CXX=no - hardcode_shlibpath_var_CXX=no - ;; - *) - hardcode_direct_CXX=yes - hardcode_direct_absolute_CXX=yes - hardcode_minus_L_CXX=yes # Not in the search PATH, - # but as the default - # location of the library. - ;; - esac - - case $cc_basename in - CC*) - # FIXME: insert proper C++ library support - ld_shlibs_CXX=no - ;; - aCC*) - case $host_cpu in - hppa*64*) - archive_cmds_CXX='$CC -b ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' - ;; - ia64*) - archive_cmds_CXX='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' - ;; - *) - archive_cmds_CXX='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' - ;; - esac - # Commands to make compiler produce verbose output that lists - # what "hidden" libraries, object files and flags are used when - # linking a shared library. - # - # There doesn't appear to be a way to prevent this compiler from - # explicitly linking system object files so we need to strip them - # from the output so that they don't get included in the library - # dependencies. - output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $GREP "\-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' - ;; - *) - if test "$GXX" = yes; then - if test $with_gnu_ld = no; then - case $host_cpu in - hppa*64*) - archive_cmds_CXX='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' - ;; - ia64*) - archive_cmds_CXX='$CC -shared -nostdlib $pic_flag ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' - ;; - *) - archive_cmds_CXX='$CC -shared -nostdlib $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' - ;; - esac - fi - else - # FIXME: insert proper C++ library support - ld_shlibs_CXX=no - fi - ;; - esac - ;; - - interix[3-9]*) - hardcode_direct_CXX=no - hardcode_shlibpath_var_CXX=no - hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir' - export_dynamic_flag_spec_CXX='${wl}-E' - # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. - # Instead, shared libraries are loaded at an image base (0x10000000 by - # default) and relocated if they conflict, which is a slow very memory - # consuming and fragmenting process. To avoid this, we pick a random, - # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link - # time. Moving up from 0x10000000 also allows more sbrk(2) space. - archive_cmds_CXX='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' - archive_expsym_cmds_CXX='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' - ;; - irix5* | irix6*) - case $cc_basename in - CC*) - # SGI C++ - archive_cmds_CXX='$CC -shared -all -multigot $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' - - # Archives containing C++ object files must be created using - # "CC -ar", where "CC" is the IRIX C++ compiler. This is - # necessary to make sure instantiated templates are included - # in the archive. - old_archive_cmds_CXX='$CC -ar -WR,-u -o $oldlib $oldobjs' - ;; - *) - if test "$GXX" = yes; then - if test "$with_gnu_ld" = no; then - archive_cmds_CXX='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' - else - archive_cmds_CXX='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` -o $lib' - fi - fi - link_all_deplibs_CXX=yes - ;; - esac - hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir' - hardcode_libdir_separator_CXX=: - inherit_rpath_CXX=yes - ;; - - linux* | k*bsd*-gnu | kopensolaris*-gnu) - case $cc_basename in - KCC*) - # Kuck and Associates, Inc. (KAI) C++ Compiler - - # KCC will only create a shared library if the output file - # ends with ".so" (or ".sl" for HP-UX), so rename the library - # to its proper name (with version) after linking. - archive_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' - archive_expsym_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib ${wl}-retain-symbols-file,$export_symbols; mv \$templib $lib' - # Commands to make compiler produce verbose output that lists - # what "hidden" libraries, object files and flags are used when - # linking a shared library. - # - # There doesn't appear to be a way to prevent this compiler from - # explicitly linking system object files so we need to strip them - # from the output so that they don't get included in the library - # dependencies. - output_verbose_link_cmd='templist=`$CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 | $GREP "ld"`; rm -f libconftest$shared_ext; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' - - hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir' - export_dynamic_flag_spec_CXX='${wl}--export-dynamic' - - # Archives containing C++ object files must be created using - # "CC -Bstatic", where "CC" is the KAI C++ compiler. - old_archive_cmds_CXX='$CC -Bstatic -o $oldlib $oldobjs' - ;; - icpc* | ecpc* ) - # Intel C++ - with_gnu_ld=yes - # version 8.0 and above of icpc choke on multiply defined symbols - # if we add $predep_objects and $postdep_objects, however 7.1 and - # earlier do not add the objects themselves. - case `$CC -V 2>&1` in - *"Version 7."*) - archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' - archive_expsym_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' - ;; - *) # Version 8.0 or newer - tmp_idyn= - case $host_cpu in - ia64*) tmp_idyn=' -i_dynamic';; - esac - archive_cmds_CXX='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' - archive_expsym_cmds_CXX='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' - ;; - esac - archive_cmds_need_lc_CXX=no - hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir' - export_dynamic_flag_spec_CXX='${wl}--export-dynamic' - whole_archive_flag_spec_CXX='${wl}--whole-archive$convenience ${wl}--no-whole-archive' - ;; - pgCC* | pgcpp*) - # Portland Group C++ compiler - case `$CC -V` in - *pgCC\ [1-5].* | *pgcpp\ [1-5].*) - prelink_cmds_CXX='tpldir=Template.dir~ - rm -rf $tpldir~ - $CC --prelink_objects --instantiation_dir $tpldir $objs $libobjs $compile_deplibs~ - compile_command="$compile_command `find $tpldir -name \*.o | sort | $NL2SP`"' - old_archive_cmds_CXX='tpldir=Template.dir~ - rm -rf $tpldir~ - $CC --prelink_objects --instantiation_dir $tpldir $oldobjs$old_deplibs~ - $AR $AR_FLAGS $oldlib$oldobjs$old_deplibs `find $tpldir -name \*.o | sort | $NL2SP`~ - $RANLIB $oldlib' - archive_cmds_CXX='tpldir=Template.dir~ - rm -rf $tpldir~ - $CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~ - $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname -o $lib' - archive_expsym_cmds_CXX='tpldir=Template.dir~ - rm -rf $tpldir~ - $CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~ - $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname ${wl}-retain-symbols-file ${wl}$export_symbols -o $lib' - ;; - *) # Version 6 and above use weak symbols - archive_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname -o $lib' - archive_expsym_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname ${wl}-retain-symbols-file ${wl}$export_symbols -o $lib' - ;; - esac - - hardcode_libdir_flag_spec_CXX='${wl}--rpath ${wl}$libdir' - export_dynamic_flag_spec_CXX='${wl}--export-dynamic' - whole_archive_flag_spec_CXX='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' - ;; - cxx*) - # Compaq C++ - archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' - archive_expsym_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib ${wl}-retain-symbols-file $wl$export_symbols' - - runpath_var=LD_RUN_PATH - hardcode_libdir_flag_spec_CXX='-rpath $libdir' - hardcode_libdir_separator_CXX=: - - # Commands to make compiler produce verbose output that lists - # what "hidden" libraries, object files and flags are used when - # linking a shared library. - # - # There doesn't appear to be a way to prevent this compiler from - # explicitly linking system object files so we need to strip them - # from the output so that they don't get included in the library - # dependencies. - output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld"`; templist=`func_echo_all "$templist" | $SED "s/\(^.*ld.*\)\( .*ld .*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "X$list" | $Xsed' - ;; - xl* | mpixl* | bgxl*) - # IBM XL 8.0 on PPC, with GNU ld - hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir' - export_dynamic_flag_spec_CXX='${wl}--export-dynamic' - archive_cmds_CXX='$CC -qmkshrobj $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' - if test "x$supports_anon_versioning" = xyes; then - archive_expsym_cmds_CXX='echo "{ global:" > $output_objdir/$libname.ver~ - cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ - echo "local: *; };" >> $output_objdir/$libname.ver~ - $CC -qmkshrobj $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib' - fi - ;; - *) - case `$CC -V 2>&1 | sed 5q` in - *Sun\ C*) - # Sun C++ 5.9 - no_undefined_flag_CXX=' -zdefs' - archive_cmds_CXX='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' - archive_expsym_cmds_CXX='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file ${wl}$export_symbols' - hardcode_libdir_flag_spec_CXX='-R$libdir' - whole_archive_flag_spec_CXX='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' - compiler_needs_object_CXX=yes - - # Not sure whether something based on - # $CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 - # would be better. - output_verbose_link_cmd='func_echo_all' - - # Archives containing C++ object files must be created using - # "CC -xar", where "CC" is the Sun C++ compiler. This is - # necessary to make sure instantiated templates are included - # in the archive. - old_archive_cmds_CXX='$CC -xar -o $oldlib $oldobjs' - ;; - esac - ;; - esac - ;; - - lynxos*) - # FIXME: insert proper C++ library support - ld_shlibs_CXX=no - ;; - - m88k*) - # FIXME: insert proper C++ library support - ld_shlibs_CXX=no - ;; - - mvs*) - case $cc_basename in - cxx*) - # FIXME: insert proper C++ library support - ld_shlibs_CXX=no - ;; - *) - # FIXME: insert proper C++ library support - ld_shlibs_CXX=no - ;; - esac - ;; - - netbsd*) - if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then - archive_cmds_CXX='$LD -Bshareable -o $lib $predep_objects $libobjs $deplibs $postdep_objects $linker_flags' - wlarc= - hardcode_libdir_flag_spec_CXX='-R$libdir' - hardcode_direct_CXX=yes - hardcode_shlibpath_var_CXX=no - fi - # Workaround some broken pre-1.5 toolchains - output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP conftest.$objext | $SED -e "s:-lgcc -lc -lgcc::"' - ;; - - *nto* | *qnx*) - ld_shlibs_CXX=yes - ;; - - openbsd2*) - # C++ shared libraries are fairly broken - ld_shlibs_CXX=no - ;; - - openbsd*) - if test -f /usr/libexec/ld.so; then - hardcode_direct_CXX=yes - hardcode_shlibpath_var_CXX=no - hardcode_direct_absolute_CXX=yes - archive_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib' - hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir' - if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then - archive_expsym_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file,$export_symbols -o $lib' - export_dynamic_flag_spec_CXX='${wl}-E' - whole_archive_flag_spec_CXX="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' - fi - output_verbose_link_cmd=func_echo_all - else - ld_shlibs_CXX=no - fi - ;; - - osf3* | osf4* | osf5*) - case $cc_basename in - KCC*) - # Kuck and Associates, Inc. (KAI) C++ Compiler - - # KCC will only create a shared library if the output file - # ends with ".so" (or ".sl" for HP-UX), so rename the library - # to its proper name (with version) after linking. - archive_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo "$lib" | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' - - hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir' - hardcode_libdir_separator_CXX=: - - # Archives containing C++ object files must be created using - # the KAI C++ compiler. - case $host in - osf3*) old_archive_cmds_CXX='$CC -Bstatic -o $oldlib $oldobjs' ;; - *) old_archive_cmds_CXX='$CC -o $oldlib $oldobjs' ;; - esac - ;; - RCC*) - # Rational C++ 2.4.1 - # FIXME: insert proper C++ library support - ld_shlibs_CXX=no - ;; - cxx*) - case $host in - osf3*) - allow_undefined_flag_CXX=' ${wl}-expect_unresolved ${wl}\*' - archive_cmds_CXX='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $soname `test -n "$verstring" && func_echo_all "${wl}-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' - hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir' - ;; - *) - allow_undefined_flag_CXX=' -expect_unresolved \*' - archive_cmds_CXX='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' - archive_expsym_cmds_CXX='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done~ - echo "-hidden">> $lib.exp~ - $CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname ${wl}-input ${wl}$lib.exp `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib~ - $RM $lib.exp' - hardcode_libdir_flag_spec_CXX='-rpath $libdir' - ;; - esac - - hardcode_libdir_separator_CXX=: - - # Commands to make compiler produce verbose output that lists - # what "hidden" libraries, object files and flags are used when - # linking a shared library. - # - # There doesn't appear to be a way to prevent this compiler from - # explicitly linking system object files so we need to strip them - # from the output so that they don't get included in the library - # dependencies. - output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld" | $GREP -v "ld:"`; templist=`func_echo_all "$templist" | $SED "s/\(^.*ld.*\)\( .*ld.*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' - ;; - *) - if test "$GXX" = yes && test "$with_gnu_ld" = no; then - allow_undefined_flag_CXX=' ${wl}-expect_unresolved ${wl}\*' - case $host in - osf3*) - archive_cmds_CXX='$CC -shared -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' - ;; - *) - archive_cmds_CXX='$CC -shared $pic_flag -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' - ;; - esac - - hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir' - hardcode_libdir_separator_CXX=: - - # Commands to make compiler produce verbose output that lists - # what "hidden" libraries, object files and flags are used when - # linking a shared library. - output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' - - else - # FIXME: insert proper C++ library support - ld_shlibs_CXX=no - fi - ;; - esac - ;; - - psos*) - # FIXME: insert proper C++ library support - ld_shlibs_CXX=no - ;; - - sunos4*) - case $cc_basename in - CC*) - # Sun C++ 4.x - # FIXME: insert proper C++ library support - ld_shlibs_CXX=no - ;; - lcc*) - # Lucid - # FIXME: insert proper C++ library support - ld_shlibs_CXX=no - ;; - *) - # FIXME: insert proper C++ library support - ld_shlibs_CXX=no - ;; - esac - ;; - - solaris*) - case $cc_basename in - CC* | sunCC*) - # Sun C++ 4.2, 5.x and Centerline C++ - archive_cmds_need_lc_CXX=yes - no_undefined_flag_CXX=' -zdefs' - archive_cmds_CXX='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' - archive_expsym_cmds_CXX='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ - $CC -G${allow_undefined_flag} ${wl}-M ${wl}$lib.exp -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' - - hardcode_libdir_flag_spec_CXX='-R$libdir' - hardcode_shlibpath_var_CXX=no - case $host_os in - solaris2.[0-5] | solaris2.[0-5].*) ;; - *) - # The compiler driver will combine and reorder linker options, - # but understands `-z linker_flag'. - # Supported since Solaris 2.6 (maybe 2.5.1?) - whole_archive_flag_spec_CXX='-z allextract$convenience -z defaultextract' - ;; - esac - link_all_deplibs_CXX=yes - - output_verbose_link_cmd='func_echo_all' - - # Archives containing C++ object files must be created using - # "CC -xar", where "CC" is the Sun C++ compiler. This is - # necessary to make sure instantiated templates are included - # in the archive. - old_archive_cmds_CXX='$CC -xar -o $oldlib $oldobjs' - ;; - gcx*) - # Green Hills C++ Compiler - archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' - - # The C++ compiler must be used to create the archive. - old_archive_cmds_CXX='$CC $LDFLAGS -archive -o $oldlib $oldobjs' - ;; - *) - # GNU C++ compiler with Solaris linker - if test "$GXX" = yes && test "$with_gnu_ld" = no; then - no_undefined_flag_CXX=' ${wl}-z ${wl}defs' - if $CC --version | $GREP -v '^2\.7' > /dev/null; then - archive_cmds_CXX='$CC -shared $pic_flag -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' - archive_expsym_cmds_CXX='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ - $CC -shared $pic_flag -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' - - # Commands to make compiler produce verbose output that lists - # what "hidden" libraries, object files and flags are used when - # linking a shared library. - output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' - else - # g++ 2.7 appears to require `-G' NOT `-shared' on this - # platform. - archive_cmds_CXX='$CC -G -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' - archive_expsym_cmds_CXX='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ - $CC -G -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' - - # Commands to make compiler produce verbose output that lists - # what "hidden" libraries, object files and flags are used when - # linking a shared library. - output_verbose_link_cmd='$CC -G $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' - fi - - hardcode_libdir_flag_spec_CXX='${wl}-R $wl$libdir' - case $host_os in - solaris2.[0-5] | solaris2.[0-5].*) ;; - *) - whole_archive_flag_spec_CXX='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract' - ;; - esac - fi - ;; - esac - ;; - - sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7* | sco3.2v5.0.[024]*) - no_undefined_flag_CXX='${wl}-z,text' - archive_cmds_need_lc_CXX=no - hardcode_shlibpath_var_CXX=no - runpath_var='LD_RUN_PATH' - - case $cc_basename in - CC*) - archive_cmds_CXX='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' - archive_expsym_cmds_CXX='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' - ;; - *) - archive_cmds_CXX='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' - archive_expsym_cmds_CXX='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' - ;; - esac - ;; - - sysv5* | sco3.2v5* | sco5v6*) - # Note: We can NOT use -z defs as we might desire, because we do not - # link with -lc, and that would cause any symbols used from libc to - # always be unresolved, which means just about no library would - # ever link correctly. If we're not using GNU ld we use -z text - # though, which does catch some bad symbols but isn't as heavy-handed - # as -z defs. - no_undefined_flag_CXX='${wl}-z,text' - allow_undefined_flag_CXX='${wl}-z,nodefs' - archive_cmds_need_lc_CXX=no - hardcode_shlibpath_var_CXX=no - hardcode_libdir_flag_spec_CXX='${wl}-R,$libdir' - hardcode_libdir_separator_CXX=':' - link_all_deplibs_CXX=yes - export_dynamic_flag_spec_CXX='${wl}-Bexport' - runpath_var='LD_RUN_PATH' - - case $cc_basename in - CC*) - archive_cmds_CXX='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' - archive_expsym_cmds_CXX='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' - old_archive_cmds_CXX='$CC -Tprelink_objects $oldobjs~ - '"$old_archive_cmds_CXX" - reload_cmds_CXX='$CC -Tprelink_objects $reload_objs~ - '"$reload_cmds_CXX" - ;; - *) - archive_cmds_CXX='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' - archive_expsym_cmds_CXX='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' - ;; - esac - ;; - - tandem*) - case $cc_basename in - NCC*) - # NonStop-UX NCC 3.20 - # FIXME: insert proper C++ library support - ld_shlibs_CXX=no - ;; - *) - # FIXME: insert proper C++ library support - ld_shlibs_CXX=no - ;; - esac - ;; - - vxworks*) - # FIXME: insert proper C++ library support - ld_shlibs_CXX=no - ;; - - *) - # FIXME: insert proper C++ library support - ld_shlibs_CXX=no - ;; - esac - - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ld_shlibs_CXX" >&5 -$as_echo "$ld_shlibs_CXX" >&6; } - test "$ld_shlibs_CXX" = no && can_build_shared=no - - GCC_CXX="$GXX" - LD_CXX="$LD" - - ## CAVEAT EMPTOR: - ## There is no encapsulation within the following macros, do not change - ## the running order or otherwise move them around unless you know exactly - ## what you are doing... - # Dependencies to place before and after the object being linked: -predep_objects_CXX= -postdep_objects_CXX= -predeps_CXX= -postdeps_CXX= -compiler_lib_search_path_CXX= - -cat > conftest.$ac_ext <<_LT_EOF -class Foo -{ -public: - Foo (void) { a = 0; } -private: - int a; -}; -_LT_EOF - - -_lt_libdeps_save_CFLAGS=$CFLAGS -case "$CC $CFLAGS " in #( -*\ -flto*\ *) CFLAGS="$CFLAGS -fno-lto" ;; -*\ -fwhopr*\ *) CFLAGS="$CFLAGS -fno-whopr" ;; -*\ -fuse-linker-plugin*\ *) CFLAGS="$CFLAGS -fno-use-linker-plugin" ;; -esac - -if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 - (eval $ac_compile) 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; }; then - # Parse the compiler output and extract the necessary - # objects, libraries and library flags. - - # Sentinel used to keep track of whether or not we are before - # the conftest object file. - pre_test_object_deps_done=no - - for p in `eval "$output_verbose_link_cmd"`; do - case ${prev}${p} in - - -L* | -R* | -l*) - # Some compilers place space between "-{L,R}" and the path. - # Remove the space. - if test $p = "-L" || - test $p = "-R"; then - prev=$p - continue - fi - - # Expand the sysroot to ease extracting the directories later. - if test -z "$prev"; then - case $p in - -L*) func_stripname_cnf '-L' '' "$p"; prev=-L; p=$func_stripname_result ;; - -R*) func_stripname_cnf '-R' '' "$p"; prev=-R; p=$func_stripname_result ;; - -l*) func_stripname_cnf '-l' '' "$p"; prev=-l; p=$func_stripname_result ;; - esac - fi - case $p in - =*) func_stripname_cnf '=' '' "$p"; p=$lt_sysroot$func_stripname_result ;; - esac - if test "$pre_test_object_deps_done" = no; then - case ${prev} in - -L | -R) - # Internal compiler library paths should come after those - # provided the user. The postdeps already come after the - # user supplied libs so there is no need to process them. - if test -z "$compiler_lib_search_path_CXX"; then - compiler_lib_search_path_CXX="${prev}${p}" - else - compiler_lib_search_path_CXX="${compiler_lib_search_path_CXX} ${prev}${p}" - fi - ;; - # The "-l" case would never come before the object being - # linked, so don't bother handling this case. - esac - else - if test -z "$postdeps_CXX"; then - postdeps_CXX="${prev}${p}" - else - postdeps_CXX="${postdeps_CXX} ${prev}${p}" - fi - fi - prev= - ;; - - *.lto.$objext) ;; # Ignore GCC LTO objects - *.$objext) - # This assumes that the test object file only shows up - # once in the compiler output. - if test "$p" = "conftest.$objext"; then - pre_test_object_deps_done=yes - continue - fi - - if test "$pre_test_object_deps_done" = no; then - if test -z "$predep_objects_CXX"; then - predep_objects_CXX="$p" - else - predep_objects_CXX="$predep_objects_CXX $p" - fi - else - if test -z "$postdep_objects_CXX"; then - postdep_objects_CXX="$p" - else - postdep_objects_CXX="$postdep_objects_CXX $p" - fi - fi - ;; - - *) ;; # Ignore the rest. - - esac - done - - # Clean up. - rm -f a.out a.exe -else - echo "libtool.m4: error: problem compiling CXX test program" -fi - -$RM -f confest.$objext -CFLAGS=$_lt_libdeps_save_CFLAGS - -# PORTME: override above test on systems where it is broken -case $host_os in -interix[3-9]*) - # Interix 3.5 installs completely hosed .la files for C++, so rather than - # hack all around it, let's just trust "g++" to DTRT. - predep_objects_CXX= - postdep_objects_CXX= - postdeps_CXX= - ;; - -linux*) - case `$CC -V 2>&1 | sed 5q` in - *Sun\ C*) - # Sun C++ 5.9 - - # The more standards-conforming stlport4 library is - # incompatible with the Cstd library. Avoid specifying - # it if it's in CXXFLAGS. Ignore libCrun as - # -library=stlport4 depends on it. - case " $CXX $CXXFLAGS " in - *" -library=stlport4 "*) - solaris_use_stlport4=yes - ;; - esac - - if test "$solaris_use_stlport4" != yes; then - postdeps_CXX='-library=Cstd -library=Crun' - fi - ;; - esac - ;; - -solaris*) - case $cc_basename in - CC* | sunCC*) - # The more standards-conforming stlport4 library is - # incompatible with the Cstd library. Avoid specifying - # it if it's in CXXFLAGS. Ignore libCrun as - # -library=stlport4 depends on it. - case " $CXX $CXXFLAGS " in - *" -library=stlport4 "*) - solaris_use_stlport4=yes - ;; - esac - - # Adding this requires a known-good setup of shared libraries for - # Sun compiler versions before 5.6, else PIC objects from an old - # archive will be linked into the output, leading to subtle bugs. - if test "$solaris_use_stlport4" != yes; then - postdeps_CXX='-library=Cstd -library=Crun' - fi - ;; - esac - ;; -esac - - -case " $postdeps_CXX " in -*" -lc "*) archive_cmds_need_lc_CXX=no ;; -esac - compiler_lib_search_dirs_CXX= -if test -n "${compiler_lib_search_path_CXX}"; then - compiler_lib_search_dirs_CXX=`echo " ${compiler_lib_search_path_CXX}" | ${SED} -e 's! -L! !g' -e 's!^ !!'` -fi - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - lt_prog_compiler_wl_CXX= -lt_prog_compiler_pic_CXX= -lt_prog_compiler_static_CXX= - - - # C++ specific cases for pic, static, wl, etc. - if test "$GXX" = yes; then - lt_prog_compiler_wl_CXX='-Wl,' - lt_prog_compiler_static_CXX='-static' - - case $host_os in - aix*) - # All AIX code is PIC. - if test "$host_cpu" = ia64; then - # AIX 5 now supports IA64 processor - lt_prog_compiler_static_CXX='-Bstatic' - fi - ;; - - amigaos*) - case $host_cpu in - powerpc) - # see comment about AmigaOS4 .so support - lt_prog_compiler_pic_CXX='-fPIC' - ;; - m68k) - # FIXME: we need at least 68020 code to build shared libraries, but - # adding the `-m68020' flag to GCC prevents building anything better, - # like `-m68040'. - lt_prog_compiler_pic_CXX='-m68020 -resident32 -malways-restore-a4' - ;; - esac - ;; - - beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) - # PIC is the default for these OSes. - ;; - mingw* | cygwin* | os2* | pw32* | cegcc*) - # This hack is so that the source file can tell whether it is being - # built for inclusion in a dll (and should export symbols for example). - # Although the cygwin gcc ignores -fPIC, still need this for old-style - # (--disable-auto-import) libraries - lt_prog_compiler_pic_CXX='-DDLL_EXPORT' - ;; - darwin* | rhapsody*) - # PIC is the default on this platform - # Common symbols not allowed in MH_DYLIB files - lt_prog_compiler_pic_CXX='-fno-common' - ;; - *djgpp*) - # DJGPP does not support shared libraries at all - lt_prog_compiler_pic_CXX= - ;; - haiku*) - # PIC is the default for Haiku. - # The "-static" flag exists, but is broken. - lt_prog_compiler_static_CXX= - ;; - interix[3-9]*) - # Interix 3.x gcc -fpic/-fPIC options generate broken code. - # Instead, we relocate shared libraries at runtime. - ;; - sysv4*MP*) - if test -d /usr/nec; then - lt_prog_compiler_pic_CXX=-Kconform_pic - fi - ;; - hpux*) - # PIC is the default for 64-bit PA HP-UX, but not for 32-bit - # PA HP-UX. On IA64 HP-UX, PIC is the default but the pic flag - # sets the default TLS model and affects inlining. - case $host_cpu in - hppa*64*) - ;; - *) - lt_prog_compiler_pic_CXX='-fPIC' - ;; - esac - ;; - *qnx* | *nto*) - # QNX uses GNU C++, but need to define -shared option too, otherwise - # it will coredump. - lt_prog_compiler_pic_CXX='-fPIC -shared' - ;; - *) - lt_prog_compiler_pic_CXX='-fPIC' - ;; - esac - else - case $host_os in - aix[4-9]*) - # All AIX code is PIC. - if test "$host_cpu" = ia64; then - # AIX 5 now supports IA64 processor - lt_prog_compiler_static_CXX='-Bstatic' - else - lt_prog_compiler_static_CXX='-bnso -bI:/lib/syscalls.exp' - fi - ;; - chorus*) - case $cc_basename in - cxch68*) - # Green Hills C++ Compiler - # _LT_TAGVAR(lt_prog_compiler_static, CXX)="--no_auto_instantiation -u __main -u __premain -u _abort -r $COOL_DIR/lib/libOrb.a $MVME_DIR/lib/CC/libC.a $MVME_DIR/lib/classix/libcx.s.a" - ;; - esac - ;; - mingw* | cygwin* | os2* | pw32* | cegcc*) - # This hack is so that the source file can tell whether it is being - # built for inclusion in a dll (and should export symbols for example). - lt_prog_compiler_pic_CXX='-DDLL_EXPORT' - ;; - dgux*) - case $cc_basename in - ec++*) - lt_prog_compiler_pic_CXX='-KPIC' - ;; - ghcx*) - # Green Hills C++ Compiler - lt_prog_compiler_pic_CXX='-pic' - ;; - *) - ;; - esac - ;; - freebsd* | dragonfly*) - # FreeBSD uses GNU C++ - ;; - hpux9* | hpux10* | hpux11*) - case $cc_basename in - CC*) - lt_prog_compiler_wl_CXX='-Wl,' - lt_prog_compiler_static_CXX='${wl}-a ${wl}archive' - if test "$host_cpu" != ia64; then - lt_prog_compiler_pic_CXX='+Z' - fi - ;; - aCC*) - lt_prog_compiler_wl_CXX='-Wl,' - lt_prog_compiler_static_CXX='${wl}-a ${wl}archive' - case $host_cpu in - hppa*64*|ia64*) - # +Z the default - ;; - *) - lt_prog_compiler_pic_CXX='+Z' - ;; - esac - ;; - *) - ;; - esac - ;; - interix*) - # This is c89, which is MS Visual C++ (no shared libs) - # Anyone wants to do a port? - ;; - irix5* | irix6* | nonstopux*) - case $cc_basename in - CC*) - lt_prog_compiler_wl_CXX='-Wl,' - lt_prog_compiler_static_CXX='-non_shared' - # CC pic flag -KPIC is the default. - ;; - *) - ;; - esac - ;; - linux* | k*bsd*-gnu | kopensolaris*-gnu) - case $cc_basename in - KCC*) - # KAI C++ Compiler - lt_prog_compiler_wl_CXX='--backend -Wl,' - lt_prog_compiler_pic_CXX='-fPIC' - ;; - ecpc* ) - # old Intel C++ for x86_64 which still supported -KPIC. - lt_prog_compiler_wl_CXX='-Wl,' - lt_prog_compiler_pic_CXX='-KPIC' - lt_prog_compiler_static_CXX='-static' - ;; - icpc* ) - # Intel C++, used to be incompatible with GCC. - # ICC 10 doesn't accept -KPIC any more. - lt_prog_compiler_wl_CXX='-Wl,' - lt_prog_compiler_pic_CXX='-fPIC' - lt_prog_compiler_static_CXX='-static' - ;; - pgCC* | pgcpp*) - # Portland Group C++ compiler - lt_prog_compiler_wl_CXX='-Wl,' - lt_prog_compiler_pic_CXX='-fpic' - lt_prog_compiler_static_CXX='-Bstatic' - ;; - cxx*) - # Compaq C++ - # Make sure the PIC flag is empty. It appears that all Alpha - # Linux and Compaq Tru64 Unix objects are PIC. - lt_prog_compiler_pic_CXX= - lt_prog_compiler_static_CXX='-non_shared' - ;; - xlc* | xlC* | bgxl[cC]* | mpixl[cC]*) - # IBM XL 8.0, 9.0 on PPC and BlueGene - lt_prog_compiler_wl_CXX='-Wl,' - lt_prog_compiler_pic_CXX='-qpic' - lt_prog_compiler_static_CXX='-qstaticlink' - ;; - *) - case `$CC -V 2>&1 | sed 5q` in - *Sun\ C*) - # Sun C++ 5.9 - lt_prog_compiler_pic_CXX='-KPIC' - lt_prog_compiler_static_CXX='-Bstatic' - lt_prog_compiler_wl_CXX='-Qoption ld ' - ;; - esac - ;; - esac - ;; - lynxos*) - ;; - m88k*) - ;; - mvs*) - case $cc_basename in - cxx*) - lt_prog_compiler_pic_CXX='-W c,exportall' - ;; - *) - ;; - esac - ;; - netbsd* | netbsdelf*-gnu) - ;; - *qnx* | *nto*) - # QNX uses GNU C++, but need to define -shared option too, otherwise - # it will coredump. - lt_prog_compiler_pic_CXX='-fPIC -shared' - ;; - osf3* | osf4* | osf5*) - case $cc_basename in - KCC*) - lt_prog_compiler_wl_CXX='--backend -Wl,' - ;; - RCC*) - # Rational C++ 2.4.1 - lt_prog_compiler_pic_CXX='-pic' - ;; - cxx*) - # Digital/Compaq C++ - lt_prog_compiler_wl_CXX='-Wl,' - # Make sure the PIC flag is empty. It appears that all Alpha - # Linux and Compaq Tru64 Unix objects are PIC. - lt_prog_compiler_pic_CXX= - lt_prog_compiler_static_CXX='-non_shared' - ;; - *) - ;; - esac - ;; - psos*) - ;; - solaris*) - case $cc_basename in - CC* | sunCC*) - # Sun C++ 4.2, 5.x and Centerline C++ - lt_prog_compiler_pic_CXX='-KPIC' - lt_prog_compiler_static_CXX='-Bstatic' - lt_prog_compiler_wl_CXX='-Qoption ld ' - ;; - gcx*) - # Green Hills C++ Compiler - lt_prog_compiler_pic_CXX='-PIC' - ;; - *) - ;; - esac - ;; - sunos4*) - case $cc_basename in - CC*) - # Sun C++ 4.x - lt_prog_compiler_pic_CXX='-pic' - lt_prog_compiler_static_CXX='-Bstatic' - ;; - lcc*) - # Lucid - lt_prog_compiler_pic_CXX='-pic' - ;; - *) - ;; - esac - ;; - sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) - case $cc_basename in - CC*) - lt_prog_compiler_wl_CXX='-Wl,' - lt_prog_compiler_pic_CXX='-KPIC' - lt_prog_compiler_static_CXX='-Bstatic' - ;; - esac - ;; - tandem*) - case $cc_basename in - NCC*) - # NonStop-UX NCC 3.20 - lt_prog_compiler_pic_CXX='-KPIC' - ;; - *) - ;; - esac - ;; - vxworks*) - ;; - *) - lt_prog_compiler_can_build_shared_CXX=no - ;; - esac - fi - -case $host_os in - # For platforms which do not support PIC, -DPIC is meaningless: - *djgpp*) - lt_prog_compiler_pic_CXX= - ;; - *) - lt_prog_compiler_pic_CXX="$lt_prog_compiler_pic_CXX@&t@ -DPIC" - ;; -esac - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $compiler option to produce PIC" >&5 -$as_echo_n "checking for $compiler option to produce PIC... " >&6; } -if ${lt_cv_prog_compiler_pic_CXX+:} false; then : - $as_echo_n "(cached) " >&6 -else - lt_cv_prog_compiler_pic_CXX=$lt_prog_compiler_pic_CXX -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic_CXX" >&5 -$as_echo "$lt_cv_prog_compiler_pic_CXX" >&6; } -lt_prog_compiler_pic_CXX=$lt_cv_prog_compiler_pic_CXX - -# -# Check to make sure the PIC flag actually works. -# -if test -n "$lt_prog_compiler_pic_CXX"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler PIC flag $lt_prog_compiler_pic_CXX works" >&5 -$as_echo_n "checking if $compiler PIC flag $lt_prog_compiler_pic_CXX works... " >&6; } -if ${lt_cv_prog_compiler_pic_works_CXX+:} false; then : - $as_echo_n "(cached) " >&6 -else - lt_cv_prog_compiler_pic_works_CXX=no - ac_outfile=conftest.$ac_objext - echo "$lt_simple_compile_test_code" > conftest.$ac_ext - lt_compiler_flag="$lt_prog_compiler_pic_CXX@&t@ -DPIC" - # Insert the option either (1) after the last *FLAGS variable, or - # (2) before a word containing "conftest.", or (3) at the end. - # Note that $ac_compile itself does not contain backslashes and begins - # with a dollar sign (not a hyphen), so the echo should work correctly. - # The option is referenced via a variable to avoid confusing sed. - lt_compile=`echo "$ac_compile" | $SED \ - -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ - -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ - -e 's:$: $lt_compiler_flag:'` - (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) - (eval "$lt_compile" 2>conftest.err) - ac_status=$? - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - if (exit $ac_status) && test -s "$ac_outfile"; then - # The compiler can only warn and ignore the option if not recognized - # So say no if there are warnings other than the usual output. - $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp - $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 - if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then - lt_cv_prog_compiler_pic_works_CXX=yes - fi - fi - $RM conftest* - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic_works_CXX" >&5 -$as_echo "$lt_cv_prog_compiler_pic_works_CXX" >&6; } - -if test x"$lt_cv_prog_compiler_pic_works_CXX" = xyes; then - case $lt_prog_compiler_pic_CXX in - "" | " "*) ;; - *) lt_prog_compiler_pic_CXX=" $lt_prog_compiler_pic_CXX" ;; - esac -else - lt_prog_compiler_pic_CXX= - lt_prog_compiler_can_build_shared_CXX=no -fi - -fi - - - - - -# -# Check to make sure the static flag actually works. -# -wl=$lt_prog_compiler_wl_CXX eval lt_tmp_static_flag=\"$lt_prog_compiler_static_CXX\" -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler static flag $lt_tmp_static_flag works" >&5 -$as_echo_n "checking if $compiler static flag $lt_tmp_static_flag works... " >&6; } -if ${lt_cv_prog_compiler_static_works_CXX+:} false; then : - $as_echo_n "(cached) " >&6 -else - lt_cv_prog_compiler_static_works_CXX=no - save_LDFLAGS="$LDFLAGS" - LDFLAGS="$LDFLAGS $lt_tmp_static_flag" - echo "$lt_simple_link_test_code" > conftest.$ac_ext - if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then - # The linker can only warn and ignore the option if not recognized - # So say no if there are warnings - if test -s conftest.err; then - # Append any errors to the config.log. - cat conftest.err 1>&5 - $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp - $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 - if diff conftest.exp conftest.er2 >/dev/null; then - lt_cv_prog_compiler_static_works_CXX=yes - fi - else - lt_cv_prog_compiler_static_works_CXX=yes - fi - fi - $RM -r conftest* - LDFLAGS="$save_LDFLAGS" - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_static_works_CXX" >&5 -$as_echo "$lt_cv_prog_compiler_static_works_CXX" >&6; } - -if test x"$lt_cv_prog_compiler_static_works_CXX" = xyes; then - : -else - lt_prog_compiler_static_CXX= -fi - - - - - { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5 -$as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; } -if ${lt_cv_prog_compiler_c_o_CXX+:} false; then : - $as_echo_n "(cached) " >&6 -else - lt_cv_prog_compiler_c_o_CXX=no - $RM -r conftest 2>/dev/null - mkdir conftest - cd conftest - mkdir out - echo "$lt_simple_compile_test_code" > conftest.$ac_ext - - lt_compiler_flag="-o out/conftest2.$ac_objext" - # Insert the option either (1) after the last *FLAGS variable, or - # (2) before a word containing "conftest.", or (3) at the end. - # Note that $ac_compile itself does not contain backslashes and begins - # with a dollar sign (not a hyphen), so the echo should work correctly. - lt_compile=`echo "$ac_compile" | $SED \ - -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ - -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ - -e 's:$: $lt_compiler_flag:'` - (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) - (eval "$lt_compile" 2>out/conftest.err) - ac_status=$? - cat out/conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - if (exit $ac_status) && test -s out/conftest2.$ac_objext - then - # The compiler can only warn and ignore the option if not recognized - # So say no if there are warnings - $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp - $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 - if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then - lt_cv_prog_compiler_c_o_CXX=yes - fi - fi - chmod u+w . 2>&5 - $RM conftest* - # SGI C++ compiler will create directory out/ii_files/ for - # template instantiation - test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files - $RM out/* && rmdir out - cd .. - $RM -r conftest - $RM conftest* - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o_CXX" >&5 -$as_echo "$lt_cv_prog_compiler_c_o_CXX" >&6; } - - - - { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5 -$as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; } -if ${lt_cv_prog_compiler_c_o_CXX+:} false; then : - $as_echo_n "(cached) " >&6 -else - lt_cv_prog_compiler_c_o_CXX=no - $RM -r conftest 2>/dev/null - mkdir conftest - cd conftest - mkdir out - echo "$lt_simple_compile_test_code" > conftest.$ac_ext - - lt_compiler_flag="-o out/conftest2.$ac_objext" - # Insert the option either (1) after the last *FLAGS variable, or - # (2) before a word containing "conftest.", or (3) at the end. - # Note that $ac_compile itself does not contain backslashes and begins - # with a dollar sign (not a hyphen), so the echo should work correctly. - lt_compile=`echo "$ac_compile" | $SED \ - -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ - -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ - -e 's:$: $lt_compiler_flag:'` - (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) - (eval "$lt_compile" 2>out/conftest.err) - ac_status=$? - cat out/conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - if (exit $ac_status) && test -s out/conftest2.$ac_objext - then - # The compiler can only warn and ignore the option if not recognized - # So say no if there are warnings - $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp - $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 - if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then - lt_cv_prog_compiler_c_o_CXX=yes - fi - fi - chmod u+w . 2>&5 - $RM conftest* - # SGI C++ compiler will create directory out/ii_files/ for - # template instantiation - test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files - $RM out/* && rmdir out - cd .. - $RM -r conftest - $RM conftest* - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o_CXX" >&5 -$as_echo "$lt_cv_prog_compiler_c_o_CXX" >&6; } - - - - -hard_links="nottested" -if test "$lt_cv_prog_compiler_c_o_CXX" = no && test "$need_locks" != no; then - # do not overwrite the value of need_locks provided by the user - { $as_echo "$as_me:${as_lineno-$LINENO}: checking if we can lock with hard links" >&5 -$as_echo_n "checking if we can lock with hard links... " >&6; } - hard_links=yes - $RM conftest* - ln conftest.a conftest.b 2>/dev/null && hard_links=no - touch conftest.a - ln conftest.a conftest.b 2>&5 || hard_links=no - ln conftest.a conftest.b 2>/dev/null && hard_links=no - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $hard_links" >&5 -$as_echo "$hard_links" >&6; } - if test "$hard_links" = no; then - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&5 -$as_echo "$as_me: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&2;} - need_locks=warn - fi -else - need_locks=no -fi - - - - { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $compiler linker ($LD) supports shared libraries" >&5 -$as_echo_n "checking whether the $compiler linker ($LD) supports shared libraries... " >&6; } - - export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' - exclude_expsyms_CXX='_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*' - case $host_os in - aix[4-9]*) - # If we're using GNU nm, then we don't want the "-C" option. - # -C means demangle to AIX nm, but means don't demangle with GNU nm - # Also, AIX nm treats weak defined symbols like other global defined - # symbols, whereas GNU nm marks them as "W". - if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then - export_symbols_cmds_CXX='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && (substr(\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' - else - export_symbols_cmds_CXX='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && (substr(\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' - fi - ;; - pw32*) - export_symbols_cmds_CXX="$ltdll_cmds" - ;; - cygwin* | mingw* | cegcc*) - case $cc_basename in - cl*) - exclude_expsyms_CXX='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*' - ;; - *) - export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1 DATA/;s/^.*[ ]__nm__\([^ ]*\)[ ][^ ]*/\1 DATA/;/^I[ ]/d;/^[AITW][ ]/s/.* //'\'' | sort | uniq > $export_symbols' - exclude_expsyms_CXX='[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname' - ;; - esac - ;; - linux* | k*bsd*-gnu | gnu*) - link_all_deplibs_CXX=no - ;; - *) - export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' - ;; - esac - -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ld_shlibs_CXX" >&5 -$as_echo "$ld_shlibs_CXX" >&6; } -test "$ld_shlibs_CXX" = no && can_build_shared=no - -with_gnu_ld_CXX=$with_gnu_ld - - - - - - -# -# Do we need to explicitly link libc? -# -case "x$archive_cmds_need_lc_CXX" in -x|xyes) - # Assume -lc should be added - archive_cmds_need_lc_CXX=yes - - if test "$enable_shared" = yes && test "$GCC" = yes; then - case $archive_cmds_CXX in - *'~'*) - # FIXME: we may have to deal with multi-command sequences. - ;; - '$CC '*) - # Test whether the compiler implicitly links with -lc since on some - # systems, -lgcc has to come before -lc. If gcc already passes -lc - # to ld, don't add -lc before -lgcc. - { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether -lc should be explicitly linked in" >&5 -$as_echo_n "checking whether -lc should be explicitly linked in... " >&6; } -if ${lt_cv_archive_cmds_need_lc_CXX+:} false; then : - $as_echo_n "(cached) " >&6 -else - $RM conftest* - echo "$lt_simple_compile_test_code" > conftest.$ac_ext - - if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 - (eval $ac_compile) 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } 2>conftest.err; then - soname=conftest - lib=conftest - libobjs=conftest.$ac_objext - deplibs= - wl=$lt_prog_compiler_wl_CXX - pic_flag=$lt_prog_compiler_pic_CXX - compiler_flags=-v - linker_flags=-v - verstring= - output_objdir=. - libname=conftest - lt_save_allow_undefined_flag=$allow_undefined_flag_CXX - allow_undefined_flag_CXX= - if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$archive_cmds_CXX 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1\""; } >&5 - (eval $archive_cmds_CXX 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1) 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } - then - lt_cv_archive_cmds_need_lc_CXX=no - else - lt_cv_archive_cmds_need_lc_CXX=yes - fi - allow_undefined_flag_CXX=$lt_save_allow_undefined_flag - else - cat conftest.err 1>&5 - fi - $RM conftest* - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_archive_cmds_need_lc_CXX" >&5 -$as_echo "$lt_cv_archive_cmds_need_lc_CXX" >&6; } - archive_cmds_need_lc_CXX=$lt_cv_archive_cmds_need_lc_CXX - ;; - esac - fi - ;; -esac - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - { $as_echo "$as_me:${as_lineno-$LINENO}: checking dynamic linker characteristics" >&5 -$as_echo_n "checking dynamic linker characteristics... " >&6; } - -library_names_spec= -libname_spec='lib$name' -soname_spec= -shrext_cmds=".so" -postinstall_cmds= -postuninstall_cmds= -finish_cmds= -finish_eval= -shlibpath_var= -shlibpath_overrides_runpath=unknown -version_type=none -dynamic_linker="$host_os ld.so" -sys_lib_dlsearch_path_spec="/lib /usr/lib" -need_lib_prefix=unknown -hardcode_into_libs=no - -# when you set need_version to no, make sure it does not cause -set_version -# flags to be left without arguments -need_version=unknown - -case $host_os in -aix3*) - version_type=linux # correct to gnu/linux during the next big refactor - library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a' - shlibpath_var=LIBPATH - - # AIX 3 has no versioning support, so we append a major version to the name. - soname_spec='${libname}${release}${shared_ext}$major' - ;; - -aix[4-9]*) - version_type=linux # correct to gnu/linux during the next big refactor - need_lib_prefix=no - need_version=no - hardcode_into_libs=yes - if test "$host_cpu" = ia64; then - # AIX 5 supports IA64 - library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}' - shlibpath_var=LD_LIBRARY_PATH - else - # With GCC up to 2.95.x, collect2 would create an import file - # for dependence libraries. The import file would start with - # the line `#! .'. This would cause the generated library to - # depend on `.', always an invalid library. This was fixed in - # development snapshots of GCC prior to 3.0. - case $host_os in - aix4 | aix4.[01] | aix4.[01].*) - if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)' - echo ' yes ' - echo '#endif'; } | ${CC} -E - | $GREP yes > /dev/null; then - : - else - can_build_shared=no - fi - ;; - esac - # AIX (on Power*) has no versioning support, so currently we can not hardcode correct - # soname into executable. Probably we can add versioning support to - # collect2, so additional links can be useful in future. - if test "$aix_use_runtimelinking" = yes; then - # If using run time linking (on AIX 4.2 or later) use lib.so - # instead of lib.a to let people know that these are not - # typical AIX shared libraries. - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - else - # We preserve .a as extension for shared libraries through AIX4.2 - # and later when we are not doing run time linking. - library_names_spec='${libname}${release}.a $libname.a' - soname_spec='${libname}${release}${shared_ext}$major' - fi - shlibpath_var=LIBPATH - fi - ;; - -amigaos*) - case $host_cpu in - powerpc) - # Since July 2007 AmigaOS4 officially supports .so libraries. - # When compiling the executable, add -use-dynld -Lsobjs: to the compileline. - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - ;; - m68k) - library_names_spec='$libname.ixlibrary $libname.a' - # Create ${libname}_ixlibrary.a entries in /sys/libs. - finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`func_echo_all "$lib" | $SED '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; test $RM /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done' - ;; - esac - ;; - -beos*) - library_names_spec='${libname}${shared_ext}' - dynamic_linker="$host_os ld.so" - shlibpath_var=LIBRARY_PATH - ;; - -bsdi[45]*) - version_type=linux # correct to gnu/linux during the next big refactor - need_version=no - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir' - shlibpath_var=LD_LIBRARY_PATH - sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib" - sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib" - # the default ld.so.conf also contains /usr/contrib/lib and - # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow - # libtool to hard-code these into programs - ;; - -cygwin* | mingw* | pw32* | cegcc*) - version_type=windows - shrext_cmds=".dll" - need_version=no - need_lib_prefix=no - - case $GCC,$cc_basename in - yes,*) - # gcc - library_names_spec='$libname.dll.a' - # DLL is installed to $(libdir)/../bin by postinstall_cmds - postinstall_cmds='base_file=`basename \${file}`~ - dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~ - dldir=$destdir/`dirname \$dlpath`~ - test -d \$dldir || mkdir -p \$dldir~ - $install_prog $dir/$dlname \$dldir/$dlname~ - chmod a+x \$dldir/$dlname~ - if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then - eval '\''$striplib \$dldir/$dlname'\'' || exit \$?; - fi' - postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ - dlpath=$dir/\$dldll~ - $RM \$dlpath' - shlibpath_overrides_runpath=yes - - case $host_os in - cygwin*) - # Cygwin DLLs use 'cyg' prefix rather than 'lib' - soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' - - ;; - mingw* | cegcc*) - # MinGW DLLs use traditional 'lib' prefix - soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' - ;; - pw32*) - # pw32 DLLs use 'pw' prefix rather than 'lib' - library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' - ;; - esac - dynamic_linker='Win32 ld.exe' - ;; - - *,cl*) - # Native MSVC - libname_spec='$name' - soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' - library_names_spec='${libname}.dll.lib' - - case $build_os in - mingw*) - sys_lib_search_path_spec= - lt_save_ifs=$IFS - IFS=';' - for lt_path in $LIB - do - IFS=$lt_save_ifs - # Let DOS variable expansion print the short 8.3 style file name. - lt_path=`cd "$lt_path" 2>/dev/null && cmd //C "for %i in (".") do @echo %~si"` - sys_lib_search_path_spec="$sys_lib_search_path_spec $lt_path" - done - IFS=$lt_save_ifs - # Convert to MSYS style. - sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | sed -e 's|\\\\|/|g' -e 's| \\([a-zA-Z]\\):| /\\1|g' -e 's|^ ||'` - ;; - cygwin*) - # Convert to unix form, then to dos form, then back to unix form - # but this time dos style (no spaces!) so that the unix form looks - # like /cygdrive/c/PROGRA~1:/cygdr... - sys_lib_search_path_spec=`cygpath --path --unix "$LIB"` - sys_lib_search_path_spec=`cygpath --path --dos "$sys_lib_search_path_spec" 2>/dev/null` - sys_lib_search_path_spec=`cygpath --path --unix "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` - ;; - *) - sys_lib_search_path_spec="$LIB" - if $ECHO "$sys_lib_search_path_spec" | $GREP ';[c-zC-Z]:/' >/dev/null; then - # It is most probably a Windows format PATH. - sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` - else - sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` - fi - # FIXME: find the short name or the path components, as spaces are - # common. (e.g. "Program Files" -> "PROGRA~1") - ;; - esac - - # DLL is installed to $(libdir)/../bin by postinstall_cmds - postinstall_cmds='base_file=`basename \${file}`~ - dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~ - dldir=$destdir/`dirname \$dlpath`~ - test -d \$dldir || mkdir -p \$dldir~ - $install_prog $dir/$dlname \$dldir/$dlname' - postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ - dlpath=$dir/\$dldll~ - $RM \$dlpath' - shlibpath_overrides_runpath=yes - dynamic_linker='Win32 link.exe' - ;; - - *) - # Assume MSVC wrapper - library_names_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext} $libname.lib' - dynamic_linker='Win32 ld.exe' - ;; - esac - # FIXME: first we should search . and the directory the executable is in - shlibpath_var=PATH - ;; - -darwin* | rhapsody*) - dynamic_linker="$host_os dyld" - version_type=darwin - need_lib_prefix=no - need_version=no - library_names_spec='${libname}${release}${major}$shared_ext ${libname}$shared_ext' - soname_spec='${libname}${release}${major}$shared_ext' - shlibpath_overrides_runpath=yes - shlibpath_var=DYLD_LIBRARY_PATH - shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`' - - sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib' - ;; - -dgux*) - version_type=linux # correct to gnu/linux during the next big refactor - need_lib_prefix=no - need_version=no - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext' - soname_spec='${libname}${release}${shared_ext}$major' - shlibpath_var=LD_LIBRARY_PATH - ;; - -freebsd* | dragonfly*) - # DragonFly does not have aout. When/if they implement a new - # versioning mechanism, adjust this. - if test -x /usr/bin/objformat; then - objformat=`/usr/bin/objformat` - else - case $host_os in - freebsd[23].*) objformat=aout ;; - *) objformat=elf ;; - esac - fi - version_type=freebsd-$objformat - case $version_type in - freebsd-elf*) - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' - need_version=no - need_lib_prefix=no - ;; - freebsd-*) - library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix' - need_version=yes - ;; - esac - shlibpath_var=LD_LIBRARY_PATH - case $host_os in - freebsd2.*) - shlibpath_overrides_runpath=yes - ;; - freebsd3.[01]* | freebsdelf3.[01]*) - shlibpath_overrides_runpath=yes - hardcode_into_libs=yes - ;; - freebsd3.[2-9]* | freebsdelf3.[2-9]* | \ - freebsd4.[0-5] | freebsdelf4.[0-5] | freebsd4.1.1 | freebsdelf4.1.1) - shlibpath_overrides_runpath=no - hardcode_into_libs=yes - ;; - *) # from 4.6 on, and DragonFly - shlibpath_overrides_runpath=yes - hardcode_into_libs=yes - ;; - esac - ;; - -gnu*) - version_type=linux # correct to gnu/linux during the next big refactor - need_lib_prefix=no - need_version=no - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=no - hardcode_into_libs=yes - ;; - -haiku*) - version_type=linux # correct to gnu/linux during the next big refactor - need_lib_prefix=no - need_version=no - dynamic_linker="$host_os runtime_loader" - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - shlibpath_var=LIBRARY_PATH - shlibpath_overrides_runpath=yes - sys_lib_dlsearch_path_spec='/boot/home/config/lib /boot/common/lib /boot/system/lib' - hardcode_into_libs=yes - ;; - -hpux9* | hpux10* | hpux11*) - # Give a soname corresponding to the major version so that dld.sl refuses to - # link against other versions. - version_type=sunos - need_lib_prefix=no - need_version=no - case $host_cpu in - ia64*) - shrext_cmds='.so' - hardcode_into_libs=yes - dynamic_linker="$host_os dld.so" - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - if test "X$HPUX_IA64_MODE" = X32; then - sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib" - else - sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64" - fi - sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec - ;; - hppa*64*) - shrext_cmds='.sl' - hardcode_into_libs=yes - dynamic_linker="$host_os dld.sl" - shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH - shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64" - sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec - ;; - *) - shrext_cmds='.sl' - dynamic_linker="$host_os dld.sl" - shlibpath_var=SHLIB_PATH - shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - ;; - esac - # HP-UX runs *really* slowly unless shared libraries are mode 555, ... - postinstall_cmds='chmod 555 $lib' - # or fails outright, so override atomically: - install_override_mode=555 - ;; - -interix[3-9]*) - version_type=linux # correct to gnu/linux during the next big refactor - need_lib_prefix=no - need_version=no - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)' - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=no - hardcode_into_libs=yes - ;; - -irix5* | irix6* | nonstopux*) - case $host_os in - nonstopux*) version_type=nonstopux ;; - *) - if test "$lt_cv_prog_gnu_ld" = yes; then - version_type=linux # correct to gnu/linux during the next big refactor - else - version_type=irix - fi ;; - esac - need_lib_prefix=no - need_version=no - soname_spec='${libname}${release}${shared_ext}$major' - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}' - case $host_os in - irix5* | nonstopux*) - libsuff= shlibsuff= - ;; - *) - case $LD in # libtool.m4 will add one of these switches to LD - *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") - libsuff= shlibsuff= libmagic=32-bit;; - *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") - libsuff=32 shlibsuff=N32 libmagic=N32;; - *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") - libsuff=64 shlibsuff=64 libmagic=64-bit;; - *) libsuff= shlibsuff= libmagic=never-match;; - esac - ;; - esac - shlibpath_var=LD_LIBRARY${shlibsuff}_PATH - shlibpath_overrides_runpath=no - sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}" - sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}" - hardcode_into_libs=yes - ;; - -# No shared lib support for Linux oldld, aout, or coff. -linux*oldld* | linux*aout* | linux*coff*) - dynamic_linker=no - ;; - -# This must be glibc/ELF. -linux* | k*bsd*-gnu | kopensolaris*-gnu) - version_type=linux # correct to gnu/linux during the next big refactor - need_lib_prefix=no - need_version=no - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=no - - # Some binutils ld are patched to set DT_RUNPATH - if ${lt_cv_shlibpath_overrides_runpath+:} false; then : - $as_echo_n "(cached) " >&6 -else - lt_cv_shlibpath_overrides_runpath=no - save_LDFLAGS=$LDFLAGS - save_libdir=$libdir - eval "libdir=/foo; wl=\"$lt_prog_compiler_wl_CXX\"; \ - LDFLAGS=\"\$LDFLAGS $hardcode_libdir_flag_spec_CXX\"" - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -int -main () -{ - - ; - return 0; -} -_ACEOF -if ac_fn_cxx_try_link "$LINENO"; then : - if ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir" >/dev/null; then : - lt_cv_shlibpath_overrides_runpath=yes -fi -fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext - LDFLAGS=$save_LDFLAGS - libdir=$save_libdir - -fi - - shlibpath_overrides_runpath=$lt_cv_shlibpath_overrides_runpath - - # This implies no fast_install, which is unacceptable. - # Some rework will be needed to allow for fast_install - # before this can be enabled. - hardcode_into_libs=yes - - # Append ld.so.conf contents to the search path - if test -f /etc/ld.so.conf; then - lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \$2)); skip = 1; } { if (!skip) print \$0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[ ]*hwcap[ ]/d;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;s/"//g;/^$/d' | tr '\n' ' '` - sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra" - fi - - # We used to test for /lib/ld.so.1 and disable shared libraries on - # powerpc, because MkLinux only supported shared libraries with the - # GNU dynamic linker. Since this was broken with cross compilers, - # most powerpc-linux boxes support dynamic linking these days and - # people can always --disable-shared, the test was removed, and we - # assume the GNU/Linux dynamic linker is in use. - dynamic_linker='GNU/Linux ld.so' - ;; - -netbsdelf*-gnu) - version_type=linux - need_lib_prefix=no - need_version=no - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=no - hardcode_into_libs=yes - dynamic_linker='NetBSD ld.elf_so' - ;; - -netbsd*) - version_type=sunos - need_lib_prefix=no - need_version=no - if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' - finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' - dynamic_linker='NetBSD (a.out) ld.so' - else - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - dynamic_linker='NetBSD ld.elf_so' - fi - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=yes - hardcode_into_libs=yes - ;; - -newsos6) - version_type=linux # correct to gnu/linux during the next big refactor - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=yes - ;; - -*nto* | *qnx*) - version_type=qnx - need_lib_prefix=no - need_version=no - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=no - hardcode_into_libs=yes - dynamic_linker='ldqnx.so' - ;; - -openbsd*) - version_type=sunos - sys_lib_dlsearch_path_spec="/usr/lib" - need_lib_prefix=no - # Some older versions of OpenBSD (3.3 at least) *do* need versioned libs. - case $host_os in - openbsd3.3 | openbsd3.3.*) need_version=yes ;; - *) need_version=no ;; - esac - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' - finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' - shlibpath_var=LD_LIBRARY_PATH - if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then - case $host_os in - openbsd2.[89] | openbsd2.[89].*) - shlibpath_overrides_runpath=no - ;; - *) - shlibpath_overrides_runpath=yes - ;; - esac - else - shlibpath_overrides_runpath=yes - fi - ;; - -os2*) - libname_spec='$name' - shrext_cmds=".dll" - need_lib_prefix=no - library_names_spec='$libname${shared_ext} $libname.a' - dynamic_linker='OS/2 ld.exe' - shlibpath_var=LIBPATH - ;; - -osf3* | osf4* | osf5*) - version_type=osf - need_lib_prefix=no - need_version=no - soname_spec='${libname}${release}${shared_ext}$major' - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - shlibpath_var=LD_LIBRARY_PATH - sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib" - sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec" - ;; - -rdos*) - dynamic_linker=no - ;; - -solaris*) - version_type=linux # correct to gnu/linux during the next big refactor - need_lib_prefix=no - need_version=no - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=yes - hardcode_into_libs=yes - # ldd complains unless libraries are executable - postinstall_cmds='chmod +x $lib' - ;; - -sunos4*) - version_type=sunos - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' - finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir' - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=yes - if test "$with_gnu_ld" = yes; then - need_lib_prefix=no - fi - need_version=yes - ;; - -sysv4 | sysv4.3*) - version_type=linux # correct to gnu/linux during the next big refactor - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - shlibpath_var=LD_LIBRARY_PATH - case $host_vendor in - sni) - shlibpath_overrides_runpath=no - need_lib_prefix=no - runpath_var=LD_RUN_PATH - ;; - siemens) - need_lib_prefix=no - ;; - motorola) - need_lib_prefix=no - need_version=no - shlibpath_overrides_runpath=no - sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib' - ;; - esac - ;; - -sysv4*MP*) - if test -d /usr/nec ;then - version_type=linux # correct to gnu/linux during the next big refactor - library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}' - soname_spec='$libname${shared_ext}.$major' - shlibpath_var=LD_LIBRARY_PATH - fi - ;; - -sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) - version_type=freebsd-elf - need_lib_prefix=no - need_version=no - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=yes - hardcode_into_libs=yes - if test "$with_gnu_ld" = yes; then - sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib' - else - sys_lib_search_path_spec='/usr/ccs/lib /usr/lib' - case $host_os in - sco3.2v5*) - sys_lib_search_path_spec="$sys_lib_search_path_spec /lib" - ;; - esac - fi - sys_lib_dlsearch_path_spec='/usr/lib' - ;; - -tpf*) - # TPF is a cross-target only. Preferred cross-host = GNU/Linux. - version_type=linux # correct to gnu/linux during the next big refactor - need_lib_prefix=no - need_version=no - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=no - hardcode_into_libs=yes - ;; - -uts4*) - version_type=linux # correct to gnu/linux during the next big refactor - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - shlibpath_var=LD_LIBRARY_PATH - ;; - -*) - dynamic_linker=no - ;; -esac -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $dynamic_linker" >&5 -$as_echo "$dynamic_linker" >&6; } -test "$dynamic_linker" = no && can_build_shared=no - -variables_saved_for_relink="PATH $shlibpath_var $runpath_var" -if test "$GCC" = yes; then - variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" -fi - -if test "${lt_cv_sys_lib_search_path_spec+set}" = set; then - sys_lib_search_path_spec="$lt_cv_sys_lib_search_path_spec" -fi -if test "${lt_cv_sys_lib_dlsearch_path_spec+set}" = set; then - sys_lib_dlsearch_path_spec="$lt_cv_sys_lib_dlsearch_path_spec" -fi - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to hardcode library paths into programs" >&5 -$as_echo_n "checking how to hardcode library paths into programs... " >&6; } -hardcode_action_CXX= -if test -n "$hardcode_libdir_flag_spec_CXX" || - test -n "$runpath_var_CXX" || - test "X$hardcode_automatic_CXX" = "Xyes" ; then - - # We can hardcode non-existent directories. - if test "$hardcode_direct_CXX" != no && - # If the only mechanism to avoid hardcoding is shlibpath_var, we - # have to relink, otherwise we might link with an installed library - # when we should be linking with a yet-to-be-installed one - ## test "$_LT_TAGVAR(hardcode_shlibpath_var, CXX)" != no && - test "$hardcode_minus_L_CXX" != no; then - # Linking always hardcodes the temporary library directory. - hardcode_action_CXX=relink - else - # We can link without hardcoding, and we can hardcode nonexisting dirs. - hardcode_action_CXX=immediate - fi -else - # We cannot hardcode anything, or else we can only hardcode existing - # directories. - hardcode_action_CXX=unsupported -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $hardcode_action_CXX" >&5 -$as_echo "$hardcode_action_CXX" >&6; } - -if test "$hardcode_action_CXX" = relink || - test "$inherit_rpath_CXX" = yes; then - # Fast installation is not supported - enable_fast_install=no -elif test "$shlibpath_overrides_runpath" = yes || - test "$enable_shared" = no; then - # Fast installation is not necessary - enable_fast_install=needless -fi - - - - - - - - fi # test -n "$compiler" - - CC=$lt_save_CC - CFLAGS=$lt_save_CFLAGS - LDCXX=$LD - LD=$lt_save_LD - GCC=$lt_save_GCC - with_gnu_ld=$lt_save_with_gnu_ld - lt_cv_path_LDCXX=$lt_cv_path_LD - lt_cv_path_LD=$lt_save_path_LD - lt_cv_prog_gnu_ldcxx=$lt_cv_prog_gnu_ld - lt_cv_prog_gnu_ld=$lt_save_with_gnu_ld -fi # test "$_lt_caught_CXX_error" != yes - -ac_ext=c -ac_cpp='$CPP $CPPFLAGS' -ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_c_compiler_gnu - - - - - - - - - - - - - - - - ac_config_commands="$ac_config_commands libtool" - - - - -# Only expand once: - - - -#enable -D_GNU_SOURCE since the return code value of getaddrinfo -#ifdefed with __USE_GNU -#features.h header undef's __USE_GNU and defines it only if _GNU_SOURCE is defined -#hence this define for gcc -@%:@ Check whether --enable-debug was given. -if test "${enable_debug+set}" = set; then : - enableval=$enable_debug; -else - enable_debug=no -fi - - -if test "x$enable_debug" = xyes; then - if test "x$init_cflags" = x; then - CFLAGS="" - fi - CFLAGS="$CFLAGS -g -O0 -D_GNU_SOURCE" -else - if test "x$init_cflags" = x; then - CFLAGS="-g -O2 -D_GNU_SOURCE" - fi -fi - -if test "x$enable_debug" = xyes; then - if test "x$init_cxxflags" = x; then - CXXFLAGS="" - fi - CXXFLAGS="$CXXFLAGS -g -O0" -else - if test "x$init_cxxflags" = x; then - CXXFLAGS="-g -O2" - fi -fi - - -@%:@ Check whether --with-syncapi was given. -if test "${with_syncapi+set}" = set; then : - withval=$with_syncapi; -else - with_syncapi=yes -fi - - -# Checks for libraries. -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for pthread_mutex_lock in -lpthread" >&5 -$as_echo_n "checking for pthread_mutex_lock in -lpthread... " >&6; } -if ${ac_cv_lib_pthread_pthread_mutex_lock+:} false; then : - $as_echo_n "(cached) " >&6 -else - ac_check_lib_save_LIBS=$LIBS -LIBS="-lpthread $LIBS" -cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -/* Override any GCC internal prototype to avoid an error. - Use char because int might match the return type of a GCC - builtin and then its argument prototype would still apply. */ -#ifdef __cplusplus -extern "C" -#endif -char pthread_mutex_lock (); -int -main () -{ -return pthread_mutex_lock (); - ; - return 0; -} -_ACEOF -if ac_fn_c_try_link "$LINENO"; then : - ac_cv_lib_pthread_pthread_mutex_lock=yes -else - ac_cv_lib_pthread_pthread_mutex_lock=no -fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext -LIBS=$ac_check_lib_save_LIBS -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_pthread_pthread_mutex_lock" >&5 -$as_echo "$ac_cv_lib_pthread_pthread_mutex_lock" >&6; } -if test "x$ac_cv_lib_pthread_pthread_mutex_lock" = xyes; then : - have_pthread=yes -else - have_pthread=no -fi - - -if test "x$with_syncapi" != xno && test "x$have_pthread" = xno; then - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cannot build SyncAPI -- pthread not found" >&5 -$as_echo "$as_me: WARNING: cannot build SyncAPI -- pthread not found" >&2;} - with_syncapi=no -fi -if test "x$with_syncapi" != xno; then - { $as_echo "$as_me:${as_lineno-$LINENO}: building with SyncAPI support" >&5 -$as_echo "$as_me: building with SyncAPI support" >&6;} -else - { $as_echo "$as_me:${as_lineno-$LINENO}: building without SyncAPI support" >&5 -$as_echo "$as_me: building without SyncAPI support" >&6;} -fi - - if test "x$with_syncapi" != xno; then - WANT_SYNCAPI_TRUE= - WANT_SYNCAPI_FALSE='#' -else - WANT_SYNCAPI_TRUE='#' - WANT_SYNCAPI_FALSE= -fi - - -# Checks for header files. -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header files" >&5 -$as_echo_n "checking for ANSI C header files... " >&6; } -if ${ac_cv_header_stdc+:} false; then : - $as_echo_n "(cached) " >&6 -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include -#include -#include -#include - -int -main () -{ - - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - ac_cv_header_stdc=yes -else - ac_cv_header_stdc=no -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext - -if test $ac_cv_header_stdc = yes; then - # SunOS 4.x string.h does not declare mem*, contrary to ANSI. - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include - -_ACEOF -if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | - $EGREP "memchr" >/dev/null 2>&1; then : - -else - ac_cv_header_stdc=no -fi -rm -f conftest* - -fi - -if test $ac_cv_header_stdc = yes; then - # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include - -_ACEOF -if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | - $EGREP "free" >/dev/null 2>&1; then : - -else - ac_cv_header_stdc=no -fi -rm -f conftest* - -fi - -if test $ac_cv_header_stdc = yes; then - # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi. - if test "$cross_compiling" = yes; then : - : -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include -#include -#if ((' ' & 0x0FF) == 0x020) -# define ISLOWER(c) ('a' <= (c) && (c) <= 'z') -# define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c)) -#else -# define ISLOWER(c) \ - (('a' <= (c) && (c) <= 'i') \ - || ('j' <= (c) && (c) <= 'r') \ - || ('s' <= (c) && (c) <= 'z')) -# define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c)) -#endif - -#define XOR(e, f) (((e) && !(f)) || (!(e) && (f))) -int -main () -{ - int i; - for (i = 0; i < 256; i++) - if (XOR (islower (i), ISLOWER (i)) - || toupper (i) != TOUPPER (i)) - return 2; - return 0; -} -_ACEOF -if ac_fn_c_try_run "$LINENO"; then : - -else - ac_cv_header_stdc=no -fi -rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ - conftest.$ac_objext conftest.beam conftest.$ac_ext -fi - -fi -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdc" >&5 -$as_echo "$ac_cv_header_stdc" >&6; } -if test $ac_cv_header_stdc = yes; then - -$as_echo "@%:@define STDC_HEADERS 1" >>confdefs.h - -fi - -for ac_header in arpa/inet.h fcntl.h netdb.h netinet/in.h stdlib.h string.h sys/socket.h sys/time.h unistd.h sys/utsname.h -do : - as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` -ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default" -if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : - cat >>confdefs.h <<_ACEOF -@%:@define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 -_ACEOF - -fi - -done - - -# Checks for typedefs, structures, and compiler characteristics. -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for an ANSI C-conforming const" >&5 -$as_echo_n "checking for an ANSI C-conforming const... " >&6; } -if ${ac_cv_c_const+:} false; then : - $as_echo_n "(cached) " >&6 -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -int -main () -{ - -#ifndef __cplusplus - /* Ultrix mips cc rejects this sort of thing. */ - typedef int charset[2]; - const charset cs = { 0, 0 }; - /* SunOS 4.1.1 cc rejects this. */ - char const *const *pcpcc; - char **ppc; - /* NEC SVR4.0.2 mips cc rejects this. */ - struct point {int x, y;}; - static struct point const zero = {0,0}; - /* AIX XL C 1.02.0.0 rejects this. - It does not let you subtract one const X* pointer from another in - an arm of an if-expression whose if-part is not a constant - expression */ - const char *g = "string"; - pcpcc = &g + (g ? g-g : 0); - /* HPUX 7.0 cc rejects these. */ - ++pcpcc; - ppc = (char**) pcpcc; - pcpcc = (char const *const *) ppc; - { /* SCO 3.2v4 cc rejects this sort of thing. */ - char tx; - char *t = &tx; - char const *s = 0 ? (char *) 0 : (char const *) 0; - - *t++ = 0; - if (s) return 0; - } - { /* Someone thinks the Sun supposedly-ANSI compiler will reject this. */ - int x[] = {25, 17}; - const int *foo = &x[0]; - ++foo; - } - { /* Sun SC1.0 ANSI compiler rejects this -- but not the above. */ - typedef const int *iptr; - iptr p = 0; - ++p; - } - { /* AIX XL C 1.02.0.0 rejects this sort of thing, saying - "k.c", line 2.27: 1506-025 (S) Operand must be a modifiable lvalue. */ - struct s { int j; const int *ap[3]; } bx; - struct s *b = &bx; b->j = 5; - } - { /* ULTRIX-32 V3.1 (Rev 9) vcc rejects this */ - const int foo = 10; - if (!foo) return 0; - } - return !cs[0] && !zero.x; -#endif - - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - ac_cv_c_const=yes -else - ac_cv_c_const=no -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_const" >&5 -$as_echo "$ac_cv_c_const" >&6; } -if test $ac_cv_c_const = no; then - -$as_echo "@%:@define const /**/" >>confdefs.h - -fi - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for inline" >&5 -$as_echo_n "checking for inline... " >&6; } -if ${ac_cv_c_inline+:} false; then : - $as_echo_n "(cached) " >&6 -else - ac_cv_c_inline=no -for ac_kw in inline __inline__ __inline; do - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#ifndef __cplusplus -typedef int foo_t; -static $ac_kw foo_t static_foo () {return 0; } -$ac_kw foo_t foo () {return 0; } -#endif - -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - ac_cv_c_inline=$ac_kw -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext - test "$ac_cv_c_inline" != no && break -done - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_inline" >&5 -$as_echo "$ac_cv_c_inline" >&6; } - -case $ac_cv_c_inline in - inline | yes) ;; - *) - case $ac_cv_c_inline in - no) ac_val=;; - *) ac_val=$ac_cv_c_inline;; - esac - cat >>confdefs.h <<_ACEOF -#ifndef __cplusplus -#define inline $ac_val -#endif -_ACEOF - ;; -esac - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether time.h and sys/time.h may both be included" >&5 -$as_echo_n "checking whether time.h and sys/time.h may both be included... " >&6; } -if ${ac_cv_header_time+:} false; then : - $as_echo_n "(cached) " >&6 -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include -#include -#include - -int -main () -{ -if ((struct tm *) 0) -return 0; - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - ac_cv_header_time=yes -else - ac_cv_header_time=no -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_time" >&5 -$as_echo "$ac_cv_header_time" >&6; } -if test $ac_cv_header_time = yes; then - -$as_echo "@%:@define TIME_WITH_SYS_TIME 1" >>confdefs.h - -fi - -ac_fn_c_check_type "$LINENO" "nfds_t" "ac_cv_type_nfds_t" "#include -" -if test "x$ac_cv_type_nfds_t" = xyes; then : - -$as_echo "@%:@define POLL_NFDS_TYPE nfds_t" >>confdefs.h - -else - -$as_echo "@%:@define POLL_NFDS_TYPE unsigned int" >>confdefs.h - -fi - - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to enable ipv6" >&5 -$as_echo_n "checking whether to enable ipv6... " >&6; } - -if test "$cross_compiling" = yes; then : - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } - ipv6=no -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - /* is AF_INET6 available? */ -#include -#include -main() -{ - if (socket(AF_INET6, SOCK_STREAM, 0) < 0) - exit(1); - else - exit(0); -} - -_ACEOF -if ac_fn_c_try_run "$LINENO"; then : - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; } - ipv6=yes -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } - ipv6=no -fi -rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ - conftest.$ac_objext conftest.beam conftest.$ac_ext -fi - - -if test x"$ipv6" = xyes; then - USEIPV6="-DZOO_IPV6_ENABLED" - -fi - -# Checks for library functions. -for ac_func in getcwd gethostbyname gethostname getlogin getpwuid_r gettimeofday getuid memmove memset poll socket strchr strdup strerror strtol -do : - as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` -ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var" -if eval test \"x\$"$as_ac_var"\" = x"yes"; then : - cat >>confdefs.h <<_ACEOF -@%:@define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 -_ACEOF - -fi -done - - -ac_config_files="$ac_config_files Makefile" - -cat >confcache <<\_ACEOF -# This file is a shell script that caches the results of configure -# tests run on this system so they can be shared between configure -# scripts and configure runs, see configure's option --config-cache. -# It is not useful on other systems. If it contains results you don't -# want to keep, you may remove or edit it. -# -# config.status only pays attention to the cache file if you give it -# the --recheck option to rerun configure. -# -# `ac_cv_env_foo' variables (set or unset) will be overridden when -# loading this file, other *unset* `ac_cv_foo' will be assigned the -# following values. - -_ACEOF - -# The following way of writing the cache mishandles newlines in values, -# but we know of no workaround that is simple, portable, and efficient. -# So, we kill variables containing newlines. -# Ultrix sh set writes to stderr and can't be redirected directly, -# and sets the high bit in the cache file unless we assign to the vars. -( - for ac_var in `(set) 2>&1 | sed -n 's/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'`; do - eval ac_val=\$$ac_var - case $ac_val in #( - *${as_nl}*) - case $ac_var in #( - *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 -$as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; - esac - case $ac_var in #( - _ | IFS | as_nl) ;; #( - BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( - *) { eval $ac_var=; unset $ac_var;} ;; - esac ;; - esac - done - - (set) 2>&1 | - case $as_nl`(ac_space=' '; set) 2>&1` in #( - *${as_nl}ac_space=\ *) - # `set' does not quote correctly, so add quotes: double-quote - # substitution turns \\\\ into \\, and sed turns \\ into \. - sed -n \ - "s/'/'\\\\''/g; - s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p" - ;; #( - *) - # `set' quotes correctly as required by POSIX, so do not add quotes. - sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" - ;; - esac | - sort -) | - sed ' - /^ac_cv_env_/b end - t clear - :clear - s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/ - t end - s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/ - :end' >>confcache -if diff "$cache_file" confcache >/dev/null 2>&1; then :; else - if test -w "$cache_file"; then - if test "x$cache_file" != "x/dev/null"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5 -$as_echo "$as_me: updating cache $cache_file" >&6;} - if test ! -f "$cache_file" || test -h "$cache_file"; then - cat confcache >"$cache_file" - else - case $cache_file in #( - */* | ?:*) - mv -f confcache "$cache_file"$$ && - mv -f "$cache_file"$$ "$cache_file" ;; #( - *) - mv -f confcache "$cache_file" ;; - esac - fi - fi - else - { $as_echo "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5 -$as_echo "$as_me: not updating unwritable cache $cache_file" >&6;} - fi -fi -rm -f confcache - -test "x$prefix" = xNONE && prefix=$ac_default_prefix -# Let make expand exec_prefix. -test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' - -DEFS=-DHAVE_CONFIG_H - -ac_libobjs= -ac_ltlibobjs= -U= -for ac_i in : $LIB@&t@OBJS; do test "x$ac_i" = x: && continue - # 1. Remove the extension, and $U if already installed. - ac_script='s/\$U\././;s/\.o$//;s/\.obj$//' - ac_i=`$as_echo "$ac_i" | sed "$ac_script"` - # 2. Prepend LIBOBJDIR. When used with automake>=1.10 LIBOBJDIR - # will be set to the directory where LIBOBJS objects are built. - as_fn_append ac_libobjs " \${LIBOBJDIR}$ac_i\$U.$ac_objext" - as_fn_append ac_ltlibobjs " \${LIBOBJDIR}$ac_i"'$U.lo' -done -LIB@&t@OBJS=$ac_libobjs - -LTLIBOBJS=$ac_ltlibobjs - - -if test -z "${DX_COND_doc_TRUE}" && test -z "${DX_COND_doc_FALSE}"; then - as_fn_error $? "conditional \"DX_COND_doc\" was never defined. -Usually this means the macro was only invoked conditionally." "$LINENO" 5 -fi -if test -z "${DX_COND_doc_TRUE}" && test -z "${DX_COND_doc_FALSE}"; then - as_fn_error $? "conditional \"DX_COND_doc\" was never defined. -Usually this means the macro was only invoked conditionally." "$LINENO" 5 -fi -if test -z "${DX_COND_dot_TRUE}" && test -z "${DX_COND_dot_FALSE}"; then - as_fn_error $? "conditional \"DX_COND_dot\" was never defined. -Usually this means the macro was only invoked conditionally." "$LINENO" 5 -fi -if test -z "${DX_COND_dot_TRUE}" && test -z "${DX_COND_dot_FALSE}"; then - as_fn_error $? "conditional \"DX_COND_dot\" was never defined. -Usually this means the macro was only invoked conditionally." "$LINENO" 5 -fi -if test -z "${DX_COND_man_TRUE}" && test -z "${DX_COND_man_FALSE}"; then - as_fn_error $? "conditional \"DX_COND_man\" was never defined. -Usually this means the macro was only invoked conditionally." "$LINENO" 5 -fi -if test -z "${DX_COND_man_TRUE}" && test -z "${DX_COND_man_FALSE}"; then - as_fn_error $? "conditional \"DX_COND_man\" was never defined. -Usually this means the macro was only invoked conditionally." "$LINENO" 5 -fi -if test -z "${DX_COND_rtf_TRUE}" && test -z "${DX_COND_rtf_FALSE}"; then - as_fn_error $? "conditional \"DX_COND_rtf\" was never defined. -Usually this means the macro was only invoked conditionally." "$LINENO" 5 -fi -if test -z "${DX_COND_rtf_TRUE}" && test -z "${DX_COND_rtf_FALSE}"; then - as_fn_error $? "conditional \"DX_COND_rtf\" was never defined. -Usually this means the macro was only invoked conditionally." "$LINENO" 5 -fi -if test -z "${DX_COND_xml_TRUE}" && test -z "${DX_COND_xml_FALSE}"; then - as_fn_error $? "conditional \"DX_COND_xml\" was never defined. -Usually this means the macro was only invoked conditionally." "$LINENO" 5 -fi -if test -z "${DX_COND_xml_TRUE}" && test -z "${DX_COND_xml_FALSE}"; then - as_fn_error $? "conditional \"DX_COND_xml\" was never defined. -Usually this means the macro was only invoked conditionally." "$LINENO" 5 -fi -if test -z "${DX_COND_chm_TRUE}" && test -z "${DX_COND_chm_FALSE}"; then - as_fn_error $? "conditional \"DX_COND_chm\" was never defined. -Usually this means the macro was only invoked conditionally." "$LINENO" 5 -fi -if test -z "${DX_COND_chm_TRUE}" && test -z "${DX_COND_chm_FALSE}"; then - as_fn_error $? "conditional \"DX_COND_chm\" was never defined. -Usually this means the macro was only invoked conditionally." "$LINENO" 5 -fi -if test -z "${DX_COND_chi_TRUE}" && test -z "${DX_COND_chi_FALSE}"; then - as_fn_error $? "conditional \"DX_COND_chi\" was never defined. -Usually this means the macro was only invoked conditionally." "$LINENO" 5 -fi -if test -z "${DX_COND_chi_TRUE}" && test -z "${DX_COND_chi_FALSE}"; then - as_fn_error $? "conditional \"DX_COND_chi\" was never defined. -Usually this means the macro was only invoked conditionally." "$LINENO" 5 -fi -if test -z "${DX_COND_html_TRUE}" && test -z "${DX_COND_html_FALSE}"; then - as_fn_error $? "conditional \"DX_COND_html\" was never defined. -Usually this means the macro was only invoked conditionally." "$LINENO" 5 -fi -if test -z "${DX_COND_html_TRUE}" && test -z "${DX_COND_html_FALSE}"; then - as_fn_error $? "conditional \"DX_COND_html\" was never defined. -Usually this means the macro was only invoked conditionally." "$LINENO" 5 -fi -if test -z "${DX_COND_ps_TRUE}" && test -z "${DX_COND_ps_FALSE}"; then - as_fn_error $? "conditional \"DX_COND_ps\" was never defined. -Usually this means the macro was only invoked conditionally." "$LINENO" 5 -fi -if test -z "${DX_COND_ps_TRUE}" && test -z "${DX_COND_ps_FALSE}"; then - as_fn_error $? "conditional \"DX_COND_ps\" was never defined. -Usually this means the macro was only invoked conditionally." "$LINENO" 5 -fi -if test -z "${DX_COND_pdf_TRUE}" && test -z "${DX_COND_pdf_FALSE}"; then - as_fn_error $? "conditional \"DX_COND_pdf\" was never defined. -Usually this means the macro was only invoked conditionally." "$LINENO" 5 -fi -if test -z "${DX_COND_pdf_TRUE}" && test -z "${DX_COND_pdf_FALSE}"; then - as_fn_error $? "conditional \"DX_COND_pdf\" was never defined. -Usually this means the macro was only invoked conditionally." "$LINENO" 5 -fi -if test -z "${DX_COND_latex_TRUE}" && test -z "${DX_COND_latex_FALSE}"; then - as_fn_error $? "conditional \"DX_COND_latex\" was never defined. -Usually this means the macro was only invoked conditionally." "$LINENO" 5 -fi -if test -z "${DX_COND_latex_TRUE}" && test -z "${DX_COND_latex_FALSE}"; then - as_fn_error $? "conditional \"DX_COND_latex\" was never defined. -Usually this means the macro was only invoked conditionally." "$LINENO" 5 -fi - if test -n "$EXEEXT"; then - am__EXEEXT_TRUE= - am__EXEEXT_FALSE='#' -else - am__EXEEXT_TRUE='#' - am__EXEEXT_FALSE= -fi - -if test -z "${AMDEP_TRUE}" && test -z "${AMDEP_FALSE}"; then - as_fn_error $? "conditional \"AMDEP\" was never defined. -Usually this means the macro was only invoked conditionally." "$LINENO" 5 -fi -if test -z "${am__fastdepCC_TRUE}" && test -z "${am__fastdepCC_FALSE}"; then - as_fn_error $? "conditional \"am__fastdepCC\" was never defined. -Usually this means the macro was only invoked conditionally." "$LINENO" 5 -fi -if test -z "${am__fastdepCXX_TRUE}" && test -z "${am__fastdepCXX_FALSE}"; then - as_fn_error $? "conditional \"am__fastdepCXX\" was never defined. -Usually this means the macro was only invoked conditionally." "$LINENO" 5 -fi -if test -z "${WANT_SYNCAPI_TRUE}" && test -z "${WANT_SYNCAPI_FALSE}"; then - as_fn_error $? "conditional \"WANT_SYNCAPI\" was never defined. -Usually this means the macro was only invoked conditionally." "$LINENO" 5 -fi - -: "${CONFIG_STATUS=./config.status}" -ac_write_fail=0 -ac_clean_files_save=$ac_clean_files -ac_clean_files="$ac_clean_files $CONFIG_STATUS" -{ $as_echo "$as_me:${as_lineno-$LINENO}: creating $CONFIG_STATUS" >&5 -$as_echo "$as_me: creating $CONFIG_STATUS" >&6;} -as_write_fail=0 -cat >$CONFIG_STATUS <<_ASEOF || as_write_fail=1 -#! $SHELL -# Generated by $as_me. -# Run this file to recreate the current configuration. -# Compiler output produced by configure, useful for debugging -# configure, is in config.log if it exists. - -debug=false -ac_cs_recheck=false -ac_cs_silent=false - -SHELL=\${CONFIG_SHELL-$SHELL} -export SHELL -_ASEOF -cat >>$CONFIG_STATUS <<\_ASEOF || as_write_fail=1 -## -------------------- ## -## M4sh Initialization. ## -## -------------------- ## - -# Be more Bourne compatible -DUALCASE=1; export DUALCASE # for MKS sh -if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : - emulate sh - NULLCMD=: - # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which - # is contrary to our usage. Disable this feature. - alias -g '${1+"$@"}'='"$@"' - setopt NO_GLOB_SUBST -else - case `(set -o) 2>/dev/null` in @%:@( - *posix*) : - set -o posix ;; @%:@( - *) : - ;; -esac -fi - - -as_nl=' -' -export as_nl -# Printing a long string crashes Solaris 7 /usr/bin/printf. -as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' -as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo -as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo -# Prefer a ksh shell builtin over an external printf program on Solaris, -# but without wasting forks for bash or zsh. -if test -z "$BASH_VERSION$ZSH_VERSION" \ - && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then - as_echo='print -r --' - as_echo_n='print -rn --' -elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then - as_echo='printf %s\n' - as_echo_n='printf %s' -else - if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then - as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' - as_echo_n='/usr/ucb/echo -n' - else - as_echo_body='eval expr "X$1" : "X\\(.*\\)"' - as_echo_n_body='eval - arg=$1; - case $arg in @%:@( - *"$as_nl"*) - expr "X$arg" : "X\\(.*\\)$as_nl"; - arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; - esac; - expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" - ' - export as_echo_n_body - as_echo_n='sh -c $as_echo_n_body as_echo' - fi - export as_echo_body - as_echo='sh -c $as_echo_body as_echo' -fi - -# The user is always right. -if test "${PATH_SEPARATOR+set}" != set; then - PATH_SEPARATOR=: - (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { - (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || - PATH_SEPARATOR=';' - } -fi - - -# IFS -# We need space, tab and new line, in precisely that order. Quoting is -# there to prevent editors from complaining about space-tab. -# (If _AS_PATH_WALK were called with IFS unset, it would disable word -# splitting by setting IFS to empty value.) -IFS=" "" $as_nl" - -# Find who we are. Look in the path if we contain no directory separator. -as_myself= -case $0 in @%:@(( - *[\\/]* ) as_myself=$0 ;; - *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break - done -IFS=$as_save_IFS - - ;; -esac -# We did not find ourselves, most probably we were run as `sh COMMAND' -# in which case we are not to be found in the path. -if test "x$as_myself" = x; then - as_myself=$0 -fi -if test ! -f "$as_myself"; then - $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 - exit 1 -fi - -# Unset variables that we do not need and which cause bugs (e.g. in -# pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" -# suppresses any "Segmentation fault" message there. '((' could -# trigger a bug in pdksh 5.2.14. -for as_var in BASH_ENV ENV MAIL MAILPATH -do eval test x\${$as_var+set} = xset \ - && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : -done -PS1='$ ' -PS2='> ' -PS4='+ ' - -# NLS nuisances. -LC_ALL=C -export LC_ALL -LANGUAGE=C -export LANGUAGE - -# CDPATH. -(unset CDPATH) >/dev/null 2>&1 && unset CDPATH - - -@%:@ as_fn_error STATUS ERROR [LINENO LOG_FD] -@%:@ ---------------------------------------- -@%:@ Output "`basename @S|@0`: error: ERROR" to stderr. If LINENO and LOG_FD are -@%:@ provided, also output the error to LOG_FD, referencing LINENO. Then exit the -@%:@ script with STATUS, using 1 if that was 0. -as_fn_error () -{ - as_status=$1; test $as_status -eq 0 && as_status=1 - if test "$4"; then - as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack - $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 - fi - $as_echo "$as_me: error: $2" >&2 - as_fn_exit $as_status -} @%:@ as_fn_error - - -@%:@ as_fn_set_status STATUS -@%:@ ----------------------- -@%:@ Set @S|@? to STATUS, without forking. -as_fn_set_status () -{ - return $1 -} @%:@ as_fn_set_status - -@%:@ as_fn_exit STATUS -@%:@ ----------------- -@%:@ Exit the shell with STATUS, even in a "trap 0" or "set -e" context. -as_fn_exit () -{ - set +e - as_fn_set_status $1 - exit $1 -} @%:@ as_fn_exit - -@%:@ as_fn_unset VAR -@%:@ --------------- -@%:@ Portably unset VAR. -as_fn_unset () -{ - { eval $1=; unset $1;} -} -as_unset=as_fn_unset -@%:@ as_fn_append VAR VALUE -@%:@ ---------------------- -@%:@ Append the text in VALUE to the end of the definition contained in VAR. Take -@%:@ advantage of any shell optimizations that allow amortized linear growth over -@%:@ repeated appends, instead of the typical quadratic growth present in naive -@%:@ implementations. -if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : - eval 'as_fn_append () - { - eval $1+=\$2 - }' -else - as_fn_append () - { - eval $1=\$$1\$2 - } -fi # as_fn_append - -@%:@ as_fn_arith ARG... -@%:@ ------------------ -@%:@ Perform arithmetic evaluation on the ARGs, and store the result in the -@%:@ global @S|@as_val. Take advantage of shells that can avoid forks. The arguments -@%:@ must be portable across @S|@(()) and expr. -if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : - eval 'as_fn_arith () - { - as_val=$(( $* )) - }' -else - as_fn_arith () - { - as_val=`expr "$@" || test $? -eq 1` - } -fi # as_fn_arith - - -if expr a : '\(a\)' >/dev/null 2>&1 && - test "X`expr 00001 : '.*\(...\)'`" = X001; then - as_expr=expr -else - as_expr=false -fi - -if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then - as_basename=basename -else - as_basename=false -fi - -if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then - as_dirname=dirname -else - as_dirname=false -fi - -as_me=`$as_basename -- "$0" || -$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ - X"$0" : 'X\(//\)$' \| \ - X"$0" : 'X\(/\)' \| . 2>/dev/null || -$as_echo X/"$0" | - sed '/^.*\/\([^/][^/]*\)\/*$/{ - s//\1/ - q - } - /^X\/\(\/\/\)$/{ - s//\1/ - q - } - /^X\/\(\/\).*/{ - s//\1/ - q - } - s/.*/./; q'` - -# Avoid depending upon Character Ranges. -as_cr_letters='abcdefghijklmnopqrstuvwxyz' -as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' -as_cr_Letters=$as_cr_letters$as_cr_LETTERS -as_cr_digits='0123456789' -as_cr_alnum=$as_cr_Letters$as_cr_digits - -ECHO_C= ECHO_N= ECHO_T= -case `echo -n x` in @%:@((((( --n*) - case `echo 'xy\c'` in - *c*) ECHO_T=' ';; # ECHO_T is single tab character. - xy) ECHO_C='\c';; - *) echo `echo ksh88 bug on AIX 6.1` > /dev/null - ECHO_T=' ';; - esac;; -*) - ECHO_N='-n';; -esac - -rm -f conf$$ conf$$.exe conf$$.file -if test -d conf$$.dir; then - rm -f conf$$.dir/conf$$.file -else - rm -f conf$$.dir - mkdir conf$$.dir 2>/dev/null -fi -if (echo >conf$$.file) 2>/dev/null; then - if ln -s conf$$.file conf$$ 2>/dev/null; then - as_ln_s='ln -s' - # ... but there are two gotchas: - # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. - # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. - # In both cases, we have to default to `cp -pR'. - ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || - as_ln_s='cp -pR' - elif ln conf$$.file conf$$ 2>/dev/null; then - as_ln_s=ln - else - as_ln_s='cp -pR' - fi -else - as_ln_s='cp -pR' -fi -rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file -rmdir conf$$.dir 2>/dev/null - - -@%:@ as_fn_mkdir_p -@%:@ ------------- -@%:@ Create "@S|@as_dir" as a directory, including parents if necessary. -as_fn_mkdir_p () -{ - - case $as_dir in #( - -*) as_dir=./$as_dir;; - esac - test -d "$as_dir" || eval $as_mkdir_p || { - as_dirs= - while :; do - case $as_dir in #( - *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( - *) as_qdir=$as_dir;; - esac - as_dirs="'$as_qdir' $as_dirs" - as_dir=`$as_dirname -- "$as_dir" || -$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ - X"$as_dir" : 'X\(//\)[^/]' \| \ - X"$as_dir" : 'X\(//\)$' \| \ - X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || -$as_echo X"$as_dir" | - sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ - s//\1/ - q - } - /^X\(\/\/\)[^/].*/{ - s//\1/ - q - } - /^X\(\/\/\)$/{ - s//\1/ - q - } - /^X\(\/\).*/{ - s//\1/ - q - } - s/.*/./; q'` - test -d "$as_dir" && break - done - test -z "$as_dirs" || eval "mkdir $as_dirs" - } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" - - -} @%:@ as_fn_mkdir_p -if mkdir -p . 2>/dev/null; then - as_mkdir_p='mkdir -p "$as_dir"' -else - test -d ./-p && rmdir ./-p - as_mkdir_p=false -fi - - -@%:@ as_fn_executable_p FILE -@%:@ ----------------------- -@%:@ Test if FILE is an executable regular file. -as_fn_executable_p () -{ - test -f "$1" && test -x "$1" -} @%:@ as_fn_executable_p -as_test_x='test -x' -as_executable_p=as_fn_executable_p - -# Sed expression to map a string onto a valid CPP name. -as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" - -# Sed expression to map a string onto a valid variable name. -as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" - - -exec 6>&1 -## ----------------------------------- ## -## Main body of $CONFIG_STATUS script. ## -## ----------------------------------- ## -_ASEOF -test $as_write_fail = 0 && chmod +x $CONFIG_STATUS || ac_write_fail=1 - -cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 -# Save the log message, to keep $0 and so on meaningful, and to -# report actual input values of CONFIG_FILES etc. instead of their -# values after options handling. -ac_log=" -This file was extended by zookeeper C client $as_me 3.4.6, which was -generated by GNU Autoconf 2.69. Invocation command line was - - CONFIG_FILES = $CONFIG_FILES - CONFIG_HEADERS = $CONFIG_HEADERS - CONFIG_LINKS = $CONFIG_LINKS - CONFIG_COMMANDS = $CONFIG_COMMANDS - $ $0 $@ - -on `(hostname || uname -n) 2>/dev/null | sed 1q` -" - -_ACEOF - -case $ac_config_files in *" -"*) set x $ac_config_files; shift; ac_config_files=$*;; -esac - -case $ac_config_headers in *" -"*) set x $ac_config_headers; shift; ac_config_headers=$*;; -esac - - -cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 -# Files that config.status was made for. -config_files="$ac_config_files" -config_headers="$ac_config_headers" -config_commands="$ac_config_commands" - -_ACEOF - -cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 -ac_cs_usage="\ -\`$as_me' instantiates files and other configuration actions -from templates according to the current configuration. Unless the files -and actions are specified as TAGs, all are instantiated by default. - -Usage: $0 [OPTION]... [TAG]... - - -h, --help print this help, then exit - -V, --version print version number and configuration settings, then exit - --config print configuration, then exit - -q, --quiet, --silent - do not print progress messages - -d, --debug don't remove temporary files - --recheck update $as_me by reconfiguring in the same conditions - --file=FILE[:TEMPLATE] - instantiate the configuration file FILE - --header=FILE[:TEMPLATE] - instantiate the configuration header FILE - -Configuration files: -$config_files - -Configuration headers: -$config_headers - -Configuration commands: -$config_commands - -Report bugs to ." - -_ACEOF -cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 -ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" -ac_cs_version="\\ -zookeeper C client config.status 3.4.6 -configured by $0, generated by GNU Autoconf 2.69, - with options \\"\$ac_cs_config\\" - -Copyright (C) 2012 Free Software Foundation, Inc. -This config.status script is free software; the Free Software Foundation -gives unlimited permission to copy, distribute and modify it." - -ac_pwd='$ac_pwd' -srcdir='$srcdir' -INSTALL='$INSTALL' -MKDIR_P='$MKDIR_P' -AWK='$AWK' -test -n "\$AWK" || AWK=awk -_ACEOF - -cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 -# The default lists apply if the user does not specify any file. -ac_need_defaults=: -while test $# != 0 -do - case $1 in - --*=?*) - ac_option=`expr "X$1" : 'X\([^=]*\)='` - ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'` - ac_shift=: - ;; - --*=) - ac_option=`expr "X$1" : 'X\([^=]*\)='` - ac_optarg= - ac_shift=: - ;; - *) - ac_option=$1 - ac_optarg=$2 - ac_shift=shift - ;; - esac - - case $ac_option in - # Handling of the options. - -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) - ac_cs_recheck=: ;; - --version | --versio | --versi | --vers | --ver | --ve | --v | -V ) - $as_echo "$ac_cs_version"; exit ;; - --config | --confi | --conf | --con | --co | --c ) - $as_echo "$ac_cs_config"; exit ;; - --debug | --debu | --deb | --de | --d | -d ) - debug=: ;; - --file | --fil | --fi | --f ) - $ac_shift - case $ac_optarg in - *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; - '') as_fn_error $? "missing file argument" ;; - esac - as_fn_append CONFIG_FILES " '$ac_optarg'" - ac_need_defaults=false;; - --header | --heade | --head | --hea ) - $ac_shift - case $ac_optarg in - *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; - esac - as_fn_append CONFIG_HEADERS " '$ac_optarg'" - ac_need_defaults=false;; - --he | --h) - # Conflict between --help and --header - as_fn_error $? "ambiguous option: \`$1' -Try \`$0 --help' for more information.";; - --help | --hel | -h ) - $as_echo "$ac_cs_usage"; exit ;; - -q | -quiet | --quiet | --quie | --qui | --qu | --q \ - | -silent | --silent | --silen | --sile | --sil | --si | --s) - ac_cs_silent=: ;; - - # This is an error. - -*) as_fn_error $? "unrecognized option: \`$1' -Try \`$0 --help' for more information." ;; - - *) as_fn_append ac_config_targets " $1" - ac_need_defaults=false ;; - - esac - shift -done - -ac_configure_extra_args= - -if $ac_cs_silent; then - exec 6>/dev/null - ac_configure_extra_args="$ac_configure_extra_args --silent" -fi - -_ACEOF -cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 -if \$ac_cs_recheck; then - set X $SHELL '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion - shift - \$as_echo "running CONFIG_SHELL=$SHELL \$*" >&6 - CONFIG_SHELL='$SHELL' - export CONFIG_SHELL - exec "\$@" -fi - -_ACEOF -cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 -exec 5>>config.log -{ - echo - sed 'h;s/./-/g;s/^.../@%:@@%:@ /;s/...$/ @%:@@%:@/;p;x;p;x' <<_ASBOX -@%:@@%:@ Running $as_me. @%:@@%:@ -_ASBOX - $as_echo "$ac_log" -} >&5 - -_ACEOF -cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 -# -# INIT-COMMANDS -# -AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir" - - -# The HP-UX ksh and POSIX shell print the target directory to stdout -# if CDPATH is set. -(unset CDPATH) >/dev/null 2>&1 && unset CDPATH - -sed_quote_subst='$sed_quote_subst' -double_quote_subst='$double_quote_subst' -delay_variable_subst='$delay_variable_subst' -macro_version='`$ECHO "$macro_version" | $SED "$delay_single_quote_subst"`' -macro_revision='`$ECHO "$macro_revision" | $SED "$delay_single_quote_subst"`' -enable_shared='`$ECHO "$enable_shared" | $SED "$delay_single_quote_subst"`' -enable_static='`$ECHO "$enable_static" | $SED "$delay_single_quote_subst"`' -pic_mode='`$ECHO "$pic_mode" | $SED "$delay_single_quote_subst"`' -enable_fast_install='`$ECHO "$enable_fast_install" | $SED "$delay_single_quote_subst"`' -SHELL='`$ECHO "$SHELL" | $SED "$delay_single_quote_subst"`' -ECHO='`$ECHO "$ECHO" | $SED "$delay_single_quote_subst"`' -PATH_SEPARATOR='`$ECHO "$PATH_SEPARATOR" | $SED "$delay_single_quote_subst"`' -host_alias='`$ECHO "$host_alias" | $SED "$delay_single_quote_subst"`' -host='`$ECHO "$host" | $SED "$delay_single_quote_subst"`' -host_os='`$ECHO "$host_os" | $SED "$delay_single_quote_subst"`' -build_alias='`$ECHO "$build_alias" | $SED "$delay_single_quote_subst"`' -build='`$ECHO "$build" | $SED "$delay_single_quote_subst"`' -build_os='`$ECHO "$build_os" | $SED "$delay_single_quote_subst"`' -SED='`$ECHO "$SED" | $SED "$delay_single_quote_subst"`' -Xsed='`$ECHO "$Xsed" | $SED "$delay_single_quote_subst"`' -GREP='`$ECHO "$GREP" | $SED "$delay_single_quote_subst"`' -EGREP='`$ECHO "$EGREP" | $SED "$delay_single_quote_subst"`' -FGREP='`$ECHO "$FGREP" | $SED "$delay_single_quote_subst"`' -LD='`$ECHO "$LD" | $SED "$delay_single_quote_subst"`' -NM='`$ECHO "$NM" | $SED "$delay_single_quote_subst"`' -LN_S='`$ECHO "$LN_S" | $SED "$delay_single_quote_subst"`' -max_cmd_len='`$ECHO "$max_cmd_len" | $SED "$delay_single_quote_subst"`' -ac_objext='`$ECHO "$ac_objext" | $SED "$delay_single_quote_subst"`' -exeext='`$ECHO "$exeext" | $SED "$delay_single_quote_subst"`' -lt_unset='`$ECHO "$lt_unset" | $SED "$delay_single_quote_subst"`' -lt_SP2NL='`$ECHO "$lt_SP2NL" | $SED "$delay_single_quote_subst"`' -lt_NL2SP='`$ECHO "$lt_NL2SP" | $SED "$delay_single_quote_subst"`' -lt_cv_to_host_file_cmd='`$ECHO "$lt_cv_to_host_file_cmd" | $SED "$delay_single_quote_subst"`' -lt_cv_to_tool_file_cmd='`$ECHO "$lt_cv_to_tool_file_cmd" | $SED "$delay_single_quote_subst"`' -reload_flag='`$ECHO "$reload_flag" | $SED "$delay_single_quote_subst"`' -reload_cmds='`$ECHO "$reload_cmds" | $SED "$delay_single_quote_subst"`' -OBJDUMP='`$ECHO "$OBJDUMP" | $SED "$delay_single_quote_subst"`' -deplibs_check_method='`$ECHO "$deplibs_check_method" | $SED "$delay_single_quote_subst"`' -file_magic_cmd='`$ECHO "$file_magic_cmd" | $SED "$delay_single_quote_subst"`' -file_magic_glob='`$ECHO "$file_magic_glob" | $SED "$delay_single_quote_subst"`' -want_nocaseglob='`$ECHO "$want_nocaseglob" | $SED "$delay_single_quote_subst"`' -DLLTOOL='`$ECHO "$DLLTOOL" | $SED "$delay_single_quote_subst"`' -sharedlib_from_linklib_cmd='`$ECHO "$sharedlib_from_linklib_cmd" | $SED "$delay_single_quote_subst"`' -AR='`$ECHO "$AR" | $SED "$delay_single_quote_subst"`' -AR_FLAGS='`$ECHO "$AR_FLAGS" | $SED "$delay_single_quote_subst"`' -archiver_list_spec='`$ECHO "$archiver_list_spec" | $SED "$delay_single_quote_subst"`' -STRIP='`$ECHO "$STRIP" | $SED "$delay_single_quote_subst"`' -RANLIB='`$ECHO "$RANLIB" | $SED "$delay_single_quote_subst"`' -old_postinstall_cmds='`$ECHO "$old_postinstall_cmds" | $SED "$delay_single_quote_subst"`' -old_postuninstall_cmds='`$ECHO "$old_postuninstall_cmds" | $SED "$delay_single_quote_subst"`' -old_archive_cmds='`$ECHO "$old_archive_cmds" | $SED "$delay_single_quote_subst"`' -lock_old_archive_extraction='`$ECHO "$lock_old_archive_extraction" | $SED "$delay_single_quote_subst"`' -CC='`$ECHO "$CC" | $SED "$delay_single_quote_subst"`' -CFLAGS='`$ECHO "$CFLAGS" | $SED "$delay_single_quote_subst"`' -compiler='`$ECHO "$compiler" | $SED "$delay_single_quote_subst"`' -GCC='`$ECHO "$GCC" | $SED "$delay_single_quote_subst"`' -lt_cv_sys_global_symbol_pipe='`$ECHO "$lt_cv_sys_global_symbol_pipe" | $SED "$delay_single_quote_subst"`' -lt_cv_sys_global_symbol_to_cdecl='`$ECHO "$lt_cv_sys_global_symbol_to_cdecl" | $SED "$delay_single_quote_subst"`' -lt_cv_sys_global_symbol_to_c_name_address='`$ECHO "$lt_cv_sys_global_symbol_to_c_name_address" | $SED "$delay_single_quote_subst"`' -lt_cv_sys_global_symbol_to_c_name_address_lib_prefix='`$ECHO "$lt_cv_sys_global_symbol_to_c_name_address_lib_prefix" | $SED "$delay_single_quote_subst"`' -nm_file_list_spec='`$ECHO "$nm_file_list_spec" | $SED "$delay_single_quote_subst"`' -lt_sysroot='`$ECHO "$lt_sysroot" | $SED "$delay_single_quote_subst"`' -objdir='`$ECHO "$objdir" | $SED "$delay_single_quote_subst"`' -MAGIC_CMD='`$ECHO "$MAGIC_CMD" | $SED "$delay_single_quote_subst"`' -lt_prog_compiler_no_builtin_flag='`$ECHO "$lt_prog_compiler_no_builtin_flag" | $SED "$delay_single_quote_subst"`' -lt_prog_compiler_pic='`$ECHO "$lt_prog_compiler_pic" | $SED "$delay_single_quote_subst"`' -lt_prog_compiler_wl='`$ECHO "$lt_prog_compiler_wl" | $SED "$delay_single_quote_subst"`' -lt_prog_compiler_static='`$ECHO "$lt_prog_compiler_static" | $SED "$delay_single_quote_subst"`' -lt_cv_prog_compiler_c_o='`$ECHO "$lt_cv_prog_compiler_c_o" | $SED "$delay_single_quote_subst"`' -need_locks='`$ECHO "$need_locks" | $SED "$delay_single_quote_subst"`' -MANIFEST_TOOL='`$ECHO "$MANIFEST_TOOL" | $SED "$delay_single_quote_subst"`' -DSYMUTIL='`$ECHO "$DSYMUTIL" | $SED "$delay_single_quote_subst"`' -NMEDIT='`$ECHO "$NMEDIT" | $SED "$delay_single_quote_subst"`' -LIPO='`$ECHO "$LIPO" | $SED "$delay_single_quote_subst"`' -OTOOL='`$ECHO "$OTOOL" | $SED "$delay_single_quote_subst"`' -OTOOL64='`$ECHO "$OTOOL64" | $SED "$delay_single_quote_subst"`' -libext='`$ECHO "$libext" | $SED "$delay_single_quote_subst"`' -shrext_cmds='`$ECHO "$shrext_cmds" | $SED "$delay_single_quote_subst"`' -extract_expsyms_cmds='`$ECHO "$extract_expsyms_cmds" | $SED "$delay_single_quote_subst"`' -archive_cmds_need_lc='`$ECHO "$archive_cmds_need_lc" | $SED "$delay_single_quote_subst"`' -enable_shared_with_static_runtimes='`$ECHO "$enable_shared_with_static_runtimes" | $SED "$delay_single_quote_subst"`' -export_dynamic_flag_spec='`$ECHO "$export_dynamic_flag_spec" | $SED "$delay_single_quote_subst"`' -whole_archive_flag_spec='`$ECHO "$whole_archive_flag_spec" | $SED "$delay_single_quote_subst"`' -compiler_needs_object='`$ECHO "$compiler_needs_object" | $SED "$delay_single_quote_subst"`' -old_archive_from_new_cmds='`$ECHO "$old_archive_from_new_cmds" | $SED "$delay_single_quote_subst"`' -old_archive_from_expsyms_cmds='`$ECHO "$old_archive_from_expsyms_cmds" | $SED "$delay_single_quote_subst"`' -archive_cmds='`$ECHO "$archive_cmds" | $SED "$delay_single_quote_subst"`' -archive_expsym_cmds='`$ECHO "$archive_expsym_cmds" | $SED "$delay_single_quote_subst"`' -module_cmds='`$ECHO "$module_cmds" | $SED "$delay_single_quote_subst"`' -module_expsym_cmds='`$ECHO "$module_expsym_cmds" | $SED "$delay_single_quote_subst"`' -with_gnu_ld='`$ECHO "$with_gnu_ld" | $SED "$delay_single_quote_subst"`' -allow_undefined_flag='`$ECHO "$allow_undefined_flag" | $SED "$delay_single_quote_subst"`' -no_undefined_flag='`$ECHO "$no_undefined_flag" | $SED "$delay_single_quote_subst"`' -hardcode_libdir_flag_spec='`$ECHO "$hardcode_libdir_flag_spec" | $SED "$delay_single_quote_subst"`' -hardcode_libdir_separator='`$ECHO "$hardcode_libdir_separator" | $SED "$delay_single_quote_subst"`' -hardcode_direct='`$ECHO "$hardcode_direct" | $SED "$delay_single_quote_subst"`' -hardcode_direct_absolute='`$ECHO "$hardcode_direct_absolute" | $SED "$delay_single_quote_subst"`' -hardcode_minus_L='`$ECHO "$hardcode_minus_L" | $SED "$delay_single_quote_subst"`' -hardcode_shlibpath_var='`$ECHO "$hardcode_shlibpath_var" | $SED "$delay_single_quote_subst"`' -hardcode_automatic='`$ECHO "$hardcode_automatic" | $SED "$delay_single_quote_subst"`' -inherit_rpath='`$ECHO "$inherit_rpath" | $SED "$delay_single_quote_subst"`' -link_all_deplibs='`$ECHO "$link_all_deplibs" | $SED "$delay_single_quote_subst"`' -always_export_symbols='`$ECHO "$always_export_symbols" | $SED "$delay_single_quote_subst"`' -export_symbols_cmds='`$ECHO "$export_symbols_cmds" | $SED "$delay_single_quote_subst"`' -exclude_expsyms='`$ECHO "$exclude_expsyms" | $SED "$delay_single_quote_subst"`' -include_expsyms='`$ECHO "$include_expsyms" | $SED "$delay_single_quote_subst"`' -prelink_cmds='`$ECHO "$prelink_cmds" | $SED "$delay_single_quote_subst"`' -postlink_cmds='`$ECHO "$postlink_cmds" | $SED "$delay_single_quote_subst"`' -file_list_spec='`$ECHO "$file_list_spec" | $SED "$delay_single_quote_subst"`' -variables_saved_for_relink='`$ECHO "$variables_saved_for_relink" | $SED "$delay_single_quote_subst"`' -need_lib_prefix='`$ECHO "$need_lib_prefix" | $SED "$delay_single_quote_subst"`' -need_version='`$ECHO "$need_version" | $SED "$delay_single_quote_subst"`' -version_type='`$ECHO "$version_type" | $SED "$delay_single_quote_subst"`' -runpath_var='`$ECHO "$runpath_var" | $SED "$delay_single_quote_subst"`' -shlibpath_var='`$ECHO "$shlibpath_var" | $SED "$delay_single_quote_subst"`' -shlibpath_overrides_runpath='`$ECHO "$shlibpath_overrides_runpath" | $SED "$delay_single_quote_subst"`' -libname_spec='`$ECHO "$libname_spec" | $SED "$delay_single_quote_subst"`' -library_names_spec='`$ECHO "$library_names_spec" | $SED "$delay_single_quote_subst"`' -soname_spec='`$ECHO "$soname_spec" | $SED "$delay_single_quote_subst"`' -install_override_mode='`$ECHO "$install_override_mode" | $SED "$delay_single_quote_subst"`' -postinstall_cmds='`$ECHO "$postinstall_cmds" | $SED "$delay_single_quote_subst"`' -postuninstall_cmds='`$ECHO "$postuninstall_cmds" | $SED "$delay_single_quote_subst"`' -finish_cmds='`$ECHO "$finish_cmds" | $SED "$delay_single_quote_subst"`' -finish_eval='`$ECHO "$finish_eval" | $SED "$delay_single_quote_subst"`' -hardcode_into_libs='`$ECHO "$hardcode_into_libs" | $SED "$delay_single_quote_subst"`' -sys_lib_search_path_spec='`$ECHO "$sys_lib_search_path_spec" | $SED "$delay_single_quote_subst"`' -sys_lib_dlsearch_path_spec='`$ECHO "$sys_lib_dlsearch_path_spec" | $SED "$delay_single_quote_subst"`' -hardcode_action='`$ECHO "$hardcode_action" | $SED "$delay_single_quote_subst"`' -enable_dlopen='`$ECHO "$enable_dlopen" | $SED "$delay_single_quote_subst"`' -enable_dlopen_self='`$ECHO "$enable_dlopen_self" | $SED "$delay_single_quote_subst"`' -enable_dlopen_self_static='`$ECHO "$enable_dlopen_self_static" | $SED "$delay_single_quote_subst"`' -old_striplib='`$ECHO "$old_striplib" | $SED "$delay_single_quote_subst"`' -striplib='`$ECHO "$striplib" | $SED "$delay_single_quote_subst"`' -compiler_lib_search_dirs='`$ECHO "$compiler_lib_search_dirs" | $SED "$delay_single_quote_subst"`' -predep_objects='`$ECHO "$predep_objects" | $SED "$delay_single_quote_subst"`' -postdep_objects='`$ECHO "$postdep_objects" | $SED "$delay_single_quote_subst"`' -predeps='`$ECHO "$predeps" | $SED "$delay_single_quote_subst"`' -postdeps='`$ECHO "$postdeps" | $SED "$delay_single_quote_subst"`' -compiler_lib_search_path='`$ECHO "$compiler_lib_search_path" | $SED "$delay_single_quote_subst"`' -LD_CXX='`$ECHO "$LD_CXX" | $SED "$delay_single_quote_subst"`' -reload_flag_CXX='`$ECHO "$reload_flag_CXX" | $SED "$delay_single_quote_subst"`' -reload_cmds_CXX='`$ECHO "$reload_cmds_CXX" | $SED "$delay_single_quote_subst"`' -old_archive_cmds_CXX='`$ECHO "$old_archive_cmds_CXX" | $SED "$delay_single_quote_subst"`' -compiler_CXX='`$ECHO "$compiler_CXX" | $SED "$delay_single_quote_subst"`' -GCC_CXX='`$ECHO "$GCC_CXX" | $SED "$delay_single_quote_subst"`' -lt_prog_compiler_no_builtin_flag_CXX='`$ECHO "$lt_prog_compiler_no_builtin_flag_CXX" | $SED "$delay_single_quote_subst"`' -lt_prog_compiler_pic_CXX='`$ECHO "$lt_prog_compiler_pic_CXX" | $SED "$delay_single_quote_subst"`' -lt_prog_compiler_wl_CXX='`$ECHO "$lt_prog_compiler_wl_CXX" | $SED "$delay_single_quote_subst"`' -lt_prog_compiler_static_CXX='`$ECHO "$lt_prog_compiler_static_CXX" | $SED "$delay_single_quote_subst"`' -lt_cv_prog_compiler_c_o_CXX='`$ECHO "$lt_cv_prog_compiler_c_o_CXX" | $SED "$delay_single_quote_subst"`' -archive_cmds_need_lc_CXX='`$ECHO "$archive_cmds_need_lc_CXX" | $SED "$delay_single_quote_subst"`' -enable_shared_with_static_runtimes_CXX='`$ECHO "$enable_shared_with_static_runtimes_CXX" | $SED "$delay_single_quote_subst"`' -export_dynamic_flag_spec_CXX='`$ECHO "$export_dynamic_flag_spec_CXX" | $SED "$delay_single_quote_subst"`' -whole_archive_flag_spec_CXX='`$ECHO "$whole_archive_flag_spec_CXX" | $SED "$delay_single_quote_subst"`' -compiler_needs_object_CXX='`$ECHO "$compiler_needs_object_CXX" | $SED "$delay_single_quote_subst"`' -old_archive_from_new_cmds_CXX='`$ECHO "$old_archive_from_new_cmds_CXX" | $SED "$delay_single_quote_subst"`' -old_archive_from_expsyms_cmds_CXX='`$ECHO "$old_archive_from_expsyms_cmds_CXX" | $SED "$delay_single_quote_subst"`' -archive_cmds_CXX='`$ECHO "$archive_cmds_CXX" | $SED "$delay_single_quote_subst"`' -archive_expsym_cmds_CXX='`$ECHO "$archive_expsym_cmds_CXX" | $SED "$delay_single_quote_subst"`' -module_cmds_CXX='`$ECHO "$module_cmds_CXX" | $SED "$delay_single_quote_subst"`' -module_expsym_cmds_CXX='`$ECHO "$module_expsym_cmds_CXX" | $SED "$delay_single_quote_subst"`' -with_gnu_ld_CXX='`$ECHO "$with_gnu_ld_CXX" | $SED "$delay_single_quote_subst"`' -allow_undefined_flag_CXX='`$ECHO "$allow_undefined_flag_CXX" | $SED "$delay_single_quote_subst"`' -no_undefined_flag_CXX='`$ECHO "$no_undefined_flag_CXX" | $SED "$delay_single_quote_subst"`' -hardcode_libdir_flag_spec_CXX='`$ECHO "$hardcode_libdir_flag_spec_CXX" | $SED "$delay_single_quote_subst"`' -hardcode_libdir_separator_CXX='`$ECHO "$hardcode_libdir_separator_CXX" | $SED "$delay_single_quote_subst"`' -hardcode_direct_CXX='`$ECHO "$hardcode_direct_CXX" | $SED "$delay_single_quote_subst"`' -hardcode_direct_absolute_CXX='`$ECHO "$hardcode_direct_absolute_CXX" | $SED "$delay_single_quote_subst"`' -hardcode_minus_L_CXX='`$ECHO "$hardcode_minus_L_CXX" | $SED "$delay_single_quote_subst"`' -hardcode_shlibpath_var_CXX='`$ECHO "$hardcode_shlibpath_var_CXX" | $SED "$delay_single_quote_subst"`' -hardcode_automatic_CXX='`$ECHO "$hardcode_automatic_CXX" | $SED "$delay_single_quote_subst"`' -inherit_rpath_CXX='`$ECHO "$inherit_rpath_CXX" | $SED "$delay_single_quote_subst"`' -link_all_deplibs_CXX='`$ECHO "$link_all_deplibs_CXX" | $SED "$delay_single_quote_subst"`' -always_export_symbols_CXX='`$ECHO "$always_export_symbols_CXX" | $SED "$delay_single_quote_subst"`' -export_symbols_cmds_CXX='`$ECHO "$export_symbols_cmds_CXX" | $SED "$delay_single_quote_subst"`' -exclude_expsyms_CXX='`$ECHO "$exclude_expsyms_CXX" | $SED "$delay_single_quote_subst"`' -include_expsyms_CXX='`$ECHO "$include_expsyms_CXX" | $SED "$delay_single_quote_subst"`' -prelink_cmds_CXX='`$ECHO "$prelink_cmds_CXX" | $SED "$delay_single_quote_subst"`' -postlink_cmds_CXX='`$ECHO "$postlink_cmds_CXX" | $SED "$delay_single_quote_subst"`' -file_list_spec_CXX='`$ECHO "$file_list_spec_CXX" | $SED "$delay_single_quote_subst"`' -hardcode_action_CXX='`$ECHO "$hardcode_action_CXX" | $SED "$delay_single_quote_subst"`' -compiler_lib_search_dirs_CXX='`$ECHO "$compiler_lib_search_dirs_CXX" | $SED "$delay_single_quote_subst"`' -predep_objects_CXX='`$ECHO "$predep_objects_CXX" | $SED "$delay_single_quote_subst"`' -postdep_objects_CXX='`$ECHO "$postdep_objects_CXX" | $SED "$delay_single_quote_subst"`' -predeps_CXX='`$ECHO "$predeps_CXX" | $SED "$delay_single_quote_subst"`' -postdeps_CXX='`$ECHO "$postdeps_CXX" | $SED "$delay_single_quote_subst"`' -compiler_lib_search_path_CXX='`$ECHO "$compiler_lib_search_path_CXX" | $SED "$delay_single_quote_subst"`' - -LTCC='$LTCC' -LTCFLAGS='$LTCFLAGS' -compiler='$compiler_DEFAULT' - -# A function that is used when there is no print builtin or printf. -func_fallback_echo () -{ - eval 'cat <<_LTECHO_EOF -\$1 -_LTECHO_EOF' -} - -# Quote evaled strings. -for var in SHELL \ -ECHO \ -PATH_SEPARATOR \ -SED \ -GREP \ -EGREP \ -FGREP \ -LD \ -NM \ -LN_S \ -lt_SP2NL \ -lt_NL2SP \ -reload_flag \ -OBJDUMP \ -deplibs_check_method \ -file_magic_cmd \ -file_magic_glob \ -want_nocaseglob \ -DLLTOOL \ -sharedlib_from_linklib_cmd \ -AR \ -AR_FLAGS \ -archiver_list_spec \ -STRIP \ -RANLIB \ -CC \ -CFLAGS \ -compiler \ -lt_cv_sys_global_symbol_pipe \ -lt_cv_sys_global_symbol_to_cdecl \ -lt_cv_sys_global_symbol_to_c_name_address \ -lt_cv_sys_global_symbol_to_c_name_address_lib_prefix \ -nm_file_list_spec \ -lt_prog_compiler_no_builtin_flag \ -lt_prog_compiler_pic \ -lt_prog_compiler_wl \ -lt_prog_compiler_static \ -lt_cv_prog_compiler_c_o \ -need_locks \ -MANIFEST_TOOL \ -DSYMUTIL \ -NMEDIT \ -LIPO \ -OTOOL \ -OTOOL64 \ -shrext_cmds \ -export_dynamic_flag_spec \ -whole_archive_flag_spec \ -compiler_needs_object \ -with_gnu_ld \ -allow_undefined_flag \ -no_undefined_flag \ -hardcode_libdir_flag_spec \ -hardcode_libdir_separator \ -exclude_expsyms \ -include_expsyms \ -file_list_spec \ -variables_saved_for_relink \ -libname_spec \ -library_names_spec \ -soname_spec \ -install_override_mode \ -finish_eval \ -old_striplib \ -striplib \ -compiler_lib_search_dirs \ -predep_objects \ -postdep_objects \ -predeps \ -postdeps \ -compiler_lib_search_path \ -LD_CXX \ -reload_flag_CXX \ -compiler_CXX \ -lt_prog_compiler_no_builtin_flag_CXX \ -lt_prog_compiler_pic_CXX \ -lt_prog_compiler_wl_CXX \ -lt_prog_compiler_static_CXX \ -lt_cv_prog_compiler_c_o_CXX \ -export_dynamic_flag_spec_CXX \ -whole_archive_flag_spec_CXX \ -compiler_needs_object_CXX \ -with_gnu_ld_CXX \ -allow_undefined_flag_CXX \ -no_undefined_flag_CXX \ -hardcode_libdir_flag_spec_CXX \ -hardcode_libdir_separator_CXX \ -exclude_expsyms_CXX \ -include_expsyms_CXX \ -file_list_spec_CXX \ -compiler_lib_search_dirs_CXX \ -predep_objects_CXX \ -postdep_objects_CXX \ -predeps_CXX \ -postdeps_CXX \ -compiler_lib_search_path_CXX; do - case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in - *[\\\\\\\`\\"\\\$]*) - eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED \\"\\\$sed_quote_subst\\"\\\`\\\\\\"" - ;; - *) - eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\"" - ;; - esac -done - -# Double-quote double-evaled strings. -for var in reload_cmds \ -old_postinstall_cmds \ -old_postuninstall_cmds \ -old_archive_cmds \ -extract_expsyms_cmds \ -old_archive_from_new_cmds \ -old_archive_from_expsyms_cmds \ -archive_cmds \ -archive_expsym_cmds \ -module_cmds \ -module_expsym_cmds \ -export_symbols_cmds \ -prelink_cmds \ -postlink_cmds \ -postinstall_cmds \ -postuninstall_cmds \ -finish_cmds \ -sys_lib_search_path_spec \ -sys_lib_dlsearch_path_spec \ -reload_cmds_CXX \ -old_archive_cmds_CXX \ -old_archive_from_new_cmds_CXX \ -old_archive_from_expsyms_cmds_CXX \ -archive_cmds_CXX \ -archive_expsym_cmds_CXX \ -module_cmds_CXX \ -module_expsym_cmds_CXX \ -export_symbols_cmds_CXX \ -prelink_cmds_CXX \ -postlink_cmds_CXX; do - case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in - *[\\\\\\\`\\"\\\$]*) - eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED -e \\"\\\$double_quote_subst\\" -e \\"\\\$sed_quote_subst\\" -e \\"\\\$delay_variable_subst\\"\\\`\\\\\\"" - ;; - *) - eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\"" - ;; - esac -done - -ac_aux_dir='$ac_aux_dir' -xsi_shell='$xsi_shell' -lt_shell_append='$lt_shell_append' - -# See if we are running on zsh, and set the options which allow our -# commands through without removal of \ escapes INIT. -if test -n "\${ZSH_VERSION+set}" ; then - setopt NO_GLOB_SUBST -fi - - - PACKAGE='$PACKAGE' - VERSION='$VERSION' - TIMESTAMP='$TIMESTAMP' - RM='$RM' - ofile='$ofile' - - - - - - -_ACEOF - -cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 - -# Handling of arguments. -for ac_config_target in $ac_config_targets -do - case $ac_config_target in - "config.h") CONFIG_HEADERS="$CONFIG_HEADERS config.h" ;; - "depfiles") CONFIG_COMMANDS="$CONFIG_COMMANDS depfiles" ;; - "libtool") CONFIG_COMMANDS="$CONFIG_COMMANDS libtool" ;; - "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;; - - *) as_fn_error $? "invalid argument: \`$ac_config_target'" "$LINENO" 5;; - esac -done - - -# If the user did not use the arguments to specify the items to instantiate, -# then the envvar interface is used. Set only those that are not. -# We use the long form for the default assignment because of an extremely -# bizarre bug on SunOS 4.1.3. -if $ac_need_defaults; then - test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files - test "${CONFIG_HEADERS+set}" = set || CONFIG_HEADERS=$config_headers - test "${CONFIG_COMMANDS+set}" = set || CONFIG_COMMANDS=$config_commands -fi - -# Have a temporary directory for convenience. Make it in the build tree -# simply because there is no reason against having it here, and in addition, -# creating and moving files from /tmp can sometimes cause problems. -# Hook for its removal unless debugging. -# Note that there is a small window in which the directory will not be cleaned: -# after its creation but before its name has been assigned to `$tmp'. -$debug || -{ - tmp= ac_tmp= - trap 'exit_status=$? - : "${ac_tmp:=$tmp}" - { test ! -d "$ac_tmp" || rm -fr "$ac_tmp"; } && exit $exit_status -' 0 - trap 'as_fn_exit 1' 1 2 13 15 -} -# Create a (secure) tmp directory for tmp files. - -{ - tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` && - test -d "$tmp" -} || -{ - tmp=./conf$$-$RANDOM - (umask 077 && mkdir "$tmp") -} || as_fn_error $? "cannot create a temporary directory in ." "$LINENO" 5 -ac_tmp=$tmp - -# Set up the scripts for CONFIG_FILES section. -# No need to generate them if there are no CONFIG_FILES. -# This happens for instance with `./config.status config.h'. -if test -n "$CONFIG_FILES"; then - - -ac_cr=`echo X | tr X '\015'` -# On cygwin, bash can eat \r inside `` if the user requested igncr. -# But we know of no other shell where ac_cr would be empty at this -# point, so we can use a bashism as a fallback. -if test "x$ac_cr" = x; then - eval ac_cr=\$\'\\r\' -fi -ac_cs_awk_cr=`$AWK 'BEGIN { print "a\rb" }' /dev/null` -if test "$ac_cs_awk_cr" = "a${ac_cr}b"; then - ac_cs_awk_cr='\\r' -else - ac_cs_awk_cr=$ac_cr -fi - -echo 'BEGIN {' >"$ac_tmp/subs1.awk" && -_ACEOF - - -{ - echo "cat >conf$$subs.awk <<_ACEOF" && - echo "$ac_subst_vars" | sed 's/.*/&!$&$ac_delim/' && - echo "_ACEOF" -} >conf$$subs.sh || - as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 -ac_delim_num=`echo "$ac_subst_vars" | grep -c '^'` -ac_delim='%!_!# ' -for ac_last_try in false false false false false :; do - . ./conf$$subs.sh || - as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 - - ac_delim_n=`sed -n "s/.*$ac_delim\$/X/p" conf$$subs.awk | grep -c X` - if test $ac_delim_n = $ac_delim_num; then - break - elif $ac_last_try; then - as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 - else - ac_delim="$ac_delim!$ac_delim _$ac_delim!! " - fi -done -rm -f conf$$subs.sh - -cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 -cat >>"\$ac_tmp/subs1.awk" <<\\_ACAWK && -_ACEOF -sed -n ' -h -s/^/S["/; s/!.*/"]=/ -p -g -s/^[^!]*!// -:repl -t repl -s/'"$ac_delim"'$// -t delim -:nl -h -s/\(.\{148\}\)..*/\1/ -t more1 -s/["\\]/\\&/g; s/^/"/; s/$/\\n"\\/ -p -n -b repl -:more1 -s/["\\]/\\&/g; s/^/"/; s/$/"\\/ -p -g -s/.\{148\}// -t nl -:delim -h -s/\(.\{148\}\)..*/\1/ -t more2 -s/["\\]/\\&/g; s/^/"/; s/$/"/ -p -b -:more2 -s/["\\]/\\&/g; s/^/"/; s/$/"\\/ -p -g -s/.\{148\}// -t delim -' >$CONFIG_STATUS || ac_write_fail=1 -rm -f conf$$subs.awk -cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 -_ACAWK -cat >>"\$ac_tmp/subs1.awk" <<_ACAWK && - for (key in S) S_is_set[key] = 1 - FS = "" - -} -{ - line = $ 0 - nfields = split(line, field, "@") - substed = 0 - len = length(field[1]) - for (i = 2; i < nfields; i++) { - key = field[i] - keylen = length(key) - if (S_is_set[key]) { - value = S[key] - line = substr(line, 1, len) "" value "" substr(line, len + keylen + 3) - len += length(value) + length(field[++i]) - substed = 1 - } else - len += 1 + keylen - } - - print line -} - -_ACAWK -_ACEOF -cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 -if sed "s/$ac_cr//" < /dev/null > /dev/null 2>&1; then - sed "s/$ac_cr\$//; s/$ac_cr/$ac_cs_awk_cr/g" -else - cat -fi < "$ac_tmp/subs1.awk" > "$ac_tmp/subs.awk" \ - || as_fn_error $? "could not setup config files machinery" "$LINENO" 5 -_ACEOF - -# VPATH may cause trouble with some makes, so we remove sole $(srcdir), -# ${srcdir} and @srcdir@ entries from VPATH if srcdir is ".", strip leading and -# trailing colons and then remove the whole line if VPATH becomes empty -# (actually we leave an empty line to preserve line numbers). -if test "x$srcdir" = x.; then - ac_vpsub='/^[ ]*VPATH[ ]*=[ ]*/{ -h -s/// -s/^/:/ -s/[ ]*$/:/ -s/:\$(srcdir):/:/g -s/:\${srcdir}:/:/g -s/:@srcdir@:/:/g -s/^:*// -s/:*$// -x -s/\(=[ ]*\).*/\1/ -G -s/\n// -s/^[^=]*=[ ]*$// -}' -fi - -cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 -fi # test -n "$CONFIG_FILES" - -# Set up the scripts for CONFIG_HEADERS section. -# No need to generate them if there are no CONFIG_HEADERS. -# This happens for instance with `./config.status Makefile'. -if test -n "$CONFIG_HEADERS"; then -cat >"$ac_tmp/defines.awk" <<\_ACAWK || -BEGIN { -_ACEOF - -# Transform confdefs.h into an awk script `defines.awk', embedded as -# here-document in config.status, that substitutes the proper values into -# config.h.in to produce config.h. - -# Create a delimiter string that does not exist in confdefs.h, to ease -# handling of long lines. -ac_delim='%!_!# ' -for ac_last_try in false false :; do - ac_tt=`sed -n "/$ac_delim/p" confdefs.h` - if test -z "$ac_tt"; then - break - elif $ac_last_try; then - as_fn_error $? "could not make $CONFIG_HEADERS" "$LINENO" 5 - else - ac_delim="$ac_delim!$ac_delim _$ac_delim!! " - fi -done - -# For the awk script, D is an array of macro values keyed by name, -# likewise P contains macro parameters if any. Preserve backslash -# newline sequences. - -ac_word_re=[_$as_cr_Letters][_$as_cr_alnum]* -sed -n ' -s/.\{148\}/&'"$ac_delim"'/g -t rset -:rset -s/^[ ]*#[ ]*define[ ][ ]*/ / -t def -d -:def -s/\\$// -t bsnl -s/["\\]/\\&/g -s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\ -D["\1"]=" \3"/p -s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2"/p -d -:bsnl -s/["\\]/\\&/g -s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\ -D["\1"]=" \3\\\\\\n"\\/p -t cont -s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2\\\\\\n"\\/p -t cont -d -:cont -n -s/.\{148\}/&'"$ac_delim"'/g -t clear -:clear -s/\\$// -t bsnlc -s/["\\]/\\&/g; s/^/"/; s/$/"/p -d -:bsnlc -s/["\\]/\\&/g; s/^/"/; s/$/\\\\\\n"\\/p -b cont -' >$CONFIG_STATUS || ac_write_fail=1 - -cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 - for (key in D) D_is_set[key] = 1 - FS = "" -} -/^[\t ]*#[\t ]*(define|undef)[\t ]+$ac_word_re([\t (]|\$)/ { - line = \$ 0 - split(line, arg, " ") - if (arg[1] == "#") { - defundef = arg[2] - mac1 = arg[3] - } else { - defundef = substr(arg[1], 2) - mac1 = arg[2] - } - split(mac1, mac2, "(") #) - macro = mac2[1] - prefix = substr(line, 1, index(line, defundef) - 1) - if (D_is_set[macro]) { - # Preserve the white space surrounding the "#". - print prefix "define", macro P[macro] D[macro] - next - } else { - # Replace #undef with comments. This is necessary, for example, - # in the case of _POSIX_SOURCE, which is predefined and required - # on some systems where configure will not decide to define it. - if (defundef == "undef") { - print "/*", prefix defundef, macro, "*/" - next - } - } -} -{ print } -_ACAWK -_ACEOF -cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 - as_fn_error $? "could not setup config headers machinery" "$LINENO" 5 -fi # test -n "$CONFIG_HEADERS" - - -eval set X " :F $CONFIG_FILES :H $CONFIG_HEADERS :C $CONFIG_COMMANDS" -shift -for ac_tag -do - case $ac_tag in - :[FHLC]) ac_mode=$ac_tag; continue;; - esac - case $ac_mode$ac_tag in - :[FHL]*:*);; - :L* | :C*:*) as_fn_error $? "invalid tag \`$ac_tag'" "$LINENO" 5;; - :[FH]-) ac_tag=-:-;; - :[FH]*) ac_tag=$ac_tag:$ac_tag.in;; - esac - ac_save_IFS=$IFS - IFS=: - set x $ac_tag - IFS=$ac_save_IFS - shift - ac_file=$1 - shift - - case $ac_mode in - :L) ac_source=$1;; - :[FH]) - ac_file_inputs= - for ac_f - do - case $ac_f in - -) ac_f="$ac_tmp/stdin";; - *) # Look for the file first in the build tree, then in the source tree - # (if the path is not absolute). The absolute path cannot be DOS-style, - # because $ac_f cannot contain `:'. - test -f "$ac_f" || - case $ac_f in - [\\/$]*) false;; - *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";; - esac || - as_fn_error 1 "cannot find input file: \`$ac_f'" "$LINENO" 5;; - esac - case $ac_f in *\'*) ac_f=`$as_echo "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac - as_fn_append ac_file_inputs " '$ac_f'" - done - - # Let's still pretend it is `configure' which instantiates (i.e., don't - # use $as_me), people would be surprised to read: - # /* config.h. Generated by config.status. */ - configure_input='Generated from '` - $as_echo "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g' - `' by configure.' - if test x"$ac_file" != x-; then - configure_input="$ac_file. $configure_input" - { $as_echo "$as_me:${as_lineno-$LINENO}: creating $ac_file" >&5 -$as_echo "$as_me: creating $ac_file" >&6;} - fi - # Neutralize special characters interpreted by sed in replacement strings. - case $configure_input in #( - *\&* | *\|* | *\\* ) - ac_sed_conf_input=`$as_echo "$configure_input" | - sed 's/[\\\\&|]/\\\\&/g'`;; #( - *) ac_sed_conf_input=$configure_input;; - esac - - case $ac_tag in - *:-:* | *:-) cat >"$ac_tmp/stdin" \ - || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; - esac - ;; - esac - - ac_dir=`$as_dirname -- "$ac_file" || -$as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ - X"$ac_file" : 'X\(//\)[^/]' \| \ - X"$ac_file" : 'X\(//\)$' \| \ - X"$ac_file" : 'X\(/\)' \| . 2>/dev/null || -$as_echo X"$ac_file" | - sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ - s//\1/ - q - } - /^X\(\/\/\)[^/].*/{ - s//\1/ - q - } - /^X\(\/\/\)$/{ - s//\1/ - q - } - /^X\(\/\).*/{ - s//\1/ - q - } - s/.*/./; q'` - as_dir="$ac_dir"; as_fn_mkdir_p - ac_builddir=. - -case "$ac_dir" in -.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; -*) - ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` - # A ".." for each directory in $ac_dir_suffix. - ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` - case $ac_top_builddir_sub in - "") ac_top_builddir_sub=. ac_top_build_prefix= ;; - *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; - esac ;; -esac -ac_abs_top_builddir=$ac_pwd -ac_abs_builddir=$ac_pwd$ac_dir_suffix -# for backward compatibility: -ac_top_builddir=$ac_top_build_prefix - -case $srcdir in - .) # We are building in place. - ac_srcdir=. - ac_top_srcdir=$ac_top_builddir_sub - ac_abs_top_srcdir=$ac_pwd ;; - [\\/]* | ?:[\\/]* ) # Absolute name. - ac_srcdir=$srcdir$ac_dir_suffix; - ac_top_srcdir=$srcdir - ac_abs_top_srcdir=$srcdir ;; - *) # Relative name. - ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix - ac_top_srcdir=$ac_top_build_prefix$srcdir - ac_abs_top_srcdir=$ac_pwd/$srcdir ;; -esac -ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix - - - case $ac_mode in - :F) - # - # CONFIG_FILE - # - - case $INSTALL in - [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;; - *) ac_INSTALL=$ac_top_build_prefix$INSTALL ;; - esac - ac_MKDIR_P=$MKDIR_P - case $MKDIR_P in - [\\/$]* | ?:[\\/]* ) ;; - */*) ac_MKDIR_P=$ac_top_build_prefix$MKDIR_P ;; - esac -_ACEOF - -cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 -# If the template does not know about datarootdir, expand it. -# FIXME: This hack should be removed a few years after 2.60. -ac_datarootdir_hack=; ac_datarootdir_seen= -ac_sed_dataroot=' -/datarootdir/ { - p - q -} -/@datadir@/p -/@docdir@/p -/@infodir@/p -/@localedir@/p -/@mandir@/p' -case `eval "sed -n \"\$ac_sed_dataroot\" $ac_file_inputs"` in -*datarootdir*) ac_datarootdir_seen=yes;; -*@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*) - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5 -$as_echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;} -_ACEOF -cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 - ac_datarootdir_hack=' - s&@datadir@&$datadir&g - s&@docdir@&$docdir&g - s&@infodir@&$infodir&g - s&@localedir@&$localedir&g - s&@mandir@&$mandir&g - s&\\\${datarootdir}&$datarootdir&g' ;; -esac -_ACEOF - -# Neutralize VPATH when `$srcdir' = `.'. -# Shell code in configure.ac might set extrasub. -# FIXME: do we really want to maintain this feature? -cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 -ac_sed_extra="$ac_vpsub -$extrasub -_ACEOF -cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 -:t -/@[a-zA-Z_][a-zA-Z_0-9]*@/!b -s|@configure_input@|$ac_sed_conf_input|;t t -s&@top_builddir@&$ac_top_builddir_sub&;t t -s&@top_build_prefix@&$ac_top_build_prefix&;t t -s&@srcdir@&$ac_srcdir&;t t -s&@abs_srcdir@&$ac_abs_srcdir&;t t -s&@top_srcdir@&$ac_top_srcdir&;t t -s&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t -s&@builddir@&$ac_builddir&;t t -s&@abs_builddir@&$ac_abs_builddir&;t t -s&@abs_top_builddir@&$ac_abs_top_builddir&;t t -s&@INSTALL@&$ac_INSTALL&;t t -s&@MKDIR_P@&$ac_MKDIR_P&;t t -$ac_datarootdir_hack -" -eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$ac_tmp/subs.awk" \ - >$ac_tmp/out || as_fn_error $? "could not create $ac_file" "$LINENO" 5 - -test -z "$ac_datarootdir_hack$ac_datarootdir_seen" && - { ac_out=`sed -n '/\${datarootdir}/p' "$ac_tmp/out"`; test -n "$ac_out"; } && - { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' \ - "$ac_tmp/out"`; test -z "$ac_out"; } && - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \`datarootdir' -which seems to be undefined. Please make sure it is defined" >&5 -$as_echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir' -which seems to be undefined. Please make sure it is defined" >&2;} - - rm -f "$ac_tmp/stdin" - case $ac_file in - -) cat "$ac_tmp/out" && rm -f "$ac_tmp/out";; - *) rm -f "$ac_file" && mv "$ac_tmp/out" "$ac_file";; - esac \ - || as_fn_error $? "could not create $ac_file" "$LINENO" 5 - ;; - :H) - # - # CONFIG_HEADER - # - if test x"$ac_file" != x-; then - { - $as_echo "/* $configure_input */" \ - && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" - } >"$ac_tmp/config.h" \ - || as_fn_error $? "could not create $ac_file" "$LINENO" 5 - if diff "$ac_file" "$ac_tmp/config.h" >/dev/null 2>&1; then - { $as_echo "$as_me:${as_lineno-$LINENO}: $ac_file is unchanged" >&5 -$as_echo "$as_me: $ac_file is unchanged" >&6;} - else - rm -f "$ac_file" - mv "$ac_tmp/config.h" "$ac_file" \ - || as_fn_error $? "could not create $ac_file" "$LINENO" 5 - fi - else - $as_echo "/* $configure_input */" \ - && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" \ - || as_fn_error $? "could not create -" "$LINENO" 5 - fi -# Compute "$ac_file"'s index in $config_headers. -_am_arg="$ac_file" -_am_stamp_count=1 -for _am_header in $config_headers :; do - case $_am_header in - $_am_arg | $_am_arg:* ) - break ;; - * ) - _am_stamp_count=`expr $_am_stamp_count + 1` ;; - esac -done -echo "timestamp for $_am_arg" >`$as_dirname -- "$_am_arg" || -$as_expr X"$_am_arg" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ - X"$_am_arg" : 'X\(//\)[^/]' \| \ - X"$_am_arg" : 'X\(//\)$' \| \ - X"$_am_arg" : 'X\(/\)' \| . 2>/dev/null || -$as_echo X"$_am_arg" | - sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ - s//\1/ - q - } - /^X\(\/\/\)[^/].*/{ - s//\1/ - q - } - /^X\(\/\/\)$/{ - s//\1/ - q - } - /^X\(\/\).*/{ - s//\1/ - q - } - s/.*/./; q'`/stamp-h$_am_stamp_count - ;; - - :C) { $as_echo "$as_me:${as_lineno-$LINENO}: executing $ac_file commands" >&5 -$as_echo "$as_me: executing $ac_file commands" >&6;} - ;; - esac - - - case $ac_file$ac_mode in - "depfiles":C) test x"$AMDEP_TRUE" != x"" || { - # Autoconf 2.62 quotes --file arguments for eval, but not when files - # are listed without --file. Let's play safe and only enable the eval - # if we detect the quoting. - case $CONFIG_FILES in - *\'*) eval set x "$CONFIG_FILES" ;; - *) set x $CONFIG_FILES ;; - esac - shift - for mf - do - # Strip MF so we end up with the name of the file. - mf=`echo "$mf" | sed -e 's/:.*$//'` - # Check whether this is an Automake generated Makefile or not. - # We used to match only the files named `Makefile.in', but - # some people rename them; so instead we look at the file content. - # Grep'ing the first line is not enough: some people post-process - # each Makefile.in and add a new line on top of each file to say so. - # Grep'ing the whole file is not good either: AIX grep has a line - # limit of 2048, but all sed's we know have understand at least 4000. - if sed -n 's,^#.*generated by automake.*,X,p' "$mf" | grep X >/dev/null 2>&1; then - dirpart=`$as_dirname -- "$mf" || -$as_expr X"$mf" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ - X"$mf" : 'X\(//\)[^/]' \| \ - X"$mf" : 'X\(//\)$' \| \ - X"$mf" : 'X\(/\)' \| . 2>/dev/null || -$as_echo X"$mf" | - sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ - s//\1/ - q - } - /^X\(\/\/\)[^/].*/{ - s//\1/ - q - } - /^X\(\/\/\)$/{ - s//\1/ - q - } - /^X\(\/\).*/{ - s//\1/ - q - } - s/.*/./; q'` - else - continue - fi - # Extract the definition of DEPDIR, am__include, and am__quote - # from the Makefile without running `make'. - DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"` - test -z "$DEPDIR" && continue - am__include=`sed -n 's/^am__include = //p' < "$mf"` - test -z "am__include" && continue - am__quote=`sed -n 's/^am__quote = //p' < "$mf"` - # When using ansi2knr, U may be empty or an underscore; expand it - U=`sed -n 's/^U = //p' < "$mf"` - # Find all dependency output files, they are included files with - # $(DEPDIR) in their names. We invoke sed twice because it is the - # simplest approach to changing $(DEPDIR) to its actual value in the - # expansion. - for file in `sed -n " - s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \ - sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g' -e 's/\$U/'"$U"'/g'`; do - # Make sure the directory exists. - test -f "$dirpart/$file" && continue - fdir=`$as_dirname -- "$file" || -$as_expr X"$file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ - X"$file" : 'X\(//\)[^/]' \| \ - X"$file" : 'X\(//\)$' \| \ - X"$file" : 'X\(/\)' \| . 2>/dev/null || -$as_echo X"$file" | - sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ - s//\1/ - q - } - /^X\(\/\/\)[^/].*/{ - s//\1/ - q - } - /^X\(\/\/\)$/{ - s//\1/ - q - } - /^X\(\/\).*/{ - s//\1/ - q - } - s/.*/./; q'` - as_dir=$dirpart/$fdir; as_fn_mkdir_p - # echo "creating $dirpart/$file" - echo '# dummy' > "$dirpart/$file" - done - done -} - ;; - "libtool":C) - - # See if we are running on zsh, and set the options which allow our - # commands through without removal of \ escapes. - if test -n "${ZSH_VERSION+set}" ; then - setopt NO_GLOB_SUBST - fi - - cfgfile="${ofile}T" - trap "$RM \"$cfgfile\"; exit 1" 1 2 15 - $RM "$cfgfile" - - cat <<_LT_EOF >> "$cfgfile" -#! $SHELL - -# `$ECHO "$ofile" | sed 's%^.*/%%'` - Provide generalized library-building support services. -# Generated automatically by $as_me ($PACKAGE$TIMESTAMP) $VERSION -# Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`: -# NOTE: Changes made to this file will be lost: look at ltmain.sh. -# -# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005, -# 2006, 2007, 2008, 2009, 2010, 2011 Free Software -# Foundation, Inc. -# Written by Gordon Matzigkeit, 1996 -# -# This file is part of GNU Libtool. -# -# GNU Libtool is free software; you can redistribute it and/or -# modify it under the terms of the GNU General Public License as -# published by the Free Software Foundation; either version 2 of -# the License, or (at your option) any later version. -# -# As a special exception to the GNU General Public License, -# if you distribute this file as part of a program or library that -# is built using GNU Libtool, you may include this file under the -# same distribution terms that you use for the rest of that program. -# -# GNU Libtool is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with GNU Libtool; see the file COPYING. If not, a copy -# can be downloaded from http://www.gnu.org/licenses/gpl.html, or -# obtained by writing to the Free Software Foundation, Inc., -# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - - -# The names of the tagged configurations supported by this script. -available_tags="CXX " - -# ### BEGIN LIBTOOL CONFIG - -# Which release of libtool.m4 was used? -macro_version=$macro_version -macro_revision=$macro_revision - -# Whether or not to build shared libraries. -build_libtool_libs=$enable_shared - -# Whether or not to build static libraries. -build_old_libs=$enable_static - -# What type of objects to build. -pic_mode=$pic_mode - -# Whether or not to optimize for fast installation. -fast_install=$enable_fast_install - -# Shell to use when invoking shell scripts. -SHELL=$lt_SHELL - -# An echo program that protects backslashes. -ECHO=$lt_ECHO - -# The PATH separator for the build system. -PATH_SEPARATOR=$lt_PATH_SEPARATOR - -# The host system. -host_alias=$host_alias -host=$host -host_os=$host_os - -# The build system. -build_alias=$build_alias -build=$build -build_os=$build_os - -# A sed program that does not truncate output. -SED=$lt_SED - -# Sed that helps us avoid accidentally triggering echo(1) options like -n. -Xsed="\$SED -e 1s/^X//" - -# A grep program that handles long lines. -GREP=$lt_GREP - -# An ERE matcher. -EGREP=$lt_EGREP - -# A literal string matcher. -FGREP=$lt_FGREP - -# A BSD- or MS-compatible name lister. -NM=$lt_NM - -# Whether we need soft or hard links. -LN_S=$lt_LN_S - -# What is the maximum length of a command? -max_cmd_len=$max_cmd_len - -# Object file suffix (normally "o"). -objext=$ac_objext - -# Executable file suffix (normally ""). -exeext=$exeext - -# whether the shell understands "unset". -lt_unset=$lt_unset - -# turn spaces into newlines. -SP2NL=$lt_lt_SP2NL - -# turn newlines into spaces. -NL2SP=$lt_lt_NL2SP - -# convert \$build file names to \$host format. -to_host_file_cmd=$lt_cv_to_host_file_cmd - -# convert \$build files to toolchain format. -to_tool_file_cmd=$lt_cv_to_tool_file_cmd - -# An object symbol dumper. -OBJDUMP=$lt_OBJDUMP - -# Method to check whether dependent libraries are shared objects. -deplibs_check_method=$lt_deplibs_check_method - -# Command to use when deplibs_check_method = "file_magic". -file_magic_cmd=$lt_file_magic_cmd - -# How to find potential files when deplibs_check_method = "file_magic". -file_magic_glob=$lt_file_magic_glob - -# Find potential files using nocaseglob when deplibs_check_method = "file_magic". -want_nocaseglob=$lt_want_nocaseglob - -# DLL creation program. -DLLTOOL=$lt_DLLTOOL - -# Command to associate shared and link libraries. -sharedlib_from_linklib_cmd=$lt_sharedlib_from_linklib_cmd - -# The archiver. -AR=$lt_AR - -# Flags to create an archive. -AR_FLAGS=$lt_AR_FLAGS - -# How to feed a file listing to the archiver. -archiver_list_spec=$lt_archiver_list_spec - -# A symbol stripping program. -STRIP=$lt_STRIP - -# Commands used to install an old-style archive. -RANLIB=$lt_RANLIB -old_postinstall_cmds=$lt_old_postinstall_cmds -old_postuninstall_cmds=$lt_old_postuninstall_cmds - -# Whether to use a lock for old archive extraction. -lock_old_archive_extraction=$lock_old_archive_extraction - -# A C compiler. -LTCC=$lt_CC - -# LTCC compiler flags. -LTCFLAGS=$lt_CFLAGS - -# Take the output of nm and produce a listing of raw symbols and C names. -global_symbol_pipe=$lt_lt_cv_sys_global_symbol_pipe - -# Transform the output of nm in a proper C declaration. -global_symbol_to_cdecl=$lt_lt_cv_sys_global_symbol_to_cdecl - -# Transform the output of nm in a C name address pair. -global_symbol_to_c_name_address=$lt_lt_cv_sys_global_symbol_to_c_name_address - -# Transform the output of nm in a C name address pair when lib prefix is needed. -global_symbol_to_c_name_address_lib_prefix=$lt_lt_cv_sys_global_symbol_to_c_name_address_lib_prefix - -# Specify filename containing input files for \$NM. -nm_file_list_spec=$lt_nm_file_list_spec - -# The root where to search for dependent libraries,and in which our libraries should be installed. -lt_sysroot=$lt_sysroot - -# The name of the directory that contains temporary libtool files. -objdir=$objdir - -# Used to examine libraries when file_magic_cmd begins with "file". -MAGIC_CMD=$MAGIC_CMD - -# Must we lock files when doing compilation? -need_locks=$lt_need_locks - -# Manifest tool. -MANIFEST_TOOL=$lt_MANIFEST_TOOL - -# Tool to manipulate archived DWARF debug symbol files on Mac OS X. -DSYMUTIL=$lt_DSYMUTIL - -# Tool to change global to local symbols on Mac OS X. -NMEDIT=$lt_NMEDIT - -# Tool to manipulate fat objects and archives on Mac OS X. -LIPO=$lt_LIPO - -# ldd/readelf like tool for Mach-O binaries on Mac OS X. -OTOOL=$lt_OTOOL - -# ldd/readelf like tool for 64 bit Mach-O binaries on Mac OS X 10.4. -OTOOL64=$lt_OTOOL64 - -# Old archive suffix (normally "a"). -libext=$libext - -# Shared library suffix (normally ".so"). -shrext_cmds=$lt_shrext_cmds - -# The commands to extract the exported symbol list from a shared archive. -extract_expsyms_cmds=$lt_extract_expsyms_cmds - -# Variables whose values should be saved in libtool wrapper scripts and -# restored at link time. -variables_saved_for_relink=$lt_variables_saved_for_relink - -# Do we need the "lib" prefix for modules? -need_lib_prefix=$need_lib_prefix - -# Do we need a version for libraries? -need_version=$need_version - -# Library versioning type. -version_type=$version_type - -# Shared library runtime path variable. -runpath_var=$runpath_var - -# Shared library path variable. -shlibpath_var=$shlibpath_var - -# Is shlibpath searched before the hard-coded library search path? -shlibpath_overrides_runpath=$shlibpath_overrides_runpath - -# Format of library name prefix. -libname_spec=$lt_libname_spec - -# List of archive names. First name is the real one, the rest are links. -# The last name is the one that the linker finds with -lNAME -library_names_spec=$lt_library_names_spec - -# The coded name of the library, if different from the real name. -soname_spec=$lt_soname_spec - -# Permission mode override for installation of shared libraries. -install_override_mode=$lt_install_override_mode - -# Command to use after installation of a shared archive. -postinstall_cmds=$lt_postinstall_cmds - -# Command to use after uninstallation of a shared archive. -postuninstall_cmds=$lt_postuninstall_cmds - -# Commands used to finish a libtool library installation in a directory. -finish_cmds=$lt_finish_cmds - -# As "finish_cmds", except a single script fragment to be evaled but -# not shown. -finish_eval=$lt_finish_eval - -# Whether we should hardcode library paths into libraries. -hardcode_into_libs=$hardcode_into_libs - -# Compile-time system search path for libraries. -sys_lib_search_path_spec=$lt_sys_lib_search_path_spec - -# Run-time system search path for libraries. -sys_lib_dlsearch_path_spec=$lt_sys_lib_dlsearch_path_spec - -# Whether dlopen is supported. -dlopen_support=$enable_dlopen - -# Whether dlopen of programs is supported. -dlopen_self=$enable_dlopen_self - -# Whether dlopen of statically linked programs is supported. -dlopen_self_static=$enable_dlopen_self_static - -# Commands to strip libraries. -old_striplib=$lt_old_striplib -striplib=$lt_striplib - - -# The linker used to build libraries. -LD=$lt_LD - -# How to create reloadable object files. -reload_flag=$lt_reload_flag -reload_cmds=$lt_reload_cmds - -# Commands used to build an old-style archive. -old_archive_cmds=$lt_old_archive_cmds - -# A language specific compiler. -CC=$lt_compiler - -# Is the compiler the GNU compiler? -with_gcc=$GCC - -# Compiler flag to turn off builtin functions. -no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag - -# Additional compiler flags for building library objects. -pic_flag=$lt_lt_prog_compiler_pic - -# How to pass a linker flag through the compiler. -wl=$lt_lt_prog_compiler_wl - -# Compiler flag to prevent dynamic linking. -link_static_flag=$lt_lt_prog_compiler_static - -# Does compiler simultaneously support -c and -o options? -compiler_c_o=$lt_lt_cv_prog_compiler_c_o - -# Whether or not to add -lc for building shared libraries. -build_libtool_need_lc=$archive_cmds_need_lc - -# Whether or not to disallow shared libs when runtime libs are static. -allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes - -# Compiler flag to allow reflexive dlopens. -export_dynamic_flag_spec=$lt_export_dynamic_flag_spec - -# Compiler flag to generate shared objects directly from archives. -whole_archive_flag_spec=$lt_whole_archive_flag_spec - -# Whether the compiler copes with passing no objects directly. -compiler_needs_object=$lt_compiler_needs_object - -# Create an old-style archive from a shared archive. -old_archive_from_new_cmds=$lt_old_archive_from_new_cmds - -# Create a temporary old-style archive to link instead of a shared archive. -old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds - -# Commands used to build a shared archive. -archive_cmds=$lt_archive_cmds -archive_expsym_cmds=$lt_archive_expsym_cmds - -# Commands used to build a loadable module if different from building -# a shared archive. -module_cmds=$lt_module_cmds -module_expsym_cmds=$lt_module_expsym_cmds - -# Whether we are building with GNU ld or not. -with_gnu_ld=$lt_with_gnu_ld - -# Flag that allows shared libraries with undefined symbols to be built. -allow_undefined_flag=$lt_allow_undefined_flag - -# Flag that enforces no undefined symbols. -no_undefined_flag=$lt_no_undefined_flag - -# Flag to hardcode \$libdir into a binary during linking. -# This must work even if \$libdir does not exist -hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec - -# Whether we need a single "-rpath" flag with a separated argument. -hardcode_libdir_separator=$lt_hardcode_libdir_separator - -# Set to "yes" if using DIR/libNAME\${shared_ext} during linking hardcodes -# DIR into the resulting binary. -hardcode_direct=$hardcode_direct - -# Set to "yes" if using DIR/libNAME\${shared_ext} during linking hardcodes -# DIR into the resulting binary and the resulting library dependency is -# "absolute",i.e impossible to change by setting \${shlibpath_var} if the -# library is relocated. -hardcode_direct_absolute=$hardcode_direct_absolute - -# Set to "yes" if using the -LDIR flag during linking hardcodes DIR -# into the resulting binary. -hardcode_minus_L=$hardcode_minus_L - -# Set to "yes" if using SHLIBPATH_VAR=DIR during linking hardcodes DIR -# into the resulting binary. -hardcode_shlibpath_var=$hardcode_shlibpath_var - -# Set to "yes" if building a shared library automatically hardcodes DIR -# into the library and all subsequent libraries and executables linked -# against it. -hardcode_automatic=$hardcode_automatic - -# Set to yes if linker adds runtime paths of dependent libraries -# to runtime path list. -inherit_rpath=$inherit_rpath - -# Whether libtool must link a program against all its dependency libraries. -link_all_deplibs=$link_all_deplibs - -# Set to "yes" if exported symbols are required. -always_export_symbols=$always_export_symbols - -# The commands to list exported symbols. -export_symbols_cmds=$lt_export_symbols_cmds - -# Symbols that should not be listed in the preloaded symbols. -exclude_expsyms=$lt_exclude_expsyms - -# Symbols that must always be exported. -include_expsyms=$lt_include_expsyms - -# Commands necessary for linking programs (against libraries) with templates. -prelink_cmds=$lt_prelink_cmds - -# Commands necessary for finishing linking programs. -postlink_cmds=$lt_postlink_cmds - -# Specify filename containing input files. -file_list_spec=$lt_file_list_spec - -# How to hardcode a shared library path into an executable. -hardcode_action=$hardcode_action - -# The directories searched by this compiler when creating a shared library. -compiler_lib_search_dirs=$lt_compiler_lib_search_dirs - -# Dependencies to place before and after the objects being linked to -# create a shared library. -predep_objects=$lt_predep_objects -postdep_objects=$lt_postdep_objects -predeps=$lt_predeps -postdeps=$lt_postdeps - -# The library search path used internally by the compiler when linking -# a shared library. -compiler_lib_search_path=$lt_compiler_lib_search_path - -# ### END LIBTOOL CONFIG - -_LT_EOF - - case $host_os in - aix3*) - cat <<\_LT_EOF >> "$cfgfile" -# AIX sometimes has problems with the GCC collect2 program. For some -# reason, if we set the COLLECT_NAMES environment variable, the problems -# vanish in a puff of smoke. -if test "X${COLLECT_NAMES+set}" != Xset; then - COLLECT_NAMES= - export COLLECT_NAMES -fi -_LT_EOF - ;; - esac - - -ltmain="$ac_aux_dir/ltmain.sh" - - - # We use sed instead of cat because bash on DJGPP gets confused if - # if finds mixed CR/LF and LF-only lines. Since sed operates in - # text mode, it properly converts lines to CR/LF. This bash problem - # is reportedly fixed, but why not run on old versions too? - sed '$q' "$ltmain" >> "$cfgfile" \ - || (rm -f "$cfgfile"; exit 1) - - if test x"$xsi_shell" = xyes; then - sed -e '/^func_dirname ()$/,/^} # func_dirname /c\ -func_dirname ()\ -{\ -\ case ${1} in\ -\ */*) func_dirname_result="${1%/*}${2}" ;;\ -\ * ) func_dirname_result="${3}" ;;\ -\ esac\ -} # Extended-shell func_dirname implementation' "$cfgfile" > $cfgfile.tmp \ - && mv -f "$cfgfile.tmp" "$cfgfile" \ - || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") -test 0 -eq $? || _lt_function_replace_fail=: - - - sed -e '/^func_basename ()$/,/^} # func_basename /c\ -func_basename ()\ -{\ -\ func_basename_result="${1##*/}"\ -} # Extended-shell func_basename implementation' "$cfgfile" > $cfgfile.tmp \ - && mv -f "$cfgfile.tmp" "$cfgfile" \ - || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") -test 0 -eq $? || _lt_function_replace_fail=: - - - sed -e '/^func_dirname_and_basename ()$/,/^} # func_dirname_and_basename /c\ -func_dirname_and_basename ()\ -{\ -\ case ${1} in\ -\ */*) func_dirname_result="${1%/*}${2}" ;;\ -\ * ) func_dirname_result="${3}" ;;\ -\ esac\ -\ func_basename_result="${1##*/}"\ -} # Extended-shell func_dirname_and_basename implementation' "$cfgfile" > $cfgfile.tmp \ - && mv -f "$cfgfile.tmp" "$cfgfile" \ - || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") -test 0 -eq $? || _lt_function_replace_fail=: - - - sed -e '/^func_stripname ()$/,/^} # func_stripname /c\ -func_stripname ()\ -{\ -\ # pdksh 5.2.14 does not do ${X%$Y} correctly if both X and Y are\ -\ # positional parameters, so assign one to ordinary parameter first.\ -\ func_stripname_result=${3}\ -\ func_stripname_result=${func_stripname_result#"${1}"}\ -\ func_stripname_result=${func_stripname_result%"${2}"}\ -} # Extended-shell func_stripname implementation' "$cfgfile" > $cfgfile.tmp \ - && mv -f "$cfgfile.tmp" "$cfgfile" \ - || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") -test 0 -eq $? || _lt_function_replace_fail=: - - - sed -e '/^func_split_long_opt ()$/,/^} # func_split_long_opt /c\ -func_split_long_opt ()\ -{\ -\ func_split_long_opt_name=${1%%=*}\ -\ func_split_long_opt_arg=${1#*=}\ -} # Extended-shell func_split_long_opt implementation' "$cfgfile" > $cfgfile.tmp \ - && mv -f "$cfgfile.tmp" "$cfgfile" \ - || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") -test 0 -eq $? || _lt_function_replace_fail=: - - - sed -e '/^func_split_short_opt ()$/,/^} # func_split_short_opt /c\ -func_split_short_opt ()\ -{\ -\ func_split_short_opt_arg=${1#??}\ -\ func_split_short_opt_name=${1%"$func_split_short_opt_arg"}\ -} # Extended-shell func_split_short_opt implementation' "$cfgfile" > $cfgfile.tmp \ - && mv -f "$cfgfile.tmp" "$cfgfile" \ - || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") -test 0 -eq $? || _lt_function_replace_fail=: - - - sed -e '/^func_lo2o ()$/,/^} # func_lo2o /c\ -func_lo2o ()\ -{\ -\ case ${1} in\ -\ *.lo) func_lo2o_result=${1%.lo}.${objext} ;;\ -\ *) func_lo2o_result=${1} ;;\ -\ esac\ -} # Extended-shell func_lo2o implementation' "$cfgfile" > $cfgfile.tmp \ - && mv -f "$cfgfile.tmp" "$cfgfile" \ - || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") -test 0 -eq $? || _lt_function_replace_fail=: - - - sed -e '/^func_xform ()$/,/^} # func_xform /c\ -func_xform ()\ -{\ - func_xform_result=${1%.*}.lo\ -} # Extended-shell func_xform implementation' "$cfgfile" > $cfgfile.tmp \ - && mv -f "$cfgfile.tmp" "$cfgfile" \ - || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") -test 0 -eq $? || _lt_function_replace_fail=: - - - sed -e '/^func_arith ()$/,/^} # func_arith /c\ -func_arith ()\ -{\ - func_arith_result=$(( $* ))\ -} # Extended-shell func_arith implementation' "$cfgfile" > $cfgfile.tmp \ - && mv -f "$cfgfile.tmp" "$cfgfile" \ - || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") -test 0 -eq $? || _lt_function_replace_fail=: - - - sed -e '/^func_len ()$/,/^} # func_len /c\ -func_len ()\ -{\ - func_len_result=${#1}\ -} # Extended-shell func_len implementation' "$cfgfile" > $cfgfile.tmp \ - && mv -f "$cfgfile.tmp" "$cfgfile" \ - || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") -test 0 -eq $? || _lt_function_replace_fail=: - -fi - -if test x"$lt_shell_append" = xyes; then - sed -e '/^func_append ()$/,/^} # func_append /c\ -func_append ()\ -{\ - eval "${1}+=\\${2}"\ -} # Extended-shell func_append implementation' "$cfgfile" > $cfgfile.tmp \ - && mv -f "$cfgfile.tmp" "$cfgfile" \ - || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") -test 0 -eq $? || _lt_function_replace_fail=: - - - sed -e '/^func_append_quoted ()$/,/^} # func_append_quoted /c\ -func_append_quoted ()\ -{\ -\ func_quote_for_eval "${2}"\ -\ eval "${1}+=\\\\ \\$func_quote_for_eval_result"\ -} # Extended-shell func_append_quoted implementation' "$cfgfile" > $cfgfile.tmp \ - && mv -f "$cfgfile.tmp" "$cfgfile" \ - || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") -test 0 -eq $? || _lt_function_replace_fail=: - - - # Save a `func_append' function call where possible by direct use of '+=' - sed -e 's%func_append \([a-zA-Z_]\{1,\}\) "%\1+="%g' $cfgfile > $cfgfile.tmp \ - && mv -f "$cfgfile.tmp" "$cfgfile" \ - || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") - test 0 -eq $? || _lt_function_replace_fail=: -else - # Save a `func_append' function call even when '+=' is not available - sed -e 's%func_append \([a-zA-Z_]\{1,\}\) "%\1="$\1%g' $cfgfile > $cfgfile.tmp \ - && mv -f "$cfgfile.tmp" "$cfgfile" \ - || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") - test 0 -eq $? || _lt_function_replace_fail=: -fi - -if test x"$_lt_function_replace_fail" = x":"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Unable to substitute extended shell functions in $ofile" >&5 -$as_echo "$as_me: WARNING: Unable to substitute extended shell functions in $ofile" >&2;} -fi - - - mv -f "$cfgfile" "$ofile" || - (rm -f "$ofile" && cp "$cfgfile" "$ofile" && rm -f "$cfgfile") - chmod +x "$ofile" - - - cat <<_LT_EOF >> "$ofile" - -# ### BEGIN LIBTOOL TAG CONFIG: CXX - -# The linker used to build libraries. -LD=$lt_LD_CXX - -# How to create reloadable object files. -reload_flag=$lt_reload_flag_CXX -reload_cmds=$lt_reload_cmds_CXX - -# Commands used to build an old-style archive. -old_archive_cmds=$lt_old_archive_cmds_CXX - -# A language specific compiler. -CC=$lt_compiler_CXX - -# Is the compiler the GNU compiler? -with_gcc=$GCC_CXX - -# Compiler flag to turn off builtin functions. -no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag_CXX - -# Additional compiler flags for building library objects. -pic_flag=$lt_lt_prog_compiler_pic_CXX - -# How to pass a linker flag through the compiler. -wl=$lt_lt_prog_compiler_wl_CXX - -# Compiler flag to prevent dynamic linking. -link_static_flag=$lt_lt_prog_compiler_static_CXX - -# Does compiler simultaneously support -c and -o options? -compiler_c_o=$lt_lt_cv_prog_compiler_c_o_CXX - -# Whether or not to add -lc for building shared libraries. -build_libtool_need_lc=$archive_cmds_need_lc_CXX - -# Whether or not to disallow shared libs when runtime libs are static. -allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes_CXX - -# Compiler flag to allow reflexive dlopens. -export_dynamic_flag_spec=$lt_export_dynamic_flag_spec_CXX - -# Compiler flag to generate shared objects directly from archives. -whole_archive_flag_spec=$lt_whole_archive_flag_spec_CXX - -# Whether the compiler copes with passing no objects directly. -compiler_needs_object=$lt_compiler_needs_object_CXX - -# Create an old-style archive from a shared archive. -old_archive_from_new_cmds=$lt_old_archive_from_new_cmds_CXX - -# Create a temporary old-style archive to link instead of a shared archive. -old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds_CXX - -# Commands used to build a shared archive. -archive_cmds=$lt_archive_cmds_CXX -archive_expsym_cmds=$lt_archive_expsym_cmds_CXX - -# Commands used to build a loadable module if different from building -# a shared archive. -module_cmds=$lt_module_cmds_CXX -module_expsym_cmds=$lt_module_expsym_cmds_CXX - -# Whether we are building with GNU ld or not. -with_gnu_ld=$lt_with_gnu_ld_CXX - -# Flag that allows shared libraries with undefined symbols to be built. -allow_undefined_flag=$lt_allow_undefined_flag_CXX - -# Flag that enforces no undefined symbols. -no_undefined_flag=$lt_no_undefined_flag_CXX - -# Flag to hardcode \$libdir into a binary during linking. -# This must work even if \$libdir does not exist -hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec_CXX - -# Whether we need a single "-rpath" flag with a separated argument. -hardcode_libdir_separator=$lt_hardcode_libdir_separator_CXX - -# Set to "yes" if using DIR/libNAME\${shared_ext} during linking hardcodes -# DIR into the resulting binary. -hardcode_direct=$hardcode_direct_CXX - -# Set to "yes" if using DIR/libNAME\${shared_ext} during linking hardcodes -# DIR into the resulting binary and the resulting library dependency is -# "absolute",i.e impossible to change by setting \${shlibpath_var} if the -# library is relocated. -hardcode_direct_absolute=$hardcode_direct_absolute_CXX - -# Set to "yes" if using the -LDIR flag during linking hardcodes DIR -# into the resulting binary. -hardcode_minus_L=$hardcode_minus_L_CXX - -# Set to "yes" if using SHLIBPATH_VAR=DIR during linking hardcodes DIR -# into the resulting binary. -hardcode_shlibpath_var=$hardcode_shlibpath_var_CXX - -# Set to "yes" if building a shared library automatically hardcodes DIR -# into the library and all subsequent libraries and executables linked -# against it. -hardcode_automatic=$hardcode_automatic_CXX - -# Set to yes if linker adds runtime paths of dependent libraries -# to runtime path list. -inherit_rpath=$inherit_rpath_CXX - -# Whether libtool must link a program against all its dependency libraries. -link_all_deplibs=$link_all_deplibs_CXX - -# Set to "yes" if exported symbols are required. -always_export_symbols=$always_export_symbols_CXX - -# The commands to list exported symbols. -export_symbols_cmds=$lt_export_symbols_cmds_CXX - -# Symbols that should not be listed in the preloaded symbols. -exclude_expsyms=$lt_exclude_expsyms_CXX - -# Symbols that must always be exported. -include_expsyms=$lt_include_expsyms_CXX - -# Commands necessary for linking programs (against libraries) with templates. -prelink_cmds=$lt_prelink_cmds_CXX - -# Commands necessary for finishing linking programs. -postlink_cmds=$lt_postlink_cmds_CXX - -# Specify filename containing input files. -file_list_spec=$lt_file_list_spec_CXX - -# How to hardcode a shared library path into an executable. -hardcode_action=$hardcode_action_CXX - -# The directories searched by this compiler when creating a shared library. -compiler_lib_search_dirs=$lt_compiler_lib_search_dirs_CXX - -# Dependencies to place before and after the objects being linked to -# create a shared library. -predep_objects=$lt_predep_objects_CXX -postdep_objects=$lt_postdep_objects_CXX -predeps=$lt_predeps_CXX -postdeps=$lt_postdeps_CXX - -# The library search path used internally by the compiler when linking -# a shared library. -compiler_lib_search_path=$lt_compiler_lib_search_path_CXX - -# ### END LIBTOOL TAG CONFIG: CXX -_LT_EOF - - ;; - - esac -done # for ac_tag - - -as_fn_exit 0 -_ACEOF -ac_clean_files=$ac_clean_files_save - -test $ac_write_fail = 0 || - as_fn_error $? "write failure creating $CONFIG_STATUS" "$LINENO" 5 - - -# configure is writing to config.log, and then calls config.status. -# config.status does its own redirection, appending to config.log. -# Unfortunately, on DOS this fails, as config.log is still kept open -# by configure, so config.status won't be able to write to it; its -# output is simply discarded. So we exec the FD to /dev/null, -# effectively closing config.log, so it can be properly (re)opened and -# appended to by config.status. When coming back to configure, we -# need to make the FD available again. -if test "$no_create" != yes; then - ac_cs_success=: - ac_config_status_args= - test "$silent" = yes && - ac_config_status_args="$ac_config_status_args --quiet" - exec 5>/dev/null - $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false - exec 5>>config.log - # Use ||, not &&, to avoid exiting from the if with $? = 1, which - # would make configure fail if this is the last instruction. - $ac_cs_success || as_fn_exit 1 -fi -if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5 -$as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;} -fi - diff --git a/pkg/registry/zookeeper-3.4.6/src/c/autom4te.cache/requests b/pkg/registry/zookeeper-3.4.6/src/c/autom4te.cache/requests deleted file mode 100644 index 2c72da71d..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/c/autom4te.cache/requests +++ /dev/null @@ -1,673 +0,0 @@ -# This file was generated by Autom4te Sat May 26 18:17:46 UTC 2012. -# It contains the lists of macros which have been traced. -# It can be safely removed. - -@request = ( - bless( [ - '0', - 1, - [ - '/usr/share/autoconf' - ], - [ - '/usr/share/autoconf/autoconf/autoconf.m4f', - '/usr/share/aclocal-1.11/amversion.m4', - '/usr/share/aclocal-1.11/auxdir.m4', - '/usr/share/aclocal-1.11/cond.m4', - '/usr/share/aclocal-1.11/depend.m4', - '/usr/share/aclocal-1.11/depout.m4', - '/usr/share/aclocal-1.11/init.m4', - '/usr/share/aclocal-1.11/install-sh.m4', - '/usr/share/aclocal-1.11/lead-dot.m4', - '/usr/share/aclocal-1.11/make.m4', - '/usr/share/aclocal-1.11/minuso.m4', - '/usr/share/aclocal-1.11/missing.m4', - '/usr/share/aclocal-1.11/mkdirp.m4', - '/usr/share/aclocal-1.11/options.m4', - '/usr/share/aclocal-1.11/runlog.m4', - '/usr/share/aclocal-1.11/sanity.m4', - '/usr/share/aclocal-1.11/silent.m4', - '/usr/share/aclocal-1.11/strip.m4', - '/usr/share/aclocal-1.11/substnot.m4', - '/usr/share/aclocal-1.11/tar.m4', - 'acinclude.m4', - 'configure.ac' - ], - { - 'DX_RTF_FEATURE' => 1, - 'm4_pattern_forbid' => 1, - 'AC_DEFUN' => 1, - 'AM_PROG_MKDIR_P' => 1, - 'DX_IF_FEATURE' => 1, - 'DX_FEATURE_chi' => 1, - 'DX_CHM_FEATURE' => 1, - 'DX_FEATURE_doc' => 1, - 'AM_AUTOMAKE_VERSION' => 1, - 'DX_PDF_FEATURE' => 1, - 'AM_MISSING_HAS_RUN' => 1, - 'AM_SUBST_NOTMAKE' => 1, - 'AM_MISSING_PROG' => 1, - 'AM_PROG_INSTALL_STRIP' => 1, - '_m4_warn' => 1, - 'AM_SANITY_CHECK' => 1, - 'DX_CHI_FEATURE' => 1, - '_AM_PROG_TAR' => 1, - 'DX_CURRENT_FEATURE' => 1, - 'AM_DEP_TRACK' => 1, - 'DX_CLEAR_DEPEND' => 1, - '_AM_IF_OPTION' => 1, - 'DX_HTML_FEATURE' => 1, - '_AM_SUBST_NOTMAKE' => 1, - 'm4_pattern_allow' => 1, - '_AM_AUTOCONF_VERSION' => 1, - 'AM_SET_LEADING_DOT' => 1, - '_AM_DEPENDENCIES' => 1, - 'DX_DIRNAME_EXPR' => 1, - 'DX_FEATURE_man' => 1, - 'DX_DOXYGEN_FEATURE' => 1, - 'DX_PS_FEATURE' => 1, - 'AU_DEFUN' => 1, - 'AM_SET_CURRENT_AUTOMAKE_VERSION' => 1, - 'DX_MAN_FEATURE' => 1, - '_AM_SET_OPTION' => 1, - 'DX_FEATURE_chm' => 1, - 'AM_INIT_AUTOMAKE' => 1, - 'DX_FEATURE_rtf' => 1, - 'DX_INIT_DOXYGEN' => 1, - 'AM_OUTPUT_DEPENDENCY_COMMANDS' => 1, - 'AC_DEFUN_ONCE' => 1, - 'DX_XML_FEATURE' => 1, - 'DX_TEST_FEATURE' => 1, - 'DX_ENV_APPEND' => 1, - 'AM_SILENT_RULES' => 1, - 'DX_CHECK_DEPEND' => 1, - 'DX_FEATURE_pdf' => 1, - 'DX_REQUIRE_PROG' => 1, - 'DX_ARG_ABLE' => 1, - 'include' => 1, - 'DX_FEATURE_html' => 1, - 'AM_AUX_DIR_EXPAND' => 1, - 'DX_CURRENT_DESCRIPTION' => 1, - '_AM_SET_OPTIONS' => 1, - 'AM_RUN_LOG' => 1, - '_AM_OUTPUT_DEPENDENCY_COMMANDS' => 1, - 'AM_PROG_CC_C_O' => 1, - '_AM_MANGLE_OPTION' => 1, - 'AM_CONDITIONAL' => 1, - 'DX_FEATURE_xml' => 1, - 'AM_SET_DEPDIR' => 1, - 'DX_FEATURE_dot' => 1, - 'AM_PROG_INSTALL_SH' => 1, - 'm4_include' => 1, - 'DX_FEATURE_ps' => 1, - '_AC_AM_CONFIG_HEADER_HOOK' => 1, - 'AM_MAKE_INCLUDE' => 1 - } - ], 'Autom4te::Request' ), - bless( [ - '1', - 1, - [ - '/usr/share/autoconf' - ], - [ - '/usr/share/autoconf/autoconf/autoconf.m4f', - 'aclocal.m4', - 'configure.ac' - ], - { - '_LT_AC_TAGCONFIG' => 1, - 'AM_PROG_F77_C_O' => 1, - 'm4_pattern_forbid' => 1, - 'AC_INIT' => 1, - '_AM_COND_IF' => 1, - 'AC_CANONICAL_TARGET' => 1, - 'AC_SUBST' => 1, - 'AC_CONFIG_LIBOBJ_DIR' => 1, - 'AC_FC_SRCEXT' => 1, - 'AC_CANONICAL_HOST' => 1, - 'AC_PROG_LIBTOOL' => 1, - 'AM_INIT_AUTOMAKE' => 1, - 'AM_PATH_GUILE' => 1, - 'AC_CONFIG_SUBDIRS' => 1, - 'AM_AUTOMAKE_VERSION' => 1, - 'LT_CONFIG_LTDL_DIR' => 1, - 'AC_REQUIRE_AUX_FILE' => 1, - 'AC_CONFIG_LINKS' => 1, - 'm4_sinclude' => 1, - 'LT_SUPPORTED_TAG' => 1, - 'AM_MAINTAINER_MODE' => 1, - 'AM_NLS' => 1, - 'AC_FC_PP_DEFINE' => 1, - 'AM_GNU_GETTEXT_INTL_SUBDIR' => 1, - 'AM_MAKEFILE_INCLUDE' => 1, - '_m4_warn' => 1, - 'AM_PROG_CXX_C_O' => 1, - '_AM_COND_ENDIF' => 1, - '_AM_MAKEFILE_INCLUDE' => 1, - 'AM_ENABLE_MULTILIB' => 1, - 'AM_SILENT_RULES' => 1, - 'AM_PROG_MOC' => 1, - 'AC_CONFIG_FILES' => 1, - 'LT_INIT' => 1, - 'include' => 1, - 'AM_PROG_AR' => 1, - 'AM_GNU_GETTEXT' => 1, - 'AC_LIBSOURCE' => 1, - 'AM_PROG_FC_C_O' => 1, - 'AC_CANONICAL_BUILD' => 1, - 'AC_FC_FREEFORM' => 1, - 'AH_OUTPUT' => 1, - 'AC_FC_PP_SRCEXT' => 1, - '_AM_SUBST_NOTMAKE' => 1, - 'AC_CONFIG_AUX_DIR' => 1, - 'sinclude' => 1, - 'AM_PROG_CC_C_O' => 1, - 'm4_pattern_allow' => 1, - 'AM_XGETTEXT_OPTION' => 1, - 'AC_CANONICAL_SYSTEM' => 1, - 'AM_CONDITIONAL' => 1, - 'AC_CONFIG_HEADERS' => 1, - 'AC_DEFINE_TRACE_LITERAL' => 1, - 'AM_POT_TOOLS' => 1, - 'm4_include' => 1, - '_AM_COND_ELSE' => 1, - 'AC_SUBST_TRACE' => 1 - } - ], 'Autom4te::Request' ), - bless( [ - '2', - 1, - [ - '/usr/share/autoconf' - ], - [ - '/usr/share/autoconf/autoconf/autoconf.m4f', - '/usr/share/aclocal/argz.m4', - '/usr/share/aclocal/libtool.m4', - '/usr/share/aclocal/ltdl.m4', - '/usr/share/aclocal/ltoptions.m4', - '/usr/share/aclocal/ltsugar.m4', - '/usr/share/aclocal/ltversion.m4', - '/usr/share/aclocal/lt~obsolete.m4', - '/usr/share/aclocal-1.11/amversion.m4', - '/usr/share/aclocal-1.11/auxdir.m4', - '/usr/share/aclocal-1.11/cond.m4', - '/usr/share/aclocal-1.11/depend.m4', - '/usr/share/aclocal-1.11/depout.m4', - '/usr/share/aclocal-1.11/init.m4', - '/usr/share/aclocal-1.11/install-sh.m4', - '/usr/share/aclocal-1.11/lead-dot.m4', - '/usr/share/aclocal-1.11/make.m4', - '/usr/share/aclocal-1.11/minuso.m4', - '/usr/share/aclocal-1.11/missing.m4', - '/usr/share/aclocal-1.11/mkdirp.m4', - '/usr/share/aclocal-1.11/options.m4', - '/usr/share/aclocal-1.11/runlog.m4', - '/usr/share/aclocal-1.11/sanity.m4', - '/usr/share/aclocal-1.11/silent.m4', - '/usr/share/aclocal-1.11/strip.m4', - '/usr/share/aclocal-1.11/substnot.m4', - '/usr/share/aclocal-1.11/tar.m4', - 'acinclude.m4', - 'configure.ac' - ], - { - 'AM_ENABLE_STATIC' => 1, - 'AC_LIBTOOL_LANG_RC_CONFIG' => 1, - '_LT_AC_SHELL_INIT' => 1, - 'AC_DEFUN' => 1, - 'AC_PROG_LIBTOOL' => 1, - '_LT_AC_LANG_CXX_CONFIG' => 1, - 'AM_PROG_MKDIR_P' => 1, - 'DX_IF_FEATURE' => 1, - 'DX_FEATURE_doc' => 1, - 'DX_CHM_FEATURE' => 1, - 'AM_AUTOMAKE_VERSION' => 1, - 'DX_PDF_FEATURE' => 1, - 'AM_SUBST_NOTMAKE' => 1, - 'AM_MISSING_PROG' => 1, - 'AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH' => 1, - '_LT_AC_LANG_C_CONFIG' => 1, - 'AM_PROG_INSTALL_STRIP' => 1, - '_m4_warn' => 1, - 'AC_LIBTOOL_OBJDIR' => 1, - 'gl_FUNC_ARGZ' => 1, - 'AM_SANITY_CHECK' => 1, - 'LTOBSOLETE_VERSION' => 1, - 'AC_LIBTOOL_LANG_GCJ_CONFIG' => 1, - 'AC_LIBTOOL_PROG_COMPILER_PIC' => 1, - 'LT_LIB_M' => 1, - '_LT_AC_CHECK_DLFCN' => 1, - 'AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE' => 1, - 'LTSUGAR_VERSION' => 1, - '_LT_PROG_LTMAIN' => 1, - '_AM_PROG_TAR' => 1, - 'LT_SYS_SYMBOL_USCORE' => 1, - 'AC_LIBTOOL_GCJ' => 1, - 'DX_CLEAR_DEPEND' => 1, - '_LT_WITH_SYSROOT' => 1, - 'LT_FUNC_DLSYM_USCORE' => 1, - 'LT_SYS_DLOPEN_DEPLIBS' => 1, - '_LT_AC_LANG_F77' => 1, - 'AC_LIBTOOL_CONFIG' => 1, - '_AM_SUBST_NOTMAKE' => 1, - 'AC_LTDL_DLLIB' => 1, - '_AM_AUTOCONF_VERSION' => 1, - 'AM_DISABLE_SHARED' => 1, - '_LT_PROG_ECHO_BACKSLASH' => 1, - '_LTDL_SETUP' => 1, - '_LT_AC_LANG_CXX' => 1, - 'AM_PROG_LIBTOOL' => 1, - 'AC_LIB_LTDL' => 1, - '_LT_AC_FILE_LTDLL_C' => 1, - 'AM_PROG_LD' => 1, - 'DX_DOXYGEN_FEATURE' => 1, - 'AU_DEFUN' => 1, - 'AC_PROG_NM' => 1, - 'AC_LIBTOOL_DLOPEN' => 1, - 'AC_PROG_LD' => 1, - 'AC_PROG_LD_GNU' => 1, - 'AC_ENABLE_FAST_INSTALL' => 1, - 'AC_LIBTOOL_FC' => 1, - 'DX_MAN_FEATURE' => 1, - 'LTDL_CONVENIENCE' => 1, - '_AM_SET_OPTION' => 1, - 'AC_LTDL_PREOPEN' => 1, - '_LT_LINKER_BOILERPLATE' => 1, - '_LT_PREPARE_SED_QUOTE_VARS' => 1, - 'AC_LIBTOOL_LANG_CXX_CONFIG' => 1, - 'AC_LIBTOOL_PROG_CC_C_O' => 1, - 'gl_PREREQ_ARGZ' => 1, - 'AM_OUTPUT_DEPENDENCY_COMMANDS' => 1, - 'LT_SUPPORTED_TAG' => 1, - 'LT_SYS_MODULE_EXT' => 1, - 'LT_PROG_RC' => 1, - 'AC_DEFUN_ONCE' => 1, - 'DX_XML_FEATURE' => 1, - '_LT_AC_LANG_GCJ' => 1, - 'AC_LTDL_OBJDIR' => 1, - 'DX_TEST_FEATURE' => 1, - '_LT_PATH_TOOL_PREFIX' => 1, - 'AC_LIBTOOL_RC' => 1, - 'AM_SILENT_RULES' => 1, - 'AC_DISABLE_FAST_INSTALL' => 1, - '_LT_AC_PROG_ECHO_BACKSLASH' => 1, - 'DX_CHECK_DEPEND' => 1, - 'DX_FEATURE_pdf' => 1, - 'DX_REQUIRE_PROG' => 1, - '_LT_AC_SYS_LIBPATH_AIX' => 1, - '_LT_AC_TRY_DLOPEN_SELF' => 1, - 'include' => 1, - 'LT_AC_PROG_SED' => 1, - 'AM_ENABLE_SHARED' => 1, - 'DX_FEATURE_html' => 1, - 'LTDL_INSTALLABLE' => 1, - 'DX_CURRENT_DESCRIPTION' => 1, - '_LT_AC_LANG_GCJ_CONFIG' => 1, - 'AC_ENABLE_SHARED' => 1, - 'AC_ENABLE_STATIC' => 1, - 'AC_LIBTOOL_SYS_HARD_LINK_LOCKS' => 1, - '_LT_REQUIRED_DARWIN_CHECKS' => 1, - 'AM_PROG_CC_C_O' => 1, - '_LT_AC_TAGVAR' => 1, - 'AC_LIBTOOL_LANG_F77_CONFIG' => 1, - 'AM_CONDITIONAL' => 1, - 'LT_LIB_DLLOAD' => 1, - 'DX_FEATURE_dot' => 1, - 'LTDL_INIT' => 1, - '_LT_PROG_F77' => 1, - '_LT_PROG_CXX' => 1, - 'LTVERSION_VERSION' => 1, - 'AM_PROG_INSTALL_SH' => 1, - 'm4_include' => 1, - 'AC_PROG_EGREP' => 1, - '_AC_AM_CONFIG_HEADER_HOOK' => 1, - 'AC_PATH_MAGIC' => 1, - 'AC_LTDL_SYSSEARCHPATH' => 1, - 'AM_MAKE_INCLUDE' => 1, - 'LT_CMD_MAX_LEN' => 1, - '_LT_AC_TAGCONFIG' => 1, - 'DX_RTF_FEATURE' => 1, - 'm4_pattern_forbid' => 1, - '_LT_LINKER_OPTION' => 1, - 'AC_LIBTOOL_COMPILER_OPTION' => 1, - 'AC_DISABLE_SHARED' => 1, - '_LT_COMPILER_BOILERPLATE' => 1, - 'AC_LIBTOOL_SETUP' => 1, - 'AC_LIBTOOL_WIN32_DLL' => 1, - 'AC_PROG_LD_RELOAD_FLAG' => 1, - 'DX_FEATURE_chi' => 1, - 'AC_LTDL_DLSYM_USCORE' => 1, - 'AM_MISSING_HAS_RUN' => 1, - 'LT_LANG' => 1, - 'LT_SYS_DLSEARCH_PATH' => 1, - 'LT_CONFIG_LTDL_DIR' => 1, - 'LT_OUTPUT' => 1, - 'AC_LIBTOOL_DLOPEN_SELF' => 1, - 'AC_LIBTOOL_PROG_LD_SHLIBS' => 1, - 'AC_LIBTOOL_LINKER_OPTION' => 1, - 'AC_WITH_LTDL' => 1, - 'DX_CHI_FEATURE' => 1, - 'AC_LIBTOOL_CXX' => 1, - 'LT_AC_PROG_RC' => 1, - 'LT_INIT' => 1, - 'LT_SYS_DLOPEN_SELF' => 1, - 'LT_AC_PROG_GCJ' => 1, - 'DX_CURRENT_FEATURE' => 1, - 'AM_DISABLE_STATIC' => 1, - 'AM_DEP_TRACK' => 1, - '_LT_AC_PROG_CXXCPP' => 1, - '_AC_PROG_LIBTOOL' => 1, - '_AM_IF_OPTION' => 1, - 'DX_HTML_FEATURE' => 1, - 'AC_PATH_TOOL_PREFIX' => 1, - 'AC_LIBTOOL_F77' => 1, - 'm4_pattern_allow' => 1, - 'AM_SET_LEADING_DOT' => 1, - 'LT_AC_PROG_EGREP' => 1, - '_LT_PROG_FC' => 1, - '_AM_DEPENDENCIES' => 1, - 'DX_DIRNAME_EXPR' => 1, - 'AC_LIBTOOL_LANG_C_CONFIG' => 1, - 'LTOPTIONS_VERSION' => 1, - '_LT_AC_SYS_COMPILER' => 1, - 'DX_FEATURE_man' => 1, - 'AM_PROG_NM' => 1, - 'DX_PS_FEATURE' => 1, - 'AC_LIBLTDL_CONVENIENCE' => 1, - 'AC_DEPLIBS_CHECK_METHOD' => 1, - 'AC_LIBLTDL_INSTALLABLE' => 1, - 'AM_SET_CURRENT_AUTOMAKE_VERSION' => 1, - 'AC_LTDL_ENABLE_INSTALL' => 1, - 'AC_LIBTOOL_SYS_DYNAMIC_LINKER' => 1, - 'LT_PROG_GCJ' => 1, - 'DX_FEATURE_chm' => 1, - 'AM_INIT_AUTOMAKE' => 1, - 'DX_FEATURE_rtf' => 1, - 'DX_INIT_DOXYGEN' => 1, - 'AC_DISABLE_STATIC' => 1, - 'LT_PATH_NM' => 1, - 'AC_LTDL_SHLIBEXT' => 1, - '_LT_AC_LOCK' => 1, - '_LT_AC_LANG_RC_CONFIG' => 1, - 'LT_PROG_GO' => 1, - 'LT_SYS_MODULE_PATH' => 1, - 'DX_ENV_APPEND' => 1, - 'LT_WITH_LTDL' => 1, - 'AC_LIBTOOL_POSTDEP_PREDEP' => 1, - 'AC_LTDL_SHLIBPATH' => 1, - 'DX_ARG_ABLE' => 1, - 'AM_AUX_DIR_EXPAND' => 1, - 'AC_LIBTOOL_PROG_COMPILER_NO_RTTI' => 1, - '_LT_AC_LANG_F77_CONFIG' => 1, - '_AM_SET_OPTIONS' => 1, - '_LT_COMPILER_OPTION' => 1, - 'AM_RUN_LOG' => 1, - '_AM_OUTPUT_DEPENDENCY_COMMANDS' => 1, - 'AC_LIBTOOL_SYS_OLD_ARCHIVE' => 1, - 'AC_LTDL_SYS_DLOPEN_DEPLIBS' => 1, - 'AC_LIBTOOL_PICMODE' => 1, - 'LT_PATH_LD' => 1, - 'AC_CHECK_LIBM' => 1, - 'AC_LIBTOOL_SYS_LIB_STRIP' => 1, - '_AM_MANGLE_OPTION' => 1, - 'AC_LTDL_SYMBOL_USCORE' => 1, - 'DX_FEATURE_xml' => 1, - 'AC_LIBTOOL_SYS_MAX_CMD_LEN' => 1, - 'AM_SET_DEPDIR' => 1, - '_LT_CC_BASENAME' => 1, - 'DX_FEATURE_ps' => 1, - '_LT_LIBOBJ' => 1 - } - ], 'Autom4te::Request' ), - bless( [ - '3', - 1, - [ - '/usr/share/autoconf' - ], - [ - '/usr/share/autoconf/autoconf/autoconf.m4f', - '/usr/share/aclocal/argz.m4', - '/usr/share/aclocal/cppunit.m4', - '/usr/share/aclocal/libtool.m4', - '/usr/share/aclocal/ltdl.m4', - '/usr/share/aclocal/ltoptions.m4', - '/usr/share/aclocal/ltsugar.m4', - '/usr/share/aclocal/ltversion.m4', - '/usr/share/aclocal/lt~obsolete.m4', - '/usr/share/aclocal-1.11/amversion.m4', - '/usr/share/aclocal-1.11/auxdir.m4', - '/usr/share/aclocal-1.11/cond.m4', - '/usr/share/aclocal-1.11/depend.m4', - '/usr/share/aclocal-1.11/depout.m4', - '/usr/share/aclocal-1.11/init.m4', - '/usr/share/aclocal-1.11/install-sh.m4', - '/usr/share/aclocal-1.11/lead-dot.m4', - '/usr/share/aclocal-1.11/make.m4', - '/usr/share/aclocal-1.11/minuso.m4', - '/usr/share/aclocal-1.11/missing.m4', - '/usr/share/aclocal-1.11/mkdirp.m4', - '/usr/share/aclocal-1.11/options.m4', - '/usr/share/aclocal-1.11/runlog.m4', - '/usr/share/aclocal-1.11/sanity.m4', - '/usr/share/aclocal-1.11/silent.m4', - '/usr/share/aclocal-1.11/strip.m4', - '/usr/share/aclocal-1.11/substnot.m4', - '/usr/share/aclocal-1.11/tar.m4', - 'acinclude.m4', - 'configure.ac' - ], - { - 'AM_ENABLE_STATIC' => 1, - 'AC_LIBTOOL_LANG_RC_CONFIG' => 1, - '_LT_AC_SHELL_INIT' => 1, - 'AC_DEFUN' => 1, - 'AC_PROG_LIBTOOL' => 1, - '_LT_AC_LANG_CXX_CONFIG' => 1, - 'AM_PROG_MKDIR_P' => 1, - 'DX_IF_FEATURE' => 1, - 'DX_FEATURE_doc' => 1, - 'DX_CHM_FEATURE' => 1, - 'AM_AUTOMAKE_VERSION' => 1, - 'DX_PDF_FEATURE' => 1, - 'AM_SUBST_NOTMAKE' => 1, - 'AM_MISSING_PROG' => 1, - 'AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH' => 1, - '_LT_AC_LANG_C_CONFIG' => 1, - 'AM_PROG_INSTALL_STRIP' => 1, - '_m4_warn' => 1, - 'AC_LIBTOOL_OBJDIR' => 1, - 'gl_FUNC_ARGZ' => 1, - 'AM_SANITY_CHECK' => 1, - 'LTOBSOLETE_VERSION' => 1, - 'AC_LIBTOOL_LANG_GCJ_CONFIG' => 1, - 'AC_LIBTOOL_PROG_COMPILER_PIC' => 1, - 'LT_LIB_M' => 1, - '_LT_AC_CHECK_DLFCN' => 1, - 'AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE' => 1, - 'LTSUGAR_VERSION' => 1, - '_LT_PROG_LTMAIN' => 1, - '_AM_PROG_TAR' => 1, - 'LT_SYS_SYMBOL_USCORE' => 1, - 'AC_LIBTOOL_GCJ' => 1, - 'DX_CLEAR_DEPEND' => 1, - '_LT_WITH_SYSROOT' => 1, - 'LT_FUNC_DLSYM_USCORE' => 1, - 'LT_SYS_DLOPEN_DEPLIBS' => 1, - '_LT_AC_LANG_F77' => 1, - 'AC_LIBTOOL_CONFIG' => 1, - '_AM_SUBST_NOTMAKE' => 1, - 'AC_LTDL_DLLIB' => 1, - '_AM_AUTOCONF_VERSION' => 1, - 'AM_DISABLE_SHARED' => 1, - '_LT_PROG_ECHO_BACKSLASH' => 1, - '_LTDL_SETUP' => 1, - '_LT_AC_LANG_CXX' => 1, - 'AM_PROG_LIBTOOL' => 1, - 'AC_LIB_LTDL' => 1, - '_LT_AC_FILE_LTDLL_C' => 1, - 'AM_PROG_LD' => 1, - 'DX_DOXYGEN_FEATURE' => 1, - 'AU_DEFUN' => 1, - 'AC_PROG_NM' => 1, - 'AC_LIBTOOL_DLOPEN' => 1, - 'AC_PROG_LD' => 1, - 'AM_PATH_CPPUNIT' => 1, - 'AC_PROG_LD_GNU' => 1, - 'AC_ENABLE_FAST_INSTALL' => 1, - 'AC_LIBTOOL_FC' => 1, - 'DX_MAN_FEATURE' => 1, - 'LTDL_CONVENIENCE' => 1, - '_AM_SET_OPTION' => 1, - 'AC_LTDL_PREOPEN' => 1, - '_LT_LINKER_BOILERPLATE' => 1, - 'AC_LIBTOOL_LANG_CXX_CONFIG' => 1, - 'AC_LIBTOOL_PROG_CC_C_O' => 1, - '_LT_PREPARE_SED_QUOTE_VARS' => 1, - 'gl_PREREQ_ARGZ' => 1, - 'AM_OUTPUT_DEPENDENCY_COMMANDS' => 1, - 'LT_SUPPORTED_TAG' => 1, - 'LT_SYS_MODULE_EXT' => 1, - 'LT_PROG_RC' => 1, - 'AC_DEFUN_ONCE' => 1, - 'DX_XML_FEATURE' => 1, - '_LT_AC_LANG_GCJ' => 1, - 'AC_LTDL_OBJDIR' => 1, - 'DX_TEST_FEATURE' => 1, - '_LT_PATH_TOOL_PREFIX' => 1, - 'AC_LIBTOOL_RC' => 1, - 'AM_SILENT_RULES' => 1, - 'AC_DISABLE_FAST_INSTALL' => 1, - '_LT_AC_PROG_ECHO_BACKSLASH' => 1, - 'DX_CHECK_DEPEND' => 1, - 'DX_FEATURE_pdf' => 1, - 'DX_REQUIRE_PROG' => 1, - '_LT_AC_SYS_LIBPATH_AIX' => 1, - '_LT_AC_TRY_DLOPEN_SELF' => 1, - 'include' => 1, - 'LT_AC_PROG_SED' => 1, - 'AM_ENABLE_SHARED' => 1, - 'DX_FEATURE_html' => 1, - 'LTDL_INSTALLABLE' => 1, - 'DX_CURRENT_DESCRIPTION' => 1, - '_LT_AC_LANG_GCJ_CONFIG' => 1, - 'AC_ENABLE_SHARED' => 1, - 'AC_ENABLE_STATIC' => 1, - 'AC_LIBTOOL_SYS_HARD_LINK_LOCKS' => 1, - '_LT_REQUIRED_DARWIN_CHECKS' => 1, - 'AM_PROG_CC_C_O' => 1, - '_LT_AC_TAGVAR' => 1, - 'AC_LIBTOOL_LANG_F77_CONFIG' => 1, - 'AM_CONDITIONAL' => 1, - 'LT_LIB_DLLOAD' => 1, - 'DX_FEATURE_dot' => 1, - 'LTDL_INIT' => 1, - '_LT_PROG_F77' => 1, - '_LT_PROG_CXX' => 1, - 'LTVERSION_VERSION' => 1, - 'AM_PROG_INSTALL_SH' => 1, - 'm4_include' => 1, - 'AC_PROG_EGREP' => 1, - '_AC_AM_CONFIG_HEADER_HOOK' => 1, - 'AC_PATH_MAGIC' => 1, - 'AC_LTDL_SYSSEARCHPATH' => 1, - 'AM_MAKE_INCLUDE' => 1, - 'LT_CMD_MAX_LEN' => 1, - '_LT_AC_TAGCONFIG' => 1, - 'DX_RTF_FEATURE' => 1, - 'm4_pattern_forbid' => 1, - '_LT_LINKER_OPTION' => 1, - 'AC_LIBTOOL_COMPILER_OPTION' => 1, - 'AC_DISABLE_SHARED' => 1, - '_LT_COMPILER_BOILERPLATE' => 1, - 'AC_LIBTOOL_SETUP' => 1, - 'AC_LIBTOOL_WIN32_DLL' => 1, - 'AC_PROG_LD_RELOAD_FLAG' => 1, - 'DX_FEATURE_chi' => 1, - 'AC_LTDL_DLSYM_USCORE' => 1, - 'LT_LANG' => 1, - 'AM_MISSING_HAS_RUN' => 1, - 'LT_SYS_DLSEARCH_PATH' => 1, - 'LT_CONFIG_LTDL_DIR' => 1, - 'LT_OUTPUT' => 1, - 'AC_LIBTOOL_DLOPEN_SELF' => 1, - 'AC_LIBTOOL_PROG_LD_SHLIBS' => 1, - 'AC_LIBTOOL_LINKER_OPTION' => 1, - 'AC_WITH_LTDL' => 1, - 'DX_CHI_FEATURE' => 1, - 'AC_LIBTOOL_CXX' => 1, - 'LT_AC_PROG_RC' => 1, - 'LT_INIT' => 1, - 'LT_SYS_DLOPEN_SELF' => 1, - 'LT_AC_PROG_GCJ' => 1, - 'DX_CURRENT_FEATURE' => 1, - 'AM_DISABLE_STATIC' => 1, - 'AM_DEP_TRACK' => 1, - '_LT_AC_PROG_CXXCPP' => 1, - '_AC_PROG_LIBTOOL' => 1, - '_AM_IF_OPTION' => 1, - 'DX_HTML_FEATURE' => 1, - 'AC_PATH_TOOL_PREFIX' => 1, - 'AC_LIBTOOL_F77' => 1, - 'm4_pattern_allow' => 1, - 'AM_SET_LEADING_DOT' => 1, - 'LT_AC_PROG_EGREP' => 1, - '_LT_PROG_FC' => 1, - '_AM_DEPENDENCIES' => 1, - 'DX_DIRNAME_EXPR' => 1, - 'AC_LIBTOOL_LANG_C_CONFIG' => 1, - 'LTOPTIONS_VERSION' => 1, - '_LT_AC_SYS_COMPILER' => 1, - 'DX_FEATURE_man' => 1, - 'AM_PROG_NM' => 1, - 'DX_PS_FEATURE' => 1, - 'AC_LIBLTDL_CONVENIENCE' => 1, - 'AC_DEPLIBS_CHECK_METHOD' => 1, - 'AC_LIBLTDL_INSTALLABLE' => 1, - 'AM_SET_CURRENT_AUTOMAKE_VERSION' => 1, - 'AC_LTDL_ENABLE_INSTALL' => 1, - 'AC_LIBTOOL_SYS_DYNAMIC_LINKER' => 1, - 'LT_PROG_GCJ' => 1, - 'DX_FEATURE_chm' => 1, - 'AM_INIT_AUTOMAKE' => 1, - 'DX_FEATURE_rtf' => 1, - 'DX_INIT_DOXYGEN' => 1, - 'AC_DISABLE_STATIC' => 1, - 'LT_PATH_NM' => 1, - 'AC_LTDL_SHLIBEXT' => 1, - '_LT_AC_LOCK' => 1, - '_LT_AC_LANG_RC_CONFIG' => 1, - 'LT_PROG_GO' => 1, - 'LT_SYS_MODULE_PATH' => 1, - 'DX_ENV_APPEND' => 1, - 'LT_WITH_LTDL' => 1, - 'AC_LIBTOOL_POSTDEP_PREDEP' => 1, - 'AC_LTDL_SHLIBPATH' => 1, - 'DX_ARG_ABLE' => 1, - 'AM_AUX_DIR_EXPAND' => 1, - 'AC_LIBTOOL_PROG_COMPILER_NO_RTTI' => 1, - '_LT_AC_LANG_F77_CONFIG' => 1, - '_AM_SET_OPTIONS' => 1, - '_LT_COMPILER_OPTION' => 1, - 'AM_RUN_LOG' => 1, - '_AM_OUTPUT_DEPENDENCY_COMMANDS' => 1, - 'AC_LIBTOOL_SYS_OLD_ARCHIVE' => 1, - 'AC_LTDL_SYS_DLOPEN_DEPLIBS' => 1, - 'AC_LIBTOOL_PICMODE' => 1, - 'LT_PATH_LD' => 1, - 'AC_CHECK_LIBM' => 1, - 'AC_LIBTOOL_SYS_LIB_STRIP' => 1, - '_AM_MANGLE_OPTION' => 1, - 'AC_LTDL_SYMBOL_USCORE' => 1, - 'DX_FEATURE_xml' => 1, - 'AC_LIBTOOL_SYS_MAX_CMD_LEN' => 1, - 'AM_SET_DEPDIR' => 1, - '_LT_CC_BASENAME' => 1, - 'DX_FEATURE_ps' => 1, - '_LT_LIBOBJ' => 1 - } - ], 'Autom4te::Request' ) - ); - diff --git a/pkg/registry/zookeeper-3.4.6/src/c/autom4te.cache/traces.0 b/pkg/registry/zookeeper-3.4.6/src/c/autom4te.cache/traces.0 deleted file mode 100644 index b1370fc45..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/c/autom4te.cache/traces.0 +++ /dev/null @@ -1,1523 +0,0 @@ -m4trace:/usr/share/aclocal-1.11/amversion.m4:17: -1- AC_DEFUN([AM_AUTOMAKE_VERSION], [am__api_version='1.11' -dnl Some users find AM_AUTOMAKE_VERSION and mistake it for a way to -dnl require some minimum version. Point them to the right macro. -m4_if([$1], [1.11.6], [], - [AC_FATAL([Do not call $0, use AM_INIT_AUTOMAKE([$1]).])])dnl -]) -m4trace:/usr/share/aclocal-1.11/amversion.m4:36: -1- AC_DEFUN([AM_SET_CURRENT_AUTOMAKE_VERSION], [AM_AUTOMAKE_VERSION([1.11.6])dnl -m4_ifndef([AC_AUTOCONF_VERSION], - [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl -_AM_AUTOCONF_VERSION(m4_defn([AC_AUTOCONF_VERSION]))]) -m4trace:/usr/share/aclocal-1.11/auxdir.m4:49: -1- AC_DEFUN([AM_AUX_DIR_EXPAND], [dnl Rely on autoconf to set up CDPATH properly. -AC_PREREQ([2.50])dnl -# expand $ac_aux_dir to an absolute path -am_aux_dir=`cd $ac_aux_dir && pwd` -]) -m4trace:/usr/share/aclocal-1.11/cond.m4:15: -1- AC_DEFUN([AM_CONDITIONAL], [AC_PREREQ(2.52)dnl - ifelse([$1], [TRUE], [AC_FATAL([$0: invalid condition: $1])], - [$1], [FALSE], [AC_FATAL([$0: invalid condition: $1])])dnl -AC_SUBST([$1_TRUE])dnl -AC_SUBST([$1_FALSE])dnl -_AM_SUBST_NOTMAKE([$1_TRUE])dnl -_AM_SUBST_NOTMAKE([$1_FALSE])dnl -m4_define([_AM_COND_VALUE_$1], [$2])dnl -if $2; then - $1_TRUE= - $1_FALSE='#' -else - $1_TRUE='#' - $1_FALSE= -fi -AC_CONFIG_COMMANDS_PRE( -[if test -z "${$1_TRUE}" && test -z "${$1_FALSE}"; then - AC_MSG_ERROR([[conditional "$1" was never defined. -Usually this means the macro was only invoked conditionally.]]) -fi])]) -m4trace:/usr/share/aclocal-1.11/depend.m4:28: -1- AC_DEFUN([_AM_DEPENDENCIES], [AC_REQUIRE([AM_SET_DEPDIR])dnl -AC_REQUIRE([AM_OUTPUT_DEPENDENCY_COMMANDS])dnl -AC_REQUIRE([AM_MAKE_INCLUDE])dnl -AC_REQUIRE([AM_DEP_TRACK])dnl - -ifelse([$1], CC, [depcc="$CC" am_compiler_list=], - [$1], CXX, [depcc="$CXX" am_compiler_list=], - [$1], OBJC, [depcc="$OBJC" am_compiler_list='gcc3 gcc'], - [$1], UPC, [depcc="$UPC" am_compiler_list=], - [$1], GCJ, [depcc="$GCJ" am_compiler_list='gcc3 gcc'], - [depcc="$$1" am_compiler_list=]) - -AC_CACHE_CHECK([dependency style of $depcc], - [am_cv_$1_dependencies_compiler_type], -[if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then - # We make a subdir and do the tests there. Otherwise we can end up - # making bogus files that we don't know about and never remove. For - # instance it was reported that on HP-UX the gcc test will end up - # making a dummy file named `D' -- because `-MD' means `put the output - # in D'. - rm -rf conftest.dir - mkdir conftest.dir - # Copy depcomp to subdir because otherwise we won't find it if we're - # using a relative directory. - cp "$am_depcomp" conftest.dir - cd conftest.dir - # We will build objects and dependencies in a subdirectory because - # it helps to detect inapplicable dependency modes. For instance - # both Tru64's cc and ICC support -MD to output dependencies as a - # side effect of compilation, but ICC will put the dependencies in - # the current directory while Tru64 will put them in the object - # directory. - mkdir sub - - am_cv_$1_dependencies_compiler_type=none - if test "$am_compiler_list" = ""; then - am_compiler_list=`sed -n ['s/^#*\([a-zA-Z0-9]*\))$/\1/p'] < ./depcomp` - fi - am__universal=false - m4_case([$1], [CC], - [case " $depcc " in #( - *\ -arch\ *\ -arch\ *) am__universal=true ;; - esac], - [CXX], - [case " $depcc " in #( - *\ -arch\ *\ -arch\ *) am__universal=true ;; - esac]) - - for depmode in $am_compiler_list; do - # Setup a source with many dependencies, because some compilers - # like to wrap large dependency lists on column 80 (with \), and - # we should not choose a depcomp mode which is confused by this. - # - # We need to recreate these files for each test, as the compiler may - # overwrite some of them when testing with obscure command lines. - # This happens at least with the AIX C compiler. - : > sub/conftest.c - for i in 1 2 3 4 5 6; do - echo '#include "conftst'$i'.h"' >> sub/conftest.c - # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with - # Solaris 8's {/usr,}/bin/sh. - touch sub/conftst$i.h - done - echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf - - # We check with `-c' and `-o' for the sake of the "dashmstdout" - # mode. It turns out that the SunPro C++ compiler does not properly - # handle `-M -o', and we need to detect this. Also, some Intel - # versions had trouble with output in subdirs - am__obj=sub/conftest.${OBJEXT-o} - am__minus_obj="-o $am__obj" - case $depmode in - gcc) - # This depmode causes a compiler race in universal mode. - test "$am__universal" = false || continue - ;; - nosideeffect) - # after this tag, mechanisms are not by side-effect, so they'll - # only be used when explicitly requested - if test "x$enable_dependency_tracking" = xyes; then - continue - else - break - fi - ;; - msvc7 | msvc7msys | msvisualcpp | msvcmsys) - # This compiler won't grok `-c -o', but also, the minuso test has - # not run yet. These depmodes are late enough in the game, and - # so weak that their functioning should not be impacted. - am__obj=conftest.${OBJEXT-o} - am__minus_obj= - ;; - none) break ;; - esac - if depmode=$depmode \ - source=sub/conftest.c object=$am__obj \ - depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ - $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ - >/dev/null 2>conftest.err && - grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && - grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && - grep $am__obj sub/conftest.Po > /dev/null 2>&1 && - ${MAKE-make} -s -f confmf > /dev/null 2>&1; then - # icc doesn't choke on unknown options, it will just issue warnings - # or remarks (even with -Werror). So we grep stderr for any message - # that says an option was ignored or not supported. - # When given -MP, icc 7.0 and 7.1 complain thusly: - # icc: Command line warning: ignoring option '-M'; no argument required - # The diagnosis changed in icc 8.0: - # icc: Command line remark: option '-MP' not supported - if (grep 'ignoring option' conftest.err || - grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else - am_cv_$1_dependencies_compiler_type=$depmode - break - fi - fi - done - - cd .. - rm -rf conftest.dir -else - am_cv_$1_dependencies_compiler_type=none -fi -]) -AC_SUBST([$1DEPMODE], [depmode=$am_cv_$1_dependencies_compiler_type]) -AM_CONDITIONAL([am__fastdep$1], [ - test "x$enable_dependency_tracking" != xno \ - && test "$am_cv_$1_dependencies_compiler_type" = gcc3]) -]) -m4trace:/usr/share/aclocal-1.11/depend.m4:164: -1- AC_DEFUN([AM_SET_DEPDIR], [AC_REQUIRE([AM_SET_LEADING_DOT])dnl -AC_SUBST([DEPDIR], ["${am__leading_dot}deps"])dnl -]) -m4trace:/usr/share/aclocal-1.11/depend.m4:172: -1- AC_DEFUN([AM_DEP_TRACK], [AC_ARG_ENABLE(dependency-tracking, -[ --disable-dependency-tracking speeds up one-time build - --enable-dependency-tracking do not reject slow dependency extractors]) -if test "x$enable_dependency_tracking" != xno; then - am_depcomp="$ac_aux_dir/depcomp" - AMDEPBACKSLASH='\' - am__nodep='_no' -fi -AM_CONDITIONAL([AMDEP], [test "x$enable_dependency_tracking" != xno]) -AC_SUBST([AMDEPBACKSLASH])dnl -_AM_SUBST_NOTMAKE([AMDEPBACKSLASH])dnl -AC_SUBST([am__nodep])dnl -_AM_SUBST_NOTMAKE([am__nodep])dnl -]) -m4trace:/usr/share/aclocal-1.11/depout.m4:14: -1- AC_DEFUN([_AM_OUTPUT_DEPENDENCY_COMMANDS], [{ - # Autoconf 2.62 quotes --file arguments for eval, but not when files - # are listed without --file. Let's play safe and only enable the eval - # if we detect the quoting. - case $CONFIG_FILES in - *\'*) eval set x "$CONFIG_FILES" ;; - *) set x $CONFIG_FILES ;; - esac - shift - for mf - do - # Strip MF so we end up with the name of the file. - mf=`echo "$mf" | sed -e 's/:.*$//'` - # Check whether this is an Automake generated Makefile or not. - # We used to match only the files named `Makefile.in', but - # some people rename them; so instead we look at the file content. - # Grep'ing the first line is not enough: some people post-process - # each Makefile.in and add a new line on top of each file to say so. - # Grep'ing the whole file is not good either: AIX grep has a line - # limit of 2048, but all sed's we know have understand at least 4000. - if sed -n 's,^#.*generated by automake.*,X,p' "$mf" | grep X >/dev/null 2>&1; then - dirpart=`AS_DIRNAME("$mf")` - else - continue - fi - # Extract the definition of DEPDIR, am__include, and am__quote - # from the Makefile without running `make'. - DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"` - test -z "$DEPDIR" && continue - am__include=`sed -n 's/^am__include = //p' < "$mf"` - test -z "am__include" && continue - am__quote=`sed -n 's/^am__quote = //p' < "$mf"` - # When using ansi2knr, U may be empty or an underscore; expand it - U=`sed -n 's/^U = //p' < "$mf"` - # Find all dependency output files, they are included files with - # $(DEPDIR) in their names. We invoke sed twice because it is the - # simplest approach to changing $(DEPDIR) to its actual value in the - # expansion. - for file in `sed -n " - s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \ - sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g' -e 's/\$U/'"$U"'/g'`; do - # Make sure the directory exists. - test -f "$dirpart/$file" && continue - fdir=`AS_DIRNAME(["$file"])` - AS_MKDIR_P([$dirpart/$fdir]) - # echo "creating $dirpart/$file" - echo '# dummy' > "$dirpart/$file" - done - done -} -]) -m4trace:/usr/share/aclocal-1.11/depout.m4:75: -1- AC_DEFUN([AM_OUTPUT_DEPENDENCY_COMMANDS], [AC_CONFIG_COMMANDS([depfiles], - [test x"$AMDEP_TRUE" != x"" || _AM_OUTPUT_DEPENDENCY_COMMANDS], - [AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir"]) -]) -m4trace:/usr/share/aclocal-1.11/init.m4:26: -1- AC_DEFUN([AM_INIT_AUTOMAKE], [AC_PREREQ([2.62])dnl -dnl Autoconf wants to disallow AM_ names. We explicitly allow -dnl the ones we care about. -m4_pattern_allow([^AM_[A-Z]+FLAGS$])dnl -AC_REQUIRE([AM_SET_CURRENT_AUTOMAKE_VERSION])dnl -AC_REQUIRE([AC_PROG_INSTALL])dnl -if test "`cd $srcdir && pwd`" != "`pwd`"; then - # Use -I$(srcdir) only when $(srcdir) != ., so that make's output - # is not polluted with repeated "-I." - AC_SUBST([am__isrc], [' -I$(srcdir)'])_AM_SUBST_NOTMAKE([am__isrc])dnl - # test to see if srcdir already configured - if test -f $srcdir/config.status; then - AC_MSG_ERROR([source directory already configured; run "make distclean" there first]) - fi -fi - -# test whether we have cygpath -if test -z "$CYGPATH_W"; then - if (cygpath --version) >/dev/null 2>/dev/null; then - CYGPATH_W='cygpath -w' - else - CYGPATH_W=echo - fi -fi -AC_SUBST([CYGPATH_W]) - -# Define the identity of the package. -dnl Distinguish between old-style and new-style calls. -m4_ifval([$2], -[m4_ifval([$3], [_AM_SET_OPTION([no-define])])dnl - AC_SUBST([PACKAGE], [$1])dnl - AC_SUBST([VERSION], [$2])], -[_AM_SET_OPTIONS([$1])dnl -dnl Diagnose old-style AC_INIT with new-style AM_AUTOMAKE_INIT. -m4_if(m4_ifdef([AC_PACKAGE_NAME], 1)m4_ifdef([AC_PACKAGE_VERSION], 1), 11,, - [m4_fatal([AC_INIT should be called with package and version arguments])])dnl - AC_SUBST([PACKAGE], ['AC_PACKAGE_TARNAME'])dnl - AC_SUBST([VERSION], ['AC_PACKAGE_VERSION'])])dnl - -_AM_IF_OPTION([no-define],, -[AC_DEFINE_UNQUOTED(PACKAGE, "$PACKAGE", [Name of package]) - AC_DEFINE_UNQUOTED(VERSION, "$VERSION", [Version number of package])])dnl - -# Some tools Automake needs. -AC_REQUIRE([AM_SANITY_CHECK])dnl -AC_REQUIRE([AC_ARG_PROGRAM])dnl -AM_MISSING_PROG(ACLOCAL, aclocal-${am__api_version}) -AM_MISSING_PROG(AUTOCONF, autoconf) -AM_MISSING_PROG(AUTOMAKE, automake-${am__api_version}) -AM_MISSING_PROG(AUTOHEADER, autoheader) -AM_MISSING_PROG(MAKEINFO, makeinfo) -AC_REQUIRE([AM_PROG_INSTALL_SH])dnl -AC_REQUIRE([AM_PROG_INSTALL_STRIP])dnl -AC_REQUIRE([AM_PROG_MKDIR_P])dnl -# We need awk for the "check" target. The system "awk" is bad on -# some platforms. -AC_REQUIRE([AC_PROG_AWK])dnl -AC_REQUIRE([AC_PROG_MAKE_SET])dnl -AC_REQUIRE([AM_SET_LEADING_DOT])dnl -_AM_IF_OPTION([tar-ustar], [_AM_PROG_TAR([ustar])], - [_AM_IF_OPTION([tar-pax], [_AM_PROG_TAR([pax])], - [_AM_PROG_TAR([v7])])]) -_AM_IF_OPTION([no-dependencies],, -[AC_PROVIDE_IFELSE([AC_PROG_CC], - [_AM_DEPENDENCIES(CC)], - [define([AC_PROG_CC], - defn([AC_PROG_CC])[_AM_DEPENDENCIES(CC)])])dnl -AC_PROVIDE_IFELSE([AC_PROG_CXX], - [_AM_DEPENDENCIES(CXX)], - [define([AC_PROG_CXX], - defn([AC_PROG_CXX])[_AM_DEPENDENCIES(CXX)])])dnl -AC_PROVIDE_IFELSE([AC_PROG_OBJC], - [_AM_DEPENDENCIES(OBJC)], - [define([AC_PROG_OBJC], - defn([AC_PROG_OBJC])[_AM_DEPENDENCIES(OBJC)])])dnl -]) -_AM_IF_OPTION([silent-rules], [AC_REQUIRE([AM_SILENT_RULES])])dnl -dnl The `parallel-tests' driver may need to know about EXEEXT, so add the -dnl `am__EXEEXT' conditional if _AM_COMPILER_EXEEXT was seen. This macro -dnl is hooked onto _AC_COMPILER_EXEEXT early, see below. -AC_CONFIG_COMMANDS_PRE(dnl -[m4_provide_if([_AM_COMPILER_EXEEXT], - [AM_CONDITIONAL([am__EXEEXT], [test -n "$EXEEXT"])])])dnl -]) -m4trace:/usr/share/aclocal-1.11/init.m4:126: -1- AC_DEFUN([_AC_AM_CONFIG_HEADER_HOOK], [# Compute $1's index in $config_headers. -_am_arg=$1 -_am_stamp_count=1 -for _am_header in $config_headers :; do - case $_am_header in - $_am_arg | $_am_arg:* ) - break ;; - * ) - _am_stamp_count=`expr $_am_stamp_count + 1` ;; - esac -done -echo "timestamp for $_am_arg" >`AS_DIRNAME(["$_am_arg"])`/stamp-h[]$_am_stamp_count]) -m4trace:/usr/share/aclocal-1.11/install-sh.m4:14: -1- AC_DEFUN([AM_PROG_INSTALL_SH], [AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl -if test x"${install_sh}" != xset; then - case $am_aux_dir in - *\ * | *\ *) - install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;; - *) - install_sh="\${SHELL} $am_aux_dir/install-sh" - esac -fi -AC_SUBST(install_sh)]) -m4trace:/usr/share/aclocal-1.11/lead-dot.m4:12: -1- AC_DEFUN([AM_SET_LEADING_DOT], [rm -rf .tst 2>/dev/null -mkdir .tst 2>/dev/null -if test -d .tst; then - am__leading_dot=. -else - am__leading_dot=_ -fi -rmdir .tst 2>/dev/null -AC_SUBST([am__leading_dot])]) -m4trace:/usr/share/aclocal-1.11/make.m4:14: -1- AC_DEFUN([AM_MAKE_INCLUDE], [am_make=${MAKE-make} -cat > confinc << 'END' -am__doit: - @echo this is the am__doit target -.PHONY: am__doit -END -# If we don't find an include directive, just comment out the code. -AC_MSG_CHECKING([for style of include used by $am_make]) -am__include="#" -am__quote= -_am_result=none -# First try GNU make style include. -echo "include confinc" > confmf -# Ignore all kinds of additional output from `make'. -case `$am_make -s -f confmf 2> /dev/null` in #( -*the\ am__doit\ target*) - am__include=include - am__quote= - _am_result=GNU - ;; -esac -# Now try BSD make style include. -if test "$am__include" = "#"; then - echo '.include "confinc"' > confmf - case `$am_make -s -f confmf 2> /dev/null` in #( - *the\ am__doit\ target*) - am__include=.include - am__quote="\"" - _am_result=BSD - ;; - esac -fi -AC_SUBST([am__include]) -AC_SUBST([am__quote]) -AC_MSG_RESULT([$_am_result]) -rm -f confinc confmf -]) -m4trace:/usr/share/aclocal-1.11/minuso.m4:14: -1- AC_DEFUN([AM_PROG_CC_C_O], [AC_REQUIRE([AC_PROG_CC_C_O])dnl -AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl -AC_REQUIRE_AUX_FILE([compile])dnl -# FIXME: we rely on the cache variable name because -# there is no other way. -set dummy $CC -am_cc=`echo $[2] | sed ['s/[^a-zA-Z0-9_]/_/g;s/^[0-9]/_/']` -eval am_t=\$ac_cv_prog_cc_${am_cc}_c_o -if test "$am_t" != yes; then - # Losing compiler, so override with the script. - # FIXME: It is wrong to rewrite CC. - # But if we don't then we get into trouble of one sort or another. - # A longer-term fix would be to have automake use am__CC in this case, - # and then we could set am__CC="\$(top_srcdir)/compile \$(CC)" - CC="$am_aux_dir/compile $CC" -fi -dnl Make sure AC_PROG_CC is never called again, or it will override our -dnl setting of CC. -m4_define([AC_PROG_CC], - [m4_fatal([AC_PROG_CC cannot be called after AM_PROG_CC_C_O])]) -]) -m4trace:/usr/share/aclocal-1.11/missing.m4:14: -1- AC_DEFUN([AM_MISSING_PROG], [AC_REQUIRE([AM_MISSING_HAS_RUN]) -$1=${$1-"${am_missing_run}$2"} -AC_SUBST($1)]) -m4trace:/usr/share/aclocal-1.11/missing.m4:24: -1- AC_DEFUN([AM_MISSING_HAS_RUN], [AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl -AC_REQUIRE_AUX_FILE([missing])dnl -if test x"${MISSING+set}" != xset; then - case $am_aux_dir in - *\ * | *\ *) - MISSING="\${SHELL} \"$am_aux_dir/missing\"" ;; - *) - MISSING="\${SHELL} $am_aux_dir/missing" ;; - esac -fi -# Use eval to expand $SHELL -if eval "$MISSING --run true"; then - am_missing_run="$MISSING --run " -else - am_missing_run= - AC_MSG_WARN([`missing' script is too old or missing]) -fi -]) -m4trace:/usr/share/aclocal-1.11/mkdirp.m4:14: -1- AC_DEFUN([AM_PROG_MKDIR_P], [AC_PREREQ([2.60])dnl -AC_REQUIRE([AC_PROG_MKDIR_P])dnl -dnl Automake 1.8 to 1.9.6 used to define mkdir_p. We now use MKDIR_P, -dnl while keeping a definition of mkdir_p for backward compatibility. -dnl @MKDIR_P@ is magic: AC_OUTPUT adjusts its value for each Makefile. -dnl However we cannot define mkdir_p as $(MKDIR_P) for the sake of -dnl Makefile.ins that do not define MKDIR_P, so we do our own -dnl adjustment using top_builddir (which is defined more often than -dnl MKDIR_P). -AC_SUBST([mkdir_p], ["$MKDIR_P"])dnl -case $mkdir_p in - [[\\/$]]* | ?:[[\\/]]*) ;; - */*) mkdir_p="\$(top_builddir)/$mkdir_p" ;; -esac -]) -m4trace:/usr/share/aclocal-1.11/options.m4:14: -1- AC_DEFUN([_AM_MANGLE_OPTION], [[_AM_OPTION_]m4_bpatsubst($1, [[^a-zA-Z0-9_]], [_])]) -m4trace:/usr/share/aclocal-1.11/options.m4:20: -1- AC_DEFUN([_AM_SET_OPTION], [m4_define(_AM_MANGLE_OPTION([$1]), 1)]) -m4trace:/usr/share/aclocal-1.11/options.m4:26: -1- AC_DEFUN([_AM_SET_OPTIONS], [m4_foreach_w([_AM_Option], [$1], [_AM_SET_OPTION(_AM_Option)])]) -m4trace:/usr/share/aclocal-1.11/options.m4:32: -1- AC_DEFUN([_AM_IF_OPTION], [m4_ifset(_AM_MANGLE_OPTION([$1]), [$2], [$3])]) -m4trace:/usr/share/aclocal-1.11/runlog.m4:14: -1- AC_DEFUN([AM_RUN_LOG], [{ echo "$as_me:$LINENO: $1" >&AS_MESSAGE_LOG_FD - ($1) >&AS_MESSAGE_LOG_FD 2>&AS_MESSAGE_LOG_FD - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&AS_MESSAGE_LOG_FD - (exit $ac_status); }]) -m4trace:/usr/share/aclocal-1.11/sanity.m4:14: -1- AC_DEFUN([AM_SANITY_CHECK], [AC_MSG_CHECKING([whether build environment is sane]) -# Just in case -sleep 1 -echo timestamp > conftest.file -# Reject unsafe characters in $srcdir or the absolute working directory -# name. Accept space and tab only in the latter. -am_lf=' -' -case `pwd` in - *[[\\\"\#\$\&\'\`$am_lf]]*) - AC_MSG_ERROR([unsafe absolute working directory name]);; -esac -case $srcdir in - *[[\\\"\#\$\&\'\`$am_lf\ \ ]]*) - AC_MSG_ERROR([unsafe srcdir value: `$srcdir']);; -esac - -# Do `set' in a subshell so we don't clobber the current shell's -# arguments. Must try -L first in case configure is actually a -# symlink; some systems play weird games with the mod time of symlinks -# (eg FreeBSD returns the mod time of the symlink's containing -# directory). -if ( - set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null` - if test "$[*]" = "X"; then - # -L didn't work. - set X `ls -t "$srcdir/configure" conftest.file` - fi - rm -f conftest.file - if test "$[*]" != "X $srcdir/configure conftest.file" \ - && test "$[*]" != "X conftest.file $srcdir/configure"; then - - # If neither matched, then we have a broken ls. This can happen - # if, for instance, CONFIG_SHELL is bash and it inherits a - # broken ls alias from the environment. This has actually - # happened. Such a system could not be considered "sane". - AC_MSG_ERROR([ls -t appears to fail. Make sure there is not a broken -alias in your environment]) - fi - - test "$[2]" = conftest.file - ) -then - # Ok. - : -else - AC_MSG_ERROR([newly created file is older than distributed files! -Check your system clock]) -fi -AC_MSG_RESULT(yes)]) -m4trace:/usr/share/aclocal-1.11/silent.m4:14: -1- AC_DEFUN([AM_SILENT_RULES], [AC_ARG_ENABLE([silent-rules], -[ --enable-silent-rules less verbose build output (undo: `make V=1') - --disable-silent-rules verbose build output (undo: `make V=0')]) -case $enable_silent_rules in -yes) AM_DEFAULT_VERBOSITY=0;; -no) AM_DEFAULT_VERBOSITY=1;; -*) AM_DEFAULT_VERBOSITY=m4_if([$1], [yes], [0], [1]);; -esac -dnl -dnl A few `make' implementations (e.g., NonStop OS and NextStep) -dnl do not support nested variable expansions. -dnl See automake bug#9928 and bug#10237. -am_make=${MAKE-make} -AC_CACHE_CHECK([whether $am_make supports nested variables], - [am_cv_make_support_nested_variables], - [if AS_ECHO([['TRUE=$(BAR$(V)) -BAR0=false -BAR1=true -V=1 -am__doit: - @$(TRUE) -.PHONY: am__doit']]) | $am_make -f - >/dev/null 2>&1; then - am_cv_make_support_nested_variables=yes -else - am_cv_make_support_nested_variables=no -fi]) -if test $am_cv_make_support_nested_variables = yes; then - dnl Using `$V' instead of `$(V)' breaks IRIX make. - AM_V='$(V)' - AM_DEFAULT_V='$(AM_DEFAULT_VERBOSITY)' -else - AM_V=$AM_DEFAULT_VERBOSITY - AM_DEFAULT_V=$AM_DEFAULT_VERBOSITY -fi -AC_SUBST([AM_V])dnl -AM_SUBST_NOTMAKE([AM_V])dnl -AC_SUBST([AM_DEFAULT_V])dnl -AM_SUBST_NOTMAKE([AM_DEFAULT_V])dnl -AC_SUBST([AM_DEFAULT_VERBOSITY])dnl -AM_BACKSLASH='\' -AC_SUBST([AM_BACKSLASH])dnl -_AM_SUBST_NOTMAKE([AM_BACKSLASH])dnl -]) -m4trace:/usr/share/aclocal-1.11/strip.m4:19: -1- AC_DEFUN([AM_PROG_INSTALL_STRIP], [AC_REQUIRE([AM_PROG_INSTALL_SH])dnl -# Installed binaries are usually stripped using `strip' when the user -# run `make install-strip'. However `strip' might not be the right -# tool to use in cross-compilation environments, therefore Automake -# will honor the `STRIP' environment variable to overrule this program. -dnl Don't test for $cross_compiling = yes, because it might be `maybe'. -if test "$cross_compiling" != no; then - AC_CHECK_TOOL([STRIP], [strip], :) -fi -INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s" -AC_SUBST([INSTALL_STRIP_PROGRAM])]) -m4trace:/usr/share/aclocal-1.11/substnot.m4:14: -1- AC_DEFUN([_AM_SUBST_NOTMAKE]) -m4trace:/usr/share/aclocal-1.11/substnot.m4:19: -1- AC_DEFUN([AM_SUBST_NOTMAKE], [_AM_SUBST_NOTMAKE($@)]) -m4trace:/usr/share/aclocal-1.11/tar.m4:24: -1- AC_DEFUN([_AM_PROG_TAR], [# Always define AMTAR for backward compatibility. Yes, it's still used -# in the wild :-( We should find a proper way to deprecate it ... -AC_SUBST([AMTAR], ['$${TAR-tar}']) -m4_if([$1], [v7], - [am__tar='$${TAR-tar} chof - "$$tardir"' am__untar='$${TAR-tar} xf -'], - [m4_case([$1], [ustar],, [pax],, - [m4_fatal([Unknown tar format])]) -AC_MSG_CHECKING([how to create a $1 tar archive]) -# Loop over all known methods to create a tar archive until one works. -_am_tools='gnutar m4_if([$1], [ustar], [plaintar]) pax cpio none' -_am_tools=${am_cv_prog_tar_$1-$_am_tools} -# Do not fold the above two line into one, because Tru64 sh and -# Solaris sh will not grok spaces in the rhs of `-'. -for _am_tool in $_am_tools -do - case $_am_tool in - gnutar) - for _am_tar in tar gnutar gtar; - do - AM_RUN_LOG([$_am_tar --version]) && break - done - am__tar="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$$tardir"' - am__tar_="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$tardir"' - am__untar="$_am_tar -xf -" - ;; - plaintar) - # Must skip GNU tar: if it does not support --format= it doesn't create - # ustar tarball either. - (tar --version) >/dev/null 2>&1 && continue - am__tar='tar chf - "$$tardir"' - am__tar_='tar chf - "$tardir"' - am__untar='tar xf -' - ;; - pax) - am__tar='pax -L -x $1 -w "$$tardir"' - am__tar_='pax -L -x $1 -w "$tardir"' - am__untar='pax -r' - ;; - cpio) - am__tar='find "$$tardir" -print | cpio -o -H $1 -L' - am__tar_='find "$tardir" -print | cpio -o -H $1 -L' - am__untar='cpio -i -H $1 -d' - ;; - none) - am__tar=false - am__tar_=false - am__untar=false - ;; - esac - - # If the value was cached, stop now. We just wanted to have am__tar - # and am__untar set. - test -n "${am_cv_prog_tar_$1}" && break - - # tar/untar a dummy directory, and stop if the command works - rm -rf conftest.dir - mkdir conftest.dir - echo GrepMe > conftest.dir/file - AM_RUN_LOG([tardir=conftest.dir && eval $am__tar_ >conftest.tar]) - rm -rf conftest.dir - if test -s conftest.tar; then - AM_RUN_LOG([$am__untar /dev/null 2>&1 && break - fi -done -rm -rf conftest.dir - -AC_CACHE_VAL([am_cv_prog_tar_$1], [am_cv_prog_tar_$1=$_am_tool]) -AC_MSG_RESULT([$am_cv_prog_tar_$1])]) -AC_SUBST([am__tar]) -AC_SUBST([am__untar]) -]) -m4trace:acinclude.m4:43: -1- AC_DEFUN([DX_FEATURE_doc], [ON]) -m4trace:acinclude.m4:44: -1- AC_DEFUN([DX_FEATURE_dot], [ON]) -m4trace:acinclude.m4:45: -1- AC_DEFUN([DX_FEATURE_man], [OFF]) -m4trace:acinclude.m4:46: -1- AC_DEFUN([DX_FEATURE_html], [ON]) -m4trace:acinclude.m4:47: -1- AC_DEFUN([DX_FEATURE_chm], [OFF]) -m4trace:acinclude.m4:48: -1- AC_DEFUN([DX_FEATURE_chi], [OFF]) -m4trace:acinclude.m4:49: -1- AC_DEFUN([DX_FEATURE_rtf], [OFF]) -m4trace:acinclude.m4:50: -1- AC_DEFUN([DX_FEATURE_xml], [OFF]) -m4trace:acinclude.m4:51: -1- AC_DEFUN([DX_FEATURE_pdf], [ON]) -m4trace:acinclude.m4:52: -1- AC_DEFUN([DX_FEATURE_ps], [ON]) -m4trace:acinclude.m4:61: -1- AC_DEFUN([DX_ENV_APPEND], [AC_SUBST([DX_ENV], ["$DX_ENV $1='$2'"])]) -m4trace:acinclude.m4:66: -1- AC_DEFUN([DX_DIRNAME_EXPR], [[expr ".$1" : '\(\.\)[^/]*$' \| "x$1" : 'x\(.*\)/[^/]*$']]) -m4trace:acinclude.m4:72: -1- AC_DEFUN([DX_IF_FEATURE], [ifelse(DX_FEATURE_$1, ON, [$2], [$3])]) -m4trace:acinclude.m4:77: -1- AC_DEFUN([DX_REQUIRE_PROG], [ -AC_PATH_TOOL([$1], [$2]) -if test "$DX_FLAG_$[DX_CURRENT_FEATURE$$1]" = 1; then - AC_MSG_WARN([$2 not found - will not DX_CURRENT_DESCRIPTION]) - AC_SUBST([DX_FLAG_]DX_CURRENT_FEATURE, 0) -fi -]) -m4trace:acinclude.m4:88: -1- AC_DEFUN([DX_TEST_FEATURE], [test "$DX_FLAG_$1" = 1]) -m4trace:acinclude.m4:94: -1- AC_DEFUN([DX_CHECK_DEPEND], [ -test "$DX_FLAG_$1" = "$2" \ -|| AC_MSG_ERROR([doxygen-DX_CURRENT_FEATURE ifelse([$2], 1, - requires, contradicts) doxygen-DX_CURRENT_FEATURE]) -]) -m4trace:acinclude.m4:103: -1- AC_DEFUN([DX_CLEAR_DEPEND], [ -test "$DX_FLAG_$1" = "$2" || AC_SUBST([DX_FLAG_]DX_CURRENT_FEATURE, 0) -]) -m4trace:acinclude.m4:117: -1- AC_DEFUN([DX_ARG_ABLE], [ - AC_DEFUN([DX_CURRENT_FEATURE], [$1]) - AC_DEFUN([DX_CURRENT_DESCRIPTION], [$2]) - AC_ARG_ENABLE(doxygen-$1, - [AS_HELP_STRING(DX_IF_FEATURE([$1], [--disable-doxygen-$1], - [--enable-doxygen-$1]), - DX_IF_FEATURE([$1], [don't $2], [$2]))], - [ -case "$enableval" in -#( -y|Y|yes|Yes|YES) - AC_SUBST([DX_FLAG_$1], 1) - $3 -;; #( -n|N|no|No|NO) - AC_SUBST([DX_FLAG_$1], 0) -;; #( -*) - AC_MSG_ERROR([invalid value '$enableval' given to doxygen-$1]) -;; -esac -], [ -AC_SUBST([DX_FLAG_$1], [DX_IF_FEATURE([$1], 1, 0)]) -$4 -]) -if DX_TEST_FEATURE([$1]); then - $5 - : -fi -if DX_TEST_FEATURE([$1]); then - AM_CONDITIONAL(DX_COND_$1, :) - $6 - : -else - AM_CONDITIONAL(DX_COND_$1, false) - $7 - : -fi -]) -m4trace:acinclude.m4:163: -1- AC_DEFUN([DX_DOXYGEN_FEATURE], [AC_DEFUN([DX_FEATURE_doc], [$1])]) -m4trace:acinclude.m4:164: -1- AC_DEFUN([DX_MAN_FEATURE], [AC_DEFUN([DX_FEATURE_man], [$1])]) -m4trace:acinclude.m4:165: -1- AC_DEFUN([DX_HTML_FEATURE], [AC_DEFUN([DX_FEATURE_html], [$1])]) -m4trace:acinclude.m4:166: -1- AC_DEFUN([DX_CHM_FEATURE], [AC_DEFUN([DX_FEATURE_chm], [$1])]) -m4trace:acinclude.m4:167: -1- AC_DEFUN([DX_CHI_FEATURE], [AC_DEFUN([DX_FEATURE_chi], [$1])]) -m4trace:acinclude.m4:168: -1- AC_DEFUN([DX_RTF_FEATURE], [AC_DEFUN([DX_FEATURE_rtf], [$1])]) -m4trace:acinclude.m4:169: -1- AC_DEFUN([DX_XML_FEATURE], [AC_DEFUN([DX_FEATURE_xml], [$1])]) -m4trace:acinclude.m4:170: -1- AC_DEFUN([DX_XML_FEATURE], [AC_DEFUN([DX_FEATURE_xml], [$1])]) -m4trace:acinclude.m4:171: -1- AC_DEFUN([DX_PDF_FEATURE], [AC_DEFUN([DX_FEATURE_pdf], [$1])]) -m4trace:acinclude.m4:172: -1- AC_DEFUN([DX_PS_FEATURE], [AC_DEFUN([DX_FEATURE_ps], [$1])]) -m4trace:acinclude.m4:178: -1- AC_DEFUN([DX_INIT_DOXYGEN], [ - -# Files: -AC_SUBST([DX_PROJECT], [$1]) -AC_SUBST([DX_CONFIG], [ifelse([$2], [], Doxyfile, [$2])]) -AC_SUBST([DX_DOCDIR], [ifelse([$3], [], doxygen-doc, [$3])]) - -# Environment variables used inside doxygen.cfg: -DX_ENV_APPEND(SRCDIR, $srcdir) -DX_ENV_APPEND(PROJECT, $DX_PROJECT) -DX_ENV_APPEND(DOCDIR, $DX_DOCDIR) -DX_ENV_APPEND(VERSION, $PACKAGE_VERSION) - -# Doxygen itself: -DX_ARG_ABLE(doc, [generate any doxygen documentation], - [], - [], - [DX_REQUIRE_PROG([DX_DOXYGEN], doxygen) - DX_REQUIRE_PROG([DX_PERL], perl)], - [DX_ENV_APPEND(PERL_PATH, $DX_PERL)]) - -# Dot for graphics: -DX_ARG_ABLE(dot, [generate graphics for doxygen documentation], - [DX_CHECK_DEPEND(doc, 1)], - [DX_CLEAR_DEPEND(doc, 1)], - [DX_REQUIRE_PROG([DX_DOT], dot)], - [DX_ENV_APPEND(HAVE_DOT, YES) - DX_ENV_APPEND(DOT_PATH, [`DX_DIRNAME_EXPR($DX_DOT)`])], - [DX_ENV_APPEND(HAVE_DOT, NO)]) - -# Man pages generation: -DX_ARG_ABLE(man, [generate doxygen manual pages], - [DX_CHECK_DEPEND(doc, 1)], - [DX_CLEAR_DEPEND(doc, 1)], - [], - [DX_ENV_APPEND(GENERATE_MAN, YES)], - [DX_ENV_APPEND(GENERATE_MAN, NO)]) - -# RTF file generation: -DX_ARG_ABLE(rtf, [generate doxygen RTF documentation], - [DX_CHECK_DEPEND(doc, 1)], - [DX_CLEAR_DEPEND(doc, 1)], - [], - [DX_ENV_APPEND(GENERATE_RTF, YES)], - [DX_ENV_APPEND(GENERATE_RTF, NO)]) - -# XML file generation: -DX_ARG_ABLE(xml, [generate doxygen XML documentation], - [DX_CHECK_DEPEND(doc, 1)], - [DX_CLEAR_DEPEND(doc, 1)], - [], - [DX_ENV_APPEND(GENERATE_XML, YES)], - [DX_ENV_APPEND(GENERATE_XML, NO)]) - -# (Compressed) HTML help generation: -DX_ARG_ABLE(chm, [generate doxygen compressed HTML help documentation], - [DX_CHECK_DEPEND(doc, 1)], - [DX_CLEAR_DEPEND(doc, 1)], - [DX_REQUIRE_PROG([DX_HHC], hhc)], - [DX_ENV_APPEND(HHC_PATH, $DX_HHC) - DX_ENV_APPEND(GENERATE_HTML, YES) - DX_ENV_APPEND(GENERATE_HTMLHELP, YES)], - [DX_ENV_APPEND(GENERATE_HTMLHELP, NO)]) - -# Seperate CHI file generation. -DX_ARG_ABLE(chi, [generate doxygen seperate compressed HTML help index file], - [DX_CHECK_DEPEND(chm, 1)], - [DX_CLEAR_DEPEND(chm, 1)], - [], - [DX_ENV_APPEND(GENERATE_CHI, YES)], - [DX_ENV_APPEND(GENERATE_CHI, NO)]) - -# Plain HTML pages generation: -DX_ARG_ABLE(html, [generate doxygen plain HTML documentation], - [DX_CHECK_DEPEND(doc, 1) DX_CHECK_DEPEND(chm, 0)], - [DX_CLEAR_DEPEND(doc, 1) DX_CLEAR_DEPEND(chm, 0)], - [], - [DX_ENV_APPEND(GENERATE_HTML, YES)], - [DX_TEST_FEATURE(chm) || DX_ENV_APPEND(GENERATE_HTML, NO)]) - -# PostScript file generation: -DX_ARG_ABLE(ps, [generate doxygen PostScript documentation], - [DX_CHECK_DEPEND(doc, 1)], - [DX_CLEAR_DEPEND(doc, 1)], - [DX_REQUIRE_PROG([DX_LATEX], latex) - DX_REQUIRE_PROG([DX_MAKEINDEX], makeindex) - DX_REQUIRE_PROG([DX_DVIPS], dvips) - DX_REQUIRE_PROG([DX_EGREP], egrep)]) - -# PDF file generation: -DX_ARG_ABLE(pdf, [generate doxygen PDF documentation], - [DX_CHECK_DEPEND(doc, 1)], - [DX_CLEAR_DEPEND(doc, 1)], - [DX_REQUIRE_PROG([DX_PDFLATEX], pdflatex) - DX_REQUIRE_PROG([DX_MAKEINDEX], makeindex) - DX_REQUIRE_PROG([DX_EGREP], egrep)]) - -# LaTeX generation for PS and/or PDF: -if DX_TEST_FEATURE(ps) || DX_TEST_FEATURE(pdf); then - AM_CONDITIONAL(DX_COND_latex, :) - DX_ENV_APPEND(GENERATE_LATEX, YES) -else - AM_CONDITIONAL(DX_COND_latex, false) - DX_ENV_APPEND(GENERATE_LATEX, NO) -fi - -# Paper size for PS and/or PDF: -AC_ARG_VAR(DOXYGEN_PAPER_SIZE, - [a4wide (default), a4, letter, legal or executive]) -case "$DOXYGEN_PAPER_SIZE" in -#( -"") - AC_SUBST(DOXYGEN_PAPER_SIZE, "") -;; #( -a4wide|a4|letter|legal|executive) - DX_ENV_APPEND(PAPER_SIZE, $DOXYGEN_PAPER_SIZE) -;; #( -*) - AC_MSG_ERROR([unknown DOXYGEN_PAPER_SIZE='$DOXYGEN_PAPER_SIZE']) -;; -esac - -#For debugging: -#echo DX_FLAG_doc=$DX_FLAG_doc -#echo DX_FLAG_dot=$DX_FLAG_dot -#echo DX_FLAG_man=$DX_FLAG_man -#echo DX_FLAG_html=$DX_FLAG_html -#echo DX_FLAG_chm=$DX_FLAG_chm -#echo DX_FLAG_chi=$DX_FLAG_chi -#echo DX_FLAG_rtf=$DX_FLAG_rtf -#echo DX_FLAG_xml=$DX_FLAG_xml -#echo DX_FLAG_pdf=$DX_FLAG_pdf -#echo DX_FLAG_ps=$DX_FLAG_ps -#echo DX_ENV=$DX_ENV -]) -m4trace:configure.ac:6: -1- m4_pattern_forbid([^_?A[CHUM]_]) -m4trace:configure.ac:6: -1- m4_pattern_forbid([_AC_]) -m4trace:configure.ac:6: -1- m4_pattern_forbid([^LIBOBJS$], [do not use LIBOBJS directly, use AC_LIBOBJ (see section `AC_LIBOBJ vs LIBOBJS']) -m4trace:configure.ac:6: -1- m4_pattern_allow([^AS_FLAGS$]) -m4trace:configure.ac:6: -1- m4_pattern_forbid([^_?m4_]) -m4trace:configure.ac:6: -1- m4_pattern_forbid([^dnl$]) -m4trace:configure.ac:6: -1- m4_pattern_forbid([^_?AS_]) -m4trace:configure.ac:6: -1- m4_pattern_allow([^SHELL$]) -m4trace:configure.ac:6: -1- m4_pattern_allow([^PATH_SEPARATOR$]) -m4trace:configure.ac:6: -1- m4_pattern_allow([^PACKAGE_NAME$]) -m4trace:configure.ac:6: -1- m4_pattern_allow([^PACKAGE_TARNAME$]) -m4trace:configure.ac:6: -1- m4_pattern_allow([^PACKAGE_VERSION$]) -m4trace:configure.ac:6: -1- m4_pattern_allow([^PACKAGE_STRING$]) -m4trace:configure.ac:6: -1- m4_pattern_allow([^PACKAGE_BUGREPORT$]) -m4trace:configure.ac:6: -1- m4_pattern_allow([^PACKAGE_URL$]) -m4trace:configure.ac:6: -1- m4_pattern_allow([^exec_prefix$]) -m4trace:configure.ac:6: -1- m4_pattern_allow([^prefix$]) -m4trace:configure.ac:6: -1- m4_pattern_allow([^program_transform_name$]) -m4trace:configure.ac:6: -1- m4_pattern_allow([^bindir$]) -m4trace:configure.ac:6: -1- m4_pattern_allow([^sbindir$]) -m4trace:configure.ac:6: -1- m4_pattern_allow([^libexecdir$]) -m4trace:configure.ac:6: -1- m4_pattern_allow([^datarootdir$]) -m4trace:configure.ac:6: -1- m4_pattern_allow([^datadir$]) -m4trace:configure.ac:6: -1- m4_pattern_allow([^sysconfdir$]) -m4trace:configure.ac:6: -1- m4_pattern_allow([^sharedstatedir$]) -m4trace:configure.ac:6: -1- m4_pattern_allow([^localstatedir$]) -m4trace:configure.ac:6: -1- m4_pattern_allow([^includedir$]) -m4trace:configure.ac:6: -1- m4_pattern_allow([^oldincludedir$]) -m4trace:configure.ac:6: -1- m4_pattern_allow([^docdir$]) -m4trace:configure.ac:6: -1- m4_pattern_allow([^infodir$]) -m4trace:configure.ac:6: -1- m4_pattern_allow([^htmldir$]) -m4trace:configure.ac:6: -1- m4_pattern_allow([^dvidir$]) -m4trace:configure.ac:6: -1- m4_pattern_allow([^pdfdir$]) -m4trace:configure.ac:6: -1- m4_pattern_allow([^psdir$]) -m4trace:configure.ac:6: -1- m4_pattern_allow([^libdir$]) -m4trace:configure.ac:6: -1- m4_pattern_allow([^localedir$]) -m4trace:configure.ac:6: -1- m4_pattern_allow([^mandir$]) -m4trace:configure.ac:6: -1- m4_pattern_allow([^PACKAGE_NAME$]) -m4trace:configure.ac:6: -1- m4_pattern_allow([^PACKAGE_TARNAME$]) -m4trace:configure.ac:6: -1- m4_pattern_allow([^PACKAGE_VERSION$]) -m4trace:configure.ac:6: -1- m4_pattern_allow([^PACKAGE_STRING$]) -m4trace:configure.ac:6: -1- m4_pattern_allow([^PACKAGE_BUGREPORT$]) -m4trace:configure.ac:6: -1- m4_pattern_allow([^PACKAGE_URL$]) -m4trace:configure.ac:6: -1- m4_pattern_allow([^DEFS$]) -m4trace:configure.ac:6: -1- m4_pattern_allow([^ECHO_C$]) -m4trace:configure.ac:6: -1- m4_pattern_allow([^ECHO_N$]) -m4trace:configure.ac:6: -1- m4_pattern_allow([^ECHO_T$]) -m4trace:configure.ac:6: -1- m4_pattern_allow([^LIBS$]) -m4trace:configure.ac:6: -1- m4_pattern_allow([^build_alias$]) -m4trace:configure.ac:6: -1- m4_pattern_allow([^host_alias$]) -m4trace:configure.ac:6: -1- m4_pattern_allow([^target_alias$]) -m4trace:configure.ac:14: -1- DX_HTML_FEATURE([ON]) -m4trace:configure.ac:14: -1- AC_DEFUN([DX_FEATURE_html], [ON]) -m4trace:configure.ac:15: -1- DX_CHM_FEATURE([OFF]) -m4trace:configure.ac:15: -1- AC_DEFUN([DX_FEATURE_chm], [OFF]) -m4trace:configure.ac:16: -1- DX_CHI_FEATURE([OFF]) -m4trace:configure.ac:16: -1- AC_DEFUN([DX_FEATURE_chi], [OFF]) -m4trace:configure.ac:17: -1- DX_MAN_FEATURE([OFF]) -m4trace:configure.ac:17: -1- AC_DEFUN([DX_FEATURE_man], [OFF]) -m4trace:configure.ac:18: -1- DX_RTF_FEATURE([OFF]) -m4trace:configure.ac:18: -1- AC_DEFUN([DX_FEATURE_rtf], [OFF]) -m4trace:configure.ac:19: -1- DX_XML_FEATURE([OFF]) -m4trace:configure.ac:19: -1- AC_DEFUN([DX_FEATURE_xml], [OFF]) -m4trace:configure.ac:20: -1- DX_PDF_FEATURE([OFF]) -m4trace:configure.ac:20: -1- AC_DEFUN([DX_FEATURE_pdf], [OFF]) -m4trace:configure.ac:21: -1- DX_PS_FEATURE([OFF]) -m4trace:configure.ac:21: -1- AC_DEFUN([DX_FEATURE_ps], [OFF]) -m4trace:configure.ac:22: -1- DX_INIT_DOXYGEN([zookeeper], [c-doc.Doxyfile], [docs]) -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_PROJECT$]) -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_CONFIG$]) -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_DOCDIR$]) -m4trace:configure.ac:22: -1- DX_ENV_APPEND([SRCDIR], [$srcdir]) -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_ENV$]) -m4trace:configure.ac:22: -1- DX_ENV_APPEND([PROJECT], [$DX_PROJECT]) -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_ENV$]) -m4trace:configure.ac:22: -1- DX_ENV_APPEND([DOCDIR], [$DX_DOCDIR]) -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_ENV$]) -m4trace:configure.ac:22: -1- DX_ENV_APPEND([VERSION], [$PACKAGE_VERSION]) -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_ENV$]) -m4trace:configure.ac:22: -1- DX_ARG_ABLE([doc], [generate any doxygen documentation], [], [], [DX_REQUIRE_PROG([DX_DOXYGEN], doxygen) - DX_REQUIRE_PROG([DX_PERL], perl)], [DX_ENV_APPEND(PERL_PATH, $DX_PERL)]) -m4trace:configure.ac:22: -1- AC_DEFUN([DX_CURRENT_FEATURE], [doc]) -m4trace:configure.ac:22: -1- AC_DEFUN([DX_CURRENT_DESCRIPTION], [generate any doxygen documentation]) -m4trace:configure.ac:22: -2- DX_IF_FEATURE([doc], [--disable-doxygen-doc], [--enable-doxygen-doc]) -m4trace:configure.ac:22: -3- DX_FEATURE_doc -m4trace:configure.ac:22: -2- DX_IF_FEATURE([doc], [don't generate any doxygen documentation], [generate any doxygen documentation]) -m4trace:configure.ac:22: -3- DX_FEATURE_doc -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_FLAG_doc$]) -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_FLAG_doc$]) -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_FLAG_doc$]) -m4trace:configure.ac:22: -1- DX_IF_FEATURE([doc], [1], [0]) -m4trace:configure.ac:22: -2- DX_FEATURE_doc -m4trace:configure.ac:22: -1- DX_TEST_FEATURE([doc]) -m4trace:configure.ac:22: -1- DX_REQUIRE_PROG([DX_DOXYGEN], [doxygen]) -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_DOXYGEN$]) -m4trace:configure.ac:22: -1- DX_CURRENT_DESCRIPTION -m4trace:configure.ac:22: -1- DX_CURRENT_DESCRIPTION -m4trace:configure.ac:22: -2- DX_CURRENT_FEATURE -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_FLAG_doc$]) -m4trace:configure.ac:22: -1- DX_REQUIRE_PROG([DX_PERL], [perl]) -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_PERL$]) -m4trace:configure.ac:22: -1- DX_CURRENT_DESCRIPTION -m4trace:configure.ac:22: -1- DX_CURRENT_DESCRIPTION -m4trace:configure.ac:22: -2- DX_CURRENT_FEATURE -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_FLAG_doc$]) -m4trace:configure.ac:22: -1- DX_TEST_FEATURE([doc]) -m4trace:configure.ac:22: -1- AM_CONDITIONAL([DX_COND_doc], [:]) -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_COND_doc_TRUE$]) -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_COND_doc_FALSE$]) -m4trace:configure.ac:22: -1- _AM_SUBST_NOTMAKE([DX_COND_doc_TRUE]) -m4trace:configure.ac:22: -1- _AM_SUBST_NOTMAKE([DX_COND_doc_FALSE]) -m4trace:configure.ac:22: -1- DX_ENV_APPEND([PERL_PATH], [$DX_PERL]) -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_ENV$]) -m4trace:configure.ac:22: -1- AM_CONDITIONAL([DX_COND_doc], [false]) -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_COND_doc_TRUE$]) -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_COND_doc_FALSE$]) -m4trace:configure.ac:22: -1- _AM_SUBST_NOTMAKE([DX_COND_doc_TRUE]) -m4trace:configure.ac:22: -1- _AM_SUBST_NOTMAKE([DX_COND_doc_FALSE]) -m4trace:configure.ac:22: -1- DX_ARG_ABLE([dot], [generate graphics for doxygen documentation], [DX_CHECK_DEPEND(doc, 1)], [DX_CLEAR_DEPEND(doc, 1)], [DX_REQUIRE_PROG([DX_DOT], dot)], [DX_ENV_APPEND(HAVE_DOT, YES) - DX_ENV_APPEND(DOT_PATH, [`DX_DIRNAME_EXPR($DX_DOT)`])], [DX_ENV_APPEND(HAVE_DOT, NO)]) -m4trace:configure.ac:22: -1- AC_DEFUN([DX_CURRENT_FEATURE], [dot]) -m4trace:configure.ac:22: -1- AC_DEFUN([DX_CURRENT_DESCRIPTION], [generate graphics for doxygen documentation]) -m4trace:configure.ac:22: -2- DX_IF_FEATURE([dot], [--disable-doxygen-dot], [--enable-doxygen-dot]) -m4trace:configure.ac:22: -3- DX_FEATURE_dot -m4trace:configure.ac:22: -2- DX_IF_FEATURE([dot], [don't generate graphics for doxygen documentation], [generate graphics for doxygen documentation]) -m4trace:configure.ac:22: -3- DX_FEATURE_dot -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_FLAG_dot$]) -m4trace:configure.ac:22: -1- DX_CHECK_DEPEND([doc], [1]) -m4trace:configure.ac:22: -1- DX_CURRENT_FEATURE -m4trace:configure.ac:22: -1- DX_CURRENT_FEATURE -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_FLAG_dot$]) -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_FLAG_dot$]) -m4trace:configure.ac:22: -1- DX_IF_FEATURE([dot], [1], [0]) -m4trace:configure.ac:22: -2- DX_FEATURE_dot -m4trace:configure.ac:22: -1- DX_CLEAR_DEPEND([doc], [1]) -m4trace:configure.ac:22: -2- DX_CURRENT_FEATURE -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_FLAG_dot$]) -m4trace:configure.ac:22: -1- DX_TEST_FEATURE([dot]) -m4trace:configure.ac:22: -1- DX_REQUIRE_PROG([DX_DOT], [dot]) -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_DOT$]) -m4trace:configure.ac:22: -1- DX_CURRENT_DESCRIPTION -m4trace:configure.ac:22: -1- DX_CURRENT_DESCRIPTION -m4trace:configure.ac:22: -2- DX_CURRENT_FEATURE -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_FLAG_dot$]) -m4trace:configure.ac:22: -1- DX_TEST_FEATURE([dot]) -m4trace:configure.ac:22: -1- AM_CONDITIONAL([DX_COND_dot], [:]) -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_COND_dot_TRUE$]) -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_COND_dot_FALSE$]) -m4trace:configure.ac:22: -1- _AM_SUBST_NOTMAKE([DX_COND_dot_TRUE]) -m4trace:configure.ac:22: -1- _AM_SUBST_NOTMAKE([DX_COND_dot_FALSE]) -m4trace:configure.ac:22: -1- DX_ENV_APPEND([HAVE_DOT], [YES]) -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_ENV$]) -m4trace:configure.ac:22: -1- DX_ENV_APPEND([DOT_PATH], [`DX_DIRNAME_EXPR($DX_DOT)`]) -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_ENV$]) -m4trace:configure.ac:22: -1- DX_DIRNAME_EXPR([$DX_DOT]) -m4trace:configure.ac:22: -1- AM_CONDITIONAL([DX_COND_dot], [false]) -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_COND_dot_TRUE$]) -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_COND_dot_FALSE$]) -m4trace:configure.ac:22: -1- _AM_SUBST_NOTMAKE([DX_COND_dot_TRUE]) -m4trace:configure.ac:22: -1- _AM_SUBST_NOTMAKE([DX_COND_dot_FALSE]) -m4trace:configure.ac:22: -1- DX_ENV_APPEND([HAVE_DOT], [NO]) -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_ENV$]) -m4trace:configure.ac:22: -1- DX_ARG_ABLE([man], [generate doxygen manual pages], [DX_CHECK_DEPEND(doc, 1)], [DX_CLEAR_DEPEND(doc, 1)], [], [DX_ENV_APPEND(GENERATE_MAN, YES)], [DX_ENV_APPEND(GENERATE_MAN, NO)]) -m4trace:configure.ac:22: -1- AC_DEFUN([DX_CURRENT_FEATURE], [man]) -m4trace:configure.ac:22: -1- AC_DEFUN([DX_CURRENT_DESCRIPTION], [generate doxygen manual pages]) -m4trace:configure.ac:22: -2- DX_IF_FEATURE([man], [--disable-doxygen-man], [--enable-doxygen-man]) -m4trace:configure.ac:22: -3- DX_FEATURE_man -m4trace:configure.ac:22: -2- DX_IF_FEATURE([man], [don't generate doxygen manual pages], [generate doxygen manual pages]) -m4trace:configure.ac:22: -3- DX_FEATURE_man -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_FLAG_man$]) -m4trace:configure.ac:22: -1- DX_CHECK_DEPEND([doc], [1]) -m4trace:configure.ac:22: -1- DX_CURRENT_FEATURE -m4trace:configure.ac:22: -1- DX_CURRENT_FEATURE -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_FLAG_man$]) -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_FLAG_man$]) -m4trace:configure.ac:22: -1- DX_IF_FEATURE([man], [1], [0]) -m4trace:configure.ac:22: -2- DX_FEATURE_man -m4trace:configure.ac:22: -1- DX_CLEAR_DEPEND([doc], [1]) -m4trace:configure.ac:22: -2- DX_CURRENT_FEATURE -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_FLAG_man$]) -m4trace:configure.ac:22: -1- DX_TEST_FEATURE([man]) -m4trace:configure.ac:22: -1- DX_TEST_FEATURE([man]) -m4trace:configure.ac:22: -1- AM_CONDITIONAL([DX_COND_man], [:]) -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_COND_man_TRUE$]) -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_COND_man_FALSE$]) -m4trace:configure.ac:22: -1- _AM_SUBST_NOTMAKE([DX_COND_man_TRUE]) -m4trace:configure.ac:22: -1- _AM_SUBST_NOTMAKE([DX_COND_man_FALSE]) -m4trace:configure.ac:22: -1- DX_ENV_APPEND([GENERATE_MAN], [YES]) -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_ENV$]) -m4trace:configure.ac:22: -1- AM_CONDITIONAL([DX_COND_man], [false]) -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_COND_man_TRUE$]) -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_COND_man_FALSE$]) -m4trace:configure.ac:22: -1- _AM_SUBST_NOTMAKE([DX_COND_man_TRUE]) -m4trace:configure.ac:22: -1- _AM_SUBST_NOTMAKE([DX_COND_man_FALSE]) -m4trace:configure.ac:22: -1- DX_ENV_APPEND([GENERATE_MAN], [NO]) -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_ENV$]) -m4trace:configure.ac:22: -1- DX_ARG_ABLE([rtf], [generate doxygen RTF documentation], [DX_CHECK_DEPEND(doc, 1)], [DX_CLEAR_DEPEND(doc, 1)], [], [DX_ENV_APPEND(GENERATE_RTF, YES)], [DX_ENV_APPEND(GENERATE_RTF, NO)]) -m4trace:configure.ac:22: -1- AC_DEFUN([DX_CURRENT_FEATURE], [rtf]) -m4trace:configure.ac:22: -1- AC_DEFUN([DX_CURRENT_DESCRIPTION], [generate doxygen RTF documentation]) -m4trace:configure.ac:22: -2- DX_IF_FEATURE([rtf], [--disable-doxygen-rtf], [--enable-doxygen-rtf]) -m4trace:configure.ac:22: -3- DX_FEATURE_rtf -m4trace:configure.ac:22: -2- DX_IF_FEATURE([rtf], [don't generate doxygen RTF documentation], [generate doxygen RTF documentation]) -m4trace:configure.ac:22: -3- DX_FEATURE_rtf -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_FLAG_rtf$]) -m4trace:configure.ac:22: -1- DX_CHECK_DEPEND([doc], [1]) -m4trace:configure.ac:22: -1- DX_CURRENT_FEATURE -m4trace:configure.ac:22: -1- DX_CURRENT_FEATURE -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_FLAG_rtf$]) -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_FLAG_rtf$]) -m4trace:configure.ac:22: -1- DX_IF_FEATURE([rtf], [1], [0]) -m4trace:configure.ac:22: -2- DX_FEATURE_rtf -m4trace:configure.ac:22: -1- DX_CLEAR_DEPEND([doc], [1]) -m4trace:configure.ac:22: -2- DX_CURRENT_FEATURE -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_FLAG_rtf$]) -m4trace:configure.ac:22: -1- DX_TEST_FEATURE([rtf]) -m4trace:configure.ac:22: -1- DX_TEST_FEATURE([rtf]) -m4trace:configure.ac:22: -1- AM_CONDITIONAL([DX_COND_rtf], [:]) -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_COND_rtf_TRUE$]) -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_COND_rtf_FALSE$]) -m4trace:configure.ac:22: -1- _AM_SUBST_NOTMAKE([DX_COND_rtf_TRUE]) -m4trace:configure.ac:22: -1- _AM_SUBST_NOTMAKE([DX_COND_rtf_FALSE]) -m4trace:configure.ac:22: -1- DX_ENV_APPEND([GENERATE_RTF], [YES]) -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_ENV$]) -m4trace:configure.ac:22: -1- AM_CONDITIONAL([DX_COND_rtf], [false]) -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_COND_rtf_TRUE$]) -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_COND_rtf_FALSE$]) -m4trace:configure.ac:22: -1- _AM_SUBST_NOTMAKE([DX_COND_rtf_TRUE]) -m4trace:configure.ac:22: -1- _AM_SUBST_NOTMAKE([DX_COND_rtf_FALSE]) -m4trace:configure.ac:22: -1- DX_ENV_APPEND([GENERATE_RTF], [NO]) -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_ENV$]) -m4trace:configure.ac:22: -1- DX_ARG_ABLE([xml], [generate doxygen XML documentation], [DX_CHECK_DEPEND(doc, 1)], [DX_CLEAR_DEPEND(doc, 1)], [], [DX_ENV_APPEND(GENERATE_XML, YES)], [DX_ENV_APPEND(GENERATE_XML, NO)]) -m4trace:configure.ac:22: -1- AC_DEFUN([DX_CURRENT_FEATURE], [xml]) -m4trace:configure.ac:22: -1- AC_DEFUN([DX_CURRENT_DESCRIPTION], [generate doxygen XML documentation]) -m4trace:configure.ac:22: -2- DX_IF_FEATURE([xml], [--disable-doxygen-xml], [--enable-doxygen-xml]) -m4trace:configure.ac:22: -3- DX_FEATURE_xml -m4trace:configure.ac:22: -2- DX_IF_FEATURE([xml], [don't generate doxygen XML documentation], [generate doxygen XML documentation]) -m4trace:configure.ac:22: -3- DX_FEATURE_xml -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_FLAG_xml$]) -m4trace:configure.ac:22: -1- DX_CHECK_DEPEND([doc], [1]) -m4trace:configure.ac:22: -1- DX_CURRENT_FEATURE -m4trace:configure.ac:22: -1- DX_CURRENT_FEATURE -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_FLAG_xml$]) -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_FLAG_xml$]) -m4trace:configure.ac:22: -1- DX_IF_FEATURE([xml], [1], [0]) -m4trace:configure.ac:22: -2- DX_FEATURE_xml -m4trace:configure.ac:22: -1- DX_CLEAR_DEPEND([doc], [1]) -m4trace:configure.ac:22: -2- DX_CURRENT_FEATURE -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_FLAG_xml$]) -m4trace:configure.ac:22: -1- DX_TEST_FEATURE([xml]) -m4trace:configure.ac:22: -1- DX_TEST_FEATURE([xml]) -m4trace:configure.ac:22: -1- AM_CONDITIONAL([DX_COND_xml], [:]) -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_COND_xml_TRUE$]) -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_COND_xml_FALSE$]) -m4trace:configure.ac:22: -1- _AM_SUBST_NOTMAKE([DX_COND_xml_TRUE]) -m4trace:configure.ac:22: -1- _AM_SUBST_NOTMAKE([DX_COND_xml_FALSE]) -m4trace:configure.ac:22: -1- DX_ENV_APPEND([GENERATE_XML], [YES]) -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_ENV$]) -m4trace:configure.ac:22: -1- AM_CONDITIONAL([DX_COND_xml], [false]) -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_COND_xml_TRUE$]) -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_COND_xml_FALSE$]) -m4trace:configure.ac:22: -1- _AM_SUBST_NOTMAKE([DX_COND_xml_TRUE]) -m4trace:configure.ac:22: -1- _AM_SUBST_NOTMAKE([DX_COND_xml_FALSE]) -m4trace:configure.ac:22: -1- DX_ENV_APPEND([GENERATE_XML], [NO]) -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_ENV$]) -m4trace:configure.ac:22: -1- DX_ARG_ABLE([chm], [generate doxygen compressed HTML help documentation], [DX_CHECK_DEPEND(doc, 1)], [DX_CLEAR_DEPEND(doc, 1)], [DX_REQUIRE_PROG([DX_HHC], hhc)], [DX_ENV_APPEND(HHC_PATH, $DX_HHC) - DX_ENV_APPEND(GENERATE_HTML, YES) - DX_ENV_APPEND(GENERATE_HTMLHELP, YES)], [DX_ENV_APPEND(GENERATE_HTMLHELP, NO)]) -m4trace:configure.ac:22: -1- AC_DEFUN([DX_CURRENT_FEATURE], [chm]) -m4trace:configure.ac:22: -1- AC_DEFUN([DX_CURRENT_DESCRIPTION], [generate doxygen compressed HTML help documentation]) -m4trace:configure.ac:22: -2- DX_IF_FEATURE([chm], [--disable-doxygen-chm], [--enable-doxygen-chm]) -m4trace:configure.ac:22: -3- DX_FEATURE_chm -m4trace:configure.ac:22: -2- DX_IF_FEATURE([chm], [don't generate doxygen compressed HTML help documentation], [generate doxygen compressed HTML help documentation]) -m4trace:configure.ac:22: -3- DX_FEATURE_chm -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_FLAG_chm$]) -m4trace:configure.ac:22: -1- DX_CHECK_DEPEND([doc], [1]) -m4trace:configure.ac:22: -1- DX_CURRENT_FEATURE -m4trace:configure.ac:22: -1- DX_CURRENT_FEATURE -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_FLAG_chm$]) -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_FLAG_chm$]) -m4trace:configure.ac:22: -1- DX_IF_FEATURE([chm], [1], [0]) -m4trace:configure.ac:22: -2- DX_FEATURE_chm -m4trace:configure.ac:22: -1- DX_CLEAR_DEPEND([doc], [1]) -m4trace:configure.ac:22: -2- DX_CURRENT_FEATURE -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_FLAG_chm$]) -m4trace:configure.ac:22: -1- DX_TEST_FEATURE([chm]) -m4trace:configure.ac:22: -1- DX_REQUIRE_PROG([DX_HHC], [hhc]) -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_HHC$]) -m4trace:configure.ac:22: -1- DX_CURRENT_DESCRIPTION -m4trace:configure.ac:22: -1- DX_CURRENT_DESCRIPTION -m4trace:configure.ac:22: -2- DX_CURRENT_FEATURE -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_FLAG_chm$]) -m4trace:configure.ac:22: -1- DX_TEST_FEATURE([chm]) -m4trace:configure.ac:22: -1- AM_CONDITIONAL([DX_COND_chm], [:]) -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_COND_chm_TRUE$]) -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_COND_chm_FALSE$]) -m4trace:configure.ac:22: -1- _AM_SUBST_NOTMAKE([DX_COND_chm_TRUE]) -m4trace:configure.ac:22: -1- _AM_SUBST_NOTMAKE([DX_COND_chm_FALSE]) -m4trace:configure.ac:22: -1- DX_ENV_APPEND([HHC_PATH], [$DX_HHC]) -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_ENV$]) -m4trace:configure.ac:22: -1- DX_ENV_APPEND([GENERATE_HTML], [YES]) -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_ENV$]) -m4trace:configure.ac:22: -1- DX_ENV_APPEND([GENERATE_HTMLHELP], [YES]) -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_ENV$]) -m4trace:configure.ac:22: -1- AM_CONDITIONAL([DX_COND_chm], [false]) -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_COND_chm_TRUE$]) -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_COND_chm_FALSE$]) -m4trace:configure.ac:22: -1- _AM_SUBST_NOTMAKE([DX_COND_chm_TRUE]) -m4trace:configure.ac:22: -1- _AM_SUBST_NOTMAKE([DX_COND_chm_FALSE]) -m4trace:configure.ac:22: -1- DX_ENV_APPEND([GENERATE_HTMLHELP], [NO]) -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_ENV$]) -m4trace:configure.ac:22: -1- DX_ARG_ABLE([chi], [generate doxygen seperate compressed HTML help index file], [DX_CHECK_DEPEND(chm, 1)], [DX_CLEAR_DEPEND(chm, 1)], [], [DX_ENV_APPEND(GENERATE_CHI, YES)], [DX_ENV_APPEND(GENERATE_CHI, NO)]) -m4trace:configure.ac:22: -1- AC_DEFUN([DX_CURRENT_FEATURE], [chi]) -m4trace:configure.ac:22: -1- AC_DEFUN([DX_CURRENT_DESCRIPTION], [generate doxygen seperate compressed HTML help index file]) -m4trace:configure.ac:22: -2- DX_IF_FEATURE([chi], [--disable-doxygen-chi], [--enable-doxygen-chi]) -m4trace:configure.ac:22: -3- DX_FEATURE_chi -m4trace:configure.ac:22: -2- DX_IF_FEATURE([chi], [don't generate doxygen seperate compressed HTML help index file], [generate doxygen seperate compressed HTML help index file]) -m4trace:configure.ac:22: -3- DX_FEATURE_chi -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_FLAG_chi$]) -m4trace:configure.ac:22: -1- DX_CHECK_DEPEND([chm], [1]) -m4trace:configure.ac:22: -1- DX_CURRENT_FEATURE -m4trace:configure.ac:22: -1- DX_CURRENT_FEATURE -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_FLAG_chi$]) -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_FLAG_chi$]) -m4trace:configure.ac:22: -1- DX_IF_FEATURE([chi], [1], [0]) -m4trace:configure.ac:22: -2- DX_FEATURE_chi -m4trace:configure.ac:22: -1- DX_CLEAR_DEPEND([chm], [1]) -m4trace:configure.ac:22: -2- DX_CURRENT_FEATURE -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_FLAG_chi$]) -m4trace:configure.ac:22: -1- DX_TEST_FEATURE([chi]) -m4trace:configure.ac:22: -1- DX_TEST_FEATURE([chi]) -m4trace:configure.ac:22: -1- AM_CONDITIONAL([DX_COND_chi], [:]) -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_COND_chi_TRUE$]) -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_COND_chi_FALSE$]) -m4trace:configure.ac:22: -1- _AM_SUBST_NOTMAKE([DX_COND_chi_TRUE]) -m4trace:configure.ac:22: -1- _AM_SUBST_NOTMAKE([DX_COND_chi_FALSE]) -m4trace:configure.ac:22: -1- DX_ENV_APPEND([GENERATE_CHI], [YES]) -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_ENV$]) -m4trace:configure.ac:22: -1- AM_CONDITIONAL([DX_COND_chi], [false]) -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_COND_chi_TRUE$]) -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_COND_chi_FALSE$]) -m4trace:configure.ac:22: -1- _AM_SUBST_NOTMAKE([DX_COND_chi_TRUE]) -m4trace:configure.ac:22: -1- _AM_SUBST_NOTMAKE([DX_COND_chi_FALSE]) -m4trace:configure.ac:22: -1- DX_ENV_APPEND([GENERATE_CHI], [NO]) -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_ENV$]) -m4trace:configure.ac:22: -1- DX_ARG_ABLE([html], [generate doxygen plain HTML documentation], [DX_CHECK_DEPEND(doc, 1) DX_CHECK_DEPEND(chm, 0)], [DX_CLEAR_DEPEND(doc, 1) DX_CLEAR_DEPEND(chm, 0)], [], [DX_ENV_APPEND(GENERATE_HTML, YES)], [DX_TEST_FEATURE(chm) || DX_ENV_APPEND(GENERATE_HTML, NO)]) -m4trace:configure.ac:22: -1- AC_DEFUN([DX_CURRENT_FEATURE], [html]) -m4trace:configure.ac:22: -1- AC_DEFUN([DX_CURRENT_DESCRIPTION], [generate doxygen plain HTML documentation]) -m4trace:configure.ac:22: -2- DX_IF_FEATURE([html], [--disable-doxygen-html], [--enable-doxygen-html]) -m4trace:configure.ac:22: -3- DX_FEATURE_html -m4trace:configure.ac:22: -2- DX_IF_FEATURE([html], [don't generate doxygen plain HTML documentation], [generate doxygen plain HTML documentation]) -m4trace:configure.ac:22: -3- DX_FEATURE_html -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_FLAG_html$]) -m4trace:configure.ac:22: -1- DX_CHECK_DEPEND([doc], [1]) -m4trace:configure.ac:22: -1- DX_CURRENT_FEATURE -m4trace:configure.ac:22: -1- DX_CURRENT_FEATURE -m4trace:configure.ac:22: -1- DX_CHECK_DEPEND([chm], [0]) -m4trace:configure.ac:22: -1- DX_CURRENT_FEATURE -m4trace:configure.ac:22: -1- DX_CURRENT_FEATURE -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_FLAG_html$]) -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_FLAG_html$]) -m4trace:configure.ac:22: -1- DX_IF_FEATURE([html], [1], [0]) -m4trace:configure.ac:22: -2- DX_FEATURE_html -m4trace:configure.ac:22: -1- DX_CLEAR_DEPEND([doc], [1]) -m4trace:configure.ac:22: -2- DX_CURRENT_FEATURE -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_FLAG_html$]) -m4trace:configure.ac:22: -1- DX_CLEAR_DEPEND([chm], [0]) -m4trace:configure.ac:22: -2- DX_CURRENT_FEATURE -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_FLAG_html$]) -m4trace:configure.ac:22: -1- DX_TEST_FEATURE([html]) -m4trace:configure.ac:22: -1- DX_TEST_FEATURE([html]) -m4trace:configure.ac:22: -1- AM_CONDITIONAL([DX_COND_html], [:]) -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_COND_html_TRUE$]) -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_COND_html_FALSE$]) -m4trace:configure.ac:22: -1- _AM_SUBST_NOTMAKE([DX_COND_html_TRUE]) -m4trace:configure.ac:22: -1- _AM_SUBST_NOTMAKE([DX_COND_html_FALSE]) -m4trace:configure.ac:22: -1- DX_ENV_APPEND([GENERATE_HTML], [YES]) -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_ENV$]) -m4trace:configure.ac:22: -1- AM_CONDITIONAL([DX_COND_html], [false]) -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_COND_html_TRUE$]) -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_COND_html_FALSE$]) -m4trace:configure.ac:22: -1- _AM_SUBST_NOTMAKE([DX_COND_html_TRUE]) -m4trace:configure.ac:22: -1- _AM_SUBST_NOTMAKE([DX_COND_html_FALSE]) -m4trace:configure.ac:22: -1- DX_TEST_FEATURE([chm]) -m4trace:configure.ac:22: -1- DX_ENV_APPEND([GENERATE_HTML], [NO]) -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_ENV$]) -m4trace:configure.ac:22: -1- DX_ARG_ABLE([ps], [generate doxygen PostScript documentation], [DX_CHECK_DEPEND(doc, 1)], [DX_CLEAR_DEPEND(doc, 1)], [DX_REQUIRE_PROG([DX_LATEX], latex) - DX_REQUIRE_PROG([DX_MAKEINDEX], makeindex) - DX_REQUIRE_PROG([DX_DVIPS], dvips) - DX_REQUIRE_PROG([DX_EGREP], egrep)]) -m4trace:configure.ac:22: -1- AC_DEFUN([DX_CURRENT_FEATURE], [ps]) -m4trace:configure.ac:22: -1- AC_DEFUN([DX_CURRENT_DESCRIPTION], [generate doxygen PostScript documentation]) -m4trace:configure.ac:22: -2- DX_IF_FEATURE([ps], [--disable-doxygen-ps], [--enable-doxygen-ps]) -m4trace:configure.ac:22: -3- DX_FEATURE_ps -m4trace:configure.ac:22: -2- DX_IF_FEATURE([ps], [don't generate doxygen PostScript documentation], [generate doxygen PostScript documentation]) -m4trace:configure.ac:22: -3- DX_FEATURE_ps -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_FLAG_ps$]) -m4trace:configure.ac:22: -1- DX_CHECK_DEPEND([doc], [1]) -m4trace:configure.ac:22: -1- DX_CURRENT_FEATURE -m4trace:configure.ac:22: -1- DX_CURRENT_FEATURE -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_FLAG_ps$]) -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_FLAG_ps$]) -m4trace:configure.ac:22: -1- DX_IF_FEATURE([ps], [1], [0]) -m4trace:configure.ac:22: -2- DX_FEATURE_ps -m4trace:configure.ac:22: -1- DX_CLEAR_DEPEND([doc], [1]) -m4trace:configure.ac:22: -2- DX_CURRENT_FEATURE -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_FLAG_ps$]) -m4trace:configure.ac:22: -1- DX_TEST_FEATURE([ps]) -m4trace:configure.ac:22: -1- DX_REQUIRE_PROG([DX_LATEX], [latex]) -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_LATEX$]) -m4trace:configure.ac:22: -1- DX_CURRENT_DESCRIPTION -m4trace:configure.ac:22: -1- DX_CURRENT_DESCRIPTION -m4trace:configure.ac:22: -2- DX_CURRENT_FEATURE -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_FLAG_ps$]) -m4trace:configure.ac:22: -1- DX_REQUIRE_PROG([DX_MAKEINDEX], [makeindex]) -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_MAKEINDEX$]) -m4trace:configure.ac:22: -1- DX_CURRENT_DESCRIPTION -m4trace:configure.ac:22: -1- DX_CURRENT_DESCRIPTION -m4trace:configure.ac:22: -2- DX_CURRENT_FEATURE -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_FLAG_ps$]) -m4trace:configure.ac:22: -1- DX_REQUIRE_PROG([DX_DVIPS], [dvips]) -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_DVIPS$]) -m4trace:configure.ac:22: -1- DX_CURRENT_DESCRIPTION -m4trace:configure.ac:22: -1- DX_CURRENT_DESCRIPTION -m4trace:configure.ac:22: -2- DX_CURRENT_FEATURE -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_FLAG_ps$]) -m4trace:configure.ac:22: -1- DX_REQUIRE_PROG([DX_EGREP], [egrep]) -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_EGREP$]) -m4trace:configure.ac:22: -1- DX_CURRENT_DESCRIPTION -m4trace:configure.ac:22: -1- DX_CURRENT_DESCRIPTION -m4trace:configure.ac:22: -2- DX_CURRENT_FEATURE -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_FLAG_ps$]) -m4trace:configure.ac:22: -1- DX_TEST_FEATURE([ps]) -m4trace:configure.ac:22: -1- AM_CONDITIONAL([DX_COND_ps], [:]) -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_COND_ps_TRUE$]) -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_COND_ps_FALSE$]) -m4trace:configure.ac:22: -1- _AM_SUBST_NOTMAKE([DX_COND_ps_TRUE]) -m4trace:configure.ac:22: -1- _AM_SUBST_NOTMAKE([DX_COND_ps_FALSE]) -m4trace:configure.ac:22: -1- AM_CONDITIONAL([DX_COND_ps], [false]) -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_COND_ps_TRUE$]) -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_COND_ps_FALSE$]) -m4trace:configure.ac:22: -1- _AM_SUBST_NOTMAKE([DX_COND_ps_TRUE]) -m4trace:configure.ac:22: -1- _AM_SUBST_NOTMAKE([DX_COND_ps_FALSE]) -m4trace:configure.ac:22: -1- DX_ARG_ABLE([pdf], [generate doxygen PDF documentation], [DX_CHECK_DEPEND(doc, 1)], [DX_CLEAR_DEPEND(doc, 1)], [DX_REQUIRE_PROG([DX_PDFLATEX], pdflatex) - DX_REQUIRE_PROG([DX_MAKEINDEX], makeindex) - DX_REQUIRE_PROG([DX_EGREP], egrep)]) -m4trace:configure.ac:22: -1- AC_DEFUN([DX_CURRENT_FEATURE], [pdf]) -m4trace:configure.ac:22: -1- AC_DEFUN([DX_CURRENT_DESCRIPTION], [generate doxygen PDF documentation]) -m4trace:configure.ac:22: -2- DX_IF_FEATURE([pdf], [--disable-doxygen-pdf], [--enable-doxygen-pdf]) -m4trace:configure.ac:22: -3- DX_FEATURE_pdf -m4trace:configure.ac:22: -2- DX_IF_FEATURE([pdf], [don't generate doxygen PDF documentation], [generate doxygen PDF documentation]) -m4trace:configure.ac:22: -3- DX_FEATURE_pdf -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_FLAG_pdf$]) -m4trace:configure.ac:22: -1- DX_CHECK_DEPEND([doc], [1]) -m4trace:configure.ac:22: -1- DX_CURRENT_FEATURE -m4trace:configure.ac:22: -1- DX_CURRENT_FEATURE -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_FLAG_pdf$]) -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_FLAG_pdf$]) -m4trace:configure.ac:22: -1- DX_IF_FEATURE([pdf], [1], [0]) -m4trace:configure.ac:22: -2- DX_FEATURE_pdf -m4trace:configure.ac:22: -1- DX_CLEAR_DEPEND([doc], [1]) -m4trace:configure.ac:22: -2- DX_CURRENT_FEATURE -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_FLAG_pdf$]) -m4trace:configure.ac:22: -1- DX_TEST_FEATURE([pdf]) -m4trace:configure.ac:22: -1- DX_REQUIRE_PROG([DX_PDFLATEX], [pdflatex]) -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_PDFLATEX$]) -m4trace:configure.ac:22: -1- DX_CURRENT_DESCRIPTION -m4trace:configure.ac:22: -1- DX_CURRENT_DESCRIPTION -m4trace:configure.ac:22: -2- DX_CURRENT_FEATURE -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_FLAG_pdf$]) -m4trace:configure.ac:22: -1- DX_REQUIRE_PROG([DX_MAKEINDEX], [makeindex]) -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_MAKEINDEX$]) -m4trace:configure.ac:22: -1- DX_CURRENT_DESCRIPTION -m4trace:configure.ac:22: -1- DX_CURRENT_DESCRIPTION -m4trace:configure.ac:22: -2- DX_CURRENT_FEATURE -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_FLAG_pdf$]) -m4trace:configure.ac:22: -1- DX_REQUIRE_PROG([DX_EGREP], [egrep]) -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_EGREP$]) -m4trace:configure.ac:22: -1- DX_CURRENT_DESCRIPTION -m4trace:configure.ac:22: -1- DX_CURRENT_DESCRIPTION -m4trace:configure.ac:22: -2- DX_CURRENT_FEATURE -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_FLAG_pdf$]) -m4trace:configure.ac:22: -1- DX_TEST_FEATURE([pdf]) -m4trace:configure.ac:22: -1- AM_CONDITIONAL([DX_COND_pdf], [:]) -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_COND_pdf_TRUE$]) -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_COND_pdf_FALSE$]) -m4trace:configure.ac:22: -1- _AM_SUBST_NOTMAKE([DX_COND_pdf_TRUE]) -m4trace:configure.ac:22: -1- _AM_SUBST_NOTMAKE([DX_COND_pdf_FALSE]) -m4trace:configure.ac:22: -1- AM_CONDITIONAL([DX_COND_pdf], [false]) -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_COND_pdf_TRUE$]) -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_COND_pdf_FALSE$]) -m4trace:configure.ac:22: -1- _AM_SUBST_NOTMAKE([DX_COND_pdf_TRUE]) -m4trace:configure.ac:22: -1- _AM_SUBST_NOTMAKE([DX_COND_pdf_FALSE]) -m4trace:configure.ac:22: -1- DX_TEST_FEATURE([ps]) -m4trace:configure.ac:22: -1- DX_TEST_FEATURE([pdf]) -m4trace:configure.ac:22: -1- AM_CONDITIONAL([DX_COND_latex], [:]) -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_COND_latex_TRUE$]) -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_COND_latex_FALSE$]) -m4trace:configure.ac:22: -1- _AM_SUBST_NOTMAKE([DX_COND_latex_TRUE]) -m4trace:configure.ac:22: -1- _AM_SUBST_NOTMAKE([DX_COND_latex_FALSE]) -m4trace:configure.ac:22: -1- DX_ENV_APPEND([GENERATE_LATEX], [YES]) -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_ENV$]) -m4trace:configure.ac:22: -1- AM_CONDITIONAL([DX_COND_latex], [false]) -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_COND_latex_TRUE$]) -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_COND_latex_FALSE$]) -m4trace:configure.ac:22: -1- _AM_SUBST_NOTMAKE([DX_COND_latex_TRUE]) -m4trace:configure.ac:22: -1- _AM_SUBST_NOTMAKE([DX_COND_latex_FALSE]) -m4trace:configure.ac:22: -1- DX_ENV_APPEND([GENERATE_LATEX], [NO]) -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_ENV$]) -m4trace:configure.ac:22: -1- m4_pattern_allow([^DOXYGEN_PAPER_SIZE$]) -m4trace:configure.ac:22: -1- m4_pattern_allow([^DOXYGEN_PAPER_SIZE$]) -m4trace:configure.ac:22: -1- DX_ENV_APPEND([PAPER_SIZE], [$DOXYGEN_PAPER_SIZE]) -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_ENV$]) -m4trace:configure.ac:25: -1- AM_INIT_AUTOMAKE([-Wall foreign]) -m4trace:configure.ac:25: -1- m4_pattern_allow([^AM_[A-Z]+FLAGS$]) -m4trace:configure.ac:25: -1- AM_SET_CURRENT_AUTOMAKE_VERSION -m4trace:configure.ac:25: -1- AM_AUTOMAKE_VERSION([1.11.6]) -m4trace:configure.ac:25: -1- _AM_AUTOCONF_VERSION([2.69]) -m4trace:configure.ac:25: -1- m4_pattern_allow([^INSTALL_PROGRAM$]) -m4trace:configure.ac:25: -1- m4_pattern_allow([^INSTALL_SCRIPT$]) -m4trace:configure.ac:25: -1- m4_pattern_allow([^INSTALL_DATA$]) -m4trace:configure.ac:25: -1- m4_pattern_allow([^am__isrc$]) -m4trace:configure.ac:25: -1- _AM_SUBST_NOTMAKE([am__isrc]) -m4trace:configure.ac:25: -1- m4_pattern_allow([^CYGPATH_W$]) -m4trace:configure.ac:25: -1- _AM_SET_OPTIONS([-Wall foreign]) -m4trace:configure.ac:25: -1- _AM_SET_OPTION([-Wall]) -m4trace:configure.ac:25: -2- _AM_MANGLE_OPTION([-Wall]) -m4trace:configure.ac:25: -1- _AM_SET_OPTION([foreign]) -m4trace:configure.ac:25: -2- _AM_MANGLE_OPTION([foreign]) -m4trace:configure.ac:25: -1- m4_pattern_allow([^PACKAGE$]) -m4trace:configure.ac:25: -1- m4_pattern_allow([^VERSION$]) -m4trace:configure.ac:25: -1- _AM_IF_OPTION([no-define], [], [AC_DEFINE_UNQUOTED(PACKAGE, "$PACKAGE", [Name of package]) - AC_DEFINE_UNQUOTED(VERSION, "$VERSION", [Version number of package])]) -m4trace:configure.ac:25: -2- _AM_MANGLE_OPTION([no-define]) -m4trace:configure.ac:25: -1- m4_pattern_allow([^PACKAGE$]) -m4trace:configure.ac:25: -1- m4_pattern_allow([^VERSION$]) -m4trace:configure.ac:25: -1- AM_SANITY_CHECK -m4trace:configure.ac:25: -1- AM_MISSING_PROG([ACLOCAL], [aclocal-${am__api_version}]) -m4trace:configure.ac:25: -1- AM_MISSING_HAS_RUN -m4trace:configure.ac:25: -1- AM_AUX_DIR_EXPAND -m4trace:configure.ac:25: -1- m4_pattern_allow([^ACLOCAL$]) -m4trace:configure.ac:25: -1- AM_MISSING_PROG([AUTOCONF], [autoconf]) -m4trace:configure.ac:25: -1- m4_pattern_allow([^AUTOCONF$]) -m4trace:configure.ac:25: -1- AM_MISSING_PROG([AUTOMAKE], [automake-${am__api_version}]) -m4trace:configure.ac:25: -1- m4_pattern_allow([^AUTOMAKE$]) -m4trace:configure.ac:25: -1- AM_MISSING_PROG([AUTOHEADER], [autoheader]) -m4trace:configure.ac:25: -1- m4_pattern_allow([^AUTOHEADER$]) -m4trace:configure.ac:25: -1- AM_MISSING_PROG([MAKEINFO], [makeinfo]) -m4trace:configure.ac:25: -1- m4_pattern_allow([^MAKEINFO$]) -m4trace:configure.ac:25: -1- AM_PROG_INSTALL_SH -m4trace:configure.ac:25: -1- m4_pattern_allow([^install_sh$]) -m4trace:configure.ac:25: -1- AM_PROG_INSTALL_STRIP -m4trace:configure.ac:25: -1- m4_pattern_allow([^STRIP$]) -m4trace:configure.ac:25: -1- m4_pattern_allow([^INSTALL_STRIP_PROGRAM$]) -m4trace:configure.ac:25: -1- AM_PROG_MKDIR_P -m4trace:configure.ac:25: -1- m4_pattern_allow([^MKDIR_P$]) -m4trace:configure.ac:25: -1- m4_pattern_allow([^mkdir_p$]) -m4trace:configure.ac:25: -1- m4_pattern_allow([^AWK$]) -m4trace:configure.ac:25: -1- m4_pattern_allow([^SET_MAKE$]) -m4trace:configure.ac:25: -1- AM_SET_LEADING_DOT -m4trace:configure.ac:25: -1- m4_pattern_allow([^am__leading_dot$]) -m4trace:configure.ac:25: -1- _AM_IF_OPTION([tar-ustar], [_AM_PROG_TAR([ustar])], [_AM_IF_OPTION([tar-pax], [_AM_PROG_TAR([pax])], - [_AM_PROG_TAR([v7])])]) -m4trace:configure.ac:25: -2- _AM_MANGLE_OPTION([tar-ustar]) -m4trace:configure.ac:25: -1- _AM_IF_OPTION([tar-pax], [_AM_PROG_TAR([pax])], [_AM_PROG_TAR([v7])]) -m4trace:configure.ac:25: -2- _AM_MANGLE_OPTION([tar-pax]) -m4trace:configure.ac:25: -1- _AM_PROG_TAR([v7]) -m4trace:configure.ac:25: -1- m4_pattern_allow([^AMTAR$]) -m4trace:configure.ac:25: -1- m4_pattern_allow([^am__tar$]) -m4trace:configure.ac:25: -1- m4_pattern_allow([^am__untar$]) -m4trace:configure.ac:25: -1- _AM_IF_OPTION([no-dependencies], [], [AC_PROVIDE_IFELSE([AC_PROG_CC], - [_AM_DEPENDENCIES(CC)], - [define([AC_PROG_CC], - defn([AC_PROG_CC])[_AM_DEPENDENCIES(CC)])])dnl -AC_PROVIDE_IFELSE([AC_PROG_CXX], - [_AM_DEPENDENCIES(CXX)], - [define([AC_PROG_CXX], - defn([AC_PROG_CXX])[_AM_DEPENDENCIES(CXX)])])dnl -AC_PROVIDE_IFELSE([AC_PROG_OBJC], - [_AM_DEPENDENCIES(OBJC)], - [define([AC_PROG_OBJC], - defn([AC_PROG_OBJC])[_AM_DEPENDENCIES(OBJC)])])dnl -]) -m4trace:configure.ac:25: -2- _AM_MANGLE_OPTION([no-dependencies]) -m4trace:configure.ac:25: -1- _AM_IF_OPTION([silent-rules], [AC_REQUIRE([AM_SILENT_RULES])]) -m4trace:configure.ac:25: -2- _AM_MANGLE_OPTION([silent-rules]) -m4trace:configure.ac:44: -1- _m4_warn([cross], [cannot check for file existence when cross compiling], [../../lib/autoconf/general.m4:2777: AC_CHECK_FILE is expanded from... -../../lib/autoconf/general.m4:2808: AC_CHECK_FILES is expanded from... -configure.ac:44: the top level]) -m4trace:configure.ac:44: -1- m4_pattern_allow([^HAVE_GENERATED_ZOOKEEPER_JUTE_C$]) -m4trace:configure.ac:44: -1- _m4_warn([cross], [cannot check for file existence when cross compiling], [../../lib/autoconf/general.m4:2777: AC_CHECK_FILE is expanded from... -../../lib/autoconf/general.m4:2808: AC_CHECK_FILES is expanded from... -configure.ac:44: the top level]) -m4trace:configure.ac:44: -1- m4_pattern_allow([^HAVE_GENERATED_ZOOKEEPER_JUTE_H$]) -m4trace:configure.ac:48: -1- m4_pattern_allow([^CPPUNIT_CFLAGS$]) -m4trace:configure.ac:50: -1- m4_pattern_allow([^CC$]) -m4trace:configure.ac:50: -1- m4_pattern_allow([^CFLAGS$]) -m4trace:configure.ac:50: -1- m4_pattern_allow([^LDFLAGS$]) -m4trace:configure.ac:50: -1- m4_pattern_allow([^LIBS$]) -m4trace:configure.ac:50: -1- m4_pattern_allow([^CPPFLAGS$]) -m4trace:configure.ac:50: -1- m4_pattern_allow([^CC$]) -m4trace:configure.ac:50: -1- m4_pattern_allow([^CC$]) -m4trace:configure.ac:50: -1- m4_pattern_allow([^CC$]) -m4trace:configure.ac:50: -1- m4_pattern_allow([^CC$]) -m4trace:configure.ac:50: -1- m4_pattern_allow([^ac_ct_CC$]) -m4trace:configure.ac:50: -1- m4_pattern_allow([^EXEEXT$]) -m4trace:configure.ac:50: -1- m4_pattern_allow([^OBJEXT$]) -m4trace:configure.ac:50: -1- _AM_DEPENDENCIES([CC]) -m4trace:configure.ac:50: -1- AM_SET_DEPDIR -m4trace:configure.ac:50: -1- m4_pattern_allow([^DEPDIR$]) -m4trace:configure.ac:50: -1- AM_OUTPUT_DEPENDENCY_COMMANDS -m4trace:configure.ac:50: -1- AM_MAKE_INCLUDE -m4trace:configure.ac:50: -1- m4_pattern_allow([^am__include$]) -m4trace:configure.ac:50: -1- m4_pattern_allow([^am__quote$]) -m4trace:configure.ac:50: -1- AM_DEP_TRACK -m4trace:configure.ac:50: -1- AM_CONDITIONAL([AMDEP], [test "x$enable_dependency_tracking" != xno]) -m4trace:configure.ac:50: -1- m4_pattern_allow([^AMDEP_TRUE$]) -m4trace:configure.ac:50: -1- m4_pattern_allow([^AMDEP_FALSE$]) -m4trace:configure.ac:50: -1- _AM_SUBST_NOTMAKE([AMDEP_TRUE]) -m4trace:configure.ac:50: -1- _AM_SUBST_NOTMAKE([AMDEP_FALSE]) -m4trace:configure.ac:50: -1- m4_pattern_allow([^AMDEPBACKSLASH$]) -m4trace:configure.ac:50: -1- _AM_SUBST_NOTMAKE([AMDEPBACKSLASH]) -m4trace:configure.ac:50: -1- m4_pattern_allow([^am__nodep$]) -m4trace:configure.ac:50: -1- _AM_SUBST_NOTMAKE([am__nodep]) -m4trace:configure.ac:50: -1- m4_pattern_allow([^CCDEPMODE$]) -m4trace:configure.ac:50: -1- AM_CONDITIONAL([am__fastdepCC], [ - test "x$enable_dependency_tracking" != xno \ - && test "$am_cv_CC_dependencies_compiler_type" = gcc3]) -m4trace:configure.ac:50: -1- m4_pattern_allow([^am__fastdepCC_TRUE$]) -m4trace:configure.ac:50: -1- m4_pattern_allow([^am__fastdepCC_FALSE$]) -m4trace:configure.ac:50: -1- _AM_SUBST_NOTMAKE([am__fastdepCC_TRUE]) -m4trace:configure.ac:50: -1- _AM_SUBST_NOTMAKE([am__fastdepCC_FALSE]) -m4trace:configure.ac:51: -1- AM_PROG_CC_C_O -m4trace:configure.ac:51: -1- m4_pattern_allow([^NO_MINUS_C_MINUS_O$]) -m4trace:configure.ac:52: -1- m4_pattern_allow([^CXX$]) -m4trace:configure.ac:52: -1- m4_pattern_allow([^CXXFLAGS$]) -m4trace:configure.ac:52: -1- m4_pattern_allow([^LDFLAGS$]) -m4trace:configure.ac:52: -1- m4_pattern_allow([^LIBS$]) -m4trace:configure.ac:52: -1- m4_pattern_allow([^CPPFLAGS$]) -m4trace:configure.ac:52: -1- m4_pattern_allow([^CXX$]) -m4trace:configure.ac:52: -1- m4_pattern_allow([^ac_ct_CXX$]) -m4trace:configure.ac:52: -1- _AM_DEPENDENCIES([CXX]) -m4trace:configure.ac:52: -1- m4_pattern_allow([^CXXDEPMODE$]) -m4trace:configure.ac:52: -1- AM_CONDITIONAL([am__fastdepCXX], [ - test "x$enable_dependency_tracking" != xno \ - && test "$am_cv_CXX_dependencies_compiler_type" = gcc3]) -m4trace:configure.ac:52: -1- m4_pattern_allow([^am__fastdepCXX_TRUE$]) -m4trace:configure.ac:52: -1- m4_pattern_allow([^am__fastdepCXX_FALSE$]) -m4trace:configure.ac:52: -1- _AM_SUBST_NOTMAKE([am__fastdepCXX_TRUE]) -m4trace:configure.ac:52: -1- _AM_SUBST_NOTMAKE([am__fastdepCXX_FALSE]) -m4trace:configure.ac:54: -1- m4_pattern_allow([^LN_S$]) -m4trace:configure.ac:106: -1- AM_CONDITIONAL([WANT_SYNCAPI], [test "x$with_syncapi" != xno]) -m4trace:configure.ac:106: -1- m4_pattern_allow([^WANT_SYNCAPI_TRUE$]) -m4trace:configure.ac:106: -1- m4_pattern_allow([^WANT_SYNCAPI_FALSE$]) -m4trace:configure.ac:106: -1- _AM_SUBST_NOTMAKE([WANT_SYNCAPI_TRUE]) -m4trace:configure.ac:106: -1- _AM_SUBST_NOTMAKE([WANT_SYNCAPI_FALSE]) -m4trace:configure.ac:109: -1- m4_pattern_allow([^CPP$]) -m4trace:configure.ac:109: -1- m4_pattern_allow([^CPPFLAGS$]) -m4trace:configure.ac:109: -1- m4_pattern_allow([^CPP$]) -m4trace:configure.ac:109: -1- m4_pattern_allow([^GREP$]) -m4trace:configure.ac:109: -1- m4_pattern_allow([^EGREP$]) -m4trace:configure.ac:109: -1- m4_pattern_allow([^STDC_HEADERS$]) -m4trace:configure.ac:113: -1- m4_pattern_allow([^const$]) -m4trace:configure.ac:115: -1- m4_pattern_allow([^TIME_WITH_SYS_TIME$]) -m4trace:configure.ac:116: -1- m4_pattern_allow([^POLL_NFDS_TYPE$]) -m4trace:configure.ac:116: -1- m4_pattern_allow([^POLL_NFDS_TYPE$]) -m4trace:configure.ac:123: -1- _m4_warn([obsolete], [The macro `AC_TRY_RUN' is obsolete. -You should run autoupdate.], [../../lib/autoconf/general.m4:2764: AC_TRY_RUN is expanded from... -configure.ac:123: the top level]) -m4trace:configure.ac:142: -1- m4_pattern_allow([^USEIPV6$]) -m4trace:configure.ac:149: -1- m4_pattern_allow([^LIB@&t@OBJS$]) -m4trace:configure.ac:149: -1- m4_pattern_allow([^LTLIBOBJS$]) -m4trace:configure.ac:149: -1- AM_CONDITIONAL([am__EXEEXT], [test -n "$EXEEXT"]) -m4trace:configure.ac:149: -1- m4_pattern_allow([^am__EXEEXT_TRUE$]) -m4trace:configure.ac:149: -1- m4_pattern_allow([^am__EXEEXT_FALSE$]) -m4trace:configure.ac:149: -1- _AM_SUBST_NOTMAKE([am__EXEEXT_TRUE]) -m4trace:configure.ac:149: -1- _AM_SUBST_NOTMAKE([am__EXEEXT_FALSE]) -m4trace:configure.ac:149: -1- _AC_AM_CONFIG_HEADER_HOOK(["$ac_file"]) -m4trace:configure.ac:149: -1- _AM_OUTPUT_DEPENDENCY_COMMANDS diff --git a/pkg/registry/zookeeper-3.4.6/src/c/autom4te.cache/traces.1 b/pkg/registry/zookeeper-3.4.6/src/c/autom4te.cache/traces.1 deleted file mode 100644 index 95df0a39f..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/c/autom4te.cache/traces.1 +++ /dev/null @@ -1,1138 +0,0 @@ -m4trace:aclocal.m4:9706: -1- m4_include([acinclude.m4]) -m4trace:configure.ac:6: -1- AC_INIT([zookeeper C client], [3.4.6], [user@zookeeper.apache.org], [zookeeper]) -m4trace:configure.ac:6: -1- m4_pattern_forbid([^_?A[CHUM]_]) -m4trace:configure.ac:6: -1- m4_pattern_forbid([_AC_]) -m4trace:configure.ac:6: -1- m4_pattern_forbid([^LIBOBJS$], [do not use LIBOBJS directly, use AC_LIBOBJ (see section `AC_LIBOBJ vs LIBOBJS']) -m4trace:configure.ac:6: -1- m4_pattern_allow([^AS_FLAGS$]) -m4trace:configure.ac:6: -1- m4_pattern_forbid([^_?m4_]) -m4trace:configure.ac:6: -1- m4_pattern_forbid([^dnl$]) -m4trace:configure.ac:6: -1- m4_pattern_forbid([^_?AS_]) -m4trace:configure.ac:6: -1- AC_SUBST([SHELL]) -m4trace:configure.ac:6: -1- AC_SUBST_TRACE([SHELL]) -m4trace:configure.ac:6: -1- m4_pattern_allow([^SHELL$]) -m4trace:configure.ac:6: -1- AC_SUBST([PATH_SEPARATOR]) -m4trace:configure.ac:6: -1- AC_SUBST_TRACE([PATH_SEPARATOR]) -m4trace:configure.ac:6: -1- m4_pattern_allow([^PATH_SEPARATOR$]) -m4trace:configure.ac:6: -1- AC_SUBST([PACKAGE_NAME], [m4_ifdef([AC_PACKAGE_NAME], ['AC_PACKAGE_NAME'])]) -m4trace:configure.ac:6: -1- AC_SUBST_TRACE([PACKAGE_NAME]) -m4trace:configure.ac:6: -1- m4_pattern_allow([^PACKAGE_NAME$]) -m4trace:configure.ac:6: -1- AC_SUBST([PACKAGE_TARNAME], [m4_ifdef([AC_PACKAGE_TARNAME], ['AC_PACKAGE_TARNAME'])]) -m4trace:configure.ac:6: -1- AC_SUBST_TRACE([PACKAGE_TARNAME]) -m4trace:configure.ac:6: -1- m4_pattern_allow([^PACKAGE_TARNAME$]) -m4trace:configure.ac:6: -1- AC_SUBST([PACKAGE_VERSION], [m4_ifdef([AC_PACKAGE_VERSION], ['AC_PACKAGE_VERSION'])]) -m4trace:configure.ac:6: -1- AC_SUBST_TRACE([PACKAGE_VERSION]) -m4trace:configure.ac:6: -1- m4_pattern_allow([^PACKAGE_VERSION$]) -m4trace:configure.ac:6: -1- AC_SUBST([PACKAGE_STRING], [m4_ifdef([AC_PACKAGE_STRING], ['AC_PACKAGE_STRING'])]) -m4trace:configure.ac:6: -1- AC_SUBST_TRACE([PACKAGE_STRING]) -m4trace:configure.ac:6: -1- m4_pattern_allow([^PACKAGE_STRING$]) -m4trace:configure.ac:6: -1- AC_SUBST([PACKAGE_BUGREPORT], [m4_ifdef([AC_PACKAGE_BUGREPORT], ['AC_PACKAGE_BUGREPORT'])]) -m4trace:configure.ac:6: -1- AC_SUBST_TRACE([PACKAGE_BUGREPORT]) -m4trace:configure.ac:6: -1- m4_pattern_allow([^PACKAGE_BUGREPORT$]) -m4trace:configure.ac:6: -1- AC_SUBST([PACKAGE_URL], [m4_ifdef([AC_PACKAGE_URL], ['AC_PACKAGE_URL'])]) -m4trace:configure.ac:6: -1- AC_SUBST_TRACE([PACKAGE_URL]) -m4trace:configure.ac:6: -1- m4_pattern_allow([^PACKAGE_URL$]) -m4trace:configure.ac:6: -1- AC_SUBST([exec_prefix], [NONE]) -m4trace:configure.ac:6: -1- AC_SUBST_TRACE([exec_prefix]) -m4trace:configure.ac:6: -1- m4_pattern_allow([^exec_prefix$]) -m4trace:configure.ac:6: -1- AC_SUBST([prefix], [NONE]) -m4trace:configure.ac:6: -1- AC_SUBST_TRACE([prefix]) -m4trace:configure.ac:6: -1- m4_pattern_allow([^prefix$]) -m4trace:configure.ac:6: -1- AC_SUBST([program_transform_name], [s,x,x,]) -m4trace:configure.ac:6: -1- AC_SUBST_TRACE([program_transform_name]) -m4trace:configure.ac:6: -1- m4_pattern_allow([^program_transform_name$]) -m4trace:configure.ac:6: -1- AC_SUBST([bindir], ['${exec_prefix}/bin']) -m4trace:configure.ac:6: -1- AC_SUBST_TRACE([bindir]) -m4trace:configure.ac:6: -1- m4_pattern_allow([^bindir$]) -m4trace:configure.ac:6: -1- AC_SUBST([sbindir], ['${exec_prefix}/sbin']) -m4trace:configure.ac:6: -1- AC_SUBST_TRACE([sbindir]) -m4trace:configure.ac:6: -1- m4_pattern_allow([^sbindir$]) -m4trace:configure.ac:6: -1- AC_SUBST([libexecdir], ['${exec_prefix}/libexec']) -m4trace:configure.ac:6: -1- AC_SUBST_TRACE([libexecdir]) -m4trace:configure.ac:6: -1- m4_pattern_allow([^libexecdir$]) -m4trace:configure.ac:6: -1- AC_SUBST([datarootdir], ['${prefix}/share']) -m4trace:configure.ac:6: -1- AC_SUBST_TRACE([datarootdir]) -m4trace:configure.ac:6: -1- m4_pattern_allow([^datarootdir$]) -m4trace:configure.ac:6: -1- AC_SUBST([datadir], ['${datarootdir}']) -m4trace:configure.ac:6: -1- AC_SUBST_TRACE([datadir]) -m4trace:configure.ac:6: -1- m4_pattern_allow([^datadir$]) -m4trace:configure.ac:6: -1- AC_SUBST([sysconfdir], ['${prefix}/etc']) -m4trace:configure.ac:6: -1- AC_SUBST_TRACE([sysconfdir]) -m4trace:configure.ac:6: -1- m4_pattern_allow([^sysconfdir$]) -m4trace:configure.ac:6: -1- AC_SUBST([sharedstatedir], ['${prefix}/com']) -m4trace:configure.ac:6: -1- AC_SUBST_TRACE([sharedstatedir]) -m4trace:configure.ac:6: -1- m4_pattern_allow([^sharedstatedir$]) -m4trace:configure.ac:6: -1- AC_SUBST([localstatedir], ['${prefix}/var']) -m4trace:configure.ac:6: -1- AC_SUBST_TRACE([localstatedir]) -m4trace:configure.ac:6: -1- m4_pattern_allow([^localstatedir$]) -m4trace:configure.ac:6: -1- AC_SUBST([includedir], ['${prefix}/include']) -m4trace:configure.ac:6: -1- AC_SUBST_TRACE([includedir]) -m4trace:configure.ac:6: -1- m4_pattern_allow([^includedir$]) -m4trace:configure.ac:6: -1- AC_SUBST([oldincludedir], ['/usr/include']) -m4trace:configure.ac:6: -1- AC_SUBST_TRACE([oldincludedir]) -m4trace:configure.ac:6: -1- m4_pattern_allow([^oldincludedir$]) -m4trace:configure.ac:6: -1- AC_SUBST([docdir], [m4_ifset([AC_PACKAGE_TARNAME], - ['${datarootdir}/doc/${PACKAGE_TARNAME}'], - ['${datarootdir}/doc/${PACKAGE}'])]) -m4trace:configure.ac:6: -1- AC_SUBST_TRACE([docdir]) -m4trace:configure.ac:6: -1- m4_pattern_allow([^docdir$]) -m4trace:configure.ac:6: -1- AC_SUBST([infodir], ['${datarootdir}/info']) -m4trace:configure.ac:6: -1- AC_SUBST_TRACE([infodir]) -m4trace:configure.ac:6: -1- m4_pattern_allow([^infodir$]) -m4trace:configure.ac:6: -1- AC_SUBST([htmldir], ['${docdir}']) -m4trace:configure.ac:6: -1- AC_SUBST_TRACE([htmldir]) -m4trace:configure.ac:6: -1- m4_pattern_allow([^htmldir$]) -m4trace:configure.ac:6: -1- AC_SUBST([dvidir], ['${docdir}']) -m4trace:configure.ac:6: -1- AC_SUBST_TRACE([dvidir]) -m4trace:configure.ac:6: -1- m4_pattern_allow([^dvidir$]) -m4trace:configure.ac:6: -1- AC_SUBST([pdfdir], ['${docdir}']) -m4trace:configure.ac:6: -1- AC_SUBST_TRACE([pdfdir]) -m4trace:configure.ac:6: -1- m4_pattern_allow([^pdfdir$]) -m4trace:configure.ac:6: -1- AC_SUBST([psdir], ['${docdir}']) -m4trace:configure.ac:6: -1- AC_SUBST_TRACE([psdir]) -m4trace:configure.ac:6: -1- m4_pattern_allow([^psdir$]) -m4trace:configure.ac:6: -1- AC_SUBST([libdir], ['${exec_prefix}/lib']) -m4trace:configure.ac:6: -1- AC_SUBST_TRACE([libdir]) -m4trace:configure.ac:6: -1- m4_pattern_allow([^libdir$]) -m4trace:configure.ac:6: -1- AC_SUBST([localedir], ['${datarootdir}/locale']) -m4trace:configure.ac:6: -1- AC_SUBST_TRACE([localedir]) -m4trace:configure.ac:6: -1- m4_pattern_allow([^localedir$]) -m4trace:configure.ac:6: -1- AC_SUBST([mandir], ['${datarootdir}/man']) -m4trace:configure.ac:6: -1- AC_SUBST_TRACE([mandir]) -m4trace:configure.ac:6: -1- m4_pattern_allow([^mandir$]) -m4trace:configure.ac:6: -1- AC_DEFINE_TRACE_LITERAL([PACKAGE_NAME]) -m4trace:configure.ac:6: -1- m4_pattern_allow([^PACKAGE_NAME$]) -m4trace:configure.ac:6: -1- AH_OUTPUT([PACKAGE_NAME], [/* Define to the full name of this package. */ -@%:@undef PACKAGE_NAME]) -m4trace:configure.ac:6: -1- AC_DEFINE_TRACE_LITERAL([PACKAGE_TARNAME]) -m4trace:configure.ac:6: -1- m4_pattern_allow([^PACKAGE_TARNAME$]) -m4trace:configure.ac:6: -1- AH_OUTPUT([PACKAGE_TARNAME], [/* Define to the one symbol short name of this package. */ -@%:@undef PACKAGE_TARNAME]) -m4trace:configure.ac:6: -1- AC_DEFINE_TRACE_LITERAL([PACKAGE_VERSION]) -m4trace:configure.ac:6: -1- m4_pattern_allow([^PACKAGE_VERSION$]) -m4trace:configure.ac:6: -1- AH_OUTPUT([PACKAGE_VERSION], [/* Define to the version of this package. */ -@%:@undef PACKAGE_VERSION]) -m4trace:configure.ac:6: -1- AC_DEFINE_TRACE_LITERAL([PACKAGE_STRING]) -m4trace:configure.ac:6: -1- m4_pattern_allow([^PACKAGE_STRING$]) -m4trace:configure.ac:6: -1- AH_OUTPUT([PACKAGE_STRING], [/* Define to the full name and version of this package. */ -@%:@undef PACKAGE_STRING]) -m4trace:configure.ac:6: -1- AC_DEFINE_TRACE_LITERAL([PACKAGE_BUGREPORT]) -m4trace:configure.ac:6: -1- m4_pattern_allow([^PACKAGE_BUGREPORT$]) -m4trace:configure.ac:6: -1- AH_OUTPUT([PACKAGE_BUGREPORT], [/* Define to the address where bug reports for this package should be sent. */ -@%:@undef PACKAGE_BUGREPORT]) -m4trace:configure.ac:6: -1- AC_DEFINE_TRACE_LITERAL([PACKAGE_URL]) -m4trace:configure.ac:6: -1- m4_pattern_allow([^PACKAGE_URL$]) -m4trace:configure.ac:6: -1- AH_OUTPUT([PACKAGE_URL], [/* Define to the home page for this package. */ -@%:@undef PACKAGE_URL]) -m4trace:configure.ac:6: -1- AC_SUBST([DEFS]) -m4trace:configure.ac:6: -1- AC_SUBST_TRACE([DEFS]) -m4trace:configure.ac:6: -1- m4_pattern_allow([^DEFS$]) -m4trace:configure.ac:6: -1- AC_SUBST([ECHO_C]) -m4trace:configure.ac:6: -1- AC_SUBST_TRACE([ECHO_C]) -m4trace:configure.ac:6: -1- m4_pattern_allow([^ECHO_C$]) -m4trace:configure.ac:6: -1- AC_SUBST([ECHO_N]) -m4trace:configure.ac:6: -1- AC_SUBST_TRACE([ECHO_N]) -m4trace:configure.ac:6: -1- m4_pattern_allow([^ECHO_N$]) -m4trace:configure.ac:6: -1- AC_SUBST([ECHO_T]) -m4trace:configure.ac:6: -1- AC_SUBST_TRACE([ECHO_T]) -m4trace:configure.ac:6: -1- m4_pattern_allow([^ECHO_T$]) -m4trace:configure.ac:6: -1- AC_SUBST([LIBS]) -m4trace:configure.ac:6: -1- AC_SUBST_TRACE([LIBS]) -m4trace:configure.ac:6: -1- m4_pattern_allow([^LIBS$]) -m4trace:configure.ac:6: -1- AC_SUBST([build_alias]) -m4trace:configure.ac:6: -1- AC_SUBST_TRACE([build_alias]) -m4trace:configure.ac:6: -1- m4_pattern_allow([^build_alias$]) -m4trace:configure.ac:6: -1- AC_SUBST([host_alias]) -m4trace:configure.ac:6: -1- AC_SUBST_TRACE([host_alias]) -m4trace:configure.ac:6: -1- m4_pattern_allow([^host_alias$]) -m4trace:configure.ac:6: -1- AC_SUBST([target_alias]) -m4trace:configure.ac:6: -1- AC_SUBST_TRACE([target_alias]) -m4trace:configure.ac:6: -1- m4_pattern_allow([^target_alias$]) -m4trace:configure.ac:22: -1- AC_SUBST([DX_PROJECT], [zookeeper]) -m4trace:configure.ac:22: -1- AC_SUBST_TRACE([DX_PROJECT]) -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_PROJECT$]) -m4trace:configure.ac:22: -1- AC_SUBST([DX_CONFIG], [ifelse([c-doc.Doxyfile], [], Doxyfile, [c-doc.Doxyfile])]) -m4trace:configure.ac:22: -1- AC_SUBST_TRACE([DX_CONFIG]) -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_CONFIG$]) -m4trace:configure.ac:22: -1- AC_SUBST([DX_DOCDIR], [ifelse([docs], [], doxygen-doc, [docs])]) -m4trace:configure.ac:22: -1- AC_SUBST_TRACE([DX_DOCDIR]) -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_DOCDIR$]) -m4trace:configure.ac:22: -1- AC_SUBST([DX_ENV], ["$DX_ENV SRCDIR='$srcdir'"]) -m4trace:configure.ac:22: -1- AC_SUBST_TRACE([DX_ENV]) -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_ENV$]) -m4trace:configure.ac:22: -1- AC_SUBST([DX_ENV], ["$DX_ENV PROJECT='$DX_PROJECT'"]) -m4trace:configure.ac:22: -1- AC_SUBST_TRACE([DX_ENV]) -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_ENV$]) -m4trace:configure.ac:22: -1- AC_SUBST([DX_ENV], ["$DX_ENV DOCDIR='$DX_DOCDIR'"]) -m4trace:configure.ac:22: -1- AC_SUBST_TRACE([DX_ENV]) -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_ENV$]) -m4trace:configure.ac:22: -1- AC_SUBST([DX_ENV], ["$DX_ENV VERSION='$PACKAGE_VERSION'"]) -m4trace:configure.ac:22: -1- AC_SUBST_TRACE([DX_ENV]) -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_ENV$]) -m4trace:configure.ac:22: -1- AC_SUBST([DX_FLAG_doc], [1]) -m4trace:configure.ac:22: -1- AC_SUBST_TRACE([DX_FLAG_doc]) -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_FLAG_doc$]) -m4trace:configure.ac:22: -1- AC_SUBST([DX_FLAG_doc], [0]) -m4trace:configure.ac:22: -1- AC_SUBST_TRACE([DX_FLAG_doc]) -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_FLAG_doc$]) -m4trace:configure.ac:22: -1- AC_SUBST([DX_FLAG_doc], [DX_IF_FEATURE([doc], 1, 0)]) -m4trace:configure.ac:22: -1- AC_SUBST_TRACE([DX_FLAG_doc]) -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_FLAG_doc$]) -m4trace:configure.ac:22: -1- AC_SUBST([DX_DOXYGEN]) -m4trace:configure.ac:22: -1- AC_SUBST_TRACE([DX_DOXYGEN]) -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_DOXYGEN$]) -m4trace:configure.ac:22: -1- AC_SUBST([DX_FLAG_doc], [0]) -m4trace:configure.ac:22: -1- AC_SUBST_TRACE([DX_FLAG_doc]) -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_FLAG_doc$]) -m4trace:configure.ac:22: -1- AC_SUBST([DX_PERL]) -m4trace:configure.ac:22: -1- AC_SUBST_TRACE([DX_PERL]) -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_PERL$]) -m4trace:configure.ac:22: -1- AC_SUBST([DX_FLAG_doc], [0]) -m4trace:configure.ac:22: -1- AC_SUBST_TRACE([DX_FLAG_doc]) -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_FLAG_doc$]) -m4trace:configure.ac:22: -1- AM_CONDITIONAL([DX_COND_doc], [:]) -m4trace:configure.ac:22: -1- AC_SUBST([DX_COND_doc_TRUE]) -m4trace:configure.ac:22: -1- AC_SUBST_TRACE([DX_COND_doc_TRUE]) -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_COND_doc_TRUE$]) -m4trace:configure.ac:22: -1- AC_SUBST([DX_COND_doc_FALSE]) -m4trace:configure.ac:22: -1- AC_SUBST_TRACE([DX_COND_doc_FALSE]) -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_COND_doc_FALSE$]) -m4trace:configure.ac:22: -1- _AM_SUBST_NOTMAKE([DX_COND_doc_TRUE]) -m4trace:configure.ac:22: -1- _AM_SUBST_NOTMAKE([DX_COND_doc_FALSE]) -m4trace:configure.ac:22: -1- AC_SUBST([DX_ENV], ["$DX_ENV PERL_PATH='$DX_PERL'"]) -m4trace:configure.ac:22: -1- AC_SUBST_TRACE([DX_ENV]) -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_ENV$]) -m4trace:configure.ac:22: -1- AM_CONDITIONAL([DX_COND_doc], [false]) -m4trace:configure.ac:22: -1- AC_SUBST([DX_COND_doc_TRUE]) -m4trace:configure.ac:22: -1- AC_SUBST_TRACE([DX_COND_doc_TRUE]) -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_COND_doc_TRUE$]) -m4trace:configure.ac:22: -1- AC_SUBST([DX_COND_doc_FALSE]) -m4trace:configure.ac:22: -1- AC_SUBST_TRACE([DX_COND_doc_FALSE]) -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_COND_doc_FALSE$]) -m4trace:configure.ac:22: -1- _AM_SUBST_NOTMAKE([DX_COND_doc_TRUE]) -m4trace:configure.ac:22: -1- _AM_SUBST_NOTMAKE([DX_COND_doc_FALSE]) -m4trace:configure.ac:22: -1- AC_SUBST([DX_FLAG_dot], [1]) -m4trace:configure.ac:22: -1- AC_SUBST_TRACE([DX_FLAG_dot]) -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_FLAG_dot$]) -m4trace:configure.ac:22: -1- AC_SUBST([DX_FLAG_dot], [0]) -m4trace:configure.ac:22: -1- AC_SUBST_TRACE([DX_FLAG_dot]) -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_FLAG_dot$]) -m4trace:configure.ac:22: -1- AC_SUBST([DX_FLAG_dot], [DX_IF_FEATURE([dot], 1, 0)]) -m4trace:configure.ac:22: -1- AC_SUBST_TRACE([DX_FLAG_dot]) -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_FLAG_dot$]) -m4trace:configure.ac:22: -1- AC_SUBST([DX_FLAG_dot], [0]) -m4trace:configure.ac:22: -1- AC_SUBST_TRACE([DX_FLAG_dot]) -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_FLAG_dot$]) -m4trace:configure.ac:22: -1- AC_SUBST([DX_DOT]) -m4trace:configure.ac:22: -1- AC_SUBST_TRACE([DX_DOT]) -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_DOT$]) -m4trace:configure.ac:22: -1- AC_SUBST([DX_FLAG_dot], [0]) -m4trace:configure.ac:22: -1- AC_SUBST_TRACE([DX_FLAG_dot]) -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_FLAG_dot$]) -m4trace:configure.ac:22: -1- AM_CONDITIONAL([DX_COND_dot], [:]) -m4trace:configure.ac:22: -1- AC_SUBST([DX_COND_dot_TRUE]) -m4trace:configure.ac:22: -1- AC_SUBST_TRACE([DX_COND_dot_TRUE]) -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_COND_dot_TRUE$]) -m4trace:configure.ac:22: -1- AC_SUBST([DX_COND_dot_FALSE]) -m4trace:configure.ac:22: -1- AC_SUBST_TRACE([DX_COND_dot_FALSE]) -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_COND_dot_FALSE$]) -m4trace:configure.ac:22: -1- _AM_SUBST_NOTMAKE([DX_COND_dot_TRUE]) -m4trace:configure.ac:22: -1- _AM_SUBST_NOTMAKE([DX_COND_dot_FALSE]) -m4trace:configure.ac:22: -1- AC_SUBST([DX_ENV], ["$DX_ENV HAVE_DOT='YES'"]) -m4trace:configure.ac:22: -1- AC_SUBST_TRACE([DX_ENV]) -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_ENV$]) -m4trace:configure.ac:22: -1- AC_SUBST([DX_ENV], ["$DX_ENV DOT_PATH='`DX_DIRNAME_EXPR($DX_DOT)`'"]) -m4trace:configure.ac:22: -1- AC_SUBST_TRACE([DX_ENV]) -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_ENV$]) -m4trace:configure.ac:22: -1- AM_CONDITIONAL([DX_COND_dot], [false]) -m4trace:configure.ac:22: -1- AC_SUBST([DX_COND_dot_TRUE]) -m4trace:configure.ac:22: -1- AC_SUBST_TRACE([DX_COND_dot_TRUE]) -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_COND_dot_TRUE$]) -m4trace:configure.ac:22: -1- AC_SUBST([DX_COND_dot_FALSE]) -m4trace:configure.ac:22: -1- AC_SUBST_TRACE([DX_COND_dot_FALSE]) -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_COND_dot_FALSE$]) -m4trace:configure.ac:22: -1- _AM_SUBST_NOTMAKE([DX_COND_dot_TRUE]) -m4trace:configure.ac:22: -1- _AM_SUBST_NOTMAKE([DX_COND_dot_FALSE]) -m4trace:configure.ac:22: -1- AC_SUBST([DX_ENV], ["$DX_ENV HAVE_DOT='NO'"]) -m4trace:configure.ac:22: -1- AC_SUBST_TRACE([DX_ENV]) -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_ENV$]) -m4trace:configure.ac:22: -1- AC_SUBST([DX_FLAG_man], [1]) -m4trace:configure.ac:22: -1- AC_SUBST_TRACE([DX_FLAG_man]) -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_FLAG_man$]) -m4trace:configure.ac:22: -1- AC_SUBST([DX_FLAG_man], [0]) -m4trace:configure.ac:22: -1- AC_SUBST_TRACE([DX_FLAG_man]) -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_FLAG_man$]) -m4trace:configure.ac:22: -1- AC_SUBST([DX_FLAG_man], [DX_IF_FEATURE([man], 1, 0)]) -m4trace:configure.ac:22: -1- AC_SUBST_TRACE([DX_FLAG_man]) -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_FLAG_man$]) -m4trace:configure.ac:22: -1- AC_SUBST([DX_FLAG_man], [0]) -m4trace:configure.ac:22: -1- AC_SUBST_TRACE([DX_FLAG_man]) -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_FLAG_man$]) -m4trace:configure.ac:22: -1- AM_CONDITIONAL([DX_COND_man], [:]) -m4trace:configure.ac:22: -1- AC_SUBST([DX_COND_man_TRUE]) -m4trace:configure.ac:22: -1- AC_SUBST_TRACE([DX_COND_man_TRUE]) -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_COND_man_TRUE$]) -m4trace:configure.ac:22: -1- AC_SUBST([DX_COND_man_FALSE]) -m4trace:configure.ac:22: -1- AC_SUBST_TRACE([DX_COND_man_FALSE]) -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_COND_man_FALSE$]) -m4trace:configure.ac:22: -1- _AM_SUBST_NOTMAKE([DX_COND_man_TRUE]) -m4trace:configure.ac:22: -1- _AM_SUBST_NOTMAKE([DX_COND_man_FALSE]) -m4trace:configure.ac:22: -1- AC_SUBST([DX_ENV], ["$DX_ENV GENERATE_MAN='YES'"]) -m4trace:configure.ac:22: -1- AC_SUBST_TRACE([DX_ENV]) -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_ENV$]) -m4trace:configure.ac:22: -1- AM_CONDITIONAL([DX_COND_man], [false]) -m4trace:configure.ac:22: -1- AC_SUBST([DX_COND_man_TRUE]) -m4trace:configure.ac:22: -1- AC_SUBST_TRACE([DX_COND_man_TRUE]) -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_COND_man_TRUE$]) -m4trace:configure.ac:22: -1- AC_SUBST([DX_COND_man_FALSE]) -m4trace:configure.ac:22: -1- AC_SUBST_TRACE([DX_COND_man_FALSE]) -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_COND_man_FALSE$]) -m4trace:configure.ac:22: -1- _AM_SUBST_NOTMAKE([DX_COND_man_TRUE]) -m4trace:configure.ac:22: -1- _AM_SUBST_NOTMAKE([DX_COND_man_FALSE]) -m4trace:configure.ac:22: -1- AC_SUBST([DX_ENV], ["$DX_ENV GENERATE_MAN='NO'"]) -m4trace:configure.ac:22: -1- AC_SUBST_TRACE([DX_ENV]) -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_ENV$]) -m4trace:configure.ac:22: -1- AC_SUBST([DX_FLAG_rtf], [1]) -m4trace:configure.ac:22: -1- AC_SUBST_TRACE([DX_FLAG_rtf]) -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_FLAG_rtf$]) -m4trace:configure.ac:22: -1- AC_SUBST([DX_FLAG_rtf], [0]) -m4trace:configure.ac:22: -1- AC_SUBST_TRACE([DX_FLAG_rtf]) -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_FLAG_rtf$]) -m4trace:configure.ac:22: -1- AC_SUBST([DX_FLAG_rtf], [DX_IF_FEATURE([rtf], 1, 0)]) -m4trace:configure.ac:22: -1- AC_SUBST_TRACE([DX_FLAG_rtf]) -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_FLAG_rtf$]) -m4trace:configure.ac:22: -1- AC_SUBST([DX_FLAG_rtf], [0]) -m4trace:configure.ac:22: -1- AC_SUBST_TRACE([DX_FLAG_rtf]) -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_FLAG_rtf$]) -m4trace:configure.ac:22: -1- AM_CONDITIONAL([DX_COND_rtf], [:]) -m4trace:configure.ac:22: -1- AC_SUBST([DX_COND_rtf_TRUE]) -m4trace:configure.ac:22: -1- AC_SUBST_TRACE([DX_COND_rtf_TRUE]) -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_COND_rtf_TRUE$]) -m4trace:configure.ac:22: -1- AC_SUBST([DX_COND_rtf_FALSE]) -m4trace:configure.ac:22: -1- AC_SUBST_TRACE([DX_COND_rtf_FALSE]) -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_COND_rtf_FALSE$]) -m4trace:configure.ac:22: -1- _AM_SUBST_NOTMAKE([DX_COND_rtf_TRUE]) -m4trace:configure.ac:22: -1- _AM_SUBST_NOTMAKE([DX_COND_rtf_FALSE]) -m4trace:configure.ac:22: -1- AC_SUBST([DX_ENV], ["$DX_ENV GENERATE_RTF='YES'"]) -m4trace:configure.ac:22: -1- AC_SUBST_TRACE([DX_ENV]) -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_ENV$]) -m4trace:configure.ac:22: -1- AM_CONDITIONAL([DX_COND_rtf], [false]) -m4trace:configure.ac:22: -1- AC_SUBST([DX_COND_rtf_TRUE]) -m4trace:configure.ac:22: -1- AC_SUBST_TRACE([DX_COND_rtf_TRUE]) -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_COND_rtf_TRUE$]) -m4trace:configure.ac:22: -1- AC_SUBST([DX_COND_rtf_FALSE]) -m4trace:configure.ac:22: -1- AC_SUBST_TRACE([DX_COND_rtf_FALSE]) -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_COND_rtf_FALSE$]) -m4trace:configure.ac:22: -1- _AM_SUBST_NOTMAKE([DX_COND_rtf_TRUE]) -m4trace:configure.ac:22: -1- _AM_SUBST_NOTMAKE([DX_COND_rtf_FALSE]) -m4trace:configure.ac:22: -1- AC_SUBST([DX_ENV], ["$DX_ENV GENERATE_RTF='NO'"]) -m4trace:configure.ac:22: -1- AC_SUBST_TRACE([DX_ENV]) -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_ENV$]) -m4trace:configure.ac:22: -1- AC_SUBST([DX_FLAG_xml], [1]) -m4trace:configure.ac:22: -1- AC_SUBST_TRACE([DX_FLAG_xml]) -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_FLAG_xml$]) -m4trace:configure.ac:22: -1- AC_SUBST([DX_FLAG_xml], [0]) -m4trace:configure.ac:22: -1- AC_SUBST_TRACE([DX_FLAG_xml]) -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_FLAG_xml$]) -m4trace:configure.ac:22: -1- AC_SUBST([DX_FLAG_xml], [DX_IF_FEATURE([xml], 1, 0)]) -m4trace:configure.ac:22: -1- AC_SUBST_TRACE([DX_FLAG_xml]) -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_FLAG_xml$]) -m4trace:configure.ac:22: -1- AC_SUBST([DX_FLAG_xml], [0]) -m4trace:configure.ac:22: -1- AC_SUBST_TRACE([DX_FLAG_xml]) -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_FLAG_xml$]) -m4trace:configure.ac:22: -1- AM_CONDITIONAL([DX_COND_xml], [:]) -m4trace:configure.ac:22: -1- AC_SUBST([DX_COND_xml_TRUE]) -m4trace:configure.ac:22: -1- AC_SUBST_TRACE([DX_COND_xml_TRUE]) -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_COND_xml_TRUE$]) -m4trace:configure.ac:22: -1- AC_SUBST([DX_COND_xml_FALSE]) -m4trace:configure.ac:22: -1- AC_SUBST_TRACE([DX_COND_xml_FALSE]) -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_COND_xml_FALSE$]) -m4trace:configure.ac:22: -1- _AM_SUBST_NOTMAKE([DX_COND_xml_TRUE]) -m4trace:configure.ac:22: -1- _AM_SUBST_NOTMAKE([DX_COND_xml_FALSE]) -m4trace:configure.ac:22: -1- AC_SUBST([DX_ENV], ["$DX_ENV GENERATE_XML='YES'"]) -m4trace:configure.ac:22: -1- AC_SUBST_TRACE([DX_ENV]) -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_ENV$]) -m4trace:configure.ac:22: -1- AM_CONDITIONAL([DX_COND_xml], [false]) -m4trace:configure.ac:22: -1- AC_SUBST([DX_COND_xml_TRUE]) -m4trace:configure.ac:22: -1- AC_SUBST_TRACE([DX_COND_xml_TRUE]) -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_COND_xml_TRUE$]) -m4trace:configure.ac:22: -1- AC_SUBST([DX_COND_xml_FALSE]) -m4trace:configure.ac:22: -1- AC_SUBST_TRACE([DX_COND_xml_FALSE]) -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_COND_xml_FALSE$]) -m4trace:configure.ac:22: -1- _AM_SUBST_NOTMAKE([DX_COND_xml_TRUE]) -m4trace:configure.ac:22: -1- _AM_SUBST_NOTMAKE([DX_COND_xml_FALSE]) -m4trace:configure.ac:22: -1- AC_SUBST([DX_ENV], ["$DX_ENV GENERATE_XML='NO'"]) -m4trace:configure.ac:22: -1- AC_SUBST_TRACE([DX_ENV]) -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_ENV$]) -m4trace:configure.ac:22: -1- AC_SUBST([DX_FLAG_chm], [1]) -m4trace:configure.ac:22: -1- AC_SUBST_TRACE([DX_FLAG_chm]) -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_FLAG_chm$]) -m4trace:configure.ac:22: -1- AC_SUBST([DX_FLAG_chm], [0]) -m4trace:configure.ac:22: -1- AC_SUBST_TRACE([DX_FLAG_chm]) -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_FLAG_chm$]) -m4trace:configure.ac:22: -1- AC_SUBST([DX_FLAG_chm], [DX_IF_FEATURE([chm], 1, 0)]) -m4trace:configure.ac:22: -1- AC_SUBST_TRACE([DX_FLAG_chm]) -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_FLAG_chm$]) -m4trace:configure.ac:22: -1- AC_SUBST([DX_FLAG_chm], [0]) -m4trace:configure.ac:22: -1- AC_SUBST_TRACE([DX_FLAG_chm]) -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_FLAG_chm$]) -m4trace:configure.ac:22: -1- AC_SUBST([DX_HHC]) -m4trace:configure.ac:22: -1- AC_SUBST_TRACE([DX_HHC]) -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_HHC$]) -m4trace:configure.ac:22: -1- AC_SUBST([DX_FLAG_chm], [0]) -m4trace:configure.ac:22: -1- AC_SUBST_TRACE([DX_FLAG_chm]) -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_FLAG_chm$]) -m4trace:configure.ac:22: -1- AM_CONDITIONAL([DX_COND_chm], [:]) -m4trace:configure.ac:22: -1- AC_SUBST([DX_COND_chm_TRUE]) -m4trace:configure.ac:22: -1- AC_SUBST_TRACE([DX_COND_chm_TRUE]) -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_COND_chm_TRUE$]) -m4trace:configure.ac:22: -1- AC_SUBST([DX_COND_chm_FALSE]) -m4trace:configure.ac:22: -1- AC_SUBST_TRACE([DX_COND_chm_FALSE]) -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_COND_chm_FALSE$]) -m4trace:configure.ac:22: -1- _AM_SUBST_NOTMAKE([DX_COND_chm_TRUE]) -m4trace:configure.ac:22: -1- _AM_SUBST_NOTMAKE([DX_COND_chm_FALSE]) -m4trace:configure.ac:22: -1- AC_SUBST([DX_ENV], ["$DX_ENV HHC_PATH='$DX_HHC'"]) -m4trace:configure.ac:22: -1- AC_SUBST_TRACE([DX_ENV]) -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_ENV$]) -m4trace:configure.ac:22: -1- AC_SUBST([DX_ENV], ["$DX_ENV GENERATE_HTML='YES'"]) -m4trace:configure.ac:22: -1- AC_SUBST_TRACE([DX_ENV]) -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_ENV$]) -m4trace:configure.ac:22: -1- AC_SUBST([DX_ENV], ["$DX_ENV GENERATE_HTMLHELP='YES'"]) -m4trace:configure.ac:22: -1- AC_SUBST_TRACE([DX_ENV]) -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_ENV$]) -m4trace:configure.ac:22: -1- AM_CONDITIONAL([DX_COND_chm], [false]) -m4trace:configure.ac:22: -1- AC_SUBST([DX_COND_chm_TRUE]) -m4trace:configure.ac:22: -1- AC_SUBST_TRACE([DX_COND_chm_TRUE]) -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_COND_chm_TRUE$]) -m4trace:configure.ac:22: -1- AC_SUBST([DX_COND_chm_FALSE]) -m4trace:configure.ac:22: -1- AC_SUBST_TRACE([DX_COND_chm_FALSE]) -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_COND_chm_FALSE$]) -m4trace:configure.ac:22: -1- _AM_SUBST_NOTMAKE([DX_COND_chm_TRUE]) -m4trace:configure.ac:22: -1- _AM_SUBST_NOTMAKE([DX_COND_chm_FALSE]) -m4trace:configure.ac:22: -1- AC_SUBST([DX_ENV], ["$DX_ENV GENERATE_HTMLHELP='NO'"]) -m4trace:configure.ac:22: -1- AC_SUBST_TRACE([DX_ENV]) -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_ENV$]) -m4trace:configure.ac:22: -1- AC_SUBST([DX_FLAG_chi], [1]) -m4trace:configure.ac:22: -1- AC_SUBST_TRACE([DX_FLAG_chi]) -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_FLAG_chi$]) -m4trace:configure.ac:22: -1- AC_SUBST([DX_FLAG_chi], [0]) -m4trace:configure.ac:22: -1- AC_SUBST_TRACE([DX_FLAG_chi]) -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_FLAG_chi$]) -m4trace:configure.ac:22: -1- AC_SUBST([DX_FLAG_chi], [DX_IF_FEATURE([chi], 1, 0)]) -m4trace:configure.ac:22: -1- AC_SUBST_TRACE([DX_FLAG_chi]) -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_FLAG_chi$]) -m4trace:configure.ac:22: -1- AC_SUBST([DX_FLAG_chi], [0]) -m4trace:configure.ac:22: -1- AC_SUBST_TRACE([DX_FLAG_chi]) -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_FLAG_chi$]) -m4trace:configure.ac:22: -1- AM_CONDITIONAL([DX_COND_chi], [:]) -m4trace:configure.ac:22: -1- AC_SUBST([DX_COND_chi_TRUE]) -m4trace:configure.ac:22: -1- AC_SUBST_TRACE([DX_COND_chi_TRUE]) -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_COND_chi_TRUE$]) -m4trace:configure.ac:22: -1- AC_SUBST([DX_COND_chi_FALSE]) -m4trace:configure.ac:22: -1- AC_SUBST_TRACE([DX_COND_chi_FALSE]) -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_COND_chi_FALSE$]) -m4trace:configure.ac:22: -1- _AM_SUBST_NOTMAKE([DX_COND_chi_TRUE]) -m4trace:configure.ac:22: -1- _AM_SUBST_NOTMAKE([DX_COND_chi_FALSE]) -m4trace:configure.ac:22: -1- AC_SUBST([DX_ENV], ["$DX_ENV GENERATE_CHI='YES'"]) -m4trace:configure.ac:22: -1- AC_SUBST_TRACE([DX_ENV]) -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_ENV$]) -m4trace:configure.ac:22: -1- AM_CONDITIONAL([DX_COND_chi], [false]) -m4trace:configure.ac:22: -1- AC_SUBST([DX_COND_chi_TRUE]) -m4trace:configure.ac:22: -1- AC_SUBST_TRACE([DX_COND_chi_TRUE]) -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_COND_chi_TRUE$]) -m4trace:configure.ac:22: -1- AC_SUBST([DX_COND_chi_FALSE]) -m4trace:configure.ac:22: -1- AC_SUBST_TRACE([DX_COND_chi_FALSE]) -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_COND_chi_FALSE$]) -m4trace:configure.ac:22: -1- _AM_SUBST_NOTMAKE([DX_COND_chi_TRUE]) -m4trace:configure.ac:22: -1- _AM_SUBST_NOTMAKE([DX_COND_chi_FALSE]) -m4trace:configure.ac:22: -1- AC_SUBST([DX_ENV], ["$DX_ENV GENERATE_CHI='NO'"]) -m4trace:configure.ac:22: -1- AC_SUBST_TRACE([DX_ENV]) -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_ENV$]) -m4trace:configure.ac:22: -1- AC_SUBST([DX_FLAG_html], [1]) -m4trace:configure.ac:22: -1- AC_SUBST_TRACE([DX_FLAG_html]) -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_FLAG_html$]) -m4trace:configure.ac:22: -1- AC_SUBST([DX_FLAG_html], [0]) -m4trace:configure.ac:22: -1- AC_SUBST_TRACE([DX_FLAG_html]) -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_FLAG_html$]) -m4trace:configure.ac:22: -1- AC_SUBST([DX_FLAG_html], [DX_IF_FEATURE([html], 1, 0)]) -m4trace:configure.ac:22: -1- AC_SUBST_TRACE([DX_FLAG_html]) -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_FLAG_html$]) -m4trace:configure.ac:22: -1- AC_SUBST([DX_FLAG_html], [0]) -m4trace:configure.ac:22: -1- AC_SUBST_TRACE([DX_FLAG_html]) -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_FLAG_html$]) -m4trace:configure.ac:22: -1- AC_SUBST([DX_FLAG_html], [0]) -m4trace:configure.ac:22: -1- AC_SUBST_TRACE([DX_FLAG_html]) -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_FLAG_html$]) -m4trace:configure.ac:22: -1- AM_CONDITIONAL([DX_COND_html], [:]) -m4trace:configure.ac:22: -1- AC_SUBST([DX_COND_html_TRUE]) -m4trace:configure.ac:22: -1- AC_SUBST_TRACE([DX_COND_html_TRUE]) -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_COND_html_TRUE$]) -m4trace:configure.ac:22: -1- AC_SUBST([DX_COND_html_FALSE]) -m4trace:configure.ac:22: -1- AC_SUBST_TRACE([DX_COND_html_FALSE]) -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_COND_html_FALSE$]) -m4trace:configure.ac:22: -1- _AM_SUBST_NOTMAKE([DX_COND_html_TRUE]) -m4trace:configure.ac:22: -1- _AM_SUBST_NOTMAKE([DX_COND_html_FALSE]) -m4trace:configure.ac:22: -1- AC_SUBST([DX_ENV], ["$DX_ENV GENERATE_HTML='YES'"]) -m4trace:configure.ac:22: -1- AC_SUBST_TRACE([DX_ENV]) -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_ENV$]) -m4trace:configure.ac:22: -1- AM_CONDITIONAL([DX_COND_html], [false]) -m4trace:configure.ac:22: -1- AC_SUBST([DX_COND_html_TRUE]) -m4trace:configure.ac:22: -1- AC_SUBST_TRACE([DX_COND_html_TRUE]) -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_COND_html_TRUE$]) -m4trace:configure.ac:22: -1- AC_SUBST([DX_COND_html_FALSE]) -m4trace:configure.ac:22: -1- AC_SUBST_TRACE([DX_COND_html_FALSE]) -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_COND_html_FALSE$]) -m4trace:configure.ac:22: -1- _AM_SUBST_NOTMAKE([DX_COND_html_TRUE]) -m4trace:configure.ac:22: -1- _AM_SUBST_NOTMAKE([DX_COND_html_FALSE]) -m4trace:configure.ac:22: -1- AC_SUBST([DX_ENV], ["$DX_ENV GENERATE_HTML='NO'"]) -m4trace:configure.ac:22: -1- AC_SUBST_TRACE([DX_ENV]) -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_ENV$]) -m4trace:configure.ac:22: -1- AC_SUBST([DX_FLAG_ps], [1]) -m4trace:configure.ac:22: -1- AC_SUBST_TRACE([DX_FLAG_ps]) -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_FLAG_ps$]) -m4trace:configure.ac:22: -1- AC_SUBST([DX_FLAG_ps], [0]) -m4trace:configure.ac:22: -1- AC_SUBST_TRACE([DX_FLAG_ps]) -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_FLAG_ps$]) -m4trace:configure.ac:22: -1- AC_SUBST([DX_FLAG_ps], [DX_IF_FEATURE([ps], 1, 0)]) -m4trace:configure.ac:22: -1- AC_SUBST_TRACE([DX_FLAG_ps]) -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_FLAG_ps$]) -m4trace:configure.ac:22: -1- AC_SUBST([DX_FLAG_ps], [0]) -m4trace:configure.ac:22: -1- AC_SUBST_TRACE([DX_FLAG_ps]) -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_FLAG_ps$]) -m4trace:configure.ac:22: -1- AC_SUBST([DX_LATEX]) -m4trace:configure.ac:22: -1- AC_SUBST_TRACE([DX_LATEX]) -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_LATEX$]) -m4trace:configure.ac:22: -1- AC_SUBST([DX_FLAG_ps], [0]) -m4trace:configure.ac:22: -1- AC_SUBST_TRACE([DX_FLAG_ps]) -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_FLAG_ps$]) -m4trace:configure.ac:22: -1- AC_SUBST([DX_MAKEINDEX]) -m4trace:configure.ac:22: -1- AC_SUBST_TRACE([DX_MAKEINDEX]) -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_MAKEINDEX$]) -m4trace:configure.ac:22: -1- AC_SUBST([DX_FLAG_ps], [0]) -m4trace:configure.ac:22: -1- AC_SUBST_TRACE([DX_FLAG_ps]) -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_FLAG_ps$]) -m4trace:configure.ac:22: -1- AC_SUBST([DX_DVIPS]) -m4trace:configure.ac:22: -1- AC_SUBST_TRACE([DX_DVIPS]) -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_DVIPS$]) -m4trace:configure.ac:22: -1- AC_SUBST([DX_FLAG_ps], [0]) -m4trace:configure.ac:22: -1- AC_SUBST_TRACE([DX_FLAG_ps]) -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_FLAG_ps$]) -m4trace:configure.ac:22: -1- AC_SUBST([DX_EGREP]) -m4trace:configure.ac:22: -1- AC_SUBST_TRACE([DX_EGREP]) -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_EGREP$]) -m4trace:configure.ac:22: -1- AC_SUBST([DX_FLAG_ps], [0]) -m4trace:configure.ac:22: -1- AC_SUBST_TRACE([DX_FLAG_ps]) -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_FLAG_ps$]) -m4trace:configure.ac:22: -1- AM_CONDITIONAL([DX_COND_ps], [:]) -m4trace:configure.ac:22: -1- AC_SUBST([DX_COND_ps_TRUE]) -m4trace:configure.ac:22: -1- AC_SUBST_TRACE([DX_COND_ps_TRUE]) -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_COND_ps_TRUE$]) -m4trace:configure.ac:22: -1- AC_SUBST([DX_COND_ps_FALSE]) -m4trace:configure.ac:22: -1- AC_SUBST_TRACE([DX_COND_ps_FALSE]) -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_COND_ps_FALSE$]) -m4trace:configure.ac:22: -1- _AM_SUBST_NOTMAKE([DX_COND_ps_TRUE]) -m4trace:configure.ac:22: -1- _AM_SUBST_NOTMAKE([DX_COND_ps_FALSE]) -m4trace:configure.ac:22: -1- AM_CONDITIONAL([DX_COND_ps], [false]) -m4trace:configure.ac:22: -1- AC_SUBST([DX_COND_ps_TRUE]) -m4trace:configure.ac:22: -1- AC_SUBST_TRACE([DX_COND_ps_TRUE]) -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_COND_ps_TRUE$]) -m4trace:configure.ac:22: -1- AC_SUBST([DX_COND_ps_FALSE]) -m4trace:configure.ac:22: -1- AC_SUBST_TRACE([DX_COND_ps_FALSE]) -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_COND_ps_FALSE$]) -m4trace:configure.ac:22: -1- _AM_SUBST_NOTMAKE([DX_COND_ps_TRUE]) -m4trace:configure.ac:22: -1- _AM_SUBST_NOTMAKE([DX_COND_ps_FALSE]) -m4trace:configure.ac:22: -1- AC_SUBST([DX_FLAG_pdf], [1]) -m4trace:configure.ac:22: -1- AC_SUBST_TRACE([DX_FLAG_pdf]) -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_FLAG_pdf$]) -m4trace:configure.ac:22: -1- AC_SUBST([DX_FLAG_pdf], [0]) -m4trace:configure.ac:22: -1- AC_SUBST_TRACE([DX_FLAG_pdf]) -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_FLAG_pdf$]) -m4trace:configure.ac:22: -1- AC_SUBST([DX_FLAG_pdf], [DX_IF_FEATURE([pdf], 1, 0)]) -m4trace:configure.ac:22: -1- AC_SUBST_TRACE([DX_FLAG_pdf]) -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_FLAG_pdf$]) -m4trace:configure.ac:22: -1- AC_SUBST([DX_FLAG_pdf], [0]) -m4trace:configure.ac:22: -1- AC_SUBST_TRACE([DX_FLAG_pdf]) -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_FLAG_pdf$]) -m4trace:configure.ac:22: -1- AC_SUBST([DX_PDFLATEX]) -m4trace:configure.ac:22: -1- AC_SUBST_TRACE([DX_PDFLATEX]) -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_PDFLATEX$]) -m4trace:configure.ac:22: -1- AC_SUBST([DX_FLAG_pdf], [0]) -m4trace:configure.ac:22: -1- AC_SUBST_TRACE([DX_FLAG_pdf]) -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_FLAG_pdf$]) -m4trace:configure.ac:22: -1- AC_SUBST([DX_MAKEINDEX]) -m4trace:configure.ac:22: -1- AC_SUBST_TRACE([DX_MAKEINDEX]) -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_MAKEINDEX$]) -m4trace:configure.ac:22: -1- AC_SUBST([DX_FLAG_pdf], [0]) -m4trace:configure.ac:22: -1- AC_SUBST_TRACE([DX_FLAG_pdf]) -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_FLAG_pdf$]) -m4trace:configure.ac:22: -1- AC_SUBST([DX_EGREP]) -m4trace:configure.ac:22: -1- AC_SUBST_TRACE([DX_EGREP]) -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_EGREP$]) -m4trace:configure.ac:22: -1- AC_SUBST([DX_FLAG_pdf], [0]) -m4trace:configure.ac:22: -1- AC_SUBST_TRACE([DX_FLAG_pdf]) -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_FLAG_pdf$]) -m4trace:configure.ac:22: -1- AM_CONDITIONAL([DX_COND_pdf], [:]) -m4trace:configure.ac:22: -1- AC_SUBST([DX_COND_pdf_TRUE]) -m4trace:configure.ac:22: -1- AC_SUBST_TRACE([DX_COND_pdf_TRUE]) -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_COND_pdf_TRUE$]) -m4trace:configure.ac:22: -1- AC_SUBST([DX_COND_pdf_FALSE]) -m4trace:configure.ac:22: -1- AC_SUBST_TRACE([DX_COND_pdf_FALSE]) -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_COND_pdf_FALSE$]) -m4trace:configure.ac:22: -1- _AM_SUBST_NOTMAKE([DX_COND_pdf_TRUE]) -m4trace:configure.ac:22: -1- _AM_SUBST_NOTMAKE([DX_COND_pdf_FALSE]) -m4trace:configure.ac:22: -1- AM_CONDITIONAL([DX_COND_pdf], [false]) -m4trace:configure.ac:22: -1- AC_SUBST([DX_COND_pdf_TRUE]) -m4trace:configure.ac:22: -1- AC_SUBST_TRACE([DX_COND_pdf_TRUE]) -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_COND_pdf_TRUE$]) -m4trace:configure.ac:22: -1- AC_SUBST([DX_COND_pdf_FALSE]) -m4trace:configure.ac:22: -1- AC_SUBST_TRACE([DX_COND_pdf_FALSE]) -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_COND_pdf_FALSE$]) -m4trace:configure.ac:22: -1- _AM_SUBST_NOTMAKE([DX_COND_pdf_TRUE]) -m4trace:configure.ac:22: -1- _AM_SUBST_NOTMAKE([DX_COND_pdf_FALSE]) -m4trace:configure.ac:22: -1- AM_CONDITIONAL([DX_COND_latex], [:]) -m4trace:configure.ac:22: -1- AC_SUBST([DX_COND_latex_TRUE]) -m4trace:configure.ac:22: -1- AC_SUBST_TRACE([DX_COND_latex_TRUE]) -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_COND_latex_TRUE$]) -m4trace:configure.ac:22: -1- AC_SUBST([DX_COND_latex_FALSE]) -m4trace:configure.ac:22: -1- AC_SUBST_TRACE([DX_COND_latex_FALSE]) -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_COND_latex_FALSE$]) -m4trace:configure.ac:22: -1- _AM_SUBST_NOTMAKE([DX_COND_latex_TRUE]) -m4trace:configure.ac:22: -1- _AM_SUBST_NOTMAKE([DX_COND_latex_FALSE]) -m4trace:configure.ac:22: -1- AC_SUBST([DX_ENV], ["$DX_ENV GENERATE_LATEX='YES'"]) -m4trace:configure.ac:22: -1- AC_SUBST_TRACE([DX_ENV]) -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_ENV$]) -m4trace:configure.ac:22: -1- AM_CONDITIONAL([DX_COND_latex], [false]) -m4trace:configure.ac:22: -1- AC_SUBST([DX_COND_latex_TRUE]) -m4trace:configure.ac:22: -1- AC_SUBST_TRACE([DX_COND_latex_TRUE]) -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_COND_latex_TRUE$]) -m4trace:configure.ac:22: -1- AC_SUBST([DX_COND_latex_FALSE]) -m4trace:configure.ac:22: -1- AC_SUBST_TRACE([DX_COND_latex_FALSE]) -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_COND_latex_FALSE$]) -m4trace:configure.ac:22: -1- _AM_SUBST_NOTMAKE([DX_COND_latex_TRUE]) -m4trace:configure.ac:22: -1- _AM_SUBST_NOTMAKE([DX_COND_latex_FALSE]) -m4trace:configure.ac:22: -1- AC_SUBST([DX_ENV], ["$DX_ENV GENERATE_LATEX='NO'"]) -m4trace:configure.ac:22: -1- AC_SUBST_TRACE([DX_ENV]) -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_ENV$]) -m4trace:configure.ac:22: -1- AC_SUBST([DOXYGEN_PAPER_SIZE]) -m4trace:configure.ac:22: -1- AC_SUBST_TRACE([DOXYGEN_PAPER_SIZE]) -m4trace:configure.ac:22: -1- m4_pattern_allow([^DOXYGEN_PAPER_SIZE$]) -m4trace:configure.ac:22: -1- AC_SUBST([DOXYGEN_PAPER_SIZE], [""]) -m4trace:configure.ac:22: -1- AC_SUBST_TRACE([DOXYGEN_PAPER_SIZE]) -m4trace:configure.ac:22: -1- m4_pattern_allow([^DOXYGEN_PAPER_SIZE$]) -m4trace:configure.ac:22: -1- AC_SUBST([DX_ENV], ["$DX_ENV PAPER_SIZE='$DOXYGEN_PAPER_SIZE'"]) -m4trace:configure.ac:22: -1- AC_SUBST_TRACE([DX_ENV]) -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_ENV$]) -m4trace:configure.ac:25: -1- AM_INIT_AUTOMAKE([-Wall foreign]) -m4trace:configure.ac:25: -1- m4_pattern_allow([^AM_[A-Z]+FLAGS$]) -m4trace:configure.ac:25: -1- AM_AUTOMAKE_VERSION([1.11.6]) -m4trace:configure.ac:25: -1- AC_REQUIRE_AUX_FILE([install-sh]) -m4trace:configure.ac:25: -1- AC_SUBST([INSTALL_PROGRAM]) -m4trace:configure.ac:25: -1- AC_SUBST_TRACE([INSTALL_PROGRAM]) -m4trace:configure.ac:25: -1- m4_pattern_allow([^INSTALL_PROGRAM$]) -m4trace:configure.ac:25: -1- AC_SUBST([INSTALL_SCRIPT]) -m4trace:configure.ac:25: -1- AC_SUBST_TRACE([INSTALL_SCRIPT]) -m4trace:configure.ac:25: -1- m4_pattern_allow([^INSTALL_SCRIPT$]) -m4trace:configure.ac:25: -1- AC_SUBST([INSTALL_DATA]) -m4trace:configure.ac:25: -1- AC_SUBST_TRACE([INSTALL_DATA]) -m4trace:configure.ac:25: -1- m4_pattern_allow([^INSTALL_DATA$]) -m4trace:configure.ac:25: -1- AC_SUBST([am__isrc], [' -I$(srcdir)']) -m4trace:configure.ac:25: -1- AC_SUBST_TRACE([am__isrc]) -m4trace:configure.ac:25: -1- m4_pattern_allow([^am__isrc$]) -m4trace:configure.ac:25: -1- _AM_SUBST_NOTMAKE([am__isrc]) -m4trace:configure.ac:25: -1- AC_SUBST([CYGPATH_W]) -m4trace:configure.ac:25: -1- AC_SUBST_TRACE([CYGPATH_W]) -m4trace:configure.ac:25: -1- m4_pattern_allow([^CYGPATH_W$]) -m4trace:configure.ac:25: -1- AC_SUBST([PACKAGE], ['AC_PACKAGE_TARNAME']) -m4trace:configure.ac:25: -1- AC_SUBST_TRACE([PACKAGE]) -m4trace:configure.ac:25: -1- m4_pattern_allow([^PACKAGE$]) -m4trace:configure.ac:25: -1- AC_SUBST([VERSION], ['AC_PACKAGE_VERSION']) -m4trace:configure.ac:25: -1- AC_SUBST_TRACE([VERSION]) -m4trace:configure.ac:25: -1- m4_pattern_allow([^VERSION$]) -m4trace:configure.ac:25: -1- AC_DEFINE_TRACE_LITERAL([PACKAGE]) -m4trace:configure.ac:25: -1- m4_pattern_allow([^PACKAGE$]) -m4trace:configure.ac:25: -1- AH_OUTPUT([PACKAGE], [/* Name of package */ -@%:@undef PACKAGE]) -m4trace:configure.ac:25: -1- AC_DEFINE_TRACE_LITERAL([VERSION]) -m4trace:configure.ac:25: -1- m4_pattern_allow([^VERSION$]) -m4trace:configure.ac:25: -1- AH_OUTPUT([VERSION], [/* Version number of package */ -@%:@undef VERSION]) -m4trace:configure.ac:25: -1- AC_REQUIRE_AUX_FILE([missing]) -m4trace:configure.ac:25: -1- AC_SUBST([ACLOCAL]) -m4trace:configure.ac:25: -1- AC_SUBST_TRACE([ACLOCAL]) -m4trace:configure.ac:25: -1- m4_pattern_allow([^ACLOCAL$]) -m4trace:configure.ac:25: -1- AC_SUBST([AUTOCONF]) -m4trace:configure.ac:25: -1- AC_SUBST_TRACE([AUTOCONF]) -m4trace:configure.ac:25: -1- m4_pattern_allow([^AUTOCONF$]) -m4trace:configure.ac:25: -1- AC_SUBST([AUTOMAKE]) -m4trace:configure.ac:25: -1- AC_SUBST_TRACE([AUTOMAKE]) -m4trace:configure.ac:25: -1- m4_pattern_allow([^AUTOMAKE$]) -m4trace:configure.ac:25: -1- AC_SUBST([AUTOHEADER]) -m4trace:configure.ac:25: -1- AC_SUBST_TRACE([AUTOHEADER]) -m4trace:configure.ac:25: -1- m4_pattern_allow([^AUTOHEADER$]) -m4trace:configure.ac:25: -1- AC_SUBST([MAKEINFO]) -m4trace:configure.ac:25: -1- AC_SUBST_TRACE([MAKEINFO]) -m4trace:configure.ac:25: -1- m4_pattern_allow([^MAKEINFO$]) -m4trace:configure.ac:25: -1- AC_SUBST([install_sh]) -m4trace:configure.ac:25: -1- AC_SUBST_TRACE([install_sh]) -m4trace:configure.ac:25: -1- m4_pattern_allow([^install_sh$]) -m4trace:configure.ac:25: -1- AC_SUBST([STRIP]) -m4trace:configure.ac:25: -1- AC_SUBST_TRACE([STRIP]) -m4trace:configure.ac:25: -1- m4_pattern_allow([^STRIP$]) -m4trace:configure.ac:25: -1- AC_SUBST([INSTALL_STRIP_PROGRAM]) -m4trace:configure.ac:25: -1- AC_SUBST_TRACE([INSTALL_STRIP_PROGRAM]) -m4trace:configure.ac:25: -1- m4_pattern_allow([^INSTALL_STRIP_PROGRAM$]) -m4trace:configure.ac:25: -1- AC_REQUIRE_AUX_FILE([install-sh]) -m4trace:configure.ac:25: -1- AC_SUBST([MKDIR_P]) -m4trace:configure.ac:25: -1- AC_SUBST_TRACE([MKDIR_P]) -m4trace:configure.ac:25: -1- m4_pattern_allow([^MKDIR_P$]) -m4trace:configure.ac:25: -1- AC_SUBST([mkdir_p], ["$MKDIR_P"]) -m4trace:configure.ac:25: -1- AC_SUBST_TRACE([mkdir_p]) -m4trace:configure.ac:25: -1- m4_pattern_allow([^mkdir_p$]) -m4trace:configure.ac:25: -1- AC_SUBST([AWK]) -m4trace:configure.ac:25: -1- AC_SUBST_TRACE([AWK]) -m4trace:configure.ac:25: -1- m4_pattern_allow([^AWK$]) -m4trace:configure.ac:25: -1- AC_SUBST([SET_MAKE]) -m4trace:configure.ac:25: -1- AC_SUBST_TRACE([SET_MAKE]) -m4trace:configure.ac:25: -1- m4_pattern_allow([^SET_MAKE$]) -m4trace:configure.ac:25: -1- AC_SUBST([am__leading_dot]) -m4trace:configure.ac:25: -1- AC_SUBST_TRACE([am__leading_dot]) -m4trace:configure.ac:25: -1- m4_pattern_allow([^am__leading_dot$]) -m4trace:configure.ac:25: -1- AC_SUBST([AMTAR], ['$${TAR-tar}']) -m4trace:configure.ac:25: -1- AC_SUBST_TRACE([AMTAR]) -m4trace:configure.ac:25: -1- m4_pattern_allow([^AMTAR$]) -m4trace:configure.ac:25: -1- AC_SUBST([am__tar]) -m4trace:configure.ac:25: -1- AC_SUBST_TRACE([am__tar]) -m4trace:configure.ac:25: -1- m4_pattern_allow([^am__tar$]) -m4trace:configure.ac:25: -1- AC_SUBST([am__untar]) -m4trace:configure.ac:25: -1- AC_SUBST_TRACE([am__untar]) -m4trace:configure.ac:25: -1- m4_pattern_allow([^am__untar$]) -m4trace:configure.ac:26: -1- AC_CONFIG_HEADERS([config.h]) -m4trace:configure.ac:37: -1- AC_SUBST([CPPUNIT_CONFIG]) -m4trace:configure.ac:37: -1- AC_SUBST_TRACE([CPPUNIT_CONFIG]) -m4trace:configure.ac:37: -1- m4_pattern_allow([^CPPUNIT_CONFIG$]) -m4trace:configure.ac:37: -1- AC_SUBST([CPPUNIT_CFLAGS]) -m4trace:configure.ac:37: -1- AC_SUBST_TRACE([CPPUNIT_CFLAGS]) -m4trace:configure.ac:37: -1- m4_pattern_allow([^CPPUNIT_CFLAGS$]) -m4trace:configure.ac:37: -1- AC_SUBST([CPPUNIT_LIBS]) -m4trace:configure.ac:37: -1- AC_SUBST_TRACE([CPPUNIT_LIBS]) -m4trace:configure.ac:37: -1- m4_pattern_allow([^CPPUNIT_LIBS$]) -m4trace:configure.ac:44: -1- _m4_warn([cross], [cannot check for file existence when cross compiling], [../../lib/autoconf/general.m4:2777: AC_CHECK_FILE is expanded from... -../../lib/autoconf/general.m4:2808: AC_CHECK_FILES is expanded from... -configure.ac:44: the top level]) -m4trace:configure.ac:44: -1- AC_DEFINE_TRACE_LITERAL([HAVE_GENERATED_ZOOKEEPER_JUTE_C]) -m4trace:configure.ac:44: -1- m4_pattern_allow([^HAVE_GENERATED_ZOOKEEPER_JUTE_C$]) -m4trace:configure.ac:44: -1- AH_OUTPUT([HAVE_GENERATED_ZOOKEEPER_JUTE_C], [/* Define to 1 if you have the file `generated/zookeeper.jute.c\'. */ -@%:@undef HAVE_GENERATED_ZOOKEEPER_JUTE_C]) -m4trace:configure.ac:44: -1- _m4_warn([cross], [cannot check for file existence when cross compiling], [../../lib/autoconf/general.m4:2777: AC_CHECK_FILE is expanded from... -../../lib/autoconf/general.m4:2808: AC_CHECK_FILES is expanded from... -configure.ac:44: the top level]) -m4trace:configure.ac:44: -1- AC_DEFINE_TRACE_LITERAL([HAVE_GENERATED_ZOOKEEPER_JUTE_H]) -m4trace:configure.ac:44: -1- m4_pattern_allow([^HAVE_GENERATED_ZOOKEEPER_JUTE_H$]) -m4trace:configure.ac:44: -1- AH_OUTPUT([HAVE_GENERATED_ZOOKEEPER_JUTE_H], [/* Define to 1 if you have the file `generated/zookeeper.jute.h\'. */ -@%:@undef HAVE_GENERATED_ZOOKEEPER_JUTE_H]) -m4trace:configure.ac:48: -1- AC_SUBST([CPPUNIT_CFLAGS]) -m4trace:configure.ac:48: -1- AC_SUBST_TRACE([CPPUNIT_CFLAGS]) -m4trace:configure.ac:48: -1- m4_pattern_allow([^CPPUNIT_CFLAGS$]) -m4trace:configure.ac:50: -1- AC_SUBST([CC]) -m4trace:configure.ac:50: -1- AC_SUBST_TRACE([CC]) -m4trace:configure.ac:50: -1- m4_pattern_allow([^CC$]) -m4trace:configure.ac:50: -1- AC_SUBST([CFLAGS]) -m4trace:configure.ac:50: -1- AC_SUBST_TRACE([CFLAGS]) -m4trace:configure.ac:50: -1- m4_pattern_allow([^CFLAGS$]) -m4trace:configure.ac:50: -1- AC_SUBST([LDFLAGS]) -m4trace:configure.ac:50: -1- AC_SUBST_TRACE([LDFLAGS]) -m4trace:configure.ac:50: -1- m4_pattern_allow([^LDFLAGS$]) -m4trace:configure.ac:50: -1- AC_SUBST([LIBS]) -m4trace:configure.ac:50: -1- AC_SUBST_TRACE([LIBS]) -m4trace:configure.ac:50: -1- m4_pattern_allow([^LIBS$]) -m4trace:configure.ac:50: -1- AC_SUBST([CPPFLAGS]) -m4trace:configure.ac:50: -1- AC_SUBST_TRACE([CPPFLAGS]) -m4trace:configure.ac:50: -1- m4_pattern_allow([^CPPFLAGS$]) -m4trace:configure.ac:50: -1- AC_SUBST([CC]) -m4trace:configure.ac:50: -1- AC_SUBST_TRACE([CC]) -m4trace:configure.ac:50: -1- m4_pattern_allow([^CC$]) -m4trace:configure.ac:50: -1- AC_SUBST([CC]) -m4trace:configure.ac:50: -1- AC_SUBST_TRACE([CC]) -m4trace:configure.ac:50: -1- m4_pattern_allow([^CC$]) -m4trace:configure.ac:50: -1- AC_SUBST([CC]) -m4trace:configure.ac:50: -1- AC_SUBST_TRACE([CC]) -m4trace:configure.ac:50: -1- m4_pattern_allow([^CC$]) -m4trace:configure.ac:50: -1- AC_SUBST([CC]) -m4trace:configure.ac:50: -1- AC_SUBST_TRACE([CC]) -m4trace:configure.ac:50: -1- m4_pattern_allow([^CC$]) -m4trace:configure.ac:50: -1- AC_SUBST([ac_ct_CC]) -m4trace:configure.ac:50: -1- AC_SUBST_TRACE([ac_ct_CC]) -m4trace:configure.ac:50: -1- m4_pattern_allow([^ac_ct_CC$]) -m4trace:configure.ac:50: -1- AC_SUBST([EXEEXT], [$ac_cv_exeext]) -m4trace:configure.ac:50: -1- AC_SUBST_TRACE([EXEEXT]) -m4trace:configure.ac:50: -1- m4_pattern_allow([^EXEEXT$]) -m4trace:configure.ac:50: -1- AC_SUBST([OBJEXT], [$ac_cv_objext]) -m4trace:configure.ac:50: -1- AC_SUBST_TRACE([OBJEXT]) -m4trace:configure.ac:50: -1- m4_pattern_allow([^OBJEXT$]) -m4trace:configure.ac:50: -1- AC_SUBST([DEPDIR], ["${am__leading_dot}deps"]) -m4trace:configure.ac:50: -1- AC_SUBST_TRACE([DEPDIR]) -m4trace:configure.ac:50: -1- m4_pattern_allow([^DEPDIR$]) -m4trace:configure.ac:50: -1- AC_SUBST([am__include]) -m4trace:configure.ac:50: -1- AC_SUBST_TRACE([am__include]) -m4trace:configure.ac:50: -1- m4_pattern_allow([^am__include$]) -m4trace:configure.ac:50: -1- AC_SUBST([am__quote]) -m4trace:configure.ac:50: -1- AC_SUBST_TRACE([am__quote]) -m4trace:configure.ac:50: -1- m4_pattern_allow([^am__quote$]) -m4trace:configure.ac:50: -1- AM_CONDITIONAL([AMDEP], [test "x$enable_dependency_tracking" != xno]) -m4trace:configure.ac:50: -1- AC_SUBST([AMDEP_TRUE]) -m4trace:configure.ac:50: -1- AC_SUBST_TRACE([AMDEP_TRUE]) -m4trace:configure.ac:50: -1- m4_pattern_allow([^AMDEP_TRUE$]) -m4trace:configure.ac:50: -1- AC_SUBST([AMDEP_FALSE]) -m4trace:configure.ac:50: -1- AC_SUBST_TRACE([AMDEP_FALSE]) -m4trace:configure.ac:50: -1- m4_pattern_allow([^AMDEP_FALSE$]) -m4trace:configure.ac:50: -1- _AM_SUBST_NOTMAKE([AMDEP_TRUE]) -m4trace:configure.ac:50: -1- _AM_SUBST_NOTMAKE([AMDEP_FALSE]) -m4trace:configure.ac:50: -1- AC_SUBST([AMDEPBACKSLASH]) -m4trace:configure.ac:50: -1- AC_SUBST_TRACE([AMDEPBACKSLASH]) -m4trace:configure.ac:50: -1- m4_pattern_allow([^AMDEPBACKSLASH$]) -m4trace:configure.ac:50: -1- _AM_SUBST_NOTMAKE([AMDEPBACKSLASH]) -m4trace:configure.ac:50: -1- AC_SUBST([am__nodep]) -m4trace:configure.ac:50: -1- AC_SUBST_TRACE([am__nodep]) -m4trace:configure.ac:50: -1- m4_pattern_allow([^am__nodep$]) -m4trace:configure.ac:50: -1- _AM_SUBST_NOTMAKE([am__nodep]) -m4trace:configure.ac:50: -1- AC_SUBST([CCDEPMODE], [depmode=$am_cv_CC_dependencies_compiler_type]) -m4trace:configure.ac:50: -1- AC_SUBST_TRACE([CCDEPMODE]) -m4trace:configure.ac:50: -1- m4_pattern_allow([^CCDEPMODE$]) -m4trace:configure.ac:50: -1- AM_CONDITIONAL([am__fastdepCC], [ - test "x$enable_dependency_tracking" != xno \ - && test "$am_cv_CC_dependencies_compiler_type" = gcc3]) -m4trace:configure.ac:50: -1- AC_SUBST([am__fastdepCC_TRUE]) -m4trace:configure.ac:50: -1- AC_SUBST_TRACE([am__fastdepCC_TRUE]) -m4trace:configure.ac:50: -1- m4_pattern_allow([^am__fastdepCC_TRUE$]) -m4trace:configure.ac:50: -1- AC_SUBST([am__fastdepCC_FALSE]) -m4trace:configure.ac:50: -1- AC_SUBST_TRACE([am__fastdepCC_FALSE]) -m4trace:configure.ac:50: -1- m4_pattern_allow([^am__fastdepCC_FALSE$]) -m4trace:configure.ac:50: -1- _AM_SUBST_NOTMAKE([am__fastdepCC_TRUE]) -m4trace:configure.ac:50: -1- _AM_SUBST_NOTMAKE([am__fastdepCC_FALSE]) -m4trace:configure.ac:51: -1- AM_PROG_CC_C_O -m4trace:configure.ac:51: -1- AC_DEFINE_TRACE_LITERAL([NO_MINUS_C_MINUS_O]) -m4trace:configure.ac:51: -1- m4_pattern_allow([^NO_MINUS_C_MINUS_O$]) -m4trace:configure.ac:51: -1- AH_OUTPUT([NO_MINUS_C_MINUS_O], [/* Define to 1 if your C compiler doesn\'t accept -c and -o together. */ -@%:@undef NO_MINUS_C_MINUS_O]) -m4trace:configure.ac:51: -1- AC_REQUIRE_AUX_FILE([compile]) -m4trace:configure.ac:52: -1- AC_SUBST([CXX]) -m4trace:configure.ac:52: -1- AC_SUBST_TRACE([CXX]) -m4trace:configure.ac:52: -1- m4_pattern_allow([^CXX$]) -m4trace:configure.ac:52: -1- AC_SUBST([CXXFLAGS]) -m4trace:configure.ac:52: -1- AC_SUBST_TRACE([CXXFLAGS]) -m4trace:configure.ac:52: -1- m4_pattern_allow([^CXXFLAGS$]) -m4trace:configure.ac:52: -1- AC_SUBST([LDFLAGS]) -m4trace:configure.ac:52: -1- AC_SUBST_TRACE([LDFLAGS]) -m4trace:configure.ac:52: -1- m4_pattern_allow([^LDFLAGS$]) -m4trace:configure.ac:52: -1- AC_SUBST([LIBS]) -m4trace:configure.ac:52: -1- AC_SUBST_TRACE([LIBS]) -m4trace:configure.ac:52: -1- m4_pattern_allow([^LIBS$]) -m4trace:configure.ac:52: -1- AC_SUBST([CPPFLAGS]) -m4trace:configure.ac:52: -1- AC_SUBST_TRACE([CPPFLAGS]) -m4trace:configure.ac:52: -1- m4_pattern_allow([^CPPFLAGS$]) -m4trace:configure.ac:52: -1- AC_SUBST([CXX]) -m4trace:configure.ac:52: -1- AC_SUBST_TRACE([CXX]) -m4trace:configure.ac:52: -1- m4_pattern_allow([^CXX$]) -m4trace:configure.ac:52: -1- AC_SUBST([ac_ct_CXX]) -m4trace:configure.ac:52: -1- AC_SUBST_TRACE([ac_ct_CXX]) -m4trace:configure.ac:52: -1- m4_pattern_allow([^ac_ct_CXX$]) -m4trace:configure.ac:52: -1- AC_SUBST([CXXDEPMODE], [depmode=$am_cv_CXX_dependencies_compiler_type]) -m4trace:configure.ac:52: -1- AC_SUBST_TRACE([CXXDEPMODE]) -m4trace:configure.ac:52: -1- m4_pattern_allow([^CXXDEPMODE$]) -m4trace:configure.ac:52: -1- AM_CONDITIONAL([am__fastdepCXX], [ - test "x$enable_dependency_tracking" != xno \ - && test "$am_cv_CXX_dependencies_compiler_type" = gcc3]) -m4trace:configure.ac:52: -1- AC_SUBST([am__fastdepCXX_TRUE]) -m4trace:configure.ac:52: -1- AC_SUBST_TRACE([am__fastdepCXX_TRUE]) -m4trace:configure.ac:52: -1- m4_pattern_allow([^am__fastdepCXX_TRUE$]) -m4trace:configure.ac:52: -1- AC_SUBST([am__fastdepCXX_FALSE]) -m4trace:configure.ac:52: -1- AC_SUBST_TRACE([am__fastdepCXX_FALSE]) -m4trace:configure.ac:52: -1- m4_pattern_allow([^am__fastdepCXX_FALSE$]) -m4trace:configure.ac:52: -1- _AM_SUBST_NOTMAKE([am__fastdepCXX_TRUE]) -m4trace:configure.ac:52: -1- _AM_SUBST_NOTMAKE([am__fastdepCXX_FALSE]) -m4trace:configure.ac:54: -1- AC_SUBST([LN_S], [$as_ln_s]) -m4trace:configure.ac:54: -1- AC_SUBST_TRACE([LN_S]) -m4trace:configure.ac:54: -1- m4_pattern_allow([^LN_S$]) -m4trace:configure.ac:57: -1- AC_PROG_LIBTOOL -m4trace:configure.ac:57: -1- _m4_warn([obsolete], [The macro `AC_PROG_LIBTOOL' is obsolete. -You should run autoupdate.], [aclocal.m4:222: AC_PROG_LIBTOOL is expanded from... -configure.ac:57: the top level]) -m4trace:configure.ac:57: -1- LT_INIT -m4trace:configure.ac:57: -1- m4_pattern_forbid([^_?LT_[A-Z_]+$]) -m4trace:configure.ac:57: -1- m4_pattern_allow([^(_LT_EOF|LT_DLGLOBAL|LT_DLLAZY_OR_NOW|LT_MULTI_MODULE)$]) -m4trace:configure.ac:57: -1- AC_REQUIRE_AUX_FILE([ltmain.sh]) -m4trace:configure.ac:57: -1- AC_SUBST([LIBTOOL]) -m4trace:configure.ac:57: -1- AC_SUBST_TRACE([LIBTOOL]) -m4trace:configure.ac:57: -1- m4_pattern_allow([^LIBTOOL$]) -m4trace:configure.ac:57: -1- AC_CANONICAL_HOST -m4trace:configure.ac:57: -1- AC_CANONICAL_BUILD -m4trace:configure.ac:57: -1- AC_REQUIRE_AUX_FILE([config.sub]) -m4trace:configure.ac:57: -1- AC_REQUIRE_AUX_FILE([config.guess]) -m4trace:configure.ac:57: -1- AC_SUBST([build], [$ac_cv_build]) -m4trace:configure.ac:57: -1- AC_SUBST_TRACE([build]) -m4trace:configure.ac:57: -1- m4_pattern_allow([^build$]) -m4trace:configure.ac:57: -1- AC_SUBST([build_cpu], [$[1]]) -m4trace:configure.ac:57: -1- AC_SUBST_TRACE([build_cpu]) -m4trace:configure.ac:57: -1- m4_pattern_allow([^build_cpu$]) -m4trace:configure.ac:57: -1- AC_SUBST([build_vendor], [$[2]]) -m4trace:configure.ac:57: -1- AC_SUBST_TRACE([build_vendor]) -m4trace:configure.ac:57: -1- m4_pattern_allow([^build_vendor$]) -m4trace:configure.ac:57: -1- AC_SUBST([build_os]) -m4trace:configure.ac:57: -1- AC_SUBST_TRACE([build_os]) -m4trace:configure.ac:57: -1- m4_pattern_allow([^build_os$]) -m4trace:configure.ac:57: -1- AC_SUBST([host], [$ac_cv_host]) -m4trace:configure.ac:57: -1- AC_SUBST_TRACE([host]) -m4trace:configure.ac:57: -1- m4_pattern_allow([^host$]) -m4trace:configure.ac:57: -1- AC_SUBST([host_cpu], [$[1]]) -m4trace:configure.ac:57: -1- AC_SUBST_TRACE([host_cpu]) -m4trace:configure.ac:57: -1- m4_pattern_allow([^host_cpu$]) -m4trace:configure.ac:57: -1- AC_SUBST([host_vendor], [$[2]]) -m4trace:configure.ac:57: -1- AC_SUBST_TRACE([host_vendor]) -m4trace:configure.ac:57: -1- m4_pattern_allow([^host_vendor$]) -m4trace:configure.ac:57: -1- AC_SUBST([host_os]) -m4trace:configure.ac:57: -1- AC_SUBST_TRACE([host_os]) -m4trace:configure.ac:57: -1- m4_pattern_allow([^host_os$]) -m4trace:configure.ac:57: -1- AC_SUBST([SED]) -m4trace:configure.ac:57: -1- AC_SUBST_TRACE([SED]) -m4trace:configure.ac:57: -1- m4_pattern_allow([^SED$]) -m4trace:configure.ac:57: -1- AC_SUBST([GREP]) -m4trace:configure.ac:57: -1- AC_SUBST_TRACE([GREP]) -m4trace:configure.ac:57: -1- m4_pattern_allow([^GREP$]) -m4trace:configure.ac:57: -1- AC_SUBST([EGREP]) -m4trace:configure.ac:57: -1- AC_SUBST_TRACE([EGREP]) -m4trace:configure.ac:57: -1- m4_pattern_allow([^EGREP$]) -m4trace:configure.ac:57: -1- AC_SUBST([FGREP]) -m4trace:configure.ac:57: -1- AC_SUBST_TRACE([FGREP]) -m4trace:configure.ac:57: -1- m4_pattern_allow([^FGREP$]) -m4trace:configure.ac:57: -1- AC_SUBST([GREP]) -m4trace:configure.ac:57: -1- AC_SUBST_TRACE([GREP]) -m4trace:configure.ac:57: -1- m4_pattern_allow([^GREP$]) -m4trace:configure.ac:57: -1- AC_SUBST([LD]) -m4trace:configure.ac:57: -1- AC_SUBST_TRACE([LD]) -m4trace:configure.ac:57: -1- m4_pattern_allow([^LD$]) -m4trace:configure.ac:57: -1- AC_SUBST([DUMPBIN]) -m4trace:configure.ac:57: -1- AC_SUBST_TRACE([DUMPBIN]) -m4trace:configure.ac:57: -1- m4_pattern_allow([^DUMPBIN$]) -m4trace:configure.ac:57: -1- AC_SUBST([ac_ct_DUMPBIN]) -m4trace:configure.ac:57: -1- AC_SUBST_TRACE([ac_ct_DUMPBIN]) -m4trace:configure.ac:57: -1- m4_pattern_allow([^ac_ct_DUMPBIN$]) -m4trace:configure.ac:57: -1- AC_SUBST([DUMPBIN]) -m4trace:configure.ac:57: -1- AC_SUBST_TRACE([DUMPBIN]) -m4trace:configure.ac:57: -1- m4_pattern_allow([^DUMPBIN$]) -m4trace:configure.ac:57: -1- AC_SUBST([NM]) -m4trace:configure.ac:57: -1- AC_SUBST_TRACE([NM]) -m4trace:configure.ac:57: -1- m4_pattern_allow([^NM$]) -m4trace:configure.ac:57: -1- AC_SUBST([OBJDUMP]) -m4trace:configure.ac:57: -1- AC_SUBST_TRACE([OBJDUMP]) -m4trace:configure.ac:57: -1- m4_pattern_allow([^OBJDUMP$]) -m4trace:configure.ac:57: -1- AC_SUBST([OBJDUMP]) -m4trace:configure.ac:57: -1- AC_SUBST_TRACE([OBJDUMP]) -m4trace:configure.ac:57: -1- m4_pattern_allow([^OBJDUMP$]) -m4trace:configure.ac:57: -1- AC_SUBST([DLLTOOL]) -m4trace:configure.ac:57: -1- AC_SUBST_TRACE([DLLTOOL]) -m4trace:configure.ac:57: -1- m4_pattern_allow([^DLLTOOL$]) -m4trace:configure.ac:57: -1- AC_SUBST([DLLTOOL]) -m4trace:configure.ac:57: -1- AC_SUBST_TRACE([DLLTOOL]) -m4trace:configure.ac:57: -1- m4_pattern_allow([^DLLTOOL$]) -m4trace:configure.ac:57: -1- AC_SUBST([AR]) -m4trace:configure.ac:57: -1- AC_SUBST_TRACE([AR]) -m4trace:configure.ac:57: -1- m4_pattern_allow([^AR$]) -m4trace:configure.ac:57: -1- AC_SUBST([ac_ct_AR]) -m4trace:configure.ac:57: -1- AC_SUBST_TRACE([ac_ct_AR]) -m4trace:configure.ac:57: -1- m4_pattern_allow([^ac_ct_AR$]) -m4trace:configure.ac:57: -1- AC_SUBST([STRIP]) -m4trace:configure.ac:57: -1- AC_SUBST_TRACE([STRIP]) -m4trace:configure.ac:57: -1- m4_pattern_allow([^STRIP$]) -m4trace:configure.ac:57: -1- AC_SUBST([RANLIB]) -m4trace:configure.ac:57: -1- AC_SUBST_TRACE([RANLIB]) -m4trace:configure.ac:57: -1- m4_pattern_allow([^RANLIB$]) -m4trace:configure.ac:57: -1- m4_pattern_allow([LT_OBJDIR]) -m4trace:configure.ac:57: -1- AC_DEFINE_TRACE_LITERAL([LT_OBJDIR]) -m4trace:configure.ac:57: -1- m4_pattern_allow([^LT_OBJDIR$]) -m4trace:configure.ac:57: -1- AH_OUTPUT([LT_OBJDIR], [/* Define to the sub-directory in which libtool stores uninstalled libraries. - */ -@%:@undef LT_OBJDIR]) -m4trace:configure.ac:57: -1- LT_SUPPORTED_TAG([CC]) -m4trace:configure.ac:57: -1- AC_SUBST([MANIFEST_TOOL]) -m4trace:configure.ac:57: -1- AC_SUBST_TRACE([MANIFEST_TOOL]) -m4trace:configure.ac:57: -1- m4_pattern_allow([^MANIFEST_TOOL$]) -m4trace:configure.ac:57: -1- AC_SUBST([DSYMUTIL]) -m4trace:configure.ac:57: -1- AC_SUBST_TRACE([DSYMUTIL]) -m4trace:configure.ac:57: -1- m4_pattern_allow([^DSYMUTIL$]) -m4trace:configure.ac:57: -1- AC_SUBST([NMEDIT]) -m4trace:configure.ac:57: -1- AC_SUBST_TRACE([NMEDIT]) -m4trace:configure.ac:57: -1- m4_pattern_allow([^NMEDIT$]) -m4trace:configure.ac:57: -1- AC_SUBST([LIPO]) -m4trace:configure.ac:57: -1- AC_SUBST_TRACE([LIPO]) -m4trace:configure.ac:57: -1- m4_pattern_allow([^LIPO$]) -m4trace:configure.ac:57: -1- AC_SUBST([OTOOL]) -m4trace:configure.ac:57: -1- AC_SUBST_TRACE([OTOOL]) -m4trace:configure.ac:57: -1- m4_pattern_allow([^OTOOL$]) -m4trace:configure.ac:57: -1- AC_SUBST([OTOOL64]) -m4trace:configure.ac:57: -1- AC_SUBST_TRACE([OTOOL64]) -m4trace:configure.ac:57: -1- m4_pattern_allow([^OTOOL64$]) -m4trace:configure.ac:57: -1- AH_OUTPUT([HAVE_DLFCN_H], [/* Define to 1 if you have the header file. */ -@%:@undef HAVE_DLFCN_H]) -m4trace:configure.ac:57: -1- AC_SUBST([CPP]) -m4trace:configure.ac:57: -1- AC_SUBST_TRACE([CPP]) -m4trace:configure.ac:57: -1- m4_pattern_allow([^CPP$]) -m4trace:configure.ac:57: -1- AC_SUBST([CPPFLAGS]) -m4trace:configure.ac:57: -1- AC_SUBST_TRACE([CPPFLAGS]) -m4trace:configure.ac:57: -1- m4_pattern_allow([^CPPFLAGS$]) -m4trace:configure.ac:57: -1- AC_SUBST([CPP]) -m4trace:configure.ac:57: -1- AC_SUBST_TRACE([CPP]) -m4trace:configure.ac:57: -1- m4_pattern_allow([^CPP$]) -m4trace:configure.ac:57: -1- AC_DEFINE_TRACE_LITERAL([STDC_HEADERS]) -m4trace:configure.ac:57: -1- m4_pattern_allow([^STDC_HEADERS$]) -m4trace:configure.ac:57: -1- AH_OUTPUT([STDC_HEADERS], [/* Define to 1 if you have the ANSI C header files. */ -@%:@undef STDC_HEADERS]) -m4trace:configure.ac:57: -1- AH_OUTPUT([HAVE_SYS_TYPES_H], [/* Define to 1 if you have the header file. */ -@%:@undef HAVE_SYS_TYPES_H]) -m4trace:configure.ac:57: -1- AH_OUTPUT([HAVE_SYS_STAT_H], [/* Define to 1 if you have the header file. */ -@%:@undef HAVE_SYS_STAT_H]) -m4trace:configure.ac:57: -1- AH_OUTPUT([HAVE_STDLIB_H], [/* Define to 1 if you have the header file. */ -@%:@undef HAVE_STDLIB_H]) -m4trace:configure.ac:57: -1- AH_OUTPUT([HAVE_STRING_H], [/* Define to 1 if you have the header file. */ -@%:@undef HAVE_STRING_H]) -m4trace:configure.ac:57: -1- AH_OUTPUT([HAVE_MEMORY_H], [/* Define to 1 if you have the header file. */ -@%:@undef HAVE_MEMORY_H]) -m4trace:configure.ac:57: -1- AH_OUTPUT([HAVE_STRINGS_H], [/* Define to 1 if you have the header file. */ -@%:@undef HAVE_STRINGS_H]) -m4trace:configure.ac:57: -1- AH_OUTPUT([HAVE_INTTYPES_H], [/* Define to 1 if you have the header file. */ -@%:@undef HAVE_INTTYPES_H]) -m4trace:configure.ac:57: -1- AH_OUTPUT([HAVE_STDINT_H], [/* Define to 1 if you have the header file. */ -@%:@undef HAVE_STDINT_H]) -m4trace:configure.ac:57: -1- AH_OUTPUT([HAVE_UNISTD_H], [/* Define to 1 if you have the header file. */ -@%:@undef HAVE_UNISTD_H]) -m4trace:configure.ac:57: -1- AC_DEFINE_TRACE_LITERAL([HAVE_DLFCN_H]) -m4trace:configure.ac:57: -1- m4_pattern_allow([^HAVE_DLFCN_H$]) -m4trace:configure.ac:57: -1- LT_SUPPORTED_TAG([CXX]) -m4trace:configure.ac:57: -1- AC_SUBST([CXXCPP]) -m4trace:configure.ac:57: -1- AC_SUBST_TRACE([CXXCPP]) -m4trace:configure.ac:57: -1- m4_pattern_allow([^CXXCPP$]) -m4trace:configure.ac:57: -1- AC_SUBST([CPPFLAGS]) -m4trace:configure.ac:57: -1- AC_SUBST_TRACE([CPPFLAGS]) -m4trace:configure.ac:57: -1- m4_pattern_allow([^CPPFLAGS$]) -m4trace:configure.ac:57: -1- AC_SUBST([CXXCPP]) -m4trace:configure.ac:57: -1- AC_SUBST_TRACE([CXXCPP]) -m4trace:configure.ac:57: -1- m4_pattern_allow([^CXXCPP$]) -m4trace:configure.ac:57: -1- AC_SUBST([LD]) -m4trace:configure.ac:57: -1- AC_SUBST_TRACE([LD]) -m4trace:configure.ac:57: -1- m4_pattern_allow([^LD$]) -m4trace:configure.ac:106: -1- AM_CONDITIONAL([WANT_SYNCAPI], [test "x$with_syncapi" != xno]) -m4trace:configure.ac:106: -1- AC_SUBST([WANT_SYNCAPI_TRUE]) -m4trace:configure.ac:106: -1- AC_SUBST_TRACE([WANT_SYNCAPI_TRUE]) -m4trace:configure.ac:106: -1- m4_pattern_allow([^WANT_SYNCAPI_TRUE$]) -m4trace:configure.ac:106: -1- AC_SUBST([WANT_SYNCAPI_FALSE]) -m4trace:configure.ac:106: -1- AC_SUBST_TRACE([WANT_SYNCAPI_FALSE]) -m4trace:configure.ac:106: -1- m4_pattern_allow([^WANT_SYNCAPI_FALSE$]) -m4trace:configure.ac:106: -1- _AM_SUBST_NOTMAKE([WANT_SYNCAPI_TRUE]) -m4trace:configure.ac:106: -1- _AM_SUBST_NOTMAKE([WANT_SYNCAPI_FALSE]) -m4trace:configure.ac:109: -1- AC_DEFINE_TRACE_LITERAL([STDC_HEADERS]) -m4trace:configure.ac:109: -1- m4_pattern_allow([^STDC_HEADERS$]) -m4trace:configure.ac:109: -1- AH_OUTPUT([STDC_HEADERS], [/* Define to 1 if you have the ANSI C header files. */ -@%:@undef STDC_HEADERS]) -m4trace:configure.ac:110: -1- AH_OUTPUT([HAVE_ARPA_INET_H], [/* Define to 1 if you have the header file. */ -@%:@undef HAVE_ARPA_INET_H]) -m4trace:configure.ac:110: -1- AH_OUTPUT([HAVE_FCNTL_H], [/* Define to 1 if you have the header file. */ -@%:@undef HAVE_FCNTL_H]) -m4trace:configure.ac:110: -1- AH_OUTPUT([HAVE_NETDB_H], [/* Define to 1 if you have the header file. */ -@%:@undef HAVE_NETDB_H]) -m4trace:configure.ac:110: -1- AH_OUTPUT([HAVE_NETINET_IN_H], [/* Define to 1 if you have the header file. */ -@%:@undef HAVE_NETINET_IN_H]) -m4trace:configure.ac:110: -1- AH_OUTPUT([HAVE_STDLIB_H], [/* Define to 1 if you have the header file. */ -@%:@undef HAVE_STDLIB_H]) -m4trace:configure.ac:110: -1- AH_OUTPUT([HAVE_STRING_H], [/* Define to 1 if you have the header file. */ -@%:@undef HAVE_STRING_H]) -m4trace:configure.ac:110: -1- AH_OUTPUT([HAVE_SYS_SOCKET_H], [/* Define to 1 if you have the header file. */ -@%:@undef HAVE_SYS_SOCKET_H]) -m4trace:configure.ac:110: -1- AH_OUTPUT([HAVE_SYS_TIME_H], [/* Define to 1 if you have the header file. */ -@%:@undef HAVE_SYS_TIME_H]) -m4trace:configure.ac:110: -1- AH_OUTPUT([HAVE_UNISTD_H], [/* Define to 1 if you have the header file. */ -@%:@undef HAVE_UNISTD_H]) -m4trace:configure.ac:110: -1- AH_OUTPUT([HAVE_SYS_UTSNAME_H], [/* Define to 1 if you have the header file. */ -@%:@undef HAVE_SYS_UTSNAME_H]) -m4trace:configure.ac:113: -1- AC_DEFINE_TRACE_LITERAL([const]) -m4trace:configure.ac:113: -1- m4_pattern_allow([^const$]) -m4trace:configure.ac:113: -1- AH_OUTPUT([const], [/* Define to empty if `const\' does not conform to ANSI C. */ -@%:@undef const]) -m4trace:configure.ac:114: -1- AH_OUTPUT([inline], [/* Define to `__inline__\' or `__inline\' if that\'s what the C compiler - calls it, or to nothing if \'inline\' is not supported under any name. */ -#ifndef __cplusplus -#undef inline -#endif]) -m4trace:configure.ac:115: -1- AC_DEFINE_TRACE_LITERAL([TIME_WITH_SYS_TIME]) -m4trace:configure.ac:115: -1- m4_pattern_allow([^TIME_WITH_SYS_TIME$]) -m4trace:configure.ac:115: -1- AH_OUTPUT([TIME_WITH_SYS_TIME], [/* Define to 1 if you can safely include both and . */ -@%:@undef TIME_WITH_SYS_TIME]) -m4trace:configure.ac:116: -1- AC_DEFINE_TRACE_LITERAL([POLL_NFDS_TYPE]) -m4trace:configure.ac:116: -1- m4_pattern_allow([^POLL_NFDS_TYPE$]) -m4trace:configure.ac:116: -1- AH_OUTPUT([POLL_NFDS_TYPE], [/* poll() second argument type */ -@%:@undef POLL_NFDS_TYPE]) -m4trace:configure.ac:116: -1- AC_DEFINE_TRACE_LITERAL([POLL_NFDS_TYPE]) -m4trace:configure.ac:116: -1- m4_pattern_allow([^POLL_NFDS_TYPE$]) -m4trace:configure.ac:116: -1- AH_OUTPUT([POLL_NFDS_TYPE], [/* poll() second argument type */ -@%:@undef POLL_NFDS_TYPE]) -m4trace:configure.ac:123: -1- _m4_warn([obsolete], [The macro `AC_TRY_RUN' is obsolete. -You should run autoupdate.], [../../lib/autoconf/general.m4:2764: AC_TRY_RUN is expanded from... -configure.ac:123: the top level]) -m4trace:configure.ac:142: -1- AC_SUBST([USEIPV6]) -m4trace:configure.ac:142: -1- AC_SUBST_TRACE([USEIPV6]) -m4trace:configure.ac:142: -1- m4_pattern_allow([^USEIPV6$]) -m4trace:configure.ac:146: -1- AH_OUTPUT([HAVE_GETCWD], [/* Define to 1 if you have the `getcwd\' function. */ -@%:@undef HAVE_GETCWD]) -m4trace:configure.ac:146: -1- AH_OUTPUT([HAVE_GETHOSTBYNAME], [/* Define to 1 if you have the `gethostbyname\' function. */ -@%:@undef HAVE_GETHOSTBYNAME]) -m4trace:configure.ac:146: -1- AH_OUTPUT([HAVE_GETHOSTNAME], [/* Define to 1 if you have the `gethostname\' function. */ -@%:@undef HAVE_GETHOSTNAME]) -m4trace:configure.ac:146: -1- AH_OUTPUT([HAVE_GETLOGIN], [/* Define to 1 if you have the `getlogin\' function. */ -@%:@undef HAVE_GETLOGIN]) -m4trace:configure.ac:146: -1- AH_OUTPUT([HAVE_GETPWUID_R], [/* Define to 1 if you have the `getpwuid_r\' function. */ -@%:@undef HAVE_GETPWUID_R]) -m4trace:configure.ac:146: -1- AH_OUTPUT([HAVE_GETTIMEOFDAY], [/* Define to 1 if you have the `gettimeofday\' function. */ -@%:@undef HAVE_GETTIMEOFDAY]) -m4trace:configure.ac:146: -1- AH_OUTPUT([HAVE_GETUID], [/* Define to 1 if you have the `getuid\' function. */ -@%:@undef HAVE_GETUID]) -m4trace:configure.ac:146: -1- AH_OUTPUT([HAVE_MEMMOVE], [/* Define to 1 if you have the `memmove\' function. */ -@%:@undef HAVE_MEMMOVE]) -m4trace:configure.ac:146: -1- AH_OUTPUT([HAVE_MEMSET], [/* Define to 1 if you have the `memset\' function. */ -@%:@undef HAVE_MEMSET]) -m4trace:configure.ac:146: -1- AH_OUTPUT([HAVE_POLL], [/* Define to 1 if you have the `poll\' function. */ -@%:@undef HAVE_POLL]) -m4trace:configure.ac:146: -1- AH_OUTPUT([HAVE_SOCKET], [/* Define to 1 if you have the `socket\' function. */ -@%:@undef HAVE_SOCKET]) -m4trace:configure.ac:146: -1- AH_OUTPUT([HAVE_STRCHR], [/* Define to 1 if you have the `strchr\' function. */ -@%:@undef HAVE_STRCHR]) -m4trace:configure.ac:146: -1- AH_OUTPUT([HAVE_STRDUP], [/* Define to 1 if you have the `strdup\' function. */ -@%:@undef HAVE_STRDUP]) -m4trace:configure.ac:146: -1- AH_OUTPUT([HAVE_STRERROR], [/* Define to 1 if you have the `strerror\' function. */ -@%:@undef HAVE_STRERROR]) -m4trace:configure.ac:146: -1- AH_OUTPUT([HAVE_STRTOL], [/* Define to 1 if you have the `strtol\' function. */ -@%:@undef HAVE_STRTOL]) -m4trace:configure.ac:148: -1- AC_CONFIG_FILES([Makefile]) -m4trace:configure.ac:149: -1- AC_SUBST([LIB@&t@OBJS], [$ac_libobjs]) -m4trace:configure.ac:149: -1- AC_SUBST_TRACE([LIB@&t@OBJS]) -m4trace:configure.ac:149: -1- m4_pattern_allow([^LIB@&t@OBJS$]) -m4trace:configure.ac:149: -1- AC_SUBST([LTLIBOBJS], [$ac_ltlibobjs]) -m4trace:configure.ac:149: -1- AC_SUBST_TRACE([LTLIBOBJS]) -m4trace:configure.ac:149: -1- m4_pattern_allow([^LTLIBOBJS$]) -m4trace:configure.ac:149: -1- AM_CONDITIONAL([am__EXEEXT], [test -n "$EXEEXT"]) -m4trace:configure.ac:149: -1- AC_SUBST([am__EXEEXT_TRUE]) -m4trace:configure.ac:149: -1- AC_SUBST_TRACE([am__EXEEXT_TRUE]) -m4trace:configure.ac:149: -1- m4_pattern_allow([^am__EXEEXT_TRUE$]) -m4trace:configure.ac:149: -1- AC_SUBST([am__EXEEXT_FALSE]) -m4trace:configure.ac:149: -1- AC_SUBST_TRACE([am__EXEEXT_FALSE]) -m4trace:configure.ac:149: -1- m4_pattern_allow([^am__EXEEXT_FALSE$]) -m4trace:configure.ac:149: -1- _AM_SUBST_NOTMAKE([am__EXEEXT_TRUE]) -m4trace:configure.ac:149: -1- _AM_SUBST_NOTMAKE([am__EXEEXT_FALSE]) -m4trace:configure.ac:149: -1- AC_SUBST_TRACE([top_builddir]) -m4trace:configure.ac:149: -1- AC_SUBST_TRACE([top_build_prefix]) -m4trace:configure.ac:149: -1- AC_SUBST_TRACE([srcdir]) -m4trace:configure.ac:149: -1- AC_SUBST_TRACE([abs_srcdir]) -m4trace:configure.ac:149: -1- AC_SUBST_TRACE([top_srcdir]) -m4trace:configure.ac:149: -1- AC_SUBST_TRACE([abs_top_srcdir]) -m4trace:configure.ac:149: -1- AC_SUBST_TRACE([builddir]) -m4trace:configure.ac:149: -1- AC_SUBST_TRACE([abs_builddir]) -m4trace:configure.ac:149: -1- AC_SUBST_TRACE([abs_top_builddir]) -m4trace:configure.ac:149: -1- AC_SUBST_TRACE([INSTALL]) -m4trace:configure.ac:149: -1- AC_SUBST_TRACE([MKDIR_P]) -m4trace:configure.ac:149: -1- AC_REQUIRE_AUX_FILE([ltmain.sh]) diff --git a/pkg/registry/zookeeper-3.4.6/src/c/autom4te.cache/traces.2 b/pkg/registry/zookeeper-3.4.6/src/c/autom4te.cache/traces.2 deleted file mode 100644 index 15b795dcd..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/c/autom4te.cache/traces.2 +++ /dev/null @@ -1,3183 +0,0 @@ -m4trace:/usr/share/aclocal/argz.m4:12: -1- AC_DEFUN([gl_FUNC_ARGZ], [gl_PREREQ_ARGZ - -AC_CHECK_HEADERS([argz.h], [], [], [AC_INCLUDES_DEFAULT]) - -AC_CHECK_TYPES([error_t], - [], - [AC_DEFINE([error_t], [int], - [Define to a type to use for `error_t' if it is not otherwise available.]) - AC_DEFINE([__error_t_defined], [1], [Define so that glibc/gnulib argp.h - does not typedef error_t.])], - [#if defined(HAVE_ARGZ_H) -# include -#endif]) - -ARGZ_H= -AC_CHECK_FUNCS([argz_add argz_append argz_count argz_create_sep argz_insert \ - argz_next argz_stringify], [], [ARGZ_H=argz.h; AC_LIBOBJ([argz])]) - -dnl if have system argz functions, allow forced use of -dnl libltdl-supplied implementation (and default to do so -dnl on "known bad" systems). Could use a runtime check, but -dnl (a) detecting malloc issues is notoriously unreliable -dnl (b) only known system that declares argz functions, -dnl provides them, yet they are broken, is cygwin -dnl releases prior to 16-Mar-2007 (1.5.24 and earlier) -dnl So, it's more straightforward simply to special case -dnl this for known bad systems. -AS_IF([test -z "$ARGZ_H"], - [AC_CACHE_CHECK( - [if argz actually works], - [lt_cv_sys_argz_works], - [[case $host_os in #( - *cygwin*) - lt_cv_sys_argz_works=no - if test "$cross_compiling" != no; then - lt_cv_sys_argz_works="guessing no" - else - lt_sed_extract_leading_digits='s/^\([0-9\.]*\).*/\1/' - save_IFS=$IFS - IFS=-. - set x `uname -r | sed -e "$lt_sed_extract_leading_digits"` - IFS=$save_IFS - lt_os_major=${2-0} - lt_os_minor=${3-0} - lt_os_micro=${4-0} - if test "$lt_os_major" -gt 1 \ - || { test "$lt_os_major" -eq 1 \ - && { test "$lt_os_minor" -gt 5 \ - || { test "$lt_os_minor" -eq 5 \ - && test "$lt_os_micro" -gt 24; }; }; }; then - lt_cv_sys_argz_works=yes - fi - fi - ;; #( - *) lt_cv_sys_argz_works=yes ;; - esac]]) - AS_IF([test "$lt_cv_sys_argz_works" = yes], - [AC_DEFINE([HAVE_WORKING_ARGZ], 1, - [This value is set to 1 to indicate that the system argz facility works])], - [ARGZ_H=argz.h - AC_LIBOBJ([argz])])]) - -AC_SUBST([ARGZ_H]) -]) -m4trace:/usr/share/aclocal/argz.m4:79: -1- AC_DEFUN([gl_PREREQ_ARGZ], [:]) -m4trace:/usr/share/aclocal/libtool.m4:69: -1- AC_DEFUN([LT_INIT], [AC_PREREQ([2.58])dnl We use AC_INCLUDES_DEFAULT -AC_REQUIRE([AC_CONFIG_AUX_DIR_DEFAULT])dnl -AC_BEFORE([$0], [LT_LANG])dnl -AC_BEFORE([$0], [LT_OUTPUT])dnl -AC_BEFORE([$0], [LTDL_INIT])dnl -m4_require([_LT_CHECK_BUILDDIR])dnl - -dnl Autoconf doesn't catch unexpanded LT_ macros by default: -m4_pattern_forbid([^_?LT_[A-Z_]+$])dnl -m4_pattern_allow([^(_LT_EOF|LT_DLGLOBAL|LT_DLLAZY_OR_NOW|LT_MULTI_MODULE)$])dnl -dnl aclocal doesn't pull ltoptions.m4, ltsugar.m4, or ltversion.m4 -dnl unless we require an AC_DEFUNed macro: -AC_REQUIRE([LTOPTIONS_VERSION])dnl -AC_REQUIRE([LTSUGAR_VERSION])dnl -AC_REQUIRE([LTVERSION_VERSION])dnl -AC_REQUIRE([LTOBSOLETE_VERSION])dnl -m4_require([_LT_PROG_LTMAIN])dnl - -_LT_SHELL_INIT([SHELL=${CONFIG_SHELL-/bin/sh}]) - -dnl Parse OPTIONS -_LT_SET_OPTIONS([$0], [$1]) - -# This can be used to rebuild libtool when needed -LIBTOOL_DEPS="$ltmain" - -# Always use our own libtool. -LIBTOOL='$(SHELL) $(top_builddir)/libtool' -AC_SUBST(LIBTOOL)dnl - -_LT_SETUP - -# Only expand once: -m4_define([LT_INIT]) -]) -m4trace:/usr/share/aclocal/libtool.m4:107: -1- AU_DEFUN([AC_PROG_LIBTOOL], [m4_if($#, 0, [LT_INIT], [LT_INIT($@)])]) -m4trace:/usr/share/aclocal/libtool.m4:107: -1- AC_DEFUN([AC_PROG_LIBTOOL], [AC_DIAGNOSE([obsolete], [The macro `AC_PROG_LIBTOOL' is obsolete. -You should run autoupdate.])dnl -m4_if($#, 0, [LT_INIT], [LT_INIT($@)])]) -m4trace:/usr/share/aclocal/libtool.m4:108: -1- AU_DEFUN([AM_PROG_LIBTOOL], [m4_if($#, 0, [LT_INIT], [LT_INIT($@)])]) -m4trace:/usr/share/aclocal/libtool.m4:108: -1- AC_DEFUN([AM_PROG_LIBTOOL], [AC_DIAGNOSE([obsolete], [The macro `AM_PROG_LIBTOOL' is obsolete. -You should run autoupdate.])dnl -m4_if($#, 0, [LT_INIT], [LT_INIT($@)])]) -m4trace:/usr/share/aclocal/libtool.m4:609: -1- AC_DEFUN([LT_OUTPUT], [: ${CONFIG_LT=./config.lt} -AC_MSG_NOTICE([creating $CONFIG_LT]) -_LT_GENERATED_FILE_INIT(["$CONFIG_LT"], -[# Run this file to recreate a libtool stub with the current configuration.]) - -cat >>"$CONFIG_LT" <<\_LTEOF -lt_cl_silent=false -exec AS_MESSAGE_LOG_FD>>config.log -{ - echo - AS_BOX([Running $as_me.]) -} >&AS_MESSAGE_LOG_FD - -lt_cl_help="\ -\`$as_me' creates a local libtool stub from the current configuration, -for use in further configure time tests before the real libtool is -generated. - -Usage: $[0] [[OPTIONS]] - - -h, --help print this help, then exit - -V, --version print version number, then exit - -q, --quiet do not print progress messages - -d, --debug don't remove temporary files - -Report bugs to ." - -lt_cl_version="\ -m4_ifset([AC_PACKAGE_NAME], [AC_PACKAGE_NAME ])config.lt[]dnl -m4_ifset([AC_PACKAGE_VERSION], [ AC_PACKAGE_VERSION]) -configured by $[0], generated by m4_PACKAGE_STRING. - -Copyright (C) 2011 Free Software Foundation, Inc. -This config.lt script is free software; the Free Software Foundation -gives unlimited permision to copy, distribute and modify it." - -while test $[#] != 0 -do - case $[1] in - --version | --v* | -V ) - echo "$lt_cl_version"; exit 0 ;; - --help | --h* | -h ) - echo "$lt_cl_help"; exit 0 ;; - --debug | --d* | -d ) - debug=: ;; - --quiet | --q* | --silent | --s* | -q ) - lt_cl_silent=: ;; - - -*) AC_MSG_ERROR([unrecognized option: $[1] -Try \`$[0] --help' for more information.]) ;; - - *) AC_MSG_ERROR([unrecognized argument: $[1] -Try \`$[0] --help' for more information.]) ;; - esac - shift -done - -if $lt_cl_silent; then - exec AS_MESSAGE_FD>/dev/null -fi -_LTEOF - -cat >>"$CONFIG_LT" <<_LTEOF -_LT_OUTPUT_LIBTOOL_COMMANDS_INIT -_LTEOF - -cat >>"$CONFIG_LT" <<\_LTEOF -AC_MSG_NOTICE([creating $ofile]) -_LT_OUTPUT_LIBTOOL_COMMANDS -AS_EXIT(0) -_LTEOF -chmod +x "$CONFIG_LT" - -# configure is writing to config.log, but config.lt does its own redirection, -# appending to config.log, which fails on DOS, as config.log is still kept -# open by configure. Here we exec the FD to /dev/null, effectively closing -# config.log, so it can be properly (re)opened and appended to by config.lt. -lt_cl_success=: -test "$silent" = yes && - lt_config_lt_args="$lt_config_lt_args --quiet" -exec AS_MESSAGE_LOG_FD>/dev/null -$SHELL "$CONFIG_LT" $lt_config_lt_args || lt_cl_success=false -exec AS_MESSAGE_LOG_FD>>config.log -$lt_cl_success || AS_EXIT(1) -]) -m4trace:/usr/share/aclocal/libtool.m4:790: -1- AC_DEFUN([LT_SUPPORTED_TAG], []) -m4trace:/usr/share/aclocal/libtool.m4:801: -1- AC_DEFUN([LT_LANG], [AC_BEFORE([$0], [LT_OUTPUT])dnl -m4_case([$1], - [C], [_LT_LANG(C)], - [C++], [_LT_LANG(CXX)], - [Go], [_LT_LANG(GO)], - [Java], [_LT_LANG(GCJ)], - [Fortran 77], [_LT_LANG(F77)], - [Fortran], [_LT_LANG(FC)], - [Windows Resource], [_LT_LANG(RC)], - [m4_ifdef([_LT_LANG_]$1[_CONFIG], - [_LT_LANG($1)], - [m4_fatal([$0: unsupported language: "$1"])])])dnl -]) -m4trace:/usr/share/aclocal/libtool.m4:893: -1- AU_DEFUN([AC_LIBTOOL_CXX], [LT_LANG(C++)]) -m4trace:/usr/share/aclocal/libtool.m4:893: -1- AC_DEFUN([AC_LIBTOOL_CXX], [AC_DIAGNOSE([obsolete], [The macro `AC_LIBTOOL_CXX' is obsolete. -You should run autoupdate.])dnl -LT_LANG(C++)]) -m4trace:/usr/share/aclocal/libtool.m4:894: -1- AU_DEFUN([AC_LIBTOOL_F77], [LT_LANG(Fortran 77)]) -m4trace:/usr/share/aclocal/libtool.m4:894: -1- AC_DEFUN([AC_LIBTOOL_F77], [AC_DIAGNOSE([obsolete], [The macro `AC_LIBTOOL_F77' is obsolete. -You should run autoupdate.])dnl -LT_LANG(Fortran 77)]) -m4trace:/usr/share/aclocal/libtool.m4:895: -1- AU_DEFUN([AC_LIBTOOL_FC], [LT_LANG(Fortran)]) -m4trace:/usr/share/aclocal/libtool.m4:895: -1- AC_DEFUN([AC_LIBTOOL_FC], [AC_DIAGNOSE([obsolete], [The macro `AC_LIBTOOL_FC' is obsolete. -You should run autoupdate.])dnl -LT_LANG(Fortran)]) -m4trace:/usr/share/aclocal/libtool.m4:896: -1- AU_DEFUN([AC_LIBTOOL_GCJ], [LT_LANG(Java)]) -m4trace:/usr/share/aclocal/libtool.m4:896: -1- AC_DEFUN([AC_LIBTOOL_GCJ], [AC_DIAGNOSE([obsolete], [The macro `AC_LIBTOOL_GCJ' is obsolete. -You should run autoupdate.])dnl -LT_LANG(Java)]) -m4trace:/usr/share/aclocal/libtool.m4:897: -1- AU_DEFUN([AC_LIBTOOL_RC], [LT_LANG(Windows Resource)]) -m4trace:/usr/share/aclocal/libtool.m4:897: -1- AC_DEFUN([AC_LIBTOOL_RC], [AC_DIAGNOSE([obsolete], [The macro `AC_LIBTOOL_RC' is obsolete. -You should run autoupdate.])dnl -LT_LANG(Windows Resource)]) -m4trace:/usr/share/aclocal/libtool.m4:1225: -1- AC_DEFUN([_LT_WITH_SYSROOT], [AC_MSG_CHECKING([for sysroot]) -AC_ARG_WITH([sysroot], -[ --with-sysroot[=DIR] Search for dependent libraries within DIR - (or the compiler's sysroot if not specified).], -[], [with_sysroot=no]) - -dnl lt_sysroot will always be passed unquoted. We quote it here -dnl in case the user passed a directory name. -lt_sysroot= -case ${with_sysroot} in #( - yes) - if test "$GCC" = yes; then - lt_sysroot=`$CC --print-sysroot 2>/dev/null` - fi - ;; #( - /*) - lt_sysroot=`echo "$with_sysroot" | sed -e "$sed_quote_subst"` - ;; #( - no|'') - ;; #( - *) - AC_MSG_RESULT([${with_sysroot}]) - AC_MSG_ERROR([The sysroot must be an absolute path.]) - ;; -esac - - AC_MSG_RESULT([${lt_sysroot:-no}]) -_LT_DECL([], [lt_sysroot], [0], [The root where to search for ]dnl -[dependent libraries, and in which our libraries should be installed.])]) -m4trace:/usr/share/aclocal/libtool.m4:1502: -1- AC_DEFUN([_LT_COMPILER_OPTION], [m4_require([_LT_FILEUTILS_DEFAULTS])dnl -m4_require([_LT_DECL_SED])dnl -AC_CACHE_CHECK([$1], [$2], - [$2=no - m4_if([$4], , [ac_outfile=conftest.$ac_objext], [ac_outfile=$4]) - echo "$lt_simple_compile_test_code" > conftest.$ac_ext - lt_compiler_flag="$3" - # Insert the option either (1) after the last *FLAGS variable, or - # (2) before a word containing "conftest.", or (3) at the end. - # Note that $ac_compile itself does not contain backslashes and begins - # with a dollar sign (not a hyphen), so the echo should work correctly. - # The option is referenced via a variable to avoid confusing sed. - lt_compile=`echo "$ac_compile" | $SED \ - -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ - -e 's: [[^ ]]*conftest\.: $lt_compiler_flag&:; t' \ - -e 's:$: $lt_compiler_flag:'` - (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&AS_MESSAGE_LOG_FD) - (eval "$lt_compile" 2>conftest.err) - ac_status=$? - cat conftest.err >&AS_MESSAGE_LOG_FD - echo "$as_me:$LINENO: \$? = $ac_status" >&AS_MESSAGE_LOG_FD - if (exit $ac_status) && test -s "$ac_outfile"; then - # The compiler can only warn and ignore the option if not recognized - # So say no if there are warnings other than the usual output. - $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp - $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 - if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then - $2=yes - fi - fi - $RM conftest* -]) - -if test x"[$]$2" = xyes; then - m4_if([$5], , :, [$5]) -else - m4_if([$6], , :, [$6]) -fi -]) -m4trace:/usr/share/aclocal/libtool.m4:1544: -1- AU_DEFUN([AC_LIBTOOL_COMPILER_OPTION], [m4_if($#, 0, [_LT_COMPILER_OPTION], [_LT_COMPILER_OPTION($@)])]) -m4trace:/usr/share/aclocal/libtool.m4:1544: -1- AC_DEFUN([AC_LIBTOOL_COMPILER_OPTION], [AC_DIAGNOSE([obsolete], [The macro `AC_LIBTOOL_COMPILER_OPTION' is obsolete. -You should run autoupdate.])dnl -m4_if($#, 0, [_LT_COMPILER_OPTION], [_LT_COMPILER_OPTION($@)])]) -m4trace:/usr/share/aclocal/libtool.m4:1553: -1- AC_DEFUN([_LT_LINKER_OPTION], [m4_require([_LT_FILEUTILS_DEFAULTS])dnl -m4_require([_LT_DECL_SED])dnl -AC_CACHE_CHECK([$1], [$2], - [$2=no - save_LDFLAGS="$LDFLAGS" - LDFLAGS="$LDFLAGS $3" - echo "$lt_simple_link_test_code" > conftest.$ac_ext - if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then - # The linker can only warn and ignore the option if not recognized - # So say no if there are warnings - if test -s conftest.err; then - # Append any errors to the config.log. - cat conftest.err 1>&AS_MESSAGE_LOG_FD - $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp - $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 - if diff conftest.exp conftest.er2 >/dev/null; then - $2=yes - fi - else - $2=yes - fi - fi - $RM -r conftest* - LDFLAGS="$save_LDFLAGS" -]) - -if test x"[$]$2" = xyes; then - m4_if([$4], , :, [$4]) -else - m4_if([$5], , :, [$5]) -fi -]) -m4trace:/usr/share/aclocal/libtool.m4:1588: -1- AU_DEFUN([AC_LIBTOOL_LINKER_OPTION], [m4_if($#, 0, [_LT_LINKER_OPTION], [_LT_LINKER_OPTION($@)])]) -m4trace:/usr/share/aclocal/libtool.m4:1588: -1- AC_DEFUN([AC_LIBTOOL_LINKER_OPTION], [AC_DIAGNOSE([obsolete], [The macro `AC_LIBTOOL_LINKER_OPTION' is obsolete. -You should run autoupdate.])dnl -m4_if($#, 0, [_LT_LINKER_OPTION], [_LT_LINKER_OPTION($@)])]) -m4trace:/usr/share/aclocal/libtool.m4:1595: -1- AC_DEFUN([LT_CMD_MAX_LEN], [AC_REQUIRE([AC_CANONICAL_HOST])dnl -# find the maximum length of command line arguments -AC_MSG_CHECKING([the maximum length of command line arguments]) -AC_CACHE_VAL([lt_cv_sys_max_cmd_len], [dnl - i=0 - teststring="ABCD" - - case $build_os in - msdosdjgpp*) - # On DJGPP, this test can blow up pretty badly due to problems in libc - # (any single argument exceeding 2000 bytes causes a buffer overrun - # during glob expansion). Even if it were fixed, the result of this - # check would be larger than it should be. - lt_cv_sys_max_cmd_len=12288; # 12K is about right - ;; - - gnu*) - # Under GNU Hurd, this test is not required because there is - # no limit to the length of command line arguments. - # Libtool will interpret -1 as no limit whatsoever - lt_cv_sys_max_cmd_len=-1; - ;; - - cygwin* | mingw* | cegcc*) - # On Win9x/ME, this test blows up -- it succeeds, but takes - # about 5 minutes as the teststring grows exponentially. - # Worse, since 9x/ME are not pre-emptively multitasking, - # you end up with a "frozen" computer, even though with patience - # the test eventually succeeds (with a max line length of 256k). - # Instead, let's just punt: use the minimum linelength reported by - # all of the supported platforms: 8192 (on NT/2K/XP). - lt_cv_sys_max_cmd_len=8192; - ;; - - mint*) - # On MiNT this can take a long time and run out of memory. - lt_cv_sys_max_cmd_len=8192; - ;; - - amigaos*) - # On AmigaOS with pdksh, this test takes hours, literally. - # So we just punt and use a minimum line length of 8192. - lt_cv_sys_max_cmd_len=8192; - ;; - - netbsd* | freebsd* | openbsd* | darwin* | dragonfly*) - # This has been around since 386BSD, at least. Likely further. - if test -x /sbin/sysctl; then - lt_cv_sys_max_cmd_len=`/sbin/sysctl -n kern.argmax` - elif test -x /usr/sbin/sysctl; then - lt_cv_sys_max_cmd_len=`/usr/sbin/sysctl -n kern.argmax` - else - lt_cv_sys_max_cmd_len=65536 # usable default for all BSDs - fi - # And add a safety zone - lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` - lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` - ;; - - interix*) - # We know the value 262144 and hardcode it with a safety zone (like BSD) - lt_cv_sys_max_cmd_len=196608 - ;; - - os2*) - # The test takes a long time on OS/2. - lt_cv_sys_max_cmd_len=8192 - ;; - - osf*) - # Dr. Hans Ekkehard Plesser reports seeing a kernel panic running configure - # due to this test when exec_disable_arg_limit is 1 on Tru64. It is not - # nice to cause kernel panics so lets avoid the loop below. - # First set a reasonable default. - lt_cv_sys_max_cmd_len=16384 - # - if test -x /sbin/sysconfig; then - case `/sbin/sysconfig -q proc exec_disable_arg_limit` in - *1*) lt_cv_sys_max_cmd_len=-1 ;; - esac - fi - ;; - sco3.2v5*) - lt_cv_sys_max_cmd_len=102400 - ;; - sysv5* | sco5v6* | sysv4.2uw2*) - kargmax=`grep ARG_MAX /etc/conf/cf.d/stune 2>/dev/null` - if test -n "$kargmax"; then - lt_cv_sys_max_cmd_len=`echo $kargmax | sed 's/.*[[ ]]//'` - else - lt_cv_sys_max_cmd_len=32768 - fi - ;; - *) - lt_cv_sys_max_cmd_len=`(getconf ARG_MAX) 2> /dev/null` - if test -n "$lt_cv_sys_max_cmd_len"; then - lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` - lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` - else - # Make teststring a little bigger before we do anything with it. - # a 1K string should be a reasonable start. - for i in 1 2 3 4 5 6 7 8 ; do - teststring=$teststring$teststring - done - SHELL=${SHELL-${CONFIG_SHELL-/bin/sh}} - # If test is not a shell built-in, we'll probably end up computing a - # maximum length that is only half of the actual maximum length, but - # we can't tell. - while { test "X"`env echo "$teststring$teststring" 2>/dev/null` \ - = "X$teststring$teststring"; } >/dev/null 2>&1 && - test $i != 17 # 1/2 MB should be enough - do - i=`expr $i + 1` - teststring=$teststring$teststring - done - # Only check the string length outside the loop. - lt_cv_sys_max_cmd_len=`expr "X$teststring" : ".*" 2>&1` - teststring= - # Add a significant safety factor because C++ compilers can tack on - # massive amounts of additional arguments before passing them to the - # linker. It appears as though 1/2 is a usable value. - lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 2` - fi - ;; - esac -]) -if test -n $lt_cv_sys_max_cmd_len ; then - AC_MSG_RESULT($lt_cv_sys_max_cmd_len) -else - AC_MSG_RESULT(none) -fi -max_cmd_len=$lt_cv_sys_max_cmd_len -_LT_DECL([], [max_cmd_len], [0], - [What is the maximum length of a command?]) -]) -m4trace:/usr/share/aclocal/libtool.m4:1733: -1- AU_DEFUN([AC_LIBTOOL_SYS_MAX_CMD_LEN], [m4_if($#, 0, [LT_CMD_MAX_LEN], [LT_CMD_MAX_LEN($@)])]) -m4trace:/usr/share/aclocal/libtool.m4:1733: -1- AC_DEFUN([AC_LIBTOOL_SYS_MAX_CMD_LEN], [AC_DIAGNOSE([obsolete], [The macro `AC_LIBTOOL_SYS_MAX_CMD_LEN' is obsolete. -You should run autoupdate.])dnl -m4_if($#, 0, [LT_CMD_MAX_LEN], [LT_CMD_MAX_LEN($@)])]) -m4trace:/usr/share/aclocal/libtool.m4:1844: -1- AC_DEFUN([LT_SYS_DLOPEN_SELF], [m4_require([_LT_HEADER_DLFCN])dnl -if test "x$enable_dlopen" != xyes; then - enable_dlopen=unknown - enable_dlopen_self=unknown - enable_dlopen_self_static=unknown -else - lt_cv_dlopen=no - lt_cv_dlopen_libs= - - case $host_os in - beos*) - lt_cv_dlopen="load_add_on" - lt_cv_dlopen_libs= - lt_cv_dlopen_self=yes - ;; - - mingw* | pw32* | cegcc*) - lt_cv_dlopen="LoadLibrary" - lt_cv_dlopen_libs= - ;; - - cygwin*) - lt_cv_dlopen="dlopen" - lt_cv_dlopen_libs= - ;; - - darwin*) - # if libdl is installed we need to link against it - AC_CHECK_LIB([dl], [dlopen], - [lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl"],[ - lt_cv_dlopen="dyld" - lt_cv_dlopen_libs= - lt_cv_dlopen_self=yes - ]) - ;; - - *) - AC_CHECK_FUNC([shl_load], - [lt_cv_dlopen="shl_load"], - [AC_CHECK_LIB([dld], [shl_load], - [lt_cv_dlopen="shl_load" lt_cv_dlopen_libs="-ldld"], - [AC_CHECK_FUNC([dlopen], - [lt_cv_dlopen="dlopen"], - [AC_CHECK_LIB([dl], [dlopen], - [lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl"], - [AC_CHECK_LIB([svld], [dlopen], - [lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-lsvld"], - [AC_CHECK_LIB([dld], [dld_link], - [lt_cv_dlopen="dld_link" lt_cv_dlopen_libs="-ldld"]) - ]) - ]) - ]) - ]) - ]) - ;; - esac - - if test "x$lt_cv_dlopen" != xno; then - enable_dlopen=yes - else - enable_dlopen=no - fi - - case $lt_cv_dlopen in - dlopen) - save_CPPFLAGS="$CPPFLAGS" - test "x$ac_cv_header_dlfcn_h" = xyes && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H" - - save_LDFLAGS="$LDFLAGS" - wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\" - - save_LIBS="$LIBS" - LIBS="$lt_cv_dlopen_libs $LIBS" - - AC_CACHE_CHECK([whether a program can dlopen itself], - lt_cv_dlopen_self, [dnl - _LT_TRY_DLOPEN_SELF( - lt_cv_dlopen_self=yes, lt_cv_dlopen_self=yes, - lt_cv_dlopen_self=no, lt_cv_dlopen_self=cross) - ]) - - if test "x$lt_cv_dlopen_self" = xyes; then - wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $lt_prog_compiler_static\" - AC_CACHE_CHECK([whether a statically linked program can dlopen itself], - lt_cv_dlopen_self_static, [dnl - _LT_TRY_DLOPEN_SELF( - lt_cv_dlopen_self_static=yes, lt_cv_dlopen_self_static=yes, - lt_cv_dlopen_self_static=no, lt_cv_dlopen_self_static=cross) - ]) - fi - - CPPFLAGS="$save_CPPFLAGS" - LDFLAGS="$save_LDFLAGS" - LIBS="$save_LIBS" - ;; - esac - - case $lt_cv_dlopen_self in - yes|no) enable_dlopen_self=$lt_cv_dlopen_self ;; - *) enable_dlopen_self=unknown ;; - esac - - case $lt_cv_dlopen_self_static in - yes|no) enable_dlopen_self_static=$lt_cv_dlopen_self_static ;; - *) enable_dlopen_self_static=unknown ;; - esac -fi -_LT_DECL([dlopen_support], [enable_dlopen], [0], - [Whether dlopen is supported]) -_LT_DECL([dlopen_self], [enable_dlopen_self], [0], - [Whether dlopen of programs is supported]) -_LT_DECL([dlopen_self_static], [enable_dlopen_self_static], [0], - [Whether dlopen of statically linked programs is supported]) -]) -m4trace:/usr/share/aclocal/libtool.m4:1961: -1- AU_DEFUN([AC_LIBTOOL_DLOPEN_SELF], [m4_if($#, 0, [LT_SYS_DLOPEN_SELF], [LT_SYS_DLOPEN_SELF($@)])]) -m4trace:/usr/share/aclocal/libtool.m4:1961: -1- AC_DEFUN([AC_LIBTOOL_DLOPEN_SELF], [AC_DIAGNOSE([obsolete], [The macro `AC_LIBTOOL_DLOPEN_SELF' is obsolete. -You should run autoupdate.])dnl -m4_if($#, 0, [LT_SYS_DLOPEN_SELF], [LT_SYS_DLOPEN_SELF($@)])]) -m4trace:/usr/share/aclocal/libtool.m4:2942: -1- AC_DEFUN([_LT_PATH_TOOL_PREFIX], [m4_require([_LT_DECL_EGREP])dnl -AC_MSG_CHECKING([for $1]) -AC_CACHE_VAL(lt_cv_path_MAGIC_CMD, -[case $MAGIC_CMD in -[[\\/*] | ?:[\\/]*]) - lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path. - ;; -*) - lt_save_MAGIC_CMD="$MAGIC_CMD" - lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR -dnl $ac_dummy forces splitting on constant user-supplied paths. -dnl POSIX.2 word splitting is done only on the output of word expansions, -dnl not every word. This closes a longstanding sh security hole. - ac_dummy="m4_if([$2], , $PATH, [$2])" - for ac_dir in $ac_dummy; do - IFS="$lt_save_ifs" - test -z "$ac_dir" && ac_dir=. - if test -f $ac_dir/$1; then - lt_cv_path_MAGIC_CMD="$ac_dir/$1" - if test -n "$file_magic_test_file"; then - case $deplibs_check_method in - "file_magic "*) - file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"` - MAGIC_CMD="$lt_cv_path_MAGIC_CMD" - if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null | - $EGREP "$file_magic_regex" > /dev/null; then - : - else - cat <<_LT_EOF 1>&2 - -*** Warning: the command libtool uses to detect shared libraries, -*** $file_magic_cmd, produces output that libtool cannot recognize. -*** The result is that libtool may fail to recognize shared libraries -*** as such. This will affect the creation of libtool libraries that -*** depend on shared libraries, but programs linked with such libtool -*** libraries will work regardless of this problem. Nevertheless, you -*** may want to report the problem to your system manager and/or to -*** bug-libtool@gnu.org - -_LT_EOF - fi ;; - esac - fi - break - fi - done - IFS="$lt_save_ifs" - MAGIC_CMD="$lt_save_MAGIC_CMD" - ;; -esac]) -MAGIC_CMD="$lt_cv_path_MAGIC_CMD" -if test -n "$MAGIC_CMD"; then - AC_MSG_RESULT($MAGIC_CMD) -else - AC_MSG_RESULT(no) -fi -_LT_DECL([], [MAGIC_CMD], [0], - [Used to examine libraries when file_magic_cmd begins with "file"])dnl -]) -m4trace:/usr/share/aclocal/libtool.m4:3004: -1- AU_DEFUN([AC_PATH_TOOL_PREFIX], [m4_if($#, 0, [_LT_PATH_TOOL_PREFIX], [_LT_PATH_TOOL_PREFIX($@)])]) -m4trace:/usr/share/aclocal/libtool.m4:3004: -1- AC_DEFUN([AC_PATH_TOOL_PREFIX], [AC_DIAGNOSE([obsolete], [The macro `AC_PATH_TOOL_PREFIX' is obsolete. -You should run autoupdate.])dnl -m4_if($#, 0, [_LT_PATH_TOOL_PREFIX], [_LT_PATH_TOOL_PREFIX($@)])]) -m4trace:/usr/share/aclocal/libtool.m4:3027: -1- AC_DEFUN([LT_PATH_LD], [AC_REQUIRE([AC_PROG_CC])dnl -AC_REQUIRE([AC_CANONICAL_HOST])dnl -AC_REQUIRE([AC_CANONICAL_BUILD])dnl -m4_require([_LT_DECL_SED])dnl -m4_require([_LT_DECL_EGREP])dnl -m4_require([_LT_PROG_ECHO_BACKSLASH])dnl - -AC_ARG_WITH([gnu-ld], - [AS_HELP_STRING([--with-gnu-ld], - [assume the C compiler uses GNU ld @<:@default=no@:>@])], - [test "$withval" = no || with_gnu_ld=yes], - [with_gnu_ld=no])dnl - -ac_prog=ld -if test "$GCC" = yes; then - # Check if gcc -print-prog-name=ld gives a path. - AC_MSG_CHECKING([for ld used by $CC]) - case $host in - *-*-mingw*) - # gcc leaves a trailing carriage return which upsets mingw - ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;; - *) - ac_prog=`($CC -print-prog-name=ld) 2>&5` ;; - esac - case $ac_prog in - # Accept absolute paths. - [[\\/]]* | ?:[[\\/]]*) - re_direlt='/[[^/]][[^/]]*/\.\./' - # Canonicalize the pathname of ld - ac_prog=`$ECHO "$ac_prog"| $SED 's%\\\\%/%g'` - while $ECHO "$ac_prog" | $GREP "$re_direlt" > /dev/null 2>&1; do - ac_prog=`$ECHO $ac_prog| $SED "s%$re_direlt%/%"` - done - test -z "$LD" && LD="$ac_prog" - ;; - "") - # If it fails, then pretend we aren't using GCC. - ac_prog=ld - ;; - *) - # If it is relative, then search for the first ld in PATH. - with_gnu_ld=unknown - ;; - esac -elif test "$with_gnu_ld" = yes; then - AC_MSG_CHECKING([for GNU ld]) -else - AC_MSG_CHECKING([for non-GNU ld]) -fi -AC_CACHE_VAL(lt_cv_path_LD, -[if test -z "$LD"; then - lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR - for ac_dir in $PATH; do - IFS="$lt_save_ifs" - test -z "$ac_dir" && ac_dir=. - if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then - lt_cv_path_LD="$ac_dir/$ac_prog" - # Check to see if the program is GNU ld. I'd rather use --version, - # but apparently some variants of GNU ld only accept -v. - # Break only if it was the GNU/non-GNU ld that we prefer. - case `"$lt_cv_path_LD" -v 2>&1 &1 | sed '1q'` in - */dev/null* | *'Invalid file or object type'*) - lt_cv_path_NM="$tmp_nm -B" - break - ;; - *) - case `"$tmp_nm" -p /dev/null 2>&1 | sed '1q'` in - */dev/null*) - lt_cv_path_NM="$tmp_nm -p" - break - ;; - *) - lt_cv_path_NM=${lt_cv_path_NM="$tmp_nm"} # keep the first match, but - continue # so that we can try to find one that supports BSD flags - ;; - esac - ;; - esac - fi - done - IFS="$lt_save_ifs" - done - : ${lt_cv_path_NM=no} -fi]) -if test "$lt_cv_path_NM" != "no"; then - NM="$lt_cv_path_NM" -else - # Didn't find any BSD compatible name lister, look for dumpbin. - if test -n "$DUMPBIN"; then : - # Let the user override the test. - else - AC_CHECK_TOOLS(DUMPBIN, [dumpbin "link -dump"], :) - case `$DUMPBIN -symbols /dev/null 2>&1 | sed '1q'` in - *COFF*) - DUMPBIN="$DUMPBIN -symbols" - ;; - *) - DUMPBIN=: - ;; - esac - fi - AC_SUBST([DUMPBIN]) - if test "$DUMPBIN" != ":"; then - NM="$DUMPBIN" - fi -fi -test -z "$NM" && NM=nm -AC_SUBST([NM]) -_LT_DECL([], [NM], [1], [A BSD- or MS-compatible name lister])dnl - -AC_CACHE_CHECK([the name lister ($NM) interface], [lt_cv_nm_interface], - [lt_cv_nm_interface="BSD nm" - echo "int some_variable = 0;" > conftest.$ac_ext - (eval echo "\"\$as_me:$LINENO: $ac_compile\"" >&AS_MESSAGE_LOG_FD) - (eval "$ac_compile" 2>conftest.err) - cat conftest.err >&AS_MESSAGE_LOG_FD - (eval echo "\"\$as_me:$LINENO: $NM \\\"conftest.$ac_objext\\\"\"" >&AS_MESSAGE_LOG_FD) - (eval "$NM \"conftest.$ac_objext\"" 2>conftest.err > conftest.out) - cat conftest.err >&AS_MESSAGE_LOG_FD - (eval echo "\"\$as_me:$LINENO: output\"" >&AS_MESSAGE_LOG_FD) - cat conftest.out >&AS_MESSAGE_LOG_FD - if $GREP 'External.*some_variable' conftest.out > /dev/null; then - lt_cv_nm_interface="MS dumpbin" - fi - rm -f conftest*]) -]) -m4trace:/usr/share/aclocal/libtool.m4:3501: -1- AU_DEFUN([AM_PROG_NM], [m4_if($#, 0, [LT_PATH_NM], [LT_PATH_NM($@)])]) -m4trace:/usr/share/aclocal/libtool.m4:3501: -1- AC_DEFUN([AM_PROG_NM], [AC_DIAGNOSE([obsolete], [The macro `AM_PROG_NM' is obsolete. -You should run autoupdate.])dnl -m4_if($#, 0, [LT_PATH_NM], [LT_PATH_NM($@)])]) -m4trace:/usr/share/aclocal/libtool.m4:3502: -1- AU_DEFUN([AC_PROG_NM], [m4_if($#, 0, [LT_PATH_NM], [LT_PATH_NM($@)])]) -m4trace:/usr/share/aclocal/libtool.m4:3502: -1- AC_DEFUN([AC_PROG_NM], [AC_DIAGNOSE([obsolete], [The macro `AC_PROG_NM' is obsolete. -You should run autoupdate.])dnl -m4_if($#, 0, [LT_PATH_NM], [LT_PATH_NM($@)])]) -m4trace:/usr/share/aclocal/libtool.m4:3572: -1- AC_DEFUN([LT_LIB_M], [AC_REQUIRE([AC_CANONICAL_HOST])dnl -LIBM= -case $host in -*-*-beos* | *-*-cegcc* | *-*-cygwin* | *-*-haiku* | *-*-pw32* | *-*-darwin*) - # These system don't have libm, or don't need it - ;; -*-ncr-sysv4.3*) - AC_CHECK_LIB(mw, _mwvalidcheckl, LIBM="-lmw") - AC_CHECK_LIB(m, cos, LIBM="$LIBM -lm") - ;; -*) - AC_CHECK_LIB(m, cos, LIBM="-lm") - ;; -esac -AC_SUBST([LIBM]) -]) -m4trace:/usr/share/aclocal/libtool.m4:3591: -1- AU_DEFUN([AC_CHECK_LIBM], [m4_if($#, 0, [LT_LIB_M], [LT_LIB_M($@)])]) -m4trace:/usr/share/aclocal/libtool.m4:3591: -1- AC_DEFUN([AC_CHECK_LIBM], [AC_DIAGNOSE([obsolete], [The macro `AC_CHECK_LIBM' is obsolete. -You should run autoupdate.])dnl -m4_if($#, 0, [LT_LIB_M], [LT_LIB_M($@)])]) -m4trace:/usr/share/aclocal/libtool.m4:7641: -1- AC_DEFUN([LT_PROG_GCJ], [m4_ifdef([AC_PROG_GCJ], [AC_PROG_GCJ], - [m4_ifdef([A][M_PROG_GCJ], [A][M_PROG_GCJ], - [AC_CHECK_TOOL(GCJ, gcj,) - test "x${GCJFLAGS+set}" = xset || GCJFLAGS="-g -O2" - AC_SUBST(GCJFLAGS)])])[]dnl -]) -m4trace:/usr/share/aclocal/libtool.m4:7650: -1- AU_DEFUN([LT_AC_PROG_GCJ], [m4_if($#, 0, [LT_PROG_GCJ], [LT_PROG_GCJ($@)])]) -m4trace:/usr/share/aclocal/libtool.m4:7650: -1- AC_DEFUN([LT_AC_PROG_GCJ], [AC_DIAGNOSE([obsolete], [The macro `LT_AC_PROG_GCJ' is obsolete. -You should run autoupdate.])dnl -m4_if($#, 0, [LT_PROG_GCJ], [LT_PROG_GCJ($@)])]) -m4trace:/usr/share/aclocal/libtool.m4:7657: -1- AC_DEFUN([LT_PROG_GO], [AC_CHECK_TOOL(GOC, gccgo,) -]) -m4trace:/usr/share/aclocal/libtool.m4:7664: -1- AC_DEFUN([LT_PROG_RC], [AC_CHECK_TOOL(RC, windres,) -]) -m4trace:/usr/share/aclocal/libtool.m4:7669: -1- AU_DEFUN([LT_AC_PROG_RC], [m4_if($#, 0, [LT_PROG_RC], [LT_PROG_RC($@)])]) -m4trace:/usr/share/aclocal/libtool.m4:7669: -1- AC_DEFUN([LT_AC_PROG_RC], [AC_DIAGNOSE([obsolete], [The macro `LT_AC_PROG_RC' is obsolete. -You should run autoupdate.])dnl -m4_if($#, 0, [LT_PROG_RC], [LT_PROG_RC($@)])]) -m4trace:/usr/share/aclocal/libtool.m4:7789: -1- AU_DEFUN([LT_AC_PROG_SED], [m4_if($#, 0, [AC_PROG_SED], [AC_PROG_SED($@)])]) -m4trace:/usr/share/aclocal/libtool.m4:7789: -1- AC_DEFUN([LT_AC_PROG_SED], [AC_DIAGNOSE([obsolete], [The macro `LT_AC_PROG_SED' is obsolete. -You should run autoupdate.])dnl -m4_if($#, 0, [AC_PROG_SED], [AC_PROG_SED($@)])]) -m4trace:/usr/share/aclocal/ltdl.m4:16: -1- AC_DEFUN([LT_CONFIG_LTDL_DIR], [AC_BEFORE([$0], [LTDL_INIT]) -_$0($*) -]) -m4trace:/usr/share/aclocal/ltdl.m4:68: -1- AC_DEFUN([LTDL_CONVENIENCE], [AC_BEFORE([$0], [LTDL_INIT])dnl -dnl Although the argument is deprecated and no longer documented, -dnl LTDL_CONVENIENCE used to take a DIRECTORY orgument, if we have one -dnl here make sure it is the same as any other declaration of libltdl's -dnl location! This also ensures lt_ltdl_dir is set when configure.ac is -dnl not yet using an explicit LT_CONFIG_LTDL_DIR. -m4_ifval([$1], [_LT_CONFIG_LTDL_DIR([$1])])dnl -_$0() -]) -m4trace:/usr/share/aclocal/ltdl.m4:81: -1- AU_DEFUN([AC_LIBLTDL_CONVENIENCE], [_LT_CONFIG_LTDL_DIR([m4_default([$1], [libltdl])]) -_LTDL_CONVENIENCE]) -m4trace:/usr/share/aclocal/ltdl.m4:81: -1- AC_DEFUN([AC_LIBLTDL_CONVENIENCE], [AC_DIAGNOSE([obsolete], [The macro `AC_LIBLTDL_CONVENIENCE' is obsolete. -You should run autoupdate.])dnl -_LT_CONFIG_LTDL_DIR([m4_default([$1], [libltdl])]) -_LTDL_CONVENIENCE]) -m4trace:/usr/share/aclocal/ltdl.m4:124: -1- AC_DEFUN([LTDL_INSTALLABLE], [AC_BEFORE([$0], [LTDL_INIT])dnl -dnl Although the argument is deprecated and no longer documented, -dnl LTDL_INSTALLABLE used to take a DIRECTORY orgument, if we have one -dnl here make sure it is the same as any other declaration of libltdl's -dnl location! This also ensures lt_ltdl_dir is set when configure.ac is -dnl not yet using an explicit LT_CONFIG_LTDL_DIR. -m4_ifval([$1], [_LT_CONFIG_LTDL_DIR([$1])])dnl -_$0() -]) -m4trace:/usr/share/aclocal/ltdl.m4:137: -1- AU_DEFUN([AC_LIBLTDL_INSTALLABLE], [_LT_CONFIG_LTDL_DIR([m4_default([$1], [libltdl])]) -_LTDL_INSTALLABLE]) -m4trace:/usr/share/aclocal/ltdl.m4:137: -1- AC_DEFUN([AC_LIBLTDL_INSTALLABLE], [AC_DIAGNOSE([obsolete], [The macro `AC_LIBLTDL_INSTALLABLE' is obsolete. -You should run autoupdate.])dnl -_LT_CONFIG_LTDL_DIR([m4_default([$1], [libltdl])]) -_LTDL_INSTALLABLE]) -m4trace:/usr/share/aclocal/ltdl.m4:213: -1- AC_DEFUN([_LT_LIBOBJ], [ - m4_pattern_allow([^_LT_LIBOBJS$]) - _LT_LIBOBJS="$_LT_LIBOBJS $1.$ac_objext" -]) -m4trace:/usr/share/aclocal/ltdl.m4:226: -1- AC_DEFUN([LTDL_INIT], [dnl Parse OPTIONS -_LT_SET_OPTIONS([$0], [$1]) - -dnl We need to keep our own list of libobjs separate from our parent project, -dnl and the easiest way to do that is redefine the AC_LIBOBJs macro while -dnl we look for our own LIBOBJs. -m4_pushdef([AC_LIBOBJ], m4_defn([_LT_LIBOBJ])) -m4_pushdef([AC_LIBSOURCES]) - -dnl If not otherwise defined, default to the 1.5.x compatible subproject mode: -m4_if(_LTDL_MODE, [], - [m4_define([_LTDL_MODE], m4_default([$2], [subproject])) - m4_if([-1], [m4_bregexp(_LTDL_MODE, [\(subproject\|\(non\)?recursive\)])], - [m4_fatal([unknown libltdl mode: ]_LTDL_MODE)])]) - -AC_ARG_WITH([included_ltdl], - [AS_HELP_STRING([--with-included-ltdl], - [use the GNU ltdl sources included here])]) - -if test "x$with_included_ltdl" != xyes; then - # We are not being forced to use the included libltdl sources, so - # decide whether there is a useful installed version we can use. - AC_CHECK_HEADER([ltdl.h], - [AC_CHECK_DECL([lt_dlinterface_register], - [AC_CHECK_LIB([ltdl], [lt_dladvise_preload], - [with_included_ltdl=no], - [with_included_ltdl=yes])], - [with_included_ltdl=yes], - [AC_INCLUDES_DEFAULT - #include ])], - [with_included_ltdl=yes], - [AC_INCLUDES_DEFAULT] - ) -fi - -dnl If neither LT_CONFIG_LTDL_DIR, LTDL_CONVENIENCE nor LTDL_INSTALLABLE -dnl was called yet, then for old times' sake, we assume libltdl is in an -dnl eponymous directory: -AC_PROVIDE_IFELSE([LT_CONFIG_LTDL_DIR], [], [_LT_CONFIG_LTDL_DIR([libltdl])]) - -AC_ARG_WITH([ltdl_include], - [AS_HELP_STRING([--with-ltdl-include=DIR], - [use the ltdl headers installed in DIR])]) - -if test -n "$with_ltdl_include"; then - if test -f "$with_ltdl_include/ltdl.h"; then : - else - AC_MSG_ERROR([invalid ltdl include directory: `$with_ltdl_include']) - fi -else - with_ltdl_include=no -fi - -AC_ARG_WITH([ltdl_lib], - [AS_HELP_STRING([--with-ltdl-lib=DIR], - [use the libltdl.la installed in DIR])]) - -if test -n "$with_ltdl_lib"; then - if test -f "$with_ltdl_lib/libltdl.la"; then : - else - AC_MSG_ERROR([invalid ltdl library directory: `$with_ltdl_lib']) - fi -else - with_ltdl_lib=no -fi - -case ,$with_included_ltdl,$with_ltdl_include,$with_ltdl_lib, in - ,yes,no,no,) - m4_case(m4_default(_LTDL_TYPE, [convenience]), - [convenience], [_LTDL_CONVENIENCE], - [installable], [_LTDL_INSTALLABLE], - [m4_fatal([unknown libltdl build type: ]_LTDL_TYPE)]) - ;; - ,no,no,no,) - # If the included ltdl is not to be used, then use the - # preinstalled libltdl we found. - AC_DEFINE([HAVE_LTDL], [1], - [Define this if a modern libltdl is already installed]) - LIBLTDL=-lltdl - LTDLDEPS= - LTDLINCL= - ;; - ,no*,no,*) - AC_MSG_ERROR([`--with-ltdl-include' and `--with-ltdl-lib' options must be used together]) - ;; - *) with_included_ltdl=no - LIBLTDL="-L$with_ltdl_lib -lltdl" - LTDLDEPS= - LTDLINCL="-I$with_ltdl_include" - ;; -esac -INCLTDL="$LTDLINCL" - -# Report our decision... -AC_MSG_CHECKING([where to find libltdl headers]) -AC_MSG_RESULT([$LTDLINCL]) -AC_MSG_CHECKING([where to find libltdl library]) -AC_MSG_RESULT([$LIBLTDL]) - -_LTDL_SETUP - -dnl restore autoconf definition. -m4_popdef([AC_LIBOBJ]) -m4_popdef([AC_LIBSOURCES]) - -AC_CONFIG_COMMANDS_PRE([ - _ltdl_libobjs= - _ltdl_ltlibobjs= - if test -n "$_LT_LIBOBJS"; then - # Remove the extension. - _lt_sed_drop_objext='s/\.o$//;s/\.obj$//' - for i in `for i in $_LT_LIBOBJS; do echo "$i"; done | sed "$_lt_sed_drop_objext" | sort -u`; do - _ltdl_libobjs="$_ltdl_libobjs $lt_libobj_prefix$i.$ac_objext" - _ltdl_ltlibobjs="$_ltdl_ltlibobjs $lt_libobj_prefix$i.lo" - done - fi - AC_SUBST([ltdl_LIBOBJS], [$_ltdl_libobjs]) - AC_SUBST([ltdl_LTLIBOBJS], [$_ltdl_ltlibobjs]) -]) - -# Only expand once: -m4_define([LTDL_INIT]) -]) -m4trace:/usr/share/aclocal/ltdl.m4:352: -1- AU_DEFUN([AC_LIB_LTDL], [LTDL_INIT($@)]) -m4trace:/usr/share/aclocal/ltdl.m4:352: -1- AC_DEFUN([AC_LIB_LTDL], [AC_DIAGNOSE([obsolete], [The macro `AC_LIB_LTDL' is obsolete. -You should run autoupdate.])dnl -LTDL_INIT($@)]) -m4trace:/usr/share/aclocal/ltdl.m4:353: -1- AU_DEFUN([AC_WITH_LTDL], [LTDL_INIT($@)]) -m4trace:/usr/share/aclocal/ltdl.m4:353: -1- AC_DEFUN([AC_WITH_LTDL], [AC_DIAGNOSE([obsolete], [The macro `AC_WITH_LTDL' is obsolete. -You should run autoupdate.])dnl -LTDL_INIT($@)]) -m4trace:/usr/share/aclocal/ltdl.m4:354: -1- AU_DEFUN([LT_WITH_LTDL], [LTDL_INIT($@)]) -m4trace:/usr/share/aclocal/ltdl.m4:354: -1- AC_DEFUN([LT_WITH_LTDL], [AC_DIAGNOSE([obsolete], [The macro `LT_WITH_LTDL' is obsolete. -You should run autoupdate.])dnl -LTDL_INIT($@)]) -m4trace:/usr/share/aclocal/ltdl.m4:367: -1- AC_DEFUN([_LTDL_SETUP], [AC_REQUIRE([AC_PROG_CC])dnl -AC_REQUIRE([LT_SYS_MODULE_EXT])dnl -AC_REQUIRE([LT_SYS_MODULE_PATH])dnl -AC_REQUIRE([LT_SYS_DLSEARCH_PATH])dnl -AC_REQUIRE([LT_LIB_DLLOAD])dnl -AC_REQUIRE([LT_SYS_SYMBOL_USCORE])dnl -AC_REQUIRE([LT_FUNC_DLSYM_USCORE])dnl -AC_REQUIRE([LT_SYS_DLOPEN_DEPLIBS])dnl -AC_REQUIRE([gl_FUNC_ARGZ])dnl - -m4_require([_LT_CHECK_OBJDIR])dnl -m4_require([_LT_HEADER_DLFCN])dnl -m4_require([_LT_CHECK_DLPREOPEN])dnl -m4_require([_LT_DECL_SED])dnl - -dnl Don't require this, or it will be expanded earlier than the code -dnl that sets the variables it relies on: -_LT_ENABLE_INSTALL - -dnl _LTDL_MODE specific code must be called at least once: -_LTDL_MODE_DISPATCH - -# In order that ltdl.c can compile, find out the first AC_CONFIG_HEADERS -# the user used. This is so that ltdl.h can pick up the parent projects -# config.h file, The first file in AC_CONFIG_HEADERS must contain the -# definitions required by ltdl.c. -# FIXME: Remove use of undocumented AC_LIST_HEADERS (2.59 compatibility). -AC_CONFIG_COMMANDS_PRE([dnl -m4_pattern_allow([^LT_CONFIG_H$])dnl -m4_ifset([AH_HEADER], - [LT_CONFIG_H=AH_HEADER], - [m4_ifset([AC_LIST_HEADERS], - [LT_CONFIG_H=`echo "AC_LIST_HEADERS" | $SED 's,^[[ ]]*,,;s,[[ :]].*$,,'`], - [])])]) -AC_SUBST([LT_CONFIG_H]) - -AC_CHECK_HEADERS([unistd.h dl.h sys/dl.h dld.h mach-o/dyld.h dirent.h], - [], [], [AC_INCLUDES_DEFAULT]) - -AC_CHECK_FUNCS([closedir opendir readdir], [], [AC_LIBOBJ([lt__dirent])]) -AC_CHECK_FUNCS([strlcat strlcpy], [], [AC_LIBOBJ([lt__strl])]) - -m4_pattern_allow([LT_LIBEXT])dnl -AC_DEFINE_UNQUOTED([LT_LIBEXT],["$libext"],[The archive extension]) - -name= -eval "lt_libprefix=\"$libname_spec\"" -m4_pattern_allow([LT_LIBPREFIX])dnl -AC_DEFINE_UNQUOTED([LT_LIBPREFIX],["$lt_libprefix"],[The archive prefix]) - -name=ltdl -eval "LTDLOPEN=\"$libname_spec\"" -AC_SUBST([LTDLOPEN]) -]) -m4trace:/usr/share/aclocal/ltdl.m4:443: -1- AC_DEFUN([LT_SYS_DLOPEN_DEPLIBS], [AC_REQUIRE([AC_CANONICAL_HOST])dnl -AC_CACHE_CHECK([whether deplibs are loaded by dlopen], - [lt_cv_sys_dlopen_deplibs], - [# PORTME does your system automatically load deplibs for dlopen? - # or its logical equivalent (e.g. shl_load for HP-UX < 11) - # For now, we just catch OSes we know something about -- in the - # future, we'll try test this programmatically. - lt_cv_sys_dlopen_deplibs=unknown - case $host_os in - aix3*|aix4.1.*|aix4.2.*) - # Unknown whether this is true for these versions of AIX, but - # we want this `case' here to explicitly catch those versions. - lt_cv_sys_dlopen_deplibs=unknown - ;; - aix[[4-9]]*) - lt_cv_sys_dlopen_deplibs=yes - ;; - amigaos*) - case $host_cpu in - powerpc) - lt_cv_sys_dlopen_deplibs=no - ;; - esac - ;; - darwin*) - # Assuming the user has installed a libdl from somewhere, this is true - # If you are looking for one http://www.opendarwin.org/projects/dlcompat - lt_cv_sys_dlopen_deplibs=yes - ;; - freebsd* | dragonfly*) - lt_cv_sys_dlopen_deplibs=yes - ;; - gnu* | linux* | k*bsd*-gnu | kopensolaris*-gnu) - # GNU and its variants, using gnu ld.so (Glibc) - lt_cv_sys_dlopen_deplibs=yes - ;; - hpux10*|hpux11*) - lt_cv_sys_dlopen_deplibs=yes - ;; - interix*) - lt_cv_sys_dlopen_deplibs=yes - ;; - irix[[12345]]*|irix6.[[01]]*) - # Catch all versions of IRIX before 6.2, and indicate that we don't - # know how it worked for any of those versions. - lt_cv_sys_dlopen_deplibs=unknown - ;; - irix*) - # The case above catches anything before 6.2, and it's known that - # at 6.2 and later dlopen does load deplibs. - lt_cv_sys_dlopen_deplibs=yes - ;; - netbsd* | netbsdelf*-gnu) - lt_cv_sys_dlopen_deplibs=yes - ;; - openbsd*) - lt_cv_sys_dlopen_deplibs=yes - ;; - osf[[1234]]*) - # dlopen did load deplibs (at least at 4.x), but until the 5.x series, - # it did *not* use an RPATH in a shared library to find objects the - # library depends on, so we explicitly say `no'. - lt_cv_sys_dlopen_deplibs=no - ;; - osf5.0|osf5.0a|osf5.1) - # dlopen *does* load deplibs and with the right loader patch applied - # it even uses RPATH in a shared library to search for shared objects - # that the library depends on, but there's no easy way to know if that - # patch is installed. Since this is the case, all we can really - # say is unknown -- it depends on the patch being installed. If - # it is, this changes to `yes'. Without it, it would be `no'. - lt_cv_sys_dlopen_deplibs=unknown - ;; - osf*) - # the two cases above should catch all versions of osf <= 5.1. Read - # the comments above for what we know about them. - # At > 5.1, deplibs are loaded *and* any RPATH in a shared library - # is used to find them so we can finally say `yes'. - lt_cv_sys_dlopen_deplibs=yes - ;; - qnx*) - lt_cv_sys_dlopen_deplibs=yes - ;; - solaris*) - lt_cv_sys_dlopen_deplibs=yes - ;; - sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) - libltdl_cv_sys_dlopen_deplibs=yes - ;; - esac - ]) -if test "$lt_cv_sys_dlopen_deplibs" != yes; then - AC_DEFINE([LTDL_DLOPEN_DEPLIBS], [1], - [Define if the OS needs help to load dependent libraries for dlopen().]) -fi -]) -m4trace:/usr/share/aclocal/ltdl.m4:542: -1- AU_DEFUN([AC_LTDL_SYS_DLOPEN_DEPLIBS], [m4_if($#, 0, [LT_SYS_DLOPEN_DEPLIBS], [LT_SYS_DLOPEN_DEPLIBS($@)])]) -m4trace:/usr/share/aclocal/ltdl.m4:542: -1- AC_DEFUN([AC_LTDL_SYS_DLOPEN_DEPLIBS], [AC_DIAGNOSE([obsolete], [The macro `AC_LTDL_SYS_DLOPEN_DEPLIBS' is obsolete. -You should run autoupdate.])dnl -m4_if($#, 0, [LT_SYS_DLOPEN_DEPLIBS], [LT_SYS_DLOPEN_DEPLIBS($@)])]) -m4trace:/usr/share/aclocal/ltdl.m4:549: -1- AC_DEFUN([LT_SYS_MODULE_EXT], [m4_require([_LT_SYS_DYNAMIC_LINKER])dnl -AC_CACHE_CHECK([which extension is used for runtime loadable modules], - [libltdl_cv_shlibext], -[ -module=yes -eval libltdl_cv_shlibext=$shrext_cmds -module=no -eval libltdl_cv_shrext=$shrext_cmds - ]) -if test -n "$libltdl_cv_shlibext"; then - m4_pattern_allow([LT_MODULE_EXT])dnl - AC_DEFINE_UNQUOTED([LT_MODULE_EXT], ["$libltdl_cv_shlibext"], - [Define to the extension used for runtime loadable modules, say, ".so".]) -fi -if test "$libltdl_cv_shrext" != "$libltdl_cv_shlibext"; then - m4_pattern_allow([LT_SHARED_EXT])dnl - AC_DEFINE_UNQUOTED([LT_SHARED_EXT], ["$libltdl_cv_shrext"], - [Define to the shared library suffix, say, ".dylib".]) -fi -]) -m4trace:/usr/share/aclocal/ltdl.m4:572: -1- AU_DEFUN([AC_LTDL_SHLIBEXT], [m4_if($#, 0, [LT_SYS_MODULE_EXT], [LT_SYS_MODULE_EXT($@)])]) -m4trace:/usr/share/aclocal/ltdl.m4:572: -1- AC_DEFUN([AC_LTDL_SHLIBEXT], [AC_DIAGNOSE([obsolete], [The macro `AC_LTDL_SHLIBEXT' is obsolete. -You should run autoupdate.])dnl -m4_if($#, 0, [LT_SYS_MODULE_EXT], [LT_SYS_MODULE_EXT($@)])]) -m4trace:/usr/share/aclocal/ltdl.m4:579: -1- AC_DEFUN([LT_SYS_MODULE_PATH], [m4_require([_LT_SYS_DYNAMIC_LINKER])dnl -AC_CACHE_CHECK([which variable specifies run-time module search path], - [lt_cv_module_path_var], [lt_cv_module_path_var="$shlibpath_var"]) -if test -n "$lt_cv_module_path_var"; then - m4_pattern_allow([LT_MODULE_PATH_VAR])dnl - AC_DEFINE_UNQUOTED([LT_MODULE_PATH_VAR], ["$lt_cv_module_path_var"], - [Define to the name of the environment variable that determines the run-time module search path.]) -fi -]) -m4trace:/usr/share/aclocal/ltdl.m4:591: -1- AU_DEFUN([AC_LTDL_SHLIBPATH], [m4_if($#, 0, [LT_SYS_MODULE_PATH], [LT_SYS_MODULE_PATH($@)])]) -m4trace:/usr/share/aclocal/ltdl.m4:591: -1- AC_DEFUN([AC_LTDL_SHLIBPATH], [AC_DIAGNOSE([obsolete], [The macro `AC_LTDL_SHLIBPATH' is obsolete. -You should run autoupdate.])dnl -m4_if($#, 0, [LT_SYS_MODULE_PATH], [LT_SYS_MODULE_PATH($@)])]) -m4trace:/usr/share/aclocal/ltdl.m4:598: -1- AC_DEFUN([LT_SYS_DLSEARCH_PATH], [m4_require([_LT_SYS_DYNAMIC_LINKER])dnl -AC_CACHE_CHECK([for the default library search path], - [lt_cv_sys_dlsearch_path], - [lt_cv_sys_dlsearch_path="$sys_lib_dlsearch_path_spec"]) -if test -n "$lt_cv_sys_dlsearch_path"; then - sys_dlsearch_path= - for dir in $lt_cv_sys_dlsearch_path; do - if test -z "$sys_dlsearch_path"; then - sys_dlsearch_path="$dir" - else - sys_dlsearch_path="$sys_dlsearch_path$PATH_SEPARATOR$dir" - fi - done - m4_pattern_allow([LT_DLSEARCH_PATH])dnl - AC_DEFINE_UNQUOTED([LT_DLSEARCH_PATH], ["$sys_dlsearch_path"], - [Define to the system default library search path.]) -fi -]) -m4trace:/usr/share/aclocal/ltdl.m4:619: -1- AU_DEFUN([AC_LTDL_SYSSEARCHPATH], [m4_if($#, 0, [LT_SYS_DLSEARCH_PATH], [LT_SYS_DLSEARCH_PATH($@)])]) -m4trace:/usr/share/aclocal/ltdl.m4:619: -1- AC_DEFUN([AC_LTDL_SYSSEARCHPATH], [AC_DIAGNOSE([obsolete], [The macro `AC_LTDL_SYSSEARCHPATH' is obsolete. -You should run autoupdate.])dnl -m4_if($#, 0, [LT_SYS_DLSEARCH_PATH], [LT_SYS_DLSEARCH_PATH($@)])]) -m4trace:/usr/share/aclocal/ltdl.m4:645: -1- AC_DEFUN([LT_LIB_DLLOAD], [m4_pattern_allow([^LT_DLLOADERS$]) -LT_DLLOADERS= -AC_SUBST([LT_DLLOADERS]) - -AC_LANG_PUSH([C]) - -LIBADD_DLOPEN= -AC_SEARCH_LIBS([dlopen], [dl], - [AC_DEFINE([HAVE_LIBDL], [1], - [Define if you have the libdl library or equivalent.]) - if test "$ac_cv_search_dlopen" != "none required" ; then - LIBADD_DLOPEN="-ldl" - fi - libltdl_cv_lib_dl_dlopen="yes" - LT_DLLOADERS="$LT_DLLOADERS ${lt_dlopen_dir+$lt_dlopen_dir/}dlopen.la"], - [AC_LINK_IFELSE([AC_LANG_PROGRAM([[#if HAVE_DLFCN_H -# include -#endif - ]], [[dlopen(0, 0);]])], - [AC_DEFINE([HAVE_LIBDL], [1], - [Define if you have the libdl library or equivalent.]) - libltdl_cv_func_dlopen="yes" - LT_DLLOADERS="$LT_DLLOADERS ${lt_dlopen_dir+$lt_dlopen_dir/}dlopen.la"], - [AC_CHECK_LIB([svld], [dlopen], - [AC_DEFINE([HAVE_LIBDL], [1], - [Define if you have the libdl library or equivalent.]) - LIBADD_DLOPEN="-lsvld" libltdl_cv_func_dlopen="yes" - LT_DLLOADERS="$LT_DLLOADERS ${lt_dlopen_dir+$lt_dlopen_dir/}dlopen.la"])])]) -if test x"$libltdl_cv_func_dlopen" = xyes || test x"$libltdl_cv_lib_dl_dlopen" = xyes -then - lt_save_LIBS="$LIBS" - LIBS="$LIBS $LIBADD_DLOPEN" - AC_CHECK_FUNCS([dlerror]) - LIBS="$lt_save_LIBS" -fi -AC_SUBST([LIBADD_DLOPEN]) - -LIBADD_SHL_LOAD= -AC_CHECK_FUNC([shl_load], - [AC_DEFINE([HAVE_SHL_LOAD], [1], - [Define if you have the shl_load function.]) - LT_DLLOADERS="$LT_DLLOADERS ${lt_dlopen_dir+$lt_dlopen_dir/}shl_load.la"], - [AC_CHECK_LIB([dld], [shl_load], - [AC_DEFINE([HAVE_SHL_LOAD], [1], - [Define if you have the shl_load function.]) - LT_DLLOADERS="$LT_DLLOADERS ${lt_dlopen_dir+$lt_dlopen_dir/}shl_load.la" - LIBADD_SHL_LOAD="-ldld"])]) -AC_SUBST([LIBADD_SHL_LOAD]) - -case $host_os in -darwin[[1567]].*) -# We only want this for pre-Mac OS X 10.4. - AC_CHECK_FUNC([_dyld_func_lookup], - [AC_DEFINE([HAVE_DYLD], [1], - [Define if you have the _dyld_func_lookup function.]) - LT_DLLOADERS="$LT_DLLOADERS ${lt_dlopen_dir+$lt_dlopen_dir/}dyld.la"]) - ;; -beos*) - LT_DLLOADERS="$LT_DLLOADERS ${lt_dlopen_dir+$lt_dlopen_dir/}load_add_on.la" - ;; -cygwin* | mingw* | os2* | pw32*) - AC_CHECK_DECLS([cygwin_conv_path], [], [], [[#include ]]) - LT_DLLOADERS="$LT_DLLOADERS ${lt_dlopen_dir+$lt_dlopen_dir/}loadlibrary.la" - ;; -esac - -AC_CHECK_LIB([dld], [dld_link], - [AC_DEFINE([HAVE_DLD], [1], - [Define if you have the GNU dld library.]) - LT_DLLOADERS="$LT_DLLOADERS ${lt_dlopen_dir+$lt_dlopen_dir/}dld_link.la"]) -AC_SUBST([LIBADD_DLD_LINK]) - -m4_pattern_allow([^LT_DLPREOPEN$]) -LT_DLPREOPEN= -if test -n "$LT_DLLOADERS" -then - for lt_loader in $LT_DLLOADERS; do - LT_DLPREOPEN="$LT_DLPREOPEN-dlpreopen $lt_loader " - done - AC_DEFINE([HAVE_LIBDLLOADER], [1], - [Define if libdlloader will be built on this platform]) -fi -AC_SUBST([LT_DLPREOPEN]) - -dnl This isn't used anymore, but set it for backwards compatibility -LIBADD_DL="$LIBADD_DLOPEN $LIBADD_SHL_LOAD" -AC_SUBST([LIBADD_DL]) - -AC_LANG_POP -]) -m4trace:/usr/share/aclocal/ltdl.m4:738: -1- AU_DEFUN([AC_LTDL_DLLIB], [m4_if($#, 0, [LT_LIB_DLLOAD], [LT_LIB_DLLOAD($@)])]) -m4trace:/usr/share/aclocal/ltdl.m4:738: -1- AC_DEFUN([AC_LTDL_DLLIB], [AC_DIAGNOSE([obsolete], [The macro `AC_LTDL_DLLIB' is obsolete. -You should run autoupdate.])dnl -m4_if($#, 0, [LT_LIB_DLLOAD], [LT_LIB_DLLOAD($@)])]) -m4trace:/usr/share/aclocal/ltdl.m4:746: -1- AC_DEFUN([LT_SYS_SYMBOL_USCORE], [m4_require([_LT_CMD_GLOBAL_SYMBOLS])dnl -AC_CACHE_CHECK([for _ prefix in compiled symbols], - [lt_cv_sys_symbol_underscore], - [lt_cv_sys_symbol_underscore=no - cat > conftest.$ac_ext <<_LT_EOF -void nm_test_func(){} -int main(){nm_test_func;return 0;} -_LT_EOF - if AC_TRY_EVAL(ac_compile); then - # Now try to grab the symbols. - ac_nlist=conftest.nm - if AC_TRY_EVAL(NM conftest.$ac_objext \| $lt_cv_sys_global_symbol_pipe \> $ac_nlist) && test -s "$ac_nlist"; then - # See whether the symbols have a leading underscore. - if grep '^. _nm_test_func' "$ac_nlist" >/dev/null; then - lt_cv_sys_symbol_underscore=yes - else - if grep '^. nm_test_func ' "$ac_nlist" >/dev/null; then - : - else - echo "configure: cannot find nm_test_func in $ac_nlist" >&AS_MESSAGE_LOG_FD - fi - fi - else - echo "configure: cannot run $lt_cv_sys_global_symbol_pipe" >&AS_MESSAGE_LOG_FD - fi - else - echo "configure: failed program was:" >&AS_MESSAGE_LOG_FD - cat conftest.c >&AS_MESSAGE_LOG_FD - fi - rm -rf conftest* - ]) - sys_symbol_underscore=$lt_cv_sys_symbol_underscore - AC_SUBST([sys_symbol_underscore]) -]) -m4trace:/usr/share/aclocal/ltdl.m4:783: -1- AU_DEFUN([AC_LTDL_SYMBOL_USCORE], [m4_if($#, 0, [LT_SYS_SYMBOL_USCORE], [LT_SYS_SYMBOL_USCORE($@)])]) -m4trace:/usr/share/aclocal/ltdl.m4:783: -1- AC_DEFUN([AC_LTDL_SYMBOL_USCORE], [AC_DIAGNOSE([obsolete], [The macro `AC_LTDL_SYMBOL_USCORE' is obsolete. -You should run autoupdate.])dnl -m4_if($#, 0, [LT_SYS_SYMBOL_USCORE], [LT_SYS_SYMBOL_USCORE($@)])]) -m4trace:/usr/share/aclocal/ltdl.m4:790: -1- AC_DEFUN([LT_FUNC_DLSYM_USCORE], [AC_REQUIRE([LT_SYS_SYMBOL_USCORE])dnl -if test x"$lt_cv_sys_symbol_underscore" = xyes; then - if test x"$libltdl_cv_func_dlopen" = xyes || - test x"$libltdl_cv_lib_dl_dlopen" = xyes ; then - AC_CACHE_CHECK([whether we have to add an underscore for dlsym], - [libltdl_cv_need_uscore], - [libltdl_cv_need_uscore=unknown - save_LIBS="$LIBS" - LIBS="$LIBS $LIBADD_DLOPEN" - _LT_TRY_DLOPEN_SELF( - [libltdl_cv_need_uscore=no], [libltdl_cv_need_uscore=yes], - [], [libltdl_cv_need_uscore=cross]) - LIBS="$save_LIBS" - ]) - fi -fi - -if test x"$libltdl_cv_need_uscore" = xyes; then - AC_DEFINE([NEED_USCORE], [1], - [Define if dlsym() requires a leading underscore in symbol names.]) -fi -]) -m4trace:/usr/share/aclocal/ltdl.m4:815: -1- AU_DEFUN([AC_LTDL_DLSYM_USCORE], [m4_if($#, 0, [LT_FUNC_DLSYM_USCORE], [LT_FUNC_DLSYM_USCORE($@)])]) -m4trace:/usr/share/aclocal/ltdl.m4:815: -1- AC_DEFUN([AC_LTDL_DLSYM_USCORE], [AC_DIAGNOSE([obsolete], [The macro `AC_LTDL_DLSYM_USCORE' is obsolete. -You should run autoupdate.])dnl -m4_if($#, 0, [LT_FUNC_DLSYM_USCORE], [LT_FUNC_DLSYM_USCORE($@)])]) -m4trace:/usr/share/aclocal/ltoptions.m4:14: -1- AC_DEFUN([LTOPTIONS_VERSION], [m4_if([1])]) -m4trace:/usr/share/aclocal/ltoptions.m4:111: -1- AU_DEFUN([AC_LIBTOOL_DLOPEN], [_LT_SET_OPTION([LT_INIT], [dlopen]) -AC_DIAGNOSE([obsolete], -[$0: Remove this warning and the call to _LT_SET_OPTION when you -put the `dlopen' option into LT_INIT's first parameter.]) -]) -m4trace:/usr/share/aclocal/ltoptions.m4:111: -1- AC_DEFUN([AC_LIBTOOL_DLOPEN], [AC_DIAGNOSE([obsolete], [The macro `AC_LIBTOOL_DLOPEN' is obsolete. -You should run autoupdate.])dnl -_LT_SET_OPTION([LT_INIT], [dlopen]) -AC_DIAGNOSE([obsolete], -[$0: Remove this warning and the call to _LT_SET_OPTION when you -put the `dlopen' option into LT_INIT's first parameter.]) -]) -m4trace:/usr/share/aclocal/ltoptions.m4:146: -1- AU_DEFUN([AC_LIBTOOL_WIN32_DLL], [AC_REQUIRE([AC_CANONICAL_HOST])dnl -_LT_SET_OPTION([LT_INIT], [win32-dll]) -AC_DIAGNOSE([obsolete], -[$0: Remove this warning and the call to _LT_SET_OPTION when you -put the `win32-dll' option into LT_INIT's first parameter.]) -]) -m4trace:/usr/share/aclocal/ltoptions.m4:146: -1- AC_DEFUN([AC_LIBTOOL_WIN32_DLL], [AC_DIAGNOSE([obsolete], [The macro `AC_LIBTOOL_WIN32_DLL' is obsolete. -You should run autoupdate.])dnl -AC_REQUIRE([AC_CANONICAL_HOST])dnl -_LT_SET_OPTION([LT_INIT], [win32-dll]) -AC_DIAGNOSE([obsolete], -[$0: Remove this warning and the call to _LT_SET_OPTION when you -put the `win32-dll' option into LT_INIT's first parameter.]) -]) -m4trace:/usr/share/aclocal/ltoptions.m4:195: -1- AC_DEFUN([AC_ENABLE_SHARED], [_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[shared]) -]) -m4trace:/usr/share/aclocal/ltoptions.m4:199: -1- AC_DEFUN([AC_DISABLE_SHARED], [_LT_SET_OPTION([LT_INIT], [disable-shared]) -]) -m4trace:/usr/share/aclocal/ltoptions.m4:203: -1- AU_DEFUN([AM_ENABLE_SHARED], [AC_ENABLE_SHARED($@)]) -m4trace:/usr/share/aclocal/ltoptions.m4:203: -1- AC_DEFUN([AM_ENABLE_SHARED], [AC_DIAGNOSE([obsolete], [The macro `AM_ENABLE_SHARED' is obsolete. -You should run autoupdate.])dnl -AC_ENABLE_SHARED($@)]) -m4trace:/usr/share/aclocal/ltoptions.m4:204: -1- AU_DEFUN([AM_DISABLE_SHARED], [AC_DISABLE_SHARED($@)]) -m4trace:/usr/share/aclocal/ltoptions.m4:204: -1- AC_DEFUN([AM_DISABLE_SHARED], [AC_DIAGNOSE([obsolete], [The macro `AM_DISABLE_SHARED' is obsolete. -You should run autoupdate.])dnl -AC_DISABLE_SHARED($@)]) -m4trace:/usr/share/aclocal/ltoptions.m4:249: -1- AC_DEFUN([AC_ENABLE_STATIC], [_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[static]) -]) -m4trace:/usr/share/aclocal/ltoptions.m4:253: -1- AC_DEFUN([AC_DISABLE_STATIC], [_LT_SET_OPTION([LT_INIT], [disable-static]) -]) -m4trace:/usr/share/aclocal/ltoptions.m4:257: -1- AU_DEFUN([AM_ENABLE_STATIC], [AC_ENABLE_STATIC($@)]) -m4trace:/usr/share/aclocal/ltoptions.m4:257: -1- AC_DEFUN([AM_ENABLE_STATIC], [AC_DIAGNOSE([obsolete], [The macro `AM_ENABLE_STATIC' is obsolete. -You should run autoupdate.])dnl -AC_ENABLE_STATIC($@)]) -m4trace:/usr/share/aclocal/ltoptions.m4:258: -1- AU_DEFUN([AM_DISABLE_STATIC], [AC_DISABLE_STATIC($@)]) -m4trace:/usr/share/aclocal/ltoptions.m4:258: -1- AC_DEFUN([AM_DISABLE_STATIC], [AC_DIAGNOSE([obsolete], [The macro `AM_DISABLE_STATIC' is obsolete. -You should run autoupdate.])dnl -AC_DISABLE_STATIC($@)]) -m4trace:/usr/share/aclocal/ltoptions.m4:303: -1- AU_DEFUN([AC_ENABLE_FAST_INSTALL], [_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[fast-install]) -AC_DIAGNOSE([obsolete], -[$0: Remove this warning and the call to _LT_SET_OPTION when you put -the `fast-install' option into LT_INIT's first parameter.]) -]) -m4trace:/usr/share/aclocal/ltoptions.m4:303: -1- AC_DEFUN([AC_ENABLE_FAST_INSTALL], [AC_DIAGNOSE([obsolete], [The macro `AC_ENABLE_FAST_INSTALL' is obsolete. -You should run autoupdate.])dnl -_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[fast-install]) -AC_DIAGNOSE([obsolete], -[$0: Remove this warning and the call to _LT_SET_OPTION when you put -the `fast-install' option into LT_INIT's first parameter.]) -]) -m4trace:/usr/share/aclocal/ltoptions.m4:310: -1- AU_DEFUN([AC_DISABLE_FAST_INSTALL], [_LT_SET_OPTION([LT_INIT], [disable-fast-install]) -AC_DIAGNOSE([obsolete], -[$0: Remove this warning and the call to _LT_SET_OPTION when you put -the `disable-fast-install' option into LT_INIT's first parameter.]) -]) -m4trace:/usr/share/aclocal/ltoptions.m4:310: -1- AC_DEFUN([AC_DISABLE_FAST_INSTALL], [AC_DIAGNOSE([obsolete], [The macro `AC_DISABLE_FAST_INSTALL' is obsolete. -You should run autoupdate.])dnl -_LT_SET_OPTION([LT_INIT], [disable-fast-install]) -AC_DIAGNOSE([obsolete], -[$0: Remove this warning and the call to _LT_SET_OPTION when you put -the `disable-fast-install' option into LT_INIT's first parameter.]) -]) -m4trace:/usr/share/aclocal/ltoptions.m4:358: -1- AU_DEFUN([AC_LIBTOOL_PICMODE], [_LT_SET_OPTION([LT_INIT], [pic-only]) -AC_DIAGNOSE([obsolete], -[$0: Remove this warning and the call to _LT_SET_OPTION when you -put the `pic-only' option into LT_INIT's first parameter.]) -]) -m4trace:/usr/share/aclocal/ltoptions.m4:358: -1- AC_DEFUN([AC_LIBTOOL_PICMODE], [AC_DIAGNOSE([obsolete], [The macro `AC_LIBTOOL_PICMODE' is obsolete. -You should run autoupdate.])dnl -_LT_SET_OPTION([LT_INIT], [pic-only]) -AC_DIAGNOSE([obsolete], -[$0: Remove this warning and the call to _LT_SET_OPTION when you -put the `pic-only' option into LT_INIT's first parameter.]) -]) -m4trace:/usr/share/aclocal/ltsugar.m4:13: -1- AC_DEFUN([LTSUGAR_VERSION], [m4_if([0.1])]) -m4trace:/usr/share/aclocal/ltversion.m4:18: -1- AC_DEFUN([LTVERSION_VERSION], [macro_version='2.4.2' -macro_revision='1.3337' -_LT_DECL(, macro_version, 0, [Which release of libtool.m4 was used?]) -_LT_DECL(, macro_revision, 0) -]) -m4trace:/usr/share/aclocal/lt~obsolete.m4:36: -1- AC_DEFUN([LTOBSOLETE_VERSION], [m4_if([1])]) -m4trace:/usr/share/aclocal/lt~obsolete.m4:40: -1- AC_DEFUN([_LT_AC_PROG_ECHO_BACKSLASH]) -m4trace:/usr/share/aclocal/lt~obsolete.m4:41: -1- AC_DEFUN([_LT_AC_SHELL_INIT]) -m4trace:/usr/share/aclocal/lt~obsolete.m4:42: -1- AC_DEFUN([_LT_AC_SYS_LIBPATH_AIX]) -m4trace:/usr/share/aclocal/lt~obsolete.m4:44: -1- AC_DEFUN([_LT_AC_TAGVAR]) -m4trace:/usr/share/aclocal/lt~obsolete.m4:45: -1- AC_DEFUN([AC_LTDL_ENABLE_INSTALL]) -m4trace:/usr/share/aclocal/lt~obsolete.m4:46: -1- AC_DEFUN([AC_LTDL_PREOPEN]) -m4trace:/usr/share/aclocal/lt~obsolete.m4:47: -1- AC_DEFUN([_LT_AC_SYS_COMPILER]) -m4trace:/usr/share/aclocal/lt~obsolete.m4:48: -1- AC_DEFUN([_LT_AC_LOCK]) -m4trace:/usr/share/aclocal/lt~obsolete.m4:49: -1- AC_DEFUN([AC_LIBTOOL_SYS_OLD_ARCHIVE]) -m4trace:/usr/share/aclocal/lt~obsolete.m4:50: -1- AC_DEFUN([_LT_AC_TRY_DLOPEN_SELF]) -m4trace:/usr/share/aclocal/lt~obsolete.m4:51: -1- AC_DEFUN([AC_LIBTOOL_PROG_CC_C_O]) -m4trace:/usr/share/aclocal/lt~obsolete.m4:52: -1- AC_DEFUN([AC_LIBTOOL_SYS_HARD_LINK_LOCKS]) -m4trace:/usr/share/aclocal/lt~obsolete.m4:53: -1- AC_DEFUN([AC_LIBTOOL_OBJDIR]) -m4trace:/usr/share/aclocal/lt~obsolete.m4:54: -1- AC_DEFUN([AC_LTDL_OBJDIR]) -m4trace:/usr/share/aclocal/lt~obsolete.m4:55: -1- AC_DEFUN([AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH]) -m4trace:/usr/share/aclocal/lt~obsolete.m4:56: -1- AC_DEFUN([AC_LIBTOOL_SYS_LIB_STRIP]) -m4trace:/usr/share/aclocal/lt~obsolete.m4:57: -1- AC_DEFUN([AC_PATH_MAGIC]) -m4trace:/usr/share/aclocal/lt~obsolete.m4:58: -1- AC_DEFUN([AC_PROG_LD_GNU]) -m4trace:/usr/share/aclocal/lt~obsolete.m4:59: -1- AC_DEFUN([AC_PROG_LD_RELOAD_FLAG]) -m4trace:/usr/share/aclocal/lt~obsolete.m4:60: -1- AC_DEFUN([AC_DEPLIBS_CHECK_METHOD]) -m4trace:/usr/share/aclocal/lt~obsolete.m4:61: -1- AC_DEFUN([AC_LIBTOOL_PROG_COMPILER_NO_RTTI]) -m4trace:/usr/share/aclocal/lt~obsolete.m4:62: -1- AC_DEFUN([AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE]) -m4trace:/usr/share/aclocal/lt~obsolete.m4:63: -1- AC_DEFUN([AC_LIBTOOL_PROG_COMPILER_PIC]) -m4trace:/usr/share/aclocal/lt~obsolete.m4:64: -1- AC_DEFUN([AC_LIBTOOL_PROG_LD_SHLIBS]) -m4trace:/usr/share/aclocal/lt~obsolete.m4:65: -1- AC_DEFUN([AC_LIBTOOL_POSTDEP_PREDEP]) -m4trace:/usr/share/aclocal/lt~obsolete.m4:66: -1- AC_DEFUN([LT_AC_PROG_EGREP]) -m4trace:/usr/share/aclocal/lt~obsolete.m4:71: -1- AC_DEFUN([_AC_PROG_LIBTOOL]) -m4trace:/usr/share/aclocal/lt~obsolete.m4:72: -1- AC_DEFUN([AC_LIBTOOL_SETUP]) -m4trace:/usr/share/aclocal/lt~obsolete.m4:73: -1- AC_DEFUN([_LT_AC_CHECK_DLFCN]) -m4trace:/usr/share/aclocal/lt~obsolete.m4:74: -1- AC_DEFUN([AC_LIBTOOL_SYS_DYNAMIC_LINKER]) -m4trace:/usr/share/aclocal/lt~obsolete.m4:75: -1- AC_DEFUN([_LT_AC_TAGCONFIG]) -m4trace:/usr/share/aclocal/lt~obsolete.m4:77: -1- AC_DEFUN([_LT_AC_LANG_CXX]) -m4trace:/usr/share/aclocal/lt~obsolete.m4:78: -1- AC_DEFUN([_LT_AC_LANG_F77]) -m4trace:/usr/share/aclocal/lt~obsolete.m4:79: -1- AC_DEFUN([_LT_AC_LANG_GCJ]) -m4trace:/usr/share/aclocal/lt~obsolete.m4:80: -1- AC_DEFUN([AC_LIBTOOL_LANG_C_CONFIG]) -m4trace:/usr/share/aclocal/lt~obsolete.m4:81: -1- AC_DEFUN([_LT_AC_LANG_C_CONFIG]) -m4trace:/usr/share/aclocal/lt~obsolete.m4:82: -1- AC_DEFUN([AC_LIBTOOL_LANG_CXX_CONFIG]) -m4trace:/usr/share/aclocal/lt~obsolete.m4:83: -1- AC_DEFUN([_LT_AC_LANG_CXX_CONFIG]) -m4trace:/usr/share/aclocal/lt~obsolete.m4:84: -1- AC_DEFUN([AC_LIBTOOL_LANG_F77_CONFIG]) -m4trace:/usr/share/aclocal/lt~obsolete.m4:85: -1- AC_DEFUN([_LT_AC_LANG_F77_CONFIG]) -m4trace:/usr/share/aclocal/lt~obsolete.m4:86: -1- AC_DEFUN([AC_LIBTOOL_LANG_GCJ_CONFIG]) -m4trace:/usr/share/aclocal/lt~obsolete.m4:87: -1- AC_DEFUN([_LT_AC_LANG_GCJ_CONFIG]) -m4trace:/usr/share/aclocal/lt~obsolete.m4:88: -1- AC_DEFUN([AC_LIBTOOL_LANG_RC_CONFIG]) -m4trace:/usr/share/aclocal/lt~obsolete.m4:89: -1- AC_DEFUN([_LT_AC_LANG_RC_CONFIG]) -m4trace:/usr/share/aclocal/lt~obsolete.m4:90: -1- AC_DEFUN([AC_LIBTOOL_CONFIG]) -m4trace:/usr/share/aclocal/lt~obsolete.m4:91: -1- AC_DEFUN([_LT_AC_FILE_LTDLL_C]) -m4trace:/usr/share/aclocal/lt~obsolete.m4:93: -1- AC_DEFUN([_LT_AC_PROG_CXXCPP]) -m4trace:/usr/share/aclocal/lt~obsolete.m4:96: -1- AC_DEFUN([_LT_PROG_F77]) -m4trace:/usr/share/aclocal/lt~obsolete.m4:97: -1- AC_DEFUN([_LT_PROG_FC]) -m4trace:/usr/share/aclocal/lt~obsolete.m4:98: -1- AC_DEFUN([_LT_PROG_CXX]) -m4trace:/usr/share/aclocal-1.11/amversion.m4:17: -1- AC_DEFUN([AM_AUTOMAKE_VERSION], [am__api_version='1.11' -dnl Some users find AM_AUTOMAKE_VERSION and mistake it for a way to -dnl require some minimum version. Point them to the right macro. -m4_if([$1], [1.11.6], [], - [AC_FATAL([Do not call $0, use AM_INIT_AUTOMAKE([$1]).])])dnl -]) -m4trace:/usr/share/aclocal-1.11/amversion.m4:36: -1- AC_DEFUN([AM_SET_CURRENT_AUTOMAKE_VERSION], [AM_AUTOMAKE_VERSION([1.11.6])dnl -m4_ifndef([AC_AUTOCONF_VERSION], - [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl -_AM_AUTOCONF_VERSION(m4_defn([AC_AUTOCONF_VERSION]))]) -m4trace:/usr/share/aclocal-1.11/auxdir.m4:49: -1- AC_DEFUN([AM_AUX_DIR_EXPAND], [dnl Rely on autoconf to set up CDPATH properly. -AC_PREREQ([2.50])dnl -# expand $ac_aux_dir to an absolute path -am_aux_dir=`cd $ac_aux_dir && pwd` -]) -m4trace:/usr/share/aclocal-1.11/cond.m4:15: -1- AC_DEFUN([AM_CONDITIONAL], [AC_PREREQ(2.52)dnl - ifelse([$1], [TRUE], [AC_FATAL([$0: invalid condition: $1])], - [$1], [FALSE], [AC_FATAL([$0: invalid condition: $1])])dnl -AC_SUBST([$1_TRUE])dnl -AC_SUBST([$1_FALSE])dnl -_AM_SUBST_NOTMAKE([$1_TRUE])dnl -_AM_SUBST_NOTMAKE([$1_FALSE])dnl -m4_define([_AM_COND_VALUE_$1], [$2])dnl -if $2; then - $1_TRUE= - $1_FALSE='#' -else - $1_TRUE='#' - $1_FALSE= -fi -AC_CONFIG_COMMANDS_PRE( -[if test -z "${$1_TRUE}" && test -z "${$1_FALSE}"; then - AC_MSG_ERROR([[conditional "$1" was never defined. -Usually this means the macro was only invoked conditionally.]]) -fi])]) -m4trace:/usr/share/aclocal-1.11/depend.m4:28: -1- AC_DEFUN([_AM_DEPENDENCIES], [AC_REQUIRE([AM_SET_DEPDIR])dnl -AC_REQUIRE([AM_OUTPUT_DEPENDENCY_COMMANDS])dnl -AC_REQUIRE([AM_MAKE_INCLUDE])dnl -AC_REQUIRE([AM_DEP_TRACK])dnl - -ifelse([$1], CC, [depcc="$CC" am_compiler_list=], - [$1], CXX, [depcc="$CXX" am_compiler_list=], - [$1], OBJC, [depcc="$OBJC" am_compiler_list='gcc3 gcc'], - [$1], UPC, [depcc="$UPC" am_compiler_list=], - [$1], GCJ, [depcc="$GCJ" am_compiler_list='gcc3 gcc'], - [depcc="$$1" am_compiler_list=]) - -AC_CACHE_CHECK([dependency style of $depcc], - [am_cv_$1_dependencies_compiler_type], -[if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then - # We make a subdir and do the tests there. Otherwise we can end up - # making bogus files that we don't know about and never remove. For - # instance it was reported that on HP-UX the gcc test will end up - # making a dummy file named `D' -- because `-MD' means `put the output - # in D'. - rm -rf conftest.dir - mkdir conftest.dir - # Copy depcomp to subdir because otherwise we won't find it if we're - # using a relative directory. - cp "$am_depcomp" conftest.dir - cd conftest.dir - # We will build objects and dependencies in a subdirectory because - # it helps to detect inapplicable dependency modes. For instance - # both Tru64's cc and ICC support -MD to output dependencies as a - # side effect of compilation, but ICC will put the dependencies in - # the current directory while Tru64 will put them in the object - # directory. - mkdir sub - - am_cv_$1_dependencies_compiler_type=none - if test "$am_compiler_list" = ""; then - am_compiler_list=`sed -n ['s/^#*\([a-zA-Z0-9]*\))$/\1/p'] < ./depcomp` - fi - am__universal=false - m4_case([$1], [CC], - [case " $depcc " in #( - *\ -arch\ *\ -arch\ *) am__universal=true ;; - esac], - [CXX], - [case " $depcc " in #( - *\ -arch\ *\ -arch\ *) am__universal=true ;; - esac]) - - for depmode in $am_compiler_list; do - # Setup a source with many dependencies, because some compilers - # like to wrap large dependency lists on column 80 (with \), and - # we should not choose a depcomp mode which is confused by this. - # - # We need to recreate these files for each test, as the compiler may - # overwrite some of them when testing with obscure command lines. - # This happens at least with the AIX C compiler. - : > sub/conftest.c - for i in 1 2 3 4 5 6; do - echo '#include "conftst'$i'.h"' >> sub/conftest.c - # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with - # Solaris 8's {/usr,}/bin/sh. - touch sub/conftst$i.h - done - echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf - - # We check with `-c' and `-o' for the sake of the "dashmstdout" - # mode. It turns out that the SunPro C++ compiler does not properly - # handle `-M -o', and we need to detect this. Also, some Intel - # versions had trouble with output in subdirs - am__obj=sub/conftest.${OBJEXT-o} - am__minus_obj="-o $am__obj" - case $depmode in - gcc) - # This depmode causes a compiler race in universal mode. - test "$am__universal" = false || continue - ;; - nosideeffect) - # after this tag, mechanisms are not by side-effect, so they'll - # only be used when explicitly requested - if test "x$enable_dependency_tracking" = xyes; then - continue - else - break - fi - ;; - msvc7 | msvc7msys | msvisualcpp | msvcmsys) - # This compiler won't grok `-c -o', but also, the minuso test has - # not run yet. These depmodes are late enough in the game, and - # so weak that their functioning should not be impacted. - am__obj=conftest.${OBJEXT-o} - am__minus_obj= - ;; - none) break ;; - esac - if depmode=$depmode \ - source=sub/conftest.c object=$am__obj \ - depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ - $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ - >/dev/null 2>conftest.err && - grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && - grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && - grep $am__obj sub/conftest.Po > /dev/null 2>&1 && - ${MAKE-make} -s -f confmf > /dev/null 2>&1; then - # icc doesn't choke on unknown options, it will just issue warnings - # or remarks (even with -Werror). So we grep stderr for any message - # that says an option was ignored or not supported. - # When given -MP, icc 7.0 and 7.1 complain thusly: - # icc: Command line warning: ignoring option '-M'; no argument required - # The diagnosis changed in icc 8.0: - # icc: Command line remark: option '-MP' not supported - if (grep 'ignoring option' conftest.err || - grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else - am_cv_$1_dependencies_compiler_type=$depmode - break - fi - fi - done - - cd .. - rm -rf conftest.dir -else - am_cv_$1_dependencies_compiler_type=none -fi -]) -AC_SUBST([$1DEPMODE], [depmode=$am_cv_$1_dependencies_compiler_type]) -AM_CONDITIONAL([am__fastdep$1], [ - test "x$enable_dependency_tracking" != xno \ - && test "$am_cv_$1_dependencies_compiler_type" = gcc3]) -]) -m4trace:/usr/share/aclocal-1.11/depend.m4:164: -1- AC_DEFUN([AM_SET_DEPDIR], [AC_REQUIRE([AM_SET_LEADING_DOT])dnl -AC_SUBST([DEPDIR], ["${am__leading_dot}deps"])dnl -]) -m4trace:/usr/share/aclocal-1.11/depend.m4:172: -1- AC_DEFUN([AM_DEP_TRACK], [AC_ARG_ENABLE(dependency-tracking, -[ --disable-dependency-tracking speeds up one-time build - --enable-dependency-tracking do not reject slow dependency extractors]) -if test "x$enable_dependency_tracking" != xno; then - am_depcomp="$ac_aux_dir/depcomp" - AMDEPBACKSLASH='\' - am__nodep='_no' -fi -AM_CONDITIONAL([AMDEP], [test "x$enable_dependency_tracking" != xno]) -AC_SUBST([AMDEPBACKSLASH])dnl -_AM_SUBST_NOTMAKE([AMDEPBACKSLASH])dnl -AC_SUBST([am__nodep])dnl -_AM_SUBST_NOTMAKE([am__nodep])dnl -]) -m4trace:/usr/share/aclocal-1.11/depout.m4:14: -1- AC_DEFUN([_AM_OUTPUT_DEPENDENCY_COMMANDS], [{ - # Autoconf 2.62 quotes --file arguments for eval, but not when files - # are listed without --file. Let's play safe and only enable the eval - # if we detect the quoting. - case $CONFIG_FILES in - *\'*) eval set x "$CONFIG_FILES" ;; - *) set x $CONFIG_FILES ;; - esac - shift - for mf - do - # Strip MF so we end up with the name of the file. - mf=`echo "$mf" | sed -e 's/:.*$//'` - # Check whether this is an Automake generated Makefile or not. - # We used to match only the files named `Makefile.in', but - # some people rename them; so instead we look at the file content. - # Grep'ing the first line is not enough: some people post-process - # each Makefile.in and add a new line on top of each file to say so. - # Grep'ing the whole file is not good either: AIX grep has a line - # limit of 2048, but all sed's we know have understand at least 4000. - if sed -n 's,^#.*generated by automake.*,X,p' "$mf" | grep X >/dev/null 2>&1; then - dirpart=`AS_DIRNAME("$mf")` - else - continue - fi - # Extract the definition of DEPDIR, am__include, and am__quote - # from the Makefile without running `make'. - DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"` - test -z "$DEPDIR" && continue - am__include=`sed -n 's/^am__include = //p' < "$mf"` - test -z "am__include" && continue - am__quote=`sed -n 's/^am__quote = //p' < "$mf"` - # When using ansi2knr, U may be empty or an underscore; expand it - U=`sed -n 's/^U = //p' < "$mf"` - # Find all dependency output files, they are included files with - # $(DEPDIR) in their names. We invoke sed twice because it is the - # simplest approach to changing $(DEPDIR) to its actual value in the - # expansion. - for file in `sed -n " - s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \ - sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g' -e 's/\$U/'"$U"'/g'`; do - # Make sure the directory exists. - test -f "$dirpart/$file" && continue - fdir=`AS_DIRNAME(["$file"])` - AS_MKDIR_P([$dirpart/$fdir]) - # echo "creating $dirpart/$file" - echo '# dummy' > "$dirpart/$file" - done - done -} -]) -m4trace:/usr/share/aclocal-1.11/depout.m4:75: -1- AC_DEFUN([AM_OUTPUT_DEPENDENCY_COMMANDS], [AC_CONFIG_COMMANDS([depfiles], - [test x"$AMDEP_TRUE" != x"" || _AM_OUTPUT_DEPENDENCY_COMMANDS], - [AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir"]) -]) -m4trace:/usr/share/aclocal-1.11/init.m4:26: -1- AC_DEFUN([AM_INIT_AUTOMAKE], [AC_PREREQ([2.62])dnl -dnl Autoconf wants to disallow AM_ names. We explicitly allow -dnl the ones we care about. -m4_pattern_allow([^AM_[A-Z]+FLAGS$])dnl -AC_REQUIRE([AM_SET_CURRENT_AUTOMAKE_VERSION])dnl -AC_REQUIRE([AC_PROG_INSTALL])dnl -if test "`cd $srcdir && pwd`" != "`pwd`"; then - # Use -I$(srcdir) only when $(srcdir) != ., so that make's output - # is not polluted with repeated "-I." - AC_SUBST([am__isrc], [' -I$(srcdir)'])_AM_SUBST_NOTMAKE([am__isrc])dnl - # test to see if srcdir already configured - if test -f $srcdir/config.status; then - AC_MSG_ERROR([source directory already configured; run "make distclean" there first]) - fi -fi - -# test whether we have cygpath -if test -z "$CYGPATH_W"; then - if (cygpath --version) >/dev/null 2>/dev/null; then - CYGPATH_W='cygpath -w' - else - CYGPATH_W=echo - fi -fi -AC_SUBST([CYGPATH_W]) - -# Define the identity of the package. -dnl Distinguish between old-style and new-style calls. -m4_ifval([$2], -[m4_ifval([$3], [_AM_SET_OPTION([no-define])])dnl - AC_SUBST([PACKAGE], [$1])dnl - AC_SUBST([VERSION], [$2])], -[_AM_SET_OPTIONS([$1])dnl -dnl Diagnose old-style AC_INIT with new-style AM_AUTOMAKE_INIT. -m4_if(m4_ifdef([AC_PACKAGE_NAME], 1)m4_ifdef([AC_PACKAGE_VERSION], 1), 11,, - [m4_fatal([AC_INIT should be called with package and version arguments])])dnl - AC_SUBST([PACKAGE], ['AC_PACKAGE_TARNAME'])dnl - AC_SUBST([VERSION], ['AC_PACKAGE_VERSION'])])dnl - -_AM_IF_OPTION([no-define],, -[AC_DEFINE_UNQUOTED(PACKAGE, "$PACKAGE", [Name of package]) - AC_DEFINE_UNQUOTED(VERSION, "$VERSION", [Version number of package])])dnl - -# Some tools Automake needs. -AC_REQUIRE([AM_SANITY_CHECK])dnl -AC_REQUIRE([AC_ARG_PROGRAM])dnl -AM_MISSING_PROG(ACLOCAL, aclocal-${am__api_version}) -AM_MISSING_PROG(AUTOCONF, autoconf) -AM_MISSING_PROG(AUTOMAKE, automake-${am__api_version}) -AM_MISSING_PROG(AUTOHEADER, autoheader) -AM_MISSING_PROG(MAKEINFO, makeinfo) -AC_REQUIRE([AM_PROG_INSTALL_SH])dnl -AC_REQUIRE([AM_PROG_INSTALL_STRIP])dnl -AC_REQUIRE([AM_PROG_MKDIR_P])dnl -# We need awk for the "check" target. The system "awk" is bad on -# some platforms. -AC_REQUIRE([AC_PROG_AWK])dnl -AC_REQUIRE([AC_PROG_MAKE_SET])dnl -AC_REQUIRE([AM_SET_LEADING_DOT])dnl -_AM_IF_OPTION([tar-ustar], [_AM_PROG_TAR([ustar])], - [_AM_IF_OPTION([tar-pax], [_AM_PROG_TAR([pax])], - [_AM_PROG_TAR([v7])])]) -_AM_IF_OPTION([no-dependencies],, -[AC_PROVIDE_IFELSE([AC_PROG_CC], - [_AM_DEPENDENCIES(CC)], - [define([AC_PROG_CC], - defn([AC_PROG_CC])[_AM_DEPENDENCIES(CC)])])dnl -AC_PROVIDE_IFELSE([AC_PROG_CXX], - [_AM_DEPENDENCIES(CXX)], - [define([AC_PROG_CXX], - defn([AC_PROG_CXX])[_AM_DEPENDENCIES(CXX)])])dnl -AC_PROVIDE_IFELSE([AC_PROG_OBJC], - [_AM_DEPENDENCIES(OBJC)], - [define([AC_PROG_OBJC], - defn([AC_PROG_OBJC])[_AM_DEPENDENCIES(OBJC)])])dnl -]) -_AM_IF_OPTION([silent-rules], [AC_REQUIRE([AM_SILENT_RULES])])dnl -dnl The `parallel-tests' driver may need to know about EXEEXT, so add the -dnl `am__EXEEXT' conditional if _AM_COMPILER_EXEEXT was seen. This macro -dnl is hooked onto _AC_COMPILER_EXEEXT early, see below. -AC_CONFIG_COMMANDS_PRE(dnl -[m4_provide_if([_AM_COMPILER_EXEEXT], - [AM_CONDITIONAL([am__EXEEXT], [test -n "$EXEEXT"])])])dnl -]) -m4trace:/usr/share/aclocal-1.11/init.m4:126: -1- AC_DEFUN([_AC_AM_CONFIG_HEADER_HOOK], [# Compute $1's index in $config_headers. -_am_arg=$1 -_am_stamp_count=1 -for _am_header in $config_headers :; do - case $_am_header in - $_am_arg | $_am_arg:* ) - break ;; - * ) - _am_stamp_count=`expr $_am_stamp_count + 1` ;; - esac -done -echo "timestamp for $_am_arg" >`AS_DIRNAME(["$_am_arg"])`/stamp-h[]$_am_stamp_count]) -m4trace:/usr/share/aclocal-1.11/install-sh.m4:14: -1- AC_DEFUN([AM_PROG_INSTALL_SH], [AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl -if test x"${install_sh}" != xset; then - case $am_aux_dir in - *\ * | *\ *) - install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;; - *) - install_sh="\${SHELL} $am_aux_dir/install-sh" - esac -fi -AC_SUBST(install_sh)]) -m4trace:/usr/share/aclocal-1.11/lead-dot.m4:12: -1- AC_DEFUN([AM_SET_LEADING_DOT], [rm -rf .tst 2>/dev/null -mkdir .tst 2>/dev/null -if test -d .tst; then - am__leading_dot=. -else - am__leading_dot=_ -fi -rmdir .tst 2>/dev/null -AC_SUBST([am__leading_dot])]) -m4trace:/usr/share/aclocal-1.11/make.m4:14: -1- AC_DEFUN([AM_MAKE_INCLUDE], [am_make=${MAKE-make} -cat > confinc << 'END' -am__doit: - @echo this is the am__doit target -.PHONY: am__doit -END -# If we don't find an include directive, just comment out the code. -AC_MSG_CHECKING([for style of include used by $am_make]) -am__include="#" -am__quote= -_am_result=none -# First try GNU make style include. -echo "include confinc" > confmf -# Ignore all kinds of additional output from `make'. -case `$am_make -s -f confmf 2> /dev/null` in #( -*the\ am__doit\ target*) - am__include=include - am__quote= - _am_result=GNU - ;; -esac -# Now try BSD make style include. -if test "$am__include" = "#"; then - echo '.include "confinc"' > confmf - case `$am_make -s -f confmf 2> /dev/null` in #( - *the\ am__doit\ target*) - am__include=.include - am__quote="\"" - _am_result=BSD - ;; - esac -fi -AC_SUBST([am__include]) -AC_SUBST([am__quote]) -AC_MSG_RESULT([$_am_result]) -rm -f confinc confmf -]) -m4trace:/usr/share/aclocal-1.11/minuso.m4:14: -1- AC_DEFUN([AM_PROG_CC_C_O], [AC_REQUIRE([AC_PROG_CC_C_O])dnl -AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl -AC_REQUIRE_AUX_FILE([compile])dnl -# FIXME: we rely on the cache variable name because -# there is no other way. -set dummy $CC -am_cc=`echo $[2] | sed ['s/[^a-zA-Z0-9_]/_/g;s/^[0-9]/_/']` -eval am_t=\$ac_cv_prog_cc_${am_cc}_c_o -if test "$am_t" != yes; then - # Losing compiler, so override with the script. - # FIXME: It is wrong to rewrite CC. - # But if we don't then we get into trouble of one sort or another. - # A longer-term fix would be to have automake use am__CC in this case, - # and then we could set am__CC="\$(top_srcdir)/compile \$(CC)" - CC="$am_aux_dir/compile $CC" -fi -dnl Make sure AC_PROG_CC is never called again, or it will override our -dnl setting of CC. -m4_define([AC_PROG_CC], - [m4_fatal([AC_PROG_CC cannot be called after AM_PROG_CC_C_O])]) -]) -m4trace:/usr/share/aclocal-1.11/missing.m4:14: -1- AC_DEFUN([AM_MISSING_PROG], [AC_REQUIRE([AM_MISSING_HAS_RUN]) -$1=${$1-"${am_missing_run}$2"} -AC_SUBST($1)]) -m4trace:/usr/share/aclocal-1.11/missing.m4:24: -1- AC_DEFUN([AM_MISSING_HAS_RUN], [AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl -AC_REQUIRE_AUX_FILE([missing])dnl -if test x"${MISSING+set}" != xset; then - case $am_aux_dir in - *\ * | *\ *) - MISSING="\${SHELL} \"$am_aux_dir/missing\"" ;; - *) - MISSING="\${SHELL} $am_aux_dir/missing" ;; - esac -fi -# Use eval to expand $SHELL -if eval "$MISSING --run true"; then - am_missing_run="$MISSING --run " -else - am_missing_run= - AC_MSG_WARN([`missing' script is too old or missing]) -fi -]) -m4trace:/usr/share/aclocal-1.11/mkdirp.m4:14: -1- AC_DEFUN([AM_PROG_MKDIR_P], [AC_PREREQ([2.60])dnl -AC_REQUIRE([AC_PROG_MKDIR_P])dnl -dnl Automake 1.8 to 1.9.6 used to define mkdir_p. We now use MKDIR_P, -dnl while keeping a definition of mkdir_p for backward compatibility. -dnl @MKDIR_P@ is magic: AC_OUTPUT adjusts its value for each Makefile. -dnl However we cannot define mkdir_p as $(MKDIR_P) for the sake of -dnl Makefile.ins that do not define MKDIR_P, so we do our own -dnl adjustment using top_builddir (which is defined more often than -dnl MKDIR_P). -AC_SUBST([mkdir_p], ["$MKDIR_P"])dnl -case $mkdir_p in - [[\\/$]]* | ?:[[\\/]]*) ;; - */*) mkdir_p="\$(top_builddir)/$mkdir_p" ;; -esac -]) -m4trace:/usr/share/aclocal-1.11/options.m4:14: -1- AC_DEFUN([_AM_MANGLE_OPTION], [[_AM_OPTION_]m4_bpatsubst($1, [[^a-zA-Z0-9_]], [_])]) -m4trace:/usr/share/aclocal-1.11/options.m4:20: -1- AC_DEFUN([_AM_SET_OPTION], [m4_define(_AM_MANGLE_OPTION([$1]), 1)]) -m4trace:/usr/share/aclocal-1.11/options.m4:26: -1- AC_DEFUN([_AM_SET_OPTIONS], [m4_foreach_w([_AM_Option], [$1], [_AM_SET_OPTION(_AM_Option)])]) -m4trace:/usr/share/aclocal-1.11/options.m4:32: -1- AC_DEFUN([_AM_IF_OPTION], [m4_ifset(_AM_MANGLE_OPTION([$1]), [$2], [$3])]) -m4trace:/usr/share/aclocal-1.11/runlog.m4:14: -1- AC_DEFUN([AM_RUN_LOG], [{ echo "$as_me:$LINENO: $1" >&AS_MESSAGE_LOG_FD - ($1) >&AS_MESSAGE_LOG_FD 2>&AS_MESSAGE_LOG_FD - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&AS_MESSAGE_LOG_FD - (exit $ac_status); }]) -m4trace:/usr/share/aclocal-1.11/sanity.m4:14: -1- AC_DEFUN([AM_SANITY_CHECK], [AC_MSG_CHECKING([whether build environment is sane]) -# Just in case -sleep 1 -echo timestamp > conftest.file -# Reject unsafe characters in $srcdir or the absolute working directory -# name. Accept space and tab only in the latter. -am_lf=' -' -case `pwd` in - *[[\\\"\#\$\&\'\`$am_lf]]*) - AC_MSG_ERROR([unsafe absolute working directory name]);; -esac -case $srcdir in - *[[\\\"\#\$\&\'\`$am_lf\ \ ]]*) - AC_MSG_ERROR([unsafe srcdir value: `$srcdir']);; -esac - -# Do `set' in a subshell so we don't clobber the current shell's -# arguments. Must try -L first in case configure is actually a -# symlink; some systems play weird games with the mod time of symlinks -# (eg FreeBSD returns the mod time of the symlink's containing -# directory). -if ( - set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null` - if test "$[*]" = "X"; then - # -L didn't work. - set X `ls -t "$srcdir/configure" conftest.file` - fi - rm -f conftest.file - if test "$[*]" != "X $srcdir/configure conftest.file" \ - && test "$[*]" != "X conftest.file $srcdir/configure"; then - - # If neither matched, then we have a broken ls. This can happen - # if, for instance, CONFIG_SHELL is bash and it inherits a - # broken ls alias from the environment. This has actually - # happened. Such a system could not be considered "sane". - AC_MSG_ERROR([ls -t appears to fail. Make sure there is not a broken -alias in your environment]) - fi - - test "$[2]" = conftest.file - ) -then - # Ok. - : -else - AC_MSG_ERROR([newly created file is older than distributed files! -Check your system clock]) -fi -AC_MSG_RESULT(yes)]) -m4trace:/usr/share/aclocal-1.11/silent.m4:14: -1- AC_DEFUN([AM_SILENT_RULES], [AC_ARG_ENABLE([silent-rules], -[ --enable-silent-rules less verbose build output (undo: `make V=1') - --disable-silent-rules verbose build output (undo: `make V=0')]) -case $enable_silent_rules in -yes) AM_DEFAULT_VERBOSITY=0;; -no) AM_DEFAULT_VERBOSITY=1;; -*) AM_DEFAULT_VERBOSITY=m4_if([$1], [yes], [0], [1]);; -esac -dnl -dnl A few `make' implementations (e.g., NonStop OS and NextStep) -dnl do not support nested variable expansions. -dnl See automake bug#9928 and bug#10237. -am_make=${MAKE-make} -AC_CACHE_CHECK([whether $am_make supports nested variables], - [am_cv_make_support_nested_variables], - [if AS_ECHO([['TRUE=$(BAR$(V)) -BAR0=false -BAR1=true -V=1 -am__doit: - @$(TRUE) -.PHONY: am__doit']]) | $am_make -f - >/dev/null 2>&1; then - am_cv_make_support_nested_variables=yes -else - am_cv_make_support_nested_variables=no -fi]) -if test $am_cv_make_support_nested_variables = yes; then - dnl Using `$V' instead of `$(V)' breaks IRIX make. - AM_V='$(V)' - AM_DEFAULT_V='$(AM_DEFAULT_VERBOSITY)' -else - AM_V=$AM_DEFAULT_VERBOSITY - AM_DEFAULT_V=$AM_DEFAULT_VERBOSITY -fi -AC_SUBST([AM_V])dnl -AM_SUBST_NOTMAKE([AM_V])dnl -AC_SUBST([AM_DEFAULT_V])dnl -AM_SUBST_NOTMAKE([AM_DEFAULT_V])dnl -AC_SUBST([AM_DEFAULT_VERBOSITY])dnl -AM_BACKSLASH='\' -AC_SUBST([AM_BACKSLASH])dnl -_AM_SUBST_NOTMAKE([AM_BACKSLASH])dnl -]) -m4trace:/usr/share/aclocal-1.11/strip.m4:19: -1- AC_DEFUN([AM_PROG_INSTALL_STRIP], [AC_REQUIRE([AM_PROG_INSTALL_SH])dnl -# Installed binaries are usually stripped using `strip' when the user -# run `make install-strip'. However `strip' might not be the right -# tool to use in cross-compilation environments, therefore Automake -# will honor the `STRIP' environment variable to overrule this program. -dnl Don't test for $cross_compiling = yes, because it might be `maybe'. -if test "$cross_compiling" != no; then - AC_CHECK_TOOL([STRIP], [strip], :) -fi -INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s" -AC_SUBST([INSTALL_STRIP_PROGRAM])]) -m4trace:/usr/share/aclocal-1.11/substnot.m4:14: -1- AC_DEFUN([_AM_SUBST_NOTMAKE]) -m4trace:/usr/share/aclocal-1.11/substnot.m4:19: -1- AC_DEFUN([AM_SUBST_NOTMAKE], [_AM_SUBST_NOTMAKE($@)]) -m4trace:/usr/share/aclocal-1.11/tar.m4:24: -1- AC_DEFUN([_AM_PROG_TAR], [# Always define AMTAR for backward compatibility. Yes, it's still used -# in the wild :-( We should find a proper way to deprecate it ... -AC_SUBST([AMTAR], ['$${TAR-tar}']) -m4_if([$1], [v7], - [am__tar='$${TAR-tar} chof - "$$tardir"' am__untar='$${TAR-tar} xf -'], - [m4_case([$1], [ustar],, [pax],, - [m4_fatal([Unknown tar format])]) -AC_MSG_CHECKING([how to create a $1 tar archive]) -# Loop over all known methods to create a tar archive until one works. -_am_tools='gnutar m4_if([$1], [ustar], [plaintar]) pax cpio none' -_am_tools=${am_cv_prog_tar_$1-$_am_tools} -# Do not fold the above two line into one, because Tru64 sh and -# Solaris sh will not grok spaces in the rhs of `-'. -for _am_tool in $_am_tools -do - case $_am_tool in - gnutar) - for _am_tar in tar gnutar gtar; - do - AM_RUN_LOG([$_am_tar --version]) && break - done - am__tar="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$$tardir"' - am__tar_="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$tardir"' - am__untar="$_am_tar -xf -" - ;; - plaintar) - # Must skip GNU tar: if it does not support --format= it doesn't create - # ustar tarball either. - (tar --version) >/dev/null 2>&1 && continue - am__tar='tar chf - "$$tardir"' - am__tar_='tar chf - "$tardir"' - am__untar='tar xf -' - ;; - pax) - am__tar='pax -L -x $1 -w "$$tardir"' - am__tar_='pax -L -x $1 -w "$tardir"' - am__untar='pax -r' - ;; - cpio) - am__tar='find "$$tardir" -print | cpio -o -H $1 -L' - am__tar_='find "$tardir" -print | cpio -o -H $1 -L' - am__untar='cpio -i -H $1 -d' - ;; - none) - am__tar=false - am__tar_=false - am__untar=false - ;; - esac - - # If the value was cached, stop now. We just wanted to have am__tar - # and am__untar set. - test -n "${am_cv_prog_tar_$1}" && break - - # tar/untar a dummy directory, and stop if the command works - rm -rf conftest.dir - mkdir conftest.dir - echo GrepMe > conftest.dir/file - AM_RUN_LOG([tardir=conftest.dir && eval $am__tar_ >conftest.tar]) - rm -rf conftest.dir - if test -s conftest.tar; then - AM_RUN_LOG([$am__untar /dev/null 2>&1 && break - fi -done -rm -rf conftest.dir - -AC_CACHE_VAL([am_cv_prog_tar_$1], [am_cv_prog_tar_$1=$_am_tool]) -AC_MSG_RESULT([$am_cv_prog_tar_$1])]) -AC_SUBST([am__tar]) -AC_SUBST([am__untar]) -]) -m4trace:acinclude.m4:43: -1- AC_DEFUN([DX_FEATURE_doc], [ON]) -m4trace:acinclude.m4:44: -1- AC_DEFUN([DX_FEATURE_dot], [ON]) -m4trace:acinclude.m4:45: -1- AC_DEFUN([DX_FEATURE_man], [OFF]) -m4trace:acinclude.m4:46: -1- AC_DEFUN([DX_FEATURE_html], [ON]) -m4trace:acinclude.m4:47: -1- AC_DEFUN([DX_FEATURE_chm], [OFF]) -m4trace:acinclude.m4:48: -1- AC_DEFUN([DX_FEATURE_chi], [OFF]) -m4trace:acinclude.m4:49: -1- AC_DEFUN([DX_FEATURE_rtf], [OFF]) -m4trace:acinclude.m4:50: -1- AC_DEFUN([DX_FEATURE_xml], [OFF]) -m4trace:acinclude.m4:51: -1- AC_DEFUN([DX_FEATURE_pdf], [ON]) -m4trace:acinclude.m4:52: -1- AC_DEFUN([DX_FEATURE_ps], [ON]) -m4trace:acinclude.m4:61: -1- AC_DEFUN([DX_ENV_APPEND], [AC_SUBST([DX_ENV], ["$DX_ENV $1='$2'"])]) -m4trace:acinclude.m4:66: -1- AC_DEFUN([DX_DIRNAME_EXPR], [[expr ".$1" : '\(\.\)[^/]*$' \| "x$1" : 'x\(.*\)/[^/]*$']]) -m4trace:acinclude.m4:72: -1- AC_DEFUN([DX_IF_FEATURE], [ifelse(DX_FEATURE_$1, ON, [$2], [$3])]) -m4trace:acinclude.m4:77: -1- AC_DEFUN([DX_REQUIRE_PROG], [ -AC_PATH_TOOL([$1], [$2]) -if test "$DX_FLAG_$[DX_CURRENT_FEATURE$$1]" = 1; then - AC_MSG_WARN([$2 not found - will not DX_CURRENT_DESCRIPTION]) - AC_SUBST([DX_FLAG_]DX_CURRENT_FEATURE, 0) -fi -]) -m4trace:acinclude.m4:88: -1- AC_DEFUN([DX_TEST_FEATURE], [test "$DX_FLAG_$1" = 1]) -m4trace:acinclude.m4:94: -1- AC_DEFUN([DX_CHECK_DEPEND], [ -test "$DX_FLAG_$1" = "$2" \ -|| AC_MSG_ERROR([doxygen-DX_CURRENT_FEATURE ifelse([$2], 1, - requires, contradicts) doxygen-DX_CURRENT_FEATURE]) -]) -m4trace:acinclude.m4:103: -1- AC_DEFUN([DX_CLEAR_DEPEND], [ -test "$DX_FLAG_$1" = "$2" || AC_SUBST([DX_FLAG_]DX_CURRENT_FEATURE, 0) -]) -m4trace:acinclude.m4:117: -1- AC_DEFUN([DX_ARG_ABLE], [ - AC_DEFUN([DX_CURRENT_FEATURE], [$1]) - AC_DEFUN([DX_CURRENT_DESCRIPTION], [$2]) - AC_ARG_ENABLE(doxygen-$1, - [AS_HELP_STRING(DX_IF_FEATURE([$1], [--disable-doxygen-$1], - [--enable-doxygen-$1]), - DX_IF_FEATURE([$1], [don't $2], [$2]))], - [ -case "$enableval" in -#( -y|Y|yes|Yes|YES) - AC_SUBST([DX_FLAG_$1], 1) - $3 -;; #( -n|N|no|No|NO) - AC_SUBST([DX_FLAG_$1], 0) -;; #( -*) - AC_MSG_ERROR([invalid value '$enableval' given to doxygen-$1]) -;; -esac -], [ -AC_SUBST([DX_FLAG_$1], [DX_IF_FEATURE([$1], 1, 0)]) -$4 -]) -if DX_TEST_FEATURE([$1]); then - $5 - : -fi -if DX_TEST_FEATURE([$1]); then - AM_CONDITIONAL(DX_COND_$1, :) - $6 - : -else - AM_CONDITIONAL(DX_COND_$1, false) - $7 - : -fi -]) -m4trace:acinclude.m4:163: -1- AC_DEFUN([DX_DOXYGEN_FEATURE], [AC_DEFUN([DX_FEATURE_doc], [$1])]) -m4trace:acinclude.m4:164: -1- AC_DEFUN([DX_MAN_FEATURE], [AC_DEFUN([DX_FEATURE_man], [$1])]) -m4trace:acinclude.m4:165: -1- AC_DEFUN([DX_HTML_FEATURE], [AC_DEFUN([DX_FEATURE_html], [$1])]) -m4trace:acinclude.m4:166: -1- AC_DEFUN([DX_CHM_FEATURE], [AC_DEFUN([DX_FEATURE_chm], [$1])]) -m4trace:acinclude.m4:167: -1- AC_DEFUN([DX_CHI_FEATURE], [AC_DEFUN([DX_FEATURE_chi], [$1])]) -m4trace:acinclude.m4:168: -1- AC_DEFUN([DX_RTF_FEATURE], [AC_DEFUN([DX_FEATURE_rtf], [$1])]) -m4trace:acinclude.m4:169: -1- AC_DEFUN([DX_XML_FEATURE], [AC_DEFUN([DX_FEATURE_xml], [$1])]) -m4trace:acinclude.m4:170: -1- AC_DEFUN([DX_XML_FEATURE], [AC_DEFUN([DX_FEATURE_xml], [$1])]) -m4trace:acinclude.m4:171: -1- AC_DEFUN([DX_PDF_FEATURE], [AC_DEFUN([DX_FEATURE_pdf], [$1])]) -m4trace:acinclude.m4:172: -1- AC_DEFUN([DX_PS_FEATURE], [AC_DEFUN([DX_FEATURE_ps], [$1])]) -m4trace:acinclude.m4:178: -1- AC_DEFUN([DX_INIT_DOXYGEN], [ - -# Files: -AC_SUBST([DX_PROJECT], [$1]) -AC_SUBST([DX_CONFIG], [ifelse([$2], [], Doxyfile, [$2])]) -AC_SUBST([DX_DOCDIR], [ifelse([$3], [], doxygen-doc, [$3])]) - -# Environment variables used inside doxygen.cfg: -DX_ENV_APPEND(SRCDIR, $srcdir) -DX_ENV_APPEND(PROJECT, $DX_PROJECT) -DX_ENV_APPEND(DOCDIR, $DX_DOCDIR) -DX_ENV_APPEND(VERSION, $PACKAGE_VERSION) - -# Doxygen itself: -DX_ARG_ABLE(doc, [generate any doxygen documentation], - [], - [], - [DX_REQUIRE_PROG([DX_DOXYGEN], doxygen) - DX_REQUIRE_PROG([DX_PERL], perl)], - [DX_ENV_APPEND(PERL_PATH, $DX_PERL)]) - -# Dot for graphics: -DX_ARG_ABLE(dot, [generate graphics for doxygen documentation], - [DX_CHECK_DEPEND(doc, 1)], - [DX_CLEAR_DEPEND(doc, 1)], - [DX_REQUIRE_PROG([DX_DOT], dot)], - [DX_ENV_APPEND(HAVE_DOT, YES) - DX_ENV_APPEND(DOT_PATH, [`DX_DIRNAME_EXPR($DX_DOT)`])], - [DX_ENV_APPEND(HAVE_DOT, NO)]) - -# Man pages generation: -DX_ARG_ABLE(man, [generate doxygen manual pages], - [DX_CHECK_DEPEND(doc, 1)], - [DX_CLEAR_DEPEND(doc, 1)], - [], - [DX_ENV_APPEND(GENERATE_MAN, YES)], - [DX_ENV_APPEND(GENERATE_MAN, NO)]) - -# RTF file generation: -DX_ARG_ABLE(rtf, [generate doxygen RTF documentation], - [DX_CHECK_DEPEND(doc, 1)], - [DX_CLEAR_DEPEND(doc, 1)], - [], - [DX_ENV_APPEND(GENERATE_RTF, YES)], - [DX_ENV_APPEND(GENERATE_RTF, NO)]) - -# XML file generation: -DX_ARG_ABLE(xml, [generate doxygen XML documentation], - [DX_CHECK_DEPEND(doc, 1)], - [DX_CLEAR_DEPEND(doc, 1)], - [], - [DX_ENV_APPEND(GENERATE_XML, YES)], - [DX_ENV_APPEND(GENERATE_XML, NO)]) - -# (Compressed) HTML help generation: -DX_ARG_ABLE(chm, [generate doxygen compressed HTML help documentation], - [DX_CHECK_DEPEND(doc, 1)], - [DX_CLEAR_DEPEND(doc, 1)], - [DX_REQUIRE_PROG([DX_HHC], hhc)], - [DX_ENV_APPEND(HHC_PATH, $DX_HHC) - DX_ENV_APPEND(GENERATE_HTML, YES) - DX_ENV_APPEND(GENERATE_HTMLHELP, YES)], - [DX_ENV_APPEND(GENERATE_HTMLHELP, NO)]) - -# Seperate CHI file generation. -DX_ARG_ABLE(chi, [generate doxygen seperate compressed HTML help index file], - [DX_CHECK_DEPEND(chm, 1)], - [DX_CLEAR_DEPEND(chm, 1)], - [], - [DX_ENV_APPEND(GENERATE_CHI, YES)], - [DX_ENV_APPEND(GENERATE_CHI, NO)]) - -# Plain HTML pages generation: -DX_ARG_ABLE(html, [generate doxygen plain HTML documentation], - [DX_CHECK_DEPEND(doc, 1) DX_CHECK_DEPEND(chm, 0)], - [DX_CLEAR_DEPEND(doc, 1) DX_CLEAR_DEPEND(chm, 0)], - [], - [DX_ENV_APPEND(GENERATE_HTML, YES)], - [DX_TEST_FEATURE(chm) || DX_ENV_APPEND(GENERATE_HTML, NO)]) - -# PostScript file generation: -DX_ARG_ABLE(ps, [generate doxygen PostScript documentation], - [DX_CHECK_DEPEND(doc, 1)], - [DX_CLEAR_DEPEND(doc, 1)], - [DX_REQUIRE_PROG([DX_LATEX], latex) - DX_REQUIRE_PROG([DX_MAKEINDEX], makeindex) - DX_REQUIRE_PROG([DX_DVIPS], dvips) - DX_REQUIRE_PROG([DX_EGREP], egrep)]) - -# PDF file generation: -DX_ARG_ABLE(pdf, [generate doxygen PDF documentation], - [DX_CHECK_DEPEND(doc, 1)], - [DX_CLEAR_DEPEND(doc, 1)], - [DX_REQUIRE_PROG([DX_PDFLATEX], pdflatex) - DX_REQUIRE_PROG([DX_MAKEINDEX], makeindex) - DX_REQUIRE_PROG([DX_EGREP], egrep)]) - -# LaTeX generation for PS and/or PDF: -if DX_TEST_FEATURE(ps) || DX_TEST_FEATURE(pdf); then - AM_CONDITIONAL(DX_COND_latex, :) - DX_ENV_APPEND(GENERATE_LATEX, YES) -else - AM_CONDITIONAL(DX_COND_latex, false) - DX_ENV_APPEND(GENERATE_LATEX, NO) -fi - -# Paper size for PS and/or PDF: -AC_ARG_VAR(DOXYGEN_PAPER_SIZE, - [a4wide (default), a4, letter, legal or executive]) -case "$DOXYGEN_PAPER_SIZE" in -#( -"") - AC_SUBST(DOXYGEN_PAPER_SIZE, "") -;; #( -a4wide|a4|letter|legal|executive) - DX_ENV_APPEND(PAPER_SIZE, $DOXYGEN_PAPER_SIZE) -;; #( -*) - AC_MSG_ERROR([unknown DOXYGEN_PAPER_SIZE='$DOXYGEN_PAPER_SIZE']) -;; -esac - -#For debugging: -#echo DX_FLAG_doc=$DX_FLAG_doc -#echo DX_FLAG_dot=$DX_FLAG_dot -#echo DX_FLAG_man=$DX_FLAG_man -#echo DX_FLAG_html=$DX_FLAG_html -#echo DX_FLAG_chm=$DX_FLAG_chm -#echo DX_FLAG_chi=$DX_FLAG_chi -#echo DX_FLAG_rtf=$DX_FLAG_rtf -#echo DX_FLAG_xml=$DX_FLAG_xml -#echo DX_FLAG_pdf=$DX_FLAG_pdf -#echo DX_FLAG_ps=$DX_FLAG_ps -#echo DX_ENV=$DX_ENV -]) -m4trace:configure.ac:6: -1- m4_pattern_forbid([^_?A[CHUM]_]) -m4trace:configure.ac:6: -1- m4_pattern_forbid([_AC_]) -m4trace:configure.ac:6: -1- m4_pattern_forbid([^LIBOBJS$], [do not use LIBOBJS directly, use AC_LIBOBJ (see section `AC_LIBOBJ vs LIBOBJS']) -m4trace:configure.ac:6: -1- m4_pattern_allow([^AS_FLAGS$]) -m4trace:configure.ac:6: -1- m4_pattern_forbid([^_?m4_]) -m4trace:configure.ac:6: -1- m4_pattern_forbid([^dnl$]) -m4trace:configure.ac:6: -1- m4_pattern_forbid([^_?AS_]) -m4trace:configure.ac:6: -1- m4_pattern_allow([^SHELL$]) -m4trace:configure.ac:6: -1- m4_pattern_allow([^PATH_SEPARATOR$]) -m4trace:configure.ac:6: -1- m4_pattern_allow([^PACKAGE_NAME$]) -m4trace:configure.ac:6: -1- m4_pattern_allow([^PACKAGE_TARNAME$]) -m4trace:configure.ac:6: -1- m4_pattern_allow([^PACKAGE_VERSION$]) -m4trace:configure.ac:6: -1- m4_pattern_allow([^PACKAGE_STRING$]) -m4trace:configure.ac:6: -1- m4_pattern_allow([^PACKAGE_BUGREPORT$]) -m4trace:configure.ac:6: -1- m4_pattern_allow([^PACKAGE_URL$]) -m4trace:configure.ac:6: -1- m4_pattern_allow([^exec_prefix$]) -m4trace:configure.ac:6: -1- m4_pattern_allow([^prefix$]) -m4trace:configure.ac:6: -1- m4_pattern_allow([^program_transform_name$]) -m4trace:configure.ac:6: -1- m4_pattern_allow([^bindir$]) -m4trace:configure.ac:6: -1- m4_pattern_allow([^sbindir$]) -m4trace:configure.ac:6: -1- m4_pattern_allow([^libexecdir$]) -m4trace:configure.ac:6: -1- m4_pattern_allow([^datarootdir$]) -m4trace:configure.ac:6: -1- m4_pattern_allow([^datadir$]) -m4trace:configure.ac:6: -1- m4_pattern_allow([^sysconfdir$]) -m4trace:configure.ac:6: -1- m4_pattern_allow([^sharedstatedir$]) -m4trace:configure.ac:6: -1- m4_pattern_allow([^localstatedir$]) -m4trace:configure.ac:6: -1- m4_pattern_allow([^includedir$]) -m4trace:configure.ac:6: -1- m4_pattern_allow([^oldincludedir$]) -m4trace:configure.ac:6: -1- m4_pattern_allow([^docdir$]) -m4trace:configure.ac:6: -1- m4_pattern_allow([^infodir$]) -m4trace:configure.ac:6: -1- m4_pattern_allow([^htmldir$]) -m4trace:configure.ac:6: -1- m4_pattern_allow([^dvidir$]) -m4trace:configure.ac:6: -1- m4_pattern_allow([^pdfdir$]) -m4trace:configure.ac:6: -1- m4_pattern_allow([^psdir$]) -m4trace:configure.ac:6: -1- m4_pattern_allow([^libdir$]) -m4trace:configure.ac:6: -1- m4_pattern_allow([^localedir$]) -m4trace:configure.ac:6: -1- m4_pattern_allow([^mandir$]) -m4trace:configure.ac:6: -1- m4_pattern_allow([^PACKAGE_NAME$]) -m4trace:configure.ac:6: -1- m4_pattern_allow([^PACKAGE_TARNAME$]) -m4trace:configure.ac:6: -1- m4_pattern_allow([^PACKAGE_VERSION$]) -m4trace:configure.ac:6: -1- m4_pattern_allow([^PACKAGE_STRING$]) -m4trace:configure.ac:6: -1- m4_pattern_allow([^PACKAGE_BUGREPORT$]) -m4trace:configure.ac:6: -1- m4_pattern_allow([^PACKAGE_URL$]) -m4trace:configure.ac:6: -1- m4_pattern_allow([^DEFS$]) -m4trace:configure.ac:6: -1- m4_pattern_allow([^ECHO_C$]) -m4trace:configure.ac:6: -1- m4_pattern_allow([^ECHO_N$]) -m4trace:configure.ac:6: -1- m4_pattern_allow([^ECHO_T$]) -m4trace:configure.ac:6: -1- m4_pattern_allow([^LIBS$]) -m4trace:configure.ac:6: -1- m4_pattern_allow([^build_alias$]) -m4trace:configure.ac:6: -1- m4_pattern_allow([^host_alias$]) -m4trace:configure.ac:6: -1- m4_pattern_allow([^target_alias$]) -m4trace:configure.ac:14: -1- DX_HTML_FEATURE([ON]) -m4trace:configure.ac:14: -1- AC_DEFUN([DX_FEATURE_html], [ON]) -m4trace:configure.ac:15: -1- DX_CHM_FEATURE([OFF]) -m4trace:configure.ac:15: -1- AC_DEFUN([DX_FEATURE_chm], [OFF]) -m4trace:configure.ac:16: -1- DX_CHI_FEATURE([OFF]) -m4trace:configure.ac:16: -1- AC_DEFUN([DX_FEATURE_chi], [OFF]) -m4trace:configure.ac:17: -1- DX_MAN_FEATURE([OFF]) -m4trace:configure.ac:17: -1- AC_DEFUN([DX_FEATURE_man], [OFF]) -m4trace:configure.ac:18: -1- DX_RTF_FEATURE([OFF]) -m4trace:configure.ac:18: -1- AC_DEFUN([DX_FEATURE_rtf], [OFF]) -m4trace:configure.ac:19: -1- DX_XML_FEATURE([OFF]) -m4trace:configure.ac:19: -1- AC_DEFUN([DX_FEATURE_xml], [OFF]) -m4trace:configure.ac:20: -1- DX_PDF_FEATURE([OFF]) -m4trace:configure.ac:20: -1- AC_DEFUN([DX_FEATURE_pdf], [OFF]) -m4trace:configure.ac:21: -1- DX_PS_FEATURE([OFF]) -m4trace:configure.ac:21: -1- AC_DEFUN([DX_FEATURE_ps], [OFF]) -m4trace:configure.ac:22: -1- DX_INIT_DOXYGEN([zookeeper], [c-doc.Doxyfile], [docs]) -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_PROJECT$]) -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_CONFIG$]) -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_DOCDIR$]) -m4trace:configure.ac:22: -1- DX_ENV_APPEND([SRCDIR], [$srcdir]) -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_ENV$]) -m4trace:configure.ac:22: -1- DX_ENV_APPEND([PROJECT], [$DX_PROJECT]) -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_ENV$]) -m4trace:configure.ac:22: -1- DX_ENV_APPEND([DOCDIR], [$DX_DOCDIR]) -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_ENV$]) -m4trace:configure.ac:22: -1- DX_ENV_APPEND([VERSION], [$PACKAGE_VERSION]) -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_ENV$]) -m4trace:configure.ac:22: -1- DX_ARG_ABLE([doc], [generate any doxygen documentation], [], [], [DX_REQUIRE_PROG([DX_DOXYGEN], doxygen) - DX_REQUIRE_PROG([DX_PERL], perl)], [DX_ENV_APPEND(PERL_PATH, $DX_PERL)]) -m4trace:configure.ac:22: -1- AC_DEFUN([DX_CURRENT_FEATURE], [doc]) -m4trace:configure.ac:22: -1- AC_DEFUN([DX_CURRENT_DESCRIPTION], [generate any doxygen documentation]) -m4trace:configure.ac:22: -2- DX_IF_FEATURE([doc], [--disable-doxygen-doc], [--enable-doxygen-doc]) -m4trace:configure.ac:22: -3- DX_FEATURE_doc -m4trace:configure.ac:22: -2- DX_IF_FEATURE([doc], [don't generate any doxygen documentation], [generate any doxygen documentation]) -m4trace:configure.ac:22: -3- DX_FEATURE_doc -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_FLAG_doc$]) -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_FLAG_doc$]) -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_FLAG_doc$]) -m4trace:configure.ac:22: -1- DX_IF_FEATURE([doc], [1], [0]) -m4trace:configure.ac:22: -2- DX_FEATURE_doc -m4trace:configure.ac:22: -1- DX_TEST_FEATURE([doc]) -m4trace:configure.ac:22: -1- DX_REQUIRE_PROG([DX_DOXYGEN], [doxygen]) -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_DOXYGEN$]) -m4trace:configure.ac:22: -1- DX_CURRENT_DESCRIPTION -m4trace:configure.ac:22: -1- DX_CURRENT_DESCRIPTION -m4trace:configure.ac:22: -2- DX_CURRENT_FEATURE -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_FLAG_doc$]) -m4trace:configure.ac:22: -1- DX_REQUIRE_PROG([DX_PERL], [perl]) -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_PERL$]) -m4trace:configure.ac:22: -1- DX_CURRENT_DESCRIPTION -m4trace:configure.ac:22: -1- DX_CURRENT_DESCRIPTION -m4trace:configure.ac:22: -2- DX_CURRENT_FEATURE -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_FLAG_doc$]) -m4trace:configure.ac:22: -1- DX_TEST_FEATURE([doc]) -m4trace:configure.ac:22: -1- AM_CONDITIONAL([DX_COND_doc], [:]) -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_COND_doc_TRUE$]) -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_COND_doc_FALSE$]) -m4trace:configure.ac:22: -1- _AM_SUBST_NOTMAKE([DX_COND_doc_TRUE]) -m4trace:configure.ac:22: -1- _AM_SUBST_NOTMAKE([DX_COND_doc_FALSE]) -m4trace:configure.ac:22: -1- DX_ENV_APPEND([PERL_PATH], [$DX_PERL]) -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_ENV$]) -m4trace:configure.ac:22: -1- AM_CONDITIONAL([DX_COND_doc], [false]) -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_COND_doc_TRUE$]) -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_COND_doc_FALSE$]) -m4trace:configure.ac:22: -1- _AM_SUBST_NOTMAKE([DX_COND_doc_TRUE]) -m4trace:configure.ac:22: -1- _AM_SUBST_NOTMAKE([DX_COND_doc_FALSE]) -m4trace:configure.ac:22: -1- DX_ARG_ABLE([dot], [generate graphics for doxygen documentation], [DX_CHECK_DEPEND(doc, 1)], [DX_CLEAR_DEPEND(doc, 1)], [DX_REQUIRE_PROG([DX_DOT], dot)], [DX_ENV_APPEND(HAVE_DOT, YES) - DX_ENV_APPEND(DOT_PATH, [`DX_DIRNAME_EXPR($DX_DOT)`])], [DX_ENV_APPEND(HAVE_DOT, NO)]) -m4trace:configure.ac:22: -1- AC_DEFUN([DX_CURRENT_FEATURE], [dot]) -m4trace:configure.ac:22: -1- AC_DEFUN([DX_CURRENT_DESCRIPTION], [generate graphics for doxygen documentation]) -m4trace:configure.ac:22: -2- DX_IF_FEATURE([dot], [--disable-doxygen-dot], [--enable-doxygen-dot]) -m4trace:configure.ac:22: -3- DX_FEATURE_dot -m4trace:configure.ac:22: -2- DX_IF_FEATURE([dot], [don't generate graphics for doxygen documentation], [generate graphics for doxygen documentation]) -m4trace:configure.ac:22: -3- DX_FEATURE_dot -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_FLAG_dot$]) -m4trace:configure.ac:22: -1- DX_CHECK_DEPEND([doc], [1]) -m4trace:configure.ac:22: -1- DX_CURRENT_FEATURE -m4trace:configure.ac:22: -1- DX_CURRENT_FEATURE -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_FLAG_dot$]) -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_FLAG_dot$]) -m4trace:configure.ac:22: -1- DX_IF_FEATURE([dot], [1], [0]) -m4trace:configure.ac:22: -2- DX_FEATURE_dot -m4trace:configure.ac:22: -1- DX_CLEAR_DEPEND([doc], [1]) -m4trace:configure.ac:22: -2- DX_CURRENT_FEATURE -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_FLAG_dot$]) -m4trace:configure.ac:22: -1- DX_TEST_FEATURE([dot]) -m4trace:configure.ac:22: -1- DX_REQUIRE_PROG([DX_DOT], [dot]) -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_DOT$]) -m4trace:configure.ac:22: -1- DX_CURRENT_DESCRIPTION -m4trace:configure.ac:22: -1- DX_CURRENT_DESCRIPTION -m4trace:configure.ac:22: -2- DX_CURRENT_FEATURE -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_FLAG_dot$]) -m4trace:configure.ac:22: -1- DX_TEST_FEATURE([dot]) -m4trace:configure.ac:22: -1- AM_CONDITIONAL([DX_COND_dot], [:]) -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_COND_dot_TRUE$]) -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_COND_dot_FALSE$]) -m4trace:configure.ac:22: -1- _AM_SUBST_NOTMAKE([DX_COND_dot_TRUE]) -m4trace:configure.ac:22: -1- _AM_SUBST_NOTMAKE([DX_COND_dot_FALSE]) -m4trace:configure.ac:22: -1- DX_ENV_APPEND([HAVE_DOT], [YES]) -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_ENV$]) -m4trace:configure.ac:22: -1- DX_ENV_APPEND([DOT_PATH], [`DX_DIRNAME_EXPR($DX_DOT)`]) -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_ENV$]) -m4trace:configure.ac:22: -1- DX_DIRNAME_EXPR([$DX_DOT]) -m4trace:configure.ac:22: -1- AM_CONDITIONAL([DX_COND_dot], [false]) -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_COND_dot_TRUE$]) -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_COND_dot_FALSE$]) -m4trace:configure.ac:22: -1- _AM_SUBST_NOTMAKE([DX_COND_dot_TRUE]) -m4trace:configure.ac:22: -1- _AM_SUBST_NOTMAKE([DX_COND_dot_FALSE]) -m4trace:configure.ac:22: -1- DX_ENV_APPEND([HAVE_DOT], [NO]) -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_ENV$]) -m4trace:configure.ac:22: -1- DX_ARG_ABLE([man], [generate doxygen manual pages], [DX_CHECK_DEPEND(doc, 1)], [DX_CLEAR_DEPEND(doc, 1)], [], [DX_ENV_APPEND(GENERATE_MAN, YES)], [DX_ENV_APPEND(GENERATE_MAN, NO)]) -m4trace:configure.ac:22: -1- AC_DEFUN([DX_CURRENT_FEATURE], [man]) -m4trace:configure.ac:22: -1- AC_DEFUN([DX_CURRENT_DESCRIPTION], [generate doxygen manual pages]) -m4trace:configure.ac:22: -2- DX_IF_FEATURE([man], [--disable-doxygen-man], [--enable-doxygen-man]) -m4trace:configure.ac:22: -3- DX_FEATURE_man -m4trace:configure.ac:22: -2- DX_IF_FEATURE([man], [don't generate doxygen manual pages], [generate doxygen manual pages]) -m4trace:configure.ac:22: -3- DX_FEATURE_man -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_FLAG_man$]) -m4trace:configure.ac:22: -1- DX_CHECK_DEPEND([doc], [1]) -m4trace:configure.ac:22: -1- DX_CURRENT_FEATURE -m4trace:configure.ac:22: -1- DX_CURRENT_FEATURE -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_FLAG_man$]) -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_FLAG_man$]) -m4trace:configure.ac:22: -1- DX_IF_FEATURE([man], [1], [0]) -m4trace:configure.ac:22: -2- DX_FEATURE_man -m4trace:configure.ac:22: -1- DX_CLEAR_DEPEND([doc], [1]) -m4trace:configure.ac:22: -2- DX_CURRENT_FEATURE -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_FLAG_man$]) -m4trace:configure.ac:22: -1- DX_TEST_FEATURE([man]) -m4trace:configure.ac:22: -1- DX_TEST_FEATURE([man]) -m4trace:configure.ac:22: -1- AM_CONDITIONAL([DX_COND_man], [:]) -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_COND_man_TRUE$]) -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_COND_man_FALSE$]) -m4trace:configure.ac:22: -1- _AM_SUBST_NOTMAKE([DX_COND_man_TRUE]) -m4trace:configure.ac:22: -1- _AM_SUBST_NOTMAKE([DX_COND_man_FALSE]) -m4trace:configure.ac:22: -1- DX_ENV_APPEND([GENERATE_MAN], [YES]) -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_ENV$]) -m4trace:configure.ac:22: -1- AM_CONDITIONAL([DX_COND_man], [false]) -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_COND_man_TRUE$]) -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_COND_man_FALSE$]) -m4trace:configure.ac:22: -1- _AM_SUBST_NOTMAKE([DX_COND_man_TRUE]) -m4trace:configure.ac:22: -1- _AM_SUBST_NOTMAKE([DX_COND_man_FALSE]) -m4trace:configure.ac:22: -1- DX_ENV_APPEND([GENERATE_MAN], [NO]) -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_ENV$]) -m4trace:configure.ac:22: -1- DX_ARG_ABLE([rtf], [generate doxygen RTF documentation], [DX_CHECK_DEPEND(doc, 1)], [DX_CLEAR_DEPEND(doc, 1)], [], [DX_ENV_APPEND(GENERATE_RTF, YES)], [DX_ENV_APPEND(GENERATE_RTF, NO)]) -m4trace:configure.ac:22: -1- AC_DEFUN([DX_CURRENT_FEATURE], [rtf]) -m4trace:configure.ac:22: -1- AC_DEFUN([DX_CURRENT_DESCRIPTION], [generate doxygen RTF documentation]) -m4trace:configure.ac:22: -2- DX_IF_FEATURE([rtf], [--disable-doxygen-rtf], [--enable-doxygen-rtf]) -m4trace:configure.ac:22: -3- DX_FEATURE_rtf -m4trace:configure.ac:22: -2- DX_IF_FEATURE([rtf], [don't generate doxygen RTF documentation], [generate doxygen RTF documentation]) -m4trace:configure.ac:22: -3- DX_FEATURE_rtf -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_FLAG_rtf$]) -m4trace:configure.ac:22: -1- DX_CHECK_DEPEND([doc], [1]) -m4trace:configure.ac:22: -1- DX_CURRENT_FEATURE -m4trace:configure.ac:22: -1- DX_CURRENT_FEATURE -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_FLAG_rtf$]) -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_FLAG_rtf$]) -m4trace:configure.ac:22: -1- DX_IF_FEATURE([rtf], [1], [0]) -m4trace:configure.ac:22: -2- DX_FEATURE_rtf -m4trace:configure.ac:22: -1- DX_CLEAR_DEPEND([doc], [1]) -m4trace:configure.ac:22: -2- DX_CURRENT_FEATURE -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_FLAG_rtf$]) -m4trace:configure.ac:22: -1- DX_TEST_FEATURE([rtf]) -m4trace:configure.ac:22: -1- DX_TEST_FEATURE([rtf]) -m4trace:configure.ac:22: -1- AM_CONDITIONAL([DX_COND_rtf], [:]) -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_COND_rtf_TRUE$]) -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_COND_rtf_FALSE$]) -m4trace:configure.ac:22: -1- _AM_SUBST_NOTMAKE([DX_COND_rtf_TRUE]) -m4trace:configure.ac:22: -1- _AM_SUBST_NOTMAKE([DX_COND_rtf_FALSE]) -m4trace:configure.ac:22: -1- DX_ENV_APPEND([GENERATE_RTF], [YES]) -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_ENV$]) -m4trace:configure.ac:22: -1- AM_CONDITIONAL([DX_COND_rtf], [false]) -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_COND_rtf_TRUE$]) -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_COND_rtf_FALSE$]) -m4trace:configure.ac:22: -1- _AM_SUBST_NOTMAKE([DX_COND_rtf_TRUE]) -m4trace:configure.ac:22: -1- _AM_SUBST_NOTMAKE([DX_COND_rtf_FALSE]) -m4trace:configure.ac:22: -1- DX_ENV_APPEND([GENERATE_RTF], [NO]) -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_ENV$]) -m4trace:configure.ac:22: -1- DX_ARG_ABLE([xml], [generate doxygen XML documentation], [DX_CHECK_DEPEND(doc, 1)], [DX_CLEAR_DEPEND(doc, 1)], [], [DX_ENV_APPEND(GENERATE_XML, YES)], [DX_ENV_APPEND(GENERATE_XML, NO)]) -m4trace:configure.ac:22: -1- AC_DEFUN([DX_CURRENT_FEATURE], [xml]) -m4trace:configure.ac:22: -1- AC_DEFUN([DX_CURRENT_DESCRIPTION], [generate doxygen XML documentation]) -m4trace:configure.ac:22: -2- DX_IF_FEATURE([xml], [--disable-doxygen-xml], [--enable-doxygen-xml]) -m4trace:configure.ac:22: -3- DX_FEATURE_xml -m4trace:configure.ac:22: -2- DX_IF_FEATURE([xml], [don't generate doxygen XML documentation], [generate doxygen XML documentation]) -m4trace:configure.ac:22: -3- DX_FEATURE_xml -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_FLAG_xml$]) -m4trace:configure.ac:22: -1- DX_CHECK_DEPEND([doc], [1]) -m4trace:configure.ac:22: -1- DX_CURRENT_FEATURE -m4trace:configure.ac:22: -1- DX_CURRENT_FEATURE -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_FLAG_xml$]) -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_FLAG_xml$]) -m4trace:configure.ac:22: -1- DX_IF_FEATURE([xml], [1], [0]) -m4trace:configure.ac:22: -2- DX_FEATURE_xml -m4trace:configure.ac:22: -1- DX_CLEAR_DEPEND([doc], [1]) -m4trace:configure.ac:22: -2- DX_CURRENT_FEATURE -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_FLAG_xml$]) -m4trace:configure.ac:22: -1- DX_TEST_FEATURE([xml]) -m4trace:configure.ac:22: -1- DX_TEST_FEATURE([xml]) -m4trace:configure.ac:22: -1- AM_CONDITIONAL([DX_COND_xml], [:]) -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_COND_xml_TRUE$]) -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_COND_xml_FALSE$]) -m4trace:configure.ac:22: -1- _AM_SUBST_NOTMAKE([DX_COND_xml_TRUE]) -m4trace:configure.ac:22: -1- _AM_SUBST_NOTMAKE([DX_COND_xml_FALSE]) -m4trace:configure.ac:22: -1- DX_ENV_APPEND([GENERATE_XML], [YES]) -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_ENV$]) -m4trace:configure.ac:22: -1- AM_CONDITIONAL([DX_COND_xml], [false]) -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_COND_xml_TRUE$]) -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_COND_xml_FALSE$]) -m4trace:configure.ac:22: -1- _AM_SUBST_NOTMAKE([DX_COND_xml_TRUE]) -m4trace:configure.ac:22: -1- _AM_SUBST_NOTMAKE([DX_COND_xml_FALSE]) -m4trace:configure.ac:22: -1- DX_ENV_APPEND([GENERATE_XML], [NO]) -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_ENV$]) -m4trace:configure.ac:22: -1- DX_ARG_ABLE([chm], [generate doxygen compressed HTML help documentation], [DX_CHECK_DEPEND(doc, 1)], [DX_CLEAR_DEPEND(doc, 1)], [DX_REQUIRE_PROG([DX_HHC], hhc)], [DX_ENV_APPEND(HHC_PATH, $DX_HHC) - DX_ENV_APPEND(GENERATE_HTML, YES) - DX_ENV_APPEND(GENERATE_HTMLHELP, YES)], [DX_ENV_APPEND(GENERATE_HTMLHELP, NO)]) -m4trace:configure.ac:22: -1- AC_DEFUN([DX_CURRENT_FEATURE], [chm]) -m4trace:configure.ac:22: -1- AC_DEFUN([DX_CURRENT_DESCRIPTION], [generate doxygen compressed HTML help documentation]) -m4trace:configure.ac:22: -2- DX_IF_FEATURE([chm], [--disable-doxygen-chm], [--enable-doxygen-chm]) -m4trace:configure.ac:22: -3- DX_FEATURE_chm -m4trace:configure.ac:22: -2- DX_IF_FEATURE([chm], [don't generate doxygen compressed HTML help documentation], [generate doxygen compressed HTML help documentation]) -m4trace:configure.ac:22: -3- DX_FEATURE_chm -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_FLAG_chm$]) -m4trace:configure.ac:22: -1- DX_CHECK_DEPEND([doc], [1]) -m4trace:configure.ac:22: -1- DX_CURRENT_FEATURE -m4trace:configure.ac:22: -1- DX_CURRENT_FEATURE -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_FLAG_chm$]) -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_FLAG_chm$]) -m4trace:configure.ac:22: -1- DX_IF_FEATURE([chm], [1], [0]) -m4trace:configure.ac:22: -2- DX_FEATURE_chm -m4trace:configure.ac:22: -1- DX_CLEAR_DEPEND([doc], [1]) -m4trace:configure.ac:22: -2- DX_CURRENT_FEATURE -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_FLAG_chm$]) -m4trace:configure.ac:22: -1- DX_TEST_FEATURE([chm]) -m4trace:configure.ac:22: -1- DX_REQUIRE_PROG([DX_HHC], [hhc]) -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_HHC$]) -m4trace:configure.ac:22: -1- DX_CURRENT_DESCRIPTION -m4trace:configure.ac:22: -1- DX_CURRENT_DESCRIPTION -m4trace:configure.ac:22: -2- DX_CURRENT_FEATURE -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_FLAG_chm$]) -m4trace:configure.ac:22: -1- DX_TEST_FEATURE([chm]) -m4trace:configure.ac:22: -1- AM_CONDITIONAL([DX_COND_chm], [:]) -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_COND_chm_TRUE$]) -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_COND_chm_FALSE$]) -m4trace:configure.ac:22: -1- _AM_SUBST_NOTMAKE([DX_COND_chm_TRUE]) -m4trace:configure.ac:22: -1- _AM_SUBST_NOTMAKE([DX_COND_chm_FALSE]) -m4trace:configure.ac:22: -1- DX_ENV_APPEND([HHC_PATH], [$DX_HHC]) -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_ENV$]) -m4trace:configure.ac:22: -1- DX_ENV_APPEND([GENERATE_HTML], [YES]) -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_ENV$]) -m4trace:configure.ac:22: -1- DX_ENV_APPEND([GENERATE_HTMLHELP], [YES]) -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_ENV$]) -m4trace:configure.ac:22: -1- AM_CONDITIONAL([DX_COND_chm], [false]) -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_COND_chm_TRUE$]) -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_COND_chm_FALSE$]) -m4trace:configure.ac:22: -1- _AM_SUBST_NOTMAKE([DX_COND_chm_TRUE]) -m4trace:configure.ac:22: -1- _AM_SUBST_NOTMAKE([DX_COND_chm_FALSE]) -m4trace:configure.ac:22: -1- DX_ENV_APPEND([GENERATE_HTMLHELP], [NO]) -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_ENV$]) -m4trace:configure.ac:22: -1- DX_ARG_ABLE([chi], [generate doxygen seperate compressed HTML help index file], [DX_CHECK_DEPEND(chm, 1)], [DX_CLEAR_DEPEND(chm, 1)], [], [DX_ENV_APPEND(GENERATE_CHI, YES)], [DX_ENV_APPEND(GENERATE_CHI, NO)]) -m4trace:configure.ac:22: -1- AC_DEFUN([DX_CURRENT_FEATURE], [chi]) -m4trace:configure.ac:22: -1- AC_DEFUN([DX_CURRENT_DESCRIPTION], [generate doxygen seperate compressed HTML help index file]) -m4trace:configure.ac:22: -2- DX_IF_FEATURE([chi], [--disable-doxygen-chi], [--enable-doxygen-chi]) -m4trace:configure.ac:22: -3- DX_FEATURE_chi -m4trace:configure.ac:22: -2- DX_IF_FEATURE([chi], [don't generate doxygen seperate compressed HTML help index file], [generate doxygen seperate compressed HTML help index file]) -m4trace:configure.ac:22: -3- DX_FEATURE_chi -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_FLAG_chi$]) -m4trace:configure.ac:22: -1- DX_CHECK_DEPEND([chm], [1]) -m4trace:configure.ac:22: -1- DX_CURRENT_FEATURE -m4trace:configure.ac:22: -1- DX_CURRENT_FEATURE -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_FLAG_chi$]) -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_FLAG_chi$]) -m4trace:configure.ac:22: -1- DX_IF_FEATURE([chi], [1], [0]) -m4trace:configure.ac:22: -2- DX_FEATURE_chi -m4trace:configure.ac:22: -1- DX_CLEAR_DEPEND([chm], [1]) -m4trace:configure.ac:22: -2- DX_CURRENT_FEATURE -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_FLAG_chi$]) -m4trace:configure.ac:22: -1- DX_TEST_FEATURE([chi]) -m4trace:configure.ac:22: -1- DX_TEST_FEATURE([chi]) -m4trace:configure.ac:22: -1- AM_CONDITIONAL([DX_COND_chi], [:]) -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_COND_chi_TRUE$]) -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_COND_chi_FALSE$]) -m4trace:configure.ac:22: -1- _AM_SUBST_NOTMAKE([DX_COND_chi_TRUE]) -m4trace:configure.ac:22: -1- _AM_SUBST_NOTMAKE([DX_COND_chi_FALSE]) -m4trace:configure.ac:22: -1- DX_ENV_APPEND([GENERATE_CHI], [YES]) -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_ENV$]) -m4trace:configure.ac:22: -1- AM_CONDITIONAL([DX_COND_chi], [false]) -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_COND_chi_TRUE$]) -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_COND_chi_FALSE$]) -m4trace:configure.ac:22: -1- _AM_SUBST_NOTMAKE([DX_COND_chi_TRUE]) -m4trace:configure.ac:22: -1- _AM_SUBST_NOTMAKE([DX_COND_chi_FALSE]) -m4trace:configure.ac:22: -1- DX_ENV_APPEND([GENERATE_CHI], [NO]) -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_ENV$]) -m4trace:configure.ac:22: -1- DX_ARG_ABLE([html], [generate doxygen plain HTML documentation], [DX_CHECK_DEPEND(doc, 1) DX_CHECK_DEPEND(chm, 0)], [DX_CLEAR_DEPEND(doc, 1) DX_CLEAR_DEPEND(chm, 0)], [], [DX_ENV_APPEND(GENERATE_HTML, YES)], [DX_TEST_FEATURE(chm) || DX_ENV_APPEND(GENERATE_HTML, NO)]) -m4trace:configure.ac:22: -1- AC_DEFUN([DX_CURRENT_FEATURE], [html]) -m4trace:configure.ac:22: -1- AC_DEFUN([DX_CURRENT_DESCRIPTION], [generate doxygen plain HTML documentation]) -m4trace:configure.ac:22: -2- DX_IF_FEATURE([html], [--disable-doxygen-html], [--enable-doxygen-html]) -m4trace:configure.ac:22: -3- DX_FEATURE_html -m4trace:configure.ac:22: -2- DX_IF_FEATURE([html], [don't generate doxygen plain HTML documentation], [generate doxygen plain HTML documentation]) -m4trace:configure.ac:22: -3- DX_FEATURE_html -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_FLAG_html$]) -m4trace:configure.ac:22: -1- DX_CHECK_DEPEND([doc], [1]) -m4trace:configure.ac:22: -1- DX_CURRENT_FEATURE -m4trace:configure.ac:22: -1- DX_CURRENT_FEATURE -m4trace:configure.ac:22: -1- DX_CHECK_DEPEND([chm], [0]) -m4trace:configure.ac:22: -1- DX_CURRENT_FEATURE -m4trace:configure.ac:22: -1- DX_CURRENT_FEATURE -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_FLAG_html$]) -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_FLAG_html$]) -m4trace:configure.ac:22: -1- DX_IF_FEATURE([html], [1], [0]) -m4trace:configure.ac:22: -2- DX_FEATURE_html -m4trace:configure.ac:22: -1- DX_CLEAR_DEPEND([doc], [1]) -m4trace:configure.ac:22: -2- DX_CURRENT_FEATURE -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_FLAG_html$]) -m4trace:configure.ac:22: -1- DX_CLEAR_DEPEND([chm], [0]) -m4trace:configure.ac:22: -2- DX_CURRENT_FEATURE -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_FLAG_html$]) -m4trace:configure.ac:22: -1- DX_TEST_FEATURE([html]) -m4trace:configure.ac:22: -1- DX_TEST_FEATURE([html]) -m4trace:configure.ac:22: -1- AM_CONDITIONAL([DX_COND_html], [:]) -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_COND_html_TRUE$]) -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_COND_html_FALSE$]) -m4trace:configure.ac:22: -1- _AM_SUBST_NOTMAKE([DX_COND_html_TRUE]) -m4trace:configure.ac:22: -1- _AM_SUBST_NOTMAKE([DX_COND_html_FALSE]) -m4trace:configure.ac:22: -1- DX_ENV_APPEND([GENERATE_HTML], [YES]) -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_ENV$]) -m4trace:configure.ac:22: -1- AM_CONDITIONAL([DX_COND_html], [false]) -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_COND_html_TRUE$]) -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_COND_html_FALSE$]) -m4trace:configure.ac:22: -1- _AM_SUBST_NOTMAKE([DX_COND_html_TRUE]) -m4trace:configure.ac:22: -1- _AM_SUBST_NOTMAKE([DX_COND_html_FALSE]) -m4trace:configure.ac:22: -1- DX_TEST_FEATURE([chm]) -m4trace:configure.ac:22: -1- DX_ENV_APPEND([GENERATE_HTML], [NO]) -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_ENV$]) -m4trace:configure.ac:22: -1- DX_ARG_ABLE([ps], [generate doxygen PostScript documentation], [DX_CHECK_DEPEND(doc, 1)], [DX_CLEAR_DEPEND(doc, 1)], [DX_REQUIRE_PROG([DX_LATEX], latex) - DX_REQUIRE_PROG([DX_MAKEINDEX], makeindex) - DX_REQUIRE_PROG([DX_DVIPS], dvips) - DX_REQUIRE_PROG([DX_EGREP], egrep)]) -m4trace:configure.ac:22: -1- AC_DEFUN([DX_CURRENT_FEATURE], [ps]) -m4trace:configure.ac:22: -1- AC_DEFUN([DX_CURRENT_DESCRIPTION], [generate doxygen PostScript documentation]) -m4trace:configure.ac:22: -2- DX_IF_FEATURE([ps], [--disable-doxygen-ps], [--enable-doxygen-ps]) -m4trace:configure.ac:22: -3- DX_FEATURE_ps -m4trace:configure.ac:22: -2- DX_IF_FEATURE([ps], [don't generate doxygen PostScript documentation], [generate doxygen PostScript documentation]) -m4trace:configure.ac:22: -3- DX_FEATURE_ps -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_FLAG_ps$]) -m4trace:configure.ac:22: -1- DX_CHECK_DEPEND([doc], [1]) -m4trace:configure.ac:22: -1- DX_CURRENT_FEATURE -m4trace:configure.ac:22: -1- DX_CURRENT_FEATURE -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_FLAG_ps$]) -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_FLAG_ps$]) -m4trace:configure.ac:22: -1- DX_IF_FEATURE([ps], [1], [0]) -m4trace:configure.ac:22: -2- DX_FEATURE_ps -m4trace:configure.ac:22: -1- DX_CLEAR_DEPEND([doc], [1]) -m4trace:configure.ac:22: -2- DX_CURRENT_FEATURE -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_FLAG_ps$]) -m4trace:configure.ac:22: -1- DX_TEST_FEATURE([ps]) -m4trace:configure.ac:22: -1- DX_REQUIRE_PROG([DX_LATEX], [latex]) -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_LATEX$]) -m4trace:configure.ac:22: -1- DX_CURRENT_DESCRIPTION -m4trace:configure.ac:22: -1- DX_CURRENT_DESCRIPTION -m4trace:configure.ac:22: -2- DX_CURRENT_FEATURE -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_FLAG_ps$]) -m4trace:configure.ac:22: -1- DX_REQUIRE_PROG([DX_MAKEINDEX], [makeindex]) -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_MAKEINDEX$]) -m4trace:configure.ac:22: -1- DX_CURRENT_DESCRIPTION -m4trace:configure.ac:22: -1- DX_CURRENT_DESCRIPTION -m4trace:configure.ac:22: -2- DX_CURRENT_FEATURE -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_FLAG_ps$]) -m4trace:configure.ac:22: -1- DX_REQUIRE_PROG([DX_DVIPS], [dvips]) -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_DVIPS$]) -m4trace:configure.ac:22: -1- DX_CURRENT_DESCRIPTION -m4trace:configure.ac:22: -1- DX_CURRENT_DESCRIPTION -m4trace:configure.ac:22: -2- DX_CURRENT_FEATURE -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_FLAG_ps$]) -m4trace:configure.ac:22: -1- DX_REQUIRE_PROG([DX_EGREP], [egrep]) -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_EGREP$]) -m4trace:configure.ac:22: -1- DX_CURRENT_DESCRIPTION -m4trace:configure.ac:22: -1- DX_CURRENT_DESCRIPTION -m4trace:configure.ac:22: -2- DX_CURRENT_FEATURE -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_FLAG_ps$]) -m4trace:configure.ac:22: -1- DX_TEST_FEATURE([ps]) -m4trace:configure.ac:22: -1- AM_CONDITIONAL([DX_COND_ps], [:]) -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_COND_ps_TRUE$]) -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_COND_ps_FALSE$]) -m4trace:configure.ac:22: -1- _AM_SUBST_NOTMAKE([DX_COND_ps_TRUE]) -m4trace:configure.ac:22: -1- _AM_SUBST_NOTMAKE([DX_COND_ps_FALSE]) -m4trace:configure.ac:22: -1- AM_CONDITIONAL([DX_COND_ps], [false]) -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_COND_ps_TRUE$]) -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_COND_ps_FALSE$]) -m4trace:configure.ac:22: -1- _AM_SUBST_NOTMAKE([DX_COND_ps_TRUE]) -m4trace:configure.ac:22: -1- _AM_SUBST_NOTMAKE([DX_COND_ps_FALSE]) -m4trace:configure.ac:22: -1- DX_ARG_ABLE([pdf], [generate doxygen PDF documentation], [DX_CHECK_DEPEND(doc, 1)], [DX_CLEAR_DEPEND(doc, 1)], [DX_REQUIRE_PROG([DX_PDFLATEX], pdflatex) - DX_REQUIRE_PROG([DX_MAKEINDEX], makeindex) - DX_REQUIRE_PROG([DX_EGREP], egrep)]) -m4trace:configure.ac:22: -1- AC_DEFUN([DX_CURRENT_FEATURE], [pdf]) -m4trace:configure.ac:22: -1- AC_DEFUN([DX_CURRENT_DESCRIPTION], [generate doxygen PDF documentation]) -m4trace:configure.ac:22: -2- DX_IF_FEATURE([pdf], [--disable-doxygen-pdf], [--enable-doxygen-pdf]) -m4trace:configure.ac:22: -3- DX_FEATURE_pdf -m4trace:configure.ac:22: -2- DX_IF_FEATURE([pdf], [don't generate doxygen PDF documentation], [generate doxygen PDF documentation]) -m4trace:configure.ac:22: -3- DX_FEATURE_pdf -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_FLAG_pdf$]) -m4trace:configure.ac:22: -1- DX_CHECK_DEPEND([doc], [1]) -m4trace:configure.ac:22: -1- DX_CURRENT_FEATURE -m4trace:configure.ac:22: -1- DX_CURRENT_FEATURE -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_FLAG_pdf$]) -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_FLAG_pdf$]) -m4trace:configure.ac:22: -1- DX_IF_FEATURE([pdf], [1], [0]) -m4trace:configure.ac:22: -2- DX_FEATURE_pdf -m4trace:configure.ac:22: -1- DX_CLEAR_DEPEND([doc], [1]) -m4trace:configure.ac:22: -2- DX_CURRENT_FEATURE -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_FLAG_pdf$]) -m4trace:configure.ac:22: -1- DX_TEST_FEATURE([pdf]) -m4trace:configure.ac:22: -1- DX_REQUIRE_PROG([DX_PDFLATEX], [pdflatex]) -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_PDFLATEX$]) -m4trace:configure.ac:22: -1- DX_CURRENT_DESCRIPTION -m4trace:configure.ac:22: -1- DX_CURRENT_DESCRIPTION -m4trace:configure.ac:22: -2- DX_CURRENT_FEATURE -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_FLAG_pdf$]) -m4trace:configure.ac:22: -1- DX_REQUIRE_PROG([DX_MAKEINDEX], [makeindex]) -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_MAKEINDEX$]) -m4trace:configure.ac:22: -1- DX_CURRENT_DESCRIPTION -m4trace:configure.ac:22: -1- DX_CURRENT_DESCRIPTION -m4trace:configure.ac:22: -2- DX_CURRENT_FEATURE -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_FLAG_pdf$]) -m4trace:configure.ac:22: -1- DX_REQUIRE_PROG([DX_EGREP], [egrep]) -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_EGREP$]) -m4trace:configure.ac:22: -1- DX_CURRENT_DESCRIPTION -m4trace:configure.ac:22: -1- DX_CURRENT_DESCRIPTION -m4trace:configure.ac:22: -2- DX_CURRENT_FEATURE -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_FLAG_pdf$]) -m4trace:configure.ac:22: -1- DX_TEST_FEATURE([pdf]) -m4trace:configure.ac:22: -1- AM_CONDITIONAL([DX_COND_pdf], [:]) -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_COND_pdf_TRUE$]) -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_COND_pdf_FALSE$]) -m4trace:configure.ac:22: -1- _AM_SUBST_NOTMAKE([DX_COND_pdf_TRUE]) -m4trace:configure.ac:22: -1- _AM_SUBST_NOTMAKE([DX_COND_pdf_FALSE]) -m4trace:configure.ac:22: -1- AM_CONDITIONAL([DX_COND_pdf], [false]) -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_COND_pdf_TRUE$]) -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_COND_pdf_FALSE$]) -m4trace:configure.ac:22: -1- _AM_SUBST_NOTMAKE([DX_COND_pdf_TRUE]) -m4trace:configure.ac:22: -1- _AM_SUBST_NOTMAKE([DX_COND_pdf_FALSE]) -m4trace:configure.ac:22: -1- DX_TEST_FEATURE([ps]) -m4trace:configure.ac:22: -1- DX_TEST_FEATURE([pdf]) -m4trace:configure.ac:22: -1- AM_CONDITIONAL([DX_COND_latex], [:]) -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_COND_latex_TRUE$]) -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_COND_latex_FALSE$]) -m4trace:configure.ac:22: -1- _AM_SUBST_NOTMAKE([DX_COND_latex_TRUE]) -m4trace:configure.ac:22: -1- _AM_SUBST_NOTMAKE([DX_COND_latex_FALSE]) -m4trace:configure.ac:22: -1- DX_ENV_APPEND([GENERATE_LATEX], [YES]) -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_ENV$]) -m4trace:configure.ac:22: -1- AM_CONDITIONAL([DX_COND_latex], [false]) -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_COND_latex_TRUE$]) -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_COND_latex_FALSE$]) -m4trace:configure.ac:22: -1- _AM_SUBST_NOTMAKE([DX_COND_latex_TRUE]) -m4trace:configure.ac:22: -1- _AM_SUBST_NOTMAKE([DX_COND_latex_FALSE]) -m4trace:configure.ac:22: -1- DX_ENV_APPEND([GENERATE_LATEX], [NO]) -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_ENV$]) -m4trace:configure.ac:22: -1- m4_pattern_allow([^DOXYGEN_PAPER_SIZE$]) -m4trace:configure.ac:22: -1- m4_pattern_allow([^DOXYGEN_PAPER_SIZE$]) -m4trace:configure.ac:22: -1- DX_ENV_APPEND([PAPER_SIZE], [$DOXYGEN_PAPER_SIZE]) -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_ENV$]) -m4trace:configure.ac:25: -1- AM_INIT_AUTOMAKE([-Wall foreign]) -m4trace:configure.ac:25: -1- m4_pattern_allow([^AM_[A-Z]+FLAGS$]) -m4trace:configure.ac:25: -1- AM_SET_CURRENT_AUTOMAKE_VERSION -m4trace:configure.ac:25: -1- AM_AUTOMAKE_VERSION([1.11.6]) -m4trace:configure.ac:25: -1- _AM_AUTOCONF_VERSION([2.69]) -m4trace:configure.ac:25: -1- m4_pattern_allow([^INSTALL_PROGRAM$]) -m4trace:configure.ac:25: -1- m4_pattern_allow([^INSTALL_SCRIPT$]) -m4trace:configure.ac:25: -1- m4_pattern_allow([^INSTALL_DATA$]) -m4trace:configure.ac:25: -1- m4_pattern_allow([^am__isrc$]) -m4trace:configure.ac:25: -1- _AM_SUBST_NOTMAKE([am__isrc]) -m4trace:configure.ac:25: -1- m4_pattern_allow([^CYGPATH_W$]) -m4trace:configure.ac:25: -1- _AM_SET_OPTIONS([-Wall foreign]) -m4trace:configure.ac:25: -1- _AM_SET_OPTION([-Wall]) -m4trace:configure.ac:25: -2- _AM_MANGLE_OPTION([-Wall]) -m4trace:configure.ac:25: -1- _AM_SET_OPTION([foreign]) -m4trace:configure.ac:25: -2- _AM_MANGLE_OPTION([foreign]) -m4trace:configure.ac:25: -1- m4_pattern_allow([^PACKAGE$]) -m4trace:configure.ac:25: -1- m4_pattern_allow([^VERSION$]) -m4trace:configure.ac:25: -1- _AM_IF_OPTION([no-define], [], [AC_DEFINE_UNQUOTED(PACKAGE, "$PACKAGE", [Name of package]) - AC_DEFINE_UNQUOTED(VERSION, "$VERSION", [Version number of package])]) -m4trace:configure.ac:25: -2- _AM_MANGLE_OPTION([no-define]) -m4trace:configure.ac:25: -1- m4_pattern_allow([^PACKAGE$]) -m4trace:configure.ac:25: -1- m4_pattern_allow([^VERSION$]) -m4trace:configure.ac:25: -1- AM_SANITY_CHECK -m4trace:configure.ac:25: -1- AM_MISSING_PROG([ACLOCAL], [aclocal-${am__api_version}]) -m4trace:configure.ac:25: -1- AM_MISSING_HAS_RUN -m4trace:configure.ac:25: -1- AM_AUX_DIR_EXPAND -m4trace:configure.ac:25: -1- m4_pattern_allow([^ACLOCAL$]) -m4trace:configure.ac:25: -1- AM_MISSING_PROG([AUTOCONF], [autoconf]) -m4trace:configure.ac:25: -1- m4_pattern_allow([^AUTOCONF$]) -m4trace:configure.ac:25: -1- AM_MISSING_PROG([AUTOMAKE], [automake-${am__api_version}]) -m4trace:configure.ac:25: -1- m4_pattern_allow([^AUTOMAKE$]) -m4trace:configure.ac:25: -1- AM_MISSING_PROG([AUTOHEADER], [autoheader]) -m4trace:configure.ac:25: -1- m4_pattern_allow([^AUTOHEADER$]) -m4trace:configure.ac:25: -1- AM_MISSING_PROG([MAKEINFO], [makeinfo]) -m4trace:configure.ac:25: -1- m4_pattern_allow([^MAKEINFO$]) -m4trace:configure.ac:25: -1- AM_PROG_INSTALL_SH -m4trace:configure.ac:25: -1- m4_pattern_allow([^install_sh$]) -m4trace:configure.ac:25: -1- AM_PROG_INSTALL_STRIP -m4trace:configure.ac:25: -1- m4_pattern_allow([^STRIP$]) -m4trace:configure.ac:25: -1- m4_pattern_allow([^INSTALL_STRIP_PROGRAM$]) -m4trace:configure.ac:25: -1- AM_PROG_MKDIR_P -m4trace:configure.ac:25: -1- m4_pattern_allow([^MKDIR_P$]) -m4trace:configure.ac:25: -1- m4_pattern_allow([^mkdir_p$]) -m4trace:configure.ac:25: -1- m4_pattern_allow([^AWK$]) -m4trace:configure.ac:25: -1- m4_pattern_allow([^SET_MAKE$]) -m4trace:configure.ac:25: -1- AM_SET_LEADING_DOT -m4trace:configure.ac:25: -1- m4_pattern_allow([^am__leading_dot$]) -m4trace:configure.ac:25: -1- _AM_IF_OPTION([tar-ustar], [_AM_PROG_TAR([ustar])], [_AM_IF_OPTION([tar-pax], [_AM_PROG_TAR([pax])], - [_AM_PROG_TAR([v7])])]) -m4trace:configure.ac:25: -2- _AM_MANGLE_OPTION([tar-ustar]) -m4trace:configure.ac:25: -1- _AM_IF_OPTION([tar-pax], [_AM_PROG_TAR([pax])], [_AM_PROG_TAR([v7])]) -m4trace:configure.ac:25: -2- _AM_MANGLE_OPTION([tar-pax]) -m4trace:configure.ac:25: -1- _AM_PROG_TAR([v7]) -m4trace:configure.ac:25: -1- m4_pattern_allow([^AMTAR$]) -m4trace:configure.ac:25: -1- m4_pattern_allow([^am__tar$]) -m4trace:configure.ac:25: -1- m4_pattern_allow([^am__untar$]) -m4trace:configure.ac:25: -1- _AM_IF_OPTION([no-dependencies], [], [AC_PROVIDE_IFELSE([AC_PROG_CC], - [_AM_DEPENDENCIES(CC)], - [define([AC_PROG_CC], - defn([AC_PROG_CC])[_AM_DEPENDENCIES(CC)])])dnl -AC_PROVIDE_IFELSE([AC_PROG_CXX], - [_AM_DEPENDENCIES(CXX)], - [define([AC_PROG_CXX], - defn([AC_PROG_CXX])[_AM_DEPENDENCIES(CXX)])])dnl -AC_PROVIDE_IFELSE([AC_PROG_OBJC], - [_AM_DEPENDENCIES(OBJC)], - [define([AC_PROG_OBJC], - defn([AC_PROG_OBJC])[_AM_DEPENDENCIES(OBJC)])])dnl -]) -m4trace:configure.ac:25: -2- _AM_MANGLE_OPTION([no-dependencies]) -m4trace:configure.ac:25: -1- _AM_IF_OPTION([silent-rules], [AC_REQUIRE([AM_SILENT_RULES])]) -m4trace:configure.ac:25: -2- _AM_MANGLE_OPTION([silent-rules]) -m4trace:configure.ac:44: -1- _m4_warn([cross], [cannot check for file existence when cross compiling], [../../lib/autoconf/general.m4:2777: AC_CHECK_FILE is expanded from... -../../lib/autoconf/general.m4:2808: AC_CHECK_FILES is expanded from... -configure.ac:44: the top level]) -m4trace:configure.ac:44: -1- m4_pattern_allow([^HAVE_GENERATED_ZOOKEEPER_JUTE_C$]) -m4trace:configure.ac:44: -1- _m4_warn([cross], [cannot check for file existence when cross compiling], [../../lib/autoconf/general.m4:2777: AC_CHECK_FILE is expanded from... -../../lib/autoconf/general.m4:2808: AC_CHECK_FILES is expanded from... -configure.ac:44: the top level]) -m4trace:configure.ac:44: -1- m4_pattern_allow([^HAVE_GENERATED_ZOOKEEPER_JUTE_H$]) -m4trace:configure.ac:48: -1- m4_pattern_allow([^CPPUNIT_CFLAGS$]) -m4trace:configure.ac:50: -1- m4_pattern_allow([^CC$]) -m4trace:configure.ac:50: -1- m4_pattern_allow([^CFLAGS$]) -m4trace:configure.ac:50: -1- m4_pattern_allow([^LDFLAGS$]) -m4trace:configure.ac:50: -1- m4_pattern_allow([^LIBS$]) -m4trace:configure.ac:50: -1- m4_pattern_allow([^CPPFLAGS$]) -m4trace:configure.ac:50: -1- m4_pattern_allow([^CC$]) -m4trace:configure.ac:50: -1- m4_pattern_allow([^CC$]) -m4trace:configure.ac:50: -1- m4_pattern_allow([^CC$]) -m4trace:configure.ac:50: -1- m4_pattern_allow([^CC$]) -m4trace:configure.ac:50: -1- m4_pattern_allow([^ac_ct_CC$]) -m4trace:configure.ac:50: -1- m4_pattern_allow([^EXEEXT$]) -m4trace:configure.ac:50: -1- m4_pattern_allow([^OBJEXT$]) -m4trace:configure.ac:50: -1- _AM_DEPENDENCIES([CC]) -m4trace:configure.ac:50: -1- AM_SET_DEPDIR -m4trace:configure.ac:50: -1- m4_pattern_allow([^DEPDIR$]) -m4trace:configure.ac:50: -1- AM_OUTPUT_DEPENDENCY_COMMANDS -m4trace:configure.ac:50: -1- AM_MAKE_INCLUDE -m4trace:configure.ac:50: -1- m4_pattern_allow([^am__include$]) -m4trace:configure.ac:50: -1- m4_pattern_allow([^am__quote$]) -m4trace:configure.ac:50: -1- AM_DEP_TRACK -m4trace:configure.ac:50: -1- AM_CONDITIONAL([AMDEP], [test "x$enable_dependency_tracking" != xno]) -m4trace:configure.ac:50: -1- m4_pattern_allow([^AMDEP_TRUE$]) -m4trace:configure.ac:50: -1- m4_pattern_allow([^AMDEP_FALSE$]) -m4trace:configure.ac:50: -1- _AM_SUBST_NOTMAKE([AMDEP_TRUE]) -m4trace:configure.ac:50: -1- _AM_SUBST_NOTMAKE([AMDEP_FALSE]) -m4trace:configure.ac:50: -1- m4_pattern_allow([^AMDEPBACKSLASH$]) -m4trace:configure.ac:50: -1- _AM_SUBST_NOTMAKE([AMDEPBACKSLASH]) -m4trace:configure.ac:50: -1- m4_pattern_allow([^am__nodep$]) -m4trace:configure.ac:50: -1- _AM_SUBST_NOTMAKE([am__nodep]) -m4trace:configure.ac:50: -1- m4_pattern_allow([^CCDEPMODE$]) -m4trace:configure.ac:50: -1- AM_CONDITIONAL([am__fastdepCC], [ - test "x$enable_dependency_tracking" != xno \ - && test "$am_cv_CC_dependencies_compiler_type" = gcc3]) -m4trace:configure.ac:50: -1- m4_pattern_allow([^am__fastdepCC_TRUE$]) -m4trace:configure.ac:50: -1- m4_pattern_allow([^am__fastdepCC_FALSE$]) -m4trace:configure.ac:50: -1- _AM_SUBST_NOTMAKE([am__fastdepCC_TRUE]) -m4trace:configure.ac:50: -1- _AM_SUBST_NOTMAKE([am__fastdepCC_FALSE]) -m4trace:configure.ac:51: -1- AM_PROG_CC_C_O -m4trace:configure.ac:51: -1- m4_pattern_allow([^NO_MINUS_C_MINUS_O$]) -m4trace:configure.ac:52: -1- m4_pattern_allow([^CXX$]) -m4trace:configure.ac:52: -1- m4_pattern_allow([^CXXFLAGS$]) -m4trace:configure.ac:52: -1- m4_pattern_allow([^LDFLAGS$]) -m4trace:configure.ac:52: -1- m4_pattern_allow([^LIBS$]) -m4trace:configure.ac:52: -1- m4_pattern_allow([^CPPFLAGS$]) -m4trace:configure.ac:52: -1- m4_pattern_allow([^CXX$]) -m4trace:configure.ac:52: -1- m4_pattern_allow([^ac_ct_CXX$]) -m4trace:configure.ac:52: -1- _AM_DEPENDENCIES([CXX]) -m4trace:configure.ac:52: -1- m4_pattern_allow([^CXXDEPMODE$]) -m4trace:configure.ac:52: -1- AM_CONDITIONAL([am__fastdepCXX], [ - test "x$enable_dependency_tracking" != xno \ - && test "$am_cv_CXX_dependencies_compiler_type" = gcc3]) -m4trace:configure.ac:52: -1- m4_pattern_allow([^am__fastdepCXX_TRUE$]) -m4trace:configure.ac:52: -1- m4_pattern_allow([^am__fastdepCXX_FALSE$]) -m4trace:configure.ac:52: -1- _AM_SUBST_NOTMAKE([am__fastdepCXX_TRUE]) -m4trace:configure.ac:52: -1- _AM_SUBST_NOTMAKE([am__fastdepCXX_FALSE]) -m4trace:configure.ac:54: -1- m4_pattern_allow([^LN_S$]) -m4trace:configure.ac:57: -1- AC_PROG_LIBTOOL -m4trace:configure.ac:57: -1- _m4_warn([obsolete], [The macro `AC_PROG_LIBTOOL' is obsolete. -You should run autoupdate.], [/usr/share/aclocal/libtool.m4:107: AC_PROG_LIBTOOL is expanded from... -configure.ac:57: the top level]) -m4trace:configure.ac:57: -1- LT_INIT -m4trace:configure.ac:57: -1- m4_pattern_forbid([^_?LT_[A-Z_]+$]) -m4trace:configure.ac:57: -1- m4_pattern_allow([^(_LT_EOF|LT_DLGLOBAL|LT_DLLAZY_OR_NOW|LT_MULTI_MODULE)$]) -m4trace:configure.ac:57: -1- LTOPTIONS_VERSION -m4trace:configure.ac:57: -1- LTSUGAR_VERSION -m4trace:configure.ac:57: -1- LTVERSION_VERSION -m4trace:configure.ac:57: -1- LTOBSOLETE_VERSION -m4trace:configure.ac:57: -1- _LT_PROG_LTMAIN -m4trace:configure.ac:57: -1- m4_pattern_allow([^LIBTOOL$]) -m4trace:configure.ac:57: -1- m4_pattern_allow([^build$]) -m4trace:configure.ac:57: -1- m4_pattern_allow([^build_cpu$]) -m4trace:configure.ac:57: -1- m4_pattern_allow([^build_vendor$]) -m4trace:configure.ac:57: -1- m4_pattern_allow([^build_os$]) -m4trace:configure.ac:57: -1- m4_pattern_allow([^host$]) -m4trace:configure.ac:57: -1- m4_pattern_allow([^host_cpu$]) -m4trace:configure.ac:57: -1- m4_pattern_allow([^host_vendor$]) -m4trace:configure.ac:57: -1- m4_pattern_allow([^host_os$]) -m4trace:configure.ac:57: -1- _LT_PREPARE_SED_QUOTE_VARS -m4trace:configure.ac:57: -1- _LT_PROG_ECHO_BACKSLASH -m4trace:configure.ac:57: -1- LT_PATH_LD -m4trace:configure.ac:57: -1- m4_pattern_allow([^SED$]) -m4trace:configure.ac:57: -1- AC_PROG_EGREP -m4trace:configure.ac:57: -1- m4_pattern_allow([^GREP$]) -m4trace:configure.ac:57: -1- m4_pattern_allow([^EGREP$]) -m4trace:configure.ac:57: -1- m4_pattern_allow([^FGREP$]) -m4trace:configure.ac:57: -1- m4_pattern_allow([^GREP$]) -m4trace:configure.ac:57: -1- m4_pattern_allow([^LD$]) -m4trace:configure.ac:57: -1- LT_PATH_NM -m4trace:configure.ac:57: -1- m4_pattern_allow([^DUMPBIN$]) -m4trace:configure.ac:57: -1- m4_pattern_allow([^ac_ct_DUMPBIN$]) -m4trace:configure.ac:57: -1- m4_pattern_allow([^DUMPBIN$]) -m4trace:configure.ac:57: -1- m4_pattern_allow([^NM$]) -m4trace:configure.ac:57: -1- LT_CMD_MAX_LEN -m4trace:configure.ac:57: -1- m4_pattern_allow([^OBJDUMP$]) -m4trace:configure.ac:57: -1- m4_pattern_allow([^OBJDUMP$]) -m4trace:configure.ac:57: -1- m4_pattern_allow([^DLLTOOL$]) -m4trace:configure.ac:57: -1- m4_pattern_allow([^DLLTOOL$]) -m4trace:configure.ac:57: -1- m4_pattern_allow([^AR$]) -m4trace:configure.ac:57: -1- m4_pattern_allow([^ac_ct_AR$]) -m4trace:configure.ac:57: -1- m4_pattern_allow([^STRIP$]) -m4trace:configure.ac:57: -1- m4_pattern_allow([^RANLIB$]) -m4trace:configure.ac:57: -1- _LT_WITH_SYSROOT -m4trace:configure.ac:57: -1- m4_pattern_allow([LT_OBJDIR]) -m4trace:configure.ac:57: -1- m4_pattern_allow([^LT_OBJDIR$]) -m4trace:configure.ac:57: -1- _LT_CC_BASENAME([$compiler]) -m4trace:configure.ac:57: -1- _LT_PATH_TOOL_PREFIX([${ac_tool_prefix}file], [/usr/bin$PATH_SEPARATOR$PATH]) -m4trace:configure.ac:57: -1- _LT_PATH_TOOL_PREFIX([file], [/usr/bin$PATH_SEPARATOR$PATH]) -m4trace:configure.ac:57: -1- LT_SUPPORTED_TAG([CC]) -m4trace:configure.ac:57: -1- _LT_COMPILER_BOILERPLATE -m4trace:configure.ac:57: -1- _LT_LINKER_BOILERPLATE -m4trace:configure.ac:57: -1- _LT_COMPILER_OPTION([if $compiler supports -fno-rtti -fno-exceptions], [lt_cv_prog_compiler_rtti_exceptions], [-fno-rtti -fno-exceptions], [], [_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, )="$_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, ) -fno-rtti -fno-exceptions"]) -m4trace:configure.ac:57: -1- _LT_COMPILER_OPTION([if $compiler PIC flag $_LT_TAGVAR(lt_prog_compiler_pic, ) works], [_LT_TAGVAR(lt_cv_prog_compiler_pic_works, )], [$_LT_TAGVAR(lt_prog_compiler_pic, )@&t@m4_if([],[],[ -DPIC],[m4_if([],[CXX],[ -DPIC],[])])], [], [case $_LT_TAGVAR(lt_prog_compiler_pic, ) in - "" | " "*) ;; - *) _LT_TAGVAR(lt_prog_compiler_pic, )=" $_LT_TAGVAR(lt_prog_compiler_pic, )" ;; - esac], [_LT_TAGVAR(lt_prog_compiler_pic, )= - _LT_TAGVAR(lt_prog_compiler_can_build_shared, )=no]) -m4trace:configure.ac:57: -1- _LT_LINKER_OPTION([if $compiler static flag $lt_tmp_static_flag works], [lt_cv_prog_compiler_static_works], [$lt_tmp_static_flag], [], [_LT_TAGVAR(lt_prog_compiler_static, )=]) -m4trace:configure.ac:57: -1- m4_pattern_allow([^MANIFEST_TOOL$]) -m4trace:configure.ac:57: -1- _LT_REQUIRED_DARWIN_CHECKS -m4trace:configure.ac:57: -1- m4_pattern_allow([^DSYMUTIL$]) -m4trace:configure.ac:57: -1- m4_pattern_allow([^NMEDIT$]) -m4trace:configure.ac:57: -1- m4_pattern_allow([^LIPO$]) -m4trace:configure.ac:57: -1- m4_pattern_allow([^OTOOL$]) -m4trace:configure.ac:57: -1- m4_pattern_allow([^OTOOL64$]) -m4trace:configure.ac:57: -1- _LT_LINKER_OPTION([if $CC understands -b], [lt_cv_prog_compiler__b], [-b], [_LT_TAGVAR(archive_cmds, )='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'], [_LT_TAGVAR(archive_cmds, )='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags']) -m4trace:configure.ac:57: -1- LT_SYS_DLOPEN_SELF -m4trace:configure.ac:57: -1- m4_pattern_allow([^CPP$]) -m4trace:configure.ac:57: -1- m4_pattern_allow([^CPPFLAGS$]) -m4trace:configure.ac:57: -1- m4_pattern_allow([^CPP$]) -m4trace:configure.ac:57: -1- m4_pattern_allow([^STDC_HEADERS$]) -m4trace:configure.ac:57: -1- m4_pattern_allow([^HAVE_DLFCN_H$]) -m4trace:configure.ac:57: -1- LT_LANG([CXX]) -m4trace:configure.ac:57: -1- LT_SUPPORTED_TAG([CXX]) -m4trace:configure.ac:57: -1- m4_pattern_allow([^CXXCPP$]) -m4trace:configure.ac:57: -1- m4_pattern_allow([^CPPFLAGS$]) -m4trace:configure.ac:57: -1- m4_pattern_allow([^CXXCPP$]) -m4trace:configure.ac:57: -1- _LT_COMPILER_BOILERPLATE -m4trace:configure.ac:57: -1- _LT_LINKER_BOILERPLATE -m4trace:configure.ac:57: -1- _LT_CC_BASENAME([$compiler]) -m4trace:configure.ac:57: -1- LT_PATH_LD -m4trace:configure.ac:57: -1- m4_pattern_allow([^LD$]) -m4trace:configure.ac:57: -1- _LT_COMPILER_OPTION([if $compiler PIC flag $_LT_TAGVAR(lt_prog_compiler_pic, CXX) works], [_LT_TAGVAR(lt_cv_prog_compiler_pic_works, CXX)], [$_LT_TAGVAR(lt_prog_compiler_pic, CXX)@&t@m4_if([CXX],[],[ -DPIC],[m4_if([CXX],[CXX],[ -DPIC],[])])], [], [case $_LT_TAGVAR(lt_prog_compiler_pic, CXX) in - "" | " "*) ;; - *) _LT_TAGVAR(lt_prog_compiler_pic, CXX)=" $_LT_TAGVAR(lt_prog_compiler_pic, CXX)" ;; - esac], [_LT_TAGVAR(lt_prog_compiler_pic, CXX)= - _LT_TAGVAR(lt_prog_compiler_can_build_shared, CXX)=no]) -m4trace:configure.ac:57: -1- _LT_LINKER_OPTION([if $compiler static flag $lt_tmp_static_flag works], [lt_cv_prog_compiler_static_works_CXX], [$lt_tmp_static_flag], [], [_LT_TAGVAR(lt_prog_compiler_static, CXX)=]) -m4trace:configure.ac:106: -1- AM_CONDITIONAL([WANT_SYNCAPI], [test "x$with_syncapi" != xno]) -m4trace:configure.ac:106: -1- m4_pattern_allow([^WANT_SYNCAPI_TRUE$]) -m4trace:configure.ac:106: -1- m4_pattern_allow([^WANT_SYNCAPI_FALSE$]) -m4trace:configure.ac:106: -1- _AM_SUBST_NOTMAKE([WANT_SYNCAPI_TRUE]) -m4trace:configure.ac:106: -1- _AM_SUBST_NOTMAKE([WANT_SYNCAPI_FALSE]) -m4trace:configure.ac:109: -1- m4_pattern_allow([^STDC_HEADERS$]) -m4trace:configure.ac:113: -1- m4_pattern_allow([^const$]) -m4trace:configure.ac:115: -1- m4_pattern_allow([^TIME_WITH_SYS_TIME$]) -m4trace:configure.ac:116: -1- m4_pattern_allow([^POLL_NFDS_TYPE$]) -m4trace:configure.ac:116: -1- m4_pattern_allow([^POLL_NFDS_TYPE$]) -m4trace:configure.ac:123: -1- _m4_warn([obsolete], [The macro `AC_TRY_RUN' is obsolete. -You should run autoupdate.], [../../lib/autoconf/general.m4:2764: AC_TRY_RUN is expanded from... -configure.ac:123: the top level]) -m4trace:configure.ac:142: -1- m4_pattern_allow([^USEIPV6$]) -m4trace:configure.ac:149: -1- m4_pattern_allow([^LIB@&t@OBJS$]) -m4trace:configure.ac:149: -1- m4_pattern_allow([^LTLIBOBJS$]) -m4trace:configure.ac:149: -1- AM_CONDITIONAL([am__EXEEXT], [test -n "$EXEEXT"]) -m4trace:configure.ac:149: -1- m4_pattern_allow([^am__EXEEXT_TRUE$]) -m4trace:configure.ac:149: -1- m4_pattern_allow([^am__EXEEXT_FALSE$]) -m4trace:configure.ac:149: -1- _AM_SUBST_NOTMAKE([am__EXEEXT_TRUE]) -m4trace:configure.ac:149: -1- _AM_SUBST_NOTMAKE([am__EXEEXT_FALSE]) -m4trace:configure.ac:149: -1- _AC_AM_CONFIG_HEADER_HOOK(["$ac_file"]) -m4trace:configure.ac:149: -1- _AM_OUTPUT_DEPENDENCY_COMMANDS -m4trace:configure.ac:149: -1- _LT_PROG_LTMAIN diff --git a/pkg/registry/zookeeper-3.4.6/src/c/autom4te.cache/traces.3 b/pkg/registry/zookeeper-3.4.6/src/c/autom4te.cache/traces.3 deleted file mode 100644 index 2d2d182e3..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/c/autom4te.cache/traces.3 +++ /dev/null @@ -1,3272 +0,0 @@ -m4trace:/usr/share/aclocal/argz.m4:12: -1- AC_DEFUN([gl_FUNC_ARGZ], [gl_PREREQ_ARGZ - -AC_CHECK_HEADERS([argz.h], [], [], [AC_INCLUDES_DEFAULT]) - -AC_CHECK_TYPES([error_t], - [], - [AC_DEFINE([error_t], [int], - [Define to a type to use for `error_t' if it is not otherwise available.]) - AC_DEFINE([__error_t_defined], [1], [Define so that glibc/gnulib argp.h - does not typedef error_t.])], - [#if defined(HAVE_ARGZ_H) -# include -#endif]) - -ARGZ_H= -AC_CHECK_FUNCS([argz_add argz_append argz_count argz_create_sep argz_insert \ - argz_next argz_stringify], [], [ARGZ_H=argz.h; AC_LIBOBJ([argz])]) - -dnl if have system argz functions, allow forced use of -dnl libltdl-supplied implementation (and default to do so -dnl on "known bad" systems). Could use a runtime check, but -dnl (a) detecting malloc issues is notoriously unreliable -dnl (b) only known system that declares argz functions, -dnl provides them, yet they are broken, is cygwin -dnl releases prior to 16-Mar-2007 (1.5.24 and earlier) -dnl So, it's more straightforward simply to special case -dnl this for known bad systems. -AS_IF([test -z "$ARGZ_H"], - [AC_CACHE_CHECK( - [if argz actually works], - [lt_cv_sys_argz_works], - [[case $host_os in #( - *cygwin*) - lt_cv_sys_argz_works=no - if test "$cross_compiling" != no; then - lt_cv_sys_argz_works="guessing no" - else - lt_sed_extract_leading_digits='s/^\([0-9\.]*\).*/\1/' - save_IFS=$IFS - IFS=-. - set x `uname -r | sed -e "$lt_sed_extract_leading_digits"` - IFS=$save_IFS - lt_os_major=${2-0} - lt_os_minor=${3-0} - lt_os_micro=${4-0} - if test "$lt_os_major" -gt 1 \ - || { test "$lt_os_major" -eq 1 \ - && { test "$lt_os_minor" -gt 5 \ - || { test "$lt_os_minor" -eq 5 \ - && test "$lt_os_micro" -gt 24; }; }; }; then - lt_cv_sys_argz_works=yes - fi - fi - ;; #( - *) lt_cv_sys_argz_works=yes ;; - esac]]) - AS_IF([test "$lt_cv_sys_argz_works" = yes], - [AC_DEFINE([HAVE_WORKING_ARGZ], 1, - [This value is set to 1 to indicate that the system argz facility works])], - [ARGZ_H=argz.h - AC_LIBOBJ([argz])])]) - -AC_SUBST([ARGZ_H]) -]) -m4trace:/usr/share/aclocal/argz.m4:79: -1- AC_DEFUN([gl_PREREQ_ARGZ], [:]) -m4trace:/usr/share/aclocal/cppunit.m4:4: -1- AC_DEFUN([AM_PATH_CPPUNIT], [ - -AC_ARG_WITH(cppunit-prefix,[ --with-cppunit-prefix=PFX Prefix where CppUnit is installed (optional)], - cppunit_config_prefix="$withval", cppunit_config_prefix="") -AC_ARG_WITH(cppunit-exec-prefix,[ --with-cppunit-exec-prefix=PFX Exec prefix where CppUnit is installed (optional)], - cppunit_config_exec_prefix="$withval", cppunit_config_exec_prefix="") - - if test x$cppunit_config_exec_prefix != x ; then - cppunit_config_args="$cppunit_config_args --exec-prefix=$cppunit_config_exec_prefix" - if test x${CPPUNIT_CONFIG+set} != xset ; then - CPPUNIT_CONFIG=$cppunit_config_exec_prefix/bin/cppunit-config - fi - fi - if test x$cppunit_config_prefix != x ; then - cppunit_config_args="$cppunit_config_args --prefix=$cppunit_config_prefix" - if test x${CPPUNIT_CONFIG+set} != xset ; then - CPPUNIT_CONFIG=$cppunit_config_prefix/bin/cppunit-config - fi - fi - - AC_PATH_PROG(CPPUNIT_CONFIG, cppunit-config, no) - cppunit_version_min=$1 - - AC_MSG_CHECKING(for Cppunit - version >= $cppunit_version_min) - no_cppunit="" - if test "$CPPUNIT_CONFIG" = "no" ; then - AC_MSG_RESULT(no) - no_cppunit=yes - else - CPPUNIT_CFLAGS=`$CPPUNIT_CONFIG --cflags` - CPPUNIT_LIBS=`$CPPUNIT_CONFIG --libs` - cppunit_version=`$CPPUNIT_CONFIG --version` - - cppunit_major_version=`echo $cppunit_version | \ - sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\1/'` - cppunit_minor_version=`echo $cppunit_version | \ - sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\2/'` - cppunit_micro_version=`echo $cppunit_version | \ - sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\3/'` - - cppunit_major_min=`echo $cppunit_version_min | \ - sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\1/'` - if test "x${cppunit_major_min}" = "x" ; then - cppunit_major_min=0 - fi - - cppunit_minor_min=`echo $cppunit_version_min | \ - sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\2/'` - if test "x${cppunit_minor_min}" = "x" ; then - cppunit_minor_min=0 - fi - - cppunit_micro_min=`echo $cppunit_version_min | \ - sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\3/'` - if test "x${cppunit_micro_min}" = "x" ; then - cppunit_micro_min=0 - fi - - cppunit_version_proper=`expr \ - $cppunit_major_version \> $cppunit_major_min \| \ - $cppunit_major_version \= $cppunit_major_min \& \ - $cppunit_minor_version \> $cppunit_minor_min \| \ - $cppunit_major_version \= $cppunit_major_min \& \ - $cppunit_minor_version \= $cppunit_minor_min \& \ - $cppunit_micro_version \>= $cppunit_micro_min ` - - if test "$cppunit_version_proper" = "1" ; then - AC_MSG_RESULT([$cppunit_major_version.$cppunit_minor_version.$cppunit_micro_version]) - else - AC_MSG_RESULT(no) - no_cppunit=yes - fi - fi - - if test "x$no_cppunit" = x ; then - ifelse([$2], , :, [$2]) - else - CPPUNIT_CFLAGS="" - CPPUNIT_LIBS="" - ifelse([$3], , :, [$3]) - fi - - AC_SUBST(CPPUNIT_CFLAGS) - AC_SUBST(CPPUNIT_LIBS) -]) -m4trace:/usr/share/aclocal/libtool.m4:69: -1- AC_DEFUN([LT_INIT], [AC_PREREQ([2.58])dnl We use AC_INCLUDES_DEFAULT -AC_REQUIRE([AC_CONFIG_AUX_DIR_DEFAULT])dnl -AC_BEFORE([$0], [LT_LANG])dnl -AC_BEFORE([$0], [LT_OUTPUT])dnl -AC_BEFORE([$0], [LTDL_INIT])dnl -m4_require([_LT_CHECK_BUILDDIR])dnl - -dnl Autoconf doesn't catch unexpanded LT_ macros by default: -m4_pattern_forbid([^_?LT_[A-Z_]+$])dnl -m4_pattern_allow([^(_LT_EOF|LT_DLGLOBAL|LT_DLLAZY_OR_NOW|LT_MULTI_MODULE)$])dnl -dnl aclocal doesn't pull ltoptions.m4, ltsugar.m4, or ltversion.m4 -dnl unless we require an AC_DEFUNed macro: -AC_REQUIRE([LTOPTIONS_VERSION])dnl -AC_REQUIRE([LTSUGAR_VERSION])dnl -AC_REQUIRE([LTVERSION_VERSION])dnl -AC_REQUIRE([LTOBSOLETE_VERSION])dnl -m4_require([_LT_PROG_LTMAIN])dnl - -_LT_SHELL_INIT([SHELL=${CONFIG_SHELL-/bin/sh}]) - -dnl Parse OPTIONS -_LT_SET_OPTIONS([$0], [$1]) - -# This can be used to rebuild libtool when needed -LIBTOOL_DEPS="$ltmain" - -# Always use our own libtool. -LIBTOOL='$(SHELL) $(top_builddir)/libtool' -AC_SUBST(LIBTOOL)dnl - -_LT_SETUP - -# Only expand once: -m4_define([LT_INIT]) -]) -m4trace:/usr/share/aclocal/libtool.m4:107: -1- AU_DEFUN([AC_PROG_LIBTOOL], [m4_if($#, 0, [LT_INIT], [LT_INIT($@)])]) -m4trace:/usr/share/aclocal/libtool.m4:107: -1- AC_DEFUN([AC_PROG_LIBTOOL], [AC_DIAGNOSE([obsolete], [The macro `AC_PROG_LIBTOOL' is obsolete. -You should run autoupdate.])dnl -m4_if($#, 0, [LT_INIT], [LT_INIT($@)])]) -m4trace:/usr/share/aclocal/libtool.m4:108: -1- AU_DEFUN([AM_PROG_LIBTOOL], [m4_if($#, 0, [LT_INIT], [LT_INIT($@)])]) -m4trace:/usr/share/aclocal/libtool.m4:108: -1- AC_DEFUN([AM_PROG_LIBTOOL], [AC_DIAGNOSE([obsolete], [The macro `AM_PROG_LIBTOOL' is obsolete. -You should run autoupdate.])dnl -m4_if($#, 0, [LT_INIT], [LT_INIT($@)])]) -m4trace:/usr/share/aclocal/libtool.m4:609: -1- AC_DEFUN([LT_OUTPUT], [: ${CONFIG_LT=./config.lt} -AC_MSG_NOTICE([creating $CONFIG_LT]) -_LT_GENERATED_FILE_INIT(["$CONFIG_LT"], -[# Run this file to recreate a libtool stub with the current configuration.]) - -cat >>"$CONFIG_LT" <<\_LTEOF -lt_cl_silent=false -exec AS_MESSAGE_LOG_FD>>config.log -{ - echo - AS_BOX([Running $as_me.]) -} >&AS_MESSAGE_LOG_FD - -lt_cl_help="\ -\`$as_me' creates a local libtool stub from the current configuration, -for use in further configure time tests before the real libtool is -generated. - -Usage: $[0] [[OPTIONS]] - - -h, --help print this help, then exit - -V, --version print version number, then exit - -q, --quiet do not print progress messages - -d, --debug don't remove temporary files - -Report bugs to ." - -lt_cl_version="\ -m4_ifset([AC_PACKAGE_NAME], [AC_PACKAGE_NAME ])config.lt[]dnl -m4_ifset([AC_PACKAGE_VERSION], [ AC_PACKAGE_VERSION]) -configured by $[0], generated by m4_PACKAGE_STRING. - -Copyright (C) 2011 Free Software Foundation, Inc. -This config.lt script is free software; the Free Software Foundation -gives unlimited permision to copy, distribute and modify it." - -while test $[#] != 0 -do - case $[1] in - --version | --v* | -V ) - echo "$lt_cl_version"; exit 0 ;; - --help | --h* | -h ) - echo "$lt_cl_help"; exit 0 ;; - --debug | --d* | -d ) - debug=: ;; - --quiet | --q* | --silent | --s* | -q ) - lt_cl_silent=: ;; - - -*) AC_MSG_ERROR([unrecognized option: $[1] -Try \`$[0] --help' for more information.]) ;; - - *) AC_MSG_ERROR([unrecognized argument: $[1] -Try \`$[0] --help' for more information.]) ;; - esac - shift -done - -if $lt_cl_silent; then - exec AS_MESSAGE_FD>/dev/null -fi -_LTEOF - -cat >>"$CONFIG_LT" <<_LTEOF -_LT_OUTPUT_LIBTOOL_COMMANDS_INIT -_LTEOF - -cat >>"$CONFIG_LT" <<\_LTEOF -AC_MSG_NOTICE([creating $ofile]) -_LT_OUTPUT_LIBTOOL_COMMANDS -AS_EXIT(0) -_LTEOF -chmod +x "$CONFIG_LT" - -# configure is writing to config.log, but config.lt does its own redirection, -# appending to config.log, which fails on DOS, as config.log is still kept -# open by configure. Here we exec the FD to /dev/null, effectively closing -# config.log, so it can be properly (re)opened and appended to by config.lt. -lt_cl_success=: -test "$silent" = yes && - lt_config_lt_args="$lt_config_lt_args --quiet" -exec AS_MESSAGE_LOG_FD>/dev/null -$SHELL "$CONFIG_LT" $lt_config_lt_args || lt_cl_success=false -exec AS_MESSAGE_LOG_FD>>config.log -$lt_cl_success || AS_EXIT(1) -]) -m4trace:/usr/share/aclocal/libtool.m4:790: -1- AC_DEFUN([LT_SUPPORTED_TAG], []) -m4trace:/usr/share/aclocal/libtool.m4:801: -1- AC_DEFUN([LT_LANG], [AC_BEFORE([$0], [LT_OUTPUT])dnl -m4_case([$1], - [C], [_LT_LANG(C)], - [C++], [_LT_LANG(CXX)], - [Go], [_LT_LANG(GO)], - [Java], [_LT_LANG(GCJ)], - [Fortran 77], [_LT_LANG(F77)], - [Fortran], [_LT_LANG(FC)], - [Windows Resource], [_LT_LANG(RC)], - [m4_ifdef([_LT_LANG_]$1[_CONFIG], - [_LT_LANG($1)], - [m4_fatal([$0: unsupported language: "$1"])])])dnl -]) -m4trace:/usr/share/aclocal/libtool.m4:893: -1- AU_DEFUN([AC_LIBTOOL_CXX], [LT_LANG(C++)]) -m4trace:/usr/share/aclocal/libtool.m4:893: -1- AC_DEFUN([AC_LIBTOOL_CXX], [AC_DIAGNOSE([obsolete], [The macro `AC_LIBTOOL_CXX' is obsolete. -You should run autoupdate.])dnl -LT_LANG(C++)]) -m4trace:/usr/share/aclocal/libtool.m4:894: -1- AU_DEFUN([AC_LIBTOOL_F77], [LT_LANG(Fortran 77)]) -m4trace:/usr/share/aclocal/libtool.m4:894: -1- AC_DEFUN([AC_LIBTOOL_F77], [AC_DIAGNOSE([obsolete], [The macro `AC_LIBTOOL_F77' is obsolete. -You should run autoupdate.])dnl -LT_LANG(Fortran 77)]) -m4trace:/usr/share/aclocal/libtool.m4:895: -1- AU_DEFUN([AC_LIBTOOL_FC], [LT_LANG(Fortran)]) -m4trace:/usr/share/aclocal/libtool.m4:895: -1- AC_DEFUN([AC_LIBTOOL_FC], [AC_DIAGNOSE([obsolete], [The macro `AC_LIBTOOL_FC' is obsolete. -You should run autoupdate.])dnl -LT_LANG(Fortran)]) -m4trace:/usr/share/aclocal/libtool.m4:896: -1- AU_DEFUN([AC_LIBTOOL_GCJ], [LT_LANG(Java)]) -m4trace:/usr/share/aclocal/libtool.m4:896: -1- AC_DEFUN([AC_LIBTOOL_GCJ], [AC_DIAGNOSE([obsolete], [The macro `AC_LIBTOOL_GCJ' is obsolete. -You should run autoupdate.])dnl -LT_LANG(Java)]) -m4trace:/usr/share/aclocal/libtool.m4:897: -1- AU_DEFUN([AC_LIBTOOL_RC], [LT_LANG(Windows Resource)]) -m4trace:/usr/share/aclocal/libtool.m4:897: -1- AC_DEFUN([AC_LIBTOOL_RC], [AC_DIAGNOSE([obsolete], [The macro `AC_LIBTOOL_RC' is obsolete. -You should run autoupdate.])dnl -LT_LANG(Windows Resource)]) -m4trace:/usr/share/aclocal/libtool.m4:1225: -1- AC_DEFUN([_LT_WITH_SYSROOT], [AC_MSG_CHECKING([for sysroot]) -AC_ARG_WITH([sysroot], -[ --with-sysroot[=DIR] Search for dependent libraries within DIR - (or the compiler's sysroot if not specified).], -[], [with_sysroot=no]) - -dnl lt_sysroot will always be passed unquoted. We quote it here -dnl in case the user passed a directory name. -lt_sysroot= -case ${with_sysroot} in #( - yes) - if test "$GCC" = yes; then - lt_sysroot=`$CC --print-sysroot 2>/dev/null` - fi - ;; #( - /*) - lt_sysroot=`echo "$with_sysroot" | sed -e "$sed_quote_subst"` - ;; #( - no|'') - ;; #( - *) - AC_MSG_RESULT([${with_sysroot}]) - AC_MSG_ERROR([The sysroot must be an absolute path.]) - ;; -esac - - AC_MSG_RESULT([${lt_sysroot:-no}]) -_LT_DECL([], [lt_sysroot], [0], [The root where to search for ]dnl -[dependent libraries, and in which our libraries should be installed.])]) -m4trace:/usr/share/aclocal/libtool.m4:1502: -1- AC_DEFUN([_LT_COMPILER_OPTION], [m4_require([_LT_FILEUTILS_DEFAULTS])dnl -m4_require([_LT_DECL_SED])dnl -AC_CACHE_CHECK([$1], [$2], - [$2=no - m4_if([$4], , [ac_outfile=conftest.$ac_objext], [ac_outfile=$4]) - echo "$lt_simple_compile_test_code" > conftest.$ac_ext - lt_compiler_flag="$3" - # Insert the option either (1) after the last *FLAGS variable, or - # (2) before a word containing "conftest.", or (3) at the end. - # Note that $ac_compile itself does not contain backslashes and begins - # with a dollar sign (not a hyphen), so the echo should work correctly. - # The option is referenced via a variable to avoid confusing sed. - lt_compile=`echo "$ac_compile" | $SED \ - -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ - -e 's: [[^ ]]*conftest\.: $lt_compiler_flag&:; t' \ - -e 's:$: $lt_compiler_flag:'` - (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&AS_MESSAGE_LOG_FD) - (eval "$lt_compile" 2>conftest.err) - ac_status=$? - cat conftest.err >&AS_MESSAGE_LOG_FD - echo "$as_me:$LINENO: \$? = $ac_status" >&AS_MESSAGE_LOG_FD - if (exit $ac_status) && test -s "$ac_outfile"; then - # The compiler can only warn and ignore the option if not recognized - # So say no if there are warnings other than the usual output. - $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp - $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 - if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then - $2=yes - fi - fi - $RM conftest* -]) - -if test x"[$]$2" = xyes; then - m4_if([$5], , :, [$5]) -else - m4_if([$6], , :, [$6]) -fi -]) -m4trace:/usr/share/aclocal/libtool.m4:1544: -1- AU_DEFUN([AC_LIBTOOL_COMPILER_OPTION], [m4_if($#, 0, [_LT_COMPILER_OPTION], [_LT_COMPILER_OPTION($@)])]) -m4trace:/usr/share/aclocal/libtool.m4:1544: -1- AC_DEFUN([AC_LIBTOOL_COMPILER_OPTION], [AC_DIAGNOSE([obsolete], [The macro `AC_LIBTOOL_COMPILER_OPTION' is obsolete. -You should run autoupdate.])dnl -m4_if($#, 0, [_LT_COMPILER_OPTION], [_LT_COMPILER_OPTION($@)])]) -m4trace:/usr/share/aclocal/libtool.m4:1553: -1- AC_DEFUN([_LT_LINKER_OPTION], [m4_require([_LT_FILEUTILS_DEFAULTS])dnl -m4_require([_LT_DECL_SED])dnl -AC_CACHE_CHECK([$1], [$2], - [$2=no - save_LDFLAGS="$LDFLAGS" - LDFLAGS="$LDFLAGS $3" - echo "$lt_simple_link_test_code" > conftest.$ac_ext - if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then - # The linker can only warn and ignore the option if not recognized - # So say no if there are warnings - if test -s conftest.err; then - # Append any errors to the config.log. - cat conftest.err 1>&AS_MESSAGE_LOG_FD - $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp - $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 - if diff conftest.exp conftest.er2 >/dev/null; then - $2=yes - fi - else - $2=yes - fi - fi - $RM -r conftest* - LDFLAGS="$save_LDFLAGS" -]) - -if test x"[$]$2" = xyes; then - m4_if([$4], , :, [$4]) -else - m4_if([$5], , :, [$5]) -fi -]) -m4trace:/usr/share/aclocal/libtool.m4:1588: -1- AU_DEFUN([AC_LIBTOOL_LINKER_OPTION], [m4_if($#, 0, [_LT_LINKER_OPTION], [_LT_LINKER_OPTION($@)])]) -m4trace:/usr/share/aclocal/libtool.m4:1588: -1- AC_DEFUN([AC_LIBTOOL_LINKER_OPTION], [AC_DIAGNOSE([obsolete], [The macro `AC_LIBTOOL_LINKER_OPTION' is obsolete. -You should run autoupdate.])dnl -m4_if($#, 0, [_LT_LINKER_OPTION], [_LT_LINKER_OPTION($@)])]) -m4trace:/usr/share/aclocal/libtool.m4:1595: -1- AC_DEFUN([LT_CMD_MAX_LEN], [AC_REQUIRE([AC_CANONICAL_HOST])dnl -# find the maximum length of command line arguments -AC_MSG_CHECKING([the maximum length of command line arguments]) -AC_CACHE_VAL([lt_cv_sys_max_cmd_len], [dnl - i=0 - teststring="ABCD" - - case $build_os in - msdosdjgpp*) - # On DJGPP, this test can blow up pretty badly due to problems in libc - # (any single argument exceeding 2000 bytes causes a buffer overrun - # during glob expansion). Even if it were fixed, the result of this - # check would be larger than it should be. - lt_cv_sys_max_cmd_len=12288; # 12K is about right - ;; - - gnu*) - # Under GNU Hurd, this test is not required because there is - # no limit to the length of command line arguments. - # Libtool will interpret -1 as no limit whatsoever - lt_cv_sys_max_cmd_len=-1; - ;; - - cygwin* | mingw* | cegcc*) - # On Win9x/ME, this test blows up -- it succeeds, but takes - # about 5 minutes as the teststring grows exponentially. - # Worse, since 9x/ME are not pre-emptively multitasking, - # you end up with a "frozen" computer, even though with patience - # the test eventually succeeds (with a max line length of 256k). - # Instead, let's just punt: use the minimum linelength reported by - # all of the supported platforms: 8192 (on NT/2K/XP). - lt_cv_sys_max_cmd_len=8192; - ;; - - mint*) - # On MiNT this can take a long time and run out of memory. - lt_cv_sys_max_cmd_len=8192; - ;; - - amigaos*) - # On AmigaOS with pdksh, this test takes hours, literally. - # So we just punt and use a minimum line length of 8192. - lt_cv_sys_max_cmd_len=8192; - ;; - - netbsd* | freebsd* | openbsd* | darwin* | dragonfly*) - # This has been around since 386BSD, at least. Likely further. - if test -x /sbin/sysctl; then - lt_cv_sys_max_cmd_len=`/sbin/sysctl -n kern.argmax` - elif test -x /usr/sbin/sysctl; then - lt_cv_sys_max_cmd_len=`/usr/sbin/sysctl -n kern.argmax` - else - lt_cv_sys_max_cmd_len=65536 # usable default for all BSDs - fi - # And add a safety zone - lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` - lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` - ;; - - interix*) - # We know the value 262144 and hardcode it with a safety zone (like BSD) - lt_cv_sys_max_cmd_len=196608 - ;; - - os2*) - # The test takes a long time on OS/2. - lt_cv_sys_max_cmd_len=8192 - ;; - - osf*) - # Dr. Hans Ekkehard Plesser reports seeing a kernel panic running configure - # due to this test when exec_disable_arg_limit is 1 on Tru64. It is not - # nice to cause kernel panics so lets avoid the loop below. - # First set a reasonable default. - lt_cv_sys_max_cmd_len=16384 - # - if test -x /sbin/sysconfig; then - case `/sbin/sysconfig -q proc exec_disable_arg_limit` in - *1*) lt_cv_sys_max_cmd_len=-1 ;; - esac - fi - ;; - sco3.2v5*) - lt_cv_sys_max_cmd_len=102400 - ;; - sysv5* | sco5v6* | sysv4.2uw2*) - kargmax=`grep ARG_MAX /etc/conf/cf.d/stune 2>/dev/null` - if test -n "$kargmax"; then - lt_cv_sys_max_cmd_len=`echo $kargmax | sed 's/.*[[ ]]//'` - else - lt_cv_sys_max_cmd_len=32768 - fi - ;; - *) - lt_cv_sys_max_cmd_len=`(getconf ARG_MAX) 2> /dev/null` - if test -n "$lt_cv_sys_max_cmd_len"; then - lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` - lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` - else - # Make teststring a little bigger before we do anything with it. - # a 1K string should be a reasonable start. - for i in 1 2 3 4 5 6 7 8 ; do - teststring=$teststring$teststring - done - SHELL=${SHELL-${CONFIG_SHELL-/bin/sh}} - # If test is not a shell built-in, we'll probably end up computing a - # maximum length that is only half of the actual maximum length, but - # we can't tell. - while { test "X"`env echo "$teststring$teststring" 2>/dev/null` \ - = "X$teststring$teststring"; } >/dev/null 2>&1 && - test $i != 17 # 1/2 MB should be enough - do - i=`expr $i + 1` - teststring=$teststring$teststring - done - # Only check the string length outside the loop. - lt_cv_sys_max_cmd_len=`expr "X$teststring" : ".*" 2>&1` - teststring= - # Add a significant safety factor because C++ compilers can tack on - # massive amounts of additional arguments before passing them to the - # linker. It appears as though 1/2 is a usable value. - lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 2` - fi - ;; - esac -]) -if test -n $lt_cv_sys_max_cmd_len ; then - AC_MSG_RESULT($lt_cv_sys_max_cmd_len) -else - AC_MSG_RESULT(none) -fi -max_cmd_len=$lt_cv_sys_max_cmd_len -_LT_DECL([], [max_cmd_len], [0], - [What is the maximum length of a command?]) -]) -m4trace:/usr/share/aclocal/libtool.m4:1733: -1- AU_DEFUN([AC_LIBTOOL_SYS_MAX_CMD_LEN], [m4_if($#, 0, [LT_CMD_MAX_LEN], [LT_CMD_MAX_LEN($@)])]) -m4trace:/usr/share/aclocal/libtool.m4:1733: -1- AC_DEFUN([AC_LIBTOOL_SYS_MAX_CMD_LEN], [AC_DIAGNOSE([obsolete], [The macro `AC_LIBTOOL_SYS_MAX_CMD_LEN' is obsolete. -You should run autoupdate.])dnl -m4_if($#, 0, [LT_CMD_MAX_LEN], [LT_CMD_MAX_LEN($@)])]) -m4trace:/usr/share/aclocal/libtool.m4:1844: -1- AC_DEFUN([LT_SYS_DLOPEN_SELF], [m4_require([_LT_HEADER_DLFCN])dnl -if test "x$enable_dlopen" != xyes; then - enable_dlopen=unknown - enable_dlopen_self=unknown - enable_dlopen_self_static=unknown -else - lt_cv_dlopen=no - lt_cv_dlopen_libs= - - case $host_os in - beos*) - lt_cv_dlopen="load_add_on" - lt_cv_dlopen_libs= - lt_cv_dlopen_self=yes - ;; - - mingw* | pw32* | cegcc*) - lt_cv_dlopen="LoadLibrary" - lt_cv_dlopen_libs= - ;; - - cygwin*) - lt_cv_dlopen="dlopen" - lt_cv_dlopen_libs= - ;; - - darwin*) - # if libdl is installed we need to link against it - AC_CHECK_LIB([dl], [dlopen], - [lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl"],[ - lt_cv_dlopen="dyld" - lt_cv_dlopen_libs= - lt_cv_dlopen_self=yes - ]) - ;; - - *) - AC_CHECK_FUNC([shl_load], - [lt_cv_dlopen="shl_load"], - [AC_CHECK_LIB([dld], [shl_load], - [lt_cv_dlopen="shl_load" lt_cv_dlopen_libs="-ldld"], - [AC_CHECK_FUNC([dlopen], - [lt_cv_dlopen="dlopen"], - [AC_CHECK_LIB([dl], [dlopen], - [lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl"], - [AC_CHECK_LIB([svld], [dlopen], - [lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-lsvld"], - [AC_CHECK_LIB([dld], [dld_link], - [lt_cv_dlopen="dld_link" lt_cv_dlopen_libs="-ldld"]) - ]) - ]) - ]) - ]) - ]) - ;; - esac - - if test "x$lt_cv_dlopen" != xno; then - enable_dlopen=yes - else - enable_dlopen=no - fi - - case $lt_cv_dlopen in - dlopen) - save_CPPFLAGS="$CPPFLAGS" - test "x$ac_cv_header_dlfcn_h" = xyes && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H" - - save_LDFLAGS="$LDFLAGS" - wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\" - - save_LIBS="$LIBS" - LIBS="$lt_cv_dlopen_libs $LIBS" - - AC_CACHE_CHECK([whether a program can dlopen itself], - lt_cv_dlopen_self, [dnl - _LT_TRY_DLOPEN_SELF( - lt_cv_dlopen_self=yes, lt_cv_dlopen_self=yes, - lt_cv_dlopen_self=no, lt_cv_dlopen_self=cross) - ]) - - if test "x$lt_cv_dlopen_self" = xyes; then - wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $lt_prog_compiler_static\" - AC_CACHE_CHECK([whether a statically linked program can dlopen itself], - lt_cv_dlopen_self_static, [dnl - _LT_TRY_DLOPEN_SELF( - lt_cv_dlopen_self_static=yes, lt_cv_dlopen_self_static=yes, - lt_cv_dlopen_self_static=no, lt_cv_dlopen_self_static=cross) - ]) - fi - - CPPFLAGS="$save_CPPFLAGS" - LDFLAGS="$save_LDFLAGS" - LIBS="$save_LIBS" - ;; - esac - - case $lt_cv_dlopen_self in - yes|no) enable_dlopen_self=$lt_cv_dlopen_self ;; - *) enable_dlopen_self=unknown ;; - esac - - case $lt_cv_dlopen_self_static in - yes|no) enable_dlopen_self_static=$lt_cv_dlopen_self_static ;; - *) enable_dlopen_self_static=unknown ;; - esac -fi -_LT_DECL([dlopen_support], [enable_dlopen], [0], - [Whether dlopen is supported]) -_LT_DECL([dlopen_self], [enable_dlopen_self], [0], - [Whether dlopen of programs is supported]) -_LT_DECL([dlopen_self_static], [enable_dlopen_self_static], [0], - [Whether dlopen of statically linked programs is supported]) -]) -m4trace:/usr/share/aclocal/libtool.m4:1961: -1- AU_DEFUN([AC_LIBTOOL_DLOPEN_SELF], [m4_if($#, 0, [LT_SYS_DLOPEN_SELF], [LT_SYS_DLOPEN_SELF($@)])]) -m4trace:/usr/share/aclocal/libtool.m4:1961: -1- AC_DEFUN([AC_LIBTOOL_DLOPEN_SELF], [AC_DIAGNOSE([obsolete], [The macro `AC_LIBTOOL_DLOPEN_SELF' is obsolete. -You should run autoupdate.])dnl -m4_if($#, 0, [LT_SYS_DLOPEN_SELF], [LT_SYS_DLOPEN_SELF($@)])]) -m4trace:/usr/share/aclocal/libtool.m4:2942: -1- AC_DEFUN([_LT_PATH_TOOL_PREFIX], [m4_require([_LT_DECL_EGREP])dnl -AC_MSG_CHECKING([for $1]) -AC_CACHE_VAL(lt_cv_path_MAGIC_CMD, -[case $MAGIC_CMD in -[[\\/*] | ?:[\\/]*]) - lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path. - ;; -*) - lt_save_MAGIC_CMD="$MAGIC_CMD" - lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR -dnl $ac_dummy forces splitting on constant user-supplied paths. -dnl POSIX.2 word splitting is done only on the output of word expansions, -dnl not every word. This closes a longstanding sh security hole. - ac_dummy="m4_if([$2], , $PATH, [$2])" - for ac_dir in $ac_dummy; do - IFS="$lt_save_ifs" - test -z "$ac_dir" && ac_dir=. - if test -f $ac_dir/$1; then - lt_cv_path_MAGIC_CMD="$ac_dir/$1" - if test -n "$file_magic_test_file"; then - case $deplibs_check_method in - "file_magic "*) - file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"` - MAGIC_CMD="$lt_cv_path_MAGIC_CMD" - if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null | - $EGREP "$file_magic_regex" > /dev/null; then - : - else - cat <<_LT_EOF 1>&2 - -*** Warning: the command libtool uses to detect shared libraries, -*** $file_magic_cmd, produces output that libtool cannot recognize. -*** The result is that libtool may fail to recognize shared libraries -*** as such. This will affect the creation of libtool libraries that -*** depend on shared libraries, but programs linked with such libtool -*** libraries will work regardless of this problem. Nevertheless, you -*** may want to report the problem to your system manager and/or to -*** bug-libtool@gnu.org - -_LT_EOF - fi ;; - esac - fi - break - fi - done - IFS="$lt_save_ifs" - MAGIC_CMD="$lt_save_MAGIC_CMD" - ;; -esac]) -MAGIC_CMD="$lt_cv_path_MAGIC_CMD" -if test -n "$MAGIC_CMD"; then - AC_MSG_RESULT($MAGIC_CMD) -else - AC_MSG_RESULT(no) -fi -_LT_DECL([], [MAGIC_CMD], [0], - [Used to examine libraries when file_magic_cmd begins with "file"])dnl -]) -m4trace:/usr/share/aclocal/libtool.m4:3004: -1- AU_DEFUN([AC_PATH_TOOL_PREFIX], [m4_if($#, 0, [_LT_PATH_TOOL_PREFIX], [_LT_PATH_TOOL_PREFIX($@)])]) -m4trace:/usr/share/aclocal/libtool.m4:3004: -1- AC_DEFUN([AC_PATH_TOOL_PREFIX], [AC_DIAGNOSE([obsolete], [The macro `AC_PATH_TOOL_PREFIX' is obsolete. -You should run autoupdate.])dnl -m4_if($#, 0, [_LT_PATH_TOOL_PREFIX], [_LT_PATH_TOOL_PREFIX($@)])]) -m4trace:/usr/share/aclocal/libtool.m4:3027: -1- AC_DEFUN([LT_PATH_LD], [AC_REQUIRE([AC_PROG_CC])dnl -AC_REQUIRE([AC_CANONICAL_HOST])dnl -AC_REQUIRE([AC_CANONICAL_BUILD])dnl -m4_require([_LT_DECL_SED])dnl -m4_require([_LT_DECL_EGREP])dnl -m4_require([_LT_PROG_ECHO_BACKSLASH])dnl - -AC_ARG_WITH([gnu-ld], - [AS_HELP_STRING([--with-gnu-ld], - [assume the C compiler uses GNU ld @<:@default=no@:>@])], - [test "$withval" = no || with_gnu_ld=yes], - [with_gnu_ld=no])dnl - -ac_prog=ld -if test "$GCC" = yes; then - # Check if gcc -print-prog-name=ld gives a path. - AC_MSG_CHECKING([for ld used by $CC]) - case $host in - *-*-mingw*) - # gcc leaves a trailing carriage return which upsets mingw - ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;; - *) - ac_prog=`($CC -print-prog-name=ld) 2>&5` ;; - esac - case $ac_prog in - # Accept absolute paths. - [[\\/]]* | ?:[[\\/]]*) - re_direlt='/[[^/]][[^/]]*/\.\./' - # Canonicalize the pathname of ld - ac_prog=`$ECHO "$ac_prog"| $SED 's%\\\\%/%g'` - while $ECHO "$ac_prog" | $GREP "$re_direlt" > /dev/null 2>&1; do - ac_prog=`$ECHO $ac_prog| $SED "s%$re_direlt%/%"` - done - test -z "$LD" && LD="$ac_prog" - ;; - "") - # If it fails, then pretend we aren't using GCC. - ac_prog=ld - ;; - *) - # If it is relative, then search for the first ld in PATH. - with_gnu_ld=unknown - ;; - esac -elif test "$with_gnu_ld" = yes; then - AC_MSG_CHECKING([for GNU ld]) -else - AC_MSG_CHECKING([for non-GNU ld]) -fi -AC_CACHE_VAL(lt_cv_path_LD, -[if test -z "$LD"; then - lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR - for ac_dir in $PATH; do - IFS="$lt_save_ifs" - test -z "$ac_dir" && ac_dir=. - if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then - lt_cv_path_LD="$ac_dir/$ac_prog" - # Check to see if the program is GNU ld. I'd rather use --version, - # but apparently some variants of GNU ld only accept -v. - # Break only if it was the GNU/non-GNU ld that we prefer. - case `"$lt_cv_path_LD" -v 2>&1 &1 | sed '1q'` in - */dev/null* | *'Invalid file or object type'*) - lt_cv_path_NM="$tmp_nm -B" - break - ;; - *) - case `"$tmp_nm" -p /dev/null 2>&1 | sed '1q'` in - */dev/null*) - lt_cv_path_NM="$tmp_nm -p" - break - ;; - *) - lt_cv_path_NM=${lt_cv_path_NM="$tmp_nm"} # keep the first match, but - continue # so that we can try to find one that supports BSD flags - ;; - esac - ;; - esac - fi - done - IFS="$lt_save_ifs" - done - : ${lt_cv_path_NM=no} -fi]) -if test "$lt_cv_path_NM" != "no"; then - NM="$lt_cv_path_NM" -else - # Didn't find any BSD compatible name lister, look for dumpbin. - if test -n "$DUMPBIN"; then : - # Let the user override the test. - else - AC_CHECK_TOOLS(DUMPBIN, [dumpbin "link -dump"], :) - case `$DUMPBIN -symbols /dev/null 2>&1 | sed '1q'` in - *COFF*) - DUMPBIN="$DUMPBIN -symbols" - ;; - *) - DUMPBIN=: - ;; - esac - fi - AC_SUBST([DUMPBIN]) - if test "$DUMPBIN" != ":"; then - NM="$DUMPBIN" - fi -fi -test -z "$NM" && NM=nm -AC_SUBST([NM]) -_LT_DECL([], [NM], [1], [A BSD- or MS-compatible name lister])dnl - -AC_CACHE_CHECK([the name lister ($NM) interface], [lt_cv_nm_interface], - [lt_cv_nm_interface="BSD nm" - echo "int some_variable = 0;" > conftest.$ac_ext - (eval echo "\"\$as_me:$LINENO: $ac_compile\"" >&AS_MESSAGE_LOG_FD) - (eval "$ac_compile" 2>conftest.err) - cat conftest.err >&AS_MESSAGE_LOG_FD - (eval echo "\"\$as_me:$LINENO: $NM \\\"conftest.$ac_objext\\\"\"" >&AS_MESSAGE_LOG_FD) - (eval "$NM \"conftest.$ac_objext\"" 2>conftest.err > conftest.out) - cat conftest.err >&AS_MESSAGE_LOG_FD - (eval echo "\"\$as_me:$LINENO: output\"" >&AS_MESSAGE_LOG_FD) - cat conftest.out >&AS_MESSAGE_LOG_FD - if $GREP 'External.*some_variable' conftest.out > /dev/null; then - lt_cv_nm_interface="MS dumpbin" - fi - rm -f conftest*]) -]) -m4trace:/usr/share/aclocal/libtool.m4:3501: -1- AU_DEFUN([AM_PROG_NM], [m4_if($#, 0, [LT_PATH_NM], [LT_PATH_NM($@)])]) -m4trace:/usr/share/aclocal/libtool.m4:3501: -1- AC_DEFUN([AM_PROG_NM], [AC_DIAGNOSE([obsolete], [The macro `AM_PROG_NM' is obsolete. -You should run autoupdate.])dnl -m4_if($#, 0, [LT_PATH_NM], [LT_PATH_NM($@)])]) -m4trace:/usr/share/aclocal/libtool.m4:3502: -1- AU_DEFUN([AC_PROG_NM], [m4_if($#, 0, [LT_PATH_NM], [LT_PATH_NM($@)])]) -m4trace:/usr/share/aclocal/libtool.m4:3502: -1- AC_DEFUN([AC_PROG_NM], [AC_DIAGNOSE([obsolete], [The macro `AC_PROG_NM' is obsolete. -You should run autoupdate.])dnl -m4_if($#, 0, [LT_PATH_NM], [LT_PATH_NM($@)])]) -m4trace:/usr/share/aclocal/libtool.m4:3572: -1- AC_DEFUN([LT_LIB_M], [AC_REQUIRE([AC_CANONICAL_HOST])dnl -LIBM= -case $host in -*-*-beos* | *-*-cegcc* | *-*-cygwin* | *-*-haiku* | *-*-pw32* | *-*-darwin*) - # These system don't have libm, or don't need it - ;; -*-ncr-sysv4.3*) - AC_CHECK_LIB(mw, _mwvalidcheckl, LIBM="-lmw") - AC_CHECK_LIB(m, cos, LIBM="$LIBM -lm") - ;; -*) - AC_CHECK_LIB(m, cos, LIBM="-lm") - ;; -esac -AC_SUBST([LIBM]) -]) -m4trace:/usr/share/aclocal/libtool.m4:3591: -1- AU_DEFUN([AC_CHECK_LIBM], [m4_if($#, 0, [LT_LIB_M], [LT_LIB_M($@)])]) -m4trace:/usr/share/aclocal/libtool.m4:3591: -1- AC_DEFUN([AC_CHECK_LIBM], [AC_DIAGNOSE([obsolete], [The macro `AC_CHECK_LIBM' is obsolete. -You should run autoupdate.])dnl -m4_if($#, 0, [LT_LIB_M], [LT_LIB_M($@)])]) -m4trace:/usr/share/aclocal/libtool.m4:7641: -1- AC_DEFUN([LT_PROG_GCJ], [m4_ifdef([AC_PROG_GCJ], [AC_PROG_GCJ], - [m4_ifdef([A][M_PROG_GCJ], [A][M_PROG_GCJ], - [AC_CHECK_TOOL(GCJ, gcj,) - test "x${GCJFLAGS+set}" = xset || GCJFLAGS="-g -O2" - AC_SUBST(GCJFLAGS)])])[]dnl -]) -m4trace:/usr/share/aclocal/libtool.m4:7650: -1- AU_DEFUN([LT_AC_PROG_GCJ], [m4_if($#, 0, [LT_PROG_GCJ], [LT_PROG_GCJ($@)])]) -m4trace:/usr/share/aclocal/libtool.m4:7650: -1- AC_DEFUN([LT_AC_PROG_GCJ], [AC_DIAGNOSE([obsolete], [The macro `LT_AC_PROG_GCJ' is obsolete. -You should run autoupdate.])dnl -m4_if($#, 0, [LT_PROG_GCJ], [LT_PROG_GCJ($@)])]) -m4trace:/usr/share/aclocal/libtool.m4:7657: -1- AC_DEFUN([LT_PROG_GO], [AC_CHECK_TOOL(GOC, gccgo,) -]) -m4trace:/usr/share/aclocal/libtool.m4:7664: -1- AC_DEFUN([LT_PROG_RC], [AC_CHECK_TOOL(RC, windres,) -]) -m4trace:/usr/share/aclocal/libtool.m4:7669: -1- AU_DEFUN([LT_AC_PROG_RC], [m4_if($#, 0, [LT_PROG_RC], [LT_PROG_RC($@)])]) -m4trace:/usr/share/aclocal/libtool.m4:7669: -1- AC_DEFUN([LT_AC_PROG_RC], [AC_DIAGNOSE([obsolete], [The macro `LT_AC_PROG_RC' is obsolete. -You should run autoupdate.])dnl -m4_if($#, 0, [LT_PROG_RC], [LT_PROG_RC($@)])]) -m4trace:/usr/share/aclocal/libtool.m4:7789: -1- AU_DEFUN([LT_AC_PROG_SED], [m4_if($#, 0, [AC_PROG_SED], [AC_PROG_SED($@)])]) -m4trace:/usr/share/aclocal/libtool.m4:7789: -1- AC_DEFUN([LT_AC_PROG_SED], [AC_DIAGNOSE([obsolete], [The macro `LT_AC_PROG_SED' is obsolete. -You should run autoupdate.])dnl -m4_if($#, 0, [AC_PROG_SED], [AC_PROG_SED($@)])]) -m4trace:/usr/share/aclocal/ltdl.m4:16: -1- AC_DEFUN([LT_CONFIG_LTDL_DIR], [AC_BEFORE([$0], [LTDL_INIT]) -_$0($*) -]) -m4trace:/usr/share/aclocal/ltdl.m4:68: -1- AC_DEFUN([LTDL_CONVENIENCE], [AC_BEFORE([$0], [LTDL_INIT])dnl -dnl Although the argument is deprecated and no longer documented, -dnl LTDL_CONVENIENCE used to take a DIRECTORY orgument, if we have one -dnl here make sure it is the same as any other declaration of libltdl's -dnl location! This also ensures lt_ltdl_dir is set when configure.ac is -dnl not yet using an explicit LT_CONFIG_LTDL_DIR. -m4_ifval([$1], [_LT_CONFIG_LTDL_DIR([$1])])dnl -_$0() -]) -m4trace:/usr/share/aclocal/ltdl.m4:81: -1- AU_DEFUN([AC_LIBLTDL_CONVENIENCE], [_LT_CONFIG_LTDL_DIR([m4_default([$1], [libltdl])]) -_LTDL_CONVENIENCE]) -m4trace:/usr/share/aclocal/ltdl.m4:81: -1- AC_DEFUN([AC_LIBLTDL_CONVENIENCE], [AC_DIAGNOSE([obsolete], [The macro `AC_LIBLTDL_CONVENIENCE' is obsolete. -You should run autoupdate.])dnl -_LT_CONFIG_LTDL_DIR([m4_default([$1], [libltdl])]) -_LTDL_CONVENIENCE]) -m4trace:/usr/share/aclocal/ltdl.m4:124: -1- AC_DEFUN([LTDL_INSTALLABLE], [AC_BEFORE([$0], [LTDL_INIT])dnl -dnl Although the argument is deprecated and no longer documented, -dnl LTDL_INSTALLABLE used to take a DIRECTORY orgument, if we have one -dnl here make sure it is the same as any other declaration of libltdl's -dnl location! This also ensures lt_ltdl_dir is set when configure.ac is -dnl not yet using an explicit LT_CONFIG_LTDL_DIR. -m4_ifval([$1], [_LT_CONFIG_LTDL_DIR([$1])])dnl -_$0() -]) -m4trace:/usr/share/aclocal/ltdl.m4:137: -1- AU_DEFUN([AC_LIBLTDL_INSTALLABLE], [_LT_CONFIG_LTDL_DIR([m4_default([$1], [libltdl])]) -_LTDL_INSTALLABLE]) -m4trace:/usr/share/aclocal/ltdl.m4:137: -1- AC_DEFUN([AC_LIBLTDL_INSTALLABLE], [AC_DIAGNOSE([obsolete], [The macro `AC_LIBLTDL_INSTALLABLE' is obsolete. -You should run autoupdate.])dnl -_LT_CONFIG_LTDL_DIR([m4_default([$1], [libltdl])]) -_LTDL_INSTALLABLE]) -m4trace:/usr/share/aclocal/ltdl.m4:213: -1- AC_DEFUN([_LT_LIBOBJ], [ - m4_pattern_allow([^_LT_LIBOBJS$]) - _LT_LIBOBJS="$_LT_LIBOBJS $1.$ac_objext" -]) -m4trace:/usr/share/aclocal/ltdl.m4:226: -1- AC_DEFUN([LTDL_INIT], [dnl Parse OPTIONS -_LT_SET_OPTIONS([$0], [$1]) - -dnl We need to keep our own list of libobjs separate from our parent project, -dnl and the easiest way to do that is redefine the AC_LIBOBJs macro while -dnl we look for our own LIBOBJs. -m4_pushdef([AC_LIBOBJ], m4_defn([_LT_LIBOBJ])) -m4_pushdef([AC_LIBSOURCES]) - -dnl If not otherwise defined, default to the 1.5.x compatible subproject mode: -m4_if(_LTDL_MODE, [], - [m4_define([_LTDL_MODE], m4_default([$2], [subproject])) - m4_if([-1], [m4_bregexp(_LTDL_MODE, [\(subproject\|\(non\)?recursive\)])], - [m4_fatal([unknown libltdl mode: ]_LTDL_MODE)])]) - -AC_ARG_WITH([included_ltdl], - [AS_HELP_STRING([--with-included-ltdl], - [use the GNU ltdl sources included here])]) - -if test "x$with_included_ltdl" != xyes; then - # We are not being forced to use the included libltdl sources, so - # decide whether there is a useful installed version we can use. - AC_CHECK_HEADER([ltdl.h], - [AC_CHECK_DECL([lt_dlinterface_register], - [AC_CHECK_LIB([ltdl], [lt_dladvise_preload], - [with_included_ltdl=no], - [with_included_ltdl=yes])], - [with_included_ltdl=yes], - [AC_INCLUDES_DEFAULT - #include ])], - [with_included_ltdl=yes], - [AC_INCLUDES_DEFAULT] - ) -fi - -dnl If neither LT_CONFIG_LTDL_DIR, LTDL_CONVENIENCE nor LTDL_INSTALLABLE -dnl was called yet, then for old times' sake, we assume libltdl is in an -dnl eponymous directory: -AC_PROVIDE_IFELSE([LT_CONFIG_LTDL_DIR], [], [_LT_CONFIG_LTDL_DIR([libltdl])]) - -AC_ARG_WITH([ltdl_include], - [AS_HELP_STRING([--with-ltdl-include=DIR], - [use the ltdl headers installed in DIR])]) - -if test -n "$with_ltdl_include"; then - if test -f "$with_ltdl_include/ltdl.h"; then : - else - AC_MSG_ERROR([invalid ltdl include directory: `$with_ltdl_include']) - fi -else - with_ltdl_include=no -fi - -AC_ARG_WITH([ltdl_lib], - [AS_HELP_STRING([--with-ltdl-lib=DIR], - [use the libltdl.la installed in DIR])]) - -if test -n "$with_ltdl_lib"; then - if test -f "$with_ltdl_lib/libltdl.la"; then : - else - AC_MSG_ERROR([invalid ltdl library directory: `$with_ltdl_lib']) - fi -else - with_ltdl_lib=no -fi - -case ,$with_included_ltdl,$with_ltdl_include,$with_ltdl_lib, in - ,yes,no,no,) - m4_case(m4_default(_LTDL_TYPE, [convenience]), - [convenience], [_LTDL_CONVENIENCE], - [installable], [_LTDL_INSTALLABLE], - [m4_fatal([unknown libltdl build type: ]_LTDL_TYPE)]) - ;; - ,no,no,no,) - # If the included ltdl is not to be used, then use the - # preinstalled libltdl we found. - AC_DEFINE([HAVE_LTDL], [1], - [Define this if a modern libltdl is already installed]) - LIBLTDL=-lltdl - LTDLDEPS= - LTDLINCL= - ;; - ,no*,no,*) - AC_MSG_ERROR([`--with-ltdl-include' and `--with-ltdl-lib' options must be used together]) - ;; - *) with_included_ltdl=no - LIBLTDL="-L$with_ltdl_lib -lltdl" - LTDLDEPS= - LTDLINCL="-I$with_ltdl_include" - ;; -esac -INCLTDL="$LTDLINCL" - -# Report our decision... -AC_MSG_CHECKING([where to find libltdl headers]) -AC_MSG_RESULT([$LTDLINCL]) -AC_MSG_CHECKING([where to find libltdl library]) -AC_MSG_RESULT([$LIBLTDL]) - -_LTDL_SETUP - -dnl restore autoconf definition. -m4_popdef([AC_LIBOBJ]) -m4_popdef([AC_LIBSOURCES]) - -AC_CONFIG_COMMANDS_PRE([ - _ltdl_libobjs= - _ltdl_ltlibobjs= - if test -n "$_LT_LIBOBJS"; then - # Remove the extension. - _lt_sed_drop_objext='s/\.o$//;s/\.obj$//' - for i in `for i in $_LT_LIBOBJS; do echo "$i"; done | sed "$_lt_sed_drop_objext" | sort -u`; do - _ltdl_libobjs="$_ltdl_libobjs $lt_libobj_prefix$i.$ac_objext" - _ltdl_ltlibobjs="$_ltdl_ltlibobjs $lt_libobj_prefix$i.lo" - done - fi - AC_SUBST([ltdl_LIBOBJS], [$_ltdl_libobjs]) - AC_SUBST([ltdl_LTLIBOBJS], [$_ltdl_ltlibobjs]) -]) - -# Only expand once: -m4_define([LTDL_INIT]) -]) -m4trace:/usr/share/aclocal/ltdl.m4:352: -1- AU_DEFUN([AC_LIB_LTDL], [LTDL_INIT($@)]) -m4trace:/usr/share/aclocal/ltdl.m4:352: -1- AC_DEFUN([AC_LIB_LTDL], [AC_DIAGNOSE([obsolete], [The macro `AC_LIB_LTDL' is obsolete. -You should run autoupdate.])dnl -LTDL_INIT($@)]) -m4trace:/usr/share/aclocal/ltdl.m4:353: -1- AU_DEFUN([AC_WITH_LTDL], [LTDL_INIT($@)]) -m4trace:/usr/share/aclocal/ltdl.m4:353: -1- AC_DEFUN([AC_WITH_LTDL], [AC_DIAGNOSE([obsolete], [The macro `AC_WITH_LTDL' is obsolete. -You should run autoupdate.])dnl -LTDL_INIT($@)]) -m4trace:/usr/share/aclocal/ltdl.m4:354: -1- AU_DEFUN([LT_WITH_LTDL], [LTDL_INIT($@)]) -m4trace:/usr/share/aclocal/ltdl.m4:354: -1- AC_DEFUN([LT_WITH_LTDL], [AC_DIAGNOSE([obsolete], [The macro `LT_WITH_LTDL' is obsolete. -You should run autoupdate.])dnl -LTDL_INIT($@)]) -m4trace:/usr/share/aclocal/ltdl.m4:367: -1- AC_DEFUN([_LTDL_SETUP], [AC_REQUIRE([AC_PROG_CC])dnl -AC_REQUIRE([LT_SYS_MODULE_EXT])dnl -AC_REQUIRE([LT_SYS_MODULE_PATH])dnl -AC_REQUIRE([LT_SYS_DLSEARCH_PATH])dnl -AC_REQUIRE([LT_LIB_DLLOAD])dnl -AC_REQUIRE([LT_SYS_SYMBOL_USCORE])dnl -AC_REQUIRE([LT_FUNC_DLSYM_USCORE])dnl -AC_REQUIRE([LT_SYS_DLOPEN_DEPLIBS])dnl -AC_REQUIRE([gl_FUNC_ARGZ])dnl - -m4_require([_LT_CHECK_OBJDIR])dnl -m4_require([_LT_HEADER_DLFCN])dnl -m4_require([_LT_CHECK_DLPREOPEN])dnl -m4_require([_LT_DECL_SED])dnl - -dnl Don't require this, or it will be expanded earlier than the code -dnl that sets the variables it relies on: -_LT_ENABLE_INSTALL - -dnl _LTDL_MODE specific code must be called at least once: -_LTDL_MODE_DISPATCH - -# In order that ltdl.c can compile, find out the first AC_CONFIG_HEADERS -# the user used. This is so that ltdl.h can pick up the parent projects -# config.h file, The first file in AC_CONFIG_HEADERS must contain the -# definitions required by ltdl.c. -# FIXME: Remove use of undocumented AC_LIST_HEADERS (2.59 compatibility). -AC_CONFIG_COMMANDS_PRE([dnl -m4_pattern_allow([^LT_CONFIG_H$])dnl -m4_ifset([AH_HEADER], - [LT_CONFIG_H=AH_HEADER], - [m4_ifset([AC_LIST_HEADERS], - [LT_CONFIG_H=`echo "AC_LIST_HEADERS" | $SED 's,^[[ ]]*,,;s,[[ :]].*$,,'`], - [])])]) -AC_SUBST([LT_CONFIG_H]) - -AC_CHECK_HEADERS([unistd.h dl.h sys/dl.h dld.h mach-o/dyld.h dirent.h], - [], [], [AC_INCLUDES_DEFAULT]) - -AC_CHECK_FUNCS([closedir opendir readdir], [], [AC_LIBOBJ([lt__dirent])]) -AC_CHECK_FUNCS([strlcat strlcpy], [], [AC_LIBOBJ([lt__strl])]) - -m4_pattern_allow([LT_LIBEXT])dnl -AC_DEFINE_UNQUOTED([LT_LIBEXT],["$libext"],[The archive extension]) - -name= -eval "lt_libprefix=\"$libname_spec\"" -m4_pattern_allow([LT_LIBPREFIX])dnl -AC_DEFINE_UNQUOTED([LT_LIBPREFIX],["$lt_libprefix"],[The archive prefix]) - -name=ltdl -eval "LTDLOPEN=\"$libname_spec\"" -AC_SUBST([LTDLOPEN]) -]) -m4trace:/usr/share/aclocal/ltdl.m4:443: -1- AC_DEFUN([LT_SYS_DLOPEN_DEPLIBS], [AC_REQUIRE([AC_CANONICAL_HOST])dnl -AC_CACHE_CHECK([whether deplibs are loaded by dlopen], - [lt_cv_sys_dlopen_deplibs], - [# PORTME does your system automatically load deplibs for dlopen? - # or its logical equivalent (e.g. shl_load for HP-UX < 11) - # For now, we just catch OSes we know something about -- in the - # future, we'll try test this programmatically. - lt_cv_sys_dlopen_deplibs=unknown - case $host_os in - aix3*|aix4.1.*|aix4.2.*) - # Unknown whether this is true for these versions of AIX, but - # we want this `case' here to explicitly catch those versions. - lt_cv_sys_dlopen_deplibs=unknown - ;; - aix[[4-9]]*) - lt_cv_sys_dlopen_deplibs=yes - ;; - amigaos*) - case $host_cpu in - powerpc) - lt_cv_sys_dlopen_deplibs=no - ;; - esac - ;; - darwin*) - # Assuming the user has installed a libdl from somewhere, this is true - # If you are looking for one http://www.opendarwin.org/projects/dlcompat - lt_cv_sys_dlopen_deplibs=yes - ;; - freebsd* | dragonfly*) - lt_cv_sys_dlopen_deplibs=yes - ;; - gnu* | linux* | k*bsd*-gnu | kopensolaris*-gnu) - # GNU and its variants, using gnu ld.so (Glibc) - lt_cv_sys_dlopen_deplibs=yes - ;; - hpux10*|hpux11*) - lt_cv_sys_dlopen_deplibs=yes - ;; - interix*) - lt_cv_sys_dlopen_deplibs=yes - ;; - irix[[12345]]*|irix6.[[01]]*) - # Catch all versions of IRIX before 6.2, and indicate that we don't - # know how it worked for any of those versions. - lt_cv_sys_dlopen_deplibs=unknown - ;; - irix*) - # The case above catches anything before 6.2, and it's known that - # at 6.2 and later dlopen does load deplibs. - lt_cv_sys_dlopen_deplibs=yes - ;; - netbsd* | netbsdelf*-gnu) - lt_cv_sys_dlopen_deplibs=yes - ;; - openbsd*) - lt_cv_sys_dlopen_deplibs=yes - ;; - osf[[1234]]*) - # dlopen did load deplibs (at least at 4.x), but until the 5.x series, - # it did *not* use an RPATH in a shared library to find objects the - # library depends on, so we explicitly say `no'. - lt_cv_sys_dlopen_deplibs=no - ;; - osf5.0|osf5.0a|osf5.1) - # dlopen *does* load deplibs and with the right loader patch applied - # it even uses RPATH in a shared library to search for shared objects - # that the library depends on, but there's no easy way to know if that - # patch is installed. Since this is the case, all we can really - # say is unknown -- it depends on the patch being installed. If - # it is, this changes to `yes'. Without it, it would be `no'. - lt_cv_sys_dlopen_deplibs=unknown - ;; - osf*) - # the two cases above should catch all versions of osf <= 5.1. Read - # the comments above for what we know about them. - # At > 5.1, deplibs are loaded *and* any RPATH in a shared library - # is used to find them so we can finally say `yes'. - lt_cv_sys_dlopen_deplibs=yes - ;; - qnx*) - lt_cv_sys_dlopen_deplibs=yes - ;; - solaris*) - lt_cv_sys_dlopen_deplibs=yes - ;; - sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) - libltdl_cv_sys_dlopen_deplibs=yes - ;; - esac - ]) -if test "$lt_cv_sys_dlopen_deplibs" != yes; then - AC_DEFINE([LTDL_DLOPEN_DEPLIBS], [1], - [Define if the OS needs help to load dependent libraries for dlopen().]) -fi -]) -m4trace:/usr/share/aclocal/ltdl.m4:542: -1- AU_DEFUN([AC_LTDL_SYS_DLOPEN_DEPLIBS], [m4_if($#, 0, [LT_SYS_DLOPEN_DEPLIBS], [LT_SYS_DLOPEN_DEPLIBS($@)])]) -m4trace:/usr/share/aclocal/ltdl.m4:542: -1- AC_DEFUN([AC_LTDL_SYS_DLOPEN_DEPLIBS], [AC_DIAGNOSE([obsolete], [The macro `AC_LTDL_SYS_DLOPEN_DEPLIBS' is obsolete. -You should run autoupdate.])dnl -m4_if($#, 0, [LT_SYS_DLOPEN_DEPLIBS], [LT_SYS_DLOPEN_DEPLIBS($@)])]) -m4trace:/usr/share/aclocal/ltdl.m4:549: -1- AC_DEFUN([LT_SYS_MODULE_EXT], [m4_require([_LT_SYS_DYNAMIC_LINKER])dnl -AC_CACHE_CHECK([which extension is used for runtime loadable modules], - [libltdl_cv_shlibext], -[ -module=yes -eval libltdl_cv_shlibext=$shrext_cmds -module=no -eval libltdl_cv_shrext=$shrext_cmds - ]) -if test -n "$libltdl_cv_shlibext"; then - m4_pattern_allow([LT_MODULE_EXT])dnl - AC_DEFINE_UNQUOTED([LT_MODULE_EXT], ["$libltdl_cv_shlibext"], - [Define to the extension used for runtime loadable modules, say, ".so".]) -fi -if test "$libltdl_cv_shrext" != "$libltdl_cv_shlibext"; then - m4_pattern_allow([LT_SHARED_EXT])dnl - AC_DEFINE_UNQUOTED([LT_SHARED_EXT], ["$libltdl_cv_shrext"], - [Define to the shared library suffix, say, ".dylib".]) -fi -]) -m4trace:/usr/share/aclocal/ltdl.m4:572: -1- AU_DEFUN([AC_LTDL_SHLIBEXT], [m4_if($#, 0, [LT_SYS_MODULE_EXT], [LT_SYS_MODULE_EXT($@)])]) -m4trace:/usr/share/aclocal/ltdl.m4:572: -1- AC_DEFUN([AC_LTDL_SHLIBEXT], [AC_DIAGNOSE([obsolete], [The macro `AC_LTDL_SHLIBEXT' is obsolete. -You should run autoupdate.])dnl -m4_if($#, 0, [LT_SYS_MODULE_EXT], [LT_SYS_MODULE_EXT($@)])]) -m4trace:/usr/share/aclocal/ltdl.m4:579: -1- AC_DEFUN([LT_SYS_MODULE_PATH], [m4_require([_LT_SYS_DYNAMIC_LINKER])dnl -AC_CACHE_CHECK([which variable specifies run-time module search path], - [lt_cv_module_path_var], [lt_cv_module_path_var="$shlibpath_var"]) -if test -n "$lt_cv_module_path_var"; then - m4_pattern_allow([LT_MODULE_PATH_VAR])dnl - AC_DEFINE_UNQUOTED([LT_MODULE_PATH_VAR], ["$lt_cv_module_path_var"], - [Define to the name of the environment variable that determines the run-time module search path.]) -fi -]) -m4trace:/usr/share/aclocal/ltdl.m4:591: -1- AU_DEFUN([AC_LTDL_SHLIBPATH], [m4_if($#, 0, [LT_SYS_MODULE_PATH], [LT_SYS_MODULE_PATH($@)])]) -m4trace:/usr/share/aclocal/ltdl.m4:591: -1- AC_DEFUN([AC_LTDL_SHLIBPATH], [AC_DIAGNOSE([obsolete], [The macro `AC_LTDL_SHLIBPATH' is obsolete. -You should run autoupdate.])dnl -m4_if($#, 0, [LT_SYS_MODULE_PATH], [LT_SYS_MODULE_PATH($@)])]) -m4trace:/usr/share/aclocal/ltdl.m4:598: -1- AC_DEFUN([LT_SYS_DLSEARCH_PATH], [m4_require([_LT_SYS_DYNAMIC_LINKER])dnl -AC_CACHE_CHECK([for the default library search path], - [lt_cv_sys_dlsearch_path], - [lt_cv_sys_dlsearch_path="$sys_lib_dlsearch_path_spec"]) -if test -n "$lt_cv_sys_dlsearch_path"; then - sys_dlsearch_path= - for dir in $lt_cv_sys_dlsearch_path; do - if test -z "$sys_dlsearch_path"; then - sys_dlsearch_path="$dir" - else - sys_dlsearch_path="$sys_dlsearch_path$PATH_SEPARATOR$dir" - fi - done - m4_pattern_allow([LT_DLSEARCH_PATH])dnl - AC_DEFINE_UNQUOTED([LT_DLSEARCH_PATH], ["$sys_dlsearch_path"], - [Define to the system default library search path.]) -fi -]) -m4trace:/usr/share/aclocal/ltdl.m4:619: -1- AU_DEFUN([AC_LTDL_SYSSEARCHPATH], [m4_if($#, 0, [LT_SYS_DLSEARCH_PATH], [LT_SYS_DLSEARCH_PATH($@)])]) -m4trace:/usr/share/aclocal/ltdl.m4:619: -1- AC_DEFUN([AC_LTDL_SYSSEARCHPATH], [AC_DIAGNOSE([obsolete], [The macro `AC_LTDL_SYSSEARCHPATH' is obsolete. -You should run autoupdate.])dnl -m4_if($#, 0, [LT_SYS_DLSEARCH_PATH], [LT_SYS_DLSEARCH_PATH($@)])]) -m4trace:/usr/share/aclocal/ltdl.m4:645: -1- AC_DEFUN([LT_LIB_DLLOAD], [m4_pattern_allow([^LT_DLLOADERS$]) -LT_DLLOADERS= -AC_SUBST([LT_DLLOADERS]) - -AC_LANG_PUSH([C]) - -LIBADD_DLOPEN= -AC_SEARCH_LIBS([dlopen], [dl], - [AC_DEFINE([HAVE_LIBDL], [1], - [Define if you have the libdl library or equivalent.]) - if test "$ac_cv_search_dlopen" != "none required" ; then - LIBADD_DLOPEN="-ldl" - fi - libltdl_cv_lib_dl_dlopen="yes" - LT_DLLOADERS="$LT_DLLOADERS ${lt_dlopen_dir+$lt_dlopen_dir/}dlopen.la"], - [AC_LINK_IFELSE([AC_LANG_PROGRAM([[#if HAVE_DLFCN_H -# include -#endif - ]], [[dlopen(0, 0);]])], - [AC_DEFINE([HAVE_LIBDL], [1], - [Define if you have the libdl library or equivalent.]) - libltdl_cv_func_dlopen="yes" - LT_DLLOADERS="$LT_DLLOADERS ${lt_dlopen_dir+$lt_dlopen_dir/}dlopen.la"], - [AC_CHECK_LIB([svld], [dlopen], - [AC_DEFINE([HAVE_LIBDL], [1], - [Define if you have the libdl library or equivalent.]) - LIBADD_DLOPEN="-lsvld" libltdl_cv_func_dlopen="yes" - LT_DLLOADERS="$LT_DLLOADERS ${lt_dlopen_dir+$lt_dlopen_dir/}dlopen.la"])])]) -if test x"$libltdl_cv_func_dlopen" = xyes || test x"$libltdl_cv_lib_dl_dlopen" = xyes -then - lt_save_LIBS="$LIBS" - LIBS="$LIBS $LIBADD_DLOPEN" - AC_CHECK_FUNCS([dlerror]) - LIBS="$lt_save_LIBS" -fi -AC_SUBST([LIBADD_DLOPEN]) - -LIBADD_SHL_LOAD= -AC_CHECK_FUNC([shl_load], - [AC_DEFINE([HAVE_SHL_LOAD], [1], - [Define if you have the shl_load function.]) - LT_DLLOADERS="$LT_DLLOADERS ${lt_dlopen_dir+$lt_dlopen_dir/}shl_load.la"], - [AC_CHECK_LIB([dld], [shl_load], - [AC_DEFINE([HAVE_SHL_LOAD], [1], - [Define if you have the shl_load function.]) - LT_DLLOADERS="$LT_DLLOADERS ${lt_dlopen_dir+$lt_dlopen_dir/}shl_load.la" - LIBADD_SHL_LOAD="-ldld"])]) -AC_SUBST([LIBADD_SHL_LOAD]) - -case $host_os in -darwin[[1567]].*) -# We only want this for pre-Mac OS X 10.4. - AC_CHECK_FUNC([_dyld_func_lookup], - [AC_DEFINE([HAVE_DYLD], [1], - [Define if you have the _dyld_func_lookup function.]) - LT_DLLOADERS="$LT_DLLOADERS ${lt_dlopen_dir+$lt_dlopen_dir/}dyld.la"]) - ;; -beos*) - LT_DLLOADERS="$LT_DLLOADERS ${lt_dlopen_dir+$lt_dlopen_dir/}load_add_on.la" - ;; -cygwin* | mingw* | os2* | pw32*) - AC_CHECK_DECLS([cygwin_conv_path], [], [], [[#include ]]) - LT_DLLOADERS="$LT_DLLOADERS ${lt_dlopen_dir+$lt_dlopen_dir/}loadlibrary.la" - ;; -esac - -AC_CHECK_LIB([dld], [dld_link], - [AC_DEFINE([HAVE_DLD], [1], - [Define if you have the GNU dld library.]) - LT_DLLOADERS="$LT_DLLOADERS ${lt_dlopen_dir+$lt_dlopen_dir/}dld_link.la"]) -AC_SUBST([LIBADD_DLD_LINK]) - -m4_pattern_allow([^LT_DLPREOPEN$]) -LT_DLPREOPEN= -if test -n "$LT_DLLOADERS" -then - for lt_loader in $LT_DLLOADERS; do - LT_DLPREOPEN="$LT_DLPREOPEN-dlpreopen $lt_loader " - done - AC_DEFINE([HAVE_LIBDLLOADER], [1], - [Define if libdlloader will be built on this platform]) -fi -AC_SUBST([LT_DLPREOPEN]) - -dnl This isn't used anymore, but set it for backwards compatibility -LIBADD_DL="$LIBADD_DLOPEN $LIBADD_SHL_LOAD" -AC_SUBST([LIBADD_DL]) - -AC_LANG_POP -]) -m4trace:/usr/share/aclocal/ltdl.m4:738: -1- AU_DEFUN([AC_LTDL_DLLIB], [m4_if($#, 0, [LT_LIB_DLLOAD], [LT_LIB_DLLOAD($@)])]) -m4trace:/usr/share/aclocal/ltdl.m4:738: -1- AC_DEFUN([AC_LTDL_DLLIB], [AC_DIAGNOSE([obsolete], [The macro `AC_LTDL_DLLIB' is obsolete. -You should run autoupdate.])dnl -m4_if($#, 0, [LT_LIB_DLLOAD], [LT_LIB_DLLOAD($@)])]) -m4trace:/usr/share/aclocal/ltdl.m4:746: -1- AC_DEFUN([LT_SYS_SYMBOL_USCORE], [m4_require([_LT_CMD_GLOBAL_SYMBOLS])dnl -AC_CACHE_CHECK([for _ prefix in compiled symbols], - [lt_cv_sys_symbol_underscore], - [lt_cv_sys_symbol_underscore=no - cat > conftest.$ac_ext <<_LT_EOF -void nm_test_func(){} -int main(){nm_test_func;return 0;} -_LT_EOF - if AC_TRY_EVAL(ac_compile); then - # Now try to grab the symbols. - ac_nlist=conftest.nm - if AC_TRY_EVAL(NM conftest.$ac_objext \| $lt_cv_sys_global_symbol_pipe \> $ac_nlist) && test -s "$ac_nlist"; then - # See whether the symbols have a leading underscore. - if grep '^. _nm_test_func' "$ac_nlist" >/dev/null; then - lt_cv_sys_symbol_underscore=yes - else - if grep '^. nm_test_func ' "$ac_nlist" >/dev/null; then - : - else - echo "configure: cannot find nm_test_func in $ac_nlist" >&AS_MESSAGE_LOG_FD - fi - fi - else - echo "configure: cannot run $lt_cv_sys_global_symbol_pipe" >&AS_MESSAGE_LOG_FD - fi - else - echo "configure: failed program was:" >&AS_MESSAGE_LOG_FD - cat conftest.c >&AS_MESSAGE_LOG_FD - fi - rm -rf conftest* - ]) - sys_symbol_underscore=$lt_cv_sys_symbol_underscore - AC_SUBST([sys_symbol_underscore]) -]) -m4trace:/usr/share/aclocal/ltdl.m4:783: -1- AU_DEFUN([AC_LTDL_SYMBOL_USCORE], [m4_if($#, 0, [LT_SYS_SYMBOL_USCORE], [LT_SYS_SYMBOL_USCORE($@)])]) -m4trace:/usr/share/aclocal/ltdl.m4:783: -1- AC_DEFUN([AC_LTDL_SYMBOL_USCORE], [AC_DIAGNOSE([obsolete], [The macro `AC_LTDL_SYMBOL_USCORE' is obsolete. -You should run autoupdate.])dnl -m4_if($#, 0, [LT_SYS_SYMBOL_USCORE], [LT_SYS_SYMBOL_USCORE($@)])]) -m4trace:/usr/share/aclocal/ltdl.m4:790: -1- AC_DEFUN([LT_FUNC_DLSYM_USCORE], [AC_REQUIRE([LT_SYS_SYMBOL_USCORE])dnl -if test x"$lt_cv_sys_symbol_underscore" = xyes; then - if test x"$libltdl_cv_func_dlopen" = xyes || - test x"$libltdl_cv_lib_dl_dlopen" = xyes ; then - AC_CACHE_CHECK([whether we have to add an underscore for dlsym], - [libltdl_cv_need_uscore], - [libltdl_cv_need_uscore=unknown - save_LIBS="$LIBS" - LIBS="$LIBS $LIBADD_DLOPEN" - _LT_TRY_DLOPEN_SELF( - [libltdl_cv_need_uscore=no], [libltdl_cv_need_uscore=yes], - [], [libltdl_cv_need_uscore=cross]) - LIBS="$save_LIBS" - ]) - fi -fi - -if test x"$libltdl_cv_need_uscore" = xyes; then - AC_DEFINE([NEED_USCORE], [1], - [Define if dlsym() requires a leading underscore in symbol names.]) -fi -]) -m4trace:/usr/share/aclocal/ltdl.m4:815: -1- AU_DEFUN([AC_LTDL_DLSYM_USCORE], [m4_if($#, 0, [LT_FUNC_DLSYM_USCORE], [LT_FUNC_DLSYM_USCORE($@)])]) -m4trace:/usr/share/aclocal/ltdl.m4:815: -1- AC_DEFUN([AC_LTDL_DLSYM_USCORE], [AC_DIAGNOSE([obsolete], [The macro `AC_LTDL_DLSYM_USCORE' is obsolete. -You should run autoupdate.])dnl -m4_if($#, 0, [LT_FUNC_DLSYM_USCORE], [LT_FUNC_DLSYM_USCORE($@)])]) -m4trace:/usr/share/aclocal/ltoptions.m4:14: -1- AC_DEFUN([LTOPTIONS_VERSION], [m4_if([1])]) -m4trace:/usr/share/aclocal/ltoptions.m4:111: -1- AU_DEFUN([AC_LIBTOOL_DLOPEN], [_LT_SET_OPTION([LT_INIT], [dlopen]) -AC_DIAGNOSE([obsolete], -[$0: Remove this warning and the call to _LT_SET_OPTION when you -put the `dlopen' option into LT_INIT's first parameter.]) -]) -m4trace:/usr/share/aclocal/ltoptions.m4:111: -1- AC_DEFUN([AC_LIBTOOL_DLOPEN], [AC_DIAGNOSE([obsolete], [The macro `AC_LIBTOOL_DLOPEN' is obsolete. -You should run autoupdate.])dnl -_LT_SET_OPTION([LT_INIT], [dlopen]) -AC_DIAGNOSE([obsolete], -[$0: Remove this warning and the call to _LT_SET_OPTION when you -put the `dlopen' option into LT_INIT's first parameter.]) -]) -m4trace:/usr/share/aclocal/ltoptions.m4:146: -1- AU_DEFUN([AC_LIBTOOL_WIN32_DLL], [AC_REQUIRE([AC_CANONICAL_HOST])dnl -_LT_SET_OPTION([LT_INIT], [win32-dll]) -AC_DIAGNOSE([obsolete], -[$0: Remove this warning and the call to _LT_SET_OPTION when you -put the `win32-dll' option into LT_INIT's first parameter.]) -]) -m4trace:/usr/share/aclocal/ltoptions.m4:146: -1- AC_DEFUN([AC_LIBTOOL_WIN32_DLL], [AC_DIAGNOSE([obsolete], [The macro `AC_LIBTOOL_WIN32_DLL' is obsolete. -You should run autoupdate.])dnl -AC_REQUIRE([AC_CANONICAL_HOST])dnl -_LT_SET_OPTION([LT_INIT], [win32-dll]) -AC_DIAGNOSE([obsolete], -[$0: Remove this warning and the call to _LT_SET_OPTION when you -put the `win32-dll' option into LT_INIT's first parameter.]) -]) -m4trace:/usr/share/aclocal/ltoptions.m4:195: -1- AC_DEFUN([AC_ENABLE_SHARED], [_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[shared]) -]) -m4trace:/usr/share/aclocal/ltoptions.m4:199: -1- AC_DEFUN([AC_DISABLE_SHARED], [_LT_SET_OPTION([LT_INIT], [disable-shared]) -]) -m4trace:/usr/share/aclocal/ltoptions.m4:203: -1- AU_DEFUN([AM_ENABLE_SHARED], [AC_ENABLE_SHARED($@)]) -m4trace:/usr/share/aclocal/ltoptions.m4:203: -1- AC_DEFUN([AM_ENABLE_SHARED], [AC_DIAGNOSE([obsolete], [The macro `AM_ENABLE_SHARED' is obsolete. -You should run autoupdate.])dnl -AC_ENABLE_SHARED($@)]) -m4trace:/usr/share/aclocal/ltoptions.m4:204: -1- AU_DEFUN([AM_DISABLE_SHARED], [AC_DISABLE_SHARED($@)]) -m4trace:/usr/share/aclocal/ltoptions.m4:204: -1- AC_DEFUN([AM_DISABLE_SHARED], [AC_DIAGNOSE([obsolete], [The macro `AM_DISABLE_SHARED' is obsolete. -You should run autoupdate.])dnl -AC_DISABLE_SHARED($@)]) -m4trace:/usr/share/aclocal/ltoptions.m4:249: -1- AC_DEFUN([AC_ENABLE_STATIC], [_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[static]) -]) -m4trace:/usr/share/aclocal/ltoptions.m4:253: -1- AC_DEFUN([AC_DISABLE_STATIC], [_LT_SET_OPTION([LT_INIT], [disable-static]) -]) -m4trace:/usr/share/aclocal/ltoptions.m4:257: -1- AU_DEFUN([AM_ENABLE_STATIC], [AC_ENABLE_STATIC($@)]) -m4trace:/usr/share/aclocal/ltoptions.m4:257: -1- AC_DEFUN([AM_ENABLE_STATIC], [AC_DIAGNOSE([obsolete], [The macro `AM_ENABLE_STATIC' is obsolete. -You should run autoupdate.])dnl -AC_ENABLE_STATIC($@)]) -m4trace:/usr/share/aclocal/ltoptions.m4:258: -1- AU_DEFUN([AM_DISABLE_STATIC], [AC_DISABLE_STATIC($@)]) -m4trace:/usr/share/aclocal/ltoptions.m4:258: -1- AC_DEFUN([AM_DISABLE_STATIC], [AC_DIAGNOSE([obsolete], [The macro `AM_DISABLE_STATIC' is obsolete. -You should run autoupdate.])dnl -AC_DISABLE_STATIC($@)]) -m4trace:/usr/share/aclocal/ltoptions.m4:303: -1- AU_DEFUN([AC_ENABLE_FAST_INSTALL], [_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[fast-install]) -AC_DIAGNOSE([obsolete], -[$0: Remove this warning and the call to _LT_SET_OPTION when you put -the `fast-install' option into LT_INIT's first parameter.]) -]) -m4trace:/usr/share/aclocal/ltoptions.m4:303: -1- AC_DEFUN([AC_ENABLE_FAST_INSTALL], [AC_DIAGNOSE([obsolete], [The macro `AC_ENABLE_FAST_INSTALL' is obsolete. -You should run autoupdate.])dnl -_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[fast-install]) -AC_DIAGNOSE([obsolete], -[$0: Remove this warning and the call to _LT_SET_OPTION when you put -the `fast-install' option into LT_INIT's first parameter.]) -]) -m4trace:/usr/share/aclocal/ltoptions.m4:310: -1- AU_DEFUN([AC_DISABLE_FAST_INSTALL], [_LT_SET_OPTION([LT_INIT], [disable-fast-install]) -AC_DIAGNOSE([obsolete], -[$0: Remove this warning and the call to _LT_SET_OPTION when you put -the `disable-fast-install' option into LT_INIT's first parameter.]) -]) -m4trace:/usr/share/aclocal/ltoptions.m4:310: -1- AC_DEFUN([AC_DISABLE_FAST_INSTALL], [AC_DIAGNOSE([obsolete], [The macro `AC_DISABLE_FAST_INSTALL' is obsolete. -You should run autoupdate.])dnl -_LT_SET_OPTION([LT_INIT], [disable-fast-install]) -AC_DIAGNOSE([obsolete], -[$0: Remove this warning and the call to _LT_SET_OPTION when you put -the `disable-fast-install' option into LT_INIT's first parameter.]) -]) -m4trace:/usr/share/aclocal/ltoptions.m4:358: -1- AU_DEFUN([AC_LIBTOOL_PICMODE], [_LT_SET_OPTION([LT_INIT], [pic-only]) -AC_DIAGNOSE([obsolete], -[$0: Remove this warning and the call to _LT_SET_OPTION when you -put the `pic-only' option into LT_INIT's first parameter.]) -]) -m4trace:/usr/share/aclocal/ltoptions.m4:358: -1- AC_DEFUN([AC_LIBTOOL_PICMODE], [AC_DIAGNOSE([obsolete], [The macro `AC_LIBTOOL_PICMODE' is obsolete. -You should run autoupdate.])dnl -_LT_SET_OPTION([LT_INIT], [pic-only]) -AC_DIAGNOSE([obsolete], -[$0: Remove this warning and the call to _LT_SET_OPTION when you -put the `pic-only' option into LT_INIT's first parameter.]) -]) -m4trace:/usr/share/aclocal/ltsugar.m4:13: -1- AC_DEFUN([LTSUGAR_VERSION], [m4_if([0.1])]) -m4trace:/usr/share/aclocal/ltversion.m4:18: -1- AC_DEFUN([LTVERSION_VERSION], [macro_version='2.4.2' -macro_revision='1.3337' -_LT_DECL(, macro_version, 0, [Which release of libtool.m4 was used?]) -_LT_DECL(, macro_revision, 0) -]) -m4trace:/usr/share/aclocal/lt~obsolete.m4:36: -1- AC_DEFUN([LTOBSOLETE_VERSION], [m4_if([1])]) -m4trace:/usr/share/aclocal/lt~obsolete.m4:40: -1- AC_DEFUN([_LT_AC_PROG_ECHO_BACKSLASH]) -m4trace:/usr/share/aclocal/lt~obsolete.m4:41: -1- AC_DEFUN([_LT_AC_SHELL_INIT]) -m4trace:/usr/share/aclocal/lt~obsolete.m4:42: -1- AC_DEFUN([_LT_AC_SYS_LIBPATH_AIX]) -m4trace:/usr/share/aclocal/lt~obsolete.m4:44: -1- AC_DEFUN([_LT_AC_TAGVAR]) -m4trace:/usr/share/aclocal/lt~obsolete.m4:45: -1- AC_DEFUN([AC_LTDL_ENABLE_INSTALL]) -m4trace:/usr/share/aclocal/lt~obsolete.m4:46: -1- AC_DEFUN([AC_LTDL_PREOPEN]) -m4trace:/usr/share/aclocal/lt~obsolete.m4:47: -1- AC_DEFUN([_LT_AC_SYS_COMPILER]) -m4trace:/usr/share/aclocal/lt~obsolete.m4:48: -1- AC_DEFUN([_LT_AC_LOCK]) -m4trace:/usr/share/aclocal/lt~obsolete.m4:49: -1- AC_DEFUN([AC_LIBTOOL_SYS_OLD_ARCHIVE]) -m4trace:/usr/share/aclocal/lt~obsolete.m4:50: -1- AC_DEFUN([_LT_AC_TRY_DLOPEN_SELF]) -m4trace:/usr/share/aclocal/lt~obsolete.m4:51: -1- AC_DEFUN([AC_LIBTOOL_PROG_CC_C_O]) -m4trace:/usr/share/aclocal/lt~obsolete.m4:52: -1- AC_DEFUN([AC_LIBTOOL_SYS_HARD_LINK_LOCKS]) -m4trace:/usr/share/aclocal/lt~obsolete.m4:53: -1- AC_DEFUN([AC_LIBTOOL_OBJDIR]) -m4trace:/usr/share/aclocal/lt~obsolete.m4:54: -1- AC_DEFUN([AC_LTDL_OBJDIR]) -m4trace:/usr/share/aclocal/lt~obsolete.m4:55: -1- AC_DEFUN([AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH]) -m4trace:/usr/share/aclocal/lt~obsolete.m4:56: -1- AC_DEFUN([AC_LIBTOOL_SYS_LIB_STRIP]) -m4trace:/usr/share/aclocal/lt~obsolete.m4:57: -1- AC_DEFUN([AC_PATH_MAGIC]) -m4trace:/usr/share/aclocal/lt~obsolete.m4:58: -1- AC_DEFUN([AC_PROG_LD_GNU]) -m4trace:/usr/share/aclocal/lt~obsolete.m4:59: -1- AC_DEFUN([AC_PROG_LD_RELOAD_FLAG]) -m4trace:/usr/share/aclocal/lt~obsolete.m4:60: -1- AC_DEFUN([AC_DEPLIBS_CHECK_METHOD]) -m4trace:/usr/share/aclocal/lt~obsolete.m4:61: -1- AC_DEFUN([AC_LIBTOOL_PROG_COMPILER_NO_RTTI]) -m4trace:/usr/share/aclocal/lt~obsolete.m4:62: -1- AC_DEFUN([AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE]) -m4trace:/usr/share/aclocal/lt~obsolete.m4:63: -1- AC_DEFUN([AC_LIBTOOL_PROG_COMPILER_PIC]) -m4trace:/usr/share/aclocal/lt~obsolete.m4:64: -1- AC_DEFUN([AC_LIBTOOL_PROG_LD_SHLIBS]) -m4trace:/usr/share/aclocal/lt~obsolete.m4:65: -1- AC_DEFUN([AC_LIBTOOL_POSTDEP_PREDEP]) -m4trace:/usr/share/aclocal/lt~obsolete.m4:66: -1- AC_DEFUN([LT_AC_PROG_EGREP]) -m4trace:/usr/share/aclocal/lt~obsolete.m4:71: -1- AC_DEFUN([_AC_PROG_LIBTOOL]) -m4trace:/usr/share/aclocal/lt~obsolete.m4:72: -1- AC_DEFUN([AC_LIBTOOL_SETUP]) -m4trace:/usr/share/aclocal/lt~obsolete.m4:73: -1- AC_DEFUN([_LT_AC_CHECK_DLFCN]) -m4trace:/usr/share/aclocal/lt~obsolete.m4:74: -1- AC_DEFUN([AC_LIBTOOL_SYS_DYNAMIC_LINKER]) -m4trace:/usr/share/aclocal/lt~obsolete.m4:75: -1- AC_DEFUN([_LT_AC_TAGCONFIG]) -m4trace:/usr/share/aclocal/lt~obsolete.m4:77: -1- AC_DEFUN([_LT_AC_LANG_CXX]) -m4trace:/usr/share/aclocal/lt~obsolete.m4:78: -1- AC_DEFUN([_LT_AC_LANG_F77]) -m4trace:/usr/share/aclocal/lt~obsolete.m4:79: -1- AC_DEFUN([_LT_AC_LANG_GCJ]) -m4trace:/usr/share/aclocal/lt~obsolete.m4:80: -1- AC_DEFUN([AC_LIBTOOL_LANG_C_CONFIG]) -m4trace:/usr/share/aclocal/lt~obsolete.m4:81: -1- AC_DEFUN([_LT_AC_LANG_C_CONFIG]) -m4trace:/usr/share/aclocal/lt~obsolete.m4:82: -1- AC_DEFUN([AC_LIBTOOL_LANG_CXX_CONFIG]) -m4trace:/usr/share/aclocal/lt~obsolete.m4:83: -1- AC_DEFUN([_LT_AC_LANG_CXX_CONFIG]) -m4trace:/usr/share/aclocal/lt~obsolete.m4:84: -1- AC_DEFUN([AC_LIBTOOL_LANG_F77_CONFIG]) -m4trace:/usr/share/aclocal/lt~obsolete.m4:85: -1- AC_DEFUN([_LT_AC_LANG_F77_CONFIG]) -m4trace:/usr/share/aclocal/lt~obsolete.m4:86: -1- AC_DEFUN([AC_LIBTOOL_LANG_GCJ_CONFIG]) -m4trace:/usr/share/aclocal/lt~obsolete.m4:87: -1- AC_DEFUN([_LT_AC_LANG_GCJ_CONFIG]) -m4trace:/usr/share/aclocal/lt~obsolete.m4:88: -1- AC_DEFUN([AC_LIBTOOL_LANG_RC_CONFIG]) -m4trace:/usr/share/aclocal/lt~obsolete.m4:89: -1- AC_DEFUN([_LT_AC_LANG_RC_CONFIG]) -m4trace:/usr/share/aclocal/lt~obsolete.m4:90: -1- AC_DEFUN([AC_LIBTOOL_CONFIG]) -m4trace:/usr/share/aclocal/lt~obsolete.m4:91: -1- AC_DEFUN([_LT_AC_FILE_LTDLL_C]) -m4trace:/usr/share/aclocal/lt~obsolete.m4:93: -1- AC_DEFUN([_LT_AC_PROG_CXXCPP]) -m4trace:/usr/share/aclocal/lt~obsolete.m4:96: -1- AC_DEFUN([_LT_PROG_F77]) -m4trace:/usr/share/aclocal/lt~obsolete.m4:97: -1- AC_DEFUN([_LT_PROG_FC]) -m4trace:/usr/share/aclocal/lt~obsolete.m4:98: -1- AC_DEFUN([_LT_PROG_CXX]) -m4trace:/usr/share/aclocal-1.11/amversion.m4:17: -1- AC_DEFUN([AM_AUTOMAKE_VERSION], [am__api_version='1.11' -dnl Some users find AM_AUTOMAKE_VERSION and mistake it for a way to -dnl require some minimum version. Point them to the right macro. -m4_if([$1], [1.11.6], [], - [AC_FATAL([Do not call $0, use AM_INIT_AUTOMAKE([$1]).])])dnl -]) -m4trace:/usr/share/aclocal-1.11/amversion.m4:36: -1- AC_DEFUN([AM_SET_CURRENT_AUTOMAKE_VERSION], [AM_AUTOMAKE_VERSION([1.11.6])dnl -m4_ifndef([AC_AUTOCONF_VERSION], - [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl -_AM_AUTOCONF_VERSION(m4_defn([AC_AUTOCONF_VERSION]))]) -m4trace:/usr/share/aclocal-1.11/auxdir.m4:49: -1- AC_DEFUN([AM_AUX_DIR_EXPAND], [dnl Rely on autoconf to set up CDPATH properly. -AC_PREREQ([2.50])dnl -# expand $ac_aux_dir to an absolute path -am_aux_dir=`cd $ac_aux_dir && pwd` -]) -m4trace:/usr/share/aclocal-1.11/cond.m4:15: -1- AC_DEFUN([AM_CONDITIONAL], [AC_PREREQ(2.52)dnl - ifelse([$1], [TRUE], [AC_FATAL([$0: invalid condition: $1])], - [$1], [FALSE], [AC_FATAL([$0: invalid condition: $1])])dnl -AC_SUBST([$1_TRUE])dnl -AC_SUBST([$1_FALSE])dnl -_AM_SUBST_NOTMAKE([$1_TRUE])dnl -_AM_SUBST_NOTMAKE([$1_FALSE])dnl -m4_define([_AM_COND_VALUE_$1], [$2])dnl -if $2; then - $1_TRUE= - $1_FALSE='#' -else - $1_TRUE='#' - $1_FALSE= -fi -AC_CONFIG_COMMANDS_PRE( -[if test -z "${$1_TRUE}" && test -z "${$1_FALSE}"; then - AC_MSG_ERROR([[conditional "$1" was never defined. -Usually this means the macro was only invoked conditionally.]]) -fi])]) -m4trace:/usr/share/aclocal-1.11/depend.m4:28: -1- AC_DEFUN([_AM_DEPENDENCIES], [AC_REQUIRE([AM_SET_DEPDIR])dnl -AC_REQUIRE([AM_OUTPUT_DEPENDENCY_COMMANDS])dnl -AC_REQUIRE([AM_MAKE_INCLUDE])dnl -AC_REQUIRE([AM_DEP_TRACK])dnl - -ifelse([$1], CC, [depcc="$CC" am_compiler_list=], - [$1], CXX, [depcc="$CXX" am_compiler_list=], - [$1], OBJC, [depcc="$OBJC" am_compiler_list='gcc3 gcc'], - [$1], UPC, [depcc="$UPC" am_compiler_list=], - [$1], GCJ, [depcc="$GCJ" am_compiler_list='gcc3 gcc'], - [depcc="$$1" am_compiler_list=]) - -AC_CACHE_CHECK([dependency style of $depcc], - [am_cv_$1_dependencies_compiler_type], -[if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then - # We make a subdir and do the tests there. Otherwise we can end up - # making bogus files that we don't know about and never remove. For - # instance it was reported that on HP-UX the gcc test will end up - # making a dummy file named `D' -- because `-MD' means `put the output - # in D'. - rm -rf conftest.dir - mkdir conftest.dir - # Copy depcomp to subdir because otherwise we won't find it if we're - # using a relative directory. - cp "$am_depcomp" conftest.dir - cd conftest.dir - # We will build objects and dependencies in a subdirectory because - # it helps to detect inapplicable dependency modes. For instance - # both Tru64's cc and ICC support -MD to output dependencies as a - # side effect of compilation, but ICC will put the dependencies in - # the current directory while Tru64 will put them in the object - # directory. - mkdir sub - - am_cv_$1_dependencies_compiler_type=none - if test "$am_compiler_list" = ""; then - am_compiler_list=`sed -n ['s/^#*\([a-zA-Z0-9]*\))$/\1/p'] < ./depcomp` - fi - am__universal=false - m4_case([$1], [CC], - [case " $depcc " in #( - *\ -arch\ *\ -arch\ *) am__universal=true ;; - esac], - [CXX], - [case " $depcc " in #( - *\ -arch\ *\ -arch\ *) am__universal=true ;; - esac]) - - for depmode in $am_compiler_list; do - # Setup a source with many dependencies, because some compilers - # like to wrap large dependency lists on column 80 (with \), and - # we should not choose a depcomp mode which is confused by this. - # - # We need to recreate these files for each test, as the compiler may - # overwrite some of them when testing with obscure command lines. - # This happens at least with the AIX C compiler. - : > sub/conftest.c - for i in 1 2 3 4 5 6; do - echo '#include "conftst'$i'.h"' >> sub/conftest.c - # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with - # Solaris 8's {/usr,}/bin/sh. - touch sub/conftst$i.h - done - echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf - - # We check with `-c' and `-o' for the sake of the "dashmstdout" - # mode. It turns out that the SunPro C++ compiler does not properly - # handle `-M -o', and we need to detect this. Also, some Intel - # versions had trouble with output in subdirs - am__obj=sub/conftest.${OBJEXT-o} - am__minus_obj="-o $am__obj" - case $depmode in - gcc) - # This depmode causes a compiler race in universal mode. - test "$am__universal" = false || continue - ;; - nosideeffect) - # after this tag, mechanisms are not by side-effect, so they'll - # only be used when explicitly requested - if test "x$enable_dependency_tracking" = xyes; then - continue - else - break - fi - ;; - msvc7 | msvc7msys | msvisualcpp | msvcmsys) - # This compiler won't grok `-c -o', but also, the minuso test has - # not run yet. These depmodes are late enough in the game, and - # so weak that their functioning should not be impacted. - am__obj=conftest.${OBJEXT-o} - am__minus_obj= - ;; - none) break ;; - esac - if depmode=$depmode \ - source=sub/conftest.c object=$am__obj \ - depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ - $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ - >/dev/null 2>conftest.err && - grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && - grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && - grep $am__obj sub/conftest.Po > /dev/null 2>&1 && - ${MAKE-make} -s -f confmf > /dev/null 2>&1; then - # icc doesn't choke on unknown options, it will just issue warnings - # or remarks (even with -Werror). So we grep stderr for any message - # that says an option was ignored or not supported. - # When given -MP, icc 7.0 and 7.1 complain thusly: - # icc: Command line warning: ignoring option '-M'; no argument required - # The diagnosis changed in icc 8.0: - # icc: Command line remark: option '-MP' not supported - if (grep 'ignoring option' conftest.err || - grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else - am_cv_$1_dependencies_compiler_type=$depmode - break - fi - fi - done - - cd .. - rm -rf conftest.dir -else - am_cv_$1_dependencies_compiler_type=none -fi -]) -AC_SUBST([$1DEPMODE], [depmode=$am_cv_$1_dependencies_compiler_type]) -AM_CONDITIONAL([am__fastdep$1], [ - test "x$enable_dependency_tracking" != xno \ - && test "$am_cv_$1_dependencies_compiler_type" = gcc3]) -]) -m4trace:/usr/share/aclocal-1.11/depend.m4:164: -1- AC_DEFUN([AM_SET_DEPDIR], [AC_REQUIRE([AM_SET_LEADING_DOT])dnl -AC_SUBST([DEPDIR], ["${am__leading_dot}deps"])dnl -]) -m4trace:/usr/share/aclocal-1.11/depend.m4:172: -1- AC_DEFUN([AM_DEP_TRACK], [AC_ARG_ENABLE(dependency-tracking, -[ --disable-dependency-tracking speeds up one-time build - --enable-dependency-tracking do not reject slow dependency extractors]) -if test "x$enable_dependency_tracking" != xno; then - am_depcomp="$ac_aux_dir/depcomp" - AMDEPBACKSLASH='\' - am__nodep='_no' -fi -AM_CONDITIONAL([AMDEP], [test "x$enable_dependency_tracking" != xno]) -AC_SUBST([AMDEPBACKSLASH])dnl -_AM_SUBST_NOTMAKE([AMDEPBACKSLASH])dnl -AC_SUBST([am__nodep])dnl -_AM_SUBST_NOTMAKE([am__nodep])dnl -]) -m4trace:/usr/share/aclocal-1.11/depout.m4:14: -1- AC_DEFUN([_AM_OUTPUT_DEPENDENCY_COMMANDS], [{ - # Autoconf 2.62 quotes --file arguments for eval, but not when files - # are listed without --file. Let's play safe and only enable the eval - # if we detect the quoting. - case $CONFIG_FILES in - *\'*) eval set x "$CONFIG_FILES" ;; - *) set x $CONFIG_FILES ;; - esac - shift - for mf - do - # Strip MF so we end up with the name of the file. - mf=`echo "$mf" | sed -e 's/:.*$//'` - # Check whether this is an Automake generated Makefile or not. - # We used to match only the files named `Makefile.in', but - # some people rename them; so instead we look at the file content. - # Grep'ing the first line is not enough: some people post-process - # each Makefile.in and add a new line on top of each file to say so. - # Grep'ing the whole file is not good either: AIX grep has a line - # limit of 2048, but all sed's we know have understand at least 4000. - if sed -n 's,^#.*generated by automake.*,X,p' "$mf" | grep X >/dev/null 2>&1; then - dirpart=`AS_DIRNAME("$mf")` - else - continue - fi - # Extract the definition of DEPDIR, am__include, and am__quote - # from the Makefile without running `make'. - DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"` - test -z "$DEPDIR" && continue - am__include=`sed -n 's/^am__include = //p' < "$mf"` - test -z "am__include" && continue - am__quote=`sed -n 's/^am__quote = //p' < "$mf"` - # When using ansi2knr, U may be empty or an underscore; expand it - U=`sed -n 's/^U = //p' < "$mf"` - # Find all dependency output files, they are included files with - # $(DEPDIR) in their names. We invoke sed twice because it is the - # simplest approach to changing $(DEPDIR) to its actual value in the - # expansion. - for file in `sed -n " - s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \ - sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g' -e 's/\$U/'"$U"'/g'`; do - # Make sure the directory exists. - test -f "$dirpart/$file" && continue - fdir=`AS_DIRNAME(["$file"])` - AS_MKDIR_P([$dirpart/$fdir]) - # echo "creating $dirpart/$file" - echo '# dummy' > "$dirpart/$file" - done - done -} -]) -m4trace:/usr/share/aclocal-1.11/depout.m4:75: -1- AC_DEFUN([AM_OUTPUT_DEPENDENCY_COMMANDS], [AC_CONFIG_COMMANDS([depfiles], - [test x"$AMDEP_TRUE" != x"" || _AM_OUTPUT_DEPENDENCY_COMMANDS], - [AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir"]) -]) -m4trace:/usr/share/aclocal-1.11/init.m4:26: -1- AC_DEFUN([AM_INIT_AUTOMAKE], [AC_PREREQ([2.62])dnl -dnl Autoconf wants to disallow AM_ names. We explicitly allow -dnl the ones we care about. -m4_pattern_allow([^AM_[A-Z]+FLAGS$])dnl -AC_REQUIRE([AM_SET_CURRENT_AUTOMAKE_VERSION])dnl -AC_REQUIRE([AC_PROG_INSTALL])dnl -if test "`cd $srcdir && pwd`" != "`pwd`"; then - # Use -I$(srcdir) only when $(srcdir) != ., so that make's output - # is not polluted with repeated "-I." - AC_SUBST([am__isrc], [' -I$(srcdir)'])_AM_SUBST_NOTMAKE([am__isrc])dnl - # test to see if srcdir already configured - if test -f $srcdir/config.status; then - AC_MSG_ERROR([source directory already configured; run "make distclean" there first]) - fi -fi - -# test whether we have cygpath -if test -z "$CYGPATH_W"; then - if (cygpath --version) >/dev/null 2>/dev/null; then - CYGPATH_W='cygpath -w' - else - CYGPATH_W=echo - fi -fi -AC_SUBST([CYGPATH_W]) - -# Define the identity of the package. -dnl Distinguish between old-style and new-style calls. -m4_ifval([$2], -[m4_ifval([$3], [_AM_SET_OPTION([no-define])])dnl - AC_SUBST([PACKAGE], [$1])dnl - AC_SUBST([VERSION], [$2])], -[_AM_SET_OPTIONS([$1])dnl -dnl Diagnose old-style AC_INIT with new-style AM_AUTOMAKE_INIT. -m4_if(m4_ifdef([AC_PACKAGE_NAME], 1)m4_ifdef([AC_PACKAGE_VERSION], 1), 11,, - [m4_fatal([AC_INIT should be called with package and version arguments])])dnl - AC_SUBST([PACKAGE], ['AC_PACKAGE_TARNAME'])dnl - AC_SUBST([VERSION], ['AC_PACKAGE_VERSION'])])dnl - -_AM_IF_OPTION([no-define],, -[AC_DEFINE_UNQUOTED(PACKAGE, "$PACKAGE", [Name of package]) - AC_DEFINE_UNQUOTED(VERSION, "$VERSION", [Version number of package])])dnl - -# Some tools Automake needs. -AC_REQUIRE([AM_SANITY_CHECK])dnl -AC_REQUIRE([AC_ARG_PROGRAM])dnl -AM_MISSING_PROG(ACLOCAL, aclocal-${am__api_version}) -AM_MISSING_PROG(AUTOCONF, autoconf) -AM_MISSING_PROG(AUTOMAKE, automake-${am__api_version}) -AM_MISSING_PROG(AUTOHEADER, autoheader) -AM_MISSING_PROG(MAKEINFO, makeinfo) -AC_REQUIRE([AM_PROG_INSTALL_SH])dnl -AC_REQUIRE([AM_PROG_INSTALL_STRIP])dnl -AC_REQUIRE([AM_PROG_MKDIR_P])dnl -# We need awk for the "check" target. The system "awk" is bad on -# some platforms. -AC_REQUIRE([AC_PROG_AWK])dnl -AC_REQUIRE([AC_PROG_MAKE_SET])dnl -AC_REQUIRE([AM_SET_LEADING_DOT])dnl -_AM_IF_OPTION([tar-ustar], [_AM_PROG_TAR([ustar])], - [_AM_IF_OPTION([tar-pax], [_AM_PROG_TAR([pax])], - [_AM_PROG_TAR([v7])])]) -_AM_IF_OPTION([no-dependencies],, -[AC_PROVIDE_IFELSE([AC_PROG_CC], - [_AM_DEPENDENCIES(CC)], - [define([AC_PROG_CC], - defn([AC_PROG_CC])[_AM_DEPENDENCIES(CC)])])dnl -AC_PROVIDE_IFELSE([AC_PROG_CXX], - [_AM_DEPENDENCIES(CXX)], - [define([AC_PROG_CXX], - defn([AC_PROG_CXX])[_AM_DEPENDENCIES(CXX)])])dnl -AC_PROVIDE_IFELSE([AC_PROG_OBJC], - [_AM_DEPENDENCIES(OBJC)], - [define([AC_PROG_OBJC], - defn([AC_PROG_OBJC])[_AM_DEPENDENCIES(OBJC)])])dnl -]) -_AM_IF_OPTION([silent-rules], [AC_REQUIRE([AM_SILENT_RULES])])dnl -dnl The `parallel-tests' driver may need to know about EXEEXT, so add the -dnl `am__EXEEXT' conditional if _AM_COMPILER_EXEEXT was seen. This macro -dnl is hooked onto _AC_COMPILER_EXEEXT early, see below. -AC_CONFIG_COMMANDS_PRE(dnl -[m4_provide_if([_AM_COMPILER_EXEEXT], - [AM_CONDITIONAL([am__EXEEXT], [test -n "$EXEEXT"])])])dnl -]) -m4trace:/usr/share/aclocal-1.11/init.m4:126: -1- AC_DEFUN([_AC_AM_CONFIG_HEADER_HOOK], [# Compute $1's index in $config_headers. -_am_arg=$1 -_am_stamp_count=1 -for _am_header in $config_headers :; do - case $_am_header in - $_am_arg | $_am_arg:* ) - break ;; - * ) - _am_stamp_count=`expr $_am_stamp_count + 1` ;; - esac -done -echo "timestamp for $_am_arg" >`AS_DIRNAME(["$_am_arg"])`/stamp-h[]$_am_stamp_count]) -m4trace:/usr/share/aclocal-1.11/install-sh.m4:14: -1- AC_DEFUN([AM_PROG_INSTALL_SH], [AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl -if test x"${install_sh}" != xset; then - case $am_aux_dir in - *\ * | *\ *) - install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;; - *) - install_sh="\${SHELL} $am_aux_dir/install-sh" - esac -fi -AC_SUBST(install_sh)]) -m4trace:/usr/share/aclocal-1.11/lead-dot.m4:12: -1- AC_DEFUN([AM_SET_LEADING_DOT], [rm -rf .tst 2>/dev/null -mkdir .tst 2>/dev/null -if test -d .tst; then - am__leading_dot=. -else - am__leading_dot=_ -fi -rmdir .tst 2>/dev/null -AC_SUBST([am__leading_dot])]) -m4trace:/usr/share/aclocal-1.11/make.m4:14: -1- AC_DEFUN([AM_MAKE_INCLUDE], [am_make=${MAKE-make} -cat > confinc << 'END' -am__doit: - @echo this is the am__doit target -.PHONY: am__doit -END -# If we don't find an include directive, just comment out the code. -AC_MSG_CHECKING([for style of include used by $am_make]) -am__include="#" -am__quote= -_am_result=none -# First try GNU make style include. -echo "include confinc" > confmf -# Ignore all kinds of additional output from `make'. -case `$am_make -s -f confmf 2> /dev/null` in #( -*the\ am__doit\ target*) - am__include=include - am__quote= - _am_result=GNU - ;; -esac -# Now try BSD make style include. -if test "$am__include" = "#"; then - echo '.include "confinc"' > confmf - case `$am_make -s -f confmf 2> /dev/null` in #( - *the\ am__doit\ target*) - am__include=.include - am__quote="\"" - _am_result=BSD - ;; - esac -fi -AC_SUBST([am__include]) -AC_SUBST([am__quote]) -AC_MSG_RESULT([$_am_result]) -rm -f confinc confmf -]) -m4trace:/usr/share/aclocal-1.11/minuso.m4:14: -1- AC_DEFUN([AM_PROG_CC_C_O], [AC_REQUIRE([AC_PROG_CC_C_O])dnl -AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl -AC_REQUIRE_AUX_FILE([compile])dnl -# FIXME: we rely on the cache variable name because -# there is no other way. -set dummy $CC -am_cc=`echo $[2] | sed ['s/[^a-zA-Z0-9_]/_/g;s/^[0-9]/_/']` -eval am_t=\$ac_cv_prog_cc_${am_cc}_c_o -if test "$am_t" != yes; then - # Losing compiler, so override with the script. - # FIXME: It is wrong to rewrite CC. - # But if we don't then we get into trouble of one sort or another. - # A longer-term fix would be to have automake use am__CC in this case, - # and then we could set am__CC="\$(top_srcdir)/compile \$(CC)" - CC="$am_aux_dir/compile $CC" -fi -dnl Make sure AC_PROG_CC is never called again, or it will override our -dnl setting of CC. -m4_define([AC_PROG_CC], - [m4_fatal([AC_PROG_CC cannot be called after AM_PROG_CC_C_O])]) -]) -m4trace:/usr/share/aclocal-1.11/missing.m4:14: -1- AC_DEFUN([AM_MISSING_PROG], [AC_REQUIRE([AM_MISSING_HAS_RUN]) -$1=${$1-"${am_missing_run}$2"} -AC_SUBST($1)]) -m4trace:/usr/share/aclocal-1.11/missing.m4:24: -1- AC_DEFUN([AM_MISSING_HAS_RUN], [AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl -AC_REQUIRE_AUX_FILE([missing])dnl -if test x"${MISSING+set}" != xset; then - case $am_aux_dir in - *\ * | *\ *) - MISSING="\${SHELL} \"$am_aux_dir/missing\"" ;; - *) - MISSING="\${SHELL} $am_aux_dir/missing" ;; - esac -fi -# Use eval to expand $SHELL -if eval "$MISSING --run true"; then - am_missing_run="$MISSING --run " -else - am_missing_run= - AC_MSG_WARN([`missing' script is too old or missing]) -fi -]) -m4trace:/usr/share/aclocal-1.11/mkdirp.m4:14: -1- AC_DEFUN([AM_PROG_MKDIR_P], [AC_PREREQ([2.60])dnl -AC_REQUIRE([AC_PROG_MKDIR_P])dnl -dnl Automake 1.8 to 1.9.6 used to define mkdir_p. We now use MKDIR_P, -dnl while keeping a definition of mkdir_p for backward compatibility. -dnl @MKDIR_P@ is magic: AC_OUTPUT adjusts its value for each Makefile. -dnl However we cannot define mkdir_p as $(MKDIR_P) for the sake of -dnl Makefile.ins that do not define MKDIR_P, so we do our own -dnl adjustment using top_builddir (which is defined more often than -dnl MKDIR_P). -AC_SUBST([mkdir_p], ["$MKDIR_P"])dnl -case $mkdir_p in - [[\\/$]]* | ?:[[\\/]]*) ;; - */*) mkdir_p="\$(top_builddir)/$mkdir_p" ;; -esac -]) -m4trace:/usr/share/aclocal-1.11/options.m4:14: -1- AC_DEFUN([_AM_MANGLE_OPTION], [[_AM_OPTION_]m4_bpatsubst($1, [[^a-zA-Z0-9_]], [_])]) -m4trace:/usr/share/aclocal-1.11/options.m4:20: -1- AC_DEFUN([_AM_SET_OPTION], [m4_define(_AM_MANGLE_OPTION([$1]), 1)]) -m4trace:/usr/share/aclocal-1.11/options.m4:26: -1- AC_DEFUN([_AM_SET_OPTIONS], [m4_foreach_w([_AM_Option], [$1], [_AM_SET_OPTION(_AM_Option)])]) -m4trace:/usr/share/aclocal-1.11/options.m4:32: -1- AC_DEFUN([_AM_IF_OPTION], [m4_ifset(_AM_MANGLE_OPTION([$1]), [$2], [$3])]) -m4trace:/usr/share/aclocal-1.11/runlog.m4:14: -1- AC_DEFUN([AM_RUN_LOG], [{ echo "$as_me:$LINENO: $1" >&AS_MESSAGE_LOG_FD - ($1) >&AS_MESSAGE_LOG_FD 2>&AS_MESSAGE_LOG_FD - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&AS_MESSAGE_LOG_FD - (exit $ac_status); }]) -m4trace:/usr/share/aclocal-1.11/sanity.m4:14: -1- AC_DEFUN([AM_SANITY_CHECK], [AC_MSG_CHECKING([whether build environment is sane]) -# Just in case -sleep 1 -echo timestamp > conftest.file -# Reject unsafe characters in $srcdir or the absolute working directory -# name. Accept space and tab only in the latter. -am_lf=' -' -case `pwd` in - *[[\\\"\#\$\&\'\`$am_lf]]*) - AC_MSG_ERROR([unsafe absolute working directory name]);; -esac -case $srcdir in - *[[\\\"\#\$\&\'\`$am_lf\ \ ]]*) - AC_MSG_ERROR([unsafe srcdir value: `$srcdir']);; -esac - -# Do `set' in a subshell so we don't clobber the current shell's -# arguments. Must try -L first in case configure is actually a -# symlink; some systems play weird games with the mod time of symlinks -# (eg FreeBSD returns the mod time of the symlink's containing -# directory). -if ( - set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null` - if test "$[*]" = "X"; then - # -L didn't work. - set X `ls -t "$srcdir/configure" conftest.file` - fi - rm -f conftest.file - if test "$[*]" != "X $srcdir/configure conftest.file" \ - && test "$[*]" != "X conftest.file $srcdir/configure"; then - - # If neither matched, then we have a broken ls. This can happen - # if, for instance, CONFIG_SHELL is bash and it inherits a - # broken ls alias from the environment. This has actually - # happened. Such a system could not be considered "sane". - AC_MSG_ERROR([ls -t appears to fail. Make sure there is not a broken -alias in your environment]) - fi - - test "$[2]" = conftest.file - ) -then - # Ok. - : -else - AC_MSG_ERROR([newly created file is older than distributed files! -Check your system clock]) -fi -AC_MSG_RESULT(yes)]) -m4trace:/usr/share/aclocal-1.11/silent.m4:14: -1- AC_DEFUN([AM_SILENT_RULES], [AC_ARG_ENABLE([silent-rules], -[ --enable-silent-rules less verbose build output (undo: `make V=1') - --disable-silent-rules verbose build output (undo: `make V=0')]) -case $enable_silent_rules in -yes) AM_DEFAULT_VERBOSITY=0;; -no) AM_DEFAULT_VERBOSITY=1;; -*) AM_DEFAULT_VERBOSITY=m4_if([$1], [yes], [0], [1]);; -esac -dnl -dnl A few `make' implementations (e.g., NonStop OS and NextStep) -dnl do not support nested variable expansions. -dnl See automake bug#9928 and bug#10237. -am_make=${MAKE-make} -AC_CACHE_CHECK([whether $am_make supports nested variables], - [am_cv_make_support_nested_variables], - [if AS_ECHO([['TRUE=$(BAR$(V)) -BAR0=false -BAR1=true -V=1 -am__doit: - @$(TRUE) -.PHONY: am__doit']]) | $am_make -f - >/dev/null 2>&1; then - am_cv_make_support_nested_variables=yes -else - am_cv_make_support_nested_variables=no -fi]) -if test $am_cv_make_support_nested_variables = yes; then - dnl Using `$V' instead of `$(V)' breaks IRIX make. - AM_V='$(V)' - AM_DEFAULT_V='$(AM_DEFAULT_VERBOSITY)' -else - AM_V=$AM_DEFAULT_VERBOSITY - AM_DEFAULT_V=$AM_DEFAULT_VERBOSITY -fi -AC_SUBST([AM_V])dnl -AM_SUBST_NOTMAKE([AM_V])dnl -AC_SUBST([AM_DEFAULT_V])dnl -AM_SUBST_NOTMAKE([AM_DEFAULT_V])dnl -AC_SUBST([AM_DEFAULT_VERBOSITY])dnl -AM_BACKSLASH='\' -AC_SUBST([AM_BACKSLASH])dnl -_AM_SUBST_NOTMAKE([AM_BACKSLASH])dnl -]) -m4trace:/usr/share/aclocal-1.11/strip.m4:19: -1- AC_DEFUN([AM_PROG_INSTALL_STRIP], [AC_REQUIRE([AM_PROG_INSTALL_SH])dnl -# Installed binaries are usually stripped using `strip' when the user -# run `make install-strip'. However `strip' might not be the right -# tool to use in cross-compilation environments, therefore Automake -# will honor the `STRIP' environment variable to overrule this program. -dnl Don't test for $cross_compiling = yes, because it might be `maybe'. -if test "$cross_compiling" != no; then - AC_CHECK_TOOL([STRIP], [strip], :) -fi -INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s" -AC_SUBST([INSTALL_STRIP_PROGRAM])]) -m4trace:/usr/share/aclocal-1.11/substnot.m4:14: -1- AC_DEFUN([_AM_SUBST_NOTMAKE]) -m4trace:/usr/share/aclocal-1.11/substnot.m4:19: -1- AC_DEFUN([AM_SUBST_NOTMAKE], [_AM_SUBST_NOTMAKE($@)]) -m4trace:/usr/share/aclocal-1.11/tar.m4:24: -1- AC_DEFUN([_AM_PROG_TAR], [# Always define AMTAR for backward compatibility. Yes, it's still used -# in the wild :-( We should find a proper way to deprecate it ... -AC_SUBST([AMTAR], ['$${TAR-tar}']) -m4_if([$1], [v7], - [am__tar='$${TAR-tar} chof - "$$tardir"' am__untar='$${TAR-tar} xf -'], - [m4_case([$1], [ustar],, [pax],, - [m4_fatal([Unknown tar format])]) -AC_MSG_CHECKING([how to create a $1 tar archive]) -# Loop over all known methods to create a tar archive until one works. -_am_tools='gnutar m4_if([$1], [ustar], [plaintar]) pax cpio none' -_am_tools=${am_cv_prog_tar_$1-$_am_tools} -# Do not fold the above two line into one, because Tru64 sh and -# Solaris sh will not grok spaces in the rhs of `-'. -for _am_tool in $_am_tools -do - case $_am_tool in - gnutar) - for _am_tar in tar gnutar gtar; - do - AM_RUN_LOG([$_am_tar --version]) && break - done - am__tar="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$$tardir"' - am__tar_="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$tardir"' - am__untar="$_am_tar -xf -" - ;; - plaintar) - # Must skip GNU tar: if it does not support --format= it doesn't create - # ustar tarball either. - (tar --version) >/dev/null 2>&1 && continue - am__tar='tar chf - "$$tardir"' - am__tar_='tar chf - "$tardir"' - am__untar='tar xf -' - ;; - pax) - am__tar='pax -L -x $1 -w "$$tardir"' - am__tar_='pax -L -x $1 -w "$tardir"' - am__untar='pax -r' - ;; - cpio) - am__tar='find "$$tardir" -print | cpio -o -H $1 -L' - am__tar_='find "$tardir" -print | cpio -o -H $1 -L' - am__untar='cpio -i -H $1 -d' - ;; - none) - am__tar=false - am__tar_=false - am__untar=false - ;; - esac - - # If the value was cached, stop now. We just wanted to have am__tar - # and am__untar set. - test -n "${am_cv_prog_tar_$1}" && break - - # tar/untar a dummy directory, and stop if the command works - rm -rf conftest.dir - mkdir conftest.dir - echo GrepMe > conftest.dir/file - AM_RUN_LOG([tardir=conftest.dir && eval $am__tar_ >conftest.tar]) - rm -rf conftest.dir - if test -s conftest.tar; then - AM_RUN_LOG([$am__untar /dev/null 2>&1 && break - fi -done -rm -rf conftest.dir - -AC_CACHE_VAL([am_cv_prog_tar_$1], [am_cv_prog_tar_$1=$_am_tool]) -AC_MSG_RESULT([$am_cv_prog_tar_$1])]) -AC_SUBST([am__tar]) -AC_SUBST([am__untar]) -]) -m4trace:acinclude.m4:43: -1- AC_DEFUN([DX_FEATURE_doc], [ON]) -m4trace:acinclude.m4:44: -1- AC_DEFUN([DX_FEATURE_dot], [ON]) -m4trace:acinclude.m4:45: -1- AC_DEFUN([DX_FEATURE_man], [OFF]) -m4trace:acinclude.m4:46: -1- AC_DEFUN([DX_FEATURE_html], [ON]) -m4trace:acinclude.m4:47: -1- AC_DEFUN([DX_FEATURE_chm], [OFF]) -m4trace:acinclude.m4:48: -1- AC_DEFUN([DX_FEATURE_chi], [OFF]) -m4trace:acinclude.m4:49: -1- AC_DEFUN([DX_FEATURE_rtf], [OFF]) -m4trace:acinclude.m4:50: -1- AC_DEFUN([DX_FEATURE_xml], [OFF]) -m4trace:acinclude.m4:51: -1- AC_DEFUN([DX_FEATURE_pdf], [ON]) -m4trace:acinclude.m4:52: -1- AC_DEFUN([DX_FEATURE_ps], [ON]) -m4trace:acinclude.m4:61: -1- AC_DEFUN([DX_ENV_APPEND], [AC_SUBST([DX_ENV], ["$DX_ENV $1='$2'"])]) -m4trace:acinclude.m4:66: -1- AC_DEFUN([DX_DIRNAME_EXPR], [[expr ".$1" : '\(\.\)[^/]*$' \| "x$1" : 'x\(.*\)/[^/]*$']]) -m4trace:acinclude.m4:72: -1- AC_DEFUN([DX_IF_FEATURE], [ifelse(DX_FEATURE_$1, ON, [$2], [$3])]) -m4trace:acinclude.m4:77: -1- AC_DEFUN([DX_REQUIRE_PROG], [ -AC_PATH_TOOL([$1], [$2]) -if test "$DX_FLAG_$[DX_CURRENT_FEATURE$$1]" = 1; then - AC_MSG_WARN([$2 not found - will not DX_CURRENT_DESCRIPTION]) - AC_SUBST([DX_FLAG_]DX_CURRENT_FEATURE, 0) -fi -]) -m4trace:acinclude.m4:88: -1- AC_DEFUN([DX_TEST_FEATURE], [test "$DX_FLAG_$1" = 1]) -m4trace:acinclude.m4:94: -1- AC_DEFUN([DX_CHECK_DEPEND], [ -test "$DX_FLAG_$1" = "$2" \ -|| AC_MSG_ERROR([doxygen-DX_CURRENT_FEATURE ifelse([$2], 1, - requires, contradicts) doxygen-DX_CURRENT_FEATURE]) -]) -m4trace:acinclude.m4:103: -1- AC_DEFUN([DX_CLEAR_DEPEND], [ -test "$DX_FLAG_$1" = "$2" || AC_SUBST([DX_FLAG_]DX_CURRENT_FEATURE, 0) -]) -m4trace:acinclude.m4:117: -1- AC_DEFUN([DX_ARG_ABLE], [ - AC_DEFUN([DX_CURRENT_FEATURE], [$1]) - AC_DEFUN([DX_CURRENT_DESCRIPTION], [$2]) - AC_ARG_ENABLE(doxygen-$1, - [AS_HELP_STRING(DX_IF_FEATURE([$1], [--disable-doxygen-$1], - [--enable-doxygen-$1]), - DX_IF_FEATURE([$1], [don't $2], [$2]))], - [ -case "$enableval" in -#( -y|Y|yes|Yes|YES) - AC_SUBST([DX_FLAG_$1], 1) - $3 -;; #( -n|N|no|No|NO) - AC_SUBST([DX_FLAG_$1], 0) -;; #( -*) - AC_MSG_ERROR([invalid value '$enableval' given to doxygen-$1]) -;; -esac -], [ -AC_SUBST([DX_FLAG_$1], [DX_IF_FEATURE([$1], 1, 0)]) -$4 -]) -if DX_TEST_FEATURE([$1]); then - $5 - : -fi -if DX_TEST_FEATURE([$1]); then - AM_CONDITIONAL(DX_COND_$1, :) - $6 - : -else - AM_CONDITIONAL(DX_COND_$1, false) - $7 - : -fi -]) -m4trace:acinclude.m4:163: -1- AC_DEFUN([DX_DOXYGEN_FEATURE], [AC_DEFUN([DX_FEATURE_doc], [$1])]) -m4trace:acinclude.m4:164: -1- AC_DEFUN([DX_MAN_FEATURE], [AC_DEFUN([DX_FEATURE_man], [$1])]) -m4trace:acinclude.m4:165: -1- AC_DEFUN([DX_HTML_FEATURE], [AC_DEFUN([DX_FEATURE_html], [$1])]) -m4trace:acinclude.m4:166: -1- AC_DEFUN([DX_CHM_FEATURE], [AC_DEFUN([DX_FEATURE_chm], [$1])]) -m4trace:acinclude.m4:167: -1- AC_DEFUN([DX_CHI_FEATURE], [AC_DEFUN([DX_FEATURE_chi], [$1])]) -m4trace:acinclude.m4:168: -1- AC_DEFUN([DX_RTF_FEATURE], [AC_DEFUN([DX_FEATURE_rtf], [$1])]) -m4trace:acinclude.m4:169: -1- AC_DEFUN([DX_XML_FEATURE], [AC_DEFUN([DX_FEATURE_xml], [$1])]) -m4trace:acinclude.m4:170: -1- AC_DEFUN([DX_XML_FEATURE], [AC_DEFUN([DX_FEATURE_xml], [$1])]) -m4trace:acinclude.m4:171: -1- AC_DEFUN([DX_PDF_FEATURE], [AC_DEFUN([DX_FEATURE_pdf], [$1])]) -m4trace:acinclude.m4:172: -1- AC_DEFUN([DX_PS_FEATURE], [AC_DEFUN([DX_FEATURE_ps], [$1])]) -m4trace:acinclude.m4:178: -1- AC_DEFUN([DX_INIT_DOXYGEN], [ - -# Files: -AC_SUBST([DX_PROJECT], [$1]) -AC_SUBST([DX_CONFIG], [ifelse([$2], [], Doxyfile, [$2])]) -AC_SUBST([DX_DOCDIR], [ifelse([$3], [], doxygen-doc, [$3])]) - -# Environment variables used inside doxygen.cfg: -DX_ENV_APPEND(SRCDIR, $srcdir) -DX_ENV_APPEND(PROJECT, $DX_PROJECT) -DX_ENV_APPEND(DOCDIR, $DX_DOCDIR) -DX_ENV_APPEND(VERSION, $PACKAGE_VERSION) - -# Doxygen itself: -DX_ARG_ABLE(doc, [generate any doxygen documentation], - [], - [], - [DX_REQUIRE_PROG([DX_DOXYGEN], doxygen) - DX_REQUIRE_PROG([DX_PERL], perl)], - [DX_ENV_APPEND(PERL_PATH, $DX_PERL)]) - -# Dot for graphics: -DX_ARG_ABLE(dot, [generate graphics for doxygen documentation], - [DX_CHECK_DEPEND(doc, 1)], - [DX_CLEAR_DEPEND(doc, 1)], - [DX_REQUIRE_PROG([DX_DOT], dot)], - [DX_ENV_APPEND(HAVE_DOT, YES) - DX_ENV_APPEND(DOT_PATH, [`DX_DIRNAME_EXPR($DX_DOT)`])], - [DX_ENV_APPEND(HAVE_DOT, NO)]) - -# Man pages generation: -DX_ARG_ABLE(man, [generate doxygen manual pages], - [DX_CHECK_DEPEND(doc, 1)], - [DX_CLEAR_DEPEND(doc, 1)], - [], - [DX_ENV_APPEND(GENERATE_MAN, YES)], - [DX_ENV_APPEND(GENERATE_MAN, NO)]) - -# RTF file generation: -DX_ARG_ABLE(rtf, [generate doxygen RTF documentation], - [DX_CHECK_DEPEND(doc, 1)], - [DX_CLEAR_DEPEND(doc, 1)], - [], - [DX_ENV_APPEND(GENERATE_RTF, YES)], - [DX_ENV_APPEND(GENERATE_RTF, NO)]) - -# XML file generation: -DX_ARG_ABLE(xml, [generate doxygen XML documentation], - [DX_CHECK_DEPEND(doc, 1)], - [DX_CLEAR_DEPEND(doc, 1)], - [], - [DX_ENV_APPEND(GENERATE_XML, YES)], - [DX_ENV_APPEND(GENERATE_XML, NO)]) - -# (Compressed) HTML help generation: -DX_ARG_ABLE(chm, [generate doxygen compressed HTML help documentation], - [DX_CHECK_DEPEND(doc, 1)], - [DX_CLEAR_DEPEND(doc, 1)], - [DX_REQUIRE_PROG([DX_HHC], hhc)], - [DX_ENV_APPEND(HHC_PATH, $DX_HHC) - DX_ENV_APPEND(GENERATE_HTML, YES) - DX_ENV_APPEND(GENERATE_HTMLHELP, YES)], - [DX_ENV_APPEND(GENERATE_HTMLHELP, NO)]) - -# Seperate CHI file generation. -DX_ARG_ABLE(chi, [generate doxygen seperate compressed HTML help index file], - [DX_CHECK_DEPEND(chm, 1)], - [DX_CLEAR_DEPEND(chm, 1)], - [], - [DX_ENV_APPEND(GENERATE_CHI, YES)], - [DX_ENV_APPEND(GENERATE_CHI, NO)]) - -# Plain HTML pages generation: -DX_ARG_ABLE(html, [generate doxygen plain HTML documentation], - [DX_CHECK_DEPEND(doc, 1) DX_CHECK_DEPEND(chm, 0)], - [DX_CLEAR_DEPEND(doc, 1) DX_CLEAR_DEPEND(chm, 0)], - [], - [DX_ENV_APPEND(GENERATE_HTML, YES)], - [DX_TEST_FEATURE(chm) || DX_ENV_APPEND(GENERATE_HTML, NO)]) - -# PostScript file generation: -DX_ARG_ABLE(ps, [generate doxygen PostScript documentation], - [DX_CHECK_DEPEND(doc, 1)], - [DX_CLEAR_DEPEND(doc, 1)], - [DX_REQUIRE_PROG([DX_LATEX], latex) - DX_REQUIRE_PROG([DX_MAKEINDEX], makeindex) - DX_REQUIRE_PROG([DX_DVIPS], dvips) - DX_REQUIRE_PROG([DX_EGREP], egrep)]) - -# PDF file generation: -DX_ARG_ABLE(pdf, [generate doxygen PDF documentation], - [DX_CHECK_DEPEND(doc, 1)], - [DX_CLEAR_DEPEND(doc, 1)], - [DX_REQUIRE_PROG([DX_PDFLATEX], pdflatex) - DX_REQUIRE_PROG([DX_MAKEINDEX], makeindex) - DX_REQUIRE_PROG([DX_EGREP], egrep)]) - -# LaTeX generation for PS and/or PDF: -if DX_TEST_FEATURE(ps) || DX_TEST_FEATURE(pdf); then - AM_CONDITIONAL(DX_COND_latex, :) - DX_ENV_APPEND(GENERATE_LATEX, YES) -else - AM_CONDITIONAL(DX_COND_latex, false) - DX_ENV_APPEND(GENERATE_LATEX, NO) -fi - -# Paper size for PS and/or PDF: -AC_ARG_VAR(DOXYGEN_PAPER_SIZE, - [a4wide (default), a4, letter, legal or executive]) -case "$DOXYGEN_PAPER_SIZE" in -#( -"") - AC_SUBST(DOXYGEN_PAPER_SIZE, "") -;; #( -a4wide|a4|letter|legal|executive) - DX_ENV_APPEND(PAPER_SIZE, $DOXYGEN_PAPER_SIZE) -;; #( -*) - AC_MSG_ERROR([unknown DOXYGEN_PAPER_SIZE='$DOXYGEN_PAPER_SIZE']) -;; -esac - -#For debugging: -#echo DX_FLAG_doc=$DX_FLAG_doc -#echo DX_FLAG_dot=$DX_FLAG_dot -#echo DX_FLAG_man=$DX_FLAG_man -#echo DX_FLAG_html=$DX_FLAG_html -#echo DX_FLAG_chm=$DX_FLAG_chm -#echo DX_FLAG_chi=$DX_FLAG_chi -#echo DX_FLAG_rtf=$DX_FLAG_rtf -#echo DX_FLAG_xml=$DX_FLAG_xml -#echo DX_FLAG_pdf=$DX_FLAG_pdf -#echo DX_FLAG_ps=$DX_FLAG_ps -#echo DX_ENV=$DX_ENV -]) -m4trace:configure.ac:6: -1- m4_pattern_forbid([^_?A[CHUM]_]) -m4trace:configure.ac:6: -1- m4_pattern_forbid([_AC_]) -m4trace:configure.ac:6: -1- m4_pattern_forbid([^LIBOBJS$], [do not use LIBOBJS directly, use AC_LIBOBJ (see section `AC_LIBOBJ vs LIBOBJS']) -m4trace:configure.ac:6: -1- m4_pattern_allow([^AS_FLAGS$]) -m4trace:configure.ac:6: -1- m4_pattern_forbid([^_?m4_]) -m4trace:configure.ac:6: -1- m4_pattern_forbid([^dnl$]) -m4trace:configure.ac:6: -1- m4_pattern_forbid([^_?AS_]) -m4trace:configure.ac:6: -1- m4_pattern_allow([^SHELL$]) -m4trace:configure.ac:6: -1- m4_pattern_allow([^PATH_SEPARATOR$]) -m4trace:configure.ac:6: -1- m4_pattern_allow([^PACKAGE_NAME$]) -m4trace:configure.ac:6: -1- m4_pattern_allow([^PACKAGE_TARNAME$]) -m4trace:configure.ac:6: -1- m4_pattern_allow([^PACKAGE_VERSION$]) -m4trace:configure.ac:6: -1- m4_pattern_allow([^PACKAGE_STRING$]) -m4trace:configure.ac:6: -1- m4_pattern_allow([^PACKAGE_BUGREPORT$]) -m4trace:configure.ac:6: -1- m4_pattern_allow([^PACKAGE_URL$]) -m4trace:configure.ac:6: -1- m4_pattern_allow([^exec_prefix$]) -m4trace:configure.ac:6: -1- m4_pattern_allow([^prefix$]) -m4trace:configure.ac:6: -1- m4_pattern_allow([^program_transform_name$]) -m4trace:configure.ac:6: -1- m4_pattern_allow([^bindir$]) -m4trace:configure.ac:6: -1- m4_pattern_allow([^sbindir$]) -m4trace:configure.ac:6: -1- m4_pattern_allow([^libexecdir$]) -m4trace:configure.ac:6: -1- m4_pattern_allow([^datarootdir$]) -m4trace:configure.ac:6: -1- m4_pattern_allow([^datadir$]) -m4trace:configure.ac:6: -1- m4_pattern_allow([^sysconfdir$]) -m4trace:configure.ac:6: -1- m4_pattern_allow([^sharedstatedir$]) -m4trace:configure.ac:6: -1- m4_pattern_allow([^localstatedir$]) -m4trace:configure.ac:6: -1- m4_pattern_allow([^includedir$]) -m4trace:configure.ac:6: -1- m4_pattern_allow([^oldincludedir$]) -m4trace:configure.ac:6: -1- m4_pattern_allow([^docdir$]) -m4trace:configure.ac:6: -1- m4_pattern_allow([^infodir$]) -m4trace:configure.ac:6: -1- m4_pattern_allow([^htmldir$]) -m4trace:configure.ac:6: -1- m4_pattern_allow([^dvidir$]) -m4trace:configure.ac:6: -1- m4_pattern_allow([^pdfdir$]) -m4trace:configure.ac:6: -1- m4_pattern_allow([^psdir$]) -m4trace:configure.ac:6: -1- m4_pattern_allow([^libdir$]) -m4trace:configure.ac:6: -1- m4_pattern_allow([^localedir$]) -m4trace:configure.ac:6: -1- m4_pattern_allow([^mandir$]) -m4trace:configure.ac:6: -1- m4_pattern_allow([^PACKAGE_NAME$]) -m4trace:configure.ac:6: -1- m4_pattern_allow([^PACKAGE_TARNAME$]) -m4trace:configure.ac:6: -1- m4_pattern_allow([^PACKAGE_VERSION$]) -m4trace:configure.ac:6: -1- m4_pattern_allow([^PACKAGE_STRING$]) -m4trace:configure.ac:6: -1- m4_pattern_allow([^PACKAGE_BUGREPORT$]) -m4trace:configure.ac:6: -1- m4_pattern_allow([^PACKAGE_URL$]) -m4trace:configure.ac:6: -1- m4_pattern_allow([^DEFS$]) -m4trace:configure.ac:6: -1- m4_pattern_allow([^ECHO_C$]) -m4trace:configure.ac:6: -1- m4_pattern_allow([^ECHO_N$]) -m4trace:configure.ac:6: -1- m4_pattern_allow([^ECHO_T$]) -m4trace:configure.ac:6: -1- m4_pattern_allow([^LIBS$]) -m4trace:configure.ac:6: -1- m4_pattern_allow([^build_alias$]) -m4trace:configure.ac:6: -1- m4_pattern_allow([^host_alias$]) -m4trace:configure.ac:6: -1- m4_pattern_allow([^target_alias$]) -m4trace:configure.ac:14: -1- DX_HTML_FEATURE([ON]) -m4trace:configure.ac:14: -1- AC_DEFUN([DX_FEATURE_html], [ON]) -m4trace:configure.ac:15: -1- DX_CHM_FEATURE([OFF]) -m4trace:configure.ac:15: -1- AC_DEFUN([DX_FEATURE_chm], [OFF]) -m4trace:configure.ac:16: -1- DX_CHI_FEATURE([OFF]) -m4trace:configure.ac:16: -1- AC_DEFUN([DX_FEATURE_chi], [OFF]) -m4trace:configure.ac:17: -1- DX_MAN_FEATURE([OFF]) -m4trace:configure.ac:17: -1- AC_DEFUN([DX_FEATURE_man], [OFF]) -m4trace:configure.ac:18: -1- DX_RTF_FEATURE([OFF]) -m4trace:configure.ac:18: -1- AC_DEFUN([DX_FEATURE_rtf], [OFF]) -m4trace:configure.ac:19: -1- DX_XML_FEATURE([OFF]) -m4trace:configure.ac:19: -1- AC_DEFUN([DX_FEATURE_xml], [OFF]) -m4trace:configure.ac:20: -1- DX_PDF_FEATURE([OFF]) -m4trace:configure.ac:20: -1- AC_DEFUN([DX_FEATURE_pdf], [OFF]) -m4trace:configure.ac:21: -1- DX_PS_FEATURE([OFF]) -m4trace:configure.ac:21: -1- AC_DEFUN([DX_FEATURE_ps], [OFF]) -m4trace:configure.ac:22: -1- DX_INIT_DOXYGEN([zookeeper], [c-doc.Doxyfile], [docs]) -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_PROJECT$]) -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_CONFIG$]) -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_DOCDIR$]) -m4trace:configure.ac:22: -1- DX_ENV_APPEND([SRCDIR], [$srcdir]) -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_ENV$]) -m4trace:configure.ac:22: -1- DX_ENV_APPEND([PROJECT], [$DX_PROJECT]) -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_ENV$]) -m4trace:configure.ac:22: -1- DX_ENV_APPEND([DOCDIR], [$DX_DOCDIR]) -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_ENV$]) -m4trace:configure.ac:22: -1- DX_ENV_APPEND([VERSION], [$PACKAGE_VERSION]) -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_ENV$]) -m4trace:configure.ac:22: -1- DX_ARG_ABLE([doc], [generate any doxygen documentation], [], [], [DX_REQUIRE_PROG([DX_DOXYGEN], doxygen) - DX_REQUIRE_PROG([DX_PERL], perl)], [DX_ENV_APPEND(PERL_PATH, $DX_PERL)]) -m4trace:configure.ac:22: -1- AC_DEFUN([DX_CURRENT_FEATURE], [doc]) -m4trace:configure.ac:22: -1- AC_DEFUN([DX_CURRENT_DESCRIPTION], [generate any doxygen documentation]) -m4trace:configure.ac:22: -2- DX_IF_FEATURE([doc], [--disable-doxygen-doc], [--enable-doxygen-doc]) -m4trace:configure.ac:22: -3- DX_FEATURE_doc -m4trace:configure.ac:22: -2- DX_IF_FEATURE([doc], [don't generate any doxygen documentation], [generate any doxygen documentation]) -m4trace:configure.ac:22: -3- DX_FEATURE_doc -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_FLAG_doc$]) -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_FLAG_doc$]) -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_FLAG_doc$]) -m4trace:configure.ac:22: -1- DX_IF_FEATURE([doc], [1], [0]) -m4trace:configure.ac:22: -2- DX_FEATURE_doc -m4trace:configure.ac:22: -1- DX_TEST_FEATURE([doc]) -m4trace:configure.ac:22: -1- DX_REQUIRE_PROG([DX_DOXYGEN], [doxygen]) -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_DOXYGEN$]) -m4trace:configure.ac:22: -1- DX_CURRENT_DESCRIPTION -m4trace:configure.ac:22: -1- DX_CURRENT_DESCRIPTION -m4trace:configure.ac:22: -2- DX_CURRENT_FEATURE -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_FLAG_doc$]) -m4trace:configure.ac:22: -1- DX_REQUIRE_PROG([DX_PERL], [perl]) -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_PERL$]) -m4trace:configure.ac:22: -1- DX_CURRENT_DESCRIPTION -m4trace:configure.ac:22: -1- DX_CURRENT_DESCRIPTION -m4trace:configure.ac:22: -2- DX_CURRENT_FEATURE -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_FLAG_doc$]) -m4trace:configure.ac:22: -1- DX_TEST_FEATURE([doc]) -m4trace:configure.ac:22: -1- AM_CONDITIONAL([DX_COND_doc], [:]) -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_COND_doc_TRUE$]) -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_COND_doc_FALSE$]) -m4trace:configure.ac:22: -1- _AM_SUBST_NOTMAKE([DX_COND_doc_TRUE]) -m4trace:configure.ac:22: -1- _AM_SUBST_NOTMAKE([DX_COND_doc_FALSE]) -m4trace:configure.ac:22: -1- DX_ENV_APPEND([PERL_PATH], [$DX_PERL]) -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_ENV$]) -m4trace:configure.ac:22: -1- AM_CONDITIONAL([DX_COND_doc], [false]) -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_COND_doc_TRUE$]) -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_COND_doc_FALSE$]) -m4trace:configure.ac:22: -1- _AM_SUBST_NOTMAKE([DX_COND_doc_TRUE]) -m4trace:configure.ac:22: -1- _AM_SUBST_NOTMAKE([DX_COND_doc_FALSE]) -m4trace:configure.ac:22: -1- DX_ARG_ABLE([dot], [generate graphics for doxygen documentation], [DX_CHECK_DEPEND(doc, 1)], [DX_CLEAR_DEPEND(doc, 1)], [DX_REQUIRE_PROG([DX_DOT], dot)], [DX_ENV_APPEND(HAVE_DOT, YES) - DX_ENV_APPEND(DOT_PATH, [`DX_DIRNAME_EXPR($DX_DOT)`])], [DX_ENV_APPEND(HAVE_DOT, NO)]) -m4trace:configure.ac:22: -1- AC_DEFUN([DX_CURRENT_FEATURE], [dot]) -m4trace:configure.ac:22: -1- AC_DEFUN([DX_CURRENT_DESCRIPTION], [generate graphics for doxygen documentation]) -m4trace:configure.ac:22: -2- DX_IF_FEATURE([dot], [--disable-doxygen-dot], [--enable-doxygen-dot]) -m4trace:configure.ac:22: -3- DX_FEATURE_dot -m4trace:configure.ac:22: -2- DX_IF_FEATURE([dot], [don't generate graphics for doxygen documentation], [generate graphics for doxygen documentation]) -m4trace:configure.ac:22: -3- DX_FEATURE_dot -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_FLAG_dot$]) -m4trace:configure.ac:22: -1- DX_CHECK_DEPEND([doc], [1]) -m4trace:configure.ac:22: -1- DX_CURRENT_FEATURE -m4trace:configure.ac:22: -1- DX_CURRENT_FEATURE -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_FLAG_dot$]) -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_FLAG_dot$]) -m4trace:configure.ac:22: -1- DX_IF_FEATURE([dot], [1], [0]) -m4trace:configure.ac:22: -2- DX_FEATURE_dot -m4trace:configure.ac:22: -1- DX_CLEAR_DEPEND([doc], [1]) -m4trace:configure.ac:22: -2- DX_CURRENT_FEATURE -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_FLAG_dot$]) -m4trace:configure.ac:22: -1- DX_TEST_FEATURE([dot]) -m4trace:configure.ac:22: -1- DX_REQUIRE_PROG([DX_DOT], [dot]) -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_DOT$]) -m4trace:configure.ac:22: -1- DX_CURRENT_DESCRIPTION -m4trace:configure.ac:22: -1- DX_CURRENT_DESCRIPTION -m4trace:configure.ac:22: -2- DX_CURRENT_FEATURE -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_FLAG_dot$]) -m4trace:configure.ac:22: -1- DX_TEST_FEATURE([dot]) -m4trace:configure.ac:22: -1- AM_CONDITIONAL([DX_COND_dot], [:]) -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_COND_dot_TRUE$]) -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_COND_dot_FALSE$]) -m4trace:configure.ac:22: -1- _AM_SUBST_NOTMAKE([DX_COND_dot_TRUE]) -m4trace:configure.ac:22: -1- _AM_SUBST_NOTMAKE([DX_COND_dot_FALSE]) -m4trace:configure.ac:22: -1- DX_ENV_APPEND([HAVE_DOT], [YES]) -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_ENV$]) -m4trace:configure.ac:22: -1- DX_ENV_APPEND([DOT_PATH], [`DX_DIRNAME_EXPR($DX_DOT)`]) -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_ENV$]) -m4trace:configure.ac:22: -1- DX_DIRNAME_EXPR([$DX_DOT]) -m4trace:configure.ac:22: -1- AM_CONDITIONAL([DX_COND_dot], [false]) -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_COND_dot_TRUE$]) -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_COND_dot_FALSE$]) -m4trace:configure.ac:22: -1- _AM_SUBST_NOTMAKE([DX_COND_dot_TRUE]) -m4trace:configure.ac:22: -1- _AM_SUBST_NOTMAKE([DX_COND_dot_FALSE]) -m4trace:configure.ac:22: -1- DX_ENV_APPEND([HAVE_DOT], [NO]) -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_ENV$]) -m4trace:configure.ac:22: -1- DX_ARG_ABLE([man], [generate doxygen manual pages], [DX_CHECK_DEPEND(doc, 1)], [DX_CLEAR_DEPEND(doc, 1)], [], [DX_ENV_APPEND(GENERATE_MAN, YES)], [DX_ENV_APPEND(GENERATE_MAN, NO)]) -m4trace:configure.ac:22: -1- AC_DEFUN([DX_CURRENT_FEATURE], [man]) -m4trace:configure.ac:22: -1- AC_DEFUN([DX_CURRENT_DESCRIPTION], [generate doxygen manual pages]) -m4trace:configure.ac:22: -2- DX_IF_FEATURE([man], [--disable-doxygen-man], [--enable-doxygen-man]) -m4trace:configure.ac:22: -3- DX_FEATURE_man -m4trace:configure.ac:22: -2- DX_IF_FEATURE([man], [don't generate doxygen manual pages], [generate doxygen manual pages]) -m4trace:configure.ac:22: -3- DX_FEATURE_man -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_FLAG_man$]) -m4trace:configure.ac:22: -1- DX_CHECK_DEPEND([doc], [1]) -m4trace:configure.ac:22: -1- DX_CURRENT_FEATURE -m4trace:configure.ac:22: -1- DX_CURRENT_FEATURE -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_FLAG_man$]) -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_FLAG_man$]) -m4trace:configure.ac:22: -1- DX_IF_FEATURE([man], [1], [0]) -m4trace:configure.ac:22: -2- DX_FEATURE_man -m4trace:configure.ac:22: -1- DX_CLEAR_DEPEND([doc], [1]) -m4trace:configure.ac:22: -2- DX_CURRENT_FEATURE -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_FLAG_man$]) -m4trace:configure.ac:22: -1- DX_TEST_FEATURE([man]) -m4trace:configure.ac:22: -1- DX_TEST_FEATURE([man]) -m4trace:configure.ac:22: -1- AM_CONDITIONAL([DX_COND_man], [:]) -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_COND_man_TRUE$]) -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_COND_man_FALSE$]) -m4trace:configure.ac:22: -1- _AM_SUBST_NOTMAKE([DX_COND_man_TRUE]) -m4trace:configure.ac:22: -1- _AM_SUBST_NOTMAKE([DX_COND_man_FALSE]) -m4trace:configure.ac:22: -1- DX_ENV_APPEND([GENERATE_MAN], [YES]) -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_ENV$]) -m4trace:configure.ac:22: -1- AM_CONDITIONAL([DX_COND_man], [false]) -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_COND_man_TRUE$]) -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_COND_man_FALSE$]) -m4trace:configure.ac:22: -1- _AM_SUBST_NOTMAKE([DX_COND_man_TRUE]) -m4trace:configure.ac:22: -1- _AM_SUBST_NOTMAKE([DX_COND_man_FALSE]) -m4trace:configure.ac:22: -1- DX_ENV_APPEND([GENERATE_MAN], [NO]) -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_ENV$]) -m4trace:configure.ac:22: -1- DX_ARG_ABLE([rtf], [generate doxygen RTF documentation], [DX_CHECK_DEPEND(doc, 1)], [DX_CLEAR_DEPEND(doc, 1)], [], [DX_ENV_APPEND(GENERATE_RTF, YES)], [DX_ENV_APPEND(GENERATE_RTF, NO)]) -m4trace:configure.ac:22: -1- AC_DEFUN([DX_CURRENT_FEATURE], [rtf]) -m4trace:configure.ac:22: -1- AC_DEFUN([DX_CURRENT_DESCRIPTION], [generate doxygen RTF documentation]) -m4trace:configure.ac:22: -2- DX_IF_FEATURE([rtf], [--disable-doxygen-rtf], [--enable-doxygen-rtf]) -m4trace:configure.ac:22: -3- DX_FEATURE_rtf -m4trace:configure.ac:22: -2- DX_IF_FEATURE([rtf], [don't generate doxygen RTF documentation], [generate doxygen RTF documentation]) -m4trace:configure.ac:22: -3- DX_FEATURE_rtf -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_FLAG_rtf$]) -m4trace:configure.ac:22: -1- DX_CHECK_DEPEND([doc], [1]) -m4trace:configure.ac:22: -1- DX_CURRENT_FEATURE -m4trace:configure.ac:22: -1- DX_CURRENT_FEATURE -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_FLAG_rtf$]) -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_FLAG_rtf$]) -m4trace:configure.ac:22: -1- DX_IF_FEATURE([rtf], [1], [0]) -m4trace:configure.ac:22: -2- DX_FEATURE_rtf -m4trace:configure.ac:22: -1- DX_CLEAR_DEPEND([doc], [1]) -m4trace:configure.ac:22: -2- DX_CURRENT_FEATURE -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_FLAG_rtf$]) -m4trace:configure.ac:22: -1- DX_TEST_FEATURE([rtf]) -m4trace:configure.ac:22: -1- DX_TEST_FEATURE([rtf]) -m4trace:configure.ac:22: -1- AM_CONDITIONAL([DX_COND_rtf], [:]) -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_COND_rtf_TRUE$]) -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_COND_rtf_FALSE$]) -m4trace:configure.ac:22: -1- _AM_SUBST_NOTMAKE([DX_COND_rtf_TRUE]) -m4trace:configure.ac:22: -1- _AM_SUBST_NOTMAKE([DX_COND_rtf_FALSE]) -m4trace:configure.ac:22: -1- DX_ENV_APPEND([GENERATE_RTF], [YES]) -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_ENV$]) -m4trace:configure.ac:22: -1- AM_CONDITIONAL([DX_COND_rtf], [false]) -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_COND_rtf_TRUE$]) -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_COND_rtf_FALSE$]) -m4trace:configure.ac:22: -1- _AM_SUBST_NOTMAKE([DX_COND_rtf_TRUE]) -m4trace:configure.ac:22: -1- _AM_SUBST_NOTMAKE([DX_COND_rtf_FALSE]) -m4trace:configure.ac:22: -1- DX_ENV_APPEND([GENERATE_RTF], [NO]) -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_ENV$]) -m4trace:configure.ac:22: -1- DX_ARG_ABLE([xml], [generate doxygen XML documentation], [DX_CHECK_DEPEND(doc, 1)], [DX_CLEAR_DEPEND(doc, 1)], [], [DX_ENV_APPEND(GENERATE_XML, YES)], [DX_ENV_APPEND(GENERATE_XML, NO)]) -m4trace:configure.ac:22: -1- AC_DEFUN([DX_CURRENT_FEATURE], [xml]) -m4trace:configure.ac:22: -1- AC_DEFUN([DX_CURRENT_DESCRIPTION], [generate doxygen XML documentation]) -m4trace:configure.ac:22: -2- DX_IF_FEATURE([xml], [--disable-doxygen-xml], [--enable-doxygen-xml]) -m4trace:configure.ac:22: -3- DX_FEATURE_xml -m4trace:configure.ac:22: -2- DX_IF_FEATURE([xml], [don't generate doxygen XML documentation], [generate doxygen XML documentation]) -m4trace:configure.ac:22: -3- DX_FEATURE_xml -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_FLAG_xml$]) -m4trace:configure.ac:22: -1- DX_CHECK_DEPEND([doc], [1]) -m4trace:configure.ac:22: -1- DX_CURRENT_FEATURE -m4trace:configure.ac:22: -1- DX_CURRENT_FEATURE -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_FLAG_xml$]) -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_FLAG_xml$]) -m4trace:configure.ac:22: -1- DX_IF_FEATURE([xml], [1], [0]) -m4trace:configure.ac:22: -2- DX_FEATURE_xml -m4trace:configure.ac:22: -1- DX_CLEAR_DEPEND([doc], [1]) -m4trace:configure.ac:22: -2- DX_CURRENT_FEATURE -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_FLAG_xml$]) -m4trace:configure.ac:22: -1- DX_TEST_FEATURE([xml]) -m4trace:configure.ac:22: -1- DX_TEST_FEATURE([xml]) -m4trace:configure.ac:22: -1- AM_CONDITIONAL([DX_COND_xml], [:]) -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_COND_xml_TRUE$]) -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_COND_xml_FALSE$]) -m4trace:configure.ac:22: -1- _AM_SUBST_NOTMAKE([DX_COND_xml_TRUE]) -m4trace:configure.ac:22: -1- _AM_SUBST_NOTMAKE([DX_COND_xml_FALSE]) -m4trace:configure.ac:22: -1- DX_ENV_APPEND([GENERATE_XML], [YES]) -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_ENV$]) -m4trace:configure.ac:22: -1- AM_CONDITIONAL([DX_COND_xml], [false]) -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_COND_xml_TRUE$]) -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_COND_xml_FALSE$]) -m4trace:configure.ac:22: -1- _AM_SUBST_NOTMAKE([DX_COND_xml_TRUE]) -m4trace:configure.ac:22: -1- _AM_SUBST_NOTMAKE([DX_COND_xml_FALSE]) -m4trace:configure.ac:22: -1- DX_ENV_APPEND([GENERATE_XML], [NO]) -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_ENV$]) -m4trace:configure.ac:22: -1- DX_ARG_ABLE([chm], [generate doxygen compressed HTML help documentation], [DX_CHECK_DEPEND(doc, 1)], [DX_CLEAR_DEPEND(doc, 1)], [DX_REQUIRE_PROG([DX_HHC], hhc)], [DX_ENV_APPEND(HHC_PATH, $DX_HHC) - DX_ENV_APPEND(GENERATE_HTML, YES) - DX_ENV_APPEND(GENERATE_HTMLHELP, YES)], [DX_ENV_APPEND(GENERATE_HTMLHELP, NO)]) -m4trace:configure.ac:22: -1- AC_DEFUN([DX_CURRENT_FEATURE], [chm]) -m4trace:configure.ac:22: -1- AC_DEFUN([DX_CURRENT_DESCRIPTION], [generate doxygen compressed HTML help documentation]) -m4trace:configure.ac:22: -2- DX_IF_FEATURE([chm], [--disable-doxygen-chm], [--enable-doxygen-chm]) -m4trace:configure.ac:22: -3- DX_FEATURE_chm -m4trace:configure.ac:22: -2- DX_IF_FEATURE([chm], [don't generate doxygen compressed HTML help documentation], [generate doxygen compressed HTML help documentation]) -m4trace:configure.ac:22: -3- DX_FEATURE_chm -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_FLAG_chm$]) -m4trace:configure.ac:22: -1- DX_CHECK_DEPEND([doc], [1]) -m4trace:configure.ac:22: -1- DX_CURRENT_FEATURE -m4trace:configure.ac:22: -1- DX_CURRENT_FEATURE -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_FLAG_chm$]) -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_FLAG_chm$]) -m4trace:configure.ac:22: -1- DX_IF_FEATURE([chm], [1], [0]) -m4trace:configure.ac:22: -2- DX_FEATURE_chm -m4trace:configure.ac:22: -1- DX_CLEAR_DEPEND([doc], [1]) -m4trace:configure.ac:22: -2- DX_CURRENT_FEATURE -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_FLAG_chm$]) -m4trace:configure.ac:22: -1- DX_TEST_FEATURE([chm]) -m4trace:configure.ac:22: -1- DX_REQUIRE_PROG([DX_HHC], [hhc]) -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_HHC$]) -m4trace:configure.ac:22: -1- DX_CURRENT_DESCRIPTION -m4trace:configure.ac:22: -1- DX_CURRENT_DESCRIPTION -m4trace:configure.ac:22: -2- DX_CURRENT_FEATURE -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_FLAG_chm$]) -m4trace:configure.ac:22: -1- DX_TEST_FEATURE([chm]) -m4trace:configure.ac:22: -1- AM_CONDITIONAL([DX_COND_chm], [:]) -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_COND_chm_TRUE$]) -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_COND_chm_FALSE$]) -m4trace:configure.ac:22: -1- _AM_SUBST_NOTMAKE([DX_COND_chm_TRUE]) -m4trace:configure.ac:22: -1- _AM_SUBST_NOTMAKE([DX_COND_chm_FALSE]) -m4trace:configure.ac:22: -1- DX_ENV_APPEND([HHC_PATH], [$DX_HHC]) -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_ENV$]) -m4trace:configure.ac:22: -1- DX_ENV_APPEND([GENERATE_HTML], [YES]) -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_ENV$]) -m4trace:configure.ac:22: -1- DX_ENV_APPEND([GENERATE_HTMLHELP], [YES]) -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_ENV$]) -m4trace:configure.ac:22: -1- AM_CONDITIONAL([DX_COND_chm], [false]) -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_COND_chm_TRUE$]) -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_COND_chm_FALSE$]) -m4trace:configure.ac:22: -1- _AM_SUBST_NOTMAKE([DX_COND_chm_TRUE]) -m4trace:configure.ac:22: -1- _AM_SUBST_NOTMAKE([DX_COND_chm_FALSE]) -m4trace:configure.ac:22: -1- DX_ENV_APPEND([GENERATE_HTMLHELP], [NO]) -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_ENV$]) -m4trace:configure.ac:22: -1- DX_ARG_ABLE([chi], [generate doxygen seperate compressed HTML help index file], [DX_CHECK_DEPEND(chm, 1)], [DX_CLEAR_DEPEND(chm, 1)], [], [DX_ENV_APPEND(GENERATE_CHI, YES)], [DX_ENV_APPEND(GENERATE_CHI, NO)]) -m4trace:configure.ac:22: -1- AC_DEFUN([DX_CURRENT_FEATURE], [chi]) -m4trace:configure.ac:22: -1- AC_DEFUN([DX_CURRENT_DESCRIPTION], [generate doxygen seperate compressed HTML help index file]) -m4trace:configure.ac:22: -2- DX_IF_FEATURE([chi], [--disable-doxygen-chi], [--enable-doxygen-chi]) -m4trace:configure.ac:22: -3- DX_FEATURE_chi -m4trace:configure.ac:22: -2- DX_IF_FEATURE([chi], [don't generate doxygen seperate compressed HTML help index file], [generate doxygen seperate compressed HTML help index file]) -m4trace:configure.ac:22: -3- DX_FEATURE_chi -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_FLAG_chi$]) -m4trace:configure.ac:22: -1- DX_CHECK_DEPEND([chm], [1]) -m4trace:configure.ac:22: -1- DX_CURRENT_FEATURE -m4trace:configure.ac:22: -1- DX_CURRENT_FEATURE -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_FLAG_chi$]) -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_FLAG_chi$]) -m4trace:configure.ac:22: -1- DX_IF_FEATURE([chi], [1], [0]) -m4trace:configure.ac:22: -2- DX_FEATURE_chi -m4trace:configure.ac:22: -1- DX_CLEAR_DEPEND([chm], [1]) -m4trace:configure.ac:22: -2- DX_CURRENT_FEATURE -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_FLAG_chi$]) -m4trace:configure.ac:22: -1- DX_TEST_FEATURE([chi]) -m4trace:configure.ac:22: -1- DX_TEST_FEATURE([chi]) -m4trace:configure.ac:22: -1- AM_CONDITIONAL([DX_COND_chi], [:]) -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_COND_chi_TRUE$]) -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_COND_chi_FALSE$]) -m4trace:configure.ac:22: -1- _AM_SUBST_NOTMAKE([DX_COND_chi_TRUE]) -m4trace:configure.ac:22: -1- _AM_SUBST_NOTMAKE([DX_COND_chi_FALSE]) -m4trace:configure.ac:22: -1- DX_ENV_APPEND([GENERATE_CHI], [YES]) -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_ENV$]) -m4trace:configure.ac:22: -1- AM_CONDITIONAL([DX_COND_chi], [false]) -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_COND_chi_TRUE$]) -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_COND_chi_FALSE$]) -m4trace:configure.ac:22: -1- _AM_SUBST_NOTMAKE([DX_COND_chi_TRUE]) -m4trace:configure.ac:22: -1- _AM_SUBST_NOTMAKE([DX_COND_chi_FALSE]) -m4trace:configure.ac:22: -1- DX_ENV_APPEND([GENERATE_CHI], [NO]) -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_ENV$]) -m4trace:configure.ac:22: -1- DX_ARG_ABLE([html], [generate doxygen plain HTML documentation], [DX_CHECK_DEPEND(doc, 1) DX_CHECK_DEPEND(chm, 0)], [DX_CLEAR_DEPEND(doc, 1) DX_CLEAR_DEPEND(chm, 0)], [], [DX_ENV_APPEND(GENERATE_HTML, YES)], [DX_TEST_FEATURE(chm) || DX_ENV_APPEND(GENERATE_HTML, NO)]) -m4trace:configure.ac:22: -1- AC_DEFUN([DX_CURRENT_FEATURE], [html]) -m4trace:configure.ac:22: -1- AC_DEFUN([DX_CURRENT_DESCRIPTION], [generate doxygen plain HTML documentation]) -m4trace:configure.ac:22: -2- DX_IF_FEATURE([html], [--disable-doxygen-html], [--enable-doxygen-html]) -m4trace:configure.ac:22: -3- DX_FEATURE_html -m4trace:configure.ac:22: -2- DX_IF_FEATURE([html], [don't generate doxygen plain HTML documentation], [generate doxygen plain HTML documentation]) -m4trace:configure.ac:22: -3- DX_FEATURE_html -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_FLAG_html$]) -m4trace:configure.ac:22: -1- DX_CHECK_DEPEND([doc], [1]) -m4trace:configure.ac:22: -1- DX_CURRENT_FEATURE -m4trace:configure.ac:22: -1- DX_CURRENT_FEATURE -m4trace:configure.ac:22: -1- DX_CHECK_DEPEND([chm], [0]) -m4trace:configure.ac:22: -1- DX_CURRENT_FEATURE -m4trace:configure.ac:22: -1- DX_CURRENT_FEATURE -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_FLAG_html$]) -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_FLAG_html$]) -m4trace:configure.ac:22: -1- DX_IF_FEATURE([html], [1], [0]) -m4trace:configure.ac:22: -2- DX_FEATURE_html -m4trace:configure.ac:22: -1- DX_CLEAR_DEPEND([doc], [1]) -m4trace:configure.ac:22: -2- DX_CURRENT_FEATURE -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_FLAG_html$]) -m4trace:configure.ac:22: -1- DX_CLEAR_DEPEND([chm], [0]) -m4trace:configure.ac:22: -2- DX_CURRENT_FEATURE -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_FLAG_html$]) -m4trace:configure.ac:22: -1- DX_TEST_FEATURE([html]) -m4trace:configure.ac:22: -1- DX_TEST_FEATURE([html]) -m4trace:configure.ac:22: -1- AM_CONDITIONAL([DX_COND_html], [:]) -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_COND_html_TRUE$]) -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_COND_html_FALSE$]) -m4trace:configure.ac:22: -1- _AM_SUBST_NOTMAKE([DX_COND_html_TRUE]) -m4trace:configure.ac:22: -1- _AM_SUBST_NOTMAKE([DX_COND_html_FALSE]) -m4trace:configure.ac:22: -1- DX_ENV_APPEND([GENERATE_HTML], [YES]) -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_ENV$]) -m4trace:configure.ac:22: -1- AM_CONDITIONAL([DX_COND_html], [false]) -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_COND_html_TRUE$]) -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_COND_html_FALSE$]) -m4trace:configure.ac:22: -1- _AM_SUBST_NOTMAKE([DX_COND_html_TRUE]) -m4trace:configure.ac:22: -1- _AM_SUBST_NOTMAKE([DX_COND_html_FALSE]) -m4trace:configure.ac:22: -1- DX_TEST_FEATURE([chm]) -m4trace:configure.ac:22: -1- DX_ENV_APPEND([GENERATE_HTML], [NO]) -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_ENV$]) -m4trace:configure.ac:22: -1- DX_ARG_ABLE([ps], [generate doxygen PostScript documentation], [DX_CHECK_DEPEND(doc, 1)], [DX_CLEAR_DEPEND(doc, 1)], [DX_REQUIRE_PROG([DX_LATEX], latex) - DX_REQUIRE_PROG([DX_MAKEINDEX], makeindex) - DX_REQUIRE_PROG([DX_DVIPS], dvips) - DX_REQUIRE_PROG([DX_EGREP], egrep)]) -m4trace:configure.ac:22: -1- AC_DEFUN([DX_CURRENT_FEATURE], [ps]) -m4trace:configure.ac:22: -1- AC_DEFUN([DX_CURRENT_DESCRIPTION], [generate doxygen PostScript documentation]) -m4trace:configure.ac:22: -2- DX_IF_FEATURE([ps], [--disable-doxygen-ps], [--enable-doxygen-ps]) -m4trace:configure.ac:22: -3- DX_FEATURE_ps -m4trace:configure.ac:22: -2- DX_IF_FEATURE([ps], [don't generate doxygen PostScript documentation], [generate doxygen PostScript documentation]) -m4trace:configure.ac:22: -3- DX_FEATURE_ps -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_FLAG_ps$]) -m4trace:configure.ac:22: -1- DX_CHECK_DEPEND([doc], [1]) -m4trace:configure.ac:22: -1- DX_CURRENT_FEATURE -m4trace:configure.ac:22: -1- DX_CURRENT_FEATURE -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_FLAG_ps$]) -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_FLAG_ps$]) -m4trace:configure.ac:22: -1- DX_IF_FEATURE([ps], [1], [0]) -m4trace:configure.ac:22: -2- DX_FEATURE_ps -m4trace:configure.ac:22: -1- DX_CLEAR_DEPEND([doc], [1]) -m4trace:configure.ac:22: -2- DX_CURRENT_FEATURE -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_FLAG_ps$]) -m4trace:configure.ac:22: -1- DX_TEST_FEATURE([ps]) -m4trace:configure.ac:22: -1- DX_REQUIRE_PROG([DX_LATEX], [latex]) -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_LATEX$]) -m4trace:configure.ac:22: -1- DX_CURRENT_DESCRIPTION -m4trace:configure.ac:22: -1- DX_CURRENT_DESCRIPTION -m4trace:configure.ac:22: -2- DX_CURRENT_FEATURE -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_FLAG_ps$]) -m4trace:configure.ac:22: -1- DX_REQUIRE_PROG([DX_MAKEINDEX], [makeindex]) -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_MAKEINDEX$]) -m4trace:configure.ac:22: -1- DX_CURRENT_DESCRIPTION -m4trace:configure.ac:22: -1- DX_CURRENT_DESCRIPTION -m4trace:configure.ac:22: -2- DX_CURRENT_FEATURE -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_FLAG_ps$]) -m4trace:configure.ac:22: -1- DX_REQUIRE_PROG([DX_DVIPS], [dvips]) -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_DVIPS$]) -m4trace:configure.ac:22: -1- DX_CURRENT_DESCRIPTION -m4trace:configure.ac:22: -1- DX_CURRENT_DESCRIPTION -m4trace:configure.ac:22: -2- DX_CURRENT_FEATURE -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_FLAG_ps$]) -m4trace:configure.ac:22: -1- DX_REQUIRE_PROG([DX_EGREP], [egrep]) -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_EGREP$]) -m4trace:configure.ac:22: -1- DX_CURRENT_DESCRIPTION -m4trace:configure.ac:22: -1- DX_CURRENT_DESCRIPTION -m4trace:configure.ac:22: -2- DX_CURRENT_FEATURE -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_FLAG_ps$]) -m4trace:configure.ac:22: -1- DX_TEST_FEATURE([ps]) -m4trace:configure.ac:22: -1- AM_CONDITIONAL([DX_COND_ps], [:]) -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_COND_ps_TRUE$]) -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_COND_ps_FALSE$]) -m4trace:configure.ac:22: -1- _AM_SUBST_NOTMAKE([DX_COND_ps_TRUE]) -m4trace:configure.ac:22: -1- _AM_SUBST_NOTMAKE([DX_COND_ps_FALSE]) -m4trace:configure.ac:22: -1- AM_CONDITIONAL([DX_COND_ps], [false]) -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_COND_ps_TRUE$]) -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_COND_ps_FALSE$]) -m4trace:configure.ac:22: -1- _AM_SUBST_NOTMAKE([DX_COND_ps_TRUE]) -m4trace:configure.ac:22: -1- _AM_SUBST_NOTMAKE([DX_COND_ps_FALSE]) -m4trace:configure.ac:22: -1- DX_ARG_ABLE([pdf], [generate doxygen PDF documentation], [DX_CHECK_DEPEND(doc, 1)], [DX_CLEAR_DEPEND(doc, 1)], [DX_REQUIRE_PROG([DX_PDFLATEX], pdflatex) - DX_REQUIRE_PROG([DX_MAKEINDEX], makeindex) - DX_REQUIRE_PROG([DX_EGREP], egrep)]) -m4trace:configure.ac:22: -1- AC_DEFUN([DX_CURRENT_FEATURE], [pdf]) -m4trace:configure.ac:22: -1- AC_DEFUN([DX_CURRENT_DESCRIPTION], [generate doxygen PDF documentation]) -m4trace:configure.ac:22: -2- DX_IF_FEATURE([pdf], [--disable-doxygen-pdf], [--enable-doxygen-pdf]) -m4trace:configure.ac:22: -3- DX_FEATURE_pdf -m4trace:configure.ac:22: -2- DX_IF_FEATURE([pdf], [don't generate doxygen PDF documentation], [generate doxygen PDF documentation]) -m4trace:configure.ac:22: -3- DX_FEATURE_pdf -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_FLAG_pdf$]) -m4trace:configure.ac:22: -1- DX_CHECK_DEPEND([doc], [1]) -m4trace:configure.ac:22: -1- DX_CURRENT_FEATURE -m4trace:configure.ac:22: -1- DX_CURRENT_FEATURE -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_FLAG_pdf$]) -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_FLAG_pdf$]) -m4trace:configure.ac:22: -1- DX_IF_FEATURE([pdf], [1], [0]) -m4trace:configure.ac:22: -2- DX_FEATURE_pdf -m4trace:configure.ac:22: -1- DX_CLEAR_DEPEND([doc], [1]) -m4trace:configure.ac:22: -2- DX_CURRENT_FEATURE -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_FLAG_pdf$]) -m4trace:configure.ac:22: -1- DX_TEST_FEATURE([pdf]) -m4trace:configure.ac:22: -1- DX_REQUIRE_PROG([DX_PDFLATEX], [pdflatex]) -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_PDFLATEX$]) -m4trace:configure.ac:22: -1- DX_CURRENT_DESCRIPTION -m4trace:configure.ac:22: -1- DX_CURRENT_DESCRIPTION -m4trace:configure.ac:22: -2- DX_CURRENT_FEATURE -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_FLAG_pdf$]) -m4trace:configure.ac:22: -1- DX_REQUIRE_PROG([DX_MAKEINDEX], [makeindex]) -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_MAKEINDEX$]) -m4trace:configure.ac:22: -1- DX_CURRENT_DESCRIPTION -m4trace:configure.ac:22: -1- DX_CURRENT_DESCRIPTION -m4trace:configure.ac:22: -2- DX_CURRENT_FEATURE -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_FLAG_pdf$]) -m4trace:configure.ac:22: -1- DX_REQUIRE_PROG([DX_EGREP], [egrep]) -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_EGREP$]) -m4trace:configure.ac:22: -1- DX_CURRENT_DESCRIPTION -m4trace:configure.ac:22: -1- DX_CURRENT_DESCRIPTION -m4trace:configure.ac:22: -2- DX_CURRENT_FEATURE -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_FLAG_pdf$]) -m4trace:configure.ac:22: -1- DX_TEST_FEATURE([pdf]) -m4trace:configure.ac:22: -1- AM_CONDITIONAL([DX_COND_pdf], [:]) -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_COND_pdf_TRUE$]) -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_COND_pdf_FALSE$]) -m4trace:configure.ac:22: -1- _AM_SUBST_NOTMAKE([DX_COND_pdf_TRUE]) -m4trace:configure.ac:22: -1- _AM_SUBST_NOTMAKE([DX_COND_pdf_FALSE]) -m4trace:configure.ac:22: -1- AM_CONDITIONAL([DX_COND_pdf], [false]) -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_COND_pdf_TRUE$]) -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_COND_pdf_FALSE$]) -m4trace:configure.ac:22: -1- _AM_SUBST_NOTMAKE([DX_COND_pdf_TRUE]) -m4trace:configure.ac:22: -1- _AM_SUBST_NOTMAKE([DX_COND_pdf_FALSE]) -m4trace:configure.ac:22: -1- DX_TEST_FEATURE([ps]) -m4trace:configure.ac:22: -1- DX_TEST_FEATURE([pdf]) -m4trace:configure.ac:22: -1- AM_CONDITIONAL([DX_COND_latex], [:]) -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_COND_latex_TRUE$]) -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_COND_latex_FALSE$]) -m4trace:configure.ac:22: -1- _AM_SUBST_NOTMAKE([DX_COND_latex_TRUE]) -m4trace:configure.ac:22: -1- _AM_SUBST_NOTMAKE([DX_COND_latex_FALSE]) -m4trace:configure.ac:22: -1- DX_ENV_APPEND([GENERATE_LATEX], [YES]) -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_ENV$]) -m4trace:configure.ac:22: -1- AM_CONDITIONAL([DX_COND_latex], [false]) -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_COND_latex_TRUE$]) -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_COND_latex_FALSE$]) -m4trace:configure.ac:22: -1- _AM_SUBST_NOTMAKE([DX_COND_latex_TRUE]) -m4trace:configure.ac:22: -1- _AM_SUBST_NOTMAKE([DX_COND_latex_FALSE]) -m4trace:configure.ac:22: -1- DX_ENV_APPEND([GENERATE_LATEX], [NO]) -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_ENV$]) -m4trace:configure.ac:22: -1- m4_pattern_allow([^DOXYGEN_PAPER_SIZE$]) -m4trace:configure.ac:22: -1- m4_pattern_allow([^DOXYGEN_PAPER_SIZE$]) -m4trace:configure.ac:22: -1- DX_ENV_APPEND([PAPER_SIZE], [$DOXYGEN_PAPER_SIZE]) -m4trace:configure.ac:22: -1- m4_pattern_allow([^DX_ENV$]) -m4trace:configure.ac:25: -1- AM_INIT_AUTOMAKE([-Wall foreign]) -m4trace:configure.ac:25: -1- m4_pattern_allow([^AM_[A-Z]+FLAGS$]) -m4trace:configure.ac:25: -1- AM_SET_CURRENT_AUTOMAKE_VERSION -m4trace:configure.ac:25: -1- AM_AUTOMAKE_VERSION([1.11.6]) -m4trace:configure.ac:25: -1- _AM_AUTOCONF_VERSION([2.69]) -m4trace:configure.ac:25: -1- m4_pattern_allow([^INSTALL_PROGRAM$]) -m4trace:configure.ac:25: -1- m4_pattern_allow([^INSTALL_SCRIPT$]) -m4trace:configure.ac:25: -1- m4_pattern_allow([^INSTALL_DATA$]) -m4trace:configure.ac:25: -1- m4_pattern_allow([^am__isrc$]) -m4trace:configure.ac:25: -1- _AM_SUBST_NOTMAKE([am__isrc]) -m4trace:configure.ac:25: -1- m4_pattern_allow([^CYGPATH_W$]) -m4trace:configure.ac:25: -1- _AM_SET_OPTIONS([-Wall foreign]) -m4trace:configure.ac:25: -1- _AM_SET_OPTION([-Wall]) -m4trace:configure.ac:25: -2- _AM_MANGLE_OPTION([-Wall]) -m4trace:configure.ac:25: -1- _AM_SET_OPTION([foreign]) -m4trace:configure.ac:25: -2- _AM_MANGLE_OPTION([foreign]) -m4trace:configure.ac:25: -1- m4_pattern_allow([^PACKAGE$]) -m4trace:configure.ac:25: -1- m4_pattern_allow([^VERSION$]) -m4trace:configure.ac:25: -1- _AM_IF_OPTION([no-define], [], [AC_DEFINE_UNQUOTED(PACKAGE, "$PACKAGE", [Name of package]) - AC_DEFINE_UNQUOTED(VERSION, "$VERSION", [Version number of package])]) -m4trace:configure.ac:25: -2- _AM_MANGLE_OPTION([no-define]) -m4trace:configure.ac:25: -1- m4_pattern_allow([^PACKAGE$]) -m4trace:configure.ac:25: -1- m4_pattern_allow([^VERSION$]) -m4trace:configure.ac:25: -1- AM_SANITY_CHECK -m4trace:configure.ac:25: -1- AM_MISSING_PROG([ACLOCAL], [aclocal-${am__api_version}]) -m4trace:configure.ac:25: -1- AM_MISSING_HAS_RUN -m4trace:configure.ac:25: -1- AM_AUX_DIR_EXPAND -m4trace:configure.ac:25: -1- m4_pattern_allow([^ACLOCAL$]) -m4trace:configure.ac:25: -1- AM_MISSING_PROG([AUTOCONF], [autoconf]) -m4trace:configure.ac:25: -1- m4_pattern_allow([^AUTOCONF$]) -m4trace:configure.ac:25: -1- AM_MISSING_PROG([AUTOMAKE], [automake-${am__api_version}]) -m4trace:configure.ac:25: -1- m4_pattern_allow([^AUTOMAKE$]) -m4trace:configure.ac:25: -1- AM_MISSING_PROG([AUTOHEADER], [autoheader]) -m4trace:configure.ac:25: -1- m4_pattern_allow([^AUTOHEADER$]) -m4trace:configure.ac:25: -1- AM_MISSING_PROG([MAKEINFO], [makeinfo]) -m4trace:configure.ac:25: -1- m4_pattern_allow([^MAKEINFO$]) -m4trace:configure.ac:25: -1- AM_PROG_INSTALL_SH -m4trace:configure.ac:25: -1- m4_pattern_allow([^install_sh$]) -m4trace:configure.ac:25: -1- AM_PROG_INSTALL_STRIP -m4trace:configure.ac:25: -1- m4_pattern_allow([^STRIP$]) -m4trace:configure.ac:25: -1- m4_pattern_allow([^INSTALL_STRIP_PROGRAM$]) -m4trace:configure.ac:25: -1- AM_PROG_MKDIR_P -m4trace:configure.ac:25: -1- m4_pattern_allow([^MKDIR_P$]) -m4trace:configure.ac:25: -1- m4_pattern_allow([^mkdir_p$]) -m4trace:configure.ac:25: -1- m4_pattern_allow([^AWK$]) -m4trace:configure.ac:25: -1- m4_pattern_allow([^SET_MAKE$]) -m4trace:configure.ac:25: -1- AM_SET_LEADING_DOT -m4trace:configure.ac:25: -1- m4_pattern_allow([^am__leading_dot$]) -m4trace:configure.ac:25: -1- _AM_IF_OPTION([tar-ustar], [_AM_PROG_TAR([ustar])], [_AM_IF_OPTION([tar-pax], [_AM_PROG_TAR([pax])], - [_AM_PROG_TAR([v7])])]) -m4trace:configure.ac:25: -2- _AM_MANGLE_OPTION([tar-ustar]) -m4trace:configure.ac:25: -1- _AM_IF_OPTION([tar-pax], [_AM_PROG_TAR([pax])], [_AM_PROG_TAR([v7])]) -m4trace:configure.ac:25: -2- _AM_MANGLE_OPTION([tar-pax]) -m4trace:configure.ac:25: -1- _AM_PROG_TAR([v7]) -m4trace:configure.ac:25: -1- m4_pattern_allow([^AMTAR$]) -m4trace:configure.ac:25: -1- m4_pattern_allow([^am__tar$]) -m4trace:configure.ac:25: -1- m4_pattern_allow([^am__untar$]) -m4trace:configure.ac:25: -1- _AM_IF_OPTION([no-dependencies], [], [AC_PROVIDE_IFELSE([AC_PROG_CC], - [_AM_DEPENDENCIES(CC)], - [define([AC_PROG_CC], - defn([AC_PROG_CC])[_AM_DEPENDENCIES(CC)])])dnl -AC_PROVIDE_IFELSE([AC_PROG_CXX], - [_AM_DEPENDENCIES(CXX)], - [define([AC_PROG_CXX], - defn([AC_PROG_CXX])[_AM_DEPENDENCIES(CXX)])])dnl -AC_PROVIDE_IFELSE([AC_PROG_OBJC], - [_AM_DEPENDENCIES(OBJC)], - [define([AC_PROG_OBJC], - defn([AC_PROG_OBJC])[_AM_DEPENDENCIES(OBJC)])])dnl -]) -m4trace:configure.ac:25: -2- _AM_MANGLE_OPTION([no-dependencies]) -m4trace:configure.ac:25: -1- _AM_IF_OPTION([silent-rules], [AC_REQUIRE([AM_SILENT_RULES])]) -m4trace:configure.ac:25: -2- _AM_MANGLE_OPTION([silent-rules]) -m4trace:configure.ac:37: -1- AM_PATH_CPPUNIT([1.10.2]) -m4trace:configure.ac:37: -1- m4_pattern_allow([^CPPUNIT_CONFIG$]) -m4trace:configure.ac:37: -1- m4_pattern_allow([^CPPUNIT_CFLAGS$]) -m4trace:configure.ac:37: -1- m4_pattern_allow([^CPPUNIT_LIBS$]) -m4trace:configure.ac:44: -1- _m4_warn([cross], [cannot check for file existence when cross compiling], [../../lib/autoconf/general.m4:2777: AC_CHECK_FILE is expanded from... -../../lib/autoconf/general.m4:2808: AC_CHECK_FILES is expanded from... -configure.ac:44: the top level]) -m4trace:configure.ac:44: -1- m4_pattern_allow([^HAVE_GENERATED_ZOOKEEPER_JUTE_C$]) -m4trace:configure.ac:44: -1- _m4_warn([cross], [cannot check for file existence when cross compiling], [../../lib/autoconf/general.m4:2777: AC_CHECK_FILE is expanded from... -../../lib/autoconf/general.m4:2808: AC_CHECK_FILES is expanded from... -configure.ac:44: the top level]) -m4trace:configure.ac:44: -1- m4_pattern_allow([^HAVE_GENERATED_ZOOKEEPER_JUTE_H$]) -m4trace:configure.ac:48: -1- m4_pattern_allow([^CPPUNIT_CFLAGS$]) -m4trace:configure.ac:50: -1- m4_pattern_allow([^CC$]) -m4trace:configure.ac:50: -1- m4_pattern_allow([^CFLAGS$]) -m4trace:configure.ac:50: -1- m4_pattern_allow([^LDFLAGS$]) -m4trace:configure.ac:50: -1- m4_pattern_allow([^LIBS$]) -m4trace:configure.ac:50: -1- m4_pattern_allow([^CPPFLAGS$]) -m4trace:configure.ac:50: -1- m4_pattern_allow([^CC$]) -m4trace:configure.ac:50: -1- m4_pattern_allow([^CC$]) -m4trace:configure.ac:50: -1- m4_pattern_allow([^CC$]) -m4trace:configure.ac:50: -1- m4_pattern_allow([^CC$]) -m4trace:configure.ac:50: -1- m4_pattern_allow([^ac_ct_CC$]) -m4trace:configure.ac:50: -1- m4_pattern_allow([^EXEEXT$]) -m4trace:configure.ac:50: -1- m4_pattern_allow([^OBJEXT$]) -m4trace:configure.ac:50: -1- _AM_DEPENDENCIES([CC]) -m4trace:configure.ac:50: -1- AM_SET_DEPDIR -m4trace:configure.ac:50: -1- m4_pattern_allow([^DEPDIR$]) -m4trace:configure.ac:50: -1- AM_OUTPUT_DEPENDENCY_COMMANDS -m4trace:configure.ac:50: -1- AM_MAKE_INCLUDE -m4trace:configure.ac:50: -1- m4_pattern_allow([^am__include$]) -m4trace:configure.ac:50: -1- m4_pattern_allow([^am__quote$]) -m4trace:configure.ac:50: -1- AM_DEP_TRACK -m4trace:configure.ac:50: -1- AM_CONDITIONAL([AMDEP], [test "x$enable_dependency_tracking" != xno]) -m4trace:configure.ac:50: -1- m4_pattern_allow([^AMDEP_TRUE$]) -m4trace:configure.ac:50: -1- m4_pattern_allow([^AMDEP_FALSE$]) -m4trace:configure.ac:50: -1- _AM_SUBST_NOTMAKE([AMDEP_TRUE]) -m4trace:configure.ac:50: -1- _AM_SUBST_NOTMAKE([AMDEP_FALSE]) -m4trace:configure.ac:50: -1- m4_pattern_allow([^AMDEPBACKSLASH$]) -m4trace:configure.ac:50: -1- _AM_SUBST_NOTMAKE([AMDEPBACKSLASH]) -m4trace:configure.ac:50: -1- m4_pattern_allow([^am__nodep$]) -m4trace:configure.ac:50: -1- _AM_SUBST_NOTMAKE([am__nodep]) -m4trace:configure.ac:50: -1- m4_pattern_allow([^CCDEPMODE$]) -m4trace:configure.ac:50: -1- AM_CONDITIONAL([am__fastdepCC], [ - test "x$enable_dependency_tracking" != xno \ - && test "$am_cv_CC_dependencies_compiler_type" = gcc3]) -m4trace:configure.ac:50: -1- m4_pattern_allow([^am__fastdepCC_TRUE$]) -m4trace:configure.ac:50: -1- m4_pattern_allow([^am__fastdepCC_FALSE$]) -m4trace:configure.ac:50: -1- _AM_SUBST_NOTMAKE([am__fastdepCC_TRUE]) -m4trace:configure.ac:50: -1- _AM_SUBST_NOTMAKE([am__fastdepCC_FALSE]) -m4trace:configure.ac:51: -1- AM_PROG_CC_C_O -m4trace:configure.ac:51: -1- m4_pattern_allow([^NO_MINUS_C_MINUS_O$]) -m4trace:configure.ac:52: -1- m4_pattern_allow([^CXX$]) -m4trace:configure.ac:52: -1- m4_pattern_allow([^CXXFLAGS$]) -m4trace:configure.ac:52: -1- m4_pattern_allow([^LDFLAGS$]) -m4trace:configure.ac:52: -1- m4_pattern_allow([^LIBS$]) -m4trace:configure.ac:52: -1- m4_pattern_allow([^CPPFLAGS$]) -m4trace:configure.ac:52: -1- m4_pattern_allow([^CXX$]) -m4trace:configure.ac:52: -1- m4_pattern_allow([^ac_ct_CXX$]) -m4trace:configure.ac:52: -1- _AM_DEPENDENCIES([CXX]) -m4trace:configure.ac:52: -1- m4_pattern_allow([^CXXDEPMODE$]) -m4trace:configure.ac:52: -1- AM_CONDITIONAL([am__fastdepCXX], [ - test "x$enable_dependency_tracking" != xno \ - && test "$am_cv_CXX_dependencies_compiler_type" = gcc3]) -m4trace:configure.ac:52: -1- m4_pattern_allow([^am__fastdepCXX_TRUE$]) -m4trace:configure.ac:52: -1- m4_pattern_allow([^am__fastdepCXX_FALSE$]) -m4trace:configure.ac:52: -1- _AM_SUBST_NOTMAKE([am__fastdepCXX_TRUE]) -m4trace:configure.ac:52: -1- _AM_SUBST_NOTMAKE([am__fastdepCXX_FALSE]) -m4trace:configure.ac:54: -1- m4_pattern_allow([^LN_S$]) -m4trace:configure.ac:57: -1- AC_PROG_LIBTOOL -m4trace:configure.ac:57: -1- _m4_warn([obsolete], [The macro `AC_PROG_LIBTOOL' is obsolete. -You should run autoupdate.], [/usr/share/aclocal/libtool.m4:107: AC_PROG_LIBTOOL is expanded from... -configure.ac:57: the top level]) -m4trace:configure.ac:57: -1- LT_INIT -m4trace:configure.ac:57: -1- m4_pattern_forbid([^_?LT_[A-Z_]+$]) -m4trace:configure.ac:57: -1- m4_pattern_allow([^(_LT_EOF|LT_DLGLOBAL|LT_DLLAZY_OR_NOW|LT_MULTI_MODULE)$]) -m4trace:configure.ac:57: -1- LTOPTIONS_VERSION -m4trace:configure.ac:57: -1- LTSUGAR_VERSION -m4trace:configure.ac:57: -1- LTVERSION_VERSION -m4trace:configure.ac:57: -1- LTOBSOLETE_VERSION -m4trace:configure.ac:57: -1- _LT_PROG_LTMAIN -m4trace:configure.ac:57: -1- m4_pattern_allow([^LIBTOOL$]) -m4trace:configure.ac:57: -1- m4_pattern_allow([^build$]) -m4trace:configure.ac:57: -1- m4_pattern_allow([^build_cpu$]) -m4trace:configure.ac:57: -1- m4_pattern_allow([^build_vendor$]) -m4trace:configure.ac:57: -1- m4_pattern_allow([^build_os$]) -m4trace:configure.ac:57: -1- m4_pattern_allow([^host$]) -m4trace:configure.ac:57: -1- m4_pattern_allow([^host_cpu$]) -m4trace:configure.ac:57: -1- m4_pattern_allow([^host_vendor$]) -m4trace:configure.ac:57: -1- m4_pattern_allow([^host_os$]) -m4trace:configure.ac:57: -1- _LT_PREPARE_SED_QUOTE_VARS -m4trace:configure.ac:57: -1- _LT_PROG_ECHO_BACKSLASH -m4trace:configure.ac:57: -1- LT_PATH_LD -m4trace:configure.ac:57: -1- m4_pattern_allow([^SED$]) -m4trace:configure.ac:57: -1- AC_PROG_EGREP -m4trace:configure.ac:57: -1- m4_pattern_allow([^GREP$]) -m4trace:configure.ac:57: -1- m4_pattern_allow([^EGREP$]) -m4trace:configure.ac:57: -1- m4_pattern_allow([^FGREP$]) -m4trace:configure.ac:57: -1- m4_pattern_allow([^GREP$]) -m4trace:configure.ac:57: -1- m4_pattern_allow([^LD$]) -m4trace:configure.ac:57: -1- LT_PATH_NM -m4trace:configure.ac:57: -1- m4_pattern_allow([^DUMPBIN$]) -m4trace:configure.ac:57: -1- m4_pattern_allow([^ac_ct_DUMPBIN$]) -m4trace:configure.ac:57: -1- m4_pattern_allow([^DUMPBIN$]) -m4trace:configure.ac:57: -1- m4_pattern_allow([^NM$]) -m4trace:configure.ac:57: -1- LT_CMD_MAX_LEN -m4trace:configure.ac:57: -1- m4_pattern_allow([^OBJDUMP$]) -m4trace:configure.ac:57: -1- m4_pattern_allow([^OBJDUMP$]) -m4trace:configure.ac:57: -1- m4_pattern_allow([^DLLTOOL$]) -m4trace:configure.ac:57: -1- m4_pattern_allow([^DLLTOOL$]) -m4trace:configure.ac:57: -1- m4_pattern_allow([^AR$]) -m4trace:configure.ac:57: -1- m4_pattern_allow([^ac_ct_AR$]) -m4trace:configure.ac:57: -1- m4_pattern_allow([^STRIP$]) -m4trace:configure.ac:57: -1- m4_pattern_allow([^RANLIB$]) -m4trace:configure.ac:57: -1- _LT_WITH_SYSROOT -m4trace:configure.ac:57: -1- m4_pattern_allow([LT_OBJDIR]) -m4trace:configure.ac:57: -1- m4_pattern_allow([^LT_OBJDIR$]) -m4trace:configure.ac:57: -1- _LT_CC_BASENAME([$compiler]) -m4trace:configure.ac:57: -1- _LT_PATH_TOOL_PREFIX([${ac_tool_prefix}file], [/usr/bin$PATH_SEPARATOR$PATH]) -m4trace:configure.ac:57: -1- _LT_PATH_TOOL_PREFIX([file], [/usr/bin$PATH_SEPARATOR$PATH]) -m4trace:configure.ac:57: -1- LT_SUPPORTED_TAG([CC]) -m4trace:configure.ac:57: -1- _LT_COMPILER_BOILERPLATE -m4trace:configure.ac:57: -1- _LT_LINKER_BOILERPLATE -m4trace:configure.ac:57: -1- _LT_COMPILER_OPTION([if $compiler supports -fno-rtti -fno-exceptions], [lt_cv_prog_compiler_rtti_exceptions], [-fno-rtti -fno-exceptions], [], [_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, )="$_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, ) -fno-rtti -fno-exceptions"]) -m4trace:configure.ac:57: -1- _LT_COMPILER_OPTION([if $compiler PIC flag $_LT_TAGVAR(lt_prog_compiler_pic, ) works], [_LT_TAGVAR(lt_cv_prog_compiler_pic_works, )], [$_LT_TAGVAR(lt_prog_compiler_pic, )@&t@m4_if([],[],[ -DPIC],[m4_if([],[CXX],[ -DPIC],[])])], [], [case $_LT_TAGVAR(lt_prog_compiler_pic, ) in - "" | " "*) ;; - *) _LT_TAGVAR(lt_prog_compiler_pic, )=" $_LT_TAGVAR(lt_prog_compiler_pic, )" ;; - esac], [_LT_TAGVAR(lt_prog_compiler_pic, )= - _LT_TAGVAR(lt_prog_compiler_can_build_shared, )=no]) -m4trace:configure.ac:57: -1- _LT_LINKER_OPTION([if $compiler static flag $lt_tmp_static_flag works], [lt_cv_prog_compiler_static_works], [$lt_tmp_static_flag], [], [_LT_TAGVAR(lt_prog_compiler_static, )=]) -m4trace:configure.ac:57: -1- m4_pattern_allow([^MANIFEST_TOOL$]) -m4trace:configure.ac:57: -1- _LT_REQUIRED_DARWIN_CHECKS -m4trace:configure.ac:57: -1- m4_pattern_allow([^DSYMUTIL$]) -m4trace:configure.ac:57: -1- m4_pattern_allow([^NMEDIT$]) -m4trace:configure.ac:57: -1- m4_pattern_allow([^LIPO$]) -m4trace:configure.ac:57: -1- m4_pattern_allow([^OTOOL$]) -m4trace:configure.ac:57: -1- m4_pattern_allow([^OTOOL64$]) -m4trace:configure.ac:57: -1- _LT_LINKER_OPTION([if $CC understands -b], [lt_cv_prog_compiler__b], [-b], [_LT_TAGVAR(archive_cmds, )='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'], [_LT_TAGVAR(archive_cmds, )='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags']) -m4trace:configure.ac:57: -1- LT_SYS_DLOPEN_SELF -m4trace:configure.ac:57: -1- m4_pattern_allow([^CPP$]) -m4trace:configure.ac:57: -1- m4_pattern_allow([^CPPFLAGS$]) -m4trace:configure.ac:57: -1- m4_pattern_allow([^CPP$]) -m4trace:configure.ac:57: -1- m4_pattern_allow([^STDC_HEADERS$]) -m4trace:configure.ac:57: -1- m4_pattern_allow([^HAVE_DLFCN_H$]) -m4trace:configure.ac:57: -1- LT_LANG([CXX]) -m4trace:configure.ac:57: -1- LT_SUPPORTED_TAG([CXX]) -m4trace:configure.ac:57: -1- m4_pattern_allow([^CXXCPP$]) -m4trace:configure.ac:57: -1- m4_pattern_allow([^CPPFLAGS$]) -m4trace:configure.ac:57: -1- m4_pattern_allow([^CXXCPP$]) -m4trace:configure.ac:57: -1- _LT_COMPILER_BOILERPLATE -m4trace:configure.ac:57: -1- _LT_LINKER_BOILERPLATE -m4trace:configure.ac:57: -1- _LT_CC_BASENAME([$compiler]) -m4trace:configure.ac:57: -1- LT_PATH_LD -m4trace:configure.ac:57: -1- m4_pattern_allow([^LD$]) -m4trace:configure.ac:57: -1- _LT_COMPILER_OPTION([if $compiler PIC flag $_LT_TAGVAR(lt_prog_compiler_pic, CXX) works], [_LT_TAGVAR(lt_cv_prog_compiler_pic_works, CXX)], [$_LT_TAGVAR(lt_prog_compiler_pic, CXX)@&t@m4_if([CXX],[],[ -DPIC],[m4_if([CXX],[CXX],[ -DPIC],[])])], [], [case $_LT_TAGVAR(lt_prog_compiler_pic, CXX) in - "" | " "*) ;; - *) _LT_TAGVAR(lt_prog_compiler_pic, CXX)=" $_LT_TAGVAR(lt_prog_compiler_pic, CXX)" ;; - esac], [_LT_TAGVAR(lt_prog_compiler_pic, CXX)= - _LT_TAGVAR(lt_prog_compiler_can_build_shared, CXX)=no]) -m4trace:configure.ac:57: -1- _LT_LINKER_OPTION([if $compiler static flag $lt_tmp_static_flag works], [lt_cv_prog_compiler_static_works_CXX], [$lt_tmp_static_flag], [], [_LT_TAGVAR(lt_prog_compiler_static, CXX)=]) -m4trace:configure.ac:106: -1- AM_CONDITIONAL([WANT_SYNCAPI], [test "x$with_syncapi" != xno]) -m4trace:configure.ac:106: -1- m4_pattern_allow([^WANT_SYNCAPI_TRUE$]) -m4trace:configure.ac:106: -1- m4_pattern_allow([^WANT_SYNCAPI_FALSE$]) -m4trace:configure.ac:106: -1- _AM_SUBST_NOTMAKE([WANT_SYNCAPI_TRUE]) -m4trace:configure.ac:106: -1- _AM_SUBST_NOTMAKE([WANT_SYNCAPI_FALSE]) -m4trace:configure.ac:109: -1- m4_pattern_allow([^STDC_HEADERS$]) -m4trace:configure.ac:113: -1- m4_pattern_allow([^const$]) -m4trace:configure.ac:115: -1- m4_pattern_allow([^TIME_WITH_SYS_TIME$]) -m4trace:configure.ac:116: -1- m4_pattern_allow([^POLL_NFDS_TYPE$]) -m4trace:configure.ac:116: -1- m4_pattern_allow([^POLL_NFDS_TYPE$]) -m4trace:configure.ac:123: -1- _m4_warn([obsolete], [The macro `AC_TRY_RUN' is obsolete. -You should run autoupdate.], [../../lib/autoconf/general.m4:2764: AC_TRY_RUN is expanded from... -configure.ac:123: the top level]) -m4trace:configure.ac:142: -1- m4_pattern_allow([^USEIPV6$]) -m4trace:configure.ac:149: -1- m4_pattern_allow([^LIB@&t@OBJS$]) -m4trace:configure.ac:149: -1- m4_pattern_allow([^LTLIBOBJS$]) -m4trace:configure.ac:149: -1- AM_CONDITIONAL([am__EXEEXT], [test -n "$EXEEXT"]) -m4trace:configure.ac:149: -1- m4_pattern_allow([^am__EXEEXT_TRUE$]) -m4trace:configure.ac:149: -1- m4_pattern_allow([^am__EXEEXT_FALSE$]) -m4trace:configure.ac:149: -1- _AM_SUBST_NOTMAKE([am__EXEEXT_TRUE]) -m4trace:configure.ac:149: -1- _AM_SUBST_NOTMAKE([am__EXEEXT_FALSE]) -m4trace:configure.ac:149: -1- _AC_AM_CONFIG_HEADER_HOOK(["$ac_file"]) -m4trace:configure.ac:149: -1- _AM_OUTPUT_DEPENDENCY_COMMANDS -m4trace:configure.ac:149: -1- _LT_PROG_LTMAIN diff --git a/pkg/registry/zookeeper-3.4.6/src/c/c-doc.Doxyfile b/pkg/registry/zookeeper-3.4.6/src/c/c-doc.Doxyfile deleted file mode 100644 index e9029cb17..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/c/c-doc.Doxyfile +++ /dev/null @@ -1,1252 +0,0 @@ -# Doxyfile 1.4.7 - -# 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 (" ") - -#--------------------------------------------------------------------------- -# Project related 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 = $(PROJECT)-$(VERSION) - -# 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 = $(DOCDIR) - -# If the CREATE_SUBDIRS tag is set to YES, then doxygen will create -# 4096 sub-directories (in 2 levels) under the output directory of each output -# format and will distribute the generated files over these directories. -# Enabling this option can be useful when feeding doxygen a huge amount of -# source files, where putting all generated files in the same directory would -# otherwise cause performance problems for the file system. - -CREATE_SUBDIRS = NO - -# 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, Korean-en, Norwegian, -# Polish, Portuguese, Romanian, Russian, Serbian, Slovak, Slovene, Spanish, -# Swedish, and Ukrainian. - -OUTPUT_LANGUAGE = English - -# This tag can be used to specify the encoding used in the generated output. -# The encoding is not always determined by the language that is chosen, -# but also whether or not the output is meant for Windows or non-Windows users. -# In case there is a difference, setting the USE_WINDOWS_ENCODING tag to YES -# forces the Windows encoding (this is the default for the Windows binary), -# whereas setting the tag to NO uses a Unix-style encoding (the default for -# all platforms other than Windows). - -USE_WINDOWS_ENCODING = 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 - -# This tag implements a quasi-intelligent brief description abbreviator -# that is used to form the text in various listings. Each string -# in this list, if found as the leading text of the brief description, will be -# stripped from the text and the result after processing the whole list, is -# used as the annotated text. Otherwise, the brief description is used as-is. -# If left blank, the following values are used ("$name" is automatically -# replaced with the name of the entity): "The $name class" "The $name widget" -# "The $name file" "is" "provides" "specifies" "contains" -# "represents" "a" "an" "the" - -ABBREVIATE_BRIEF = - -# 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 = YES - -# 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. The tag can be used to show relative paths in the file list. -# If left blank the directory from which doxygen is run is used as the -# path to strip. - -STRIP_FROM_PATH = - -# The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of -# the path mentioned in the documentation of a class, which tells -# the reader which header file to include in order to use a class. -# If left blank only the name of the header file containing the class -# definition is used. Otherwise one should specify the include paths that -# are normally passed to the compiler using the -I flag. - -STRIP_FROM_INC_PATH = - -# 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 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 -# explicit @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 -# re-implements. - -INHERIT_DOCS = YES - -# If the SEPARATE_MEMBER_PAGES tag is set to YES, then doxygen will produce -# a new page for each member. If set to NO, the documentation of a member will -# be part of the file/class/namespace that contains it. - -SEPARATE_MEMBER_PAGES = 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 - -# 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 = - -# 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 - -# If you use STL classes (i.e. std::string, std::vector, etc.) but do not want to -# include (a tag file for) the STL sources as input, then you should -# set this tag to YES in order to let doxygen match functions declarations and -# definitions whose arguments contain STL classes (e.g. func(std::string); v.s. -# func(std::string) {}). This also make the inheritance and collaboration -# diagrams that involve STL classes more complete and accurate. - -BUILTIN_STL_SUPPORT = NO - -# 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 - -# Set the SUBGROUPING tag to YES (the default) to allow class member groups of -# the same type (for instance a group of public functions) to be put as a -# subgroup of that type (e.g. under the Public Functions section). Set it to -# NO to prevent subgrouping. Alternatively, this can be done per class using -# the \nosubgrouping command. - -SUBGROUPING = YES - -#--------------------------------------------------------------------------- -# Build related configuration options -#--------------------------------------------------------------------------- - -# 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 = NO - -# 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 = YES - -# 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 = YES - -# This flag is only useful for Objective-C code. When set to YES local -# methods, which are defined in the implementation section but not in -# the interface are included in the documentation. -# If set to NO (the default) only methods in the interface are included. - -EXTRACT_LOCAL_METHODS = 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 classes 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 HIDE_IN_BODY_DOCS tag is set to YES, Doxygen will hide any -# documentation blocks found inside the body of a function. -# If set to NO (the default) these blocks will be appended to the -# function's detailed documentation block. - -HIDE_IN_BODY_DOCS = NO - -# 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 - -# 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 -# and Mac users are advised to set this option to NO. - -CASE_SENSE_NAMES = YES - -# 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 SHOW_INCLUDE_FILES tag is set to YES (the default) then Doxygen -# will put a list of the files that are included by a file in the documentation -# of that file. - -SHOW_INCLUDE_FILES = NO - -# 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 the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the -# brief documentation of file, namespace and class members alphabetically -# by member name. If set to NO (the default) the members will appear in -# declaration order. - -SORT_BRIEF_DOCS = NO - -# If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be -# sorted by fully-qualified names, including namespaces. If set to -# NO (the default), the class list will be sorted only by class name, -# not including the namespace part. -# Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES. -# Note: This option applies only to the class list, not to the -# alphabetical list. - -SORT_BY_SCOPE_NAME = NO - -# 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 - -# 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 consists 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 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 = YES - -# If the sources in your project are distributed over multiple directories -# then setting the SHOW_DIRECTORIES tag to YES will show the directory hierarchy -# in the documentation. The default is NO. - -SHOW_DIRECTORIES = NO - -# The FILE_VERSION_FILTER tag can be used to specify a program or script that -# doxygen should invoke to get the current version for each file (typically from the -# version control system). Doxygen will invoke the program by executing (via -# popen()) the command , where is the value of -# the FILE_VERSION_FILTER tag, and is the name of an input file -# provided by doxygen. Whatever the program writes to standard output -# is used as the file version. See the manual for examples. - -FILE_VERSION_FILTER = - -#--------------------------------------------------------------------------- -# 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 - -# If WARN_IF_DOC_ERROR is set to YES, doxygen will generate warnings for -# potential errors in the documentation, such as not documenting some -# parameters in a documented function, or documenting parameters that -# don't exist or using markup commands wrongly. - -WARN_IF_DOC_ERROR = YES - -# This WARN_NO_PARAMDOC option can be abled to get warnings for -# functions that are documented, but have no documentation for their parameters -# or return value. If set to NO (the default) doxygen will only warn about -# wrong or incomplete parameter documentation, but not about the absence of -# documentation. - -WARN_NO_PARAMDOC = NO - -# 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. Optionally the format may contain -# $version, which will be replaced by the version of the file (if it could -# be obtained via FILE_VERSION_FILTER) - -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 = include/zookeeper.h - -# 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 *.cs *.php *.php3 *.inc *.m *.mm *.py - -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. Note that the wildcards are matched -# against the file with absolute path, so to exclude all test directories -# for example use the pattern */test/* - -EXCLUDE_PATTERNS = - -# The EXAMPLE_PATH tag can be used to specify one or more files or -# directories that contain example code fragments that are included (see -# the \include command). - -EXAMPLE_PATH = - -# If the value of the EXAMPLE_PATH tag contains directories, you can use the -# EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp -# and *.h) to filter out the source-files in the directories. If left -# blank all files are included. - -EXAMPLE_PATTERNS = - -# If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be -# searched for input files to be used with the \include or \dontinclude -# commands irrespective of the value of the RECURSIVE tag. -# Possible values are YES and NO. If left blank NO is used. - -EXAMPLE_RECURSIVE = NO - -# The IMAGE_PATH tag can be used to specify one or more files or -# directories that contain image that are included in the documentation (see -# the \image command). - -IMAGE_PATH = - -# The INPUT_FILTER tag can be used to specify a program that doxygen should -# invoke to filter for each input file. Doxygen will invoke the filter program -# by executing (via popen()) the command , where -# is the value of the INPUT_FILTER tag, and is the name of an -# input file. Doxygen will then use the output that the filter program writes -# to standard output. If FILTER_PATTERNS is specified, this tag will be -# ignored. - -INPUT_FILTER = - -# The FILTER_PATTERNS tag can be used to specify filters on a per file pattern -# basis. Doxygen will compare the file name with each pattern and apply the -# filter if there is a match. The filters are a list of the form: -# pattern=filter (like *.cpp=my_cpp_filter). See INPUT_FILTER for further -# info on how filters are used. If FILTER_PATTERNS is empty, INPUT_FILTER -# is applied to all files. - -FILTER_PATTERNS = - -# 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. -# Note: To get rid of all source code in the generated output, make sure also -# VERBATIM_HEADERS is set to NO. - -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 - -# 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 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 = YES - -# 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 = YES - -# If the REFERENCES_LINK_SOURCE tag is set to YES (the default) -# and SOURCE_BROWSER tag is set to YES, then the hyperlinks from -# functions in REFERENCES_RELATION and REFERENCED_BY_RELATION lists will -# link to the source code. Otherwise they will link to the documentstion. - -REFERENCES_LINK_SOURCE = YES - -# If the USE_HTAGS tag is set to YES then the references to source code -# will point to the HTML generated by the htags(1) tool instead of doxygen -# built-in source browser. The htags tool is part of GNU's global source -# tagging system (see http://www.gnu.org/software/global/global.html). You -# will need version 4.8.6 or higher. - -USE_HTAGS = 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 - -#--------------------------------------------------------------------------- -# 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 = NO - -# 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 = $(GENERATE_HTML) - -# 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 = html - -# 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. Note that doxygen will try to copy -# the style sheet file to the HTML output directory, so don't put your own -# stylesheet in the HTML output directory as well, or it will be erased! - -HTML_STYLESHEET = - -# 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 = $(GENERATE_HTMLHELP) - -# 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 directory. - -CHM_FILE = ../$(PROJECT).chm - -# 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 = $(HHC_PATH) - -# 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 = $(GENERATE_CHI) - -# 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 = NO - -# 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, DHTML, CSS and frames is required (for instance Mozilla 1.0+, -# Netscape 6.0+, Internet explorer 5.0+, or Konqueror). 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 = $(GENERATE_LATEX) - -# 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 = $(PAPER_SIZE) - -# 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 = $(GENERATE_PDF) - -# 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 - -# If LATEX_HIDE_INDICES is set to YES then doxygen will not -# include the index chapters (such as File Index, Compound Index, etc.) -# in the output. - -LATEX_HIDE_INDICES = 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 optimized for Word 97 and may not look very pretty with -# other RTF readers or editors. - -GENERATE_RTF = $(GENERATE_RTF) - -# 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 assignments. 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 = $(GENERATE_MAN) - -# 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. - -GENERATE_XML = $(GENERATE_XML) - -# The XML_OUTPUT tag is used to specify where the XML 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 `xml' will be used as the default path. - -XML_OUTPUT = xml - -# 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 = - -# If the XML_PROGRAMLISTING tag is set to YES Doxygen will -# dump the program listings (including syntax highlighting -# and cross-referencing information) to the XML output. Note that -# enabling this will significantly increase the size of the XML output. - -XML_PROGRAMLISTING = YES - -#--------------------------------------------------------------------------- -# 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 Perl module output -#--------------------------------------------------------------------------- - -# If the GENERATE_PERLMOD tag is set to YES Doxygen will -# generate a Perl module file that captures the structure of -# the code including all documentation. Note that this -# feature is still experimental and incomplete at the -# moment. - -GENERATE_PERLMOD = NO - -# If the PERLMOD_LATEX tag is set to YES Doxygen will generate -# the necessary Makefile rules, Perl scripts and LaTeX code to be able -# to generate PDF and DVI output from the Perl module output. - -PERLMOD_LATEX = NO - -# If the PERLMOD_PRETTY tag is set to YES the Perl module output will be -# nicely formatted so it can be parsed by a human reader. This is useful -# if you want to understand what is going on. On the other hand, if this -# tag is set to NO the size of the Perl module output will be much smaller -# and Perl will parse it just the same. - -PERLMOD_PRETTY = YES - -# The names of the make variables in the generated doxyrules.make file -# are prefixed with the string contained in PERLMOD_MAKEVAR_PREFIX. -# This is useful so different doxyrules.make files included by the same -# Makefile don't overwrite each other's variables. - -PERLMOD_MAKEVAR_PREFIX = - -#--------------------------------------------------------------------------- -# 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 = YES - -# 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_DEFINED 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. To prevent a macro definition from being -# undefined via #undef or recursively expanded use the := operator -# instead of the = operator. - -PREDEFINED = - -# If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF 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::additions related to external references -#--------------------------------------------------------------------------- - -# The TAGFILES option can be used to specify one or more tagfiles. -# Optionally an initial location of the external documentation -# can be added for each tagfile. The format of a tag file without -# this location is as follows: -# TAGFILES = file1 file2 ... -# Adding location for the tag files is done as follows: -# TAGFILES = file1=loc1 "file2 = loc2" ... -# where "loc1" and "loc2" can be relative or absolute paths or -# URLs. If a location is present for each tag, the installdox tool -# does not have to be run to correct the links. -# Note that each tag file must have a unique name -# (where the name does NOT include the path) -# If a tag file is not located in the directory in which doxygen -# is run, you must also specify the path to the tagfile here. - -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 = $(DOCDIR)/$(PROJECT).tag - -# 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 superseded by the HAVE_DOT option below. This is only a -# fallback. It is recommended to install and use dot, since it yields 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 = $(HAVE_DOT) - -# 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 the GROUP_GRAPHS and HAVE_DOT tags are set to YES then doxygen -# will generate a graph for groups, showing the direct groups dependencies - -GROUP_GRAPHS = YES - -# If the UML_LOOK tag is set to YES doxygen will generate inheritance and -# collaboration diagrams in a style similar to the OMG's Unified Modeling -# Language. - -UML_LOOK = NO - -# If set to YES, the inheritance and collaboration graphs will show the -# relations between templates and their instances. - -TEMPLATE_RELATIONS = NO - -# 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 CALL_GRAPH and HAVE_DOT tags are set to YES then doxygen will -# generate a call dependency graph for every global function or class method. -# Note that enabling this option will significantly increase the time of a run. -# So in most cases it will be better to enable call graphs for selected -# functions only using the \callgraph command. - -CALL_GRAPH = NO - -# If the CALLER_GRAPH and HAVE_DOT tags are set to YES then doxygen will -# generate a caller dependency graph for every global function or class method. -# Note that enabling this option will significantly increase the time of a run. -# So in most cases it will be better to enable caller graphs for selected -# functions only using the \callergraph command. - -CALLER_GRAPH = NO - -# 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 - -# If the DIRECTORY_GRAPH, SHOW_DIRECTORIES and HAVE_DOT tags are set to YES -# then doxygen will show the dependencies a directory has on other directories -# in a graphical way. The dependency relations are determined by the #include -# relations between the files in the directories. - -DIRECTORY_GRAPH = 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 in the path. - -DOT_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 - -# The MAX_DOT_GRAPH_DEPTH tag can be used to set the maximum depth of the -# graphs generated by dot. A depth value of 3 means that only nodes reachable -# from the root by following a path via at most 3 edges will be shown. Nodes -# that lay further from the root node will be omitted. Note that setting this -# option to 1 or 2 may greatly reduce the computation time needed for large -# code bases. Also note that a graph may be further truncated if the graph's -# image dimensions are not sufficient to fit the graph (see MAX_DOT_GRAPH_WIDTH -# and MAX_DOT_GRAPH_HEIGHT). If 0 is used for the depth value (the default), -# the graph is not depth-constrained. - -MAX_DOT_GRAPH_DEPTH = 0 - -# Set the DOT_TRANSPARENT tag to YES to generate images with a transparent -# background. This is disabled by default, which results in a white background. -# Warning: Depending on the platform used, enabling this option may lead to -# badly anti-aliased labels on the edges of a graph (i.e. they become hard to -# read). - -DOT_TRANSPARENT = NO - -# Set the DOT_MULTI_TARGETS tag to YES allow dot to generate multiple output -# files in one run (i.e. multiple -o and -T options on the command line). This -# makes dot run faster, but since only newer versions of dot (>1.8.10) -# support this, this feature is disabled by default. - -DOT_MULTI_TARGETS = NO - -# 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 intermediate dot files that are used to generate -# the various graphs. - -DOT_CLEANUP = YES - -#--------------------------------------------------------------------------- -# Configuration::additions 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 diff --git a/pkg/registry/zookeeper-3.4.6/src/c/compile b/pkg/registry/zookeeper-3.4.6/src/c/compile deleted file mode 100755 index 862a14e8c..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/c/compile +++ /dev/null @@ -1,343 +0,0 @@ -#! /bin/sh -# Wrapper for compilers which do not understand '-c -o'. - -scriptversion=2012-03-05.13; # UTC - -# Copyright (C) 1999, 2000, 2003, 2004, 2005, 2009, 2010, 2012 Free -# Software Foundation, Inc. -# Written by Tom Tromey . -# -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2, or (at your option) -# any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see . - -# As a special exception to the GNU General Public License, if you -# distribute this file as part of a program that contains a -# configuration script generated by Autoconf, you may include it under -# the same distribution terms that you use for the rest of that program. - -# This file is maintained in Automake, please report -# bugs to or send patches to -# . - -nl=' -' - -# We need space, tab and new line, in precisely that order. Quoting is -# there to prevent tools from complaining about whitespace usage. -IFS=" "" $nl" - -file_conv= - -# func_file_conv build_file lazy -# Convert a $build file to $host form and store it in $file -# Currently only supports Windows hosts. If the determined conversion -# type is listed in (the comma separated) LAZY, no conversion will -# take place. -func_file_conv () -{ - file=$1 - case $file in - / | /[!/]*) # absolute file, and not a UNC file - if test -z "$file_conv"; then - # lazily determine how to convert abs files - case `uname -s` in - MINGW*) - file_conv=mingw - ;; - CYGWIN*) - file_conv=cygwin - ;; - *) - file_conv=wine - ;; - esac - fi - case $file_conv/,$2, in - *,$file_conv,*) - ;; - mingw/*) - file=`cmd //C echo "$file " | sed -e 's/"\(.*\) " *$/\1/'` - ;; - cygwin/*) - file=`cygpath -m "$file" || echo "$file"` - ;; - wine/*) - file=`winepath -w "$file" || echo "$file"` - ;; - esac - ;; - esac -} - -# func_cl_dashL linkdir -# Make cl look for libraries in LINKDIR -func_cl_dashL () -{ - func_file_conv "$1" - if test -z "$lib_path"; then - lib_path=$file - else - lib_path="$lib_path;$file" - fi - linker_opts="$linker_opts -LIBPATH:$file" -} - -# func_cl_dashl library -# Do a library search-path lookup for cl -func_cl_dashl () -{ - lib=$1 - found=no - save_IFS=$IFS - IFS=';' - for dir in $lib_path $LIB - do - IFS=$save_IFS - if $shared && test -f "$dir/$lib.dll.lib"; then - found=yes - lib=$dir/$lib.dll.lib - break - fi - if test -f "$dir/$lib.lib"; then - found=yes - lib=$dir/$lib.lib - break - fi - done - IFS=$save_IFS - - if test "$found" != yes; then - lib=$lib.lib - fi -} - -# func_cl_wrapper cl arg... -# Adjust compile command to suit cl -func_cl_wrapper () -{ - # Assume a capable shell - lib_path= - shared=: - linker_opts= - for arg - do - if test -n "$eat"; then - eat= - else - case $1 in - -o) - # configure might choose to run compile as 'compile cc -o foo foo.c'. - eat=1 - case $2 in - *.o | *.[oO][bB][jJ]) - func_file_conv "$2" - set x "$@" -Fo"$file" - shift - ;; - *) - func_file_conv "$2" - set x "$@" -Fe"$file" - shift - ;; - esac - ;; - -I) - eat=1 - func_file_conv "$2" mingw - set x "$@" -I"$file" - shift - ;; - -I*) - func_file_conv "${1#-I}" mingw - set x "$@" -I"$file" - shift - ;; - -l) - eat=1 - func_cl_dashl "$2" - set x "$@" "$lib" - shift - ;; - -l*) - func_cl_dashl "${1#-l}" - set x "$@" "$lib" - shift - ;; - -L) - eat=1 - func_cl_dashL "$2" - ;; - -L*) - func_cl_dashL "${1#-L}" - ;; - -static) - shared=false - ;; - -Wl,*) - arg=${1#-Wl,} - save_ifs="$IFS"; IFS=',' - for flag in $arg; do - IFS="$save_ifs" - linker_opts="$linker_opts $flag" - done - IFS="$save_ifs" - ;; - -Xlinker) - eat=1 - linker_opts="$linker_opts $2" - ;; - -*) - set x "$@" "$1" - shift - ;; - *.cc | *.CC | *.cxx | *.CXX | *.[cC]++) - func_file_conv "$1" - set x "$@" -Tp"$file" - shift - ;; - *.c | *.cpp | *.CPP | *.lib | *.LIB | *.Lib | *.OBJ | *.obj | *.[oO]) - func_file_conv "$1" mingw - set x "$@" "$file" - shift - ;; - *) - set x "$@" "$1" - shift - ;; - esac - fi - shift - done - if test -n "$linker_opts"; then - linker_opts="-link$linker_opts" - fi - exec "$@" $linker_opts - exit 1 -} - -eat= - -case $1 in - '') - echo "$0: No command. Try '$0 --help' for more information." 1>&2 - exit 1; - ;; - -h | --h*) - cat <<\EOF -Usage: compile [--help] [--version] PROGRAM [ARGS] - -Wrapper for compilers which do not understand '-c -o'. -Remove '-o dest.o' from ARGS, run PROGRAM with the remaining -arguments, and rename the output as expected. - -If you are trying to build a whole package this is not the -right script to run: please start by reading the file 'INSTALL'. - -Report bugs to . -EOF - exit $? - ;; - -v | --v*) - echo "compile $scriptversion" - exit $? - ;; - cl | *[/\\]cl | cl.exe | *[/\\]cl.exe ) - func_cl_wrapper "$@" # Doesn't return... - ;; -esac - -ofile= -cfile= - -for arg -do - if test -n "$eat"; then - eat= - else - case $1 in - -o) - # configure might choose to run compile as 'compile cc -o foo foo.c'. - # So we strip '-o arg' only if arg is an object. - eat=1 - case $2 in - *.o | *.obj) - ofile=$2 - ;; - *) - set x "$@" -o "$2" - shift - ;; - esac - ;; - *.c) - cfile=$1 - set x "$@" "$1" - shift - ;; - *) - set x "$@" "$1" - shift - ;; - esac - fi - shift -done - -if test -z "$ofile" || test -z "$cfile"; then - # If no '-o' option was seen then we might have been invoked from a - # pattern rule where we don't need one. That is ok -- this is a - # normal compilation that the losing compiler can handle. If no - # '.c' file was seen then we are probably linking. That is also - # ok. - exec "$@" -fi - -# Name of file we expect compiler to create. -cofile=`echo "$cfile" | sed 's|^.*[\\/]||; s|^[a-zA-Z]:||; s/\.c$/.o/'` - -# Create the lock directory. -# Note: use '[/\\:.-]' here to ensure that we don't use the same name -# that we are using for the .o file. Also, base the name on the expected -# object file name, since that is what matters with a parallel build. -lockdir=`echo "$cofile" | sed -e 's|[/\\:.-]|_|g'`.d -while true; do - if mkdir "$lockdir" >/dev/null 2>&1; then - break - fi - sleep 1 -done -# FIXME: race condition here if user kills between mkdir and trap. -trap "rmdir '$lockdir'; exit 1" 1 2 15 - -# Run the compile. -"$@" -ret=$? - -if test -f "$cofile"; then - test "$cofile" = "$ofile" || mv "$cofile" "$ofile" -elif test -f "${cofile}bj"; then - test "${cofile}bj" = "$ofile" || mv "${cofile}bj" "$ofile" -fi - -rmdir "$lockdir" -exit $ret - -# Local Variables: -# mode: shell-script -# sh-indentation: 2 -# eval: (add-hook 'write-file-hooks 'time-stamp) -# time-stamp-start: "scriptversion=" -# time-stamp-format: "%:y-%02m-%02d.%02H" -# time-stamp-time-zone: "UTC" -# time-stamp-end: "; # UTC" -# End: diff --git a/pkg/registry/zookeeper-3.4.6/src/c/config.guess b/pkg/registry/zookeeper-3.4.6/src/c/config.guess deleted file mode 100755 index d622a44e5..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/c/config.guess +++ /dev/null @@ -1,1530 +0,0 @@ -#! /bin/sh -# Attempt to guess a canonical system name. -# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, -# 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, -# 2011, 2012 Free Software Foundation, Inc. - -timestamp='2012-02-10' - -# This file is free software; you can redistribute it and/or modify it -# under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, but -# WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, see . -# -# As a special exception to the GNU General Public License, if you -# distribute this file as part of a program that contains a -# configuration script generated by Autoconf, you may include it under -# the same distribution terms that you use for the rest of that program. - - -# Originally written by Per Bothner. Please send patches (context -# diff format) to and include a ChangeLog -# entry. -# -# This script attempts to guess a canonical system name similar to -# config.sub. If it succeeds, it prints the system name on stdout, and -# exits with 0. Otherwise, it exits with 1. -# -# You can get the latest version of this script from: -# http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess;hb=HEAD - -me=`echo "$0" | sed -e 's,.*/,,'` - -usage="\ -Usage: $0 [OPTION] - -Output the configuration name of the system \`$me' is run on. - -Operation modes: - -h, --help print this help, then exit - -t, --time-stamp print date of last modification, then exit - -v, --version print version number, then exit - -Report bugs and patches to ." - -version="\ -GNU config.guess ($timestamp) - -Originally written by Per Bothner. -Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, -2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012 -Free Software Foundation, Inc. - -This is free software; see the source for copying conditions. There is NO -warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." - -help=" -Try \`$me --help' for more information." - -# Parse command line -while test $# -gt 0 ; do - case $1 in - --time-stamp | --time* | -t ) - echo "$timestamp" ; exit ;; - --version | -v ) - echo "$version" ; exit ;; - --help | --h* | -h ) - echo "$usage"; exit ;; - -- ) # Stop option processing - shift; break ;; - - ) # Use stdin as input. - break ;; - -* ) - echo "$me: invalid option $1$help" >&2 - exit 1 ;; - * ) - break ;; - esac -done - -if test $# != 0; then - echo "$me: too many arguments$help" >&2 - exit 1 -fi - -trap 'exit 1' 1 2 15 - -# CC_FOR_BUILD -- compiler used by this script. Note that the use of a -# compiler to aid in system detection is discouraged as it requires -# temporary files to be created and, as you can see below, it is a -# headache to deal with in a portable fashion. - -# Historically, `CC_FOR_BUILD' used to be named `HOST_CC'. We still -# use `HOST_CC' if defined, but it is deprecated. - -# Portable tmp directory creation inspired by the Autoconf team. - -set_cc_for_build=' -trap "exitcode=\$?; (rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null) && exit \$exitcode" 0 ; -trap "rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null; exit 1" 1 2 13 15 ; -: ${TMPDIR=/tmp} ; - { tmp=`(umask 077 && mktemp -d "$TMPDIR/cgXXXXXX") 2>/dev/null` && test -n "$tmp" && test -d "$tmp" ; } || - { test -n "$RANDOM" && tmp=$TMPDIR/cg$$-$RANDOM && (umask 077 && mkdir $tmp) ; } || - { tmp=$TMPDIR/cg-$$ && (umask 077 && mkdir $tmp) && echo "Warning: creating insecure temp directory" >&2 ; } || - { echo "$me: cannot create a temporary directory in $TMPDIR" >&2 ; exit 1 ; } ; -dummy=$tmp/dummy ; -tmpfiles="$dummy.c $dummy.o $dummy.rel $dummy" ; -case $CC_FOR_BUILD,$HOST_CC,$CC in - ,,) echo "int x;" > $dummy.c ; - for c in cc gcc c89 c99 ; do - if ($c -c -o $dummy.o $dummy.c) >/dev/null 2>&1 ; then - CC_FOR_BUILD="$c"; break ; - fi ; - done ; - if test x"$CC_FOR_BUILD" = x ; then - CC_FOR_BUILD=no_compiler_found ; - fi - ;; - ,,*) CC_FOR_BUILD=$CC ;; - ,*,*) CC_FOR_BUILD=$HOST_CC ;; -esac ; set_cc_for_build= ;' - -# This is needed to find uname on a Pyramid OSx when run in the BSD universe. -# (ghazi@noc.rutgers.edu 1994-08-24) -if (test -f /.attbin/uname) >/dev/null 2>&1 ; then - PATH=$PATH:/.attbin ; export PATH -fi - -UNAME_MACHINE=`(uname -m) 2>/dev/null` || UNAME_MACHINE=unknown -UNAME_RELEASE=`(uname -r) 2>/dev/null` || UNAME_RELEASE=unknown -UNAME_SYSTEM=`(uname -s) 2>/dev/null` || UNAME_SYSTEM=unknown -UNAME_VERSION=`(uname -v) 2>/dev/null` || UNAME_VERSION=unknown - -# Note: order is significant - the case branches are not exclusive. - -case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in - *:NetBSD:*:*) - # NetBSD (nbsd) targets should (where applicable) match one or - # more of the tuples: *-*-netbsdelf*, *-*-netbsdaout*, - # *-*-netbsdecoff* and *-*-netbsd*. For targets that recently - # switched to ELF, *-*-netbsd* would select the old - # object file format. This provides both forward - # compatibility and a consistent mechanism for selecting the - # object file format. - # - # Note: NetBSD doesn't particularly care about the vendor - # portion of the name. We always set it to "unknown". - sysctl="sysctl -n hw.machine_arch" - UNAME_MACHINE_ARCH=`(/sbin/$sysctl 2>/dev/null || \ - /usr/sbin/$sysctl 2>/dev/null || echo unknown)` - case "${UNAME_MACHINE_ARCH}" in - armeb) machine=armeb-unknown ;; - arm*) machine=arm-unknown ;; - sh3el) machine=shl-unknown ;; - sh3eb) machine=sh-unknown ;; - sh5el) machine=sh5le-unknown ;; - *) machine=${UNAME_MACHINE_ARCH}-unknown ;; - esac - # The Operating System including object format, if it has switched - # to ELF recently, or will in the future. - case "${UNAME_MACHINE_ARCH}" in - arm*|i386|m68k|ns32k|sh3*|sparc|vax) - eval $set_cc_for_build - if echo __ELF__ | $CC_FOR_BUILD -E - 2>/dev/null \ - | grep -q __ELF__ - then - # Once all utilities can be ECOFF (netbsdecoff) or a.out (netbsdaout). - # Return netbsd for either. FIX? - os=netbsd - else - os=netbsdelf - fi - ;; - *) - os=netbsd - ;; - esac - # The OS release - # Debian GNU/NetBSD machines have a different userland, and - # thus, need a distinct triplet. However, they do not need - # kernel version information, so it can be replaced with a - # suitable tag, in the style of linux-gnu. - case "${UNAME_VERSION}" in - Debian*) - release='-gnu' - ;; - *) - release=`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'` - ;; - esac - # Since CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM: - # contains redundant information, the shorter form: - # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM is used. - echo "${machine}-${os}${release}" - exit ;; - *:OpenBSD:*:*) - UNAME_MACHINE_ARCH=`arch | sed 's/OpenBSD.//'` - echo ${UNAME_MACHINE_ARCH}-unknown-openbsd${UNAME_RELEASE} - exit ;; - *:ekkoBSD:*:*) - echo ${UNAME_MACHINE}-unknown-ekkobsd${UNAME_RELEASE} - exit ;; - *:SolidBSD:*:*) - echo ${UNAME_MACHINE}-unknown-solidbsd${UNAME_RELEASE} - exit ;; - macppc:MirBSD:*:*) - echo powerpc-unknown-mirbsd${UNAME_RELEASE} - exit ;; - *:MirBSD:*:*) - echo ${UNAME_MACHINE}-unknown-mirbsd${UNAME_RELEASE} - exit ;; - alpha:OSF1:*:*) - case $UNAME_RELEASE in - *4.0) - UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $3}'` - ;; - *5.*) - UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $4}'` - ;; - esac - # According to Compaq, /usr/sbin/psrinfo has been available on - # OSF/1 and Tru64 systems produced since 1995. I hope that - # covers most systems running today. This code pipes the CPU - # types through head -n 1, so we only detect the type of CPU 0. - ALPHA_CPU_TYPE=`/usr/sbin/psrinfo -v | sed -n -e 's/^ The alpha \(.*\) processor.*$/\1/p' | head -n 1` - case "$ALPHA_CPU_TYPE" in - "EV4 (21064)") - UNAME_MACHINE="alpha" ;; - "EV4.5 (21064)") - UNAME_MACHINE="alpha" ;; - "LCA4 (21066/21068)") - UNAME_MACHINE="alpha" ;; - "EV5 (21164)") - UNAME_MACHINE="alphaev5" ;; - "EV5.6 (21164A)") - UNAME_MACHINE="alphaev56" ;; - "EV5.6 (21164PC)") - UNAME_MACHINE="alphapca56" ;; - "EV5.7 (21164PC)") - UNAME_MACHINE="alphapca57" ;; - "EV6 (21264)") - UNAME_MACHINE="alphaev6" ;; - "EV6.7 (21264A)") - UNAME_MACHINE="alphaev67" ;; - "EV6.8CB (21264C)") - UNAME_MACHINE="alphaev68" ;; - "EV6.8AL (21264B)") - UNAME_MACHINE="alphaev68" ;; - "EV6.8CX (21264D)") - UNAME_MACHINE="alphaev68" ;; - "EV6.9A (21264/EV69A)") - UNAME_MACHINE="alphaev69" ;; - "EV7 (21364)") - UNAME_MACHINE="alphaev7" ;; - "EV7.9 (21364A)") - UNAME_MACHINE="alphaev79" ;; - esac - # A Pn.n version is a patched version. - # A Vn.n version is a released version. - # A Tn.n version is a released field test version. - # A Xn.n version is an unreleased experimental baselevel. - # 1.2 uses "1.2" for uname -r. - echo ${UNAME_MACHINE}-dec-osf`echo ${UNAME_RELEASE} | sed -e 's/^[PVTX]//' | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` - # Reset EXIT trap before exiting to avoid spurious non-zero exit code. - exitcode=$? - trap '' 0 - exit $exitcode ;; - Alpha\ *:Windows_NT*:*) - # How do we know it's Interix rather than the generic POSIX subsystem? - # Should we change UNAME_MACHINE based on the output of uname instead - # of the specific Alpha model? - echo alpha-pc-interix - exit ;; - 21064:Windows_NT:50:3) - echo alpha-dec-winnt3.5 - exit ;; - Amiga*:UNIX_System_V:4.0:*) - echo m68k-unknown-sysv4 - exit ;; - *:[Aa]miga[Oo][Ss]:*:*) - echo ${UNAME_MACHINE}-unknown-amigaos - exit ;; - *:[Mm]orph[Oo][Ss]:*:*) - echo ${UNAME_MACHINE}-unknown-morphos - exit ;; - *:OS/390:*:*) - echo i370-ibm-openedition - exit ;; - *:z/VM:*:*) - echo s390-ibm-zvmoe - exit ;; - *:OS400:*:*) - echo powerpc-ibm-os400 - exit ;; - arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*) - echo arm-acorn-riscix${UNAME_RELEASE} - exit ;; - arm:riscos:*:*|arm:RISCOS:*:*) - echo arm-unknown-riscos - exit ;; - SR2?01:HI-UX/MPP:*:* | SR8000:HI-UX/MPP:*:*) - echo hppa1.1-hitachi-hiuxmpp - exit ;; - Pyramid*:OSx*:*:* | MIS*:OSx*:*:* | MIS*:SMP_DC-OSx*:*:*) - # akee@wpdis03.wpafb.af.mil (Earle F. Ake) contributed MIS and NILE. - if test "`(/bin/universe) 2>/dev/null`" = att ; then - echo pyramid-pyramid-sysv3 - else - echo pyramid-pyramid-bsd - fi - exit ;; - NILE*:*:*:dcosx) - echo pyramid-pyramid-svr4 - exit ;; - DRS?6000:unix:4.0:6*) - echo sparc-icl-nx6 - exit ;; - DRS?6000:UNIX_SV:4.2*:7* | DRS?6000:isis:4.2*:7*) - case `/usr/bin/uname -p` in - sparc) echo sparc-icl-nx7; exit ;; - esac ;; - s390x:SunOS:*:*) - echo ${UNAME_MACHINE}-ibm-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` - exit ;; - sun4H:SunOS:5.*:*) - echo sparc-hal-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` - exit ;; - sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*) - echo sparc-sun-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` - exit ;; - i86pc:AuroraUX:5.*:* | i86xen:AuroraUX:5.*:*) - echo i386-pc-auroraux${UNAME_RELEASE} - exit ;; - i86pc:SunOS:5.*:* | i86xen:SunOS:5.*:*) - eval $set_cc_for_build - SUN_ARCH="i386" - # If there is a compiler, see if it is configured for 64-bit objects. - # Note that the Sun cc does not turn __LP64__ into 1 like gcc does. - # This test works for both compilers. - if [ "$CC_FOR_BUILD" != 'no_compiler_found' ]; then - if (echo '#ifdef __amd64'; echo IS_64BIT_ARCH; echo '#endif') | \ - (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | \ - grep IS_64BIT_ARCH >/dev/null - then - SUN_ARCH="x86_64" - fi - fi - echo ${SUN_ARCH}-pc-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` - exit ;; - sun4*:SunOS:6*:*) - # According to config.sub, this is the proper way to canonicalize - # SunOS6. Hard to guess exactly what SunOS6 will be like, but - # it's likely to be more like Solaris than SunOS4. - echo sparc-sun-solaris3`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` - exit ;; - sun4*:SunOS:*:*) - case "`/usr/bin/arch -k`" in - Series*|S4*) - UNAME_RELEASE=`uname -v` - ;; - esac - # Japanese Language versions have a version number like `4.1.3-JL'. - echo sparc-sun-sunos`echo ${UNAME_RELEASE}|sed -e 's/-/_/'` - exit ;; - sun3*:SunOS:*:*) - echo m68k-sun-sunos${UNAME_RELEASE} - exit ;; - sun*:*:4.2BSD:*) - UNAME_RELEASE=`(sed 1q /etc/motd | awk '{print substr($5,1,3)}') 2>/dev/null` - test "x${UNAME_RELEASE}" = "x" && UNAME_RELEASE=3 - case "`/bin/arch`" in - sun3) - echo m68k-sun-sunos${UNAME_RELEASE} - ;; - sun4) - echo sparc-sun-sunos${UNAME_RELEASE} - ;; - esac - exit ;; - aushp:SunOS:*:*) - echo sparc-auspex-sunos${UNAME_RELEASE} - exit ;; - # The situation for MiNT is a little confusing. The machine name - # can be virtually everything (everything which is not - # "atarist" or "atariste" at least should have a processor - # > m68000). The system name ranges from "MiNT" over "FreeMiNT" - # to the lowercase version "mint" (or "freemint"). Finally - # the system name "TOS" denotes a system which is actually not - # MiNT. But MiNT is downward compatible to TOS, so this should - # be no problem. - atarist[e]:*MiNT:*:* | atarist[e]:*mint:*:* | atarist[e]:*TOS:*:*) - echo m68k-atari-mint${UNAME_RELEASE} - exit ;; - atari*:*MiNT:*:* | atari*:*mint:*:* | atarist[e]:*TOS:*:*) - echo m68k-atari-mint${UNAME_RELEASE} - exit ;; - *falcon*:*MiNT:*:* | *falcon*:*mint:*:* | *falcon*:*TOS:*:*) - echo m68k-atari-mint${UNAME_RELEASE} - exit ;; - milan*:*MiNT:*:* | milan*:*mint:*:* | *milan*:*TOS:*:*) - echo m68k-milan-mint${UNAME_RELEASE} - exit ;; - hades*:*MiNT:*:* | hades*:*mint:*:* | *hades*:*TOS:*:*) - echo m68k-hades-mint${UNAME_RELEASE} - exit ;; - *:*MiNT:*:* | *:*mint:*:* | *:*TOS:*:*) - echo m68k-unknown-mint${UNAME_RELEASE} - exit ;; - m68k:machten:*:*) - echo m68k-apple-machten${UNAME_RELEASE} - exit ;; - powerpc:machten:*:*) - echo powerpc-apple-machten${UNAME_RELEASE} - exit ;; - RISC*:Mach:*:*) - echo mips-dec-mach_bsd4.3 - exit ;; - RISC*:ULTRIX:*:*) - echo mips-dec-ultrix${UNAME_RELEASE} - exit ;; - VAX*:ULTRIX*:*:*) - echo vax-dec-ultrix${UNAME_RELEASE} - exit ;; - 2020:CLIX:*:* | 2430:CLIX:*:*) - echo clipper-intergraph-clix${UNAME_RELEASE} - exit ;; - mips:*:*:UMIPS | mips:*:*:RISCos) - eval $set_cc_for_build - sed 's/^ //' << EOF >$dummy.c -#ifdef __cplusplus -#include /* for printf() prototype */ - int main (int argc, char *argv[]) { -#else - int main (argc, argv) int argc; char *argv[]; { -#endif - #if defined (host_mips) && defined (MIPSEB) - #if defined (SYSTYPE_SYSV) - printf ("mips-mips-riscos%ssysv\n", argv[1]); exit (0); - #endif - #if defined (SYSTYPE_SVR4) - printf ("mips-mips-riscos%ssvr4\n", argv[1]); exit (0); - #endif - #if defined (SYSTYPE_BSD43) || defined(SYSTYPE_BSD) - printf ("mips-mips-riscos%sbsd\n", argv[1]); exit (0); - #endif - #endif - exit (-1); - } -EOF - $CC_FOR_BUILD -o $dummy $dummy.c && - dummyarg=`echo "${UNAME_RELEASE}" | sed -n 's/\([0-9]*\).*/\1/p'` && - SYSTEM_NAME=`$dummy $dummyarg` && - { echo "$SYSTEM_NAME"; exit; } - echo mips-mips-riscos${UNAME_RELEASE} - exit ;; - Motorola:PowerMAX_OS:*:*) - echo powerpc-motorola-powermax - exit ;; - Motorola:*:4.3:PL8-*) - echo powerpc-harris-powermax - exit ;; - Night_Hawk:*:*:PowerMAX_OS | Synergy:PowerMAX_OS:*:*) - echo powerpc-harris-powermax - exit ;; - Night_Hawk:Power_UNIX:*:*) - echo powerpc-harris-powerunix - exit ;; - m88k:CX/UX:7*:*) - echo m88k-harris-cxux7 - exit ;; - m88k:*:4*:R4*) - echo m88k-motorola-sysv4 - exit ;; - m88k:*:3*:R3*) - echo m88k-motorola-sysv3 - exit ;; - AViiON:dgux:*:*) - # DG/UX returns AViiON for all architectures - UNAME_PROCESSOR=`/usr/bin/uname -p` - if [ $UNAME_PROCESSOR = mc88100 ] || [ $UNAME_PROCESSOR = mc88110 ] - then - if [ ${TARGET_BINARY_INTERFACE}x = m88kdguxelfx ] || \ - [ ${TARGET_BINARY_INTERFACE}x = x ] - then - echo m88k-dg-dgux${UNAME_RELEASE} - else - echo m88k-dg-dguxbcs${UNAME_RELEASE} - fi - else - echo i586-dg-dgux${UNAME_RELEASE} - fi - exit ;; - M88*:DolphinOS:*:*) # DolphinOS (SVR3) - echo m88k-dolphin-sysv3 - exit ;; - M88*:*:R3*:*) - # Delta 88k system running SVR3 - echo m88k-motorola-sysv3 - exit ;; - XD88*:*:*:*) # Tektronix XD88 system running UTekV (SVR3) - echo m88k-tektronix-sysv3 - exit ;; - Tek43[0-9][0-9]:UTek:*:*) # Tektronix 4300 system running UTek (BSD) - echo m68k-tektronix-bsd - exit ;; - *:IRIX*:*:*) - echo mips-sgi-irix`echo ${UNAME_RELEASE}|sed -e 's/-/_/g'` - exit ;; - ????????:AIX?:[12].1:2) # AIX 2.2.1 or AIX 2.1.1 is RT/PC AIX. - echo romp-ibm-aix # uname -m gives an 8 hex-code CPU id - exit ;; # Note that: echo "'`uname -s`'" gives 'AIX ' - i*86:AIX:*:*) - echo i386-ibm-aix - exit ;; - ia64:AIX:*:*) - if [ -x /usr/bin/oslevel ] ; then - IBM_REV=`/usr/bin/oslevel` - else - IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE} - fi - echo ${UNAME_MACHINE}-ibm-aix${IBM_REV} - exit ;; - *:AIX:2:3) - if grep bos325 /usr/include/stdio.h >/dev/null 2>&1; then - eval $set_cc_for_build - sed 's/^ //' << EOF >$dummy.c - #include - - main() - { - if (!__power_pc()) - exit(1); - puts("powerpc-ibm-aix3.2.5"); - exit(0); - } -EOF - if $CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy` - then - echo "$SYSTEM_NAME" - else - echo rs6000-ibm-aix3.2.5 - fi - elif grep bos324 /usr/include/stdio.h >/dev/null 2>&1; then - echo rs6000-ibm-aix3.2.4 - else - echo rs6000-ibm-aix3.2 - fi - exit ;; - *:AIX:*:[4567]) - IBM_CPU_ID=`/usr/sbin/lsdev -C -c processor -S available | sed 1q | awk '{ print $1 }'` - if /usr/sbin/lsattr -El ${IBM_CPU_ID} | grep ' POWER' >/dev/null 2>&1; then - IBM_ARCH=rs6000 - else - IBM_ARCH=powerpc - fi - if [ -x /usr/bin/oslevel ] ; then - IBM_REV=`/usr/bin/oslevel` - else - IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE} - fi - echo ${IBM_ARCH}-ibm-aix${IBM_REV} - exit ;; - *:AIX:*:*) - echo rs6000-ibm-aix - exit ;; - ibmrt:4.4BSD:*|romp-ibm:BSD:*) - echo romp-ibm-bsd4.4 - exit ;; - ibmrt:*BSD:*|romp-ibm:BSD:*) # covers RT/PC BSD and - echo romp-ibm-bsd${UNAME_RELEASE} # 4.3 with uname added to - exit ;; # report: romp-ibm BSD 4.3 - *:BOSX:*:*) - echo rs6000-bull-bosx - exit ;; - DPX/2?00:B.O.S.:*:*) - echo m68k-bull-sysv3 - exit ;; - 9000/[34]??:4.3bsd:1.*:*) - echo m68k-hp-bsd - exit ;; - hp300:4.4BSD:*:* | 9000/[34]??:4.3bsd:2.*:*) - echo m68k-hp-bsd4.4 - exit ;; - 9000/[34678]??:HP-UX:*:*) - HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'` - case "${UNAME_MACHINE}" in - 9000/31? ) HP_ARCH=m68000 ;; - 9000/[34]?? ) HP_ARCH=m68k ;; - 9000/[678][0-9][0-9]) - if [ -x /usr/bin/getconf ]; then - sc_cpu_version=`/usr/bin/getconf SC_CPU_VERSION 2>/dev/null` - sc_kernel_bits=`/usr/bin/getconf SC_KERNEL_BITS 2>/dev/null` - case "${sc_cpu_version}" in - 523) HP_ARCH="hppa1.0" ;; # CPU_PA_RISC1_0 - 528) HP_ARCH="hppa1.1" ;; # CPU_PA_RISC1_1 - 532) # CPU_PA_RISC2_0 - case "${sc_kernel_bits}" in - 32) HP_ARCH="hppa2.0n" ;; - 64) HP_ARCH="hppa2.0w" ;; - '') HP_ARCH="hppa2.0" ;; # HP-UX 10.20 - esac ;; - esac - fi - if [ "${HP_ARCH}" = "" ]; then - eval $set_cc_for_build - sed 's/^ //' << EOF >$dummy.c - - #define _HPUX_SOURCE - #include - #include - - int main () - { - #if defined(_SC_KERNEL_BITS) - long bits = sysconf(_SC_KERNEL_BITS); - #endif - long cpu = sysconf (_SC_CPU_VERSION); - - switch (cpu) - { - case CPU_PA_RISC1_0: puts ("hppa1.0"); break; - case CPU_PA_RISC1_1: puts ("hppa1.1"); break; - case CPU_PA_RISC2_0: - #if defined(_SC_KERNEL_BITS) - switch (bits) - { - case 64: puts ("hppa2.0w"); break; - case 32: puts ("hppa2.0n"); break; - default: puts ("hppa2.0"); break; - } break; - #else /* !defined(_SC_KERNEL_BITS) */ - puts ("hppa2.0"); break; - #endif - default: puts ("hppa1.0"); break; - } - exit (0); - } -EOF - (CCOPTS= $CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null) && HP_ARCH=`$dummy` - test -z "$HP_ARCH" && HP_ARCH=hppa - fi ;; - esac - if [ ${HP_ARCH} = "hppa2.0w" ] - then - eval $set_cc_for_build - - # hppa2.0w-hp-hpux* has a 64-bit kernel and a compiler generating - # 32-bit code. hppa64-hp-hpux* has the same kernel and a compiler - # generating 64-bit code. GNU and HP use different nomenclature: - # - # $ CC_FOR_BUILD=cc ./config.guess - # => hppa2.0w-hp-hpux11.23 - # $ CC_FOR_BUILD="cc +DA2.0w" ./config.guess - # => hppa64-hp-hpux11.23 - - if echo __LP64__ | (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | - grep -q __LP64__ - then - HP_ARCH="hppa2.0w" - else - HP_ARCH="hppa64" - fi - fi - echo ${HP_ARCH}-hp-hpux${HPUX_REV} - exit ;; - ia64:HP-UX:*:*) - HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'` - echo ia64-hp-hpux${HPUX_REV} - exit ;; - 3050*:HI-UX:*:*) - eval $set_cc_for_build - sed 's/^ //' << EOF >$dummy.c - #include - int - main () - { - long cpu = sysconf (_SC_CPU_VERSION); - /* The order matters, because CPU_IS_HP_MC68K erroneously returns - true for CPU_PA_RISC1_0. CPU_IS_PA_RISC returns correct - results, however. */ - if (CPU_IS_PA_RISC (cpu)) - { - switch (cpu) - { - case CPU_PA_RISC1_0: puts ("hppa1.0-hitachi-hiuxwe2"); break; - case CPU_PA_RISC1_1: puts ("hppa1.1-hitachi-hiuxwe2"); break; - case CPU_PA_RISC2_0: puts ("hppa2.0-hitachi-hiuxwe2"); break; - default: puts ("hppa-hitachi-hiuxwe2"); break; - } - } - else if (CPU_IS_HP_MC68K (cpu)) - puts ("m68k-hitachi-hiuxwe2"); - else puts ("unknown-hitachi-hiuxwe2"); - exit (0); - } -EOF - $CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy` && - { echo "$SYSTEM_NAME"; exit; } - echo unknown-hitachi-hiuxwe2 - exit ;; - 9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:* ) - echo hppa1.1-hp-bsd - exit ;; - 9000/8??:4.3bsd:*:*) - echo hppa1.0-hp-bsd - exit ;; - *9??*:MPE/iX:*:* | *3000*:MPE/iX:*:*) - echo hppa1.0-hp-mpeix - exit ;; - hp7??:OSF1:*:* | hp8?[79]:OSF1:*:* ) - echo hppa1.1-hp-osf - exit ;; - hp8??:OSF1:*:*) - echo hppa1.0-hp-osf - exit ;; - i*86:OSF1:*:*) - if [ -x /usr/sbin/sysversion ] ; then - echo ${UNAME_MACHINE}-unknown-osf1mk - else - echo ${UNAME_MACHINE}-unknown-osf1 - fi - exit ;; - parisc*:Lites*:*:*) - echo hppa1.1-hp-lites - exit ;; - C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*) - echo c1-convex-bsd - exit ;; - C2*:ConvexOS:*:* | convex:ConvexOS:C2*:*) - if getsysinfo -f scalar_acc - then echo c32-convex-bsd - else echo c2-convex-bsd - fi - exit ;; - C34*:ConvexOS:*:* | convex:ConvexOS:C34*:*) - echo c34-convex-bsd - exit ;; - C38*:ConvexOS:*:* | convex:ConvexOS:C38*:*) - echo c38-convex-bsd - exit ;; - C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*) - echo c4-convex-bsd - exit ;; - CRAY*Y-MP:*:*:*) - echo ymp-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' - exit ;; - CRAY*[A-Z]90:*:*:*) - echo ${UNAME_MACHINE}-cray-unicos${UNAME_RELEASE} \ - | sed -e 's/CRAY.*\([A-Z]90\)/\1/' \ - -e y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/ \ - -e 's/\.[^.]*$/.X/' - exit ;; - CRAY*TS:*:*:*) - echo t90-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' - exit ;; - CRAY*T3E:*:*:*) - echo alphaev5-cray-unicosmk${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' - exit ;; - CRAY*SV1:*:*:*) - echo sv1-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' - exit ;; - *:UNICOS/mp:*:*) - echo craynv-cray-unicosmp${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' - exit ;; - F30[01]:UNIX_System_V:*:* | F700:UNIX_System_V:*:*) - FUJITSU_PROC=`uname -m | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` - FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'` - FUJITSU_REL=`echo ${UNAME_RELEASE} | sed -e 's/ /_/'` - echo "${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" - exit ;; - 5000:UNIX_System_V:4.*:*) - FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'` - FUJITSU_REL=`echo ${UNAME_RELEASE} | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/ /_/'` - echo "sparc-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" - exit ;; - i*86:BSD/386:*:* | i*86:BSD/OS:*:* | *:Ascend\ Embedded/OS:*:*) - echo ${UNAME_MACHINE}-pc-bsdi${UNAME_RELEASE} - exit ;; - sparc*:BSD/OS:*:*) - echo sparc-unknown-bsdi${UNAME_RELEASE} - exit ;; - *:BSD/OS:*:*) - echo ${UNAME_MACHINE}-unknown-bsdi${UNAME_RELEASE} - exit ;; - *:FreeBSD:*:*) - UNAME_PROCESSOR=`/usr/bin/uname -p` - case ${UNAME_PROCESSOR} in - amd64) - echo x86_64-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;; - *) - echo ${UNAME_PROCESSOR}-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;; - esac - exit ;; - i*:CYGWIN*:*) - echo ${UNAME_MACHINE}-pc-cygwin - exit ;; - *:MINGW*:*) - echo ${UNAME_MACHINE}-pc-mingw32 - exit ;; - i*:MSYS*:*) - echo ${UNAME_MACHINE}-pc-msys - exit ;; - i*:windows32*:*) - # uname -m includes "-pc" on this system. - echo ${UNAME_MACHINE}-mingw32 - exit ;; - i*:PW*:*) - echo ${UNAME_MACHINE}-pc-pw32 - exit ;; - *:Interix*:*) - case ${UNAME_MACHINE} in - x86) - echo i586-pc-interix${UNAME_RELEASE} - exit ;; - authenticamd | genuineintel | EM64T) - echo x86_64-unknown-interix${UNAME_RELEASE} - exit ;; - IA64) - echo ia64-unknown-interix${UNAME_RELEASE} - exit ;; - esac ;; - [345]86:Windows_95:* | [345]86:Windows_98:* | [345]86:Windows_NT:*) - echo i${UNAME_MACHINE}-pc-mks - exit ;; - 8664:Windows_NT:*) - echo x86_64-pc-mks - exit ;; - i*:Windows_NT*:* | Pentium*:Windows_NT*:*) - # How do we know it's Interix rather than the generic POSIX subsystem? - # It also conflicts with pre-2.0 versions of AT&T UWIN. Should we - # UNAME_MACHINE based on the output of uname instead of i386? - echo i586-pc-interix - exit ;; - i*:UWIN*:*) - echo ${UNAME_MACHINE}-pc-uwin - exit ;; - amd64:CYGWIN*:*:* | x86_64:CYGWIN*:*:*) - echo x86_64-unknown-cygwin - exit ;; - p*:CYGWIN*:*) - echo powerpcle-unknown-cygwin - exit ;; - prep*:SunOS:5.*:*) - echo powerpcle-unknown-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` - exit ;; - *:GNU:*:*) - # the GNU system - echo `echo ${UNAME_MACHINE}|sed -e 's,[-/].*$,,'`-unknown-gnu`echo ${UNAME_RELEASE}|sed -e 's,/.*$,,'` - exit ;; - *:GNU/*:*:*) - # other systems with GNU libc and userland - echo ${UNAME_MACHINE}-unknown-`echo ${UNAME_SYSTEM} | sed 's,^[^/]*/,,' | tr '[A-Z]' '[a-z]'``echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`-gnu - exit ;; - i*86:Minix:*:*) - echo ${UNAME_MACHINE}-pc-minix - exit ;; - aarch64:Linux:*:*) - echo ${UNAME_MACHINE}-unknown-linux-gnu - exit ;; - aarch64_be:Linux:*:*) - UNAME_MACHINE=aarch64_be - echo ${UNAME_MACHINE}-unknown-linux-gnu - exit ;; - alpha:Linux:*:*) - case `sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' < /proc/cpuinfo` in - EV5) UNAME_MACHINE=alphaev5 ;; - EV56) UNAME_MACHINE=alphaev56 ;; - PCA56) UNAME_MACHINE=alphapca56 ;; - PCA57) UNAME_MACHINE=alphapca56 ;; - EV6) UNAME_MACHINE=alphaev6 ;; - EV67) UNAME_MACHINE=alphaev67 ;; - EV68*) UNAME_MACHINE=alphaev68 ;; - esac - objdump --private-headers /bin/sh | grep -q ld.so.1 - if test "$?" = 0 ; then LIBC="libc1" ; else LIBC="" ; fi - echo ${UNAME_MACHINE}-unknown-linux-gnu${LIBC} - exit ;; - arm*:Linux:*:*) - eval $set_cc_for_build - if echo __ARM_EABI__ | $CC_FOR_BUILD -E - 2>/dev/null \ - | grep -q __ARM_EABI__ - then - echo ${UNAME_MACHINE}-unknown-linux-gnu - else - if echo __ARM_PCS_VFP | $CC_FOR_BUILD -E - 2>/dev/null \ - | grep -q __ARM_PCS_VFP - then - echo ${UNAME_MACHINE}-unknown-linux-gnueabi - else - echo ${UNAME_MACHINE}-unknown-linux-gnueabihf - fi - fi - exit ;; - avr32*:Linux:*:*) - echo ${UNAME_MACHINE}-unknown-linux-gnu - exit ;; - cris:Linux:*:*) - echo ${UNAME_MACHINE}-axis-linux-gnu - exit ;; - crisv32:Linux:*:*) - echo ${UNAME_MACHINE}-axis-linux-gnu - exit ;; - frv:Linux:*:*) - echo ${UNAME_MACHINE}-unknown-linux-gnu - exit ;; - hexagon:Linux:*:*) - echo ${UNAME_MACHINE}-unknown-linux-gnu - exit ;; - i*86:Linux:*:*) - LIBC=gnu - eval $set_cc_for_build - sed 's/^ //' << EOF >$dummy.c - #ifdef __dietlibc__ - LIBC=dietlibc - #endif -EOF - eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^LIBC'` - echo "${UNAME_MACHINE}-pc-linux-${LIBC}" - exit ;; - ia64:Linux:*:*) - echo ${UNAME_MACHINE}-unknown-linux-gnu - exit ;; - m32r*:Linux:*:*) - echo ${UNAME_MACHINE}-unknown-linux-gnu - exit ;; - m68*:Linux:*:*) - echo ${UNAME_MACHINE}-unknown-linux-gnu - exit ;; - mips:Linux:*:* | mips64:Linux:*:*) - eval $set_cc_for_build - sed 's/^ //' << EOF >$dummy.c - #undef CPU - #undef ${UNAME_MACHINE} - #undef ${UNAME_MACHINE}el - #if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL) - CPU=${UNAME_MACHINE}el - #else - #if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB) - CPU=${UNAME_MACHINE} - #else - CPU= - #endif - #endif -EOF - eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^CPU'` - test x"${CPU}" != x && { echo "${CPU}-unknown-linux-gnu"; exit; } - ;; - or32:Linux:*:*) - echo ${UNAME_MACHINE}-unknown-linux-gnu - exit ;; - padre:Linux:*:*) - echo sparc-unknown-linux-gnu - exit ;; - parisc64:Linux:*:* | hppa64:Linux:*:*) - echo hppa64-unknown-linux-gnu - exit ;; - parisc:Linux:*:* | hppa:Linux:*:*) - # Look for CPU level - case `grep '^cpu[^a-z]*:' /proc/cpuinfo 2>/dev/null | cut -d' ' -f2` in - PA7*) echo hppa1.1-unknown-linux-gnu ;; - PA8*) echo hppa2.0-unknown-linux-gnu ;; - *) echo hppa-unknown-linux-gnu ;; - esac - exit ;; - ppc64:Linux:*:*) - echo powerpc64-unknown-linux-gnu - exit ;; - ppc:Linux:*:*) - echo powerpc-unknown-linux-gnu - exit ;; - s390:Linux:*:* | s390x:Linux:*:*) - echo ${UNAME_MACHINE}-ibm-linux - exit ;; - sh64*:Linux:*:*) - echo ${UNAME_MACHINE}-unknown-linux-gnu - exit ;; - sh*:Linux:*:*) - echo ${UNAME_MACHINE}-unknown-linux-gnu - exit ;; - sparc:Linux:*:* | sparc64:Linux:*:*) - echo ${UNAME_MACHINE}-unknown-linux-gnu - exit ;; - tile*:Linux:*:*) - echo ${UNAME_MACHINE}-unknown-linux-gnu - exit ;; - vax:Linux:*:*) - echo ${UNAME_MACHINE}-dec-linux-gnu - exit ;; - x86_64:Linux:*:*) - echo ${UNAME_MACHINE}-unknown-linux-gnu - exit ;; - xtensa*:Linux:*:*) - echo ${UNAME_MACHINE}-unknown-linux-gnu - exit ;; - i*86:DYNIX/ptx:4*:*) - # ptx 4.0 does uname -s correctly, with DYNIX/ptx in there. - # earlier versions are messed up and put the nodename in both - # sysname and nodename. - echo i386-sequent-sysv4 - exit ;; - i*86:UNIX_SV:4.2MP:2.*) - # Unixware is an offshoot of SVR4, but it has its own version - # number series starting with 2... - # I am not positive that other SVR4 systems won't match this, - # I just have to hope. -- rms. - # Use sysv4.2uw... so that sysv4* matches it. - echo ${UNAME_MACHINE}-pc-sysv4.2uw${UNAME_VERSION} - exit ;; - i*86:OS/2:*:*) - # If we were able to find `uname', then EMX Unix compatibility - # is probably installed. - echo ${UNAME_MACHINE}-pc-os2-emx - exit ;; - i*86:XTS-300:*:STOP) - echo ${UNAME_MACHINE}-unknown-stop - exit ;; - i*86:atheos:*:*) - echo ${UNAME_MACHINE}-unknown-atheos - exit ;; - i*86:syllable:*:*) - echo ${UNAME_MACHINE}-pc-syllable - exit ;; - i*86:LynxOS:2.*:* | i*86:LynxOS:3.[01]*:* | i*86:LynxOS:4.[02]*:*) - echo i386-unknown-lynxos${UNAME_RELEASE} - exit ;; - i*86:*DOS:*:*) - echo ${UNAME_MACHINE}-pc-msdosdjgpp - exit ;; - i*86:*:4.*:* | i*86:SYSTEM_V:4.*:*) - UNAME_REL=`echo ${UNAME_RELEASE} | sed 's/\/MP$//'` - if grep Novell /usr/include/link.h >/dev/null 2>/dev/null; then - echo ${UNAME_MACHINE}-univel-sysv${UNAME_REL} - else - echo ${UNAME_MACHINE}-pc-sysv${UNAME_REL} - fi - exit ;; - i*86:*:5:[678]*) - # UnixWare 7.x, OpenUNIX and OpenServer 6. - case `/bin/uname -X | grep "^Machine"` in - *486*) UNAME_MACHINE=i486 ;; - *Pentium) UNAME_MACHINE=i586 ;; - *Pent*|*Celeron) UNAME_MACHINE=i686 ;; - esac - echo ${UNAME_MACHINE}-unknown-sysv${UNAME_RELEASE}${UNAME_SYSTEM}${UNAME_VERSION} - exit ;; - i*86:*:3.2:*) - if test -f /usr/options/cb.name; then - UNAME_REL=`sed -n 's/.*Version //p' /dev/null >/dev/null ; then - UNAME_REL=`(/bin/uname -X|grep Release|sed -e 's/.*= //')` - (/bin/uname -X|grep i80486 >/dev/null) && UNAME_MACHINE=i486 - (/bin/uname -X|grep '^Machine.*Pentium' >/dev/null) \ - && UNAME_MACHINE=i586 - (/bin/uname -X|grep '^Machine.*Pent *II' >/dev/null) \ - && UNAME_MACHINE=i686 - (/bin/uname -X|grep '^Machine.*Pentium Pro' >/dev/null) \ - && UNAME_MACHINE=i686 - echo ${UNAME_MACHINE}-pc-sco$UNAME_REL - else - echo ${UNAME_MACHINE}-pc-sysv32 - fi - exit ;; - pc:*:*:*) - # Left here for compatibility: - # uname -m prints for DJGPP always 'pc', but it prints nothing about - # the processor, so we play safe by assuming i586. - # Note: whatever this is, it MUST be the same as what config.sub - # prints for the "djgpp" host, or else GDB configury will decide that - # this is a cross-build. - echo i586-pc-msdosdjgpp - exit ;; - Intel:Mach:3*:*) - echo i386-pc-mach3 - exit ;; - paragon:*:*:*) - echo i860-intel-osf1 - exit ;; - i860:*:4.*:*) # i860-SVR4 - if grep Stardent /usr/include/sys/uadmin.h >/dev/null 2>&1 ; then - echo i860-stardent-sysv${UNAME_RELEASE} # Stardent Vistra i860-SVR4 - else # Add other i860-SVR4 vendors below as they are discovered. - echo i860-unknown-sysv${UNAME_RELEASE} # Unknown i860-SVR4 - fi - exit ;; - mini*:CTIX:SYS*5:*) - # "miniframe" - echo m68010-convergent-sysv - exit ;; - mc68k:UNIX:SYSTEM5:3.51m) - echo m68k-convergent-sysv - exit ;; - M680?0:D-NIX:5.3:*) - echo m68k-diab-dnix - exit ;; - M68*:*:R3V[5678]*:*) - test -r /sysV68 && { echo 'm68k-motorola-sysv'; exit; } ;; - 3[345]??:*:4.0:3.0 | 3[34]??A:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0 | 3[34]??/*:*:4.0:3.0 | 4400:*:4.0:3.0 | 4850:*:4.0:3.0 | SKA40:*:4.0:3.0 | SDS2:*:4.0:3.0 | SHG2:*:4.0:3.0 | S7501*:*:4.0:3.0) - OS_REL='' - test -r /etc/.relid \ - && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid` - /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ - && { echo i486-ncr-sysv4.3${OS_REL}; exit; } - /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \ - && { echo i586-ncr-sysv4.3${OS_REL}; exit; } ;; - 3[34]??:*:4.0:* | 3[34]??,*:*:4.0:*) - /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ - && { echo i486-ncr-sysv4; exit; } ;; - NCR*:*:4.2:* | MPRAS*:*:4.2:*) - OS_REL='.3' - test -r /etc/.relid \ - && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid` - /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ - && { echo i486-ncr-sysv4.3${OS_REL}; exit; } - /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \ - && { echo i586-ncr-sysv4.3${OS_REL}; exit; } - /bin/uname -p 2>/dev/null | /bin/grep pteron >/dev/null \ - && { echo i586-ncr-sysv4.3${OS_REL}; exit; } ;; - m68*:LynxOS:2.*:* | m68*:LynxOS:3.0*:*) - echo m68k-unknown-lynxos${UNAME_RELEASE} - exit ;; - mc68030:UNIX_System_V:4.*:*) - echo m68k-atari-sysv4 - exit ;; - TSUNAMI:LynxOS:2.*:*) - echo sparc-unknown-lynxos${UNAME_RELEASE} - exit ;; - rs6000:LynxOS:2.*:*) - echo rs6000-unknown-lynxos${UNAME_RELEASE} - exit ;; - PowerPC:LynxOS:2.*:* | PowerPC:LynxOS:3.[01]*:* | PowerPC:LynxOS:4.[02]*:*) - echo powerpc-unknown-lynxos${UNAME_RELEASE} - exit ;; - SM[BE]S:UNIX_SV:*:*) - echo mips-dde-sysv${UNAME_RELEASE} - exit ;; - RM*:ReliantUNIX-*:*:*) - echo mips-sni-sysv4 - exit ;; - RM*:SINIX-*:*:*) - echo mips-sni-sysv4 - exit ;; - *:SINIX-*:*:*) - if uname -p 2>/dev/null >/dev/null ; then - UNAME_MACHINE=`(uname -p) 2>/dev/null` - echo ${UNAME_MACHINE}-sni-sysv4 - else - echo ns32k-sni-sysv - fi - exit ;; - PENTIUM:*:4.0*:*) # Unisys `ClearPath HMP IX 4000' SVR4/MP effort - # says - echo i586-unisys-sysv4 - exit ;; - *:UNIX_System_V:4*:FTX*) - # From Gerald Hewes . - # How about differentiating between stratus architectures? -djm - echo hppa1.1-stratus-sysv4 - exit ;; - *:*:*:FTX*) - # From seanf@swdc.stratus.com. - echo i860-stratus-sysv4 - exit ;; - i*86:VOS:*:*) - # From Paul.Green@stratus.com. - echo ${UNAME_MACHINE}-stratus-vos - exit ;; - *:VOS:*:*) - # From Paul.Green@stratus.com. - echo hppa1.1-stratus-vos - exit ;; - mc68*:A/UX:*:*) - echo m68k-apple-aux${UNAME_RELEASE} - exit ;; - news*:NEWS-OS:6*:*) - echo mips-sony-newsos6 - exit ;; - R[34]000:*System_V*:*:* | R4000:UNIX_SYSV:*:* | R*000:UNIX_SV:*:*) - if [ -d /usr/nec ]; then - echo mips-nec-sysv${UNAME_RELEASE} - else - echo mips-unknown-sysv${UNAME_RELEASE} - fi - exit ;; - BeBox:BeOS:*:*) # BeOS running on hardware made by Be, PPC only. - echo powerpc-be-beos - exit ;; - BeMac:BeOS:*:*) # BeOS running on Mac or Mac clone, PPC only. - echo powerpc-apple-beos - exit ;; - BePC:BeOS:*:*) # BeOS running on Intel PC compatible. - echo i586-pc-beos - exit ;; - BePC:Haiku:*:*) # Haiku running on Intel PC compatible. - echo i586-pc-haiku - exit ;; - SX-4:SUPER-UX:*:*) - echo sx4-nec-superux${UNAME_RELEASE} - exit ;; - SX-5:SUPER-UX:*:*) - echo sx5-nec-superux${UNAME_RELEASE} - exit ;; - SX-6:SUPER-UX:*:*) - echo sx6-nec-superux${UNAME_RELEASE} - exit ;; - SX-7:SUPER-UX:*:*) - echo sx7-nec-superux${UNAME_RELEASE} - exit ;; - SX-8:SUPER-UX:*:*) - echo sx8-nec-superux${UNAME_RELEASE} - exit ;; - SX-8R:SUPER-UX:*:*) - echo sx8r-nec-superux${UNAME_RELEASE} - exit ;; - Power*:Rhapsody:*:*) - echo powerpc-apple-rhapsody${UNAME_RELEASE} - exit ;; - *:Rhapsody:*:*) - echo ${UNAME_MACHINE}-apple-rhapsody${UNAME_RELEASE} - exit ;; - *:Darwin:*:*) - UNAME_PROCESSOR=`uname -p` || UNAME_PROCESSOR=unknown - case $UNAME_PROCESSOR in - i386) - eval $set_cc_for_build - if [ "$CC_FOR_BUILD" != 'no_compiler_found' ]; then - if (echo '#ifdef __LP64__'; echo IS_64BIT_ARCH; echo '#endif') | \ - (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | \ - grep IS_64BIT_ARCH >/dev/null - then - UNAME_PROCESSOR="x86_64" - fi - fi ;; - unknown) UNAME_PROCESSOR=powerpc ;; - esac - echo ${UNAME_PROCESSOR}-apple-darwin${UNAME_RELEASE} - exit ;; - *:procnto*:*:* | *:QNX:[0123456789]*:*) - UNAME_PROCESSOR=`uname -p` - if test "$UNAME_PROCESSOR" = "x86"; then - UNAME_PROCESSOR=i386 - UNAME_MACHINE=pc - fi - echo ${UNAME_PROCESSOR}-${UNAME_MACHINE}-nto-qnx${UNAME_RELEASE} - exit ;; - *:QNX:*:4*) - echo i386-pc-qnx - exit ;; - NEO-?:NONSTOP_KERNEL:*:*) - echo neo-tandem-nsk${UNAME_RELEASE} - exit ;; - NSE-?:NONSTOP_KERNEL:*:*) - echo nse-tandem-nsk${UNAME_RELEASE} - exit ;; - NSR-?:NONSTOP_KERNEL:*:*) - echo nsr-tandem-nsk${UNAME_RELEASE} - exit ;; - *:NonStop-UX:*:*) - echo mips-compaq-nonstopux - exit ;; - BS2000:POSIX*:*:*) - echo bs2000-siemens-sysv - exit ;; - DS/*:UNIX_System_V:*:*) - echo ${UNAME_MACHINE}-${UNAME_SYSTEM}-${UNAME_RELEASE} - exit ;; - *:Plan9:*:*) - # "uname -m" is not consistent, so use $cputype instead. 386 - # is converted to i386 for consistency with other x86 - # operating systems. - if test "$cputype" = "386"; then - UNAME_MACHINE=i386 - else - UNAME_MACHINE="$cputype" - fi - echo ${UNAME_MACHINE}-unknown-plan9 - exit ;; - *:TOPS-10:*:*) - echo pdp10-unknown-tops10 - exit ;; - *:TENEX:*:*) - echo pdp10-unknown-tenex - exit ;; - KS10:TOPS-20:*:* | KL10:TOPS-20:*:* | TYPE4:TOPS-20:*:*) - echo pdp10-dec-tops20 - exit ;; - XKL-1:TOPS-20:*:* | TYPE5:TOPS-20:*:*) - echo pdp10-xkl-tops20 - exit ;; - *:TOPS-20:*:*) - echo pdp10-unknown-tops20 - exit ;; - *:ITS:*:*) - echo pdp10-unknown-its - exit ;; - SEI:*:*:SEIUX) - echo mips-sei-seiux${UNAME_RELEASE} - exit ;; - *:DragonFly:*:*) - echo ${UNAME_MACHINE}-unknown-dragonfly`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` - exit ;; - *:*VMS:*:*) - UNAME_MACHINE=`(uname -p) 2>/dev/null` - case "${UNAME_MACHINE}" in - A*) echo alpha-dec-vms ; exit ;; - I*) echo ia64-dec-vms ; exit ;; - V*) echo vax-dec-vms ; exit ;; - esac ;; - *:XENIX:*:SysV) - echo i386-pc-xenix - exit ;; - i*86:skyos:*:*) - echo ${UNAME_MACHINE}-pc-skyos`echo ${UNAME_RELEASE}` | sed -e 's/ .*$//' - exit ;; - i*86:rdos:*:*) - echo ${UNAME_MACHINE}-pc-rdos - exit ;; - i*86:AROS:*:*) - echo ${UNAME_MACHINE}-pc-aros - exit ;; - x86_64:VMkernel:*:*) - echo ${UNAME_MACHINE}-unknown-esx - exit ;; -esac - -#echo '(No uname command or uname output not recognized.)' 1>&2 -#echo "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" 1>&2 - -eval $set_cc_for_build -cat >$dummy.c < -# include -#endif -main () -{ -#if defined (sony) -#if defined (MIPSEB) - /* BFD wants "bsd" instead of "newsos". Perhaps BFD should be changed, - I don't know.... */ - printf ("mips-sony-bsd\n"); exit (0); -#else -#include - printf ("m68k-sony-newsos%s\n", -#ifdef NEWSOS4 - "4" -#else - "" -#endif - ); exit (0); -#endif -#endif - -#if defined (__arm) && defined (__acorn) && defined (__unix) - printf ("arm-acorn-riscix\n"); exit (0); -#endif - -#if defined (hp300) && !defined (hpux) - printf ("m68k-hp-bsd\n"); exit (0); -#endif - -#if defined (NeXT) -#if !defined (__ARCHITECTURE__) -#define __ARCHITECTURE__ "m68k" -#endif - int version; - version=`(hostinfo | sed -n 's/.*NeXT Mach \([0-9]*\).*/\1/p') 2>/dev/null`; - if (version < 4) - printf ("%s-next-nextstep%d\n", __ARCHITECTURE__, version); - else - printf ("%s-next-openstep%d\n", __ARCHITECTURE__, version); - exit (0); -#endif - -#if defined (MULTIMAX) || defined (n16) -#if defined (UMAXV) - printf ("ns32k-encore-sysv\n"); exit (0); -#else -#if defined (CMU) - printf ("ns32k-encore-mach\n"); exit (0); -#else - printf ("ns32k-encore-bsd\n"); exit (0); -#endif -#endif -#endif - -#if defined (__386BSD__) - printf ("i386-pc-bsd\n"); exit (0); -#endif - -#if defined (sequent) -#if defined (i386) - printf ("i386-sequent-dynix\n"); exit (0); -#endif -#if defined (ns32000) - printf ("ns32k-sequent-dynix\n"); exit (0); -#endif -#endif - -#if defined (_SEQUENT_) - struct utsname un; - - uname(&un); - - if (strncmp(un.version, "V2", 2) == 0) { - printf ("i386-sequent-ptx2\n"); exit (0); - } - if (strncmp(un.version, "V1", 2) == 0) { /* XXX is V1 correct? */ - printf ("i386-sequent-ptx1\n"); exit (0); - } - printf ("i386-sequent-ptx\n"); exit (0); - -#endif - -#if defined (vax) -# if !defined (ultrix) -# include -# if defined (BSD) -# if BSD == 43 - printf ("vax-dec-bsd4.3\n"); exit (0); -# else -# if BSD == 199006 - printf ("vax-dec-bsd4.3reno\n"); exit (0); -# else - printf ("vax-dec-bsd\n"); exit (0); -# endif -# endif -# else - printf ("vax-dec-bsd\n"); exit (0); -# endif -# else - printf ("vax-dec-ultrix\n"); exit (0); -# endif -#endif - -#if defined (alliant) && defined (i860) - printf ("i860-alliant-bsd\n"); exit (0); -#endif - - exit (1); -} -EOF - -$CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null && SYSTEM_NAME=`$dummy` && - { echo "$SYSTEM_NAME"; exit; } - -# Apollos put the system type in the environment. - -test -d /usr/apollo && { echo ${ISP}-apollo-${SYSTYPE}; exit; } - -# Convex versions that predate uname can use getsysinfo(1) - -if [ -x /usr/convex/getsysinfo ] -then - case `getsysinfo -f cpu_type` in - c1*) - echo c1-convex-bsd - exit ;; - c2*) - if getsysinfo -f scalar_acc - then echo c32-convex-bsd - else echo c2-convex-bsd - fi - exit ;; - c34*) - echo c34-convex-bsd - exit ;; - c38*) - echo c38-convex-bsd - exit ;; - c4*) - echo c4-convex-bsd - exit ;; - esac -fi - -cat >&2 < in order to provide the needed -information to handle your system. - -config.guess timestamp = $timestamp - -uname -m = `(uname -m) 2>/dev/null || echo unknown` -uname -r = `(uname -r) 2>/dev/null || echo unknown` -uname -s = `(uname -s) 2>/dev/null || echo unknown` -uname -v = `(uname -v) 2>/dev/null || echo unknown` - -/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null` -/bin/uname -X = `(/bin/uname -X) 2>/dev/null` - -hostinfo = `(hostinfo) 2>/dev/null` -/bin/universe = `(/bin/universe) 2>/dev/null` -/usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null` -/bin/arch = `(/bin/arch) 2>/dev/null` -/usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null` -/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null` - -UNAME_MACHINE = ${UNAME_MACHINE} -UNAME_RELEASE = ${UNAME_RELEASE} -UNAME_SYSTEM = ${UNAME_SYSTEM} -UNAME_VERSION = ${UNAME_VERSION} -EOF - -exit 1 - -# Local variables: -# eval: (add-hook 'write-file-hooks 'time-stamp) -# time-stamp-start: "timestamp='" -# time-stamp-format: "%:y-%02m-%02d" -# time-stamp-end: "'" -# End: diff --git a/pkg/registry/zookeeper-3.4.6/src/c/config.h.in b/pkg/registry/zookeeper-3.4.6/src/c/config.h.in deleted file mode 100644 index 1716980d7..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/c/config.h.in +++ /dev/null @@ -1,152 +0,0 @@ -/* config.h.in. Generated from configure.ac by autoheader. */ - -/* Define to 1 if you have the header file. */ -#undef HAVE_ARPA_INET_H - -/* Define to 1 if you have the header file. */ -#undef HAVE_DLFCN_H - -/* Define to 1 if you have the header file. */ -#undef HAVE_FCNTL_H - -/* Define to 1 if you have the file `generated/zookeeper.jute.c'. */ -#undef HAVE_GENERATED_ZOOKEEPER_JUTE_C - -/* Define to 1 if you have the file `generated/zookeeper.jute.h'. */ -#undef HAVE_GENERATED_ZOOKEEPER_JUTE_H - -/* Define to 1 if you have the `getcwd' function. */ -#undef HAVE_GETCWD - -/* Define to 1 if you have the `gethostbyname' function. */ -#undef HAVE_GETHOSTBYNAME - -/* Define to 1 if you have the `gethostname' function. */ -#undef HAVE_GETHOSTNAME - -/* Define to 1 if you have the `getlogin' function. */ -#undef HAVE_GETLOGIN - -/* Define to 1 if you have the `getpwuid_r' function. */ -#undef HAVE_GETPWUID_R - -/* Define to 1 if you have the `gettimeofday' function. */ -#undef HAVE_GETTIMEOFDAY - -/* Define to 1 if you have the `getuid' function. */ -#undef HAVE_GETUID - -/* Define to 1 if you have the header file. */ -#undef HAVE_INTTYPES_H - -/* Define to 1 if you have the `memmove' function. */ -#undef HAVE_MEMMOVE - -/* Define to 1 if you have the header file. */ -#undef HAVE_MEMORY_H - -/* Define to 1 if you have the `memset' function. */ -#undef HAVE_MEMSET - -/* Define to 1 if you have the header file. */ -#undef HAVE_NETDB_H - -/* Define to 1 if you have the header file. */ -#undef HAVE_NETINET_IN_H - -/* Define to 1 if you have the `poll' function. */ -#undef HAVE_POLL - -/* Define to 1 if you have the `socket' function. */ -#undef HAVE_SOCKET - -/* Define to 1 if you have the header file. */ -#undef HAVE_STDINT_H - -/* Define to 1 if you have the header file. */ -#undef HAVE_STDLIB_H - -/* Define to 1 if you have the `strchr' function. */ -#undef HAVE_STRCHR - -/* Define to 1 if you have the `strdup' function. */ -#undef HAVE_STRDUP - -/* Define to 1 if you have the `strerror' function. */ -#undef HAVE_STRERROR - -/* Define to 1 if you have the header file. */ -#undef HAVE_STRINGS_H - -/* Define to 1 if you have the header file. */ -#undef HAVE_STRING_H - -/* Define to 1 if you have the `strtol' function. */ -#undef HAVE_STRTOL - -/* Define to 1 if you have the header file. */ -#undef HAVE_SYS_SOCKET_H - -/* Define to 1 if you have the header file. */ -#undef HAVE_SYS_STAT_H - -/* Define to 1 if you have the header file. */ -#undef HAVE_SYS_TIME_H - -/* Define to 1 if you have the header file. */ -#undef HAVE_SYS_TYPES_H - -/* Define to 1 if you have the header file. */ -#undef HAVE_SYS_UTSNAME_H - -/* Define to 1 if you have the header file. */ -#undef HAVE_UNISTD_H - -/* Define to the sub-directory in which libtool stores uninstalled libraries. - */ -#undef LT_OBJDIR - -/* Define to 1 if your C compiler doesn't accept -c and -o together. */ -#undef NO_MINUS_C_MINUS_O - -/* Name of package */ -#undef PACKAGE - -/* Define to the address where bug reports for this package should be sent. */ -#undef PACKAGE_BUGREPORT - -/* Define to the full name of this package. */ -#undef PACKAGE_NAME - -/* Define to the full name and version of this package. */ -#undef PACKAGE_STRING - -/* Define to the one symbol short name of this package. */ -#undef PACKAGE_TARNAME - -/* Define to the home page for this package. */ -#undef PACKAGE_URL - -/* Define to the version of this package. */ -#undef PACKAGE_VERSION - -/* poll() second argument type */ -#undef POLL_NFDS_TYPE - -/* Define to 1 if you have the ANSI C header files. */ -#undef STDC_HEADERS - -/* Define to 1 if you can safely include both and . */ -#undef TIME_WITH_SYS_TIME - -/* Version number of package */ -#undef VERSION - -/* Define to empty if `const' does not conform to ANSI C. */ -#undef const - -/* Define to `__inline__' or `__inline' if that's what the C compiler - calls it, or to nothing if 'inline' is not supported under any name. */ -#ifndef __cplusplus -#undef inline -#endif diff --git a/pkg/registry/zookeeper-3.4.6/src/c/config.sub b/pkg/registry/zookeeper-3.4.6/src/c/config.sub deleted file mode 100755 index 6205f8423..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/c/config.sub +++ /dev/null @@ -1,1782 +0,0 @@ -#! /bin/sh -# Configuration validation subroutine script. -# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, -# 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, -# 2011, 2012 Free Software Foundation, Inc. - -timestamp='2012-04-18' - -# This file is (in principle) common to ALL GNU software. -# The presence of a machine in this file suggests that SOME GNU software -# can handle that machine. It does not imply ALL GNU software can. -# -# This file is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, see . -# -# As a special exception to the GNU General Public License, if you -# distribute this file as part of a program that contains a -# configuration script generated by Autoconf, you may include it under -# the same distribution terms that you use for the rest of that program. - - -# Please send patches to . Submit a context -# diff and a properly formatted GNU ChangeLog entry. -# -# Configuration subroutine to validate and canonicalize a configuration type. -# Supply the specified configuration type as an argument. -# If it is invalid, we print an error message on stderr and exit with code 1. -# Otherwise, we print the canonical config type on stdout and succeed. - -# You can get the latest version of this script from: -# http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub;hb=HEAD - -# This file is supposed to be the same for all GNU packages -# and recognize all the CPU types, system types and aliases -# that are meaningful with *any* GNU software. -# Each package is responsible for reporting which valid configurations -# it does not support. The user should be able to distinguish -# a failure to support a valid configuration from a meaningless -# configuration. - -# The goal of this file is to map all the various variations of a given -# machine specification into a single specification in the form: -# CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM -# or in some cases, the newer four-part form: -# CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM -# It is wrong to echo any other type of specification. - -me=`echo "$0" | sed -e 's,.*/,,'` - -usage="\ -Usage: $0 [OPTION] CPU-MFR-OPSYS - $0 [OPTION] ALIAS - -Canonicalize a configuration name. - -Operation modes: - -h, --help print this help, then exit - -t, --time-stamp print date of last modification, then exit - -v, --version print version number, then exit - -Report bugs and patches to ." - -version="\ -GNU config.sub ($timestamp) - -Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, -2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012 -Free Software Foundation, Inc. - -This is free software; see the source for copying conditions. There is NO -warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." - -help=" -Try \`$me --help' for more information." - -# Parse command line -while test $# -gt 0 ; do - case $1 in - --time-stamp | --time* | -t ) - echo "$timestamp" ; exit ;; - --version | -v ) - echo "$version" ; exit ;; - --help | --h* | -h ) - echo "$usage"; exit ;; - -- ) # Stop option processing - shift; break ;; - - ) # Use stdin as input. - break ;; - -* ) - echo "$me: invalid option $1$help" - exit 1 ;; - - *local*) - # First pass through any local machine types. - echo $1 - exit ;; - - * ) - break ;; - esac -done - -case $# in - 0) echo "$me: missing argument$help" >&2 - exit 1;; - 1) ;; - *) echo "$me: too many arguments$help" >&2 - exit 1;; -esac - -# Separate what the user gave into CPU-COMPANY and OS or KERNEL-OS (if any). -# Here we must recognize all the valid KERNEL-OS combinations. -maybe_os=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'` -case $maybe_os in - nto-qnx* | linux-gnu* | linux-android* | linux-dietlibc | linux-newlib* | \ - linux-uclibc* | uclinux-uclibc* | uclinux-gnu* | kfreebsd*-gnu* | \ - knetbsd*-gnu* | netbsd*-gnu* | \ - kopensolaris*-gnu* | \ - storm-chaos* | os2-emx* | rtmk-nova*) - os=-$maybe_os - basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'` - ;; - android-linux) - os=-linux-android - basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'`-unknown - ;; - *) - basic_machine=`echo $1 | sed 's/-[^-]*$//'` - if [ $basic_machine != $1 ] - then os=`echo $1 | sed 's/.*-/-/'` - else os=; fi - ;; -esac - -### Let's recognize common machines as not being operating systems so -### that things like config.sub decstation-3100 work. We also -### recognize some manufacturers as not being operating systems, so we -### can provide default operating systems below. -case $os in - -sun*os*) - # Prevent following clause from handling this invalid input. - ;; - -dec* | -mips* | -sequent* | -encore* | -pc532* | -sgi* | -sony* | \ - -att* | -7300* | -3300* | -delta* | -motorola* | -sun[234]* | \ - -unicom* | -ibm* | -next | -hp | -isi* | -apollo | -altos* | \ - -convergent* | -ncr* | -news | -32* | -3600* | -3100* | -hitachi* |\ - -c[123]* | -convex* | -sun | -crds | -omron* | -dg | -ultra | -tti* | \ - -harris | -dolphin | -highlevel | -gould | -cbm | -ns | -masscomp | \ - -apple | -axis | -knuth | -cray | -microblaze) - os= - basic_machine=$1 - ;; - -bluegene*) - os=-cnk - ;; - -sim | -cisco | -oki | -wec | -winbond) - os= - basic_machine=$1 - ;; - -scout) - ;; - -wrs) - os=-vxworks - basic_machine=$1 - ;; - -chorusos*) - os=-chorusos - basic_machine=$1 - ;; - -chorusrdb) - os=-chorusrdb - basic_machine=$1 - ;; - -hiux*) - os=-hiuxwe2 - ;; - -sco6) - os=-sco5v6 - basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` - ;; - -sco5) - os=-sco3.2v5 - basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` - ;; - -sco4) - os=-sco3.2v4 - basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` - ;; - -sco3.2.[4-9]*) - os=`echo $os | sed -e 's/sco3.2./sco3.2v/'` - basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` - ;; - -sco3.2v[4-9]*) - # Don't forget version if it is 3.2v4 or newer. - basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` - ;; - -sco5v6*) - # Don't forget version if it is 3.2v4 or newer. - basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` - ;; - -sco*) - os=-sco3.2v2 - basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` - ;; - -udk*) - basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` - ;; - -isc) - os=-isc2.2 - basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` - ;; - -clix*) - basic_machine=clipper-intergraph - ;; - -isc*) - basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` - ;; - -lynx*178) - os=-lynxos178 - ;; - -lynx*5) - os=-lynxos5 - ;; - -lynx*) - os=-lynxos - ;; - -ptx*) - basic_machine=`echo $1 | sed -e 's/86-.*/86-sequent/'` - ;; - -windowsnt*) - os=`echo $os | sed -e 's/windowsnt/winnt/'` - ;; - -psos*) - os=-psos - ;; - -mint | -mint[0-9]*) - basic_machine=m68k-atari - os=-mint - ;; -esac - -# Decode aliases for certain CPU-COMPANY combinations. -case $basic_machine in - # Recognize the basic CPU types without company name. - # Some are omitted here because they have special meanings below. - 1750a | 580 \ - | a29k \ - | aarch64 | aarch64_be \ - | alpha | alphaev[4-8] | alphaev56 | alphaev6[78] | alphapca5[67] \ - | alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] | alpha64pca5[67] \ - | am33_2.0 \ - | arc | arm | arm[bl]e | arme[lb] | armv[2345] | armv[345][lb] | avr | avr32 \ - | be32 | be64 \ - | bfin \ - | c4x | clipper \ - | d10v | d30v | dlx | dsp16xx \ - | epiphany \ - | fido | fr30 | frv \ - | h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \ - | hexagon \ - | i370 | i860 | i960 | ia64 \ - | ip2k | iq2000 \ - | le32 | le64 \ - | lm32 \ - | m32c | m32r | m32rle | m68000 | m68k | m88k \ - | maxq | mb | microblaze | mcore | mep | metag \ - | mips | mipsbe | mipseb | mipsel | mipsle \ - | mips16 \ - | mips64 | mips64el \ - | mips64octeon | mips64octeonel \ - | mips64orion | mips64orionel \ - | mips64r5900 | mips64r5900el \ - | mips64vr | mips64vrel \ - | mips64vr4100 | mips64vr4100el \ - | mips64vr4300 | mips64vr4300el \ - | mips64vr5000 | mips64vr5000el \ - | mips64vr5900 | mips64vr5900el \ - | mipsisa32 | mipsisa32el \ - | mipsisa32r2 | mipsisa32r2el \ - | mipsisa64 | mipsisa64el \ - | mipsisa64r2 | mipsisa64r2el \ - | mipsisa64sb1 | mipsisa64sb1el \ - | mipsisa64sr71k | mipsisa64sr71kel \ - | mipstx39 | mipstx39el \ - | mn10200 | mn10300 \ - | moxie \ - | mt \ - | msp430 \ - | nds32 | nds32le | nds32be \ - | nios | nios2 \ - | ns16k | ns32k \ - | open8 \ - | or32 \ - | pdp10 | pdp11 | pj | pjl \ - | powerpc | powerpc64 | powerpc64le | powerpcle \ - | pyramid \ - | rl78 | rx \ - | score \ - | sh | sh[1234] | sh[24]a | sh[24]aeb | sh[23]e | sh[34]eb | sheb | shbe | shle | sh[1234]le | sh3ele \ - | sh64 | sh64le \ - | sparc | sparc64 | sparc64b | sparc64v | sparc86x | sparclet | sparclite \ - | sparcv8 | sparcv9 | sparcv9b | sparcv9v \ - | spu \ - | tahoe | tic4x | tic54x | tic55x | tic6x | tic80 | tron \ - | ubicom32 \ - | v850 | v850e | v850e1 | v850e2 | v850es | v850e2v3 \ - | we32k \ - | x86 | xc16x | xstormy16 | xtensa \ - | z8k | z80) - basic_machine=$basic_machine-unknown - ;; - c54x) - basic_machine=tic54x-unknown - ;; - c55x) - basic_machine=tic55x-unknown - ;; - c6x) - basic_machine=tic6x-unknown - ;; - m6811 | m68hc11 | m6812 | m68hc12 | m68hcs12x | picochip) - basic_machine=$basic_machine-unknown - os=-none - ;; - m88110 | m680[12346]0 | m683?2 | m68360 | m5200 | v70 | w65 | z8k) - ;; - ms1) - basic_machine=mt-unknown - ;; - - strongarm | thumb | xscale) - basic_machine=arm-unknown - ;; - xgate) - basic_machine=$basic_machine-unknown - os=-none - ;; - xscaleeb) - basic_machine=armeb-unknown - ;; - - xscaleel) - basic_machine=armel-unknown - ;; - - # We use `pc' rather than `unknown' - # because (1) that's what they normally are, and - # (2) the word "unknown" tends to confuse beginning users. - i*86 | x86_64) - basic_machine=$basic_machine-pc - ;; - # Object if more than one company name word. - *-*-*) - echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2 - exit 1 - ;; - # Recognize the basic CPU types with company name. - 580-* \ - | a29k-* \ - | aarch64-* | aarch64_be-* \ - | alpha-* | alphaev[4-8]-* | alphaev56-* | alphaev6[78]-* \ - | alpha64-* | alpha64ev[4-8]-* | alpha64ev56-* | alpha64ev6[78]-* \ - | alphapca5[67]-* | alpha64pca5[67]-* | arc-* \ - | arm-* | armbe-* | armle-* | armeb-* | armv*-* \ - | avr-* | avr32-* \ - | be32-* | be64-* \ - | bfin-* | bs2000-* \ - | c[123]* | c30-* | [cjt]90-* | c4x-* \ - | clipper-* | craynv-* | cydra-* \ - | d10v-* | d30v-* | dlx-* \ - | elxsi-* \ - | f30[01]-* | f700-* | fido-* | fr30-* | frv-* | fx80-* \ - | h8300-* | h8500-* \ - | hppa-* | hppa1.[01]-* | hppa2.0-* | hppa2.0[nw]-* | hppa64-* \ - | hexagon-* \ - | i*86-* | i860-* | i960-* | ia64-* \ - | ip2k-* | iq2000-* \ - | le32-* | le64-* \ - | lm32-* \ - | m32c-* | m32r-* | m32rle-* \ - | m68000-* | m680[012346]0-* | m68360-* | m683?2-* | m68k-* \ - | m88110-* | m88k-* | maxq-* | mcore-* | metag-* | microblaze-* \ - | mips-* | mipsbe-* | mipseb-* | mipsel-* | mipsle-* \ - | mips16-* \ - | mips64-* | mips64el-* \ - | mips64octeon-* | mips64octeonel-* \ - | mips64orion-* | mips64orionel-* \ - | mips64r5900-* | mips64r5900el-* \ - | mips64vr-* | mips64vrel-* \ - | mips64vr4100-* | mips64vr4100el-* \ - | mips64vr4300-* | mips64vr4300el-* \ - | mips64vr5000-* | mips64vr5000el-* \ - | mips64vr5900-* | mips64vr5900el-* \ - | mipsisa32-* | mipsisa32el-* \ - | mipsisa32r2-* | mipsisa32r2el-* \ - | mipsisa64-* | mipsisa64el-* \ - | mipsisa64r2-* | mipsisa64r2el-* \ - | mipsisa64sb1-* | mipsisa64sb1el-* \ - | mipsisa64sr71k-* | mipsisa64sr71kel-* \ - | mipstx39-* | mipstx39el-* \ - | mmix-* \ - | mt-* \ - | msp430-* \ - | nds32-* | nds32le-* | nds32be-* \ - | nios-* | nios2-* \ - | none-* | np1-* | ns16k-* | ns32k-* \ - | open8-* \ - | orion-* \ - | pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \ - | powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* \ - | pyramid-* \ - | rl78-* | romp-* | rs6000-* | rx-* \ - | sh-* | sh[1234]-* | sh[24]a-* | sh[24]aeb-* | sh[23]e-* | sh[34]eb-* | sheb-* | shbe-* \ - | shle-* | sh[1234]le-* | sh3ele-* | sh64-* | sh64le-* \ - | sparc-* | sparc64-* | sparc64b-* | sparc64v-* | sparc86x-* | sparclet-* \ - | sparclite-* \ - | sparcv8-* | sparcv9-* | sparcv9b-* | sparcv9v-* | sv1-* | sx?-* \ - | tahoe-* \ - | tic30-* | tic4x-* | tic54x-* | tic55x-* | tic6x-* | tic80-* \ - | tile*-* \ - | tron-* \ - | ubicom32-* \ - | v850-* | v850e-* | v850e1-* | v850es-* | v850e2-* | v850e2v3-* \ - | vax-* \ - | we32k-* \ - | x86-* | x86_64-* | xc16x-* | xps100-* \ - | xstormy16-* | xtensa*-* \ - | ymp-* \ - | z8k-* | z80-*) - ;; - # Recognize the basic CPU types without company name, with glob match. - xtensa*) - basic_machine=$basic_machine-unknown - ;; - # Recognize the various machine names and aliases which stand - # for a CPU type and a company and sometimes even an OS. - 386bsd) - basic_machine=i386-unknown - os=-bsd - ;; - 3b1 | 7300 | 7300-att | att-7300 | pc7300 | safari | unixpc) - basic_machine=m68000-att - ;; - 3b*) - basic_machine=we32k-att - ;; - a29khif) - basic_machine=a29k-amd - os=-udi - ;; - abacus) - basic_machine=abacus-unknown - ;; - adobe68k) - basic_machine=m68010-adobe - os=-scout - ;; - alliant | fx80) - basic_machine=fx80-alliant - ;; - altos | altos3068) - basic_machine=m68k-altos - ;; - am29k) - basic_machine=a29k-none - os=-bsd - ;; - amd64) - basic_machine=x86_64-pc - ;; - amd64-*) - basic_machine=x86_64-`echo $basic_machine | sed 's/^[^-]*-//'` - ;; - amdahl) - basic_machine=580-amdahl - os=-sysv - ;; - amiga | amiga-*) - basic_machine=m68k-unknown - ;; - amigaos | amigados) - basic_machine=m68k-unknown - os=-amigaos - ;; - amigaunix | amix) - basic_machine=m68k-unknown - os=-sysv4 - ;; - apollo68) - basic_machine=m68k-apollo - os=-sysv - ;; - apollo68bsd) - basic_machine=m68k-apollo - os=-bsd - ;; - aros) - basic_machine=i386-pc - os=-aros - ;; - aux) - basic_machine=m68k-apple - os=-aux - ;; - balance) - basic_machine=ns32k-sequent - os=-dynix - ;; - blackfin) - basic_machine=bfin-unknown - os=-linux - ;; - blackfin-*) - basic_machine=bfin-`echo $basic_machine | sed 's/^[^-]*-//'` - os=-linux - ;; - bluegene*) - basic_machine=powerpc-ibm - os=-cnk - ;; - c54x-*) - basic_machine=tic54x-`echo $basic_machine | sed 's/^[^-]*-//'` - ;; - c55x-*) - basic_machine=tic55x-`echo $basic_machine | sed 's/^[^-]*-//'` - ;; - c6x-*) - basic_machine=tic6x-`echo $basic_machine | sed 's/^[^-]*-//'` - ;; - c90) - basic_machine=c90-cray - os=-unicos - ;; - cegcc) - basic_machine=arm-unknown - os=-cegcc - ;; - convex-c1) - basic_machine=c1-convex - os=-bsd - ;; - convex-c2) - basic_machine=c2-convex - os=-bsd - ;; - convex-c32) - basic_machine=c32-convex - os=-bsd - ;; - convex-c34) - basic_machine=c34-convex - os=-bsd - ;; - convex-c38) - basic_machine=c38-convex - os=-bsd - ;; - cray | j90) - basic_machine=j90-cray - os=-unicos - ;; - craynv) - basic_machine=craynv-cray - os=-unicosmp - ;; - cr16 | cr16-*) - basic_machine=cr16-unknown - os=-elf - ;; - crds | unos) - basic_machine=m68k-crds - ;; - crisv32 | crisv32-* | etraxfs*) - basic_machine=crisv32-axis - ;; - cris | cris-* | etrax*) - basic_machine=cris-axis - ;; - crx) - basic_machine=crx-unknown - os=-elf - ;; - da30 | da30-*) - basic_machine=m68k-da30 - ;; - decstation | decstation-3100 | pmax | pmax-* | pmin | dec3100 | decstatn) - basic_machine=mips-dec - ;; - decsystem10* | dec10*) - basic_machine=pdp10-dec - os=-tops10 - ;; - decsystem20* | dec20*) - basic_machine=pdp10-dec - os=-tops20 - ;; - delta | 3300 | motorola-3300 | motorola-delta \ - | 3300-motorola | delta-motorola) - basic_machine=m68k-motorola - ;; - delta88) - basic_machine=m88k-motorola - os=-sysv3 - ;; - dicos) - basic_machine=i686-pc - os=-dicos - ;; - djgpp) - basic_machine=i586-pc - os=-msdosdjgpp - ;; - dpx20 | dpx20-*) - basic_machine=rs6000-bull - os=-bosx - ;; - dpx2* | dpx2*-bull) - basic_machine=m68k-bull - os=-sysv3 - ;; - ebmon29k) - basic_machine=a29k-amd - os=-ebmon - ;; - elxsi) - basic_machine=elxsi-elxsi - os=-bsd - ;; - encore | umax | mmax) - basic_machine=ns32k-encore - ;; - es1800 | OSE68k | ose68k | ose | OSE) - basic_machine=m68k-ericsson - os=-ose - ;; - fx2800) - basic_machine=i860-alliant - ;; - genix) - basic_machine=ns32k-ns - ;; - gmicro) - basic_machine=tron-gmicro - os=-sysv - ;; - go32) - basic_machine=i386-pc - os=-go32 - ;; - h3050r* | hiux*) - basic_machine=hppa1.1-hitachi - os=-hiuxwe2 - ;; - h8300hms) - basic_machine=h8300-hitachi - os=-hms - ;; - h8300xray) - basic_machine=h8300-hitachi - os=-xray - ;; - h8500hms) - basic_machine=h8500-hitachi - os=-hms - ;; - harris) - basic_machine=m88k-harris - os=-sysv3 - ;; - hp300-*) - basic_machine=m68k-hp - ;; - hp300bsd) - basic_machine=m68k-hp - os=-bsd - ;; - hp300hpux) - basic_machine=m68k-hp - os=-hpux - ;; - hp3k9[0-9][0-9] | hp9[0-9][0-9]) - basic_machine=hppa1.0-hp - ;; - hp9k2[0-9][0-9] | hp9k31[0-9]) - basic_machine=m68000-hp - ;; - hp9k3[2-9][0-9]) - basic_machine=m68k-hp - ;; - hp9k6[0-9][0-9] | hp6[0-9][0-9]) - basic_machine=hppa1.0-hp - ;; - hp9k7[0-79][0-9] | hp7[0-79][0-9]) - basic_machine=hppa1.1-hp - ;; - hp9k78[0-9] | hp78[0-9]) - # FIXME: really hppa2.0-hp - basic_machine=hppa1.1-hp - ;; - hp9k8[67]1 | hp8[67]1 | hp9k80[24] | hp80[24] | hp9k8[78]9 | hp8[78]9 | hp9k893 | hp893) - # FIXME: really hppa2.0-hp - basic_machine=hppa1.1-hp - ;; - hp9k8[0-9][13679] | hp8[0-9][13679]) - basic_machine=hppa1.1-hp - ;; - hp9k8[0-9][0-9] | hp8[0-9][0-9]) - basic_machine=hppa1.0-hp - ;; - hppa-next) - os=-nextstep3 - ;; - hppaosf) - basic_machine=hppa1.1-hp - os=-osf - ;; - hppro) - basic_machine=hppa1.1-hp - os=-proelf - ;; - i370-ibm* | ibm*) - basic_machine=i370-ibm - ;; - i*86v32) - basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` - os=-sysv32 - ;; - i*86v4*) - basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` - os=-sysv4 - ;; - i*86v) - basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` - os=-sysv - ;; - i*86sol2) - basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` - os=-solaris2 - ;; - i386mach) - basic_machine=i386-mach - os=-mach - ;; - i386-vsta | vsta) - basic_machine=i386-unknown - os=-vsta - ;; - iris | iris4d) - basic_machine=mips-sgi - case $os in - -irix*) - ;; - *) - os=-irix4 - ;; - esac - ;; - isi68 | isi) - basic_machine=m68k-isi - os=-sysv - ;; - m68knommu) - basic_machine=m68k-unknown - os=-linux - ;; - m68knommu-*) - basic_machine=m68k-`echo $basic_machine | sed 's/^[^-]*-//'` - os=-linux - ;; - m88k-omron*) - basic_machine=m88k-omron - ;; - magnum | m3230) - basic_machine=mips-mips - os=-sysv - ;; - merlin) - basic_machine=ns32k-utek - os=-sysv - ;; - microblaze) - basic_machine=microblaze-xilinx - ;; - mingw32) - basic_machine=i386-pc - os=-mingw32 - ;; - mingw32ce) - basic_machine=arm-unknown - os=-mingw32ce - ;; - miniframe) - basic_machine=m68000-convergent - ;; - *mint | -mint[0-9]* | *MiNT | *MiNT[0-9]*) - basic_machine=m68k-atari - os=-mint - ;; - mips3*-*) - basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'` - ;; - mips3*) - basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`-unknown - ;; - monitor) - basic_machine=m68k-rom68k - os=-coff - ;; - morphos) - basic_machine=powerpc-unknown - os=-morphos - ;; - msdos) - basic_machine=i386-pc - os=-msdos - ;; - ms1-*) - basic_machine=`echo $basic_machine | sed -e 's/ms1-/mt-/'` - ;; - msys) - basic_machine=i386-pc - os=-msys - ;; - mvs) - basic_machine=i370-ibm - os=-mvs - ;; - nacl) - basic_machine=le32-unknown - os=-nacl - ;; - ncr3000) - basic_machine=i486-ncr - os=-sysv4 - ;; - netbsd386) - basic_machine=i386-unknown - os=-netbsd - ;; - netwinder) - basic_machine=armv4l-rebel - os=-linux - ;; - news | news700 | news800 | news900) - basic_machine=m68k-sony - os=-newsos - ;; - news1000) - basic_machine=m68030-sony - os=-newsos - ;; - news-3600 | risc-news) - basic_machine=mips-sony - os=-newsos - ;; - necv70) - basic_machine=v70-nec - os=-sysv - ;; - next | m*-next ) - basic_machine=m68k-next - case $os in - -nextstep* ) - ;; - -ns2*) - os=-nextstep2 - ;; - *) - os=-nextstep3 - ;; - esac - ;; - nh3000) - basic_machine=m68k-harris - os=-cxux - ;; - nh[45]000) - basic_machine=m88k-harris - os=-cxux - ;; - nindy960) - basic_machine=i960-intel - os=-nindy - ;; - mon960) - basic_machine=i960-intel - os=-mon960 - ;; - nonstopux) - basic_machine=mips-compaq - os=-nonstopux - ;; - np1) - basic_machine=np1-gould - ;; - neo-tandem) - basic_machine=neo-tandem - ;; - nse-tandem) - basic_machine=nse-tandem - ;; - nsr-tandem) - basic_machine=nsr-tandem - ;; - op50n-* | op60c-*) - basic_machine=hppa1.1-oki - os=-proelf - ;; - openrisc | openrisc-*) - basic_machine=or32-unknown - ;; - os400) - basic_machine=powerpc-ibm - os=-os400 - ;; - OSE68000 | ose68000) - basic_machine=m68000-ericsson - os=-ose - ;; - os68k) - basic_machine=m68k-none - os=-os68k - ;; - pa-hitachi) - basic_machine=hppa1.1-hitachi - os=-hiuxwe2 - ;; - paragon) - basic_machine=i860-intel - os=-osf - ;; - parisc) - basic_machine=hppa-unknown - os=-linux - ;; - parisc-*) - basic_machine=hppa-`echo $basic_machine | sed 's/^[^-]*-//'` - os=-linux - ;; - pbd) - basic_machine=sparc-tti - ;; - pbb) - basic_machine=m68k-tti - ;; - pc532 | pc532-*) - basic_machine=ns32k-pc532 - ;; - pc98) - basic_machine=i386-pc - ;; - pc98-*) - basic_machine=i386-`echo $basic_machine | sed 's/^[^-]*-//'` - ;; - pentium | p5 | k5 | k6 | nexgen | viac3) - basic_machine=i586-pc - ;; - pentiumpro | p6 | 6x86 | athlon | athlon_*) - basic_machine=i686-pc - ;; - pentiumii | pentium2 | pentiumiii | pentium3) - basic_machine=i686-pc - ;; - pentium4) - basic_machine=i786-pc - ;; - pentium-* | p5-* | k5-* | k6-* | nexgen-* | viac3-*) - basic_machine=i586-`echo $basic_machine | sed 's/^[^-]*-//'` - ;; - pentiumpro-* | p6-* | 6x86-* | athlon-*) - basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'` - ;; - pentiumii-* | pentium2-* | pentiumiii-* | pentium3-*) - basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'` - ;; - pentium4-*) - basic_machine=i786-`echo $basic_machine | sed 's/^[^-]*-//'` - ;; - pn) - basic_machine=pn-gould - ;; - power) basic_machine=power-ibm - ;; - ppc | ppcbe) basic_machine=powerpc-unknown - ;; - ppc-* | ppcbe-*) - basic_machine=powerpc-`echo $basic_machine | sed 's/^[^-]*-//'` - ;; - ppcle | powerpclittle | ppc-le | powerpc-little) - basic_machine=powerpcle-unknown - ;; - ppcle-* | powerpclittle-*) - basic_machine=powerpcle-`echo $basic_machine | sed 's/^[^-]*-//'` - ;; - ppc64) basic_machine=powerpc64-unknown - ;; - ppc64-*) basic_machine=powerpc64-`echo $basic_machine | sed 's/^[^-]*-//'` - ;; - ppc64le | powerpc64little | ppc64-le | powerpc64-little) - basic_machine=powerpc64le-unknown - ;; - ppc64le-* | powerpc64little-*) - basic_machine=powerpc64le-`echo $basic_machine | sed 's/^[^-]*-//'` - ;; - ps2) - basic_machine=i386-ibm - ;; - pw32) - basic_machine=i586-unknown - os=-pw32 - ;; - rdos) - basic_machine=i386-pc - os=-rdos - ;; - rom68k) - basic_machine=m68k-rom68k - os=-coff - ;; - rm[46]00) - basic_machine=mips-siemens - ;; - rtpc | rtpc-*) - basic_machine=romp-ibm - ;; - s390 | s390-*) - basic_machine=s390-ibm - ;; - s390x | s390x-*) - basic_machine=s390x-ibm - ;; - sa29200) - basic_machine=a29k-amd - os=-udi - ;; - sb1) - basic_machine=mipsisa64sb1-unknown - ;; - sb1el) - basic_machine=mipsisa64sb1el-unknown - ;; - sde) - basic_machine=mipsisa32-sde - os=-elf - ;; - sei) - basic_machine=mips-sei - os=-seiux - ;; - sequent) - basic_machine=i386-sequent - ;; - sh) - basic_machine=sh-hitachi - os=-hms - ;; - sh5el) - basic_machine=sh5le-unknown - ;; - sh64) - basic_machine=sh64-unknown - ;; - sparclite-wrs | simso-wrs) - basic_machine=sparclite-wrs - os=-vxworks - ;; - sps7) - basic_machine=m68k-bull - os=-sysv2 - ;; - spur) - basic_machine=spur-unknown - ;; - st2000) - basic_machine=m68k-tandem - ;; - stratus) - basic_machine=i860-stratus - os=-sysv4 - ;; - strongarm-* | thumb-*) - basic_machine=arm-`echo $basic_machine | sed 's/^[^-]*-//'` - ;; - sun2) - basic_machine=m68000-sun - ;; - sun2os3) - basic_machine=m68000-sun - os=-sunos3 - ;; - sun2os4) - basic_machine=m68000-sun - os=-sunos4 - ;; - sun3os3) - basic_machine=m68k-sun - os=-sunos3 - ;; - sun3os4) - basic_machine=m68k-sun - os=-sunos4 - ;; - sun4os3) - basic_machine=sparc-sun - os=-sunos3 - ;; - sun4os4) - basic_machine=sparc-sun - os=-sunos4 - ;; - sun4sol2) - basic_machine=sparc-sun - os=-solaris2 - ;; - sun3 | sun3-*) - basic_machine=m68k-sun - ;; - sun4) - basic_machine=sparc-sun - ;; - sun386 | sun386i | roadrunner) - basic_machine=i386-sun - ;; - sv1) - basic_machine=sv1-cray - os=-unicos - ;; - symmetry) - basic_machine=i386-sequent - os=-dynix - ;; - t3e) - basic_machine=alphaev5-cray - os=-unicos - ;; - t90) - basic_machine=t90-cray - os=-unicos - ;; - tile*) - basic_machine=$basic_machine-unknown - os=-linux-gnu - ;; - tx39) - basic_machine=mipstx39-unknown - ;; - tx39el) - basic_machine=mipstx39el-unknown - ;; - toad1) - basic_machine=pdp10-xkl - os=-tops20 - ;; - tower | tower-32) - basic_machine=m68k-ncr - ;; - tpf) - basic_machine=s390x-ibm - os=-tpf - ;; - udi29k) - basic_machine=a29k-amd - os=-udi - ;; - ultra3) - basic_machine=a29k-nyu - os=-sym1 - ;; - v810 | necv810) - basic_machine=v810-nec - os=-none - ;; - vaxv) - basic_machine=vax-dec - os=-sysv - ;; - vms) - basic_machine=vax-dec - os=-vms - ;; - vpp*|vx|vx-*) - basic_machine=f301-fujitsu - ;; - vxworks960) - basic_machine=i960-wrs - os=-vxworks - ;; - vxworks68) - basic_machine=m68k-wrs - os=-vxworks - ;; - vxworks29k) - basic_machine=a29k-wrs - os=-vxworks - ;; - w65*) - basic_machine=w65-wdc - os=-none - ;; - w89k-*) - basic_machine=hppa1.1-winbond - os=-proelf - ;; - xbox) - basic_machine=i686-pc - os=-mingw32 - ;; - xps | xps100) - basic_machine=xps100-honeywell - ;; - xscale-* | xscalee[bl]-*) - basic_machine=`echo $basic_machine | sed 's/^xscale/arm/'` - ;; - ymp) - basic_machine=ymp-cray - os=-unicos - ;; - z8k-*-coff) - basic_machine=z8k-unknown - os=-sim - ;; - z80-*-coff) - basic_machine=z80-unknown - os=-sim - ;; - none) - basic_machine=none-none - os=-none - ;; - -# Here we handle the default manufacturer of certain CPU types. It is in -# some cases the only manufacturer, in others, it is the most popular. - w89k) - basic_machine=hppa1.1-winbond - ;; - op50n) - basic_machine=hppa1.1-oki - ;; - op60c) - basic_machine=hppa1.1-oki - ;; - romp) - basic_machine=romp-ibm - ;; - mmix) - basic_machine=mmix-knuth - ;; - rs6000) - basic_machine=rs6000-ibm - ;; - vax) - basic_machine=vax-dec - ;; - pdp10) - # there are many clones, so DEC is not a safe bet - basic_machine=pdp10-unknown - ;; - pdp11) - basic_machine=pdp11-dec - ;; - we32k) - basic_machine=we32k-att - ;; - sh[1234] | sh[24]a | sh[24]aeb | sh[34]eb | sh[1234]le | sh[23]ele) - basic_machine=sh-unknown - ;; - sparc | sparcv8 | sparcv9 | sparcv9b | sparcv9v) - basic_machine=sparc-sun - ;; - cydra) - basic_machine=cydra-cydrome - ;; - orion) - basic_machine=orion-highlevel - ;; - orion105) - basic_machine=clipper-highlevel - ;; - mac | mpw | mac-mpw) - basic_machine=m68k-apple - ;; - pmac | pmac-mpw) - basic_machine=powerpc-apple - ;; - *-unknown) - # Make sure to match an already-canonicalized machine name. - ;; - *) - echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2 - exit 1 - ;; -esac - -# Here we canonicalize certain aliases for manufacturers. -case $basic_machine in - *-digital*) - basic_machine=`echo $basic_machine | sed 's/digital.*/dec/'` - ;; - *-commodore*) - basic_machine=`echo $basic_machine | sed 's/commodore.*/cbm/'` - ;; - *) - ;; -esac - -# Decode manufacturer-specific aliases for certain operating systems. - -if [ x"$os" != x"" ] -then -case $os in - # First match some system type aliases - # that might get confused with valid system types. - # -solaris* is a basic system type, with this one exception. - -auroraux) - os=-auroraux - ;; - -solaris1 | -solaris1.*) - os=`echo $os | sed -e 's|solaris1|sunos4|'` - ;; - -solaris) - os=-solaris2 - ;; - -svr4*) - os=-sysv4 - ;; - -unixware*) - os=-sysv4.2uw - ;; - -gnu/linux*) - os=`echo $os | sed -e 's|gnu/linux|linux-gnu|'` - ;; - # First accept the basic system types. - # The portable systems comes first. - # Each alternative MUST END IN A *, to match a version number. - # -sysv* is not here because it comes later, after sysvr4. - -gnu* | -bsd* | -mach* | -minix* | -genix* | -ultrix* | -irix* \ - | -*vms* | -sco* | -esix* | -isc* | -aix* | -cnk* | -sunos | -sunos[34]*\ - | -hpux* | -unos* | -osf* | -luna* | -dgux* | -auroraux* | -solaris* \ - | -sym* | -kopensolaris* \ - | -amigaos* | -amigados* | -msdos* | -newsos* | -unicos* | -aof* \ - | -aos* | -aros* \ - | -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \ - | -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \ - | -hiux* | -386bsd* | -knetbsd* | -mirbsd* | -netbsd* \ - | -openbsd* | -solidbsd* \ - | -ekkobsd* | -kfreebsd* | -freebsd* | -riscix* | -lynxos* \ - | -bosx* | -nextstep* | -cxux* | -aout* | -elf* | -oabi* \ - | -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \ - | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \ - | -chorusos* | -chorusrdb* | -cegcc* \ - | -cygwin* | -msys* | -pe* | -psos* | -moss* | -proelf* | -rtems* \ - | -mingw32* | -linux-gnu* | -linux-android* \ - | -linux-newlib* | -linux-uclibc* \ - | -uxpv* | -beos* | -mpeix* | -udk* \ - | -interix* | -uwin* | -mks* | -rhapsody* | -darwin* | -opened* \ - | -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \ - | -storm-chaos* | -tops10* | -tenex* | -tops20* | -its* \ - | -os2* | -vos* | -palmos* | -uclinux* | -nucleus* \ - | -morphos* | -superux* | -rtmk* | -rtmk-nova* | -windiss* \ - | -powermax* | -dnix* | -nx6 | -nx7 | -sei* | -dragonfly* \ - | -skyos* | -haiku* | -rdos* | -toppers* | -drops* | -es*) - # Remember, each alternative MUST END IN *, to match a version number. - ;; - -qnx*) - case $basic_machine in - x86-* | i*86-*) - ;; - *) - os=-nto$os - ;; - esac - ;; - -nto-qnx*) - ;; - -nto*) - os=`echo $os | sed -e 's|nto|nto-qnx|'` - ;; - -sim | -es1800* | -hms* | -xray | -os68k* | -none* | -v88r* \ - | -windows* | -osx | -abug | -netware* | -os9* | -beos* | -haiku* \ - | -macos* | -mpw* | -magic* | -mmixware* | -mon960* | -lnews*) - ;; - -mac*) - os=`echo $os | sed -e 's|mac|macos|'` - ;; - -linux-dietlibc) - os=-linux-dietlibc - ;; - -linux*) - os=`echo $os | sed -e 's|linux|linux-gnu|'` - ;; - -sunos5*) - os=`echo $os | sed -e 's|sunos5|solaris2|'` - ;; - -sunos6*) - os=`echo $os | sed -e 's|sunos6|solaris3|'` - ;; - -opened*) - os=-openedition - ;; - -os400*) - os=-os400 - ;; - -wince*) - os=-wince - ;; - -osfrose*) - os=-osfrose - ;; - -osf*) - os=-osf - ;; - -utek*) - os=-bsd - ;; - -dynix*) - os=-bsd - ;; - -acis*) - os=-aos - ;; - -atheos*) - os=-atheos - ;; - -syllable*) - os=-syllable - ;; - -386bsd) - os=-bsd - ;; - -ctix* | -uts*) - os=-sysv - ;; - -nova*) - os=-rtmk-nova - ;; - -ns2 ) - os=-nextstep2 - ;; - -nsk*) - os=-nsk - ;; - # Preserve the version number of sinix5. - -sinix5.*) - os=`echo $os | sed -e 's|sinix|sysv|'` - ;; - -sinix*) - os=-sysv4 - ;; - -tpf*) - os=-tpf - ;; - -triton*) - os=-sysv3 - ;; - -oss*) - os=-sysv3 - ;; - -svr4) - os=-sysv4 - ;; - -svr3) - os=-sysv3 - ;; - -sysvr4) - os=-sysv4 - ;; - # This must come after -sysvr4. - -sysv*) - ;; - -ose*) - os=-ose - ;; - -es1800*) - os=-ose - ;; - -xenix) - os=-xenix - ;; - -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*) - os=-mint - ;; - -aros*) - os=-aros - ;; - -kaos*) - os=-kaos - ;; - -zvmoe) - os=-zvmoe - ;; - -dicos*) - os=-dicos - ;; - -nacl*) - ;; - -none) - ;; - *) - # Get rid of the `-' at the beginning of $os. - os=`echo $os | sed 's/[^-]*-//'` - echo Invalid configuration \`$1\': system \`$os\' not recognized 1>&2 - exit 1 - ;; -esac -else - -# Here we handle the default operating systems that come with various machines. -# The value should be what the vendor currently ships out the door with their -# machine or put another way, the most popular os provided with the machine. - -# Note that if you're going to try to match "-MANUFACTURER" here (say, -# "-sun"), then you have to tell the case statement up towards the top -# that MANUFACTURER isn't an operating system. Otherwise, code above -# will signal an error saying that MANUFACTURER isn't an operating -# system, and we'll never get to this point. - -case $basic_machine in - score-*) - os=-elf - ;; - spu-*) - os=-elf - ;; - *-acorn) - os=-riscix1.2 - ;; - arm*-rebel) - os=-linux - ;; - arm*-semi) - os=-aout - ;; - c4x-* | tic4x-*) - os=-coff - ;; - hexagon-*) - os=-elf - ;; - tic54x-*) - os=-coff - ;; - tic55x-*) - os=-coff - ;; - tic6x-*) - os=-coff - ;; - # This must come before the *-dec entry. - pdp10-*) - os=-tops20 - ;; - pdp11-*) - os=-none - ;; - *-dec | vax-*) - os=-ultrix4.2 - ;; - m68*-apollo) - os=-domain - ;; - i386-sun) - os=-sunos4.0.2 - ;; - m68000-sun) - os=-sunos3 - ;; - m68*-cisco) - os=-aout - ;; - mep-*) - os=-elf - ;; - mips*-cisco) - os=-elf - ;; - mips*-*) - os=-elf - ;; - or32-*) - os=-coff - ;; - *-tti) # must be before sparc entry or we get the wrong os. - os=-sysv3 - ;; - sparc-* | *-sun) - os=-sunos4.1.1 - ;; - *-be) - os=-beos - ;; - *-haiku) - os=-haiku - ;; - *-ibm) - os=-aix - ;; - *-knuth) - os=-mmixware - ;; - *-wec) - os=-proelf - ;; - *-winbond) - os=-proelf - ;; - *-oki) - os=-proelf - ;; - *-hp) - os=-hpux - ;; - *-hitachi) - os=-hiux - ;; - i860-* | *-att | *-ncr | *-altos | *-motorola | *-convergent) - os=-sysv - ;; - *-cbm) - os=-amigaos - ;; - *-dg) - os=-dgux - ;; - *-dolphin) - os=-sysv3 - ;; - m68k-ccur) - os=-rtu - ;; - m88k-omron*) - os=-luna - ;; - *-next ) - os=-nextstep - ;; - *-sequent) - os=-ptx - ;; - *-crds) - os=-unos - ;; - *-ns) - os=-genix - ;; - i370-*) - os=-mvs - ;; - *-next) - os=-nextstep3 - ;; - *-gould) - os=-sysv - ;; - *-highlevel) - os=-bsd - ;; - *-encore) - os=-bsd - ;; - *-sgi) - os=-irix - ;; - *-siemens) - os=-sysv4 - ;; - *-masscomp) - os=-rtu - ;; - f30[01]-fujitsu | f700-fujitsu) - os=-uxpv - ;; - *-rom68k) - os=-coff - ;; - *-*bug) - os=-coff - ;; - *-apple) - os=-macos - ;; - *-atari*) - os=-mint - ;; - *) - os=-none - ;; -esac -fi - -# Here we handle the case where we know the os, and the CPU type, but not the -# manufacturer. We pick the logical manufacturer. -vendor=unknown -case $basic_machine in - *-unknown) - case $os in - -riscix*) - vendor=acorn - ;; - -sunos*) - vendor=sun - ;; - -cnk*|-aix*) - vendor=ibm - ;; - -beos*) - vendor=be - ;; - -hpux*) - vendor=hp - ;; - -mpeix*) - vendor=hp - ;; - -hiux*) - vendor=hitachi - ;; - -unos*) - vendor=crds - ;; - -dgux*) - vendor=dg - ;; - -luna*) - vendor=omron - ;; - -genix*) - vendor=ns - ;; - -mvs* | -opened*) - vendor=ibm - ;; - -os400*) - vendor=ibm - ;; - -ptx*) - vendor=sequent - ;; - -tpf*) - vendor=ibm - ;; - -vxsim* | -vxworks* | -windiss*) - vendor=wrs - ;; - -aux*) - vendor=apple - ;; - -hms*) - vendor=hitachi - ;; - -mpw* | -macos*) - vendor=apple - ;; - -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*) - vendor=atari - ;; - -vos*) - vendor=stratus - ;; - esac - basic_machine=`echo $basic_machine | sed "s/unknown/$vendor/"` - ;; -esac - -echo $basic_machine$os -exit - -# Local variables: -# eval: (add-hook 'write-file-hooks 'time-stamp) -# time-stamp-start: "timestamp='" -# time-stamp-format: "%:y-%02m-%02d" -# time-stamp-end: "'" -# End: diff --git a/pkg/registry/zookeeper-3.4.6/src/c/configure b/pkg/registry/zookeeper-3.4.6/src/c/configure deleted file mode 100755 index cbaf13e8c..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/c/configure +++ /dev/null @@ -1,20613 +0,0 @@ -#! /bin/sh -# Guess values for system-dependent variables and create Makefiles. -# Generated by GNU Autoconf 2.69 for zookeeper C client 3.4.6. -# -# Report bugs to . -# -# -# Copyright (C) 1992-1996, 1998-2012 Free Software Foundation, Inc. -# -# -# This configure script is free software; the Free Software Foundation -# gives unlimited permission to copy, distribute and modify it. -## -------------------- ## -## M4sh Initialization. ## -## -------------------- ## - -# Be more Bourne compatible -DUALCASE=1; export DUALCASE # for MKS sh -if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : - emulate sh - NULLCMD=: - # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which - # is contrary to our usage. Disable this feature. - alias -g '${1+"$@"}'='"$@"' - setopt NO_GLOB_SUBST -else - case `(set -o) 2>/dev/null` in #( - *posix*) : - set -o posix ;; #( - *) : - ;; -esac -fi - - -as_nl=' -' -export as_nl -# Printing a long string crashes Solaris 7 /usr/bin/printf. -as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' -as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo -as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo -# Prefer a ksh shell builtin over an external printf program on Solaris, -# but without wasting forks for bash or zsh. -if test -z "$BASH_VERSION$ZSH_VERSION" \ - && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then - as_echo='print -r --' - as_echo_n='print -rn --' -elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then - as_echo='printf %s\n' - as_echo_n='printf %s' -else - if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then - as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' - as_echo_n='/usr/ucb/echo -n' - else - as_echo_body='eval expr "X$1" : "X\\(.*\\)"' - as_echo_n_body='eval - arg=$1; - case $arg in #( - *"$as_nl"*) - expr "X$arg" : "X\\(.*\\)$as_nl"; - arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; - esac; - expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" - ' - export as_echo_n_body - as_echo_n='sh -c $as_echo_n_body as_echo' - fi - export as_echo_body - as_echo='sh -c $as_echo_body as_echo' -fi - -# The user is always right. -if test "${PATH_SEPARATOR+set}" != set; then - PATH_SEPARATOR=: - (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { - (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || - PATH_SEPARATOR=';' - } -fi - - -# IFS -# We need space, tab and new line, in precisely that order. Quoting is -# there to prevent editors from complaining about space-tab. -# (If _AS_PATH_WALK were called with IFS unset, it would disable word -# splitting by setting IFS to empty value.) -IFS=" "" $as_nl" - -# Find who we are. Look in the path if we contain no directory separator. -as_myself= -case $0 in #(( - *[\\/]* ) as_myself=$0 ;; - *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break - done -IFS=$as_save_IFS - - ;; -esac -# We did not find ourselves, most probably we were run as `sh COMMAND' -# in which case we are not to be found in the path. -if test "x$as_myself" = x; then - as_myself=$0 -fi -if test ! -f "$as_myself"; then - $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 - exit 1 -fi - -# Unset variables that we do not need and which cause bugs (e.g. in -# pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" -# suppresses any "Segmentation fault" message there. '((' could -# trigger a bug in pdksh 5.2.14. -for as_var in BASH_ENV ENV MAIL MAILPATH -do eval test x\${$as_var+set} = xset \ - && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : -done -PS1='$ ' -PS2='> ' -PS4='+ ' - -# NLS nuisances. -LC_ALL=C -export LC_ALL -LANGUAGE=C -export LANGUAGE - -# CDPATH. -(unset CDPATH) >/dev/null 2>&1 && unset CDPATH - -# Use a proper internal environment variable to ensure we don't fall - # into an infinite loop, continuously re-executing ourselves. - if test x"${_as_can_reexec}" != xno && test "x$CONFIG_SHELL" != x; then - _as_can_reexec=no; export _as_can_reexec; - # We cannot yet assume a decent shell, so we have to provide a -# neutralization value for shells without unset; and this also -# works around shells that cannot unset nonexistent variables. -# Preserve -v and -x to the replacement shell. -BASH_ENV=/dev/null -ENV=/dev/null -(unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV -case $- in # (((( - *v*x* | *x*v* ) as_opts=-vx ;; - *v* ) as_opts=-v ;; - *x* ) as_opts=-x ;; - * ) as_opts= ;; -esac -exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} -# Admittedly, this is quite paranoid, since all the known shells bail -# out after a failed `exec'. -$as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2 -as_fn_exit 255 - fi - # We don't want this to propagate to other subprocesses. - { _as_can_reexec=; unset _as_can_reexec;} -if test "x$CONFIG_SHELL" = x; then - as_bourne_compatible="if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then : - emulate sh - NULLCMD=: - # Pre-4.2 versions of Zsh do word splitting on \${1+\"\$@\"}, which - # is contrary to our usage. Disable this feature. - alias -g '\${1+\"\$@\"}'='\"\$@\"' - setopt NO_GLOB_SUBST -else - case \`(set -o) 2>/dev/null\` in #( - *posix*) : - set -o posix ;; #( - *) : - ;; -esac -fi -" - as_required="as_fn_return () { (exit \$1); } -as_fn_success () { as_fn_return 0; } -as_fn_failure () { as_fn_return 1; } -as_fn_ret_success () { return 0; } -as_fn_ret_failure () { return 1; } - -exitcode=0 -as_fn_success || { exitcode=1; echo as_fn_success failed.; } -as_fn_failure && { exitcode=1; echo as_fn_failure succeeded.; } -as_fn_ret_success || { exitcode=1; echo as_fn_ret_success failed.; } -as_fn_ret_failure && { exitcode=1; echo as_fn_ret_failure succeeded.; } -if ( set x; as_fn_ret_success y && test x = \"\$1\" ); then : - -else - exitcode=1; echo positional parameters were not saved. -fi -test x\$exitcode = x0 || exit 1 -test -x / || exit 1" - as_suggested=" as_lineno_1=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_1a=\$LINENO - as_lineno_2=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_2a=\$LINENO - eval 'test \"x\$as_lineno_1'\$as_run'\" != \"x\$as_lineno_2'\$as_run'\" && - test \"x\`expr \$as_lineno_1'\$as_run' + 1\`\" = \"x\$as_lineno_2'\$as_run'\"' || exit 1 - - test -n \"\${ZSH_VERSION+set}\${BASH_VERSION+set}\" || ( - ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' - ECHO=\$ECHO\$ECHO\$ECHO\$ECHO\$ECHO - ECHO=\$ECHO\$ECHO\$ECHO\$ECHO\$ECHO\$ECHO - PATH=/empty FPATH=/empty; export PATH FPATH - test \"X\`printf %s \$ECHO\`\" = \"X\$ECHO\" \\ - || test \"X\`print -r -- \$ECHO\`\" = \"X\$ECHO\" ) || exit 1 -test \$(( 1 + 1 )) = 2 || exit 1" - if (eval "$as_required") 2>/dev/null; then : - as_have_required=yes -else - as_have_required=no -fi - if test x$as_have_required = xyes && (eval "$as_suggested") 2>/dev/null; then : - -else - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -as_found=false -for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - as_found=: - case $as_dir in #( - /*) - for as_base in sh bash ksh sh5; do - # Try only shells that exist, to save several forks. - as_shell=$as_dir/$as_base - if { test -f "$as_shell" || test -f "$as_shell.exe"; } && - { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$as_shell"; } 2>/dev/null; then : - CONFIG_SHELL=$as_shell as_have_required=yes - if { $as_echo "$as_bourne_compatible""$as_suggested" | as_run=a "$as_shell"; } 2>/dev/null; then : - break 2 -fi -fi - done;; - esac - as_found=false -done -$as_found || { if { test -f "$SHELL" || test -f "$SHELL.exe"; } && - { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$SHELL"; } 2>/dev/null; then : - CONFIG_SHELL=$SHELL as_have_required=yes -fi; } -IFS=$as_save_IFS - - - if test "x$CONFIG_SHELL" != x; then : - export CONFIG_SHELL - # We cannot yet assume a decent shell, so we have to provide a -# neutralization value for shells without unset; and this also -# works around shells that cannot unset nonexistent variables. -# Preserve -v and -x to the replacement shell. -BASH_ENV=/dev/null -ENV=/dev/null -(unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV -case $- in # (((( - *v*x* | *x*v* ) as_opts=-vx ;; - *v* ) as_opts=-v ;; - *x* ) as_opts=-x ;; - * ) as_opts= ;; -esac -exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} -# Admittedly, this is quite paranoid, since all the known shells bail -# out after a failed `exec'. -$as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2 -exit 255 -fi - - if test x$as_have_required = xno; then : - $as_echo "$0: This script requires a shell more modern than all" - $as_echo "$0: the shells that I found on your system." - if test x${ZSH_VERSION+set} = xset ; then - $as_echo "$0: In particular, zsh $ZSH_VERSION has bugs and should" - $as_echo "$0: be upgraded to zsh 4.3.4 or later." - else - $as_echo "$0: Please tell bug-autoconf@gnu.org and -$0: user@zookeeper.apache.org about your system, including -$0: any error possibly output before this message. Then -$0: install a modern shell, or manually run the script -$0: under such a shell if you do have one." - fi - exit 1 -fi -fi -fi -SHELL=${CONFIG_SHELL-/bin/sh} -export SHELL -# Unset more variables known to interfere with behavior of common tools. -CLICOLOR_FORCE= GREP_OPTIONS= -unset CLICOLOR_FORCE GREP_OPTIONS - -## --------------------- ## -## M4sh Shell Functions. ## -## --------------------- ## -# as_fn_unset VAR -# --------------- -# Portably unset VAR. -as_fn_unset () -{ - { eval $1=; unset $1;} -} -as_unset=as_fn_unset - -# as_fn_set_status STATUS -# ----------------------- -# Set $? to STATUS, without forking. -as_fn_set_status () -{ - return $1 -} # as_fn_set_status - -# as_fn_exit STATUS -# ----------------- -# Exit the shell with STATUS, even in a "trap 0" or "set -e" context. -as_fn_exit () -{ - set +e - as_fn_set_status $1 - exit $1 -} # as_fn_exit - -# as_fn_mkdir_p -# ------------- -# Create "$as_dir" as a directory, including parents if necessary. -as_fn_mkdir_p () -{ - - case $as_dir in #( - -*) as_dir=./$as_dir;; - esac - test -d "$as_dir" || eval $as_mkdir_p || { - as_dirs= - while :; do - case $as_dir in #( - *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( - *) as_qdir=$as_dir;; - esac - as_dirs="'$as_qdir' $as_dirs" - as_dir=`$as_dirname -- "$as_dir" || -$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ - X"$as_dir" : 'X\(//\)[^/]' \| \ - X"$as_dir" : 'X\(//\)$' \| \ - X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || -$as_echo X"$as_dir" | - sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ - s//\1/ - q - } - /^X\(\/\/\)[^/].*/{ - s//\1/ - q - } - /^X\(\/\/\)$/{ - s//\1/ - q - } - /^X\(\/\).*/{ - s//\1/ - q - } - s/.*/./; q'` - test -d "$as_dir" && break - done - test -z "$as_dirs" || eval "mkdir $as_dirs" - } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" - - -} # as_fn_mkdir_p - -# as_fn_executable_p FILE -# ----------------------- -# Test if FILE is an executable regular file. -as_fn_executable_p () -{ - test -f "$1" && test -x "$1" -} # as_fn_executable_p -# as_fn_append VAR VALUE -# ---------------------- -# Append the text in VALUE to the end of the definition contained in VAR. Take -# advantage of any shell optimizations that allow amortized linear growth over -# repeated appends, instead of the typical quadratic growth present in naive -# implementations. -if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : - eval 'as_fn_append () - { - eval $1+=\$2 - }' -else - as_fn_append () - { - eval $1=\$$1\$2 - } -fi # as_fn_append - -# as_fn_arith ARG... -# ------------------ -# Perform arithmetic evaluation on the ARGs, and store the result in the -# global $as_val. Take advantage of shells that can avoid forks. The arguments -# must be portable across $(()) and expr. -if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : - eval 'as_fn_arith () - { - as_val=$(( $* )) - }' -else - as_fn_arith () - { - as_val=`expr "$@" || test $? -eq 1` - } -fi # as_fn_arith - - -# as_fn_error STATUS ERROR [LINENO LOG_FD] -# ---------------------------------------- -# Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are -# provided, also output the error to LOG_FD, referencing LINENO. Then exit the -# script with STATUS, using 1 if that was 0. -as_fn_error () -{ - as_status=$1; test $as_status -eq 0 && as_status=1 - if test "$4"; then - as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack - $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 - fi - $as_echo "$as_me: error: $2" >&2 - as_fn_exit $as_status -} # as_fn_error - -if expr a : '\(a\)' >/dev/null 2>&1 && - test "X`expr 00001 : '.*\(...\)'`" = X001; then - as_expr=expr -else - as_expr=false -fi - -if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then - as_basename=basename -else - as_basename=false -fi - -if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then - as_dirname=dirname -else - as_dirname=false -fi - -as_me=`$as_basename -- "$0" || -$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ - X"$0" : 'X\(//\)$' \| \ - X"$0" : 'X\(/\)' \| . 2>/dev/null || -$as_echo X/"$0" | - sed '/^.*\/\([^/][^/]*\)\/*$/{ - s//\1/ - q - } - /^X\/\(\/\/\)$/{ - s//\1/ - q - } - /^X\/\(\/\).*/{ - s//\1/ - q - } - s/.*/./; q'` - -# Avoid depending upon Character Ranges. -as_cr_letters='abcdefghijklmnopqrstuvwxyz' -as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' -as_cr_Letters=$as_cr_letters$as_cr_LETTERS -as_cr_digits='0123456789' -as_cr_alnum=$as_cr_Letters$as_cr_digits - - - as_lineno_1=$LINENO as_lineno_1a=$LINENO - as_lineno_2=$LINENO as_lineno_2a=$LINENO - eval 'test "x$as_lineno_1'$as_run'" != "x$as_lineno_2'$as_run'" && - test "x`expr $as_lineno_1'$as_run' + 1`" = "x$as_lineno_2'$as_run'"' || { - # Blame Lee E. McMahon (1931-1989) for sed's syntax. :-) - sed -n ' - p - /[$]LINENO/= - ' <$as_myself | - sed ' - s/[$]LINENO.*/&-/ - t lineno - b - :lineno - N - :loop - s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/ - t loop - s/-\n.*// - ' >$as_me.lineno && - chmod +x "$as_me.lineno" || - { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; } - - # If we had to re-execute with $CONFIG_SHELL, we're ensured to have - # already done that, so ensure we don't try to do so again and fall - # in an infinite loop. This has already happened in practice. - _as_can_reexec=no; export _as_can_reexec - # Don't try to exec as it changes $[0], causing all sort of problems - # (the dirname of $[0] is not the place where we might find the - # original and so on. Autoconf is especially sensitive to this). - . "./$as_me.lineno" - # Exit status is that of the last command. - exit -} - -ECHO_C= ECHO_N= ECHO_T= -case `echo -n x` in #((((( --n*) - case `echo 'xy\c'` in - *c*) ECHO_T=' ';; # ECHO_T is single tab character. - xy) ECHO_C='\c';; - *) echo `echo ksh88 bug on AIX 6.1` > /dev/null - ECHO_T=' ';; - esac;; -*) - ECHO_N='-n';; -esac - -rm -f conf$$ conf$$.exe conf$$.file -if test -d conf$$.dir; then - rm -f conf$$.dir/conf$$.file -else - rm -f conf$$.dir - mkdir conf$$.dir 2>/dev/null -fi -if (echo >conf$$.file) 2>/dev/null; then - if ln -s conf$$.file conf$$ 2>/dev/null; then - as_ln_s='ln -s' - # ... but there are two gotchas: - # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. - # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. - # In both cases, we have to default to `cp -pR'. - ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || - as_ln_s='cp -pR' - elif ln conf$$.file conf$$ 2>/dev/null; then - as_ln_s=ln - else - as_ln_s='cp -pR' - fi -else - as_ln_s='cp -pR' -fi -rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file -rmdir conf$$.dir 2>/dev/null - -if mkdir -p . 2>/dev/null; then - as_mkdir_p='mkdir -p "$as_dir"' -else - test -d ./-p && rmdir ./-p - as_mkdir_p=false -fi - -as_test_x='test -x' -as_executable_p=as_fn_executable_p - -# Sed expression to map a string onto a valid CPP name. -as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" - -# Sed expression to map a string onto a valid variable name. -as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" - -SHELL=${CONFIG_SHELL-/bin/sh} - - -test -n "$DJDIR" || exec 7<&0 &1 - -# Name of the host. -# hostname on some systems (SVR3.2, old GNU/Linux) returns a bogus exit status, -# so uname gets run too. -ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q` - -# -# Initializations. -# -ac_default_prefix=/usr/local -ac_clean_files= -ac_config_libobj_dir=. -LIBOBJS= -cross_compiling=no -subdirs= -MFLAGS= -MAKEFLAGS= - -# Identity of this package. -PACKAGE_NAME='zookeeper C client' -PACKAGE_TARNAME='zookeeper' -PACKAGE_VERSION='3.4.6' -PACKAGE_STRING='zookeeper C client 3.4.6' -PACKAGE_BUGREPORT='user@zookeeper.apache.org' -PACKAGE_URL='' - -ac_unique_file="src/zookeeper.c" -# Factoring default headers for most tests. -ac_includes_default="\ -#include -#ifdef HAVE_SYS_TYPES_H -# include -#endif -#ifdef HAVE_SYS_STAT_H -# include -#endif -#ifdef STDC_HEADERS -# include -# include -#else -# ifdef HAVE_STDLIB_H -# include -# endif -#endif -#ifdef HAVE_STRING_H -# if !defined STDC_HEADERS && defined HAVE_MEMORY_H -# include -# endif -# include -#endif -#ifdef HAVE_STRINGS_H -# include -#endif -#ifdef HAVE_INTTYPES_H -# include -#endif -#ifdef HAVE_STDINT_H -# include -#endif -#ifdef HAVE_UNISTD_H -# include -#endif" - -ac_subst_vars='am__EXEEXT_FALSE -am__EXEEXT_TRUE -LTLIBOBJS -LIBOBJS -USEIPV6 -WANT_SYNCAPI_FALSE -WANT_SYNCAPI_TRUE -CXXCPP -CPP -OTOOL64 -OTOOL -LIPO -NMEDIT -DSYMUTIL -MANIFEST_TOOL -RANLIB -ac_ct_AR -AR -DLLTOOL -OBJDUMP -NM -ac_ct_DUMPBIN -DUMPBIN -LD -FGREP -EGREP -GREP -SED -host_os -host_vendor -host_cpu -host -build_os -build_vendor -build_cpu -build -LIBTOOL -LN_S -am__fastdepCXX_FALSE -am__fastdepCXX_TRUE -CXXDEPMODE -ac_ct_CXX -CXXFLAGS -CXX -am__fastdepCC_FALSE -am__fastdepCC_TRUE -CCDEPMODE -am__nodep -AMDEPBACKSLASH -AMDEP_FALSE -AMDEP_TRUE -am__quote -am__include -DEPDIR -OBJEXT -EXEEXT -ac_ct_CC -CPPFLAGS -LDFLAGS -CFLAGS -CC -CPPUNIT_LIBS -CPPUNIT_CFLAGS -CPPUNIT_CONFIG -am__untar -am__tar -AMTAR -am__leading_dot -SET_MAKE -AWK -mkdir_p -MKDIR_P -INSTALL_STRIP_PROGRAM -STRIP -install_sh -MAKEINFO -AUTOHEADER -AUTOMAKE -AUTOCONF -ACLOCAL -VERSION -PACKAGE -CYGPATH_W -am__isrc -INSTALL_DATA -INSTALL_SCRIPT -INSTALL_PROGRAM -DOXYGEN_PAPER_SIZE -DX_COND_latex_FALSE -DX_COND_latex_TRUE -DX_COND_pdf_FALSE -DX_COND_pdf_TRUE -DX_PDFLATEX -DX_FLAG_pdf -DX_COND_ps_FALSE -DX_COND_ps_TRUE -DX_EGREP -DX_DVIPS -DX_MAKEINDEX -DX_LATEX -DX_FLAG_ps -DX_COND_html_FALSE -DX_COND_html_TRUE -DX_FLAG_html -DX_COND_chi_FALSE -DX_COND_chi_TRUE -DX_FLAG_chi -DX_COND_chm_FALSE -DX_COND_chm_TRUE -DX_HHC -DX_FLAG_chm -DX_COND_xml_FALSE -DX_COND_xml_TRUE -DX_FLAG_xml -DX_COND_rtf_FALSE -DX_COND_rtf_TRUE -DX_FLAG_rtf -DX_COND_man_FALSE -DX_COND_man_TRUE -DX_FLAG_man -DX_COND_dot_FALSE -DX_COND_dot_TRUE -DX_DOT -DX_FLAG_dot -DX_COND_doc_FALSE -DX_COND_doc_TRUE -DX_PERL -DX_DOXYGEN -DX_FLAG_doc -DX_ENV -DX_DOCDIR -DX_CONFIG -DX_PROJECT -target_alias -host_alias -build_alias -LIBS -ECHO_T -ECHO_N -ECHO_C -DEFS -mandir -localedir -libdir -psdir -pdfdir -dvidir -htmldir -infodir -docdir -oldincludedir -includedir -localstatedir -sharedstatedir -sysconfdir -datadir -datarootdir -libexecdir -sbindir -bindir -program_transform_name -prefix -exec_prefix -PACKAGE_URL -PACKAGE_BUGREPORT -PACKAGE_STRING -PACKAGE_VERSION -PACKAGE_TARNAME -PACKAGE_NAME -PATH_SEPARATOR -SHELL' -ac_subst_files='' -ac_user_opts=' -enable_option_checking -enable_doxygen_doc -enable_doxygen_dot -enable_doxygen_man -enable_doxygen_rtf -enable_doxygen_xml -enable_doxygen_chm -enable_doxygen_chi -enable_doxygen_html -enable_doxygen_ps -enable_doxygen_pdf -with_cppunit -with_cppunit_prefix -with_cppunit_exec_prefix -enable_dependency_tracking -enable_shared -enable_static -with_pic -enable_fast_install -with_gnu_ld -with_sysroot -enable_libtool_lock -enable_debug -with_syncapi -' - ac_precious_vars='build_alias -host_alias -target_alias -DOXYGEN_PAPER_SIZE -CC -CFLAGS -LDFLAGS -LIBS -CPPFLAGS -CXX -CXXFLAGS -CCC -CPP -CXXCPP' - - -# Initialize some variables set by options. -ac_init_help= -ac_init_version=false -ac_unrecognized_opts= -ac_unrecognized_sep= -# The variables have the same names as the options, with -# dashes changed to underlines. -cache_file=/dev/null -exec_prefix=NONE -no_create= -no_recursion= -prefix=NONE -program_prefix=NONE -program_suffix=NONE -program_transform_name=s,x,x, -silent= -site= -srcdir= -verbose= -x_includes=NONE -x_libraries=NONE - -# Installation directory options. -# These are left unexpanded so users can "make install exec_prefix=/foo" -# and all the variables that are supposed to be based on exec_prefix -# by default will actually change. -# Use braces instead of parens because sh, perl, etc. also accept them. -# (The list follows the same order as the GNU Coding Standards.) -bindir='${exec_prefix}/bin' -sbindir='${exec_prefix}/sbin' -libexecdir='${exec_prefix}/libexec' -datarootdir='${prefix}/share' -datadir='${datarootdir}' -sysconfdir='${prefix}/etc' -sharedstatedir='${prefix}/com' -localstatedir='${prefix}/var' -includedir='${prefix}/include' -oldincludedir='/usr/include' -docdir='${datarootdir}/doc/${PACKAGE_TARNAME}' -infodir='${datarootdir}/info' -htmldir='${docdir}' -dvidir='${docdir}' -pdfdir='${docdir}' -psdir='${docdir}' -libdir='${exec_prefix}/lib' -localedir='${datarootdir}/locale' -mandir='${datarootdir}/man' - -ac_prev= -ac_dashdash= -for ac_option -do - # If the previous option needs an argument, assign it. - if test -n "$ac_prev"; then - eval $ac_prev=\$ac_option - ac_prev= - continue - fi - - case $ac_option in - *=?*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;; - *=) ac_optarg= ;; - *) ac_optarg=yes ;; - esac - - # Accept the important Cygnus configure options, so we can diagnose typos. - - case $ac_dashdash$ac_option in - --) - ac_dashdash=yes ;; - - -bindir | --bindir | --bindi | --bind | --bin | --bi) - ac_prev=bindir ;; - -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*) - bindir=$ac_optarg ;; - - -build | --build | --buil | --bui | --bu) - ac_prev=build_alias ;; - -build=* | --build=* | --buil=* | --bui=* | --bu=*) - build_alias=$ac_optarg ;; - - -cache-file | --cache-file | --cache-fil | --cache-fi \ - | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c) - ac_prev=cache_file ;; - -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \ - | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*) - cache_file=$ac_optarg ;; - - --config-cache | -C) - cache_file=config.cache ;; - - -datadir | --datadir | --datadi | --datad) - ac_prev=datadir ;; - -datadir=* | --datadir=* | --datadi=* | --datad=*) - datadir=$ac_optarg ;; - - -datarootdir | --datarootdir | --datarootdi | --datarootd | --dataroot \ - | --dataroo | --dataro | --datar) - ac_prev=datarootdir ;; - -datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \ - | --dataroot=* | --dataroo=* | --dataro=* | --datar=*) - datarootdir=$ac_optarg ;; - - -disable-* | --disable-*) - ac_useropt=`expr "x$ac_option" : 'x-*disable-\(.*\)'` - # Reject names that are not valid shell variable names. - expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && - as_fn_error $? "invalid feature name: $ac_useropt" - ac_useropt_orig=$ac_useropt - ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` - case $ac_user_opts in - *" -"enable_$ac_useropt" -"*) ;; - *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--disable-$ac_useropt_orig" - ac_unrecognized_sep=', ';; - esac - eval enable_$ac_useropt=no ;; - - -docdir | --docdir | --docdi | --doc | --do) - ac_prev=docdir ;; - -docdir=* | --docdir=* | --docdi=* | --doc=* | --do=*) - docdir=$ac_optarg ;; - - -dvidir | --dvidir | --dvidi | --dvid | --dvi | --dv) - ac_prev=dvidir ;; - -dvidir=* | --dvidir=* | --dvidi=* | --dvid=* | --dvi=* | --dv=*) - dvidir=$ac_optarg ;; - - -enable-* | --enable-*) - ac_useropt=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'` - # Reject names that are not valid shell variable names. - expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && - as_fn_error $? "invalid feature name: $ac_useropt" - ac_useropt_orig=$ac_useropt - ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` - case $ac_user_opts in - *" -"enable_$ac_useropt" -"*) ;; - *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--enable-$ac_useropt_orig" - ac_unrecognized_sep=', ';; - esac - eval enable_$ac_useropt=\$ac_optarg ;; - - -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \ - | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \ - | --exec | --exe | --ex) - ac_prev=exec_prefix ;; - -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \ - | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \ - | --exec=* | --exe=* | --ex=*) - exec_prefix=$ac_optarg ;; - - -gas | --gas | --ga | --g) - # Obsolete; use --with-gas. - with_gas=yes ;; - - -help | --help | --hel | --he | -h) - ac_init_help=long ;; - -help=r* | --help=r* | --hel=r* | --he=r* | -hr*) - ac_init_help=recursive ;; - -help=s* | --help=s* | --hel=s* | --he=s* | -hs*) - ac_init_help=short ;; - - -host | --host | --hos | --ho) - ac_prev=host_alias ;; - -host=* | --host=* | --hos=* | --ho=*) - host_alias=$ac_optarg ;; - - -htmldir | --htmldir | --htmldi | --htmld | --html | --htm | --ht) - ac_prev=htmldir ;; - -htmldir=* | --htmldir=* | --htmldi=* | --htmld=* | --html=* | --htm=* \ - | --ht=*) - htmldir=$ac_optarg ;; - - -includedir | --includedir | --includedi | --included | --include \ - | --includ | --inclu | --incl | --inc) - ac_prev=includedir ;; - -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \ - | --includ=* | --inclu=* | --incl=* | --inc=*) - includedir=$ac_optarg ;; - - -infodir | --infodir | --infodi | --infod | --info | --inf) - ac_prev=infodir ;; - -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*) - infodir=$ac_optarg ;; - - -libdir | --libdir | --libdi | --libd) - ac_prev=libdir ;; - -libdir=* | --libdir=* | --libdi=* | --libd=*) - libdir=$ac_optarg ;; - - -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \ - | --libexe | --libex | --libe) - ac_prev=libexecdir ;; - -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \ - | --libexe=* | --libex=* | --libe=*) - libexecdir=$ac_optarg ;; - - -localedir | --localedir | --localedi | --localed | --locale) - ac_prev=localedir ;; - -localedir=* | --localedir=* | --localedi=* | --localed=* | --locale=*) - localedir=$ac_optarg ;; - - -localstatedir | --localstatedir | --localstatedi | --localstated \ - | --localstate | --localstat | --localsta | --localst | --locals) - ac_prev=localstatedir ;; - -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \ - | --localstate=* | --localstat=* | --localsta=* | --localst=* | --locals=*) - localstatedir=$ac_optarg ;; - - -mandir | --mandir | --mandi | --mand | --man | --ma | --m) - ac_prev=mandir ;; - -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*) - mandir=$ac_optarg ;; - - -nfp | --nfp | --nf) - # Obsolete; use --without-fp. - with_fp=no ;; - - -no-create | --no-create | --no-creat | --no-crea | --no-cre \ - | --no-cr | --no-c | -n) - no_create=yes ;; - - -no-recursion | --no-recursion | --no-recursio | --no-recursi \ - | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) - no_recursion=yes ;; - - -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \ - | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \ - | --oldin | --oldi | --old | --ol | --o) - ac_prev=oldincludedir ;; - -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \ - | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \ - | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*) - oldincludedir=$ac_optarg ;; - - -prefix | --prefix | --prefi | --pref | --pre | --pr | --p) - ac_prev=prefix ;; - -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*) - prefix=$ac_optarg ;; - - -program-prefix | --program-prefix | --program-prefi | --program-pref \ - | --program-pre | --program-pr | --program-p) - ac_prev=program_prefix ;; - -program-prefix=* | --program-prefix=* | --program-prefi=* \ - | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*) - program_prefix=$ac_optarg ;; - - -program-suffix | --program-suffix | --program-suffi | --program-suff \ - | --program-suf | --program-su | --program-s) - ac_prev=program_suffix ;; - -program-suffix=* | --program-suffix=* | --program-suffi=* \ - | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*) - program_suffix=$ac_optarg ;; - - -program-transform-name | --program-transform-name \ - | --program-transform-nam | --program-transform-na \ - | --program-transform-n | --program-transform- \ - | --program-transform | --program-transfor \ - | --program-transfo | --program-transf \ - | --program-trans | --program-tran \ - | --progr-tra | --program-tr | --program-t) - ac_prev=program_transform_name ;; - -program-transform-name=* | --program-transform-name=* \ - | --program-transform-nam=* | --program-transform-na=* \ - | --program-transform-n=* | --program-transform-=* \ - | --program-transform=* | --program-transfor=* \ - | --program-transfo=* | --program-transf=* \ - | --program-trans=* | --program-tran=* \ - | --progr-tra=* | --program-tr=* | --program-t=*) - program_transform_name=$ac_optarg ;; - - -pdfdir | --pdfdir | --pdfdi | --pdfd | --pdf | --pd) - ac_prev=pdfdir ;; - -pdfdir=* | --pdfdir=* | --pdfdi=* | --pdfd=* | --pdf=* | --pd=*) - pdfdir=$ac_optarg ;; - - -psdir | --psdir | --psdi | --psd | --ps) - ac_prev=psdir ;; - -psdir=* | --psdir=* | --psdi=* | --psd=* | --ps=*) - psdir=$ac_optarg ;; - - -q | -quiet | --quiet | --quie | --qui | --qu | --q \ - | -silent | --silent | --silen | --sile | --sil) - silent=yes ;; - - -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb) - ac_prev=sbindir ;; - -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \ - | --sbi=* | --sb=*) - sbindir=$ac_optarg ;; - - -sharedstatedir | --sharedstatedir | --sharedstatedi \ - | --sharedstated | --sharedstate | --sharedstat | --sharedsta \ - | --sharedst | --shareds | --shared | --share | --shar \ - | --sha | --sh) - ac_prev=sharedstatedir ;; - -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \ - | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \ - | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \ - | --sha=* | --sh=*) - sharedstatedir=$ac_optarg ;; - - -site | --site | --sit) - ac_prev=site ;; - -site=* | --site=* | --sit=*) - site=$ac_optarg ;; - - -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) - ac_prev=srcdir ;; - -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) - srcdir=$ac_optarg ;; - - -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \ - | --syscon | --sysco | --sysc | --sys | --sy) - ac_prev=sysconfdir ;; - -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \ - | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*) - sysconfdir=$ac_optarg ;; - - -target | --target | --targe | --targ | --tar | --ta | --t) - ac_prev=target_alias ;; - -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*) - target_alias=$ac_optarg ;; - - -v | -verbose | --verbose | --verbos | --verbo | --verb) - verbose=yes ;; - - -version | --version | --versio | --versi | --vers | -V) - ac_init_version=: ;; - - -with-* | --with-*) - ac_useropt=`expr "x$ac_option" : 'x-*with-\([^=]*\)'` - # Reject names that are not valid shell variable names. - expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && - as_fn_error $? "invalid package name: $ac_useropt" - ac_useropt_orig=$ac_useropt - ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` - case $ac_user_opts in - *" -"with_$ac_useropt" -"*) ;; - *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--with-$ac_useropt_orig" - ac_unrecognized_sep=', ';; - esac - eval with_$ac_useropt=\$ac_optarg ;; - - -without-* | --without-*) - ac_useropt=`expr "x$ac_option" : 'x-*without-\(.*\)'` - # Reject names that are not valid shell variable names. - expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && - as_fn_error $? "invalid package name: $ac_useropt" - ac_useropt_orig=$ac_useropt - ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` - case $ac_user_opts in - *" -"with_$ac_useropt" -"*) ;; - *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--without-$ac_useropt_orig" - ac_unrecognized_sep=', ';; - esac - eval with_$ac_useropt=no ;; - - --x) - # Obsolete; use --with-x. - with_x=yes ;; - - -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \ - | --x-incl | --x-inc | --x-in | --x-i) - ac_prev=x_includes ;; - -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \ - | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*) - x_includes=$ac_optarg ;; - - -x-libraries | --x-libraries | --x-librarie | --x-librari \ - | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l) - ac_prev=x_libraries ;; - -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \ - | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*) - x_libraries=$ac_optarg ;; - - -*) as_fn_error $? "unrecognized option: \`$ac_option' -Try \`$0 --help' for more information" - ;; - - *=*) - ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='` - # Reject names that are not valid shell variable names. - case $ac_envvar in #( - '' | [0-9]* | *[!_$as_cr_alnum]* ) - as_fn_error $? "invalid variable name: \`$ac_envvar'" ;; - esac - eval $ac_envvar=\$ac_optarg - export $ac_envvar ;; - - *) - # FIXME: should be removed in autoconf 3.0. - $as_echo "$as_me: WARNING: you should use --build, --host, --target" >&2 - expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null && - $as_echo "$as_me: WARNING: invalid host type: $ac_option" >&2 - : "${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}" - ;; - - esac -done - -if test -n "$ac_prev"; then - ac_option=--`echo $ac_prev | sed 's/_/-/g'` - as_fn_error $? "missing argument to $ac_option" -fi - -if test -n "$ac_unrecognized_opts"; then - case $enable_option_checking in - no) ;; - fatal) as_fn_error $? "unrecognized options: $ac_unrecognized_opts" ;; - *) $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 ;; - esac -fi - -# Check all directory arguments for consistency. -for ac_var in exec_prefix prefix bindir sbindir libexecdir datarootdir \ - datadir sysconfdir sharedstatedir localstatedir includedir \ - oldincludedir docdir infodir htmldir dvidir pdfdir psdir \ - libdir localedir mandir -do - eval ac_val=\$$ac_var - # Remove trailing slashes. - case $ac_val in - */ ) - ac_val=`expr "X$ac_val" : 'X\(.*[^/]\)' \| "X$ac_val" : 'X\(.*\)'` - eval $ac_var=\$ac_val;; - esac - # Be sure to have absolute directory names. - case $ac_val in - [\\/$]* | ?:[\\/]* ) continue;; - NONE | '' ) case $ac_var in *prefix ) continue;; esac;; - esac - as_fn_error $? "expected an absolute directory name for --$ac_var: $ac_val" -done - -# There might be people who depend on the old broken behavior: `$host' -# used to hold the argument of --host etc. -# FIXME: To remove some day. -build=$build_alias -host=$host_alias -target=$target_alias - -# FIXME: To remove some day. -if test "x$host_alias" != x; then - if test "x$build_alias" = x; then - cross_compiling=maybe - elif test "x$build_alias" != "x$host_alias"; then - cross_compiling=yes - fi -fi - -ac_tool_prefix= -test -n "$host_alias" && ac_tool_prefix=$host_alias- - -test "$silent" = yes && exec 6>/dev/null - - -ac_pwd=`pwd` && test -n "$ac_pwd" && -ac_ls_di=`ls -di .` && -ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` || - as_fn_error $? "working directory cannot be determined" -test "X$ac_ls_di" = "X$ac_pwd_ls_di" || - as_fn_error $? "pwd does not report name of working directory" - - -# Find the source files, if location was not specified. -if test -z "$srcdir"; then - ac_srcdir_defaulted=yes - # Try the directory containing this script, then the parent directory. - ac_confdir=`$as_dirname -- "$as_myself" || -$as_expr X"$as_myself" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ - X"$as_myself" : 'X\(//\)[^/]' \| \ - X"$as_myself" : 'X\(//\)$' \| \ - X"$as_myself" : 'X\(/\)' \| . 2>/dev/null || -$as_echo X"$as_myself" | - sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ - s//\1/ - q - } - /^X\(\/\/\)[^/].*/{ - s//\1/ - q - } - /^X\(\/\/\)$/{ - s//\1/ - q - } - /^X\(\/\).*/{ - s//\1/ - q - } - s/.*/./; q'` - srcdir=$ac_confdir - if test ! -r "$srcdir/$ac_unique_file"; then - srcdir=.. - fi -else - ac_srcdir_defaulted=no -fi -if test ! -r "$srcdir/$ac_unique_file"; then - test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .." - as_fn_error $? "cannot find sources ($ac_unique_file) in $srcdir" -fi -ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work" -ac_abs_confdir=`( - cd "$srcdir" && test -r "./$ac_unique_file" || as_fn_error $? "$ac_msg" - pwd)` -# When building in place, set srcdir=. -if test "$ac_abs_confdir" = "$ac_pwd"; then - srcdir=. -fi -# Remove unnecessary trailing slashes from srcdir. -# Double slashes in file names in object file debugging info -# mess up M-x gdb in Emacs. -case $srcdir in -*/) srcdir=`expr "X$srcdir" : 'X\(.*[^/]\)' \| "X$srcdir" : 'X\(.*\)'`;; -esac -for ac_var in $ac_precious_vars; do - eval ac_env_${ac_var}_set=\${${ac_var}+set} - eval ac_env_${ac_var}_value=\$${ac_var} - eval ac_cv_env_${ac_var}_set=\${${ac_var}+set} - eval ac_cv_env_${ac_var}_value=\$${ac_var} -done - -# -# Report the --help message. -# -if test "$ac_init_help" = "long"; then - # Omit some internal or obsolete options to make the list less imposing. - # This message is too long to be a string in the A/UX 3.1 sh. - cat <<_ACEOF -\`configure' configures zookeeper C client 3.4.6 to adapt to many kinds of systems. - -Usage: $0 [OPTION]... [VAR=VALUE]... - -To assign environment variables (e.g., CC, CFLAGS...), specify them as -VAR=VALUE. See below for descriptions of some of the useful variables. - -Defaults for the options are specified in brackets. - -Configuration: - -h, --help display this help and exit - --help=short display options specific to this package - --help=recursive display the short help of all the included packages - -V, --version display version information and exit - -q, --quiet, --silent do not print \`checking ...' messages - --cache-file=FILE cache test results in FILE [disabled] - -C, --config-cache alias for \`--cache-file=config.cache' - -n, --no-create do not create output files - --srcdir=DIR find the sources in DIR [configure dir or \`..'] - -Installation directories: - --prefix=PREFIX install architecture-independent files in PREFIX - [$ac_default_prefix] - --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX - [PREFIX] - -By default, \`make install' will install all the files in -\`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc. You can specify -an installation prefix other than \`$ac_default_prefix' using \`--prefix', -for instance \`--prefix=\$HOME'. - -For better control, use the options below. - -Fine tuning of the installation directories: - --bindir=DIR user executables [EPREFIX/bin] - --sbindir=DIR system admin executables [EPREFIX/sbin] - --libexecdir=DIR program executables [EPREFIX/libexec] - --sysconfdir=DIR read-only single-machine data [PREFIX/etc] - --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com] - --localstatedir=DIR modifiable single-machine data [PREFIX/var] - --libdir=DIR object code libraries [EPREFIX/lib] - --includedir=DIR C header files [PREFIX/include] - --oldincludedir=DIR C header files for non-gcc [/usr/include] - --datarootdir=DIR read-only arch.-independent data root [PREFIX/share] - --datadir=DIR read-only architecture-independent data [DATAROOTDIR] - --infodir=DIR info documentation [DATAROOTDIR/info] - --localedir=DIR locale-dependent data [DATAROOTDIR/locale] - --mandir=DIR man documentation [DATAROOTDIR/man] - --docdir=DIR documentation root [DATAROOTDIR/doc/zookeeper] - --htmldir=DIR html documentation [DOCDIR] - --dvidir=DIR dvi documentation [DOCDIR] - --pdfdir=DIR pdf documentation [DOCDIR] - --psdir=DIR ps documentation [DOCDIR] -_ACEOF - - cat <<\_ACEOF - -Program names: - --program-prefix=PREFIX prepend PREFIX to installed program names - --program-suffix=SUFFIX append SUFFIX to installed program names - --program-transform-name=PROGRAM run sed PROGRAM on installed program names - -System types: - --build=BUILD configure for building on BUILD [guessed] - --host=HOST cross-compile to build programs to run on HOST [BUILD] -_ACEOF -fi - -if test -n "$ac_init_help"; then - case $ac_init_help in - short | recursive ) echo "Configuration of zookeeper C client 3.4.6:";; - esac - cat <<\_ACEOF - -Optional Features: - --disable-option-checking ignore unrecognized --enable/--with options - --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) - --enable-FEATURE[=ARG] include FEATURE [ARG=yes] - --disable-doxygen-doc don't generate any doxygen documentation - --disable-doxygen-dot don't generate graphics for doxygen documentation - --enable-doxygen-man generate doxygen manual pages - --enable-doxygen-rtf generate doxygen RTF documentation - --enable-doxygen-xml generate doxygen XML documentation - --enable-doxygen-chm generate doxygen compressed HTML help documentation - --enable-doxygen-chi generate doxygen seperate compressed HTML help index - file - --disable-doxygen-html don't generate doxygen plain HTML documentation - --enable-doxygen-ps generate doxygen PostScript documentation - --enable-doxygen-pdf generate doxygen PDF documentation - --disable-dependency-tracking speeds up one-time build - --enable-dependency-tracking do not reject slow dependency extractors - --enable-shared[=PKGS] build shared libraries [default=yes] - --enable-static[=PKGS] build static libraries [default=yes] - --enable-fast-install[=PKGS] - optimize for fast installation [default=yes] - --disable-libtool-lock avoid locking (might break parallel builds) - --enable-debug enable debug build [default=no] - -Optional Packages: - --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] - --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) - --without-cppunit do not use CPPUNIT - --with-cppunit-prefix=PFX Prefix where CppUnit is installed (optional) - --with-cppunit-exec-prefix=PFX Exec prefix where CppUnit is installed (optional) - --with-pic[=PKGS] try to use only PIC/non-PIC objects [default=use - both] - --with-gnu-ld assume the C compiler uses GNU ld [default=no] - --with-sysroot=DIR Search for dependent libraries within DIR - (or the compiler's sysroot if not specified). - --with-syncapi build with support for SyncAPI [default=yes] - -Some influential environment variables: - DOXYGEN_PAPER_SIZE - a4wide (default), a4, letter, legal or executive - CC C compiler command - CFLAGS C compiler flags - LDFLAGS linker flags, e.g. -L if you have libraries in a - nonstandard directory - LIBS libraries to pass to the linker, e.g. -l - CPPFLAGS (Objective) C/C++ preprocessor flags, e.g. -I if - you have headers in a nonstandard directory - CXX C++ compiler command - CXXFLAGS C++ compiler flags - CPP C preprocessor - CXXCPP C++ preprocessor - -Use these variables to override the choices made by `configure' or to help -it to find libraries and programs with nonstandard names/locations. - -Report bugs to . -_ACEOF -ac_status=$? -fi - -if test "$ac_init_help" = "recursive"; then - # If there are subdirs, report their specific --help. - for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue - test -d "$ac_dir" || - { cd "$srcdir" && ac_pwd=`pwd` && srcdir=. && test -d "$ac_dir"; } || - continue - ac_builddir=. - -case "$ac_dir" in -.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; -*) - ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` - # A ".." for each directory in $ac_dir_suffix. - ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` - case $ac_top_builddir_sub in - "") ac_top_builddir_sub=. ac_top_build_prefix= ;; - *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; - esac ;; -esac -ac_abs_top_builddir=$ac_pwd -ac_abs_builddir=$ac_pwd$ac_dir_suffix -# for backward compatibility: -ac_top_builddir=$ac_top_build_prefix - -case $srcdir in - .) # We are building in place. - ac_srcdir=. - ac_top_srcdir=$ac_top_builddir_sub - ac_abs_top_srcdir=$ac_pwd ;; - [\\/]* | ?:[\\/]* ) # Absolute name. - ac_srcdir=$srcdir$ac_dir_suffix; - ac_top_srcdir=$srcdir - ac_abs_top_srcdir=$srcdir ;; - *) # Relative name. - ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix - ac_top_srcdir=$ac_top_build_prefix$srcdir - ac_abs_top_srcdir=$ac_pwd/$srcdir ;; -esac -ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix - - cd "$ac_dir" || { ac_status=$?; continue; } - # Check for guested configure. - if test -f "$ac_srcdir/configure.gnu"; then - echo && - $SHELL "$ac_srcdir/configure.gnu" --help=recursive - elif test -f "$ac_srcdir/configure"; then - echo && - $SHELL "$ac_srcdir/configure" --help=recursive - else - $as_echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2 - fi || ac_status=$? - cd "$ac_pwd" || { ac_status=$?; break; } - done -fi - -test -n "$ac_init_help" && exit $ac_status -if $ac_init_version; then - cat <<\_ACEOF -zookeeper C client configure 3.4.6 -generated by GNU Autoconf 2.69 - -Copyright (C) 2012 Free Software Foundation, Inc. -This configure script is free software; the Free Software Foundation -gives unlimited permission to copy, distribute and modify it. -_ACEOF - exit -fi - -## ------------------------ ## -## Autoconf initialization. ## -## ------------------------ ## - -# ac_fn_c_try_compile LINENO -# -------------------------- -# Try to compile conftest.$ac_ext, and return whether this succeeded. -ac_fn_c_try_compile () -{ - as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack - rm -f conftest.$ac_objext - if { { ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 - (eval "$ac_compile") 2>conftest.err - ac_status=$? - if test -s conftest.err; then - grep -v '^ *+' conftest.err >conftest.er1 - cat conftest.er1 >&5 - mv -f conftest.er1 conftest.err - fi - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then : - ac_retval=0 -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_retval=1 -fi - eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno - as_fn_set_status $ac_retval - -} # ac_fn_c_try_compile - -# ac_fn_cxx_try_compile LINENO -# ---------------------------- -# Try to compile conftest.$ac_ext, and return whether this succeeded. -ac_fn_cxx_try_compile () -{ - as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack - rm -f conftest.$ac_objext - if { { ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 - (eval "$ac_compile") 2>conftest.err - ac_status=$? - if test -s conftest.err; then - grep -v '^ *+' conftest.err >conftest.er1 - cat conftest.er1 >&5 - mv -f conftest.er1 conftest.err - fi - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } && { - test -z "$ac_cxx_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then : - ac_retval=0 -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_retval=1 -fi - eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno - as_fn_set_status $ac_retval - -} # ac_fn_cxx_try_compile - -# ac_fn_c_try_link LINENO -# ----------------------- -# Try to link conftest.$ac_ext, and return whether this succeeded. -ac_fn_c_try_link () -{ - as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack - rm -f conftest.$ac_objext conftest$ac_exeext - if { { ac_try="$ac_link" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 - (eval "$ac_link") 2>conftest.err - ac_status=$? - if test -s conftest.err; then - grep -v '^ *+' conftest.err >conftest.er1 - cat conftest.er1 >&5 - mv -f conftest.er1 conftest.err - fi - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest$ac_exeext && { - test "$cross_compiling" = yes || - test -x conftest$ac_exeext - }; then : - ac_retval=0 -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_retval=1 -fi - # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information - # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would - # interfere with the next link command; also delete a directory that is - # left behind by Apple's compiler. We do this before executing the actions. - rm -rf conftest.dSYM conftest_ipa8_conftest.oo - eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno - as_fn_set_status $ac_retval - -} # ac_fn_c_try_link - -# ac_fn_c_check_header_compile LINENO HEADER VAR INCLUDES -# ------------------------------------------------------- -# Tests whether HEADER exists and can be compiled using the include files in -# INCLUDES, setting the cache variable VAR accordingly. -ac_fn_c_check_header_compile () -{ - as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 -$as_echo_n "checking for $2... " >&6; } -if eval \${$3+:} false; then : - $as_echo_n "(cached) " >&6 -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -$4 -#include <$2> -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - eval "$3=yes" -else - eval "$3=no" -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -fi -eval ac_res=\$$3 - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 -$as_echo "$ac_res" >&6; } - eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno - -} # ac_fn_c_check_header_compile - -# ac_fn_c_try_cpp LINENO -# ---------------------- -# Try to preprocess conftest.$ac_ext, and return whether this succeeded. -ac_fn_c_try_cpp () -{ - as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack - if { { ac_try="$ac_cpp conftest.$ac_ext" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 - (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err - ac_status=$? - if test -s conftest.err; then - grep -v '^ *+' conftest.err >conftest.er1 - cat conftest.er1 >&5 - mv -f conftest.er1 conftest.err - fi - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } > conftest.i && { - test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || - test ! -s conftest.err - }; then : - ac_retval=0 -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_retval=1 -fi - eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno - as_fn_set_status $ac_retval - -} # ac_fn_c_try_cpp - -# ac_fn_c_try_run LINENO -# ---------------------- -# Try to link conftest.$ac_ext, and return whether this succeeded. Assumes -# that executables *can* be run. -ac_fn_c_try_run () -{ - as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack - if { { ac_try="$ac_link" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 - (eval "$ac_link") 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } && { ac_try='./conftest$ac_exeext' - { { case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 - (eval "$ac_try") 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; }; }; then : - ac_retval=0 -else - $as_echo "$as_me: program exited with status $ac_status" >&5 - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_retval=$ac_status -fi - rm -rf conftest.dSYM conftest_ipa8_conftest.oo - eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno - as_fn_set_status $ac_retval - -} # ac_fn_c_try_run - -# ac_fn_c_check_func LINENO FUNC VAR -# ---------------------------------- -# Tests whether FUNC exists, setting the cache variable VAR accordingly -ac_fn_c_check_func () -{ - as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 -$as_echo_n "checking for $2... " >&6; } -if eval \${$3+:} false; then : - $as_echo_n "(cached) " >&6 -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -/* Define $2 to an innocuous variant, in case declares $2. - For example, HP-UX 11i declares gettimeofday. */ -#define $2 innocuous_$2 - -/* System header to define __stub macros and hopefully few prototypes, - which can conflict with char $2 (); below. - Prefer to if __STDC__ is defined, since - exists even on freestanding compilers. */ - -#ifdef __STDC__ -# include -#else -# include -#endif - -#undef $2 - -/* Override any GCC internal prototype to avoid an error. - Use char because int might match the return type of a GCC - builtin and then its argument prototype would still apply. */ -#ifdef __cplusplus -extern "C" -#endif -char $2 (); -/* The GNU C library defines this for functions which it implements - to always fail with ENOSYS. Some functions are actually named - something starting with __ and the normal name is an alias. */ -#if defined __stub_$2 || defined __stub___$2 -choke me -#endif - -int -main () -{ -return $2 (); - ; - return 0; -} -_ACEOF -if ac_fn_c_try_link "$LINENO"; then : - eval "$3=yes" -else - eval "$3=no" -fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext -fi -eval ac_res=\$$3 - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 -$as_echo "$ac_res" >&6; } - eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno - -} # ac_fn_c_check_func - -# ac_fn_cxx_try_cpp LINENO -# ------------------------ -# Try to preprocess conftest.$ac_ext, and return whether this succeeded. -ac_fn_cxx_try_cpp () -{ - as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack - if { { ac_try="$ac_cpp conftest.$ac_ext" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 - (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err - ac_status=$? - if test -s conftest.err; then - grep -v '^ *+' conftest.err >conftest.er1 - cat conftest.er1 >&5 - mv -f conftest.er1 conftest.err - fi - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } > conftest.i && { - test -z "$ac_cxx_preproc_warn_flag$ac_cxx_werror_flag" || - test ! -s conftest.err - }; then : - ac_retval=0 -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_retval=1 -fi - eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno - as_fn_set_status $ac_retval - -} # ac_fn_cxx_try_cpp - -# ac_fn_cxx_try_link LINENO -# ------------------------- -# Try to link conftest.$ac_ext, and return whether this succeeded. -ac_fn_cxx_try_link () -{ - as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack - rm -f conftest.$ac_objext conftest$ac_exeext - if { { ac_try="$ac_link" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 - (eval "$ac_link") 2>conftest.err - ac_status=$? - if test -s conftest.err; then - grep -v '^ *+' conftest.err >conftest.er1 - cat conftest.er1 >&5 - mv -f conftest.er1 conftest.err - fi - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } && { - test -z "$ac_cxx_werror_flag" || - test ! -s conftest.err - } && test -s conftest$ac_exeext && { - test "$cross_compiling" = yes || - test -x conftest$ac_exeext - }; then : - ac_retval=0 -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_retval=1 -fi - # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information - # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would - # interfere with the next link command; also delete a directory that is - # left behind by Apple's compiler. We do this before executing the actions. - rm -rf conftest.dSYM conftest_ipa8_conftest.oo - eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno - as_fn_set_status $ac_retval - -} # ac_fn_cxx_try_link - -# ac_fn_c_check_header_mongrel LINENO HEADER VAR INCLUDES -# ------------------------------------------------------- -# Tests whether HEADER exists, giving a warning if it cannot be compiled using -# the include files in INCLUDES and setting the cache variable VAR -# accordingly. -ac_fn_c_check_header_mongrel () -{ - as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack - if eval \${$3+:} false; then : - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 -$as_echo_n "checking for $2... " >&6; } -if eval \${$3+:} false; then : - $as_echo_n "(cached) " >&6 -fi -eval ac_res=\$$3 - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 -$as_echo "$ac_res" >&6; } -else - # Is the header compilable? -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 usability" >&5 -$as_echo_n "checking $2 usability... " >&6; } -cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -$4 -#include <$2> -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - ac_header_compiler=yes -else - ac_header_compiler=no -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_compiler" >&5 -$as_echo "$ac_header_compiler" >&6; } - -# Is the header present? -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 presence" >&5 -$as_echo_n "checking $2 presence... " >&6; } -cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include <$2> -_ACEOF -if ac_fn_c_try_cpp "$LINENO"; then : - ac_header_preproc=yes -else - ac_header_preproc=no -fi -rm -f conftest.err conftest.i conftest.$ac_ext -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_preproc" >&5 -$as_echo "$ac_header_preproc" >&6; } - -# So? What about this header? -case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in #(( - yes:no: ) - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&5 -$as_echo "$as_me: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&2;} - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 -$as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} - ;; - no:yes:* ) - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: present but cannot be compiled" >&5 -$as_echo "$as_me: WARNING: $2: present but cannot be compiled" >&2;} - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: check for missing prerequisite headers?" >&5 -$as_echo "$as_me: WARNING: $2: check for missing prerequisite headers?" >&2;} - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: see the Autoconf documentation" >&5 -$as_echo "$as_me: WARNING: $2: see the Autoconf documentation" >&2;} - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&5 -$as_echo "$as_me: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&2;} - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 -$as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} -( $as_echo "## ---------------------------------------- ## -## Report this to user@zookeeper.apache.org ## -## ---------------------------------------- ##" - ) | sed "s/^/$as_me: WARNING: /" >&2 - ;; -esac - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 -$as_echo_n "checking for $2... " >&6; } -if eval \${$3+:} false; then : - $as_echo_n "(cached) " >&6 -else - eval "$3=\$ac_header_compiler" -fi -eval ac_res=\$$3 - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 -$as_echo "$ac_res" >&6; } -fi - eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno - -} # ac_fn_c_check_header_mongrel - -# ac_fn_c_check_type LINENO TYPE VAR INCLUDES -# ------------------------------------------- -# Tests whether TYPE exists after having included INCLUDES, setting cache -# variable VAR accordingly. -ac_fn_c_check_type () -{ - as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 -$as_echo_n "checking for $2... " >&6; } -if eval \${$3+:} false; then : - $as_echo_n "(cached) " >&6 -else - eval "$3=no" - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -$4 -int -main () -{ -if (sizeof ($2)) - return 0; - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -$4 -int -main () -{ -if (sizeof (($2))) - return 0; - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - -else - eval "$3=yes" -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -fi -eval ac_res=\$$3 - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 -$as_echo "$ac_res" >&6; } - eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno - -} # ac_fn_c_check_type -cat >config.log <<_ACEOF -This file contains any messages produced by compilers while -running configure, to aid debugging if configure makes a mistake. - -It was created by zookeeper C client $as_me 3.4.6, which was -generated by GNU Autoconf 2.69. Invocation command line was - - $ $0 $@ - -_ACEOF -exec 5>>config.log -{ -cat <<_ASUNAME -## --------- ## -## Platform. ## -## --------- ## - -hostname = `(hostname || uname -n) 2>/dev/null | sed 1q` -uname -m = `(uname -m) 2>/dev/null || echo unknown` -uname -r = `(uname -r) 2>/dev/null || echo unknown` -uname -s = `(uname -s) 2>/dev/null || echo unknown` -uname -v = `(uname -v) 2>/dev/null || echo unknown` - -/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown` -/bin/uname -X = `(/bin/uname -X) 2>/dev/null || echo unknown` - -/bin/arch = `(/bin/arch) 2>/dev/null || echo unknown` -/usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null || echo unknown` -/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown` -/usr/bin/hostinfo = `(/usr/bin/hostinfo) 2>/dev/null || echo unknown` -/bin/machine = `(/bin/machine) 2>/dev/null || echo unknown` -/usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null || echo unknown` -/bin/universe = `(/bin/universe) 2>/dev/null || echo unknown` - -_ASUNAME - -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - $as_echo "PATH: $as_dir" - done -IFS=$as_save_IFS - -} >&5 - -cat >&5 <<_ACEOF - - -## ----------- ## -## Core tests. ## -## ----------- ## - -_ACEOF - - -# Keep a trace of the command line. -# Strip out --no-create and --no-recursion so they do not pile up. -# Strip out --silent because we don't want to record it for future runs. -# Also quote any args containing shell meta-characters. -# Make two passes to allow for proper duplicate-argument suppression. -ac_configure_args= -ac_configure_args0= -ac_configure_args1= -ac_must_keep_next=false -for ac_pass in 1 2 -do - for ac_arg - do - case $ac_arg in - -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;; - -q | -quiet | --quiet | --quie | --qui | --qu | --q \ - | -silent | --silent | --silen | --sile | --sil) - continue ;; - *\'*) - ac_arg=`$as_echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; - esac - case $ac_pass in - 1) as_fn_append ac_configure_args0 " '$ac_arg'" ;; - 2) - as_fn_append ac_configure_args1 " '$ac_arg'" - if test $ac_must_keep_next = true; then - ac_must_keep_next=false # Got value, back to normal. - else - case $ac_arg in - *=* | --config-cache | -C | -disable-* | --disable-* \ - | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \ - | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \ - | -with-* | --with-* | -without-* | --without-* | --x) - case "$ac_configure_args0 " in - "$ac_configure_args1"*" '$ac_arg' "* ) continue ;; - esac - ;; - -* ) ac_must_keep_next=true ;; - esac - fi - as_fn_append ac_configure_args " '$ac_arg'" - ;; - esac - done -done -{ ac_configure_args0=; unset ac_configure_args0;} -{ ac_configure_args1=; unset ac_configure_args1;} - -# When interrupted or exit'd, cleanup temporary files, and complete -# config.log. We remove comments because anyway the quotes in there -# would cause problems or look ugly. -# WARNING: Use '\'' to represent an apostrophe within the trap. -# WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug. -trap 'exit_status=$? - # Save into config.log some information that might help in debugging. - { - echo - - $as_echo "## ---------------- ## -## Cache variables. ## -## ---------------- ##" - echo - # The following way of writing the cache mishandles newlines in values, -( - for ac_var in `(set) 2>&1 | sed -n '\''s/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'\''`; do - eval ac_val=\$$ac_var - case $ac_val in #( - *${as_nl}*) - case $ac_var in #( - *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 -$as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; - esac - case $ac_var in #( - _ | IFS | as_nl) ;; #( - BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( - *) { eval $ac_var=; unset $ac_var;} ;; - esac ;; - esac - done - (set) 2>&1 | - case $as_nl`(ac_space='\'' '\''; set) 2>&1` in #( - *${as_nl}ac_space=\ *) - sed -n \ - "s/'\''/'\''\\\\'\'''\''/g; - s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\''\\2'\''/p" - ;; #( - *) - sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" - ;; - esac | - sort -) - echo - - $as_echo "## ----------------- ## -## Output variables. ## -## ----------------- ##" - echo - for ac_var in $ac_subst_vars - do - eval ac_val=\$$ac_var - case $ac_val in - *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; - esac - $as_echo "$ac_var='\''$ac_val'\''" - done | sort - echo - - if test -n "$ac_subst_files"; then - $as_echo "## ------------------- ## -## File substitutions. ## -## ------------------- ##" - echo - for ac_var in $ac_subst_files - do - eval ac_val=\$$ac_var - case $ac_val in - *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; - esac - $as_echo "$ac_var='\''$ac_val'\''" - done | sort - echo - fi - - if test -s confdefs.h; then - $as_echo "## ----------- ## -## confdefs.h. ## -## ----------- ##" - echo - cat confdefs.h - echo - fi - test "$ac_signal" != 0 && - $as_echo "$as_me: caught signal $ac_signal" - $as_echo "$as_me: exit $exit_status" - } >&5 - rm -f core *.core core.conftest.* && - rm -f -r conftest* confdefs* conf$$* $ac_clean_files && - exit $exit_status -' 0 -for ac_signal in 1 2 13 15; do - trap 'ac_signal='$ac_signal'; as_fn_exit 1' $ac_signal -done -ac_signal=0 - -# confdefs.h avoids OS command line length limits that DEFS can exceed. -rm -f -r conftest* confdefs.h - -$as_echo "/* confdefs.h */" > confdefs.h - -# Predefined preprocessor variables. - -cat >>confdefs.h <<_ACEOF -#define PACKAGE_NAME "$PACKAGE_NAME" -_ACEOF - -cat >>confdefs.h <<_ACEOF -#define PACKAGE_TARNAME "$PACKAGE_TARNAME" -_ACEOF - -cat >>confdefs.h <<_ACEOF -#define PACKAGE_VERSION "$PACKAGE_VERSION" -_ACEOF - -cat >>confdefs.h <<_ACEOF -#define PACKAGE_STRING "$PACKAGE_STRING" -_ACEOF - -cat >>confdefs.h <<_ACEOF -#define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT" -_ACEOF - -cat >>confdefs.h <<_ACEOF -#define PACKAGE_URL "$PACKAGE_URL" -_ACEOF - - -# Let the site file select an alternate cache file if it wants to. -# Prefer an explicitly selected file to automatically selected ones. -ac_site_file1=NONE -ac_site_file2=NONE -if test -n "$CONFIG_SITE"; then - # We do not want a PATH search for config.site. - case $CONFIG_SITE in #(( - -*) ac_site_file1=./$CONFIG_SITE;; - */*) ac_site_file1=$CONFIG_SITE;; - *) ac_site_file1=./$CONFIG_SITE;; - esac -elif test "x$prefix" != xNONE; then - ac_site_file1=$prefix/share/config.site - ac_site_file2=$prefix/etc/config.site -else - ac_site_file1=$ac_default_prefix/share/config.site - ac_site_file2=$ac_default_prefix/etc/config.site -fi -for ac_site_file in "$ac_site_file1" "$ac_site_file2" -do - test "x$ac_site_file" = xNONE && continue - if test /dev/null != "$ac_site_file" && test -r "$ac_site_file"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: loading site script $ac_site_file" >&5 -$as_echo "$as_me: loading site script $ac_site_file" >&6;} - sed 's/^/| /' "$ac_site_file" >&5 - . "$ac_site_file" \ - || { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 -$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} -as_fn_error $? "failed to load site script $ac_site_file -See \`config.log' for more details" "$LINENO" 5; } - fi -done - -if test -r "$cache_file"; then - # Some versions of bash will fail to source /dev/null (special files - # actually), so we avoid doing that. DJGPP emulates it as a regular file. - if test /dev/null != "$cache_file" && test -f "$cache_file"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: loading cache $cache_file" >&5 -$as_echo "$as_me: loading cache $cache_file" >&6;} - case $cache_file in - [\\/]* | ?:[\\/]* ) . "$cache_file";; - *) . "./$cache_file";; - esac - fi -else - { $as_echo "$as_me:${as_lineno-$LINENO}: creating cache $cache_file" >&5 -$as_echo "$as_me: creating cache $cache_file" >&6;} - >$cache_file -fi - -# Check that the precious variables saved in the cache have kept the same -# value. -ac_cache_corrupted=false -for ac_var in $ac_precious_vars; do - eval ac_old_set=\$ac_cv_env_${ac_var}_set - eval ac_new_set=\$ac_env_${ac_var}_set - eval ac_old_val=\$ac_cv_env_${ac_var}_value - eval ac_new_val=\$ac_env_${ac_var}_value - case $ac_old_set,$ac_new_set in - set,) - { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5 -$as_echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;} - ac_cache_corrupted=: ;; - ,set) - { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was not set in the previous run" >&5 -$as_echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;} - ac_cache_corrupted=: ;; - ,);; - *) - if test "x$ac_old_val" != "x$ac_new_val"; then - # differences in whitespace do not lead to failure. - ac_old_val_w=`echo x $ac_old_val` - ac_new_val_w=`echo x $ac_new_val` - if test "$ac_old_val_w" != "$ac_new_val_w"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' has changed since the previous run:" >&5 -$as_echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;} - ac_cache_corrupted=: - else - { $as_echo "$as_me:${as_lineno-$LINENO}: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&5 -$as_echo "$as_me: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&2;} - eval $ac_var=\$ac_old_val - fi - { $as_echo "$as_me:${as_lineno-$LINENO}: former value: \`$ac_old_val'" >&5 -$as_echo "$as_me: former value: \`$ac_old_val'" >&2;} - { $as_echo "$as_me:${as_lineno-$LINENO}: current value: \`$ac_new_val'" >&5 -$as_echo "$as_me: current value: \`$ac_new_val'" >&2;} - fi;; - esac - # Pass precious variables to config.status. - if test "$ac_new_set" = set; then - case $ac_new_val in - *\'*) ac_arg=$ac_var=`$as_echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;; - *) ac_arg=$ac_var=$ac_new_val ;; - esac - case " $ac_configure_args " in - *" '$ac_arg' "*) ;; # Avoid dups. Use of quotes ensures accuracy. - *) as_fn_append ac_configure_args " '$ac_arg'" ;; - esac - fi -done -if $ac_cache_corrupted; then - { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 -$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} - { $as_echo "$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build" >&5 -$as_echo "$as_me: error: changes in the environment can compromise the build" >&2;} - as_fn_error $? "run \`make distclean' and/or \`rm $cache_file' and start over" "$LINENO" 5 -fi -## -------------------- ## -## Main body of script. ## -## -------------------- ## - -ac_ext=c -ac_cpp='$CPP $CPPFLAGS' -ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_c_compiler_gnu - - - - -# Save initial CFLAGS and CXXFLAGS values before AC_PROG_CC and AC_PROG_CXX -init_cflags="$CFLAGS" -init_cxxflags="$CXXFLAGS" - -# initialize Doxygen support - - - - - - - - - - -# Files: -DX_PROJECT=zookeeper - -DX_CONFIG=c-doc.Doxyfile - -DX_DOCDIR=docs - - -# Environment variables used inside doxygen.cfg: -DX_ENV="$DX_ENV SRCDIR='$srcdir'" - -DX_ENV="$DX_ENV PROJECT='$DX_PROJECT'" - -DX_ENV="$DX_ENV DOCDIR='$DX_DOCDIR'" - -DX_ENV="$DX_ENV VERSION='$PACKAGE_VERSION'" - - -# Doxygen itself: - - - - # Check whether --enable-doxygen-doc was given. -if test "${enable_doxygen_doc+set}" = set; then : - enableval=$enable_doxygen_doc; -case "$enableval" in -#( -y|Y|yes|Yes|YES) - DX_FLAG_doc=1 - - -;; #( -n|N|no|No|NO) - DX_FLAG_doc=0 - -;; #( -*) - as_fn_error $? "invalid value '$enableval' given to doxygen-doc" "$LINENO" 5 -;; -esac - -else - -DX_FLAG_doc=1 - - - -fi - -if test "$DX_FLAG_doc" = 1; then - -if test -n "$ac_tool_prefix"; then - # Extract the first word of "${ac_tool_prefix}doxygen", so it can be a program name with args. -set dummy ${ac_tool_prefix}doxygen; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_path_DX_DOXYGEN+:} false; then : - $as_echo_n "(cached) " >&6 -else - case $DX_DOXYGEN in - [\\/]* | ?:[\\/]*) - ac_cv_path_DX_DOXYGEN="$DX_DOXYGEN" # Let the user override the test with a path. - ;; - *) - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_path_DX_DOXYGEN="$as_dir/$ac_word$ac_exec_ext" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - - ;; -esac -fi -DX_DOXYGEN=$ac_cv_path_DX_DOXYGEN -if test -n "$DX_DOXYGEN"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DX_DOXYGEN" >&5 -$as_echo "$DX_DOXYGEN" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - -fi -if test -z "$ac_cv_path_DX_DOXYGEN"; then - ac_pt_DX_DOXYGEN=$DX_DOXYGEN - # Extract the first word of "doxygen", so it can be a program name with args. -set dummy doxygen; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_path_ac_pt_DX_DOXYGEN+:} false; then : - $as_echo_n "(cached) " >&6 -else - case $ac_pt_DX_DOXYGEN in - [\\/]* | ?:[\\/]*) - ac_cv_path_ac_pt_DX_DOXYGEN="$ac_pt_DX_DOXYGEN" # Let the user override the test with a path. - ;; - *) - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_path_ac_pt_DX_DOXYGEN="$as_dir/$ac_word$ac_exec_ext" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - - ;; -esac -fi -ac_pt_DX_DOXYGEN=$ac_cv_path_ac_pt_DX_DOXYGEN -if test -n "$ac_pt_DX_DOXYGEN"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_pt_DX_DOXYGEN" >&5 -$as_echo "$ac_pt_DX_DOXYGEN" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - if test "x$ac_pt_DX_DOXYGEN" = x; then - DX_DOXYGEN="" - else - case $cross_compiling:$ac_tool_warned in -yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} -ac_tool_warned=yes ;; -esac - DX_DOXYGEN=$ac_pt_DX_DOXYGEN - fi -else - DX_DOXYGEN="$ac_cv_path_DX_DOXYGEN" -fi - -if test "$DX_FLAG_$DX_CURRENT_FEATURE$DX_DOXYGEN" = 1; then - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: doxygen not found - will not generate any doxygen documentation" >&5 -$as_echo "$as_me: WARNING: doxygen not found - will not generate any doxygen documentation" >&2;} - DX_FLAG_doc=0 - -fi - - -if test -n "$ac_tool_prefix"; then - # Extract the first word of "${ac_tool_prefix}perl", so it can be a program name with args. -set dummy ${ac_tool_prefix}perl; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_path_DX_PERL+:} false; then : - $as_echo_n "(cached) " >&6 -else - case $DX_PERL in - [\\/]* | ?:[\\/]*) - ac_cv_path_DX_PERL="$DX_PERL" # Let the user override the test with a path. - ;; - *) - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_path_DX_PERL="$as_dir/$ac_word$ac_exec_ext" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - - ;; -esac -fi -DX_PERL=$ac_cv_path_DX_PERL -if test -n "$DX_PERL"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DX_PERL" >&5 -$as_echo "$DX_PERL" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - -fi -if test -z "$ac_cv_path_DX_PERL"; then - ac_pt_DX_PERL=$DX_PERL - # Extract the first word of "perl", so it can be a program name with args. -set dummy perl; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_path_ac_pt_DX_PERL+:} false; then : - $as_echo_n "(cached) " >&6 -else - case $ac_pt_DX_PERL in - [\\/]* | ?:[\\/]*) - ac_cv_path_ac_pt_DX_PERL="$ac_pt_DX_PERL" # Let the user override the test with a path. - ;; - *) - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_path_ac_pt_DX_PERL="$as_dir/$ac_word$ac_exec_ext" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - - ;; -esac -fi -ac_pt_DX_PERL=$ac_cv_path_ac_pt_DX_PERL -if test -n "$ac_pt_DX_PERL"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_pt_DX_PERL" >&5 -$as_echo "$ac_pt_DX_PERL" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - if test "x$ac_pt_DX_PERL" = x; then - DX_PERL="" - else - case $cross_compiling:$ac_tool_warned in -yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} -ac_tool_warned=yes ;; -esac - DX_PERL=$ac_pt_DX_PERL - fi -else - DX_PERL="$ac_cv_path_DX_PERL" -fi - -if test "$DX_FLAG_$DX_CURRENT_FEATURE$DX_PERL" = 1; then - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: perl not found - will not generate any doxygen documentation" >&5 -$as_echo "$as_me: WARNING: perl not found - will not generate any doxygen documentation" >&2;} - DX_FLAG_doc=0 - -fi - - : -fi -if test "$DX_FLAG_doc" = 1; then - if :; then - DX_COND_doc_TRUE= - DX_COND_doc_FALSE='#' -else - DX_COND_doc_TRUE='#' - DX_COND_doc_FALSE= -fi - - DX_ENV="$DX_ENV PERL_PATH='$DX_PERL'" - - : -else - if false; then - DX_COND_doc_TRUE= - DX_COND_doc_FALSE='#' -else - DX_COND_doc_TRUE='#' - DX_COND_doc_FALSE= -fi - - - : -fi - - -# Dot for graphics: - - - - # Check whether --enable-doxygen-dot was given. -if test "${enable_doxygen_dot+set}" = set; then : - enableval=$enable_doxygen_dot; -case "$enableval" in -#( -y|Y|yes|Yes|YES) - DX_FLAG_dot=1 - - -test "$DX_FLAG_doc" = "1" \ -|| as_fn_error $? "doxygen-dot requires doxygen-dot" "$LINENO" 5 - -;; #( -n|N|no|No|NO) - DX_FLAG_dot=0 - -;; #( -*) - as_fn_error $? "invalid value '$enableval' given to doxygen-dot" "$LINENO" 5 -;; -esac - -else - -DX_FLAG_dot=1 - - -test "$DX_FLAG_doc" = "1" || DX_FLAG_dot=0 - - - -fi - -if test "$DX_FLAG_dot" = 1; then - -if test -n "$ac_tool_prefix"; then - # Extract the first word of "${ac_tool_prefix}dot", so it can be a program name with args. -set dummy ${ac_tool_prefix}dot; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_path_DX_DOT+:} false; then : - $as_echo_n "(cached) " >&6 -else - case $DX_DOT in - [\\/]* | ?:[\\/]*) - ac_cv_path_DX_DOT="$DX_DOT" # Let the user override the test with a path. - ;; - *) - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_path_DX_DOT="$as_dir/$ac_word$ac_exec_ext" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - - ;; -esac -fi -DX_DOT=$ac_cv_path_DX_DOT -if test -n "$DX_DOT"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DX_DOT" >&5 -$as_echo "$DX_DOT" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - -fi -if test -z "$ac_cv_path_DX_DOT"; then - ac_pt_DX_DOT=$DX_DOT - # Extract the first word of "dot", so it can be a program name with args. -set dummy dot; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_path_ac_pt_DX_DOT+:} false; then : - $as_echo_n "(cached) " >&6 -else - case $ac_pt_DX_DOT in - [\\/]* | ?:[\\/]*) - ac_cv_path_ac_pt_DX_DOT="$ac_pt_DX_DOT" # Let the user override the test with a path. - ;; - *) - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_path_ac_pt_DX_DOT="$as_dir/$ac_word$ac_exec_ext" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - - ;; -esac -fi -ac_pt_DX_DOT=$ac_cv_path_ac_pt_DX_DOT -if test -n "$ac_pt_DX_DOT"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_pt_DX_DOT" >&5 -$as_echo "$ac_pt_DX_DOT" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - if test "x$ac_pt_DX_DOT" = x; then - DX_DOT="" - else - case $cross_compiling:$ac_tool_warned in -yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} -ac_tool_warned=yes ;; -esac - DX_DOT=$ac_pt_DX_DOT - fi -else - DX_DOT="$ac_cv_path_DX_DOT" -fi - -if test "$DX_FLAG_$DX_CURRENT_FEATURE$DX_DOT" = 1; then - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: dot not found - will not generate graphics for doxygen documentation" >&5 -$as_echo "$as_me: WARNING: dot not found - will not generate graphics for doxygen documentation" >&2;} - DX_FLAG_dot=0 - -fi - - : -fi -if test "$DX_FLAG_dot" = 1; then - if :; then - DX_COND_dot_TRUE= - DX_COND_dot_FALSE='#' -else - DX_COND_dot_TRUE='#' - DX_COND_dot_FALSE= -fi - - DX_ENV="$DX_ENV HAVE_DOT='YES'" - - DX_ENV="$DX_ENV DOT_PATH='`expr ".$DX_DOT" : '\(\.\)[^/]*$' \| "x$DX_DOT" : 'x\(.*\)/[^/]*$'`'" - - : -else - if false; then - DX_COND_dot_TRUE= - DX_COND_dot_FALSE='#' -else - DX_COND_dot_TRUE='#' - DX_COND_dot_FALSE= -fi - - DX_ENV="$DX_ENV HAVE_DOT='NO'" - - : -fi - - -# Man pages generation: - - - - # Check whether --enable-doxygen-man was given. -if test "${enable_doxygen_man+set}" = set; then : - enableval=$enable_doxygen_man; -case "$enableval" in -#( -y|Y|yes|Yes|YES) - DX_FLAG_man=1 - - -test "$DX_FLAG_doc" = "1" \ -|| as_fn_error $? "doxygen-man requires doxygen-man" "$LINENO" 5 - -;; #( -n|N|no|No|NO) - DX_FLAG_man=0 - -;; #( -*) - as_fn_error $? "invalid value '$enableval' given to doxygen-man" "$LINENO" 5 -;; -esac - -else - -DX_FLAG_man=0 - - -test "$DX_FLAG_doc" = "1" || DX_FLAG_man=0 - - - -fi - -if test "$DX_FLAG_man" = 1; then - - : -fi -if test "$DX_FLAG_man" = 1; then - if :; then - DX_COND_man_TRUE= - DX_COND_man_FALSE='#' -else - DX_COND_man_TRUE='#' - DX_COND_man_FALSE= -fi - - DX_ENV="$DX_ENV GENERATE_MAN='YES'" - - : -else - if false; then - DX_COND_man_TRUE= - DX_COND_man_FALSE='#' -else - DX_COND_man_TRUE='#' - DX_COND_man_FALSE= -fi - - DX_ENV="$DX_ENV GENERATE_MAN='NO'" - - : -fi - - -# RTF file generation: - - - - # Check whether --enable-doxygen-rtf was given. -if test "${enable_doxygen_rtf+set}" = set; then : - enableval=$enable_doxygen_rtf; -case "$enableval" in -#( -y|Y|yes|Yes|YES) - DX_FLAG_rtf=1 - - -test "$DX_FLAG_doc" = "1" \ -|| as_fn_error $? "doxygen-rtf requires doxygen-rtf" "$LINENO" 5 - -;; #( -n|N|no|No|NO) - DX_FLAG_rtf=0 - -;; #( -*) - as_fn_error $? "invalid value '$enableval' given to doxygen-rtf" "$LINENO" 5 -;; -esac - -else - -DX_FLAG_rtf=0 - - -test "$DX_FLAG_doc" = "1" || DX_FLAG_rtf=0 - - - -fi - -if test "$DX_FLAG_rtf" = 1; then - - : -fi -if test "$DX_FLAG_rtf" = 1; then - if :; then - DX_COND_rtf_TRUE= - DX_COND_rtf_FALSE='#' -else - DX_COND_rtf_TRUE='#' - DX_COND_rtf_FALSE= -fi - - DX_ENV="$DX_ENV GENERATE_RTF='YES'" - - : -else - if false; then - DX_COND_rtf_TRUE= - DX_COND_rtf_FALSE='#' -else - DX_COND_rtf_TRUE='#' - DX_COND_rtf_FALSE= -fi - - DX_ENV="$DX_ENV GENERATE_RTF='NO'" - - : -fi - - -# XML file generation: - - - - # Check whether --enable-doxygen-xml was given. -if test "${enable_doxygen_xml+set}" = set; then : - enableval=$enable_doxygen_xml; -case "$enableval" in -#( -y|Y|yes|Yes|YES) - DX_FLAG_xml=1 - - -test "$DX_FLAG_doc" = "1" \ -|| as_fn_error $? "doxygen-xml requires doxygen-xml" "$LINENO" 5 - -;; #( -n|N|no|No|NO) - DX_FLAG_xml=0 - -;; #( -*) - as_fn_error $? "invalid value '$enableval' given to doxygen-xml" "$LINENO" 5 -;; -esac - -else - -DX_FLAG_xml=0 - - -test "$DX_FLAG_doc" = "1" || DX_FLAG_xml=0 - - - -fi - -if test "$DX_FLAG_xml" = 1; then - - : -fi -if test "$DX_FLAG_xml" = 1; then - if :; then - DX_COND_xml_TRUE= - DX_COND_xml_FALSE='#' -else - DX_COND_xml_TRUE='#' - DX_COND_xml_FALSE= -fi - - DX_ENV="$DX_ENV GENERATE_XML='YES'" - - : -else - if false; then - DX_COND_xml_TRUE= - DX_COND_xml_FALSE='#' -else - DX_COND_xml_TRUE='#' - DX_COND_xml_FALSE= -fi - - DX_ENV="$DX_ENV GENERATE_XML='NO'" - - : -fi - - -# (Compressed) HTML help generation: - - - - # Check whether --enable-doxygen-chm was given. -if test "${enable_doxygen_chm+set}" = set; then : - enableval=$enable_doxygen_chm; -case "$enableval" in -#( -y|Y|yes|Yes|YES) - DX_FLAG_chm=1 - - -test "$DX_FLAG_doc" = "1" \ -|| as_fn_error $? "doxygen-chm requires doxygen-chm" "$LINENO" 5 - -;; #( -n|N|no|No|NO) - DX_FLAG_chm=0 - -;; #( -*) - as_fn_error $? "invalid value '$enableval' given to doxygen-chm" "$LINENO" 5 -;; -esac - -else - -DX_FLAG_chm=0 - - -test "$DX_FLAG_doc" = "1" || DX_FLAG_chm=0 - - - -fi - -if test "$DX_FLAG_chm" = 1; then - -if test -n "$ac_tool_prefix"; then - # Extract the first word of "${ac_tool_prefix}hhc", so it can be a program name with args. -set dummy ${ac_tool_prefix}hhc; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_path_DX_HHC+:} false; then : - $as_echo_n "(cached) " >&6 -else - case $DX_HHC in - [\\/]* | ?:[\\/]*) - ac_cv_path_DX_HHC="$DX_HHC" # Let the user override the test with a path. - ;; - *) - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_path_DX_HHC="$as_dir/$ac_word$ac_exec_ext" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - - ;; -esac -fi -DX_HHC=$ac_cv_path_DX_HHC -if test -n "$DX_HHC"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DX_HHC" >&5 -$as_echo "$DX_HHC" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - -fi -if test -z "$ac_cv_path_DX_HHC"; then - ac_pt_DX_HHC=$DX_HHC - # Extract the first word of "hhc", so it can be a program name with args. -set dummy hhc; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_path_ac_pt_DX_HHC+:} false; then : - $as_echo_n "(cached) " >&6 -else - case $ac_pt_DX_HHC in - [\\/]* | ?:[\\/]*) - ac_cv_path_ac_pt_DX_HHC="$ac_pt_DX_HHC" # Let the user override the test with a path. - ;; - *) - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_path_ac_pt_DX_HHC="$as_dir/$ac_word$ac_exec_ext" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - - ;; -esac -fi -ac_pt_DX_HHC=$ac_cv_path_ac_pt_DX_HHC -if test -n "$ac_pt_DX_HHC"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_pt_DX_HHC" >&5 -$as_echo "$ac_pt_DX_HHC" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - if test "x$ac_pt_DX_HHC" = x; then - DX_HHC="" - else - case $cross_compiling:$ac_tool_warned in -yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} -ac_tool_warned=yes ;; -esac - DX_HHC=$ac_pt_DX_HHC - fi -else - DX_HHC="$ac_cv_path_DX_HHC" -fi - -if test "$DX_FLAG_$DX_CURRENT_FEATURE$DX_HHC" = 1; then - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: hhc not found - will not generate doxygen compressed HTML help documentation" >&5 -$as_echo "$as_me: WARNING: hhc not found - will not generate doxygen compressed HTML help documentation" >&2;} - DX_FLAG_chm=0 - -fi - - : -fi -if test "$DX_FLAG_chm" = 1; then - if :; then - DX_COND_chm_TRUE= - DX_COND_chm_FALSE='#' -else - DX_COND_chm_TRUE='#' - DX_COND_chm_FALSE= -fi - - DX_ENV="$DX_ENV HHC_PATH='$DX_HHC'" - - DX_ENV="$DX_ENV GENERATE_HTML='YES'" - - DX_ENV="$DX_ENV GENERATE_HTMLHELP='YES'" - - : -else - if false; then - DX_COND_chm_TRUE= - DX_COND_chm_FALSE='#' -else - DX_COND_chm_TRUE='#' - DX_COND_chm_FALSE= -fi - - DX_ENV="$DX_ENV GENERATE_HTMLHELP='NO'" - - : -fi - - -# Seperate CHI file generation. - - - - # Check whether --enable-doxygen-chi was given. -if test "${enable_doxygen_chi+set}" = set; then : - enableval=$enable_doxygen_chi; -case "$enableval" in -#( -y|Y|yes|Yes|YES) - DX_FLAG_chi=1 - - -test "$DX_FLAG_chm" = "1" \ -|| as_fn_error $? "doxygen-chi requires doxygen-chi" "$LINENO" 5 - -;; #( -n|N|no|No|NO) - DX_FLAG_chi=0 - -;; #( -*) - as_fn_error $? "invalid value '$enableval' given to doxygen-chi" "$LINENO" 5 -;; -esac - -else - -DX_FLAG_chi=0 - - -test "$DX_FLAG_chm" = "1" || DX_FLAG_chi=0 - - - -fi - -if test "$DX_FLAG_chi" = 1; then - - : -fi -if test "$DX_FLAG_chi" = 1; then - if :; then - DX_COND_chi_TRUE= - DX_COND_chi_FALSE='#' -else - DX_COND_chi_TRUE='#' - DX_COND_chi_FALSE= -fi - - DX_ENV="$DX_ENV GENERATE_CHI='YES'" - - : -else - if false; then - DX_COND_chi_TRUE= - DX_COND_chi_FALSE='#' -else - DX_COND_chi_TRUE='#' - DX_COND_chi_FALSE= -fi - - DX_ENV="$DX_ENV GENERATE_CHI='NO'" - - : -fi - - -# Plain HTML pages generation: - - - - # Check whether --enable-doxygen-html was given. -if test "${enable_doxygen_html+set}" = set; then : - enableval=$enable_doxygen_html; -case "$enableval" in -#( -y|Y|yes|Yes|YES) - DX_FLAG_html=1 - - -test "$DX_FLAG_doc" = "1" \ -|| as_fn_error $? "doxygen-html requires doxygen-html" "$LINENO" 5 - -test "$DX_FLAG_chm" = "0" \ -|| as_fn_error $? "doxygen-html contradicts doxygen-html" "$LINENO" 5 - -;; #( -n|N|no|No|NO) - DX_FLAG_html=0 - -;; #( -*) - as_fn_error $? "invalid value '$enableval' given to doxygen-html" "$LINENO" 5 -;; -esac - -else - -DX_FLAG_html=1 - - -test "$DX_FLAG_doc" = "1" || DX_FLAG_html=0 - - -test "$DX_FLAG_chm" = "0" || DX_FLAG_html=0 - - - -fi - -if test "$DX_FLAG_html" = 1; then - - : -fi -if test "$DX_FLAG_html" = 1; then - if :; then - DX_COND_html_TRUE= - DX_COND_html_FALSE='#' -else - DX_COND_html_TRUE='#' - DX_COND_html_FALSE= -fi - - DX_ENV="$DX_ENV GENERATE_HTML='YES'" - - : -else - if false; then - DX_COND_html_TRUE= - DX_COND_html_FALSE='#' -else - DX_COND_html_TRUE='#' - DX_COND_html_FALSE= -fi - - test "$DX_FLAG_chm" = 1 || DX_ENV="$DX_ENV GENERATE_HTML='NO'" - - : -fi - - -# PostScript file generation: - - - - # Check whether --enable-doxygen-ps was given. -if test "${enable_doxygen_ps+set}" = set; then : - enableval=$enable_doxygen_ps; -case "$enableval" in -#( -y|Y|yes|Yes|YES) - DX_FLAG_ps=1 - - -test "$DX_FLAG_doc" = "1" \ -|| as_fn_error $? "doxygen-ps requires doxygen-ps" "$LINENO" 5 - -;; #( -n|N|no|No|NO) - DX_FLAG_ps=0 - -;; #( -*) - as_fn_error $? "invalid value '$enableval' given to doxygen-ps" "$LINENO" 5 -;; -esac - -else - -DX_FLAG_ps=0 - - -test "$DX_FLAG_doc" = "1" || DX_FLAG_ps=0 - - - -fi - -if test "$DX_FLAG_ps" = 1; then - -if test -n "$ac_tool_prefix"; then - # Extract the first word of "${ac_tool_prefix}latex", so it can be a program name with args. -set dummy ${ac_tool_prefix}latex; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_path_DX_LATEX+:} false; then : - $as_echo_n "(cached) " >&6 -else - case $DX_LATEX in - [\\/]* | ?:[\\/]*) - ac_cv_path_DX_LATEX="$DX_LATEX" # Let the user override the test with a path. - ;; - *) - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_path_DX_LATEX="$as_dir/$ac_word$ac_exec_ext" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - - ;; -esac -fi -DX_LATEX=$ac_cv_path_DX_LATEX -if test -n "$DX_LATEX"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DX_LATEX" >&5 -$as_echo "$DX_LATEX" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - -fi -if test -z "$ac_cv_path_DX_LATEX"; then - ac_pt_DX_LATEX=$DX_LATEX - # Extract the first word of "latex", so it can be a program name with args. -set dummy latex; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_path_ac_pt_DX_LATEX+:} false; then : - $as_echo_n "(cached) " >&6 -else - case $ac_pt_DX_LATEX in - [\\/]* | ?:[\\/]*) - ac_cv_path_ac_pt_DX_LATEX="$ac_pt_DX_LATEX" # Let the user override the test with a path. - ;; - *) - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_path_ac_pt_DX_LATEX="$as_dir/$ac_word$ac_exec_ext" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - - ;; -esac -fi -ac_pt_DX_LATEX=$ac_cv_path_ac_pt_DX_LATEX -if test -n "$ac_pt_DX_LATEX"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_pt_DX_LATEX" >&5 -$as_echo "$ac_pt_DX_LATEX" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - if test "x$ac_pt_DX_LATEX" = x; then - DX_LATEX="" - else - case $cross_compiling:$ac_tool_warned in -yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} -ac_tool_warned=yes ;; -esac - DX_LATEX=$ac_pt_DX_LATEX - fi -else - DX_LATEX="$ac_cv_path_DX_LATEX" -fi - -if test "$DX_FLAG_$DX_CURRENT_FEATURE$DX_LATEX" = 1; then - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: latex not found - will not generate doxygen PostScript documentation" >&5 -$as_echo "$as_me: WARNING: latex not found - will not generate doxygen PostScript documentation" >&2;} - DX_FLAG_ps=0 - -fi - - -if test -n "$ac_tool_prefix"; then - # Extract the first word of "${ac_tool_prefix}makeindex", so it can be a program name with args. -set dummy ${ac_tool_prefix}makeindex; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_path_DX_MAKEINDEX+:} false; then : - $as_echo_n "(cached) " >&6 -else - case $DX_MAKEINDEX in - [\\/]* | ?:[\\/]*) - ac_cv_path_DX_MAKEINDEX="$DX_MAKEINDEX" # Let the user override the test with a path. - ;; - *) - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_path_DX_MAKEINDEX="$as_dir/$ac_word$ac_exec_ext" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - - ;; -esac -fi -DX_MAKEINDEX=$ac_cv_path_DX_MAKEINDEX -if test -n "$DX_MAKEINDEX"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DX_MAKEINDEX" >&5 -$as_echo "$DX_MAKEINDEX" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - -fi -if test -z "$ac_cv_path_DX_MAKEINDEX"; then - ac_pt_DX_MAKEINDEX=$DX_MAKEINDEX - # Extract the first word of "makeindex", so it can be a program name with args. -set dummy makeindex; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_path_ac_pt_DX_MAKEINDEX+:} false; then : - $as_echo_n "(cached) " >&6 -else - case $ac_pt_DX_MAKEINDEX in - [\\/]* | ?:[\\/]*) - ac_cv_path_ac_pt_DX_MAKEINDEX="$ac_pt_DX_MAKEINDEX" # Let the user override the test with a path. - ;; - *) - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_path_ac_pt_DX_MAKEINDEX="$as_dir/$ac_word$ac_exec_ext" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - - ;; -esac -fi -ac_pt_DX_MAKEINDEX=$ac_cv_path_ac_pt_DX_MAKEINDEX -if test -n "$ac_pt_DX_MAKEINDEX"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_pt_DX_MAKEINDEX" >&5 -$as_echo "$ac_pt_DX_MAKEINDEX" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - if test "x$ac_pt_DX_MAKEINDEX" = x; then - DX_MAKEINDEX="" - else - case $cross_compiling:$ac_tool_warned in -yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} -ac_tool_warned=yes ;; -esac - DX_MAKEINDEX=$ac_pt_DX_MAKEINDEX - fi -else - DX_MAKEINDEX="$ac_cv_path_DX_MAKEINDEX" -fi - -if test "$DX_FLAG_$DX_CURRENT_FEATURE$DX_MAKEINDEX" = 1; then - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: makeindex not found - will not generate doxygen PostScript documentation" >&5 -$as_echo "$as_me: WARNING: makeindex not found - will not generate doxygen PostScript documentation" >&2;} - DX_FLAG_ps=0 - -fi - - -if test -n "$ac_tool_prefix"; then - # Extract the first word of "${ac_tool_prefix}dvips", so it can be a program name with args. -set dummy ${ac_tool_prefix}dvips; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_path_DX_DVIPS+:} false; then : - $as_echo_n "(cached) " >&6 -else - case $DX_DVIPS in - [\\/]* | ?:[\\/]*) - ac_cv_path_DX_DVIPS="$DX_DVIPS" # Let the user override the test with a path. - ;; - *) - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_path_DX_DVIPS="$as_dir/$ac_word$ac_exec_ext" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - - ;; -esac -fi -DX_DVIPS=$ac_cv_path_DX_DVIPS -if test -n "$DX_DVIPS"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DX_DVIPS" >&5 -$as_echo "$DX_DVIPS" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - -fi -if test -z "$ac_cv_path_DX_DVIPS"; then - ac_pt_DX_DVIPS=$DX_DVIPS - # Extract the first word of "dvips", so it can be a program name with args. -set dummy dvips; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_path_ac_pt_DX_DVIPS+:} false; then : - $as_echo_n "(cached) " >&6 -else - case $ac_pt_DX_DVIPS in - [\\/]* | ?:[\\/]*) - ac_cv_path_ac_pt_DX_DVIPS="$ac_pt_DX_DVIPS" # Let the user override the test with a path. - ;; - *) - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_path_ac_pt_DX_DVIPS="$as_dir/$ac_word$ac_exec_ext" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - - ;; -esac -fi -ac_pt_DX_DVIPS=$ac_cv_path_ac_pt_DX_DVIPS -if test -n "$ac_pt_DX_DVIPS"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_pt_DX_DVIPS" >&5 -$as_echo "$ac_pt_DX_DVIPS" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - if test "x$ac_pt_DX_DVIPS" = x; then - DX_DVIPS="" - else - case $cross_compiling:$ac_tool_warned in -yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} -ac_tool_warned=yes ;; -esac - DX_DVIPS=$ac_pt_DX_DVIPS - fi -else - DX_DVIPS="$ac_cv_path_DX_DVIPS" -fi - -if test "$DX_FLAG_$DX_CURRENT_FEATURE$DX_DVIPS" = 1; then - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: dvips not found - will not generate doxygen PostScript documentation" >&5 -$as_echo "$as_me: WARNING: dvips not found - will not generate doxygen PostScript documentation" >&2;} - DX_FLAG_ps=0 - -fi - - -if test -n "$ac_tool_prefix"; then - # Extract the first word of "${ac_tool_prefix}egrep", so it can be a program name with args. -set dummy ${ac_tool_prefix}egrep; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_path_DX_EGREP+:} false; then : - $as_echo_n "(cached) " >&6 -else - case $DX_EGREP in - [\\/]* | ?:[\\/]*) - ac_cv_path_DX_EGREP="$DX_EGREP" # Let the user override the test with a path. - ;; - *) - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_path_DX_EGREP="$as_dir/$ac_word$ac_exec_ext" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - - ;; -esac -fi -DX_EGREP=$ac_cv_path_DX_EGREP -if test -n "$DX_EGREP"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DX_EGREP" >&5 -$as_echo "$DX_EGREP" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - -fi -if test -z "$ac_cv_path_DX_EGREP"; then - ac_pt_DX_EGREP=$DX_EGREP - # Extract the first word of "egrep", so it can be a program name with args. -set dummy egrep; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_path_ac_pt_DX_EGREP+:} false; then : - $as_echo_n "(cached) " >&6 -else - case $ac_pt_DX_EGREP in - [\\/]* | ?:[\\/]*) - ac_cv_path_ac_pt_DX_EGREP="$ac_pt_DX_EGREP" # Let the user override the test with a path. - ;; - *) - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_path_ac_pt_DX_EGREP="$as_dir/$ac_word$ac_exec_ext" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - - ;; -esac -fi -ac_pt_DX_EGREP=$ac_cv_path_ac_pt_DX_EGREP -if test -n "$ac_pt_DX_EGREP"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_pt_DX_EGREP" >&5 -$as_echo "$ac_pt_DX_EGREP" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - if test "x$ac_pt_DX_EGREP" = x; then - DX_EGREP="" - else - case $cross_compiling:$ac_tool_warned in -yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} -ac_tool_warned=yes ;; -esac - DX_EGREP=$ac_pt_DX_EGREP - fi -else - DX_EGREP="$ac_cv_path_DX_EGREP" -fi - -if test "$DX_FLAG_$DX_CURRENT_FEATURE$DX_EGREP" = 1; then - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: egrep not found - will not generate doxygen PostScript documentation" >&5 -$as_echo "$as_me: WARNING: egrep not found - will not generate doxygen PostScript documentation" >&2;} - DX_FLAG_ps=0 - -fi - - : -fi -if test "$DX_FLAG_ps" = 1; then - if :; then - DX_COND_ps_TRUE= - DX_COND_ps_FALSE='#' -else - DX_COND_ps_TRUE='#' - DX_COND_ps_FALSE= -fi - - - : -else - if false; then - DX_COND_ps_TRUE= - DX_COND_ps_FALSE='#' -else - DX_COND_ps_TRUE='#' - DX_COND_ps_FALSE= -fi - - - : -fi - - -# PDF file generation: - - - - # Check whether --enable-doxygen-pdf was given. -if test "${enable_doxygen_pdf+set}" = set; then : - enableval=$enable_doxygen_pdf; -case "$enableval" in -#( -y|Y|yes|Yes|YES) - DX_FLAG_pdf=1 - - -test "$DX_FLAG_doc" = "1" \ -|| as_fn_error $? "doxygen-pdf requires doxygen-pdf" "$LINENO" 5 - -;; #( -n|N|no|No|NO) - DX_FLAG_pdf=0 - -;; #( -*) - as_fn_error $? "invalid value '$enableval' given to doxygen-pdf" "$LINENO" 5 -;; -esac - -else - -DX_FLAG_pdf=0 - - -test "$DX_FLAG_doc" = "1" || DX_FLAG_pdf=0 - - - -fi - -if test "$DX_FLAG_pdf" = 1; then - -if test -n "$ac_tool_prefix"; then - # Extract the first word of "${ac_tool_prefix}pdflatex", so it can be a program name with args. -set dummy ${ac_tool_prefix}pdflatex; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_path_DX_PDFLATEX+:} false; then : - $as_echo_n "(cached) " >&6 -else - case $DX_PDFLATEX in - [\\/]* | ?:[\\/]*) - ac_cv_path_DX_PDFLATEX="$DX_PDFLATEX" # Let the user override the test with a path. - ;; - *) - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_path_DX_PDFLATEX="$as_dir/$ac_word$ac_exec_ext" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - - ;; -esac -fi -DX_PDFLATEX=$ac_cv_path_DX_PDFLATEX -if test -n "$DX_PDFLATEX"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DX_PDFLATEX" >&5 -$as_echo "$DX_PDFLATEX" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - -fi -if test -z "$ac_cv_path_DX_PDFLATEX"; then - ac_pt_DX_PDFLATEX=$DX_PDFLATEX - # Extract the first word of "pdflatex", so it can be a program name with args. -set dummy pdflatex; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_path_ac_pt_DX_PDFLATEX+:} false; then : - $as_echo_n "(cached) " >&6 -else - case $ac_pt_DX_PDFLATEX in - [\\/]* | ?:[\\/]*) - ac_cv_path_ac_pt_DX_PDFLATEX="$ac_pt_DX_PDFLATEX" # Let the user override the test with a path. - ;; - *) - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_path_ac_pt_DX_PDFLATEX="$as_dir/$ac_word$ac_exec_ext" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - - ;; -esac -fi -ac_pt_DX_PDFLATEX=$ac_cv_path_ac_pt_DX_PDFLATEX -if test -n "$ac_pt_DX_PDFLATEX"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_pt_DX_PDFLATEX" >&5 -$as_echo "$ac_pt_DX_PDFLATEX" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - if test "x$ac_pt_DX_PDFLATEX" = x; then - DX_PDFLATEX="" - else - case $cross_compiling:$ac_tool_warned in -yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} -ac_tool_warned=yes ;; -esac - DX_PDFLATEX=$ac_pt_DX_PDFLATEX - fi -else - DX_PDFLATEX="$ac_cv_path_DX_PDFLATEX" -fi - -if test "$DX_FLAG_$DX_CURRENT_FEATURE$DX_PDFLATEX" = 1; then - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: pdflatex not found - will not generate doxygen PDF documentation" >&5 -$as_echo "$as_me: WARNING: pdflatex not found - will not generate doxygen PDF documentation" >&2;} - DX_FLAG_pdf=0 - -fi - - -if test -n "$ac_tool_prefix"; then - # Extract the first word of "${ac_tool_prefix}makeindex", so it can be a program name with args. -set dummy ${ac_tool_prefix}makeindex; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_path_DX_MAKEINDEX+:} false; then : - $as_echo_n "(cached) " >&6 -else - case $DX_MAKEINDEX in - [\\/]* | ?:[\\/]*) - ac_cv_path_DX_MAKEINDEX="$DX_MAKEINDEX" # Let the user override the test with a path. - ;; - *) - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_path_DX_MAKEINDEX="$as_dir/$ac_word$ac_exec_ext" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - - ;; -esac -fi -DX_MAKEINDEX=$ac_cv_path_DX_MAKEINDEX -if test -n "$DX_MAKEINDEX"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DX_MAKEINDEX" >&5 -$as_echo "$DX_MAKEINDEX" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - -fi -if test -z "$ac_cv_path_DX_MAKEINDEX"; then - ac_pt_DX_MAKEINDEX=$DX_MAKEINDEX - # Extract the first word of "makeindex", so it can be a program name with args. -set dummy makeindex; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_path_ac_pt_DX_MAKEINDEX+:} false; then : - $as_echo_n "(cached) " >&6 -else - case $ac_pt_DX_MAKEINDEX in - [\\/]* | ?:[\\/]*) - ac_cv_path_ac_pt_DX_MAKEINDEX="$ac_pt_DX_MAKEINDEX" # Let the user override the test with a path. - ;; - *) - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_path_ac_pt_DX_MAKEINDEX="$as_dir/$ac_word$ac_exec_ext" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - - ;; -esac -fi -ac_pt_DX_MAKEINDEX=$ac_cv_path_ac_pt_DX_MAKEINDEX -if test -n "$ac_pt_DX_MAKEINDEX"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_pt_DX_MAKEINDEX" >&5 -$as_echo "$ac_pt_DX_MAKEINDEX" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - if test "x$ac_pt_DX_MAKEINDEX" = x; then - DX_MAKEINDEX="" - else - case $cross_compiling:$ac_tool_warned in -yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} -ac_tool_warned=yes ;; -esac - DX_MAKEINDEX=$ac_pt_DX_MAKEINDEX - fi -else - DX_MAKEINDEX="$ac_cv_path_DX_MAKEINDEX" -fi - -if test "$DX_FLAG_$DX_CURRENT_FEATURE$DX_MAKEINDEX" = 1; then - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: makeindex not found - will not generate doxygen PDF documentation" >&5 -$as_echo "$as_me: WARNING: makeindex not found - will not generate doxygen PDF documentation" >&2;} - DX_FLAG_pdf=0 - -fi - - -if test -n "$ac_tool_prefix"; then - # Extract the first word of "${ac_tool_prefix}egrep", so it can be a program name with args. -set dummy ${ac_tool_prefix}egrep; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_path_DX_EGREP+:} false; then : - $as_echo_n "(cached) " >&6 -else - case $DX_EGREP in - [\\/]* | ?:[\\/]*) - ac_cv_path_DX_EGREP="$DX_EGREP" # Let the user override the test with a path. - ;; - *) - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_path_DX_EGREP="$as_dir/$ac_word$ac_exec_ext" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - - ;; -esac -fi -DX_EGREP=$ac_cv_path_DX_EGREP -if test -n "$DX_EGREP"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DX_EGREP" >&5 -$as_echo "$DX_EGREP" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - -fi -if test -z "$ac_cv_path_DX_EGREP"; then - ac_pt_DX_EGREP=$DX_EGREP - # Extract the first word of "egrep", so it can be a program name with args. -set dummy egrep; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_path_ac_pt_DX_EGREP+:} false; then : - $as_echo_n "(cached) " >&6 -else - case $ac_pt_DX_EGREP in - [\\/]* | ?:[\\/]*) - ac_cv_path_ac_pt_DX_EGREP="$ac_pt_DX_EGREP" # Let the user override the test with a path. - ;; - *) - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_path_ac_pt_DX_EGREP="$as_dir/$ac_word$ac_exec_ext" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - - ;; -esac -fi -ac_pt_DX_EGREP=$ac_cv_path_ac_pt_DX_EGREP -if test -n "$ac_pt_DX_EGREP"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_pt_DX_EGREP" >&5 -$as_echo "$ac_pt_DX_EGREP" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - if test "x$ac_pt_DX_EGREP" = x; then - DX_EGREP="" - else - case $cross_compiling:$ac_tool_warned in -yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} -ac_tool_warned=yes ;; -esac - DX_EGREP=$ac_pt_DX_EGREP - fi -else - DX_EGREP="$ac_cv_path_DX_EGREP" -fi - -if test "$DX_FLAG_$DX_CURRENT_FEATURE$DX_EGREP" = 1; then - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: egrep not found - will not generate doxygen PDF documentation" >&5 -$as_echo "$as_me: WARNING: egrep not found - will not generate doxygen PDF documentation" >&2;} - DX_FLAG_pdf=0 - -fi - - : -fi -if test "$DX_FLAG_pdf" = 1; then - if :; then - DX_COND_pdf_TRUE= - DX_COND_pdf_FALSE='#' -else - DX_COND_pdf_TRUE='#' - DX_COND_pdf_FALSE= -fi - - - : -else - if false; then - DX_COND_pdf_TRUE= - DX_COND_pdf_FALSE='#' -else - DX_COND_pdf_TRUE='#' - DX_COND_pdf_FALSE= -fi - - - : -fi - - -# LaTeX generation for PS and/or PDF: -if test "$DX_FLAG_ps" = 1 || test "$DX_FLAG_pdf" = 1; then - if :; then - DX_COND_latex_TRUE= - DX_COND_latex_FALSE='#' -else - DX_COND_latex_TRUE='#' - DX_COND_latex_FALSE= -fi - - DX_ENV="$DX_ENV GENERATE_LATEX='YES'" - -else - if false; then - DX_COND_latex_TRUE= - DX_COND_latex_FALSE='#' -else - DX_COND_latex_TRUE='#' - DX_COND_latex_FALSE= -fi - - DX_ENV="$DX_ENV GENERATE_LATEX='NO'" - -fi - -# Paper size for PS and/or PDF: - -case "$DOXYGEN_PAPER_SIZE" in -#( -"") - DOXYGEN_PAPER_SIZE="" - -;; #( -a4wide|a4|letter|legal|executive) - DX_ENV="$DX_ENV PAPER_SIZE='$DOXYGEN_PAPER_SIZE'" - -;; #( -*) - as_fn_error $? "unknown DOXYGEN_PAPER_SIZE='$DOXYGEN_PAPER_SIZE'" "$LINENO" 5 -;; -esac - -#For debugging: -#echo DX_FLAG_doc=$DX_FLAG_doc -#echo DX_FLAG_dot=$DX_FLAG_dot -#echo DX_FLAG_man=$DX_FLAG_man -#echo DX_FLAG_html=$DX_FLAG_html -#echo DX_FLAG_chm=$DX_FLAG_chm -#echo DX_FLAG_chi=$DX_FLAG_chi -#echo DX_FLAG_rtf=$DX_FLAG_rtf -#echo DX_FLAG_xml=$DX_FLAG_xml -#echo DX_FLAG_pdf=$DX_FLAG_pdf -#echo DX_FLAG_ps=$DX_FLAG_ps -#echo DX_ENV=$DX_ENV - - -# initialize automake -am__api_version='1.11' - -ac_aux_dir= -for ac_dir in "$srcdir" "$srcdir/.." "$srcdir/../.."; do - if test -f "$ac_dir/install-sh"; then - ac_aux_dir=$ac_dir - ac_install_sh="$ac_aux_dir/install-sh -c" - break - elif test -f "$ac_dir/install.sh"; then - ac_aux_dir=$ac_dir - ac_install_sh="$ac_aux_dir/install.sh -c" - break - elif test -f "$ac_dir/shtool"; then - ac_aux_dir=$ac_dir - ac_install_sh="$ac_aux_dir/shtool install -c" - break - fi -done -if test -z "$ac_aux_dir"; then - as_fn_error $? "cannot find install-sh, install.sh, or shtool in \"$srcdir\" \"$srcdir/..\" \"$srcdir/../..\"" "$LINENO" 5 -fi - -# These three variables are undocumented and unsupported, -# and are intended to be withdrawn in a future Autoconf release. -# They can cause serious problems if a builder's source tree is in a directory -# whose full name contains unusual characters. -ac_config_guess="$SHELL $ac_aux_dir/config.guess" # Please don't use this var. -ac_config_sub="$SHELL $ac_aux_dir/config.sub" # Please don't use this var. -ac_configure="$SHELL $ac_aux_dir/configure" # Please don't use this var. - - -# Find a good install program. We prefer a C program (faster), -# so one script is as good as another. But avoid the broken or -# incompatible versions: -# SysV /etc/install, /usr/sbin/install -# SunOS /usr/etc/install -# IRIX /sbin/install -# AIX /bin/install -# AmigaOS /C/install, which installs bootblocks on floppy discs -# AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag -# AFS /usr/afsws/bin/install, which mishandles nonexistent args -# SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff" -# OS/2's system install, which has a completely different semantic -# ./install, which can be erroneously created by make from ./install.sh. -# Reject install programs that cannot install multiple files. -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a BSD-compatible install" >&5 -$as_echo_n "checking for a BSD-compatible install... " >&6; } -if test -z "$INSTALL"; then -if ${ac_cv_path_install+:} false; then : - $as_echo_n "(cached) " >&6 -else - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - # Account for people who put trailing slashes in PATH elements. -case $as_dir/ in #(( - ./ | .// | /[cC]/* | \ - /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \ - ?:[\\/]os2[\\/]install[\\/]* | ?:[\\/]OS2[\\/]INSTALL[\\/]* | \ - /usr/ucb/* ) ;; - *) - # OSF1 and SCO ODT 3.0 have their own names for install. - # Don't use installbsd from OSF since it installs stuff as root - # by default. - for ac_prog in ginstall scoinst install; do - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_prog$ac_exec_ext"; then - if test $ac_prog = install && - grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then - # AIX install. It has an incompatible calling convention. - : - elif test $ac_prog = install && - grep pwplus "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then - # program-specific install script used by HP pwplus--don't use. - : - else - rm -rf conftest.one conftest.two conftest.dir - echo one > conftest.one - echo two > conftest.two - mkdir conftest.dir - if "$as_dir/$ac_prog$ac_exec_ext" -c conftest.one conftest.two "`pwd`/conftest.dir" && - test -s conftest.one && test -s conftest.two && - test -s conftest.dir/conftest.one && - test -s conftest.dir/conftest.two - then - ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c" - break 3 - fi - fi - fi - done - done - ;; -esac - - done -IFS=$as_save_IFS - -rm -rf conftest.one conftest.two conftest.dir - -fi - if test "${ac_cv_path_install+set}" = set; then - INSTALL=$ac_cv_path_install - else - # As a last resort, use the slow shell script. Don't cache a - # value for INSTALL within a source directory, because that will - # break other packages using the cache if that directory is - # removed, or if the value is a relative name. - INSTALL=$ac_install_sh - fi -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $INSTALL" >&5 -$as_echo "$INSTALL" >&6; } - -# Use test -z because SunOS4 sh mishandles braces in ${var-val}. -# It thinks the first close brace ends the variable substitution. -test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}' - -test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}' - -test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644' - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether build environment is sane" >&5 -$as_echo_n "checking whether build environment is sane... " >&6; } -# Just in case -sleep 1 -echo timestamp > conftest.file -# Reject unsafe characters in $srcdir or the absolute working directory -# name. Accept space and tab only in the latter. -am_lf=' -' -case `pwd` in - *[\\\"\#\$\&\'\`$am_lf]*) - as_fn_error $? "unsafe absolute working directory name" "$LINENO" 5;; -esac -case $srcdir in - *[\\\"\#\$\&\'\`$am_lf\ \ ]*) - as_fn_error $? "unsafe srcdir value: \`$srcdir'" "$LINENO" 5;; -esac - -# Do `set' in a subshell so we don't clobber the current shell's -# arguments. Must try -L first in case configure is actually a -# symlink; some systems play weird games with the mod time of symlinks -# (eg FreeBSD returns the mod time of the symlink's containing -# directory). -if ( - set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null` - if test "$*" = "X"; then - # -L didn't work. - set X `ls -t "$srcdir/configure" conftest.file` - fi - rm -f conftest.file - if test "$*" != "X $srcdir/configure conftest.file" \ - && test "$*" != "X conftest.file $srcdir/configure"; then - - # If neither matched, then we have a broken ls. This can happen - # if, for instance, CONFIG_SHELL is bash and it inherits a - # broken ls alias from the environment. This has actually - # happened. Such a system could not be considered "sane". - as_fn_error $? "ls -t appears to fail. Make sure there is not a broken -alias in your environment" "$LINENO" 5 - fi - - test "$2" = conftest.file - ) -then - # Ok. - : -else - as_fn_error $? "newly created file is older than distributed files! -Check your system clock" "$LINENO" 5 -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; } -test "$program_prefix" != NONE && - program_transform_name="s&^&$program_prefix&;$program_transform_name" -# Use a double $ so make ignores it. -test "$program_suffix" != NONE && - program_transform_name="s&\$&$program_suffix&;$program_transform_name" -# Double any \ or $. -# By default was `s,x,x', remove it if useless. -ac_script='s/[\\$]/&&/g;s/;s,x,x,$//' -program_transform_name=`$as_echo "$program_transform_name" | sed "$ac_script"` - -# expand $ac_aux_dir to an absolute path -am_aux_dir=`cd $ac_aux_dir && pwd` - -if test x"${MISSING+set}" != xset; then - case $am_aux_dir in - *\ * | *\ *) - MISSING="\${SHELL} \"$am_aux_dir/missing\"" ;; - *) - MISSING="\${SHELL} $am_aux_dir/missing" ;; - esac -fi -# Use eval to expand $SHELL -if eval "$MISSING --run true"; then - am_missing_run="$MISSING --run " -else - am_missing_run= - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: \`missing' script is too old or missing" >&5 -$as_echo "$as_me: WARNING: \`missing' script is too old or missing" >&2;} -fi - -if test x"${install_sh}" != xset; then - case $am_aux_dir in - *\ * | *\ *) - install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;; - *) - install_sh="\${SHELL} $am_aux_dir/install-sh" - esac -fi - -# Installed binaries are usually stripped using `strip' when the user -# run `make install-strip'. However `strip' might not be the right -# tool to use in cross-compilation environments, therefore Automake -# will honor the `STRIP' environment variable to overrule this program. -if test "$cross_compiling" != no; then - if test -n "$ac_tool_prefix"; then - # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args. -set dummy ${ac_tool_prefix}strip; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_STRIP+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$STRIP"; then - ac_cv_prog_STRIP="$STRIP" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_STRIP="${ac_tool_prefix}strip" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -STRIP=$ac_cv_prog_STRIP -if test -n "$STRIP"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $STRIP" >&5 -$as_echo "$STRIP" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - -fi -if test -z "$ac_cv_prog_STRIP"; then - ac_ct_STRIP=$STRIP - # Extract the first word of "strip", so it can be a program name with args. -set dummy strip; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_ac_ct_STRIP+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$ac_ct_STRIP"; then - ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_ac_ct_STRIP="strip" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP -if test -n "$ac_ct_STRIP"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP" >&5 -$as_echo "$ac_ct_STRIP" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - if test "x$ac_ct_STRIP" = x; then - STRIP=":" - else - case $cross_compiling:$ac_tool_warned in -yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} -ac_tool_warned=yes ;; -esac - STRIP=$ac_ct_STRIP - fi -else - STRIP="$ac_cv_prog_STRIP" -fi - -fi -INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s" - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a thread-safe mkdir -p" >&5 -$as_echo_n "checking for a thread-safe mkdir -p... " >&6; } -if test -z "$MKDIR_P"; then - if ${ac_cv_path_mkdir+:} false; then : - $as_echo_n "(cached) " >&6 -else - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH$PATH_SEPARATOR/opt/sfw/bin -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_prog in mkdir gmkdir; do - for ac_exec_ext in '' $ac_executable_extensions; do - as_fn_executable_p "$as_dir/$ac_prog$ac_exec_ext" || continue - case `"$as_dir/$ac_prog$ac_exec_ext" --version 2>&1` in #( - 'mkdir (GNU coreutils) '* | \ - 'mkdir (coreutils) '* | \ - 'mkdir (fileutils) '4.1*) - ac_cv_path_mkdir=$as_dir/$ac_prog$ac_exec_ext - break 3;; - esac - done - done - done -IFS=$as_save_IFS - -fi - - test -d ./--version && rmdir ./--version - if test "${ac_cv_path_mkdir+set}" = set; then - MKDIR_P="$ac_cv_path_mkdir -p" - else - # As a last resort, use the slow shell script. Don't cache a - # value for MKDIR_P within a source directory, because that will - # break other packages using the cache if that directory is - # removed, or if the value is a relative name. - MKDIR_P="$ac_install_sh -d" - fi -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $MKDIR_P" >&5 -$as_echo "$MKDIR_P" >&6; } - -mkdir_p="$MKDIR_P" -case $mkdir_p in - [\\/$]* | ?:[\\/]*) ;; - */*) mkdir_p="\$(top_builddir)/$mkdir_p" ;; -esac - -for ac_prog in gawk mawk nawk awk -do - # Extract the first word of "$ac_prog", so it can be a program name with args. -set dummy $ac_prog; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_AWK+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$AWK"; then - ac_cv_prog_AWK="$AWK" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_AWK="$ac_prog" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -AWK=$ac_cv_prog_AWK -if test -n "$AWK"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AWK" >&5 -$as_echo "$AWK" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - - test -n "$AWK" && break -done - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} sets \$(MAKE)" >&5 -$as_echo_n "checking whether ${MAKE-make} sets \$(MAKE)... " >&6; } -set x ${MAKE-make} -ac_make=`$as_echo "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'` -if eval \${ac_cv_prog_make_${ac_make}_set+:} false; then : - $as_echo_n "(cached) " >&6 -else - cat >conftest.make <<\_ACEOF -SHELL = /bin/sh -all: - @echo '@@@%%%=$(MAKE)=@@@%%%' -_ACEOF -# GNU make sometimes prints "make[1]: Entering ...", which would confuse us. -case `${MAKE-make} -f conftest.make 2>/dev/null` in - *@@@%%%=?*=@@@%%%*) - eval ac_cv_prog_make_${ac_make}_set=yes;; - *) - eval ac_cv_prog_make_${ac_make}_set=no;; -esac -rm -f conftest.make -fi -if eval test \$ac_cv_prog_make_${ac_make}_set = yes; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; } - SET_MAKE= -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } - SET_MAKE="MAKE=${MAKE-make}" -fi - -rm -rf .tst 2>/dev/null -mkdir .tst 2>/dev/null -if test -d .tst; then - am__leading_dot=. -else - am__leading_dot=_ -fi -rmdir .tst 2>/dev/null - -if test "`cd $srcdir && pwd`" != "`pwd`"; then - # Use -I$(srcdir) only when $(srcdir) != ., so that make's output - # is not polluted with repeated "-I." - am__isrc=' -I$(srcdir)' - # test to see if srcdir already configured - if test -f $srcdir/config.status; then - as_fn_error $? "source directory already configured; run \"make distclean\" there first" "$LINENO" 5 - fi -fi - -# test whether we have cygpath -if test -z "$CYGPATH_W"; then - if (cygpath --version) >/dev/null 2>/dev/null; then - CYGPATH_W='cygpath -w' - else - CYGPATH_W=echo - fi -fi - - -# Define the identity of the package. - PACKAGE='zookeeper' - VERSION='3.4.6' - - -cat >>confdefs.h <<_ACEOF -#define PACKAGE "$PACKAGE" -_ACEOF - - -cat >>confdefs.h <<_ACEOF -#define VERSION "$VERSION" -_ACEOF - -# Some tools Automake needs. - -ACLOCAL=${ACLOCAL-"${am_missing_run}aclocal-${am__api_version}"} - - -AUTOCONF=${AUTOCONF-"${am_missing_run}autoconf"} - - -AUTOMAKE=${AUTOMAKE-"${am_missing_run}automake-${am__api_version}"} - - -AUTOHEADER=${AUTOHEADER-"${am_missing_run}autoheader"} - - -MAKEINFO=${MAKEINFO-"${am_missing_run}makeinfo"} - -# We need awk for the "check" target. The system "awk" is bad on -# some platforms. -# Always define AMTAR for backward compatibility. Yes, it's still used -# in the wild :-( We should find a proper way to deprecate it ... -AMTAR='$${TAR-tar}' - -am__tar='$${TAR-tar} chof - "$$tardir"' am__untar='$${TAR-tar} xf -' - - - - - -ac_config_headers="$ac_config_headers config.h" - - -# Checks for programs. - -# Check whether --with-cppunit was given. -if test "${with_cppunit+set}" = set; then : - withval=$with_cppunit; -fi - - -if test "$with_cppunit" = "no" ; then - CPPUNIT_PATH="No_CPPUNIT" - CPPUNIT_INCLUDE= - CPPUNIT_LIBS= -else - - - -# Check whether --with-cppunit-prefix was given. -if test "${with_cppunit_prefix+set}" = set; then : - withval=$with_cppunit_prefix; cppunit_config_prefix="$withval" -else - cppunit_config_prefix="" -fi - - -# Check whether --with-cppunit-exec-prefix was given. -if test "${with_cppunit_exec_prefix+set}" = set; then : - withval=$with_cppunit_exec_prefix; cppunit_config_exec_prefix="$withval" -else - cppunit_config_exec_prefix="" -fi - - - if test x$cppunit_config_exec_prefix != x ; then - cppunit_config_args="$cppunit_config_args --exec-prefix=$cppunit_config_exec_prefix" - if test x${CPPUNIT_CONFIG+set} != xset ; then - CPPUNIT_CONFIG=$cppunit_config_exec_prefix/bin/cppunit-config - fi - fi - if test x$cppunit_config_prefix != x ; then - cppunit_config_args="$cppunit_config_args --prefix=$cppunit_config_prefix" - if test x${CPPUNIT_CONFIG+set} != xset ; then - CPPUNIT_CONFIG=$cppunit_config_prefix/bin/cppunit-config - fi - fi - - # Extract the first word of "cppunit-config", so it can be a program name with args. -set dummy cppunit-config; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_path_CPPUNIT_CONFIG+:} false; then : - $as_echo_n "(cached) " >&6 -else - case $CPPUNIT_CONFIG in - [\\/]* | ?:[\\/]*) - ac_cv_path_CPPUNIT_CONFIG="$CPPUNIT_CONFIG" # Let the user override the test with a path. - ;; - *) - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_path_CPPUNIT_CONFIG="$as_dir/$ac_word$ac_exec_ext" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - - test -z "$ac_cv_path_CPPUNIT_CONFIG" && ac_cv_path_CPPUNIT_CONFIG="no" - ;; -esac -fi -CPPUNIT_CONFIG=$ac_cv_path_CPPUNIT_CONFIG -if test -n "$CPPUNIT_CONFIG"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CPPUNIT_CONFIG" >&5 -$as_echo "$CPPUNIT_CONFIG" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - - cppunit_version_min=1.10.2 - - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Cppunit - version >= $cppunit_version_min" >&5 -$as_echo_n "checking for Cppunit - version >= $cppunit_version_min... " >&6; } - no_cppunit="" - if test "$CPPUNIT_CONFIG" = "no" ; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } - no_cppunit=yes - else - CPPUNIT_CFLAGS=`$CPPUNIT_CONFIG --cflags` - CPPUNIT_LIBS=`$CPPUNIT_CONFIG --libs` - cppunit_version=`$CPPUNIT_CONFIG --version` - - cppunit_major_version=`echo $cppunit_version | \ - sed 's/\([0-9]*\).\([0-9]*\).\([0-9]*\)/\1/'` - cppunit_minor_version=`echo $cppunit_version | \ - sed 's/\([0-9]*\).\([0-9]*\).\([0-9]*\)/\2/'` - cppunit_micro_version=`echo $cppunit_version | \ - sed 's/\([0-9]*\).\([0-9]*\).\([0-9]*\)/\3/'` - - cppunit_major_min=`echo $cppunit_version_min | \ - sed 's/\([0-9]*\).\([0-9]*\).\([0-9]*\)/\1/'` - if test "x${cppunit_major_min}" = "x" ; then - cppunit_major_min=0 - fi - - cppunit_minor_min=`echo $cppunit_version_min | \ - sed 's/\([0-9]*\).\([0-9]*\).\([0-9]*\)/\2/'` - if test "x${cppunit_minor_min}" = "x" ; then - cppunit_minor_min=0 - fi - - cppunit_micro_min=`echo $cppunit_version_min | \ - sed 's/\([0-9]*\).\([0-9]*\).\([0-9]*\)/\3/'` - if test "x${cppunit_micro_min}" = "x" ; then - cppunit_micro_min=0 - fi - - cppunit_version_proper=`expr \ - $cppunit_major_version \> $cppunit_major_min \| \ - $cppunit_major_version \= $cppunit_major_min \& \ - $cppunit_minor_version \> $cppunit_minor_min \| \ - $cppunit_major_version \= $cppunit_major_min \& \ - $cppunit_minor_version \= $cppunit_minor_min \& \ - $cppunit_micro_version \>= $cppunit_micro_min ` - - if test "$cppunit_version_proper" = "1" ; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $cppunit_major_version.$cppunit_minor_version.$cppunit_micro_version" >&5 -$as_echo "$cppunit_major_version.$cppunit_minor_version.$cppunit_micro_version" >&6; } - else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } - no_cppunit=yes - fi - fi - - if test "x$no_cppunit" = x ; then - : - else - CPPUNIT_CFLAGS="" - CPPUNIT_LIBS="" - : - fi - - - - -fi - -if test "$CALLER" = "ANT" ; then -CPPUNIT_CFLAGS="$CPPUNIT_CFLAGS -DZKSERVER_CMD=\"\\\"${base_dir}/src/c/tests/zkServer.sh\\\"\"" -else -CPPUNIT_CFLAGS="$CPPUNIT_CFLAGS -DZKSERVER_CMD=\"\\\"./tests/zkServer.sh\\\"\"" -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for generated/zookeeper.jute.c" >&5 -$as_echo_n "checking for generated/zookeeper.jute.c... " >&6; } -if ${ac_cv_file_generated_zookeeper_jute_c+:} false; then : - $as_echo_n "(cached) " >&6 -else - test "$cross_compiling" = yes && - as_fn_error $? "cannot check for file existence when cross compiling" "$LINENO" 5 -if test -r "generated/zookeeper.jute.c"; then - ac_cv_file_generated_zookeeper_jute_c=yes -else - ac_cv_file_generated_zookeeper_jute_c=no -fi -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_file_generated_zookeeper_jute_c" >&5 -$as_echo "$ac_cv_file_generated_zookeeper_jute_c" >&6; } -if test "x$ac_cv_file_generated_zookeeper_jute_c" = xyes; then : - -cat >>confdefs.h <<_ACEOF -#define HAVE_GENERATED_ZOOKEEPER_JUTE_C 1 -_ACEOF - -else - as_fn_error $? "jute files are missing! Please run \"ant compile_jute\" while in the zookeeper top level directory." "$LINENO" 5 - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for generated/zookeeper.jute.h" >&5 -$as_echo_n "checking for generated/zookeeper.jute.h... " >&6; } -if ${ac_cv_file_generated_zookeeper_jute_h+:} false; then : - $as_echo_n "(cached) " >&6 -else - test "$cross_compiling" = yes && - as_fn_error $? "cannot check for file existence when cross compiling" "$LINENO" 5 -if test -r "generated/zookeeper.jute.h"; then - ac_cv_file_generated_zookeeper_jute_h=yes -else - ac_cv_file_generated_zookeeper_jute_h=no -fi -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_file_generated_zookeeper_jute_h" >&5 -$as_echo "$ac_cv_file_generated_zookeeper_jute_h" >&6; } -if test "x$ac_cv_file_generated_zookeeper_jute_h" = xyes; then : - -cat >>confdefs.h <<_ACEOF -#define HAVE_GENERATED_ZOOKEEPER_JUTE_H 1 -_ACEOF - -else - as_fn_error $? "jute files are missing! Please run \"ant compile_jute\" while in the zookeeper top level directory." "$LINENO" 5 - -fi - -fi - - -ac_ext=c -ac_cpp='$CPP $CPPFLAGS' -ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_c_compiler_gnu -if test -n "$ac_tool_prefix"; then - # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args. -set dummy ${ac_tool_prefix}gcc; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_CC+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$CC"; then - ac_cv_prog_CC="$CC" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_CC="${ac_tool_prefix}gcc" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -CC=$ac_cv_prog_CC -if test -n "$CC"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 -$as_echo "$CC" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - -fi -if test -z "$ac_cv_prog_CC"; then - ac_ct_CC=$CC - # Extract the first word of "gcc", so it can be a program name with args. -set dummy gcc; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_ac_ct_CC+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$ac_ct_CC"; then - ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_ac_ct_CC="gcc" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -ac_ct_CC=$ac_cv_prog_ac_ct_CC -if test -n "$ac_ct_CC"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 -$as_echo "$ac_ct_CC" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - if test "x$ac_ct_CC" = x; then - CC="" - else - case $cross_compiling:$ac_tool_warned in -yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} -ac_tool_warned=yes ;; -esac - CC=$ac_ct_CC - fi -else - CC="$ac_cv_prog_CC" -fi - -if test -z "$CC"; then - if test -n "$ac_tool_prefix"; then - # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args. -set dummy ${ac_tool_prefix}cc; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_CC+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$CC"; then - ac_cv_prog_CC="$CC" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_CC="${ac_tool_prefix}cc" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -CC=$ac_cv_prog_CC -if test -n "$CC"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 -$as_echo "$CC" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - - fi -fi -if test -z "$CC"; then - # Extract the first word of "cc", so it can be a program name with args. -set dummy cc; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_CC+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$CC"; then - ac_cv_prog_CC="$CC" # Let the user override the test. -else - ac_prog_rejected=no -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then - ac_prog_rejected=yes - continue - fi - ac_cv_prog_CC="cc" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -if test $ac_prog_rejected = yes; then - # We found a bogon in the path, so make sure we never use it. - set dummy $ac_cv_prog_CC - shift - if test $# != 0; then - # We chose a different compiler from the bogus one. - # However, it has the same basename, so the bogon will be chosen - # first if we set CC to just the basename; use the full file name. - shift - ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@" - fi -fi -fi -fi -CC=$ac_cv_prog_CC -if test -n "$CC"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 -$as_echo "$CC" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - -fi -if test -z "$CC"; then - if test -n "$ac_tool_prefix"; then - for ac_prog in cl.exe - do - # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. -set dummy $ac_tool_prefix$ac_prog; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_CC+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$CC"; then - ac_cv_prog_CC="$CC" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_CC="$ac_tool_prefix$ac_prog" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -CC=$ac_cv_prog_CC -if test -n "$CC"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 -$as_echo "$CC" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - - test -n "$CC" && break - done -fi -if test -z "$CC"; then - ac_ct_CC=$CC - for ac_prog in cl.exe -do - # Extract the first word of "$ac_prog", so it can be a program name with args. -set dummy $ac_prog; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_ac_ct_CC+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$ac_ct_CC"; then - ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_ac_ct_CC="$ac_prog" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -ac_ct_CC=$ac_cv_prog_ac_ct_CC -if test -n "$ac_ct_CC"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 -$as_echo "$ac_ct_CC" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - - test -n "$ac_ct_CC" && break -done - - if test "x$ac_ct_CC" = x; then - CC="" - else - case $cross_compiling:$ac_tool_warned in -yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} -ac_tool_warned=yes ;; -esac - CC=$ac_ct_CC - fi -fi - -fi - - -test -z "$CC" && { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 -$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} -as_fn_error $? "no acceptable C compiler found in \$PATH -See \`config.log' for more details" "$LINENO" 5; } - -# Provide some information about the compiler. -$as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5 -set X $ac_compile -ac_compiler=$2 -for ac_option in --version -v -V -qversion; do - { { ac_try="$ac_compiler $ac_option >&5" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 - (eval "$ac_compiler $ac_option >&5") 2>conftest.err - ac_status=$? - if test -s conftest.err; then - sed '10a\ -... rest of stderr output deleted ... - 10q' conftest.err >conftest.er1 - cat conftest.er1 >&5 - fi - rm -f conftest.er1 conftest.err - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } -done - -cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -int -main () -{ - - ; - return 0; -} -_ACEOF -ac_clean_files_save=$ac_clean_files -ac_clean_files="$ac_clean_files a.out a.out.dSYM a.exe b.out" -# Try to create an executable without -o first, disregard a.out. -# It will help us diagnose broken compilers, and finding out an intuition -# of exeext. -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler works" >&5 -$as_echo_n "checking whether the C compiler works... " >&6; } -ac_link_default=`$as_echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'` - -# The possible output files: -ac_files="a.out conftest.exe conftest a.exe a_out.exe b.out conftest.*" - -ac_rmfiles= -for ac_file in $ac_files -do - case $ac_file in - *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; - * ) ac_rmfiles="$ac_rmfiles $ac_file";; - esac -done -rm -f $ac_rmfiles - -if { { ac_try="$ac_link_default" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 - (eval "$ac_link_default") 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; }; then : - # Autoconf-2.13 could set the ac_cv_exeext variable to `no'. -# So ignore a value of `no', otherwise this would lead to `EXEEXT = no' -# in a Makefile. We should not override ac_cv_exeext if it was cached, -# so that the user can short-circuit this test for compilers unknown to -# Autoconf. -for ac_file in $ac_files '' -do - test -f "$ac_file" || continue - case $ac_file in - *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) - ;; - [ab].out ) - # We found the default executable, but exeext='' is most - # certainly right. - break;; - *.* ) - if test "${ac_cv_exeext+set}" = set && test "$ac_cv_exeext" != no; - then :; else - ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` - fi - # We set ac_cv_exeext here because the later test for it is not - # safe: cross compilers may not add the suffix if given an `-o' - # argument, so we may need to know it at that point already. - # Even if this section looks crufty: it has the advantage of - # actually working. - break;; - * ) - break;; - esac -done -test "$ac_cv_exeext" = no && ac_cv_exeext= - -else - ac_file='' -fi -if test -z "$ac_file"; then : - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -$as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 -$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} -as_fn_error 77 "C compiler cannot create executables -See \`config.log' for more details" "$LINENO" 5; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; } -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler default output file name" >&5 -$as_echo_n "checking for C compiler default output file name... " >&6; } -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_file" >&5 -$as_echo "$ac_file" >&6; } -ac_exeext=$ac_cv_exeext - -rm -f -r a.out a.out.dSYM a.exe conftest$ac_cv_exeext b.out -ac_clean_files=$ac_clean_files_save -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of executables" >&5 -$as_echo_n "checking for suffix of executables... " >&6; } -if { { ac_try="$ac_link" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 - (eval "$ac_link") 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; }; then : - # If both `conftest.exe' and `conftest' are `present' (well, observable) -# catch `conftest.exe'. For instance with Cygwin, `ls conftest' will -# work properly (i.e., refer to `conftest.exe'), while it won't with -# `rm'. -for ac_file in conftest.exe conftest conftest.*; do - test -f "$ac_file" || continue - case $ac_file in - *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; - *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` - break;; - * ) break;; - esac -done -else - { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 -$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} -as_fn_error $? "cannot compute suffix of executables: cannot compile and link -See \`config.log' for more details" "$LINENO" 5; } -fi -rm -f conftest conftest$ac_cv_exeext -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_exeext" >&5 -$as_echo "$ac_cv_exeext" >&6; } - -rm -f conftest.$ac_ext -EXEEXT=$ac_cv_exeext -ac_exeext=$EXEEXT -cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include -int -main () -{ -FILE *f = fopen ("conftest.out", "w"); - return ferror (f) || fclose (f) != 0; - - ; - return 0; -} -_ACEOF -ac_clean_files="$ac_clean_files conftest.out" -# Check that the compiler produces executables we can run. If not, either -# the compiler is broken, or we cross compile. -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are cross compiling" >&5 -$as_echo_n "checking whether we are cross compiling... " >&6; } -if test "$cross_compiling" != yes; then - { { ac_try="$ac_link" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 - (eval "$ac_link") 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } - if { ac_try='./conftest$ac_cv_exeext' - { { case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 - (eval "$ac_try") 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; }; }; then - cross_compiling=no - else - if test "$cross_compiling" = maybe; then - cross_compiling=yes - else - { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 -$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} -as_fn_error $? "cannot run C compiled programs. -If you meant to cross compile, use \`--host'. -See \`config.log' for more details" "$LINENO" 5; } - fi - fi -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $cross_compiling" >&5 -$as_echo "$cross_compiling" >&6; } - -rm -f conftest.$ac_ext conftest$ac_cv_exeext conftest.out -ac_clean_files=$ac_clean_files_save -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of object files" >&5 -$as_echo_n "checking for suffix of object files... " >&6; } -if ${ac_cv_objext+:} false; then : - $as_echo_n "(cached) " >&6 -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -int -main () -{ - - ; - return 0; -} -_ACEOF -rm -f conftest.o conftest.obj -if { { ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 - (eval "$ac_compile") 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; }; then : - for ac_file in conftest.o conftest.obj conftest.*; do - test -f "$ac_file" || continue; - case $ac_file in - *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM ) ;; - *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'` - break;; - esac -done -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 -$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} -as_fn_error $? "cannot compute suffix of object files: cannot compile -See \`config.log' for more details" "$LINENO" 5; } -fi -rm -f conftest.$ac_cv_objext conftest.$ac_ext -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_objext" >&5 -$as_echo "$ac_cv_objext" >&6; } -OBJEXT=$ac_cv_objext -ac_objext=$OBJEXT -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C compiler" >&5 -$as_echo_n "checking whether we are using the GNU C compiler... " >&6; } -if ${ac_cv_c_compiler_gnu+:} false; then : - $as_echo_n "(cached) " >&6 -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -int -main () -{ -#ifndef __GNUC__ - choke me -#endif - - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - ac_compiler_gnu=yes -else - ac_compiler_gnu=no -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -ac_cv_c_compiler_gnu=$ac_compiler_gnu - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5 -$as_echo "$ac_cv_c_compiler_gnu" >&6; } -if test $ac_compiler_gnu = yes; then - GCC=yes -else - GCC= -fi -ac_test_CFLAGS=${CFLAGS+set} -ac_save_CFLAGS=$CFLAGS -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5 -$as_echo_n "checking whether $CC accepts -g... " >&6; } -if ${ac_cv_prog_cc_g+:} false; then : - $as_echo_n "(cached) " >&6 -else - ac_save_c_werror_flag=$ac_c_werror_flag - ac_c_werror_flag=yes - ac_cv_prog_cc_g=no - CFLAGS="-g" - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -int -main () -{ - - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - ac_cv_prog_cc_g=yes -else - CFLAGS="" - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -int -main () -{ - - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - -else - ac_c_werror_flag=$ac_save_c_werror_flag - CFLAGS="-g" - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -int -main () -{ - - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - ac_cv_prog_cc_g=yes -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext - ac_c_werror_flag=$ac_save_c_werror_flag -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5 -$as_echo "$ac_cv_prog_cc_g" >&6; } -if test "$ac_test_CFLAGS" = set; then - CFLAGS=$ac_save_CFLAGS -elif test $ac_cv_prog_cc_g = yes; then - if test "$GCC" = yes; then - CFLAGS="-g -O2" - else - CFLAGS="-g" - fi -else - if test "$GCC" = yes; then - CFLAGS="-O2" - else - CFLAGS= - fi -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5 -$as_echo_n "checking for $CC option to accept ISO C89... " >&6; } -if ${ac_cv_prog_cc_c89+:} false; then : - $as_echo_n "(cached) " >&6 -else - ac_cv_prog_cc_c89=no -ac_save_CC=$CC -cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include -#include -struct stat; -/* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */ -struct buf { int x; }; -FILE * (*rcsopen) (struct buf *, struct stat *, int); -static char *e (p, i) - char **p; - int i; -{ - return p[i]; -} -static char *f (char * (*g) (char **, int), char **p, ...) -{ - char *s; - va_list v; - va_start (v,p); - s = g (p, va_arg (v,int)); - va_end (v); - return s; -} - -/* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has - function prototypes and stuff, but not '\xHH' hex character constants. - These don't provoke an error unfortunately, instead are silently treated - as 'x'. The following induces an error, until -std is added to get - proper ANSI mode. Curiously '\x00'!='x' always comes out true, for an - array size at least. It's necessary to write '\x00'==0 to get something - that's true only with -std. */ -int osf4_cc_array ['\x00' == 0 ? 1 : -1]; - -/* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters - inside strings and character constants. */ -#define FOO(x) 'x' -int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1]; - -int test (int i, double x); -struct s1 {int (*f) (int a);}; -struct s2 {int (*f) (double a);}; -int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int); -int argc; -char **argv; -int -main () -{ -return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]; - ; - return 0; -} -_ACEOF -for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \ - -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" -do - CC="$ac_save_CC $ac_arg" - if ac_fn_c_try_compile "$LINENO"; then : - ac_cv_prog_cc_c89=$ac_arg -fi -rm -f core conftest.err conftest.$ac_objext - test "x$ac_cv_prog_cc_c89" != "xno" && break -done -rm -f conftest.$ac_ext -CC=$ac_save_CC - -fi -# AC_CACHE_VAL -case "x$ac_cv_prog_cc_c89" in - x) - { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 -$as_echo "none needed" >&6; } ;; - xno) - { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 -$as_echo "unsupported" >&6; } ;; - *) - CC="$CC $ac_cv_prog_cc_c89" - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5 -$as_echo "$ac_cv_prog_cc_c89" >&6; } ;; -esac -if test "x$ac_cv_prog_cc_c89" != xno; then : - -fi - -ac_ext=c -ac_cpp='$CPP $CPPFLAGS' -ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_c_compiler_gnu -DEPDIR="${am__leading_dot}deps" - -ac_config_commands="$ac_config_commands depfiles" - - -am_make=${MAKE-make} -cat > confinc << 'END' -am__doit: - @echo this is the am__doit target -.PHONY: am__doit -END -# If we don't find an include directive, just comment out the code. -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for style of include used by $am_make" >&5 -$as_echo_n "checking for style of include used by $am_make... " >&6; } -am__include="#" -am__quote= -_am_result=none -# First try GNU make style include. -echo "include confinc" > confmf -# Ignore all kinds of additional output from `make'. -case `$am_make -s -f confmf 2> /dev/null` in #( -*the\ am__doit\ target*) - am__include=include - am__quote= - _am_result=GNU - ;; -esac -# Now try BSD make style include. -if test "$am__include" = "#"; then - echo '.include "confinc"' > confmf - case `$am_make -s -f confmf 2> /dev/null` in #( - *the\ am__doit\ target*) - am__include=.include - am__quote="\"" - _am_result=BSD - ;; - esac -fi - - -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $_am_result" >&5 -$as_echo "$_am_result" >&6; } -rm -f confinc confmf - -# Check whether --enable-dependency-tracking was given. -if test "${enable_dependency_tracking+set}" = set; then : - enableval=$enable_dependency_tracking; -fi - -if test "x$enable_dependency_tracking" != xno; then - am_depcomp="$ac_aux_dir/depcomp" - AMDEPBACKSLASH='\' - am__nodep='_no' -fi - if test "x$enable_dependency_tracking" != xno; then - AMDEP_TRUE= - AMDEP_FALSE='#' -else - AMDEP_TRUE='#' - AMDEP_FALSE= -fi - - - -depcc="$CC" am_compiler_list= - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5 -$as_echo_n "checking dependency style of $depcc... " >&6; } -if ${am_cv_CC_dependencies_compiler_type+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then - # We make a subdir and do the tests there. Otherwise we can end up - # making bogus files that we don't know about and never remove. For - # instance it was reported that on HP-UX the gcc test will end up - # making a dummy file named `D' -- because `-MD' means `put the output - # in D'. - rm -rf conftest.dir - mkdir conftest.dir - # Copy depcomp to subdir because otherwise we won't find it if we're - # using a relative directory. - cp "$am_depcomp" conftest.dir - cd conftest.dir - # We will build objects and dependencies in a subdirectory because - # it helps to detect inapplicable dependency modes. For instance - # both Tru64's cc and ICC support -MD to output dependencies as a - # side effect of compilation, but ICC will put the dependencies in - # the current directory while Tru64 will put them in the object - # directory. - mkdir sub - - am_cv_CC_dependencies_compiler_type=none - if test "$am_compiler_list" = ""; then - am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp` - fi - am__universal=false - case " $depcc " in #( - *\ -arch\ *\ -arch\ *) am__universal=true ;; - esac - - for depmode in $am_compiler_list; do - # Setup a source with many dependencies, because some compilers - # like to wrap large dependency lists on column 80 (with \), and - # we should not choose a depcomp mode which is confused by this. - # - # We need to recreate these files for each test, as the compiler may - # overwrite some of them when testing with obscure command lines. - # This happens at least with the AIX C compiler. - : > sub/conftest.c - for i in 1 2 3 4 5 6; do - echo '#include "conftst'$i'.h"' >> sub/conftest.c - # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with - # Solaris 8's {/usr,}/bin/sh. - touch sub/conftst$i.h - done - echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf - - # We check with `-c' and `-o' for the sake of the "dashmstdout" - # mode. It turns out that the SunPro C++ compiler does not properly - # handle `-M -o', and we need to detect this. Also, some Intel - # versions had trouble with output in subdirs - am__obj=sub/conftest.${OBJEXT-o} - am__minus_obj="-o $am__obj" - case $depmode in - gcc) - # This depmode causes a compiler race in universal mode. - test "$am__universal" = false || continue - ;; - nosideeffect) - # after this tag, mechanisms are not by side-effect, so they'll - # only be used when explicitly requested - if test "x$enable_dependency_tracking" = xyes; then - continue - else - break - fi - ;; - msvc7 | msvc7msys | msvisualcpp | msvcmsys) - # This compiler won't grok `-c -o', but also, the minuso test has - # not run yet. These depmodes are late enough in the game, and - # so weak that their functioning should not be impacted. - am__obj=conftest.${OBJEXT-o} - am__minus_obj= - ;; - none) break ;; - esac - if depmode=$depmode \ - source=sub/conftest.c object=$am__obj \ - depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ - $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ - >/dev/null 2>conftest.err && - grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && - grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && - grep $am__obj sub/conftest.Po > /dev/null 2>&1 && - ${MAKE-make} -s -f confmf > /dev/null 2>&1; then - # icc doesn't choke on unknown options, it will just issue warnings - # or remarks (even with -Werror). So we grep stderr for any message - # that says an option was ignored or not supported. - # When given -MP, icc 7.0 and 7.1 complain thusly: - # icc: Command line warning: ignoring option '-M'; no argument required - # The diagnosis changed in icc 8.0: - # icc: Command line remark: option '-MP' not supported - if (grep 'ignoring option' conftest.err || - grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else - am_cv_CC_dependencies_compiler_type=$depmode - break - fi - fi - done - - cd .. - rm -rf conftest.dir -else - am_cv_CC_dependencies_compiler_type=none -fi - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_CC_dependencies_compiler_type" >&5 -$as_echo "$am_cv_CC_dependencies_compiler_type" >&6; } -CCDEPMODE=depmode=$am_cv_CC_dependencies_compiler_type - - if - test "x$enable_dependency_tracking" != xno \ - && test "$am_cv_CC_dependencies_compiler_type" = gcc3; then - am__fastdepCC_TRUE= - am__fastdepCC_FALSE='#' -else - am__fastdepCC_TRUE='#' - am__fastdepCC_FALSE= -fi - - -if test "x$CC" != xcc; then - { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC and cc understand -c and -o together" >&5 -$as_echo_n "checking whether $CC and cc understand -c and -o together... " >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether cc understands -c and -o together" >&5 -$as_echo_n "checking whether cc understands -c and -o together... " >&6; } -fi -set dummy $CC; ac_cc=`$as_echo "$2" | - sed 's/[^a-zA-Z0-9_]/_/g;s/^[0-9]/_/'` -if eval \${ac_cv_prog_cc_${ac_cc}_c_o+:} false; then : - $as_echo_n "(cached) " >&6 -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -int -main () -{ - - ; - return 0; -} -_ACEOF -# Make sure it works both with $CC and with simple cc. -# We do the test twice because some compilers refuse to overwrite an -# existing .o file with -o, though they will create one. -ac_try='$CC -c conftest.$ac_ext -o conftest2.$ac_objext >&5' -rm -f conftest2.* -if { { case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 - (eval "$ac_try") 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } && - test -f conftest2.$ac_objext && { { case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 - (eval "$ac_try") 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; }; -then - eval ac_cv_prog_cc_${ac_cc}_c_o=yes - if test "x$CC" != xcc; then - # Test first that cc exists at all. - if { ac_try='cc -c conftest.$ac_ext >&5' - { { case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 - (eval "$ac_try") 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; }; }; then - ac_try='cc -c conftest.$ac_ext -o conftest2.$ac_objext >&5' - rm -f conftest2.* - if { { case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 - (eval "$ac_try") 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } && - test -f conftest2.$ac_objext && { { case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 - (eval "$ac_try") 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; }; - then - # cc works too. - : - else - # cc exists but doesn't like -o. - eval ac_cv_prog_cc_${ac_cc}_c_o=no - fi - fi - fi -else - eval ac_cv_prog_cc_${ac_cc}_c_o=no -fi -rm -f core conftest* - -fi -if eval test \$ac_cv_prog_cc_${ac_cc}_c_o = yes; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } - -$as_echo "#define NO_MINUS_C_MINUS_O 1" >>confdefs.h - -fi - -# FIXME: we rely on the cache variable name because -# there is no other way. -set dummy $CC -am_cc=`echo $2 | sed 's/[^a-zA-Z0-9_]/_/g;s/^[0-9]/_/'` -eval am_t=\$ac_cv_prog_cc_${am_cc}_c_o -if test "$am_t" != yes; then - # Losing compiler, so override with the script. - # FIXME: It is wrong to rewrite CC. - # But if we don't then we get into trouble of one sort or another. - # A longer-term fix would be to have automake use am__CC in this case, - # and then we could set am__CC="\$(top_srcdir)/compile \$(CC)" - CC="$am_aux_dir/compile $CC" -fi - - -ac_ext=cpp -ac_cpp='$CXXCPP $CPPFLAGS' -ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_cxx_compiler_gnu -if test -z "$CXX"; then - if test -n "$CCC"; then - CXX=$CCC - else - if test -n "$ac_tool_prefix"; then - for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC - do - # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. -set dummy $ac_tool_prefix$ac_prog; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_CXX+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$CXX"; then - ac_cv_prog_CXX="$CXX" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_CXX="$ac_tool_prefix$ac_prog" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -CXX=$ac_cv_prog_CXX -if test -n "$CXX"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CXX" >&5 -$as_echo "$CXX" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - - test -n "$CXX" && break - done -fi -if test -z "$CXX"; then - ac_ct_CXX=$CXX - for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC -do - # Extract the first word of "$ac_prog", so it can be a program name with args. -set dummy $ac_prog; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_ac_ct_CXX+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$ac_ct_CXX"; then - ac_cv_prog_ac_ct_CXX="$ac_ct_CXX" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_ac_ct_CXX="$ac_prog" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -ac_ct_CXX=$ac_cv_prog_ac_ct_CXX -if test -n "$ac_ct_CXX"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CXX" >&5 -$as_echo "$ac_ct_CXX" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - - test -n "$ac_ct_CXX" && break -done - - if test "x$ac_ct_CXX" = x; then - CXX="g++" - else - case $cross_compiling:$ac_tool_warned in -yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} -ac_tool_warned=yes ;; -esac - CXX=$ac_ct_CXX - fi -fi - - fi -fi -# Provide some information about the compiler. -$as_echo "$as_me:${as_lineno-$LINENO}: checking for C++ compiler version" >&5 -set X $ac_compile -ac_compiler=$2 -for ac_option in --version -v -V -qversion; do - { { ac_try="$ac_compiler $ac_option >&5" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 - (eval "$ac_compiler $ac_option >&5") 2>conftest.err - ac_status=$? - if test -s conftest.err; then - sed '10a\ -... rest of stderr output deleted ... - 10q' conftest.err >conftest.er1 - cat conftest.er1 >&5 - fi - rm -f conftest.er1 conftest.err - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } -done - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C++ compiler" >&5 -$as_echo_n "checking whether we are using the GNU C++ compiler... " >&6; } -if ${ac_cv_cxx_compiler_gnu+:} false; then : - $as_echo_n "(cached) " >&6 -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -int -main () -{ -#ifndef __GNUC__ - choke me -#endif - - ; - return 0; -} -_ACEOF -if ac_fn_cxx_try_compile "$LINENO"; then : - ac_compiler_gnu=yes -else - ac_compiler_gnu=no -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -ac_cv_cxx_compiler_gnu=$ac_compiler_gnu - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_cxx_compiler_gnu" >&5 -$as_echo "$ac_cv_cxx_compiler_gnu" >&6; } -if test $ac_compiler_gnu = yes; then - GXX=yes -else - GXX= -fi -ac_test_CXXFLAGS=${CXXFLAGS+set} -ac_save_CXXFLAGS=$CXXFLAGS -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CXX accepts -g" >&5 -$as_echo_n "checking whether $CXX accepts -g... " >&6; } -if ${ac_cv_prog_cxx_g+:} false; then : - $as_echo_n "(cached) " >&6 -else - ac_save_cxx_werror_flag=$ac_cxx_werror_flag - ac_cxx_werror_flag=yes - ac_cv_prog_cxx_g=no - CXXFLAGS="-g" - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -int -main () -{ - - ; - return 0; -} -_ACEOF -if ac_fn_cxx_try_compile "$LINENO"; then : - ac_cv_prog_cxx_g=yes -else - CXXFLAGS="" - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -int -main () -{ - - ; - return 0; -} -_ACEOF -if ac_fn_cxx_try_compile "$LINENO"; then : - -else - ac_cxx_werror_flag=$ac_save_cxx_werror_flag - CXXFLAGS="-g" - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -int -main () -{ - - ; - return 0; -} -_ACEOF -if ac_fn_cxx_try_compile "$LINENO"; then : - ac_cv_prog_cxx_g=yes -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext - ac_cxx_werror_flag=$ac_save_cxx_werror_flag -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cxx_g" >&5 -$as_echo "$ac_cv_prog_cxx_g" >&6; } -if test "$ac_test_CXXFLAGS" = set; then - CXXFLAGS=$ac_save_CXXFLAGS -elif test $ac_cv_prog_cxx_g = yes; then - if test "$GXX" = yes; then - CXXFLAGS="-g -O2" - else - CXXFLAGS="-g" - fi -else - if test "$GXX" = yes; then - CXXFLAGS="-O2" - else - CXXFLAGS= - fi -fi -ac_ext=c -ac_cpp='$CPP $CPPFLAGS' -ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_c_compiler_gnu - -depcc="$CXX" am_compiler_list= - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5 -$as_echo_n "checking dependency style of $depcc... " >&6; } -if ${am_cv_CXX_dependencies_compiler_type+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then - # We make a subdir and do the tests there. Otherwise we can end up - # making bogus files that we don't know about and never remove. For - # instance it was reported that on HP-UX the gcc test will end up - # making a dummy file named `D' -- because `-MD' means `put the output - # in D'. - rm -rf conftest.dir - mkdir conftest.dir - # Copy depcomp to subdir because otherwise we won't find it if we're - # using a relative directory. - cp "$am_depcomp" conftest.dir - cd conftest.dir - # We will build objects and dependencies in a subdirectory because - # it helps to detect inapplicable dependency modes. For instance - # both Tru64's cc and ICC support -MD to output dependencies as a - # side effect of compilation, but ICC will put the dependencies in - # the current directory while Tru64 will put them in the object - # directory. - mkdir sub - - am_cv_CXX_dependencies_compiler_type=none - if test "$am_compiler_list" = ""; then - am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp` - fi - am__universal=false - case " $depcc " in #( - *\ -arch\ *\ -arch\ *) am__universal=true ;; - esac - - for depmode in $am_compiler_list; do - # Setup a source with many dependencies, because some compilers - # like to wrap large dependency lists on column 80 (with \), and - # we should not choose a depcomp mode which is confused by this. - # - # We need to recreate these files for each test, as the compiler may - # overwrite some of them when testing with obscure command lines. - # This happens at least with the AIX C compiler. - : > sub/conftest.c - for i in 1 2 3 4 5 6; do - echo '#include "conftst'$i'.h"' >> sub/conftest.c - # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with - # Solaris 8's {/usr,}/bin/sh. - touch sub/conftst$i.h - done - echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf - - # We check with `-c' and `-o' for the sake of the "dashmstdout" - # mode. It turns out that the SunPro C++ compiler does not properly - # handle `-M -o', and we need to detect this. Also, some Intel - # versions had trouble with output in subdirs - am__obj=sub/conftest.${OBJEXT-o} - am__minus_obj="-o $am__obj" - case $depmode in - gcc) - # This depmode causes a compiler race in universal mode. - test "$am__universal" = false || continue - ;; - nosideeffect) - # after this tag, mechanisms are not by side-effect, so they'll - # only be used when explicitly requested - if test "x$enable_dependency_tracking" = xyes; then - continue - else - break - fi - ;; - msvc7 | msvc7msys | msvisualcpp | msvcmsys) - # This compiler won't grok `-c -o', but also, the minuso test has - # not run yet. These depmodes are late enough in the game, and - # so weak that their functioning should not be impacted. - am__obj=conftest.${OBJEXT-o} - am__minus_obj= - ;; - none) break ;; - esac - if depmode=$depmode \ - source=sub/conftest.c object=$am__obj \ - depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ - $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ - >/dev/null 2>conftest.err && - grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && - grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && - grep $am__obj sub/conftest.Po > /dev/null 2>&1 && - ${MAKE-make} -s -f confmf > /dev/null 2>&1; then - # icc doesn't choke on unknown options, it will just issue warnings - # or remarks (even with -Werror). So we grep stderr for any message - # that says an option was ignored or not supported. - # When given -MP, icc 7.0 and 7.1 complain thusly: - # icc: Command line warning: ignoring option '-M'; no argument required - # The diagnosis changed in icc 8.0: - # icc: Command line remark: option '-MP' not supported - if (grep 'ignoring option' conftest.err || - grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else - am_cv_CXX_dependencies_compiler_type=$depmode - break - fi - fi - done - - cd .. - rm -rf conftest.dir -else - am_cv_CXX_dependencies_compiler_type=none -fi - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_CXX_dependencies_compiler_type" >&5 -$as_echo "$am_cv_CXX_dependencies_compiler_type" >&6; } -CXXDEPMODE=depmode=$am_cv_CXX_dependencies_compiler_type - - if - test "x$enable_dependency_tracking" != xno \ - && test "$am_cv_CXX_dependencies_compiler_type" = gcc3; then - am__fastdepCXX_TRUE= - am__fastdepCXX_FALSE='#' -else - am__fastdepCXX_TRUE='#' - am__fastdepCXX_FALSE= -fi - - - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ln -s works" >&5 -$as_echo_n "checking whether ln -s works... " >&6; } -LN_S=$as_ln_s -if test "$LN_S" = "ln -s"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no, using $LN_S" >&5 -$as_echo "no, using $LN_S" >&6; } -fi - - -# AC_DISABLE_SHARED -case `pwd` in - *\ * | *\ *) - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Libtool does not cope well with whitespace in \`pwd\`" >&5 -$as_echo "$as_me: WARNING: Libtool does not cope well with whitespace in \`pwd\`" >&2;} ;; -esac - - - -macro_version='2.4.2' -macro_revision='1.3337' - - - - - - - - - - - - - -ltmain="$ac_aux_dir/ltmain.sh" - -# Make sure we can run config.sub. -$SHELL "$ac_aux_dir/config.sub" sun4 >/dev/null 2>&1 || - as_fn_error $? "cannot run $SHELL $ac_aux_dir/config.sub" "$LINENO" 5 - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking build system type" >&5 -$as_echo_n "checking build system type... " >&6; } -if ${ac_cv_build+:} false; then : - $as_echo_n "(cached) " >&6 -else - ac_build_alias=$build_alias -test "x$ac_build_alias" = x && - ac_build_alias=`$SHELL "$ac_aux_dir/config.guess"` -test "x$ac_build_alias" = x && - as_fn_error $? "cannot guess build type; you must specify one" "$LINENO" 5 -ac_cv_build=`$SHELL "$ac_aux_dir/config.sub" $ac_build_alias` || - as_fn_error $? "$SHELL $ac_aux_dir/config.sub $ac_build_alias failed" "$LINENO" 5 - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_build" >&5 -$as_echo "$ac_cv_build" >&6; } -case $ac_cv_build in -*-*-*) ;; -*) as_fn_error $? "invalid value of canonical build" "$LINENO" 5;; -esac -build=$ac_cv_build -ac_save_IFS=$IFS; IFS='-' -set x $ac_cv_build -shift -build_cpu=$1 -build_vendor=$2 -shift; shift -# Remember, the first character of IFS is used to create $*, -# except with old shells: -build_os=$* -IFS=$ac_save_IFS -case $build_os in *\ *) build_os=`echo "$build_os" | sed 's/ /-/g'`;; esac - - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking host system type" >&5 -$as_echo_n "checking host system type... " >&6; } -if ${ac_cv_host+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test "x$host_alias" = x; then - ac_cv_host=$ac_cv_build -else - ac_cv_host=`$SHELL "$ac_aux_dir/config.sub" $host_alias` || - as_fn_error $? "$SHELL $ac_aux_dir/config.sub $host_alias failed" "$LINENO" 5 -fi - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_host" >&5 -$as_echo "$ac_cv_host" >&6; } -case $ac_cv_host in -*-*-*) ;; -*) as_fn_error $? "invalid value of canonical host" "$LINENO" 5;; -esac -host=$ac_cv_host -ac_save_IFS=$IFS; IFS='-' -set x $ac_cv_host -shift -host_cpu=$1 -host_vendor=$2 -shift; shift -# Remember, the first character of IFS is used to create $*, -# except with old shells: -host_os=$* -IFS=$ac_save_IFS -case $host_os in *\ *) host_os=`echo "$host_os" | sed 's/ /-/g'`;; esac - - -# Backslashify metacharacters that are still active within -# double-quoted strings. -sed_quote_subst='s/\(["`$\\]\)/\\\1/g' - -# Same as above, but do not quote variable references. -double_quote_subst='s/\(["`\\]\)/\\\1/g' - -# Sed substitution to delay expansion of an escaped shell variable in a -# double_quote_subst'ed string. -delay_variable_subst='s/\\\\\\\\\\\$/\\\\\\$/g' - -# Sed substitution to delay expansion of an escaped single quote. -delay_single_quote_subst='s/'\''/'\'\\\\\\\'\''/g' - -# Sed substitution to avoid accidental globbing in evaled expressions -no_glob_subst='s/\*/\\\*/g' - -ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' -ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO -ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO$ECHO - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to print strings" >&5 -$as_echo_n "checking how to print strings... " >&6; } -# Test print first, because it will be a builtin if present. -if test "X`( print -r -- -n ) 2>/dev/null`" = X-n && \ - test "X`print -r -- $ECHO 2>/dev/null`" = "X$ECHO"; then - ECHO='print -r --' -elif test "X`printf %s $ECHO 2>/dev/null`" = "X$ECHO"; then - ECHO='printf %s\n' -else - # Use this function as a fallback that always works. - func_fallback_echo () - { - eval 'cat <<_LTECHO_EOF -$1 -_LTECHO_EOF' - } - ECHO='func_fallback_echo' -fi - -# func_echo_all arg... -# Invoke $ECHO with all args, space-separated. -func_echo_all () -{ - $ECHO "" -} - -case "$ECHO" in - printf*) { $as_echo "$as_me:${as_lineno-$LINENO}: result: printf" >&5 -$as_echo "printf" >&6; } ;; - print*) { $as_echo "$as_me:${as_lineno-$LINENO}: result: print -r" >&5 -$as_echo "print -r" >&6; } ;; - *) { $as_echo "$as_me:${as_lineno-$LINENO}: result: cat" >&5 -$as_echo "cat" >&6; } ;; -esac - - - - - - - - - - - - - - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a sed that does not truncate output" >&5 -$as_echo_n "checking for a sed that does not truncate output... " >&6; } -if ${ac_cv_path_SED+:} false; then : - $as_echo_n "(cached) " >&6 -else - ac_script=s/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb/ - for ac_i in 1 2 3 4 5 6 7; do - ac_script="$ac_script$as_nl$ac_script" - done - echo "$ac_script" 2>/dev/null | sed 99q >conftest.sed - { ac_script=; unset ac_script;} - if test -z "$SED"; then - ac_path_SED_found=false - # Loop through the user's path and test for each of PROGNAME-LIST - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_prog in sed gsed; do - for ac_exec_ext in '' $ac_executable_extensions; do - ac_path_SED="$as_dir/$ac_prog$ac_exec_ext" - as_fn_executable_p "$ac_path_SED" || continue -# Check for GNU ac_path_SED and select it if it is found. - # Check for GNU $ac_path_SED -case `"$ac_path_SED" --version 2>&1` in -*GNU*) - ac_cv_path_SED="$ac_path_SED" ac_path_SED_found=:;; -*) - ac_count=0 - $as_echo_n 0123456789 >"conftest.in" - while : - do - cat "conftest.in" "conftest.in" >"conftest.tmp" - mv "conftest.tmp" "conftest.in" - cp "conftest.in" "conftest.nl" - $as_echo '' >> "conftest.nl" - "$ac_path_SED" -f conftest.sed < "conftest.nl" >"conftest.out" 2>/dev/null || break - diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break - as_fn_arith $ac_count + 1 && ac_count=$as_val - if test $ac_count -gt ${ac_path_SED_max-0}; then - # Best one so far, save it but keep looking for a better one - ac_cv_path_SED="$ac_path_SED" - ac_path_SED_max=$ac_count - fi - # 10*(2^10) chars as input seems more than enough - test $ac_count -gt 10 && break - done - rm -f conftest.in conftest.tmp conftest.nl conftest.out;; -esac - - $ac_path_SED_found && break 3 - done - done - done -IFS=$as_save_IFS - if test -z "$ac_cv_path_SED"; then - as_fn_error $? "no acceptable sed could be found in \$PATH" "$LINENO" 5 - fi -else - ac_cv_path_SED=$SED -fi - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_SED" >&5 -$as_echo "$ac_cv_path_SED" >&6; } - SED="$ac_cv_path_SED" - rm -f conftest.sed - -test -z "$SED" && SED=sed -Xsed="$SED -e 1s/^X//" - - - - - - - - - - - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for grep that handles long lines and -e" >&5 -$as_echo_n "checking for grep that handles long lines and -e... " >&6; } -if ${ac_cv_path_GREP+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -z "$GREP"; then - ac_path_GREP_found=false - # Loop through the user's path and test for each of PROGNAME-LIST - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_prog in grep ggrep; do - for ac_exec_ext in '' $ac_executable_extensions; do - ac_path_GREP="$as_dir/$ac_prog$ac_exec_ext" - as_fn_executable_p "$ac_path_GREP" || continue -# Check for GNU ac_path_GREP and select it if it is found. - # Check for GNU $ac_path_GREP -case `"$ac_path_GREP" --version 2>&1` in -*GNU*) - ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_found=:;; -*) - ac_count=0 - $as_echo_n 0123456789 >"conftest.in" - while : - do - cat "conftest.in" "conftest.in" >"conftest.tmp" - mv "conftest.tmp" "conftest.in" - cp "conftest.in" "conftest.nl" - $as_echo 'GREP' >> "conftest.nl" - "$ac_path_GREP" -e 'GREP$' -e '-(cannot match)-' < "conftest.nl" >"conftest.out" 2>/dev/null || break - diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break - as_fn_arith $ac_count + 1 && ac_count=$as_val - if test $ac_count -gt ${ac_path_GREP_max-0}; then - # Best one so far, save it but keep looking for a better one - ac_cv_path_GREP="$ac_path_GREP" - ac_path_GREP_max=$ac_count - fi - # 10*(2^10) chars as input seems more than enough - test $ac_count -gt 10 && break - done - rm -f conftest.in conftest.tmp conftest.nl conftest.out;; -esac - - $ac_path_GREP_found && break 3 - done - done - done -IFS=$as_save_IFS - if test -z "$ac_cv_path_GREP"; then - as_fn_error $? "no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 - fi -else - ac_cv_path_GREP=$GREP -fi - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_GREP" >&5 -$as_echo "$ac_cv_path_GREP" >&6; } - GREP="$ac_cv_path_GREP" - - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for egrep" >&5 -$as_echo_n "checking for egrep... " >&6; } -if ${ac_cv_path_EGREP+:} false; then : - $as_echo_n "(cached) " >&6 -else - if echo a | $GREP -E '(a|b)' >/dev/null 2>&1 - then ac_cv_path_EGREP="$GREP -E" - else - if test -z "$EGREP"; then - ac_path_EGREP_found=false - # Loop through the user's path and test for each of PROGNAME-LIST - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_prog in egrep; do - for ac_exec_ext in '' $ac_executable_extensions; do - ac_path_EGREP="$as_dir/$ac_prog$ac_exec_ext" - as_fn_executable_p "$ac_path_EGREP" || continue -# Check for GNU ac_path_EGREP and select it if it is found. - # Check for GNU $ac_path_EGREP -case `"$ac_path_EGREP" --version 2>&1` in -*GNU*) - ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_found=:;; -*) - ac_count=0 - $as_echo_n 0123456789 >"conftest.in" - while : - do - cat "conftest.in" "conftest.in" >"conftest.tmp" - mv "conftest.tmp" "conftest.in" - cp "conftest.in" "conftest.nl" - $as_echo 'EGREP' >> "conftest.nl" - "$ac_path_EGREP" 'EGREP$' < "conftest.nl" >"conftest.out" 2>/dev/null || break - diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break - as_fn_arith $ac_count + 1 && ac_count=$as_val - if test $ac_count -gt ${ac_path_EGREP_max-0}; then - # Best one so far, save it but keep looking for a better one - ac_cv_path_EGREP="$ac_path_EGREP" - ac_path_EGREP_max=$ac_count - fi - # 10*(2^10) chars as input seems more than enough - test $ac_count -gt 10 && break - done - rm -f conftest.in conftest.tmp conftest.nl conftest.out;; -esac - - $ac_path_EGREP_found && break 3 - done - done - done -IFS=$as_save_IFS - if test -z "$ac_cv_path_EGREP"; then - as_fn_error $? "no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 - fi -else - ac_cv_path_EGREP=$EGREP -fi - - fi -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_EGREP" >&5 -$as_echo "$ac_cv_path_EGREP" >&6; } - EGREP="$ac_cv_path_EGREP" - - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for fgrep" >&5 -$as_echo_n "checking for fgrep... " >&6; } -if ${ac_cv_path_FGREP+:} false; then : - $as_echo_n "(cached) " >&6 -else - if echo 'ab*c' | $GREP -F 'ab*c' >/dev/null 2>&1 - then ac_cv_path_FGREP="$GREP -F" - else - if test -z "$FGREP"; then - ac_path_FGREP_found=false - # Loop through the user's path and test for each of PROGNAME-LIST - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_prog in fgrep; do - for ac_exec_ext in '' $ac_executable_extensions; do - ac_path_FGREP="$as_dir/$ac_prog$ac_exec_ext" - as_fn_executable_p "$ac_path_FGREP" || continue -# Check for GNU ac_path_FGREP and select it if it is found. - # Check for GNU $ac_path_FGREP -case `"$ac_path_FGREP" --version 2>&1` in -*GNU*) - ac_cv_path_FGREP="$ac_path_FGREP" ac_path_FGREP_found=:;; -*) - ac_count=0 - $as_echo_n 0123456789 >"conftest.in" - while : - do - cat "conftest.in" "conftest.in" >"conftest.tmp" - mv "conftest.tmp" "conftest.in" - cp "conftest.in" "conftest.nl" - $as_echo 'FGREP' >> "conftest.nl" - "$ac_path_FGREP" FGREP < "conftest.nl" >"conftest.out" 2>/dev/null || break - diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break - as_fn_arith $ac_count + 1 && ac_count=$as_val - if test $ac_count -gt ${ac_path_FGREP_max-0}; then - # Best one so far, save it but keep looking for a better one - ac_cv_path_FGREP="$ac_path_FGREP" - ac_path_FGREP_max=$ac_count - fi - # 10*(2^10) chars as input seems more than enough - test $ac_count -gt 10 && break - done - rm -f conftest.in conftest.tmp conftest.nl conftest.out;; -esac - - $ac_path_FGREP_found && break 3 - done - done - done -IFS=$as_save_IFS - if test -z "$ac_cv_path_FGREP"; then - as_fn_error $? "no acceptable fgrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 - fi -else - ac_cv_path_FGREP=$FGREP -fi - - fi -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_FGREP" >&5 -$as_echo "$ac_cv_path_FGREP" >&6; } - FGREP="$ac_cv_path_FGREP" - - -test -z "$GREP" && GREP=grep - - - - - - - - - - - - - - - - - - - -# Check whether --with-gnu-ld was given. -if test "${with_gnu_ld+set}" = set; then : - withval=$with_gnu_ld; test "$withval" = no || with_gnu_ld=yes -else - with_gnu_ld=no -fi - -ac_prog=ld -if test "$GCC" = yes; then - # Check if gcc -print-prog-name=ld gives a path. - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ld used by $CC" >&5 -$as_echo_n "checking for ld used by $CC... " >&6; } - case $host in - *-*-mingw*) - # gcc leaves a trailing carriage return which upsets mingw - ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;; - *) - ac_prog=`($CC -print-prog-name=ld) 2>&5` ;; - esac - case $ac_prog in - # Accept absolute paths. - [\\/]* | ?:[\\/]*) - re_direlt='/[^/][^/]*/\.\./' - # Canonicalize the pathname of ld - ac_prog=`$ECHO "$ac_prog"| $SED 's%\\\\%/%g'` - while $ECHO "$ac_prog" | $GREP "$re_direlt" > /dev/null 2>&1; do - ac_prog=`$ECHO $ac_prog| $SED "s%$re_direlt%/%"` - done - test -z "$LD" && LD="$ac_prog" - ;; - "") - # If it fails, then pretend we aren't using GCC. - ac_prog=ld - ;; - *) - # If it is relative, then search for the first ld in PATH. - with_gnu_ld=unknown - ;; - esac -elif test "$with_gnu_ld" = yes; then - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU ld" >&5 -$as_echo_n "checking for GNU ld... " >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for non-GNU ld" >&5 -$as_echo_n "checking for non-GNU ld... " >&6; } -fi -if ${lt_cv_path_LD+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -z "$LD"; then - lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR - for ac_dir in $PATH; do - IFS="$lt_save_ifs" - test -z "$ac_dir" && ac_dir=. - if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then - lt_cv_path_LD="$ac_dir/$ac_prog" - # Check to see if the program is GNU ld. I'd rather use --version, - # but apparently some variants of GNU ld only accept -v. - # Break only if it was the GNU/non-GNU ld that we prefer. - case `"$lt_cv_path_LD" -v 2>&1 &5 -$as_echo "$LD" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi -test -z "$LD" && as_fn_error $? "no acceptable ld found in \$PATH" "$LINENO" 5 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if the linker ($LD) is GNU ld" >&5 -$as_echo_n "checking if the linker ($LD) is GNU ld... " >&6; } -if ${lt_cv_prog_gnu_ld+:} false; then : - $as_echo_n "(cached) " >&6 -else - # I'd rather use --version here, but apparently some GNU lds only accept -v. -case `$LD -v 2>&1 &5 -$as_echo "$lt_cv_prog_gnu_ld" >&6; } -with_gnu_ld=$lt_cv_prog_gnu_ld - - - - - - - - - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for BSD- or MS-compatible name lister (nm)" >&5 -$as_echo_n "checking for BSD- or MS-compatible name lister (nm)... " >&6; } -if ${lt_cv_path_NM+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$NM"; then - # Let the user override the test. - lt_cv_path_NM="$NM" -else - lt_nm_to_check="${ac_tool_prefix}nm" - if test -n "$ac_tool_prefix" && test "$build" = "$host"; then - lt_nm_to_check="$lt_nm_to_check nm" - fi - for lt_tmp_nm in $lt_nm_to_check; do - lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR - for ac_dir in $PATH /usr/ccs/bin/elf /usr/ccs/bin /usr/ucb /bin; do - IFS="$lt_save_ifs" - test -z "$ac_dir" && ac_dir=. - tmp_nm="$ac_dir/$lt_tmp_nm" - if test -f "$tmp_nm" || test -f "$tmp_nm$ac_exeext" ; then - # Check to see if the nm accepts a BSD-compat flag. - # Adding the `sed 1q' prevents false positives on HP-UX, which says: - # nm: unknown option "B" ignored - # Tru64's nm complains that /dev/null is an invalid object file - case `"$tmp_nm" -B /dev/null 2>&1 | sed '1q'` in - */dev/null* | *'Invalid file or object type'*) - lt_cv_path_NM="$tmp_nm -B" - break - ;; - *) - case `"$tmp_nm" -p /dev/null 2>&1 | sed '1q'` in - */dev/null*) - lt_cv_path_NM="$tmp_nm -p" - break - ;; - *) - lt_cv_path_NM=${lt_cv_path_NM="$tmp_nm"} # keep the first match, but - continue # so that we can try to find one that supports BSD flags - ;; - esac - ;; - esac - fi - done - IFS="$lt_save_ifs" - done - : ${lt_cv_path_NM=no} -fi -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_path_NM" >&5 -$as_echo "$lt_cv_path_NM" >&6; } -if test "$lt_cv_path_NM" != "no"; then - NM="$lt_cv_path_NM" -else - # Didn't find any BSD compatible name lister, look for dumpbin. - if test -n "$DUMPBIN"; then : - # Let the user override the test. - else - if test -n "$ac_tool_prefix"; then - for ac_prog in dumpbin "link -dump" - do - # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. -set dummy $ac_tool_prefix$ac_prog; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_DUMPBIN+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$DUMPBIN"; then - ac_cv_prog_DUMPBIN="$DUMPBIN" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_DUMPBIN="$ac_tool_prefix$ac_prog" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -DUMPBIN=$ac_cv_prog_DUMPBIN -if test -n "$DUMPBIN"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DUMPBIN" >&5 -$as_echo "$DUMPBIN" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - - test -n "$DUMPBIN" && break - done -fi -if test -z "$DUMPBIN"; then - ac_ct_DUMPBIN=$DUMPBIN - for ac_prog in dumpbin "link -dump" -do - # Extract the first word of "$ac_prog", so it can be a program name with args. -set dummy $ac_prog; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_ac_ct_DUMPBIN+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$ac_ct_DUMPBIN"; then - ac_cv_prog_ac_ct_DUMPBIN="$ac_ct_DUMPBIN" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_ac_ct_DUMPBIN="$ac_prog" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -ac_ct_DUMPBIN=$ac_cv_prog_ac_ct_DUMPBIN -if test -n "$ac_ct_DUMPBIN"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DUMPBIN" >&5 -$as_echo "$ac_ct_DUMPBIN" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - - test -n "$ac_ct_DUMPBIN" && break -done - - if test "x$ac_ct_DUMPBIN" = x; then - DUMPBIN=":" - else - case $cross_compiling:$ac_tool_warned in -yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} -ac_tool_warned=yes ;; -esac - DUMPBIN=$ac_ct_DUMPBIN - fi -fi - - case `$DUMPBIN -symbols /dev/null 2>&1 | sed '1q'` in - *COFF*) - DUMPBIN="$DUMPBIN -symbols" - ;; - *) - DUMPBIN=: - ;; - esac - fi - - if test "$DUMPBIN" != ":"; then - NM="$DUMPBIN" - fi -fi -test -z "$NM" && NM=nm - - - - - - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking the name lister ($NM) interface" >&5 -$as_echo_n "checking the name lister ($NM) interface... " >&6; } -if ${lt_cv_nm_interface+:} false; then : - $as_echo_n "(cached) " >&6 -else - lt_cv_nm_interface="BSD nm" - echo "int some_variable = 0;" > conftest.$ac_ext - (eval echo "\"\$as_me:$LINENO: $ac_compile\"" >&5) - (eval "$ac_compile" 2>conftest.err) - cat conftest.err >&5 - (eval echo "\"\$as_me:$LINENO: $NM \\\"conftest.$ac_objext\\\"\"" >&5) - (eval "$NM \"conftest.$ac_objext\"" 2>conftest.err > conftest.out) - cat conftest.err >&5 - (eval echo "\"\$as_me:$LINENO: output\"" >&5) - cat conftest.out >&5 - if $GREP 'External.*some_variable' conftest.out > /dev/null; then - lt_cv_nm_interface="MS dumpbin" - fi - rm -f conftest* -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_nm_interface" >&5 -$as_echo "$lt_cv_nm_interface" >&6; } - -# find the maximum length of command line arguments -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking the maximum length of command line arguments" >&5 -$as_echo_n "checking the maximum length of command line arguments... " >&6; } -if ${lt_cv_sys_max_cmd_len+:} false; then : - $as_echo_n "(cached) " >&6 -else - i=0 - teststring="ABCD" - - case $build_os in - msdosdjgpp*) - # On DJGPP, this test can blow up pretty badly due to problems in libc - # (any single argument exceeding 2000 bytes causes a buffer overrun - # during glob expansion). Even if it were fixed, the result of this - # check would be larger than it should be. - lt_cv_sys_max_cmd_len=12288; # 12K is about right - ;; - - gnu*) - # Under GNU Hurd, this test is not required because there is - # no limit to the length of command line arguments. - # Libtool will interpret -1 as no limit whatsoever - lt_cv_sys_max_cmd_len=-1; - ;; - - cygwin* | mingw* | cegcc*) - # On Win9x/ME, this test blows up -- it succeeds, but takes - # about 5 minutes as the teststring grows exponentially. - # Worse, since 9x/ME are not pre-emptively multitasking, - # you end up with a "frozen" computer, even though with patience - # the test eventually succeeds (with a max line length of 256k). - # Instead, let's just punt: use the minimum linelength reported by - # all of the supported platforms: 8192 (on NT/2K/XP). - lt_cv_sys_max_cmd_len=8192; - ;; - - mint*) - # On MiNT this can take a long time and run out of memory. - lt_cv_sys_max_cmd_len=8192; - ;; - - amigaos*) - # On AmigaOS with pdksh, this test takes hours, literally. - # So we just punt and use a minimum line length of 8192. - lt_cv_sys_max_cmd_len=8192; - ;; - - netbsd* | freebsd* | openbsd* | darwin* | dragonfly*) - # This has been around since 386BSD, at least. Likely further. - if test -x /sbin/sysctl; then - lt_cv_sys_max_cmd_len=`/sbin/sysctl -n kern.argmax` - elif test -x /usr/sbin/sysctl; then - lt_cv_sys_max_cmd_len=`/usr/sbin/sysctl -n kern.argmax` - else - lt_cv_sys_max_cmd_len=65536 # usable default for all BSDs - fi - # And add a safety zone - lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` - lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` - ;; - - interix*) - # We know the value 262144 and hardcode it with a safety zone (like BSD) - lt_cv_sys_max_cmd_len=196608 - ;; - - os2*) - # The test takes a long time on OS/2. - lt_cv_sys_max_cmd_len=8192 - ;; - - osf*) - # Dr. Hans Ekkehard Plesser reports seeing a kernel panic running configure - # due to this test when exec_disable_arg_limit is 1 on Tru64. It is not - # nice to cause kernel panics so lets avoid the loop below. - # First set a reasonable default. - lt_cv_sys_max_cmd_len=16384 - # - if test -x /sbin/sysconfig; then - case `/sbin/sysconfig -q proc exec_disable_arg_limit` in - *1*) lt_cv_sys_max_cmd_len=-1 ;; - esac - fi - ;; - sco3.2v5*) - lt_cv_sys_max_cmd_len=102400 - ;; - sysv5* | sco5v6* | sysv4.2uw2*) - kargmax=`grep ARG_MAX /etc/conf/cf.d/stune 2>/dev/null` - if test -n "$kargmax"; then - lt_cv_sys_max_cmd_len=`echo $kargmax | sed 's/.*[ ]//'` - else - lt_cv_sys_max_cmd_len=32768 - fi - ;; - *) - lt_cv_sys_max_cmd_len=`(getconf ARG_MAX) 2> /dev/null` - if test -n "$lt_cv_sys_max_cmd_len"; then - lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` - lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` - else - # Make teststring a little bigger before we do anything with it. - # a 1K string should be a reasonable start. - for i in 1 2 3 4 5 6 7 8 ; do - teststring=$teststring$teststring - done - SHELL=${SHELL-${CONFIG_SHELL-/bin/sh}} - # If test is not a shell built-in, we'll probably end up computing a - # maximum length that is only half of the actual maximum length, but - # we can't tell. - while { test "X"`env echo "$teststring$teststring" 2>/dev/null` \ - = "X$teststring$teststring"; } >/dev/null 2>&1 && - test $i != 17 # 1/2 MB should be enough - do - i=`expr $i + 1` - teststring=$teststring$teststring - done - # Only check the string length outside the loop. - lt_cv_sys_max_cmd_len=`expr "X$teststring" : ".*" 2>&1` - teststring= - # Add a significant safety factor because C++ compilers can tack on - # massive amounts of additional arguments before passing them to the - # linker. It appears as though 1/2 is a usable value. - lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 2` - fi - ;; - esac - -fi - -if test -n $lt_cv_sys_max_cmd_len ; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_sys_max_cmd_len" >&5 -$as_echo "$lt_cv_sys_max_cmd_len" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: none" >&5 -$as_echo "none" >&6; } -fi -max_cmd_len=$lt_cv_sys_max_cmd_len - - - - - - -: ${CP="cp -f"} -: ${MV="mv -f"} -: ${RM="rm -f"} - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the shell understands some XSI constructs" >&5 -$as_echo_n "checking whether the shell understands some XSI constructs... " >&6; } -# Try some XSI features -xsi_shell=no -( _lt_dummy="a/b/c" - test "${_lt_dummy##*/},${_lt_dummy%/*},${_lt_dummy#??}"${_lt_dummy%"$_lt_dummy"}, \ - = c,a/b,b/c, \ - && eval 'test $(( 1 + 1 )) -eq 2 \ - && test "${#_lt_dummy}" -eq 5' ) >/dev/null 2>&1 \ - && xsi_shell=yes -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $xsi_shell" >&5 -$as_echo "$xsi_shell" >&6; } - - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the shell understands \"+=\"" >&5 -$as_echo_n "checking whether the shell understands \"+=\"... " >&6; } -lt_shell_append=no -( foo=bar; set foo baz; eval "$1+=\$2" && test "$foo" = barbaz ) \ - >/dev/null 2>&1 \ - && lt_shell_append=yes -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_shell_append" >&5 -$as_echo "$lt_shell_append" >&6; } - - -if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then - lt_unset=unset -else - lt_unset=false -fi - - - - - -# test EBCDIC or ASCII -case `echo X|tr X '\101'` in - A) # ASCII based system - # \n is not interpreted correctly by Solaris 8 /usr/ucb/tr - lt_SP2NL='tr \040 \012' - lt_NL2SP='tr \015\012 \040\040' - ;; - *) # EBCDIC based system - lt_SP2NL='tr \100 \n' - lt_NL2SP='tr \r\n \100\100' - ;; -esac - - - - - - - - - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to convert $build file names to $host format" >&5 -$as_echo_n "checking how to convert $build file names to $host format... " >&6; } -if ${lt_cv_to_host_file_cmd+:} false; then : - $as_echo_n "(cached) " >&6 -else - case $host in - *-*-mingw* ) - case $build in - *-*-mingw* ) # actually msys - lt_cv_to_host_file_cmd=func_convert_file_msys_to_w32 - ;; - *-*-cygwin* ) - lt_cv_to_host_file_cmd=func_convert_file_cygwin_to_w32 - ;; - * ) # otherwise, assume *nix - lt_cv_to_host_file_cmd=func_convert_file_nix_to_w32 - ;; - esac - ;; - *-*-cygwin* ) - case $build in - *-*-mingw* ) # actually msys - lt_cv_to_host_file_cmd=func_convert_file_msys_to_cygwin - ;; - *-*-cygwin* ) - lt_cv_to_host_file_cmd=func_convert_file_noop - ;; - * ) # otherwise, assume *nix - lt_cv_to_host_file_cmd=func_convert_file_nix_to_cygwin - ;; - esac - ;; - * ) # unhandled hosts (and "normal" native builds) - lt_cv_to_host_file_cmd=func_convert_file_noop - ;; -esac - -fi - -to_host_file_cmd=$lt_cv_to_host_file_cmd -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_to_host_file_cmd" >&5 -$as_echo "$lt_cv_to_host_file_cmd" >&6; } - - - - - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to convert $build file names to toolchain format" >&5 -$as_echo_n "checking how to convert $build file names to toolchain format... " >&6; } -if ${lt_cv_to_tool_file_cmd+:} false; then : - $as_echo_n "(cached) " >&6 -else - #assume ordinary cross tools, or native build. -lt_cv_to_tool_file_cmd=func_convert_file_noop -case $host in - *-*-mingw* ) - case $build in - *-*-mingw* ) # actually msys - lt_cv_to_tool_file_cmd=func_convert_file_msys_to_w32 - ;; - esac - ;; -esac - -fi - -to_tool_file_cmd=$lt_cv_to_tool_file_cmd -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_to_tool_file_cmd" >&5 -$as_echo "$lt_cv_to_tool_file_cmd" >&6; } - - - - - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $LD option to reload object files" >&5 -$as_echo_n "checking for $LD option to reload object files... " >&6; } -if ${lt_cv_ld_reload_flag+:} false; then : - $as_echo_n "(cached) " >&6 -else - lt_cv_ld_reload_flag='-r' -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_reload_flag" >&5 -$as_echo "$lt_cv_ld_reload_flag" >&6; } -reload_flag=$lt_cv_ld_reload_flag -case $reload_flag in -"" | " "*) ;; -*) reload_flag=" $reload_flag" ;; -esac -reload_cmds='$LD$reload_flag -o $output$reload_objs' -case $host_os in - cygwin* | mingw* | pw32* | cegcc*) - if test "$GCC" != yes; then - reload_cmds=false - fi - ;; - darwin*) - if test "$GCC" = yes; then - reload_cmds='$LTCC $LTCFLAGS -nostdlib ${wl}-r -o $output$reload_objs' - else - reload_cmds='$LD$reload_flag -o $output$reload_objs' - fi - ;; -esac - - - - - - - - - -if test -n "$ac_tool_prefix"; then - # Extract the first word of "${ac_tool_prefix}objdump", so it can be a program name with args. -set dummy ${ac_tool_prefix}objdump; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_OBJDUMP+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$OBJDUMP"; then - ac_cv_prog_OBJDUMP="$OBJDUMP" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_OBJDUMP="${ac_tool_prefix}objdump" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -OBJDUMP=$ac_cv_prog_OBJDUMP -if test -n "$OBJDUMP"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OBJDUMP" >&5 -$as_echo "$OBJDUMP" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - -fi -if test -z "$ac_cv_prog_OBJDUMP"; then - ac_ct_OBJDUMP=$OBJDUMP - # Extract the first word of "objdump", so it can be a program name with args. -set dummy objdump; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_ac_ct_OBJDUMP+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$ac_ct_OBJDUMP"; then - ac_cv_prog_ac_ct_OBJDUMP="$ac_ct_OBJDUMP" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_ac_ct_OBJDUMP="objdump" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -ac_ct_OBJDUMP=$ac_cv_prog_ac_ct_OBJDUMP -if test -n "$ac_ct_OBJDUMP"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OBJDUMP" >&5 -$as_echo "$ac_ct_OBJDUMP" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - if test "x$ac_ct_OBJDUMP" = x; then - OBJDUMP="false" - else - case $cross_compiling:$ac_tool_warned in -yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} -ac_tool_warned=yes ;; -esac - OBJDUMP=$ac_ct_OBJDUMP - fi -else - OBJDUMP="$ac_cv_prog_OBJDUMP" -fi - -test -z "$OBJDUMP" && OBJDUMP=objdump - - - - - - - - - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to recognize dependent libraries" >&5 -$as_echo_n "checking how to recognize dependent libraries... " >&6; } -if ${lt_cv_deplibs_check_method+:} false; then : - $as_echo_n "(cached) " >&6 -else - lt_cv_file_magic_cmd='$MAGIC_CMD' -lt_cv_file_magic_test_file= -lt_cv_deplibs_check_method='unknown' -# Need to set the preceding variable on all platforms that support -# interlibrary dependencies. -# 'none' -- dependencies not supported. -# `unknown' -- same as none, but documents that we really don't know. -# 'pass_all' -- all dependencies passed with no checks. -# 'test_compile' -- check by making test program. -# 'file_magic [[regex]]' -- check by looking for files in library path -# which responds to the $file_magic_cmd with a given extended regex. -# If you have `file' or equivalent on your system and you're not sure -# whether `pass_all' will *always* work, you probably want this one. - -case $host_os in -aix[4-9]*) - lt_cv_deplibs_check_method=pass_all - ;; - -beos*) - lt_cv_deplibs_check_method=pass_all - ;; - -bsdi[45]*) - lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (shared object|dynamic lib)' - lt_cv_file_magic_cmd='/usr/bin/file -L' - lt_cv_file_magic_test_file=/shlib/libc.so - ;; - -cygwin*) - # func_win32_libid is a shell function defined in ltmain.sh - lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL' - lt_cv_file_magic_cmd='func_win32_libid' - ;; - -mingw* | pw32*) - # Base MSYS/MinGW do not provide the 'file' command needed by - # func_win32_libid shell function, so use a weaker test based on 'objdump', - # unless we find 'file', for example because we are cross-compiling. - # func_win32_libid assumes BSD nm, so disallow it if using MS dumpbin. - if ( test "$lt_cv_nm_interface" = "BSD nm" && file / ) >/dev/null 2>&1; then - lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL' - lt_cv_file_magic_cmd='func_win32_libid' - else - # Keep this pattern in sync with the one in func_win32_libid. - lt_cv_deplibs_check_method='file_magic file format (pei*-i386(.*architecture: i386)?|pe-arm-wince|pe-x86-64)' - lt_cv_file_magic_cmd='$OBJDUMP -f' - fi - ;; - -cegcc*) - # use the weaker test based on 'objdump'. See mingw*. - lt_cv_deplibs_check_method='file_magic file format pe-arm-.*little(.*architecture: arm)?' - lt_cv_file_magic_cmd='$OBJDUMP -f' - ;; - -darwin* | rhapsody*) - lt_cv_deplibs_check_method=pass_all - ;; - -freebsd* | dragonfly*) - if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then - case $host_cpu in - i*86 ) - # Not sure whether the presence of OpenBSD here was a mistake. - # Let's accept both of them until this is cleared up. - lt_cv_deplibs_check_method='file_magic (FreeBSD|OpenBSD|DragonFly)/i[3-9]86 (compact )?demand paged shared library' - lt_cv_file_magic_cmd=/usr/bin/file - lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*` - ;; - esac - else - lt_cv_deplibs_check_method=pass_all - fi - ;; - -gnu*) - lt_cv_deplibs_check_method=pass_all - ;; - -haiku*) - lt_cv_deplibs_check_method=pass_all - ;; - -hpux10.20* | hpux11*) - lt_cv_file_magic_cmd=/usr/bin/file - case $host_cpu in - ia64*) - lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF-[0-9][0-9]) shared object file - IA64' - lt_cv_file_magic_test_file=/usr/lib/hpux32/libc.so - ;; - hppa*64*) - lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF[ -][0-9][0-9])(-bit)?( [LM]SB)? shared object( file)?[, -]* PA-RISC [0-9]\.[0-9]' - lt_cv_file_magic_test_file=/usr/lib/pa20_64/libc.sl - ;; - *) - lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|PA-RISC[0-9]\.[0-9]) shared library' - lt_cv_file_magic_test_file=/usr/lib/libc.sl - ;; - esac - ;; - -interix[3-9]*) - # PIC code is broken on Interix 3.x, that's why |\.a not |_pic\.a here - lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so|\.a)$' - ;; - -irix5* | irix6* | nonstopux*) - case $LD in - *-32|*"-32 ") libmagic=32-bit;; - *-n32|*"-n32 ") libmagic=N32;; - *-64|*"-64 ") libmagic=64-bit;; - *) libmagic=never-match;; - esac - lt_cv_deplibs_check_method=pass_all - ;; - -# This must be glibc/ELF. -linux* | k*bsd*-gnu | kopensolaris*-gnu) - lt_cv_deplibs_check_method=pass_all - ;; - -netbsd* | netbsdelf*-gnu) - if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then - lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|_pic\.a)$' - else - lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so|_pic\.a)$' - fi - ;; - -newos6*) - lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (executable|dynamic lib)' - lt_cv_file_magic_cmd=/usr/bin/file - lt_cv_file_magic_test_file=/usr/lib/libnls.so - ;; - -*nto* | *qnx*) - lt_cv_deplibs_check_method=pass_all - ;; - -openbsd*) - if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then - lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|\.so|_pic\.a)$' - else - lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|_pic\.a)$' - fi - ;; - -osf3* | osf4* | osf5*) - lt_cv_deplibs_check_method=pass_all - ;; - -rdos*) - lt_cv_deplibs_check_method=pass_all - ;; - -solaris*) - lt_cv_deplibs_check_method=pass_all - ;; - -sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) - lt_cv_deplibs_check_method=pass_all - ;; - -sysv4 | sysv4.3*) - case $host_vendor in - motorola) - lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (shared object|dynamic lib) M[0-9][0-9]* Version [0-9]' - lt_cv_file_magic_test_file=`echo /usr/lib/libc.so*` - ;; - ncr) - lt_cv_deplibs_check_method=pass_all - ;; - sequent) - lt_cv_file_magic_cmd='/bin/file' - lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [LM]SB (shared object|dynamic lib )' - ;; - sni) - lt_cv_file_magic_cmd='/bin/file' - lt_cv_deplibs_check_method="file_magic ELF [0-9][0-9]*-bit [LM]SB dynamic lib" - lt_cv_file_magic_test_file=/lib/libc.so - ;; - siemens) - lt_cv_deplibs_check_method=pass_all - ;; - pc) - lt_cv_deplibs_check_method=pass_all - ;; - esac - ;; - -tpf*) - lt_cv_deplibs_check_method=pass_all - ;; -esac - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_deplibs_check_method" >&5 -$as_echo "$lt_cv_deplibs_check_method" >&6; } - -file_magic_glob= -want_nocaseglob=no -if test "$build" = "$host"; then - case $host_os in - mingw* | pw32*) - if ( shopt | grep nocaseglob ) >/dev/null 2>&1; then - want_nocaseglob=yes - else - file_magic_glob=`echo aAbBcCdDeEfFgGhHiIjJkKlLmMnNoOpPqQrRsStTuUvVwWxXyYzZ | $SED -e "s/\(..\)/s\/[\1]\/[\1]\/g;/g"` - fi - ;; - esac -fi - -file_magic_cmd=$lt_cv_file_magic_cmd -deplibs_check_method=$lt_cv_deplibs_check_method -test -z "$deplibs_check_method" && deplibs_check_method=unknown - - - - - - - - - - - - - - - - - - - - - - -if test -n "$ac_tool_prefix"; then - # Extract the first word of "${ac_tool_prefix}dlltool", so it can be a program name with args. -set dummy ${ac_tool_prefix}dlltool; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_DLLTOOL+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$DLLTOOL"; then - ac_cv_prog_DLLTOOL="$DLLTOOL" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_DLLTOOL="${ac_tool_prefix}dlltool" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -DLLTOOL=$ac_cv_prog_DLLTOOL -if test -n "$DLLTOOL"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DLLTOOL" >&5 -$as_echo "$DLLTOOL" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - -fi -if test -z "$ac_cv_prog_DLLTOOL"; then - ac_ct_DLLTOOL=$DLLTOOL - # Extract the first word of "dlltool", so it can be a program name with args. -set dummy dlltool; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_ac_ct_DLLTOOL+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$ac_ct_DLLTOOL"; then - ac_cv_prog_ac_ct_DLLTOOL="$ac_ct_DLLTOOL" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_ac_ct_DLLTOOL="dlltool" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -ac_ct_DLLTOOL=$ac_cv_prog_ac_ct_DLLTOOL -if test -n "$ac_ct_DLLTOOL"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DLLTOOL" >&5 -$as_echo "$ac_ct_DLLTOOL" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - if test "x$ac_ct_DLLTOOL" = x; then - DLLTOOL="false" - else - case $cross_compiling:$ac_tool_warned in -yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} -ac_tool_warned=yes ;; -esac - DLLTOOL=$ac_ct_DLLTOOL - fi -else - DLLTOOL="$ac_cv_prog_DLLTOOL" -fi - -test -z "$DLLTOOL" && DLLTOOL=dlltool - - - - - - - - - - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to associate runtime and link libraries" >&5 -$as_echo_n "checking how to associate runtime and link libraries... " >&6; } -if ${lt_cv_sharedlib_from_linklib_cmd+:} false; then : - $as_echo_n "(cached) " >&6 -else - lt_cv_sharedlib_from_linklib_cmd='unknown' - -case $host_os in -cygwin* | mingw* | pw32* | cegcc*) - # two different shell functions defined in ltmain.sh - # decide which to use based on capabilities of $DLLTOOL - case `$DLLTOOL --help 2>&1` in - *--identify-strict*) - lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib - ;; - *) - lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib_fallback - ;; - esac - ;; -*) - # fallback: assume linklib IS sharedlib - lt_cv_sharedlib_from_linklib_cmd="$ECHO" - ;; -esac - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_sharedlib_from_linklib_cmd" >&5 -$as_echo "$lt_cv_sharedlib_from_linklib_cmd" >&6; } -sharedlib_from_linklib_cmd=$lt_cv_sharedlib_from_linklib_cmd -test -z "$sharedlib_from_linklib_cmd" && sharedlib_from_linklib_cmd=$ECHO - - - - - - - - -if test -n "$ac_tool_prefix"; then - for ac_prog in ar - do - # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. -set dummy $ac_tool_prefix$ac_prog; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_AR+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$AR"; then - ac_cv_prog_AR="$AR" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_AR="$ac_tool_prefix$ac_prog" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -AR=$ac_cv_prog_AR -if test -n "$AR"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AR" >&5 -$as_echo "$AR" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - - test -n "$AR" && break - done -fi -if test -z "$AR"; then - ac_ct_AR=$AR - for ac_prog in ar -do - # Extract the first word of "$ac_prog", so it can be a program name with args. -set dummy $ac_prog; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_ac_ct_AR+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$ac_ct_AR"; then - ac_cv_prog_ac_ct_AR="$ac_ct_AR" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_ac_ct_AR="$ac_prog" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -ac_ct_AR=$ac_cv_prog_ac_ct_AR -if test -n "$ac_ct_AR"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_AR" >&5 -$as_echo "$ac_ct_AR" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - - test -n "$ac_ct_AR" && break -done - - if test "x$ac_ct_AR" = x; then - AR="false" - else - case $cross_compiling:$ac_tool_warned in -yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} -ac_tool_warned=yes ;; -esac - AR=$ac_ct_AR - fi -fi - -: ${AR=ar} -: ${AR_FLAGS=cru} - - - - - - - - - - - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for archiver @FILE support" >&5 -$as_echo_n "checking for archiver @FILE support... " >&6; } -if ${lt_cv_ar_at_file+:} false; then : - $as_echo_n "(cached) " >&6 -else - lt_cv_ar_at_file=no - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -int -main () -{ - - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - echo conftest.$ac_objext > conftest.lst - lt_ar_try='$AR $AR_FLAGS libconftest.a @conftest.lst >&5' - { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$lt_ar_try\""; } >&5 - (eval $lt_ar_try) 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } - if test "$ac_status" -eq 0; then - # Ensure the archiver fails upon bogus file names. - rm -f conftest.$ac_objext libconftest.a - { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$lt_ar_try\""; } >&5 - (eval $lt_ar_try) 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } - if test "$ac_status" -ne 0; then - lt_cv_ar_at_file=@ - fi - fi - rm -f conftest.* libconftest.a - -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ar_at_file" >&5 -$as_echo "$lt_cv_ar_at_file" >&6; } - -if test "x$lt_cv_ar_at_file" = xno; then - archiver_list_spec= -else - archiver_list_spec=$lt_cv_ar_at_file -fi - - - - - - - -if test -n "$ac_tool_prefix"; then - # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args. -set dummy ${ac_tool_prefix}strip; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_STRIP+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$STRIP"; then - ac_cv_prog_STRIP="$STRIP" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_STRIP="${ac_tool_prefix}strip" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -STRIP=$ac_cv_prog_STRIP -if test -n "$STRIP"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $STRIP" >&5 -$as_echo "$STRIP" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - -fi -if test -z "$ac_cv_prog_STRIP"; then - ac_ct_STRIP=$STRIP - # Extract the first word of "strip", so it can be a program name with args. -set dummy strip; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_ac_ct_STRIP+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$ac_ct_STRIP"; then - ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_ac_ct_STRIP="strip" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP -if test -n "$ac_ct_STRIP"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP" >&5 -$as_echo "$ac_ct_STRIP" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - if test "x$ac_ct_STRIP" = x; then - STRIP=":" - else - case $cross_compiling:$ac_tool_warned in -yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} -ac_tool_warned=yes ;; -esac - STRIP=$ac_ct_STRIP - fi -else - STRIP="$ac_cv_prog_STRIP" -fi - -test -z "$STRIP" && STRIP=: - - - - - - -if test -n "$ac_tool_prefix"; then - # Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args. -set dummy ${ac_tool_prefix}ranlib; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_RANLIB+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$RANLIB"; then - ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -RANLIB=$ac_cv_prog_RANLIB -if test -n "$RANLIB"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $RANLIB" >&5 -$as_echo "$RANLIB" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - -fi -if test -z "$ac_cv_prog_RANLIB"; then - ac_ct_RANLIB=$RANLIB - # Extract the first word of "ranlib", so it can be a program name with args. -set dummy ranlib; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_ac_ct_RANLIB+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$ac_ct_RANLIB"; then - ac_cv_prog_ac_ct_RANLIB="$ac_ct_RANLIB" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_ac_ct_RANLIB="ranlib" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -ac_ct_RANLIB=$ac_cv_prog_ac_ct_RANLIB -if test -n "$ac_ct_RANLIB"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_RANLIB" >&5 -$as_echo "$ac_ct_RANLIB" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - if test "x$ac_ct_RANLIB" = x; then - RANLIB=":" - else - case $cross_compiling:$ac_tool_warned in -yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} -ac_tool_warned=yes ;; -esac - RANLIB=$ac_ct_RANLIB - fi -else - RANLIB="$ac_cv_prog_RANLIB" -fi - -test -z "$RANLIB" && RANLIB=: - - - - - - -# Determine commands to create old-style static archives. -old_archive_cmds='$AR $AR_FLAGS $oldlib$oldobjs' -old_postinstall_cmds='chmod 644 $oldlib' -old_postuninstall_cmds= - -if test -n "$RANLIB"; then - case $host_os in - openbsd*) - old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB -t \$tool_oldlib" - ;; - *) - old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB \$tool_oldlib" - ;; - esac - old_archive_cmds="$old_archive_cmds~\$RANLIB \$tool_oldlib" -fi - -case $host_os in - darwin*) - lock_old_archive_extraction=yes ;; - *) - lock_old_archive_extraction=no ;; -esac - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -# If no C compiler was specified, use CC. -LTCC=${LTCC-"$CC"} - -# If no C compiler flags were specified, use CFLAGS. -LTCFLAGS=${LTCFLAGS-"$CFLAGS"} - -# Allow CC to be a program name with arguments. -compiler=$CC - - -# Check for command to grab the raw symbol name followed by C symbol from nm. -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking command to parse $NM output from $compiler object" >&5 -$as_echo_n "checking command to parse $NM output from $compiler object... " >&6; } -if ${lt_cv_sys_global_symbol_pipe+:} false; then : - $as_echo_n "(cached) " >&6 -else - -# These are sane defaults that work on at least a few old systems. -# [They come from Ultrix. What could be older than Ultrix?!! ;)] - -# Character class describing NM global symbol codes. -symcode='[BCDEGRST]' - -# Regexp to match symbols that can be accessed directly from C. -sympat='\([_A-Za-z][_A-Za-z0-9]*\)' - -# Define system-specific variables. -case $host_os in -aix*) - symcode='[BCDT]' - ;; -cygwin* | mingw* | pw32* | cegcc*) - symcode='[ABCDGISTW]' - ;; -hpux*) - if test "$host_cpu" = ia64; then - symcode='[ABCDEGRST]' - fi - ;; -irix* | nonstopux*) - symcode='[BCDEGRST]' - ;; -osf*) - symcode='[BCDEGQRST]' - ;; -solaris*) - symcode='[BDRT]' - ;; -sco3.2v5*) - symcode='[DT]' - ;; -sysv4.2uw2*) - symcode='[DT]' - ;; -sysv5* | sco5v6* | unixware* | OpenUNIX*) - symcode='[ABDT]' - ;; -sysv4) - symcode='[DFNSTU]' - ;; -esac - -# If we're using GNU nm, then use its standard symbol codes. -case `$NM -V 2>&1` in -*GNU* | *'with BFD'*) - symcode='[ABCDGIRSTW]' ;; -esac - -# Transform an extracted symbol line into a proper C declaration. -# Some systems (esp. on ia64) link data and code symbols differently, -# so use this general approach. -lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^T .* \(.*\)$/extern int \1();/p' -e 's/^$symcode* .* \(.*\)$/extern char \1;/p'" - -# Transform an extracted symbol line into symbol name and symbol address -lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([^ ]*\)[ ]*$/ {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([^ ]*\) \([^ ]*\)$/ {\"\2\", (void *) \&\2},/p'" -lt_cv_sys_global_symbol_to_c_name_address_lib_prefix="sed -n -e 's/^: \([^ ]*\)[ ]*$/ {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([^ ]*\) \(lib[^ ]*\)$/ {\"\2\", (void *) \&\2},/p' -e 's/^$symcode* \([^ ]*\) \([^ ]*\)$/ {\"lib\2\", (void *) \&\2},/p'" - -# Handle CRLF in mingw tool chain -opt_cr= -case $build_os in -mingw*) - opt_cr=`$ECHO 'x\{0,1\}' | tr x '\015'` # option cr in regexp - ;; -esac - -# Try without a prefix underscore, then with it. -for ac_symprfx in "" "_"; do - - # Transform symcode, sympat, and symprfx into a raw symbol and a C symbol. - symxfrm="\\1 $ac_symprfx\\2 \\2" - - # Write the raw and C identifiers. - if test "$lt_cv_nm_interface" = "MS dumpbin"; then - # Fake it for dumpbin and say T for any non-static function - # and D for any global variable. - # Also find C++ and __fastcall symbols from MSVC++, - # which start with @ or ?. - lt_cv_sys_global_symbol_pipe="$AWK '"\ -" {last_section=section; section=\$ 3};"\ -" /^COFF SYMBOL TABLE/{for(i in hide) delete hide[i]};"\ -" /Section length .*#relocs.*(pick any)/{hide[last_section]=1};"\ -" \$ 0!~/External *\|/{next};"\ -" / 0+ UNDEF /{next}; / UNDEF \([^|]\)*()/{next};"\ -" {if(hide[section]) next};"\ -" {f=0}; \$ 0~/\(\).*\|/{f=1}; {printf f ? \"T \" : \"D \"};"\ -" {split(\$ 0, a, /\||\r/); split(a[2], s)};"\ -" s[1]~/^[@?]/{print s[1], s[1]; next};"\ -" s[1]~prfx {split(s[1],t,\"@\"); print t[1], substr(t[1],length(prfx))}"\ -" ' prfx=^$ac_symprfx" - else - lt_cv_sys_global_symbol_pipe="sed -n -e 's/^.*[ ]\($symcode$symcode*\)[ ][ ]*$ac_symprfx$sympat$opt_cr$/$symxfrm/p'" - fi - lt_cv_sys_global_symbol_pipe="$lt_cv_sys_global_symbol_pipe | sed '/ __gnu_lto/d'" - - # Check to see that the pipe works correctly. - pipe_works=no - - rm -f conftest* - cat > conftest.$ac_ext <<_LT_EOF -#ifdef __cplusplus -extern "C" { -#endif -char nm_test_var; -void nm_test_func(void); -void nm_test_func(void){} -#ifdef __cplusplus -} -#endif -int main(){nm_test_var='a';nm_test_func();return(0);} -_LT_EOF - - if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 - (eval $ac_compile) 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; }; then - # Now try to grab the symbols. - nlist=conftest.nm - if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$NM conftest.$ac_objext \| "$lt_cv_sys_global_symbol_pipe" \> $nlist\""; } >&5 - (eval $NM conftest.$ac_objext \| "$lt_cv_sys_global_symbol_pipe" \> $nlist) 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } && test -s "$nlist"; then - # Try sorting and uniquifying the output. - if sort "$nlist" | uniq > "$nlist"T; then - mv -f "$nlist"T "$nlist" - else - rm -f "$nlist"T - fi - - # Make sure that we snagged all the symbols we need. - if $GREP ' nm_test_var$' "$nlist" >/dev/null; then - if $GREP ' nm_test_func$' "$nlist" >/dev/null; then - cat <<_LT_EOF > conftest.$ac_ext -/* Keep this code in sync between libtool.m4, ltmain, lt_system.h, and tests. */ -#if defined(_WIN32) || defined(__CYGWIN__) || defined(_WIN32_WCE) -/* DATA imports from DLLs on WIN32 con't be const, because runtime - relocations are performed -- see ld's documentation on pseudo-relocs. */ -# define LT_DLSYM_CONST -#elif defined(__osf__) -/* This system does not cope well with relocations in const data. */ -# define LT_DLSYM_CONST -#else -# define LT_DLSYM_CONST const -#endif - -#ifdef __cplusplus -extern "C" { -#endif - -_LT_EOF - # Now generate the symbol file. - eval "$lt_cv_sys_global_symbol_to_cdecl"' < "$nlist" | $GREP -v main >> conftest.$ac_ext' - - cat <<_LT_EOF >> conftest.$ac_ext - -/* The mapping between symbol names and symbols. */ -LT_DLSYM_CONST struct { - const char *name; - void *address; -} -lt__PROGRAM__LTX_preloaded_symbols[] = -{ - { "@PROGRAM@", (void *) 0 }, -_LT_EOF - $SED "s/^$symcode$symcode* \(.*\) \(.*\)$/ {\"\2\", (void *) \&\2},/" < "$nlist" | $GREP -v main >> conftest.$ac_ext - cat <<\_LT_EOF >> conftest.$ac_ext - {0, (void *) 0} -}; - -/* This works around a problem in FreeBSD linker */ -#ifdef FREEBSD_WORKAROUND -static const void *lt_preloaded_setup() { - return lt__PROGRAM__LTX_preloaded_symbols; -} -#endif - -#ifdef __cplusplus -} -#endif -_LT_EOF - # Now try linking the two files. - mv conftest.$ac_objext conftstm.$ac_objext - lt_globsym_save_LIBS=$LIBS - lt_globsym_save_CFLAGS=$CFLAGS - LIBS="conftstm.$ac_objext" - CFLAGS="$CFLAGS$lt_prog_compiler_no_builtin_flag" - if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5 - (eval $ac_link) 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } && test -s conftest${ac_exeext}; then - pipe_works=yes - fi - LIBS=$lt_globsym_save_LIBS - CFLAGS=$lt_globsym_save_CFLAGS - else - echo "cannot find nm_test_func in $nlist" >&5 - fi - else - echo "cannot find nm_test_var in $nlist" >&5 - fi - else - echo "cannot run $lt_cv_sys_global_symbol_pipe" >&5 - fi - else - echo "$progname: failed program was:" >&5 - cat conftest.$ac_ext >&5 - fi - rm -rf conftest* conftst* - - # Do not use the global_symbol_pipe unless it works. - if test "$pipe_works" = yes; then - break - else - lt_cv_sys_global_symbol_pipe= - fi -done - -fi - -if test -z "$lt_cv_sys_global_symbol_pipe"; then - lt_cv_sys_global_symbol_to_cdecl= -fi -if test -z "$lt_cv_sys_global_symbol_pipe$lt_cv_sys_global_symbol_to_cdecl"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: failed" >&5 -$as_echo "failed" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: ok" >&5 -$as_echo "ok" >&6; } -fi - -# Response file support. -if test "$lt_cv_nm_interface" = "MS dumpbin"; then - nm_file_list_spec='@' -elif $NM --help 2>/dev/null | grep '[@]FILE' >/dev/null; then - nm_file_list_spec='@' -fi - - - - - - - - - - - - - - - - - - - - - - - - - - - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for sysroot" >&5 -$as_echo_n "checking for sysroot... " >&6; } - -# Check whether --with-sysroot was given. -if test "${with_sysroot+set}" = set; then : - withval=$with_sysroot; -else - with_sysroot=no -fi - - -lt_sysroot= -case ${with_sysroot} in #( - yes) - if test "$GCC" = yes; then - lt_sysroot=`$CC --print-sysroot 2>/dev/null` - fi - ;; #( - /*) - lt_sysroot=`echo "$with_sysroot" | sed -e "$sed_quote_subst"` - ;; #( - no|'') - ;; #( - *) - { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${with_sysroot}" >&5 -$as_echo "${with_sysroot}" >&6; } - as_fn_error $? "The sysroot must be an absolute path." "$LINENO" 5 - ;; -esac - - { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${lt_sysroot:-no}" >&5 -$as_echo "${lt_sysroot:-no}" >&6; } - - - - - -# Check whether --enable-libtool-lock was given. -if test "${enable_libtool_lock+set}" = set; then : - enableval=$enable_libtool_lock; -fi - -test "x$enable_libtool_lock" != xno && enable_libtool_lock=yes - -# Some flags need to be propagated to the compiler or linker for good -# libtool support. -case $host in -ia64-*-hpux*) - # Find out which ABI we are using. - echo 'int i;' > conftest.$ac_ext - if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 - (eval $ac_compile) 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; }; then - case `/usr/bin/file conftest.$ac_objext` in - *ELF-32*) - HPUX_IA64_MODE="32" - ;; - *ELF-64*) - HPUX_IA64_MODE="64" - ;; - esac - fi - rm -rf conftest* - ;; -*-*-irix6*) - # Find out which ABI we are using. - echo '#line '$LINENO' "configure"' > conftest.$ac_ext - if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 - (eval $ac_compile) 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; }; then - if test "$lt_cv_prog_gnu_ld" = yes; then - case `/usr/bin/file conftest.$ac_objext` in - *32-bit*) - LD="${LD-ld} -melf32bsmip" - ;; - *N32*) - LD="${LD-ld} -melf32bmipn32" - ;; - *64-bit*) - LD="${LD-ld} -melf64bmip" - ;; - esac - else - case `/usr/bin/file conftest.$ac_objext` in - *32-bit*) - LD="${LD-ld} -32" - ;; - *N32*) - LD="${LD-ld} -n32" - ;; - *64-bit*) - LD="${LD-ld} -64" - ;; - esac - fi - fi - rm -rf conftest* - ;; - -x86_64-*kfreebsd*-gnu|x86_64-*linux*|ppc*-*linux*|powerpc*-*linux*| \ -s390*-*linux*|s390*-*tpf*|sparc*-*linux*) - # Find out which ABI we are using. - echo 'int i;' > conftest.$ac_ext - if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 - (eval $ac_compile) 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; }; then - case `/usr/bin/file conftest.o` in - *32-bit*) - case $host in - x86_64-*kfreebsd*-gnu) - LD="${LD-ld} -m elf_i386_fbsd" - ;; - x86_64-*linux*) - LD="${LD-ld} -m elf_i386" - ;; - ppc64-*linux*|powerpc64-*linux*) - LD="${LD-ld} -m elf32ppclinux" - ;; - s390x-*linux*) - LD="${LD-ld} -m elf_s390" - ;; - sparc64-*linux*) - LD="${LD-ld} -m elf32_sparc" - ;; - esac - ;; - *64-bit*) - case $host in - x86_64-*kfreebsd*-gnu) - LD="${LD-ld} -m elf_x86_64_fbsd" - ;; - x86_64-*linux*) - LD="${LD-ld} -m elf_x86_64" - ;; - ppc*-*linux*|powerpc*-*linux*) - LD="${LD-ld} -m elf64ppc" - ;; - s390*-*linux*|s390*-*tpf*) - LD="${LD-ld} -m elf64_s390" - ;; - sparc*-*linux*) - LD="${LD-ld} -m elf64_sparc" - ;; - esac - ;; - esac - fi - rm -rf conftest* - ;; - -*-*-sco3.2v5*) - # On SCO OpenServer 5, we need -belf to get full-featured binaries. - SAVE_CFLAGS="$CFLAGS" - CFLAGS="$CFLAGS -belf" - { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler needs -belf" >&5 -$as_echo_n "checking whether the C compiler needs -belf... " >&6; } -if ${lt_cv_cc_needs_belf+:} false; then : - $as_echo_n "(cached) " >&6 -else - ac_ext=c -ac_cpp='$CPP $CPPFLAGS' -ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_c_compiler_gnu - - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -int -main () -{ - - ; - return 0; -} -_ACEOF -if ac_fn_c_try_link "$LINENO"; then : - lt_cv_cc_needs_belf=yes -else - lt_cv_cc_needs_belf=no -fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext - ac_ext=c -ac_cpp='$CPP $CPPFLAGS' -ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_c_compiler_gnu - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_cc_needs_belf" >&5 -$as_echo "$lt_cv_cc_needs_belf" >&6; } - if test x"$lt_cv_cc_needs_belf" != x"yes"; then - # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf - CFLAGS="$SAVE_CFLAGS" - fi - ;; -*-*solaris*) - # Find out which ABI we are using. - echo 'int i;' > conftest.$ac_ext - if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 - (eval $ac_compile) 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; }; then - case `/usr/bin/file conftest.o` in - *64-bit*) - case $lt_cv_prog_gnu_ld in - yes*) - case $host in - i?86-*-solaris*) - LD="${LD-ld} -m elf_x86_64" - ;; - sparc*-*-solaris*) - LD="${LD-ld} -m elf64_sparc" - ;; - esac - # GNU ld 2.21 introduced _sol2 emulations. Use them if available. - if ${LD-ld} -V | grep _sol2 >/dev/null 2>&1; then - LD="${LD-ld}_sol2" - fi - ;; - *) - if ${LD-ld} -64 -r -o conftest2.o conftest.o >/dev/null 2>&1; then - LD="${LD-ld} -64" - fi - ;; - esac - ;; - esac - fi - rm -rf conftest* - ;; -esac - -need_locks="$enable_libtool_lock" - -if test -n "$ac_tool_prefix"; then - # Extract the first word of "${ac_tool_prefix}mt", so it can be a program name with args. -set dummy ${ac_tool_prefix}mt; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_MANIFEST_TOOL+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$MANIFEST_TOOL"; then - ac_cv_prog_MANIFEST_TOOL="$MANIFEST_TOOL" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_MANIFEST_TOOL="${ac_tool_prefix}mt" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -MANIFEST_TOOL=$ac_cv_prog_MANIFEST_TOOL -if test -n "$MANIFEST_TOOL"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MANIFEST_TOOL" >&5 -$as_echo "$MANIFEST_TOOL" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - -fi -if test -z "$ac_cv_prog_MANIFEST_TOOL"; then - ac_ct_MANIFEST_TOOL=$MANIFEST_TOOL - # Extract the first word of "mt", so it can be a program name with args. -set dummy mt; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_ac_ct_MANIFEST_TOOL+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$ac_ct_MANIFEST_TOOL"; then - ac_cv_prog_ac_ct_MANIFEST_TOOL="$ac_ct_MANIFEST_TOOL" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_ac_ct_MANIFEST_TOOL="mt" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -ac_ct_MANIFEST_TOOL=$ac_cv_prog_ac_ct_MANIFEST_TOOL -if test -n "$ac_ct_MANIFEST_TOOL"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_MANIFEST_TOOL" >&5 -$as_echo "$ac_ct_MANIFEST_TOOL" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - if test "x$ac_ct_MANIFEST_TOOL" = x; then - MANIFEST_TOOL=":" - else - case $cross_compiling:$ac_tool_warned in -yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} -ac_tool_warned=yes ;; -esac - MANIFEST_TOOL=$ac_ct_MANIFEST_TOOL - fi -else - MANIFEST_TOOL="$ac_cv_prog_MANIFEST_TOOL" -fi - -test -z "$MANIFEST_TOOL" && MANIFEST_TOOL=mt -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if $MANIFEST_TOOL is a manifest tool" >&5 -$as_echo_n "checking if $MANIFEST_TOOL is a manifest tool... " >&6; } -if ${lt_cv_path_mainfest_tool+:} false; then : - $as_echo_n "(cached) " >&6 -else - lt_cv_path_mainfest_tool=no - echo "$as_me:$LINENO: $MANIFEST_TOOL '-?'" >&5 - $MANIFEST_TOOL '-?' 2>conftest.err > conftest.out - cat conftest.err >&5 - if $GREP 'Manifest Tool' conftest.out > /dev/null; then - lt_cv_path_mainfest_tool=yes - fi - rm -f conftest* -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_path_mainfest_tool" >&5 -$as_echo "$lt_cv_path_mainfest_tool" >&6; } -if test "x$lt_cv_path_mainfest_tool" != xyes; then - MANIFEST_TOOL=: -fi - - - - - - - case $host_os in - rhapsody* | darwin*) - if test -n "$ac_tool_prefix"; then - # Extract the first word of "${ac_tool_prefix}dsymutil", so it can be a program name with args. -set dummy ${ac_tool_prefix}dsymutil; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_DSYMUTIL+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$DSYMUTIL"; then - ac_cv_prog_DSYMUTIL="$DSYMUTIL" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_DSYMUTIL="${ac_tool_prefix}dsymutil" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -DSYMUTIL=$ac_cv_prog_DSYMUTIL -if test -n "$DSYMUTIL"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DSYMUTIL" >&5 -$as_echo "$DSYMUTIL" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - -fi -if test -z "$ac_cv_prog_DSYMUTIL"; then - ac_ct_DSYMUTIL=$DSYMUTIL - # Extract the first word of "dsymutil", so it can be a program name with args. -set dummy dsymutil; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_ac_ct_DSYMUTIL+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$ac_ct_DSYMUTIL"; then - ac_cv_prog_ac_ct_DSYMUTIL="$ac_ct_DSYMUTIL" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_ac_ct_DSYMUTIL="dsymutil" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -ac_ct_DSYMUTIL=$ac_cv_prog_ac_ct_DSYMUTIL -if test -n "$ac_ct_DSYMUTIL"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DSYMUTIL" >&5 -$as_echo "$ac_ct_DSYMUTIL" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - if test "x$ac_ct_DSYMUTIL" = x; then - DSYMUTIL=":" - else - case $cross_compiling:$ac_tool_warned in -yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} -ac_tool_warned=yes ;; -esac - DSYMUTIL=$ac_ct_DSYMUTIL - fi -else - DSYMUTIL="$ac_cv_prog_DSYMUTIL" -fi - - if test -n "$ac_tool_prefix"; then - # Extract the first word of "${ac_tool_prefix}nmedit", so it can be a program name with args. -set dummy ${ac_tool_prefix}nmedit; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_NMEDIT+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$NMEDIT"; then - ac_cv_prog_NMEDIT="$NMEDIT" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_NMEDIT="${ac_tool_prefix}nmedit" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -NMEDIT=$ac_cv_prog_NMEDIT -if test -n "$NMEDIT"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $NMEDIT" >&5 -$as_echo "$NMEDIT" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - -fi -if test -z "$ac_cv_prog_NMEDIT"; then - ac_ct_NMEDIT=$NMEDIT - # Extract the first word of "nmedit", so it can be a program name with args. -set dummy nmedit; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_ac_ct_NMEDIT+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$ac_ct_NMEDIT"; then - ac_cv_prog_ac_ct_NMEDIT="$ac_ct_NMEDIT" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_ac_ct_NMEDIT="nmedit" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -ac_ct_NMEDIT=$ac_cv_prog_ac_ct_NMEDIT -if test -n "$ac_ct_NMEDIT"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_NMEDIT" >&5 -$as_echo "$ac_ct_NMEDIT" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - if test "x$ac_ct_NMEDIT" = x; then - NMEDIT=":" - else - case $cross_compiling:$ac_tool_warned in -yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} -ac_tool_warned=yes ;; -esac - NMEDIT=$ac_ct_NMEDIT - fi -else - NMEDIT="$ac_cv_prog_NMEDIT" -fi - - if test -n "$ac_tool_prefix"; then - # Extract the first word of "${ac_tool_prefix}lipo", so it can be a program name with args. -set dummy ${ac_tool_prefix}lipo; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_LIPO+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$LIPO"; then - ac_cv_prog_LIPO="$LIPO" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_LIPO="${ac_tool_prefix}lipo" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -LIPO=$ac_cv_prog_LIPO -if test -n "$LIPO"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LIPO" >&5 -$as_echo "$LIPO" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - -fi -if test -z "$ac_cv_prog_LIPO"; then - ac_ct_LIPO=$LIPO - # Extract the first word of "lipo", so it can be a program name with args. -set dummy lipo; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_ac_ct_LIPO+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$ac_ct_LIPO"; then - ac_cv_prog_ac_ct_LIPO="$ac_ct_LIPO" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_ac_ct_LIPO="lipo" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -ac_ct_LIPO=$ac_cv_prog_ac_ct_LIPO -if test -n "$ac_ct_LIPO"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_LIPO" >&5 -$as_echo "$ac_ct_LIPO" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - if test "x$ac_ct_LIPO" = x; then - LIPO=":" - else - case $cross_compiling:$ac_tool_warned in -yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} -ac_tool_warned=yes ;; -esac - LIPO=$ac_ct_LIPO - fi -else - LIPO="$ac_cv_prog_LIPO" -fi - - if test -n "$ac_tool_prefix"; then - # Extract the first word of "${ac_tool_prefix}otool", so it can be a program name with args. -set dummy ${ac_tool_prefix}otool; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_OTOOL+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$OTOOL"; then - ac_cv_prog_OTOOL="$OTOOL" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_OTOOL="${ac_tool_prefix}otool" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -OTOOL=$ac_cv_prog_OTOOL -if test -n "$OTOOL"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OTOOL" >&5 -$as_echo "$OTOOL" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - -fi -if test -z "$ac_cv_prog_OTOOL"; then - ac_ct_OTOOL=$OTOOL - # Extract the first word of "otool", so it can be a program name with args. -set dummy otool; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_ac_ct_OTOOL+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$ac_ct_OTOOL"; then - ac_cv_prog_ac_ct_OTOOL="$ac_ct_OTOOL" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_ac_ct_OTOOL="otool" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -ac_ct_OTOOL=$ac_cv_prog_ac_ct_OTOOL -if test -n "$ac_ct_OTOOL"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OTOOL" >&5 -$as_echo "$ac_ct_OTOOL" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - if test "x$ac_ct_OTOOL" = x; then - OTOOL=":" - else - case $cross_compiling:$ac_tool_warned in -yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} -ac_tool_warned=yes ;; -esac - OTOOL=$ac_ct_OTOOL - fi -else - OTOOL="$ac_cv_prog_OTOOL" -fi - - if test -n "$ac_tool_prefix"; then - # Extract the first word of "${ac_tool_prefix}otool64", so it can be a program name with args. -set dummy ${ac_tool_prefix}otool64; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_OTOOL64+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$OTOOL64"; then - ac_cv_prog_OTOOL64="$OTOOL64" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_OTOOL64="${ac_tool_prefix}otool64" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -OTOOL64=$ac_cv_prog_OTOOL64 -if test -n "$OTOOL64"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OTOOL64" >&5 -$as_echo "$OTOOL64" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - -fi -if test -z "$ac_cv_prog_OTOOL64"; then - ac_ct_OTOOL64=$OTOOL64 - # Extract the first word of "otool64", so it can be a program name with args. -set dummy otool64; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_ac_ct_OTOOL64+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$ac_ct_OTOOL64"; then - ac_cv_prog_ac_ct_OTOOL64="$ac_ct_OTOOL64" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_ac_ct_OTOOL64="otool64" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -ac_ct_OTOOL64=$ac_cv_prog_ac_ct_OTOOL64 -if test -n "$ac_ct_OTOOL64"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OTOOL64" >&5 -$as_echo "$ac_ct_OTOOL64" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - if test "x$ac_ct_OTOOL64" = x; then - OTOOL64=":" - else - case $cross_compiling:$ac_tool_warned in -yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} -ac_tool_warned=yes ;; -esac - OTOOL64=$ac_ct_OTOOL64 - fi -else - OTOOL64="$ac_cv_prog_OTOOL64" -fi - - - - - - - - - - - - - - - - - - - - - - - - - - - - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -single_module linker flag" >&5 -$as_echo_n "checking for -single_module linker flag... " >&6; } -if ${lt_cv_apple_cc_single_mod+:} false; then : - $as_echo_n "(cached) " >&6 -else - lt_cv_apple_cc_single_mod=no - if test -z "${LT_MULTI_MODULE}"; then - # By default we will add the -single_module flag. You can override - # by either setting the environment variable LT_MULTI_MODULE - # non-empty at configure time, or by adding -multi_module to the - # link flags. - rm -rf libconftest.dylib* - echo "int foo(void){return 1;}" > conftest.c - echo "$LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \ --dynamiclib -Wl,-single_module conftest.c" >&5 - $LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \ - -dynamiclib -Wl,-single_module conftest.c 2>conftest.err - _lt_result=$? - # If there is a non-empty error log, and "single_module" - # appears in it, assume the flag caused a linker warning - if test -s conftest.err && $GREP single_module conftest.err; then - cat conftest.err >&5 - # Otherwise, if the output was created with a 0 exit code from - # the compiler, it worked. - elif test -f libconftest.dylib && test $_lt_result -eq 0; then - lt_cv_apple_cc_single_mod=yes - else - cat conftest.err >&5 - fi - rm -rf libconftest.dylib* - rm -f conftest.* - fi -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_apple_cc_single_mod" >&5 -$as_echo "$lt_cv_apple_cc_single_mod" >&6; } - - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -exported_symbols_list linker flag" >&5 -$as_echo_n "checking for -exported_symbols_list linker flag... " >&6; } -if ${lt_cv_ld_exported_symbols_list+:} false; then : - $as_echo_n "(cached) " >&6 -else - lt_cv_ld_exported_symbols_list=no - save_LDFLAGS=$LDFLAGS - echo "_main" > conftest.sym - LDFLAGS="$LDFLAGS -Wl,-exported_symbols_list,conftest.sym" - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -int -main () -{ - - ; - return 0; -} -_ACEOF -if ac_fn_c_try_link "$LINENO"; then : - lt_cv_ld_exported_symbols_list=yes -else - lt_cv_ld_exported_symbols_list=no -fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext - LDFLAGS="$save_LDFLAGS" - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_exported_symbols_list" >&5 -$as_echo "$lt_cv_ld_exported_symbols_list" >&6; } - - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -force_load linker flag" >&5 -$as_echo_n "checking for -force_load linker flag... " >&6; } -if ${lt_cv_ld_force_load+:} false; then : - $as_echo_n "(cached) " >&6 -else - lt_cv_ld_force_load=no - cat > conftest.c << _LT_EOF -int forced_loaded() { return 2;} -_LT_EOF - echo "$LTCC $LTCFLAGS -c -o conftest.o conftest.c" >&5 - $LTCC $LTCFLAGS -c -o conftest.o conftest.c 2>&5 - echo "$AR cru libconftest.a conftest.o" >&5 - $AR cru libconftest.a conftest.o 2>&5 - echo "$RANLIB libconftest.a" >&5 - $RANLIB libconftest.a 2>&5 - cat > conftest.c << _LT_EOF -int main() { return 0;} -_LT_EOF - echo "$LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a" >&5 - $LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a 2>conftest.err - _lt_result=$? - if test -s conftest.err && $GREP force_load conftest.err; then - cat conftest.err >&5 - elif test -f conftest && test $_lt_result -eq 0 && $GREP forced_load conftest >/dev/null 2>&1 ; then - lt_cv_ld_force_load=yes - else - cat conftest.err >&5 - fi - rm -f conftest.err libconftest.a conftest conftest.c - rm -rf conftest.dSYM - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_force_load" >&5 -$as_echo "$lt_cv_ld_force_load" >&6; } - case $host_os in - rhapsody* | darwin1.[012]) - _lt_dar_allow_undefined='${wl}-undefined ${wl}suppress' ;; - darwin1.*) - _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;; - darwin*) # darwin 5.x on - # if running on 10.5 or later, the deployment target defaults - # to the OS version, if on x86, and 10.4, the deployment - # target defaults to 10.4. Don't you love it? - case ${MACOSX_DEPLOYMENT_TARGET-10.0},$host in - 10.0,*86*-darwin8*|10.0,*-darwin[91]*) - _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;; - 10.[012]*) - _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;; - 10.*) - _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;; - esac - ;; - esac - if test "$lt_cv_apple_cc_single_mod" = "yes"; then - _lt_dar_single_mod='$single_module' - fi - if test "$lt_cv_ld_exported_symbols_list" = "yes"; then - _lt_dar_export_syms=' ${wl}-exported_symbols_list,$output_objdir/${libname}-symbols.expsym' - else - _lt_dar_export_syms='~$NMEDIT -s $output_objdir/${libname}-symbols.expsym ${lib}' - fi - if test "$DSYMUTIL" != ":" && test "$lt_cv_ld_force_load" = "no"; then - _lt_dsymutil='~$DSYMUTIL $lib || :' - else - _lt_dsymutil= - fi - ;; - esac - -ac_ext=c -ac_cpp='$CPP $CPPFLAGS' -ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_c_compiler_gnu -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C preprocessor" >&5 -$as_echo_n "checking how to run the C preprocessor... " >&6; } -# On Suns, sometimes $CPP names a directory. -if test -n "$CPP" && test -d "$CPP"; then - CPP= -fi -if test -z "$CPP"; then - if ${ac_cv_prog_CPP+:} false; then : - $as_echo_n "(cached) " >&6 -else - # Double quotes because CPP needs to be expanded - for CPP in "$CC -E" "$CC -E -traditional-cpp" "/lib/cpp" - do - ac_preproc_ok=false -for ac_c_preproc_warn_flag in '' yes -do - # Use a header file that comes with gcc, so configuring glibc - # with a fresh cross-compiler works. - # Prefer to if __STDC__ is defined, since - # exists even on freestanding compilers. - # On the NeXT, cc -E runs the code through the compiler's parser, - # not just through cpp. "Syntax error" is here to catch this case. - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#ifdef __STDC__ -# include -#else -# include -#endif - Syntax error -_ACEOF -if ac_fn_c_try_cpp "$LINENO"; then : - -else - # Broken: fails on valid input. -continue -fi -rm -f conftest.err conftest.i conftest.$ac_ext - - # OK, works on sane cases. Now check whether nonexistent headers - # can be detected and how. - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include -_ACEOF -if ac_fn_c_try_cpp "$LINENO"; then : - # Broken: success on invalid input. -continue -else - # Passes both tests. -ac_preproc_ok=: -break -fi -rm -f conftest.err conftest.i conftest.$ac_ext - -done -# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. -rm -f conftest.i conftest.err conftest.$ac_ext -if $ac_preproc_ok; then : - break -fi - - done - ac_cv_prog_CPP=$CPP - -fi - CPP=$ac_cv_prog_CPP -else - ac_cv_prog_CPP=$CPP -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $CPP" >&5 -$as_echo "$CPP" >&6; } -ac_preproc_ok=false -for ac_c_preproc_warn_flag in '' yes -do - # Use a header file that comes with gcc, so configuring glibc - # with a fresh cross-compiler works. - # Prefer to if __STDC__ is defined, since - # exists even on freestanding compilers. - # On the NeXT, cc -E runs the code through the compiler's parser, - # not just through cpp. "Syntax error" is here to catch this case. - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#ifdef __STDC__ -# include -#else -# include -#endif - Syntax error -_ACEOF -if ac_fn_c_try_cpp "$LINENO"; then : - -else - # Broken: fails on valid input. -continue -fi -rm -f conftest.err conftest.i conftest.$ac_ext - - # OK, works on sane cases. Now check whether nonexistent headers - # can be detected and how. - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include -_ACEOF -if ac_fn_c_try_cpp "$LINENO"; then : - # Broken: success on invalid input. -continue -else - # Passes both tests. -ac_preproc_ok=: -break -fi -rm -f conftest.err conftest.i conftest.$ac_ext - -done -# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. -rm -f conftest.i conftest.err conftest.$ac_ext -if $ac_preproc_ok; then : - -else - { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 -$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} -as_fn_error $? "C preprocessor \"$CPP\" fails sanity check -See \`config.log' for more details" "$LINENO" 5; } -fi - -ac_ext=c -ac_cpp='$CPP $CPPFLAGS' -ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_c_compiler_gnu - - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header files" >&5 -$as_echo_n "checking for ANSI C header files... " >&6; } -if ${ac_cv_header_stdc+:} false; then : - $as_echo_n "(cached) " >&6 -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include -#include -#include -#include - -int -main () -{ - - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - ac_cv_header_stdc=yes -else - ac_cv_header_stdc=no -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext - -if test $ac_cv_header_stdc = yes; then - # SunOS 4.x string.h does not declare mem*, contrary to ANSI. - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include - -_ACEOF -if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | - $EGREP "memchr" >/dev/null 2>&1; then : - -else - ac_cv_header_stdc=no -fi -rm -f conftest* - -fi - -if test $ac_cv_header_stdc = yes; then - # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include - -_ACEOF -if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | - $EGREP "free" >/dev/null 2>&1; then : - -else - ac_cv_header_stdc=no -fi -rm -f conftest* - -fi - -if test $ac_cv_header_stdc = yes; then - # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi. - if test "$cross_compiling" = yes; then : - : -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include -#include -#if ((' ' & 0x0FF) == 0x020) -# define ISLOWER(c) ('a' <= (c) && (c) <= 'z') -# define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c)) -#else -# define ISLOWER(c) \ - (('a' <= (c) && (c) <= 'i') \ - || ('j' <= (c) && (c) <= 'r') \ - || ('s' <= (c) && (c) <= 'z')) -# define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c)) -#endif - -#define XOR(e, f) (((e) && !(f)) || (!(e) && (f))) -int -main () -{ - int i; - for (i = 0; i < 256; i++) - if (XOR (islower (i), ISLOWER (i)) - || toupper (i) != TOUPPER (i)) - return 2; - return 0; -} -_ACEOF -if ac_fn_c_try_run "$LINENO"; then : - -else - ac_cv_header_stdc=no -fi -rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ - conftest.$ac_objext conftest.beam conftest.$ac_ext -fi - -fi -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdc" >&5 -$as_echo "$ac_cv_header_stdc" >&6; } -if test $ac_cv_header_stdc = yes; then - -$as_echo "#define STDC_HEADERS 1" >>confdefs.h - -fi - -# On IRIX 5.3, sys/types and inttypes.h are conflicting. -for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \ - inttypes.h stdint.h unistd.h -do : - as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` -ac_fn_c_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default -" -if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : - cat >>confdefs.h <<_ACEOF -#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 -_ACEOF - -fi - -done - - -for ac_header in dlfcn.h -do : - ac_fn_c_check_header_compile "$LINENO" "dlfcn.h" "ac_cv_header_dlfcn_h" "$ac_includes_default -" -if test "x$ac_cv_header_dlfcn_h" = xyes; then : - cat >>confdefs.h <<_ACEOF -#define HAVE_DLFCN_H 1 -_ACEOF - -fi - -done - - - - -func_stripname_cnf () -{ - case ${2} in - .*) func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%\\\\${2}\$%%"`;; - *) func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%${2}\$%%"`;; - esac -} # func_stripname_cnf - - - - - -# Set options - - - - enable_dlopen=no - - - enable_win32_dll=no - - - # Check whether --enable-shared was given. -if test "${enable_shared+set}" = set; then : - enableval=$enable_shared; p=${PACKAGE-default} - case $enableval in - yes) enable_shared=yes ;; - no) enable_shared=no ;; - *) - enable_shared=no - # Look at the argument we got. We use all the common list separators. - lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," - for pkg in $enableval; do - IFS="$lt_save_ifs" - if test "X$pkg" = "X$p"; then - enable_shared=yes - fi - done - IFS="$lt_save_ifs" - ;; - esac -else - enable_shared=yes -fi - - - - - - - - - - # Check whether --enable-static was given. -if test "${enable_static+set}" = set; then : - enableval=$enable_static; p=${PACKAGE-default} - case $enableval in - yes) enable_static=yes ;; - no) enable_static=no ;; - *) - enable_static=no - # Look at the argument we got. We use all the common list separators. - lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," - for pkg in $enableval; do - IFS="$lt_save_ifs" - if test "X$pkg" = "X$p"; then - enable_static=yes - fi - done - IFS="$lt_save_ifs" - ;; - esac -else - enable_static=yes -fi - - - - - - - - - - -# Check whether --with-pic was given. -if test "${with_pic+set}" = set; then : - withval=$with_pic; lt_p=${PACKAGE-default} - case $withval in - yes|no) pic_mode=$withval ;; - *) - pic_mode=default - # Look at the argument we got. We use all the common list separators. - lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," - for lt_pkg in $withval; do - IFS="$lt_save_ifs" - if test "X$lt_pkg" = "X$lt_p"; then - pic_mode=yes - fi - done - IFS="$lt_save_ifs" - ;; - esac -else - pic_mode=default -fi - - -test -z "$pic_mode" && pic_mode=default - - - - - - - - # Check whether --enable-fast-install was given. -if test "${enable_fast_install+set}" = set; then : - enableval=$enable_fast_install; p=${PACKAGE-default} - case $enableval in - yes) enable_fast_install=yes ;; - no) enable_fast_install=no ;; - *) - enable_fast_install=no - # Look at the argument we got. We use all the common list separators. - lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," - for pkg in $enableval; do - IFS="$lt_save_ifs" - if test "X$pkg" = "X$p"; then - enable_fast_install=yes - fi - done - IFS="$lt_save_ifs" - ;; - esac -else - enable_fast_install=yes -fi - - - - - - - - - - - -# This can be used to rebuild libtool when needed -LIBTOOL_DEPS="$ltmain" - -# Always use our own libtool. -LIBTOOL='$(SHELL) $(top_builddir)/libtool' - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -test -z "$LN_S" && LN_S="ln -s" - - - - - - - - - - - - - - -if test -n "${ZSH_VERSION+set}" ; then - setopt NO_GLOB_SUBST -fi - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for objdir" >&5 -$as_echo_n "checking for objdir... " >&6; } -if ${lt_cv_objdir+:} false; then : - $as_echo_n "(cached) " >&6 -else - rm -f .libs 2>/dev/null -mkdir .libs 2>/dev/null -if test -d .libs; then - lt_cv_objdir=.libs -else - # MS-DOS does not allow filenames that begin with a dot. - lt_cv_objdir=_libs -fi -rmdir .libs 2>/dev/null -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_objdir" >&5 -$as_echo "$lt_cv_objdir" >&6; } -objdir=$lt_cv_objdir - - - - - -cat >>confdefs.h <<_ACEOF -#define LT_OBJDIR "$lt_cv_objdir/" -_ACEOF - - - - -case $host_os in -aix3*) - # AIX sometimes has problems with the GCC collect2 program. For some - # reason, if we set the COLLECT_NAMES environment variable, the problems - # vanish in a puff of smoke. - if test "X${COLLECT_NAMES+set}" != Xset; then - COLLECT_NAMES= - export COLLECT_NAMES - fi - ;; -esac - -# Global variables: -ofile=libtool -can_build_shared=yes - -# All known linkers require a `.a' archive for static linking (except MSVC, -# which needs '.lib'). -libext=a - -with_gnu_ld="$lt_cv_prog_gnu_ld" - -old_CC="$CC" -old_CFLAGS="$CFLAGS" - -# Set sane defaults for various variables -test -z "$CC" && CC=cc -test -z "$LTCC" && LTCC=$CC -test -z "$LTCFLAGS" && LTCFLAGS=$CFLAGS -test -z "$LD" && LD=ld -test -z "$ac_objext" && ac_objext=o - -for cc_temp in $compiler""; do - case $cc_temp in - compile | *[\\/]compile | ccache | *[\\/]ccache ) ;; - distcc | *[\\/]distcc | purify | *[\\/]purify ) ;; - \-*) ;; - *) break;; - esac -done -cc_basename=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"` - - -# Only perform the check for file, if the check method requires it -test -z "$MAGIC_CMD" && MAGIC_CMD=file -case $deplibs_check_method in -file_magic*) - if test "$file_magic_cmd" = '$MAGIC_CMD'; then - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ${ac_tool_prefix}file" >&5 -$as_echo_n "checking for ${ac_tool_prefix}file... " >&6; } -if ${lt_cv_path_MAGIC_CMD+:} false; then : - $as_echo_n "(cached) " >&6 -else - case $MAGIC_CMD in -[\\/*] | ?:[\\/]*) - lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path. - ;; -*) - lt_save_MAGIC_CMD="$MAGIC_CMD" - lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR - ac_dummy="/usr/bin$PATH_SEPARATOR$PATH" - for ac_dir in $ac_dummy; do - IFS="$lt_save_ifs" - test -z "$ac_dir" && ac_dir=. - if test -f $ac_dir/${ac_tool_prefix}file; then - lt_cv_path_MAGIC_CMD="$ac_dir/${ac_tool_prefix}file" - if test -n "$file_magic_test_file"; then - case $deplibs_check_method in - "file_magic "*) - file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"` - MAGIC_CMD="$lt_cv_path_MAGIC_CMD" - if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null | - $EGREP "$file_magic_regex" > /dev/null; then - : - else - cat <<_LT_EOF 1>&2 - -*** Warning: the command libtool uses to detect shared libraries, -*** $file_magic_cmd, produces output that libtool cannot recognize. -*** The result is that libtool may fail to recognize shared libraries -*** as such. This will affect the creation of libtool libraries that -*** depend on shared libraries, but programs linked with such libtool -*** libraries will work regardless of this problem. Nevertheless, you -*** may want to report the problem to your system manager and/or to -*** bug-libtool@gnu.org - -_LT_EOF - fi ;; - esac - fi - break - fi - done - IFS="$lt_save_ifs" - MAGIC_CMD="$lt_save_MAGIC_CMD" - ;; -esac -fi - -MAGIC_CMD="$lt_cv_path_MAGIC_CMD" -if test -n "$MAGIC_CMD"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MAGIC_CMD" >&5 -$as_echo "$MAGIC_CMD" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - - - - -if test -z "$lt_cv_path_MAGIC_CMD"; then - if test -n "$ac_tool_prefix"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for file" >&5 -$as_echo_n "checking for file... " >&6; } -if ${lt_cv_path_MAGIC_CMD+:} false; then : - $as_echo_n "(cached) " >&6 -else - case $MAGIC_CMD in -[\\/*] | ?:[\\/]*) - lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path. - ;; -*) - lt_save_MAGIC_CMD="$MAGIC_CMD" - lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR - ac_dummy="/usr/bin$PATH_SEPARATOR$PATH" - for ac_dir in $ac_dummy; do - IFS="$lt_save_ifs" - test -z "$ac_dir" && ac_dir=. - if test -f $ac_dir/file; then - lt_cv_path_MAGIC_CMD="$ac_dir/file" - if test -n "$file_magic_test_file"; then - case $deplibs_check_method in - "file_magic "*) - file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"` - MAGIC_CMD="$lt_cv_path_MAGIC_CMD" - if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null | - $EGREP "$file_magic_regex" > /dev/null; then - : - else - cat <<_LT_EOF 1>&2 - -*** Warning: the command libtool uses to detect shared libraries, -*** $file_magic_cmd, produces output that libtool cannot recognize. -*** The result is that libtool may fail to recognize shared libraries -*** as such. This will affect the creation of libtool libraries that -*** depend on shared libraries, but programs linked with such libtool -*** libraries will work regardless of this problem. Nevertheless, you -*** may want to report the problem to your system manager and/or to -*** bug-libtool@gnu.org - -_LT_EOF - fi ;; - esac - fi - break - fi - done - IFS="$lt_save_ifs" - MAGIC_CMD="$lt_save_MAGIC_CMD" - ;; -esac -fi - -MAGIC_CMD="$lt_cv_path_MAGIC_CMD" -if test -n "$MAGIC_CMD"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MAGIC_CMD" >&5 -$as_echo "$MAGIC_CMD" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - - else - MAGIC_CMD=: - fi -fi - - fi - ;; -esac - -# Use C for the default configuration in the libtool script - -lt_save_CC="$CC" -ac_ext=c -ac_cpp='$CPP $CPPFLAGS' -ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_c_compiler_gnu - - -# Source file extension for C test sources. -ac_ext=c - -# Object file extension for compiled C test sources. -objext=o -objext=$objext - -# Code to be used in simple compile tests -lt_simple_compile_test_code="int some_variable = 0;" - -# Code to be used in simple link tests -lt_simple_link_test_code='int main(){return(0);}' - - - - - - - -# If no C compiler was specified, use CC. -LTCC=${LTCC-"$CC"} - -# If no C compiler flags were specified, use CFLAGS. -LTCFLAGS=${LTCFLAGS-"$CFLAGS"} - -# Allow CC to be a program name with arguments. -compiler=$CC - -# Save the default compiler, since it gets overwritten when the other -# tags are being tested, and _LT_TAGVAR(compiler, []) is a NOP. -compiler_DEFAULT=$CC - -# save warnings/boilerplate of simple test code -ac_outfile=conftest.$ac_objext -echo "$lt_simple_compile_test_code" >conftest.$ac_ext -eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err -_lt_compiler_boilerplate=`cat conftest.err` -$RM conftest* - -ac_outfile=conftest.$ac_objext -echo "$lt_simple_link_test_code" >conftest.$ac_ext -eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err -_lt_linker_boilerplate=`cat conftest.err` -$RM -r conftest* - - -if test -n "$compiler"; then - -lt_prog_compiler_no_builtin_flag= - -if test "$GCC" = yes; then - case $cc_basename in - nvcc*) - lt_prog_compiler_no_builtin_flag=' -Xcompiler -fno-builtin' ;; - *) - lt_prog_compiler_no_builtin_flag=' -fno-builtin' ;; - esac - - { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -fno-rtti -fno-exceptions" >&5 -$as_echo_n "checking if $compiler supports -fno-rtti -fno-exceptions... " >&6; } -if ${lt_cv_prog_compiler_rtti_exceptions+:} false; then : - $as_echo_n "(cached) " >&6 -else - lt_cv_prog_compiler_rtti_exceptions=no - ac_outfile=conftest.$ac_objext - echo "$lt_simple_compile_test_code" > conftest.$ac_ext - lt_compiler_flag="-fno-rtti -fno-exceptions" - # Insert the option either (1) after the last *FLAGS variable, or - # (2) before a word containing "conftest.", or (3) at the end. - # Note that $ac_compile itself does not contain backslashes and begins - # with a dollar sign (not a hyphen), so the echo should work correctly. - # The option is referenced via a variable to avoid confusing sed. - lt_compile=`echo "$ac_compile" | $SED \ - -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ - -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ - -e 's:$: $lt_compiler_flag:'` - (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) - (eval "$lt_compile" 2>conftest.err) - ac_status=$? - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - if (exit $ac_status) && test -s "$ac_outfile"; then - # The compiler can only warn and ignore the option if not recognized - # So say no if there are warnings other than the usual output. - $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp - $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 - if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then - lt_cv_prog_compiler_rtti_exceptions=yes - fi - fi - $RM conftest* - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_rtti_exceptions" >&5 -$as_echo "$lt_cv_prog_compiler_rtti_exceptions" >&6; } - -if test x"$lt_cv_prog_compiler_rtti_exceptions" = xyes; then - lt_prog_compiler_no_builtin_flag="$lt_prog_compiler_no_builtin_flag -fno-rtti -fno-exceptions" -else - : -fi - -fi - - - - - - - lt_prog_compiler_wl= -lt_prog_compiler_pic= -lt_prog_compiler_static= - - - if test "$GCC" = yes; then - lt_prog_compiler_wl='-Wl,' - lt_prog_compiler_static='-static' - - case $host_os in - aix*) - # All AIX code is PIC. - if test "$host_cpu" = ia64; then - # AIX 5 now supports IA64 processor - lt_prog_compiler_static='-Bstatic' - fi - ;; - - amigaos*) - case $host_cpu in - powerpc) - # see comment about AmigaOS4 .so support - lt_prog_compiler_pic='-fPIC' - ;; - m68k) - # FIXME: we need at least 68020 code to build shared libraries, but - # adding the `-m68020' flag to GCC prevents building anything better, - # like `-m68040'. - lt_prog_compiler_pic='-m68020 -resident32 -malways-restore-a4' - ;; - esac - ;; - - beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) - # PIC is the default for these OSes. - ;; - - mingw* | cygwin* | pw32* | os2* | cegcc*) - # This hack is so that the source file can tell whether it is being - # built for inclusion in a dll (and should export symbols for example). - # Although the cygwin gcc ignores -fPIC, still need this for old-style - # (--disable-auto-import) libraries - lt_prog_compiler_pic='-DDLL_EXPORT' - ;; - - darwin* | rhapsody*) - # PIC is the default on this platform - # Common symbols not allowed in MH_DYLIB files - lt_prog_compiler_pic='-fno-common' - ;; - - haiku*) - # PIC is the default for Haiku. - # The "-static" flag exists, but is broken. - lt_prog_compiler_static= - ;; - - hpux*) - # PIC is the default for 64-bit PA HP-UX, but not for 32-bit - # PA HP-UX. On IA64 HP-UX, PIC is the default but the pic flag - # sets the default TLS model and affects inlining. - case $host_cpu in - hppa*64*) - # +Z the default - ;; - *) - lt_prog_compiler_pic='-fPIC' - ;; - esac - ;; - - interix[3-9]*) - # Interix 3.x gcc -fpic/-fPIC options generate broken code. - # Instead, we relocate shared libraries at runtime. - ;; - - msdosdjgpp*) - # Just because we use GCC doesn't mean we suddenly get shared libraries - # on systems that don't support them. - lt_prog_compiler_can_build_shared=no - enable_shared=no - ;; - - *nto* | *qnx*) - # QNX uses GNU C++, but need to define -shared option too, otherwise - # it will coredump. - lt_prog_compiler_pic='-fPIC -shared' - ;; - - sysv4*MP*) - if test -d /usr/nec; then - lt_prog_compiler_pic=-Kconform_pic - fi - ;; - - *) - lt_prog_compiler_pic='-fPIC' - ;; - esac - - case $cc_basename in - nvcc*) # Cuda Compiler Driver 2.2 - lt_prog_compiler_wl='-Xlinker ' - if test -n "$lt_prog_compiler_pic"; then - lt_prog_compiler_pic="-Xcompiler $lt_prog_compiler_pic" - fi - ;; - esac - else - # PORTME Check for flag to pass linker flags through the system compiler. - case $host_os in - aix*) - lt_prog_compiler_wl='-Wl,' - if test "$host_cpu" = ia64; then - # AIX 5 now supports IA64 processor - lt_prog_compiler_static='-Bstatic' - else - lt_prog_compiler_static='-bnso -bI:/lib/syscalls.exp' - fi - ;; - - mingw* | cygwin* | pw32* | os2* | cegcc*) - # This hack is so that the source file can tell whether it is being - # built for inclusion in a dll (and should export symbols for example). - lt_prog_compiler_pic='-DDLL_EXPORT' - ;; - - hpux9* | hpux10* | hpux11*) - lt_prog_compiler_wl='-Wl,' - # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but - # not for PA HP-UX. - case $host_cpu in - hppa*64*|ia64*) - # +Z the default - ;; - *) - lt_prog_compiler_pic='+Z' - ;; - esac - # Is there a better lt_prog_compiler_static that works with the bundled CC? - lt_prog_compiler_static='${wl}-a ${wl}archive' - ;; - - irix5* | irix6* | nonstopux*) - lt_prog_compiler_wl='-Wl,' - # PIC (with -KPIC) is the default. - lt_prog_compiler_static='-non_shared' - ;; - - linux* | k*bsd*-gnu | kopensolaris*-gnu) - case $cc_basename in - # old Intel for x86_64 which still supported -KPIC. - ecc*) - lt_prog_compiler_wl='-Wl,' - lt_prog_compiler_pic='-KPIC' - lt_prog_compiler_static='-static' - ;; - # icc used to be incompatible with GCC. - # ICC 10 doesn't accept -KPIC any more. - icc* | ifort*) - lt_prog_compiler_wl='-Wl,' - lt_prog_compiler_pic='-fPIC' - lt_prog_compiler_static='-static' - ;; - # Lahey Fortran 8.1. - lf95*) - lt_prog_compiler_wl='-Wl,' - lt_prog_compiler_pic='--shared' - lt_prog_compiler_static='--static' - ;; - nagfor*) - # NAG Fortran compiler - lt_prog_compiler_wl='-Wl,-Wl,,' - lt_prog_compiler_pic='-PIC' - lt_prog_compiler_static='-Bstatic' - ;; - pgcc* | pgf77* | pgf90* | pgf95* | pgfortran*) - # Portland Group compilers (*not* the Pentium gcc compiler, - # which looks to be a dead project) - lt_prog_compiler_wl='-Wl,' - lt_prog_compiler_pic='-fpic' - lt_prog_compiler_static='-Bstatic' - ;; - ccc*) - lt_prog_compiler_wl='-Wl,' - # All Alpha code is PIC. - lt_prog_compiler_static='-non_shared' - ;; - xl* | bgxl* | bgf* | mpixl*) - # IBM XL C 8.0/Fortran 10.1, 11.1 on PPC and BlueGene - lt_prog_compiler_wl='-Wl,' - lt_prog_compiler_pic='-qpic' - lt_prog_compiler_static='-qstaticlink' - ;; - *) - case `$CC -V 2>&1 | sed 5q` in - *Sun\ Ceres\ Fortran* | *Sun*Fortran*\ [1-7].* | *Sun*Fortran*\ 8.[0-3]*) - # Sun Fortran 8.3 passes all unrecognized flags to the linker - lt_prog_compiler_pic='-KPIC' - lt_prog_compiler_static='-Bstatic' - lt_prog_compiler_wl='' - ;; - *Sun\ F* | *Sun*Fortran*) - lt_prog_compiler_pic='-KPIC' - lt_prog_compiler_static='-Bstatic' - lt_prog_compiler_wl='-Qoption ld ' - ;; - *Sun\ C*) - # Sun C 5.9 - lt_prog_compiler_pic='-KPIC' - lt_prog_compiler_static='-Bstatic' - lt_prog_compiler_wl='-Wl,' - ;; - *Intel*\ [CF]*Compiler*) - lt_prog_compiler_wl='-Wl,' - lt_prog_compiler_pic='-fPIC' - lt_prog_compiler_static='-static' - ;; - *Portland\ Group*) - lt_prog_compiler_wl='-Wl,' - lt_prog_compiler_pic='-fpic' - lt_prog_compiler_static='-Bstatic' - ;; - esac - ;; - esac - ;; - - newsos6) - lt_prog_compiler_pic='-KPIC' - lt_prog_compiler_static='-Bstatic' - ;; - - *nto* | *qnx*) - # QNX uses GNU C++, but need to define -shared option too, otherwise - # it will coredump. - lt_prog_compiler_pic='-fPIC -shared' - ;; - - osf3* | osf4* | osf5*) - lt_prog_compiler_wl='-Wl,' - # All OSF/1 code is PIC. - lt_prog_compiler_static='-non_shared' - ;; - - rdos*) - lt_prog_compiler_static='-non_shared' - ;; - - solaris*) - lt_prog_compiler_pic='-KPIC' - lt_prog_compiler_static='-Bstatic' - case $cc_basename in - f77* | f90* | f95* | sunf77* | sunf90* | sunf95*) - lt_prog_compiler_wl='-Qoption ld ';; - *) - lt_prog_compiler_wl='-Wl,';; - esac - ;; - - sunos4*) - lt_prog_compiler_wl='-Qoption ld ' - lt_prog_compiler_pic='-PIC' - lt_prog_compiler_static='-Bstatic' - ;; - - sysv4 | sysv4.2uw2* | sysv4.3*) - lt_prog_compiler_wl='-Wl,' - lt_prog_compiler_pic='-KPIC' - lt_prog_compiler_static='-Bstatic' - ;; - - sysv4*MP*) - if test -d /usr/nec ;then - lt_prog_compiler_pic='-Kconform_pic' - lt_prog_compiler_static='-Bstatic' - fi - ;; - - sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) - lt_prog_compiler_wl='-Wl,' - lt_prog_compiler_pic='-KPIC' - lt_prog_compiler_static='-Bstatic' - ;; - - unicos*) - lt_prog_compiler_wl='-Wl,' - lt_prog_compiler_can_build_shared=no - ;; - - uts4*) - lt_prog_compiler_pic='-pic' - lt_prog_compiler_static='-Bstatic' - ;; - - *) - lt_prog_compiler_can_build_shared=no - ;; - esac - fi - -case $host_os in - # For platforms which do not support PIC, -DPIC is meaningless: - *djgpp*) - lt_prog_compiler_pic= - ;; - *) - lt_prog_compiler_pic="$lt_prog_compiler_pic -DPIC" - ;; -esac - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $compiler option to produce PIC" >&5 -$as_echo_n "checking for $compiler option to produce PIC... " >&6; } -if ${lt_cv_prog_compiler_pic+:} false; then : - $as_echo_n "(cached) " >&6 -else - lt_cv_prog_compiler_pic=$lt_prog_compiler_pic -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic" >&5 -$as_echo "$lt_cv_prog_compiler_pic" >&6; } -lt_prog_compiler_pic=$lt_cv_prog_compiler_pic - -# -# Check to make sure the PIC flag actually works. -# -if test -n "$lt_prog_compiler_pic"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler PIC flag $lt_prog_compiler_pic works" >&5 -$as_echo_n "checking if $compiler PIC flag $lt_prog_compiler_pic works... " >&6; } -if ${lt_cv_prog_compiler_pic_works+:} false; then : - $as_echo_n "(cached) " >&6 -else - lt_cv_prog_compiler_pic_works=no - ac_outfile=conftest.$ac_objext - echo "$lt_simple_compile_test_code" > conftest.$ac_ext - lt_compiler_flag="$lt_prog_compiler_pic -DPIC" - # Insert the option either (1) after the last *FLAGS variable, or - # (2) before a word containing "conftest.", or (3) at the end. - # Note that $ac_compile itself does not contain backslashes and begins - # with a dollar sign (not a hyphen), so the echo should work correctly. - # The option is referenced via a variable to avoid confusing sed. - lt_compile=`echo "$ac_compile" | $SED \ - -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ - -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ - -e 's:$: $lt_compiler_flag:'` - (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) - (eval "$lt_compile" 2>conftest.err) - ac_status=$? - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - if (exit $ac_status) && test -s "$ac_outfile"; then - # The compiler can only warn and ignore the option if not recognized - # So say no if there are warnings other than the usual output. - $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp - $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 - if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then - lt_cv_prog_compiler_pic_works=yes - fi - fi - $RM conftest* - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic_works" >&5 -$as_echo "$lt_cv_prog_compiler_pic_works" >&6; } - -if test x"$lt_cv_prog_compiler_pic_works" = xyes; then - case $lt_prog_compiler_pic in - "" | " "*) ;; - *) lt_prog_compiler_pic=" $lt_prog_compiler_pic" ;; - esac -else - lt_prog_compiler_pic= - lt_prog_compiler_can_build_shared=no -fi - -fi - - - - - - - - - - - -# -# Check to make sure the static flag actually works. -# -wl=$lt_prog_compiler_wl eval lt_tmp_static_flag=\"$lt_prog_compiler_static\" -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler static flag $lt_tmp_static_flag works" >&5 -$as_echo_n "checking if $compiler static flag $lt_tmp_static_flag works... " >&6; } -if ${lt_cv_prog_compiler_static_works+:} false; then : - $as_echo_n "(cached) " >&6 -else - lt_cv_prog_compiler_static_works=no - save_LDFLAGS="$LDFLAGS" - LDFLAGS="$LDFLAGS $lt_tmp_static_flag" - echo "$lt_simple_link_test_code" > conftest.$ac_ext - if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then - # The linker can only warn and ignore the option if not recognized - # So say no if there are warnings - if test -s conftest.err; then - # Append any errors to the config.log. - cat conftest.err 1>&5 - $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp - $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 - if diff conftest.exp conftest.er2 >/dev/null; then - lt_cv_prog_compiler_static_works=yes - fi - else - lt_cv_prog_compiler_static_works=yes - fi - fi - $RM -r conftest* - LDFLAGS="$save_LDFLAGS" - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_static_works" >&5 -$as_echo "$lt_cv_prog_compiler_static_works" >&6; } - -if test x"$lt_cv_prog_compiler_static_works" = xyes; then - : -else - lt_prog_compiler_static= -fi - - - - - - - - { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5 -$as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; } -if ${lt_cv_prog_compiler_c_o+:} false; then : - $as_echo_n "(cached) " >&6 -else - lt_cv_prog_compiler_c_o=no - $RM -r conftest 2>/dev/null - mkdir conftest - cd conftest - mkdir out - echo "$lt_simple_compile_test_code" > conftest.$ac_ext - - lt_compiler_flag="-o out/conftest2.$ac_objext" - # Insert the option either (1) after the last *FLAGS variable, or - # (2) before a word containing "conftest.", or (3) at the end. - # Note that $ac_compile itself does not contain backslashes and begins - # with a dollar sign (not a hyphen), so the echo should work correctly. - lt_compile=`echo "$ac_compile" | $SED \ - -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ - -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ - -e 's:$: $lt_compiler_flag:'` - (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) - (eval "$lt_compile" 2>out/conftest.err) - ac_status=$? - cat out/conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - if (exit $ac_status) && test -s out/conftest2.$ac_objext - then - # The compiler can only warn and ignore the option if not recognized - # So say no if there are warnings - $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp - $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 - if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then - lt_cv_prog_compiler_c_o=yes - fi - fi - chmod u+w . 2>&5 - $RM conftest* - # SGI C++ compiler will create directory out/ii_files/ for - # template instantiation - test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files - $RM out/* && rmdir out - cd .. - $RM -r conftest - $RM conftest* - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o" >&5 -$as_echo "$lt_cv_prog_compiler_c_o" >&6; } - - - - - - - { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5 -$as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; } -if ${lt_cv_prog_compiler_c_o+:} false; then : - $as_echo_n "(cached) " >&6 -else - lt_cv_prog_compiler_c_o=no - $RM -r conftest 2>/dev/null - mkdir conftest - cd conftest - mkdir out - echo "$lt_simple_compile_test_code" > conftest.$ac_ext - - lt_compiler_flag="-o out/conftest2.$ac_objext" - # Insert the option either (1) after the last *FLAGS variable, or - # (2) before a word containing "conftest.", or (3) at the end. - # Note that $ac_compile itself does not contain backslashes and begins - # with a dollar sign (not a hyphen), so the echo should work correctly. - lt_compile=`echo "$ac_compile" | $SED \ - -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ - -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ - -e 's:$: $lt_compiler_flag:'` - (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) - (eval "$lt_compile" 2>out/conftest.err) - ac_status=$? - cat out/conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - if (exit $ac_status) && test -s out/conftest2.$ac_objext - then - # The compiler can only warn and ignore the option if not recognized - # So say no if there are warnings - $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp - $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 - if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then - lt_cv_prog_compiler_c_o=yes - fi - fi - chmod u+w . 2>&5 - $RM conftest* - # SGI C++ compiler will create directory out/ii_files/ for - # template instantiation - test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files - $RM out/* && rmdir out - cd .. - $RM -r conftest - $RM conftest* - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o" >&5 -$as_echo "$lt_cv_prog_compiler_c_o" >&6; } - - - - -hard_links="nottested" -if test "$lt_cv_prog_compiler_c_o" = no && test "$need_locks" != no; then - # do not overwrite the value of need_locks provided by the user - { $as_echo "$as_me:${as_lineno-$LINENO}: checking if we can lock with hard links" >&5 -$as_echo_n "checking if we can lock with hard links... " >&6; } - hard_links=yes - $RM conftest* - ln conftest.a conftest.b 2>/dev/null && hard_links=no - touch conftest.a - ln conftest.a conftest.b 2>&5 || hard_links=no - ln conftest.a conftest.b 2>/dev/null && hard_links=no - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $hard_links" >&5 -$as_echo "$hard_links" >&6; } - if test "$hard_links" = no; then - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&5 -$as_echo "$as_me: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&2;} - need_locks=warn - fi -else - need_locks=no -fi - - - - - - - { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $compiler linker ($LD) supports shared libraries" >&5 -$as_echo_n "checking whether the $compiler linker ($LD) supports shared libraries... " >&6; } - - runpath_var= - allow_undefined_flag= - always_export_symbols=no - archive_cmds= - archive_expsym_cmds= - compiler_needs_object=no - enable_shared_with_static_runtimes=no - export_dynamic_flag_spec= - export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' - hardcode_automatic=no - hardcode_direct=no - hardcode_direct_absolute=no - hardcode_libdir_flag_spec= - hardcode_libdir_separator= - hardcode_minus_L=no - hardcode_shlibpath_var=unsupported - inherit_rpath=no - link_all_deplibs=unknown - module_cmds= - module_expsym_cmds= - old_archive_from_new_cmds= - old_archive_from_expsyms_cmds= - thread_safe_flag_spec= - whole_archive_flag_spec= - # include_expsyms should be a list of space-separated symbols to be *always* - # included in the symbol list - include_expsyms= - # exclude_expsyms can be an extended regexp of symbols to exclude - # it will be wrapped by ` (' and `)$', so one must not match beginning or - # end of line. Example: `a|bc|.*d.*' will exclude the symbols `a' and `bc', - # as well as any symbol that contains `d'. - exclude_expsyms='_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*' - # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out - # platforms (ab)use it in PIC code, but their linkers get confused if - # the symbol is explicitly referenced. Since portable code cannot - # rely on this symbol name, it's probably fine to never include it in - # preloaded symbol tables. - # Exclude shared library initialization/finalization symbols. - extract_expsyms_cmds= - - case $host_os in - cygwin* | mingw* | pw32* | cegcc*) - # FIXME: the MSVC++ port hasn't been tested in a loooong time - # When not using gcc, we currently assume that we are using - # Microsoft Visual C++. - if test "$GCC" != yes; then - with_gnu_ld=no - fi - ;; - interix*) - # we just hope/assume this is gcc and not c89 (= MSVC++) - with_gnu_ld=yes - ;; - openbsd*) - with_gnu_ld=no - ;; - linux* | k*bsd*-gnu | gnu*) - link_all_deplibs=no - ;; - esac - - ld_shlibs=yes - - # On some targets, GNU ld is compatible enough with the native linker - # that we're better off using the native interface for both. - lt_use_gnu_ld_interface=no - if test "$with_gnu_ld" = yes; then - case $host_os in - aix*) - # The AIX port of GNU ld has always aspired to compatibility - # with the native linker. However, as the warning in the GNU ld - # block says, versions before 2.19.5* couldn't really create working - # shared libraries, regardless of the interface used. - case `$LD -v 2>&1` in - *\ \(GNU\ Binutils\)\ 2.19.5*) ;; - *\ \(GNU\ Binutils\)\ 2.[2-9]*) ;; - *\ \(GNU\ Binutils\)\ [3-9]*) ;; - *) - lt_use_gnu_ld_interface=yes - ;; - esac - ;; - *) - lt_use_gnu_ld_interface=yes - ;; - esac - fi - - if test "$lt_use_gnu_ld_interface" = yes; then - # If archive_cmds runs LD, not CC, wlarc should be empty - wlarc='${wl}' - - # Set some defaults for GNU ld with shared library support. These - # are reset later if shared libraries are not supported. Putting them - # here allows them to be overridden if necessary. - runpath_var=LD_RUN_PATH - hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' - export_dynamic_flag_spec='${wl}--export-dynamic' - # ancient GNU ld didn't support --whole-archive et. al. - if $LD --help 2>&1 | $GREP 'no-whole-archive' > /dev/null; then - whole_archive_flag_spec="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' - else - whole_archive_flag_spec= - fi - supports_anon_versioning=no - case `$LD -v 2>&1` in - *GNU\ gold*) supports_anon_versioning=yes ;; - *\ [01].* | *\ 2.[0-9].* | *\ 2.10.*) ;; # catch versions < 2.11 - *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ... - *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ... - *\ 2.11.*) ;; # other 2.11 versions - *) supports_anon_versioning=yes ;; - esac - - # See if GNU ld supports shared libraries. - case $host_os in - aix[3-9]*) - # On AIX/PPC, the GNU linker is very broken - if test "$host_cpu" != ia64; then - ld_shlibs=no - cat <<_LT_EOF 1>&2 - -*** Warning: the GNU linker, at least up to release 2.19, is reported -*** to be unable to reliably create shared libraries on AIX. -*** Therefore, libtool is disabling shared libraries support. If you -*** really care for shared libraries, you may want to install binutils -*** 2.20 or above, or modify your PATH so that a non-GNU linker is found. -*** You will then need to restart the configuration process. - -_LT_EOF - fi - ;; - - amigaos*) - case $host_cpu in - powerpc) - # see comment about AmigaOS4 .so support - archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' - archive_expsym_cmds='' - ;; - m68k) - archive_cmds='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' - hardcode_libdir_flag_spec='-L$libdir' - hardcode_minus_L=yes - ;; - esac - ;; - - beos*) - if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then - allow_undefined_flag=unsupported - # Joseph Beckenbach says some releases of gcc - # support --undefined. This deserves some investigation. FIXME - archive_cmds='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' - else - ld_shlibs=no - fi - ;; - - cygwin* | mingw* | pw32* | cegcc*) - # _LT_TAGVAR(hardcode_libdir_flag_spec, ) is actually meaningless, - # as there is no search path for DLLs. - hardcode_libdir_flag_spec='-L$libdir' - export_dynamic_flag_spec='${wl}--export-all-symbols' - allow_undefined_flag=unsupported - always_export_symbols=no - enable_shared_with_static_runtimes=yes - export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1 DATA/;s/^.*[ ]__nm__\([^ ]*\)[ ][^ ]*/\1 DATA/;/^I[ ]/d;/^[AITW][ ]/s/.* //'\'' | sort | uniq > $export_symbols' - exclude_expsyms='[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname' - - if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then - archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' - # If the export-symbols file already is a .def file (1st line - # is EXPORTS), use it as is; otherwise, prepend... - archive_expsym_cmds='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then - cp $export_symbols $output_objdir/$soname.def; - else - echo EXPORTS > $output_objdir/$soname.def; - cat $export_symbols >> $output_objdir/$soname.def; - fi~ - $CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' - else - ld_shlibs=no - fi - ;; - - haiku*) - archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' - link_all_deplibs=yes - ;; - - interix[3-9]*) - hardcode_direct=no - hardcode_shlibpath_var=no - hardcode_libdir_flag_spec='${wl}-rpath,$libdir' - export_dynamic_flag_spec='${wl}-E' - # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. - # Instead, shared libraries are loaded at an image base (0x10000000 by - # default) and relocated if they conflict, which is a slow very memory - # consuming and fragmenting process. To avoid this, we pick a random, - # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link - # time. Moving up from 0x10000000 also allows more sbrk(2) space. - archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' - archive_expsym_cmds='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' - ;; - - gnu* | linux* | tpf* | k*bsd*-gnu | kopensolaris*-gnu) - tmp_diet=no - if test "$host_os" = linux-dietlibc; then - case $cc_basename in - diet\ *) tmp_diet=yes;; # linux-dietlibc with static linking (!diet-dyn) - esac - fi - if $LD --help 2>&1 | $EGREP ': supported targets:.* elf' > /dev/null \ - && test "$tmp_diet" = no - then - tmp_addflag=' $pic_flag' - tmp_sharedflag='-shared' - case $cc_basename,$host_cpu in - pgcc*) # Portland Group C compiler - whole_archive_flag_spec='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' - tmp_addflag=' $pic_flag' - ;; - pgf77* | pgf90* | pgf95* | pgfortran*) - # Portland Group f77 and f90 compilers - whole_archive_flag_spec='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' - tmp_addflag=' $pic_flag -Mnomain' ;; - ecc*,ia64* | icc*,ia64*) # Intel C compiler on ia64 - tmp_addflag=' -i_dynamic' ;; - efc*,ia64* | ifort*,ia64*) # Intel Fortran compiler on ia64 - tmp_addflag=' -i_dynamic -nofor_main' ;; - ifc* | ifort*) # Intel Fortran compiler - tmp_addflag=' -nofor_main' ;; - lf95*) # Lahey Fortran 8.1 - whole_archive_flag_spec= - tmp_sharedflag='--shared' ;; - xl[cC]* | bgxl[cC]* | mpixl[cC]*) # IBM XL C 8.0 on PPC (deal with xlf below) - tmp_sharedflag='-qmkshrobj' - tmp_addflag= ;; - nvcc*) # Cuda Compiler Driver 2.2 - whole_archive_flag_spec='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' - compiler_needs_object=yes - ;; - esac - case `$CC -V 2>&1 | sed 5q` in - *Sun\ C*) # Sun C 5.9 - whole_archive_flag_spec='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' - compiler_needs_object=yes - tmp_sharedflag='-G' ;; - *Sun\ F*) # Sun Fortran 8.3 - tmp_sharedflag='-G' ;; - esac - archive_cmds='$CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' - - if test "x$supports_anon_versioning" = xyes; then - archive_expsym_cmds='echo "{ global:" > $output_objdir/$libname.ver~ - cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ - echo "local: *; };" >> $output_objdir/$libname.ver~ - $CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib' - fi - - case $cc_basename in - xlf* | bgf* | bgxlf* | mpixlf*) - # IBM XL Fortran 10.1 on PPC cannot create shared libs itself - whole_archive_flag_spec='--whole-archive$convenience --no-whole-archive' - hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' - archive_cmds='$LD -shared $libobjs $deplibs $linker_flags -soname $soname -o $lib' - if test "x$supports_anon_versioning" = xyes; then - archive_expsym_cmds='echo "{ global:" > $output_objdir/$libname.ver~ - cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ - echo "local: *; };" >> $output_objdir/$libname.ver~ - $LD -shared $libobjs $deplibs $linker_flags -soname $soname -version-script $output_objdir/$libname.ver -o $lib' - fi - ;; - esac - else - ld_shlibs=no - fi - ;; - - netbsd* | netbsdelf*-gnu) - if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then - archive_cmds='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib' - wlarc= - else - archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' - archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' - fi - ;; - - solaris*) - if $LD -v 2>&1 | $GREP 'BFD 2\.8' > /dev/null; then - ld_shlibs=no - cat <<_LT_EOF 1>&2 - -*** Warning: The releases 2.8.* of the GNU linker cannot reliably -*** create shared libraries on Solaris systems. Therefore, libtool -*** is disabling shared libraries support. We urge you to upgrade GNU -*** binutils to release 2.9.1 or newer. Another option is to modify -*** your PATH or compiler configuration so that the native linker is -*** used, and then restart. - -_LT_EOF - elif $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then - archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' - archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' - else - ld_shlibs=no - fi - ;; - - sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*) - case `$LD -v 2>&1` in - *\ [01].* | *\ 2.[0-9].* | *\ 2.1[0-5].*) - ld_shlibs=no - cat <<_LT_EOF 1>&2 - -*** Warning: Releases of the GNU linker prior to 2.16.91.0.3 can not -*** reliably create shared libraries on SCO systems. Therefore, libtool -*** is disabling shared libraries support. We urge you to upgrade GNU -*** binutils to release 2.16.91.0.3 or newer. Another option is to modify -*** your PATH or compiler configuration so that the native linker is -*** used, and then restart. - -_LT_EOF - ;; - *) - # For security reasons, it is highly recommended that you always - # use absolute paths for naming shared libraries, and exclude the - # DT_RUNPATH tag from executables and libraries. But doing so - # requires that you compile everything twice, which is a pain. - if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then - hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' - archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' - archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' - else - ld_shlibs=no - fi - ;; - esac - ;; - - sunos4*) - archive_cmds='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags' - wlarc= - hardcode_direct=yes - hardcode_shlibpath_var=no - ;; - - *) - if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then - archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' - archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' - else - ld_shlibs=no - fi - ;; - esac - - if test "$ld_shlibs" = no; then - runpath_var= - hardcode_libdir_flag_spec= - export_dynamic_flag_spec= - whole_archive_flag_spec= - fi - else - # PORTME fill in a description of your system's linker (not GNU ld) - case $host_os in - aix3*) - allow_undefined_flag=unsupported - always_export_symbols=yes - archive_expsym_cmds='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname' - # Note: this linker hardcodes the directories in LIBPATH if there - # are no directories specified by -L. - hardcode_minus_L=yes - if test "$GCC" = yes && test -z "$lt_prog_compiler_static"; then - # Neither direct hardcoding nor static linking is supported with a - # broken collect2. - hardcode_direct=unsupported - fi - ;; - - aix[4-9]*) - if test "$host_cpu" = ia64; then - # On IA64, the linker does run time linking by default, so we don't - # have to do anything special. - aix_use_runtimelinking=no - exp_sym_flag='-Bexport' - no_entry_flag="" - else - # If we're using GNU nm, then we don't want the "-C" option. - # -C means demangle to AIX nm, but means don't demangle with GNU nm - # Also, AIX nm treats weak defined symbols like other global - # defined symbols, whereas GNU nm marks them as "W". - if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then - export_symbols_cmds='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && (substr(\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' - else - export_symbols_cmds='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && (substr(\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' - fi - aix_use_runtimelinking=no - - # Test if we are trying to use run time linking or normal - # AIX style linking. If -brtl is somewhere in LDFLAGS, we - # need to do runtime linking. - case $host_os in aix4.[23]|aix4.[23].*|aix[5-9]*) - for ld_flag in $LDFLAGS; do - if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then - aix_use_runtimelinking=yes - break - fi - done - ;; - esac - - exp_sym_flag='-bexport' - no_entry_flag='-bnoentry' - fi - - # When large executables or shared objects are built, AIX ld can - # have problems creating the table of contents. If linking a library - # or program results in "error TOC overflow" add -mminimal-toc to - # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not - # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. - - archive_cmds='' - hardcode_direct=yes - hardcode_direct_absolute=yes - hardcode_libdir_separator=':' - link_all_deplibs=yes - file_list_spec='${wl}-f,' - - if test "$GCC" = yes; then - case $host_os in aix4.[012]|aix4.[012].*) - # We only want to do this on AIX 4.2 and lower, the check - # below for broken collect2 doesn't work under 4.3+ - collect2name=`${CC} -print-prog-name=collect2` - if test -f "$collect2name" && - strings "$collect2name" | $GREP resolve_lib_name >/dev/null - then - # We have reworked collect2 - : - else - # We have old collect2 - hardcode_direct=unsupported - # It fails to find uninstalled libraries when the uninstalled - # path is not listed in the libpath. Setting hardcode_minus_L - # to unsupported forces relinking - hardcode_minus_L=yes - hardcode_libdir_flag_spec='-L$libdir' - hardcode_libdir_separator= - fi - ;; - esac - shared_flag='-shared' - if test "$aix_use_runtimelinking" = yes; then - shared_flag="$shared_flag "'${wl}-G' - fi - link_all_deplibs=no - else - # not using gcc - if test "$host_cpu" = ia64; then - # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release - # chokes on -Wl,-G. The following line is correct: - shared_flag='-G' - else - if test "$aix_use_runtimelinking" = yes; then - shared_flag='${wl}-G' - else - shared_flag='${wl}-bM:SRE' - fi - fi - fi - - export_dynamic_flag_spec='${wl}-bexpall' - # It seems that -bexpall does not export symbols beginning with - # underscore (_), so it is better to generate a list of symbols to export. - always_export_symbols=yes - if test "$aix_use_runtimelinking" = yes; then - # Warning - without using the other runtime loading flags (-brtl), - # -berok will link without error, but may produce a broken library. - allow_undefined_flag='-berok' - # Determine the default libpath from the value encoded in an - # empty executable. - if test "${lt_cv_aix_libpath+set}" = set; then - aix_libpath=$lt_cv_aix_libpath -else - if ${lt_cv_aix_libpath_+:} false; then : - $as_echo_n "(cached) " >&6 -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -int -main () -{ - - ; - return 0; -} -_ACEOF -if ac_fn_c_try_link "$LINENO"; then : - - lt_aix_libpath_sed=' - /Import File Strings/,/^$/ { - /^0/ { - s/^0 *\([^ ]*\) *$/\1/ - p - } - }' - lt_cv_aix_libpath_=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` - # Check for a 64-bit object if we didn't find anything. - if test -z "$lt_cv_aix_libpath_"; then - lt_cv_aix_libpath_=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` - fi -fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext - if test -z "$lt_cv_aix_libpath_"; then - lt_cv_aix_libpath_="/usr/lib:/lib" - fi - -fi - - aix_libpath=$lt_cv_aix_libpath_ -fi - - hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath" - archive_expsym_cmds='$CC -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then func_echo_all "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag" - else - if test "$host_cpu" = ia64; then - hardcode_libdir_flag_spec='${wl}-R $libdir:/usr/lib:/lib' - allow_undefined_flag="-z nodefs" - archive_expsym_cmds="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols" - else - # Determine the default libpath from the value encoded in an - # empty executable. - if test "${lt_cv_aix_libpath+set}" = set; then - aix_libpath=$lt_cv_aix_libpath -else - if ${lt_cv_aix_libpath_+:} false; then : - $as_echo_n "(cached) " >&6 -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -int -main () -{ - - ; - return 0; -} -_ACEOF -if ac_fn_c_try_link "$LINENO"; then : - - lt_aix_libpath_sed=' - /Import File Strings/,/^$/ { - /^0/ { - s/^0 *\([^ ]*\) *$/\1/ - p - } - }' - lt_cv_aix_libpath_=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` - # Check for a 64-bit object if we didn't find anything. - if test -z "$lt_cv_aix_libpath_"; then - lt_cv_aix_libpath_=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` - fi -fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext - if test -z "$lt_cv_aix_libpath_"; then - lt_cv_aix_libpath_="/usr/lib:/lib" - fi - -fi - - aix_libpath=$lt_cv_aix_libpath_ -fi - - hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath" - # Warning - without using the other run time loading flags, - # -berok will link without error, but may produce a broken library. - no_undefined_flag=' ${wl}-bernotok' - allow_undefined_flag=' ${wl}-berok' - if test "$with_gnu_ld" = yes; then - # We only use this code for GNU lds that support --whole-archive. - whole_archive_flag_spec='${wl}--whole-archive$convenience ${wl}--no-whole-archive' - else - # Exported symbols can be pulled into shared objects from archives - whole_archive_flag_spec='$convenience' - fi - archive_cmds_need_lc=yes - # This is similar to how AIX traditionally builds its shared libraries. - archive_expsym_cmds="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' - fi - fi - ;; - - amigaos*) - case $host_cpu in - powerpc) - # see comment about AmigaOS4 .so support - archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' - archive_expsym_cmds='' - ;; - m68k) - archive_cmds='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' - hardcode_libdir_flag_spec='-L$libdir' - hardcode_minus_L=yes - ;; - esac - ;; - - bsdi[45]*) - export_dynamic_flag_spec=-rdynamic - ;; - - cygwin* | mingw* | pw32* | cegcc*) - # When not using gcc, we currently assume that we are using - # Microsoft Visual C++. - # hardcode_libdir_flag_spec is actually meaningless, as there is - # no search path for DLLs. - case $cc_basename in - cl*) - # Native MSVC - hardcode_libdir_flag_spec=' ' - allow_undefined_flag=unsupported - always_export_symbols=yes - file_list_spec='@' - # Tell ltmain to make .lib files, not .a files. - libext=lib - # Tell ltmain to make .dll files, not .so files. - shrext_cmds=".dll" - # FIXME: Setting linknames here is a bad hack. - archive_cmds='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-dll~linknames=' - archive_expsym_cmds='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then - sed -n -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' -e '1\\\!p' < $export_symbols > $output_objdir/$soname.exp; - else - sed -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' < $export_symbols > $output_objdir/$soname.exp; - fi~ - $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~ - linknames=' - # The linker will not automatically build a static lib if we build a DLL. - # _LT_TAGVAR(old_archive_from_new_cmds, )='true' - enable_shared_with_static_runtimes=yes - exclude_expsyms='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*' - export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1,DATA/'\'' | $SED -e '\''/^[AITW][ ]/s/.*[ ]//'\'' | sort | uniq > $export_symbols' - # Don't use ranlib - old_postinstall_cmds='chmod 644 $oldlib' - postlink_cmds='lt_outputfile="@OUTPUT@"~ - lt_tool_outputfile="@TOOL_OUTPUT@"~ - case $lt_outputfile in - *.exe|*.EXE) ;; - *) - lt_outputfile="$lt_outputfile.exe" - lt_tool_outputfile="$lt_tool_outputfile.exe" - ;; - esac~ - if test "$MANIFEST_TOOL" != ":" && test -f "$lt_outputfile.manifest"; then - $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1; - $RM "$lt_outputfile.manifest"; - fi' - ;; - *) - # Assume MSVC wrapper - hardcode_libdir_flag_spec=' ' - allow_undefined_flag=unsupported - # Tell ltmain to make .lib files, not .a files. - libext=lib - # Tell ltmain to make .dll files, not .so files. - shrext_cmds=".dll" - # FIXME: Setting linknames here is a bad hack. - archive_cmds='$CC -o $lib $libobjs $compiler_flags `func_echo_all "$deplibs" | $SED '\''s/ -lc$//'\''` -link -dll~linknames=' - # The linker will automatically build a .lib file if we build a DLL. - old_archive_from_new_cmds='true' - # FIXME: Should let the user specify the lib program. - old_archive_cmds='lib -OUT:$oldlib$oldobjs$old_deplibs' - enable_shared_with_static_runtimes=yes - ;; - esac - ;; - - darwin* | rhapsody*) - - - archive_cmds_need_lc=no - hardcode_direct=no - hardcode_automatic=yes - hardcode_shlibpath_var=unsupported - if test "$lt_cv_ld_force_load" = "yes"; then - whole_archive_flag_spec='`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience ${wl}-force_load,$conv\"; done; func_echo_all \"$new_convenience\"`' - - else - whole_archive_flag_spec='' - fi - link_all_deplibs=yes - allow_undefined_flag="$_lt_dar_allow_undefined" - case $cc_basename in - ifort*) _lt_dar_can_shared=yes ;; - *) _lt_dar_can_shared=$GCC ;; - esac - if test "$_lt_dar_can_shared" = "yes"; then - output_verbose_link_cmd=func_echo_all - archive_cmds="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod${_lt_dsymutil}" - module_cmds="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dsymutil}" - archive_expsym_cmds="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring ${_lt_dar_single_mod}${_lt_dar_export_syms}${_lt_dsymutil}" - module_expsym_cmds="sed -e 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dar_export_syms}${_lt_dsymutil}" - - else - ld_shlibs=no - fi - - ;; - - dgux*) - archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' - hardcode_libdir_flag_spec='-L$libdir' - hardcode_shlibpath_var=no - ;; - - # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor - # support. Future versions do this automatically, but an explicit c++rt0.o - # does not break anything, and helps significantly (at the cost of a little - # extra space). - freebsd2.2*) - archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o' - hardcode_libdir_flag_spec='-R$libdir' - hardcode_direct=yes - hardcode_shlibpath_var=no - ;; - - # Unfortunately, older versions of FreeBSD 2 do not have this feature. - freebsd2.*) - archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' - hardcode_direct=yes - hardcode_minus_L=yes - hardcode_shlibpath_var=no - ;; - - # FreeBSD 3 and greater uses gcc -shared to do shared libraries. - freebsd* | dragonfly*) - archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' - hardcode_libdir_flag_spec='-R$libdir' - hardcode_direct=yes - hardcode_shlibpath_var=no - ;; - - hpux9*) - if test "$GCC" = yes; then - archive_cmds='$RM $output_objdir/$soname~$CC -shared $pic_flag ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' - else - archive_cmds='$RM $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' - fi - hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' - hardcode_libdir_separator=: - hardcode_direct=yes - - # hardcode_minus_L: Not really in the search PATH, - # but as the default location of the library. - hardcode_minus_L=yes - export_dynamic_flag_spec='${wl}-E' - ;; - - hpux10*) - if test "$GCC" = yes && test "$with_gnu_ld" = no; then - archive_cmds='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' - else - archive_cmds='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' - fi - if test "$with_gnu_ld" = no; then - hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' - hardcode_libdir_separator=: - hardcode_direct=yes - hardcode_direct_absolute=yes - export_dynamic_flag_spec='${wl}-E' - # hardcode_minus_L: Not really in the search PATH, - # but as the default location of the library. - hardcode_minus_L=yes - fi - ;; - - hpux11*) - if test "$GCC" = yes && test "$with_gnu_ld" = no; then - case $host_cpu in - hppa*64*) - archive_cmds='$CC -shared ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' - ;; - ia64*) - archive_cmds='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' - ;; - *) - archive_cmds='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' - ;; - esac - else - case $host_cpu in - hppa*64*) - archive_cmds='$CC -b ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' - ;; - ia64*) - archive_cmds='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' - ;; - *) - - # Older versions of the 11.00 compiler do not understand -b yet - # (HP92453-01 A.11.01.20 doesn't, HP92453-01 B.11.X.35175-35176.GP does) - { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $CC understands -b" >&5 -$as_echo_n "checking if $CC understands -b... " >&6; } -if ${lt_cv_prog_compiler__b+:} false; then : - $as_echo_n "(cached) " >&6 -else - lt_cv_prog_compiler__b=no - save_LDFLAGS="$LDFLAGS" - LDFLAGS="$LDFLAGS -b" - echo "$lt_simple_link_test_code" > conftest.$ac_ext - if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then - # The linker can only warn and ignore the option if not recognized - # So say no if there are warnings - if test -s conftest.err; then - # Append any errors to the config.log. - cat conftest.err 1>&5 - $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp - $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 - if diff conftest.exp conftest.er2 >/dev/null; then - lt_cv_prog_compiler__b=yes - fi - else - lt_cv_prog_compiler__b=yes - fi - fi - $RM -r conftest* - LDFLAGS="$save_LDFLAGS" - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler__b" >&5 -$as_echo "$lt_cv_prog_compiler__b" >&6; } - -if test x"$lt_cv_prog_compiler__b" = xyes; then - archive_cmds='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' -else - archive_cmds='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' -fi - - ;; - esac - fi - if test "$with_gnu_ld" = no; then - hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' - hardcode_libdir_separator=: - - case $host_cpu in - hppa*64*|ia64*) - hardcode_direct=no - hardcode_shlibpath_var=no - ;; - *) - hardcode_direct=yes - hardcode_direct_absolute=yes - export_dynamic_flag_spec='${wl}-E' - - # hardcode_minus_L: Not really in the search PATH, - # but as the default location of the library. - hardcode_minus_L=yes - ;; - esac - fi - ;; - - irix5* | irix6* | nonstopux*) - if test "$GCC" = yes; then - archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' - # Try to use the -exported_symbol ld option, if it does not - # work, assume that -exports_file does not work either and - # implicitly export all symbols. - # This should be the same for all languages, so no per-tag cache variable. - { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $host_os linker accepts -exported_symbol" >&5 -$as_echo_n "checking whether the $host_os linker accepts -exported_symbol... " >&6; } -if ${lt_cv_irix_exported_symbol+:} false; then : - $as_echo_n "(cached) " >&6 -else - save_LDFLAGS="$LDFLAGS" - LDFLAGS="$LDFLAGS -shared ${wl}-exported_symbol ${wl}foo ${wl}-update_registry ${wl}/dev/null" - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -int foo (void) { return 0; } -_ACEOF -if ac_fn_c_try_link "$LINENO"; then : - lt_cv_irix_exported_symbol=yes -else - lt_cv_irix_exported_symbol=no -fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext - LDFLAGS="$save_LDFLAGS" -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_irix_exported_symbol" >&5 -$as_echo "$lt_cv_irix_exported_symbol" >&6; } - if test "$lt_cv_irix_exported_symbol" = yes; then - archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations ${wl}-exports_file ${wl}$export_symbols -o $lib' - fi - else - archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' - archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -exports_file $export_symbols -o $lib' - fi - archive_cmds_need_lc='no' - hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' - hardcode_libdir_separator=: - inherit_rpath=yes - link_all_deplibs=yes - ;; - - netbsd* | netbsdelf*-gnu) - if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then - archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' # a.out - else - archive_cmds='$LD -shared -o $lib $libobjs $deplibs $linker_flags' # ELF - fi - hardcode_libdir_flag_spec='-R$libdir' - hardcode_direct=yes - hardcode_shlibpath_var=no - ;; - - newsos6) - archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' - hardcode_direct=yes - hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' - hardcode_libdir_separator=: - hardcode_shlibpath_var=no - ;; - - *nto* | *qnx*) - ;; - - openbsd*) - if test -f /usr/libexec/ld.so; then - hardcode_direct=yes - hardcode_shlibpath_var=no - hardcode_direct_absolute=yes - if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then - archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' - archive_expsym_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-retain-symbols-file,$export_symbols' - hardcode_libdir_flag_spec='${wl}-rpath,$libdir' - export_dynamic_flag_spec='${wl}-E' - else - case $host_os in - openbsd[01].* | openbsd2.[0-7] | openbsd2.[0-7].*) - archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' - hardcode_libdir_flag_spec='-R$libdir' - ;; - *) - archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' - hardcode_libdir_flag_spec='${wl}-rpath,$libdir' - ;; - esac - fi - else - ld_shlibs=no - fi - ;; - - os2*) - hardcode_libdir_flag_spec='-L$libdir' - hardcode_minus_L=yes - allow_undefined_flag=unsupported - archive_cmds='$ECHO "LIBRARY $libname INITINSTANCE" > $output_objdir/$libname.def~$ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~echo DATA >> $output_objdir/$libname.def~echo " SINGLE NONSHARED" >> $output_objdir/$libname.def~echo EXPORTS >> $output_objdir/$libname.def~emxexp $libobjs >> $output_objdir/$libname.def~$CC -Zdll -Zcrtdll -o $lib $libobjs $deplibs $compiler_flags $output_objdir/$libname.def' - old_archive_from_new_cmds='emximp -o $output_objdir/$libname.a $output_objdir/$libname.def' - ;; - - osf3*) - if test "$GCC" = yes; then - allow_undefined_flag=' ${wl}-expect_unresolved ${wl}\*' - archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' - else - allow_undefined_flag=' -expect_unresolved \*' - archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' - fi - archive_cmds_need_lc='no' - hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' - hardcode_libdir_separator=: - ;; - - osf4* | osf5*) # as osf3* with the addition of -msym flag - if test "$GCC" = yes; then - allow_undefined_flag=' ${wl}-expect_unresolved ${wl}\*' - archive_cmds='$CC -shared${allow_undefined_flag} $pic_flag $libobjs $deplibs $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' - hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' - else - allow_undefined_flag=' -expect_unresolved \*' - archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' - archive_expsym_cmds='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; printf "%s\\n" "-hidden">> $lib.exp~ - $CC -shared${allow_undefined_flag} ${wl}-input ${wl}$lib.exp $compiler_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib~$RM $lib.exp' - - # Both c and cxx compiler support -rpath directly - hardcode_libdir_flag_spec='-rpath $libdir' - fi - archive_cmds_need_lc='no' - hardcode_libdir_separator=: - ;; - - solaris*) - no_undefined_flag=' -z defs' - if test "$GCC" = yes; then - wlarc='${wl}' - archive_cmds='$CC -shared $pic_flag ${wl}-z ${wl}text ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' - archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ - $CC -shared $pic_flag ${wl}-z ${wl}text ${wl}-M ${wl}$lib.exp ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' - else - case `$CC -V 2>&1` in - *"Compilers 5.0"*) - wlarc='' - archive_cmds='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags' - archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ - $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$RM $lib.exp' - ;; - *) - wlarc='${wl}' - archive_cmds='$CC -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $compiler_flags' - archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ - $CC -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' - ;; - esac - fi - hardcode_libdir_flag_spec='-R$libdir' - hardcode_shlibpath_var=no - case $host_os in - solaris2.[0-5] | solaris2.[0-5].*) ;; - *) - # The compiler driver will combine and reorder linker options, - # but understands `-z linker_flag'. GCC discards it without `$wl', - # but is careful enough not to reorder. - # Supported since Solaris 2.6 (maybe 2.5.1?) - if test "$GCC" = yes; then - whole_archive_flag_spec='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract' - else - whole_archive_flag_spec='-z allextract$convenience -z defaultextract' - fi - ;; - esac - link_all_deplibs=yes - ;; - - sunos4*) - if test "x$host_vendor" = xsequent; then - # Use $CC to link under sequent, because it throws in some extra .o - # files that make .init and .fini sections work. - archive_cmds='$CC -G ${wl}-h $soname -o $lib $libobjs $deplibs $compiler_flags' - else - archive_cmds='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags' - fi - hardcode_libdir_flag_spec='-L$libdir' - hardcode_direct=yes - hardcode_minus_L=yes - hardcode_shlibpath_var=no - ;; - - sysv4) - case $host_vendor in - sni) - archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' - hardcode_direct=yes # is this really true??? - ;; - siemens) - ## LD is ld it makes a PLAMLIB - ## CC just makes a GrossModule. - archive_cmds='$LD -G -o $lib $libobjs $deplibs $linker_flags' - reload_cmds='$CC -r -o $output$reload_objs' - hardcode_direct=no - ;; - motorola) - archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' - hardcode_direct=no #Motorola manual says yes, but my tests say they lie - ;; - esac - runpath_var='LD_RUN_PATH' - hardcode_shlibpath_var=no - ;; - - sysv4.3*) - archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' - hardcode_shlibpath_var=no - export_dynamic_flag_spec='-Bexport' - ;; - - sysv4*MP*) - if test -d /usr/nec; then - archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' - hardcode_shlibpath_var=no - runpath_var=LD_RUN_PATH - hardcode_runpath_var=yes - ld_shlibs=yes - fi - ;; - - sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7* | sco3.2v5.0.[024]*) - no_undefined_flag='${wl}-z,text' - archive_cmds_need_lc=no - hardcode_shlibpath_var=no - runpath_var='LD_RUN_PATH' - - if test "$GCC" = yes; then - archive_cmds='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' - archive_expsym_cmds='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' - else - archive_cmds='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' - archive_expsym_cmds='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' - fi - ;; - - sysv5* | sco3.2v5* | sco5v6*) - # Note: We can NOT use -z defs as we might desire, because we do not - # link with -lc, and that would cause any symbols used from libc to - # always be unresolved, which means just about no library would - # ever link correctly. If we're not using GNU ld we use -z text - # though, which does catch some bad symbols but isn't as heavy-handed - # as -z defs. - no_undefined_flag='${wl}-z,text' - allow_undefined_flag='${wl}-z,nodefs' - archive_cmds_need_lc=no - hardcode_shlibpath_var=no - hardcode_libdir_flag_spec='${wl}-R,$libdir' - hardcode_libdir_separator=':' - link_all_deplibs=yes - export_dynamic_flag_spec='${wl}-Bexport' - runpath_var='LD_RUN_PATH' - - if test "$GCC" = yes; then - archive_cmds='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' - archive_expsym_cmds='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' - else - archive_cmds='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' - archive_expsym_cmds='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' - fi - ;; - - uts4*) - archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' - hardcode_libdir_flag_spec='-L$libdir' - hardcode_shlibpath_var=no - ;; - - *) - ld_shlibs=no - ;; - esac - - if test x$host_vendor = xsni; then - case $host in - sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) - export_dynamic_flag_spec='${wl}-Blargedynsym' - ;; - esac - fi - fi - -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ld_shlibs" >&5 -$as_echo "$ld_shlibs" >&6; } -test "$ld_shlibs" = no && can_build_shared=no - -with_gnu_ld=$with_gnu_ld - - - - - - - - - - - - - - - -# -# Do we need to explicitly link libc? -# -case "x$archive_cmds_need_lc" in -x|xyes) - # Assume -lc should be added - archive_cmds_need_lc=yes - - if test "$enable_shared" = yes && test "$GCC" = yes; then - case $archive_cmds in - *'~'*) - # FIXME: we may have to deal with multi-command sequences. - ;; - '$CC '*) - # Test whether the compiler implicitly links with -lc since on some - # systems, -lgcc has to come before -lc. If gcc already passes -lc - # to ld, don't add -lc before -lgcc. - { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether -lc should be explicitly linked in" >&5 -$as_echo_n "checking whether -lc should be explicitly linked in... " >&6; } -if ${lt_cv_archive_cmds_need_lc+:} false; then : - $as_echo_n "(cached) " >&6 -else - $RM conftest* - echo "$lt_simple_compile_test_code" > conftest.$ac_ext - - if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 - (eval $ac_compile) 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } 2>conftest.err; then - soname=conftest - lib=conftest - libobjs=conftest.$ac_objext - deplibs= - wl=$lt_prog_compiler_wl - pic_flag=$lt_prog_compiler_pic - compiler_flags=-v - linker_flags=-v - verstring= - output_objdir=. - libname=conftest - lt_save_allow_undefined_flag=$allow_undefined_flag - allow_undefined_flag= - if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$archive_cmds 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1\""; } >&5 - (eval $archive_cmds 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1) 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } - then - lt_cv_archive_cmds_need_lc=no - else - lt_cv_archive_cmds_need_lc=yes - fi - allow_undefined_flag=$lt_save_allow_undefined_flag - else - cat conftest.err 1>&5 - fi - $RM conftest* - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_archive_cmds_need_lc" >&5 -$as_echo "$lt_cv_archive_cmds_need_lc" >&6; } - archive_cmds_need_lc=$lt_cv_archive_cmds_need_lc - ;; - esac - fi - ;; -esac - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - { $as_echo "$as_me:${as_lineno-$LINENO}: checking dynamic linker characteristics" >&5 -$as_echo_n "checking dynamic linker characteristics... " >&6; } - -if test "$GCC" = yes; then - case $host_os in - darwin*) lt_awk_arg="/^libraries:/,/LR/" ;; - *) lt_awk_arg="/^libraries:/" ;; - esac - case $host_os in - mingw* | cegcc*) lt_sed_strip_eq="s,=\([A-Za-z]:\),\1,g" ;; - *) lt_sed_strip_eq="s,=/,/,g" ;; - esac - lt_search_path_spec=`$CC -print-search-dirs | awk $lt_awk_arg | $SED -e "s/^libraries://" -e $lt_sed_strip_eq` - case $lt_search_path_spec in - *\;*) - # if the path contains ";" then we assume it to be the separator - # otherwise default to the standard path separator (i.e. ":") - it is - # assumed that no part of a normal pathname contains ";" but that should - # okay in the real world where ";" in dirpaths is itself problematic. - lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED 's/;/ /g'` - ;; - *) - lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED "s/$PATH_SEPARATOR/ /g"` - ;; - esac - # Ok, now we have the path, separated by spaces, we can step through it - # and add multilib dir if necessary. - lt_tmp_lt_search_path_spec= - lt_multi_os_dir=`$CC $CPPFLAGS $CFLAGS $LDFLAGS -print-multi-os-directory 2>/dev/null` - for lt_sys_path in $lt_search_path_spec; do - if test -d "$lt_sys_path/$lt_multi_os_dir"; then - lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path/$lt_multi_os_dir" - else - test -d "$lt_sys_path" && \ - lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path" - fi - done - lt_search_path_spec=`$ECHO "$lt_tmp_lt_search_path_spec" | awk ' -BEGIN {RS=" "; FS="/|\n";} { - lt_foo=""; - lt_count=0; - for (lt_i = NF; lt_i > 0; lt_i--) { - if ($lt_i != "" && $lt_i != ".") { - if ($lt_i == "..") { - lt_count++; - } else { - if (lt_count == 0) { - lt_foo="/" $lt_i lt_foo; - } else { - lt_count--; - } - } - } - } - if (lt_foo != "") { lt_freq[lt_foo]++; } - if (lt_freq[lt_foo] == 1) { print lt_foo; } -}'` - # AWK program above erroneously prepends '/' to C:/dos/paths - # for these hosts. - case $host_os in - mingw* | cegcc*) lt_search_path_spec=`$ECHO "$lt_search_path_spec" |\ - $SED 's,/\([A-Za-z]:\),\1,g'` ;; - esac - sys_lib_search_path_spec=`$ECHO "$lt_search_path_spec" | $lt_NL2SP` -else - sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" -fi -library_names_spec= -libname_spec='lib$name' -soname_spec= -shrext_cmds=".so" -postinstall_cmds= -postuninstall_cmds= -finish_cmds= -finish_eval= -shlibpath_var= -shlibpath_overrides_runpath=unknown -version_type=none -dynamic_linker="$host_os ld.so" -sys_lib_dlsearch_path_spec="/lib /usr/lib" -need_lib_prefix=unknown -hardcode_into_libs=no - -# when you set need_version to no, make sure it does not cause -set_version -# flags to be left without arguments -need_version=unknown - -case $host_os in -aix3*) - version_type=linux # correct to gnu/linux during the next big refactor - library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a' - shlibpath_var=LIBPATH - - # AIX 3 has no versioning support, so we append a major version to the name. - soname_spec='${libname}${release}${shared_ext}$major' - ;; - -aix[4-9]*) - version_type=linux # correct to gnu/linux during the next big refactor - need_lib_prefix=no - need_version=no - hardcode_into_libs=yes - if test "$host_cpu" = ia64; then - # AIX 5 supports IA64 - library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}' - shlibpath_var=LD_LIBRARY_PATH - else - # With GCC up to 2.95.x, collect2 would create an import file - # for dependence libraries. The import file would start with - # the line `#! .'. This would cause the generated library to - # depend on `.', always an invalid library. This was fixed in - # development snapshots of GCC prior to 3.0. - case $host_os in - aix4 | aix4.[01] | aix4.[01].*) - if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)' - echo ' yes ' - echo '#endif'; } | ${CC} -E - | $GREP yes > /dev/null; then - : - else - can_build_shared=no - fi - ;; - esac - # AIX (on Power*) has no versioning support, so currently we can not hardcode correct - # soname into executable. Probably we can add versioning support to - # collect2, so additional links can be useful in future. - if test "$aix_use_runtimelinking" = yes; then - # If using run time linking (on AIX 4.2 or later) use lib.so - # instead of lib.a to let people know that these are not - # typical AIX shared libraries. - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - else - # We preserve .a as extension for shared libraries through AIX4.2 - # and later when we are not doing run time linking. - library_names_spec='${libname}${release}.a $libname.a' - soname_spec='${libname}${release}${shared_ext}$major' - fi - shlibpath_var=LIBPATH - fi - ;; - -amigaos*) - case $host_cpu in - powerpc) - # Since July 2007 AmigaOS4 officially supports .so libraries. - # When compiling the executable, add -use-dynld -Lsobjs: to the compileline. - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - ;; - m68k) - library_names_spec='$libname.ixlibrary $libname.a' - # Create ${libname}_ixlibrary.a entries in /sys/libs. - finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`func_echo_all "$lib" | $SED '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; test $RM /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done' - ;; - esac - ;; - -beos*) - library_names_spec='${libname}${shared_ext}' - dynamic_linker="$host_os ld.so" - shlibpath_var=LIBRARY_PATH - ;; - -bsdi[45]*) - version_type=linux # correct to gnu/linux during the next big refactor - need_version=no - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir' - shlibpath_var=LD_LIBRARY_PATH - sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib" - sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib" - # the default ld.so.conf also contains /usr/contrib/lib and - # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow - # libtool to hard-code these into programs - ;; - -cygwin* | mingw* | pw32* | cegcc*) - version_type=windows - shrext_cmds=".dll" - need_version=no - need_lib_prefix=no - - case $GCC,$cc_basename in - yes,*) - # gcc - library_names_spec='$libname.dll.a' - # DLL is installed to $(libdir)/../bin by postinstall_cmds - postinstall_cmds='base_file=`basename \${file}`~ - dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~ - dldir=$destdir/`dirname \$dlpath`~ - test -d \$dldir || mkdir -p \$dldir~ - $install_prog $dir/$dlname \$dldir/$dlname~ - chmod a+x \$dldir/$dlname~ - if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then - eval '\''$striplib \$dldir/$dlname'\'' || exit \$?; - fi' - postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ - dlpath=$dir/\$dldll~ - $RM \$dlpath' - shlibpath_overrides_runpath=yes - - case $host_os in - cygwin*) - # Cygwin DLLs use 'cyg' prefix rather than 'lib' - soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' - - sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/lib/w32api" - ;; - mingw* | cegcc*) - # MinGW DLLs use traditional 'lib' prefix - soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' - ;; - pw32*) - # pw32 DLLs use 'pw' prefix rather than 'lib' - library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' - ;; - esac - dynamic_linker='Win32 ld.exe' - ;; - - *,cl*) - # Native MSVC - libname_spec='$name' - soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' - library_names_spec='${libname}.dll.lib' - - case $build_os in - mingw*) - sys_lib_search_path_spec= - lt_save_ifs=$IFS - IFS=';' - for lt_path in $LIB - do - IFS=$lt_save_ifs - # Let DOS variable expansion print the short 8.3 style file name. - lt_path=`cd "$lt_path" 2>/dev/null && cmd //C "for %i in (".") do @echo %~si"` - sys_lib_search_path_spec="$sys_lib_search_path_spec $lt_path" - done - IFS=$lt_save_ifs - # Convert to MSYS style. - sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | sed -e 's|\\\\|/|g' -e 's| \\([a-zA-Z]\\):| /\\1|g' -e 's|^ ||'` - ;; - cygwin*) - # Convert to unix form, then to dos form, then back to unix form - # but this time dos style (no spaces!) so that the unix form looks - # like /cygdrive/c/PROGRA~1:/cygdr... - sys_lib_search_path_spec=`cygpath --path --unix "$LIB"` - sys_lib_search_path_spec=`cygpath --path --dos "$sys_lib_search_path_spec" 2>/dev/null` - sys_lib_search_path_spec=`cygpath --path --unix "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` - ;; - *) - sys_lib_search_path_spec="$LIB" - if $ECHO "$sys_lib_search_path_spec" | $GREP ';[c-zC-Z]:/' >/dev/null; then - # It is most probably a Windows format PATH. - sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` - else - sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` - fi - # FIXME: find the short name or the path components, as spaces are - # common. (e.g. "Program Files" -> "PROGRA~1") - ;; - esac - - # DLL is installed to $(libdir)/../bin by postinstall_cmds - postinstall_cmds='base_file=`basename \${file}`~ - dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~ - dldir=$destdir/`dirname \$dlpath`~ - test -d \$dldir || mkdir -p \$dldir~ - $install_prog $dir/$dlname \$dldir/$dlname' - postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ - dlpath=$dir/\$dldll~ - $RM \$dlpath' - shlibpath_overrides_runpath=yes - dynamic_linker='Win32 link.exe' - ;; - - *) - # Assume MSVC wrapper - library_names_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext} $libname.lib' - dynamic_linker='Win32 ld.exe' - ;; - esac - # FIXME: first we should search . and the directory the executable is in - shlibpath_var=PATH - ;; - -darwin* | rhapsody*) - dynamic_linker="$host_os dyld" - version_type=darwin - need_lib_prefix=no - need_version=no - library_names_spec='${libname}${release}${major}$shared_ext ${libname}$shared_ext' - soname_spec='${libname}${release}${major}$shared_ext' - shlibpath_overrides_runpath=yes - shlibpath_var=DYLD_LIBRARY_PATH - shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`' - - sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/local/lib" - sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib' - ;; - -dgux*) - version_type=linux # correct to gnu/linux during the next big refactor - need_lib_prefix=no - need_version=no - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext' - soname_spec='${libname}${release}${shared_ext}$major' - shlibpath_var=LD_LIBRARY_PATH - ;; - -freebsd* | dragonfly*) - # DragonFly does not have aout. When/if they implement a new - # versioning mechanism, adjust this. - if test -x /usr/bin/objformat; then - objformat=`/usr/bin/objformat` - else - case $host_os in - freebsd[23].*) objformat=aout ;; - *) objformat=elf ;; - esac - fi - version_type=freebsd-$objformat - case $version_type in - freebsd-elf*) - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' - need_version=no - need_lib_prefix=no - ;; - freebsd-*) - library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix' - need_version=yes - ;; - esac - shlibpath_var=LD_LIBRARY_PATH - case $host_os in - freebsd2.*) - shlibpath_overrides_runpath=yes - ;; - freebsd3.[01]* | freebsdelf3.[01]*) - shlibpath_overrides_runpath=yes - hardcode_into_libs=yes - ;; - freebsd3.[2-9]* | freebsdelf3.[2-9]* | \ - freebsd4.[0-5] | freebsdelf4.[0-5] | freebsd4.1.1 | freebsdelf4.1.1) - shlibpath_overrides_runpath=no - hardcode_into_libs=yes - ;; - *) # from 4.6 on, and DragonFly - shlibpath_overrides_runpath=yes - hardcode_into_libs=yes - ;; - esac - ;; - -gnu*) - version_type=linux # correct to gnu/linux during the next big refactor - need_lib_prefix=no - need_version=no - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=no - hardcode_into_libs=yes - ;; - -haiku*) - version_type=linux # correct to gnu/linux during the next big refactor - need_lib_prefix=no - need_version=no - dynamic_linker="$host_os runtime_loader" - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - shlibpath_var=LIBRARY_PATH - shlibpath_overrides_runpath=yes - sys_lib_dlsearch_path_spec='/boot/home/config/lib /boot/common/lib /boot/system/lib' - hardcode_into_libs=yes - ;; - -hpux9* | hpux10* | hpux11*) - # Give a soname corresponding to the major version so that dld.sl refuses to - # link against other versions. - version_type=sunos - need_lib_prefix=no - need_version=no - case $host_cpu in - ia64*) - shrext_cmds='.so' - hardcode_into_libs=yes - dynamic_linker="$host_os dld.so" - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - if test "X$HPUX_IA64_MODE" = X32; then - sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib" - else - sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64" - fi - sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec - ;; - hppa*64*) - shrext_cmds='.sl' - hardcode_into_libs=yes - dynamic_linker="$host_os dld.sl" - shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH - shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64" - sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec - ;; - *) - shrext_cmds='.sl' - dynamic_linker="$host_os dld.sl" - shlibpath_var=SHLIB_PATH - shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - ;; - esac - # HP-UX runs *really* slowly unless shared libraries are mode 555, ... - postinstall_cmds='chmod 555 $lib' - # or fails outright, so override atomically: - install_override_mode=555 - ;; - -interix[3-9]*) - version_type=linux # correct to gnu/linux during the next big refactor - need_lib_prefix=no - need_version=no - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)' - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=no - hardcode_into_libs=yes - ;; - -irix5* | irix6* | nonstopux*) - case $host_os in - nonstopux*) version_type=nonstopux ;; - *) - if test "$lt_cv_prog_gnu_ld" = yes; then - version_type=linux # correct to gnu/linux during the next big refactor - else - version_type=irix - fi ;; - esac - need_lib_prefix=no - need_version=no - soname_spec='${libname}${release}${shared_ext}$major' - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}' - case $host_os in - irix5* | nonstopux*) - libsuff= shlibsuff= - ;; - *) - case $LD in # libtool.m4 will add one of these switches to LD - *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") - libsuff= shlibsuff= libmagic=32-bit;; - *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") - libsuff=32 shlibsuff=N32 libmagic=N32;; - *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") - libsuff=64 shlibsuff=64 libmagic=64-bit;; - *) libsuff= shlibsuff= libmagic=never-match;; - esac - ;; - esac - shlibpath_var=LD_LIBRARY${shlibsuff}_PATH - shlibpath_overrides_runpath=no - sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}" - sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}" - hardcode_into_libs=yes - ;; - -# No shared lib support for Linux oldld, aout, or coff. -linux*oldld* | linux*aout* | linux*coff*) - dynamic_linker=no - ;; - -# This must be glibc/ELF. -linux* | k*bsd*-gnu | kopensolaris*-gnu) - version_type=linux # correct to gnu/linux during the next big refactor - need_lib_prefix=no - need_version=no - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=no - - # Some binutils ld are patched to set DT_RUNPATH - if ${lt_cv_shlibpath_overrides_runpath+:} false; then : - $as_echo_n "(cached) " >&6 -else - lt_cv_shlibpath_overrides_runpath=no - save_LDFLAGS=$LDFLAGS - save_libdir=$libdir - eval "libdir=/foo; wl=\"$lt_prog_compiler_wl\"; \ - LDFLAGS=\"\$LDFLAGS $hardcode_libdir_flag_spec\"" - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -int -main () -{ - - ; - return 0; -} -_ACEOF -if ac_fn_c_try_link "$LINENO"; then : - if ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir" >/dev/null; then : - lt_cv_shlibpath_overrides_runpath=yes -fi -fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext - LDFLAGS=$save_LDFLAGS - libdir=$save_libdir - -fi - - shlibpath_overrides_runpath=$lt_cv_shlibpath_overrides_runpath - - # This implies no fast_install, which is unacceptable. - # Some rework will be needed to allow for fast_install - # before this can be enabled. - hardcode_into_libs=yes - - # Append ld.so.conf contents to the search path - if test -f /etc/ld.so.conf; then - lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \$2)); skip = 1; } { if (!skip) print \$0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[ ]*hwcap[ ]/d;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;s/"//g;/^$/d' | tr '\n' ' '` - sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra" - fi - - # We used to test for /lib/ld.so.1 and disable shared libraries on - # powerpc, because MkLinux only supported shared libraries with the - # GNU dynamic linker. Since this was broken with cross compilers, - # most powerpc-linux boxes support dynamic linking these days and - # people can always --disable-shared, the test was removed, and we - # assume the GNU/Linux dynamic linker is in use. - dynamic_linker='GNU/Linux ld.so' - ;; - -netbsdelf*-gnu) - version_type=linux - need_lib_prefix=no - need_version=no - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=no - hardcode_into_libs=yes - dynamic_linker='NetBSD ld.elf_so' - ;; - -netbsd*) - version_type=sunos - need_lib_prefix=no - need_version=no - if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' - finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' - dynamic_linker='NetBSD (a.out) ld.so' - else - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - dynamic_linker='NetBSD ld.elf_so' - fi - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=yes - hardcode_into_libs=yes - ;; - -newsos6) - version_type=linux # correct to gnu/linux during the next big refactor - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=yes - ;; - -*nto* | *qnx*) - version_type=qnx - need_lib_prefix=no - need_version=no - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=no - hardcode_into_libs=yes - dynamic_linker='ldqnx.so' - ;; - -openbsd*) - version_type=sunos - sys_lib_dlsearch_path_spec="/usr/lib" - need_lib_prefix=no - # Some older versions of OpenBSD (3.3 at least) *do* need versioned libs. - case $host_os in - openbsd3.3 | openbsd3.3.*) need_version=yes ;; - *) need_version=no ;; - esac - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' - finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' - shlibpath_var=LD_LIBRARY_PATH - if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then - case $host_os in - openbsd2.[89] | openbsd2.[89].*) - shlibpath_overrides_runpath=no - ;; - *) - shlibpath_overrides_runpath=yes - ;; - esac - else - shlibpath_overrides_runpath=yes - fi - ;; - -os2*) - libname_spec='$name' - shrext_cmds=".dll" - need_lib_prefix=no - library_names_spec='$libname${shared_ext} $libname.a' - dynamic_linker='OS/2 ld.exe' - shlibpath_var=LIBPATH - ;; - -osf3* | osf4* | osf5*) - version_type=osf - need_lib_prefix=no - need_version=no - soname_spec='${libname}${release}${shared_ext}$major' - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - shlibpath_var=LD_LIBRARY_PATH - sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib" - sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec" - ;; - -rdos*) - dynamic_linker=no - ;; - -solaris*) - version_type=linux # correct to gnu/linux during the next big refactor - need_lib_prefix=no - need_version=no - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=yes - hardcode_into_libs=yes - # ldd complains unless libraries are executable - postinstall_cmds='chmod +x $lib' - ;; - -sunos4*) - version_type=sunos - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' - finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir' - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=yes - if test "$with_gnu_ld" = yes; then - need_lib_prefix=no - fi - need_version=yes - ;; - -sysv4 | sysv4.3*) - version_type=linux # correct to gnu/linux during the next big refactor - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - shlibpath_var=LD_LIBRARY_PATH - case $host_vendor in - sni) - shlibpath_overrides_runpath=no - need_lib_prefix=no - runpath_var=LD_RUN_PATH - ;; - siemens) - need_lib_prefix=no - ;; - motorola) - need_lib_prefix=no - need_version=no - shlibpath_overrides_runpath=no - sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib' - ;; - esac - ;; - -sysv4*MP*) - if test -d /usr/nec ;then - version_type=linux # correct to gnu/linux during the next big refactor - library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}' - soname_spec='$libname${shared_ext}.$major' - shlibpath_var=LD_LIBRARY_PATH - fi - ;; - -sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) - version_type=freebsd-elf - need_lib_prefix=no - need_version=no - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=yes - hardcode_into_libs=yes - if test "$with_gnu_ld" = yes; then - sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib' - else - sys_lib_search_path_spec='/usr/ccs/lib /usr/lib' - case $host_os in - sco3.2v5*) - sys_lib_search_path_spec="$sys_lib_search_path_spec /lib" - ;; - esac - fi - sys_lib_dlsearch_path_spec='/usr/lib' - ;; - -tpf*) - # TPF is a cross-target only. Preferred cross-host = GNU/Linux. - version_type=linux # correct to gnu/linux during the next big refactor - need_lib_prefix=no - need_version=no - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=no - hardcode_into_libs=yes - ;; - -uts4*) - version_type=linux # correct to gnu/linux during the next big refactor - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - shlibpath_var=LD_LIBRARY_PATH - ;; - -*) - dynamic_linker=no - ;; -esac -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $dynamic_linker" >&5 -$as_echo "$dynamic_linker" >&6; } -test "$dynamic_linker" = no && can_build_shared=no - -variables_saved_for_relink="PATH $shlibpath_var $runpath_var" -if test "$GCC" = yes; then - variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" -fi - -if test "${lt_cv_sys_lib_search_path_spec+set}" = set; then - sys_lib_search_path_spec="$lt_cv_sys_lib_search_path_spec" -fi -if test "${lt_cv_sys_lib_dlsearch_path_spec+set}" = set; then - sys_lib_dlsearch_path_spec="$lt_cv_sys_lib_dlsearch_path_spec" -fi - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to hardcode library paths into programs" >&5 -$as_echo_n "checking how to hardcode library paths into programs... " >&6; } -hardcode_action= -if test -n "$hardcode_libdir_flag_spec" || - test -n "$runpath_var" || - test "X$hardcode_automatic" = "Xyes" ; then - - # We can hardcode non-existent directories. - if test "$hardcode_direct" != no && - # If the only mechanism to avoid hardcoding is shlibpath_var, we - # have to relink, otherwise we might link with an installed library - # when we should be linking with a yet-to-be-installed one - ## test "$_LT_TAGVAR(hardcode_shlibpath_var, )" != no && - test "$hardcode_minus_L" != no; then - # Linking always hardcodes the temporary library directory. - hardcode_action=relink - else - # We can link without hardcoding, and we can hardcode nonexisting dirs. - hardcode_action=immediate - fi -else - # We cannot hardcode anything, or else we can only hardcode existing - # directories. - hardcode_action=unsupported -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $hardcode_action" >&5 -$as_echo "$hardcode_action" >&6; } - -if test "$hardcode_action" = relink || - test "$inherit_rpath" = yes; then - # Fast installation is not supported - enable_fast_install=no -elif test "$shlibpath_overrides_runpath" = yes || - test "$enable_shared" = no; then - # Fast installation is not necessary - enable_fast_install=needless -fi - - - - - - - if test "x$enable_dlopen" != xyes; then - enable_dlopen=unknown - enable_dlopen_self=unknown - enable_dlopen_self_static=unknown -else - lt_cv_dlopen=no - lt_cv_dlopen_libs= - - case $host_os in - beos*) - lt_cv_dlopen="load_add_on" - lt_cv_dlopen_libs= - lt_cv_dlopen_self=yes - ;; - - mingw* | pw32* | cegcc*) - lt_cv_dlopen="LoadLibrary" - lt_cv_dlopen_libs= - ;; - - cygwin*) - lt_cv_dlopen="dlopen" - lt_cv_dlopen_libs= - ;; - - darwin*) - # if libdl is installed we need to link against it - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5 -$as_echo_n "checking for dlopen in -ldl... " >&6; } -if ${ac_cv_lib_dl_dlopen+:} false; then : - $as_echo_n "(cached) " >&6 -else - ac_check_lib_save_LIBS=$LIBS -LIBS="-ldl $LIBS" -cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -/* Override any GCC internal prototype to avoid an error. - Use char because int might match the return type of a GCC - builtin and then its argument prototype would still apply. */ -#ifdef __cplusplus -extern "C" -#endif -char dlopen (); -int -main () -{ -return dlopen (); - ; - return 0; -} -_ACEOF -if ac_fn_c_try_link "$LINENO"; then : - ac_cv_lib_dl_dlopen=yes -else - ac_cv_lib_dl_dlopen=no -fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext -LIBS=$ac_check_lib_save_LIBS -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5 -$as_echo "$ac_cv_lib_dl_dlopen" >&6; } -if test "x$ac_cv_lib_dl_dlopen" = xyes; then : - lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl" -else - - lt_cv_dlopen="dyld" - lt_cv_dlopen_libs= - lt_cv_dlopen_self=yes - -fi - - ;; - - *) - ac_fn_c_check_func "$LINENO" "shl_load" "ac_cv_func_shl_load" -if test "x$ac_cv_func_shl_load" = xyes; then : - lt_cv_dlopen="shl_load" -else - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for shl_load in -ldld" >&5 -$as_echo_n "checking for shl_load in -ldld... " >&6; } -if ${ac_cv_lib_dld_shl_load+:} false; then : - $as_echo_n "(cached) " >&6 -else - ac_check_lib_save_LIBS=$LIBS -LIBS="-ldld $LIBS" -cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -/* Override any GCC internal prototype to avoid an error. - Use char because int might match the return type of a GCC - builtin and then its argument prototype would still apply. */ -#ifdef __cplusplus -extern "C" -#endif -char shl_load (); -int -main () -{ -return shl_load (); - ; - return 0; -} -_ACEOF -if ac_fn_c_try_link "$LINENO"; then : - ac_cv_lib_dld_shl_load=yes -else - ac_cv_lib_dld_shl_load=no -fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext -LIBS=$ac_check_lib_save_LIBS -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dld_shl_load" >&5 -$as_echo "$ac_cv_lib_dld_shl_load" >&6; } -if test "x$ac_cv_lib_dld_shl_load" = xyes; then : - lt_cv_dlopen="shl_load" lt_cv_dlopen_libs="-ldld" -else - ac_fn_c_check_func "$LINENO" "dlopen" "ac_cv_func_dlopen" -if test "x$ac_cv_func_dlopen" = xyes; then : - lt_cv_dlopen="dlopen" -else - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5 -$as_echo_n "checking for dlopen in -ldl... " >&6; } -if ${ac_cv_lib_dl_dlopen+:} false; then : - $as_echo_n "(cached) " >&6 -else - ac_check_lib_save_LIBS=$LIBS -LIBS="-ldl $LIBS" -cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -/* Override any GCC internal prototype to avoid an error. - Use char because int might match the return type of a GCC - builtin and then its argument prototype would still apply. */ -#ifdef __cplusplus -extern "C" -#endif -char dlopen (); -int -main () -{ -return dlopen (); - ; - return 0; -} -_ACEOF -if ac_fn_c_try_link "$LINENO"; then : - ac_cv_lib_dl_dlopen=yes -else - ac_cv_lib_dl_dlopen=no -fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext -LIBS=$ac_check_lib_save_LIBS -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5 -$as_echo "$ac_cv_lib_dl_dlopen" >&6; } -if test "x$ac_cv_lib_dl_dlopen" = xyes; then : - lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl" -else - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -lsvld" >&5 -$as_echo_n "checking for dlopen in -lsvld... " >&6; } -if ${ac_cv_lib_svld_dlopen+:} false; then : - $as_echo_n "(cached) " >&6 -else - ac_check_lib_save_LIBS=$LIBS -LIBS="-lsvld $LIBS" -cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -/* Override any GCC internal prototype to avoid an error. - Use char because int might match the return type of a GCC - builtin and then its argument prototype would still apply. */ -#ifdef __cplusplus -extern "C" -#endif -char dlopen (); -int -main () -{ -return dlopen (); - ; - return 0; -} -_ACEOF -if ac_fn_c_try_link "$LINENO"; then : - ac_cv_lib_svld_dlopen=yes -else - ac_cv_lib_svld_dlopen=no -fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext -LIBS=$ac_check_lib_save_LIBS -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_svld_dlopen" >&5 -$as_echo "$ac_cv_lib_svld_dlopen" >&6; } -if test "x$ac_cv_lib_svld_dlopen" = xyes; then : - lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-lsvld" -else - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dld_link in -ldld" >&5 -$as_echo_n "checking for dld_link in -ldld... " >&6; } -if ${ac_cv_lib_dld_dld_link+:} false; then : - $as_echo_n "(cached) " >&6 -else - ac_check_lib_save_LIBS=$LIBS -LIBS="-ldld $LIBS" -cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -/* Override any GCC internal prototype to avoid an error. - Use char because int might match the return type of a GCC - builtin and then its argument prototype would still apply. */ -#ifdef __cplusplus -extern "C" -#endif -char dld_link (); -int -main () -{ -return dld_link (); - ; - return 0; -} -_ACEOF -if ac_fn_c_try_link "$LINENO"; then : - ac_cv_lib_dld_dld_link=yes -else - ac_cv_lib_dld_dld_link=no -fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext -LIBS=$ac_check_lib_save_LIBS -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dld_dld_link" >&5 -$as_echo "$ac_cv_lib_dld_dld_link" >&6; } -if test "x$ac_cv_lib_dld_dld_link" = xyes; then : - lt_cv_dlopen="dld_link" lt_cv_dlopen_libs="-ldld" -fi - - -fi - - -fi - - -fi - - -fi - - -fi - - ;; - esac - - if test "x$lt_cv_dlopen" != xno; then - enable_dlopen=yes - else - enable_dlopen=no - fi - - case $lt_cv_dlopen in - dlopen) - save_CPPFLAGS="$CPPFLAGS" - test "x$ac_cv_header_dlfcn_h" = xyes && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H" - - save_LDFLAGS="$LDFLAGS" - wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\" - - save_LIBS="$LIBS" - LIBS="$lt_cv_dlopen_libs $LIBS" - - { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether a program can dlopen itself" >&5 -$as_echo_n "checking whether a program can dlopen itself... " >&6; } -if ${lt_cv_dlopen_self+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test "$cross_compiling" = yes; then : - lt_cv_dlopen_self=cross -else - lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 - lt_status=$lt_dlunknown - cat > conftest.$ac_ext <<_LT_EOF -#line $LINENO "configure" -#include "confdefs.h" - -#if HAVE_DLFCN_H -#include -#endif - -#include - -#ifdef RTLD_GLOBAL -# define LT_DLGLOBAL RTLD_GLOBAL -#else -# ifdef DL_GLOBAL -# define LT_DLGLOBAL DL_GLOBAL -# else -# define LT_DLGLOBAL 0 -# endif -#endif - -/* We may have to define LT_DLLAZY_OR_NOW in the command line if we - find out it does not work in some platform. */ -#ifndef LT_DLLAZY_OR_NOW -# ifdef RTLD_LAZY -# define LT_DLLAZY_OR_NOW RTLD_LAZY -# else -# ifdef DL_LAZY -# define LT_DLLAZY_OR_NOW DL_LAZY -# else -# ifdef RTLD_NOW -# define LT_DLLAZY_OR_NOW RTLD_NOW -# else -# ifdef DL_NOW -# define LT_DLLAZY_OR_NOW DL_NOW -# else -# define LT_DLLAZY_OR_NOW 0 -# endif -# endif -# endif -# endif -#endif - -/* When -fvisbility=hidden is used, assume the code has been annotated - correspondingly for the symbols needed. */ -#if defined(__GNUC__) && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3)) -int fnord () __attribute__((visibility("default"))); -#endif - -int fnord () { return 42; } -int main () -{ - void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); - int status = $lt_dlunknown; - - if (self) - { - if (dlsym (self,"fnord")) status = $lt_dlno_uscore; - else - { - if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; - else puts (dlerror ()); - } - /* dlclose (self); */ - } - else - puts (dlerror ()); - - return status; -} -_LT_EOF - if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5 - (eval $ac_link) 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } && test -s conftest${ac_exeext} 2>/dev/null; then - (./conftest; exit; ) >&5 2>/dev/null - lt_status=$? - case x$lt_status in - x$lt_dlno_uscore) lt_cv_dlopen_self=yes ;; - x$lt_dlneed_uscore) lt_cv_dlopen_self=yes ;; - x$lt_dlunknown|x*) lt_cv_dlopen_self=no ;; - esac - else : - # compilation failed - lt_cv_dlopen_self=no - fi -fi -rm -fr conftest* - - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_dlopen_self" >&5 -$as_echo "$lt_cv_dlopen_self" >&6; } - - if test "x$lt_cv_dlopen_self" = xyes; then - wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $lt_prog_compiler_static\" - { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether a statically linked program can dlopen itself" >&5 -$as_echo_n "checking whether a statically linked program can dlopen itself... " >&6; } -if ${lt_cv_dlopen_self_static+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test "$cross_compiling" = yes; then : - lt_cv_dlopen_self_static=cross -else - lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 - lt_status=$lt_dlunknown - cat > conftest.$ac_ext <<_LT_EOF -#line $LINENO "configure" -#include "confdefs.h" - -#if HAVE_DLFCN_H -#include -#endif - -#include - -#ifdef RTLD_GLOBAL -# define LT_DLGLOBAL RTLD_GLOBAL -#else -# ifdef DL_GLOBAL -# define LT_DLGLOBAL DL_GLOBAL -# else -# define LT_DLGLOBAL 0 -# endif -#endif - -/* We may have to define LT_DLLAZY_OR_NOW in the command line if we - find out it does not work in some platform. */ -#ifndef LT_DLLAZY_OR_NOW -# ifdef RTLD_LAZY -# define LT_DLLAZY_OR_NOW RTLD_LAZY -# else -# ifdef DL_LAZY -# define LT_DLLAZY_OR_NOW DL_LAZY -# else -# ifdef RTLD_NOW -# define LT_DLLAZY_OR_NOW RTLD_NOW -# else -# ifdef DL_NOW -# define LT_DLLAZY_OR_NOW DL_NOW -# else -# define LT_DLLAZY_OR_NOW 0 -# endif -# endif -# endif -# endif -#endif - -/* When -fvisbility=hidden is used, assume the code has been annotated - correspondingly for the symbols needed. */ -#if defined(__GNUC__) && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3)) -int fnord () __attribute__((visibility("default"))); -#endif - -int fnord () { return 42; } -int main () -{ - void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); - int status = $lt_dlunknown; - - if (self) - { - if (dlsym (self,"fnord")) status = $lt_dlno_uscore; - else - { - if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; - else puts (dlerror ()); - } - /* dlclose (self); */ - } - else - puts (dlerror ()); - - return status; -} -_LT_EOF - if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5 - (eval $ac_link) 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } && test -s conftest${ac_exeext} 2>/dev/null; then - (./conftest; exit; ) >&5 2>/dev/null - lt_status=$? - case x$lt_status in - x$lt_dlno_uscore) lt_cv_dlopen_self_static=yes ;; - x$lt_dlneed_uscore) lt_cv_dlopen_self_static=yes ;; - x$lt_dlunknown|x*) lt_cv_dlopen_self_static=no ;; - esac - else : - # compilation failed - lt_cv_dlopen_self_static=no - fi -fi -rm -fr conftest* - - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_dlopen_self_static" >&5 -$as_echo "$lt_cv_dlopen_self_static" >&6; } - fi - - CPPFLAGS="$save_CPPFLAGS" - LDFLAGS="$save_LDFLAGS" - LIBS="$save_LIBS" - ;; - esac - - case $lt_cv_dlopen_self in - yes|no) enable_dlopen_self=$lt_cv_dlopen_self ;; - *) enable_dlopen_self=unknown ;; - esac - - case $lt_cv_dlopen_self_static in - yes|no) enable_dlopen_self_static=$lt_cv_dlopen_self_static ;; - *) enable_dlopen_self_static=unknown ;; - esac -fi - - - - - - - - - - - - - - - - - -striplib= -old_striplib= -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether stripping libraries is possible" >&5 -$as_echo_n "checking whether stripping libraries is possible... " >&6; } -if test -n "$STRIP" && $STRIP -V 2>&1 | $GREP "GNU strip" >/dev/null; then - test -z "$old_striplib" && old_striplib="$STRIP --strip-debug" - test -z "$striplib" && striplib="$STRIP --strip-unneeded" - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; } -else -# FIXME - insert some real tests, host_os isn't really good enough - case $host_os in - darwin*) - if test -n "$STRIP" ; then - striplib="$STRIP -x" - old_striplib="$STRIP -S" - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; } - else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } - fi - ;; - *) - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } - ;; - esac -fi - - - - - - - - - - - - - # Report which library types will actually be built - { $as_echo "$as_me:${as_lineno-$LINENO}: checking if libtool supports shared libraries" >&5 -$as_echo_n "checking if libtool supports shared libraries... " >&6; } - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $can_build_shared" >&5 -$as_echo "$can_build_shared" >&6; } - - { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build shared libraries" >&5 -$as_echo_n "checking whether to build shared libraries... " >&6; } - test "$can_build_shared" = "no" && enable_shared=no - - # On AIX, shared libraries and static libraries use the same namespace, and - # are all built from PIC. - case $host_os in - aix3*) - test "$enable_shared" = yes && enable_static=no - if test -n "$RANLIB"; then - archive_cmds="$archive_cmds~\$RANLIB \$lib" - postinstall_cmds='$RANLIB $lib' - fi - ;; - - aix[4-9]*) - if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then - test "$enable_shared" = yes && enable_static=no - fi - ;; - esac - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_shared" >&5 -$as_echo "$enable_shared" >&6; } - - { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build static libraries" >&5 -$as_echo_n "checking whether to build static libraries... " >&6; } - # Make sure either enable_shared or enable_static is yes. - test "$enable_shared" = yes || enable_static=yes - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_static" >&5 -$as_echo "$enable_static" >&6; } - - - - -fi -ac_ext=c -ac_cpp='$CPP $CPPFLAGS' -ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_c_compiler_gnu - -CC="$lt_save_CC" - - if test -n "$CXX" && ( test "X$CXX" != "Xno" && - ( (test "X$CXX" = "Xg++" && `g++ -v >/dev/null 2>&1` ) || - (test "X$CXX" != "Xg++"))) ; then - ac_ext=cpp -ac_cpp='$CXXCPP $CPPFLAGS' -ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_cxx_compiler_gnu -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C++ preprocessor" >&5 -$as_echo_n "checking how to run the C++ preprocessor... " >&6; } -if test -z "$CXXCPP"; then - if ${ac_cv_prog_CXXCPP+:} false; then : - $as_echo_n "(cached) " >&6 -else - # Double quotes because CXXCPP needs to be expanded - for CXXCPP in "$CXX -E" "/lib/cpp" - do - ac_preproc_ok=false -for ac_cxx_preproc_warn_flag in '' yes -do - # Use a header file that comes with gcc, so configuring glibc - # with a fresh cross-compiler works. - # Prefer to if __STDC__ is defined, since - # exists even on freestanding compilers. - # On the NeXT, cc -E runs the code through the compiler's parser, - # not just through cpp. "Syntax error" is here to catch this case. - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#ifdef __STDC__ -# include -#else -# include -#endif - Syntax error -_ACEOF -if ac_fn_cxx_try_cpp "$LINENO"; then : - -else - # Broken: fails on valid input. -continue -fi -rm -f conftest.err conftest.i conftest.$ac_ext - - # OK, works on sane cases. Now check whether nonexistent headers - # can be detected and how. - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include -_ACEOF -if ac_fn_cxx_try_cpp "$LINENO"; then : - # Broken: success on invalid input. -continue -else - # Passes both tests. -ac_preproc_ok=: -break -fi -rm -f conftest.err conftest.i conftest.$ac_ext - -done -# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. -rm -f conftest.i conftest.err conftest.$ac_ext -if $ac_preproc_ok; then : - break -fi - - done - ac_cv_prog_CXXCPP=$CXXCPP - -fi - CXXCPP=$ac_cv_prog_CXXCPP -else - ac_cv_prog_CXXCPP=$CXXCPP -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $CXXCPP" >&5 -$as_echo "$CXXCPP" >&6; } -ac_preproc_ok=false -for ac_cxx_preproc_warn_flag in '' yes -do - # Use a header file that comes with gcc, so configuring glibc - # with a fresh cross-compiler works. - # Prefer to if __STDC__ is defined, since - # exists even on freestanding compilers. - # On the NeXT, cc -E runs the code through the compiler's parser, - # not just through cpp. "Syntax error" is here to catch this case. - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#ifdef __STDC__ -# include -#else -# include -#endif - Syntax error -_ACEOF -if ac_fn_cxx_try_cpp "$LINENO"; then : - -else - # Broken: fails on valid input. -continue -fi -rm -f conftest.err conftest.i conftest.$ac_ext - - # OK, works on sane cases. Now check whether nonexistent headers - # can be detected and how. - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include -_ACEOF -if ac_fn_cxx_try_cpp "$LINENO"; then : - # Broken: success on invalid input. -continue -else - # Passes both tests. -ac_preproc_ok=: -break -fi -rm -f conftest.err conftest.i conftest.$ac_ext - -done -# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. -rm -f conftest.i conftest.err conftest.$ac_ext -if $ac_preproc_ok; then : - -else - { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 -$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} -as_fn_error $? "C++ preprocessor \"$CXXCPP\" fails sanity check -See \`config.log' for more details" "$LINENO" 5; } -fi - -ac_ext=c -ac_cpp='$CPP $CPPFLAGS' -ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_c_compiler_gnu - -else - _lt_caught_CXX_error=yes -fi - -ac_ext=cpp -ac_cpp='$CXXCPP $CPPFLAGS' -ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_cxx_compiler_gnu - -archive_cmds_need_lc_CXX=no -allow_undefined_flag_CXX= -always_export_symbols_CXX=no -archive_expsym_cmds_CXX= -compiler_needs_object_CXX=no -export_dynamic_flag_spec_CXX= -hardcode_direct_CXX=no -hardcode_direct_absolute_CXX=no -hardcode_libdir_flag_spec_CXX= -hardcode_libdir_separator_CXX= -hardcode_minus_L_CXX=no -hardcode_shlibpath_var_CXX=unsupported -hardcode_automatic_CXX=no -inherit_rpath_CXX=no -module_cmds_CXX= -module_expsym_cmds_CXX= -link_all_deplibs_CXX=unknown -old_archive_cmds_CXX=$old_archive_cmds -reload_flag_CXX=$reload_flag -reload_cmds_CXX=$reload_cmds -no_undefined_flag_CXX= -whole_archive_flag_spec_CXX= -enable_shared_with_static_runtimes_CXX=no - -# Source file extension for C++ test sources. -ac_ext=cpp - -# Object file extension for compiled C++ test sources. -objext=o -objext_CXX=$objext - -# No sense in running all these tests if we already determined that -# the CXX compiler isn't working. Some variables (like enable_shared) -# are currently assumed to apply to all compilers on this platform, -# and will be corrupted by setting them based on a non-working compiler. -if test "$_lt_caught_CXX_error" != yes; then - # Code to be used in simple compile tests - lt_simple_compile_test_code="int some_variable = 0;" - - # Code to be used in simple link tests - lt_simple_link_test_code='int main(int, char *[]) { return(0); }' - - # ltmain only uses $CC for tagged configurations so make sure $CC is set. - - - - - - -# If no C compiler was specified, use CC. -LTCC=${LTCC-"$CC"} - -# If no C compiler flags were specified, use CFLAGS. -LTCFLAGS=${LTCFLAGS-"$CFLAGS"} - -# Allow CC to be a program name with arguments. -compiler=$CC - - - # save warnings/boilerplate of simple test code - ac_outfile=conftest.$ac_objext -echo "$lt_simple_compile_test_code" >conftest.$ac_ext -eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err -_lt_compiler_boilerplate=`cat conftest.err` -$RM conftest* - - ac_outfile=conftest.$ac_objext -echo "$lt_simple_link_test_code" >conftest.$ac_ext -eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err -_lt_linker_boilerplate=`cat conftest.err` -$RM -r conftest* - - - # Allow CC to be a program name with arguments. - lt_save_CC=$CC - lt_save_CFLAGS=$CFLAGS - lt_save_LD=$LD - lt_save_GCC=$GCC - GCC=$GXX - lt_save_with_gnu_ld=$with_gnu_ld - lt_save_path_LD=$lt_cv_path_LD - if test -n "${lt_cv_prog_gnu_ldcxx+set}"; then - lt_cv_prog_gnu_ld=$lt_cv_prog_gnu_ldcxx - else - $as_unset lt_cv_prog_gnu_ld - fi - if test -n "${lt_cv_path_LDCXX+set}"; then - lt_cv_path_LD=$lt_cv_path_LDCXX - else - $as_unset lt_cv_path_LD - fi - test -z "${LDCXX+set}" || LD=$LDCXX - CC=${CXX-"c++"} - CFLAGS=$CXXFLAGS - compiler=$CC - compiler_CXX=$CC - for cc_temp in $compiler""; do - case $cc_temp in - compile | *[\\/]compile | ccache | *[\\/]ccache ) ;; - distcc | *[\\/]distcc | purify | *[\\/]purify ) ;; - \-*) ;; - *) break;; - esac -done -cc_basename=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"` - - - if test -n "$compiler"; then - # We don't want -fno-exception when compiling C++ code, so set the - # no_builtin_flag separately - if test "$GXX" = yes; then - lt_prog_compiler_no_builtin_flag_CXX=' -fno-builtin' - else - lt_prog_compiler_no_builtin_flag_CXX= - fi - - if test "$GXX" = yes; then - # Set up default GNU C++ configuration - - - -# Check whether --with-gnu-ld was given. -if test "${with_gnu_ld+set}" = set; then : - withval=$with_gnu_ld; test "$withval" = no || with_gnu_ld=yes -else - with_gnu_ld=no -fi - -ac_prog=ld -if test "$GCC" = yes; then - # Check if gcc -print-prog-name=ld gives a path. - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ld used by $CC" >&5 -$as_echo_n "checking for ld used by $CC... " >&6; } - case $host in - *-*-mingw*) - # gcc leaves a trailing carriage return which upsets mingw - ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;; - *) - ac_prog=`($CC -print-prog-name=ld) 2>&5` ;; - esac - case $ac_prog in - # Accept absolute paths. - [\\/]* | ?:[\\/]*) - re_direlt='/[^/][^/]*/\.\./' - # Canonicalize the pathname of ld - ac_prog=`$ECHO "$ac_prog"| $SED 's%\\\\%/%g'` - while $ECHO "$ac_prog" | $GREP "$re_direlt" > /dev/null 2>&1; do - ac_prog=`$ECHO $ac_prog| $SED "s%$re_direlt%/%"` - done - test -z "$LD" && LD="$ac_prog" - ;; - "") - # If it fails, then pretend we aren't using GCC. - ac_prog=ld - ;; - *) - # If it is relative, then search for the first ld in PATH. - with_gnu_ld=unknown - ;; - esac -elif test "$with_gnu_ld" = yes; then - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU ld" >&5 -$as_echo_n "checking for GNU ld... " >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for non-GNU ld" >&5 -$as_echo_n "checking for non-GNU ld... " >&6; } -fi -if ${lt_cv_path_LD+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -z "$LD"; then - lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR - for ac_dir in $PATH; do - IFS="$lt_save_ifs" - test -z "$ac_dir" && ac_dir=. - if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then - lt_cv_path_LD="$ac_dir/$ac_prog" - # Check to see if the program is GNU ld. I'd rather use --version, - # but apparently some variants of GNU ld only accept -v. - # Break only if it was the GNU/non-GNU ld that we prefer. - case `"$lt_cv_path_LD" -v 2>&1 &5 -$as_echo "$LD" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi -test -z "$LD" && as_fn_error $? "no acceptable ld found in \$PATH" "$LINENO" 5 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if the linker ($LD) is GNU ld" >&5 -$as_echo_n "checking if the linker ($LD) is GNU ld... " >&6; } -if ${lt_cv_prog_gnu_ld+:} false; then : - $as_echo_n "(cached) " >&6 -else - # I'd rather use --version here, but apparently some GNU lds only accept -v. -case `$LD -v 2>&1 &5 -$as_echo "$lt_cv_prog_gnu_ld" >&6; } -with_gnu_ld=$lt_cv_prog_gnu_ld - - - - - - - - # Check if GNU C++ uses GNU ld as the underlying linker, since the - # archiving commands below assume that GNU ld is being used. - if test "$with_gnu_ld" = yes; then - archive_cmds_CXX='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' - archive_expsym_cmds_CXX='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' - - hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir' - export_dynamic_flag_spec_CXX='${wl}--export-dynamic' - - # If archive_cmds runs LD, not CC, wlarc should be empty - # XXX I think wlarc can be eliminated in ltcf-cxx, but I need to - # investigate it a little bit more. (MM) - wlarc='${wl}' - - # ancient GNU ld didn't support --whole-archive et. al. - if eval "`$CC -print-prog-name=ld` --help 2>&1" | - $GREP 'no-whole-archive' > /dev/null; then - whole_archive_flag_spec_CXX="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' - else - whole_archive_flag_spec_CXX= - fi - else - with_gnu_ld=no - wlarc= - - # A generic and very simple default shared library creation - # command for GNU C++ for the case where it uses the native - # linker, instead of GNU ld. If possible, this setting should - # overridden to take advantage of the native linker features on - # the platform it is being used on. - archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib' - fi - - # Commands to make compiler produce verbose output that lists - # what "hidden" libraries, object files and flags are used when - # linking a shared library. - output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' - - else - GXX=no - with_gnu_ld=no - wlarc= - fi - - # PORTME: fill in a description of your system's C++ link characteristics - { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $compiler linker ($LD) supports shared libraries" >&5 -$as_echo_n "checking whether the $compiler linker ($LD) supports shared libraries... " >&6; } - ld_shlibs_CXX=yes - case $host_os in - aix3*) - # FIXME: insert proper C++ library support - ld_shlibs_CXX=no - ;; - aix[4-9]*) - if test "$host_cpu" = ia64; then - # On IA64, the linker does run time linking by default, so we don't - # have to do anything special. - aix_use_runtimelinking=no - exp_sym_flag='-Bexport' - no_entry_flag="" - else - aix_use_runtimelinking=no - - # Test if we are trying to use run time linking or normal - # AIX style linking. If -brtl is somewhere in LDFLAGS, we - # need to do runtime linking. - case $host_os in aix4.[23]|aix4.[23].*|aix[5-9]*) - for ld_flag in $LDFLAGS; do - case $ld_flag in - *-brtl*) - aix_use_runtimelinking=yes - break - ;; - esac - done - ;; - esac - - exp_sym_flag='-bexport' - no_entry_flag='-bnoentry' - fi - - # When large executables or shared objects are built, AIX ld can - # have problems creating the table of contents. If linking a library - # or program results in "error TOC overflow" add -mminimal-toc to - # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not - # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. - - archive_cmds_CXX='' - hardcode_direct_CXX=yes - hardcode_direct_absolute_CXX=yes - hardcode_libdir_separator_CXX=':' - link_all_deplibs_CXX=yes - file_list_spec_CXX='${wl}-f,' - - if test "$GXX" = yes; then - case $host_os in aix4.[012]|aix4.[012].*) - # We only want to do this on AIX 4.2 and lower, the check - # below for broken collect2 doesn't work under 4.3+ - collect2name=`${CC} -print-prog-name=collect2` - if test -f "$collect2name" && - strings "$collect2name" | $GREP resolve_lib_name >/dev/null - then - # We have reworked collect2 - : - else - # We have old collect2 - hardcode_direct_CXX=unsupported - # It fails to find uninstalled libraries when the uninstalled - # path is not listed in the libpath. Setting hardcode_minus_L - # to unsupported forces relinking - hardcode_minus_L_CXX=yes - hardcode_libdir_flag_spec_CXX='-L$libdir' - hardcode_libdir_separator_CXX= - fi - esac - shared_flag='-shared' - if test "$aix_use_runtimelinking" = yes; then - shared_flag="$shared_flag "'${wl}-G' - fi - else - # not using gcc - if test "$host_cpu" = ia64; then - # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release - # chokes on -Wl,-G. The following line is correct: - shared_flag='-G' - else - if test "$aix_use_runtimelinking" = yes; then - shared_flag='${wl}-G' - else - shared_flag='${wl}-bM:SRE' - fi - fi - fi - - export_dynamic_flag_spec_CXX='${wl}-bexpall' - # It seems that -bexpall does not export symbols beginning with - # underscore (_), so it is better to generate a list of symbols to - # export. - always_export_symbols_CXX=yes - if test "$aix_use_runtimelinking" = yes; then - # Warning - without using the other runtime loading flags (-brtl), - # -berok will link without error, but may produce a broken library. - allow_undefined_flag_CXX='-berok' - # Determine the default libpath from the value encoded in an empty - # executable. - if test "${lt_cv_aix_libpath+set}" = set; then - aix_libpath=$lt_cv_aix_libpath -else - if ${lt_cv_aix_libpath__CXX+:} false; then : - $as_echo_n "(cached) " >&6 -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -int -main () -{ - - ; - return 0; -} -_ACEOF -if ac_fn_cxx_try_link "$LINENO"; then : - - lt_aix_libpath_sed=' - /Import File Strings/,/^$/ { - /^0/ { - s/^0 *\([^ ]*\) *$/\1/ - p - } - }' - lt_cv_aix_libpath__CXX=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` - # Check for a 64-bit object if we didn't find anything. - if test -z "$lt_cv_aix_libpath__CXX"; then - lt_cv_aix_libpath__CXX=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` - fi -fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext - if test -z "$lt_cv_aix_libpath__CXX"; then - lt_cv_aix_libpath__CXX="/usr/lib:/lib" - fi - -fi - - aix_libpath=$lt_cv_aix_libpath__CXX -fi - - hardcode_libdir_flag_spec_CXX='${wl}-blibpath:$libdir:'"$aix_libpath" - - archive_expsym_cmds_CXX='$CC -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then func_echo_all "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag" - else - if test "$host_cpu" = ia64; then - hardcode_libdir_flag_spec_CXX='${wl}-R $libdir:/usr/lib:/lib' - allow_undefined_flag_CXX="-z nodefs" - archive_expsym_cmds_CXX="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols" - else - # Determine the default libpath from the value encoded in an - # empty executable. - if test "${lt_cv_aix_libpath+set}" = set; then - aix_libpath=$lt_cv_aix_libpath -else - if ${lt_cv_aix_libpath__CXX+:} false; then : - $as_echo_n "(cached) " >&6 -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -int -main () -{ - - ; - return 0; -} -_ACEOF -if ac_fn_cxx_try_link "$LINENO"; then : - - lt_aix_libpath_sed=' - /Import File Strings/,/^$/ { - /^0/ { - s/^0 *\([^ ]*\) *$/\1/ - p - } - }' - lt_cv_aix_libpath__CXX=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` - # Check for a 64-bit object if we didn't find anything. - if test -z "$lt_cv_aix_libpath__CXX"; then - lt_cv_aix_libpath__CXX=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` - fi -fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext - if test -z "$lt_cv_aix_libpath__CXX"; then - lt_cv_aix_libpath__CXX="/usr/lib:/lib" - fi - -fi - - aix_libpath=$lt_cv_aix_libpath__CXX -fi - - hardcode_libdir_flag_spec_CXX='${wl}-blibpath:$libdir:'"$aix_libpath" - # Warning - without using the other run time loading flags, - # -berok will link without error, but may produce a broken library. - no_undefined_flag_CXX=' ${wl}-bernotok' - allow_undefined_flag_CXX=' ${wl}-berok' - if test "$with_gnu_ld" = yes; then - # We only use this code for GNU lds that support --whole-archive. - whole_archive_flag_spec_CXX='${wl}--whole-archive$convenience ${wl}--no-whole-archive' - else - # Exported symbols can be pulled into shared objects from archives - whole_archive_flag_spec_CXX='$convenience' - fi - archive_cmds_need_lc_CXX=yes - # This is similar to how AIX traditionally builds its shared - # libraries. - archive_expsym_cmds_CXX="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' - fi - fi - ;; - - beos*) - if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then - allow_undefined_flag_CXX=unsupported - # Joseph Beckenbach says some releases of gcc - # support --undefined. This deserves some investigation. FIXME - archive_cmds_CXX='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' - else - ld_shlibs_CXX=no - fi - ;; - - chorus*) - case $cc_basename in - *) - # FIXME: insert proper C++ library support - ld_shlibs_CXX=no - ;; - esac - ;; - - cygwin* | mingw* | pw32* | cegcc*) - case $GXX,$cc_basename in - ,cl* | no,cl*) - # Native MSVC - # hardcode_libdir_flag_spec is actually meaningless, as there is - # no search path for DLLs. - hardcode_libdir_flag_spec_CXX=' ' - allow_undefined_flag_CXX=unsupported - always_export_symbols_CXX=yes - file_list_spec_CXX='@' - # Tell ltmain to make .lib files, not .a files. - libext=lib - # Tell ltmain to make .dll files, not .so files. - shrext_cmds=".dll" - # FIXME: Setting linknames here is a bad hack. - archive_cmds_CXX='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-dll~linknames=' - archive_expsym_cmds_CXX='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then - $SED -n -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' -e '1\\\!p' < $export_symbols > $output_objdir/$soname.exp; - else - $SED -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' < $export_symbols > $output_objdir/$soname.exp; - fi~ - $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~ - linknames=' - # The linker will not automatically build a static lib if we build a DLL. - # _LT_TAGVAR(old_archive_from_new_cmds, CXX)='true' - enable_shared_with_static_runtimes_CXX=yes - # Don't use ranlib - old_postinstall_cmds_CXX='chmod 644 $oldlib' - postlink_cmds_CXX='lt_outputfile="@OUTPUT@"~ - lt_tool_outputfile="@TOOL_OUTPUT@"~ - case $lt_outputfile in - *.exe|*.EXE) ;; - *) - lt_outputfile="$lt_outputfile.exe" - lt_tool_outputfile="$lt_tool_outputfile.exe" - ;; - esac~ - func_to_tool_file "$lt_outputfile"~ - if test "$MANIFEST_TOOL" != ":" && test -f "$lt_outputfile.manifest"; then - $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1; - $RM "$lt_outputfile.manifest"; - fi' - ;; - *) - # g++ - # _LT_TAGVAR(hardcode_libdir_flag_spec, CXX) is actually meaningless, - # as there is no search path for DLLs. - hardcode_libdir_flag_spec_CXX='-L$libdir' - export_dynamic_flag_spec_CXX='${wl}--export-all-symbols' - allow_undefined_flag_CXX=unsupported - always_export_symbols_CXX=no - enable_shared_with_static_runtimes_CXX=yes - - if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then - archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' - # If the export-symbols file already is a .def file (1st line - # is EXPORTS), use it as is; otherwise, prepend... - archive_expsym_cmds_CXX='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then - cp $export_symbols $output_objdir/$soname.def; - else - echo EXPORTS > $output_objdir/$soname.def; - cat $export_symbols >> $output_objdir/$soname.def; - fi~ - $CC -shared -nostdlib $output_objdir/$soname.def $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' - else - ld_shlibs_CXX=no - fi - ;; - esac - ;; - darwin* | rhapsody*) - - - archive_cmds_need_lc_CXX=no - hardcode_direct_CXX=no - hardcode_automatic_CXX=yes - hardcode_shlibpath_var_CXX=unsupported - if test "$lt_cv_ld_force_load" = "yes"; then - whole_archive_flag_spec_CXX='`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience ${wl}-force_load,$conv\"; done; func_echo_all \"$new_convenience\"`' - - else - whole_archive_flag_spec_CXX='' - fi - link_all_deplibs_CXX=yes - allow_undefined_flag_CXX="$_lt_dar_allow_undefined" - case $cc_basename in - ifort*) _lt_dar_can_shared=yes ;; - *) _lt_dar_can_shared=$GCC ;; - esac - if test "$_lt_dar_can_shared" = "yes"; then - output_verbose_link_cmd=func_echo_all - archive_cmds_CXX="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod${_lt_dsymutil}" - module_cmds_CXX="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dsymutil}" - archive_expsym_cmds_CXX="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring ${_lt_dar_single_mod}${_lt_dar_export_syms}${_lt_dsymutil}" - module_expsym_cmds_CXX="sed -e 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dar_export_syms}${_lt_dsymutil}" - if test "$lt_cv_apple_cc_single_mod" != "yes"; then - archive_cmds_CXX="\$CC -r -keep_private_externs -nostdlib -o \${lib}-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \${lib}-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring${_lt_dsymutil}" - archive_expsym_cmds_CXX="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -r -keep_private_externs -nostdlib -o \${lib}-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \${lib}-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring${_lt_dar_export_syms}${_lt_dsymutil}" - fi - - else - ld_shlibs_CXX=no - fi - - ;; - - dgux*) - case $cc_basename in - ec++*) - # FIXME: insert proper C++ library support - ld_shlibs_CXX=no - ;; - ghcx*) - # Green Hills C++ Compiler - # FIXME: insert proper C++ library support - ld_shlibs_CXX=no - ;; - *) - # FIXME: insert proper C++ library support - ld_shlibs_CXX=no - ;; - esac - ;; - - freebsd2.*) - # C++ shared libraries reported to be fairly broken before - # switch to ELF - ld_shlibs_CXX=no - ;; - - freebsd-elf*) - archive_cmds_need_lc_CXX=no - ;; - - freebsd* | dragonfly*) - # FreeBSD 3 and later use GNU C++ and GNU ld with standard ELF - # conventions - ld_shlibs_CXX=yes - ;; - - gnu*) - ;; - - haiku*) - archive_cmds_CXX='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' - link_all_deplibs_CXX=yes - ;; - - hpux9*) - hardcode_libdir_flag_spec_CXX='${wl}+b ${wl}$libdir' - hardcode_libdir_separator_CXX=: - export_dynamic_flag_spec_CXX='${wl}-E' - hardcode_direct_CXX=yes - hardcode_minus_L_CXX=yes # Not in the search PATH, - # but as the default - # location of the library. - - case $cc_basename in - CC*) - # FIXME: insert proper C++ library support - ld_shlibs_CXX=no - ;; - aCC*) - archive_cmds_CXX='$RM $output_objdir/$soname~$CC -b ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' - # Commands to make compiler produce verbose output that lists - # what "hidden" libraries, object files and flags are used when - # linking a shared library. - # - # There doesn't appear to be a way to prevent this compiler from - # explicitly linking system object files so we need to strip them - # from the output so that they don't get included in the library - # dependencies. - output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $EGREP "\-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' - ;; - *) - if test "$GXX" = yes; then - archive_cmds_CXX='$RM $output_objdir/$soname~$CC -shared -nostdlib $pic_flag ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' - else - # FIXME: insert proper C++ library support - ld_shlibs_CXX=no - fi - ;; - esac - ;; - - hpux10*|hpux11*) - if test $with_gnu_ld = no; then - hardcode_libdir_flag_spec_CXX='${wl}+b ${wl}$libdir' - hardcode_libdir_separator_CXX=: - - case $host_cpu in - hppa*64*|ia64*) - ;; - *) - export_dynamic_flag_spec_CXX='${wl}-E' - ;; - esac - fi - case $host_cpu in - hppa*64*|ia64*) - hardcode_direct_CXX=no - hardcode_shlibpath_var_CXX=no - ;; - *) - hardcode_direct_CXX=yes - hardcode_direct_absolute_CXX=yes - hardcode_minus_L_CXX=yes # Not in the search PATH, - # but as the default - # location of the library. - ;; - esac - - case $cc_basename in - CC*) - # FIXME: insert proper C++ library support - ld_shlibs_CXX=no - ;; - aCC*) - case $host_cpu in - hppa*64*) - archive_cmds_CXX='$CC -b ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' - ;; - ia64*) - archive_cmds_CXX='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' - ;; - *) - archive_cmds_CXX='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' - ;; - esac - # Commands to make compiler produce verbose output that lists - # what "hidden" libraries, object files and flags are used when - # linking a shared library. - # - # There doesn't appear to be a way to prevent this compiler from - # explicitly linking system object files so we need to strip them - # from the output so that they don't get included in the library - # dependencies. - output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $GREP "\-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' - ;; - *) - if test "$GXX" = yes; then - if test $with_gnu_ld = no; then - case $host_cpu in - hppa*64*) - archive_cmds_CXX='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' - ;; - ia64*) - archive_cmds_CXX='$CC -shared -nostdlib $pic_flag ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' - ;; - *) - archive_cmds_CXX='$CC -shared -nostdlib $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' - ;; - esac - fi - else - # FIXME: insert proper C++ library support - ld_shlibs_CXX=no - fi - ;; - esac - ;; - - interix[3-9]*) - hardcode_direct_CXX=no - hardcode_shlibpath_var_CXX=no - hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir' - export_dynamic_flag_spec_CXX='${wl}-E' - # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. - # Instead, shared libraries are loaded at an image base (0x10000000 by - # default) and relocated if they conflict, which is a slow very memory - # consuming and fragmenting process. To avoid this, we pick a random, - # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link - # time. Moving up from 0x10000000 also allows more sbrk(2) space. - archive_cmds_CXX='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' - archive_expsym_cmds_CXX='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' - ;; - irix5* | irix6*) - case $cc_basename in - CC*) - # SGI C++ - archive_cmds_CXX='$CC -shared -all -multigot $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' - - # Archives containing C++ object files must be created using - # "CC -ar", where "CC" is the IRIX C++ compiler. This is - # necessary to make sure instantiated templates are included - # in the archive. - old_archive_cmds_CXX='$CC -ar -WR,-u -o $oldlib $oldobjs' - ;; - *) - if test "$GXX" = yes; then - if test "$with_gnu_ld" = no; then - archive_cmds_CXX='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' - else - archive_cmds_CXX='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` -o $lib' - fi - fi - link_all_deplibs_CXX=yes - ;; - esac - hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir' - hardcode_libdir_separator_CXX=: - inherit_rpath_CXX=yes - ;; - - linux* | k*bsd*-gnu | kopensolaris*-gnu) - case $cc_basename in - KCC*) - # Kuck and Associates, Inc. (KAI) C++ Compiler - - # KCC will only create a shared library if the output file - # ends with ".so" (or ".sl" for HP-UX), so rename the library - # to its proper name (with version) after linking. - archive_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' - archive_expsym_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib ${wl}-retain-symbols-file,$export_symbols; mv \$templib $lib' - # Commands to make compiler produce verbose output that lists - # what "hidden" libraries, object files and flags are used when - # linking a shared library. - # - # There doesn't appear to be a way to prevent this compiler from - # explicitly linking system object files so we need to strip them - # from the output so that they don't get included in the library - # dependencies. - output_verbose_link_cmd='templist=`$CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 | $GREP "ld"`; rm -f libconftest$shared_ext; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' - - hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir' - export_dynamic_flag_spec_CXX='${wl}--export-dynamic' - - # Archives containing C++ object files must be created using - # "CC -Bstatic", where "CC" is the KAI C++ compiler. - old_archive_cmds_CXX='$CC -Bstatic -o $oldlib $oldobjs' - ;; - icpc* | ecpc* ) - # Intel C++ - with_gnu_ld=yes - # version 8.0 and above of icpc choke on multiply defined symbols - # if we add $predep_objects and $postdep_objects, however 7.1 and - # earlier do not add the objects themselves. - case `$CC -V 2>&1` in - *"Version 7."*) - archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' - archive_expsym_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' - ;; - *) # Version 8.0 or newer - tmp_idyn= - case $host_cpu in - ia64*) tmp_idyn=' -i_dynamic';; - esac - archive_cmds_CXX='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' - archive_expsym_cmds_CXX='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' - ;; - esac - archive_cmds_need_lc_CXX=no - hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir' - export_dynamic_flag_spec_CXX='${wl}--export-dynamic' - whole_archive_flag_spec_CXX='${wl}--whole-archive$convenience ${wl}--no-whole-archive' - ;; - pgCC* | pgcpp*) - # Portland Group C++ compiler - case `$CC -V` in - *pgCC\ [1-5].* | *pgcpp\ [1-5].*) - prelink_cmds_CXX='tpldir=Template.dir~ - rm -rf $tpldir~ - $CC --prelink_objects --instantiation_dir $tpldir $objs $libobjs $compile_deplibs~ - compile_command="$compile_command `find $tpldir -name \*.o | sort | $NL2SP`"' - old_archive_cmds_CXX='tpldir=Template.dir~ - rm -rf $tpldir~ - $CC --prelink_objects --instantiation_dir $tpldir $oldobjs$old_deplibs~ - $AR $AR_FLAGS $oldlib$oldobjs$old_deplibs `find $tpldir -name \*.o | sort | $NL2SP`~ - $RANLIB $oldlib' - archive_cmds_CXX='tpldir=Template.dir~ - rm -rf $tpldir~ - $CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~ - $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname -o $lib' - archive_expsym_cmds_CXX='tpldir=Template.dir~ - rm -rf $tpldir~ - $CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~ - $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname ${wl}-retain-symbols-file ${wl}$export_symbols -o $lib' - ;; - *) # Version 6 and above use weak symbols - archive_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname -o $lib' - archive_expsym_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname ${wl}-retain-symbols-file ${wl}$export_symbols -o $lib' - ;; - esac - - hardcode_libdir_flag_spec_CXX='${wl}--rpath ${wl}$libdir' - export_dynamic_flag_spec_CXX='${wl}--export-dynamic' - whole_archive_flag_spec_CXX='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' - ;; - cxx*) - # Compaq C++ - archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' - archive_expsym_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib ${wl}-retain-symbols-file $wl$export_symbols' - - runpath_var=LD_RUN_PATH - hardcode_libdir_flag_spec_CXX='-rpath $libdir' - hardcode_libdir_separator_CXX=: - - # Commands to make compiler produce verbose output that lists - # what "hidden" libraries, object files and flags are used when - # linking a shared library. - # - # There doesn't appear to be a way to prevent this compiler from - # explicitly linking system object files so we need to strip them - # from the output so that they don't get included in the library - # dependencies. - output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld"`; templist=`func_echo_all "$templist" | $SED "s/\(^.*ld.*\)\( .*ld .*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "X$list" | $Xsed' - ;; - xl* | mpixl* | bgxl*) - # IBM XL 8.0 on PPC, with GNU ld - hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir' - export_dynamic_flag_spec_CXX='${wl}--export-dynamic' - archive_cmds_CXX='$CC -qmkshrobj $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' - if test "x$supports_anon_versioning" = xyes; then - archive_expsym_cmds_CXX='echo "{ global:" > $output_objdir/$libname.ver~ - cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ - echo "local: *; };" >> $output_objdir/$libname.ver~ - $CC -qmkshrobj $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib' - fi - ;; - *) - case `$CC -V 2>&1 | sed 5q` in - *Sun\ C*) - # Sun C++ 5.9 - no_undefined_flag_CXX=' -zdefs' - archive_cmds_CXX='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' - archive_expsym_cmds_CXX='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file ${wl}$export_symbols' - hardcode_libdir_flag_spec_CXX='-R$libdir' - whole_archive_flag_spec_CXX='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' - compiler_needs_object_CXX=yes - - # Not sure whether something based on - # $CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 - # would be better. - output_verbose_link_cmd='func_echo_all' - - # Archives containing C++ object files must be created using - # "CC -xar", where "CC" is the Sun C++ compiler. This is - # necessary to make sure instantiated templates are included - # in the archive. - old_archive_cmds_CXX='$CC -xar -o $oldlib $oldobjs' - ;; - esac - ;; - esac - ;; - - lynxos*) - # FIXME: insert proper C++ library support - ld_shlibs_CXX=no - ;; - - m88k*) - # FIXME: insert proper C++ library support - ld_shlibs_CXX=no - ;; - - mvs*) - case $cc_basename in - cxx*) - # FIXME: insert proper C++ library support - ld_shlibs_CXX=no - ;; - *) - # FIXME: insert proper C++ library support - ld_shlibs_CXX=no - ;; - esac - ;; - - netbsd*) - if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then - archive_cmds_CXX='$LD -Bshareable -o $lib $predep_objects $libobjs $deplibs $postdep_objects $linker_flags' - wlarc= - hardcode_libdir_flag_spec_CXX='-R$libdir' - hardcode_direct_CXX=yes - hardcode_shlibpath_var_CXX=no - fi - # Workaround some broken pre-1.5 toolchains - output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP conftest.$objext | $SED -e "s:-lgcc -lc -lgcc::"' - ;; - - *nto* | *qnx*) - ld_shlibs_CXX=yes - ;; - - openbsd2*) - # C++ shared libraries are fairly broken - ld_shlibs_CXX=no - ;; - - openbsd*) - if test -f /usr/libexec/ld.so; then - hardcode_direct_CXX=yes - hardcode_shlibpath_var_CXX=no - hardcode_direct_absolute_CXX=yes - archive_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib' - hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir' - if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then - archive_expsym_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file,$export_symbols -o $lib' - export_dynamic_flag_spec_CXX='${wl}-E' - whole_archive_flag_spec_CXX="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' - fi - output_verbose_link_cmd=func_echo_all - else - ld_shlibs_CXX=no - fi - ;; - - osf3* | osf4* | osf5*) - case $cc_basename in - KCC*) - # Kuck and Associates, Inc. (KAI) C++ Compiler - - # KCC will only create a shared library if the output file - # ends with ".so" (or ".sl" for HP-UX), so rename the library - # to its proper name (with version) after linking. - archive_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo "$lib" | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' - - hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir' - hardcode_libdir_separator_CXX=: - - # Archives containing C++ object files must be created using - # the KAI C++ compiler. - case $host in - osf3*) old_archive_cmds_CXX='$CC -Bstatic -o $oldlib $oldobjs' ;; - *) old_archive_cmds_CXX='$CC -o $oldlib $oldobjs' ;; - esac - ;; - RCC*) - # Rational C++ 2.4.1 - # FIXME: insert proper C++ library support - ld_shlibs_CXX=no - ;; - cxx*) - case $host in - osf3*) - allow_undefined_flag_CXX=' ${wl}-expect_unresolved ${wl}\*' - archive_cmds_CXX='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $soname `test -n "$verstring" && func_echo_all "${wl}-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' - hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir' - ;; - *) - allow_undefined_flag_CXX=' -expect_unresolved \*' - archive_cmds_CXX='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' - archive_expsym_cmds_CXX='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done~ - echo "-hidden">> $lib.exp~ - $CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname ${wl}-input ${wl}$lib.exp `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib~ - $RM $lib.exp' - hardcode_libdir_flag_spec_CXX='-rpath $libdir' - ;; - esac - - hardcode_libdir_separator_CXX=: - - # Commands to make compiler produce verbose output that lists - # what "hidden" libraries, object files and flags are used when - # linking a shared library. - # - # There doesn't appear to be a way to prevent this compiler from - # explicitly linking system object files so we need to strip them - # from the output so that they don't get included in the library - # dependencies. - output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld" | $GREP -v "ld:"`; templist=`func_echo_all "$templist" | $SED "s/\(^.*ld.*\)\( .*ld.*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' - ;; - *) - if test "$GXX" = yes && test "$with_gnu_ld" = no; then - allow_undefined_flag_CXX=' ${wl}-expect_unresolved ${wl}\*' - case $host in - osf3*) - archive_cmds_CXX='$CC -shared -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' - ;; - *) - archive_cmds_CXX='$CC -shared $pic_flag -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' - ;; - esac - - hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir' - hardcode_libdir_separator_CXX=: - - # Commands to make compiler produce verbose output that lists - # what "hidden" libraries, object files and flags are used when - # linking a shared library. - output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' - - else - # FIXME: insert proper C++ library support - ld_shlibs_CXX=no - fi - ;; - esac - ;; - - psos*) - # FIXME: insert proper C++ library support - ld_shlibs_CXX=no - ;; - - sunos4*) - case $cc_basename in - CC*) - # Sun C++ 4.x - # FIXME: insert proper C++ library support - ld_shlibs_CXX=no - ;; - lcc*) - # Lucid - # FIXME: insert proper C++ library support - ld_shlibs_CXX=no - ;; - *) - # FIXME: insert proper C++ library support - ld_shlibs_CXX=no - ;; - esac - ;; - - solaris*) - case $cc_basename in - CC* | sunCC*) - # Sun C++ 4.2, 5.x and Centerline C++ - archive_cmds_need_lc_CXX=yes - no_undefined_flag_CXX=' -zdefs' - archive_cmds_CXX='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' - archive_expsym_cmds_CXX='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ - $CC -G${allow_undefined_flag} ${wl}-M ${wl}$lib.exp -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' - - hardcode_libdir_flag_spec_CXX='-R$libdir' - hardcode_shlibpath_var_CXX=no - case $host_os in - solaris2.[0-5] | solaris2.[0-5].*) ;; - *) - # The compiler driver will combine and reorder linker options, - # but understands `-z linker_flag'. - # Supported since Solaris 2.6 (maybe 2.5.1?) - whole_archive_flag_spec_CXX='-z allextract$convenience -z defaultextract' - ;; - esac - link_all_deplibs_CXX=yes - - output_verbose_link_cmd='func_echo_all' - - # Archives containing C++ object files must be created using - # "CC -xar", where "CC" is the Sun C++ compiler. This is - # necessary to make sure instantiated templates are included - # in the archive. - old_archive_cmds_CXX='$CC -xar -o $oldlib $oldobjs' - ;; - gcx*) - # Green Hills C++ Compiler - archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' - - # The C++ compiler must be used to create the archive. - old_archive_cmds_CXX='$CC $LDFLAGS -archive -o $oldlib $oldobjs' - ;; - *) - # GNU C++ compiler with Solaris linker - if test "$GXX" = yes && test "$with_gnu_ld" = no; then - no_undefined_flag_CXX=' ${wl}-z ${wl}defs' - if $CC --version | $GREP -v '^2\.7' > /dev/null; then - archive_cmds_CXX='$CC -shared $pic_flag -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' - archive_expsym_cmds_CXX='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ - $CC -shared $pic_flag -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' - - # Commands to make compiler produce verbose output that lists - # what "hidden" libraries, object files and flags are used when - # linking a shared library. - output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' - else - # g++ 2.7 appears to require `-G' NOT `-shared' on this - # platform. - archive_cmds_CXX='$CC -G -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' - archive_expsym_cmds_CXX='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ - $CC -G -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' - - # Commands to make compiler produce verbose output that lists - # what "hidden" libraries, object files and flags are used when - # linking a shared library. - output_verbose_link_cmd='$CC -G $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' - fi - - hardcode_libdir_flag_spec_CXX='${wl}-R $wl$libdir' - case $host_os in - solaris2.[0-5] | solaris2.[0-5].*) ;; - *) - whole_archive_flag_spec_CXX='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract' - ;; - esac - fi - ;; - esac - ;; - - sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7* | sco3.2v5.0.[024]*) - no_undefined_flag_CXX='${wl}-z,text' - archive_cmds_need_lc_CXX=no - hardcode_shlibpath_var_CXX=no - runpath_var='LD_RUN_PATH' - - case $cc_basename in - CC*) - archive_cmds_CXX='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' - archive_expsym_cmds_CXX='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' - ;; - *) - archive_cmds_CXX='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' - archive_expsym_cmds_CXX='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' - ;; - esac - ;; - - sysv5* | sco3.2v5* | sco5v6*) - # Note: We can NOT use -z defs as we might desire, because we do not - # link with -lc, and that would cause any symbols used from libc to - # always be unresolved, which means just about no library would - # ever link correctly. If we're not using GNU ld we use -z text - # though, which does catch some bad symbols but isn't as heavy-handed - # as -z defs. - no_undefined_flag_CXX='${wl}-z,text' - allow_undefined_flag_CXX='${wl}-z,nodefs' - archive_cmds_need_lc_CXX=no - hardcode_shlibpath_var_CXX=no - hardcode_libdir_flag_spec_CXX='${wl}-R,$libdir' - hardcode_libdir_separator_CXX=':' - link_all_deplibs_CXX=yes - export_dynamic_flag_spec_CXX='${wl}-Bexport' - runpath_var='LD_RUN_PATH' - - case $cc_basename in - CC*) - archive_cmds_CXX='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' - archive_expsym_cmds_CXX='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' - old_archive_cmds_CXX='$CC -Tprelink_objects $oldobjs~ - '"$old_archive_cmds_CXX" - reload_cmds_CXX='$CC -Tprelink_objects $reload_objs~ - '"$reload_cmds_CXX" - ;; - *) - archive_cmds_CXX='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' - archive_expsym_cmds_CXX='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' - ;; - esac - ;; - - tandem*) - case $cc_basename in - NCC*) - # NonStop-UX NCC 3.20 - # FIXME: insert proper C++ library support - ld_shlibs_CXX=no - ;; - *) - # FIXME: insert proper C++ library support - ld_shlibs_CXX=no - ;; - esac - ;; - - vxworks*) - # FIXME: insert proper C++ library support - ld_shlibs_CXX=no - ;; - - *) - # FIXME: insert proper C++ library support - ld_shlibs_CXX=no - ;; - esac - - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ld_shlibs_CXX" >&5 -$as_echo "$ld_shlibs_CXX" >&6; } - test "$ld_shlibs_CXX" = no && can_build_shared=no - - GCC_CXX="$GXX" - LD_CXX="$LD" - - ## CAVEAT EMPTOR: - ## There is no encapsulation within the following macros, do not change - ## the running order or otherwise move them around unless you know exactly - ## what you are doing... - # Dependencies to place before and after the object being linked: -predep_objects_CXX= -postdep_objects_CXX= -predeps_CXX= -postdeps_CXX= -compiler_lib_search_path_CXX= - -cat > conftest.$ac_ext <<_LT_EOF -class Foo -{ -public: - Foo (void) { a = 0; } -private: - int a; -}; -_LT_EOF - - -_lt_libdeps_save_CFLAGS=$CFLAGS -case "$CC $CFLAGS " in #( -*\ -flto*\ *) CFLAGS="$CFLAGS -fno-lto" ;; -*\ -fwhopr*\ *) CFLAGS="$CFLAGS -fno-whopr" ;; -*\ -fuse-linker-plugin*\ *) CFLAGS="$CFLAGS -fno-use-linker-plugin" ;; -esac - -if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 - (eval $ac_compile) 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; }; then - # Parse the compiler output and extract the necessary - # objects, libraries and library flags. - - # Sentinel used to keep track of whether or not we are before - # the conftest object file. - pre_test_object_deps_done=no - - for p in `eval "$output_verbose_link_cmd"`; do - case ${prev}${p} in - - -L* | -R* | -l*) - # Some compilers place space between "-{L,R}" and the path. - # Remove the space. - if test $p = "-L" || - test $p = "-R"; then - prev=$p - continue - fi - - # Expand the sysroot to ease extracting the directories later. - if test -z "$prev"; then - case $p in - -L*) func_stripname_cnf '-L' '' "$p"; prev=-L; p=$func_stripname_result ;; - -R*) func_stripname_cnf '-R' '' "$p"; prev=-R; p=$func_stripname_result ;; - -l*) func_stripname_cnf '-l' '' "$p"; prev=-l; p=$func_stripname_result ;; - esac - fi - case $p in - =*) func_stripname_cnf '=' '' "$p"; p=$lt_sysroot$func_stripname_result ;; - esac - if test "$pre_test_object_deps_done" = no; then - case ${prev} in - -L | -R) - # Internal compiler library paths should come after those - # provided the user. The postdeps already come after the - # user supplied libs so there is no need to process them. - if test -z "$compiler_lib_search_path_CXX"; then - compiler_lib_search_path_CXX="${prev}${p}" - else - compiler_lib_search_path_CXX="${compiler_lib_search_path_CXX} ${prev}${p}" - fi - ;; - # The "-l" case would never come before the object being - # linked, so don't bother handling this case. - esac - else - if test -z "$postdeps_CXX"; then - postdeps_CXX="${prev}${p}" - else - postdeps_CXX="${postdeps_CXX} ${prev}${p}" - fi - fi - prev= - ;; - - *.lto.$objext) ;; # Ignore GCC LTO objects - *.$objext) - # This assumes that the test object file only shows up - # once in the compiler output. - if test "$p" = "conftest.$objext"; then - pre_test_object_deps_done=yes - continue - fi - - if test "$pre_test_object_deps_done" = no; then - if test -z "$predep_objects_CXX"; then - predep_objects_CXX="$p" - else - predep_objects_CXX="$predep_objects_CXX $p" - fi - else - if test -z "$postdep_objects_CXX"; then - postdep_objects_CXX="$p" - else - postdep_objects_CXX="$postdep_objects_CXX $p" - fi - fi - ;; - - *) ;; # Ignore the rest. - - esac - done - - # Clean up. - rm -f a.out a.exe -else - echo "libtool.m4: error: problem compiling CXX test program" -fi - -$RM -f confest.$objext -CFLAGS=$_lt_libdeps_save_CFLAGS - -# PORTME: override above test on systems where it is broken -case $host_os in -interix[3-9]*) - # Interix 3.5 installs completely hosed .la files for C++, so rather than - # hack all around it, let's just trust "g++" to DTRT. - predep_objects_CXX= - postdep_objects_CXX= - postdeps_CXX= - ;; - -linux*) - case `$CC -V 2>&1 | sed 5q` in - *Sun\ C*) - # Sun C++ 5.9 - - # The more standards-conforming stlport4 library is - # incompatible with the Cstd library. Avoid specifying - # it if it's in CXXFLAGS. Ignore libCrun as - # -library=stlport4 depends on it. - case " $CXX $CXXFLAGS " in - *" -library=stlport4 "*) - solaris_use_stlport4=yes - ;; - esac - - if test "$solaris_use_stlport4" != yes; then - postdeps_CXX='-library=Cstd -library=Crun' - fi - ;; - esac - ;; - -solaris*) - case $cc_basename in - CC* | sunCC*) - # The more standards-conforming stlport4 library is - # incompatible with the Cstd library. Avoid specifying - # it if it's in CXXFLAGS. Ignore libCrun as - # -library=stlport4 depends on it. - case " $CXX $CXXFLAGS " in - *" -library=stlport4 "*) - solaris_use_stlport4=yes - ;; - esac - - # Adding this requires a known-good setup of shared libraries for - # Sun compiler versions before 5.6, else PIC objects from an old - # archive will be linked into the output, leading to subtle bugs. - if test "$solaris_use_stlport4" != yes; then - postdeps_CXX='-library=Cstd -library=Crun' - fi - ;; - esac - ;; -esac - - -case " $postdeps_CXX " in -*" -lc "*) archive_cmds_need_lc_CXX=no ;; -esac - compiler_lib_search_dirs_CXX= -if test -n "${compiler_lib_search_path_CXX}"; then - compiler_lib_search_dirs_CXX=`echo " ${compiler_lib_search_path_CXX}" | ${SED} -e 's! -L! !g' -e 's!^ !!'` -fi - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - lt_prog_compiler_wl_CXX= -lt_prog_compiler_pic_CXX= -lt_prog_compiler_static_CXX= - - - # C++ specific cases for pic, static, wl, etc. - if test "$GXX" = yes; then - lt_prog_compiler_wl_CXX='-Wl,' - lt_prog_compiler_static_CXX='-static' - - case $host_os in - aix*) - # All AIX code is PIC. - if test "$host_cpu" = ia64; then - # AIX 5 now supports IA64 processor - lt_prog_compiler_static_CXX='-Bstatic' - fi - ;; - - amigaos*) - case $host_cpu in - powerpc) - # see comment about AmigaOS4 .so support - lt_prog_compiler_pic_CXX='-fPIC' - ;; - m68k) - # FIXME: we need at least 68020 code to build shared libraries, but - # adding the `-m68020' flag to GCC prevents building anything better, - # like `-m68040'. - lt_prog_compiler_pic_CXX='-m68020 -resident32 -malways-restore-a4' - ;; - esac - ;; - - beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) - # PIC is the default for these OSes. - ;; - mingw* | cygwin* | os2* | pw32* | cegcc*) - # This hack is so that the source file can tell whether it is being - # built for inclusion in a dll (and should export symbols for example). - # Although the cygwin gcc ignores -fPIC, still need this for old-style - # (--disable-auto-import) libraries - lt_prog_compiler_pic_CXX='-DDLL_EXPORT' - ;; - darwin* | rhapsody*) - # PIC is the default on this platform - # Common symbols not allowed in MH_DYLIB files - lt_prog_compiler_pic_CXX='-fno-common' - ;; - *djgpp*) - # DJGPP does not support shared libraries at all - lt_prog_compiler_pic_CXX= - ;; - haiku*) - # PIC is the default for Haiku. - # The "-static" flag exists, but is broken. - lt_prog_compiler_static_CXX= - ;; - interix[3-9]*) - # Interix 3.x gcc -fpic/-fPIC options generate broken code. - # Instead, we relocate shared libraries at runtime. - ;; - sysv4*MP*) - if test -d /usr/nec; then - lt_prog_compiler_pic_CXX=-Kconform_pic - fi - ;; - hpux*) - # PIC is the default for 64-bit PA HP-UX, but not for 32-bit - # PA HP-UX. On IA64 HP-UX, PIC is the default but the pic flag - # sets the default TLS model and affects inlining. - case $host_cpu in - hppa*64*) - ;; - *) - lt_prog_compiler_pic_CXX='-fPIC' - ;; - esac - ;; - *qnx* | *nto*) - # QNX uses GNU C++, but need to define -shared option too, otherwise - # it will coredump. - lt_prog_compiler_pic_CXX='-fPIC -shared' - ;; - *) - lt_prog_compiler_pic_CXX='-fPIC' - ;; - esac - else - case $host_os in - aix[4-9]*) - # All AIX code is PIC. - if test "$host_cpu" = ia64; then - # AIX 5 now supports IA64 processor - lt_prog_compiler_static_CXX='-Bstatic' - else - lt_prog_compiler_static_CXX='-bnso -bI:/lib/syscalls.exp' - fi - ;; - chorus*) - case $cc_basename in - cxch68*) - # Green Hills C++ Compiler - # _LT_TAGVAR(lt_prog_compiler_static, CXX)="--no_auto_instantiation -u __main -u __premain -u _abort -r $COOL_DIR/lib/libOrb.a $MVME_DIR/lib/CC/libC.a $MVME_DIR/lib/classix/libcx.s.a" - ;; - esac - ;; - mingw* | cygwin* | os2* | pw32* | cegcc*) - # This hack is so that the source file can tell whether it is being - # built for inclusion in a dll (and should export symbols for example). - lt_prog_compiler_pic_CXX='-DDLL_EXPORT' - ;; - dgux*) - case $cc_basename in - ec++*) - lt_prog_compiler_pic_CXX='-KPIC' - ;; - ghcx*) - # Green Hills C++ Compiler - lt_prog_compiler_pic_CXX='-pic' - ;; - *) - ;; - esac - ;; - freebsd* | dragonfly*) - # FreeBSD uses GNU C++ - ;; - hpux9* | hpux10* | hpux11*) - case $cc_basename in - CC*) - lt_prog_compiler_wl_CXX='-Wl,' - lt_prog_compiler_static_CXX='${wl}-a ${wl}archive' - if test "$host_cpu" != ia64; then - lt_prog_compiler_pic_CXX='+Z' - fi - ;; - aCC*) - lt_prog_compiler_wl_CXX='-Wl,' - lt_prog_compiler_static_CXX='${wl}-a ${wl}archive' - case $host_cpu in - hppa*64*|ia64*) - # +Z the default - ;; - *) - lt_prog_compiler_pic_CXX='+Z' - ;; - esac - ;; - *) - ;; - esac - ;; - interix*) - # This is c89, which is MS Visual C++ (no shared libs) - # Anyone wants to do a port? - ;; - irix5* | irix6* | nonstopux*) - case $cc_basename in - CC*) - lt_prog_compiler_wl_CXX='-Wl,' - lt_prog_compiler_static_CXX='-non_shared' - # CC pic flag -KPIC is the default. - ;; - *) - ;; - esac - ;; - linux* | k*bsd*-gnu | kopensolaris*-gnu) - case $cc_basename in - KCC*) - # KAI C++ Compiler - lt_prog_compiler_wl_CXX='--backend -Wl,' - lt_prog_compiler_pic_CXX='-fPIC' - ;; - ecpc* ) - # old Intel C++ for x86_64 which still supported -KPIC. - lt_prog_compiler_wl_CXX='-Wl,' - lt_prog_compiler_pic_CXX='-KPIC' - lt_prog_compiler_static_CXX='-static' - ;; - icpc* ) - # Intel C++, used to be incompatible with GCC. - # ICC 10 doesn't accept -KPIC any more. - lt_prog_compiler_wl_CXX='-Wl,' - lt_prog_compiler_pic_CXX='-fPIC' - lt_prog_compiler_static_CXX='-static' - ;; - pgCC* | pgcpp*) - # Portland Group C++ compiler - lt_prog_compiler_wl_CXX='-Wl,' - lt_prog_compiler_pic_CXX='-fpic' - lt_prog_compiler_static_CXX='-Bstatic' - ;; - cxx*) - # Compaq C++ - # Make sure the PIC flag is empty. It appears that all Alpha - # Linux and Compaq Tru64 Unix objects are PIC. - lt_prog_compiler_pic_CXX= - lt_prog_compiler_static_CXX='-non_shared' - ;; - xlc* | xlC* | bgxl[cC]* | mpixl[cC]*) - # IBM XL 8.0, 9.0 on PPC and BlueGene - lt_prog_compiler_wl_CXX='-Wl,' - lt_prog_compiler_pic_CXX='-qpic' - lt_prog_compiler_static_CXX='-qstaticlink' - ;; - *) - case `$CC -V 2>&1 | sed 5q` in - *Sun\ C*) - # Sun C++ 5.9 - lt_prog_compiler_pic_CXX='-KPIC' - lt_prog_compiler_static_CXX='-Bstatic' - lt_prog_compiler_wl_CXX='-Qoption ld ' - ;; - esac - ;; - esac - ;; - lynxos*) - ;; - m88k*) - ;; - mvs*) - case $cc_basename in - cxx*) - lt_prog_compiler_pic_CXX='-W c,exportall' - ;; - *) - ;; - esac - ;; - netbsd* | netbsdelf*-gnu) - ;; - *qnx* | *nto*) - # QNX uses GNU C++, but need to define -shared option too, otherwise - # it will coredump. - lt_prog_compiler_pic_CXX='-fPIC -shared' - ;; - osf3* | osf4* | osf5*) - case $cc_basename in - KCC*) - lt_prog_compiler_wl_CXX='--backend -Wl,' - ;; - RCC*) - # Rational C++ 2.4.1 - lt_prog_compiler_pic_CXX='-pic' - ;; - cxx*) - # Digital/Compaq C++ - lt_prog_compiler_wl_CXX='-Wl,' - # Make sure the PIC flag is empty. It appears that all Alpha - # Linux and Compaq Tru64 Unix objects are PIC. - lt_prog_compiler_pic_CXX= - lt_prog_compiler_static_CXX='-non_shared' - ;; - *) - ;; - esac - ;; - psos*) - ;; - solaris*) - case $cc_basename in - CC* | sunCC*) - # Sun C++ 4.2, 5.x and Centerline C++ - lt_prog_compiler_pic_CXX='-KPIC' - lt_prog_compiler_static_CXX='-Bstatic' - lt_prog_compiler_wl_CXX='-Qoption ld ' - ;; - gcx*) - # Green Hills C++ Compiler - lt_prog_compiler_pic_CXX='-PIC' - ;; - *) - ;; - esac - ;; - sunos4*) - case $cc_basename in - CC*) - # Sun C++ 4.x - lt_prog_compiler_pic_CXX='-pic' - lt_prog_compiler_static_CXX='-Bstatic' - ;; - lcc*) - # Lucid - lt_prog_compiler_pic_CXX='-pic' - ;; - *) - ;; - esac - ;; - sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) - case $cc_basename in - CC*) - lt_prog_compiler_wl_CXX='-Wl,' - lt_prog_compiler_pic_CXX='-KPIC' - lt_prog_compiler_static_CXX='-Bstatic' - ;; - esac - ;; - tandem*) - case $cc_basename in - NCC*) - # NonStop-UX NCC 3.20 - lt_prog_compiler_pic_CXX='-KPIC' - ;; - *) - ;; - esac - ;; - vxworks*) - ;; - *) - lt_prog_compiler_can_build_shared_CXX=no - ;; - esac - fi - -case $host_os in - # For platforms which do not support PIC, -DPIC is meaningless: - *djgpp*) - lt_prog_compiler_pic_CXX= - ;; - *) - lt_prog_compiler_pic_CXX="$lt_prog_compiler_pic_CXX -DPIC" - ;; -esac - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $compiler option to produce PIC" >&5 -$as_echo_n "checking for $compiler option to produce PIC... " >&6; } -if ${lt_cv_prog_compiler_pic_CXX+:} false; then : - $as_echo_n "(cached) " >&6 -else - lt_cv_prog_compiler_pic_CXX=$lt_prog_compiler_pic_CXX -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic_CXX" >&5 -$as_echo "$lt_cv_prog_compiler_pic_CXX" >&6; } -lt_prog_compiler_pic_CXX=$lt_cv_prog_compiler_pic_CXX - -# -# Check to make sure the PIC flag actually works. -# -if test -n "$lt_prog_compiler_pic_CXX"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler PIC flag $lt_prog_compiler_pic_CXX works" >&5 -$as_echo_n "checking if $compiler PIC flag $lt_prog_compiler_pic_CXX works... " >&6; } -if ${lt_cv_prog_compiler_pic_works_CXX+:} false; then : - $as_echo_n "(cached) " >&6 -else - lt_cv_prog_compiler_pic_works_CXX=no - ac_outfile=conftest.$ac_objext - echo "$lt_simple_compile_test_code" > conftest.$ac_ext - lt_compiler_flag="$lt_prog_compiler_pic_CXX -DPIC" - # Insert the option either (1) after the last *FLAGS variable, or - # (2) before a word containing "conftest.", or (3) at the end. - # Note that $ac_compile itself does not contain backslashes and begins - # with a dollar sign (not a hyphen), so the echo should work correctly. - # The option is referenced via a variable to avoid confusing sed. - lt_compile=`echo "$ac_compile" | $SED \ - -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ - -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ - -e 's:$: $lt_compiler_flag:'` - (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) - (eval "$lt_compile" 2>conftest.err) - ac_status=$? - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - if (exit $ac_status) && test -s "$ac_outfile"; then - # The compiler can only warn and ignore the option if not recognized - # So say no if there are warnings other than the usual output. - $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp - $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 - if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then - lt_cv_prog_compiler_pic_works_CXX=yes - fi - fi - $RM conftest* - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic_works_CXX" >&5 -$as_echo "$lt_cv_prog_compiler_pic_works_CXX" >&6; } - -if test x"$lt_cv_prog_compiler_pic_works_CXX" = xyes; then - case $lt_prog_compiler_pic_CXX in - "" | " "*) ;; - *) lt_prog_compiler_pic_CXX=" $lt_prog_compiler_pic_CXX" ;; - esac -else - lt_prog_compiler_pic_CXX= - lt_prog_compiler_can_build_shared_CXX=no -fi - -fi - - - - - -# -# Check to make sure the static flag actually works. -# -wl=$lt_prog_compiler_wl_CXX eval lt_tmp_static_flag=\"$lt_prog_compiler_static_CXX\" -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler static flag $lt_tmp_static_flag works" >&5 -$as_echo_n "checking if $compiler static flag $lt_tmp_static_flag works... " >&6; } -if ${lt_cv_prog_compiler_static_works_CXX+:} false; then : - $as_echo_n "(cached) " >&6 -else - lt_cv_prog_compiler_static_works_CXX=no - save_LDFLAGS="$LDFLAGS" - LDFLAGS="$LDFLAGS $lt_tmp_static_flag" - echo "$lt_simple_link_test_code" > conftest.$ac_ext - if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then - # The linker can only warn and ignore the option if not recognized - # So say no if there are warnings - if test -s conftest.err; then - # Append any errors to the config.log. - cat conftest.err 1>&5 - $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp - $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 - if diff conftest.exp conftest.er2 >/dev/null; then - lt_cv_prog_compiler_static_works_CXX=yes - fi - else - lt_cv_prog_compiler_static_works_CXX=yes - fi - fi - $RM -r conftest* - LDFLAGS="$save_LDFLAGS" - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_static_works_CXX" >&5 -$as_echo "$lt_cv_prog_compiler_static_works_CXX" >&6; } - -if test x"$lt_cv_prog_compiler_static_works_CXX" = xyes; then - : -else - lt_prog_compiler_static_CXX= -fi - - - - - { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5 -$as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; } -if ${lt_cv_prog_compiler_c_o_CXX+:} false; then : - $as_echo_n "(cached) " >&6 -else - lt_cv_prog_compiler_c_o_CXX=no - $RM -r conftest 2>/dev/null - mkdir conftest - cd conftest - mkdir out - echo "$lt_simple_compile_test_code" > conftest.$ac_ext - - lt_compiler_flag="-o out/conftest2.$ac_objext" - # Insert the option either (1) after the last *FLAGS variable, or - # (2) before a word containing "conftest.", or (3) at the end. - # Note that $ac_compile itself does not contain backslashes and begins - # with a dollar sign (not a hyphen), so the echo should work correctly. - lt_compile=`echo "$ac_compile" | $SED \ - -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ - -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ - -e 's:$: $lt_compiler_flag:'` - (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) - (eval "$lt_compile" 2>out/conftest.err) - ac_status=$? - cat out/conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - if (exit $ac_status) && test -s out/conftest2.$ac_objext - then - # The compiler can only warn and ignore the option if not recognized - # So say no if there are warnings - $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp - $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 - if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then - lt_cv_prog_compiler_c_o_CXX=yes - fi - fi - chmod u+w . 2>&5 - $RM conftest* - # SGI C++ compiler will create directory out/ii_files/ for - # template instantiation - test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files - $RM out/* && rmdir out - cd .. - $RM -r conftest - $RM conftest* - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o_CXX" >&5 -$as_echo "$lt_cv_prog_compiler_c_o_CXX" >&6; } - - - - { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5 -$as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; } -if ${lt_cv_prog_compiler_c_o_CXX+:} false; then : - $as_echo_n "(cached) " >&6 -else - lt_cv_prog_compiler_c_o_CXX=no - $RM -r conftest 2>/dev/null - mkdir conftest - cd conftest - mkdir out - echo "$lt_simple_compile_test_code" > conftest.$ac_ext - - lt_compiler_flag="-o out/conftest2.$ac_objext" - # Insert the option either (1) after the last *FLAGS variable, or - # (2) before a word containing "conftest.", or (3) at the end. - # Note that $ac_compile itself does not contain backslashes and begins - # with a dollar sign (not a hyphen), so the echo should work correctly. - lt_compile=`echo "$ac_compile" | $SED \ - -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ - -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ - -e 's:$: $lt_compiler_flag:'` - (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) - (eval "$lt_compile" 2>out/conftest.err) - ac_status=$? - cat out/conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - if (exit $ac_status) && test -s out/conftest2.$ac_objext - then - # The compiler can only warn and ignore the option if not recognized - # So say no if there are warnings - $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp - $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 - if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then - lt_cv_prog_compiler_c_o_CXX=yes - fi - fi - chmod u+w . 2>&5 - $RM conftest* - # SGI C++ compiler will create directory out/ii_files/ for - # template instantiation - test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files - $RM out/* && rmdir out - cd .. - $RM -r conftest - $RM conftest* - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o_CXX" >&5 -$as_echo "$lt_cv_prog_compiler_c_o_CXX" >&6; } - - - - -hard_links="nottested" -if test "$lt_cv_prog_compiler_c_o_CXX" = no && test "$need_locks" != no; then - # do not overwrite the value of need_locks provided by the user - { $as_echo "$as_me:${as_lineno-$LINENO}: checking if we can lock with hard links" >&5 -$as_echo_n "checking if we can lock with hard links... " >&6; } - hard_links=yes - $RM conftest* - ln conftest.a conftest.b 2>/dev/null && hard_links=no - touch conftest.a - ln conftest.a conftest.b 2>&5 || hard_links=no - ln conftest.a conftest.b 2>/dev/null && hard_links=no - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $hard_links" >&5 -$as_echo "$hard_links" >&6; } - if test "$hard_links" = no; then - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&5 -$as_echo "$as_me: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&2;} - need_locks=warn - fi -else - need_locks=no -fi - - - - { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $compiler linker ($LD) supports shared libraries" >&5 -$as_echo_n "checking whether the $compiler linker ($LD) supports shared libraries... " >&6; } - - export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' - exclude_expsyms_CXX='_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*' - case $host_os in - aix[4-9]*) - # If we're using GNU nm, then we don't want the "-C" option. - # -C means demangle to AIX nm, but means don't demangle with GNU nm - # Also, AIX nm treats weak defined symbols like other global defined - # symbols, whereas GNU nm marks them as "W". - if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then - export_symbols_cmds_CXX='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && (substr(\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' - else - export_symbols_cmds_CXX='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && (substr(\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' - fi - ;; - pw32*) - export_symbols_cmds_CXX="$ltdll_cmds" - ;; - cygwin* | mingw* | cegcc*) - case $cc_basename in - cl*) - exclude_expsyms_CXX='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*' - ;; - *) - export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1 DATA/;s/^.*[ ]__nm__\([^ ]*\)[ ][^ ]*/\1 DATA/;/^I[ ]/d;/^[AITW][ ]/s/.* //'\'' | sort | uniq > $export_symbols' - exclude_expsyms_CXX='[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname' - ;; - esac - ;; - linux* | k*bsd*-gnu | gnu*) - link_all_deplibs_CXX=no - ;; - *) - export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' - ;; - esac - -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ld_shlibs_CXX" >&5 -$as_echo "$ld_shlibs_CXX" >&6; } -test "$ld_shlibs_CXX" = no && can_build_shared=no - -with_gnu_ld_CXX=$with_gnu_ld - - - - - - -# -# Do we need to explicitly link libc? -# -case "x$archive_cmds_need_lc_CXX" in -x|xyes) - # Assume -lc should be added - archive_cmds_need_lc_CXX=yes - - if test "$enable_shared" = yes && test "$GCC" = yes; then - case $archive_cmds_CXX in - *'~'*) - # FIXME: we may have to deal with multi-command sequences. - ;; - '$CC '*) - # Test whether the compiler implicitly links with -lc since on some - # systems, -lgcc has to come before -lc. If gcc already passes -lc - # to ld, don't add -lc before -lgcc. - { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether -lc should be explicitly linked in" >&5 -$as_echo_n "checking whether -lc should be explicitly linked in... " >&6; } -if ${lt_cv_archive_cmds_need_lc_CXX+:} false; then : - $as_echo_n "(cached) " >&6 -else - $RM conftest* - echo "$lt_simple_compile_test_code" > conftest.$ac_ext - - if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 - (eval $ac_compile) 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } 2>conftest.err; then - soname=conftest - lib=conftest - libobjs=conftest.$ac_objext - deplibs= - wl=$lt_prog_compiler_wl_CXX - pic_flag=$lt_prog_compiler_pic_CXX - compiler_flags=-v - linker_flags=-v - verstring= - output_objdir=. - libname=conftest - lt_save_allow_undefined_flag=$allow_undefined_flag_CXX - allow_undefined_flag_CXX= - if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$archive_cmds_CXX 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1\""; } >&5 - (eval $archive_cmds_CXX 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1) 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } - then - lt_cv_archive_cmds_need_lc_CXX=no - else - lt_cv_archive_cmds_need_lc_CXX=yes - fi - allow_undefined_flag_CXX=$lt_save_allow_undefined_flag - else - cat conftest.err 1>&5 - fi - $RM conftest* - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_archive_cmds_need_lc_CXX" >&5 -$as_echo "$lt_cv_archive_cmds_need_lc_CXX" >&6; } - archive_cmds_need_lc_CXX=$lt_cv_archive_cmds_need_lc_CXX - ;; - esac - fi - ;; -esac - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - { $as_echo "$as_me:${as_lineno-$LINENO}: checking dynamic linker characteristics" >&5 -$as_echo_n "checking dynamic linker characteristics... " >&6; } - -library_names_spec= -libname_spec='lib$name' -soname_spec= -shrext_cmds=".so" -postinstall_cmds= -postuninstall_cmds= -finish_cmds= -finish_eval= -shlibpath_var= -shlibpath_overrides_runpath=unknown -version_type=none -dynamic_linker="$host_os ld.so" -sys_lib_dlsearch_path_spec="/lib /usr/lib" -need_lib_prefix=unknown -hardcode_into_libs=no - -# when you set need_version to no, make sure it does not cause -set_version -# flags to be left without arguments -need_version=unknown - -case $host_os in -aix3*) - version_type=linux # correct to gnu/linux during the next big refactor - library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a' - shlibpath_var=LIBPATH - - # AIX 3 has no versioning support, so we append a major version to the name. - soname_spec='${libname}${release}${shared_ext}$major' - ;; - -aix[4-9]*) - version_type=linux # correct to gnu/linux during the next big refactor - need_lib_prefix=no - need_version=no - hardcode_into_libs=yes - if test "$host_cpu" = ia64; then - # AIX 5 supports IA64 - library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}' - shlibpath_var=LD_LIBRARY_PATH - else - # With GCC up to 2.95.x, collect2 would create an import file - # for dependence libraries. The import file would start with - # the line `#! .'. This would cause the generated library to - # depend on `.', always an invalid library. This was fixed in - # development snapshots of GCC prior to 3.0. - case $host_os in - aix4 | aix4.[01] | aix4.[01].*) - if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)' - echo ' yes ' - echo '#endif'; } | ${CC} -E - | $GREP yes > /dev/null; then - : - else - can_build_shared=no - fi - ;; - esac - # AIX (on Power*) has no versioning support, so currently we can not hardcode correct - # soname into executable. Probably we can add versioning support to - # collect2, so additional links can be useful in future. - if test "$aix_use_runtimelinking" = yes; then - # If using run time linking (on AIX 4.2 or later) use lib.so - # instead of lib.a to let people know that these are not - # typical AIX shared libraries. - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - else - # We preserve .a as extension for shared libraries through AIX4.2 - # and later when we are not doing run time linking. - library_names_spec='${libname}${release}.a $libname.a' - soname_spec='${libname}${release}${shared_ext}$major' - fi - shlibpath_var=LIBPATH - fi - ;; - -amigaos*) - case $host_cpu in - powerpc) - # Since July 2007 AmigaOS4 officially supports .so libraries. - # When compiling the executable, add -use-dynld -Lsobjs: to the compileline. - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - ;; - m68k) - library_names_spec='$libname.ixlibrary $libname.a' - # Create ${libname}_ixlibrary.a entries in /sys/libs. - finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`func_echo_all "$lib" | $SED '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; test $RM /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done' - ;; - esac - ;; - -beos*) - library_names_spec='${libname}${shared_ext}' - dynamic_linker="$host_os ld.so" - shlibpath_var=LIBRARY_PATH - ;; - -bsdi[45]*) - version_type=linux # correct to gnu/linux during the next big refactor - need_version=no - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir' - shlibpath_var=LD_LIBRARY_PATH - sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib" - sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib" - # the default ld.so.conf also contains /usr/contrib/lib and - # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow - # libtool to hard-code these into programs - ;; - -cygwin* | mingw* | pw32* | cegcc*) - version_type=windows - shrext_cmds=".dll" - need_version=no - need_lib_prefix=no - - case $GCC,$cc_basename in - yes,*) - # gcc - library_names_spec='$libname.dll.a' - # DLL is installed to $(libdir)/../bin by postinstall_cmds - postinstall_cmds='base_file=`basename \${file}`~ - dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~ - dldir=$destdir/`dirname \$dlpath`~ - test -d \$dldir || mkdir -p \$dldir~ - $install_prog $dir/$dlname \$dldir/$dlname~ - chmod a+x \$dldir/$dlname~ - if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then - eval '\''$striplib \$dldir/$dlname'\'' || exit \$?; - fi' - postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ - dlpath=$dir/\$dldll~ - $RM \$dlpath' - shlibpath_overrides_runpath=yes - - case $host_os in - cygwin*) - # Cygwin DLLs use 'cyg' prefix rather than 'lib' - soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' - - ;; - mingw* | cegcc*) - # MinGW DLLs use traditional 'lib' prefix - soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' - ;; - pw32*) - # pw32 DLLs use 'pw' prefix rather than 'lib' - library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' - ;; - esac - dynamic_linker='Win32 ld.exe' - ;; - - *,cl*) - # Native MSVC - libname_spec='$name' - soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' - library_names_spec='${libname}.dll.lib' - - case $build_os in - mingw*) - sys_lib_search_path_spec= - lt_save_ifs=$IFS - IFS=';' - for lt_path in $LIB - do - IFS=$lt_save_ifs - # Let DOS variable expansion print the short 8.3 style file name. - lt_path=`cd "$lt_path" 2>/dev/null && cmd //C "for %i in (".") do @echo %~si"` - sys_lib_search_path_spec="$sys_lib_search_path_spec $lt_path" - done - IFS=$lt_save_ifs - # Convert to MSYS style. - sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | sed -e 's|\\\\|/|g' -e 's| \\([a-zA-Z]\\):| /\\1|g' -e 's|^ ||'` - ;; - cygwin*) - # Convert to unix form, then to dos form, then back to unix form - # but this time dos style (no spaces!) so that the unix form looks - # like /cygdrive/c/PROGRA~1:/cygdr... - sys_lib_search_path_spec=`cygpath --path --unix "$LIB"` - sys_lib_search_path_spec=`cygpath --path --dos "$sys_lib_search_path_spec" 2>/dev/null` - sys_lib_search_path_spec=`cygpath --path --unix "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` - ;; - *) - sys_lib_search_path_spec="$LIB" - if $ECHO "$sys_lib_search_path_spec" | $GREP ';[c-zC-Z]:/' >/dev/null; then - # It is most probably a Windows format PATH. - sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` - else - sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` - fi - # FIXME: find the short name or the path components, as spaces are - # common. (e.g. "Program Files" -> "PROGRA~1") - ;; - esac - - # DLL is installed to $(libdir)/../bin by postinstall_cmds - postinstall_cmds='base_file=`basename \${file}`~ - dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~ - dldir=$destdir/`dirname \$dlpath`~ - test -d \$dldir || mkdir -p \$dldir~ - $install_prog $dir/$dlname \$dldir/$dlname' - postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ - dlpath=$dir/\$dldll~ - $RM \$dlpath' - shlibpath_overrides_runpath=yes - dynamic_linker='Win32 link.exe' - ;; - - *) - # Assume MSVC wrapper - library_names_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext} $libname.lib' - dynamic_linker='Win32 ld.exe' - ;; - esac - # FIXME: first we should search . and the directory the executable is in - shlibpath_var=PATH - ;; - -darwin* | rhapsody*) - dynamic_linker="$host_os dyld" - version_type=darwin - need_lib_prefix=no - need_version=no - library_names_spec='${libname}${release}${major}$shared_ext ${libname}$shared_ext' - soname_spec='${libname}${release}${major}$shared_ext' - shlibpath_overrides_runpath=yes - shlibpath_var=DYLD_LIBRARY_PATH - shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`' - - sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib' - ;; - -dgux*) - version_type=linux # correct to gnu/linux during the next big refactor - need_lib_prefix=no - need_version=no - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext' - soname_spec='${libname}${release}${shared_ext}$major' - shlibpath_var=LD_LIBRARY_PATH - ;; - -freebsd* | dragonfly*) - # DragonFly does not have aout. When/if they implement a new - # versioning mechanism, adjust this. - if test -x /usr/bin/objformat; then - objformat=`/usr/bin/objformat` - else - case $host_os in - freebsd[23].*) objformat=aout ;; - *) objformat=elf ;; - esac - fi - version_type=freebsd-$objformat - case $version_type in - freebsd-elf*) - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' - need_version=no - need_lib_prefix=no - ;; - freebsd-*) - library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix' - need_version=yes - ;; - esac - shlibpath_var=LD_LIBRARY_PATH - case $host_os in - freebsd2.*) - shlibpath_overrides_runpath=yes - ;; - freebsd3.[01]* | freebsdelf3.[01]*) - shlibpath_overrides_runpath=yes - hardcode_into_libs=yes - ;; - freebsd3.[2-9]* | freebsdelf3.[2-9]* | \ - freebsd4.[0-5] | freebsdelf4.[0-5] | freebsd4.1.1 | freebsdelf4.1.1) - shlibpath_overrides_runpath=no - hardcode_into_libs=yes - ;; - *) # from 4.6 on, and DragonFly - shlibpath_overrides_runpath=yes - hardcode_into_libs=yes - ;; - esac - ;; - -gnu*) - version_type=linux # correct to gnu/linux during the next big refactor - need_lib_prefix=no - need_version=no - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=no - hardcode_into_libs=yes - ;; - -haiku*) - version_type=linux # correct to gnu/linux during the next big refactor - need_lib_prefix=no - need_version=no - dynamic_linker="$host_os runtime_loader" - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - shlibpath_var=LIBRARY_PATH - shlibpath_overrides_runpath=yes - sys_lib_dlsearch_path_spec='/boot/home/config/lib /boot/common/lib /boot/system/lib' - hardcode_into_libs=yes - ;; - -hpux9* | hpux10* | hpux11*) - # Give a soname corresponding to the major version so that dld.sl refuses to - # link against other versions. - version_type=sunos - need_lib_prefix=no - need_version=no - case $host_cpu in - ia64*) - shrext_cmds='.so' - hardcode_into_libs=yes - dynamic_linker="$host_os dld.so" - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - if test "X$HPUX_IA64_MODE" = X32; then - sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib" - else - sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64" - fi - sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec - ;; - hppa*64*) - shrext_cmds='.sl' - hardcode_into_libs=yes - dynamic_linker="$host_os dld.sl" - shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH - shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64" - sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec - ;; - *) - shrext_cmds='.sl' - dynamic_linker="$host_os dld.sl" - shlibpath_var=SHLIB_PATH - shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - ;; - esac - # HP-UX runs *really* slowly unless shared libraries are mode 555, ... - postinstall_cmds='chmod 555 $lib' - # or fails outright, so override atomically: - install_override_mode=555 - ;; - -interix[3-9]*) - version_type=linux # correct to gnu/linux during the next big refactor - need_lib_prefix=no - need_version=no - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)' - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=no - hardcode_into_libs=yes - ;; - -irix5* | irix6* | nonstopux*) - case $host_os in - nonstopux*) version_type=nonstopux ;; - *) - if test "$lt_cv_prog_gnu_ld" = yes; then - version_type=linux # correct to gnu/linux during the next big refactor - else - version_type=irix - fi ;; - esac - need_lib_prefix=no - need_version=no - soname_spec='${libname}${release}${shared_ext}$major' - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}' - case $host_os in - irix5* | nonstopux*) - libsuff= shlibsuff= - ;; - *) - case $LD in # libtool.m4 will add one of these switches to LD - *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") - libsuff= shlibsuff= libmagic=32-bit;; - *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") - libsuff=32 shlibsuff=N32 libmagic=N32;; - *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") - libsuff=64 shlibsuff=64 libmagic=64-bit;; - *) libsuff= shlibsuff= libmagic=never-match;; - esac - ;; - esac - shlibpath_var=LD_LIBRARY${shlibsuff}_PATH - shlibpath_overrides_runpath=no - sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}" - sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}" - hardcode_into_libs=yes - ;; - -# No shared lib support for Linux oldld, aout, or coff. -linux*oldld* | linux*aout* | linux*coff*) - dynamic_linker=no - ;; - -# This must be glibc/ELF. -linux* | k*bsd*-gnu | kopensolaris*-gnu) - version_type=linux # correct to gnu/linux during the next big refactor - need_lib_prefix=no - need_version=no - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=no - - # Some binutils ld are patched to set DT_RUNPATH - if ${lt_cv_shlibpath_overrides_runpath+:} false; then : - $as_echo_n "(cached) " >&6 -else - lt_cv_shlibpath_overrides_runpath=no - save_LDFLAGS=$LDFLAGS - save_libdir=$libdir - eval "libdir=/foo; wl=\"$lt_prog_compiler_wl_CXX\"; \ - LDFLAGS=\"\$LDFLAGS $hardcode_libdir_flag_spec_CXX\"" - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -int -main () -{ - - ; - return 0; -} -_ACEOF -if ac_fn_cxx_try_link "$LINENO"; then : - if ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir" >/dev/null; then : - lt_cv_shlibpath_overrides_runpath=yes -fi -fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext - LDFLAGS=$save_LDFLAGS - libdir=$save_libdir - -fi - - shlibpath_overrides_runpath=$lt_cv_shlibpath_overrides_runpath - - # This implies no fast_install, which is unacceptable. - # Some rework will be needed to allow for fast_install - # before this can be enabled. - hardcode_into_libs=yes - - # Append ld.so.conf contents to the search path - if test -f /etc/ld.so.conf; then - lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \$2)); skip = 1; } { if (!skip) print \$0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[ ]*hwcap[ ]/d;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;s/"//g;/^$/d' | tr '\n' ' '` - sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra" - fi - - # We used to test for /lib/ld.so.1 and disable shared libraries on - # powerpc, because MkLinux only supported shared libraries with the - # GNU dynamic linker. Since this was broken with cross compilers, - # most powerpc-linux boxes support dynamic linking these days and - # people can always --disable-shared, the test was removed, and we - # assume the GNU/Linux dynamic linker is in use. - dynamic_linker='GNU/Linux ld.so' - ;; - -netbsdelf*-gnu) - version_type=linux - need_lib_prefix=no - need_version=no - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=no - hardcode_into_libs=yes - dynamic_linker='NetBSD ld.elf_so' - ;; - -netbsd*) - version_type=sunos - need_lib_prefix=no - need_version=no - if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' - finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' - dynamic_linker='NetBSD (a.out) ld.so' - else - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - dynamic_linker='NetBSD ld.elf_so' - fi - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=yes - hardcode_into_libs=yes - ;; - -newsos6) - version_type=linux # correct to gnu/linux during the next big refactor - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=yes - ;; - -*nto* | *qnx*) - version_type=qnx - need_lib_prefix=no - need_version=no - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=no - hardcode_into_libs=yes - dynamic_linker='ldqnx.so' - ;; - -openbsd*) - version_type=sunos - sys_lib_dlsearch_path_spec="/usr/lib" - need_lib_prefix=no - # Some older versions of OpenBSD (3.3 at least) *do* need versioned libs. - case $host_os in - openbsd3.3 | openbsd3.3.*) need_version=yes ;; - *) need_version=no ;; - esac - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' - finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' - shlibpath_var=LD_LIBRARY_PATH - if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then - case $host_os in - openbsd2.[89] | openbsd2.[89].*) - shlibpath_overrides_runpath=no - ;; - *) - shlibpath_overrides_runpath=yes - ;; - esac - else - shlibpath_overrides_runpath=yes - fi - ;; - -os2*) - libname_spec='$name' - shrext_cmds=".dll" - need_lib_prefix=no - library_names_spec='$libname${shared_ext} $libname.a' - dynamic_linker='OS/2 ld.exe' - shlibpath_var=LIBPATH - ;; - -osf3* | osf4* | osf5*) - version_type=osf - need_lib_prefix=no - need_version=no - soname_spec='${libname}${release}${shared_ext}$major' - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - shlibpath_var=LD_LIBRARY_PATH - sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib" - sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec" - ;; - -rdos*) - dynamic_linker=no - ;; - -solaris*) - version_type=linux # correct to gnu/linux during the next big refactor - need_lib_prefix=no - need_version=no - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=yes - hardcode_into_libs=yes - # ldd complains unless libraries are executable - postinstall_cmds='chmod +x $lib' - ;; - -sunos4*) - version_type=sunos - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' - finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir' - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=yes - if test "$with_gnu_ld" = yes; then - need_lib_prefix=no - fi - need_version=yes - ;; - -sysv4 | sysv4.3*) - version_type=linux # correct to gnu/linux during the next big refactor - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - shlibpath_var=LD_LIBRARY_PATH - case $host_vendor in - sni) - shlibpath_overrides_runpath=no - need_lib_prefix=no - runpath_var=LD_RUN_PATH - ;; - siemens) - need_lib_prefix=no - ;; - motorola) - need_lib_prefix=no - need_version=no - shlibpath_overrides_runpath=no - sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib' - ;; - esac - ;; - -sysv4*MP*) - if test -d /usr/nec ;then - version_type=linux # correct to gnu/linux during the next big refactor - library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}' - soname_spec='$libname${shared_ext}.$major' - shlibpath_var=LD_LIBRARY_PATH - fi - ;; - -sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) - version_type=freebsd-elf - need_lib_prefix=no - need_version=no - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=yes - hardcode_into_libs=yes - if test "$with_gnu_ld" = yes; then - sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib' - else - sys_lib_search_path_spec='/usr/ccs/lib /usr/lib' - case $host_os in - sco3.2v5*) - sys_lib_search_path_spec="$sys_lib_search_path_spec /lib" - ;; - esac - fi - sys_lib_dlsearch_path_spec='/usr/lib' - ;; - -tpf*) - # TPF is a cross-target only. Preferred cross-host = GNU/Linux. - version_type=linux # correct to gnu/linux during the next big refactor - need_lib_prefix=no - need_version=no - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=no - hardcode_into_libs=yes - ;; - -uts4*) - version_type=linux # correct to gnu/linux during the next big refactor - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - shlibpath_var=LD_LIBRARY_PATH - ;; - -*) - dynamic_linker=no - ;; -esac -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $dynamic_linker" >&5 -$as_echo "$dynamic_linker" >&6; } -test "$dynamic_linker" = no && can_build_shared=no - -variables_saved_for_relink="PATH $shlibpath_var $runpath_var" -if test "$GCC" = yes; then - variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" -fi - -if test "${lt_cv_sys_lib_search_path_spec+set}" = set; then - sys_lib_search_path_spec="$lt_cv_sys_lib_search_path_spec" -fi -if test "${lt_cv_sys_lib_dlsearch_path_spec+set}" = set; then - sys_lib_dlsearch_path_spec="$lt_cv_sys_lib_dlsearch_path_spec" -fi - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to hardcode library paths into programs" >&5 -$as_echo_n "checking how to hardcode library paths into programs... " >&6; } -hardcode_action_CXX= -if test -n "$hardcode_libdir_flag_spec_CXX" || - test -n "$runpath_var_CXX" || - test "X$hardcode_automatic_CXX" = "Xyes" ; then - - # We can hardcode non-existent directories. - if test "$hardcode_direct_CXX" != no && - # If the only mechanism to avoid hardcoding is shlibpath_var, we - # have to relink, otherwise we might link with an installed library - # when we should be linking with a yet-to-be-installed one - ## test "$_LT_TAGVAR(hardcode_shlibpath_var, CXX)" != no && - test "$hardcode_minus_L_CXX" != no; then - # Linking always hardcodes the temporary library directory. - hardcode_action_CXX=relink - else - # We can link without hardcoding, and we can hardcode nonexisting dirs. - hardcode_action_CXX=immediate - fi -else - # We cannot hardcode anything, or else we can only hardcode existing - # directories. - hardcode_action_CXX=unsupported -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $hardcode_action_CXX" >&5 -$as_echo "$hardcode_action_CXX" >&6; } - -if test "$hardcode_action_CXX" = relink || - test "$inherit_rpath_CXX" = yes; then - # Fast installation is not supported - enable_fast_install=no -elif test "$shlibpath_overrides_runpath" = yes || - test "$enable_shared" = no; then - # Fast installation is not necessary - enable_fast_install=needless -fi - - - - - - - - fi # test -n "$compiler" - - CC=$lt_save_CC - CFLAGS=$lt_save_CFLAGS - LDCXX=$LD - LD=$lt_save_LD - GCC=$lt_save_GCC - with_gnu_ld=$lt_save_with_gnu_ld - lt_cv_path_LDCXX=$lt_cv_path_LD - lt_cv_path_LD=$lt_save_path_LD - lt_cv_prog_gnu_ldcxx=$lt_cv_prog_gnu_ld - lt_cv_prog_gnu_ld=$lt_save_with_gnu_ld -fi # test "$_lt_caught_CXX_error" != yes - -ac_ext=c -ac_cpp='$CPP $CPPFLAGS' -ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_c_compiler_gnu - - - - - - - - - - - - - - - - ac_config_commands="$ac_config_commands libtool" - - - - -# Only expand once: - - - -#enable -D_GNU_SOURCE since the return code value of getaddrinfo -#ifdefed with __USE_GNU -#features.h header undef's __USE_GNU and defines it only if _GNU_SOURCE is defined -#hence this define for gcc -# Check whether --enable-debug was given. -if test "${enable_debug+set}" = set; then : - enableval=$enable_debug; -else - enable_debug=no -fi - - -if test "x$enable_debug" = xyes; then - if test "x$init_cflags" = x; then - CFLAGS="" - fi - CFLAGS="$CFLAGS -g -O0 -D_GNU_SOURCE" -else - if test "x$init_cflags" = x; then - CFLAGS="-g -O2 -D_GNU_SOURCE" - fi -fi - -if test "x$enable_debug" = xyes; then - if test "x$init_cxxflags" = x; then - CXXFLAGS="" - fi - CXXFLAGS="$CXXFLAGS -g -O0" -else - if test "x$init_cxxflags" = x; then - CXXFLAGS="-g -O2" - fi -fi - - -# Check whether --with-syncapi was given. -if test "${with_syncapi+set}" = set; then : - withval=$with_syncapi; -else - with_syncapi=yes -fi - - -# Checks for libraries. -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for pthread_mutex_lock in -lpthread" >&5 -$as_echo_n "checking for pthread_mutex_lock in -lpthread... " >&6; } -if ${ac_cv_lib_pthread_pthread_mutex_lock+:} false; then : - $as_echo_n "(cached) " >&6 -else - ac_check_lib_save_LIBS=$LIBS -LIBS="-lpthread $LIBS" -cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -/* Override any GCC internal prototype to avoid an error. - Use char because int might match the return type of a GCC - builtin and then its argument prototype would still apply. */ -#ifdef __cplusplus -extern "C" -#endif -char pthread_mutex_lock (); -int -main () -{ -return pthread_mutex_lock (); - ; - return 0; -} -_ACEOF -if ac_fn_c_try_link "$LINENO"; then : - ac_cv_lib_pthread_pthread_mutex_lock=yes -else - ac_cv_lib_pthread_pthread_mutex_lock=no -fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext -LIBS=$ac_check_lib_save_LIBS -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_pthread_pthread_mutex_lock" >&5 -$as_echo "$ac_cv_lib_pthread_pthread_mutex_lock" >&6; } -if test "x$ac_cv_lib_pthread_pthread_mutex_lock" = xyes; then : - have_pthread=yes -else - have_pthread=no -fi - - -if test "x$with_syncapi" != xno && test "x$have_pthread" = xno; then - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cannot build SyncAPI -- pthread not found" >&5 -$as_echo "$as_me: WARNING: cannot build SyncAPI -- pthread not found" >&2;} - with_syncapi=no -fi -if test "x$with_syncapi" != xno; then - { $as_echo "$as_me:${as_lineno-$LINENO}: building with SyncAPI support" >&5 -$as_echo "$as_me: building with SyncAPI support" >&6;} -else - { $as_echo "$as_me:${as_lineno-$LINENO}: building without SyncAPI support" >&5 -$as_echo "$as_me: building without SyncAPI support" >&6;} -fi - - if test "x$with_syncapi" != xno; then - WANT_SYNCAPI_TRUE= - WANT_SYNCAPI_FALSE='#' -else - WANT_SYNCAPI_TRUE='#' - WANT_SYNCAPI_FALSE= -fi - - -# Checks for header files. -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header files" >&5 -$as_echo_n "checking for ANSI C header files... " >&6; } -if ${ac_cv_header_stdc+:} false; then : - $as_echo_n "(cached) " >&6 -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include -#include -#include -#include - -int -main () -{ - - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - ac_cv_header_stdc=yes -else - ac_cv_header_stdc=no -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext - -if test $ac_cv_header_stdc = yes; then - # SunOS 4.x string.h does not declare mem*, contrary to ANSI. - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include - -_ACEOF -if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | - $EGREP "memchr" >/dev/null 2>&1; then : - -else - ac_cv_header_stdc=no -fi -rm -f conftest* - -fi - -if test $ac_cv_header_stdc = yes; then - # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include - -_ACEOF -if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | - $EGREP "free" >/dev/null 2>&1; then : - -else - ac_cv_header_stdc=no -fi -rm -f conftest* - -fi - -if test $ac_cv_header_stdc = yes; then - # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi. - if test "$cross_compiling" = yes; then : - : -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include -#include -#if ((' ' & 0x0FF) == 0x020) -# define ISLOWER(c) ('a' <= (c) && (c) <= 'z') -# define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c)) -#else -# define ISLOWER(c) \ - (('a' <= (c) && (c) <= 'i') \ - || ('j' <= (c) && (c) <= 'r') \ - || ('s' <= (c) && (c) <= 'z')) -# define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c)) -#endif - -#define XOR(e, f) (((e) && !(f)) || (!(e) && (f))) -int -main () -{ - int i; - for (i = 0; i < 256; i++) - if (XOR (islower (i), ISLOWER (i)) - || toupper (i) != TOUPPER (i)) - return 2; - return 0; -} -_ACEOF -if ac_fn_c_try_run "$LINENO"; then : - -else - ac_cv_header_stdc=no -fi -rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ - conftest.$ac_objext conftest.beam conftest.$ac_ext -fi - -fi -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdc" >&5 -$as_echo "$ac_cv_header_stdc" >&6; } -if test $ac_cv_header_stdc = yes; then - -$as_echo "#define STDC_HEADERS 1" >>confdefs.h - -fi - -for ac_header in arpa/inet.h fcntl.h netdb.h netinet/in.h stdlib.h string.h sys/socket.h sys/time.h unistd.h sys/utsname.h -do : - as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` -ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default" -if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : - cat >>confdefs.h <<_ACEOF -#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 -_ACEOF - -fi - -done - - -# Checks for typedefs, structures, and compiler characteristics. -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for an ANSI C-conforming const" >&5 -$as_echo_n "checking for an ANSI C-conforming const... " >&6; } -if ${ac_cv_c_const+:} false; then : - $as_echo_n "(cached) " >&6 -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -int -main () -{ - -#ifndef __cplusplus - /* Ultrix mips cc rejects this sort of thing. */ - typedef int charset[2]; - const charset cs = { 0, 0 }; - /* SunOS 4.1.1 cc rejects this. */ - char const *const *pcpcc; - char **ppc; - /* NEC SVR4.0.2 mips cc rejects this. */ - struct point {int x, y;}; - static struct point const zero = {0,0}; - /* AIX XL C 1.02.0.0 rejects this. - It does not let you subtract one const X* pointer from another in - an arm of an if-expression whose if-part is not a constant - expression */ - const char *g = "string"; - pcpcc = &g + (g ? g-g : 0); - /* HPUX 7.0 cc rejects these. */ - ++pcpcc; - ppc = (char**) pcpcc; - pcpcc = (char const *const *) ppc; - { /* SCO 3.2v4 cc rejects this sort of thing. */ - char tx; - char *t = &tx; - char const *s = 0 ? (char *) 0 : (char const *) 0; - - *t++ = 0; - if (s) return 0; - } - { /* Someone thinks the Sun supposedly-ANSI compiler will reject this. */ - int x[] = {25, 17}; - const int *foo = &x[0]; - ++foo; - } - { /* Sun SC1.0 ANSI compiler rejects this -- but not the above. */ - typedef const int *iptr; - iptr p = 0; - ++p; - } - { /* AIX XL C 1.02.0.0 rejects this sort of thing, saying - "k.c", line 2.27: 1506-025 (S) Operand must be a modifiable lvalue. */ - struct s { int j; const int *ap[3]; } bx; - struct s *b = &bx; b->j = 5; - } - { /* ULTRIX-32 V3.1 (Rev 9) vcc rejects this */ - const int foo = 10; - if (!foo) return 0; - } - return !cs[0] && !zero.x; -#endif - - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - ac_cv_c_const=yes -else - ac_cv_c_const=no -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_const" >&5 -$as_echo "$ac_cv_c_const" >&6; } -if test $ac_cv_c_const = no; then - -$as_echo "#define const /**/" >>confdefs.h - -fi - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for inline" >&5 -$as_echo_n "checking for inline... " >&6; } -if ${ac_cv_c_inline+:} false; then : - $as_echo_n "(cached) " >&6 -else - ac_cv_c_inline=no -for ac_kw in inline __inline__ __inline; do - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#ifndef __cplusplus -typedef int foo_t; -static $ac_kw foo_t static_foo () {return 0; } -$ac_kw foo_t foo () {return 0; } -#endif - -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - ac_cv_c_inline=$ac_kw -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext - test "$ac_cv_c_inline" != no && break -done - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_inline" >&5 -$as_echo "$ac_cv_c_inline" >&6; } - -case $ac_cv_c_inline in - inline | yes) ;; - *) - case $ac_cv_c_inline in - no) ac_val=;; - *) ac_val=$ac_cv_c_inline;; - esac - cat >>confdefs.h <<_ACEOF -#ifndef __cplusplus -#define inline $ac_val -#endif -_ACEOF - ;; -esac - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether time.h and sys/time.h may both be included" >&5 -$as_echo_n "checking whether time.h and sys/time.h may both be included... " >&6; } -if ${ac_cv_header_time+:} false; then : - $as_echo_n "(cached) " >&6 -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include -#include -#include - -int -main () -{ -if ((struct tm *) 0) -return 0; - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - ac_cv_header_time=yes -else - ac_cv_header_time=no -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_time" >&5 -$as_echo "$ac_cv_header_time" >&6; } -if test $ac_cv_header_time = yes; then - -$as_echo "#define TIME_WITH_SYS_TIME 1" >>confdefs.h - -fi - -ac_fn_c_check_type "$LINENO" "nfds_t" "ac_cv_type_nfds_t" "#include -" -if test "x$ac_cv_type_nfds_t" = xyes; then : - -$as_echo "#define POLL_NFDS_TYPE nfds_t" >>confdefs.h - -else - -$as_echo "#define POLL_NFDS_TYPE unsigned int" >>confdefs.h - -fi - - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to enable ipv6" >&5 -$as_echo_n "checking whether to enable ipv6... " >&6; } - -if test "$cross_compiling" = yes; then : - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } - ipv6=no -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - /* is AF_INET6 available? */ -#include -#include -main() -{ - if (socket(AF_INET6, SOCK_STREAM, 0) < 0) - exit(1); - else - exit(0); -} - -_ACEOF -if ac_fn_c_try_run "$LINENO"; then : - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; } - ipv6=yes -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } - ipv6=no -fi -rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ - conftest.$ac_objext conftest.beam conftest.$ac_ext -fi - - -if test x"$ipv6" = xyes; then - USEIPV6="-DZOO_IPV6_ENABLED" - -fi - -# Checks for library functions. -for ac_func in getcwd gethostbyname gethostname getlogin getpwuid_r gettimeofday getuid memmove memset poll socket strchr strdup strerror strtol -do : - as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` -ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var" -if eval test \"x\$"$as_ac_var"\" = x"yes"; then : - cat >>confdefs.h <<_ACEOF -#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 -_ACEOF - -fi -done - - -ac_config_files="$ac_config_files Makefile" - -cat >confcache <<\_ACEOF -# This file is a shell script that caches the results of configure -# tests run on this system so they can be shared between configure -# scripts and configure runs, see configure's option --config-cache. -# It is not useful on other systems. If it contains results you don't -# want to keep, you may remove or edit it. -# -# config.status only pays attention to the cache file if you give it -# the --recheck option to rerun configure. -# -# `ac_cv_env_foo' variables (set or unset) will be overridden when -# loading this file, other *unset* `ac_cv_foo' will be assigned the -# following values. - -_ACEOF - -# The following way of writing the cache mishandles newlines in values, -# but we know of no workaround that is simple, portable, and efficient. -# So, we kill variables containing newlines. -# Ultrix sh set writes to stderr and can't be redirected directly, -# and sets the high bit in the cache file unless we assign to the vars. -( - for ac_var in `(set) 2>&1 | sed -n 's/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'`; do - eval ac_val=\$$ac_var - case $ac_val in #( - *${as_nl}*) - case $ac_var in #( - *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 -$as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; - esac - case $ac_var in #( - _ | IFS | as_nl) ;; #( - BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( - *) { eval $ac_var=; unset $ac_var;} ;; - esac ;; - esac - done - - (set) 2>&1 | - case $as_nl`(ac_space=' '; set) 2>&1` in #( - *${as_nl}ac_space=\ *) - # `set' does not quote correctly, so add quotes: double-quote - # substitution turns \\\\ into \\, and sed turns \\ into \. - sed -n \ - "s/'/'\\\\''/g; - s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p" - ;; #( - *) - # `set' quotes correctly as required by POSIX, so do not add quotes. - sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" - ;; - esac | - sort -) | - sed ' - /^ac_cv_env_/b end - t clear - :clear - s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/ - t end - s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/ - :end' >>confcache -if diff "$cache_file" confcache >/dev/null 2>&1; then :; else - if test -w "$cache_file"; then - if test "x$cache_file" != "x/dev/null"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5 -$as_echo "$as_me: updating cache $cache_file" >&6;} - if test ! -f "$cache_file" || test -h "$cache_file"; then - cat confcache >"$cache_file" - else - case $cache_file in #( - */* | ?:*) - mv -f confcache "$cache_file"$$ && - mv -f "$cache_file"$$ "$cache_file" ;; #( - *) - mv -f confcache "$cache_file" ;; - esac - fi - fi - else - { $as_echo "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5 -$as_echo "$as_me: not updating unwritable cache $cache_file" >&6;} - fi -fi -rm -f confcache - -test "x$prefix" = xNONE && prefix=$ac_default_prefix -# Let make expand exec_prefix. -test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' - -DEFS=-DHAVE_CONFIG_H - -ac_libobjs= -ac_ltlibobjs= -U= -for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue - # 1. Remove the extension, and $U if already installed. - ac_script='s/\$U\././;s/\.o$//;s/\.obj$//' - ac_i=`$as_echo "$ac_i" | sed "$ac_script"` - # 2. Prepend LIBOBJDIR. When used with automake>=1.10 LIBOBJDIR - # will be set to the directory where LIBOBJS objects are built. - as_fn_append ac_libobjs " \${LIBOBJDIR}$ac_i\$U.$ac_objext" - as_fn_append ac_ltlibobjs " \${LIBOBJDIR}$ac_i"'$U.lo' -done -LIBOBJS=$ac_libobjs - -LTLIBOBJS=$ac_ltlibobjs - - -if test -z "${DX_COND_doc_TRUE}" && test -z "${DX_COND_doc_FALSE}"; then - as_fn_error $? "conditional \"DX_COND_doc\" was never defined. -Usually this means the macro was only invoked conditionally." "$LINENO" 5 -fi -if test -z "${DX_COND_doc_TRUE}" && test -z "${DX_COND_doc_FALSE}"; then - as_fn_error $? "conditional \"DX_COND_doc\" was never defined. -Usually this means the macro was only invoked conditionally." "$LINENO" 5 -fi -if test -z "${DX_COND_dot_TRUE}" && test -z "${DX_COND_dot_FALSE}"; then - as_fn_error $? "conditional \"DX_COND_dot\" was never defined. -Usually this means the macro was only invoked conditionally." "$LINENO" 5 -fi -if test -z "${DX_COND_dot_TRUE}" && test -z "${DX_COND_dot_FALSE}"; then - as_fn_error $? "conditional \"DX_COND_dot\" was never defined. -Usually this means the macro was only invoked conditionally." "$LINENO" 5 -fi -if test -z "${DX_COND_man_TRUE}" && test -z "${DX_COND_man_FALSE}"; then - as_fn_error $? "conditional \"DX_COND_man\" was never defined. -Usually this means the macro was only invoked conditionally." "$LINENO" 5 -fi -if test -z "${DX_COND_man_TRUE}" && test -z "${DX_COND_man_FALSE}"; then - as_fn_error $? "conditional \"DX_COND_man\" was never defined. -Usually this means the macro was only invoked conditionally." "$LINENO" 5 -fi -if test -z "${DX_COND_rtf_TRUE}" && test -z "${DX_COND_rtf_FALSE}"; then - as_fn_error $? "conditional \"DX_COND_rtf\" was never defined. -Usually this means the macro was only invoked conditionally." "$LINENO" 5 -fi -if test -z "${DX_COND_rtf_TRUE}" && test -z "${DX_COND_rtf_FALSE}"; then - as_fn_error $? "conditional \"DX_COND_rtf\" was never defined. -Usually this means the macro was only invoked conditionally." "$LINENO" 5 -fi -if test -z "${DX_COND_xml_TRUE}" && test -z "${DX_COND_xml_FALSE}"; then - as_fn_error $? "conditional \"DX_COND_xml\" was never defined. -Usually this means the macro was only invoked conditionally." "$LINENO" 5 -fi -if test -z "${DX_COND_xml_TRUE}" && test -z "${DX_COND_xml_FALSE}"; then - as_fn_error $? "conditional \"DX_COND_xml\" was never defined. -Usually this means the macro was only invoked conditionally." "$LINENO" 5 -fi -if test -z "${DX_COND_chm_TRUE}" && test -z "${DX_COND_chm_FALSE}"; then - as_fn_error $? "conditional \"DX_COND_chm\" was never defined. -Usually this means the macro was only invoked conditionally." "$LINENO" 5 -fi -if test -z "${DX_COND_chm_TRUE}" && test -z "${DX_COND_chm_FALSE}"; then - as_fn_error $? "conditional \"DX_COND_chm\" was never defined. -Usually this means the macro was only invoked conditionally." "$LINENO" 5 -fi -if test -z "${DX_COND_chi_TRUE}" && test -z "${DX_COND_chi_FALSE}"; then - as_fn_error $? "conditional \"DX_COND_chi\" was never defined. -Usually this means the macro was only invoked conditionally." "$LINENO" 5 -fi -if test -z "${DX_COND_chi_TRUE}" && test -z "${DX_COND_chi_FALSE}"; then - as_fn_error $? "conditional \"DX_COND_chi\" was never defined. -Usually this means the macro was only invoked conditionally." "$LINENO" 5 -fi -if test -z "${DX_COND_html_TRUE}" && test -z "${DX_COND_html_FALSE}"; then - as_fn_error $? "conditional \"DX_COND_html\" was never defined. -Usually this means the macro was only invoked conditionally." "$LINENO" 5 -fi -if test -z "${DX_COND_html_TRUE}" && test -z "${DX_COND_html_FALSE}"; then - as_fn_error $? "conditional \"DX_COND_html\" was never defined. -Usually this means the macro was only invoked conditionally." "$LINENO" 5 -fi -if test -z "${DX_COND_ps_TRUE}" && test -z "${DX_COND_ps_FALSE}"; then - as_fn_error $? "conditional \"DX_COND_ps\" was never defined. -Usually this means the macro was only invoked conditionally." "$LINENO" 5 -fi -if test -z "${DX_COND_ps_TRUE}" && test -z "${DX_COND_ps_FALSE}"; then - as_fn_error $? "conditional \"DX_COND_ps\" was never defined. -Usually this means the macro was only invoked conditionally." "$LINENO" 5 -fi -if test -z "${DX_COND_pdf_TRUE}" && test -z "${DX_COND_pdf_FALSE}"; then - as_fn_error $? "conditional \"DX_COND_pdf\" was never defined. -Usually this means the macro was only invoked conditionally." "$LINENO" 5 -fi -if test -z "${DX_COND_pdf_TRUE}" && test -z "${DX_COND_pdf_FALSE}"; then - as_fn_error $? "conditional \"DX_COND_pdf\" was never defined. -Usually this means the macro was only invoked conditionally." "$LINENO" 5 -fi -if test -z "${DX_COND_latex_TRUE}" && test -z "${DX_COND_latex_FALSE}"; then - as_fn_error $? "conditional \"DX_COND_latex\" was never defined. -Usually this means the macro was only invoked conditionally." "$LINENO" 5 -fi -if test -z "${DX_COND_latex_TRUE}" && test -z "${DX_COND_latex_FALSE}"; then - as_fn_error $? "conditional \"DX_COND_latex\" was never defined. -Usually this means the macro was only invoked conditionally." "$LINENO" 5 -fi - if test -n "$EXEEXT"; then - am__EXEEXT_TRUE= - am__EXEEXT_FALSE='#' -else - am__EXEEXT_TRUE='#' - am__EXEEXT_FALSE= -fi - -if test -z "${AMDEP_TRUE}" && test -z "${AMDEP_FALSE}"; then - as_fn_error $? "conditional \"AMDEP\" was never defined. -Usually this means the macro was only invoked conditionally." "$LINENO" 5 -fi -if test -z "${am__fastdepCC_TRUE}" && test -z "${am__fastdepCC_FALSE}"; then - as_fn_error $? "conditional \"am__fastdepCC\" was never defined. -Usually this means the macro was only invoked conditionally." "$LINENO" 5 -fi -if test -z "${am__fastdepCXX_TRUE}" && test -z "${am__fastdepCXX_FALSE}"; then - as_fn_error $? "conditional \"am__fastdepCXX\" was never defined. -Usually this means the macro was only invoked conditionally." "$LINENO" 5 -fi -if test -z "${WANT_SYNCAPI_TRUE}" && test -z "${WANT_SYNCAPI_FALSE}"; then - as_fn_error $? "conditional \"WANT_SYNCAPI\" was never defined. -Usually this means the macro was only invoked conditionally." "$LINENO" 5 -fi - -: "${CONFIG_STATUS=./config.status}" -ac_write_fail=0 -ac_clean_files_save=$ac_clean_files -ac_clean_files="$ac_clean_files $CONFIG_STATUS" -{ $as_echo "$as_me:${as_lineno-$LINENO}: creating $CONFIG_STATUS" >&5 -$as_echo "$as_me: creating $CONFIG_STATUS" >&6;} -as_write_fail=0 -cat >$CONFIG_STATUS <<_ASEOF || as_write_fail=1 -#! $SHELL -# Generated by $as_me. -# Run this file to recreate the current configuration. -# Compiler output produced by configure, useful for debugging -# configure, is in config.log if it exists. - -debug=false -ac_cs_recheck=false -ac_cs_silent=false - -SHELL=\${CONFIG_SHELL-$SHELL} -export SHELL -_ASEOF -cat >>$CONFIG_STATUS <<\_ASEOF || as_write_fail=1 -## -------------------- ## -## M4sh Initialization. ## -## -------------------- ## - -# Be more Bourne compatible -DUALCASE=1; export DUALCASE # for MKS sh -if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : - emulate sh - NULLCMD=: - # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which - # is contrary to our usage. Disable this feature. - alias -g '${1+"$@"}'='"$@"' - setopt NO_GLOB_SUBST -else - case `(set -o) 2>/dev/null` in #( - *posix*) : - set -o posix ;; #( - *) : - ;; -esac -fi - - -as_nl=' -' -export as_nl -# Printing a long string crashes Solaris 7 /usr/bin/printf. -as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' -as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo -as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo -# Prefer a ksh shell builtin over an external printf program on Solaris, -# but without wasting forks for bash or zsh. -if test -z "$BASH_VERSION$ZSH_VERSION" \ - && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then - as_echo='print -r --' - as_echo_n='print -rn --' -elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then - as_echo='printf %s\n' - as_echo_n='printf %s' -else - if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then - as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' - as_echo_n='/usr/ucb/echo -n' - else - as_echo_body='eval expr "X$1" : "X\\(.*\\)"' - as_echo_n_body='eval - arg=$1; - case $arg in #( - *"$as_nl"*) - expr "X$arg" : "X\\(.*\\)$as_nl"; - arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; - esac; - expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" - ' - export as_echo_n_body - as_echo_n='sh -c $as_echo_n_body as_echo' - fi - export as_echo_body - as_echo='sh -c $as_echo_body as_echo' -fi - -# The user is always right. -if test "${PATH_SEPARATOR+set}" != set; then - PATH_SEPARATOR=: - (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { - (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || - PATH_SEPARATOR=';' - } -fi - - -# IFS -# We need space, tab and new line, in precisely that order. Quoting is -# there to prevent editors from complaining about space-tab. -# (If _AS_PATH_WALK were called with IFS unset, it would disable word -# splitting by setting IFS to empty value.) -IFS=" "" $as_nl" - -# Find who we are. Look in the path if we contain no directory separator. -as_myself= -case $0 in #(( - *[\\/]* ) as_myself=$0 ;; - *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break - done -IFS=$as_save_IFS - - ;; -esac -# We did not find ourselves, most probably we were run as `sh COMMAND' -# in which case we are not to be found in the path. -if test "x$as_myself" = x; then - as_myself=$0 -fi -if test ! -f "$as_myself"; then - $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 - exit 1 -fi - -# Unset variables that we do not need and which cause bugs (e.g. in -# pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" -# suppresses any "Segmentation fault" message there. '((' could -# trigger a bug in pdksh 5.2.14. -for as_var in BASH_ENV ENV MAIL MAILPATH -do eval test x\${$as_var+set} = xset \ - && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : -done -PS1='$ ' -PS2='> ' -PS4='+ ' - -# NLS nuisances. -LC_ALL=C -export LC_ALL -LANGUAGE=C -export LANGUAGE - -# CDPATH. -(unset CDPATH) >/dev/null 2>&1 && unset CDPATH - - -# as_fn_error STATUS ERROR [LINENO LOG_FD] -# ---------------------------------------- -# Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are -# provided, also output the error to LOG_FD, referencing LINENO. Then exit the -# script with STATUS, using 1 if that was 0. -as_fn_error () -{ - as_status=$1; test $as_status -eq 0 && as_status=1 - if test "$4"; then - as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack - $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 - fi - $as_echo "$as_me: error: $2" >&2 - as_fn_exit $as_status -} # as_fn_error - - -# as_fn_set_status STATUS -# ----------------------- -# Set $? to STATUS, without forking. -as_fn_set_status () -{ - return $1 -} # as_fn_set_status - -# as_fn_exit STATUS -# ----------------- -# Exit the shell with STATUS, even in a "trap 0" or "set -e" context. -as_fn_exit () -{ - set +e - as_fn_set_status $1 - exit $1 -} # as_fn_exit - -# as_fn_unset VAR -# --------------- -# Portably unset VAR. -as_fn_unset () -{ - { eval $1=; unset $1;} -} -as_unset=as_fn_unset -# as_fn_append VAR VALUE -# ---------------------- -# Append the text in VALUE to the end of the definition contained in VAR. Take -# advantage of any shell optimizations that allow amortized linear growth over -# repeated appends, instead of the typical quadratic growth present in naive -# implementations. -if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : - eval 'as_fn_append () - { - eval $1+=\$2 - }' -else - as_fn_append () - { - eval $1=\$$1\$2 - } -fi # as_fn_append - -# as_fn_arith ARG... -# ------------------ -# Perform arithmetic evaluation on the ARGs, and store the result in the -# global $as_val. Take advantage of shells that can avoid forks. The arguments -# must be portable across $(()) and expr. -if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : - eval 'as_fn_arith () - { - as_val=$(( $* )) - }' -else - as_fn_arith () - { - as_val=`expr "$@" || test $? -eq 1` - } -fi # as_fn_arith - - -if expr a : '\(a\)' >/dev/null 2>&1 && - test "X`expr 00001 : '.*\(...\)'`" = X001; then - as_expr=expr -else - as_expr=false -fi - -if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then - as_basename=basename -else - as_basename=false -fi - -if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then - as_dirname=dirname -else - as_dirname=false -fi - -as_me=`$as_basename -- "$0" || -$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ - X"$0" : 'X\(//\)$' \| \ - X"$0" : 'X\(/\)' \| . 2>/dev/null || -$as_echo X/"$0" | - sed '/^.*\/\([^/][^/]*\)\/*$/{ - s//\1/ - q - } - /^X\/\(\/\/\)$/{ - s//\1/ - q - } - /^X\/\(\/\).*/{ - s//\1/ - q - } - s/.*/./; q'` - -# Avoid depending upon Character Ranges. -as_cr_letters='abcdefghijklmnopqrstuvwxyz' -as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' -as_cr_Letters=$as_cr_letters$as_cr_LETTERS -as_cr_digits='0123456789' -as_cr_alnum=$as_cr_Letters$as_cr_digits - -ECHO_C= ECHO_N= ECHO_T= -case `echo -n x` in #((((( --n*) - case `echo 'xy\c'` in - *c*) ECHO_T=' ';; # ECHO_T is single tab character. - xy) ECHO_C='\c';; - *) echo `echo ksh88 bug on AIX 6.1` > /dev/null - ECHO_T=' ';; - esac;; -*) - ECHO_N='-n';; -esac - -rm -f conf$$ conf$$.exe conf$$.file -if test -d conf$$.dir; then - rm -f conf$$.dir/conf$$.file -else - rm -f conf$$.dir - mkdir conf$$.dir 2>/dev/null -fi -if (echo >conf$$.file) 2>/dev/null; then - if ln -s conf$$.file conf$$ 2>/dev/null; then - as_ln_s='ln -s' - # ... but there are two gotchas: - # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. - # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. - # In both cases, we have to default to `cp -pR'. - ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || - as_ln_s='cp -pR' - elif ln conf$$.file conf$$ 2>/dev/null; then - as_ln_s=ln - else - as_ln_s='cp -pR' - fi -else - as_ln_s='cp -pR' -fi -rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file -rmdir conf$$.dir 2>/dev/null - - -# as_fn_mkdir_p -# ------------- -# Create "$as_dir" as a directory, including parents if necessary. -as_fn_mkdir_p () -{ - - case $as_dir in #( - -*) as_dir=./$as_dir;; - esac - test -d "$as_dir" || eval $as_mkdir_p || { - as_dirs= - while :; do - case $as_dir in #( - *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( - *) as_qdir=$as_dir;; - esac - as_dirs="'$as_qdir' $as_dirs" - as_dir=`$as_dirname -- "$as_dir" || -$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ - X"$as_dir" : 'X\(//\)[^/]' \| \ - X"$as_dir" : 'X\(//\)$' \| \ - X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || -$as_echo X"$as_dir" | - sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ - s//\1/ - q - } - /^X\(\/\/\)[^/].*/{ - s//\1/ - q - } - /^X\(\/\/\)$/{ - s//\1/ - q - } - /^X\(\/\).*/{ - s//\1/ - q - } - s/.*/./; q'` - test -d "$as_dir" && break - done - test -z "$as_dirs" || eval "mkdir $as_dirs" - } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" - - -} # as_fn_mkdir_p -if mkdir -p . 2>/dev/null; then - as_mkdir_p='mkdir -p "$as_dir"' -else - test -d ./-p && rmdir ./-p - as_mkdir_p=false -fi - - -# as_fn_executable_p FILE -# ----------------------- -# Test if FILE is an executable regular file. -as_fn_executable_p () -{ - test -f "$1" && test -x "$1" -} # as_fn_executable_p -as_test_x='test -x' -as_executable_p=as_fn_executable_p - -# Sed expression to map a string onto a valid CPP name. -as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" - -# Sed expression to map a string onto a valid variable name. -as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" - - -exec 6>&1 -## ----------------------------------- ## -## Main body of $CONFIG_STATUS script. ## -## ----------------------------------- ## -_ASEOF -test $as_write_fail = 0 && chmod +x $CONFIG_STATUS || ac_write_fail=1 - -cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 -# Save the log message, to keep $0 and so on meaningful, and to -# report actual input values of CONFIG_FILES etc. instead of their -# values after options handling. -ac_log=" -This file was extended by zookeeper C client $as_me 3.4.6, which was -generated by GNU Autoconf 2.69. Invocation command line was - - CONFIG_FILES = $CONFIG_FILES - CONFIG_HEADERS = $CONFIG_HEADERS - CONFIG_LINKS = $CONFIG_LINKS - CONFIG_COMMANDS = $CONFIG_COMMANDS - $ $0 $@ - -on `(hostname || uname -n) 2>/dev/null | sed 1q` -" - -_ACEOF - -case $ac_config_files in *" -"*) set x $ac_config_files; shift; ac_config_files=$*;; -esac - -case $ac_config_headers in *" -"*) set x $ac_config_headers; shift; ac_config_headers=$*;; -esac - - -cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 -# Files that config.status was made for. -config_files="$ac_config_files" -config_headers="$ac_config_headers" -config_commands="$ac_config_commands" - -_ACEOF - -cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 -ac_cs_usage="\ -\`$as_me' instantiates files and other configuration actions -from templates according to the current configuration. Unless the files -and actions are specified as TAGs, all are instantiated by default. - -Usage: $0 [OPTION]... [TAG]... - - -h, --help print this help, then exit - -V, --version print version number and configuration settings, then exit - --config print configuration, then exit - -q, --quiet, --silent - do not print progress messages - -d, --debug don't remove temporary files - --recheck update $as_me by reconfiguring in the same conditions - --file=FILE[:TEMPLATE] - instantiate the configuration file FILE - --header=FILE[:TEMPLATE] - instantiate the configuration header FILE - -Configuration files: -$config_files - -Configuration headers: -$config_headers - -Configuration commands: -$config_commands - -Report bugs to ." - -_ACEOF -cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 -ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" -ac_cs_version="\\ -zookeeper C client config.status 3.4.6 -configured by $0, generated by GNU Autoconf 2.69, - with options \\"\$ac_cs_config\\" - -Copyright (C) 2012 Free Software Foundation, Inc. -This config.status script is free software; the Free Software Foundation -gives unlimited permission to copy, distribute and modify it." - -ac_pwd='$ac_pwd' -srcdir='$srcdir' -INSTALL='$INSTALL' -MKDIR_P='$MKDIR_P' -AWK='$AWK' -test -n "\$AWK" || AWK=awk -_ACEOF - -cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 -# The default lists apply if the user does not specify any file. -ac_need_defaults=: -while test $# != 0 -do - case $1 in - --*=?*) - ac_option=`expr "X$1" : 'X\([^=]*\)='` - ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'` - ac_shift=: - ;; - --*=) - ac_option=`expr "X$1" : 'X\([^=]*\)='` - ac_optarg= - ac_shift=: - ;; - *) - ac_option=$1 - ac_optarg=$2 - ac_shift=shift - ;; - esac - - case $ac_option in - # Handling of the options. - -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) - ac_cs_recheck=: ;; - --version | --versio | --versi | --vers | --ver | --ve | --v | -V ) - $as_echo "$ac_cs_version"; exit ;; - --config | --confi | --conf | --con | --co | --c ) - $as_echo "$ac_cs_config"; exit ;; - --debug | --debu | --deb | --de | --d | -d ) - debug=: ;; - --file | --fil | --fi | --f ) - $ac_shift - case $ac_optarg in - *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; - '') as_fn_error $? "missing file argument" ;; - esac - as_fn_append CONFIG_FILES " '$ac_optarg'" - ac_need_defaults=false;; - --header | --heade | --head | --hea ) - $ac_shift - case $ac_optarg in - *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; - esac - as_fn_append CONFIG_HEADERS " '$ac_optarg'" - ac_need_defaults=false;; - --he | --h) - # Conflict between --help and --header - as_fn_error $? "ambiguous option: \`$1' -Try \`$0 --help' for more information.";; - --help | --hel | -h ) - $as_echo "$ac_cs_usage"; exit ;; - -q | -quiet | --quiet | --quie | --qui | --qu | --q \ - | -silent | --silent | --silen | --sile | --sil | --si | --s) - ac_cs_silent=: ;; - - # This is an error. - -*) as_fn_error $? "unrecognized option: \`$1' -Try \`$0 --help' for more information." ;; - - *) as_fn_append ac_config_targets " $1" - ac_need_defaults=false ;; - - esac - shift -done - -ac_configure_extra_args= - -if $ac_cs_silent; then - exec 6>/dev/null - ac_configure_extra_args="$ac_configure_extra_args --silent" -fi - -_ACEOF -cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 -if \$ac_cs_recheck; then - set X $SHELL '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion - shift - \$as_echo "running CONFIG_SHELL=$SHELL \$*" >&6 - CONFIG_SHELL='$SHELL' - export CONFIG_SHELL - exec "\$@" -fi - -_ACEOF -cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 -exec 5>>config.log -{ - echo - sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX -## Running $as_me. ## -_ASBOX - $as_echo "$ac_log" -} >&5 - -_ACEOF -cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 -# -# INIT-COMMANDS -# -AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir" - - -# The HP-UX ksh and POSIX shell print the target directory to stdout -# if CDPATH is set. -(unset CDPATH) >/dev/null 2>&1 && unset CDPATH - -sed_quote_subst='$sed_quote_subst' -double_quote_subst='$double_quote_subst' -delay_variable_subst='$delay_variable_subst' -macro_version='`$ECHO "$macro_version" | $SED "$delay_single_quote_subst"`' -macro_revision='`$ECHO "$macro_revision" | $SED "$delay_single_quote_subst"`' -enable_shared='`$ECHO "$enable_shared" | $SED "$delay_single_quote_subst"`' -enable_static='`$ECHO "$enable_static" | $SED "$delay_single_quote_subst"`' -pic_mode='`$ECHO "$pic_mode" | $SED "$delay_single_quote_subst"`' -enable_fast_install='`$ECHO "$enable_fast_install" | $SED "$delay_single_quote_subst"`' -SHELL='`$ECHO "$SHELL" | $SED "$delay_single_quote_subst"`' -ECHO='`$ECHO "$ECHO" | $SED "$delay_single_quote_subst"`' -PATH_SEPARATOR='`$ECHO "$PATH_SEPARATOR" | $SED "$delay_single_quote_subst"`' -host_alias='`$ECHO "$host_alias" | $SED "$delay_single_quote_subst"`' -host='`$ECHO "$host" | $SED "$delay_single_quote_subst"`' -host_os='`$ECHO "$host_os" | $SED "$delay_single_quote_subst"`' -build_alias='`$ECHO "$build_alias" | $SED "$delay_single_quote_subst"`' -build='`$ECHO "$build" | $SED "$delay_single_quote_subst"`' -build_os='`$ECHO "$build_os" | $SED "$delay_single_quote_subst"`' -SED='`$ECHO "$SED" | $SED "$delay_single_quote_subst"`' -Xsed='`$ECHO "$Xsed" | $SED "$delay_single_quote_subst"`' -GREP='`$ECHO "$GREP" | $SED "$delay_single_quote_subst"`' -EGREP='`$ECHO "$EGREP" | $SED "$delay_single_quote_subst"`' -FGREP='`$ECHO "$FGREP" | $SED "$delay_single_quote_subst"`' -LD='`$ECHO "$LD" | $SED "$delay_single_quote_subst"`' -NM='`$ECHO "$NM" | $SED "$delay_single_quote_subst"`' -LN_S='`$ECHO "$LN_S" | $SED "$delay_single_quote_subst"`' -max_cmd_len='`$ECHO "$max_cmd_len" | $SED "$delay_single_quote_subst"`' -ac_objext='`$ECHO "$ac_objext" | $SED "$delay_single_quote_subst"`' -exeext='`$ECHO "$exeext" | $SED "$delay_single_quote_subst"`' -lt_unset='`$ECHO "$lt_unset" | $SED "$delay_single_quote_subst"`' -lt_SP2NL='`$ECHO "$lt_SP2NL" | $SED "$delay_single_quote_subst"`' -lt_NL2SP='`$ECHO "$lt_NL2SP" | $SED "$delay_single_quote_subst"`' -lt_cv_to_host_file_cmd='`$ECHO "$lt_cv_to_host_file_cmd" | $SED "$delay_single_quote_subst"`' -lt_cv_to_tool_file_cmd='`$ECHO "$lt_cv_to_tool_file_cmd" | $SED "$delay_single_quote_subst"`' -reload_flag='`$ECHO "$reload_flag" | $SED "$delay_single_quote_subst"`' -reload_cmds='`$ECHO "$reload_cmds" | $SED "$delay_single_quote_subst"`' -OBJDUMP='`$ECHO "$OBJDUMP" | $SED "$delay_single_quote_subst"`' -deplibs_check_method='`$ECHO "$deplibs_check_method" | $SED "$delay_single_quote_subst"`' -file_magic_cmd='`$ECHO "$file_magic_cmd" | $SED "$delay_single_quote_subst"`' -file_magic_glob='`$ECHO "$file_magic_glob" | $SED "$delay_single_quote_subst"`' -want_nocaseglob='`$ECHO "$want_nocaseglob" | $SED "$delay_single_quote_subst"`' -DLLTOOL='`$ECHO "$DLLTOOL" | $SED "$delay_single_quote_subst"`' -sharedlib_from_linklib_cmd='`$ECHO "$sharedlib_from_linklib_cmd" | $SED "$delay_single_quote_subst"`' -AR='`$ECHO "$AR" | $SED "$delay_single_quote_subst"`' -AR_FLAGS='`$ECHO "$AR_FLAGS" | $SED "$delay_single_quote_subst"`' -archiver_list_spec='`$ECHO "$archiver_list_spec" | $SED "$delay_single_quote_subst"`' -STRIP='`$ECHO "$STRIP" | $SED "$delay_single_quote_subst"`' -RANLIB='`$ECHO "$RANLIB" | $SED "$delay_single_quote_subst"`' -old_postinstall_cmds='`$ECHO "$old_postinstall_cmds" | $SED "$delay_single_quote_subst"`' -old_postuninstall_cmds='`$ECHO "$old_postuninstall_cmds" | $SED "$delay_single_quote_subst"`' -old_archive_cmds='`$ECHO "$old_archive_cmds" | $SED "$delay_single_quote_subst"`' -lock_old_archive_extraction='`$ECHO "$lock_old_archive_extraction" | $SED "$delay_single_quote_subst"`' -CC='`$ECHO "$CC" | $SED "$delay_single_quote_subst"`' -CFLAGS='`$ECHO "$CFLAGS" | $SED "$delay_single_quote_subst"`' -compiler='`$ECHO "$compiler" | $SED "$delay_single_quote_subst"`' -GCC='`$ECHO "$GCC" | $SED "$delay_single_quote_subst"`' -lt_cv_sys_global_symbol_pipe='`$ECHO "$lt_cv_sys_global_symbol_pipe" | $SED "$delay_single_quote_subst"`' -lt_cv_sys_global_symbol_to_cdecl='`$ECHO "$lt_cv_sys_global_symbol_to_cdecl" | $SED "$delay_single_quote_subst"`' -lt_cv_sys_global_symbol_to_c_name_address='`$ECHO "$lt_cv_sys_global_symbol_to_c_name_address" | $SED "$delay_single_quote_subst"`' -lt_cv_sys_global_symbol_to_c_name_address_lib_prefix='`$ECHO "$lt_cv_sys_global_symbol_to_c_name_address_lib_prefix" | $SED "$delay_single_quote_subst"`' -nm_file_list_spec='`$ECHO "$nm_file_list_spec" | $SED "$delay_single_quote_subst"`' -lt_sysroot='`$ECHO "$lt_sysroot" | $SED "$delay_single_quote_subst"`' -objdir='`$ECHO "$objdir" | $SED "$delay_single_quote_subst"`' -MAGIC_CMD='`$ECHO "$MAGIC_CMD" | $SED "$delay_single_quote_subst"`' -lt_prog_compiler_no_builtin_flag='`$ECHO "$lt_prog_compiler_no_builtin_flag" | $SED "$delay_single_quote_subst"`' -lt_prog_compiler_pic='`$ECHO "$lt_prog_compiler_pic" | $SED "$delay_single_quote_subst"`' -lt_prog_compiler_wl='`$ECHO "$lt_prog_compiler_wl" | $SED "$delay_single_quote_subst"`' -lt_prog_compiler_static='`$ECHO "$lt_prog_compiler_static" | $SED "$delay_single_quote_subst"`' -lt_cv_prog_compiler_c_o='`$ECHO "$lt_cv_prog_compiler_c_o" | $SED "$delay_single_quote_subst"`' -need_locks='`$ECHO "$need_locks" | $SED "$delay_single_quote_subst"`' -MANIFEST_TOOL='`$ECHO "$MANIFEST_TOOL" | $SED "$delay_single_quote_subst"`' -DSYMUTIL='`$ECHO "$DSYMUTIL" | $SED "$delay_single_quote_subst"`' -NMEDIT='`$ECHO "$NMEDIT" | $SED "$delay_single_quote_subst"`' -LIPO='`$ECHO "$LIPO" | $SED "$delay_single_quote_subst"`' -OTOOL='`$ECHO "$OTOOL" | $SED "$delay_single_quote_subst"`' -OTOOL64='`$ECHO "$OTOOL64" | $SED "$delay_single_quote_subst"`' -libext='`$ECHO "$libext" | $SED "$delay_single_quote_subst"`' -shrext_cmds='`$ECHO "$shrext_cmds" | $SED "$delay_single_quote_subst"`' -extract_expsyms_cmds='`$ECHO "$extract_expsyms_cmds" | $SED "$delay_single_quote_subst"`' -archive_cmds_need_lc='`$ECHO "$archive_cmds_need_lc" | $SED "$delay_single_quote_subst"`' -enable_shared_with_static_runtimes='`$ECHO "$enable_shared_with_static_runtimes" | $SED "$delay_single_quote_subst"`' -export_dynamic_flag_spec='`$ECHO "$export_dynamic_flag_spec" | $SED "$delay_single_quote_subst"`' -whole_archive_flag_spec='`$ECHO "$whole_archive_flag_spec" | $SED "$delay_single_quote_subst"`' -compiler_needs_object='`$ECHO "$compiler_needs_object" | $SED "$delay_single_quote_subst"`' -old_archive_from_new_cmds='`$ECHO "$old_archive_from_new_cmds" | $SED "$delay_single_quote_subst"`' -old_archive_from_expsyms_cmds='`$ECHO "$old_archive_from_expsyms_cmds" | $SED "$delay_single_quote_subst"`' -archive_cmds='`$ECHO "$archive_cmds" | $SED "$delay_single_quote_subst"`' -archive_expsym_cmds='`$ECHO "$archive_expsym_cmds" | $SED "$delay_single_quote_subst"`' -module_cmds='`$ECHO "$module_cmds" | $SED "$delay_single_quote_subst"`' -module_expsym_cmds='`$ECHO "$module_expsym_cmds" | $SED "$delay_single_quote_subst"`' -with_gnu_ld='`$ECHO "$with_gnu_ld" | $SED "$delay_single_quote_subst"`' -allow_undefined_flag='`$ECHO "$allow_undefined_flag" | $SED "$delay_single_quote_subst"`' -no_undefined_flag='`$ECHO "$no_undefined_flag" | $SED "$delay_single_quote_subst"`' -hardcode_libdir_flag_spec='`$ECHO "$hardcode_libdir_flag_spec" | $SED "$delay_single_quote_subst"`' -hardcode_libdir_separator='`$ECHO "$hardcode_libdir_separator" | $SED "$delay_single_quote_subst"`' -hardcode_direct='`$ECHO "$hardcode_direct" | $SED "$delay_single_quote_subst"`' -hardcode_direct_absolute='`$ECHO "$hardcode_direct_absolute" | $SED "$delay_single_quote_subst"`' -hardcode_minus_L='`$ECHO "$hardcode_minus_L" | $SED "$delay_single_quote_subst"`' -hardcode_shlibpath_var='`$ECHO "$hardcode_shlibpath_var" | $SED "$delay_single_quote_subst"`' -hardcode_automatic='`$ECHO "$hardcode_automatic" | $SED "$delay_single_quote_subst"`' -inherit_rpath='`$ECHO "$inherit_rpath" | $SED "$delay_single_quote_subst"`' -link_all_deplibs='`$ECHO "$link_all_deplibs" | $SED "$delay_single_quote_subst"`' -always_export_symbols='`$ECHO "$always_export_symbols" | $SED "$delay_single_quote_subst"`' -export_symbols_cmds='`$ECHO "$export_symbols_cmds" | $SED "$delay_single_quote_subst"`' -exclude_expsyms='`$ECHO "$exclude_expsyms" | $SED "$delay_single_quote_subst"`' -include_expsyms='`$ECHO "$include_expsyms" | $SED "$delay_single_quote_subst"`' -prelink_cmds='`$ECHO "$prelink_cmds" | $SED "$delay_single_quote_subst"`' -postlink_cmds='`$ECHO "$postlink_cmds" | $SED "$delay_single_quote_subst"`' -file_list_spec='`$ECHO "$file_list_spec" | $SED "$delay_single_quote_subst"`' -variables_saved_for_relink='`$ECHO "$variables_saved_for_relink" | $SED "$delay_single_quote_subst"`' -need_lib_prefix='`$ECHO "$need_lib_prefix" | $SED "$delay_single_quote_subst"`' -need_version='`$ECHO "$need_version" | $SED "$delay_single_quote_subst"`' -version_type='`$ECHO "$version_type" | $SED "$delay_single_quote_subst"`' -runpath_var='`$ECHO "$runpath_var" | $SED "$delay_single_quote_subst"`' -shlibpath_var='`$ECHO "$shlibpath_var" | $SED "$delay_single_quote_subst"`' -shlibpath_overrides_runpath='`$ECHO "$shlibpath_overrides_runpath" | $SED "$delay_single_quote_subst"`' -libname_spec='`$ECHO "$libname_spec" | $SED "$delay_single_quote_subst"`' -library_names_spec='`$ECHO "$library_names_spec" | $SED "$delay_single_quote_subst"`' -soname_spec='`$ECHO "$soname_spec" | $SED "$delay_single_quote_subst"`' -install_override_mode='`$ECHO "$install_override_mode" | $SED "$delay_single_quote_subst"`' -postinstall_cmds='`$ECHO "$postinstall_cmds" | $SED "$delay_single_quote_subst"`' -postuninstall_cmds='`$ECHO "$postuninstall_cmds" | $SED "$delay_single_quote_subst"`' -finish_cmds='`$ECHO "$finish_cmds" | $SED "$delay_single_quote_subst"`' -finish_eval='`$ECHO "$finish_eval" | $SED "$delay_single_quote_subst"`' -hardcode_into_libs='`$ECHO "$hardcode_into_libs" | $SED "$delay_single_quote_subst"`' -sys_lib_search_path_spec='`$ECHO "$sys_lib_search_path_spec" | $SED "$delay_single_quote_subst"`' -sys_lib_dlsearch_path_spec='`$ECHO "$sys_lib_dlsearch_path_spec" | $SED "$delay_single_quote_subst"`' -hardcode_action='`$ECHO "$hardcode_action" | $SED "$delay_single_quote_subst"`' -enable_dlopen='`$ECHO "$enable_dlopen" | $SED "$delay_single_quote_subst"`' -enable_dlopen_self='`$ECHO "$enable_dlopen_self" | $SED "$delay_single_quote_subst"`' -enable_dlopen_self_static='`$ECHO "$enable_dlopen_self_static" | $SED "$delay_single_quote_subst"`' -old_striplib='`$ECHO "$old_striplib" | $SED "$delay_single_quote_subst"`' -striplib='`$ECHO "$striplib" | $SED "$delay_single_quote_subst"`' -compiler_lib_search_dirs='`$ECHO "$compiler_lib_search_dirs" | $SED "$delay_single_quote_subst"`' -predep_objects='`$ECHO "$predep_objects" | $SED "$delay_single_quote_subst"`' -postdep_objects='`$ECHO "$postdep_objects" | $SED "$delay_single_quote_subst"`' -predeps='`$ECHO "$predeps" | $SED "$delay_single_quote_subst"`' -postdeps='`$ECHO "$postdeps" | $SED "$delay_single_quote_subst"`' -compiler_lib_search_path='`$ECHO "$compiler_lib_search_path" | $SED "$delay_single_quote_subst"`' -LD_CXX='`$ECHO "$LD_CXX" | $SED "$delay_single_quote_subst"`' -reload_flag_CXX='`$ECHO "$reload_flag_CXX" | $SED "$delay_single_quote_subst"`' -reload_cmds_CXX='`$ECHO "$reload_cmds_CXX" | $SED "$delay_single_quote_subst"`' -old_archive_cmds_CXX='`$ECHO "$old_archive_cmds_CXX" | $SED "$delay_single_quote_subst"`' -compiler_CXX='`$ECHO "$compiler_CXX" | $SED "$delay_single_quote_subst"`' -GCC_CXX='`$ECHO "$GCC_CXX" | $SED "$delay_single_quote_subst"`' -lt_prog_compiler_no_builtin_flag_CXX='`$ECHO "$lt_prog_compiler_no_builtin_flag_CXX" | $SED "$delay_single_quote_subst"`' -lt_prog_compiler_pic_CXX='`$ECHO "$lt_prog_compiler_pic_CXX" | $SED "$delay_single_quote_subst"`' -lt_prog_compiler_wl_CXX='`$ECHO "$lt_prog_compiler_wl_CXX" | $SED "$delay_single_quote_subst"`' -lt_prog_compiler_static_CXX='`$ECHO "$lt_prog_compiler_static_CXX" | $SED "$delay_single_quote_subst"`' -lt_cv_prog_compiler_c_o_CXX='`$ECHO "$lt_cv_prog_compiler_c_o_CXX" | $SED "$delay_single_quote_subst"`' -archive_cmds_need_lc_CXX='`$ECHO "$archive_cmds_need_lc_CXX" | $SED "$delay_single_quote_subst"`' -enable_shared_with_static_runtimes_CXX='`$ECHO "$enable_shared_with_static_runtimes_CXX" | $SED "$delay_single_quote_subst"`' -export_dynamic_flag_spec_CXX='`$ECHO "$export_dynamic_flag_spec_CXX" | $SED "$delay_single_quote_subst"`' -whole_archive_flag_spec_CXX='`$ECHO "$whole_archive_flag_spec_CXX" | $SED "$delay_single_quote_subst"`' -compiler_needs_object_CXX='`$ECHO "$compiler_needs_object_CXX" | $SED "$delay_single_quote_subst"`' -old_archive_from_new_cmds_CXX='`$ECHO "$old_archive_from_new_cmds_CXX" | $SED "$delay_single_quote_subst"`' -old_archive_from_expsyms_cmds_CXX='`$ECHO "$old_archive_from_expsyms_cmds_CXX" | $SED "$delay_single_quote_subst"`' -archive_cmds_CXX='`$ECHO "$archive_cmds_CXX" | $SED "$delay_single_quote_subst"`' -archive_expsym_cmds_CXX='`$ECHO "$archive_expsym_cmds_CXX" | $SED "$delay_single_quote_subst"`' -module_cmds_CXX='`$ECHO "$module_cmds_CXX" | $SED "$delay_single_quote_subst"`' -module_expsym_cmds_CXX='`$ECHO "$module_expsym_cmds_CXX" | $SED "$delay_single_quote_subst"`' -with_gnu_ld_CXX='`$ECHO "$with_gnu_ld_CXX" | $SED "$delay_single_quote_subst"`' -allow_undefined_flag_CXX='`$ECHO "$allow_undefined_flag_CXX" | $SED "$delay_single_quote_subst"`' -no_undefined_flag_CXX='`$ECHO "$no_undefined_flag_CXX" | $SED "$delay_single_quote_subst"`' -hardcode_libdir_flag_spec_CXX='`$ECHO "$hardcode_libdir_flag_spec_CXX" | $SED "$delay_single_quote_subst"`' -hardcode_libdir_separator_CXX='`$ECHO "$hardcode_libdir_separator_CXX" | $SED "$delay_single_quote_subst"`' -hardcode_direct_CXX='`$ECHO "$hardcode_direct_CXX" | $SED "$delay_single_quote_subst"`' -hardcode_direct_absolute_CXX='`$ECHO "$hardcode_direct_absolute_CXX" | $SED "$delay_single_quote_subst"`' -hardcode_minus_L_CXX='`$ECHO "$hardcode_minus_L_CXX" | $SED "$delay_single_quote_subst"`' -hardcode_shlibpath_var_CXX='`$ECHO "$hardcode_shlibpath_var_CXX" | $SED "$delay_single_quote_subst"`' -hardcode_automatic_CXX='`$ECHO "$hardcode_automatic_CXX" | $SED "$delay_single_quote_subst"`' -inherit_rpath_CXX='`$ECHO "$inherit_rpath_CXX" | $SED "$delay_single_quote_subst"`' -link_all_deplibs_CXX='`$ECHO "$link_all_deplibs_CXX" | $SED "$delay_single_quote_subst"`' -always_export_symbols_CXX='`$ECHO "$always_export_symbols_CXX" | $SED "$delay_single_quote_subst"`' -export_symbols_cmds_CXX='`$ECHO "$export_symbols_cmds_CXX" | $SED "$delay_single_quote_subst"`' -exclude_expsyms_CXX='`$ECHO "$exclude_expsyms_CXX" | $SED "$delay_single_quote_subst"`' -include_expsyms_CXX='`$ECHO "$include_expsyms_CXX" | $SED "$delay_single_quote_subst"`' -prelink_cmds_CXX='`$ECHO "$prelink_cmds_CXX" | $SED "$delay_single_quote_subst"`' -postlink_cmds_CXX='`$ECHO "$postlink_cmds_CXX" | $SED "$delay_single_quote_subst"`' -file_list_spec_CXX='`$ECHO "$file_list_spec_CXX" | $SED "$delay_single_quote_subst"`' -hardcode_action_CXX='`$ECHO "$hardcode_action_CXX" | $SED "$delay_single_quote_subst"`' -compiler_lib_search_dirs_CXX='`$ECHO "$compiler_lib_search_dirs_CXX" | $SED "$delay_single_quote_subst"`' -predep_objects_CXX='`$ECHO "$predep_objects_CXX" | $SED "$delay_single_quote_subst"`' -postdep_objects_CXX='`$ECHO "$postdep_objects_CXX" | $SED "$delay_single_quote_subst"`' -predeps_CXX='`$ECHO "$predeps_CXX" | $SED "$delay_single_quote_subst"`' -postdeps_CXX='`$ECHO "$postdeps_CXX" | $SED "$delay_single_quote_subst"`' -compiler_lib_search_path_CXX='`$ECHO "$compiler_lib_search_path_CXX" | $SED "$delay_single_quote_subst"`' - -LTCC='$LTCC' -LTCFLAGS='$LTCFLAGS' -compiler='$compiler_DEFAULT' - -# A function that is used when there is no print builtin or printf. -func_fallback_echo () -{ - eval 'cat <<_LTECHO_EOF -\$1 -_LTECHO_EOF' -} - -# Quote evaled strings. -for var in SHELL \ -ECHO \ -PATH_SEPARATOR \ -SED \ -GREP \ -EGREP \ -FGREP \ -LD \ -NM \ -LN_S \ -lt_SP2NL \ -lt_NL2SP \ -reload_flag \ -OBJDUMP \ -deplibs_check_method \ -file_magic_cmd \ -file_magic_glob \ -want_nocaseglob \ -DLLTOOL \ -sharedlib_from_linklib_cmd \ -AR \ -AR_FLAGS \ -archiver_list_spec \ -STRIP \ -RANLIB \ -CC \ -CFLAGS \ -compiler \ -lt_cv_sys_global_symbol_pipe \ -lt_cv_sys_global_symbol_to_cdecl \ -lt_cv_sys_global_symbol_to_c_name_address \ -lt_cv_sys_global_symbol_to_c_name_address_lib_prefix \ -nm_file_list_spec \ -lt_prog_compiler_no_builtin_flag \ -lt_prog_compiler_pic \ -lt_prog_compiler_wl \ -lt_prog_compiler_static \ -lt_cv_prog_compiler_c_o \ -need_locks \ -MANIFEST_TOOL \ -DSYMUTIL \ -NMEDIT \ -LIPO \ -OTOOL \ -OTOOL64 \ -shrext_cmds \ -export_dynamic_flag_spec \ -whole_archive_flag_spec \ -compiler_needs_object \ -with_gnu_ld \ -allow_undefined_flag \ -no_undefined_flag \ -hardcode_libdir_flag_spec \ -hardcode_libdir_separator \ -exclude_expsyms \ -include_expsyms \ -file_list_spec \ -variables_saved_for_relink \ -libname_spec \ -library_names_spec \ -soname_spec \ -install_override_mode \ -finish_eval \ -old_striplib \ -striplib \ -compiler_lib_search_dirs \ -predep_objects \ -postdep_objects \ -predeps \ -postdeps \ -compiler_lib_search_path \ -LD_CXX \ -reload_flag_CXX \ -compiler_CXX \ -lt_prog_compiler_no_builtin_flag_CXX \ -lt_prog_compiler_pic_CXX \ -lt_prog_compiler_wl_CXX \ -lt_prog_compiler_static_CXX \ -lt_cv_prog_compiler_c_o_CXX \ -export_dynamic_flag_spec_CXX \ -whole_archive_flag_spec_CXX \ -compiler_needs_object_CXX \ -with_gnu_ld_CXX \ -allow_undefined_flag_CXX \ -no_undefined_flag_CXX \ -hardcode_libdir_flag_spec_CXX \ -hardcode_libdir_separator_CXX \ -exclude_expsyms_CXX \ -include_expsyms_CXX \ -file_list_spec_CXX \ -compiler_lib_search_dirs_CXX \ -predep_objects_CXX \ -postdep_objects_CXX \ -predeps_CXX \ -postdeps_CXX \ -compiler_lib_search_path_CXX; do - case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in - *[\\\\\\\`\\"\\\$]*) - eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED \\"\\\$sed_quote_subst\\"\\\`\\\\\\"" - ;; - *) - eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\"" - ;; - esac -done - -# Double-quote double-evaled strings. -for var in reload_cmds \ -old_postinstall_cmds \ -old_postuninstall_cmds \ -old_archive_cmds \ -extract_expsyms_cmds \ -old_archive_from_new_cmds \ -old_archive_from_expsyms_cmds \ -archive_cmds \ -archive_expsym_cmds \ -module_cmds \ -module_expsym_cmds \ -export_symbols_cmds \ -prelink_cmds \ -postlink_cmds \ -postinstall_cmds \ -postuninstall_cmds \ -finish_cmds \ -sys_lib_search_path_spec \ -sys_lib_dlsearch_path_spec \ -reload_cmds_CXX \ -old_archive_cmds_CXX \ -old_archive_from_new_cmds_CXX \ -old_archive_from_expsyms_cmds_CXX \ -archive_cmds_CXX \ -archive_expsym_cmds_CXX \ -module_cmds_CXX \ -module_expsym_cmds_CXX \ -export_symbols_cmds_CXX \ -prelink_cmds_CXX \ -postlink_cmds_CXX; do - case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in - *[\\\\\\\`\\"\\\$]*) - eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED -e \\"\\\$double_quote_subst\\" -e \\"\\\$sed_quote_subst\\" -e \\"\\\$delay_variable_subst\\"\\\`\\\\\\"" - ;; - *) - eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\"" - ;; - esac -done - -ac_aux_dir='$ac_aux_dir' -xsi_shell='$xsi_shell' -lt_shell_append='$lt_shell_append' - -# See if we are running on zsh, and set the options which allow our -# commands through without removal of \ escapes INIT. -if test -n "\${ZSH_VERSION+set}" ; then - setopt NO_GLOB_SUBST -fi - - - PACKAGE='$PACKAGE' - VERSION='$VERSION' - TIMESTAMP='$TIMESTAMP' - RM='$RM' - ofile='$ofile' - - - - - - -_ACEOF - -cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 - -# Handling of arguments. -for ac_config_target in $ac_config_targets -do - case $ac_config_target in - "config.h") CONFIG_HEADERS="$CONFIG_HEADERS config.h" ;; - "depfiles") CONFIG_COMMANDS="$CONFIG_COMMANDS depfiles" ;; - "libtool") CONFIG_COMMANDS="$CONFIG_COMMANDS libtool" ;; - "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;; - - *) as_fn_error $? "invalid argument: \`$ac_config_target'" "$LINENO" 5;; - esac -done - - -# If the user did not use the arguments to specify the items to instantiate, -# then the envvar interface is used. Set only those that are not. -# We use the long form for the default assignment because of an extremely -# bizarre bug on SunOS 4.1.3. -if $ac_need_defaults; then - test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files - test "${CONFIG_HEADERS+set}" = set || CONFIG_HEADERS=$config_headers - test "${CONFIG_COMMANDS+set}" = set || CONFIG_COMMANDS=$config_commands -fi - -# Have a temporary directory for convenience. Make it in the build tree -# simply because there is no reason against having it here, and in addition, -# creating and moving files from /tmp can sometimes cause problems. -# Hook for its removal unless debugging. -# Note that there is a small window in which the directory will not be cleaned: -# after its creation but before its name has been assigned to `$tmp'. -$debug || -{ - tmp= ac_tmp= - trap 'exit_status=$? - : "${ac_tmp:=$tmp}" - { test ! -d "$ac_tmp" || rm -fr "$ac_tmp"; } && exit $exit_status -' 0 - trap 'as_fn_exit 1' 1 2 13 15 -} -# Create a (secure) tmp directory for tmp files. - -{ - tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` && - test -d "$tmp" -} || -{ - tmp=./conf$$-$RANDOM - (umask 077 && mkdir "$tmp") -} || as_fn_error $? "cannot create a temporary directory in ." "$LINENO" 5 -ac_tmp=$tmp - -# Set up the scripts for CONFIG_FILES section. -# No need to generate them if there are no CONFIG_FILES. -# This happens for instance with `./config.status config.h'. -if test -n "$CONFIG_FILES"; then - - -ac_cr=`echo X | tr X '\015'` -# On cygwin, bash can eat \r inside `` if the user requested igncr. -# But we know of no other shell where ac_cr would be empty at this -# point, so we can use a bashism as a fallback. -if test "x$ac_cr" = x; then - eval ac_cr=\$\'\\r\' -fi -ac_cs_awk_cr=`$AWK 'BEGIN { print "a\rb" }' /dev/null` -if test "$ac_cs_awk_cr" = "a${ac_cr}b"; then - ac_cs_awk_cr='\\r' -else - ac_cs_awk_cr=$ac_cr -fi - -echo 'BEGIN {' >"$ac_tmp/subs1.awk" && -_ACEOF - - -{ - echo "cat >conf$$subs.awk <<_ACEOF" && - echo "$ac_subst_vars" | sed 's/.*/&!$&$ac_delim/' && - echo "_ACEOF" -} >conf$$subs.sh || - as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 -ac_delim_num=`echo "$ac_subst_vars" | grep -c '^'` -ac_delim='%!_!# ' -for ac_last_try in false false false false false :; do - . ./conf$$subs.sh || - as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 - - ac_delim_n=`sed -n "s/.*$ac_delim\$/X/p" conf$$subs.awk | grep -c X` - if test $ac_delim_n = $ac_delim_num; then - break - elif $ac_last_try; then - as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 - else - ac_delim="$ac_delim!$ac_delim _$ac_delim!! " - fi -done -rm -f conf$$subs.sh - -cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 -cat >>"\$ac_tmp/subs1.awk" <<\\_ACAWK && -_ACEOF -sed -n ' -h -s/^/S["/; s/!.*/"]=/ -p -g -s/^[^!]*!// -:repl -t repl -s/'"$ac_delim"'$// -t delim -:nl -h -s/\(.\{148\}\)..*/\1/ -t more1 -s/["\\]/\\&/g; s/^/"/; s/$/\\n"\\/ -p -n -b repl -:more1 -s/["\\]/\\&/g; s/^/"/; s/$/"\\/ -p -g -s/.\{148\}// -t nl -:delim -h -s/\(.\{148\}\)..*/\1/ -t more2 -s/["\\]/\\&/g; s/^/"/; s/$/"/ -p -b -:more2 -s/["\\]/\\&/g; s/^/"/; s/$/"\\/ -p -g -s/.\{148\}// -t delim -' >$CONFIG_STATUS || ac_write_fail=1 -rm -f conf$$subs.awk -cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 -_ACAWK -cat >>"\$ac_tmp/subs1.awk" <<_ACAWK && - for (key in S) S_is_set[key] = 1 - FS = "" - -} -{ - line = $ 0 - nfields = split(line, field, "@") - substed = 0 - len = length(field[1]) - for (i = 2; i < nfields; i++) { - key = field[i] - keylen = length(key) - if (S_is_set[key]) { - value = S[key] - line = substr(line, 1, len) "" value "" substr(line, len + keylen + 3) - len += length(value) + length(field[++i]) - substed = 1 - } else - len += 1 + keylen - } - - print line -} - -_ACAWK -_ACEOF -cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 -if sed "s/$ac_cr//" < /dev/null > /dev/null 2>&1; then - sed "s/$ac_cr\$//; s/$ac_cr/$ac_cs_awk_cr/g" -else - cat -fi < "$ac_tmp/subs1.awk" > "$ac_tmp/subs.awk" \ - || as_fn_error $? "could not setup config files machinery" "$LINENO" 5 -_ACEOF - -# VPATH may cause trouble with some makes, so we remove sole $(srcdir), -# ${srcdir} and @srcdir@ entries from VPATH if srcdir is ".", strip leading and -# trailing colons and then remove the whole line if VPATH becomes empty -# (actually we leave an empty line to preserve line numbers). -if test "x$srcdir" = x.; then - ac_vpsub='/^[ ]*VPATH[ ]*=[ ]*/{ -h -s/// -s/^/:/ -s/[ ]*$/:/ -s/:\$(srcdir):/:/g -s/:\${srcdir}:/:/g -s/:@srcdir@:/:/g -s/^:*// -s/:*$// -x -s/\(=[ ]*\).*/\1/ -G -s/\n// -s/^[^=]*=[ ]*$// -}' -fi - -cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 -fi # test -n "$CONFIG_FILES" - -# Set up the scripts for CONFIG_HEADERS section. -# No need to generate them if there are no CONFIG_HEADERS. -# This happens for instance with `./config.status Makefile'. -if test -n "$CONFIG_HEADERS"; then -cat >"$ac_tmp/defines.awk" <<\_ACAWK || -BEGIN { -_ACEOF - -# Transform confdefs.h into an awk script `defines.awk', embedded as -# here-document in config.status, that substitutes the proper values into -# config.h.in to produce config.h. - -# Create a delimiter string that does not exist in confdefs.h, to ease -# handling of long lines. -ac_delim='%!_!# ' -for ac_last_try in false false :; do - ac_tt=`sed -n "/$ac_delim/p" confdefs.h` - if test -z "$ac_tt"; then - break - elif $ac_last_try; then - as_fn_error $? "could not make $CONFIG_HEADERS" "$LINENO" 5 - else - ac_delim="$ac_delim!$ac_delim _$ac_delim!! " - fi -done - -# For the awk script, D is an array of macro values keyed by name, -# likewise P contains macro parameters if any. Preserve backslash -# newline sequences. - -ac_word_re=[_$as_cr_Letters][_$as_cr_alnum]* -sed -n ' -s/.\{148\}/&'"$ac_delim"'/g -t rset -:rset -s/^[ ]*#[ ]*define[ ][ ]*/ / -t def -d -:def -s/\\$// -t bsnl -s/["\\]/\\&/g -s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\ -D["\1"]=" \3"/p -s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2"/p -d -:bsnl -s/["\\]/\\&/g -s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\ -D["\1"]=" \3\\\\\\n"\\/p -t cont -s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2\\\\\\n"\\/p -t cont -d -:cont -n -s/.\{148\}/&'"$ac_delim"'/g -t clear -:clear -s/\\$// -t bsnlc -s/["\\]/\\&/g; s/^/"/; s/$/"/p -d -:bsnlc -s/["\\]/\\&/g; s/^/"/; s/$/\\\\\\n"\\/p -b cont -' >$CONFIG_STATUS || ac_write_fail=1 - -cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 - for (key in D) D_is_set[key] = 1 - FS = "" -} -/^[\t ]*#[\t ]*(define|undef)[\t ]+$ac_word_re([\t (]|\$)/ { - line = \$ 0 - split(line, arg, " ") - if (arg[1] == "#") { - defundef = arg[2] - mac1 = arg[3] - } else { - defundef = substr(arg[1], 2) - mac1 = arg[2] - } - split(mac1, mac2, "(") #) - macro = mac2[1] - prefix = substr(line, 1, index(line, defundef) - 1) - if (D_is_set[macro]) { - # Preserve the white space surrounding the "#". - print prefix "define", macro P[macro] D[macro] - next - } else { - # Replace #undef with comments. This is necessary, for example, - # in the case of _POSIX_SOURCE, which is predefined and required - # on some systems where configure will not decide to define it. - if (defundef == "undef") { - print "/*", prefix defundef, macro, "*/" - next - } - } -} -{ print } -_ACAWK -_ACEOF -cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 - as_fn_error $? "could not setup config headers machinery" "$LINENO" 5 -fi # test -n "$CONFIG_HEADERS" - - -eval set X " :F $CONFIG_FILES :H $CONFIG_HEADERS :C $CONFIG_COMMANDS" -shift -for ac_tag -do - case $ac_tag in - :[FHLC]) ac_mode=$ac_tag; continue;; - esac - case $ac_mode$ac_tag in - :[FHL]*:*);; - :L* | :C*:*) as_fn_error $? "invalid tag \`$ac_tag'" "$LINENO" 5;; - :[FH]-) ac_tag=-:-;; - :[FH]*) ac_tag=$ac_tag:$ac_tag.in;; - esac - ac_save_IFS=$IFS - IFS=: - set x $ac_tag - IFS=$ac_save_IFS - shift - ac_file=$1 - shift - - case $ac_mode in - :L) ac_source=$1;; - :[FH]) - ac_file_inputs= - for ac_f - do - case $ac_f in - -) ac_f="$ac_tmp/stdin";; - *) # Look for the file first in the build tree, then in the source tree - # (if the path is not absolute). The absolute path cannot be DOS-style, - # because $ac_f cannot contain `:'. - test -f "$ac_f" || - case $ac_f in - [\\/$]*) false;; - *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";; - esac || - as_fn_error 1 "cannot find input file: \`$ac_f'" "$LINENO" 5;; - esac - case $ac_f in *\'*) ac_f=`$as_echo "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac - as_fn_append ac_file_inputs " '$ac_f'" - done - - # Let's still pretend it is `configure' which instantiates (i.e., don't - # use $as_me), people would be surprised to read: - # /* config.h. Generated by config.status. */ - configure_input='Generated from '` - $as_echo "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g' - `' by configure.' - if test x"$ac_file" != x-; then - configure_input="$ac_file. $configure_input" - { $as_echo "$as_me:${as_lineno-$LINENO}: creating $ac_file" >&5 -$as_echo "$as_me: creating $ac_file" >&6;} - fi - # Neutralize special characters interpreted by sed in replacement strings. - case $configure_input in #( - *\&* | *\|* | *\\* ) - ac_sed_conf_input=`$as_echo "$configure_input" | - sed 's/[\\\\&|]/\\\\&/g'`;; #( - *) ac_sed_conf_input=$configure_input;; - esac - - case $ac_tag in - *:-:* | *:-) cat >"$ac_tmp/stdin" \ - || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; - esac - ;; - esac - - ac_dir=`$as_dirname -- "$ac_file" || -$as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ - X"$ac_file" : 'X\(//\)[^/]' \| \ - X"$ac_file" : 'X\(//\)$' \| \ - X"$ac_file" : 'X\(/\)' \| . 2>/dev/null || -$as_echo X"$ac_file" | - sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ - s//\1/ - q - } - /^X\(\/\/\)[^/].*/{ - s//\1/ - q - } - /^X\(\/\/\)$/{ - s//\1/ - q - } - /^X\(\/\).*/{ - s//\1/ - q - } - s/.*/./; q'` - as_dir="$ac_dir"; as_fn_mkdir_p - ac_builddir=. - -case "$ac_dir" in -.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; -*) - ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` - # A ".." for each directory in $ac_dir_suffix. - ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` - case $ac_top_builddir_sub in - "") ac_top_builddir_sub=. ac_top_build_prefix= ;; - *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; - esac ;; -esac -ac_abs_top_builddir=$ac_pwd -ac_abs_builddir=$ac_pwd$ac_dir_suffix -# for backward compatibility: -ac_top_builddir=$ac_top_build_prefix - -case $srcdir in - .) # We are building in place. - ac_srcdir=. - ac_top_srcdir=$ac_top_builddir_sub - ac_abs_top_srcdir=$ac_pwd ;; - [\\/]* | ?:[\\/]* ) # Absolute name. - ac_srcdir=$srcdir$ac_dir_suffix; - ac_top_srcdir=$srcdir - ac_abs_top_srcdir=$srcdir ;; - *) # Relative name. - ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix - ac_top_srcdir=$ac_top_build_prefix$srcdir - ac_abs_top_srcdir=$ac_pwd/$srcdir ;; -esac -ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix - - - case $ac_mode in - :F) - # - # CONFIG_FILE - # - - case $INSTALL in - [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;; - *) ac_INSTALL=$ac_top_build_prefix$INSTALL ;; - esac - ac_MKDIR_P=$MKDIR_P - case $MKDIR_P in - [\\/$]* | ?:[\\/]* ) ;; - */*) ac_MKDIR_P=$ac_top_build_prefix$MKDIR_P ;; - esac -_ACEOF - -cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 -# If the template does not know about datarootdir, expand it. -# FIXME: This hack should be removed a few years after 2.60. -ac_datarootdir_hack=; ac_datarootdir_seen= -ac_sed_dataroot=' -/datarootdir/ { - p - q -} -/@datadir@/p -/@docdir@/p -/@infodir@/p -/@localedir@/p -/@mandir@/p' -case `eval "sed -n \"\$ac_sed_dataroot\" $ac_file_inputs"` in -*datarootdir*) ac_datarootdir_seen=yes;; -*@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*) - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5 -$as_echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;} -_ACEOF -cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 - ac_datarootdir_hack=' - s&@datadir@&$datadir&g - s&@docdir@&$docdir&g - s&@infodir@&$infodir&g - s&@localedir@&$localedir&g - s&@mandir@&$mandir&g - s&\\\${datarootdir}&$datarootdir&g' ;; -esac -_ACEOF - -# Neutralize VPATH when `$srcdir' = `.'. -# Shell code in configure.ac might set extrasub. -# FIXME: do we really want to maintain this feature? -cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 -ac_sed_extra="$ac_vpsub -$extrasub -_ACEOF -cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 -:t -/@[a-zA-Z_][a-zA-Z_0-9]*@/!b -s|@configure_input@|$ac_sed_conf_input|;t t -s&@top_builddir@&$ac_top_builddir_sub&;t t -s&@top_build_prefix@&$ac_top_build_prefix&;t t -s&@srcdir@&$ac_srcdir&;t t -s&@abs_srcdir@&$ac_abs_srcdir&;t t -s&@top_srcdir@&$ac_top_srcdir&;t t -s&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t -s&@builddir@&$ac_builddir&;t t -s&@abs_builddir@&$ac_abs_builddir&;t t -s&@abs_top_builddir@&$ac_abs_top_builddir&;t t -s&@INSTALL@&$ac_INSTALL&;t t -s&@MKDIR_P@&$ac_MKDIR_P&;t t -$ac_datarootdir_hack -" -eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$ac_tmp/subs.awk" \ - >$ac_tmp/out || as_fn_error $? "could not create $ac_file" "$LINENO" 5 - -test -z "$ac_datarootdir_hack$ac_datarootdir_seen" && - { ac_out=`sed -n '/\${datarootdir}/p' "$ac_tmp/out"`; test -n "$ac_out"; } && - { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' \ - "$ac_tmp/out"`; test -z "$ac_out"; } && - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \`datarootdir' -which seems to be undefined. Please make sure it is defined" >&5 -$as_echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir' -which seems to be undefined. Please make sure it is defined" >&2;} - - rm -f "$ac_tmp/stdin" - case $ac_file in - -) cat "$ac_tmp/out" && rm -f "$ac_tmp/out";; - *) rm -f "$ac_file" && mv "$ac_tmp/out" "$ac_file";; - esac \ - || as_fn_error $? "could not create $ac_file" "$LINENO" 5 - ;; - :H) - # - # CONFIG_HEADER - # - if test x"$ac_file" != x-; then - { - $as_echo "/* $configure_input */" \ - && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" - } >"$ac_tmp/config.h" \ - || as_fn_error $? "could not create $ac_file" "$LINENO" 5 - if diff "$ac_file" "$ac_tmp/config.h" >/dev/null 2>&1; then - { $as_echo "$as_me:${as_lineno-$LINENO}: $ac_file is unchanged" >&5 -$as_echo "$as_me: $ac_file is unchanged" >&6;} - else - rm -f "$ac_file" - mv "$ac_tmp/config.h" "$ac_file" \ - || as_fn_error $? "could not create $ac_file" "$LINENO" 5 - fi - else - $as_echo "/* $configure_input */" \ - && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" \ - || as_fn_error $? "could not create -" "$LINENO" 5 - fi -# Compute "$ac_file"'s index in $config_headers. -_am_arg="$ac_file" -_am_stamp_count=1 -for _am_header in $config_headers :; do - case $_am_header in - $_am_arg | $_am_arg:* ) - break ;; - * ) - _am_stamp_count=`expr $_am_stamp_count + 1` ;; - esac -done -echo "timestamp for $_am_arg" >`$as_dirname -- "$_am_arg" || -$as_expr X"$_am_arg" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ - X"$_am_arg" : 'X\(//\)[^/]' \| \ - X"$_am_arg" : 'X\(//\)$' \| \ - X"$_am_arg" : 'X\(/\)' \| . 2>/dev/null || -$as_echo X"$_am_arg" | - sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ - s//\1/ - q - } - /^X\(\/\/\)[^/].*/{ - s//\1/ - q - } - /^X\(\/\/\)$/{ - s//\1/ - q - } - /^X\(\/\).*/{ - s//\1/ - q - } - s/.*/./; q'`/stamp-h$_am_stamp_count - ;; - - :C) { $as_echo "$as_me:${as_lineno-$LINENO}: executing $ac_file commands" >&5 -$as_echo "$as_me: executing $ac_file commands" >&6;} - ;; - esac - - - case $ac_file$ac_mode in - "depfiles":C) test x"$AMDEP_TRUE" != x"" || { - # Autoconf 2.62 quotes --file arguments for eval, but not when files - # are listed without --file. Let's play safe and only enable the eval - # if we detect the quoting. - case $CONFIG_FILES in - *\'*) eval set x "$CONFIG_FILES" ;; - *) set x $CONFIG_FILES ;; - esac - shift - for mf - do - # Strip MF so we end up with the name of the file. - mf=`echo "$mf" | sed -e 's/:.*$//'` - # Check whether this is an Automake generated Makefile or not. - # We used to match only the files named `Makefile.in', but - # some people rename them; so instead we look at the file content. - # Grep'ing the first line is not enough: some people post-process - # each Makefile.in and add a new line on top of each file to say so. - # Grep'ing the whole file is not good either: AIX grep has a line - # limit of 2048, but all sed's we know have understand at least 4000. - if sed -n 's,^#.*generated by automake.*,X,p' "$mf" | grep X >/dev/null 2>&1; then - dirpart=`$as_dirname -- "$mf" || -$as_expr X"$mf" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ - X"$mf" : 'X\(//\)[^/]' \| \ - X"$mf" : 'X\(//\)$' \| \ - X"$mf" : 'X\(/\)' \| . 2>/dev/null || -$as_echo X"$mf" | - sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ - s//\1/ - q - } - /^X\(\/\/\)[^/].*/{ - s//\1/ - q - } - /^X\(\/\/\)$/{ - s//\1/ - q - } - /^X\(\/\).*/{ - s//\1/ - q - } - s/.*/./; q'` - else - continue - fi - # Extract the definition of DEPDIR, am__include, and am__quote - # from the Makefile without running `make'. - DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"` - test -z "$DEPDIR" && continue - am__include=`sed -n 's/^am__include = //p' < "$mf"` - test -z "am__include" && continue - am__quote=`sed -n 's/^am__quote = //p' < "$mf"` - # When using ansi2knr, U may be empty or an underscore; expand it - U=`sed -n 's/^U = //p' < "$mf"` - # Find all dependency output files, they are included files with - # $(DEPDIR) in their names. We invoke sed twice because it is the - # simplest approach to changing $(DEPDIR) to its actual value in the - # expansion. - for file in `sed -n " - s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \ - sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g' -e 's/\$U/'"$U"'/g'`; do - # Make sure the directory exists. - test -f "$dirpart/$file" && continue - fdir=`$as_dirname -- "$file" || -$as_expr X"$file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ - X"$file" : 'X\(//\)[^/]' \| \ - X"$file" : 'X\(//\)$' \| \ - X"$file" : 'X\(/\)' \| . 2>/dev/null || -$as_echo X"$file" | - sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ - s//\1/ - q - } - /^X\(\/\/\)[^/].*/{ - s//\1/ - q - } - /^X\(\/\/\)$/{ - s//\1/ - q - } - /^X\(\/\).*/{ - s//\1/ - q - } - s/.*/./; q'` - as_dir=$dirpart/$fdir; as_fn_mkdir_p - # echo "creating $dirpart/$file" - echo '# dummy' > "$dirpart/$file" - done - done -} - ;; - "libtool":C) - - # See if we are running on zsh, and set the options which allow our - # commands through without removal of \ escapes. - if test -n "${ZSH_VERSION+set}" ; then - setopt NO_GLOB_SUBST - fi - - cfgfile="${ofile}T" - trap "$RM \"$cfgfile\"; exit 1" 1 2 15 - $RM "$cfgfile" - - cat <<_LT_EOF >> "$cfgfile" -#! $SHELL - -# `$ECHO "$ofile" | sed 's%^.*/%%'` - Provide generalized library-building support services. -# Generated automatically by $as_me ($PACKAGE$TIMESTAMP) $VERSION -# Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`: -# NOTE: Changes made to this file will be lost: look at ltmain.sh. -# -# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005, -# 2006, 2007, 2008, 2009, 2010, 2011 Free Software -# Foundation, Inc. -# Written by Gordon Matzigkeit, 1996 -# -# This file is part of GNU Libtool. -# -# GNU Libtool is free software; you can redistribute it and/or -# modify it under the terms of the GNU General Public License as -# published by the Free Software Foundation; either version 2 of -# the License, or (at your option) any later version. -# -# As a special exception to the GNU General Public License, -# if you distribute this file as part of a program or library that -# is built using GNU Libtool, you may include this file under the -# same distribution terms that you use for the rest of that program. -# -# GNU Libtool is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with GNU Libtool; see the file COPYING. If not, a copy -# can be downloaded from http://www.gnu.org/licenses/gpl.html, or -# obtained by writing to the Free Software Foundation, Inc., -# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - - -# The names of the tagged configurations supported by this script. -available_tags="CXX " - -# ### BEGIN LIBTOOL CONFIG - -# Which release of libtool.m4 was used? -macro_version=$macro_version -macro_revision=$macro_revision - -# Whether or not to build shared libraries. -build_libtool_libs=$enable_shared - -# Whether or not to build static libraries. -build_old_libs=$enable_static - -# What type of objects to build. -pic_mode=$pic_mode - -# Whether or not to optimize for fast installation. -fast_install=$enable_fast_install - -# Shell to use when invoking shell scripts. -SHELL=$lt_SHELL - -# An echo program that protects backslashes. -ECHO=$lt_ECHO - -# The PATH separator for the build system. -PATH_SEPARATOR=$lt_PATH_SEPARATOR - -# The host system. -host_alias=$host_alias -host=$host -host_os=$host_os - -# The build system. -build_alias=$build_alias -build=$build -build_os=$build_os - -# A sed program that does not truncate output. -SED=$lt_SED - -# Sed that helps us avoid accidentally triggering echo(1) options like -n. -Xsed="\$SED -e 1s/^X//" - -# A grep program that handles long lines. -GREP=$lt_GREP - -# An ERE matcher. -EGREP=$lt_EGREP - -# A literal string matcher. -FGREP=$lt_FGREP - -# A BSD- or MS-compatible name lister. -NM=$lt_NM - -# Whether we need soft or hard links. -LN_S=$lt_LN_S - -# What is the maximum length of a command? -max_cmd_len=$max_cmd_len - -# Object file suffix (normally "o"). -objext=$ac_objext - -# Executable file suffix (normally ""). -exeext=$exeext - -# whether the shell understands "unset". -lt_unset=$lt_unset - -# turn spaces into newlines. -SP2NL=$lt_lt_SP2NL - -# turn newlines into spaces. -NL2SP=$lt_lt_NL2SP - -# convert \$build file names to \$host format. -to_host_file_cmd=$lt_cv_to_host_file_cmd - -# convert \$build files to toolchain format. -to_tool_file_cmd=$lt_cv_to_tool_file_cmd - -# An object symbol dumper. -OBJDUMP=$lt_OBJDUMP - -# Method to check whether dependent libraries are shared objects. -deplibs_check_method=$lt_deplibs_check_method - -# Command to use when deplibs_check_method = "file_magic". -file_magic_cmd=$lt_file_magic_cmd - -# How to find potential files when deplibs_check_method = "file_magic". -file_magic_glob=$lt_file_magic_glob - -# Find potential files using nocaseglob when deplibs_check_method = "file_magic". -want_nocaseglob=$lt_want_nocaseglob - -# DLL creation program. -DLLTOOL=$lt_DLLTOOL - -# Command to associate shared and link libraries. -sharedlib_from_linklib_cmd=$lt_sharedlib_from_linklib_cmd - -# The archiver. -AR=$lt_AR - -# Flags to create an archive. -AR_FLAGS=$lt_AR_FLAGS - -# How to feed a file listing to the archiver. -archiver_list_spec=$lt_archiver_list_spec - -# A symbol stripping program. -STRIP=$lt_STRIP - -# Commands used to install an old-style archive. -RANLIB=$lt_RANLIB -old_postinstall_cmds=$lt_old_postinstall_cmds -old_postuninstall_cmds=$lt_old_postuninstall_cmds - -# Whether to use a lock for old archive extraction. -lock_old_archive_extraction=$lock_old_archive_extraction - -# A C compiler. -LTCC=$lt_CC - -# LTCC compiler flags. -LTCFLAGS=$lt_CFLAGS - -# Take the output of nm and produce a listing of raw symbols and C names. -global_symbol_pipe=$lt_lt_cv_sys_global_symbol_pipe - -# Transform the output of nm in a proper C declaration. -global_symbol_to_cdecl=$lt_lt_cv_sys_global_symbol_to_cdecl - -# Transform the output of nm in a C name address pair. -global_symbol_to_c_name_address=$lt_lt_cv_sys_global_symbol_to_c_name_address - -# Transform the output of nm in a C name address pair when lib prefix is needed. -global_symbol_to_c_name_address_lib_prefix=$lt_lt_cv_sys_global_symbol_to_c_name_address_lib_prefix - -# Specify filename containing input files for \$NM. -nm_file_list_spec=$lt_nm_file_list_spec - -# The root where to search for dependent libraries,and in which our libraries should be installed. -lt_sysroot=$lt_sysroot - -# The name of the directory that contains temporary libtool files. -objdir=$objdir - -# Used to examine libraries when file_magic_cmd begins with "file". -MAGIC_CMD=$MAGIC_CMD - -# Must we lock files when doing compilation? -need_locks=$lt_need_locks - -# Manifest tool. -MANIFEST_TOOL=$lt_MANIFEST_TOOL - -# Tool to manipulate archived DWARF debug symbol files on Mac OS X. -DSYMUTIL=$lt_DSYMUTIL - -# Tool to change global to local symbols on Mac OS X. -NMEDIT=$lt_NMEDIT - -# Tool to manipulate fat objects and archives on Mac OS X. -LIPO=$lt_LIPO - -# ldd/readelf like tool for Mach-O binaries on Mac OS X. -OTOOL=$lt_OTOOL - -# ldd/readelf like tool for 64 bit Mach-O binaries on Mac OS X 10.4. -OTOOL64=$lt_OTOOL64 - -# Old archive suffix (normally "a"). -libext=$libext - -# Shared library suffix (normally ".so"). -shrext_cmds=$lt_shrext_cmds - -# The commands to extract the exported symbol list from a shared archive. -extract_expsyms_cmds=$lt_extract_expsyms_cmds - -# Variables whose values should be saved in libtool wrapper scripts and -# restored at link time. -variables_saved_for_relink=$lt_variables_saved_for_relink - -# Do we need the "lib" prefix for modules? -need_lib_prefix=$need_lib_prefix - -# Do we need a version for libraries? -need_version=$need_version - -# Library versioning type. -version_type=$version_type - -# Shared library runtime path variable. -runpath_var=$runpath_var - -# Shared library path variable. -shlibpath_var=$shlibpath_var - -# Is shlibpath searched before the hard-coded library search path? -shlibpath_overrides_runpath=$shlibpath_overrides_runpath - -# Format of library name prefix. -libname_spec=$lt_libname_spec - -# List of archive names. First name is the real one, the rest are links. -# The last name is the one that the linker finds with -lNAME -library_names_spec=$lt_library_names_spec - -# The coded name of the library, if different from the real name. -soname_spec=$lt_soname_spec - -# Permission mode override for installation of shared libraries. -install_override_mode=$lt_install_override_mode - -# Command to use after installation of a shared archive. -postinstall_cmds=$lt_postinstall_cmds - -# Command to use after uninstallation of a shared archive. -postuninstall_cmds=$lt_postuninstall_cmds - -# Commands used to finish a libtool library installation in a directory. -finish_cmds=$lt_finish_cmds - -# As "finish_cmds", except a single script fragment to be evaled but -# not shown. -finish_eval=$lt_finish_eval - -# Whether we should hardcode library paths into libraries. -hardcode_into_libs=$hardcode_into_libs - -# Compile-time system search path for libraries. -sys_lib_search_path_spec=$lt_sys_lib_search_path_spec - -# Run-time system search path for libraries. -sys_lib_dlsearch_path_spec=$lt_sys_lib_dlsearch_path_spec - -# Whether dlopen is supported. -dlopen_support=$enable_dlopen - -# Whether dlopen of programs is supported. -dlopen_self=$enable_dlopen_self - -# Whether dlopen of statically linked programs is supported. -dlopen_self_static=$enable_dlopen_self_static - -# Commands to strip libraries. -old_striplib=$lt_old_striplib -striplib=$lt_striplib - - -# The linker used to build libraries. -LD=$lt_LD - -# How to create reloadable object files. -reload_flag=$lt_reload_flag -reload_cmds=$lt_reload_cmds - -# Commands used to build an old-style archive. -old_archive_cmds=$lt_old_archive_cmds - -# A language specific compiler. -CC=$lt_compiler - -# Is the compiler the GNU compiler? -with_gcc=$GCC - -# Compiler flag to turn off builtin functions. -no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag - -# Additional compiler flags for building library objects. -pic_flag=$lt_lt_prog_compiler_pic - -# How to pass a linker flag through the compiler. -wl=$lt_lt_prog_compiler_wl - -# Compiler flag to prevent dynamic linking. -link_static_flag=$lt_lt_prog_compiler_static - -# Does compiler simultaneously support -c and -o options? -compiler_c_o=$lt_lt_cv_prog_compiler_c_o - -# Whether or not to add -lc for building shared libraries. -build_libtool_need_lc=$archive_cmds_need_lc - -# Whether or not to disallow shared libs when runtime libs are static. -allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes - -# Compiler flag to allow reflexive dlopens. -export_dynamic_flag_spec=$lt_export_dynamic_flag_spec - -# Compiler flag to generate shared objects directly from archives. -whole_archive_flag_spec=$lt_whole_archive_flag_spec - -# Whether the compiler copes with passing no objects directly. -compiler_needs_object=$lt_compiler_needs_object - -# Create an old-style archive from a shared archive. -old_archive_from_new_cmds=$lt_old_archive_from_new_cmds - -# Create a temporary old-style archive to link instead of a shared archive. -old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds - -# Commands used to build a shared archive. -archive_cmds=$lt_archive_cmds -archive_expsym_cmds=$lt_archive_expsym_cmds - -# Commands used to build a loadable module if different from building -# a shared archive. -module_cmds=$lt_module_cmds -module_expsym_cmds=$lt_module_expsym_cmds - -# Whether we are building with GNU ld or not. -with_gnu_ld=$lt_with_gnu_ld - -# Flag that allows shared libraries with undefined symbols to be built. -allow_undefined_flag=$lt_allow_undefined_flag - -# Flag that enforces no undefined symbols. -no_undefined_flag=$lt_no_undefined_flag - -# Flag to hardcode \$libdir into a binary during linking. -# This must work even if \$libdir does not exist -hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec - -# Whether we need a single "-rpath" flag with a separated argument. -hardcode_libdir_separator=$lt_hardcode_libdir_separator - -# Set to "yes" if using DIR/libNAME\${shared_ext} during linking hardcodes -# DIR into the resulting binary. -hardcode_direct=$hardcode_direct - -# Set to "yes" if using DIR/libNAME\${shared_ext} during linking hardcodes -# DIR into the resulting binary and the resulting library dependency is -# "absolute",i.e impossible to change by setting \${shlibpath_var} if the -# library is relocated. -hardcode_direct_absolute=$hardcode_direct_absolute - -# Set to "yes" if using the -LDIR flag during linking hardcodes DIR -# into the resulting binary. -hardcode_minus_L=$hardcode_minus_L - -# Set to "yes" if using SHLIBPATH_VAR=DIR during linking hardcodes DIR -# into the resulting binary. -hardcode_shlibpath_var=$hardcode_shlibpath_var - -# Set to "yes" if building a shared library automatically hardcodes DIR -# into the library and all subsequent libraries and executables linked -# against it. -hardcode_automatic=$hardcode_automatic - -# Set to yes if linker adds runtime paths of dependent libraries -# to runtime path list. -inherit_rpath=$inherit_rpath - -# Whether libtool must link a program against all its dependency libraries. -link_all_deplibs=$link_all_deplibs - -# Set to "yes" if exported symbols are required. -always_export_symbols=$always_export_symbols - -# The commands to list exported symbols. -export_symbols_cmds=$lt_export_symbols_cmds - -# Symbols that should not be listed in the preloaded symbols. -exclude_expsyms=$lt_exclude_expsyms - -# Symbols that must always be exported. -include_expsyms=$lt_include_expsyms - -# Commands necessary for linking programs (against libraries) with templates. -prelink_cmds=$lt_prelink_cmds - -# Commands necessary for finishing linking programs. -postlink_cmds=$lt_postlink_cmds - -# Specify filename containing input files. -file_list_spec=$lt_file_list_spec - -# How to hardcode a shared library path into an executable. -hardcode_action=$hardcode_action - -# The directories searched by this compiler when creating a shared library. -compiler_lib_search_dirs=$lt_compiler_lib_search_dirs - -# Dependencies to place before and after the objects being linked to -# create a shared library. -predep_objects=$lt_predep_objects -postdep_objects=$lt_postdep_objects -predeps=$lt_predeps -postdeps=$lt_postdeps - -# The library search path used internally by the compiler when linking -# a shared library. -compiler_lib_search_path=$lt_compiler_lib_search_path - -# ### END LIBTOOL CONFIG - -_LT_EOF - - case $host_os in - aix3*) - cat <<\_LT_EOF >> "$cfgfile" -# AIX sometimes has problems with the GCC collect2 program. For some -# reason, if we set the COLLECT_NAMES environment variable, the problems -# vanish in a puff of smoke. -if test "X${COLLECT_NAMES+set}" != Xset; then - COLLECT_NAMES= - export COLLECT_NAMES -fi -_LT_EOF - ;; - esac - - -ltmain="$ac_aux_dir/ltmain.sh" - - - # We use sed instead of cat because bash on DJGPP gets confused if - # if finds mixed CR/LF and LF-only lines. Since sed operates in - # text mode, it properly converts lines to CR/LF. This bash problem - # is reportedly fixed, but why not run on old versions too? - sed '$q' "$ltmain" >> "$cfgfile" \ - || (rm -f "$cfgfile"; exit 1) - - if test x"$xsi_shell" = xyes; then - sed -e '/^func_dirname ()$/,/^} # func_dirname /c\ -func_dirname ()\ -{\ -\ case ${1} in\ -\ */*) func_dirname_result="${1%/*}${2}" ;;\ -\ * ) func_dirname_result="${3}" ;;\ -\ esac\ -} # Extended-shell func_dirname implementation' "$cfgfile" > $cfgfile.tmp \ - && mv -f "$cfgfile.tmp" "$cfgfile" \ - || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") -test 0 -eq $? || _lt_function_replace_fail=: - - - sed -e '/^func_basename ()$/,/^} # func_basename /c\ -func_basename ()\ -{\ -\ func_basename_result="${1##*/}"\ -} # Extended-shell func_basename implementation' "$cfgfile" > $cfgfile.tmp \ - && mv -f "$cfgfile.tmp" "$cfgfile" \ - || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") -test 0 -eq $? || _lt_function_replace_fail=: - - - sed -e '/^func_dirname_and_basename ()$/,/^} # func_dirname_and_basename /c\ -func_dirname_and_basename ()\ -{\ -\ case ${1} in\ -\ */*) func_dirname_result="${1%/*}${2}" ;;\ -\ * ) func_dirname_result="${3}" ;;\ -\ esac\ -\ func_basename_result="${1##*/}"\ -} # Extended-shell func_dirname_and_basename implementation' "$cfgfile" > $cfgfile.tmp \ - && mv -f "$cfgfile.tmp" "$cfgfile" \ - || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") -test 0 -eq $? || _lt_function_replace_fail=: - - - sed -e '/^func_stripname ()$/,/^} # func_stripname /c\ -func_stripname ()\ -{\ -\ # pdksh 5.2.14 does not do ${X%$Y} correctly if both X and Y are\ -\ # positional parameters, so assign one to ordinary parameter first.\ -\ func_stripname_result=${3}\ -\ func_stripname_result=${func_stripname_result#"${1}"}\ -\ func_stripname_result=${func_stripname_result%"${2}"}\ -} # Extended-shell func_stripname implementation' "$cfgfile" > $cfgfile.tmp \ - && mv -f "$cfgfile.tmp" "$cfgfile" \ - || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") -test 0 -eq $? || _lt_function_replace_fail=: - - - sed -e '/^func_split_long_opt ()$/,/^} # func_split_long_opt /c\ -func_split_long_opt ()\ -{\ -\ func_split_long_opt_name=${1%%=*}\ -\ func_split_long_opt_arg=${1#*=}\ -} # Extended-shell func_split_long_opt implementation' "$cfgfile" > $cfgfile.tmp \ - && mv -f "$cfgfile.tmp" "$cfgfile" \ - || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") -test 0 -eq $? || _lt_function_replace_fail=: - - - sed -e '/^func_split_short_opt ()$/,/^} # func_split_short_opt /c\ -func_split_short_opt ()\ -{\ -\ func_split_short_opt_arg=${1#??}\ -\ func_split_short_opt_name=${1%"$func_split_short_opt_arg"}\ -} # Extended-shell func_split_short_opt implementation' "$cfgfile" > $cfgfile.tmp \ - && mv -f "$cfgfile.tmp" "$cfgfile" \ - || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") -test 0 -eq $? || _lt_function_replace_fail=: - - - sed -e '/^func_lo2o ()$/,/^} # func_lo2o /c\ -func_lo2o ()\ -{\ -\ case ${1} in\ -\ *.lo) func_lo2o_result=${1%.lo}.${objext} ;;\ -\ *) func_lo2o_result=${1} ;;\ -\ esac\ -} # Extended-shell func_lo2o implementation' "$cfgfile" > $cfgfile.tmp \ - && mv -f "$cfgfile.tmp" "$cfgfile" \ - || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") -test 0 -eq $? || _lt_function_replace_fail=: - - - sed -e '/^func_xform ()$/,/^} # func_xform /c\ -func_xform ()\ -{\ - func_xform_result=${1%.*}.lo\ -} # Extended-shell func_xform implementation' "$cfgfile" > $cfgfile.tmp \ - && mv -f "$cfgfile.tmp" "$cfgfile" \ - || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") -test 0 -eq $? || _lt_function_replace_fail=: - - - sed -e '/^func_arith ()$/,/^} # func_arith /c\ -func_arith ()\ -{\ - func_arith_result=$(( $* ))\ -} # Extended-shell func_arith implementation' "$cfgfile" > $cfgfile.tmp \ - && mv -f "$cfgfile.tmp" "$cfgfile" \ - || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") -test 0 -eq $? || _lt_function_replace_fail=: - - - sed -e '/^func_len ()$/,/^} # func_len /c\ -func_len ()\ -{\ - func_len_result=${#1}\ -} # Extended-shell func_len implementation' "$cfgfile" > $cfgfile.tmp \ - && mv -f "$cfgfile.tmp" "$cfgfile" \ - || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") -test 0 -eq $? || _lt_function_replace_fail=: - -fi - -if test x"$lt_shell_append" = xyes; then - sed -e '/^func_append ()$/,/^} # func_append /c\ -func_append ()\ -{\ - eval "${1}+=\\${2}"\ -} # Extended-shell func_append implementation' "$cfgfile" > $cfgfile.tmp \ - && mv -f "$cfgfile.tmp" "$cfgfile" \ - || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") -test 0 -eq $? || _lt_function_replace_fail=: - - - sed -e '/^func_append_quoted ()$/,/^} # func_append_quoted /c\ -func_append_quoted ()\ -{\ -\ func_quote_for_eval "${2}"\ -\ eval "${1}+=\\\\ \\$func_quote_for_eval_result"\ -} # Extended-shell func_append_quoted implementation' "$cfgfile" > $cfgfile.tmp \ - && mv -f "$cfgfile.tmp" "$cfgfile" \ - || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") -test 0 -eq $? || _lt_function_replace_fail=: - - - # Save a `func_append' function call where possible by direct use of '+=' - sed -e 's%func_append \([a-zA-Z_]\{1,\}\) "%\1+="%g' $cfgfile > $cfgfile.tmp \ - && mv -f "$cfgfile.tmp" "$cfgfile" \ - || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") - test 0 -eq $? || _lt_function_replace_fail=: -else - # Save a `func_append' function call even when '+=' is not available - sed -e 's%func_append \([a-zA-Z_]\{1,\}\) "%\1="$\1%g' $cfgfile > $cfgfile.tmp \ - && mv -f "$cfgfile.tmp" "$cfgfile" \ - || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") - test 0 -eq $? || _lt_function_replace_fail=: -fi - -if test x"$_lt_function_replace_fail" = x":"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Unable to substitute extended shell functions in $ofile" >&5 -$as_echo "$as_me: WARNING: Unable to substitute extended shell functions in $ofile" >&2;} -fi - - - mv -f "$cfgfile" "$ofile" || - (rm -f "$ofile" && cp "$cfgfile" "$ofile" && rm -f "$cfgfile") - chmod +x "$ofile" - - - cat <<_LT_EOF >> "$ofile" - -# ### BEGIN LIBTOOL TAG CONFIG: CXX - -# The linker used to build libraries. -LD=$lt_LD_CXX - -# How to create reloadable object files. -reload_flag=$lt_reload_flag_CXX -reload_cmds=$lt_reload_cmds_CXX - -# Commands used to build an old-style archive. -old_archive_cmds=$lt_old_archive_cmds_CXX - -# A language specific compiler. -CC=$lt_compiler_CXX - -# Is the compiler the GNU compiler? -with_gcc=$GCC_CXX - -# Compiler flag to turn off builtin functions. -no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag_CXX - -# Additional compiler flags for building library objects. -pic_flag=$lt_lt_prog_compiler_pic_CXX - -# How to pass a linker flag through the compiler. -wl=$lt_lt_prog_compiler_wl_CXX - -# Compiler flag to prevent dynamic linking. -link_static_flag=$lt_lt_prog_compiler_static_CXX - -# Does compiler simultaneously support -c and -o options? -compiler_c_o=$lt_lt_cv_prog_compiler_c_o_CXX - -# Whether or not to add -lc for building shared libraries. -build_libtool_need_lc=$archive_cmds_need_lc_CXX - -# Whether or not to disallow shared libs when runtime libs are static. -allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes_CXX - -# Compiler flag to allow reflexive dlopens. -export_dynamic_flag_spec=$lt_export_dynamic_flag_spec_CXX - -# Compiler flag to generate shared objects directly from archives. -whole_archive_flag_spec=$lt_whole_archive_flag_spec_CXX - -# Whether the compiler copes with passing no objects directly. -compiler_needs_object=$lt_compiler_needs_object_CXX - -# Create an old-style archive from a shared archive. -old_archive_from_new_cmds=$lt_old_archive_from_new_cmds_CXX - -# Create a temporary old-style archive to link instead of a shared archive. -old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds_CXX - -# Commands used to build a shared archive. -archive_cmds=$lt_archive_cmds_CXX -archive_expsym_cmds=$lt_archive_expsym_cmds_CXX - -# Commands used to build a loadable module if different from building -# a shared archive. -module_cmds=$lt_module_cmds_CXX -module_expsym_cmds=$lt_module_expsym_cmds_CXX - -# Whether we are building with GNU ld or not. -with_gnu_ld=$lt_with_gnu_ld_CXX - -# Flag that allows shared libraries with undefined symbols to be built. -allow_undefined_flag=$lt_allow_undefined_flag_CXX - -# Flag that enforces no undefined symbols. -no_undefined_flag=$lt_no_undefined_flag_CXX - -# Flag to hardcode \$libdir into a binary during linking. -# This must work even if \$libdir does not exist -hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec_CXX - -# Whether we need a single "-rpath" flag with a separated argument. -hardcode_libdir_separator=$lt_hardcode_libdir_separator_CXX - -# Set to "yes" if using DIR/libNAME\${shared_ext} during linking hardcodes -# DIR into the resulting binary. -hardcode_direct=$hardcode_direct_CXX - -# Set to "yes" if using DIR/libNAME\${shared_ext} during linking hardcodes -# DIR into the resulting binary and the resulting library dependency is -# "absolute",i.e impossible to change by setting \${shlibpath_var} if the -# library is relocated. -hardcode_direct_absolute=$hardcode_direct_absolute_CXX - -# Set to "yes" if using the -LDIR flag during linking hardcodes DIR -# into the resulting binary. -hardcode_minus_L=$hardcode_minus_L_CXX - -# Set to "yes" if using SHLIBPATH_VAR=DIR during linking hardcodes DIR -# into the resulting binary. -hardcode_shlibpath_var=$hardcode_shlibpath_var_CXX - -# Set to "yes" if building a shared library automatically hardcodes DIR -# into the library and all subsequent libraries and executables linked -# against it. -hardcode_automatic=$hardcode_automatic_CXX - -# Set to yes if linker adds runtime paths of dependent libraries -# to runtime path list. -inherit_rpath=$inherit_rpath_CXX - -# Whether libtool must link a program against all its dependency libraries. -link_all_deplibs=$link_all_deplibs_CXX - -# Set to "yes" if exported symbols are required. -always_export_symbols=$always_export_symbols_CXX - -# The commands to list exported symbols. -export_symbols_cmds=$lt_export_symbols_cmds_CXX - -# Symbols that should not be listed in the preloaded symbols. -exclude_expsyms=$lt_exclude_expsyms_CXX - -# Symbols that must always be exported. -include_expsyms=$lt_include_expsyms_CXX - -# Commands necessary for linking programs (against libraries) with templates. -prelink_cmds=$lt_prelink_cmds_CXX - -# Commands necessary for finishing linking programs. -postlink_cmds=$lt_postlink_cmds_CXX - -# Specify filename containing input files. -file_list_spec=$lt_file_list_spec_CXX - -# How to hardcode a shared library path into an executable. -hardcode_action=$hardcode_action_CXX - -# The directories searched by this compiler when creating a shared library. -compiler_lib_search_dirs=$lt_compiler_lib_search_dirs_CXX - -# Dependencies to place before and after the objects being linked to -# create a shared library. -predep_objects=$lt_predep_objects_CXX -postdep_objects=$lt_postdep_objects_CXX -predeps=$lt_predeps_CXX -postdeps=$lt_postdeps_CXX - -# The library search path used internally by the compiler when linking -# a shared library. -compiler_lib_search_path=$lt_compiler_lib_search_path_CXX - -# ### END LIBTOOL TAG CONFIG: CXX -_LT_EOF - - ;; - - esac -done # for ac_tag - - -as_fn_exit 0 -_ACEOF -ac_clean_files=$ac_clean_files_save - -test $ac_write_fail = 0 || - as_fn_error $? "write failure creating $CONFIG_STATUS" "$LINENO" 5 - - -# configure is writing to config.log, and then calls config.status. -# config.status does its own redirection, appending to config.log. -# Unfortunately, on DOS this fails, as config.log is still kept open -# by configure, so config.status won't be able to write to it; its -# output is simply discarded. So we exec the FD to /dev/null, -# effectively closing config.log, so it can be properly (re)opened and -# appended to by config.status. When coming back to configure, we -# need to make the FD available again. -if test "$no_create" != yes; then - ac_cs_success=: - ac_config_status_args= - test "$silent" = yes && - ac_config_status_args="$ac_config_status_args --quiet" - exec 5>/dev/null - $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false - exec 5>>config.log - # Use ||, not &&, to avoid exiting from the if with $? = 1, which - # would make configure fail if this is the last instruction. - $ac_cs_success || as_fn_exit 1 -fi -if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5 -$as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;} -fi - diff --git a/pkg/registry/zookeeper-3.4.6/src/c/configure.ac b/pkg/registry/zookeeper-3.4.6/src/c/configure.ac deleted file mode 100644 index b4ed639fc..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/c/configure.ac +++ /dev/null @@ -1,149 +0,0 @@ -# -*- Autoconf -*- -# Process this file with autoconf to produce a configure script. - -AC_PREREQ(2.59) - -AC_INIT([zookeeper C client],3.4.6,[user@zookeeper.apache.org],[zookeeper]) -AC_CONFIG_SRCDIR([src/zookeeper.c]) - -# Save initial CFLAGS and CXXFLAGS values before AC_PROG_CC and AC_PROG_CXX -init_cflags="$CFLAGS" -init_cxxflags="$CXXFLAGS" - -# initialize Doxygen support -DX_HTML_FEATURE(ON) -DX_CHM_FEATURE(OFF) -DX_CHI_FEATURE(OFF) -DX_MAN_FEATURE(OFF) -DX_RTF_FEATURE(OFF) -DX_XML_FEATURE(OFF) -DX_PDF_FEATURE(OFF) -DX_PS_FEATURE(OFF) -DX_INIT_DOXYGEN([zookeeper],[c-doc.Doxyfile],[docs]) - -# initialize automake -AM_INIT_AUTOMAKE([-Wall foreign]) -AC_CONFIG_HEADER([config.h]) - -# Checks for programs. -AC_ARG_WITH(cppunit, - [ --without-cppunit do not use CPPUNIT]) - -if test "$with_cppunit" = "no" ; then - CPPUNIT_PATH="No_CPPUNIT" - CPPUNIT_INCLUDE= - CPPUNIT_LIBS= -else - AM_PATH_CPPUNIT(1.10.2) -fi - -if test "$CALLER" = "ANT" ; then -CPPUNIT_CFLAGS="$CPPUNIT_CFLAGS -DZKSERVER_CMD=\"\\\"${base_dir}/src/c/tests/zkServer.sh\\\"\"" -else -CPPUNIT_CFLAGS="$CPPUNIT_CFLAGS -DZKSERVER_CMD=\"\\\"./tests/zkServer.sh\\\"\"" -AC_CHECK_FILES([generated/zookeeper.jute.c generated/zookeeper.jute.h],[], - [AC_MSG_ERROR([jute files are missing! Please run "ant compile_jute" while in the zookeeper top level directory.]) -]) -fi -AC_SUBST(CPPUNIT_CFLAGS) - -AC_PROG_CC -AM_PROG_CC_C_O -AC_PROG_CXX -AC_PROG_INSTALL -AC_PROG_LN_S - -# AC_DISABLE_SHARED -AC_PROG_LIBTOOL - -#enable -D_GNU_SOURCE since the return code value of getaddrinfo -#ifdefed with __USE_GNU -#features.h header undef's __USE_GNU and defines it only if _GNU_SOURCE is defined -#hence this define for gcc -AC_ARG_ENABLE([debug], - [AS_HELP_STRING([--enable-debug],[enable debug build [default=no]])], - [],[enable_debug=no]) - -if test "x$enable_debug" = xyes; then - if test "x$init_cflags" = x; then - CFLAGS="" - fi - CFLAGS="$CFLAGS -g -O0 -D_GNU_SOURCE" -else - if test "x$init_cflags" = x; then - CFLAGS="-g -O2 -D_GNU_SOURCE" - fi -fi - -if test "x$enable_debug" = xyes; then - if test "x$init_cxxflags" = x; then - CXXFLAGS="" - fi - CXXFLAGS="$CXXFLAGS -g -O0" -else - if test "x$init_cxxflags" = x; then - CXXFLAGS="-g -O2" - fi -fi - -AC_ARG_WITH([syncapi], - [AS_HELP_STRING([--with-syncapi],[build with support for SyncAPI [default=yes]])], - [],[with_syncapi=yes]) - -# Checks for libraries. -AC_CHECK_LIB([pthread], [pthread_mutex_lock],[have_pthread=yes],[have_pthread=no]) - -if test "x$with_syncapi" != xno && test "x$have_pthread" = xno; then - AC_MSG_WARN([cannot build SyncAPI -- pthread not found]) - with_syncapi=no -fi -if test "x$with_syncapi" != xno; then - AC_MSG_NOTICE([building with SyncAPI support]) -else - AC_MSG_NOTICE([building without SyncAPI support]) -fi - -AM_CONDITIONAL([WANT_SYNCAPI],[test "x$with_syncapi" != xno]) - -# Checks for header files. -AC_HEADER_STDC -AC_CHECK_HEADERS([arpa/inet.h fcntl.h netdb.h netinet/in.h stdlib.h string.h sys/socket.h sys/time.h unistd.h sys/utsname.h]) - -# Checks for typedefs, structures, and compiler characteristics. -AC_C_CONST -AC_C_INLINE -AC_HEADER_TIME -AC_CHECK_TYPE([nfds_t], - [AC_DEFINE([POLL_NFDS_TYPE],[nfds_t],[poll() second argument type])], - [AC_DEFINE([POLL_NFDS_TYPE],[unsigned int],[poll() second argument type])], - [#include ]) - -AC_MSG_CHECKING([whether to enable ipv6]) - -AC_TRY_RUN([ /* is AF_INET6 available? */ -#include -#include -main() -{ - if (socket(AF_INET6, SOCK_STREAM, 0) < 0) - exit(1); - else - exit(0); -} -], AC_MSG_RESULT(yes) - ipv6=yes, - AC_MSG_RESULT(no) - ipv6=no, - AC_MSG_RESULT(no) - ipv6=no) - -if test x"$ipv6" = xyes; then - USEIPV6="-DZOO_IPV6_ENABLED" - AC_SUBST(USEIPV6) -fi - -# Checks for library functions. -AC_CHECK_FUNCS([getcwd gethostbyname gethostname getlogin getpwuid_r gettimeofday getuid memmove memset poll socket strchr strdup strerror strtol]) - -AC_CONFIG_FILES([Makefile]) -AC_OUTPUT diff --git a/pkg/registry/zookeeper-3.4.6/src/c/depcomp b/pkg/registry/zookeeper-3.4.6/src/c/depcomp deleted file mode 100755 index 25a39e6cd..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/c/depcomp +++ /dev/null @@ -1,708 +0,0 @@ -#! /bin/sh -# depcomp - compile a program generating dependencies as side-effects - -scriptversion=2012-03-27.16; # UTC - -# Copyright (C) 1999, 2000, 2003, 2004, 2005, 2006, 2007, 2009, 2010, -# 2011, 2012 Free Software Foundation, Inc. - -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2, or (at your option) -# any later version. - -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. - -# You should have received a copy of the GNU General Public License -# along with this program. If not, see . - -# As a special exception to the GNU General Public License, if you -# distribute this file as part of a program that contains a -# configuration script generated by Autoconf, you may include it under -# the same distribution terms that you use for the rest of that program. - -# Originally written by Alexandre Oliva . - -case $1 in - '') - echo "$0: No command. Try '$0 --help' for more information." 1>&2 - exit 1; - ;; - -h | --h*) - cat <<\EOF -Usage: depcomp [--help] [--version] PROGRAM [ARGS] - -Run PROGRAMS ARGS to compile a file, generating dependencies -as side-effects. - -Environment variables: - depmode Dependency tracking mode. - source Source file read by 'PROGRAMS ARGS'. - object Object file output by 'PROGRAMS ARGS'. - DEPDIR directory where to store dependencies. - depfile Dependency file to output. - tmpdepfile Temporary file to use when outputting dependencies. - libtool Whether libtool is used (yes/no). - -Report bugs to . -EOF - exit $? - ;; - -v | --v*) - echo "depcomp $scriptversion" - exit $? - ;; -esac - -# A tabulation character. -tab=' ' -# A newline character. -nl=' -' - -if test -z "$depmode" || test -z "$source" || test -z "$object"; then - echo "depcomp: Variables source, object and depmode must be set" 1>&2 - exit 1 -fi - -# Dependencies for sub/bar.o or sub/bar.obj go into sub/.deps/bar.Po. -depfile=${depfile-`echo "$object" | - sed 's|[^\\/]*$|'${DEPDIR-.deps}'/&|;s|\.\([^.]*\)$|.P\1|;s|Pobj$|Po|'`} -tmpdepfile=${tmpdepfile-`echo "$depfile" | sed 's/\.\([^.]*\)$/.T\1/'`} - -rm -f "$tmpdepfile" - -# Some modes work just like other modes, but use different flags. We -# parameterize here, but still list the modes in the big case below, -# to make depend.m4 easier to write. Note that we *cannot* use a case -# here, because this file can only contain one case statement. -if test "$depmode" = hp; then - # HP compiler uses -M and no extra arg. - gccflag=-M - depmode=gcc -fi - -if test "$depmode" = dashXmstdout; then - # This is just like dashmstdout with a different argument. - dashmflag=-xM - depmode=dashmstdout -fi - -cygpath_u="cygpath -u -f -" -if test "$depmode" = msvcmsys; then - # This is just like msvisualcpp but w/o cygpath translation. - # Just convert the backslash-escaped backslashes to single forward - # slashes to satisfy depend.m4 - cygpath_u='sed s,\\\\,/,g' - depmode=msvisualcpp -fi - -if test "$depmode" = msvc7msys; then - # This is just like msvc7 but w/o cygpath translation. - # Just convert the backslash-escaped backslashes to single forward - # slashes to satisfy depend.m4 - cygpath_u='sed s,\\\\,/,g' - depmode=msvc7 -fi - -if test "$depmode" = xlc; then - # IBM C/C++ Compilers xlc/xlC can output gcc-like dependency informations. - gccflag=-qmakedep=gcc,-MF - depmode=gcc -fi - -case "$depmode" in -gcc3) -## gcc 3 implements dependency tracking that does exactly what -## we want. Yay! Note: for some reason libtool 1.4 doesn't like -## it if -MD -MP comes after the -MF stuff. Hmm. -## Unfortunately, FreeBSD c89 acceptance of flags depends upon -## the command line argument order; so add the flags where they -## appear in depend2.am. Note that the slowdown incurred here -## affects only configure: in makefiles, %FASTDEP% shortcuts this. - for arg - do - case $arg in - -c) set fnord "$@" -MT "$object" -MD -MP -MF "$tmpdepfile" "$arg" ;; - *) set fnord "$@" "$arg" ;; - esac - shift # fnord - shift # $arg - done - "$@" - stat=$? - if test $stat -eq 0; then : - else - rm -f "$tmpdepfile" - exit $stat - fi - mv "$tmpdepfile" "$depfile" - ;; - -gcc) -## There are various ways to get dependency output from gcc. Here's -## why we pick this rather obscure method: -## - Don't want to use -MD because we'd like the dependencies to end -## up in a subdir. Having to rename by hand is ugly. -## (We might end up doing this anyway to support other compilers.) -## - The DEPENDENCIES_OUTPUT environment variable makes gcc act like -## -MM, not -M (despite what the docs say). -## - Using -M directly means running the compiler twice (even worse -## than renaming). - if test -z "$gccflag"; then - gccflag=-MD, - fi - "$@" -Wp,"$gccflag$tmpdepfile" - stat=$? - if test $stat -eq 0; then : - else - rm -f "$tmpdepfile" - exit $stat - fi - rm -f "$depfile" - echo "$object : \\" > "$depfile" - alpha=ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz -## The second -e expression handles DOS-style file names with drive letters. - sed -e 's/^[^:]*: / /' \ - -e 's/^['$alpha']:\/[^:]*: / /' < "$tmpdepfile" >> "$depfile" -## This next piece of magic avoids the "deleted header file" problem. -## The problem is that when a header file which appears in a .P file -## is deleted, the dependency causes make to die (because there is -## typically no way to rebuild the header). We avoid this by adding -## dummy dependencies for each header file. Too bad gcc doesn't do -## this for us directly. - tr ' ' "$nl" < "$tmpdepfile" | -## Some versions of gcc put a space before the ':'. On the theory -## that the space means something, we add a space to the output as -## well. hp depmode also adds that space, but also prefixes the VPATH -## to the object. Take care to not repeat it in the output. -## Some versions of the HPUX 10.20 sed can't process this invocation -## correctly. Breaking it into two sed invocations is a workaround. - sed -e 's/^\\$//' -e '/^$/d' -e "s|.*$object$||" -e '/:$/d' \ - | sed -e 's/$/ :/' >> "$depfile" - rm -f "$tmpdepfile" - ;; - -hp) - # This case exists only to let depend.m4 do its work. It works by - # looking at the text of this script. This case will never be run, - # since it is checked for above. - exit 1 - ;; - -sgi) - if test "$libtool" = yes; then - "$@" "-Wp,-MDupdate,$tmpdepfile" - else - "$@" -MDupdate "$tmpdepfile" - fi - stat=$? - if test $stat -eq 0; then : - else - rm -f "$tmpdepfile" - exit $stat - fi - rm -f "$depfile" - - if test -f "$tmpdepfile"; then # yes, the sourcefile depend on other files - echo "$object : \\" > "$depfile" - - # Clip off the initial element (the dependent). Don't try to be - # clever and replace this with sed code, as IRIX sed won't handle - # lines with more than a fixed number of characters (4096 in - # IRIX 6.2 sed, 8192 in IRIX 6.5). We also remove comment lines; - # the IRIX cc adds comments like '#:fec' to the end of the - # dependency line. - tr ' ' "$nl" < "$tmpdepfile" \ - | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' | \ - tr "$nl" ' ' >> "$depfile" - echo >> "$depfile" - - # The second pass generates a dummy entry for each header file. - tr ' ' "$nl" < "$tmpdepfile" \ - | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' -e 's/$/:/' \ - >> "$depfile" - else - # The sourcefile does not contain any dependencies, so just - # store a dummy comment line, to avoid errors with the Makefile - # "include basename.Plo" scheme. - echo "#dummy" > "$depfile" - fi - rm -f "$tmpdepfile" - ;; - -xlc) - # This case exists only to let depend.m4 do its work. It works by - # looking at the text of this script. This case will never be run, - # since it is checked for above. - exit 1 - ;; - -aix) - # The C for AIX Compiler uses -M and outputs the dependencies - # in a .u file. In older versions, this file always lives in the - # current directory. Also, the AIX compiler puts '$object:' at the - # start of each line; $object doesn't have directory information. - # Version 6 uses the directory in both cases. - dir=`echo "$object" | sed -e 's|/[^/]*$|/|'` - test "x$dir" = "x$object" && dir= - base=`echo "$object" | sed -e 's|^.*/||' -e 's/\.o$//' -e 's/\.lo$//'` - if test "$libtool" = yes; then - tmpdepfile1=$dir$base.u - tmpdepfile2=$base.u - tmpdepfile3=$dir.libs/$base.u - "$@" -Wc,-M - else - tmpdepfile1=$dir$base.u - tmpdepfile2=$dir$base.u - tmpdepfile3=$dir$base.u - "$@" -M - fi - stat=$? - - if test $stat -eq 0; then : - else - rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" - exit $stat - fi - - for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" - do - test -f "$tmpdepfile" && break - done - if test -f "$tmpdepfile"; then - # Each line is of the form 'foo.o: dependent.h'. - # Do two passes, one to just change these to - # '$object: dependent.h' and one to simply 'dependent.h:'. - sed -e "s,^.*\.[a-z]*:,$object:," < "$tmpdepfile" > "$depfile" - sed -e 's,^.*\.[a-z]*:['"$tab"' ]*,,' -e 's,$,:,' < "$tmpdepfile" >> "$depfile" - else - # The sourcefile does not contain any dependencies, so just - # store a dummy comment line, to avoid errors with the Makefile - # "include basename.Plo" scheme. - echo "#dummy" > "$depfile" - fi - rm -f "$tmpdepfile" - ;; - -icc) - # Intel's C compiler anf tcc (Tiny C Compiler) understand '-MD -MF file'. - # However on - # $CC -MD -MF foo.d -c -o sub/foo.o sub/foo.c - # ICC 7.0 will fill foo.d with something like - # foo.o: sub/foo.c - # foo.o: sub/foo.h - # which is wrong. We want - # sub/foo.o: sub/foo.c - # sub/foo.o: sub/foo.h - # sub/foo.c: - # sub/foo.h: - # ICC 7.1 will output - # foo.o: sub/foo.c sub/foo.h - # and will wrap long lines using '\': - # foo.o: sub/foo.c ... \ - # sub/foo.h ... \ - # ... - # tcc 0.9.26 (FIXME still under development at the moment of writing) - # will emit a similar output, but also prepend the continuation lines - # with horizontal tabulation characters. - "$@" -MD -MF "$tmpdepfile" - stat=$? - if test $stat -eq 0; then : - else - rm -f "$tmpdepfile" - exit $stat - fi - rm -f "$depfile" - # Each line is of the form 'foo.o: dependent.h', - # or 'foo.o: dep1.h dep2.h \', or ' dep3.h dep4.h \'. - # Do two passes, one to just change these to - # '$object: dependent.h' and one to simply 'dependent.h:'. - sed -e "s/^[ $tab][ $tab]*/ /" -e "s,^[^:]*:,$object :," \ - < "$tmpdepfile" > "$depfile" - sed ' - s/[ '"$tab"'][ '"$tab"']*/ /g - s/^ *// - s/ *\\*$// - s/^[^:]*: *// - /^$/d - /:$/d - s/$/ :/ - ' < "$tmpdepfile" >> "$depfile" - rm -f "$tmpdepfile" - ;; - -hp2) - # The "hp" stanza above does not work with aCC (C++) and HP's ia64 - # compilers, which have integrated preprocessors. The correct option - # to use with these is +Maked; it writes dependencies to a file named - # 'foo.d', which lands next to the object file, wherever that - # happens to be. - # Much of this is similar to the tru64 case; see comments there. - dir=`echo "$object" | sed -e 's|/[^/]*$|/|'` - test "x$dir" = "x$object" && dir= - base=`echo "$object" | sed -e 's|^.*/||' -e 's/\.o$//' -e 's/\.lo$//'` - if test "$libtool" = yes; then - tmpdepfile1=$dir$base.d - tmpdepfile2=$dir.libs/$base.d - "$@" -Wc,+Maked - else - tmpdepfile1=$dir$base.d - tmpdepfile2=$dir$base.d - "$@" +Maked - fi - stat=$? - if test $stat -eq 0; then : - else - rm -f "$tmpdepfile1" "$tmpdepfile2" - exit $stat - fi - - for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" - do - test -f "$tmpdepfile" && break - done - if test -f "$tmpdepfile"; then - sed -e "s,^.*\.[a-z]*:,$object:," "$tmpdepfile" > "$depfile" - # Add 'dependent.h:' lines. - sed -ne '2,${ - s/^ *// - s/ \\*$// - s/$/:/ - p - }' "$tmpdepfile" >> "$depfile" - else - echo "#dummy" > "$depfile" - fi - rm -f "$tmpdepfile" "$tmpdepfile2" - ;; - -tru64) - # The Tru64 compiler uses -MD to generate dependencies as a side - # effect. 'cc -MD -o foo.o ...' puts the dependencies into 'foo.o.d'. - # At least on Alpha/Redhat 6.1, Compaq CCC V6.2-504 seems to put - # dependencies in 'foo.d' instead, so we check for that too. - # Subdirectories are respected. - dir=`echo "$object" | sed -e 's|/[^/]*$|/|'` - test "x$dir" = "x$object" && dir= - base=`echo "$object" | sed -e 's|^.*/||' -e 's/\.o$//' -e 's/\.lo$//'` - - if test "$libtool" = yes; then - # With Tru64 cc, shared objects can also be used to make a - # static library. This mechanism is used in libtool 1.4 series to - # handle both shared and static libraries in a single compilation. - # With libtool 1.4, dependencies were output in $dir.libs/$base.lo.d. - # - # With libtool 1.5 this exception was removed, and libtool now - # generates 2 separate objects for the 2 libraries. These two - # compilations output dependencies in $dir.libs/$base.o.d and - # in $dir$base.o.d. We have to check for both files, because - # one of the two compilations can be disabled. We should prefer - # $dir$base.o.d over $dir.libs/$base.o.d because the latter is - # automatically cleaned when .libs/ is deleted, while ignoring - # the former would cause a distcleancheck panic. - tmpdepfile1=$dir.libs/$base.lo.d # libtool 1.4 - tmpdepfile2=$dir$base.o.d # libtool 1.5 - tmpdepfile3=$dir.libs/$base.o.d # libtool 1.5 - tmpdepfile4=$dir.libs/$base.d # Compaq CCC V6.2-504 - "$@" -Wc,-MD - else - tmpdepfile1=$dir$base.o.d - tmpdepfile2=$dir$base.d - tmpdepfile3=$dir$base.d - tmpdepfile4=$dir$base.d - "$@" -MD - fi - - stat=$? - if test $stat -eq 0; then : - else - rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" "$tmpdepfile4" - exit $stat - fi - - for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" "$tmpdepfile4" - do - test -f "$tmpdepfile" && break - done - if test -f "$tmpdepfile"; then - sed -e "s,^.*\.[a-z]*:,$object:," < "$tmpdepfile" > "$depfile" - sed -e 's,^.*\.[a-z]*:['"$tab"' ]*,,' -e 's,$,:,' < "$tmpdepfile" >> "$depfile" - else - echo "#dummy" > "$depfile" - fi - rm -f "$tmpdepfile" - ;; - -msvc7) - if test "$libtool" = yes; then - showIncludes=-Wc,-showIncludes - else - showIncludes=-showIncludes - fi - "$@" $showIncludes > "$tmpdepfile" - stat=$? - grep -v '^Note: including file: ' "$tmpdepfile" - if test "$stat" = 0; then : - else - rm -f "$tmpdepfile" - exit $stat - fi - rm -f "$depfile" - echo "$object : \\" > "$depfile" - # The first sed program below extracts the file names and escapes - # backslashes for cygpath. The second sed program outputs the file - # name when reading, but also accumulates all include files in the - # hold buffer in order to output them again at the end. This only - # works with sed implementations that can handle large buffers. - sed < "$tmpdepfile" -n ' -/^Note: including file: *\(.*\)/ { - s//\1/ - s/\\/\\\\/g - p -}' | $cygpath_u | sort -u | sed -n ' -s/ /\\ /g -s/\(.*\)/'"$tab"'\1 \\/p -s/.\(.*\) \\/\1:/ -H -$ { - s/.*/'"$tab"'/ - G - p -}' >> "$depfile" - rm -f "$tmpdepfile" - ;; - -msvc7msys) - # This case exists only to let depend.m4 do its work. It works by - # looking at the text of this script. This case will never be run, - # since it is checked for above. - exit 1 - ;; - -#nosideeffect) - # This comment above is used by automake to tell side-effect - # dependency tracking mechanisms from slower ones. - -dashmstdout) - # Important note: in order to support this mode, a compiler *must* - # always write the preprocessed file to stdout, regardless of -o. - "$@" || exit $? - - # Remove the call to Libtool. - if test "$libtool" = yes; then - while test "X$1" != 'X--mode=compile'; do - shift - done - shift - fi - - # Remove '-o $object'. - IFS=" " - for arg - do - case $arg in - -o) - shift - ;; - $object) - shift - ;; - *) - set fnord "$@" "$arg" - shift # fnord - shift # $arg - ;; - esac - done - - test -z "$dashmflag" && dashmflag=-M - # Require at least two characters before searching for ':' - # in the target name. This is to cope with DOS-style filenames: - # a dependency such as 'c:/foo/bar' could be seen as target 'c' otherwise. - "$@" $dashmflag | - sed 's:^['"$tab"' ]*[^:'"$tab"' ][^:][^:]*\:['"$tab"' ]*:'"$object"'\: :' > "$tmpdepfile" - rm -f "$depfile" - cat < "$tmpdepfile" > "$depfile" - tr ' ' "$nl" < "$tmpdepfile" | \ -## Some versions of the HPUX 10.20 sed can't process this invocation -## correctly. Breaking it into two sed invocations is a workaround. - sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile" - rm -f "$tmpdepfile" - ;; - -dashXmstdout) - # This case only exists to satisfy depend.m4. It is never actually - # run, as this mode is specially recognized in the preamble. - exit 1 - ;; - -makedepend) - "$@" || exit $? - # Remove any Libtool call - if test "$libtool" = yes; then - while test "X$1" != 'X--mode=compile'; do - shift - done - shift - fi - # X makedepend - shift - cleared=no eat=no - for arg - do - case $cleared in - no) - set ""; shift - cleared=yes ;; - esac - if test $eat = yes; then - eat=no - continue - fi - case "$arg" in - -D*|-I*) - set fnord "$@" "$arg"; shift ;; - # Strip any option that makedepend may not understand. Remove - # the object too, otherwise makedepend will parse it as a source file. - -arch) - eat=yes ;; - -*|$object) - ;; - *) - set fnord "$@" "$arg"; shift ;; - esac - done - obj_suffix=`echo "$object" | sed 's/^.*\././'` - touch "$tmpdepfile" - ${MAKEDEPEND-makedepend} -o"$obj_suffix" -f"$tmpdepfile" "$@" - rm -f "$depfile" - # makedepend may prepend the VPATH from the source file name to the object. - # No need to regex-escape $object, excess matching of '.' is harmless. - sed "s|^.*\($object *:\)|\1|" "$tmpdepfile" > "$depfile" - sed '1,2d' "$tmpdepfile" | tr ' ' "$nl" | \ -## Some versions of the HPUX 10.20 sed can't process this invocation -## correctly. Breaking it into two sed invocations is a workaround. - sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile" - rm -f "$tmpdepfile" "$tmpdepfile".bak - ;; - -cpp) - # Important note: in order to support this mode, a compiler *must* - # always write the preprocessed file to stdout. - "$@" || exit $? - - # Remove the call to Libtool. - if test "$libtool" = yes; then - while test "X$1" != 'X--mode=compile'; do - shift - done - shift - fi - - # Remove '-o $object'. - IFS=" " - for arg - do - case $arg in - -o) - shift - ;; - $object) - shift - ;; - *) - set fnord "$@" "$arg" - shift # fnord - shift # $arg - ;; - esac - done - - "$@" -E | - sed -n -e '/^# [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \ - -e '/^#line [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' | - sed '$ s: \\$::' > "$tmpdepfile" - rm -f "$depfile" - echo "$object : \\" > "$depfile" - cat < "$tmpdepfile" >> "$depfile" - sed < "$tmpdepfile" '/^$/d;s/^ //;s/ \\$//;s/$/ :/' >> "$depfile" - rm -f "$tmpdepfile" - ;; - -msvisualcpp) - # Important note: in order to support this mode, a compiler *must* - # always write the preprocessed file to stdout. - "$@" || exit $? - - # Remove the call to Libtool. - if test "$libtool" = yes; then - while test "X$1" != 'X--mode=compile'; do - shift - done - shift - fi - - IFS=" " - for arg - do - case "$arg" in - -o) - shift - ;; - $object) - shift - ;; - "-Gm"|"/Gm"|"-Gi"|"/Gi"|"-ZI"|"/ZI") - set fnord "$@" - shift - shift - ;; - *) - set fnord "$@" "$arg" - shift - shift - ;; - esac - done - "$@" -E 2>/dev/null | - sed -n '/^#line [0-9][0-9]* "\([^"]*\)"/ s::\1:p' | $cygpath_u | sort -u > "$tmpdepfile" - rm -f "$depfile" - echo "$object : \\" > "$depfile" - sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::'"$tab"'\1 \\:p' >> "$depfile" - echo "$tab" >> "$depfile" - sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::\1\::p' >> "$depfile" - rm -f "$tmpdepfile" - ;; - -msvcmsys) - # This case exists only to let depend.m4 do its work. It works by - # looking at the text of this script. This case will never be run, - # since it is checked for above. - exit 1 - ;; - -none) - exec "$@" - ;; - -*) - echo "Unknown depmode $depmode" 1>&2 - exit 1 - ;; -esac - -exit 0 - -# Local Variables: -# mode: shell-script -# sh-indentation: 2 -# eval: (add-hook 'write-file-hooks 'time-stamp) -# time-stamp-start: "scriptversion=" -# time-stamp-format: "%:y-%02m-%02d.%02H" -# time-stamp-time-zone: "UTC" -# time-stamp-end: "; # UTC" -# End: diff --git a/pkg/registry/zookeeper-3.4.6/src/c/generated/zookeeper.jute.c b/pkg/registry/zookeeper-3.4.6/src/c/generated/zookeeper.jute.c deleted file mode 100644 index 5823c2f01..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/c/generated/zookeeper.jute.c +++ /dev/null @@ -1,1315 +0,0 @@ -/** -* Licensed to the Apache Software Foundation (ASF) under one -* or more contributor license agreements. See the NOTICE file -* distributed with this work for additional information -* regarding copyright ownership. The ASF licenses this file -* to you 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. -*/ - -#include -#include "zookeeper.jute.h" - -int serialize_Id(struct oarchive *out, const char *tag, struct Id *v){ - int rc; - rc = out->start_record(out, tag); - rc = rc ? rc : out->serialize_String(out, "scheme", &v->scheme); - rc = rc ? rc : out->serialize_String(out, "id", &v->id); - rc = rc ? rc : out->end_record(out, tag); - return rc; -} -int deserialize_Id(struct iarchive *in, const char *tag, struct Id*v){ - int rc; - rc = in->start_record(in, tag); - rc = rc ? rc : in->deserialize_String(in, "scheme", &v->scheme); - rc = rc ? rc : in->deserialize_String(in, "id", &v->id); - rc = rc ? rc : in->end_record(in, tag); - return rc; -} -void deallocate_Id(struct Id*v){ - deallocate_String(&v->scheme); - deallocate_String(&v->id); -} -int serialize_ACL(struct oarchive *out, const char *tag, struct ACL *v){ - int rc; - rc = out->start_record(out, tag); - rc = rc ? rc : out->serialize_Int(out, "perms", &v->perms); - rc = rc ? rc : serialize_Id(out, "id", &v->id); - rc = rc ? rc : out->end_record(out, tag); - return rc; -} -int deserialize_ACL(struct iarchive *in, const char *tag, struct ACL*v){ - int rc; - rc = in->start_record(in, tag); - rc = rc ? rc : in->deserialize_Int(in, "perms", &v->perms); - rc = rc ? rc : deserialize_Id(in, "id", &v->id); - rc = rc ? rc : in->end_record(in, tag); - return rc; -} -void deallocate_ACL(struct ACL*v){ - deallocate_Id(&v->id); -} -int serialize_Stat(struct oarchive *out, const char *tag, struct Stat *v){ - int rc; - rc = out->start_record(out, tag); - rc = rc ? rc : out->serialize_Long(out, "czxid", &v->czxid); - rc = rc ? rc : out->serialize_Long(out, "mzxid", &v->mzxid); - rc = rc ? rc : out->serialize_Long(out, "ctime", &v->ctime); - rc = rc ? rc : out->serialize_Long(out, "mtime", &v->mtime); - rc = rc ? rc : out->serialize_Int(out, "version", &v->version); - rc = rc ? rc : out->serialize_Int(out, "cversion", &v->cversion); - rc = rc ? rc : out->serialize_Int(out, "aversion", &v->aversion); - rc = rc ? rc : out->serialize_Long(out, "ephemeralOwner", &v->ephemeralOwner); - rc = rc ? rc : out->serialize_Int(out, "dataLength", &v->dataLength); - rc = rc ? rc : out->serialize_Int(out, "numChildren", &v->numChildren); - rc = rc ? rc : out->serialize_Long(out, "pzxid", &v->pzxid); - rc = rc ? rc : out->end_record(out, tag); - return rc; -} -int deserialize_Stat(struct iarchive *in, const char *tag, struct Stat*v){ - int rc; - rc = in->start_record(in, tag); - rc = rc ? rc : in->deserialize_Long(in, "czxid", &v->czxid); - rc = rc ? rc : in->deserialize_Long(in, "mzxid", &v->mzxid); - rc = rc ? rc : in->deserialize_Long(in, "ctime", &v->ctime); - rc = rc ? rc : in->deserialize_Long(in, "mtime", &v->mtime); - rc = rc ? rc : in->deserialize_Int(in, "version", &v->version); - rc = rc ? rc : in->deserialize_Int(in, "cversion", &v->cversion); - rc = rc ? rc : in->deserialize_Int(in, "aversion", &v->aversion); - rc = rc ? rc : in->deserialize_Long(in, "ephemeralOwner", &v->ephemeralOwner); - rc = rc ? rc : in->deserialize_Int(in, "dataLength", &v->dataLength); - rc = rc ? rc : in->deserialize_Int(in, "numChildren", &v->numChildren); - rc = rc ? rc : in->deserialize_Long(in, "pzxid", &v->pzxid); - rc = rc ? rc : in->end_record(in, tag); - return rc; -} -void deallocate_Stat(struct Stat*v){ -} -int serialize_StatPersisted(struct oarchive *out, const char *tag, struct StatPersisted *v){ - int rc; - rc = out->start_record(out, tag); - rc = rc ? rc : out->serialize_Long(out, "czxid", &v->czxid); - rc = rc ? rc : out->serialize_Long(out, "mzxid", &v->mzxid); - rc = rc ? rc : out->serialize_Long(out, "ctime", &v->ctime); - rc = rc ? rc : out->serialize_Long(out, "mtime", &v->mtime); - rc = rc ? rc : out->serialize_Int(out, "version", &v->version); - rc = rc ? rc : out->serialize_Int(out, "cversion", &v->cversion); - rc = rc ? rc : out->serialize_Int(out, "aversion", &v->aversion); - rc = rc ? rc : out->serialize_Long(out, "ephemeralOwner", &v->ephemeralOwner); - rc = rc ? rc : out->serialize_Long(out, "pzxid", &v->pzxid); - rc = rc ? rc : out->end_record(out, tag); - return rc; -} -int deserialize_StatPersisted(struct iarchive *in, const char *tag, struct StatPersisted*v){ - int rc; - rc = in->start_record(in, tag); - rc = rc ? rc : in->deserialize_Long(in, "czxid", &v->czxid); - rc = rc ? rc : in->deserialize_Long(in, "mzxid", &v->mzxid); - rc = rc ? rc : in->deserialize_Long(in, "ctime", &v->ctime); - rc = rc ? rc : in->deserialize_Long(in, "mtime", &v->mtime); - rc = rc ? rc : in->deserialize_Int(in, "version", &v->version); - rc = rc ? rc : in->deserialize_Int(in, "cversion", &v->cversion); - rc = rc ? rc : in->deserialize_Int(in, "aversion", &v->aversion); - rc = rc ? rc : in->deserialize_Long(in, "ephemeralOwner", &v->ephemeralOwner); - rc = rc ? rc : in->deserialize_Long(in, "pzxid", &v->pzxid); - rc = rc ? rc : in->end_record(in, tag); - return rc; -} -void deallocate_StatPersisted(struct StatPersisted*v){ -} -int serialize_StatPersistedV1(struct oarchive *out, const char *tag, struct StatPersistedV1 *v){ - int rc; - rc = out->start_record(out, tag); - rc = rc ? rc : out->serialize_Long(out, "czxid", &v->czxid); - rc = rc ? rc : out->serialize_Long(out, "mzxid", &v->mzxid); - rc = rc ? rc : out->serialize_Long(out, "ctime", &v->ctime); - rc = rc ? rc : out->serialize_Long(out, "mtime", &v->mtime); - rc = rc ? rc : out->serialize_Int(out, "version", &v->version); - rc = rc ? rc : out->serialize_Int(out, "cversion", &v->cversion); - rc = rc ? rc : out->serialize_Int(out, "aversion", &v->aversion); - rc = rc ? rc : out->serialize_Long(out, "ephemeralOwner", &v->ephemeralOwner); - rc = rc ? rc : out->end_record(out, tag); - return rc; -} -int deserialize_StatPersistedV1(struct iarchive *in, const char *tag, struct StatPersistedV1*v){ - int rc; - rc = in->start_record(in, tag); - rc = rc ? rc : in->deserialize_Long(in, "czxid", &v->czxid); - rc = rc ? rc : in->deserialize_Long(in, "mzxid", &v->mzxid); - rc = rc ? rc : in->deserialize_Long(in, "ctime", &v->ctime); - rc = rc ? rc : in->deserialize_Long(in, "mtime", &v->mtime); - rc = rc ? rc : in->deserialize_Int(in, "version", &v->version); - rc = rc ? rc : in->deserialize_Int(in, "cversion", &v->cversion); - rc = rc ? rc : in->deserialize_Int(in, "aversion", &v->aversion); - rc = rc ? rc : in->deserialize_Long(in, "ephemeralOwner", &v->ephemeralOwner); - rc = rc ? rc : in->end_record(in, tag); - return rc; -} -void deallocate_StatPersistedV1(struct StatPersistedV1*v){ -} -int serialize_ConnectRequest(struct oarchive *out, const char *tag, struct ConnectRequest *v){ - int rc; - rc = out->start_record(out, tag); - rc = rc ? rc : out->serialize_Int(out, "protocolVersion", &v->protocolVersion); - rc = rc ? rc : out->serialize_Long(out, "lastZxidSeen", &v->lastZxidSeen); - rc = rc ? rc : out->serialize_Int(out, "timeOut", &v->timeOut); - rc = rc ? rc : out->serialize_Long(out, "sessionId", &v->sessionId); - rc = rc ? rc : out->serialize_Buffer(out, "passwd", &v->passwd); - rc = rc ? rc : out->end_record(out, tag); - return rc; -} -int deserialize_ConnectRequest(struct iarchive *in, const char *tag, struct ConnectRequest*v){ - int rc; - rc = in->start_record(in, tag); - rc = rc ? rc : in->deserialize_Int(in, "protocolVersion", &v->protocolVersion); - rc = rc ? rc : in->deserialize_Long(in, "lastZxidSeen", &v->lastZxidSeen); - rc = rc ? rc : in->deserialize_Int(in, "timeOut", &v->timeOut); - rc = rc ? rc : in->deserialize_Long(in, "sessionId", &v->sessionId); - rc = rc ? rc : in->deserialize_Buffer(in, "passwd", &v->passwd); - rc = rc ? rc : in->end_record(in, tag); - return rc; -} -void deallocate_ConnectRequest(struct ConnectRequest*v){ - deallocate_Buffer(&v->passwd); -} -int serialize_ConnectResponse(struct oarchive *out, const char *tag, struct ConnectResponse *v){ - int rc; - rc = out->start_record(out, tag); - rc = rc ? rc : out->serialize_Int(out, "protocolVersion", &v->protocolVersion); - rc = rc ? rc : out->serialize_Int(out, "timeOut", &v->timeOut); - rc = rc ? rc : out->serialize_Long(out, "sessionId", &v->sessionId); - rc = rc ? rc : out->serialize_Buffer(out, "passwd", &v->passwd); - rc = rc ? rc : out->end_record(out, tag); - return rc; -} -int deserialize_ConnectResponse(struct iarchive *in, const char *tag, struct ConnectResponse*v){ - int rc; - rc = in->start_record(in, tag); - rc = rc ? rc : in->deserialize_Int(in, "protocolVersion", &v->protocolVersion); - rc = rc ? rc : in->deserialize_Int(in, "timeOut", &v->timeOut); - rc = rc ? rc : in->deserialize_Long(in, "sessionId", &v->sessionId); - rc = rc ? rc : in->deserialize_Buffer(in, "passwd", &v->passwd); - rc = rc ? rc : in->end_record(in, tag); - return rc; -} -void deallocate_ConnectResponse(struct ConnectResponse*v){ - deallocate_Buffer(&v->passwd); -} -int allocate_String_vector(struct String_vector *v, int32_t len) { - if (!len) { - v->count = 0; - v->data = 0; - } else { - v->count = len; - v->data = calloc(sizeof(*v->data), len); - } - return 0; -} -int deallocate_String_vector(struct String_vector *v) { - if (v->data) { - int32_t i; - for(i=0;icount; i++) { - deallocate_String(&v->data[i]); - } - free(v->data); - v->data = 0; - } - return 0; -} -int serialize_String_vector(struct oarchive *out, const char *tag, struct String_vector *v) -{ - int32_t count = v->count; - int rc = 0; - int32_t i; - rc = out->start_vector(out, tag, &count); - for(i=0;icount;i++) { - rc = rc ? rc : out->serialize_String(out, "data", &v->data[i]); - } - rc = rc ? rc : out->end_vector(out, tag); - return rc; -} -int deserialize_String_vector(struct iarchive *in, const char *tag, struct String_vector *v) -{ - int rc = 0; - int32_t i; - rc = in->start_vector(in, tag, &v->count); - v->data = calloc(v->count, sizeof(*v->data)); - for(i=0;icount;i++) { - rc = rc ? rc : in->deserialize_String(in, "value", &v->data[i]); - } - rc = in->end_vector(in, tag); - return rc; -} -int serialize_SetWatches(struct oarchive *out, const char *tag, struct SetWatches *v){ - int rc; - rc = out->start_record(out, tag); - rc = rc ? rc : out->serialize_Long(out, "relativeZxid", &v->relativeZxid); - rc = rc ? rc : serialize_String_vector(out, "dataWatches", &v->dataWatches); - rc = rc ? rc : serialize_String_vector(out, "existWatches", &v->existWatches); - rc = rc ? rc : serialize_String_vector(out, "childWatches", &v->childWatches); - rc = rc ? rc : out->end_record(out, tag); - return rc; -} -int deserialize_SetWatches(struct iarchive *in, const char *tag, struct SetWatches*v){ - int rc; - rc = in->start_record(in, tag); - rc = rc ? rc : in->deserialize_Long(in, "relativeZxid", &v->relativeZxid); - rc = rc ? rc : deserialize_String_vector(in, "dataWatches", &v->dataWatches); - rc = rc ? rc : deserialize_String_vector(in, "existWatches", &v->existWatches); - rc = rc ? rc : deserialize_String_vector(in, "childWatches", &v->childWatches); - rc = rc ? rc : in->end_record(in, tag); - return rc; -} -void deallocate_SetWatches(struct SetWatches*v){ - deallocate_String_vector(&v->dataWatches); - deallocate_String_vector(&v->existWatches); - deallocate_String_vector(&v->childWatches); -} -int serialize_RequestHeader(struct oarchive *out, const char *tag, struct RequestHeader *v){ - int rc; - rc = out->start_record(out, tag); - rc = rc ? rc : out->serialize_Int(out, "xid", &v->xid); - rc = rc ? rc : out->serialize_Int(out, "type", &v->type); - rc = rc ? rc : out->end_record(out, tag); - return rc; -} -int deserialize_RequestHeader(struct iarchive *in, const char *tag, struct RequestHeader*v){ - int rc; - rc = in->start_record(in, tag); - rc = rc ? rc : in->deserialize_Int(in, "xid", &v->xid); - rc = rc ? rc : in->deserialize_Int(in, "type", &v->type); - rc = rc ? rc : in->end_record(in, tag); - return rc; -} -void deallocate_RequestHeader(struct RequestHeader*v){ -} -int serialize_MultiHeader(struct oarchive *out, const char *tag, struct MultiHeader *v){ - int rc; - rc = out->start_record(out, tag); - rc = rc ? rc : out->serialize_Int(out, "type", &v->type); - rc = rc ? rc : out->serialize_Bool(out, "done", &v->done); - rc = rc ? rc : out->serialize_Int(out, "err", &v->err); - rc = rc ? rc : out->end_record(out, tag); - return rc; -} -int deserialize_MultiHeader(struct iarchive *in, const char *tag, struct MultiHeader*v){ - int rc; - rc = in->start_record(in, tag); - rc = rc ? rc : in->deserialize_Int(in, "type", &v->type); - rc = rc ? rc : in->deserialize_Bool(in, "done", &v->done); - rc = rc ? rc : in->deserialize_Int(in, "err", &v->err); - rc = rc ? rc : in->end_record(in, tag); - return rc; -} -void deallocate_MultiHeader(struct MultiHeader*v){ -} -int serialize_AuthPacket(struct oarchive *out, const char *tag, struct AuthPacket *v){ - int rc; - rc = out->start_record(out, tag); - rc = rc ? rc : out->serialize_Int(out, "type", &v->type); - rc = rc ? rc : out->serialize_String(out, "scheme", &v->scheme); - rc = rc ? rc : out->serialize_Buffer(out, "auth", &v->auth); - rc = rc ? rc : out->end_record(out, tag); - return rc; -} -int deserialize_AuthPacket(struct iarchive *in, const char *tag, struct AuthPacket*v){ - int rc; - rc = in->start_record(in, tag); - rc = rc ? rc : in->deserialize_Int(in, "type", &v->type); - rc = rc ? rc : in->deserialize_String(in, "scheme", &v->scheme); - rc = rc ? rc : in->deserialize_Buffer(in, "auth", &v->auth); - rc = rc ? rc : in->end_record(in, tag); - return rc; -} -void deallocate_AuthPacket(struct AuthPacket*v){ - deallocate_String(&v->scheme); - deallocate_Buffer(&v->auth); -} -int serialize_ReplyHeader(struct oarchive *out, const char *tag, struct ReplyHeader *v){ - int rc; - rc = out->start_record(out, tag); - rc = rc ? rc : out->serialize_Int(out, "xid", &v->xid); - rc = rc ? rc : out->serialize_Long(out, "zxid", &v->zxid); - rc = rc ? rc : out->serialize_Int(out, "err", &v->err); - rc = rc ? rc : out->end_record(out, tag); - return rc; -} -int deserialize_ReplyHeader(struct iarchive *in, const char *tag, struct ReplyHeader*v){ - int rc; - rc = in->start_record(in, tag); - rc = rc ? rc : in->deserialize_Int(in, "xid", &v->xid); - rc = rc ? rc : in->deserialize_Long(in, "zxid", &v->zxid); - rc = rc ? rc : in->deserialize_Int(in, "err", &v->err); - rc = rc ? rc : in->end_record(in, tag); - return rc; -} -void deallocate_ReplyHeader(struct ReplyHeader*v){ -} -int serialize_GetDataRequest(struct oarchive *out, const char *tag, struct GetDataRequest *v){ - int rc; - rc = out->start_record(out, tag); - rc = rc ? rc : out->serialize_String(out, "path", &v->path); - rc = rc ? rc : out->serialize_Bool(out, "watch", &v->watch); - rc = rc ? rc : out->end_record(out, tag); - return rc; -} -int deserialize_GetDataRequest(struct iarchive *in, const char *tag, struct GetDataRequest*v){ - int rc; - rc = in->start_record(in, tag); - rc = rc ? rc : in->deserialize_String(in, "path", &v->path); - rc = rc ? rc : in->deserialize_Bool(in, "watch", &v->watch); - rc = rc ? rc : in->end_record(in, tag); - return rc; -} -void deallocate_GetDataRequest(struct GetDataRequest*v){ - deallocate_String(&v->path); -} -int serialize_SetDataRequest(struct oarchive *out, const char *tag, struct SetDataRequest *v){ - int rc; - rc = out->start_record(out, tag); - rc = rc ? rc : out->serialize_String(out, "path", &v->path); - rc = rc ? rc : out->serialize_Buffer(out, "data", &v->data); - rc = rc ? rc : out->serialize_Int(out, "version", &v->version); - rc = rc ? rc : out->end_record(out, tag); - return rc; -} -int deserialize_SetDataRequest(struct iarchive *in, const char *tag, struct SetDataRequest*v){ - int rc; - rc = in->start_record(in, tag); - rc = rc ? rc : in->deserialize_String(in, "path", &v->path); - rc = rc ? rc : in->deserialize_Buffer(in, "data", &v->data); - rc = rc ? rc : in->deserialize_Int(in, "version", &v->version); - rc = rc ? rc : in->end_record(in, tag); - return rc; -} -void deallocate_SetDataRequest(struct SetDataRequest*v){ - deallocate_String(&v->path); - deallocate_Buffer(&v->data); -} -int serialize_SetDataResponse(struct oarchive *out, const char *tag, struct SetDataResponse *v){ - int rc; - rc = out->start_record(out, tag); - rc = rc ? rc : serialize_Stat(out, "stat", &v->stat); - rc = rc ? rc : out->end_record(out, tag); - return rc; -} -int deserialize_SetDataResponse(struct iarchive *in, const char *tag, struct SetDataResponse*v){ - int rc; - rc = in->start_record(in, tag); - rc = rc ? rc : deserialize_Stat(in, "stat", &v->stat); - rc = rc ? rc : in->end_record(in, tag); - return rc; -} -void deallocate_SetDataResponse(struct SetDataResponse*v){ - deallocate_Stat(&v->stat); -} -int serialize_GetSASLRequest(struct oarchive *out, const char *tag, struct GetSASLRequest *v){ - int rc; - rc = out->start_record(out, tag); - rc = rc ? rc : out->serialize_Buffer(out, "token", &v->token); - rc = rc ? rc : out->end_record(out, tag); - return rc; -} -int deserialize_GetSASLRequest(struct iarchive *in, const char *tag, struct GetSASLRequest*v){ - int rc; - rc = in->start_record(in, tag); - rc = rc ? rc : in->deserialize_Buffer(in, "token", &v->token); - rc = rc ? rc : in->end_record(in, tag); - return rc; -} -void deallocate_GetSASLRequest(struct GetSASLRequest*v){ - deallocate_Buffer(&v->token); -} -int serialize_SetSASLRequest(struct oarchive *out, const char *tag, struct SetSASLRequest *v){ - int rc; - rc = out->start_record(out, tag); - rc = rc ? rc : out->serialize_Buffer(out, "token", &v->token); - rc = rc ? rc : out->end_record(out, tag); - return rc; -} -int deserialize_SetSASLRequest(struct iarchive *in, const char *tag, struct SetSASLRequest*v){ - int rc; - rc = in->start_record(in, tag); - rc = rc ? rc : in->deserialize_Buffer(in, "token", &v->token); - rc = rc ? rc : in->end_record(in, tag); - return rc; -} -void deallocate_SetSASLRequest(struct SetSASLRequest*v){ - deallocate_Buffer(&v->token); -} -int serialize_SetSASLResponse(struct oarchive *out, const char *tag, struct SetSASLResponse *v){ - int rc; - rc = out->start_record(out, tag); - rc = rc ? rc : out->serialize_Buffer(out, "token", &v->token); - rc = rc ? rc : out->end_record(out, tag); - return rc; -} -int deserialize_SetSASLResponse(struct iarchive *in, const char *tag, struct SetSASLResponse*v){ - int rc; - rc = in->start_record(in, tag); - rc = rc ? rc : in->deserialize_Buffer(in, "token", &v->token); - rc = rc ? rc : in->end_record(in, tag); - return rc; -} -void deallocate_SetSASLResponse(struct SetSASLResponse*v){ - deallocate_Buffer(&v->token); -} -int allocate_ACL_vector(struct ACL_vector *v, int32_t len) { - if (!len) { - v->count = 0; - v->data = 0; - } else { - v->count = len; - v->data = calloc(sizeof(*v->data), len); - } - return 0; -} -int deallocate_ACL_vector(struct ACL_vector *v) { - if (v->data) { - int32_t i; - for(i=0;icount; i++) { - deallocate_ACL(&v->data[i]); - } - free(v->data); - v->data = 0; - } - return 0; -} -int serialize_ACL_vector(struct oarchive *out, const char *tag, struct ACL_vector *v) -{ - int32_t count = v->count; - int rc = 0; - int32_t i; - rc = out->start_vector(out, tag, &count); - for(i=0;icount;i++) { - rc = rc ? rc : serialize_ACL(out, "data", &v->data[i]); - } - rc = rc ? rc : out->end_vector(out, tag); - return rc; -} -int deserialize_ACL_vector(struct iarchive *in, const char *tag, struct ACL_vector *v) -{ - int rc = 0; - int32_t i; - rc = in->start_vector(in, tag, &v->count); - v->data = calloc(v->count, sizeof(*v->data)); - for(i=0;icount;i++) { - rc = rc ? rc : deserialize_ACL(in, "value", &v->data[i]); - } - rc = in->end_vector(in, tag); - return rc; -} -int serialize_CreateRequest(struct oarchive *out, const char *tag, struct CreateRequest *v){ - int rc; - rc = out->start_record(out, tag); - rc = rc ? rc : out->serialize_String(out, "path", &v->path); - rc = rc ? rc : out->serialize_Buffer(out, "data", &v->data); - rc = rc ? rc : serialize_ACL_vector(out, "acl", &v->acl); - rc = rc ? rc : out->serialize_Int(out, "flags", &v->flags); - rc = rc ? rc : out->end_record(out, tag); - return rc; -} -int deserialize_CreateRequest(struct iarchive *in, const char *tag, struct CreateRequest*v){ - int rc; - rc = in->start_record(in, tag); - rc = rc ? rc : in->deserialize_String(in, "path", &v->path); - rc = rc ? rc : in->deserialize_Buffer(in, "data", &v->data); - rc = rc ? rc : deserialize_ACL_vector(in, "acl", &v->acl); - rc = rc ? rc : in->deserialize_Int(in, "flags", &v->flags); - rc = rc ? rc : in->end_record(in, tag); - return rc; -} -void deallocate_CreateRequest(struct CreateRequest*v){ - deallocate_String(&v->path); - deallocate_Buffer(&v->data); - deallocate_ACL_vector(&v->acl); -} -int serialize_DeleteRequest(struct oarchive *out, const char *tag, struct DeleteRequest *v){ - int rc; - rc = out->start_record(out, tag); - rc = rc ? rc : out->serialize_String(out, "path", &v->path); - rc = rc ? rc : out->serialize_Int(out, "version", &v->version); - rc = rc ? rc : out->end_record(out, tag); - return rc; -} -int deserialize_DeleteRequest(struct iarchive *in, const char *tag, struct DeleteRequest*v){ - int rc; - rc = in->start_record(in, tag); - rc = rc ? rc : in->deserialize_String(in, "path", &v->path); - rc = rc ? rc : in->deserialize_Int(in, "version", &v->version); - rc = rc ? rc : in->end_record(in, tag); - return rc; -} -void deallocate_DeleteRequest(struct DeleteRequest*v){ - deallocate_String(&v->path); -} -int serialize_GetChildrenRequest(struct oarchive *out, const char *tag, struct GetChildrenRequest *v){ - int rc; - rc = out->start_record(out, tag); - rc = rc ? rc : out->serialize_String(out, "path", &v->path); - rc = rc ? rc : out->serialize_Bool(out, "watch", &v->watch); - rc = rc ? rc : out->end_record(out, tag); - return rc; -} -int deserialize_GetChildrenRequest(struct iarchive *in, const char *tag, struct GetChildrenRequest*v){ - int rc; - rc = in->start_record(in, tag); - rc = rc ? rc : in->deserialize_String(in, "path", &v->path); - rc = rc ? rc : in->deserialize_Bool(in, "watch", &v->watch); - rc = rc ? rc : in->end_record(in, tag); - return rc; -} -void deallocate_GetChildrenRequest(struct GetChildrenRequest*v){ - deallocate_String(&v->path); -} -int serialize_GetChildren2Request(struct oarchive *out, const char *tag, struct GetChildren2Request *v){ - int rc; - rc = out->start_record(out, tag); - rc = rc ? rc : out->serialize_String(out, "path", &v->path); - rc = rc ? rc : out->serialize_Bool(out, "watch", &v->watch); - rc = rc ? rc : out->end_record(out, tag); - return rc; -} -int deserialize_GetChildren2Request(struct iarchive *in, const char *tag, struct GetChildren2Request*v){ - int rc; - rc = in->start_record(in, tag); - rc = rc ? rc : in->deserialize_String(in, "path", &v->path); - rc = rc ? rc : in->deserialize_Bool(in, "watch", &v->watch); - rc = rc ? rc : in->end_record(in, tag); - return rc; -} -void deallocate_GetChildren2Request(struct GetChildren2Request*v){ - deallocate_String(&v->path); -} -int serialize_CheckVersionRequest(struct oarchive *out, const char *tag, struct CheckVersionRequest *v){ - int rc; - rc = out->start_record(out, tag); - rc = rc ? rc : out->serialize_String(out, "path", &v->path); - rc = rc ? rc : out->serialize_Int(out, "version", &v->version); - rc = rc ? rc : out->end_record(out, tag); - return rc; -} -int deserialize_CheckVersionRequest(struct iarchive *in, const char *tag, struct CheckVersionRequest*v){ - int rc; - rc = in->start_record(in, tag); - rc = rc ? rc : in->deserialize_String(in, "path", &v->path); - rc = rc ? rc : in->deserialize_Int(in, "version", &v->version); - rc = rc ? rc : in->end_record(in, tag); - return rc; -} -void deallocate_CheckVersionRequest(struct CheckVersionRequest*v){ - deallocate_String(&v->path); -} -int serialize_GetMaxChildrenRequest(struct oarchive *out, const char *tag, struct GetMaxChildrenRequest *v){ - int rc; - rc = out->start_record(out, tag); - rc = rc ? rc : out->serialize_String(out, "path", &v->path); - rc = rc ? rc : out->end_record(out, tag); - return rc; -} -int deserialize_GetMaxChildrenRequest(struct iarchive *in, const char *tag, struct GetMaxChildrenRequest*v){ - int rc; - rc = in->start_record(in, tag); - rc = rc ? rc : in->deserialize_String(in, "path", &v->path); - rc = rc ? rc : in->end_record(in, tag); - return rc; -} -void deallocate_GetMaxChildrenRequest(struct GetMaxChildrenRequest*v){ - deallocate_String(&v->path); -} -int serialize_GetMaxChildrenResponse(struct oarchive *out, const char *tag, struct GetMaxChildrenResponse *v){ - int rc; - rc = out->start_record(out, tag); - rc = rc ? rc : out->serialize_Int(out, "max", &v->max); - rc = rc ? rc : out->end_record(out, tag); - return rc; -} -int deserialize_GetMaxChildrenResponse(struct iarchive *in, const char *tag, struct GetMaxChildrenResponse*v){ - int rc; - rc = in->start_record(in, tag); - rc = rc ? rc : in->deserialize_Int(in, "max", &v->max); - rc = rc ? rc : in->end_record(in, tag); - return rc; -} -void deallocate_GetMaxChildrenResponse(struct GetMaxChildrenResponse*v){ -} -int serialize_SetMaxChildrenRequest(struct oarchive *out, const char *tag, struct SetMaxChildrenRequest *v){ - int rc; - rc = out->start_record(out, tag); - rc = rc ? rc : out->serialize_String(out, "path", &v->path); - rc = rc ? rc : out->serialize_Int(out, "max", &v->max); - rc = rc ? rc : out->end_record(out, tag); - return rc; -} -int deserialize_SetMaxChildrenRequest(struct iarchive *in, const char *tag, struct SetMaxChildrenRequest*v){ - int rc; - rc = in->start_record(in, tag); - rc = rc ? rc : in->deserialize_String(in, "path", &v->path); - rc = rc ? rc : in->deserialize_Int(in, "max", &v->max); - rc = rc ? rc : in->end_record(in, tag); - return rc; -} -void deallocate_SetMaxChildrenRequest(struct SetMaxChildrenRequest*v){ - deallocate_String(&v->path); -} -int serialize_SyncRequest(struct oarchive *out, const char *tag, struct SyncRequest *v){ - int rc; - rc = out->start_record(out, tag); - rc = rc ? rc : out->serialize_String(out, "path", &v->path); - rc = rc ? rc : out->end_record(out, tag); - return rc; -} -int deserialize_SyncRequest(struct iarchive *in, const char *tag, struct SyncRequest*v){ - int rc; - rc = in->start_record(in, tag); - rc = rc ? rc : in->deserialize_String(in, "path", &v->path); - rc = rc ? rc : in->end_record(in, tag); - return rc; -} -void deallocate_SyncRequest(struct SyncRequest*v){ - deallocate_String(&v->path); -} -int serialize_SyncResponse(struct oarchive *out, const char *tag, struct SyncResponse *v){ - int rc; - rc = out->start_record(out, tag); - rc = rc ? rc : out->serialize_String(out, "path", &v->path); - rc = rc ? rc : out->end_record(out, tag); - return rc; -} -int deserialize_SyncResponse(struct iarchive *in, const char *tag, struct SyncResponse*v){ - int rc; - rc = in->start_record(in, tag); - rc = rc ? rc : in->deserialize_String(in, "path", &v->path); - rc = rc ? rc : in->end_record(in, tag); - return rc; -} -void deallocate_SyncResponse(struct SyncResponse*v){ - deallocate_String(&v->path); -} -int serialize_GetACLRequest(struct oarchive *out, const char *tag, struct GetACLRequest *v){ - int rc; - rc = out->start_record(out, tag); - rc = rc ? rc : out->serialize_String(out, "path", &v->path); - rc = rc ? rc : out->end_record(out, tag); - return rc; -} -int deserialize_GetACLRequest(struct iarchive *in, const char *tag, struct GetACLRequest*v){ - int rc; - rc = in->start_record(in, tag); - rc = rc ? rc : in->deserialize_String(in, "path", &v->path); - rc = rc ? rc : in->end_record(in, tag); - return rc; -} -void deallocate_GetACLRequest(struct GetACLRequest*v){ - deallocate_String(&v->path); -} -int serialize_SetACLRequest(struct oarchive *out, const char *tag, struct SetACLRequest *v){ - int rc; - rc = out->start_record(out, tag); - rc = rc ? rc : out->serialize_String(out, "path", &v->path); - rc = rc ? rc : serialize_ACL_vector(out, "acl", &v->acl); - rc = rc ? rc : out->serialize_Int(out, "version", &v->version); - rc = rc ? rc : out->end_record(out, tag); - return rc; -} -int deserialize_SetACLRequest(struct iarchive *in, const char *tag, struct SetACLRequest*v){ - int rc; - rc = in->start_record(in, tag); - rc = rc ? rc : in->deserialize_String(in, "path", &v->path); - rc = rc ? rc : deserialize_ACL_vector(in, "acl", &v->acl); - rc = rc ? rc : in->deserialize_Int(in, "version", &v->version); - rc = rc ? rc : in->end_record(in, tag); - return rc; -} -void deallocate_SetACLRequest(struct SetACLRequest*v){ - deallocate_String(&v->path); - deallocate_ACL_vector(&v->acl); -} -int serialize_SetACLResponse(struct oarchive *out, const char *tag, struct SetACLResponse *v){ - int rc; - rc = out->start_record(out, tag); - rc = rc ? rc : serialize_Stat(out, "stat", &v->stat); - rc = rc ? rc : out->end_record(out, tag); - return rc; -} -int deserialize_SetACLResponse(struct iarchive *in, const char *tag, struct SetACLResponse*v){ - int rc; - rc = in->start_record(in, tag); - rc = rc ? rc : deserialize_Stat(in, "stat", &v->stat); - rc = rc ? rc : in->end_record(in, tag); - return rc; -} -void deallocate_SetACLResponse(struct SetACLResponse*v){ - deallocate_Stat(&v->stat); -} -int serialize_WatcherEvent(struct oarchive *out, const char *tag, struct WatcherEvent *v){ - int rc; - rc = out->start_record(out, tag); - rc = rc ? rc : out->serialize_Int(out, "type", &v->type); - rc = rc ? rc : out->serialize_Int(out, "state", &v->state); - rc = rc ? rc : out->serialize_String(out, "path", &v->path); - rc = rc ? rc : out->end_record(out, tag); - return rc; -} -int deserialize_WatcherEvent(struct iarchive *in, const char *tag, struct WatcherEvent*v){ - int rc; - rc = in->start_record(in, tag); - rc = rc ? rc : in->deserialize_Int(in, "type", &v->type); - rc = rc ? rc : in->deserialize_Int(in, "state", &v->state); - rc = rc ? rc : in->deserialize_String(in, "path", &v->path); - rc = rc ? rc : in->end_record(in, tag); - return rc; -} -void deallocate_WatcherEvent(struct WatcherEvent*v){ - deallocate_String(&v->path); -} -int serialize_ErrorResponse(struct oarchive *out, const char *tag, struct ErrorResponse *v){ - int rc; - rc = out->start_record(out, tag); - rc = rc ? rc : out->serialize_Int(out, "err", &v->err); - rc = rc ? rc : out->end_record(out, tag); - return rc; -} -int deserialize_ErrorResponse(struct iarchive *in, const char *tag, struct ErrorResponse*v){ - int rc; - rc = in->start_record(in, tag); - rc = rc ? rc : in->deserialize_Int(in, "err", &v->err); - rc = rc ? rc : in->end_record(in, tag); - return rc; -} -void deallocate_ErrorResponse(struct ErrorResponse*v){ -} -int serialize_CreateResponse(struct oarchive *out, const char *tag, struct CreateResponse *v){ - int rc; - rc = out->start_record(out, tag); - rc = rc ? rc : out->serialize_String(out, "path", &v->path); - rc = rc ? rc : out->end_record(out, tag); - return rc; -} -int deserialize_CreateResponse(struct iarchive *in, const char *tag, struct CreateResponse*v){ - int rc; - rc = in->start_record(in, tag); - rc = rc ? rc : in->deserialize_String(in, "path", &v->path); - rc = rc ? rc : in->end_record(in, tag); - return rc; -} -void deallocate_CreateResponse(struct CreateResponse*v){ - deallocate_String(&v->path); -} -int serialize_ExistsRequest(struct oarchive *out, const char *tag, struct ExistsRequest *v){ - int rc; - rc = out->start_record(out, tag); - rc = rc ? rc : out->serialize_String(out, "path", &v->path); - rc = rc ? rc : out->serialize_Bool(out, "watch", &v->watch); - rc = rc ? rc : out->end_record(out, tag); - return rc; -} -int deserialize_ExistsRequest(struct iarchive *in, const char *tag, struct ExistsRequest*v){ - int rc; - rc = in->start_record(in, tag); - rc = rc ? rc : in->deserialize_String(in, "path", &v->path); - rc = rc ? rc : in->deserialize_Bool(in, "watch", &v->watch); - rc = rc ? rc : in->end_record(in, tag); - return rc; -} -void deallocate_ExistsRequest(struct ExistsRequest*v){ - deallocate_String(&v->path); -} -int serialize_ExistsResponse(struct oarchive *out, const char *tag, struct ExistsResponse *v){ - int rc; - rc = out->start_record(out, tag); - rc = rc ? rc : serialize_Stat(out, "stat", &v->stat); - rc = rc ? rc : out->end_record(out, tag); - return rc; -} -int deserialize_ExistsResponse(struct iarchive *in, const char *tag, struct ExistsResponse*v){ - int rc; - rc = in->start_record(in, tag); - rc = rc ? rc : deserialize_Stat(in, "stat", &v->stat); - rc = rc ? rc : in->end_record(in, tag); - return rc; -} -void deallocate_ExistsResponse(struct ExistsResponse*v){ - deallocate_Stat(&v->stat); -} -int serialize_GetDataResponse(struct oarchive *out, const char *tag, struct GetDataResponse *v){ - int rc; - rc = out->start_record(out, tag); - rc = rc ? rc : out->serialize_Buffer(out, "data", &v->data); - rc = rc ? rc : serialize_Stat(out, "stat", &v->stat); - rc = rc ? rc : out->end_record(out, tag); - return rc; -} -int deserialize_GetDataResponse(struct iarchive *in, const char *tag, struct GetDataResponse*v){ - int rc; - rc = in->start_record(in, tag); - rc = rc ? rc : in->deserialize_Buffer(in, "data", &v->data); - rc = rc ? rc : deserialize_Stat(in, "stat", &v->stat); - rc = rc ? rc : in->end_record(in, tag); - return rc; -} -void deallocate_GetDataResponse(struct GetDataResponse*v){ - deallocate_Buffer(&v->data); - deallocate_Stat(&v->stat); -} -int serialize_GetChildrenResponse(struct oarchive *out, const char *tag, struct GetChildrenResponse *v){ - int rc; - rc = out->start_record(out, tag); - rc = rc ? rc : serialize_String_vector(out, "children", &v->children); - rc = rc ? rc : out->end_record(out, tag); - return rc; -} -int deserialize_GetChildrenResponse(struct iarchive *in, const char *tag, struct GetChildrenResponse*v){ - int rc; - rc = in->start_record(in, tag); - rc = rc ? rc : deserialize_String_vector(in, "children", &v->children); - rc = rc ? rc : in->end_record(in, tag); - return rc; -} -void deallocate_GetChildrenResponse(struct GetChildrenResponse*v){ - deallocate_String_vector(&v->children); -} -int serialize_GetChildren2Response(struct oarchive *out, const char *tag, struct GetChildren2Response *v){ - int rc; - rc = out->start_record(out, tag); - rc = rc ? rc : serialize_String_vector(out, "children", &v->children); - rc = rc ? rc : serialize_Stat(out, "stat", &v->stat); - rc = rc ? rc : out->end_record(out, tag); - return rc; -} -int deserialize_GetChildren2Response(struct iarchive *in, const char *tag, struct GetChildren2Response*v){ - int rc; - rc = in->start_record(in, tag); - rc = rc ? rc : deserialize_String_vector(in, "children", &v->children); - rc = rc ? rc : deserialize_Stat(in, "stat", &v->stat); - rc = rc ? rc : in->end_record(in, tag); - return rc; -} -void deallocate_GetChildren2Response(struct GetChildren2Response*v){ - deallocate_String_vector(&v->children); - deallocate_Stat(&v->stat); -} -int serialize_GetACLResponse(struct oarchive *out, const char *tag, struct GetACLResponse *v){ - int rc; - rc = out->start_record(out, tag); - rc = rc ? rc : serialize_ACL_vector(out, "acl", &v->acl); - rc = rc ? rc : serialize_Stat(out, "stat", &v->stat); - rc = rc ? rc : out->end_record(out, tag); - return rc; -} -int deserialize_GetACLResponse(struct iarchive *in, const char *tag, struct GetACLResponse*v){ - int rc; - rc = in->start_record(in, tag); - rc = rc ? rc : deserialize_ACL_vector(in, "acl", &v->acl); - rc = rc ? rc : deserialize_Stat(in, "stat", &v->stat); - rc = rc ? rc : in->end_record(in, tag); - return rc; -} -void deallocate_GetACLResponse(struct GetACLResponse*v){ - deallocate_ACL_vector(&v->acl); - deallocate_Stat(&v->stat); -} -int serialize_LearnerInfo(struct oarchive *out, const char *tag, struct LearnerInfo *v){ - int rc; - rc = out->start_record(out, tag); - rc = rc ? rc : out->serialize_Long(out, "serverid", &v->serverid); - rc = rc ? rc : out->serialize_Int(out, "protocolVersion", &v->protocolVersion); - rc = rc ? rc : out->end_record(out, tag); - return rc; -} -int deserialize_LearnerInfo(struct iarchive *in, const char *tag, struct LearnerInfo*v){ - int rc; - rc = in->start_record(in, tag); - rc = rc ? rc : in->deserialize_Long(in, "serverid", &v->serverid); - rc = rc ? rc : in->deserialize_Int(in, "protocolVersion", &v->protocolVersion); - rc = rc ? rc : in->end_record(in, tag); - return rc; -} -void deallocate_LearnerInfo(struct LearnerInfo*v){ -} -int allocate_Id_vector(struct Id_vector *v, int32_t len) { - if (!len) { - v->count = 0; - v->data = 0; - } else { - v->count = len; - v->data = calloc(sizeof(*v->data), len); - } - return 0; -} -int deallocate_Id_vector(struct Id_vector *v) { - if (v->data) { - int32_t i; - for(i=0;icount; i++) { - deallocate_Id(&v->data[i]); - } - free(v->data); - v->data = 0; - } - return 0; -} -int serialize_Id_vector(struct oarchive *out, const char *tag, struct Id_vector *v) -{ - int32_t count = v->count; - int rc = 0; - int32_t i; - rc = out->start_vector(out, tag, &count); - for(i=0;icount;i++) { - rc = rc ? rc : serialize_Id(out, "data", &v->data[i]); - } - rc = rc ? rc : out->end_vector(out, tag); - return rc; -} -int deserialize_Id_vector(struct iarchive *in, const char *tag, struct Id_vector *v) -{ - int rc = 0; - int32_t i; - rc = in->start_vector(in, tag, &v->count); - v->data = calloc(v->count, sizeof(*v->data)); - for(i=0;icount;i++) { - rc = rc ? rc : deserialize_Id(in, "value", &v->data[i]); - } - rc = in->end_vector(in, tag); - return rc; -} -int serialize_QuorumPacket(struct oarchive *out, const char *tag, struct QuorumPacket *v){ - int rc; - rc = out->start_record(out, tag); - rc = rc ? rc : out->serialize_Int(out, "type", &v->type); - rc = rc ? rc : out->serialize_Long(out, "zxid", &v->zxid); - rc = rc ? rc : out->serialize_Buffer(out, "data", &v->data); - rc = rc ? rc : serialize_Id_vector(out, "authinfo", &v->authinfo); - rc = rc ? rc : out->end_record(out, tag); - return rc; -} -int deserialize_QuorumPacket(struct iarchive *in, const char *tag, struct QuorumPacket*v){ - int rc; - rc = in->start_record(in, tag); - rc = rc ? rc : in->deserialize_Int(in, "type", &v->type); - rc = rc ? rc : in->deserialize_Long(in, "zxid", &v->zxid); - rc = rc ? rc : in->deserialize_Buffer(in, "data", &v->data); - rc = rc ? rc : deserialize_Id_vector(in, "authinfo", &v->authinfo); - rc = rc ? rc : in->end_record(in, tag); - return rc; -} -void deallocate_QuorumPacket(struct QuorumPacket*v){ - deallocate_Buffer(&v->data); - deallocate_Id_vector(&v->authinfo); -} -int serialize_FileHeader(struct oarchive *out, const char *tag, struct FileHeader *v){ - int rc; - rc = out->start_record(out, tag); - rc = rc ? rc : out->serialize_Int(out, "magic", &v->magic); - rc = rc ? rc : out->serialize_Int(out, "version", &v->version); - rc = rc ? rc : out->serialize_Long(out, "dbid", &v->dbid); - rc = rc ? rc : out->end_record(out, tag); - return rc; -} -int deserialize_FileHeader(struct iarchive *in, const char *tag, struct FileHeader*v){ - int rc; - rc = in->start_record(in, tag); - rc = rc ? rc : in->deserialize_Int(in, "magic", &v->magic); - rc = rc ? rc : in->deserialize_Int(in, "version", &v->version); - rc = rc ? rc : in->deserialize_Long(in, "dbid", &v->dbid); - rc = rc ? rc : in->end_record(in, tag); - return rc; -} -void deallocate_FileHeader(struct FileHeader*v){ -} -int serialize_TxnHeader(struct oarchive *out, const char *tag, struct TxnHeader *v){ - int rc; - rc = out->start_record(out, tag); - rc = rc ? rc : out->serialize_Long(out, "clientId", &v->clientId); - rc = rc ? rc : out->serialize_Int(out, "cxid", &v->cxid); - rc = rc ? rc : out->serialize_Long(out, "zxid", &v->zxid); - rc = rc ? rc : out->serialize_Long(out, "time", &v->time); - rc = rc ? rc : out->serialize_Int(out, "type", &v->type); - rc = rc ? rc : out->end_record(out, tag); - return rc; -} -int deserialize_TxnHeader(struct iarchive *in, const char *tag, struct TxnHeader*v){ - int rc; - rc = in->start_record(in, tag); - rc = rc ? rc : in->deserialize_Long(in, "clientId", &v->clientId); - rc = rc ? rc : in->deserialize_Int(in, "cxid", &v->cxid); - rc = rc ? rc : in->deserialize_Long(in, "zxid", &v->zxid); - rc = rc ? rc : in->deserialize_Long(in, "time", &v->time); - rc = rc ? rc : in->deserialize_Int(in, "type", &v->type); - rc = rc ? rc : in->end_record(in, tag); - return rc; -} -void deallocate_TxnHeader(struct TxnHeader*v){ -} -int serialize_CreateTxnV0(struct oarchive *out, const char *tag, struct CreateTxnV0 *v){ - int rc; - rc = out->start_record(out, tag); - rc = rc ? rc : out->serialize_String(out, "path", &v->path); - rc = rc ? rc : out->serialize_Buffer(out, "data", &v->data); - rc = rc ? rc : serialize_ACL_vector(out, "acl", &v->acl); - rc = rc ? rc : out->serialize_Bool(out, "ephemeral", &v->ephemeral); - rc = rc ? rc : out->end_record(out, tag); - return rc; -} -int deserialize_CreateTxnV0(struct iarchive *in, const char *tag, struct CreateTxnV0*v){ - int rc; - rc = in->start_record(in, tag); - rc = rc ? rc : in->deserialize_String(in, "path", &v->path); - rc = rc ? rc : in->deserialize_Buffer(in, "data", &v->data); - rc = rc ? rc : deserialize_ACL_vector(in, "acl", &v->acl); - rc = rc ? rc : in->deserialize_Bool(in, "ephemeral", &v->ephemeral); - rc = rc ? rc : in->end_record(in, tag); - return rc; -} -void deallocate_CreateTxnV0(struct CreateTxnV0*v){ - deallocate_String(&v->path); - deallocate_Buffer(&v->data); - deallocate_ACL_vector(&v->acl); -} -int serialize_CreateTxn(struct oarchive *out, const char *tag, struct CreateTxn *v){ - int rc; - rc = out->start_record(out, tag); - rc = rc ? rc : out->serialize_String(out, "path", &v->path); - rc = rc ? rc : out->serialize_Buffer(out, "data", &v->data); - rc = rc ? rc : serialize_ACL_vector(out, "acl", &v->acl); - rc = rc ? rc : out->serialize_Bool(out, "ephemeral", &v->ephemeral); - rc = rc ? rc : out->serialize_Int(out, "parentCVersion", &v->parentCVersion); - rc = rc ? rc : out->end_record(out, tag); - return rc; -} -int deserialize_CreateTxn(struct iarchive *in, const char *tag, struct CreateTxn*v){ - int rc; - rc = in->start_record(in, tag); - rc = rc ? rc : in->deserialize_String(in, "path", &v->path); - rc = rc ? rc : in->deserialize_Buffer(in, "data", &v->data); - rc = rc ? rc : deserialize_ACL_vector(in, "acl", &v->acl); - rc = rc ? rc : in->deserialize_Bool(in, "ephemeral", &v->ephemeral); - rc = rc ? rc : in->deserialize_Int(in, "parentCVersion", &v->parentCVersion); - rc = rc ? rc : in->end_record(in, tag); - return rc; -} -void deallocate_CreateTxn(struct CreateTxn*v){ - deallocate_String(&v->path); - deallocate_Buffer(&v->data); - deallocate_ACL_vector(&v->acl); -} -int serialize_DeleteTxn(struct oarchive *out, const char *tag, struct DeleteTxn *v){ - int rc; - rc = out->start_record(out, tag); - rc = rc ? rc : out->serialize_String(out, "path", &v->path); - rc = rc ? rc : out->end_record(out, tag); - return rc; -} -int deserialize_DeleteTxn(struct iarchive *in, const char *tag, struct DeleteTxn*v){ - int rc; - rc = in->start_record(in, tag); - rc = rc ? rc : in->deserialize_String(in, "path", &v->path); - rc = rc ? rc : in->end_record(in, tag); - return rc; -} -void deallocate_DeleteTxn(struct DeleteTxn*v){ - deallocate_String(&v->path); -} -int serialize_SetDataTxn(struct oarchive *out, const char *tag, struct SetDataTxn *v){ - int rc; - rc = out->start_record(out, tag); - rc = rc ? rc : out->serialize_String(out, "path", &v->path); - rc = rc ? rc : out->serialize_Buffer(out, "data", &v->data); - rc = rc ? rc : out->serialize_Int(out, "version", &v->version); - rc = rc ? rc : out->end_record(out, tag); - return rc; -} -int deserialize_SetDataTxn(struct iarchive *in, const char *tag, struct SetDataTxn*v){ - int rc; - rc = in->start_record(in, tag); - rc = rc ? rc : in->deserialize_String(in, "path", &v->path); - rc = rc ? rc : in->deserialize_Buffer(in, "data", &v->data); - rc = rc ? rc : in->deserialize_Int(in, "version", &v->version); - rc = rc ? rc : in->end_record(in, tag); - return rc; -} -void deallocate_SetDataTxn(struct SetDataTxn*v){ - deallocate_String(&v->path); - deallocate_Buffer(&v->data); -} -int serialize_CheckVersionTxn(struct oarchive *out, const char *tag, struct CheckVersionTxn *v){ - int rc; - rc = out->start_record(out, tag); - rc = rc ? rc : out->serialize_String(out, "path", &v->path); - rc = rc ? rc : out->serialize_Int(out, "version", &v->version); - rc = rc ? rc : out->end_record(out, tag); - return rc; -} -int deserialize_CheckVersionTxn(struct iarchive *in, const char *tag, struct CheckVersionTxn*v){ - int rc; - rc = in->start_record(in, tag); - rc = rc ? rc : in->deserialize_String(in, "path", &v->path); - rc = rc ? rc : in->deserialize_Int(in, "version", &v->version); - rc = rc ? rc : in->end_record(in, tag); - return rc; -} -void deallocate_CheckVersionTxn(struct CheckVersionTxn*v){ - deallocate_String(&v->path); -} -int serialize_SetACLTxn(struct oarchive *out, const char *tag, struct SetACLTxn *v){ - int rc; - rc = out->start_record(out, tag); - rc = rc ? rc : out->serialize_String(out, "path", &v->path); - rc = rc ? rc : serialize_ACL_vector(out, "acl", &v->acl); - rc = rc ? rc : out->serialize_Int(out, "version", &v->version); - rc = rc ? rc : out->end_record(out, tag); - return rc; -} -int deserialize_SetACLTxn(struct iarchive *in, const char *tag, struct SetACLTxn*v){ - int rc; - rc = in->start_record(in, tag); - rc = rc ? rc : in->deserialize_String(in, "path", &v->path); - rc = rc ? rc : deserialize_ACL_vector(in, "acl", &v->acl); - rc = rc ? rc : in->deserialize_Int(in, "version", &v->version); - rc = rc ? rc : in->end_record(in, tag); - return rc; -} -void deallocate_SetACLTxn(struct SetACLTxn*v){ - deallocate_String(&v->path); - deallocate_ACL_vector(&v->acl); -} -int serialize_SetMaxChildrenTxn(struct oarchive *out, const char *tag, struct SetMaxChildrenTxn *v){ - int rc; - rc = out->start_record(out, tag); - rc = rc ? rc : out->serialize_String(out, "path", &v->path); - rc = rc ? rc : out->serialize_Int(out, "max", &v->max); - rc = rc ? rc : out->end_record(out, tag); - return rc; -} -int deserialize_SetMaxChildrenTxn(struct iarchive *in, const char *tag, struct SetMaxChildrenTxn*v){ - int rc; - rc = in->start_record(in, tag); - rc = rc ? rc : in->deserialize_String(in, "path", &v->path); - rc = rc ? rc : in->deserialize_Int(in, "max", &v->max); - rc = rc ? rc : in->end_record(in, tag); - return rc; -} -void deallocate_SetMaxChildrenTxn(struct SetMaxChildrenTxn*v){ - deallocate_String(&v->path); -} -int serialize_CreateSessionTxn(struct oarchive *out, const char *tag, struct CreateSessionTxn *v){ - int rc; - rc = out->start_record(out, tag); - rc = rc ? rc : out->serialize_Int(out, "timeOut", &v->timeOut); - rc = rc ? rc : out->end_record(out, tag); - return rc; -} -int deserialize_CreateSessionTxn(struct iarchive *in, const char *tag, struct CreateSessionTxn*v){ - int rc; - rc = in->start_record(in, tag); - rc = rc ? rc : in->deserialize_Int(in, "timeOut", &v->timeOut); - rc = rc ? rc : in->end_record(in, tag); - return rc; -} -void deallocate_CreateSessionTxn(struct CreateSessionTxn*v){ -} -int serialize_ErrorTxn(struct oarchive *out, const char *tag, struct ErrorTxn *v){ - int rc; - rc = out->start_record(out, tag); - rc = rc ? rc : out->serialize_Int(out, "err", &v->err); - rc = rc ? rc : out->end_record(out, tag); - return rc; -} -int deserialize_ErrorTxn(struct iarchive *in, const char *tag, struct ErrorTxn*v){ - int rc; - rc = in->start_record(in, tag); - rc = rc ? rc : in->deserialize_Int(in, "err", &v->err); - rc = rc ? rc : in->end_record(in, tag); - return rc; -} -void deallocate_ErrorTxn(struct ErrorTxn*v){ -} -int serialize_Txn(struct oarchive *out, const char *tag, struct Txn *v){ - int rc; - rc = out->start_record(out, tag); - rc = rc ? rc : out->serialize_Int(out, "type", &v->type); - rc = rc ? rc : out->serialize_Buffer(out, "data", &v->data); - rc = rc ? rc : out->end_record(out, tag); - return rc; -} -int deserialize_Txn(struct iarchive *in, const char *tag, struct Txn*v){ - int rc; - rc = in->start_record(in, tag); - rc = rc ? rc : in->deserialize_Int(in, "type", &v->type); - rc = rc ? rc : in->deserialize_Buffer(in, "data", &v->data); - rc = rc ? rc : in->end_record(in, tag); - return rc; -} -void deallocate_Txn(struct Txn*v){ - deallocate_Buffer(&v->data); -} -int allocate_Txn_vector(struct Txn_vector *v, int32_t len) { - if (!len) { - v->count = 0; - v->data = 0; - } else { - v->count = len; - v->data = calloc(sizeof(*v->data), len); - } - return 0; -} -int deallocate_Txn_vector(struct Txn_vector *v) { - if (v->data) { - int32_t i; - for(i=0;icount; i++) { - deallocate_Txn(&v->data[i]); - } - free(v->data); - v->data = 0; - } - return 0; -} -int serialize_Txn_vector(struct oarchive *out, const char *tag, struct Txn_vector *v) -{ - int32_t count = v->count; - int rc = 0; - int32_t i; - rc = out->start_vector(out, tag, &count); - for(i=0;icount;i++) { - rc = rc ? rc : serialize_Txn(out, "data", &v->data[i]); - } - rc = rc ? rc : out->end_vector(out, tag); - return rc; -} -int deserialize_Txn_vector(struct iarchive *in, const char *tag, struct Txn_vector *v) -{ - int rc = 0; - int32_t i; - rc = in->start_vector(in, tag, &v->count); - v->data = calloc(v->count, sizeof(*v->data)); - for(i=0;icount;i++) { - rc = rc ? rc : deserialize_Txn(in, "value", &v->data[i]); - } - rc = in->end_vector(in, tag); - return rc; -} -int serialize_MultiTxn(struct oarchive *out, const char *tag, struct MultiTxn *v){ - int rc; - rc = out->start_record(out, tag); - rc = rc ? rc : serialize_Txn_vector(out, "txns", &v->txns); - rc = rc ? rc : out->end_record(out, tag); - return rc; -} -int deserialize_MultiTxn(struct iarchive *in, const char *tag, struct MultiTxn*v){ - int rc; - rc = in->start_record(in, tag); - rc = rc ? rc : deserialize_Txn_vector(in, "txns", &v->txns); - rc = rc ? rc : in->end_record(in, tag); - return rc; -} -void deallocate_MultiTxn(struct MultiTxn*v){ - deallocate_Txn_vector(&v->txns); -} diff --git a/pkg/registry/zookeeper-3.4.6/src/c/generated/zookeeper.jute.h b/pkg/registry/zookeeper-3.4.6/src/c/generated/zookeeper.jute.h deleted file mode 100644 index 89733ecff..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/c/generated/zookeeper.jute.h +++ /dev/null @@ -1,485 +0,0 @@ -/** -* Licensed to the Apache Software Foundation (ASF) under one -* or more contributor license agreements. See the NOTICE file -* distributed with this work for additional information -* regarding copyright ownership. The ASF licenses this file -* to you 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. -*/ - -#ifndef __ZOOKEEPER_JUTE__ -#define __ZOOKEEPER_JUTE__ -#include "recordio.h" - -#ifdef __cplusplus -extern "C" { -#endif - -struct Id { - char * scheme; - char * id; -}; -int serialize_Id(struct oarchive *out, const char *tag, struct Id *v); -int deserialize_Id(struct iarchive *in, const char *tag, struct Id*v); -void deallocate_Id(struct Id*); -struct ACL { - int32_t perms; - struct Id id; -}; -int serialize_ACL(struct oarchive *out, const char *tag, struct ACL *v); -int deserialize_ACL(struct iarchive *in, const char *tag, struct ACL*v); -void deallocate_ACL(struct ACL*); -struct Stat { - int64_t czxid; - int64_t mzxid; - int64_t ctime; - int64_t mtime; - int32_t version; - int32_t cversion; - int32_t aversion; - int64_t ephemeralOwner; - int32_t dataLength; - int32_t numChildren; - int64_t pzxid; -}; -int serialize_Stat(struct oarchive *out, const char *tag, struct Stat *v); -int deserialize_Stat(struct iarchive *in, const char *tag, struct Stat*v); -void deallocate_Stat(struct Stat*); -struct StatPersisted { - int64_t czxid; - int64_t mzxid; - int64_t ctime; - int64_t mtime; - int32_t version; - int32_t cversion; - int32_t aversion; - int64_t ephemeralOwner; - int64_t pzxid; -}; -int serialize_StatPersisted(struct oarchive *out, const char *tag, struct StatPersisted *v); -int deserialize_StatPersisted(struct iarchive *in, const char *tag, struct StatPersisted*v); -void deallocate_StatPersisted(struct StatPersisted*); -struct StatPersistedV1 { - int64_t czxid; - int64_t mzxid; - int64_t ctime; - int64_t mtime; - int32_t version; - int32_t cversion; - int32_t aversion; - int64_t ephemeralOwner; -}; -int serialize_StatPersistedV1(struct oarchive *out, const char *tag, struct StatPersistedV1 *v); -int deserialize_StatPersistedV1(struct iarchive *in, const char *tag, struct StatPersistedV1*v); -void deallocate_StatPersistedV1(struct StatPersistedV1*); -struct ConnectRequest { - int32_t protocolVersion; - int64_t lastZxidSeen; - int32_t timeOut; - int64_t sessionId; - struct buffer passwd; -}; -int serialize_ConnectRequest(struct oarchive *out, const char *tag, struct ConnectRequest *v); -int deserialize_ConnectRequest(struct iarchive *in, const char *tag, struct ConnectRequest*v); -void deallocate_ConnectRequest(struct ConnectRequest*); -struct ConnectResponse { - int32_t protocolVersion; - int32_t timeOut; - int64_t sessionId; - struct buffer passwd; -}; -int serialize_ConnectResponse(struct oarchive *out, const char *tag, struct ConnectResponse *v); -int deserialize_ConnectResponse(struct iarchive *in, const char *tag, struct ConnectResponse*v); -void deallocate_ConnectResponse(struct ConnectResponse*); -struct String_vector { - int32_t count; - char * *data; - -}; -int serialize_String_vector(struct oarchive *out, const char *tag, struct String_vector *v); -int deserialize_String_vector(struct iarchive *in, const char *tag, struct String_vector *v); -int allocate_String_vector(struct String_vector *v, int32_t len); -int deallocate_String_vector(struct String_vector *v); -struct SetWatches { - int64_t relativeZxid; - struct String_vector dataWatches; - struct String_vector existWatches; - struct String_vector childWatches; -}; -int serialize_SetWatches(struct oarchive *out, const char *tag, struct SetWatches *v); -int deserialize_SetWatches(struct iarchive *in, const char *tag, struct SetWatches*v); -void deallocate_SetWatches(struct SetWatches*); -struct RequestHeader { - int32_t xid; - int32_t type; -}; -int serialize_RequestHeader(struct oarchive *out, const char *tag, struct RequestHeader *v); -int deserialize_RequestHeader(struct iarchive *in, const char *tag, struct RequestHeader*v); -void deallocate_RequestHeader(struct RequestHeader*); -struct MultiHeader { - int32_t type; - int32_t done; - int32_t err; -}; -int serialize_MultiHeader(struct oarchive *out, const char *tag, struct MultiHeader *v); -int deserialize_MultiHeader(struct iarchive *in, const char *tag, struct MultiHeader*v); -void deallocate_MultiHeader(struct MultiHeader*); -struct AuthPacket { - int32_t type; - char * scheme; - struct buffer auth; -}; -int serialize_AuthPacket(struct oarchive *out, const char *tag, struct AuthPacket *v); -int deserialize_AuthPacket(struct iarchive *in, const char *tag, struct AuthPacket*v); -void deallocate_AuthPacket(struct AuthPacket*); -struct ReplyHeader { - int32_t xid; - int64_t zxid; - int32_t err; -}; -int serialize_ReplyHeader(struct oarchive *out, const char *tag, struct ReplyHeader *v); -int deserialize_ReplyHeader(struct iarchive *in, const char *tag, struct ReplyHeader*v); -void deallocate_ReplyHeader(struct ReplyHeader*); -struct GetDataRequest { - char * path; - int32_t watch; -}; -int serialize_GetDataRequest(struct oarchive *out, const char *tag, struct GetDataRequest *v); -int deserialize_GetDataRequest(struct iarchive *in, const char *tag, struct GetDataRequest*v); -void deallocate_GetDataRequest(struct GetDataRequest*); -struct SetDataRequest { - char * path; - struct buffer data; - int32_t version; -}; -int serialize_SetDataRequest(struct oarchive *out, const char *tag, struct SetDataRequest *v); -int deserialize_SetDataRequest(struct iarchive *in, const char *tag, struct SetDataRequest*v); -void deallocate_SetDataRequest(struct SetDataRequest*); -struct SetDataResponse { - struct Stat stat; -}; -int serialize_SetDataResponse(struct oarchive *out, const char *tag, struct SetDataResponse *v); -int deserialize_SetDataResponse(struct iarchive *in, const char *tag, struct SetDataResponse*v); -void deallocate_SetDataResponse(struct SetDataResponse*); -struct GetSASLRequest { - struct buffer token; -}; -int serialize_GetSASLRequest(struct oarchive *out, const char *tag, struct GetSASLRequest *v); -int deserialize_GetSASLRequest(struct iarchive *in, const char *tag, struct GetSASLRequest*v); -void deallocate_GetSASLRequest(struct GetSASLRequest*); -struct SetSASLRequest { - struct buffer token; -}; -int serialize_SetSASLRequest(struct oarchive *out, const char *tag, struct SetSASLRequest *v); -int deserialize_SetSASLRequest(struct iarchive *in, const char *tag, struct SetSASLRequest*v); -void deallocate_SetSASLRequest(struct SetSASLRequest*); -struct SetSASLResponse { - struct buffer token; -}; -int serialize_SetSASLResponse(struct oarchive *out, const char *tag, struct SetSASLResponse *v); -int deserialize_SetSASLResponse(struct iarchive *in, const char *tag, struct SetSASLResponse*v); -void deallocate_SetSASLResponse(struct SetSASLResponse*); -struct ACL_vector { - int32_t count; - struct ACL *data; - -}; -int serialize_ACL_vector(struct oarchive *out, const char *tag, struct ACL_vector *v); -int deserialize_ACL_vector(struct iarchive *in, const char *tag, struct ACL_vector *v); -int allocate_ACL_vector(struct ACL_vector *v, int32_t len); -int deallocate_ACL_vector(struct ACL_vector *v); -struct CreateRequest { - char * path; - struct buffer data; - struct ACL_vector acl; - int32_t flags; -}; -int serialize_CreateRequest(struct oarchive *out, const char *tag, struct CreateRequest *v); -int deserialize_CreateRequest(struct iarchive *in, const char *tag, struct CreateRequest*v); -void deallocate_CreateRequest(struct CreateRequest*); -struct DeleteRequest { - char * path; - int32_t version; -}; -int serialize_DeleteRequest(struct oarchive *out, const char *tag, struct DeleteRequest *v); -int deserialize_DeleteRequest(struct iarchive *in, const char *tag, struct DeleteRequest*v); -void deallocate_DeleteRequest(struct DeleteRequest*); -struct GetChildrenRequest { - char * path; - int32_t watch; -}; -int serialize_GetChildrenRequest(struct oarchive *out, const char *tag, struct GetChildrenRequest *v); -int deserialize_GetChildrenRequest(struct iarchive *in, const char *tag, struct GetChildrenRequest*v); -void deallocate_GetChildrenRequest(struct GetChildrenRequest*); -struct GetChildren2Request { - char * path; - int32_t watch; -}; -int serialize_GetChildren2Request(struct oarchive *out, const char *tag, struct GetChildren2Request *v); -int deserialize_GetChildren2Request(struct iarchive *in, const char *tag, struct GetChildren2Request*v); -void deallocate_GetChildren2Request(struct GetChildren2Request*); -struct CheckVersionRequest { - char * path; - int32_t version; -}; -int serialize_CheckVersionRequest(struct oarchive *out, const char *tag, struct CheckVersionRequest *v); -int deserialize_CheckVersionRequest(struct iarchive *in, const char *tag, struct CheckVersionRequest*v); -void deallocate_CheckVersionRequest(struct CheckVersionRequest*); -struct GetMaxChildrenRequest { - char * path; -}; -int serialize_GetMaxChildrenRequest(struct oarchive *out, const char *tag, struct GetMaxChildrenRequest *v); -int deserialize_GetMaxChildrenRequest(struct iarchive *in, const char *tag, struct GetMaxChildrenRequest*v); -void deallocate_GetMaxChildrenRequest(struct GetMaxChildrenRequest*); -struct GetMaxChildrenResponse { - int32_t max; -}; -int serialize_GetMaxChildrenResponse(struct oarchive *out, const char *tag, struct GetMaxChildrenResponse *v); -int deserialize_GetMaxChildrenResponse(struct iarchive *in, const char *tag, struct GetMaxChildrenResponse*v); -void deallocate_GetMaxChildrenResponse(struct GetMaxChildrenResponse*); -struct SetMaxChildrenRequest { - char * path; - int32_t max; -}; -int serialize_SetMaxChildrenRequest(struct oarchive *out, const char *tag, struct SetMaxChildrenRequest *v); -int deserialize_SetMaxChildrenRequest(struct iarchive *in, const char *tag, struct SetMaxChildrenRequest*v); -void deallocate_SetMaxChildrenRequest(struct SetMaxChildrenRequest*); -struct SyncRequest { - char * path; -}; -int serialize_SyncRequest(struct oarchive *out, const char *tag, struct SyncRequest *v); -int deserialize_SyncRequest(struct iarchive *in, const char *tag, struct SyncRequest*v); -void deallocate_SyncRequest(struct SyncRequest*); -struct SyncResponse { - char * path; -}; -int serialize_SyncResponse(struct oarchive *out, const char *tag, struct SyncResponse *v); -int deserialize_SyncResponse(struct iarchive *in, const char *tag, struct SyncResponse*v); -void deallocate_SyncResponse(struct SyncResponse*); -struct GetACLRequest { - char * path; -}; -int serialize_GetACLRequest(struct oarchive *out, const char *tag, struct GetACLRequest *v); -int deserialize_GetACLRequest(struct iarchive *in, const char *tag, struct GetACLRequest*v); -void deallocate_GetACLRequest(struct GetACLRequest*); -struct SetACLRequest { - char * path; - struct ACL_vector acl; - int32_t version; -}; -int serialize_SetACLRequest(struct oarchive *out, const char *tag, struct SetACLRequest *v); -int deserialize_SetACLRequest(struct iarchive *in, const char *tag, struct SetACLRequest*v); -void deallocate_SetACLRequest(struct SetACLRequest*); -struct SetACLResponse { - struct Stat stat; -}; -int serialize_SetACLResponse(struct oarchive *out, const char *tag, struct SetACLResponse *v); -int deserialize_SetACLResponse(struct iarchive *in, const char *tag, struct SetACLResponse*v); -void deallocate_SetACLResponse(struct SetACLResponse*); -struct WatcherEvent { - int32_t type; - int32_t state; - char * path; -}; -int serialize_WatcherEvent(struct oarchive *out, const char *tag, struct WatcherEvent *v); -int deserialize_WatcherEvent(struct iarchive *in, const char *tag, struct WatcherEvent*v); -void deallocate_WatcherEvent(struct WatcherEvent*); -struct ErrorResponse { - int32_t err; -}; -int serialize_ErrorResponse(struct oarchive *out, const char *tag, struct ErrorResponse *v); -int deserialize_ErrorResponse(struct iarchive *in, const char *tag, struct ErrorResponse*v); -void deallocate_ErrorResponse(struct ErrorResponse*); -struct CreateResponse { - char * path; -}; -int serialize_CreateResponse(struct oarchive *out, const char *tag, struct CreateResponse *v); -int deserialize_CreateResponse(struct iarchive *in, const char *tag, struct CreateResponse*v); -void deallocate_CreateResponse(struct CreateResponse*); -struct ExistsRequest { - char * path; - int32_t watch; -}; -int serialize_ExistsRequest(struct oarchive *out, const char *tag, struct ExistsRequest *v); -int deserialize_ExistsRequest(struct iarchive *in, const char *tag, struct ExistsRequest*v); -void deallocate_ExistsRequest(struct ExistsRequest*); -struct ExistsResponse { - struct Stat stat; -}; -int serialize_ExistsResponse(struct oarchive *out, const char *tag, struct ExistsResponse *v); -int deserialize_ExistsResponse(struct iarchive *in, const char *tag, struct ExistsResponse*v); -void deallocate_ExistsResponse(struct ExistsResponse*); -struct GetDataResponse { - struct buffer data; - struct Stat stat; -}; -int serialize_GetDataResponse(struct oarchive *out, const char *tag, struct GetDataResponse *v); -int deserialize_GetDataResponse(struct iarchive *in, const char *tag, struct GetDataResponse*v); -void deallocate_GetDataResponse(struct GetDataResponse*); -struct GetChildrenResponse { - struct String_vector children; -}; -int serialize_GetChildrenResponse(struct oarchive *out, const char *tag, struct GetChildrenResponse *v); -int deserialize_GetChildrenResponse(struct iarchive *in, const char *tag, struct GetChildrenResponse*v); -void deallocate_GetChildrenResponse(struct GetChildrenResponse*); -struct GetChildren2Response { - struct String_vector children; - struct Stat stat; -}; -int serialize_GetChildren2Response(struct oarchive *out, const char *tag, struct GetChildren2Response *v); -int deserialize_GetChildren2Response(struct iarchive *in, const char *tag, struct GetChildren2Response*v); -void deallocate_GetChildren2Response(struct GetChildren2Response*); -struct GetACLResponse { - struct ACL_vector acl; - struct Stat stat; -}; -int serialize_GetACLResponse(struct oarchive *out, const char *tag, struct GetACLResponse *v); -int deserialize_GetACLResponse(struct iarchive *in, const char *tag, struct GetACLResponse*v); -void deallocate_GetACLResponse(struct GetACLResponse*); -struct LearnerInfo { - int64_t serverid; - int32_t protocolVersion; -}; -int serialize_LearnerInfo(struct oarchive *out, const char *tag, struct LearnerInfo *v); -int deserialize_LearnerInfo(struct iarchive *in, const char *tag, struct LearnerInfo*v); -void deallocate_LearnerInfo(struct LearnerInfo*); -struct Id_vector { - int32_t count; - struct Id *data; - -}; -int serialize_Id_vector(struct oarchive *out, const char *tag, struct Id_vector *v); -int deserialize_Id_vector(struct iarchive *in, const char *tag, struct Id_vector *v); -int allocate_Id_vector(struct Id_vector *v, int32_t len); -int deallocate_Id_vector(struct Id_vector *v); -struct QuorumPacket { - int32_t type; - int64_t zxid; - struct buffer data; - struct Id_vector authinfo; -}; -int serialize_QuorumPacket(struct oarchive *out, const char *tag, struct QuorumPacket *v); -int deserialize_QuorumPacket(struct iarchive *in, const char *tag, struct QuorumPacket*v); -void deallocate_QuorumPacket(struct QuorumPacket*); -struct FileHeader { - int32_t magic; - int32_t version; - int64_t dbid; -}; -int serialize_FileHeader(struct oarchive *out, const char *tag, struct FileHeader *v); -int deserialize_FileHeader(struct iarchive *in, const char *tag, struct FileHeader*v); -void deallocate_FileHeader(struct FileHeader*); -struct TxnHeader { - int64_t clientId; - int32_t cxid; - int64_t zxid; - int64_t time; - int32_t type; -}; -int serialize_TxnHeader(struct oarchive *out, const char *tag, struct TxnHeader *v); -int deserialize_TxnHeader(struct iarchive *in, const char *tag, struct TxnHeader*v); -void deallocate_TxnHeader(struct TxnHeader*); -struct CreateTxnV0 { - char * path; - struct buffer data; - struct ACL_vector acl; - int32_t ephemeral; -}; -int serialize_CreateTxnV0(struct oarchive *out, const char *tag, struct CreateTxnV0 *v); -int deserialize_CreateTxnV0(struct iarchive *in, const char *tag, struct CreateTxnV0*v); -void deallocate_CreateTxnV0(struct CreateTxnV0*); -struct CreateTxn { - char * path; - struct buffer data; - struct ACL_vector acl; - int32_t ephemeral; - int32_t parentCVersion; -}; -int serialize_CreateTxn(struct oarchive *out, const char *tag, struct CreateTxn *v); -int deserialize_CreateTxn(struct iarchive *in, const char *tag, struct CreateTxn*v); -void deallocate_CreateTxn(struct CreateTxn*); -struct DeleteTxn { - char * path; -}; -int serialize_DeleteTxn(struct oarchive *out, const char *tag, struct DeleteTxn *v); -int deserialize_DeleteTxn(struct iarchive *in, const char *tag, struct DeleteTxn*v); -void deallocate_DeleteTxn(struct DeleteTxn*); -struct SetDataTxn { - char * path; - struct buffer data; - int32_t version; -}; -int serialize_SetDataTxn(struct oarchive *out, const char *tag, struct SetDataTxn *v); -int deserialize_SetDataTxn(struct iarchive *in, const char *tag, struct SetDataTxn*v); -void deallocate_SetDataTxn(struct SetDataTxn*); -struct CheckVersionTxn { - char * path; - int32_t version; -}; -int serialize_CheckVersionTxn(struct oarchive *out, const char *tag, struct CheckVersionTxn *v); -int deserialize_CheckVersionTxn(struct iarchive *in, const char *tag, struct CheckVersionTxn*v); -void deallocate_CheckVersionTxn(struct CheckVersionTxn*); -struct SetACLTxn { - char * path; - struct ACL_vector acl; - int32_t version; -}; -int serialize_SetACLTxn(struct oarchive *out, const char *tag, struct SetACLTxn *v); -int deserialize_SetACLTxn(struct iarchive *in, const char *tag, struct SetACLTxn*v); -void deallocate_SetACLTxn(struct SetACLTxn*); -struct SetMaxChildrenTxn { - char * path; - int32_t max; -}; -int serialize_SetMaxChildrenTxn(struct oarchive *out, const char *tag, struct SetMaxChildrenTxn *v); -int deserialize_SetMaxChildrenTxn(struct iarchive *in, const char *tag, struct SetMaxChildrenTxn*v); -void deallocate_SetMaxChildrenTxn(struct SetMaxChildrenTxn*); -struct CreateSessionTxn { - int32_t timeOut; -}; -int serialize_CreateSessionTxn(struct oarchive *out, const char *tag, struct CreateSessionTxn *v); -int deserialize_CreateSessionTxn(struct iarchive *in, const char *tag, struct CreateSessionTxn*v); -void deallocate_CreateSessionTxn(struct CreateSessionTxn*); -struct ErrorTxn { - int32_t err; -}; -int serialize_ErrorTxn(struct oarchive *out, const char *tag, struct ErrorTxn *v); -int deserialize_ErrorTxn(struct iarchive *in, const char *tag, struct ErrorTxn*v); -void deallocate_ErrorTxn(struct ErrorTxn*); -struct Txn { - int32_t type; - struct buffer data; -}; -int serialize_Txn(struct oarchive *out, const char *tag, struct Txn *v); -int deserialize_Txn(struct iarchive *in, const char *tag, struct Txn*v); -void deallocate_Txn(struct Txn*); -struct Txn_vector { - int32_t count; - struct Txn *data; - -}; -int serialize_Txn_vector(struct oarchive *out, const char *tag, struct Txn_vector *v); -int deserialize_Txn_vector(struct iarchive *in, const char *tag, struct Txn_vector *v); -int allocate_Txn_vector(struct Txn_vector *v, int32_t len); -int deallocate_Txn_vector(struct Txn_vector *v); -struct MultiTxn { - struct Txn_vector txns; -}; -int serialize_MultiTxn(struct oarchive *out, const char *tag, struct MultiTxn *v); -int deserialize_MultiTxn(struct iarchive *in, const char *tag, struct MultiTxn*v); -void deallocate_MultiTxn(struct MultiTxn*); - -#ifdef __cplusplus -} -#endif - -#endif //ZOOKEEPER_JUTE__ diff --git a/pkg/registry/zookeeper-3.4.6/src/c/include/proto.h b/pkg/registry/zookeeper-3.4.6/src/c/include/proto.h deleted file mode 100644 index bce408e6f..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/c/include/proto.h +++ /dev/null @@ -1,47 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you 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. - */ -#ifndef PROTO_H_ -#define PROTO_H_ - -#ifdef __cplusplus -extern "C" { -#endif - -#define ZOO_NOTIFY_OP 0 -#define ZOO_CREATE_OP 1 -#define ZOO_DELETE_OP 2 -#define ZOO_EXISTS_OP 3 -#define ZOO_GETDATA_OP 4 -#define ZOO_SETDATA_OP 5 -#define ZOO_GETACL_OP 6 -#define ZOO_SETACL_OP 7 -#define ZOO_GETCHILDREN_OP 8 -#define ZOO_SYNC_OP 9 -#define ZOO_PING_OP 11 -#define ZOO_GETCHILDREN2_OP 12 -#define ZOO_CHECK_OP 13 -#define ZOO_MULTI_OP 14 -#define ZOO_CLOSE_OP -11 -#define ZOO_SETAUTH_OP 100 -#define ZOO_SETWATCHES_OP 101 - -#ifdef __cplusplus -} -#endif - -#endif /*PROTO_H_*/ diff --git a/pkg/registry/zookeeper-3.4.6/src/c/include/recordio.h b/pkg/registry/zookeeper-3.4.6/src/c/include/recordio.h deleted file mode 100644 index 4e1b78eab..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/c/include/recordio.h +++ /dev/null @@ -1,82 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you 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. - */ -#ifndef __RECORDIO_H__ -#define __RECORDIO_H__ - -#include -#ifndef WIN32 -#define STRUCT_INITIALIZER(l,r) .l = r -#else -#define STRUCT_INITIALIZER(l,r) r -#include "winconfig.h" -#endif - -#ifdef __cplusplus -extern "C" { -#endif - -struct buffer { - int32_t len; - char *buff; -}; - -void deallocate_String(char **s); -void deallocate_Buffer(struct buffer *b); -void deallocate_vector(void *d); -struct iarchive { - int (*start_record)(struct iarchive *ia, const char *tag); - int (*end_record)(struct iarchive *ia, const char *tag); - int (*start_vector)(struct iarchive *ia, const char *tag, int32_t *count); - int (*end_vector)(struct iarchive *ia, const char *tag); - int (*deserialize_Bool)(struct iarchive *ia, const char *name, int32_t *); - int (*deserialize_Int)(struct iarchive *ia, const char *name, int32_t *); - int (*deserialize_Long)(struct iarchive *ia, const char *name, int64_t *); - int (*deserialize_Buffer)(struct iarchive *ia, const char *name, - struct buffer *); - int (*deserialize_String)(struct iarchive *ia, const char *name, char **); - void *priv; -}; -struct oarchive { - int (*start_record)(struct oarchive *oa, const char *tag); - int (*end_record)(struct oarchive *oa, const char *tag); - int (*start_vector)(struct oarchive *oa, const char *tag, const int32_t *count); - int (*end_vector)(struct oarchive *oa, const char *tag); - int (*serialize_Bool)(struct oarchive *oa, const char *name, const int32_t *); - int (*serialize_Int)(struct oarchive *oa, const char *name, const int32_t *); - int (*serialize_Long)(struct oarchive *oa, const char *name, - const int64_t *); - int (*serialize_Buffer)(struct oarchive *oa, const char *name, - const struct buffer *); - int (*serialize_String)(struct oarchive *oa, const char *name, char **); - void *priv; -}; - -struct oarchive *create_buffer_oarchive(void); -void close_buffer_oarchive(struct oarchive **oa, int free_buffer); -struct iarchive *create_buffer_iarchive(char *buffer, int len); -void close_buffer_iarchive(struct iarchive **ia); -char *get_buffer(struct oarchive *); -int get_buffer_len(struct oarchive *); - -int64_t htonll(int64_t v); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/pkg/registry/zookeeper-3.4.6/src/c/include/winconfig.h b/pkg/registry/zookeeper-3.4.6/src/c/include/winconfig.h deleted file mode 100644 index a68dcc628..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/c/include/winconfig.h +++ /dev/null @@ -1,191 +0,0 @@ -/* Define to 1 if you have the header file. */ -#undef HAVE_ARPA_INET_H - -/* Define to 1 if you have the header file. */ -#undef HAVE_DLFCN_H - -/* Define to 1 if you have the header file. */ -#undef HAVE_FCNTL_H - -/* Define to 1 if you have the file `generated/zookeeper.jute.c'. */ -#define HAVE_GENERATED_ZOOKEEPER_JUTE_C 1 - -/* Define to 1 if you have the file `generated/zookeeper.jute.h'. */ -#define HAVE_GENERATED_ZOOKEEPER_JUTE_H 1 - -/* Define to 1 if you have the `getcwd' function. */ -#undef HAVE_GETCWD - -/* Define to 1 if you have the `gethostbyname' function. */ -#undef HAVE_GETHOSTBYNAME - -/* Define to 1 if you have the `gethostname' function. */ -#define HAVE_GETHOSTNAME 1 - -/* Define to 1 if you have the `getlogin' function. */ -#undef HAVE_GETLOGIN - -/* Define to 1 if you have the `getpwuid_r' function. */ -#undef HAVE_GETPWUID_R - -/* Define to 1 if you have the `gettimeofday' function. */ -#undef HAVE_GETTIMEOFDAY - -/* Define to 1 if you have the `getuid' function. */ -#undef HAVE_GETUID - -/* Define to 1 if you have the header file. */ -#undef HAVE_INTTYPES_H - -/* Define to 1 if you have the `memmove' function. */ -#undef HAVE_MEMMOVE - -/* Define to 1 if you have the header file. */ -#undef HAVE_MEMORY_H - -/* Define to 1 if you have the `memset' function. */ -#undef HAVE_MEMSET - -/* Define to 1 if you have the header file. */ -#undef HAVE_NETDB_H - -/* Define to 1 if you have the header file. */ -#undef HAVE_NETINET_IN_H - -/* Define to 1 if you have the `poll' function. */ -#undef HAVE_POLL - -/* Define to 1 if you have the `socket' function. */ -#undef HAVE_SOCKET - -/* Define to 1 if you have the header file. */ -#undef HAVE_STDINT_H - -/* Define to 1 if you have the header file. */ -#define HAVE_STDLIB_H 1 - -/* Define to 1 if you have the `strchr' function. */ -#define HAVE_STRCHR 1 - -/* Define to 1 if you have the `strdup' function. */ -#define HAVE_STRDUP 1 - -/* Define to 1 if you have the `strerror' function. */ -#define HAVE_STRERROR 1 - -/* Define to 1 if you have the header file. */ -#undef HAVE_STRINGS_H - -/* Define to 1 if you have the header file. */ -#undef HAVE_STRING_H - -/* Define to 1 if you have the `strtol' function. */ -#undef HAVE_STRTOL - -/* Define to 1 if you have the header file. */ -#undef HAVE_SYS_SOCKET_H - -/* Define to 1 if you have the header file. */ -#undef HAVE_SYS_STAT_H - -/* Define to 1 if you have the header file. */ -#undef HAVE_SYS_TIME_H - -/* Define to 1 if you have the header file. */ -#undef HAVE_SYS_TYPES_H - -/* Define to 1 if you have the header file. */ -#undef HAVE_SYS_UTSNAME_H - -/* Define to 1 if you have the header file. */ -#undef HAVE_UNISTD_H - -/* Define to the sub-directory in which libtool stores uninstalled libraries. - */ -#define LT_OBJDIR - -/* Define to 1 if your C compiler doesn't accept -c and -o together. */ -/* #undef NO_MINUS_C_MINUS_O */ - -/* Name of package */ -#define PACKAGE "c-client-src" - -/* Define to the address where bug reports for this package should be sent. */ -#define PACKAGE_BUGREPORT "user@zookeeper.apache.org" - -/* Define to the full name of this package. */ -#define PACKAGE_NAME "zookeeper C client" - -/* Define to the full name and version of this package. */ -#define PACKAGE_STRING "zookeeper C client 3.4.0 win32" - -/* Define to the one symbol short name of this package. */ -#define PACKAGE_TARNAME "c-client-src" - -/* Define to the home page for this package. */ -#define PACKAGE_URL "" - -/* Define to the version of this package. */ -#define PACKAGE_VERSION "3.4.0" - -/* poll() second argument type */ -#define POLL_NFDS_TYPE - -/* Define to 1 if you have the ANSI C header files. */ -#define STDC_HEADERS - -/* Define to 1 if you can safely include both and . */ -#define TIME_WITH_SYS_TIME - -/* Version number of package */ -#define VERSION "3.4.0" - -/* Define to empty if `const' does not conform to ANSI C. */ -/* #undef const */ - -/* Define to `__inline__' or `__inline' if that's what the C compiler - calls it, or to nothing if 'inline' is not supported under any name. */ -#ifndef __cplusplus -#define inline __inline -#endif -#ifdef WIN32 -#define __attribute__(x) -#define __func__ __FUNCTION__ - -#ifndef _WIN32_WINNT_NT4 -#define _WIN32_WINNT_NT4 0x0400 -#endif - -#define NTDDI_VERSION _WIN32_WINNT_NT4 -#define _WIN32_WINNT _WIN32_WINNT_NT4 - -#define _CRT_SECURE_NO_WARNINGS -#define WIN32_LEAN_AND_MEAN -#include -#include -#include -#include -#include -#undef AF_INET6 -#undef min -#undef max - -#include - -#define strtok_r strtok_s -#define localtime_r(a,b) localtime_s(b,a) -#define get_errno() errno=GetLastError() -#define random rand -#define snprintf _snprintf - -#define ACL ZKACL // Conflict with windows API - -#define EAI_ADDRFAMILY WSAEINVAL -#define EHOSTDOWN EPIPE -#define ESTALE ENODEV - -#define EWOULDBLOCK WSAEWOULDBLOCK -#define EINPROGRESS WSAEINPROGRESS - -typedef int pid_t; -#endif diff --git a/pkg/registry/zookeeper-3.4.6/src/c/include/winstdint.h b/pkg/registry/zookeeper-3.4.6/src/c/include/winstdint.h deleted file mode 100644 index d02608a59..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/c/include/winstdint.h +++ /dev/null @@ -1,247 +0,0 @@ -// ISO C9x compliant stdint.h for Microsoft Visual Studio -// Based on ISO/IEC 9899:TC2 Committee draft (May 6, 2005) WG14/N1124 -// -// Copyright (c) 2006-2008 Alexander Chemeris -// -// 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 name of the author may be used to endorse or promote products -// derived from this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED -// WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF -// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO -// EVENT SHALL THE AUTHOR 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 _MSC_VER // [ -#error "Use this header only with Microsoft Visual C++ compilers!" -#endif // _MSC_VER ] - -#ifndef _MSC_STDINT_H_ // [ -#define _MSC_STDINT_H_ - -#if _MSC_VER > 1000 -#pragma once -#endif - -#include - -// For Visual Studio 6 in C++ mode and for many Visual Studio versions when -// compiling for ARM we should wrap include with 'extern "C++" {}' -// or compiler give many errors like this: -// error C2733: second C linkage of overloaded function 'wmemchr' not allowed -#ifdef __cplusplus -extern "C" { -#endif -# include -#ifdef __cplusplus -} -#endif - -// Define _W64 macros to mark types changing their size, like intptr_t. -#ifndef _W64 -# if !defined(__midl) && (defined(_X86_) || defined(_M_IX86)) && _MSC_VER >= 1300 -# define _W64 __w64 -# else -# define _W64 -# endif -#endif - - -// 7.18.1 Integer types - -// 7.18.1.1 Exact-width integer types - -// Visual Studio 6 and Embedded Visual C++ 4 doesn't -// realize that, e.g. char has the same size as __int8 -// so we give up on __intX for them. -#if (_MSC_VER < 1300) - typedef signed char int8_t; - typedef signed short int16_t; - typedef signed int int32_t; - typedef unsigned char uint8_t; - typedef unsigned short uint16_t; - typedef unsigned int uint32_t; -#else - typedef signed __int8 int8_t; - typedef signed __int16 int16_t; - typedef signed __int32 int32_t; - typedef unsigned __int8 uint8_t; - typedef unsigned __int16 uint16_t; - typedef unsigned __int32 uint32_t; -#endif -typedef signed __int64 int64_t; -typedef unsigned __int64 uint64_t; - - -// 7.18.1.2 Minimum-width integer types -typedef int8_t int_least8_t; -typedef int16_t int_least16_t; -typedef int32_t int_least32_t; -typedef int64_t int_least64_t; -typedef uint8_t uint_least8_t; -typedef uint16_t uint_least16_t; -typedef uint32_t uint_least32_t; -typedef uint64_t uint_least64_t; - -// 7.18.1.3 Fastest minimum-width integer types -typedef int8_t int_fast8_t; -typedef int16_t int_fast16_t; -typedef int32_t int_fast32_t; -typedef int64_t int_fast64_t; -typedef uint8_t uint_fast8_t; -typedef uint16_t uint_fast16_t; -typedef uint32_t uint_fast32_t; -typedef uint64_t uint_fast64_t; - -// 7.18.1.4 Integer types capable of holding object pointers -#ifdef _WIN64 // [ - typedef signed __int64 intptr_t; - typedef unsigned __int64 uintptr_t; -#else // _WIN64 ][ - typedef _W64 signed int intptr_t; - typedef _W64 unsigned int uintptr_t; -#endif // _WIN64 ] - -// 7.18.1.5 Greatest-width integer types -typedef int64_t intmax_t; -typedef uint64_t uintmax_t; - - -// 7.18.2 Limits of specified-width integer types - -#if !defined(__cplusplus) || defined(__STDC_LIMIT_MACROS) // [ See footnote 220 at page 257 and footnote 221 at page 259 - -// 7.18.2.1 Limits of exact-width integer types -#define INT8_MIN ((int8_t)_I8_MIN) -#define INT8_MAX _I8_MAX -#define INT16_MIN ((int16_t)_I16_MIN) -#define INT16_MAX _I16_MAX -#define INT32_MIN ((int32_t)_I32_MIN) -#define INT32_MAX _I32_MAX -#define INT64_MIN ((int64_t)_I64_MIN) -#define INT64_MAX _I64_MAX -#define UINT8_MAX _UI8_MAX -#define UINT16_MAX _UI16_MAX -#define UINT32_MAX _UI32_MAX -#define UINT64_MAX _UI64_MAX - -// 7.18.2.2 Limits of minimum-width integer types -#define INT_LEAST8_MIN INT8_MIN -#define INT_LEAST8_MAX INT8_MAX -#define INT_LEAST16_MIN INT16_MIN -#define INT_LEAST16_MAX INT16_MAX -#define INT_LEAST32_MIN INT32_MIN -#define INT_LEAST32_MAX INT32_MAX -#define INT_LEAST64_MIN INT64_MIN -#define INT_LEAST64_MAX INT64_MAX -#define UINT_LEAST8_MAX UINT8_MAX -#define UINT_LEAST16_MAX UINT16_MAX -#define UINT_LEAST32_MAX UINT32_MAX -#define UINT_LEAST64_MAX UINT64_MAX - -// 7.18.2.3 Limits of fastest minimum-width integer types -#define INT_FAST8_MIN INT8_MIN -#define INT_FAST8_MAX INT8_MAX -#define INT_FAST16_MIN INT16_MIN -#define INT_FAST16_MAX INT16_MAX -#define INT_FAST32_MIN INT32_MIN -#define INT_FAST32_MAX INT32_MAX -#define INT_FAST64_MIN INT64_MIN -#define INT_FAST64_MAX INT64_MAX -#define UINT_FAST8_MAX UINT8_MAX -#define UINT_FAST16_MAX UINT16_MAX -#define UINT_FAST32_MAX UINT32_MAX -#define UINT_FAST64_MAX UINT64_MAX - -// 7.18.2.4 Limits of integer types capable of holding object pointers -#ifdef _WIN64 // [ -# define INTPTR_MIN INT64_MIN -# define INTPTR_MAX INT64_MAX -# define UINTPTR_MAX UINT64_MAX -#else // _WIN64 ][ -# define INTPTR_MIN INT32_MIN -# define INTPTR_MAX INT32_MAX -# define UINTPTR_MAX UINT32_MAX -#endif // _WIN64 ] - -// 7.18.2.5 Limits of greatest-width integer types -#define INTMAX_MIN INT64_MIN -#define INTMAX_MAX INT64_MAX -#define UINTMAX_MAX UINT64_MAX - -// 7.18.3 Limits of other integer types - -#ifdef _WIN64 // [ -# define PTRDIFF_MIN _I64_MIN -# define PTRDIFF_MAX _I64_MAX -#else // _WIN64 ][ -# define PTRDIFF_MIN _I32_MIN -# define PTRDIFF_MAX _I32_MAX -#endif // _WIN64 ] - -#define SIG_ATOMIC_MIN INT_MIN -#define SIG_ATOMIC_MAX INT_MAX - -#ifndef SIZE_MAX // [ -# ifdef _WIN64 // [ -# define SIZE_MAX _UI64_MAX -# else // _WIN64 ][ -# define SIZE_MAX _UI32_MAX -# endif // _WIN64 ] -#endif // SIZE_MAX ] - -// WCHAR_MIN and WCHAR_MAX are also defined in -#ifndef WCHAR_MIN // [ -# define WCHAR_MIN 0 -#endif // WCHAR_MIN ] -#ifndef WCHAR_MAX // [ -# define WCHAR_MAX _UI16_MAX -#endif // WCHAR_MAX ] - -#define WINT_MIN 0 -#define WINT_MAX _UI16_MAX - -#endif // __STDC_LIMIT_MACROS ] - - -// 7.18.4 Limits of other integer types - -#if !defined(__cplusplus) || defined(__STDC_CONSTANT_MACROS) // [ See footnote 224 at page 260 - -// 7.18.4.1 Macros for minimum-width integer constants - -#define INT8_C(val) val##i8 -#define INT16_C(val) val##i16 -#define INT32_C(val) val##i32 -#define INT64_C(val) val##i64 - -#define UINT8_C(val) val##ui8 -#define UINT16_C(val) val##ui16 -#define UINT32_C(val) val##ui32 -#define UINT64_C(val) val##ui64 - -// 7.18.4.2 Macros for greatest-width integer constants -#define INTMAX_C INT64_C -#define UINTMAX_C UINT64_C - -#endif // __STDC_CONSTANT_MACROS ] - - -#endif // _MSC_STDINT_H_ ] diff --git a/pkg/registry/zookeeper-3.4.6/src/c/include/zookeeper.h b/pkg/registry/zookeeper-3.4.6/src/c/include/zookeeper.h deleted file mode 100644 index 7d1066a93..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/c/include/zookeeper.h +++ /dev/null @@ -1,1583 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you 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. - */ - -#ifndef ZOOKEEPER_H_ -#define ZOOKEEPER_H_ - -#include -#ifndef WIN32 -#include -#include -#else -#include "winconfig.h" -#endif -#include -#include - -#include "proto.h" -#include "zookeeper_version.h" -#include "recordio.h" -#include "zookeeper.jute.h" - -/** - * \file zookeeper.h - * \brief ZooKeeper functions and definitions. - * - * ZooKeeper is a network service that may be backed by a cluster of - * synchronized servers. The data in the service is represented as a tree - * of data nodes. Each node has data, children, an ACL, and status information. - * The data for a node is read and write in its entirety. - * - * ZooKeeper clients can leave watches when they queries the data or children - * of a node. If a watch is left, that client will be notified of the change. - * The notification is a one time trigger. Subsequent chances to the node will - * not trigger a notification unless the client issues a query with the watch - * flag set. If the client is ever disconnected from the service, the watches do - * not need to be reset. The client automatically resets the watches. - * - * When a node is created, it may be flagged as an ephemeral node. Ephemeral - * nodes are automatically removed when a client session is closed or when - * a session times out due to inactivity (the ZooKeeper runtime fills in - * periods of inactivity with pings). Ephemeral nodes cannot have children. - * - * ZooKeeper clients are identified by a server assigned session id. For - * security reasons The server - * also generates a corresponding password for a session. A client may save its - * id and corresponding password to persistent storage in order to use the - * session across program invocation boundaries. - */ - -/* Support for building on various platforms */ - -// on cygwin we should take care of exporting/importing symbols properly -#ifdef DLL_EXPORT -# define ZOOAPI __declspec(dllexport) -#else -# if (defined(__CYGWIN__) || defined(WIN32)) && !defined(USE_STATIC_LIB) -# define ZOOAPI __declspec(dllimport) -# else -# define ZOOAPI -# endif -#endif - -/** zookeeper return constants **/ - -enum ZOO_ERRORS { - ZOK = 0, /*!< Everything is OK */ - - /** System and server-side errors. - * This is never thrown by the server, it shouldn't be used other than - * to indicate a range. Specifically error codes greater than this - * value, but lesser than {@link #ZAPIERROR}, are system errors. */ - ZSYSTEMERROR = -1, - ZRUNTIMEINCONSISTENCY = -2, /*!< A runtime inconsistency was found */ - ZDATAINCONSISTENCY = -3, /*!< A data inconsistency was found */ - ZCONNECTIONLOSS = -4, /*!< Connection to the server has been lost */ - ZMARSHALLINGERROR = -5, /*!< Error while marshalling or unmarshalling data */ - ZUNIMPLEMENTED = -6, /*!< Operation is unimplemented */ - ZOPERATIONTIMEOUT = -7, /*!< Operation timeout */ - ZBADARGUMENTS = -8, /*!< Invalid arguments */ - ZINVALIDSTATE = -9, /*!< Invliad zhandle state */ - - /** API errors. - * This is never thrown by the server, it shouldn't be used other than - * to indicate a range. Specifically error codes greater than this - * value are API errors (while values less than this indicate a - * {@link #ZSYSTEMERROR}). - */ - ZAPIERROR = -100, - ZNONODE = -101, /*!< Node does not exist */ - ZNOAUTH = -102, /*!< Not authenticated */ - ZBADVERSION = -103, /*!< Version conflict */ - ZNOCHILDRENFOREPHEMERALS = -108, /*!< Ephemeral nodes may not have children */ - ZNODEEXISTS = -110, /*!< The node already exists */ - ZNOTEMPTY = -111, /*!< The node has children */ - ZSESSIONEXPIRED = -112, /*!< The session has been expired by the server */ - ZINVALIDCALLBACK = -113, /*!< Invalid callback specified */ - ZINVALIDACL = -114, /*!< Invalid ACL specified */ - ZAUTHFAILED = -115, /*!< Client authentication failed */ - ZCLOSING = -116, /*!< ZooKeeper is closing */ - ZNOTHING = -117, /*!< (not error) no server responses to process */ - ZSESSIONMOVED = -118 /*! - * The legacy style, an application wishing to receive events from ZooKeeper must - * first implement a function with this signature and pass a pointer to the function - * to \ref zookeeper_init. Next, the application sets a watch by calling one of - * the getter API that accept the watch integer flag (for example, \ref zoo_aexists, - * \ref zoo_get, etc). - *

      - * The watcher object style uses an instance of a "watcher object" which in - * the C world is represented by a pair: a pointer to a function implementing this - * signature and a pointer to watcher context -- handback user-specific data. - * When a watch is triggered this function will be called along with - * the watcher context. An application wishing to use this style must use - * the getter API functions with the "w" prefix in their names (for example, \ref - * zoo_awexists, \ref zoo_wget, etc). - * - * \param zh zookeeper handle - * \param type event type. This is one of the *_EVENT constants. - * \param state connection state. The state value will be one of the *_STATE constants. - * \param path znode path for which the watcher is triggered. NULL if the event - * type is ZOO_SESSION_EVENT - * \param watcherCtx watcher context. - */ -typedef void (*watcher_fn)(zhandle_t *zh, int type, - int state, const char *path,void *watcherCtx); - -/** - * \brief create a handle to used communicate with zookeeper. - * - * This method creates a new handle and a zookeeper session that corresponds - * to that handle. Session establishment is asynchronous, meaning that the - * session should not be considered established until (and unless) an - * event of state ZOO_CONNECTED_STATE is received. - * \param host comma separated host:port pairs, each corresponding to a zk - * server. e.g. "127.0.0.1:3000,127.0.0.1:3001,127.0.0.1:3002" - * \param fn the global watcher callback function. When notifications are - * triggered this function will be invoked. - * \param clientid the id of a previously established session that this - * client will be reconnecting to. Pass 0 if not reconnecting to a previous - * session. Clients can access the session id of an established, valid, - * connection by calling \ref zoo_client_id. If the session corresponding to - * the specified clientid has expired, or if the clientid is invalid for - * any reason, the returned zhandle_t will be invalid -- the zhandle_t - * state will indicate the reason for failure (typically - * ZOO_EXPIRED_SESSION_STATE). - * \param context the handback object that will be associated with this instance - * of zhandle_t. Application can access it (for example, in the watcher - * callback) using \ref zoo_get_context. The object is not used by zookeeper - * internally and can be null. - * \param flags reserved for future use. Should be set to zero. - * \return a pointer to the opaque zhandle structure. If it fails to create - * a new zhandle the function returns NULL and the errno variable - * indicates the reason. - */ -ZOOAPI zhandle_t *zookeeper_init(const char *host, watcher_fn fn, - int recv_timeout, const clientid_t *clientid, void *context, int flags); - -/** - * \brief close the zookeeper handle and free up any resources. - * - * After this call, the client session will no longer be valid. The function - * will flush any outstanding send requests before return. As a result it may - * block. - * - * This method should only be called only once on a zookeeper handle. Calling - * twice will cause undefined (and probably undesirable behavior). Calling any other - * zookeeper method after calling close is undefined behaviour and should be avoided. - * - * \param zh the zookeeper handle obtained by a call to \ref zookeeper_init - * \return a result code. Regardless of the error code returned, the zhandle - * will be destroyed and all resources freed. - * - * ZOK - success - * ZBADARGUMENTS - invalid input parameters - * ZMARSHALLINGERROR - failed to marshall a request; possibly, out of memory - * ZOPERATIONTIMEOUT - failed to flush the buffers within the specified timeout. - * ZCONNECTIONLOSS - a network error occured while attempting to send request to server - * ZSYSTEMERROR -- a system (OS) error occured; it's worth checking errno to get details - */ -ZOOAPI int zookeeper_close(zhandle_t *zh); - -/** - * \brief return the client session id, only valid if the connections - * is currently connected (ie. last watcher state is ZOO_CONNECTED_STATE) - */ -ZOOAPI const clientid_t *zoo_client_id(zhandle_t *zh); - -/** - * \brief return the timeout for this session, only valid if the connections - * is currently connected (ie. last watcher state is ZOO_CONNECTED_STATE). This - * value may change after a server re-connect. - */ -ZOOAPI int zoo_recv_timeout(zhandle_t *zh); - -/** - * \brief return the context for this handle. - */ -ZOOAPI const void *zoo_get_context(zhandle_t *zh); - -/** - * \brief set the context for this handle. - */ -ZOOAPI void zoo_set_context(zhandle_t *zh, void *context); - -/** - * \brief set a watcher function - * \return previous watcher function - */ -ZOOAPI watcher_fn zoo_set_watcher(zhandle_t *zh,watcher_fn newFn); - -/** - * \brief returns the socket address for the current connection - * \return socket address of the connected host or NULL on failure, only valid if the - * connection is current connected - */ -ZOOAPI struct sockaddr* zookeeper_get_connected_host(zhandle_t *zh, - struct sockaddr *addr, socklen_t *addr_len); - -#ifndef THREADED -/** - * \brief Returns the events that zookeeper is interested in. - * - * \param zh the zookeeper handle obtained by a call to \ref zookeeper_init - * \param fd is the file descriptor of interest - * \param interest is an or of the ZOOKEEPER_WRITE and ZOOKEEPER_READ flags to - * indicate the I/O of interest on fd. - * \param tv a timeout value to be used with select/poll system call - * \return a result code. - * ZOK - success - * ZBADARGUMENTS - invalid input parameters - * ZINVALIDSTATE - zhandle state is either ZOO_SESSION_EXPIRED_STATE or ZOO_AUTH_FAILED_STATE - * ZCONNECTIONLOSS - a network error occured while attempting to establish - * a connection to the server - * ZMARSHALLINGERROR - failed to marshall a request; possibly, out of memory - * ZOPERATIONTIMEOUT - hasn't received anything from the server for 2/3 of the - * timeout value specified in zookeeper_init() - * ZSYSTEMERROR -- a system (OS) error occured; it's worth checking errno to get details - */ -#ifdef WIN32 -ZOOAPI int zookeeper_interest(zhandle_t *zh, SOCKET *fd, int *interest, - struct timeval *tv); -#else -ZOOAPI int zookeeper_interest(zhandle_t *zh, int *fd, int *interest, - struct timeval *tv); -#endif - -/** - * \brief Notifies zookeeper that an event of interest has happened. - * - * \param zh the zookeeper handle obtained by a call to \ref zookeeper_init - * \param events will be an OR of the ZOOKEEPER_WRITE and ZOOKEEPER_READ flags. - * \return a result code. - * ZOK - success - * ZBADARGUMENTS - invalid input parameters - * ZINVALIDSTATE - zhandle state is either ZOO_SESSION_EXPIRED_STATE or ZOO_AUTH_FAILED_STATE - * ZCONNECTIONLOSS - a network error occured while attempting to send request to server - * ZSESSIONEXPIRED - connection attempt failed -- the session's expired - * ZAUTHFAILED - authentication request failed, e.i. invalid credentials - * ZRUNTIMEINCONSISTENCY - a server response came out of order - * ZSYSTEMERROR -- a system (OS) error occured; it's worth checking errno to get details - * ZNOTHING -- not an error; simply indicates that there no more data from the server - * to be processed (when called with ZOOKEEPER_READ flag). - */ -ZOOAPI int zookeeper_process(zhandle_t *zh, int events); -#endif - -/** - * \brief signature of a completion function for a call that returns void. - * - * This method will be invoked at the end of a asynchronous call and also as - * a result of connection loss or timeout. - * \param rc the error code of the call. Connection loss/timeout triggers - * the completion with one of the following error codes: - * ZCONNECTIONLOSS -- lost connection to the server - * ZOPERATIONTIMEOUT -- connection timed out - * Data related events trigger the completion with error codes listed the - * Exceptions section of the documentation of the function that initiated the - * call. (Zero indicates call was successful.) - * \param data the pointer that was passed by the caller when the function - * that this completion corresponds to was invoked. The programmer - * is responsible for any memory freeing associated with the data - * pointer. - */ -typedef void (*void_completion_t)(int rc, const void *data); - -/** - * \brief signature of a completion function that returns a Stat structure. - * - * This method will be invoked at the end of a asynchronous call and also as - * a result of connection loss or timeout. - * \param rc the error code of the call. Connection loss/timeout triggers - * the completion with one of the following error codes: - * ZCONNECTIONLOSS -- lost connection to the server - * ZOPERATIONTIMEOUT -- connection timed out - * Data related events trigger the completion with error codes listed the - * Exceptions section of the documentation of the function that initiated the - * call. (Zero indicates call was successful.) - * \param stat a pointer to the stat information for the node involved in - * this function. If a non zero error code is returned, the content of - * stat is undefined. The programmer is NOT responsible for freeing stat. - * \param data the pointer that was passed by the caller when the function - * that this completion corresponds to was invoked. The programmer - * is responsible for any memory freeing associated with the data - * pointer. - */ -typedef void (*stat_completion_t)(int rc, const struct Stat *stat, - const void *data); - -/** - * \brief signature of a completion function that returns data. - * - * This method will be invoked at the end of a asynchronous call and also as - * a result of connection loss or timeout. - * \param rc the error code of the call. Connection loss/timeout triggers - * the completion with one of the following error codes: - * ZCONNECTIONLOSS -- lost connection to the server - * ZOPERATIONTIMEOUT -- connection timed out - * Data related events trigger the completion with error codes listed the - * Exceptions section of the documentation of the function that initiated the - * call. (Zero indicates call was successful.) - * \param value the value of the information returned by the asynchronous call. - * If a non zero error code is returned, the content of value is undefined. - * The programmer is NOT responsible for freeing value. - * \param value_len the number of bytes in value. - * \param stat a pointer to the stat information for the node involved in - * this function. If a non zero error code is returned, the content of - * stat is undefined. The programmer is NOT responsible for freeing stat. - * \param data the pointer that was passed by the caller when the function - * that this completion corresponds to was invoked. The programmer - * is responsible for any memory freeing associated with the data - * pointer. - */ -typedef void (*data_completion_t)(int rc, const char *value, int value_len, - const struct Stat *stat, const void *data); - -/** - * \brief signature of a completion function that returns a list of strings. - * - * This method will be invoked at the end of a asynchronous call and also as - * a result of connection loss or timeout. - * \param rc the error code of the call. Connection loss/timeout triggers - * the completion with one of the following error codes: - * ZCONNECTIONLOSS -- lost connection to the server - * ZOPERATIONTIMEOUT -- connection timed out - * Data related events trigger the completion with error codes listed the - * Exceptions section of the documentation of the function that initiated the - * call. (Zero indicates call was successful.) - * \param strings a pointer to the structure containng the list of strings of the - * names of the children of a node. If a non zero error code is returned, - * the content of strings is undefined. The programmer is NOT responsible - * for freeing strings. - * \param data the pointer that was passed by the caller when the function - * that this completion corresponds to was invoked. The programmer - * is responsible for any memory freeing associated with the data - * pointer. - */ -typedef void (*strings_completion_t)(int rc, - const struct String_vector *strings, const void *data); - -/** - * \brief signature of a completion function that returns a list of strings and stat. - * . - * - * This method will be invoked at the end of a asynchronous call and also as - * a result of connection loss or timeout. - * \param rc the error code of the call. Connection loss/timeout triggers - * the completion with one of the following error codes: - * ZCONNECTIONLOSS -- lost connection to the server - * ZOPERATIONTIMEOUT -- connection timed out - * Data related events trigger the completion with error codes listed the - * Exceptions section of the documentation of the function that initiated the - * call. (Zero indicates call was successful.) - * \param strings a pointer to the structure containng the list of strings of the - * names of the children of a node. If a non zero error code is returned, - * the content of strings is undefined. The programmer is NOT responsible - * for freeing strings. - * \param stat a pointer to the stat information for the node involved in - * this function. If a non zero error code is returned, the content of - * stat is undefined. The programmer is NOT responsible for freeing stat. - * \param data the pointer that was passed by the caller when the function - * that this completion corresponds to was invoked. The programmer - * is responsible for any memory freeing associated with the data - * pointer. - */ -typedef void (*strings_stat_completion_t)(int rc, - const struct String_vector *strings, const struct Stat *stat, - const void *data); - -/** - * \brief signature of a completion function that returns a list of strings. - * - * This method will be invoked at the end of a asynchronous call and also as - * a result of connection loss or timeout. - * \param rc the error code of the call. Connection loss/timeout triggers - * the completion with one of the following error codes: - * ZCONNECTIONLOSS -- lost connection to the server - * ZOPERATIONTIMEOUT -- connection timed out - * Data related events trigger the completion with error codes listed the - * Exceptions section of the documentation of the function that initiated the - * call. (Zero indicates call was successful.) - * \param value the value of the string returned. - * \param data the pointer that was passed by the caller when the function - * that this completion corresponds to was invoked. The programmer - * is responsible for any memory freeing associated with the data - * pointer. - */ -typedef void - (*string_completion_t)(int rc, const char *value, const void *data); - -/** - * \brief signature of a completion function that returns an ACL. - * - * This method will be invoked at the end of a asynchronous call and also as - * a result of connection loss or timeout. - * \param rc the error code of the call. Connection loss/timeout triggers - * the completion with one of the following error codes: - * ZCONNECTIONLOSS -- lost connection to the server - * ZOPERATIONTIMEOUT -- connection timed out - * Data related events trigger the completion with error codes listed the - * Exceptions section of the documentation of the function that initiated the - * call. (Zero indicates call was successful.) - * \param acl a pointer to the structure containng the ACL of a node. If a non - * zero error code is returned, the content of strings is undefined. The - * programmer is NOT responsible for freeing acl. - * \param stat a pointer to the stat information for the node involved in - * this function. If a non zero error code is returned, the content of - * stat is undefined. The programmer is NOT responsible for freeing stat. - * \param data the pointer that was passed by the caller when the function - * that this completion corresponds to was invoked. The programmer - * is responsible for any memory freeing associated with the data - * pointer. - */ -typedef void (*acl_completion_t)(int rc, struct ACL_vector *acl, - struct Stat *stat, const void *data); - -/** - * \brief get the state of the zookeeper connection. - * - * The return value will be one of the \ref State Consts. - */ -ZOOAPI int zoo_state(zhandle_t *zh); - -/** - * \brief create a node. - * - * This method will create a node in ZooKeeper. A node can only be created if - * it does not already exists. The Create Flags affect the creation of nodes. - * If ZOO_EPHEMERAL flag is set, the node will automatically get removed if the - * client session goes away. If the ZOO_SEQUENCE flag is set, a unique - * monotonically increasing sequence number is appended to the path name. The - * sequence number is always fixed length of 10 digits, 0 padded. - * - * \param zh the zookeeper handle obtained by a call to \ref zookeeper_init - * \param path The name of the node. Expressed as a file name with slashes - * separating ancestors of the node. - * \param value The data to be stored in the node. - * \param valuelen The number of bytes in data. - * \param acl The initial ACL of the node. The ACL must not be null or empty. - * \param flags this parameter can be set to 0 for normal create or an OR - * of the Create Flags - * \param completion the routine to invoke when the request completes. The completion - * will be triggered with one of the following codes passed in as the rc argument: - * ZOK operation completed successfully - * ZNONODE the parent node does not exist. - * ZNODEEXISTS the node already exists - * ZNOAUTH the client does not have permission. - * ZNOCHILDRENFOREPHEMERALS cannot create children of ephemeral nodes. - * \param data The data that will be passed to the completion routine when the - * function completes. - * \return ZOK on success or one of the following errcodes on failure: - * ZBADARGUMENTS - invalid input parameters - * ZINVALIDSTATE - zhandle state is either ZOO_SESSION_EXPIRED_STATE or ZOO_AUTH_FAILED_STATE - * ZMARSHALLINGERROR - failed to marshall a request; possibly, out of memory - */ -ZOOAPI int zoo_acreate(zhandle_t *zh, const char *path, const char *value, - int valuelen, const struct ACL_vector *acl, int flags, - string_completion_t completion, const void *data); - -/** - * \brief delete a node in zookeeper. - * - * \param zh the zookeeper handle obtained by a call to \ref zookeeper_init - * \param path the name of the node. Expressed as a file name with slashes - * separating ancestors of the node. - * \param version the expected version of the node. The function will fail if the - * actual version of the node does not match the expected version. - * If -1 is used the version check will not take place. - * \param completion the routine to invoke when the request completes. The completion - * will be triggered with one of the following codes passed in as the rc argument: - * ZOK operation completed successfully - * ZNONODE the node does not exist. - * ZNOAUTH the client does not have permission. - * ZBADVERSION expected version does not match actual version. - * ZNOTEMPTY children are present; node cannot be deleted. - * \param data the data that will be passed to the completion routine when - * the function completes. - * \return ZOK on success or one of the following errcodes on failure: - * ZBADARGUMENTS - invalid input parameters - * ZINVALIDSTATE - zhandle state is either ZOO_SESSION_EXPIRED_STATE or ZOO_AUTH_FAILED_STATE - * ZMARSHALLINGERROR - failed to marshall a request; possibly, out of memory - */ -ZOOAPI int zoo_adelete(zhandle_t *zh, const char *path, int version, - void_completion_t completion, const void *data); - -/** - * \brief checks the existence of a node in zookeeper. - * - * \param zh the zookeeper handle obtained by a call to \ref zookeeper_init - * \param path the name of the node. Expressed as a file name with slashes - * separating ancestors of the node. - * \param watch if nonzero, a watch will be set at the server to notify the - * client if the node changes. The watch will be set even if the node does not - * exist. This allows clients to watch for nodes to appear. - * \param completion the routine to invoke when the request completes. The completion - * will be triggered with one of the following codes passed in as the rc argument: - * ZOK operation completed successfully - * ZNONODE the node does not exist. - * ZNOAUTH the client does not have permission. - * \param data the data that will be passed to the completion routine when the - * function completes. - * \return ZOK on success or one of the following errcodes on failure: - * ZBADARGUMENTS - invalid input parameters - * ZINVALIDSTATE - zhandle state is either ZOO_SESSION_EXPIRED_STATE or ZOO_AUTH_FAILED_STATE - * ZMARSHALLINGERROR - failed to marshall a request; possibly, out of memory - */ -ZOOAPI int zoo_aexists(zhandle_t *zh, const char *path, int watch, - stat_completion_t completion, const void *data); - -/** - * \brief checks the existence of a node in zookeeper. - * - * This function is similar to \ref zoo_axists except it allows one specify - * a watcher object - a function pointer and associated context. The function - * will be called once the watch has fired. The associated context data will be - * passed to the function as the watcher context parameter. - * - * \param zh the zookeeper handle obtained by a call to \ref zookeeper_init - * \param path the name of the node. Expressed as a file name with slashes - * separating ancestors of the node. - * \param watcher if non-null a watch will set on the specified znode on the server. - * The watch will be set even if the node does not exist. This allows clients - * to watch for nodes to appear. - * \param watcherCtx user specific data, will be passed to the watcher callback. - * Unlike the global context set by \ref zookeeper_init, this watcher context - * is associated with the given instance of the watcher only. - * \param completion the routine to invoke when the request completes. The completion - * will be triggered with one of the following codes passed in as the rc argument: - * ZOK operation completed successfully - * ZNONODE the node does not exist. - * ZNOAUTH the client does not have permission. - * \param data the data that will be passed to the completion routine when the - * function completes. - * \return ZOK on success or one of the following errcodes on failure: - * ZBADARGUMENTS - invalid input parameters - * ZINVALIDSTATE - zhandle state is either ZOO_SESSION_EXPIRED_STATE or ZOO_AUTH_FAILED_STATE - * ZMARSHALLINGERROR - failed to marshall a request; possibly, out of memory - */ -ZOOAPI int zoo_awexists(zhandle_t *zh, const char *path, - watcher_fn watcher, void* watcherCtx, - stat_completion_t completion, const void *data); - -/** - * \brief gets the data associated with a node. - * - * \param zh the zookeeper handle obtained by a call to \ref zookeeper_init - * \param path the name of the node. Expressed as a file name with slashes - * separating ancestors of the node. - * \param watch if nonzero, a watch will be set at the server to notify - * the client if the node changes. - * \param completion the routine to invoke when the request completes. The completion - * will be triggered with one of the following codes passed in as the rc argument: - * ZOK operation completed successfully - * ZNONODE the node does not exist. - * ZNOAUTH the client does not have permission. - * \param data the data that will be passed to the completion routine when - * the function completes. - * \return ZOK on success or one of the following errcodes on failure: - * ZBADARGUMENTS - invalid input parameters - * ZINVALIDSTATE - zhandle state is either in ZOO_SESSION_EXPIRED_STATE or ZOO_AUTH_FAILED_STATE - * ZMARSHALLINGERROR - failed to marshall a request; possibly, out of memory - */ -ZOOAPI int zoo_aget(zhandle_t *zh, const char *path, int watch, - data_completion_t completion, const void *data); - -/** - * \brief gets the data associated with a node. - * - * This function is similar to \ref zoo_aget except it allows one specify - * a watcher object rather than a boolean watch flag. - * - * \param zh the zookeeper handle obtained by a call to \ref zookeeper_init - * \param path the name of the node. Expressed as a file name with slashes - * separating ancestors of the node. - * \param watcher if non-null, a watch will be set at the server to notify - * the client if the node changes. - * \param watcherCtx user specific data, will be passed to the watcher callback. - * Unlike the global context set by \ref zookeeper_init, this watcher context - * is associated with the given instance of the watcher only. - * \param completion the routine to invoke when the request completes. The completion - * will be triggered with one of the following codes passed in as the rc argument: - * ZOK operation completed successfully - * ZNONODE the node does not exist. - * ZNOAUTH the client does not have permission. - * \param data the data that will be passed to the completion routine when - * the function completes. - * \return ZOK on success or one of the following errcodes on failure: - * ZBADARGUMENTS - invalid input parameters - * ZINVALIDSTATE - zhandle state is either in ZOO_SESSION_EXPIRED_STATE or ZOO_AUTH_FAILED_STATE - * ZMARSHALLINGERROR - failed to marshall a request; possibly, out of memory - */ -ZOOAPI int zoo_awget(zhandle_t *zh, const char *path, - watcher_fn watcher, void* watcherCtx, - data_completion_t completion, const void *data); - -/** - * \brief sets the data associated with a node. - * - * \param zh the zookeeper handle obtained by a call to \ref zookeeper_init - * \param path the name of the node. Expressed as a file name with slashes - * separating ancestors of the node. - * \param buffer the buffer holding data to be written to the node. - * \param buflen the number of bytes from buffer to write. - * \param version the expected version of the node. The function will fail if - * the actual version of the node does not match the expected version. If -1 is - * used the version check will not take place. * completion: If null, - * the function will execute synchronously. Otherwise, the function will return - * immediately and invoke the completion routine when the request completes. - * \param completion the routine to invoke when the request completes. The completion - * will be triggered with one of the following codes passed in as the rc argument: - * ZOK operation completed successfully - * ZNONODE the node does not exist. - * ZNOAUTH the client does not have permission. - * ZBADVERSION expected version does not match actual version. - * \param data the data that will be passed to the completion routine when - * the function completes. - * \return ZOK on success or one of the following errcodes on failure: - * ZBADARGUMENTS - invalid input parameters - * ZINVALIDSTATE - zhandle state is either ZOO_SESSION_EXPIRED_STATE or ZOO_AUTH_FAILED_STATE - * ZMARSHALLINGERROR - failed to marshall a request; possibly, out of memory - */ -ZOOAPI int zoo_aset(zhandle_t *zh, const char *path, const char *buffer, int buflen, - int version, stat_completion_t completion, const void *data); - -/** - * \brief lists the children of a node. - * - * \param zh the zookeeper handle obtained by a call to \ref zookeeper_init - * \param path the name of the node. Expressed as a file name with slashes - * separating ancestors of the node. - * \param watch if nonzero, a watch will be set at the server to notify - * the client if the node changes. - * \param completion the routine to invoke when the request completes. The completion - * will be triggered with one of the following codes passed in as the rc argument: - * ZOK operation completed successfully - * ZNONODE the node does not exist. - * ZNOAUTH the client does not have permission. - * \param data the data that will be passed to the completion routine when - * the function completes. - * \return ZOK on success or one of the following errcodes on failure: - * ZBADARGUMENTS - invalid input parameters - * ZINVALIDSTATE - zhandle state is either ZOO_SESSION_EXPIRED_STATE or ZOO_AUTH_FAILED_STATE - * ZMARSHALLINGERROR - failed to marshall a request; possibly, out of memory - */ -ZOOAPI int zoo_aget_children(zhandle_t *zh, const char *path, int watch, - strings_completion_t completion, const void *data); - -/** - * \brief lists the children of a node. - * - * This function is similar to \ref zoo_aget_children except it allows one specify - * a watcher object rather than a boolean watch flag. - * - * \param zh the zookeeper handle obtained by a call to \ref zookeeper_init - * \param path the name of the node. Expressed as a file name with slashes - * separating ancestors of the node. - * \param watcher if non-null, a watch will be set at the server to notify - * the client if the node changes. - * \param watcherCtx user specific data, will be passed to the watcher callback. - * Unlike the global context set by \ref zookeeper_init, this watcher context - * is associated with the given instance of the watcher only. - * \param completion the routine to invoke when the request completes. The completion - * will be triggered with one of the following codes passed in as the rc argument: - * ZOK operation completed successfully - * ZNONODE the node does not exist. - * ZNOAUTH the client does not have permission. - * \param data the data that will be passed to the completion routine when - * the function completes. - * \return ZOK on success or one of the following errcodes on failure: - * ZBADARGUMENTS - invalid input parameters - * ZINVALIDSTATE - zhandle state is either ZOO_SESSION_EXPIRED_STATE or ZOO_AUTH_FAILED_STATE - * ZMARSHALLINGERROR - failed to marshall a request; possibly, out of memory - */ -ZOOAPI int zoo_awget_children(zhandle_t *zh, const char *path, - watcher_fn watcher, void* watcherCtx, - strings_completion_t completion, const void *data); - -/** - * \brief lists the children of a node, and get the parent stat. - * - * This function is new in version 3.3.0 - * - * \param zh the zookeeper handle obtained by a call to \ref zookeeper_init - * \param path the name of the node. Expressed as a file name with slashes - * separating ancestors of the node. - * \param watch if nonzero, a watch will be set at the server to notify - * the client if the node changes. - * \param completion the routine to invoke when the request completes. The completion - * will be triggered with one of the following codes passed in as the rc argument: - * ZOK operation completed successfully - * ZNONODE the node does not exist. - * ZNOAUTH the client does not have permission. - * \param data the data that will be passed to the completion routine when - * the function completes. - * \return ZOK on success or one of the following errcodes on failure: - * ZBADARGUMENTS - invalid input parameters - * ZINVALIDSTATE - zhandle state is either ZOO_SESSION_EXPIRED_STATE or ZOO_AUTH_FAILED_STATE - * ZMARSHALLINGERROR - failed to marshall a request; possibly, out of memory - */ -ZOOAPI int zoo_aget_children2(zhandle_t *zh, const char *path, int watch, - strings_stat_completion_t completion, const void *data); - -/** - * \brief lists the children of a node, and get the parent stat. - * - * This function is similar to \ref zoo_aget_children2 except it allows one specify - * a watcher object rather than a boolean watch flag. - * - * This function is new in version 3.3.0 - * - * \param zh the zookeeper handle obtained by a call to \ref zookeeper_init - * \param path the name of the node. Expressed as a file name with slashes - * separating ancestors of the node. - * \param watcher if non-null, a watch will be set at the server to notify - * the client if the node changes. - * \param watcherCtx user specific data, will be passed to the watcher callback. - * Unlike the global context set by \ref zookeeper_init, this watcher context - * is associated with the given instance of the watcher only. - * \param completion the routine to invoke when the request completes. The completion - * will be triggered with one of the following codes passed in as the rc argument: - * ZOK operation completed successfully - * ZNONODE the node does not exist. - * ZNOAUTH the client does not have permission. - * \param data the data that will be passed to the completion routine when - * the function completes. - * \return ZOK on success or one of the following errcodes on failure: - * ZBADARGUMENTS - invalid input parameters - * ZINVALIDSTATE - zhandle state is either ZOO_SESSION_EXPIRED_STATE or ZOO_AUTH_FAILED_STATE - * ZMARSHALLINGERROR - failed to marshall a request; possibly, out of memory - */ -ZOOAPI int zoo_awget_children2(zhandle_t *zh, const char *path, - watcher_fn watcher, void* watcherCtx, - strings_stat_completion_t completion, const void *data); - -/** - * \brief Flush leader channel. - * - * \param zh the zookeeper handle obtained by a call to \ref zookeeper_init - * \param path the name of the node. Expressed as a file name with slashes - * separating ancestors of the node. - * \param completion the routine to invoke when the request completes. The completion - * will be triggered with one of the following codes passed in as the rc argument: - * ZOK operation completed successfully - * ZNONODE the node does not exist. - * ZNOAUTH the client does not have permission. - * \param data the data that will be passed to the completion routine when - * the function completes. - * \return ZOK on success or one of the following errcodes on failure: - * ZBADARGUMENTS - invalid input parameters - * ZINVALIDSTATE - zhandle state is either ZOO_SESSION_EXPIRED_STATE or ZOO_AUTH_FAILED_STATE - * ZMARSHALLINGERROR - failed to marshall a request; possibly, out of memory - */ - -ZOOAPI int zoo_async(zhandle_t *zh, const char *path, - string_completion_t completion, const void *data); - - -/** - * \brief gets the acl associated with a node. - * - * \param zh the zookeeper handle obtained by a call to \ref zookeeper_init - * \param path the name of the node. Expressed as a file name with slashes - * separating ancestors of the node. - * \param completion the routine to invoke when the request completes. The completion - * will be triggered with one of the following codes passed in as the rc argument: - * ZOK operation completed successfully - * ZNONODE the node does not exist. - * ZNOAUTH the client does not have permission. - * \param data the data that will be passed to the completion routine when - * the function completes. - * \return ZOK on success or one of the following errcodes on failure: - * ZBADARGUMENTS - invalid input parameters - * ZINVALIDSTATE - zhandle state is either ZOO_SESSION_EXPIRED_STATE or ZOO_AUTH_FAILED_STATE - * ZMARSHALLINGERROR - failed to marshall a request; possibly, out of memory - */ -ZOOAPI int zoo_aget_acl(zhandle_t *zh, const char *path, acl_completion_t completion, - const void *data); - -/** - * \brief sets the acl associated with a node. - * - * \param zh the zookeeper handle obtained by a call to \ref zookeeper_init - * \param path the name of the node. Expressed as a file name with slashes - * separating ancestors of the node. - * \param buffer the buffer holding the acls to be written to the node. - * \param buflen the number of bytes from buffer to write. - * \param completion the routine to invoke when the request completes. The completion - * will be triggered with one of the following codes passed in as the rc argument: - * ZOK operation completed successfully - * ZNONODE the node does not exist. - * ZNOAUTH the client does not have permission. - * ZINVALIDACL invalid ACL specified - * ZBADVERSION expected version does not match actual version. - * \param data the data that will be passed to the completion routine when - * the function completes. - * \return ZOK on success or one of the following errcodes on failure: - * ZBADARGUMENTS - invalid input parameters - * ZINVALIDSTATE - zhandle state is either ZOO_SESSION_EXPIRED_STATE or ZOO_AUTH_FAILED_STATE - * ZMARSHALLINGERROR - failed to marshall a request; possibly, out of memory - */ -ZOOAPI int zoo_aset_acl(zhandle_t *zh, const char *path, int version, - struct ACL_vector *acl, void_completion_t, const void *data); - -/** - * \brief atomically commits multiple zookeeper operations. - * - * \param zh the zookeeper handle obtained by a call to \ref zookeeper_init - * \param count the number of operations - * \param ops an array of operations to commit - * \param results an array to hold the results of the operations - * \param completion the routine to invoke when the request completes. The completion - * will be triggered with any of the error codes that can that can be returned by the - * ops supported by a multi op (see \ref zoo_acreate, \ref zoo_adelete, \ref zoo_aset). - * \param data the data that will be passed to the completion routine when - * the function completes. - * \return the return code for the function call. This can be any of the - * values that can be returned by the ops supported by a multi op (see - * \ref zoo_acreate, \ref zoo_adelete, \ref zoo_aset). - */ -ZOOAPI int zoo_amulti(zhandle_t *zh, int count, const zoo_op_t *ops, - zoo_op_result_t *results, void_completion_t, const void *data); - -/** - * \brief return an error string. - * - * \param return code - * \return string corresponding to the return code - */ -ZOOAPI const char* zerror(int c); - -/** - * \brief specify application credentials. - * - * The application calls this function to specify its credentials for purposes - * of authentication. The server will use the security provider specified by - * the scheme parameter to authenticate the client connection. If the - * authentication request has failed: - * - the server connection is dropped - * - the watcher is called with the ZOO_AUTH_FAILED_STATE value as the state - * parameter. - * \param zh the zookeeper handle obtained by a call to \ref zookeeper_init - * \param scheme the id of authentication scheme. Natively supported: - * "digest" password-based authentication - * \param cert application credentials. The actual value depends on the scheme. - * \param certLen the length of the data parameter - * \param completion the routine to invoke when the request completes. One of - * the following result codes may be passed into the completion callback: - * ZOK operation completed successfully - * ZAUTHFAILED authentication failed - * \param data the data that will be passed to the completion routine when the - * function completes. - * \return ZOK on success or one of the following errcodes on failure: - * ZBADARGUMENTS - invalid input parameters - * ZINVALIDSTATE - zhandle state is either ZOO_SESSION_EXPIRED_STATE or ZOO_AUTH_FAILED_STATE - * ZMARSHALLINGERROR - failed to marshall a request; possibly, out of memory - * ZSYSTEMERROR - a system error occured - */ -ZOOAPI int zoo_add_auth(zhandle_t *zh,const char* scheme,const char* cert, - int certLen, void_completion_t completion, const void *data); - -/** - * \brief checks if the current zookeeper connection state can't be recovered. - * - * The application must close the zhandle and try to reconnect. - * - * \param zh the zookeeper handle (see \ref zookeeper_init) - * \return ZINVALIDSTATE if connection is unrecoverable - */ -ZOOAPI int is_unrecoverable(zhandle_t *zh); - -/** - * \brief sets the debugging level for the library - */ -ZOOAPI void zoo_set_debug_level(ZooLogLevel logLevel); - -/** - * \brief sets the stream to be used by the library for logging - * - * The zookeeper library uses stderr as its default log stream. Application - * must make sure the stream is writable. Passing in NULL resets the stream - * to its default value (stderr). - */ -ZOOAPI void zoo_set_log_stream(FILE* logStream); - -/** - * \brief enable/disable quorum endpoint order randomization - * - * Note: typically this method should NOT be used outside of testing. - * - * If passed a non-zero value, will make the client connect to quorum peers - * in the order as specified in the zookeeper_init() call. - * A zero value causes zookeeper_init() to permute the peer endpoints - * which is good for more even client connection distribution among the - * quorum peers. - */ -ZOOAPI void zoo_deterministic_conn_order(int yesOrNo); - -/** - * \brief create a node synchronously. - * - * This method will create a node in ZooKeeper. A node can only be created if - * it does not already exists. The Create Flags affect the creation of nodes. - * If ZOO_EPHEMERAL flag is set, the node will automatically get removed if the - * client session goes away. If the ZOO_SEQUENCE flag is set, a unique - * monotonically increasing sequence number is appended to the path name. - * - * \param zh the zookeeper handle obtained by a call to \ref zookeeper_init - * \param path The name of the node. Expressed as a file name with slashes - * separating ancestors of the node. - * \param value The data to be stored in the node. - * \param valuelen The number of bytes in data. To set the data to be NULL use - * value as NULL and valuelen as -1. - * \param acl The initial ACL of the node. The ACL must not be null or empty. - * \param flags this parameter can be set to 0 for normal create or an OR - * of the Create Flags - * \param path_buffer Buffer which will be filled with the path of the - * new node (this might be different than the supplied path - * because of the ZOO_SEQUENCE flag). The path string will always be - * null-terminated. This parameter may be NULL if path_buffer_len = 0. - * \param path_buffer_len Size of path buffer; if the path of the new - * node (including space for the null terminator) exceeds the buffer size, - * the path string will be truncated to fit. The actual path of the - * new node in the server will not be affected by the truncation. - * The path string will always be null-terminated. - * \return one of the following codes are returned: - * ZOK operation completed successfully - * ZNONODE the parent node does not exist. - * ZNODEEXISTS the node already exists - * ZNOAUTH the client does not have permission. - * ZNOCHILDRENFOREPHEMERALS cannot create children of ephemeral nodes. - * ZBADARGUMENTS - invalid input parameters - * ZINVALIDSTATE - zhandle state is either ZOO_SESSION_EXPIRED_STATE or ZOO_AUTH_FAILED_STATE - * ZMARSHALLINGERROR - failed to marshall a request; possibly, out of memory - */ -ZOOAPI int zoo_create(zhandle_t *zh, const char *path, const char *value, - int valuelen, const struct ACL_vector *acl, int flags, - char *path_buffer, int path_buffer_len); - -/** - * \brief delete a node in zookeeper synchronously. - * - * \param zh the zookeeper handle obtained by a call to \ref zookeeper_init - * \param path the name of the node. Expressed as a file name with slashes - * separating ancestors of the node. - * \param version the expected version of the node. The function will fail if the - * actual version of the node does not match the expected version. - * If -1 is used the version check will not take place. - * \return one of the following values is returned. - * ZOK operation completed successfully - * ZNONODE the node does not exist. - * ZNOAUTH the client does not have permission. - * ZBADVERSION expected version does not match actual version. - * ZNOTEMPTY children are present; node cannot be deleted. - * ZBADARGUMENTS - invalid input parameters - * ZINVALIDSTATE - zhandle state is either ZOO_SESSION_EXPIRED_STATE or ZOO_AUTH_FAILED_STATE - * ZMARSHALLINGERROR - failed to marshall a request; possibly, out of memory - */ -ZOOAPI int zoo_delete(zhandle_t *zh, const char *path, int version); - - -/** - * \brief checks the existence of a node in zookeeper synchronously. - * - * \param zh the zookeeper handle obtained by a call to \ref zookeeper_init - * \param path the name of the node. Expressed as a file name with slashes - * separating ancestors of the node. - * \param watch if nonzero, a watch will be set at the server to notify the - * client if the node changes. The watch will be set even if the node does not - * exist. This allows clients to watch for nodes to appear. - * \param the return stat value of the node. - * \return return code of the function call. - * ZOK operation completed successfully - * ZNONODE the node does not exist. - * ZNOAUTH the client does not have permission. - * ZBADARGUMENTS - invalid input parameters - * ZINVALIDSTATE - zhandle state is either ZOO_SESSION_EXPIRED_STATE or ZOO_AUTH_FAILED_STATE - * ZMARSHALLINGERROR - failed to marshall a request; possibly, out of memory - */ -ZOOAPI int zoo_exists(zhandle_t *zh, const char *path, int watch, struct Stat *stat); - -/** - * \brief checks the existence of a node in zookeeper synchronously. - * - * This function is similar to \ref zoo_exists except it allows one specify - * a watcher object rather than a boolean watch flag. - * - * \param zh the zookeeper handle obtained by a call to \ref zookeeper_init - * \param path the name of the node. Expressed as a file name with slashes - * separating ancestors of the node. - * \param watcher if non-null a watch will set on the specified znode on the server. - * The watch will be set even if the node does not exist. This allows clients - * to watch for nodes to appear. - * \param watcherCtx user specific data, will be passed to the watcher callback. - * Unlike the global context set by \ref zookeeper_init, this watcher context - * is associated with the given instance of the watcher only. - * \param the return stat value of the node. - * \return return code of the function call. - * ZOK operation completed successfully - * ZNONODE the node does not exist. - * ZNOAUTH the client does not have permission. - * ZBADARGUMENTS - invalid input parameters - * ZINVALIDSTATE - zhandle state is either ZOO_SESSION_EXPIRED_STATE or ZOO_AUTH_FAILED_STATE - * ZMARSHALLINGERROR - failed to marshall a request; possibly, out of memory - */ -ZOOAPI int zoo_wexists(zhandle_t *zh, const char *path, - watcher_fn watcher, void* watcherCtx, struct Stat *stat); - -/** - * \brief gets the data associated with a node synchronously. - * - * \param zh the zookeeper handle obtained by a call to \ref zookeeper_init - * \param path the name of the node. Expressed as a file name with slashes - * separating ancestors of the node. - * \param watch if nonzero, a watch will be set at the server to notify - * the client if the node changes. - * \param buffer the buffer holding the node data returned by the server - * \param buffer_len is the size of the buffer pointed to by the buffer parameter. - * It'll be set to the actual data length upon return. If the data is NULL, length is -1. - * \param stat if not NULL, will hold the value of stat for the path on return. - * \return return value of the function call. - * ZOK operation completed successfully - * ZNONODE the node does not exist. - * ZNOAUTH the client does not have permission. - * ZBADARGUMENTS - invalid input parameters - * ZINVALIDSTATE - zhandle state is either in ZOO_SESSION_EXPIRED_STATE or ZOO_AUTH_FAILED_STATE - * ZMARSHALLINGERROR - failed to marshall a request; possibly, out of memory - */ -ZOOAPI int zoo_get(zhandle_t *zh, const char *path, int watch, char *buffer, - int* buffer_len, struct Stat *stat); - -/** - * \brief gets the data associated with a node synchronously. - * - * This function is similar to \ref zoo_get except it allows one specify - * a watcher object rather than a boolean watch flag. - * - * \param zh the zookeeper handle obtained by a call to \ref zookeeper_init - * \param path the name of the node. Expressed as a file name with slashes - * separating ancestors of the node. - * \param watcher if non-null, a watch will be set at the server to notify - * the client if the node changes. - * \param watcherCtx user specific data, will be passed to the watcher callback. - * Unlike the global context set by \ref zookeeper_init, this watcher context - * is associated with the given instance of the watcher only. - * \param buffer the buffer holding the node data returned by the server - * \param buffer_len is the size of the buffer pointed to by the buffer parameter. - * It'll be set to the actual data length upon return. If the data is NULL, length is -1. - * \param stat if not NULL, will hold the value of stat for the path on return. - * \return return value of the function call. - * ZOK operation completed successfully - * ZNONODE the node does not exist. - * ZNOAUTH the client does not have permission. - * ZBADARGUMENTS - invalid input parameters - * ZINVALIDSTATE - zhandle state is either in ZOO_SESSION_EXPIRED_STATE or ZOO_AUTH_FAILED_STATE - * ZMARSHALLINGERROR - failed to marshall a request; possibly, out of memory - */ -ZOOAPI int zoo_wget(zhandle_t *zh, const char *path, - watcher_fn watcher, void* watcherCtx, - char *buffer, int* buffer_len, struct Stat *stat); - -/** - * \brief sets the data associated with a node. See zoo_set2 function if - * you require access to the stat information associated with the znode. - * - * \param zh the zookeeper handle obtained by a call to \ref zookeeper_init - * \param path the name of the node. Expressed as a file name with slashes - * separating ancestors of the node. - * \param buffer the buffer holding data to be written to the node. - * \param buflen the number of bytes from buffer to write. To set NULL as data - * use buffer as NULL and buflen as -1. - * \param version the expected version of the node. The function will fail if - * the actual version of the node does not match the expected version. If -1 is - * used the version check will not take place. - * \return the return code for the function call. - * ZOK operation completed successfully - * ZNONODE the node does not exist. - * ZNOAUTH the client does not have permission. - * ZBADVERSION expected version does not match actual version. - * ZBADARGUMENTS - invalid input parameters - * ZINVALIDSTATE - zhandle state is either ZOO_SESSION_EXPIRED_STATE or ZOO_AUTH_FAILED_STATE - * ZMARSHALLINGERROR - failed to marshall a request; possibly, out of memory - */ -ZOOAPI int zoo_set(zhandle_t *zh, const char *path, const char *buffer, - int buflen, int version); - -/** - * \brief sets the data associated with a node. This function is the same - * as zoo_set except that it also provides access to stat information - * associated with the znode. - * - * \param zh the zookeeper handle obtained by a call to \ref zookeeper_init - * \param path the name of the node. Expressed as a file name with slashes - * separating ancestors of the node. - * \param buffer the buffer holding data to be written to the node. - * \param buflen the number of bytes from buffer to write. To set NULL as data - * use buffer as NULL and buflen as -1. - * \param version the expected version of the node. The function will fail if - * the actual version of the node does not match the expected version. If -1 is - * used the version check will not take place. - * \param stat if not NULL, will hold the value of stat for the path on return. - * \return the return code for the function call. - * ZOK operation completed successfully - * ZNONODE the node does not exist. - * ZNOAUTH the client does not have permission. - * ZBADVERSION expected version does not match actual version. - * ZBADARGUMENTS - invalid input parameters - * ZINVALIDSTATE - zhandle state is either ZOO_SESSION_EXPIRED_STATE or ZOO_AUTH_FAILED_STATE - * ZMARSHALLINGERROR - failed to marshall a request; possibly, out of memory - */ -ZOOAPI int zoo_set2(zhandle_t *zh, const char *path, const char *buffer, - int buflen, int version, struct Stat *stat); - -/** - * \brief lists the children of a node synchronously. - * - * \param zh the zookeeper handle obtained by a call to \ref zookeeper_init - * \param path the name of the node. Expressed as a file name with slashes - * separating ancestors of the node. - * \param watch if nonzero, a watch will be set at the server to notify - * the client if the node changes. - * \param strings return value of children paths. - * \return the return code of the function. - * ZOK operation completed successfully - * ZNONODE the node does not exist. - * ZNOAUTH the client does not have permission. - * ZBADARGUMENTS - invalid input parameters - * ZINVALIDSTATE - zhandle state is either ZOO_SESSION_EXPIRED_STATE or ZOO_AUTH_FAILED_STATE - * ZMARSHALLINGERROR - failed to marshall a request; possibly, out of memory - */ -ZOOAPI int zoo_get_children(zhandle_t *zh, const char *path, int watch, - struct String_vector *strings); - -/** - * \brief lists the children of a node synchronously. - * - * This function is similar to \ref zoo_get_children except it allows one specify - * a watcher object rather than a boolean watch flag. - * - * \param zh the zookeeper handle obtained by a call to \ref zookeeper_init - * \param path the name of the node. Expressed as a file name with slashes - * separating ancestors of the node. - * \param watcher if non-null, a watch will be set at the server to notify - * the client if the node changes. - * \param watcherCtx user specific data, will be passed to the watcher callback. - * Unlike the global context set by \ref zookeeper_init, this watcher context - * is associated with the given instance of the watcher only. - * \param strings return value of children paths. - * \return the return code of the function. - * ZOK operation completed successfully - * ZNONODE the node does not exist. - * ZNOAUTH the client does not have permission. - * ZBADARGUMENTS - invalid input parameters - * ZINVALIDSTATE - zhandle state is either ZOO_SESSION_EXPIRED_STATE or ZOO_AUTH_FAILED_STATE - * ZMARSHALLINGERROR - failed to marshall a request; possibly, out of memory - */ -ZOOAPI int zoo_wget_children(zhandle_t *zh, const char *path, - watcher_fn watcher, void* watcherCtx, - struct String_vector *strings); - -/** - * \brief lists the children of a node and get its stat synchronously. - * - * This function is new in version 3.3.0 - * - * \param zh the zookeeper handle obtained by a call to \ref zookeeper_init - * \param path the name of the node. Expressed as a file name with slashes - * separating ancestors of the node. - * \param watch if nonzero, a watch will be set at the server to notify - * the client if the node changes. - * \param strings return value of children paths. - * \param stat return value of node stat. - * \return the return code of the function. - * ZOK operation completed successfully - * ZNONODE the node does not exist. - * ZNOAUTH the client does not have permission. - * ZBADARGUMENTS - invalid input parameters - * ZINVALIDSTATE - zhandle state is either ZOO_SESSION_EXPIRED_STATE or ZOO_AUTH_FAILED_STATE - * ZMARSHALLINGERROR - failed to marshall a request; possibly, out of memory - */ -ZOOAPI int zoo_get_children2(zhandle_t *zh, const char *path, int watch, - struct String_vector *strings, struct Stat *stat); - -/** - * \brief lists the children of a node and get its stat synchronously. - * - * This function is similar to \ref zoo_get_children except it allows one specify - * a watcher object rather than a boolean watch flag. - * - * This function is new in version 3.3.0 - * - * \param zh the zookeeper handle obtained by a call to \ref zookeeper_init - * \param path the name of the node. Expressed as a file name with slashes - * separating ancestors of the node. - * \param watcher if non-null, a watch will be set at the server to notify - * the client if the node changes. - * \param watcherCtx user specific data, will be passed to the watcher callback. - * Unlike the global context set by \ref zookeeper_init, this watcher context - * is associated with the given instance of the watcher only. - * \param strings return value of children paths. - * \param stat return value of node stat. - * \return the return code of the function. - * ZOK operation completed successfully - * ZNONODE the node does not exist. - * ZNOAUTH the client does not have permission. - * ZBADARGUMENTS - invalid input parameters - * ZINVALIDSTATE - zhandle state is either ZOO_SESSION_EXPIRED_STATE or ZOO_AUTH_FAILED_STATE - * ZMARSHALLINGERROR - failed to marshall a request; possibly, out of memory - */ -ZOOAPI int zoo_wget_children2(zhandle_t *zh, const char *path, - watcher_fn watcher, void* watcherCtx, - struct String_vector *strings, struct Stat *stat); - -/** - * \brief gets the acl associated with a node synchronously. - * - * \param zh the zookeeper handle obtained by a call to \ref zookeeper_init - * \param path the name of the node. Expressed as a file name with slashes - * separating ancestors of the node. - * \param acl the return value of acls on the path. - * \param stat returns the stat of the path specified. - * \return the return code for the function call. - * ZOK operation completed successfully - * ZNONODE the node does not exist. - * ZNOAUTH the client does not have permission. - * ZBADARGUMENTS - invalid input parameters - * ZINVALIDSTATE - zhandle state is either ZOO_SESSION_EXPIRED_STATE or ZOO_AUTH_FAILED_STATE - * ZMARSHALLINGERROR - failed to marshall a request; possibly, out of memory - */ -ZOOAPI int zoo_get_acl(zhandle_t *zh, const char *path, struct ACL_vector *acl, - struct Stat *stat); - -/** - * \brief sets the acl associated with a node synchronously. - * - * \param zh the zookeeper handle obtained by a call to \ref zookeeper_init - * \param path the name of the node. Expressed as a file name with slashes - * separating ancestors of the node. - * \param version the expected version of the path. - * \param acl the acl to be set on the path. - * \return the return code for the function call. - * ZOK operation completed successfully - * ZNONODE the node does not exist. - * ZNOAUTH the client does not have permission. - * ZINVALIDACL invalid ACL specified - * ZBADVERSION expected version does not match actual version. - * ZBADARGUMENTS - invalid input parameters - * ZINVALIDSTATE - zhandle state is either ZOO_SESSION_EXPIRED_STATE or ZOO_AUTH_FAILED_STATE - * ZMARSHALLINGERROR - failed to marshall a request; possibly, out of memory - */ -ZOOAPI int zoo_set_acl(zhandle_t *zh, const char *path, int version, - const struct ACL_vector *acl); - -/** - * \brief atomically commits multiple zookeeper operations synchronously. - * - * \param zh the zookeeper handle obtained by a call to \ref zookeeper_init - * \param count the number of operations - * \param ops an array of operations to commit - * \param results an array to hold the results of the operations - * \return the return code for the function call. This can be any of the - * values that can be returned by the ops supported by a multi op (see - * \ref zoo_acreate, \ref zoo_adelete, \ref zoo_aset). - */ -ZOOAPI int zoo_multi(zhandle_t *zh, int count, const zoo_op_t *ops, zoo_op_result_t *results); - -#ifdef __cplusplus -} -#endif - -#endif /*ZOOKEEPER_H_*/ diff --git a/pkg/registry/zookeeper-3.4.6/src/c/include/zookeeper_log.h b/pkg/registry/zookeeper-3.4.6/src/c/include/zookeeper_log.h deleted file mode 100644 index e5917cbc6..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/c/include/zookeeper_log.h +++ /dev/null @@ -1,51 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you 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. - */ - -#ifndef ZK_LOG_H_ -#define ZK_LOG_H_ - -#include - -#ifdef __cplusplus -extern "C" { -#endif - -extern ZOOAPI ZooLogLevel logLevel; -#define LOGSTREAM getLogStream() - -#define LOG_ERROR(x) if(logLevel>=ZOO_LOG_LEVEL_ERROR) \ - log_message(ZOO_LOG_LEVEL_ERROR,__LINE__,__func__,format_log_message x) -#define LOG_WARN(x) if(logLevel>=ZOO_LOG_LEVEL_WARN) \ - log_message(ZOO_LOG_LEVEL_WARN,__LINE__,__func__,format_log_message x) -#define LOG_INFO(x) if(logLevel>=ZOO_LOG_LEVEL_INFO) \ - log_message(ZOO_LOG_LEVEL_INFO,__LINE__,__func__,format_log_message x) -#define LOG_DEBUG(x) if(logLevel==ZOO_LOG_LEVEL_DEBUG) \ - log_message(ZOO_LOG_LEVEL_DEBUG,__LINE__,__func__,format_log_message x) - -ZOOAPI void log_message(ZooLogLevel curLevel, int line,const char* funcName, - const char* message); - -ZOOAPI const char* format_log_message(const char* format,...); - -FILE* getLogStream(); - -#ifdef __cplusplus -} -#endif - -#endif /*ZK_LOG_H_*/ diff --git a/pkg/registry/zookeeper-3.4.6/src/c/include/zookeeper_version.h b/pkg/registry/zookeeper-3.4.6/src/c/include/zookeeper_version.h deleted file mode 100644 index 3e1c63684..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/c/include/zookeeper_version.h +++ /dev/null @@ -1,33 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you 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. - */ -#ifndef ZOOKEEPER_VERSION_H_ -#define ZOOKEEPER_VERSION_H_ - -#ifdef __cplusplus -extern "C" { -#endif - -#define ZOO_MAJOR_VERSION 3 -#define ZOO_MINOR_VERSION 4 -#define ZOO_PATCH_VERSION 6 - -#ifdef __cplusplus -} -#endif - -#endif /* ZOOKEEPER_VERSION_H_ */ diff --git a/pkg/registry/zookeeper-3.4.6/src/c/install-sh b/pkg/registry/zookeeper-3.4.6/src/c/install-sh deleted file mode 100755 index a9244eb07..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/c/install-sh +++ /dev/null @@ -1,527 +0,0 @@ -#!/bin/sh -# install - install a program, script, or datafile - -scriptversion=2011-01-19.21; # UTC - -# This originates from X11R5 (mit/util/scripts/install.sh), which was -# later released in X11R6 (xc/config/util/install.sh) with the -# following copyright and license. -# -# Copyright (C) 1994 X Consortium -# -# Permission is hereby granted, free of charge, to any person obtaining a copy -# of this software and associated documentation files (the "Software"), to -# deal in the Software without restriction, including without limitation the -# rights to use, copy, modify, merge, publish, distribute, sublicense, and/or -# sell copies of the Software, and to permit persons to whom the Software is -# furnished to do so, subject to the following conditions: -# -# The above copyright notice and this permission notice shall be included in -# all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -# X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN -# AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNEC- -# TION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -# -# Except as contained in this notice, the name of the X Consortium shall not -# be used in advertising or otherwise to promote the sale, use or other deal- -# ings in this Software without prior written authorization from the X Consor- -# tium. -# -# -# FSF changes to this file are in the public domain. -# -# Calling this script install-sh is preferred over install.sh, to prevent -# `make' implicit rules from creating a file called install from it -# when there is no Makefile. -# -# This script is compatible with the BSD install script, but was written -# from scratch. - -nl=' -' -IFS=" "" $nl" - -# set DOITPROG to echo to test this script - -# Don't use :- since 4.3BSD and earlier shells don't like it. -doit=${DOITPROG-} -if test -z "$doit"; then - doit_exec=exec -else - doit_exec=$doit -fi - -# Put in absolute file names if you don't have them in your path; -# or use environment vars. - -chgrpprog=${CHGRPPROG-chgrp} -chmodprog=${CHMODPROG-chmod} -chownprog=${CHOWNPROG-chown} -cmpprog=${CMPPROG-cmp} -cpprog=${CPPROG-cp} -mkdirprog=${MKDIRPROG-mkdir} -mvprog=${MVPROG-mv} -rmprog=${RMPROG-rm} -stripprog=${STRIPPROG-strip} - -posix_glob='?' -initialize_posix_glob=' - test "$posix_glob" != "?" || { - if (set -f) 2>/dev/null; then - posix_glob= - else - posix_glob=: - fi - } -' - -posix_mkdir= - -# Desired mode of installed file. -mode=0755 - -chgrpcmd= -chmodcmd=$chmodprog -chowncmd= -mvcmd=$mvprog -rmcmd="$rmprog -f" -stripcmd= - -src= -dst= -dir_arg= -dst_arg= - -copy_on_change=false -no_target_directory= - -usage="\ -Usage: $0 [OPTION]... [-T] SRCFILE DSTFILE - or: $0 [OPTION]... SRCFILES... DIRECTORY - or: $0 [OPTION]... -t DIRECTORY SRCFILES... - or: $0 [OPTION]... -d DIRECTORIES... - -In the 1st form, copy SRCFILE to DSTFILE. -In the 2nd and 3rd, copy all SRCFILES to DIRECTORY. -In the 4th, create DIRECTORIES. - -Options: - --help display this help and exit. - --version display version info and exit. - - -c (ignored) - -C install only if different (preserve the last data modification time) - -d create directories instead of installing files. - -g GROUP $chgrpprog installed files to GROUP. - -m MODE $chmodprog installed files to MODE. - -o USER $chownprog installed files to USER. - -s $stripprog installed files. - -t DIRECTORY install into DIRECTORY. - -T report an error if DSTFILE is a directory. - -Environment variables override the default commands: - CHGRPPROG CHMODPROG CHOWNPROG CMPPROG CPPROG MKDIRPROG MVPROG - RMPROG STRIPPROG -" - -while test $# -ne 0; do - case $1 in - -c) ;; - - -C) copy_on_change=true;; - - -d) dir_arg=true;; - - -g) chgrpcmd="$chgrpprog $2" - shift;; - - --help) echo "$usage"; exit $?;; - - -m) mode=$2 - case $mode in - *' '* | *' '* | *' -'* | *'*'* | *'?'* | *'['*) - echo "$0: invalid mode: $mode" >&2 - exit 1;; - esac - shift;; - - -o) chowncmd="$chownprog $2" - shift;; - - -s) stripcmd=$stripprog;; - - -t) dst_arg=$2 - # Protect names problematic for `test' and other utilities. - case $dst_arg in - -* | [=\(\)!]) dst_arg=./$dst_arg;; - esac - shift;; - - -T) no_target_directory=true;; - - --version) echo "$0 $scriptversion"; exit $?;; - - --) shift - break;; - - -*) echo "$0: invalid option: $1" >&2 - exit 1;; - - *) break;; - esac - shift -done - -if test $# -ne 0 && test -z "$dir_arg$dst_arg"; then - # When -d is used, all remaining arguments are directories to create. - # When -t is used, the destination is already specified. - # Otherwise, the last argument is the destination. Remove it from $@. - for arg - do - if test -n "$dst_arg"; then - # $@ is not empty: it contains at least $arg. - set fnord "$@" "$dst_arg" - shift # fnord - fi - shift # arg - dst_arg=$arg - # Protect names problematic for `test' and other utilities. - case $dst_arg in - -* | [=\(\)!]) dst_arg=./$dst_arg;; - esac - done -fi - -if test $# -eq 0; then - if test -z "$dir_arg"; then - echo "$0: no input file specified." >&2 - exit 1 - fi - # It's OK to call `install-sh -d' without argument. - # This can happen when creating conditional directories. - exit 0 -fi - -if test -z "$dir_arg"; then - do_exit='(exit $ret); exit $ret' - trap "ret=129; $do_exit" 1 - trap "ret=130; $do_exit" 2 - trap "ret=141; $do_exit" 13 - trap "ret=143; $do_exit" 15 - - # Set umask so as not to create temps with too-generous modes. - # However, 'strip' requires both read and write access to temps. - case $mode in - # Optimize common cases. - *644) cp_umask=133;; - *755) cp_umask=22;; - - *[0-7]) - if test -z "$stripcmd"; then - u_plus_rw= - else - u_plus_rw='% 200' - fi - cp_umask=`expr '(' 777 - $mode % 1000 ')' $u_plus_rw`;; - *) - if test -z "$stripcmd"; then - u_plus_rw= - else - u_plus_rw=,u+rw - fi - cp_umask=$mode$u_plus_rw;; - esac -fi - -for src -do - # Protect names problematic for `test' and other utilities. - case $src in - -* | [=\(\)!]) src=./$src;; - esac - - if test -n "$dir_arg"; then - dst=$src - dstdir=$dst - test -d "$dstdir" - dstdir_status=$? - else - - # Waiting for this to be detected by the "$cpprog $src $dsttmp" command - # might cause directories to be created, which would be especially bad - # if $src (and thus $dsttmp) contains '*'. - if test ! -f "$src" && test ! -d "$src"; then - echo "$0: $src does not exist." >&2 - exit 1 - fi - - if test -z "$dst_arg"; then - echo "$0: no destination specified." >&2 - exit 1 - fi - dst=$dst_arg - - # If destination is a directory, append the input filename; won't work - # if double slashes aren't ignored. - if test -d "$dst"; then - if test -n "$no_target_directory"; then - echo "$0: $dst_arg: Is a directory" >&2 - exit 1 - fi - dstdir=$dst - dst=$dstdir/`basename "$src"` - dstdir_status=0 - else - # Prefer dirname, but fall back on a substitute if dirname fails. - dstdir=` - (dirname "$dst") 2>/dev/null || - expr X"$dst" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ - X"$dst" : 'X\(//\)[^/]' \| \ - X"$dst" : 'X\(//\)$' \| \ - X"$dst" : 'X\(/\)' \| . 2>/dev/null || - echo X"$dst" | - sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ - s//\1/ - q - } - /^X\(\/\/\)[^/].*/{ - s//\1/ - q - } - /^X\(\/\/\)$/{ - s//\1/ - q - } - /^X\(\/\).*/{ - s//\1/ - q - } - s/.*/./; q' - ` - - test -d "$dstdir" - dstdir_status=$? - fi - fi - - obsolete_mkdir_used=false - - if test $dstdir_status != 0; then - case $posix_mkdir in - '') - # Create intermediate dirs using mode 755 as modified by the umask. - # This is like FreeBSD 'install' as of 1997-10-28. - umask=`umask` - case $stripcmd.$umask in - # Optimize common cases. - *[2367][2367]) mkdir_umask=$umask;; - .*0[02][02] | .[02][02] | .[02]) mkdir_umask=22;; - - *[0-7]) - mkdir_umask=`expr $umask + 22 \ - - $umask % 100 % 40 + $umask % 20 \ - - $umask % 10 % 4 + $umask % 2 - `;; - *) mkdir_umask=$umask,go-w;; - esac - - # With -d, create the new directory with the user-specified mode. - # Otherwise, rely on $mkdir_umask. - if test -n "$dir_arg"; then - mkdir_mode=-m$mode - else - mkdir_mode= - fi - - posix_mkdir=false - case $umask in - *[123567][0-7][0-7]) - # POSIX mkdir -p sets u+wx bits regardless of umask, which - # is incompatible with FreeBSD 'install' when (umask & 300) != 0. - ;; - *) - tmpdir=${TMPDIR-/tmp}/ins$RANDOM-$$ - trap 'ret=$?; rmdir "$tmpdir/d" "$tmpdir" 2>/dev/null; exit $ret' 0 - - if (umask $mkdir_umask && - exec $mkdirprog $mkdir_mode -p -- "$tmpdir/d") >/dev/null 2>&1 - then - if test -z "$dir_arg" || { - # Check for POSIX incompatibilities with -m. - # HP-UX 11.23 and IRIX 6.5 mkdir -m -p sets group- or - # other-writeable bit of parent directory when it shouldn't. - # FreeBSD 6.1 mkdir -m -p sets mode of existing directory. - ls_ld_tmpdir=`ls -ld "$tmpdir"` - case $ls_ld_tmpdir in - d????-?r-*) different_mode=700;; - d????-?--*) different_mode=755;; - *) false;; - esac && - $mkdirprog -m$different_mode -p -- "$tmpdir" && { - ls_ld_tmpdir_1=`ls -ld "$tmpdir"` - test "$ls_ld_tmpdir" = "$ls_ld_tmpdir_1" - } - } - then posix_mkdir=: - fi - rmdir "$tmpdir/d" "$tmpdir" - else - # Remove any dirs left behind by ancient mkdir implementations. - rmdir ./$mkdir_mode ./-p ./-- 2>/dev/null - fi - trap '' 0;; - esac;; - esac - - if - $posix_mkdir && ( - umask $mkdir_umask && - $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir" - ) - then : - else - - # The umask is ridiculous, or mkdir does not conform to POSIX, - # or it failed possibly due to a race condition. Create the - # directory the slow way, step by step, checking for races as we go. - - case $dstdir in - /*) prefix='/';; - [-=\(\)!]*) prefix='./';; - *) prefix='';; - esac - - eval "$initialize_posix_glob" - - oIFS=$IFS - IFS=/ - $posix_glob set -f - set fnord $dstdir - shift - $posix_glob set +f - IFS=$oIFS - - prefixes= - - for d - do - test X"$d" = X && continue - - prefix=$prefix$d - if test -d "$prefix"; then - prefixes= - else - if $posix_mkdir; then - (umask=$mkdir_umask && - $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir") && break - # Don't fail if two instances are running concurrently. - test -d "$prefix" || exit 1 - else - case $prefix in - *\'*) qprefix=`echo "$prefix" | sed "s/'/'\\\\\\\\''/g"`;; - *) qprefix=$prefix;; - esac - prefixes="$prefixes '$qprefix'" - fi - fi - prefix=$prefix/ - done - - if test -n "$prefixes"; then - # Don't fail if two instances are running concurrently. - (umask $mkdir_umask && - eval "\$doit_exec \$mkdirprog $prefixes") || - test -d "$dstdir" || exit 1 - obsolete_mkdir_used=true - fi - fi - fi - - if test -n "$dir_arg"; then - { test -z "$chowncmd" || $doit $chowncmd "$dst"; } && - { test -z "$chgrpcmd" || $doit $chgrpcmd "$dst"; } && - { test "$obsolete_mkdir_used$chowncmd$chgrpcmd" = false || - test -z "$chmodcmd" || $doit $chmodcmd $mode "$dst"; } || exit 1 - else - - # Make a couple of temp file names in the proper directory. - dsttmp=$dstdir/_inst.$$_ - rmtmp=$dstdir/_rm.$$_ - - # Trap to clean up those temp files at exit. - trap 'ret=$?; rm -f "$dsttmp" "$rmtmp" && exit $ret' 0 - - # Copy the file name to the temp name. - (umask $cp_umask && $doit_exec $cpprog "$src" "$dsttmp") && - - # and set any options; do chmod last to preserve setuid bits. - # - # If any of these fail, we abort the whole thing. If we want to - # ignore errors from any of these, just make sure not to ignore - # errors from the above "$doit $cpprog $src $dsttmp" command. - # - { test -z "$chowncmd" || $doit $chowncmd "$dsttmp"; } && - { test -z "$chgrpcmd" || $doit $chgrpcmd "$dsttmp"; } && - { test -z "$stripcmd" || $doit $stripcmd "$dsttmp"; } && - { test -z "$chmodcmd" || $doit $chmodcmd $mode "$dsttmp"; } && - - # If -C, don't bother to copy if it wouldn't change the file. - if $copy_on_change && - old=`LC_ALL=C ls -dlL "$dst" 2>/dev/null` && - new=`LC_ALL=C ls -dlL "$dsttmp" 2>/dev/null` && - - eval "$initialize_posix_glob" && - $posix_glob set -f && - set X $old && old=:$2:$4:$5:$6 && - set X $new && new=:$2:$4:$5:$6 && - $posix_glob set +f && - - test "$old" = "$new" && - $cmpprog "$dst" "$dsttmp" >/dev/null 2>&1 - then - rm -f "$dsttmp" - else - # Rename the file to the real destination. - $doit $mvcmd -f "$dsttmp" "$dst" 2>/dev/null || - - # The rename failed, perhaps because mv can't rename something else - # to itself, or perhaps because mv is so ancient that it does not - # support -f. - { - # Now remove or move aside any old file at destination location. - # We try this two ways since rm can't unlink itself on some - # systems and the destination file might be busy for other - # reasons. In this case, the final cleanup might fail but the new - # file should still install successfully. - { - test ! -f "$dst" || - $doit $rmcmd -f "$dst" 2>/dev/null || - { $doit $mvcmd -f "$dst" "$rmtmp" 2>/dev/null && - { $doit $rmcmd -f "$rmtmp" 2>/dev/null; :; } - } || - { echo "$0: cannot unlink or rename $dst" >&2 - (exit 1); exit 1 - } - } && - - # Now rename the file to the real destination. - $doit $mvcmd "$dsttmp" "$dst" - } - fi || exit 1 - - trap '' 0 - fi -done - -# Local variables: -# eval: (add-hook 'write-file-hooks 'time-stamp) -# time-stamp-start: "scriptversion=" -# time-stamp-format: "%:y-%02m-%02d.%02H" -# time-stamp-time-zone: "UTC" -# time-stamp-end: "; # UTC" -# End: diff --git a/pkg/registry/zookeeper-3.4.6/src/c/ltmain.sh b/pkg/registry/zookeeper-3.4.6/src/c/ltmain.sh deleted file mode 100755 index 0096fe6c7..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/c/ltmain.sh +++ /dev/null @@ -1,9661 +0,0 @@ - -# libtool (GNU libtool) 2.4.2 -# Written by Gordon Matzigkeit , 1996 - -# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005, 2006, -# 2007, 2008, 2009, 2010, 2011 Free Software Foundation, Inc. -# This is free software; see the source for copying conditions. There is NO -# warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. - -# GNU Libtool is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or -# (at your option) any later version. -# -# As a special exception to the GNU General Public License, -# if you distribute this file as part of a program or library that -# is built using GNU Libtool, you may include this file under the -# same distribution terms that you use for the rest of that program. -# -# GNU Libtool is distributed in the hope that it will be useful, but -# WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with GNU Libtool; see the file COPYING. If not, a copy -# can be downloaded from http://www.gnu.org/licenses/gpl.html, -# or obtained by writing to the Free Software Foundation, Inc., -# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - -# Usage: $progname [OPTION]... [MODE-ARG]... -# -# Provide generalized library-building support services. -# -# --config show all configuration variables -# --debug enable verbose shell tracing -# -n, --dry-run display commands without modifying any files -# --features display basic configuration information and exit -# --mode=MODE use operation mode MODE -# --preserve-dup-deps don't remove duplicate dependency libraries -# --quiet, --silent don't print informational messages -# --no-quiet, --no-silent -# print informational messages (default) -# --no-warn don't display warning messages -# --tag=TAG use configuration variables from tag TAG -# -v, --verbose print more informational messages than default -# --no-verbose don't print the extra informational messages -# --version print version information -# -h, --help, --help-all print short, long, or detailed help message -# -# MODE must be one of the following: -# -# clean remove files from the build directory -# compile compile a source file into a libtool object -# execute automatically set library path, then run a program -# finish complete the installation of libtool libraries -# install install libraries or executables -# link create a library or an executable -# uninstall remove libraries from an installed directory -# -# MODE-ARGS vary depending on the MODE. When passed as first option, -# `--mode=MODE' may be abbreviated as `MODE' or a unique abbreviation of that. -# Try `$progname --help --mode=MODE' for a more detailed description of MODE. -# -# When reporting a bug, please describe a test case to reproduce it and -# include the following information: -# -# host-triplet: $host -# shell: $SHELL -# compiler: $LTCC -# compiler flags: $LTCFLAGS -# linker: $LD (gnu? $with_gnu_ld) -# $progname: (GNU libtool) 2.4.2 Debian-2.4.2-1ubuntu2 -# automake: $automake_version -# autoconf: $autoconf_version -# -# Report bugs to . -# GNU libtool home page: . -# General help using GNU software: . - -PROGRAM=libtool -PACKAGE=libtool -VERSION="2.4.2 Debian-2.4.2-1ubuntu2" -TIMESTAMP="" -package_revision=1.3337 - -# Be Bourne compatible -if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then - emulate sh - NULLCMD=: - # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which - # is contrary to our usage. Disable this feature. - alias -g '${1+"$@"}'='"$@"' - setopt NO_GLOB_SUBST -else - case `(set -o) 2>/dev/null` in *posix*) set -o posix;; esac -fi -BIN_SH=xpg4; export BIN_SH # for Tru64 -DUALCASE=1; export DUALCASE # for MKS sh - -# A function that is used when there is no print builtin or printf. -func_fallback_echo () -{ - eval 'cat <<_LTECHO_EOF -$1 -_LTECHO_EOF' -} - -# NLS nuisances: We save the old values to restore during execute mode. -lt_user_locale= -lt_safe_locale= -for lt_var in LANG LANGUAGE LC_ALL LC_CTYPE LC_COLLATE LC_MESSAGES -do - eval "if test \"\${$lt_var+set}\" = set; then - save_$lt_var=\$$lt_var - $lt_var=C - export $lt_var - lt_user_locale=\"$lt_var=\\\$save_\$lt_var; \$lt_user_locale\" - lt_safe_locale=\"$lt_var=C; \$lt_safe_locale\" - fi" -done -LC_ALL=C -LANGUAGE=C -export LANGUAGE LC_ALL - -$lt_unset CDPATH - - -# Work around backward compatibility issue on IRIX 6.5. On IRIX 6.4+, sh -# is ksh but when the shell is invoked as "sh" and the current value of -# the _XPG environment variable is not equal to 1 (one), the special -# positional parameter $0, within a function call, is the name of the -# function. -progpath="$0" - - - -: ${CP="cp -f"} -test "${ECHO+set}" = set || ECHO=${as_echo-'printf %s\n'} -: ${MAKE="make"} -: ${MKDIR="mkdir"} -: ${MV="mv -f"} -: ${RM="rm -f"} -: ${SHELL="${CONFIG_SHELL-/bin/sh}"} -: ${Xsed="$SED -e 1s/^X//"} - -# Global variables: -EXIT_SUCCESS=0 -EXIT_FAILURE=1 -EXIT_MISMATCH=63 # $? = 63 is used to indicate version mismatch to missing. -EXIT_SKIP=77 # $? = 77 is used to indicate a skipped test to automake. - -exit_status=$EXIT_SUCCESS - -# Make sure IFS has a sensible default -lt_nl=' -' -IFS=" $lt_nl" - -dirname="s,/[^/]*$,," -basename="s,^.*/,," - -# func_dirname file append nondir_replacement -# Compute the dirname of FILE. If nonempty, add APPEND to the result, -# otherwise set result to NONDIR_REPLACEMENT. -func_dirname () -{ - func_dirname_result=`$ECHO "${1}" | $SED "$dirname"` - if test "X$func_dirname_result" = "X${1}"; then - func_dirname_result="${3}" - else - func_dirname_result="$func_dirname_result${2}" - fi -} # func_dirname may be replaced by extended shell implementation - - -# func_basename file -func_basename () -{ - func_basename_result=`$ECHO "${1}" | $SED "$basename"` -} # func_basename may be replaced by extended shell implementation - - -# func_dirname_and_basename file append nondir_replacement -# perform func_basename and func_dirname in a single function -# call: -# dirname: Compute the dirname of FILE. If nonempty, -# add APPEND to the result, otherwise set result -# to NONDIR_REPLACEMENT. -# value returned in "$func_dirname_result" -# basename: Compute filename of FILE. -# value retuned in "$func_basename_result" -# Implementation must be kept synchronized with func_dirname -# and func_basename. For efficiency, we do not delegate to -# those functions but instead duplicate the functionality here. -func_dirname_and_basename () -{ - # Extract subdirectory from the argument. - func_dirname_result=`$ECHO "${1}" | $SED -e "$dirname"` - if test "X$func_dirname_result" = "X${1}"; then - func_dirname_result="${3}" - else - func_dirname_result="$func_dirname_result${2}" - fi - func_basename_result=`$ECHO "${1}" | $SED -e "$basename"` -} # func_dirname_and_basename may be replaced by extended shell implementation - - -# func_stripname prefix suffix name -# strip PREFIX and SUFFIX off of NAME. -# PREFIX and SUFFIX must not contain globbing or regex special -# characters, hashes, percent signs, but SUFFIX may contain a leading -# dot (in which case that matches only a dot). -# func_strip_suffix prefix name -func_stripname () -{ - case ${2} in - .*) func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%\\\\${2}\$%%"`;; - *) func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%${2}\$%%"`;; - esac -} # func_stripname may be replaced by extended shell implementation - - -# These SED scripts presuppose an absolute path with a trailing slash. -pathcar='s,^/\([^/]*\).*$,\1,' -pathcdr='s,^/[^/]*,,' -removedotparts=':dotsl - s@/\./@/@g - t dotsl - s,/\.$,/,' -collapseslashes='s@/\{1,\}@/@g' -finalslash='s,/*$,/,' - -# func_normal_abspath PATH -# Remove doubled-up and trailing slashes, "." path components, -# and cancel out any ".." path components in PATH after making -# it an absolute path. -# value returned in "$func_normal_abspath_result" -func_normal_abspath () -{ - # Start from root dir and reassemble the path. - func_normal_abspath_result= - func_normal_abspath_tpath=$1 - func_normal_abspath_altnamespace= - case $func_normal_abspath_tpath in - "") - # Empty path, that just means $cwd. - func_stripname '' '/' "`pwd`" - func_normal_abspath_result=$func_stripname_result - return - ;; - # The next three entries are used to spot a run of precisely - # two leading slashes without using negated character classes; - # we take advantage of case's first-match behaviour. - ///*) - # Unusual form of absolute path, do nothing. - ;; - //*) - # Not necessarily an ordinary path; POSIX reserves leading '//' - # and for example Cygwin uses it to access remote file shares - # over CIFS/SMB, so we conserve a leading double slash if found. - func_normal_abspath_altnamespace=/ - ;; - /*) - # Absolute path, do nothing. - ;; - *) - # Relative path, prepend $cwd. - func_normal_abspath_tpath=`pwd`/$func_normal_abspath_tpath - ;; - esac - # Cancel out all the simple stuff to save iterations. We also want - # the path to end with a slash for ease of parsing, so make sure - # there is one (and only one) here. - func_normal_abspath_tpath=`$ECHO "$func_normal_abspath_tpath" | $SED \ - -e "$removedotparts" -e "$collapseslashes" -e "$finalslash"` - while :; do - # Processed it all yet? - if test "$func_normal_abspath_tpath" = / ; then - # If we ascended to the root using ".." the result may be empty now. - if test -z "$func_normal_abspath_result" ; then - func_normal_abspath_result=/ - fi - break - fi - func_normal_abspath_tcomponent=`$ECHO "$func_normal_abspath_tpath" | $SED \ - -e "$pathcar"` - func_normal_abspath_tpath=`$ECHO "$func_normal_abspath_tpath" | $SED \ - -e "$pathcdr"` - # Figure out what to do with it - case $func_normal_abspath_tcomponent in - "") - # Trailing empty path component, ignore it. - ;; - ..) - # Parent dir; strip last assembled component from result. - func_dirname "$func_normal_abspath_result" - func_normal_abspath_result=$func_dirname_result - ;; - *) - # Actual path component, append it. - func_normal_abspath_result=$func_normal_abspath_result/$func_normal_abspath_tcomponent - ;; - esac - done - # Restore leading double-slash if one was found on entry. - func_normal_abspath_result=$func_normal_abspath_altnamespace$func_normal_abspath_result -} - -# func_relative_path SRCDIR DSTDIR -# generates a relative path from SRCDIR to DSTDIR, with a trailing -# slash if non-empty, suitable for immediately appending a filename -# without needing to append a separator. -# value returned in "$func_relative_path_result" -func_relative_path () -{ - func_relative_path_result= - func_normal_abspath "$1" - func_relative_path_tlibdir=$func_normal_abspath_result - func_normal_abspath "$2" - func_relative_path_tbindir=$func_normal_abspath_result - - # Ascend the tree starting from libdir - while :; do - # check if we have found a prefix of bindir - case $func_relative_path_tbindir in - $func_relative_path_tlibdir) - # found an exact match - func_relative_path_tcancelled= - break - ;; - $func_relative_path_tlibdir*) - # found a matching prefix - func_stripname "$func_relative_path_tlibdir" '' "$func_relative_path_tbindir" - func_relative_path_tcancelled=$func_stripname_result - if test -z "$func_relative_path_result"; then - func_relative_path_result=. - fi - break - ;; - *) - func_dirname $func_relative_path_tlibdir - func_relative_path_tlibdir=${func_dirname_result} - if test "x$func_relative_path_tlibdir" = x ; then - # Have to descend all the way to the root! - func_relative_path_result=../$func_relative_path_result - func_relative_path_tcancelled=$func_relative_path_tbindir - break - fi - func_relative_path_result=../$func_relative_path_result - ;; - esac - done - - # Now calculate path; take care to avoid doubling-up slashes. - func_stripname '' '/' "$func_relative_path_result" - func_relative_path_result=$func_stripname_result - func_stripname '/' '/' "$func_relative_path_tcancelled" - if test "x$func_stripname_result" != x ; then - func_relative_path_result=${func_relative_path_result}/${func_stripname_result} - fi - - # Normalisation. If bindir is libdir, return empty string, - # else relative path ending with a slash; either way, target - # file name can be directly appended. - if test ! -z "$func_relative_path_result"; then - func_stripname './' '' "$func_relative_path_result/" - func_relative_path_result=$func_stripname_result - fi -} - -# The name of this program: -func_dirname_and_basename "$progpath" -progname=$func_basename_result - -# Make sure we have an absolute path for reexecution: -case $progpath in - [\\/]*|[A-Za-z]:\\*) ;; - *[\\/]*) - progdir=$func_dirname_result - progdir=`cd "$progdir" && pwd` - progpath="$progdir/$progname" - ;; - *) - save_IFS="$IFS" - IFS=${PATH_SEPARATOR-:} - for progdir in $PATH; do - IFS="$save_IFS" - test -x "$progdir/$progname" && break - done - IFS="$save_IFS" - test -n "$progdir" || progdir=`pwd` - progpath="$progdir/$progname" - ;; -esac - -# Sed substitution that helps us do robust quoting. It backslashifies -# metacharacters that are still active within double-quoted strings. -Xsed="${SED}"' -e 1s/^X//' -sed_quote_subst='s/\([`"$\\]\)/\\\1/g' - -# Same as above, but do not quote variable references. -double_quote_subst='s/\(["`\\]\)/\\\1/g' - -# Sed substitution that turns a string into a regex matching for the -# string literally. -sed_make_literal_regex='s,[].[^$\\*\/],\\&,g' - -# Sed substitution that converts a w32 file name or path -# which contains forward slashes, into one that contains -# (escaped) backslashes. A very naive implementation. -lt_sed_naive_backslashify='s|\\\\*|\\|g;s|/|\\|g;s|\\|\\\\|g' - -# Re-`\' parameter expansions in output of double_quote_subst that were -# `\'-ed in input to the same. If an odd number of `\' preceded a '$' -# in input to double_quote_subst, that '$' was protected from expansion. -# Since each input `\' is now two `\'s, look for any number of runs of -# four `\'s followed by two `\'s and then a '$'. `\' that '$'. -bs='\\' -bs2='\\\\' -bs4='\\\\\\\\' -dollar='\$' -sed_double_backslash="\ - s/$bs4/&\\ -/g - s/^$bs2$dollar/$bs&/ - s/\\([^$bs]\\)$bs2$dollar/\\1$bs2$bs$dollar/g - s/\n//g" - -# Standard options: -opt_dry_run=false -opt_help=false -opt_quiet=false -opt_verbose=false -opt_warning=: - -# func_echo arg... -# Echo program name prefixed message, along with the current mode -# name if it has been set yet. -func_echo () -{ - $ECHO "$progname: ${opt_mode+$opt_mode: }$*" -} - -# func_verbose arg... -# Echo program name prefixed message in verbose mode only. -func_verbose () -{ - $opt_verbose && func_echo ${1+"$@"} - - # A bug in bash halts the script if the last line of a function - # fails when set -e is in force, so we need another command to - # work around that: - : -} - -# func_echo_all arg... -# Invoke $ECHO with all args, space-separated. -func_echo_all () -{ - $ECHO "$*" -} - -# func_error arg... -# Echo program name prefixed message to standard error. -func_error () -{ - $ECHO "$progname: ${opt_mode+$opt_mode: }"${1+"$@"} 1>&2 -} - -# func_warning arg... -# Echo program name prefixed warning message to standard error. -func_warning () -{ - $opt_warning && $ECHO "$progname: ${opt_mode+$opt_mode: }warning: "${1+"$@"} 1>&2 - - # bash bug again: - : -} - -# func_fatal_error arg... -# Echo program name prefixed message to standard error, and exit. -func_fatal_error () -{ - func_error ${1+"$@"} - exit $EXIT_FAILURE -} - -# func_fatal_help arg... -# Echo program name prefixed message to standard error, followed by -# a help hint, and exit. -func_fatal_help () -{ - func_error ${1+"$@"} - func_fatal_error "$help" -} -help="Try \`$progname --help' for more information." ## default - - -# func_grep expression filename -# Check whether EXPRESSION matches any line of FILENAME, without output. -func_grep () -{ - $GREP "$1" "$2" >/dev/null 2>&1 -} - - -# func_mkdir_p directory-path -# Make sure the entire path to DIRECTORY-PATH is available. -func_mkdir_p () -{ - my_directory_path="$1" - my_dir_list= - - if test -n "$my_directory_path" && test "$opt_dry_run" != ":"; then - - # Protect directory names starting with `-' - case $my_directory_path in - -*) my_directory_path="./$my_directory_path" ;; - esac - - # While some portion of DIR does not yet exist... - while test ! -d "$my_directory_path"; do - # ...make a list in topmost first order. Use a colon delimited - # list incase some portion of path contains whitespace. - my_dir_list="$my_directory_path:$my_dir_list" - - # If the last portion added has no slash in it, the list is done - case $my_directory_path in */*) ;; *) break ;; esac - - # ...otherwise throw away the child directory and loop - my_directory_path=`$ECHO "$my_directory_path" | $SED -e "$dirname"` - done - my_dir_list=`$ECHO "$my_dir_list" | $SED 's,:*$,,'` - - save_mkdir_p_IFS="$IFS"; IFS=':' - for my_dir in $my_dir_list; do - IFS="$save_mkdir_p_IFS" - # mkdir can fail with a `File exist' error if two processes - # try to create one of the directories concurrently. Don't - # stop in that case! - $MKDIR "$my_dir" 2>/dev/null || : - done - IFS="$save_mkdir_p_IFS" - - # Bail out if we (or some other process) failed to create a directory. - test -d "$my_directory_path" || \ - func_fatal_error "Failed to create \`$1'" - fi -} - - -# func_mktempdir [string] -# Make a temporary directory that won't clash with other running -# libtool processes, and avoids race conditions if possible. If -# given, STRING is the basename for that directory. -func_mktempdir () -{ - my_template="${TMPDIR-/tmp}/${1-$progname}" - - if test "$opt_dry_run" = ":"; then - # Return a directory name, but don't create it in dry-run mode - my_tmpdir="${my_template}-$$" - else - - # If mktemp works, use that first and foremost - my_tmpdir=`mktemp -d "${my_template}-XXXXXXXX" 2>/dev/null` - - if test ! -d "$my_tmpdir"; then - # Failing that, at least try and use $RANDOM to avoid a race - my_tmpdir="${my_template}-${RANDOM-0}$$" - - save_mktempdir_umask=`umask` - umask 0077 - $MKDIR "$my_tmpdir" - umask $save_mktempdir_umask - fi - - # If we're not in dry-run mode, bomb out on failure - test -d "$my_tmpdir" || \ - func_fatal_error "cannot create temporary directory \`$my_tmpdir'" - fi - - $ECHO "$my_tmpdir" -} - - -# func_quote_for_eval arg -# Aesthetically quote ARG to be evaled later. -# This function returns two values: FUNC_QUOTE_FOR_EVAL_RESULT -# is double-quoted, suitable for a subsequent eval, whereas -# FUNC_QUOTE_FOR_EVAL_UNQUOTED_RESULT has merely all characters -# which are still active within double quotes backslashified. -func_quote_for_eval () -{ - case $1 in - *[\\\`\"\$]*) - func_quote_for_eval_unquoted_result=`$ECHO "$1" | $SED "$sed_quote_subst"` ;; - *) - func_quote_for_eval_unquoted_result="$1" ;; - esac - - case $func_quote_for_eval_unquoted_result in - # Double-quote args containing shell metacharacters to delay - # word splitting, command substitution and and variable - # expansion for a subsequent eval. - # Many Bourne shells cannot handle close brackets correctly - # in scan sets, so we specify it separately. - *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") - func_quote_for_eval_result="\"$func_quote_for_eval_unquoted_result\"" - ;; - *) - func_quote_for_eval_result="$func_quote_for_eval_unquoted_result" - esac -} - - -# func_quote_for_expand arg -# Aesthetically quote ARG to be evaled later; same as above, -# but do not quote variable references. -func_quote_for_expand () -{ - case $1 in - *[\\\`\"]*) - my_arg=`$ECHO "$1" | $SED \ - -e "$double_quote_subst" -e "$sed_double_backslash"` ;; - *) - my_arg="$1" ;; - esac - - case $my_arg in - # Double-quote args containing shell metacharacters to delay - # word splitting and command substitution for a subsequent eval. - # Many Bourne shells cannot handle close brackets correctly - # in scan sets, so we specify it separately. - *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") - my_arg="\"$my_arg\"" - ;; - esac - - func_quote_for_expand_result="$my_arg" -} - - -# func_show_eval cmd [fail_exp] -# Unless opt_silent is true, then output CMD. Then, if opt_dryrun is -# not true, evaluate CMD. If the evaluation of CMD fails, and FAIL_EXP -# is given, then evaluate it. -func_show_eval () -{ - my_cmd="$1" - my_fail_exp="${2-:}" - - ${opt_silent-false} || { - func_quote_for_expand "$my_cmd" - eval "func_echo $func_quote_for_expand_result" - } - - if ${opt_dry_run-false}; then :; else - eval "$my_cmd" - my_status=$? - if test "$my_status" -eq 0; then :; else - eval "(exit $my_status); $my_fail_exp" - fi - fi -} - - -# func_show_eval_locale cmd [fail_exp] -# Unless opt_silent is true, then output CMD. Then, if opt_dryrun is -# not true, evaluate CMD. If the evaluation of CMD fails, and FAIL_EXP -# is given, then evaluate it. Use the saved locale for evaluation. -func_show_eval_locale () -{ - my_cmd="$1" - my_fail_exp="${2-:}" - - ${opt_silent-false} || { - func_quote_for_expand "$my_cmd" - eval "func_echo $func_quote_for_expand_result" - } - - if ${opt_dry_run-false}; then :; else - eval "$lt_user_locale - $my_cmd" - my_status=$? - eval "$lt_safe_locale" - if test "$my_status" -eq 0; then :; else - eval "(exit $my_status); $my_fail_exp" - fi - fi -} - -# func_tr_sh -# Turn $1 into a string suitable for a shell variable name. -# Result is stored in $func_tr_sh_result. All characters -# not in the set a-zA-Z0-9_ are replaced with '_'. Further, -# if $1 begins with a digit, a '_' is prepended as well. -func_tr_sh () -{ - case $1 in - [0-9]* | *[!a-zA-Z0-9_]*) - func_tr_sh_result=`$ECHO "$1" | $SED 's/^\([0-9]\)/_\1/; s/[^a-zA-Z0-9_]/_/g'` - ;; - * ) - func_tr_sh_result=$1 - ;; - esac -} - - -# func_version -# Echo version message to standard output and exit. -func_version () -{ - $opt_debug - - $SED -n '/(C)/!b go - :more - /\./!{ - N - s/\n# / / - b more - } - :go - /^# '$PROGRAM' (GNU /,/# warranty; / { - s/^# // - s/^# *$// - s/\((C)\)[ 0-9,-]*\( [1-9][0-9]*\)/\1\2/ - p - }' < "$progpath" - exit $? -} - -# func_usage -# Echo short help message to standard output and exit. -func_usage () -{ - $opt_debug - - $SED -n '/^# Usage:/,/^# *.*--help/ { - s/^# // - s/^# *$// - s/\$progname/'$progname'/ - p - }' < "$progpath" - echo - $ECHO "run \`$progname --help | more' for full usage" - exit $? -} - -# func_help [NOEXIT] -# Echo long help message to standard output and exit, -# unless 'noexit' is passed as argument. -func_help () -{ - $opt_debug - - $SED -n '/^# Usage:/,/# Report bugs to/ { - :print - s/^# // - s/^# *$// - s*\$progname*'$progname'* - s*\$host*'"$host"'* - s*\$SHELL*'"$SHELL"'* - s*\$LTCC*'"$LTCC"'* - s*\$LTCFLAGS*'"$LTCFLAGS"'* - s*\$LD*'"$LD"'* - s/\$with_gnu_ld/'"$with_gnu_ld"'/ - s/\$automake_version/'"`(${AUTOMAKE-automake} --version) 2>/dev/null |$SED 1q`"'/ - s/\$autoconf_version/'"`(${AUTOCONF-autoconf} --version) 2>/dev/null |$SED 1q`"'/ - p - d - } - /^# .* home page:/b print - /^# General help using/b print - ' < "$progpath" - ret=$? - if test -z "$1"; then - exit $ret - fi -} - -# func_missing_arg argname -# Echo program name prefixed message to standard error and set global -# exit_cmd. -func_missing_arg () -{ - $opt_debug - - func_error "missing argument for $1." - exit_cmd=exit -} - - -# func_split_short_opt shortopt -# Set func_split_short_opt_name and func_split_short_opt_arg shell -# variables after splitting SHORTOPT after the 2nd character. -func_split_short_opt () -{ - my_sed_short_opt='1s/^\(..\).*$/\1/;q' - my_sed_short_rest='1s/^..\(.*\)$/\1/;q' - - func_split_short_opt_name=`$ECHO "$1" | $SED "$my_sed_short_opt"` - func_split_short_opt_arg=`$ECHO "$1" | $SED "$my_sed_short_rest"` -} # func_split_short_opt may be replaced by extended shell implementation - - -# func_split_long_opt longopt -# Set func_split_long_opt_name and func_split_long_opt_arg shell -# variables after splitting LONGOPT at the `=' sign. -func_split_long_opt () -{ - my_sed_long_opt='1s/^\(--[^=]*\)=.*/\1/;q' - my_sed_long_arg='1s/^--[^=]*=//' - - func_split_long_opt_name=`$ECHO "$1" | $SED "$my_sed_long_opt"` - func_split_long_opt_arg=`$ECHO "$1" | $SED "$my_sed_long_arg"` -} # func_split_long_opt may be replaced by extended shell implementation - -exit_cmd=: - - - - - -magic="%%%MAGIC variable%%%" -magic_exe="%%%MAGIC EXE variable%%%" - -# Global variables. -nonopt= -preserve_args= -lo2o="s/\\.lo\$/.${objext}/" -o2lo="s/\\.${objext}\$/.lo/" -extracted_archives= -extracted_serial=0 - -# If this variable is set in any of the actions, the command in it -# will be execed at the end. This prevents here-documents from being -# left over by shells. -exec_cmd= - -# func_append var value -# Append VALUE to the end of shell variable VAR. -func_append () -{ - eval "${1}=\$${1}\${2}" -} # func_append may be replaced by extended shell implementation - -# func_append_quoted var value -# Quote VALUE and append to the end of shell variable VAR, separated -# by a space. -func_append_quoted () -{ - func_quote_for_eval "${2}" - eval "${1}=\$${1}\\ \$func_quote_for_eval_result" -} # func_append_quoted may be replaced by extended shell implementation - - -# func_arith arithmetic-term... -func_arith () -{ - func_arith_result=`expr "${@}"` -} # func_arith may be replaced by extended shell implementation - - -# func_len string -# STRING may not start with a hyphen. -func_len () -{ - func_len_result=`expr "${1}" : ".*" 2>/dev/null || echo $max_cmd_len` -} # func_len may be replaced by extended shell implementation - - -# func_lo2o object -func_lo2o () -{ - func_lo2o_result=`$ECHO "${1}" | $SED "$lo2o"` -} # func_lo2o may be replaced by extended shell implementation - - -# func_xform libobj-or-source -func_xform () -{ - func_xform_result=`$ECHO "${1}" | $SED 's/\.[^.]*$/.lo/'` -} # func_xform may be replaced by extended shell implementation - - -# func_fatal_configuration arg... -# Echo program name prefixed message to standard error, followed by -# a configuration failure hint, and exit. -func_fatal_configuration () -{ - func_error ${1+"$@"} - func_error "See the $PACKAGE documentation for more information." - func_fatal_error "Fatal configuration error." -} - - -# func_config -# Display the configuration for all the tags in this script. -func_config () -{ - re_begincf='^# ### BEGIN LIBTOOL' - re_endcf='^# ### END LIBTOOL' - - # Default configuration. - $SED "1,/$re_begincf CONFIG/d;/$re_endcf CONFIG/,\$d" < "$progpath" - - # Now print the configurations for the tags. - for tagname in $taglist; do - $SED -n "/$re_begincf TAG CONFIG: $tagname\$/,/$re_endcf TAG CONFIG: $tagname\$/p" < "$progpath" - done - - exit $? -} - -# func_features -# Display the features supported by this script. -func_features () -{ - echo "host: $host" - if test "$build_libtool_libs" = yes; then - echo "enable shared libraries" - else - echo "disable shared libraries" - fi - if test "$build_old_libs" = yes; then - echo "enable static libraries" - else - echo "disable static libraries" - fi - - exit $? -} - -# func_enable_tag tagname -# Verify that TAGNAME is valid, and either flag an error and exit, or -# enable the TAGNAME tag. We also add TAGNAME to the global $taglist -# variable here. -func_enable_tag () -{ - # Global variable: - tagname="$1" - - re_begincf="^# ### BEGIN LIBTOOL TAG CONFIG: $tagname\$" - re_endcf="^# ### END LIBTOOL TAG CONFIG: $tagname\$" - sed_extractcf="/$re_begincf/,/$re_endcf/p" - - # Validate tagname. - case $tagname in - *[!-_A-Za-z0-9,/]*) - func_fatal_error "invalid tag name: $tagname" - ;; - esac - - # Don't test for the "default" C tag, as we know it's - # there but not specially marked. - case $tagname in - CC) ;; - *) - if $GREP "$re_begincf" "$progpath" >/dev/null 2>&1; then - taglist="$taglist $tagname" - - # Evaluate the configuration. Be careful to quote the path - # and the sed script, to avoid splitting on whitespace, but - # also don't use non-portable quotes within backquotes within - # quotes we have to do it in 2 steps: - extractedcf=`$SED -n -e "$sed_extractcf" < "$progpath"` - eval "$extractedcf" - else - func_error "ignoring unknown tag $tagname" - fi - ;; - esac -} - -# func_check_version_match -# Ensure that we are using m4 macros, and libtool script from the same -# release of libtool. -func_check_version_match () -{ - if test "$package_revision" != "$macro_revision"; then - if test "$VERSION" != "$macro_version"; then - if test -z "$macro_version"; then - cat >&2 <<_LT_EOF -$progname: Version mismatch error. This is $PACKAGE $VERSION, but the -$progname: definition of this LT_INIT comes from an older release. -$progname: You should recreate aclocal.m4 with macros from $PACKAGE $VERSION -$progname: and run autoconf again. -_LT_EOF - else - cat >&2 <<_LT_EOF -$progname: Version mismatch error. This is $PACKAGE $VERSION, but the -$progname: definition of this LT_INIT comes from $PACKAGE $macro_version. -$progname: You should recreate aclocal.m4 with macros from $PACKAGE $VERSION -$progname: and run autoconf again. -_LT_EOF - fi - else - cat >&2 <<_LT_EOF -$progname: Version mismatch error. This is $PACKAGE $VERSION, revision $package_revision, -$progname: but the definition of this LT_INIT comes from revision $macro_revision. -$progname: You should recreate aclocal.m4 with macros from revision $package_revision -$progname: of $PACKAGE $VERSION and run autoconf again. -_LT_EOF - fi - - exit $EXIT_MISMATCH - fi -} - - -# Shorthand for --mode=foo, only valid as the first argument -case $1 in -clean|clea|cle|cl) - shift; set dummy --mode clean ${1+"$@"}; shift - ;; -compile|compil|compi|comp|com|co|c) - shift; set dummy --mode compile ${1+"$@"}; shift - ;; -execute|execut|execu|exec|exe|ex|e) - shift; set dummy --mode execute ${1+"$@"}; shift - ;; -finish|finis|fini|fin|fi|f) - shift; set dummy --mode finish ${1+"$@"}; shift - ;; -install|instal|insta|inst|ins|in|i) - shift; set dummy --mode install ${1+"$@"}; shift - ;; -link|lin|li|l) - shift; set dummy --mode link ${1+"$@"}; shift - ;; -uninstall|uninstal|uninsta|uninst|unins|unin|uni|un|u) - shift; set dummy --mode uninstall ${1+"$@"}; shift - ;; -esac - - - -# Option defaults: -opt_debug=: -opt_dry_run=false -opt_config=false -opt_preserve_dup_deps=false -opt_features=false -opt_finish=false -opt_help=false -opt_help_all=false -opt_silent=: -opt_warning=: -opt_verbose=: -opt_silent=false -opt_verbose=false - - -# Parse options once, thoroughly. This comes as soon as possible in the -# script to make things like `--version' happen as quickly as we can. -{ - # this just eases exit handling - while test $# -gt 0; do - opt="$1" - shift - case $opt in - --debug|-x) opt_debug='set -x' - func_echo "enabling shell trace mode" - $opt_debug - ;; - --dry-run|--dryrun|-n) - opt_dry_run=: - ;; - --config) - opt_config=: -func_config - ;; - --dlopen|-dlopen) - optarg="$1" - opt_dlopen="${opt_dlopen+$opt_dlopen -}$optarg" - shift - ;; - --preserve-dup-deps) - opt_preserve_dup_deps=: - ;; - --features) - opt_features=: -func_features - ;; - --finish) - opt_finish=: -set dummy --mode finish ${1+"$@"}; shift - ;; - --help) - opt_help=: - ;; - --help-all) - opt_help_all=: -opt_help=': help-all' - ;; - --mode) - test $# = 0 && func_missing_arg $opt && break - optarg="$1" - opt_mode="$optarg" -case $optarg in - # Valid mode arguments: - clean|compile|execute|finish|install|link|relink|uninstall) ;; - - # Catch anything else as an error - *) func_error "invalid argument for $opt" - exit_cmd=exit - break - ;; -esac - shift - ;; - --no-silent|--no-quiet) - opt_silent=false -func_append preserve_args " $opt" - ;; - --no-warning|--no-warn) - opt_warning=false -func_append preserve_args " $opt" - ;; - --no-verbose) - opt_verbose=false -func_append preserve_args " $opt" - ;; - --silent|--quiet) - opt_silent=: -func_append preserve_args " $opt" - opt_verbose=false - ;; - --verbose|-v) - opt_verbose=: -func_append preserve_args " $opt" -opt_silent=false - ;; - --tag) - test $# = 0 && func_missing_arg $opt && break - optarg="$1" - opt_tag="$optarg" -func_append preserve_args " $opt $optarg" -func_enable_tag "$optarg" - shift - ;; - - -\?|-h) func_usage ;; - --help) func_help ;; - --version) func_version ;; - - # Separate optargs to long options: - --*=*) - func_split_long_opt "$opt" - set dummy "$func_split_long_opt_name" "$func_split_long_opt_arg" ${1+"$@"} - shift - ;; - - # Separate non-argument short options: - -\?*|-h*|-n*|-v*) - func_split_short_opt "$opt" - set dummy "$func_split_short_opt_name" "-$func_split_short_opt_arg" ${1+"$@"} - shift - ;; - - --) break ;; - -*) func_fatal_help "unrecognized option \`$opt'" ;; - *) set dummy "$opt" ${1+"$@"}; shift; break ;; - esac - done - - # Validate options: - - # save first non-option argument - if test "$#" -gt 0; then - nonopt="$opt" - shift - fi - - # preserve --debug - test "$opt_debug" = : || func_append preserve_args " --debug" - - case $host in - *cygwin* | *mingw* | *pw32* | *cegcc*) - # don't eliminate duplications in $postdeps and $predeps - opt_duplicate_compiler_generated_deps=: - ;; - *) - opt_duplicate_compiler_generated_deps=$opt_preserve_dup_deps - ;; - esac - - $opt_help || { - # Sanity checks first: - func_check_version_match - - if test "$build_libtool_libs" != yes && test "$build_old_libs" != yes; then - func_fatal_configuration "not configured to build any kind of library" - fi - - # Darwin sucks - eval std_shrext=\"$shrext_cmds\" - - # Only execute mode is allowed to have -dlopen flags. - if test -n "$opt_dlopen" && test "$opt_mode" != execute; then - func_error "unrecognized option \`-dlopen'" - $ECHO "$help" 1>&2 - exit $EXIT_FAILURE - fi - - # Change the help message to a mode-specific one. - generic_help="$help" - help="Try \`$progname --help --mode=$opt_mode' for more information." - } - - - # Bail if the options were screwed - $exit_cmd $EXIT_FAILURE -} - - - - -## ----------- ## -## Main. ## -## ----------- ## - -# func_lalib_p file -# True iff FILE is a libtool `.la' library or `.lo' object file. -# This function is only a basic sanity check; it will hardly flush out -# determined imposters. -func_lalib_p () -{ - test -f "$1" && - $SED -e 4q "$1" 2>/dev/null \ - | $GREP "^# Generated by .*$PACKAGE" > /dev/null 2>&1 -} - -# func_lalib_unsafe_p file -# True iff FILE is a libtool `.la' library or `.lo' object file. -# This function implements the same check as func_lalib_p without -# resorting to external programs. To this end, it redirects stdin and -# closes it afterwards, without saving the original file descriptor. -# As a safety measure, use it only where a negative result would be -# fatal anyway. Works if `file' does not exist. -func_lalib_unsafe_p () -{ - lalib_p=no - if test -f "$1" && test -r "$1" && exec 5<&0 <"$1"; then - for lalib_p_l in 1 2 3 4 - do - read lalib_p_line - case "$lalib_p_line" in - \#\ Generated\ by\ *$PACKAGE* ) lalib_p=yes; break;; - esac - done - exec 0<&5 5<&- - fi - test "$lalib_p" = yes -} - -# func_ltwrapper_script_p file -# True iff FILE is a libtool wrapper script -# This function is only a basic sanity check; it will hardly flush out -# determined imposters. -func_ltwrapper_script_p () -{ - func_lalib_p "$1" -} - -# func_ltwrapper_executable_p file -# True iff FILE is a libtool wrapper executable -# This function is only a basic sanity check; it will hardly flush out -# determined imposters. -func_ltwrapper_executable_p () -{ - func_ltwrapper_exec_suffix= - case $1 in - *.exe) ;; - *) func_ltwrapper_exec_suffix=.exe ;; - esac - $GREP "$magic_exe" "$1$func_ltwrapper_exec_suffix" >/dev/null 2>&1 -} - -# func_ltwrapper_scriptname file -# Assumes file is an ltwrapper_executable -# uses $file to determine the appropriate filename for a -# temporary ltwrapper_script. -func_ltwrapper_scriptname () -{ - func_dirname_and_basename "$1" "" "." - func_stripname '' '.exe' "$func_basename_result" - func_ltwrapper_scriptname_result="$func_dirname_result/$objdir/${func_stripname_result}_ltshwrapper" -} - -# func_ltwrapper_p file -# True iff FILE is a libtool wrapper script or wrapper executable -# This function is only a basic sanity check; it will hardly flush out -# determined imposters. -func_ltwrapper_p () -{ - func_ltwrapper_script_p "$1" || func_ltwrapper_executable_p "$1" -} - - -# func_execute_cmds commands fail_cmd -# Execute tilde-delimited COMMANDS. -# If FAIL_CMD is given, eval that upon failure. -# FAIL_CMD may read-access the current command in variable CMD! -func_execute_cmds () -{ - $opt_debug - save_ifs=$IFS; IFS='~' - for cmd in $1; do - IFS=$save_ifs - eval cmd=\"$cmd\" - func_show_eval "$cmd" "${2-:}" - done - IFS=$save_ifs -} - - -# func_source file -# Source FILE, adding directory component if necessary. -# Note that it is not necessary on cygwin/mingw to append a dot to -# FILE even if both FILE and FILE.exe exist: automatic-append-.exe -# behavior happens only for exec(3), not for open(2)! Also, sourcing -# `FILE.' does not work on cygwin managed mounts. -func_source () -{ - $opt_debug - case $1 in - */* | *\\*) . "$1" ;; - *) . "./$1" ;; - esac -} - - -# func_resolve_sysroot PATH -# Replace a leading = in PATH with a sysroot. Store the result into -# func_resolve_sysroot_result -func_resolve_sysroot () -{ - func_resolve_sysroot_result=$1 - case $func_resolve_sysroot_result in - =*) - func_stripname '=' '' "$func_resolve_sysroot_result" - func_resolve_sysroot_result=$lt_sysroot$func_stripname_result - ;; - esac -} - -# func_replace_sysroot PATH -# If PATH begins with the sysroot, replace it with = and -# store the result into func_replace_sysroot_result. -func_replace_sysroot () -{ - case "$lt_sysroot:$1" in - ?*:"$lt_sysroot"*) - func_stripname "$lt_sysroot" '' "$1" - func_replace_sysroot_result="=$func_stripname_result" - ;; - *) - # Including no sysroot. - func_replace_sysroot_result=$1 - ;; - esac -} - -# func_infer_tag arg -# Infer tagged configuration to use if any are available and -# if one wasn't chosen via the "--tag" command line option. -# Only attempt this if the compiler in the base compile -# command doesn't match the default compiler. -# arg is usually of the form 'gcc ...' -func_infer_tag () -{ - $opt_debug - if test -n "$available_tags" && test -z "$tagname"; then - CC_quoted= - for arg in $CC; do - func_append_quoted CC_quoted "$arg" - done - CC_expanded=`func_echo_all $CC` - CC_quoted_expanded=`func_echo_all $CC_quoted` - case $@ in - # Blanks in the command may have been stripped by the calling shell, - # but not from the CC environment variable when configure was run. - " $CC "* | "$CC "* | " $CC_expanded "* | "$CC_expanded "* | \ - " $CC_quoted"* | "$CC_quoted "* | " $CC_quoted_expanded "* | "$CC_quoted_expanded "*) ;; - # Blanks at the start of $base_compile will cause this to fail - # if we don't check for them as well. - *) - for z in $available_tags; do - if $GREP "^# ### BEGIN LIBTOOL TAG CONFIG: $z$" < "$progpath" > /dev/null; then - # Evaluate the configuration. - eval "`${SED} -n -e '/^# ### BEGIN LIBTOOL TAG CONFIG: '$z'$/,/^# ### END LIBTOOL TAG CONFIG: '$z'$/p' < $progpath`" - CC_quoted= - for arg in $CC; do - # Double-quote args containing other shell metacharacters. - func_append_quoted CC_quoted "$arg" - done - CC_expanded=`func_echo_all $CC` - CC_quoted_expanded=`func_echo_all $CC_quoted` - case "$@ " in - " $CC "* | "$CC "* | " $CC_expanded "* | "$CC_expanded "* | \ - " $CC_quoted"* | "$CC_quoted "* | " $CC_quoted_expanded "* | "$CC_quoted_expanded "*) - # The compiler in the base compile command matches - # the one in the tagged configuration. - # Assume this is the tagged configuration we want. - tagname=$z - break - ;; - esac - fi - done - # If $tagname still isn't set, then no tagged configuration - # was found and let the user know that the "--tag" command - # line option must be used. - if test -z "$tagname"; then - func_echo "unable to infer tagged configuration" - func_fatal_error "specify a tag with \`--tag'" -# else -# func_verbose "using $tagname tagged configuration" - fi - ;; - esac - fi -} - - - -# func_write_libtool_object output_name pic_name nonpic_name -# Create a libtool object file (analogous to a ".la" file), -# but don't create it if we're doing a dry run. -func_write_libtool_object () -{ - write_libobj=${1} - if test "$build_libtool_libs" = yes; then - write_lobj=\'${2}\' - else - write_lobj=none - fi - - if test "$build_old_libs" = yes; then - write_oldobj=\'${3}\' - else - write_oldobj=none - fi - - $opt_dry_run || { - cat >${write_libobj}T </dev/null` - if test "$?" -eq 0 && test -n "${func_convert_core_file_wine_to_w32_tmp}"; then - func_convert_core_file_wine_to_w32_result=`$ECHO "$func_convert_core_file_wine_to_w32_tmp" | - $SED -e "$lt_sed_naive_backslashify"` - else - func_convert_core_file_wine_to_w32_result= - fi - fi -} -# end: func_convert_core_file_wine_to_w32 - - -# func_convert_core_path_wine_to_w32 ARG -# Helper function used by path conversion functions when $build is *nix, and -# $host is mingw, cygwin, or some other w32 environment. Relies on a correctly -# configured wine environment available, with the winepath program in $build's -# $PATH. Assumes ARG has no leading or trailing path separator characters. -# -# ARG is path to be converted from $build format to win32. -# Result is available in $func_convert_core_path_wine_to_w32_result. -# Unconvertible file (directory) names in ARG are skipped; if no directory names -# are convertible, then the result may be empty. -func_convert_core_path_wine_to_w32 () -{ - $opt_debug - # unfortunately, winepath doesn't convert paths, only file names - func_convert_core_path_wine_to_w32_result="" - if test -n "$1"; then - oldIFS=$IFS - IFS=: - for func_convert_core_path_wine_to_w32_f in $1; do - IFS=$oldIFS - func_convert_core_file_wine_to_w32 "$func_convert_core_path_wine_to_w32_f" - if test -n "$func_convert_core_file_wine_to_w32_result" ; then - if test -z "$func_convert_core_path_wine_to_w32_result"; then - func_convert_core_path_wine_to_w32_result="$func_convert_core_file_wine_to_w32_result" - else - func_append func_convert_core_path_wine_to_w32_result ";$func_convert_core_file_wine_to_w32_result" - fi - fi - done - IFS=$oldIFS - fi -} -# end: func_convert_core_path_wine_to_w32 - - -# func_cygpath ARGS... -# Wrapper around calling the cygpath program via LT_CYGPATH. This is used when -# when (1) $build is *nix and Cygwin is hosted via a wine environment; or (2) -# $build is MSYS and $host is Cygwin, or (3) $build is Cygwin. In case (1) or -# (2), returns the Cygwin file name or path in func_cygpath_result (input -# file name or path is assumed to be in w32 format, as previously converted -# from $build's *nix or MSYS format). In case (3), returns the w32 file name -# or path in func_cygpath_result (input file name or path is assumed to be in -# Cygwin format). Returns an empty string on error. -# -# ARGS are passed to cygpath, with the last one being the file name or path to -# be converted. -# -# Specify the absolute *nix (or w32) name to cygpath in the LT_CYGPATH -# environment variable; do not put it in $PATH. -func_cygpath () -{ - $opt_debug - if test -n "$LT_CYGPATH" && test -f "$LT_CYGPATH"; then - func_cygpath_result=`$LT_CYGPATH "$@" 2>/dev/null` - if test "$?" -ne 0; then - # on failure, ensure result is empty - func_cygpath_result= - fi - else - func_cygpath_result= - func_error "LT_CYGPATH is empty or specifies non-existent file: \`$LT_CYGPATH'" - fi -} -#end: func_cygpath - - -# func_convert_core_msys_to_w32 ARG -# Convert file name or path ARG from MSYS format to w32 format. Return -# result in func_convert_core_msys_to_w32_result. -func_convert_core_msys_to_w32 () -{ - $opt_debug - # awkward: cmd appends spaces to result - func_convert_core_msys_to_w32_result=`( cmd //c echo "$1" ) 2>/dev/null | - $SED -e 's/[ ]*$//' -e "$lt_sed_naive_backslashify"` -} -#end: func_convert_core_msys_to_w32 - - -# func_convert_file_check ARG1 ARG2 -# Verify that ARG1 (a file name in $build format) was converted to $host -# format in ARG2. Otherwise, emit an error message, but continue (resetting -# func_to_host_file_result to ARG1). -func_convert_file_check () -{ - $opt_debug - if test -z "$2" && test -n "$1" ; then - func_error "Could not determine host file name corresponding to" - func_error " \`$1'" - func_error "Continuing, but uninstalled executables may not work." - # Fallback: - func_to_host_file_result="$1" - fi -} -# end func_convert_file_check - - -# func_convert_path_check FROM_PATHSEP TO_PATHSEP FROM_PATH TO_PATH -# Verify that FROM_PATH (a path in $build format) was converted to $host -# format in TO_PATH. Otherwise, emit an error message, but continue, resetting -# func_to_host_file_result to a simplistic fallback value (see below). -func_convert_path_check () -{ - $opt_debug - if test -z "$4" && test -n "$3"; then - func_error "Could not determine the host path corresponding to" - func_error " \`$3'" - func_error "Continuing, but uninstalled executables may not work." - # Fallback. This is a deliberately simplistic "conversion" and - # should not be "improved". See libtool.info. - if test "x$1" != "x$2"; then - lt_replace_pathsep_chars="s|$1|$2|g" - func_to_host_path_result=`echo "$3" | - $SED -e "$lt_replace_pathsep_chars"` - else - func_to_host_path_result="$3" - fi - fi -} -# end func_convert_path_check - - -# func_convert_path_front_back_pathsep FRONTPAT BACKPAT REPL ORIG -# Modifies func_to_host_path_result by prepending REPL if ORIG matches FRONTPAT -# and appending REPL if ORIG matches BACKPAT. -func_convert_path_front_back_pathsep () -{ - $opt_debug - case $4 in - $1 ) func_to_host_path_result="$3$func_to_host_path_result" - ;; - esac - case $4 in - $2 ) func_append func_to_host_path_result "$3" - ;; - esac -} -# end func_convert_path_front_back_pathsep - - -################################################## -# $build to $host FILE NAME CONVERSION FUNCTIONS # -################################################## -# invoked via `$to_host_file_cmd ARG' -# -# In each case, ARG is the path to be converted from $build to $host format. -# Result will be available in $func_to_host_file_result. - - -# func_to_host_file ARG -# Converts the file name ARG from $build format to $host format. Return result -# in func_to_host_file_result. -func_to_host_file () -{ - $opt_debug - $to_host_file_cmd "$1" -} -# end func_to_host_file - - -# func_to_tool_file ARG LAZY -# converts the file name ARG from $build format to toolchain format. Return -# result in func_to_tool_file_result. If the conversion in use is listed -# in (the comma separated) LAZY, no conversion takes place. -func_to_tool_file () -{ - $opt_debug - case ,$2, in - *,"$to_tool_file_cmd",*) - func_to_tool_file_result=$1 - ;; - *) - $to_tool_file_cmd "$1" - func_to_tool_file_result=$func_to_host_file_result - ;; - esac -} -# end func_to_tool_file - - -# func_convert_file_noop ARG -# Copy ARG to func_to_host_file_result. -func_convert_file_noop () -{ - func_to_host_file_result="$1" -} -# end func_convert_file_noop - - -# func_convert_file_msys_to_w32 ARG -# Convert file name ARG from (mingw) MSYS to (mingw) w32 format; automatic -# conversion to w32 is not available inside the cwrapper. Returns result in -# func_to_host_file_result. -func_convert_file_msys_to_w32 () -{ - $opt_debug - func_to_host_file_result="$1" - if test -n "$1"; then - func_convert_core_msys_to_w32 "$1" - func_to_host_file_result="$func_convert_core_msys_to_w32_result" - fi - func_convert_file_check "$1" "$func_to_host_file_result" -} -# end func_convert_file_msys_to_w32 - - -# func_convert_file_cygwin_to_w32 ARG -# Convert file name ARG from Cygwin to w32 format. Returns result in -# func_to_host_file_result. -func_convert_file_cygwin_to_w32 () -{ - $opt_debug - func_to_host_file_result="$1" - if test -n "$1"; then - # because $build is cygwin, we call "the" cygpath in $PATH; no need to use - # LT_CYGPATH in this case. - func_to_host_file_result=`cygpath -m "$1"` - fi - func_convert_file_check "$1" "$func_to_host_file_result" -} -# end func_convert_file_cygwin_to_w32 - - -# func_convert_file_nix_to_w32 ARG -# Convert file name ARG from *nix to w32 format. Requires a wine environment -# and a working winepath. Returns result in func_to_host_file_result. -func_convert_file_nix_to_w32 () -{ - $opt_debug - func_to_host_file_result="$1" - if test -n "$1"; then - func_convert_core_file_wine_to_w32 "$1" - func_to_host_file_result="$func_convert_core_file_wine_to_w32_result" - fi - func_convert_file_check "$1" "$func_to_host_file_result" -} -# end func_convert_file_nix_to_w32 - - -# func_convert_file_msys_to_cygwin ARG -# Convert file name ARG from MSYS to Cygwin format. Requires LT_CYGPATH set. -# Returns result in func_to_host_file_result. -func_convert_file_msys_to_cygwin () -{ - $opt_debug - func_to_host_file_result="$1" - if test -n "$1"; then - func_convert_core_msys_to_w32 "$1" - func_cygpath -u "$func_convert_core_msys_to_w32_result" - func_to_host_file_result="$func_cygpath_result" - fi - func_convert_file_check "$1" "$func_to_host_file_result" -} -# end func_convert_file_msys_to_cygwin - - -# func_convert_file_nix_to_cygwin ARG -# Convert file name ARG from *nix to Cygwin format. Requires Cygwin installed -# in a wine environment, working winepath, and LT_CYGPATH set. Returns result -# in func_to_host_file_result. -func_convert_file_nix_to_cygwin () -{ - $opt_debug - func_to_host_file_result="$1" - if test -n "$1"; then - # convert from *nix to w32, then use cygpath to convert from w32 to cygwin. - func_convert_core_file_wine_to_w32 "$1" - func_cygpath -u "$func_convert_core_file_wine_to_w32_result" - func_to_host_file_result="$func_cygpath_result" - fi - func_convert_file_check "$1" "$func_to_host_file_result" -} -# end func_convert_file_nix_to_cygwin - - -############################################# -# $build to $host PATH CONVERSION FUNCTIONS # -############################################# -# invoked via `$to_host_path_cmd ARG' -# -# In each case, ARG is the path to be converted from $build to $host format. -# The result will be available in $func_to_host_path_result. -# -# Path separators are also converted from $build format to $host format. If -# ARG begins or ends with a path separator character, it is preserved (but -# converted to $host format) on output. -# -# All path conversion functions are named using the following convention: -# file name conversion function : func_convert_file_X_to_Y () -# path conversion function : func_convert_path_X_to_Y () -# where, for any given $build/$host combination the 'X_to_Y' value is the -# same. If conversion functions are added for new $build/$host combinations, -# the two new functions must follow this pattern, or func_init_to_host_path_cmd -# will break. - - -# func_init_to_host_path_cmd -# Ensures that function "pointer" variable $to_host_path_cmd is set to the -# appropriate value, based on the value of $to_host_file_cmd. -to_host_path_cmd= -func_init_to_host_path_cmd () -{ - $opt_debug - if test -z "$to_host_path_cmd"; then - func_stripname 'func_convert_file_' '' "$to_host_file_cmd" - to_host_path_cmd="func_convert_path_${func_stripname_result}" - fi -} - - -# func_to_host_path ARG -# Converts the path ARG from $build format to $host format. Return result -# in func_to_host_path_result. -func_to_host_path () -{ - $opt_debug - func_init_to_host_path_cmd - $to_host_path_cmd "$1" -} -# end func_to_host_path - - -# func_convert_path_noop ARG -# Copy ARG to func_to_host_path_result. -func_convert_path_noop () -{ - func_to_host_path_result="$1" -} -# end func_convert_path_noop - - -# func_convert_path_msys_to_w32 ARG -# Convert path ARG from (mingw) MSYS to (mingw) w32 format; automatic -# conversion to w32 is not available inside the cwrapper. Returns result in -# func_to_host_path_result. -func_convert_path_msys_to_w32 () -{ - $opt_debug - func_to_host_path_result="$1" - if test -n "$1"; then - # Remove leading and trailing path separator characters from ARG. MSYS - # behavior is inconsistent here; cygpath turns them into '.;' and ';.'; - # and winepath ignores them completely. - func_stripname : : "$1" - func_to_host_path_tmp1=$func_stripname_result - func_convert_core_msys_to_w32 "$func_to_host_path_tmp1" - func_to_host_path_result="$func_convert_core_msys_to_w32_result" - func_convert_path_check : ";" \ - "$func_to_host_path_tmp1" "$func_to_host_path_result" - func_convert_path_front_back_pathsep ":*" "*:" ";" "$1" - fi -} -# end func_convert_path_msys_to_w32 - - -# func_convert_path_cygwin_to_w32 ARG -# Convert path ARG from Cygwin to w32 format. Returns result in -# func_to_host_file_result. -func_convert_path_cygwin_to_w32 () -{ - $opt_debug - func_to_host_path_result="$1" - if test -n "$1"; then - # See func_convert_path_msys_to_w32: - func_stripname : : "$1" - func_to_host_path_tmp1=$func_stripname_result - func_to_host_path_result=`cygpath -m -p "$func_to_host_path_tmp1"` - func_convert_path_check : ";" \ - "$func_to_host_path_tmp1" "$func_to_host_path_result" - func_convert_path_front_back_pathsep ":*" "*:" ";" "$1" - fi -} -# end func_convert_path_cygwin_to_w32 - - -# func_convert_path_nix_to_w32 ARG -# Convert path ARG from *nix to w32 format. Requires a wine environment and -# a working winepath. Returns result in func_to_host_file_result. -func_convert_path_nix_to_w32 () -{ - $opt_debug - func_to_host_path_result="$1" - if test -n "$1"; then - # See func_convert_path_msys_to_w32: - func_stripname : : "$1" - func_to_host_path_tmp1=$func_stripname_result - func_convert_core_path_wine_to_w32 "$func_to_host_path_tmp1" - func_to_host_path_result="$func_convert_core_path_wine_to_w32_result" - func_convert_path_check : ";" \ - "$func_to_host_path_tmp1" "$func_to_host_path_result" - func_convert_path_front_back_pathsep ":*" "*:" ";" "$1" - fi -} -# end func_convert_path_nix_to_w32 - - -# func_convert_path_msys_to_cygwin ARG -# Convert path ARG from MSYS to Cygwin format. Requires LT_CYGPATH set. -# Returns result in func_to_host_file_result. -func_convert_path_msys_to_cygwin () -{ - $opt_debug - func_to_host_path_result="$1" - if test -n "$1"; then - # See func_convert_path_msys_to_w32: - func_stripname : : "$1" - func_to_host_path_tmp1=$func_stripname_result - func_convert_core_msys_to_w32 "$func_to_host_path_tmp1" - func_cygpath -u -p "$func_convert_core_msys_to_w32_result" - func_to_host_path_result="$func_cygpath_result" - func_convert_path_check : : \ - "$func_to_host_path_tmp1" "$func_to_host_path_result" - func_convert_path_front_back_pathsep ":*" "*:" : "$1" - fi -} -# end func_convert_path_msys_to_cygwin - - -# func_convert_path_nix_to_cygwin ARG -# Convert path ARG from *nix to Cygwin format. Requires Cygwin installed in a -# a wine environment, working winepath, and LT_CYGPATH set. Returns result in -# func_to_host_file_result. -func_convert_path_nix_to_cygwin () -{ - $opt_debug - func_to_host_path_result="$1" - if test -n "$1"; then - # Remove leading and trailing path separator characters from - # ARG. msys behavior is inconsistent here, cygpath turns them - # into '.;' and ';.', and winepath ignores them completely. - func_stripname : : "$1" - func_to_host_path_tmp1=$func_stripname_result - func_convert_core_path_wine_to_w32 "$func_to_host_path_tmp1" - func_cygpath -u -p "$func_convert_core_path_wine_to_w32_result" - func_to_host_path_result="$func_cygpath_result" - func_convert_path_check : : \ - "$func_to_host_path_tmp1" "$func_to_host_path_result" - func_convert_path_front_back_pathsep ":*" "*:" : "$1" - fi -} -# end func_convert_path_nix_to_cygwin - - -# func_mode_compile arg... -func_mode_compile () -{ - $opt_debug - # Get the compilation command and the source file. - base_compile= - srcfile="$nonopt" # always keep a non-empty value in "srcfile" - suppress_opt=yes - suppress_output= - arg_mode=normal - libobj= - later= - pie_flag= - - for arg - do - case $arg_mode in - arg ) - # do not "continue". Instead, add this to base_compile - lastarg="$arg" - arg_mode=normal - ;; - - target ) - libobj="$arg" - arg_mode=normal - continue - ;; - - normal ) - # Accept any command-line options. - case $arg in - -o) - test -n "$libobj" && \ - func_fatal_error "you cannot specify \`-o' more than once" - arg_mode=target - continue - ;; - - -pie | -fpie | -fPIE) - func_append pie_flag " $arg" - continue - ;; - - -shared | -static | -prefer-pic | -prefer-non-pic) - func_append later " $arg" - continue - ;; - - -no-suppress) - suppress_opt=no - continue - ;; - - -Xcompiler) - arg_mode=arg # the next one goes into the "base_compile" arg list - continue # The current "srcfile" will either be retained or - ;; # replaced later. I would guess that would be a bug. - - -Wc,*) - func_stripname '-Wc,' '' "$arg" - args=$func_stripname_result - lastarg= - save_ifs="$IFS"; IFS=',' - for arg in $args; do - IFS="$save_ifs" - func_append_quoted lastarg "$arg" - done - IFS="$save_ifs" - func_stripname ' ' '' "$lastarg" - lastarg=$func_stripname_result - - # Add the arguments to base_compile. - func_append base_compile " $lastarg" - continue - ;; - - *) - # Accept the current argument as the source file. - # The previous "srcfile" becomes the current argument. - # - lastarg="$srcfile" - srcfile="$arg" - ;; - esac # case $arg - ;; - esac # case $arg_mode - - # Aesthetically quote the previous argument. - func_append_quoted base_compile "$lastarg" - done # for arg - - case $arg_mode in - arg) - func_fatal_error "you must specify an argument for -Xcompile" - ;; - target) - func_fatal_error "you must specify a target with \`-o'" - ;; - *) - # Get the name of the library object. - test -z "$libobj" && { - func_basename "$srcfile" - libobj="$func_basename_result" - } - ;; - esac - - # Recognize several different file suffixes. - # If the user specifies -o file.o, it is replaced with file.lo - case $libobj in - *.[cCFSifmso] | \ - *.ada | *.adb | *.ads | *.asm | \ - *.c++ | *.cc | *.ii | *.class | *.cpp | *.cxx | \ - *.[fF][09]? | *.for | *.java | *.go | *.obj | *.sx | *.cu | *.cup) - func_xform "$libobj" - libobj=$func_xform_result - ;; - esac - - case $libobj in - *.lo) func_lo2o "$libobj"; obj=$func_lo2o_result ;; - *) - func_fatal_error "cannot determine name of library object from \`$libobj'" - ;; - esac - - func_infer_tag $base_compile - - for arg in $later; do - case $arg in - -shared) - test "$build_libtool_libs" != yes && \ - func_fatal_configuration "can not build a shared library" - build_old_libs=no - continue - ;; - - -static) - build_libtool_libs=no - build_old_libs=yes - continue - ;; - - -prefer-pic) - pic_mode=yes - continue - ;; - - -prefer-non-pic) - pic_mode=no - continue - ;; - esac - done - - func_quote_for_eval "$libobj" - test "X$libobj" != "X$func_quote_for_eval_result" \ - && $ECHO "X$libobj" | $GREP '[]~#^*{};<>?"'"'"' &()|`$[]' \ - && func_warning "libobj name \`$libobj' may not contain shell special characters." - func_dirname_and_basename "$obj" "/" "" - objname="$func_basename_result" - xdir="$func_dirname_result" - lobj=${xdir}$objdir/$objname - - test -z "$base_compile" && \ - func_fatal_help "you must specify a compilation command" - - # Delete any leftover library objects. - if test "$build_old_libs" = yes; then - removelist="$obj $lobj $libobj ${libobj}T" - else - removelist="$lobj $libobj ${libobj}T" - fi - - # On Cygwin there's no "real" PIC flag so we must build both object types - case $host_os in - cygwin* | mingw* | pw32* | os2* | cegcc*) - pic_mode=default - ;; - esac - if test "$pic_mode" = no && test "$deplibs_check_method" != pass_all; then - # non-PIC code in shared libraries is not supported - pic_mode=default - fi - - # Calculate the filename of the output object if compiler does - # not support -o with -c - if test "$compiler_c_o" = no; then - output_obj=`$ECHO "$srcfile" | $SED 's%^.*/%%; s%\.[^.]*$%%'`.${objext} - lockfile="$output_obj.lock" - else - output_obj= - need_locks=no - lockfile= - fi - - # Lock this critical section if it is needed - # We use this script file to make the link, it avoids creating a new file - if test "$need_locks" = yes; then - until $opt_dry_run || ln "$progpath" "$lockfile" 2>/dev/null; do - func_echo "Waiting for $lockfile to be removed" - sleep 2 - done - elif test "$need_locks" = warn; then - if test -f "$lockfile"; then - $ECHO "\ -*** ERROR, $lockfile exists and contains: -`cat $lockfile 2>/dev/null` - -This indicates that another process is trying to use the same -temporary object file, and libtool could not work around it because -your compiler does not support \`-c' and \`-o' together. If you -repeat this compilation, it may succeed, by chance, but you had better -avoid parallel builds (make -j) in this platform, or get a better -compiler." - - $opt_dry_run || $RM $removelist - exit $EXIT_FAILURE - fi - func_append removelist " $output_obj" - $ECHO "$srcfile" > "$lockfile" - fi - - $opt_dry_run || $RM $removelist - func_append removelist " $lockfile" - trap '$opt_dry_run || $RM $removelist; exit $EXIT_FAILURE' 1 2 15 - - func_to_tool_file "$srcfile" func_convert_file_msys_to_w32 - srcfile=$func_to_tool_file_result - func_quote_for_eval "$srcfile" - qsrcfile=$func_quote_for_eval_result - - # Only build a PIC object if we are building libtool libraries. - if test "$build_libtool_libs" = yes; then - # Without this assignment, base_compile gets emptied. - fbsd_hideous_sh_bug=$base_compile - - if test "$pic_mode" != no; then - command="$base_compile $qsrcfile $pic_flag" - else - # Don't build PIC code - command="$base_compile $qsrcfile" - fi - - func_mkdir_p "$xdir$objdir" - - if test -z "$output_obj"; then - # Place PIC objects in $objdir - func_append command " -o $lobj" - fi - - func_show_eval_locale "$command" \ - 'test -n "$output_obj" && $RM $removelist; exit $EXIT_FAILURE' - - if test "$need_locks" = warn && - test "X`cat $lockfile 2>/dev/null`" != "X$srcfile"; then - $ECHO "\ -*** ERROR, $lockfile contains: -`cat $lockfile 2>/dev/null` - -but it should contain: -$srcfile - -This indicates that another process is trying to use the same -temporary object file, and libtool could not work around it because -your compiler does not support \`-c' and \`-o' together. If you -repeat this compilation, it may succeed, by chance, but you had better -avoid parallel builds (make -j) in this platform, or get a better -compiler." - - $opt_dry_run || $RM $removelist - exit $EXIT_FAILURE - fi - - # Just move the object if needed, then go on to compile the next one - if test -n "$output_obj" && test "X$output_obj" != "X$lobj"; then - func_show_eval '$MV "$output_obj" "$lobj"' \ - 'error=$?; $opt_dry_run || $RM $removelist; exit $error' - fi - - # Allow error messages only from the first compilation. - if test "$suppress_opt" = yes; then - suppress_output=' >/dev/null 2>&1' - fi - fi - - # Only build a position-dependent object if we build old libraries. - if test "$build_old_libs" = yes; then - if test "$pic_mode" != yes; then - # Don't build PIC code - command="$base_compile $qsrcfile$pie_flag" - else - command="$base_compile $qsrcfile $pic_flag" - fi - if test "$compiler_c_o" = yes; then - func_append command " -o $obj" - fi - - # Suppress compiler output if we already did a PIC compilation. - func_append command "$suppress_output" - func_show_eval_locale "$command" \ - '$opt_dry_run || $RM $removelist; exit $EXIT_FAILURE' - - if test "$need_locks" = warn && - test "X`cat $lockfile 2>/dev/null`" != "X$srcfile"; then - $ECHO "\ -*** ERROR, $lockfile contains: -`cat $lockfile 2>/dev/null` - -but it should contain: -$srcfile - -This indicates that another process is trying to use the same -temporary object file, and libtool could not work around it because -your compiler does not support \`-c' and \`-o' together. If you -repeat this compilation, it may succeed, by chance, but you had better -avoid parallel builds (make -j) in this platform, or get a better -compiler." - - $opt_dry_run || $RM $removelist - exit $EXIT_FAILURE - fi - - # Just move the object if needed - if test -n "$output_obj" && test "X$output_obj" != "X$obj"; then - func_show_eval '$MV "$output_obj" "$obj"' \ - 'error=$?; $opt_dry_run || $RM $removelist; exit $error' - fi - fi - - $opt_dry_run || { - func_write_libtool_object "$libobj" "$objdir/$objname" "$objname" - - # Unlock the critical section if it was locked - if test "$need_locks" != no; then - removelist=$lockfile - $RM "$lockfile" - fi - } - - exit $EXIT_SUCCESS -} - -$opt_help || { - test "$opt_mode" = compile && func_mode_compile ${1+"$@"} -} - -func_mode_help () -{ - # We need to display help for each of the modes. - case $opt_mode in - "") - # Generic help is extracted from the usage comments - # at the start of this file. - func_help - ;; - - clean) - $ECHO \ -"Usage: $progname [OPTION]... --mode=clean RM [RM-OPTION]... FILE... - -Remove files from the build directory. - -RM is the name of the program to use to delete files associated with each FILE -(typically \`/bin/rm'). RM-OPTIONS are options (such as \`-f') to be passed -to RM. - -If FILE is a libtool library, object or program, all the files associated -with it are deleted. Otherwise, only FILE itself is deleted using RM." - ;; - - compile) - $ECHO \ -"Usage: $progname [OPTION]... --mode=compile COMPILE-COMMAND... SOURCEFILE - -Compile a source file into a libtool library object. - -This mode accepts the following additional options: - - -o OUTPUT-FILE set the output file name to OUTPUT-FILE - -no-suppress do not suppress compiler output for multiple passes - -prefer-pic try to build PIC objects only - -prefer-non-pic try to build non-PIC objects only - -shared do not build a \`.o' file suitable for static linking - -static only build a \`.o' file suitable for static linking - -Wc,FLAG pass FLAG directly to the compiler - -COMPILE-COMMAND is a command to be used in creating a \`standard' object file -from the given SOURCEFILE. - -The output file name is determined by removing the directory component from -SOURCEFILE, then substituting the C source code suffix \`.c' with the -library object suffix, \`.lo'." - ;; - - execute) - $ECHO \ -"Usage: $progname [OPTION]... --mode=execute COMMAND [ARGS]... - -Automatically set library path, then run a program. - -This mode accepts the following additional options: - - -dlopen FILE add the directory containing FILE to the library path - -This mode sets the library path environment variable according to \`-dlopen' -flags. - -If any of the ARGS are libtool executable wrappers, then they are translated -into their corresponding uninstalled binary, and any of their required library -directories are added to the library path. - -Then, COMMAND is executed, with ARGS as arguments." - ;; - - finish) - $ECHO \ -"Usage: $progname [OPTION]... --mode=finish [LIBDIR]... - -Complete the installation of libtool libraries. - -Each LIBDIR is a directory that contains libtool libraries. - -The commands that this mode executes may require superuser privileges. Use -the \`--dry-run' option if you just want to see what would be executed." - ;; - - install) - $ECHO \ -"Usage: $progname [OPTION]... --mode=install INSTALL-COMMAND... - -Install executables or libraries. - -INSTALL-COMMAND is the installation command. The first component should be -either the \`install' or \`cp' program. - -The following components of INSTALL-COMMAND are treated specially: - - -inst-prefix-dir PREFIX-DIR Use PREFIX-DIR as a staging area for installation - -The rest of the components are interpreted as arguments to that command (only -BSD-compatible install options are recognized)." - ;; - - link) - $ECHO \ -"Usage: $progname [OPTION]... --mode=link LINK-COMMAND... - -Link object files or libraries together to form another library, or to -create an executable program. - -LINK-COMMAND is a command using the C compiler that you would use to create -a program from several object files. - -The following components of LINK-COMMAND are treated specially: - - -all-static do not do any dynamic linking at all - -avoid-version do not add a version suffix if possible - -bindir BINDIR specify path to binaries directory (for systems where - libraries must be found in the PATH setting at runtime) - -dlopen FILE \`-dlpreopen' FILE if it cannot be dlopened at runtime - -dlpreopen FILE link in FILE and add its symbols to lt_preloaded_symbols - -export-dynamic allow symbols from OUTPUT-FILE to be resolved with dlsym(3) - -export-symbols SYMFILE - try to export only the symbols listed in SYMFILE - -export-symbols-regex REGEX - try to export only the symbols matching REGEX - -LLIBDIR search LIBDIR for required installed libraries - -lNAME OUTPUT-FILE requires the installed library libNAME - -module build a library that can dlopened - -no-fast-install disable the fast-install mode - -no-install link a not-installable executable - -no-undefined declare that a library does not refer to external symbols - -o OUTPUT-FILE create OUTPUT-FILE from the specified objects - -objectlist FILE Use a list of object files found in FILE to specify objects - -precious-files-regex REGEX - don't remove output files matching REGEX - -release RELEASE specify package release information - -rpath LIBDIR the created library will eventually be installed in LIBDIR - -R[ ]LIBDIR add LIBDIR to the runtime path of programs and libraries - -shared only do dynamic linking of libtool libraries - -shrext SUFFIX override the standard shared library file extension - -static do not do any dynamic linking of uninstalled libtool libraries - -static-libtool-libs - do not do any dynamic linking of libtool libraries - -version-info CURRENT[:REVISION[:AGE]] - specify library version info [each variable defaults to 0] - -weak LIBNAME declare that the target provides the LIBNAME interface - -Wc,FLAG - -Xcompiler FLAG pass linker-specific FLAG directly to the compiler - -Wl,FLAG - -Xlinker FLAG pass linker-specific FLAG directly to the linker - -XCClinker FLAG pass link-specific FLAG to the compiler driver (CC) - -All other options (arguments beginning with \`-') are ignored. - -Every other argument is treated as a filename. Files ending in \`.la' are -treated as uninstalled libtool libraries, other files are standard or library -object files. - -If the OUTPUT-FILE ends in \`.la', then a libtool library is created, -only library objects (\`.lo' files) may be specified, and \`-rpath' is -required, except when creating a convenience library. - -If OUTPUT-FILE ends in \`.a' or \`.lib', then a standard library is created -using \`ar' and \`ranlib', or on Windows using \`lib'. - -If OUTPUT-FILE ends in \`.lo' or \`.${objext}', then a reloadable object file -is created, otherwise an executable program is created." - ;; - - uninstall) - $ECHO \ -"Usage: $progname [OPTION]... --mode=uninstall RM [RM-OPTION]... FILE... - -Remove libraries from an installation directory. - -RM is the name of the program to use to delete files associated with each FILE -(typically \`/bin/rm'). RM-OPTIONS are options (such as \`-f') to be passed -to RM. - -If FILE is a libtool library, all the files associated with it are deleted. -Otherwise, only FILE itself is deleted using RM." - ;; - - *) - func_fatal_help "invalid operation mode \`$opt_mode'" - ;; - esac - - echo - $ECHO "Try \`$progname --help' for more information about other modes." -} - -# Now that we've collected a possible --mode arg, show help if necessary -if $opt_help; then - if test "$opt_help" = :; then - func_mode_help - else - { - func_help noexit - for opt_mode in compile link execute install finish uninstall clean; do - func_mode_help - done - } | sed -n '1p; 2,$s/^Usage:/ or: /p' - { - func_help noexit - for opt_mode in compile link execute install finish uninstall clean; do - echo - func_mode_help - done - } | - sed '1d - /^When reporting/,/^Report/{ - H - d - } - $x - /information about other modes/d - /more detailed .*MODE/d - s/^Usage:.*--mode=\([^ ]*\) .*/Description of \1 mode:/' - fi - exit $? -fi - - -# func_mode_execute arg... -func_mode_execute () -{ - $opt_debug - # The first argument is the command name. - cmd="$nonopt" - test -z "$cmd" && \ - func_fatal_help "you must specify a COMMAND" - - # Handle -dlopen flags immediately. - for file in $opt_dlopen; do - test -f "$file" \ - || func_fatal_help "\`$file' is not a file" - - dir= - case $file in - *.la) - func_resolve_sysroot "$file" - file=$func_resolve_sysroot_result - - # Check to see that this really is a libtool archive. - func_lalib_unsafe_p "$file" \ - || func_fatal_help "\`$lib' is not a valid libtool archive" - - # Read the libtool library. - dlname= - library_names= - func_source "$file" - - # Skip this library if it cannot be dlopened. - if test -z "$dlname"; then - # Warn if it was a shared library. - test -n "$library_names" && \ - func_warning "\`$file' was not linked with \`-export-dynamic'" - continue - fi - - func_dirname "$file" "" "." - dir="$func_dirname_result" - - if test -f "$dir/$objdir/$dlname"; then - func_append dir "/$objdir" - else - if test ! -f "$dir/$dlname"; then - func_fatal_error "cannot find \`$dlname' in \`$dir' or \`$dir/$objdir'" - fi - fi - ;; - - *.lo) - # Just add the directory containing the .lo file. - func_dirname "$file" "" "." - dir="$func_dirname_result" - ;; - - *) - func_warning "\`-dlopen' is ignored for non-libtool libraries and objects" - continue - ;; - esac - - # Get the absolute pathname. - absdir=`cd "$dir" && pwd` - test -n "$absdir" && dir="$absdir" - - # Now add the directory to shlibpath_var. - if eval "test -z \"\$$shlibpath_var\""; then - eval "$shlibpath_var=\"\$dir\"" - else - eval "$shlibpath_var=\"\$dir:\$$shlibpath_var\"" - fi - done - - # This variable tells wrapper scripts just to set shlibpath_var - # rather than running their programs. - libtool_execute_magic="$magic" - - # Check if any of the arguments is a wrapper script. - args= - for file - do - case $file in - -* | *.la | *.lo ) ;; - *) - # Do a test to see if this is really a libtool program. - if func_ltwrapper_script_p "$file"; then - func_source "$file" - # Transform arg to wrapped name. - file="$progdir/$program" - elif func_ltwrapper_executable_p "$file"; then - func_ltwrapper_scriptname "$file" - func_source "$func_ltwrapper_scriptname_result" - # Transform arg to wrapped name. - file="$progdir/$program" - fi - ;; - esac - # Quote arguments (to preserve shell metacharacters). - func_append_quoted args "$file" - done - - if test "X$opt_dry_run" = Xfalse; then - if test -n "$shlibpath_var"; then - # Export the shlibpath_var. - eval "export $shlibpath_var" - fi - - # Restore saved environment variables - for lt_var in LANG LANGUAGE LC_ALL LC_CTYPE LC_COLLATE LC_MESSAGES - do - eval "if test \"\${save_$lt_var+set}\" = set; then - $lt_var=\$save_$lt_var; export $lt_var - else - $lt_unset $lt_var - fi" - done - - # Now prepare to actually exec the command. - exec_cmd="\$cmd$args" - else - # Display what would be done. - if test -n "$shlibpath_var"; then - eval "\$ECHO \"\$shlibpath_var=\$$shlibpath_var\"" - echo "export $shlibpath_var" - fi - $ECHO "$cmd$args" - exit $EXIT_SUCCESS - fi -} - -test "$opt_mode" = execute && func_mode_execute ${1+"$@"} - - -# func_mode_finish arg... -func_mode_finish () -{ - $opt_debug - libs= - libdirs= - admincmds= - - for opt in "$nonopt" ${1+"$@"} - do - if test -d "$opt"; then - func_append libdirs " $opt" - - elif test -f "$opt"; then - if func_lalib_unsafe_p "$opt"; then - func_append libs " $opt" - else - func_warning "\`$opt' is not a valid libtool archive" - fi - - else - func_fatal_error "invalid argument \`$opt'" - fi - done - - if test -n "$libs"; then - if test -n "$lt_sysroot"; then - sysroot_regex=`$ECHO "$lt_sysroot" | $SED "$sed_make_literal_regex"` - sysroot_cmd="s/\([ ']\)$sysroot_regex/\1/g;" - else - sysroot_cmd= - fi - - # Remove sysroot references - if $opt_dry_run; then - for lib in $libs; do - echo "removing references to $lt_sysroot and \`=' prefixes from $lib" - done - else - tmpdir=`func_mktempdir` - for lib in $libs; do - sed -e "${sysroot_cmd} s/\([ ']-[LR]\)=/\1/g; s/\([ ']\)=/\1/g" $lib \ - > $tmpdir/tmp-la - mv -f $tmpdir/tmp-la $lib - done - ${RM}r "$tmpdir" - fi - fi - - if test -n "$finish_cmds$finish_eval" && test -n "$libdirs"; then - for libdir in $libdirs; do - if test -n "$finish_cmds"; then - # Do each command in the finish commands. - func_execute_cmds "$finish_cmds" 'admincmds="$admincmds -'"$cmd"'"' - fi - if test -n "$finish_eval"; then - # Do the single finish_eval. - eval cmds=\"$finish_eval\" - $opt_dry_run || eval "$cmds" || func_append admincmds " - $cmds" - fi - done - fi - - # Exit here if they wanted silent mode. - $opt_silent && exit $EXIT_SUCCESS - - if test -n "$finish_cmds$finish_eval" && test -n "$libdirs"; then - echo "----------------------------------------------------------------------" - echo "Libraries have been installed in:" - for libdir in $libdirs; do - $ECHO " $libdir" - done - echo - echo "If you ever happen to want to link against installed libraries" - echo "in a given directory, LIBDIR, you must either use libtool, and" - echo "specify the full pathname of the library, or use the \`-LLIBDIR'" - echo "flag during linking and do at least one of the following:" - if test -n "$shlibpath_var"; then - echo " - add LIBDIR to the \`$shlibpath_var' environment variable" - echo " during execution" - fi - if test -n "$runpath_var"; then - echo " - add LIBDIR to the \`$runpath_var' environment variable" - echo " during linking" - fi - if test -n "$hardcode_libdir_flag_spec"; then - libdir=LIBDIR - eval flag=\"$hardcode_libdir_flag_spec\" - - $ECHO " - use the \`$flag' linker flag" - fi - if test -n "$admincmds"; then - $ECHO " - have your system administrator run these commands:$admincmds" - fi - if test -f /etc/ld.so.conf; then - echo " - have your system administrator add LIBDIR to \`/etc/ld.so.conf'" - fi - echo - - echo "See any operating system documentation about shared libraries for" - case $host in - solaris2.[6789]|solaris2.1[0-9]) - echo "more information, such as the ld(1), crle(1) and ld.so(8) manual" - echo "pages." - ;; - *) - echo "more information, such as the ld(1) and ld.so(8) manual pages." - ;; - esac - echo "----------------------------------------------------------------------" - fi - exit $EXIT_SUCCESS -} - -test "$opt_mode" = finish && func_mode_finish ${1+"$@"} - - -# func_mode_install arg... -func_mode_install () -{ - $opt_debug - # There may be an optional sh(1) argument at the beginning of - # install_prog (especially on Windows NT). - if test "$nonopt" = "$SHELL" || test "$nonopt" = /bin/sh || - # Allow the use of GNU shtool's install command. - case $nonopt in *shtool*) :;; *) false;; esac; then - # Aesthetically quote it. - func_quote_for_eval "$nonopt" - install_prog="$func_quote_for_eval_result " - arg=$1 - shift - else - install_prog= - arg=$nonopt - fi - - # The real first argument should be the name of the installation program. - # Aesthetically quote it. - func_quote_for_eval "$arg" - func_append install_prog "$func_quote_for_eval_result" - install_shared_prog=$install_prog - case " $install_prog " in - *[\\\ /]cp\ *) install_cp=: ;; - *) install_cp=false ;; - esac - - # We need to accept at least all the BSD install flags. - dest= - files= - opts= - prev= - install_type= - isdir=no - stripme= - no_mode=: - for arg - do - arg2= - if test -n "$dest"; then - func_append files " $dest" - dest=$arg - continue - fi - - case $arg in - -d) isdir=yes ;; - -f) - if $install_cp; then :; else - prev=$arg - fi - ;; - -g | -m | -o) - prev=$arg - ;; - -s) - stripme=" -s" - continue - ;; - -*) - ;; - *) - # If the previous option needed an argument, then skip it. - if test -n "$prev"; then - if test "x$prev" = x-m && test -n "$install_override_mode"; then - arg2=$install_override_mode - no_mode=false - fi - prev= - else - dest=$arg - continue - fi - ;; - esac - - # Aesthetically quote the argument. - func_quote_for_eval "$arg" - func_append install_prog " $func_quote_for_eval_result" - if test -n "$arg2"; then - func_quote_for_eval "$arg2" - fi - func_append install_shared_prog " $func_quote_for_eval_result" - done - - test -z "$install_prog" && \ - func_fatal_help "you must specify an install program" - - test -n "$prev" && \ - func_fatal_help "the \`$prev' option requires an argument" - - if test -n "$install_override_mode" && $no_mode; then - if $install_cp; then :; else - func_quote_for_eval "$install_override_mode" - func_append install_shared_prog " -m $func_quote_for_eval_result" - fi - fi - - if test -z "$files"; then - if test -z "$dest"; then - func_fatal_help "no file or destination specified" - else - func_fatal_help "you must specify a destination" - fi - fi - - # Strip any trailing slash from the destination. - func_stripname '' '/' "$dest" - dest=$func_stripname_result - - # Check to see that the destination is a directory. - test -d "$dest" && isdir=yes - if test "$isdir" = yes; then - destdir="$dest" - destname= - else - func_dirname_and_basename "$dest" "" "." - destdir="$func_dirname_result" - destname="$func_basename_result" - - # Not a directory, so check to see that there is only one file specified. - set dummy $files; shift - test "$#" -gt 1 && \ - func_fatal_help "\`$dest' is not a directory" - fi - case $destdir in - [\\/]* | [A-Za-z]:[\\/]*) ;; - *) - for file in $files; do - case $file in - *.lo) ;; - *) - func_fatal_help "\`$destdir' must be an absolute directory name" - ;; - esac - done - ;; - esac - - # This variable tells wrapper scripts just to set variables rather - # than running their programs. - libtool_install_magic="$magic" - - staticlibs= - future_libdirs= - current_libdirs= - for file in $files; do - - # Do each installation. - case $file in - *.$libext) - # Do the static libraries later. - func_append staticlibs " $file" - ;; - - *.la) - func_resolve_sysroot "$file" - file=$func_resolve_sysroot_result - - # Check to see that this really is a libtool archive. - func_lalib_unsafe_p "$file" \ - || func_fatal_help "\`$file' is not a valid libtool archive" - - library_names= - old_library= - relink_command= - func_source "$file" - - # Add the libdir to current_libdirs if it is the destination. - if test "X$destdir" = "X$libdir"; then - case "$current_libdirs " in - *" $libdir "*) ;; - *) func_append current_libdirs " $libdir" ;; - esac - else - # Note the libdir as a future libdir. - case "$future_libdirs " in - *" $libdir "*) ;; - *) func_append future_libdirs " $libdir" ;; - esac - fi - - func_dirname "$file" "/" "" - dir="$func_dirname_result" - func_append dir "$objdir" - - if test -n "$relink_command"; then - # Determine the prefix the user has applied to our future dir. - inst_prefix_dir=`$ECHO "$destdir" | $SED -e "s%$libdir\$%%"` - - # Don't allow the user to place us outside of our expected - # location b/c this prevents finding dependent libraries that - # are installed to the same prefix. - # At present, this check doesn't affect windows .dll's that - # are installed into $libdir/../bin (currently, that works fine) - # but it's something to keep an eye on. - test "$inst_prefix_dir" = "$destdir" && \ - func_fatal_error "error: cannot install \`$file' to a directory not ending in $libdir" - - if test -n "$inst_prefix_dir"; then - # Stick the inst_prefix_dir data into the link command. - relink_command=`$ECHO "$relink_command" | $SED "s%@inst_prefix_dir@%-inst-prefix-dir $inst_prefix_dir%"` - else - relink_command=`$ECHO "$relink_command" | $SED "s%@inst_prefix_dir@%%"` - fi - - func_warning "relinking \`$file'" - func_show_eval "$relink_command" \ - 'func_fatal_error "error: relink \`$file'\'' with the above command before installing it"' - fi - - # See the names of the shared library. - set dummy $library_names; shift - if test -n "$1"; then - realname="$1" - shift - - srcname="$realname" - test -n "$relink_command" && srcname="$realname"T - - # Install the shared library and build the symlinks. - func_show_eval "$install_shared_prog $dir/$srcname $destdir/$realname" \ - 'exit $?' - tstripme="$stripme" - case $host_os in - cygwin* | mingw* | pw32* | cegcc*) - case $realname in - *.dll.a) - tstripme="" - ;; - esac - ;; - esac - if test -n "$tstripme" && test -n "$striplib"; then - func_show_eval "$striplib $destdir/$realname" 'exit $?' - fi - - if test "$#" -gt 0; then - # Delete the old symlinks, and create new ones. - # Try `ln -sf' first, because the `ln' binary might depend on - # the symlink we replace! Solaris /bin/ln does not understand -f, - # so we also need to try rm && ln -s. - for linkname - do - test "$linkname" != "$realname" \ - && func_show_eval "(cd $destdir && { $LN_S -f $realname $linkname || { $RM $linkname && $LN_S $realname $linkname; }; })" - done - fi - - # Do each command in the postinstall commands. - lib="$destdir/$realname" - func_execute_cmds "$postinstall_cmds" 'exit $?' - fi - - # Install the pseudo-library for information purposes. - func_basename "$file" - name="$func_basename_result" - instname="$dir/$name"i - func_show_eval "$install_prog $instname $destdir/$name" 'exit $?' - - # Maybe install the static library, too. - test -n "$old_library" && func_append staticlibs " $dir/$old_library" - ;; - - *.lo) - # Install (i.e. copy) a libtool object. - - # Figure out destination file name, if it wasn't already specified. - if test -n "$destname"; then - destfile="$destdir/$destname" - else - func_basename "$file" - destfile="$func_basename_result" - destfile="$destdir/$destfile" - fi - - # Deduce the name of the destination old-style object file. - case $destfile in - *.lo) - func_lo2o "$destfile" - staticdest=$func_lo2o_result - ;; - *.$objext) - staticdest="$destfile" - destfile= - ;; - *) - func_fatal_help "cannot copy a libtool object to \`$destfile'" - ;; - esac - - # Install the libtool object if requested. - test -n "$destfile" && \ - func_show_eval "$install_prog $file $destfile" 'exit $?' - - # Install the old object if enabled. - if test "$build_old_libs" = yes; then - # Deduce the name of the old-style object file. - func_lo2o "$file" - staticobj=$func_lo2o_result - func_show_eval "$install_prog \$staticobj \$staticdest" 'exit $?' - fi - exit $EXIT_SUCCESS - ;; - - *) - # Figure out destination file name, if it wasn't already specified. - if test -n "$destname"; then - destfile="$destdir/$destname" - else - func_basename "$file" - destfile="$func_basename_result" - destfile="$destdir/$destfile" - fi - - # If the file is missing, and there is a .exe on the end, strip it - # because it is most likely a libtool script we actually want to - # install - stripped_ext="" - case $file in - *.exe) - if test ! -f "$file"; then - func_stripname '' '.exe' "$file" - file=$func_stripname_result - stripped_ext=".exe" - fi - ;; - esac - - # Do a test to see if this is really a libtool program. - case $host in - *cygwin* | *mingw*) - if func_ltwrapper_executable_p "$file"; then - func_ltwrapper_scriptname "$file" - wrapper=$func_ltwrapper_scriptname_result - else - func_stripname '' '.exe' "$file" - wrapper=$func_stripname_result - fi - ;; - *) - wrapper=$file - ;; - esac - if func_ltwrapper_script_p "$wrapper"; then - notinst_deplibs= - relink_command= - - func_source "$wrapper" - - # Check the variables that should have been set. - test -z "$generated_by_libtool_version" && \ - func_fatal_error "invalid libtool wrapper script \`$wrapper'" - - finalize=yes - for lib in $notinst_deplibs; do - # Check to see that each library is installed. - libdir= - if test -f "$lib"; then - func_source "$lib" - fi - libfile="$libdir/"`$ECHO "$lib" | $SED 's%^.*/%%g'` ### testsuite: skip nested quoting test - if test -n "$libdir" && test ! -f "$libfile"; then - func_warning "\`$lib' has not been installed in \`$libdir'" - finalize=no - fi - done - - relink_command= - func_source "$wrapper" - - outputname= - if test "$fast_install" = no && test -n "$relink_command"; then - $opt_dry_run || { - if test "$finalize" = yes; then - tmpdir=`func_mktempdir` - func_basename "$file$stripped_ext" - file="$func_basename_result" - outputname="$tmpdir/$file" - # Replace the output file specification. - relink_command=`$ECHO "$relink_command" | $SED 's%@OUTPUT@%'"$outputname"'%g'` - - $opt_silent || { - func_quote_for_expand "$relink_command" - eval "func_echo $func_quote_for_expand_result" - } - if eval "$relink_command"; then : - else - func_error "error: relink \`$file' with the above command before installing it" - $opt_dry_run || ${RM}r "$tmpdir" - continue - fi - file="$outputname" - else - func_warning "cannot relink \`$file'" - fi - } - else - # Install the binary that we compiled earlier. - file=`$ECHO "$file$stripped_ext" | $SED "s%\([^/]*\)$%$objdir/\1%"` - fi - fi - - # remove .exe since cygwin /usr/bin/install will append another - # one anyway - case $install_prog,$host in - */usr/bin/install*,*cygwin*) - case $file:$destfile in - *.exe:*.exe) - # this is ok - ;; - *.exe:*) - destfile=$destfile.exe - ;; - *:*.exe) - func_stripname '' '.exe' "$destfile" - destfile=$func_stripname_result - ;; - esac - ;; - esac - func_show_eval "$install_prog\$stripme \$file \$destfile" 'exit $?' - $opt_dry_run || if test -n "$outputname"; then - ${RM}r "$tmpdir" - fi - ;; - esac - done - - for file in $staticlibs; do - func_basename "$file" - name="$func_basename_result" - - # Set up the ranlib parameters. - oldlib="$destdir/$name" - func_to_tool_file "$oldlib" func_convert_file_msys_to_w32 - tool_oldlib=$func_to_tool_file_result - - func_show_eval "$install_prog \$file \$oldlib" 'exit $?' - - if test -n "$stripme" && test -n "$old_striplib"; then - func_show_eval "$old_striplib $tool_oldlib" 'exit $?' - fi - - # Do each command in the postinstall commands. - func_execute_cmds "$old_postinstall_cmds" 'exit $?' - done - - test -n "$future_libdirs" && \ - func_warning "remember to run \`$progname --finish$future_libdirs'" - - if test -n "$current_libdirs"; then - # Maybe just do a dry run. - $opt_dry_run && current_libdirs=" -n$current_libdirs" - exec_cmd='$SHELL $progpath $preserve_args --finish$current_libdirs' - else - exit $EXIT_SUCCESS - fi -} - -test "$opt_mode" = install && func_mode_install ${1+"$@"} - - -# func_generate_dlsyms outputname originator pic_p -# Extract symbols from dlprefiles and create ${outputname}S.o with -# a dlpreopen symbol table. -func_generate_dlsyms () -{ - $opt_debug - my_outputname="$1" - my_originator="$2" - my_pic_p="${3-no}" - my_prefix=`$ECHO "$my_originator" | sed 's%[^a-zA-Z0-9]%_%g'` - my_dlsyms= - - if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then - if test -n "$NM" && test -n "$global_symbol_pipe"; then - my_dlsyms="${my_outputname}S.c" - else - func_error "not configured to extract global symbols from dlpreopened files" - fi - fi - - if test -n "$my_dlsyms"; then - case $my_dlsyms in - "") ;; - *.c) - # Discover the nlist of each of the dlfiles. - nlist="$output_objdir/${my_outputname}.nm" - - func_show_eval "$RM $nlist ${nlist}S ${nlist}T" - - # Parse the name list into a source file. - func_verbose "creating $output_objdir/$my_dlsyms" - - $opt_dry_run || $ECHO > "$output_objdir/$my_dlsyms" "\ -/* $my_dlsyms - symbol resolution table for \`$my_outputname' dlsym emulation. */ -/* Generated by $PROGRAM (GNU $PACKAGE$TIMESTAMP) $VERSION */ - -#ifdef __cplusplus -extern \"C\" { -#endif - -#if defined(__GNUC__) && (((__GNUC__ == 4) && (__GNUC_MINOR__ >= 4)) || (__GNUC__ > 4)) -#pragma GCC diagnostic ignored \"-Wstrict-prototypes\" -#endif - -/* Keep this code in sync between libtool.m4, ltmain, lt_system.h, and tests. */ -#if defined(_WIN32) || defined(__CYGWIN__) || defined(_WIN32_WCE) -/* DATA imports from DLLs on WIN32 con't be const, because runtime - relocations are performed -- see ld's documentation on pseudo-relocs. */ -# define LT_DLSYM_CONST -#elif defined(__osf__) -/* This system does not cope well with relocations in const data. */ -# define LT_DLSYM_CONST -#else -# define LT_DLSYM_CONST const -#endif - -/* External symbol declarations for the compiler. */\ -" - - if test "$dlself" = yes; then - func_verbose "generating symbol list for \`$output'" - - $opt_dry_run || echo ': @PROGRAM@ ' > "$nlist" - - # Add our own program objects to the symbol list. - progfiles=`$ECHO "$objs$old_deplibs" | $SP2NL | $SED "$lo2o" | $NL2SP` - for progfile in $progfiles; do - func_to_tool_file "$progfile" func_convert_file_msys_to_w32 - func_verbose "extracting global C symbols from \`$func_to_tool_file_result'" - $opt_dry_run || eval "$NM $func_to_tool_file_result | $global_symbol_pipe >> '$nlist'" - done - - if test -n "$exclude_expsyms"; then - $opt_dry_run || { - eval '$EGREP -v " ($exclude_expsyms)$" "$nlist" > "$nlist"T' - eval '$MV "$nlist"T "$nlist"' - } - fi - - if test -n "$export_symbols_regex"; then - $opt_dry_run || { - eval '$EGREP -e "$export_symbols_regex" "$nlist" > "$nlist"T' - eval '$MV "$nlist"T "$nlist"' - } - fi - - # Prepare the list of exported symbols - if test -z "$export_symbols"; then - export_symbols="$output_objdir/$outputname.exp" - $opt_dry_run || { - $RM $export_symbols - eval "${SED} -n -e '/^: @PROGRAM@ $/d' -e 's/^.* \(.*\)$/\1/p' "'< "$nlist" > "$export_symbols"' - case $host in - *cygwin* | *mingw* | *cegcc* ) - eval "echo EXPORTS "'> "$output_objdir/$outputname.def"' - eval 'cat "$export_symbols" >> "$output_objdir/$outputname.def"' - ;; - esac - } - else - $opt_dry_run || { - eval "${SED} -e 's/\([].[*^$]\)/\\\\\1/g' -e 's/^/ /' -e 's/$/$/'"' < "$export_symbols" > "$output_objdir/$outputname.exp"' - eval '$GREP -f "$output_objdir/$outputname.exp" < "$nlist" > "$nlist"T' - eval '$MV "$nlist"T "$nlist"' - case $host in - *cygwin* | *mingw* | *cegcc* ) - eval "echo EXPORTS "'> "$output_objdir/$outputname.def"' - eval 'cat "$nlist" >> "$output_objdir/$outputname.def"' - ;; - esac - } - fi - fi - - for dlprefile in $dlprefiles; do - func_verbose "extracting global C symbols from \`$dlprefile'" - func_basename "$dlprefile" - name="$func_basename_result" - case $host in - *cygwin* | *mingw* | *cegcc* ) - # if an import library, we need to obtain dlname - if func_win32_import_lib_p "$dlprefile"; then - func_tr_sh "$dlprefile" - eval "curr_lafile=\$libfile_$func_tr_sh_result" - dlprefile_dlbasename="" - if test -n "$curr_lafile" && func_lalib_p "$curr_lafile"; then - # Use subshell, to avoid clobbering current variable values - dlprefile_dlname=`source "$curr_lafile" && echo "$dlname"` - if test -n "$dlprefile_dlname" ; then - func_basename "$dlprefile_dlname" - dlprefile_dlbasename="$func_basename_result" - else - # no lafile. user explicitly requested -dlpreopen . - $sharedlib_from_linklib_cmd "$dlprefile" - dlprefile_dlbasename=$sharedlib_from_linklib_result - fi - fi - $opt_dry_run || { - if test -n "$dlprefile_dlbasename" ; then - eval '$ECHO ": $dlprefile_dlbasename" >> "$nlist"' - else - func_warning "Could not compute DLL name from $name" - eval '$ECHO ": $name " >> "$nlist"' - fi - func_to_tool_file "$dlprefile" func_convert_file_msys_to_w32 - eval "$NM \"$func_to_tool_file_result\" 2>/dev/null | $global_symbol_pipe | - $SED -e '/I __imp/d' -e 's/I __nm_/D /;s/_nm__//' >> '$nlist'" - } - else # not an import lib - $opt_dry_run || { - eval '$ECHO ": $name " >> "$nlist"' - func_to_tool_file "$dlprefile" func_convert_file_msys_to_w32 - eval "$NM \"$func_to_tool_file_result\" 2>/dev/null | $global_symbol_pipe >> '$nlist'" - } - fi - ;; - *) - $opt_dry_run || { - eval '$ECHO ": $name " >> "$nlist"' - func_to_tool_file "$dlprefile" func_convert_file_msys_to_w32 - eval "$NM \"$func_to_tool_file_result\" 2>/dev/null | $global_symbol_pipe >> '$nlist'" - } - ;; - esac - done - - $opt_dry_run || { - # Make sure we have at least an empty file. - test -f "$nlist" || : > "$nlist" - - if test -n "$exclude_expsyms"; then - $EGREP -v " ($exclude_expsyms)$" "$nlist" > "$nlist"T - $MV "$nlist"T "$nlist" - fi - - # Try sorting and uniquifying the output. - if $GREP -v "^: " < "$nlist" | - if sort -k 3 /dev/null 2>&1; then - sort -k 3 - else - sort +2 - fi | - uniq > "$nlist"S; then - : - else - $GREP -v "^: " < "$nlist" > "$nlist"S - fi - - if test -f "$nlist"S; then - eval "$global_symbol_to_cdecl"' < "$nlist"S >> "$output_objdir/$my_dlsyms"' - else - echo '/* NONE */' >> "$output_objdir/$my_dlsyms" - fi - - echo >> "$output_objdir/$my_dlsyms" "\ - -/* The mapping between symbol names and symbols. */ -typedef struct { - const char *name; - void *address; -} lt_dlsymlist; -extern LT_DLSYM_CONST lt_dlsymlist -lt_${my_prefix}_LTX_preloaded_symbols[]; -LT_DLSYM_CONST lt_dlsymlist -lt_${my_prefix}_LTX_preloaded_symbols[] = -{\ - { \"$my_originator\", (void *) 0 }," - - case $need_lib_prefix in - no) - eval "$global_symbol_to_c_name_address" < "$nlist" >> "$output_objdir/$my_dlsyms" - ;; - *) - eval "$global_symbol_to_c_name_address_lib_prefix" < "$nlist" >> "$output_objdir/$my_dlsyms" - ;; - esac - echo >> "$output_objdir/$my_dlsyms" "\ - {0, (void *) 0} -}; - -/* This works around a problem in FreeBSD linker */ -#ifdef FREEBSD_WORKAROUND -static const void *lt_preloaded_setup() { - return lt_${my_prefix}_LTX_preloaded_symbols; -} -#endif - -#ifdef __cplusplus -} -#endif\ -" - } # !$opt_dry_run - - pic_flag_for_symtable= - case "$compile_command " in - *" -static "*) ;; - *) - case $host in - # compiling the symbol table file with pic_flag works around - # a FreeBSD bug that causes programs to crash when -lm is - # linked before any other PIC object. But we must not use - # pic_flag when linking with -static. The problem exists in - # FreeBSD 2.2.6 and is fixed in FreeBSD 3.1. - *-*-freebsd2.*|*-*-freebsd3.0*|*-*-freebsdelf3.0*) - pic_flag_for_symtable=" $pic_flag -DFREEBSD_WORKAROUND" ;; - *-*-hpux*) - pic_flag_for_symtable=" $pic_flag" ;; - *) - if test "X$my_pic_p" != Xno; then - pic_flag_for_symtable=" $pic_flag" - fi - ;; - esac - ;; - esac - symtab_cflags= - for arg in $LTCFLAGS; do - case $arg in - -pie | -fpie | -fPIE) ;; - *) func_append symtab_cflags " $arg" ;; - esac - done - - # Now compile the dynamic symbol file. - func_show_eval '(cd $output_objdir && $LTCC$symtab_cflags -c$no_builtin_flag$pic_flag_for_symtable "$my_dlsyms")' 'exit $?' - - # Clean up the generated files. - func_show_eval '$RM "$output_objdir/$my_dlsyms" "$nlist" "${nlist}S" "${nlist}T"' - - # Transform the symbol file into the correct name. - symfileobj="$output_objdir/${my_outputname}S.$objext" - case $host in - *cygwin* | *mingw* | *cegcc* ) - if test -f "$output_objdir/$my_outputname.def"; then - compile_command=`$ECHO "$compile_command" | $SED "s%@SYMFILE@%$output_objdir/$my_outputname.def $symfileobj%"` - finalize_command=`$ECHO "$finalize_command" | $SED "s%@SYMFILE@%$output_objdir/$my_outputname.def $symfileobj%"` - else - compile_command=`$ECHO "$compile_command" | $SED "s%@SYMFILE@%$symfileobj%"` - finalize_command=`$ECHO "$finalize_command" | $SED "s%@SYMFILE@%$symfileobj%"` - fi - ;; - *) - compile_command=`$ECHO "$compile_command" | $SED "s%@SYMFILE@%$symfileobj%"` - finalize_command=`$ECHO "$finalize_command" | $SED "s%@SYMFILE@%$symfileobj%"` - ;; - esac - ;; - *) - func_fatal_error "unknown suffix for \`$my_dlsyms'" - ;; - esac - else - # We keep going just in case the user didn't refer to - # lt_preloaded_symbols. The linker will fail if global_symbol_pipe - # really was required. - - # Nullify the symbol file. - compile_command=`$ECHO "$compile_command" | $SED "s% @SYMFILE@%%"` - finalize_command=`$ECHO "$finalize_command" | $SED "s% @SYMFILE@%%"` - fi -} - -# func_win32_libid arg -# return the library type of file 'arg' -# -# Need a lot of goo to handle *both* DLLs and import libs -# Has to be a shell function in order to 'eat' the argument -# that is supplied when $file_magic_command is called. -# Despite the name, also deal with 64 bit binaries. -func_win32_libid () -{ - $opt_debug - win32_libid_type="unknown" - win32_fileres=`file -L $1 2>/dev/null` - case $win32_fileres in - *ar\ archive\ import\ library*) # definitely import - win32_libid_type="x86 archive import" - ;; - *ar\ archive*) # could be an import, or static - # Keep the egrep pattern in sync with the one in _LT_CHECK_MAGIC_METHOD. - if eval $OBJDUMP -f $1 | $SED -e '10q' 2>/dev/null | - $EGREP 'file format (pei*-i386(.*architecture: i386)?|pe-arm-wince|pe-x86-64)' >/dev/null; then - func_to_tool_file "$1" func_convert_file_msys_to_w32 - win32_nmres=`eval $NM -f posix -A \"$func_to_tool_file_result\" | - $SED -n -e ' - 1,100{ - / I /{ - s,.*,import, - p - q - } - }'` - case $win32_nmres in - import*) win32_libid_type="x86 archive import";; - *) win32_libid_type="x86 archive static";; - esac - fi - ;; - *DLL*) - win32_libid_type="x86 DLL" - ;; - *executable*) # but shell scripts are "executable" too... - case $win32_fileres in - *MS\ Windows\ PE\ Intel*) - win32_libid_type="x86 DLL" - ;; - esac - ;; - esac - $ECHO "$win32_libid_type" -} - -# func_cygming_dll_for_implib ARG -# -# Platform-specific function to extract the -# name of the DLL associated with the specified -# import library ARG. -# Invoked by eval'ing the libtool variable -# $sharedlib_from_linklib_cmd -# Result is available in the variable -# $sharedlib_from_linklib_result -func_cygming_dll_for_implib () -{ - $opt_debug - sharedlib_from_linklib_result=`$DLLTOOL --identify-strict --identify "$1"` -} - -# func_cygming_dll_for_implib_fallback_core SECTION_NAME LIBNAMEs -# -# The is the core of a fallback implementation of a -# platform-specific function to extract the name of the -# DLL associated with the specified import library LIBNAME. -# -# SECTION_NAME is either .idata$6 or .idata$7, depending -# on the platform and compiler that created the implib. -# -# Echos the name of the DLL associated with the -# specified import library. -func_cygming_dll_for_implib_fallback_core () -{ - $opt_debug - match_literal=`$ECHO "$1" | $SED "$sed_make_literal_regex"` - $OBJDUMP -s --section "$1" "$2" 2>/dev/null | - $SED '/^Contents of section '"$match_literal"':/{ - # Place marker at beginning of archive member dllname section - s/.*/====MARK====/ - p - d - } - # These lines can sometimes be longer than 43 characters, but - # are always uninteresting - /:[ ]*file format pe[i]\{,1\}-/d - /^In archive [^:]*:/d - # Ensure marker is printed - /^====MARK====/p - # Remove all lines with less than 43 characters - /^.\{43\}/!d - # From remaining lines, remove first 43 characters - s/^.\{43\}//' | - $SED -n ' - # Join marker and all lines until next marker into a single line - /^====MARK====/ b para - H - $ b para - b - :para - x - s/\n//g - # Remove the marker - s/^====MARK====// - # Remove trailing dots and whitespace - s/[\. \t]*$// - # Print - /./p' | - # we now have a list, one entry per line, of the stringified - # contents of the appropriate section of all members of the - # archive which possess that section. Heuristic: eliminate - # all those which have a first or second character that is - # a '.' (that is, objdump's representation of an unprintable - # character.) This should work for all archives with less than - # 0x302f exports -- but will fail for DLLs whose name actually - # begins with a literal '.' or a single character followed by - # a '.'. - # - # Of those that remain, print the first one. - $SED -e '/^\./d;/^.\./d;q' -} - -# func_cygming_gnu_implib_p ARG -# This predicate returns with zero status (TRUE) if -# ARG is a GNU/binutils-style import library. Returns -# with nonzero status (FALSE) otherwise. -func_cygming_gnu_implib_p () -{ - $opt_debug - func_to_tool_file "$1" func_convert_file_msys_to_w32 - func_cygming_gnu_implib_tmp=`$NM "$func_to_tool_file_result" | eval "$global_symbol_pipe" | $EGREP ' (_head_[A-Za-z0-9_]+_[ad]l*|[A-Za-z0-9_]+_[ad]l*_iname)$'` - test -n "$func_cygming_gnu_implib_tmp" -} - -# func_cygming_ms_implib_p ARG -# This predicate returns with zero status (TRUE) if -# ARG is an MS-style import library. Returns -# with nonzero status (FALSE) otherwise. -func_cygming_ms_implib_p () -{ - $opt_debug - func_to_tool_file "$1" func_convert_file_msys_to_w32 - func_cygming_ms_implib_tmp=`$NM "$func_to_tool_file_result" | eval "$global_symbol_pipe" | $GREP '_NULL_IMPORT_DESCRIPTOR'` - test -n "$func_cygming_ms_implib_tmp" -} - -# func_cygming_dll_for_implib_fallback ARG -# Platform-specific function to extract the -# name of the DLL associated with the specified -# import library ARG. -# -# This fallback implementation is for use when $DLLTOOL -# does not support the --identify-strict option. -# Invoked by eval'ing the libtool variable -# $sharedlib_from_linklib_cmd -# Result is available in the variable -# $sharedlib_from_linklib_result -func_cygming_dll_for_implib_fallback () -{ - $opt_debug - if func_cygming_gnu_implib_p "$1" ; then - # binutils import library - sharedlib_from_linklib_result=`func_cygming_dll_for_implib_fallback_core '.idata$7' "$1"` - elif func_cygming_ms_implib_p "$1" ; then - # ms-generated import library - sharedlib_from_linklib_result=`func_cygming_dll_for_implib_fallback_core '.idata$6' "$1"` - else - # unknown - sharedlib_from_linklib_result="" - fi -} - - -# func_extract_an_archive dir oldlib -func_extract_an_archive () -{ - $opt_debug - f_ex_an_ar_dir="$1"; shift - f_ex_an_ar_oldlib="$1" - if test "$lock_old_archive_extraction" = yes; then - lockfile=$f_ex_an_ar_oldlib.lock - until $opt_dry_run || ln "$progpath" "$lockfile" 2>/dev/null; do - func_echo "Waiting for $lockfile to be removed" - sleep 2 - done - fi - func_show_eval "(cd \$f_ex_an_ar_dir && $AR x \"\$f_ex_an_ar_oldlib\")" \ - 'stat=$?; rm -f "$lockfile"; exit $stat' - if test "$lock_old_archive_extraction" = yes; then - $opt_dry_run || rm -f "$lockfile" - fi - if ($AR t "$f_ex_an_ar_oldlib" | sort | sort -uc >/dev/null 2>&1); then - : - else - func_fatal_error "object name conflicts in archive: $f_ex_an_ar_dir/$f_ex_an_ar_oldlib" - fi -} - - -# func_extract_archives gentop oldlib ... -func_extract_archives () -{ - $opt_debug - my_gentop="$1"; shift - my_oldlibs=${1+"$@"} - my_oldobjs="" - my_xlib="" - my_xabs="" - my_xdir="" - - for my_xlib in $my_oldlibs; do - # Extract the objects. - case $my_xlib in - [\\/]* | [A-Za-z]:[\\/]*) my_xabs="$my_xlib" ;; - *) my_xabs=`pwd`"/$my_xlib" ;; - esac - func_basename "$my_xlib" - my_xlib="$func_basename_result" - my_xlib_u=$my_xlib - while :; do - case " $extracted_archives " in - *" $my_xlib_u "*) - func_arith $extracted_serial + 1 - extracted_serial=$func_arith_result - my_xlib_u=lt$extracted_serial-$my_xlib ;; - *) break ;; - esac - done - extracted_archives="$extracted_archives $my_xlib_u" - my_xdir="$my_gentop/$my_xlib_u" - - func_mkdir_p "$my_xdir" - - case $host in - *-darwin*) - func_verbose "Extracting $my_xabs" - # Do not bother doing anything if just a dry run - $opt_dry_run || { - darwin_orig_dir=`pwd` - cd $my_xdir || exit $? - darwin_archive=$my_xabs - darwin_curdir=`pwd` - darwin_base_archive=`basename "$darwin_archive"` - darwin_arches=`$LIPO -info "$darwin_archive" 2>/dev/null | $GREP Architectures 2>/dev/null || true` - if test -n "$darwin_arches"; then - darwin_arches=`$ECHO "$darwin_arches" | $SED -e 's/.*are://'` - darwin_arch= - func_verbose "$darwin_base_archive has multiple architectures $darwin_arches" - for darwin_arch in $darwin_arches ; do - func_mkdir_p "unfat-$$/${darwin_base_archive}-${darwin_arch}" - $LIPO -thin $darwin_arch -output "unfat-$$/${darwin_base_archive}-${darwin_arch}/${darwin_base_archive}" "${darwin_archive}" - cd "unfat-$$/${darwin_base_archive}-${darwin_arch}" - func_extract_an_archive "`pwd`" "${darwin_base_archive}" - cd "$darwin_curdir" - $RM "unfat-$$/${darwin_base_archive}-${darwin_arch}/${darwin_base_archive}" - done # $darwin_arches - ## Okay now we've a bunch of thin objects, gotta fatten them up :) - darwin_filelist=`find unfat-$$ -type f -name \*.o -print -o -name \*.lo -print | $SED -e "$basename" | sort -u` - darwin_file= - darwin_files= - for darwin_file in $darwin_filelist; do - darwin_files=`find unfat-$$ -name $darwin_file -print | sort | $NL2SP` - $LIPO -create -output "$darwin_file" $darwin_files - done # $darwin_filelist - $RM -rf unfat-$$ - cd "$darwin_orig_dir" - else - cd $darwin_orig_dir - func_extract_an_archive "$my_xdir" "$my_xabs" - fi # $darwin_arches - } # !$opt_dry_run - ;; - *) - func_extract_an_archive "$my_xdir" "$my_xabs" - ;; - esac - my_oldobjs="$my_oldobjs "`find $my_xdir -name \*.$objext -print -o -name \*.lo -print | sort | $NL2SP` - done - - func_extract_archives_result="$my_oldobjs" -} - - -# func_emit_wrapper [arg=no] -# -# Emit a libtool wrapper script on stdout. -# Don't directly open a file because we may want to -# incorporate the script contents within a cygwin/mingw -# wrapper executable. Must ONLY be called from within -# func_mode_link because it depends on a number of variables -# set therein. -# -# ARG is the value that the WRAPPER_SCRIPT_BELONGS_IN_OBJDIR -# variable will take. If 'yes', then the emitted script -# will assume that the directory in which it is stored is -# the $objdir directory. This is a cygwin/mingw-specific -# behavior. -func_emit_wrapper () -{ - func_emit_wrapper_arg1=${1-no} - - $ECHO "\ -#! $SHELL - -# $output - temporary wrapper script for $objdir/$outputname -# Generated by $PROGRAM (GNU $PACKAGE$TIMESTAMP) $VERSION -# -# The $output program cannot be directly executed until all the libtool -# libraries that it depends on are installed. -# -# This wrapper script should never be moved out of the build directory. -# If it is, it will not operate correctly. - -# Sed substitution that helps us do robust quoting. It backslashifies -# metacharacters that are still active within double-quoted strings. -sed_quote_subst='$sed_quote_subst' - -# Be Bourne compatible -if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then - emulate sh - NULLCMD=: - # Zsh 3.x and 4.x performs word splitting on \${1+\"\$@\"}, which - # is contrary to our usage. Disable this feature. - alias -g '\${1+\"\$@\"}'='\"\$@\"' - setopt NO_GLOB_SUBST -else - case \`(set -o) 2>/dev/null\` in *posix*) set -o posix;; esac -fi -BIN_SH=xpg4; export BIN_SH # for Tru64 -DUALCASE=1; export DUALCASE # for MKS sh - -# The HP-UX ksh and POSIX shell print the target directory to stdout -# if CDPATH is set. -(unset CDPATH) >/dev/null 2>&1 && unset CDPATH - -relink_command=\"$relink_command\" - -# This environment variable determines our operation mode. -if test \"\$libtool_install_magic\" = \"$magic\"; then - # install mode needs the following variables: - generated_by_libtool_version='$macro_version' - notinst_deplibs='$notinst_deplibs' -else - # When we are sourced in execute mode, \$file and \$ECHO are already set. - if test \"\$libtool_execute_magic\" != \"$magic\"; then - file=\"\$0\"" - - qECHO=`$ECHO "$ECHO" | $SED "$sed_quote_subst"` - $ECHO "\ - -# A function that is used when there is no print builtin or printf. -func_fallback_echo () -{ - eval 'cat <<_LTECHO_EOF -\$1 -_LTECHO_EOF' -} - ECHO=\"$qECHO\" - fi - -# Very basic option parsing. These options are (a) specific to -# the libtool wrapper, (b) are identical between the wrapper -# /script/ and the wrapper /executable/ which is used only on -# windows platforms, and (c) all begin with the string "--lt-" -# (application programs are unlikely to have options which match -# this pattern). -# -# There are only two supported options: --lt-debug and -# --lt-dump-script. There is, deliberately, no --lt-help. -# -# The first argument to this parsing function should be the -# script's $0 value, followed by "$@". -lt_option_debug= -func_parse_lt_options () -{ - lt_script_arg0=\$0 - shift - for lt_opt - do - case \"\$lt_opt\" in - --lt-debug) lt_option_debug=1 ;; - --lt-dump-script) - lt_dump_D=\`\$ECHO \"X\$lt_script_arg0\" | $SED -e 's/^X//' -e 's%/[^/]*$%%'\` - test \"X\$lt_dump_D\" = \"X\$lt_script_arg0\" && lt_dump_D=. - lt_dump_F=\`\$ECHO \"X\$lt_script_arg0\" | $SED -e 's/^X//' -e 's%^.*/%%'\` - cat \"\$lt_dump_D/\$lt_dump_F\" - exit 0 - ;; - --lt-*) - \$ECHO \"Unrecognized --lt- option: '\$lt_opt'\" 1>&2 - exit 1 - ;; - esac - done - - # Print the debug banner immediately: - if test -n \"\$lt_option_debug\"; then - echo \"${outputname}:${output}:\${LINENO}: libtool wrapper (GNU $PACKAGE$TIMESTAMP) $VERSION\" 1>&2 - fi -} - -# Used when --lt-debug. Prints its arguments to stdout -# (redirection is the responsibility of the caller) -func_lt_dump_args () -{ - lt_dump_args_N=1; - for lt_arg - do - \$ECHO \"${outputname}:${output}:\${LINENO}: newargv[\$lt_dump_args_N]: \$lt_arg\" - lt_dump_args_N=\`expr \$lt_dump_args_N + 1\` - done -} - -# Core function for launching the target application -func_exec_program_core () -{ -" - case $host in - # Backslashes separate directories on plain windows - *-*-mingw | *-*-os2* | *-cegcc*) - $ECHO "\ - if test -n \"\$lt_option_debug\"; then - \$ECHO \"${outputname}:${output}:\${LINENO}: newargv[0]: \$progdir\\\\\$program\" 1>&2 - func_lt_dump_args \${1+\"\$@\"} 1>&2 - fi - exec \"\$progdir\\\\\$program\" \${1+\"\$@\"} -" - ;; - - *) - $ECHO "\ - if test -n \"\$lt_option_debug\"; then - \$ECHO \"${outputname}:${output}:\${LINENO}: newargv[0]: \$progdir/\$program\" 1>&2 - func_lt_dump_args \${1+\"\$@\"} 1>&2 - fi - exec \"\$progdir/\$program\" \${1+\"\$@\"} -" - ;; - esac - $ECHO "\ - \$ECHO \"\$0: cannot exec \$program \$*\" 1>&2 - exit 1 -} - -# A function to encapsulate launching the target application -# Strips options in the --lt-* namespace from \$@ and -# launches target application with the remaining arguments. -func_exec_program () -{ - case \" \$* \" in - *\\ --lt-*) - for lt_wr_arg - do - case \$lt_wr_arg in - --lt-*) ;; - *) set x \"\$@\" \"\$lt_wr_arg\"; shift;; - esac - shift - done ;; - esac - func_exec_program_core \${1+\"\$@\"} -} - - # Parse options - func_parse_lt_options \"\$0\" \${1+\"\$@\"} - - # Find the directory that this script lives in. - thisdir=\`\$ECHO \"\$file\" | $SED 's%/[^/]*$%%'\` - test \"x\$thisdir\" = \"x\$file\" && thisdir=. - - # Follow symbolic links until we get to the real thisdir. - file=\`ls -ld \"\$file\" | $SED -n 's/.*-> //p'\` - while test -n \"\$file\"; do - destdir=\`\$ECHO \"\$file\" | $SED 's%/[^/]*\$%%'\` - - # If there was a directory component, then change thisdir. - if test \"x\$destdir\" != \"x\$file\"; then - case \"\$destdir\" in - [\\\\/]* | [A-Za-z]:[\\\\/]*) thisdir=\"\$destdir\" ;; - *) thisdir=\"\$thisdir/\$destdir\" ;; - esac - fi - - file=\`\$ECHO \"\$file\" | $SED 's%^.*/%%'\` - file=\`ls -ld \"\$thisdir/\$file\" | $SED -n 's/.*-> //p'\` - done - - # Usually 'no', except on cygwin/mingw when embedded into - # the cwrapper. - WRAPPER_SCRIPT_BELONGS_IN_OBJDIR=$func_emit_wrapper_arg1 - if test \"\$WRAPPER_SCRIPT_BELONGS_IN_OBJDIR\" = \"yes\"; then - # special case for '.' - if test \"\$thisdir\" = \".\"; then - thisdir=\`pwd\` - fi - # remove .libs from thisdir - case \"\$thisdir\" in - *[\\\\/]$objdir ) thisdir=\`\$ECHO \"\$thisdir\" | $SED 's%[\\\\/][^\\\\/]*$%%'\` ;; - $objdir ) thisdir=. ;; - esac - fi - - # Try to get the absolute directory name. - absdir=\`cd \"\$thisdir\" && pwd\` - test -n \"\$absdir\" && thisdir=\"\$absdir\" -" - - if test "$fast_install" = yes; then - $ECHO "\ - program=lt-'$outputname'$exeext - progdir=\"\$thisdir/$objdir\" - - if test ! -f \"\$progdir/\$program\" || - { file=\`ls -1dt \"\$progdir/\$program\" \"\$progdir/../\$program\" 2>/dev/null | ${SED} 1q\`; \\ - test \"X\$file\" != \"X\$progdir/\$program\"; }; then - - file=\"\$\$-\$program\" - - if test ! -d \"\$progdir\"; then - $MKDIR \"\$progdir\" - else - $RM \"\$progdir/\$file\" - fi" - - $ECHO "\ - - # relink executable if necessary - if test -n \"\$relink_command\"; then - if relink_command_output=\`eval \$relink_command 2>&1\`; then : - else - $ECHO \"\$relink_command_output\" >&2 - $RM \"\$progdir/\$file\" - exit 1 - fi - fi - - $MV \"\$progdir/\$file\" \"\$progdir/\$program\" 2>/dev/null || - { $RM \"\$progdir/\$program\"; - $MV \"\$progdir/\$file\" \"\$progdir/\$program\"; } - $RM \"\$progdir/\$file\" - fi" - else - $ECHO "\ - program='$outputname' - progdir=\"\$thisdir/$objdir\" -" - fi - - $ECHO "\ - - if test -f \"\$progdir/\$program\"; then" - - # fixup the dll searchpath if we need to. - # - # Fix the DLL searchpath if we need to. Do this before prepending - # to shlibpath, because on Windows, both are PATH and uninstalled - # libraries must come first. - if test -n "$dllsearchpath"; then - $ECHO "\ - # Add the dll search path components to the executable PATH - PATH=$dllsearchpath:\$PATH -" - fi - - # Export our shlibpath_var if we have one. - if test "$shlibpath_overrides_runpath" = yes && test -n "$shlibpath_var" && test -n "$temp_rpath"; then - $ECHO "\ - # Add our own library path to $shlibpath_var - $shlibpath_var=\"$temp_rpath\$$shlibpath_var\" - - # Some systems cannot cope with colon-terminated $shlibpath_var - # The second colon is a workaround for a bug in BeOS R4 sed - $shlibpath_var=\`\$ECHO \"\$$shlibpath_var\" | $SED 's/::*\$//'\` - - export $shlibpath_var -" - fi - - $ECHO "\ - if test \"\$libtool_execute_magic\" != \"$magic\"; then - # Run the actual program with our arguments. - func_exec_program \${1+\"\$@\"} - fi - else - # The program doesn't exist. - \$ECHO \"\$0: error: \\\`\$progdir/\$program' does not exist\" 1>&2 - \$ECHO \"This script is just a wrapper for \$program.\" 1>&2 - \$ECHO \"See the $PACKAGE documentation for more information.\" 1>&2 - exit 1 - fi -fi\ -" -} - - -# func_emit_cwrapperexe_src -# emit the source code for a wrapper executable on stdout -# Must ONLY be called from within func_mode_link because -# it depends on a number of variable set therein. -func_emit_cwrapperexe_src () -{ - cat < -#include -#ifdef _MSC_VER -# include -# include -# include -#else -# include -# include -# ifdef __CYGWIN__ -# include -# endif -#endif -#include -#include -#include -#include -#include -#include -#include -#include - -/* declarations of non-ANSI functions */ -#if defined(__MINGW32__) -# ifdef __STRICT_ANSI__ -int _putenv (const char *); -# endif -#elif defined(__CYGWIN__) -# ifdef __STRICT_ANSI__ -char *realpath (const char *, char *); -int putenv (char *); -int setenv (const char *, const char *, int); -# endif -/* #elif defined (other platforms) ... */ -#endif - -/* portability defines, excluding path handling macros */ -#if defined(_MSC_VER) -# define setmode _setmode -# define stat _stat -# define chmod _chmod -# define getcwd _getcwd -# define putenv _putenv -# define S_IXUSR _S_IEXEC -# ifndef _INTPTR_T_DEFINED -# define _INTPTR_T_DEFINED -# define intptr_t int -# endif -#elif defined(__MINGW32__) -# define setmode _setmode -# define stat _stat -# define chmod _chmod -# define getcwd _getcwd -# define putenv _putenv -#elif defined(__CYGWIN__) -# define HAVE_SETENV -# define FOPEN_WB "wb" -/* #elif defined (other platforms) ... */ -#endif - -#if defined(PATH_MAX) -# define LT_PATHMAX PATH_MAX -#elif defined(MAXPATHLEN) -# define LT_PATHMAX MAXPATHLEN -#else -# define LT_PATHMAX 1024 -#endif - -#ifndef S_IXOTH -# define S_IXOTH 0 -#endif -#ifndef S_IXGRP -# define S_IXGRP 0 -#endif - -/* path handling portability macros */ -#ifndef DIR_SEPARATOR -# define DIR_SEPARATOR '/' -# define PATH_SEPARATOR ':' -#endif - -#if defined (_WIN32) || defined (__MSDOS__) || defined (__DJGPP__) || \ - defined (__OS2__) -# define HAVE_DOS_BASED_FILE_SYSTEM -# define FOPEN_WB "wb" -# ifndef DIR_SEPARATOR_2 -# define DIR_SEPARATOR_2 '\\' -# endif -# ifndef PATH_SEPARATOR_2 -# define PATH_SEPARATOR_2 ';' -# endif -#endif - -#ifndef DIR_SEPARATOR_2 -# define IS_DIR_SEPARATOR(ch) ((ch) == DIR_SEPARATOR) -#else /* DIR_SEPARATOR_2 */ -# define IS_DIR_SEPARATOR(ch) \ - (((ch) == DIR_SEPARATOR) || ((ch) == DIR_SEPARATOR_2)) -#endif /* DIR_SEPARATOR_2 */ - -#ifndef PATH_SEPARATOR_2 -# define IS_PATH_SEPARATOR(ch) ((ch) == PATH_SEPARATOR) -#else /* PATH_SEPARATOR_2 */ -# define IS_PATH_SEPARATOR(ch) ((ch) == PATH_SEPARATOR_2) -#endif /* PATH_SEPARATOR_2 */ - -#ifndef FOPEN_WB -# define FOPEN_WB "w" -#endif -#ifndef _O_BINARY -# define _O_BINARY 0 -#endif - -#define XMALLOC(type, num) ((type *) xmalloc ((num) * sizeof(type))) -#define XFREE(stale) do { \ - if (stale) { free ((void *) stale); stale = 0; } \ -} while (0) - -#if defined(LT_DEBUGWRAPPER) -static int lt_debug = 1; -#else -static int lt_debug = 0; -#endif - -const char *program_name = "libtool-wrapper"; /* in case xstrdup fails */ - -void *xmalloc (size_t num); -char *xstrdup (const char *string); -const char *base_name (const char *name); -char *find_executable (const char *wrapper); -char *chase_symlinks (const char *pathspec); -int make_executable (const char *path); -int check_executable (const char *path); -char *strendzap (char *str, const char *pat); -void lt_debugprintf (const char *file, int line, const char *fmt, ...); -void lt_fatal (const char *file, int line, const char *message, ...); -static const char *nonnull (const char *s); -static const char *nonempty (const char *s); -void lt_setenv (const char *name, const char *value); -char *lt_extend_str (const char *orig_value, const char *add, int to_end); -void lt_update_exe_path (const char *name, const char *value); -void lt_update_lib_path (const char *name, const char *value); -char **prepare_spawn (char **argv); -void lt_dump_script (FILE *f); -EOF - - cat <= 0) - && (st.st_mode & (S_IXUSR | S_IXGRP | S_IXOTH))) - return 1; - else - return 0; -} - -int -make_executable (const char *path) -{ - int rval = 0; - struct stat st; - - lt_debugprintf (__FILE__, __LINE__, "(make_executable): %s\n", - nonempty (path)); - if ((!path) || (!*path)) - return 0; - - if (stat (path, &st) >= 0) - { - rval = chmod (path, st.st_mode | S_IXOTH | S_IXGRP | S_IXUSR); - } - return rval; -} - -/* Searches for the full path of the wrapper. Returns - newly allocated full path name if found, NULL otherwise - Does not chase symlinks, even on platforms that support them. -*/ -char * -find_executable (const char *wrapper) -{ - int has_slash = 0; - const char *p; - const char *p_next; - /* static buffer for getcwd */ - char tmp[LT_PATHMAX + 1]; - int tmp_len; - char *concat_name; - - lt_debugprintf (__FILE__, __LINE__, "(find_executable): %s\n", - nonempty (wrapper)); - - if ((wrapper == NULL) || (*wrapper == '\0')) - return NULL; - - /* Absolute path? */ -#if defined (HAVE_DOS_BASED_FILE_SYSTEM) - if (isalpha ((unsigned char) wrapper[0]) && wrapper[1] == ':') - { - concat_name = xstrdup (wrapper); - if (check_executable (concat_name)) - return concat_name; - XFREE (concat_name); - } - else - { -#endif - if (IS_DIR_SEPARATOR (wrapper[0])) - { - concat_name = xstrdup (wrapper); - if (check_executable (concat_name)) - return concat_name; - XFREE (concat_name); - } -#if defined (HAVE_DOS_BASED_FILE_SYSTEM) - } -#endif - - for (p = wrapper; *p; p++) - if (*p == '/') - { - has_slash = 1; - break; - } - if (!has_slash) - { - /* no slashes; search PATH */ - const char *path = getenv ("PATH"); - if (path != NULL) - { - for (p = path; *p; p = p_next) - { - const char *q; - size_t p_len; - for (q = p; *q; q++) - if (IS_PATH_SEPARATOR (*q)) - break; - p_len = q - p; - p_next = (*q == '\0' ? q : q + 1); - if (p_len == 0) - { - /* empty path: current directory */ - if (getcwd (tmp, LT_PATHMAX) == NULL) - lt_fatal (__FILE__, __LINE__, "getcwd failed: %s", - nonnull (strerror (errno))); - tmp_len = strlen (tmp); - concat_name = - XMALLOC (char, tmp_len + 1 + strlen (wrapper) + 1); - memcpy (concat_name, tmp, tmp_len); - concat_name[tmp_len] = '/'; - strcpy (concat_name + tmp_len + 1, wrapper); - } - else - { - concat_name = - XMALLOC (char, p_len + 1 + strlen (wrapper) + 1); - memcpy (concat_name, p, p_len); - concat_name[p_len] = '/'; - strcpy (concat_name + p_len + 1, wrapper); - } - if (check_executable (concat_name)) - return concat_name; - XFREE (concat_name); - } - } - /* not found in PATH; assume curdir */ - } - /* Relative path | not found in path: prepend cwd */ - if (getcwd (tmp, LT_PATHMAX) == NULL) - lt_fatal (__FILE__, __LINE__, "getcwd failed: %s", - nonnull (strerror (errno))); - tmp_len = strlen (tmp); - concat_name = XMALLOC (char, tmp_len + 1 + strlen (wrapper) + 1); - memcpy (concat_name, tmp, tmp_len); - concat_name[tmp_len] = '/'; - strcpy (concat_name + tmp_len + 1, wrapper); - - if (check_executable (concat_name)) - return concat_name; - XFREE (concat_name); - return NULL; -} - -char * -chase_symlinks (const char *pathspec) -{ -#ifndef S_ISLNK - return xstrdup (pathspec); -#else - char buf[LT_PATHMAX]; - struct stat s; - char *tmp_pathspec = xstrdup (pathspec); - char *p; - int has_symlinks = 0; - while (strlen (tmp_pathspec) && !has_symlinks) - { - lt_debugprintf (__FILE__, __LINE__, - "checking path component for symlinks: %s\n", - tmp_pathspec); - if (lstat (tmp_pathspec, &s) == 0) - { - if (S_ISLNK (s.st_mode) != 0) - { - has_symlinks = 1; - break; - } - - /* search backwards for last DIR_SEPARATOR */ - p = tmp_pathspec + strlen (tmp_pathspec) - 1; - while ((p > tmp_pathspec) && (!IS_DIR_SEPARATOR (*p))) - p--; - if ((p == tmp_pathspec) && (!IS_DIR_SEPARATOR (*p))) - { - /* no more DIR_SEPARATORS left */ - break; - } - *p = '\0'; - } - else - { - lt_fatal (__FILE__, __LINE__, - "error accessing file \"%s\": %s", - tmp_pathspec, nonnull (strerror (errno))); - } - } - XFREE (tmp_pathspec); - - if (!has_symlinks) - { - return xstrdup (pathspec); - } - - tmp_pathspec = realpath (pathspec, buf); - if (tmp_pathspec == 0) - { - lt_fatal (__FILE__, __LINE__, - "could not follow symlinks for %s", pathspec); - } - return xstrdup (tmp_pathspec); -#endif -} - -char * -strendzap (char *str, const char *pat) -{ - size_t len, patlen; - - assert (str != NULL); - assert (pat != NULL); - - len = strlen (str); - patlen = strlen (pat); - - if (patlen <= len) - { - str += len - patlen; - if (strcmp (str, pat) == 0) - *str = '\0'; - } - return str; -} - -void -lt_debugprintf (const char *file, int line, const char *fmt, ...) -{ - va_list args; - if (lt_debug) - { - (void) fprintf (stderr, "%s:%s:%d: ", program_name, file, line); - va_start (args, fmt); - (void) vfprintf (stderr, fmt, args); - va_end (args); - } -} - -static void -lt_error_core (int exit_status, const char *file, - int line, const char *mode, - const char *message, va_list ap) -{ - fprintf (stderr, "%s:%s:%d: %s: ", program_name, file, line, mode); - vfprintf (stderr, message, ap); - fprintf (stderr, ".\n"); - - if (exit_status >= 0) - exit (exit_status); -} - -void -lt_fatal (const char *file, int line, const char *message, ...) -{ - va_list ap; - va_start (ap, message); - lt_error_core (EXIT_FAILURE, file, line, "FATAL", message, ap); - va_end (ap); -} - -static const char * -nonnull (const char *s) -{ - return s ? s : "(null)"; -} - -static const char * -nonempty (const char *s) -{ - return (s && !*s) ? "(empty)" : nonnull (s); -} - -void -lt_setenv (const char *name, const char *value) -{ - lt_debugprintf (__FILE__, __LINE__, - "(lt_setenv) setting '%s' to '%s'\n", - nonnull (name), nonnull (value)); - { -#ifdef HAVE_SETENV - /* always make a copy, for consistency with !HAVE_SETENV */ - char *str = xstrdup (value); - setenv (name, str, 1); -#else - int len = strlen (name) + 1 + strlen (value) + 1; - char *str = XMALLOC (char, len); - sprintf (str, "%s=%s", name, value); - if (putenv (str) != EXIT_SUCCESS) - { - XFREE (str); - } -#endif - } -} - -char * -lt_extend_str (const char *orig_value, const char *add, int to_end) -{ - char *new_value; - if (orig_value && *orig_value) - { - int orig_value_len = strlen (orig_value); - int add_len = strlen (add); - new_value = XMALLOC (char, add_len + orig_value_len + 1); - if (to_end) - { - strcpy (new_value, orig_value); - strcpy (new_value + orig_value_len, add); - } - else - { - strcpy (new_value, add); - strcpy (new_value + add_len, orig_value); - } - } - else - { - new_value = xstrdup (add); - } - return new_value; -} - -void -lt_update_exe_path (const char *name, const char *value) -{ - lt_debugprintf (__FILE__, __LINE__, - "(lt_update_exe_path) modifying '%s' by prepending '%s'\n", - nonnull (name), nonnull (value)); - - if (name && *name && value && *value) - { - char *new_value = lt_extend_str (getenv (name), value, 0); - /* some systems can't cope with a ':'-terminated path #' */ - int len = strlen (new_value); - while (((len = strlen (new_value)) > 0) && IS_PATH_SEPARATOR (new_value[len-1])) - { - new_value[len-1] = '\0'; - } - lt_setenv (name, new_value); - XFREE (new_value); - } -} - -void -lt_update_lib_path (const char *name, const char *value) -{ - lt_debugprintf (__FILE__, __LINE__, - "(lt_update_lib_path) modifying '%s' by prepending '%s'\n", - nonnull (name), nonnull (value)); - - if (name && *name && value && *value) - { - char *new_value = lt_extend_str (getenv (name), value, 0); - lt_setenv (name, new_value); - XFREE (new_value); - } -} - -EOF - case $host_os in - mingw*) - cat <<"EOF" - -/* Prepares an argument vector before calling spawn(). - Note that spawn() does not by itself call the command interpreter - (getenv ("COMSPEC") != NULL ? getenv ("COMSPEC") : - ({ OSVERSIONINFO v; v.dwOSVersionInfoSize = sizeof(OSVERSIONINFO); - GetVersionEx(&v); - v.dwPlatformId == VER_PLATFORM_WIN32_NT; - }) ? "cmd.exe" : "command.com"). - Instead it simply concatenates the arguments, separated by ' ', and calls - CreateProcess(). We must quote the arguments since Win32 CreateProcess() - interprets characters like ' ', '\t', '\\', '"' (but not '<' and '>') in a - special way: - - Space and tab are interpreted as delimiters. They are not treated as - delimiters if they are surrounded by double quotes: "...". - - Unescaped double quotes are removed from the input. Their only effect is - that within double quotes, space and tab are treated like normal - characters. - - Backslashes not followed by double quotes are not special. - - But 2*n+1 backslashes followed by a double quote become - n backslashes followed by a double quote (n >= 0): - \" -> " - \\\" -> \" - \\\\\" -> \\" - */ -#define SHELL_SPECIAL_CHARS "\"\\ \001\002\003\004\005\006\007\010\011\012\013\014\015\016\017\020\021\022\023\024\025\026\027\030\031\032\033\034\035\036\037" -#define SHELL_SPACE_CHARS " \001\002\003\004\005\006\007\010\011\012\013\014\015\016\017\020\021\022\023\024\025\026\027\030\031\032\033\034\035\036\037" -char ** -prepare_spawn (char **argv) -{ - size_t argc; - char **new_argv; - size_t i; - - /* Count number of arguments. */ - for (argc = 0; argv[argc] != NULL; argc++) - ; - - /* Allocate new argument vector. */ - new_argv = XMALLOC (char *, argc + 1); - - /* Put quoted arguments into the new argument vector. */ - for (i = 0; i < argc; i++) - { - const char *string = argv[i]; - - if (string[0] == '\0') - new_argv[i] = xstrdup ("\"\""); - else if (strpbrk (string, SHELL_SPECIAL_CHARS) != NULL) - { - int quote_around = (strpbrk (string, SHELL_SPACE_CHARS) != NULL); - size_t length; - unsigned int backslashes; - const char *s; - char *quoted_string; - char *p; - - length = 0; - backslashes = 0; - if (quote_around) - length++; - for (s = string; *s != '\0'; s++) - { - char c = *s; - if (c == '"') - length += backslashes + 1; - length++; - if (c == '\\') - backslashes++; - else - backslashes = 0; - } - if (quote_around) - length += backslashes + 1; - - quoted_string = XMALLOC (char, length + 1); - - p = quoted_string; - backslashes = 0; - if (quote_around) - *p++ = '"'; - for (s = string; *s != '\0'; s++) - { - char c = *s; - if (c == '"') - { - unsigned int j; - for (j = backslashes + 1; j > 0; j--) - *p++ = '\\'; - } - *p++ = c; - if (c == '\\') - backslashes++; - else - backslashes = 0; - } - if (quote_around) - { - unsigned int j; - for (j = backslashes; j > 0; j--) - *p++ = '\\'; - *p++ = '"'; - } - *p = '\0'; - - new_argv[i] = quoted_string; - } - else - new_argv[i] = (char *) string; - } - new_argv[argc] = NULL; - - return new_argv; -} -EOF - ;; - esac - - cat <<"EOF" -void lt_dump_script (FILE* f) -{ -EOF - func_emit_wrapper yes | - $SED -n -e ' -s/^\(.\{79\}\)\(..*\)/\1\ -\2/ -h -s/\([\\"]\)/\\\1/g -s/$/\\n/ -s/\([^\n]*\).*/ fputs ("\1", f);/p -g -D' - cat <<"EOF" -} -EOF -} -# end: func_emit_cwrapperexe_src - -# func_win32_import_lib_p ARG -# True if ARG is an import lib, as indicated by $file_magic_cmd -func_win32_import_lib_p () -{ - $opt_debug - case `eval $file_magic_cmd \"\$1\" 2>/dev/null | $SED -e 10q` in - *import*) : ;; - *) false ;; - esac -} - -# func_mode_link arg... -func_mode_link () -{ - $opt_debug - case $host in - *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*) - # It is impossible to link a dll without this setting, and - # we shouldn't force the makefile maintainer to figure out - # which system we are compiling for in order to pass an extra - # flag for every libtool invocation. - # allow_undefined=no - - # FIXME: Unfortunately, there are problems with the above when trying - # to make a dll which has undefined symbols, in which case not - # even a static library is built. For now, we need to specify - # -no-undefined on the libtool link line when we can be certain - # that all symbols are satisfied, otherwise we get a static library. - allow_undefined=yes - ;; - *) - allow_undefined=yes - ;; - esac - libtool_args=$nonopt - base_compile="$nonopt $@" - compile_command=$nonopt - finalize_command=$nonopt - - compile_rpath= - finalize_rpath= - compile_shlibpath= - finalize_shlibpath= - convenience= - old_convenience= - deplibs= - old_deplibs= - compiler_flags= - linker_flags= - dllsearchpath= - lib_search_path=`pwd` - inst_prefix_dir= - new_inherited_linker_flags= - - avoid_version=no - bindir= - dlfiles= - dlprefiles= - dlself=no - export_dynamic=no - export_symbols= - export_symbols_regex= - generated= - libobjs= - ltlibs= - module=no - no_install=no - objs= - non_pic_objects= - precious_files_regex= - prefer_static_libs=no - preload=no - prev= - prevarg= - release= - rpath= - xrpath= - perm_rpath= - temp_rpath= - thread_safe=no - vinfo= - vinfo_number=no - weak_libs= - single_module="${wl}-single_module" - func_infer_tag $base_compile - - # We need to know -static, to get the right output filenames. - for arg - do - case $arg in - -shared) - test "$build_libtool_libs" != yes && \ - func_fatal_configuration "can not build a shared library" - build_old_libs=no - break - ;; - -all-static | -static | -static-libtool-libs) - case $arg in - -all-static) - if test "$build_libtool_libs" = yes && test -z "$link_static_flag"; then - func_warning "complete static linking is impossible in this configuration" - fi - if test -n "$link_static_flag"; then - dlopen_self=$dlopen_self_static - fi - prefer_static_libs=yes - ;; - -static) - if test -z "$pic_flag" && test -n "$link_static_flag"; then - dlopen_self=$dlopen_self_static - fi - prefer_static_libs=built - ;; - -static-libtool-libs) - if test -z "$pic_flag" && test -n "$link_static_flag"; then - dlopen_self=$dlopen_self_static - fi - prefer_static_libs=yes - ;; - esac - build_libtool_libs=no - build_old_libs=yes - break - ;; - esac - done - - # See if our shared archives depend on static archives. - test -n "$old_archive_from_new_cmds" && build_old_libs=yes - - # Go through the arguments, transforming them on the way. - while test "$#" -gt 0; do - arg="$1" - shift - func_quote_for_eval "$arg" - qarg=$func_quote_for_eval_unquoted_result - func_append libtool_args " $func_quote_for_eval_result" - - # If the previous option needs an argument, assign it. - if test -n "$prev"; then - case $prev in - output) - func_append compile_command " @OUTPUT@" - func_append finalize_command " @OUTPUT@" - ;; - esac - - case $prev in - bindir) - bindir="$arg" - prev= - continue - ;; - dlfiles|dlprefiles) - if test "$preload" = no; then - # Add the symbol object into the linking commands. - func_append compile_command " @SYMFILE@" - func_append finalize_command " @SYMFILE@" - preload=yes - fi - case $arg in - *.la | *.lo) ;; # We handle these cases below. - force) - if test "$dlself" = no; then - dlself=needless - export_dynamic=yes - fi - prev= - continue - ;; - self) - if test "$prev" = dlprefiles; then - dlself=yes - elif test "$prev" = dlfiles && test "$dlopen_self" != yes; then - dlself=yes - else - dlself=needless - export_dynamic=yes - fi - prev= - continue - ;; - *) - if test "$prev" = dlfiles; then - func_append dlfiles " $arg" - else - func_append dlprefiles " $arg" - fi - prev= - continue - ;; - esac - ;; - expsyms) - export_symbols="$arg" - test -f "$arg" \ - || func_fatal_error "symbol file \`$arg' does not exist" - prev= - continue - ;; - expsyms_regex) - export_symbols_regex="$arg" - prev= - continue - ;; - framework) - case $host in - *-*-darwin*) - case "$deplibs " in - *" $qarg.ltframework "*) ;; - *) func_append deplibs " $qarg.ltframework" # this is fixed later - ;; - esac - ;; - esac - prev= - continue - ;; - inst_prefix) - inst_prefix_dir="$arg" - prev= - continue - ;; - objectlist) - if test -f "$arg"; then - save_arg=$arg - moreargs= - for fil in `cat "$save_arg"` - do -# func_append moreargs " $fil" - arg=$fil - # A libtool-controlled object. - - # Check to see that this really is a libtool object. - if func_lalib_unsafe_p "$arg"; then - pic_object= - non_pic_object= - - # Read the .lo file - func_source "$arg" - - if test -z "$pic_object" || - test -z "$non_pic_object" || - test "$pic_object" = none && - test "$non_pic_object" = none; then - func_fatal_error "cannot find name of object for \`$arg'" - fi - - # Extract subdirectory from the argument. - func_dirname "$arg" "/" "" - xdir="$func_dirname_result" - - if test "$pic_object" != none; then - # Prepend the subdirectory the object is found in. - pic_object="$xdir$pic_object" - - if test "$prev" = dlfiles; then - if test "$build_libtool_libs" = yes && test "$dlopen_support" = yes; then - func_append dlfiles " $pic_object" - prev= - continue - else - # If libtool objects are unsupported, then we need to preload. - prev=dlprefiles - fi - fi - - # CHECK ME: I think I busted this. -Ossama - if test "$prev" = dlprefiles; then - # Preload the old-style object. - func_append dlprefiles " $pic_object" - prev= - fi - - # A PIC object. - func_append libobjs " $pic_object" - arg="$pic_object" - fi - - # Non-PIC object. - if test "$non_pic_object" != none; then - # Prepend the subdirectory the object is found in. - non_pic_object="$xdir$non_pic_object" - - # A standard non-PIC object - func_append non_pic_objects " $non_pic_object" - if test -z "$pic_object" || test "$pic_object" = none ; then - arg="$non_pic_object" - fi - else - # If the PIC object exists, use it instead. - # $xdir was prepended to $pic_object above. - non_pic_object="$pic_object" - func_append non_pic_objects " $non_pic_object" - fi - else - # Only an error if not doing a dry-run. - if $opt_dry_run; then - # Extract subdirectory from the argument. - func_dirname "$arg" "/" "" - xdir="$func_dirname_result" - - func_lo2o "$arg" - pic_object=$xdir$objdir/$func_lo2o_result - non_pic_object=$xdir$func_lo2o_result - func_append libobjs " $pic_object" - func_append non_pic_objects " $non_pic_object" - else - func_fatal_error "\`$arg' is not a valid libtool object" - fi - fi - done - else - func_fatal_error "link input file \`$arg' does not exist" - fi - arg=$save_arg - prev= - continue - ;; - precious_regex) - precious_files_regex="$arg" - prev= - continue - ;; - release) - release="-$arg" - prev= - continue - ;; - rpath | xrpath) - # We need an absolute path. - case $arg in - [\\/]* | [A-Za-z]:[\\/]*) ;; - *) - func_fatal_error "only absolute run-paths are allowed" - ;; - esac - if test "$prev" = rpath; then - case "$rpath " in - *" $arg "*) ;; - *) func_append rpath " $arg" ;; - esac - else - case "$xrpath " in - *" $arg "*) ;; - *) func_append xrpath " $arg" ;; - esac - fi - prev= - continue - ;; - shrext) - shrext_cmds="$arg" - prev= - continue - ;; - weak) - func_append weak_libs " $arg" - prev= - continue - ;; - xcclinker) - func_append linker_flags " $qarg" - func_append compiler_flags " $qarg" - prev= - func_append compile_command " $qarg" - func_append finalize_command " $qarg" - continue - ;; - xcompiler) - func_append compiler_flags " $qarg" - prev= - func_append compile_command " $qarg" - func_append finalize_command " $qarg" - continue - ;; - xlinker) - func_append linker_flags " $qarg" - func_append compiler_flags " $wl$qarg" - prev= - func_append compile_command " $wl$qarg" - func_append finalize_command " $wl$qarg" - continue - ;; - *) - eval "$prev=\"\$arg\"" - prev= - continue - ;; - esac - fi # test -n "$prev" - - prevarg="$arg" - - case $arg in - -all-static) - if test -n "$link_static_flag"; then - # See comment for -static flag below, for more details. - func_append compile_command " $link_static_flag" - func_append finalize_command " $link_static_flag" - fi - continue - ;; - - -allow-undefined) - # FIXME: remove this flag sometime in the future. - func_fatal_error "\`-allow-undefined' must not be used because it is the default" - ;; - - -avoid-version) - avoid_version=yes - continue - ;; - - -bindir) - prev=bindir - continue - ;; - - -dlopen) - prev=dlfiles - continue - ;; - - -dlpreopen) - prev=dlprefiles - continue - ;; - - -export-dynamic) - export_dynamic=yes - continue - ;; - - -export-symbols | -export-symbols-regex) - if test -n "$export_symbols" || test -n "$export_symbols_regex"; then - func_fatal_error "more than one -exported-symbols argument is not allowed" - fi - if test "X$arg" = "X-export-symbols"; then - prev=expsyms - else - prev=expsyms_regex - fi - continue - ;; - - -framework) - prev=framework - continue - ;; - - -inst-prefix-dir) - prev=inst_prefix - continue - ;; - - # The native IRIX linker understands -LANG:*, -LIST:* and -LNO:* - # so, if we see these flags be careful not to treat them like -L - -L[A-Z][A-Z]*:*) - case $with_gcc/$host in - no/*-*-irix* | /*-*-irix*) - func_append compile_command " $arg" - func_append finalize_command " $arg" - ;; - esac - continue - ;; - - -L*) - func_stripname "-L" '' "$arg" - if test -z "$func_stripname_result"; then - if test "$#" -gt 0; then - func_fatal_error "require no space between \`-L' and \`$1'" - else - func_fatal_error "need path for \`-L' option" - fi - fi - func_resolve_sysroot "$func_stripname_result" - dir=$func_resolve_sysroot_result - # We need an absolute path. - case $dir in - [\\/]* | [A-Za-z]:[\\/]*) ;; - *) - absdir=`cd "$dir" && pwd` - test -z "$absdir" && \ - func_fatal_error "cannot determine absolute directory name of \`$dir'" - dir="$absdir" - ;; - esac - case "$deplibs " in - *" -L$dir "* | *" $arg "*) - # Will only happen for absolute or sysroot arguments - ;; - *) - # Preserve sysroot, but never include relative directories - case $dir in - [\\/]* | [A-Za-z]:[\\/]* | =*) func_append deplibs " $arg" ;; - *) func_append deplibs " -L$dir" ;; - esac - func_append lib_search_path " $dir" - ;; - esac - case $host in - *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*) - testbindir=`$ECHO "$dir" | $SED 's*/lib$*/bin*'` - case :$dllsearchpath: in - *":$dir:"*) ;; - ::) dllsearchpath=$dir;; - *) func_append dllsearchpath ":$dir";; - esac - case :$dllsearchpath: in - *":$testbindir:"*) ;; - ::) dllsearchpath=$testbindir;; - *) func_append dllsearchpath ":$testbindir";; - esac - ;; - esac - continue - ;; - - -l*) - if test "X$arg" = "X-lc" || test "X$arg" = "X-lm"; then - case $host in - *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-beos* | *-cegcc* | *-*-haiku*) - # These systems don't actually have a C or math library (as such) - continue - ;; - *-*-os2*) - # These systems don't actually have a C library (as such) - test "X$arg" = "X-lc" && continue - ;; - *-*-openbsd* | *-*-freebsd* | *-*-dragonfly*) - # Do not include libc due to us having libc/libc_r. - test "X$arg" = "X-lc" && continue - ;; - *-*-rhapsody* | *-*-darwin1.[012]) - # Rhapsody C and math libraries are in the System framework - func_append deplibs " System.ltframework" - continue - ;; - *-*-sco3.2v5* | *-*-sco5v6*) - # Causes problems with __ctype - test "X$arg" = "X-lc" && continue - ;; - *-*-sysv4.2uw2* | *-*-sysv5* | *-*-unixware* | *-*-OpenUNIX*) - # Compiler inserts libc in the correct place for threads to work - test "X$arg" = "X-lc" && continue - ;; - esac - elif test "X$arg" = "X-lc_r"; then - case $host in - *-*-openbsd* | *-*-freebsd* | *-*-dragonfly*) - # Do not include libc_r directly, use -pthread flag. - continue - ;; - esac - fi - func_append deplibs " $arg" - continue - ;; - - -module) - module=yes - continue - ;; - - # Tru64 UNIX uses -model [arg] to determine the layout of C++ - # classes, name mangling, and exception handling. - # Darwin uses the -arch flag to determine output architecture. - -model|-arch|-isysroot|--sysroot) - func_append compiler_flags " $arg" - func_append compile_command " $arg" - func_append finalize_command " $arg" - prev=xcompiler - continue - ;; - - -mt|-mthreads|-kthread|-Kthread|-pthread|-pthreads|--thread-safe \ - |-threads|-fopenmp|-openmp|-mp|-xopenmp|-omp|-qsmp=*) - func_append compiler_flags " $arg" - func_append compile_command " $arg" - func_append finalize_command " $arg" - case "$new_inherited_linker_flags " in - *" $arg "*) ;; - * ) func_append new_inherited_linker_flags " $arg" ;; - esac - continue - ;; - - -multi_module) - single_module="${wl}-multi_module" - continue - ;; - - -no-fast-install) - fast_install=no - continue - ;; - - -no-install) - case $host in - *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-*-darwin* | *-cegcc*) - # The PATH hackery in wrapper scripts is required on Windows - # and Darwin in order for the loader to find any dlls it needs. - func_warning "\`-no-install' is ignored for $host" - func_warning "assuming \`-no-fast-install' instead" - fast_install=no - ;; - *) no_install=yes ;; - esac - continue - ;; - - -no-undefined) - allow_undefined=no - continue - ;; - - -objectlist) - prev=objectlist - continue - ;; - - -o) prev=output ;; - - -precious-files-regex) - prev=precious_regex - continue - ;; - - -release) - prev=release - continue - ;; - - -rpath) - prev=rpath - continue - ;; - - -R) - prev=xrpath - continue - ;; - - -R*) - func_stripname '-R' '' "$arg" - dir=$func_stripname_result - # We need an absolute path. - case $dir in - [\\/]* | [A-Za-z]:[\\/]*) ;; - =*) - func_stripname '=' '' "$dir" - dir=$lt_sysroot$func_stripname_result - ;; - *) - func_fatal_error "only absolute run-paths are allowed" - ;; - esac - case "$xrpath " in - *" $dir "*) ;; - *) func_append xrpath " $dir" ;; - esac - continue - ;; - - -shared) - # The effects of -shared are defined in a previous loop. - continue - ;; - - -shrext) - prev=shrext - continue - ;; - - -static | -static-libtool-libs) - # The effects of -static are defined in a previous loop. - # We used to do the same as -all-static on platforms that - # didn't have a PIC flag, but the assumption that the effects - # would be equivalent was wrong. It would break on at least - # Digital Unix and AIX. - continue - ;; - - -thread-safe) - thread_safe=yes - continue - ;; - - -version-info) - prev=vinfo - continue - ;; - - -version-number) - prev=vinfo - vinfo_number=yes - continue - ;; - - -weak) - prev=weak - continue - ;; - - -Wc,*) - func_stripname '-Wc,' '' "$arg" - args=$func_stripname_result - arg= - save_ifs="$IFS"; IFS=',' - for flag in $args; do - IFS="$save_ifs" - func_quote_for_eval "$flag" - func_append arg " $func_quote_for_eval_result" - func_append compiler_flags " $func_quote_for_eval_result" - done - IFS="$save_ifs" - func_stripname ' ' '' "$arg" - arg=$func_stripname_result - ;; - - -Wl,*) - func_stripname '-Wl,' '' "$arg" - args=$func_stripname_result - arg= - save_ifs="$IFS"; IFS=',' - for flag in $args; do - IFS="$save_ifs" - func_quote_for_eval "$flag" - func_append arg " $wl$func_quote_for_eval_result" - func_append compiler_flags " $wl$func_quote_for_eval_result" - func_append linker_flags " $func_quote_for_eval_result" - done - IFS="$save_ifs" - func_stripname ' ' '' "$arg" - arg=$func_stripname_result - ;; - - -Xcompiler) - prev=xcompiler - continue - ;; - - -Xlinker) - prev=xlinker - continue - ;; - - -XCClinker) - prev=xcclinker - continue - ;; - - # -msg_* for osf cc - -msg_*) - func_quote_for_eval "$arg" - arg="$func_quote_for_eval_result" - ;; - - # Flags to be passed through unchanged, with rationale: - # -64, -mips[0-9] enable 64-bit mode for the SGI compiler - # -r[0-9][0-9]* specify processor for the SGI compiler - # -xarch=*, -xtarget=* enable 64-bit mode for the Sun compiler - # +DA*, +DD* enable 64-bit mode for the HP compiler - # -q* compiler args for the IBM compiler - # -m*, -t[45]*, -txscale* architecture-specific flags for GCC - # -F/path path to uninstalled frameworks, gcc on darwin - # -p, -pg, --coverage, -fprofile-* profiling flags for GCC - # @file GCC response files - # -tp=* Portland pgcc target processor selection - # --sysroot=* for sysroot support - # -O*, -flto*, -fwhopr*, -fuse-linker-plugin GCC link-time optimization - -64|-mips[0-9]|-r[0-9][0-9]*|-xarch=*|-xtarget=*|+DA*|+DD*|-q*|-m*| \ - -t[45]*|-txscale*|-p|-pg|--coverage|-fprofile-*|-F*|@*|-tp=*|--sysroot=*| \ - -O*|-flto*|-fwhopr*|-fuse-linker-plugin) - func_quote_for_eval "$arg" - arg="$func_quote_for_eval_result" - func_append compile_command " $arg" - func_append finalize_command " $arg" - func_append compiler_flags " $arg" - continue - ;; - - # Some other compiler flag. - -* | +*) - func_quote_for_eval "$arg" - arg="$func_quote_for_eval_result" - ;; - - *.$objext) - # A standard object. - func_append objs " $arg" - ;; - - *.lo) - # A libtool-controlled object. - - # Check to see that this really is a libtool object. - if func_lalib_unsafe_p "$arg"; then - pic_object= - non_pic_object= - - # Read the .lo file - func_source "$arg" - - if test -z "$pic_object" || - test -z "$non_pic_object" || - test "$pic_object" = none && - test "$non_pic_object" = none; then - func_fatal_error "cannot find name of object for \`$arg'" - fi - - # Extract subdirectory from the argument. - func_dirname "$arg" "/" "" - xdir="$func_dirname_result" - - if test "$pic_object" != none; then - # Prepend the subdirectory the object is found in. - pic_object="$xdir$pic_object" - - if test "$prev" = dlfiles; then - if test "$build_libtool_libs" = yes && test "$dlopen_support" = yes; then - func_append dlfiles " $pic_object" - prev= - continue - else - # If libtool objects are unsupported, then we need to preload. - prev=dlprefiles - fi - fi - - # CHECK ME: I think I busted this. -Ossama - if test "$prev" = dlprefiles; then - # Preload the old-style object. - func_append dlprefiles " $pic_object" - prev= - fi - - # A PIC object. - func_append libobjs " $pic_object" - arg="$pic_object" - fi - - # Non-PIC object. - if test "$non_pic_object" != none; then - # Prepend the subdirectory the object is found in. - non_pic_object="$xdir$non_pic_object" - - # A standard non-PIC object - func_append non_pic_objects " $non_pic_object" - if test -z "$pic_object" || test "$pic_object" = none ; then - arg="$non_pic_object" - fi - else - # If the PIC object exists, use it instead. - # $xdir was prepended to $pic_object above. - non_pic_object="$pic_object" - func_append non_pic_objects " $non_pic_object" - fi - else - # Only an error if not doing a dry-run. - if $opt_dry_run; then - # Extract subdirectory from the argument. - func_dirname "$arg" "/" "" - xdir="$func_dirname_result" - - func_lo2o "$arg" - pic_object=$xdir$objdir/$func_lo2o_result - non_pic_object=$xdir$func_lo2o_result - func_append libobjs " $pic_object" - func_append non_pic_objects " $non_pic_object" - else - func_fatal_error "\`$arg' is not a valid libtool object" - fi - fi - ;; - - *.$libext) - # An archive. - func_append deplibs " $arg" - func_append old_deplibs " $arg" - continue - ;; - - *.la) - # A libtool-controlled library. - - func_resolve_sysroot "$arg" - if test "$prev" = dlfiles; then - # This library was specified with -dlopen. - func_append dlfiles " $func_resolve_sysroot_result" - prev= - elif test "$prev" = dlprefiles; then - # The library was specified with -dlpreopen. - func_append dlprefiles " $func_resolve_sysroot_result" - prev= - else - func_append deplibs " $func_resolve_sysroot_result" - fi - continue - ;; - - # Some other compiler argument. - *) - # Unknown arguments in both finalize_command and compile_command need - # to be aesthetically quoted because they are evaled later. - func_quote_for_eval "$arg" - arg="$func_quote_for_eval_result" - ;; - esac # arg - - # Now actually substitute the argument into the commands. - if test -n "$arg"; then - func_append compile_command " $arg" - func_append finalize_command " $arg" - fi - done # argument parsing loop - - test -n "$prev" && \ - func_fatal_help "the \`$prevarg' option requires an argument" - - if test "$export_dynamic" = yes && test -n "$export_dynamic_flag_spec"; then - eval arg=\"$export_dynamic_flag_spec\" - func_append compile_command " $arg" - func_append finalize_command " $arg" - fi - - oldlibs= - # calculate the name of the file, without its directory - func_basename "$output" - outputname="$func_basename_result" - libobjs_save="$libobjs" - - if test -n "$shlibpath_var"; then - # get the directories listed in $shlibpath_var - eval shlib_search_path=\`\$ECHO \"\${$shlibpath_var}\" \| \$SED \'s/:/ /g\'\` - else - shlib_search_path= - fi - eval sys_lib_search_path=\"$sys_lib_search_path_spec\" - eval sys_lib_dlsearch_path=\"$sys_lib_dlsearch_path_spec\" - - func_dirname "$output" "/" "" - output_objdir="$func_dirname_result$objdir" - func_to_tool_file "$output_objdir/" - tool_output_objdir=$func_to_tool_file_result - # Create the object directory. - func_mkdir_p "$output_objdir" - - # Determine the type of output - case $output in - "") - func_fatal_help "you must specify an output file" - ;; - *.$libext) linkmode=oldlib ;; - *.lo | *.$objext) linkmode=obj ;; - *.la) linkmode=lib ;; - *) linkmode=prog ;; # Anything else should be a program. - esac - - specialdeplibs= - - libs= - # Find all interdependent deplibs by searching for libraries - # that are linked more than once (e.g. -la -lb -la) - for deplib in $deplibs; do - if $opt_preserve_dup_deps ; then - case "$libs " in - *" $deplib "*) func_append specialdeplibs " $deplib" ;; - esac - fi - func_append libs " $deplib" - done - - if test "$linkmode" = lib; then - libs="$predeps $libs $compiler_lib_search_path $postdeps" - - # Compute libraries that are listed more than once in $predeps - # $postdeps and mark them as special (i.e., whose duplicates are - # not to be eliminated). - pre_post_deps= - if $opt_duplicate_compiler_generated_deps; then - for pre_post_dep in $predeps $postdeps; do - case "$pre_post_deps " in - *" $pre_post_dep "*) func_append specialdeplibs " $pre_post_deps" ;; - esac - func_append pre_post_deps " $pre_post_dep" - done - fi - pre_post_deps= - fi - - deplibs= - newdependency_libs= - newlib_search_path= - need_relink=no # whether we're linking any uninstalled libtool libraries - notinst_deplibs= # not-installed libtool libraries - notinst_path= # paths that contain not-installed libtool libraries - - case $linkmode in - lib) - passes="conv dlpreopen link" - for file in $dlfiles $dlprefiles; do - case $file in - *.la) ;; - *) - func_fatal_help "libraries can \`-dlopen' only libtool libraries: $file" - ;; - esac - done - ;; - prog) - compile_deplibs= - finalize_deplibs= - alldeplibs=no - newdlfiles= - newdlprefiles= - passes="conv scan dlopen dlpreopen link" - ;; - *) passes="conv" - ;; - esac - - for pass in $passes; do - # The preopen pass in lib mode reverses $deplibs; put it back here - # so that -L comes before libs that need it for instance... - if test "$linkmode,$pass" = "lib,link"; then - ## FIXME: Find the place where the list is rebuilt in the wrong - ## order, and fix it there properly - tmp_deplibs= - for deplib in $deplibs; do - tmp_deplibs="$deplib $tmp_deplibs" - done - deplibs="$tmp_deplibs" - fi - - if test "$linkmode,$pass" = "lib,link" || - test "$linkmode,$pass" = "prog,scan"; then - libs="$deplibs" - deplibs= - fi - if test "$linkmode" = prog; then - case $pass in - dlopen) libs="$dlfiles" ;; - dlpreopen) libs="$dlprefiles" ;; - link) - libs="$deplibs %DEPLIBS%" - test "X$link_all_deplibs" != Xno && libs="$libs $dependency_libs" - ;; - esac - fi - if test "$linkmode,$pass" = "lib,dlpreopen"; then - # Collect and forward deplibs of preopened libtool libs - for lib in $dlprefiles; do - # Ignore non-libtool-libs - dependency_libs= - func_resolve_sysroot "$lib" - case $lib in - *.la) func_source "$func_resolve_sysroot_result" ;; - esac - - # Collect preopened libtool deplibs, except any this library - # has declared as weak libs - for deplib in $dependency_libs; do - func_basename "$deplib" - deplib_base=$func_basename_result - case " $weak_libs " in - *" $deplib_base "*) ;; - *) func_append deplibs " $deplib" ;; - esac - done - done - libs="$dlprefiles" - fi - if test "$pass" = dlopen; then - # Collect dlpreopened libraries - save_deplibs="$deplibs" - deplibs= - fi - - for deplib in $libs; do - lib= - found=no - case $deplib in - -mt|-mthreads|-kthread|-Kthread|-pthread|-pthreads|--thread-safe \ - |-threads|-fopenmp|-openmp|-mp|-xopenmp|-omp|-qsmp=*) - if test "$linkmode,$pass" = "prog,link"; then - compile_deplibs="$deplib $compile_deplibs" - finalize_deplibs="$deplib $finalize_deplibs" - else - func_append compiler_flags " $deplib" - if test "$linkmode" = lib ; then - case "$new_inherited_linker_flags " in - *" $deplib "*) ;; - * ) func_append new_inherited_linker_flags " $deplib" ;; - esac - fi - fi - continue - ;; - -l*) - if test "$linkmode" != lib && test "$linkmode" != prog; then - func_warning "\`-l' is ignored for archives/objects" - continue - fi - func_stripname '-l' '' "$deplib" - name=$func_stripname_result - if test "$linkmode" = lib; then - searchdirs="$newlib_search_path $lib_search_path $compiler_lib_search_dirs $sys_lib_search_path $shlib_search_path" - else - searchdirs="$newlib_search_path $lib_search_path $sys_lib_search_path $shlib_search_path" - fi - for searchdir in $searchdirs; do - for search_ext in .la $std_shrext .so .a; do - # Search the libtool library - lib="$searchdir/lib${name}${search_ext}" - if test -f "$lib"; then - if test "$search_ext" = ".la"; then - found=yes - else - found=no - fi - break 2 - fi - done - done - if test "$found" != yes; then - # deplib doesn't seem to be a libtool library - if test "$linkmode,$pass" = "prog,link"; then - compile_deplibs="$deplib $compile_deplibs" - finalize_deplibs="$deplib $finalize_deplibs" - else - deplibs="$deplib $deplibs" - test "$linkmode" = lib && newdependency_libs="$deplib $newdependency_libs" - fi - continue - else # deplib is a libtool library - # If $allow_libtool_libs_with_static_runtimes && $deplib is a stdlib, - # We need to do some special things here, and not later. - if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then - case " $predeps $postdeps " in - *" $deplib "*) - if func_lalib_p "$lib"; then - library_names= - old_library= - func_source "$lib" - for l in $old_library $library_names; do - ll="$l" - done - if test "X$ll" = "X$old_library" ; then # only static version available - found=no - func_dirname "$lib" "" "." - ladir="$func_dirname_result" - lib=$ladir/$old_library - if test "$linkmode,$pass" = "prog,link"; then - compile_deplibs="$deplib $compile_deplibs" - finalize_deplibs="$deplib $finalize_deplibs" - else - deplibs="$deplib $deplibs" - test "$linkmode" = lib && newdependency_libs="$deplib $newdependency_libs" - fi - continue - fi - fi - ;; - *) ;; - esac - fi - fi - ;; # -l - *.ltframework) - if test "$linkmode,$pass" = "prog,link"; then - compile_deplibs="$deplib $compile_deplibs" - finalize_deplibs="$deplib $finalize_deplibs" - else - deplibs="$deplib $deplibs" - if test "$linkmode" = lib ; then - case "$new_inherited_linker_flags " in - *" $deplib "*) ;; - * ) func_append new_inherited_linker_flags " $deplib" ;; - esac - fi - fi - continue - ;; - -L*) - case $linkmode in - lib) - deplibs="$deplib $deplibs" - test "$pass" = conv && continue - newdependency_libs="$deplib $newdependency_libs" - func_stripname '-L' '' "$deplib" - func_resolve_sysroot "$func_stripname_result" - func_append newlib_search_path " $func_resolve_sysroot_result" - ;; - prog) - if test "$pass" = conv; then - deplibs="$deplib $deplibs" - continue - fi - if test "$pass" = scan; then - deplibs="$deplib $deplibs" - else - compile_deplibs="$deplib $compile_deplibs" - finalize_deplibs="$deplib $finalize_deplibs" - fi - func_stripname '-L' '' "$deplib" - func_resolve_sysroot "$func_stripname_result" - func_append newlib_search_path " $func_resolve_sysroot_result" - ;; - *) - func_warning "\`-L' is ignored for archives/objects" - ;; - esac # linkmode - continue - ;; # -L - -R*) - if test "$pass" = link; then - func_stripname '-R' '' "$deplib" - func_resolve_sysroot "$func_stripname_result" - dir=$func_resolve_sysroot_result - # Make sure the xrpath contains only unique directories. - case "$xrpath " in - *" $dir "*) ;; - *) func_append xrpath " $dir" ;; - esac - fi - deplibs="$deplib $deplibs" - continue - ;; - *.la) - func_resolve_sysroot "$deplib" - lib=$func_resolve_sysroot_result - ;; - *.$libext) - if test "$pass" = conv; then - deplibs="$deplib $deplibs" - continue - fi - case $linkmode in - lib) - # Linking convenience modules into shared libraries is allowed, - # but linking other static libraries is non-portable. - case " $dlpreconveniencelibs " in - *" $deplib "*) ;; - *) - valid_a_lib=no - case $deplibs_check_method in - match_pattern*) - set dummy $deplibs_check_method; shift - match_pattern_regex=`expr "$deplibs_check_method" : "$1 \(.*\)"` - if eval "\$ECHO \"$deplib\"" 2>/dev/null | $SED 10q \ - | $EGREP "$match_pattern_regex" > /dev/null; then - valid_a_lib=yes - fi - ;; - pass_all) - valid_a_lib=yes - ;; - esac - if test "$valid_a_lib" != yes; then - echo - $ECHO "*** Warning: Trying to link with static lib archive $deplib." - echo "*** I have the capability to make that library automatically link in when" - echo "*** you link to this library. But I can only do this if you have a" - echo "*** shared version of the library, which you do not appear to have" - echo "*** because the file extensions .$libext of this argument makes me believe" - echo "*** that it is just a static archive that I should not use here." - else - echo - $ECHO "*** Warning: Linking the shared library $output against the" - $ECHO "*** static library $deplib is not portable!" - deplibs="$deplib $deplibs" - fi - ;; - esac - continue - ;; - prog) - if test "$pass" != link; then - deplibs="$deplib $deplibs" - else - compile_deplibs="$deplib $compile_deplibs" - finalize_deplibs="$deplib $finalize_deplibs" - fi - continue - ;; - esac # linkmode - ;; # *.$libext - *.lo | *.$objext) - if test "$pass" = conv; then - deplibs="$deplib $deplibs" - elif test "$linkmode" = prog; then - if test "$pass" = dlpreopen || test "$dlopen_support" != yes || test "$build_libtool_libs" = no; then - # If there is no dlopen support or we're linking statically, - # we need to preload. - func_append newdlprefiles " $deplib" - compile_deplibs="$deplib $compile_deplibs" - finalize_deplibs="$deplib $finalize_deplibs" - else - func_append newdlfiles " $deplib" - fi - fi - continue - ;; - %DEPLIBS%) - alldeplibs=yes - continue - ;; - esac # case $deplib - - if test "$found" = yes || test -f "$lib"; then : - else - func_fatal_error "cannot find the library \`$lib' or unhandled argument \`$deplib'" - fi - - # Check to see that this really is a libtool archive. - func_lalib_unsafe_p "$lib" \ - || func_fatal_error "\`$lib' is not a valid libtool archive" - - func_dirname "$lib" "" "." - ladir="$func_dirname_result" - - dlname= - dlopen= - dlpreopen= - libdir= - library_names= - old_library= - inherited_linker_flags= - # If the library was installed with an old release of libtool, - # it will not redefine variables installed, or shouldnotlink - installed=yes - shouldnotlink=no - avoidtemprpath= - - - # Read the .la file - func_source "$lib" - - # Convert "-framework foo" to "foo.ltframework" - if test -n "$inherited_linker_flags"; then - tmp_inherited_linker_flags=`$ECHO "$inherited_linker_flags" | $SED 's/-framework \([^ $]*\)/\1.ltframework/g'` - for tmp_inherited_linker_flag in $tmp_inherited_linker_flags; do - case " $new_inherited_linker_flags " in - *" $tmp_inherited_linker_flag "*) ;; - *) func_append new_inherited_linker_flags " $tmp_inherited_linker_flag";; - esac - done - fi - dependency_libs=`$ECHO " $dependency_libs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` - if test "$linkmode,$pass" = "lib,link" || - test "$linkmode,$pass" = "prog,scan" || - { test "$linkmode" != prog && test "$linkmode" != lib; }; then - test -n "$dlopen" && func_append dlfiles " $dlopen" - test -n "$dlpreopen" && func_append dlprefiles " $dlpreopen" - fi - - if test "$pass" = conv; then - # Only check for convenience libraries - deplibs="$lib $deplibs" - if test -z "$libdir"; then - if test -z "$old_library"; then - func_fatal_error "cannot find name of link library for \`$lib'" - fi - # It is a libtool convenience library, so add in its objects. - func_append convenience " $ladir/$objdir/$old_library" - func_append old_convenience " $ladir/$objdir/$old_library" - tmp_libs= - for deplib in $dependency_libs; do - deplibs="$deplib $deplibs" - if $opt_preserve_dup_deps ; then - case "$tmp_libs " in - *" $deplib "*) func_append specialdeplibs " $deplib" ;; - esac - fi - func_append tmp_libs " $deplib" - done - elif test "$linkmode" != prog && test "$linkmode" != lib; then - func_fatal_error "\`$lib' is not a convenience library" - fi - continue - fi # $pass = conv - - - # Get the name of the library we link against. - linklib= - if test -n "$old_library" && - { test "$prefer_static_libs" = yes || - test "$prefer_static_libs,$installed" = "built,no"; }; then - linklib=$old_library - else - for l in $old_library $library_names; do - linklib="$l" - done - fi - if test -z "$linklib"; then - func_fatal_error "cannot find name of link library for \`$lib'" - fi - - # This library was specified with -dlopen. - if test "$pass" = dlopen; then - if test -z "$libdir"; then - func_fatal_error "cannot -dlopen a convenience library: \`$lib'" - fi - if test -z "$dlname" || - test "$dlopen_support" != yes || - test "$build_libtool_libs" = no; then - # If there is no dlname, no dlopen support or we're linking - # statically, we need to preload. We also need to preload any - # dependent libraries so libltdl's deplib preloader doesn't - # bomb out in the load deplibs phase. - func_append dlprefiles " $lib $dependency_libs" - else - func_append newdlfiles " $lib" - fi - continue - fi # $pass = dlopen - - # We need an absolute path. - case $ladir in - [\\/]* | [A-Za-z]:[\\/]*) abs_ladir="$ladir" ;; - *) - abs_ladir=`cd "$ladir" && pwd` - if test -z "$abs_ladir"; then - func_warning "cannot determine absolute directory name of \`$ladir'" - func_warning "passing it literally to the linker, although it might fail" - abs_ladir="$ladir" - fi - ;; - esac - func_basename "$lib" - laname="$func_basename_result" - - # Find the relevant object directory and library name. - if test "X$installed" = Xyes; then - if test ! -f "$lt_sysroot$libdir/$linklib" && test -f "$abs_ladir/$linklib"; then - func_warning "library \`$lib' was moved." - dir="$ladir" - absdir="$abs_ladir" - libdir="$abs_ladir" - else - dir="$lt_sysroot$libdir" - absdir="$lt_sysroot$libdir" - fi - test "X$hardcode_automatic" = Xyes && avoidtemprpath=yes - else - if test ! -f "$ladir/$objdir/$linklib" && test -f "$abs_ladir/$linklib"; then - dir="$ladir" - absdir="$abs_ladir" - # Remove this search path later - func_append notinst_path " $abs_ladir" - else - dir="$ladir/$objdir" - absdir="$abs_ladir/$objdir" - # Remove this search path later - func_append notinst_path " $abs_ladir" - fi - fi # $installed = yes - func_stripname 'lib' '.la' "$laname" - name=$func_stripname_result - - # This library was specified with -dlpreopen. - if test "$pass" = dlpreopen; then - if test -z "$libdir" && test "$linkmode" = prog; then - func_fatal_error "only libraries may -dlpreopen a convenience library: \`$lib'" - fi - case "$host" in - # special handling for platforms with PE-DLLs. - *cygwin* | *mingw* | *cegcc* ) - # Linker will automatically link against shared library if both - # static and shared are present. Therefore, ensure we extract - # symbols from the import library if a shared library is present - # (otherwise, the dlopen module name will be incorrect). We do - # this by putting the import library name into $newdlprefiles. - # We recover the dlopen module name by 'saving' the la file - # name in a special purpose variable, and (later) extracting the - # dlname from the la file. - if test -n "$dlname"; then - func_tr_sh "$dir/$linklib" - eval "libfile_$func_tr_sh_result=\$abs_ladir/\$laname" - func_append newdlprefiles " $dir/$linklib" - else - func_append newdlprefiles " $dir/$old_library" - # Keep a list of preopened convenience libraries to check - # that they are being used correctly in the link pass. - test -z "$libdir" && \ - func_append dlpreconveniencelibs " $dir/$old_library" - fi - ;; - * ) - # Prefer using a static library (so that no silly _DYNAMIC symbols - # are required to link). - if test -n "$old_library"; then - func_append newdlprefiles " $dir/$old_library" - # Keep a list of preopened convenience libraries to check - # that they are being used correctly in the link pass. - test -z "$libdir" && \ - func_append dlpreconveniencelibs " $dir/$old_library" - # Otherwise, use the dlname, so that lt_dlopen finds it. - elif test -n "$dlname"; then - func_append newdlprefiles " $dir/$dlname" - else - func_append newdlprefiles " $dir/$linklib" - fi - ;; - esac - fi # $pass = dlpreopen - - if test -z "$libdir"; then - # Link the convenience library - if test "$linkmode" = lib; then - deplibs="$dir/$old_library $deplibs" - elif test "$linkmode,$pass" = "prog,link"; then - compile_deplibs="$dir/$old_library $compile_deplibs" - finalize_deplibs="$dir/$old_library $finalize_deplibs" - else - deplibs="$lib $deplibs" # used for prog,scan pass - fi - continue - fi - - - if test "$linkmode" = prog && test "$pass" != link; then - func_append newlib_search_path " $ladir" - deplibs="$lib $deplibs" - - linkalldeplibs=no - if test "$link_all_deplibs" != no || test -z "$library_names" || - test "$build_libtool_libs" = no; then - linkalldeplibs=yes - fi - - tmp_libs= - for deplib in $dependency_libs; do - case $deplib in - -L*) func_stripname '-L' '' "$deplib" - func_resolve_sysroot "$func_stripname_result" - func_append newlib_search_path " $func_resolve_sysroot_result" - ;; - esac - # Need to link against all dependency_libs? - if test "$linkalldeplibs" = yes; then - deplibs="$deplib $deplibs" - else - # Need to hardcode shared library paths - # or/and link against static libraries - newdependency_libs="$deplib $newdependency_libs" - fi - if $opt_preserve_dup_deps ; then - case "$tmp_libs " in - *" $deplib "*) func_append specialdeplibs " $deplib" ;; - esac - fi - func_append tmp_libs " $deplib" - done # for deplib - continue - fi # $linkmode = prog... - - if test "$linkmode,$pass" = "prog,link"; then - if test -n "$library_names" && - { { test "$prefer_static_libs" = no || - test "$prefer_static_libs,$installed" = "built,yes"; } || - test -z "$old_library"; }; then - # We need to hardcode the library path - if test -n "$shlibpath_var" && test -z "$avoidtemprpath" ; then - # Make sure the rpath contains only unique directories. - case "$temp_rpath:" in - *"$absdir:"*) ;; - *) func_append temp_rpath "$absdir:" ;; - esac - fi - - # Hardcode the library path. - # Skip directories that are in the system default run-time - # search path. - case " $sys_lib_dlsearch_path " in - *" $absdir "*) ;; - *) - case "$compile_rpath " in - *" $absdir "*) ;; - *) func_append compile_rpath " $absdir" ;; - esac - ;; - esac - case " $sys_lib_dlsearch_path " in - *" $libdir "*) ;; - *) - case "$finalize_rpath " in - *" $libdir "*) ;; - *) func_append finalize_rpath " $libdir" ;; - esac - ;; - esac - fi # $linkmode,$pass = prog,link... - - if test "$alldeplibs" = yes && - { test "$deplibs_check_method" = pass_all || - { test "$build_libtool_libs" = yes && - test -n "$library_names"; }; }; then - # We only need to search for static libraries - continue - fi - fi - - link_static=no # Whether the deplib will be linked statically - use_static_libs=$prefer_static_libs - if test "$use_static_libs" = built && test "$installed" = yes; then - use_static_libs=no - fi - if test -n "$library_names" && - { test "$use_static_libs" = no || test -z "$old_library"; }; then - case $host in - *cygwin* | *mingw* | *cegcc*) - # No point in relinking DLLs because paths are not encoded - func_append notinst_deplibs " $lib" - need_relink=no - ;; - *) - if test "$installed" = no; then - func_append notinst_deplibs " $lib" - need_relink=yes - fi - ;; - esac - # This is a shared library - - # Warn about portability, can't link against -module's on some - # systems (darwin). Don't bleat about dlopened modules though! - dlopenmodule="" - for dlpremoduletest in $dlprefiles; do - if test "X$dlpremoduletest" = "X$lib"; then - dlopenmodule="$dlpremoduletest" - break - fi - done - if test -z "$dlopenmodule" && test "$shouldnotlink" = yes && test "$pass" = link; then - echo - if test "$linkmode" = prog; then - $ECHO "*** Warning: Linking the executable $output against the loadable module" - else - $ECHO "*** Warning: Linking the shared library $output against the loadable module" - fi - $ECHO "*** $linklib is not portable!" - fi - if test "$linkmode" = lib && - test "$hardcode_into_libs" = yes; then - # Hardcode the library path. - # Skip directories that are in the system default run-time - # search path. - case " $sys_lib_dlsearch_path " in - *" $absdir "*) ;; - *) - case "$compile_rpath " in - *" $absdir "*) ;; - *) func_append compile_rpath " $absdir" ;; - esac - ;; - esac - case " $sys_lib_dlsearch_path " in - *" $libdir "*) ;; - *) - case "$finalize_rpath " in - *" $libdir "*) ;; - *) func_append finalize_rpath " $libdir" ;; - esac - ;; - esac - fi - - if test -n "$old_archive_from_expsyms_cmds"; then - # figure out the soname - set dummy $library_names - shift - realname="$1" - shift - libname=`eval "\\$ECHO \"$libname_spec\""` - # use dlname if we got it. it's perfectly good, no? - if test -n "$dlname"; then - soname="$dlname" - elif test -n "$soname_spec"; then - # bleh windows - case $host in - *cygwin* | mingw* | *cegcc*) - func_arith $current - $age - major=$func_arith_result - versuffix="-$major" - ;; - esac - eval soname=\"$soname_spec\" - else - soname="$realname" - fi - - # Make a new name for the extract_expsyms_cmds to use - soroot="$soname" - func_basename "$soroot" - soname="$func_basename_result" - func_stripname 'lib' '.dll' "$soname" - newlib=libimp-$func_stripname_result.a - - # If the library has no export list, then create one now - if test -f "$output_objdir/$soname-def"; then : - else - func_verbose "extracting exported symbol list from \`$soname'" - func_execute_cmds "$extract_expsyms_cmds" 'exit $?' - fi - - # Create $newlib - if test -f "$output_objdir/$newlib"; then :; else - func_verbose "generating import library for \`$soname'" - func_execute_cmds "$old_archive_from_expsyms_cmds" 'exit $?' - fi - # make sure the library variables are pointing to the new library - dir=$output_objdir - linklib=$newlib - fi # test -n "$old_archive_from_expsyms_cmds" - - if test "$linkmode" = prog || test "$opt_mode" != relink; then - add_shlibpath= - add_dir= - add= - lib_linked=yes - case $hardcode_action in - immediate | unsupported) - if test "$hardcode_direct" = no; then - add="$dir/$linklib" - case $host in - *-*-sco3.2v5.0.[024]*) add_dir="-L$dir" ;; - *-*-sysv4*uw2*) add_dir="-L$dir" ;; - *-*-sysv5OpenUNIX* | *-*-sysv5UnixWare7.[01].[10]* | \ - *-*-unixware7*) add_dir="-L$dir" ;; - *-*-darwin* ) - # if the lib is a (non-dlopened) module then we can not - # link against it, someone is ignoring the earlier warnings - if /usr/bin/file -L $add 2> /dev/null | - $GREP ": [^:]* bundle" >/dev/null ; then - if test "X$dlopenmodule" != "X$lib"; then - $ECHO "*** Warning: lib $linklib is a module, not a shared library" - if test -z "$old_library" ; then - echo - echo "*** And there doesn't seem to be a static archive available" - echo "*** The link will probably fail, sorry" - else - add="$dir/$old_library" - fi - elif test -n "$old_library"; then - add="$dir/$old_library" - fi - fi - esac - elif test "$hardcode_minus_L" = no; then - case $host in - *-*-sunos*) add_shlibpath="$dir" ;; - esac - add_dir="-L$dir" - add="-l$name" - elif test "$hardcode_shlibpath_var" = no; then - add_shlibpath="$dir" - add="-l$name" - else - lib_linked=no - fi - ;; - relink) - if test "$hardcode_direct" = yes && - test "$hardcode_direct_absolute" = no; then - add="$dir/$linklib" - elif test "$hardcode_minus_L" = yes; then - add_dir="-L$absdir" - # Try looking first in the location we're being installed to. - if test -n "$inst_prefix_dir"; then - case $libdir in - [\\/]*) - func_append add_dir " -L$inst_prefix_dir$libdir" - ;; - esac - fi - add="-l$name" - elif test "$hardcode_shlibpath_var" = yes; then - add_shlibpath="$dir" - add="-l$name" - else - lib_linked=no - fi - ;; - *) lib_linked=no ;; - esac - - if test "$lib_linked" != yes; then - func_fatal_configuration "unsupported hardcode properties" - fi - - if test -n "$add_shlibpath"; then - case :$compile_shlibpath: in - *":$add_shlibpath:"*) ;; - *) func_append compile_shlibpath "$add_shlibpath:" ;; - esac - fi - if test "$linkmode" = prog; then - test -n "$add_dir" && compile_deplibs="$add_dir $compile_deplibs" - test -n "$add" && compile_deplibs="$add $compile_deplibs" - else - test -n "$add_dir" && deplibs="$add_dir $deplibs" - test -n "$add" && deplibs="$add $deplibs" - if test "$hardcode_direct" != yes && - test "$hardcode_minus_L" != yes && - test "$hardcode_shlibpath_var" = yes; then - case :$finalize_shlibpath: in - *":$libdir:"*) ;; - *) func_append finalize_shlibpath "$libdir:" ;; - esac - fi - fi - fi - - if test "$linkmode" = prog || test "$opt_mode" = relink; then - add_shlibpath= - add_dir= - add= - # Finalize command for both is simple: just hardcode it. - if test "$hardcode_direct" = yes && - test "$hardcode_direct_absolute" = no; then - add="$libdir/$linklib" - elif test "$hardcode_minus_L" = yes; then - add_dir="-L$libdir" - add="-l$name" - elif test "$hardcode_shlibpath_var" = yes; then - case :$finalize_shlibpath: in - *":$libdir:"*) ;; - *) func_append finalize_shlibpath "$libdir:" ;; - esac - add="-l$name" - elif test "$hardcode_automatic" = yes; then - if test -n "$inst_prefix_dir" && - test -f "$inst_prefix_dir$libdir/$linklib" ; then - add="$inst_prefix_dir$libdir/$linklib" - else - add="$libdir/$linklib" - fi - else - # We cannot seem to hardcode it, guess we'll fake it. - add_dir="-L$libdir" - # Try looking first in the location we're being installed to. - if test -n "$inst_prefix_dir"; then - case $libdir in - [\\/]*) - func_append add_dir " -L$inst_prefix_dir$libdir" - ;; - esac - fi - add="-l$name" - fi - - if test "$linkmode" = prog; then - test -n "$add_dir" && finalize_deplibs="$add_dir $finalize_deplibs" - test -n "$add" && finalize_deplibs="$add $finalize_deplibs" - else - test -n "$add_dir" && deplibs="$add_dir $deplibs" - test -n "$add" && deplibs="$add $deplibs" - fi - fi - elif test "$linkmode" = prog; then - # Here we assume that one of hardcode_direct or hardcode_minus_L - # is not unsupported. This is valid on all known static and - # shared platforms. - if test "$hardcode_direct" != unsupported; then - test -n "$old_library" && linklib="$old_library" - compile_deplibs="$dir/$linklib $compile_deplibs" - finalize_deplibs="$dir/$linklib $finalize_deplibs" - else - compile_deplibs="-l$name -L$dir $compile_deplibs" - finalize_deplibs="-l$name -L$dir $finalize_deplibs" - fi - elif test "$build_libtool_libs" = yes; then - # Not a shared library - if test "$deplibs_check_method" != pass_all; then - # We're trying link a shared library against a static one - # but the system doesn't support it. - - # Just print a warning and add the library to dependency_libs so - # that the program can be linked against the static library. - echo - $ECHO "*** Warning: This system can not link to static lib archive $lib." - echo "*** I have the capability to make that library automatically link in when" - echo "*** you link to this library. But I can only do this if you have a" - echo "*** shared version of the library, which you do not appear to have." - if test "$module" = yes; then - echo "*** But as you try to build a module library, libtool will still create " - echo "*** a static module, that should work as long as the dlopening application" - echo "*** is linked with the -dlopen flag to resolve symbols at runtime." - if test -z "$global_symbol_pipe"; then - echo - echo "*** However, this would only work if libtool was able to extract symbol" - echo "*** lists from a program, using \`nm' or equivalent, but libtool could" - echo "*** not find such a program. So, this module is probably useless." - echo "*** \`nm' from GNU binutils and a full rebuild may help." - fi - if test "$build_old_libs" = no; then - build_libtool_libs=module - build_old_libs=yes - else - build_libtool_libs=no - fi - fi - else - deplibs="$dir/$old_library $deplibs" - link_static=yes - fi - fi # link shared/static library? - - if test "$linkmode" = lib; then - if test -n "$dependency_libs" && - { test "$hardcode_into_libs" != yes || - test "$build_old_libs" = yes || - test "$link_static" = yes; }; then - # Extract -R from dependency_libs - temp_deplibs= - for libdir in $dependency_libs; do - case $libdir in - -R*) func_stripname '-R' '' "$libdir" - temp_xrpath=$func_stripname_result - case " $xrpath " in - *" $temp_xrpath "*) ;; - *) func_append xrpath " $temp_xrpath";; - esac;; - *) func_append temp_deplibs " $libdir";; - esac - done - dependency_libs="$temp_deplibs" - fi - - func_append newlib_search_path " $absdir" - # Link against this library - test "$link_static" = no && newdependency_libs="$abs_ladir/$laname $newdependency_libs" - # ... and its dependency_libs - tmp_libs= - for deplib in $dependency_libs; do - newdependency_libs="$deplib $newdependency_libs" - case $deplib in - -L*) func_stripname '-L' '' "$deplib" - func_resolve_sysroot "$func_stripname_result";; - *) func_resolve_sysroot "$deplib" ;; - esac - if $opt_preserve_dup_deps ; then - case "$tmp_libs " in - *" $func_resolve_sysroot_result "*) - func_append specialdeplibs " $func_resolve_sysroot_result" ;; - esac - fi - func_append tmp_libs " $func_resolve_sysroot_result" - done - - if test "$link_all_deplibs" != no; then - # Add the search paths of all dependency libraries - for deplib in $dependency_libs; do - path= - case $deplib in - -L*) path="$deplib" ;; - *.la) - func_resolve_sysroot "$deplib" - deplib=$func_resolve_sysroot_result - func_dirname "$deplib" "" "." - dir=$func_dirname_result - # We need an absolute path. - case $dir in - [\\/]* | [A-Za-z]:[\\/]*) absdir="$dir" ;; - *) - absdir=`cd "$dir" && pwd` - if test -z "$absdir"; then - func_warning "cannot determine absolute directory name of \`$dir'" - absdir="$dir" - fi - ;; - esac - if $GREP "^installed=no" $deplib > /dev/null; then - case $host in - *-*-darwin*) - depdepl= - eval deplibrary_names=`${SED} -n -e 's/^library_names=\(.*\)$/\1/p' $deplib` - if test -n "$deplibrary_names" ; then - for tmp in $deplibrary_names ; do - depdepl=$tmp - done - if test -f "$absdir/$objdir/$depdepl" ; then - depdepl="$absdir/$objdir/$depdepl" - darwin_install_name=`${OTOOL} -L $depdepl | awk '{if (NR == 2) {print $1;exit}}'` - if test -z "$darwin_install_name"; then - darwin_install_name=`${OTOOL64} -L $depdepl | awk '{if (NR == 2) {print $1;exit}}'` - fi - func_append compiler_flags " ${wl}-dylib_file ${wl}${darwin_install_name}:${depdepl}" - func_append linker_flags " -dylib_file ${darwin_install_name}:${depdepl}" - path= - fi - fi - ;; - *) - path="-L$absdir/$objdir" - ;; - esac - else - eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $deplib` - test -z "$libdir" && \ - func_fatal_error "\`$deplib' is not a valid libtool archive" - test "$absdir" != "$libdir" && \ - func_warning "\`$deplib' seems to be moved" - - path="-L$absdir" - fi - ;; - esac - case " $deplibs " in - *" $path "*) ;; - *) deplibs="$path $deplibs" ;; - esac - done - fi # link_all_deplibs != no - fi # linkmode = lib - done # for deplib in $libs - if test "$pass" = link; then - if test "$linkmode" = "prog"; then - compile_deplibs="$new_inherited_linker_flags $compile_deplibs" - finalize_deplibs="$new_inherited_linker_flags $finalize_deplibs" - else - compiler_flags="$compiler_flags "`$ECHO " $new_inherited_linker_flags" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` - fi - fi - dependency_libs="$newdependency_libs" - if test "$pass" = dlpreopen; then - # Link the dlpreopened libraries before other libraries - for deplib in $save_deplibs; do - deplibs="$deplib $deplibs" - done - fi - if test "$pass" != dlopen; then - if test "$pass" != conv; then - # Make sure lib_search_path contains only unique directories. - lib_search_path= - for dir in $newlib_search_path; do - case "$lib_search_path " in - *" $dir "*) ;; - *) func_append lib_search_path " $dir" ;; - esac - done - newlib_search_path= - fi - - if test "$linkmode,$pass" != "prog,link"; then - vars="deplibs" - else - vars="compile_deplibs finalize_deplibs" - fi - for var in $vars dependency_libs; do - # Add libraries to $var in reverse order - eval tmp_libs=\"\$$var\" - new_libs= - for deplib in $tmp_libs; do - # FIXME: Pedantically, this is the right thing to do, so - # that some nasty dependency loop isn't accidentally - # broken: - #new_libs="$deplib $new_libs" - # Pragmatically, this seems to cause very few problems in - # practice: - case $deplib in - -L*) new_libs="$deplib $new_libs" ;; - -R*) ;; - *) - # And here is the reason: when a library appears more - # than once as an explicit dependence of a library, or - # is implicitly linked in more than once by the - # compiler, it is considered special, and multiple - # occurrences thereof are not removed. Compare this - # with having the same library being listed as a - # dependency of multiple other libraries: in this case, - # we know (pedantically, we assume) the library does not - # need to be listed more than once, so we keep only the - # last copy. This is not always right, but it is rare - # enough that we require users that really mean to play - # such unportable linking tricks to link the library - # using -Wl,-lname, so that libtool does not consider it - # for duplicate removal. - case " $specialdeplibs " in - *" $deplib "*) new_libs="$deplib $new_libs" ;; - *) - case " $new_libs " in - *" $deplib "*) ;; - *) new_libs="$deplib $new_libs" ;; - esac - ;; - esac - ;; - esac - done - tmp_libs= - for deplib in $new_libs; do - case $deplib in - -L*) - case " $tmp_libs " in - *" $deplib "*) ;; - *) func_append tmp_libs " $deplib" ;; - esac - ;; - *) func_append tmp_libs " $deplib" ;; - esac - done - eval $var=\"$tmp_libs\" - done # for var - fi - # Last step: remove runtime libs from dependency_libs - # (they stay in deplibs) - tmp_libs= - for i in $dependency_libs ; do - case " $predeps $postdeps $compiler_lib_search_path " in - *" $i "*) - i="" - ;; - esac - if test -n "$i" ; then - func_append tmp_libs " $i" - fi - done - dependency_libs=$tmp_libs - done # for pass - if test "$linkmode" = prog; then - dlfiles="$newdlfiles" - fi - if test "$linkmode" = prog || test "$linkmode" = lib; then - dlprefiles="$newdlprefiles" - fi - - case $linkmode in - oldlib) - if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then - func_warning "\`-dlopen' is ignored for archives" - fi - - case " $deplibs" in - *\ -l* | *\ -L*) - func_warning "\`-l' and \`-L' are ignored for archives" ;; - esac - - test -n "$rpath" && \ - func_warning "\`-rpath' is ignored for archives" - - test -n "$xrpath" && \ - func_warning "\`-R' is ignored for archives" - - test -n "$vinfo" && \ - func_warning "\`-version-info/-version-number' is ignored for archives" - - test -n "$release" && \ - func_warning "\`-release' is ignored for archives" - - test -n "$export_symbols$export_symbols_regex" && \ - func_warning "\`-export-symbols' is ignored for archives" - - # Now set the variables for building old libraries. - build_libtool_libs=no - oldlibs="$output" - func_append objs "$old_deplibs" - ;; - - lib) - # Make sure we only generate libraries of the form `libNAME.la'. - case $outputname in - lib*) - func_stripname 'lib' '.la' "$outputname" - name=$func_stripname_result - eval shared_ext=\"$shrext_cmds\" - eval libname=\"$libname_spec\" - ;; - *) - test "$module" = no && \ - func_fatal_help "libtool library \`$output' must begin with \`lib'" - - if test "$need_lib_prefix" != no; then - # Add the "lib" prefix for modules if required - func_stripname '' '.la' "$outputname" - name=$func_stripname_result - eval shared_ext=\"$shrext_cmds\" - eval libname=\"$libname_spec\" - else - func_stripname '' '.la' "$outputname" - libname=$func_stripname_result - fi - ;; - esac - - if test -n "$objs"; then - if test "$deplibs_check_method" != pass_all; then - func_fatal_error "cannot build libtool library \`$output' from non-libtool objects on this host:$objs" - else - echo - $ECHO "*** Warning: Linking the shared library $output against the non-libtool" - $ECHO "*** objects $objs is not portable!" - func_append libobjs " $objs" - fi - fi - - test "$dlself" != no && \ - func_warning "\`-dlopen self' is ignored for libtool libraries" - - set dummy $rpath - shift - test "$#" -gt 1 && \ - func_warning "ignoring multiple \`-rpath's for a libtool library" - - install_libdir="$1" - - oldlibs= - if test -z "$rpath"; then - if test "$build_libtool_libs" = yes; then - # Building a libtool convenience library. - # Some compilers have problems with a `.al' extension so - # convenience libraries should have the same extension an - # archive normally would. - oldlibs="$output_objdir/$libname.$libext $oldlibs" - build_libtool_libs=convenience - build_old_libs=yes - fi - - test -n "$vinfo" && \ - func_warning "\`-version-info/-version-number' is ignored for convenience libraries" - - test -n "$release" && \ - func_warning "\`-release' is ignored for convenience libraries" - else - - # Parse the version information argument. - save_ifs="$IFS"; IFS=':' - set dummy $vinfo 0 0 0 - shift - IFS="$save_ifs" - - test -n "$7" && \ - func_fatal_help "too many parameters to \`-version-info'" - - # convert absolute version numbers to libtool ages - # this retains compatibility with .la files and attempts - # to make the code below a bit more comprehensible - - case $vinfo_number in - yes) - number_major="$1" - number_minor="$2" - number_revision="$3" - # - # There are really only two kinds -- those that - # use the current revision as the major version - # and those that subtract age and use age as - # a minor version. But, then there is irix - # which has an extra 1 added just for fun - # - case $version_type in - # correct linux to gnu/linux during the next big refactor - darwin|linux|osf|windows|none) - func_arith $number_major + $number_minor - current=$func_arith_result - age="$number_minor" - revision="$number_revision" - ;; - freebsd-aout|freebsd-elf|qnx|sunos) - current="$number_major" - revision="$number_minor" - age="0" - ;; - irix|nonstopux) - func_arith $number_major + $number_minor - current=$func_arith_result - age="$number_minor" - revision="$number_minor" - lt_irix_increment=no - ;; - *) - func_fatal_configuration "$modename: unknown library version type \`$version_type'" - ;; - esac - ;; - no) - current="$1" - revision="$2" - age="$3" - ;; - esac - - # Check that each of the things are valid numbers. - case $current in - 0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;; - *) - func_error "CURRENT \`$current' must be a nonnegative integer" - func_fatal_error "\`$vinfo' is not valid version information" - ;; - esac - - case $revision in - 0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;; - *) - func_error "REVISION \`$revision' must be a nonnegative integer" - func_fatal_error "\`$vinfo' is not valid version information" - ;; - esac - - case $age in - 0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;; - *) - func_error "AGE \`$age' must be a nonnegative integer" - func_fatal_error "\`$vinfo' is not valid version information" - ;; - esac - - if test "$age" -gt "$current"; then - func_error "AGE \`$age' is greater than the current interface number \`$current'" - func_fatal_error "\`$vinfo' is not valid version information" - fi - - # Calculate the version variables. - major= - versuffix= - verstring= - case $version_type in - none) ;; - - darwin) - # Like Linux, but with the current version available in - # verstring for coding it into the library header - func_arith $current - $age - major=.$func_arith_result - versuffix="$major.$age.$revision" - # Darwin ld doesn't like 0 for these options... - func_arith $current + 1 - minor_current=$func_arith_result - xlcverstring="${wl}-compatibility_version ${wl}$minor_current ${wl}-current_version ${wl}$minor_current.$revision" - verstring="-compatibility_version $minor_current -current_version $minor_current.$revision" - ;; - - freebsd-aout) - major=".$current" - versuffix=".$current.$revision"; - ;; - - freebsd-elf) - major=".$current" - versuffix=".$current" - ;; - - irix | nonstopux) - if test "X$lt_irix_increment" = "Xno"; then - func_arith $current - $age - else - func_arith $current - $age + 1 - fi - major=$func_arith_result - - case $version_type in - nonstopux) verstring_prefix=nonstopux ;; - *) verstring_prefix=sgi ;; - esac - verstring="$verstring_prefix$major.$revision" - - # Add in all the interfaces that we are compatible with. - loop=$revision - while test "$loop" -ne 0; do - func_arith $revision - $loop - iface=$func_arith_result - func_arith $loop - 1 - loop=$func_arith_result - verstring="$verstring_prefix$major.$iface:$verstring" - done - - # Before this point, $major must not contain `.'. - major=.$major - versuffix="$major.$revision" - ;; - - linux) # correct to gnu/linux during the next big refactor - func_arith $current - $age - major=.$func_arith_result - versuffix="$major.$age.$revision" - ;; - - osf) - func_arith $current - $age - major=.$func_arith_result - versuffix=".$current.$age.$revision" - verstring="$current.$age.$revision" - - # Add in all the interfaces that we are compatible with. - loop=$age - while test "$loop" -ne 0; do - func_arith $current - $loop - iface=$func_arith_result - func_arith $loop - 1 - loop=$func_arith_result - verstring="$verstring:${iface}.0" - done - - # Make executables depend on our current version. - func_append verstring ":${current}.0" - ;; - - qnx) - major=".$current" - versuffix=".$current" - ;; - - sunos) - major=".$current" - versuffix=".$current.$revision" - ;; - - windows) - # Use '-' rather than '.', since we only want one - # extension on DOS 8.3 filesystems. - func_arith $current - $age - major=$func_arith_result - versuffix="-$major" - ;; - - *) - func_fatal_configuration "unknown library version type \`$version_type'" - ;; - esac - - # Clear the version info if we defaulted, and they specified a release. - if test -z "$vinfo" && test -n "$release"; then - major= - case $version_type in - darwin) - # we can't check for "0.0" in archive_cmds due to quoting - # problems, so we reset it completely - verstring= - ;; - *) - verstring="0.0" - ;; - esac - if test "$need_version" = no; then - versuffix= - else - versuffix=".0.0" - fi - fi - - # Remove version info from name if versioning should be avoided - if test "$avoid_version" = yes && test "$need_version" = no; then - major= - versuffix= - verstring="" - fi - - # Check to see if the archive will have undefined symbols. - if test "$allow_undefined" = yes; then - if test "$allow_undefined_flag" = unsupported; then - func_warning "undefined symbols not allowed in $host shared libraries" - build_libtool_libs=no - build_old_libs=yes - fi - else - # Don't allow undefined symbols. - allow_undefined_flag="$no_undefined_flag" - fi - - fi - - func_generate_dlsyms "$libname" "$libname" "yes" - func_append libobjs " $symfileobj" - test "X$libobjs" = "X " && libobjs= - - if test "$opt_mode" != relink; then - # Remove our outputs, but don't remove object files since they - # may have been created when compiling PIC objects. - removelist= - tempremovelist=`$ECHO "$output_objdir/*"` - for p in $tempremovelist; do - case $p in - *.$objext | *.gcno) - ;; - $output_objdir/$outputname | $output_objdir/$libname.* | $output_objdir/${libname}${release}.*) - if test "X$precious_files_regex" != "X"; then - if $ECHO "$p" | $EGREP -e "$precious_files_regex" >/dev/null 2>&1 - then - continue - fi - fi - func_append removelist " $p" - ;; - *) ;; - esac - done - test -n "$removelist" && \ - func_show_eval "${RM}r \$removelist" - fi - - # Now set the variables for building old libraries. - if test "$build_old_libs" = yes && test "$build_libtool_libs" != convenience ; then - func_append oldlibs " $output_objdir/$libname.$libext" - - # Transform .lo files to .o files. - oldobjs="$objs "`$ECHO "$libobjs" | $SP2NL | $SED "/\.${libext}$/d; $lo2o" | $NL2SP` - fi - - # Eliminate all temporary directories. - #for path in $notinst_path; do - # lib_search_path=`$ECHO "$lib_search_path " | $SED "s% $path % %g"` - # deplibs=`$ECHO "$deplibs " | $SED "s% -L$path % %g"` - # dependency_libs=`$ECHO "$dependency_libs " | $SED "s% -L$path % %g"` - #done - - if test -n "$xrpath"; then - # If the user specified any rpath flags, then add them. - temp_xrpath= - for libdir in $xrpath; do - func_replace_sysroot "$libdir" - func_append temp_xrpath " -R$func_replace_sysroot_result" - case "$finalize_rpath " in - *" $libdir "*) ;; - *) func_append finalize_rpath " $libdir" ;; - esac - done - if test "$hardcode_into_libs" != yes || test "$build_old_libs" = yes; then - dependency_libs="$temp_xrpath $dependency_libs" - fi - fi - - # Make sure dlfiles contains only unique files that won't be dlpreopened - old_dlfiles="$dlfiles" - dlfiles= - for lib in $old_dlfiles; do - case " $dlprefiles $dlfiles " in - *" $lib "*) ;; - *) func_append dlfiles " $lib" ;; - esac - done - - # Make sure dlprefiles contains only unique files - old_dlprefiles="$dlprefiles" - dlprefiles= - for lib in $old_dlprefiles; do - case "$dlprefiles " in - *" $lib "*) ;; - *) func_append dlprefiles " $lib" ;; - esac - done - - if test "$build_libtool_libs" = yes; then - if test -n "$rpath"; then - case $host in - *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-*-beos* | *-cegcc* | *-*-haiku*) - # these systems don't actually have a c library (as such)! - ;; - *-*-rhapsody* | *-*-darwin1.[012]) - # Rhapsody C library is in the System framework - func_append deplibs " System.ltframework" - ;; - *-*-netbsd*) - # Don't link with libc until the a.out ld.so is fixed. - ;; - *-*-openbsd* | *-*-freebsd* | *-*-dragonfly*) - # Do not include libc due to us having libc/libc_r. - ;; - *-*-sco3.2v5* | *-*-sco5v6*) - # Causes problems with __ctype - ;; - *-*-sysv4.2uw2* | *-*-sysv5* | *-*-unixware* | *-*-OpenUNIX*) - # Compiler inserts libc in the correct place for threads to work - ;; - *) - # Add libc to deplibs on all other systems if necessary. - if test "$build_libtool_need_lc" = "yes"; then - func_append deplibs " -lc" - fi - ;; - esac - fi - - # Transform deplibs into only deplibs that can be linked in shared. - name_save=$name - libname_save=$libname - release_save=$release - versuffix_save=$versuffix - major_save=$major - # I'm not sure if I'm treating the release correctly. I think - # release should show up in the -l (ie -lgmp5) so we don't want to - # add it in twice. Is that correct? - release="" - versuffix="" - major="" - newdeplibs= - droppeddeps=no - case $deplibs_check_method in - pass_all) - # Don't check for shared/static. Everything works. - # This might be a little naive. We might want to check - # whether the library exists or not. But this is on - # osf3 & osf4 and I'm not really sure... Just - # implementing what was already the behavior. - newdeplibs=$deplibs - ;; - test_compile) - # This code stresses the "libraries are programs" paradigm to its - # limits. Maybe even breaks it. We compile a program, linking it - # against the deplibs as a proxy for the library. Then we can check - # whether they linked in statically or dynamically with ldd. - $opt_dry_run || $RM conftest.c - cat > conftest.c </dev/null` - $nocaseglob - else - potential_libs=`ls $i/$libnameglob[.-]* 2>/dev/null` - fi - for potent_lib in $potential_libs; do - # Follow soft links. - if ls -lLd "$potent_lib" 2>/dev/null | - $GREP " -> " >/dev/null; then - continue - fi - # The statement above tries to avoid entering an - # endless loop below, in case of cyclic links. - # We might still enter an endless loop, since a link - # loop can be closed while we follow links, - # but so what? - potlib="$potent_lib" - while test -h "$potlib" 2>/dev/null; do - potliblink=`ls -ld $potlib | ${SED} 's/.* -> //'` - case $potliblink in - [\\/]* | [A-Za-z]:[\\/]*) potlib="$potliblink";; - *) potlib=`$ECHO "$potlib" | $SED 's,[^/]*$,,'`"$potliblink";; - esac - done - if eval $file_magic_cmd \"\$potlib\" 2>/dev/null | - $SED -e 10q | - $EGREP "$file_magic_regex" > /dev/null; then - func_append newdeplibs " $a_deplib" - a_deplib="" - break 2 - fi - done - done - fi - if test -n "$a_deplib" ; then - droppeddeps=yes - echo - $ECHO "*** Warning: linker path does not have real file for library $a_deplib." - echo "*** I have the capability to make that library automatically link in when" - echo "*** you link to this library. But I can only do this if you have a" - echo "*** shared version of the library, which you do not appear to have" - echo "*** because I did check the linker path looking for a file starting" - if test -z "$potlib" ; then - $ECHO "*** with $libname but no candidates were found. (...for file magic test)" - else - $ECHO "*** with $libname and none of the candidates passed a file format test" - $ECHO "*** using a file magic. Last file checked: $potlib" - fi - fi - ;; - *) - # Add a -L argument. - func_append newdeplibs " $a_deplib" - ;; - esac - done # Gone through all deplibs. - ;; - match_pattern*) - set dummy $deplibs_check_method; shift - match_pattern_regex=`expr "$deplibs_check_method" : "$1 \(.*\)"` - for a_deplib in $deplibs; do - case $a_deplib in - -l*) - func_stripname -l '' "$a_deplib" - name=$func_stripname_result - if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then - case " $predeps $postdeps " in - *" $a_deplib "*) - func_append newdeplibs " $a_deplib" - a_deplib="" - ;; - esac - fi - if test -n "$a_deplib" ; then - libname=`eval "\\$ECHO \"$libname_spec\""` - for i in $lib_search_path $sys_lib_search_path $shlib_search_path; do - potential_libs=`ls $i/$libname[.-]* 2>/dev/null` - for potent_lib in $potential_libs; do - potlib="$potent_lib" # see symlink-check above in file_magic test - if eval "\$ECHO \"$potent_lib\"" 2>/dev/null | $SED 10q | \ - $EGREP "$match_pattern_regex" > /dev/null; then - func_append newdeplibs " $a_deplib" - a_deplib="" - break 2 - fi - done - done - fi - if test -n "$a_deplib" ; then - droppeddeps=yes - echo - $ECHO "*** Warning: linker path does not have real file for library $a_deplib." - echo "*** I have the capability to make that library automatically link in when" - echo "*** you link to this library. But I can only do this if you have a" - echo "*** shared version of the library, which you do not appear to have" - echo "*** because I did check the linker path looking for a file starting" - if test -z "$potlib" ; then - $ECHO "*** with $libname but no candidates were found. (...for regex pattern test)" - else - $ECHO "*** with $libname and none of the candidates passed a file format test" - $ECHO "*** using a regex pattern. Last file checked: $potlib" - fi - fi - ;; - *) - # Add a -L argument. - func_append newdeplibs " $a_deplib" - ;; - esac - done # Gone through all deplibs. - ;; - none | unknown | *) - newdeplibs="" - tmp_deplibs=`$ECHO " $deplibs" | $SED 's/ -lc$//; s/ -[LR][^ ]*//g'` - if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then - for i in $predeps $postdeps ; do - # can't use Xsed below, because $i might contain '/' - tmp_deplibs=`$ECHO " $tmp_deplibs" | $SED "s,$i,,"` - done - fi - case $tmp_deplibs in - *[!\ \ ]*) - echo - if test "X$deplibs_check_method" = "Xnone"; then - echo "*** Warning: inter-library dependencies are not supported in this platform." - else - echo "*** Warning: inter-library dependencies are not known to be supported." - fi - echo "*** All declared inter-library dependencies are being dropped." - droppeddeps=yes - ;; - esac - ;; - esac - versuffix=$versuffix_save - major=$major_save - release=$release_save - libname=$libname_save - name=$name_save - - case $host in - *-*-rhapsody* | *-*-darwin1.[012]) - # On Rhapsody replace the C library with the System framework - newdeplibs=`$ECHO " $newdeplibs" | $SED 's/ -lc / System.ltframework /'` - ;; - esac - - if test "$droppeddeps" = yes; then - if test "$module" = yes; then - echo - echo "*** Warning: libtool could not satisfy all declared inter-library" - $ECHO "*** dependencies of module $libname. Therefore, libtool will create" - echo "*** a static module, that should work as long as the dlopening" - echo "*** application is linked with the -dlopen flag." - if test -z "$global_symbol_pipe"; then - echo - echo "*** However, this would only work if libtool was able to extract symbol" - echo "*** lists from a program, using \`nm' or equivalent, but libtool could" - echo "*** not find such a program. So, this module is probably useless." - echo "*** \`nm' from GNU binutils and a full rebuild may help." - fi - if test "$build_old_libs" = no; then - oldlibs="$output_objdir/$libname.$libext" - build_libtool_libs=module - build_old_libs=yes - else - build_libtool_libs=no - fi - else - echo "*** The inter-library dependencies that have been dropped here will be" - echo "*** automatically added whenever a program is linked with this library" - echo "*** or is declared to -dlopen it." - - if test "$allow_undefined" = no; then - echo - echo "*** Since this library must not contain undefined symbols," - echo "*** because either the platform does not support them or" - echo "*** it was explicitly requested with -no-undefined," - echo "*** libtool will only create a static version of it." - if test "$build_old_libs" = no; then - oldlibs="$output_objdir/$libname.$libext" - build_libtool_libs=module - build_old_libs=yes - else - build_libtool_libs=no - fi - fi - fi - fi - # Done checking deplibs! - deplibs=$newdeplibs - fi - # Time to change all our "foo.ltframework" stuff back to "-framework foo" - case $host in - *-*-darwin*) - newdeplibs=`$ECHO " $newdeplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` - new_inherited_linker_flags=`$ECHO " $new_inherited_linker_flags" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` - deplibs=`$ECHO " $deplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` - ;; - esac - - # move library search paths that coincide with paths to not yet - # installed libraries to the beginning of the library search list - new_libs= - for path in $notinst_path; do - case " $new_libs " in - *" -L$path/$objdir "*) ;; - *) - case " $deplibs " in - *" -L$path/$objdir "*) - func_append new_libs " -L$path/$objdir" ;; - esac - ;; - esac - done - for deplib in $deplibs; do - case $deplib in - -L*) - case " $new_libs " in - *" $deplib "*) ;; - *) func_append new_libs " $deplib" ;; - esac - ;; - *) func_append new_libs " $deplib" ;; - esac - done - deplibs="$new_libs" - - # All the library-specific variables (install_libdir is set above). - library_names= - old_library= - dlname= - - # Test again, we may have decided not to build it any more - if test "$build_libtool_libs" = yes; then - # Remove ${wl} instances when linking with ld. - # FIXME: should test the right _cmds variable. - case $archive_cmds in - *\$LD\ *) wl= ;; - esac - if test "$hardcode_into_libs" = yes; then - # Hardcode the library paths - hardcode_libdirs= - dep_rpath= - rpath="$finalize_rpath" - test "$opt_mode" != relink && rpath="$compile_rpath$rpath" - for libdir in $rpath; do - if test -n "$hardcode_libdir_flag_spec"; then - if test -n "$hardcode_libdir_separator"; then - func_replace_sysroot "$libdir" - libdir=$func_replace_sysroot_result - if test -z "$hardcode_libdirs"; then - hardcode_libdirs="$libdir" - else - # Just accumulate the unique libdirs. - case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in - *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*) - ;; - *) - func_append hardcode_libdirs "$hardcode_libdir_separator$libdir" - ;; - esac - fi - else - eval flag=\"$hardcode_libdir_flag_spec\" - func_append dep_rpath " $flag" - fi - elif test -n "$runpath_var"; then - case "$perm_rpath " in - *" $libdir "*) ;; - *) func_append perm_rpath " $libdir" ;; - esac - fi - done - # Substitute the hardcoded libdirs into the rpath. - if test -n "$hardcode_libdir_separator" && - test -n "$hardcode_libdirs"; then - libdir="$hardcode_libdirs" - eval "dep_rpath=\"$hardcode_libdir_flag_spec\"" - fi - if test -n "$runpath_var" && test -n "$perm_rpath"; then - # We should set the runpath_var. - rpath= - for dir in $perm_rpath; do - func_append rpath "$dir:" - done - eval "$runpath_var='$rpath\$$runpath_var'; export $runpath_var" - fi - test -n "$dep_rpath" && deplibs="$dep_rpath $deplibs" - fi - - shlibpath="$finalize_shlibpath" - test "$opt_mode" != relink && shlibpath="$compile_shlibpath$shlibpath" - if test -n "$shlibpath"; then - eval "$shlibpath_var='$shlibpath\$$shlibpath_var'; export $shlibpath_var" - fi - - # Get the real and link names of the library. - eval shared_ext=\"$shrext_cmds\" - eval library_names=\"$library_names_spec\" - set dummy $library_names - shift - realname="$1" - shift - - if test -n "$soname_spec"; then - eval soname=\"$soname_spec\" - else - soname="$realname" - fi - if test -z "$dlname"; then - dlname=$soname - fi - - lib="$output_objdir/$realname" - linknames= - for link - do - func_append linknames " $link" - done - - # Use standard objects if they are pic - test -z "$pic_flag" && libobjs=`$ECHO "$libobjs" | $SP2NL | $SED "$lo2o" | $NL2SP` - test "X$libobjs" = "X " && libobjs= - - delfiles= - if test -n "$export_symbols" && test -n "$include_expsyms"; then - $opt_dry_run || cp "$export_symbols" "$output_objdir/$libname.uexp" - export_symbols="$output_objdir/$libname.uexp" - func_append delfiles " $export_symbols" - fi - - orig_export_symbols= - case $host_os in - cygwin* | mingw* | cegcc*) - if test -n "$export_symbols" && test -z "$export_symbols_regex"; then - # exporting using user supplied symfile - if test "x`$SED 1q $export_symbols`" != xEXPORTS; then - # and it's NOT already a .def file. Must figure out - # which of the given symbols are data symbols and tag - # them as such. So, trigger use of export_symbols_cmds. - # export_symbols gets reassigned inside the "prepare - # the list of exported symbols" if statement, so the - # include_expsyms logic still works. - orig_export_symbols="$export_symbols" - export_symbols= - always_export_symbols=yes - fi - fi - ;; - esac - - # Prepare the list of exported symbols - if test -z "$export_symbols"; then - if test "$always_export_symbols" = yes || test -n "$export_symbols_regex"; then - func_verbose "generating symbol list for \`$libname.la'" - export_symbols="$output_objdir/$libname.exp" - $opt_dry_run || $RM $export_symbols - cmds=$export_symbols_cmds - save_ifs="$IFS"; IFS='~' - for cmd1 in $cmds; do - IFS="$save_ifs" - # Take the normal branch if the nm_file_list_spec branch - # doesn't work or if tool conversion is not needed. - case $nm_file_list_spec~$to_tool_file_cmd in - *~func_convert_file_noop | *~func_convert_file_msys_to_w32 | ~*) - try_normal_branch=yes - eval cmd=\"$cmd1\" - func_len " $cmd" - len=$func_len_result - ;; - *) - try_normal_branch=no - ;; - esac - if test "$try_normal_branch" = yes \ - && { test "$len" -lt "$max_cmd_len" \ - || test "$max_cmd_len" -le -1; } - then - func_show_eval "$cmd" 'exit $?' - skipped_export=false - elif test -n "$nm_file_list_spec"; then - func_basename "$output" - output_la=$func_basename_result - save_libobjs=$libobjs - save_output=$output - output=${output_objdir}/${output_la}.nm - func_to_tool_file "$output" - libobjs=$nm_file_list_spec$func_to_tool_file_result - func_append delfiles " $output" - func_verbose "creating $NM input file list: $output" - for obj in $save_libobjs; do - func_to_tool_file "$obj" - $ECHO "$func_to_tool_file_result" - done > "$output" - eval cmd=\"$cmd1\" - func_show_eval "$cmd" 'exit $?' - output=$save_output - libobjs=$save_libobjs - skipped_export=false - else - # The command line is too long to execute in one step. - func_verbose "using reloadable object file for export list..." - skipped_export=: - # Break out early, otherwise skipped_export may be - # set to false by a later but shorter cmd. - break - fi - done - IFS="$save_ifs" - if test -n "$export_symbols_regex" && test "X$skipped_export" != "X:"; then - func_show_eval '$EGREP -e "$export_symbols_regex" "$export_symbols" > "${export_symbols}T"' - func_show_eval '$MV "${export_symbols}T" "$export_symbols"' - fi - fi - fi - - if test -n "$export_symbols" && test -n "$include_expsyms"; then - tmp_export_symbols="$export_symbols" - test -n "$orig_export_symbols" && tmp_export_symbols="$orig_export_symbols" - $opt_dry_run || eval '$ECHO "$include_expsyms" | $SP2NL >> "$tmp_export_symbols"' - fi - - if test "X$skipped_export" != "X:" && test -n "$orig_export_symbols"; then - # The given exports_symbols file has to be filtered, so filter it. - func_verbose "filter symbol list for \`$libname.la' to tag DATA exports" - # FIXME: $output_objdir/$libname.filter potentially contains lots of - # 's' commands which not all seds can handle. GNU sed should be fine - # though. Also, the filter scales superlinearly with the number of - # global variables. join(1) would be nice here, but unfortunately - # isn't a blessed tool. - $opt_dry_run || $SED -e '/[ ,]DATA/!d;s,\(.*\)\([ \,].*\),s|^\1$|\1\2|,' < $export_symbols > $output_objdir/$libname.filter - func_append delfiles " $export_symbols $output_objdir/$libname.filter" - export_symbols=$output_objdir/$libname.def - $opt_dry_run || $SED -f $output_objdir/$libname.filter < $orig_export_symbols > $export_symbols - fi - - tmp_deplibs= - for test_deplib in $deplibs; do - case " $convenience " in - *" $test_deplib "*) ;; - *) - func_append tmp_deplibs " $test_deplib" - ;; - esac - done - deplibs="$tmp_deplibs" - - if test -n "$convenience"; then - if test -n "$whole_archive_flag_spec" && - test "$compiler_needs_object" = yes && - test -z "$libobjs"; then - # extract the archives, so we have objects to list. - # TODO: could optimize this to just extract one archive. - whole_archive_flag_spec= - fi - if test -n "$whole_archive_flag_spec"; then - save_libobjs=$libobjs - eval libobjs=\"\$libobjs $whole_archive_flag_spec\" - test "X$libobjs" = "X " && libobjs= - else - gentop="$output_objdir/${outputname}x" - func_append generated " $gentop" - - func_extract_archives $gentop $convenience - func_append libobjs " $func_extract_archives_result" - test "X$libobjs" = "X " && libobjs= - fi - fi - - if test "$thread_safe" = yes && test -n "$thread_safe_flag_spec"; then - eval flag=\"$thread_safe_flag_spec\" - func_append linker_flags " $flag" - fi - - # Make a backup of the uninstalled library when relinking - if test "$opt_mode" = relink; then - $opt_dry_run || eval '(cd $output_objdir && $RM ${realname}U && $MV $realname ${realname}U)' || exit $? - fi - - # Do each of the archive commands. - if test "$module" = yes && test -n "$module_cmds" ; then - if test -n "$export_symbols" && test -n "$module_expsym_cmds"; then - eval test_cmds=\"$module_expsym_cmds\" - cmds=$module_expsym_cmds - else - eval test_cmds=\"$module_cmds\" - cmds=$module_cmds - fi - else - if test -n "$export_symbols" && test -n "$archive_expsym_cmds"; then - eval test_cmds=\"$archive_expsym_cmds\" - cmds=$archive_expsym_cmds - else - eval test_cmds=\"$archive_cmds\" - cmds=$archive_cmds - fi - fi - - if test "X$skipped_export" != "X:" && - func_len " $test_cmds" && - len=$func_len_result && - test "$len" -lt "$max_cmd_len" || test "$max_cmd_len" -le -1; then - : - else - # The command line is too long to link in one step, link piecewise - # or, if using GNU ld and skipped_export is not :, use a linker - # script. - - # Save the value of $output and $libobjs because we want to - # use them later. If we have whole_archive_flag_spec, we - # want to use save_libobjs as it was before - # whole_archive_flag_spec was expanded, because we can't - # assume the linker understands whole_archive_flag_spec. - # This may have to be revisited, in case too many - # convenience libraries get linked in and end up exceeding - # the spec. - if test -z "$convenience" || test -z "$whole_archive_flag_spec"; then - save_libobjs=$libobjs - fi - save_output=$output - func_basename "$output" - output_la=$func_basename_result - - # Clear the reloadable object creation command queue and - # initialize k to one. - test_cmds= - concat_cmds= - objlist= - last_robj= - k=1 - - if test -n "$save_libobjs" && test "X$skipped_export" != "X:" && test "$with_gnu_ld" = yes; then - output=${output_objdir}/${output_la}.lnkscript - func_verbose "creating GNU ld script: $output" - echo 'INPUT (' > $output - for obj in $save_libobjs - do - func_to_tool_file "$obj" - $ECHO "$func_to_tool_file_result" >> $output - done - echo ')' >> $output - func_append delfiles " $output" - func_to_tool_file "$output" - output=$func_to_tool_file_result - elif test -n "$save_libobjs" && test "X$skipped_export" != "X:" && test "X$file_list_spec" != X; then - output=${output_objdir}/${output_la}.lnk - func_verbose "creating linker input file list: $output" - : > $output - set x $save_libobjs - shift - firstobj= - if test "$compiler_needs_object" = yes; then - firstobj="$1 " - shift - fi - for obj - do - func_to_tool_file "$obj" - $ECHO "$func_to_tool_file_result" >> $output - done - func_append delfiles " $output" - func_to_tool_file "$output" - output=$firstobj\"$file_list_spec$func_to_tool_file_result\" - else - if test -n "$save_libobjs"; then - func_verbose "creating reloadable object files..." - output=$output_objdir/$output_la-${k}.$objext - eval test_cmds=\"$reload_cmds\" - func_len " $test_cmds" - len0=$func_len_result - len=$len0 - - # Loop over the list of objects to be linked. - for obj in $save_libobjs - do - func_len " $obj" - func_arith $len + $func_len_result - len=$func_arith_result - if test "X$objlist" = X || - test "$len" -lt "$max_cmd_len"; then - func_append objlist " $obj" - else - # The command $test_cmds is almost too long, add a - # command to the queue. - if test "$k" -eq 1 ; then - # The first file doesn't have a previous command to add. - reload_objs=$objlist - eval concat_cmds=\"$reload_cmds\" - else - # All subsequent reloadable object files will link in - # the last one created. - reload_objs="$objlist $last_robj" - eval concat_cmds=\"\$concat_cmds~$reload_cmds~\$RM $last_robj\" - fi - last_robj=$output_objdir/$output_la-${k}.$objext - func_arith $k + 1 - k=$func_arith_result - output=$output_objdir/$output_la-${k}.$objext - objlist=" $obj" - func_len " $last_robj" - func_arith $len0 + $func_len_result - len=$func_arith_result - fi - done - # Handle the remaining objects by creating one last - # reloadable object file. All subsequent reloadable object - # files will link in the last one created. - test -z "$concat_cmds" || concat_cmds=$concat_cmds~ - reload_objs="$objlist $last_robj" - eval concat_cmds=\"\${concat_cmds}$reload_cmds\" - if test -n "$last_robj"; then - eval concat_cmds=\"\${concat_cmds}~\$RM $last_robj\" - fi - func_append delfiles " $output" - - else - output= - fi - - if ${skipped_export-false}; then - func_verbose "generating symbol list for \`$libname.la'" - export_symbols="$output_objdir/$libname.exp" - $opt_dry_run || $RM $export_symbols - libobjs=$output - # Append the command to create the export file. - test -z "$concat_cmds" || concat_cmds=$concat_cmds~ - eval concat_cmds=\"\$concat_cmds$export_symbols_cmds\" - if test -n "$last_robj"; then - eval concat_cmds=\"\$concat_cmds~\$RM $last_robj\" - fi - fi - - test -n "$save_libobjs" && - func_verbose "creating a temporary reloadable object file: $output" - - # Loop through the commands generated above and execute them. - save_ifs="$IFS"; IFS='~' - for cmd in $concat_cmds; do - IFS="$save_ifs" - $opt_silent || { - func_quote_for_expand "$cmd" - eval "func_echo $func_quote_for_expand_result" - } - $opt_dry_run || eval "$cmd" || { - lt_exit=$? - - # Restore the uninstalled library and exit - if test "$opt_mode" = relink; then - ( cd "$output_objdir" && \ - $RM "${realname}T" && \ - $MV "${realname}U" "$realname" ) - fi - - exit $lt_exit - } - done - IFS="$save_ifs" - - if test -n "$export_symbols_regex" && ${skipped_export-false}; then - func_show_eval '$EGREP -e "$export_symbols_regex" "$export_symbols" > "${export_symbols}T"' - func_show_eval '$MV "${export_symbols}T" "$export_symbols"' - fi - fi - - if ${skipped_export-false}; then - if test -n "$export_symbols" && test -n "$include_expsyms"; then - tmp_export_symbols="$export_symbols" - test -n "$orig_export_symbols" && tmp_export_symbols="$orig_export_symbols" - $opt_dry_run || eval '$ECHO "$include_expsyms" | $SP2NL >> "$tmp_export_symbols"' - fi - - if test -n "$orig_export_symbols"; then - # The given exports_symbols file has to be filtered, so filter it. - func_verbose "filter symbol list for \`$libname.la' to tag DATA exports" - # FIXME: $output_objdir/$libname.filter potentially contains lots of - # 's' commands which not all seds can handle. GNU sed should be fine - # though. Also, the filter scales superlinearly with the number of - # global variables. join(1) would be nice here, but unfortunately - # isn't a blessed tool. - $opt_dry_run || $SED -e '/[ ,]DATA/!d;s,\(.*\)\([ \,].*\),s|^\1$|\1\2|,' < $export_symbols > $output_objdir/$libname.filter - func_append delfiles " $export_symbols $output_objdir/$libname.filter" - export_symbols=$output_objdir/$libname.def - $opt_dry_run || $SED -f $output_objdir/$libname.filter < $orig_export_symbols > $export_symbols - fi - fi - - libobjs=$output - # Restore the value of output. - output=$save_output - - if test -n "$convenience" && test -n "$whole_archive_flag_spec"; then - eval libobjs=\"\$libobjs $whole_archive_flag_spec\" - test "X$libobjs" = "X " && libobjs= - fi - # Expand the library linking commands again to reset the - # value of $libobjs for piecewise linking. - - # Do each of the archive commands. - if test "$module" = yes && test -n "$module_cmds" ; then - if test -n "$export_symbols" && test -n "$module_expsym_cmds"; then - cmds=$module_expsym_cmds - else - cmds=$module_cmds - fi - else - if test -n "$export_symbols" && test -n "$archive_expsym_cmds"; then - cmds=$archive_expsym_cmds - else - cmds=$archive_cmds - fi - fi - fi - - if test -n "$delfiles"; then - # Append the command to remove temporary files to $cmds. - eval cmds=\"\$cmds~\$RM $delfiles\" - fi - - # Add any objects from preloaded convenience libraries - if test -n "$dlprefiles"; then - gentop="$output_objdir/${outputname}x" - func_append generated " $gentop" - - func_extract_archives $gentop $dlprefiles - func_append libobjs " $func_extract_archives_result" - test "X$libobjs" = "X " && libobjs= - fi - - save_ifs="$IFS"; IFS='~' - for cmd in $cmds; do - IFS="$save_ifs" - eval cmd=\"$cmd\" - $opt_silent || { - func_quote_for_expand "$cmd" - eval "func_echo $func_quote_for_expand_result" - } - $opt_dry_run || eval "$cmd" || { - lt_exit=$? - - # Restore the uninstalled library and exit - if test "$opt_mode" = relink; then - ( cd "$output_objdir" && \ - $RM "${realname}T" && \ - $MV "${realname}U" "$realname" ) - fi - - exit $lt_exit - } - done - IFS="$save_ifs" - - # Restore the uninstalled library and exit - if test "$opt_mode" = relink; then - $opt_dry_run || eval '(cd $output_objdir && $RM ${realname}T && $MV $realname ${realname}T && $MV ${realname}U $realname)' || exit $? - - if test -n "$convenience"; then - if test -z "$whole_archive_flag_spec"; then - func_show_eval '${RM}r "$gentop"' - fi - fi - - exit $EXIT_SUCCESS - fi - - # Create links to the real library. - for linkname in $linknames; do - if test "$realname" != "$linkname"; then - func_show_eval '(cd "$output_objdir" && $RM "$linkname" && $LN_S "$realname" "$linkname")' 'exit $?' - fi - done - - # If -module or -export-dynamic was specified, set the dlname. - if test "$module" = yes || test "$export_dynamic" = yes; then - # On all known operating systems, these are identical. - dlname="$soname" - fi - fi - ;; - - obj) - if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then - func_warning "\`-dlopen' is ignored for objects" - fi - - case " $deplibs" in - *\ -l* | *\ -L*) - func_warning "\`-l' and \`-L' are ignored for objects" ;; - esac - - test -n "$rpath" && \ - func_warning "\`-rpath' is ignored for objects" - - test -n "$xrpath" && \ - func_warning "\`-R' is ignored for objects" - - test -n "$vinfo" && \ - func_warning "\`-version-info' is ignored for objects" - - test -n "$release" && \ - func_warning "\`-release' is ignored for objects" - - case $output in - *.lo) - test -n "$objs$old_deplibs" && \ - func_fatal_error "cannot build library object \`$output' from non-libtool objects" - - libobj=$output - func_lo2o "$libobj" - obj=$func_lo2o_result - ;; - *) - libobj= - obj="$output" - ;; - esac - - # Delete the old objects. - $opt_dry_run || $RM $obj $libobj - - # Objects from convenience libraries. This assumes - # single-version convenience libraries. Whenever we create - # different ones for PIC/non-PIC, this we'll have to duplicate - # the extraction. - reload_conv_objs= - gentop= - # reload_cmds runs $LD directly, so let us get rid of - # -Wl from whole_archive_flag_spec and hope we can get by with - # turning comma into space.. - wl= - - if test -n "$convenience"; then - if test -n "$whole_archive_flag_spec"; then - eval tmp_whole_archive_flags=\"$whole_archive_flag_spec\" - reload_conv_objs=$reload_objs\ `$ECHO "$tmp_whole_archive_flags" | $SED 's|,| |g'` - else - gentop="$output_objdir/${obj}x" - func_append generated " $gentop" - - func_extract_archives $gentop $convenience - reload_conv_objs="$reload_objs $func_extract_archives_result" - fi - fi - - # If we're not building shared, we need to use non_pic_objs - test "$build_libtool_libs" != yes && libobjs="$non_pic_objects" - - # Create the old-style object. - reload_objs="$objs$old_deplibs "`$ECHO "$libobjs" | $SP2NL | $SED "/\.${libext}$/d; /\.lib$/d; $lo2o" | $NL2SP`" $reload_conv_objs" ### testsuite: skip nested quoting test - - output="$obj" - func_execute_cmds "$reload_cmds" 'exit $?' - - # Exit if we aren't doing a library object file. - if test -z "$libobj"; then - if test -n "$gentop"; then - func_show_eval '${RM}r "$gentop"' - fi - - exit $EXIT_SUCCESS - fi - - if test "$build_libtool_libs" != yes; then - if test -n "$gentop"; then - func_show_eval '${RM}r "$gentop"' - fi - - # Create an invalid libtool object if no PIC, so that we don't - # accidentally link it into a program. - # $show "echo timestamp > $libobj" - # $opt_dry_run || eval "echo timestamp > $libobj" || exit $? - exit $EXIT_SUCCESS - fi - - if test -n "$pic_flag" || test "$pic_mode" != default; then - # Only do commands if we really have different PIC objects. - reload_objs="$libobjs $reload_conv_objs" - output="$libobj" - func_execute_cmds "$reload_cmds" 'exit $?' - fi - - if test -n "$gentop"; then - func_show_eval '${RM}r "$gentop"' - fi - - exit $EXIT_SUCCESS - ;; - - prog) - case $host in - *cygwin*) func_stripname '' '.exe' "$output" - output=$func_stripname_result.exe;; - esac - test -n "$vinfo" && \ - func_warning "\`-version-info' is ignored for programs" - - test -n "$release" && \ - func_warning "\`-release' is ignored for programs" - - test "$preload" = yes \ - && test "$dlopen_support" = unknown \ - && test "$dlopen_self" = unknown \ - && test "$dlopen_self_static" = unknown && \ - func_warning "\`LT_INIT([dlopen])' not used. Assuming no dlopen support." - - case $host in - *-*-rhapsody* | *-*-darwin1.[012]) - # On Rhapsody replace the C library is the System framework - compile_deplibs=`$ECHO " $compile_deplibs" | $SED 's/ -lc / System.ltframework /'` - finalize_deplibs=`$ECHO " $finalize_deplibs" | $SED 's/ -lc / System.ltframework /'` - ;; - esac - - case $host in - *-*-darwin*) - # Don't allow lazy linking, it breaks C++ global constructors - # But is supposedly fixed on 10.4 or later (yay!). - if test "$tagname" = CXX ; then - case ${MACOSX_DEPLOYMENT_TARGET-10.0} in - 10.[0123]) - func_append compile_command " ${wl}-bind_at_load" - func_append finalize_command " ${wl}-bind_at_load" - ;; - esac - fi - # Time to change all our "foo.ltframework" stuff back to "-framework foo" - compile_deplibs=`$ECHO " $compile_deplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` - finalize_deplibs=`$ECHO " $finalize_deplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` - ;; - esac - - - # move library search paths that coincide with paths to not yet - # installed libraries to the beginning of the library search list - new_libs= - for path in $notinst_path; do - case " $new_libs " in - *" -L$path/$objdir "*) ;; - *) - case " $compile_deplibs " in - *" -L$path/$objdir "*) - func_append new_libs " -L$path/$objdir" ;; - esac - ;; - esac - done - for deplib in $compile_deplibs; do - case $deplib in - -L*) - case " $new_libs " in - *" $deplib "*) ;; - *) func_append new_libs " $deplib" ;; - esac - ;; - *) func_append new_libs " $deplib" ;; - esac - done - compile_deplibs="$new_libs" - - - func_append compile_command " $compile_deplibs" - func_append finalize_command " $finalize_deplibs" - - if test -n "$rpath$xrpath"; then - # If the user specified any rpath flags, then add them. - for libdir in $rpath $xrpath; do - # This is the magic to use -rpath. - case "$finalize_rpath " in - *" $libdir "*) ;; - *) func_append finalize_rpath " $libdir" ;; - esac - done - fi - - # Now hardcode the library paths - rpath= - hardcode_libdirs= - for libdir in $compile_rpath $finalize_rpath; do - if test -n "$hardcode_libdir_flag_spec"; then - if test -n "$hardcode_libdir_separator"; then - if test -z "$hardcode_libdirs"; then - hardcode_libdirs="$libdir" - else - # Just accumulate the unique libdirs. - case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in - *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*) - ;; - *) - func_append hardcode_libdirs "$hardcode_libdir_separator$libdir" - ;; - esac - fi - else - eval flag=\"$hardcode_libdir_flag_spec\" - func_append rpath " $flag" - fi - elif test -n "$runpath_var"; then - case "$perm_rpath " in - *" $libdir "*) ;; - *) func_append perm_rpath " $libdir" ;; - esac - fi - case $host in - *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*) - testbindir=`${ECHO} "$libdir" | ${SED} -e 's*/lib$*/bin*'` - case :$dllsearchpath: in - *":$libdir:"*) ;; - ::) dllsearchpath=$libdir;; - *) func_append dllsearchpath ":$libdir";; - esac - case :$dllsearchpath: in - *":$testbindir:"*) ;; - ::) dllsearchpath=$testbindir;; - *) func_append dllsearchpath ":$testbindir";; - esac - ;; - esac - done - # Substitute the hardcoded libdirs into the rpath. - if test -n "$hardcode_libdir_separator" && - test -n "$hardcode_libdirs"; then - libdir="$hardcode_libdirs" - eval rpath=\" $hardcode_libdir_flag_spec\" - fi - compile_rpath="$rpath" - - rpath= - hardcode_libdirs= - for libdir in $finalize_rpath; do - if test -n "$hardcode_libdir_flag_spec"; then - if test -n "$hardcode_libdir_separator"; then - if test -z "$hardcode_libdirs"; then - hardcode_libdirs="$libdir" - else - # Just accumulate the unique libdirs. - case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in - *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*) - ;; - *) - func_append hardcode_libdirs "$hardcode_libdir_separator$libdir" - ;; - esac - fi - else - eval flag=\"$hardcode_libdir_flag_spec\" - func_append rpath " $flag" - fi - elif test -n "$runpath_var"; then - case "$finalize_perm_rpath " in - *" $libdir "*) ;; - *) func_append finalize_perm_rpath " $libdir" ;; - esac - fi - done - # Substitute the hardcoded libdirs into the rpath. - if test -n "$hardcode_libdir_separator" && - test -n "$hardcode_libdirs"; then - libdir="$hardcode_libdirs" - eval rpath=\" $hardcode_libdir_flag_spec\" - fi - finalize_rpath="$rpath" - - if test -n "$libobjs" && test "$build_old_libs" = yes; then - # Transform all the library objects into standard objects. - compile_command=`$ECHO "$compile_command" | $SP2NL | $SED "$lo2o" | $NL2SP` - finalize_command=`$ECHO "$finalize_command" | $SP2NL | $SED "$lo2o" | $NL2SP` - fi - - func_generate_dlsyms "$outputname" "@PROGRAM@" "no" - - # template prelinking step - if test -n "$prelink_cmds"; then - func_execute_cmds "$prelink_cmds" 'exit $?' - fi - - wrappers_required=yes - case $host in - *cegcc* | *mingw32ce*) - # Disable wrappers for cegcc and mingw32ce hosts, we are cross compiling anyway. - wrappers_required=no - ;; - *cygwin* | *mingw* ) - if test "$build_libtool_libs" != yes; then - wrappers_required=no - fi - ;; - *) - if test "$need_relink" = no || test "$build_libtool_libs" != yes; then - wrappers_required=no - fi - ;; - esac - if test "$wrappers_required" = no; then - # Replace the output file specification. - compile_command=`$ECHO "$compile_command" | $SED 's%@OUTPUT@%'"$output"'%g'` - link_command="$compile_command$compile_rpath" - - # We have no uninstalled library dependencies, so finalize right now. - exit_status=0 - func_show_eval "$link_command" 'exit_status=$?' - - if test -n "$postlink_cmds"; then - func_to_tool_file "$output" - postlink_cmds=`func_echo_all "$postlink_cmds" | $SED -e 's%@OUTPUT@%'"$output"'%g' -e 's%@TOOL_OUTPUT@%'"$func_to_tool_file_result"'%g'` - func_execute_cmds "$postlink_cmds" 'exit $?' - fi - - # Delete the generated files. - if test -f "$output_objdir/${outputname}S.${objext}"; then - func_show_eval '$RM "$output_objdir/${outputname}S.${objext}"' - fi - - exit $exit_status - fi - - if test -n "$compile_shlibpath$finalize_shlibpath"; then - compile_command="$shlibpath_var=\"$compile_shlibpath$finalize_shlibpath\$$shlibpath_var\" $compile_command" - fi - if test -n "$finalize_shlibpath"; then - finalize_command="$shlibpath_var=\"$finalize_shlibpath\$$shlibpath_var\" $finalize_command" - fi - - compile_var= - finalize_var= - if test -n "$runpath_var"; then - if test -n "$perm_rpath"; then - # We should set the runpath_var. - rpath= - for dir in $perm_rpath; do - func_append rpath "$dir:" - done - compile_var="$runpath_var=\"$rpath\$$runpath_var\" " - fi - if test -n "$finalize_perm_rpath"; then - # We should set the runpath_var. - rpath= - for dir in $finalize_perm_rpath; do - func_append rpath "$dir:" - done - finalize_var="$runpath_var=\"$rpath\$$runpath_var\" " - fi - fi - - if test "$no_install" = yes; then - # We don't need to create a wrapper script. - link_command="$compile_var$compile_command$compile_rpath" - # Replace the output file specification. - link_command=`$ECHO "$link_command" | $SED 's%@OUTPUT@%'"$output"'%g'` - # Delete the old output file. - $opt_dry_run || $RM $output - # Link the executable and exit - func_show_eval "$link_command" 'exit $?' - - if test -n "$postlink_cmds"; then - func_to_tool_file "$output" - postlink_cmds=`func_echo_all "$postlink_cmds" | $SED -e 's%@OUTPUT@%'"$output"'%g' -e 's%@TOOL_OUTPUT@%'"$func_to_tool_file_result"'%g'` - func_execute_cmds "$postlink_cmds" 'exit $?' - fi - - exit $EXIT_SUCCESS - fi - - if test "$hardcode_action" = relink; then - # Fast installation is not supported - link_command="$compile_var$compile_command$compile_rpath" - relink_command="$finalize_var$finalize_command$finalize_rpath" - - func_warning "this platform does not like uninstalled shared libraries" - func_warning "\`$output' will be relinked during installation" - else - if test "$fast_install" != no; then - link_command="$finalize_var$compile_command$finalize_rpath" - if test "$fast_install" = yes; then - relink_command=`$ECHO "$compile_var$compile_command$compile_rpath" | $SED 's%@OUTPUT@%\$progdir/\$file%g'` - else - # fast_install is set to needless - relink_command= - fi - else - link_command="$compile_var$compile_command$compile_rpath" - relink_command="$finalize_var$finalize_command$finalize_rpath" - fi - fi - - # Replace the output file specification. - link_command=`$ECHO "$link_command" | $SED 's%@OUTPUT@%'"$output_objdir/$outputname"'%g'` - - # Delete the old output files. - $opt_dry_run || $RM $output $output_objdir/$outputname $output_objdir/lt-$outputname - - func_show_eval "$link_command" 'exit $?' - - if test -n "$postlink_cmds"; then - func_to_tool_file "$output_objdir/$outputname" - postlink_cmds=`func_echo_all "$postlink_cmds" | $SED -e 's%@OUTPUT@%'"$output_objdir/$outputname"'%g' -e 's%@TOOL_OUTPUT@%'"$func_to_tool_file_result"'%g'` - func_execute_cmds "$postlink_cmds" 'exit $?' - fi - - # Now create the wrapper script. - func_verbose "creating $output" - - # Quote the relink command for shipping. - if test -n "$relink_command"; then - # Preserve any variables that may affect compiler behavior - for var in $variables_saved_for_relink; do - if eval test -z \"\${$var+set}\"; then - relink_command="{ test -z \"\${$var+set}\" || $lt_unset $var || { $var=; export $var; }; }; $relink_command" - elif eval var_value=\$$var; test -z "$var_value"; then - relink_command="$var=; export $var; $relink_command" - else - func_quote_for_eval "$var_value" - relink_command="$var=$func_quote_for_eval_result; export $var; $relink_command" - fi - done - relink_command="(cd `pwd`; $relink_command)" - relink_command=`$ECHO "$relink_command" | $SED "$sed_quote_subst"` - fi - - # Only actually do things if not in dry run mode. - $opt_dry_run || { - # win32 will think the script is a binary if it has - # a .exe suffix, so we strip it off here. - case $output in - *.exe) func_stripname '' '.exe' "$output" - output=$func_stripname_result ;; - esac - # test for cygwin because mv fails w/o .exe extensions - case $host in - *cygwin*) - exeext=.exe - func_stripname '' '.exe' "$outputname" - outputname=$func_stripname_result ;; - *) exeext= ;; - esac - case $host in - *cygwin* | *mingw* ) - func_dirname_and_basename "$output" "" "." - output_name=$func_basename_result - output_path=$func_dirname_result - cwrappersource="$output_path/$objdir/lt-$output_name.c" - cwrapper="$output_path/$output_name.exe" - $RM $cwrappersource $cwrapper - trap "$RM $cwrappersource $cwrapper; exit $EXIT_FAILURE" 1 2 15 - - func_emit_cwrapperexe_src > $cwrappersource - - # The wrapper executable is built using the $host compiler, - # because it contains $host paths and files. If cross- - # compiling, it, like the target executable, must be - # executed on the $host or under an emulation environment. - $opt_dry_run || { - $LTCC $LTCFLAGS -o $cwrapper $cwrappersource - $STRIP $cwrapper - } - - # Now, create the wrapper script for func_source use: - func_ltwrapper_scriptname $cwrapper - $RM $func_ltwrapper_scriptname_result - trap "$RM $func_ltwrapper_scriptname_result; exit $EXIT_FAILURE" 1 2 15 - $opt_dry_run || { - # note: this script will not be executed, so do not chmod. - if test "x$build" = "x$host" ; then - $cwrapper --lt-dump-script > $func_ltwrapper_scriptname_result - else - func_emit_wrapper no > $func_ltwrapper_scriptname_result - fi - } - ;; - * ) - $RM $output - trap "$RM $output; exit $EXIT_FAILURE" 1 2 15 - - func_emit_wrapper no > $output - chmod +x $output - ;; - esac - } - exit $EXIT_SUCCESS - ;; - esac - - # See if we need to build an old-fashioned archive. - for oldlib in $oldlibs; do - - if test "$build_libtool_libs" = convenience; then - oldobjs="$libobjs_save $symfileobj" - addlibs="$convenience" - build_libtool_libs=no - else - if test "$build_libtool_libs" = module; then - oldobjs="$libobjs_save" - build_libtool_libs=no - else - oldobjs="$old_deplibs $non_pic_objects" - if test "$preload" = yes && test -f "$symfileobj"; then - func_append oldobjs " $symfileobj" - fi - fi - addlibs="$old_convenience" - fi - - if test -n "$addlibs"; then - gentop="$output_objdir/${outputname}x" - func_append generated " $gentop" - - func_extract_archives $gentop $addlibs - func_append oldobjs " $func_extract_archives_result" - fi - - # Do each command in the archive commands. - if test -n "$old_archive_from_new_cmds" && test "$build_libtool_libs" = yes; then - cmds=$old_archive_from_new_cmds - else - - # Add any objects from preloaded convenience libraries - if test -n "$dlprefiles"; then - gentop="$output_objdir/${outputname}x" - func_append generated " $gentop" - - func_extract_archives $gentop $dlprefiles - func_append oldobjs " $func_extract_archives_result" - fi - - # POSIX demands no paths to be encoded in archives. We have - # to avoid creating archives with duplicate basenames if we - # might have to extract them afterwards, e.g., when creating a - # static archive out of a convenience library, or when linking - # the entirety of a libtool archive into another (currently - # not supported by libtool). - if (for obj in $oldobjs - do - func_basename "$obj" - $ECHO "$func_basename_result" - done | sort | sort -uc >/dev/null 2>&1); then - : - else - echo "copying selected object files to avoid basename conflicts..." - gentop="$output_objdir/${outputname}x" - func_append generated " $gentop" - func_mkdir_p "$gentop" - save_oldobjs=$oldobjs - oldobjs= - counter=1 - for obj in $save_oldobjs - do - func_basename "$obj" - objbase="$func_basename_result" - case " $oldobjs " in - " ") oldobjs=$obj ;; - *[\ /]"$objbase "*) - while :; do - # Make sure we don't pick an alternate name that also - # overlaps. - newobj=lt$counter-$objbase - func_arith $counter + 1 - counter=$func_arith_result - case " $oldobjs " in - *[\ /]"$newobj "*) ;; - *) if test ! -f "$gentop/$newobj"; then break; fi ;; - esac - done - func_show_eval "ln $obj $gentop/$newobj || cp $obj $gentop/$newobj" - func_append oldobjs " $gentop/$newobj" - ;; - *) func_append oldobjs " $obj" ;; - esac - done - fi - func_to_tool_file "$oldlib" func_convert_file_msys_to_w32 - tool_oldlib=$func_to_tool_file_result - eval cmds=\"$old_archive_cmds\" - - func_len " $cmds" - len=$func_len_result - if test "$len" -lt "$max_cmd_len" || test "$max_cmd_len" -le -1; then - cmds=$old_archive_cmds - elif test -n "$archiver_list_spec"; then - func_verbose "using command file archive linking..." - for obj in $oldobjs - do - func_to_tool_file "$obj" - $ECHO "$func_to_tool_file_result" - done > $output_objdir/$libname.libcmd - func_to_tool_file "$output_objdir/$libname.libcmd" - oldobjs=" $archiver_list_spec$func_to_tool_file_result" - cmds=$old_archive_cmds - else - # the command line is too long to link in one step, link in parts - func_verbose "using piecewise archive linking..." - save_RANLIB=$RANLIB - RANLIB=: - objlist= - concat_cmds= - save_oldobjs=$oldobjs - oldobjs= - # Is there a better way of finding the last object in the list? - for obj in $save_oldobjs - do - last_oldobj=$obj - done - eval test_cmds=\"$old_archive_cmds\" - func_len " $test_cmds" - len0=$func_len_result - len=$len0 - for obj in $save_oldobjs - do - func_len " $obj" - func_arith $len + $func_len_result - len=$func_arith_result - func_append objlist " $obj" - if test "$len" -lt "$max_cmd_len"; then - : - else - # the above command should be used before it gets too long - oldobjs=$objlist - if test "$obj" = "$last_oldobj" ; then - RANLIB=$save_RANLIB - fi - test -z "$concat_cmds" || concat_cmds=$concat_cmds~ - eval concat_cmds=\"\${concat_cmds}$old_archive_cmds\" - objlist= - len=$len0 - fi - done - RANLIB=$save_RANLIB - oldobjs=$objlist - if test "X$oldobjs" = "X" ; then - eval cmds=\"\$concat_cmds\" - else - eval cmds=\"\$concat_cmds~\$old_archive_cmds\" - fi - fi - fi - func_execute_cmds "$cmds" 'exit $?' - done - - test -n "$generated" && \ - func_show_eval "${RM}r$generated" - - # Now create the libtool archive. - case $output in - *.la) - old_library= - test "$build_old_libs" = yes && old_library="$libname.$libext" - func_verbose "creating $output" - - # Preserve any variables that may affect compiler behavior - for var in $variables_saved_for_relink; do - if eval test -z \"\${$var+set}\"; then - relink_command="{ test -z \"\${$var+set}\" || $lt_unset $var || { $var=; export $var; }; }; $relink_command" - elif eval var_value=\$$var; test -z "$var_value"; then - relink_command="$var=; export $var; $relink_command" - else - func_quote_for_eval "$var_value" - relink_command="$var=$func_quote_for_eval_result; export $var; $relink_command" - fi - done - # Quote the link command for shipping. - relink_command="(cd `pwd`; $SHELL $progpath $preserve_args --mode=relink $libtool_args @inst_prefix_dir@)" - relink_command=`$ECHO "$relink_command" | $SED "$sed_quote_subst"` - if test "$hardcode_automatic" = yes ; then - relink_command= - fi - - # Only create the output if not a dry run. - $opt_dry_run || { - for installed in no yes; do - if test "$installed" = yes; then - if test -z "$install_libdir"; then - break - fi - output="$output_objdir/$outputname"i - # Replace all uninstalled libtool libraries with the installed ones - newdependency_libs= - for deplib in $dependency_libs; do - case $deplib in - *.la) - func_basename "$deplib" - name="$func_basename_result" - func_resolve_sysroot "$deplib" - eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $func_resolve_sysroot_result` - test -z "$libdir" && \ - func_fatal_error "\`$deplib' is not a valid libtool archive" - func_append newdependency_libs " ${lt_sysroot:+=}$libdir/$name" - ;; - -L*) - func_stripname -L '' "$deplib" - func_replace_sysroot "$func_stripname_result" - func_append newdependency_libs " -L$func_replace_sysroot_result" - ;; - -R*) - func_stripname -R '' "$deplib" - func_replace_sysroot "$func_stripname_result" - func_append newdependency_libs " -R$func_replace_sysroot_result" - ;; - *) func_append newdependency_libs " $deplib" ;; - esac - done - dependency_libs="$newdependency_libs" - newdlfiles= - - for lib in $dlfiles; do - case $lib in - *.la) - func_basename "$lib" - name="$func_basename_result" - eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $lib` - test -z "$libdir" && \ - func_fatal_error "\`$lib' is not a valid libtool archive" - func_append newdlfiles " ${lt_sysroot:+=}$libdir/$name" - ;; - *) func_append newdlfiles " $lib" ;; - esac - done - dlfiles="$newdlfiles" - newdlprefiles= - for lib in $dlprefiles; do - case $lib in - *.la) - # Only pass preopened files to the pseudo-archive (for - # eventual linking with the app. that links it) if we - # didn't already link the preopened objects directly into - # the library: - func_basename "$lib" - name="$func_basename_result" - eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $lib` - test -z "$libdir" && \ - func_fatal_error "\`$lib' is not a valid libtool archive" - func_append newdlprefiles " ${lt_sysroot:+=}$libdir/$name" - ;; - esac - done - dlprefiles="$newdlprefiles" - else - newdlfiles= - for lib in $dlfiles; do - case $lib in - [\\/]* | [A-Za-z]:[\\/]*) abs="$lib" ;; - *) abs=`pwd`"/$lib" ;; - esac - func_append newdlfiles " $abs" - done - dlfiles="$newdlfiles" - newdlprefiles= - for lib in $dlprefiles; do - case $lib in - [\\/]* | [A-Za-z]:[\\/]*) abs="$lib" ;; - *) abs=`pwd`"/$lib" ;; - esac - func_append newdlprefiles " $abs" - done - dlprefiles="$newdlprefiles" - fi - $RM $output - # place dlname in correct position for cygwin - # In fact, it would be nice if we could use this code for all target - # systems that can't hard-code library paths into their executables - # and that have no shared library path variable independent of PATH, - # but it turns out we can't easily determine that from inspecting - # libtool variables, so we have to hard-code the OSs to which it - # applies here; at the moment, that means platforms that use the PE - # object format with DLL files. See the long comment at the top of - # tests/bindir.at for full details. - tdlname=$dlname - case $host,$output,$installed,$module,$dlname in - *cygwin*,*lai,yes,no,*.dll | *mingw*,*lai,yes,no,*.dll | *cegcc*,*lai,yes,no,*.dll) - # If a -bindir argument was supplied, place the dll there. - if test "x$bindir" != x ; - then - func_relative_path "$install_libdir" "$bindir" - tdlname=$func_relative_path_result$dlname - else - # Otherwise fall back on heuristic. - tdlname=../bin/$dlname - fi - ;; - esac - $ECHO > $output "\ -# $outputname - a libtool library file -# Generated by $PROGRAM (GNU $PACKAGE$TIMESTAMP) $VERSION -# -# Please DO NOT delete this file! -# It is necessary for linking the library. - -# The name that we can dlopen(3). -dlname='$tdlname' - -# Names of this library. -library_names='$library_names' - -# The name of the static archive. -old_library='$old_library' - -# Linker flags that can not go in dependency_libs. -inherited_linker_flags='$new_inherited_linker_flags' - -# Libraries that this one depends upon. -dependency_libs='$dependency_libs' - -# Names of additional weak libraries provided by this library -weak_library_names='$weak_libs' - -# Version information for $libname. -current=$current -age=$age -revision=$revision - -# Is this an already installed library? -installed=$installed - -# Should we warn about portability when linking against -modules? -shouldnotlink=$module - -# Files to dlopen/dlpreopen -dlopen='$dlfiles' -dlpreopen='$dlprefiles' - -# Directory that this library needs to be installed in: -libdir='$install_libdir'" - if test "$installed" = no && test "$need_relink" = yes; then - $ECHO >> $output "\ -relink_command=\"$relink_command\"" - fi - done - } - - # Do a symbolic link so that the libtool archive can be found in - # LD_LIBRARY_PATH before the program is installed. - func_show_eval '( cd "$output_objdir" && $RM "$outputname" && $LN_S "../$outputname" "$outputname" )' 'exit $?' - ;; - esac - exit $EXIT_SUCCESS -} - -{ test "$opt_mode" = link || test "$opt_mode" = relink; } && - func_mode_link ${1+"$@"} - - -# func_mode_uninstall arg... -func_mode_uninstall () -{ - $opt_debug - RM="$nonopt" - files= - rmforce= - exit_status=0 - - # This variable tells wrapper scripts just to set variables rather - # than running their programs. - libtool_install_magic="$magic" - - for arg - do - case $arg in - -f) func_append RM " $arg"; rmforce=yes ;; - -*) func_append RM " $arg" ;; - *) func_append files " $arg" ;; - esac - done - - test -z "$RM" && \ - func_fatal_help "you must specify an RM program" - - rmdirs= - - for file in $files; do - func_dirname "$file" "" "." - dir="$func_dirname_result" - if test "X$dir" = X.; then - odir="$objdir" - else - odir="$dir/$objdir" - fi - func_basename "$file" - name="$func_basename_result" - test "$opt_mode" = uninstall && odir="$dir" - - # Remember odir for removal later, being careful to avoid duplicates - if test "$opt_mode" = clean; then - case " $rmdirs " in - *" $odir "*) ;; - *) func_append rmdirs " $odir" ;; - esac - fi - - # Don't error if the file doesn't exist and rm -f was used. - if { test -L "$file"; } >/dev/null 2>&1 || - { test -h "$file"; } >/dev/null 2>&1 || - test -f "$file"; then - : - elif test -d "$file"; then - exit_status=1 - continue - elif test "$rmforce" = yes; then - continue - fi - - rmfiles="$file" - - case $name in - *.la) - # Possibly a libtool archive, so verify it. - if func_lalib_p "$file"; then - func_source $dir/$name - - # Delete the libtool libraries and symlinks. - for n in $library_names; do - func_append rmfiles " $odir/$n" - done - test -n "$old_library" && func_append rmfiles " $odir/$old_library" - - case "$opt_mode" in - clean) - case " $library_names " in - *" $dlname "*) ;; - *) test -n "$dlname" && func_append rmfiles " $odir/$dlname" ;; - esac - test -n "$libdir" && func_append rmfiles " $odir/$name $odir/${name}i" - ;; - uninstall) - if test -n "$library_names"; then - # Do each command in the postuninstall commands. - func_execute_cmds "$postuninstall_cmds" 'test "$rmforce" = yes || exit_status=1' - fi - - if test -n "$old_library"; then - # Do each command in the old_postuninstall commands. - func_execute_cmds "$old_postuninstall_cmds" 'test "$rmforce" = yes || exit_status=1' - fi - # FIXME: should reinstall the best remaining shared library. - ;; - esac - fi - ;; - - *.lo) - # Possibly a libtool object, so verify it. - if func_lalib_p "$file"; then - - # Read the .lo file - func_source $dir/$name - - # Add PIC object to the list of files to remove. - if test -n "$pic_object" && - test "$pic_object" != none; then - func_append rmfiles " $dir/$pic_object" - fi - - # Add non-PIC object to the list of files to remove. - if test -n "$non_pic_object" && - test "$non_pic_object" != none; then - func_append rmfiles " $dir/$non_pic_object" - fi - fi - ;; - - *) - if test "$opt_mode" = clean ; then - noexename=$name - case $file in - *.exe) - func_stripname '' '.exe' "$file" - file=$func_stripname_result - func_stripname '' '.exe' "$name" - noexename=$func_stripname_result - # $file with .exe has already been added to rmfiles, - # add $file without .exe - func_append rmfiles " $file" - ;; - esac - # Do a test to see if this is a libtool program. - if func_ltwrapper_p "$file"; then - if func_ltwrapper_executable_p "$file"; then - func_ltwrapper_scriptname "$file" - relink_command= - func_source $func_ltwrapper_scriptname_result - func_append rmfiles " $func_ltwrapper_scriptname_result" - else - relink_command= - func_source $dir/$noexename - fi - - # note $name still contains .exe if it was in $file originally - # as does the version of $file that was added into $rmfiles - func_append rmfiles " $odir/$name $odir/${name}S.${objext}" - if test "$fast_install" = yes && test -n "$relink_command"; then - func_append rmfiles " $odir/lt-$name" - fi - if test "X$noexename" != "X$name" ; then - func_append rmfiles " $odir/lt-${noexename}.c" - fi - fi - fi - ;; - esac - func_show_eval "$RM $rmfiles" 'exit_status=1' - done - - # Try to remove the ${objdir}s in the directories where we deleted files - for dir in $rmdirs; do - if test -d "$dir"; then - func_show_eval "rmdir $dir >/dev/null 2>&1" - fi - done - - exit $exit_status -} - -{ test "$opt_mode" = uninstall || test "$opt_mode" = clean; } && - func_mode_uninstall ${1+"$@"} - -test -z "$opt_mode" && { - help="$generic_help" - func_fatal_help "you must specify a MODE" -} - -test -z "$exec_cmd" && \ - func_fatal_help "invalid operation mode \`$opt_mode'" - -if test -n "$exec_cmd"; then - eval exec "$exec_cmd" - exit $EXIT_FAILURE -fi - -exit $exit_status - - -# The TAGs below are defined such that we never get into a situation -# in which we disable both kinds of libraries. Given conflicting -# choices, we go for a static library, that is the most portable, -# since we can't tell whether shared libraries were disabled because -# the user asked for that or because the platform doesn't support -# them. This is particularly important on AIX, because we don't -# support having both static and shared libraries enabled at the same -# time on that platform, so we default to a shared-only configuration. -# If a disable-shared tag is given, we'll fallback to a static-only -# configuration. But we'll never go from static-only to shared-only. - -# ### BEGIN LIBTOOL TAG CONFIG: disable-shared -build_libtool_libs=no -build_old_libs=yes -# ### END LIBTOOL TAG CONFIG: disable-shared - -# ### BEGIN LIBTOOL TAG CONFIG: disable-static -build_old_libs=`case $build_libtool_libs in yes) echo no;; *) echo yes;; esac` -# ### END LIBTOOL TAG CONFIG: disable-static - -# Local Variables: -# mode:shell-script -# sh-indentation:2 -# End: -# vi:sw=2 - diff --git a/pkg/registry/zookeeper-3.4.6/src/c/missing b/pkg/registry/zookeeper-3.4.6/src/c/missing deleted file mode 100755 index 86a8fc31e..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/c/missing +++ /dev/null @@ -1,331 +0,0 @@ -#! /bin/sh -# Common stub for a few missing GNU programs while installing. - -scriptversion=2012-01-06.13; # UTC - -# Copyright (C) 1996, 1997, 1999, 2000, 2002, 2003, 2004, 2005, 2006, -# 2008, 2009, 2010, 2011, 2012 Free Software Foundation, Inc. -# Originally by Fran,cois Pinard , 1996. - -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2, or (at your option) -# any later version. - -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. - -# You should have received a copy of the GNU General Public License -# along with this program. If not, see . - -# As a special exception to the GNU General Public License, if you -# distribute this file as part of a program that contains a -# configuration script generated by Autoconf, you may include it under -# the same distribution terms that you use for the rest of that program. - -if test $# -eq 0; then - echo 1>&2 "Try \`$0 --help' for more information" - exit 1 -fi - -run=: -sed_output='s/.* --output[ =]\([^ ]*\).*/\1/p' -sed_minuso='s/.* -o \([^ ]*\).*/\1/p' - -# In the cases where this matters, `missing' is being run in the -# srcdir already. -if test -f configure.ac; then - configure_ac=configure.ac -else - configure_ac=configure.in -fi - -msg="missing on your system" - -case $1 in ---run) - # Try to run requested program, and just exit if it succeeds. - run= - shift - "$@" && exit 0 - # Exit code 63 means version mismatch. This often happens - # when the user try to use an ancient version of a tool on - # a file that requires a minimum version. In this case we - # we should proceed has if the program had been absent, or - # if --run hadn't been passed. - if test $? = 63; then - run=: - msg="probably too old" - fi - ;; - - -h|--h|--he|--hel|--help) - echo "\ -$0 [OPTION]... PROGRAM [ARGUMENT]... - -Handle \`PROGRAM [ARGUMENT]...' for when PROGRAM is missing, or return an -error status if there is no known handling for PROGRAM. - -Options: - -h, --help display this help and exit - -v, --version output version information and exit - --run try to run the given command, and emulate it if it fails - -Supported PROGRAM values: - aclocal touch file \`aclocal.m4' - autoconf touch file \`configure' - autoheader touch file \`config.h.in' - autom4te touch the output file, or create a stub one - automake touch all \`Makefile.in' files - bison create \`y.tab.[ch]', if possible, from existing .[ch] - flex create \`lex.yy.c', if possible, from existing .c - help2man touch the output file - lex create \`lex.yy.c', if possible, from existing .c - makeinfo touch the output file - yacc create \`y.tab.[ch]', if possible, from existing .[ch] - -Version suffixes to PROGRAM as well as the prefixes \`gnu-', \`gnu', and -\`g' are ignored when checking the name. - -Send bug reports to ." - exit $? - ;; - - -v|--v|--ve|--ver|--vers|--versi|--versio|--version) - echo "missing $scriptversion (GNU Automake)" - exit $? - ;; - - -*) - echo 1>&2 "$0: Unknown \`$1' option" - echo 1>&2 "Try \`$0 --help' for more information" - exit 1 - ;; - -esac - -# normalize program name to check for. -program=`echo "$1" | sed ' - s/^gnu-//; t - s/^gnu//; t - s/^g//; t'` - -# Now exit if we have it, but it failed. Also exit now if we -# don't have it and --version was passed (most likely to detect -# the program). This is about non-GNU programs, so use $1 not -# $program. -case $1 in - lex*|yacc*) - # Not GNU programs, they don't have --version. - ;; - - *) - if test -z "$run" && ($1 --version) > /dev/null 2>&1; then - # We have it, but it failed. - exit 1 - elif test "x$2" = "x--version" || test "x$2" = "x--help"; then - # Could not run --version or --help. This is probably someone - # running `$TOOL --version' or `$TOOL --help' to check whether - # $TOOL exists and not knowing $TOOL uses missing. - exit 1 - fi - ;; -esac - -# If it does not exist, or fails to run (possibly an outdated version), -# try to emulate it. -case $program in - aclocal*) - echo 1>&2 "\ -WARNING: \`$1' is $msg. You should only need it if - you modified \`acinclude.m4' or \`${configure_ac}'. You might want - to install the \`Automake' and \`Perl' packages. Grab them from - any GNU archive site." - touch aclocal.m4 - ;; - - autoconf*) - echo 1>&2 "\ -WARNING: \`$1' is $msg. You should only need it if - you modified \`${configure_ac}'. You might want to install the - \`Autoconf' and \`GNU m4' packages. Grab them from any GNU - archive site." - touch configure - ;; - - autoheader*) - echo 1>&2 "\ -WARNING: \`$1' is $msg. You should only need it if - you modified \`acconfig.h' or \`${configure_ac}'. You might want - to install the \`Autoconf' and \`GNU m4' packages. Grab them - from any GNU archive site." - files=`sed -n 's/^[ ]*A[CM]_CONFIG_HEADER(\([^)]*\)).*/\1/p' ${configure_ac}` - test -z "$files" && files="config.h" - touch_files= - for f in $files; do - case $f in - *:*) touch_files="$touch_files "`echo "$f" | - sed -e 's/^[^:]*://' -e 's/:.*//'`;; - *) touch_files="$touch_files $f.in";; - esac - done - touch $touch_files - ;; - - automake*) - echo 1>&2 "\ -WARNING: \`$1' is $msg. You should only need it if - you modified \`Makefile.am', \`acinclude.m4' or \`${configure_ac}'. - You might want to install the \`Automake' and \`Perl' packages. - Grab them from any GNU archive site." - find . -type f -name Makefile.am -print | - sed 's/\.am$/.in/' | - while read f; do touch "$f"; done - ;; - - autom4te*) - echo 1>&2 "\ -WARNING: \`$1' is needed, but is $msg. - You might have modified some files without having the - proper tools for further handling them. - You can get \`$1' as part of \`Autoconf' from any GNU - archive site." - - file=`echo "$*" | sed -n "$sed_output"` - test -z "$file" && file=`echo "$*" | sed -n "$sed_minuso"` - if test -f "$file"; then - touch $file - else - test -z "$file" || exec >$file - echo "#! /bin/sh" - echo "# Created by GNU Automake missing as a replacement of" - echo "# $ $@" - echo "exit 0" - chmod +x $file - exit 1 - fi - ;; - - bison*|yacc*) - echo 1>&2 "\ -WARNING: \`$1' $msg. You should only need it if - you modified a \`.y' file. You may need the \`Bison' package - in order for those modifications to take effect. You can get - \`Bison' from any GNU archive site." - rm -f y.tab.c y.tab.h - if test $# -ne 1; then - eval LASTARG=\${$#} - case $LASTARG in - *.y) - SRCFILE=`echo "$LASTARG" | sed 's/y$/c/'` - if test -f "$SRCFILE"; then - cp "$SRCFILE" y.tab.c - fi - SRCFILE=`echo "$LASTARG" | sed 's/y$/h/'` - if test -f "$SRCFILE"; then - cp "$SRCFILE" y.tab.h - fi - ;; - esac - fi - if test ! -f y.tab.h; then - echo >y.tab.h - fi - if test ! -f y.tab.c; then - echo 'main() { return 0; }' >y.tab.c - fi - ;; - - lex*|flex*) - echo 1>&2 "\ -WARNING: \`$1' is $msg. You should only need it if - you modified a \`.l' file. You may need the \`Flex' package - in order for those modifications to take effect. You can get - \`Flex' from any GNU archive site." - rm -f lex.yy.c - if test $# -ne 1; then - eval LASTARG=\${$#} - case $LASTARG in - *.l) - SRCFILE=`echo "$LASTARG" | sed 's/l$/c/'` - if test -f "$SRCFILE"; then - cp "$SRCFILE" lex.yy.c - fi - ;; - esac - fi - if test ! -f lex.yy.c; then - echo 'main() { return 0; }' >lex.yy.c - fi - ;; - - help2man*) - echo 1>&2 "\ -WARNING: \`$1' is $msg. You should only need it if - you modified a dependency of a manual page. You may need the - \`Help2man' package in order for those modifications to take - effect. You can get \`Help2man' from any GNU archive site." - - file=`echo "$*" | sed -n "$sed_output"` - test -z "$file" && file=`echo "$*" | sed -n "$sed_minuso"` - if test -f "$file"; then - touch $file - else - test -z "$file" || exec >$file - echo ".ab help2man is required to generate this page" - exit $? - fi - ;; - - makeinfo*) - echo 1>&2 "\ -WARNING: \`$1' is $msg. You should only need it if - you modified a \`.texi' or \`.texinfo' file, or any other file - indirectly affecting the aspect of the manual. The spurious - call might also be the consequence of using a buggy \`make' (AIX, - DU, IRIX). You might want to install the \`Texinfo' package or - the \`GNU make' package. Grab either from any GNU archive site." - # The file to touch is that specified with -o ... - file=`echo "$*" | sed -n "$sed_output"` - test -z "$file" && file=`echo "$*" | sed -n "$sed_minuso"` - if test -z "$file"; then - # ... or it is the one specified with @setfilename ... - infile=`echo "$*" | sed 's/.* \([^ ]*\) *$/\1/'` - file=`sed -n ' - /^@setfilename/{ - s/.* \([^ ]*\) *$/\1/ - p - q - }' $infile` - # ... or it is derived from the source name (dir/f.texi becomes f.info) - test -z "$file" && file=`echo "$infile" | sed 's,.*/,,;s,.[^.]*$,,'`.info - fi - # If the file does not exist, the user really needs makeinfo; - # let's fail without touching anything. - test -f $file || exit 1 - touch $file - ;; - - *) - echo 1>&2 "\ -WARNING: \`$1' is needed, and is $msg. - You might have modified some files without having the - proper tools for further handling them. Check the \`README' file, - it often tells you about the needed prerequisites for installing - this package. You may also peek at any GNU archive site, in case - some other package would contain this missing \`$1' program." - exit 1 - ;; -esac - -exit 0 - -# Local variables: -# eval: (add-hook 'write-file-hooks 'time-stamp) -# time-stamp-start: "scriptversion=" -# time-stamp-format: "%:y-%02m-%02d.%02H" -# time-stamp-time-zone: "UTC" -# time-stamp-end: "; # UTC" -# End: diff --git a/pkg/registry/zookeeper-3.4.6/src/c/src/cli.c b/pkg/registry/zookeeper-3.4.6/src/c/src/cli.c deleted file mode 100644 index 7b3cd61b5..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/c/src/cli.c +++ /dev/null @@ -1,681 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you 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. - */ - -#include -#include -#include -#include -#include - -#ifndef WIN32 -#include -#include -#include -#else -#include "winport.h" -//#include <-- can't include, conflicting definitions of close() -int read(int _FileHandle, void * _DstBuf, unsigned int _MaxCharCount); -int write(int _Filehandle, const void * _Buf, unsigned int _MaxCharCount); -#define ctime_r(tctime, buffer) ctime_s (buffer, 40, tctime) -#endif - -#include -#include -#include - -#ifdef YCA -#include -#endif - -#define _LL_CAST_ (long long) - -static zhandle_t *zh; -static clientid_t myid; -static const char *clientIdFile = 0; -struct timeval startTime; -static char cmd[1024]; -static int batchMode=0; - -static int to_send=0; -static int sent=0; -static int recvd=0; - -static int shutdownThisThing=0; - -static __attribute__ ((unused)) void -printProfileInfo(struct timeval start, struct timeval end, int thres, - const char* msg) -{ - int delay=(end.tv_sec*1000+end.tv_usec/1000)- - (start.tv_sec*1000+start.tv_usec/1000); - if(delay>thres) - fprintf(stderr,"%s: execution time=%dms\n",msg,delay); -} - -static const char* state2String(int state){ - if (state == 0) - return "CLOSED_STATE"; - if (state == ZOO_CONNECTING_STATE) - return "CONNECTING_STATE"; - if (state == ZOO_ASSOCIATING_STATE) - return "ASSOCIATING_STATE"; - if (state == ZOO_CONNECTED_STATE) - return "CONNECTED_STATE"; - if (state == ZOO_EXPIRED_SESSION_STATE) - return "EXPIRED_SESSION_STATE"; - if (state == ZOO_AUTH_FAILED_STATE) - return "AUTH_FAILED_STATE"; - - return "INVALID_STATE"; -} - -static const char* type2String(int state){ - if (state == ZOO_CREATED_EVENT) - return "CREATED_EVENT"; - if (state == ZOO_DELETED_EVENT) - return "DELETED_EVENT"; - if (state == ZOO_CHANGED_EVENT) - return "CHANGED_EVENT"; - if (state == ZOO_CHILD_EVENT) - return "CHILD_EVENT"; - if (state == ZOO_SESSION_EVENT) - return "SESSION_EVENT"; - if (state == ZOO_NOTWATCHING_EVENT) - return "NOTWATCHING_EVENT"; - - return "UNKNOWN_EVENT_TYPE"; -} - -void watcher(zhandle_t *zzh, int type, int state, const char *path, - void* context) -{ - /* Be careful using zh here rather than zzh - as this may be mt code - * the client lib may call the watcher before zookeeper_init returns */ - - fprintf(stderr, "Watcher %s state = %s", type2String(type), state2String(state)); - if (path && strlen(path) > 0) { - fprintf(stderr, " for path %s", path); - } - fprintf(stderr, "\n"); - - if (type == ZOO_SESSION_EVENT) { - if (state == ZOO_CONNECTED_STATE) { - const clientid_t *id = zoo_client_id(zzh); - if (myid.client_id == 0 || myid.client_id != id->client_id) { - myid = *id; - fprintf(stderr, "Got a new session id: 0x%llx\n", - _LL_CAST_ myid.client_id); - if (clientIdFile) { - FILE *fh = fopen(clientIdFile, "w"); - if (!fh) { - perror(clientIdFile); - } else { - int rc = fwrite(&myid, sizeof(myid), 1, fh); - if (rc != sizeof(myid)) { - perror("writing client id"); - } - fclose(fh); - } - } - } - } else if (state == ZOO_AUTH_FAILED_STATE) { - fprintf(stderr, "Authentication failure. Shutting down...\n"); - zookeeper_close(zzh); - shutdownThisThing=1; - zh=0; - } else if (state == ZOO_EXPIRED_SESSION_STATE) { - fprintf(stderr, "Session expired. Shutting down...\n"); - zookeeper_close(zzh); - shutdownThisThing=1; - zh=0; - } - } -} - -void dumpStat(const struct Stat *stat) { - char tctimes[40]; - char tmtimes[40]; - time_t tctime; - time_t tmtime; - - if (!stat) { - fprintf(stderr,"null\n"); - return; - } - tctime = stat->ctime/1000; - tmtime = stat->mtime/1000; - - ctime_r(&tmtime, tmtimes); - ctime_r(&tctime, tctimes); - - fprintf(stderr, "\tctime = %s\tczxid=%llx\n" - "\tmtime=%s\tmzxid=%llx\n" - "\tversion=%x\taversion=%x\n" - "\tephemeralOwner = %llx\n", - tctimes, _LL_CAST_ stat->czxid, tmtimes, - _LL_CAST_ stat->mzxid, - (unsigned int)stat->version, (unsigned int)stat->aversion, - _LL_CAST_ stat->ephemeralOwner); -} - -void my_string_completion(int rc, const char *name, const void *data) { - fprintf(stderr, "[%s]: rc = %d\n", (char*)(data==0?"null":data), rc); - if (!rc) { - fprintf(stderr, "\tname = %s\n", name); - } - if(batchMode) - shutdownThisThing=1; -} - -void my_string_completion_free_data(int rc, const char *name, const void *data) { - my_string_completion(rc, name, data); - free((void*)data); -} - -void my_data_completion(int rc, const char *value, int value_len, - const struct Stat *stat, const void *data) { - struct timeval tv; - int sec; - int usec; - gettimeofday(&tv, 0); - sec = tv.tv_sec - startTime.tv_sec; - usec = tv.tv_usec - startTime.tv_usec; - fprintf(stderr, "time = %d msec\n", sec*1000 + usec/1000); - fprintf(stderr, "%s: rc = %d\n", (char*)data, rc); - if (value) { - fprintf(stderr, " value_len = %d\n", value_len); - assert(write(2, value, value_len) == value_len); - } - fprintf(stderr, "\nStat:\n"); - dumpStat(stat); - free((void*)data); - if(batchMode) - shutdownThisThing=1; -} - -void my_silent_data_completion(int rc, const char *value, int value_len, - const struct Stat *stat, const void *data) { - recvd++; - fprintf(stderr, "Data completion %s rc = %d\n",(char*)data,rc); - free((void*)data); - if (recvd==to_send) { - fprintf(stderr,"Recvd %d responses for %d requests sent\n",recvd,to_send); - if(batchMode) - shutdownThisThing=1; - } -} - -void my_strings_completion(int rc, const struct String_vector *strings, - const void *data) { - struct timeval tv; - int sec; - int usec; - int i; - - gettimeofday(&tv, 0); - sec = tv.tv_sec - startTime.tv_sec; - usec = tv.tv_usec - startTime.tv_usec; - fprintf(stderr, "time = %d msec\n", sec*1000 + usec/1000); - fprintf(stderr, "%s: rc = %d\n", (char*)data, rc); - if (strings) - for (i=0; i < strings->count; i++) { - fprintf(stderr, "\t%s\n", strings->data[i]); - } - free((void*)data); - gettimeofday(&tv, 0); - sec = tv.tv_sec - startTime.tv_sec; - usec = tv.tv_usec - startTime.tv_usec; - fprintf(stderr, "time = %d msec\n", sec*1000 + usec/1000); - if(batchMode) - shutdownThisThing=1; -} - -void my_strings_stat_completion(int rc, const struct String_vector *strings, - const struct Stat *stat, const void *data) { - my_strings_completion(rc, strings, data); - dumpStat(stat); - if(batchMode) - shutdownThisThing=1; -} - -void my_void_completion(int rc, const void *data) { - fprintf(stderr, "%s: rc = %d\n", (char*)data, rc); - free((void*)data); - if(batchMode) - shutdownThisThing=1; -} - -void my_stat_completion(int rc, const struct Stat *stat, const void *data) { - fprintf(stderr, "%s: rc = %d Stat:\n", (char*)data, rc); - dumpStat(stat); - free((void*)data); - if(batchMode) - shutdownThisThing=1; -} - -void my_silent_stat_completion(int rc, const struct Stat *stat, - const void *data) { - // fprintf(stderr, "State completion: [%s] rc = %d\n", (char*)data, rc); - sent++; - free((void*)data); -} - -static void sendRequest(const char* data) { - zoo_aset(zh, "/od", data, strlen(data), -1, my_silent_stat_completion, - strdup("/od")); - zoo_aget(zh, "/od", 1, my_silent_data_completion, strdup("/od")); -} - -void od_completion(int rc, const struct Stat *stat, const void *data) { - int i; - fprintf(stderr, "od command response: rc = %d Stat:\n", rc); - dumpStat(stat); - // send a whole bunch of requests - recvd=0; - sent=0; - to_send=200; - for (i=0; i\n"); - fprintf(stderr, " delete \n"); - fprintf(stderr, " set \n"); - fprintf(stderr, " get \n"); - fprintf(stderr, " ls \n"); - fprintf(stderr, " ls2 \n"); - fprintf(stderr, " sync \n"); - fprintf(stderr, " exists \n"); - fprintf(stderr, " wexists \n"); - fprintf(stderr, " myid\n"); - fprintf(stderr, " verbose\n"); - fprintf(stderr, " addauth \n"); - fprintf(stderr, " quit\n"); - fprintf(stderr, "\n"); - fprintf(stderr, " prefix the command with the character 'a' to run the command asynchronously.\n"); - fprintf(stderr, " run the 'verbose' command to toggle verbose logging.\n"); - fprintf(stderr, " i.e. 'aget /foo' to get /foo asynchronously\n"); - } else if (startsWith(line, "verbose")) { - if (verbose) { - verbose = 0; - zoo_set_debug_level(ZOO_LOG_LEVEL_WARN); - fprintf(stderr, "logging level set to WARN\n"); - } else { - verbose = 1; - zoo_set_debug_level(ZOO_LOG_LEVEL_DEBUG); - fprintf(stderr, "logging level set to DEBUG\n"); - } - } else if (startsWith(line, "get ")) { - line += 4; - if (line[0] != '/') { - fprintf(stderr, "Path must start with /, found: %s\n", line); - return; - } - - rc = zoo_aget(zh, line, 1, my_data_completion, strdup(line)); - if (rc) { - fprintf(stderr, "Error %d for %s\n", rc, line); - } - } else if (startsWith(line, "set ")) { - char *ptr; - line += 4; - if (line[0] != '/') { - fprintf(stderr, "Path must start with /, found: %s\n", line); - return; - } - ptr = strchr(line, ' '); - if (!ptr) { - fprintf(stderr, "No data found after path\n"); - return; - } - *ptr = '\0'; - ptr++; - if (async) { - rc = zoo_aset(zh, line, ptr, strlen(ptr), -1, my_stat_completion, - strdup(line)); - } else { - struct Stat stat; - rc = zoo_set2(zh, line, ptr, strlen(ptr), -1, &stat); - } - if (rc) { - fprintf(stderr, "Error %d for %s\n", rc, line); - } - } else if (startsWith(line, "ls ")) { - line += 3; - if (line[0] != '/') { - fprintf(stderr, "Path must start with /, found: %s\n", line); - return; - } - gettimeofday(&startTime, 0); - rc= zoo_aget_children(zh, line, 1, my_strings_completion, strdup(line)); - if (rc) { - fprintf(stderr, "Error %d for %s\n", rc, line); - } - } else if (startsWith(line, "ls2 ")) { - line += 4; - if (line[0] != '/') { - fprintf(stderr, "Path must start with /, found: %s\n", line); - return; - } - gettimeofday(&startTime, 0); - rc= zoo_aget_children2(zh, line, 1, my_strings_stat_completion, strdup(line)); - if (rc) { - fprintf(stderr, "Error %d for %s\n", rc, line); - } - } else if (startsWith(line, "create ")) { - int flags = 0; - line += 7; - if (line[0] == '+') { - line++; - if (line[0] == 'e') { - flags |= ZOO_EPHEMERAL; - line++; - } - if (line[0] == 's') { - flags |= ZOO_SEQUENCE; - line++; - } - line++; - } - if (line[0] != '/') { - fprintf(stderr, "Path must start with /, found: %s\n", line); - return; - } - fprintf(stderr, "Creating [%s] node\n", line); -// { -// struct ACL _CREATE_ONLY_ACL_ACL[] = {{ZOO_PERM_CREATE, ZOO_ANYONE_ID_UNSAFE}}; -// struct ACL_vector CREATE_ONLY_ACL = {1,_CREATE_ONLY_ACL_ACL}; -// rc = zoo_acreate(zh, line, "new", 3, &CREATE_ONLY_ACL, flags, -// my_string_completion, strdup(line)); -// } - rc = zoo_acreate(zh, line, "new", 3, &ZOO_OPEN_ACL_UNSAFE, flags, - my_string_completion_free_data, strdup(line)); - if (rc) { - fprintf(stderr, "Error %d for %s\n", rc, line); - } - } else if (startsWith(line, "delete ")) { - line += 7; - if (line[0] != '/') { - fprintf(stderr, "Path must start with /, found: %s\n", line); - return; - } - if (async) { - rc = zoo_adelete(zh, line, -1, my_void_completion, strdup(line)); - } else { - rc = zoo_delete(zh, line, -1); - } - if (rc) { - fprintf(stderr, "Error %d for %s\n", rc, line); - } - } else if (startsWith(line, "sync ")) { - line += 5; - if (line[0] != '/') { - fprintf(stderr, "Path must start with /, found: %s\n", line); - return; - } - rc = zoo_async(zh, line, my_string_completion_free_data, strdup(line)); - if (rc) { - fprintf(stderr, "Error %d for %s\n", rc, line); - } - } else if (startsWith(line, "wexists ")) { -#ifdef THREADED - struct Stat stat; -#endif - line += 8; - if (line[0] != '/') { - fprintf(stderr, "Path must start with /, found: %s\n", line); - return; - } -#ifndef THREADED - rc = zoo_awexists(zh, line, watcher, (void*) 0, my_stat_completion, strdup(line)); -#else - rc = zoo_wexists(zh, line, watcher, (void*) 0, &stat); -#endif - if (rc) { - fprintf(stderr, "Error %d for %s\n", rc, line); - } - } else if (startsWith(line, "exists ")) { -#ifdef THREADED - struct Stat stat; -#endif - line += 7; - if (line[0] != '/') { - fprintf(stderr, "Path must start with /, found: %s\n", line); - return; - } -#ifndef THREADED - rc = zoo_aexists(zh, line, 1, my_stat_completion, strdup(line)); -#else - rc = zoo_exists(zh, line, 1, &stat); -#endif - if (rc) { - fprintf(stderr, "Error %d for %s\n", rc, line); - } - } else if (strcmp(line, "myid") == 0) { - printf("session Id = %llx\n", _LL_CAST_ zoo_client_id(zh)->client_id); - } else if (strcmp(line, "reinit") == 0) { - zookeeper_close(zh); - // we can't send myid to the server here -- zookeeper_close() removes - // the session on the server. We must start anew. - zh = zookeeper_init(hostPort, watcher, 30000, 0, 0, 0); - } else if (startsWith(line, "quit")) { - fprintf(stderr, "Quitting...\n"); - shutdownThisThing=1; - } else if (startsWith(line, "od")) { - const char val[]="fire off"; - fprintf(stderr, "Overdosing...\n"); - rc = zoo_aset(zh, "/od", val, sizeof(val)-1, -1, od_completion, 0); - if (rc) - fprintf(stderr, "od command failed: %d\n", rc); - } else if (startsWith(line, "addauth ")) { - char *ptr; - line += 8; - ptr = strchr(line, ' '); - if (ptr) { - *ptr = '\0'; - ptr++; - } - zoo_add_auth(zh, line, ptr, ptr ? strlen(ptr) : 0, NULL, NULL); - } -} - -int main(int argc, char **argv) { -#ifndef THREADED - fd_set rfds, wfds, efds; - int processed=0; -#endif - char buffer[4096]; - char p[2048]; -#ifdef YCA - char *cert=0; - char appId[64]; -#endif - int bufoff = 0; - FILE *fh; - - if (argc < 2) { - fprintf(stderr, - "USAGE %s zookeeper_host_list [clientid_file|cmd:(ls|ls2|create|od|...)]\n", - argv[0]); - fprintf(stderr, - "Version: ZooKeeper cli (c client) version %d.%d.%d\n", - ZOO_MAJOR_VERSION, - ZOO_MINOR_VERSION, - ZOO_PATCH_VERSION); - return 2; - } - if (argc > 2) { - if(strncmp("cmd:",argv[2],4)==0){ - strcpy(cmd,argv[2]+4); - batchMode=1; - fprintf(stderr,"Batch mode: %s\n",cmd); - }else{ - clientIdFile = argv[2]; - fh = fopen(clientIdFile, "r"); - if (fh) { - if (fread(&myid, sizeof(myid), 1, fh) != sizeof(myid)) { - memset(&myid, 0, sizeof(myid)); - } - fclose(fh); - } - } - } -#ifdef YCA - strcpy(appId,"yahoo.example.yca_test"); - cert = yca_get_cert_once(appId); - if(cert!=0) { - fprintf(stderr,"Certificate for appid [%s] is [%s]\n",appId,cert); - strncpy(p,cert,sizeof(p)-1); - free(cert); - } else { - fprintf(stderr,"Certificate for appid [%s] not found\n",appId); - strcpy(p,"dummy"); - } -#else - strcpy(p, "dummy"); -#endif - verbose = 0; - zoo_set_debug_level(ZOO_LOG_LEVEL_WARN); - zoo_deterministic_conn_order(1); // enable deterministic order - hostPort = argv[1]; - zh = zookeeper_init(hostPort, watcher, 30000, &myid, 0, 0); - if (!zh) { - return errno; - } - -#ifdef YCA - if(zoo_add_auth(zh,"yca",p,strlen(p),0,0)!=ZOK) - return 2; -#endif - -#ifdef THREADED - while(!shutdownThisThing) { - int rc; - int len = sizeof(buffer) - bufoff -1; - if (len <= 0) { - fprintf(stderr, "Can't handle lines that long!\n"); - exit(2); - } - rc = read(0, buffer+bufoff, len); - if (rc <= 0) { - fprintf(stderr, "bye\n"); - shutdownThisThing=1; - break; - } - bufoff += rc; - buffer[bufoff] = '\0'; - while (strchr(buffer, '\n')) { - char *ptr = strchr(buffer, '\n'); - *ptr = '\0'; - processline(buffer); - ptr++; - memmove(buffer, ptr, strlen(ptr)+1); - bufoff = 0; - } - } -#else - FD_ZERO(&rfds); - FD_ZERO(&wfds); - FD_ZERO(&efds); - while (!shutdownThisThing) { - int fd; - int interest; - int events; - struct timeval tv; - int rc; - zookeeper_interest(zh, &fd, &interest, &tv); - if (fd != -1) { - if (interest&ZOOKEEPER_READ) { - FD_SET(fd, &rfds); - } else { - FD_CLR(fd, &rfds); - } - if (interest&ZOOKEEPER_WRITE) { - FD_SET(fd, &wfds); - } else { - FD_CLR(fd, &wfds); - } - } else { - fd = 0; - } - FD_SET(0, &rfds); - rc = select(fd+1, &rfds, &wfds, &efds, &tv); - events = 0; - if (rc > 0) { - if (FD_ISSET(fd, &rfds)) { - events |= ZOOKEEPER_READ; - } - if (FD_ISSET(fd, &wfds)) { - events |= ZOOKEEPER_WRITE; - } - } - if(batchMode && processed==0){ - //batch mode - processline(cmd); - processed=1; - } - if (FD_ISSET(0, &rfds)) { - int rc; - int len = sizeof(buffer) - bufoff -1; - if (len <= 0) { - fprintf(stderr, "Can't handle lines that long!\n"); - exit(2); - } - rc = read(0, buffer+bufoff, len); - if (rc <= 0) { - fprintf(stderr, "bye\n"); - break; - } - bufoff += rc; - buffer[bufoff] = '\0'; - while (strchr(buffer, '\n')) { - char *ptr = strchr(buffer, '\n'); - *ptr = '\0'; - processline(buffer); - ptr++; - memmove(buffer, ptr, strlen(ptr)+1); - bufoff = 0; - } - } - zookeeper_process(zh, events); - } -#endif - if (to_send!=0) - fprintf(stderr,"Recvd %d responses for %d requests sent\n",recvd,sent); - zookeeper_close(zh); - return 0; -} diff --git a/pkg/registry/zookeeper-3.4.6/src/c/src/hashtable/LICENSE.txt b/pkg/registry/zookeeper-3.4.6/src/c/src/hashtable/LICENSE.txt deleted file mode 100644 index 674a62456..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/c/src/hashtable/LICENSE.txt +++ /dev/null @@ -1,30 +0,0 @@ -Copyright (c) 2002, 2004, Christopher Clark -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions -are met: - - * Redistributions of source code must retain the above copyright -notice, this list of conditions and the following disclaimer. - - * 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. - - * Neither the name of the original author; nor the names of any contributors -may be used to endorse or promote products derived from this software -without specific prior written permission. - - -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. diff --git a/pkg/registry/zookeeper-3.4.6/src/c/src/hashtable/hashtable.c b/pkg/registry/zookeeper-3.4.6/src/c/src/hashtable/hashtable.c deleted file mode 100644 index 763357edc..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/c/src/hashtable/hashtable.c +++ /dev/null @@ -1,274 +0,0 @@ -/* Copyright (C) 2004 Christopher Clark */ - -#include "hashtable.h" -#include "hashtable_private.h" -#include -#include -#include -#include - -/* -Credit for primes table: Aaron Krowne - http://br.endernet.org/~akrowne/ - http://planetmath.org/encyclopedia/GoodHashTablePrimes.html -*/ -static const unsigned int primes[] = { -53, 97, 193, 389, -769, 1543, 3079, 6151, -12289, 24593, 49157, 98317, -196613, 393241, 786433, 1572869, -3145739, 6291469, 12582917, 25165843, -50331653, 100663319, 201326611, 402653189, -805306457, 1610612741 -}; -const unsigned int prime_table_length = sizeof(primes)/sizeof(primes[0]); -const float max_load_factor = 0.65; - -/*****************************************************************************/ -struct hashtable * -create_hashtable(unsigned int minsize, - unsigned int (*hashf) (void*), - int (*eqf) (void*,void*)) -{ - struct hashtable *h; - unsigned int pindex, size = primes[0]; - /* Check requested hashtable isn't too large */ - if (minsize > (1u << 30)) return NULL; - /* Enforce size as prime */ - for (pindex=0; pindex < prime_table_length; pindex++) { - if (primes[pindex] > minsize) { size = primes[pindex]; break; } - } - h = (struct hashtable *)malloc(sizeof(struct hashtable)); - if (NULL == h) return NULL; /*oom*/ - h->table = (struct entry **)malloc(sizeof(struct entry*) * size); - if (NULL == h->table) { free(h); return NULL; } /*oom*/ - memset(h->table, 0, size * sizeof(struct entry *)); - h->tablelength = size; - h->primeindex = pindex; - h->entrycount = 0; - h->hashfn = hashf; - h->eqfn = eqf; - h->loadlimit = (unsigned int) ceil(size * max_load_factor); - return h; -} - -/*****************************************************************************/ -unsigned int -hash(struct hashtable *h, void *k) -{ - /* Aim to protect against poor hash functions by adding logic here - * - logic taken from java 1.4 hashtable source */ - unsigned int i = h->hashfn(k); - i += ~(i << 9); - i ^= ((i >> 14) | (i << 18)); /* >>> */ - i += (i << 4); - i ^= ((i >> 10) | (i << 22)); /* >>> */ - return i; -} - -/*****************************************************************************/ -static int -hashtable_expand(struct hashtable *h) -{ - /* Double the size of the table to accomodate more entries */ - struct entry **newtable; - struct entry *e; - struct entry **pE; - unsigned int newsize, i, index; - /* Check we're not hitting max capacity */ - if (h->primeindex == (prime_table_length - 1)) return 0; - newsize = primes[++(h->primeindex)]; - - newtable = (struct entry **)malloc(sizeof(struct entry*) * newsize); - if (NULL != newtable) - { - memset(newtable, 0, newsize * sizeof(struct entry *)); - /* This algorithm is not 'stable'. ie. it reverses the list - * when it transfers entries between the tables */ - for (i = 0; i < h->tablelength; i++) { - while (NULL != (e = h->table[i])) { - h->table[i] = e->next; - index = indexFor(newsize,e->h); - e->next = newtable[index]; - newtable[index] = e; - } - } - free(h->table); - h->table = newtable; - } - /* Plan B: realloc instead */ - else - { - newtable = (struct entry **) - realloc(h->table, newsize * sizeof(struct entry *)); - if (NULL == newtable) { (h->primeindex)--; return 0; } - h->table = newtable; - memset(newtable[h->tablelength], 0, newsize - h->tablelength); - for (i = 0; i < h->tablelength; i++) { - for (pE = &(newtable[i]), e = *pE; e != NULL; e = *pE) { - index = indexFor(newsize,e->h); - if (index == i) - { - pE = &(e->next); - } - else - { - *pE = e->next; - e->next = newtable[index]; - newtable[index] = e; - } - } - } - } - h->tablelength = newsize; - h->loadlimit = (unsigned int) ceil(newsize * max_load_factor); - return -1; -} - -/*****************************************************************************/ -unsigned int -hashtable_count(struct hashtable *h) -{ - return h->entrycount; -} - -/*****************************************************************************/ -int -hashtable_insert(struct hashtable *h, void *k, void *v) -{ - /* This method allows duplicate keys - but they shouldn't be used */ - unsigned int index; - struct entry *e; - if (++(h->entrycount) > h->loadlimit) - { - /* Ignore the return value. If expand fails, we should - * still try cramming just this value into the existing table - * -- we may not have memory for a larger table, but one more - * element may be ok. Next time we insert, we'll try expanding again.*/ - hashtable_expand(h); - } - e = (struct entry *)malloc(sizeof(struct entry)); - if (NULL == e) { --(h->entrycount); return 0; } /*oom*/ - e->h = hash(h,k); - index = indexFor(h->tablelength,e->h); - e->k = k; - e->v = v; - e->next = h->table[index]; - h->table[index] = e; - return -1; -} - -/*****************************************************************************/ -void * /* returns value associated with key */ -hashtable_search(struct hashtable *h, void *k) -{ - struct entry *e; - unsigned int hashvalue, index; - hashvalue = hash(h,k); - index = indexFor(h->tablelength,hashvalue); - e = h->table[index]; - while (NULL != e) - { - /* Check hash value to short circuit heavier comparison */ - if ((hashvalue == e->h) && (h->eqfn(k, e->k))) return e->v; - e = e->next; - } - return NULL; -} - -/*****************************************************************************/ -void * /* returns value associated with key */ -hashtable_remove(struct hashtable *h, void *k) -{ - /* TODO: consider compacting the table when the load factor drops enough, - * or provide a 'compact' method. */ - - struct entry *e; - struct entry **pE; - void *v; - unsigned int hashvalue, index; - - hashvalue = hash(h,k); - index = indexFor(h->tablelength,hash(h,k)); - pE = &(h->table[index]); - e = *pE; - while (NULL != e) - { - /* Check hash value to short circuit heavier comparison */ - if ((hashvalue == e->h) && (h->eqfn(k, e->k))) - { - *pE = e->next; - h->entrycount--; - v = e->v; - freekey(e->k); - free(e); - return v; - } - pE = &(e->next); - e = e->next; - } - return NULL; -} - -/*****************************************************************************/ -/* destroy */ -void -hashtable_destroy(struct hashtable *h, int free_values) -{ - unsigned int i; - struct entry *e, *f; - struct entry **table = h->table; - if (free_values) - { - for (i = 0; i < h->tablelength; i++) - { - e = table[i]; - while (NULL != e) - { f = e; e = e->next; freekey(f->k); free(f->v); free(f); } - } - } - else - { - for (i = 0; i < h->tablelength; i++) - { - e = table[i]; - while (NULL != e) - { f = e; e = e->next; freekey(f->k); free(f); } - } - } - free(h->table); - free(h); -} - -/* - * Copyright (c) 2002, Christopher Clark - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * 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. - * - * * Neither the name of the original author; nor the names of any contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * - * 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. -*/ diff --git a/pkg/registry/zookeeper-3.4.6/src/c/src/hashtable/hashtable.h b/pkg/registry/zookeeper-3.4.6/src/c/src/hashtable/hashtable.h deleted file mode 100644 index cbead1829..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/c/src/hashtable/hashtable.h +++ /dev/null @@ -1,209 +0,0 @@ -/* Copyright (C) 2002 Christopher Clark */ - -#ifndef __HASHTABLE_CWC22_H__ -#define __HASHTABLE_CWC22_H__ -#ifdef WIN32 -#include "winconfig.h" -#endif -#ifdef __cplusplus -extern "C" { -#endif - -struct hashtable; - -/* Example of use: - * - * struct hashtable *h; - * struct some_key *k; - * struct some_value *v; - * - * static unsigned int hash_from_key_fn( void *k ); - * static int keys_equal_fn ( void *key1, void *key2 ); - * - * h = create_hashtable(16, hash_from_key_fn, keys_equal_fn); - * k = (struct some_key *) malloc(sizeof(struct some_key)); - * v = (struct some_value *) malloc(sizeof(struct some_value)); - * - * (initialise k and v to suitable values) - * - * if (! hashtable_insert(h,k,v) ) - * { exit(-1); } - * - * if (NULL == (found = hashtable_search(h,k) )) - * { printf("not found!"); } - * - * if (NULL == (found = hashtable_remove(h,k) )) - * { printf("Not found\n"); } - * - */ - -/* Macros may be used to define type-safe(r) hashtable access functions, with - * methods specialized to take known key and value types as parameters. - * - * Example: - * - * Insert this at the start of your file: - * - * DEFINE_HASHTABLE_INSERT(insert_some, struct some_key, struct some_value); - * DEFINE_HASHTABLE_SEARCH(search_some, struct some_key, struct some_value); - * DEFINE_HASHTABLE_REMOVE(remove_some, struct some_key, struct some_value); - * - * This defines the functions 'insert_some', 'search_some' and 'remove_some'. - * These operate just like hashtable_insert etc., with the same parameters, - * but their function signatures have 'struct some_key *' rather than - * 'void *', and hence can generate compile time errors if your program is - * supplying incorrect data as a key (and similarly for value). - * - * Note that the hash and key equality functions passed to create_hashtable - * still take 'void *' parameters instead of 'some key *'. This shouldn't be - * a difficult issue as they're only defined and passed once, and the other - * functions will ensure that only valid keys are supplied to them. - * - * The cost for this checking is increased code size and runtime overhead - * - if performance is important, it may be worth switching back to the - * unsafe methods once your program has been debugged with the safe methods. - * This just requires switching to some simple alternative defines - eg: - * #define insert_some hashtable_insert - * - */ - -/***************************************************************************** - * create_hashtable - - * @name create_hashtable - * @param minsize minimum initial size of hashtable - * @param hashfunction function for hashing keys - * @param key_eq_fn function for determining key equality - * @return newly created hashtable or NULL on failure - */ - -struct hashtable * -create_hashtable(unsigned int minsize, - unsigned int (*hashfunction) (void*), - int (*key_eq_fn) (void*,void*)); - -/***************************************************************************** - * hashtable_insert - - * @name hashtable_insert - * @param h the hashtable to insert into - * @param k the key - hashtable claims ownership and will free on removal - * @param v the value - does not claim ownership - * @return non-zero for successful insertion - * - * This function will cause the table to expand if the insertion would take - * the ratio of entries to table size over the maximum load factor. - * - * This function does not check for repeated insertions with a duplicate key. - * The value returned when using a duplicate key is undefined -- when - * the hashtable changes size, the order of retrieval of duplicate key - * entries is reversed. - * If in doubt, remove before insert. - */ - -int -hashtable_insert(struct hashtable *h, void *k, void *v); - -#define DEFINE_HASHTABLE_INSERT(fnname, keytype, valuetype) \ -int fnname (struct hashtable *h, keytype *k, valuetype *v) \ -{ \ - return hashtable_insert(h,k,v); \ -} - -/***************************************************************************** - * hashtable_search - - * @name hashtable_search - * @param h the hashtable to search - * @param k the key to search for - does not claim ownership - * @return the value associated with the key, or NULL if none found - */ - -void * -hashtable_search(struct hashtable *h, void *k); - -#define DEFINE_HASHTABLE_SEARCH(fnname, keytype, valuetype) \ -valuetype * fnname (struct hashtable *h, keytype *k) \ -{ \ - return (valuetype *) (hashtable_search(h,k)); \ -} - -/***************************************************************************** - * hashtable_remove - - * @name hashtable_remove - * @param h the hashtable to remove the item from - * @param k the key to search for - does not claim ownership - * @return the value associated with the key, or NULL if none found - */ - -void * /* returns value */ -hashtable_remove(struct hashtable *h, void *k); - -#define DEFINE_HASHTABLE_REMOVE(fnname, keytype, valuetype) \ -valuetype * fnname (struct hashtable *h, keytype *k) \ -{ \ - return (valuetype *) (hashtable_remove(h,k)); \ -} - - -/***************************************************************************** - * hashtable_count - - * @name hashtable_count - * @param h the hashtable - * @return the number of items stored in the hashtable - */ -unsigned int -hashtable_count(struct hashtable *h); - - -/***************************************************************************** - * hashtable_destroy - - * @name hashtable_destroy - * @param h the hashtable - * @param free_values whether to call 'free' on the remaining values - */ - -void -hashtable_destroy(struct hashtable *h, int free_values); - -#ifdef __cplusplus -} -#endif - -#endif /* __HASHTABLE_CWC22_H__ */ - -/* - * Copyright (c) 2002, Christopher Clark - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * 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. - * - * * Neither the name of the original author; nor the names of any contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * - * 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. -*/ diff --git a/pkg/registry/zookeeper-3.4.6/src/c/src/hashtable/hashtable_itr.c b/pkg/registry/zookeeper-3.4.6/src/c/src/hashtable/hashtable_itr.c deleted file mode 100644 index defac691f..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/c/src/hashtable/hashtable_itr.c +++ /dev/null @@ -1,176 +0,0 @@ -/* Copyright (C) 2002, 2004 Christopher Clark */ - -#include "hashtable.h" -#include "hashtable_private.h" -#include "hashtable_itr.h" -#include /* defines NULL */ - -/*****************************************************************************/ -/* hashtable_iterator - iterator constructor */ - -struct hashtable_itr * -hashtable_iterator(struct hashtable *h) -{ - unsigned int i, tablelength; - struct hashtable_itr *itr = (struct hashtable_itr *) - malloc(sizeof(struct hashtable_itr)); - if (NULL == itr) return NULL; - itr->h = h; - itr->e = NULL; - itr->parent = NULL; - tablelength = h->tablelength; - itr->index = tablelength; - if (0 == h->entrycount) return itr; - - for (i = 0; i < tablelength; i++) - { - if (NULL != h->table[i]) - { - itr->e = h->table[i]; - itr->index = i; - break; - } - } - return itr; -} - -/*****************************************************************************/ -/* advance - advance the iterator to the next element - * returns zero if advanced to end of table */ - -int -hashtable_iterator_advance(struct hashtable_itr *itr) -{ - unsigned int j,tablelength; - struct entry **table; - struct entry *next; - if (NULL == itr->e) return 0; /* stupidity check */ - - next = itr->e->next; - if (NULL != next) - { - itr->parent = itr->e; - itr->e = next; - return -1; - } - tablelength = itr->h->tablelength; - itr->parent = NULL; - if (tablelength <= (j = ++(itr->index))) - { - itr->e = NULL; - return 0; - } - table = itr->h->table; - while (NULL == (next = table[j])) - { - if (++j >= tablelength) - { - itr->index = tablelength; - itr->e = NULL; - return 0; - } - } - itr->index = j; - itr->e = next; - return -1; -} - -/*****************************************************************************/ -/* remove - remove the entry at the current iterator position - * and advance the iterator, if there is a successive - * element. - * If you want the value, read it before you remove: - * beware memory leaks if you don't. - * Returns zero if end of iteration. */ - -int -hashtable_iterator_remove(struct hashtable_itr *itr) -{ - struct entry *remember_e, *remember_parent; - int ret; - - /* Do the removal */ - if (NULL == (itr->parent)) - { - /* element is head of a chain */ - itr->h->table[itr->index] = itr->e->next; - } else { - /* element is mid-chain */ - itr->parent->next = itr->e->next; - } - /* itr->e is now outside the hashtable */ - remember_e = itr->e; - itr->h->entrycount--; - freekey(remember_e->k); - - /* Advance the iterator, correcting the parent */ - remember_parent = itr->parent; - ret = hashtable_iterator_advance(itr); - if (itr->parent == remember_e) { itr->parent = remember_parent; } - free(remember_e); - return ret; -} - -/*****************************************************************************/ -int /* returns zero if not found */ -hashtable_iterator_search(struct hashtable_itr *itr, - struct hashtable *h, void *k) -{ - struct entry *e, *parent; - unsigned int hashvalue, index; - - hashvalue = hash(h,k); - index = indexFor(h->tablelength,hashvalue); - - e = h->table[index]; - parent = NULL; - while (NULL != e) - { - /* Check hash value to short circuit heavier comparison */ - if ((hashvalue == e->h) && (h->eqfn(k, e->k))) - { - itr->index = index; - itr->e = e; - itr->parent = parent; - itr->h = h; - return -1; - } - parent = e; - e = e->next; - } - return 0; -} - - -/* - * Copyright (c) 2002, 2004, Christopher Clark - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * 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. - * - * * Neither the name of the original author; nor the names of any contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * - * 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. -*/ diff --git a/pkg/registry/zookeeper-3.4.6/src/c/src/hashtable/hashtable_itr.h b/pkg/registry/zookeeper-3.4.6/src/c/src/hashtable/hashtable_itr.h deleted file mode 100644 index 30379c7ee..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/c/src/hashtable/hashtable_itr.h +++ /dev/null @@ -1,119 +0,0 @@ -/* Copyright (C) 2002, 2004 Christopher Clark */ - -#ifndef __HASHTABLE_ITR_CWC22__ -#define __HASHTABLE_ITR_CWC22__ -#include "hashtable.h" -#include "hashtable_private.h" /* needed to enable inlining */ - -#ifdef __cplusplus -extern "C" { -#endif - -/*****************************************************************************/ -/* This struct is only concrete here to allow the inlining of two of the - * accessor functions. */ -struct hashtable_itr -{ - struct hashtable *h; - struct entry *e; - struct entry *parent; - unsigned int index; -}; - - -/*****************************************************************************/ -/* hashtable_iterator - */ - -struct hashtable_itr * -hashtable_iterator(struct hashtable *h); - -/*****************************************************************************/ -/* hashtable_iterator_key - * - return the value of the (key,value) pair at the current position */ - -static inline void * -hashtable_iterator_key(struct hashtable_itr *i) -{ - return i->e->k; -} - -/*****************************************************************************/ -/* value - return the value of the (key,value) pair at the current position */ - -static inline void * -hashtable_iterator_value(struct hashtable_itr *i) -{ - return i->e->v; -} - -/*****************************************************************************/ -/* advance - advance the iterator to the next element - * returns zero if advanced to end of table */ - -int -hashtable_iterator_advance(struct hashtable_itr *itr); - -/*****************************************************************************/ -/* remove - remove current element and advance the iterator to the next element - * NB: if you need the value to free it, read it before - * removing. ie: beware memory leaks! - * returns zero if advanced to end of table */ - -int -hashtable_iterator_remove(struct hashtable_itr *itr); - -/*****************************************************************************/ -/* search - overwrite the supplied iterator, to point to the entry - * matching the supplied key. - h points to the hashtable to be searched. - * returns zero if not found. */ -int -hashtable_iterator_search(struct hashtable_itr *itr, - struct hashtable *h, void *k); - -#define DEFINE_HASHTABLE_ITERATOR_SEARCH(fnname, keytype) \ -int fnname (struct hashtable_itr *i, struct hashtable *h, keytype *k) \ -{ \ - return (hashtable_iterator_search(i,h,k)); \ -} - - -#ifdef __cplusplus -} -#endif - -#endif /* __HASHTABLE_ITR_CWC22__*/ - -/* - * Copyright (c) 2002, 2004, Christopher Clark - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * 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. - * - * * Neither the name of the original author; nor the names of any contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * - * 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. -*/ diff --git a/pkg/registry/zookeeper-3.4.6/src/c/src/hashtable/hashtable_private.h b/pkg/registry/zookeeper-3.4.6/src/c/src/hashtable/hashtable_private.h deleted file mode 100644 index 3e95f6005..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/c/src/hashtable/hashtable_private.h +++ /dev/null @@ -1,85 +0,0 @@ -/* Copyright (C) 2002, 2004 Christopher Clark */ - -#ifndef __HASHTABLE_PRIVATE_CWC22_H__ -#define __HASHTABLE_PRIVATE_CWC22_H__ - -#include "hashtable.h" - -/*****************************************************************************/ -struct entry -{ - void *k, *v; - unsigned int h; - struct entry *next; -}; - -struct hashtable { - unsigned int tablelength; - struct entry **table; - unsigned int entrycount; - unsigned int loadlimit; - unsigned int primeindex; - unsigned int (*hashfn) (void *k); - int (*eqfn) (void *k1, void *k2); -}; - -/*****************************************************************************/ -unsigned int -hash(struct hashtable *h, void *k); - -/*****************************************************************************/ -/* indexFor */ -static inline unsigned int -indexFor(unsigned int tablelength, unsigned int hashvalue) { - return (hashvalue % tablelength); -}; - -/* Only works if tablelength == 2^N */ -/*static inline unsigned int -indexFor(unsigned int tablelength, unsigned int hashvalue) -{ - return (hashvalue & (tablelength - 1u)); -} -*/ - -/*****************************************************************************/ -#define freekey(X) free(X) -/*define freekey(X) ; */ - - -/*****************************************************************************/ - -#endif /* __HASHTABLE_PRIVATE_CWC22_H__*/ - -/* - * Copyright (c) 2002, Christopher Clark - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * 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. - * - * * Neither the name of the original author; nor the names of any contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * - * 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. -*/ diff --git a/pkg/registry/zookeeper-3.4.6/src/c/src/load_gen.c b/pkg/registry/zookeeper-3.4.6/src/c/src/load_gen.c deleted file mode 100644 index 72b595076..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/c/src/load_gen.c +++ /dev/null @@ -1,286 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you 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. - */ - -#include -#include "zookeeper_log.h" -#include -#ifndef WIN32 -#ifdef THREADED -#include -#endif -#else -#include "win32port.h" -#endif -#include -#include - -static zhandle_t *zh; - -static int shutdownThisThing=0; - -// ***************************************************************************** -// -static pthread_cond_t cond=PTHREAD_COND_INITIALIZER; -static pthread_mutex_t lock=PTHREAD_MUTEX_INITIALIZER; - -static pthread_cond_t counterCond=PTHREAD_COND_INITIALIZER; -static pthread_mutex_t counterLock=PTHREAD_MUTEX_INITIALIZER; -static int counter; - - - -void ensureConnected(){ - pthread_mutex_lock(&lock); - while (zoo_state(zh)!=ZOO_CONNECTED_STATE) { - pthread_cond_wait(&cond,&lock); - } - pthread_mutex_unlock(&lock); -} - -void incCounter(int delta){ - pthread_mutex_lock(&counterLock); - counter+=delta; - pthread_cond_broadcast(&counterCond); - pthread_mutex_unlock(&counterLock); - -} -void setCounter(int cnt){ - pthread_mutex_lock(&counterLock); - counter=cnt; - pthread_cond_broadcast(&counterCond); - pthread_mutex_unlock(&counterLock); - -} -void waitCounter(){ - pthread_mutex_lock(&counterLock); - while (counter>0) { - pthread_cond_wait(&counterCond,&counterLock); - } - pthread_mutex_unlock(&counterLock); -} - -void listener(zhandle_t *zzh, int type, int state, const char *path,void* ctx) { - if(type == ZOO_SESSION_EVENT){ - if(state == ZOO_CONNECTED_STATE){ - pthread_mutex_lock(&lock); - pthread_cond_broadcast(&cond); - pthread_mutex_unlock(&lock); - } - setCounter(0); - } -} - -void create_completion(int rc, const char *name, const void *data) { - incCounter(-1); - if(rc!=ZOK){ - LOG_ERROR(("Failed to create a node rc=%d",rc)); - } -} - -int doCreateNodes(const char* root, int count){ - char nodeName[1024]; - int i; - for(i=0; idata) { - int32_t i; - for(i=0;icount; i++) { - free(v->data[i]); - } - free(v->data); - v->data = 0; - } - return 0; -} - -static int deletedCounter; - -int recursiveDelete(const char* root){ - struct String_vector children; - int i; - int rc=zoo_get_children(zh,root,0,&children); - if(rc!=ZNONODE){ - if(rc!=ZOK){ - LOG_ERROR(("Failed to get children of %s, rc=%d",root,rc)); - return rc; - } - for(i=0;i -#include -#include -#include -#include -#include - -#ifndef WIN32 -#include -#include -#include -#include -#endif - -void zoo_lock_auth(zhandle_t *zh) -{ - pthread_mutex_lock(&zh->auth_h.lock); -} -void zoo_unlock_auth(zhandle_t *zh) -{ - pthread_mutex_unlock(&zh->auth_h.lock); -} -void lock_buffer_list(buffer_head_t *l) -{ - pthread_mutex_lock(&l->lock); -} -void unlock_buffer_list(buffer_head_t *l) -{ - pthread_mutex_unlock(&l->lock); -} -void lock_completion_list(completion_head_t *l) -{ - pthread_mutex_lock(&l->lock); -} -void unlock_completion_list(completion_head_t *l) -{ - pthread_cond_broadcast(&l->cond); - pthread_mutex_unlock(&l->lock); -} -struct sync_completion *alloc_sync_completion(void) -{ - struct sync_completion *sc = (struct sync_completion*)calloc(1, sizeof(struct sync_completion)); - if (sc) { - pthread_cond_init(&sc->cond, 0); - pthread_mutex_init(&sc->lock, 0); - } - return sc; -} -int wait_sync_completion(struct sync_completion *sc) -{ - pthread_mutex_lock(&sc->lock); - while (!sc->complete) { - pthread_cond_wait(&sc->cond, &sc->lock); - } - pthread_mutex_unlock(&sc->lock); - return 0; -} - -void free_sync_completion(struct sync_completion *sc) -{ - if (sc) { - pthread_mutex_destroy(&sc->lock); - pthread_cond_destroy(&sc->cond); - free(sc); - } -} - -void notify_sync_completion(struct sync_completion *sc) -{ - pthread_mutex_lock(&sc->lock); - sc->complete = 1; - pthread_cond_broadcast(&sc->cond); - pthread_mutex_unlock(&sc->lock); -} - -int process_async(int outstanding_sync) -{ - return 0; -} - -#ifdef WIN32 -unsigned __stdcall do_io( void * ); -unsigned __stdcall do_completion( void * ); - -int handle_error(SOCKET sock, char* message) -{ - LOG_ERROR(("%s. %d",message, WSAGetLastError())); - closesocket (sock); - return -1; -} - -//--create socket pair for interupting selects. -int create_socket_pair(SOCKET fds[2]) -{ - struct sockaddr_in inaddr; - struct sockaddr addr; - int yes=1; - int len=0; - - SOCKET lst=socket(AF_INET, SOCK_STREAM,IPPROTO_TCP); - if (lst == INVALID_SOCKET ){ - LOG_ERROR(("Error creating socket. %d",WSAGetLastError())); - return -1; - } - memset(&inaddr, 0, sizeof(inaddr)); - memset(&addr, 0, sizeof(addr)); - inaddr.sin_family = AF_INET; - inaddr.sin_addr.s_addr = htonl(INADDR_LOOPBACK); - inaddr.sin_port = 0; //--system assigns the port - - if ( setsockopt(lst,SOL_SOCKET,SO_REUSEADDR,(char*)&yes,sizeof(yes)) == SOCKET_ERROR ) { - return handle_error(lst,"Error trying to set socket option."); - } - if (bind(lst,(struct sockaddr *)&inaddr,sizeof(inaddr)) == SOCKET_ERROR){ - return handle_error(lst,"Error trying to bind socket."); - } - if (listen(lst,1) == SOCKET_ERROR){ - return handle_error(lst,"Error trying to listen on socket."); - } - len=sizeof(inaddr); - getsockname(lst, &addr,&len); - fds[0]=socket(AF_INET, SOCK_STREAM,0); - if (connect(fds[0],&addr,len) == SOCKET_ERROR){ - return handle_error(lst, "Error while connecting to socket."); - } - if ((fds[1]=accept(lst,0,0)) == INVALID_SOCKET){ - closesocket(fds[0]); - return handle_error(lst, "Error while accepting socket connection."); - } - closesocket(lst); - return 0; -} -#else -void *do_io(void *); -void *do_completion(void *); -#endif - - -int wakeup_io_thread(zhandle_t *zh); - -#ifdef WIN32 -static int set_nonblock(SOCKET fd){ - ULONG nonblocking_flag = 1; - if (ioctlsocket(fd, FIONBIO, &nonblocking_flag) == 0) - return 1; - else - return -1; -} -#else -static int set_nonblock(int fd){ - long l = fcntl(fd, F_GETFL); - if(l & O_NONBLOCK) return 0; - return fcntl(fd, F_SETFL, l | O_NONBLOCK); -} -#endif - -void wait_for_others(zhandle_t* zh) -{ - struct adaptor_threads* adaptor=zh->adaptor_priv; - pthread_mutex_lock(&adaptor->lock); - while(adaptor->threadsToWait>0) - pthread_cond_wait(&adaptor->cond,&adaptor->lock); - pthread_mutex_unlock(&adaptor->lock); -} - -void notify_thread_ready(zhandle_t* zh) -{ - struct adaptor_threads* adaptor=zh->adaptor_priv; - pthread_mutex_lock(&adaptor->lock); - adaptor->threadsToWait--; - pthread_cond_broadcast(&adaptor->cond); - while(adaptor->threadsToWait>0) - pthread_cond_wait(&adaptor->cond,&adaptor->lock); - pthread_mutex_unlock(&adaptor->lock); -} - - -void start_threads(zhandle_t* zh) -{ - int rc = 0; - struct adaptor_threads* adaptor=zh->adaptor_priv; - pthread_cond_init(&adaptor->cond,0); - pthread_mutex_init(&adaptor->lock,0); - adaptor->threadsToWait=2; // wait for 2 threads before opening the barrier - - // use api_prolog() to make sure zhandle doesn't get destroyed - // while initialization is in progress - api_prolog(zh); - LOG_DEBUG(("starting threads...")); - rc=pthread_create(&adaptor->io, 0, do_io, zh); - assert("pthread_create() failed for the IO thread"&&!rc); - rc=pthread_create(&adaptor->completion, 0, do_completion, zh); - assert("pthread_create() failed for the completion thread"&&!rc); - wait_for_others(zh); - api_epilog(zh, 0); -} - -int adaptor_init(zhandle_t *zh) -{ - pthread_mutexattr_t recursive_mx_attr; - struct adaptor_threads *adaptor_threads = calloc(1, sizeof(*adaptor_threads)); - if (!adaptor_threads) { - LOG_ERROR(("Out of memory")); - return -1; - } - - /* We use a pipe for interrupting select() in unix/sol and socketpair in windows. */ -#ifdef WIN32 - if (create_socket_pair(adaptor_threads->self_pipe) == -1){ - LOG_ERROR(("Can't make a socket.")); -#else - if(pipe(adaptor_threads->self_pipe)==-1) { - LOG_ERROR(("Can't make a pipe %d",errno)); -#endif - free(adaptor_threads); - return -1; - } - set_nonblock(adaptor_threads->self_pipe[1]); - set_nonblock(adaptor_threads->self_pipe[0]); - - pthread_mutex_init(&zh->auth_h.lock,0); - - zh->adaptor_priv = adaptor_threads; - pthread_mutex_init(&zh->to_process.lock,0); - pthread_mutex_init(&adaptor_threads->zh_lock,0); - // to_send must be recursive mutex - pthread_mutexattr_init(&recursive_mx_attr); - pthread_mutexattr_settype(&recursive_mx_attr, PTHREAD_MUTEX_RECURSIVE); - pthread_mutex_init(&zh->to_send.lock,&recursive_mx_attr); - pthread_mutexattr_destroy(&recursive_mx_attr); - - pthread_mutex_init(&zh->sent_requests.lock,0); - pthread_cond_init(&zh->sent_requests.cond,0); - pthread_mutex_init(&zh->completions_to_process.lock,0); - pthread_cond_init(&zh->completions_to_process.cond,0); - start_threads(zh); - return 0; -} - -void adaptor_finish(zhandle_t *zh) -{ - struct adaptor_threads *adaptor_threads; - // make sure zh doesn't get destroyed until after we're done here - api_prolog(zh); - adaptor_threads = zh->adaptor_priv; - if(adaptor_threads==0) { - api_epilog(zh,0); - return; - } - - if(!pthread_equal(adaptor_threads->io,pthread_self())){ - wakeup_io_thread(zh); - pthread_join(adaptor_threads->io, 0); - }else - pthread_detach(adaptor_threads->io); - - if(!pthread_equal(adaptor_threads->completion,pthread_self())){ - pthread_mutex_lock(&zh->completions_to_process.lock); - pthread_cond_broadcast(&zh->completions_to_process.cond); - pthread_mutex_unlock(&zh->completions_to_process.lock); - pthread_join(adaptor_threads->completion, 0); - }else - pthread_detach(adaptor_threads->completion); - - api_epilog(zh,0); -} - -void adaptor_destroy(zhandle_t *zh) -{ - struct adaptor_threads *adaptor = zh->adaptor_priv; - if(adaptor==0) return; - - pthread_cond_destroy(&adaptor->cond); - pthread_mutex_destroy(&adaptor->lock); - pthread_mutex_destroy(&zh->to_process.lock); - pthread_mutex_destroy(&zh->to_send.lock); - pthread_mutex_destroy(&zh->sent_requests.lock); - pthread_cond_destroy(&zh->sent_requests.cond); - pthread_mutex_destroy(&zh->completions_to_process.lock); - pthread_cond_destroy(&zh->completions_to_process.cond); - pthread_mutex_destroy(&adaptor->zh_lock); - - pthread_mutex_destroy(&zh->auth_h.lock); - - close(adaptor->self_pipe[0]); - close(adaptor->self_pipe[1]); - free(adaptor); - zh->adaptor_priv=0; -} - -int wakeup_io_thread(zhandle_t *zh) -{ - struct adaptor_threads *adaptor_threads = zh->adaptor_priv; - char c=0; -#ifndef WIN32 - return write(adaptor_threads->self_pipe[1],&c,1)==1? ZOK: ZSYSTEMERROR; -#else - return send(adaptor_threads->self_pipe[1], &c, 1, 0)==1? ZOK: ZSYSTEMERROR; -#endif -} - -int adaptor_send_queue(zhandle_t *zh, int timeout) -{ - if(!zh->close_requested) - return wakeup_io_thread(zh); - // don't rely on the IO thread to send the messages if the app has - // requested to close - return flush_send_queue(zh, timeout); -} - -/* These two are declared here because we will run the event loop - * and not the client */ -#ifdef WIN32 -int zookeeper_interest(zhandle_t *zh, SOCKET *fd, int *interest, - struct timeval *tv); -#else -int zookeeper_interest(zhandle_t *zh, int *fd, int *interest, - struct timeval *tv); -#endif -int zookeeper_process(zhandle_t *zh, int events); - -#ifdef WIN32 -unsigned __stdcall do_io( void * v) -#else -void *do_io(void *v) -#endif -{ - zhandle_t *zh = (zhandle_t*)v; -#ifndef WIN32 - struct pollfd fds[2]; - struct adaptor_threads *adaptor_threads = zh->adaptor_priv; - - api_prolog(zh); - notify_thread_ready(zh); - LOG_DEBUG(("started IO thread")); - fds[0].fd=adaptor_threads->self_pipe[0]; - fds[0].events=POLLIN; - while(!zh->close_requested) { - struct timeval tv; - int fd; - int interest; - int timeout; - int maxfd=1; - int rc; - - zookeeper_interest(zh, &fd, &interest, &tv); - if (fd != -1) { - fds[1].fd=fd; - fds[1].events=(interest&ZOOKEEPER_READ)?POLLIN:0; - fds[1].events|=(interest&ZOOKEEPER_WRITE)?POLLOUT:0; - maxfd=2; - } - timeout=tv.tv_sec * 1000 + (tv.tv_usec/1000); - - poll(fds,maxfd,timeout); - if (fd != -1) { - interest=(fds[1].revents&POLLIN)?ZOOKEEPER_READ:0; - interest|=((fds[1].revents&POLLOUT)||(fds[1].revents&POLLHUP))?ZOOKEEPER_WRITE:0; - } - if(fds[0].revents&POLLIN){ - // flush the pipe - char b[128]; - while(read(adaptor_threads->self_pipe[0],b,sizeof(b))==sizeof(b)){} - } -#else - fd_set rfds, wfds, efds; - struct adaptor_threads *adaptor_threads = zh->adaptor_priv; - api_prolog(zh); - notify_thread_ready(zh); - LOG_DEBUG(("started IO thread")); - FD_ZERO(&rfds); FD_ZERO(&wfds); FD_ZERO(&efds); - while(!zh->close_requested) { - struct timeval tv; - SOCKET fd; - SOCKET maxfd=adaptor_threads->self_pipe[0]; - int interest; - int rc; - - zookeeper_interest(zh, &fd, &interest, &tv); - if (fd != -1) { - if (interest&ZOOKEEPER_READ) { - FD_SET(fd, &rfds); - } else { - FD_CLR(fd, &rfds); - } - if (interest&ZOOKEEPER_WRITE) { - FD_SET(fd, &wfds); - } else { - FD_CLR(fd, &wfds); - } - } - FD_SET( adaptor_threads->self_pipe[0] ,&rfds ); - rc = select((int)maxfd, &rfds, &wfds, &efds, &tv); - if (fd != -1) - { - interest = (FD_ISSET(fd, &rfds))? ZOOKEEPER_READ:0; - interest|= (FD_ISSET(fd, &wfds))? ZOOKEEPER_WRITE:0; - } - - if (FD_ISSET(adaptor_threads->self_pipe[0], &rfds)){ - // flush the pipe/socket - char b[128]; - while(recv(adaptor_threads->self_pipe[0],b,sizeof(b), 0)==sizeof(b)){} - } -#endif - // dispatch zookeeper events - rc = zookeeper_process(zh, interest); - // check the current state of the zhandle and terminate - // if it is_unrecoverable() - if(is_unrecoverable(zh)) - break; - } - api_epilog(zh, 0); - LOG_DEBUG(("IO thread terminated")); - return 0; -} - -#ifdef WIN32 -unsigned __stdcall do_completion( void * v) -#else -void *do_completion(void *v) -#endif -{ - zhandle_t *zh = v; - api_prolog(zh); - notify_thread_ready(zh); - LOG_DEBUG(("started completion thread")); - while(!zh->close_requested) { - pthread_mutex_lock(&zh->completions_to_process.lock); - while(!zh->completions_to_process.head && !zh->close_requested) { - pthread_cond_wait(&zh->completions_to_process.cond, &zh->completions_to_process.lock); - } - pthread_mutex_unlock(&zh->completions_to_process.lock); - process_completions(zh); - } - api_epilog(zh, 0); - LOG_DEBUG(("completion thread terminated")); - return 0; -} - -int32_t inc_ref_counter(zhandle_t* zh,int i) -{ - int incr=(i<0?-1:(i>0?1:0)); - // fetch_and_add implements atomic post-increment - int v=fetch_and_add(&zh->ref_counter,incr); - // inc_ref_counter wants pre-increment - v+=incr; // simulate pre-increment - return v; -} - -int32_t fetch_and_add(volatile int32_t* operand, int incr) -{ -#ifndef WIN32 - int32_t result; - asm __volatile__( - "lock xaddl %0,%1\n" - : "=r"(result), "=m"(*(int *)operand) - : "0"(incr) - : "memory"); - return result; -#else - volatile int32_t result; - _asm - { - mov eax, operand; //eax = v; - mov ebx, incr; // ebx = i; - mov ecx, 0x0; // ecx = 0; - lock xadd dword ptr [eax], ecx; - lock xadd dword ptr [eax], ebx; - mov result, ecx; // result = ebx; - } - return result; -#endif -} - -// make sure the static xid is initialized before any threads started -__attribute__((constructor)) int32_t get_xid() -{ - static int32_t xid = -1; - if (xid == -1) { - xid = time(0); - } - return fetch_and_add(&xid,1); -} - -void enter_critical(zhandle_t* zh) -{ - struct adaptor_threads *adaptor = zh->adaptor_priv; - if(adaptor) - pthread_mutex_lock(&adaptor->zh_lock); -} - -void leave_critical(zhandle_t* zh) -{ - struct adaptor_threads *adaptor = zh->adaptor_priv; - if(adaptor) - pthread_mutex_unlock(&adaptor->zh_lock); -} diff --git a/pkg/registry/zookeeper-3.4.6/src/c/src/recordio.c b/pkg/registry/zookeeper-3.4.6/src/c/src/recordio.c deleted file mode 100644 index cf8a1ac7c..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/c/src/recordio.c +++ /dev/null @@ -1,360 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you 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. - */ - -#include -#include -#include -#include -#include -#ifndef WIN32 -#include -#endif - -void deallocate_String(char **s) -{ - if (*s) - free(*s); - *s = 0; -} - -void deallocate_Buffer(struct buffer *b) -{ - if (b->buff) - free(b->buff); - b->buff = 0; -} - -struct buff_struct { - int32_t len; - int32_t off; - char *buffer; -}; - -static int resize_buffer(struct buff_struct *s, int newlen) -{ - char *buffer= NULL; - while (s->len < newlen) { - s->len *= 2; - } - buffer = (char*)realloc(s->buffer, s->len); - if (!buffer) { - s->buffer = 0; - return -ENOMEM; - } - s->buffer = buffer; - return 0; -} - -int oa_start_record(struct oarchive *oa, const char *tag) -{ - return 0; -} -int oa_end_record(struct oarchive *oa, const char *tag) -{ - return 0; -} -int oa_serialize_int(struct oarchive *oa, const char *tag, const int32_t *d) -{ - struct buff_struct *priv = oa->priv; - int32_t i = htonl(*d); - if ((priv->len - priv->off) < sizeof(i)) { - int rc = resize_buffer(priv, priv->len + sizeof(i)); - if (rc < 0) return rc; - } - memcpy(priv->buffer+priv->off, &i, sizeof(i)); - priv->off+=sizeof(i); - return 0; -} -int64_t htonll(int64_t v) -{ - int i = 0; - char *s = (char *)&v; - if (htonl(1) == 1) { - return v; - } - for (i = 0; i < 4; i++) { - int tmp = s[i]; - s[i] = s[8-i-1]; - s[8-i-1] = tmp; - } - - return v; -} - -int oa_serialize_long(struct oarchive *oa, const char *tag, const int64_t *d) -{ - const int64_t i = htonll(*d); - struct buff_struct *priv = oa->priv; - if ((priv->len - priv->off) < sizeof(i)) { - int rc = resize_buffer(priv, priv->len + sizeof(i)); - if (rc < 0) return rc; - } - memcpy(priv->buffer+priv->off, &i, sizeof(i)); - priv->off+=sizeof(i); - return 0; -} -int oa_start_vector(struct oarchive *oa, const char *tag, const int32_t *count) -{ - return oa_serialize_int(oa, tag, count); -} -int oa_end_vector(struct oarchive *oa, const char *tag) -{ - return 0; -} -int oa_serialize_bool(struct oarchive *oa, const char *name, const int32_t *i) -{ - //return oa_serialize_int(oa, name, i); - struct buff_struct *priv = oa->priv; - if ((priv->len - priv->off) < 1) { - int rc = resize_buffer(priv, priv->len + 1); - if (rc < 0) - return rc; - } - priv->buffer[priv->off] = (*i == 0 ? '\0' : '\1'); - priv->off++; - return 0; -} -static const int32_t negone = -1; -int oa_serialize_buffer(struct oarchive *oa, const char *name, - const struct buffer *b) -{ - struct buff_struct *priv = oa->priv; - int rc; - if (!b) { - return oa_serialize_int(oa, "len", &negone); - } - rc = oa_serialize_int(oa, "len", &b->len); - if (rc < 0) - return rc; - // this means a buffer of NUll - // with size of -1. This is - // waht we use in java serialization for NULL - if (b->len == -1) { - return rc; - } - if ((priv->len - priv->off) < b->len) { - rc = resize_buffer(priv, priv->len + b->len); - if (rc < 0) - return rc; - } - memcpy(priv->buffer+priv->off, b->buff, b->len); - priv->off += b->len; - return 0; -} -int oa_serialize_string(struct oarchive *oa, const char *name, char **s) -{ - struct buff_struct *priv = oa->priv; - int32_t len; - int rc; - if (!*s) { - oa_serialize_int(oa, "len", &negone); - return 0; - } - len = strlen(*s); - rc = oa_serialize_int(oa, "len", &len); - if (rc < 0) - return rc; - if ((priv->len - priv->off) < len) { - rc = resize_buffer(priv, priv->len + len); - if (rc < 0) - return rc; - } - memcpy(priv->buffer+priv->off, *s, len); - priv->off += len; - return 0; -} -int ia_start_record(struct iarchive *ia, const char *tag) -{ - return 0; -} -int ia_end_record(struct iarchive *ia, const char *tag) -{ - return 0; -} -int ia_deserialize_int(struct iarchive *ia, const char *tag, int32_t *count) -{ - struct buff_struct *priv = ia->priv; - if ((priv->len - priv->off) < sizeof(*count)) { - return -E2BIG; - } - memcpy(count, priv->buffer+priv->off, sizeof(*count)); - priv->off+=sizeof(*count); - *count = ntohl(*count); - return 0; -} - -int ia_deserialize_long(struct iarchive *ia, const char *tag, int64_t *count) -{ - struct buff_struct *priv = ia->priv; - int64_t v = 0; - if ((priv->len - priv->off) < sizeof(*count)) { - return -E2BIG; - } - memcpy(count, priv->buffer+priv->off, sizeof(*count)); - priv->off+=sizeof(*count); - v = htonll(*count); // htonll and ntohll do the same - *count = v; - return 0; -} -int ia_start_vector(struct iarchive *ia, const char *tag, int32_t *count) -{ - return ia_deserialize_int(ia, tag, count); -} -int ia_end_vector(struct iarchive *ia, const char *tag) -{ - return 0; -} -int ia_deserialize_bool(struct iarchive *ia, const char *name, int32_t *v) -{ - struct buff_struct *priv = ia->priv; - //fprintf(stderr, "Deserializing bool %d\n", priv->off); - //return ia_deserialize_int(ia, name, v); - if ((priv->len - priv->off) < 1) { - return -E2BIG; - } - *v = priv->buffer[priv->off]; - priv->off+=1; - //fprintf(stderr, "Deserializing bool end %d\n", priv->off); - return 0; -} -int ia_deserialize_buffer(struct iarchive *ia, const char *name, - struct buffer *b) -{ - struct buff_struct *priv = ia->priv; - int rc = ia_deserialize_int(ia, "len", &b->len); - if (rc < 0) - return rc; - if ((priv->len - priv->off) < b->len) { - return -E2BIG; - } - // set the buffer to null - if (b->len == -1) { - b->buff = NULL; - return rc; - } - b->buff = malloc(b->len); - if (!b->buff) { - return -ENOMEM; - } - memcpy(b->buff, priv->buffer+priv->off, b->len); - priv->off += b->len; - return 0; -} -int ia_deserialize_string(struct iarchive *ia, const char *name, char **s) -{ - struct buff_struct *priv = ia->priv; - int32_t len; - int rc = ia_deserialize_int(ia, "len", &len); - if (rc < 0) - return rc; - if ((priv->len - priv->off) < len) { - return -E2BIG; - } - if (len < 0) { - return -EINVAL; - } - *s = malloc(len+1); - if (!*s) { - return -ENOMEM; - } - memcpy(*s, priv->buffer+priv->off, len); - (*s)[len] = '\0'; - priv->off += len; - return 0; -} - -static struct iarchive ia_default = { STRUCT_INITIALIZER (start_record ,ia_start_record), - STRUCT_INITIALIZER (end_record ,ia_end_record), STRUCT_INITIALIZER (start_vector , ia_start_vector), - STRUCT_INITIALIZER (end_vector ,ia_end_vector), STRUCT_INITIALIZER (deserialize_Bool , ia_deserialize_bool), - STRUCT_INITIALIZER (deserialize_Int ,ia_deserialize_int), - STRUCT_INITIALIZER (deserialize_Long , ia_deserialize_long) , - STRUCT_INITIALIZER (deserialize_Buffer, ia_deserialize_buffer), - STRUCT_INITIALIZER (deserialize_String, ia_deserialize_string) }; - -static struct oarchive oa_default = { STRUCT_INITIALIZER (start_record , oa_start_record), - STRUCT_INITIALIZER (end_record , oa_end_record), STRUCT_INITIALIZER (start_vector , oa_start_vector), - STRUCT_INITIALIZER (end_vector , oa_end_vector), STRUCT_INITIALIZER (serialize_Bool , oa_serialize_bool), - STRUCT_INITIALIZER (serialize_Int , oa_serialize_int), - STRUCT_INITIALIZER (serialize_Long , oa_serialize_long) , - STRUCT_INITIALIZER (serialize_Buffer , oa_serialize_buffer), - STRUCT_INITIALIZER (serialize_String , oa_serialize_string) }; - -struct iarchive *create_buffer_iarchive(char *buffer, int len) -{ - struct iarchive *ia = malloc(sizeof(*ia)); - struct buff_struct *buff = malloc(sizeof(struct buff_struct)); - if (!ia) return 0; - if (!buff) { - free(ia); - return 0; - } - *ia = ia_default; - buff->off = 0; - buff->buffer = buffer; - buff->len = len; - ia->priv = buff; - return ia; -} - -struct oarchive *create_buffer_oarchive() -{ - struct oarchive *oa = malloc(sizeof(*oa)); - struct buff_struct *buff = malloc(sizeof(struct buff_struct)); - if (!oa) return 0; - if (!buff) { - free(oa); - return 0; - } - *oa = oa_default; - buff->off = 0; - buff->buffer = malloc(128); - buff->len = 128; - oa->priv = buff; - return oa; -} - -void close_buffer_iarchive(struct iarchive **ia) -{ - free((*ia)->priv); - free(*ia); - *ia = 0; -} - -void close_buffer_oarchive(struct oarchive **oa, int free_buffer) -{ - if (free_buffer) { - struct buff_struct *buff = (struct buff_struct *)(*oa)->priv; - if (buff->buffer) { - free(buff->buffer); - } - } - free((*oa)->priv); - free(*oa); - *oa = 0; -} - -char *get_buffer(struct oarchive *oa) -{ - struct buff_struct *buff = oa->priv; - return buff->buffer; -} -int get_buffer_len(struct oarchive *oa) -{ - struct buff_struct *buff = oa->priv; - return buff->off; -} diff --git a/pkg/registry/zookeeper-3.4.6/src/c/src/st_adaptor.c b/pkg/registry/zookeeper-3.4.6/src/c/src/st_adaptor.c deleted file mode 100644 index 7609edf8c..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/c/src/st_adaptor.c +++ /dev/null @@ -1,99 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you 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. - */ - -#ifndef DLL_EXPORT -# define USE_STATIC_LIB -#endif - -#include "zk_adaptor.h" -#include -#include - -void zoo_lock_auth(zhandle_t *zh) -{ -} -void zoo_unlock_auth(zhandle_t *zh) -{ -} -void lock_buffer_list(buffer_head_t *l) -{ -} -void unlock_buffer_list(buffer_head_t *l) -{ -} -void lock_completion_list(completion_head_t *l) -{ -} -void unlock_completion_list(completion_head_t *l) -{ -} -struct sync_completion *alloc_sync_completion(void) -{ - return (struct sync_completion*)calloc(1, sizeof(struct sync_completion)); -} -int wait_sync_completion(struct sync_completion *sc) -{ - return 0; -} - -void free_sync_completion(struct sync_completion *sc) -{ - free(sc); -} - -void notify_sync_completion(struct sync_completion *sc) -{ -} - -int process_async(int outstanding_sync) -{ - return outstanding_sync == 0; -} - -int adaptor_init(zhandle_t *zh) -{ - return 0; -} - -void adaptor_finish(zhandle_t *zh){} - -void adaptor_destroy(zhandle_t *zh){} - -int flush_send_queue(zhandle_t *, int); - -int adaptor_send_queue(zhandle_t *zh, int timeout) -{ - return flush_send_queue(zh, timeout); -} - -int32_t inc_ref_counter(zhandle_t* zh,int i) -{ - zh->ref_counter+=(i<0?-1:(i>0?1:0)); - return zh->ref_counter; -} - -int32_t get_xid() -{ - static int32_t xid = -1; - if (xid == -1) { - xid = time(0); - } - return xid++; -} -void enter_critical(zhandle_t* zh){} -void leave_critical(zhandle_t* zh){} diff --git a/pkg/registry/zookeeper-3.4.6/src/c/src/winport.c b/pkg/registry/zookeeper-3.4.6/src/c/src/winport.c deleted file mode 100644 index aeef3a84e..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/c/src/winport.c +++ /dev/null @@ -1,292 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you 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. - */ - -#ifdef WIN32 -#include "winport.h" -#include -#include - -int pthread_mutex_lock(pthread_mutex_t* _mutex ){ - int rc = WaitForSingleObject( *_mutex, // handle to mutex - INFINITE); // no time-out interval - return ((rc == WAIT_OBJECT_0) ? 0: rc); -} - -int pthread_mutex_unlock( pthread_mutex_t* _mutex ){ - int rc = ReleaseMutex(*_mutex); - return ((rc != 0)? 0: GetLastError()); -} - -int pthread_mutex_init(pthread_mutex_t* _mutex, void* ignoredAttr){ - //use CreateMutex as we are using the HANDLES in pthread_cond - *_mutex = CreateMutex( - NULL, // default security attributes - FALSE, // initially not owned - NULL); // unnamed mutex - return ((*_mutex == NULL) ? GetLastError() : 0); -} - -int pthread_mutex_destroy(pthread_mutex_t* _mutex) -{ - int rc = CloseHandle(*_mutex); - return ((rc != 0)? 0: GetLastError()); -} - -int pthread_create(pthread_t *thread, const pthread_attr_t *attr, unsigned (__stdcall* start_routine)(void* a), void *arg) -{ - int _intThreadId; - (*thread).thread_handle = (HANDLE)_beginthreadex( NULL, 0, start_routine , arg, 0, (unsigned int*)&_intThreadId ); - (*thread).thread_id = _intThreadId; - return (((*thread).thread_handle == 0 ) ? errno : 0 ); -} - - -int pthread_equal(pthread_t t1, pthread_t t2){ -//Is there a better way to do this? GetThreadId(handle) is only supported Windows 2003 n above. - return ((t1.thread_id == t2.thread_id) ? 1:0); -} - -pthread_t pthread_self(){ - pthread_t thread_self; - thread_self.thread_handle = GetCurrentThread(); - thread_self.thread_id = GetCurrentThreadId(); - return thread_self; -} - -int pthread_join(pthread_t _thread, void** ignore) -{ - int rc = WaitForSingleObject( _thread.thread_handle, INFINITE ); - return ((rc == WAIT_OBJECT_0) ? 0: rc); -} - -int pthread_detach(pthread_t _thread) -{ - int rc = CloseHandle(_thread.thread_handle) ; - return (rc != 0) ? 0: GetLastError(); -} - -void pthread_mutexattr_init(pthread_mutexattr_t* ignore){} -void pthread_mutexattr_settype(pthread_mutexattr_t* ingore_attr, int ignore){} -void pthread_mutexattr_destroy(pthread_mutexattr_t* ignore_attr){} - -int -pthread_cond_init (pthread_cond_t *cv, - const pthread_condattr_t * ignore) -{ - cv->waiters_count_ = 0; - cv->was_broadcast_ = 0; - cv->sema_ = CreateSemaphore (NULL, // no security - 0, // initially 0 - 0x7fffffff, // max count - NULL); // unnamed - if (cv->sema_ == NULL ) - return GetLastError(); - InitializeCriticalSection (&cv->waiters_count_lock_); - cv->waiters_done_ = CreateEvent (NULL, // no security - FALSE, // auto-reset - FALSE, // non-signaled initially - NULL); // unnamed - return (cv->waiters_done_ == NULL) ? GetLastError() : 0; - -} - - -int pthread_cond_destroy(pthread_cond_t *cond) -{ - CloseHandle( cond->sema_); - DeleteCriticalSection(&cond->waiters_count_lock_); - return (CloseHandle( cond->waiters_done_ ) == 0)? GetLastError(): 0 ; -} - - -int -pthread_cond_signal (pthread_cond_t *cv) -{ - int have_waiters; - EnterCriticalSection (& (cv->waiters_count_lock_)); - have_waiters = cv->waiters_count_ > 0; - LeaveCriticalSection (&cv->waiters_count_lock_); - - // If there aren't any waiters, then this is a no-op. - if (have_waiters){ - return (ReleaseSemaphore (cv->sema_, 1, 0) == 0 ) ? GetLastError() : 0 ; - }else - return 0; -} - - -int -pthread_cond_broadcast (pthread_cond_t *cv) -{ - // This is needed to ensure that and are - // consistent relative to each other. - int have_waiters = 0; - EnterCriticalSection (&cv->waiters_count_lock_); - - if (cv->waiters_count_ > 0) { - // We are broadcasting, even if there is just one waiter... - // Record that we are broadcasting, which helps optimize - // for the non-broadcast case. - cv->was_broadcast_ = 1; - have_waiters = 1; - } - - if (have_waiters) { - // Wake up all the waiters atomically. - ReleaseSemaphore (cv->sema_, cv->waiters_count_, 0); - - LeaveCriticalSection (&cv->waiters_count_lock_); - - // Wait for all the awakened threads to acquire the counting - // semaphore. - WaitForSingleObject (cv->waiters_done_, INFINITE); - // This assignment is okay, even without the held - // because no other waiter threads can wake up to access it. - cv->was_broadcast_ = 0; - } - else - LeaveCriticalSection (&cv->waiters_count_lock_); -} - - -int -pthread_cond_wait (pthread_cond_t *cv, - pthread_mutex_t *external_mutex) -{ - int last_waiter; - // Avoid race conditions. - EnterCriticalSection (&cv->waiters_count_lock_); - cv->waiters_count_++; - LeaveCriticalSection (&cv->waiters_count_lock_); - - // This call atomically releases the mutex and waits on the - // semaphore until or - // are called by another thread. - SignalObjectAndWait (*external_mutex, cv->sema_, INFINITE, FALSE); - - // Reacquire lock to avoid race conditions. - EnterCriticalSection (&cv->waiters_count_lock_); - - // We're no longer waiting... - cv->waiters_count_--; - - // Check to see if we're the last waiter after . - last_waiter = cv->was_broadcast_ && cv->waiters_count_ == 0; - - LeaveCriticalSection (&cv->waiters_count_lock_); - - // If we're the last waiter thread during this particular broadcast - // then let all the other threads proceed. - if (last_waiter) - // This call atomically signals the event and waits until - // it can acquire the . This is required to ensure fairness. - SignalObjectAndWait (cv->waiters_done_, *external_mutex, INFINITE, FALSE); - else - // Always regain the external mutex since that's the guarantee we - // give to our callers. - WaitForSingleObject (*external_mutex, INFINITE); -} - -int pthread_key_create(pthread_key_t *key, void (*destructor)(void *) ) -{ - int result = 0; - pthread_key_t* newkey; - - if ((newkey = (pthread_key_t*) calloc (1, sizeof (pthread_key_t))) == NULL) - { - result = ENOMEM; - } - else if ((newkey->key = TlsAlloc ()) == TLS_OUT_OF_INDEXES) - { - result = EAGAIN; - free (newkey); - newkey = NULL; - } - else if (destructor != NULL) - { - //--we have to store the function pointer for destructor, so that we can call it - //--to free up the user allocated storage-- - newkey->destructor = destructor; - } - key = newkey; - return (result); -} - -int pthread_key_delete(pthread_key_t key) -{ - int rc = 0; - LPVOID lpvData = TlsGetValue(key.key); - rc = TlsFree (key.key); - rc = (rc != 0 ) ? 0 : GetLastError(); - if (key.destructor != NULL && lpvData != 0){ - key.destructor(lpvData); //we take control of calling destructor, instead of calling it on thread exit. - } - free (&key); - return (rc); -} - -void *pthread_getspecific(pthread_key_t key) -{ - LPVOID lpvData = TlsGetValue(key.key); - if ((lpvData == 0) && (GetLastError() != ERROR_SUCCESS)) - return NULL; - else - return lpvData; -} - -int pthread_setspecific(pthread_key_t key, const void *value) -{ - int rc = TlsSetValue (key.key, value); - return ((rc != 0 ) ? 0 : GetLastError()); -} - - -int close(SOCKET fd) { - return closesocket(fd); -} - -int Win32WSAStartup() -{ - WORD wVersionRq; - WSADATA wsaData; - int err; - - wVersionRq = MAKEWORD(2,0); - err = WSAStartup(wVersionRq, &wsaData); - if (err != 0) - return 1; - - // confirm the version information - if ((LOBYTE(wsaData.wVersion) != 2) || - (HIBYTE(wsaData.wVersion) != 0)) - { - Win32WSACleanup(); - return 1; - } - return 0; -} - -void Win32WSACleanup() -{ - WSACleanup(); -} - -#endif //WIN32 - - - diff --git a/pkg/registry/zookeeper-3.4.6/src/c/src/winport.h b/pkg/registry/zookeeper-3.4.6/src/c/src/winport.h deleted file mode 100644 index 32272c03d..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/c/src/winport.h +++ /dev/null @@ -1,123 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you 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 header file is to port pthread lib , sockets and other utility methods on windows. - * Specifically the threads function, mutexes, keys, and socket initialization. - */ - -#ifndef WINPORT_H_ -#define WINPORT_H_ - -#ifdef WIN32 -#include -#include -#include -#include -#include - - -typedef int ssize_t; -typedef HANDLE pthread_mutex_t; - -struct pthread_t_ -{ - HANDLE thread_handle; - DWORD thread_id; -}; - -typedef struct pthread_t_ pthread_t; -typedef int pthread_mutexattr_t; -typedef int pthread_condattr_t; -typedef int pthread_attr_t; -#define PTHREAD_MUTEX_RECURSIVE 0 - -int pthread_mutex_lock(pthread_mutex_t* _mutex ); -int pthread_mutex_unlock( pthread_mutex_t* _mutex ); -int pthread_mutex_init(pthread_mutex_t* _mutex, void* ignoredAttr); -int pthread_mutex_destroy(pthread_mutex_t* _mutex); -int pthread_create(pthread_t *thread, const pthread_attr_t *attr, unsigned (__stdcall* start_routine)(void* a), void *arg); -int pthread_equal(pthread_t t1, pthread_t t2); -pthread_t pthread_self(); -int pthread_join(pthread_t _thread, void** ignore); -int pthread_detach(pthread_t _thread); - -void pthread_mutexattr_init(pthread_mutexattr_t* ignore); -void pthread_mutexattr_settype(pthread_mutexattr_t* ingore_attr, int ignore); -void pthread_mutexattr_destroy(pthread_mutexattr_t* ignore_attr); - - -// http://www.cs.wustl.edu/~schmidt/win32-cv-1.html - -typedef struct -{ - int waiters_count_; - // Number of waiting threads. - - CRITICAL_SECTION waiters_count_lock_; - // Serialize access to . - - HANDLE sema_; - // Semaphore used to queue up threads waiting for the condition to - // become signaled. - - HANDLE waiters_done_; - // An auto-reset event used by the broadcast/signal thread to wait - // for all the waiting thread(s) to wake up and be released from the - // semaphore. - - size_t was_broadcast_; - // Keeps track of whether we were broadcasting or signaling. This - // allows us to optimize the code if we're just signaling. -}pthread_cond_t; - -int pthread_cond_init (pthread_cond_t *cv,const pthread_condattr_t * ignore); -int pthread_cond_destroy(pthread_cond_t *cond); -int pthread_cond_signal (pthread_cond_t *cv); -int pthread_cond_broadcast (pthread_cond_t *cv); -int pthread_cond_wait (pthread_cond_t *cv, pthread_mutex_t *external_mutex); - - -struct pthread_key_t_ -{ - DWORD key; - void (*destructor) (void *); -}; - -typedef struct pthread_key_t_ pthread_key_t; -int pthread_key_create(pthread_key_t *key, void (*destructor)(void *) ); -int pthread_key_delete(pthread_key_t key); -void *pthread_getspecific(pthread_key_t key); -int pthread_setspecific(pthread_key_t key, const void *value); - -inline int gettimeofday(struct timeval *tp, void *tzp) { - int64_t now = 0; - if (tzp != 0) { errno = EINVAL; return -1; } - GetSystemTimeAsFileTime( (LPFILETIME)&now ); - tp->tv_sec = (long)(now / 10000000 - 11644473600LL); - tp->tv_usec = (now / 10) % 1000000; - return 0; -} -int close(SOCKET fd); -int Win32WSAStartup(); -void Win32WSACleanup(); -#endif //WIN32 - - - -#endif //WINPORT_H_ diff --git a/pkg/registry/zookeeper-3.4.6/src/c/src/zk_adaptor.h b/pkg/registry/zookeeper-3.4.6/src/c/src/zk_adaptor.h deleted file mode 100644 index 6aed38fab..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/c/src/zk_adaptor.h +++ /dev/null @@ -1,276 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you 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. - */ - -#ifndef ZK_ADAPTOR_H_ -#define ZK_ADAPTOR_H_ -#include -#ifdef THREADED -#ifndef WIN32 -#include -#else -#include "winport.h" -#endif -#endif -#include "zookeeper.h" -#include "zk_hashtable.h" - -/* predefined xid's values recognized as special by the server */ -#define WATCHER_EVENT_XID -1 -#define PING_XID -2 -#define AUTH_XID -4 -#define SET_WATCHES_XID -8 - -/* zookeeper state constants */ -#define EXPIRED_SESSION_STATE_DEF -112 -#define AUTH_FAILED_STATE_DEF -113 -#define CONNECTING_STATE_DEF 1 -#define ASSOCIATING_STATE_DEF 2 -#define CONNECTED_STATE_DEF 3 -#define NOTCONNECTED_STATE_DEF 999 - -/* zookeeper event type constants */ -#define CREATED_EVENT_DEF 1 -#define DELETED_EVENT_DEF 2 -#define CHANGED_EVENT_DEF 3 -#define CHILD_EVENT_DEF 4 -#define SESSION_EVENT_DEF -1 -#define NOTWATCHING_EVENT_DEF -2 - -#ifdef __cplusplus -extern "C" { -#endif - -struct _buffer_list; -struct _completion_list; - -typedef struct _buffer_head { - struct _buffer_list *volatile head; - struct _buffer_list *last; -#ifdef THREADED - pthread_mutex_t lock; -#endif -} buffer_head_t; - -typedef struct _completion_head { - struct _completion_list *volatile head; - struct _completion_list *last; -#ifdef THREADED - pthread_cond_t cond; - pthread_mutex_t lock; -#endif -} completion_head_t; - -void lock_buffer_list(buffer_head_t *l); -void unlock_buffer_list(buffer_head_t *l); -void lock_completion_list(completion_head_t *l); -void unlock_completion_list(completion_head_t *l); - -struct sync_completion { - int rc; - union { - struct { - char *str; - int str_len; - } str; - struct Stat stat; - struct { - char *buffer; - int buff_len; - struct Stat stat; - } data; - struct { - struct ACL_vector acl; - struct Stat stat; - } acl; - struct String_vector strs2; - struct { - struct String_vector strs2; - struct Stat stat2; - } strs_stat; - } u; - int complete; -#ifdef THREADED - pthread_cond_t cond; - pthread_mutex_t lock; -#endif -}; - -typedef struct _auth_info { - int state; /* 0=>inactive, >0 => active */ - char* scheme; - struct buffer auth; - void_completion_t completion; - const char* data; - struct _auth_info *next; -} auth_info; - -/** - * This structure represents a packet being read or written. - */ -typedef struct _buffer_list { - char *buffer; - int len; /* This represents the length of sizeof(header) + length of buffer */ - int curr_offset; /* This is the offset into the header followed by offset into the buffer */ - struct _buffer_list *next; -} buffer_list_t; - -/* the size of connect request */ -#define HANDSHAKE_REQ_SIZE 44 -/* connect request */ -struct connect_req { - int32_t protocolVersion; - int64_t lastZxidSeen; - int32_t timeOut; - int64_t sessionId; - int32_t passwd_len; - char passwd[16]; -}; - -/* the connect response */ -struct prime_struct { - int32_t len; - int32_t protocolVersion; - int32_t timeOut; - int64_t sessionId; - int32_t passwd_len; - char passwd[16]; -}; - -#ifdef THREADED -/* this is used by mt_adaptor internally for thread management */ -struct adaptor_threads { - pthread_t io; - pthread_t completion; - int threadsToWait; // barrier - pthread_cond_t cond; // barrier's conditional - pthread_mutex_t lock; // ... and a lock - pthread_mutex_t zh_lock; // critical section lock -#ifdef WIN32 - SOCKET self_pipe[2]; -#else - int self_pipe[2]; -#endif -}; -#endif - -/** the auth list for adding auth */ -typedef struct _auth_list_head { - auth_info *auth; -#ifdef THREADED - pthread_mutex_t lock; -#endif -} auth_list_head_t; - -/** - * This structure represents the connection to zookeeper. - */ - -struct _zhandle { -#ifdef WIN32 - SOCKET fd; /* the descriptor used to talk to zookeeper */ -#else - int fd; /* the descriptor used to talk to zookeeper */ -#endif - char *hostname; /* the hostname of zookeeper */ - struct sockaddr_storage *addrs; /* the addresses that correspond to the hostname */ - int addrs_count; /* The number of addresses in the addrs array */ - watcher_fn watcher; /* the registered watcher */ - struct timeval last_recv; /* The time that the last message was received */ - struct timeval last_send; /* The time that the last message was sent */ - struct timeval last_ping; /* The time that the last PING was sent */ - struct timeval next_deadline; /* The time of the next deadline */ - int recv_timeout; /* The maximum amount of time that can go by without - receiving anything from the zookeeper server */ - buffer_list_t *input_buffer; /* the current buffer being read in */ - buffer_head_t to_process; /* The buffers that have been read and are ready to be processed. */ - buffer_head_t to_send; /* The packets queued to send */ - completion_head_t sent_requests; /* The outstanding requests */ - completion_head_t completions_to_process; /* completions that are ready to run */ - int connect_index; /* The index of the address to connect to */ - clientid_t client_id; - long long last_zxid; - int outstanding_sync; /* Number of outstanding synchronous requests */ - struct _buffer_list primer_buffer; /* The buffer used for the handshake at the start of a connection */ - struct prime_struct primer_storage; /* the connect response */ - char primer_storage_buffer[40]; /* the true size of primer_storage */ - volatile int state; - void *context; - auth_list_head_t auth_h; /* authentication data list */ - /* zookeeper_close is not reentrant because it de-allocates the zhandler. - * This guard variable is used to defer the destruction of zhandle till - * right before top-level API call returns to the caller */ - int32_t ref_counter; - volatile int close_requested; - void *adaptor_priv; - /* Used for debugging only: non-zero value indicates the time when the zookeeper_process - * call returned while there was at least one unprocessed server response - * available in the socket recv buffer */ - struct timeval socket_readable; - - zk_hashtable* active_node_watchers; - zk_hashtable* active_exist_watchers; - zk_hashtable* active_child_watchers; - /** used for chroot path at the client side **/ - char *chroot; -}; - - -int adaptor_init(zhandle_t *zh); -void adaptor_finish(zhandle_t *zh); -void adaptor_destroy(zhandle_t *zh); -struct sync_completion *alloc_sync_completion(void); -int wait_sync_completion(struct sync_completion *sc); -void free_sync_completion(struct sync_completion *sc); -void notify_sync_completion(struct sync_completion *sc); -int adaptor_send_queue(zhandle_t *zh, int timeout); -int process_async(int outstanding_sync); -void process_completions(zhandle_t *zh); -int flush_send_queue(zhandle_t*zh, int timeout); -char* sub_string(zhandle_t *zh, const char* server_path); -void free_duplicate_path(const char* free_path, const char* path); -void zoo_lock_auth(zhandle_t *zh); -void zoo_unlock_auth(zhandle_t *zh); - -// critical section guards -void enter_critical(zhandle_t* zh); -void leave_critical(zhandle_t* zh); -// zhandle object reference counting -void api_prolog(zhandle_t* zh); -int api_epilog(zhandle_t *zh, int rc); -int32_t get_xid(); -// returns the new value of the ref counter -int32_t inc_ref_counter(zhandle_t* zh,int i); - -#ifdef THREADED -// atomic post-increment -int32_t fetch_and_add(volatile int32_t* operand, int incr); -// in mt mode process session event asynchronously by the completion thread -#define PROCESS_SESSION_EVENT(zh,newstate) queue_session_event(zh,newstate) -#else -// in single-threaded mode process session event immediately -//#define PROCESS_SESSION_EVENT(zh,newstate) deliverWatchers(zh,ZOO_SESSION_EVENT,newstate,0) -#define PROCESS_SESSION_EVENT(zh,newstate) queue_session_event(zh,newstate) -#endif - -#ifdef __cplusplus -} -#endif - -#endif /*ZK_ADAPTOR_H_*/ - - diff --git a/pkg/registry/zookeeper-3.4.6/src/c/src/zk_hashtable.c b/pkg/registry/zookeeper-3.4.6/src/c/src/zk_hashtable.c deleted file mode 100644 index 0efc5aaf4..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/c/src/zk_hashtable.c +++ /dev/null @@ -1,337 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you 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. - */ - -#include "zk_hashtable.h" -#include "zk_adaptor.h" -#include "hashtable/hashtable.h" -#include "hashtable/hashtable_itr.h" -#include -#include -#include - -typedef struct _watcher_object { - watcher_fn watcher; - void* context; - struct _watcher_object* next; -} watcher_object_t; - - -struct _zk_hashtable { - struct hashtable* ht; -}; - -struct watcher_object_list { - watcher_object_t* head; -}; - -/* the following functions are for testing only */ -typedef struct hashtable hashtable_impl; - -hashtable_impl* getImpl(zk_hashtable* ht){ - return ht->ht; -} - -watcher_object_t* getFirstWatcher(zk_hashtable* ht,const char* path) -{ - watcher_object_list_t* wl=hashtable_search(ht->ht,(void*)path); - if(wl!=0) - return wl->head; - return 0; -} -/* end of testing functions */ - -watcher_object_t* clone_watcher_object(watcher_object_t* wo) -{ - watcher_object_t* res=calloc(1,sizeof(watcher_object_t)); - assert(res); - res->watcher=wo->watcher; - res->context=wo->context; - return res; -} - -static unsigned int string_hash_djb2(void *str) -{ - unsigned int hash = 5381; - int c; - const char* cstr = (const char*)str; - while ((c = *cstr++)) - hash = ((hash << 5) + hash) + c; /* hash * 33 + c */ - - return hash; -} - -static int string_equal(void *key1,void *key2) -{ - return strcmp((const char*)key1,(const char*)key2)==0; -} - -static watcher_object_t* create_watcher_object(watcher_fn watcher,void* ctx) -{ - watcher_object_t* wo=calloc(1,sizeof(watcher_object_t)); - assert(wo); - wo->watcher=watcher; - wo->context=ctx; - return wo; -} - -static watcher_object_list_t* create_watcher_object_list(watcher_object_t* head) -{ - watcher_object_list_t* wl=calloc(1,sizeof(watcher_object_list_t)); - assert(wl); - wl->head=head; - return wl; -} - -static void destroy_watcher_object_list(watcher_object_list_t* list) -{ - watcher_object_t* e = NULL; - - if(list==0) - return; - e=list->head; - while(e!=0){ - watcher_object_t* this=e; - e=e->next; - free(this); - } - free(list); -} - -zk_hashtable* create_zk_hashtable() -{ - struct _zk_hashtable *ht=calloc(1,sizeof(struct _zk_hashtable)); - assert(ht); - ht->ht=create_hashtable(32,string_hash_djb2,string_equal); - return ht; -} - -static void do_clean_hashtable(zk_hashtable* ht) -{ - struct hashtable_itr *it; - int hasMore; - if(hashtable_count(ht->ht)==0) - return; - it=hashtable_iterator(ht->ht); - do { - watcher_object_list_t* w=hashtable_iterator_value(it); - destroy_watcher_object_list(w); - hasMore=hashtable_iterator_remove(it); - } while(hasMore); - free(it); -} - -void destroy_zk_hashtable(zk_hashtable* ht) -{ - if(ht!=0){ - do_clean_hashtable(ht); - hashtable_destroy(ht->ht,0); - free(ht); - } -} - -// searches for a watcher object instance in a watcher object list; -// two watcher objects are equal if their watcher function and context pointers -// are equal -static watcher_object_t* search_watcher(watcher_object_list_t** wl,watcher_object_t* wo) -{ - watcher_object_t* wobj=(*wl)->head; - while(wobj!=0){ - if(wobj->watcher==wo->watcher && wobj->context==wo->context) - return wobj; - wobj=wobj->next; - } - return 0; -} - -static int add_to_list(watcher_object_list_t **wl, watcher_object_t *wo, - int clone) -{ - if (search_watcher(wl, wo)==0) { - watcher_object_t* cloned=wo; - if (clone) { - cloned = clone_watcher_object(wo); - assert(cloned); - } - cloned->next = (*wl)->head; - (*wl)->head = cloned; - return 1; - } else if (!clone) { - // If it's here and we aren't supposed to clone, we must destroy - free(wo); - } - return 0; -} - -static int do_insert_watcher_object(zk_hashtable *ht, const char *path, watcher_object_t* wo) -{ - int res=1; - watcher_object_list_t* wl; - - wl=hashtable_search(ht->ht,(void*)path); - if(wl==0){ - int res; - /* inserting a new path element */ - res=hashtable_insert(ht->ht,strdup(path),create_watcher_object_list(wo)); - assert(res); - }else{ - /* - * Path already exists; check if the watcher already exists. - * Don't clone the watcher since it's allocated on the heap --- avoids - * a memory leak and saves a clone operation (calloc + copy). - */ - res = add_to_list(&wl, wo, 0); - } - return res; -} - - -char **collect_keys(zk_hashtable *ht, int *count) -{ - char **list; - struct hashtable_itr *it; - int i; - - *count = hashtable_count(ht->ht); - list = calloc(*count, sizeof(char*)); - it=hashtable_iterator(ht->ht); - for(i = 0; i < *count; i++) { - list[i] = strdup(hashtable_iterator_key(it)); - hashtable_iterator_advance(it); - } - free(it); - return list; -} - -static int insert_watcher_object(zk_hashtable *ht, const char *path, - watcher_object_t* wo) -{ - int res; - res=do_insert_watcher_object(ht,path,wo); - return res; -} - -static void copy_watchers(watcher_object_list_t *from, watcher_object_list_t *to, int clone) -{ - watcher_object_t* wo=from->head; - while(wo){ - watcher_object_t *next = wo->next; - add_to_list(&to, wo, clone); - wo=next; - } -} - -static void copy_table(zk_hashtable *from, watcher_object_list_t *to) { - struct hashtable_itr *it; - int hasMore; - if(hashtable_count(from->ht)==0) - return; - it=hashtable_iterator(from->ht); - do { - watcher_object_list_t *w = hashtable_iterator_value(it); - copy_watchers(w, to, 1); - hasMore=hashtable_iterator_advance(it); - } while(hasMore); - free(it); -} - -static void collect_session_watchers(zhandle_t *zh, - watcher_object_list_t **list) -{ - copy_table(zh->active_node_watchers, *list); - copy_table(zh->active_exist_watchers, *list); - copy_table(zh->active_child_watchers, *list); -} - -static void add_for_event(zk_hashtable *ht, char *path, watcher_object_list_t **list) -{ - watcher_object_list_t* wl; - wl = (watcher_object_list_t*)hashtable_remove(ht->ht, path); - if (wl) { - copy_watchers(wl, *list, 0); - // Since we move, not clone the watch_objects, we just need to free the - // head pointer - free(wl); - } -} - -static void do_foreach_watcher(watcher_object_t* wo,zhandle_t* zh, - const char* path,int type,int state) -{ - // session event's don't have paths - const char *client_path = - (type != ZOO_SESSION_EVENT ? sub_string(zh, path) : path); - while(wo!=0){ - wo->watcher(zh,type,state,client_path,wo->context); - wo=wo->next; - } - free_duplicate_path(client_path, path); -} - -watcher_object_list_t *collectWatchers(zhandle_t *zh,int type, char *path) -{ - struct watcher_object_list *list = create_watcher_object_list(0); - - if(type==ZOO_SESSION_EVENT){ - watcher_object_t defWatcher; - defWatcher.watcher=zh->watcher; - defWatcher.context=zh->context; - add_to_list(&list, &defWatcher, 1); - collect_session_watchers(zh, &list); - return list; - } - switch(type){ - case CREATED_EVENT_DEF: - case CHANGED_EVENT_DEF: - // look up the watchers for the path and move them to a delivery list - add_for_event(zh->active_node_watchers,path,&list); - add_for_event(zh->active_exist_watchers,path,&list); - break; - case CHILD_EVENT_DEF: - // look up the watchers for the path and move them to a delivery list - add_for_event(zh->active_child_watchers,path,&list); - break; - case DELETED_EVENT_DEF: - // look up the watchers for the path and move them to a delivery list - add_for_event(zh->active_node_watchers,path,&list); - add_for_event(zh->active_exist_watchers,path,&list); - add_for_event(zh->active_child_watchers,path,&list); - break; - } - return list; -} - -void deliverWatchers(zhandle_t *zh, int type,int state, char *path, watcher_object_list_t **list) -{ - if (!list || !(*list)) return; - do_foreach_watcher((*list)->head, zh, path, type, state); - destroy_watcher_object_list(*list); - *list = 0; -} - -void activateWatcher(zhandle_t *zh, watcher_registration_t* reg, int rc) -{ - if(reg){ - /* in multithreaded lib, this code is executed - * by the IO thread */ - zk_hashtable *ht = reg->checker(zh, rc); - if(ht){ - insert_watcher_object(ht,reg->path, - create_watcher_object(reg->watcher, reg->context)); - } - } -} diff --git a/pkg/registry/zookeeper-3.4.6/src/c/src/zk_hashtable.h b/pkg/registry/zookeeper-3.4.6/src/c/src/zk_hashtable.h deleted file mode 100644 index 31109c11f..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/c/src/zk_hashtable.h +++ /dev/null @@ -1,69 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you 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. - */ - -#ifndef ZK_HASHTABLE_H_ -#define ZK_HASHTABLE_H_ - -#include - -#ifdef __cplusplus -extern "C" { -#endif - - typedef struct watcher_object_list watcher_object_list_t; -typedef struct _zk_hashtable zk_hashtable; - -/** - * The function must return a non-zero value if the watcher object can be activated - * as a result of the server response. Normally, a watch can only be activated - * if the server returns a success code (ZOK). However in the case when zoo_exists() - * returns a ZNONODE code the watcher should be activated nevertheless. - */ -typedef zk_hashtable *(*result_checker_fn)(zhandle_t *, int rc); - -/** - * A watcher object gets temporarily stored with the completion entry until - * the server response comes back at which moment the watcher object is moved - * to the active watchers map. - */ -typedef struct _watcher_registration { - watcher_fn watcher; - void* context; - result_checker_fn checker; - const char* path; -} watcher_registration_t; - -zk_hashtable* create_zk_hashtable(); -void destroy_zk_hashtable(zk_hashtable* ht); - -char **collect_keys(zk_hashtable *ht, int *count); - -/** - * check if the completion has a watcher object associated - * with it. If it does, move the watcher object to the map of - * active watchers (only if the checker allows to do so) - */ - void activateWatcher(zhandle_t *zh, watcher_registration_t* reg, int rc); - watcher_object_list_t *collectWatchers(zhandle_t *zh,int type, char *path); - void deliverWatchers(zhandle_t *zh, int type, int state, char *path, struct watcher_object_list **list); - -#ifdef __cplusplus -} -#endif - -#endif /*ZK_HASHTABLE_H_*/ diff --git a/pkg/registry/zookeeper-3.4.6/src/c/src/zk_log.c b/pkg/registry/zookeeper-3.4.6/src/c/src/zk_log.c deleted file mode 100644 index 4dc0f2167..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/c/src/zk_log.c +++ /dev/null @@ -1,176 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you 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. - */ - -#ifndef DLL_EXPORT -# define USE_STATIC_LIB -#endif - -#include "zookeeper_log.h" -#ifndef WIN32 -#include -#endif - -#include -#include - -#define TIME_NOW_BUF_SIZE 1024 -#define FORMAT_LOG_BUF_SIZE 4096 - -#ifdef THREADED -#ifndef WIN32 -#include -#else -#include "winport.h" -#endif - -static pthread_key_t time_now_buffer; -static pthread_key_t format_log_msg_buffer; - -void freeBuffer(void* p){ - if(p) free(p); -} - -__attribute__((constructor)) void prepareTSDKeys() { - pthread_key_create (&time_now_buffer, freeBuffer); - pthread_key_create (&format_log_msg_buffer, freeBuffer); -} - -char* getTSData(pthread_key_t key,int size){ - char* p=pthread_getspecific(key); - if(p==0){ - int res; - p=calloc(1,size); - res=pthread_setspecific(key,p); - if(res!=0){ - fprintf(stderr,"Failed to set TSD key: %d",res); - } - } - return p; -} - -char* get_time_buffer(){ - return getTSData(time_now_buffer,TIME_NOW_BUF_SIZE); -} - -char* get_format_log_buffer(){ - return getTSData(format_log_msg_buffer,FORMAT_LOG_BUF_SIZE); -} -#else -char* get_time_buffer(){ - static char buf[TIME_NOW_BUF_SIZE]; - return buf; -} - -char* get_format_log_buffer(){ - static char buf[FORMAT_LOG_BUF_SIZE]; - return buf; -} - -#endif - -ZooLogLevel logLevel=ZOO_LOG_LEVEL_INFO; - -static FILE* logStream=0; -FILE* getLogStream(){ - if(logStream==0) - logStream=stderr; - return logStream; -} - -void zoo_set_log_stream(FILE* stream){ - logStream=stream; -} - -static const char* time_now(char* now_str){ - struct timeval tv; - struct tm lt; - time_t now = 0; - size_t len = 0; - - gettimeofday(&tv,0); - - now = tv.tv_sec; - localtime_r(&now, <); - - // clone the format used by log4j ISO8601DateFormat - // specifically: "yyyy-MM-dd HH:mm:ss,SSS" - - len = strftime(now_str, TIME_NOW_BUF_SIZE, - "%Y-%m-%d %H:%M:%S", - <); - - len += snprintf(now_str + len, - TIME_NOW_BUF_SIZE - len, - ",%03d", - (int)(tv.tv_usec/1000)); - - return now_str; -} - -void log_message(ZooLogLevel curLevel,int line,const char* funcName, - const char* message) -{ - static const char* dbgLevelStr[]={"ZOO_INVALID","ZOO_ERROR","ZOO_WARN", - "ZOO_INFO","ZOO_DEBUG"}; - static pid_t pid=0; -#ifdef WIN32 - char timebuf [TIME_NOW_BUF_SIZE]; -#endif - if(pid==0)pid=getpid(); -#ifndef THREADED - fprintf(LOGSTREAM, "%s:%d:%s@%s@%d: %s\n", time_now(get_time_buffer()),pid, - dbgLevelStr[curLevel],funcName,line,message); -#else -#ifdef WIN32 - fprintf(LOGSTREAM, "%s:%d(0x%lx):%s@%s@%d: %s\n", time_now(timebuf),pid, - (unsigned long int)(pthread_self().thread_id), - dbgLevelStr[curLevel],funcName,line,message); -#else - fprintf(LOGSTREAM, "%s:%d(0x%lx):%s@%s@%d: %s\n", time_now(get_time_buffer()),pid, - (unsigned long int)pthread_self(), - dbgLevelStr[curLevel],funcName,line,message); -#endif -#endif - fflush(LOGSTREAM); -} - -const char* format_log_message(const char* format,...) -{ - va_list va; - char* buf=get_format_log_buffer(); - if(!buf) - return "format_log_message: Unable to allocate memory buffer"; - - va_start(va,format); - vsnprintf(buf, FORMAT_LOG_BUF_SIZE-1,format,va); - va_end(va); - return buf; -} - -void zoo_set_debug_level(ZooLogLevel level) -{ - if(level==0){ - // disable logging (unit tests do this) - logLevel=(ZooLogLevel)0; - return; - } - if(levelZOO_LOG_LEVEL_DEBUG)level=ZOO_LOG_LEVEL_DEBUG; - logLevel=level; -} - diff --git a/pkg/registry/zookeeper-3.4.6/src/c/src/zookeeper.c b/pkg/registry/zookeeper-3.4.6/src/c/src/zookeeper.c deleted file mode 100644 index 27ecf8a6a..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/c/src/zookeeper.c +++ /dev/null @@ -1,3714 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you 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. - */ - -#ifndef DLL_EXPORT -# define USE_STATIC_LIB -#endif - -#if defined(__CYGWIN__) -#define USE_IPV6 -#endif - -#include -#include -#include -#include "zk_adaptor.h" -#include "zookeeper_log.h" -#include "zk_hashtable.h" - -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#ifndef WIN32 -#include -#include -#include -#include -#include -#include -#include -#include -#include "config.h" -#endif - -#ifdef HAVE_SYS_UTSNAME_H -#include -#endif - -#ifdef HAVE_GETPWUID_R -#include -#endif - -#define IF_DEBUG(x) if(logLevel==ZOO_LOG_LEVEL_DEBUG) {x;} - -const int ZOOKEEPER_WRITE = 1 << 0; -const int ZOOKEEPER_READ = 1 << 1; - -const int ZOO_EPHEMERAL = 1 << 0; -const int ZOO_SEQUENCE = 1 << 1; - -const int ZOO_EXPIRED_SESSION_STATE = EXPIRED_SESSION_STATE_DEF; -const int ZOO_AUTH_FAILED_STATE = AUTH_FAILED_STATE_DEF; -const int ZOO_CONNECTING_STATE = CONNECTING_STATE_DEF; -const int ZOO_ASSOCIATING_STATE = ASSOCIATING_STATE_DEF; -const int ZOO_CONNECTED_STATE = CONNECTED_STATE_DEF; -static __attribute__ ((unused)) const char* state2String(int state){ - switch(state){ - case 0: - return "ZOO_CLOSED_STATE"; - case CONNECTING_STATE_DEF: - return "ZOO_CONNECTING_STATE"; - case ASSOCIATING_STATE_DEF: - return "ZOO_ASSOCIATING_STATE"; - case CONNECTED_STATE_DEF: - return "ZOO_CONNECTED_STATE"; - case EXPIRED_SESSION_STATE_DEF: - return "ZOO_EXPIRED_SESSION_STATE"; - case AUTH_FAILED_STATE_DEF: - return "ZOO_AUTH_FAILED_STATE"; - } - return "INVALID_STATE"; -} - -const int ZOO_CREATED_EVENT = CREATED_EVENT_DEF; -const int ZOO_DELETED_EVENT = DELETED_EVENT_DEF; -const int ZOO_CHANGED_EVENT = CHANGED_EVENT_DEF; -const int ZOO_CHILD_EVENT = CHILD_EVENT_DEF; -const int ZOO_SESSION_EVENT = SESSION_EVENT_DEF; -const int ZOO_NOTWATCHING_EVENT = NOTWATCHING_EVENT_DEF; -static __attribute__ ((unused)) const char* watcherEvent2String(int ev){ - switch(ev){ - case 0: - return "ZOO_ERROR_EVENT"; - case CREATED_EVENT_DEF: - return "ZOO_CREATED_EVENT"; - case DELETED_EVENT_DEF: - return "ZOO_DELETED_EVENT"; - case CHANGED_EVENT_DEF: - return "ZOO_CHANGED_EVENT"; - case CHILD_EVENT_DEF: - return "ZOO_CHILD_EVENT"; - case SESSION_EVENT_DEF: - return "ZOO_SESSION_EVENT"; - case NOTWATCHING_EVENT_DEF: - return "ZOO_NOTWATCHING_EVENT"; - } - return "INVALID_EVENT"; -} - -const int ZOO_PERM_READ = 1 << 0; -const int ZOO_PERM_WRITE = 1 << 1; -const int ZOO_PERM_CREATE = 1 << 2; -const int ZOO_PERM_DELETE = 1 << 3; -const int ZOO_PERM_ADMIN = 1 << 4; -const int ZOO_PERM_ALL = 0x1f; -struct Id ZOO_ANYONE_ID_UNSAFE = {"world", "anyone"}; -struct Id ZOO_AUTH_IDS = {"auth", ""}; -static struct ACL _OPEN_ACL_UNSAFE_ACL[] = {{0x1f, {"world", "anyone"}}}; -static struct ACL _READ_ACL_UNSAFE_ACL[] = {{0x01, {"world", "anyone"}}}; -static struct ACL _CREATOR_ALL_ACL_ACL[] = {{0x1f, {"auth", ""}}}; -struct ACL_vector ZOO_OPEN_ACL_UNSAFE = { 1, _OPEN_ACL_UNSAFE_ACL}; -struct ACL_vector ZOO_READ_ACL_UNSAFE = { 1, _READ_ACL_UNSAFE_ACL}; -struct ACL_vector ZOO_CREATOR_ALL_ACL = { 1, _CREATOR_ALL_ACL_ACL}; - -#define COMPLETION_WATCH -1 -#define COMPLETION_VOID 0 -#define COMPLETION_STAT 1 -#define COMPLETION_DATA 2 -#define COMPLETION_STRINGLIST 3 -#define COMPLETION_STRINGLIST_STAT 4 -#define COMPLETION_ACLLIST 5 -#define COMPLETION_STRING 6 -#define COMPLETION_MULTI 7 - -typedef struct _auth_completion_list { - void_completion_t completion; - const char *auth_data; - struct _auth_completion_list *next; -} auth_completion_list_t; - -typedef struct completion { - int type; /* one of COMPLETION_* values above */ - union { - void_completion_t void_result; - stat_completion_t stat_result; - data_completion_t data_result; - strings_completion_t strings_result; - strings_stat_completion_t strings_stat_result; - acl_completion_t acl_result; - string_completion_t string_result; - struct watcher_object_list *watcher_result; - }; - completion_head_t clist; /* For multi-op */ -} completion_t; - -typedef struct _completion_list { - int xid; - completion_t c; - const void *data; - buffer_list_t *buffer; - struct _completion_list *next; - watcher_registration_t* watcher; -} completion_list_t; - -const char*err2string(int err); -static int queue_session_event(zhandle_t *zh, int state); -static const char* format_endpoint_info(const struct sockaddr_storage* ep); -static const char* format_current_endpoint_info(zhandle_t* zh); - -/* deserialize forward declarations */ -static void deserialize_response(int type, int xid, int failed, int rc, completion_list_t *cptr, struct iarchive *ia); -static int deserialize_multi(int xid, completion_list_t *cptr, struct iarchive *ia); - -/* completion routine forward declarations */ -static int add_completion(zhandle_t *zh, int xid, int completion_type, - const void *dc, const void *data, int add_to_front, - watcher_registration_t* wo, completion_head_t *clist); -static completion_list_t* create_completion_entry(int xid, int completion_type, - const void *dc, const void *data, watcher_registration_t* wo, - completion_head_t *clist); -static void destroy_completion_entry(completion_list_t* c); -static void queue_completion_nolock(completion_head_t *list, completion_list_t *c, - int add_to_front); -static void queue_completion(completion_head_t *list, completion_list_t *c, - int add_to_front); -static int handle_socket_error_msg(zhandle_t *zh, int line, int rc, - const char* format,...); -static void cleanup_bufs(zhandle_t *zh,int callCompletion,int rc); - -static int disable_conn_permute=0; // permute enabled by default - -static __attribute__((unused)) void print_completion_queue(zhandle_t *zh); - -static void *SYNCHRONOUS_MARKER = (void*)&SYNCHRONOUS_MARKER; -static int isValidPath(const char* path, const int flags); - -#ifdef _WINDOWS -static int zookeeper_send(SOCKET s, const char* buf, int len) -#else -static ssize_t zookeeper_send(int s, const void* buf, size_t len) -#endif -{ -#ifdef __linux__ - return send(s, buf, len, MSG_NOSIGNAL); -#else - return send(s, buf, len, 0); -#endif -} - -const void *zoo_get_context(zhandle_t *zh) -{ - return zh->context; -} - -void zoo_set_context(zhandle_t *zh, void *context) -{ - if (zh != NULL) { - zh->context = context; - } -} - -int zoo_recv_timeout(zhandle_t *zh) -{ - return zh->recv_timeout; -} - -/** these functions are thread unsafe, so make sure that - zoo_lock_auth is called before you access them **/ -static auth_info* get_last_auth(auth_list_head_t *auth_list) { - auth_info *element; - element = auth_list->auth; - if (element == NULL) { - return NULL; - } - while (element->next != NULL) { - element = element->next; - } - return element; -} - -static void free_auth_completion(auth_completion_list_t *a_list) { - auth_completion_list_t *tmp, *ftmp; - if (a_list == NULL) { - return; - } - tmp = a_list->next; - while (tmp != NULL) { - ftmp = tmp; - tmp = tmp->next; - ftmp->completion = NULL; - ftmp->auth_data = NULL; - free(ftmp); - } - a_list->completion = NULL; - a_list->auth_data = NULL; - a_list->next = NULL; - return; -} - -static void add_auth_completion(auth_completion_list_t* a_list, void_completion_t* completion, - const char *data) { - auth_completion_list_t *element; - auth_completion_list_t *n_element; - element = a_list; - if (a_list->completion == NULL) { - //this is the first element - a_list->completion = *completion; - a_list->next = NULL; - a_list->auth_data = data; - return; - } - while (element->next != NULL) { - element = element->next; - } - n_element = (auth_completion_list_t*) malloc(sizeof(auth_completion_list_t)); - n_element->next = NULL; - n_element->completion = *completion; - n_element->auth_data = data; - element->next = n_element; - return; -} - -static void get_auth_completions(auth_list_head_t *auth_list, auth_completion_list_t *a_list) { - auth_info *element; - element = auth_list->auth; - if (element == NULL) { - return; - } - while (element) { - if (element->completion) { - add_auth_completion(a_list, &element->completion, element->data); - } - element->completion = NULL; - element = element->next; - } - return; -} - -static void add_last_auth(auth_list_head_t *auth_list, auth_info *add_el) { - auth_info *element; - element = auth_list->auth; - if (element == NULL) { - //first element in the list - auth_list->auth = add_el; - return; - } - while (element->next != NULL) { - element = element->next; - } - element->next = add_el; - return; -} - -static void init_auth_info(auth_list_head_t *auth_list) -{ - auth_list->auth = NULL; -} - -static void mark_active_auth(zhandle_t *zh) { - auth_list_head_t auth_h = zh->auth_h; - auth_info *element; - if (auth_h.auth == NULL) { - return; - } - element = auth_h.auth; - while (element != NULL) { - element->state = 1; - element = element->next; - } -} - -static void free_auth_info(auth_list_head_t *auth_list) -{ - auth_info *auth = auth_list->auth; - while (auth != NULL) { - auth_info* old_auth = NULL; - if(auth->scheme!=NULL) - free(auth->scheme); - deallocate_Buffer(&auth->auth); - old_auth = auth; - auth = auth->next; - free(old_auth); - } - init_auth_info(auth_list); -} - -int is_unrecoverable(zhandle_t *zh) -{ - return (zh->state<0)? ZINVALIDSTATE: ZOK; -} - -zk_hashtable *exists_result_checker(zhandle_t *zh, int rc) -{ - if (rc == ZOK) { - return zh->active_node_watchers; - } else if (rc == ZNONODE) { - return zh->active_exist_watchers; - } - return 0; -} - -zk_hashtable *data_result_checker(zhandle_t *zh, int rc) -{ - return rc==ZOK ? zh->active_node_watchers : 0; -} - -zk_hashtable *child_result_checker(zhandle_t *zh, int rc) -{ - return rc==ZOK ? zh->active_child_watchers : 0; -} - -/** - * Frees and closes everything associated with a handle, - * including the handle itself. - */ -static void destroy(zhandle_t *zh) -{ - if (zh == NULL) { - return; - } - /* call any outstanding completions with a special error code */ - cleanup_bufs(zh,1,ZCLOSING); - if (zh->hostname != 0) { - free(zh->hostname); - zh->hostname = NULL; - } - if (zh->fd != -1) { - close(zh->fd); - zh->fd = -1; - zh->state = 0; - } - if (zh->addrs != 0) { - free(zh->addrs); - zh->addrs = NULL; - } - - if (zh->chroot != 0) { - free(zh->chroot); - zh->chroot = NULL; - } - - free_auth_info(&zh->auth_h); - destroy_zk_hashtable(zh->active_node_watchers); - destroy_zk_hashtable(zh->active_exist_watchers); - destroy_zk_hashtable(zh->active_child_watchers); -} - -static void setup_random() -{ -#ifndef WIN32 // TODO: better seed - int seed; - int fd = open("/dev/urandom", O_RDONLY); - if (fd == -1) { - seed = getpid(); - } else { - int rc = read(fd, &seed, sizeof(seed)); - assert(rc == sizeof(seed)); - close(fd); - } - srandom(seed); -#endif -} - -#ifndef __CYGWIN__ -/** - * get the errno from the return code - * of get addrinfo. Errno is not set - * with the call to getaddrinfo, so thats - * why we have to do this. - */ -static int getaddrinfo_errno(int rc) { - switch(rc) { - case EAI_NONAME: -// ZOOKEEPER-1323 EAI_NODATA and EAI_ADDRFAMILY are deprecated in FreeBSD. -#if defined EAI_NODATA && EAI_NODATA != EAI_NONAME - case EAI_NODATA: -#endif - return ENOENT; - case EAI_MEMORY: - return ENOMEM; - default: - return EINVAL; - } -} -#endif - -/** - * fill in the addrs array of the zookeeper servers in the zhandle. after filling - * them in, we will permute them for load balancing. - */ -int getaddrs(zhandle_t *zh) -{ - char *hosts = strdup(zh->hostname); - char *host; - char *strtok_last; - struct sockaddr_storage *addr; - int i; - int rc; - int alen = 0; /* the allocated length of the addrs array */ - - zh->addrs_count = 0; - if (zh->addrs) { - free(zh->addrs); - zh->addrs = 0; - } - if (!hosts) { - LOG_ERROR(("out of memory")); - errno=ENOMEM; - return ZSYSTEMERROR; - } - zh->addrs = 0; - host=strtok_r(hosts, ",", &strtok_last); - while(host) { - char *port_spec = strrchr(host, ':'); - char *end_port_spec; - int port; - if (!port_spec) { - LOG_ERROR(("no port in %s", host)); - errno=EINVAL; - rc=ZBADARGUMENTS; - goto fail; - } - *port_spec = '\0'; - port_spec++; - port = strtol(port_spec, &end_port_spec, 0); - if (!*port_spec || *end_port_spec || port == 0) { - LOG_ERROR(("invalid port in %s", host)); - errno=EINVAL; - rc=ZBADARGUMENTS; - goto fail; - } -#if defined(__CYGWIN__) - // sadly CYGWIN doesn't have getaddrinfo - // but happily gethostbyname is threadsafe in windows - { - struct hostent *he; - char **ptr; - struct sockaddr_in *addr4; - - he = gethostbyname(host); - if (!he) { - LOG_ERROR(("could not resolve %s", host)); - errno=ENOENT; - rc=ZBADARGUMENTS; - goto fail; - } - - /* Setup the address array */ - for(ptr = he->h_addr_list;*ptr != 0; ptr++) { - if (zh->addrs_count == alen) { - alen += 16; - zh->addrs = realloc(zh->addrs, sizeof(*zh->addrs)*alen); - if (zh->addrs == 0) { - LOG_ERROR(("out of memory")); - errno=ENOMEM; - rc=ZSYSTEMERROR; - goto fail; - } - } - addr = &zh->addrs[zh->addrs_count]; - addr4 = (struct sockaddr_in*)addr; - addr->ss_family = he->h_addrtype; - if (addr->ss_family == AF_INET) { - addr4->sin_port = htons(port); - memset(&addr4->sin_zero, 0, sizeof(addr4->sin_zero)); - memcpy(&addr4->sin_addr, *ptr, he->h_length); - zh->addrs_count++; - } -#if defined(AF_INET6) - else if (addr->ss_family == AF_INET6) { - struct sockaddr_in6 *addr6; - - addr6 = (struct sockaddr_in6*)addr; - addr6->sin6_port = htons(port); - addr6->sin6_scope_id = 0; - addr6->sin6_flowinfo = 0; - memcpy(&addr6->sin6_addr, *ptr, he->h_length); - zh->addrs_count++; - } -#endif - else { - LOG_WARN(("skipping unknown address family %x for %s", - addr->ss_family, zh->hostname)); - } - } - host = strtok_r(0, ",", &strtok_last); - } -#else - { - struct addrinfo hints, *res, *res0; - - memset(&hints, 0, sizeof(hints)); -#ifdef AI_ADDRCONFIG - hints.ai_flags = AI_ADDRCONFIG; -#else - hints.ai_flags = 0; -#endif - hints.ai_family = AF_UNSPEC; - hints.ai_socktype = SOCK_STREAM; - hints.ai_protocol = IPPROTO_TCP; - - while(isspace(*host) && host != strtok_last) - host++; - - if ((rc = getaddrinfo(host, port_spec, &hints, &res0)) != 0) { - //bug in getaddrinfo implementation when it returns - //EAI_BADFLAGS or EAI_ADDRFAMILY with AF_UNSPEC and - // ai_flags as AI_ADDRCONFIG -#ifdef AI_ADDRCONFIG - if ((hints.ai_flags == AI_ADDRCONFIG) && -// ZOOKEEPER-1323 EAI_NODATA and EAI_ADDRFAMILY are deprecated in FreeBSD. -#ifdef EAI_ADDRFAMILY - ((rc ==EAI_BADFLAGS) || (rc == EAI_ADDRFAMILY))) { -#else - (rc == EAI_BADFLAGS)) { -#endif - //reset ai_flags to null - hints.ai_flags = 0; - //retry getaddrinfo - rc = getaddrinfo(host, port_spec, &hints, &res0); - } -#endif - if (rc != 0) { - errno = getaddrinfo_errno(rc); -#ifdef WIN32 - LOG_ERROR(("Win32 message: %s\n", gai_strerror(rc))); -#else - LOG_ERROR(("getaddrinfo: %s\n", strerror(errno))); -#endif - rc=ZSYSTEMERROR; - goto fail; - } - } - - for (res = res0; res; res = res->ai_next) { - // Expand address list if needed - if (zh->addrs_count == alen) { - void *tmpaddr; - alen += 16; - tmpaddr = realloc(zh->addrs, sizeof(*zh->addrs)*alen); - if (tmpaddr == 0) { - LOG_ERROR(("out of memory")); - errno=ENOMEM; - rc=ZSYSTEMERROR; - goto fail; - } - zh->addrs=tmpaddr; - } - - // Copy addrinfo into address list - addr = &zh->addrs[zh->addrs_count]; - switch (res->ai_family) { - case AF_INET: -#if defined(AF_INET6) - case AF_INET6: -#endif - memcpy(addr, res->ai_addr, res->ai_addrlen); - ++zh->addrs_count; - break; - default: - LOG_WARN(("skipping unknown address family %x for %s", - res->ai_family, zh->hostname)); - break; - } - } - - freeaddrinfo(res0); - - host = strtok_r(0, ",", &strtok_last); - } -#endif - } - free(hosts); - - if(!disable_conn_permute){ - setup_random(); - /* Permute */ - for (i = zh->addrs_count - 1; i > 0; --i) { - long int j = random()%(i+1); - if (i != j) { - struct sockaddr_storage t = zh->addrs[i]; - zh->addrs[i] = zh->addrs[j]; - zh->addrs[j] = t; - } - } - } - return ZOK; -fail: - if (zh->addrs) { - free(zh->addrs); - zh->addrs=0; - } - if (hosts) { - free(hosts); - } - return rc; -} - -const clientid_t *zoo_client_id(zhandle_t *zh) -{ - return &zh->client_id; -} - -static void null_watcher_fn(zhandle_t* p1, int p2, int p3,const char* p4,void*p5){} - -watcher_fn zoo_set_watcher(zhandle_t *zh,watcher_fn newFn) -{ - watcher_fn oldWatcher=zh->watcher; - if (newFn) { - zh->watcher = newFn; - } else { - zh->watcher = null_watcher_fn; - } - return oldWatcher; -} - -struct sockaddr* zookeeper_get_connected_host(zhandle_t *zh, - struct sockaddr *addr, socklen_t *addr_len) -{ - if (zh->state!=ZOO_CONNECTED_STATE) { - return NULL; - } - if (getpeername(zh->fd, addr, addr_len)==-1) { - return NULL; - } - return addr; -} - -static void log_env() { - char buf[2048]; -#ifdef HAVE_SYS_UTSNAME_H - struct utsname utsname; -#endif - -#if defined(HAVE_GETUID) && defined(HAVE_GETPWUID_R) - struct passwd pw; - struct passwd *pwp = NULL; - uid_t uid = 0; -#endif - - LOG_INFO(("Client environment:zookeeper.version=%s", PACKAGE_STRING)); - -#ifdef HAVE_GETHOSTNAME - gethostname(buf, sizeof(buf)); - LOG_INFO(("Client environment:host.name=%s", buf)); -#else - LOG_INFO(("Client environment:host.name=")); -#endif - -#ifdef HAVE_SYS_UTSNAME_H - uname(&utsname); - LOG_INFO(("Client environment:os.name=%s", utsname.sysname)); - LOG_INFO(("Client environment:os.arch=%s", utsname.release)); - LOG_INFO(("Client environment:os.version=%s", utsname.version)); -#else - LOG_INFO(("Client environment:os.name=")); - LOG_INFO(("Client environment:os.arch=")); - LOG_INFO(("Client environment:os.version=")); -#endif - -#ifdef HAVE_GETLOGIN - LOG_INFO(("Client environment:user.name=%s", getlogin())); -#else - LOG_INFO(("Client environment:user.name=")); -#endif - -#if defined(HAVE_GETUID) && defined(HAVE_GETPWUID_R) - uid = getuid(); - if (!getpwuid_r(uid, &pw, buf, sizeof(buf), &pwp)) { - LOG_INFO(("Client environment:user.home=%s", pw.pw_dir)); - } else { - LOG_INFO(("Client environment:user.home=")); - } -#else - LOG_INFO(("Client environment:user.home=")); -#endif - -#ifdef HAVE_GETCWD - if (!getcwd(buf, sizeof(buf))) { - LOG_INFO(("Client environment:user.dir=")); - } else { - LOG_INFO(("Client environment:user.dir=%s", buf)); - } -#else - LOG_INFO(("Client environment:user.dir=")); -#endif -} - -/** - * Create a zookeeper handle associated with the given host and port. - */ -zhandle_t *zookeeper_init(const char *host, watcher_fn watcher, - int recv_timeout, const clientid_t *clientid, void *context, int flags) -{ - int errnosave = 0; - zhandle_t *zh = NULL; - char *index_chroot = NULL; - - log_env(); -#ifdef WIN32 - if (Win32WSAStartup()){ - LOG_ERROR(("Error initializing ws2_32.dll")); - return 0; - } -#endif - LOG_INFO(("Initiating client connection, host=%s sessionTimeout=%d watcher=%p" - " sessionId=%#llx sessionPasswd=%s context=%p flags=%d", - host, - recv_timeout, - watcher, - (clientid == 0 ? 0 : clientid->client_id), - ((clientid == 0) || (clientid->passwd[0] == 0) ? - "" : ""), - context, - flags)); - - zh = calloc(1, sizeof(*zh)); - if (!zh) { - return 0; - } - zh->fd = -1; - zh->state = NOTCONNECTED_STATE_DEF; - zh->context = context; - zh->recv_timeout = recv_timeout; - init_auth_info(&zh->auth_h); - if (watcher) { - zh->watcher = watcher; - } else { - zh->watcher = null_watcher_fn; - } - if (host == 0 || *host == 0) { // what we shouldn't dup - errno=EINVAL; - goto abort; - } - //parse the host to get the chroot if - //available - index_chroot = strchr(host, '/'); - if (index_chroot) { - zh->chroot = strdup(index_chroot); - if (zh->chroot == NULL) { - goto abort; - } - // if chroot is just / set it to null - if (strlen(zh->chroot) == 1) { - free(zh->chroot); - zh->chroot = NULL; - } - // cannot use strndup so allocate and strcpy - zh->hostname = (char *) malloc(index_chroot - host + 1); - zh->hostname = strncpy(zh->hostname, host, (index_chroot - host)); - //strncpy does not null terminate - *(zh->hostname + (index_chroot - host)) = '\0'; - - } else { - zh->chroot = NULL; - zh->hostname = strdup(host); - } - if (zh->chroot && !isValidPath(zh->chroot, 0)) { - errno = EINVAL; - goto abort; - } - if (zh->hostname == 0) { - goto abort; - } - if(getaddrs(zh)!=0) { - goto abort; - } - zh->connect_index = 0; - if (clientid) { - memcpy(&zh->client_id, clientid, sizeof(zh->client_id)); - } else { - memset(&zh->client_id, 0, sizeof(zh->client_id)); - } - zh->primer_buffer.buffer = zh->primer_storage_buffer; - zh->primer_buffer.curr_offset = 0; - zh->primer_buffer.len = sizeof(zh->primer_storage_buffer); - zh->primer_buffer.next = 0; - zh->last_zxid = 0; - zh->next_deadline.tv_sec=zh->next_deadline.tv_usec=0; - zh->socket_readable.tv_sec=zh->socket_readable.tv_usec=0; - zh->active_node_watchers=create_zk_hashtable(); - zh->active_exist_watchers=create_zk_hashtable(); - zh->active_child_watchers=create_zk_hashtable(); - - if (adaptor_init(zh) == -1) { - goto abort; - } - - return zh; -abort: - errnosave=errno; - destroy(zh); - free(zh); - errno=errnosave; - return 0; -} - -/** - * deallocated the free_path only its beeen allocated - * and not equal to path - */ -void free_duplicate_path(const char *free_path, const char* path) { - if (free_path != path) { - free((void*)free_path); - } -} - -/** - prepend the chroot path if available else return the path -*/ -static char* prepend_string(zhandle_t *zh, const char* client_path) { - char *ret_str; - if (zh == NULL || zh->chroot == NULL) - return (char *) client_path; - // handle the chroot itself, client_path = "/" - if (strlen(client_path) == 1) { - return strdup(zh->chroot); - } - ret_str = (char *) malloc(strlen(zh->chroot) + strlen(client_path) + 1); - strcpy(ret_str, zh->chroot); - return strcat(ret_str, client_path); -} - -/** - strip off the chroot string from the server path - if there is one else return the exact path - */ -char* sub_string(zhandle_t *zh, const char* server_path) { - char *ret_str; - if (zh->chroot == NULL) - return (char *) server_path; - //ZOOKEEPER-1027 - if (strncmp(server_path, zh->chroot, strlen(zh->chroot)) != 0) { - LOG_ERROR(("server path %s does not include chroot path %s", - server_path, zh->chroot)); - return (char *) server_path; - } - if (strlen(server_path) == strlen(zh->chroot)) { - //return "/" - ret_str = strdup("/"); - return ret_str; - } - ret_str = strdup(server_path + strlen(zh->chroot)); - return ret_str; -} - -static buffer_list_t *allocate_buffer(char *buff, int len) -{ - buffer_list_t *buffer = calloc(1, sizeof(*buffer)); - if (buffer == 0) - return 0; - - buffer->len = len==0?sizeof(*buffer):len; - buffer->curr_offset = 0; - buffer->buffer = buff; - buffer->next = 0; - return buffer; -} - -static void free_buffer(buffer_list_t *b) -{ - if (!b) { - return; - } - if (b->buffer) { - free(b->buffer); - } - free(b); -} - -static buffer_list_t *dequeue_buffer(buffer_head_t *list) -{ - buffer_list_t *b; - lock_buffer_list(list); - b = list->head; - if (b) { - list->head = b->next; - if (!list->head) { - assert(b == list->last); - list->last = 0; - } - } - unlock_buffer_list(list); - return b; -} - -static int remove_buffer(buffer_head_t *list) -{ - buffer_list_t *b = dequeue_buffer(list); - if (!b) { - return 0; - } - free_buffer(b); - return 1; -} - -static void queue_buffer(buffer_head_t *list, buffer_list_t *b, int add_to_front) -{ - b->next = 0; - lock_buffer_list(list); - if (list->head) { - assert(list->last); - // The list is not empty - if (add_to_front) { - b->next = list->head; - list->head = b; - } else { - list->last->next = b; - list->last = b; - } - }else{ - // The list is empty - assert(!list->head); - list->head = b; - list->last = b; - } - unlock_buffer_list(list); -} - -static int queue_buffer_bytes(buffer_head_t *list, char *buff, int len) -{ - buffer_list_t *b = allocate_buffer(buff,len); - if (!b) - return ZSYSTEMERROR; - queue_buffer(list, b, 0); - return ZOK; -} - -static int queue_front_buffer_bytes(buffer_head_t *list, char *buff, int len) -{ - buffer_list_t *b = allocate_buffer(buff,len); - if (!b) - return ZSYSTEMERROR; - queue_buffer(list, b, 1); - return ZOK; -} - -static __attribute__ ((unused)) int get_queue_len(buffer_head_t *list) -{ - int i; - buffer_list_t *ptr; - lock_buffer_list(list); - ptr = list->head; - for (i=0; ptr!=0; ptr=ptr->next, i++) - ; - unlock_buffer_list(list); - return i; -} -/* returns: - * -1 if send failed, - * 0 if send would block while sending the buffer (or a send was incomplete), - * 1 if success - */ -#ifdef WIN32 -static int send_buffer(SOCKET fd, buffer_list_t *buff) -#else -static int send_buffer(int fd, buffer_list_t *buff) -#endif -{ - int len = buff->len; - int off = buff->curr_offset; - int rc = -1; - - if (off < 4) { - /* we need to send the length at the beginning */ - int nlen = htonl(len); - char *b = (char*)&nlen; - rc = zookeeper_send(fd, b + off, sizeof(nlen) - off); - if (rc == -1) { -#ifndef _WINDOWS - if (errno != EAGAIN) { -#else - if (WSAGetLastError() != WSAEWOULDBLOCK) { -#endif - return -1; - } else { - return 0; - } - } else { - buff->curr_offset += rc; - } - off = buff->curr_offset; - } - if (off >= 4) { - /* want off to now represent the offset into the buffer */ - off -= sizeof(buff->len); - rc = zookeeper_send(fd, buff->buffer + off, len - off); - if (rc == -1) { -#ifndef _WINDOWS - if (errno != EAGAIN) { -#else - if (WSAGetLastError() != WSAEWOULDBLOCK) { -#endif - return -1; - } - } else { - buff->curr_offset += rc; - } - } - return buff->curr_offset == len + sizeof(buff->len); -} - -/* returns: - * -1 if recv call failed, - * 0 if recv would block, - * 1 if success - */ -#ifdef WIN32 -static int recv_buffer(SOCKET fd, buffer_list_t *buff) -#else -static int recv_buffer(int fd, buffer_list_t *buff) -#endif -{ - int off = buff->curr_offset; - int rc = 0; - //fprintf(LOGSTREAM, "rc = %d, off = %d, line %d\n", rc, off, __LINE__); - - /* if buffer is less than 4, we are reading in the length */ - if (off < 4) { - char *buffer = (char*)&(buff->len); - rc = recv(fd, buffer+off, sizeof(int)-off, 0); - //fprintf(LOGSTREAM, "rc = %d, off = %d, line %d\n", rc, off, __LINE__); - switch(rc) { - case 0: - errno = EHOSTDOWN; - case -1: -#ifndef _WINDOWS - if (errno == EAGAIN) { -#else - if (WSAGetLastError() == WSAEWOULDBLOCK) { -#endif - return 0; - } - return -1; - default: - buff->curr_offset += rc; - } - off = buff->curr_offset; - if (buff->curr_offset == sizeof(buff->len)) { - buff->len = ntohl(buff->len); - buff->buffer = calloc(1, buff->len); - } - } - if (buff->buffer) { - /* want off to now represent the offset into the buffer */ - off -= sizeof(buff->len); - - rc = recv(fd, buff->buffer+off, buff->len-off, 0); - switch(rc) { - case 0: - errno = EHOSTDOWN; - case -1: -#ifndef _WINDOWS - if (errno == EAGAIN) { -#else - if (WSAGetLastError() == WSAEWOULDBLOCK) { -#endif - break; - } - return -1; - default: - buff->curr_offset += rc; - } - } - return buff->curr_offset == buff->len + sizeof(buff->len); -} - -void free_buffers(buffer_head_t *list) -{ - while (remove_buffer(list)) - ; -} - -void free_completions(zhandle_t *zh,int callCompletion,int reason) -{ - completion_head_t tmp_list; - struct oarchive *oa; - struct ReplyHeader h; - void_completion_t auth_completion = NULL; - auth_completion_list_t a_list, *a_tmp; - - lock_completion_list(&zh->sent_requests); - tmp_list = zh->sent_requests; - zh->sent_requests.head = 0; - zh->sent_requests.last = 0; - unlock_completion_list(&zh->sent_requests); - while (tmp_list.head) { - completion_list_t *cptr = tmp_list.head; - - tmp_list.head = cptr->next; - if (cptr->c.data_result == SYNCHRONOUS_MARKER) { - struct sync_completion - *sc = (struct sync_completion*)cptr->data; - sc->rc = reason; - notify_sync_completion(sc); - zh->outstanding_sync--; - destroy_completion_entry(cptr); - } else if (callCompletion) { - if(cptr->xid == PING_XID){ - // Nothing to do with a ping response - destroy_completion_entry(cptr); - } else { - // Fake the response - buffer_list_t *bptr; - h.xid = cptr->xid; - h.zxid = -1; - h.err = reason; - oa = create_buffer_oarchive(); - serialize_ReplyHeader(oa, "header", &h); - bptr = calloc(sizeof(*bptr), 1); - assert(bptr); - bptr->len = get_buffer_len(oa); - bptr->buffer = get_buffer(oa); - close_buffer_oarchive(&oa, 0); - cptr->buffer = bptr; - queue_completion(&zh->completions_to_process, cptr, 0); - } - } - } - a_list.completion = NULL; - a_list.next = NULL; - zoo_lock_auth(zh); - get_auth_completions(&zh->auth_h, &a_list); - zoo_unlock_auth(zh); - a_tmp = &a_list; - // chain call user's completion function - while (a_tmp->completion != NULL) { - auth_completion = a_tmp->completion; - auth_completion(reason, a_tmp->auth_data); - a_tmp = a_tmp->next; - if (a_tmp == NULL) - break; - } - free_auth_completion(&a_list); -} - -static void cleanup_bufs(zhandle_t *zh,int callCompletion,int rc) -{ - enter_critical(zh); - free_buffers(&zh->to_send); - free_buffers(&zh->to_process); - free_completions(zh,callCompletion,rc); - leave_critical(zh); - if (zh->input_buffer && zh->input_buffer != &zh->primer_buffer) { - free_buffer(zh->input_buffer); - zh->input_buffer = 0; - } -} - -static void handle_error(zhandle_t *zh,int rc) -{ - close(zh->fd); - if (is_unrecoverable(zh)) { - LOG_DEBUG(("Calling a watcher for a ZOO_SESSION_EVENT and the state=%s", - state2String(zh->state))); - PROCESS_SESSION_EVENT(zh, zh->state); - } else if (zh->state == ZOO_CONNECTED_STATE) { - LOG_DEBUG(("Calling a watcher for a ZOO_SESSION_EVENT and the state=CONNECTING_STATE")); - PROCESS_SESSION_EVENT(zh, ZOO_CONNECTING_STATE); - } - cleanup_bufs(zh,1,rc); - zh->fd = -1; - zh->connect_index++; - if (!is_unrecoverable(zh)) { - zh->state = 0; - } - if (process_async(zh->outstanding_sync)) { - process_completions(zh); - } -} - -static int handle_socket_error_msg(zhandle_t *zh, int line, int rc, - const char* format, ...) -{ - if(logLevel>=ZOO_LOG_LEVEL_ERROR){ - va_list va; - char buf[1024]; - va_start(va,format); - vsnprintf(buf, sizeof(buf)-1,format,va); - log_message(ZOO_LOG_LEVEL_ERROR,line,__func__, - format_log_message("Socket [%s] zk retcode=%d, errno=%d(%s): %s", - format_current_endpoint_info(zh),rc,errno,strerror(errno),buf)); - va_end(va); - } - handle_error(zh,rc); - return rc; -} - -static void auth_completion_func(int rc, zhandle_t* zh) -{ - void_completion_t auth_completion = NULL; - auth_completion_list_t a_list; - auth_completion_list_t *a_tmp; - - if(zh==NULL) - return; - - zoo_lock_auth(zh); - - if(rc!=0){ - zh->state=ZOO_AUTH_FAILED_STATE; - }else{ - //change state for all auths - mark_active_auth(zh); - } - a_list.completion = NULL; - a_list.next = NULL; - get_auth_completions(&zh->auth_h, &a_list); - zoo_unlock_auth(zh); - if (rc) { - LOG_ERROR(("Authentication scheme %s failed. Connection closed.", - zh->auth_h.auth->scheme)); - } - else { - LOG_INFO(("Authentication scheme %s succeeded", zh->auth_h.auth->scheme)); - } - a_tmp = &a_list; - // chain call user's completion function - while (a_tmp->completion != NULL) { - auth_completion = a_tmp->completion; - auth_completion(rc, a_tmp->auth_data); - a_tmp = a_tmp->next; - if (a_tmp == NULL) - break; - } - free_auth_completion(&a_list); -} - -static int send_info_packet(zhandle_t *zh, auth_info* auth) { - struct oarchive *oa; - struct RequestHeader h = { STRUCT_INITIALIZER(xid , AUTH_XID), STRUCT_INITIALIZER(type , ZOO_SETAUTH_OP)}; - struct AuthPacket req; - int rc; - oa = create_buffer_oarchive(); - rc = serialize_RequestHeader(oa, "header", &h); - req.type=0; // ignored by the server - req.scheme = auth->scheme; - req.auth = auth->auth; - rc = rc < 0 ? rc : serialize_AuthPacket(oa, "req", &req); - /* add this buffer to the head of the send queue */ - rc = rc < 0 ? rc : queue_front_buffer_bytes(&zh->to_send, get_buffer(oa), - get_buffer_len(oa)); - /* We queued the buffer, so don't free it */ - close_buffer_oarchive(&oa, 0); - - return rc; -} - -/** send all auths, not just the last one **/ -static int send_auth_info(zhandle_t *zh) { - int rc = 0; - auth_info *auth = NULL; - - zoo_lock_auth(zh); - auth = zh->auth_h.auth; - if (auth == NULL) { - zoo_unlock_auth(zh); - return ZOK; - } - while (auth != NULL) { - rc = send_info_packet(zh, auth); - auth = auth->next; - } - zoo_unlock_auth(zh); - LOG_DEBUG(("Sending all auth info request to %s", format_current_endpoint_info(zh))); - return (rc <0) ? ZMARSHALLINGERROR:ZOK; -} - -static int send_last_auth_info(zhandle_t *zh) -{ - int rc = 0; - auth_info *auth = NULL; - - zoo_lock_auth(zh); - auth = get_last_auth(&zh->auth_h); - if(auth==NULL) { - zoo_unlock_auth(zh); - return ZOK; // there is nothing to send - } - rc = send_info_packet(zh, auth); - zoo_unlock_auth(zh); - LOG_DEBUG(("Sending auth info request to %s",format_current_endpoint_info(zh))); - return (rc < 0)?ZMARSHALLINGERROR:ZOK; -} - -static void free_key_list(char **list, int count) -{ - int i; - - for(i = 0; i < count; i++) { - free(list[i]); - } - free(list); -} - -static int send_set_watches(zhandle_t *zh) -{ - struct oarchive *oa; - struct RequestHeader h = { STRUCT_INITIALIZER(xid , SET_WATCHES_XID), STRUCT_INITIALIZER(type , ZOO_SETWATCHES_OP)}; - struct SetWatches req; - int rc; - - req.relativeZxid = zh->last_zxid; - req.dataWatches.data = collect_keys(zh->active_node_watchers, (int*)&req.dataWatches.count); - req.existWatches.data = collect_keys(zh->active_exist_watchers, (int*)&req.existWatches.count); - req.childWatches.data = collect_keys(zh->active_child_watchers, (int*)&req.childWatches.count); - - // return if there are no pending watches - if (!req.dataWatches.count && !req.existWatches.count && - !req.childWatches.count) { - free_key_list(req.dataWatches.data, req.dataWatches.count); - free_key_list(req.existWatches.data, req.existWatches.count); - free_key_list(req.childWatches.data, req.childWatches.count); - return ZOK; - } - - - oa = create_buffer_oarchive(); - rc = serialize_RequestHeader(oa, "header", &h); - rc = rc < 0 ? rc : serialize_SetWatches(oa, "req", &req); - /* add this buffer to the head of the send queue */ - rc = rc < 0 ? rc : queue_front_buffer_bytes(&zh->to_send, get_buffer(oa), - get_buffer_len(oa)); - /* We queued the buffer, so don't free it */ - close_buffer_oarchive(&oa, 0); - free_key_list(req.dataWatches.data, req.dataWatches.count); - free_key_list(req.existWatches.data, req.existWatches.count); - free_key_list(req.childWatches.data, req.childWatches.count); - LOG_DEBUG(("Sending set watches request to %s",format_current_endpoint_info(zh))); - return (rc < 0)?ZMARSHALLINGERROR:ZOK; -} - -static int serialize_prime_connect(struct connect_req *req, char* buffer){ - //this should be the order of serialization - int offset = 0; - req->protocolVersion = htonl(req->protocolVersion); - memcpy(buffer + offset, &req->protocolVersion, sizeof(req->protocolVersion)); - offset = offset + sizeof(req->protocolVersion); - - req->lastZxidSeen = htonll(req->lastZxidSeen); - memcpy(buffer + offset, &req->lastZxidSeen, sizeof(req->lastZxidSeen)); - offset = offset + sizeof(req->lastZxidSeen); - - req->timeOut = htonl(req->timeOut); - memcpy(buffer + offset, &req->timeOut, sizeof(req->timeOut)); - offset = offset + sizeof(req->timeOut); - - req->sessionId = htonll(req->sessionId); - memcpy(buffer + offset, &req->sessionId, sizeof(req->sessionId)); - offset = offset + sizeof(req->sessionId); - - req->passwd_len = htonl(req->passwd_len); - memcpy(buffer + offset, &req->passwd_len, sizeof(req->passwd_len)); - offset = offset + sizeof(req->passwd_len); - - memcpy(buffer + offset, req->passwd, sizeof(req->passwd)); - - return 0; -} - - static int deserialize_prime_response(struct prime_struct *req, char* buffer){ - //this should be the order of deserialization - int offset = 0; - memcpy(&req->len, buffer + offset, sizeof(req->len)); - offset = offset + sizeof(req->len); - - req->len = ntohl(req->len); - memcpy(&req->protocolVersion, buffer + offset, sizeof(req->protocolVersion)); - offset = offset + sizeof(req->protocolVersion); - - req->protocolVersion = ntohl(req->protocolVersion); - memcpy(&req->timeOut, buffer + offset, sizeof(req->timeOut)); - offset = offset + sizeof(req->timeOut); - - req->timeOut = ntohl(req->timeOut); - memcpy(&req->sessionId, buffer + offset, sizeof(req->sessionId)); - offset = offset + sizeof(req->sessionId); - - req->sessionId = htonll(req->sessionId); - memcpy(&req->passwd_len, buffer + offset, sizeof(req->passwd_len)); - offset = offset + sizeof(req->passwd_len); - - req->passwd_len = ntohl(req->passwd_len); - memcpy(req->passwd, buffer + offset, sizeof(req->passwd)); - return 0; - } - -static int prime_connection(zhandle_t *zh) -{ - int rc; - /*this is the size of buffer to serialize req into*/ - char buffer_req[HANDSHAKE_REQ_SIZE]; - int len = sizeof(buffer_req); - int hlen = 0; - struct connect_req req; - req.protocolVersion = 0; - req.sessionId = zh->client_id.client_id; - req.passwd_len = sizeof(req.passwd); - memcpy(req.passwd, zh->client_id.passwd, sizeof(zh->client_id.passwd)); - req.timeOut = zh->recv_timeout; - req.lastZxidSeen = zh->last_zxid; - hlen = htonl(len); - /* We are running fast and loose here, but this string should fit in the initial buffer! */ - rc=zookeeper_send(zh->fd, &hlen, sizeof(len)); - serialize_prime_connect(&req, buffer_req); - rc=rc<0 ? rc : zookeeper_send(zh->fd, buffer_req, len); - if (rc<0) { - return handle_socket_error_msg(zh, __LINE__, ZCONNECTIONLOSS, - "failed to send a handshake packet: %s", strerror(errno)); - } - zh->state = ZOO_ASSOCIATING_STATE; - - zh->input_buffer = &zh->primer_buffer; - /* This seems a bit weird to to set the offset to 4, but we already have a - * length, so we skip reading the length (and allocating the buffer) by - * saying that we are already at offset 4 */ - zh->input_buffer->curr_offset = 4; - - return ZOK; -} - -static inline int calculate_interval(const struct timeval *start, - const struct timeval *end) -{ - int interval; - struct timeval i = *end; - i.tv_sec -= start->tv_sec; - i.tv_usec -= start->tv_usec; - interval = i.tv_sec * 1000 + (i.tv_usec/1000); - return interval; -} - -static struct timeval get_timeval(int interval) -{ - struct timeval tv; - if (interval < 0) { - interval = 0; - } - tv.tv_sec = interval/1000; - tv.tv_usec = (interval%1000)*1000; - return tv; -} - - static int add_void_completion(zhandle_t *zh, int xid, void_completion_t dc, - const void *data); - static int add_string_completion(zhandle_t *zh, int xid, - string_completion_t dc, const void *data); - - int send_ping(zhandle_t* zh) - { - int rc; - struct oarchive *oa = create_buffer_oarchive(); - struct RequestHeader h = { STRUCT_INITIALIZER(xid ,PING_XID), STRUCT_INITIALIZER (type , ZOO_PING_OP) }; - - rc = serialize_RequestHeader(oa, "header", &h); - enter_critical(zh); - gettimeofday(&zh->last_ping, 0); - rc = rc < 0 ? rc : add_void_completion(zh, h.xid, 0, 0); - rc = rc < 0 ? rc : queue_buffer_bytes(&zh->to_send, get_buffer(oa), - get_buffer_len(oa)); - leave_critical(zh); - close_buffer_oarchive(&oa, 0); - return rc<0 ? rc : adaptor_send_queue(zh, 0); -} - -#ifdef WIN32 -int zookeeper_interest(zhandle_t *zh, SOCKET *fd, int *interest, - struct timeval *tv) -{ - - ULONG nonblocking_flag = 1; -#else -int zookeeper_interest(zhandle_t *zh, int *fd, int *interest, - struct timeval *tv) -{ -#endif - struct timeval now; - if(zh==0 || fd==0 ||interest==0 || tv==0) - return ZBADARGUMENTS; - if (is_unrecoverable(zh)) - return ZINVALIDSTATE; - gettimeofday(&now, 0); - if(zh->next_deadline.tv_sec!=0 || zh->next_deadline.tv_usec!=0){ - int time_left = calculate_interval(&zh->next_deadline, &now); - if (time_left > 10) - LOG_WARN(("Exceeded deadline by %dms", time_left)); - } - api_prolog(zh); - *fd = zh->fd; - *interest = 0; - tv->tv_sec = 0; - tv->tv_usec = 0; - if (*fd == -1) { - if (zh->connect_index == zh->addrs_count) { - /* Wait a bit before trying again so that we don't spin */ - zh->connect_index = 0; - }else { - int rc; -#ifdef WIN32 - char enable_tcp_nodelay = 1; -#else - int enable_tcp_nodelay = 1; -#endif - int ssoresult; - - zh->fd = socket(zh->addrs[zh->connect_index].ss_family, SOCK_STREAM, 0); - if (zh->fd < 0) { - return api_epilog(zh,handle_socket_error_msg(zh,__LINE__, - ZSYSTEMERROR, "socket() call failed")); - } - ssoresult = setsockopt(zh->fd, IPPROTO_TCP, TCP_NODELAY, &enable_tcp_nodelay, sizeof(enable_tcp_nodelay)); - if (ssoresult != 0) { - LOG_WARN(("Unable to set TCP_NODELAY, operation latency may be effected")); - } -#ifdef WIN32 - ioctlsocket(zh->fd, FIONBIO, &nonblocking_flag); -#else - fcntl(zh->fd, F_SETFL, O_NONBLOCK|fcntl(zh->fd, F_GETFL, 0)); -#endif -#if defined(AF_INET6) - if (zh->addrs[zh->connect_index].ss_family == AF_INET6) { - rc = connect(zh->fd, (struct sockaddr*) &zh->addrs[zh->connect_index], sizeof(struct sockaddr_in6)); - } else { -#else - LOG_DEBUG(("[zk] connect()\n")); - { -#endif - rc = connect(zh->fd, (struct sockaddr*) &zh->addrs[zh->connect_index], sizeof(struct sockaddr_in)); -#ifdef WIN32 - get_errno(); -#endif - } - if (rc == -1) { - /* we are handling the non-blocking connect according to - * the description in section 16.3 "Non-blocking connect" - * in UNIX Network Programming vol 1, 3rd edition */ - if (errno == EWOULDBLOCK || errno == EINPROGRESS) - zh->state = ZOO_CONNECTING_STATE; - else - return api_epilog(zh,handle_socket_error_msg(zh,__LINE__, - ZCONNECTIONLOSS,"connect() call failed")); - } else { - if((rc=prime_connection(zh))!=0) - return api_epilog(zh,rc); - - LOG_INFO(("Initiated connection to server [%s]", - format_endpoint_info(&zh->addrs[zh->connect_index]))); - } - } - *fd = zh->fd; - *tv = get_timeval(zh->recv_timeout/3); - zh->last_recv = now; - zh->last_send = now; - zh->last_ping = now; - } - if (zh->fd != -1) { - int idle_recv = calculate_interval(&zh->last_recv, &now); - int idle_send = calculate_interval(&zh->last_send, &now); - int recv_to = zh->recv_timeout*2/3 - idle_recv; - int send_to = zh->recv_timeout/3; - // have we exceeded the receive timeout threshold? - if (recv_to <= 0) { - // We gotta cut our losses and connect to someone else -#ifdef WIN32 - errno = WSAETIMEDOUT; -#else - errno = ETIMEDOUT; -#endif - *interest=0; - *tv = get_timeval(0); - return api_epilog(zh,handle_socket_error_msg(zh, - __LINE__,ZOPERATIONTIMEOUT, - "connection to %s timed out (exceeded timeout by %dms)", - format_endpoint_info(&zh->addrs[zh->connect_index]), - -recv_to)); - - } - // We only allow 1/3 of our timeout time to expire before sending - // a PING - if (zh->state==ZOO_CONNECTED_STATE) { - send_to = zh->recv_timeout/3 - idle_send; - if (send_to <= 0) { - if (zh->sent_requests.head==0) { -// LOG_DEBUG(("Sending PING to %s (exceeded idle by %dms)", -// format_current_endpoint_info(zh),-send_to)); - int rc=send_ping(zh); - if (rc < 0){ - LOG_ERROR(("failed to send PING request (zk retcode=%d)",rc)); - return api_epilog(zh,rc); - } - } - send_to = zh->recv_timeout/3; - } - } - // choose the lesser value as the timeout - *tv = get_timeval(recv_to < send_to? recv_to:send_to); - zh->next_deadline.tv_sec = now.tv_sec + tv->tv_sec; - zh->next_deadline.tv_usec = now.tv_usec + tv->tv_usec; - if (zh->next_deadline.tv_usec > 1000000) { - zh->next_deadline.tv_sec += zh->next_deadline.tv_usec / 1000000; - zh->next_deadline.tv_usec = zh->next_deadline.tv_usec % 1000000; - } - *interest = ZOOKEEPER_READ; - /* we are interested in a write if we are connected and have something - * to send, or we are waiting for a connect to finish. */ - if ((zh->to_send.head && (zh->state == ZOO_CONNECTED_STATE)) - || zh->state == ZOO_CONNECTING_STATE) { - *interest |= ZOOKEEPER_WRITE; - } - } - return api_epilog(zh,ZOK); -} - -static int check_events(zhandle_t *zh, int events) -{ - if (zh->fd == -1) - return ZINVALIDSTATE; - if ((events&ZOOKEEPER_WRITE)&&(zh->state == ZOO_CONNECTING_STATE)) { - int rc, error; - socklen_t len = sizeof(error); - rc = getsockopt(zh->fd, SOL_SOCKET, SO_ERROR, &error, &len); - /* the description in section 16.4 "Non-blocking connect" - * in UNIX Network Programming vol 1, 3rd edition, points out - * that sometimes the error is in errno and sometimes in error */ - if (rc < 0 || error) { - if (rc == 0) - errno = error; - return handle_socket_error_msg(zh, __LINE__,ZCONNECTIONLOSS, - "server refused to accept the client"); - } - if((rc=prime_connection(zh))!=0) - return rc; - LOG_INFO(("initiated connection to server [%s]", - format_endpoint_info(&zh->addrs[zh->connect_index]))); - return ZOK; - } - if (zh->to_send.head && (events&ZOOKEEPER_WRITE)) { - /* make the flush call non-blocking by specifying a 0 timeout */ - int rc=flush_send_queue(zh,0); - if (rc < 0) - return handle_socket_error_msg(zh,__LINE__,ZCONNECTIONLOSS, - "failed while flushing send queue"); - } - if (events&ZOOKEEPER_READ) { - int rc; - if (zh->input_buffer == 0) { - zh->input_buffer = allocate_buffer(0,0); - } - - rc = recv_buffer(zh->fd, zh->input_buffer); - if (rc < 0) { - return handle_socket_error_msg(zh, __LINE__,ZCONNECTIONLOSS, - "failed while receiving a server response"); - } - if (rc > 0) { - gettimeofday(&zh->last_recv, 0); - if (zh->input_buffer != &zh->primer_buffer) { - queue_buffer(&zh->to_process, zh->input_buffer, 0); - } else { - int64_t oldid,newid; - //deserialize - deserialize_prime_response(&zh->primer_storage, zh->primer_buffer.buffer); - /* We are processing the primer_buffer, so we need to finish - * the connection handshake */ - oldid = zh->client_id.client_id; - newid = zh->primer_storage.sessionId; - if (oldid != 0 && oldid != newid) { - zh->state = ZOO_EXPIRED_SESSION_STATE; - errno = ESTALE; - return handle_socket_error_msg(zh,__LINE__,ZSESSIONEXPIRED, - "sessionId=%#llx has expired.",oldid); - } else { - zh->recv_timeout = zh->primer_storage.timeOut; - zh->client_id.client_id = newid; - - memcpy(zh->client_id.passwd, &zh->primer_storage.passwd, - sizeof(zh->client_id.passwd)); - zh->state = ZOO_CONNECTED_STATE; - LOG_INFO(("session establishment complete on server [%s], sessionId=%#llx, negotiated timeout=%d", - format_endpoint_info(&zh->addrs[zh->connect_index]), - newid, zh->recv_timeout)); - /* we want the auth to be sent for, but since both call push to front - we need to call send_watch_set first */ - send_set_watches(zh); - /* send the authentication packet now */ - send_auth_info(zh); - LOG_DEBUG(("Calling a watcher for a ZOO_SESSION_EVENT and the state=ZOO_CONNECTED_STATE")); - zh->input_buffer = 0; // just in case the watcher calls zookeeper_process() again - PROCESS_SESSION_EVENT(zh, ZOO_CONNECTED_STATE); - } - } - zh->input_buffer = 0; - } else { - // zookeeper_process was called but there was nothing to read - // from the socket - return ZNOTHING; - } - } - return ZOK; -} - -void api_prolog(zhandle_t* zh) -{ - inc_ref_counter(zh,1); -} - -int api_epilog(zhandle_t *zh,int rc) -{ - if(inc_ref_counter(zh,-1)==0 && zh->close_requested!=0) - zookeeper_close(zh); - return rc; -} - -static __attribute__((unused)) void print_completion_queue(zhandle_t *zh) -{ - completion_list_t* cptr; - - if(logLevelsent_requests.head==0) { - fprintf(LOGSTREAM,"empty\n"); - return; - } - - cptr=zh->sent_requests.head; - while(cptr){ - fprintf(LOGSTREAM,"%d,",cptr->xid); - cptr=cptr->next; - } - fprintf(LOGSTREAM,"end\n"); -} - -//#ifdef THREADED -// IO thread queues session events to be processed by the completion thread -static int queue_session_event(zhandle_t *zh, int state) -{ - int rc; - struct WatcherEvent evt = { ZOO_SESSION_EVENT, state, "" }; - struct ReplyHeader hdr = { WATCHER_EVENT_XID, 0, 0 }; - struct oarchive *oa; - completion_list_t *cptr; - - if ((oa=create_buffer_oarchive())==NULL) { - LOG_ERROR(("out of memory")); - goto error; - } - rc = serialize_ReplyHeader(oa, "hdr", &hdr); - rc = rc<0?rc: serialize_WatcherEvent(oa, "event", &evt); - if(rc<0){ - close_buffer_oarchive(&oa, 1); - goto error; - } - cptr = create_completion_entry(WATCHER_EVENT_XID,-1,0,0,0,0); - cptr->buffer = allocate_buffer(get_buffer(oa), get_buffer_len(oa)); - cptr->buffer->curr_offset = get_buffer_len(oa); - if (!cptr->buffer) { - free(cptr); - close_buffer_oarchive(&oa, 1); - goto error; - } - /* We queued the buffer, so don't free it */ - close_buffer_oarchive(&oa, 0); - cptr->c.watcher_result = collectWatchers(zh, ZOO_SESSION_EVENT, ""); - queue_completion(&zh->completions_to_process, cptr, 0); - if (process_async(zh->outstanding_sync)) { - process_completions(zh); - } - return ZOK; -error: - errno=ENOMEM; - return ZSYSTEMERROR; -} -//#endif - -completion_list_t *dequeue_completion(completion_head_t *list) -{ - completion_list_t *cptr; - lock_completion_list(list); - cptr = list->head; - if (cptr) { - list->head = cptr->next; - if (!list->head) { - assert(list->last == cptr); - list->last = 0; - } - } - unlock_completion_list(list); - return cptr; -} - -static void process_sync_completion( - completion_list_t *cptr, - struct sync_completion *sc, - struct iarchive *ia, - zhandle_t *zh) -{ - LOG_DEBUG(("Processing sync_completion with type=%d xid=%#x rc=%d", - cptr->c.type, cptr->xid, sc->rc)); - - switch(cptr->c.type) { - case COMPLETION_DATA: - if (sc->rc==0) { - struct GetDataResponse res; - int len; - deserialize_GetDataResponse(ia, "reply", &res); - if (res.data.len <= sc->u.data.buff_len) { - len = res.data.len; - } else { - len = sc->u.data.buff_len; - } - sc->u.data.buff_len = len; - // check if len is negative - // just of NULL which is -1 int - if (len == -1) { - sc->u.data.buffer = NULL; - } else { - memcpy(sc->u.data.buffer, res.data.buff, len); - } - sc->u.data.stat = res.stat; - deallocate_GetDataResponse(&res); - } - break; - case COMPLETION_STAT: - if (sc->rc==0) { - struct SetDataResponse res; - deserialize_SetDataResponse(ia, "reply", &res); - sc->u.stat = res.stat; - deallocate_SetDataResponse(&res); - } - break; - case COMPLETION_STRINGLIST: - if (sc->rc==0) { - struct GetChildrenResponse res; - deserialize_GetChildrenResponse(ia, "reply", &res); - sc->u.strs2 = res.children; - /* We don't deallocate since we are passing it back */ - // deallocate_GetChildrenResponse(&res); - } - break; - case COMPLETION_STRINGLIST_STAT: - if (sc->rc==0) { - struct GetChildren2Response res; - deserialize_GetChildren2Response(ia, "reply", &res); - sc->u.strs_stat.strs2 = res.children; - sc->u.strs_stat.stat2 = res.stat; - /* We don't deallocate since we are passing it back */ - // deallocate_GetChildren2Response(&res); - } - break; - case COMPLETION_STRING: - if (sc->rc==0) { - struct CreateResponse res; - int len; - const char * client_path; - deserialize_CreateResponse(ia, "reply", &res); - //ZOOKEEPER-1027 - client_path = sub_string(zh, res.path); - len = strlen(client_path) + 1;if (len > sc->u.str.str_len) { - len = sc->u.str.str_len; - } - if (len > 0) { - memcpy(sc->u.str.str, client_path, len - 1); - sc->u.str.str[len - 1] = '\0'; - } - free_duplicate_path(client_path, res.path); - deallocate_CreateResponse(&res); - } - break; - case COMPLETION_ACLLIST: - if (sc->rc==0) { - struct GetACLResponse res; - deserialize_GetACLResponse(ia, "reply", &res); - sc->u.acl.acl = res.acl; - sc->u.acl.stat = res.stat; - /* We don't deallocate since we are passing it back */ - //deallocate_GetACLResponse(&res); - } - break; - case COMPLETION_VOID: - break; - case COMPLETION_MULTI: - sc->rc = deserialize_multi(cptr->xid, cptr, ia); - break; - default: - LOG_DEBUG(("Unsupported completion type=%d", cptr->c.type)); - break; - } -} - -static int deserialize_multi(int xid, completion_list_t *cptr, struct iarchive *ia) -{ - int rc = 0; - completion_head_t *clist = &cptr->c.clist; - struct MultiHeader mhdr = { STRUCT_INITIALIZER(type , 0), STRUCT_INITIALIZER(done , 0), STRUCT_INITIALIZER(err , 0) }; - assert(clist); - deserialize_MultiHeader(ia, "multiheader", &mhdr); - while (!mhdr.done) { - completion_list_t *entry = dequeue_completion(clist); - assert(entry); - - if (mhdr.type == -1) { - struct ErrorResponse er; - deserialize_ErrorResponse(ia, "error", &er); - mhdr.err = er.err ; - if (rc == 0 && er.err != 0 && er.err != ZRUNTIMEINCONSISTENCY) { - rc = er.err; - } - } - - deserialize_response(entry->c.type, xid, mhdr.type == -1, mhdr.err, entry, ia); - deserialize_MultiHeader(ia, "multiheader", &mhdr); - //While deserializing the response we must destroy completion entry for each operation in - //the zoo_multi transaction. Otherwise this results in memory leak when client invokes zoo_multi - //operation. - destroy_completion_entry(entry); - } - - return rc; -} - -static void deserialize_response(int type, int xid, int failed, int rc, completion_list_t *cptr, struct iarchive *ia) -{ - switch (type) { - case COMPLETION_DATA: - LOG_DEBUG(("Calling COMPLETION_DATA for xid=%#x failed=%d rc=%d", - cptr->xid, failed, rc)); - if (failed) { - cptr->c.data_result(rc, 0, 0, 0, cptr->data); - } else { - struct GetDataResponse res; - deserialize_GetDataResponse(ia, "reply", &res); - cptr->c.data_result(rc, res.data.buff, res.data.len, - &res.stat, cptr->data); - deallocate_GetDataResponse(&res); - } - break; - case COMPLETION_STAT: - LOG_DEBUG(("Calling COMPLETION_STAT for xid=%#x failed=%d rc=%d", - cptr->xid, failed, rc)); - if (failed) { - cptr->c.stat_result(rc, 0, cptr->data); - } else { - struct SetDataResponse res; - deserialize_SetDataResponse(ia, "reply", &res); - cptr->c.stat_result(rc, &res.stat, cptr->data); - deallocate_SetDataResponse(&res); - } - break; - case COMPLETION_STRINGLIST: - LOG_DEBUG(("Calling COMPLETION_STRINGLIST for xid=%#x failed=%d rc=%d", - cptr->xid, failed, rc)); - if (failed) { - cptr->c.strings_result(rc, 0, cptr->data); - } else { - struct GetChildrenResponse res; - deserialize_GetChildrenResponse(ia, "reply", &res); - cptr->c.strings_result(rc, &res.children, cptr->data); - deallocate_GetChildrenResponse(&res); - } - break; - case COMPLETION_STRINGLIST_STAT: - LOG_DEBUG(("Calling COMPLETION_STRINGLIST_STAT for xid=%#x failed=%d rc=%d", - cptr->xid, failed, rc)); - if (failed) { - cptr->c.strings_stat_result(rc, 0, 0, cptr->data); - } else { - struct GetChildren2Response res; - deserialize_GetChildren2Response(ia, "reply", &res); - cptr->c.strings_stat_result(rc, &res.children, &res.stat, cptr->data); - deallocate_GetChildren2Response(&res); - } - break; - case COMPLETION_STRING: - LOG_DEBUG(("Calling COMPLETION_STRING for xid=%#x failed=%d, rc=%d", - cptr->xid, failed, rc)); - if (failed) { - cptr->c.string_result(rc, 0, cptr->data); - } else { - struct CreateResponse res; - deserialize_CreateResponse(ia, "reply", &res); - cptr->c.string_result(rc, res.path, cptr->data); - deallocate_CreateResponse(&res); - } - break; - case COMPLETION_ACLLIST: - LOG_DEBUG(("Calling COMPLETION_ACLLIST for xid=%#x failed=%d rc=%d", - cptr->xid, failed, rc)); - if (failed) { - cptr->c.acl_result(rc, 0, 0, cptr->data); - } else { - struct GetACLResponse res; - deserialize_GetACLResponse(ia, "reply", &res); - cptr->c.acl_result(rc, &res.acl, &res.stat, cptr->data); - deallocate_GetACLResponse(&res); - } - break; - case COMPLETION_VOID: - LOG_DEBUG(("Calling COMPLETION_VOID for xid=%#x failed=%d rc=%d", - cptr->xid, failed, rc)); - if (xid == PING_XID) { - // We want to skip the ping - } else { - assert(cptr->c.void_result); - cptr->c.void_result(rc, cptr->data); - } - break; - case COMPLETION_MULTI: - LOG_DEBUG(("Calling COMPLETION_MULTI for xid=%#x failed=%d rc=%d", - cptr->xid, failed, rc)); - rc = deserialize_multi(xid, cptr, ia); - assert(cptr->c.void_result); - cptr->c.void_result(rc, cptr->data); - break; - default: - LOG_DEBUG(("Unsupported completion type=%d", cptr->c.type)); - } -} - - -/* handles async completion (both single- and multithreaded) */ -void process_completions(zhandle_t *zh) -{ - completion_list_t *cptr; - while ((cptr = dequeue_completion(&zh->completions_to_process)) != 0) { - struct ReplyHeader hdr; - buffer_list_t *bptr = cptr->buffer; - struct iarchive *ia = create_buffer_iarchive(bptr->buffer, - bptr->len); - deserialize_ReplyHeader(ia, "hdr", &hdr); - - if (hdr.xid == WATCHER_EVENT_XID) { - int type, state; - struct WatcherEvent evt; - deserialize_WatcherEvent(ia, "event", &evt); - /* We are doing a notification, so there is no pending request */ - type = evt.type; - state = evt.state; - /* This is a notification so there aren't any pending requests */ - LOG_DEBUG(("Calling a watcher for node [%s], type = %d event=%s", - (evt.path==NULL?"NULL":evt.path), cptr->c.type, - watcherEvent2String(type))); - deliverWatchers(zh,type,state,evt.path, &cptr->c.watcher_result); - deallocate_WatcherEvent(&evt); - } else { - deserialize_response(cptr->c.type, hdr.xid, hdr.err != 0, hdr.err, cptr, ia); - } - destroy_completion_entry(cptr); - close_buffer_iarchive(&ia); - } -} - -static void isSocketReadable(zhandle_t* zh) -{ -#ifndef WIN32 - struct pollfd fds; - fds.fd = zh->fd; - fds.events = POLLIN; - if (poll(&fds,1,0)<=0) { - // socket not readable -- no more responses to process - zh->socket_readable.tv_sec=zh->socket_readable.tv_usec=0; - } -#else - fd_set rfds; - struct timeval waittime = {0, 0}; - FD_ZERO(&rfds); - FD_SET( zh->fd , &rfds); - if (select(0, &rfds, NULL, NULL, &waittime) <= 0){ - // socket not readable -- no more responses to process - zh->socket_readable.tv_sec=zh->socket_readable.tv_usec=0; - } -#endif - else{ - gettimeofday(&zh->socket_readable,0); - } -} - -static void checkResponseLatency(zhandle_t* zh) -{ - int delay; - struct timeval now; - - if(zh->socket_readable.tv_sec==0) - return; - - gettimeofday(&now,0); - delay=calculate_interval(&zh->socket_readable, &now); - if(delay>20) - LOG_DEBUG(("The following server response has spent at least %dms sitting in the client socket recv buffer",delay)); - - zh->socket_readable.tv_sec=zh->socket_readable.tv_usec=0; -} - -int zookeeper_process(zhandle_t *zh, int events) -{ - buffer_list_t *bptr; - int rc; - - if (zh==NULL) - return ZBADARGUMENTS; - if (is_unrecoverable(zh)) - return ZINVALIDSTATE; - api_prolog(zh); - IF_DEBUG(checkResponseLatency(zh)); - rc = check_events(zh, events); - if (rc!=ZOK) - return api_epilog(zh, rc); - - IF_DEBUG(isSocketReadable(zh)); - - while (rc >= 0 && (bptr=dequeue_buffer(&zh->to_process))) { - struct ReplyHeader hdr; - struct iarchive *ia = create_buffer_iarchive( - bptr->buffer, bptr->curr_offset); - deserialize_ReplyHeader(ia, "hdr", &hdr); - if (hdr.zxid > 0) { - zh->last_zxid = hdr.zxid; - } else { - // fprintf(stderr, "Got %#x for %#x\n", hdr.zxid, hdr.xid); - } - - if (hdr.xid == WATCHER_EVENT_XID) { - struct WatcherEvent evt; - int type = 0; - char *path = NULL; - completion_list_t *c = NULL; - - LOG_DEBUG(("Processing WATCHER_EVENT")); - - deserialize_WatcherEvent(ia, "event", &evt); - type = evt.type; - path = evt.path; - /* We are doing a notification, so there is no pending request */ - c = create_completion_entry(WATCHER_EVENT_XID,-1,0,0,0,0); - c->buffer = bptr; - c->c.watcher_result = collectWatchers(zh, type, path); - - // We cannot free until now, otherwise path will become invalid - deallocate_WatcherEvent(&evt); - queue_completion(&zh->completions_to_process, c, 0); - } else if (hdr.xid == SET_WATCHES_XID) { - LOG_DEBUG(("Processing SET_WATCHES")); - free_buffer(bptr); - } else if (hdr.xid == AUTH_XID){ - LOG_DEBUG(("Processing AUTH_XID")); - - /* special handling for the AUTH response as it may come back - * out-of-band */ - auth_completion_func(hdr.err,zh); - free_buffer(bptr); - /* authentication completion may change the connection state to - * unrecoverable */ - if(is_unrecoverable(zh)){ - handle_error(zh, ZAUTHFAILED); - close_buffer_iarchive(&ia); - return api_epilog(zh, ZAUTHFAILED); - } - } else { - int rc = hdr.err; - /* Find the request corresponding to the response */ - completion_list_t *cptr = dequeue_completion(&zh->sent_requests); - - /* [ZOOKEEPER-804] Don't assert if zookeeper_close has been called. */ - if (zh->close_requested == 1 && cptr == NULL) { - LOG_DEBUG(("Completion queue has been cleared by zookeeper_close()")); - close_buffer_iarchive(&ia); - return api_epilog(zh,ZINVALIDSTATE); - } - assert(cptr); - /* The requests are going to come back in order */ - if (cptr->xid != hdr.xid) { - LOG_DEBUG(("Processing unexpected or out-of-order response!")); - - // received unexpected (or out-of-order) response - close_buffer_iarchive(&ia); - free_buffer(bptr); - // put the completion back on the queue (so it gets properly - // signaled and deallocated) and disconnect from the server - queue_completion(&zh->sent_requests,cptr,1); - return handle_socket_error_msg(zh, __LINE__,ZRUNTIMEINCONSISTENCY, - "unexpected server response: expected %#x, but received %#x", - hdr.xid,cptr->xid); - } - - activateWatcher(zh, cptr->watcher, rc); - - if (cptr->c.void_result != SYNCHRONOUS_MARKER) { - if(hdr.xid == PING_XID){ - int elapsed = 0; - struct timeval now; - gettimeofday(&now, 0); - elapsed = calculate_interval(&zh->last_ping, &now); - LOG_DEBUG(("Got ping response in %d ms", elapsed)); - - // Nothing to do with a ping response - free_buffer(bptr); - destroy_completion_entry(cptr); - } else { - LOG_DEBUG(("Queueing asynchronous response")); - - cptr->buffer = bptr; - queue_completion(&zh->completions_to_process, cptr, 0); - } - } else { - struct sync_completion - *sc = (struct sync_completion*)cptr->data; - sc->rc = rc; - - process_sync_completion(cptr, sc, ia, zh); - - notify_sync_completion(sc); - free_buffer(bptr); - zh->outstanding_sync--; - destroy_completion_entry(cptr); - } - } - - close_buffer_iarchive(&ia); - - } - if (process_async(zh->outstanding_sync)) { - process_completions(zh); - } - return api_epilog(zh,ZOK);} - -int zoo_state(zhandle_t *zh) -{ - if(zh!=0) - return zh->state; - return 0; -} - -static watcher_registration_t* create_watcher_registration(const char* path, - result_checker_fn checker,watcher_fn watcher,void* ctx){ - watcher_registration_t* wo; - if(watcher==0) - return 0; - wo=calloc(1,sizeof(watcher_registration_t)); - wo->path=strdup(path); - wo->watcher=watcher; - wo->context=ctx; - wo->checker=checker; - return wo; -} - -static void destroy_watcher_registration(watcher_registration_t* wo){ - if(wo!=0){ - free((void*)wo->path); - free(wo); - } -} - -static completion_list_t* create_completion_entry(int xid, int completion_type, - const void *dc, const void *data,watcher_registration_t* wo, completion_head_t *clist) -{ - completion_list_t *c = calloc(1,sizeof(completion_list_t)); - if (!c) { - LOG_ERROR(("out of memory")); - return 0; - } - c->c.type = completion_type; - c->data = data; - switch(c->c.type) { - case COMPLETION_VOID: - c->c.void_result = (void_completion_t)dc; - break; - case COMPLETION_STRING: - c->c.string_result = (string_completion_t)dc; - break; - case COMPLETION_DATA: - c->c.data_result = (data_completion_t)dc; - break; - case COMPLETION_STAT: - c->c.stat_result = (stat_completion_t)dc; - break; - case COMPLETION_STRINGLIST: - c->c.strings_result = (strings_completion_t)dc; - break; - case COMPLETION_STRINGLIST_STAT: - c->c.strings_stat_result = (strings_stat_completion_t)dc; - break; - case COMPLETION_ACLLIST: - c->c.acl_result = (acl_completion_t)dc; - break; - case COMPLETION_MULTI: - assert(clist); - c->c.void_result = (void_completion_t)dc; - c->c.clist = *clist; - break; - } - c->xid = xid; - c->watcher = wo; - - return c; -} - -static void destroy_completion_entry(completion_list_t* c){ - if(c!=0){ - destroy_watcher_registration(c->watcher); - if(c->buffer!=0) - free_buffer(c->buffer); - free(c); - } -} - -static void queue_completion_nolock(completion_head_t *list, - completion_list_t *c, - int add_to_front) -{ - c->next = 0; - /* appending a new entry to the back of the list */ - if (list->last) { - assert(list->head); - // List is not empty - if (!add_to_front) { - list->last->next = c; - list->last = c; - } else { - c->next = list->head; - list->head = c; - } - } else { - // List is empty - assert(!list->head); - list->head = c; - list->last = c; - } -} - -static void queue_completion(completion_head_t *list, completion_list_t *c, - int add_to_front) -{ - - lock_completion_list(list); - queue_completion_nolock(list, c, add_to_front); - unlock_completion_list(list); -} - -static int add_completion(zhandle_t *zh, int xid, int completion_type, - const void *dc, const void *data, int add_to_front, - watcher_registration_t* wo, completion_head_t *clist) -{ - completion_list_t *c =create_completion_entry(xid, completion_type, dc, - data, wo, clist); - int rc = 0; - if (!c) - return ZSYSTEMERROR; - lock_completion_list(&zh->sent_requests); - if (zh->close_requested != 1) { - queue_completion_nolock(&zh->sent_requests, c, add_to_front); - if (dc == SYNCHRONOUS_MARKER) { - zh->outstanding_sync++; - } - rc = ZOK; - } else { - free(c); - rc = ZINVALIDSTATE; - } - unlock_completion_list(&zh->sent_requests); - return rc; -} - -static int add_data_completion(zhandle_t *zh, int xid, data_completion_t dc, - const void *data,watcher_registration_t* wo) -{ - return add_completion(zh, xid, COMPLETION_DATA, dc, data, 0, wo, 0); -} - -static int add_stat_completion(zhandle_t *zh, int xid, stat_completion_t dc, - const void *data,watcher_registration_t* wo) -{ - return add_completion(zh, xid, COMPLETION_STAT, dc, data, 0, wo, 0); -} - -static int add_strings_completion(zhandle_t *zh, int xid, - strings_completion_t dc, const void *data,watcher_registration_t* wo) -{ - return add_completion(zh, xid, COMPLETION_STRINGLIST, dc, data, 0, wo, 0); -} - -static int add_strings_stat_completion(zhandle_t *zh, int xid, - strings_stat_completion_t dc, const void *data,watcher_registration_t* wo) -{ - return add_completion(zh, xid, COMPLETION_STRINGLIST_STAT, dc, data, 0, wo, 0); -} - -static int add_acl_completion(zhandle_t *zh, int xid, acl_completion_t dc, - const void *data) -{ - return add_completion(zh, xid, COMPLETION_ACLLIST, dc, data, 0, 0, 0); -} - -static int add_void_completion(zhandle_t *zh, int xid, void_completion_t dc, - const void *data) -{ - return add_completion(zh, xid, COMPLETION_VOID, dc, data, 0, 0, 0); -} - -static int add_string_completion(zhandle_t *zh, int xid, - string_completion_t dc, const void *data) -{ - return add_completion(zh, xid, COMPLETION_STRING, dc, data, 0, 0, 0); -} - -static int add_multi_completion(zhandle_t *zh, int xid, void_completion_t dc, - const void *data, completion_head_t *clist) -{ - return add_completion(zh, xid, COMPLETION_MULTI, dc, data, 0,0, clist); -} - -int zookeeper_close(zhandle_t *zh) -{ - int rc=ZOK; - if (zh==0) - return ZBADARGUMENTS; - - zh->close_requested=1; - if (inc_ref_counter(zh,1)>1) { - /* We have incremented the ref counter to prevent the - * completions from calling zookeeper_close before we have - * completed the adaptor_finish call below. */ - - /* Signal any syncronous completions before joining the threads */ - enter_critical(zh); - free_completions(zh,1,ZCLOSING); - leave_critical(zh); - - adaptor_finish(zh); - /* Now we can allow the handle to be cleaned up, if the completion - * threads finished during the adaptor_finish call. */ - api_epilog(zh, 0); - return ZOK; - } - /* No need to decrement the counter since we're just going to - * destroy the handle later. */ - if(zh->state==ZOO_CONNECTED_STATE){ - struct oarchive *oa; - struct RequestHeader h = { STRUCT_INITIALIZER (xid , get_xid()), STRUCT_INITIALIZER (type , ZOO_CLOSE_OP)}; - LOG_INFO(("Closing zookeeper sessionId=%#llx to [%s]\n", - zh->client_id.client_id,format_current_endpoint_info(zh))); - oa = create_buffer_oarchive(); - rc = serialize_RequestHeader(oa, "header", &h); - rc = rc < 0 ? rc : queue_buffer_bytes(&zh->to_send, get_buffer(oa), - get_buffer_len(oa)); - /* We queued the buffer, so don't free it */ - close_buffer_oarchive(&oa, 0); - if (rc < 0) { - rc = ZMARSHALLINGERROR; - goto finish; - } - - /* make sure the close request is sent; we set timeout to an arbitrary - * (but reasonable) number of milliseconds since we want the call to block*/ - rc=adaptor_send_queue(zh, 3000); - }else{ - LOG_INFO(("Freeing zookeeper resources for sessionId=%#llx\n", - zh->client_id.client_id)); - rc = ZOK; - } - -finish: - destroy(zh); - adaptor_destroy(zh); - free(zh); -#ifdef WIN32 - Win32WSACleanup(); -#endif - return rc; -} - -static int isValidPath(const char* path, const int flags) { - int len = 0; - char lastc = '/'; - char c; - int i = 0; - - if (path == 0) - return 0; - len = strlen(path); - if (len == 0) - return 0; - if (path[0] != '/') - return 0; - if (len == 1) // done checking - it's the root - return 1; - if (path[len - 1] == '/' && !(flags & ZOO_SEQUENCE)) - return 0; - - i = 1; - for (; i < len; lastc = path[i], i++) { - c = path[i]; - - if (c == 0) { - return 0; - } else if (c == '/' && lastc == '/') { - return 0; - } else if (c == '.' && lastc == '.') { - if (path[i-2] == '/' && (((i + 1 == len) && !(flags & ZOO_SEQUENCE)) - || path[i+1] == '/')) { - return 0; - } - } else if (c == '.') { - if ((path[i-1] == '/') && (((i + 1 == len) && !(flags & ZOO_SEQUENCE)) - || path[i+1] == '/')) { - return 0; - } - } else if (c > 0x00 && c < 0x1f) { - return 0; - } - } - - return 1; -} - -/*---------------------------------------------------------------------------* - * REQUEST INIT HELPERS - *---------------------------------------------------------------------------*/ -/* Common Request init helper functions to reduce code duplication */ -static int Request_path_init(zhandle_t *zh, int flags, - char **path_out, const char *path) -{ - assert(path_out); - - *path_out = prepend_string(zh, path); - if (zh == NULL || !isValidPath(*path_out, flags)) { - free_duplicate_path(*path_out, path); - return ZBADARGUMENTS; - } - if (is_unrecoverable(zh)) { - free_duplicate_path(*path_out, path); - return ZINVALIDSTATE; - } - - return ZOK; -} - -static int Request_path_watch_init(zhandle_t *zh, int flags, - char **path_out, const char *path, - int32_t *watch_out, uint32_t watch) -{ - int rc = Request_path_init(zh, flags, path_out, path); - if (rc != ZOK) { - return rc; - } - *watch_out = watch; - return ZOK; -} - -/*---------------------------------------------------------------------------* - * ASYNC API - *---------------------------------------------------------------------------*/ -int zoo_aget(zhandle_t *zh, const char *path, int watch, data_completion_t dc, - const void *data) -{ - return zoo_awget(zh,path,watch?zh->watcher:0,zh->context,dc,data); -} - -int zoo_awget(zhandle_t *zh, const char *path, - watcher_fn watcher, void* watcherCtx, - data_completion_t dc, const void *data) -{ - struct oarchive *oa; - char *server_path = prepend_string(zh, path); - struct RequestHeader h = { STRUCT_INITIALIZER (xid , get_xid()), STRUCT_INITIALIZER (type ,ZOO_GETDATA_OP)}; - struct GetDataRequest req = { (char*)server_path, watcher!=0 }; - int rc; - - if (zh==0 || !isValidPath(server_path, 0)) { - free_duplicate_path(server_path, path); - return ZBADARGUMENTS; - } - if (is_unrecoverable(zh)) { - free_duplicate_path(server_path, path); - return ZINVALIDSTATE; - } - oa=create_buffer_oarchive(); - rc = serialize_RequestHeader(oa, "header", &h); - rc = rc < 0 ? rc : serialize_GetDataRequest(oa, "req", &req); - enter_critical(zh); - rc = rc < 0 ? rc : add_data_completion(zh, h.xid, dc, data, - create_watcher_registration(server_path,data_result_checker,watcher,watcherCtx)); - rc = rc < 0 ? rc : queue_buffer_bytes(&zh->to_send, get_buffer(oa), - get_buffer_len(oa)); - leave_critical(zh); - free_duplicate_path(server_path, path); - /* We queued the buffer, so don't free it */ - close_buffer_oarchive(&oa, 0); - - LOG_DEBUG(("Sending request xid=%#x for path [%s] to %s",h.xid,path, - format_current_endpoint_info(zh))); - /* make a best (non-blocking) effort to send the requests asap */ - adaptor_send_queue(zh, 0); - return (rc < 0)?ZMARSHALLINGERROR:ZOK; -} - -static int SetDataRequest_init(zhandle_t *zh, struct SetDataRequest *req, - const char *path, const char *buffer, int buflen, int version) -{ - int rc; - assert(req); - rc = Request_path_init(zh, 0, &req->path, path); - if (rc != ZOK) { - return rc; - } - req->data.buff = (char*)buffer; - req->data.len = buflen; - req->version = version; - - return ZOK; -} - -int zoo_aset(zhandle_t *zh, const char *path, const char *buffer, int buflen, - int version, stat_completion_t dc, const void *data) -{ - struct oarchive *oa; - struct RequestHeader h = { STRUCT_INITIALIZER(xid , get_xid()), STRUCT_INITIALIZER (type , ZOO_SETDATA_OP)}; - struct SetDataRequest req; - int rc = SetDataRequest_init(zh, &req, path, buffer, buflen, version); - if (rc != ZOK) { - return rc; - } - oa = create_buffer_oarchive(); - rc = serialize_RequestHeader(oa, "header", &h); - rc = rc < 0 ? rc : serialize_SetDataRequest(oa, "req", &req); - enter_critical(zh); - rc = rc < 0 ? rc : add_stat_completion(zh, h.xid, dc, data,0); - rc = rc < 0 ? rc : queue_buffer_bytes(&zh->to_send, get_buffer(oa), - get_buffer_len(oa)); - leave_critical(zh); - free_duplicate_path(req.path, path); - /* We queued the buffer, so don't free it */ - close_buffer_oarchive(&oa, 0); - - LOG_DEBUG(("Sending request xid=%#x for path [%s] to %s",h.xid,path, - format_current_endpoint_info(zh))); - /* make a best (non-blocking) effort to send the requests asap */ - adaptor_send_queue(zh, 0); - return (rc < 0)?ZMARSHALLINGERROR:ZOK; -} - -static int CreateRequest_init(zhandle_t *zh, struct CreateRequest *req, - const char *path, const char *value, - int valuelen, const struct ACL_vector *acl_entries, int flags) -{ - int rc; - assert(req); - rc = Request_path_init(zh, flags, &req->path, path); - assert(req); - if (rc != ZOK) { - return rc; - } - req->flags = flags; - req->data.buff = (char*)value; - req->data.len = valuelen; - if (acl_entries == 0) { - req->acl.count = 0; - req->acl.data = 0; - } else { - req->acl = *acl_entries; - } - - return ZOK; -} - -int zoo_acreate(zhandle_t *zh, const char *path, const char *value, - int valuelen, const struct ACL_vector *acl_entries, int flags, - string_completion_t completion, const void *data) -{ - struct oarchive *oa; - struct RequestHeader h = { STRUCT_INITIALIZER (xid , get_xid()), STRUCT_INITIALIZER (type ,ZOO_CREATE_OP) }; - struct CreateRequest req; - - int rc = CreateRequest_init(zh, &req, - path, value, valuelen, acl_entries, flags); - if (rc != ZOK) { - return rc; - } - oa = create_buffer_oarchive(); - rc = serialize_RequestHeader(oa, "header", &h); - rc = rc < 0 ? rc : serialize_CreateRequest(oa, "req", &req); - enter_critical(zh); - rc = rc < 0 ? rc : add_string_completion(zh, h.xid, completion, data); - rc = rc < 0 ? rc : queue_buffer_bytes(&zh->to_send, get_buffer(oa), - get_buffer_len(oa)); - leave_critical(zh); - free_duplicate_path(req.path, path); - /* We queued the buffer, so don't free it */ - close_buffer_oarchive(&oa, 0); - - LOG_DEBUG(("Sending request xid=%#x for path [%s] to %s",h.xid,path, - format_current_endpoint_info(zh))); - /* make a best (non-blocking) effort to send the requests asap */ - adaptor_send_queue(zh, 0); - return (rc < 0)?ZMARSHALLINGERROR:ZOK; -} - -int DeleteRequest_init(zhandle_t *zh, struct DeleteRequest *req, - const char *path, int version) -{ - int rc = Request_path_init(zh, 0, &req->path, path); - if (rc != ZOK) { - return rc; - } - req->version = version; - return ZOK; -} - -int zoo_adelete(zhandle_t *zh, const char *path, int version, - void_completion_t completion, const void *data) -{ - struct oarchive *oa; - struct RequestHeader h = { STRUCT_INITIALIZER (xid , get_xid()), STRUCT_INITIALIZER (type , ZOO_DELETE_OP)}; - struct DeleteRequest req; - int rc = DeleteRequest_init(zh, &req, path, version); - if (rc != ZOK) { - return rc; - } - oa = create_buffer_oarchive(); - rc = serialize_RequestHeader(oa, "header", &h); - rc = rc < 0 ? rc : serialize_DeleteRequest(oa, "req", &req); - enter_critical(zh); - rc = rc < 0 ? rc : add_void_completion(zh, h.xid, completion, data); - rc = rc < 0 ? rc : queue_buffer_bytes(&zh->to_send, get_buffer(oa), - get_buffer_len(oa)); - leave_critical(zh); - free_duplicate_path(req.path, path); - /* We queued the buffer, so don't free it */ - close_buffer_oarchive(&oa, 0); - - LOG_DEBUG(("Sending request xid=%#x for path [%s] to %s",h.xid,path, - format_current_endpoint_info(zh))); - /* make a best (non-blocking) effort to send the requests asap */ - adaptor_send_queue(zh, 0); - return (rc < 0)?ZMARSHALLINGERROR:ZOK; -} - -int zoo_aexists(zhandle_t *zh, const char *path, int watch, - stat_completion_t sc, const void *data) -{ - return zoo_awexists(zh,path,watch?zh->watcher:0,zh->context,sc,data); -} - -int zoo_awexists(zhandle_t *zh, const char *path, - watcher_fn watcher, void* watcherCtx, - stat_completion_t completion, const void *data) -{ - struct oarchive *oa; - struct RequestHeader h = { STRUCT_INITIALIZER (xid ,get_xid()), STRUCT_INITIALIZER (type , ZOO_EXISTS_OP) }; - struct ExistsRequest req; - int rc = Request_path_watch_init(zh, 0, &req.path, path, - &req.watch, watcher != NULL); - if (rc != ZOK) { - return rc; - } - oa = create_buffer_oarchive(); - rc = serialize_RequestHeader(oa, "header", &h); - rc = rc < 0 ? rc : serialize_ExistsRequest(oa, "req", &req); - enter_critical(zh); - rc = rc < 0 ? rc : add_stat_completion(zh, h.xid, completion, data, - create_watcher_registration(req.path,exists_result_checker, - watcher,watcherCtx)); - rc = rc < 0 ? rc : queue_buffer_bytes(&zh->to_send, get_buffer(oa), - get_buffer_len(oa)); - leave_critical(zh); - free_duplicate_path(req.path, path); - /* We queued the buffer, so don't free it */ - close_buffer_oarchive(&oa, 0); - - LOG_DEBUG(("Sending request xid=%#x for path [%s] to %s",h.xid,path, - format_current_endpoint_info(zh))); - /* make a best (non-blocking) effort to send the requests asap */ - adaptor_send_queue(zh, 0); - return (rc < 0)?ZMARSHALLINGERROR:ZOK; -} - -static int zoo_awget_children_(zhandle_t *zh, const char *path, - watcher_fn watcher, void* watcherCtx, - strings_completion_t sc, - const void *data) -{ - struct oarchive *oa; - struct RequestHeader h = { STRUCT_INITIALIZER (xid , get_xid()), STRUCT_INITIALIZER (type , ZOO_GETCHILDREN_OP)}; - struct GetChildrenRequest req ; - int rc = Request_path_watch_init(zh, 0, &req.path, path, - &req.watch, watcher != NULL); - if (rc != ZOK) { - return rc; - } - oa = create_buffer_oarchive(); - rc = serialize_RequestHeader(oa, "header", &h); - rc = rc < 0 ? rc : serialize_GetChildrenRequest(oa, "req", &req); - enter_critical(zh); - rc = rc < 0 ? rc : add_strings_completion(zh, h.xid, sc, data, - create_watcher_registration(req.path,child_result_checker,watcher,watcherCtx)); - rc = rc < 0 ? rc : queue_buffer_bytes(&zh->to_send, get_buffer(oa), - get_buffer_len(oa)); - leave_critical(zh); - free_duplicate_path(req.path, path); - /* We queued the buffer, so don't free it */ - close_buffer_oarchive(&oa, 0); - - LOG_DEBUG(("Sending request xid=%#x for path [%s] to %s",h.xid,path, - format_current_endpoint_info(zh))); - /* make a best (non-blocking) effort to send the requests asap */ - adaptor_send_queue(zh, 0); - return (rc < 0)?ZMARSHALLINGERROR:ZOK; -} - -int zoo_aget_children(zhandle_t *zh, const char *path, int watch, - strings_completion_t dc, const void *data) -{ - return zoo_awget_children_(zh,path,watch?zh->watcher:0,zh->context,dc,data); -} - -int zoo_awget_children(zhandle_t *zh, const char *path, - watcher_fn watcher, void* watcherCtx, - strings_completion_t dc, - const void *data) -{ - return zoo_awget_children_(zh,path,watcher,watcherCtx,dc,data); -} - -static int zoo_awget_children2_(zhandle_t *zh, const char *path, - watcher_fn watcher, void* watcherCtx, - strings_stat_completion_t ssc, - const void *data) -{ - /* invariant: (sc == NULL) != (sc == NULL) */ - struct oarchive *oa; - struct RequestHeader h = { STRUCT_INITIALIZER( xid, get_xid()), STRUCT_INITIALIZER (type ,ZOO_GETCHILDREN2_OP)}; - struct GetChildren2Request req ; - int rc = Request_path_watch_init(zh, 0, &req.path, path, - &req.watch, watcher != NULL); - if (rc != ZOK) { - return rc; - } - oa = create_buffer_oarchive(); - rc = serialize_RequestHeader(oa, "header", &h); - rc = rc < 0 ? rc : serialize_GetChildren2Request(oa, "req", &req); - enter_critical(zh); - rc = rc < 0 ? rc : add_strings_stat_completion(zh, h.xid, ssc, data, - create_watcher_registration(req.path,child_result_checker,watcher,watcherCtx)); - rc = rc < 0 ? rc : queue_buffer_bytes(&zh->to_send, get_buffer(oa), - get_buffer_len(oa)); - leave_critical(zh); - free_duplicate_path(req.path, path); - /* We queued the buffer, so don't free it */ - close_buffer_oarchive(&oa, 0); - - LOG_DEBUG(("Sending request xid=%#x for path [%s] to %s",h.xid,path, - format_current_endpoint_info(zh))); - /* make a best (non-blocking) effort to send the requests asap */ - adaptor_send_queue(zh, 0); - return (rc < 0)?ZMARSHALLINGERROR:ZOK; -} - -int zoo_aget_children2(zhandle_t *zh, const char *path, int watch, - strings_stat_completion_t dc, const void *data) -{ - return zoo_awget_children2_(zh,path,watch?zh->watcher:0,zh->context,dc,data); -} - -int zoo_awget_children2(zhandle_t *zh, const char *path, - watcher_fn watcher, void* watcherCtx, - strings_stat_completion_t dc, - const void *data) -{ - return zoo_awget_children2_(zh,path,watcher,watcherCtx,dc,data); -} - -int zoo_async(zhandle_t *zh, const char *path, - string_completion_t completion, const void *data) -{ - struct oarchive *oa; - struct RequestHeader h = { STRUCT_INITIALIZER (xid , get_xid()), STRUCT_INITIALIZER (type , ZOO_SYNC_OP)}; - struct SyncRequest req; - int rc = Request_path_init(zh, 0, &req.path, path); - if (rc != ZOK) { - return rc; - } - oa = create_buffer_oarchive(); - rc = serialize_RequestHeader(oa, "header", &h); - rc = rc < 0 ? rc : serialize_SyncRequest(oa, "req", &req); - enter_critical(zh); - rc = rc < 0 ? rc : add_string_completion(zh, h.xid, completion, data); - rc = rc < 0 ? rc : queue_buffer_bytes(&zh->to_send, get_buffer(oa), - get_buffer_len(oa)); - leave_critical(zh); - free_duplicate_path(req.path, path); - /* We queued the buffer, so don't free it */ - close_buffer_oarchive(&oa, 0); - - LOG_DEBUG(("Sending request xid=%#x for path [%s] to %s",h.xid,path, - format_current_endpoint_info(zh))); - /* make a best (non-blocking) effort to send the requests asap */ - adaptor_send_queue(zh, 0); - return (rc < 0)?ZMARSHALLINGERROR:ZOK; -} - - -int zoo_aget_acl(zhandle_t *zh, const char *path, acl_completion_t completion, - const void *data) -{ - struct oarchive *oa; - struct RequestHeader h = { STRUCT_INITIALIZER (xid , get_xid()), STRUCT_INITIALIZER(type ,ZOO_GETACL_OP)}; - struct GetACLRequest req; - int rc = Request_path_init(zh, 0, &req.path, path) ; - if (rc != ZOK) { - return rc; - } - oa = create_buffer_oarchive(); - rc = serialize_RequestHeader(oa, "header", &h); - rc = rc < 0 ? rc : serialize_GetACLRequest(oa, "req", &req); - enter_critical(zh); - rc = rc < 0 ? rc : add_acl_completion(zh, h.xid, completion, data); - rc = rc < 0 ? rc : queue_buffer_bytes(&zh->to_send, get_buffer(oa), - get_buffer_len(oa)); - leave_critical(zh); - free_duplicate_path(req.path, path); - /* We queued the buffer, so don't free it */ - close_buffer_oarchive(&oa, 0); - - LOG_DEBUG(("Sending request xid=%#x for path [%s] to %s",h.xid,path, - format_current_endpoint_info(zh))); - /* make a best (non-blocking) effort to send the requests asap */ - adaptor_send_queue(zh, 0); - return (rc < 0)?ZMARSHALLINGERROR:ZOK; -} - -int zoo_aset_acl(zhandle_t *zh, const char *path, int version, - struct ACL_vector *acl, void_completion_t completion, const void *data) -{ - struct oarchive *oa; - struct RequestHeader h = { STRUCT_INITIALIZER(xid ,get_xid()), STRUCT_INITIALIZER (type , ZOO_SETACL_OP)}; - struct SetACLRequest req; - int rc = Request_path_init(zh, 0, &req.path, path); - if (rc != ZOK) { - return rc; - } - oa = create_buffer_oarchive(); - req.acl = *acl; - req.version = version; - rc = serialize_RequestHeader(oa, "header", &h); - rc = rc < 0 ? rc : serialize_SetACLRequest(oa, "req", &req); - enter_critical(zh); - rc = rc < 0 ? rc : add_void_completion(zh, h.xid, completion, data); - rc = rc < 0 ? rc : queue_buffer_bytes(&zh->to_send, get_buffer(oa), - get_buffer_len(oa)); - leave_critical(zh); - free_duplicate_path(req.path, path); - /* We queued the buffer, so don't free it */ - close_buffer_oarchive(&oa, 0); - - LOG_DEBUG(("Sending request xid=%#x for path [%s] to %s",h.xid,path, - format_current_endpoint_info(zh))); - /* make a best (non-blocking) effort to send the requests asap */ - adaptor_send_queue(zh, 0); - return (rc < 0)?ZMARSHALLINGERROR:ZOK; -} - -/* Completions for multi-op results */ -static void op_result_string_completion(int err, const char *value, const void *data) -{ - struct zoo_op_result *result = (struct zoo_op_result *)data; - assert(result); - result->err = err; - - if (result->value && value) { - int len = strlen(value) + 1; - if (len > result->valuelen) { - len = result->valuelen; - } - if (len > 0) { - memcpy(result->value, value, len - 1); - result->value[len - 1] = '\0'; - } - } else { - result->value = NULL; - } -} - -static void op_result_void_completion(int err, const void *data) -{ - struct zoo_op_result *result = (struct zoo_op_result *)data; - assert(result); - result->err = err; -} - -static void op_result_stat_completion(int err, const struct Stat *stat, const void *data) -{ - struct zoo_op_result *result = (struct zoo_op_result *)data; - assert(result); - result->err = err; - - if (result->stat && err == 0 && stat) { - *result->stat = *stat; - } else { - result->stat = NULL ; - } -} - -static int CheckVersionRequest_init(zhandle_t *zh, struct CheckVersionRequest *req, - const char *path, int version) -{ - int rc ; - assert(req); - rc = Request_path_init(zh, 0, &req->path, path); - if (rc != ZOK) { - return rc; - } - req->version = version; - - return ZOK; -} - -int zoo_amulti(zhandle_t *zh, int count, const zoo_op_t *ops, - zoo_op_result_t *results, void_completion_t completion, const void *data) -{ - struct RequestHeader h = { STRUCT_INITIALIZER(xid, get_xid()), STRUCT_INITIALIZER(type, ZOO_MULTI_OP) }; - struct MultiHeader mh = { STRUCT_INITIALIZER(type, -1), STRUCT_INITIALIZER(done, 1), STRUCT_INITIALIZER(err, -1) }; - struct oarchive *oa = create_buffer_oarchive(); - completion_head_t clist = { 0 }; - - int rc = serialize_RequestHeader(oa, "header", &h); - - int index = 0; - for (index=0; index < count; index++) { - const zoo_op_t *op = ops+index; - zoo_op_result_t *result = results+index; - completion_list_t *entry = NULL; - - struct MultiHeader mh = { STRUCT_INITIALIZER(type, op->type), STRUCT_INITIALIZER(done, 0), STRUCT_INITIALIZER(err, -1) }; - rc = rc < 0 ? rc : serialize_MultiHeader(oa, "multiheader", &mh); - - switch(op->type) { - case ZOO_CREATE_OP: { - struct CreateRequest req; - - rc = rc < 0 ? rc : CreateRequest_init(zh, &req, - op->create_op.path, op->create_op.data, - op->create_op.datalen, op->create_op.acl, - op->create_op.flags); - rc = rc < 0 ? rc : serialize_CreateRequest(oa, "req", &req); - result->value = op->create_op.buf; - result->valuelen = op->create_op.buflen; - - enter_critical(zh); - entry = create_completion_entry(h.xid, COMPLETION_STRING, op_result_string_completion, result, 0, 0); - leave_critical(zh); - free_duplicate_path(req.path, op->create_op.path); - break; - } - - case ZOO_DELETE_OP: { - struct DeleteRequest req; - rc = rc < 0 ? rc : DeleteRequest_init(zh, &req, op->delete_op.path, op->delete_op.version); - rc = rc < 0 ? rc : serialize_DeleteRequest(oa, "req", &req); - - enter_critical(zh); - entry = create_completion_entry(h.xid, COMPLETION_VOID, op_result_void_completion, result, 0, 0); - leave_critical(zh); - free_duplicate_path(req.path, op->delete_op.path); - break; - } - - case ZOO_SETDATA_OP: { - struct SetDataRequest req; - rc = rc < 0 ? rc : SetDataRequest_init(zh, &req, - op->set_op.path, op->set_op.data, - op->set_op.datalen, op->set_op.version); - rc = rc < 0 ? rc : serialize_SetDataRequest(oa, "req", &req); - result->stat = op->set_op.stat; - - enter_critical(zh); - entry = create_completion_entry(h.xid, COMPLETION_STAT, op_result_stat_completion, result, 0, 0); - leave_critical(zh); - free_duplicate_path(req.path, op->set_op.path); - break; - } - - case ZOO_CHECK_OP: { - struct CheckVersionRequest req; - rc = rc < 0 ? rc : CheckVersionRequest_init(zh, &req, - op->check_op.path, op->check_op.version); - rc = rc < 0 ? rc : serialize_CheckVersionRequest(oa, "req", &req); - - enter_critical(zh); - entry = create_completion_entry(h.xid, COMPLETION_VOID, op_result_void_completion, result, 0, 0); - leave_critical(zh); - free_duplicate_path(req.path, op->check_op.path); - break; - } - - default: - LOG_ERROR(("Unimplemented sub-op type=%d in multi-op", op->type)); - return ZUNIMPLEMENTED; - } - - queue_completion(&clist, entry, 0); - } - - rc = rc < 0 ? rc : serialize_MultiHeader(oa, "multiheader", &mh); - - /* BEGIN: CRTICIAL SECTION */ - enter_critical(zh); - rc = rc < 0 ? rc : add_multi_completion(zh, h.xid, completion, data, &clist); - rc = rc < 0 ? rc : queue_buffer_bytes(&zh->to_send, get_buffer(oa), - get_buffer_len(oa)); - leave_critical(zh); - - /* We queued the buffer, so don't free it */ - close_buffer_oarchive(&oa, 0); - - LOG_DEBUG(("Sending multi request xid=%#x with %d subrequests to %s", - h.xid, index, format_current_endpoint_info(zh))); - /* make a best (non-blocking) effort to send the requests asap */ - adaptor_send_queue(zh, 0); - - return (rc < 0) ? ZMARSHALLINGERROR : ZOK; -} - -void zoo_create_op_init(zoo_op_t *op, const char *path, const char *value, - int valuelen, const struct ACL_vector *acl, int flags, - char *path_buffer, int path_buffer_len) -{ - assert(op); - op->type = ZOO_CREATE_OP; - op->create_op.path = path; - op->create_op.data = value; - op->create_op.datalen = valuelen; - op->create_op.acl = acl; - op->create_op.flags = flags; - op->create_op.buf = path_buffer; - op->create_op.buflen = path_buffer_len; -} - -void zoo_delete_op_init(zoo_op_t *op, const char *path, int version) -{ - assert(op); - op->type = ZOO_DELETE_OP; - op->delete_op.path = path; - op->delete_op.version = version; -} - -void zoo_set_op_init(zoo_op_t *op, const char *path, const char *buffer, - int buflen, int version, struct Stat *stat) -{ - assert(op); - op->type = ZOO_SETDATA_OP; - op->set_op.path = path; - op->set_op.data = buffer; - op->set_op.datalen = buflen; - op->set_op.version = version; - op->set_op.stat = stat; -} - -void zoo_check_op_init(zoo_op_t *op, const char *path, int version) -{ - assert(op); - op->type = ZOO_CHECK_OP; - op->check_op.path = path; - op->check_op.version = version; -} - -int zoo_multi(zhandle_t *zh, int count, const zoo_op_t *ops, zoo_op_result_t *results) -{ - int rc; - - struct sync_completion *sc = alloc_sync_completion(); - if (!sc) { - return ZSYSTEMERROR; - } - - rc = zoo_amulti(zh, count, ops, results, SYNCHRONOUS_MARKER, sc); - if (rc == ZOK) { - wait_sync_completion(sc); - rc = sc->rc; - } - free_sync_completion(sc); - - return rc; -} - -/* specify timeout of 0 to make the function non-blocking */ -/* timeout is in milliseconds */ -int flush_send_queue(zhandle_t*zh, int timeout) -{ - int rc= ZOK; - struct timeval started; -#ifdef WIN32 - fd_set pollSet; - struct timeval wait; -#endif - gettimeofday(&started,0); - // we can't use dequeue_buffer() here because if (non-blocking) send_buffer() - // returns EWOULDBLOCK we'd have to put the buffer back on the queue. - // we use a recursive lock instead and only dequeue the buffer if a send was - // successful - lock_buffer_list(&zh->to_send); - while (zh->to_send.head != 0&& zh->state == ZOO_CONNECTED_STATE) { - if(timeout!=0){ - int elapsed; - struct timeval now; - gettimeofday(&now,0); - elapsed=calculate_interval(&started,&now); - if (elapsed>timeout) { - rc = ZOPERATIONTIMEOUT; - break; - } - -#ifdef WIN32 - wait = get_timeval(timeout-elapsed); - FD_ZERO(&pollSet); - FD_SET(zh->fd, &pollSet); - // Poll the socket - rc = select((int)(zh->fd)+1, NULL, &pollSet, NULL, &wait); -#else - struct pollfd fds; - fds.fd = zh->fd; - fds.events = POLLOUT; - fds.revents = 0; - rc = poll(&fds, 1, timeout-elapsed); -#endif - if (rc<=0) { - /* timed out or an error or POLLERR */ - rc = rc==0 ? ZOPERATIONTIMEOUT : ZSYSTEMERROR; - break; - } - } - - rc = send_buffer(zh->fd, zh->to_send.head); - if(rc==0 && timeout==0){ - /* send_buffer would block while sending this buffer */ - rc = ZOK; - break; - } - if (rc < 0) { - rc = ZCONNECTIONLOSS; - break; - } - // if the buffer has been sent successfully, remove it from the queue - if (rc > 0) - remove_buffer(&zh->to_send); - gettimeofday(&zh->last_send, 0); - rc = ZOK; - } - unlock_buffer_list(&zh->to_send); - return rc; -} - -const char* zerror(int c) -{ - switch (c){ - case ZOK: - return "ok"; - case ZSYSTEMERROR: - return "system error"; - case ZRUNTIMEINCONSISTENCY: - return "run time inconsistency"; - case ZDATAINCONSISTENCY: - return "data inconsistency"; - case ZCONNECTIONLOSS: - return "connection loss"; - case ZMARSHALLINGERROR: - return "marshalling error"; - case ZUNIMPLEMENTED: - return "unimplemented"; - case ZOPERATIONTIMEOUT: - return "operation timeout"; - case ZBADARGUMENTS: - return "bad arguments"; - case ZINVALIDSTATE: - return "invalid zhandle state"; - case ZAPIERROR: - return "api error"; - case ZNONODE: - return "no node"; - case ZNOAUTH: - return "not authenticated"; - case ZBADVERSION: - return "bad version"; - case ZNOCHILDRENFOREPHEMERALS: - return "no children for ephemerals"; - case ZNODEEXISTS: - return "node exists"; - case ZNOTEMPTY: - return "not empty"; - case ZSESSIONEXPIRED: - return "session expired"; - case ZINVALIDCALLBACK: - return "invalid callback"; - case ZINVALIDACL: - return "invalid acl"; - case ZAUTHFAILED: - return "authentication failed"; - case ZCLOSING: - return "zookeeper is closing"; - case ZNOTHING: - return "(not error) no server responses to process"; - case ZSESSIONMOVED: - return "session moved to another server, so operation is ignored"; - } - if (c > 0) { - return strerror(c); - } - return "unknown error"; -} - -int zoo_add_auth(zhandle_t *zh,const char* scheme,const char* cert, - int certLen,void_completion_t completion, const void *data) -{ - struct buffer auth; - auth_info *authinfo; - if(scheme==NULL || zh==NULL) - return ZBADARGUMENTS; - - if (is_unrecoverable(zh)) - return ZINVALIDSTATE; - - // [ZOOKEEPER-800] zoo_add_auth should return ZINVALIDSTATE if - // the connection is closed. - if (zoo_state(zh) == 0) { - return ZINVALIDSTATE; - } - - if(cert!=NULL && certLen!=0){ - auth.buff=calloc(1,certLen); - if(auth.buff==0) { - return ZSYSTEMERROR; - } - memcpy(auth.buff,cert,certLen); - auth.len=certLen; - } else { - auth.buff = 0; - auth.len = 0; - } - - zoo_lock_auth(zh); - authinfo = (auth_info*) malloc(sizeof(auth_info)); - authinfo->scheme=strdup(scheme); - authinfo->auth=auth; - authinfo->completion=completion; - authinfo->data=data; - authinfo->next = NULL; - add_last_auth(&zh->auth_h, authinfo); - zoo_unlock_auth(zh); - - if(zh->state == ZOO_CONNECTED_STATE || zh->state == ZOO_ASSOCIATING_STATE) - return send_last_auth_info(zh); - - return ZOK; -} - -static const char* format_endpoint_info(const struct sockaddr_storage* ep) -{ - static char buf[128]; - char addrstr[128]; - void *inaddr; -#ifdef WIN32 - char * addrstring; -#endif - int port; - if(ep==0) - return "null"; - -#if defined(AF_INET6) - if(ep->ss_family==AF_INET6){ - inaddr=&((struct sockaddr_in6*)ep)->sin6_addr; - port=((struct sockaddr_in6*)ep)->sin6_port; - } else { -#endif - inaddr=&((struct sockaddr_in*)ep)->sin_addr; - port=((struct sockaddr_in*)ep)->sin_port; -#if defined(AF_INET6) - } -#endif -#ifdef WIN32 - addrstring = inet_ntoa (*(struct in_addr*)inaddr); - sprintf(buf,"%s:%d",addrstring,ntohs(port)); -#else - inet_ntop(ep->ss_family,inaddr,addrstr,sizeof(addrstr)-1); - sprintf(buf,"%s:%d",addrstr,ntohs(port)); -#endif - return buf; -} - -static const char* format_current_endpoint_info(zhandle_t* zh) -{ - return format_endpoint_info(&zh->addrs[zh->connect_index]); -} - -void zoo_deterministic_conn_order(int yesOrNo) -{ - disable_conn_permute=yesOrNo; -} - -/*---------------------------------------------------------------------------* - * SYNC API - *---------------------------------------------------------------------------*/ -int zoo_create(zhandle_t *zh, const char *path, const char *value, - int valuelen, const struct ACL_vector *acl, int flags, - char *path_buffer, int path_buffer_len) -{ - struct sync_completion *sc = alloc_sync_completion(); - int rc; - if (!sc) { - return ZSYSTEMERROR; - } - sc->u.str.str = path_buffer; - sc->u.str.str_len = path_buffer_len; - rc=zoo_acreate(zh, path, value, valuelen, acl, flags, SYNCHRONOUS_MARKER, sc); - if(rc==ZOK){ - wait_sync_completion(sc); - rc = sc->rc; - } - free_sync_completion(sc); - return rc; -} - -int zoo_delete(zhandle_t *zh, const char *path, int version) -{ - struct sync_completion *sc = alloc_sync_completion(); - int rc; - if (!sc) { - return ZSYSTEMERROR; - } - rc=zoo_adelete(zh, path, version, SYNCHRONOUS_MARKER, sc); - if(rc==ZOK){ - wait_sync_completion(sc); - rc = sc->rc; - } - free_sync_completion(sc); - return rc; -} - -int zoo_exists(zhandle_t *zh, const char *path, int watch, struct Stat *stat) -{ - return zoo_wexists(zh,path,watch?zh->watcher:0,zh->context,stat); -} - -int zoo_wexists(zhandle_t *zh, const char *path, - watcher_fn watcher, void* watcherCtx, struct Stat *stat) -{ - struct sync_completion *sc = alloc_sync_completion(); - int rc; - if (!sc) { - return ZSYSTEMERROR; - } - rc=zoo_awexists(zh,path,watcher,watcherCtx,SYNCHRONOUS_MARKER, sc); - if(rc==ZOK){ - wait_sync_completion(sc); - rc = sc->rc; - if (rc == 0&& stat) { - *stat = sc->u.stat; - } - } - free_sync_completion(sc); - return rc; -} - -int zoo_get(zhandle_t *zh, const char *path, int watch, char *buffer, - int* buffer_len, struct Stat *stat) -{ - return zoo_wget(zh,path,watch?zh->watcher:0,zh->context, - buffer,buffer_len,stat); -} - -int zoo_wget(zhandle_t *zh, const char *path, - watcher_fn watcher, void* watcherCtx, - char *buffer, int* buffer_len, struct Stat *stat) -{ - struct sync_completion *sc; - int rc=0; - - if(buffer_len==NULL) - return ZBADARGUMENTS; - if((sc=alloc_sync_completion())==NULL) - return ZSYSTEMERROR; - - sc->u.data.buffer = buffer; - sc->u.data.buff_len = *buffer_len; - rc=zoo_awget(zh, path, watcher, watcherCtx, SYNCHRONOUS_MARKER, sc); - if(rc==ZOK){ - wait_sync_completion(sc); - rc = sc->rc; - if (rc == 0) { - if(stat) - *stat = sc->u.data.stat; - *buffer_len = sc->u.data.buff_len; - } - } - free_sync_completion(sc); - return rc; -} - -int zoo_set(zhandle_t *zh, const char *path, const char *buffer, int buflen, - int version) -{ - return zoo_set2(zh, path, buffer, buflen, version, 0); -} - -int zoo_set2(zhandle_t *zh, const char *path, const char *buffer, int buflen, - int version, struct Stat *stat) -{ - struct sync_completion *sc = alloc_sync_completion(); - int rc; - if (!sc) { - return ZSYSTEMERROR; - } - rc=zoo_aset(zh, path, buffer, buflen, version, SYNCHRONOUS_MARKER, sc); - if(rc==ZOK){ - wait_sync_completion(sc); - rc = sc->rc; - if (rc == 0 && stat) { - *stat = sc->u.stat; - } - } - free_sync_completion(sc); - return rc; -} - -static int zoo_wget_children_(zhandle_t *zh, const char *path, - watcher_fn watcher, void* watcherCtx, - struct String_vector *strings) -{ - struct sync_completion *sc = alloc_sync_completion(); - int rc; - if (!sc) { - return ZSYSTEMERROR; - } - rc= zoo_awget_children (zh, path, watcher, watcherCtx, SYNCHRONOUS_MARKER, sc); - if(rc==ZOK){ - wait_sync_completion(sc); - rc = sc->rc; - if (rc == 0) { - if (strings) { - *strings = sc->u.strs2; - } else { - deallocate_String_vector(&sc->u.strs2); - } - } - } - free_sync_completion(sc); - return rc; -} - -static int zoo_wget_children2_(zhandle_t *zh, const char *path, - watcher_fn watcher, void* watcherCtx, - struct String_vector *strings, struct Stat *stat) -{ - struct sync_completion *sc = alloc_sync_completion(); - int rc; - if (!sc) { - return ZSYSTEMERROR; - } - rc= zoo_awget_children2(zh, path, watcher, watcherCtx, SYNCHRONOUS_MARKER, sc); - - if(rc==ZOK){ - wait_sync_completion(sc); - rc = sc->rc; - if (rc == 0) { - *stat = sc->u.strs_stat.stat2; - if (strings) { - *strings = sc->u.strs_stat.strs2; - } else { - deallocate_String_vector(&sc->u.strs_stat.strs2); - } - } - } - free_sync_completion(sc); - return rc; -} - -int zoo_get_children(zhandle_t *zh, const char *path, int watch, - struct String_vector *strings) -{ - return zoo_wget_children_(zh,path,watch?zh->watcher:0,zh->context,strings); -} - -int zoo_wget_children(zhandle_t *zh, const char *path, - watcher_fn watcher, void* watcherCtx, - struct String_vector *strings) -{ - return zoo_wget_children_(zh,path,watcher,watcherCtx,strings); -} - -int zoo_get_children2(zhandle_t *zh, const char *path, int watch, - struct String_vector *strings, struct Stat *stat) -{ - return zoo_wget_children2_(zh,path,watch?zh->watcher:0,zh->context,strings,stat); -} - -int zoo_wget_children2(zhandle_t *zh, const char *path, - watcher_fn watcher, void* watcherCtx, - struct String_vector *strings, struct Stat *stat) -{ - return zoo_wget_children2_(zh,path,watcher,watcherCtx,strings,stat); -} - -int zoo_get_acl(zhandle_t *zh, const char *path, struct ACL_vector *acl, - struct Stat *stat) -{ - struct sync_completion *sc = alloc_sync_completion(); - int rc; - if (!sc) { - return ZSYSTEMERROR; - } - rc=zoo_aget_acl(zh, path, SYNCHRONOUS_MARKER, sc); - if(rc==ZOK){ - wait_sync_completion(sc); - rc = sc->rc; - if (rc == 0&& stat) { - *stat = sc->u.acl.stat; - } - if (rc == 0) { - if (acl) { - *acl = sc->u.acl.acl; - } else { - deallocate_ACL_vector(&sc->u.acl.acl); - } - } - } - free_sync_completion(sc); - return rc; -} - -int zoo_set_acl(zhandle_t *zh, const char *path, int version, - const struct ACL_vector *acl) -{ - struct sync_completion *sc = alloc_sync_completion(); - int rc; - if (!sc) { - return ZSYSTEMERROR; - } - rc=zoo_aset_acl(zh, path, version, (struct ACL_vector*)acl, - SYNCHRONOUS_MARKER, sc); - if(rc==ZOK){ - wait_sync_completion(sc); - rc = sc->rc; - } - free_sync_completion(sc); - return rc; -} diff --git a/pkg/registry/zookeeper-3.4.6/src/c/tests/CollectionUtil.h b/pkg/registry/zookeeper-3.4.6/src/c/tests/CollectionUtil.h deleted file mode 100644 index dd3481175..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/c/tests/CollectionUtil.h +++ /dev/null @@ -1,195 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you 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. - */ -#ifndef _COLLECTION_UTIL_H_ -#define _COLLECTION_UTIL_H_ - -/** - * \file - * CollectionBuilder and DictionaryBuilder classes and collection utility functions - */ - -namespace Util -{ - -// ********************************************************* -/** A shortcut to use for building collections. - * This class is a wrapper around standard STL collection containers such as vector. - * It allows one to conveniently build collections at the variable initialization time: - * \code - * #include "CollectionUtil.h" - * #include "Vector.h" // for ostream << operator overload for STL vector - * using Util; - * - * int main() - * { - * typedef vector MyVector; - * MyVector myVector=CollectionBuilder()("str1")("str2")("str3"); - * cout< -class CollectionBuilder -{ -public: - /// Type of the collection container. - typedef CONT CollectionType; - /// Container's value type. - typedef typename CollectionType::value_type value_type; - /// Container's constant iterator type. - typedef typename CollectionType::const_iterator const_iterator; - /// Container's size type. - typedef typename CollectionType::size_type size_type; - - /** Operator function call overload to allow call chaining. - * \param value the value to be inserted into the container - */ - CollectionBuilder& operator()(const value_type& value){ - return push_back(value); - } - /** Same as regular STL push_back() but allows call chaining. - * \param value the value to be inserted into the container - */ - CollectionBuilder& push_back(const value_type& value){ - collection_.push_back(value); - return *this; - } - /// \name Standard STL container interface - /// @{ - const_iterator begin() const{return collection_.begin();} - const_iterator end() const{return collection_.end();} - size_type size() const{return collection_.size();} - void clear() {collection_.clear();} - ///@} - /// Explicit typecast operator. - operator const CollectionType&() const {return collection_;} -private: - /// \cond PRIVATE - CollectionType collection_; - /// \endcond -}; - - -// ********************************************************* -/** A shortcut to use for building dictionaries. - * This class is a wrapper around standard STL associative containers such as map. - * It allows one to conveniently build dictionaries at the variable initialization time: - * \code - * #include "CollectionUtil.h" - * #include "Map.h" // for ostream << operator overload for STL map - * using Util; - * - * int main() - * { - * typedef map MyMap; - * MyMap myMap=DictionaryBuilder()("str1",1)("str2",2)("str3",3); - * cout< -class DictionaryBuilder -{ -public: - /// The type of the associative container - typedef CONT DictionaryType; - /// Container's element type (usually a pair) - typedef typename DictionaryType::value_type value_type; - /// Container's key type - typedef typename DictionaryType::key_type key_type; - /// Container's value type - typedef typename DictionaryType::mapped_type mapped_type; - /// Container's constant iterator type - typedef typename DictionaryType::const_iterator const_iterator; - /// Container's writable iterator type - typedef typename DictionaryType::iterator iterator; - /// Container's size type - typedef typename DictionaryType::size_type size_type; - - /** Operator function call overload to allow call chaining. - * \param key the value key to be inserted - * \param value the value to be inserted into the container - * \return a non-const reference to self - */ - DictionaryBuilder& operator()(const key_type& key,const mapped_type& value){ - dict_.insert(value_type(key,value)); - return *this; - } - /** Lookup value by key. - * \param key the key associated with the value. - * \return a non-const iterator pointing to the element whose key matched the \a key parameter - */ - iterator find(const key_type& key){ - return dict_.find(key); - } - /** Lookup value by key. - * \param key the key associated with the value. - * \return a const iterator pointing to the element whose key matched the \a key parameter - */ - const_iterator find(const key_type& key) const{ - return dict_.find(key); - } - - /// \name Standard STL container interface - /// @{ - const_iterator begin() const{return dict_.begin();} - const_iterator end() const{return dict_.end();} - size_type size() const{return dict_.size();} - void clear() {dict_.clear();} - ///@} - /// Explicit typecast operator. - operator const DictionaryType&() const {return dict_;} -private: - DictionaryType dict_; -}; - - -// *********************************************************** -/** Deletes all dynamically allocated elements of a collection. - * C::value_type is expected to be a pointer to a dynamically allocated object, or it won't compile. - * The function will iterate over all container elements and call delete for each of them. - * \param c a collection (vector,set) whose elements are being deleted. - */ -template -void clearCollection(C& c){ - for(typename C::const_iterator it=c.begin();it!=c.end();++it) - delete *it; - c.clear(); -} - -/** Deletes all dynamically allocated values of the assotiative container. - * The function expects the M::value_type to be a pair<..., ptr_to_type>, or it won't compile. - * It first deletes the objects pointed to by ptr_to_type - * and then clears (calls m.clear()) the container. - * \param m an associative container (map,hash_map) whose elements are being deleted. - */ -template -void clearMap(M& m){ - for(typename M::const_iterator it=m.begin();it!=m.end();++it) - delete it->second; - m.clear(); -} - -} // namespace Util - - -#endif // _COLLECTION_UTIL_H_ diff --git a/pkg/registry/zookeeper-3.4.6/src/c/tests/CppAssertHelper.h b/pkg/registry/zookeeper-3.4.6/src/c/tests/CppAssertHelper.h deleted file mode 100644 index 3926f51ef..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/c/tests/CppAssertHelper.h +++ /dev/null @@ -1,37 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you 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. - */ - -#ifndef CPPASSERTHELPER_H_ -#define CPPASSERTHELPER_H_ - -#include - -// make it possible to specify location of the ASSERT call -#define CPPUNIT_ASSERT_EQUAL_LOC(expected,actual,file,line) \ - ( CPPUNIT_NS::assertEquals( (expected), \ - (actual), \ - CPPUNIT_NS::SourceLine(file,line), \ - "" ) ) - -#define CPPUNIT_ASSERT_EQUAL_MESSAGE_LOC(message,expected,actual,file,line) \ - ( CPPUNIT_NS::assertEquals( (expected), \ - (actual), \ - CPPUNIT_NS::SourceLine(file,line), \ - (message) ) ) - -#endif /*CPPASSERTHELPER_H_*/ diff --git a/pkg/registry/zookeeper-3.4.6/src/c/tests/LibCMocks.cc b/pkg/registry/zookeeper-3.4.6/src/c/tests/LibCMocks.cc deleted file mode 100644 index 44ab0a9ad..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/c/tests/LibCMocks.cc +++ /dev/null @@ -1,333 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you 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. - */ - -#include -#include -#include -#include - -#include "Util.h" -#include "LibCMocks.h" - -#undef USING_DUMA - -using namespace std; - -// ***************************************************************************** -// gethostbyname - -struct hostent* gethostbyname(const char *name) { - if(!Mock_gethostbyname::mock_) - return LIBC_SYMBOLS.gethostbyname(name); - return Mock_gethostbyname::mock_->call(name); -} - -Mock_gethostbyname* Mock_gethostbyname::mock_=0; - -Mock_gethostbyname::~Mock_gethostbyname(){ - mock_=0; - for(unsigned int i=0;icall(p1,p2); -} -#endif - -void* Mock_calloc::call(size_t p1, size_t p2){ -#ifndef USING_DUMA - if(counter++ ==callsBeforeFailure){ - counter=0; - errno=errnoOnFailure; - return 0; - } - return CALL_REAL(calloc,(p1,p2)); -#else - return 0; -#endif -} - -Mock_calloc* Mock_calloc::mock_=0; - -// ***************************************************************************** -// realloc - -#ifndef USING_DUMA -void* realloc(void* p, size_t s){ - if(!Mock_realloc::mock_) - return LIBC_SYMBOLS.realloc(p,s); - return Mock_realloc::mock_->call(p,s); -} -#endif - -Mock_realloc* Mock_realloc::mock_=0; - -void* Mock_realloc::call(void* p, size_t s){ - if(counter++ ==callsBeforeFailure){ - counter=0; - errno=errnoOnFailure; - return 0; - } - return LIBC_SYMBOLS.realloc(p,s); -} - -// ***************************************************************************** -// random -RANDOM_RET_TYPE random(){ - if(!Mock_random::mock_) - return LIBC_SYMBOLS.random(); - return Mock_random::mock_->call(); -} - -void srandom(unsigned long seed){ - if (!Mock_random::mock_) - LIBC_SYMBOLS.srandom(seed); - else - Mock_random::mock_->setSeed(seed); -} - -Mock_random* Mock_random::mock_=0; - -int Mock_random::call(){ - assert("Must specify one or more random integers"&&(randomReturns.size()!=0)); - return randomReturns[currentIdx++ % randomReturns.size()]; -} - -// ***************************************************************************** -// free -#ifndef USING_DUMA -DECLARE_WRAPPER(void,free,(void* p)){ - if(Mock_free_noop::mock_ && !Mock_free_noop::mock_->nested) - Mock_free_noop::mock_->call(p); - else - CALL_REAL(free,(p)); -} -#endif - -void Mock_free_noop::call(void* p){ - // on cygwin libc++ is linked statically - // push_back() may call free(), hence the nesting guards - synchronized(mx); - nested++; - callCounter++; - requested.push_back(p); - nested--; -} -void Mock_free_noop::freeRequested(){ -#ifndef USING_DUMA - synchronized(mx); - for(unsigned i=0; icallSocket(domain,type,protocol); -} - -int close(int fd){ - if (!Mock_socket::mock_) - return LIBC_SYMBOLS.close(fd); - return Mock_socket::mock_->callClose(fd); -} - -int getsockopt(int s,int level,int optname,void *optval,socklen_t *optlen){ - if (!Mock_socket::mock_) - return LIBC_SYMBOLS.getsockopt(s,level,optname,optval,optlen); - return Mock_socket::mock_->callGet(s,level,optname,optval,optlen); -} - -int setsockopt(int s,int level,int optname,const void *optval,socklen_t optlen){ - if (!Mock_socket::mock_) - return LIBC_SYMBOLS.setsockopt(s,level,optname,optval,optlen); - return Mock_socket::mock_->callSet(s,level,optname,optval,optlen); -} -int connect(int s,const struct sockaddr *addr,socklen_t len){ - if (!Mock_socket::mock_) - return LIBC_SYMBOLS.connect(s,addr,len); - return Mock_socket::mock_->callConnect(s,addr,len); -} -ssize_t send(int s,const void *buf,size_t len,int flags){ - if (!Mock_socket::mock_) - return LIBC_SYMBOLS.send(s,buf,len,flags); - return Mock_socket::mock_->callSend(s,buf,len,flags); -} - -ssize_t recv(int s,void *buf,size_t len,int flags){ - if (!Mock_socket::mock_) - return LIBC_SYMBOLS.recv(s,buf,len,flags); - return Mock_socket::mock_->callRecv(s,buf,len,flags); -} - -Mock_socket* Mock_socket::mock_=0; - -// ***************************************************************************** -// fcntl -extern "C" int fcntl(int fd,int cmd,...){ - va_list va; - va_start(va,cmd); - void* arg = va_arg(va, void *); - va_end (va); - if (!Mock_fcntl::mock_) - return LIBC_SYMBOLS.fcntl(fd,cmd,arg); - return Mock_fcntl::mock_->call(fd,cmd,arg); -} - -Mock_fcntl* Mock_fcntl::mock_=0; - -// ***************************************************************************** -// select -int select(int nfds,fd_set *rfds,fd_set *wfds,fd_set *efds,struct timeval *timeout){ - if (!Mock_select::mock_) - return LIBC_SYMBOLS.select(nfds,rfds,wfds,efds,timeout); - return Mock_select::mock_->call(nfds,rfds,wfds,efds,timeout); -} - -Mock_select* Mock_select::mock_=0; - -// ***************************************************************************** -// poll -Mock_poll* Mock_poll::mock_=0; -int poll(struct pollfd *fds, POLL_NFDS_TYPE nfds, int timeout){ - if (!Mock_poll::mock_) - return LIBC_SYMBOLS.poll(fds,nfds,timeout); - return Mock_poll::mock_->call(fds,nfds,timeout); - -} - -/* - * Recent gcc with -O2 and glibc FORTIFY feature may cause our poll - * mock to be ignored. - */ -#if __USE_FORTIFY_LEVEL > 0 -int __poll_chk (struct pollfd *__fds, nfds_t __nfds, int __timeout, - __SIZE_TYPE__ __fdslen) { - return poll(__fds, __nfds, __timeout); -} -#endif - -// ***************************************************************************** -// gettimeofday -int gettimeofday(struct timeval *tp, GETTIMEOFDAY_ARG2_TYPE tzp){ - if (!Mock_gettimeofday::mock_) - return LIBC_SYMBOLS.gettimeofday(tp,tzp); - return Mock_gettimeofday::mock_->call(tp,tzp); -} - -Mock_gettimeofday* Mock_gettimeofday::mock_=0; - diff --git a/pkg/registry/zookeeper-3.4.6/src/c/tests/LibCMocks.h b/pkg/registry/zookeeper-3.4.6/src/c/tests/LibCMocks.h deleted file mode 100644 index 5b07cdae9..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/c/tests/LibCMocks.h +++ /dev/null @@ -1,408 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you 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. - */ - -#ifndef LIBCMOCKS_H_ -#define LIBCMOCKS_H_ - -#include -#include -#include - -#include -#include - -#include "MocksBase.h" -#include "LibCSymTable.h" -#include "ThreadingUtil.h" - -// ***************************************************************************** -// gethostbyname - -class Mock_gethostbyname: public Mock -{ -public: - struct HostEntry: public hostent { - HostEntry(const char* hostName,short addrtype); - ~HostEntry(); - HostEntry& addAlias(const char* alias); - HostEntry& addAddress(const char* addr4); - }; - - Mock_gethostbyname():current(0){mock_=this;} - virtual ~Mock_gethostbyname(); - HostEntry& addHostEntry(const char* hostName,short addrtype=AF_INET); - virtual hostent* call(const char* name); - - typedef std::vector HostEntryCollection; - HostEntryCollection gethostbynameReturns; - int current; - static Mock_gethostbyname* mock_; -}; - -class MockFailed_gethostbyname: public Mock_gethostbyname -{ -public: - MockFailed_gethostbyname():h_errnoReturn(HOST_NOT_FOUND) {} - - int h_errnoReturn; - virtual hostent* call(const char* name) { - h_errno=h_errnoReturn; - return 0; - } -}; - -// ***************************************************************************** -// calloc - -class Mock_calloc: public Mock -{ -public: - Mock_calloc():errnoOnFailure(ENOMEM),callsBeforeFailure(-1),counter(0) { - mock_=this; - } - virtual ~Mock_calloc() {mock_=0;} - - int errnoOnFailure; - int callsBeforeFailure; - int counter; - virtual void* call(size_t p1, size_t p2); - - static Mock_calloc* mock_; -}; - -// ***************************************************************************** -// realloc - -class Mock_realloc: public Mock -{ -public: - Mock_realloc():errnoOnFailure(ENOMEM),callsBeforeFailure(-1),counter(0) { - mock_=this; - } - virtual ~Mock_realloc() {mock_=0;} - - int errnoOnFailure; - int callsBeforeFailure; - int counter; - virtual void* call(void* p, size_t s); - - static Mock_realloc* mock_; -}; - -// ***************************************************************************** -// random - -class Mock_random: public Mock -{ -public: - Mock_random():currentIdx(0) {mock_=this;} - virtual ~Mock_random() {mock_=0;} - - int currentIdx; - std::vector randomReturns; - virtual int call(); - void setSeed(unsigned long){currentIdx=0;} - - static Mock_random* mock_; -}; - -// ***************************************************************************** -// no-op free; keeps track of all deallocation requests -class Mock_free_noop: public Mock -{ - Mutex mx; - std::vector requested; -public: - Mock_free_noop():nested(0),callCounter(0){mock_=this;} - virtual ~Mock_free_noop(){ - mock_=0; - freeRequested(); - } - - int nested; - int callCounter; - virtual void call(void* p); - void freeRequested(); - void disable(){mock_=0;} - // returns number of times the pointer was freed - int getFreeCount(void*); - bool isFreed(void*); - - static Mock_free_noop* mock_; -}; - -// ***************************************************************************** -// socket and related system calls - -class Mock_socket: public Mock -{ -public: - static const int FD=63; - Mock_socket():socketReturns(FD),closeReturns(0),getsocketoptReturns(0), - optvalSO_ERROR(0), - setsockoptReturns(0),connectReturns(0),connectErrno(0), - sendErrno(0),recvErrno(0) - { - mock_=this; - } - virtual ~Mock_socket(){mock_=0;} - - int socketReturns; - virtual int callSocket(int domain, int type, int protocol){ - return socketReturns; - } - int closeReturns; - virtual int callClose(int fd){ - return closeReturns; - } - int getsocketoptReturns; - int optvalSO_ERROR; - virtual int callGet(int s,int level,int optname,void *optval,socklen_t *len){ - if(level==SOL_SOCKET && optname==SO_ERROR){ - setSO_ERROR(optval,*len); - } - return getsocketoptReturns; - } - virtual void setSO_ERROR(void *optval,socklen_t len){ - memcpy(optval,&optvalSO_ERROR,len); - } - - int setsockoptReturns; - virtual int callSet(int s,int level,int optname,const void *optval,socklen_t len){ - return setsockoptReturns; - } - int connectReturns; - int connectErrno; - virtual int callConnect(int s,const struct sockaddr *addr,socklen_t len){ - errno=connectErrno; - return connectReturns; - } - - virtual void notifyBufferSent(const std::string& buffer){} - - int sendErrno; - std::string sendBuffer; - virtual ssize_t callSend(int s,const void *buf,size_t len,int flags){ - if(sendErrno!=0){ - errno=sendErrno; - return -1; - } - // first call to send() is always the length of the buffer to follow - bool sendingLength=sendBuffer.size()==0; - // overwrite the length bytes - sendBuffer.assign((const char*)buf,len); - if(!sendingLength){ - notifyBufferSent(sendBuffer); - sendBuffer.erase(); - } - return len; - } - - int recvErrno; - std::string recvReturnBuffer; - virtual ssize_t callRecv(int s,void *buf,size_t len,int flags){ - if(recvErrno!=0){ - errno=recvErrno; - return -1; - } - int k=std::min(len,recvReturnBuffer.length()); - if(k==0) - return 0; - memcpy(buf,recvReturnBuffer.data(),k); - recvReturnBuffer.erase(0,k); - return k; - } - virtual bool hasMoreRecv() const{ - return recvReturnBuffer.size()!=0; - } - static Mock_socket* mock_; -}; - -// ***************************************************************************** -// fcntl -class Mock_fcntl: public Mock -{ -public: - Mock_fcntl():callReturns(0),trapFD(-1){mock_=this;} - ~Mock_fcntl(){mock_=0;} - - int callReturns; - int trapFD; - virtual int call(int fd, int cmd, void* arg){ - if(trapFD==-1) - return LIBC_SYMBOLS.fcntl(fd,cmd,arg); - return callReturns; - } - - static Mock_fcntl* mock_; -}; - -// ***************************************************************************** -// select -class Mock_select: public Mock -{ -public: - Mock_select(Mock_socket* s,int fd):sock(s), - callReturns(0),myFD(fd),timeout(50) - { - mock_=this; - } - ~Mock_select(){mock_=0;} - - Mock_socket* sock; - int callReturns; - int myFD; - int timeout; //in millis - virtual int call(int nfds,fd_set *rfds,fd_set *wfds,fd_set *efds,struct timeval *tv){ - bool isWritableRequested=(wfds && FD_ISSET(myFD,wfds)); - if(rfds) FD_CLR(myFD,rfds); - if(wfds) FD_CLR(myFD,wfds); - // this timeout is only to prevent a tight loop - timeval myTimeout={0,0}; - if(!isWritableRequested && !isFDReadable()){ - myTimeout.tv_sec=timeout/1000; - myTimeout.tv_usec=(timeout%1000)*1000; - } - LIBC_SYMBOLS.select(nfds,rfds,wfds,efds,&myTimeout); - // myFD is always writable - if(isWritableRequested) FD_SET(myFD,wfds); - // myFD is only readable if the socket has anything to read - if(isFDReadable() && rfds) FD_SET(myFD,rfds); - return callReturns; - } - - virtual bool isFDReadable() const { - return sock->hasMoreRecv(); - } - - static Mock_select* mock_; -}; - -// ***************************************************************************** -// poll -// the last element of the pollfd array is expected to be test FD -class Mock_poll: public Mock -{ -public: - Mock_poll(Mock_socket* s,int fd):sock(s), - callReturns(1),myFD(fd),timeout(50) - { - mock_=this; - } - ~Mock_poll(){mock_=0;} - - Mock_socket* sock; - int callReturns; - int myFD; - int timeout; //in millis - virtual int call(struct pollfd *fds, POLL_NFDS_TYPE nfds, int to) { - pollfd* myPoll=0; - if(fds[nfds-1].fd==myFD) - myPoll=&fds[nfds-1]; - bool isWritableRequested=false; - if(myPoll!=0){ - isWritableRequested=myPoll->events&POLLOUT; - nfds--; - } - LIBC_SYMBOLS.poll(fds,nfds,(!isWritableRequested&&!isFDReadable())?timeout:0); - if(myPoll!=0){ - // myFD is always writable if requested - myPoll->revents=isWritableRequested?POLLOUT:0; - // myFD is only readable if the socket has anything to read - myPoll->revents|=isFDReadable()?POLLIN:0; - } - return callReturns; - } - - virtual bool isFDReadable() const { - return sock->hasMoreRecv(); - } - - static Mock_poll* mock_; -}; - -// ***************************************************************************** -// gettimeofday -class Mock_gettimeofday: public Mock -{ -public: - Mock_gettimeofday(){ - LIBC_SYMBOLS.gettimeofday(&tv,0); - mock_=this; - } - Mock_gettimeofday(const Mock_gettimeofday& other):tv(other.tv){} - Mock_gettimeofday(int32_t sec,int32_t usec){ - tv.tv_sec=sec; - tv.tv_usec=usec; - } - ~Mock_gettimeofday(){mock_=0;} - - timeval tv; - virtual int call(struct timeval *tp, GETTIMEOFDAY_ARG2_TYPE tzp){ - *tp=tv; - return 0; - } - operator timeval() const{ - return tv; - } - // advance secs - virtual void tick(int howmuch=1){tv.tv_sec+=howmuch;} - // advance milliseconds - // can move the clock forward as well as backward by providing a negative - // number - virtual void millitick(int howmuch=1){ - int ms=tv.tv_usec/1000+howmuch; - tv.tv_sec+=ms/1000; - // going backward? - if(ms<0){ - ms=1000-(-ms%1000); //wrap millis around - } - tv.tv_usec=(ms%1000)*1000; - } - virtual void tick(const timeval& howmuch){ - // add milliseconds (discarding microsecond portion) - long ms=tv.tv_usec/1000+howmuch.tv_usec/1000; - tv.tv_sec+=howmuch.tv_sec+ms/1000; - tv.tv_usec=(ms%1000)*1000; - } - static Mock_gettimeofday* mock_; -}; - -// discard microseconds! -inline bool operator==(const timeval& lhs, const timeval& rhs){ - return rhs.tv_sec==lhs.tv_sec && rhs.tv_usec/1000==lhs.tv_usec/1000; -} - -// simplistic implementation: no normalization, assume lhs >= rhs, -// discarding microseconds -inline timeval operator-(const timeval& lhs, const timeval& rhs){ - timeval res; - res.tv_sec=lhs.tv_sec-rhs.tv_sec; - res.tv_usec=(lhs.tv_usec/1000-rhs.tv_usec/1000)*1000; - if(res.tv_usec<0){ - res.tv_sec--; - res.tv_usec=1000000+res.tv_usec%1000000; // wrap the millis around - } - return res; -} - -inline int32_t toMilliseconds(const timeval& tv){ - return tv.tv_sec*1000+tv.tv_usec/1000; -} - -#endif /*LIBCMOCKS_H_*/ diff --git a/pkg/registry/zookeeper-3.4.6/src/c/tests/LibCSymTable.cc b/pkg/registry/zookeeper-3.4.6/src/c/tests/LibCSymTable.cc deleted file mode 100644 index 53785796a..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/c/tests/LibCSymTable.cc +++ /dev/null @@ -1,83 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you 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. - */ - -#include "LibCSymTable.h" - -#define LOAD_SYM(sym) \ - sym=(sym##_sig)dlsym(handle,#sym); \ - assert("Unable to load "#sym" from libc"&&sym) - - -LibCSymTable& LibCSymTable::instance(){ - static LibCSymTable tbl; - return tbl; -} - -//****************************************************************************** -// preload original libc symbols -LibCSymTable::LibCSymTable() -{ - void* handle=getHandle(); - LOAD_SYM(gethostbyname); - LOAD_SYM(calloc); - LOAD_SYM(realloc); - LOAD_SYM(free); - LOAD_SYM(random); - LOAD_SYM(srandom); - LOAD_SYM(printf); - LOAD_SYM(socket); - LOAD_SYM(close); - LOAD_SYM(getsockopt); - LOAD_SYM(setsockopt); - LOAD_SYM(fcntl); - LOAD_SYM(connect); - LOAD_SYM(send); - LOAD_SYM(recv); - LOAD_SYM(select); - LOAD_SYM(poll); - LOAD_SYM(gettimeofday); -#ifdef THREADED - LOAD_SYM(pthread_create); - LOAD_SYM(pthread_detach); - LOAD_SYM(pthread_cond_broadcast); - LOAD_SYM(pthread_cond_destroy); - LOAD_SYM(pthread_cond_init); - LOAD_SYM(pthread_cond_signal); - LOAD_SYM(pthread_cond_timedwait); - LOAD_SYM(pthread_cond_wait); - LOAD_SYM(pthread_join); - LOAD_SYM(pthread_mutex_destroy); - LOAD_SYM(pthread_mutex_init); - LOAD_SYM(pthread_mutex_lock); - LOAD_SYM(pthread_mutex_trylock); - LOAD_SYM(pthread_mutex_unlock); -#endif -} - -void* LibCSymTable::getHandle(){ - static void* handle=0; - if(!handle){ -#ifdef __CYGWIN__ - handle=dlopen("cygwin1.dll",RTLD_LAZY); - assert("Unable to dlopen global sym table"&&handle); -#else - handle=RTLD_NEXT; -#endif - } - return handle; -} diff --git a/pkg/registry/zookeeper-3.4.6/src/c/tests/LibCSymTable.h b/pkg/registry/zookeeper-3.4.6/src/c/tests/LibCSymTable.h deleted file mode 100644 index 2f7e0c291..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/c/tests/LibCSymTable.h +++ /dev/null @@ -1,107 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you 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. - */ - -#ifndef LIBCSYMTABLE_H_ -#define LIBCSYMTABLE_H_ - -#include -#include -#include -#include -#include -#include -#include - -#ifdef THREADED -#include -#endif - -#include "config.h" - -// TODO: move all these macros to config.h (generated by autoconf) -#ifdef __CYGWIN__ -#if (CYGWIN_VERSION_DLL_MAJOR < 1007) -#define RANDOM_RET_TYPE int -#else -#define RANDOM_RET_TYPE long int -#endif -#define GETTIMEOFDAY_ARG2_TYPE void* -#else -#define RANDOM_RET_TYPE long int -#define GETTIMEOFDAY_ARG2_TYPE struct timezone* -#endif - -#define DECLARE_SYM(ret,sym,sig) \ - typedef ret (*sym##_sig)sig; \ - static sym##_sig preload_##sym () { \ - static sym##_sig ptr=0;\ - if(!ptr){ void* h=getHandle(); ptr=(sym##_sig)dlsym(h,#sym); } \ - assert("Unable to load "#sym" from libc"&&ptr); \ - return ptr; \ - } \ - sym##_sig sym - -#define LIBC_SYMBOLS LibCSymTable::instance() - -//****************************************************************************** -// preload original libc symbols -struct LibCSymTable -{ - DECLARE_SYM(hostent*,gethostbyname,(const char*)); - DECLARE_SYM(void*,calloc,(size_t, size_t)); - DECLARE_SYM(void*,realloc,(void*, size_t)); - DECLARE_SYM(void,free,(void*)); - DECLARE_SYM(RANDOM_RET_TYPE,random,(void)); - DECLARE_SYM(void,srandom,(unsigned long)); - DECLARE_SYM(int,printf,(const char*, ...)); - DECLARE_SYM(int,socket,(int,int,int)); - DECLARE_SYM(int,close,(int)); - DECLARE_SYM(int,getsockopt,(int,int,int,void*,socklen_t*)); - DECLARE_SYM(int,setsockopt,(int,int,int,const void*,socklen_t)); - DECLARE_SYM(int,fcntl,(int,int,...)); - DECLARE_SYM(int,connect,(int,const struct sockaddr*,socklen_t)); - DECLARE_SYM(ssize_t,send,(int,const void*,size_t,int)); - DECLARE_SYM(ssize_t,recv,(int,const void*,size_t,int)); - DECLARE_SYM(int,select,(int,fd_set*,fd_set*,fd_set*,struct timeval*)); - DECLARE_SYM(int,poll,(struct pollfd*,POLL_NFDS_TYPE,int)); - DECLARE_SYM(int,gettimeofday,(struct timeval*,GETTIMEOFDAY_ARG2_TYPE)); -#ifdef THREADED - DECLARE_SYM(int,pthread_create,(pthread_t *, const pthread_attr_t *, - void *(*)(void *), void *)); - DECLARE_SYM(int,pthread_detach,(pthread_t)); - DECLARE_SYM(int,pthread_cond_broadcast,(pthread_cond_t *)); - DECLARE_SYM(int,pthread_cond_destroy,(pthread_cond_t *)); - DECLARE_SYM(int,pthread_cond_init,(pthread_cond_t *, const pthread_condattr_t *)); - DECLARE_SYM(int,pthread_cond_signal,(pthread_cond_t *)); - DECLARE_SYM(int,pthread_cond_timedwait,(pthread_cond_t *, - pthread_mutex_t *, const struct timespec *)); - DECLARE_SYM(int,pthread_cond_wait,(pthread_cond_t *, pthread_mutex_t *)); - DECLARE_SYM(int,pthread_join,(pthread_t, void **)); - DECLARE_SYM(int,pthread_mutex_destroy,(pthread_mutex_t *)); - DECLARE_SYM(int,pthread_mutex_init,(pthread_mutex_t *, const pthread_mutexattr_t *)); - DECLARE_SYM(int,pthread_mutex_lock,(pthread_mutex_t *)); - DECLARE_SYM(int,pthread_mutex_trylock,(pthread_mutex_t *)); - DECLARE_SYM(int,pthread_mutex_unlock,(pthread_mutex_t *)); -#endif - LibCSymTable(); - - static void* getHandle(); - static LibCSymTable& instance(); -}; - -#endif /*LIBCSYMTABLE_H_*/ diff --git a/pkg/registry/zookeeper-3.4.6/src/c/tests/MocksBase.cc b/pkg/registry/zookeeper-3.4.6/src/c/tests/MocksBase.cc deleted file mode 100644 index 60b2c75f2..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/c/tests/MocksBase.cc +++ /dev/null @@ -1,36 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you 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. - */ - -#include -#include - -#include "MocksBase.h" -#include "LibCSymTable.h" - -// ***************************************************************************** -// Mock base -void* Mock::operator new(std::size_t s){ - void* p=malloc(s); - if(!p) - throw std::bad_alloc(); - return p; -} - -void Mock::operator delete(void* p){ - LIBC_SYMBOLS.free(p); -} diff --git a/pkg/registry/zookeeper-3.4.6/src/c/tests/MocksBase.h b/pkg/registry/zookeeper-3.4.6/src/c/tests/MocksBase.h deleted file mode 100644 index 5b54251ec..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/c/tests/MocksBase.h +++ /dev/null @@ -1,36 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you 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. - */ - -#ifndef MOCKSBASE_H_ -#define MOCKSBASE_H_ - -#include - -// ***************************************************************************** -// Mock base - -class Mock -{ -public: - virtual ~Mock(){} - - static void* operator new(std::size_t s); - static void operator delete(void* p); -}; - -#endif /*MOCKSBASE_H_*/ diff --git a/pkg/registry/zookeeper-3.4.6/src/c/tests/PthreadMocks.cc b/pkg/registry/zookeeper-3.4.6/src/c/tests/PthreadMocks.cc deleted file mode 100644 index 490cebf33..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/c/tests/PthreadMocks.cc +++ /dev/null @@ -1,106 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you 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. - */ - -#include "PthreadMocks.h" - -MockPthreadsBase* MockPthreadsBase::mock_=0; - -#undef USING_DUMA - -#ifndef USING_DUMA -int pthread_cond_broadcast (pthread_cond_t *c){ - if(!MockPthreadsBase::mock_) - return LIBC_SYMBOLS.pthread_cond_broadcast(c); - return MockPthreadsBase::mock_->pthread_cond_broadcast(c); -} -int pthread_cond_destroy (pthread_cond_t *c){ - if(!MockPthreadsBase::mock_) - return LIBC_SYMBOLS.pthread_cond_destroy(c); - return MockPthreadsBase::mock_->pthread_cond_destroy(c); -} -int pthread_cond_init (pthread_cond_t *c, const pthread_condattr_t *a){ - if(!MockPthreadsBase::mock_) - return LIBC_SYMBOLS.pthread_cond_init(c,a); - return MockPthreadsBase::mock_->pthread_cond_init(c,a); -} -int pthread_cond_signal (pthread_cond_t *c){ - if(!MockPthreadsBase::mock_) - return LIBC_SYMBOLS.pthread_cond_signal(c); - return MockPthreadsBase::mock_->pthread_cond_signal(c); -} -int pthread_cond_timedwait (pthread_cond_t *c, - pthread_mutex_t *m, const struct timespec *t){ - if(!MockPthreadsBase::mock_) - return LIBC_SYMBOLS.pthread_cond_timedwait(c,m,t); - return MockPthreadsBase::mock_->pthread_cond_timedwait(c,m,t); -} -int pthread_cond_wait (pthread_cond_t *c, pthread_mutex_t *m){ - if(!MockPthreadsBase::mock_) - return LIBC_SYMBOLS.pthread_cond_wait(c,m); - return MockPthreadsBase::mock_->pthread_cond_wait(c,m); -} -int pthread_create (pthread_t *t, const pthread_attr_t *a, - void *(*f)(void *), void *d){ - if(!MockPthreadsBase::mock_) - return LIBC_SYMBOLS.pthread_create(t,a,f,d); - return MockPthreadsBase::mock_->pthread_create(t,a,f,d); -} -int pthread_detach(pthread_t t){ - if(!MockPthreadsBase::mock_) - return LIBC_SYMBOLS.pthread_detach(t); - return MockPthreadsBase::mock_->pthread_detach(t); -} -int pthread_join (pthread_t t, void **r){ - if(!MockPthreadsBase::mock_) - return LIBC_SYMBOLS.pthread_join(t,r); - return MockPthreadsBase::mock_->pthread_join(t,r); -} -int pthread_mutex_destroy (pthread_mutex_t *m){ - if(!MockPthreadsBase::mock_) - return LIBC_SYMBOLS.pthread_mutex_destroy(m); - return MockPthreadsBase::mock_->pthread_mutex_destroy(m); -} -int pthread_mutex_init (pthread_mutex_t *m, const pthread_mutexattr_t *a){ - if(!MockPthreadsBase::mock_) - return LIBC_SYMBOLS.pthread_mutex_init(m,a); - return MockPthreadsBase::mock_->pthread_mutex_init(m,a); -} - -DECLARE_WRAPPER(int,pthread_mutex_lock,(pthread_mutex_t *m)){ - if(!MockPthreadsBase::mock_) - return CALL_REAL(pthread_mutex_lock,(m)); - return MockPthreadsBase::mock_->pthread_mutex_lock(m); -} - -int pthread_mutex_trylock (pthread_mutex_t *m){ - if(!MockPthreadsBase::mock_) - return LIBC_SYMBOLS.pthread_mutex_trylock(m); - return MockPthreadsBase::mock_->pthread_mutex_trylock(m); -} - -DECLARE_WRAPPER(int,pthread_mutex_unlock,(pthread_mutex_t *m)){ - if(!MockPthreadsBase::mock_) - return CALL_REAL(pthread_mutex_unlock,(m)); - return MockPthreadsBase::mock_->pthread_mutex_unlock(m); -} -#endif - -CheckedPthread::ThreadMap CheckedPthread::tmap_; -CheckedPthread::MutexMap CheckedPthread::mmap_; -CheckedPthread::CVMap CheckedPthread::cvmap_; -Mutex CheckedPthread::mx; diff --git a/pkg/registry/zookeeper-3.4.6/src/c/tests/PthreadMocks.h b/pkg/registry/zookeeper-3.4.6/src/c/tests/PthreadMocks.h deleted file mode 100644 index 8db881501..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/c/tests/PthreadMocks.h +++ /dev/null @@ -1,449 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you 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. - */ - -#ifndef PTHREADMOCKS_H_ -#define PTHREADMOCKS_H_ - -#include -#include -#include - -#include "src/zk_adaptor.h" - -#include "Util.h" -#include "MocksBase.h" -#include "LibCSymTable.h" -#include "ThreadingUtil.h" - -// an ABC for pthreads -class MockPthreadsBase: public Mock -{ -public: - MockPthreadsBase(){mock_=this;} - virtual ~MockPthreadsBase(){mock_=0;} - - virtual int pthread_create(pthread_t * t, const pthread_attr_t *a, - void *(*f)(void *), void *d) =0; - virtual int pthread_join(pthread_t t, void ** r) =0; - virtual int pthread_detach(pthread_t t) =0; - virtual int pthread_cond_broadcast(pthread_cond_t *c) =0; - virtual int pthread_cond_destroy(pthread_cond_t *c) =0; - virtual int pthread_cond_init(pthread_cond_t *c, const pthread_condattr_t *a) =0; - virtual int pthread_cond_signal(pthread_cond_t *c) =0; - virtual int pthread_cond_timedwait(pthread_cond_t *c, - pthread_mutex_t *m, const struct timespec *t) =0; - virtual int pthread_cond_wait(pthread_cond_t *c, pthread_mutex_t *m) =0; - virtual int pthread_mutex_destroy(pthread_mutex_t *m) =0; - virtual int pthread_mutex_init(pthread_mutex_t *m, const pthread_mutexattr_t *a) =0; - virtual int pthread_mutex_lock(pthread_mutex_t *m) =0; - virtual int pthread_mutex_trylock(pthread_mutex_t *m) =0; - virtual int pthread_mutex_unlock(pthread_mutex_t *m) =0; - - static MockPthreadsBase* mock_; -}; - -// all pthread functions simply return an error code -// and increment their invocation counter. No actual threads are spawned. -class MockPthreadsNull: public MockPthreadsBase -{ -public: - MockPthreadsNull(): - pthread_createReturns(0),pthread_createCounter(0), - pthread_joinReturns(0),pthread_joinCounter(0),pthread_joinResultReturn(0), - pthread_detachReturns(0),pthread_detachCounter(0), - pthread_cond_broadcastReturns(0),pthread_cond_broadcastCounter(0), - pthread_cond_destroyReturns(0),pthread_cond_destroyCounter(0), - pthread_cond_initReturns(0),pthread_cond_initCounter(0), - pthread_cond_signalReturns(0),pthread_cond_signalCounter(0), - pthread_cond_timedwaitReturns(0),pthread_cond_timedwaitCounter(0), - pthread_cond_waitReturns(0),pthread_cond_waitCounter(0), - pthread_mutex_destroyReturns(0),pthread_mutex_destroyCounter(0), - pthread_mutex_initReturns(0),pthread_mutex_initCounter(0), - pthread_mutex_lockReturns(0),pthread_mutex_lockCounter(0), - pthread_mutex_trylockReturns(0),pthread_mutex_trylockCounter(0), - pthread_mutex_unlockReturns(0),pthread_mutex_unlockCounter(0) - { - memset(threads,0,sizeof(threads)); - } - - short threads[512]; - - int pthread_createReturns; - int pthread_createCounter; - virtual int pthread_create(pthread_t * t, const pthread_attr_t *a, - void *(*f)(void *), void *d){ - char* p=(char*)&threads[pthread_createCounter++]; - p[0]='i'; // mark as created - *t=(pthread_t)p; - return pthread_createReturns; - } - int pthread_joinReturns; - int pthread_joinCounter; - void* pthread_joinResultReturn; - virtual int pthread_join(pthread_t t, void ** r){ - pthread_joinCounter++; - if(r!=0) - *r=pthread_joinResultReturn; - char* p=(char*)t; - p[0]='x';p[1]+=1; - return pthread_joinReturns; - } - int pthread_detachReturns; - int pthread_detachCounter; - virtual int pthread_detach(pthread_t t){ - pthread_detachCounter++; - char* p=(char*)t; - p[0]='x';p[1]+=1; - return pthread_detachReturns; - } - - template - static bool isInitialized(const T& t){ - return ((char*)t)[0]=='i'; - } - template - static bool isDestroyed(const T& t){ - return ((char*)t)[0]=='x'; - } - template - static int getDestroyCounter(const T& t){ - return ((char*)t)[1]; - } - template - static int getInvalidAccessCounter(const T& t){ - return ((char*)t)[2]; - } - int pthread_cond_broadcastReturns; - int pthread_cond_broadcastCounter; - virtual int pthread_cond_broadcast(pthread_cond_t *c){ - pthread_cond_broadcastCounter++; - if(isDestroyed(c))((char*)c)[2]++; - return pthread_cond_broadcastReturns; - } - int pthread_cond_destroyReturns; - int pthread_cond_destroyCounter; - virtual int pthread_cond_destroy(pthread_cond_t *c){ - pthread_cond_destroyCounter++; - char* p=(char*)c; - p[0]='x';p[1]+=1; - return pthread_cond_destroyReturns; - } - int pthread_cond_initReturns; - int pthread_cond_initCounter; - virtual int pthread_cond_init(pthread_cond_t *c, const pthread_condattr_t *a){ - pthread_cond_initCounter++; - char* p=(char*)c; - p[0]='i'; // mark as created - p[1]=0; // destruction counter - p[2]=0; // access after destruction counter - return pthread_cond_initReturns; - } - int pthread_cond_signalReturns; - int pthread_cond_signalCounter; - virtual int pthread_cond_signal(pthread_cond_t *c){ - pthread_cond_signalCounter++; - if(isDestroyed(c))((char*)c)[2]++; - return pthread_cond_signalReturns; - } - int pthread_cond_timedwaitReturns; - int pthread_cond_timedwaitCounter; - virtual int pthread_cond_timedwait(pthread_cond_t *c, - pthread_mutex_t *m, const struct timespec *t){ - pthread_cond_timedwaitCounter++; - if(isDestroyed(c))((char*)c)[2]++; - return pthread_cond_timedwaitReturns; - } - int pthread_cond_waitReturns; - int pthread_cond_waitCounter; - virtual int pthread_cond_wait(pthread_cond_t *c, pthread_mutex_t *m){ - pthread_cond_waitCounter++; - if(isDestroyed(c))((char*)c)[2]++; - return pthread_cond_waitReturns; - } - int pthread_mutex_destroyReturns; - int pthread_mutex_destroyCounter; - virtual int pthread_mutex_destroy(pthread_mutex_t *m){ - pthread_mutex_destroyCounter++; - char* p=(char*)m; - p[0]='x';p[1]+=1; - return pthread_mutex_destroyReturns; - } - int pthread_mutex_initReturns; - int pthread_mutex_initCounter; - virtual int pthread_mutex_init(pthread_mutex_t *m, const pthread_mutexattr_t *a){ - pthread_mutex_initCounter++; - char* p=(char*)m; - p[0]='i'; // mark as created - p[1]=0; // destruction counter - p[2]=0; // access after destruction counter - return pthread_mutex_initReturns; - } - int pthread_mutex_lockReturns; - int pthread_mutex_lockCounter; - virtual int pthread_mutex_lock(pthread_mutex_t *m){ - pthread_mutex_lockCounter++; - if(isDestroyed(m))((char*)m)[2]++; - return pthread_mutex_lockReturns; - } - int pthread_mutex_trylockReturns; - int pthread_mutex_trylockCounter; - virtual int pthread_mutex_trylock(pthread_mutex_t *m){ - pthread_mutex_trylockCounter++; - if(isDestroyed(m))((char*)m)[2]++; - return pthread_mutex_trylockReturns; - } - int pthread_mutex_unlockReturns; - int pthread_mutex_unlockCounter; - virtual int pthread_mutex_unlock(pthread_mutex_t *m){ - pthread_mutex_unlockCounter++; - if(isDestroyed(m))((char*)m)[2]++; - return pthread_mutex_unlockReturns; - } -}; - -// simulates the way zookeeper threads make use of api_prolog/epilog and -// -class MockPthreadZKNull: public MockPthreadsNull -{ - typedef std::map Map; - Map map_; -public: - virtual int pthread_create(pthread_t * t, const pthread_attr_t *a, - void *(*f)(void *), void *d){ - int ret=MockPthreadsNull::pthread_create(t,a,f,d); - zhandle_t* zh=(zhandle_t*)d; - adaptor_threads* ad=(adaptor_threads*)zh->adaptor_priv; - api_prolog(zh); - ad->threadsToWait--; - putValue(map_,*t,zh); - return ret; - } - virtual int pthread_join(pthread_t t, void ** r){ - zhandle_t* zh=0; - if(getValue(map_,t,zh)) - api_epilog(zh,0); - return MockPthreadsNull::pthread_join(t,r); - } -}; - -struct ThreadInfo{ - typedef enum {RUNNING,TERMINATED} ThreadState; - - ThreadInfo(): - destructionCounter_(0),invalidAccessCounter_(0),state_(RUNNING) - { - } - - ThreadInfo& incDestroyed() { - destructionCounter_++; - return *this; - } - ThreadInfo& incInvalidAccess(){ - invalidAccessCounter_++; - return *this; - } - ThreadInfo& setTerminated(){ - state_=TERMINATED; - return *this; - } - int destructionCounter_; - int invalidAccessCounter_; - ThreadState state_; -}; - -class CheckedPthread: public MockPthreadsBase -{ - // first => destruction counter - // second => invalid access counter - //typedef std::pair Entry; - typedef ThreadInfo Entry; - typedef std::map ThreadMap; - static ThreadMap tmap_; - static ThreadMap& getMap(const TypeOp::BareT&){return tmap_;} - typedef std::map MutexMap; - static MutexMap mmap_; - static MutexMap& getMap(const TypeOp::BareT&){return mmap_;} - typedef std::map CVMap; - static CVMap cvmap_; - static CVMap& getMap(const TypeOp::BareT&){return cvmap_;} - - static Mutex mx; - - template - static void markDestroyed(T& t){ - typedef typename TypeOp::BareT Type; - Entry e; - synchronized(mx); - if(getValue(getMap(Type()),t,e)){ - putValue(getMap(Type()),t,Entry(e).incDestroyed()); - }else{ - putValue(getMap(Type()),t,Entry().incDestroyed()); - } - } - template - static void markCreated(T& t){ - typedef typename TypeOp::BareT Type; - Entry e; - synchronized(mx); - if(!getValue(getMap(Type()),t,e)) - putValue(getMap(Type()),t,Entry()); - } - template - static void checkAccessed(T& t){ - typedef typename TypeOp::BareT Type; - Entry e; - synchronized(mx); - if(getValue(getMap(Type()),t,e) && e.destructionCounter_>0) - putValue(getMap(Type()),t,Entry(e).incInvalidAccess()); - } - static void setTerminated(pthread_t t){ - Entry e; - synchronized(mx); - if(getValue(tmap_,t,e)) - putValue(tmap_,t,Entry(e).setTerminated()); - } -public: - bool verbose; - CheckedPthread():verbose(false){ - tmap_.clear(); - mmap_.clear(); - cvmap_.clear(); - mx.release(); - } - template - static bool isInitialized(const T& t){ - typedef typename TypeOp::BareT Type; - Entry e; - synchronized(mx); - return getValue(getMap(Type()),t,e) && e.destructionCounter_==0; - } - template - static bool isDestroyed(const T& t){ - typedef typename TypeOp::BareT Type; - Entry e; - synchronized(mx); - return getValue(getMap(Type()),t,e) && e.destructionCounter_>0; - } - static bool isTerminated(pthread_t t){ - Entry e; - synchronized(mx); - return getValue(tmap_,t,e) && e.state_==ThreadInfo::TERMINATED; - } - template - static int getDestroyCounter(const T& t){ - typedef typename TypeOp::BareT Type; - Entry e; - synchronized(mx); - return getValue(getMap(Type()),t,e)?e.destructionCounter_:-1; - } - template - static int getInvalidAccessCounter(const T& t){ - typedef typename TypeOp::BareT Type; - Entry e; - synchronized(mx); - return getValue(getMap(Type()),t,e)?e.invalidAccessCounter_:-1; - } - - struct ThreadContext{ - typedef void *(*ThreadFunc)(void *); - - ThreadContext(ThreadFunc func,void* param):func_(func),param_(param){} - ThreadFunc func_; - void* param_; - }; - static void* threadFuncWrapper(void* v){ - ThreadContext* ctx=(ThreadContext*)v; - pthread_t t=pthread_self(); - markCreated(t); - void* res=ctx->func_(ctx->param_); - setTerminated(pthread_self()); - delete ctx; - return res; - } - virtual int pthread_create(pthread_t * t, const pthread_attr_t *a, - void *(*f)(void *), void *d) - { - int ret=LIBC_SYMBOLS.pthread_create(t,a,threadFuncWrapper, - new ThreadContext(f,d)); - if(verbose) - TEST_TRACE(("thread created %p",*t)); - return ret; - } - virtual int pthread_join(pthread_t t, void ** r){ - if(verbose) TEST_TRACE(("thread joined %p",t)); - int ret=LIBC_SYMBOLS.pthread_join(t,r); - if(ret==0) - markDestroyed(t); - return ret; - } - virtual int pthread_detach(pthread_t t){ - if(verbose) TEST_TRACE(("thread detached %p",t)); - int ret=LIBC_SYMBOLS.pthread_detach(t); - if(ret==0) - markDestroyed(t); - return ret; - } - virtual int pthread_cond_broadcast(pthread_cond_t *c){ - checkAccessed(c); - return LIBC_SYMBOLS.pthread_cond_broadcast(c); - } - virtual int pthread_cond_destroy(pthread_cond_t *c){ - markDestroyed(c); - return LIBC_SYMBOLS.pthread_cond_destroy(c); - } - virtual int pthread_cond_init(pthread_cond_t *c, const pthread_condattr_t *a){ - markCreated(c); - return LIBC_SYMBOLS.pthread_cond_init(c,a); - } - virtual int pthread_cond_signal(pthread_cond_t *c){ - checkAccessed(c); - return LIBC_SYMBOLS.pthread_cond_signal(c); - } - virtual int pthread_cond_timedwait(pthread_cond_t *c, - pthread_mutex_t *m, const struct timespec *t){ - checkAccessed(c); - return LIBC_SYMBOLS.pthread_cond_timedwait(c,m,t); - } - virtual int pthread_cond_wait(pthread_cond_t *c, pthread_mutex_t *m){ - checkAccessed(c); - return LIBC_SYMBOLS.pthread_cond_wait(c,m); - } - virtual int pthread_mutex_destroy(pthread_mutex_t *m){ - markDestroyed(m); - return LIBC_SYMBOLS.pthread_mutex_destroy(m); - } - virtual int pthread_mutex_init(pthread_mutex_t *m, const pthread_mutexattr_t *a){ - markCreated(m); - return LIBC_SYMBOLS.pthread_mutex_init(m,a); - } - virtual int pthread_mutex_lock(pthread_mutex_t *m){ - checkAccessed(m); - return LIBC_SYMBOLS.pthread_mutex_lock(m); - } - virtual int pthread_mutex_trylock(pthread_mutex_t *m){ - checkAccessed(m); - return LIBC_SYMBOLS.pthread_mutex_trylock(m); - } - virtual int pthread_mutex_unlock(pthread_mutex_t *m){ - checkAccessed(m); - return LIBC_SYMBOLS.pthread_mutex_unlock(m); - } -}; - -#endif /*PTHREADMOCKS_H_*/ - diff --git a/pkg/registry/zookeeper-3.4.6/src/c/tests/TestClient.cc b/pkg/registry/zookeeper-3.4.6/src/c/tests/TestClient.cc deleted file mode 100644 index 154fbed9e..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/c/tests/TestClient.cc +++ /dev/null @@ -1,1135 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you 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. - */ - -#include -#include "CppAssertHelper.h" - -#include -#include -#include -#include - -#include "CollectionUtil.h" -#include "ThreadingUtil.h" - -using namespace Util; - -#include "Vector.h" -using namespace std; - -#include -#include - -#include -#include -#include -#include "Util.h" - -struct buff_struct_2 { - int32_t len; - int32_t off; - char *buffer; -}; - -static int Stat_eq(struct Stat* a, struct Stat* b) -{ - if (a->czxid != b->czxid) return 0; - if (a->mzxid != b->mzxid) return 0; - if (a->ctime != b->ctime) return 0; - if (a->mtime != b->mtime) return 0; - if (a->version != b->version) return 0; - if (a->cversion != b->cversion) return 0; - if (a->aversion != b->aversion) return 0; - if (a->ephemeralOwner != b->ephemeralOwner) return 0; - if (a->dataLength != b->dataLength) return 0; - if (a->numChildren != b->numChildren) return 0; - if (a->pzxid != b->pzxid) return 0; - return 1; -} -#ifdef THREADED - static void yield(zhandle_t *zh, int i) - { - sleep(i); - } -#else - static void yield(zhandle_t *zh, int seconds) - { - int fd; - int interest; - int events; - struct timeval tv; - int rc; - time_t expires = time(0) + seconds; - time_t timeLeft = seconds; - fd_set rfds, wfds, efds; - FD_ZERO(&rfds); - FD_ZERO(&wfds); - FD_ZERO(&efds); - - while(timeLeft >= 0) { - zookeeper_interest(zh, &fd, &interest, &tv); - if (fd != -1) { - if (interest&ZOOKEEPER_READ) { - FD_SET(fd, &rfds); - } else { - FD_CLR(fd, &rfds); - } - if (interest&ZOOKEEPER_WRITE) { - FD_SET(fd, &wfds); - } else { - FD_CLR(fd, &wfds); - } - } else { - fd = 0; - } - FD_SET(0, &rfds); - if (tv.tv_sec > timeLeft) { - tv.tv_sec = timeLeft; - } - rc = select(fd+1, &rfds, &wfds, &efds, &tv); - timeLeft = expires - time(0); - events = 0; - if (FD_ISSET(fd, &rfds)) { - events |= ZOOKEEPER_READ; - } - if (FD_ISSET(fd, &wfds)) { - events |= ZOOKEEPER_WRITE; - } - zookeeper_process(zh, events); - } - } -#endif - -typedef struct evt { - string path; - int type; -} evt_t; - -typedef struct watchCtx { -private: - list events; - watchCtx(const watchCtx&); - watchCtx& operator=(const watchCtx&); -public: - bool connected; - zhandle_t *zh; - Mutex mutex; - - watchCtx() { - connected = false; - zh = 0; - } - ~watchCtx() { - if (zh) { - zookeeper_close(zh); - zh = 0; - } - } - - evt_t getEvent() { - evt_t evt; - mutex.acquire(); - CPPUNIT_ASSERT( events.size() > 0); - evt = events.front(); - events.pop_front(); - mutex.release(); - return evt; - } - - int countEvents() { - int count; - mutex.acquire(); - count = events.size(); - mutex.release(); - return count; - } - - void putEvent(evt_t evt) { - mutex.acquire(); - events.push_back(evt); - mutex.release(); - } - - bool waitForConnected(zhandle_t *zh) { - time_t expires = time(0) + 10; - while(!connected && time(0) < expires) { - yield(zh, 1); - } - return connected; - } - bool waitForDisconnected(zhandle_t *zh) { - time_t expires = time(0) + 15; - while(connected && time(0) < expires) { - yield(zh, 1); - } - return !connected; - } -} watchctx_t; - -class Zookeeper_simpleSystem : public CPPUNIT_NS::TestFixture -{ - CPPUNIT_TEST_SUITE(Zookeeper_simpleSystem); - CPPUNIT_TEST(testAsyncWatcherAutoReset); - CPPUNIT_TEST(testDeserializeString); - CPPUNIT_TEST(testFirstServerDown); -#ifdef THREADED - CPPUNIT_TEST(testNullData); -#ifdef ZOO_IPV6_ENABLED - CPPUNIT_TEST(testIPV6); -#endif - CPPUNIT_TEST(testPath); - CPPUNIT_TEST(testPathValidation); - CPPUNIT_TEST(testPing); - CPPUNIT_TEST(testAcl); - CPPUNIT_TEST(testChroot); - CPPUNIT_TEST(testAuth); - CPPUNIT_TEST(testHangingClient); - CPPUNIT_TEST(testWatcherAutoResetWithGlobal); - CPPUNIT_TEST(testWatcherAutoResetWithLocal); - CPPUNIT_TEST(testGetChildren2); -#endif - CPPUNIT_TEST_SUITE_END(); - - static void watcher(zhandle_t *, int type, int state, const char *path,void*v){ - watchctx_t *ctx = (watchctx_t*)v; - - if (state == ZOO_CONNECTED_STATE) { - ctx->connected = true; - } else { - ctx->connected = false; - } - if (type != ZOO_SESSION_EVENT) { - evt_t evt; - evt.path = path; - evt.type = type; - ctx->putEvent(evt); - } - } - - static const char hostPorts[]; - - const char *getHostPorts() { - return hostPorts; - } - - zhandle_t *createClient(watchctx_t *ctx) { - return createClient(hostPorts, ctx); - } - - zhandle_t *createClient(const char *hp, watchctx_t *ctx) { - zhandle_t *zk = zookeeper_init(hp, watcher, 10000, 0, ctx, 0); - ctx->zh = zk; - sleep(1); - return zk; - } - - zhandle_t *createchClient(watchctx_t *ctx, const char* chroot) { - zhandle_t *zk = zookeeper_init(chroot, watcher, 10000, 0, ctx, 0); - ctx->zh = zk; - sleep(1); - return zk; - } - - FILE *logfile; -public: - - Zookeeper_simpleSystem() { - logfile = openlogfile("Zookeeper_simpleSystem"); - } - - ~Zookeeper_simpleSystem() { - if (logfile) { - fflush(logfile); - fclose(logfile); - logfile = 0; - } - } - - void setUp() - { - zoo_set_log_stream(logfile); - } - - - void startServer() { - char cmd[1024]; - sprintf(cmd, "%s start %s", ZKSERVER_CMD, getHostPorts()); - CPPUNIT_ASSERT(system(cmd) == 0); - } - - void stopServer() { - char cmd[1024]; - sprintf(cmd, "%s stop %s", ZKSERVER_CMD, getHostPorts()); - CPPUNIT_ASSERT(system(cmd) == 0); - } - - void tearDown() - { - } - - /** have a callback in the default watcher **/ - static void default_zoo_watcher(zhandle_t *zzh, int type, int state, const char *path, void *context){ - int zrc = 0; - struct String_vector str_vec = {0, NULL}; - zrc = zoo_wget_children(zzh, "/mytest", default_zoo_watcher, NULL, &str_vec); - } - - /** ZOOKEEPER-1057 This checks that the client connects to the second server when the first is not reachable **/ - void testFirstServerDown() { - watchctx_t ctx; - - zoo_deterministic_conn_order(true); - - zhandle_t* zk = createClient("127.0.0.1:22182,127.0.0.1:22181", &ctx); - CPPUNIT_ASSERT(zk != 0); - CPPUNIT_ASSERT(ctx.waitForConnected(zk)); - } - - /** this checks for a deadlock in calling zookeeper_close and calls from a default watcher that might get triggered just when zookeeper_close() is in progress **/ - void testHangingClient() { - int zrc = 0; - char buff[10] = "testall"; - char path[512]; - watchctx_t *ctx; - struct String_vector str_vec = {0, NULL}; - zhandle_t *zh = zookeeper_init(hostPorts, NULL, 10000, 0, ctx, 0); - sleep(1); - zrc = zoo_create(zh, "/mytest", buff, 10, &ZOO_OPEN_ACL_UNSAFE, 0, path, 512); - zrc = zoo_wget_children(zh, "/mytest", default_zoo_watcher, NULL, &str_vec); - zrc = zoo_create(zh, "/mytest/test1", buff, 10, &ZOO_OPEN_ACL_UNSAFE, 0, path, 512); - zrc = zoo_wget_children(zh, "/mytest", default_zoo_watcher, NULL, &str_vec); - zrc = zoo_delete(zh, "/mytest/test1", -1); - zookeeper_close(zh); - } - - - void testPing() - { - watchctx_t ctxIdle; - watchctx_t ctxWC; - zhandle_t *zkIdle = createClient(&ctxIdle); - zhandle_t *zkWatchCreator = createClient(&ctxWC); - - CPPUNIT_ASSERT(zkIdle); - CPPUNIT_ASSERT(zkWatchCreator); - - char path[80]; - sprintf(path, "/testping"); - int rc = zoo_create(zkWatchCreator, path, "", 0, &ZOO_OPEN_ACL_UNSAFE, 0, 0, 0); - CPPUNIT_ASSERT_EQUAL((int)ZOK, rc); - - for(int i = 0; i < 30; i++) { - sprintf(path, "/testping/%i", i); - rc = zoo_create(zkWatchCreator, path, "", 0, &ZOO_OPEN_ACL_UNSAFE, 0, 0, 0); - CPPUNIT_ASSERT_EQUAL((int)ZOK, rc); - } - - for(int i = 0; i < 30; i++) { - sprintf(path, "/testping/%i", i); - struct Stat stat; - rc = zoo_exists(zkIdle, path, 1, &stat); - CPPUNIT_ASSERT_EQUAL((int)ZOK, rc); - } - - for(int i = 0; i < 30; i++) { - sprintf(path, "/testping/%i", i); - usleep(500000); - rc = zoo_delete(zkWatchCreator, path, -1); - CPPUNIT_ASSERT_EQUAL((int)ZOK, rc); - } - struct Stat stat; - CPPUNIT_ASSERT_EQUAL((int)ZNONODE, zoo_exists(zkIdle, "/testping/0", 0, &stat)); - } - - bool waitForEvent(zhandle_t *zh, watchctx_t *ctx, int seconds) { - time_t expires = time(0) + seconds; - while(ctx->countEvents() == 0 && time(0) < expires) { - yield(zh, 1); - } - return ctx->countEvents() > 0; - } - -#define COUNT 100 - - static zhandle_t *async_zk; - static volatile int count; - static const char* hp_chroot; - - static void statCompletion(int rc, const struct Stat *stat, const void *data) { - int tmp = (int) (long) data; - CPPUNIT_ASSERT_EQUAL(tmp, rc); - } - - static void stringCompletion(int rc, const char *value, const void *data) { - char *path = (char*)data; - - if (rc == ZCONNECTIONLOSS && path) { - // Try again - rc = zoo_acreate(async_zk, path, "", 0, &ZOO_OPEN_ACL_UNSAFE, 0, stringCompletion, 0); - } else if (rc != ZOK) { - // fprintf(stderr, "rc = %d with path = %s\n", rc, (path ? path : "null")); - } - if (path) { - free(path); - } - } - - static void create_completion_fn(int rc, const char* value, const void *data) { - CPPUNIT_ASSERT_EQUAL((int) ZOK, rc); - count++; - } - - static void waitForCreateCompletion(int seconds) { - time_t expires = time(0) + seconds; - while(count == 0 && time(0) < expires) { - sleep(1); - } - count--; - } - - static void watcher_chroot_fn(zhandle_t *zh, int type, - int state, const char *path,void *watcherCtx) { - // check for path - char *client_path = (char *) watcherCtx; - CPPUNIT_ASSERT(strcmp(client_path, path) == 0); - count ++; - } - - static void waitForChrootWatch(int seconds) { - time_t expires = time(0) + seconds; - while (count == 0 && time(0) < expires) { - sleep(1); - } - count--; - } - - static void waitForVoidCompletion(int seconds) { - time_t expires = time(0) + seconds; - while(count == 0 && time(0) < expires) { - sleep(1); - } - count--; - } - - static void voidCompletion(int rc, const void *data) { - int tmp = (int) (long) data; - CPPUNIT_ASSERT_EQUAL(tmp, rc); - count++; - } - - static void verifyCreateFails(const char *path, zhandle_t *zk) { - CPPUNIT_ASSERT_EQUAL((int)ZBADARGUMENTS, zoo_create(zk, - path, "", 0, &ZOO_OPEN_ACL_UNSAFE, 0, 0, 0)); - } - - static void verifyCreateOk(const char *path, zhandle_t *zk) { - CPPUNIT_ASSERT_EQUAL((int)ZOK, zoo_create(zk, - path, "", 0, &ZOO_OPEN_ACL_UNSAFE, 0, 0, 0)); - } - - static void verifyCreateFailsSeq(const char *path, zhandle_t *zk) { - CPPUNIT_ASSERT_EQUAL((int)ZBADARGUMENTS, zoo_create(zk, - path, "", 0, &ZOO_OPEN_ACL_UNSAFE, ZOO_SEQUENCE, 0, 0)); - } - - static void verifyCreateOkSeq(const char *path, zhandle_t *zk) { - CPPUNIT_ASSERT_EQUAL((int)ZOK, zoo_create(zk, - path, "", 0, &ZOO_OPEN_ACL_UNSAFE, ZOO_SEQUENCE, 0, 0)); - } - - - /** - returns false if the vectors dont match - **/ - bool compareAcl(struct ACL_vector acl1, struct ACL_vector acl2) { - if (acl1.count != acl2.count) { - return false; - } - struct ACL *aclval1 = acl1.data; - struct ACL *aclval2 = acl2.data; - if (aclval1->perms != aclval2->perms) { - return false; - } - struct Id id1 = aclval1->id; - struct Id id2 = aclval2->id; - if (strcmp(id1.scheme, id2.scheme) != 0) { - return false; - } - if (strcmp(id1.id, id2.id) != 0) { - return false; - } - return true; - } - - void testDeserializeString() { - char *val_str; - int rc = 0; - int val = -1; - struct iarchive *ia; - struct buff_struct_2 *b; - struct oarchive *oa = create_buffer_oarchive(); - oa->serialize_Int(oa, "int", &val); - b = (struct buff_struct_2 *) oa->priv; - ia = create_buffer_iarchive(b->buffer, b->len); - rc = ia->deserialize_String(ia, "string", &val_str); - CPPUNIT_ASSERT_EQUAL(-EINVAL, rc); - } - - void testAcl() { - int rc; - struct ACL_vector aclvec; - struct Stat stat; - watchctx_t ctx; - zhandle_t *zk = createClient(&ctx); - rc = zoo_create(zk, "/acl", "", 0, - &ZOO_OPEN_ACL_UNSAFE, 0, 0, 0); - CPPUNIT_ASSERT_EQUAL((int)ZOK, rc); - rc = zoo_get_acl(zk, "/acl", &aclvec, &stat ); - CPPUNIT_ASSERT_EQUAL((int) ZOK, rc); - bool cmp = compareAcl(ZOO_OPEN_ACL_UNSAFE, aclvec); - CPPUNIT_ASSERT_EQUAL(true, cmp); - rc = zoo_set_acl(zk, "/acl", -1, &ZOO_READ_ACL_UNSAFE); - CPPUNIT_ASSERT_EQUAL((int) ZOK, rc); - rc = zoo_get_acl(zk, "/acl", &aclvec, &stat); - CPPUNIT_ASSERT_EQUAL((int) ZOK, rc); - cmp = compareAcl(ZOO_READ_ACL_UNSAFE, aclvec); - CPPUNIT_ASSERT_EQUAL(true, cmp); - } - - - void testAuth() { - int rc; - count = 0; - watchctx_t ctx1, ctx2, ctx3, ctx4, ctx5; - zhandle_t *zk = createClient(&ctx1); - struct ACL_vector nodeAcl; - struct ACL acl_val; - rc = zoo_add_auth(0, "", 0, 0, voidCompletion, (void*)-1); - CPPUNIT_ASSERT_EQUAL((int) ZBADARGUMENTS, rc); - - rc = zoo_add_auth(zk, 0, 0, 0, voidCompletion, (void*)-1); - CPPUNIT_ASSERT_EQUAL((int) ZBADARGUMENTS, rc); - - // auth as pat, create /tauth1, close session - rc = zoo_add_auth(zk, "digest", "pat:passwd", 10, voidCompletion, - (void*)ZOK); - CPPUNIT_ASSERT_EQUAL((int) ZOK, rc); - waitForVoidCompletion(3); - CPPUNIT_ASSERT(count == 0); - - rc = zoo_create(zk, "/tauth1", "", 0, &ZOO_CREATOR_ALL_ACL, 0, 0, 0); - CPPUNIT_ASSERT_EQUAL((int)ZOK, rc); - - { - //create a new client - zk = createClient(&ctx4); - rc = zoo_add_auth(zk, "digest", "", 0, voidCompletion, (void*)ZOK); - CPPUNIT_ASSERT_EQUAL((int) ZOK, rc); - waitForVoidCompletion(3); - CPPUNIT_ASSERT(count == 0); - - rc = zoo_add_auth(zk, "digest", "", 0, voidCompletion, (void*)ZOK); - CPPUNIT_ASSERT_EQUAL((int) ZOK, rc); - waitForVoidCompletion(3); - CPPUNIT_ASSERT(count == 0); - } - - //create a new client - zk = createClient(&ctx2); - - rc = zoo_add_auth(zk, "digest", "pat:passwd2", 11, voidCompletion, - (void*)ZOK); - CPPUNIT_ASSERT_EQUAL((int) ZOK, rc); - waitForVoidCompletion(3); - CPPUNIT_ASSERT(count == 0); - - char buf[1024]; - int blen = sizeof(buf); - struct Stat stat; - rc = zoo_get(zk, "/tauth1", 0, buf, &blen, &stat); - CPPUNIT_ASSERT_EQUAL((int)ZNOAUTH, rc); - // add auth pat w/correct pass verify success - rc = zoo_add_auth(zk, "digest", "pat:passwd", 10, voidCompletion, - (void*)ZOK); - - CPPUNIT_ASSERT_EQUAL((int) ZOK, rc); - rc = zoo_get(zk, "/tauth1", 0, buf, &blen, &stat); - CPPUNIT_ASSERT_EQUAL((int)ZOK, rc); - waitForVoidCompletion(3); - CPPUNIT_ASSERT(count == 0); - //create a new client - zk = createClient(&ctx3); - rc = zoo_add_auth(zk, "digest", "pat:passwd", 10, voidCompletion, (void*) ZOK); - waitForVoidCompletion(3); - CPPUNIT_ASSERT(count == 0); - rc = zoo_add_auth(zk, "ip", "none", 4, voidCompletion, (void*)ZOK); - //make the server forget the auths - waitForVoidCompletion(3); - CPPUNIT_ASSERT(count == 0); - - stopServer(); - CPPUNIT_ASSERT(ctx3.waitForDisconnected(zk)); - startServer(); - CPPUNIT_ASSERT(ctx3.waitForConnected(zk)); - // now try getting the data - rc = zoo_get(zk, "/tauth1", 0, buf, &blen, &stat); - CPPUNIT_ASSERT_EQUAL((int)ZOK, rc); - // also check for get - rc = zoo_get_acl(zk, "/", &nodeAcl, &stat); - CPPUNIT_ASSERT_EQUAL((int)ZOK, rc); - // check if the acl has all the perms - CPPUNIT_ASSERT_EQUAL((int)1, (int)nodeAcl.count); - acl_val = *(nodeAcl.data); - CPPUNIT_ASSERT_EQUAL((int) acl_val.perms, ZOO_PERM_ALL); - // verify on root node - rc = zoo_set_acl(zk, "/", -1, &ZOO_CREATOR_ALL_ACL); - CPPUNIT_ASSERT_EQUAL((int) ZOK, rc); - - rc = zoo_set_acl(zk, "/", -1, &ZOO_OPEN_ACL_UNSAFE); - CPPUNIT_ASSERT_EQUAL((int) ZOK, rc); - - //[ZOOKEEPER-1108], test that auth info is sent to server, if client is not - //connected to server when zoo_add_auth was called. - zhandle_t *zk_auth = zookeeper_init(hostPorts, NULL, 10000, 0, NULL, 0); - rc = zoo_add_auth(zk_auth, "digest", "pat:passwd", 10, voidCompletion, (void*)ZOK); - CPPUNIT_ASSERT_EQUAL((int) ZOK, rc); - sleep(2); - CPPUNIT_ASSERT(count == 1); - count = 0; - CPPUNIT_ASSERT_EQUAL((int) ZOK, zookeeper_close(zk_auth)); - - // [ZOOKEEPER-800] zoo_add_auth should return ZINVALIDSTATE if - // the connection is closed. - zhandle_t *zk2 = zookeeper_init(hostPorts, NULL, 10000, 0, NULL, 0); - sleep(1); - CPPUNIT_ASSERT_EQUAL((int) ZOK, zookeeper_close(zk2)); - CPPUNIT_ASSERT_EQUAL(0, zoo_state(zk2)); // 0 ==> ZOO_CLOSED_STATE - rc = zoo_add_auth(zk2, "digest", "pat:passwd", 10, voidCompletion, (void*)ZOK); - CPPUNIT_ASSERT_EQUAL((int) ZINVALIDSTATE, rc); - - struct sockaddr addr; - socklen_t addr_len = sizeof(addr); - zk = createClient(&ctx5); - stopServer(); - CPPUNIT_ASSERT(ctx5.waitForDisconnected(zk)); - CPPUNIT_ASSERT(zookeeper_get_connected_host(zk, &addr, &addr_len) == NULL); - addr_len = sizeof(addr); - startServer(); - CPPUNIT_ASSERT(ctx5.waitForConnected(zk)); - CPPUNIT_ASSERT(zookeeper_get_connected_host(zk, &addr, &addr_len) != NULL); - } - - void testGetChildren2() { - int rc; - watchctx_t ctx; - zhandle_t *zk = createClient(&ctx); - - rc = zoo_create(zk, "/parent", "", 0, &ZOO_OPEN_ACL_UNSAFE, 0, 0, 0); - CPPUNIT_ASSERT_EQUAL((int)ZOK, rc); - - rc = zoo_create(zk, "/parent/child_a", "", 0, &ZOO_OPEN_ACL_UNSAFE, 0, 0, 0); - CPPUNIT_ASSERT_EQUAL((int)ZOK, rc); - - rc = zoo_create(zk, "/parent/child_b", "", 0, &ZOO_OPEN_ACL_UNSAFE, 0, 0, 0); - CPPUNIT_ASSERT_EQUAL((int)ZOK, rc); - - rc = zoo_create(zk, "/parent/child_c", "", 0, &ZOO_OPEN_ACL_UNSAFE, 0, 0, 0); - CPPUNIT_ASSERT_EQUAL((int)ZOK, rc); - - rc = zoo_create(zk, "/parent/child_d", "", 0, &ZOO_OPEN_ACL_UNSAFE, 0, 0, 0); - CPPUNIT_ASSERT_EQUAL((int)ZOK, rc); - - struct String_vector strings; - struct Stat stat_a, stat_b; - - rc = zoo_get_children2(zk, "/parent", 0, &strings, &stat_a); - CPPUNIT_ASSERT_EQUAL((int)ZOK, rc); - - rc = zoo_exists(zk, "/parent", 0, &stat_b); - CPPUNIT_ASSERT_EQUAL((int)ZOK, rc); - - CPPUNIT_ASSERT(Stat_eq(&stat_a, &stat_b)); - CPPUNIT_ASSERT(stat_a.numChildren == 4); - } - - void testIPV6() { - watchctx_t ctx; - zhandle_t *zk = createClient("::1:22181", &ctx); - CPPUNIT_ASSERT(zk); - int rc = 0; - rc = zoo_create(zk, "/ipv6", NULL, -1, - &ZOO_OPEN_ACL_UNSAFE, 0, 0, 0); - CPPUNIT_ASSERT_EQUAL((int) ZOK, rc); - } - - void testNullData() { - watchctx_t ctx; - zhandle_t *zk = createClient(&ctx); - CPPUNIT_ASSERT(zk); - int rc = 0; - rc = zoo_create(zk, "/mahadev", NULL, -1, - &ZOO_OPEN_ACL_UNSAFE, 0, 0, 0); - CPPUNIT_ASSERT_EQUAL((int) ZOK, rc); - char buffer[512]; - struct Stat stat; - int len = 512; - rc = zoo_wget(zk, "/mahadev", NULL, NULL, buffer, &len, &stat); - CPPUNIT_ASSERT_EQUAL( -1, len); - CPPUNIT_ASSERT_EQUAL((int) ZOK, rc); - rc = zoo_set(zk, "/mahadev", NULL, -1, -1); - CPPUNIT_ASSERT_EQUAL((int) ZOK, rc); - rc = zoo_wget(zk, "/mahadev", NULL, NULL, buffer, &len, &stat); - CPPUNIT_ASSERT_EQUAL( -1, len); - CPPUNIT_ASSERT_EQUAL((int) ZOK, rc); - } - - void testPath() { - watchctx_t ctx; - char pathbuf[20]; - zhandle_t *zk = createClient(&ctx); - CPPUNIT_ASSERT(zk); - int rc = 0; - - memset(pathbuf, 'X', 20); - rc = zoo_create(zk, "/testpathpath0", "", 0, - &ZOO_OPEN_ACL_UNSAFE, 0, pathbuf, 0); - CPPUNIT_ASSERT_EQUAL((int) ZOK, rc); - CPPUNIT_ASSERT_EQUAL('X', pathbuf[0]); - - rc = zoo_create(zk, "/testpathpath1", "", 0, - &ZOO_OPEN_ACL_UNSAFE, 0, pathbuf, 1); - CPPUNIT_ASSERT_EQUAL((int) ZOK, rc); - CPPUNIT_ASSERT(strlen(pathbuf) == 0); - - rc = zoo_create(zk, "/testpathpath2", "", 0, - &ZOO_OPEN_ACL_UNSAFE, 0, pathbuf, 2); - CPPUNIT_ASSERT_EQUAL((int) ZOK, rc); - CPPUNIT_ASSERT(strcmp(pathbuf, "/") == 0); - - rc = zoo_create(zk, "/testpathpath3", "", 0, - &ZOO_OPEN_ACL_UNSAFE, 0, pathbuf, 3); - CPPUNIT_ASSERT_EQUAL((int) ZOK, rc); - CPPUNIT_ASSERT(strcmp(pathbuf, "/t") == 0); - - rc = zoo_create(zk, "/testpathpath7", "", 0, - &ZOO_OPEN_ACL_UNSAFE, 0, pathbuf, 15); - CPPUNIT_ASSERT_EQUAL((int) ZOK, rc); - CPPUNIT_ASSERT(strcmp(pathbuf, "/testpathpath7") == 0); - - rc = zoo_create(zk, "/testpathpath8", "", 0, - &ZOO_OPEN_ACL_UNSAFE, 0, pathbuf, 16); - CPPUNIT_ASSERT_EQUAL((int) ZOK, rc); - CPPUNIT_ASSERT(strcmp(pathbuf, "/testpathpath8") == 0); - } - - void testPathValidation() { - watchctx_t ctx; - zhandle_t *zk = createClient(&ctx); - CPPUNIT_ASSERT(zk); - - verifyCreateFails(0, zk); - verifyCreateFails("", zk); - verifyCreateFails("//", zk); - verifyCreateFails("///", zk); - verifyCreateFails("////", zk); - verifyCreateFails("/.", zk); - verifyCreateFails("/..", zk); - verifyCreateFails("/./", zk); - verifyCreateFails("/../", zk); - verifyCreateFails("/foo/./", zk); - verifyCreateFails("/foo/../", zk); - verifyCreateFails("/foo/.", zk); - verifyCreateFails("/foo/..", zk); - verifyCreateFails("/./.", zk); - verifyCreateFails("/../..", zk); - verifyCreateFails("/foo/bar/", zk); - verifyCreateFails("/foo//bar", zk); - verifyCreateFails("/foo/bar//", zk); - - verifyCreateFails("foo", zk); - verifyCreateFails("a", zk); - - // verify that trailing fails, except for seq which adds suffix - verifyCreateOk("/createseq", zk); - verifyCreateFails("/createseq/", zk); - verifyCreateOkSeq("/createseq/", zk); - verifyCreateOkSeq("/createseq/.", zk); - verifyCreateOkSeq("/createseq/..", zk); - verifyCreateFailsSeq("/createseq//", zk); - verifyCreateFailsSeq("/createseq/./", zk); - verifyCreateFailsSeq("/createseq/../", zk); - - verifyCreateOk("/.foo", zk); - verifyCreateOk("/.f.", zk); - verifyCreateOk("/..f", zk); - verifyCreateOk("/..f..", zk); - verifyCreateOk("/f.c", zk); - verifyCreateOk("/f", zk); - verifyCreateOk("/f/.f", zk); - verifyCreateOk("/f/f.", zk); - verifyCreateOk("/f/..f", zk); - verifyCreateOk("/f/f..", zk); - verifyCreateOk("/f/.f/f", zk); - verifyCreateOk("/f/f./f", zk); - } - - void testChroot() { - // the c client async callbacks do - // not callback with the path, so - // we dont need to test taht for now - // we should fix that though soon! - watchctx_t ctx, ctx_ch; - zhandle_t *zk, *zk_ch; - char buf[60]; - int rc, len; - struct Stat stat; - const char* data = "garbage"; - const char* retStr = "/chroot"; - const char* root= "/"; - zk_ch = createchClient(&ctx_ch, "127.0.0.1:22181/testch1/mahadev"); - CPPUNIT_ASSERT(zk_ch != NULL); - zk = createClient(&ctx); - // first test with a NULL zk handle, make sure client library does not - // dereference a null pointer, but instead returns ZBADARGUMENTS - rc = zoo_create(NULL, "/testch1", "", 0, &ZOO_OPEN_ACL_UNSAFE, 0, 0, 0); - CPPUNIT_ASSERT_EQUAL((int) ZBADARGUMENTS, rc); - rc = zoo_create(zk, "/testch1", "", 0, &ZOO_OPEN_ACL_UNSAFE, 0, 0, 0); - CPPUNIT_ASSERT_EQUAL((int) ZOK, rc); - rc = zoo_create(zk, "/testch1/mahadev", data, 7, &ZOO_OPEN_ACL_UNSAFE, 0, 0, 0); - CPPUNIT_ASSERT_EQUAL((int) ZOK, rc); - // try an exists with / - len = 60; - rc = zoo_get(zk_ch, "/", 0, buf, &len, &stat); - CPPUNIT_ASSERT_EQUAL((int)ZOK, rc); - //check if the data is the same - CPPUNIT_ASSERT(strncmp(buf, data, 7) == 0); - //check for watches - rc = zoo_wexists(zk_ch, "/chroot", watcher_chroot_fn, (void *) retStr, &stat); - //now check if we can do create/delete/get/sets/acls/getChildren and others - //check create - rc = zoo_create(zk_ch, "/chroot", "", 0, &ZOO_OPEN_ACL_UNSAFE, 0, 0,0); - CPPUNIT_ASSERT_EQUAL((int) ZOK, rc); - waitForChrootWatch(3); - CPPUNIT_ASSERT(count == 0); - rc = zoo_create(zk_ch, "/chroot/child", "", 0, &ZOO_OPEN_ACL_UNSAFE, 0, 0, 0); - CPPUNIT_ASSERT_EQUAL((int) ZOK, rc); - rc = zoo_exists(zk, "/testch1/mahadev/chroot/child", 0, &stat); - CPPUNIT_ASSERT_EQUAL((int) ZOK, rc); - - rc = zoo_delete(zk_ch, "/chroot/child", -1); - CPPUNIT_ASSERT_EQUAL((int) ZOK, rc); - rc = zoo_exists(zk, "/testch1/mahadev/chroot/child", 0, &stat); - CPPUNIT_ASSERT_EQUAL((int) ZNONODE, rc); - rc = zoo_wget(zk_ch, "/chroot", watcher_chroot_fn, (char*) retStr, - buf, &len, &stat); - CPPUNIT_ASSERT_EQUAL((int) ZOK, rc); - rc = zoo_set(zk_ch, "/chroot",buf, 3, -1); - CPPUNIT_ASSERT_EQUAL((int) ZOK, rc); - waitForChrootWatch(3); - CPPUNIT_ASSERT(count == 0); - // check for getchildren - struct String_vector children; - rc = zoo_get_children(zk_ch, "/", 0, &children); - CPPUNIT_ASSERT_EQUAL((int)ZOK, rc); - CPPUNIT_ASSERT_EQUAL((int)1, (int)children.count); - //check if te child if chroot - CPPUNIT_ASSERT(strcmp((retStr+1), children.data[0]) == 0); - // check for get/set acl - struct ACL_vector acl; - rc = zoo_get_acl(zk_ch, "/", &acl, &stat); - CPPUNIT_ASSERT_EQUAL((int)ZOK, rc); - CPPUNIT_ASSERT_EQUAL((int)1, (int)acl.count); - CPPUNIT_ASSERT_EQUAL((int)ZOO_PERM_ALL, (int)acl.data->perms); - // set acl - rc = zoo_set_acl(zk_ch, "/chroot", -1, &ZOO_READ_ACL_UNSAFE); - CPPUNIT_ASSERT_EQUAL((int) ZOK, rc); - // see if you add children - rc = zoo_create(zk_ch, "/chroot/child1", "",0, &ZOO_OPEN_ACL_UNSAFE, 0, 0, 0); - CPPUNIT_ASSERT_EQUAL((int)ZNOAUTH, rc); - //add wget children test - rc = zoo_wget_children(zk_ch, "/", watcher_chroot_fn, (char*) root, &children); - CPPUNIT_ASSERT_EQUAL((int)ZOK, rc); - - //now create a node - rc = zoo_create(zk_ch, "/child2", "",0, &ZOO_OPEN_ACL_UNSAFE, 0, 0, 0); - CPPUNIT_ASSERT_EQUAL((int) ZOK, rc); - waitForChrootWatch(3); - CPPUNIT_ASSERT(count == 0); - //check for one async call just to make sure - rc = zoo_acreate(zk_ch, "/child3", "", 0, &ZOO_OPEN_ACL_UNSAFE, 0, - create_completion_fn, 0); - waitForCreateCompletion(3); - CPPUNIT_ASSERT(count == 0); - - //ZOOKEEPER-1027 correctly return path_buffer without prefixed chroot - const char* path = "/zookeeper1027"; - char path_buffer[1024]; - int path_buffer_len=sizeof(path_buffer); - rc = zoo_create(zk_ch, path, "", 0, &ZOO_OPEN_ACL_UNSAFE, 0, path_buffer, path_buffer_len); - CPPUNIT_ASSERT_EQUAL((int) ZOK, rc); - CPPUNIT_ASSERT_EQUAL(string(path), string(path_buffer)); - } - - void testAsyncWatcherAutoReset() - { - watchctx_t ctx; - zhandle_t *zk = createClient(&ctx); - watchctx_t lctx[COUNT]; - int i; - char path[80]; - int rc; - evt_t evt; - - async_zk = zk; - for(i = 0; i < COUNT; i++) { - sprintf(path, "/awar%d", i); - rc = zoo_awexists(zk, path, watcher, &lctx[i], statCompletion, (void*)ZNONODE); - CPPUNIT_ASSERT_EQUAL((int)ZOK, rc); - } - - yield(zk, 0); - - for(i = 0; i < COUNT/2; i++) { - sprintf(path, "/awar%d", i); - rc = zoo_acreate(zk, path, "", 0, &ZOO_OPEN_ACL_UNSAFE, 0, stringCompletion, strdup(path)); - CPPUNIT_ASSERT_EQUAL((int)ZOK, rc); - } - - yield(zk, 3); - for(i = 0; i < COUNT/2; i++) { - sprintf(path, "/awar%d", i); - CPPUNIT_ASSERT_MESSAGE(path, waitForEvent(zk, &lctx[i], 5)); - evt = lctx[i].getEvent(); - CPPUNIT_ASSERT_EQUAL_MESSAGE(evt.path.c_str(), ZOO_CREATED_EVENT, evt.type); - CPPUNIT_ASSERT_EQUAL(string(path), evt.path); - } - - for(i = COUNT/2 + 1; i < COUNT*10; i++) { - sprintf(path, "/awar%d", i); - rc = zoo_acreate(zk, path, "", 0, &ZOO_OPEN_ACL_UNSAFE, 0, stringCompletion, strdup(path)); - CPPUNIT_ASSERT_EQUAL((int)ZOK, rc); - } - - yield(zk, 1); - stopServer(); - CPPUNIT_ASSERT(ctx.waitForDisconnected(zk)); - startServer(); - CPPUNIT_ASSERT(ctx.waitForConnected(zk)); - yield(zk, 3); - for(i = COUNT/2+1; i < COUNT; i++) { - sprintf(path, "/awar%d", i); - CPPUNIT_ASSERT_MESSAGE(path, waitForEvent(zk, &lctx[i], 5)); - evt = lctx[i].getEvent(); - CPPUNIT_ASSERT_EQUAL_MESSAGE(evt.path, ZOO_CREATED_EVENT, evt.type); - CPPUNIT_ASSERT_EQUAL(string(path), evt.path); - } - } - - void testWatcherAutoReset(zhandle_t *zk, watchctx_t *ctxGlobal, - watchctx_t *ctxLocal) - { - bool isGlobal = (ctxGlobal == ctxLocal); - int rc; - struct Stat stat; - char buf[1024]; - int blen; - struct String_vector strings; - const char *testName; - - rc = zoo_create(zk, "/watchtest", "", 0, - &ZOO_OPEN_ACL_UNSAFE, 0, 0, 0); - CPPUNIT_ASSERT_EQUAL((int)ZOK, rc); - rc = zoo_create(zk, "/watchtest/child", "", 0, - &ZOO_OPEN_ACL_UNSAFE, ZOO_EPHEMERAL, 0, 0); - CPPUNIT_ASSERT_EQUAL((int)ZOK, rc); - - if (isGlobal) { - testName = "GlobalTest"; - rc = zoo_get_children(zk, "/watchtest", 1, &strings); - deallocate_String_vector(&strings); - CPPUNIT_ASSERT_EQUAL((int)ZOK, rc); - blen = sizeof(buf); - rc = zoo_get(zk, "/watchtest/child", 1, buf, &blen, &stat); - CPPUNIT_ASSERT_EQUAL((int)ZOK, rc); - rc = zoo_exists(zk, "/watchtest/child2", 1, &stat); - CPPUNIT_ASSERT_EQUAL((int)ZNONODE, rc); - } else { - testName = "LocalTest"; - rc = zoo_wget_children(zk, "/watchtest", watcher, ctxLocal, - &strings); - deallocate_String_vector(&strings); - CPPUNIT_ASSERT_EQUAL((int)ZOK, rc); - blen = sizeof(buf); - rc = zoo_wget(zk, "/watchtest/child", watcher, ctxLocal, - buf, &blen, &stat); - CPPUNIT_ASSERT_EQUAL((int)ZOK, rc); - rc = zoo_wexists(zk, "/watchtest/child2", watcher, ctxLocal, - &stat); - CPPUNIT_ASSERT_EQUAL((int)ZNONODE, rc); - } - - CPPUNIT_ASSERT(ctxLocal->countEvents() == 0); - - stopServer(); - CPPUNIT_ASSERT_MESSAGE(testName, ctxGlobal->waitForDisconnected(zk)); - startServer(); - CPPUNIT_ASSERT_MESSAGE(testName, ctxLocal->waitForConnected(zk)); - - CPPUNIT_ASSERT(ctxLocal->countEvents() == 0); - - rc = zoo_set(zk, "/watchtest/child", "1", 1, -1); - CPPUNIT_ASSERT_EQUAL((int)ZOK, rc); - struct Stat stat1, stat2; - rc = zoo_set2(zk, "/watchtest/child", "1", 1, -1, &stat1); - CPPUNIT_ASSERT_EQUAL((int)ZOK, rc); - CPPUNIT_ASSERT(stat1.version >= 0); - rc = zoo_set2(zk, "/watchtest/child", "1", 1, stat1.version, &stat2); - CPPUNIT_ASSERT_EQUAL((int)ZOK, rc); - rc = zoo_set(zk, "/watchtest/child", "1", 1, stat2.version); - CPPUNIT_ASSERT_EQUAL((int)ZOK, rc); - rc = zoo_create(zk, "/watchtest/child2", "", 0, - &ZOO_OPEN_ACL_UNSAFE, 0, 0, 0); - CPPUNIT_ASSERT_EQUAL((int)ZOK, rc); - - CPPUNIT_ASSERT_MESSAGE(testName, waitForEvent(zk, ctxLocal, 5)); - - evt_t evt = ctxLocal->getEvent(); - CPPUNIT_ASSERT_EQUAL_MESSAGE(evt.path, ZOO_CHANGED_EVENT, evt.type); - CPPUNIT_ASSERT_EQUAL(string("/watchtest/child"), evt.path); - - CPPUNIT_ASSERT_MESSAGE(testName, waitForEvent(zk, ctxLocal, 5)); - // The create will trigget the get children and the - // exists watches - evt = ctxLocal->getEvent(); - CPPUNIT_ASSERT_EQUAL_MESSAGE(evt.path, ZOO_CREATED_EVENT, evt.type); - CPPUNIT_ASSERT_EQUAL(string("/watchtest/child2"), evt.path); - CPPUNIT_ASSERT_MESSAGE(testName, waitForEvent(zk, ctxLocal, 5)); - evt = ctxLocal->getEvent(); - CPPUNIT_ASSERT_EQUAL_MESSAGE(evt.path, ZOO_CHILD_EVENT, evt.type); - CPPUNIT_ASSERT_EQUAL(string("/watchtest"), evt.path); - - // Make sure Pings are giving us problems - sleep(5); - - CPPUNIT_ASSERT(ctxLocal->countEvents() == 0); - - stopServer(); - CPPUNIT_ASSERT_MESSAGE(testName, ctxGlobal->waitForDisconnected(zk)); - startServer(); - CPPUNIT_ASSERT_MESSAGE(testName, ctxGlobal->waitForConnected(zk)); - - if (isGlobal) { - testName = "GlobalTest"; - rc = zoo_get_children(zk, "/watchtest", 1, &strings); - deallocate_String_vector(&strings); - CPPUNIT_ASSERT_EQUAL((int)ZOK, rc); - blen = sizeof(buf); - rc = zoo_get(zk, "/watchtest/child", 1, buf, &blen, &stat); - CPPUNIT_ASSERT_EQUAL((int)ZOK, rc); - rc = zoo_exists(zk, "/watchtest/child2", 1, &stat); - CPPUNIT_ASSERT_EQUAL((int)ZOK, rc); - } else { - testName = "LocalTest"; - rc = zoo_wget_children(zk, "/watchtest", watcher, ctxLocal, - &strings); - deallocate_String_vector(&strings); - CPPUNIT_ASSERT_EQUAL((int)ZOK, rc); - blen = sizeof(buf); - rc = zoo_wget(zk, "/watchtest/child", watcher, ctxLocal, - buf, &blen, &stat); - CPPUNIT_ASSERT_EQUAL((int)ZOK, rc); - rc = zoo_wexists(zk, "/watchtest/child2", watcher, ctxLocal, - &stat); - CPPUNIT_ASSERT_EQUAL((int)ZOK, rc); - } - - zoo_delete(zk, "/watchtest/child2", -1); - - CPPUNIT_ASSERT_MESSAGE(testName, waitForEvent(zk, ctxLocal, 5)); - - evt = ctxLocal->getEvent(); - CPPUNIT_ASSERT_EQUAL_MESSAGE(evt.path, ZOO_DELETED_EVENT, evt.type); - CPPUNIT_ASSERT_EQUAL(string("/watchtest/child2"), evt.path); - - CPPUNIT_ASSERT_MESSAGE(testName, waitForEvent(zk, ctxLocal, 5)); - evt = ctxLocal->getEvent(); - CPPUNIT_ASSERT_EQUAL_MESSAGE(evt.path, ZOO_CHILD_EVENT, evt.type); - CPPUNIT_ASSERT_EQUAL(string("/watchtest"), evt.path); - - stopServer(); - CPPUNIT_ASSERT_MESSAGE(testName, ctxGlobal->waitForDisconnected(zk)); - startServer(); - CPPUNIT_ASSERT_MESSAGE(testName, ctxLocal->waitForConnected(zk)); - - zoo_delete(zk, "/watchtest/child", -1); - zoo_delete(zk, "/watchtest", -1); - - CPPUNIT_ASSERT_MESSAGE(testName, waitForEvent(zk, ctxLocal, 5)); - - evt = ctxLocal->getEvent(); - CPPUNIT_ASSERT_EQUAL_MESSAGE(evt.path, ZOO_DELETED_EVENT, evt.type); - CPPUNIT_ASSERT_EQUAL(string("/watchtest/child"), evt.path); - - // Make sure nothing is straggling - sleep(1); - CPPUNIT_ASSERT(ctxLocal->countEvents() == 0); - } - - void testWatcherAutoResetWithGlobal() - { - { - watchctx_t ctx; - zhandle_t *zk = createClient(&ctx); - int rc = zoo_create(zk, "/testarwg", "", 0, &ZOO_OPEN_ACL_UNSAFE, 0, 0, 0); - CPPUNIT_ASSERT_EQUAL((int) ZOK, rc); - rc = zoo_create(zk, "/testarwg/arwg", "", 0, &ZOO_OPEN_ACL_UNSAFE, 0, 0, 0); - CPPUNIT_ASSERT_EQUAL((int) ZOK, rc); - } - - { - watchctx_t ctx; - zhandle_t *zk = createchClient(&ctx, "127.0.0.1:22181/testarwg/arwg"); - - testWatcherAutoReset(zk, &ctx, &ctx); - } - } - - void testWatcherAutoResetWithLocal() - { - { - watchctx_t ctx; - zhandle_t *zk = createClient(&ctx); - int rc = zoo_create(zk, "/testarwl", "", 0, &ZOO_OPEN_ACL_UNSAFE, 0, 0, 0); - CPPUNIT_ASSERT_EQUAL((int) ZOK, rc); - rc = zoo_create(zk, "/testarwl/arwl", "", 0, &ZOO_OPEN_ACL_UNSAFE, 0, 0, 0); - CPPUNIT_ASSERT_EQUAL((int) ZOK, rc); - } - - { - watchctx_t ctx; - watchctx_t lctx; - zhandle_t *zk = createchClient(&ctx, "127.0.0.1:22181/testarwl/arwl"); - testWatcherAutoReset(zk, &ctx, &lctx); - } - } -}; - -volatile int Zookeeper_simpleSystem::count; -zhandle_t *Zookeeper_simpleSystem::async_zk; -const char Zookeeper_simpleSystem::hostPorts[] = "127.0.0.1:22181"; -CPPUNIT_TEST_SUITE_REGISTRATION(Zookeeper_simpleSystem); diff --git a/pkg/registry/zookeeper-3.4.6/src/c/tests/TestClientRetry.cc b/pkg/registry/zookeeper-3.4.6/src/c/tests/TestClientRetry.cc deleted file mode 100644 index 41d517986..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/c/tests/TestClientRetry.cc +++ /dev/null @@ -1,273 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you 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. - */ - -#include -#include "CppAssertHelper.h" - -#include -#include -#include -#include - -#include "CollectionUtil.h" -#include "ThreadingUtil.h" - -using namespace Util; - -#include "Vector.h" -using namespace std; - -#include -#include - -#include - -#include "Util.h" - -#ifdef THREADED - static void yield(zhandle_t *zh, int i) - { - sleep(i); - } -#else - static void yield(zhandle_t *zh, int seconds) - { - int fd; - int interest; - int events; - struct timeval tv; - int rc; - time_t expires = time(0) + seconds; - time_t timeLeft = seconds; - fd_set rfds, wfds, efds; - FD_ZERO(&rfds); - FD_ZERO(&wfds); - FD_ZERO(&efds); - - while(timeLeft >= 0) { - zookeeper_interest(zh, &fd, &interest, &tv); - if (fd != -1) { - if (interest&ZOOKEEPER_READ) { - FD_SET(fd, &rfds); - } else { - FD_CLR(fd, &rfds); - } - if (interest&ZOOKEEPER_WRITE) { - FD_SET(fd, &wfds); - } else { - FD_CLR(fd, &wfds); - } - } else { - fd = 0; - } - FD_SET(0, &rfds); - if (tv.tv_sec > timeLeft) { - tv.tv_sec = timeLeft; - } - rc = select(fd+1, &rfds, &wfds, &efds, &tv); - timeLeft = expires - time(0); - events = 0; - if (FD_ISSET(fd, &rfds)) { - events |= ZOOKEEPER_READ; - } - if (FD_ISSET(fd, &wfds)) { - events |= ZOOKEEPER_WRITE; - } - zookeeper_process(zh, events); - } - } -#endif - -typedef struct evt { - string path; - int type; -} evt_t; - -typedef struct watchCtx { -private: - list events; -public: - bool connected; - zhandle_t *zh; - Mutex mutex; - - watchCtx() { - connected = false; - zh = 0; - } - ~watchCtx() { - if (zh) { - zookeeper_close(zh); - zh = 0; - } - } - - evt_t getEvent() { - evt_t evt; - mutex.acquire(); - CPPUNIT_ASSERT( events.size() > 0); - evt = events.front(); - events.pop_front(); - mutex.release(); - return evt; - } - - int countEvents() { - int count; - mutex.acquire(); - count = events.size(); - mutex.release(); - return count; - } - - void putEvent(evt_t evt) { - mutex.acquire(); - events.push_back(evt); - mutex.release(); - } - - bool waitForConnected(zhandle_t *zh) { - time_t expires = time(0) + 10; - while(!connected && time(0) < expires) { - yield(zh, 1); - } - return connected; - } - bool waitForDisconnected(zhandle_t *zh) { - time_t expires = time(0) + 15; - while(connected && time(0) < expires) { - yield(zh, 1); - } - return !connected; - } -} watchctx_t; - -class Zookeeper_clientretry : public CPPUNIT_NS::TestFixture -{ - CPPUNIT_TEST_SUITE(Zookeeper_clientretry); -#ifdef THREADED - CPPUNIT_TEST(testRetry); -#endif - CPPUNIT_TEST_SUITE_END(); - - static void watcher(zhandle_t *, int type, int state, const char *path,void*v){ - watchctx_t *ctx = (watchctx_t*)v; - - if (state == ZOO_CONNECTED_STATE) { - ctx->connected = true; - } else { - ctx->connected = false; - } - if (type != ZOO_SESSION_EVENT) { - evt_t evt; - evt.path = path; - evt.type = type; - ctx->putEvent(evt); - } - } - - static const char hostPorts[]; - - const char *getHostPorts() { - return hostPorts; - } - - zhandle_t *createClient(watchctx_t *ctx) { - zhandle_t *zk = zookeeper_init(hostPorts, watcher, 10000, 0, - ctx, 0); - ctx->zh = zk; - sleep(1); - return zk; - } - - FILE *logfile; -public: - - Zookeeper_clientretry() { - logfile = openlogfile("Zookeeper_clientretry"); - } - - ~Zookeeper_clientretry() { - if (logfile) { - fflush(logfile); - fclose(logfile); - logfile = 0; - } - } - - void setUp() - { - zoo_set_log_stream(logfile); - - char cmd[1024]; - sprintf(cmd, "%s stop %s", ZKSERVER_CMD, getHostPorts()); - CPPUNIT_ASSERT(system(cmd) == 0); - - /* we are testing that if max cnxns is exceeded the server does the right thing */ - sprintf(cmd, "export ZKMAXCNXNS=1;%s startClean %s", ZKSERVER_CMD, getHostPorts()); - CPPUNIT_ASSERT(system(cmd) == 0); - - struct sigaction act; - act.sa_handler = SIG_IGN; - sigemptyset(&act.sa_mask); - act.sa_flags = 0; - CPPUNIT_ASSERT(sigaction(SIGPIPE, &act, NULL) == 0); - } - - void tearDown() - { - char cmd[1024]; - sprintf(cmd, "%s stop %s", ZKSERVER_CMD, getHostPorts()); - CPPUNIT_ASSERT(system(cmd) == 0); - - /* restart the server in "normal" mode */ - sprintf(cmd, "%s startClean %s", ZKSERVER_CMD, getHostPorts()); - CPPUNIT_ASSERT(system(cmd) == 0); - - struct sigaction act; - act.sa_handler = SIG_IGN; - sigemptyset(&act.sa_mask); - act.sa_flags = 0; - CPPUNIT_ASSERT(sigaction(SIGPIPE, &act, NULL) == 0); - } - - bool waitForEvent(zhandle_t *zh, watchctx_t *ctx, int seconds) { - time_t expires = time(0) + seconds; - while(ctx->countEvents() == 0 && time(0) < expires) { - yield(zh, 1); - } - return ctx->countEvents() > 0; - } - - static zhandle_t *async_zk; - - void testRetry() - { - watchctx_t ctx1, ctx2; - zhandle_t *zk1 = createClient(&ctx1); - CPPUNIT_ASSERT_EQUAL(true, ctx1.waitForConnected(zk1)); - zhandle_t *zk2 = createClient(&ctx2); - zookeeper_close(zk1); - CPPUNIT_ASSERT_EQUAL(true, ctx2.waitForConnected(zk2)); - ctx1.zh = 0; - } -}; - -zhandle_t *Zookeeper_clientretry::async_zk; -const char Zookeeper_clientretry::hostPorts[] = "127.0.0.1:22181"; -CPPUNIT_TEST_SUITE_REGISTRATION(Zookeeper_clientretry); diff --git a/pkg/registry/zookeeper-3.4.6/src/c/tests/TestDriver.cc b/pkg/registry/zookeeper-3.4.6/src/c/tests/TestDriver.cc deleted file mode 100644 index 3f32ba483..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/c/tests/TestDriver.cc +++ /dev/null @@ -1,173 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you 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. - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include "Util.h" -#include "zookeeper_log.h" - -using namespace std; - -CPPUNIT_NS_BEGIN - -class EclipseOutputter: public CompilerOutputter -{ -public: - EclipseOutputter(TestResultCollector *result,ostream &stream): - CompilerOutputter(result,stream,"%p:%l: "),stream_(stream) - { - } - virtual void printFailedTestName( TestFailure *failure ){} - virtual void printFailureMessage( TestFailure *failure ) - { - stream_<<": "; - Message msg = failure->thrownException()->message(); - stream_<< msg.shortDescription(); - - string text; - for(int i=0; i the output must be in the compiler error format. - //bool selfTest = (argc > 1) && (std::string("-ide") == argv[1]); - globalTestConfig.addConfigFromCmdLine(argc,argv); - - ZKServer zkserver; - - // Create the event manager and test controller - CPPUNIT_NS::TestResult controller; - // Add a listener that colllects test result - CPPUNIT_NS::TestResultCollector result; - controller.addListener( &result ); - - // A listener that print dots as tests run. - // CPPUNIT_NS::TextTestProgressListener progress; - // CPPUNIT_NS::BriefTestProgressListener progress; - - // brief + elapsed time - TimingListener progress; - controller.addListener( &progress ); - - CPPUNIT_NS::TestRunner runner; - runner.addTest( CPPUNIT_NS::TestFactoryRegistry::getRegistry().makeTest() ); - - try { - CPPUNIT_NS::stdCOut() << "Running " << endl; - - zoo_set_debug_level(ZOO_LOG_LEVEL_INFO); - //zoo_set_debug_level(ZOO_LOG_LEVEL_DEBUG); - - runner.run( controller, globalTestConfig.getTestName()); - - // Print test in a compiler compatible format. - CPPUNIT_NS::EclipseOutputter outputter( &result,cout); - outputter.write(); - - // Uncomment this for XML output -#ifdef ENABLE_XML_OUTPUT - std::ofstream file( "tests.xml" ); - CPPUNIT_NS::XmlOutputter xml( &result, file ); - xml.setStyleSheet( "report.xsl" ); - xml.write(); - file.close(); -#endif - } catch ( std::invalid_argument &e ) { - // Test path not resolved - cout<<"\nERROR: "< -#include "CppAssertHelper.h" - -#include -#include -#include -#include - -#include "CollectionUtil.h" -#include "ThreadingUtil.h" - -using namespace Util; - -#include "Vector.h" -using namespace std; - -#include -#include - -#include -#include -#include -#include "Util.h" - -#ifdef THREADED - static void yield(zhandle_t *zh, int i) - { - sleep(i); - } -#else - static void yield(zhandle_t *zh, int seconds) - { - int fd; - int interest; - int events; - struct timeval tv; - int rc; - time_t expires = time(0) + seconds; - time_t timeLeft = seconds; - fd_set rfds, wfds, efds; - FD_ZERO(&rfds); - FD_ZERO(&wfds); - FD_ZERO(&efds); - - while(timeLeft >= 0) { - zookeeper_interest(zh, &fd, &interest, &tv); - if (fd != -1) { - if (interest&ZOOKEEPER_READ) { - FD_SET(fd, &rfds); - } else { - FD_CLR(fd, &rfds); - } - if (interest&ZOOKEEPER_WRITE) { - FD_SET(fd, &wfds); - } else { - FD_CLR(fd, &wfds); - } - } else { - fd = 0; - } - FD_SET(0, &rfds); - if (tv.tv_sec > timeLeft) { - tv.tv_sec = timeLeft; - } - rc = select(fd+1, &rfds, &wfds, &efds, &tv); - timeLeft = expires - time(0); - events = 0; - if (FD_ISSET(fd, &rfds)) { - events |= ZOOKEEPER_READ; - } - if (FD_ISSET(fd, &wfds)) { - events |= ZOOKEEPER_WRITE; - } - zookeeper_process(zh, events); - } - } -#endif - -typedef struct evt { - string path; - int type; -} evt_t; - -typedef struct watchCtx { -private: - list events; - watchCtx(const watchCtx&); - watchCtx& operator=(const watchCtx&); -public: - bool connected; - zhandle_t *zh; - Mutex mutex; - - watchCtx() { - connected = false; - zh = 0; - } - ~watchCtx() { - if (zh) { - zookeeper_close(zh); - zh = 0; - } - } - - evt_t getEvent() { - evt_t evt; - mutex.acquire(); - CPPUNIT_ASSERT( events.size() > 0); - evt = events.front(); - events.pop_front(); - mutex.release(); - return evt; - } - - int countEvents() { - int count; - mutex.acquire(); - count = events.size(); - mutex.release(); - return count; - } - - void putEvent(evt_t evt) { - mutex.acquire(); - events.push_back(evt); - mutex.release(); - } - - bool waitForConnected(zhandle_t *zh) { - time_t expires = time(0) + 10; - while(!connected && time(0) < expires) { - yield(zh, 1); - } - return connected; - } - bool waitForDisconnected(zhandle_t *zh) { - time_t expires = time(0) + 15; - while(connected && time(0) < expires) { - yield(zh, 1); - } - return !connected; - } -} watchctx_t; - -class Zookeeper_multi : public CPPUNIT_NS::TestFixture -{ - CPPUNIT_TEST_SUITE(Zookeeper_multi); -//FIXME: None of these tests pass in single-threaded mode. It seems to be a -//flaw in the test suite setup. -#ifdef THREADED - CPPUNIT_TEST(testCreate); - CPPUNIT_TEST(testCreateDelete); - CPPUNIT_TEST(testInvalidVersion); - CPPUNIT_TEST(testNestedCreate); - CPPUNIT_TEST(testSetData); - CPPUNIT_TEST(testUpdateConflict); - CPPUNIT_TEST(testDeleteUpdateConflict); - CPPUNIT_TEST(testAsyncMulti); - CPPUNIT_TEST(testMultiFail); - CPPUNIT_TEST(testCheck); - CPPUNIT_TEST(testWatch); - CPPUNIT_TEST(testSequentialNodeCreateInAsyncMulti); -#endif - CPPUNIT_TEST_SUITE_END(); - - static void watcher(zhandle_t *, int type, int state, const char *path,void*v){ - watchctx_t *ctx = (watchctx_t*)v; - - if (state == ZOO_CONNECTED_STATE) { - ctx->connected = true; - } else { - ctx->connected = false; - } - if (type != ZOO_SESSION_EVENT) { - evt_t evt; - evt.path = path; - evt.type = type; - ctx->putEvent(evt); - } - } - - static const char hostPorts[]; - - const char *getHostPorts() { - return hostPorts; - } - - zhandle_t *createClient(watchctx_t *ctx) { - return createClient(hostPorts, ctx); - } - - zhandle_t *createClient(const char *hp, watchctx_t *ctx) { - zhandle_t *zk = zookeeper_init(hp, watcher, 10000, 0, ctx, 0); - ctx->zh = zk; - CPPUNIT_ASSERT_EQUAL(true, ctx->waitForConnected(zk)); - return zk; - } - - FILE *logfile; -public: - - Zookeeper_multi() { - logfile = openlogfile("Zookeeper_multi"); - } - - ~Zookeeper_multi() { - if (logfile) { - fflush(logfile); - fclose(logfile); - logfile = 0; - } - } - - void setUp() - { - zoo_set_log_stream(logfile); - } - - void tearDown() - { - } - - static volatile int count; - - static void multi_completion_fn(int rc, const void *data) { - CPPUNIT_ASSERT_EQUAL((int) ZOK, rc); - count++; - } - - static void multi_completion_fn_no_assert(int rc, const void *data) { - count++; - } - - static void waitForMultiCompletion(int seconds) { - time_t expires = time(0) + seconds; - while(count == 0 && time(0) < expires) { - sleep(1); - } - count--; - } - - static void resetCounter() { - count = 0; - } - - /** - * Test basic multi-op create functionality - */ - void testCreate() { - int rc; - watchctx_t ctx; - zhandle_t *zk = createClient(&ctx); - - int sz = 512; - char p1[sz]; - char p2[sz]; - char p3[sz]; - p1[0] = p2[0] = p3[0] = '\0'; - - int nops = 3 ; - zoo_op_t ops[nops]; - zoo_op_result_t results[nops]; - - zoo_create_op_init(&ops[0], "/multi1", "", 0, &ZOO_OPEN_ACL_UNSAFE, 0, p1, sz); - zoo_create_op_init(&ops[1], "/multi1/a", "", 0, &ZOO_OPEN_ACL_UNSAFE, 0, p2, sz); - zoo_create_op_init(&ops[2], "/multi1/b", "", 0, &ZOO_OPEN_ACL_UNSAFE, 0, p3, sz); - - rc = zoo_multi(zk, nops, ops, results); - CPPUNIT_ASSERT_EQUAL((int)ZOK, rc); - - CPPUNIT_ASSERT(strcmp(p1, "/multi1") == 0); - CPPUNIT_ASSERT(strcmp(p2, "/multi1/a") == 0); - CPPUNIT_ASSERT(strcmp(p3, "/multi1/b") == 0); - - CPPUNIT_ASSERT_EQUAL((int)ZOK, results[0].err); - CPPUNIT_ASSERT_EQUAL((int)ZOK, results[1].err); - CPPUNIT_ASSERT_EQUAL((int)ZOK, results[2].err); - } - - /** - * Test create followed by delete - */ - void testCreateDelete() { - int rc; - watchctx_t ctx; - zhandle_t *zk = createClient(&ctx); - int sz = 512; - char p1[sz]; - p1[0] = '\0'; - int nops = 2 ; - zoo_op_t ops[nops]; - zoo_op_result_t results[nops]; - - zoo_create_op_init(&ops[0], "/multi2", "", 0, &ZOO_OPEN_ACL_UNSAFE, 0, p1, sz); - zoo_delete_op_init(&ops[1], "/multi2", 0); - - rc = zoo_multi(zk, nops, ops, results); - CPPUNIT_ASSERT_EQUAL((int)ZOK, rc); - - // '/multi2' should have been deleted - rc = zoo_exists(zk, "/multi2", 0, NULL); - CPPUNIT_ASSERT_EQUAL((int)ZNONODE, rc); - } - - /** - * Test invalid versions - */ - void testInvalidVersion() { - int rc; - watchctx_t ctx; - zhandle_t *zk = createClient(&ctx); - int nops = 4; - zoo_op_t ops[nops]; - zoo_op_result_t results[nops]; - - zoo_create_op_init(&ops[0], "/multi3", "", 0, &ZOO_OPEN_ACL_UNSAFE, 0, NULL, 0); - zoo_delete_op_init(&ops[1], "/multi3", 1); - zoo_create_op_init(&ops[2], "/multi3", "", 0, &ZOO_OPEN_ACL_UNSAFE, 0, NULL, 0); - zoo_create_op_init(&ops[3], "/multi3/a", "", 0, &ZOO_OPEN_ACL_UNSAFE, 0, NULL, 0); - - rc = zoo_multi(zk, nops, ops, results); - CPPUNIT_ASSERT_EQUAL((int)ZBADVERSION, rc); - CPPUNIT_ASSERT_EQUAL((int)ZOK, results[0].err); - CPPUNIT_ASSERT_EQUAL((int)ZBADVERSION, results[1].err); - CPPUNIT_ASSERT_EQUAL((int)ZRUNTIMEINCONSISTENCY, results[2].err); - CPPUNIT_ASSERT_EQUAL((int)ZRUNTIMEINCONSISTENCY, results[3].err); - } - - /** - * Test nested creates that rely on state in earlier op in multi - */ - void testNestedCreate() { - int rc; - watchctx_t ctx; - zhandle_t *zk = createClient(&ctx); - int sz = 512; - char p1[sz]; - p1[0] = '\0'; - int nops = 6; - zoo_op_t ops[nops]; - zoo_op_result_t results[nops]; - - /* Create */ - zoo_create_op_init(&ops[0], "/multi4", "", 0, &ZOO_OPEN_ACL_UNSAFE, 0, p1, sz); - zoo_create_op_init(&ops[1], "/multi4/a", "", 0, &ZOO_OPEN_ACL_UNSAFE, 0, p1, sz); - zoo_create_op_init(&ops[2], "/multi4/a/1", "", 0, &ZOO_OPEN_ACL_UNSAFE, 0, p1, sz); - - /* Delete */ - zoo_delete_op_init(&ops[3], "/multi4/a/1", 0); - zoo_delete_op_init(&ops[4], "/multi4/a", 0); - zoo_delete_op_init(&ops[5], "/multi4", 0); - - rc = zoo_multi(zk, nops, ops, results); - CPPUNIT_ASSERT_EQUAL((int)ZOK, rc); - - // Verify tree deleted - rc = zoo_exists(zk, "/multi4/a/1", 0, NULL); - CPPUNIT_ASSERT_EQUAL((int)ZNONODE, rc); - - rc = zoo_exists(zk, "/multi4/a", 0, NULL); - CPPUNIT_ASSERT_EQUAL((int)ZNONODE, rc); - - rc = zoo_exists(zk, "/multi4", 0, NULL); - CPPUNIT_ASSERT_EQUAL((int)ZNONODE, rc); - } - - /** - * Test setdata functionality - */ - void testSetData() { - int rc; - watchctx_t ctx; - zhandle_t *zk = createClient(&ctx); - int sz = 512; - struct Stat s1; - - char buf[sz]; - int blen = sz ; - - char p1[sz], p2[sz]; - - int nops = 2; - zoo_op_t ops[nops]; - zoo_op_result_t results[nops]; - - zoo_create_op_init(&ops[0], "/multi5", "", 0, &ZOO_OPEN_ACL_UNSAFE, 0, p1, sz); - zoo_create_op_init(&ops[1], "/multi5/a", "", 0, &ZOO_OPEN_ACL_UNSAFE, 0, p2, sz); - - rc = zoo_multi(zk, nops, ops, results); - CPPUNIT_ASSERT_EQUAL((int)ZOK, rc); - - yield(zk, 5); - - zoo_op_t setdata_ops[nops]; - zoo_op_result_t setdata_results[nops]; - - zoo_set_op_init(&setdata_ops[0], "/multi5", "1", 1, 0, &s1); - zoo_set_op_init(&setdata_ops[1], "/multi5/a", "2", 1, 0, &s1); - - rc = zoo_multi(zk, nops, setdata_ops, setdata_results); - CPPUNIT_ASSERT_EQUAL((int)ZOK, rc); - CPPUNIT_ASSERT_EQUAL((int)ZOK, results[0].err); - CPPUNIT_ASSERT_EQUAL((int)ZOK, results[1].err); - - memset(buf, '\0', blen); - rc = zoo_get(zk, "/multi5", 0, buf, &blen, &s1); - CPPUNIT_ASSERT_EQUAL((int)ZOK, rc); - CPPUNIT_ASSERT_EQUAL(1, blen); - CPPUNIT_ASSERT(strcmp("1", buf) == 0); - - memset(buf, '\0', blen); - rc = zoo_get(zk, "/multi5/a", 0, buf, &blen, &s1); - CPPUNIT_ASSERT_EQUAL((int)ZOK, rc); - CPPUNIT_ASSERT_EQUAL(1, blen); - CPPUNIT_ASSERT(strcmp("2", buf) == 0); - } - - /** - * Test update conflicts - */ - void testUpdateConflict() { - int rc; - watchctx_t ctx; - zhandle_t *zk = createClient(&ctx); - int sz = 512; - char buf[sz]; - int blen = sz; - char p1[sz]; - p1[0] = '\0'; - struct Stat s1; - int nops = 3; - zoo_op_t ops[nops]; - zoo_op_result_t results[nops]; - - zoo_create_op_init(&ops[0], "/multi6", "", 0, &ZOO_OPEN_ACL_UNSAFE, 0, p1, sz); - zoo_set_op_init(&ops[1], "/multi6", "X", 1, 0, &s1); - zoo_set_op_init(&ops[2], "/multi6", "Y", 1, 0, &s1); - - rc = zoo_multi(zk, nops, ops, results); - CPPUNIT_ASSERT_EQUAL((int)ZBADVERSION, rc); - - //Updating version solves conflict -- order matters - ops[2].set_op.version = 1; - rc = zoo_multi(zk, nops, ops, results); - CPPUNIT_ASSERT_EQUAL((int)ZOK, rc); - - memset(buf, 0, sz); - rc = zoo_get(zk, "/multi6", 0, buf, &blen, &s1); - CPPUNIT_ASSERT_EQUAL((int)ZOK, rc); - CPPUNIT_ASSERT_EQUAL(blen, 1); - CPPUNIT_ASSERT(strncmp(buf, "Y", 1) == 0); - } - - /** - * Test delete-update conflicts - */ - void testDeleteUpdateConflict() { - int rc; - watchctx_t ctx; - zhandle_t *zk = createClient(&ctx); - int sz = 512; - char buf[sz]; - int blen; - char p1[sz]; - p1[0] = '\0'; - struct Stat stat; - int nops = 3; - zoo_op_t ops[nops]; - zoo_op_result_t results[nops]; - - zoo_create_op_init(&ops[0], "/multi7", "", 0, &ZOO_OPEN_ACL_UNSAFE, 0, p1, sz); - zoo_delete_op_init(&ops[1], "/multi7", 0); - zoo_set_op_init(&ops[2], "/multi7", "Y", 1, 0, &stat); - - rc = zoo_multi(zk, nops, ops, results); - CPPUNIT_ASSERT_EQUAL((int)ZNONODE, rc); - - // '/multi' should never have been created as entire op should fail - rc = zoo_exists(zk, "/multi7", 0, NULL); - CPPUNIT_ASSERT_EQUAL((int)ZNONODE, rc); - } - - void testAsyncMulti() { - int rc; - watchctx_t ctx; - zhandle_t *zk = createClient(&ctx); - - int sz = 512; - char p1[sz], p2[sz], p3[sz]; - p1[0] = '\0'; - p2[0] = '\0'; - p3[0] = '\0'; - - int nops = 3; - zoo_op_t ops[nops]; - zoo_op_result_t results[nops]; - - zoo_create_op_init(&ops[0], "/multi8", "", 0, &ZOO_OPEN_ACL_UNSAFE, 0, p1, sz); - zoo_create_op_init(&ops[1], "/multi8/a", "", 0, &ZOO_OPEN_ACL_UNSAFE, 0, p2, sz); - zoo_create_op_init(&ops[2], "/multi8/b", "", 0, &ZOO_OPEN_ACL_UNSAFE, 0, p3, sz); - - rc = zoo_amulti(zk, nops, ops, results, multi_completion_fn, 0); - waitForMultiCompletion(10); - CPPUNIT_ASSERT_EQUAL((int)ZOK, rc); - - CPPUNIT_ASSERT(strcmp(p1, "/multi8") == 0); - CPPUNIT_ASSERT(strcmp(p2, "/multi8/a") == 0); - CPPUNIT_ASSERT(strcmp(p3, "/multi8/b") == 0); - - CPPUNIT_ASSERT_EQUAL((int)ZOK, results[0].err); - CPPUNIT_ASSERT_EQUAL((int)ZOK, results[1].err); - CPPUNIT_ASSERT_EQUAL((int)ZOK, results[2].err); - } - - void testMultiFail() { - int rc; - watchctx_t ctx; - zhandle_t *zk = createClient(&ctx); - - int sz = 512; - char p1[sz], p2[sz], p3[sz]; - - p1[0] = '\0'; - p2[0] = '\0'; - p3[0] = '\0'; - - int nops = 3; - zoo_op_t ops[nops]; - zoo_op_result_t results[nops]; - - zoo_create_op_init(&ops[0], "/multi9", "", 0, &ZOO_OPEN_ACL_UNSAFE, 0, p1, sz); - zoo_create_op_init(&ops[1], "/multi9", "", 0, &ZOO_OPEN_ACL_UNSAFE, 0, p2, sz); - zoo_create_op_init(&ops[2], "/multi9/b", "", 0, &ZOO_OPEN_ACL_UNSAFE, 0, p3, sz); - - rc = zoo_multi(zk, nops, ops, results); - CPPUNIT_ASSERT_EQUAL((int)ZNODEEXISTS, rc); - } - - /** - * Test basic multi-op check functionality - */ - void testCheck() { - int rc; - watchctx_t ctx; - zhandle_t *zk = createClient(&ctx); - int sz = 512; - char p1[sz]; - p1[0] = '\0'; - struct Stat s1; - - rc = zoo_create(zk, "/multi0", "", 0, &ZOO_OPEN_ACL_UNSAFE, 0, p1, sz); - CPPUNIT_ASSERT_EQUAL((int)ZOK, rc); - - // Conditionally create /multi0/a' only if '/multi0' at version 0 - int nops = 2; - zoo_op_t ops[nops]; - zoo_op_result_t results[nops]; - - zoo_check_op_init(&ops[0], "/multi0", 0); - zoo_create_op_init(&ops[1], "/multi0/a", "", 0, &ZOO_OPEN_ACL_UNSAFE, 0, p1, sz); - - rc = zoo_multi(zk, nops, ops, results); - CPPUNIT_ASSERT_EQUAL((int)ZOK, rc); - - CPPUNIT_ASSERT_EQUAL((int)ZOK, results[0].err); - CPPUNIT_ASSERT_EQUAL((int)ZOK, results[1].err); - - // '/multi0/a' should have been created as it passed version check - rc = zoo_exists(zk, "/multi0/a", 0, NULL); - CPPUNIT_ASSERT_EQUAL((int)ZOK, rc); - - // Only create '/multi0/b' if '/multi0' at version 10 (which it's not) - zoo_op_t ops2[nops]; - zoo_check_op_init(&ops2[0], "/multi0", 10); - zoo_create_op_init(&ops2[1], "/multi0/b", "", 0, &ZOO_OPEN_ACL_UNSAFE, 0, p1, sz); - - rc = zoo_multi(zk, nops, ops2, results); - CPPUNIT_ASSERT_EQUAL((int)ZBADVERSION, rc); - - CPPUNIT_ASSERT_EQUAL((int)ZBADVERSION, results[0].err); - CPPUNIT_ASSERT_EQUAL((int)ZRUNTIMEINCONSISTENCY, results[1].err); - - // '/multi0/b' should NOT have been created - rc = zoo_exists(zk, "/multi0/b", 0, NULL); - CPPUNIT_ASSERT_EQUAL((int)ZNONODE, rc); - } - - /** - * Do a multi op inside a watch callback context. - */ - static void doMultiInWatch(zhandle_t *zk, int type, int state, const char *path, void *ctx) { - int rc; - int sz = 512; - char p1[sz]; - p1[0] = '\0'; - struct Stat s1; - - int nops = 1; - zoo_op_t ops[nops]; - zoo_op_result_t results[nops]; - - zoo_set_op_init(&ops[0], "/multiwatch", "1", 1, -1, NULL); - - rc = zoo_multi(zk, nops, ops, results); - CPPUNIT_ASSERT_EQUAL((int)ZOK, rc); - CPPUNIT_ASSERT_EQUAL((int)ZOK, results[0].err); - - memset(p1, '\0', sz); - rc = zoo_get(zk, "/multiwatch", 0, p1, &sz, &s1); - CPPUNIT_ASSERT_EQUAL((int)ZOK, rc); - CPPUNIT_ASSERT_EQUAL(1, sz); - CPPUNIT_ASSERT(strcmp("1", p1) == 0); - count++; - } - - /** - * Test multi-op called from a watch - */ - void testWatch() { - int rc; - watchctx_t ctx; - zhandle_t *zk = createClient(&ctx); - int sz = 512; - char p1[sz]; - p1[0] = '\0'; - - rc = zoo_create(zk, "/multiwatch", "", 0, &ZOO_OPEN_ACL_UNSAFE, 0, NULL, 0); - CPPUNIT_ASSERT_EQUAL((int)ZOK, rc); - - // create a watch on node '/multiwatch' - rc = zoo_wget(zk, "/multiwatch", doMultiInWatch, &ctx, p1, &sz, NULL); - - // setdata on node '/multiwatch' this should trip the watch - rc = zoo_set(zk, "/multiwatch", NULL, -1, -1); - CPPUNIT_ASSERT_EQUAL((int) ZOK, rc); - - // wait for multi completion in doMultiInWatch - waitForMultiCompletion(5); - } - - /** - * ZOOKEEPER-1624: PendingChanges of create sequential node request didn't - * get rollbacked correctly when multi-op failed. This caused - * create sequential node request in subsequent multi-op to failed because - * sequential node name generation is incorrect. - * - * The check is to make sure that each request in multi-op failed with - * the correct reason. - */ - void testSequentialNodeCreateInAsyncMulti() { - int rc; - watchctx_t ctx; - zhandle_t *zk = createClient(&ctx); - - int iteration = 4; - int nops = 2; - - zoo_op_result_t results[iteration][nops]; - zoo_op_t ops[nops]; - zoo_create_op_init(&ops[0], "/node-", "", 0, &ZOO_OPEN_ACL_UNSAFE, ZOO_SEQUENCE, NULL, 0); - zoo_create_op_init(&ops[1], "/dup", "", 0, &ZOO_OPEN_ACL_UNSAFE, 0, NULL, 0); - for (int i = 0; i < iteration ; ++i) { - rc = zoo_amulti(zk, nops, ops, results[i], multi_completion_fn_no_assert, 0); - CPPUNIT_ASSERT_EQUAL((int)ZOK, rc); - } - - waitForMultiCompletion(10); - - CPPUNIT_ASSERT_EQUAL((int)ZOK, results[0][0].err); - CPPUNIT_ASSERT_EQUAL((int)ZOK, results[1][0].err); - CPPUNIT_ASSERT_EQUAL((int)ZOK, results[2][0].err); - CPPUNIT_ASSERT_EQUAL((int)ZOK, results[3][0].err); - - CPPUNIT_ASSERT_EQUAL((int)ZOK, results[0][1].err); - CPPUNIT_ASSERT_EQUAL((int)ZNODEEXISTS, results[1][1].err); - CPPUNIT_ASSERT_EQUAL((int)ZNODEEXISTS, results[2][1].err); - CPPUNIT_ASSERT_EQUAL((int)ZNODEEXISTS, results[3][1].err); - - resetCounter(); - } -}; - -volatile int Zookeeper_multi::count; -const char Zookeeper_multi::hostPorts[] = "127.0.0.1:22181"; -CPPUNIT_TEST_SUITE_REGISTRATION(Zookeeper_multi); diff --git a/pkg/registry/zookeeper-3.4.6/src/c/tests/TestOperations.cc b/pkg/registry/zookeeper-3.4.6/src/c/tests/TestOperations.cc deleted file mode 100644 index b0370e9af..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/c/tests/TestOperations.cc +++ /dev/null @@ -1,675 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you 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. - */ - -#include -#include "CppAssertHelper.h" - -#include "ZKMocks.h" -#include - -using namespace std; - -class Zookeeper_operations : public CPPUNIT_NS::TestFixture -{ - CPPUNIT_TEST_SUITE(Zookeeper_operations); -#ifndef THREADED - CPPUNIT_TEST(testPing); - CPPUNIT_TEST(testTimeoutCausedByWatches1); - CPPUNIT_TEST(testTimeoutCausedByWatches2); -#else - CPPUNIT_TEST(testAsyncWatcher1); - CPPUNIT_TEST(testAsyncGetOperation); -#endif - CPPUNIT_TEST(testOperationsAndDisconnectConcurrently1); - CPPUNIT_TEST(testOperationsAndDisconnectConcurrently2); - CPPUNIT_TEST(testConcurrentOperations1); - CPPUNIT_TEST_SUITE_END(); - zhandle_t *zh; - FILE *logfile; - - static void watcher(zhandle_t *, int, int, const char *,void*){} -public: - Zookeeper_operations() { - logfile = openlogfile("Zookeeper_operations"); - } - - ~Zookeeper_operations() { - if (logfile) { - fflush(logfile); - fclose(logfile); - logfile = 0; - } - } - - void setUp() - { - zoo_set_log_stream(logfile); - - zoo_deterministic_conn_order(0); - zh=0; - } - - void tearDown() - { - zookeeper_close(zh); - } - - class AsyncGetOperationCompletion: public AsyncCompletion{ - public: - AsyncGetOperationCompletion():called_(false),rc_(ZAPIERROR){} - virtual void dataCompl(int rc, const char *value, int len, const Stat *stat){ - synchronized(mx_); - called_=true; - rc_=rc; - value_.erase(); - if(rc!=ZOK) return; - value_.assign(value,len); - if(stat) - stat_=*stat; - } - bool operator()()const{ - synchronized(mx_); - return called_; - } - mutable Mutex mx_; - bool called_; - int rc_; - string value_; - NodeStat stat_; - }; -#ifndef THREADED - // send two get data requests; verify that the corresponding completions called - void testConcurrentOperations1() - { - Mock_gettimeofday timeMock; - ZookeeperServer zkServer; - // must call zookeeper_close() while all the mocks are in scope - CloseFinally guard(&zh); - - zh=zookeeper_init("localhost:2121",watcher,10000,TEST_CLIENT_ID,0,0); - CPPUNIT_ASSERT(zh!=0); - // simulate connected state - forceConnected(zh); - - int fd=0; - int interest=0; - timeval tv; - // first operation - AsyncGetOperationCompletion res1; - zkServer.addOperationResponse(new ZooGetResponse("1",1)); - int rc=zoo_aget(zh,"/x/y/1",0,asyncCompletion,&res1); - CPPUNIT_ASSERT_EQUAL((int)ZOK,rc); - // second operation - AsyncGetOperationCompletion res2; - zkServer.addOperationResponse(new ZooGetResponse("2",1)); - rc=zoo_aget(zh,"/x/y/2",0,asyncCompletion,&res2); - CPPUNIT_ASSERT_EQUAL((int)ZOK,rc); - // process the send queue - rc=zookeeper_interest(zh,&fd,&interest,&tv); - CPPUNIT_ASSERT_EQUAL((int)ZOK,rc); - while((rc=zookeeper_process(zh,interest))==ZOK) { - millisleep(100); - //printf("%d\n", rc); - } - //printf("RC = %d", rc); - CPPUNIT_ASSERT_EQUAL((int)ZNOTHING,rc); - - CPPUNIT_ASSERT_EQUAL((int)ZOK,res1.rc_); - CPPUNIT_ASSERT_EQUAL(string("1"),res1.value_); - CPPUNIT_ASSERT_EQUAL((int)ZOK,res2.rc_); - CPPUNIT_ASSERT_EQUAL(string("2"),res2.value_); - } - // send two getData requests and disconnect while the second request is - // outstanding; - // verify the completions are called - void testOperationsAndDisconnectConcurrently1() - { - Mock_gettimeofday timeMock; - ZookeeperServer zkServer; - // must call zookeeper_close() while all the mocks are in scope - CloseFinally guard(&zh); - - zh=zookeeper_init("localhost:2121",watcher,10000,TEST_CLIENT_ID,0,0); - CPPUNIT_ASSERT(zh!=0); - // simulate connected state - forceConnected(zh); - - int fd=0; - int interest=0; - timeval tv; - // first operation - AsyncGetOperationCompletion res1; - zkServer.addOperationResponse(new ZooGetResponse("1",1)); - int rc=zoo_aget(zh,"/x/y/1",0,asyncCompletion,&res1); - CPPUNIT_ASSERT_EQUAL((int)ZOK,rc); - // second operation - AsyncGetOperationCompletion res2; - zkServer.addOperationResponse(new ZooGetResponse("2",1)); - rc=zoo_aget(zh,"/x/y/2",0,asyncCompletion,&res2); - CPPUNIT_ASSERT_EQUAL((int)ZOK,rc); - // process the send queue - rc=zookeeper_interest(zh,&fd,&interest,&tv); - CPPUNIT_ASSERT_EQUAL((int)ZOK,rc); - rc=zookeeper_process(zh,interest); - CPPUNIT_ASSERT_EQUAL((int)ZOK,rc); - // simulate a disconnect - zkServer.setConnectionLost(); - rc=zookeeper_interest(zh,&fd,&interest,&tv); - rc=zookeeper_process(zh,interest); - CPPUNIT_ASSERT_EQUAL((int)ZCONNECTIONLOSS,rc); - CPPUNIT_ASSERT_EQUAL((int)ZOK,res1.rc_); - CPPUNIT_ASSERT_EQUAL(string("1"),res1.value_); - CPPUNIT_ASSERT_EQUAL((int)ZCONNECTIONLOSS,res2.rc_); - CPPUNIT_ASSERT_EQUAL(string(""),res2.value_); - } - // send two getData requests and simulate timeout while the both request - // are pending; - // verify the completions are called - void testOperationsAndDisconnectConcurrently2() - { - Mock_gettimeofday timeMock; - ZookeeperServer zkServer; - // must call zookeeper_close() while all the mocks are in scope - CloseFinally guard(&zh); - - zh=zookeeper_init("localhost:2121",watcher,10000,TEST_CLIENT_ID,0,0); - CPPUNIT_ASSERT(zh!=0); - // simulate connected state - forceConnected(zh); - - int fd=0; - int interest=0; - timeval tv; - // first operation - AsyncGetOperationCompletion res1; - zkServer.addOperationResponse(new ZooGetResponse("1",1)); - int rc=zoo_aget(zh,"/x/y/1",0,asyncCompletion,&res1); - CPPUNIT_ASSERT_EQUAL((int)ZOK,rc); - // second operation - AsyncGetOperationCompletion res2; - zkServer.addOperationResponse(new ZooGetResponse("2",1)); - rc=zoo_aget(zh,"/x/y/2",0,asyncCompletion,&res2); - CPPUNIT_ASSERT_EQUAL((int)ZOK,rc); - // simulate timeout - timeMock.tick(+10); // advance system time by 10 secs - // the next call to zookeeper_interest should return ZOPERATIONTIMEOUT - rc=zookeeper_interest(zh,&fd,&interest,&tv); - CPPUNIT_ASSERT_EQUAL((int)ZOPERATIONTIMEOUT,rc); - // make sure the completions have been called - CPPUNIT_ASSERT_EQUAL((int)ZOPERATIONTIMEOUT,res1.rc_); - CPPUNIT_ASSERT_EQUAL((int)ZOPERATIONTIMEOUT,res2.rc_); - } - - class PingCountingServer: public ZookeeperServer{ - public: - PingCountingServer():pingCount_(0){} - // called when a client request is received - virtual void onMessageReceived(const RequestHeader& rh, iarchive* ia){ - if(rh.type==ZOO_PING_OP){ - pingCount_++; - } - } - int pingCount_; - }; - - // establish a connection; idle for a while - // verify ping was sent at least once - void testPing() - { - const int TIMEOUT=9; // timeout in secs - Mock_gettimeofday timeMock; - PingCountingServer zkServer; - // must call zookeeper_close() while all the mocks are in scope - CloseFinally guard(&zh); - - // receive timeout is in milliseconds - zh=zookeeper_init("localhost:1234",watcher,TIMEOUT*1000,TEST_CLIENT_ID,0,0); - CPPUNIT_ASSERT(zh!=0); - // simulate connected state - forceConnected(zh); - - int fd=0; - int interest=0; - timeval tv; - // Round 1. - int rc=zookeeper_interest(zh,&fd,&interest,&tv); - CPPUNIT_ASSERT_EQUAL((int)ZOK,rc); - // simulate waiting for the select() call to timeout; - // advance the system clock accordingly - timeMock.tick(tv); - rc=zookeeper_process(zh,interest); - CPPUNIT_ASSERT_EQUAL((int)ZNOTHING,rc); - // verify no ping sent - CPPUNIT_ASSERT(zkServer.pingCount_==0); - - // Round 2. - // the client should have the idle threshold exceeded, by now - rc=zookeeper_interest(zh,&fd,&interest,&tv); - CPPUNIT_ASSERT_EQUAL((int)ZOK,rc); - // assume the socket is writable, so no idling here; move on to - // zookeeper_process immediately - rc=zookeeper_process(zh,interest); - // ZNOTHING means the client hasn't received a ping response yet - CPPUNIT_ASSERT_EQUAL((int)ZNOTHING,rc); - // verify a ping is sent - CPPUNIT_ASSERT_EQUAL(1,zkServer.pingCount_); - - // Round 3. - // we're going to receive a server PING response and make sure - // that the client has updated its last_recv timestamp - zkServer.addRecvResponse(new PingResponse); - rc=zookeeper_interest(zh,&fd,&interest,&tv); - CPPUNIT_ASSERT_EQUAL((int)ZOK,rc); - // pseudo-sleep for a short while (10 ms) - timeMock.millitick(10); - rc=zookeeper_process(zh,interest); - CPPUNIT_ASSERT_EQUAL((int)ZOK,rc); - // only one ping so far? - CPPUNIT_ASSERT_EQUAL(1,zkServer.pingCount_); - CPPUNIT_ASSERT(timeMock==zh->last_recv); - - // Round 4 - // make sure that a ping is not sent if something is outstanding - AsyncGetOperationCompletion res1; - rc=zoo_aget(zh,"/x/y/1",0,asyncCompletion,&res1); - CPPUNIT_ASSERT_EQUAL((int)ZOK,rc); - rc=zookeeper_interest(zh,&fd,&interest,&tv); - CPPUNIT_ASSERT_EQUAL((int)ZOK,rc); - timeMock.tick(tv); - rc=zookeeper_interest(zh,&fd,&interest,&tv); - CPPUNIT_ASSERT_EQUAL((int)ZOK,rc); - rc=zookeeper_process(zh,interest); - CPPUNIT_ASSERT_EQUAL((int)ZNOTHING,rc); - rc=zookeeper_interest(zh,&fd,&interest,&tv); - CPPUNIT_ASSERT_EQUAL((int)ZOK,rc); - // pseudo-sleep for a short while (10 ms) - timeMock.millitick(10); - rc=zookeeper_process(zh,interest); - CPPUNIT_ASSERT_EQUAL((int)ZNOTHING,rc); - // only one ping so far? - CPPUNIT_ASSERT_EQUAL(1,zkServer.pingCount_); - } - - // simulate a watch arriving right before a ping is due - // assert the ping is sent nevertheless - void testTimeoutCausedByWatches1() - { - const int TIMEOUT=9; // timeout in secs - Mock_gettimeofday timeMock; - PingCountingServer zkServer; - // must call zookeeper_close() while all the mocks are in scope - CloseFinally guard(&zh); - - // receive timeout is in milliseconds - zh=zookeeper_init("localhost:1234",watcher,TIMEOUT*1000,TEST_CLIENT_ID,0,0); - CPPUNIT_ASSERT(zh!=0); - // simulate connected state - forceConnected(zh); - - int fd=0; - int interest=0; - timeval tv; - // Round 1. - int rc=zookeeper_interest(zh,&fd,&interest,&tv); - CPPUNIT_ASSERT_EQUAL((int)ZOK,rc); - // simulate waiting for the select() call to timeout; - // advance the system clock accordingly - timeMock.tick(tv); - timeMock.tick(-1); // set the clock to a millisecond before a ping is due - // trigger a watch now - zkServer.addRecvResponse(new ZNodeEvent(ZOO_CHANGED_EVENT,"/x/y/z")); - rc=zookeeper_process(zh,interest); - CPPUNIT_ASSERT_EQUAL((int)ZOK,rc); - // arrival of a watch sets the last_recv to the current time - CPPUNIT_ASSERT(timeMock==zh->last_recv); - // spend 1 millisecond by processing the watch - timeMock.tick(1); - - // Round 2. - // a ping is due; zookeeper_interest() must send it now - rc=zookeeper_interest(zh,&fd,&interest,&tv); - CPPUNIT_ASSERT_EQUAL((int)ZOK,rc); - // no delay here -- as if the socket is immediately writable - rc=zookeeper_process(zh,interest); - CPPUNIT_ASSERT_EQUAL((int)ZNOTHING,rc); - // verify a ping is sent - CPPUNIT_ASSERT_EQUAL(1,zkServer.pingCount_); - } - - // similar to testTimeoutCausedByWatches1, but this time the watch is - // triggered while the client has an outstanding request - // assert the ping is sent on time - void testTimeoutCausedByWatches2() - { - const int TIMEOUT=9; // timeout in secs - Mock_gettimeofday now; - PingCountingServer zkServer; - // must call zookeeper_close() while all the mocks are in scope - CloseFinally guard(&zh); - - // receive timeout is in milliseconds - zh=zookeeper_init("localhost:1234",watcher,TIMEOUT*1000,TEST_CLIENT_ID,0,0); - CPPUNIT_ASSERT(zh!=0); - // simulate connected state - forceConnected(zh); - - // queue up a request; keep it pending (as if the server is busy or has died) - AsyncGetOperationCompletion res1; - zkServer.addOperationResponse(new ZooGetResponse("2",1)); - int rc=zoo_aget(zh,"/x/y/1",0,asyncCompletion,&res1); - - int fd=0; - int interest=0; - timeval tv; - // Round 1. - // send the queued up zoo_aget() request - Mock_gettimeofday beginningOfTimes(now); // remember when we started - rc=zookeeper_interest(zh,&fd,&interest,&tv); - CPPUNIT_ASSERT_EQUAL((int)ZOK,rc); - // no delay -- the socket is writable - rc=zookeeper_process(zh,interest); - CPPUNIT_ASSERT_EQUAL((int)ZOK,rc); - - // Round 2. - // what's next? - rc=zookeeper_interest(zh,&fd,&interest,&tv); - CPPUNIT_ASSERT_EQUAL((int)ZOK,rc); - // no response from the server yet -- waiting in the select() call - now.tick(tv); - // a watch has arrived, thus preventing the connection from timing out - zkServer.addRecvResponse(new ZNodeEvent(ZOO_CHANGED_EVENT,"/x/y/z")); - rc=zookeeper_process(zh,interest); - CPPUNIT_ASSERT_EQUAL((int)ZOK,rc); // read the watch message - CPPUNIT_ASSERT_EQUAL(0,zkServer.pingCount_); // not yet! - - //Round 3. - // now is the time to send a ping; make sure it's actually sent - rc=zookeeper_interest(zh,&fd,&interest,&tv); - CPPUNIT_ASSERT_EQUAL((int)ZOK,rc); - rc=zookeeper_process(zh,interest); - CPPUNIT_ASSERT_EQUAL((int)ZNOTHING,rc); - // verify a ping is sent - CPPUNIT_ASSERT_EQUAL(1,zkServer.pingCount_); - // make sure only 1/3 of the timeout has passed - CPPUNIT_ASSERT_EQUAL((int32_t)TIMEOUT/3*1000,toMilliseconds(now-beginningOfTimes)); - } - -#else - class TestGetDataJob: public TestJob{ - public: - TestGetDataJob(ZookeeperServer* svr,zhandle_t* zh, int reps=500) - :svr_(svr),zh_(zh),rc_(ZAPIERROR),reps_(reps){} - virtual void run(){ - int i; - for(i=0;iaddOperationResponse(new ZooGetResponse("1",1)); - rc_=zoo_get(zh_,"/x/y/z",0,&buf,&size,0); - if(rc_!=ZOK){ - break; - } - } - } - ZookeeperServer* svr_; - zhandle_t* zh_; - int rc_; - int reps_; - }; - class TestConcurrentOpJob: public TestGetDataJob{ - public: - static const int REPS=500; - TestConcurrentOpJob(ZookeeperServer* svr,zhandle_t* zh): - TestGetDataJob(svr,zh,REPS){} - virtual TestJob* clone() const { - return new TestConcurrentOpJob(svr_,zh_); - } - virtual void validate(const char* file, int line) const{ - CPPUNIT_ASSERT_EQUAL_MESSAGE_LOC("ZOK != rc",(int)ZOK,rc_,file,line); - } - }; - void testConcurrentOperations1() - { - for(int counter=0; counter<50; counter++){ - // frozen time -- no timeouts and no pings - Mock_gettimeofday timeMock; - - ZookeeperServer zkServer; - Mock_poll pollMock(&zkServer,ZookeeperServer::FD); - // must call zookeeper_close() while all the mocks are in the scope! - CloseFinally guard(&zh); - - zh=zookeeper_init("localhost:2121",watcher,10000,TEST_CLIENT_ID,0,0); - CPPUNIT_ASSERT(zh!=0); - // make sure the client has connected - CPPUNIT_ASSERT(ensureCondition(ClientConnected(zh),1000)<1000); - - TestJobManager jmgr(TestConcurrentOpJob(&zkServer,zh),10); - jmgr.startAllJobs(); - jmgr.wait(); - // validate test results - VALIDATE_JOBS(jmgr); - } - } - class ZKGetJob: public TestJob{ - public: - static const int REPS=1000; - ZKGetJob(zhandle_t* zh) - :zh_(zh),rc_(ZAPIERROR){} - virtual TestJob* clone() const { - return new ZKGetJob(zh_); - } - virtual void run(){ - int i; - for(i=0;i -#include "CppAssertHelper.h" - -#include "ZKMocks.h" -#include "CollectionUtil.h" -#include "Util.h" - -class Zookeeper_watchers : public CPPUNIT_NS::TestFixture -{ - CPPUNIT_TEST_SUITE(Zookeeper_watchers); - CPPUNIT_TEST(testDefaultSessionWatcher1); - CPPUNIT_TEST(testDefaultSessionWatcher2); - CPPUNIT_TEST(testObjectSessionWatcher1); - CPPUNIT_TEST(testObjectSessionWatcher2); - CPPUNIT_TEST(testNodeWatcher1); - CPPUNIT_TEST(testChildWatcher1); - CPPUNIT_TEST(testChildWatcher2); - CPPUNIT_TEST_SUITE_END(); - - static void watcher(zhandle_t *, int, int, const char *,void*){} - zhandle_t *zh; - FILE *logfile; - -public: - - Zookeeper_watchers() { - logfile = openlogfile("Zookeeper_watchers"); - } - - ~Zookeeper_watchers() { - if (logfile) { - fflush(logfile); - fclose(logfile); - logfile = 0; - } - } - - void setUp() - { - zoo_set_log_stream(logfile); - - zoo_deterministic_conn_order(0); - zh=0; - } - - void tearDown() - { - zookeeper_close(zh); - } - - class ConnectionWatcher: public WatcherAction{ - public: - ConnectionWatcher():connected_(false),counter_(0){} - virtual void onConnectionEstablished(zhandle_t*){ - synchronized(mx_); - counter_++; - connected_=true; - } - SyncedBoolCondition isConnectionEstablished() const{ - return SyncedBoolCondition(connected_,mx_); - } - bool connected_; - int counter_; - }; - - class DisconnectWatcher: public WatcherAction{ - public: - DisconnectWatcher():disconnected_(false),counter_(0){} - virtual void onConnectionLost(zhandle_t*){ - synchronized(mx_); - counter_++; - disconnected_=true; - } - SyncedBoolCondition isDisconnected() const{ - return SyncedBoolCondition(disconnected_,mx_); - } - bool disconnected_; - int counter_; - }; - - class CountingDataWatcher: public WatcherAction{ - public: - CountingDataWatcher():disconnected_(false),counter_(0){} - virtual void onNodeValueChanged(zhandle_t*,const char* path){ - synchronized(mx_); - counter_++; - } - virtual void onConnectionLost(zhandle_t*){ - synchronized(mx_); - counter_++; - disconnected_=true; - } - bool disconnected_; - int counter_; - }; - - class DeletionCountingDataWatcher: public WatcherAction{ - public: - DeletionCountingDataWatcher():counter_(0){} - virtual void onNodeDeleted(zhandle_t*,const char* path){ - synchronized(mx_); - counter_++; - } - int counter_; - }; - - class ChildEventCountingWatcher: public WatcherAction{ - public: - ChildEventCountingWatcher():counter_(0){} - virtual void onChildChanged(zhandle_t*,const char* path){ - synchronized(mx_); - counter_++; - } - int counter_; - }; - -#ifndef THREADED - - // verify: the default watcher is called once for a session event - void testDefaultSessionWatcher1(){ - Mock_gettimeofday timeMock; - ZookeeperServer zkServer; - // must call zookeeper_close() while all the mocks are in scope - CloseFinally guard(&zh); - - ConnectionWatcher watcher; - zh=zookeeper_init("localhost:2121",activeWatcher,10000,TEST_CLIENT_ID, - &watcher,0); - CPPUNIT_ASSERT(zh!=0); - - int fd=0; - int interest=0; - timeval tv; - // open the socket - int rc=zookeeper_interest(zh,&fd,&interest,&tv); - CPPUNIT_ASSERT_EQUAL((int)ZOK,rc); - CPPUNIT_ASSERT_EQUAL(ZOO_CONNECTING_STATE,zoo_state(zh)); - // send the handshake packet to the server - rc=zookeeper_process(zh,interest); - CPPUNIT_ASSERT_EQUAL((int)ZOK,rc); - CPPUNIT_ASSERT_EQUAL(ZOO_ASSOCIATING_STATE,zoo_state(zh)); - // receive the server handshake response - rc=zookeeper_process(zh,interest); - CPPUNIT_ASSERT_EQUAL((int)ZOK,rc); - // verify connected - CPPUNIT_ASSERT_EQUAL(ZOO_CONNECTED_STATE,zoo_state(zh)); - CPPUNIT_ASSERT(watcher.connected_); - CPPUNIT_ASSERT_EQUAL(1,watcher.counter_); - } - - // test case: connect to server, set a default watcher, disconnect from the server - // verify: the default watcher is called once - void testDefaultSessionWatcher2(){ - Mock_gettimeofday timeMock; - ZookeeperServer zkServer; - // must call zookeeper_close() while all the mocks are in scope - CloseFinally guard(&zh); - - DisconnectWatcher watcher; - zh=zookeeper_init("localhost:2121",activeWatcher,10000,TEST_CLIENT_ID, - &watcher,0); - CPPUNIT_ASSERT(zh!=0); - // simulate connected state - forceConnected(zh); - - // first operation - AsyncCompletion ignored; - zkServer.addOperationResponse(new ZooGetResponse("1",1)); - int rc=zoo_aget(zh,"/x/y/1",0,asyncCompletion,&ignored); - CPPUNIT_ASSERT_EQUAL((int)ZOK,rc); - // this will process the response and activate the watcher - rc=zookeeper_process(zh,ZOOKEEPER_READ); - CPPUNIT_ASSERT_EQUAL((int)ZOK,rc); - - // now, disconnect - zkServer.setConnectionLost(); - rc=zookeeper_process(zh,ZOOKEEPER_READ); - CPPUNIT_ASSERT_EQUAL((int)ZCONNECTIONLOSS,rc); - // verify disconnected - CPPUNIT_ASSERT(watcher.disconnected_); - CPPUNIT_ASSERT_EQUAL(1,watcher.counter_); - } - - // testcase: connect to the server, set a watcher object on a node, - // disconnect from the server - // verify: the watcher object as well as the default watcher are called - void testObjectSessionWatcher1(){ - Mock_gettimeofday timeMock; - ZookeeperServer zkServer; - // must call zookeeper_close() while all the mocks are in scope - CloseFinally guard(&zh); - - DisconnectWatcher defWatcher; - zh=zookeeper_init("localhost:2121",activeWatcher,10000,TEST_CLIENT_ID, - &defWatcher,0); - CPPUNIT_ASSERT(zh!=0); - // simulate connected state - forceConnected(zh); - - AsyncCompletion ignored; - CountingDataWatcher wobject; - zkServer.addOperationResponse(new ZooStatResponse); - int rc=zoo_awexists(zh,"/x/y/1",activeWatcher,&wobject, - asyncCompletion,&ignored); - CPPUNIT_ASSERT_EQUAL((int)ZOK,rc); - // this will process the response and activate the watcher - rc=zookeeper_process(zh,ZOOKEEPER_READ); - CPPUNIT_ASSERT_EQUAL((int)ZOK,rc); - - // now, disconnect - zkServer.setConnectionLost(); - rc=zookeeper_process(zh,ZOOKEEPER_READ); - CPPUNIT_ASSERT_EQUAL((int)ZCONNECTIONLOSS,rc); - - // verify the default watcher has been triggered - CPPUNIT_ASSERT(defWatcher.disconnected_); - // and triggered only once - CPPUNIT_ASSERT_EQUAL(1,defWatcher.counter_); - - // the path-specific watcher has been triggered as well - CPPUNIT_ASSERT(wobject.disconnected_); - // only once! - CPPUNIT_ASSERT_EQUAL(1,wobject.counter_); - } - - // testcase: connect to the server, set a watcher object on a node, - // set a def watcher on another node,disconnect from the server - // verify: the watcher object as well as the default watcher are called - void testObjectSessionWatcher2(){ - Mock_gettimeofday timeMock; - ZookeeperServer zkServer; - // must call zookeeper_close() while all the mocks are in scope - CloseFinally guard(&zh); - - DisconnectWatcher defWatcher; - zh=zookeeper_init("localhost:2121",activeWatcher,10000,TEST_CLIENT_ID, - &defWatcher,0); - CPPUNIT_ASSERT(zh!=0); - // simulate connected state - forceConnected(zh); - - // set the default watcher - AsyncCompletion ignored; - zkServer.addOperationResponse(new ZooStatResponse); - int rc=zoo_aexists(zh,"/a/b/c",1,asyncCompletion,&ignored); - CPPUNIT_ASSERT_EQUAL((int)ZOK,rc); - - CountingDataWatcher wobject; - zkServer.addOperationResponse(new ZooStatResponse); - rc=zoo_awexists(zh,"/x/y/z",activeWatcher,&wobject, - asyncCompletion,&ignored); - CPPUNIT_ASSERT_EQUAL((int)ZOK,rc); - - // this will process the response and activate the watcher - while((rc=zookeeper_process(zh,ZOOKEEPER_READ))==ZOK) { - millisleep(100); - } - CPPUNIT_ASSERT_EQUAL((int)ZNOTHING,rc); - - // disconnect now - zkServer.setConnectionLost(); - rc=zookeeper_process(zh,ZOOKEEPER_READ); - CPPUNIT_ASSERT_EQUAL((int)ZCONNECTIONLOSS,rc); - - // verify the default watcher has been triggered - CPPUNIT_ASSERT(defWatcher.disconnected_); - // and triggered only once - CPPUNIT_ASSERT_EQUAL(1,defWatcher.counter_); - - // the path-specific watcher has been triggered as well - CPPUNIT_ASSERT(wobject.disconnected_); - // only once! - CPPUNIT_ASSERT_EQUAL(1,wobject.counter_); - } - - // testcase: register 2 node watches for different paths, trigger the watches - // verify: the data watchers are processed, the default watcher is not called - void testNodeWatcher1(){ - Mock_gettimeofday timeMock; - ZookeeperServer zkServer; - // must call zookeeper_close() while all the mocks are in scope - CloseFinally guard(&zh); - - DisconnectWatcher defWatcher; - zh=zookeeper_init("localhost:2121",activeWatcher,10000,TEST_CLIENT_ID, - &defWatcher,0); - CPPUNIT_ASSERT(zh!=0); - // simulate connected state - forceConnected(zh); - - AsyncCompletion ignored; - CountingDataWatcher wobject1; - zkServer.addOperationResponse(new ZooStatResponse); - int rc=zoo_awexists(zh,"/a/b/c",activeWatcher,&wobject1, - asyncCompletion,&ignored); - CPPUNIT_ASSERT_EQUAL((int)ZOK,rc); - - CountingDataWatcher wobject2; - zkServer.addOperationResponse(new ZooStatResponse); - rc=zoo_awexists(zh,"/x/y/z",activeWatcher,&wobject2, - asyncCompletion,&ignored); - CPPUNIT_ASSERT_EQUAL((int)ZOK,rc); - - // this will process the response and activate the watcher - while((rc=zookeeper_process(zh,ZOOKEEPER_READ))==ZOK) { - millisleep(100); - } - CPPUNIT_ASSERT_EQUAL((int)ZNOTHING,rc); - - // we are all set now; let's trigger the watches - zkServer.addRecvResponse(new ZNodeEvent(ZOO_CHANGED_EVENT,"/a/b/c")); - zkServer.addRecvResponse(new ZNodeEvent(ZOO_CHANGED_EVENT,"/x/y/z")); - // make sure all watchers have been processed - while((rc=zookeeper_process(zh,ZOOKEEPER_READ))==ZOK) { - millisleep(100); - } - CPPUNIT_ASSERT_EQUAL((int)ZNOTHING,rc); - - CPPUNIT_ASSERT_EQUAL(1,wobject1.counter_); - CPPUNIT_ASSERT_EQUAL(1,wobject2.counter_); - CPPUNIT_ASSERT_EQUAL(0,defWatcher.counter_); - } - - // testcase: set up both a children and a data watchers on the node /a, then - // delete the node by sending a DELETE_EVENT event - // verify: both watchers are triggered - void testChildWatcher1(){ - Mock_gettimeofday timeMock; - ZookeeperServer zkServer; - // must call zookeeper_close() while all the mocks are in scope - CloseFinally guard(&zh); - - DeletionCountingDataWatcher defWatcher; - zh=zookeeper_init("localhost:2121",activeWatcher,10000,TEST_CLIENT_ID, - &defWatcher,0); - CPPUNIT_ASSERT(zh!=0); - // simulate connected state - forceConnected(zh); - - AsyncCompletion ignored; - DeletionCountingDataWatcher wobject1; - zkServer.addOperationResponse(new ZooStatResponse); - int rc=zoo_awexists(zh,"/a",activeWatcher,&wobject1, - asyncCompletion,&ignored); - CPPUNIT_ASSERT_EQUAL((int)ZOK,rc); - - typedef ZooGetChildrenResponse::StringVector ZooVector; - zkServer.addOperationResponse(new ZooGetChildrenResponse( - Util::CollectionBuilder()("/a/1")("/a/2") - )); - DeletionCountingDataWatcher wobject2; - rc=zoo_awget_children(zh,"/a",activeWatcher, - &wobject2,asyncCompletion,&ignored); - CPPUNIT_ASSERT_EQUAL((int)ZOK,rc); - - // this will process the response and activate the watcher - while((rc=zookeeper_process(zh,ZOOKEEPER_READ))==ZOK) { - millisleep(100); - } - CPPUNIT_ASSERT_EQUAL((int)ZNOTHING,rc); - - // we are all set now; let's trigger the watches - zkServer.addRecvResponse(new ZNodeEvent(ZOO_DELETED_EVENT,"/a")); - // make sure the watchers have been processed - while((rc=zookeeper_process(zh,ZOOKEEPER_READ))==ZOK) { - millisleep(100); - } - CPPUNIT_ASSERT_EQUAL((int)ZNOTHING,rc); - - CPPUNIT_ASSERT_EQUAL(1,wobject1.counter_); - CPPUNIT_ASSERT_EQUAL(1,wobject2.counter_); - CPPUNIT_ASSERT_EQUAL(0,defWatcher.counter_); - } - - // testcase: create both a child and data watch on the node /a, send a ZOO_CHILD_EVENT - // verify: only the child watch triggered - void testChildWatcher2(){ - Mock_gettimeofday timeMock; - ZookeeperServer zkServer; - // must call zookeeper_close() while all the mocks are in scope - CloseFinally guard(&zh); - - ChildEventCountingWatcher defWatcher; - zh=zookeeper_init("localhost:2121",activeWatcher,10000,TEST_CLIENT_ID, - &defWatcher,0); - CPPUNIT_ASSERT(zh!=0); - // simulate connected state - forceConnected(zh); - - AsyncCompletion ignored; - ChildEventCountingWatcher wobject1; - zkServer.addOperationResponse(new ZooStatResponse); - int rc=zoo_awexists(zh,"/a",activeWatcher,&wobject1, - asyncCompletion,&ignored); - CPPUNIT_ASSERT_EQUAL((int)ZOK,rc); - - typedef ZooGetChildrenResponse::StringVector ZooVector; - zkServer.addOperationResponse(new ZooGetChildrenResponse( - Util::CollectionBuilder()("/a/1")("/a/2") - )); - ChildEventCountingWatcher wobject2; - rc=zoo_awget_children(zh,"/a",activeWatcher, - &wobject2,asyncCompletion,&ignored); - CPPUNIT_ASSERT_EQUAL((int)ZOK,rc); - - // this will process the response and activate the watcher - while((rc=zookeeper_process(zh,ZOOKEEPER_READ))==ZOK) { - millisleep(100); - } - CPPUNIT_ASSERT_EQUAL((int)ZNOTHING,rc); - - // we are all set now; let's trigger the watches - zkServer.addRecvResponse(new ZNodeEvent(ZOO_CHILD_EVENT,"/a")); - // make sure the watchers have been processed - while((rc=zookeeper_process(zh,ZOOKEEPER_READ))==ZOK) { - millisleep(100); - } - CPPUNIT_ASSERT_EQUAL((int)ZNOTHING,rc); - - CPPUNIT_ASSERT_EQUAL(0,wobject1.counter_); - CPPUNIT_ASSERT_EQUAL(1,wobject2.counter_); - CPPUNIT_ASSERT_EQUAL(0,defWatcher.counter_); - } - -#else - // verify: the default watcher is called once for a session event - void testDefaultSessionWatcher1(){ - Mock_gettimeofday timeMock; - // zookeeper simulator - ZookeeperServer zkServer; - // detects when all watchers have been delivered - WatcherDeliveryTracker deliveryTracker(ZOO_SESSION_EVENT,ZOO_CONNECTED_STATE); - Mock_poll pollMock(&zkServer,ZookeeperServer::FD); - // must call zookeeper_close() while all the mocks are in the scope! - CloseFinally guard(&zh); - - ConnectionWatcher watcher; - zh=zookeeper_init("localhost:2121",activeWatcher,10000,TEST_CLIENT_ID, - &watcher,0); - CPPUNIT_ASSERT(zh!=0); - // wait till watcher proccessing has completed (the connection - // established event) - CPPUNIT_ASSERT(ensureCondition( - deliveryTracker.isWatcherProcessingCompleted(),1000)<1000); - - // verify the watcher has been triggered - CPPUNIT_ASSERT(ensureCondition(watcher.isConnectionEstablished(),1000)<1000); - // triggered only once - CPPUNIT_ASSERT_EQUAL(1,watcher.counter_); - } - - // test case: connect to server, set a default watcher, disconnect from the server - // verify: the default watcher is called once - void testDefaultSessionWatcher2(){ - Mock_gettimeofday timeMock; - // zookeeper simulator - ZookeeperServer zkServer; - Mock_poll pollMock(&zkServer,ZookeeperServer::FD); - // must call zookeeper_close() while all the mocks are in the scope! - CloseFinally guard(&zh); - - // detects when all watchers have been delivered - WatcherDeliveryTracker deliveryTracker(ZOO_SESSION_EVENT,ZOO_CONNECTING_STATE); - DisconnectWatcher watcher; - zh=zookeeper_init("localhost:2121",activeWatcher,10000,TEST_CLIENT_ID, - &watcher,0); - CPPUNIT_ASSERT(zh!=0); - // make sure the client has connected - CPPUNIT_ASSERT(ensureCondition(ClientConnected(zh),1000)<1000); - // set a default watch - AsyncCompletion ignored; - // a successful server response will activate the watcher - zkServer.addOperationResponse(new ZooStatResponse); - int rc=zoo_aexists(zh,"/x/y/z",1,asyncCompletion,&ignored); - CPPUNIT_ASSERT_EQUAL((int)ZOK,rc); - - // now, initiate a disconnect - zkServer.setConnectionLost(); - CPPUNIT_ASSERT(ensureCondition( - deliveryTracker.isWatcherProcessingCompleted(),1000)<1000); - - // verify the watcher has been triggered - CPPUNIT_ASSERT(watcher.disconnected_); - // triggered only once - CPPUNIT_ASSERT_EQUAL(1,watcher.counter_); - } - - // testcase: connect to the server, set a watcher object on a node, - // disconnect from the server - // verify: the watcher object as well as the default watcher are called - void testObjectSessionWatcher1(){ - Mock_gettimeofday timeMock; - // zookeeper simulator - ZookeeperServer zkServer; - Mock_poll pollMock(&zkServer,ZookeeperServer::FD); - // must call zookeeper_close() while all the mocks are in the scope! - CloseFinally guard(&zh); - - // detects when all watchers have been delivered - WatcherDeliveryTracker deliveryTracker(ZOO_SESSION_EVENT,ZOO_CONNECTING_STATE); - DisconnectWatcher defWatcher; - // use the tracker to find out when the watcher has been activated - WatcherActivationTracker activationTracker; - zh=zookeeper_init("localhost:2121",activeWatcher,10000,TEST_CLIENT_ID, - &defWatcher,0); - CPPUNIT_ASSERT(zh!=0); - // make sure the client has connected - CPPUNIT_ASSERT(ensureCondition(ClientConnected(zh),1000)<1000); - - AsyncCompletion ignored; - // this successful server response will activate the watcher - zkServer.addOperationResponse(new ZooStatResponse); - CountingDataWatcher wobject; - activationTracker.track(&wobject); - // set a path-specific watcher - int rc=zoo_awexists(zh,"/x/y/z",activeWatcher,&wobject, - asyncCompletion,&ignored); - CPPUNIT_ASSERT_EQUAL((int)ZOK,rc); - // make sure the watcher gets activated before we continue - CPPUNIT_ASSERT(ensureCondition(activationTracker.isWatcherActivated(),1000)<1000); - - // now, initiate a disconnect - zkServer.setConnectionLost(); - // make sure all watchers have been processed - CPPUNIT_ASSERT(ensureCondition( - deliveryTracker.isWatcherProcessingCompleted(),1000)<1000); - - // verify the default watcher has been triggered - CPPUNIT_ASSERT(defWatcher.disconnected_); - // and triggered only once - CPPUNIT_ASSERT_EQUAL(1,defWatcher.counter_); - - // the path-specific watcher has been triggered as well - CPPUNIT_ASSERT(wobject.disconnected_); - // only once! - CPPUNIT_ASSERT_EQUAL(1,wobject.counter_); - } - - // testcase: connect to the server, set a watcher object on a node, - // set a def watcher on another node,disconnect from the server - // verify: the watcher object as well as the default watcher are called - void testObjectSessionWatcher2(){ - Mock_gettimeofday timeMock; - // zookeeper simulator - ZookeeperServer zkServer; - Mock_poll pollMock(&zkServer,ZookeeperServer::FD); - // must call zookeeper_close() while all the mocks are in the scope! - CloseFinally guard(&zh); - - // detects when all watchers have been delivered - WatcherDeliveryTracker deliveryTracker(ZOO_SESSION_EVENT,ZOO_CONNECTING_STATE); - DisconnectWatcher defWatcher; - // use the tracker to find out when the watcher has been activated - WatcherActivationTracker activationTracker; - zh=zookeeper_init("localhost:2121",activeWatcher,10000,TEST_CLIENT_ID, - &defWatcher,0); - CPPUNIT_ASSERT(zh!=0); - // make sure the client has connected - CPPUNIT_ASSERT(ensureCondition(ClientConnected(zh),1000)<1000); - - // set a default watch - AsyncCompletion ignored; - // a successful server response will activate the watcher - zkServer.addOperationResponse(new ZooStatResponse); - activationTracker.track(&defWatcher); - int rc=zoo_aexists(zh,"/a/b/c",1,asyncCompletion,&ignored); - CPPUNIT_ASSERT_EQUAL((int)ZOK,rc); - // make sure the watcher gets activated before we continue - CPPUNIT_ASSERT(ensureCondition(activationTracker.isWatcherActivated(),1000)<1000); - - // this successful server response will activate the watcher - zkServer.addOperationResponse(new ZooStatResponse); - CountingDataWatcher wobject; - activationTracker.track(&wobject); - // set a path-specific watcher - rc=zoo_awexists(zh,"/x/y/z",activeWatcher,&wobject, - asyncCompletion,&ignored); - CPPUNIT_ASSERT_EQUAL((int)ZOK,rc); - // make sure the watcher gets activated before we continue - CPPUNIT_ASSERT(ensureCondition(activationTracker.isWatcherActivated(),1000)<1000); - - // now, initiate a disconnect - zkServer.setConnectionLost(); - // make sure all watchers have been processed - CPPUNIT_ASSERT(ensureCondition( - deliveryTracker.isWatcherProcessingCompleted(),1000)<1000); - - // verify the default watcher has been triggered - CPPUNIT_ASSERT(defWatcher.disconnected_); - // and triggered only once - CPPUNIT_ASSERT_EQUAL(1,defWatcher.counter_); - - // the path-specific watcher has been triggered as well - CPPUNIT_ASSERT(wobject.disconnected_); - // only once! - CPPUNIT_ASSERT_EQUAL(1,wobject.counter_); - } - - // testcase: register 2 node watches for different paths, trigger the watches - // verify: the data watchers are processed, the default watcher is not called - void testNodeWatcher1(){ - Mock_gettimeofday timeMock; - // zookeeper simulator - ZookeeperServer zkServer; - Mock_poll pollMock(&zkServer,ZookeeperServer::FD); - // must call zookeeper_close() while all the mocks are in the scope! - CloseFinally guard(&zh); - - // detects when all watchers have been delivered - WatcherDeliveryTracker deliveryTracker(ZOO_CHANGED_EVENT,0,false); - CountingDataWatcher defWatcher; - // use the tracker to find out when the watcher has been activated - WatcherActivationTracker activationTracker; - zh=zookeeper_init("localhost:2121",activeWatcher,10000,TEST_CLIENT_ID, - &defWatcher,0); - CPPUNIT_ASSERT(zh!=0); - // make sure the client has connected - CPPUNIT_ASSERT(ensureCondition(ClientConnected(zh),1000)<1000); - - // don't care about completions - AsyncCompletion ignored; - // set a one-shot watch - // a successful server response will activate the watcher - zkServer.addOperationResponse(new ZooStatResponse); - CountingDataWatcher wobject1; - activationTracker.track(&wobject1); - int rc=zoo_awexists(zh,"/a/b/c",activeWatcher,&wobject1, - asyncCompletion,&ignored); - CPPUNIT_ASSERT_EQUAL((int)ZOK,rc); - // make sure the watcher gets activated before we continue - CPPUNIT_ASSERT(ensureCondition(activationTracker.isWatcherActivated(),1000)<1000); - - // this successful server response will activate the watcher - zkServer.addOperationResponse(new ZooStatResponse); - CountingDataWatcher wobject2; - activationTracker.track(&wobject2); - // set a path-specific watcher - rc=zoo_awexists(zh,"/x/y/z",activeWatcher,&wobject2, - asyncCompletion,&ignored); - CPPUNIT_ASSERT_EQUAL((int)ZOK,rc); - // make sure the watcher gets activated before we continue - CPPUNIT_ASSERT(ensureCondition(activationTracker.isWatcherActivated(),1000)<1000); - - // we are all set now; let's trigger the watches - zkServer.addRecvResponse(new ZNodeEvent(ZOO_CHANGED_EVENT,"/a/b/c")); - zkServer.addRecvResponse(new ZNodeEvent(ZOO_CHANGED_EVENT,"/x/y/z")); - // make sure all watchers have been processed - CPPUNIT_ASSERT(ensureCondition( - deliveryTracker.deliveryCounterEquals(2),1000)<1000); - - CPPUNIT_ASSERT_EQUAL(1,wobject1.counter_); - CPPUNIT_ASSERT_EQUAL(1,wobject2.counter_); - CPPUNIT_ASSERT_EQUAL(0,defWatcher.counter_); - } - - // testcase: set up both a children and a data watchers on the node /a, then - // delete the node (that is, send a DELETE_EVENT) - // verify: both watchers are triggered - void testChildWatcher1(){ - Mock_gettimeofday timeMock; - // zookeeper simulator - ZookeeperServer zkServer; - Mock_poll pollMock(&zkServer,ZookeeperServer::FD); - // must call zookeeper_close() while all the mocks are in the scope! - CloseFinally guard(&zh); - - // detects when all watchers have been delivered - WatcherDeliveryTracker deliveryTracker(ZOO_DELETED_EVENT,0); - DeletionCountingDataWatcher defWatcher; - zh=zookeeper_init("localhost:2121",activeWatcher,10000,TEST_CLIENT_ID, - &defWatcher,0); - CPPUNIT_ASSERT(zh!=0); - // make sure the client has connected - CPPUNIT_ASSERT(ensureCondition(ClientConnected(zh),1000)<1000); - - // a successful server response will activate the watcher - zkServer.addOperationResponse(new ZooStatResponse); - DeletionCountingDataWatcher wobject1; - Stat stat; - // add a node watch - int rc=zoo_wexists(zh,"/a",activeWatcher,&wobject1,&stat); - CPPUNIT_ASSERT_EQUAL((int)ZOK,rc); - - typedef ZooGetChildrenResponse::StringVector ZooVector; - zkServer.addOperationResponse(new ZooGetChildrenResponse( - Util::CollectionBuilder()("/a/1")("/a/2") - )); - DeletionCountingDataWatcher wobject2; - String_vector children; - rc=zoo_wget_children(zh,"/a",activeWatcher,&wobject2,&children); - deallocate_String_vector(&children); - CPPUNIT_ASSERT_EQUAL((int)ZOK,rc); - - // we are all set now; let's trigger the watches - zkServer.addRecvResponse(new ZNodeEvent(ZOO_DELETED_EVENT,"/a")); - // make sure the watchers have been processed - CPPUNIT_ASSERT(ensureCondition( - deliveryTracker.isWatcherProcessingCompleted(),1000)<1000); - - CPPUNIT_ASSERT_EQUAL(1,wobject1.counter_); - CPPUNIT_ASSERT_EQUAL(1,wobject2.counter_); - CPPUNIT_ASSERT_EQUAL(0,defWatcher.counter_); - } - - // testcase: create both a child and data watch on the node /a, send a ZOO_CHILD_EVENT - // verify: only the child watch triggered - void testChildWatcher2(){ - Mock_gettimeofday timeMock; - // zookeeper simulator - ZookeeperServer zkServer; - Mock_poll pollMock(&zkServer,ZookeeperServer::FD); - // must call zookeeper_close() while all the mocks are in the scope! - CloseFinally guard(&zh); - - // detects when all watchers have been delivered - WatcherDeliveryTracker deliveryTracker(ZOO_CHILD_EVENT,0); - ChildEventCountingWatcher defWatcher; - zh=zookeeper_init("localhost:2121",activeWatcher,10000,TEST_CLIENT_ID, - &defWatcher,0); - CPPUNIT_ASSERT(zh!=0); - // make sure the client has connected - CPPUNIT_ASSERT(ensureCondition(ClientConnected(zh),1000)<1000); - // a successful server response will activate the watcher - zkServer.addOperationResponse(new ZooStatResponse); - ChildEventCountingWatcher wobject1; - Stat stat; - // add a node watch - int rc=zoo_wexists(zh,"/a",activeWatcher,&wobject1,&stat); - CPPUNIT_ASSERT_EQUAL((int)ZOK,rc); - - typedef ZooGetChildrenResponse::StringVector ZooVector; - zkServer.addOperationResponse(new ZooGetChildrenResponse( - Util::CollectionBuilder()("/a/1")("/a/2") - )); - ChildEventCountingWatcher wobject2; - String_vector children; - rc=zoo_wget_children(zh,"/a",activeWatcher,&wobject2,&children); - deallocate_String_vector(&children); - CPPUNIT_ASSERT_EQUAL((int)ZOK,rc); - - // we are all set now; let's trigger the watches - zkServer.addRecvResponse(new ZNodeEvent(ZOO_CHILD_EVENT,"/a")); - // make sure the watchers have been processed - CPPUNIT_ASSERT(ensureCondition( - deliveryTracker.isWatcherProcessingCompleted(),1000)<1000); - - CPPUNIT_ASSERT_EQUAL(0,wobject1.counter_); - CPPUNIT_ASSERT_EQUAL(1,wobject2.counter_); - CPPUNIT_ASSERT_EQUAL(0,defWatcher.counter_); - } - -#endif //THREADED -}; - -CPPUNIT_TEST_SUITE_REGISTRATION(Zookeeper_watchers); diff --git a/pkg/registry/zookeeper-3.4.6/src/c/tests/TestZookeeperClose.cc b/pkg/registry/zookeeper-3.4.6/src/c/tests/TestZookeeperClose.cc deleted file mode 100644 index edefa66e9..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/c/tests/TestZookeeperClose.cc +++ /dev/null @@ -1,472 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you 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. - */ - -#include - -#include "ZKMocks.h" - -#ifdef THREADED -#include "PthreadMocks.h" -#endif - -using namespace std; - -class Zookeeper_close : public CPPUNIT_NS::TestFixture -{ - CPPUNIT_TEST_SUITE(Zookeeper_close); -#ifdef THREADED - CPPUNIT_TEST(testIOThreadStoppedOnExpire); -#endif - CPPUNIT_TEST(testCloseUnconnected); - CPPUNIT_TEST(testCloseUnconnected1); - CPPUNIT_TEST(testCloseConnected1); - CPPUNIT_TEST(testCloseFromWatcher1); - CPPUNIT_TEST_SUITE_END(); - zhandle_t *zh; - static void watcher(zhandle_t *, int, int, const char *,void*){} - FILE *logfile; -public: - - Zookeeper_close() { - logfile = openlogfile("Zookeeper_close"); - } - - ~Zookeeper_close() { - if (logfile) { - fflush(logfile); - fclose(logfile); - logfile = 0; - } - } - - void setUp() - { - zoo_set_log_stream(logfile); - - zoo_deterministic_conn_order(0); - zh=0; - } - - void tearDown() - { - zookeeper_close(zh); - } - - class CloseOnSessionExpired: public WatcherAction{ - public: - CloseOnSessionExpired(bool callClose=true): - callClose_(callClose),rc(ZOK){} - virtual void onSessionExpired(zhandle_t* zh){ - memcpy(&lzh,zh,sizeof(lzh)); - if(callClose_) - rc=zookeeper_close(zh); - } - zhandle_t lzh; - bool callClose_; - int rc; - }; - -#ifndef THREADED - void testCloseUnconnected() - { - zh=zookeeper_init("localhost:2121",watcher,10000,0,0,0); - CPPUNIT_ASSERT(zh!=0); - - // do not actually free the memory while in zookeeper_close() - Mock_free_noop freeMock; - // make a copy of zhandle before close() overwrites some of - // it members with NULLs - zhandle_t lzh; - memcpy(&lzh,zh,sizeof(lzh)); - int rc=zookeeper_close(zh); - zhandle_t* savezh=zh; zh=0; - freeMock.disable(); // disable mock's fake free()- use libc's free() instead - - // verify that zookeeper_close has done its job - CPPUNIT_ASSERT_EQUAL((int)ZOK,rc); - // memory - CPPUNIT_ASSERT_EQUAL(1,freeMock.getFreeCount(savezh)); - CPPUNIT_ASSERT_EQUAL(1,freeMock.getFreeCount(lzh.hostname)); - CPPUNIT_ASSERT_EQUAL(1,freeMock.getFreeCount(lzh.addrs)); - // This cannot be maintained properly CPPUNIT_ASSERT_EQUAL(9,freeMock.callCounter); - } - void testCloseUnconnected1() - { - zh=zookeeper_init("localhost:2121",watcher,10000,0,0,0); - CPPUNIT_ASSERT(zh!=0); - // simulate connected state - zh->fd=ZookeeperServer::FD; - zh->state=ZOO_CONNECTED_STATE; - Mock_flush_send_queue zkMock; - // do not actually free the memory while in zookeeper_close() - Mock_free_noop freeMock; - // make a copy of zhandle before close() overwrites some of - // it members with NULLs - zhandle_t lzh; - memcpy(&lzh,zh,sizeof(lzh)); - int rc=zookeeper_close(zh); - zhandle_t* savezh=zh; zh=0; - freeMock.disable(); // disable mock's fake free()- use libc's free() instead - - // verify that zookeeper_close has done its job - CPPUNIT_ASSERT_EQUAL((int)ZOK,rc); - // memory - CPPUNIT_ASSERT_EQUAL(1,freeMock.getFreeCount(savezh)); - CPPUNIT_ASSERT_EQUAL(1,freeMock.getFreeCount(lzh.hostname)); - CPPUNIT_ASSERT_EQUAL(1,freeMock.getFreeCount(lzh.addrs)); - // the close request sent? - CPPUNIT_ASSERT_EQUAL(1,zkMock.counter); - } - void testCloseConnected1() - { - ZookeeperServer zkServer; - // poll() will called from zookeeper_close() - Mock_poll pollMock(&zkServer,ZookeeperServer::FD); - - zh=zookeeper_init("localhost:2121",watcher,10000,TEST_CLIENT_ID,0,0); - CPPUNIT_ASSERT(zh!=0); - - Mock_gettimeofday timeMock; - - int fd=0; - int interest=0; - timeval tv; - int rc=zookeeper_interest(zh,&fd,&interest,&tv); - - CPPUNIT_ASSERT_EQUAL((int)ZOK,rc); - CPPUNIT_ASSERT_EQUAL(ZOO_CONNECTING_STATE,zoo_state(zh)); - CPPUNIT_ASSERT_EQUAL(ZOOKEEPER_READ|ZOOKEEPER_WRITE,interest); - - rc=zookeeper_process(zh,interest); - CPPUNIT_ASSERT_EQUAL((int)ZOK,rc); - CPPUNIT_ASSERT_EQUAL(ZOO_ASSOCIATING_STATE,zoo_state(zh)); - - rc=zookeeper_interest(zh,&fd,&interest,&tv); - CPPUNIT_ASSERT_EQUAL((int)ZOK,rc); - rc=zookeeper_process(zh,interest); - CPPUNIT_ASSERT_EQUAL((int)ZOK,rc); - CPPUNIT_ASSERT_EQUAL(ZOO_CONNECTED_STATE,zoo_state(zh)); - // do not actually free the memory while in zookeeper_close() - Mock_free_noop freeMock; - // make a copy of zhandle before close() overwrites some of - // it members with NULLs - zhandle_t lzh; - memcpy(&lzh,zh,sizeof(lzh)); - zookeeper_close(zh); - zhandle_t* savezh=zh; zh=0; - freeMock.disable(); // disable mock's fake free()- use libc's free() instead - // memory - CPPUNIT_ASSERT_EQUAL(1,freeMock.getFreeCount(savezh)); - CPPUNIT_ASSERT_EQUAL(1,freeMock.getFreeCount(lzh.hostname)); - CPPUNIT_ASSERT_EQUAL(1,freeMock.getFreeCount(lzh.addrs)); - // the close request sent? - CPPUNIT_ASSERT_EQUAL(1,(int)zkServer.closeSent); - } - void testCloseFromWatcher1() - { - Mock_gettimeofday timeMock; - - ZookeeperServer zkServer; - // make the server return a non-matching session id - zkServer.returnSessionExpired(); - // poll() will called from zookeeper_close() - Mock_poll pollMock(&zkServer,ZookeeperServer::FD); - - CloseOnSessionExpired closeAction; - zh=zookeeper_init("localhost:2121",activeWatcher,10000, - TEST_CLIENT_ID,&closeAction,0); - CPPUNIT_ASSERT(zh!=0); - - int fd=0; - int interest=0; - timeval tv; - // initiate connection - int rc=zookeeper_interest(zh,&fd,&interest,&tv); - CPPUNIT_ASSERT_EQUAL((int)ZOK,rc); - CPPUNIT_ASSERT_EQUAL(ZOO_CONNECTING_STATE,zoo_state(zh)); - CPPUNIT_ASSERT_EQUAL(ZOOKEEPER_READ|ZOOKEEPER_WRITE,interest); - rc=zookeeper_process(zh,interest); - // make sure the handshake in progress - CPPUNIT_ASSERT_EQUAL((int)ZOK,rc); - CPPUNIT_ASSERT_EQUAL(ZOO_ASSOCIATING_STATE,zoo_state(zh)); - rc=zookeeper_interest(zh,&fd,&interest,&tv); - CPPUNIT_ASSERT_EQUAL((int)ZOK,rc); - - // do not actually free the memory while in zookeeper_close() - Mock_free_noop freeMock; - // should call the watcher with ZOO_EXPIRED_SESSION_STATE state - rc=zookeeper_process(zh,interest); - zhandle_t* savezh=zh; zh=0; - freeMock.disable(); // disable mock's fake free()- use libc's free() instead - - CPPUNIT_ASSERT_EQUAL(ZOO_EXPIRED_SESSION_STATE,zoo_state(savezh)); - // memory - CPPUNIT_ASSERT_EQUAL(1,freeMock.getFreeCount(savezh)); - CPPUNIT_ASSERT_EQUAL(1,freeMock.getFreeCount(closeAction.lzh.hostname)); - CPPUNIT_ASSERT_EQUAL(1,freeMock.getFreeCount(closeAction.lzh.addrs)); - // make sure the close request NOT sent - CPPUNIT_ASSERT_EQUAL(0,(int)zkServer.closeSent); - } -#else - void testCloseUnconnected() - { - // disable threading - MockPthreadZKNull pthreadMock; - zh=zookeeper_init("localhost:2121",watcher,10000,0,0,0); - - CPPUNIT_ASSERT(zh!=0); - adaptor_threads* adaptor=(adaptor_threads*)zh->adaptor_priv; - CPPUNIT_ASSERT(adaptor!=0); - - // do not actually free the memory while in zookeeper_close() - Mock_free_noop freeMock; - // make a copy of zhandle before close() overwrites some of - // it members with NULLs - zhandle_t lzh; - memcpy(&lzh,zh,sizeof(lzh)); - int rc=zookeeper_close(zh); - zhandle_t* savezh=zh; zh=0; - // we're done, disable mock's fake free(), use libc's free() instead - freeMock.disable(); - - // verify that zookeeper_close has done its job - CPPUNIT_ASSERT_EQUAL((int)ZOK,rc); - // memory - CPPUNIT_ASSERT_EQUAL(1,freeMock.getFreeCount(savezh)); - CPPUNIT_ASSERT_EQUAL(1,freeMock.getFreeCount(lzh.hostname)); - CPPUNIT_ASSERT_EQUAL(1,freeMock.getFreeCount(lzh.addrs)); - CPPUNIT_ASSERT_EQUAL(1,freeMock.getFreeCount(adaptor)); - // Cannot be maintained accurately: CPPUNIT_ASSERT_EQUAL(10,freeMock.callCounter); - // threads - CPPUNIT_ASSERT_EQUAL(1,MockPthreadsNull::getDestroyCounter(adaptor->io)); - CPPUNIT_ASSERT_EQUAL(1,MockPthreadsNull::getDestroyCounter(adaptor->completion)); - // mutexes - CPPUNIT_ASSERT_EQUAL(1,MockPthreadsNull::getDestroyCounter(&savezh->to_process.lock)); - CPPUNIT_ASSERT_EQUAL(0,MockPthreadsNull::getInvalidAccessCounter(&savezh->to_process.lock)); - CPPUNIT_ASSERT_EQUAL(1,MockPthreadsNull::getDestroyCounter(&savezh->to_send.lock)); - CPPUNIT_ASSERT_EQUAL(0,MockPthreadsNull::getInvalidAccessCounter(&savezh->to_send.lock)); - CPPUNIT_ASSERT_EQUAL(1,MockPthreadsNull::getDestroyCounter(&savezh->sent_requests.lock)); - CPPUNIT_ASSERT_EQUAL(0,MockPthreadsNull::getInvalidAccessCounter(&savezh->sent_requests.lock)); - CPPUNIT_ASSERT_EQUAL(1,MockPthreadsNull::getDestroyCounter(&savezh->completions_to_process.lock)); - CPPUNIT_ASSERT_EQUAL(0,MockPthreadsNull::getInvalidAccessCounter(&savezh->completions_to_process.lock)); - // conditionals - CPPUNIT_ASSERT_EQUAL(1,MockPthreadsNull::getDestroyCounter(&savezh->sent_requests.cond)); - CPPUNIT_ASSERT_EQUAL(0,MockPthreadsNull::getInvalidAccessCounter(&savezh->sent_requests.cond)); - CPPUNIT_ASSERT_EQUAL(1,MockPthreadsNull::getDestroyCounter(&savezh->completions_to_process.cond)); - CPPUNIT_ASSERT_EQUAL(0,MockPthreadsNull::getInvalidAccessCounter(&savezh->completions_to_process.cond)); - } - void testCloseUnconnected1() - { - for(int i=0; i<100;i++){ - zh=zookeeper_init("localhost:2121",watcher,10000,0,0,0); - CPPUNIT_ASSERT(zh!=0); - adaptor_threads* adaptor=(adaptor_threads*)zh->adaptor_priv; - CPPUNIT_ASSERT(adaptor!=0); - int rc=zookeeper_close(zh); - zh=0; - CPPUNIT_ASSERT_EQUAL((int)ZOK,rc); - } - } - void testCloseConnected1() - { - // frozen time -- no timeouts and no pings - Mock_gettimeofday timeMock; - - for(int i=0;i<100;i++){ - ZookeeperServer zkServer; - Mock_poll pollMock(&zkServer,ZookeeperServer::FD); - // use a checked version of pthread calls - CheckedPthread threadMock; - // do not actually free the memory while in zookeeper_close() - Mock_free_noop freeMock; - - zh=zookeeper_init("localhost:2121",watcher,10000,TEST_CLIENT_ID,0,0); - CPPUNIT_ASSERT(zh!=0); - // make sure the client has connected - CPPUNIT_ASSERT(ensureCondition(ClientConnected(zh),1000)<1000); - // make a copy of zhandle before close() overwrites some of - // its members with NULLs - zhandle_t lzh; - memcpy(&lzh,zh,sizeof(lzh)); - int rc=zookeeper_close(zh); - zhandle_t* savezh=zh; zh=0; - // we're done, disable mock's fake free(), use libc's free() instead - freeMock.disable(); - - CPPUNIT_ASSERT_EQUAL((int)ZOK,rc); - adaptor_threads* adaptor=(adaptor_threads*)lzh.adaptor_priv; - // memory - CPPUNIT_ASSERT_EQUAL(1,freeMock.getFreeCount(savezh)); - CPPUNIT_ASSERT_EQUAL(1,freeMock.getFreeCount(lzh.hostname)); - CPPUNIT_ASSERT_EQUAL(1,freeMock.getFreeCount(lzh.addrs)); - CPPUNIT_ASSERT_EQUAL(1,freeMock.getFreeCount(adaptor)); - // threads - CPPUNIT_ASSERT_EQUAL(1,CheckedPthread::getDestroyCounter(adaptor->io)); - CPPUNIT_ASSERT_EQUAL(1,CheckedPthread::getDestroyCounter(adaptor->completion)); - // mutexes - CPPUNIT_ASSERT_EQUAL(1,CheckedPthread::getDestroyCounter(&savezh->to_process.lock)); - CPPUNIT_ASSERT_EQUAL(0,CheckedPthread::getInvalidAccessCounter(&savezh->to_process.lock)); - CPPUNIT_ASSERT_EQUAL(1,CheckedPthread::getDestroyCounter(&savezh->to_send.lock)); - CPPUNIT_ASSERT_EQUAL(0,CheckedPthread::getInvalidAccessCounter(&savezh->to_send.lock)); - CPPUNIT_ASSERT_EQUAL(1,CheckedPthread::getDestroyCounter(&savezh->sent_requests.lock)); - CPPUNIT_ASSERT_EQUAL(0,CheckedPthread::getInvalidAccessCounter(&savezh->sent_requests.lock)); - CPPUNIT_ASSERT_EQUAL(1,CheckedPthread::getDestroyCounter(&savezh->completions_to_process.lock)); - CPPUNIT_ASSERT_EQUAL(0,CheckedPthread::getInvalidAccessCounter(&savezh->completions_to_process.lock)); - // conditionals - CPPUNIT_ASSERT_EQUAL(1,CheckedPthread::getDestroyCounter(&savezh->sent_requests.cond)); - CPPUNIT_ASSERT_EQUAL(0,CheckedPthread::getInvalidAccessCounter(&savezh->sent_requests.cond)); - CPPUNIT_ASSERT_EQUAL(1,CheckedPthread::getDestroyCounter(&savezh->completions_to_process.cond)); - CPPUNIT_ASSERT_EQUAL(0,CheckedPthread::getInvalidAccessCounter(&savezh->completions_to_process.cond)); - } - } - - struct PointerFreed{ - PointerFreed(Mock_free_noop& freeMock,void* ptr): - freeMock_(freeMock),ptr_(ptr){} - bool operator()() const{return freeMock_.isFreed(ptr_); } - Mock_free_noop& freeMock_; - void* ptr_; - }; - // test if zookeeper_close may be called from a watcher callback on - // SESSION_EXPIRED event - void testCloseFromWatcher1() - { - // frozen time -- no timeouts and no pings - Mock_gettimeofday timeMock; - - for(int i=0;i<100;i++){ - ZookeeperServer zkServer; - // make the server return a non-matching session id - zkServer.returnSessionExpired(); - - Mock_poll pollMock(&zkServer,ZookeeperServer::FD); - // use a checked version of pthread calls - CheckedPthread threadMock; - // do not actually free the memory while in zookeeper_close() - Mock_free_noop freeMock; - - CloseOnSessionExpired closeAction; - zh=zookeeper_init("localhost:2121",activeWatcher,10000, - TEST_CLIENT_ID,&closeAction,0); - - CPPUNIT_ASSERT(zh!=0); - // we rely on the fact that zh is freed the last right before - // zookeeper_close() returns... - CPPUNIT_ASSERT(ensureCondition(PointerFreed(freeMock,zh),1000)<1000); - zhandle_t* lzh=zh; - zh=0; - // we're done, disable mock's fake free(), use libc's free() instead - freeMock.disable(); - - CPPUNIT_ASSERT_EQUAL((int)ZOK,closeAction.rc); - adaptor_threads* adaptor=(adaptor_threads*)closeAction.lzh.adaptor_priv; - // memory - CPPUNIT_ASSERT_EQUAL(1,freeMock.getFreeCount(lzh)); - CPPUNIT_ASSERT_EQUAL(1,freeMock.getFreeCount(closeAction.lzh.hostname)); - CPPUNIT_ASSERT_EQUAL(1,freeMock.getFreeCount(closeAction.lzh.addrs)); - CPPUNIT_ASSERT_EQUAL(1,freeMock.getFreeCount(adaptor)); - // threads - CPPUNIT_ASSERT_EQUAL(1,CheckedPthread::getDestroyCounter(adaptor->io)); - CPPUNIT_ASSERT_EQUAL(1,CheckedPthread::getDestroyCounter(adaptor->completion)); - // mutexes - CPPUNIT_ASSERT_EQUAL(1,CheckedPthread::getDestroyCounter(&lzh->to_process.lock)); - CPPUNIT_ASSERT_EQUAL(0,CheckedPthread::getInvalidAccessCounter(&lzh->to_process.lock)); - CPPUNIT_ASSERT_EQUAL(1,CheckedPthread::getDestroyCounter(&lzh->to_send.lock)); - CPPUNIT_ASSERT_EQUAL(0,CheckedPthread::getInvalidAccessCounter(&lzh->to_send.lock)); - CPPUNIT_ASSERT_EQUAL(1,CheckedPthread::getDestroyCounter(&lzh->sent_requests.lock)); - CPPUNIT_ASSERT_EQUAL(0,CheckedPthread::getInvalidAccessCounter(&lzh->sent_requests.lock)); - CPPUNIT_ASSERT_EQUAL(1,CheckedPthread::getDestroyCounter(&lzh->completions_to_process.lock)); - CPPUNIT_ASSERT_EQUAL(0,CheckedPthread::getInvalidAccessCounter(&lzh->completions_to_process.lock)); - // conditionals - CPPUNIT_ASSERT_EQUAL(1,CheckedPthread::getDestroyCounter(&lzh->sent_requests.cond)); - CPPUNIT_ASSERT_EQUAL(0,CheckedPthread::getInvalidAccessCounter(&lzh->sent_requests.cond)); - CPPUNIT_ASSERT_EQUAL(1,CheckedPthread::getDestroyCounter(&lzh->completions_to_process.cond)); - CPPUNIT_ASSERT_EQUAL(0,CheckedPthread::getInvalidAccessCounter(&lzh->completions_to_process.cond)); - } - } - - void testIOThreadStoppedOnExpire() - { - // frozen time -- no timeouts and no pings - Mock_gettimeofday timeMock; - - for(int i=0;i<100;i++){ - ZookeeperServer zkServer; - // make the server return a non-matching session id - zkServer.returnSessionExpired(); - - Mock_poll pollMock(&zkServer,ZookeeperServer::FD); - // use a checked version of pthread calls - CheckedPthread threadMock; - // do not call zookeeper_close() from the watcher - CloseOnSessionExpired closeAction(false); - zh=zookeeper_init("localhost:2121",activeWatcher,10000, - &testClientId,&closeAction,0); - - // this is to ensure that if any assert fires, zookeeper_close() - // will still be called while all the mocks are in the scope! - CloseFinally guard(&zh); - - CPPUNIT_ASSERT(zh!=0); - CPPUNIT_ASSERT(ensureCondition(SessionExpired(zh),1000)<1000); - CPPUNIT_ASSERT(ensureCondition(IOThreadStopped(zh),1000)<1000); - // make sure the watcher has been processed - CPPUNIT_ASSERT(ensureCondition(closeAction.isWatcherTriggered(),1000)<1000); - // make sure the threads have not been destroyed yet - adaptor_threads* adaptor=(adaptor_threads*)zh->adaptor_priv; - CPPUNIT_ASSERT_EQUAL(0,CheckedPthread::getDestroyCounter(adaptor->io)); - CPPUNIT_ASSERT_EQUAL(0,CheckedPthread::getDestroyCounter(adaptor->completion)); - // about to call zookeeper_close() -- no longer need the guard - guard.disarm(); - - // do not actually free the memory while in zookeeper_close() - Mock_free_noop freeMock; - zookeeper_close(zh); - zhandle_t* lzh=zh; zh=0; - // we're done, disable mock's fake free(), use libc's free() instead - freeMock.disable(); - - // memory - CPPUNIT_ASSERT_EQUAL(1,freeMock.getFreeCount(lzh)); - CPPUNIT_ASSERT_EQUAL(1,freeMock.getFreeCount(closeAction.lzh.hostname)); - CPPUNIT_ASSERT_EQUAL(1,freeMock.getFreeCount(closeAction.lzh.addrs)); - CPPUNIT_ASSERT_EQUAL(1,freeMock.getFreeCount(adaptor)); - // threads - CPPUNIT_ASSERT_EQUAL(1,CheckedPthread::getDestroyCounter(adaptor->io)); - CPPUNIT_ASSERT_EQUAL(1,CheckedPthread::getDestroyCounter(adaptor->completion)); - // mutexes - CPPUNIT_ASSERT_EQUAL(1,CheckedPthread::getDestroyCounter(&lzh->to_process.lock)); - CPPUNIT_ASSERT_EQUAL(0,CheckedPthread::getInvalidAccessCounter(&lzh->to_process.lock)); - CPPUNIT_ASSERT_EQUAL(1,CheckedPthread::getDestroyCounter(&lzh->to_send.lock)); - CPPUNIT_ASSERT_EQUAL(0,CheckedPthread::getInvalidAccessCounter(&lzh->to_send.lock)); - CPPUNIT_ASSERT_EQUAL(1,CheckedPthread::getDestroyCounter(&lzh->sent_requests.lock)); - CPPUNIT_ASSERT_EQUAL(0,CheckedPthread::getInvalidAccessCounter(&lzh->sent_requests.lock)); - CPPUNIT_ASSERT_EQUAL(1,CheckedPthread::getDestroyCounter(&lzh->completions_to_process.lock)); - CPPUNIT_ASSERT_EQUAL(0,CheckedPthread::getInvalidAccessCounter(&lzh->completions_to_process.lock)); - // conditionals - CPPUNIT_ASSERT_EQUAL(1,CheckedPthread::getDestroyCounter(&lzh->sent_requests.cond)); - CPPUNIT_ASSERT_EQUAL(0,CheckedPthread::getInvalidAccessCounter(&lzh->sent_requests.cond)); - CPPUNIT_ASSERT_EQUAL(1,CheckedPthread::getDestroyCounter(&lzh->completions_to_process.cond)); - CPPUNIT_ASSERT_EQUAL(0,CheckedPthread::getInvalidAccessCounter(&lzh->completions_to_process.cond)); - } - } - -#endif -}; - -CPPUNIT_TEST_SUITE_REGISTRATION(Zookeeper_close); diff --git a/pkg/registry/zookeeper-3.4.6/src/c/tests/TestZookeeperInit.cc b/pkg/registry/zookeeper-3.4.6/src/c/tests/TestZookeeperInit.cc deleted file mode 100644 index eadf41d2d..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/c/tests/TestZookeeperInit.cc +++ /dev/null @@ -1,301 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you 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. - */ - -#include -#include -#include -#include - -#include "Util.h" -#include "LibCMocks.h" -#include "ZKMocks.h" - -#ifdef THREADED -#include "PthreadMocks.h" -#else -class MockPthreadsNull; -#endif - -using namespace std; - -class Zookeeper_init : public CPPUNIT_NS::TestFixture -{ - CPPUNIT_TEST_SUITE(Zookeeper_init); - CPPUNIT_TEST(testBasic); - CPPUNIT_TEST(testAddressResolution); - CPPUNIT_TEST(testMultipleAddressResolution); - CPPUNIT_TEST(testNullAddressString); - CPPUNIT_TEST(testEmptyAddressString); - CPPUNIT_TEST(testOneSpaceAddressString); - CPPUNIT_TEST(testTwoSpacesAddressString); - CPPUNIT_TEST(testInvalidAddressString1); - CPPUNIT_TEST(testInvalidAddressString2); - CPPUNIT_TEST(testNonexistentHost); - CPPUNIT_TEST(testOutOfMemory_init); - CPPUNIT_TEST(testOutOfMemory_getaddrs1); -#if !defined(__CYGWIN__) // not valid for cygwin - CPPUNIT_TEST(testOutOfMemory_getaddrs2); -#endif - CPPUNIT_TEST(testPermuteAddrsList); - CPPUNIT_TEST_SUITE_END(); - zhandle_t *zh; - MockPthreadsNull* pthreadMock; - static void watcher(zhandle_t *, int , int , const char *,void*){} - FILE *logfile; -public: - Zookeeper_init():zh(0),pthreadMock(0){ - logfile = openlogfile("Zookeeper_init"); - } - - ~Zookeeper_init() { - if (logfile) { - fflush(logfile); - fclose(logfile); - logfile = 0; - } - } - - void setUp() - { - zoo_set_log_stream(logfile); - - zoo_deterministic_conn_order(0); -#ifdef THREADED - // disable threading - pthreadMock=new MockPthreadZKNull; -#endif - zh=0; - } - - void tearDown() - { - zookeeper_close(zh); -#ifdef THREADED - delete pthreadMock; -#endif - } - - void testBasic() - { - const string EXPECTED_HOST("127.0.0.1:2121"); - const int EXPECTED_ADDRS_COUNT =1; - const int EXPECTED_RECV_TIMEOUT=10000; - clientid_t cid; - memset(&cid,0xFE,sizeof(cid)); - - zh=zookeeper_init(EXPECTED_HOST.c_str(),watcher,EXPECTED_RECV_TIMEOUT, - &cid,(void*)1,0); - - CPPUNIT_ASSERT(zh!=0); - CPPUNIT_ASSERT(zh->fd == -1); - CPPUNIT_ASSERT(zh->hostname!=0); - CPPUNIT_ASSERT_EQUAL(EXPECTED_ADDRS_COUNT,zh->addrs_count); - CPPUNIT_ASSERT_EQUAL(EXPECTED_HOST,string(zh->hostname)); - CPPUNIT_ASSERT(zh->state == NOTCONNECTED_STATE_DEF); - CPPUNIT_ASSERT(zh->context == (void*)1); - CPPUNIT_ASSERT_EQUAL(EXPECTED_RECV_TIMEOUT,zh->recv_timeout); - CPPUNIT_ASSERT(zh->watcher == watcher); - CPPUNIT_ASSERT(zh->connect_index==0); - CPPUNIT_ASSERT(zh->primer_buffer.buffer==zh->primer_storage_buffer); - CPPUNIT_ASSERT(zh->primer_buffer.curr_offset ==0); - CPPUNIT_ASSERT(zh->primer_buffer.len == sizeof(zh->primer_storage_buffer)); - CPPUNIT_ASSERT(zh->primer_buffer.next == 0); - CPPUNIT_ASSERT(zh->last_zxid ==0); - CPPUNIT_ASSERT(memcmp(&zh->client_id,&cid,sizeof(cid))==0); - -#ifdef THREADED - // thread specific checks - adaptor_threads* adaptor=(adaptor_threads*)zh->adaptor_priv; - CPPUNIT_ASSERT(adaptor!=0); - CPPUNIT_ASSERT(pthreadMock->pthread_createCounter==2); - CPPUNIT_ASSERT(MockPthreadsNull::isInitialized(adaptor->io)); - CPPUNIT_ASSERT(MockPthreadsNull::isInitialized(adaptor->completion)); - CPPUNIT_ASSERT(MockPthreadsNull::isInitialized(&zh->to_process.lock)); - CPPUNIT_ASSERT(MockPthreadsNull::isInitialized(&zh->to_send.lock)); - CPPUNIT_ASSERT(MockPthreadsNull::isInitialized(&zh->sent_requests.lock)); - CPPUNIT_ASSERT(MockPthreadsNull::isInitialized(&zh->completions_to_process.lock)); - CPPUNIT_ASSERT(MockPthreadsNull::isInitialized(&zh->sent_requests.cond)); - CPPUNIT_ASSERT(MockPthreadsNull::isInitialized(&zh->completions_to_process.cond)); -#endif - } - void testAddressResolution() - { - const char EXPECTED_IPS[][4]={{127,0,0,1}}; - const int EXPECTED_ADDRS_COUNT =COUNTOF(EXPECTED_IPS); - - zoo_deterministic_conn_order(1); - zh=zookeeper_init("127.0.0.1:2121",0,10000,0,0,0); - - CPPUNIT_ASSERT(zh!=0); - CPPUNIT_ASSERT_EQUAL(EXPECTED_ADDRS_COUNT,zh->addrs_count); - for(int i=0;iaddrs_count;i++){ - sockaddr_in* addr=(struct sockaddr_in*)&zh->addrs[i]; - CPPUNIT_ASSERT(memcmp(EXPECTED_IPS[i],&addr->sin_addr,sizeof(addr->sin_addr))==0); - CPPUNIT_ASSERT_EQUAL(2121,(int)ntohs(addr->sin_port)); - } - } - void testMultipleAddressResolution() - { - const string EXPECTED_HOST("127.0.0.1:2121,127.0.0.2:3434"); - const char EXPECTED_IPS[][4]={{127,0,0,1},{127,0,0,2}}; - const int EXPECTED_ADDRS_COUNT =COUNTOF(EXPECTED_IPS); - - zoo_deterministic_conn_order(1); - zh=zookeeper_init(EXPECTED_HOST.c_str(),0,1000,0,0,0); - - CPPUNIT_ASSERT(zh!=0); - CPPUNIT_ASSERT_EQUAL(EXPECTED_ADDRS_COUNT,zh->addrs_count); - - for(int i=0;iaddrs_count;i++){ - sockaddr_in* addr=(struct sockaddr_in*)&zh->addrs[i]; - CPPUNIT_ASSERT(memcmp(EXPECTED_IPS[i],&addr->sin_addr,sizeof(addr->sin_addr))==0); - if(i<1) - CPPUNIT_ASSERT_EQUAL(2121,(int)ntohs(addr->sin_port)); - else - CPPUNIT_ASSERT_EQUAL(3434,(int)ntohs(addr->sin_port)); - } - } - void testMultipleAddressWithSpace() - { - const string EXPECTED_HOST("127.0.0.1:2121, 127.0.0.2:3434"); - const char EXPECTED_IPS[][4]={{127,0,0,1},{127,0,0,2}}; - const int EXPECTED_ADDRS_COUNT =COUNTOF(EXPECTED_IPS); - - zoo_deterministic_conn_order(1); - zh=zookeeper_init(EXPECTED_HOST.c_str(),0,1000,0,0,0); - - CPPUNIT_ASSERT(zh!=0); - CPPUNIT_ASSERT_EQUAL(EXPECTED_ADDRS_COUNT,zh->addrs_count); - - for(int i=0;iaddrs_count;i++){ - sockaddr_in* addr=(struct sockaddr_in*)&zh->addrs[i]; - CPPUNIT_ASSERT(memcmp(EXPECTED_IPS[i],&addr->sin_addr,sizeof(addr->sin_addr))==0); - if(i<1) - CPPUNIT_ASSERT_EQUAL(2121,(int)ntohs(addr->sin_port)); - else - CPPUNIT_ASSERT_EQUAL(3434,(int)ntohs(addr->sin_port)); - } - } - void testNullAddressString() - { - zh=zookeeper_init(NULL,0,0,0,0,0); - CPPUNIT_ASSERT(zh==0); - CPPUNIT_ASSERT_EQUAL(EINVAL,errno); - } - void testEmptyAddressString() - { - const string INVALID_HOST(""); - zh=zookeeper_init(INVALID_HOST.c_str(),0,0,0,0,0); - CPPUNIT_ASSERT(zh==0); - CPPUNIT_ASSERT_EQUAL(EINVAL,errno); - } - void testOneSpaceAddressString() - { - const string INVALID_HOST(" "); - zh=zookeeper_init(INVALID_HOST.c_str(),0,0,0,0,0); - CPPUNIT_ASSERT(zh==0); - CPPUNIT_ASSERT_EQUAL(EINVAL,errno); - } - void testTwoSpacesAddressString() - { - const string INVALID_HOST(" "); - zh=zookeeper_init(INVALID_HOST.c_str(),0,0,0,0,0); - CPPUNIT_ASSERT(zh==0); - CPPUNIT_ASSERT_EQUAL(EINVAL,errno); - } - void testInvalidAddressString1() - { - const string INVALID_HOST("host1"); - zh=zookeeper_init(INVALID_HOST.c_str(),0,0,0,0,0); - CPPUNIT_ASSERT(zh==0); - CPPUNIT_ASSERT_EQUAL(EINVAL,errno); - } - void testInvalidAddressString2() - { - const string INVALID_HOST("host1:1111+host:123"); - zh=zookeeper_init(INVALID_HOST.c_str(),0,0,0,0,0); - CPPUNIT_ASSERT(zh==0); - CPPUNIT_ASSERT((ENOENT|EINVAL) & errno); - } - void testNonexistentHost() - { - const string EXPECTED_HOST("host1.blabadibla.bla.:1111"); - - zh=zookeeper_init(EXPECTED_HOST.c_str(),0,0,0,0,0); - - CPPUNIT_ASSERT(zh==0); - //With the switch to thread safe getaddrinfo, we don't get - //these global variables - //CPPUNIT_ASSERT_EQUAL(EINVAL,errno); - //CPPUNIT_ASSERT_EQUAL(HOST_NOT_FOUND,h_errno); - } - void testOutOfMemory_init() - { - Mock_calloc mock; - mock.callsBeforeFailure=0; // fail first calloc in init() - - zh=zookeeper_init("ahost:123",watcher,10000,0,0,0); - - CPPUNIT_ASSERT(zh==0); - CPPUNIT_ASSERT_EQUAL(ENOMEM,errno); - } - void testOutOfMemory_getaddrs1() - { - Mock_realloc reallocMock; - reallocMock.callsBeforeFailure=0; // fail on first call to realloc - - zh=zookeeper_init("127.0.0.1:123",0,0,0,0,0); - - CPPUNIT_ASSERT(zh==0); - CPPUNIT_ASSERT_EQUAL(ENOMEM,errno); - } - void testOutOfMemory_getaddrs2() - { - Mock_realloc reallocMock; - reallocMock.callsBeforeFailure=1; // fail on the second call to realloc - - zh=zookeeper_init("127.0.0.1:123,127.0.0.2:123,127.0.0.3:123,127.0.0.4:123,127.0.0.5:123,127.0.0.6:123,127.0.0.7:123,127.0.0.8:123,127.0.0.9:123,127.0.0.10:123,127.0.0.11:123,127.0.0.12:123,127.0.0.13:123,127.0.0.14:123,127.0.0.15:123,127.0.0.16:123,127.0.0.17:123",0,0,0,0,0); - - CPPUNIT_ASSERT(zh==0); - CPPUNIT_ASSERT_EQUAL(ENOMEM,errno); - } - void testPermuteAddrsList() - { - const char EXPECTED[][5]={"\0\0\0\0","\1\1\1\1","\2\2\2\2","\3\3\3\3"}; - const int EXPECTED_ADDR_COUNT=COUNTOF(EXPECTED); - - const int RAND_SEQ[]={0,1,1,-1}; - const int RAND_SIZE=COUNTOF(RAND_SEQ); - Mock_random randomMock; - randomMock.randomReturns.assign(RAND_SEQ,RAND_SEQ+RAND_SIZE-1); - zh=zookeeper_init("0.0.0.0:123,1.1.1.1:123,2.2.2.2:123,3.3.3.3:123",0,1000,0,0,0); - - CPPUNIT_ASSERT(zh!=0); - CPPUNIT_ASSERT_EQUAL(EXPECTED_ADDR_COUNT,zh->addrs_count); - const string EXPECTED_SEQ("3210"); - char ACTUAL_SEQ[EXPECTED_ADDR_COUNT+1]; ACTUAL_SEQ[EXPECTED_ADDR_COUNT]=0; - for(int i=0;iaddrs_count;i++){ - sockaddr_in* addr=(struct sockaddr_in*)&zh->addrs[i]; - // match the first byte of the EXPECTED and of the actual address - ACTUAL_SEQ[i]=((char*)&addr->sin_addr)[0]+'0'; - } - CPPUNIT_ASSERT_EQUAL(EXPECTED_SEQ,string(ACTUAL_SEQ)); - } -}; - -CPPUNIT_TEST_SUITE_REGISTRATION(Zookeeper_init); diff --git a/pkg/registry/zookeeper-3.4.6/src/c/tests/ThreadingUtil.cc b/pkg/registry/zookeeper-3.4.6/src/c/tests/ThreadingUtil.cc deleted file mode 100644 index 3b5170abb..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/c/tests/ThreadingUtil.cc +++ /dev/null @@ -1,87 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you 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. - */ - -#include -#include "ThreadingUtil.h" -#include "LibCSymTable.h" - -#ifdef THREADED - -// **************************************************************************** -// Mutex wrapper -struct Mutex::Impl{ - Impl(){ - LIBC_SYMBOLS.pthread_mutex_init(&mut_, 0); - } - ~Impl(){ - LIBC_SYMBOLS.pthread_mutex_destroy(&mut_); - } - pthread_mutex_t mut_; -}; - -Mutex::Mutex():impl_(new Impl) {} -Mutex::~Mutex() { delete impl_;} -void Mutex::acquire() { - LIBC_SYMBOLS.pthread_mutex_lock(&impl_->mut_); -} -void Mutex::release() { - LIBC_SYMBOLS.pthread_mutex_unlock(&impl_->mut_); -} - -// **************************************************************************** -// Atomics -int32_t atomic_post_incr(volatile int32_t* operand, int32_t incr) -{ -#if defined(__GNUC__) - return __sync_fetch_and_add(operand,incr); -#else - int32_t result; - __asm__ __volatile__( - "lock xaddl %0,%1\n" - : "=r"(result), "=m"(*operand) - : "0"(incr) - : "memory"); - return result; -#endif -} -int32_t atomic_fetch_store(volatile int32_t *ptr, int32_t value) -{ -#if defined(__GNUC__) - return __sync_lock_test_and_set(ptr,value); -#else - int32_t result; - __asm__ __volatile__("lock xchgl %0,%1\n" - : "=r"(result), "=m"(*ptr) - : "0"(value) - : "memory"); - return result; -#endif -} -#else -int32_t atomic_post_incr(volatile int32_t* operand, int32_t incr){ - int32_t v=*operand; - *operand+=incr; - return v; -} -int32_t atomic_fetch_store(volatile int32_t *ptr, int32_t value) -{ - int32_t result=*ptr; - *ptr=value; - return result; -} -#endif // THREADED diff --git a/pkg/registry/zookeeper-3.4.6/src/c/tests/ThreadingUtil.h b/pkg/registry/zookeeper-3.4.6/src/c/tests/ThreadingUtil.h deleted file mode 100644 index 9165412bc..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/c/tests/ThreadingUtil.h +++ /dev/null @@ -1,261 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you 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. - */ - -#ifndef THREADINGUTIL_H_ -#define THREADINGUTIL_H_ - -#include - -#ifdef THREADED -#include "pthread.h" -#endif - -// ***************************************************************************** -// Threading primitives - -// atomic post-increment; returns the previous value of the operand -int32_t atomic_post_incr(volatile int32_t* operand, int32_t incr); -// atomic fetch&store; returns the previous value of the operand -int32_t atomic_fetch_store(volatile int32_t *operand, int32_t value); - -// a partial implementation of an atomic integer type -class AtomicInt{ -public: - explicit AtomicInt(int32_t init=0):v_(init){} - AtomicInt(const AtomicInt& other):v_(other){} - // assigment - AtomicInt& operator=(const AtomicInt& lhs){ - atomic_fetch_store(&v_,lhs); - return *this; - } - AtomicInt& operator=(int32_t i){ - atomic_fetch_store(&v_,i); - return *this; - } - // pre-increment - AtomicInt& operator++() { - atomic_post_incr(&v_,1); - return *this; - } - // pre-decrement - AtomicInt& operator--() { - atomic_post_incr(&v_,-1); - return *this; - } - // post-increment - AtomicInt operator++(int){ - return AtomicInt(atomic_post_incr(&v_,1)); - } - // post-decrement - AtomicInt operator--(int){ - return AtomicInt(atomic_post_incr(&v_,-1)); - } - - operator int() const{ - return atomic_post_incr(&v_,0); - } - int get() const{ - return atomic_post_incr(&v_,0); - } -private: - mutable int32_t v_; -}; - -#ifdef THREADED -// **************************************************************************** -#define VALIDATE_JOBS(jm) jm.validateJobs(__FILE__,__LINE__) -#define VALIDATE_JOB(j) j.validate(__FILE__,__LINE__) - -class Mutex{ -public: - Mutex(); - ~Mutex(); - void acquire(); - void release(); -private: - Mutex(const Mutex&); - Mutex& operator=(const Mutex&); - struct Impl; - Impl* impl_; -}; - -class MTLock{ -public: - MTLock(Mutex& m):m_(m){m.acquire();} - ~MTLock(){m_.release();} - Mutex& m_; -}; - -#define synchronized(m) MTLock __lock(m) - -// **************************************************************************** -class Latch { -public: - virtual ~Latch() {} - virtual void await() const =0; - virtual void signalAndWait() =0; - virtual void signal() =0; -}; - -class CountDownLatch: public Latch { -public: - CountDownLatch(int count):count_(count) { - pthread_cond_init(&cond_,0); - pthread_mutex_init(&mut_,0); - } - virtual ~CountDownLatch() { - pthread_mutex_lock(&mut_); - if(count_!=0) { - count_=0; - pthread_cond_broadcast(&cond_); - } - pthread_mutex_unlock(&mut_); - - pthread_cond_destroy(&cond_); - pthread_mutex_destroy(&mut_); - } - - virtual void await() const { - pthread_mutex_lock(&mut_); - awaitImpl(); - pthread_mutex_unlock(&mut_); - } - virtual void signalAndWait() { - pthread_mutex_lock(&mut_); - signalImpl(); - awaitImpl(); - pthread_mutex_unlock(&mut_); - } - virtual void signal() { - pthread_mutex_lock(&mut_); - signalImpl(); - pthread_mutex_unlock(&mut_); - } -private: - void awaitImpl() const{ - while(count_!=0) - pthread_cond_wait(&cond_,&mut_); - } - void signalImpl() { - if(count_>0) { - count_--; - pthread_cond_broadcast(&cond_); - } - } - int count_; - mutable pthread_mutex_t mut_; - mutable pthread_cond_t cond_; -}; - -class TestJob { -public: - typedef long JobId; - TestJob():hasRun_(false),startLatch_(0),endLatch_(0) {} - virtual ~TestJob() { - join(); - } - virtual TestJob* clone() const =0; - - virtual void run() =0; - virtual void validate(const char* file, int line) const =0; - - virtual void start(Latch* startLatch=0,Latch* endLatch=0) { - startLatch_=startLatch;endLatch_=endLatch; - hasRun_=true; - pthread_create(&thread_, 0, thread, this); - } - virtual JobId getJobId() const { - return (JobId)thread_; - } - virtual void join() { - if(!hasRun_) - return; - if(!pthread_equal(thread_,pthread_self())) - pthread_join(thread_,0); - else - pthread_detach(thread_); - } -private: - void awaitStart() { - if(startLatch_==0) return; - startLatch_->signalAndWait(); - } - void signalFinished() { - if(endLatch_==0) return; - endLatch_->signal(); - } - static void* thread(void* p) { - TestJob* j=(TestJob*)p; - j->awaitStart(); // wait for the start command - j->run(); - j->signalFinished(); - return 0; - } - bool hasRun_; - Latch* startLatch_; - Latch* endLatch_; - pthread_t thread_; -}; - -class TestJobManager { - typedef std::vector JobList; -public: - TestJobManager(const TestJob& tj,int threadCount=1): - startLatch_(threadCount),endLatch_(threadCount) - { - for(int i=0;istart(&startLatch_,&endLatch_); - } - virtual void startJobsImmediately() { - for(unsigned i=0;istart(0,&endLatch_); - } - virtual void wait() const { - endLatch_.await(); - } - virtual void validateJobs(const char* file, int line) const{ - for(unsigned i=0;ivalidate(file,line); - } -private: - JobList jobs_; - CountDownLatch startLatch_; - CountDownLatch endLatch_; -}; - -#else // THREADED -// single THREADED -class Mutex{ -public: - void acquire(){} - void release(){} -}; -#define synchronized(m) - -#endif // THREADED - -#endif /*THREADINGUTIL_H_*/ diff --git a/pkg/registry/zookeeper-3.4.6/src/c/tests/Util.cc b/pkg/registry/zookeeper-3.4.6/src/c/tests/Util.cc deleted file mode 100644 index 2b9da84eb..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/c/tests/Util.cc +++ /dev/null @@ -1,51 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you 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. - */ - -#include "Util.h" -#include "string.h" - -const std::string EMPTY_STRING; - -TestConfig globalTestConfig; - -void millisleep(int ms){ - timespec ts; - ts.tv_sec=ms/1000; - ts.tv_nsec=(ms%1000)*1000000; // to nanoseconds - nanosleep(&ts,0); -} - -FILE *openlogfile(const char* testname) { - char name[1024]; - strcpy(name, "TEST-"); - strncpy(name + 5, testname, sizeof(name) - 5); -#ifdef THREADED - strcpy(name + strlen(name), "-mt.txt"); -#else - strcpy(name + strlen(name), "-st.txt"); -#endif - - FILE *logfile = fopen(name, "a"); - - if (logfile == 0) { - fprintf(stderr, "Can't open log file %s!\n", name); - return 0; - } - - return logfile; -} diff --git a/pkg/registry/zookeeper-3.4.6/src/c/tests/Util.h b/pkg/registry/zookeeper-3.4.6/src/c/tests/Util.h deleted file mode 100644 index 01e21ce25..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/c/tests/Util.h +++ /dev/null @@ -1,137 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you 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. - */ - -#ifndef UTIL_H_ -#define UTIL_H_ - -#include -#include -#include - -#include "zookeeper_log.h" - -// number of elements in array -#define COUNTOF(array) sizeof(array)/sizeof(array[0]) - -#define DECLARE_WRAPPER(ret,sym,sig) \ - extern "C" ret __real_##sym sig; \ - extern "C" ret __wrap_##sym sig - -#define CALL_REAL(sym,params) \ - __real_##sym params - -// must include "src/zookeeper_log.h" to be able to use this macro -#define TEST_TRACE(x) \ - log_message(ZOO_LOG_LEVEL_DEBUG,__LINE__,__func__,format_log_message x) - -extern const std::string EMPTY_STRING; - -// ***************************************************************************** -// A bit of wizardry to get to the bare type from a reference or a pointer -// to the type -template -struct TypeOp { - typedef T BareT; - typedef T ArgT; -}; - -// partial specialization for reference types -template -struct TypeOp{ - typedef T& ArgT; - typedef typename TypeOp::BareT BareT; -}; - -// partial specialization for pointers -template -struct TypeOp{ - typedef T* ArgT; - typedef typename TypeOp::BareT BareT; -}; - -// ***************************************************************************** -// Container utilities - -template -void putValue(std::map& map,const K& k, const V& v){ - typedef std::map Map; - typename Map::const_iterator it=map.find(k); - if(it==map.end()) - map.insert(typename Map::value_type(k,v)); - else - map[k]=v; -} - -template -bool getValue(const std::map& map,const K& k,V& v){ - typedef std::map Map; - typename Map::const_iterator it=map.find(k); - if(it==map.end()) - return false; - v=it->second; - return true; -} - -// ***************************************************************************** -// misc utils - -// millisecond sleep -void millisleep(int ms); -FILE *openlogfile(const char* name); -// evaluate given predicate until it returns true or the timeout -// (in millis) has expired -template -int ensureCondition(const Predicate& p,int timeout){ - int elapsed=0; - while(!p() && elapsed CmdLineOptList; -public: - typedef CmdLineOptList::const_iterator const_iterator; - TestConfig(){} - ~TestConfig(){} - void addConfigFromCmdLine(int argc, char* argv[]){ - if(argc>=2) - testName_=argv[1]; - for(int i=2; i - -// function to conveniently stream vectors -template -std::ostream& operator<<(std::ostream& os,const std::vector& c){ - typedef std::vector V; - os<<"["; - if(c.size()>0){ - for(typename V::const_iterator it=c.begin();it!=c.end();++it) - os<<*it<<","; - os.seekp(-1,std::ios::cur); - } - os<<"]"; - return os; -} - -#endif // _VECTOR_UTIL_H diff --git a/pkg/registry/zookeeper-3.4.6/src/c/tests/ZKMocks.cc b/pkg/registry/zookeeper-3.4.6/src/c/tests/ZKMocks.cc deleted file mode 100644 index 89166747f..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/c/tests/ZKMocks.cc +++ /dev/null @@ -1,519 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you 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. - */ - -#include // for htonl -#include - -#include -#include - -#ifdef THREADED -#include "PthreadMocks.h" -#endif -#include "ZKMocks.h" - -using namespace std; - -TestClientId testClientId; -const char* TestClientId::PASSWD="1234567890123456"; - -HandshakeRequest* HandshakeRequest::parse(const std::string& buf){ - auto_ptr req(new HandshakeRequest); - - memcpy(&req->protocolVersion,buf.data(), sizeof(req->protocolVersion)); - req->protocolVersion = htonl(req->protocolVersion); - - int offset=sizeof(req->protocolVersion); - - memcpy(&req->lastZxidSeen,buf.data()+offset,sizeof(req->lastZxidSeen)); - req->lastZxidSeen = htonll(req->lastZxidSeen); - offset+=sizeof(req->lastZxidSeen); - - memcpy(&req->timeOut,buf.data()+offset,sizeof(req->timeOut)); - req->timeOut = htonl(req->timeOut); - offset+=sizeof(req->timeOut); - - memcpy(&req->sessionId,buf.data()+offset,sizeof(req->sessionId)); - req->sessionId = htonll(req->sessionId); - offset+=sizeof(req->sessionId); - - memcpy(&req->passwd_len,buf.data()+offset,sizeof(req->passwd_len)); - req->passwd_len = htonl(req->passwd_len); - offset+=sizeof(req->passwd_len); - - memcpy(req->passwd,buf.data()+offset,sizeof(req->passwd)); - if(testClientId.client_id==req->sessionId && - !memcmp(testClientId.passwd,req->passwd,sizeof(req->passwd))) - return req.release(); - // the request didn't match -- may not be a handshake request after all - return 0; -} - -// ***************************************************************************** -// watcher action implementation -void activeWatcher(zhandle_t *zh, int type, int state, const char *path,void* ctx){ - if(zh==0 || ctx==0) return; - WatcherAction* action=(WatcherAction*)ctx; - - if(type==ZOO_SESSION_EVENT){ - if(state==ZOO_EXPIRED_SESSION_STATE) - action->onSessionExpired(zh); - else if(state==ZOO_CONNECTING_STATE) - action->onConnectionLost(zh); - else if(state==ZOO_CONNECTED_STATE) - action->onConnectionEstablished(zh); - }else if(type==ZOO_CHANGED_EVENT) - action->onNodeValueChanged(zh,path); - else if(type==ZOO_DELETED_EVENT) - action->onNodeDeleted(zh,path); - else if(type==ZOO_CHILD_EVENT) - action->onChildChanged(zh,path); - // TODO: implement for the rest of the event types - // ... - action->setWatcherTriggered(); -} -SyncedBoolCondition WatcherAction::isWatcherTriggered() const{ - return SyncedBoolCondition(triggered_,mx_); -} - -// ***************************************************************************** -// a set of async completion signatures -void asyncCompletion(int rc, ACL_vector *acl,Stat *stat, const void *data){ - assert("Completion data is NULL"&&data); - static_cast((void*)data)->aclCompl(rc,acl,stat); -} -void asyncCompletion(int rc, const char *value, int len, const Stat *stat, - const void *data){ - assert("Completion data is NULL"&&data); - static_cast((void*)data)->dataCompl(rc,value,len,stat); -} -void asyncCompletion(int rc, const Stat *stat, const void *data){ - assert("Completion data is NULL"&&data); - static_cast((void*)data)->statCompl(rc,stat); -} -void asyncCompletion(int rc, const char *value, const void *data){ - assert("Completion data is NULL"&&data); - static_cast((void*)data)->stringCompl(rc,value); -} -void asyncCompletion(int rc,const String_vector *strings, const void *data){ - assert("Completion data is NULL"&&data); - static_cast((void*)data)->stringsCompl(rc,strings); -} -void asyncCompletion(int rc, const void *data){ - assert("Completion data is NULL"&&data); - static_cast((void*)data)->voidCompl(rc); -} - -// ***************************************************************************** -// a predicate implementation -bool IOThreadStopped::operator()() const{ -#ifdef THREADED - adaptor_threads* adaptor=(adaptor_threads*)zh_->adaptor_priv; - return CheckedPthread::isTerminated(adaptor->io); -#else - assert("IOThreadStopped predicate is only for use with THREADED client"&& false); - return false; -#endif -} - -//****************************************************************************** -// -DECLARE_WRAPPER(int,flush_send_queue,(zhandle_t*zh, int timeout)) -{ - if(!Mock_flush_send_queue::mock_) - return CALL_REAL(flush_send_queue,(zh,timeout)); - return Mock_flush_send_queue::mock_->call(zh,timeout); -} - -Mock_flush_send_queue* Mock_flush_send_queue::mock_=0; - -//****************************************************************************** -// -DECLARE_WRAPPER(int32_t,get_xid,()) -{ - if(!Mock_get_xid::mock_) - return CALL_REAL(get_xid,()); - return Mock_get_xid::mock_->call(); -} - -Mock_get_xid* Mock_get_xid::mock_=0; - -//****************************************************************************** -// activateWatcher mock - -DECLARE_WRAPPER(void,activateWatcher,(zhandle_t *zh, watcher_registration_t* reg, int rc)) -{ - if(!Mock_activateWatcher::mock_){ - CALL_REAL(activateWatcher,(zh, reg,rc)); - }else{ - Mock_activateWatcher::mock_->call(zh, reg,rc); - } -} -Mock_activateWatcher* Mock_activateWatcher::mock_=0; - -class ActivateWatcherWrapper: public Mock_activateWatcher{ -public: - ActivateWatcherWrapper():ctx_(0),activated_(false){} - - virtual void call(zhandle_t *zh, watcher_registration_t* reg, int rc){ - CALL_REAL(activateWatcher,(zh, reg,rc)); - synchronized(mx_); - if(reg->context==ctx_){ - activated_=true; - ctx_=0; - } - } - - void setContext(void* ctx){ - synchronized(mx_); - ctx_=ctx; - activated_=false; - } - - SyncedBoolCondition isActivated() const{ - return SyncedBoolCondition(activated_,mx_); - } - mutable Mutex mx_; - void* ctx_; - bool activated_; -}; - -WatcherActivationTracker::WatcherActivationTracker(): - wrapper_(new ActivateWatcherWrapper) -{ -} - -WatcherActivationTracker::~WatcherActivationTracker(){ - delete wrapper_; -} - -void WatcherActivationTracker::track(void* ctx){ - wrapper_->setContext(ctx); -} - -SyncedBoolCondition WatcherActivationTracker::isWatcherActivated() const{ - return wrapper_->isActivated(); -} - -//****************************************************************************** -// -DECLARE_WRAPPER(void,deliverWatchers,(zhandle_t* zh,int type,int state, const char* path, watcher_object_list_t **list)) -{ - if(!Mock_deliverWatchers::mock_){ - CALL_REAL(deliverWatchers,(zh,type,state,path, list)); - }else{ - Mock_deliverWatchers::mock_->call(zh,type,state,path, list); - } -} - -Mock_deliverWatchers* Mock_deliverWatchers::mock_=0; - -struct RefCounterValue{ - RefCounterValue(zhandle_t* const& zh,int32_t expectedCounter,Mutex& mx): - zh_(zh),expectedCounter_(expectedCounter),mx_(mx){} - bool operator()() const{ - { - synchronized(mx_); - if(zh_==0) - return false; - } - return inc_ref_counter(zh_,0)==expectedCounter_; - } - zhandle_t* const& zh_; - int32_t expectedCounter_; - Mutex& mx_; -}; - - -class DeliverWatchersWrapper: public Mock_deliverWatchers{ -public: - DeliverWatchersWrapper(int type,int state,bool terminate): - type_(type),state_(state), - allDelivered_(false),terminate_(terminate),zh_(0),deliveryCounter_(0){} - virtual void call(zhandle_t* zh,int type,int state, const char* path, watcher_object_list **list){ - { - synchronized(mx_); - zh_=zh; - allDelivered_=false; - } - CALL_REAL(deliverWatchers,(zh,type,state,path, list)); - if(type_==type && state_==state){ - if(terminate_){ - // prevent zhandle_t from being prematurely distroyed; - // this will also ensure that zookeeper_close() cleanups the thread - // resources by calling finish_adaptor() - inc_ref_counter(zh,1); - terminateZookeeperThreads(zh); - } - synchronized(mx_); - allDelivered_=true; - deliveryCounter_++; - } - } - SyncedBoolCondition isDelivered() const{ - if(terminate_){ - int i=ensureCondition(RefCounterValue(zh_,1,mx_),1000); - assert(i<1000); - } - return SyncedBoolCondition(allDelivered_,mx_); - } - void resetDeliveryCounter(){ - synchronized(mx_); - deliveryCounter_=0; - } - SyncedIntegerEqual deliveryCounterEquals(int expected) const{ - if(terminate_){ - int i=ensureCondition(RefCounterValue(zh_,1,mx_),1000); - assert(i<1000); - } - return SyncedIntegerEqual(deliveryCounter_,expected,mx_); - } - int type_; - int state_; - mutable Mutex mx_; - bool allDelivered_; - bool terminate_; - zhandle_t* zh_; - int deliveryCounter_; -}; - -WatcherDeliveryTracker::WatcherDeliveryTracker( - int type,int state,bool terminateCompletionThread): - deliveryWrapper_(new DeliverWatchersWrapper( - type,state,terminateCompletionThread)){ -} - -WatcherDeliveryTracker::~WatcherDeliveryTracker(){ - delete deliveryWrapper_; -} - -SyncedBoolCondition WatcherDeliveryTracker::isWatcherProcessingCompleted() const{ - return deliveryWrapper_->isDelivered(); -} - -void WatcherDeliveryTracker::resetDeliveryCounter(){ - deliveryWrapper_->resetDeliveryCounter(); -} - -SyncedIntegerEqual WatcherDeliveryTracker::deliveryCounterEquals(int expected) const{ - return deliveryWrapper_->deliveryCounterEquals(expected); -} - -//****************************************************************************** -// -string HandshakeResponse::toString() const { - string buf; - int32_t tmp=htonl(protocolVersion); - buf.append((char*)&tmp,sizeof(tmp)); - tmp=htonl(timeOut); - buf.append((char*)&tmp,sizeof(tmp)); - int64_t tmp64=htonll(sessionId); - buf.append((char*)&tmp64,sizeof(sessionId)); - tmp=htonl(passwd_len); - buf.append((char*)&tmp,sizeof(tmp)); - buf.append(passwd,sizeof(passwd)); - // finally set the buffer length - tmp=htonl(buf.size()+sizeof(tmp)); - buf.insert(0,(char*)&tmp, sizeof(tmp)); - return buf; -} - -string ZooGetResponse::toString() const{ - oarchive* oa=create_buffer_oarchive(); - - ReplyHeader h = {xid_,1,ZOK}; - serialize_ReplyHeader(oa, "hdr", &h); - - GetDataResponse resp; - char buf[1024]; - assert("GetDataResponse is too long"&&data_.size()<=sizeof(buf)); - resp.data.len=data_.size(); - resp.data.buff=buf; - data_.copy(resp.data.buff, data_.size()); - resp.stat=stat_; - serialize_GetDataResponse(oa, "reply", &resp); - int32_t len=htonl(get_buffer_len(oa)); - string res((char*)&len,sizeof(len)); - res.append(get_buffer(oa),get_buffer_len(oa)); - - close_buffer_oarchive(&oa,1); - return res; -} - -string ZooStatResponse::toString() const{ - oarchive* oa=create_buffer_oarchive(); - - ReplyHeader h = {xid_,1,rc_}; - serialize_ReplyHeader(oa, "hdr", &h); - - SetDataResponse resp; - resp.stat=stat_; - serialize_SetDataResponse(oa, "reply", &resp); - int32_t len=htonl(get_buffer_len(oa)); - string res((char*)&len,sizeof(len)); - res.append(get_buffer(oa),get_buffer_len(oa)); - - close_buffer_oarchive(&oa,1); - return res; -} - -string ZooGetChildrenResponse::toString() const{ - oarchive* oa=create_buffer_oarchive(); - - ReplyHeader h = {xid_,1,rc_}; - serialize_ReplyHeader(oa, "hdr", &h); - - GetChildrenResponse resp; - // populate the string vector - allocate_String_vector(&resp.children,strings_.size()); - for(int i=0;i<(int)strings_.size();++i) - resp.children.data[i]=strdup(strings_[i].c_str()); - serialize_GetChildrenResponse(oa, "reply", &resp); - deallocate_GetChildrenResponse(&resp); - - int32_t len=htonl(get_buffer_len(oa)); - string res((char*)&len,sizeof(len)); - res.append(get_buffer(oa),get_buffer_len(oa)); - - close_buffer_oarchive(&oa,1); - return res; -} - -string ZNodeEvent::toString() const{ - oarchive* oa=create_buffer_oarchive(); - struct WatcherEvent evt = {type_,0,(char*)path_.c_str()}; - struct ReplyHeader h = {WATCHER_EVENT_XID,0,ZOK }; - - serialize_ReplyHeader(oa, "hdr", &h); - serialize_WatcherEvent(oa, "event", &evt); - - int32_t len=htonl(get_buffer_len(oa)); - string res((char*)&len,sizeof(len)); - res.append(get_buffer(oa),get_buffer_len(oa)); - - close_buffer_oarchive(&oa,1); - return res; -} - -string PingResponse::toString() const{ - oarchive* oa=create_buffer_oarchive(); - - ReplyHeader h = {PING_XID,1,ZOK}; - serialize_ReplyHeader(oa, "hdr", &h); - - int32_t len=htonl(get_buffer_len(oa)); - string res((char*)&len,sizeof(len)); - res.append(get_buffer(oa),get_buffer_len(oa)); - - close_buffer_oarchive(&oa,1); - return res; -} - -//****************************************************************************** -// Zookeeper server simulator -// -bool ZookeeperServer::hasMoreRecv() const{ - return recvHasMore.get()!=0 || connectionLost; -} - -ssize_t ZookeeperServer::callRecv(int s,void *buf,size_t len,int flags){ - if(connectionLost){ - recvReturnBuffer.erase(); - return 0; - } - // done transmitting the current buffer? - if(recvReturnBuffer.size()==0){ - synchronized(recvQMx); - if(recvQueue.empty()){ - recvErrno=EAGAIN; - return Mock_socket::callRecv(s,buf,len,flags); - } - --recvHasMore; - Element& el=recvQueue.front(); - if(el.first!=0){ - recvReturnBuffer=el.first->toString(); - delete el.first; - } - recvErrno=el.second; - recvQueue.pop_front(); - } - return Mock_socket::callRecv(s,buf,len,flags); -} - -void ZookeeperServer::onMessageReceived(const RequestHeader& rh, iarchive* ia){ - // no-op by default -} - -void ZookeeperServer::notifyBufferSent(const std::string& buffer){ - if(HandshakeRequest::isValid(buffer)){ - // could be a connect request - auto_ptr req(HandshakeRequest::parse(buffer)); - if(req.get()!=0){ - // handle the handshake - int64_t sessId=sessionExpired?req->sessionId+1:req->sessionId; - sessionExpired=false; - addRecvResponse(new HandshakeResponse(sessId)); - return; - } - // not a connect request -- fall thru - } - // parse the buffer to extract the request type and its xid - iarchive *ia=create_buffer_iarchive((char*)buffer.data(), buffer.size()); - RequestHeader rh; - deserialize_RequestHeader(ia,"hdr",&rh); - // notify the "server" a client request has arrived - if (rh.xid == -8) { - Element e = Element(new ZooStatResponse,0); - e.first->setXID(-8); - addRecvResponse(e); - close_buffer_iarchive(&ia); - return; - } else { - onMessageReceived(rh,ia); - } - close_buffer_iarchive(&ia); - if(rh.type==ZOO_CLOSE_OP){ - ++closeSent; - return; // no reply for close requests - } - // get the next response from the response queue and append it to the receive list - Element e; - { - synchronized(respQMx); - if(respQueue.empty()) - return; - e=respQueue.front(); - respQueue.pop_front(); - } - e.first->setXID(rh.xid); - addRecvResponse(e); -} - -void forceConnected(zhandle_t* zh){ - // simulate connected state - zh->state=ZOO_CONNECTED_STATE; - zh->fd=ZookeeperServer::FD; - zh->input_buffer=0; - gettimeofday(&zh->last_recv,0); - gettimeofday(&zh->last_send,0); -} - -void terminateZookeeperThreads(zhandle_t* zh){ - // this will cause the zookeeper threads to terminate - zh->close_requested=1; -} diff --git a/pkg/registry/zookeeper-3.4.6/src/c/tests/ZKMocks.h b/pkg/registry/zookeeper-3.4.6/src/c/tests/ZKMocks.h deleted file mode 100644 index fbcfc4f08..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/c/tests/ZKMocks.h +++ /dev/null @@ -1,509 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you 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. - */ - -#ifndef ZKMOCKS_H_ -#define ZKMOCKS_H_ - -#include -#include "src/zk_adaptor.h" - -#include "Util.h" -#include "LibCMocks.h" -#include "MocksBase.h" - -// ***************************************************************************** -// sets internal zhandle_t members to certain values to simulate the client -// connected state. This function should only be used with the single-threaded -// Async API tests! -void forceConnected(zhandle_t* zh); - -/** - * Gracefully terminates zookeeper I/O and completion threads. - */ -void terminateZookeeperThreads(zhandle_t* zh); - -// ***************************************************************************** -// Abstract watcher action -struct SyncedBoolCondition; - -class WatcherAction{ -public: - WatcherAction():triggered_(false){} - virtual ~WatcherAction(){} - - virtual void onSessionExpired(zhandle_t*){} - virtual void onConnectionEstablished(zhandle_t*){} - virtual void onConnectionLost(zhandle_t*){} - virtual void onNodeValueChanged(zhandle_t*,const char* path){} - virtual void onNodeDeleted(zhandle_t*,const char* path){} - virtual void onChildChanged(zhandle_t*,const char* path){} - - SyncedBoolCondition isWatcherTriggered() const; - void setWatcherTriggered(){ - synchronized(mx_); - triggered_=true; - } - -protected: - mutable Mutex mx_; - bool triggered_; -}; -// zh->context is a pointer to a WatcherAction instance -// based on the event type and state, the watcher calls a specific watcher -// action method -void activeWatcher(zhandle_t *zh, int type, int state, const char *path,void* ctx); - -// ***************************************************************************** -// a set of async completion signatures -class AsyncCompletion{ -public: - virtual ~AsyncCompletion(){} - virtual void aclCompl(int rc, ACL_vector *acl,Stat *stat){} - virtual void dataCompl(int rc, const char *value, int len, const Stat *stat){} - virtual void statCompl(int rc, const Stat *stat){} - virtual void stringCompl(int rc, const char *value){} - virtual void stringsCompl(int rc,const String_vector *strings){} - virtual void voidCompl(int rc){} -}; -void asyncCompletion(int rc, ACL_vector *acl,Stat *stat, const void *data); -void asyncCompletion(int rc, const char *value, int len, const Stat *stat, - const void *data); -void asyncCompletion(int rc, const Stat *stat, const void *data); -void asyncCompletion(int rc, const char *value, const void *data); -void asyncCompletion(int rc,const String_vector *strings, const void *data); -void asyncCompletion(int rc, const void *data); - -// ***************************************************************************** -// some common predicates to use with ensureCondition(): -// checks if the connection is established -struct ClientConnected{ - ClientConnected(zhandle_t* zh):zh_(zh){} - bool operator()() const{ - return zoo_state(zh_)==ZOO_CONNECTED_STATE; - } - zhandle_t* zh_; -}; -// check in the session expired -struct SessionExpired{ - SessionExpired(zhandle_t* zh):zh_(zh){} - bool operator()() const{ - return zoo_state(zh_)==ZOO_EXPIRED_SESSION_STATE; - } - zhandle_t* zh_; -}; -// checks if the IO thread has stopped; CheckedPthread must be active -struct IOThreadStopped{ - IOThreadStopped(zhandle_t* zh):zh_(zh){} - bool operator()() const; - zhandle_t* zh_; -}; - -// a synchronized boolean condition -struct SyncedBoolCondition{ - SyncedBoolCondition(const bool& cond,Mutex& mx):cond_(cond),mx_(mx){} - bool operator()() const{ - synchronized(mx_); - return cond_; - } - const bool& cond_; - Mutex& mx_; -}; - -// a synchronized integer comparison -struct SyncedIntegerEqual{ - SyncedIntegerEqual(const int& cond,int expected,Mutex& mx): - cond_(cond),expected_(expected),mx_(mx){} - bool operator()() const{ - synchronized(mx_); - return cond_==expected_; - } - const int& cond_; - const int expected_; - Mutex& mx_; -}; - -// ***************************************************************************** -// make sure to call zookeeper_close() even in presence of exceptions -struct CloseFinally{ - CloseFinally(zhandle_t** zh):zh_(zh){} - ~CloseFinally(){ - execute(); - } - int execute(){ - if(zh_==0)return ZOK; - zhandle_t* lzh=*zh_; - *zh_=0; - disarm(); - return zookeeper_close(lzh); - } - void disarm(){zh_=0;} - zhandle_t ** zh_; -}; - -struct TestClientId: clientid_t{ - static const int SESSION_ID=123456789; - static const char* PASSWD; - TestClientId(){ - client_id=SESSION_ID; - memcpy(passwd,PASSWD,sizeof(passwd)); - } -}; - -// ***************************************************************************** -// special client id recongnized by the ZK server simulator -extern TestClientId testClientId; -#define TEST_CLIENT_ID &testClientId - -// ***************************************************************************** -// -struct HandshakeRequest: public connect_req -{ - static HandshakeRequest* parse(const std::string& buf); - static bool isValid(const std::string& buf){ - // this is just quick and dirty check before we go and parse the request - return buf.size()==HANDSHAKE_REQ_SIZE; - } -}; - -// ***************************************************************************** -// flush_send_queue -class Mock_flush_send_queue: public Mock -{ -public: - Mock_flush_send_queue():counter(0),callReturns(ZOK){mock_=this;} - ~Mock_flush_send_queue(){mock_=0;} - - int counter; - int callReturns; - virtual int call(zhandle_t* zh, int timeout){ - counter++; - return callReturns; - } - - static Mock_flush_send_queue* mock_; -}; - -// ***************************************************************************** -// get_xid -class Mock_get_xid: public Mock -{ -public: - static const int32_t XID=123456; - Mock_get_xid(int retValue=XID):callReturns(retValue){mock_=this;} - ~Mock_get_xid(){mock_=0;} - - int callReturns; - virtual int call(){ - return callReturns; - } - - static Mock_get_xid* mock_; -}; - -// ***************************************************************************** -// activateWatcher -class Mock_activateWatcher: public Mock{ -public: - Mock_activateWatcher(){mock_=this;} - virtual ~Mock_activateWatcher(){mock_=0;} - - virtual void call(zhandle_t *zh, watcher_registration_t* reg, int rc){} - static Mock_activateWatcher* mock_; -}; - -class ActivateWatcherWrapper; -class WatcherActivationTracker{ -public: - WatcherActivationTracker(); - ~WatcherActivationTracker(); - - void track(void* ctx); - SyncedBoolCondition isWatcherActivated() const; -private: - ActivateWatcherWrapper* wrapper_; -}; - -// ***************************************************************************** -// deliverWatchers -class Mock_deliverWatchers: public Mock{ -public: - Mock_deliverWatchers(){mock_=this;} - virtual ~Mock_deliverWatchers(){mock_=0;} - - virtual void call(zhandle_t* zh,int type,int state, const char* path, watcher_object_list **){} - static Mock_deliverWatchers* mock_; -}; - -class DeliverWatchersWrapper; -class WatcherDeliveryTracker{ -public: - // filters deliveries by state and type - WatcherDeliveryTracker(int type,int state,bool terminateCompletionThread=true); - ~WatcherDeliveryTracker(); - - // if the thread termination requested (see the ctor params) - // this function will wait for the I/O and completion threads to - // terminate before returning a SyncBoolCondition instance - SyncedBoolCondition isWatcherProcessingCompleted() const; - void resetDeliveryCounter(); - SyncedIntegerEqual deliveryCounterEquals(int expected) const; -private: - DeliverWatchersWrapper* deliveryWrapper_; -}; - -// ***************************************************************************** -// a zookeeper Stat wrapper -struct NodeStat: public Stat -{ - NodeStat(){ - czxid=0; - mzxid=0; - ctime=0; - mtime=0; - version=1; - cversion=0; - aversion=0; - ephemeralOwner=0; - } - NodeStat(const Stat& other){ - memcpy(this,&other,sizeof(*this)); - } -}; - -// ***************************************************************************** -// Abstract server Response -class Response -{ -public: - virtual ~Response(){} - - virtual void setXID(int32_t xid){} - // this method is used by the ZookeeperServer class to serialize - // the instance of Response - virtual std::string toString() const =0; -}; - -// ***************************************************************************** -// Handshake response -class HandshakeResponse: public Response -{ -public: - HandshakeResponse(int64_t sessId=1) - :protocolVersion(1),timeOut(10000),sessionId(sessId),passwd_len(sizeof(passwd)) - { - memcpy(passwd,"1234567890123456",sizeof(passwd)); - } - int32_t protocolVersion; - int32_t timeOut; - int64_t sessionId; - int32_t passwd_len; - char passwd[16]; - virtual std::string toString() const ; -}; - -// zoo_get() response -class ZooGetResponse: public Response -{ -public: - ZooGetResponse(const char* data, int len,int32_t xid=0,int rc=ZOK,const Stat& stat=NodeStat()) - :xid_(xid),data_(data,len),rc_(rc),stat_(stat) - { - } - virtual std::string toString() const; - virtual void setXID(int32_t xid) {xid_=xid;} - -private: - int32_t xid_; - std::string data_; - int rc_; - Stat stat_; -}; - -// zoo_exists(), zoo_set() response -class ZooStatResponse: public Response -{ -public: - ZooStatResponse(int32_t xid=0,int rc=ZOK,const Stat& stat=NodeStat()) - :xid_(xid),rc_(rc),stat_(stat) - { - } - virtual std::string toString() const; - virtual void setXID(int32_t xid) {xid_=xid;} - -private: - int32_t xid_; - int rc_; - Stat stat_; -}; - -// zoo_get_children() -class ZooGetChildrenResponse: public Response -{ -public: - typedef std::vector StringVector; - ZooGetChildrenResponse(const StringVector& v,int rc=ZOK): - xid_(0),strings_(v),rc_(rc) - { - } - - virtual std::string toString() const; - virtual void setXID(int32_t xid) {xid_=xid;} - - int32_t xid_; - StringVector strings_; - int rc_; -}; - -// PING response -class PingResponse: public Response -{ -public: - virtual std::string toString() const; -}; - -// watcher znode event -class ZNodeEvent: public Response -{ -public: - ZNodeEvent(int type,const char* path):type_(type),path_(path){} - - virtual std::string toString() const; - -private: - int type_; - std::string path_; -}; - -// **************************************************************************** -// Zookeeper server simulator - -class ZookeeperServer: public Mock_socket -{ -public: - ZookeeperServer(): - serverDownSkipCount_(-1),sessionExpired(false),connectionLost(false) - { - connectReturns=-1; - connectErrno=EWOULDBLOCK; - } - virtual ~ZookeeperServer(){ - clearRecvQueue(); - clearRespQueue(); - } - virtual int callClose(int fd){ - if(fd!=FD) - return LIBC_SYMBOLS.close(fd); - clearRecvQueue(); - clearRespQueue(); - return Mock_socket::callClose(fd); - } - // connection handling - // what to do when the handshake request comes in? - int serverDownSkipCount_; - // this will cause getsockopt(zh->fd,SOL_SOCKET,SO_ERROR,&error,&len) return - // a failure after skipCount dropped to zero, thus simulating a server down - // condition - // passing skipCount==-1 will make every connect attempt succeed - void setServerDown(int skipCount=0){ - serverDownSkipCount_=skipCount; - optvalSO_ERROR=0; - } - virtual void setSO_ERROR(void *optval,socklen_t len){ - if(serverDownSkipCount_!=-1){ - if(serverDownSkipCount_==0) - optvalSO_ERROR=ECONNREFUSED; - else - serverDownSkipCount_--; - } - Mock_socket::setSO_ERROR(optval,len); - } - - // this is a trigger that gets reset back to false - // a connect request will return a non-matching session id thus causing - // the client throw SESSION_EXPIRED - volatile bool sessionExpired; - void returnSessionExpired(){ sessionExpired=true; } - - // this is a one shot trigger that gets reset back to false - // next recv call will return 0 length, thus simulating a connecton loss - volatile bool connectionLost; - void setConnectionLost() {connectionLost=true;} - - // recv - // this queue is used for server responses: client's recv() system call - // returns next available message from this queue - typedef std::pair Element; - typedef std::deque ResponseList; - ResponseList recvQueue; - mutable Mutex recvQMx; - AtomicInt recvHasMore; - ZookeeperServer& addRecvResponse(Response* resp, int errnum=0){ - synchronized(recvQMx); - recvQueue.push_back(Element(resp,errnum)); - ++recvHasMore; - return *this; - } - ZookeeperServer& addRecvResponse(int errnum){ - synchronized(recvQMx); - recvQueue.push_back(Element(0,errnum)); - ++recvHasMore; - return *this; - } - ZookeeperServer& addRecvResponse(const Element& e){ - synchronized(recvQMx); - recvQueue.push_back(e); - ++recvHasMore; - return *this; - } - void clearRecvQueue(){ - synchronized(recvQMx); - recvHasMore=0; - for(unsigned i=0; i /dev/null -if [ $? -eq 0 ] -then - pid=`lsof -i :$ZOOPORT | grep LISTEN | awk '{print $2}'` - if [ -n "$pid" ] - then - $KILL -9 $pid - fi -fi - -if [ "x${base_dir}" == "x" ] -then -zk_base="../../" -else -zk_base="${base_dir}" -fi - -CLASSPATH="$CLASSPATH:${zk_base}/build/classes" -CLASSPATH="$CLASSPATH:${zk_base}/conf" - -for i in "${zk_base}"/build/lib/*.jar -do - CLASSPATH="$CLASSPATH:$i" -done - -for i in "${zk_base}"/src/java/lib/*.jar -do - CLASSPATH="$CLASSPATH:$i" -done - -CLASSPATH="$CLASSPATH:${CLOVER_HOME}/lib/clover.jar" - -if $cygwin -then - CLASSPATH=`cygpath -wp "$CLASSPATH"` -fi - -case $1 in -start|startClean) - if [ "x${base_dir}" == "x" ] - then - mkdir -p /tmp/zkdata - java -cp "$CLASSPATH" org.apache.zookeeper.server.ZooKeeperServerMain $ZOOPORT /tmp/zkdata 3000 $ZKMAXCNXNS &> /tmp/zk.log & - pid=$! - echo -n $! > /tmp/zk.pid - else - mkdir -p "${base_dir}/build/tmp/zkdata" - java -cp "$CLASSPATH" org.apache.zookeeper.server.ZooKeeperServerMain $ZOOPORT "${base_dir}/build/tmp/zkdata" 3000 $ZKMAXCNXNS &> "${base_dir}/build/tmp/zk.log" & - pid=$! - echo -n $pid > "${base_dir}/build/tmp/zk.pid" - fi - - # wait max 120 seconds for server to be ready to server clients - # this handles testing on slow hosts - success=false - for i in {1..120} - do - if ps -p $pid > /dev/null - then - java -cp "$CLASSPATH" org.apache.zookeeper.ZooKeeperMain -server localhost:$ZOOPORT ls / > /dev/null 2>&1 - if [ $? -ne 0 ] - then - # server not up yet - wait - sleep 1 - else - # server is up and serving client connections - success=true - break - fi - else - # server died - exit now - echo -n " ZooKeeper server process failed" - break - fi - done - - if $success - then - ## in case for debug, but generally don't use as it messes up the - ## console test output - echo -n " ZooKeeper server started" - else - echo -n " ZooKeeper server NOT started" - fi - - ;; -stop) - # Already killed above - ;; -*) - echo "Unknown command " + $1 - exit 2 -esac - diff --git a/pkg/registry/zookeeper-3.4.6/src/c/zookeeper.sln b/pkg/registry/zookeeper-3.4.6/src/c/zookeeper.sln deleted file mode 100644 index 42f41c952..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/c/zookeeper.sln +++ /dev/null @@ -1,25 +0,0 @@ -Microsoft Visual Studio Solution File, Format Version 10.00 -# Visual Studio 2008 -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "zookeeper", "zookeeper.vcproj", "{5754FB2B-5EA5-4988-851D-908CA533A626}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Cli", "Cli.vcproj", "{050228F9-070F-4806-A2B5-E6B95D8EC4AF}" -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|Win32 = Debug|Win32 - Release|Win32 = Release|Win32 - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {5754FB2B-5EA5-4988-851D-908CA533A626}.Debug|Win32.ActiveCfg = Debug|Win32 - {5754FB2B-5EA5-4988-851D-908CA533A626}.Debug|Win32.Build.0 = Debug|Win32 - {5754FB2B-5EA5-4988-851D-908CA533A626}.Release|Win32.ActiveCfg = Release|Win32 - {5754FB2B-5EA5-4988-851D-908CA533A626}.Release|Win32.Build.0 = Release|Win32 - {050228F9-070F-4806-A2B5-E6B95D8EC4AF}.Debug|Win32.ActiveCfg = Debug|Win32 - {050228F9-070F-4806-A2B5-E6B95D8EC4AF}.Debug|Win32.Build.0 = Debug|Win32 - {050228F9-070F-4806-A2B5-E6B95D8EC4AF}.Release|Win32.ActiveCfg = Release|Win32 - {050228F9-070F-4806-A2B5-E6B95D8EC4AF}.Release|Win32.Build.0 = Release|Win32 - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection -EndGlobal diff --git a/pkg/registry/zookeeper-3.4.6/src/c/zookeeper.vcproj b/pkg/registry/zookeeper-3.4.6/src/c/zookeeper.vcproj deleted file mode 100644 index dc3ab43e3..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/c/zookeeper.vcproj +++ /dev/null @@ -1,300 +0,0 @@ -??? - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/build-contrib.xml b/pkg/registry/zookeeper-3.4.6/src/contrib/build-contrib.xml deleted file mode 100644 index 0e57d087a..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/contrib/build-contrib.xml +++ /dev/null @@ -1,248 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/build.xml b/pkg/registry/zookeeper-3.4.6/src/contrib/build.xml deleted file mode 100644 index 7f7ba4ff6..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/contrib/build.xml +++ /dev/null @@ -1,88 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/fatjar/README.txt b/pkg/registry/zookeeper-3.4.6/src/contrib/fatjar/README.txt deleted file mode 100644 index f8027ae8c..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/contrib/fatjar/README.txt +++ /dev/null @@ -1,2 +0,0 @@ -This package contains build to create a fat zookeeper jar. You need to run ant to create the fat jar. -To run the fatjar you can use. java -jar zoookeeper-*fatjar.jar diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/fatjar/build.xml b/pkg/registry/zookeeper-3.4.6/src/contrib/fatjar/build.xml deleted file mode 100644 index 8935f3940..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/contrib/fatjar/build.xml +++ /dev/null @@ -1,74 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/fatjar/conf/mainClasses b/pkg/registry/zookeeper-3.4.6/src/contrib/fatjar/conf/mainClasses deleted file mode 100644 index 2b0fc83f4..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/contrib/fatjar/conf/mainClasses +++ /dev/null @@ -1,10 +0,0 @@ -::Client Commands -client:org.apache.zookeeper.ZooKeeperMain:Client shell to ZooKeeper -::Server Commands -server:org.apache.zookeeper.server.quorum.QuorumPeerMain:Start ZooKeeper server -::Test Commands -generateLoad:org.apache.zookeeper.test.system.GenerateLoad:A distributed load generator for testing -quorumBench:org.apache.zookeeper.server.QuorumBenchmark:A benchmark of just the quorum protocol -abBench:org.apache.zookeeper.server.quorum.AtomicBroadcastBenchmark:A benchmark of just the atomic broadcast -ic:org.apache.zookeeper.test.system.InstanceContainer:A container that will instantiate classes as directed by an instance manager -systest:org.apache.zookeeper.test.system.BaseSysTest:Start system test diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/fatjar/src/java/org/apache/zookeeper/util/FatJarMain.java b/pkg/registry/zookeeper-3.4.6/src/contrib/fatjar/src/java/org/apache/zookeeper/util/FatJarMain.java deleted file mode 100644 index bdf0eaec5..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/contrib/fatjar/src/java/org/apache/zookeeper/util/FatJarMain.java +++ /dev/null @@ -1,126 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you 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. - */ - -package org.apache.zookeeper.util; - -import java.io.BufferedReader; -import java.io.IOException; -import java.io.InputStream; -import java.io.InputStreamReader; -import java.lang.reflect.InvocationTargetException; -import java.lang.reflect.Method; -import java.util.ArrayList; -import java.util.HashMap; - -/** - * This is a generic Main class that is completely driven by the - * /mainClasses resource on the class path. This resource has the - * format: - *

      - * cmd:mainClass:Description
      - * 
      - * Any lines starting with # will be skipped - * - */ -public class FatJarMain { - static class Cmd { - Cmd(String cmd, String clazz, String desc) { - this.cmd = cmd; - this.clazz = clazz; - this.desc = desc; - } - String cmd; - String clazz; - String desc; - } - static HashMap cmds = new HashMap(); - static ArrayList order = new ArrayList(); - - /** - * @param args the first parameter of args will be used as an - * index into the /mainClasses resource. The rest will be passed - * to the mainClass to run. - * @throws IOException - * @throws ClassNotFoundException - * @throws NoSuchMethodException - * @throws SecurityException - * @throws IllegalAccessException - * @throws IllegalArgumentException - */ - public static void main(String[] args) throws IOException, ClassNotFoundException, SecurityException, NoSuchMethodException, IllegalArgumentException, IllegalAccessException { - InputStream is = FatJarMain.class.getResourceAsStream("/mainClasses"); - if (is == null) { - System.err.println("Couldn't find /mainClasses in classpath."); - System.exit(3); - } - BufferedReader br = new BufferedReader(new InputStreamReader(is)); - String line; - while((line = br.readLine()) != null) { - String parts[] = line.split(":", 3); - if (parts.length != 3 || (parts[0].length() > 0 && parts[0].charAt(0) == '#')) { - continue; - } - if (parts[0].length() > 0) { - cmds.put(parts[0], new Cmd(parts[0], parts[1], parts[2])); - // We use the order array to preserve the order of the commands - // for help. The hashmap will not preserver order. (It may be overkill.) - order.add(parts[0]); - } else { - // Just put the description in - order.add(parts[2]); - } - } - if (args.length == 0) { - doHelp(); - return; - } - Cmd cmd = cmds.get(args[0]); - if (cmd == null) { - doHelp(); - return; - } - Class clazz = Class.forName(cmd.clazz); - Method main = clazz.getMethod("main", String[].class); - String newArgs[] = new String[args.length-1]; - System.arraycopy(args, 1, newArgs, 0, newArgs.length); - try { - main.invoke(null, (Object)newArgs); - } catch(InvocationTargetException e) { - if (e.getCause() != null) { - e.getCause().printStackTrace(); - } else { - e.printStackTrace(); - } - } - } - - private static void doHelp() { - System.err.println("USAGE: FatJarMain cmd args"); - System.err.println("Available cmds:"); - for(String c: order) { - Cmd cmd = cmds.get(c); - if (cmd != null) { - System.err.println(" " + c + " " + cmd.desc); - } else { - System.err.println(c); - } - } - System.exit(2); - } - -} diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/huebrowser/README b/pkg/registry/zookeeper-3.4.6/src/contrib/huebrowser/README deleted file mode 100644 index c03ea90fd..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/contrib/huebrowser/README +++ /dev/null @@ -1,62 +0,0 @@ - -ZooKeeper Browser - Hue Application -=================================== - -The ZooKeeper Browser application allows you to see how the cluster nodes are working and also allows you to do CRUD operations on the znode hierarchy. - -Requirements ------------- - -Hue-1.0: - * http://github.com/downloads/cloudera/hue/hue-1.0.tgz - * http://github.com/downloads/cloudera/hue/release-notes-1.0.html - -ZooKeeper REST gateway: - * available as contrib: contrib/rest - -How to install? ---------------- - -First of all you need to install Hue 1.0 release: - - * http://archive.cloudera.com/cdh/3/hue/sdk/sdk.html - * http://github.com/cloudera/hue/tree/release-1.0 - -After you finish the previous step you should copy the zkui/ folder to apps/ and register the new application: - - * $ ./build/env/bin/python tools/app_reg/app_reg.py --install apps/zkui - * $ ./build/env/bin/python tools/app_reg/app_reg.py --list 2>&1 | grep zkui - zkui 0.1 /Users/philip/src/hue/apps/zkui - - -And restart the Hue application server. - -Configuration -------------- - -Edit zkui/src/zkui/settings.py: - -CLUSTERS = [{ - 'nice_name': 'Default', - 'hostport': 'localhost:2181,localhost:2182,localhost:2183', - 'rest_gateway': 'http://localhost:9998' - }, { - # ... and more clusters - } -] - -What is Hue? ------------- - -Wiki: http://wiki.github.com/cloudera/hue/ -Main Repo: http://github.com/cloudera/hue - -Hue is both a web UI for Hadoop and a framework to create interactive web applications. It features a FileBrowser for accessing HDFS, JobSub and JobBrowser applications for submitting and viewing MapReduce jobs, a Beeswax application for interacting with Hive. On top of that, the web frontend is mostly built from declarative widgets that require no JavaScript and are easy to learn. - -What is ZooKeeper? ------------------- - -http://zookeeper.apache.org/ - -ZooKeeper is a centralized service for maintaining configuration information, naming, providing distributed synchronization, and providing group services. All of these kinds of services are used in some form or another by distributed applications. Each time they are implemented there is a lot of work that goes into fixing the bugs and race conditions that are inevitable. Because of the difficulty of implementing these kinds of services, applications initially usually skimp on them ,which make them brittle in the presence of change and difficult to manage. Even when done correctly, different implementations of these services lead to management complexity when the applications are deployed. - diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/huebrowser/zkui/Makefile b/pkg/registry/zookeeper-3.4.6/src/contrib/huebrowser/zkui/Makefile deleted file mode 100644 index 9c22d1c22..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/contrib/huebrowser/zkui/Makefile +++ /dev/null @@ -1,21 +0,0 @@ -# Licensed to the Apache Software Foundation (ASF) under one -# or more contributor license agreements. See the NOTICE file -# distributed with this work for additional information -# regarding copyright ownership. The ASF licenses this file -# to you 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. - -ifeq ($(ROOT),) - $(error "Error: Expect the environment variable $$ROOT to point to the Desktop installation") -endif - -include $(ROOT)/Makefile.sdk diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/huebrowser/zkui/setup.py b/pkg/registry/zookeeper-3.4.6/src/contrib/huebrowser/zkui/setup.py deleted file mode 100644 index 68d1352ca..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/contrib/huebrowser/zkui/setup.py +++ /dev/null @@ -1,46 +0,0 @@ -# Licensed to the Apache Software Foundation (ASF) under one -# or more contributor license agreements. See the NOTICE file -# distributed with this work for additional information -# regarding copyright ownership. The ASF licenses this file -# to you 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. -from setuptools import setup, find_packages -import os - -def expand_package_data(src_dirs, strip=""): - ret = [] - for src_dir in src_dirs: - for path, dnames, fnames in os.walk(src_dir): - for fname in fnames: - ret.append(os.path.join(path, fname).replace(strip, "")) - return ret - -os.chdir(os.path.dirname(os.path.abspath(__file__))) -setup( - name = "zkui", - version = "0.1", - url = 'http://zookeeper.apache.org/', - description = 'ZooKeeper Browser', - packages = find_packages('src'), - package_dir = {'': 'src'}, - install_requires = ['setuptools', 'desktop'], - entry_points = { 'desktop.sdk.application': 'zkui=zkui' }, - zip_safe = False, - package_data = { - # Include static resources. Package_data doesn't - # deal well with directory globs, so we enumerate - # the files manually. - 'zkui': expand_package_data( - ["src/zkui/templates", "src/zkui/static"], - "src/zkui/") - } -) diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/huebrowser/zkui/src/zkui/__init__.py b/pkg/registry/zookeeper-3.4.6/src/contrib/huebrowser/zkui/src/zkui/__init__.py deleted file mode 100644 index eccc8816c..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/contrib/huebrowser/zkui/src/zkui/__init__.py +++ /dev/null @@ -1,16 +0,0 @@ -# Licensed to the Apache Software Foundation (ASF) under one -# or more contributor license agreements. See the NOTICE file -# distributed with this work for additional information -# regarding copyright ownership. The ASF licenses this file -# to you under the Apache License, Version 2.0 (the -# "License"); you may not use this file except in compliance -# with the License. You may obtain a copy of the License at - -# http://www.apache.org/licenses/LICENSE-2.0 - -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/huebrowser/zkui/src/zkui/forms.py b/pkg/registry/zookeeper-3.4.6/src/contrib/huebrowser/zkui/src/zkui/forms.py deleted file mode 100644 index 6b1f178fb..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/contrib/huebrowser/zkui/src/zkui/forms.py +++ /dev/null @@ -1,29 +0,0 @@ -# Licensed to the Apache Software Foundation (ASF) under one -# or more contributor license agreements. See the NOTICE file -# distributed with this work for additional information -# regarding copyright ownership. The ASF licenses this file -# to you 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. - -from django import forms -from django.forms.widgets import Textarea, HiddenInput - -class CreateZNodeForm(forms.Form): - name = forms.CharField(max_length=64) - data = forms.CharField(required=False, widget=Textarea) - sequence = forms.BooleanField(required=False) - -class EditZNodeForm(forms.Form): - data = forms.CharField(required=False, widget=Textarea) - version = forms.IntegerField(required=False, widget=HiddenInput) - - diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/huebrowser/zkui/src/zkui/models.py b/pkg/registry/zookeeper-3.4.6/src/contrib/huebrowser/zkui/src/zkui/models.py deleted file mode 100644 index a46696b6d..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/contrib/huebrowser/zkui/src/zkui/models.py +++ /dev/null @@ -1,17 +0,0 @@ -# Licensed to the Apache Software Foundation (ASF) under one -# or more contributor license agreements. See the NOTICE file -# distributed with this work for additional information -# regarding copyright ownership. The ASF licenses this file -# to you under the Apache License, Version 2.0 (the -# "License"); you may not use this file except in compliance -# with the License. You may obtain a copy of the License at - -# http://www.apache.org/licenses/LICENSE-2.0 - -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - - diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/huebrowser/zkui/src/zkui/rest.py b/pkg/registry/zookeeper-3.4.6/src/contrib/huebrowser/zkui/src/zkui/rest.py deleted file mode 100644 index e4874a1ec..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/contrib/huebrowser/zkui/src/zkui/rest.py +++ /dev/null @@ -1,230 +0,0 @@ - -# Licensed to the Apache Software Foundation (ASF) under one -# or more contributor license agreements. See the NOTICE file -# distributed with this work for additional information -# regarding copyright ownership. The ASF licenses this file -# to you 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. - -import urllib2 -import urllib -import simplejson - -from contextlib import contextmanager - -class RequestWithMethod(urllib2.Request): - """ Request class that know how to set the method name """ - def __init__(self, *args, **kwargs): - urllib2.Request.__init__(self, *args, **kwargs) - self._method = None - - def get_method(self): - return self._method or \ - urllib2.Request.get_method(self) - - def set_method(self, method): - self._method = method - -class ZooKeeper(object): - - class Error(Exception): pass - - class NotFound(Error): pass - - class ZNodeExists(Error): pass - - class InvalidSession(Error): pass - - class WrongVersion(Error): pass - - def __init__(self, uri = 'http://localhost:9998'): - self._base = uri - self._session = None - - def start_session(self, expire=5, id=None): - """ Create a session and return the ID """ - if id is None: - url = "%s/sessions/v1/?op=create&expire=%d" % (self._base, expire) - self._session = self._do_post(url)['id'] - else: - self._session = id - return self._session - - def close_session(self): - """ Close the session on the server """ - if self._session is not None: - url = '%s/sessions/v1/%s' % (self._base, self._session) - self._do_delete(url) - self._session = None - - def heartbeat(self): - """ Send a heartbeat request. This is needed in order to keep a session alive """ - if self._session is not None: - url = '%s/sessions/v1/%s' % (self._base, self._session) - self._do_put(url, '') - - @contextmanager - def session(self, *args, **kwargs): - """ Session handling using a context manager """ - yield self.start_session(*args, **kwargs) - self.close_session() - - def get(self, path): - """ Get a node """ - url = "%s/znodes/v1%s" % (self._base, path) - return self._do_get(url) - - def get_children(self, path): - """ Get all the children for a given path. This function creates a generator """ - for child_path in self.get_children_paths(path, uris=True): - try: - yield self._do_get(child_path) - except ZooKeeper.NotFound: - continue - - def get_children_paths(self, path, uris=False): - """ Get the paths for children nodes """ - url = "%s/znodes/v1%s?view=children" % (self._base, path) - resp = self._do_get(url) - for child in resp.get('children', []): - yield child if not uris else resp['child_uri_template']\ - .replace('{child}', urllib2.quote(child)) - - def create(self, path, data=None, sequence=False, ephemeral=False): - """ Create a new node. By default this call creates a persistent znode. - - You can also create an ephemeral or a sequential znode. - """ - ri = path.rindex('/') - head, name = path[:ri+1], path[ri+1:] - if head != '/': head = head[:-1] - - flags = { - 'null': 'true' if data is None else 'false', - 'ephemeral': 'true' if ephemeral else 'false', - 'sequence': 'true' if sequence else 'false' - } - if ephemeral: - if self._session: - flags['session'] = self._session - else: - raise ZooKeeper.Error, 'You need a session '\ - 'to create an ephemeral node' - flags = urllib.urlencode(flags) - - url = "%s/znodes/v1%s?op=create&name=%s&%s" % \ - (self._base, head, name, flags) - - return self._do_post(url, data) - - def set(self, path, data=None, version=-1, null=False): - """ Set the value of node """ - url = "%s/znodes/v1%s?%s" % (self._base, path, \ - urllib.urlencode({ - 'version': version, - 'null': 'true' if null else 'false' - })) - return self._do_put(url, data) - - def delete(self, path, version=-1): - """ Delete a znode """ - if type(path) is list: - map(lambda el: self.delete(el, version), path) - return - - url = '%s/znodes/v1%s?%s' % (self._base, path, \ - urllib.urlencode({ - 'version':version - })) - try: - return self._do_delete(url) - except urllib2.HTTPError, e: - if e.code == 412: - raise ZooKeeper.WrongVersion(path) - elif e.code == 404: - raise ZooKeeper.NotFound(path) - raise - - def recursive_delete(self, path): - """ Delete all the nodes from the tree """ - for child in self.get_children_paths(path): - fp = ("%s/%s" % (path, child)).replace('//', '/') - self.recursive_delete(fp) - self.delete(path) - - def exists(self, path): - """ Do a znode exists """ - try: - self.get(path) - return True - except ZooKeeper.NotFound: - return False - - def _do_get(self, uri): - """ Send a GET request and convert errors to exceptions """ - try: - req = urllib2.urlopen(uri) - resp = simplejson.load(req) - - if 'Error' in resp: - raise ZooKeeper.Error(resp['Error']) - - return resp - except urllib2.HTTPError, e: - if e.code == 404: - raise ZooKeeper.NotFound(uri) - raise - - def _do_post(self, uri, data=None): - """ Send a POST request and convert errors to exceptions """ - try: - req = urllib2.Request(uri, {}) - req.add_header('Content-Type', 'application/octet-stream') - if data is not None: - req.add_data(data) - - resp = simplejson.load(urllib2.urlopen(req)) - if 'Error' in resp: - raise ZooKeeper.Error(resp['Error']) - return resp - - except urllib2.HTTPError, e: - if e.code == 201: - return True - elif e.code == 409: - raise ZooKeeper.ZNodeExists(uri) - elif e.code == 401: - raise ZooKeeper.InvalidSession(uri) - raise - - def _do_delete(self, uri): - """ Send a DELETE request """ - req = RequestWithMethod(uri) - req.set_method('DELETE') - req.add_header('Content-Type', 'application/octet-stream') - return urllib2.urlopen(req).read() - - def _do_put(self, uri, data): - """ Send a PUT request """ - try: - req = RequestWithMethod(uri) - req.set_method('PUT') - req.add_header('Content-Type', 'application/octet-stream') - if data is not None: - req.add_data(data) - - return urllib2.urlopen(req).read() - except urllib2.HTTPError, e: - if e.code == 412: # precondition failed - raise ZooKeeper.WrongVersion(uri) - raise - diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/huebrowser/zkui/src/zkui/settings.py b/pkg/registry/zookeeper-3.4.6/src/contrib/huebrowser/zkui/src/zkui/settings.py deleted file mode 100644 index 844c6952d..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/contrib/huebrowser/zkui/src/zkui/settings.py +++ /dev/null @@ -1,30 +0,0 @@ -# Licensed to the Apache Software Foundation (ASF) under one -# or more contributor license agreements. See the NOTICE file -# distributed with this work for additional information -# regarding copyright ownership. The ASF licenses this file -# to you 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. - -DJANGO_APPS = [ "zkui" ] -NICE_NAME = "ZooKeeper Browser" -REQUIRES_HADOOP = False - -CLUSTERS = [{ - 'nice_name': 'Default', - 'hostport': 'localhost:2181,localhost:2182,localhost:2183', - 'rest_gateway': 'http://localhost:9998' - } -] - -DEPENDER_PACKAGE_YMLS = [ - "src/zkui/static/js/package.yml", -] diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/huebrowser/zkui/src/zkui/static/art/line_icons.png b/pkg/registry/zookeeper-3.4.6/src/contrib/huebrowser/zkui/src/zkui/static/art/line_icons.png deleted file mode 100644 index 1da4a294b34c5bcfe27ce676c85a2f363bab95c7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7499 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 UeFd$x$^ZZW07*qoM6N<$f+d!kO#lD@ diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/huebrowser/zkui/src/zkui/static/help/index.html b/pkg/registry/zookeeper-3.4.6/src/contrib/huebrowser/zkui/src/zkui/static/help/index.html deleted file mode 100644 index 355c8cdd2..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/contrib/huebrowser/zkui/src/zkui/static/help/index.html +++ /dev/null @@ -1,26 +0,0 @@ - - -

      ZooKeeper Browser

      - - -

      ZooKeeper is a centralized service for maintaining configuration information, naming, providing distributed synchronization, and providing group services

      - -

      About

      - -

      The ZooKeeper Browser application allows you to see how the cluster nodes are working and also allows you to do CRUD operations on the znode hierarchy.

      - diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/huebrowser/zkui/src/zkui/static/js/package.yml b/pkg/registry/zookeeper-3.4.6/src/contrib/huebrowser/zkui/src/zkui/static/js/package.yml deleted file mode 100644 index c2c07adf6..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/contrib/huebrowser/zkui/src/zkui/static/js/package.yml +++ /dev/null @@ -1,19 +0,0 @@ -# Licensed to the Apache Software Foundation (ASF) under one or more -# contributor license agreements. See the NOTICE file distributed with -# this work for additional information regarding copyright ownership. -# The ASF licenses this file to You 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. -copyright: Apache License v2.0 -version: 0.1 -description: ZooKeeper Browser -name: ZooKeeper Browser -sources: [Source/Zkui/Zkui.js] diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/huebrowser/zkui/src/zkui/stats.py b/pkg/registry/zookeeper-3.4.6/src/contrib/huebrowser/zkui/src/zkui/stats.py deleted file mode 100644 index 48f35dd37..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/contrib/huebrowser/zkui/src/zkui/stats.py +++ /dev/null @@ -1,170 +0,0 @@ -# Licensed to the Apache Software Foundation (ASF) under one -# or more contributor license agreements. See the NOTICE file -# distributed with this work for additional information -# regarding copyright ownership. The ASF licenses this file -# to you 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. - -import socket -import re - -from StringIO import StringIO - -class Session(object): - - class BrokenLine(Exception): pass - - def __init__(self, session): - m = re.search('/(\d+\.\d+\.\d+\.\d+):(\d+)\[(\d+)\]\((.*)\)', session) - if m: - self.host = m.group(1) - self.port = m.group(2) - self.interest_ops = m.group(3) - for d in m.group(4).split(","): - k,v = d.split("=") - self.__dict__[k] = v - else: - raise Session.BrokenLine() - -class ZooKeeperStats(object): - - def __init__(self, host='localhost', port='2181', timeout=1): - self._address = (host, int(port)) - self._timeout = timeout - - def get_stats(self): - """ Get ZooKeeper server stats as a map """ - data = self._send_cmd('mntr') - if data: - return self._parse(data) - else: - data = self._send_cmd('stat') - return self._parse_stat(data) - - def get_clients(self): - """ Get ZooKeeper server clients """ - clients = [] - - stat = self._send_cmd('stat') - if not stat: - return clients - - sio = StringIO(stat) - - #skip two lines - sio.readline() - sio.readline() - - for line in sio: - if not line.strip(): - break - try: - clients.append(Session(line.strip())) - except Session.BrokenLine: - continue - - return clients - - def _create_socket(self): - return socket.socket() - - def _send_cmd(self, cmd): - """ Send a 4letter word command to the server """ - s = self._create_socket() - s.settimeout(self._timeout) - - s.connect(self._address) - s.send(cmd) - - data = s.recv(2048) - s.close() - - return data - - def _parse(self, data): - """ Parse the output from the 'mntr' 4letter word command """ - h = StringIO(data) - - result = {} - for line in h.readlines(): - try: - key, value = self._parse_line(line) - result[key] = value - except ValueError: - pass # ignore broken lines - - return result - - def _parse_stat(self, data): - """ Parse the output from the 'stat' 4letter word command """ - h = StringIO(data) - - result = {} - - version = h.readline() - if version: - result['zk_version'] = version[version.index(':')+1:].strip() - - # skip all lines until we find the empty one - while h.readline().strip(): pass - - for line in h.readlines(): - m = re.match('Latency min/avg/max: (\d+)/(\d+)/(\d+)', line) - if m is not None: - result['zk_min_latency'] = int(m.group(1)) - result['zk_avg_latency'] = int(m.group(2)) - result['zk_max_latency'] = int(m.group(3)) - continue - - m = re.match('Received: (\d+)', line) - if m is not None: - result['zk_packets_received'] = int(m.group(1)) - continue - - m = re.match('Sent: (\d+)', line) - if m is not None: - result['zk_packets_sent'] = int(m.group(1)) - continue - - m = re.match('Outstanding: (\d+)', line) - if m is not None: - result['zk_outstanding_requests'] = int(m.group(1)) - continue - - m = re.match('Mode: (.*)', line) - if m is not None: - result['zk_server_state'] = m.group(1) - continue - - m = re.match('Node count: (\d+)', line) - if m is not None: - result['zk_znode_count'] = int(m.group(1)) - continue - - return result - - def _parse_line(self, line): - try: - key, value = map(str.strip, line.split('\t')) - except ValueError: - raise ValueError('Found invalid line: %s' % line) - - if not key: - raise ValueError('The key is mandatory and should not be empty') - - try: - value = int(value) - except (TypeError, ValueError): - pass - - return key, value - diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/huebrowser/zkui/src/zkui/templates/clients.mako b/pkg/registry/zookeeper-3.4.6/src/contrib/huebrowser/zkui/src/zkui/templates/clients.mako deleted file mode 100644 index 2bee9a7c5..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/contrib/huebrowser/zkui/src/zkui/templates/clients.mako +++ /dev/null @@ -1,51 +0,0 @@ -<%! -# Licensed to the Apache Software Foundation (ASF) under one -# or more contributor license agreements. See the NOTICE file -# distributed with this work for additional information -# regarding copyright ownership. The ASF licenses this file -# to you 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. -%> - -<%namespace name="shared" file="shared_components.mako" /> - -${shared.header("ZooKeeper Browser > Clients > %s:%s" % (host, port))} - -

      ${host}:${port} :: client connections

      -
      - -% if clients: - - - - - - - - - - - % for client in clients: - - - - - - - - - % endfor -
      HostPortInterest OpsQueuedReceivedSent
      ${client.host}${client.port}${client.interest_ops}${client.queued}${client.recved}${client.sent}
      -% endif - -${shared.footer()} - diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/huebrowser/zkui/src/zkui/templates/create.mako b/pkg/registry/zookeeper-3.4.6/src/contrib/huebrowser/zkui/src/zkui/templates/create.mako deleted file mode 100644 index 2a8b8ccca..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/contrib/huebrowser/zkui/src/zkui/templates/create.mako +++ /dev/null @@ -1,34 +0,0 @@ -<%! -# Licensed to the Apache Software Foundation (ASF) under one -# or more contributor license agreements. See the NOTICE file -# distributed with this work for additional information -# regarding copyright ownership. The ASF licenses this file -# to you 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. -%> -<%namespace name="shared" file="shared_components.mako" /> - -${shared.header("ZooKeeper Browser > Create Znode")} - -

      Create New Znode :: ${path}

      -

      - -
      - - ${form.as_table()|n} - -
      - -
      -
      - -${shared.footer()} diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/huebrowser/zkui/src/zkui/templates/edit.mako b/pkg/registry/zookeeper-3.4.6/src/contrib/huebrowser/zkui/src/zkui/templates/edit.mako deleted file mode 100644 index 997bd07af..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/contrib/huebrowser/zkui/src/zkui/templates/edit.mako +++ /dev/null @@ -1,34 +0,0 @@ -<%! -# Licensed to the Apache Software Foundation (ASF) under one -# or more contributor license agreements. See the NOTICE file -# distributed with this work for additional information -# regarding copyright ownership. The ASF licenses this file -# to you 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. -%> -<%namespace name="shared" file="shared_components.mako" /> - -${shared.header("ZooKeeper Browser > Edit Znode > %s" % path)} - -

      Edit Znode Data :: ${path}

      -

      - -
      - - ${form.as_table()|n} - -
      - -
      -
      - -${shared.footer()} diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/huebrowser/zkui/src/zkui/templates/index.mako b/pkg/registry/zookeeper-3.4.6/src/contrib/huebrowser/zkui/src/zkui/templates/index.mako deleted file mode 100644 index 567919dd0..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/contrib/huebrowser/zkui/src/zkui/templates/index.mako +++ /dev/null @@ -1,54 +0,0 @@ -<%! -# Licensed to the Apache Software Foundation (ASF) under one -# or more contributor license agreements. See the NOTICE file -# distributed with this work for additional information -# regarding copyright ownership. The ASF licenses this file -# to you 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. -%> -<%namespace name="shared" file="shared_components.mako" /> - -${shared.header("ZooKeeper Browser")} - -

      Overview

      - -
      - -% for i, c in enumerate(overview): -

      ${i+1}. ${c['nice_name']} Cluster Overview


      - - - - - - - - - - - - % for host, stats in c['stats'].items(): - - - - - - - - % endfor -
      NodeRoleAvg LatencyWatch CountVersion
      ${host}${stats.get('zk_server_state', '')}${stats.get('zk_avg_latency', '')}${stats.get('zk_watch_count', '')}${stats.get('zk_version', '')}
      - -

      -% endfor - -${shared.footer()} - diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/huebrowser/zkui/src/zkui/templates/shared_components.mako b/pkg/registry/zookeeper-3.4.6/src/contrib/huebrowser/zkui/src/zkui/templates/shared_components.mako deleted file mode 100644 index f9a458934..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/contrib/huebrowser/zkui/src/zkui/templates/shared_components.mako +++ /dev/null @@ -1,66 +0,0 @@ -<%! -# Licensed to the Apache Software Foundation (ASF) under one -# or more contributor license agreements. See the NOTICE file -# distributed with this work for additional information -# regarding copyright ownership. The ASF licenses this file -# to you 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. -%> - -<%! -import datetime -from django.template.defaultfilters import urlencode, escape -from zkui import settings -%> - -<%def name="header(title='ZooKeeper Browser', toolbar=True)"> - - - - ${title} - - - % if toolbar: -
      - -
      - % endif - -
      -
      - -
      - -

      Clusters

      - -
      - -
      - - -<%def name="info_button(url, text)"> - ${text} - - -<%def name="footer()"> -
      -
      - - - diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/huebrowser/zkui/src/zkui/templates/tree.mako b/pkg/registry/zookeeper-3.4.6/src/contrib/huebrowser/zkui/src/zkui/templates/tree.mako deleted file mode 100644 index c74c20209..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/contrib/huebrowser/zkui/src/zkui/templates/tree.mako +++ /dev/null @@ -1,75 +0,0 @@ -<%! -# Licensed to the Apache Software Foundation (ASF) under one -# or more contributor license agreements. See the NOTICE file -# distributed with this work for additional information -# regarding copyright ownership. The ASF licenses this file -# to you 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. -%> -<%namespace name="shared" file="shared_components.mako" /> - -${shared.header("ZooKeeper Browser > Tree > %s > %s" % (cluster['nice_name'], path))} - -

      ${cluster['nice_name'].lower()} :: ${path}

      -
      - - - - - - % for child in children: - - % endfor -
      Children
      - - ${child} - - Delete -
      -
      - - ${shared.info_button(url('zkui.views.create', id=cluster['id'], path=path), 'Create New')} - - -
      - -

      data :: base64 :: length :: ${znode.get('dataLength', 0)}

      -
      - - -
      - - ${shared.info_button(url('zkui.views.edit_as_base64', id=cluster['id'], path=path), 'Edit as Base64')} - ${shared.info_button(url('zkui.views.edit_as_text', id=cluster['id'], path=path), 'Edit as Text')} - -
      -
      - -

      stat information

      -
      - - - - - % for key in ('pzxid', 'ctime', 'aversion', 'mzxid', \ - 'ephemeralOwner', 'version', 'mtime', 'cversion', 'czxid'): - - % endfor -
      KeyValue
      ${key}${znode[key]}
      - -
      -Details on stat information. - -${shared.footer()} - diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/huebrowser/zkui/src/zkui/templates/view.mako b/pkg/registry/zookeeper-3.4.6/src/contrib/huebrowser/zkui/src/zkui/templates/view.mako deleted file mode 100644 index e046afc4f..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/contrib/huebrowser/zkui/src/zkui/templates/view.mako +++ /dev/null @@ -1,128 +0,0 @@ -<%! -# Licensed to the Apache Software Foundation (ASF) under one -# or more contributor license agreements. See the NOTICE file -# distributed with this work for additional information -# regarding copyright ownership. The ASF licenses this file -# to you 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. -%> -<%namespace name="shared" file="shared_components.mako" /> - -${shared.header("ZooKeeper Browser > %s" % cluster['nice_name'])} - -<%def name="show_stats(stats)"> - - Key - Value - - - Version - ${stats.get('zk_version')} - - - Latency - Min: ${stats.get('zk_min_latency', '')} - Avg: ${stats.get('zk_avg_latency', '')} - Max: ${stats.get('zk_max_latency', '')} - - - Packets - Sent: ${stats.get('zk_packets_sent', '')} - Received: ${stats.get('zk_packets_received', '')} - - - - Outstanding Requests - ${stats.get('zk_outstanding_requests', '')} - - - Watch Count - ${stats.get('zk_watch_count', '')} - - - Open FD Count - ${stats.get('zk_open_file_descriptor_count', '')} - - - Max FD Count - ${stats.get('zk_max_file_descriptor_count', '')} - - - - -

      ${cluster['nice_name']} Cluster Overview

      - -${shared.info_button(url('zkui.views.tree', id=cluster['id'], path='/'), 'View Znode Hierarchy')} - -

      - -% if leader: -

      General

      - - - - - - - - - - - - - - - -
      KeyValue
      ZNode Count${leader.get('zk_znode_count', '')}
      Ephemerals Count${leader.get('zk_ephemerals_count', '')}
      Approximate Data Size${leader.get('zk_approximate_data_size', '')} bytes
      -

      -% endif - -% if leader: -

      node :: ${leader['host']} :: leader

      - - ${shared.info_button(url('zkui.views.clients', host=leader['host']), 'View Client Connections')} - -

      - - ${show_stats(leader)} - - - - - - - - - - - - - -
      Followers${leader.get('zk_followers', '')}
      Synced Followers${leader.get('zk_synced_followers', '')}
      Pending Syncs${leader.get('zk_pending_syncs', '')}
      -

      -% endif - -% for stats in followers: -

      node :: ${stats['host']} :: follower

      -
      - - ${shared.info_button(url('zkui.views.clients', host=stats['host']), 'View Client Connections')} - -

      - - ${show_stats(stats)} -
      -

      -% endfor - -${shared.footer()} - diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/huebrowser/zkui/src/zkui/urls.py b/pkg/registry/zookeeper-3.4.6/src/contrib/huebrowser/zkui/src/zkui/urls.py deleted file mode 100644 index f795f7e71..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/contrib/huebrowser/zkui/src/zkui/urls.py +++ /dev/null @@ -1,28 +0,0 @@ -# Licensed to the Apache Software Foundation (ASF) under one -# or more contributor license agreements. See the NOTICE file -# distributed with this work for additional information -# regarding copyright ownership. The ASF licenses this file -# to you 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. - -from django.conf.urls.defaults import patterns, url - -urlpatterns = patterns('zkui', - url(r'^$', 'views.index'), - url(r'view/(?P\d+)$', 'views.view'), - url(r'clients/(?P.+)$', 'views.clients'), - url(r'tree/(?P\d+)(?P.+)$', 'views.tree'), - url(r'create/(?P\d+)(?P.*)$', 'views.create'), - url(r'delete/(?P\d+)(?P.*)$', 'views.delete'), - url(r'edit/base64/(?P\d+)(?P.*)$', 'views.edit_as_base64'), - url(r'edit/text/(?P\d+)(?P.*)$', 'views.edit_as_text') -) diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/huebrowser/zkui/src/zkui/utils.py b/pkg/registry/zookeeper-3.4.6/src/contrib/huebrowser/zkui/src/zkui/utils.py deleted file mode 100644 index fb013170f..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/contrib/huebrowser/zkui/src/zkui/utils.py +++ /dev/null @@ -1,33 +0,0 @@ -# Licensed to the Apache Software Foundation (ASF) under one -# or more contributor license agreements. See the NOTICE file -# distributed with this work for additional information -# regarding copyright ownership. The ASF licenses this file -# to you 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. - -from zkui import settings - -from django.http import Http404 - -def get_cluster_or_404(id): - try: - id = int(id) - if not (0 <= id < len(settings.CLUSTERS)): - raise ValueError, 'Undefined cluster id.' - except (TypeError, ValueError): - raise Http404() - - cluster = settings.CLUSTERS[id] - cluster['id'] = id - - return cluster - diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/huebrowser/zkui/src/zkui/views.py b/pkg/registry/zookeeper-3.4.6/src/contrib/huebrowser/zkui/src/zkui/views.py deleted file mode 100644 index 64d926b60..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/contrib/huebrowser/zkui/src/zkui/views.py +++ /dev/null @@ -1,165 +0,0 @@ -# Licensed to the Apache Software Foundation (ASF) under one -# or more contributor license agreements. See the NOTICE file -# distributed with this work for additional information -# regarding copyright ownership. The ASF licenses this file -# to you 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. - -from desktop.lib.django_util import render -from django.http import Http404 - -from zkui import settings -from zkui.stats import ZooKeeperStats -from zkui.rest import ZooKeeper -from zkui.utils import get_cluster_or_404 -from zkui.forms import CreateZNodeForm, EditZNodeForm - -def _get_global_overview(): - overview = [] - for c in settings.CLUSTERS: - overview.append(_get_overview(c)) - return overview - -def _get_overview(cluster): - stats = {} - for s in cluster['hostport'].split(','): - host, port = map(str.strip, s.split(':')) - - zks = ZooKeeperStats(host, port) - stats[s] = zks.get_stats() or {} - - cluster['stats'] = stats - return cluster - -def _group_stats_by_role(cluster): - leader, followers = None, [] - for host, stats in cluster['stats'].items(): - stats['host'] = host - - if stats.get('zk_server_state') == 'leader': - leader = stats - - elif stats.get('zk_server_state') == 'follower': - followers.append(stats) - - return leader, followers - -def index(request): - overview = _get_global_overview() - return render('index.mako', request, - dict(overview=overview)) - -def view(request, id): - cluster = get_cluster_or_404(id) - - cluster = _get_overview(cluster) - leader, followers = _group_stats_by_role(cluster) - - return render('view.mako', request, - dict(cluster=cluster, leader=leader, followers=followers)) - -def clients(request, host): - parts = host.split(':') - if len(parts) != 2: - raise Http404 - - host, port = parts - zks = ZooKeeperStats(host, port) - clients = zks.get_clients() - - return render('clients.mako', request, - dict(host=host, port=port, clients=clients)) - -def tree(request, id, path): - cluster = get_cluster_or_404(id) - zk = ZooKeeper(cluster['rest_gateway']) - - znode = zk.get(path) - children = sorted(zk.get_children_paths(path)) - - return render('tree.mako', request, - dict(cluster=cluster, path=path, \ - znode=znode, children=children)) - -def delete(request, id, path): - cluster = get_cluster_or_404(id) - if request.method == 'POST': - zk = ZooKeeper(cluster['rest_gateway']) - try: - zk.recursive_delete(path) - except ZooKeeper.NotFound: - pass - - return tree(request, id, path[:path.rindex('/')] or '/') - -def create(request, id, path): - cluster = get_cluster_or_404(id) - - if request.method == 'POST': - form = CreateZNodeForm(request.POST) - if form.is_valid(): - zk = ZooKeeper(cluster['rest_gateway']) - - full_path = ("%s/%s" % (path, form.cleaned_data['name']))\ - .replace('//', '/') - - zk.create(full_path, \ - form.cleaned_data['data'], \ - sequence = form.cleaned_data['sequence']) - return tree(request, id, path) - else: - form = CreateZNodeForm() - - return render('create.mako', request, - dict(path=path, form=form)) - -def edit_as_base64(request, id, path): - cluster = get_cluster_or_404(id) - zk = ZooKeeper(cluster['rest_gateway']) - node = zk.get(path) - - if request.method == 'POST': - form = EditZNodeForm(request.POST) - if form.is_valid(): - # TODO is valid base64 string? - data = form.cleaned_data['data'].decode('base64') - zk.set(path, data, form.cleaned_data['version']) - - return tree(request, id, path) - else: - form = EditZNodeForm(dict(\ - data=node.get('data64', ''), - version=node.get('version', '-1'))) - - return render('edit.mako', request, - dict(path=path, form=form)) - -def edit_as_text(request, id, path): - cluster = get_cluster_or_404(id) - zk = ZooKeeper(cluster['rest_gateway']) - node = zk.get(path) - - if request.method == 'POST': - form = EditZNodeForm(request.POST) - if form.is_valid(): - zk.set(path, form.cleaned_data['data']) - - return tree(request, id, path) - else: - form = EditZNodeForm(dict(data=node.get('data64', '')\ - .decode('base64').strip(), - version=node.get('version', '-1'))) - - return render('edit.mako', request, - dict(path=path, form=form)) - - diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/huebrowser/zkui/src/zkui/windmilltests.py b/pkg/registry/zookeeper-3.4.6/src/contrib/huebrowser/zkui/src/zkui/windmilltests.py deleted file mode 100644 index ba44e2686..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/contrib/huebrowser/zkui/src/zkui/windmilltests.py +++ /dev/null @@ -1,23 +0,0 @@ -# Licensed to the Apache Software Foundation (ASF) under one -# or more contributor license agreements. See the NOTICE file -# distributed with this work for additional information -# regarding copyright ownership. The ASF licenses this file -# to you 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. - -from desktop.lib.windmill_util import logged_in_client - -def test_zkui(): - """ launches the default view for zkui """ - client = logged_in_client() - client.click(id='ccs-zkui-menu') - client.waits.forElement(classname='CCS-ZKUI', timeout='2000') diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/loggraph/README.txt b/pkg/registry/zookeeper-3.4.6/src/contrib/loggraph/README.txt deleted file mode 100644 index 1865fa5ab..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/contrib/loggraph/README.txt +++ /dev/null @@ -1,69 +0,0 @@ -LogGraph README - -1 - About -LogGraph is an application for viewing and filtering zookeeper logs. It can handle transaction logs and message logs. - -2 - Compiling - -Run "ant jar" in src/contrib/loggraph/. This will download all dependencies and compile all the loggraph code. - -Once compilation has finished, you can run it the the loggraph.sh script in src/contrib/loggraph/bin. This will start and embedded web server on your machine. -Navigate to http://localhost:8182/graph/main.html - -3 - Usage -LogGraph presents the user with 4 views, - - a) Simple log view - This view simply displays the log text. This isn't very useful without filters (see "Filtering the logs"). - - b) Server view - The server view shows the interactions between the different servers in an ensemble. The X axis represents time. - * Exceptions show up as red dots. Hovering your mouse over them will give you more details of the exception - * The colour of the line represents the election state of the server. - - orange means LOOKING for leader - - dark green means the server is the leader - - light green means the server is following a leader - - yellow means there isn't enough information to determine the state of the server. - * The gray arrows denote election messages between servers. Pink dashed arrows are messages that were sent but never delivered. - - c) Session view - The session view shows the lifetime of sessions on a server. Use the time filter to narrow down the view. Any more than about 2000 events will take a long time to view in your browser. - The X axis represents time. Each line is a session. The black dots represent events on the session. You can click on the black dots for more details of the event. - - d) Stats view - There is currently only one statistics view, Transactions/minute. Suggestions for other statistic views are very welcome. - -4 - Filtering the logs -The logs can be filtered in 2 ways, by time and by content. - -To filter by time simply move the slider to the desired start time. The time window specifies how many milliseconds after and including the start time will be displayed. - -Content filtering uses a adhoc filtering language, using prefix notation. The language looks somewhat similar to lisp. A statement in the language takes the form (op arg arg ....). A statement resolves to a boolean value. Statements can be nested. - -4.1 - Filter arguments -An argument can be a number, a string or a symbol. A number is any argument which starts with -, + or 0 to 9. If the number starts with 0x it is interpretted as hexidecimal. Otherwise it is interpretted as decimal. If the argument begins with a double-quote, (") it is interpretted as a string. Anything else is interpretted as a symbol. - -4.2 - Filter symbols -The possible filter symbols are: - -client-id : number, the session id of the client who initiated a transaction. -cxid : number, the cxid of a transaction -zxid : number, the zxid of a transaction -operation : string, the operation being performed, for example "setData", "createSession", "closeSession", "error", "create" - -4.3 - Filter operations -The possible filter operations are: - -or : logical or, takes 1 or more arguments which must be other statements. -and : logical and, takes 1 or more arguments which must be other statements. -not : logical not, takes 1 argument which must be another statement. -xor : exclusive or, takes 1 or more arguments which must be other statements. -= : equals, takes 1 or more arguments, which must all be equal to each other to return true. -> : greater than, takes 1 or more arguments, to return true the 1st argument must be greater than the 2nd argument which must be greater than the 3rd argument and so on... -< : less than, takes 1 or more arguments, to return true the 1st argument must be less than the 2nd argument which must be less than the 3rd argument and so on... - -4.3 - Filter examples -Give me all the setData operations with session id 0xdeadbeef or 0xcafeb33r but not with zxid 0x12341234 -> - -(and (= operation "setData") (or (= client-id 0xdeadbeef) (= client-id 0xcafeb33r)) (not (= zxid 0x12341234))) - diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/loggraph/bin/loggraph-dev.sh b/pkg/registry/zookeeper-3.4.6/src/contrib/loggraph/bin/loggraph-dev.sh deleted file mode 100755 index 0b82efa35..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/contrib/loggraph/bin/loggraph-dev.sh +++ /dev/null @@ -1,43 +0,0 @@ -#!/bin/sh - -# Licensed to the Apache Software Foundation (ASF) under one or more -# contributor license agreements. See the NOTICE file distributed with -# this work for additional information regarding copyright ownership. -# The ASF licenses this file to You 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. - -make_canonical () { - cd $1; pwd; -} - -SCRIPTDIR=`dirname $0` -BUILDDIR=`make_canonical $SCRIPTDIR/../../../../build/contrib/loggraph` -LIBDIR=`make_canonical $BUILDDIR/lib` -WEBDIR=`make_canonical $SCRIPTDIR/../web` -ZKDIR=`make_canonical $SCRIPTDIR/../../../../build/` - -if [ ! -x $BUILDDIR ]; then - echo "\n\n*** You need to build loggraph before running it ***\n\n"; - exit; -fi - -for i in `ls $LIBDIR`; do - CLASSPATH=$LIBDIR/$i:$CLASSPATH -done - -for i in $ZKDIR/zookeeper-*.jar; do - CLASSPATH="$i:$CLASSPATH" -done - -CLASSPATH=$BUILDDIR/classes:$WEBDIR:$CLASSPATH -echo $CLASSPATH -java -Dlog4j.configuration=org/apache/zookeeper/graph/log4j.properties -Xdebug -Xrunjdwp:transport=dt_socket,address=4444,server=y,suspend=n -cp $CLASSPATH org.apache.zookeeper.graph.LogServer $* diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/loggraph/bin/loggraph.sh b/pkg/registry/zookeeper-3.4.6/src/contrib/loggraph/bin/loggraph.sh deleted file mode 100755 index 381e5ad47..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/contrib/loggraph/bin/loggraph.sh +++ /dev/null @@ -1,48 +0,0 @@ -#!/bin/sh - -# Licensed to the Apache Software Foundation (ASF) under one or more -# contributor license agreements. See the NOTICE file distributed with -# this work for additional information regarding copyright ownership. -# The ASF licenses this file to You 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. - -make_canonical () { - cd $1; pwd; -} - -SCRIPTDIR=`dirname $0` -BUILDDIR=`make_canonical $SCRIPTDIR/../../../../build/contrib/loggraph` -LIBDIR=`make_canonical $BUILDDIR/lib` -ZKDIR=`make_canonical $SCRIPTDIR/../../../../build/` - -if [ ! -x $BUILDDIR ]; then - echo "\n\n*** You need to build loggraph before running it ***\n\n"; - exit; -fi - -for i in `ls $LIBDIR`; do - CLASSPATH=$LIBDIR/$i:$CLASSPATH -done - -for i in `ls $BUILDDIR/*.jar`; do - CLASSPATH=$i:$CLASSPATH -done - -for i in $ZKDIR/zookeeper-*.jar; do - CLASSPATH="$i:$CLASSPATH" -done - -java -cp $CLASSPATH org.apache.zookeeper.graph.LogServer $* - - - - diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/loggraph/build.xml b/pkg/registry/zookeeper-3.4.6/src/contrib/loggraph/build.xml deleted file mode 100644 index 5be6970b6..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/contrib/loggraph/build.xml +++ /dev/null @@ -1,70 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/loggraph/ivy.xml b/pkg/registry/zookeeper-3.4.6/src/contrib/loggraph/ivy.xml deleted file mode 100644 index d6fa9d6d7..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/contrib/loggraph/ivy.xml +++ /dev/null @@ -1,44 +0,0 @@ - - - - - - - - ZooKeeper Graphing - - - - - - - - - - - - - - - - - - - diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/loggraph/src/java/org/apache/zookeeper/graph/FilterException.java b/pkg/registry/zookeeper-3.4.6/src/contrib/loggraph/src/java/org/apache/zookeeper/graph/FilterException.java deleted file mode 100644 index c0912fa7d..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/contrib/loggraph/src/java/org/apache/zookeeper/graph/FilterException.java +++ /dev/null @@ -1,22 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you 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. - */ -package org.apache.zookeeper.graph; - -public class FilterException extends Exception { - public FilterException(String s) { super(s); } -}; diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/loggraph/src/java/org/apache/zookeeper/graph/FilterOp.java b/pkg/registry/zookeeper-3.4.6/src/contrib/loggraph/src/java/org/apache/zookeeper/graph/FilterOp.java deleted file mode 100644 index ee7328323..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/contrib/loggraph/src/java/org/apache/zookeeper/graph/FilterOp.java +++ /dev/null @@ -1,75 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you 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. - */ -package org.apache.zookeeper.graph; - -import java.util.ArrayList; -import org.apache.zookeeper.graph.filterops.*; - -public abstract class FilterOp { - protected ArrayList subOps; - protected ArrayList args; - - public enum ArgType { - STRING, NUMBER, SYMBOL - } - - public FilterOp() { - subOps = new ArrayList(); - args = new ArrayList(); - } - - public static FilterOp newOp(String op) throws FilterException { - if (op.equals("or")) - return new OrOp(); - if (op.equals("and")) - return new AndOp(); - if (op.equals("not")) - return new NotOp(); - if (op.equals("xor")) - return new XorOp(); - if (op.equals("=")) - return new EqualsOp(); - if (op.equals("<")) - return new LessThanOp(); - if (op.equals(">")) - return new GreaterThanOp(); - - throw new FilterException("Invalid operation '"+op+"'"); - } - - public void addSubOp(FilterOp op) { - subOps.add(op); - } - - public void addArg(Arg arg) { - args.add(arg); - } - - public abstract boolean matches(LogEntry entry) throws FilterException; - - public String toString() { - String op = "(" + getClass().getName(); - for (FilterOp f : subOps) { - op += " " + f; - } - for (Arg a : args) { - op += " " + a; - } - return op + ")"; - } -} diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/loggraph/src/java/org/apache/zookeeper/graph/FilterParser.java b/pkg/registry/zookeeper-3.4.6/src/contrib/loggraph/src/java/org/apache/zookeeper/graph/FilterParser.java deleted file mode 100644 index cf12e3a53..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/contrib/loggraph/src/java/org/apache/zookeeper/graph/FilterParser.java +++ /dev/null @@ -1,131 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you 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. - */ -package org.apache.zookeeper.graph; - -import java.io.PushbackReader; -import java.io.StringReader; -import java.io.IOException; -import java.util.ArrayList; - -import org.apache.zookeeper.graph.filterops.*; - -public class FilterParser { - private PushbackReader reader; - - public FilterParser(String s) { - reader = new PushbackReader(new StringReader(s)); - } - - private String readUntilSpace() throws IOException { - StringBuffer buffer = new StringBuffer(); - - int c = reader.read(); - while (!Character.isWhitespace(c) && c != ')' && c != '(') { - buffer.append((char)c); - c = reader.read(); - if (c == -1) { - break; - } - } - reader.unread(c); - - return buffer.toString().trim(); - } - - private StringArg readStringArg() throws IOException, FilterException { - int c = reader.read(); - int last = 0; - if (c != '"') { - throw new FilterException("Check the parser, trying to read a string that doesn't begin with quotes"); - } - StringBuffer buffer = new StringBuffer(); - while (reader.ready()) { - last = c; - c = reader.read(); - if (c == -1) { - break; - } - - if (c == '"' && last != '\\') { - return new StringArg(buffer.toString()); - } else { - buffer.append((char)c); - } - } - throw new FilterException("Unterminated string"); - } - - private NumberArg readNumberArg() throws IOException, FilterException { - String strval = readUntilSpace(); - - try { - if (strval.startsWith("0x")) { - return new NumberArg(Long.valueOf(strval.substring(2), 16)); - } else { - return new NumberArg(Long.valueOf(strval)); - } - } catch (NumberFormatException e) { - throw new FilterException("Not a number [" + strval + "]\n" + e); - } - } - - private SymbolArg readSymbolArg() throws IOException, FilterException { - return new SymbolArg(readUntilSpace()); - } - - public FilterOp parse() throws IOException, FilterException { - int c = reader.read(); - if (c != '(') { - throw new FilterException("Invalid format"); - } - - String opstr = readUntilSpace(); - FilterOp op = FilterOp.newOp(opstr); - - while (reader.ready()) { - c = reader.read(); - if (c == -1) { - break; - } - if (c == '(') { - reader.unread(c); - op.addSubOp(parse()); - } else if (c == ')') { - return op; - } else if (c == '"') { - reader.unread(c); - op.addArg(readStringArg()); - } else if (Character.isDigit(c) || c == '-' || c == '+') { - reader.unread(c); - op.addArg(readNumberArg()); - } else if (Character.isJavaIdentifierStart(c)) { - reader.unread(c); - op.addArg(readSymbolArg()); - } - } - throw new FilterException("Incomplete filter"); - } - - public static void main(String[] args) throws IOException, FilterException { - if (args.length == 1) { - System.out.println(new FilterParser(args[0]).parse()); - } else { - System.out.println(new FilterParser("(or (and (= session foobar) (= session barfoo)) (= session sdfs))").parse()); - } - } -}; diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/loggraph/src/java/org/apache/zookeeper/graph/JsonGenerator.java b/pkg/registry/zookeeper-3.4.6/src/contrib/loggraph/src/java/org/apache/zookeeper/graph/JsonGenerator.java deleted file mode 100644 index afaf3a1c9..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/contrib/loggraph/src/java/org/apache/zookeeper/graph/JsonGenerator.java +++ /dev/null @@ -1,223 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you 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. - */ -package org.apache.zookeeper.graph; - - -import org.json.simple.JSONArray; -import org.json.simple.JSONObject; -import org.json.simple.JSONValue; - -import java.io.Writer; -import java.io.OutputStreamWriter; -import java.io.IOException; -import java.util.regex.Pattern; -import java.util.regex.Matcher; -import java.util.HashSet; -import java.util.Iterator; -import java.util.LinkedList; -import java.util.ListIterator; - -public class JsonGenerator { - private JSONObject root; - private HashSet servers; - - private class Message { - private int from; - private int to; - private long zxid; - - public Message(int from, int to, long zxid) { - this.from = from; - this.to = to; - this.zxid = zxid; - } - - public boolean equals(Message m) { - return (m.from == this.from - && m.to == this.to - && m.zxid == this.zxid); - } - }; - - public JSONObject txnEntry(TransactionEntry e) { - JSONObject event = new JSONObject(); - - event.put("time", Long.toString(e.getTimestamp())); - event.put("client", Long.toHexString(e.getClientId())); - event.put("cxid", Long.toHexString(e.getCxid())); - event.put("zxid", Long.toHexString(e.getZxid())); - event.put("op", e.getOp()); - event.put("extra", e.getExtra()); - event.put("type", "transaction"); - - return event; - } - - /** - Assumes entries are sorted by timestamp. - */ - public JsonGenerator(LogIterator iter) { - servers = new HashSet(); - - Pattern stateChangeP = Pattern.compile("- (LOOKING|FOLLOWING|LEADING)"); - Pattern newElectionP = Pattern.compile("New election. My id = (\\d+), Proposed zxid = (\\d+)"); - Pattern receivedProposalP = Pattern.compile("Notification: (\\d+) \\(n.leader\\), (\\d+) \\(n.zxid\\), (\\d+) \\(n.round\\), .+ \\(n.state\\), (\\d+) \\(n.sid\\), .+ \\(my state\\)"); - Pattern exceptionP = Pattern.compile("xception"); - - root = new JSONObject(); - Matcher m = null; - JSONArray events = new JSONArray(); - root.put("events", events); - - long starttime = Long.MAX_VALUE; - long endtime = 0; - - int leader = 0; - long curEpoch = 0; - boolean newEpoch = false; - - while (iter.hasNext()) { - LogEntry ent = iter.next(); - - if (ent.getTimestamp() < starttime) { - starttime = ent.getTimestamp(); - } - if (ent.getTimestamp() > endtime) { - endtime = ent.getTimestamp(); - } - - if (ent.getType() == LogEntry.Type.TXN) { - events.add(txnEntry((TransactionEntry)ent)); - } else { - Log4JEntry e = (Log4JEntry)ent; - servers.add(e.getNode()); - - if ((m = stateChangeP.matcher(e.getEntry())).find()) { - JSONObject stateChange = new JSONObject(); - stateChange.put("type", "stateChange"); - stateChange.put("time", e.getTimestamp()); - stateChange.put("server", e.getNode()); - stateChange.put("state", m.group(1)); - events.add(stateChange); - - if (m.group(1).equals("LEADING")) { - leader = e.getNode(); - } - } else if ((m = newElectionP.matcher(e.getEntry())).find()) { - Iterator iterator = servers.iterator(); - long zxid = Long.valueOf(m.group(2)); - int count = (int)zxid;// & 0xFFFFFFFFL; - int epoch = (int)Long.rotateRight(zxid, 32);// >> 32; - - if (leader != 0 && epoch > curEpoch) { - JSONObject stateChange = new JSONObject(); - stateChange.put("type", "stateChange"); - stateChange.put("time", e.getTimestamp()); - stateChange.put("server", leader); - stateChange.put("state", "INIT"); - events.add(stateChange); - leader = 0; - } - - while (iterator.hasNext()) { - int dst = iterator.next(); - if (dst != e.getNode()) { - JSONObject msg = new JSONObject(); - msg.put("type", "postmessage"); - msg.put("src", e.getNode()); - msg.put("dst", dst); - msg.put("time", e.getTimestamp()); - msg.put("zxid", m.group(2)); - msg.put("count", count); - msg.put("epoch", epoch); - - events.add(msg); - } - } - } else if ((m = receivedProposalP.matcher(e.getEntry())).find()) { - // Pattern.compile("Notification: \\d+, (\\d+), (\\d+), \\d+, [^,]*, [^,]*, (\\d+)");//, LOOKING, LOOKING, 2 - int src = Integer.valueOf(m.group(4)); - long zxid = Long.valueOf(m.group(2)); - int dst = e.getNode(); - long epoch2 = Long.valueOf(m.group(3)); - - int count = (int)zxid;// & 0xFFFFFFFFL; - int epoch = (int)Long.rotateRight(zxid, 32);// >> 32; - - if (leader != 0 && epoch > curEpoch) { - JSONObject stateChange = new JSONObject(); - stateChange.put("type", "stateChange"); - stateChange.put("time", e.getTimestamp()); - stateChange.put("server", leader); - stateChange.put("state", "INIT"); - events.add(stateChange); - leader = 0; - } - - if (src != dst) { - JSONObject msg = new JSONObject(); - msg.put("type", "delivermessage"); - msg.put("src", src); - msg.put("dst", dst); - msg.put("time", e.getTimestamp()); - msg.put("zxid", zxid); - msg.put("epoch", epoch); - msg.put("count", count); - msg.put("epoch2", epoch2); - - events.add(msg); - } - } else if ((m = exceptionP.matcher(e.getEntry())).find()) { - JSONObject ex = new JSONObject(); - ex.put("type", "exception"); - ex.put("server", e.getNode()); - ex.put("time", e.getTimestamp()); - ex.put("text", e.getEntry()); - events.add(ex); - } - } - JSONObject ex = new JSONObject(); - ex.put("type", "text"); - ex.put("time", ent.getTimestamp()); - String txt = ent.toString(); - ex.put("text", txt); - events.add(ex); - } - // System.out.println("pending messages: "+pendingMessages.size()); - root.put("starttime", starttime); - root.put("endtime", endtime); - - JSONArray serversarray = new JSONArray(); - root.put("servers", serversarray); - - Iterator iterator = servers.iterator(); - while (iterator.hasNext()) { - serversarray.add(iterator.next()); - } - } - - public String toString() { - return JSONValue.toJSONString(root); - } - - public static void main(String[] args) throws Exception { - MergedLogSource src = new MergedLogSource(args); - LogIterator iter = src.iterator(); - System.out.println(new JsonGenerator(iter)); - } -} diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/loggraph/src/java/org/apache/zookeeper/graph/Log4JEntry.java b/pkg/registry/zookeeper-3.4.6/src/contrib/loggraph/src/java/org/apache/zookeeper/graph/Log4JEntry.java deleted file mode 100644 index 0edc14602..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/contrib/loggraph/src/java/org/apache/zookeeper/graph/Log4JEntry.java +++ /dev/null @@ -1,40 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you 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. - */ -package org.apache.zookeeper.graph; - -public class Log4JEntry extends LogEntry { - public Log4JEntry(long timestamp, int node, String entry) { - super(timestamp); - setAttribute("log-text", entry); - setAttribute("node", new Integer(node)); - } - - public String getEntry() { - return (String) getAttribute("log-text"); - } - - public String toString() { - return "" + getTimestamp() + "::::" + getNode() + "::::" + getEntry(); - } - - public int getNode() { - return (Integer) getAttribute("node"); - } - - public Type getType() { return LogEntry.Type.LOG4J; } -} diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/loggraph/src/java/org/apache/zookeeper/graph/Log4JSource.java b/pkg/registry/zookeeper-3.4.6/src/contrib/loggraph/src/java/org/apache/zookeeper/graph/Log4JSource.java deleted file mode 100644 index 78f0898b1..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/contrib/loggraph/src/java/org/apache/zookeeper/graph/Log4JSource.java +++ /dev/null @@ -1,381 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you 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. - */ -package org.apache.zookeeper.graph; - -import java.io.File; -import java.io.InputStreamReader; -import java.io.BufferedReader; -import java.io.FileReader; -import java.io.IOException; -import java.util.regex.Pattern; -import java.util.regex.Matcher; -import java.util.ArrayList; -import java.util.Date; -import java.text.SimpleDateFormat; -import java.text.ParseException; -import java.util.Calendar; -import java.util.GregorianCalendar; - -import java.io.EOFException; -import java.io.Closeable; -import java.io.FileNotFoundException; -import java.util.Iterator; -import java.util.NoSuchElementException; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -public class Log4JSource implements LogSource { - private static final Logger LOG = LoggerFactory.getLogger(Log4JSource.class); - - private static final int skipN = 10000; - private static final String DATE_FORMAT = "yyyy-MM-dd HH:mm:ss,SSS"; - - private LogSkipList skiplist = null; - - private String file = null; - private long starttime = 0; - private long endtime = 0; - private int serverid = 0; - private long size = 0; - - private Pattern timep; - - public boolean overlapsRange(long starttime, long endtime) { - return (starttime <= this.endtime && endtime >= this.starttime); - } - - public long size() { return size; } - public long getStartTime() { return starttime; } - public long getEndTime() { return endtime; } - public LogSkipList getSkipList() { return skiplist; } - - private class Log4JSourceIterator implements LogIterator { - private RandomAccessFileReader in; - private LogEntry next = null; - private long starttime = 0; - private long endtime = 0; - private String buf = ""; - private Log4JSource src = null; - private long skippedAtStart = 0; - private SimpleDateFormat dateformat = null; - private FilterOp filter = null; - - public Log4JSourceIterator(Log4JSource src, long starttime, long endtime) throws IllegalArgumentException, FilterException { - this(src, starttime, endtime, null); - } - - public Log4JSourceIterator(Log4JSource src, long starttime, long endtime, FilterOp filter) throws IllegalArgumentException, FilterException { - - this.dateformat = new SimpleDateFormat(DATE_FORMAT); - this.src = src; - this.starttime = starttime; - this.endtime = endtime; - - File f = new File(src.file); - try { - in = new RandomAccessFileReader(f); - } catch (FileNotFoundException e) { - throw new IllegalArgumentException("Bad file passed in (" + src.file +") cannot open:" + e); - } - - // skip to the offset of latest skip point before starttime - LogSkipList.Mark start = src.getSkipList().findMarkBefore(starttime); - try { - in.seek(start.getBytes()); - skippedAtStart = start.getEntriesSkipped(); - } catch (IOException ioe) { - // if we can't skip, we should just read from the start - } - - LogEntry e; - while ((e = readNextEntry()) != null && e.getTimestamp() < endtime) { - if (e.getTimestamp() >= starttime && (filter == null || filter.matches(e))) { - next = e; - return; - } - skippedAtStart++; - } - this.filter = filter; - } - - synchronized public long size() throws IOException { - if (LOG.isTraceEnabled()) { - LOG.trace("size() called"); - } - - if (this.endtime >= src.getEndTime()) { - return src.size() - skippedAtStart; - } - - long pos = in.getPosition(); - - if (LOG.isTraceEnabled()) { - LOG.trace("saved pos () = " + pos); - } - - LogEntry e; - - LogSkipList.Mark lastseg = src.getSkipList().findMarkBefore(this.endtime); - in.seek(lastseg.getBytes()); - buf = ""; // clear the buf so we don't get something we read before we sought - // number of entries skipped to get to the end of the iterator, less the number skipped to get to the start - long count = lastseg.getEntriesSkipped() - skippedAtStart; - - while ((e = readNextEntry()) != null) { - if (LOG.isTraceEnabled()) { - //LOG.trace(e); - } - if (e.getTimestamp() > this.endtime) { - break; - } - count++; - } - in.seek(pos); - buf = ""; - - if (LOG.isTraceEnabled()) { - LOG.trace("size() = " + count); - } - - return count; - } - - synchronized private LogEntry readNextEntry() { - try { - try { - while (true) { - String line = in.readLine(); - if (line == null) { - break; - } - - Matcher m = src.timep.matcher(line); - if (m.lookingAt()) { - if (buf.length() > 0) { - LogEntry e = new Log4JEntry(src.timestampFromText(dateformat, buf), src.getServerId(), buf); - buf = line; - return e; - } - buf = line; - } else if (buf.length() > 0) { - buf += line + "\n"; - } - } - } catch (EOFException eof) { - // ignore, we've simply come to the end of the file - } - if (buf.length() > 0) { - LogEntry e = new Log4JEntry(src.timestampFromText(dateformat, buf), src.getServerId(), buf); - buf = ""; - return e; - } - } catch (Exception e) { - LOG.error("Error reading next entry in file (" + src.file + "): " + e); - return null; - } - return null; - } - - public boolean hasNext() { - return next != null; - } - - public LogEntry next() throws NoSuchElementException { - LogEntry ret = next; - LogEntry e = readNextEntry(); - - if (filter != null) { - try { - while (e != null && !filter.matches(e)) { - e = readNextEntry(); - } - } catch (FilterException fe) { - throw new NoSuchElementException(e.toString()); - } - } - - if (e != null && e.getTimestamp() < endtime) { - next = e; - } else { - next = null; - } - return ret; - } - - public void remove() throws UnsupportedOperationException { - throw new UnsupportedOperationException("remove not supported for L4J logs"); - } - - public void close() throws IOException { - in.close(); - } - - public String toString() { - String size; - try { - size = new Long(size()).toString(); - } catch (IOException ioe) { - size = "Unable to read"; - } - return "Log4JSourceIterator(start=" + starttime + ", end=" + endtime + ", size=" + size + ")"; - } - } - - public LogIterator iterator(long starttime, long endtime) throws IllegalArgumentException { - try { - return iterator(starttime, endtime, null); - } catch (FilterException fe) { - assert(false); //"This should never happen, you can't have a filter exception without a filter"); - return null; - } - } - - public LogIterator iterator(long starttime, long endtime, FilterOp filter) throws IllegalArgumentException, FilterException{ - // sanitise start and end times - if (endtime < starttime) { - throw new IllegalArgumentException("End time (" + endtime + ") must be greater or equal to starttime (" + starttime + ")"); - } - - return new Log4JSourceIterator(this, starttime, endtime, filter); - } - - public LogIterator iterator() throws IllegalArgumentException { - return iterator(starttime, endtime+1); - } - - public Log4JSource(String file) throws IOException { - this.file=file; - - timep = Pattern.compile("^(\\d{4}-\\d{2}-\\d{2} \\d{2}:\\d{2}:\\d{2},\\d{3})"); - skiplist = new LogSkipList(); - init(); - } - - private static long timestampFromText(SimpleDateFormat format, String s) { - Date d = null; - try { - d = format.parse(s); - } catch (ParseException e) { - return 0; - } - Calendar c = new GregorianCalendar(); - c.setTime(d); - return c.getTimeInMillis(); - } - - private void init() throws IOException { - File f = new File(file); - RandomAccessFileReader in = new RandomAccessFileReader(f); - SimpleDateFormat dateformat = new SimpleDateFormat(DATE_FORMAT); - Pattern idp = Pattern.compile("\\[myid:(\\d+)\\]"); - - long lastFp = in.getPosition(); - String line = in.readLine(); - Matcher m = null; - - // if we have read data from the file, and it matchs the timep pattern - if ((line != null) && (m = timep.matcher(line)).lookingAt()) { - starttime = timestampFromText(dateformat, m.group(1)); - } else { - throw new IOException("Invalid log4j format. First line doesn't start with time"); - } - - /* - Count number of log entries. Any line starting with a timestamp counts as an entry - */ - String lastentry = line; - try { - while (line != null) { - m = timep.matcher(line); - if (m.lookingAt()) { - if (size % skipN == 0) { - long time = timestampFromText(dateformat, m.group(1)); - skiplist.addMark(time, lastFp, size); - } - size++; - lastentry = line; - } - if (serverid == 0 && (m = idp.matcher(line)).find()) { - serverid = Integer.valueOf(m.group(1)); - } - - lastFp = in.getPosition(); - line = in.readLine(); - } - } catch (EOFException eof) { - // ignore, simply end of file, though really (line!=null) should have caught this - } finally { - in.close(); - } - - m = timep.matcher(lastentry); - if (m.lookingAt()) { - endtime = timestampFromText(dateformat, m.group(1)); - } else { - throw new IOException("Invalid log4j format. Last line doesn't start with time"); - } - } - - public String toString() { - return "Log4JSource(file=" + file + ", size=" + size + ", start=" + starttime + ", end=" + endtime +", id=" + serverid +")"; - } - - public static void main(String[] args) throws IOException { - final Log4JSource s = new Log4JSource(args[0]); - System.out.println(s); - - LogIterator iter; - - if (args.length == 3) { - final long starttime = Long.valueOf(args[1]); - final long endtime = Long.valueOf(args[2]); - iter = s.iterator(starttime, endtime); - - Thread t1 = new Thread() { public void run () { - - LogIterator iter = s.iterator(starttime, endtime); - System.out.println(iter); - }; }; - Thread t2 = new Thread() { public void run () { - - LogIterator iter = s.iterator(starttime, endtime); - System.out.println(iter); - }; }; - Thread t3 = new Thread() { public void run () { - - LogIterator iter = s.iterator(starttime, endtime); - System.out.println(iter); - }; }; - t1.start(); - t2.start(); - // t3.start(); - } else { - iter = s.iterator(); - } - - /*while (iter.hasNext()) { - System.out.println(iter.next()); - }*/ - iter.close(); - } - - public int getServerId() { - return serverid; - } -} diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/loggraph/src/java/org/apache/zookeeper/graph/LogEntry.java b/pkg/registry/zookeeper-3.4.6/src/contrib/loggraph/src/java/org/apache/zookeeper/graph/LogEntry.java deleted file mode 100644 index a8252ebb9..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/contrib/loggraph/src/java/org/apache/zookeeper/graph/LogEntry.java +++ /dev/null @@ -1,46 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you 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. - */ -package org.apache.zookeeper.graph; - -import java.io.Serializable; -import java.util.HashMap; - -public abstract class LogEntry implements Serializable { - private HashMap attributes; - - public enum Type { UNKNOWN, LOG4J, TXN }; - - public LogEntry(long timestamp) { - attributes = new HashMap(); - setAttribute("timestamp", new Long(timestamp)); - } - - public long getTimestamp() { - return (Long)getAttribute("timestamp"); - } - - public abstract Type getType(); - - public void setAttribute(String key, Object v) { - attributes.put(key, v); - } - - public Object getAttribute(String key) { - return attributes.get(key); - } -} diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/loggraph/src/java/org/apache/zookeeper/graph/LogIterator.java b/pkg/registry/zookeeper-3.4.6/src/contrib/loggraph/src/java/org/apache/zookeeper/graph/LogIterator.java deleted file mode 100644 index 9af440ba1..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/contrib/loggraph/src/java/org/apache/zookeeper/graph/LogIterator.java +++ /dev/null @@ -1,26 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you 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. - */ -package org.apache.zookeeper.graph; - -import java.io.Closeable; -import java.util.Iterator; -import java.io.IOException; - -public interface LogIterator extends Iterator, Closeable { - long size() throws IOException;; -}; diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/loggraph/src/java/org/apache/zookeeper/graph/LogServer.java b/pkg/registry/zookeeper-3.4.6/src/contrib/loggraph/src/java/org/apache/zookeeper/graph/LogServer.java deleted file mode 100644 index 5cffcdd1d..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/contrib/loggraph/src/java/org/apache/zookeeper/graph/LogServer.java +++ /dev/null @@ -1,66 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you 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. - */ -package org.apache.zookeeper.graph; - -import java.io.IOException; - -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; -import javax.servlet.ServletException; - -import java.io.IOException; - -import org.eclipse.jetty.server.Server; -import org.eclipse.jetty.server.Request; -import org.eclipse.jetty.server.handler.AbstractHandler; -import org.eclipse.jetty.servlet.ServletContextHandler; -import org.eclipse.jetty.servlet.ServletHolder; - -import org.apache.zookeeper.graph.servlets.*; - -public class LogServer extends ServletContextHandler { - public LogServer(MergedLogSource src) throws Exception { - super(ServletContextHandler.SESSIONS); - setContextPath("/"); - - addServlet(new ServletHolder(new StaticContent()),"/graph/*"); - - addServlet(new ServletHolder(new Fs()),"/fs"); - addServlet(new ServletHolder(new GraphData(src)), "/data"); - addServlet(new ServletHolder(new FileLoader(src)), "/loadfile"); - addServlet(new ServletHolder(new NumEvents(src)), "/info"); - addServlet(new ServletHolder(new Throughput(src)), "/throughput"); - } - - public static void main(String[] args) { - try { - MergedLogSource src = new MergedLogSource(args); - System.out.println(src); - - Server server = new Server(8182); - server.setHandler(new LogServer(src)); - - server.start(); - server.join(); - - } catch (Exception e) { - // Something is wrong. - e.printStackTrace(); - } - } -} diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/loggraph/src/java/org/apache/zookeeper/graph/LogSkipList.java b/pkg/registry/zookeeper-3.4.6/src/contrib/loggraph/src/java/org/apache/zookeeper/graph/LogSkipList.java deleted file mode 100644 index e74444291..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/contrib/loggraph/src/java/org/apache/zookeeper/graph/LogSkipList.java +++ /dev/null @@ -1,95 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you 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. - */ -package org.apache.zookeeper.graph; - -import java.util.List; -import java.util.LinkedList; -import java.util.NoSuchElementException; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -/** -Generic skip list for holding a rough index of a log file. When the log file is loaded, this -index is built by adding a mark every n entries. Then when a specific time position is requested -from the file, a point at most n-1 entries before the time position can be jumped to. - -*/ -public class LogSkipList { - private static final Logger LOG = LoggerFactory.getLogger(LogSkipList.class); - - private LinkedList marks; - - public class Mark { - private long time; - private long bytes; - private long skipped; - - public Mark(long time, long bytes, long skipped) { - this.time = time; - this.bytes = bytes; - this.skipped = skipped; - } - - public long getTime() { return this.time; } - public long getBytes() { return this.bytes; } - public long getEntriesSkipped() { return this.skipped; } - - public String toString() { - return "Mark(time=" + time + ", bytes=" + bytes + ", skipped=" + skipped + ")"; - } - }; - - public LogSkipList() { - if (LOG.isTraceEnabled()) { - LOG.trace("New skip list"); - } - marks = new LinkedList(); - } - - public void addMark(long time, long bytes, long skipped) { - if (LOG.isTraceEnabled()) { - LOG.trace("addMark (time:" + time + ", bytes: " + bytes + ", skipped: " + skipped + ")"); - } - marks.add(new Mark(time, bytes, skipped)); - } - - /** - Find the last mark in the skip list before time. - */ - public Mark findMarkBefore(long time) throws NoSuchElementException { - if (LOG.isTraceEnabled()) { - LOG.trace("findMarkBefore(" + time + ")"); - } - - Mark last = marks.getFirst(); - for (Mark m: marks) { - if (m.getTime() > time) { - break; - } - last = m; - } - - if (LOG.isTraceEnabled()) { - LOG.trace("return " + last ); - } - - return last; - } - -}; diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/loggraph/src/java/org/apache/zookeeper/graph/LogSource.java b/pkg/registry/zookeeper-3.4.6/src/contrib/loggraph/src/java/org/apache/zookeeper/graph/LogSource.java deleted file mode 100644 index 9845c7f0b..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/contrib/loggraph/src/java/org/apache/zookeeper/graph/LogSource.java +++ /dev/null @@ -1,33 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you 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. - */ -package org.apache.zookeeper.graph; -import java.util.Iterator; - -public interface LogSource extends Iterable { - public LogIterator iterator(long starttime, long endtime, FilterOp filter) throws IllegalArgumentException, FilterException; - - public LogIterator iterator(long starttime, long endtime) throws IllegalArgumentException; - - public LogIterator iterator() throws IllegalArgumentException; - - public boolean overlapsRange(long starttime, long endtime); - - public long size(); - public long getStartTime(); - public long getEndTime(); -} diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/loggraph/src/java/org/apache/zookeeper/graph/MeasureThroughput.java b/pkg/registry/zookeeper-3.4.6/src/contrib/loggraph/src/java/org/apache/zookeeper/graph/MeasureThroughput.java deleted file mode 100644 index 1c83da7af..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/contrib/loggraph/src/java/org/apache/zookeeper/graph/MeasureThroughput.java +++ /dev/null @@ -1,103 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you 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. - */ -package org.apache.zookeeper.graph; - -import java.io.IOException; -import java.io.BufferedOutputStream; -import java.io.FileOutputStream; -import java.io.DataOutputStream; -import java.io.PrintStream; - -import java.util.HashSet; - -public class MeasureThroughput { - private static final int MS_PER_SEC = 1000; - private static final int MS_PER_MIN = MS_PER_SEC*60; - private static final int MS_PER_HOUR = MS_PER_MIN*60; - - public static void main(String[] args) throws IOException { - MergedLogSource source = new MergedLogSource(args); - - PrintStream ps_ms = new PrintStream(new BufferedOutputStream(new FileOutputStream("throughput-ms.out"))); - PrintStream ps_sec = new PrintStream(new BufferedOutputStream(new FileOutputStream("throughput-sec.out"))); - PrintStream ps_min = new PrintStream(new BufferedOutputStream(new FileOutputStream("throughput-min.out"))); - PrintStream ps_hour = new PrintStream(new BufferedOutputStream(new FileOutputStream("throughput-hour.out"))); - LogIterator iter; - - System.out.println(source); - iter = source.iterator(); - long currentms = 0; - long currentsec = 0; - long currentmin = 0; - long currenthour = 0; - HashSet zxids_ms = new HashSet(); - long zxid_sec = 0; - long zxid_min = 0; - long zxid_hour = 0; - - while (iter.hasNext()) { - LogEntry e = iter.next(); - TransactionEntry cxn = (TransactionEntry)e; - - long ms = cxn.getTimestamp(); - long sec = ms/MS_PER_SEC; - long min = ms/MS_PER_MIN; - long hour = ms/MS_PER_HOUR; - - if (currentms != ms && currentms != 0) { - ps_ms.println("" + currentms + " " + zxids_ms.size()); - - zxid_sec += zxids_ms.size(); - zxid_min += zxids_ms.size(); - zxid_hour += zxids_ms.size(); - zxids_ms.clear(); - } - - if (currentsec != sec && currentsec != 0) { - ps_sec.println("" + currentsec*MS_PER_SEC + " " + zxid_sec); - - zxid_sec = 0; - } - - if (currentmin != min && currentmin != 0) { - ps_min.println("" + currentmin*MS_PER_MIN + " " + zxid_min); - - zxid_min = 0; - } - - if (currenthour != hour && currenthour != 0) { - ps_hour.println("" + currenthour*MS_PER_HOUR + " " + zxid_hour); - - zxid_hour = 0; - } - - currentms = ms; - currentsec = sec; - currentmin = min; - currenthour = hour; - - zxids_ms.add(cxn.getZxid()); - } - - iter.close(); - ps_ms.close(); - ps_sec.close(); - ps_min.close(); - ps_hour.close(); - } -}; diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/loggraph/src/java/org/apache/zookeeper/graph/MergedLogSource.java b/pkg/registry/zookeeper-3.4.6/src/contrib/loggraph/src/java/org/apache/zookeeper/graph/MergedLogSource.java deleted file mode 100644 index bb789d395..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/contrib/loggraph/src/java/org/apache/zookeeper/graph/MergedLogSource.java +++ /dev/null @@ -1,219 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you 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. - */ -package org.apache.zookeeper.graph; - -import java.io.ByteArrayInputStream; -import java.io.EOFException; -import java.io.FileInputStream; -import java.io.IOException; -import java.text.DateFormat; -import java.util.Date; -import java.util.zip.Adler32; -import java.util.zip.Checksum; -import java.util.HashMap; - -import org.apache.jute.BinaryInputArchive; -import org.apache.jute.InputArchive; -import org.apache.jute.Record; -import org.apache.zookeeper.server.TraceFormatter; -import org.apache.zookeeper.server.persistence.FileHeader; -import org.apache.zookeeper.server.persistence.FileTxnLog; -import org.apache.zookeeper.server.util.SerializeUtils; -import org.apache.zookeeper.txn.TxnHeader; - -import org.apache.zookeeper.ZooDefs.OpCode; - -import org.apache.zookeeper.txn.CreateSessionTxn; -import org.apache.zookeeper.txn.CreateTxn; -import org.apache.zookeeper.txn.DeleteTxn; -import org.apache.zookeeper.txn.ErrorTxn; -import org.apache.zookeeper.txn.SetACLTxn; -import org.apache.zookeeper.txn.SetDataTxn; -import org.apache.zookeeper.txn.TxnHeader; - -import java.io.Closeable; -import java.io.FileNotFoundException; -import java.util.Vector; -import java.util.Iterator; -import java.util.Collections; -import java.util.NoSuchElementException; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -public class MergedLogSource implements LogSource { - private static final Logger LOG = LoggerFactory.getLogger(MergedLogSource.class); - private Vector sources = null; - private long starttime = 0; - private long endtime = 0; - private long size = 0; - - public boolean overlapsRange(long starttime, long endtime) { - return (starttime <= this.endtime && endtime >= this.starttime); - } - - public long size() { return size; } - public long getStartTime() { return starttime; } - public long getEndTime() { return endtime; } - - private class MergedLogSourceIterator implements LogIterator { - private LogEntry next = null; - private long start = 0; - private long end = 0; - private MergedLogSource src = null; - private LogIterator[] sources = null; - private LogEntry[] nexts = null; - private FilterOp filter = null; - - public MergedLogSourceIterator(MergedLogSource src, long starttime, long endtime, FilterOp filter) throws IllegalArgumentException, FilterException { - Vector iters = new Vector(); - for (LogSource s : src.sources) { - if (s.overlapsRange(starttime, endtime)) { - iters.add(s.iterator(starttime, endtime, filter)); - } - } - - sources = new LogIterator[iters.size()]; - sources = iters.toArray(sources); - nexts = new LogEntry[iters.size()]; - for (int i = 0; i < sources.length; i++) { - if (sources[i].hasNext()) - nexts[i] = sources[i].next(); - } - this.filter = filter; - } - - public MergedLogSourceIterator(MergedLogSource src, long starttime, long endtime) throws IllegalArgumentException, FilterException { - this(src, starttime, endtime, null); - } - - public long size() throws IOException { - long size = 0; - for (LogIterator i : sources) { - size += i.size(); - } - return size; - } - - public boolean hasNext() { - for (LogEntry n : nexts) { - if (n != null) return true; - } - return false; - } - - public LogEntry next() { - int min = -1; - for (int i = 0; i < nexts.length; i++) { - if (nexts[i] != null) { - if (min == -1) { - min = i; - } else if (nexts[i].getTimestamp() < nexts[min].getTimestamp()) { - min = i; - } - } - } - if (min == -1) { - return null; - } else { - LogEntry e = nexts[min]; - nexts[min] = sources[min].next(); - return e; - } - } - - public void remove() throws UnsupportedOperationException { - throw new UnsupportedOperationException("remove not supported for Merged logs"); - } - - public void close() throws IOException { - for (LogIterator i : sources) { - i.close(); - } - } - } - - public LogIterator iterator(long starttime, long endtime) throws IllegalArgumentException { - try { - return iterator(starttime, endtime, null); - } catch (FilterException fe) { - assert(false); // shouldn't happen without filter - return null; - } - } - - public LogIterator iterator(long starttime, long endtime, FilterOp filter) throws IllegalArgumentException, FilterException { - // sanitise start and end times - if (endtime < starttime) { - throw new IllegalArgumentException("End time (" + endtime + ") must be greater or equal to starttime (" + starttime + ")"); - } - - return new MergedLogSourceIterator(this, starttime, endtime, filter); - } - - public LogIterator iterator() throws IllegalArgumentException { - return iterator(starttime, endtime+1); - } - - public MergedLogSource(String[] files) throws IOException { - sources = new Vector(); - for (String f : files) { - addSource(f); - } - } - - public void addSource(String f) throws IOException { - LogSource s = null; - if (TxnLogSource.isTransactionFile(f)) { - s = new TxnLogSource(f); - } else { - s = new Log4JSource(f); - } - - size += s.size(); - endtime = s.getEndTime() > endtime ? s.getEndTime() : endtime; - starttime = s.getStartTime() < starttime || starttime == 0 ? s.getStartTime() : starttime; - sources.add(s); - } - - public String toString() { - String s = "MergedLogSource(size=" + size + ", start=" + starttime + ", end=" + endtime +")"; - for (LogSource src : sources) { - s += "\n\t- " +src; - } - return s; - } - - public static void main(String[] args) throws IOException { - System.out.println("Time: " + System.currentTimeMillis()); - MergedLogSource s = new MergedLogSource(args); - System.out.println(s); - - LogIterator iter; - - iter = s.iterator(); - System.out.println("Time: " + System.currentTimeMillis()); - System.out.println("Iterator Size: " + iter.size()); - System.out.println("Time: " + System.currentTimeMillis()); - /* while (iter.hasNext()) { - System.out.println(iter.next()); - }*/ - iter.close(); - System.out.println("Time: " + System.currentTimeMillis()); - } -} diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/loggraph/src/java/org/apache/zookeeper/graph/RandomAccessFileReader.java b/pkg/registry/zookeeper-3.4.6/src/contrib/loggraph/src/java/org/apache/zookeeper/graph/RandomAccessFileReader.java deleted file mode 100644 index 827a8a7a0..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/contrib/loggraph/src/java/org/apache/zookeeper/graph/RandomAccessFileReader.java +++ /dev/null @@ -1,328 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you 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. - */ -package org.apache.zookeeper.graph; - -import java.io.File; -import java.io.Reader; -import java.io.IOException; -import java.io.EOFException; -import java.io.RandomAccessFile; -import java.io.FileNotFoundException; - -import java.io.DataInputStream; -import java.io.ByteArrayInputStream; -import java.io.DataInput; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -public class RandomAccessFileReader extends Reader implements DataInput { - private static final Logger LOG = LoggerFactory.getLogger(RandomAccessFileReader.class); - private RandomAccessFile file; - private byte[] buffer; - private int buffersize; - private int bufferoffset; - private long fileoffset; - private long fp; - - private static final int DEFAULT_BUFFER_SIZE = 512*1024; // 512k - private int point = 0; - - public RandomAccessFileReader(File f) throws FileNotFoundException { - file = new RandomAccessFile(f, "r"); - if (LOG.isDebugEnabled()) { - try { - LOG.debug("Opened file(" + f + ") with FD (" + file.getFD() + ")"); - } catch (IOException ioe) { - LOG.debug("Opened file(" + f + ") coulds get FD"); - } - } - - buffer = new byte[DEFAULT_BUFFER_SIZE]; - buffersize = 0; - bufferoffset = 0; - fileoffset = 0; - fp = 0; - } - - /** - fill the buffer from the file. - fp keeps track of the file pointer. - fileoffset is the offset into the file to where the buffer came from. - */ - private int fill() throws IOException { - fileoffset = fp; - int read = file.read(buffer, 0, buffer.length); - - if (LOG.isDebugEnabled()) { - String buf = new String(buffer, 0, 40, "UTF-8"); - LOG.debug("fill(buffer=" + buf + ")"); - } - - if (read == -1) { // eof reached - buffersize = 0; - } else { - buffersize = read; - } - fp += buffersize; - bufferoffset = 0; - - return buffersize; - } - - /** - * Reader interface - */ - public boolean markSupported() { return false; } - - /** - copy what we can from buffer. if it's not enough, fill buffer again and copy again - */ - synchronized public int read(char[] cbuf, int off, int len) throws IOException { - // This could be faster, but probably wont be used - byte[] b = new byte[2]; - int bytesread = 0; - while (len > 0) { - int read = read(b, 0, 2); - bytesread += read; - if (read < 2) { - return bytesread; - } - cbuf[off] = (char)((b[0] << 8) | (b[1] & 0xff)); - off += read; - len -= read; - } - - return bytesread; - } - - synchronized public int read(byte[] buf, int off, int len) throws IOException { - if (LOG.isTraceEnabled()) { - LOG.trace("read(buf, off=" + off + ", len=" + len); - } - - int read = 0; - while (len > 0) { - if (buffersize == 0) { - fill(); - if (buffersize == 0) { - break; - } - } - - int tocopy = Math.min(len, buffersize); - if (LOG.isTraceEnabled()) { - LOG.trace("tocopy=" + tocopy); - } - - System.arraycopy(buffer, bufferoffset, buf, off, tocopy); - buffersize -= tocopy; - bufferoffset += tocopy; - - len -= tocopy; - read += tocopy; - off += tocopy; - } - if (LOG.isTraceEnabled()) { - LOG.trace("read=" + read); - } - - return read; - } - - public void close() throws IOException { - file.close(); - } - - /** - * Seek interface - */ - public long getPosition() { - return bufferoffset + fileoffset; - } - - synchronized public void seek(long pos) throws IOException { - if (LOG.isDebugEnabled()) { - LOG.debug("seek(" + pos + ")"); - } - file.seek(pos); - fp = pos; - buffersize = 0; // force a buffer fill on next read - } - - /** - works like the usual readLine but disregards \r to make things easier - */ - synchronized public String readLine() throws IOException { - StringBuffer s = null; - - // go through buffer until i find a \n, if i reach end of buffer first, put whats in buffer into string buffer, - // repeat - buffering: - for (;;) { - if (buffersize == 0) { - fill(); - if (buffersize == 0) { - break; - } - } - - for (int i = 0; i < buffersize; i++) { - if (buffer[bufferoffset + i] == '\n') { - if (i > 0) { // if \n is first char in buffer, leave the string buffer empty - if (s == null) { s = new StringBuffer(); } - s.append(new String(buffer, bufferoffset, i, "UTF-8")); - } - bufferoffset += i+1; - buffersize -= i+1; - break buffering; - } - } - - // We didn't find \n, read the whole buffer into string buffer - if (s == null) { s = new StringBuffer(); } - s.append(new String(buffer, bufferoffset, buffersize, "UTF-8")); - buffersize = 0; - } - - if (s == null) { - return null; - } else { - return s.toString(); - } - } - - /** - DataInput interface - */ - public void readFully(byte[] b) throws IOException { - readFully(b, 0, b.length); - } - - public void readFully(byte[] b, int off, int len) throws IOException - { - while (len > 0) { - int read = read(b, off, len); - len -= read; - off += read; - - if (read == 0) { - throw new EOFException("End of file reached"); - } - } - } - - public int skipBytes(int n) throws IOException { - seek(getPosition() + n); - return n; - } - - public boolean readBoolean() throws IOException { - return (readByte() != 0); - } - - public byte readByte() throws IOException { - byte[] b = new byte[1]; - readFully(b, 0, 1); - return b[0]; - } - - public int readUnsignedByte() throws IOException { - return (int)readByte(); - } - - public short readShort() throws IOException { - byte[] b = new byte[2]; - readFully(b, 0, 2); - return (short)((b[0] << 8) | (b[1] & 0xff)); - } - - public int readUnsignedShort() throws IOException { - byte[] b = new byte[2]; - readFully(b, 0, 2); - return (((b[0] & 0xff) << 8) | (b[1] & 0xff)); - } - - public char readChar() throws IOException { - return (char)readShort(); - } - - public int readInt() throws IOException { - byte[] b = new byte[4]; - readFully(b, 0, 4); - return (((b[0] & 0xff) << 24) | ((b[1] & 0xff) << 16) | ((b[2] & 0xff) << 8) | (b[3] & 0xff)); - } - - public long readLong() throws IOException { - byte[] b = new byte[8]; - readFully(b, 0, 8); - - return (((long)(b[0] & 0xff) << 56) | ((long)(b[1] & 0xff) << 48) | - ((long)(b[2] & 0xff) << 40) | ((long)(b[3] & 0xff) << 32) | - ((long)(b[4] & 0xff) << 24) | ((long)(b[5] & 0xff) << 16) | - ((long)(b[6] & 0xff) << 8) | ((long)(b[7] & 0xff))); - } - - public float readFloat() throws IOException { - return Float.intBitsToFloat(readInt()); - } - - public double readDouble() throws IOException { - return Double.longBitsToDouble(readLong()); - } - - public String readUTF() throws IOException { - int len = readUnsignedShort(); - byte[] bytes = new byte[len+2]; - bytes[0] = (byte)((len >> 8) & 0xFF); - bytes[1] = (byte)(len & 0xFF); - readFully(bytes, 2, len); - DataInputStream dis = new DataInputStream(new ByteArrayInputStream(bytes)); - return dis.readUTF(); - } - - public static void main(String[] args) throws IOException { - RandomAccessFileReader f = new RandomAccessFileReader(new File(args[0])); - - long pos0 = f.getPosition(); - for (int i = 0; i < 5; i++) { - System.out.println(f.readLine()); - } - System.out.println("============="); - long pos1 = f.getPosition(); - System.out.println("pos: " + pos1); - for (int i = 0; i < 5; i++) { - System.out.println(f.readLine()); - } - System.out.println("============="); - f.seek(pos1); - for (int i = 0; i < 5; i++) { - System.out.println(f.readLine()); - } - System.out.println("============="); - f.seek(pos0); - for (int i = 0; i < 5; i++) { - System.out.println(f.readLine()); - } - long pos2 = f.getPosition(); - System.out.println("============="); - System.out.println(f.readLine()); - f.seek(pos2); - System.out.println(f.readLine()); - } -}; diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/loggraph/src/java/org/apache/zookeeper/graph/TransactionEntry.java b/pkg/registry/zookeeper-3.4.6/src/contrib/loggraph/src/java/org/apache/zookeeper/graph/TransactionEntry.java deleted file mode 100644 index 33c7189c1..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/contrib/loggraph/src/java/org/apache/zookeeper/graph/TransactionEntry.java +++ /dev/null @@ -1,59 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you 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. - */ -package org.apache.zookeeper.graph; - -public class TransactionEntry extends LogEntry { - public TransactionEntry(long timestamp, long clientId, long Cxid, long Zxid, String op) { - this(timestamp, clientId, Cxid, Zxid, op, ""); - } - - public TransactionEntry(long timestamp, long clientId, long Cxid, long Zxid, String op, String extra) { - super(timestamp); - setAttribute("client-id", new Long(clientId)); - setAttribute("cxid", new Long(Cxid)); - setAttribute("zxid", new Long(Zxid)); - setAttribute("operation", op); - setAttribute("extra", extra); - } - - public long getClientId() { - return (Long)getAttribute("client-id"); - } - - public long getCxid() { - return (Long)getAttribute("cxid"); - } - - public long getZxid() { - return (Long)getAttribute("zxid"); - } - - public String getOp() { - return (String)getAttribute("operation"); - } - - public String getExtra() { - return (String)getAttribute("extra"); - } - - public String toString() { - return getTimestamp() + ":::session(0x" + Long.toHexString(getClientId()) + ") cxid(0x" + Long.toHexString(getCxid()) + ") zxid(0x" + Long.toHexString(getZxid()) + ") op(" + getOp() + ") extra(" + getExtra() +")"; - } - - public Type getType() { return LogEntry.Type.TXN; } -} diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/loggraph/src/java/org/apache/zookeeper/graph/TxnLogSource.java b/pkg/registry/zookeeper-3.4.6/src/contrib/loggraph/src/java/org/apache/zookeeper/graph/TxnLogSource.java deleted file mode 100644 index 809c45513..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/contrib/loggraph/src/java/org/apache/zookeeper/graph/TxnLogSource.java +++ /dev/null @@ -1,376 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you 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. - */ -package org.apache.zookeeper.graph; - -import java.io.ByteArrayInputStream; -import java.io.EOFException; -import java.io.FileInputStream; -import java.io.IOException; -import java.text.DateFormat; -import java.util.Date; -import java.util.zip.Adler32; -import java.util.zip.Checksum; -import java.util.HashMap; - -import org.apache.jute.BinaryInputArchive; -import org.apache.jute.InputArchive; -import org.apache.jute.Record; -import org.apache.zookeeper.server.TraceFormatter; -import org.apache.zookeeper.server.persistence.FileHeader; -import org.apache.zookeeper.server.persistence.FileTxnLog; -import org.apache.zookeeper.server.util.SerializeUtils; -import org.apache.zookeeper.txn.TxnHeader; - -import org.apache.zookeeper.ZooDefs.OpCode; - -import org.apache.zookeeper.txn.CreateSessionTxn; -import org.apache.zookeeper.txn.CreateTxn; -import org.apache.zookeeper.txn.DeleteTxn; -import org.apache.zookeeper.txn.ErrorTxn; -import org.apache.zookeeper.txn.SetACLTxn; -import org.apache.zookeeper.txn.SetDataTxn; -import org.apache.zookeeper.txn.TxnHeader; - -import java.io.File; -import java.io.Closeable; -import java.io.FileNotFoundException; -import java.util.Iterator; -import java.util.NoSuchElementException; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -public class TxnLogSource implements LogSource { - private static final Logger LOG = LoggerFactory.getLogger(TxnLogSource.class); - - private LogSkipList skiplist = null; - private static final int skipN = 10000; - - private String file = null; - private long starttime = 0; - private long endtime = 0; - private long size = 0; - - public boolean overlapsRange(long starttime, long endtime) { - return (starttime <= this.endtime && endtime >= this.starttime); - } - - public long size() { return size; } - public long getStartTime() { return starttime; } - public long getEndTime() { return endtime; } - public LogSkipList getSkipList() { return skiplist; } - - public static boolean isTransactionFile(String file) throws IOException { - RandomAccessFileReader reader = new RandomAccessFileReader(new File(file)); - BinaryInputArchive logStream = new BinaryInputArchive(reader); - FileHeader fhdr = new FileHeader(); - fhdr.deserialize(logStream, "fileheader"); - reader.close(); - - return fhdr.getMagic() == FileTxnLog.TXNLOG_MAGIC; - } - - private class TxnLogSourceIterator implements LogIterator { - private LogEntry next = null; - private long starttime = 0; - private long endtime = 0; - private TxnLogSource src = null; - private RandomAccessFileReader reader = null; - private BinaryInputArchive logStream = null; - private long skippedAtStart = 0; - private FilterOp filter = null; - - public TxnLogSourceIterator(TxnLogSource src, long starttime, long endtime) throws IllegalArgumentException, FilterException { - this(src,starttime,endtime,null); - } - - public TxnLogSourceIterator(TxnLogSource src, long starttime, long endtime, FilterOp filter) throws IllegalArgumentException, FilterException { - try { - this.src = src; - this.starttime = starttime; - this.endtime = endtime; - reader = new RandomAccessFileReader(new File(src.file)); - logStream = new BinaryInputArchive(reader); - FileHeader fhdr = new FileHeader(); - fhdr.deserialize(logStream, "fileheader"); - } catch (Exception e) { - throw new IllegalArgumentException("Cannot open transaction log ("+src.file+") :" + e); - } - - LogSkipList.Mark start = src.getSkipList().findMarkBefore(starttime); - try { - reader.seek(start.getBytes()); - skippedAtStart = start.getEntriesSkipped(); - } catch (IOException ioe) { - // if we can't skip, we should just read from the start - } - - this.filter = filter; - - LogEntry e; - while ((e = readNextEntry()) != null && e.getTimestamp() < endtime) { - if (e.getTimestamp() >= starttime && (filter == null || filter.matches(e)) ) { - next = e; - return; - } - skippedAtStart++; - } - - - } - - public long size() throws IOException { - if (this.endtime >= src.getEndTime()) { - return src.size() - skippedAtStart; - } - - long pos = reader.getPosition(); - LogEntry e; - - LogSkipList.Mark lastseg = src.getSkipList().findMarkBefore(this.endtime); - reader.seek(lastseg.getBytes()); - // number of entries skipped to get to the end of the iterator, less the number skipped to get to the start - long count = lastseg.getEntriesSkipped() - skippedAtStart; - - while ((e = readNextEntry()) != null) { - if (e.getTimestamp() > this.endtime) { - break; - } - count++; - } - reader.seek(pos);; - - return count; - } - - private LogEntry readNextEntry() { - LogEntry e = null; - try { - long crcValue; - byte[] bytes; - try { - crcValue = logStream.readLong("crcvalue"); - - bytes = logStream.readBuffer("txnEntry"); - } catch (EOFException ex) { - return null; - } - - if (bytes.length == 0) { - return null; - } - Checksum crc = new Adler32(); - crc.update(bytes, 0, bytes.length); - if (crcValue != crc.getValue()) { - throw new IOException("CRC doesn't match " + crcValue + - " vs " + crc.getValue()); - } - TxnHeader hdr = new TxnHeader(); - Record r = SerializeUtils.deserializeTxn(bytes, hdr); - - switch (hdr.getType()) { - case OpCode.createSession: { - e = new TransactionEntry(hdr.getTime(), hdr.getClientId(), hdr.getCxid(), hdr.getZxid(), "createSession"); - } - break; - case OpCode.closeSession: { - e = new TransactionEntry(hdr.getTime(), hdr.getClientId(), hdr.getCxid(), hdr.getZxid(), "closeSession"); - } - break; - case OpCode.create: - if (r != null) { - CreateTxn create = (CreateTxn)r; - String path = create.getPath(); - e = new TransactionEntry(hdr.getTime(), hdr.getClientId(), hdr.getCxid(), hdr.getZxid(), "create", path); - } - break; - case OpCode.setData: - if (r != null) { - SetDataTxn set = (SetDataTxn)r; - String path = set.getPath(); - e = new TransactionEntry(hdr.getTime(), hdr.getClientId(), hdr.getCxid(), hdr.getZxid(), "setData", path); - } - break; - case OpCode.setACL: - if (r != null) { - SetACLTxn setacl = (SetACLTxn)r; - String path = setacl.getPath(); - e = new TransactionEntry(hdr.getTime(), hdr.getClientId(), hdr.getCxid(), hdr.getZxid(), "setACL", path); - } - break; - case OpCode.error: - if (r != null) { - ErrorTxn error = (ErrorTxn)r; - - e = new TransactionEntry(hdr.getTime(), hdr.getClientId(), hdr.getCxid(), hdr.getZxid(), "error", "Error: " + error.getErr()); - } - break; - default: - LOG.info("Unknown op: " + hdr.getType()); - break; - } - - if (logStream.readByte("EOR") != 'B') { - throw new EOFException("Last transaction was partial."); - } - } catch (Exception ex) { - LOG.error("Error reading transaction from (" + src.file + ") :" + e); - return null; - } - return e; - } - - public boolean hasNext() { - return next != null; - } - - public LogEntry next() throws NoSuchElementException { - LogEntry ret = next; - LogEntry e = readNextEntry(); - - if (filter != null) { - try { - while (e != null && !filter.matches(e)) { - e = readNextEntry(); - } - } catch (FilterException fe) { - throw new NoSuchElementException(fe.toString()); - } - } - if (e != null && e.getTimestamp() < endtime) { - next = e; - } else { - next = null; - } - return ret; - } - - public void remove() throws UnsupportedOperationException { - throw new UnsupportedOperationException("remove not supported for Txn logs"); - } - - public void close() throws IOException { - reader.close(); - } - } - - public LogIterator iterator(long starttime, long endtime) throws IllegalArgumentException { - try { - return iterator(starttime, endtime, null); - } catch (FilterException fe) { - assert(false); // should never ever happen - return null; - } - } - - public LogIterator iterator(long starttime, long endtime, FilterOp filter) throws IllegalArgumentException, FilterException { - // sanitise start and end times - if (endtime < starttime) { - throw new IllegalArgumentException("End time (" + endtime + ") must be greater or equal to starttime (" + starttime + ")"); - } - - return new TxnLogSourceIterator(this, starttime, endtime, filter); - } - - public LogIterator iterator() throws IllegalArgumentException { - return iterator(starttime, endtime+1); - } - - public TxnLogSource(String file) throws IOException { - this.file = file; - - skiplist = new LogSkipList(); - - RandomAccessFileReader reader = new RandomAccessFileReader(new File(file)); - try { - BinaryInputArchive logStream = new BinaryInputArchive(reader); - FileHeader fhdr = new FileHeader(); - fhdr.deserialize(logStream, "fileheader"); - - byte[] bytes = null; - while (true) { - long lastFp = reader.getPosition(); - - long crcValue; - - try { - crcValue = logStream.readLong("crcvalue"); - bytes = logStream.readBuffer("txnEntry"); - } catch (EOFException e) { - break; - } - - if (bytes.length == 0) { - break; - } - Checksum crc = new Adler32(); - crc.update(bytes, 0, bytes.length); - if (crcValue != crc.getValue()) { - throw new IOException("CRC doesn't match " + crcValue + - " vs " + crc.getValue()); - } - if (logStream.readByte("EOR") != 'B') { - throw new EOFException("Last transaction was partial."); - } - TxnHeader hdr = new TxnHeader(); - Record r = SerializeUtils.deserializeTxn(bytes, hdr); - - if (starttime == 0) { - starttime = hdr.getTime(); - } - endtime = hdr.getTime(); - - if (size % skipN == 0) { - skiplist.addMark(hdr.getTime(), lastFp, size); - } - size++; - } - if (bytes == null) { - throw new IOException("Nothing read from ("+file+")"); - } - } finally { - reader.close(); - } - } - - public String toString() { - return "TxnLogSource(file=" + file + ", size=" + size + ", start=" + starttime + ", end=" + endtime +")"; - } - - public static void main(String[] args) throws IOException, FilterException { - TxnLogSource s = new TxnLogSource(args[0]); - System.out.println(s); - - LogIterator iter; - - if (args.length == 3) { - long starttime = Long.valueOf(args[1]); - long endtime = Long.valueOf(args[2]); - FilterOp fo = new FilterParser("(or (and (> zxid 0x2f0bd6f5e0) (< zxid 0x2f0bd6f5e9)) (= operation \"error\"))").parse(); - System.out.println("fo: " + fo); - iter = s.iterator(starttime, endtime, fo); - } else { - iter = s.iterator(); - } - System.out.println(iter); - while (iter.hasNext()) { - System.out.println(iter.next()); - } - iter.close(); - } -} diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/loggraph/src/java/org/apache/zookeeper/graph/filterops/AndOp.java b/pkg/registry/zookeeper-3.4.6/src/contrib/loggraph/src/java/org/apache/zookeeper/graph/filterops/AndOp.java deleted file mode 100644 index 581bdaacc..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/contrib/loggraph/src/java/org/apache/zookeeper/graph/filterops/AndOp.java +++ /dev/null @@ -1,33 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you 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. - */ -package org.apache.zookeeper.graph.filterops; - -import org.apache.zookeeper.graph.LogEntry; -import org.apache.zookeeper.graph.FilterOp; -import org.apache.zookeeper.graph.FilterException; - -public class AndOp extends FilterOp { - public boolean matches(LogEntry entry) throws FilterException { - for (FilterOp f : subOps) { - if (!f.matches(entry)) { - return false; - } - } - return true; - } -} diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/loggraph/src/java/org/apache/zookeeper/graph/filterops/Arg.java b/pkg/registry/zookeeper-3.4.6/src/contrib/loggraph/src/java/org/apache/zookeeper/graph/filterops/Arg.java deleted file mode 100644 index 4fda3cf7d..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/contrib/loggraph/src/java/org/apache/zookeeper/graph/filterops/Arg.java +++ /dev/null @@ -1,36 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you 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. - */ -package org.apache.zookeeper.graph.filterops; - -import org.apache.zookeeper.graph.FilterOp.*; - -public class Arg { - private ArgType type; - protected T value; - - protected Arg(ArgType type) { - this.type = type; - } - - public ArgType getType() { return type; } - public T getValue() { return value; } - - public String toString() { - return "[" + type + ":" + value + "]"; - } -} diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/loggraph/src/java/org/apache/zookeeper/graph/filterops/EqualsOp.java b/pkg/registry/zookeeper-3.4.6/src/contrib/loggraph/src/java/org/apache/zookeeper/graph/filterops/EqualsOp.java deleted file mode 100644 index 409815af2..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/contrib/loggraph/src/java/org/apache/zookeeper/graph/filterops/EqualsOp.java +++ /dev/null @@ -1,44 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you 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. - */ -package org.apache.zookeeper.graph.filterops; - -import org.apache.zookeeper.graph.LogEntry; -import org.apache.zookeeper.graph.FilterOp; -import org.apache.zookeeper.graph.FilterException; - -public class EqualsOp extends FilterOp { - public boolean matches(LogEntry entry) throws FilterException { - - Object last = null; - for (Arg a : args) { - Object v = a.getValue(); - if (a.getType() == FilterOp.ArgType.SYMBOL) { - String key = (String)a.getValue(); - v = entry.getAttribute(key); - } - - if (last != null - && !last.equals(v)) { - return false; - } - last = v; - } - - return true; - } -} diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/loggraph/src/java/org/apache/zookeeper/graph/filterops/GreaterThanOp.java b/pkg/registry/zookeeper-3.4.6/src/contrib/loggraph/src/java/org/apache/zookeeper/graph/filterops/GreaterThanOp.java deleted file mode 100644 index 244dd3dab..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/contrib/loggraph/src/java/org/apache/zookeeper/graph/filterops/GreaterThanOp.java +++ /dev/null @@ -1,70 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you 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. - */ -package org.apache.zookeeper.graph.filterops; - -import org.apache.zookeeper.graph.LogEntry; -import org.apache.zookeeper.graph.FilterOp; -import org.apache.zookeeper.graph.FilterException; - -public class GreaterThanOp extends FilterOp { - public boolean matches(LogEntry entry) throws FilterException { - Arg first = args.get(0); - - if (first != null) { - FilterOp.ArgType type = first.getType(); - if (type == FilterOp.ArgType.SYMBOL) { - String key = (String)first.getValue(); - Object v = entry.getAttribute(key); - if (v instanceof String) { - type = FilterOp.ArgType.STRING; - } else if (v instanceof Double || v instanceof Long || v instanceof Integer || v instanceof Short) { - type = FilterOp.ArgType.NUMBER; - } else { - throw new FilterException("LessThanOp: Invalid argument, first argument resolves to neither a String nor a Number"); - } - } - - Object last = null; - for (Arg a : args) { - Object v = a.getValue(); - if (a.getType() == FilterOp.ArgType.SYMBOL) { - String key = (String)a.getValue(); - v = entry.getAttribute(key); - } - - if (last != null) { - if (type == FilterOp.ArgType.STRING) { - if (((String)last).compareTo((String)v) <= 0) { - return false; - } - } else if (type == FilterOp.ArgType.NUMBER) { - // System.out.println("last[" + ((Number)last).longValue() + "] v["+ ((Number)v).longValue() + "]"); - if (((Number)last).longValue() <= ((Number)v).longValue()) { - return false; - } - } - } - last = v; - } - return true; - } else { - return true; - } - } - -} diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/loggraph/src/java/org/apache/zookeeper/graph/filterops/LessThanOp.java b/pkg/registry/zookeeper-3.4.6/src/contrib/loggraph/src/java/org/apache/zookeeper/graph/filterops/LessThanOp.java deleted file mode 100644 index b7d9e09ac..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/contrib/loggraph/src/java/org/apache/zookeeper/graph/filterops/LessThanOp.java +++ /dev/null @@ -1,69 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you 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. - */ -package org.apache.zookeeper.graph.filterops; - -import org.apache.zookeeper.graph.LogEntry; -import org.apache.zookeeper.graph.FilterOp; -import org.apache.zookeeper.graph.FilterException; - -public class LessThanOp extends FilterOp { - public boolean matches(LogEntry entry) throws FilterException { - Arg first = args.get(0); - - if (first != null) { - FilterOp.ArgType type = first.getType(); - if (type == FilterOp.ArgType.SYMBOL) { - String key = (String)first.getValue(); - Object v = entry.getAttribute(key); - if (v instanceof String) { - type = FilterOp.ArgType.STRING; - } else if (v instanceof Double || v instanceof Long || v instanceof Integer || v instanceof Short) { - type = FilterOp.ArgType.NUMBER; - } else { - throw new FilterException("LessThanOp: Invalid argument, first argument resolves to neither a String nor a Number"); - } - } - - Object last = null; - for (Arg a : args) { - Object v = a.getValue(); - if (a.getType() == FilterOp.ArgType.SYMBOL) { - String key = (String)a.getValue(); - v = entry.getAttribute(key); - } - - if (last != null) { - if (type == FilterOp.ArgType.STRING) { - if (((String)last).compareTo((String)v) >= 0) { - return false; - } - } else if (type == FilterOp.ArgType.NUMBER) { - if (((Number)last).doubleValue() >= ((Number)v).doubleValue()) { - return false; - } - } - } - last = v; - } - return true; - } else { - return true; - } - } - -} diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/loggraph/src/java/org/apache/zookeeper/graph/filterops/NotOp.java b/pkg/registry/zookeeper-3.4.6/src/contrib/loggraph/src/java/org/apache/zookeeper/graph/filterops/NotOp.java deleted file mode 100644 index d8ed7573f..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/contrib/loggraph/src/java/org/apache/zookeeper/graph/filterops/NotOp.java +++ /dev/null @@ -1,31 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you 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. - */ -package org.apache.zookeeper.graph.filterops; - -import org.apache.zookeeper.graph.LogEntry; -import org.apache.zookeeper.graph.FilterOp; -import org.apache.zookeeper.graph.FilterException; - -public class NotOp extends FilterOp { - public boolean matches(LogEntry entry) throws FilterException { - if (subOps.size() != 1) { - throw new FilterException("Not operation can only take one argument"); - } - return !subOps.get(0).matches(entry); - } -} diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/loggraph/src/java/org/apache/zookeeper/graph/filterops/NumberArg.java b/pkg/registry/zookeeper-3.4.6/src/contrib/loggraph/src/java/org/apache/zookeeper/graph/filterops/NumberArg.java deleted file mode 100644 index d6b584d85..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/contrib/loggraph/src/java/org/apache/zookeeper/graph/filterops/NumberArg.java +++ /dev/null @@ -1,28 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you 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. - */ -package org.apache.zookeeper.graph.filterops; - -import org.apache.zookeeper.graph.FilterOp.*; - -public class NumberArg extends Arg { - public NumberArg(Long value) { - super(ArgType.NUMBER); - this.value = value; - } -}; - diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/loggraph/src/java/org/apache/zookeeper/graph/filterops/OrOp.java b/pkg/registry/zookeeper-3.4.6/src/contrib/loggraph/src/java/org/apache/zookeeper/graph/filterops/OrOp.java deleted file mode 100644 index d6815894a..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/contrib/loggraph/src/java/org/apache/zookeeper/graph/filterops/OrOp.java +++ /dev/null @@ -1,33 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you 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. - */ -package org.apache.zookeeper.graph.filterops; - -import org.apache.zookeeper.graph.LogEntry; -import org.apache.zookeeper.graph.FilterOp; -import org.apache.zookeeper.graph.FilterException; - -public class OrOp extends FilterOp { - public boolean matches(LogEntry entry) throws FilterException { - for (FilterOp f : subOps) { - if (f.matches(entry)) { - return true; - } - } - return false; - } -} diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/loggraph/src/java/org/apache/zookeeper/graph/filterops/StringArg.java b/pkg/registry/zookeeper-3.4.6/src/contrib/loggraph/src/java/org/apache/zookeeper/graph/filterops/StringArg.java deleted file mode 100644 index 7345d3cc0..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/contrib/loggraph/src/java/org/apache/zookeeper/graph/filterops/StringArg.java +++ /dev/null @@ -1,28 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you 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. - */ -package org.apache.zookeeper.graph.filterops; - -import org.apache.zookeeper.graph.FilterOp.*; - -public class StringArg extends Arg { - public StringArg(String value) { - super(ArgType.STRING); - this.value = value; - } -}; - diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/loggraph/src/java/org/apache/zookeeper/graph/filterops/SymbolArg.java b/pkg/registry/zookeeper-3.4.6/src/contrib/loggraph/src/java/org/apache/zookeeper/graph/filterops/SymbolArg.java deleted file mode 100644 index 077553b1f..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/contrib/loggraph/src/java/org/apache/zookeeper/graph/filterops/SymbolArg.java +++ /dev/null @@ -1,27 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you 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. - */ -package org.apache.zookeeper.graph.filterops; - -import org.apache.zookeeper.graph.FilterOp.*; - -public class SymbolArg extends Arg { - public SymbolArg(String value) { - super(ArgType.SYMBOL); - this.value = value; - } -}; diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/loggraph/src/java/org/apache/zookeeper/graph/filterops/XorOp.java b/pkg/registry/zookeeper-3.4.6/src/contrib/loggraph/src/java/org/apache/zookeeper/graph/filterops/XorOp.java deleted file mode 100644 index 9e778b199..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/contrib/loggraph/src/java/org/apache/zookeeper/graph/filterops/XorOp.java +++ /dev/null @@ -1,40 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you 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. - */ -package org.apache.zookeeper.graph.filterops; - -import org.apache.zookeeper.graph.LogEntry; -import org.apache.zookeeper.graph.FilterOp; -import org.apache.zookeeper.graph.FilterException; - -public class XorOp extends FilterOp { - public boolean matches(LogEntry entry) throws FilterException { - int count = 0; - for (FilterOp f : subOps) { - if (f.matches(entry)) { - count++; - if (count > 1) { - return false; - } - } - } - if (count == 1) { - return true; - } - return false; - } -} diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/loggraph/src/java/org/apache/zookeeper/graph/servlets/FileLoader.java b/pkg/registry/zookeeper-3.4.6/src/contrib/loggraph/src/java/org/apache/zookeeper/graph/servlets/FileLoader.java deleted file mode 100644 index 67e89454a..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/contrib/loggraph/src/java/org/apache/zookeeper/graph/servlets/FileLoader.java +++ /dev/null @@ -1,60 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you 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. - */ -package org.apache.zookeeper.graph.servlets; - -import java.io.File; -import java.io.IOException; -import java.io.FileNotFoundException; - -import javax.servlet.ServletException; -import javax.servlet.http.HttpServlet; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; - -import org.json.simple.JSONArray; -import org.json.simple.JSONObject; -import org.json.simple.JSONValue; - -import org.apache.zookeeper.graph.*; - -public class FileLoader extends JsonServlet -{ - private MergedLogSource source = null; - - public FileLoader(MergedLogSource src) throws Exception { - source = src; - } - - String handleRequest(JsonRequest request) throws Exception - { - String output = ""; - - String file = request.getString("path", "/"); - JSONObject o = new JSONObject(); - try { - this.source.addSource(file); - o.put("status", "OK"); - - } catch (Exception e) { - o.put("status", "ERR"); - o.put("error", e.toString()); - } - - return JSONValue.toJSONString(o); - } -} diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/loggraph/src/java/org/apache/zookeeper/graph/servlets/Fs.java b/pkg/registry/zookeeper-3.4.6/src/contrib/loggraph/src/java/org/apache/zookeeper/graph/servlets/Fs.java deleted file mode 100644 index e5b1a0133..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/contrib/loggraph/src/java/org/apache/zookeeper/graph/servlets/Fs.java +++ /dev/null @@ -1,69 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you 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. - */ -package org.apache.zookeeper.graph.servlets; - -import java.io.File; -import java.io.IOException; -import java.io.FileNotFoundException; - -import javax.servlet.ServletException; -import javax.servlet.http.HttpServlet; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; - -import org.json.simple.JSONArray; -import org.json.simple.JSONObject; -import org.json.simple.JSONValue; -import java.util.Arrays; -import java.util.Comparator; - -public class Fs extends JsonServlet -{ - String handleRequest(JsonRequest request) throws Exception - { - String output = ""; - JSONArray filelist = new JSONArray(); - - File base = new File(request.getString("path", "/")); - if (!base.exists() || !base.isDirectory()) { - throw new FileNotFoundException("Couldn't find [" + request + "]"); - } - File[] files = base.listFiles(); - Arrays.sort(files, new Comparator() { - public int compare(File o1, File o2) { - if (o1.isDirectory() != o2.isDirectory()) { - if (o1.isDirectory()) { - return -1; - } else { - return 1; - } - } - return o1.getName().compareToIgnoreCase(o2.getName()); - } - }); - - for (File f : files) { - JSONObject o = new JSONObject(); - o.put("file", f.getName()); - o.put("type", f.isDirectory() ? "D" : "F"); - o.put("path", f.getCanonicalPath()); - filelist.add(o); - } - return JSONValue.toJSONString(filelist); - } -} diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/loggraph/src/java/org/apache/zookeeper/graph/servlets/GraphData.java b/pkg/registry/zookeeper-3.4.6/src/contrib/loggraph/src/java/org/apache/zookeeper/graph/servlets/GraphData.java deleted file mode 100644 index fc10eb1a3..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/contrib/loggraph/src/java/org/apache/zookeeper/graph/servlets/GraphData.java +++ /dev/null @@ -1,85 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you 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. - */ -package org.apache.zookeeper.graph.servlets; - -import java.io.File; -import java.io.IOException; -import java.io.FileNotFoundException; - -import javax.servlet.ServletException; -import javax.servlet.http.HttpServlet; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; - -import java.util.regex.Pattern; -import java.util.regex.Matcher; - -import org.json.simple.JSONArray; -import org.json.simple.JSONObject; -import org.json.simple.JSONValue; - -import org.apache.zookeeper.graph.*; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -public class GraphData extends JsonServlet -{ - private static final Logger LOG = LoggerFactory.getLogger(GraphData.class); - private static final int DEFAULT_PERIOD = 1000; - - private LogSource source = null; - - public GraphData(LogSource src) throws Exception { - this.source = src; - } - - String handleRequest(JsonRequest request) throws Exception { - - - long starttime = 0; - long endtime = 0; - long period = 0; - FilterOp fo = null; - - starttime = request.getNumber("start", 0); - endtime = request.getNumber("end", 0); - period = request.getNumber("period", 0); - String filterstr = request.getString("filter", ""); - - if (filterstr.length() > 0) { - fo = new FilterParser(filterstr).parse(); - } - - if (starttime == 0) { starttime = source.getStartTime(); } - if (endtime == 0) { - if (period > 0) { - endtime = starttime + period; - } else { - endtime = starttime + DEFAULT_PERIOD; - } - } - - if (LOG.isDebugEnabled()) { - LOG.debug("handle(start= " + starttime + ", end=" + endtime + ", period=" + period + ")"); - } - - LogIterator iterator = (fo != null) ? - source.iterator(starttime, endtime, fo) : source.iterator(starttime, endtime); - return new JsonGenerator(iterator).toString(); - } -} diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/loggraph/src/java/org/apache/zookeeper/graph/servlets/JsonServlet.java b/pkg/registry/zookeeper-3.4.6/src/contrib/loggraph/src/java/org/apache/zookeeper/graph/servlets/JsonServlet.java deleted file mode 100644 index 910d44f4e..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/contrib/loggraph/src/java/org/apache/zookeeper/graph/servlets/JsonServlet.java +++ /dev/null @@ -1,85 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you 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. - */ -package org.apache.zookeeper.graph.servlets; - -import java.io.IOException; - -import javax.servlet.ServletException; -import javax.servlet.ServletRequest; -import javax.servlet.http.HttpServlet; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; - -import org.json.simple.JSONObject; -import org.json.simple.JSONValue; - -import java.util.Map; - -abstract public class JsonServlet extends HttpServlet { - abstract String handleRequest(JsonRequest request) throws Exception; - - protected class JsonRequest { - private Map map; - - public JsonRequest(ServletRequest request) { - map = request.getParameterMap(); - } - - public long getNumber(String name, long defaultnum) { - String[] vals = (String[])map.get(name); - if (vals == null || vals.length == 0) { - return defaultnum; - } - - try { - return Long.valueOf(vals[0]); - } catch (NumberFormatException e) { - return defaultnum; - } - } - - public String getString(String name, String defaultstr) { - String[] vals = (String[])map.get(name); - if (vals == null || vals.length == 0) { - return defaultstr; - } else { - return vals[0]; - } - } - } - - protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException - { - response.setContentType("text/plain;charset=utf-8"); - response.setStatus(HttpServletResponse.SC_OK); - - try { - String req = request.getRequestURI().substring(request.getServletPath().length()); - - response.getWriter().println(handleRequest(new JsonRequest(request))); - } catch (Exception e) { - JSONObject o = new JSONObject(); - o.put("error", e.toString()); - response.getWriter().println(JSONValue.toJSONString(o)); - } catch (java.lang.OutOfMemoryError oom) { - JSONObject o = new JSONObject(); - o.put("error", "Out of memory. Perhaps you've requested too many logs. Try narrowing you're filter criteria."); - response.getWriter().println(JSONValue.toJSONString(o)); - } - } -} diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/loggraph/src/java/org/apache/zookeeper/graph/servlets/NumEvents.java b/pkg/registry/zookeeper-3.4.6/src/contrib/loggraph/src/java/org/apache/zookeeper/graph/servlets/NumEvents.java deleted file mode 100644 index ed4694581..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/contrib/loggraph/src/java/org/apache/zookeeper/graph/servlets/NumEvents.java +++ /dev/null @@ -1,87 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you 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. - */ -package org.apache.zookeeper.graph.servlets; - -import java.io.File; -import java.io.IOException; -import java.io.FileNotFoundException; - -import javax.servlet.ServletException; -import javax.servlet.http.HttpServlet; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; - -import org.json.simple.JSONArray; -import org.json.simple.JSONObject; -import org.json.simple.JSONValue; - -import java.util.regex.Pattern; -import java.util.regex.Matcher; - -import org.apache.zookeeper.graph.*; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - - -public class NumEvents extends JsonServlet -{ - private static final Logger LOG = LoggerFactory.getLogger(NumEvents.class); - private static final int DEFAULT_PERIOD = 1000; - - private LogSource source = null; - - public NumEvents(LogSource src) throws Exception { - this.source = src; - } - - String handleRequest(JsonRequest request) throws Exception { - String output = ""; - - long starttime = 0; - long endtime = 0; - long period = 0; - - starttime = request.getNumber("start", 0); - endtime = request.getNumber("end", 0); - period = request.getNumber("period", 0); - - if (starttime == 0) { starttime = source.getStartTime(); } - if (endtime == 0) { - if (period > 0) { - endtime = starttime + period; - } else { - endtime = source.getEndTime(); - } - } - - LogIterator iter = source.iterator(starttime, endtime); - JSONObject data = new JSONObject(); - data.put("startTime", starttime); - data.put("endTime", endtime); - long size = 0; - - size = iter.size(); - - data.put("numEntries", size); - if (LOG.isDebugEnabled()) { - LOG.debug("handle(start= " + starttime + ", end=" + endtime + ", numEntries=" + size +")"); - } - return JSONValue.toJSONString(data); - } -} - diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/loggraph/src/java/org/apache/zookeeper/graph/servlets/StaticContent.java b/pkg/registry/zookeeper-3.4.6/src/contrib/loggraph/src/java/org/apache/zookeeper/graph/servlets/StaticContent.java deleted file mode 100644 index 4af78959a..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/contrib/loggraph/src/java/org/apache/zookeeper/graph/servlets/StaticContent.java +++ /dev/null @@ -1,50 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you 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. - */ -package org.apache.zookeeper.graph.servlets; - -import java.io.InputStream; -import java.io.InputStreamReader; -import java.io.BufferedReader; - -import java.io.IOException; - -import javax.servlet.ServletException; -import javax.servlet.http.HttpServlet; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; - -public class StaticContent extends HttpServlet { - protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException - { - String path = request.getRequestURI().substring(request.getServletPath().length()); - - InputStream resource = ClassLoader.getSystemResourceAsStream("org/apache/zookeeper/graph/resources" + path); - if (resource == null) { - response.getWriter().println(path + " not found!"); - response.setStatus(HttpServletResponse.SC_NOT_FOUND); - return; - } - - while (resource.available() > 0) { - response.getWriter().write(resource.read()); - } - // response.setContentType("text/plain;charset=utf-8"); - response.setStatus(HttpServletResponse.SC_OK); - } - -} diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/loggraph/src/java/org/apache/zookeeper/graph/servlets/Throughput.java b/pkg/registry/zookeeper-3.4.6/src/contrib/loggraph/src/java/org/apache/zookeeper/graph/servlets/Throughput.java deleted file mode 100644 index 341bf9e6a..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/contrib/loggraph/src/java/org/apache/zookeeper/graph/servlets/Throughput.java +++ /dev/null @@ -1,125 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you 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. - */ -package org.apache.zookeeper.graph.servlets; - -import java.io.IOException; -import java.io.BufferedOutputStream; -import java.io.FileOutputStream; -import java.io.DataOutputStream; -import java.io.PrintStream; - -import java.util.HashSet; -import java.util.LinkedHashMap; - -import org.apache.zookeeper.graph.*; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import org.json.simple.JSONArray; -import org.json.simple.JSONObject; -import org.json.simple.JSONValue; - - -public class Throughput extends JsonServlet -{ - private static final int MS_PER_SEC = 1000; - private static final int MS_PER_MIN = MS_PER_SEC*60; - private static final int MS_PER_HOUR = MS_PER_MIN*60; - - private LogSource source = null; - - public Throughput(LogSource src) throws Exception { - this.source = src; - } - - public String handleRequest(JsonRequest request) throws Exception { - long starttime = 0; - long endtime = 0; - long period = 0; - long scale = 0; - - starttime = request.getNumber("start", 0); - endtime = request.getNumber("end", 0); - period = request.getNumber("period", 0); - - - if (starttime == 0) { starttime = source.getStartTime(); } - if (endtime == 0) { - if (period > 0) { - endtime = starttime + period; - } else { - endtime = source.getEndTime(); - } - } - - String scalestr = request.getString("scale", "minutes"); - if (scalestr.equals("seconds")) { - scale = MS_PER_SEC; - } else if (scalestr.equals("hours")) { - scale = MS_PER_HOUR; - } else { - scale = MS_PER_MIN; - } - - LogIterator iter = source.iterator(starttime, endtime); - - long current = 0; - long currentms = 0; - HashSet zxids_ms = new HashSet(); - long zxidcount = 0; - - JSONArray events = new JSONArray(); - while (iter.hasNext()) { - LogEntry e = iter.next(); - if (e.getType() != LogEntry.Type.TXN) { - continue; - } - - TransactionEntry cxn = (TransactionEntry)e; - - long ms = cxn.getTimestamp(); - long inscale = ms/scale; - - if (currentms != ms && currentms != 0) { - zxidcount += zxids_ms.size(); - zxids_ms.clear(); - } - - if (inscale != current && current != 0) { - JSONObject o = new JSONObject(); - o.put("time", current*scale); - o.put("count", zxidcount); - events.add(o); - zxidcount = 0; - } - current = inscale; - currentms = ms; - - zxids_ms.add(cxn.getZxid()); - } - JSONObject o = new JSONObject(); - o.put("time", current*scale); - o.put("count", zxidcount); - events.add(o); - - iter.close(); - - return JSONValue.toJSONString(events); - } - -}; diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/loggraph/web/org/apache/zookeeper/graph/log4j.properties b/pkg/registry/zookeeper-3.4.6/src/contrib/loggraph/web/org/apache/zookeeper/graph/log4j.properties deleted file mode 100644 index ab8960b0e..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/contrib/loggraph/web/org/apache/zookeeper/graph/log4j.properties +++ /dev/null @@ -1,11 +0,0 @@ -log4j.rootLogger=TRACE, CONSOLE - -# Print the date in ISO 8601 format -log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender -log4j.appender.CONSOLE.Threshold=TRACE -log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout -log4j.appender.CONSOLE.layout.ConversionPattern=%d{ISO8601} - %-5p [%t:%C{1}@%L] - %m%n - -log4j.logger.org.apache.zookeeper.graph.LogSkipList=off -log4j.logger.org.apache.zookeeper.graph.RandomAccessFileReader=off -#log4j.logger.org.apache.zookeeper.graph.Log4JSource=off \ No newline at end of file diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/loggraph/web/org/apache/zookeeper/graph/resources/load-big.gif b/pkg/registry/zookeeper-3.4.6/src/contrib/loggraph/web/org/apache/zookeeper/graph/resources/load-big.gif deleted file mode 100644 index ddb7ff1aac1b2fc825667c157873c2c55bbe8db8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1924 zcmciDX;70#00!U)Urs41ND>$3-?7cZa-C@o`?~}E+$na_sVK~an51Y7o6Am#OJGNBi-|v-0K)zTz!9cZZmYYj zeiQ^4Hx2}<@9us*(zz1hB8-YDCx|yPvMXzQM{_K$!h*iJ(7x2j*bY>E)v;gG zt15c?^oIWX1BxEuJ?E}-N%%X2$C&X)nYafzWBB27BZK9$hH1k@-(v5=%efcJKAYA8 zj{X%G-GGGnp>xBKmtR{qyXkbXi>i|w&^A+i%*o~apB=fnp1EvhyA8i)zT0!ZJK|=f zGujFu=8Q?f@YHB=vJ&Q(Q2ooMB$CxnsQ@;Cl88SakbL=c9-bR}Cd`4o_e-(kkx-G` z1gxmM5nm)f#c{~lR_t33s5hr)1~uEaw)kjKO}BP*)>VmXx>RQ1;1H?TbtLMnaSW#; zj9+XgO*q{nKEpjQb`O`&-Jk8B)-S0R`xoZlkUo^CY4otNIEG*Z>9xBj^;cd~XE!if z=JK3SR%Kh!+&qgwp0nLox=TA*jYs?se%u2xUeoK&1u^$dFrFz~jrhLs@UeBBdpx|M zY)D3CZeBjWKwtxdli{#JJ47_Xo<)bn10rN1&s7)?M_u%xDH4!1ac=bhs)DA9u4+yx zQz*rfNSWBSxTLdtwZlQ%QWxV{Y9-?#zL7M}ttCzze@xWkN1wM3@#hRCqG74qOeC&J z9C^RRzb6jvbS)W0Nd^=G0Xde#v6Z!xx5H+VUZrNmDp2GD$ZAyrrw%!G2FskYEUNL97Eu}MQR$IyrnBkg(h1rW4yIQEM3J@S3&;1KqjvtHc)u##|B-p#vH)WPhuYi^mQjj0C~N7S!=n7H-h z)-{F0|AmmcM>roo8TLt*J%^c#&ZiY1FVl9S>(#+iza>x4q)s+Z@gD1* z@P^eR(w@FoxHWz6T{O`R|GvS0@PW)Hmm#QRgaoFdRCosCuGa!^PcBA73HQUcl65Dr zO|`ePK2pY_S=Cuk0cLN5NYeIMmj@%E-?ilgU&#f%3S_8AdaDu z`F^)`6_9BI%cf+|5|L?q0A9#NmQZLMl$0#@LkamJueh-M5`ik%{!(^MZk{k*qitzz zdsl7?nA3Imb6iI@->x5 zwXc~EZZLz-aKH4hJ%XN<9U8*$f;BXGrEQ^o=8paJ`*iQfV=)}tj7M$B9-E(t0}WI5 ziiH<<@gb})LXWcd=N1SGi;6?d9SD)&II^XLelX2e#DZKujgFz0`cy~Oo<~(uRW#l% zG_=kVdRXZIt%P()d)_@2TRL5aa4qGGD&I4tJNR+p1a_1(jW-f!2MXqTpXs0WExsHx Pn1F;$An(;T&^-PCGf5vc diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/loggraph/web/org/apache/zookeeper/graph/resources/load.gif b/pkg/registry/zookeeper-3.4.6/src/contrib/loggraph/web/org/apache/zookeeper/graph/resources/load.gif deleted file mode 100644 index d0bce1542342e912da81a2c260562df172f30d73..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 673 zcmZ?wbhEHb6krfw_{6~Q|Nnmm28Kh24mmkF0U1e2Nli^nlO|14{Lk&@8WQa67~pE8 zXTZz|lvDgC+Z`3#dv5h=E26FfcG1 zbL_hF&)}42ws10s6^G;;cE1^EoUR)U5A70}d2pLv!jVIT7j&Z~EblI3x0K*v_sV|m z0kj3v921Z^em#l`(k(o@H$3ZdDRc@9NidXDNbqrumReCGv$gd8+e8WW28HVqkJ_9i zH>s*<31KtHjANIPvi2#*6BEu%3Dak5O_t&NBI)H?V$TxT}#l{vOTn5naXTfF^&~Hhq+NX@#Ccc>y7T?;vjI&jdhsDsPJyAw*m0Qz>i}K7# zL9w50Ng{fT}A5JUe8lRK1h7_Y2;BWJDd=c6f&i?Wv5(5q?6|P zQw{>maxZP<537OA37Uk}7@%_$4o$EWe_Zl>&#id|lE-BpDC#+Fn|msJ%_2h{Hg1vP z#N8WAzfWasG}yq|xqE)DrWaOofX=z|?*pgc%{ig5vl!pqDlC|q&~Z0$&Rvsft&VO- z4MZj+%-+Vx%W}v;V76hyp=;+R;x+~t^Q%*xuFTQAF2})fSfTHDAs>sO!OBw`)&)o$ c0!CNZt))x~rAZP^^P&YOFfdqy5)K#u0POD40{{R3 diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/loggraph/web/org/apache/zookeeper/graph/resources/main.html b/pkg/registry/zookeeper-3.4.6/src/contrib/loggraph/web/org/apache/zookeeper/graph/resources/main.html deleted file mode 100644 index b9affe665..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/contrib/loggraph/web/org/apache/zookeeper/graph/resources/main.html +++ /dev/null @@ -1,60 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - -
      - Edit Filters - Add logs -
      -
      - Log view - Servers view - Sessions view - Statistics -
      -
      -
      -
      -
      - - diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/monitoring/JMX-RESOURCES b/pkg/registry/zookeeper-3.4.6/src/contrib/monitoring/JMX-RESOURCES deleted file mode 100644 index 1d1aa98fe..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/contrib/monitoring/JMX-RESOURCES +++ /dev/null @@ -1,38 +0,0 @@ - -Resources for monitoring ZooKeeper using JMX --------------------------------------------- - -JMX/REST Bridge ---------------- - -http://code.google.com/p/polarrose-jmx-rest-bridge/ - -"Simple Java Web Application that exposes JMX servers through HTTP. This was written so that external tools can easily query JMX attributes of Java applications. More specifically, this was written to allow Cacti to generate fancy graphs of ActiveMQ instances." - -JMXetric --------- - -http://code.google.com/p/jmxetric/ - -"JMXetric is a 100% java, configurable JVM agent that periodically polls MBean attributes and reports their values to Ganglia." - -jmxquery --------- - -http://code.google.com/p/jmxquery/ - -"a plugin for nagios to check jmx" - -check_jmx ---------- - -http://exchange.nagios.org/directory/Plugins/Java-Applications-and-Servers/check_jmx/details - - -jmx2snmp --------- - -http://github.com/tcurdt/jmx2snmp - -Expose application JMX properties via SNMP - diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/monitoring/README b/pkg/registry/zookeeper-3.4.6/src/contrib/monitoring/README deleted file mode 100644 index d48e2ce26..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/contrib/monitoring/README +++ /dev/null @@ -1,84 +0,0 @@ - -Tools and Recipes for ZooKeeper Monitoring ------------------------------------------- - -How To Monitor --------------- - -A ZooKeeper cluster can be monitored in two ways: - 1. by using the 'mntr' 4letterword command - 2. by using JMX to query the MBeans - -This repo contains tools and recipes for monitoring ZooKeeper using the first method. - -Check the file JMX-RESOURCE for some links to resources that could help you monitor a ZooKeeper cluster using the JMX interface. - -Requirements ------------- - -ZooKeeper 3.4.0 or later or you can apply ZOOKEEPER-744 patch over the latest 3.3.x release. -The server should understand the 'mntr' 4letterword command. - -$ echo 'mntr' | nc localhost 2181 -zk_version 3.4.0--1, built on 06/19/2010 15:07 GMT -zk_avg_latency 141 -zk_max_latency 1788 -zk_min_latency 0 -zk_packets_received 385466 -zk_packets_sent 435364 -zk_outstanding_requests 0 -zk_server_state follower -zk_znode_count 5 -zk_watch_count 0 -zk_ephemerals_count 0 -zk_approximate_data_size 41 -zk_open_file_descriptor_count 20 -zk_max_file_descriptor_count 1024 - -Python 2.6 (maybe it works on previous version but it's not tested yet). - -In a nutshell -------------- - -All you need is check_zookeeper.py It has no external dependencies. - - -*** On Nagios call the script like this: - -./check_zookeeper.py -o nagios -s "" -k -w -c - - -*** On Cacti define a custom data input method using the script like this: - -./check_zookeeper.py -o cacti -s "" -k --leader - --- outputs a single value for the given key fetched from the cluster leader - -OR - -./check_zookeeper.py -o cacti -s "" -k - --- outputs multiple values on for each cluster node -ex: localhost_2182:0 localhost_2183:0 localhost_2181:0 localhost_2184:0 localhost_2185:0 - -*** On Ganglia: - -install the plugin found in the ganglia/ subfolder OR - -./check_zookeeper.py -o ganglia -s "" - -it will use gmetric to send zookeeper node status data. - - -Check the subfolders for configuration details and samples for each platform. - -License -------- - -Apache License 2.0 or later. - -ZooKeeper 4letterwords Commands -------------------------------- - -http://zookeeper.apache.org/docs/current/zookeeperAdmin.html#sc_zkCommands - diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/monitoring/cacti/README b/pkg/registry/zookeeper-3.4.6/src/contrib/monitoring/cacti/README deleted file mode 100644 index 8188723e5..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/contrib/monitoring/cacti/README +++ /dev/null @@ -1,56 +0,0 @@ -Licensed to the Apache Software Foundation (ASF) under one -or more contributor license agreements. See the NOTICE file -distributed with this work for additional information -regarding copyright ownership. The ASF licenses this file -to you 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. - -Recipes for ZooKeeper monitoring using Cacti --------------------------------------------- - -Cacti install guide: https://help.ubuntu.com/community/Cacti - -Cacti Manual: http://www.cacti.net/downloads/docs/html/ -PDF version: http://www.cacti.net/downloads/docs/pdf/manual.pdf - -Check Chapter 16: Simplest Method of Going from Script to Graph - http://www.cacti.net/downloads/docs/html/how_to.html#SCRIPT_TO_GRAPH - -WARNING: I have wrote these instructions while installing and configuring the plugin on my desktop computer running Ubuntu 9.10. I've installed Cacti using apt-get. - -WARNING: I'm going to make the assumption that you know how to work with Cacti and how to setup Data Input Methods for custom scripts. I'm also going to assume that you have already installed Cacti and everything works as expected. - -You can extend the Cacti's data gathering functionality through external scripts. Cacti comes with a number of scripts out of the box wich are localted in the scripts/ directory. - - -The check_zookeeper.py script can be used a custom data input method for Cacti. - -Single value (check cluster status by sending queries to the leader): ---------------------------------------------------------------------- - -python scripts/check_zookeeper.py -s "localhost:2181,localhost:2182,localhost:2183,localhost:2184,localhost:2185" -k -o cacti --leader - -When you will call the script this way it will about a single value representing the value attached to this . - - -Multiple values (one for each cluster node): --------------------------------------------- - -python scripts/check_zookeeper.py -s "localhost:2181,localhost:2182,localhost:2183,localhost:2184,localhost:2185" -k -o cacti - -Output: -localhost_2182:0 localhost_2183:0 localhost_2181:0 localhost_2184:0 localhost_2185:0 - - -TBD: Step by step guide - - diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/monitoring/check_zookeeper.py b/pkg/registry/zookeeper-3.4.6/src/contrib/monitoring/check_zookeeper.py deleted file mode 100644 index c00db8bc0..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/contrib/monitoring/check_zookeeper.py +++ /dev/null @@ -1,358 +0,0 @@ -#! /usr/bin/env python -# Licensed to the Apache Software Foundation (ASF) under one -# or more contributor license agreements. See the NOTICE file -# distributed with this work for additional information -# regarding copyright ownership. The ASF licenses this file -# to you 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. -""" Check Zookeeper Cluster - -Generic monitoring script that could be used with multiple platforms (Ganglia, Nagios, Cacti). - -It requires ZooKeeper 3.4.0 or greater. The script needs the 'mntr' 4letter word -command (patch ZOOKEEPER-744) that was now commited to the trunk. -The script also works with ZooKeeper 3.3.x but in a limited way. -""" - -import sys -import socket -import logging -import re -import subprocess - -from StringIO import StringIO -from optparse import OptionParser, OptionGroup - -__version__ = (0, 1, 0) - -log = logging.getLogger() -logging.basicConfig(level=logging.ERROR) - -class NagiosHandler(object): - - @classmethod - def register_options(cls, parser): - group = OptionGroup(parser, 'Nagios specific options') - - group.add_option('-w', '--warning', dest='warning') - group.add_option('-c', '--critical', dest='critical') - - parser.add_option_group(group) - - def analyze(self, opts, cluster_stats): - try: - warning = int(opts.warning) - critical = int(opts.critical) - - except (TypeError, ValueError): - print >>sys.stderr, 'Invalid values for "warning" and "critical".' - return 2 - - if opts.key is None: - print >>sys.stderr, 'You should specify a key name.' - return 2 - - warning_state, critical_state, values = [], [], [] - for host, stats in cluster_stats.items(): - if opts.key in stats: - - value = stats[opts.key] - values.append('%s=%s;%s;%s' % (host, value, warning, critical)) - - if warning >= value > critical or warning <= value < critical: - warning_state.append(host) - - elif (warning < critical and critical <= value) or (warning > critical and critical >= value): - critical_state.append(host) - - if not values: - # Zookeeper may be down, not serving requests or we may have a bad configuration - print 'Critical, %s not found' % opts.key - return 2 - - values = ' '.join(values) - if critical_state: - print 'Critical "%s" %s!|%s' % (opts.key, ', '.join(critical_state), values) - return 2 - - elif warning_state: - print 'Warning "%s" %s!|%s' % (opts.key, ', '.join(warning_state), values) - return 1 - - else: - print 'Ok "%s"!|%s' % (opts.key, values) - return 0 - -class CactiHandler(object): - - @classmethod - def register_options(cls, parser): - group = OptionGroup(parser, 'Cacti specific options') - - group.add_option('-l', '--leader', dest='leader', - action="store_true", help="only query the cluster leader") - - parser.add_option_group(group) - - def analyze(self, opts, cluster_stats): - if opts.key is None: - print >>sys.stderr, 'The key name is mandatory.' - return 1 - - if opts.leader is True: - try: - leader = [x for x in cluster_stats.values() \ - if x.get('zk_server_state', '') == 'leader'][0] - - except IndexError: - print >>sys.stderr, 'No leader found.' - return 3 - - if opts.key in leader: - print leader[opts.key] - return 0 - - else: - print >>sys.stderr, 'Unknown key: "%s"' % opts.key - return 2 - else: - for host, stats in cluster_stats.items(): - if opts.key not in stats: - continue - - host = host.replace(':', '_') - print '%s:%s' % (host, stats[opts.key]), - - -class GangliaHandler(object): - - @classmethod - def register_options(cls, parser): - group = OptionGroup(parser, 'Ganglia specific options') - - group.add_option('-g', '--gmetric', dest='gmetric', - default='/usr/bin/gmetric', help='ganglia gmetric binary '\ - 'location: /usr/bin/gmetric') - - parser.add_option_group(group) - - def call(self, *args, **kwargs): - subprocess.call(*args, **kwargs) - - def analyze(self, opts, cluster_stats): - if len(cluster_stats) != 1: - print >>sys.stderr, 'Only allowed to monitor a single node.' - return 1 - - for host, stats in cluster_stats.items(): - for k, v in stats.items(): - try: - self.call([opts.gmetric, '-n', k, '-v', str(int(v)), '-t', 'uint32']) - except (TypeError, ValueError): - pass - -class ZooKeeperServer(object): - - def __init__(self, host='localhost', port='2181', timeout=1): - self._address = (host, int(port)) - self._timeout = timeout - - def get_stats(self): - """ Get ZooKeeper server stats as a map """ - data = self._send_cmd('mntr') - if data: - return self._parse(data) - else: - data = self._send_cmd('stat') - return self._parse_stat(data) - - def _create_socket(self): - return socket.socket() - - def _send_cmd(self, cmd): - """ Send a 4letter word command to the server """ - s = self._create_socket() - s.settimeout(self._timeout) - - s.connect(self._address) - s.send(cmd) - - data = s.recv(2048) - s.close() - - return data - - def _parse(self, data): - """ Parse the output from the 'mntr' 4letter word command """ - h = StringIO(data) - - result = {} - for line in h.readlines(): - try: - key, value = self._parse_line(line) - result[key] = value - except ValueError: - pass # ignore broken lines - - return result - - def _parse_stat(self, data): - """ Parse the output from the 'stat' 4letter word command """ - h = StringIO(data) - - result = {} - - version = h.readline() - if version: - result['zk_version'] = version[version.index(':')+1:].strip() - - # skip all lines until we find the empty one - while h.readline().strip(): pass - - for line in h.readlines(): - m = re.match('Latency min/avg/max: (\d+)/(\d+)/(\d+)', line) - if m is not None: - result['zk_min_latency'] = int(m.group(1)) - result['zk_avg_latency'] = int(m.group(2)) - result['zk_max_latency'] = int(m.group(3)) - continue - - m = re.match('Received: (\d+)', line) - if m is not None: - result['zk_packets_received'] = int(m.group(1)) - continue - - m = re.match('Sent: (\d+)', line) - if m is not None: - result['zk_packets_sent'] = int(m.group(1)) - continue - - m = re.match('Outstanding: (\d+)', line) - if m is not None: - result['zk_outstanding_requests'] = int(m.group(1)) - continue - - m = re.match('Mode: (.*)', line) - if m is not None: - result['zk_server_state'] = m.group(1) - continue - - m = re.match('Node count: (\d+)', line) - if m is not None: - result['zk_znode_count'] = int(m.group(1)) - continue - - return result - - def _parse_line(self, line): - try: - key, value = map(str.strip, line.split('\t')) - except ValueError: - raise ValueError('Found invalid line: %s' % line) - - if not key: - raise ValueError('The key is mandatory and should not be empty') - - try: - value = int(value) - except (TypeError, ValueError): - pass - - return key, value - -def main(): - opts, args = parse_cli() - - cluster_stats = get_cluster_stats(opts.servers) - if opts.output is None: - dump_stats(cluster_stats) - return 0 - - handler = create_handler(opts.output) - if handler is None: - log.error('undefined handler: %s' % opts.output) - sys.exit(1) - - return handler.analyze(opts, cluster_stats) - -def create_handler(name): - """ Return an instance of a platform specific analyzer """ - try: - return globals()['%sHandler' % name.capitalize()]() - except KeyError: - return None - -def get_all_handlers(): - """ Get a list containing all the platform specific analyzers """ - return [NagiosHandler, CactiHandler, GangliaHandler] - -def dump_stats(cluster_stats): - """ Dump cluster statistics in an user friendly format """ - for server, stats in cluster_stats.items(): - print 'Server:', server - - for key, value in stats.items(): - print "%30s" % key, ' ', value - print - -def get_cluster_stats(servers): - """ Get stats for all the servers in the cluster """ - stats = {} - for host, port in servers: - try: - zk = ZooKeeperServer(host, port) - stats["%s:%s" % (host, port)] = zk.get_stats() - - except socket.error, e: - # ignore because the cluster can still work even - # if some servers fail completely - - # this error should be also visible in a variable - # exposed by the server in the statistics - - logging.info('unable to connect to server '\ - '"%s" on port "%s"' % (host, port)) - - return stats - - -def get_version(): - return '.'.join(map(str, __version__)) - - -def parse_cli(): - parser = OptionParser(usage='./check_zookeeper.py ', version=get_version()) - - parser.add_option('-s', '--servers', dest='servers', - help='a list of SERVERS', metavar='SERVERS') - - parser.add_option('-o', '--output', dest='output', - help='output HANDLER: nagios, ganglia, cacti', metavar='HANDLER') - - parser.add_option('-k', '--key', dest='key') - - for handler in get_all_handlers(): - handler.register_options(parser) - - opts, args = parser.parse_args() - - if opts.servers is None: - parser.error('The list of servers is mandatory') - - opts.servers = [s.split(':') for s in opts.servers.split(',')] - - return (opts, args) - - -if __name__ == '__main__': - sys.exit(main()) - diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/monitoring/ganglia/README b/pkg/registry/zookeeper-3.4.6/src/contrib/monitoring/ganglia/README deleted file mode 100644 index 578adfee2..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/contrib/monitoring/ganglia/README +++ /dev/null @@ -1,48 +0,0 @@ -Licensed to the Apache Software Foundation (ASF) under one -or more contributor license agreements. See the NOTICE file -distributed with this work for additional information -regarding copyright ownership. The ASF licenses this file -to you 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. - -Recipes for ZooKeeper monitoring using Ganglia ----------------------------------------------- - -Ganglia Install guide: http://sourceforge.net/apps/trac/ganglia/wiki/Ganglia%203.1.x%20Installation%20and%20Configuration - -Gmond configuration: http://sourceforge.net/apps/trac/ganglia/wiki/Gmond%203.1.x%20General%20Configuration - -WARNING: I have wrote these instructions while installing and configuring the plugin on my desktop computer running Ubuntu 9.10. I've installed Ganglia using apt-get. - -WARNING: I'm going to make the assumption that you know how to work with Ganglia. I'm also going to assume that you have already installed Gangli and everything works as expected. - -You can monitoring ZooKeeper using Ganglia in two ways: - -1. Using a python module: - - WARNING! The python module only works with Ganglia 3.1.x - - a. enable python modules: you can find instructions in modpython.confg - b. copy zookeeper.pyconf in /etc/ganglia/conf.d/ - c. copy zookeeper_ganglia.py in /usr/lib/ganglia/python_plugins - d. restart the ganglia-monitor - - This is the recommended way! - -2. OR Using check_zookeeper.py and gmetric: - - Monitoring ZooKeeper using Ganglia is a simple as calling: - - ./check_zookeeper.py -o ganglia -s localhost:2181 - - on each of the ZooKeeper cluster nodes. I'm making the assumption that you have already configured gmond and installed gmetric on each node. - diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/monitoring/ganglia/Screenshot.png b/pkg/registry/zookeeper-3.4.6/src/contrib/monitoring/ganglia/Screenshot.png deleted file mode 100644 index bc0e41d5f644bdebd680aa8e97e3d3f08039fcdc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 111055 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\o(&ieLfwK!DlYCd)QI1| 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 diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/monitoring/ganglia/modpython.conf b/pkg/registry/zookeeper-3.4.6/src/contrib/monitoring/ganglia/modpython.conf deleted file mode 100644 index 5cd051a8e..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/contrib/monitoring/ganglia/modpython.conf +++ /dev/null @@ -1,28 +0,0 @@ -/* Licensed to the Apache Software Foundation (ASF) under one -or more contributor license agreements. See the NOTICE file -distributed with this work for additional information -regarding copyright ownership. The ASF licenses this file -to you 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. */ - -/* Update gmond.conf */ - -modules { - module { - name = "python_module" - path = "/usr/lib/ganglia/modpython.so" - params = "/usr/lib/ganglia/python_modules" - } -} - -include ('/etc/ganglia/conf.d/*.pyconf') - diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/monitoring/ganglia/zookeeper.pyconf b/pkg/registry/zookeeper-3.4.6/src/contrib/monitoring/ganglia/zookeeper.pyconf deleted file mode 100644 index 43801a0f2..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/contrib/monitoring/ganglia/zookeeper.pyconf +++ /dev/null @@ -1,49 +0,0 @@ -/* Licensed to the Apache Software Foundation (ASF) under one -or more contributor license agreements. See the NOTICE file -distributed with this work for additional information -regarding copyright ownership. The ASF licenses this file -to you 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. */ - -/* Update /etc/ganglia/gmond.conf with the content of this file. */ - -/* ATTENTION: Change the host and the port to meet your setup. */ - -modules { - module { - name = "zookeeper_ganglia" - language = "python" - param host { value = "127.0.0.1" } - param port { value = 2181 } - } -} - -collection_group { - collect_every = 20 - time_threshold = 60 - metric { name = "zk_avg_latency" } - metric { name = "zk_max_latency" } - metric { name = "zk_min_latency" } - metric { name = "zk_packets_received" } - metric { name = "zk_packets_sent" } - metric { name = "zk_outstanding_requests" } - metric { name = "zk_znode_count" } - metric { name = "zk_watch_count" } - metric { name = "zk_ephemerals_count" } - metric { name = "zk_approximate_data_size" } - metric { name = "zk_open_file_descriptor_count" } - metric { name = "zk_max_file_descriptor_count" } - metric { name = "zk_followers" } - metric { name = "zk_synced_followers" } - metric { name = "zk_pending_syncs" } -} - diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/monitoring/ganglia/zookeeper_ganglia.py b/pkg/registry/zookeeper-3.4.6/src/contrib/monitoring/ganglia/zookeeper_ganglia.py deleted file mode 100644 index 82903d1f6..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/contrib/monitoring/ganglia/zookeeper_ganglia.py +++ /dev/null @@ -1,209 +0,0 @@ -# Licensed to the Apache Software Foundation (ASF) under one -# or more contributor license agreements. See the NOTICE file -# distributed with this work for additional information -# regarding copyright ownership. The ASF licenses this file -# to you 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. -""" Python Ganglia Module for ZooKeeper monitoring - -Inspired by: http://gist.github.com/448007 - -Copy this file to /usr/lib/ganglia/python_plugins - -""" - -import sys -import socket -import time -import re - -from StringIO import StringIO - -TIME_BETWEEN_QUERIES = 20 - -class ZooKeeperServer(object): - - def __init__(self, host='localhost', port='2181', timeout=1): - self._address = (host, int(port)) - self._timeout = timeout - - def get_stats(self): - """ Get ZooKeeper server stats as a map """ - data = self._send_cmd('mntr') - if data: - return self._parse(data) - else: - data = self._send_cmd('stat') - return self._parse_stat(data) - - def _create_socket(self): - return socket.socket() - - def _send_cmd(self, cmd): - """ Send a 4letter word command to the server """ - s = self._create_socket() - s.settimeout(self._timeout) - - s.connect(self._address) - s.send(cmd) - - data = s.recv(2048) - s.close() - - return data - - def _parse(self, data): - """ Parse the output from the 'mntr' 4letter word command """ - h = StringIO(data) - - result = {} - for line in h.readlines(): - try: - key, value = self._parse_line(line) - result[key] = value - except ValueError: - pass # ignore broken lines - - return result - - def _parse_stat(self, data): - """ Parse the output from the 'stat' 4letter word command """ - h = StringIO(data) - - result = {} - - version = h.readline() - if version: - result['zk_version'] = version[version.index(':')+1:].strip() - - # skip all lines until we find the empty one - while h.readline().strip(): pass - - for line in h.readlines(): - m = re.match('Latency min/avg/max: (\d+)/(\d+)/(\d+)', line) - if m is not None: - result['zk_min_latency'] = int(m.group(1)) - result['zk_avg_latency'] = int(m.group(2)) - result['zk_max_latency'] = int(m.group(3)) - continue - - m = re.match('Received: (\d+)', line) - if m is not None: - result['zk_packets_received'] = int(m.group(1)) - continue - - m = re.match('Sent: (\d+)', line) - if m is not None: - result['zk_packets_sent'] = int(m.group(1)) - continue - - m = re.match('Outstanding: (\d+)', line) - if m is not None: - result['zk_outstanding_requests'] = int(m.group(1)) - continue - - m = re.match('Mode: (.*)', line) - if m is not None: - result['zk_server_state'] = m.group(1) - continue - - m = re.match('Node count: (\d+)', line) - if m is not None: - result['zk_znode_count'] = int(m.group(1)) - continue - - return result - - def _parse_line(self, line): - try: - key, value = map(str.strip, line.split('\t')) - except ValueError: - raise ValueError('Found invalid line: %s' % line) - - if not key: - raise ValueError('The key is mandatory and should not be empty') - - try: - value = int(value) - except (TypeError, ValueError): - pass - - return key, value - -def metric_handler(name): - if time.time() - metric_handler.timestamp > TIME_BETWEEN_QUERIES: - zk = ZooKeeperServer(metric_handler.host, metric_handler.port, 5) - try: - metric_handler.info = zk.get_stats() - except Exception, e: - print >>sys.stderr, e - metric_handler.info = {} - - return metric_handler.info.get(name, 0) - -def metric_init(params=None): - params = params or {} - - metric_handler.host = params.get('host', 'localhost') - metric_handler.port = int(params.get('port', 2181)) - metric_handler.timestamp = 0 - - metrics = { - 'zk_avg_latency': {'units': 'ms'}, - 'zk_max_latency': {'units': 'ms'}, - 'zk_min_latency': {'units': 'ms'}, - 'zk_packets_received': { - 'units': 'packets', - 'slope': 'positive' - }, - 'zk_packets_sent': { - 'units': 'packets', - 'slope': 'positive' - }, - 'zk_outstanding_requests': {'units': 'connections'}, - 'zk_znode_count': {'units': 'znodes'}, - 'zk_watch_count': {'units': 'watches'}, - 'zk_ephemerals_count': {'units': 'znodes'}, - 'zk_approximate_data_size': {'units': 'bytes'}, - 'zk_open_file_descriptor_count': {'units': 'descriptors'}, - 'zk_max_file_descriptor_count': {'units': 'descriptors'}, - 'zk_followers': {'units': 'nodes'}, - 'zk_synced_followers': {'units': 'nodes'}, - 'zk_pending_syncs': {'units': 'syncs'} - } - metric_handler.descriptors = {} - for name, updates in metrics.iteritems(): - descriptor = { - 'name': name, - 'call_back': metric_handler, - 'time_max': 90, - 'value_type': 'int', - 'units': '', - 'slope': 'both', - 'format': '%d', - 'groups': 'zookeeper', - } - descriptor.update(updates) - metric_handler.descriptors[name] = descriptor - - return metric_handler.descriptors.values() - -def metric_cleanup(): - pass - - -if __name__ == '__main__': - ds = metric_init({'host':'localhost', 'port': '2181'}) - for d in ds: - print "%s=%s" % (d['name'], metric_handler(d['name'])) - - diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/monitoring/nagios/README.txt b/pkg/registry/zookeeper-3.4.6/src/contrib/monitoring/nagios/README.txt deleted file mode 100644 index 317ae1486..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/contrib/monitoring/nagios/README.txt +++ /dev/null @@ -1,86 +0,0 @@ -Licensed to the Apache Software Foundation (ASF) under one -or more contributor license agreements. See the NOTICE file -distributed with this work for additional information -regarding copyright ownership. The ASF licenses this file -to you 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. - -Configuration Recipe for monitoring ZooKeeper using Nagios ----------------------------------------------------------- - -I will start by making the assumption that you already have an working Nagios install. - -WARNING: I have wrote these instructions while installing and configuring the plugin on my desktop computer running Ubuntu 9.10. I've installed Nagios using apt-get. - -WARNING: You should customize the config files as suggested in order to match your Nagios and Zookeeper install. - -WARNING: This README assumes you know how to configure Nagios and how it works. - -WARNING: You should customize the warning and critical levels on service checks to meet your own needs. - -1. Install the plugin - -$ cp check_zookeeper.py /usr/lib/nagios/plugins/ - -2. Install the new commands - -$ cp zookeeper.cfg /etc/nagios-plugins/config - -3. Update the list of servers in zookeeper.cfg for the command 'check_zookeeper' and update the port for the command 'check_zk_node' (default: 2181) - -4. Create a virtual host in Nagios used for monitoring the cluster as a whole -OR- Create a hostgroup named 'zookeeper-servers' and add all the zookeeper cluster nodes. - -5. Define service checks like I have ilustrated bellow or just use the provided definitions. - -define service { - use generic-service - host_name zookeeper-cluster - service_description ... - check_command check_zookeeper!!! -} - -define service { - hostgroup_name zookeeper-servers - use generic-service - service_description ZK_Open_File_Descriptors_Count - check_command check_zk_node!!! -} - -Ex: - -a. check the number of open file descriptors - -define service{ - use generic-service - host_name zookeeper-cluster - service_description ZK_Open_File_Descriptor_Count - check_command check_zookeeper!zk_open_file_descriptor_count!500!800 -} - -b. check the number of ephemerals nodes - -define service { - use generic-service - host_name localhost - service_description ZK_Ephemerals_Count - check_command check_zookeeper!zk_ephemerals_count!10000!100000 -} - -c. check the number of open file descriptors for each host in the group - -define service { - hostgroup_name zookeeper-servers - use generic-service - service_description ZK_Open_File_Descriptors_Count - check_command check_zk_node!zk_open_file_descriptor_count!500!800 -} - diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/monitoring/nagios/Screenshot-1.png b/pkg/registry/zookeeper-3.4.6/src/contrib/monitoring/nagios/Screenshot-1.png deleted file mode 100644 index 2dc55c58adcba0adf1407a093eabf3556153cd8b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 196668 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
        +xHGrd_zYcH|R~nOS54djq`MaeF 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

        hm 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

        %4Ocm&BH;Uj&U@R z{7AsayMDkYmsLqha8M{HT`hw_!bl8D)cA_6302I8&fgur-@`d#}^ zw&+z*5wY6f0$NJx;Q2vuf7n|SWgCO4B=^;eoI$IE#5}G!hXPhmS=eETw}c!PHFtAX zZD}j2>Ph6u?x8ww!Ei!j;t`;S@tZA=PQh<-DCFeeOCP60%Q6^?w(5mHgXPM?zkJ?g z5A0`5K-cXUEWO^@8r|c4^)9-sr=}u-yv?%Jj_~|Zx&$cKMZw|R?|NGR26)qJ16`X6 z$_+B^IRgJ{2c?Px08j?q^(ycJ#yWi0BjErN>Aey)N#}Rif>TjdF7Ce1`^Sa>`SiH7 zTo6gKwk^|5w}jGAoMw7lD29!m%E#&Lps}coAH8aEhS5E5kpP_yu3yfgUqJ+W)EE3u z&emp?tcQO9nw-fhLK!x&$HJ8E=WrT)jIYd-ekzZ%y97CQBp4<2dq4=2jX#R(@-bd# z9I+%!=87+~Vtsb;m3oe2-EE#54~Ne-S;^d7#HV6#Jjww%?hezrY?n$Stgn@PEqUFD zjd6XWP%p@4j?2eX*k=R@JSGA@7+5(KmkvvA4Tke%--XNCCw0YzqvevZ_ETmtmQ?DT z!GkTE7bcdkdF6jFkBQmeXB+lEf0(y3FXR&KKU1vR)$aq`>nIjBnzI)L&R6U^y{HgY z{VIRn)nUBLegoth@c-P8E(KG53`W4y;JO16R^q%iyHA&mcQ*b5b2io4>d%dY&r52m z<8AZ!UXRP5_?J@hhv9jc{2HTX>%?#T<5ISEF-icXS+eGtb#d-DJ4s=s?6G4r+uda0Q2;M_;1Rf<=$gP&ytzi1t!LM}9n)j9z*>*YPESi9 z0cv{x%$l!10k|RoZS}R5^`L^wdJ37jWV|(?-oN}zC06;ILMC*xQ!hJ*sz@$ZEkXO? zVYqd3h_tK9gA|trN`{|`bYXR>2U7p_=zX>kclkq~xn>U85k7OI@~n2y5FWGk7@16P z=*iGMHNB^Nw(6|bzC6%IPG0aaRn!IBja|gDtx`i4s;y`*K8P6?NNn|5#iy=QJL`jn zpG@o%mQEW+_dRM})#@U9dWr7UqN08%Kh)lSfIY*zdJ?G2u7$L@=1mjpA{tLSp3n2X z?DAm9lkhvWHgZLRardRo0TtE&LB{MH9fUwO{|AATc!klb_dN!k>y&u6c6{12iUG6; z0$ri2c7+%fL}eO6HI8>oDh)@^*hR!4%jlPM%G{-@F+>58%q~E}GWlB;qZ`ei_QzZF zuJ|vs9m&0=ZjB$KMx|8r*fR6AlYR$2$=m$x38-L#l=oNnkLP)$iRtobnR`Ia`QWc* zT(|W&aP5*a?+Tf|tD`(lk(;w6AKKi>2XHuaI@Di)`TiHKPYzegISWEwHRLcjbhNZX zGnu|yZ;c5FQj=N6P<58XZ%Ozj%;VdT|+>syaaD^mWQZr`yKo z*6{ABHK@FVLhbFh5Je}Hs3wC5Mw|ACi0IsOBN(FI1)WCs^9C6YFRYf!jPcxsE<8_j zu>2)+Fkq)|3ZJDZ*@IwJBZHrcvublje)A!QP9$SkdxFp9@Z;S}z3Fb2-FcmJGMubk z%Ecbnxw*pqgI!+*{ev|t4)-okFcIsarBa!LPj5-m?;uk;CI=Gotl7`+$tt{QHT-Lp zmfX#AJqO>*))2H(ZJav;^d7w1Z*tR%x3)CMl0{h&}M#9C>W53yi;E z*?Mczo?4KN$*VgG{JdUq*_5+K(vhwDnj7P=nEs&jwKzXMFrOIB-u1go8}dt0Y*FiD zr_ncM?z`ID`LjOA4zMwBB(eID!+sOTJl6uH@i(ZCXivnk7|4jx5Z~8Y$z3*IxiB@8K44zw8wM zu~S+vQvb^rW__?wfSqN4^MJn~Rb56;wnqoGWUWMXBc_%fh&Md03)FQSh(5T1P?b~{ zT?gtqkt-xQbM_f!|24<3^BaUK8!yQg5Ja5vBs}v697ogDCrLyY9orY_T=LBwN-U*@RGF4-3PM@g^59@Way5^O|+58r6c9Haqa-Z)LQtu)*1Ej!Oq)HoKUa0lmJ!CPJR4#4If+clM>sZz-8Hrtufk=ew9 z^JsQYRTJ4Dzkawn_8UW5Mfy`h8$bXrDVo4Zqn-)%rN-t;x6%_ zi@jCR6jfjP-jnW9s8XnPCnV>vnBRFV z>?27cfFPFYruGGkT+`XLVX@1xk9YNZQr^1657T)8DKrzl!|C-2SOr5o&r;di{1kVT zNF_ropZT}9cXsOV&$TIh7Auq>D*2L>h4Xq-)mPeIIO}=XP)$W-Q(z!Gp}Z+3#CUt) z?&Ny3wRyE0kyu7y4=+AWqXLZx7v?kIH16G@mp8y0nwvjMn{eB+m1u6x4CFgd9lblY zi9eX98x>5sD)d__a~@f{HMPh&F(+3-g%$EspdmN6a6uN0U_FHu#5G>lxW80>#7ilz zX4`9%sPmv_1tE}acBOjUu|+M(gypWKM{YnqEe}*w{XC*b3uj0kejk}A+9iyUYwTmO zdY{kzoCwgbKd3@ra9$k_3V9E(sH7l(^+t7`sQ~FPLO{N7WtIXzp2LRkn(68L2#?~g z_#WrI^xBlj5C_bKvEb8954UoS*vC!b6iES;n)BCLD)=Q}YW^MwAMb2hG{_>mD5wzP z^gO*;`lUyOy5DNeR)i^*&7V4~V2eDcbqYvN?%8Ob-ACoqvvO6+yfWff8Yp~CPjMWN zto>kFS|iP*J2coue{t%M4LNp&R6l~&wu<@Aa(nPG+V6U?Qco|T4kx>g?68}zz0jJ~ zs1M$O-x{BHjkd#ZGlg9*tLlx>8LWUIYP>k#aJ9>54huuV@)Pz23okG4q-~YZoq#PV zY3W(x^0L8#TU}9__V*K0oq`vgIg8rKxG8Hg-{$m45V^d0f)w?Xdpj)4a{K4=LeHQ% zhPZ6&T<-Fd@-7Ixpdd5=ghwUltR$s^zA^Lp)llC+T{2!1KK zMb3f&8;22#A`$;FMsvEPr_T#xhfjN_W!=ywrUyNkmT-N6fGVXmrVXLu)%yIHbw532Znoo+M4Y$K`>@Q4r4cq-pfFba9ALz*Xm=#vr?!>AOhfi64d#}c8HsV^e=O6`%Uw7Q2(Y!5$M zIKT27Vzcx8x%DD_3q3XfqXbQuWpv?VyugPl_&0UK;A(^ys6llnZSJV_-DR`A6|SCF z&9Y2B3uQ;}08lTtEH8JN+%o6amdT{aB+T zQXd@dk$_kJc-ha67dUI2#(nvcbGtqMgf+L6!}-nt2o@Q4z(iWAr)bb z$NC%&4rF73s-jEg-IdfX0-||}lc`TXtM8FU)Kok9Wtk7m+pcYo^mfH!o)MW^=?VPs zkxcuRV>oBo|1oQ0FmVfC6%?+=dAME`=Gu4!E>raViGs!S?H_7kDkW~o9xq4DQ)6pPN=ONfIDoXlW*TwqsV&`HFMALlJ84DI)!7}N!t4;+ zUtMXb-m0|`>vq*>!-4G8?Hxt4PTDk_kJ0?zFM?bo7sLvR;x=6~U#X9yZ z1>gkX#1h^nbr;2qdk1NuUG>kBc*5VDArjW@lKgd2qczvwr6)aHhCZgAo8Vvhi4+mE zCk!FRBTj!j_RjrR|0PpFrrtj|j<*+;A?M$aqqQ%y$4g*XSjyJd+e1Pf z&DjELY9vE(Q}6Gm4doy3B3}ik`u)ztD7s7oFW(gcY)aTFzds4!0&oFWA7cvF*VlcH z=3Nfy|CO|U(K4$p3rhy($%p~FAE_UnA5)tqP5Cf7QayODzLi69<3(f1RSW4&N-{}j z*j20hVpiU>3;i*Iu3@tY|GHy5?SZwVe_T5UqDvE5uR6P10>MBiuvwH>19J^iarRtU ziM%LxG&zjV-f5vKJlA-#WMgN9cX0ZMudeJROyl#v+1QnwrRc%jK>sgAM#(BdAy%Eb3W2C$qU%ZIy+PFxa6F zgUygXHqtXcR&tij=__e}RG=QyJ=slR_0+ndokD zZ0G5+d+DC+!fWJWr|;-cFFI9wzsUtB&zOQpYxKfJw_?6#^)jc(K7HJ9eLRgeHW&H3 zwmhG=*LxnY;??5>ANr>DGwnm3=G&U2CSl3d9Ph`(&uT#dbVsW1=4xk%LZSSkBL(sp z(`xv{Os=(7_FM|fu0}|ndOk78PiRlA?p84=L!F(@GqlJD8 zWmO(sQ-cKgv;%AaL{G_hq{Dk5=H0jp-ATOYxGMY{Gk0y?vcVq27-$v>0Pk&&PPsr= zHAim&*s+O!d;t)|4STsjOSbHic(tlxQrxGi5ueyK1m`-Nf?fjWNuI^(Q_-kA`)|rr zr%q4!L55Vv+;-6|h1@|(QP{X~CPM-Jq@X?qEhi-jWq&S!6F7y+1g4=6;aFLD(9rlGMKJaK!U&u0{9;kIv4ZiX z*N%8uQC!~nB#1D zLI*p31`S}Ct^6e5KfcZh>ie7+lic$ODMN>wF)CT1m1>q)@^xXD64*u(!+(rv+q=TEIJ){S{PEmc*s{iNd4qs*hD zqeXpnv}frQS$Vi+-&i|JmISY+6{0TIwz~*V?kff#uy!UmnGRa*#LZUCn)&MuZ$O~_ z>XJu8FB8MNZn-s22K={PQz41~4nF9fa|?-(R+qrO?W+3Xy|ydJ8ir|*`0TCxg!jIS zE3O~&U5Ecr(X$q&p8v|zPiLQe+{d?X{y^pmvCqo0|A~(o`dI&$SV*g%ol#;vo+(N# z(CR#^`~>%Fq2l+*6yVr9Jzs>JSjX|{4%Gvgh1vub5#$O(LPPJWEf>lw{{{HoB_1PA zU7erBItBcv03SdPXaUSJI=Ka2Z8qfXJQfP~FAe7**cUxQukfxkyGv=~>|cdTm!Hj@ zlY#HLrX2u4MtY-zdAa z-nZ^tcj7z$l1yUPRQ6m*kEJK<0%-&)r;K84m@OpCA&7 zZmVW*Iz~Ro(Fc1qA=p5J%`v_>^l?uPg1xfs-LXSuWDkf!w8k(Z2Z&{jy%aB$ z;J|?XB$hQ$JhB0Q-2?4sZ-$kdGBl{{8MII-QaiFxwSiyhf0q<9fR@SBx&hT37Wy$I zWGeC!8*mT$*iFPfzz7e3zyc!}FhDO|EUe!A4oLEYvqs&xo@lJM=TP|zfClNtaev)> zK_EerNh3}9=Vp6w`kO$*8OkDS6dU~p0t8xOD#oLNb{oEn^ONACI`O4D`77Q?TP~~e zVrQj5Q>`oy`nZl~hpJhaB&*2oPC1>^wj;%rCVcifVLsa%z~tqQmkVg#k&(ntVO)^|f3^cd zuwZ7Czub6m+_qeEcfB|7peX+A(Dt~gwPzEF9yfc* zJF>ehxfueCWDn2px+BRAW%;R|M+1U@kiu&qvdZ?cY63ql!Y>MEE~l;#^G^qUTFFKM zAXKHkfe{(0K8^2{PFe*m(KMAbKP$Jo++g2bp%6L@!gdLqvh)HuRw zip~iEM^mt)6ex-cFu#Jv>OYez742UMun;65*&G8(&kvewFt-6~3HIJpb3lQ$Z z#K2GkSsG?%LuF$-e+BV@1&)Nya-qJU)Y}e|%(osH8{;Ek)cCG@-ENya;DL8h?~7-s zIq9Fyl({1JhX;QT0mM++8z&lPF4u@5hOjTY((njolq+?)1lT&-Zf}V%tbT9 zWgnC@XIsjZul1zipXpb>#}*XrrhbxjhyJGpA#+Qs1ccm*A}TS3*Vr}dN<_bsJbgaw zIZwFDF*C)n-*T^)`@Kd(v)76kICI8qDnz;;(Pn_Mx}-wR*?HaHz;0W0MV+>J-p&J) zeATEryBnJu94c@KGR~tAr=+1z4Ob3-7yG5Pv`@crGz6V4?BHkvUsulTOKb6zeq-@z ztu&fNLe_$L|Ju*zCkZ2YtEMa4{>QkFSx}feOBqA`=s0!eWS<{XX}&>j5VaH0Q4dV8 z!M3gAwUzLqcX7cH&-;ZpC^_Zy#;K8RLOo#ePKsMskMHdC;=14L3mnqpj`HSae#K7m z)uZOSkJl(Zj?okDD--^@T>4m5WG*Y6&WXyTre|HB26>EP;v*IxgP&A~9s>j3$nFHh zPZ6ECLm5?nVY0m7qz^SIU-yQSj9w4vL=mZzzGXnAdDUvdkNEOj`!{7DWeR}!5Xx(a zgG9V1=~xk?ZMdyxhRdmB$gs7X#)~8d3lavIzrv$q>()onKs?_vpU|e6&Crm6NE6bl zFmqe0{IaavWs5_5o7Y#JEikYa^SI$E>E?s`3Jr^CQZb)P@XNDtgI5V#bxJrmX(P=s`o(o z^krY?1|_t^p|M4a_7Eb77`;W{p}OJ(knUv%5U@GD3?si4HajihN|LQGi9o7u3uVITbKDft{gt>oc1&q z?|-A5L1em`H+Ue)o9F@*aCwX3&elG&^>v@VmzT3yX-X7A$-CiXeOG5s_ScwdLCD?8 zbnL-(o+|dCNz9z}@U!$(rH$+=^X3rak~_%PXl>dX{rG91Hu^J}M1#9Odtm|x4$#|< z*RrEwspk+gj#cW4KIif#S~KzCZ+M-(axt=4_g&XIi?oO1Jdn1bw1hJ3j-~Nb?G=+&Mf`W>5x1?W#w!>` zRK%3ZH~HCbcA|AC%8AU-5x`LphcFs<$Mf>#*l@$M{hpX)j~_;=h2jQY?RQ4Ql=WVV zZ~rk<1;XogFIGeXmk;gN)05*nGr~;xtMqTWc>1;^Im=kYFDG-M0E~V$8uEx5Q{$iZdmSgtQ_pOqIe50$&d$th8kf>1z67 zM&>QYeD3i_w~Ry4pUV28f+%zh9$Qv%*%nc%Bau<<$S;LTzP_6#Q2d@eO?}W=KY*aG zDR*2dC*g{x**uR(8z!|H@Ap^kxP3{>Z|$0j%W?xwosy%ih_G@b;luf2`c1&PX8+3pLkg%!*e{c_3`Z;IE7!i%q+N-9;0R} za{8p_0Sm58zRu@Wah2S2LFKUm$j4m5Z3P_?HFVNW*H4>y`RF#Ly%}QAi9K}RMR&bC zNZ}dwRC{{;S~%xSC3zHQKu<$%uTYDNHF$RWT}|x=t7rP@4O4GChIHOE4USSCd88OO z$Y@u3&YYVTL~&L4L)VlbAl ze%5>@c9*#(FOTwE6-}hOD5_pqCA!^f@seI6amu$cby-8bJTDXNV1y`4=X7-L_2!Ot z4u*D?H}wE;Xk)fP8a7?*JL5lPp~CbCj*Mz{%8yh@B&$y5kv7vnA3$l)3cRdQi~W4= zU?CkeY>X~WUCjyQ=>-Y{8`a24(75UyahBeUGu>576oS8a6Oz`?9h61QRF5hfvzS*a z+NIPi%`)3|f0&@$^IH9OnO6O@>Goi1w`_FpvY3$ zpdx1YGBn{uSWI~_z(dB|4Au_svQN6f^>a=UEikd`U27_c|68_nmrs;}lWXKwX(DFr z?Q0()L%l(;o=v%L(BWZQcbW*|L;D|ZwR2sC*df&DAXir1cM6Cmc>;1_qd&eLkW!Z8 zn|UV6hmbmOd?z;5LCnx6T85~C|8j9#A#Ra?`FArk=Fseyns(-9f{h$Dq;`Ii_<8A% zDS#oo5*R5}`wX&R5fX|*$2gob_F{gX3L;0Go@od1UFiG$OK&uaVT8zfP*7$RbtCBr ze#C;$+Pqh@3+w9Y^c!o4c~Jh507qvEuVmC^WInvRXVpMkMOcMfMX|$`Dn1htF7@;P zm(gY~9(j3S)ZQ{t-S39KX25v_MFe8fmfqD@ztq*9s)+)L8z;#wUXyV^Ouh4ySbykJ z-@kSX#Og2|Uc@52Blu;DMwX?`KU+ob9hR1n3@+AZ+2|hjZwwE@&98+VP3N33^>kvk z+Bg0kYv9o%8V2~(+cDs6`wE4Cp3Zi!KC>}c=RU`}u{KS1b?sLCuQ6AZ{ntF@0mL52 z<;Y_3uyMAgl4+zG%8%==LY$NJVEjC^vD_QRzIj4~x9?~N5vdQ~yt+GLjo6HTB&tW$ zL*8B&`6PP~mLo#!#D^zm={WcDC;-ynVp$^LDp6Ksu#mG;%Rt5DY!~PBYz<-GVf_xT z%5zlFVfN1LD90=K#S^NMd@PQcmloTO&eAX+%ov>X9hJWE?pB;7Vr`(pj_q&~qf&?6 zp)yZYCN^weyT#qLfY12*(KK3SjLMm=9wrY>S|%7mL5Co3wltf`(nic4gX_av<=Jy4 z^OQd-AAZO7v%~LpIS)5cOg5gxB&(cL735Y2DKR7bD!p@qT-C01?;@M0y=Z&vKmJvJ zz>;`DS(!zaY3>3f%TOBX@;Fc_K#hi^_CmHEU*^$v&<;eJyz-g3)m`Hqg&Zp)0fK5C zrbfaqQA?YE`@&PV(-!cGT&AOX#%Y6}uOUho4S4QSdNxnY1iWobn6sF}7XfzJuQbXE z@d;ffbJCc$U}&5O`9Q>vFX_+6mpL_EIw*5DeftPW-`n1}fkv2PT#4UG>i@QHkwXV@ z0TtsW_xpWi{H!=LyaKYu7dE%peLWxl$^EiqLd3|XV%Bu$vWG4&HC{a61m6q$7UnzN z;NT&|F56fCD!_dF^DeXEtNa>ibblw>{VLw;(%S@BfD92C4tOW5c+mr>AOo+Ck_C>O z0>3+GiMl9l->sc1ZXnFhS2;Qy>~2o$8yRqxt)1=5?^STF50Lbc-{3$;`f&P)2$BCC zIuVi$K--9IYSBSvWaPmdMa*X_{+F+2$tfW+qo*gQ?J?5DesG1zF~7Uc@DXnJsQCzhW=78nQfc{t!G<%Ye{{5~(eO8WB6?lQ>PMO$#cIO-P6O1-1!p4i9i z;IOCUX6HRTJ2!7@3*z#)3+y0RF@&eznyyrDq?t->H=T6XCl^^+cK#B_4fGOT5RIj} zKJ4W&Su_rk!C?L5_$zzuB2elAb`Ygse#G0{ygW`Iyg0)!9b)Jw+IxSj`2L^7z0-c9 z?go@;23O*v>aWmSNUm4ZK{}*70ms$Gt3Org#Gq7+y-rtRW2k#4oInjrsc>Y2k3S90 z3cWuzu=W&}@NBK#&F_>V-nd{rX-(rooaR|BM(Sg~2DlpvJ z8~>@;79M05s6X-m;(sl)w7yDYB8L6HSq1t3QTcm%-yQ+}HmZv&{*_{wHV9E6Ps)^f3BU2N;ML*YUecv6Hir`9& z&Y)ns*I<7jOt+24AiF&7DC&w;e=WV>V#}A@b_aJGM32T(epp7$1(1E=ZCbn%t61f< zApR=}Qd8;j>X|DlGR{IV@8j7+XEdef)08d0QydTT?rBypUN|QJCKr-=u>@z1_%uo&U9v7pTnuv1hJ#ZX#yscqLH0gCXg3eNQcy|U5*g-Rpr*n4rSJN05Hhm5I*jB>76IKqb&qUR5$cfkq;y;Lv zxkvOy_k|SNTHb!EA-PcHRF+iKYd_JCmr0@n?PJ9nO`U|+D_c2BbDJB)I=?a4_`xGw zJZcPKX-0CH@M4JL9+_-i3$!7O?Bu&8j61?Cj=sW-Ivy#)kBM09g5-7?ZYX`>FD5glkkJMDA6iEhPM$L;H{z& z5_+<-7M&t=-^tyrIf%(gO-|7vafyzWmQq4Rez(89PJK-a_)#&jYv*mFc&5Lmy}3f+ z9G=Km-S06}$bljgJfKLxd8A9;3c6#^x0f~hc6UFlB~PLnss3f%ngC8n8allSA5Foq zR^Q{gpY74L?00^?JZ@y5__aP|`aGBh1|7>2r=*WFVW@m+neXiGUjAX&mc&jmK%6JX z=enu!p?jkhZxIz)I*GR~@Su~$-1Dg^%X;ZY!9)jIRxRJoBphc%iqy?}g(ajI>fF@m zb0QrCiD&%omFYJ{=lbuhR8>)WzeLFQP9AIN;?a05|Uv@E*D^y|H-4q2GmIj1wUlOkKi+@^77Wc9V zI`(Z?FmXsWFyOT4N-+ha^E19BYd<$Zj@-;qzva9*Ah4H^C#4CLe;PY!8lGzffGfT;=%_fi0&~-xj~2p-)r@mL2TjM^8aS)EJr66df2CzPB2GQ#mi} zZ=S%xa%6n-2#X6m`thv7UB4XQ;N$gb)d8R7$4@qG{HzxGs3@hFfla}5G+*Cz*HeL< z6t9JjrWO)1`hz{YY?``*@yS*9wcdHfl&@Go1;YVbJV+%3*}gdJazz>hKmCAP_V94~ zIzZ{`-2q-}+(Qzb z%dge1rLL_va*H(KtB-gt_sz{(-o7gTxl#|ropusjIc?k}D69Hr;UsQFmT0#eT-rR!y4sAP59Yl~h5gq8p{_{L+97!RB8MF@{$OK2L@wtyzofR{9aVy$OuN960ZF=G|$@6RL zvll@F&t;NiHF&$c9h8mwvhcs}qO~AgF41_3{YdY-ru@N@DeQi}xrfoEJn_L}C{Xq| z-#@6e(VP2f;dol^fYaF%xhg3l2@GM}{3>=hWh#m2q?nLvEC{FJ)$;-s+K%SD!fat0 z?CkM%oX<&Li>R{z4YYasz|Kxs*z54)_dm&`(Uwd%T&+ouRCa9I#^cTs0vB&)yNlg$ zhcXR^f-ryVRD8B5F&lJb#z|i=UL3a0I>gr2@oen#o*+a|+1gSY$PYd+jaUx5FoJ2h zdfbz_U1^|#$tsS4B1B(y_Y!+hi}BGo{E+2sbcIaXih?gsoUYncW3DRby%!O>M*t)h z&qlIp`uS{dOr=$SC~q%{Y!2@K-RsZwl^U8LE54KC70aoSZaUCbq;Z8Gk4Bl^lz-1x z)=_v-Y3WwxbTjGG%*}q=J30=YP;}8PL78Wi*J%?y5Ym4a^=K`puspY_bd;u0O^>}@)i(L|? zClIt-9@)D{E_Et-y1LUrXS)P(MFbXogTxC-FtyVRdb{{#OF0)+Lh@{k64}pzq|D4r zanUZ{=ns6B{8Fa6KU6jLN!;W5zc6jWNc<|?`PyfQUCqMCh+>2e8cB%`oD&pZefAyY zXJA-Zb7CT7zv}zR^sXMHRt87DDpalRu)8}5@v+os&B-~eiHG&m%3(Awy%%#!YC817 zK8~Y7)Orpe5#~j#BxcgyTx9&9ff5A!H)SH<(oA?J;GKU>D`w*n(BFY4 zwtWiq>K6vwrVHcwwF#ovdl@-6Se^7l4Gmf(C2I0X=>Q=lI*9YGHOEi<#EV+U`J~3*zmjq>v0*A7Hq%V5g|F)lAP4%6<(L*qs2X191F=RQ2E;yhQk zEt2Q$byPv%N2{+34pq4+KM;5#_uZQ;2YKC^&;fPcovz>+p0aJ|kzJ7h^{6M>xcZvN zU(?&J$WOz=j6CZp-&^V_a85Q}Vhzz6_xGsVx&=Rbgb6wgYnpG|$6Tv(LUrX!j>^}~ zv6Xqlue=4C(s@yF z&2R!05n;q^jJrRAu-?6B_?7Y($SouE*Tb$i`5Fes?{355^!tYS&mB_)@6U_>dH?4J z|MUKT4A7jMEstl;Mi4&W`3?j28T7B{$L_EjuAfehF{zAy6)Dq|C;{*J?{xq7(a$)( zsJRS=_`jc=x8HI%ef$GHBteV?IhOhP3h@s+yL~V#U#nPecPf%5-*=K`3jdzqm>9>f z`4vn}%=jdR6zq5Se~-6FRV^6r-G88TWMBkPZNX zWqTEtkhBAz-g-}ceDHlODq6g9dxC}v2Vk6++%akqKX;bOz{Uyj_T)r$WS*e)oE*Dp z?sm84D&uuFaLW3DaLH(a3Q+ksl|h2e{?zKGoDy!yf63q&Tld3yY^1S_R#ddT<%so2 zrdsN@RCP-3v12$Ck^{GEg|_%2$h6PfR29c~%=f!Kn^`l8zLBvq$3g+%6&YorB8%e- zZO);4{f;K-JJ$zXmx1r46A~*+M#-_ktfnBZaiZWcDKu0I?~3cE?V7Qm;@cfaVx`hZjSng zD10^;fKD5|y8+oaIscJXun}r!XKR&x0~xMP4y{k#^-RQq zamyVC$sD&{T4uUr)W(aerQsqx&I>MBf+a$%skD4xso{EW5^&M>klwyK?cVwLmcTOL z7t~rtEZ{a@=WggaiF2iRvtg{AoK|zxR0<;)7he-s4e)6voYXu|-`%fJ93nionV8}X zze@QvguXlqG2O@|$mP&dD$+hAFd;DTJ}FSJ*uKAF0VY#%uFs0clc>~kbF3{U3DDB} zLU>99pW>NoYVPwDu}~muskmu+u$$ef{Hfdx@ri1w)A92^D8(s*4lkE<-n7CM^hxVU zx=3lsVXC-3h4j6Hp^$LSfqq4Gv9Av0cffPmx%Gi;!tMa=PhUn5nd!=T24m~xvzy06 z*zT0>RX37@rWo+t{A6-+h@rAZZ`hrv5;>auER9zua^D;Vn51=<+<%SbvuyQjJRgPj z8?rK&j#%v_$7Ym(bh)yc+~r4rz_2_48JLVD{1{<;ia;sr?<_=UbC^L&&iG#1Bp-Y6+N5eHeqg;I1xS* zUkPBoX}|@#(x${oRhonXxkWHzkOUhKqT4!_wbk#-lBVf&^uTd#9j;Kj&U#pOd?%9u zd@%HGBf-DgcXtU@S5R;Bw(H;#+Ak>vcf=;{;-D^SqXj)!qIddD(O7y$ocZOEBa~+Z zooY@ZHOK2#DR%EwL*w4e$1~{XQ#2}I7iY*>lEv#8m*N+eDt(QPCo>l!cQ#*pJ*H1v z7taRN58r}v1B=B_7EG&AtMyD;q+{Io8eh`El=6-Oy)Ewat2*33{#pI}?|I|PBPPzP z7hz%)i0vyDst}BEY++QzXq?=Nxj-uPWmi?JC@65e+fL<0gH3JNm?qU+)cDj}rY&<# znX@Zk_q5zLM7u)p6hro_radaNpDs`)D<53$;!E2*VkdQU9Ydv_1BpV7;Y$qb&D6hs zlD=8*EuTs=f6IM*Qt#4i_`)F;^a~L z2ZWv;;oHo=6ToaHSu3d9BE)j!U}Pj`WtF9!s)5kTRv&HOCsCpTbf~|5$D=Vrn(+z= zR@BYb?x+*xe^xHSbs1xe%z)yrlD5f@a&6>Tn zwYx0`Qi!4>i-?8OPyIOeW_Eq3iO_U*>#3BkD^#!Mwu$vmMnMXj+F%^m}>8{phha4sOP_&l_HbD+p;y&`RP-3uhnqmpV^j=(`jqR%*;6ZM~lol z?KBjvfBV<3cYwnA&-UpdJhE?>mK^QxPX8EU1BZxd zsmt-w>?;Av3<(HHOFvTt*|sEcb++VUMtbkG%ddoMI&g*d{Sgh8IdcY}DgT>6qBIvu zSOlIOQM&_&X(w_Rx!Mq#*7e3e#`)dK%|TLT4X9|c3=9WLNWndn zZI_A#1hdZ`$gxmDxtVO}=PTu}mXK&QJL(0P;77gpr@@r1|ENTKhxMkeAz?xSJ7es$ z>gFm^SWB{q*h4jWIT-k^Zpy-hQ}#7%pK?^rfkQg-&E+!^1BayF{^Vvmu9fv(x1h+{qY@j zSs*19oivl8p2puY&%39jaT-?p^}y9t*=caMP|7rZ^PzIvu+^UEzUt}S- z7512+Ig=GkI?mV!ym3-SH-Zv2*{SA?UGKUm`AS=@X-~h~prk@0+7-66uv1+|6<{!K z)xQ239Ft6tu)?jFpYIS%dpY6y;34w*(b;BeHrFHCtomo2&VohzkK+YsX43EKFU4$+ zPv+z^kWF^C)2N_fC-jOkf5m?(b}xnhyI~)UGNj3)q;lRYdKOC2eijy@WzZG|@VF#&=P)6+~|veGfGJnJ3=eks|G8S4c_=p<<rvG=iBYY0s*D^5A0PS@|g}o3tW?-k&&&bscLk+ z%u%506pZna+VNW-11nu1jtAY`+^?9XwT*4JmV~n}CzWyC1-@(3(tER_-FFK^d})A3 z-Oc)K+|^=QQ(XmF)CVMprr;BXU)c2Gi5LkZNk)5nn@kmSfhI|_x%7A1W_E)5d8NO( z`?kSDM|aP_dNN>Cj9Ejuuf~)UAqdKH`YU~@e!bDtvxZ*2BOdF)6v!71hfmdjKsk!! zL_~MRMjz?VHp!SZ4RtM!D@Vc-UrP!tpzu#lkP>gzrkp`5F*~Xpw#x^V@_F|wRW3@K zDTv|2?!k0){l4E&zSZt-EDmRs2je2+KtZWPu`XEja@W7UPD|nh{UTLg9@l=0yIH} zJ|WK&qX7Fq_5EWe1=sW!IPQrOE!WnBHRqJYxX?bD54**`>PO=P}RzV^rcgtiWYt)~k< z*gX~EbkX)NaEnH#)>E?(xObFZT?gwMCD#2e&@L#1oCwZoDvVUe1Urs04l)9H3m%I(o ztWf^qIWBE863xDJEG!L!iXLHs+?oJjfd)Y;j9+h8c3P`~s!M_YuGeSfQy7p;1Yy3};^=6C1J8Hfe z{qZ8l?P2g#5`?ac@AOvgwchOUbiYP>&~J<3OB&w)5ObC0HlVZO9~zR$cXs2ak~5(k zcV2SH7jI8kzp>e=QFIAmC~aQaY}pG#7(R6Bkyn!F>SnhpD2P**s|Jf}<9&y&VT#nQg@mZiG5q~sX8`vl6E?f$%5*ewm` z`}bgM?WJgL_(1gVqdCUy4>S9`o2J;@1>Ps?-fBNaJc@C2SK0%U})^sD* z^9bp-jo2*s8j;rC&h|_>$zX#?3u6Q$>=5y|x$^h)1k=vo1*g91FXJ30)5GD_0A!KB z+EY@ogd?8&BjER8gn!AEIv>~wzkEVS{*AObi^z8_Om1gU*ItP5&H|(p)8_>sl*&pJ zAd68X_dvh-xjmzSzZ<(qYG9AG1!vMs-}5gERX<$iKVcY7mo;i1rG=-4&i{ASH$I1f zADmpJBrSRu#n^G6smj6$V_skS{V-uDXv@08uMV;iQ;z=JZ#|ett02HbX8wC}FsZz^Yu%zN-9vQ* zt!N(faZJ%(Y}gdCt%~RVv0w4~OM=h-zs>`(-QoY4hx(j$m1W)s)%&@J@(&*o5hQ6RyHe zX#I*0`{P015bZqdyZ>bYv9_>uAn)^UVAWfQxoi9n^i^>k`c)iHgaxGtm<7}v^w>KI zXsOGJ_qJLrSNjqk4@4051<$^?_Tt>=MCL2lU zsh20!0~SD`m-9`TGR|YQb;n5fSy0{JSq+b)QkVDhKdo@#?KZGpRdOr;ls(@Zdrm$P zPoaarp+xFR$P6~%*6)G-XEhO5LZFTg*U8f9kf&ai^0mVGs_8C4nXQk}`X2zU#T9xB zd;a2|S)wk)tYOmubbn72{I0Of_Hd6YspB`&zB~8$oVOltD>FD(SNCN-j15AKCd*c) zS9~$W_eI(g8Gl8WSxfjU^mpb~i7uqK(3fp|WUzsfxpH!)A3u^1(Fgwi5xIxzR?Gi( zrBS&ixAe$K@ilGi`&}7Jd_d5Gk4@t>tuVrjTVFHRSDxF~qFq~>H6HR0Dg^^JIr$Pg z3sWzESKFXN)sT>D9AdPL2@M~m*R-AG9P?$fRKIEGSSw)zmE0l*p(ly%$3(v$SxP*s zmf6d#ao=9(Zqqc2iKNm4KsEeTanZwwvw9A1dAIk{`v}&8dyl{Nh<*m0fB+8#1=?jB z*2_W|75D&r{3~f`RKmLRg0D>n;y8Y)5hDcqyi>)46+NFx zLriI0+l$6r)JE(JZ*5>3=90E^*V-CYzqIj_WF=B)UY)#+1wE7#|9)lf*{nVUj%nXt zJyg_<42o6V4bby0UtGgVqob|MfKFgtK&O}Agam2TU- zct{7jx_RF@qwnL(s~L||VP`qV!OlPh{zd!B^pv{5L#mUqw3_hP{&+>v0w5a|h?=%5nX`%C#;`uM4NTm8dZQjH9`{ zJ1{Jc!Q$BClR-?36QfE~thV6_7|xdeISBnnI(WxuK8gRr(a^;O%3#u@*Xf~1oqQP1 z3Zu+4f8uAI?2*_RwrT#23-jc#bz(x|I>J{*uLyokSHRpPX?vF5_evqVfGC+GgiV7iA=E_35v{HPl z{1V%5+Ur$O8lS<;JG~fP7_1-pf0{ebuqLv$j|UV`x(Fg&LAt;$h)4+th@ez~&;tlc z?*gF(P*;#HND&aC^w6So5{fHTkR~P4ks>`ode1u)-F?>G=X&1q;pI!NOolVb%$fV# z=l}oRXL_@fyXfO~G2^p&hpD`!l|*9M$B$~cvhyr4TFu#y4ujyx3pWho_Kt{~J1Z1i zSm^%d>YRcN*ZF+pJ>%l!$8~|?_BYRAQA2M7$e@#{>nT^Q+UtLPVC^jkQp}ESQ@cI- zSm40EJK5usaxF{0ILosD(3_hq6&88Tb_M<=U+)v#FwxVjF}GXE7sHfY-n%+>4g`fe z#yaYVd}&6~zry|Y;cW0VO`~5bsGqU=EnEG5c9C9yn7EMGs;u{!hnvn4Se%3WuuJ$n zNF5pl|IBYh(J@{?4teVeGPy-GP}oH&hjyGbxq1yIxjA7T3{Od9HWMLv0?`nX;G@9XG)OcSn@cI zbI&U@IbIE#@6QSq#+QRJlp9rmx-UH06nz-ON3NZ=w9Z_wlPf{n zq=HIHGh@u35~Pb=mE|&XDr8#q@Ux>CU)h3DROI2>q2!t8y=}4WQ^Ruc->i;e@DA&L z8iRv&GKS52BEid=$#)d_-zZr2EbR)~BVELO{|24yyp z-;5ae3{oK<#cbI4eg%Qp25#Mu*X1%_nWHkJVwxMP0%w5+sD>kfGoa=C;8vwvLJ8|X zr|`?~$&aBwec+trRD8$&uwUvGA7*O`#J*1UO*%!Z=35Y|9m4g9BQ{syj_`+u6# zyTJv*`^BsD(SCNdrYX$udp5QkvwWDsJ`%@T$@N{;5O7udgN?ngwxDu*6gi>)!Jg8C zi0;6xKAv8x5>s9I=1PXbnJb^}dx7%=zFL98FNc>r)2pdNN67By4!)p1ff4VW8$Q-# zWUn8Muzs0h2V@>VTiM5&kmv-SxGv?wwt4Ot;eg!wDq6}i0-EdKE zGUXG0=)UZWP}V`rwKCZ3RW8n*Ow7IS$Ojwtt&_5Gc5lErP|%vOk!(w_c4A*KI5R&88w9n=q?K=Q# zr}?%;OS#yDiotp^_kXk8oGm zd?YREfpm3qb8$2c$Nh^T{{V$N0iHlWLv)4t0*oPs#bbM>ja$<)FW2b$O+P<{EPw1A z`uY>sT&**-E*|UQSqH;_-{CO8adcl~{w>A#KO6<%y=Sdk{$>>5ivU;9mf#&m32>>3 zQhF`9@GVPh)f2hY51lqek*HN%wdsi0=SR`gb-3vh+s;rHDJH(+^aD? z)%yXmWAi3Q{l;Plj)%-#eG%XjmN(_tAzTMW5y%)BmnWJJKX-olo8r$G%-slQ%eCX(iR>|1jZcI&0mpsygZ=jUD1e~@S z>t9BMh4GE3)B!W+y=_OpA#lx*J^Av;6#Y+)Ehnyse=xQXF}LH;3wj5!eu{9*ga1Nt z5-pEFY_gnKKw~OvBimkV+W7KiV=$=G_Ocw3o?+a8#StWRHN9pBtOsO|_R<3op^ffV zZ_|mxAAW;S^9go1M6gz!2GaC*6P*@6JTSyH?edjX67c>@x@Eg*9e&MxS51kU07(eR z`77}O-KCMHe(!SYuxUQYBrrC-D+j?w*; zVLR$t{#n(ww{-X+hT9vfpE4T7o_}UQ^HRM1;A3OhFCk`gFQ%m`v0jw*W9yd5((U+NdfE zxDEqob^l*SgO(Ns9(JP|2{wqVp)96VLF;0z_r{12H$r6IX6|zg`-y^K_sh}0& ze+vHILyx4yoA-iMK;CBrn>q|(+$e_?bXy~SKz0DxJ{*`SI4wd|x$-t5@sh}wO%YX| zwm8kT(=Bi3HXDZc)x{pC_If=@Nd)-sO^NT2-Sr?DEPF(Z-%uvr&8aNcps%KqN|d(rWG1gE1wz3*~tSMI;T`A z?J>kn_UU$%af0Cn&gg7KrDycc_NKzS4r5LmCSYCY2zMsaj@;1714+K_{UBqZ{t)m> zX8V!xW~89{zmk0yC4TnxlusW8ptFFb2;}t#b6>tn@+=Tpp!=BAlF)Y`n>SK-`1Fp` zhX#dawHExV*Zd#M1FX4Z4ul%5yq+lLI0JP4l9^=vosH#o22&P|sp@-*9kbzC7f`ef zgA(U5*C?^4oJ|1}G9@aI&W7FX%h_g^ZLA(Ff=tD^9rBwL#CN(z&2vvAb z>XK{0-cN=ozT_1;e*{;HiTsGv!HqmdBE5N!l7pjoi9Kpe#$;!87|Z#S*8_$NWt>1oo+RxS&Q$7x6|u-Ng0B-9wFO`+ZP6kRtE!(LGEj%+4*^ z19gztiqLfRUCm-xeMB2aV45|cQz%s~Uslqa1whTB5Ke}uBfC1>O3Jw`nB1ob;0 z?Y=xPvmNc>mdY8ikEJeML;i|G(<;w=SDtp{a?~RR+d0NXI|gwdZ}p}RpDyM?^m;X< zytOgy>JJsA!zE)PS6q5Ybdmc0W>*8cr%Ys7jzTY~%X3+Qh9AniiPHZ&Tai0Xz@xu_ zp5gv}<@)35-$(IJ|H!YAh|rD~2bwzm2&JpGzCAjdbj?-KWr@d~#EN(z>h|IfW_s%c z{%C&tif`Udn}{st@CxN{0!hoy(6fJ~Lg{z{WJEB*2W2uh0q1LS{Tr8%@?!DAuV0#; zUvveueR_A7;lLo$zYk@=NZ_)xQwI7-wg7qBH8^m-=FP;TNDqPtEQJcfr=+wiOUMN0 zdyt$WRc{nI9eIYKC7o9@m@jr*NyHdFa)|D6`YK;u-K1F1 zi_oM*6}1JZ!+jO$60mmf-x11rmpYlw-%p|Z?6nlBRj?NBO`Y{G&ftL%&bVfbYN%%$ zdCa=n;jLzj-u_L)9{WVD&C#H;H-qDx^nlIi=j!)Ocm-0t@L@#Wo4=jF$oz*)9k`gT zE&d~*acp{d->n%(?FP4)MP6 zv_A<=Fg;)S%5gaFrwSD|X~t43>@{;?{&@sLfxd z7D`bIU8YdmaZsCgeIA}X&*@~XrB-8}{&Nk1aOndr7 zM_Y4o=VI^1peuzCyQh;#RsmSw4W6; zr!Ig>L;FPY-^sryA3fzFE_ikOV7uMaTxE-Q$E0w#@K>3gaKnez<*o3W>Ip*0-M)=; zk$e@t``O$N5|oGeS6{wG&K0?~1#9eV4%`<9L28oBQV-8!T0ry?0?q80x8E&?^c3N) zZZ4TRg?$*&(=<#PF8!jtH%KJp7}xcg$RHG)LK>%Aj(#W*xb-lNOhOUs1z%w~dlVh^ z@_v1ycs6=tfY zDKO_LVzP$^hnsh~S9^5}&(vhtchaL6De|iW@u_M;kEUzz#R63mx|D{qvgjv?3;371 zdI8HYitRq+$yXO7FtnY2V7q(i$=_}X-Q2w>a2R{`#$y8Vc#p;k4sQ57x+A zD+9|?)w8TekJqnVSjEgj=R8V~5;mVD$O-V=`Mm!9b|d70zW8bRiw%{xhe$xDU0zk5&9 zbej3-qM7ozf3SnGd^!)p5o7|;8~w(Kb{QhB?221k^$#AX;ydEHNAy{cW_{}#Bth#4U}6_Qjnkd zL1tx`4q*?}8TvdP97E}+w)u}&`IHGyIC5X_>b;+yBr!9bmFGMpXbSlgAS{)x61NQa za5t$);R73Cui?WyWLBVG?0T0i4ZkL4wgyxYfoKBEr2UslTvy)Xa#~AQlCaH9p@%mt zyEjf6`sjj;bODoujRg@Xbo709Sm01aceai)RdHT6~vn|wB0ldQ_~7L@3@x1R?Gp3RY;yFS5eB>Eu?v%FpyeRxD!`i|sT z0j>SalOV%l&AB*3O){YgfyT_c1!|l=de;ENw+GcF;qiMhj5gM$+M%S&ajxt^vVDgY z1pnK@er;uI!eT994(#oVJ>oJs+-5?l`dKJIalw}j!LO&9Na=+3>^z0daMZ@*x=c)1 z6tI+Kim9VIccAI;`eGYVjz!&bihaF=P*JCm_LG6=Jq!eU?ov?v*G#;-t*$o-$h@mw zo2FCr7jd88Eo2LF*9+`He6)-j--ap{n@=k_C1zyY$s@Xs3VmCqbw_igPyDbLpeuO1 zvXz3uY5&@qa`p+!WEJ(4bA=C#HaCNt5f7_!z^1(0Lh~7;@CVmFM_|wZV@vevbMf}f zV@|(a*mkTh_tMg^lkiuc6zoZp4L%Oa6*^5bk?oSwjOEU??0uO2n=2AN@|JVKt`cH* zEi;DOEu)&Y$gCWt0(8GNQ7WnNBr(~-pmbi>ME6@#B}X&kz?+NEqiG)eLMp-ap89%& z&|~QiC~+?#a24(2 z^q+_)Ce*MLiH^0LpbA__ZX#~aJP{~mmicfS_j}?fnP~@+dH%*P4k-kNUJ9dDnJLMJ zd4*8stTso-9&7lncFR}HU*KVcNy%p4_r5^Oa5=Zz=1Rw)`~*kHqc{h@|<#Q787nbMGo%O%PKMn@g7En#U`{J<3#-}a=e-E|lP&-_cnYZ){x41rbC@tpX zb*s)oOW1eV1zk<&6?(h9^M!$dfo@FBr}3yAVdiV%3+!UY>8|rg+ticQqKc}c zdKWg{@3kh?V20Z61}2)LAync~>#2~t$%liE(D<^#;a1LL>oILZrvZOZ47s%>Nf)AP zHu|~y!IfjoVrK1>W`oe^ix(bPxC;E#rpA%*GDrmlYB3F7 zm}QKgWF_()W2YsqyQIU*iv?yr)aQ=tTdH&2@W9HPFT=v+9+CvgjZu3M`8OA-)6k5H zBlM0FoaK_Dsh?3X|dC54W0SiooL8WAuP0!N752`x8kY@ELtnrgS5jKH88>i^6LsGAZ1Qj+ILwR#`KZ z`VQYAs_l2~Fec6v1PO=S5QuAW!6OBbwB#g6UA^6Mf-~OKvN#tHiX^b}sZfv#>e}%p zxV7Cdk8M#RcG7L?algT7P>xJjEIfOM0X;K+2UA7iIB#Ouo!k z&5BSREFFJ16-8Jp>Uu&GC$wc@H-8%{LNMRq&@Yrroe}rxifYW{)pYP%LP~I@y`G!i z5b}3(Rva8wZB5zfDXNlBA?ybu;tKm83@Cv>Ad}FUxjrGVpuLOk4c+oBS*CA;D)zY4 zM9Hz;nD}n#Rsp&2`sPP0ylRM8CRg*eR^>r){p^L^D*rRXwdgS{i(bOVw#cXcmPPHj zev@AMSxZ!{=fdP2er3U27GJ-u#=DXeWXi0j`rZo@n0>ksY9Muqw~@Zl z4dP4@Rd4l`s#Ye8fPc zU(Jh&`ZOu`mgf1j&Z%Su|V zSavP~6*(g}i!-c5lJyk`40n5}kA(XM!9tSS0+6;kj_SPY?0#~b_g7<4_sVdloZ`Mc zpYvCu5T!3^ax`DqpfcZnG1( zzw&gI&V-7rReKLrAeEFh{B|*7&V|Ff{x{|zDe3oNTdLw8)(0JAioV6cxVGur6J1-E z?n+jgnZ5C9SlCbC)`Y}!gg3Wyq-?imVb}Hbs!|s`y6bUwFcS^yFy21AupsjG%>gPU z+(?fA`8@w>;r#arPJJFh8tzO-gfqfcIQa{*- zI=Kpb@JeuUJ1q!Q;iWCSX<}MqF;W#LF78}f!z#&@?tJqm-m`(>%$?eeL`U9i&Dk?; zm=;rTYL!d+8bq*mE2WXF79qFTq)NfbY`0Nh=09h0DXMz+lbprUt7~sd$A^QSbI1~I zhJOfoZd}H0SMg@R-y8c;Ocjp+i}Thlp>4dJ@e~~ezL>ZBUbEE{(%`bqGNmZZr;Qt) z31IYO_Rjuu$#ETax7Jy6wMn_a`-stYnVALf7ffyCXSG+n?d`D}R zfX9#K7T9ZWc)-4}VR_2ilB6EMQ!rH3tV|$~>;ry8>!*cJ*6(AtD)lpNTp{c<_oea1 zJ87GMK<^r6X|e;O&d(Bq0y|8|vVnW&x;xPJQ($>l&<#eQ_stLkYlcICcZZw0NPrq< zH1O_lQyRtb?uVOx?EXg!2fP1Yws3Gj(EsW?{A&vbUm5h@{1yMMg~M|s97!O)X5*cr UIOjPIG!MF^q;aEA!TiyG0f4c#8UO$Q diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/monitoring/nagios/hostgroups.cfg b/pkg/registry/zookeeper-3.4.6/src/contrib/monitoring/nagios/hostgroups.cfg deleted file mode 100644 index ea59a66e8..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/contrib/monitoring/nagios/hostgroups.cfg +++ /dev/null @@ -1,25 +0,0 @@ -# Licensed to the Apache Software Foundation (ASF) under one -# or more contributor license agreements. See the NOTICE file -# distributed with this work for additional information -# regarding copyright ownership. The ASF licenses this file -# to you 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. - -# A group containing all the ZooKeeper nodes - -define hostgroup { - hostgroup_name zookeeper-servers - alias ZooKeeper Servers - members localhost -} - - diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/monitoring/nagios/services.cfg b/pkg/registry/zookeeper-3.4.6/src/contrib/monitoring/nagios/services.cfg deleted file mode 100644 index dde6ab759..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/contrib/monitoring/nagios/services.cfg +++ /dev/null @@ -1,67 +0,0 @@ -# Licensed to the Apache Software Foundation (ASF) under one -# or more contributor license agreements. See the NOTICE file -# distributed with this work for additional information -# regarding copyright ownership. The ASF licenses this file -# to you 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. - -# ZooKeeper Node specific services - -define service { - hostgroup_name zookeeper-servers - use generic-service - service_description ZK_Open_File_Descriptors_Count - check_command check_zk_node!zk_open_file_descriptor_count!500!800 -} - -define service { - hostgroup_name zookeeper-servers - use generic-service - service_description ZK_Ephemerals_Count - check_command check_zk_node!zk_ephemerals_count!10000!100000 -} - -define service { - hostgroup_name zookeeper-servers - use generic-service - service_description ZK_Avg_Latency - check_command check_zk_node!zk_avg_latency!500!1000 -} - -define service { - hostgroup_name zookeeper-servers - use generic-service - service_description ZK_Max_Latency - check_command check_zk_node!zk_max_latency!1000!2000 -} - -define service { - hostgroup_name zookeeper-servers - use generic-service - service_description ZK_Min_Latency - check_command check_zk_node!zk_min_latency!500!1000 -} - -define service { - hostgroup_name zookeeper-servers - use generic-service - service_description ZK_Outstanding_Requests - check_command check_zk_node!zk_outstanding_requests!20!50 -} - -define service { - hostgroup_name zookeeper-servers - use generic-service - service_description ZK_Watch_Count - check_command check_zk_node!zk_watch_count!100!500 -} - diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/monitoring/nagios/zookeeper.cfg b/pkg/registry/zookeeper-3.4.6/src/contrib/monitoring/nagios/zookeeper.cfg deleted file mode 100644 index ed4cfab83..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/contrib/monitoring/nagios/zookeeper.cfg +++ /dev/null @@ -1,30 +0,0 @@ -# Licensed to the Apache Software Foundation (ASF) under one -# or more contributor license agreements. See the NOTICE file -# distributed with this work for additional information -# regarding copyright ownership. The ASF licenses this file -# to you 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. - -# 'check_zookeeper' command definition -define command { - command_name check_zookeeper - command_line /usr/lib/nagios/plugins/check_zookeeper.py -s "localhost:2181,localhost:2182,localhost:2183" -o nagios -k '$ARG1$' -w '$ARG2$' -c '$ARG3$' - # ATTENTION: you should update the list of servers defined above -} - -# 'check_zk_node' command definition -define command { - command_name check_zk_node - command_line /usr/lib/nagios/plugins/check_zookeeper.py -s $HOSTADDRESS$:2181 -o nagios -k '$ARG1$' -w '$ARG2$' -c '$ARG3$' - # ATTENTION: you should update the port. default: 2181 -} - diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/monitoring/test.py b/pkg/registry/zookeeper-3.4.6/src/contrib/monitoring/test.py deleted file mode 100644 index 3941291fc..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/contrib/monitoring/test.py +++ /dev/null @@ -1,282 +0,0 @@ -#! /usr/bin/env python -# Licensed to the Apache Software Foundation (ASF) under one -# or more contributor license agreements. See the NOTICE file -# distributed with this work for additional information -# regarding copyright ownership. The ASF licenses this file -# to you 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. - -import unittest -import socket -import sys - -from StringIO import StringIO - -from check_zookeeper import ZooKeeperServer, NagiosHandler, CactiHandler, GangliaHandler - -ZK_MNTR_OUTPUT = """zk_version\t3.4.0--1, built on 06/19/2010 15:07 GMT -zk_avg_latency\t1 -zk_max_latency\t132 -zk_min_latency\t0 -zk_packets_received\t640 -zk_packets_sent\t639 -zk_outstanding_requests\t0 -zk_server_state\tfollower -zk_znode_count\t4 -zk_watch_count\t0 -zk_ephemerals_count\t0 -zk_approximate_data_size\t27 -zk_open_file_descriptor_count\t22 -zk_max_file_descriptor_count\t1024 -""" - -ZK_MNTR_OUTPUT_WITH_BROKEN_LINES = """zk_version\t3.4.0 -zk_avg_latency\t23 -broken-line - -""" - -ZK_STAT_OUTPUT = """Zookeeper version: 3.3.0-943314, built on 05/11/2010 22:20 GMT -Clients: - /0:0:0:0:0:0:0:1:34564[0](queued=0,recved=1,sent=0) - -Latency min/avg/max: 0/40/121 -Received: 11 -Sent: 10 -Outstanding: 0 -Zxid: 0x700000003 -Mode: follower -Node count: 4 -""" - -class SocketMock(object): - def __init__(self): - self.sent = [] - - def settimeout(self, timeout): - self.timeout = timeout - - def connect(self, address): - self.address = address - - def send(self, data): - self.sent.append(data) - return len(data) - - def recv(self, size): - return ZK_MNTR_OUTPUT[:size] - - def close(self): pass - -class ZK33xSocketMock(SocketMock): - def __init__(self): - SocketMock.__init__(self) - self.got_stat_cmd = False - - def recv(self, size): - if 'stat' in self.sent: - return ZK_STAT_OUTPUT[:size] - else: - return '' - -class UnableToConnectSocketMock(SocketMock): - def connect(self, _): - raise socket.error('[Errno 111] Connection refused') - -def create_server_mock(socket_class): - class ZooKeeperServerMock(ZooKeeperServer): - def _create_socket(self): - return socket_class() - return ZooKeeperServerMock() - -class TestCheckZookeeper(unittest.TestCase): - - def setUp(self): - self.zk = ZooKeeperServer() - - def test_parse_valid_line(self): - key, value = self.zk._parse_line('something\t5') - - self.assertEqual(key, 'something') - self.assertEqual(value, 5) - - def test_parse_line_raises_exception_on_invalid_output(self): - invalid_lines = ['something', '', 'a\tb\tc', '\t1'] - for line in invalid_lines: - self.assertRaises(ValueError, self.zk._parse_line, line) - - def test_parser_on_valid_output(self): - data = self.zk._parse(ZK_MNTR_OUTPUT) - - self.assertEqual(len(data), 14) - self.assertEqual(data['zk_znode_count'], 4) - - def test_parse_should_ignore_invalid_lines(self): - data = self.zk._parse(ZK_MNTR_OUTPUT_WITH_BROKEN_LINES) - - self.assertEqual(len(data), 2) - - def test_parse_stat_valid_output(self): - data = self.zk._parse_stat(ZK_STAT_OUTPUT) - - result = { - 'zk_version' : '3.3.0-943314, built on 05/11/2010 22:20 GMT', - 'zk_min_latency' : 0, - 'zk_avg_latency' : 40, - 'zk_max_latency' : 121, - 'zk_packets_received': 11, - 'zk_packets_sent': 10, - 'zk_server_state': 'follower', - 'zk_znode_count': 4 - } - for k, v in result.iteritems(): - self.assertEqual(v, data[k]) - - def test_recv_valid_output(self): - zk = create_server_mock(SocketMock) - - data = zk.get_stats() - self.assertEqual(len(data), 14) - self.assertEqual(data['zk_znode_count'], 4) - - def test_socket_unable_to_connect(self): - zk = create_server_mock(UnableToConnectSocketMock) - - self.assertRaises(socket.error, zk.get_stats) - - def test_use_stat_cmd_if_mntr_is_not_available(self): - zk = create_server_mock(ZK33xSocketMock) - - data = zk.get_stats() - self.assertEqual(data['zk_version'], '3.3.0-943314, built on 05/11/2010 22:20 GMT') - -class HandlerTestCase(unittest.TestCase): - - def setUp(self): - try: - sys._stdout - except: - sys._stdout = sys.stdout - - sys.stdout = StringIO() - - def tearDown(self): - sys.stdout = sys._stdout - - def output(self): - sys.stdout.seek(0) - return sys.stdout.read() - - -class TestNagiosHandler(HandlerTestCase): - - def _analyze(self, w, c, k, stats): - class Opts(object): - warning = w - critical = c - key = k - - return NagiosHandler().analyze(Opts(), {'localhost:2181':stats}) - - def test_ok_status(self): - r = self._analyze(10, 20, 'a', {'a': 5}) - - self.assertEqual(r, 0) - self.assertEqual(self.output(), 'Ok "a"!|localhost:2181=5;10;20\n') - - r = self._analyze(20, 10, 'a', {'a': 30}) - self.assertEqual(r, 0) - - def test_warning_status(self): - r = self._analyze(10, 20, 'a', {'a': 15}) - self.assertEqual(r, 1) - self.assertEqual(self.output(), - 'Warning "a" localhost:2181!|localhost:2181=15;10;20\n') - - r = self._analyze(20, 10, 'a', {'a': 15}) - self.assertEqual(r, 1) - - def test_critical_status(self): - r = self._analyze(10, 20, 'a', {'a': 30}) - self.assertEqual(r, 2) - self.assertEqual(self.output(), - 'Critical "a" localhost:2181!|localhost:2181=30;10;20\n') - - r = self._analyze(20, 10, 'a', {'a': 5}) - self.assertEqual(r, 2) - - def test_check_a_specific_key_on_all_hosts(self): - class Opts(object): - warning = 10 - critical = 20 - key = 'latency' - - r = NagiosHandler().analyze(Opts(), { - 's1:2181': {'latency': 5}, - 's2:2181': {'latency': 15}, - 's3:2181': {'latency': 35}, - }) - self.assertEqual(r, 2) - self.assertEqual(self.output(), - 'Critical "latency" s3:2181!|s1:2181=5;10;20 '\ - 's3:2181=35;10;20 s2:2181=15;10;20\n') - -class TestCactiHandler(HandlerTestCase): - class Opts(object): - key = 'a' - leader = False - - def __init__(self, leader=False): - self.leader = leader - - def test_output_values_for_all_hosts(self): - r = CactiHandler().analyze(TestCactiHandler.Opts(), { - 's1:2181':{'a':1}, - 's2:2181':{'a':2, 'b':3} - }) - self.assertEqual(r, None) - self.assertEqual(self.output(), 's1_2181:1 s2_2181:2') - - def test_output_single_value_for_leader(self): - r = CactiHandler().analyze(TestCactiHandler.Opts(leader=True), { - 's1:2181': {'a':1, 'zk_server_state': 'leader'}, - 's2:2181': {'a':2} - }) - self.assertEqual(r, 0) - self.assertEqual(self.output(), '1\n') - - -class TestGangliaHandler(unittest.TestCase): - - class TestableGangliaHandler(GangliaHandler): - def __init__(self): - GangliaHandler.__init__(self) - self.cli_calls = [] - - def call(self, cli): - self.cli_calls.append(' '.join(cli)) - - def test_send_single_metric(self): - class Opts(object): - @property - def gmetric(self): return '/usr/bin/gmetric' - opts = Opts() - - h = TestGangliaHandler.TestableGangliaHandler() - h.analyze(opts, {'localhost:2181':{'latency':10}}) - - cmd = "%s -n latency -v 10 -t uint32" % opts.gmetric - assert cmd in h.cli_calls - -if __name__ == '__main__': - unittest.main() - diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/rest/NOTICE.txt b/pkg/registry/zookeeper-3.4.6/src/contrib/rest/NOTICE.txt deleted file mode 100644 index 2a9225442..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/contrib/rest/NOTICE.txt +++ /dev/null @@ -1,7 +0,0 @@ -This contrib module includes software developed under the -COMMON DEVELOPMENT AND DISTRIBUTION LICENSE (CDDL) Version 1.0 - -This contrib depends on binary only jar libraries developed at: - -https://jersey.dev.java.net/ -https://grizzly.dev.java.net/ diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/rest/README.txt b/pkg/registry/zookeeper-3.4.6/src/contrib/rest/README.txt deleted file mode 100644 index 30f2e5d19..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/contrib/rest/README.txt +++ /dev/null @@ -1,72 +0,0 @@ - -ZooKeeper REST implementation using Jersey JAX-RS. --------------------------------------------------- - -This is an implementation of version 2 of the ZooKeeper REST spec. - -Note: This interface is currently experimental, may change at any time, -etc... In general you should be using the Java/C client bindings to access -the ZooKeeper server. - -This REST ZooKeeper gateway is useful because most of the languages -have built-in support for working with HTTP based protocols. - -See SPEC.txt for details on the REST binding. - -Quickstart: ------------ - -1) start a zookeeper server on localhost port 2181 - -2) run "ant run" - -3) use a REST client to access the data (see below for more details) - - curl http://localhost:9998/znodes/v1/ - -or use the provided src/python scripts - - zk_dump_tree.py - - -Tests: ----------- - -1) the full testsuite can be run via "ant test" target -2) the python client library also contains a test suite - -Examples Using CURL -------------------- - -First review the spec SPEC.txt in this directory. - -#get the root node data -curl http://localhost:9998/znodes/v1/ - -#get children of the root node -curl http://localhost:9998/znodes/v1/?view=children - -#get "/cluster1/leader" as xml (default is json) -curl -H'Accept: application/xml' http://localhost:9998/znodes/v1/cluster1/leader - -#get the data as text -curl -w "\n%{http_code}\n" "http://localhost:9998/znodes/v1/cluster1/leader?dataformat=utf8" - -#set a node (data.txt contains the ascii text you want to set on the node) -curl -T data.txt -w "\n%{http_code}\n" "http://localhost:9998/znodes/v1/cluster1/leader?dataformat=utf8" - -#create a node -curl -d "data1" -H'Content-Type: application/octet-stream' -w "\n%{http_code}\n" "http://localhost:9998/znodes/v1/?op=create&name=cluster2&dataformat=utf8" - -curl -d "data2" -H'Content-Type: application/octet-stream' -w "\n%{http_code}\n" "http://localhost:9998/znodes/v1/cluster2?op=create&name=leader&dataformat=utf8" - -#create a new session -curl -d "" -H'Content-Type: application/octet-stream' -w "\n%{http_code}\n" "http://localhost:9998/sessions/v1/?op=create&expire=10" - -#session heartbeat -curl -X "PUT" -H'Content-Type: application/octet-stream' -w "\n%{http_code}\n" "http://localhost:9998/sessions/v1/02dfdcc8-8667-4e53-a6f8-ca5c2b495a72" - -#delete a session -curl -X "DELETE" -H'Content-Type: application/octet-stream' -w "\n%{http_code}\n" "http://localhost:9998/sessions/v1/02dfdcc8-8667-4e53-a6f8-ca5c2b495a72" - - diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/rest/SPEC.txt b/pkg/registry/zookeeper-3.4.6/src/contrib/rest/SPEC.txt deleted file mode 100644 index 8c5f70175..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/contrib/rest/SPEC.txt +++ /dev/null @@ -1,355 +0,0 @@ -# Licensed to the Apache Software Foundation (ASF) under one or more -# contributor license agreements. See the NOTICE file distributed with -# this work for additional information regarding copyright ownership. -# The ASF licenses this file to You 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. - -A REST HTTP gateway for ZooKeeper -================================= - -Specification Version: 2 - -ZooKeeper is meant to enable distributed coordination and also store -system configuration and other relatively small amounts of information -that must be stored in a persistent and consistent manner. The -information stored in ZooKeeper is meant to be highly available to a -large number of nodes in a distributed-computing cluster. - -ZooKeeper offers a client-side library that supports rich semantics -that include strict ordering guarantees on operations, the creation of -ephemeral znodes, and the ability to watch for changes to state. -However, where clients need simple "CRUD" (create, read, update, -delete) operations, the ZooKeeper libraries can be cumbersome, both to -the programmers who have to use them (who are increasingly used to -REST-style APIs), and to the operators who have to deploy and update -them (for whom deploying and updating client libraries can be very -painful). - -It turns out that most languages comes with client libraries for HTTP -that are easy and familiar to program against, and deployed as part of -the language runtime. Thus, for simple CRUD clients, an HTTP gateway -would be a less cumbersome interface than the ZooKeeper library. - -This document describes a gatway for using HTTP to interact with a -ZooKeeper repository. - -Binding ZooKeeper to HTTP -------------------------- - -Encoding --------- - -UTF-8 unless otherwise noted - -Paths ------ - -A ZooKeeper paths are mapped to IRIs and URIs as follows. ZK paths -are converted to IRIs by simply percent-encoding any characters in the -ZK path that are not allowed in IRI paths. ZK paths are converted to -URIs by mapping them first to IRIs, then converting to URIs in the -standard way. - -Going from URIs and IRIs is the reverse of the above but for one -difference: any "." and ".." segments in an IRI or URI must be folded -before conversion. (Fortunately, ZK does not allow "." and ".." -segments in its paths.) - -ZK and IRIs recommend the same practices when it comes to Unicode -normalization: ultimately, normalization is left to application -designers, but both recommend that application designers use NFC as a -best practice. - -Root ----- - -The following examples assume that the ZooKeeper znode heirarchy is -bound to the root of the HTTP servers namespace. This may not be the -case in practice however, the gateway may bind to some prefix, for -example the URL for accessing /a/b/c may be: - - http://localhost/zookeeper/znodes/v1/a/b/c - -This is perfectly valid. Users of the REST service should be aware of -this fact and code their clients to support any root (in this case -"/zookeeper" on the server localhost). - - -Basics: GET, PUT, HEAD, and DELETE ----------------------------------- - -HTTP's GET, PUT, HEAD, and DELETE operations map naturally to -ZooKeeper's "get," "set," "exists," and "delete" operations. - -ZooKeeper znodes have a version number that changes each time the -znode's value is updated. This number is returned by "get," "set," and -"exists" operations. The "set" and "delete" operations optionally take -a version number. If one is supplied, then "set" or "delete" will fail -if the current version of the znode doesn't match the version-number -supplied in the call. This mechanism supports atomic read-modify-write -cycles. Set/delete requests may include an optional parameter -"version" which defaults to no version check. - - -Getting ZooKeeper children --------------------------- - -We overload the GET method to return the children of a ZooKeeper. In -particular, the GET method takes an optional parameter "view" which -could be set to one of type values, either "data" or "children". The -default is "data". Thus, to get the children of a znode named -"/a/b/c", then the GET request should start: - - GET /znodes/v1/a/b/c?view=children HTTP/1.1 - -If the requested view is "data", then the data of a znode is returned -as described in the previous section. If the requested view is -"children", then a list of children is returned in either an XML -document, or in a JSON object. (The default is JSON, but this can be -controlled changed by setting the Accept header.) - - -Creating a ZooKeeper session ----------------------------- - -In order to be able to create ephemeral nodes you first need to start -a new session. - - POST /sessions/v1?op=create&expire= HTTP/1.1 - -If the session creation is successful, then a 201 code will be returned. - -A session is just an UUID that you can pass around as a parameter and -the REST server will foward your request on the attached persistent -connection. - -Keeping a session alive ------------------------ - -To keep a session alive you must send hearbeat requests: - - PUT /sessions/v1/ HTTP/1.1 - -Closing a ZooKeeper session ---------------------------- - -You can close a connection by sending a DELETE request. - - DELETE /sessions/v1/ HTTP/1.1 - -If you don't close a session it will automatically expire after -the amount of time you specified on creation. - -Creating a ZooKeeper znode --------------------------- - -We use the POST method to create a ZooKeeper znode. For example, to -create a znode named "c" under a parent named "/a/b", then the POST -request should start: - - POST /znodes/v1/a/b?op=create&name=c HTTP/1.1 - -If the creation is successful, then a 201 code will be returned. If -it fails, then a number of different codes might be returned -(documented in a later subsection). - -ZooKeeper's create operation has a flag that tells the server to -append a sequence-number to the client-supplied znode-name in order to -make the znode-name unique. If you set this flag and ask to create a -znode named "/a/b/c", and a znode named "/a/b" already exists, then -"create" will create a znode named "/a/b/c-#" instead, where "#" is and -integer required to generate a unique name in for format %10d. - -To obtain this behavior, an additional "sequence=true" parameter -should be added to the parameters of the POST. (Note that "sequence" -is an optional parameter, that defaults to "false"; this default may -be provided explicitly if desired.) - -On success the actual path of the created znode will be returned. - -If you want to create an ephemeral node you need to specify an -additional "ephemeral=true" parameter. (Note that "ephemeral" is an optional -parameter, that defaults to "false") - -(Note: ZooKeeper also allows the client to set ACLs for the -newly-created znode. This feature is not currently supported by the -HTTP gateway to ZooKeeper.) - - -Content types and negotiation ------------------------------ - -ZooKeeper REST gateway implementations may support three content-types -for request and response messages: - -* application/octet-stream - - HEAD - returns nothing (note below: status = 204) - GET - returns the znode data as an octet-stream - PUT - send binary data, returns nothing - POST - send binary data, returns the name of the znode - DELETE - returns nothing - - For PUT and HEAD some other content-type (i.e. JSON or XML) must be - used to access the Stat information of a znode. - -* application/json, application/javascript & application/xml - - HEAD - returns nothing - GET - returns a STAT or CHILD structure - PUT - send binary data, returns a STAT structure (sans data field) - POST - send binary data, returns a PATH structure - DELETE - returns nothing - - (structures defined below) - - Results returning DATA may include an optional "dataformat" - parameter which has two possible values; base64 (default) or - utf8. This allows the caller to control the format of returned data - and may simplify usage -- for example cat'ing results to the command - line with something like curl, or accessing a url through a browser. - Care should be exercised however, if utf8 is used on non character - data errors may result. - - "application/javascript" requests may include an optional "callback" - parameter. The response is wrapped in a callback method of your - choice. e.g. appending &callback=foo to your request will result in - a response body of: foo(...). Callbacks may only contain - alphanumeric characters and underscores. - -PATH - path : string - uri: string - - path is the full path to the znode as seen by ZooKeeper - - uri is the full URI of the znode as seen by the REST server, does not - include any query parameters (i.e. it's the path to the REST resource) - -SESSION - id : string UUID - uri : string - -CHILD - PATH - child_uri_template: string - children : [ string* ] - - The children list of strings contains only the name of the child - znodes, not the full path. - - child_uri_template is a template for URI of child znodes as seen by the - REST server. e.g. "http://localhost:9998/znodes/v1/foo/{child}", where - foo is the parent node, and {child} can be substituted with the name - of each child in the children array in order to access that resource. - This template is provided to simplify child access. - -STAT - PATH - encoding : value of "base64" or "utf8" - data : base64 or utf8 encoded string - stat : - czxid : number - mzxid : number - ctime : number - mtime : number - version : number - cversion : number - aversion : number - ephemeralOwner : number - datalength : number - numChildren : number - pzxid : number - - -Error Codes ------------ - -The ZooKeeper gateway uses HTTP response codes as follows: - - * 200 (Success) - ZOK for "get" "set" "delete", "yes" case of "exists" (json/xml) - * 201 (Created) - ZOK for "create" - * 204 (No Content) - ZOK for "yes" case of "exists" (octet) - * 400 (Bad Request) - ZINVALIDACL, ZBADARGUMENTS, version param not a number - * 401 (Unauthorized) - ZAUTHFAILED - * 404 (Not Found) - ZOK for "no" case of "exists;" ZNONODE for "get," "set," and "delete" - * 409 (Conflict) - ZNODEEXISTS, ZNONODE for "create," ZNOTEMPTY, - * 412 (Precondition Failed) - ZBADVERSION - * 415 (Unsupported Media Type) - if content-type of PUT or POST is not "application/octet-stream" - * 500 (Internal Server Error) - Failure in gateway code - * 501 (Not Implemented) - HTTP method other than GET, PUT, HEAD, DELETE - * 502 (Bad Gateway) - All other ZooKeeper error codes - * 503 (Service Unavailable) - ZSESSIONEXPIRED, ZCONNECTIONLOSS, (gateway will try to reestablish the connection, but will not hold the request waiting...) - * 504 (Gateway Timeout) - ZOPERATIONTIMEOUT, or ZooKeeper does not return in a timely manner - -Note that these are the codes used by the HTTP-to-Gateway software -itself. Depending on how this software is configured into a Web -server, the resulting Web Server might behave differently, e.g., it -might do redirection, check other headers, etc. - -Error Messages --------------- - -Error messages are returned to the caller, format is dependent on the -format requested in the call. - -* application/octet-stream - - A string containing the error message. It should include the request - and information detailing the reason for the error. - -* application/json - - { "request":"GET /a/b/c", "message":"Node doesn't exist" } - -* application/xml - - - - GET /a/b/c - Node doesn't exist - - - -Binding ZooKeeper to an HTTP server ------------------------------------ - -It might be sage to assume that everyone is happy to run an Apache -server, and thus write a "mod_zookeeper" for Apache that works only -for the Apache Web Server. However, different operational -environments prefer different Web Servers, and it would be nice to -support more than one Web server. - -Issues: - - * Configuration. - - * Defining a root: Need to provide a URL alias and associate it - with a server. Need to be able to map different aliases to - different servers (implemented via multiple ZK connections). - - * Sharing connection across multiple processes. - - * Asynchronous. - - * Adaptors. - - * Code re-use. - - -Authentication -- TBD, not currently supported - -...the config file should contain authentication material for the gateway - -...the config file should contain an ACL list to be passed along to "create" - -...would we ever want to authenticate each request to ZooKeeper?... diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/rest/build.xml b/pkg/registry/zookeeper-3.4.6/src/contrib/rest/build.xml deleted file mode 100644 index 649dff752..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/contrib/rest/build.xml +++ /dev/null @@ -1,167 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Tests failed! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/rest/conf/keys/README b/pkg/registry/zookeeper-3.4.6/src/contrib/rest/conf/keys/README deleted file mode 100644 index 085810a06..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/contrib/rest/conf/keys/README +++ /dev/null @@ -1,8 +0,0 @@ - -In order to generate .jks (java keystore files) you need to use keytool. - -The password for the existing .jks is "123456" (without quotes). - -Some tutorials: - - http://www.mobilefish.com/tutorials/java/java_quickguide_keytool.html - diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/rest/conf/keys/rest.cer b/pkg/registry/zookeeper-3.4.6/src/contrib/rest/conf/keys/rest.cer deleted file mode 100644 index 13e5aabe562f0d0507d3c6709a3a3527ce258f19..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 595 zcmXqLV)8d=V%)KSnTe5!iNz;sF0TPE8>d#AN85K^Mn+av27??!0RuiZ=1>+kVfN6x z?7aN)JeUXvh6p=`2p5J3H--o^T*N?5oY&C6z{0@P(9qDt$S_Kr*Vxp+*vK5prL$`q z=Oc#(BP#=QV=se2V<%H%BSYWbGS>f3PJXvm4%r-kd}HQ?l{*@lYdP% zKXaEoN*khNe+YWI`;11mY-+!bZpKk1GMmr3`n#2w6gv+_ab<1?{)@-|1UO&Uzt2^?V`hx> zo~?GG?UC!1EZ6iZIv5CUjxayK`25YYdr9R_ivm4AKHV<1dRh-#_&ZUf9R~ND9?75o t@hPEFdt$!Tolof%M$N1r7$#`FG}+r_l_j^PQl#fZW6;l-MbVp5Spm(9$n*dJ diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/rest/conf/keys/rest.jks b/pkg/registry/zookeeper-3.4.6/src/contrib/rest/conf/keys/rest.jks deleted file mode 100644 index 539e8be7ba44e0dc3cb39deb822280a4fbde67af..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1363 zcmezO_TO6u1_mY|W&~r_+{*0KN+3_m@oVinpv*3VCZ=r$d~96WY>X_7T1J%57Nhc{i> zJWVv!CM&G;pKJ1F`Eydn8DX>4x8`(zSaIhqXF2aCF+QER+=YLS?SH#k?)!w(4c&fo zKk7Exu6e?c<~~{0x^8-+)!C|#nx4Hzp%*`A+gLFCy?gR@u13_fpKF5B^E}t?QD%LX z5p!;a2&0!zztzrfJQuE4uuNJz`+_ZBGXGRVy~N3x4_sq@ysP*sD<$b(+QLw~VQJf^ zd%r)51}K^S)hT4q6me+0D9Pv@6J+`QNqwBGgq^QW4wu%!!n^-UrdS<5b^R%C&&%0P z4eY^tdmqbnE^cj!_&3>X`nC5{w^9e zOV{?oh78_@+vR1aT0TYTHiXuHXY6O4zsqcjWq|M#uBH@?gkBxv?ea?9mlr9w-cks; z<5yI3Pe;MtdVc*b<0GF$T{e}uME}mUG`jcx%f88*G<9O4!+j;~a@{pL%g+A(@Jsf@ z=Dq*Q*%@A0*#j|HF%N9H1UsSl@e|w@_=G=0DQ{9(pYLv@+i)F7E zot$-blI}ET?>>)`3LA&Fys;T}5$&;VX zoqQ30pgLpU^H+)C8_%s;vC4ev#pda=)_ZVdtqgBtnY6HBD);ulD=Ujc=gm9guO7C` zI#kts=@Fg01SN4H%hnr74-PjUoAOCKvE6O*RIl|H+AnAQ?t&!f2t88+OJG6{1}0>G zgC@ou3z(T0nV497qUQ1%@Un4gwRyCC=LM!}RtAF{Ljhn?XAWgy6J`(1%g)O$&x46@ zV2H3|h;U(uaASxt!$l0_#CZ)33@i*x4Gj%Vj0~g1d5ujCjE&5pTspg^aXxZr05dsr zV=se2V<%H%BSYWbGS>f3PJXvm4%r-kd}HQ?l{*@lYdP%KXaEoN*khN ze+YWI`; z11mY-+!bZpKk1GMmr3`n#2w6gv+_ab<1?{)@-|1UO&Uzt2^?V`hx>o~?GG?UC!1 zEZ6iZIv5CUjxayK`25YYdr9R_ivm4AKHV<1dRh-#_&ZUf9R~ND9?75o@hPEFdt$!T zolof%M$N1r7$#`FG}+r_l_j^PQl#fZW6;l-MbVp5S#Ql>`)8x9kFnIL9nVyf=6eU7 H+RO<6^fNHf diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/rest/conf/log4j.properties b/pkg/registry/zookeeper-3.4.6/src/contrib/rest/conf/log4j.properties deleted file mode 100644 index c294b3d4e..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/contrib/rest/conf/log4j.properties +++ /dev/null @@ -1,72 +0,0 @@ -# -# -# Licensed to the Apache Software Foundation (ASF) under one -# or more contributor license agreements. See the NOTICE file -# distributed with this work for additional information -# regarding copyright ownership. The ASF licenses this file -# to you 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. -# -# - -# -# ZooKeeper Logging Configuration -# - -# Format is " (, )+ - -# DEFAULT: console appender only -log4j.rootLogger=INFO, CONSOLE - -# Example with rolling log file -#log4j.rootLogger=DEBUG, CONSOLE, ROLLINGFILE - -# Example with rolling log file and tracing -#log4j.rootLogger=TRACE, CONSOLE, ROLLINGFILE, TRACEFILE - -# -# Log INFO level and above messages to the console -# -log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender -log4j.appender.CONSOLE.Threshold=INFO -log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout -log4j.appender.CONSOLE.layout.ConversionPattern=%d{ISO8601} - %-5p - [%t:%C{1}@%L] - %m%n - -# -# Add ROLLINGFILE to rootLogger to get log file output -# Log DEBUG level and above messages to a log file -log4j.appender.ROLLINGFILE=org.apache.log4j.ConsoleAppender -log4j.appender.ROLLINGFILE.Threshold=DEBUG -log4j.appender.ROLLINGFILE.File=bookkeeper.log -log4j.appender.ROLLINGFILE.layout=org.apache.log4j.PatternLayout -log4j.appender.ROLLINGFILE.layout.ConversionPattern=%d{ISO8601} - %-5p - [%t:%C{1}@%L] - %m%n - -# Max log file size of 10MB -log4j.appender.ROLLINGFILE.MaxFileSize=10MB -# uncomment the next line to limit number of backup files -#log4j.appender.ROLLINGFILE.MaxBackupIndex=10 - -log4j.appender.ROLLINGFILE.layout=org.apache.log4j.PatternLayout -log4j.appender.ROLLINGFILE.layout.ConversionPattern=%d{ISO8601} - %-5p [%t:%C{1}@%L] - %m%n - - -# -# Add TRACEFILE to rootLogger to get log file output -# Log DEBUG level and above messages to a log file -log4j.appender.TRACEFILE=org.apache.log4j.FileAppender -log4j.appender.TRACEFILE.Threshold=TRACE -log4j.appender.TRACEFILE.File=bookkeeper_trace.log - -log4j.appender.TRACEFILE.layout=org.apache.log4j.PatternLayout -### Notice we are including log4j's NDC here (%x) -log4j.appender.TRACEFILE.layout.ConversionPattern=%d{ISO8601} - %-5p [%t:%C{1}@%L][%x] - %m%n diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/rest/conf/rest.properties b/pkg/registry/zookeeper-3.4.6/src/contrib/rest/conf/rest.properties deleted file mode 100644 index f0abb4541..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/contrib/rest/conf/rest.properties +++ /dev/null @@ -1,70 +0,0 @@ -# -# -# Licensed to the Apache Software Foundation (ASF) under one -# or more contributor license agreements. See the NOTICE file -# distributed with this work for additional information -# regarding copyright ownership. The ASF licenses this file -# to you 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. -# -# - -# -# ZooKeeper REST Gateway Configuration file -# - -rest.port = 9998 - -# -# Endpoint definition -# - -# plain configuration ; -rest.endpoint.1 = /;localhost:2181,localhost:2182 - -# ... or chrooted to /zookeeper -# rest.endpoint.1 = /;localhost:2181,localhost:2182/zookeeper - -# HTTP Basic authentication for this endpoint -# rest.endpoint.1.http.auth = root:root1 - -# create -e /a data digest:'demo:ojnHEyje6F33LLzGVzg+yatf4Fc=':cdrwa -# any session on this endpoint will use authentication -# rest.endpoint.1.zk.digest = demo:test - -# you can easily generate the ACL using Python: -# import sha; sha.sha('demo:test').digest().encode('base64').strip() - -# -# ... you can define as many endpoints as you wish -# - -# rest.endpoint.2 = /restricted;localhost:2181 -# rest.endpoint.2.http.auth = admin:pass - -# rest.endpoint.3 = /cluster1;localhost:2181,localhost:2182 -# ** you should configure one end-point for each ZooKeeper cluster -# etc. - -# Global HTTP Basic Authentication -# You should also enable HTTPS-only access -# The authentication credentials are sent as plain text - -# rest.http.auth = guest:guest1 - -# Uncomment the lines bellow to allow https-only access - -# rest.ssl = true -# rest.ssl.jks = keys/rest.jks -# rest.ssl.jks.pass = 123456 - \ No newline at end of file diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/rest/ivy.xml b/pkg/registry/zookeeper-3.4.6/src/contrib/rest/ivy.xml deleted file mode 100644 index 903d3903e..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/contrib/rest/ivy.xml +++ /dev/null @@ -1,48 +0,0 @@ - - - - - - - - ZooKeeper REST - - - - - - - - - - - - - - - - - - - - - - - diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/rest/rest.sh b/pkg/registry/zookeeper-3.4.6/src/contrib/rest/rest.sh deleted file mode 100755 index daa819836..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/contrib/rest/rest.sh +++ /dev/null @@ -1,90 +0,0 @@ -#!/bin/sh - -# Licensed to the Apache Software Foundation (ASF) under one or more -# contributor license agreements. See the NOTICE file distributed with -# this work for additional information regarding copyright ownership. -# The ASF licenses this file to You 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. - -# -# If this scripted is run out of /usr/bin or some other system bin directory -# it should be linked to and not copied. Things like java jar files are found -# relative to the canonical path of this script. -# - -# Only follow symlinks if readlink supports it -if readlink -f "$0" > /dev/null 2>&1 -then - ZKREST=`readlink -f "$0"` -else - ZKREST="$0" -fi -ZKREST_HOME=`dirname "$ZKREST"` - -if $cygwin -then - # cygwin has a "kill" in the shell itself, gets confused - KILL=/bin/kill -else - KILL=kill -fi - -if [ -z $ZKREST_PIDFILE ] - then ZKREST_PIDFILE=$ZKREST_HOME/server.pid -fi - -ZKREST_MAIN=org.apache.zookeeper.server.jersey.RestMain - -ZKREST_CONF=$ZKREST_HOME/conf -ZKREST_LOG=$ZKREST_HOME/zkrest.log - -CLASSPATH="$ZKREST_CONF:$CLASSPATH" - -for i in "$ZKREST_HOME"/lib/*.jar -do - CLASSPATH="$i:$CLASSPATH" -done - -for i in "$ZKREST_HOME"/zookeeper-*.jar -do - CLASSPATH="$i:$CLASSPATH" -done - -case $1 in -start) - echo "Starting ZooKeeper REST Gateway ... " - java -cp "$CLASSPATH" $JVMFLAGS $ZKREST_MAIN >$ZKREST_LOG 2>&1 & - /bin/echo -n $! > "$ZKREST_PIDFILE" - echo STARTED - ;; -stop) - echo "Stopping ZooKeeper REST Gateway ... " - if [ ! -f "$ZKREST_PIDFILE" ] - then - echo "error: could not find file $ZKREST_PIDFILE" - exit 1 - else - $KILL -9 $(cat "$ZKREST_PIDFILE") - rm "$ZKREST_PIDFILE" - echo STOPPED - fi - ;; -restart) - shift - "$0" stop ${@} - sleep 3 - "$0" start ${@} - ;; -*) - echo "Usage: $0 {start|stop|restart}" >&2 - -esac diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/rest/src/java/org/apache/zookeeper/server/jersey/RestMain.java b/pkg/registry/zookeeper-3.4.6/src/contrib/rest/src/java/org/apache/zookeeper/server/jersey/RestMain.java deleted file mode 100644 index 954ad045b..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/contrib/rest/src/java/org/apache/zookeeper/server/jersey/RestMain.java +++ /dev/null @@ -1,151 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you 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. - */ - -package org.apache.zookeeper.server.jersey; - -import java.io.File; -import java.io.IOException; -import java.net.URISyntaxException; -import java.net.URL; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.apache.zookeeper.server.jersey.cfg.Credentials; -import org.apache.zookeeper.server.jersey.cfg.Endpoint; -import org.apache.zookeeper.server.jersey.cfg.RestCfg; -import org.apache.zookeeper.server.jersey.filters.HTTPBasicAuth; - -import com.sun.grizzly.SSLConfig; -import com.sun.grizzly.http.embed.GrizzlyWebServer; -import com.sun.grizzly.http.servlet.ServletAdapter; -import com.sun.jersey.spi.container.servlet.ServletContainer; - -/** - * Demonstration of how to run the REST service using Grizzly - */ -public class RestMain { - - private static Logger LOG = LoggerFactory.getLogger(RestMain.class); - - private GrizzlyWebServer gws; - private RestCfg cfg; - - public RestMain(RestCfg cfg) { - this.cfg = cfg; - } - - public void start() throws IOException { - System.out.println("Starting grizzly ..."); - - boolean useSSL = cfg.useSSL(); - gws = new GrizzlyWebServer(cfg.getPort(), "/tmp/23cxv45345/2131xc2/", useSSL); - // BUG: Grizzly needs a doc root if you are going to register multiple adapters - - for (Endpoint e : cfg.getEndpoints()) { - ZooKeeperService.mapContext(e.getContext(), e); - gws.addGrizzlyAdapter(createJerseyAdapter(e), new String[] { e - .getContext() }); - } - - if (useSSL) { - System.out.println("Starting SSL ..."); - String jks = cfg.getJKS("keys/rest.jks"); - String jksPassword = cfg.getJKSPassword(); - - SSLConfig sslConfig = new SSLConfig(); - URL resource = getClass().getClassLoader().getResource(jks); - if (resource == null) { - LOG.error("Unable to find the keystore file: " + jks); - System.exit(2); - } - try { - sslConfig.setKeyStoreFile(new File(resource.toURI()) - .getAbsolutePath()); - } catch (URISyntaxException e1) { - LOG.error("Unable to load keystore: " + jks, e1); - System.exit(2); - } - sslConfig.setKeyStorePass(jksPassword); - gws.setSSLConfig(sslConfig); - } - - gws.start(); - } - - public void stop() { - gws.stop(); - ZooKeeperService.closeAll(); - } - - private ServletAdapter createJerseyAdapter(Endpoint e) { - ServletAdapter jersey = new ServletAdapter(); - - jersey.setServletInstance(new ServletContainer()); - jersey.addInitParameter("com.sun.jersey.config.property.packages", - "org.apache.zookeeper.server.jersey.resources"); - jersey.setContextPath(e.getContext()); - - Credentials c = Credentials.join(e.getCredentials(), cfg - .getCredentials()); - if (!c.isEmpty()) { - jersey.addFilter(new HTTPBasicAuth(c), e.getContext() - + "-basic-auth", null); - } - - return jersey; - } - - /** - * The entry point for starting the server - * - */ - public static void main(String[] args) throws Exception { - RestCfg cfg = new RestCfg("rest.properties"); - - final RestMain main = new RestMain(cfg); - main.start(); - - Runtime.getRuntime().addShutdownHook(new Thread() { - @Override - public void run() { - main.stop(); - System.out.println("Got exit request. Bye."); - } - }); - - printEndpoints(cfg); - System.out.println("Server started."); - } - - private static void printEndpoints(RestCfg cfg) { - int port = cfg.getPort(); - - for (Endpoint e : cfg.getEndpoints()) { - - String context = e.getContext(); - if (context.charAt(context.length() - 1) != '/') { - context += "/"; - } - - System.out.println(String.format( - "Started %s - WADL: http://localhost:%d%sapplication.wadl", - context, port, context)); - } - } - -} diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/rest/src/java/org/apache/zookeeper/server/jersey/ZooKeeperService.java b/pkg/registry/zookeeper-3.4.6/src/contrib/rest/src/java/org/apache/zookeeper/server/jersey/ZooKeeperService.java deleted file mode 100644 index 21d27a993..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/contrib/rest/src/java/org/apache/zookeeper/server/jersey/ZooKeeperService.java +++ /dev/null @@ -1,242 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you 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. - */ - -package org.apache.zookeeper.server.jersey; - -import java.io.IOException; -import java.util.HashMap; -import java.util.Map; -import java.util.Set; -import java.util.Timer; -import java.util.TimerTask; -import java.util.TreeSet; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.apache.zookeeper.WatchedEvent; -import org.apache.zookeeper.Watcher; -import org.apache.zookeeper.ZooKeeper; -import org.apache.zookeeper.Watcher.Event.KeeperState; -import org.apache.zookeeper.server.jersey.cfg.Endpoint; - -/** - * Singleton which provides JAX-RS resources access to the ZooKeeper client. - * There's a single session for each base uri (so usually just one). - */ -public class ZooKeeperService { - - private static Logger LOG = LoggerFactory.getLogger(ZooKeeperService.class); - - /** Map base uri to ZooKeeper host:port parameters */ - private static Map contextMap = new HashMap(); - - /** Map base uri to ZooKeeper session */ - private static Map zkMap = new HashMap(); - - /** Session timers */ - private static Map zkSessionTimers = new HashMap(); - private static Timer timer = new Timer(); - - /** Track the status of the ZooKeeper session */ - private static class MyWatcher implements Watcher { - final String contextPath; - - /** Separate watcher for each base uri */ - public MyWatcher(String contextPath) { - this.contextPath = contextPath; - } - - /** - * Track state - in particular watch for expiration. if it happens for - * re-creation of the ZK client session - */ - synchronized public void process(WatchedEvent event) { - if (event.getState() == KeeperState.Expired) { - close(contextPath); - } - } - } - - /** ZooKeeper session timer */ - private static class SessionTimerTask extends TimerTask { - - private int delay; - private String contextPath, session; - private Timer timer; - - public SessionTimerTask(int delayInSeconds, String session, - String contextPath, Timer timer) { - delay = delayInSeconds * 1000; // convert to milliseconds - this.contextPath = contextPath; - this.session = session; - this.timer = timer; - reset(); - } - - public SessionTimerTask(SessionTimerTask t) { - this(t.delay / 1000, t.session, t.contextPath, t.timer); - } - - @Override - public void run() { - if (LOG.isInfoEnabled()) { - LOG.info(String.format("Session '%s' expired after " - + "'%d' milliseconds.", session, delay)); - } - ZooKeeperService.close(contextPath, session); - } - - public void reset() { - timer.schedule(this, delay); - } - - } - - /** - * Specify ZooKeeper host:port for a particular context path. The host:port - * string is passed to the ZK client, so this can be formatted with more - * than a single host:port pair. - */ - synchronized public static void mapContext(String contextPath, Endpoint e) { - contextMap.put(contextPath, e); - } - - /** - * Reset timer for a session - */ - synchronized public static void resetTimer(String contextPath, - String session) { - if (session != null) { - String uri = concat(contextPath, session); - - SessionTimerTask t = zkSessionTimers.remove(uri); - t.cancel(); - - zkSessionTimers.put(uri, new SessionTimerTask(t)); - } - } - - /** - * Close the ZooKeeper session and remove it from the internal maps - */ - public static void close(String contextPath) { - close(contextPath, null); - } - - /** - * Close the ZooKeeper session and remove it - */ - synchronized public static void close(String contextPath, String session) { - String uri = concat(contextPath, session); - - TimerTask t = zkSessionTimers.remove(uri); - if (t != null) { - t.cancel(); - } - - ZooKeeper zk = zkMap.remove(uri); - if (zk == null) { - return; - } - try { - zk.close(); - } catch (InterruptedException e) { - LOG.error("Interrupted while closing ZooKeeper connection.", e); - } - } - - /** - * Close all the ZooKeeper sessions and remove them from the internal maps - */ - synchronized public static void closeAll() { - Set sessions = new TreeSet(zkMap.keySet()); - for (String key : sessions) { - close(key); - } - } - - /** - * Is there an active connection for this session? - */ - synchronized public static boolean isConnected(String contextPath, - String session) { - return zkMap.containsKey(concat(contextPath, session)); - } - - /** - * Return a ZooKeeper client not tied to a specific session. - */ - public static ZooKeeper getClient(String contextPath) throws IOException { - return getClient(contextPath, null); - } - - /** - * Return a ZooKeeper client for a session with a default expire time - * - * @throws IOException - */ - public static ZooKeeper getClient(String contextPath, String session) - throws IOException { - return getClient(contextPath, session, 5); - } - - /** - * Return a ZooKeeper client which may or may not be connected, but it will - * not be expired. This method can be called multiple times, the same object - * will be returned except in the case where the session expires (at which - * point a new session will be returned) - */ - synchronized public static ZooKeeper getClient(String contextPath, - String session, int expireTime) throws IOException { - final String connectionId = concat(contextPath, session); - - ZooKeeper zk = zkMap.get(connectionId); - if (zk == null) { - - if (LOG.isInfoEnabled()) { - LOG.info(String.format("creating new " - + "connection for : '%s'", connectionId)); - } - Endpoint e = contextMap.get(contextPath); - zk = new ZooKeeper(e.getHostPort(), 30000, new MyWatcher( - connectionId)); - - for (Map.Entry p : e.getZooKeeperAuthInfo().entrySet()) { - zk.addAuthInfo("digest", String.format("%s:%s", p.getKey(), - p.getValue()).getBytes()); - } - - zkMap.put(connectionId, zk); - - // a session should automatically expire after an amount of time - if (session != null) { - zkSessionTimers.put(connectionId, new SessionTimerTask( - expireTime, session, contextPath, timer)); - } - } - return zk; - } - - private static String concat(String contextPath, String session) { - if (session != null) { - return String.format("%s@%s", contextPath, session); - } - return contextPath; - } - -} diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/rest/src/java/org/apache/zookeeper/server/jersey/cfg/Credentials.java b/pkg/registry/zookeeper-3.4.6/src/contrib/rest/src/java/org/apache/zookeeper/server/jersey/cfg/Credentials.java deleted file mode 100644 index 0730be57c..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/contrib/rest/src/java/org/apache/zookeeper/server/jersey/cfg/Credentials.java +++ /dev/null @@ -1,47 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you 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. - */ - -package org.apache.zookeeper.server.jersey.cfg; - -import java.util.HashMap; - -public class Credentials extends HashMap { - - public static Credentials join(Credentials a, Credentials b) { - Credentials result = new Credentials(); - result.putAll(a); - result.putAll(b); - return result; - } - - public Credentials() { - super(); - } - - public Credentials(String credentials) { - super(); - - if (!credentials.trim().equals("")) { - String[] parts = credentials.split(","); - for(String p : parts) { - String[] userPass = p.split(":"); - put(userPass[0], userPass[1]); - } - } - } -} diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/rest/src/java/org/apache/zookeeper/server/jersey/cfg/Endpoint.java b/pkg/registry/zookeeper-3.4.6/src/contrib/rest/src/java/org/apache/zookeeper/server/jersey/cfg/Endpoint.java deleted file mode 100644 index 2a6278250..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/contrib/rest/src/java/org/apache/zookeeper/server/jersey/cfg/Endpoint.java +++ /dev/null @@ -1,72 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you 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. - */ - -package org.apache.zookeeper.server.jersey.cfg; - -public class Endpoint { - - private String context; - private HostPortSet hostPort; - private Credentials credentials; - private Credentials zookeeperAuth; - - public Endpoint(String context, String hostPortList) { - this.context = context; - this.hostPort = new HostPortSet(hostPortList); - } - - public String getContext() { - return context; - } - - public String getHostPort() { - return hostPort.toString(); - } - - public Credentials getCredentials() { - return credentials; - } - - public void setCredentials(String c) { - this.credentials = new Credentials(c); - } - - public void setZooKeeperAuthInfo(String digest) { - zookeeperAuth = new Credentials(digest); - } - - public final Credentials getZooKeeperAuthInfo() { - return zookeeperAuth; - } - - @Override - public boolean equals(Object o) { - Endpoint e = (Endpoint) o; - return context.equals(e.context); - } - - @Override - public int hashCode() { - return context.hashCode(); - } - - @Override - public String toString() { - return String.format("", context, hostPort.toString()); - } -} diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/rest/src/java/org/apache/zookeeper/server/jersey/cfg/HostPort.java b/pkg/registry/zookeeper-3.4.6/src/contrib/rest/src/java/org/apache/zookeeper/server/jersey/cfg/HostPort.java deleted file mode 100644 index 51a1bdd2c..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/contrib/rest/src/java/org/apache/zookeeper/server/jersey/cfg/HostPort.java +++ /dev/null @@ -1,51 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you 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. - */ - -package org.apache.zookeeper.server.jersey.cfg; - -public class HostPort { - - private String host; - private int port; - - public HostPort(String hostPort) { - String[] parts = hostPort.split(":"); - host = parts[0]; - port = Integer.parseInt(parts[1]); - } - - public String getHost() { - return host; - } - - public int getPort() { - return port; - } - - @Override - public boolean equals(Object o) { - HostPort p = (HostPort) o; - return host.equals(p.host) && port == p.port; - } - - @Override - public int hashCode() { - return String.format("%s:%d", host, port).hashCode(); - } - -} diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/rest/src/java/org/apache/zookeeper/server/jersey/cfg/HostPortSet.java b/pkg/registry/zookeeper-3.4.6/src/contrib/rest/src/java/org/apache/zookeeper/server/jersey/cfg/HostPortSet.java deleted file mode 100644 index 301a5656c..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/contrib/rest/src/java/org/apache/zookeeper/server/jersey/cfg/HostPortSet.java +++ /dev/null @@ -1,51 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you 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. - */ - -package org.apache.zookeeper.server.jersey.cfg; - -import java.util.HashSet; -import java.util.Set; - -public class HostPortSet { - - private Set hostPortSet = new HashSet(); - private String original; - - public HostPortSet(String hostPortList) { - original = hostPortList; - - int chrootStart = hostPortList.indexOf('/'); - String hostPortPairs; - if (chrootStart != -1) { - hostPortPairs = hostPortList.substring(0, chrootStart); - } else { - hostPortPairs = hostPortList; - } - - String[] parts = hostPortPairs.split(","); - for(String p : parts) { - hostPortSet.add(new HostPort(p)); - } - } - - @Override - public String toString() { - return original; - } - -} diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/rest/src/java/org/apache/zookeeper/server/jersey/cfg/RestCfg.java b/pkg/registry/zookeeper-3.4.6/src/contrib/rest/src/java/org/apache/zookeeper/server/jersey/cfg/RestCfg.java deleted file mode 100644 index c7730201d..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/contrib/rest/src/java/org/apache/zookeeper/server/jersey/cfg/RestCfg.java +++ /dev/null @@ -1,106 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you 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. - */ - -package org.apache.zookeeper.server.jersey.cfg; - -import java.io.IOException; -import java.io.InputStream; -import java.util.HashSet; -import java.util.Properties; -import java.util.Set; - -public class RestCfg { - - private Properties cfg = new Properties(); - - private Set endpoints = new HashSet(); - private Credentials credentials = new Credentials(); - - public RestCfg(String resource) throws IOException { - this(RestCfg.class.getClassLoader().getResourceAsStream(resource)); - } - - public RestCfg(InputStream io) throws IOException { - cfg.load(io); - extractEndpoints(); - extractCredentials(); - } - - private void extractCredentials() { - if (cfg.containsKey("rest.http.auth")) { - credentials = new Credentials(cfg.getProperty("rest.http.auth", "")); - } - } - - private void extractEndpoints() { - int count = 1; - while (true) { - String e = cfg.getProperty( - String.format("rest.endpoint.%d", count), null); - if (e == null) { - break; - } - - String[] parts = e.split(";"); - if (parts.length != 2) { - count++; - continue; - } - Endpoint point = new Endpoint(parts[0], parts[1]); - - String c = cfg.getProperty(String.format( - "rest.endpoint.%d.http.auth", count), ""); - point.setCredentials(c); - - String digest = cfg.getProperty(String.format( - "rest.endpoint.%d.zk.digest", count), ""); - point.setZooKeeperAuthInfo(digest); - - endpoints.add(point); - count++; - } - } - - public int getPort() { - return Integer.parseInt(cfg.getProperty("rest.port", "9998")); - } - - public boolean useSSL() { - return Boolean.valueOf(cfg.getProperty("rest.ssl", "false")); - } - - public final Set getEndpoints() { - return endpoints; - } - - public final Credentials getCredentials() { - return credentials; - } - - public String getJKS() { - return cfg.getProperty("rest.ssl.jks"); - } - - public String getJKS(String def) { - return cfg.getProperty("rest.ssl.jks", def); - } - - public String getJKSPassword() { - return cfg.getProperty("rest.ssl.jks.pass"); - } -} diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/rest/src/java/org/apache/zookeeper/server/jersey/filters/HTTPBasicAuth.java b/pkg/registry/zookeeper-3.4.6/src/contrib/rest/src/java/org/apache/zookeeper/server/jersey/filters/HTTPBasicAuth.java deleted file mode 100644 index 49640b530..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/contrib/rest/src/java/org/apache/zookeeper/server/jersey/filters/HTTPBasicAuth.java +++ /dev/null @@ -1,87 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you 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. - */ - -package org.apache.zookeeper.server.jersey.filters; - -import java.io.IOException; - -import javax.servlet.Filter; -import javax.servlet.FilterChain; -import javax.servlet.FilterConfig; -import javax.servlet.ServletException; -import javax.servlet.ServletRequest; -import javax.servlet.ServletResponse; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; - -import org.apache.zookeeper.server.jersey.cfg.Credentials; - -import com.sun.jersey.core.util.Base64; - -public class HTTPBasicAuth implements Filter { - - private Credentials credentials; - - public HTTPBasicAuth(Credentials c) { - credentials = c; - } - - @Override - public void doFilter(ServletRequest req0, ServletResponse resp0, - FilterChain chain) throws IOException, ServletException { - - HttpServletRequest request = (HttpServletRequest) req0; - HttpServletResponse response = (HttpServletResponse) resp0; - - String authorization = request.getHeader("Authorization"); - if (authorization != null) { - String c[] = parseAuthorization(authorization); - if (c != null && credentials.containsKey(c[0]) - && credentials.get(c[0]).equals(c[1])) { - chain.doFilter(request, response); - return; - } - } - - response.setHeader("WWW-Authenticate", "Basic realm=\"Restricted\""); - response.sendError(401); - } - - private String[] parseAuthorization(String authorization) { - String parts[] = authorization.split(" "); - if (parts.length == 2 && parts[0].equalsIgnoreCase("Basic")) { - String userPass = Base64.base64Decode(parts[1]); - - int p = userPass.indexOf(":"); - if (p != -1) { - return new String[] { userPass.substring(0, p), - userPass.substring(p + 1) }; - } - } - return null; - } - - @Override - public void init(FilterConfig arg0) throws ServletException { - } - - @Override - public void destroy() { - } - -} diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/rest/src/java/org/apache/zookeeper/server/jersey/jaxb/ZChildren.java b/pkg/registry/zookeeper-3.4.6/src/contrib/rest/src/java/org/apache/zookeeper/server/jersey/jaxb/ZChildren.java deleted file mode 100644 index b3fad5544..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/contrib/rest/src/java/org/apache/zookeeper/server/jersey/jaxb/ZChildren.java +++ /dev/null @@ -1,80 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you 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. - */ - -package org.apache.zookeeper.server.jersey.jaxb; - -import java.util.ArrayList; -import java.util.List; - -import javax.xml.bind.annotation.XmlElement; -import javax.xml.bind.annotation.XmlElementWrapper; -import javax.xml.bind.annotation.XmlRootElement; - - -/** - * Represents the CHILD using JAXB. - * Special JSON version is required to get proper formatting in both - * JSON and XML output. See details in ZNodeResource. - */ -@XmlRootElement(name="child") -public class ZChildren { - public String path; - public String uri; - - public String child_uri_template; - @XmlElementWrapper(name="children") - @XmlElement(name="child") - public List children; - - public ZChildren() { - // needed by jersey - children = new ArrayList(); - } - - public ZChildren(String path, String uri, String child_uri_template, - List children) - { - this.path = path; - this.uri = uri; - this.child_uri_template = child_uri_template; - if (children != null) { - this.children = children; - } else { - this.children = new ArrayList(); - } - } - - @Override - public int hashCode() { - return path.hashCode(); - } - - @Override - public boolean equals(Object obj) { - if (!(obj instanceof ZChildren)) { - return false; - } - ZChildren o = (ZChildren) obj; - return path.equals(o.path) && children.equals(o.children); - } - - @Override - public String toString() { - return "ZChildren(" + path + "," + children + ")"; - } -} diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/rest/src/java/org/apache/zookeeper/server/jersey/jaxb/ZChildrenJSON.java b/pkg/registry/zookeeper-3.4.6/src/contrib/rest/src/java/org/apache/zookeeper/server/jersey/jaxb/ZChildrenJSON.java deleted file mode 100644 index 0dcece07e..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/contrib/rest/src/java/org/apache/zookeeper/server/jersey/jaxb/ZChildrenJSON.java +++ /dev/null @@ -1,76 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you 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. - */ - -package org.apache.zookeeper.server.jersey.jaxb; - -import java.util.ArrayList; -import java.util.List; - -import javax.xml.bind.annotation.XmlRootElement; - - -/** - * Represents the CHILD using JAXB. - * Special JSON version is required to get proper formatting in both - * JSON and XML output. See details in ZNodeResource. - */ -@XmlRootElement(name="child") -public class ZChildrenJSON { - public String path; - public String uri; - - public String child_uri_template; - public List children; - - public ZChildrenJSON() { - // needed by jersey - children = new ArrayList(); - } - - public ZChildrenJSON(String path, String uri, String child_uri_template, - List children) - { - this.path = path; - this.uri = uri; - this.child_uri_template = child_uri_template; - if (children != null) { - this.children = children; - } else { - this.children = new ArrayList(); - } - } - - @Override - public int hashCode() { - return path.hashCode(); - } - - @Override - public boolean equals(Object obj) { - if (!(obj instanceof ZChildrenJSON)) { - return false; - } - ZChildrenJSON o = (ZChildrenJSON) obj; - return path.equals(o.path) && children.equals(o.children); - } - - @Override - public String toString() { - return "ZChildrenJSON(" + path + "," + children + ")"; - } -} diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/rest/src/java/org/apache/zookeeper/server/jersey/jaxb/ZError.java b/pkg/registry/zookeeper-3.4.6/src/contrib/rest/src/java/org/apache/zookeeper/server/jersey/jaxb/ZError.java deleted file mode 100644 index e976ee0e3..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/contrib/rest/src/java/org/apache/zookeeper/server/jersey/jaxb/ZError.java +++ /dev/null @@ -1,41 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you 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. - */ - -package org.apache.zookeeper.server.jersey.jaxb; - -import javax.xml.bind.annotation.XmlRootElement; - - -/** - * Represents an ERROR using JAXB. - */ -@XmlRootElement(name="error") -public class ZError { - public String request; - public String message; - - public ZError(){ - // needed by jersey - } - - public ZError(String request, String message) { - this.request = request; - this.message = message; - } - -} diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/rest/src/java/org/apache/zookeeper/server/jersey/jaxb/ZPath.java b/pkg/registry/zookeeper-3.4.6/src/contrib/rest/src/java/org/apache/zookeeper/server/jersey/jaxb/ZPath.java deleted file mode 100644 index 4d8371780..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/contrib/rest/src/java/org/apache/zookeeper/server/jersey/jaxb/ZPath.java +++ /dev/null @@ -1,63 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you 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. - */ - -package org.apache.zookeeper.server.jersey.jaxb; - -import javax.xml.bind.annotation.XmlRootElement; - - -/** - * Represents a PATH using JAXB. - */ -@XmlRootElement(name="path") -public class ZPath { - public String path; - public String uri; - - public ZPath(){ - // needed by jersey - } - - public ZPath(String path) { - this(path, null); - } - - public ZPath(String path, String uri) { - this.path = path; - this.uri = uri; - } - - @Override - public int hashCode() { - return path.hashCode(); - } - - @Override - public boolean equals(Object obj) { - if (!(obj instanceof ZPath)) { - return false; - } - ZPath o = (ZPath) obj; - return path.equals(o.path); - } - - @Override - public String toString() { - return "ZPath(" + path + ")"; - } -} diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/rest/src/java/org/apache/zookeeper/server/jersey/jaxb/ZSession.java b/pkg/registry/zookeeper-3.4.6/src/contrib/rest/src/java/org/apache/zookeeper/server/jersey/jaxb/ZSession.java deleted file mode 100644 index 06ca9e57b..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/contrib/rest/src/java/org/apache/zookeeper/server/jersey/jaxb/ZSession.java +++ /dev/null @@ -1,55 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you 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. - */ - -package org.apache.zookeeper.server.jersey.jaxb; - -import javax.xml.bind.annotation.XmlRootElement; - -@XmlRootElement(name="session") -public class ZSession { - public String id; - public String uri; - - public ZSession() { - // needed by jersey - } - - public ZSession(String id, String uri) { - this.id = id; - this.uri = uri; - } - - @Override - public int hashCode() { - return id.hashCode(); - } - - @Override - public boolean equals(Object obj) { - if(!(obj instanceof ZSession)) { - return false; - } - ZSession s = (ZSession) obj; - return id.equals(s.id); - } - - @Override - public String toString() { - return "ZSession(" + id +")"; - } -} diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/rest/src/java/org/apache/zookeeper/server/jersey/jaxb/ZStat.java b/pkg/registry/zookeeper-3.4.6/src/contrib/rest/src/java/org/apache/zookeeper/server/jersey/jaxb/ZStat.java deleted file mode 100644 index af70d1826..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/contrib/rest/src/java/org/apache/zookeeper/server/jersey/jaxb/ZStat.java +++ /dev/null @@ -1,106 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you 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. - */ - -package org.apache.zookeeper.server.jersey.jaxb; - -import javax.xml.bind.annotation.XmlRootElement; - - -/** - * Represents a STAT using JAXB. - */ -@XmlRootElement(name="stat") -public class ZStat { - public String path; - public String uri; - public byte[] data64; - public String dataUtf8; - - public long czxid; - public long mzxid; - public long ctime; - public long mtime; - public int version; - public int cversion; - public int aversion; - public long ephemeralOwner; - public int dataLength; - public int numChildren; - public long pzxid; - - - public ZStat(){ - // needed by jersey - } - - public ZStat(String path, byte[] data64, String dataUtf8) - { - this.path = path; - this.data64 = data64; - this.dataUtf8 = dataUtf8; - } - - public ZStat(String path, String uri, byte[] data64, String dataUtf8, - long czxid, long mzxid, long ctime, long mtime, int version, - int cversion, int aversion, long ephemeralOwner, int dataLength, - int numChildren, long pzxid) - { - this.path = path; - this.uri = uri; - this.data64 = data64; - this.dataUtf8 = dataUtf8; - - this.czxid = czxid; - this.mzxid = mzxid; - this.ctime = ctime; - this.mtime = mtime; - this.version = version; - this.cversion = cversion; - this.aversion = aversion; - this.ephemeralOwner = ephemeralOwner; - this.dataLength = dataLength; - this.numChildren = numChildren; - this.pzxid = pzxid; - } - - @Override - public int hashCode() { - return path.hashCode(); - } - - /** - * This method considers two ZStats equal if their path, encoding, and - * data match. It does not compare the ZooKeeper - * org.apache.zookeeper.data.Stat class fields. - */ - @Override - public boolean equals(Object obj) { - if (!(obj instanceof ZStat)) { - return false; - } - ZStat o = (ZStat) obj; - return toString().equals(o.toString()); - } - - @Override - public String toString() { - return "ZStat(" + path + "," + "b64[" - + (data64 == null ? null : new String(data64)) + "]," - + dataUtf8 + ")"; - } -} diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/rest/src/java/org/apache/zookeeper/server/jersey/resources/JAXBContextResolver.java b/pkg/registry/zookeeper-3.4.6/src/contrib/rest/src/java/org/apache/zookeeper/server/jersey/resources/JAXBContextResolver.java deleted file mode 100644 index 08935868f..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/contrib/rest/src/java/org/apache/zookeeper/server/jersey/resources/JAXBContextResolver.java +++ /dev/null @@ -1,72 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you 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. - */ - -package org.apache.zookeeper.server.jersey.resources; - -import java.util.Arrays; -import java.util.HashSet; -import java.util.Set; - -import javax.ws.rs.ext.ContextResolver; -import javax.ws.rs.ext.Provider; -import javax.xml.bind.JAXBContext; - -import org.apache.zookeeper.server.jersey.jaxb.ZChildrenJSON; -import org.apache.zookeeper.server.jersey.jaxb.ZPath; -import org.apache.zookeeper.server.jersey.jaxb.ZStat; - -import com.sun.jersey.api.json.JSONConfiguration; -import com.sun.jersey.api.json.JSONJAXBContext; - -/** - * Tell Jersey how to resolve JSON formatting. Specifically detail the - * fields which are arrays and which are numbers (not strings). - */ -@Provider -@SuppressWarnings("unchecked") -public final class JAXBContextResolver implements ContextResolver { - private final JAXBContext context; - - private final Set typesSet; - - public JAXBContextResolver() throws Exception { - Class[] typesArr = - new Class[]{ZPath.class, ZStat.class, ZChildrenJSON.class}; - typesSet = new HashSet(Arrays.asList(typesArr)); - context = new JSONJAXBContext( - JSONConfiguration.mapped() - .arrays("children") - .nonStrings("czxid") - .nonStrings("mzxid") - .nonStrings("ctime") - .nonStrings("mtime") - .nonStrings("version") - .nonStrings("cversion") - .nonStrings("aversion") - .nonStrings("ephemeralOwner") - .nonStrings("dataLength") - .nonStrings("numChildren") - .nonStrings("pzxid") - .build(), - typesArr); - } - - public JAXBContext getContext(Class objectType) { - return (typesSet.contains(objectType)) ? context : null; - } -} diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/rest/src/java/org/apache/zookeeper/server/jersey/resources/KeeperExceptionMapper.java b/pkg/registry/zookeeper-3.4.6/src/contrib/rest/src/java/org/apache/zookeeper/server/jersey/resources/KeeperExceptionMapper.java deleted file mode 100644 index fdfc27b5c..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/contrib/rest/src/java/org/apache/zookeeper/server/jersey/resources/KeeperExceptionMapper.java +++ /dev/null @@ -1,86 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you 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. - */ - -package org.apache.zookeeper.server.jersey.resources; - -import javax.ws.rs.core.Context; -import javax.ws.rs.core.Response; -import javax.ws.rs.core.UriInfo; -import javax.ws.rs.ext.ExceptionMapper; -import javax.ws.rs.ext.Provider; - -import org.apache.zookeeper.KeeperException; -import org.apache.zookeeper.server.jersey.jaxb.ZError; - - -/** - * Map KeeperException to HTTP status codes - */ -@Provider -public class KeeperExceptionMapper implements ExceptionMapper { - private UriInfo ui; - - public KeeperExceptionMapper(@Context UriInfo ui) { - this.ui = ui; - } - - public Response toResponse(KeeperException e) { - Response.Status status; - String message; - - String path = e.getPath(); - - switch(e.code()) { - case AUTHFAILED: - status = Response.Status.UNAUTHORIZED; - message = path + " not authorized"; - break; - case BADARGUMENTS: - status = Response.Status.BAD_REQUEST; - message = path + " bad arguments"; - break; - case BADVERSION: - status = Response.Status.PRECONDITION_FAILED; - message = path + " bad version"; - break; - case INVALIDACL: - status = Response.Status.BAD_REQUEST; - message = path + " invalid acl"; - break; - case NODEEXISTS: - status = Response.Status.CONFLICT; - message = path + " already exists"; - break; - case NONODE: - status = Response.Status.NOT_FOUND; - message = path + " not found"; - break; - case NOTEMPTY: - status = Response.Status.CONFLICT; - message = path + " not empty"; - break; - default: - status = Response.Status.fromStatusCode(502); // bad gateway - message = "Error processing request for " + path - + " : " + e.getMessage(); - } - - return Response.status(status).entity( - new ZError(ui.getRequestUri().toString(), message)).build(); - } -} diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/rest/src/java/org/apache/zookeeper/server/jersey/resources/RuntimeExceptionMapper.java b/pkg/registry/zookeeper-3.4.6/src/contrib/rest/src/java/org/apache/zookeeper/server/jersey/resources/RuntimeExceptionMapper.java deleted file mode 100644 index 46f33bb43..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/contrib/rest/src/java/org/apache/zookeeper/server/jersey/resources/RuntimeExceptionMapper.java +++ /dev/null @@ -1,55 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you 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. - */ - -package org.apache.zookeeper.server.jersey.resources; - -import javax.ws.rs.WebApplicationException; -import javax.ws.rs.core.Context; -import javax.ws.rs.core.Response; -import javax.ws.rs.core.UriInfo; -import javax.ws.rs.ext.ExceptionMapper; -import javax.ws.rs.ext.Provider; - -import org.apache.zookeeper.server.jersey.jaxb.ZError; - -/** - * Map RuntimeException to HTTP status codes - */ -@Provider -public class RuntimeExceptionMapper - implements ExceptionMapper -{ - private UriInfo ui; - - public RuntimeExceptionMapper(@Context UriInfo ui) { - this.ui = ui; - } - - public Response toResponse(RuntimeException e) { - // don't try to handle jersey exceptions ourselves - if (e instanceof WebApplicationException) { - WebApplicationException ie =(WebApplicationException) e; - return ie.getResponse(); - } - - return Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity( - new ZError(ui.getRequestUri().toString(), - "Error processing request due to " + e - )).build(); - } -} diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/rest/src/java/org/apache/zookeeper/server/jersey/resources/SessionsResource.java b/pkg/registry/zookeeper-3.4.6/src/contrib/rest/src/java/org/apache/zookeeper/server/jersey/resources/SessionsResource.java deleted file mode 100644 index 0744604e8..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/contrib/rest/src/java/org/apache/zookeeper/server/jersey/resources/SessionsResource.java +++ /dev/null @@ -1,135 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you 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. - */ - -package org.apache.zookeeper.server.jersey.resources; - -import java.io.IOException; -import java.net.URI; -import java.util.UUID; - -import javax.servlet.http.HttpServletRequest; -import javax.ws.rs.Consumes; -import javax.ws.rs.DELETE; -import javax.ws.rs.DefaultValue; -import javax.ws.rs.POST; -import javax.ws.rs.PUT; -import javax.ws.rs.Path; -import javax.ws.rs.PathParam; -import javax.ws.rs.Produces; -import javax.ws.rs.QueryParam; -import javax.ws.rs.WebApplicationException; -import javax.ws.rs.core.Context; -import javax.ws.rs.core.MediaType; -import javax.ws.rs.core.Response; -import javax.ws.rs.core.UriInfo; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.apache.zookeeper.server.jersey.ZooKeeperService; -import org.apache.zookeeper.server.jersey.jaxb.ZError; -import org.apache.zookeeper.server.jersey.jaxb.ZSession; - -import com.sun.jersey.api.json.JSONWithPadding; - -@Path("sessions/v1/{session: .*}") -public class SessionsResource { - - private static Logger LOG = LoggerFactory.getLogger(SessionsResource.class); - - private String contextPath; - - public SessionsResource(@Context HttpServletRequest request) { - contextPath = request.getContextPath(); - if (contextPath.equals("")) { - contextPath = "/"; - } - } - - @PUT - @Produces( { MediaType.APPLICATION_JSON, "application/javascript", - MediaType.APPLICATION_XML }) - @Consumes(MediaType.APPLICATION_OCTET_STREAM) - public Response keepAliveSession(@PathParam("session") String session, - @Context UriInfo ui, byte[] data) { - - if (!ZooKeeperService.isConnected(contextPath, session)) { - throwNotFound(session, ui); - } - - ZooKeeperService.resetTimer(contextPath, session); - return Response.status(Response.Status.OK).build(); - } - - @POST - @Produces( { MediaType.APPLICATION_JSON, "application/javascript", - MediaType.APPLICATION_XML }) - public Response createSession(@QueryParam("op") String op, - @DefaultValue("5") @QueryParam("expire") String expire, - @Context UriInfo ui) { - if (!op.equals("create")) { - throw new WebApplicationException(Response.status( - Response.Status.BAD_REQUEST).entity( - new ZError(ui.getRequestUri().toString(), "")).build()); - } - - int expireInSeconds; - try { - expireInSeconds = Integer.parseInt(expire); - } catch (NumberFormatException e) { - throw new WebApplicationException(Response.status( - Response.Status.BAD_REQUEST).build()); - } - - String uuid = UUID.randomUUID().toString(); - while (ZooKeeperService.isConnected(contextPath, uuid)) { - uuid = UUID.randomUUID().toString(); - } - - // establish the connection to the ZooKeeper cluster - try { - ZooKeeperService.getClient(contextPath, uuid, expireInSeconds); - } catch (IOException e) { - LOG.error("Failed while trying to create a new session", e); - - throw new WebApplicationException(Response.status( - Response.Status.INTERNAL_SERVER_ERROR).build()); - } - - URI uri = ui.getAbsolutePathBuilder().path(uuid).build(); - return Response.created(uri).entity( - new JSONWithPadding(new ZSession(uuid, uri.toString()))) - .build(); - } - - @DELETE - @Produces( { MediaType.APPLICATION_JSON, "application/javascript", - MediaType.APPLICATION_XML, MediaType.APPLICATION_OCTET_STREAM }) - public void deleteSession(@PathParam("session") String session, - @Context UriInfo ui) { - ZooKeeperService.close(contextPath, session); - } - - private static void throwNotFound(String session, UriInfo ui) - throws WebApplicationException { - throw new WebApplicationException(Response.status( - Response.Status.NOT_FOUND).entity( - new ZError(ui.getRequestUri().toString(), session - + " not found")).build()); - } - -} diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/rest/src/java/org/apache/zookeeper/server/jersey/resources/ZErrorWriter.java b/pkg/registry/zookeeper-3.4.6/src/contrib/rest/src/java/org/apache/zookeeper/server/jersey/resources/ZErrorWriter.java deleted file mode 100644 index 706ab89f1..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/contrib/rest/src/java/org/apache/zookeeper/server/jersey/resources/ZErrorWriter.java +++ /dev/null @@ -1,63 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you 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. - */ - -package org.apache.zookeeper.server.jersey.resources; - -import java.io.IOException; -import java.io.OutputStream; -import java.io.PrintStream; -import java.lang.annotation.Annotation; -import java.lang.reflect.Type; - -import javax.ws.rs.Produces; -import javax.ws.rs.WebApplicationException; -import javax.ws.rs.core.MediaType; -import javax.ws.rs.core.MultivaluedMap; -import javax.ws.rs.ext.MessageBodyWriter; -import javax.ws.rs.ext.Provider; - -import org.apache.zookeeper.server.jersey.jaxb.ZError; - -/** - * Tell Jersey how to format an octet response error message. - */ -@Produces(MediaType.APPLICATION_OCTET_STREAM) -@Provider -public class ZErrorWriter implements MessageBodyWriter { - - public long getSize(ZError t, Class type, Type genericType, - Annotation[] annotations, MediaType mediaType) { - return -1; - } - - public boolean isWriteable(Class type, Type genericType, - Annotation[] annotations, MediaType mediaType) { - return ZError.class.isAssignableFrom(type); - } - - public void writeTo(ZError t, Class type, Type genericType, - Annotation[] annotations, MediaType mediaType, - MultivaluedMap httpHeaders, - OutputStream os) - throws IOException, WebApplicationException - { - PrintStream p = new PrintStream(os); - p.print("Request " + t.request + " failed due to " + t.message); - p.flush(); - } -} diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/rest/src/java/org/apache/zookeeper/server/jersey/resources/ZNodeResource.java b/pkg/registry/zookeeper-3.4.6/src/contrib/rest/src/java/org/apache/zookeeper/server/jersey/resources/ZNodeResource.java deleted file mode 100644 index 77371eab5..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/contrib/rest/src/java/org/apache/zookeeper/server/jersey/resources/ZNodeResource.java +++ /dev/null @@ -1,412 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you 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. - */ - -package org.apache.zookeeper.server.jersey.resources; - -import java.io.IOException; -import java.net.URI; -import java.util.ArrayList; -import java.util.List; - -import javax.servlet.http.HttpServletRequest; -import javax.ws.rs.Consumes; -import javax.ws.rs.DELETE; -import javax.ws.rs.DefaultValue; -import javax.ws.rs.GET; -import javax.ws.rs.HEAD; -import javax.ws.rs.POST; -import javax.ws.rs.PUT; -import javax.ws.rs.Path; -import javax.ws.rs.PathParam; -import javax.ws.rs.Produces; -import javax.ws.rs.QueryParam; -import javax.ws.rs.WebApplicationException; -import javax.ws.rs.core.Context; -import javax.ws.rs.core.MediaType; -import javax.ws.rs.core.Response; -import javax.ws.rs.core.UriInfo; - -import org.apache.zookeeper.CreateMode; -import org.apache.zookeeper.KeeperException; -import org.apache.zookeeper.ZooKeeper; -import org.apache.zookeeper.ZooDefs.Ids; -import org.apache.zookeeper.data.Stat; -import org.apache.zookeeper.server.jersey.ZooKeeperService; -import org.apache.zookeeper.server.jersey.jaxb.ZChildren; -import org.apache.zookeeper.server.jersey.jaxb.ZChildrenJSON; -import org.apache.zookeeper.server.jersey.jaxb.ZError; -import org.apache.zookeeper.server.jersey.jaxb.ZPath; -import org.apache.zookeeper.server.jersey.jaxb.ZStat; - -import com.sun.jersey.api.json.JSONWithPadding; - -/** - * Version 1 implementation of the ZooKeeper REST specification. - */ -// TODO test octet fully -@Path("znodes/v1{path: /.*}") -public class ZNodeResource { - private final ZooKeeper zk; - - public ZNodeResource(@DefaultValue("") @QueryParam("session") String session, - @Context UriInfo ui, - @Context HttpServletRequest request - ) - throws IOException { - - String contextPath = request.getContextPath(); - if (contextPath.equals("")) { - contextPath = "/"; - } - if (session.equals("")) { - session = null; - } else if (!ZooKeeperService.isConnected(contextPath, session)) { - throw new WebApplicationException(Response.status( - Response.Status.UNAUTHORIZED).build()); - } - zk = ZooKeeperService.getClient(contextPath, session); - } - - private void ensurePathNotNull(String path) { - if (path == null) { - throw new IllegalArgumentException("Invalid path \"" + path + "\""); - } - } - - @HEAD - @Produces( { MediaType.APPLICATION_JSON, "application/javascript", - MediaType.APPLICATION_XML }) - public Response existsZNode(@PathParam("path") String path, - @Context UriInfo ui) throws InterruptedException, KeeperException { - Stat stat = zk.exists(path, false); - if (stat == null) { - throwNotFound(path, ui); - } - return Response.status(Response.Status.OK).build(); - } - - @HEAD - @Produces( { MediaType.APPLICATION_OCTET_STREAM }) - public Response existsZNodeAsOctet(@PathParam("path") String path, - @Context UriInfo ui) throws InterruptedException, KeeperException { - Stat stat = zk.exists(path, false); - if (stat == null) { - throwNotFound(path, ui); - } - return Response.status(Response.Status.NO_CONTENT).build(); - } - - /* - * getZNodeList and getZNodeListJSON are bogus - but necessary. - * Unfortunately Jersey 1.0.3 is unable to render both xml and json properly - * in the case where a object contains a list/array. It's impossible to get - * it to render properly for both. As a result we need to split into two - * jaxb classes. - */ - - @GET - @Produces( { MediaType.APPLICATION_JSON, "application/javascript" }) - public Response getZNodeListJSON( - @PathParam("path") String path, - @QueryParam("callback") String callback, - @DefaultValue("data") @QueryParam("view") String view, - @DefaultValue("base64") @QueryParam("dataformat") String dataformat, - @Context UriInfo ui) throws InterruptedException, KeeperException { - return getZNodeList(true, path, callback, view, dataformat, ui); - } - - @GET - @Produces(MediaType.APPLICATION_XML) - public Response getZNodeList( - @PathParam("path") String path, - @QueryParam("callback") String callback, - @DefaultValue("data") @QueryParam("view") String view, - @DefaultValue("base64") @QueryParam("dataformat") String dataformat, - @Context UriInfo ui) throws InterruptedException, KeeperException { - return getZNodeList(false, path, callback, view, dataformat, ui); - } - - private Response getZNodeList(boolean json, String path, String callback, - String view, String dataformat, UriInfo ui) - throws InterruptedException, KeeperException { - ensurePathNotNull(path); - - if (view.equals("children")) { - List children = new ArrayList(); - for (String child : zk.getChildren(path, false)) { - children.add(child); - } - - Object child; - String childTemplate = ui.getAbsolutePath().toString(); - if (!childTemplate.endsWith("/")) { - childTemplate += "/"; - } - childTemplate += "{child}"; - if (json) { - child = new ZChildrenJSON(path, - ui.getAbsolutePath().toString(), childTemplate, - children); - } else { - child = new ZChildren(path, ui.getAbsolutePath().toString(), - childTemplate, children); - } - return Response.status(Response.Status.OK).entity( - new JSONWithPadding(child, callback)).build(); - } else { - Stat stat = new Stat(); - byte[] data = zk.getData(path, false, stat); - - byte[] data64; - String dataUtf8; - if (data == null) { - data64 = null; - dataUtf8 = null; - } else if (!dataformat.equals("utf8")) { - data64 = data; - dataUtf8 = null; - } else { - data64 = null; - dataUtf8 = new String(data); - } - ZStat zstat = new ZStat(path, ui.getAbsolutePath().toString(), - data64, dataUtf8, stat.getCzxid(), stat.getMzxid(), stat - .getCtime(), stat.getMtime(), stat.getVersion(), - stat.getCversion(), stat.getAversion(), stat - .getEphemeralOwner(), stat.getDataLength(), stat - .getNumChildren(), stat.getPzxid()); - - return Response.status(Response.Status.OK).entity( - new JSONWithPadding(zstat, callback)).build(); - } - } - - @GET - @Produces(MediaType.APPLICATION_OCTET_STREAM) - public Response getZNodeListAsOctet(@PathParam("path") String path) - throws InterruptedException, KeeperException { - ensurePathNotNull(path); - - Stat stat = new Stat(); - byte[] data = zk.getData(path, false, stat); - - if (data == null) { - return Response.status(Response.Status.NO_CONTENT).build(); - } else { - return Response.status(Response.Status.OK).entity(data).build(); - } - } - - @PUT - @Produces( { MediaType.APPLICATION_JSON, "application/javascript", - MediaType.APPLICATION_XML }) - @Consumes(MediaType.APPLICATION_OCTET_STREAM) - public Response setZNode( - @PathParam("path") String path, - @QueryParam("callback") String callback, - @DefaultValue("-1") @QueryParam("version") String versionParam, - @DefaultValue("base64") @QueryParam("dataformat") String dataformat, - @DefaultValue("false") @QueryParam("null") String setNull, - @Context UriInfo ui, byte[] data) throws InterruptedException, - KeeperException { - ensurePathNotNull(path); - - int version; - try { - version = Integer.parseInt(versionParam); - } catch (NumberFormatException e) { - throw new WebApplicationException(Response.status( - Response.Status.BAD_REQUEST).entity( - new ZError(ui.getRequestUri().toString(), path - + " bad version " + versionParam)).build()); - } - - if (setNull.equals("true")) { - data = null; - } - - Stat stat = zk.setData(path, data, version); - - ZStat zstat = new ZStat(path, ui.getAbsolutePath().toString(), null, - null, stat.getCzxid(), stat.getMzxid(), stat.getCtime(), stat - .getMtime(), stat.getVersion(), stat.getCversion(), - stat.getAversion(), stat.getEphemeralOwner(), stat - .getDataLength(), stat.getNumChildren(), stat - .getPzxid()); - - return Response.status(Response.Status.OK).entity( - new JSONWithPadding(zstat, callback)).build(); - } - - @PUT - @Produces(MediaType.APPLICATION_OCTET_STREAM) - @Consumes(MediaType.APPLICATION_OCTET_STREAM) - public void setZNodeAsOctet(@PathParam("path") String path, - @DefaultValue("-1") @QueryParam("version") String versionParam, - @DefaultValue("false") @QueryParam("null") String setNull, - @Context UriInfo ui, byte[] data) throws InterruptedException, - KeeperException { - ensurePathNotNull(path); - - int version; - try { - version = Integer.parseInt(versionParam); - } catch (NumberFormatException e) { - throw new WebApplicationException(Response.status( - Response.Status.BAD_REQUEST).entity( - new ZError(ui.getRequestUri().toString(), path - + " bad version " + versionParam)).build()); - } - - if (setNull.equals("true")) { - data = null; - } - - zk.setData(path, data, version); - } - - @POST - @Produces( { MediaType.APPLICATION_JSON, "application/javascript", - MediaType.APPLICATION_XML }) - @Consumes(MediaType.APPLICATION_OCTET_STREAM) - public Response createZNode( - @PathParam("path") String path, - @QueryParam("callback") String callback, - @DefaultValue("create") @QueryParam("op") String op, - @QueryParam("name") String name, - @DefaultValue("base64") @QueryParam("dataformat") String dataformat, - @DefaultValue("false") @QueryParam("null") String setNull, - @DefaultValue("false") @QueryParam("sequence") String sequence, - @DefaultValue("false") @QueryParam("ephemeral") String ephemeral, - @Context UriInfo ui, byte[] data) throws InterruptedException, - KeeperException { - ensurePathNotNull(path); - - if (path.equals("/")) { - path += name; - } else { - path += "/" + name; - } - - if (!op.equals("create")) { - throw new WebApplicationException(Response.status( - Response.Status.BAD_REQUEST).entity( - new ZError(ui.getRequestUri().toString(), path - + " bad operaton " + op)).build()); - } - - if (setNull.equals("true")) { - data = null; - } - - CreateMode createMode; - if (sequence.equals("true")) { - if (ephemeral.equals("false")) { - createMode = CreateMode.PERSISTENT_SEQUENTIAL; - } else { - createMode = CreateMode.EPHEMERAL_SEQUENTIAL; - } - } else if (ephemeral.equals("false")) { - createMode = CreateMode.PERSISTENT; - } else { - createMode = CreateMode.EPHEMERAL; - } - - String newPath = zk.create(path, data, Ids.OPEN_ACL_UNSAFE, createMode); - - URI uri = ui.getAbsolutePathBuilder().path(newPath).build(); - - return Response.created(uri).entity( - new JSONWithPadding(new ZPath(newPath, ui.getAbsolutePath() - .toString()))).build(); - } - - @POST - @Produces(MediaType.APPLICATION_OCTET_STREAM) - @Consumes(MediaType.APPLICATION_OCTET_STREAM) - public Response createZNodeAsOctet(@PathParam("path") String path, - @DefaultValue("create") @QueryParam("op") String op, - @QueryParam("name") String name, - @DefaultValue("false") @QueryParam("null") String setNull, - @DefaultValue("false") @QueryParam("sequence") String sequence, - @Context UriInfo ui, byte[] data) throws InterruptedException, - KeeperException { - ensurePathNotNull(path); - - if (path.equals("/")) { - path += name; - } else { - path += "/" + name; - } - - if (!op.equals("create")) { - throw new WebApplicationException(Response.status( - Response.Status.BAD_REQUEST).entity( - new ZError(ui.getRequestUri().toString(), path - + " bad operaton " + op)).build()); - } - - if (setNull.equals("true")) { - data = null; - } - - CreateMode createMode; - if (sequence.equals("true")) { - createMode = CreateMode.PERSISTENT_SEQUENTIAL; - } else { - createMode = CreateMode.PERSISTENT; - } - - String newPath = zk.create(path, data, Ids.OPEN_ACL_UNSAFE, createMode); - - URI uri = ui.getAbsolutePathBuilder().path(newPath).build(); - - return Response.created(uri).entity( - new ZPath(newPath, ui.getAbsolutePath().toString())).build(); - } - - @DELETE - @Produces( { MediaType.APPLICATION_JSON, "application/javascript", - MediaType.APPLICATION_XML, MediaType.APPLICATION_OCTET_STREAM }) - public void deleteZNode(@PathParam("path") String path, - @DefaultValue("-1") @QueryParam("version") String versionParam, - @Context UriInfo ui) throws InterruptedException, KeeperException { - ensurePathNotNull(path); - - int version; - try { - version = Integer.parseInt(versionParam); - } catch (NumberFormatException e) { - throw new WebApplicationException(Response.status( - Response.Status.BAD_REQUEST).entity( - new ZError(ui.getRequestUri().toString(), path - + " bad version " + versionParam)).build()); - } - - zk.delete(path, version); - } - - private static void throwNotFound(String path, UriInfo ui) - throws WebApplicationException { - throw new WebApplicationException(Response.status( - Response.Status.NOT_FOUND).entity( - new ZError(ui.getRequestUri().toString(), path + " not found")) - .build()); - } - -} diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/rest/src/python/README.txt b/pkg/registry/zookeeper-3.4.6/src/contrib/rest/src/python/README.txt deleted file mode 100644 index acc8ffb8e..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/contrib/rest/src/python/README.txt +++ /dev/null @@ -1,9 +0,0 @@ -Some basic python scripts which use the REST interface: - -zkrest.py -- basic REST ZooKeeper client -demo_master_election.py -- shows how to implement master election -demo_queue.py -- basic queue -zk_dump_tree.py -- dumps the nodes & data of a znode hierarchy - -Generally these scripts require: - * simplejson diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/rest/src/python/demo_master_election.py b/pkg/registry/zookeeper-3.4.6/src/contrib/rest/src/python/demo_master_election.py deleted file mode 100644 index c0317c7fe..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/contrib/rest/src/python/demo_master_election.py +++ /dev/null @@ -1,90 +0,0 @@ -#! /usr/bin/env python - -# Licensed to the Apache Software Foundation (ASF) under one -# or more contributor license agreements. See the NOTICE file -# distributed with this work for additional information -# regarding copyright ownership. The ASF licenses this file -# to you 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. - -import sys -import threading -import time - -from zkrest import ZooKeeper - -class Agent(threading.Thread): - """ A basic agent that wants to become a master and exit """ - - root = '/election' - - def __init__(self, id): - super(Agent, self).__init__() - self.zk = ZooKeeper() - self.id = id - - def run(self): - print 'Starting #%s' % self.id - with self.zk.session(expire=5): - - # signal agent presence - r = self.zk.create("%s/agent-" % self.root, - sequence=True, ephemeral=True) - self.me = r['path'] - - while True: - children = sorted([el['path'] \ - for el in self.zk.get_children(self.root)]) - master, previous = children[0], None - try: - index = children.index(self.me) - if index != 0: - previous = children[index-1] - except ValueError: - break - - if previous is None: - self.do_master_work() - # and don't forget to send heartbeat messages - break - else: - # do slave work in another thread - pass - - # wait for the previous agent or current master to exit / finish - while self.zk.exists(previous) or self.zk.exists(master): - time.sleep(0.5) - self.zk.heartbeat() - - # TODO signal the slave thread to exit and wait for it - # and rerun the election loop - - def do_master_work(self): - print "#%s: I'm the master: %s" % (self.id, self.me) - -def main(): - zk = ZooKeeper() - - # create the root node used for master election - if not zk.exists('/election'): - zk.create('/election') - - print 'Starting 10 agents ...' - agents = [Agent(id) for id in range(0,15)] - - map(Agent.start, agents) - map(Agent.join, agents) - - zk.delete('/election') - -if __name__ == '__main__': - sys.exit(main()) diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/rest/src/python/demo_queue.py b/pkg/registry/zookeeper-3.4.6/src/contrib/rest/src/python/demo_queue.py deleted file mode 100644 index 9ca4c6440..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/contrib/rest/src/python/demo_queue.py +++ /dev/null @@ -1,99 +0,0 @@ -#! /usr/bin/env python - -# Licensed to the Apache Software Foundation (ASF) under one -# or more contributor license agreements. See the NOTICE file -# distributed with this work for additional information -# regarding copyright ownership. The ASF licenses this file -# to you 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 is a simple message queue built on top of ZooKeeper. In order -# to be used in production it needs better error handling but it's -# still useful as a proof-of-concept. - -# Why use ZooKeeper as a queue? Highly available by design and has -# great performance. - -import sys -import threading -import time - -from zkrest import ZooKeeper - -class Queue(object): - def __init__(self, root, zk): - self.root = root - - self.zk = zk - - def put(self, data): - self.zk.create("%s/el-" % self.root, str(data), sequence=True, ephemeral=True) - - # creating ephemeral nodes for easy cleanup - # in a real world scenario you should create - # normal sequential znodes - - def fetch(self): - """ Pull an element from the queue - - This function is not blocking if the queue is empty, it will - just return None. - """ - children = sorted(self.zk.get_children(self.root), \ - lambda a, b: cmp(a['path'], b['path'])) - - if not children: - return None - - try: - first = children[0] - self.zk.delete(first['path'], version=first['version']) - if 'data64' not in first: - return '' - else: - return first['data64'].decode('base64') - - except (ZooKeeper.WrongVersion, ZooKeeper.NotFound): - # someone changed the znode between the get and delete - # this should not happen - # in practice you should retry the fetch - raise - - -def main(): - zk = ZooKeeper() - zk.start_session(expire=60) - - if not zk.exists('/queue'): - zk.create('/queue') - q = Queue('/queue', zk) - - print 'Pushing to queue 1 ... 5' - map(q.put, [1,2,3,4,5]) - - print 'Extracting ...' - while True: - el = q.fetch() - if el is None: - break - print el - - zk.close_session() - zk.delete('/queue') - - print 'Done.' - - -if __name__ == '__main__': - sys.exit(main()) - diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/rest/src/python/test.py b/pkg/registry/zookeeper-3.4.6/src/contrib/rest/src/python/test.py deleted file mode 100644 index 363747a64..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/contrib/rest/src/python/test.py +++ /dev/null @@ -1,163 +0,0 @@ -#! /usr/bin/env python - -# Licensed to the Apache Software Foundation (ASF) under one -# or more contributor license agreements. See the NOTICE file -# distributed with this work for additional information -# regarding copyright ownership. The ASF licenses this file -# to you 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. - -import time -import unittest - -from zkrest import ZooKeeper - -class ZooKeeperREST_TestCase(unittest.TestCase): - - BASE_URI = 'http://localhost:9998' - - def setUp(self): - self.zk = ZooKeeper(self.BASE_URI) - - def tearDown(self): - try: - self.zk.delete('/test') - except ZooKeeper.NotFound: - pass - - def test_get_root_node(self): - assert self.zk.get('/') is not None - - def test_get_node_not_found(self): - self.assertRaises(ZooKeeper.NotFound, \ - self.zk.get, '/dummy-node') - - def test_exists_node(self): - assert self.zk.exists('/zookeeper') is True - - def test_get_children(self): - assert any([child['path'] == '/zookeeper/quota' \ - for child in self.zk.get_children('/zookeeper')]) - - def test_create_znode(self): - try: - self.zk.create('/test') - except ZooKeeper.ZNodeExists: - pass # it's ok if already exists - assert self.zk.exists('/test') is True - - def test_create_hierarchy(self): - try: - self.zk.delete(['/a/b', '/a']) - except ZooKeeper.NotFound: - pass - - self.zk.create('/a') - self.zk.create('/a/b') - - self.zk.delete(['/a/b', '/a']) - - def test_create_with_data(self): - self.zk.create('/test', 'some-data') - - zn = self.zk.get('/test') - self.assertEqual(zn.get('data64', None), \ - 'some-data'.encode('base64').strip()) - - def test_delete_znode(self): - self.zk.create('/test') - - self.zk.delete('/test') - assert not self.zk.exists('/test') - - def test_delete_older_version(self): - self.zk.create('/test') - - zn = self.zk.get('/test') - # do one more modification in order to increase the version number - self.zk.set('/test', 'dummy-data') - - self.assertRaises(ZooKeeper.WrongVersion, \ - self.zk.delete, '/test', version=zn['version']) - - def test_delete_raise_not_found(self): - self.zk.create('/test') - - zn = self.zk.get('/test') - self.zk.delete('/test') - - self.assertRaises(ZooKeeper.NotFound, \ - self.zk.delete, '/test', version=zn['version']) - - def test_set(self): - self.zk.create('/test') - - self.zk.set('/test', 'dummy') - - self.assertEqual(self.zk.get('/test')['data64'], \ - 'dummy'.encode('base64').strip()) - - def test_set_with_older_version(self): - if not self.zk.exists('/test'): - self.zk.create('/test', 'random-data') - - zn = self.zk.get('/test') - self.zk.set('/test', 'new-data') - self.assertRaises(ZooKeeper.WrongVersion, self.zk.set, \ - '/test', 'older-version', version=zn['version']) - - def test_set_null(self): - if not self.zk.exists('/test'): - self.zk.create('/test', 'random-data') - self.zk.set('/test', 'data') - assert 'data64' in self.zk.get('/test') - - self.zk.set('/test', null=True) - assert 'data64' not in self.zk.get('/test') - - def test_create_ephemeral_node(self): - with self.zk.session(): - if self.zk.exists('/ephemeral-test'): - self.zk.delete('/ephemeral-test') - - self.zk.create('/ephemeral-test', ephemeral=True) - zn = self.zk.get('/ephemeral-test') - - assert zn['ephemeralOwner'] != 0 - - def test_create_session(self): - with self.zk.session() as sid: - self.assertEqual(len(sid), 36) # UUID - - def test_session_invalidation(self): - self.zk.start_session(expire=1) - self.zk.create('/ephemeral-test', ephemeral=True) - - # keep the session alive by sending heartbeat requests - for _ in range(1,2): - self.zk.heartbeat() - time.sleep(0.9) - - time.sleep(2) # wait for the session to expire - self.assertRaises(ZooKeeper.InvalidSession, \ - self.zk.create, '/ephemeral-test', ephemeral=True) - - def test_presence_signaling(self): - with self.zk.session(expire=1): - self.zk.create('/i-am-online', ephemeral=True) - assert self.zk.exists('/i-am-online') - assert not self.zk.exists('/i-am-online') - - -if __name__ == '__main__': - unittest.main() - diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/rest/src/python/zk_dump_tree.py b/pkg/registry/zookeeper-3.4.6/src/contrib/rest/src/python/zk_dump_tree.py deleted file mode 100644 index 517d23b34..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/contrib/rest/src/python/zk_dump_tree.py +++ /dev/null @@ -1,108 +0,0 @@ -#!/usr/bin/python - -# Licensed to the Apache Software Foundation (ASF) under one -# or more contributor license agreements. See the NOTICE file -# distributed with this work for additional information -# regarding copyright ownership. The ASF licenses this file -# to you 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. - -import getopt -import sys -import simplejson -import urllib2 -from base64 import b64decode - -printdata = False -fullpath = False - -def dump_node(url, depth): - """Dump the node, then dump children recursively - - Arguments: - - `url`: - - `depth`: - """ - req = urllib2.urlopen(url) - resp = simplejson.load(req) - if 'Error' in resp: - raise resp['Error'] - - if fullpath: - name = resp['path'] - else: - name = '/' + resp['path'].split('/')[-1] - - data64 = resp.get('data64') - dataUtf8 = resp.get('dataUtf8') - if data64 and printdata: - data = b64decode(data64) - print '%(indent)s%(name)s = b64(%(data64)s) str(%(data)s)' % \ - {'indent':' '*2*depth, 'name':name, 'data64':data64, 'data':data} - elif dataUtf8 and printdata: - print '%(indent)s%(name)s = %(data)s' % \ - {'indent':' '*2*depth, 'name':name, 'data':dataUtf8} - else: - print '%(indent)s%(name)s' % {'indent':' '*2*depth, 'name':name} - - req = urllib2.urlopen(resp['uri'] + '?view=children') - resp = simplejson.load(req) - - for child in resp.get('children', []): - dump_node(resp['child_uri_template'] - .replace("{child}", urllib2.quote(child)), - depth + 1) - -def zk_dump_tree(url, root): - """Dump the tree starting at the roota - - Arguments: - - `root`: - """ - dump_node(url + '/znodes/v1' + root, 0) - -def usage(): - """Usage - """ - print 'Usage: zk_dump_tree.py [-h|--help -u|--url=url -d|--data -f|--fullpath -r|--root=root]' - print ' where url is the url of the rest server, data is whether to' - print ' to include node data on output, root is the znode root' - print ' fullpath prints the full node path (useful for copy/paste)' - -if __name__ == '__main__': - try: - opts, args = getopt.getopt(sys.argv[1:], - "hu:dfr:", ["help", "url=", "data", "fullpath", "root="]) - except getopt.GetoptError, err: - # print help information and exit: - print str(err) # will print something like "option -a not recognized" - usage() - sys.exit(2) - url ='http://localhost:9998' - root = '/' - for o, a in opts: - if o in ("-d", "--data"): - printdata = True - elif o in ("-h", "--help"): - usage() - sys.exit() - elif o in ("-u", "--url"): - url = a - elif o in ("-r", "--root"): - root = a - elif o in ("-f", "--fullpath"): - fullpath = True - else: - assert False, "unhandled option" - - print 'Accessing REST server at ' + url - zk_dump_tree(url, root) diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/rest/src/python/zkrest.py b/pkg/registry/zookeeper-3.4.6/src/contrib/rest/src/python/zkrest.py deleted file mode 100644 index c009d5d9b..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/contrib/rest/src/python/zkrest.py +++ /dev/null @@ -1,218 +0,0 @@ - -# Licensed to the Apache Software Foundation (ASF) under one -# or more contributor license agreements. See the NOTICE file -# distributed with this work for additional information -# regarding copyright ownership. The ASF licenses this file -# to you 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. - -import urllib2 -import urllib -import simplejson - -from contextlib import contextmanager - -class RequestWithMethod(urllib2.Request): - """ Request class that know how to set the method name """ - def __init__(self, *args, **kwargs): - urllib2.Request.__init__(self, *args, **kwargs) - self._method = None - - def get_method(self): - return self._method or \ - urllib2.Request.get_method(self) - - def set_method(self, method): - self._method = method - -class ZooKeeper(object): - - class Error(Exception): pass - - class NotFound(Error): pass - - class ZNodeExists(Error): pass - - class InvalidSession(Error): pass - - class WrongVersion(Error): pass - - def __init__(self, uri = 'http://localhost:9998'): - self._base = uri - self._session = None - - def start_session(self, expire=5, id=None): - """ Create a session and return the ID """ - if id is None: - url = "%s/sessions/v1/?op=create&expire=%d" % (self._base, expire) - self._session = self._do_post(url)['id'] - else: - self._session = id - return self._session - - def close_session(self): - """ Close the session on the server """ - if self._session is not None: - url = '%s/sessions/v1/%s' % (self._base, self._session) - self._do_delete(url) - self._session = None - - def heartbeat(self): - """ Send a heartbeat request. This is needed in order to keep a session alive """ - if self._session is not None: - url = '%s/sessions/v1/%s' % (self._base, self._session) - self._do_put(url, '') - - @contextmanager - def session(self, *args, **kwargs): - """ Session handling using a context manager """ - yield self.start_session(*args, **kwargs) - self.close_session() - - def get(self, path): - """ Get a node """ - url = "%s/znodes/v1%s" % (self._base, path) - return self._do_get(url) - - def get_children(self, path): - """ Get all the children for a given path. This function creates a generator """ - url = "%s/znodes/v1%s?view=children" % (self._base, path) - resp = self._do_get(url) - for child in resp.get('children', []): - try: - yield self._do_get(resp['child_uri_template']\ - .replace('{child}', urllib2.quote(child))) - except ZooKeeper.NotFound: - continue - - def create(self, path, data=None, sequence=False, ephemeral=False): - """ Create a new node. By default this call creates a persistent znode. - - You can also create an ephemeral or a sequential znode. - """ - ri = path.rindex('/') - head, name = path[:ri+1], path[ri+1:] - if head != '/': head = head[:-1] - - flags = { - 'null': 'true' if data is None else 'false', - 'ephemeral': 'true' if ephemeral else 'false', - 'sequence': 'true' if sequence else 'false' - } - if ephemeral: - if self._session: - flags['session'] = self._session - else: - raise ZooKeeper.Error, 'You need a session '\ - 'to create an ephemeral node' - flags = urllib.urlencode(flags) - - url = "%s/znodes/v1%s?op=create&name=%s&%s" % \ - (self._base, head, name, flags) - - return self._do_post(url, data) - - def set(self, path, data=None, version=-1, null=False): - """ Set the value of node """ - url = "%s/znodes/v1%s?%s" % (self._base, path, \ - urllib.urlencode({ - 'version': version, - 'null': 'true' if null else 'false' - })) - return self._do_put(url, data) - - def delete(self, path, version=-1): - """ Delete a znode """ - if type(path) is list: - map(lambda el: self.delete(el, version), path) - return - - url = '%s/znodes/v1%s?%s' % (self._base, path, \ - urllib.urlencode({ - 'version':version - })) - try: - return self._do_delete(url) - except urllib2.HTTPError, e: - if e.code == 412: - raise ZooKeeper.WrongVersion(path) - elif e.code == 404: - raise ZooKeeper.NotFound(path) - raise - - def exists(self, path): - """ Do a znode exists """ - try: - self.get(path) - return True - except ZooKeeper.NotFound: - return False - - def _do_get(self, uri): - """ Send a GET request and convert errors to exceptions """ - try: - req = urllib2.urlopen(uri) - resp = simplejson.load(req) - - if 'Error' in resp: - raise ZooKeeper.Error(resp['Error']) - - return resp - except urllib2.HTTPError, e: - if e.code == 404: - raise ZooKeeper.NotFound(uri) - raise - - def _do_post(self, uri, data=None): - """ Send a POST request and convert errors to exceptions """ - try: - req = urllib2.Request(uri, {}) - req.add_header('Content-Type', 'application/octet-stream') - if data is not None: - req.add_data(data) - - resp = simplejson.load(urllib2.urlopen(req)) - if 'Error' in resp: - raise ZooKeeper.Error(resp['Error']) - return resp - - except urllib2.HTTPError, e: - if e.code == 201: - return True - elif e.code == 409: - raise ZooKeeper.ZNodeExists(uri) - elif e.code == 401: - raise ZooKeeper.InvalidSession(uri) - raise - - def _do_delete(self, uri): - """ Send a DELETE request """ - req = RequestWithMethod(uri) - req.set_method('DELETE') - req.add_header('Content-Type', 'application/octet-stream') - return urllib2.urlopen(req).read() - - def _do_put(self, uri, data): - """ Send a PUT request """ - try: - req = RequestWithMethod(uri) - req.set_method('PUT') - req.add_header('Content-Type', 'application/octet-stream') - if data is not None: - req.add_data(data) - - return urllib2.urlopen(req).read() - except urllib2.HTTPError, e: - if e.code == 412: # precondition failed - raise ZooKeeper.WrongVersion(uri) - raise - diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/zkfuse/Makefile.am b/pkg/registry/zookeeper-3.4.6/src/contrib/zkfuse/Makefile.am deleted file mode 100644 index 36da1a50d..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/contrib/zkfuse/Makefile.am +++ /dev/null @@ -1,4 +0,0 @@ -## Process this file with automake to produce Makefile.in - -SUBDIRS = src - diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/zkfuse/README.txt b/pkg/registry/zookeeper-3.4.6/src/contrib/zkfuse/README.txt deleted file mode 100644 index 901d3634f..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/contrib/zkfuse/README.txt +++ /dev/null @@ -1,63 +0,0 @@ -Original authors of zkfuse are Swee Lim & Bartlomiej M Niechwiej of Yahoo. -' -ZooKeeper FUSE (File System in Userspace) -========================================= - -Pre-requisites --------------- -1. Linux system with 2.6.X kernel. -2. Fuse (Filesystem in Userspace) must be installed on the build node. -3. Development build libraries: - a. fuse - b. log4cxx - c. pthread - d. boost - -Build instructions ------------------- -1. cd into this directory -2. autoreconf -if -3. ./configure -4. make -5. zkfuse binary is under the src directory - -Testing Zkfuse --------------- -1. Depending on permission on /dev/fuse, you may need to sudo -u root. - * If /dev/fuse has permissions 0600, then you have to run Zkfuse as root. - * If /dev/fuse has permissions 0666, then you can run Zkfuse as any user. -2. Create or find a mount point that you have "rwx" permission. - * e.g. mkdir -p /tmp/zkfuse -3. Run Zkfuse as follows: - zkfuse -z -m /tmp/zkfuse -d - -z specifies ZooKeeper address(es) : - -m specifies the mount point - -d specifies the debug mode. - For additional command line options, try "zkfuse -h". - -FAQ ---- -Q. How to fix "warning: macro `AM_PATH_CPPUNIT' not found in library"? -A. * install cppunit (src or pkg) on build machine - -Q. Why can't Zkfuse cannot write to current directory? -A. * If Zkfuse is running as root on a NFS mounted file system, it will not - have root permissions because root user is mapped to another user by - NFS admin. - * If you run Zkfuse as root, it is a good idea to run Zkfuse from a - directory that you have write access to. This will allow core files - to be saved. - -Q. Why Zkfuse cannot mount? -A. * Check that the mount point exists and you have "rwx" permissions. - * Check that previous mounts have been umounted. If Zkfuse does not - exit cleanly, its mount point may have to be umounted manually. - If you cannot umount manually, make sure that there no files is open - within the mount point. - -Q. Why does Zkfuse complain about logging at startup? -A. * Zkfuse uses log4cxx for logging. It is looking for log4cxx.properties - file to obtain its logging configuration. - * There is an example log4cxx.properties file in the Zkfuse source - directory. - diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/zkfuse/build.xml b/pkg/registry/zookeeper-3.4.6/src/contrib/zkfuse/build.xml deleted file mode 100644 index f58945381..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/contrib/zkfuse/build.xml +++ /dev/null @@ -1,61 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/zkfuse/configure.ac b/pkg/registry/zookeeper-3.4.6/src/contrib/zkfuse/configure.ac deleted file mode 100644 index c86e7cdc8..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/contrib/zkfuse/configure.ac +++ /dev/null @@ -1,72 +0,0 @@ -# -*- Autoconf -*- -# Process this file with autoconf to produce a configure script. - -AC_PREREQ(2.59) - -AC_INIT([zkfuse], [2.2.0]) -AM_INIT_AUTOMAKE(foreign) - -AC_CONFIG_SRCDIR([src/zkadapter.h]) -AM_CONFIG_HEADER([config.h]) - -PACKAGE=zkfuse -VERSION=1.0 - -AC_SUBST(PACKAGE) -AC_SUBST(VERSION) - -BUILD_PATH="`pwd`" - -# Checks for programs. -AC_LANG_CPLUSPLUS -AC_PROG_CXX - -# Checks for libraries. -AC_CHECK_LIB([fuse], [main]) -AC_CHECK_LIB([log4cxx], [main], [], [AC_MSG_ERROR("We need log4cxx to build zkfuse")]) -AC_CHECK_LIB([thread], [thr_create]) -AC_CHECK_LIB([pthread], [pthread_create]) -AC_CHECK_LIB([rt], [clock_gettime]) -AC_CHECK_LIB([socket], [socket]) -AC_CHECK_LIB([nsl], [gethostbyname]) -AC_CHECK_LIB([ulockmgr], [ulockmgr_op]) - -ZOOKEEPER_PATH=${BUILD_PATH}/../../c -ZOOKEEPER_BUILD_PATH=${BUILD_PATH}/../../../build/c -AC_CHECK_LIB(zookeeper_mt, main, [ZOOKEEPER_LD="-L${ZOOKEEPER_BUILD_PATH}/.libs -lzookeeper_mt"],,["-L${ZOOKEEPER_BUILD_PATH}/.libs"]) - -AC_SUBST(ZOOKEEPER_PATH) -AC_SUBST(ZOOKEEPER_LD) - -# Checks for header files. -AC_HEADER_DIRENT -AC_HEADER_STDC -AC_CHECK_HEADERS([fcntl.h stdlib.h string.h sys/time.h unistd.h]) -AC_CHECK_HEADERS([boost/shared_ptr.hpp boost/utility.hpp boost/weak_ptr.hpp],, AC_MSG_ERROR([boost library headers not found. Please install boost library.])) - -# Checks for typedefs, structures, and compiler characteristics. -AC_HEADER_STDBOOL -AC_C_CONST -AC_TYPE_UID_T -AC_C_INLINE -AC_TYPE_INT32_T -AC_TYPE_INT64_T -AC_TYPE_MODE_T -AC_TYPE_OFF_T -AC_TYPE_SIZE_T -AC_CHECK_MEMBERS([struct stat.st_blksize]) -AC_STRUCT_ST_BLOCKS -AC_HEADER_TIME -AC_TYPE_UINT32_T -AC_TYPE_UINT64_T -AC_TYPE_UINT8_T -AC_C_VOLATILE - -# Checks for library functions. -AC_FUNC_UTIME_NULL -AC_CHECK_FUNCS([gettimeofday memset mkdir rmdir strdup strerror strstr strtol strtoul strtoull utime]) - -AC_CONFIG_FILES([Makefile]) -AC_CONFIG_FILES([src/Makefile]) -AC_OUTPUT -AC_C_VOLATILE diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/zkfuse/src/Makefile.am b/pkg/registry/zookeeper-3.4.6/src/contrib/zkfuse/src/Makefile.am deleted file mode 100644 index c0d87e317..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/contrib/zkfuse/src/Makefile.am +++ /dev/null @@ -1,7 +0,0 @@ -AM_CXXFLAGS = -I${ZOOKEEPER_PATH}/include -I${ZOOKEEPER_PATH}/generated \ - -I$(top_srcdir)/include -I/usr/include -D_FILE_OFFSET_BITS=64 -D_REENTRANT - -noinst_PROGRAMS = zkfuse - -zkfuse_SOURCES = zkfuse.cc zkadapter.cc thread.cc log.cc -zkfuse_LDADD = ${ZOOKEEPER_LD} \ No newline at end of file diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/zkfuse/src/blockingqueue.h b/pkg/registry/zookeeper-3.4.6/src/contrib/zkfuse/src/blockingqueue.h deleted file mode 100644 index 4677290d7..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/contrib/zkfuse/src/blockingqueue.h +++ /dev/null @@ -1,154 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you 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. - */ - -#ifndef __BLOCKINGQUEUE_H__ -#define __BLOCKINGQUEUE_H__ - -#include - -#include "mutex.h" - -using namespace std; -USING_ZKFUSE_NAMESPACE - -namespace zk { - -/** - * \brief An unbounded blocking queue of elements of type E. - * - *

        - * This class is thread safe. - */ -template -class BlockingQueue { - public: - - /** - * \brief Adds the specified element to this queue, waiting if necessary - * \brief for space to become available. - * - * @param e the element to be added - */ - void put(E e); - - /** - * \brief Retrieves and removes the head of this queue, waiting if - * \brief no elements are present in this queue. - * - * @param timeout how long to wait until an element becomes availabe, - * in milliseconds; if 0 then wait forever - * @param timedOut if not NULL then set to true whether this function timed out - * @return the element from the queue - */ - E take(int32_t timeout = 0, bool *timedOut = NULL); - - /** - * Returns the current size of this blocking queue. - * - * @return the number of elements in this queue - */ - int size() const; - - /** - * \brief Returns whether this queue is empty or not. - * - * @return true if this queue has no elements; false otherwise - */ - bool empty() const; - - private: - - /** - * The queue of elements. Deque is used to provide O(1) time - * for head elements removal. - */ - deque m_queue; - - /** - * The mutex used for queue synchronization. - */ - mutable zkfuse::Mutex m_mutex; - - /** - * The conditionial variable associated with the mutex above. - */ - mutable Cond m_cond; - -}; - -template -int BlockingQueue::size() const { - int size; - m_mutex.Acquire(); - size = m_queue.size(); - m_mutex.Release(); - return size; -} - -template -bool BlockingQueue::empty() const { - bool isEmpty; - m_mutex.Acquire(); - isEmpty = m_queue.empty(); - m_mutex.Release(); - return isEmpty; -} - -template -void BlockingQueue::put(E e) { - m_mutex.Acquire(); - m_queue.push_back( e ); - m_cond.Signal(); - m_mutex.Release(); -} - -template - E BlockingQueue::take(int32_t timeout, bool *timedOut) { - m_mutex.Acquire(); - bool hasResult = true; - while (m_queue.empty()) { - if (timeout <= 0) { - m_cond.Wait( m_mutex ); - } else { - if (!m_cond.Wait( m_mutex, timeout )) { - hasResult = false; - break; - } - } - } - if (hasResult) { - E e = m_queue.front(); - m_queue.pop_front(); - m_mutex.Release(); - if (timedOut) { - *timedOut = false; - } - return e; - } else { - m_mutex.Release(); - if (timedOut) { - *timedOut = true; - } - return E(); - } -} - -} - -#endif /* __BLOCKINGQUEUE_H__ */ - diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/zkfuse/src/doxygen.cfg b/pkg/registry/zookeeper-3.4.6/src/contrib/zkfuse/src/doxygen.cfg deleted file mode 100644 index 308b09450..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/contrib/zkfuse/src/doxygen.cfg +++ /dev/null @@ -1,1242 +0,0 @@ -# Doxyfile 1.4.3 - -# Licensed to the Apache Software Foundation (ASF) under one -# or more contributor license agreements. See the NOTICE file -# distributed with this work for additional information -# regarding copyright ownership. The ASF licenses this file -# to you 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 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 (" ") - -#--------------------------------------------------------------------------- -# Project related 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 = ZkFuse - -# 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 = doc - -# If the CREATE_SUBDIRS tag is set to YES, then doxygen will create -# 4096 sub-directories (in 2 levels) under the output directory of each output -# format and will distribute the generated files over these directories. -# Enabling this option can be useful when feeding doxygen a huge amount of -# source files, where putting all generated files in the same directory would -# otherwise cause performance problems for the file system. - -CREATE_SUBDIRS = NO - -# 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, Korean-en, Norwegian, -# Polish, Portuguese, Romanian, Russian, Serbian, Slovak, Slovene, Spanish, -# Swedish, and Ukrainian. - -OUTPUT_LANGUAGE = English - -# This tag can be used to specify the encoding used in the generated output. -# The encoding is not always determined by the language that is chosen, -# but also whether or not the output is meant for Windows or non-Windows users. -# In case there is a difference, setting the USE_WINDOWS_ENCODING tag to YES -# forces the Windows encoding (this is the default for the Windows binary), -# whereas setting the tag to NO uses a Unix-style encoding (the default for -# all platforms other than Windows). - -USE_WINDOWS_ENCODING = 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 - -# This tag implements a quasi-intelligent brief description abbreviator -# that is used to form the text in various listings. Each string -# in this list, if found as the leading text of the brief description, will be -# stripped from the text and the result after processing the whole list, is -# used as the annotated text. Otherwise, the brief description is used as-is. -# If left blank, the following values are used ("$name" is automatically -# replaced with the name of the entity): "The $name class" "The $name widget" -# "The $name file" "is" "provides" "specifies" "contains" -# "represents" "a" "an" "the" - -ABBREVIATE_BRIEF = - -# 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 = YES - -# 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. The tag can be used to show relative paths in the file list. -# If left blank the directory from which doxygen is run is used as the -# path to strip. - -STRIP_FROM_PATH = - -# The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of -# the path mentioned in the documentation of a class, which tells -# the reader which header file to include in order to use a class. -# If left blank only the name of the header file containing the class -# definition is used. Otherwise one should specify the include paths that -# are normally passed to the compiler using the -I flag. - -STRIP_FROM_INC_PATH = - -# 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 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 -# explicit @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 -# re-implements. - -INHERIT_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 - -# If the SEPARATE_MEMBER_PAGES tag is set to YES, then doxygen will produce -# a new page for each member. If set to NO, the documentation of a member will -# be part of the file/class/namespace that contains it. - -SEPARATE_MEMBER_PAGES = 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 - -# 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 = - -# 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 = NO - -# 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 SUBGROUPING tag to YES (the default) to allow class member groups of -# the same type (for instance a group of public functions) to be put as a -# subgroup of that type (e.g. under the Public Functions section). Set it to -# NO to prevent subgrouping. Alternatively, this can be done per class using -# the \nosubgrouping command. - -SUBGROUPING = YES - -#--------------------------------------------------------------------------- -# Build related configuration options -#--------------------------------------------------------------------------- - -# 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 = NO - -# If the EXTRACT_PRIVATE tag is set to YES all private members of a class -# will be included in the documentation. - -EXTRACT_PRIVATE = YES - -# If the EXTRACT_STATIC tag is set to YES all static members of a file -# will be included in the documentation. - -EXTRACT_STATIC = YES - -# 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 = YES - -# This flag is only useful for Objective-C code. When set to YES local -# methods, which are defined in the implementation section but not in -# the interface are included in the documentation. -# If set to NO (the default) only methods in the interface are included. - -EXTRACT_LOCAL_METHODS = 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 classes 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 HIDE_IN_BODY_DOCS tag is set to YES, Doxygen will hide any -# documentation blocks found inside the body of a function. -# If set to NO (the default) these blocks will be appended to the -# function's detailed documentation block. - -HIDE_IN_BODY_DOCS = NO - -# 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 - -# 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 -# and Mac users are advised to set this option to NO. - -CASE_SENSE_NAMES = YES - -# 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 SHOW_INCLUDE_FILES tag is set to YES (the default) then Doxygen -# will put a list of the files that are included by a file in the documentation -# of that file. - -SHOW_INCLUDE_FILES = 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 the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the -# brief documentation of file, namespace and class members alphabetically -# by member name. If set to NO (the default) the members will appear in -# declaration order. - -SORT_BRIEF_DOCS = NO - -# If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be -# sorted by fully-qualified names, including namespaces. If set to -# NO (the default), the class list will be sorted only by class name, -# not including the namespace part. -# Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES. -# Note: This option applies only to the class list, not to the -# alphabetical list. - -SORT_BY_SCOPE_NAME = NO - -# 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 - -# 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 consists 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 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 = YES - -# If the sources in your project are distributed over multiple directories -# then setting the SHOW_DIRECTORIES tag to YES will show the directory hierarchy -# in the documentation. - -SHOW_DIRECTORIES = YES - -# The FILE_VERSION_FILTER tag can be used to specify a program or script that -# doxygen should invoke to get the current version for each file (typically from the -# version control system). Doxygen will invoke the program by executing (via -# popen()) the command , where is the value of -# the FILE_VERSION_FILTER tag, and is the name of an input file -# provided by doxygen. Whatever the progam writes to standard output -# is used as the file version. See the manual for examples. - -FILE_VERSION_FILTER = - -#--------------------------------------------------------------------------- -# 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 - -# If WARN_IF_DOC_ERROR is set to YES, doxygen will generate warnings for -# potential errors in the documentation, such as not documenting some -# parameters in a documented function, or documenting parameters that -# don't exist or using markup commands wrongly. - -WARN_IF_DOC_ERROR = YES - -# This WARN_NO_PARAMDOC option can be abled to get warnings for -# functions that are documented, but have no documentation for their parameters -# or return value. If set to NO (the default) doxygen will only warn about -# wrong or incomplete parameter documentation, but not about the absence of -# documentation. - -WARN_NO_PARAMDOC = NO - -# 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. Optionally the format may contain -# $version, which will be replaced by the version of the file (if it could -# be obtained via FILE_VERSION_FILTER) - -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 = - -# 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 *.cs *.php *.php3 *.inc *.m *.mm - -FILE_PATTERNS = - -# The RECURSIVE tag can be used to turn specify whether or not subdirectories -# should be searched for input files as well. Possible values are YES and NO. -# If left blank NO is used. - -RECURSIVE = NO - -# The EXCLUDE tag can be used to specify files and/or directories that should -# excluded from the INPUT source files. This way you can easily exclude a -# subdirectory from a directory tree whose root is specified with the INPUT tag. - -EXCLUDE = - -# The EXCLUDE_SYMLINKS tag can be used select whether or not files or -# directories that are symbolic links (a Unix filesystem feature) are excluded -# from the input. - -EXCLUDE_SYMLINKS = NO - -# If the value of the INPUT tag contains directories, you can use the -# EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude -# certain files from those directories. - -EXCLUDE_PATTERNS = - -# The EXAMPLE_PATH tag can be used to specify one or more files or -# directories that contain example code fragments that are included (see -# the \include command). - -EXAMPLE_PATH = - -# If the value of the EXAMPLE_PATH tag contains directories, you can use the -# EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp -# and *.h) to filter out the source-files in the directories. If left -# blank all files are included. - -EXAMPLE_PATTERNS = - -# If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be -# searched for input files to be used with the \include or \dontinclude -# commands irrespective of the value of the RECURSIVE tag. -# Possible values are YES and NO. If left blank NO is used. - -EXAMPLE_RECURSIVE = NO - -# The IMAGE_PATH tag can be used to specify one or more files or -# directories that contain image that are included in the documentation (see -# the \image command). - -IMAGE_PATH = - -# The INPUT_FILTER tag can be used to specify a program that doxygen should -# invoke to filter for each input file. Doxygen will invoke the filter program -# by executing (via popen()) the command , where -# is the value of the INPUT_FILTER tag, and is the name of an -# input file. Doxygen will then use the output that the filter program writes -# to standard output. If FILTER_PATTERNS is specified, this tag will be -# ignored. - -INPUT_FILTER = - -# The FILTER_PATTERNS tag can be used to specify filters on a per file pattern -# basis. Doxygen will compare the file name with each pattern and apply the -# filter if there is a match. The filters are a list of the form: -# pattern=filter (like *.cpp=my_cpp_filter). See INPUT_FILTER for further -# info on how filters are used. If FILTER_PATTERNS is empty, INPUT_FILTER -# is applied to all files. - -FILTER_PATTERNS = - -# 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. -# Note: To get rid of all source code in the generated output, make sure also -# VERBATIM_HEADERS is set to NO. - -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 - -# 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 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 = YES - -# 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 = YES - -# If the USE_HTAGS tag is set to YES then the references to source code -# will point to the HTML generated by the htags(1) tool instead of doxygen -# built-in source browser. The htags tool is part of GNU's global source -# tagging system (see http://www.gnu.org/software/global/global.html). You -# will need version 4.8.6 or higher. - -USE_HTAGS = 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 - -#--------------------------------------------------------------------------- -# 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 = NO - -# 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 = html - -# 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. Note that doxygen will try to copy -# the style sheet file to the HTML output directory, so don't put your own -# stylesheet in the HTML output directory as well, or it will be erased! - -HTML_STYLESHEET = - -# 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 directory. - -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 = NO - -# 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, DHTML, CSS and frames is required (for instance Mozilla 1.0+, -# Netscape 6.0+, Internet explorer 5.0+, or Konqueror). 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 = YES - -# 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 - -# If LATEX_HIDE_INDICES is set to YES then doxygen will not -# include the index chapters (such as File Index, Compound Index, etc.) -# in the output. - -LATEX_HIDE_INDICES = 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 optimized 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 assignments. 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. - -GENERATE_XML = NO - -# The XML_OUTPUT tag is used to specify where the XML 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 `xml' will be used as the default path. - -XML_OUTPUT = xml - -# 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 = - -# If the XML_PROGRAMLISTING tag is set to YES Doxygen will -# dump the program listings (including syntax highlighting -# and cross-referencing information) to the XML output. Note that -# enabling this will significantly increase the size of the XML output. - -XML_PROGRAMLISTING = YES - -#--------------------------------------------------------------------------- -# 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 Perl module output -#--------------------------------------------------------------------------- - -# If the GENERATE_PERLMOD tag is set to YES Doxygen will -# generate a Perl module file that captures the structure of -# the code including all documentation. Note that this -# feature is still experimental and incomplete at the -# moment. - -GENERATE_PERLMOD = NO - -# If the PERLMOD_LATEX tag is set to YES Doxygen will generate -# the necessary Makefile rules, Perl scripts and LaTeX code to be able -# to generate PDF and DVI output from the Perl module output. - -PERLMOD_LATEX = NO - -# If the PERLMOD_PRETTY tag is set to YES the Perl module output will be -# nicely formatted so it can be parsed by a human reader. This is useful -# if you want to understand what is going on. On the other hand, if this -# tag is set to NO the size of the Perl module output will be much smaller -# and Perl will parse it just the same. - -PERLMOD_PRETTY = YES - -# The names of the make variables in the generated doxyrules.make file -# are prefixed with the string contained in PERLMOD_MAKEVAR_PREFIX. -# This is useful so different doxyrules.make files included by the same -# Makefile don't overwrite each other's variables. - -PERLMOD_MAKEVAR_PREFIX = - -#--------------------------------------------------------------------------- -# 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 = YES - -# 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. To prevent a macro definition from being -# undefined via #undef or recursively expanded use the := operator -# instead of the = operator. - -PREDEFINED = - -# If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF 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::additions related to external references -#--------------------------------------------------------------------------- - -# The TAGFILES option can be used to specify one or more tagfiles. -# Optionally an initial location of the external documentation -# can be added for each tagfile. The format of a tag file without -# this location is as follows: -# TAGFILES = file1 file2 ... -# Adding location for the tag files is done as follows: -# TAGFILES = file1=loc1 "file2 = loc2" ... -# where "loc1" and "loc2" can be relative or absolute paths or -# URLs. If a location is present for each tag, the installdox tool -# does not have to be run to correct the links. -# Note that each tag file must have a unique name -# (where the name does NOT include the path) -# If a tag file is not located in the directory in which doxygen -# is run, you must also specify the path to the tagfile here. - -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 superseded by the HAVE_DOT option below. This is only a -# fallback. It is recommended to install and use dot, since it yields 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 the GROUP_GRAPHS and HAVE_DOT tags are set to YES then doxygen -# will generate a graph for groups, showing the direct groups dependencies - -GROUP_GRAPHS = YES - -# If the UML_LOOK tag is set to YES doxygen will generate inheritance and -# collaboration diagrams in a style similar to the OMG's Unified Modeling -# Language. - -UML_LOOK = NO - -# If set to YES, the inheritance and collaboration graphs will show the -# relations between templates and their instances. - -TEMPLATE_RELATIONS = NO - -# 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 CALL_GRAPH and HAVE_DOT tags are set to YES then doxygen will -# generate a call dependency graph for every global function or class method. -# Note that enabling this option will significantly increase the time of a run. -# So in most cases it will be better to enable call graphs for selected -# functions only using the \callgraph command. - -CALL_GRAPH = NO - -# 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 - -# If the DIRECTORY_GRAPH, SHOW_DIRECTORIES and HAVE_DOT tags are set to YES -# then doxygen will show the dependencies a directory has on other directories -# in a graphical way. The dependency relations are determined by the #include -# relations between the files in the directories. - -DIRECTORY_GRAPH = 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 in 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 - -# The MAX_DOT_GRAPH_DEPTH tag can be used to set the maximum depth of the -# graphs generated by dot. A depth value of 3 means that only nodes reachable -# from the root by following a path via at most 3 edges will be shown. Nodes -# that lay further from the root node will be omitted. Note that setting this -# option to 1 or 2 may greatly reduce the computation time needed for large -# code bases. Also note that a graph may be further truncated if the graph's -# image dimensions are not sufficient to fit the graph (see MAX_DOT_GRAPH_WIDTH -# and MAX_DOT_GRAPH_HEIGHT). If 0 is used for the depth value (the default), -# the graph is not depth-constrained. - -MAX_DOT_GRAPH_DEPTH = 0 - -# Set the DOT_TRANSPARENT tag to YES to generate images with a transparent -# background. This is disabled by default, which results in a white background. -# Warning: Depending on the platform used, enabling this option may lead to -# badly anti-aliased labels on the edges of a graph (i.e. they become hard to -# read). - -DOT_TRANSPARENT = NO - -# Set the DOT_MULTI_TARGETS tag to YES allow dot to generate multiple output -# files in one run (i.e. multiple -o and -T options on the command line). This -# makes dot run faster, but since only newer versions of dot (>1.8.10) -# support this, this feature is disabled by default. - -DOT_MULTI_TARGETS = NO - -# 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 intermediate dot files that are used to generate -# the various graphs. - -DOT_CLEANUP = YES - -#--------------------------------------------------------------------------- -# Configuration::additions 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 diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/zkfuse/src/event.cc b/pkg/registry/zookeeper-3.4.6/src/contrib/zkfuse/src/event.cc deleted file mode 100644 index 541657e14..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/contrib/zkfuse/src/event.cc +++ /dev/null @@ -1,29 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you 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. - */ - -#include "event.h" - -#define LOG_LEVEL LOG_FATAL -#define MODULE_NAME "Event" - -using namespace std; - -namespace zkfuse { - -} /* end of 'namespace zkfuse' */ - diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/zkfuse/src/event.h b/pkg/registry/zookeeper-3.4.6/src/contrib/zkfuse/src/event.h deleted file mode 100644 index 0506932f7..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/contrib/zkfuse/src/event.h +++ /dev/null @@ -1,553 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you 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. - */ - -#ifndef __EVENT_H__ -#define __EVENT_H__ - -#include -#include -#include -#include -#ifdef GCC4 -# include -using namespace std::tr1; -#else -# include -using namespace boost; -#endif - -#include "log.h" -#include "blockingqueue.h" -#include "mutex.h" -#include "thread.h" - -using namespace std; -using namespace zk; - -namespace zkfuse { - -//forward declaration of EventSource -template -class EventSource; - -/** - * \brief This interface is implemented by an observer - * \brief of a particular {@link EventSource}. - */ -template -class EventListener { - public: - - /** - * \brief This method is invoked whenever an event - * \brief has been received by the event source being observed. - * - * @param source the source the triggered the event - * @param e the actual event being triggered - */ - virtual void eventReceived(const EventSource &source, const E &e) = 0; -}; - -/** - * \brief This class represents a source of events. - * - *

        - * Each source can have many observers (listeners) attached to it - * and in case of an event, this source may propagate the event - * using {@link #fireEvent} method. - */ -template -class EventSource { - public: - - /** - * \brief The type corresponding to the list of registered event listeners. - */ - typedef set *> EventListeners; - - /** - * \brief Registers a new event listener. - * - * @param listener the listener to be added to the set of listeners - */ - void addListener(EventListener *listener) { - m_listeners.insert( listener ); - } - - /** - * \brief Removes an already registered listener. - * - * @param listener the listener to be removed - */ - void removeListener(EventListener *listener) { - m_listeners.erase( listener ); - } - - /** - * \brief Destructor. - */ - virtual ~EventSource() {} - - protected: - - /** - * \brief Fires the given event to all registered listeners. - * - *

        - * This method essentially iterates over all listeners - * and invokes {@link fireEvent(EventListener *listener, const E &event)} - * for each element. All derived classes are free to - * override the method to provide better error handling - * than the default implementation. - * - * @param event the event to be propagated to all listeners - */ - void fireEvent(const E &event); - - /** - * \brief Sends an event to the given listener. - * - * @param listener the listener to whom pass the event - * @param event the event to be handled - */ - virtual void fireEvent(EventListener *listener, const E &event); - - private: - - /** - * The set of registered event listeners. - */ - EventListeners m_listeners; - -}; - -/** - * \brief The interface of a generic event wrapper. - */ -class AbstractEventWrapper { - public: - - /** - * \brief Destructor. - */ - virtual ~AbstractEventWrapper() {} - - /** - * \brief Returns the underlying wrapee's data. - */ - virtual void *getWrapee() = 0; -}; - -/** - * \brief A template based implementation of {@link AbstractEventWrapper}. - */ -template -class EventWrapper : public AbstractEventWrapper { - public: - EventWrapper(const E &e) : m_e(e) { - } - void *getWrapee() { - return &m_e; - } - private: - E m_e; -}; - -/** - * \brief This class represents a generic event. - */ -class GenericEvent { - public: - - /** - * \brief Constructor. - */ - GenericEvent() : m_type(0) {} - - /** - * \brief Constructor. - * - * @param type the type of this event - * @param eventWarpper the wrapper around event's data - */ - GenericEvent(int type, AbstractEventWrapper *eventWrapper) : - m_type(type), m_eventWrapper(eventWrapper) { - } - - /** - * \brief Returns the type of this event. - * - * @return type of this event - */ - int getType() const { return m_type; } - - /** - * \brief Returns the event's data. - * - * @return the event's data - */ - void *getEvent() const { return m_eventWrapper->getWrapee(); } - - private: - - /** - * The event type. - */ - int m_type; - - /** - * The event represented as abstract wrapper. - */ - shared_ptr m_eventWrapper; - -}; - -/** - * \brief This class adapts {@link EventListener} to a generic listener. - * Essentially this class listens on incoming events and fires them - * as {@link GenericEvent}s. - */ -template -class EventListenerAdapter : public virtual EventListener, - public virtual EventSource -{ - public: - - /** - * \brief Constructor. - * - * @param eventSource the source on which register this listener - */ - EventListenerAdapter(EventSource &eventSource) { - eventSource.addListener(this); - } - - void eventReceived(const EventSource &source, const E &e) { - AbstractEventWrapper *wrapper = new EventWrapper(e); - GenericEvent event(type, wrapper); - fireEvent( event ); - } - -}; - -/** - * \brief This class provides an adapter between an asynchronous and synchronous - * \brief event handling. - * - *

        - * This class queues up all received events and exposes them through - * {@link #getNextEvent()} method. - */ -template -class SynchronousEventAdapter : public EventListener { - public: - - void eventReceived(const EventSource &source, const E &e) { - m_queue.put( e ); - } - - /** - * \brief Returns the next available event from the underlying queue, - * \brief possibly blocking, if no data is available. - * - * @return the next available event - */ - E getNextEvent() { - return m_queue.take(); - } - - /** - * \brief Returns whether there are any events in the queue or not. - * - * @return true if there is at least one event and - * the next call to {@link #getNextEvent} won't block - */ - bool hasEvents() const { - return (m_queue.empty() ? false : true); - } - - /** - * \brief Destructor. - */ - virtual ~SynchronousEventAdapter() {} - - private: - - /** - * The blocking queue of all events received so far. - */ - BlockingQueue m_queue; - -}; - -/** - * This typedef defines the type of a timer Id. - */ -typedef int32_t TimerId; - -/** - * This class represents a timer event parametrized by the user's data type. - */ -template -class TimerEvent { - public: - - /** - * \brief Constructor. - * - * @param id the ID of this event - * @param alarmTime when this event is to be triggered - * @param userData the user data associated with this event - */ - TimerEvent(TimerId id, int64_t alarmTime, const T &userData) : - m_id(id), m_alarmTime(alarmTime), m_userData(userData) - {} - - /** - * \brief Constructor. - */ - TimerEvent() : m_id(-1), m_alarmTime(-1) {} - - /** - * \brief Returns the ID. - * - * @return the ID of this event - */ - TimerId getID() const { return m_id; } - - /** - * \brief Returns the alarm time. - * - * @return the alarm time - */ - int64_t getAlarmTime() const { return m_alarmTime; } - - /** - * \brief Returns the user's data. - * - * @return the user's data - */ - T const &getUserData() const { return m_userData; } - - /** - * \brief Returns whether the given alarm time is less than this event's - * \brief time. - */ - bool operator<(const int64_t alarmTime) const { - return m_alarmTime < alarmTime; - } - - private: - - /** - * The ID of ths event. - */ - TimerId m_id; - - /** - * The time at which this event triggers. - */ - int64_t m_alarmTime; - - /** - * The user specific data associated with this event. - */ - T m_userData; - -}; - -template -class Timer : public EventSource > { - public: - - /** - * \brief Constructor. - */ - Timer() : m_currentEventID(0), m_terminating(false) { - m_workerThread.Create( *this, &Timer::sendAlarms ); - } - - /** - * \brief Destructor. - */ - ~Timer() { - m_terminating = true; - m_lock.notify(); - m_workerThread.Join(); - } - - /** - * \brief Schedules the given event timeFromNow milliseconds. - * - * @param timeFromNow time from now, in milliseconds, when the event - * should be triggered - * @param userData the user data associated with the timer event - * - * @return the ID of the newly created timer event - */ - TimerId scheduleAfter(int64_t timeFromNow, const T &userData) { - return scheduleAt( getCurrentTimeMillis() + timeFromNow, userData ); - } - - /** - * \brief Schedules an event at the given time. - * - * @param absTime absolute time, in milliseconds, at which the event - * should be triggered; the time is measured - * from Jan 1st, 1970 - * @param userData the user data associated with the timer event - * - * @return the ID of the newly created timer event - */ - TimerId scheduleAt(int64_t absTime, const T &userData) { - m_lock.lock(); - typename QueueType::iterator pos = - lower_bound( m_queue.begin(), m_queue.end(), absTime ); - TimerId id = m_currentEventID++; - TimerEvent event(id, absTime, userData); - m_queue.insert( pos, event ); - m_lock.notify(); - m_lock.unlock(); - return id; - } - - /** - * \brief Returns the current time since Jan 1, 1970, in milliseconds. - * - * @return the current time in milliseconds - */ - static int64_t getCurrentTimeMillis() { - struct timeval now; - gettimeofday( &now, NULL ); - return now.tv_sec * 1000LL + now.tv_usec / 1000; - } - - /** - * \brief Cancels the given timer event. - * - * - * @param eventID the ID of the event to be canceled - * - * @return whether the event has been canceled - */ - bool cancelAlarm(TimerId eventID) { - bool canceled = false; - m_lock.lock(); - typename QueueType::iterator i; - for (i = m_queue.begin(); i != m_queue.end(); ++i) { - if (eventID == i->getID()) { - m_queue.erase( i ); - canceled = true; - break; - } - } - m_lock.unlock(); - return canceled; - } - - /** - * Executes the main loop of the worker thread. - */ - void sendAlarms() { - //iterate until terminating - while (!m_terminating) { - m_lock.lock(); - //1 step - wait until there is an event in the queue - if (m_queue.empty()) { - //wait up to 100ms to get next event - m_lock.wait( 100 ); - } - bool fire = false; - if (!m_queue.empty()) { - //retrieve the event from the queue and send it - TimerEvent event = m_queue.front(); - //check whether we can send it right away - int64_t timeToWait = - event.getAlarmTime() - getCurrentTimeMillis(); - if (timeToWait <= 0) { - m_queue.pop_front(); - //we fire only if it's still in the queue and alarm - //time has just elapsed (in case the top event - //is canceled) - fire = true; - } else { - m_lock.wait( timeToWait ); - } - m_lock.unlock(); - if (fire) { - fireEvent( event ); - } - } else { - m_lock.unlock(); - } - } - } - - private: - - /** - * The type of timer events queue. - */ - typedef deque > QueueType; - - /** - * The current event ID, auto-incremented each time a new event - * is created. - */ - TimerId m_currentEventID; - - /** - * The queue of timer events sorted by {@link TimerEvent#alarmTime}. - */ - QueueType m_queue; - - /** - * The lock used to guard {@link #m_queue}. - */ - Lock m_lock; - - /** - * The thread that triggers alarms. - */ - CXXThread > m_workerThread; - - /** - * Whether {@link #m_workerThread} is terminating. - */ - volatile bool m_terminating; - -}; - -template -void EventSource::fireEvent(const E &event) { - for (typename EventListeners::iterator i = m_listeners.begin(); - i != m_listeners.end(); - ++i) - { - fireEvent( *i, event ); - } -} - -template -void EventSource::fireEvent(EventListener *listener, const E &event) { - listener->eventReceived( *this, event ); -} - -} /* end of 'namespace zkfuse' */ - -#endif /* __EVENT_H__ */ diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/zkfuse/src/log.cc b/pkg/registry/zookeeper-3.4.6/src/contrib/zkfuse/src/log.cc deleted file mode 100644 index e2bfb0dd8..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/contrib/zkfuse/src/log.cc +++ /dev/null @@ -1,36 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you 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. - */ - -#include - -#include "log.h" - -using namespace std; - -/** - * \brief This class encapsulates a log4cxx configuration. - */ -class LogConfiguration { - public: - LogConfiguration(const string &file) { - PropertyConfigurator::configureAndWatch( file, 5000 ); - } -}; - -//enforces the configuration to be initialized -static LogConfiguration logConfig( "log4cxx.properties" ); diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/zkfuse/src/log.h b/pkg/registry/zookeeper-3.4.6/src/contrib/zkfuse/src/log.h deleted file mode 100644 index aefce10b1..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/contrib/zkfuse/src/log.h +++ /dev/null @@ -1,116 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you 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. - */ - -#ifndef __LOG_H__ -#define __LOG_H__ - -#define ZKFUSE_NAMESPACE zkfuse -#define START_ZKFUSE_NAMESPACE namespace ZKFUSE_NAMESPACE { -#define END_ZKFUSE_NAMESPACE } -#define USING_ZKFUSE_NAMESPACE using namespace ZKFUSE_NAMESPACE; - -#include -#include -#include - -#include -#include -#include -using namespace log4cxx; -using namespace log4cxx::helpers; - -#define PRINTIP(x) ((uint8_t*)&x)[0], ((uint8_t*)&x)[1], \ - ((uint8_t*)&x)[2], ((uint8_t*)&x)[3] - -#define IPFMT "%u.%u.%u.%u" - -#define DECLARE_LOGGER(varName) \ -extern LoggerPtr varName; - -#define DEFINE_LOGGER(varName, logName) \ -static LoggerPtr varName = Logger::getLogger( logName ); - -#define MAX_BUFFER_SIZE 20000 - -#define SPRINTF_LOG_MSG(buffer, fmt, args...) \ - char buffer[MAX_BUFFER_SIZE]; \ - snprintf( buffer, MAX_BUFFER_SIZE, fmt, ##args ); - -// older versions of log4cxx don't support tracing -#ifdef LOG4CXX_TRACE -#define LOG_TRACE(logger, fmt, args...) \ - if (logger->isTraceEnabled()) { \ - SPRINTF_LOG_MSG( __tmp, fmt, ##args ); \ - LOG4CXX_TRACE( logger, __tmp ); \ - } -#else -#define LOG_TRACE(logger, fmt, args...) \ - if (logger->isDebugEnabled()) { \ - SPRINTF_LOG_MSG( __tmp, fmt, ##args ); \ - LOG4CXX_DEBUG( logger, __tmp ); \ - } -#endif - -#define LOG_DEBUG(logger, fmt, args...) \ - if (logger->isDebugEnabled()) { \ - SPRINTF_LOG_MSG( __tmp, fmt, ##args ); \ - LOG4CXX_DEBUG( logger, __tmp ); \ - } - -#define LOG_INFO(logger, fmt, args...) \ - if (logger->isInfoEnabled()) { \ - SPRINTF_LOG_MSG( __tmp, fmt, ##args ); \ - LOG4CXX_INFO( logger, __tmp ); \ - } - -#define LOG_WARN(logger, fmt, args...) \ - if (logger->isWarnEnabled()) { \ - SPRINTF_LOG_MSG( __tmp, fmt, ##args ); \ - LOG4CXX_WARN( logger, __tmp ); \ - } - -#define LOG_ERROR(logger, fmt, args...) \ - if (logger->isErrorEnabled()) { \ - SPRINTF_LOG_MSG( __tmp, fmt, ##args ); \ - LOG4CXX_ERROR( logger, __tmp ); \ - } - -#define LOG_FATAL(logger, fmt, args...) \ - if (logger->isFatalEnabled()) { \ - SPRINTF_LOG_MSG( __tmp, fmt, ##args ); \ - LOG4CXX_FATAL( logger, __tmp ); \ - } - -#ifdef DISABLE_TRACE -# define TRACE(logger, x) -#else -# define TRACE(logger, x) \ -class Trace { \ - public: \ - Trace(const void* p) : _p(p) { \ - LOG_TRACE(logger, "%s %p Enter", __PRETTY_FUNCTION__, p); \ - } \ - ~Trace() { \ - LOG_TRACE(logger, "%s %p Exit", __PRETTY_FUNCTION__, _p); \ - } \ - const void* _p; \ -} traceObj(x); -#endif /* DISABLE_TRACE */ - -#endif /* __LOG_H__ */ - diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/zkfuse/src/log4cxx.properties b/pkg/registry/zookeeper-3.4.6/src/contrib/zkfuse/src/log4cxx.properties deleted file mode 100644 index 1e373e42a..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/contrib/zkfuse/src/log4cxx.properties +++ /dev/null @@ -1,28 +0,0 @@ -# Licensed to the Apache Software Foundation (ASF) under one -# or more contributor license agreements. See the NOTICE file -# distributed with this work for additional information -# regarding copyright ownership. The ASF licenses this file -# to you 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. - -# Set root logger level to DEBUG and its only appender to A1. -log4j.rootLogger=TRACE, A1 - -# A1 is set to be a ConsoleAppender. -log4j.appender.A1=org.apache.log4cxx.ConsoleAppender - -# A1 uses PatternLayout. -log4j.appender.A1.layout=org.apache.log4cxx.PatternLayout -log4j.appender.A1.layout.ConversionPattern=%-4r [%t] %-5p %c %x - %m%n - -log4j.category.zkfuse=TRACE - diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/zkfuse/src/mutex.h b/pkg/registry/zookeeper-3.4.6/src/contrib/zkfuse/src/mutex.h deleted file mode 100644 index 86c460434..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/contrib/zkfuse/src/mutex.h +++ /dev/null @@ -1,169 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you 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. - */ - -#ifndef __MUTEX_H__ -#define __MUTEX_H__ - -#include -#include -#include - -#include "log.h" - -START_ZKFUSE_NAMESPACE - -class Cond; - -class Mutex { - friend class Cond; - public: - Mutex() { - pthread_mutexattr_init( &m_mutexAttr ); - pthread_mutexattr_settype( &m_mutexAttr, PTHREAD_MUTEX_RECURSIVE_NP ); - pthread_mutex_init( &mutex, &m_mutexAttr ); - } - ~Mutex() { - pthread_mutex_destroy(&mutex); - pthread_mutexattr_destroy( &m_mutexAttr ); - } - void Acquire() { Lock(); } - void Release() { Unlock(); } - void Lock() { - pthread_mutex_lock(&mutex); - } - int TryLock() { - return pthread_mutex_trylock(&mutex); - } - void Unlock() { - pthread_mutex_unlock(&mutex); - } - private: - pthread_mutex_t mutex; - pthread_mutexattr_t m_mutexAttr; -}; - -class AutoLock { - public: - AutoLock(Mutex& mutex) : _mutex(mutex) { - mutex.Lock(); - } - ~AutoLock() { - _mutex.Unlock(); - } - private: - friend class AutoUnlockTemp; - Mutex& _mutex; -}; - -class AutoUnlockTemp { - public: - AutoUnlockTemp(AutoLock & autoLock) : _autoLock(autoLock) { - _autoLock._mutex.Unlock(); - } - ~AutoUnlockTemp() { - _autoLock._mutex.Lock(); - } - private: - AutoLock & _autoLock; -}; - -class Cond { - public: - Cond() { - static pthread_condattr_t attr; - static bool inited = false; - if(!inited) { - inited = true; - pthread_condattr_init(&attr); - } - pthread_cond_init(&_cond, &attr); - } - ~Cond() { - pthread_cond_destroy(&_cond); - } - - void Wait(Mutex& mutex) { - pthread_cond_wait(&_cond, &mutex.mutex); - } - - bool Wait(Mutex& mutex, long long int timeout) { - struct timeval now; - gettimeofday( &now, NULL ); - struct timespec abstime; - int64_t microSecs = now.tv_sec * 1000000LL + now.tv_usec; - microSecs += timeout * 1000; - abstime.tv_sec = microSecs / 1000000LL; - abstime.tv_nsec = (microSecs % 1000000LL) * 1000; - if (pthread_cond_timedwait(&_cond, &mutex.mutex, &abstime) == ETIMEDOUT) { - return false; - } else { - return true; - } - } - - void Signal() { - pthread_cond_signal(&_cond); - } - - private: - pthread_cond_t _cond; -}; - -/** - * A wrapper class for {@link Mutex} and {@link Cond}. - */ -class Lock { - public: - - void lock() { - m_mutex.Lock(); - } - - void unlock() { - m_mutex.Unlock(); - } - - void wait() { - m_cond.Wait( m_mutex ); - } - - bool wait(long long int timeout) { - return m_cond.Wait( m_mutex, timeout ); - } - - void notify() { - m_cond.Signal(); - } - - private: - - /** - * The mutex. - */ - Mutex m_mutex; - - /** - * The condition associated with this lock's mutex. - */ - Cond m_cond; -}; - -END_ZKFUSE_NAMESPACE - -#endif /* __MUTEX_H__ */ - diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/zkfuse/src/thread.cc b/pkg/registry/zookeeper-3.4.6/src/contrib/zkfuse/src/thread.cc deleted file mode 100644 index f1ed8166f..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/contrib/zkfuse/src/thread.cc +++ /dev/null @@ -1,41 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you 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. - */ - -#include - -#include "thread.h" - -DEFINE_LOGGER( LOG, "Thread" ) - -START_ZKFUSE_NAMESPACE - -void Thread::Create(void* ctx, ThreadFunc func) -{ - pthread_attr_t attr; - pthread_attr_init(&attr); - pthread_attr_setstacksize(&attr, _stackSize); - int ret = pthread_create(&mThread, &attr, func, ctx); - if(ret != 0) { - LOG_FATAL( LOG, "pthread_create failed: %s", strerror(errno) ); - } - // pthread_attr_destroy(&attr); - _ctx = ctx; - _func = func; -} - -END_ZKFUSE_NAMESPACE diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/zkfuse/src/thread.h b/pkg/registry/zookeeper-3.4.6/src/contrib/zkfuse/src/thread.h deleted file mode 100644 index 0ed12d7f6..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/contrib/zkfuse/src/thread.h +++ /dev/null @@ -1,99 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you 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. - */ - -#ifndef __THREAD_H__ -#define __THREAD_H__ - -#include -#include -#include -#include - -#include "log.h" - -START_ZKFUSE_NAMESPACE - -class Thread { - public: - static const size_t defaultStackSize = 1024 * 1024; - typedef void* (*ThreadFunc) (void*); - Thread(size_t stackSize = defaultStackSize) - : _stackSize(stackSize), _ctx(NULL), _func(NULL) - { - memset( &mThread, 0, sizeof(mThread) ); - } - ~Thread() { } - - void Create(void* ctx, ThreadFunc func); - void Join() { - //avoid SEGFAULT because of unitialized mThread - //in case Create(...) was never called - if (_func != NULL) { - pthread_join(mThread, 0); - } - } - private: - pthread_t mThread; - void *_ctx; - ThreadFunc _func; - size_t _stackSize; -}; - - -template -struct ThreadContext { - typedef void (T::*FuncPtr) (void); - ThreadContext(T& ctx, FuncPtr func) : _ctx(ctx), _func(func) {} - void run(void) { - (_ctx.*_func)(); - } - T& _ctx; - FuncPtr _func; -}; - -template -void* ThreadExec(void *obj) { - ThreadContext* tc = (ThreadContext*)(obj); - assert(tc != 0); - tc->run(); - return 0; -} - -template -class CXXThread : public Thread { - public: - typedef void (T::*FuncPtr) (void); - CXXThread(size_t stackSize = Thread::defaultStackSize) - : Thread(stackSize), ctx(0) {} - ~CXXThread() { if (ctx) delete ctx; } - - void Create(T& obj, FuncPtr func) { - assert(ctx == 0); - ctx = new ThreadContext(obj, func); - Thread::Create(ctx, ThreadExec); - } - - private: - ThreadContext* ctx; -}; - - -END_ZKFUSE_NAMESPACE - -#endif /* __THREAD_H__ */ - diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/zkfuse/src/zkadapter.cc b/pkg/registry/zookeeper-3.4.6/src/contrib/zkfuse/src/zkadapter.cc deleted file mode 100644 index 886051d97..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/contrib/zkfuse/src/zkadapter.cc +++ /dev/null @@ -1,881 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you 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. - */ - -#include -#include - -#include "blockingqueue.h" -#include "thread.h" -#include "zkadapter.h" - -using namespace std; -using namespace zk; - -DEFINE_LOGGER( LOG, "zookeeper.adapter" ) -DEFINE_LOGGER( ZK_LOG, "zookeeper.core" ) - -/** - * \brief A helper class to initialize ZK logging. - */ -class InitZooKeeperLogging -{ - public: - InitZooKeeperLogging() { - if (ZK_LOG->isDebugEnabled() -#ifdef LOG4CXX_TRACE - || ZK_LOG->isTraceEnabled() -#endif - ) - { - zoo_set_debug_level( ZOO_LOG_LEVEL_DEBUG ); - } else if (ZK_LOG->isInfoEnabled()) { - zoo_set_debug_level( ZOO_LOG_LEVEL_INFO ); - } else if (ZK_LOG->isWarnEnabled()) { - zoo_set_debug_level( ZOO_LOG_LEVEL_WARN ); - } else { - zoo_set_debug_level( ZOO_LOG_LEVEL_ERROR ); - } - } -}; - -using namespace std; - -namespace zk -{ - -/** - * \brief This class provides logic for checking if a request can be retried. - */ -class RetryHandler -{ - public: - RetryHandler(const ZooKeeperConfig &zkConfig) - : m_zkConfig(zkConfig) - { - if (zkConfig.getAutoReconnect()) { - retries = 2; - } else { - retries = 0; - } - } - - /** - * \brief Attempts to fix a side effect of the given RC. - * - * @param rc the ZK error code - * @return whether the error code has been handled and the caller should - * retry an operation the caused this error - */ - bool handleRC(int rc) - { - TRACE( LOG, "handleRC" ); - - //check if the given error code is recoverable - if (!retryOnError(rc)) { - return false; - } - LOG_TRACE( LOG, "RC: %d, retries left: %d", rc, retries ); - if (retries-- > 0) { - return true; - } else { - return false; - } - } - - private: - /** - * The ZK config. - */ - const ZooKeeperConfig &m_zkConfig; - - /** - * The number of outstanding retries. - */ - int retries; - - /** - * Checks whether the given error entitles this adapter - * to retry the previous operation. - * - * @param zkErrorCode one of the ZK error code - */ - static bool retryOnError(int zkErrorCode) - { - return (zkErrorCode == ZCONNECTIONLOSS || - zkErrorCode == ZOPERATIONTIMEOUT); - } -}; - - -//the implementation of the global ZK event watcher -void zkWatcher(zhandle_t *zh, int type, int state, const char *path, - void *watcherCtx) -{ - TRACE( LOG, "zkWatcher" ); - - //a workaround for buggy ZK API - string sPath = - (path == NULL || - state == ZOO_SESSION_EVENT || - state == ZOO_NOTWATCHING_EVENT) - ? "" - : string(path); - LOG_INFO( LOG, - "Received a ZK event - type: %d, state: %d, path: '%s'", - type, state, sPath.c_str() ); - ZooKeeperAdapter *zka = (ZooKeeperAdapter *)zoo_get_context(zh); - if (zka != NULL) { - zka->enqueueEvent( type, state, sPath ); - } else { - LOG_ERROR( LOG, - "Skipping ZK event (type: %d, state: %d, path: '%s'), " - "because ZK passed no context", - type, state, sPath.c_str() ); - } -} - - - -// ======================================================================= - -ZooKeeperAdapter::ZooKeeperAdapter(ZooKeeperConfig config, - ZKEventListener *listener, - bool establishConnection) - throw(ZooKeeperException) - : m_zkConfig(config), - mp_zkHandle(NULL), - m_terminating(false), - m_connected(false), - m_state(AS_DISCONNECTED) -{ - TRACE( LOG, "ZooKeeperAdapter" ); - - resetRemainingConnectTimeout(); - - //enforce setting up appropriate ZK log level - static InitZooKeeperLogging INIT_ZK_LOGGING; - - if (listener != NULL) { - addListener(listener); - } - - //start the event dispatcher thread - m_eventDispatcher.Create( *this, &ZooKeeperAdapter::processEvents ); - - //start the user event dispatcher thread - m_userEventDispatcher.Create( *this, &ZooKeeperAdapter::processUserEvents ); - - //optionally establish the connection - if (establishConnection) { - reconnect(); - } -} - -ZooKeeperAdapter::~ZooKeeperAdapter() -{ - TRACE( LOG, "~ZooKeeperAdapter" ); - - try { - disconnect(); - } catch (std::exception &e) { - LOG_ERROR( LOG, - "An exception while disconnecting from ZK: %s", - e.what() ); - } - m_terminating = true; - m_userEventDispatcher.Join(); - m_eventDispatcher.Join(); -} - -void -ZooKeeperAdapter::validatePath(const string &path) throw(ZooKeeperException) -{ - TRACE( LOG, "validatePath" ); - - if (path.find( "/" ) != 0) { - throw ZooKeeperException( string("Node path must start with '/' but" - "it was '") + - path + - "'" ); - } - if (path.length() > 1) { - if (path.rfind( "/" ) == path.length() - 1) { - throw ZooKeeperException( string("Node path must not end with " - "'/' but it was '") + - path + - "'" ); - } - if (path.find( "//" ) != string::npos) { - throw ZooKeeperException( string("Node path must not contain " - "'//' but it was '") + - path + - "'" ); - } - } -} - -void -ZooKeeperAdapter::disconnect() -{ - TRACE( LOG, "disconnect" ); - LOG_TRACE( LOG, "mp_zkHandle: %p, state %d", mp_zkHandle, m_state ); - - m_stateLock.lock(); - if (mp_zkHandle != NULL) { - zookeeper_close( mp_zkHandle ); - mp_zkHandle = NULL; - setState( AS_DISCONNECTED ); - } - m_stateLock.unlock(); -} - -void -ZooKeeperAdapter::reconnect() throw(ZooKeeperException) -{ - TRACE( LOG, "reconnect" ); - - m_stateLock.lock(); - //clear the connection state - disconnect(); - - //establish a new connection to ZooKeeper - mp_zkHandle = zookeeper_init( m_zkConfig.getHosts().c_str(), - zkWatcher, - m_zkConfig.getLeaseTimeout(), - NULL, this, 0); - resetRemainingConnectTimeout(); - if (mp_zkHandle != NULL) { - setState( AS_CONNECTING ); - m_stateLock.unlock(); - } else { - m_stateLock.unlock(); - throw ZooKeeperException( - string("Unable to connect to ZK running at '") + - m_zkConfig.getHosts() + "'" ); - } - - LOG_DEBUG( LOG, "mp_zkHandle: %p, state %d", mp_zkHandle, m_state ); -} - -void -ZooKeeperAdapter::handleEvent(int type, int state, const string &path) -{ - TRACE( LOG, "handleEvent" ); - LOG_TRACE( LOG, - "type: %d, state %d, path: %s", - type, state, path.c_str() ); - Listener2Context context, context2; - //ignore internal ZK events - if (type != ZOO_SESSION_EVENT && type != ZOO_NOTWATCHING_EVENT) { - m_zkContextsMutex.Acquire(); - //check if the user context is available - if (type == ZOO_CHANGED_EVENT || type == ZOO_DELETED_EVENT) { - //we may have two types of interest here, - //in this case lets try to notify twice - context = findAndRemoveListenerContext( GET_NODE_DATA, path ); - context2 = findAndRemoveListenerContext( NODE_EXISTS, path ); - if (context.empty()) { - //make sure that the 2nd context is NULL and - // assign it to the 1st one - context = context2; - context2.clear(); - } - } else if (type == ZOO_CHILD_EVENT) { - context = findAndRemoveListenerContext( GET_NODE_CHILDREN, path ); - } else if (type == ZOO_CREATED_EVENT) { - context = findAndRemoveListenerContext( NODE_EXISTS, path ); - } - m_zkContextsMutex.Release(); - } - - handleEvent( type, state, path, context ); - if (!context2.empty()) { - handleEvent( type, state, path, context2 ); - } -} - -void -ZooKeeperAdapter::handleEvent(int type, - int state, - const string &path, - const Listener2Context &listeners) -{ - TRACE( LOG, "handleEvents" ); - - if (listeners.empty()) { - //propagate with empty context - ZKWatcherEvent event(type, state, path); - fireEvent( event ); - } else { - for (Listener2Context::const_iterator i = listeners.begin(); - i != listeners.end(); - ++i) { - ZKWatcherEvent event(type, state, path, i->second); - if (i->first != NULL) { - fireEvent( i->first, event ); - } else { - fireEvent( event ); - } - } - } -} - -void -ZooKeeperAdapter::enqueueEvent(int type, int state, const string &path) -{ - TRACE( LOG, "enqueueEvents" ); - - m_events.put( ZKWatcherEvent( type, state, path ) ); -} - -void -ZooKeeperAdapter::processEvents() -{ - TRACE( LOG, "processEvents" ); - - while (!m_terminating) { - bool timedOut = false; - ZKWatcherEvent source = m_events.take( 100, &timedOut ); - if (!timedOut) { - if (source.getType() == ZOO_SESSION_EVENT) { - LOG_INFO( LOG, - "Received SESSION event, state: %d. Adapter state: %d", - source.getState(), m_state ); - m_stateLock.lock(); - if (source.getState() == ZOO_CONNECTED_STATE) { - m_connected = true; - resetRemainingConnectTimeout(); - setState( AS_CONNECTED ); - } else if (source.getState() == ZOO_CONNECTING_STATE) { - m_connected = false; - setState( AS_CONNECTING ); - } else if (source.getState() == ZOO_EXPIRED_SESSION_STATE) { - LOG_INFO( LOG, "Received EXPIRED_SESSION event" ); - setState( AS_SESSION_EXPIRED ); - } - m_stateLock.unlock(); - } - m_userEvents.put( source ); - } - } -} - -void -ZooKeeperAdapter::processUserEvents() -{ - TRACE( LOG, "processUserEvents" ); - - while (!m_terminating) { - bool timedOut = false; - ZKWatcherEvent source = m_userEvents.take( 100, &timedOut ); - if (!timedOut) { - try { - handleEvent( source.getType(), - source.getState(), - source.getPath() ); - } catch (std::exception &e) { - LOG_ERROR( LOG, - "Unable to process event (type: %d, state: %d, " - "path: %s), because of exception: %s", - source.getType(), - source.getState(), - source.getPath().c_str(), - e.what() ); - } - } - } -} - -void -ZooKeeperAdapter::registerContext(WatchableMethod method, - const string &path, - ZKEventListener *listener, - ContextType context) -{ - TRACE( LOG, "registerContext" ); - - m_zkContexts[method][path][listener] = context; -} - -ZooKeeperAdapter::Listener2Context -ZooKeeperAdapter::findAndRemoveListenerContext(WatchableMethod method, - const string &path) -{ - TRACE( LOG, "findAndRemoveListenerContext" ); - - Listener2Context listeners; - Path2Listener2Context::iterator elem = m_zkContexts[method].find( path ); - if (elem != m_zkContexts[method].end()) { - listeners = elem->second; - m_zkContexts[method].erase( elem ); - } - return listeners; -} - -void -ZooKeeperAdapter::setState(AdapterState newState) -{ - TRACE( LOG, "setState" ); - if (newState != m_state) { - LOG_INFO( LOG, "Adapter state transition: %d -> %d", m_state, newState ); - m_state = newState; - m_stateLock.notify(); - } else { - LOG_TRACE( LOG, "New state same as the current: %d", newState ); - } -} - - -//TODO move this code to verifyConnection so reconnect() -//is called from one place only -void -ZooKeeperAdapter::waitUntilConnected() - throw(ZooKeeperException) -{ - TRACE( LOG, "waitUntilConnected" ); - long long int timeout = getRemainingConnectTimeout(); - LOG_INFO( LOG, - "Waiting up to %lld ms until a connection to ZK is established", - timeout ); - bool connected; - if (timeout > 0) { - long long int toWait = timeout; - while (m_state != AS_CONNECTED && toWait > 0) { - //check if session expired and reconnect if so - if (m_state == AS_SESSION_EXPIRED) { - LOG_INFO( LOG, - "Reconnecting because the current session has expired" ); - reconnect(); - } - struct timeval now; - gettimeofday( &now, NULL ); - int64_t milliSecs = -(now.tv_sec * 1000LL + now.tv_usec / 1000); - LOG_TRACE( LOG, "About to wait %lld ms", toWait ); - m_stateLock.wait( toWait ); - gettimeofday( &now, NULL ); - milliSecs += now.tv_sec * 1000LL + now.tv_usec / 1000; - toWait -= milliSecs; - } - waitedForConnect( timeout - toWait ); - LOG_INFO( LOG, "Waited %lld ms", timeout - toWait ); - } - connected = (m_state == AS_CONNECTED); - if (!connected) { - if (timeout > 0) { - LOG_WARN( LOG, "Timed out while waiting for connection to ZK" ); - throw ZooKeeperException("Timed out while waiting for " - "connection to ZK"); - } else { - LOG_ERROR( LOG, "Global timeout expired and still not connected to ZK" ); - throw ZooKeeperException("Global timeout expired and still not " - "connected to ZK"); - } - } - LOG_INFO( LOG, "Connected!" ); -} - -void -ZooKeeperAdapter::verifyConnection() throw(ZooKeeperException) -{ - TRACE( LOG, "verifyConnection" ); - - m_stateLock.lock(); - try { - if (m_state == AS_DISCONNECTED) { - throw ZooKeeperException("Disconnected from ZK. " \ - "Please use reconnect() before attempting to use any ZK API"); - } else if (m_state != AS_CONNECTED) { - LOG_TRACE( LOG, "Checking if need to reconnect..." ); - //we are not connected, so check if connection in progress... - if (m_state != AS_CONNECTING) { - LOG_TRACE( LOG, - "yes. Checking if allowed to auto-reconnect..." ); - //...not in progres, so check if we can reconnect - if (!m_zkConfig.getAutoReconnect()) { - //...too bad, disallowed :( - LOG_TRACE( LOG, "no. Sorry." ); - throw ZooKeeperException("ZK connection is down and " - "auto-reconnect is not allowed"); - } else { - LOG_TRACE( LOG, "...yes. About to reconnect" ); - } - //...we are good to retry the connection - reconnect(); - } else { - LOG_TRACE( LOG, "...no, already in CONNECTING state" ); - } - //wait until the connection is established - waitUntilConnected(); - } - } catch (ZooKeeperException &e) { - m_stateLock.unlock(); - throw; - } - m_stateLock.unlock(); -} - -bool -ZooKeeperAdapter::createNode(const string &path, - const string &value, - int flags, - bool createAncestors, - string &returnPath) - throw(ZooKeeperException) -{ - TRACE( LOG, "createNode (internal)" ); - validatePath( path ); - - const int MAX_PATH_LENGTH = 1024; - char realPath[MAX_PATH_LENGTH]; - realPath[0] = 0; - - int rc; - RetryHandler rh(m_zkConfig); - do { - verifyConnection(); - rc = zoo_create( mp_zkHandle, - path.c_str(), - value.c_str(), - value.length(), - &ZOO_OPEN_ACL_UNSAFE, - flags, - realPath, - MAX_PATH_LENGTH ); - } while (rc != ZOK && rh.handleRC(rc)); - if (rc != ZOK) { - if (rc == ZNODEEXISTS) { - //the node already exists - LOG_WARN( LOG, "Error %d for %s", rc, path.c_str() ); - return false; - } else if (rc == ZNONODE && createAncestors) { - LOG_WARN( LOG, "Error %d for %s", rc, path.c_str() ); - //one of the ancestors doesn't exist so lets start from the root - //and make sure the whole path exists, creating missing nodes if - //necessary - for (string::size_type pos = 1; pos != string::npos; ) { - pos = path.find( "/", pos ); - if (pos != string::npos) { - try { - createNode( path.substr( 0, pos ), "", 0, true ); - } catch (ZooKeeperException &e) { - throw ZooKeeperException( string("Unable to create " - "node ") + - path, - rc ); - } - pos++; - } else { - //no more path components - return createNode( path, value, flags, false, returnPath ); - } - } - } - LOG_ERROR( LOG,"Error %d for %s", rc, path.c_str() ); - throw ZooKeeperException( string("Unable to create node ") + - path, - rc ); - } else { - LOG_INFO( LOG, "%s has been created", realPath ); - returnPath = string( realPath ); - return true; - } -} - -bool -ZooKeeperAdapter::createNode(const string &path, - const string &value, - int flags, - bool createAncestors) - throw(ZooKeeperException) -{ - TRACE( LOG, "createNode" ); - - string createdPath; - return createNode( path, value, flags, createAncestors, createdPath ); -} - -int64_t -ZooKeeperAdapter::createSequence(const string &path, - const string &value, - int flags, - bool createAncestors) - throw(ZooKeeperException) -{ - TRACE( LOG, "createSequence" ); - - string createdPath; - bool result = createNode( path, - value, - flags | ZOO_SEQUENCE, - createAncestors, - createdPath ); - if (!result) { - return -1; - } else { - //extract sequence number from the returned path - if (createdPath.find( path ) != 0) { - throw ZooKeeperException( string("Expecting returned path '") + - createdPath + - "' to start with '" + - path + - "'" ); - } - string seqSuffix = - createdPath.substr( path.length(), - createdPath.length() - path.length() ); - char *ptr = NULL; - int64_t seq = strtol( seqSuffix.c_str(), &ptr, 10 ); - if (ptr != NULL && *ptr != '\0') { - throw ZooKeeperException( string("Expecting a number but got ") + - seqSuffix ); - } - return seq; - } -} - -bool -ZooKeeperAdapter::deleteNode(const string &path, - bool recursive, - int version) - throw(ZooKeeperException) -{ - TRACE( LOG, "deleteNode" ); - - validatePath( path ); - - int rc; - RetryHandler rh(m_zkConfig); - do { - verifyConnection(); - rc = zoo_delete( mp_zkHandle, path.c_str(), version ); - } while (rc != ZOK && rh.handleRC(rc)); - if (rc != ZOK) { - if (rc == ZNONODE) { - LOG_WARN( LOG, "Error %d for %s", rc, path.c_str() ); - return false; - } - if (rc == ZNOTEMPTY && recursive) { - LOG_WARN( LOG, "Error %d for %s", rc, path.c_str() ); - //get all children and delete them recursively... - vector nodeList; - getNodeChildren( nodeList, path, false ); - for (vector::const_iterator i = nodeList.begin(); - i != nodeList.end(); - ++i) { - deleteNode( *i, true ); - } - //...and finally attempt to delete the node again - return deleteNode( path, false ); - } - LOG_ERROR( LOG, "Error %d for %s", rc, path.c_str() ); - throw ZooKeeperException( string("Unable to delete node ") + path, - rc ); - } else { - LOG_INFO( LOG, "%s has been deleted", path.c_str() ); - return true; - } -} - -bool -ZooKeeperAdapter::nodeExists(const string &path, - ZKEventListener *listener, - void *context, Stat *stat) - throw(ZooKeeperException) -{ - TRACE( LOG, "nodeExists" ); - - validatePath( path ); - - struct Stat tmpStat; - if (stat == NULL) { - stat = &tmpStat; - } - memset( stat, 0, sizeof(Stat) ); - - int rc; - RetryHandler rh(m_zkConfig); - do { - verifyConnection(); - if (context != NULL) { - m_zkContextsMutex.Acquire(); - rc = zoo_exists( mp_zkHandle, - path.c_str(), - (listener != NULL ? 1 : 0), - stat ); - if (rc == ZOK || rc == ZNONODE) { - registerContext( NODE_EXISTS, path, listener, context ); - } - m_zkContextsMutex.Release(); - } else { - rc = zoo_exists( mp_zkHandle, - path.c_str(), - (listener != NULL ? 1 : 0), - stat ); - } - } while (rc != ZOK && rh.handleRC(rc)); - if (rc != ZOK) { - if (rc == ZNONODE) { - LOG_TRACE( LOG, "Node %s does not exist", path.c_str() ); - return false; - } - LOG_ERROR( LOG, "Error %d for %s", rc, path.c_str() ); - throw ZooKeeperException( - string("Unable to check existence of node ") + path, - rc ); - } else { - return true; - } -} - -void -ZooKeeperAdapter::getNodeChildren(vector &nodeList, - const string &path, - ZKEventListener *listener, - void *context) - throw (ZooKeeperException) -{ - TRACE( LOG, "getNodeChildren" ); - - validatePath( path ); - - String_vector children; - memset( &children, 0, sizeof(children) ); - - int rc; - RetryHandler rh(m_zkConfig); - do { - verifyConnection(); - if (context != NULL) { - m_zkContextsMutex.Acquire(); - rc = zoo_get_children( mp_zkHandle, - path.c_str(), - (listener != NULL ? 1 : 0), - &children ); - if (rc == ZOK) { - registerContext( GET_NODE_CHILDREN, path, listener, context ); - } - m_zkContextsMutex.Release(); - } else { - rc = zoo_get_children( mp_zkHandle, - path.c_str(), - (listener != NULL ? 1 : 0), - &children ); - } - } while (rc != ZOK && rh.handleRC(rc)); - if (rc != ZOK) { - LOG_ERROR( LOG, "Error %d for %s", rc, path.c_str() ); - throw ZooKeeperException( string("Unable to get children of node ") + - path, - rc ); - } else { - for (int i = 0; i < children.count; ++i) { - //convert each child's path from relative to absolute - string absPath(path); - if (path != "/") { - absPath.append( "/" ); - } - absPath.append( children.data[i] ); - nodeList.push_back( absPath ); - } - //make sure the order is always deterministic - sort( nodeList.begin(), nodeList.end() ); - } -} - -string -ZooKeeperAdapter::getNodeData(const string &path, - ZKEventListener *listener, - void *context, Stat *stat) - throw(ZooKeeperException) -{ - TRACE( LOG, "getNodeData" ); - - validatePath( path ); - - const int MAX_DATA_LENGTH = 128 * 1024; - char buffer[MAX_DATA_LENGTH]; - memset( buffer, 0, MAX_DATA_LENGTH ); - struct Stat tmpStat; - if (stat == NULL) { - stat = &tmpStat; - } - memset( stat, 0, sizeof(Stat) ); - - int rc; - int len; - RetryHandler rh(m_zkConfig); - do { - verifyConnection(); - len = MAX_DATA_LENGTH - 1; - if (context != NULL) { - m_zkContextsMutex.Acquire(); - rc = zoo_get( mp_zkHandle, - path.c_str(), - (listener != NULL ? 1 : 0), - buffer, &len, stat ); - if (rc == ZOK) { - registerContext( GET_NODE_DATA, path, listener, context ); - } - m_zkContextsMutex.Release(); - } else { - rc = zoo_get( mp_zkHandle, - path.c_str(), - (listener != NULL ? 1 : 0), - buffer, &len, stat ); - } - } while (rc != ZOK && rh.handleRC(rc)); - if (rc != ZOK) { - LOG_ERROR( LOG, "Error %d for %s", rc, path.c_str() ); - throw ZooKeeperException( - string("Unable to get data of node ") + path, rc - ); - } else { - return string( buffer, buffer + len ); - } -} - -void -ZooKeeperAdapter::setNodeData(const string &path, - const string &value, - int version) - throw(ZooKeeperException) -{ - TRACE( LOG, "setNodeData" ); - - validatePath( path ); - - int rc; - RetryHandler rh(m_zkConfig); - do { - verifyConnection(); - rc = zoo_set( mp_zkHandle, - path.c_str(), - value.c_str(), - value.length(), - version); - } while (rc != ZOK && rh.handleRC(rc)); - if (rc != ZOK) { - LOG_ERROR( LOG, "Error %d for %s", rc, path.c_str() ); - throw ZooKeeperException( string("Unable to set data for node ") + - path, - rc ); - } -} - -} /* end of 'namespace zk' */ - diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/zkfuse/src/zkadapter.h b/pkg/registry/zookeeper-3.4.6/src/contrib/zkfuse/src/zkadapter.h deleted file mode 100644 index 8d4d1d57f..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/contrib/zkfuse/src/zkadapter.h +++ /dev/null @@ -1,718 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you 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. - */ - -#ifndef __ZKADAPTER_H__ -#define __ZKADAPTER_H__ - -#include -#include -#include - -extern "C" { -#include "zookeeper.h" -} - -#include "log.h" -#include "mutex.h" -#include "thread.h" -#include "blockingqueue.h" -#include "event.h" - -using namespace std; -using namespace zkfuse; - -namespace zk { - -/** - * \brief A cluster related exception. - */ -class ZooKeeperException : - public std::exception -{ - public: - - /** - * \brief Constructor. - * - * @param msg the detailed message associated with this exception - */ - ZooKeeperException(const string &msg) : - m_message(msg), m_zkErrorCode(0) - {} - - /** - * \brief Constructor. - * - * @param msg the detailed message associated with this exception - * @param errorCode the ZK error code associated with this exception - */ - ZooKeeperException(const string &msg, int errorCode) : - m_zkErrorCode(errorCode) - { - char tmp[100]; - sprintf( tmp, " (ZK error code: %d)", errorCode ); - m_message = msg + tmp; - } - - /** - * \brief Destructor. - */ - ~ZooKeeperException() throw() {} - - /** - * \brief Returns detailed description of the exception. - */ - const char *what() const throw() { - return m_message.c_str(); - } - - /** - * \brief Returns the ZK error code. - */ - int getZKErrorCode() const { - return m_zkErrorCode; - } - - private: - - /** - * The detailed message associated with this exception. - */ - string m_message; - - /** - * The optional error code received from ZK. - */ - int m_zkErrorCode; - -}; - -/** - * \brief This class encapsulates configuration of a ZK client. - */ -class ZooKeeperConfig -{ - public: - - /** - * \brief Constructor. - * - * @param hosts the comma separated list of host and port pairs of ZK nodes - * @param leaseTimeout the lease timeout (heartbeat) - * @param autoReconnect whether to allow for auto-reconnect - * @param connectTimeout the connect timeout, in milliseconds; - */ - ZooKeeperConfig(const string &hosts, - int leaseTimeout, - bool autoReconnect = true, - long long int connectTimeout = 15000) : - m_hosts(hosts), m_leaseTimeout(leaseTimeout), - m_autoReconnect(autoReconnect), m_connectTimeout(connectTimeout) {} - - /** - * \brief Returns the list of ZK hosts to connect to. - */ - string getHosts() const { return m_hosts; } - - /** - * \brief Returns the lease timeout. - */ - int getLeaseTimeout() const { return m_leaseTimeout; } - - /** - * \brief Returns whether {@link ZooKeeperAdapter} should attempt - * \brief to automatically reconnect in case of a connection failure. - */ - bool getAutoReconnect() const { return m_autoReconnect; } - - /** - * \brief Gets the connect timeout. - * - * @return the connect timeout - */ - long long int getConnectTimeout() const { return m_connectTimeout; } - - private: - - /** - * The host addresses of ZK nodes. - */ - const string m_hosts; - - /** - * The ZK lease timeout. - */ - const int m_leaseTimeout; - - /** - * True if this adapater should attempt to autoreconnect in case - * the current session has been dropped. - */ - const bool m_autoReconnect; - - /** - * How long to wait, in milliseconds, before a connection - * is established to ZK. - */ - const long long int m_connectTimeout; - -}; - -/** - * \brief A data value object representing a watcher event received from the ZK. - */ -class ZKWatcherEvent -{ - public: - - /** - * \brief The type representing the user's context. - */ - typedef void *ContextType; - - /** - * \brief Constructor. - * - * @param type the type of this event - * @param state the state of this event - * @param path the corresponding path, may be empty for some event types - * @param context the user specified context; possibly NULL - */ - ZKWatcherEvent() : - m_type(-1), m_state(-1), m_path(""), mp_context(NULL) {} - - /** - * \brief Constructor. - * - * @param type the type of this event - * @param state the state of this event - * @param path the corresponding path, may be empty for some event types - * @param context the user specified context; possibly NULL - */ - ZKWatcherEvent(int type, int state, const string &path, - ContextType context = NULL) : - m_type(type), m_state(state), m_path(path), mp_context(context) {} - - int getType() const { return m_type; } - int getState() const { return m_state; } - string const &getPath() const { return m_path; } - ContextType getContext() const { return mp_context; } - - bool operator==(const ZKWatcherEvent &we) const { - return m_type == we.m_type && m_state == we.m_state - && m_path == we.m_path && mp_context == we.mp_context; - } - - private: - - /** - * The type of this event. It can be either ZOO_CREATED_EVENT, ZOO_DELETED_EVENT, - * ZOO_CHANGED_EVENT, ZOO_CHILD_EVENT, ZOO_SESSION_EVENT or ZOO_NOTWATCHING_EVENT. - * See zookeeper.h for more details. - */ - const int m_type; - - /** - * The state of ZK at the time of sending this event. - * It can be either ZOO_CONNECTING_STATE, ZOO_ASSOCIATING_STATE, - * ZOO_CONNECTED_STATE, ZOO_EXPIRED_SESSION_STATE or AUTH_FAILED_STATE. - * See {@file zookeeper.h} for more details. - */ - const int m_state; - - /** - * The corresponding path of the node in subject. It may be empty - * for some event types. - */ - const string m_path; - - /** - * The pointer to the user specified context, possibly NULL. - */ - ContextType mp_context; - -}; - -/** - * \brief The type definition of ZK event source. - */ -typedef EventSource ZKEventSource; - -/** - * \brief The type definition of ZK event listener. - */ -typedef EventListener ZKEventListener; - -/** - * \brief This is a wrapper around ZK C synchrounous API. - */ -class ZooKeeperAdapter - : public ZKEventSource -{ - public: - /** - * \brief The global function that handles all ZK asynchronous notifications. - */ - friend void zkWatcher(zhandle_t *, int, int, const char *, void *watcherCtx); - - /** - * \brief The type representing the user's context. - */ - typedef void *ContextType; - - /** - * \brief The map type of ZK event listener to user specified context mapping. - */ - typedef map Listener2Context; - - /** - * \brief The map type of ZK path's to listener's contexts. - */ - typedef map Path2Listener2Context; - - /** - * \brief All possible states of this client, in respect to - * \brief connection to the ZK server. - */ - enum AdapterState { - //mp_zkHandle is NULL - AS_DISCONNECTED = 0, - //mp_zkHandle is valid but this client is reconnecting - AS_CONNECTING, - //mp_zkHandle is valid and this client is connected - AS_CONNECTED, - //mp_zkHandle is valid, however no more calls can be made to ZK API - AS_SESSION_EXPIRED - }; - - /** - * \brief Constructor. - * Attempts to create a ZK adapter, optionally connecting - * to the ZK. Note, that if the connection is to be established - * and the given listener is NULL, some events may be lost, - * as they may arrive asynchronously before this method finishes. - * - * @param config the ZK configuration - * @param listener the event listener to be used for listening - * on incoming ZK events; - * if NULL not used - * @param establishConnection whether to establish connection to the ZK - * - * @throw ZooKeeperException if cannot establish connection to the given ZK - */ - ZooKeeperAdapter(ZooKeeperConfig config, - ZKEventListener *listener = NULL, - bool establishConnection = false) - throw(ZooKeeperException); - - /** - * \brief Destructor. - */ - ~ZooKeeperAdapter(); - - /** - * \brief Returns the current config. - */ - const ZooKeeperConfig &getZooKeeperConfig() const { - return m_zkConfig; - } - - /** - * \brief Restablishes connection to the ZK. - * If this adapter is already connected, the current connection - * will be dropped and a new connection will be established. - * - * @throw ZooKeeperException if cannot establish connection to the ZK - */ - void reconnect() throw(ZooKeeperException); - - /** - * \brief Disconnects from the ZK and unregisters {@link #mp_zkHandle}. - */ - void disconnect(); - - /** - * \brief Creates a new node identified by the given path. - * This method will optionally attempt to create all missing ancestors. - * - * @param path the absolute path name of the node to be created - * @param value the initial value to be associated with the node - * @param flags the ZK flags of the node to be created - * @param createAncestors if true and there are some missing ancestor nodes, - * this method will attempt to create them - * - * @return true if the node has been successfully created; false otherwise - * @throw ZooKeeperException if the operation has failed - */ - bool createNode(const string &path, - const string &value = "", - int flags = 0, - bool createAncestors = true) - throw(ZooKeeperException); - - /** - * \brief Creates a new sequence node using the give path as the prefix. - * This method will optionally attempt to create all missing ancestors. - * - * @param path the absolute path name of the node to be created; - * @param value the initial value to be associated with the node - * @param flags the ZK flags of the sequence node to be created - * (in addition to SEQUENCE) - * @param createAncestors if true and there are some missing ancestor - * nodes, this method will attempt to create them - * - * @return the sequence number associate with newly created node, - * or -1 if it couldn't be created - * @throw ZooKeeperException if the operation has failed - */ - int64_t createSequence(const string &path, - const string &value = "", - int flags = 0, - bool createAncestors = true) - throw(ZooKeeperException); - - /** - * \brief Deletes a node identified by the given path. - * - * @param path the absolute path name of the node to be deleted - * @param recursive if true this method will attempt to remove - * all children of the given node if any exist - * @param version the expected version of the node. The function will - * fail if the actual version of the node does not match - * the expected version - * - * @return true if the node has been deleted; false otherwise - * @throw ZooKeeperException if the operation has failed - */ - bool deleteNode(const string &path, bool recursive = false, int version = -1) - throw(ZooKeeperException); - - /** - * \brief Checks whether the given node exists or not. - * - * @param path the absolute path name of the node to be checked - * @param listener the listener for ZK watcher events; - * passing non NULL effectively establishes - * a ZK watch on the given node - * @param context the user specified context that is to be passed - * in a corresponding {@link ZKWatcherEvent} at later time; - * not used if listener is NULL - * @param stat the optional node statistics to be filled in by ZK - * - * @return true if the given node exists; false otherwise - * @throw ZooKeeperException if the operation has failed - */ - bool nodeExists(const string &path, - ZKEventListener *listener = NULL, - void *context = NULL, - Stat *stat = NULL) - throw(ZooKeeperException); - - /** - * \brief Retrieves list of all children of the given node. - * - * @param path the absolute path name of the node for which to get children - * @param listener the listener for ZK watcher events; - * passing non NULL effectively establishes - * a ZK watch on the given node - * @param context the user specified context that is to be passed - * in a corresponding {@link ZKWatcherEvent} at later time; - * not used if listener is NULL - * - * @return the list of absolute paths of child nodes, possibly empty - * @throw ZooKeeperException if the operation has failed - */ - void getNodeChildren(vector &children, - const string &path, - ZKEventListener *listener = NULL, - void *context = NULL) - throw(ZooKeeperException); - - /** - * \brief Gets the given node's data. - * - * @param path the absolute path name of the node to get data from - * @param listener the listener for ZK watcher events; - * passing non NULL effectively establishes - * a ZK watch on the given node - * @param context the user specified context that is to be passed - * in a corresponding {@link ZKWatcherEvent} at later time; - * not used if listener is NULL - * @param stat the optional node statistics to be filled in by ZK - * - * @return the node's data - * @throw ZooKeeperException if the operation has failed - */ - string getNodeData(const string &path, - ZKEventListener *listener = NULL, - void *context = NULL, - Stat *stat = NULL) - throw(ZooKeeperException); - - /** - * \brief Sets the given node's data. - * - * @param path the absolute path name of the node to get data from - * @param value the node's data to be set - * @param version the expected version of the node. The function will - * fail if the actual version of the node does not match - * the expected version - * - * @throw ZooKeeperException if the operation has failed - */ - void setNodeData(const string &path, const string &value, int version = -1) - throw(ZooKeeperException); - - /** - * \brief Validates the given path to a node in ZK. - * - * @param the path to be validated - * - * @throw ZooKeeperException if the given path is not valid - * (for instance it doesn't start with "/") - */ - static void validatePath(const string &path) throw(ZooKeeperException); - - /** - * Returns the current state of this adapter. - * - * @return the current state of this adapter - * @see AdapterState - */ - AdapterState getState() const { - return m_state; - } - - private: - - /** - * This enum defines methods from this class than can trigger an event. - */ - enum WatchableMethod { - NODE_EXISTS = 0, - GET_NODE_CHILDREN, - GET_NODE_DATA - }; - - /** - * \brief Creates a new node identified by the given path. - * This method is used internally to implement {@link createNode(...)} - * and {@link createSequence(...)}. On success, this method will set - * createdPath. - * - * @param path the absolute path name of the node to be created - * @param value the initial value to be associated with the node - * @param flags the ZK flags of the node to be created - * @param createAncestors if true and there are some missing ancestor nodes, - * this method will attempt to create them - * @param createdPath the actual path of the node that has been created; - * useful for sequences - * - * @return true if the node has been successfully created; false otherwise - * @throw ZooKeeperException if the operation has failed - */ - bool createNode(const string &path, - const string &value, - int flags, - bool createAncestors, - string &createdPath) - throw(ZooKeeperException); - - /** - * Handles an asynchronous event received from the ZK. - */ - void handleEvent(int type, int state, const string &path); - - /** - * Handles an asynchronous event received from the ZK. - * This method iterates over all listeners and passes the event - * to each of them. - */ - void handleEvent(int type, int state, const string &path, - const Listener2Context &listeners); - - /** - * \brief Enqueues the given event in {@link #m_events} queue. - */ - void enqueueEvent(int type, int state, const string &path); - - /** - * \brief Processes all ZK adapter events in a loop. - */ - void processEvents(); - - /** - * \brief Processes all user events in a loop. - */ - void processUserEvents(); - - /** - * \brief Registers the given context in the {@link #m_zkContexts} - * \brief contexts map. - * - * @param method the method where the given path is being used - * @param path the path of interest - * @param listener the event listener to call back later on - * @param context the user specified context to be passed back to user - */ - void registerContext(WatchableMethod method, const string &path, - ZKEventListener *listener, ContextType context); - - /** - * \brief Attempts to find a listener to context map in the contexts' - * \brief map, based on the specified criteria. - * If the context is found, it will be removed the udnerlying map. - * - * @param method the method type identify Listener2Context map - * @param path the path to be used to search in the Listener2Context map - * - * @return the context map associated with the given method and path, - * or empty map if not found - */ - Listener2Context findAndRemoveListenerContext(WatchableMethod method, - const string &path); - - /** - * Sets the new state in case it's different then the current one. - * This method assumes that {@link #m_stateLock} has been already locked. - * - * @param newState the new state to be set - */ - void setState(AdapterState newState); - - /** - * Waits until this client gets connected. The total wait time - * is given by {@link getRemainingConnectTimeout()}. - * If a timeout elapses, this method will throw an exception. - * - * @throw ZooKeeperException if unable to connect within the given timeout - */ - void waitUntilConnected() - throw(ZooKeeperException); - - /** - * Verifies whether the connection is established, - * optionally auto reconnecting. - * - * @throw ZooKeeperConnection if this client is disconnected - * and auto-reconnect failed or was not allowed - */ - void verifyConnection() throw(ZooKeeperException); - - /** - * Returns the remaining connect timeout. The timeout resets - * to {@link #m_connectTimeout} on a successfull connection to the ZK. - * - * @return the remaining connect timeout, in milliseconds - */ - long long int getRemainingConnectTimeout() { - return m_remainingConnectTimeout; - } - - /** - * Resets the remaining connect timeout to {@link #m_connectTimeout}. - */ - void resetRemainingConnectTimeout() { - m_remainingConnectTimeout = m_zkConfig.getConnectTimeout(); - } - - /** - * Updates the remaining connect timeout to reflect the given wait time. - * - * @param time the time for how long waited so far on connect to succeed - */ - void waitedForConnect(long long time) { - m_remainingConnectTimeout -= time; - } - - private: - - /** - * The mutex use to protect {@link #m_zkContexts}. - */ - zkfuse::Mutex m_zkContextsMutex; - - /** - * The map of registered ZK paths that are being watched. - * Each entry maps a function type to another map of registered contexts. - * - * @see WatchableMethod - */ - map m_zkContexts; - - /** - * The current ZK configuration. - */ - const ZooKeeperConfig m_zkConfig; - - /** - * The current ZK session. - */ - zhandle_t *mp_zkHandle; - - /** - * The blocking queue of all events waiting to be processed by ZK adapter. - */ - BlockingQueue m_events; - - /** - * The blocking queue of all events waiting to be processed by users - * of ZK adapter. - */ - BlockingQueue m_userEvents; - - /** - * The thread that dispatches all events from {@link #m_events} queue. - */ - CXXThread m_eventDispatcher; - - /** - * The thread that dispatches all events from {@link #m_userEvents} queue. - */ - CXXThread m_userEventDispatcher; - - /** - * Whether {@link #m_eventDispatcher} is terminating. - */ - volatile bool m_terminating; - - /** - * Whether this adapter is connected to the ZK. - */ - volatile bool m_connected; - - /** - * The state of this adapter. - */ - AdapterState m_state; - - /** - * The lock used to synchronize access to {@link #m_state}. - */ - Lock m_stateLock; - - /** - * How much time left for the connect to succeed, in milliseconds. - */ - long long int m_remainingConnectTimeout; - -}; - -} /* end of 'namespace zk' */ - -#endif /* __ZKADAPTER_H__ */ diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/zkfuse/src/zkfuse.cc b/pkg/registry/zookeeper-3.4.6/src/contrib/zkfuse/src/zkfuse.cc deleted file mode 100644 index 6a8216885..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/contrib/zkfuse/src/zkfuse.cc +++ /dev/null @@ -1,4492 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you 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. - */ - -#define FUSE_USE_VERSION 26 - -#ifdef HAVE_CONFIG_H -#include -#endif - -#undef _GNU_SOURCE -#define _GNU_SOURCE - -extern "C" { -#include -#include -} -#include -#include -#include -#include -#include -#include -#include -#ifdef HAVE_SETXATTR -#include -#endif - -#include - -#include -#include -#include -#include -#include -#include - -#include "log.h" -#include "mutex.h" -#include "zkadapter.h" - -#define ZOOKEEPER_ROOT_CHILDREN_WATCH_BUG - -/** - Typedef for ZooKeeperAdapter::Data. -*/ -typedef std::string Data; -/** - Typedef for ZooKeeperAdapter::NodeNames. -*/ -typedef vector NodeNames; - -#define MAX_DATA_SIZE 1024; - -DEFINE_LOGGER(LOG, "zkfuse"); - -inline -uint64_t millisecsToSecs(uint64_t millisecs) -{ - return millisecs / 1000; -} -inline -uint64_t secsToMillisecs(uint64_t secs) -{ - return secs * 1000; -} -inline -uint64_t nanosecsToMillisecs(uint64_t nanosecs) -{ - return nanosecs / 1000000; -} -inline -uint64_t timespecToMillisecs(const struct timespec & ts) -{ - return secsToMillisecs(ts.tv_sec) + nanosecsToMillisecs(ts.tv_nsec); -} - -typedef boost::shared_ptr ZooKeeperAdapterSharedPtr; - -/** - * ZkFuseCommon - holds immutable configuration objects. - * - * No locks are required to access these objects. - * A ZkFuseCommon instance is considered to be a data object and may be copied. - */ -class ZkFuseCommon -{ - private: - /** - References the ZooKeeperAdapter instance to be used. - */ - ZooKeeperAdapterSharedPtr _zkAdapter; - /** - Path to the ZooKeeper root node. - */ - std::string _rootPathName; - /** - Name used to access data "file" when the ZK node has - children. - */ - std::string _dataFileName; - /** - Suffix added to path components to force interpretation of - path components as directory. This is usually only required - for the last component. For example, ZkFuse may consider - a leaf node a regular file, e.g. /a/b/c/leaf. The suffix - can be used to create child under this node, e.g. - mkdir /a/b/c/leaf{forceDirSuffix}/new_leaf. - */ - std::string _forceDirSuffix; - /** - Prefix common to all metadata nodes created by ZkFuse. - */ - std::string _metadataNamePrefix; - /** - Path component name that identifies a directory metadata node. - A directory metadata node is currently empty. It is used by ZkFuse - to create a child when mkdir is used. This prevents ZkFuse - from interpreting the new child as a regular file. - */ - std::string _dirMetadataName; - /** - Path component name that identifies a regular file metadata node. - A regular metadata node holds metadata required to implement - Posix regular file semantics, such as setting mtime. - */ - std::string _regMetadataName; - /** - Number of not-in-use nodes to cache. - */ - unsigned _cacheSize; - /** - Assume this userid owns all nodes. - */ - const uid_t _uid; - /** - Assume this groupid owns all nodes. - */ - const gid_t _gid; - /** - Blocksize used to calculate number of blocks used for stat. - */ - const unsigned _blkSize; - - public: - /** - Constructor. - */ - ZkFuseCommon() - : _zkAdapter(), - _rootPathName("/"), - _dataFileName(), - _forceDirSuffix(), - _metadataNamePrefix(".zkfuse."), - _dirMetadataName(_metadataNamePrefix + "dir"), - _regMetadataName(_metadataNamePrefix + "file"), - _cacheSize(256), - _uid(geteuid()), - _gid(getegid()), - _blkSize(8192) - { - } - /** - Get root path name. Always "/". - \see _rootPathName - */ - const std::string & getRootPathName() const - { - return _rootPathName; - } - /** - Get dataFileName - the name for synthesized files to access - ZooKeeper node data. - \see _dataFileName - */ - const std::string & getDataFileName() const - { - return _dataFileName; - } - /** - Set dataFileName. - \see getDataFileName - \see _dataFileName - */ - void setDataFileName(const std::string & dataFileName) - { - _dataFileName = dataFileName; - } - /** - Get metadataNamePrefix - the common prefix for all ZkFuse created - metadata ZooKeeper nodes. - \see _metadataNamePrefix - */ - const std::string & getMetadataNamePrefix() const - { - return _metadataNamePrefix; - } - /** - Get forceDirSuffix - the suffix added to a path component to force - the path component to be treated like a directory. - \see _forceDirSuffix - */ - const std::string & getForceDirSuffix() const - { - return _forceDirSuffix; - } - /** - Set forceDirSuffix. - \see getForceDirSuffix - \see _forceDirSuffix - */ - void setForceDirSuffix(const std::string & forceDirSuffix) - { - _forceDirSuffix = forceDirSuffix; - } - /** - Get dirMetadataName - path component name of all directory - metadata ZooKeeper nodes. - \see _dirMetadataname - */ - const std::string & getDirMetadataName() const - { - return _dirMetadataName; - } - /** - Get regMetadataName - path component name of all regular file - metadata ZooKeeper nodes. - \see _regMetadataname - */ - const std::string & getRegMetadataName() const - { - return _regMetadataName; - } - /** - Get number of not-in-use ZkFuseFile instances to to cache. - \see _cacheSize - */ - unsigned getCacheSize() const - { - return _cacheSize; - } - /** - Set cache size. - \see getCacheSize - \see _cacheSize - */ - void setCacheSize(unsigned v) - { - _cacheSize = v; - } - /** - Get userid. - \see _uid - */ - uid_t getUid() const - { - return _uid; - } - /** - Get groupid. - \see _gid - */ - gid_t getGid() const - { - return _gid; - } - /** - Get block size. - \see _blkSize - */ - unsigned getBlkSize() const - { - return _blkSize; - } - /** - Get ZooKeeperAdapter. - \see _zkAdapter. - */ - const ZooKeeperAdapterSharedPtr & getZkAdapter() const - { - return _zkAdapter; - } - /** - Set ZooKeeperAdapter. - \see _zkAdaptor - */ - void setZkAdapter(const ZooKeeperAdapterSharedPtr & zkAdapter) - { - _zkAdapter = zkAdapter; - } -}; - -/** - ZkFuseNameType - identifies the type of the ZkFuse path. - */ -enum ZkFuseNameType { - /** - ZkFuse path is not syntheiszed. - ZkFuse should use its default rules to determine the Posix representation - of the path. - */ - ZkFuseNameDefaultType = 0, - /** - ZkFuse path is synthesized and identifies the data part of a - ZooKeeper node, i.e. Posix regular file semantics is expected. - */ - ZkFuseNameRegType = 1, - /** - ZkFuse path is synthesized and identifies the chidlren part of a - ZooKeeper node, i.e. Posix directory semantics is expected. - */ - ZkFuseNameDirType = 2 -}; - -class ZkFuseFile; - -typedef ZkFuseFile * ZkFuseFilePtr; - -class ZkFuseHandleManagerFactory; - -/** - ZkFuseHandleManager - keeps track of all the ZkFuseFile instances - allocated by a ZkFuseHandleManager instance and provides them - with a handle that can be used by FUSE. - - It maps a ZooKeeper path to a handle and a handle to a ZkFuse instance. - It also implements the methods that takes path names as arguments, such - as open, mknod, rmdir, and rename. - - Memory management - - References ZkFuseFile instances using regular pointers - Smart pointer is not used because reference counts are needed to - determine how many time a node is opened as a regular file or - directory. This also avoids circular smart pointer references. - - Each ZkFuseFile instance holds a reference to its ZkFuseHandleManager - using a boost::shared_ptr. This ensures that the ZkFuseHandleManager - instance that has the handle for the ZkFuseFile instance does not - get garbage collected while the ZkFuseFile instance exists. - - Concurrency control - - Except for the immutable ZkFuseCommon, all other member variables - are protected by _mutex. - - A method in this class can hold _mutex when it directly or - indirectly invokes ZkFuseFile methods. A ZkFuseFile method that holds - a ZkFuseFile instance _mutex cannot invoke a ZkFuseHandleManager - method that acquires the ZkFuseHandleManager instance's _mutex. - Otherwise, this may cause a dead lock. - - Methods that with names that begin with "_" do not acquire _mutex. - They are usually called by public methods that acquire and hold _mutex. - */ -class ZkFuseHandleManager : boost::noncopyable -{ - private: - /** - Typedef of handle, which is an int. - */ - typedef int Handle; - /** - Typedef of std::map used to map path to handle. - */ - typedef std::map Map; - /** - Typedef of std::vector used to map handle to ZkFuseFile instances. - */ - typedef std::vector Files; - /** - Typedef of std::vector used to hold unused handles. - */ - typedef std::vector FreeList; - /** - Typedef of boost::weak_ptr to the ZkFuseHandleManager instance. - */ - typedef boost::weak_ptr WeakPtr; - - /* Only ZkFuseHandleManagerFactory can create instances of this class */ - friend class ZkFuseHandleManagerFactory; - - /** - Contains common configuration. - Immutable so that it can be accessed without locks. - */ - const ZkFuseCommon _common; - /** - Maps a path name to a Handle. - */ - Map _map; - /** - Maps a handle to a ZkFuseFile instances. - Also holds pointers to all known ZkFuseFile instances. - An element may point to an allocated ZkFuseFile instance or be NULL. - - An allocated ZkFuseFile instance may be in one of the following states: - - in-use - Currently open, i.e. the ZkFuseFile instance's reference count - greater than 0. - - in-cache - Not currently open, i.e. the ZkFuseFile instances's - reference count is 0. - */ - Files _files; - /** - List of free'ed handles. - */ - FreeList _freeList; - /** - Mutex used to protect this instance. - */ - mutable zkfuse::Mutex _mutex; - /** - Count of number of in-use entries. - It used to calculate number of cached nodes. - Number cached nodes is (_files.size() - _numInUse). - */ - unsigned _numInUse; - /** - WeakPtr to myself. - */ - WeakPtr _thisWeakPtr; - - /** - Obtain a handle for the given path. - - If path is not known, then allocate a new handle and increment - _numInUse, and set newFile to true. The allocated - ZkFuseFile instance's reference count should be 1. - - If path is known, increase the corresponding - ZkFuseFile instance's reference count. - - \return the allocated handle. - \param path the path to lookup. - \param newFile indicates whether a new handle has been allocated. - */ - Handle allocate(const std::string & path, bool & newFile); - - /** - Constructor. - - \param common the immutable common configuration. - \param reserve number of elements to pre-allocate for - _files and _freeList. - */ - ZkFuseHandleManager( - const ZkFuseCommon & common, - const unsigned reserve) - : _common(common), - _files(), - _freeList(), - _mutex(), - _numInUse(0) - { - _files.reserve(reserve); - _files[0] = NULL; /* 0 never allocated */ - _files.resize(1); - _freeList.reserve(reserve); - } - - public: - /** - Typedef for boost::shared_ptr for this ZkFuseHandleManager class. - */ - typedef boost::shared_ptr SharedPtr; - - /** - Destructor. - */ - ~ZkFuseHandleManager() - { - } - /** - Get the ZkFuseFile instance for a handle. - - \return the ZkFuseFile instance identified by the handle. - \param handle get ZkFuseFile instance for this handle. - */ - ZkFuseFilePtr getFile(Handle handle) const - { - AutoLock lock(_mutex); - return _files[handle]; - } - /** - Get the immutable common configuration. - - \return the common configuration instance. - */ - const ZkFuseCommon & getCommon() const - { - return _common; - } - /** - Deallocate a previously allocated handle. - This decrements the reference count of the corresponding - ZkFuseFile instance. If the reference count becomes zero, - decrement _numInUse. It may also cause the ZkFuseFile instance - to be reclaimed if there are too many cached ZkFuseFile instances. - - The ZkFuseFile instance should be reclaimed if the number of - unused ZkFuseFile instances exceeds the configured cache size, i.e. - (_files.size() - _numInUse) > _common.getCacheSize() - and the ZkFuseFile instance has a reference count of zero. - - Reclaiming a ZkFuseFile instance involves removing the ZkFuseFile - instance's path to handle mapping from _map and the handle to the - ZkFuseFile instance mapping from _files, adding the handle to - the _freeList, and finally deleting the ZkFuseFile instance. - - \param handle the handle that should be deallocated. - */ - void deallocate(Handle handle); - /** - Handles ZooKeeper session events. - It invokes the known ZkFuseFile instances to let them know - that their watches will no longer be valid. - */ - void eventReceived(const ZKWatcherEvent & event); - /** - Get data from the specified the ZooKeeper path. - - \return 0 if successful, otherwise return negative errno. - \param path the path of the ZooKeeper node. - \param data return data read. - */ - int getData(const std::string & path, Data & data); - /** - Set data into the specified ZooKeeper path. - - \return 0 if successful, otherwise return negative errno. - \param path the path of the ZooKeeper node. - \param data the data to be written. - \param exists set to true if this path exists. - \param doFlush set to true if new data should be flushed to ZooKeeper. - */ - int setData(const std::string & path, - const Data & data, - bool exists, - bool doFlush); - /** - Create a ZooKeeper node to represent a ZkFuse file or directory. - - \return handle if successful, otherwise return negative errno. - \param path to create. - \param mode should be either S_IFDIR for directory or - S_IFREG for regular file. - \param mayExist if set and the ZooKeeper node already exist, return - valid handle instead of -EEXIST. - \param created returns whether a new ZooKeeper node had been created. - */ - int mknod(const std::string & path, - mode_t mode, - bool mayExist, - bool & created); - /** - Open a ZooKeeper node. - - The justCreated argument is used to differentiate if the _deleted flag - of the ZkFuseFile instance is to be trusted (i.e. the path - does not exist in ZooKeeper.) The _deleted flag is trusted - if the ZkFuseFile instance is known to exist in ZooKeeper after - invoking ZooKeeper with the path. - - If justCreated is true, then the ZkFuseFile instance was just created. - The ZkFuseFile constructor sets the _deleted flag to true because - path is not known to exist and hence should not be accessed. - The justCreated flag will force the ZkFuseFile instance to invoke - ZooKeeper to determine if the path exists. - - \return handle if successful, otherwise return negative errno. - \param path the path to open. - \param justCreated indicates if this is newly created ZkFuseFile instance. - */ - int open(const std::string & path, bool justCreated); - /** - Remove a ZkFuse directory. - - If force is not set, then the ZooKeeper node will be removed only - if it has no data and no child nodes except ZkFuse metadata nodes. - - \return 0 if successful, otherwise return negative errno. - \param path the path to remove. - \param force force removal, i.e. bypass checks. - */ - int rmdir(const char * path, bool force = false); - /** - Make a ZkFuse directory. - - ZkFuse represents a ZooKeeper node with no data and no children - as a regular file. In order to differentiate a newly created - directory from an empty regular file, mkdir will create a directory - metadata node as a child of the directory. - - \return 0 if successful, otherwise return negative errno. - \param path the path of the directory to create. - \param mode create directory with this mode - (mode currently not implemented). - */ - int mkdir(const char * path, mode_t mode); - /** - Remove a ZkFuse regular file. - - A file is the abstraction for the data part of a ZooKeeper node. - - If ZkFuse represents a ZooKeeper node as a directory, the data part - of the node is represented by synthesizing a name for this file. This - synthesized name is visible through readdir if the ZooKeeper node's - data is not empty. Removing such a file is done by truncating - the ZooKeeper node's data to 0 length. - - If ZkFuse represents a ZooKeeper node as a file, then removing the - is done by removing the ZooKeeper node (and its metadata). - - \return 0 if successful, otherwise return negative errno. - \param path the path of the file to remove. - */ - int unlink(const char * path); - /** - Get attributes of a ZkFuse regular file or directory. - - \return 0 if successful, otherwise return negative errno. - \param path get attributes for this path - \param stbuf store attributes here. - */ - int getattr(const char * path, struct stat & stbuf); - /** - Rename a ZkFuse regular file. - - It creates a new ZooKeeper node at toPath, copies data and file - metadata from the ZooKeeper node at fromPath to the new node, - and deletes the current ZooKeeper node. If the current ZooKeeper - node is not deleted if the new ZooKeeper node cannot be created - or the data copy fails. - - It cannot be used to rename a directory. - - \return 0 if successful, otherwise return negative errno. - \param fromPath the current path. - \param toPath rename to this path. - */ - int rename(const char * fromPath, const char * toPath); - /** - Add a child ZooKeeper path to the children information cache - of the ZkFuseFile instance that caches the parent ZooKeeper node. - - This is used to add a child path after a new ZooKeeper node has - been created to the children information cache of the parent - ZooKeeper node. This is needed because waiting for the children - changed event to update the cache may result in inconsistent local - views of the changes. - \see removeChildFromParent - - \parama childPath the path of the child ZooKeeper node. - */ - void addChildToParent(const std::string & childPath) const; - /** - Remove a child ZooKeeper path from the children information cache - of the ZkFuseFile instance that caches the parent ZooKeeper node. - - For example, this should happen whenever a path is deleted. - This child information cache of the parent will eventually be - invalidated by watches. However, the delivery of the children - change event may come after the next access and thus provide - the client with an inconsistent view. One example is that - client deletes the last file in a directory, but the children - changed event is not delivered before the client invokes rmdir. - to remove the parent. In this case, the rmdir fails because - the cached children information of the parent indicates the - "directory" is not empty. - - \param childPath the path of the child ZooKeeper node. - */ - void removeChildFromParent(const std::string & childPath) const; - /** - Return the path for the parent of the specified ZooKeeper path. - - \return the parent path. - \param childPath the child path. - */ - std::string getParentPath(const std::string & childPath) const; - /** - Return the ZooKeeper path from a ZkFuse path. - - The ZkFuse path may be a synthesized path. For example, a synthesized - path is required to access the data part of a ZooKeeper node's - data when ZkFuse represents the ZooKeeper node as directory. - A synthesized path is also required to create a child ZooKeeper node - under a ZooKeeper node that is represented by a regular file. - - \return the ZooKeeper path for path. - \param path the ZkFuse path, which may be a synthesized path. - \param nameType indicate whether the ZkFuse path is synthesized and - whether the synthesized ZkFuse path identifies a - directory or a regular file. - */ - std::string getZkPath(const char * path, ZkFuseNameType & nameType) const; -}; - -/** - ZkFuseHandleManagerFactory - factory for ZkFuseHandleManager. - - This is the only way to create a ZkFuseHandleManager instance. - to make sure that _thisWeakPtr of the instance is intialized - after the instance is created. - */ -class ZkFuseHandleManagerFactory -{ - public: - /** - Create an instance of ZkFuseHandleManager. - - \return the created ZkFuseHandleManager instance. - \param common the common configuration. - \param reserve initially reserve space for this number of handles. - */ - static ZkFuseHandleManager::SharedPtr create( - const ZkFuseCommon & common, - unsigned reserve = 1000) - { - ZkFuseHandleManager::SharedPtr manager - (new ZkFuseHandleManager(common, reserve)); - manager->_thisWeakPtr = manager; - return manager; - } -}; - -/** - ZkFuseAutoHandle - automatically closes handle. - - It holds an opened handle and automatically closes this handle - when it is destroyed. This enables code that open a handle - to be exception safe. - */ -class ZkFuseAutoHandle -{ - private: - /** - Typedef for Handle which is an int. - */ - typedef int Handle; - /** - Holds a reference to the ZkFuseHandlerManager instance that - allocated the handle. - */ - ZkFuseHandleManager::SharedPtr _manager; - /** - The handle that should be closed when this instance is destroyed. - A valid handle has value that is equal or greater than 0. - A negative value indicates an error condition, usually the value - is a negative errno. - */ - Handle _handle; - /** - Caches a reference to the ZkFuseFile instance with this handle. - This is a performance optimization so that _manager.getFile(_handle) - is only called once when the handle is initialized. - */ - ZkFuseFilePtr _file; - - /** - Initialize reference to the ZkFuseFile instance with this handle. - */ - void _initFile() - { - if (_handle >= 0) { - _file = _manager->getFile(_handle); - } else { - _file = NULL; - } - } - - public: - /** - Constructor - takes an previously opened handle. - - \param manager the ZkFuseHandleManager instance who allocated the handle. - \param handle the handle. - */ - ZkFuseAutoHandle( - const ZkFuseHandleManager::SharedPtr & manager, - int handle) - : _manager(manager), - _handle(handle), - _file() - { - _initFile(); - } - /** - Constructor - open path and remember handle. - - \param manager the ZkFuseHandleManager instance who allocated the handle. - \param path open this path and remember its handle in this instance. - */ - ZkFuseAutoHandle( - const ZkFuseHandleManager::SharedPtr & manager, - const std::string & path) - : _manager(manager), - _handle(_manager->open(path, false)), - _file() - { - _initFile(); - } - /** - Constructor - create path and remember handle. - - The creation mode indicates whether the path identifies a regular file - or a directory. - - \param manager the ZkFuseHandleManager instance who allocated the handle. - \param path create this path and remember its handle in this instance. - \param mode the creation mode for the path, should be either - S_IFDIR or S_IFDIR. - \param mayExist, if set and the path already exists, - then the ZkFuseAutoHandle will hold the handle - for the path instead of -EEXIST. - If not set and the path does not exist, then the handle - be -EEXIST. - */ - ZkFuseAutoHandle( - const ZkFuseHandleManager::SharedPtr & manager, - const std::string & path, - mode_t mode, - bool mayExist) - : _manager(manager), - _handle(-1), - _file() - { - bool created; - _handle = _manager->mknod(path, mode, mayExist, created); - _initFile(); - } - /** - Destructor - closes the handle. - */ - ~ZkFuseAutoHandle() - { - reset(); - } - /** - Get the handle. - \see _handle - */ - int get() const - { - return _handle; - } - /** - Get the ZkFuseFile instance of the handle. - \see _file - */ - ZkFuseFilePtr getFile() const - { - return _file; - } - /** - Forget the handle, don't close the handle. - */ - void release() - { - _handle = -1; - _file = NULL; - } - /** - Change the remembered handle. - - It will close the current handle (if valid). - */ - void reset(int handle = -1); -}; - -/** - ZkFuseStat - C++ wrapper for ZooKeeper Stat. - - This wrapper provides ZooKeeper Stat will constructors that - initializes the instance variables of Stat. - */ -class ZkFuseStat : public Stat -{ - public: - /** - Constructor - clear instance variables. - */ - ZkFuseStat() - { - clear(); - } - /** - Destructor - do nothing. - */ - ~ZkFuseStat() - { - } - /** - Clear instance variables. - */ - void clear() - { - czxid = 0; - mzxid = 0; - ctime = 0; - mtime = 0; - version = 0; - cversion = 0; - aversion = 0; - } -}; - -/** - ZkFuseFile - an instance encapsulates the runtime state of an allocated - ZooKeeper node. - - Memory management - - Referenced by the ZkFuseHandleManager that created this instance. - - Uses boost::shared_ptr to reference the ZkFuseHandleManager that - created this instance. This makes sure that this ZkFuseHandleManager - instance cannot be deleted when it has allocated ZkFuseFile instances. - - A ZkFuseHandleManager deletes itself if it can be reclaimed. - It can be reclaimed if it has no watches, its reference count is zero, - and the ZkFuseHandleManager instance would have more than the - configured number of cached ZkFuseFile instances. - - A ZkFuseFile instance cannot be deleted if it has active watches on - its ZooKeeper node. When one of its watches fires, the ZkFuseFile - instance must exist because one of its methods will be invoked - to process the event. If the ZkFuseFile instance has been deleted, - the method will access previously freed memory. - - Concurrency control - - _mutex protects the instance variables of an instance. - - Callers should assume that a public method will acquire _mutex. - - Methods of this class may not hold _mutex while invoking an - ZkFuseHandleManager instance. - - Methods that with names that begin with "_" do not acquire _mutex. - They are usually called by public methods that acquire and hold _mutex. -*/ -class ZkFuseFile : boost::noncopyable -{ - public: - /** - Maximum size for the data part of a ZooKeeper node. - */ - static const unsigned maxDataFileSize = MAX_DATA_SIZE; - - private: - /** - Mode returned by getattr for a ZkFuse directory. - */ - static const mode_t dirMode = (S_IFDIR | 0777); - /** - Mode returned by getattr for a ZkFuse regular file. - */ - static const mode_t regMode = (S_IFREG | 0777); - - /** - References the ZkFuseHandleManager that created this instance. - */ - ZkFuseHandleManager::SharedPtr _manager; - /** - Handle for this instance. - */ - const int _handle; - /** - Path of the ZooKeeper node represented by this instance. - */ - const std::string _path; - /** - Mutex that protects the instance variables of this instance. - */ - mutable zkfuse::Mutex _mutex; - /** - Reference count for this instance, i.e. the number of opens - minus the number of closes. - */ - int _refCount; - /** - Indicates whether the ZooKeeper node exist. - This flag allows caching of deleted ZooKeeper node to avoid - repeated ZooKeeper lookups for a non-existent path, and avoid - using cached information. - - Its value is true if - - it is verified to exist (by calling ZooKeeper), or - - it is existence is unknown because ZooKeeper has not been - invoked to verify its path's existence. - */ - bool _deleted; - /** - Count of current number directory opens minus directory closes. - */ - int _openDirCount; - /** - Indicates whether cached children information is valid. - - It is true if the cached children information is valid. - */ - bool _initializedChildren; - /** - Indicates whether there is an outstanding children watch. - - It is true if it has an outstanding children watch. - */ - bool _hasChildrenListener; - /** - Cached children information. - - The cache is valid if _initializedChildren is true. - */ - NodeNames _children; - - /** - Indicates whether the cached data is valid. - - It is true if the cached data and ZooKeeper Stat are valid. - */ - bool _initializedData; - /** - Indicates whether there is an outstanding data watch. - - It is true if it has an outstanding data watch. - */ - bool _hasDataListener; - /** - Indicates whether the cached data (_activeData) has been modified. - - It is true if the cached data has been modified. - */ - bool _dirtyData; - /** - Currently active data. - - To maintain atomicity of updates and emulate Posix semantics, - when a ZkFuse file remains open, the same data will be accessed - by the file's clients. The data will be flushed to ZooKeeper when - the flush method is called. The flush method may be called - explicitly by a client or implicitly when the ZkFuse file is no - longer currently open. - - _activeData and _activeStat stores the data and ZooKeeper Stat - that will be accessed by the file's clients. - - If there are changes when the ZkFuse file is open, new data is - cached as latest data (by _latestData and _latestStat). - */ - Data _activeData; - /** - Currently active ZooKeeper Stat. - \see _activeData - */ - ZkFuseStat _activeStat; - /** - Latest data. - This is either the same as _activeData or it is newer. It is newer - is it has been updated by event triggered by a data watch. - */ - Data _latestData; - /** - Latest ZooKeeper data. - This is either the same as _activeStat or it is newer. It is newer - is it has been updated by event triggered by a data watch. - */ - ZkFuseStat _latestStat; - - /** - Get userid. - - \return the userid. - */ - uid_t _getUid() const - { - return _manager->getCommon().getUid(); - } - /** - Get groupid. - - \return the groupid. - */ - gid_t _getGid() const - { - return _manager->getCommon().getGid(); - } - /** - Get block size. - - \return the block size. - */ - unsigned _getBlkSize() const - { - return _manager->getCommon().getBlkSize(); - } - /** - Get number of children, include metadata children in the count. - - \return the number of children including metadata children. - */ - unsigned _numChildrenIncludeMeta() const - { - unsigned count = _children.size(); - LOG_DEBUG(LOG, "numChildrenIncludeMeta() returns %u", count); - return count; - } - /** - Get number of children, exclude metadata children in the count. - - \return the number of children excluding metadata children. - */ - unsigned _numChildrenExcludeMeta() const - { - unsigned count = 0; - for (NodeNames::const_iterator it = _children.begin(); - it != _children.end(); - it++) { - if (!_isMeta(*it)) { - count++; - } - } - LOG_DEBUG(LOG, "numChildrenExcludeMeta() returns %u", count); - return count; - } - /** - Whether the ZooKeeper node has children, include metadata - children. - - \return true if it has children including metadata children. - */ - bool _hasChildrenIncludeMeta() const - { - return _numChildrenIncludeMeta() != 0; - } - /** - Return true if the ZooKeeper node has children, include metadata - children. - - \return true if it has children excluding metadata children. - */ - bool _hasChildrenExcludeMeta() const - { - return _numChildrenExcludeMeta() != 0; - } - /** - Whether the ZooKeeper node has data. - - \return true if _activeData is not empty. - */ - bool _hasData() const - { - return _activeData.empty() == false; - } - /** - Whether the ZooKeeper node has child with the specified path. - - \return true if the ZooKeeper node has a child with the specified path. - \param childPath the path of the child. - */ - bool _hasChildPath(const std::string & childPath) const - { - bool hasChild = - std::find(_children.begin(), _children.end(), childPath) - != _children.end(); - LOG_DEBUG(LOG, "hasChild(childPath %s) returns %d", - childPath.c_str(), hasChild); - return hasChild; - } - /** - Whether the given path component is a ZkFuse synthesized path - component. - - A ZkFuse synthesized path component will begin with - the metadataNamePrefix obtained from the common configuration. - \see _metadataNamePrefix - - \return true if the path component is a ZkFuse synthesized path - component. - \param childName the path component to check if it is synthesized by - ZkFuse. - */ - bool _isMeta(const std::string & childName) const - { - bool isMeta; - const std::string & prefix = - _manager->getCommon().getMetadataNamePrefix(); - unsigned offset = - (_path.length() > 1 ? - _path.length() + 1 : - 1 /* special case for root dir */ ); - unsigned minLength = offset + prefix.length(); - if (childName.length() < minLength || - childName.compare(offset, prefix.length(), prefix) != 0) { - isMeta = false; - } else { - isMeta = true; - } - LOG_DEBUG(LOG, "isMeta(childName %s) returns %d", - childName.c_str(), isMeta); - return isMeta; - } - /** - Build a path for a specific child of the ZooKeeper node. - - This is done by appending "/" (unless it is the ZooKeeper node - is the root node) and the name of the child. - - \return the path for the specified child of the ZooKeeper node. - \param name the name of the child. - */ - std::string _getChildPath(const std::string & name) const - { - return buildChildPath(_path, name); - } - /** - Whether the ZooKeeper node has a regular file metadata child node. - - \return true if the ZooKeeper node has a regular file metadata child - node. - */ - bool _hasRegMetadata() const - { - bool res = _hasChildPath( - _getChildPath(_manager->getCommon().getRegMetadataName())); - LOG_DEBUG(LOG, "hasRegMetadata() returns %d", res); - return res; - } - /** - Whether the ZooKeeper node has a directory metadata child node. - - \return true if the ZooKeeper node has a directory metadata child - node. - */ - bool _hasDirMetadata() const - { - bool res = _hasChildPath( - _getChildPath(_manager->getCommon().getDirMetadataName())); - LOG_DEBUG(LOG, "hasDirMetadata() returns %d", res); - return res; - } - /** - Whether ZkFuse should present the ZooKeeper node as a ZkFuse regular - file. - - It should be a ZkFuse regular file it has no children or its - only children is its regular file metadata child node. - - \return true if the Zookeeper node should be presented as a ZkFuse - regular file. - */ - bool _isReg() const - { - unsigned numChildrenIncludeMeta = _numChildrenIncludeMeta(); - bool res = - (numChildrenIncludeMeta == 0) || - (numChildrenIncludeMeta == 1 && _hasRegMetadata() == true); - LOG_DEBUG(LOG, "isReg() returns %d", res); - return res; - } - /** - Whether ZkFuse should present the ZooKeeper node as a ZkFuse directory. - - It should be a ZkFuse directory if it should not be presented as - a ZkFuse regular directory. - \see _isReg - - \return true if the Zookeeper node should be presented as a ZkFuse - directory. - */ - bool _isDir() const - { - return !_isReg(); - } - /** - Whether ZkFuse should present the ZooKeeper node as a ZkFuse regular - file by taking into account the specified ZkFuseNameType. - - The ZkFuseNameType may override the default ZkFuse presentation of - a ZooKeeper node. - - \return true if ZkFuse should present the ZooKeeper node as a ZkFuse - regular file. - \param nameType specifies the ZkFuseNameType. - \param doLock whether _mutex should be acquired, it should be true - if the caller did not acquire _mutex. - */ - bool _isRegNameType(ZkFuseNameType nameType, bool doLock = false) const - { - bool res; - switch (nameType) { - case ZkFuseNameRegType: - res = true; - break; - case ZkFuseNameDirType: - res = false; - break; - case ZkFuseNameDefaultType: - default: - if (doLock) { - AutoLock lock(_mutex); - res = _isReg(); - } else { - res = _isReg(); - } - break; - } - LOG_DEBUG(LOG, "isRegNameType(nameType %d) returns %d", - int(nameType), res); - return res; - } - /** - Whether ZkFuse should present the ZooKeeper node as a ZkFuse - directory by taking into account the specified ZkFuseNameType. - - The ZkFuseNameType may override the default ZkFuse presentation of - a ZooKeeper node. - - \return true if ZkFuse should present the ZooKeeper node as a ZkFuse - directory. - \param nameType specifies the ZkFuseNameType. - \param doLock whether _mutex should be acquired, it should be true - if the caller did not acquire _mutex. - */ - bool _isDirNameType(ZkFuseNameType nameType, bool doLock = false) const - { - bool res; - switch (nameType) { - case ZkFuseNameRegType: - res = false; - break; - case ZkFuseNameDirType: - res = true; - break; - case ZkFuseNameDefaultType: - default: - if (doLock) { - AutoLock lock(_mutex); - res = _isDir(); - } else { - res = _isDir(); - } - break; - } - LOG_DEBUG(LOG, "isDirNameType(nameType %d) returns %d", - int(nameType), res); - return res; - } - /** - ZkFuse regular file metadata. - */ - struct Metadata { - /** - Version of the ZooKeeper node data that this metadata is good for. - */ - uint32_t version; - /** - Acces time in milliseconds. - */ - uint64_t atime; - /** - Modified time in milliseconds. - */ - uint64_t mtime; - - /** - Constructor. - */ - Metadata() - : version(0), - atime(0), - mtime(0) - { - } - }; - /** - Encode Metadata into Data so that it can be stored in a metadata - ZooKeeper node. - - Each Metadata attribute is encoded as ": " on single line - terminated by newline. - - \param meta the input Metadata. - \param data the output Data after encoding. - */ - void _encodeMetadata(const Metadata & meta, Data & data) const - { - LOG_DEBUG(LOG, "encodeMetadata()"); - std::ostringstream oss; - oss << "version: " << meta.version << endl - << "atime: " << meta.atime << endl - << "mtime: " << meta.mtime << endl; - data = oss.str(); - } - /** - Decode Data from a metadata child ZooKeeper node into Metadata. - - Data is a stream of ": " records separated by newline. - - \param data the input Data. - \param meta the output Metadata after decoding. - */ - void _decodeMetadata(const Data & data, Metadata & meta) const - { - LOG_DEBUG(LOG, "decodeMetadata(data %s)", data.c_str()); - std::istringstream iss(data); - char key[128]; - char value[1024]; - while (!iss.eof()) { - key[0] = 0; - value[0] = 0; - iss.get(key, sizeof(key), ' '); - if (iss.eof()) { - break; - } - iss.ignore(32, ' '); - iss.getline(value, sizeof(value)); - LOG_DEBUG(LOG, "key %s value %s", key, value); - if (strcmp(key, "version:") == 0) { - unsigned long long v = strtoull(value, NULL, 0); - LOG_DEBUG(LOG, "version: %llu", v); - meta.version = v; - } - else if (strcmp(key, "atime:") == 0) { - unsigned long long v = strtoull(value, NULL, 0); - LOG_DEBUG(LOG, "atime: %llu", v); - meta.atime = v; - } - else if (strcmp(key, "mtime:") == 0) { - unsigned long long v = strtoull(value, NULL, 0); - LOG_DEBUG(LOG, "mtime: %llu", v); - meta.mtime = v; - } - else { - LOG_WARN(LOG, "decodeMetadata: path %s unknown key %s %s\n", - _path.c_str(), key, value); - } - } - LOG_DEBUG(LOG, "decodeMetadata done"); - } - /** - Flush data to the ZooKeeper node. - - If cached active data has been modified, flush it to the ZooKeeper node. - Returns -EIO if the data cannot be written because the cached active - data is not the expected version, i.e. ZooKeeper returns ZBADVERSION. - -EIO may also indicate a more general failure, such as unable to - communicate with ZooKeeper. - - \return 0 if successful, otherwise negative errno. - */ - int _flush() - { - LOG_DEBUG(LOG, "flush() path %s", _path.c_str()); - - int res = 0; - try { - if (_dirtyData) { - LOG_DEBUG(LOG, "is dirty, active version %d", - _activeStat.version); - _manager->getCommon().getZkAdapter()-> - setNodeData(_path, _activeData, _activeStat.version); - /* assumes version always increments by one if successful */ - _deleted = false; - _activeStat.version++; - _dirtyData = false; - res = 0; - } - else { - LOG_DEBUG(LOG, "not dirty"); - res = 0; - } - } catch (const ZooKeeperException & e) { - if (e.getZKErrorCode() == ZBADVERSION) { - LOG_ERROR(LOG, "flush %s bad version, was %d", - _path.c_str(), _activeStat.version); - res = -EIO; - } - else { - LOG_ERROR(LOG, "flush %s exception %s", - _path.c_str(), e.what()); - res = -EIO; - } - } - - LOG_DEBUG(LOG, "flush returns %d", res); - return res; - } - /** - Truncate or expand the size of the cached active data. - - This method only changes the size of the cached active data. - This change is committed to ZooKeeper when the cached data - is written to the ZooKeeper node by flush(). - - Return -EFBIG is the requested size exceeds the maximum. - - \return 0 if successful, otherwise negative errno. - \param size the requested size. - */ - int _truncate(off_t size) - { - LOG_DEBUG(LOG, "truncate(size %zu) path %s", size, _path.c_str()); - - int res = 0; - - if (!_isInitialized()) { - LOG_DEBUG(LOG, "not initialized"); - res = -EIO; - } - else if (size > _activeData.size()) { - if (size > maxDataFileSize) { - LOG_DEBUG(LOG, "size > maxDataFileSize"); - res = -EFBIG; - } else { - LOG_DEBUG(LOG, "increase to size"); - _activeData.insert(_activeData.begin() + - (size - _activeData.size()), 0); - _dirtyData = true; - res = 0; - } - } - else if (size < _activeData.size()) { - LOG_DEBUG(LOG, "decrease to size"); - _activeData.resize(size); - _dirtyData = true; - res = 0; - } - else { - LOG_DEBUG(LOG, "do nothing, same size"); - } - - LOG_DEBUG(LOG, "truncate returns %d", res); - return res; - } - /** - Remove a ZkFuse directory. - - If force is true, then the ZooKeeper node and its decendants - will be deleted. - - If force is false, then this method implements the semantics - of removing a ZkFuse directory. It will delete the ZooKeeper node - only if the ZooKeeper node have no data and no non-metadata - children. - - Return -ENOTDIR if the ZooKeeper node is not considered - to be a directory (after taking into consideration the specified - ZkFuseNameType). - - Return -ENOTEMPTY if the ZooKeeper node has data or it has - non-metadata children. - - Return -ENOENT if the ZooKeeper cannot be deleted, usually this - is because it does not exist. - - \return 0 if successful, otherwise negative errno. - \param nameType the ZkFuseNameType of the path used to specify the - directory to be removed. It influences whether ZkFuse - considers the ZooKeeper node to be a regular file or - directory. \see ZkFuseNameType - \param force set to true to bypass ZkFuse rmdir semantic check. - */ - int _rmdir(ZkFuseNameType nameType, bool force) - { - LOG_DEBUG(LOG, "rmdir(nameType %d, force %d) path %s", - int(nameType), force, _path.c_str()); - - int res = 0; - try { - if (!force && !_isDirNameType(nameType)) { - LOG_DEBUG(LOG, "failed because not directory"); - res = -ENOTDIR; - } - else if (!force && _hasData()) { - /* rmdir cannot occur if there non-empty "data file" */ - LOG_DEBUG(LOG, "failed because node has data"); - res = -ENOTEMPTY; - } - else if (!force && _hasChildrenExcludeMeta()) { - /* rmdir cannot occur if there are "subdirs" */ - LOG_DEBUG(LOG, "failed because node has children"); - res = -ENOTEMPTY; - } - else { - LOG_DEBUG(LOG, "delete node"); - bool deleted = _manager->getCommon().getZkAdapter()-> - deleteNode(_path, true); - if (deleted) { - _deleted = true; - _clearChildren(); - res = 0; - } else { - /* TODO: differentiate delete error conditions, - * e.g. access permission, not exists, ... ? - */ - LOG_DEBUG(LOG, "delete failed"); - res = -ENOENT; - } - } - } catch (const std::exception & e) { - LOG_ERROR(LOG, "rmdir %s exception %s", _path.c_str(), e.what()); - res = -EIO; - } - - LOG_DEBUG(LOG, "rmdir returns %d", res); - return res; - } - /** - Remove a ZkFuse regular file. - - This method implements the semantics of removing a ZkFuse regular file. - - If the ZkFuse regular file represents the data part of the - ZooKeeper node which is presented as a ZkFuse directory, - the regular file is virtually deleted by truncating the - ZooKeeper node's data. Readdir will not synthesize a regular - file entry for the data part of a ZooKeeper node if - the ZooKeeper node has no data. - - If the ZkFuse regular file represents the data part of the - ZooKeeper node which is presented as a ZkFuse regular file, - the ZooKeeper node and its decendants are deleted. - - Returns -EISDIR if the ZkFuse regular file cannot be deleted - because ZkFuse consider it to be a directory. - - \return 0 if successful, otherwise negative errno. - \param nameType the ZkFuseNameType of the path used to specify the - directory to be removed. It influences whether ZkFuse - considers the ZooKeeper node to be a regular file or - directory. \see ZkFuseNameType - */ - int _unlink(ZkFuseNameType nameType) - { - LOG_DEBUG(LOG, "unlink(nameType %d) path %s", - int(nameType), _path.c_str()); - - int res = 0; - switch (nameType) { - case ZkFuseNameRegType: - if (_isDir()) { - res = _truncate(0); - } else { - res = _rmdir(nameType, true); - } - break; - case ZkFuseNameDirType: - res = -EISDIR; - break; - case ZkFuseNameDefaultType: - default: - if (_isReg()) { - res = _rmdir(nameType, true); - } else { - res = -EISDIR; - } - break; - } - - LOG_DEBUG(LOG, "unlink returns %d", res); - return res; - } - /** - Whether cached children and data are valid. - - \return true if cached children and data are valid. - */ - bool _isInitialized() const - { - return _initializedChildren && _initializedData; - } - /** - Clear and invalidate cached children information. - */ - void _clearChildren() - { - _initializedChildren = false; - _children.clear(); - } - /** - Clear and invalidate cached data. - */ - void _clearData() - { - _initializedData = false; - _dirtyData = false; - _activeData.clear(); - _activeStat.clear(); - _latestData.clear(); - _latestStat.clear(); - } - /** - Whether the ZkFuseFile instance is a zombie. - - It is a zombie if it is not currently open, i.e. its reference count - is 0. - */ - bool _isZombie() const - { - return (_refCount == 0); - } - /** - Whether the ZkFuseFile instance is currently opened as a regular file - only once. - - It is used to determine when the cached data can be replaced with - the latest data. \see _activeData. - - \return true if its currently opened as a regular file only once. - */ - bool _isOnlyRegOpen() const - { - return ((_refCount - _openDirCount) == 1); - } - /** - Get attributes without accessing metadata. - - The atime and mtime returned does not take into consideration - overrides present in a matadata file. - - \return 0 if successful, otherwise negative errno. - \param stbuf return attributes here. - \param nameType specifies the ZkFuseNameType of the ZkFuse path used - to get attributes. It influences whether the directory - or regular file attributes are returned. - */ - int _getattrNoMetaAccess(struct stat & stbuf, ZkFuseNameType nameType) const - { - int res = 0; - if (_deleted) { - LOG_DEBUG(LOG, "deleted"); - res = -ENOENT; - } - else if (!_isInitialized()) { - LOG_DEBUG(LOG, "not initialized"); - res = -EIO; - } - else { - assert(_isInitialized()); - bool isRegular = _isRegNameType(nameType); - if (isRegular) { - LOG_DEBUG(LOG, "regular"); - stbuf.st_mode = regMode; - stbuf.st_nlink = 1; - stbuf.st_size = _activeData.size(); - } else { - LOG_DEBUG(LOG, "directory"); - stbuf.st_mode = dirMode; - stbuf.st_nlink = - _children.size() + (_activeData.empty() ? 0 : 1); - stbuf.st_size = stbuf.st_nlink; - } - stbuf.st_uid = _getUid(); - stbuf.st_gid = _getGid(); - /* IMPORTANT: - * Conversion to secs from millisecs must occur before - * assigning to st_atime, st_mtime, and st_ctime. Otherwise - * truncating from 64-bit to 32-bit will cause lost of - * most significant 32-bits before converting to secs. - */ - stbuf.st_atime = millisecsToSecs(_activeStat.mtime); - stbuf.st_mtime = millisecsToSecs(_activeStat.mtime); - stbuf.st_ctime = millisecsToSecs(_activeStat.ctime); - stbuf.st_blksize = _getBlkSize(); - stbuf.st_blocks = - (stbuf.st_size + stbuf.st_blksize - 1) / stbuf.st_blksize; - res = 0; - } - return res; - } - /** - Get the context that should be registered with the data and - children watches. - - The returned context is a pointer to the ZkFuseFile instance - cast to the desired ContextType. - - \return the context. - */ - ZooKeeperAdapter::ContextType _getZkContext() const - { - return (ZooKeeperAdapter::ContextType) NULL; - } - - /** - DataListener - listener that listens for ZooKeeper data events - and calls dataEventReceived on the ZkFuseFile instance - identified by the event context. - \see dataEventReceived - */ - class DataListener : public ZKEventListener { - public: - /** - Received a data event and invoke ZkFuseFile instance obtained from - event context to handle the event. - */ - virtual void eventReceived(const ZKEventSource & source, - const ZKWatcherEvent & event) - { - assert(event.getContext() != 0); - ZkFuseFile * file = static_cast(event.getContext()); - file->dataEventReceived(event); - } - }; - - /** - DataListener - listener that listens for ZooKeeper children events - and calls childrenEventReceived on the ZkFuseFile instance - identified by the event context. - \see childrenEventReceived - */ - class ChildrenListener : public ZKEventListener { - public: - /** - Received a children event and invoke ZkFuseFile instance obtained from - event context to handle the event. - */ - virtual void eventReceived(const ZKEventSource & source, - const ZKWatcherEvent & event) - { - assert(event.getContext() != 0); - ZkFuseFile * file = static_cast(event.getContext()); - file->childrenEventReceived(event); - } - }; - - /** - Globally shared DataListener. - */ - static DataListener _dataListener; - /** - Globally shared ChildrenListener. - */ - static ChildrenListener _childrenListener; - - public: - /** - Constructor. - - Sets reference count to one, i.e. it has been constructed because - a client is trying to open the path. \see _refCount. - Sets deleted to true. \see _deleted. - Sets number of currently directory opens to zero. \see _openDirCount. - Invalidate cach for children information and data. - - \param manager the ZkFuseHandleManager instance who is creating this - ZkFuseFile instance. - \param handle the handle assigned by the ZkFuseHandleManager instance - for this ZkFuseFile instance. - \param path the ZooKeeper path represented by this ZkFuseFile instance. - */ - ZkFuseFile(const ZkFuseHandleManager::SharedPtr & manager, - const int handle, - const std::string & path) - : _manager(manager), - _handle(handle), - _path(path), - _mutex(), - _refCount(1), - _deleted(true), - /* children stuff */ - _openDirCount(0), - _initializedChildren(false), - _hasChildrenListener(false), - _children(), - /* data stuff */ - _initializedData(false), - _hasDataListener(false), - _dirtyData(false), - _activeData(), - _activeStat(), - _latestData(), - _latestStat() - { - LOG_DEBUG(LOG, "constructor() path %s", _path.c_str()); - } - /** - Destructor. - */ - ~ZkFuseFile() - { - LOG_DEBUG(LOG, "destructor() path %s", _path.c_str()); - - assert(_isZombie()); - _clearChildren(); - _clearData(); - } - /** - Whether the ZooKeeper node represented by this ZkFuseFile instance - has been deleted. - \see _deleted - - \return true if it is deleted. - */ - bool isDeleted() const - { - AutoLock lock(_mutex); - return _deleted; - } - /** - Return the path of the ZooKeeper node represented by this ZkFuseFile - instance. - \see _path. - - \return the ZooKeeper node's path. - */ - const string & getPath() const - { - return _path; - } - /** - Add a childPath to the children information cache. - - \return 0 if successful, otherwise return negative errno. - \param childPath the ZooKeeper path of the child. - */ - int addChild(const std::string & childPath) - { - LOG_DEBUG(LOG, "addChild(childPath %s) path %s", - childPath.c_str(), _path.c_str()); - - int res = 0; - { - AutoLock lock(_mutex); - if (_initializedChildren) { - NodeNames::iterator it = - std::find(_children.begin(), _children.end(), childPath); - if (it == _children.end()) { - LOG_DEBUG(LOG, "child not found, adding child path"); - _children.push_back(childPath); - res = 0; - } - else { - LOG_DEBUG(LOG, "child found"); - res = -EEXIST; - } - } - } - - LOG_DEBUG(LOG, "addChild returns %d", res); - return res; - } - /** - Remove a childPath from the children information cache. - - \return 0 if successful, otherwise return negative errno. - \param childPath the ZooKeeper path of the child. - */ - int removeChild(const std::string & childPath) - { - LOG_DEBUG(LOG, "removeChild(childPath %s) path %s", - childPath.c_str(), _path.c_str()); - - int res = 0; - { - AutoLock lock(_mutex); - if (_initializedChildren) { - NodeNames::iterator it = - std::find(_children.begin(), _children.end(), childPath); - if (it != _children.end()) { - LOG_DEBUG(LOG, "child found"); - _children.erase(it); - res = 0; - } - else { - LOG_DEBUG(LOG, "child not found"); - res = -ENOENT; - } - } - } - - LOG_DEBUG(LOG, "removeChild returns %d", res); - return res; - } - /** - Invalidate the cached children information and cached data. - \see _clearChildren - \see _clearData - - \param clearChildren set to true to invalidate children information cache. - \param clearData set to true to invalidate data cache. - */ - void clear(bool clearChildren = true, bool clearData = true) - { - LOG_DEBUG(LOG, "clear(clearChildren %d, clearData %d) path %s", - clearChildren, clearData, _path.c_str()); - - { - AutoLock lock(_mutex); - if (clearChildren) { - _clearChildren(); - } - if (clearData) { - _clearData(); - } - } - } - /** - Whether reference count is zero. - \see _refCount - - \return true if reference count is zero. - */ - bool isZombie() const - { - AutoLock lock(_mutex); - - return (_refCount == 0); - } - /** - Increment the reference count of the ZkFuseFile instance. - - This method may be called by a ZkFuseFileManager instance while - holding the ZkFuseFileManager's _mutex. To avoid deadlocks, - this methods must never invoke a ZkFuseFileManager instance - directly or indirectly while holding the ZkFuseFile instance's - _mutex. - \see _refCount - - \return the post-increment reference count. - \param count value to increment the reference count by. - */ - int incRefCount(int count = 1) - { - LOG_DEBUG(LOG, "incRefCount(count %d) path %s", count, _path.c_str()); - - int res = 0; - { - AutoLock lock(_mutex); - _refCount += count; - assert(_refCount >= 0); - res = _refCount; - } - - LOG_DEBUG(LOG, "incRefCount returns %d", res); - return res; - } - /** - Decrement the reference count of the ZkFuseFile instance. - - This method may be called by a ZkFuseFileManager instance while - holding the ZkFuseFileManager's _mutex. To avoid deadlocks, - this methods must never invoke a ZkFuseFileManager instance - directly or indirectly while holding the ZkFuseFile instance's - _mutex. - \see _refCount - - \return the post-decrement reference count. - \param count value to decrement the reference count by. - */ - int decRefCount(int count = 1) - { - return incRefCount(-count); - } - /** - Increment the count of number times the ZkFuseFile instance has - been opened as a directory. - - This count is incremented by opendir and decremented by releasedir. - \see _openDirCount. - - \return the post-increment count. - \param count the value to increment the count by. - */ - int incOpenDirCount(int count = 1) - { - LOG_DEBUG(LOG, "incOpenDirCount(count %d) path %s", - count, _path.c_str()); - - int res = 0; - { - AutoLock lock(_mutex); - _openDirCount += count; - assert(_openDirCount >= 0); - res = _openDirCount; - assert(_openDirCount <= _refCount); - } - - LOG_DEBUG(LOG, "incOpenDirCount returns %d", res); - return res; - - } - /** - Decrement the count of number times the ZkFuseFile instance has - been opened as a directory. - - This count is incremented by opendir and decremented by releasedir. - \see _openDirCount. - - \return the post-decrement count. - \param count the value to decrement the count by. - */ - int decOpenDirCount(int count = 1) - { - return incOpenDirCount(-count); - } - /** - Whether ZkFuse should present the ZooKeeper node as a ZkFuse - directory by taking into account the specified ZkFuseNameType. - - The ZkFuseNameType may override the default ZkFuse presentation of - a ZooKeeper node. - \see _isDirNameType - - \return true if ZkFuse should present the ZooKeeper node as a ZkFuse - directory. - \param nameType specifies the ZkFuseNameType. - */ - bool isDirNameType(ZkFuseNameType nameType) const - { - return _isDirNameType(nameType, true); - } - /** - Whether ZkFuse should present the ZooKeeper node as a ZkFuse - regular file by taking into account the specified ZkFuseNameType. - - The ZkFuseNameType may override the default ZkFuse presentation of - a ZooKeeper node. - \see _isRegNameType - - \return true if ZkFuse should present the ZooKeeper node as a ZkFuse - regular file. - \param nameType specifies the ZkFuseNameType. - */ - bool isRegNameType(ZkFuseNameType nameType) const - { - return _isRegNameType(nameType, true); - } - /** - Get the active data. - \see _activeData - - \param data return data here. - */ - void getData(Data & data) const - { - AutoLock lock(_mutex); - - data = _activeData; - } - /** - Set the active data. - \see _activeData - - Return -EFBIG is the data to be written is bigger than the maximum - permitted size (and no data is written). - - \return 0 if successful, otherwise return negative errno. - \param data set to this data. - \param doFlush whether to flush the data to the ZooKeeper node. - */ - int setData(const Data & data, bool doFlush) - { - LOG_DEBUG(LOG, "setData(doFlush %d) path %s", doFlush, _path.c_str()); - int res = 0; - - if (data.size() > maxDataFileSize) { - res = -EFBIG; - } - else { - AutoLock lock(_mutex); - _activeData = data; - _dirtyData = true; - if (doFlush) { - res = _flush(); - } - } - - LOG_DEBUG(LOG, "setData() returns %d", res); - return res; - } - /** - Update the children information and the data caches as needed. - - This method is invoked when a ZkFuse regular file or directory - implemented by this ZkFuseFile instance is opened, e.g. - using open or opendir. It attempts to: - - make sure that the cache has valid children information - - register for watches for changes if no previous watches have - been registered. - - The newFile flag indicates if the ZkFuseFile instance has just - been constructed and that ZooKeeper has not been contacted to - determine if the ZooKeeper path for this file really exist. - When a ZkFuseFile instance is created, the _deleted flag is set to - true because it is safer to assume that the ZooKeeper node does - not exist. The newFile flag causes the _deleted flag to be - ignored and ZooKeeper to be contacted to update the caches. - - If the newFile flag is false, then the ZkFuseFile instance is - currently open and have been opened before. Hence, these previous - opens should have contacted ZooKeeper and would like learned from - ZooKeeper whether the ZooKeeper path exists. Therefore, - the _deleted flag should be trustworthy, i.e. it has accurate - information on whether the ZooKeeper path actually exists. - - \return 0 if successful, otherwise return negative errno. - \param newFile set to true if the ZkFuseFile instance is newly created. - */ - int update(bool newFile) - { - LOG_DEBUG(LOG, "update(newFile %d) path %s", newFile, _path.c_str()); - - int res = 0; - { - AutoLock lock(_mutex); - - /* At this point, cannot be zombie. - */ - assert(!_isZombie()); - if (!newFile && _deleted) { - /* Deleted file, don't bother to update caches */ - LOG_DEBUG(LOG, "deleted, not new file"); - res = -ENOENT; - } - else { - try { - LOG_DEBUG(LOG, "initialized children %d, data %d", - _initializedChildren, _initializedData); - LOG_DEBUG(LOG, "has children watch %d, data watch %d", - _hasChildrenListener, _hasDataListener); - /* - * Children handling starts here. - * If don't have children listener, - * then must establish listener. - * If don't have cached children information, - * then must get children information. - * It just happens, that the same ZooKeeper API - * is used for both. - */ - if (_initializedChildren == false || - _hasChildrenListener == false -#ifdef ZOOKEEPER_ROOT_CHILDREN_WATCH_BUG - /* HACK for root node because changes to children - * on a root node does not cause children watches to - * fire. - */ - || _path.length() == 1 -#endif // ZOOKEEPER_ROOT_CHILDREN_WATCH_BUG - ) { - LOG_DEBUG(LOG, "update children"); - NodeNames children; - _manager->getCommon().getZkAdapter()-> - getNodeChildren( children, _path, - &_childrenListener, _getZkContext()); - _hasChildrenListener = true; - LOG_DEBUG(LOG, "update children done"); - _children.swap(children); - _initializedChildren = true; - /* Since getNodeChildren is successful, the - * path must exist */ - _deleted = false; - } - else { - /* Children information is fresh since - * it is initialized and and have been - * updated by listener. - */ - } - /* - * Data handling starts here. - */ - assert(newFile == false || _isOnlyRegOpen()); - if (!_isOnlyRegOpen()) { - /* If is already currently opened by someone, - * then don't update data with latest from ZooKeeper, - * use current active data (which may be initialized - * or not). - * \see _activeData - */ - LOG_DEBUG(LOG, "node currently in-use, no data update"); - } - else { - /* If not opened/reopened by someone else, - * then perform more comprehensive checks of - * to make data and listener is setup correctly. - * If don't have data listener, - * then must establish listener. - * If don't have cached data, - * then must get data. - * It just happens, that the same ZooKeeper API - * is used for both. - */ - LOG_DEBUG(LOG, "node first use or reuse"); - if (_initializedData == false || - _hasDataListener == false) { - /* Don't have any data for now or need to register - * for callback */ - LOG_DEBUG(LOG, "update data"); - _latestData = - _manager->getCommon().getZkAdapter()-> - getNodeData(_path, &_dataListener, - _getZkContext(), - &_latestStat); - _hasDataListener = true; - LOG_DEBUG(LOG, - "update data done, latest version %d", - _latestStat.version); - /* Since getNodeData is successful, the - * path must exist. */ - _deleted = false; - } - else { - /* Data is fresh since it is initialized and - * and have been updated by listener. - */ - } - /* Update active data to the same as the most - * recently acquire data. - */ - _activeData = _latestData; - _activeStat = _latestStat; - _initializedData = true; - _dirtyData = false; - LOG_DEBUG(LOG, "update set active version %d", - _activeStat.version); - } - res = 0; - } catch (const ZooKeeperException & e) { - /* May have ZNONODE exception if path does exist. */ - if (e.getZKErrorCode() == ZNONODE) { - LOG_DEBUG(LOG, "update %s exception %s", - _path.c_str(), e.what()); - /* Path does not exist, set _deleted, - * clear children information cache - */ - _deleted = true; - _clearChildren(); - res = -ENOENT; - } else { - LOG_ERROR(LOG, "update %s exception %s", - _path.c_str(), e.what()); - res = -EIO; - } - } - } - } - - LOG_DEBUG(LOG, "update returns %d", res); - return res; - } - /** - Process a data event. - - This method may: - - Invalidate the data cache. - - Invoke ZooKeeper to update the data cache and register a new - data watch so that the cache can be kept in-sync with the - ZooKeeper node's data. - - This method does not change the active data. Active data will be - changed to a later version by update() at the appropriate time. - \see update. - */ - void dataEventReceived(const ZKWatcherEvent & event) - { - bool reclaim = false; - int eventType = event.getType(); - int eventState = event.getState(); - - /* - IMPORTANT: - - Do not mark ZkFuseFile instance as deleted when a ZOO_DELETED_EVENT - is received without checking with ZooKeeper. An example of - problematic sequence would be: - - 1. Create node. - 2. Set data and watch. - 3. Delete node. - 4. Create node. - 5. Deleted event received. - - It is a bug to mark the ZkFuseFile instance as deleted after - step 5 because the node exists. - - Therefore, this method should always contact ZooKeeper to keep the - data cache (and deleted status) up-to-date if necessary. - */ - LOG_DEBUG(LOG, "dataEventReceived() path %s, type %d, state %d", - _path.c_str(), eventType, eventState); - { - AutoLock lock(_mutex); - - _hasDataListener = false; - /* If zombie, then invalidate cached data. - * This clears _initializedData and eliminate - * the need to get the latest data from ZooKeeper and - * re-register data watch. - */ - if (_isZombie() && _initializedData) { - LOG_DEBUG(LOG, "invalidate data"); - _clearData(); - } - else if ((_refCount - _openDirCount) > 0) { - /* Don't invalidate cached data because clients of currently - * open files don't expect the data to change from under them. - * If data acted upon by these clients have become stale, - * then the clients will get an error when ZkFuse attempts to - * flush dirty data. The clients will not get error - * notification if they don't modify the stale data. - * - * If data cache is cleared here, then the following code - * to update data cache and re-register data watch will not - * be executed and may result in the cached data being - * out-of-sync with ZooKeeper. - */ - LOG_WARN(LOG, - "%s data has changed while in-use, " - "type %d, state %d, refCount %d", - _path.c_str(), eventType, eventState, _refCount); - } - /* If cache was valid and still connected - * then get the latest data from ZooKeeper - * and re-register data watch. This is required to keep - * the data cache in-sync with ZooKeeper. - */ - if (_initializedData && - eventState == ZOO_CONNECTED_STATE - ) { - try { - LOG_DEBUG(LOG, "register data watcher"); - _latestData = - _manager->getCommon().getZkAdapter()-> - getNodeData(_path, &_dataListener, _getZkContext(), - &_latestStat); - _hasDataListener = true; - LOG_DEBUG(LOG, - "get data done, version %u, cversion %u done", - _latestStat.version, _latestStat.cversion); - _deleted = false; - } catch (const ZooKeeperException & e) { - if (e.getZKErrorCode() == ZNONODE) { - _deleted = true; - _clearChildren(); - } - LOG_ERROR(LOG, "dataEventReceived %s exception %s", - _path.c_str(), e.what()); - } - } - } - LOG_DEBUG(LOG, "dataEventReceived return %d", reclaim); - } - /** - Process a children event. - - This method may: - - Invalidate the children information cache. - - Invoke ZooKeeper to update the children cache and register a new - data watch so that the cache can be kept in-sync with the - ZooKeeper node's children information. - */ - void childrenEventReceived(const ZKWatcherEvent & event) - { - bool reclaim = false; - int eventType = event.getType(); - int eventState = event.getState(); - - LOG_DEBUG(LOG, "childrenEventReceived() path %s, type %d, state %d", - _path.c_str(), eventType, eventState); - { - AutoLock lock(_mutex); - - _hasChildrenListener = false; - /* If zombie or disconnected, then invalidate cached children - * information. This clears _initializedChildren and eliminate - * the need to get the latest children information and - * re-register children watch. - */ - if (_initializedChildren && - (_isZombie() || eventState != ZOO_CONNECTED_STATE)) { - LOG_DEBUG(LOG, "invalidate children"); - _clearChildren(); - } - else if (_initializedChildren) { - /* Keep cached children information so that we have some - * children information if get new children information - * fails. If there is failure, then on next open, - * update() will attempt again to get children information - * again because _hasChildrenListener will be false. - * - * If children information cache is cleared here, then - * the following code to update children information cache - * and re-register children watch will not be executed - * and may result in the cached children information being - * out-of-sync with ZooKeeper. - * - * The children cache will be cleared if unable to - * get children and re-establish watch. - */ - LOG_WARN(LOG, - "%s children has changed while in-use, " - "type %d, state %d, refCount %d", - _path.c_str(), eventType, eventState, _refCount); - } - /* If children cache was valid and still connected, - * then get the latest children information from ZooKeeper - * and re-register children watch. This is required to - * keep the children information cache in-sync with ZooKeeper. - */ - if (_initializedChildren && - eventState == ZOO_CONNECTED_STATE - ) { - /* Should try to keep the cache in-sync, register call - * callback again and get current children. - */ - try { - LOG_DEBUG(LOG, "update children"); - NodeNames children; - _manager->getCommon().getZkAdapter()-> - getNodeChildren(children, _path, - &_childrenListener, _getZkContext()); - _hasChildrenListener = true; - LOG_DEBUG(LOG, "update children done"); - _children.swap(children); - _deleted = false; - } catch (const ZooKeeperException & e) { - if (e.getZKErrorCode() == ZNONODE) { - _deleted = true; - _clearChildren(); - } - LOG_ERROR(LOG, "childrenEventReceived %s exception %s", - _path.c_str(), e.what()); - _children.clear(); - } - } - } - LOG_DEBUG(LOG, "childrenEventReceived returns %d", reclaim); - } - /** - Truncate or expand the size of the cached active data. - - This method only changes the size of the cached active data. - This change is committed to ZooKeeper when the cached data - is written to the ZooKeeper node by flush(). - - Return -EFBIG is the requested size exceeds the maximum. - - \return 0 if successful, otherwise negative errno. - \param size the requested size. - */ - int truncate(off_t size) - { - int res = 0; - - { - AutoLock lock(_mutex); - res = _truncate(size); - } - - return res; - } - /** - Copy range of active data into specified output buffer. - - \return if successful, return number of bytes copied, otherwise - return negative errno. - \param buf address of the output buffer. - \param size size of the output buffer and desired number of bytes to copy. - \param offset offset into active data to start copying from. - */ - int read(char *buf, size_t size, off_t offset) const - { - LOG_DEBUG(LOG, "read(size %zu, off_t %zu) path %s", - size, offset, _path.c_str()); - - int res = 0; - - { - AutoLock lock(_mutex); - if (!_initializedData) { - LOG_DEBUG(LOG, "not initialized"); - res = -EIO; - } - else { - off_t fileSize = _activeData.size(); - if (offset > fileSize) { - LOG_DEBUG(LOG, "offset > fileSize %zu", fileSize); - res = 0; - } - else { - if (offset + size > fileSize) { - size = fileSize - offset; - LOG_DEBUG(LOG, - "reducing read size to %zu for fileSize %zu", - size, fileSize); - } - copy(_activeData.begin() + offset, - _activeData.begin() + offset + size, - buf); - res = size; - } - } - } - - LOG_DEBUG(LOG, "read returns %d", res); - return res; - } - /** - Copy buffer content to active data. - - \return if successful, return number of bytes copied, otherwise - return negative errno. - \param buf address of the buffer. - \param size size of the input buffer and desired number of bytes to copy. - \param offset offset into active data to start copying to. - */ - int write(const char *buf, size_t size, off_t offset) - { - LOG_DEBUG(LOG, "write(size %zu, off_t %zu) path %s", - size, offset, _path.c_str()); - - int res = 0; - - { - AutoLock lock(_mutex); - if (!_initializedData) { - LOG_DEBUG(LOG, "not initialized"); - res = -EIO; - } - else if (offset >= maxDataFileSize) { - LOG_DEBUG(LOG, "offset > maxDataFileSize %u", maxDataFileSize); - res = -ENOSPC; - } - else { - if (offset + size > maxDataFileSize) { - LOG_DEBUG(LOG, - "reducing write size to %zu " - "for maxDataFileSize %u", - size, maxDataFileSize); - size = maxDataFileSize - offset; - } - off_t fileSize = _activeData.size(); - if (offset + size > fileSize) { - LOG_DEBUG(LOG, "resizing to %zu", offset + size); - _activeData.resize(offset + size); - } - copy(buf, buf + size, _activeData.begin() + offset); - memcpy(&_activeData[offset], buf, size); - _dirtyData = true; - res = size; - } - } - - LOG_DEBUG(LOG, "write returns %d", res); - return res; - } - /** - Flush data to the ZooKeeper node. - - If cached active data has been modified, flush it to the ZooKeeper node. - Returns -EIO if the data cannot be written because the cached active - data is not the expected version, i.e. ZooKeeper returns ZBADVERSION. - -EIO may also indicate a more general failure, such as unable to - communicate with ZooKeeper. - - \return 0 if successful, otherwise negative errno. - */ - int flush() - { - int res = 0; - { - AutoLock lock(_mutex); - res = _flush(); - } - return res; - } - /** - Close of the ZkFuse regular file represented by the ZkFuseFile instance. - - This may: - - Flush dirty data to the ZooKeeper node, and return the result of the - flush operation. - - Reclaim the ZkFuseFile instance. - \see ZkFuseHandleManaer::reclaimIfNecessary - - \return result of flush operation - 0 if successful, - otherwise negative errno. - */ - int close() - { - LOG_DEBUG(LOG, "close() path %s", _path.c_str()); - int res = 0; - - bool reclaim = false; - { - AutoLock lock(_mutex); - res = _flush(); - if (_deleted) { - _clearData(); - _clearChildren(); - } - } - _manager->deallocate(_handle); - - LOG_DEBUG(LOG, "close returns %d", res); - return res; - } - /** - Get ZkFuse regular file or directory attributes. - - \return 0 if successful, otherwise negative errno. - \param stbuf return attributes here. - \param nameType specifies the ZkFuseNameType of the ZkFuse path used - to get attributes. It influences whether the directory - or regular file attributes are returned. - */ - int getattr(struct stat & stbuf, ZkFuseNameType nameType) const - { - LOG_DEBUG(LOG, "getattr(nameType %d) path %s", - int(nameType), _path.c_str()); - - int res = 0; - int version = 0; - std::string metaPath; - { - AutoLock lock(_mutex); - - res = _getattrNoMetaAccess(stbuf, nameType); - if (res == 0) { - version = _activeStat.version; - metaPath = _getChildPath( - ((stbuf.st_mode & S_IFMT) == S_IFREG) ? - _manager->getCommon().getRegMetadataName() : - _manager->getCommon().getDirMetadataName()); - if (_hasChildPath(metaPath) == false) { - metaPath.clear(); - } - } - } - if (res == 0 && metaPath.empty() == false) { - Data data; - int metaRes = _manager->getData(metaPath, data); - LOG_DEBUG(LOG, "metaRes %d dataSize %zu", - metaRes, data.size()); - if (metaRes == 0 && data.empty() == false) { - Metadata metadata; - _decodeMetadata(data, metadata); - LOG_DEBUG(LOG, "metadata version %u active version %u", - metadata.version, version); - if (metadata.version == version) { - /* IMPORTANT: - * Must convert from millisecs to secs before setting - * st_atime and st_mtime to avoid truncation error - * due to 64-bit to 32-bit conversion. - */ - stbuf.st_atime = millisecsToSecs(metadata.atime); - stbuf.st_mtime = millisecsToSecs(metadata.mtime); - } - } - } - - LOG_DEBUG(LOG, "getattr returns %d", res); - return res; - } - /** - Read directory entries. - This interface is defined by FUSE. - - \return 0 if successful, otherwise negative errno. - \param buf output buffer to store output directory entries. - \param filler function used to fill the output buffer. - \param offset start filling from a specific offset. - */ - int readdir(void *buf, fuse_fill_dir_t filler, off_t offset) const - { - LOG_DEBUG(LOG, "readdir(offset %zu) path %s", offset, _path.c_str()); - int res = 0; - - int dataFileIndex = -1; - unsigned leftTrim = 0; - typedef std::pair DirEntry; - typedef std::vector DirEntries; - DirEntries dirEntries; - - /* Get directory entries in two phase to avoid invoking - * ZkFuseHandleManager while holding _mutex. - * In first phase, get all the names of child nodes starting - * at offset. Also remember their index for use in second phase. - * The first phase hold _mutex. - */ - { - AutoLock lock(_mutex); - if (!_isInitialized()) { - LOG_DEBUG(LOG, "not initialized"); - res = -EIO; - } - else { - leftTrim = (_path.length() == 1 ? 1 : _path.length() + 1); - unsigned start = offset; - unsigned i; - for (i = start; i < _children.size(); i++) { - const std::string & childName = _children[i]; - if (_isMeta(childName)) { - continue; - } - dirEntries.push_back(DirEntry(childName, i)); - } - if (i == _children.size() && !_activeData.empty()) { - dataFileIndex = i + 1; - } - res = 0; - } - } - - /* Second phase starts here. - * DONOT hold _mutex as this phase invokes ZkFuseHandleManager to - * get attributes for the directory entries. - */ - if (res == 0) { - bool full = false; - for (DirEntries::const_iterator it = dirEntries.begin(); - it != dirEntries.end(); - it++) { - - ZkFuseAutoHandle childAutoHandle(_manager, it->first); - int childRes = childAutoHandle.get(); - if (childRes >= 0) { - struct stat stbuf; - int attrRes = childAutoHandle.getFile()-> - getattr(stbuf, ZkFuseNameDefaultType); - if (attrRes == 0) { - if (filler(buf, it->first.c_str() + leftTrim, - &stbuf, it->second + 1)) { - LOG_DEBUG(LOG, "filler full"); - full = true; - break; - } - } - } - } - if (full == false && dataFileIndex != -1) { - LOG_DEBUG(LOG, "include data file name"); - struct stat stbuf; - int attrRes = getattr(stbuf, ZkFuseNameRegType); - if (attrRes == 0) { - filler(buf, - _manager->getCommon().getDataFileName().c_str(), - &stbuf, dataFileIndex + 1); - } - } - } - - LOG_DEBUG(LOG, "readdir returns %d", res); - return res; - } - /** - Set the access time and modified time. - - Set the access and modifieds times on the ZkFuse regular file - or directory represented by this ZkFuseFile instance. - - Since there is no interface to change these times on a - ZooKeeper node, ZkFuse simulates this by writing to a - metadata node which is a child node of the ZooKeeper node. - ZkFuse writes the current version, the specified access - and modified times to the metadata node. - - When get attributes is invoked, get attributes will check - for the presence of this metadata node and if the version - number matches the current data version, then get attributes - will return the access and modified times stored in the - metadata node. - - \return 0 if successful, otherwise negative errno. - \param atime access time in milliseconds. - \param mtime modified time in milliseconds. - \param nameType specifies the ZkFuseNameType of the ZkFuse path used - to set access and modified times. It influences - whether the directory or regular file access and - modified times are set. - */ - int utime(uint64_t atime, uint64_t mtime, ZkFuseNameType nameType) - { - LOG_DEBUG(LOG, - "utime(atime %llu, mtime %llu, nameType %d) path %s", - (unsigned long long) atime, - (unsigned long long) mtime, - (int) nameType, _path.c_str()); - - int res = 0; - std::string metaPath; - bool exists = false; - Data data; - { - AutoLock lock(_mutex); - - if (!_isInitialized()) { - LOG_DEBUG(LOG, "not initialized"); - res = -EIO; - } - else { - bool isRegular = _isRegNameType(nameType); - Metadata metadata; - metadata.version = _activeStat.version; - metadata.atime = atime; - metadata.mtime = mtime; - metaPath = _getChildPath( - isRegular ? - _manager->getCommon().getRegMetadataName() : - _manager->getCommon().getDirMetadataName()); - exists = _hasChildPath(metaPath); - _encodeMetadata(metadata, data); - res = 0; - } - } - if (res == 0 && metaPath.empty() == false) { - res = _manager->setData(metaPath, data, exists, true); - } - - LOG_DEBUG(LOG, "utime returns %d", res); - return res; - } - /** - Remove a ZkFuse directory. - - If force is true, then the ZooKeeper node and its decendants - will be deleted. - - If force is false, then this method implements the semantics - of removing a ZkFuse directory. It will delete the ZooKeeper node - only if the ZooKeeper node have no data and no non-metadata - children. - - Return -ENOTDIR if the ZooKeeper node is not considered - to be a directory (after taking into consideration the specified - ZkFuseNameType). - - Return -ENOTEMPTY if the ZooKeeper node has data or it has - non-metadata children. - - Return -ENOENT if the ZooKeeper cannot be deleted, usually this - is because it does not exist. - - \return 0 if successful, otherwise negative errno. - \param nameType the ZkFuseNameType of the path used to specify the - directory to be removed. It influences whether ZkFuse - considers the ZooKeeper node to be a regular file or - directory. \see ZkFuseNameType - \param force set to true to bypass ZkFuse rmdir semantic check. - */ - int rmdir(ZkFuseNameType nameType, bool force) - { - int res = 0; - - { - AutoLock lock(_mutex); - res = _rmdir(nameType, force); - } - if (res == 0) { - _manager->removeChildFromParent(_path); - } - return res; - } - /** - Remove a ZkFuse regular file. - - This method implements the semantics of removing a ZkFuse regular file. - - If the ZkFuse regular file represents the data part of the - ZooKeeper node which is presented as a ZkFuse directory, - the regular file is virtually deleted by truncating the - ZooKeeper node's data. Readdir will not synthesize a regular - file entry for the data part of a ZooKeeper node if - the ZooKeeper node has no data. - - If the ZkFuse regular file represents the data part of the - ZooKeeper node which is presented as a ZkFuse regular file, - the ZooKeeper node and its decendants are deleted. - - Returns -EISDIR if the ZkFuse regular file cannot be deleted - because ZkFuse consider it to be a directory. - - \return 0 if successful, otherwise negative errno. - \param nameType the ZkFuseNameType of the path used to specify the - directory to be removed. It influences whether ZkFuse - considers the ZooKeeper node to be a regular file or - directory. \see ZkFuseNameType - */ - int unlink(ZkFuseNameType nameType) - { - int res = 0; - { - AutoLock lock(_mutex); - res = _unlink(nameType); - } - if (res == 0) { - _manager->removeChildFromParent(_path); - } - return res; - } - /** - Utility function to construct a ZooKeeper path for a child - of a ZooKeeper node. - - \return the full path of the child. - \param parent the parent's full path. - \param child the child's parent component. - */ - static std::string buildChildPath(const std::string & parent, - const std::string & child) - { - std::string s; - s.reserve(parent.length() + child.length() + 32); - if (parent.length() > 1) { - // special case for root dir - s += parent; - } - s += "/"; - s += child; - return s; - } -}; - -ZkFuseFile::DataListener ZkFuseFile::_dataListener; -ZkFuseFile::ChildrenListener ZkFuseFile::_childrenListener; - -void ZkFuseAutoHandle::reset(int handle) -{ - int old = _handle; - ZkFuseFilePtr oldFile = _file; - _handle = handle; - _initFile(); - if (old >= 0) { - assert(oldFile != NULL); - oldFile->close(); - } -} - -ZkFuseHandleManager::Handle -ZkFuseHandleManager::allocate(const std::string & path, bool & newFile) -{ - LOG_DEBUG(LOG, "allocate(path %s)", path.c_str()); - - Handle handle; - { - AutoLock lock(_mutex); - Map::iterator it = _map.find(path); - if (it == _map.end()) { - LOG_DEBUG(LOG, "not found"); - if (_freeList.empty()) { - handle = _files.size(); - _files.resize(handle + 1); - LOG_DEBUG(LOG, "free list empty, resize handle %d", handle); - } else { - handle = _freeList.back(); - _freeList.pop_back(); - LOG_DEBUG(LOG, "get from free list, handle %d", handle); - } - assert(_files[handle] == NULL); - _files[handle] = - new ZkFuseFile(SharedPtr(_thisWeakPtr), handle, path); - /* Not really supposed to invoke the new ZkFuseFile instance - * because this method is not supposed to invoke ZkFuseFile - * methods that while holding _mutex. However, it is safe - * to do without casuing deadlock because these methods - * are known not to invoke other methods, especially one - * that invoke this ZkFuseHandleManager instance. - */ - assert(_files[handle]->incRefCount(0) == 1); - _map[path] = handle; - _numInUse++; - LOG_DEBUG(LOG, "numInUse %u", _numInUse); - newFile = true; - } else { - LOG_DEBUG(LOG, "found"); - handle = it->second; - assert(_files[handle] != NULL); - int refCount = _files[handle]->incRefCount(); - if (refCount == 1) { - _numInUse++; - LOG_DEBUG(LOG, "resurrecting zombie, numInUse %u", _numInUse); - } - newFile = false; - } - } - - LOG_DEBUG(LOG, "allocate returns %d, newFile %d", handle, newFile); - return handle; -} - -void ZkFuseHandleManager::deallocate(Handle handle) -{ - LOG_DEBUG(LOG, "deallocate(handle %d)", handle); - - if (handle >= 0) { - bool reclaim = false; - ZkFuseFilePtr file; - { - AutoLock lock(_mutex); - file = _files[handle]; - assert(file != NULL); - int refCount = file->decRefCount(); - const std::string & path = file->getPath(); - LOG_DEBUG(LOG, "path %s ref count %d", path.c_str(), refCount); - if (refCount == 0) { - _numInUse--; - unsigned numCached = _files.size() - _numInUse; - if (numCached > _common.getCacheSize()) { - LOG_TRACE(LOG, - "reclaim path %s, cacheSize %u, filesSize %zu, " - "numInUse %u", - path.c_str(), - _common.getCacheSize(), _files.size(), _numInUse); - _map.erase(path); - _files[handle] = NULL; - _freeList.push_back(handle); - reclaim = true; - } - } - } - if (reclaim) { - delete file; - } - } - else { - LOG_DEBUG(LOG, "handle invalid"); - } - - LOG_DEBUG(LOG, "deallocate done"); -} - -void ZkFuseHandleManager::eventReceived(const ZKWatcherEvent & event) -{ - int eventType = event.getType(); - int eventState = event.getState(); - const std::string & path = event.getPath(); - LOG_DEBUG(LOG, "eventReceived() eventType %d, eventState %d, path %s", - eventType, eventState, path.c_str()); - - if (eventType == ZOO_DELETED_EVENT || - eventType == ZOO_CHANGED_EVENT || - eventType == ZOO_CHILD_EVENT) { - { - AutoLock lock(_mutex); - Map::iterator it = _map.find(path); - if (it != _map.end()) { - LOG_DEBUG(LOG, "path found"); - Handle handle = it->second; - ZkFuseFilePtr file = _files[handle]; - assert(file != NULL); - /* Prevent the ZkFuseFile instance from being - * deleted while handling the event. - */ - int refCount = file->incRefCount(); - if (refCount == 1) { - _numInUse++; - } - /* Pretent to be dir open. - */ - int dirCount = file->incOpenDirCount(); - { - /* _mutex is unlocked in this scope */ - AutoUnlockTemp autoUnlockTemp(lock); - if (eventType == ZOO_CHILD_EVENT) { - file->childrenEventReceived(event); - } - else if (eventType == ZOO_CHANGED_EVENT) { - file->dataEventReceived(event); - } - else { - assert(eventType == ZOO_DELETED_EVENT); - file->dataEventReceived(event); - // file->childrenEventReceived(event); - } - file->decOpenDirCount(); - deallocate(handle); - } - } - else { - LOG_WARN(LOG, - "path %s not found for event type %d, event state %d", - path.c_str(), eventType, eventState); - } - } - } - else if (eventType == ZOO_SESSION_EVENT) { - if (eventState == ZOO_CONNECTING_STATE) { - LOG_TRACE(LOG, "*** CONNECTING ***"); - { - AutoLock lock(_mutex); - for (int handle = 0; handle < _files.size(); handle++) { - ZkFuseFilePtr file = _files[handle]; - if (file != NULL) { - /* prevent the ZkFuseFile instance from being - * deleted while handling the event. - */ - int refCount = file->incRefCount(); - if (refCount == 1) { - _numInUse++; - } - /* Pretent to be dir open. - */ - int dirCount = file->incOpenDirCount(); - { - /* _mutex is unlocked in this scope */ - AutoUnlockTemp autoUnlockTemp(lock); - file->dataEventReceived(event); - file->childrenEventReceived(event); - file->decOpenDirCount(); - deallocate(handle); - } - /* this will eventually call decrement ref count */ - } - } - } - } - else if (eventState == ZOO_CONNECTED_STATE) { - LOG_TRACE(LOG, "*** CONNECTED ***"); - } - } - else { - LOG_WARN(LOG, - "eventReceived ignoring event type %d, event state %d, " - "path %s", eventType, eventState, path.c_str()); - } -} - -int ZkFuseHandleManager::getData(const std::string & path, - Data & data) -{ - LOG_DEBUG(LOG, "getData(path %s)", path.c_str()); - - int res = 0; - data.clear(); - ZkFuseAutoHandle autoHandle(SharedPtr(_thisWeakPtr), path); - res = autoHandle.get(); - if (res >= 0) { - autoHandle.getFile()->getData(data); - res = 0; - } - - LOG_DEBUG(LOG, "getData returns %d", res); - return res; -} - -int ZkFuseHandleManager::setData(const std::string & path, - const Data & data, - bool exists, - bool doFlush) -{ - LOG_DEBUG(LOG, "setData(path %s, exists %d)\n%s", - path.c_str(), exists, data.c_str()); - - int res = 0; - if (exists) { - res = open(path, false); - } else { - bool created; - res = mknod(path, S_IFREG, true, created); - } - if (res >= 0) { - ZkFuseAutoHandle autoHandle(SharedPtr(_thisWeakPtr), res); - res = autoHandle.getFile()->setData(data, doFlush); - } - - LOG_DEBUG(LOG, "setData returns %d", res); - return res; -} - -int ZkFuseHandleManager::mknod(const std::string & path, - mode_t mode, - bool mayExist, - bool & created) -{ - LOG_DEBUG(LOG, "mknod(path %s, mode %o, mayExist %d)", - path.c_str(), mode, mayExist); - - int res = 0; - created = false; - try { - if (S_ISREG(mode) == false && S_ISDIR(mode) == false) { - LOG_DEBUG(LOG, "bad mode %o", mode); - res = -EINVAL; - } - else { - Data data; - LOG_DEBUG(LOG, "create %s", path.c_str()); - created = - _common.getZkAdapter()->createNode(path, data, 0, false); - if (created) { - LOG_DEBUG(LOG, "created"); - if (S_ISDIR(mode)) { - /* is mkdir - create directory marker */ - std::string dirMetaPath = ZkFuseFile::buildChildPath - (path, _common.getDirMetadataName()); - LOG_DEBUG(LOG, "create %s", dirMetaPath.c_str()); - bool created; - int metaRes = mknod(dirMetaPath, S_IFREG, true, created); - if (metaRes >= 0) { - getFile(metaRes)->close(); - } - } - addChildToParent(path); - LOG_DEBUG(LOG, "open after create"); - res = open(path, true); - } else { - LOG_DEBUG(LOG, "create failed"); - int openRes = open(path, false); - if (openRes >= 0) { - if (mayExist == false) { - LOG_DEBUG(LOG, "create failed because already exist"); - getFile(openRes)->close(); - res = -EEXIST; - } else { - res = openRes; - } - } else { - LOG_DEBUG(LOG, "create failed but does not exist"); - res = -ENOENT; - } - } - } - } catch (const ZooKeeperException & e) { - LOG_ERROR(LOG, "mknod %s exception %s", path.c_str(), e.what()); - res = -EIO; - } - - LOG_DEBUG(LOG, "mknod returns %d created %d", res, created); - return res; -} - -int ZkFuseHandleManager::mkdir(const char * path, mode_t mode) -{ - LOG_DEBUG(LOG, "mkdir(path %s, mode %o)", path, mode); - - int res = 0; - try { - ZkFuseNameType nameType; - std::string zkPath = getZkPath(path, nameType); - mode = (mode & ~S_IFMT) | S_IFDIR; - ZkFuseAutoHandle autoHandle - (SharedPtr(_thisWeakPtr), zkPath, mode, false); - res = autoHandle.get(); - if (res >= 0) { - res = 0; - } - } catch (const std::exception & e) { - LOG_ERROR(LOG, "mkdir %s exception %s", path, e.what()); - res = -EIO; - } - - LOG_DEBUG(LOG, "mkdir returns %d", res); - return res; -} - -int ZkFuseHandleManager::open(const std::string & path, bool justCreated) -{ - LOG_DEBUG(LOG, "open(path %s, justCreated %d)", - path.c_str(), justCreated); - - int res = 0; - try { - bool newFile; - Handle handle = allocate(path, newFile); - ZkFuseAutoHandle autoHandle(SharedPtr(_thisWeakPtr), handle); - res = getFile(handle)->update(newFile || justCreated); - if (res == 0) { - res = handle; - autoHandle.release(); - } - } catch (const ZooKeeperException & e) { - LOG_ERROR(LOG, "open %s exception %s", path.c_str(), e.what()); - res = -EIO; - } - - LOG_DEBUG(LOG, "open returns %d", res); - return res; -} - -int ZkFuseHandleManager::rmdir(const char * path, bool force) -{ - LOG_DEBUG(LOG, "rmdir(path %s, force %d)", path, force); - - int res = 0; - - try { - ZkFuseNameType nameType; - std::string zkPath = getZkPath(path, nameType); - ZkFuseAutoHandle autoHandle(SharedPtr(_thisWeakPtr), zkPath); - res = autoHandle.get(); - if (res >= 0) { - res = autoHandle.getFile()->rmdir(nameType, force); - } - } catch (const std::exception & e) { - LOG_ERROR(LOG, "rmdir %s exception %s", path, e.what()); - res = -EIO; - } - - LOG_DEBUG(LOG, "rmdir returns %d", res); - return res; -} - - -int -ZkFuseHandleManager::unlink(const char * path) -{ - LOG_DEBUG(LOG, "unlink(path %s)", path); - - ZkFuseNameType nameType; - std::string zkPath = getZkPath(path, nameType); - ZkFuseAutoHandle autoHandle(SharedPtr(_thisWeakPtr), zkPath); - int res = autoHandle.get(); - if (res >= 0) { - res = autoHandle.getFile()->unlink(nameType); - } - - LOG_DEBUG(LOG, "unlink returns %d", res); - return res; -} - -int ZkFuseHandleManager::getattr(const char *path, struct stat &stbuf) -{ - LOG_DEBUG(LOG, "getattr(path %s)", path); - - int res = 0; - try { - ZkFuseNameType nameType; - std::string zkPath = getZkPath(path, nameType); - ZkFuseAutoHandle autoHandle(SharedPtr(_thisWeakPtr), zkPath); - res = autoHandle.get(); - if (res >= 0) { - res = autoHandle.getFile()->getattr(stbuf, nameType); - } - } catch (const std::exception & e) { - LOG_ERROR(LOG, "getattr %s exception %s", path, e.what()); - res = -EIO; - } - - LOG_DEBUG(LOG, "getattr returns %d", res); - return res; -} - -int -ZkFuseHandleManager::rename(const char * fromPath, const char * toPath) -{ - LOG_DEBUG(LOG, "rename(fromPath %s, toPath %s)", fromPath, toPath); - - ZkFuseNameType fromNameType; - std::string fromZkPath = getZkPath(fromPath, fromNameType); - ZkFuseAutoHandle fromAutoHandle(SharedPtr(_thisWeakPtr), fromZkPath); - int res = fromAutoHandle.get(); - if (res >= 0) { - LOG_DEBUG(LOG, "good fromPath"); - if (fromAutoHandle.getFile()->isDirNameType(fromNameType)) { - LOG_DEBUG(LOG, "fromPath is directory"); - res = -EISDIR; - } - } - if (res >= 0) { - ZkFuseNameType toNameType; - std::string toZkPath = getZkPath(toPath, toNameType); - bool created; - res = mknod(toZkPath.c_str(), S_IFREG, true, created); - if (res >= 0) { - ZkFuseAutoHandle toAutoHandle(SharedPtr(_thisWeakPtr), res); - if (toAutoHandle.getFile()->isDirNameType(toNameType)) { - LOG_DEBUG(LOG, "toPath is directory"); - res = -EISDIR; - } - if (res >= 0) { - LOG_DEBUG(LOG, "copy data"); - Data data; - fromAutoHandle.getFile()->getData(data); - toAutoHandle.getFile()->setData(data, true); - LOG_DEBUG(LOG, "copy metadata"); - struct stat stbuf; - int metaRes = - fromAutoHandle.getFile()->getattr(stbuf, fromNameType); - if (metaRes < 0) { - LOG_DEBUG(LOG, "get metadata failed"); - } - else { - metaRes = toAutoHandle.getFile()-> - utime(secsToMillisecs(stbuf.st_atime), - secsToMillisecs(stbuf.st_mtime), - toNameType); - if (metaRes < 0) { - LOG_DEBUG(LOG, "set metadata failed"); - } - } - } - if (created && res < 0) { - LOG_DEBUG(LOG, "undo create because copy data failed"); - int rmRes = toAutoHandle.getFile()->rmdir(toNameType, true); - } - } - } - if (res >= 0) { - LOG_DEBUG(LOG, "copy successful, unlink fromPath"); - res = fromAutoHandle.getFile()->unlink(fromNameType); - } - - LOG_DEBUG(LOG, "rename returns %d", res); - return res; -} - -void -ZkFuseHandleManager::addChildToParent(const std::string & childPath) const -{ - LOG_DEBUG(LOG, "addChildToParent(childPath %s)", childPath.c_str()); - - std::string parentPath = getParentPath(childPath); - if (!parentPath.empty()) { - AutoLock lock(_mutex); - Map::const_iterator it = _map.find(parentPath); - if (it != _map.end()) { - Handle handle = it->second; - assert(_files[handle] != NULL); - _files[handle]->addChild(childPath); - } - } - - LOG_DEBUG(LOG, "addChildToParent done"); -} - -void -ZkFuseHandleManager::removeChildFromParent(const std::string & childPath) const -{ - LOG_DEBUG(LOG, "removeChildFromParent(childPath %s)", childPath.c_str()); - - std::string parentPath = getParentPath(childPath); - if (!parentPath.empty()) { - AutoLock lock(_mutex); - Map::const_iterator it = _map.find(parentPath); - if (it != _map.end()) { - Handle handle = it->second; - assert(_files[handle] != NULL); - _files[handle]->removeChild(childPath); - } - } - - LOG_DEBUG(LOG, "removeChildFromParent done"); -} - -std::string -ZkFuseHandleManager::getParentPath(const std::string & childPath) const -{ - std::string::size_type lastPos = childPath.rfind('/'); - if (lastPos > 0) { - return std::string(childPath, 0, lastPos); - } - else { - assert(childPath[0] == '/'); - return std::string(); - } -} - -std::string -ZkFuseHandleManager::getZkPath(const char * path, ZkFuseNameType & nameType) - const -{ - LOG_DEBUG(LOG, "getZkPath(path %s)", path); - - std::string res; - unsigned pathLen = strlen(path); - const std::string & dataFileName = _common.getDataFileName(); - unsigned dataSuffixLen = dataFileName.length(); - const char * dataSuffix = dataFileName.c_str(); - unsigned dataSuffixIncludeSlashLen = dataSuffixLen + 1; - const std::string & forceDirSuffix = _common.getForceDirSuffix(); - unsigned forceDirSuffixLen = _common.getForceDirSuffix().length(); - /* Check if path is "/". If so, it is always a directory. - */ - if (pathLen == 1) { - assert(path[0] == '/'); - res = _common.getRootPathName(); - nameType = ZkFuseNameDirType; - } - /* Check if path ends of /{dataSuffix}, e.g. /foo/bar/{dataSuffix}. - * If so remove dataSuffix and nameType is ZkFuseNameRegType. - */ - else if ( - (pathLen >= dataSuffixIncludeSlashLen) && - (path[pathLen - dataSuffixIncludeSlashLen] == '/') && - (strncmp(path + (pathLen - dataSuffixLen), - dataSuffix, dataSuffixLen) == 0) - ) { - if ((pathLen - dataSuffixIncludeSlashLen) == 0) { - res = _common.getRootPathName(); - } else { - res.assign(path, pathLen - dataSuffixIncludeSlashLen); - } - nameType = ZkFuseNameRegType; - } - /* If not ZkFuseNameRegType, then check if path ends of - * {forceDirSuffix}, e.g. /foo/bar{forceDirSuffix}. - * If so remove forceDirSuffix and nameType is ZkFuseNameDirType. - */ - else if (forceDirSuffixLen > 0 && - pathLen >= forceDirSuffixLen && - strncmp(path + (pathLen - forceDirSuffixLen), - forceDirSuffix.c_str(), forceDirSuffixLen) == 0) { - res.assign(path, pathLen - forceDirSuffixLen); - nameType = ZkFuseNameDirType; - } - /* If not ZkFuseNameRegType and not ZkFuseNameDirType, then - * it is ZkFuseNameDefaultType. ZkFuse will infer type from - * ZooKeeper node's content. - */ - else { - res = path; - nameType = ZkFuseNameDefaultType; - } - /* Intermediate components of the path name may have - * forceDirSuffix, e.g. /foo/bar{forceDirSuffix}/baz. - * If so, remove the intermediate {forceDirSuffix}es. - */ - if (forceDirSuffixLen > 0) { - /* pos is an optimization to avoid always scanning from - * beginning of path - */ - unsigned pos = 0; - while ((res.length() - pos) > forceDirSuffixLen + 1) { - const char * found = - strstr(res.c_str() + pos, forceDirSuffix.c_str()); - if (found == NULL) { - break; - } - if (found[forceDirSuffixLen] == '/' || - found[forceDirSuffixLen] == '\0') { - pos = found - res.c_str(); - res.erase(pos, forceDirSuffixLen); - } - else { - pos += forceDirSuffixLen; - } - } - } - - LOG_DEBUG(LOG, "getZkPath returns %s, nameType %d", - res.c_str(), int(nameType)); - return res; -} - -static ZkFuseHandleManager::SharedPtr singletonZkFuseHandleManager; - -inline const ZkFuseHandleManager::SharedPtr & zkFuseHandleManager() -{ - return singletonZkFuseHandleManager; -} - -static -int zkfuse_getattr(const char *path, struct stat *stbuf) -{ - LOG_DEBUG(LOG, "zkfuse_getattr(path %s)", path); - - int res = 0; - try { - res = zkFuseHandleManager()->getattr(path, *stbuf); - } catch (const std::exception & e) { - LOG_ERROR(LOG, "zkfuse_getattr %s exception %s", path, e.what()); - res = -EIO; - } - - LOG_DEBUG(LOG, "zkfuse_getattr returns %d", res); - return res; -} - -static -int zkfuse_fgetattr(const char *path, struct stat *stbuf, - struct fuse_file_info *fi) -{ - LOG_DEBUG(LOG, "zkfuse_fgetattr(path %s)", path); - - int res = 0; - int handle = fi->fh; - try { - if (handle <= 0) { - res = -EINVAL; - } - else { - res = zkFuseHandleManager()->getFile(handle)-> - getattr(*stbuf, ZkFuseNameDefaultType); - } - } catch (const std::exception & e) { - LOG_ERROR(LOG, "zkfuse_fgetattr %s exception %s", path, e.what()); - res = -EIO; - } - - LOG_DEBUG(LOG, "zkfuse_fgetattr returns %d", res); - return res; -} - -static -int zkfuse_access(const char *path, int mask) -{ - /* not implemented */ - return -1; -} - -static -int zkfuse_readlink(const char *path, char *buf, size_t size) -{ - /* not implemented */ - return -1; -} - -static -int zkfuse_opendir(const char *path, struct fuse_file_info *fi) -{ - LOG_DEBUG(LOG, "zkfuse_opendir(path %s)", path); - - int res = 0; - try { - ZkFuseNameType nameType; - std::string zkPath = zkFuseHandleManager()->getZkPath(path, nameType); - if (nameType == ZkFuseNameRegType) { - res = -ENOENT; - } - else { - ZkFuseAutoHandle autoHandle(zkFuseHandleManager(), zkPath); - res = autoHandle.get(); - if (res >= 0) { - autoHandle.getFile()->incOpenDirCount(); - autoHandle.release(); - fi->fh = res; - res = 0; - } - } - } catch (const std::exception & e) { - LOG_ERROR(LOG, "zkfuse_opendir %s exception %s", path, e.what()); - res = -EIO; - } - - LOG_DEBUG(LOG, "zkfuse_opendir returns %d", res); - return res; -} - -static int -zkfuse_readdir(const char *path, void *buf, fuse_fill_dir_t filler, - off_t offset, struct fuse_file_info *fi) -{ - LOG_DEBUG(LOG, "zkfuse_readdir(path %s, offset %zu)", path, offset); - - int res = 0; - int handle = fi->fh; - try { - if (handle <= 0) { - res = -EINVAL; - } - else { - res = zkFuseHandleManager()->getFile(handle)-> - readdir(buf, filler, offset); - } - } catch (const std::exception & e) { - LOG_ERROR(LOG, "zkfuse_readdir %s exception %s", path, e.what()); - res = -EIO; - } - - LOG_DEBUG(LOG, "zkfuse_readdir returns %d", res); - return res; -} - -static -int zkfuse_releasedir(const char *path, struct fuse_file_info *fi) -{ - LOG_DEBUG(LOG, "zkfuse_releasedir(path %s)", path); - - int res = 0; - unsigned handle = fi->fh; - try { - if (handle <= 0) { - res = -EINVAL; - } - else { - zkFuseHandleManager()->getFile(handle)->decOpenDirCount(); - zkFuseHandleManager()->getFile(handle)->close(); - } - } catch (const std::exception & e) { - LOG_ERROR(LOG, "zkfuse_releasedir %s exception %s", path, e.what()); - res = -EIO; - } - - LOG_DEBUG(LOG, "zkfuse_releasedir returns %d", res); - return res; -} - -static -int zkfuse_mknod(const char *path, mode_t mode, dev_t rdev) -{ - LOG_DEBUG(LOG, "zkfuse_mknod(path %s, mode %o)", path, mode); - - int res = 0; - try { - ZkFuseNameType nameType; - std::string zkPath = zkFuseHandleManager()->getZkPath(path, nameType); - ZkFuseAutoHandle autoHandle(zkFuseHandleManager(), zkPath, mode, false); - res = autoHandle.get(); - if (res >= 0) { - res = 0; - } - } catch (const std::exception & e) { - LOG_ERROR(LOG, "zkfuse_mknod %s exception %s", path, e.what()); - res = -EIO; - } - - LOG_DEBUG(LOG, "zkfuse_mknod returns %d", res); - return res; -} - -static int zkfuse_mkdir(const char *path, mode_t mode) -{ - LOG_DEBUG(LOG, "zkfuse_mkdir(path %s, mode %o", path, mode); - - int res = 0; - try { - res = zkFuseHandleManager()->mkdir(path, mode); - } catch (const std::exception & e) { - LOG_ERROR(LOG, "zkfuse_mkdir %s exception %s", path, e.what()); - res = -EIO; - } - - LOG_DEBUG(LOG, "zkfuse_mkdir returns %d", res); - return res; -} - -static int zkfuse_unlink(const char *path) -{ - LOG_DEBUG(LOG, "zkfuse_unlink(path %s)", path); - - int res = 0; - try { - res = zkFuseHandleManager()->unlink(path); - } catch (const std::exception & e) { - LOG_ERROR(LOG, "zkfuse_unlink %s exception %s", path, e.what()); - res = -EIO; - } - - LOG_DEBUG(LOG, "zkfuse_unlink returns %d", res); - return res; -} - -static int zkfuse_rmdir(const char *path) -{ - LOG_DEBUG(LOG, "zkfuse_rmdir(path %s)", path); - - int res = 0; - try { - res = zkFuseHandleManager()->rmdir(path); - } catch (const std::exception & e) { - LOG_ERROR(LOG, "zkfuse_rmdir %s exception %s", path, e.what()); - res = -EIO; - } - - LOG_DEBUG(LOG, "zkfuse_rmdir returns %d", res); - - return res; -} - -static int zkfuse_symlink(const char *from, const char *to) -{ - /* not implemented */ - return -1; -} - -static int zkfuse_rename(const char *from, const char *to) -{ - LOG_DEBUG(LOG, "zkfuse_rename(from %s, to %s)", from, to); - - int res = 0; - try { - res = zkFuseHandleManager()->rename(from, to); - } catch (const std::exception & e) { - LOG_ERROR(LOG, "zkfuse_rename %s %s exception %s", from, to, e.what()); - res = -EIO; - } - - LOG_DEBUG(LOG, "zkfuse_rename returns %d", res); - - return res; -} - -static int zkfuse_link(const char *from, const char *to) -{ - /* not implemented */ - return -1; -} - -static int zkfuse_chmod(const char *path, mode_t mode) -{ - LOG_DEBUG(LOG, "zkfuse_chmod(path %s, mode %o)", path, mode); - int res = 0; - - LOG_DEBUG(LOG, "zkfuse_chmod returns %d", res); - return res; -} - -static int zkfuse_chown(const char *path, uid_t uid, gid_t gid) -{ - LOG_DEBUG(LOG, "zkfuse_chown(path %s, uid %d, gid %d)", path, uid, gid); - - int res = 0; - - if (zkFuseHandleManager()->getCommon().getUid() == uid && - zkFuseHandleManager()->getCommon().getGid() == gid) { - res = 0; - } - else { - res = -EPERM; - } - - LOG_DEBUG(LOG, "zkfuse_chown returns %d", res); - return 0; -} - -static int zkfuse_truncate(const char *path, off_t size) -{ - LOG_DEBUG(LOG, "zkfuse_truncate(path %s, size %zu)", path, size); - - int res = 0; - try { - ZkFuseNameType nameType; - std::string zkPath = zkFuseHandleManager()->getZkPath(path, nameType); - ZkFuseAutoHandle autoHandle(zkFuseHandleManager(), zkPath); - res = autoHandle.get(); - if (res >= 0) { - res = autoHandle.getFile()->truncate(size); - } - } catch (const std::exception & e) { - LOG_ERROR(LOG, "zkfuse_truncate %s exception %s", path, e.what()); - res = -EIO; - } - - LOG_DEBUG(LOG, "zkfuse_truncate returns %d", res); - return res; -} - -static -int zkfuse_ftruncate(const char *path, off_t size, struct fuse_file_info *fi) -{ - LOG_DEBUG(LOG, "zkfuse_ftruncate(path %s, size %zu)", path, size); - - int res = 0; - unsigned handle = fi->fh; - try { - if (handle <= 0) { - res = -EINVAL; - } - else { - res = zkFuseHandleManager()->getFile(handle)->truncate(size); - } - } catch (const std::exception & e) { - LOG_ERROR(LOG, "zkfuse_ftruncate %s exception %s", path, e.what()); - res = -EIO; - } - - LOG_DEBUG(LOG, "zkfuse_ftruncate returns %d", res); - return res; -} - -static -int zkfuse_utimens(const char *path, const struct timespec ts[2]) -{ - LOG_DEBUG(LOG, "zkfuse_utimens(path %s)", path); - - int res = 0; - try { - uint64_t atime = timespecToMillisecs(ts[0]); - uint64_t mtime = timespecToMillisecs(ts[1]); - ZkFuseNameType nameType; - std::string zkPath = zkFuseHandleManager()->getZkPath(path, nameType); - ZkFuseAutoHandle autoHandle(zkFuseHandleManager(), zkPath); - res = autoHandle.get(); - if (res >= 0) { - res = autoHandle.getFile()->utime(atime, mtime, nameType); - } - } catch (const std::exception & e) { - LOG_ERROR(LOG, "zkfuse_utimens %s exception %s", path, e.what()); - res = -EIO; - } - - LOG_DEBUG(LOG, "zkfuse_utimens returns %d", res); - return res; -} - -static -int zkfuse_create(const char *path, mode_t mode, struct fuse_file_info *fi) -{ - int fd; - - fd = open(path, fi->flags, mode); - if (fd == -1) - return -errno; - - fi->fh = fd; - return 0; -} - -static -int zkfuse_open(const char *path, struct fuse_file_info *fi) -{ - LOG_DEBUG(LOG, "zkfuse_open(path %s, flags %o)", path, fi->flags); - - int res = 0; - try { - ZkFuseNameType nameType; - std::string zkPath = zkFuseHandleManager()->getZkPath(path, nameType); - ZkFuseAutoHandle autoHandle(zkFuseHandleManager(), zkPath); - res = autoHandle.get(); - if (res >= 0) { - if (autoHandle.getFile()->isDirNameType(nameType)) { - res = -ENOENT; - } - } - if (res >= 0) { - autoHandle.release(); - fi->fh = res; - res = 0; - } - } catch (const std::exception & e) { - LOG_ERROR(LOG, "zkfuse_open %s exception %s", path, e.what()); - res = -EIO; - } - - LOG_DEBUG(LOG, "zkfuse_open returns %d", res); - return res; -} - -static -int zkfuse_read(const char *path, char *buf, size_t size, off_t offset, - struct fuse_file_info *fi) -{ - LOG_DEBUG(LOG, "zkfuse_read(path %s, size %zu, offset %zu)", - path, size, offset); - - int res = 0; - unsigned handle = fi->fh; - try { - if (handle <= 0) { - res = -EINVAL; - } - else { - res = zkFuseHandleManager()->getFile(handle)-> - read(buf, size, offset); - } - } catch (const std::exception & e) { - LOG_ERROR(LOG, "zkfuse_read %s exception %s", path, e.what()); - res = -EIO; - } - - LOG_DEBUG(LOG, "zkfuse_read returns %d", res); - return res; -} - -static -int zkfuse_write(const char *path, const char *buf, size_t size, - off_t offset, struct fuse_file_info *fi) -{ - LOG_DEBUG(LOG, "zkfuse_write(path %s, size %zu, offset %zu)", - path, size, offset); - - int res = 0; - unsigned handle = fi->fh; - try { - if (handle <= 0) { - res = -EINVAL; - } - else { - res = zkFuseHandleManager()->getFile(handle)-> - write(buf, size, offset); - } - } catch (const std::exception & e) { - LOG_ERROR(LOG, "zkfuse_write %s exception %s", path, e.what()); - res = -EIO; - } - - LOG_DEBUG(LOG, "zkfuse_write returns %d", res); - return res; -} - -static int zkfuse_statfs(const char *path, struct statvfs *stbuf) -{ - /* not implemented */ - return -1; -} - -static -int zkfuse_flush(const char *path, struct fuse_file_info *fi) -{ - /* This is called from every close on an open file, so call the - close on the underlying filesystem. But since flush may be - called multiple times for an open file, this must not really - close the file. This is important if used on a network - filesystem like NFS which flush the data/metadata on close() */ - - LOG_DEBUG(LOG, "zkfuse_flush(path %s)", path); - - int res = 0; - unsigned handle = fi->fh; - try { - if (handle <= 0) { - res = -EINVAL; - } - else { - res = zkFuseHandleManager()->getFile(handle)->flush(); - } - } catch (const std::exception & e) { - LOG_ERROR(LOG, "zkfuse_flush %s exception %s", path, e.what()); - res = -EIO; - } - - LOG_DEBUG(LOG, "zkfuse_flush returns %d", res); - return res; -} - -static -int zkfuse_release(const char *path, struct fuse_file_info *fi) -{ - LOG_DEBUG(LOG, "zkfuse_release(path %s)", path); - - int res = 0; - unsigned handle = fi->fh; - try { - if (handle <= 0) { - res = -EINVAL; - } - else { - zkFuseHandleManager()->getFile(handle)->close(); - } - } catch (const std::exception & e) { - LOG_ERROR(LOG, "zkfuse_release %s exception %s", path, e.what()); - res = -EIO; - } - - LOG_DEBUG(LOG, "zkfuse_release returns %d", res); - return res; -} - -static -int zkfuse_fsync(const char *path, int isdatasync, - struct fuse_file_info *fi) -{ - LOG_DEBUG(LOG, "zkfuse_fsync(path %s, isdatasync %d)", path, isdatasync); - - (void) isdatasync; - int res = zkfuse_flush(path, fi); - - LOG_DEBUG(LOG, "zkfuse_fsync returns %d", res); - return res; -} - -#ifdef HAVE_SETXATTR -/* xattr operations are optional and can safely be left unimplemented */ -static int zkfuse_setxattr(const char *path, const char *name, const char *value, - size_t size, int flags) -{ - int res = lsetxattr(path, name, value, size, flags); - if (res == -1) - return -errno; - return 0; -} - -static int zkfuse_getxattr(const char *path, const char *name, char *value, - size_t size) -{ - int res = lgetxattr(path, name, value, size); - if (res == -1) - return -errno; - return res; -} - -static int zkfuse_listxattr(const char *path, char *list, size_t size) -{ - int res = llistxattr(path, list, size); - if (res == -1) - return -errno; - return res; -} - -static int zkfuse_removexattr(const char *path, const char *name) -{ - int res = lremovexattr(path, name); - if (res == -1) - return -errno; - return 0; -} -#endif /* HAVE_SETXATTR */ - -static -int zkfuse_lock(const char *path, struct fuse_file_info *fi, int cmd, - struct flock *lock) -{ - (void) path; - return ulockmgr_op(fi->fh, cmd, lock, &fi->lock_owner, - sizeof(fi->lock_owner)); -} - - -static -void init_zkfuse_oper(fuse_operations & fo) -{ - memset(&fo, 0, sizeof(fuse_operations)); - fo.getattr = zkfuse_getattr; - fo.fgetattr = zkfuse_fgetattr; - // fo.access = zkfuse_access; - // fo.readlink = zkfuse_readlink; - fo.opendir = zkfuse_opendir; - fo.readdir = zkfuse_readdir; - fo.releasedir = zkfuse_releasedir; - fo.mknod = zkfuse_mknod; - fo.mkdir = zkfuse_mkdir; - // fo.symlink = zkfuse_symlink; - fo.unlink = zkfuse_unlink; - fo.rmdir = zkfuse_rmdir; - fo.rename = zkfuse_rename; - // fo.link = zkfuse_link; - fo.chmod = zkfuse_chmod; - fo.chown = zkfuse_chown; - fo.truncate = zkfuse_truncate; - fo.ftruncate = zkfuse_ftruncate; - fo.utimens = zkfuse_utimens; - // fo.create = zkfuse_create; - fo.open = zkfuse_open; - fo.read = zkfuse_read; - fo.write = zkfuse_write; - fo.statfs = zkfuse_statfs; - fo.flush = zkfuse_flush; - fo.release = zkfuse_release; - fo.fsync = zkfuse_fsync; -#ifdef HAVE_SETXATTR - // fo.setxattr = zkfuse_setxattr; - // fo.getxattr = zkfuse_getxattr; - // fo.listxattr = zkfuse_listxattr; - // fo.removexattr = zkfuse_removexattr; -#endif - fo.lock = zkfuse_lock; -}; - - -/** - * The listener of ZK events. - */ -class SessionEventListener : public ZKEventListener -{ - private: - /** - References the ZkFuseHandleManager instance that should be - invoked to service events. - */ - ZkFuseHandleManager::SharedPtr _manager; - - public: - /** - Sets the ZkFuseHandleManager instance that should be invoked - to service events. - */ - void setManager(const ZkFuseHandleManager::SharedPtr & manager) - { - _manager = manager; - } - /** - Received an event and invoke ZkFuseHandleManager instance to handle - received event. - */ - virtual void eventReceived(const ZKEventSource & source, - const ZKWatcherEvent & event) - { - _manager->eventReceived(event); - } -}; - -void -usage(int argc, char *argv[]) -{ - cout - << argv[0] - << " usage: " - << argv[0] - << " [args-and-values]+" << endl - << "nodepath == a complete path to a ZooKeeper node" << endl - << "\t--cachesize= or -c :" << endl - << " number of ZooKeeper nodes to cache." << endl - << "\t--debug or -d: " << endl - << "\t enable fuse debug mode." << endl - << "\t--help or -h: " << endl - << "\t print this message." << endl - << "\t--mount= or -m : " << endl - << "\t specifies where to mount the zkfuse filesystem." << endl - << "\t--name or -n: " << endl - << "\t name of file for accessing node data." << endl - << "\t--zookeeper= or -z : " << endl - << "\t specifies information needed to connect to zeekeeper." << endl; -} - -int -main(int argc, char *argv[]) -{ - /** - * Initialize log4cxx - */ - const std::string file("log4cxx.properties"); - PropertyConfigurator::configureAndWatch( file, 5000 ); - LOG_INFO(LOG, "Starting zkfuse"); - - /** - * Supported operations. - */ - enum ZkOption { - ZkOptionCacheSize = 1000, - ZkOptionDebug = 1001, - ZkOptionForceDirSuffix = 1002, - ZkOptionHelp = 1003, - ZkOptionMount = 1004, - ZkOptionName = 1005, - ZkOptionZookeeper = 1006, - ZkOptionInvalid = -1 - }; - - static const char *shortOptions = "c:df:hm:n:z:"; - static struct option longOptions[] = { - { "cachesize", 1, 0, ZkOptionCacheSize }, - { "debug", 0, 0, ZkOptionDebug }, - { "forcedirsuffix", 1, 0, ZkOptionForceDirSuffix }, - { "help", 0, 0, ZkOptionHelp }, - { "mount", 1, 0, ZkOptionMount }, - { "name", 1, 0, ZkOptionName }, - { "zookeeper", 1, 0, ZkOptionZookeeper }, - { 0, 0, 0, 0 } - }; - - /** - * Parse arguments - */ - bool debugFlag = false; - std::string mountPoint = "/tmp/zkfuse"; - std::string nameOfFile = "_data_"; - std::string forceDirSuffix = "._dir_"; - std::string zkHost; - unsigned cacheSize = 256; - - while (true) { - int c; - - c = getopt_long(argc, argv, shortOptions, longOptions, 0); - if (c == -1) { - break; - } - - switch (c) { - case ZkOptionInvalid: - cerr - << argv[0] - << ": ERROR: Did not specify legal argument!" - << endl; - return 99; - case 'c': - case ZkOptionCacheSize: - cacheSize = strtoul(optarg, NULL, 0); - break; - case 'd': - case ZkOptionDebug: - debugFlag = true; - break; - case 'f': - case ZkOptionForceDirSuffix: - forceDirSuffix = optarg; - break; - case 'h': - case ZkOptionHelp: - usage(argc, argv); - return 0; - case 'm': - case ZkOptionMount: - mountPoint = optarg; - break; - case 'n': - case ZkOptionName: - nameOfFile = optarg; - break; - case 'z': - case ZkOptionZookeeper: - zkHost = optarg; - break; - } - } - - /** - * Check that zkHost has a value, otherwise abort. - */ - if (zkHost.empty()) { - cerr - << argv[0] - << ": ERROR: " - << "required argument \"--zookeeper \" was not given!" - << endl; - return 99; - } - /** - * Check that zkHost has a value, otherwise abort. - */ - if (forceDirSuffix.empty()) { - cerr - << argv[0] - << ": ERROR: " - << "required argument \"--forcedirsuffix \" " - "not cannot be empty!" - << endl; - return 99; - } - /** - * Check nameOfFile has no forward slash - */ - if (nameOfFile.find_first_of('/') != std::string::npos) { - cerr - << argv[0] - << ": ERROR: " - << "'/' present in name which is not allowed" - << endl; - return 99; - } - - if (debugFlag) { - cout - << "cacheSize = " - << cacheSize - << ", debug = " - << debugFlag - << ", forceDirSuffix = \"" - << forceDirSuffix - << "\", mount = \"" - << mountPoint - << "\", name = \"" - << nameOfFile - << "\", zookeeper = \"" - << zkHost - << "\", optind = " - << optind - << ", argc = " - << argc - << ", current arg = \"" - << (optind >= argc ? "NULL" : argv[optind]) - << "\"" - << endl; - } - - SessionEventListener listener; - SynchronousEventAdapter eventAdapter; - LOG_INFO(LOG, "Create ZK adapter"); - try { - /** - * Create an instance of ZK adapter. - */ - std::string h(zkHost); - ZooKeeperConfig config(h, 1000, true, 10000); - ZkFuseCommon zkFuseCommon; - ZooKeeperAdapterSharedPtr zkPtr( - new ZooKeeperAdapter( - config, - &listener, - false - ) - ); - zkFuseCommon.setZkAdapter(zkPtr); - zkFuseCommon.setDataFileName(nameOfFile); - zkFuseCommon.setForceDirSuffix(forceDirSuffix); - zkFuseCommon.setCacheSize(cacheSize); - singletonZkFuseHandleManager = - ZkFuseHandleManagerFactory::create(zkFuseCommon); - listener.setManager(singletonZkFuseHandleManager); - zkPtr->reconnect(); - - } catch (const ZooKeeperException & e) { - cerr - << argv[0] - << ": ERROR: ZookKeeperException caught: " - << e.what() - << endl; - } catch (std::exception & e) { - cerr - << argv[0] - << ": ERROR: std::exception caught: " - << e.what() - << endl; - } - -#ifdef ZOOKEEPER_ROOT_CHILDREN_WATCH_BUG - cerr << "ZOOKEEPER_ROOT_CHILDREN_WATCH_BUG enabled" << endl; -#endif - /** - * Initialize fuse - */ - LOG_INFO(LOG, "Initialize fuse"); - umask(0); - fuse_operations zkfuse_oper; - init_zkfuse_oper(zkfuse_oper); - int fakeArgc = debugFlag ? 3 : 2; - char * fakeArgv[] = { - argv[0], - strdup(mountPoint.c_str()), - debugFlag ? strdup("-d") : NULL, - NULL - }; - int res = fuse_main(fakeArgc, fakeArgv, &zkfuse_oper, NULL); - for (unsigned i = 1; i <= 2; i++) { - if (fakeArgv[i] != NULL) { - free(fakeArgv[i]); - } - } - - return res; -} diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/zkperl/Changes b/pkg/registry/zookeeper-3.4.6/src/contrib/zkperl/Changes deleted file mode 100644 index c31420e5e..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/contrib/zkperl/Changes +++ /dev/null @@ -1,65 +0,0 @@ -Net::ZooKeeper - Perl extension for Apache ZooKeeper - -Revision history -================ - -0.01 Dec 5, 2008 - - initial version - -0.02 Dec 16, 2008 - - support connection to ZooKeeper and get() method - -0.03 Jan 9, 2009 - - implemented watch mechanism for get() - -0.04 Jan 15, 2009 - - all basic ZooKeeper methods supported - -0.05 Jan 21, 2009 - - converted from T_PTROBJ to T_ZK_HASH with PERL_MAGIC_ext, - allows DESTROY() to be called repeatedly - -0.06 Jan 27, 2009 - - converted from attribute accessor methods to inner and outer hashes - with PERL_MAGIC_tied - -0.07 Jan 29, 2009 - - all tied hash methods completed - -0.08 Jan 30, 2009 - - simple thread safety enforced with CLONE_SKIP - -0.09 Feb 12, 2009 - - ACL constants - -0.10 Feb 18, 2009 - - ACL support - -0.11 Feb 21, 2009 - - ZooKeeper version check - -0.20 Feb 25, 2009 - - refactored watches as subclass - -0.30 Feb 27, 2009 - - refactored stats as subclass - -0.31 Mar 6, 2009 - - test suite completed - -0.32 Mar 25, 2009 - - initial documentation completed, first public release - -0.33 Apr 20, 2009 - - copyright donated to ASF - -0.34 Jul 14, 2009 - - support ZooKeeper 3.2.0 release - -0.35 Jul 15, 2009 - - support multiple include and library locations - -0.36 Mar 27, 2011 - - Fix zookeeper version check, but only warn since we haven't been enforcing it in a while - - Look for zookeeper includes in some sane places by default - diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/zkperl/LICENSE b/pkg/registry/zookeeper-3.4.6/src/contrib/zkperl/LICENSE deleted file mode 100644 index d64569567..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/contrib/zkperl/LICENSE +++ /dev/null @@ -1,202 +0,0 @@ - - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "[]" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright [yyyy] [name of copyright owner] - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/zkperl/MANIFEST b/pkg/registry/zookeeper-3.4.6/src/contrib/zkperl/MANIFEST deleted file mode 100644 index 1b57436d4..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/contrib/zkperl/MANIFEST +++ /dev/null @@ -1,23 +0,0 @@ -Changes -LICENSE -Makefile.PL -MANIFEST -NOTICE -README -typemap -ZooKeeper.pm -ZooKeeper.xs -build/check_zk_version.c -build/check_zk_version.h -t/10_invalid.t -t/15_thread.t -t/20_tie.t -t/22_stat_tie.t -t/24_watch_tie.t -t/30_connect.t -t/35_log.t -t/40_basic.t -t/45_class.t -t/50_access.t -t/60_watch.t -t/util.pl diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/zkperl/Makefile.PL b/pkg/registry/zookeeper-3.4.6/src/contrib/zkperl/Makefile.PL deleted file mode 100644 index 9a0996ddd..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/contrib/zkperl/Makefile.PL +++ /dev/null @@ -1,73 +0,0 @@ -# Net::ZooKeeper - Perl extension for Apache ZooKeeper -# -# Licensed to the Apache Software Foundation (ASF) under one -# or more contributor license agreements. See the NOTICE file -# distributed with this work for additional information -# regarding copyright ownership. The ASF licenses this file -# to you 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. - -use 5.008_008; - -use Config; -use ExtUtils::MakeMaker; -use Getopt::Long; - -my $ZOO_MAJOR_VERSION = 3; -my $ZOO_REQUIRED_VERSION = qr{^$ZOO_MAJOR_VERSION\.\d+.\d+$}ismx; - -my @zk_inc_paths; -my @zk_lib_paths; - -GetOptions( - 'zookeeper-include=s' => \@zk_inc_paths, - 'zookeeper-lib=s' => \@zk_lib_paths -); - -my $zk_inc_paths = join(' ', map("-I$_", @zk_inc_paths)); -my $zk_lib_paths = join(' ', map("-L$_", @zk_lib_paths)); - -$zk_inc_paths .= ' ' unless ($zk_inc_paths eq ''); -$zk_lib_paths .= ' ' unless ($zk_lib_paths eq ''); - -my $cc = $Config{'cc'}; -my $check_file = 'build/check_zk_version'; - -my $check_out = qx($cc $zk_inc_paths $zk_lib_paths -I. -o $check_file $check_file.c 2>&1); - -if ($?) { - if ($check_out =~ /zookeeper_version\.h/) { - die("Could not determine ZooKeeper version:\n\n$check_out"); - } - else { - ## keep in sync with build/check_zk_version.h - die("Net::ZooKeeper requires at least ZooKeeper version 3.1.1\n"); - } -} - -chomp(my $zk_ver = qx($check_file)); - -if ($? >> 8 != 0) { - die "Couldn't check zookeeper version: $zk_ver: $r"; -} -elsif ($zk_ver !~ $ZOO_REQUIRED_VERSION) { - warn "Net::ZooKeeper requires ZooKeeper 3.x, found $zk_ver!"; -} - -WriteMakefile( - 'INC' => "$zk_inc_paths-I.", - 'LIBS' => [ "$zk_lib_paths-lzookeeper_mt" ], - 'NAME' => 'Net::ZooKeeper', - 'VERSION_FROM' => 'ZooKeeper.pm', - 'clean' => { 'FILES' => 'build/check_zk_version.o' } -); - diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/zkperl/NOTICE b/pkg/registry/zookeeper-3.4.6/src/contrib/zkperl/NOTICE deleted file mode 100644 index b68fdac51..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/contrib/zkperl/NOTICE +++ /dev/null @@ -1,6 +0,0 @@ -Net::ZooKeeper - Perl extension for Apache ZooKeeper -Copyright 2009 The Apache Software Foundation - -This product includes software developed at -The Apache Software Foundation (http://www.apache.org/). - diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/zkperl/README b/pkg/registry/zookeeper-3.4.6/src/contrib/zkperl/README deleted file mode 100644 index bbe2a0d8f..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/contrib/zkperl/README +++ /dev/null @@ -1,86 +0,0 @@ -Net::ZooKeeper - Perl extension for Apache ZooKeeper -==================================================== - -Net::ZooKeeper provides a Perl interface to the synchronous C API -of Apache ZooKeeper. ZooKeeper is coordination service for -distributed applications. -For details see the ZooKeeper home page at: - -http://zookeeper.apache.org/ - -INSTALLATION - -To install this module type the following, first install the -zookeeper C client, then: - - perl Makefile.PL - make - ZK_TEST_HOSTS=host:port,... make test - make install - -If the C headers and library are installed in non-standard -locations, specify them as arguments to Makefile.PL: - - perl Makefile.PL \ - --zookeeper-include=/path/to/zookeeper/client/include \ - --zookeeper-lib=/path/to/zookeeper/client/lib - -The path supplied to the --zookeeper-include option should -identify the directory that contains the zookeeper.h and other -ZooKeeper C include files. - -The path supplied to the --zookeeper-lib option should identify -the directory that contains the libzookeeper_mt library. - -When running "make test", if no ZK_TEST_HOSTS environment -variable is set, many tests will be skipped because no connection -to a ZooKeeper server is available. To execute these tests, -the ZK_TEST_HOSTS variable may be assigned a list of one or more -ZooKeeper host:port pairs, e.g., "localhost:7100,otherhost:7200". - -The ZK_TEST_PATH environment variable, if defined, specifies -the ZooKeeper path under which all test nodes should be created. -The tests expect to have full read/write/create/delete/admin -ZooKeeper permissions under this path. If no ZK_TEST_PATH -variable is defined, the root ZooKeeper path ("/") is used. - -DEPENDENCIES - -Version 3.1.1 of ZooKeeper is required at a minimum. - -For version 3.1.1, you may also want to apply some of these -additional patches to the ZooKeeper C API code: - -https://issues.apache.org/jira/browse/ZOOKEEPER-262 -https://issues.apache.org/jira/browse/ZOOKEEPER-318 - -For version 3.1.1, you may also want to apply some of these -additional patches to the ZooKeeper C API code: - -https://issues.apache.org/jira/browse/ZOOKEEPER-262 -https://issues.apache.org/jira/browse/ZOOKEEPER-466 - -This module requires that the multi-threaded version of the -ZooKeeper C API client library be available on your system. - -This in turn implies that the POSIX pthread library is available -as well. - -COPYRIGHT AND LICENCE - -Licensed to the Apache Software Foundation (ASF) under one -or more contributor license agreements. See the NOTICE file -distributed with this work for additional information -regarding copyright ownership. The ASF licenses this file -to you under the Apache License, Version 2.0 (the -"License"); you may not use this file except in compliance -with the License. You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. - diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/zkperl/ZooKeeper.pm b/pkg/registry/zookeeper-3.4.6/src/contrib/zkperl/ZooKeeper.pm deleted file mode 100644 index 507f0298d..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/contrib/zkperl/ZooKeeper.pm +++ /dev/null @@ -1,1257 +0,0 @@ -# Net::ZooKeeper - Perl extension for Apache ZooKeeper -# -# Licensed to the Apache Software Foundation (ASF) under one -# or more contributor license agreements. See the NOTICE file -# distributed with this work for additional information -# regarding copyright ownership. The ASF licenses this file -# to you 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. - -use 5.008_008; - -use strict; -use warnings; - -package Net::ZooKeeper; - -require Exporter; -require XSLoader; - -our $VERSION = '0.36'; - -our @ISA = qw(Exporter); - -our %EXPORT_TAGS = ( - 'errors' => [qw( - ZOK - ZSYSTEMERROR - ZRUNTIMEINCONSISTENCY - ZDATAINCONSISTENCY - ZCONNECTIONLOSS - ZMARSHALLINGERROR - ZUNIMPLEMENTED - ZOPERATIONTIMEOUT - ZBADARGUMENTS - ZINVALIDSTATE - ZAPIERROR - ZNONODE - ZNOAUTH - ZBADVERSION - ZNOCHILDRENFOREPHEMERALS - ZNODEEXISTS - ZNOTEMPTY - ZSESSIONEXPIRED - ZINVALIDCALLBACK - ZINVALIDACL - ZAUTHFAILED - ZCLOSING - ZNOTHING - )], - 'node_flags' => [qw( - ZOO_EPHEMERAL - ZOO_SEQUENCE - )], - 'acl_perms' => [qw( - ZOO_PERM_READ - ZOO_PERM_WRITE - ZOO_PERM_CREATE - ZOO_PERM_DELETE - ZOO_PERM_ADMIN - ZOO_PERM_ALL - )], - 'acls' => [qw( - ZOO_OPEN_ACL_UNSAFE - ZOO_READ_ACL_UNSAFE - ZOO_CREATOR_ALL_ACL - )], - 'events' => [qw( - ZOO_CREATED_EVENT - ZOO_DELETED_EVENT - ZOO_CHANGED_EVENT - ZOO_CHILD_EVENT - ZOO_SESSION_EVENT - ZOO_NOTWATCHING_EVENT - )], - 'states' => [qw( - ZOO_EXPIRED_SESSION_STATE - ZOO_AUTH_FAILED_STATE - ZOO_CONNECTING_STATE - ZOO_ASSOCIATING_STATE - ZOO_CONNECTED_STATE - )], - 'log_levels' => [qw( - ZOO_LOG_LEVEL_OFF - ZOO_LOG_LEVEL_ERROR - ZOO_LOG_LEVEL_WARN - ZOO_LOG_LEVEL_INFO - ZOO_LOG_LEVEL_DEBUG - )] -); - -{ - my %tags; - - push @{$EXPORT_TAGS{'all'}}, - grep {!$tags{$_}++} @{$EXPORT_TAGS{$_}} foreach (keys(%EXPORT_TAGS)); -} - -our @EXPORT_OK = ( @{$EXPORT_TAGS{'all'}} ); - -XSLoader::load('Net::ZooKeeper', $VERSION); - -1; - -__END__ - -=head1 NAME - -Net::ZooKeeper - Perl extension for Apache ZooKeeper - -=head1 SYNOPSIS - - use Net::ZooKeeper qw(:node_flags :acls); - - my $zkh = Net::ZooKeeper->new('localhost:7000'); - - $zkh->create('/foo', 'bar', - 'flags' => ZOO_EPHEMERAL, - 'acl' => ZOO_OPEN_ACL_UNSAFE) or - die("unable to create node /foo: " . $zkh->get_error() . "\n"); - - print "node /foo has value: " . $zkh->get('/foo') . "\n"; - - $zkh->set('/foo', 'baz'); - - print "node / has child nodes:\n"; - foreach my $path ($zkh->get_children('/')) { - print " /$path\n"; - } - - my $stat = $zkh->stat(); - if ($zkh->exists('/foo', 'stat' => $stat)) { - print "node /foo has stat info:\n"; - while (my($key,$value) = each(%{$stat})) { - print " $key: $value\n"; - } - } - - foreach my $acl_entry ($zkh->get_acl('/foo')) { - print "node /foo has ACL entry:\n"; - print " perms: $acl_entry->{perms}\n"; - print " scheme: $acl_entry->{scheme}\n"; - print " id: $acl_entry->{id}\n"; - } - - my $watch = $zkh->watch('timeout' => 10000); - $zkh->exists('/foo', 'watch' => $watch); - - if ($watch->wait()) { - print "watch triggered on node /foo:\n"; - print " event: $watch->{event}\n"; - print " state: $watch->{state}\n"; - } - else { - print "watch timed out after 10 seconds\n"; - } - - $zkh->delete('/foo'); - -=head1 DESCRIPTION - -Net::ZooKeeper provides a Perl interface to the synchronous C API -of Apache ZooKeeper. ZooKeeper is coordination service for -distributed applications. - -Each connection to ZooKeeper is represented as a handle object -of the class Net::ZooKeeper, similar to the manner in which database -connections are represented in the DBI module. - -To disconnect from ZooKeeper, simply destroy the Net::ZooKeeper -handle object by undefining it or by explicitly calling the -C method. - -The methods which may be invoked on Net::ZooKeeper handles -correspond to the functions of the synchronous ZooKeeper C API; -e.g., the Net::ZooKeeper method C calls the ZooKeeper -C function C, C calls C, -and so forth. - -The synchronous API functions wait for a response from the ZooKeeper -cluster before returning a result to the caller. Using these -functions permits Net::ZooKeeper to provide an interface similar -to that of a DBI driver module. - -=head2 Internal POSIX Threads - -The use of the synchronous ZooKeeper C API still requires that -the ZooKeeper C client code create several POSIX threads which run -concurrently with the main thread containing the Perl interpreter. - -The synchronous API functions are wrappers of the asynchronous -functions in the ZooKeeper C API. When a request is made by the -caller's thread (i.e., the one with the running Perl interpreter), -it is enqueued for delivery at a later time by the ZooKeeper C client -code's IO thread. The caller's thread then waits for notification -before returning from the synchronous API function. - -The IO thread dequeues the request and sends it to the ZooKeeper -cluster, while also ensuring that a regular "heartbeat" is maintained -with the cluster so that the current session does not time out. -When the IO thread receives a response from -the ZooKeeper cluster, it enqueues the response for delivery to the -client by the second thread of the ZooKeeper client code, the -completion thread. - -If the caller is using the asynchronous API, the completion thread -invokes the appropriate callback function provided by the caller -for the given request. In the case of Net::ZooKeeper, it is not -viable for the completion thread to invoke a Perl callback function -at arbitrary times; this could interfere with the state of the -Perl interpreter. - -For this reason Net::ZooKeeper uses the synchronous API only. After -enqueuing requests the synchronous API functions wait for notification -of the corresponding response. The completion thread delivers these -notifications, at which point the synchronous functions return to -their caller. - -Note that the IO and completion threads are POSIX threads, not -Perl ithreads. Net::ZooKeeper defined a C function so -that if Perl ithreads are spawned while a Net::ZooKeeper connection -is active, the Net::ZooKeeper handle objects inherited by the -spawned ithread contain undefined values so that they can not be used. -Thus each ithread will need to create its own private connections to a -ZooKeeper cluster. - -Note also that before invoking C to spawn a new process, -all Net::ZooKeeper handles should be destroyed so that all -connections to ZooKeeper are closed and all internal POSIX threads -have exited. If a child process needs to communicate with -ZooKeeper it should open its own private connections after it is -created by C. - -=head2 Signals - -The ZooKeeper C API uses TCP connections to communicate with -the ZooKeeper cluster. These connections may generate SIGPIPE -signals when they encounter errors, such as when a connection -is terminated by a ZooKeeper server. Therefore most applications -will want to trap or ignore SIGPIPE signals, e.g.: - - local $SIG{'PIPE'} = 'IGNORE'; - -Ignoring SIGPIPE signals (or providing a signal handler that returns -control to the interrupted program after receiving the signal) -will allow the ZooKeeper C client code to detect the connection error -and report it upon return from the next Net::ZooKeeper method. - -=head2 Error Handling - -Net::ZooKeeper methods return different values in the case of an -error depending on their purpose and context. For example, -C returns true if the node exists and false otherwise, -which may indicate either that the node does not exist or that -an error occurred. - -After any method returns a false, empty, or undefined value which -might indicate an error has occurred, the C method -may be called to examine the specific error code, if any. - -If C returns C, no error has occurred. If the -error code is less than C, it indicates a normal error -condition reported by the ZooKeeper server, such as C -(node does not exist) or C (node already exists). - -If the error code is greater than C, then a connection -error or server error has occurred and the client should probably -close the connection by undefining the Net::ZooKeeper handle object -and, if necessary, attempt to create a new connection to the -ZooKeeper cluster. - -=head2 Access Control - -If the ZooKeeper cluster is not configured with C then -it will respect the access controls set for each node in the -ZooKeeper hierarchy. These access controls are defined using ACLs -(Access Control Lists); see the ZooKeeper documentation for compete -details. - -In Net::ZooKeeper, ACLs are represented as arrays of hashes, where -each hash is an ACL entry that must contain three attributes, -C, C, and C. The C attribute's value -should be composed by combining ACL permission flags using the -bitwise OR operator. See C<:acl_perms> for a list of the -available ACL permission flags. - -The ACL for a node may be read using the C method. A -node's ACL may be set when the node is created by passing an ACL -array as the value of the C<'acl'> option to the C method, -and may be updated by passing an ACL array to the C method. - -When a client connects to a ZooKeeper cluster it is automatically -assigned authentication credentials based on its IP address. -Additional authentication credentials may be added using -the C method. Once a credential has been added for -the current session, there is no way to disable it. - -As an example, digest authentication may be enabled for a session -by calling C as follows: - - $zkh->add_auth('digest', "$username:$password"); - -Note that the username and password are transmitted in cleartext -to the ZooKeeper cluster. - -Such authentication credentials would enable access to a node -whose ACL contained an entry with a C attribute of -C<'digest'> and an C attribute containing a Base64-encoded -SHA1 digest of the string C<"$username:$password">. The -Perl modules Digest and MIME::Base64 may be used to create -such ACL ID values as follows: - - use Digest qw(); - use MIME::Base64 qw(); - - my $ctx = Digest->new('SHA-1')->add("$username:$password"); - my $digest = MIME::Base64::encode($ctx->digest()); - -Note that using the C method of the Digest module -will not result in digest strings with the "=" suffix characters -required by ZooKeeper. - -=head2 Logging - -As of ZooKeeper version 3.1.1, logging in the C client code is -implemented with a single, shared file handle to which all -of the internal POSIX threads write log messages; by default, -this file handle is attached to STDERR. - -Moreover, this file handle is shared by all active ZooKeeper -connections (each of which has its own private IO and completion -threads; see L above). - -Net::ZooKeeper therefore does not provide per-connection handle -attributes related to logging. The global function -C may be used to set the current -log level. See C<:log_levels> for a list of the available log -levels. The default log level is C. - -To capture ZooKeeper log messages to a file instead of STDERR, -redirect STDERR to a new file handle in the normal Perl manner: - - open(OLDERR, '>&', fileno(STDERR)) or - die("unable to dup STDERR: $!"); - open(STDERR, '>', $log_file) or - die("unable to redirect STDERR: $!"); - -=head2 Connection Order - -ZooKeeper clusters are typically made up of an odd number of -ZooKeeper servers. When connecting to such a cluster, the -C method should be passed a comma-separated list of -the hostnames and ports for each of the servers in the cluster, -e.g., C<'host1:7000,host2:7000,host2:7100'>. - -The default behaviour of the ZooKeeper client code is to -reorder this list randomly before making any connections. -A connection is then made to the first server in the reordered -list. If that connection fails, the IO thread will -automatically attempt to reconnect to the cluster, this time -to the next server in the list; when the last server in the list -is reached, the IO thread will continue again with the first -server. - -For certain purposes it may be necessary for ZooKeeper clients -to know the exact order in which the IO thread will attempt to -connect to the servers of a cluster. To do so, call -C. Note, -however, that this will affect all Net::ZooKeeper object -handles created by the current process. - -=head1 ATTRIBUTES - -=head2 Net::ZooKeeper - -The Net::ZooKeeper class provides the main interface to the -ZooKeeper client API. The following attributes are available -for each Net::ZooKeeper handle object and are specific to -that handle and the method calls invoked on it. As with DBI -handle objects, attributes may be read and written through -a hash interface, e.g.: - - print sprintf("Session timeout is %.2f seconds.\n", - $zkh->{session_timeout} / 1000); - - $zkh->{watch_timeout} = 10000; - -=over 4 - -=item hosts - -The comma-separated list of ZooKeeper server hostnames and ports -as passed to the C method. Note that by default the -ZooKeeper C client code will reorder this list before attempting -to connect for the first time; see L for details. - -This attribute is B and may not be modified. - -=item session_timeout - -The session timeout value, in milliseconds, as set by the -ZooKeeper server after connection. This value may not be -exactly the same as what was requested in the C<'session_timeout'> -option of the C method; the server will adjust the -requested timeout value so that it is within a certain range -of the server's C setting. See the ZooKeeper -documentation for details. - -Because the actual connection to the ZooKeeper server is -not made during the C method call but shortly -thereafter by the IO thread, note that this value may not -be initialized to its final value until at least one -other method which requires communication with the server -(such as C) has succeeded. - -This attribute is B and may not be modified. - -=item session_id - -The client's session ID value as set by the ZooKeeper server -after connection. This is a binary data string which may -be passed to subsequent C calls as the value of -the C<'session_id'> option, if the user wishes to attempt to -continue a session after a failure. Note that the server -may not honour such an attempt. - -Because the actual connection to the ZooKeeper server is -not made during the C method call but shortly -thereafter by the IO thread, note that this value may not -be initialized to its final value until at least one -other method which requires communication with the server -(such as C) has succeeded. - -This attribute is B and may not be modified. - -=item data_read_len - -The maximum length of node data that will be returned to -the caller by the C method. If a node's data exceeds -this length, the returned value will be shorter than the -actual node data as stored in the ZooKeeper cluster. - -The default maximum length of the node data returned by -C is 1023 bytes. This may be changed by setting -the C attribute to a different value. - -Passing a value for the C<'data_read_len'> option when calling -the C method will temporarily override the per-handle -maximum. - -=item path_read_len - -The maximum length of a newly created node's path that will -be returned to the caller by the C method. If the path -of the newly created node exceeds this length, the returned -value will be shorter than the actual path of the node as stored -in the ZooKeeper cluster. - -The default maximum length of the node path returned by -C is 1023 bytes. This may be changed by setting -the C attribute to a different value. - -Passing a value for the C<'path_read_len'> option when calling -the C method will temporarily override the current -value of this attribute. - -=item watch_timeout - -The C attribute value, in milliseconds, inherited by -all watch objects (of class Net::ZooKeeper::Watch) created by -calls to the C method. When a watch object's -C method is invoked without a C<'timeout'> option, -it waits for an event notification from the ZooKeeper cluster -for no longer than the timeout period specified by the value of -the watch object's C attribute. - -The default C attribute value for all watch objects -created by the C method is 1 minute (60000 -milliseconds). This may be changed for a particular handle -object by setting this attribute to a different value; afterwards, -the new value will be inherited by any watch objects created -by the handle object's C method. Previously -created watch objects will not be affected. - -Passing a value for the C<'timeout'> option when calling -the C method will temporarily override the current -value of this attribute and cause the newly created watch object -to inherit a different value. - -See also the C method, and the C attribute -and C method of the Net::ZooKeeper::Watch class. - -=item pending_watches - -The number of internal ZooKeeper watches created for this handle -object that are still awaiting an event notification from the -ZooKeeper cluster. - -Note that this number may be different than the number of -extant watch objects created by the handle object's C -method, not only because some event notifications may have -occurred, but also if any watch objects have been reassigned -by reusing them in more than one call to any of the C, -C, or C methods. - -This attribute is B and may not be modified. - -=back - -=head2 Net::ZooKeeper::Stat - -The Net::ZooKeeper::Stat class provides a hash interface to -the individual pieces of information which together compose the -state of a given ZooKeeper node. Net::ZooKeeper::Stat objects -are created by calling the C method on a Net::ZooKeeper -handle object, and may then be passed to any methods which accept -a C<'stat'> option value, such as C. - -Net::ZooKeeper::Stat objects may be reused multiple times. -If the Net::ZooKeeper method to which the stat object is -passed succeeds, then the stat object is updated with the newly -retrieved node state information, and any state information -previously stored in the stat object is overwritten. - -All of the attributes of stat objects are B. - -=over 4 - -=item ctime - -The creation time of the node in milliseconds since the epoch. - -=item mtime - -The time of the last modification of the node's data in -milliseconds since the epoch. - -=item data_len - -The length of the node's data in bytes. - -=item num_children - -The number of child nodes beneath of the current node. - -=item ephemeral_owner - -If the node was created with the C flag, -this attribute holds the session ID of the ZooKeeper client -which created the node. If the node was not created with -the C flag, this attribute is set to zero. - -=item version - -The number of revisions of the node's data. The ZooKeeper -cluster will increment this version number whenever the -node's data is changed. When the node is first created this -version number is initialized to zero. - -=item acl_version - -The number of revisions of the node's ACL. The ZooKeeper -cluster will increment this version number whenever the -node's ACL is changed. When the node is first created this -version number is initialized to zero. - -=item children_version - -The number of revisions of the node's list of child nodes. -The ZooKeeper cluster will increment this version number -whenever the list of child nodes is changed. When the node -is first created this version number is initialized to zero. - -=item czxid - -The ZooKeeper transaction ID (ZXID) of the transaction which -created the node. - -=item mzxid - -The ZooKeeper transaction ID (ZXID) of the transaction which -last modified the node's data. This is initially set to -the same transaction ID as the C attribute by the -C method. - -=item children_zxid - -The ZooKeeper transaction ID (ZXID) of the transaction which -last modified the node's list of child nodes. This is -initially set to the same transaction ID as the C -attribute by the C method. - -=back - -=head2 Net::ZooKeeper::Watch - -The Net::ZooKeeper::Watch class provides a hash interface -to the data returned by event notifications from the ZooKeeper -cluster. Net::ZooKeeper::Watch objects are created by calling -the C method on a Net::ZooKeeper handle object, and -may then be passed to any methods which accept a C<'watch'> -option value, such as C. - -Net::ZooKeeper::Watch objects may be reused multiple times. -Regardless of whether the Net::ZooKeeper method to which the -watch object is passed succeeds, the watch object will be -updated to receive an event notification exclusively for the -node referenced in that method call. In the case of an error, -however, the watch object may never receive any event -notification. - -=over 4 - -=item timeout - -The default timeout value, in milliseconds, for all -invocations of the C method made on the watch object. -When the C method is invoked without a -C<'timeout'> option value, it waits for an -event notification from the ZooKeeper cluster for no longer -than the timeout period specified by this attribute. -This default timeout period may be altered by setting this -attribute to a different value. - -Passing a value for the C<'timeout'> option when calling -the C method will temporarily override the current -value of this attribute and cause the C method to -use a different timeout period. - -When a Net::ZooKeeper handle object's C method is -invoked without a C<'timeout'> option, it returns a newly -created watch object whose C attribute value -is initialized to the current value of the handle object's -C attribute. When the C method is invoked -with a C<'timeout'> option, the new watch object's C -attribute value is initialized to the value specified by -the C<'timeout'> option. - -See also the C method, and the C attribute -and C method of the Net::ZooKeeper class. - -=item event - -The type of event which triggered the notification, such -as C if the node's data was changed. -See C<:events> for a list of the possible event types. -If zero, no event notification has occurred yet. - -Note that the events which will trigger a notification -will depend on the Net::ZooKeeper method to which -the watch object was passed. Watches set through the -C and C methods will report events relating -to the node's data, while watches set through the -C method will report events relating to the -creation or deletion of child nodes of the watched node. - -This attribute is B and may not be modified. - -=item state - -The state of the Net::ZooKeeper connection at the time of -the event notification. See C<:states> for a list of -the possible connection states. If zero, no event -notification has occurred yet. - -This attribute is B and may not be modified. - -=back - -=head1 METHODS - -=head2 Net::ZooKeeper - -The following methods are defined for the Net::ZooKeeper class. - -=over 4 - -=item new() - - $zkh = Net::ZooKeeper->new('host1:7000,host2:7000'); - $zkh = Net::ZooKeeper->new('host1:7000,host2:7000', - 'session_timeout' => $session_timeout, - 'session_id' => $session_id); - -Creates a new Net::ZooKeeper handle object and attempts to -connect to the one of the servers of the given ZooKeeper -cluster. As described in the L and -L sections, the ZooKeeper client code will -create an IO thread which maintains the connection with a -regular "heartbeat" request. In the event of a connection error -the IO thread will also attempt to reconnect to another one of -the servers using the same session ID. In general, these actions -should be invisible to the user, although Net::ZooKeeper methods -may return transient errors while the IO thread -reconnects with another server. - -To disconnect, undefine the Net::ZooKeeper handle object -or call the C method. (After calling C -the handle object can not be reused.) - -The ZooKeeper client code will send a "heartbeat" message -if a third of the session timeout period has elapsed without -any communication with the ZooKeeper server. A specific -session timeout period may be requested when creating a -Net::ZooKeeper handle object by supplying a value, in -milliseconds, for the C<'session_timeout'> option. The -ZooKeeper server adjust the requested timeout value so that -it is within a certain range of the server's C setting; -the actual session timeout value will be available as the -value of the handle's C attribute after at -least one method call has succeeded. See the C -attribute for more information. - -If no C<'session_timeout'> option is provided, the default -value of 10 seconds (10000 milliseconds) will be used in the -initial connection request; again, the actual timeout period to -which the server agrees will be available subsequently as the -value of the C attribute. - -Upon successful connection (i.e., after the success of a method -which requires communication with the server), the C -attribute will hold a short binary string which represents the -client's session ID as set by the server. All ephemeral nodes -created by the session are identified by this ID in the -C attribute of any Net::ZooKeeper::Stat objects -used to query their state. - -The ZooKeeper client code will use this session ID internally -whenever it tries to reconnect to another server in the ZooKeeper -cluster after detecting a failed connection. If it successfully -reconnects with the same session ID, the session will continue -and ephemeral nodes belonging to it will not be deleted. - -However, if the server determines that the session has timed -out (for example because no "heartbeat" requests have been -received within the agreed-upon session timeout period), the -session will be terminated by the cluster and all ephemeral nodes -owned by the current session automatically deleted. - -On occasion the ZooKeeper client code may not be able to quickly -reconnect to a live server and the caller may want to destroy -the existing Net::ZooKeeper handle object and attempt a -fresh connection using the same session ID as before with a -new Net::ZooKeeper object. To do so, save the C -attribute value before undefining the old handle object -and then pass that binary string as the value of the -C<'session_id'> option to the C method when creating the -next handle object. After the successful completion of a -method which requires communication with the server, if the -new handle object's C attribute value matches the -old session ID then the session has been successfully maintained; -otherwise, the old session was expired by the cluster. - -=item get_error() - - $code = $zkh->get_error(); - -Returns the ZooKeeper error code, if any, from the most -recent Net::ZooKeeper method invocation. The returned value -will be zero (equivalent to C) if no error occurred, -otherwise non-zero. Non-zero values may be compared to -the error code names exported by the C<:errors> tagset. - -See L for more details. - -=item add_auth() - - $zkh->add_auth('digest', "$username:$password"); - -The C method may be used to add authentication -credentials to a session. Once a credential has been added for -the current session, there is no way to disable it. - -When using the digest authentication scheme, note that the -username and password are transmitted in cleartext -to the ZooKeeper cluster. - -See L for additional details. - -=item create() - - $path = $zkh->create($req_path, $data); - $path = $zkh->create($req_path, $data, - 'flags' => (ZOO_EPHEMERAL | ZOO_SEQUENCE), - 'acl' => ZOO_OPEN_ACL_UNSAFE, - 'path_read_len' => 100); - -Requests that a node be created in the ZooKeeper cluster's -hierarchy with the given path and data. Upon success, -the returns the node's path, otherwise undef. - -The path returned by a successful C method call -may not be the new node's full path as it appears in the -ZooKeeper hierarchy, depending on the length of the actual -path and the value of the handle object's C -attribute. If the length of the actual path exceeds the -current value of the C attribute, the path -returned by the C method will be truncated; note -that the node's path in the ZooKeeper hierarchy is not -affected by this truncation. - -Specifying a value for the C<'path_read_len'> option will -temporarily override the value of the C -attribute for the duration of the C method. - -The flag values available for use with the C<'flags'> option -are C and C; both are -included in the C<:flags> tagset. The flags should be -combined with the bitwise OR operator if more than one -is required. - -The C flag causes the node to be marked as -ephemeral, meaning it will be automatically deleted if it -still exists when the client's session ends. The -C flag causes a unique integer to be appended -to the node's final path component. See the ZooKeeper -documentation for additional advice on how to use these flags. - -When creating a node it may be important to define an ACL -for it; to do this, pass a reference to an ACL array (as -described in L) using the C<'acl'> option. -See also the C<:acl_perms> and C<:acls> tagsets for lists -of the available ACL permission flags and pre-defined ACLs. - -=item delete() - - $ret = $zkh->delete($path); - $ret = $zkh->delete($path, 'version' => $version); - -Requests that a node be deleted from the ZooKeeper hierarchy. -Returns true upon success, false otherwise. - -If a value for the C<'version'> option is supplied, the node -will only be deleted if its version number matches the given -value. See the C attribute of the Net::ZooKeeper::Stat -class for details on node version numbering. - -=item exists() - - $ret = $zkh->exists($path); - $ret = $zkh->exists($path, 'stat' => $stat, 'watch' => $watch); - -Tests whether a given node exists. Returns true if the node -exists, otherwise false. When the C method is successful -but the node does not exist, it returns false, and C -will return C until another method is called on the -handle object. - -The C<'stat'> option may be used to request that a -Net::ZooKeeper::Stat object be updated with the node's -current state information. The stat object will only be -updated if the node exists and the C method -succeeds. The stat object must first have been created -using the C method. - -The C<'watch'> option may be used to request that a -Net::ZooKeeper::Watch object be assigned to receive -notification of an event which alters the node's data. -The watch object must first have been created using the -C method. If the watch object was previously -assigned to receive notifications for another node, it -will be reassigned even if the C method fails. - -=item get_children() - - @child_names = $zkh->get_children($path); - $num_children = $zkh->get_children($path, 'watch' => $watch); - -Queries the names or number of the child nodes stored beneath -a given node in the ZooKeeper hierarchy. In a list context, -returns a list of the child nodes' names upon success, otherwise -an empty list. When the C method is successful -but there are no child nodes, it returns an empty list, and -C will return C until another method is called -on the handle object. - -In a scalar context, C returns the number -of child nodes upon success, otherwise undef. - -The names of the child nodes are simply the final component -of the nodes' paths, i.e., the portion of their path which -follows the path of the given parent node, excluding the -"/" delimiter. - -The C<'watch'> option may be used to request that a -Net::ZooKeeper::Watch object be assigned to receive -notification of an event which alters the node's list of -child nodes. The watch object must first have been created -using the C method. If the watch object was -previously assigned to receive notifications for another node, -it will be reassigned even if the C method fails. - -=item get() - - $data = $zkh->get($path); - $data = $zkh->get($path, 'data_read_len' => 100, - 'stat' => $stat, 'watch' => $watch); - -Queries the data stored in a given node. Returns the -data as a string upon success, otherwise undef. Note -that the data may contain nulls if the node's data is -not a text string. - -If the length of the node's data exceeds the current value -of the handle object's C attribute, the -string returned by the C method will be truncated; -note that the node's data in the ZooKeeper cluster is not -affected by this truncation. - -Specifying a value for the C<'data_read_len'> option will -temporarily override the value of the C -attribute for the duration of the C method. - -The C<'stat'> option may be used to request that a -Net::ZooKeeper::Stat object be updated with the node's -current state information. The stat object will only be -updated if the C method succeeds. The stat object -must first have been created using the C method. - -The C<'watch'> option may be used to request that a -Net::ZooKeeper::Watch object be assigned to receive -notification of an event which alters the node's data. -The watch object must first have been created using the -C method. If the watch object was previously -assigned to receive notifications for another node, it -will be reassigned even if the C method fails. - -=item set() - - $ret = $zkh->set($path, $data); - $ret = $zkh->set($path, $data, 'version' => $version, - 'stat' => $stat); - -Requests that a node's data be updated in the ZooKeeper -hierarchy. Returns true upon success, false otherwise. - -If a value for the C<'version'> option is supplied, the node's -data will only be updated if its version number matches the -given value. See the C attribute of the -Net::ZooKeeper::Stat class for details on node version numbering. - -The C<'stat'> option may be used to request that a -Net::ZooKeeper::Stat object be updated with the node's -current state information. The stat object will only be -updated if the C method succeeds. The stat object -must first have been created using the C method. - -=item get_acl() - - @acl = $zkh->get_acl($path); - $num_acl_entries = $zkh->get_acl($path, 'stat' => $stat); - -Queries the ACL associated with a node in the ZooKeeper -hierarchy, if any. In a list context, returns an array with -the node's ACL entries upon success, otherwise -an empty list. When the C method is successful -but there are no ACL entries, it returns an empty list, and -C will return C until another method is called -on the handle object. - -The elements of the returned array are hashes, each of which -represents one ACL entry. Each hash contains C, -C, and C elements. See the L -section for additional details, and the -C<:acl_perms> and C<:acls> tagsets for lists of the -available ACL permission flags and pre-defined ACLs. - -In a scalar context, C returns the number -of ACL entries upon success, otherwise undef. - -The C<'stat'> option may be used to request that a -Net::ZooKeeper::Stat object be updated with the node's -current state information. The stat object will only be -updated if the C method succeeds. The stat object -must first have been created using the C method. - -=item set_acl() - - $acl = [{ - 'perms' => (ZOO_PERM_READ | ZOO_PERM_WRITE), - 'scheme' => 'digest', - 'id' => "$username:$digest" - }]; - $ret = $zkh->set_acl($path, $acl); - $ret = $zkh->set_acl($path, ZOO_OPEN_ACL_UNSAFE, - 'version' => $version); - -Requests that a node's ACL be updated in the ZooKeeper -hierarchy. Returns true upon success, false otherwise. - -The ACL should be passed as a reference to an array of -hashes, where each hash represents one ACL entry. Each -hash should contain C, C, and C elements -as described in the L section. -See also the C<:acl_perms> and C<:acls> tagsets for lists -of the available ACL permission flags and pre-defined ACLs. - -If a value for the C<'version'> option is supplied, the node's -ACL will only be updated if its version number matches the -given value. See the C attribute of the -Net::ZooKeeper::Stat class for details on node version numbering. - -=item stat() - - $stat = $zkh->stat(); - -Creates a new Net::ZooKeeper::Stat object which may be used -with the C<'stat'> option of the C, C, -C, and C methods. When the stat object -is passed to any of these methods, upon success its attribute -values are updated to reflect the current state of the -node specified in the method call. The stat object is not -updated if the method call does not succeed. - -=item watch() - - $watch = $zkh->watch(); - $watch = $zkh->watch('timeout' => $timeout); - -Creates a new Net::ZooKeeper::Watch object which may be -used to wait for event notifications from the ZooKeeper -cluster. Each time the watch object is passed to any -of the C, C, or C methods, -its attribute values are immediately reset to zero, and will -later be updated upon receipt of an appropriate event -notification for the node specified in the method call. - -The specific types of events which cause notifications to be -sent by the ZooKeeper cluster depend on the method call used. -After use with the C and C methods, the -watch object will be set to receive an event notification -caused by a modification of the node's data or the node itself -(e.g., deletion of the node). After use with the -C method, the watch object will be set to -receive an event notification caused by a modification -of the node's list of child nodes. - -Watch objects receive at most one event notification after -their assignment to a node by one of the C, -C, or C methods. Note that in the -case of an error, the watch object may never receive any -event notification. However, when the parent Net::ZooKeeper -handle object experiences a connection error, the ZooKeeper -client code will notify all pending watches with an event of -type C. See C for more information -regarding the watch object's attribute values after a -connection error. - -A watch object may be reused with another C, -C, or C method call at any time, -in which case the watch object's attribute values -are reset to zero and the watch object will no longer be updated -by any event notification relevant to the previous method call. - -When the C method is invoked without a C<'timeout'> -option, it returns a newly created watch object whose C -attribute value is initialized to the current value of the -Net::ZooKeeper handle object's C attribute. -Otherwise, when the C method is invoked with a -C<'timeout'> option, the new watch object's C attribute -value is initialized to the value specified by the -C<'timeout'> option. - -See also the C attribute, and the C -attribute and C method of the Net::ZooKeeper::Watch -class. - -=back - -=head2 Net::ZooKeeper::Stat - -No methods are defined for the Net::ZooKeeper::Stat class. - -=head2 Net::ZooKeeper::Watch - -Only one method is defined for the Net::ZooKeeper::Watch class. - -=over 4 - -=item wait() - - $ret = $watch->wait(); - $ret = $watch->wait('timeout' => $timeout); - -Waits for an event notification from the ZooKeeper cluster -for the node most recently associated with the watch object. -Nodes are associated with a watch object by passing the -watch object as the value of a C<'watch'> option to a -Net::ZooKeeper method; methods which accept a C<'watch'> option -are C, C, and C. - -When the C method is invoked with a C<'timeout'> -option, it waits for no more than the number of milliseconds -specified by the C<'timeout'> option. -Otherwise, when the C method is invoked without a -C<'timeout'> option, it waits for no more than the timeout -period specified by the value of the watch object's C -attribute. - -The C method returns true if an event notification -was received, otherwise false. When C returns true, -the C and C attributes of the watch object -will be updated with the event's type and the current -connection state. - -When the parent Net::ZooKeeper handle object experiences a -connection error, the ZooKeeper client code will notify all -pending watches with an event of type C. -In this case, the C attribute will report the current -state of the connection to the ZooKeeper cluster. - -See also the C attribute, and the C method -and C attribute of the Net::ZooKeeper class. - -=back - -=head1 FUNCTIONS - -The following functions have global scope and affect all -Net::ZooKeeper handle objects. - -=over 4 - -=item set_log_level() - - Net::ZooKeeper::set_log_level($level); - -The C function may be called to -alter the number and type of messages written to the current log -file handle (if any). The default value is C -which disables all logging. - -See the L section for more details and C<:log_levels> -for a list of the available log levels. - -=item set_deterministic_conn_order() - - Net::ZooKeeper::set_deterministic_conn_order(1); - -The C function -may be called to indicate whether or not the list of ZooKeeper -servers passed to the C method should be randomly permuted. -If set to a true value, the list of servers will not be altered. -The default false value indicates the list of servers will -be randomly reordered prior to connection. - -See the L section for more details. - -=back - -=head1 EXPORTS - -Nothing is exported by default. Various tagsets exist which -group the tags available for export into different categories: - -=over 4 - -=item :errors - -ZooKeeper error codes. These may be compared to the values -returned by the C method. - -=item :node_flags - -The ZooKeeper node flags C and C, -which may be passed in the C<'flags'> option to the C -method. When more than node flag is required they -should be combined using the bitwise OR operator. - -=item :acl_perms - -The ZooKeeper ACL permission flags which may be used in -the value of the C attribute of an ACL entry hash. -When more than one ACL permission flag is required they -should be combined using the bitwise OR operator. - -The available ACL permission flags are C, -C, C, C, -and C. For convenience, C is -defined as the bitwise OR of all of these flags. - -=item :acls - -Common ZooKeeper ACLs which may be useful. C -specifies a node which is entirely open to all users with no -restrictions at all. C specifies -a node which is readable by all users; permissions for other actions -are not defined in this ACL. C specifies a node -for which all actions require the same authentication credentials as -held by the session which created the node; this implies that a -session should authenticate with an appropriate scheme before -creating a node with this ACL. - -=item :events - -The ZooKeeper event types which are returned in value of -the C attribute a Net::ZooKeeper::Watch object after -an event occurs on a watched node. - -=item :states - -The ZooKeeper connection states which are returned in value of -the C attribute of a Net::ZooKeeper::Watch object after -an event occurs on a watched node. - -=item :log_levels - -The ZooKeeper log levels which may be passed to the -C function. The available -log levels are, from least to most verbose, C -(the default), C, C, -C, and C. - -=item :all - -Everything from all of the above tagsets. - -=back - -=head1 SEE ALSO - -The Apache ZooKeeper project's home page at -L provides a wealth of detail -on how to develop applications using ZooKeeper. - -=head1 AUTHOR - -Chris Darroch, Echrisd@apache.orgE - -=head1 COPYRIGHT AND LICENSE - -Licensed to the Apache Software Foundation (ASF) under one -or more contributor license agreements. See the NOTICE file -distributed with this work for additional information -regarding copyright ownership. The ASF licenses this file -to you 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. - -=cut - diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/zkperl/ZooKeeper.xs b/pkg/registry/zookeeper-3.4.6/src/contrib/zkperl/ZooKeeper.xs deleted file mode 100644 index 2b475e1e5..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/contrib/zkperl/ZooKeeper.xs +++ /dev/null @@ -1,2669 +0,0 @@ -/* Net::ZooKeeper - Perl extension for Apache ZooKeeper - * - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you 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. - */ - -#define PERL_NO_GET_CONTEXT - -#include "EXTERN.h" -#include "perl.h" -#include "XSUB.h" - -#include /* pthread_mutex_lock(), etc. */ -#include /* memset(), etc. */ -#include /* CHAR_BIT */ -#include /* gettimeofday() */ - -#include - -#include "build/check_zk_version.h" - - -#define PACKAGE_NAME "Net::ZooKeeper" -#define PACKAGE_SIGNATURE 19631123 - -#define STAT_PACKAGE_NAME "Net::ZooKeeper::Stat" -#define STAT_PACKAGE_SIGNATURE 19960512 - -#define WATCH_PACKAGE_NAME "Net::ZooKeeper::Watch" -#define WATCH_PACKAGE_SIGNATURE 20050326 - -#define MAX_KEY_NAME_LEN 16 /* "children_version" */ - -#define NUM_ACL_ENTRY_KEYS 3 -#define NUM_KEYS 7 -#define NUM_STAT_KEYS 11 -#define NUM_WATCH_KEYS 3 - -#define DEFAULT_RECV_TIMEOUT_MSEC 10000 - -#define DEFAULT_DATA_BUF_LEN 1023 -#define DEFAULT_PATH_BUF_LEN 1023 -#define DEFAULT_WATCH_TIMEOUT 60000 - -#define ZOO_LOG_LEVEL_OFF 0 - -#ifndef strcaseEQ -#define strcaseEQ(a,b) (!strcasecmp((a),(b))) -#endif - - -typedef struct Stat zk_stat_t; - -typedef HV* Net__ZooKeeper__Stat; - -typedef struct zk_watch_t zk_watch_t; - -struct zk_watch_t { - pthread_mutex_t mutex; - pthread_cond_t cond; - int done; - int ret; - int event_type; - int event_state; - unsigned int timeout; - zk_watch_t *prev; - zk_watch_t *next; - int ref_count; -}; - -typedef HV* Net__ZooKeeper__Watch; - -typedef struct { - zhandle_t *handle; - zk_watch_t *first_watch; - int data_buf_len; - int path_buf_len; - unsigned int watch_timeout; - const char *hosts; - int hosts_len; - int last_ret; - int last_errno; -} zk_t; - -typedef HV* Net__ZooKeeper; - -typedef struct { - I32 signature; - union { - zk_t *zk; - zk_stat_t *stat; - zk_watch_t *watch; - } handle; -} zk_handle_t; - -typedef struct { - const char name[MAX_KEY_NAME_LEN + 1]; - U32 name_len; - size_t offset; - size_t size; - U32 hash; -} zk_key_t; - - -static zk_key_t zk_acl_entry_keys[NUM_ACL_ENTRY_KEYS] = { - {"perms", 0, 0, 0, 0}, - {"scheme", 0, 0, 0, 0}, - {"id", 0, 0, 0, 0} -}; - -static zk_key_t zk_keys[NUM_KEYS] = { - {"data_read_len", 0, 0, 0, 0}, - {"path_read_len", 0, 0, 0, 0}, - {"watch_timeout", 0, 0, 0, 0}, - {"hosts", 0, 0, 0, 0}, - {"session_timeout", 0, 0, 0, 0}, - {"session_id", 0, 0, 0, 0}, - {"pending_watches", 0, 0, 0, 0} -}; - -static zk_key_t zk_stat_keys[NUM_STAT_KEYS] = { - {"czxid", 0, offsetof(struct Stat, czxid), - sizeof(((struct Stat*) 0)->czxid), 0}, - {"mzxid", 0, offsetof(struct Stat, mzxid), - sizeof(((struct Stat*) 0)->mzxid), 0}, - {"ctime", 0, offsetof(struct Stat, ctime), - sizeof(((struct Stat*) 0)->ctime), 0}, - {"mtime", 0, offsetof(struct Stat, mtime), - sizeof(((struct Stat*) 0)->mtime), 0}, - {"version", 0, offsetof(struct Stat, version), - sizeof(((struct Stat*) 0)->version), 0}, - {"children_version", 0, offsetof(struct Stat, cversion), - sizeof(((struct Stat*) 0)->cversion), 0}, - {"acl_version", 0, offsetof(struct Stat, aversion), - sizeof(((struct Stat*) 0)->aversion), 0}, - {"ephemeral_owner", 0, offsetof(struct Stat, ephemeralOwner), - sizeof(((struct Stat*) 0)->ephemeralOwner), 0}, - {"data_len", 0, offsetof(struct Stat, dataLength), - sizeof(((struct Stat*) 0)->dataLength), 0}, - {"num_children", 0, offsetof(struct Stat, numChildren), - sizeof(((struct Stat*) 0)->numChildren), 0}, - {"children_zxid", 0, offsetof(struct Stat, pzxid), - sizeof(((struct Stat*) 0)->pzxid), 0} -}; - -static zk_key_t zk_watch_keys[NUM_WATCH_KEYS] = { - {"timeout", 0, 0, 0, 0}, - {"event", 0, 0, 0, 0}, - {"state", 0, 0, 0, 0} -}; - - -static void _zk_watcher(zhandle_t *handle, int type, int state, - const char *path, void *context) -{ - zk_watch_t *watch_ctx = context; - - pthread_mutex_lock(&watch_ctx->mutex); - - watch_ctx->event_type = type; - watch_ctx->event_state = state; - - watch_ctx->done = 1; - - pthread_cond_signal(&watch_ctx->cond); - pthread_mutex_unlock(&watch_ctx->mutex); - - return; -} - -static void _zk_auth_completion(int ret, const void *data) -{ - zk_watch_t *watch_ctx = (zk_watch_t*) data; - - pthread_mutex_lock(&watch_ctx->mutex); - - watch_ctx->ret = ret; - - watch_ctx->done = 1; - - pthread_cond_signal(&watch_ctx->cond); - pthread_mutex_unlock(&watch_ctx->mutex); - - return; -} - -static zk_watch_t *_zk_create_watch(pTHX) -{ - zk_watch_t *watch; - - Newxz(watch, 1, zk_watch_t); - - if (pthread_mutex_init(&watch->mutex, NULL)) { - int save_errno = errno; - - Safefree(watch); - - errno = save_errno; - return NULL; - } - - if (pthread_cond_init(&watch->cond, NULL)) { - int save_errno = errno; - - pthread_mutex_destroy(&watch->mutex); - Safefree(watch); - - errno = save_errno; - return NULL; - } - - return watch; -} - -static void _zk_destroy_watch(pTHX_ zk_watch_t *watch) -{ - pthread_cond_destroy(&watch->cond); - pthread_mutex_destroy(&watch->mutex); - - Safefree(watch); - - return; -} - -static zk_watch_t *_zk_acquire_watch(pTHX) -{ - zk_watch_t *watch = _zk_create_watch(aTHX); - - if (watch) { - watch->ref_count = 1; - } - - return watch; -} - -static void _zk_release_watch(pTHX_ zk_watch_t *watch, int list) -{ - if (list) { - if (watch->prev) { - watch->prev->next = watch->next; - } - if (watch->next) { - watch->next->prev = watch->prev; - } - watch->prev = NULL; - watch->next = NULL; - } - - if (--watch->ref_count == 0) { - _zk_destroy_watch(aTHX_ watch); - } - - return; -} - -static unsigned int _zk_release_watches(pTHX_ zk_watch_t *first_watch, - int final) -{ - zk_watch_t *watch = first_watch->next; - unsigned int pending_watches = 0; - - while (watch) { - zk_watch_t *next_watch = watch->next; - int done = final; - - if (!final) { - pthread_mutex_lock(&watch->mutex); - done = watch->done; - pthread_mutex_unlock(&watch->mutex); - } - - if (done) { - _zk_release_watch(aTHX_ watch, 1); - } - else { - ++pending_watches; - } - - watch = next_watch; - } - - return pending_watches; -} - -static void _zk_replace_watch(pTHX_ zk_handle_t *handle, - zk_watch_t *first_watch, - zk_watch_t *old_watch, zk_watch_t *new_watch) -{ - zk_watch_t *next_watch; - - new_watch->timeout = old_watch->timeout; - - _zk_release_watch(aTHX_ old_watch, 0); - - /* cleanup any completed watches not tied to a handle */ - _zk_release_watches(aTHX_ first_watch, 0); - - next_watch = first_watch->next; - - new_watch->prev = first_watch; - new_watch->next = next_watch; - - if (next_watch) { - next_watch->prev = new_watch; - } - - first_watch->next = new_watch; - - ++new_watch->ref_count; - - handle->handle.watch = new_watch; - - return; -} - -static void _zk_free_acl(pTHX_ struct ACL_vector *acl) -{ - if (acl->data) { - Safefree(acl->data); - } - - return; -} - -static const char *_zk_fill_acl(pTHX_ AV *acl_arr, struct ACL_vector *acl) -{ - I32 num_acl_entries = av_len(acl_arr) + 1; - int i; - - Zero(acl, 1, struct ACL_vector); - - if (num_acl_entries <= 0) { - return NULL; - } - else if (num_acl_entries > PERL_INT_MAX) { - num_acl_entries = PERL_INT_MAX; - } - - Newx(acl->data, num_acl_entries, struct ACL); - - for (i = 0; i < num_acl_entries; ++i) { - SV **acl_entry_ptr; - HV *acl_entry_hash; - zk_key_t *key; - SV **val_ptr; - struct ACL acl_entry; - - acl_entry_ptr = av_fetch(acl_arr, i, 0); - - if (!acl_entry_ptr) { - continue; - } - - if (!SvROK(*acl_entry_ptr) || - SvTYPE(SvRV(*acl_entry_ptr)) != SVt_PVHV) { - _zk_free_acl(aTHX_ acl); - - return "invalid ACL entry hash reference"; - } - - acl_entry_hash = (HV*) SvRV(*acl_entry_ptr); - - key = &zk_acl_entry_keys[0]; - val_ptr = hv_fetch(acl_entry_hash, key->name, key->name_len, 0); - - if (!val_ptr) { - _zk_free_acl(aTHX_ acl); - - return "no ACL entry perms element"; - } - - acl_entry.perms = SvIV(*val_ptr); - - if (!acl_entry.perms || (acl_entry.perms & ~ZOO_PERM_ALL)) { - _zk_free_acl(aTHX_ acl); - - return "invalid ACL entry perms"; - } - - key = &zk_acl_entry_keys[1]; - val_ptr = hv_fetch(acl_entry_hash, key->name, key->name_len, 0); - - if (!val_ptr) { - _zk_free_acl(aTHX_ acl); - - return "no ACL entry scheme element"; - } - - acl_entry.id.scheme = SvPV_nolen(*val_ptr); - - key = &zk_acl_entry_keys[2]; - val_ptr = hv_fetch(acl_entry_hash, key->name, key->name_len, 0); - - if (!val_ptr) { - _zk_free_acl(aTHX_ acl); - - return "no ACL entry id element"; - } - - acl_entry.id.id = SvPV_nolen(*val_ptr); - - ++acl->count; - acl->data[i] = acl_entry; - } - - return NULL; -} - -static void _zk_fill_acl_entry_hash(pTHX_ struct ACL *acl_entry, - HV *acl_entry_hash) -{ - zk_key_t *key; - SV *val; - - key = &zk_acl_entry_keys[0]; - val = newSViv(acl_entry->perms); - - if (!hv_store(acl_entry_hash, key->name, key->name_len, val, key->hash)) { - SvREFCNT_dec(val); - } - - key = &zk_acl_entry_keys[1]; - val = newSVpv(acl_entry->id.scheme, 0); - - if (!hv_store(acl_entry_hash, key->name, key->name_len, val, key->hash)) { - SvREFCNT_dec(val); - } - - key = &zk_acl_entry_keys[2]; - val = newSVpv(acl_entry->id.id, 0); - - if (!hv_store(acl_entry_hash, key->name, key->name_len, val, key->hash)) { - SvREFCNT_dec(val); - } - - return; -} - -static zk_handle_t *_zk_check_handle_inner(pTHX_ HV *attr_hash, - I32 package_signature) -{ - zk_handle_t *handle = NULL; - - if (SvRMAGICAL(attr_hash)) { - MAGIC *magic = mg_find((SV*) attr_hash, PERL_MAGIC_ext); - - if (magic) { - handle = (zk_handle_t*) magic->mg_ptr; - - if (handle->signature != package_signature) { - handle = NULL; - } - } - } - - return handle; -} - -static zk_handle_t *_zk_check_handle_outer(pTHX_ HV *hash, HV **attr_hash_ptr, - const char *package_name, - I32 package_signature) -{ - zk_handle_t *handle = NULL; - - if (attr_hash_ptr) { - *attr_hash_ptr = NULL; - } - - if (SvRMAGICAL((SV*) hash)) { - MAGIC *magic = mg_find((SV*) hash, PERL_MAGIC_tied); - - if (magic) { - SV *attr = magic->mg_obj; - - if (SvROK(attr) && SvTYPE(SvRV(attr)) == SVt_PVHV && - sv_derived_from(attr, package_name)) { - HV *attr_hash = (HV*) SvRV(attr); - - handle = _zk_check_handle_inner(aTHX_ attr_hash, - package_signature); - - if (handle && attr_hash_ptr) { - *attr_hash_ptr = attr_hash; - } - } - } - } - - return handle; -} - -static zk_t *_zk_get_handle_inner(pTHX_ Net__ZooKeeper attr_hash) -{ - zk_handle_t *handle; - - handle = _zk_check_handle_inner(aTHX_ attr_hash, PACKAGE_SIGNATURE); - - return handle ? handle->handle.zk : NULL; -} - -static zk_t *_zk_get_handle_outer(pTHX_ Net__ZooKeeper zkh) -{ - zk_handle_t *handle; - - handle = _zk_check_handle_outer(aTHX_ zkh, NULL, PACKAGE_NAME, - PACKAGE_SIGNATURE); - - return handle ? handle->handle.zk : NULL; -} - -static zk_stat_t *_zks_get_handle_inner(pTHX_ Net__ZooKeeper__Stat attr_hash) -{ - zk_handle_t *handle; - - handle = _zk_check_handle_inner(aTHX_ attr_hash, STAT_PACKAGE_SIGNATURE); - - return handle ? handle->handle.stat : NULL; -} - -static zk_stat_t *_zks_get_handle_outer(pTHX_ Net__ZooKeeper__Stat zksh) -{ - zk_handle_t *handle; - - handle = _zk_check_handle_outer(aTHX_ zksh, NULL, STAT_PACKAGE_NAME, - STAT_PACKAGE_SIGNATURE); - - return handle ? handle->handle.stat : NULL; -} - -static zk_watch_t *_zkw_get_handle_inner(pTHX_ Net__ZooKeeper__Watch attr_hash) -{ - zk_handle_t *handle; - - handle = _zk_check_handle_inner(aTHX_ attr_hash, WATCH_PACKAGE_SIGNATURE); - - return handle ? handle->handle.watch : NULL; -} - -static zk_watch_t *_zkw_get_handle_outer(pTHX_ Net__ZooKeeper__Watch zkwh, - zk_handle_t **handle_ptr) -{ - zk_handle_t *handle; - - handle = _zk_check_handle_outer(aTHX_ zkwh, NULL, WATCH_PACKAGE_NAME, - WATCH_PACKAGE_SIGNATURE); - - if (handle_ptr) { - *handle_ptr = handle; - } - - return handle ? handle->handle.watch : NULL; -} - - -MODULE = Net::ZooKeeper PACKAGE = Net::ZooKeeper PREFIX = zk_ - -REQUIRE: 1.9508 - -PROTOTYPES: ENABLE - -BOOT: -{ - int i; - - for (i = 0; i < NUM_ACL_ENTRY_KEYS; ++i) { - zk_key_t *key = &zk_acl_entry_keys[i]; - - key->name_len = strlen(key->name); - PERL_HASH(key->hash, key->name, key->name_len); - } - - for (i = 0; i < NUM_KEYS; ++i) { - zk_keys[i].name_len = strlen(zk_keys[i].name); - } - - for (i = 0; i < NUM_STAT_KEYS; ++i) { - zk_stat_keys[i].name_len = strlen(zk_stat_keys[i].name); - } - - for (i = 0; i < NUM_WATCH_KEYS; ++i) { - zk_watch_keys[i].name_len = strlen(zk_watch_keys[i].name); - } - - zoo_set_log_stream(NULL); - zoo_set_debug_level(0); -} - - -I32 -zk_constant(alias=Nullch) - char *alias - ALIAS: - ZOK = ZOK - ZSYSTEMERROR = ZSYSTEMERROR - ZRUNTIMEINCONSISTENCY = ZRUNTIMEINCONSISTENCY - ZDATAINCONSISTENCY = ZDATAINCONSISTENCY - ZCONNECTIONLOSS = ZCONNECTIONLOSS - ZMARSHALLINGERROR = ZMARSHALLINGERROR - ZUNIMPLEMENTED = ZUNIMPLEMENTED - ZOPERATIONTIMEOUT = ZOPERATIONTIMEOUT - ZBADARGUMENTS = ZBADARGUMENTS - ZINVALIDSTATE = ZINVALIDSTATE - ZAPIERROR = ZAPIERROR - ZNONODE = ZNONODE - ZNOAUTH = ZNOAUTH - ZBADVERSION = ZBADVERSION - ZNOCHILDRENFOREPHEMERALS = ZNOCHILDRENFOREPHEMERALS - ZNODEEXISTS = ZNODEEXISTS - ZNOTEMPTY = ZNOTEMPTY - ZSESSIONEXPIRED = ZSESSIONEXPIRED - ZINVALIDCALLBACK = ZINVALIDCALLBACK - ZINVALIDACL = ZINVALIDACL - ZAUTHFAILED = ZAUTHFAILED - ZCLOSING = ZCLOSING - ZNOTHING = ZNOTHING - - ZOO_EPHEMERAL = ZOO_EPHEMERAL - ZOO_SEQUENCE = ZOO_SEQUENCE - - ZOO_PERM_READ = ZOO_PERM_READ - ZOO_PERM_WRITE = ZOO_PERM_WRITE - ZOO_PERM_CREATE = ZOO_PERM_CREATE - ZOO_PERM_DELETE = ZOO_PERM_DELETE - ZOO_PERM_ADMIN = ZOO_PERM_ADMIN - ZOO_PERM_ALL = ZOO_PERM_ALL - - ZOO_CREATED_EVENT = ZOO_CREATED_EVENT - ZOO_DELETED_EVENT = ZOO_DELETED_EVENT - ZOO_CHANGED_EVENT = ZOO_CHANGED_EVENT - ZOO_CHILD_EVENT = ZOO_CHILD_EVENT - ZOO_SESSION_EVENT = ZOO_SESSION_EVENT - ZOO_NOTWATCHING_EVENT = ZOO_NOTWATCHING_EVENT - - ZOO_EXPIRED_SESSION_STATE = ZOO_EXPIRED_SESSION_STATE - ZOO_AUTH_FAILED_STATE = ZOO_AUTH_FAILED_STATE - ZOO_CONNECTING_STATE = ZOO_CONNECTING_STATE - ZOO_ASSOCIATING_STATE = ZOO_ASSOCIATING_STATE - ZOO_CONNECTED_STATE = ZOO_CONNECTED_STATE - - ZOO_LOG_LEVEL_OFF = ZOO_LOG_LEVEL_OFF - ZOO_LOG_LEVEL_ERROR = ZOO_LOG_LEVEL_ERROR - ZOO_LOG_LEVEL_WARN = ZOO_LOG_LEVEL_WARN - ZOO_LOG_LEVEL_INFO = ZOO_LOG_LEVEL_INFO - ZOO_LOG_LEVEL_DEBUG = ZOO_LOG_LEVEL_DEBUG - CODE: - if (!ix) { - if (!alias) { - alias = GvNAME(CvGV(cv)); - } - - if (strEQ(alias, "ZOK")) { - RETVAL = ZOK; - } - else if (strEQ(alias, "ZOO_LOG_LEVEL_OFF")) { - RETVAL = ZOO_LOG_LEVEL_OFF; - } - else { - Perl_croak(aTHX_ "unknown " PACKAGE_NAME " constant: %s", - alias); - } - } - else { - RETVAL = ix; - } - OUTPUT: - RETVAL - - -AV * -zk_acl_constant(alias=Nullch) - char *alias - ALIAS: - ZOO_OPEN_ACL_UNSAFE = 1 - ZOO_READ_ACL_UNSAFE = 2 - ZOO_CREATOR_ALL_ACL = 3 - PREINIT: - struct ACL_vector acl; - AV *acl_arr; - int i; - PPCODE: - if (!ix && !alias) { - alias = GvNAME(CvGV(cv)); - } - - if (ix == 1 || (alias != NULL && strEQ(alias, "ZOO_OPEN_ACL_UNSAFE"))) { - acl = ZOO_OPEN_ACL_UNSAFE; - } - else if (ix == 2 || (alias != NULL && strEQ(alias, "ZOO_READ_ACL_UNSAFE"))) { - acl = ZOO_READ_ACL_UNSAFE; - } - else if (ix == 3 || (alias != NULL && strEQ(alias, "ZOO_CREATOR_ALL_ACL"))) { - acl = ZOO_CREATOR_ALL_ACL; - } - else { - Perl_croak(aTHX_ "unknown " PACKAGE_NAME " constant: %s", alias); - } - - acl_arr = newAV(); - - av_extend(acl_arr, acl.count); - - for (i = 0; i < acl.count; ++i) { - HV *acl_entry_hash = newHV(); - SV *val; - - _zk_fill_acl_entry_hash(aTHX_ &acl.data[i], acl_entry_hash); - - val = newRV_noinc((SV*) acl_entry_hash); - - if (!av_store(acl_arr, i, val)) { - SvREFCNT_dec(val); - } - } - - ST(0) = sv_2mortal(newRV_noinc((SV*) acl_arr)); - - XSRETURN(1); - - -void -zk_set_log_level(level) - int level - PPCODE: - if (level < ZOO_LOG_LEVEL_OFF || level > ZOO_LOG_LEVEL_DEBUG) { - Perl_croak(aTHX_ "invalid log level: %d", level); - } - - zoo_set_debug_level(level); - - XSRETURN_EMPTY; - - -void -zk_set_deterministic_conn_order(flag) - bool flag - PPCODE: - zoo_deterministic_conn_order(!!flag); - - XSRETURN_EMPTY; - - -void -zk_new(package, hosts, ...) - char *package - char *hosts - PREINIT: - int recv_timeout = DEFAULT_RECV_TIMEOUT_MSEC; - const clientid_t *client_id = NULL; - zk_t *zk; - zk_handle_t *handle; - HV *stash, *zk_hash, *attr_hash; - SV *attr; - int i; - PPCODE: - if (items > 2 && items % 2) { - Perl_croak(aTHX_ "invalid number of arguments"); - } - - for (i = 2; i < items; i += 2) { - char *key = SvPV_nolen(ST(i)); - - if (strcaseEQ(key, "session_timeout")) { - recv_timeout = SvIV(ST(i + 1)); - - /* NOTE: would be nice if requirement in zookeeper_interest() - * that recv_timeout*2 be non-negative was documented - */ - if (recv_timeout < 0 || recv_timeout > (PERL_INT_MAX >> 1)) { - Perl_croak(aTHX_ "invalid session timeout: %d", - recv_timeout); - } - } - else if (strcaseEQ(key, "session_id")) { - STRLEN client_id_len; - - client_id = (const clientid_t*) SvPV(ST(i + 1), client_id_len); - - if (client_id_len != sizeof(clientid_t)) { - Perl_croak(aTHX_ "invalid session ID"); - } - } - } - - Newxz(zk, 1, zk_t); - - zk->handle = zookeeper_init(hosts, NULL, recv_timeout, - client_id, NULL, 0); - - if (!zk->handle) { - Safefree(zk); - - XSRETURN_UNDEF; - } - - Newxz(zk->first_watch, 1, zk_watch_t); - - zk->data_buf_len = DEFAULT_DATA_BUF_LEN; - zk->path_buf_len = DEFAULT_PATH_BUF_LEN; - zk->watch_timeout = DEFAULT_WATCH_TIMEOUT; - - zk->hosts_len = strlen(hosts); - zk->hosts = savepvn(hosts, zk->hosts_len); - - Newx(handle, 1, zk_handle_t); - - handle->signature = PACKAGE_SIGNATURE; - handle->handle.zk = zk; - - /* We use several tricks from DBI here. The attr_hash is our - * empty inner hash; we attach extra magic to it in the form of - * our zk_handle_t structure. Then we tie attr_hash to zk_hash, - * our outer hash. This is what is passed around (by reference) by - * callers. - * - * Most methods use _zk_get_handle_outer() which finds our inner - * handle, then returns the zk_t structure from its extra magic - * pointer. - * - * However, the tied hash methods, FETCH(), STORE(), and so forth, - * receive an already-dereferenced inner handle hash. This is - * because we bless both inner and outer handles into this class, - * so when a caller's code references a hash element in our - * outer handle, Perl detects its tied magic, looks up the - * tied object (our inner handle) and invokes the tied hash methods - * in its class on it. Since we blessed it into the same class - * as the outer handle, these methods simply reside in our package. - */ - - stash = gv_stashpv(package, GV_ADDWARN); - - attr_hash = newHV(); - - sv_magic((SV*) attr_hash, Nullsv, PERL_MAGIC_ext, - (const char*) handle, 0); - - attr = sv_bless(newRV_noinc((SV*) attr_hash), stash); - - zk_hash = newHV(); - - sv_magic((SV*) zk_hash, attr, PERL_MAGIC_tied, Nullch, 0); - SvREFCNT_dec(attr); - - ST(0) = sv_bless(sv_2mortal(newRV_noinc((SV*) zk_hash)), stash); - - XSRETURN(1); - - -void -zk_DESTROY(zkh) - Net::ZooKeeper zkh - PREINIT: - zk_handle_t *handle; - HV *attr_hash; - int ret = ZBADARGUMENTS; - PPCODE: - handle = _zk_check_handle_outer(aTHX_ zkh, &attr_hash, - PACKAGE_NAME, PACKAGE_SIGNATURE); - - if (!handle) { - handle = _zk_check_handle_inner(aTHX_ zkh, PACKAGE_SIGNATURE); - - if (handle) { - attr_hash = zkh; - zkh = NULL; - } - } - - if (handle) { - zk_t *zk = handle->handle.zk; - - ret = zookeeper_close(zk->handle); - - /* detach all now-inactive watches still tied to handles */ - _zk_release_watches(aTHX_ zk->first_watch, 1); - - Safefree(zk->first_watch); - Safefree(zk->hosts); - Safefree(zk); - Safefree(handle); - - sv_unmagic((SV*) attr_hash, PERL_MAGIC_ext); - } - - if (zkh && attr_hash) { - sv_unmagic((SV*) zkh, PERL_MAGIC_tied); - } - - if (GIMME_V == G_VOID) { - XSRETURN_EMPTY; - } - else if (ret == ZOK) { - XSRETURN_YES; - } - else { - XSRETURN_NO; - } - - -void -zk_CLONE(package) - char *package - PPCODE: - XSRETURN_EMPTY; - - -void -zk_CLONE_SKIP(package) - char *package - PPCODE: - XSRETURN_YES; - - -void -zk_TIEHASH(package, ...) - char *package - PPCODE: - Perl_croak(aTHX_ "tying hashes of class " - PACKAGE_NAME " not supported"); - - -void -zk_UNTIE(attr_hash, ref_count) - Net::ZooKeeper attr_hash - IV ref_count - PPCODE: - Perl_croak(aTHX_ "untying hashes of class " - PACKAGE_NAME " not supported"); - - -void -zk_FIRSTKEY(attr_hash) - Net::ZooKeeper attr_hash - PREINIT: - zk_t *zk; - PPCODE: - zk = _zk_get_handle_inner(aTHX_ attr_hash); - - if (!zk) { - Perl_croak(aTHX_ "invalid handle"); - } - - ST(0) = sv_2mortal(newSVpvn(zk_keys[0].name, zk_keys[0].name_len)); - - XSRETURN(1); - - -void -zk_NEXTKEY(attr_hash, attr_key) - Net::ZooKeeper attr_hash - SV *attr_key - PREINIT: - zk_t *zk; - char *key; - int i; - PPCODE: - zk = _zk_get_handle_inner(aTHX_ attr_hash); - - if (!zk) { - Perl_croak(aTHX_ "invalid handle"); - } - - key = SvPV_nolen(attr_key); - - for (i = 0; i < NUM_KEYS; ++i) { - if (strcaseEQ(key, zk_keys[i].name)) { - ++i; - - break; - } - } - - if (i < NUM_KEYS) { - ST(0) = sv_2mortal(newSVpvn(zk_keys[i].name, zk_keys[i].name_len)); - - XSRETURN(1); - } - else { - XSRETURN_EMPTY; - } - - -void -zk_SCALAR(attr_hash) - Net::ZooKeeper attr_hash - PPCODE: - XSRETURN_YES; - - -void -zk_FETCH(attr_hash, attr_key) - Net::ZooKeeper attr_hash - SV *attr_key - PREINIT: - zk_t *zk; - char *key; - SV *val = NULL; - PPCODE: - zk = _zk_get_handle_inner(aTHX_ attr_hash); - - if (!zk) { - Perl_croak(aTHX_ "invalid handle"); - } - - key = SvPV_nolen(attr_key); - - if (strcaseEQ(key, "data_read_len")) { - val = newSViv(zk->data_buf_len); - } - else if (strcaseEQ(key, "path_read_len")) { - val = newSViv(zk->path_buf_len); - } - else if (strcaseEQ(key, "watch_timeout")) { - val = newSVuv(zk->watch_timeout); - } - else if (strcaseEQ(key, "hosts")) { - val = newSVpvn(zk->hosts, zk->hosts_len); - } - else if (strcaseEQ(key, "session_timeout")) { - val = newSViv(zoo_recv_timeout(zk->handle)); - } - else if (strcaseEQ(key, "session_id")) { - const clientid_t *client_id; - clientid_t null_client_id; - - client_id = zoo_client_id(zk->handle); - - memset(&null_client_id, 0, sizeof(clientid_t)); - - if (!memcmp(client_id, &null_client_id, sizeof(clientid_t))) { - val = newSVpv("", 0); - } - else { - val = newSVpvn((const char*) client_id, sizeof(clientid_t)); - } - } - else if (strcaseEQ(key, "pending_watches")) { - /* cleanup any completed watches not tied to a handle */ - val = newSVuv(_zk_release_watches(aTHX_ zk->first_watch, 0)); - } - - if (val) { - ST(0) = sv_2mortal(val); - - XSRETURN(1); - } - - Perl_warn(aTHX_ "invalid element: %s", key); - - XSRETURN_UNDEF; - - -void -zk_STORE(attr_hash, attr_key, attr_val) - Net::ZooKeeper attr_hash - SV *attr_key - SV *attr_val - PREINIT: - zk_t *zk; - char *key; - PPCODE: - zk = _zk_get_handle_inner(aTHX_ attr_hash); - - if (!zk) { - Perl_croak(aTHX_ "invalid handle"); - } - - key = SvPV_nolen(attr_key); - - if (strcaseEQ(key, "data_read_len")) { - int val = SvIV(attr_val); - - if (val < 0) { - Perl_croak(aTHX_ "invalid data read length: %d", val); - } - - zk->data_buf_len = val; - } - else if (strcaseEQ(key, "path_read_len")) { - int val = SvIV(attr_val); - - if (val < 0) { - Perl_croak(aTHX_ "invalid path read length: %d", val); - } - - zk->path_buf_len = val; - } - else if (strcaseEQ(key, "watch_timeout")) { - zk->watch_timeout = SvUV(attr_val); - } - else { - int i; - - for (i = 0; i < NUM_KEYS; ++i) { - if (strcaseEQ(key, zk_keys[i].name)) { - Perl_warn(aTHX_ "read-only element: %s", key); - - XSRETURN_EMPTY; - } - } - - Perl_warn(aTHX_ "invalid element: %s", key); - } - - XSRETURN_EMPTY; - - -void -zk_EXISTS(attr_hash, attr_key) - Net::ZooKeeper attr_hash - SV *attr_key - PREINIT: - zk_t *zk; - char *key; - int i; - PPCODE: - zk = _zk_get_handle_inner(aTHX_ attr_hash); - - if (!zk) { - Perl_croak(aTHX_ "invalid handle"); - } - - key = SvPV_nolen(attr_key); - - for (i = 0; i < NUM_KEYS; ++i) { - if (strcaseEQ(key, zk_keys[i].name)) { - XSRETURN_YES; - } - } - - XSRETURN_NO; - - -void -zk_DELETE(attr_hash, attr_key) - Net::ZooKeeper attr_hash - SV *attr_key - PPCODE: - Perl_warn(aTHX_ "deleting elements from hashes of class " - PACKAGE_NAME " not supported"); - - XSRETURN_EMPTY; - - -void -zk_CLEAR(attr_hash) - Net::ZooKeeper attr_hash - PPCODE: - Perl_warn(aTHX_ "clearing hashes of class " - PACKAGE_NAME " not supported"); - - XSRETURN_EMPTY; - - -SV * -zk_get_error(zkh) - Net::ZooKeeper zkh - PREINIT: - zk_t *zk; - CODE: - zk = _zk_get_handle_outer(aTHX_ zkh); - - if (!zk) { - Perl_croak(aTHX_ "invalid handle"); - } - - RETVAL = newSViv(zk->last_ret); - errno = zk->last_errno; - OUTPUT: - RETVAL - - -void -zk_add_auth(zkh, scheme, cert) - Net::ZooKeeper zkh - char *scheme - char *cert; cert = (char *) SvPV($arg, cert_len); - PREINIT: - zk_t *zk; - STRLEN cert_len; - zk_watch_t *watch; - int ret; - PPCODE: - zk = _zk_get_handle_outer(aTHX_ zkh); - - if (!zk) { - Perl_croak(aTHX_ "invalid handle"); - } - - zk->last_ret = ZOK; - zk->last_errno = 0; - - if (cert_len > PERL_INT_MAX) { - Perl_croak(aTHX_ "invalid certificate length: %u", cert_len); - } - - watch = _zk_create_watch(aTHX); - - if (!watch) { - /* errno will be set */ - zk->last_ret = ZSYSTEMERROR; - zk->last_errno = errno; - - XSRETURN_NO; - } - - errno = 0; - ret = zoo_add_auth(zk->handle, scheme, cert, cert_len, - _zk_auth_completion, watch); - - zk->last_ret = ret; - zk->last_errno = errno; - - if (ret == ZOK) { - pthread_mutex_lock(&watch->mutex); - - while (!watch->done) { - pthread_cond_wait(&watch->cond, &watch->mutex); - } - - pthread_mutex_unlock(&watch->mutex); - - if (watch->done) { - ret = watch->ret; - } - else { - ret = ZINVALIDSTATE; - } - - /* errno may be set while we waited */ - zk->last_ret = ret; - zk->last_errno = errno; - } - - _zk_destroy_watch(aTHX_ watch); - - if (ret == ZOK) { - XSRETURN_YES; - } - else { - XSRETURN_NO; - } - - -void -zk_create(zkh, path, buf, ...) - Net::ZooKeeper zkh - char *path - char *buf; buf = (char *) SvPV($arg, buf_len); - PREINIT: - zk_t *zk; - STRLEN buf_len; - int flags = 0; - char *path_buf; - int path_buf_len; - AV *acl_arr = NULL; - struct ACL_vector acl; - int i, ret; - PPCODE: - zk = _zk_get_handle_outer(aTHX_ zkh); - - if (!zk) { - Perl_croak(aTHX_ "invalid handle"); - } - - zk->last_ret = ZOK; - zk->last_errno = 0; - - if (items > 3 && !(items % 2)) { - Perl_croak(aTHX_ "invalid number of arguments"); - } - - if (buf_len > PERL_INT_MAX) { - Perl_croak(aTHX_ "invalid data length: %u", buf_len); - } - - path_buf_len = zk->path_buf_len; - - for (i = 3; i < items; i += 2) { - char *key = SvPV_nolen(ST(i)); - - if (strcaseEQ(key, "path_read_len")) { - path_buf_len = SvIV(ST(i + 1)); - - if (path_buf_len < 2) { - Perl_croak(aTHX_ "invalid path read length: %d", - path_buf_len); - } - } - else if (strcaseEQ(key, "flags")) { - flags = SvIV(ST(i + 1)); - - if (flags & ~(ZOO_SEQUENCE | ZOO_EPHEMERAL)) { - Perl_croak(aTHX_ "invalid create flags: %d", flags); - } - } - else if (strcaseEQ(key, "acl")) { - const char *err; - - if (!SvROK(ST(i + 1)) || SvTYPE(SvRV(ST(i + 1))) != SVt_PVAV) { - Perl_croak(aTHX_ "invalid ACL array reference"); - } - - acl_arr = (AV*) SvRV(ST(i + 1)); - - err = _zk_fill_acl(aTHX_ acl_arr, &acl); - - if (err) { - Perl_croak(aTHX_ err); - } - } - } - - /* NOTE: would be nice to be able to rely on null-terminated string */ - ++path_buf_len; - Newxz(path_buf, path_buf_len, char); - - errno = 0; - ret = zoo_create(zk->handle, path, buf, buf_len, - (acl_arr ? &acl : NULL), flags, - path_buf, path_buf_len); - - zk->last_ret = ret; - zk->last_errno = errno; - - if (acl_arr) { - _zk_free_acl(aTHX_ &acl); - } - - if (ret == ZOK) { - ST(0) = sv_newmortal(); -#ifdef SV_HAS_TRAILING_NUL - sv_usepvn_flags(ST(0), path_buf, strlen(path_buf), - SV_HAS_TRAILING_NUL); -#else - sv_usepvn(ST(0), path_buf, strlen(path_buf)); -#endif - SvCUR_set(ST(0), strlen(path_buf)); - - XSRETURN(1); - } - - Safefree(path_buf); - - XSRETURN_UNDEF; - - -void -zk_delete(zkh, path, ...) - Net::ZooKeeper zkh - char *path - PREINIT: - zk_t *zk; - int version = -1; - int i, ret; - PPCODE: - zk = _zk_get_handle_outer(aTHX_ zkh); - - if (!zk) { - Perl_croak(aTHX_ "invalid handle"); - } - - zk->last_ret = ZOK; - zk->last_errno = 0; - - if (items > 2 && items % 2) { - Perl_croak(aTHX_ "invalid number of arguments"); - } - - for (i = 2; i < items; i += 2) { - char *key = SvPV_nolen(ST(i)); - - if (strcaseEQ(key, "version")) { - version = SvIV(ST(i + 1)); - - if (version < 0) { - Perl_croak(aTHX_ "invalid version requirement: %d", - version); - } - } - } - - errno = 0; - ret = zoo_delete(zk->handle, path, version); - - zk->last_ret = ret; - zk->last_errno = errno; - - if (ret == ZOK) { - XSRETURN_YES; - } - else { - XSRETURN_NO; - } - - -void -zk_exists(zkh, path, ...) - Net::ZooKeeper zkh - char *path - PREINIT: - zk_t *zk; - zk_stat_t *stat = NULL; - zk_watch_t *old_watch = NULL; - zk_handle_t *watch_handle = NULL; - watcher_fn watcher = NULL; - zk_watch_t *new_watch = NULL; - int i, ret; - PPCODE: - zk = _zk_get_handle_outer(aTHX_ zkh); - - if (!zk) { - Perl_croak(aTHX_ "invalid handle"); - } - - zk->last_ret = ZOK; - zk->last_errno = 0; - - if (items > 2 && items % 2) { - Perl_croak(aTHX_ "invalid number of arguments"); - } - - for (i = 2; i < items; i += 2) { - char *key = SvPV_nolen(ST(i)); - - if (strcaseEQ(key, "stat")) { - if (!SvROK(ST(i + 1)) || SvTYPE(SvRV(ST(i + 1))) != SVt_PVHV || - !sv_derived_from(ST(i + 1), STAT_PACKAGE_NAME)) { - Perl_croak(aTHX_ "stat is not a hash reference of " - "type " STAT_PACKAGE_NAME); - } - - stat = _zks_get_handle_outer(aTHX_ (HV*) SvRV(ST(i + 1))); - - if (!stat) { - Perl_croak(aTHX_ "invalid stat handle"); - } - } - else if (strcaseEQ(key, "watch")) { - if (!SvROK(ST(i + 1)) || SvTYPE(SvRV(ST(i + 1))) != SVt_PVHV || - !sv_derived_from(ST(i + 1), WATCH_PACKAGE_NAME)) { - Perl_croak(aTHX_ "watch is not a hash reference of " - "type " WATCH_PACKAGE_NAME); - } - - old_watch = _zkw_get_handle_outer(aTHX_ (HV*) SvRV(ST(i + 1)), - &watch_handle); - - if (!old_watch) { - Perl_croak(aTHX_ "invalid watch handle"); - } - } - } - - if (watch_handle) { - new_watch = _zk_acquire_watch(aTHX); - - if (!new_watch) { - /* errno will be set */ - zk->last_ret = ZSYSTEMERROR; - zk->last_errno = errno; - - XSRETURN_NO; - } - - watcher = _zk_watcher; - } - - errno = 0; - ret = zoo_wexists(zk->handle, path, watcher, new_watch, stat); - - zk->last_ret = ret; - zk->last_errno = errno; - - if (watch_handle) { - _zk_replace_watch(aTHX_ watch_handle, zk->first_watch, - old_watch, new_watch); - } - - if (ret == ZOK) { - XSRETURN_YES; - } - else { - XSRETURN_NO; - } - - -void -zk_get_children(zkh, path, ...) - Net::ZooKeeper zkh - char *path - PREINIT: - zk_t *zk; - zk_watch_t *old_watch = NULL; - zk_handle_t *watch_handle = NULL; - watcher_fn watcher = NULL; - zk_watch_t *new_watch = NULL; - struct String_vector strings; - int i, ret; - PPCODE: - zk = _zk_get_handle_outer(aTHX_ zkh); - - if (!zk) { - Perl_croak(aTHX_ "invalid handle"); - } - - zk->last_ret = ZOK; - zk->last_errno = 0; - - if (items > 2 && items % 2) { - Perl_croak(aTHX_ "invalid number of arguments"); - } - - for (i = 2; i < items; i += 2) { - char *key = SvPV_nolen(ST(i)); - - if (strcaseEQ(key, "watch")) { - if (!SvROK(ST(i + 1)) || SvTYPE(SvRV(ST(i + 1))) != SVt_PVHV || - !sv_derived_from(ST(i + 1), WATCH_PACKAGE_NAME)) { - Perl_croak(aTHX_ "watch is not a hash reference of " - "type " WATCH_PACKAGE_NAME); - } - - old_watch = _zkw_get_handle_outer(aTHX_ (HV*) SvRV(ST(i + 1)), - &watch_handle); - - if (!old_watch) { - Perl_croak(aTHX_ "invalid watch handle"); - } - } - } - - if (watch_handle) { - new_watch = _zk_acquire_watch(aTHX); - - if (!new_watch) { - /* errno will be set */ - zk->last_ret = ZSYSTEMERROR; - zk->last_errno = errno; - - if (GIMME_V == G_ARRAY) { - XSRETURN_EMPTY; - } - else { - XSRETURN_UNDEF; - } - } - - watcher = _zk_watcher; - } - - Zero(&strings, 1, struct String_vector); - - errno = 0; - ret = zoo_wget_children(zk->handle, path, watcher, new_watch, - &strings); - - zk->last_ret = ret; - zk->last_errno = errno; - - if (watch_handle) { - _zk_replace_watch(aTHX_ watch_handle, zk->first_watch, - old_watch, new_watch); - } - - if (ret == ZOK) { - int num_children; - - num_children = - (strings.count > PERL_INT_MAX) ? PERL_INT_MAX : strings.count; - - if (GIMME_V == G_ARRAY && num_children > 0) { - EXTEND(SP, num_children); - - for (i = 0; i < num_children; ++i) { - ST(i) = sv_2mortal(newSVpv(strings.data[i], 0)); - } - } - - /* NOTE: would be nice if this were documented as required */ - deallocate_String_vector(&strings); - - if (GIMME_V == G_ARRAY) { - if (num_children == 0) { - XSRETURN_EMPTY; - } - - XSRETURN(num_children); - } - else { - ST(0) = sv_2mortal(newSViv(num_children)); - - XSRETURN(1); - } - } - else { - if (GIMME_V == G_ARRAY) { - XSRETURN_EMPTY; - } - else { - XSRETURN_UNDEF; - } - } - - -void -zk_get(zkh, path, ...) - Net::ZooKeeper zkh - char *path - PREINIT: - zk_t *zk; - int buf_len; - zk_stat_t *stat = NULL; - zk_watch_t *old_watch = NULL; - zk_handle_t *watch_handle = NULL; - char *buf; - watcher_fn watcher = NULL; - zk_watch_t *new_watch = NULL; - int i, ret; - PPCODE: - zk = _zk_get_handle_outer(aTHX_ zkh); - - if (!zk) { - Perl_croak(aTHX_ "invalid handle"); - } - - zk->last_ret = ZOK; - zk->last_errno = 0; - - if (items > 2 && items % 2) { - Perl_croak(aTHX_ "invalid number of arguments"); - } - - buf_len = zk->data_buf_len; - - for (i = 2; i < items; i += 2) { - char *key = SvPV_nolen(ST(i)); - - if (strcaseEQ(key, "data_read_len")) { - buf_len = SvIV(ST(i + 1)); - - if (buf_len < 0) { - Perl_croak(aTHX_ "invalid data read length: %d", - buf_len); - } - } - else if (strcaseEQ(key, "stat")) { - if (!SvROK(ST(i + 1)) || SvTYPE(SvRV(ST(i + 1))) != SVt_PVHV || - !sv_derived_from(ST(i + 1), STAT_PACKAGE_NAME)) { - Perl_croak(aTHX_ "stat is not a hash reference of " - "type " STAT_PACKAGE_NAME); - } - - stat = _zks_get_handle_outer(aTHX_ (HV*) SvRV(ST(i + 1))); - - if (!stat) { - Perl_croak(aTHX_ "invalid stat handle"); - } - } - else if (strcaseEQ(key, "watch")) { - if (!SvROK(ST(i + 1)) || SvTYPE(SvRV(ST(i + 1))) != SVt_PVHV || - !sv_derived_from(ST(i + 1), WATCH_PACKAGE_NAME)) { - Perl_croak(aTHX_ "watch is not a hash reference of " - "type " WATCH_PACKAGE_NAME); - } - - old_watch = _zkw_get_handle_outer(aTHX_ (HV*) SvRV(ST(i + 1)), - &watch_handle); - - if (!old_watch) { - Perl_croak(aTHX_ "invalid watch handle"); - } - } - } - - if (watch_handle) { - new_watch = _zk_acquire_watch(aTHX); - - if (!new_watch) { - /* errno will be set */ - zk->last_ret = ZSYSTEMERROR; - zk->last_errno = errno; - - XSRETURN_UNDEF; - } - - watcher = _zk_watcher; - } - - Newx(buf, buf_len + 1, char); - - errno = 0; - ret = zoo_wget(zk->handle, path, watcher, new_watch, - buf, &buf_len, stat); - - zk->last_ret = ret; - zk->last_errno = errno; - - if (watch_handle) { - _zk_replace_watch(aTHX_ watch_handle, zk->first_watch, - old_watch, new_watch); - } - - if (ret == ZOK) { - ST(0) = sv_newmortal(); -#ifdef SV_HAS_TRAILING_NUL - buf[buf_len] = '\0'; - sv_usepvn_flags(ST(0), buf, buf_len, SV_HAS_TRAILING_NUL); -#else - sv_usepvn(ST(0), buf, buf_len); -#endif - - XSRETURN(1); - } - else { - Safefree(buf); - - XSRETURN_UNDEF; - } - - -void -zk_set(zkh, path, buf, ...) - Net::ZooKeeper zkh - char *path - char *buf; buf = (char *) SvPV($arg, buf_len); - PREINIT: - zk_t *zk; - int version = -1; - zk_stat_t *stat = NULL; - STRLEN buf_len; - int i, ret; - PPCODE: - zk = _zk_get_handle_outer(aTHX_ zkh); - - if (!zk) { - Perl_croak(aTHX_ "invalid handle"); - } - - zk->last_ret = ZOK; - zk->last_errno = 0; - - if (items > 3 && !(items % 2)) { - Perl_croak(aTHX_ "invalid number of arguments"); - } - - if (buf_len > PERL_INT_MAX) { - Perl_croak(aTHX_ "invalid data length: %u", buf_len); - } - - for (i = 3; i < items; i += 2) { - char *key = SvPV_nolen(ST(i)); - - if (strcaseEQ(key, "version")) { - version = SvIV(ST(i + 1)); - - if (version < 0) { - Perl_croak(aTHX_ "invalid version requirement: %d", - version); - } - } - else if (strcaseEQ(key, "stat")) { - if (!SvROK(ST(i + 1)) || SvTYPE(SvRV(ST(i + 1))) != SVt_PVHV || - !sv_derived_from(ST(i + 1), STAT_PACKAGE_NAME)) { - Perl_croak(aTHX_ "stat is not a hash reference of " - "type " STAT_PACKAGE_NAME); - } - - stat = _zks_get_handle_outer(aTHX_ (HV*) SvRV(ST(i + 1))); - - if (!stat) { - Perl_croak(aTHX_ "invalid stat handle"); - } - } - } - - errno = 0; - ret = zoo_set2(zk->handle, path, buf, buf_len, version, stat); - - zk->last_ret = ret; - zk->last_errno = errno; - - if (ret == ZOK) { - XSRETURN_YES; - } - else { - XSRETURN_NO; - } - - -void -zk_get_acl(zkh, path, ...) - Net::ZooKeeper zkh - char *path - PREINIT: - zk_t *zk; - zk_stat_t *stat = NULL; - struct ACL_vector acl; - int i, ret; - PPCODE: - zk = _zk_get_handle_outer(aTHX_ zkh); - - if (!zk) { - Perl_croak(aTHX_ "invalid handle"); - } - - zk->last_ret = ZOK; - zk->last_errno = 0; - - if (items > 2 && items % 2) { - Perl_croak(aTHX_ "invalid number of arguments"); - } - - for (i = 2; i < items; i += 2) { - char *key = SvPV_nolen(ST(i)); - - if (strcaseEQ(key, "stat")) { - if (!SvROK(ST(i + 1)) || SvTYPE(SvRV(ST(i + 1))) != SVt_PVHV || - !sv_derived_from(ST(i + 1), STAT_PACKAGE_NAME)) { - Perl_croak(aTHX_ "stat is not a hash reference of " - "type " STAT_PACKAGE_NAME); - } - - stat = _zks_get_handle_outer(aTHX_ (HV*) SvRV(ST(i + 1))); - - if (!stat) { - Perl_croak(aTHX_ "invalid stat handle"); - } - } - } - - errno = 0; - ret = zoo_get_acl(zk->handle, path, &acl, stat); - - zk->last_ret = ret; - zk->last_errno = errno; - - if (ret == ZOK) { - int num_acl_entries; - - num_acl_entries = - (acl.count > PERL_INT_MAX) ? PERL_INT_MAX : acl.count; - - if (GIMME_V == G_ARRAY && num_acl_entries > 0) { - EXTEND(SP, num_acl_entries); - - for (i = 0; i < num_acl_entries; ++i) { - HV *acl_entry_hash = newHV(); - - _zk_fill_acl_entry_hash(aTHX_ &acl.data[i], - acl_entry_hash); - - ST(i) = sv_2mortal(newRV_noinc((SV*) acl_entry_hash)); - } - } - - /* NOTE: would be nice if this were documented as required */ - deallocate_ACL_vector(&acl); - - if (GIMME_V == G_ARRAY) { - if (num_acl_entries == 0) { - XSRETURN_EMPTY; - } - - XSRETURN(num_acl_entries); - } - else { - ST(0) = sv_2mortal(newSViv(num_acl_entries)); - - XSRETURN(1); - } - } - else { - if (GIMME_V == G_ARRAY) { - XSRETURN_EMPTY; - } - else { - XSRETURN_UNDEF; - } - } - - -void -zk_set_acl(zkh, path, acl_arr, ...) - Net::ZooKeeper zkh - char *path - AV *acl_arr - PREINIT: - zk_t *zk; - const char *err; - int version = -1; - struct ACL_vector acl; - int i, ret; - PPCODE: - zk = _zk_get_handle_outer(aTHX_ zkh); - - if (!zk) { - Perl_croak(aTHX_ "invalid handle"); - } - - zk->last_ret = ZOK; - zk->last_errno = 0; - - if (items > 3 && !(items % 2)) { - Perl_croak(aTHX_ "invalid number of arguments"); - } - - err = _zk_fill_acl(aTHX_ acl_arr, &acl); - - if (err) { - Perl_croak(aTHX_ err); - } - - for (i = 3; i < items; i += 2) { - char *key = SvPV_nolen(ST(i)); - - if (strcaseEQ(key, "version")) { - version = SvIV(ST(i + 1)); - - if (version < 0) { - Perl_croak(aTHX_ "invalid version requirement: %d", - version); - } - } - } - - errno = 0; - ret = zoo_set_acl(zk->handle, path, version, &acl); - - zk->last_ret = ret; - zk->last_errno = errno; - - _zk_free_acl(aTHX_ &acl); - - if (ret == ZOK) { - XSRETURN_YES; - } - else { - XSRETURN_NO; - } - - -void -zk_stat(zkh) - Net::ZooKeeper zkh - PREINIT: - zk_t *zk; - zk_handle_t *handle; - HV *stash, *stat_hash, *attr_hash; - SV *attr; - PPCODE: - zk = _zk_get_handle_outer(aTHX_ zkh); - - if (!zk) { - Perl_croak(aTHX_ "invalid handle"); - } - - zk->last_ret = ZOK; - zk->last_errno = 0; - - Newx(handle, 1, zk_handle_t); - - handle->signature = STAT_PACKAGE_SIGNATURE; - - Newxz(handle->handle.stat, 1, zk_stat_t); - - /* As in zk_new(), we use two levels of magic here. */ - - stash = gv_stashpv(STAT_PACKAGE_NAME, GV_ADDWARN); - - attr_hash = newHV(); - - sv_magic((SV*) attr_hash, Nullsv, PERL_MAGIC_ext, - (const char*) handle, 0); - - attr = sv_bless(newRV_noinc((SV*) attr_hash), stash); - - stat_hash = newHV(); - - sv_magic((SV*) stat_hash, attr, PERL_MAGIC_tied, Nullch, 0); - SvREFCNT_dec(attr); - - ST(0) = sv_bless(sv_2mortal(newRV_noinc((SV*) stat_hash)), stash); - - XSRETURN(1); - - -void -zk_watch(zkh, ...) - Net::ZooKeeper zkh - PREINIT: - zk_t *zk; - unsigned int timeout; - zk_watch_t *watch; - zk_handle_t *handle; - HV *stash, *watch_hash, *attr_hash; - SV *attr; - int i; - PPCODE: - zk = _zk_get_handle_outer(aTHX_ zkh); - - if (!zk) { - Perl_croak(aTHX_ "invalid handle"); - } - - zk->last_ret = ZOK; - zk->last_errno = 0; - - if (items > 1 && !(items % 2)) { - Perl_croak(aTHX_ "invalid number of arguments"); - } - - timeout = zk->watch_timeout; - - for (i = 1; i < items; i += 2) { - char *key = SvPV_nolen(ST(i)); - - if (strcaseEQ(key, "timeout")) { - timeout = SvUV(ST(i + 1)); - } - } - - watch = _zk_acquire_watch(aTHX); - - if (!watch) { - /* errno will be set */ - zk->last_ret = ZSYSTEMERROR; - zk->last_errno = errno; - - XSRETURN_UNDEF; - } - - Newx(handle, 1, zk_handle_t); - - handle->signature = WATCH_PACKAGE_SIGNATURE; - handle->handle.watch = watch; - - /* As in zk_new(), we use two levels of magic here. */ - - stash = gv_stashpv(WATCH_PACKAGE_NAME, GV_ADDWARN); - - attr_hash = newHV(); - - watch->timeout = timeout; - - sv_magic((SV*) attr_hash, Nullsv, PERL_MAGIC_ext, - (const char*) handle, 0); - - attr = sv_bless(newRV_noinc((SV*) attr_hash), stash); - - watch_hash = newHV(); - - sv_magic((SV*) watch_hash, attr, PERL_MAGIC_tied, Nullch, 0); - SvREFCNT_dec(attr); - - ST(0) = sv_bless(sv_2mortal(newRV_noinc((SV*) watch_hash)), stash); - - XSRETURN(1); - - -MODULE = Net::ZooKeeper PACKAGE = Net::ZooKeeper::Stat PREFIX = zks_ - -void -zks_DESTROY(zksh) - Net::ZooKeeper::Stat zksh - PREINIT: - zk_handle_t *handle; - HV *attr_hash; - int ret = ZBADARGUMENTS; - PPCODE: - handle = _zk_check_handle_outer(aTHX_ zksh, &attr_hash, - STAT_PACKAGE_NAME, - STAT_PACKAGE_SIGNATURE); - - if (!handle) { - handle = _zk_check_handle_inner(aTHX_ zksh, - STAT_PACKAGE_SIGNATURE); - - if (handle) { - attr_hash = zksh; - zksh = NULL; - } - } - - if (handle) { - ret = ZOK; - - Safefree(handle->handle.stat); - Safefree(handle); - - sv_unmagic((SV*) attr_hash, PERL_MAGIC_ext); - } - - if (zksh && attr_hash) { - sv_unmagic((SV*) zksh, PERL_MAGIC_tied); - } - - if (GIMME_V == G_VOID) { - XSRETURN_EMPTY; - } - else if (ret == ZOK) { - XSRETURN_YES; - } - else { - XSRETURN_NO; - } - - -void -zks_CLONE(package) - char *package - PPCODE: - XSRETURN_EMPTY; - - -void -zks_CLONE_SKIP(package) - char *package - PPCODE: - XSRETURN_YES; - - -void -zks_TIEHASH(package, ...) - char *package - PPCODE: - Perl_croak(aTHX_ "tying hashes of class " - STAT_PACKAGE_NAME " not supported"); - - -void -zks_UNTIE(attr_hash, ref_count) - Net::ZooKeeper::Stat attr_hash - IV ref_count - PPCODE: - Perl_croak(aTHX_ "untying hashes of class " - STAT_PACKAGE_NAME " not supported"); - - -void -zks_FIRSTKEY(attr_hash) - Net::ZooKeeper::Stat attr_hash - PREINIT: - zk_stat_t *stat; - PPCODE: - stat = _zks_get_handle_inner(aTHX_ attr_hash); - - if (!stat) { - Perl_croak(aTHX_ "invalid handle"); - } - - ST(0) = sv_2mortal(newSVpvn(zk_stat_keys[0].name, - zk_stat_keys[0].name_len)); - - XSRETURN(1); - - -void -zks_NEXTKEY(attr_hash, attr_key) - Net::ZooKeeper::Stat attr_hash - SV *attr_key - PREINIT: - zk_stat_t *stat; - char *key; - int i; - PPCODE: - stat = _zks_get_handle_inner(aTHX_ attr_hash); - - if (!stat) { - Perl_croak(aTHX_ "invalid handle"); - } - - key = SvPV_nolen(attr_key); - - for (i = 0; i < NUM_STAT_KEYS; ++i) { - if (strcaseEQ(key, zk_stat_keys[i].name)) { - ++i; - - break; - } - } - - if (i < NUM_STAT_KEYS) { - ST(0) = sv_2mortal(newSVpvn(zk_stat_keys[i].name, - zk_stat_keys[i].name_len)); - - XSRETURN(1); - } - else { - XSRETURN_EMPTY; - } - - -void -zks_SCALAR(attr_hash) - Net::ZooKeeper::Stat attr_hash - PPCODE: - XSRETURN_YES; - - -void -zks_FETCH(attr_hash, attr_key) - Net::ZooKeeper::Stat attr_hash - SV *attr_key - PREINIT: - zk_stat_t *stat; - char *key; - SV *val = NULL; - int i; - PPCODE: - stat = _zks_get_handle_inner(aTHX_ attr_hash); - - if (!stat) { - Perl_croak(aTHX_ "invalid handle"); - } - - key = SvPV_nolen(attr_key); - - for (i = 0; i < NUM_STAT_KEYS; ++i) { - if (strcaseEQ(key, zk_stat_keys[i].name)) { - if (zk_stat_keys[i].size * CHAR_BIT == 32) { - val = newSViv(*((int32_t*) (((char*) stat) + - zk_stat_keys[i].offset))); - } - else { - /* NOTE: %lld is inconsistent, so cast to a double */ - val = newSVpvf("%.0f", (double) - *((int64_t*) (((char*) stat) + - zk_stat_keys[i].offset))); - } - - break; - } - } - - if (val) { - ST(0) = sv_2mortal(val); - - XSRETURN(1); - } - - Perl_warn(aTHX_ "invalid element: %s", key); - - XSRETURN_UNDEF; - - -void -zks_STORE(attr_hash, attr_key, attr_val) - Net::ZooKeeper::Stat attr_hash - SV *attr_key - SV *attr_val - PREINIT: - zk_stat_t *stat; - char *key; - int i; - PPCODE: - stat = _zks_get_handle_inner(aTHX_ attr_hash); - - if (!stat) { - Perl_croak(aTHX_ "invalid handle"); - } - - key = SvPV_nolen(attr_key); - - for (i = 0; i < NUM_STAT_KEYS; ++i) { - if (strcaseEQ(key, zk_stat_keys[i].name)) { - Perl_warn(aTHX_ "read-only element: %s", key); - - XSRETURN_EMPTY; - } - } - - Perl_warn(aTHX_ "invalid element: %s", key); - - XSRETURN_EMPTY; - - -void -zks_EXISTS(attr_hash, attr_key) - Net::ZooKeeper::Stat attr_hash - SV *attr_key - PREINIT: - zk_stat_t *stat; - char *key; - int i; - PPCODE: - stat = _zks_get_handle_inner(aTHX_ attr_hash); - - if (!stat) { - Perl_croak(aTHX_ "invalid handle"); - } - - key = SvPV_nolen(attr_key); - - for (i = 0; i < NUM_STAT_KEYS; ++i) { - if (strcaseEQ(key, zk_stat_keys[i].name)) { - XSRETURN_YES; - } - } - - XSRETURN_NO; - - -void -zks_DELETE(attr_hash, attr_key) - Net::ZooKeeper::Stat attr_hash - SV *attr_key - PPCODE: - Perl_warn(aTHX_ "deleting elements from hashes of class " - STAT_PACKAGE_NAME " not supported"); - - XSRETURN_EMPTY; - - -void -zks_CLEAR(attr_hash) - Net::ZooKeeper::Stat attr_hash - PPCODE: - Perl_warn(aTHX_ "clearing hashes of class " - STAT_PACKAGE_NAME " not supported"); - - XSRETURN_EMPTY; - - -MODULE = Net::ZooKeeper PACKAGE = Net::ZooKeeper::Watch PREFIX = zkw_ - -void -zkw_DESTROY(zkwh) - Net::ZooKeeper::Watch zkwh - PREINIT: - zk_handle_t *handle; - HV *attr_hash; - int ret = ZBADARGUMENTS; - PPCODE: - handle = _zk_check_handle_outer(aTHX_ zkwh, &attr_hash, - WATCH_PACKAGE_NAME, - WATCH_PACKAGE_SIGNATURE); - - if (!handle) { - handle = _zk_check_handle_inner(aTHX_ zkwh, - WATCH_PACKAGE_SIGNATURE); - - if (handle) { - attr_hash = zkwh; - zkwh = NULL; - } - } - - if (handle) { - ret = ZOK; - - _zk_release_watch(aTHX_ handle->handle.watch, 0); - Safefree(handle); - - sv_unmagic((SV*) attr_hash, PERL_MAGIC_ext); - } - - if (zkwh && attr_hash) { - sv_unmagic((SV*) zkwh, PERL_MAGIC_tied); - } - - if (GIMME_V == G_VOID) { - XSRETURN_EMPTY; - } - else if (ret == ZOK) { - XSRETURN_YES; - } - else { - XSRETURN_NO; - } - - -void -zkw_CLONE(package) - char *package - PPCODE: - XSRETURN_EMPTY; - - -void -zkw_CLONE_SKIP(package) - char *package - PPCODE: - XSRETURN_YES; - - -void -zkw_TIEHASH(package, ...) - char *package - PPCODE: - Perl_croak(aTHX_ "tying hashes of class " - WATCH_PACKAGE_NAME " not supported"); - - -void -zkw_UNTIE(attr_hash, ref_count) - Net::ZooKeeper::Watch attr_hash - IV ref_count - PPCODE: - Perl_croak(aTHX_ "untying hashes of class " - WATCH_PACKAGE_NAME " not supported"); - - -void -zkw_FIRSTKEY(attr_hash) - Net::ZooKeeper::Watch attr_hash - PREINIT: - zk_watch_t *watch; - PPCODE: - watch = _zkw_get_handle_inner(aTHX_ attr_hash); - - if (!watch) { - Perl_croak(aTHX_ "invalid handle"); - } - - ST(0) = sv_2mortal(newSVpvn(zk_watch_keys[0].name, - zk_watch_keys[0].name_len)); - - XSRETURN(1); - - -void -zkw_NEXTKEY(attr_hash, attr_key) - Net::ZooKeeper::Watch attr_hash - SV *attr_key - PREINIT: - zk_watch_t *watch; - char *key; - int i; - PPCODE: - watch = _zkw_get_handle_inner(aTHX_ attr_hash); - - if (!watch) { - Perl_croak(aTHX_ "invalid handle"); - } - - key = SvPV_nolen(attr_key); - - for (i = 0; i < NUM_WATCH_KEYS; ++i) { - if (strcaseEQ(key, zk_watch_keys[i].name)) { - ++i; - - break; - } - } - - if (i < NUM_WATCH_KEYS) { - ST(0) = sv_2mortal(newSVpvn(zk_watch_keys[i].name, - zk_watch_keys[i].name_len)); - - XSRETURN(1); - } - else { - XSRETURN_EMPTY; - } - - -void -zkw_SCALAR(attr_hash) - Net::ZooKeeper::Watch attr_hash - PPCODE: - XSRETURN_YES; - - -void -zkw_FETCH(attr_hash, attr_key) - Net::ZooKeeper::Watch attr_hash - SV *attr_key - PREINIT: - zk_watch_t *watch; - char *key; - SV *val = NULL; - PPCODE: - watch = _zkw_get_handle_inner(aTHX_ attr_hash); - - if (!watch) { - Perl_croak(aTHX_ "invalid handle"); - } - - key = SvPV_nolen(attr_key); - - if (strcaseEQ(key, "timeout")) { - val = newSVuv(watch->timeout); - } - else if (strcaseEQ(key, "event")) { - val = newSViv(watch->event_type); - } - else if (strcaseEQ(key, "state")) { - val = newSViv(watch->event_state); - } - - if (val) { - ST(0) = sv_2mortal(val); - - XSRETURN(1); - } - - Perl_warn(aTHX_ "invalid element: %s", key); - - XSRETURN_UNDEF; - - -void -zkw_STORE(attr_hash, attr_key, attr_val) - Net::ZooKeeper::Watch attr_hash - SV *attr_key - SV *attr_val - PREINIT: - zk_watch_t *watch; - char *key; - PPCODE: - watch = _zkw_get_handle_inner(aTHX_ attr_hash); - - if (!watch) { - Perl_croak(aTHX_ "invalid handle"); - } - - key = SvPV_nolen(attr_key); - - if (strcaseEQ(key, "timeout")) { - watch->timeout = SvUV(attr_val); - } - else { - int i; - - for (i = 0; i < NUM_WATCH_KEYS; ++i) { - if (strcaseEQ(key, zk_watch_keys[i].name)) { - Perl_warn(aTHX_ "read-only element: %s", key); - - XSRETURN_EMPTY; - } - } - - Perl_warn(aTHX_ "invalid element: %s", key); - } - - XSRETURN_EMPTY; - - -void -zkw_EXISTS(attr_hash, attr_key) - Net::ZooKeeper::Watch attr_hash - SV *attr_key - PREINIT: - zk_watch_t *watch; - char *key; - int i; - PPCODE: - watch = _zkw_get_handle_inner(aTHX_ attr_hash); - - if (!watch) { - Perl_croak(aTHX_ "invalid handle"); - } - - key = SvPV_nolen(attr_key); - - for (i = 0; i < NUM_WATCH_KEYS; ++i) { - if (strcaseEQ(key, zk_watch_keys[i].name)) { - XSRETURN_YES; - } - } - - XSRETURN_NO; - - -void -zkw_DELETE(attr_hash, attr_key) - Net::ZooKeeper::Watch attr_hash - SV *attr_key - PPCODE: - Perl_warn(aTHX_ "deleting elements from hashes of class " - WATCH_PACKAGE_NAME " not supported"); - - XSRETURN_EMPTY; - - -void -zkw_CLEAR(attr_hash) - Net::ZooKeeper::Watch attr_hash - PPCODE: - Perl_warn(aTHX_ "clearing hashes of class " - WATCH_PACKAGE_NAME " not supported"); - - XSRETURN_EMPTY; - - -void -zkw_wait(zkwh, ...) - Net::ZooKeeper::Watch zkwh - PREINIT: - zk_watch_t *watch; - unsigned int timeout; - struct timeval end_timeval; - int i, done; - PPCODE: - watch = _zkw_get_handle_outer(aTHX_ zkwh, NULL); - - if (!watch) { - Perl_croak(aTHX_ "invalid handle"); - } - - if (items > 1 && !(items % 2)) { - Perl_croak(aTHX_ "invalid number of arguments"); - } - - timeout = watch->timeout; - - for (i = 1; i < items; i += 2) { - char *key = SvPV_nolen(ST(i)); - - if (strcaseEQ(key, "timeout")) { - timeout = SvUV(ST(i + 1)); - } - } - - gettimeofday(&end_timeval, NULL); - - end_timeval.tv_sec += timeout / 1000; - end_timeval.tv_usec += (timeout % 1000) * 1000; - - pthread_mutex_lock(&watch->mutex); - - while (!watch->done) { - struct timeval curr_timeval; - struct timespec wait_timespec; - - gettimeofday(&curr_timeval, NULL); - - wait_timespec.tv_sec = end_timeval.tv_sec - curr_timeval.tv_sec; - wait_timespec.tv_nsec = - (end_timeval.tv_usec - curr_timeval.tv_usec) * 1000; - - if (wait_timespec.tv_nsec < 0) { - --wait_timespec.tv_sec; - wait_timespec.tv_nsec += 1000000000; - } - - if (wait_timespec.tv_sec < 0 || - (wait_timespec.tv_sec == 0 && wait_timespec.tv_nsec <= 0)) { - break; - } - - pthread_cond_timedwait(&watch->cond, &watch->mutex, - &wait_timespec); - } - - done = watch->done; - - pthread_mutex_unlock(&watch->mutex); - - if (done) { - XSRETURN_YES; - } - else { - XSRETURN_NO; - } - diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/zkperl/build.xml b/pkg/registry/zookeeper-3.4.6/src/contrib/zkperl/build.xml deleted file mode 100644 index 0c7207dc0..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/contrib/zkperl/build.xml +++ /dev/null @@ -1,61 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/zkperl/build/check_zk_version.c b/pkg/registry/zookeeper-3.4.6/src/contrib/zkperl/build/check_zk_version.c deleted file mode 100644 index b92315361..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/contrib/zkperl/build/check_zk_version.c +++ /dev/null @@ -1,29 +0,0 @@ -/* Net::ZooKeeper - Perl extension for Apache ZooKeeper - * - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you 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. - */ - -#include -#include - -#include "check_zk_version.h" - -int main() { - printf("%d.%d.%d\n", ZOO_MAJOR_VERSION, ZOO_MINOR_VERSION, ZOO_PATCH_VERSION); - return 0; -} - diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/zkperl/build/check_zk_version.h b/pkg/registry/zookeeper-3.4.6/src/contrib/zkperl/build/check_zk_version.h deleted file mode 100644 index 67a36420f..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/contrib/zkperl/build/check_zk_version.h +++ /dev/null @@ -1,27 +0,0 @@ -/* Net::ZooKeeper - Perl extension for Apache ZooKeeper - * - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you 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. - */ - -/* keep in sync with Makefile.PL */ -#if !defined(ZOO_MAJOR_VERSION) || ZOO_MAJOR_VERSION != 3 || \ - !defined(ZOO_MINOR_VERSION) || ZOO_MINOR_VERSION < 1 || \ - !defined(ZOO_PATCH_VERSION) || \ - (ZOO_MINOR_VERSION == 1 && ZOO_PATCH_VERSION < 1) -#error "Net::ZooKeeper requires at least ZooKeeper version 3.1.1" -#endif - diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/zkperl/t/10_invalid.t b/pkg/registry/zookeeper-3.4.6/src/contrib/zkperl/t/10_invalid.t deleted file mode 100644 index 5e080b64c..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/contrib/zkperl/t/10_invalid.t +++ /dev/null @@ -1,773 +0,0 @@ -# Net::ZooKeeper - Perl extension for Apache ZooKeeper -# -# Licensed to the Apache Software Foundation (ASF) under one -# or more contributor license agreements. See the NOTICE file -# distributed with this work for additional information -# regarding copyright ownership. The ASF licenses this file -# to you 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. - -use File::Spec; -use Test::More tests => 107; - -BEGIN { use_ok('Net::ZooKeeper', qw(:all)) }; - - -my $test_dir; -(undef, $test_dir, undef) = File::Spec->splitpath($0); -require File::Spec->catfile($test_dir, 'util.pl'); - -my($hosts, $root_path, $node_path) = zk_test_setup(1); - - -## new() - -eval { - Net::ZooKeeper->new(); -}; -like($@, qr/Usage: Net::ZooKeeper::new\(package, hosts, \.\.\.\)/, - 'new(): no hostname specified'); - -eval { - Net::ZooKeeper->new($hosts, 'bar'); -}; -like($@, qr/invalid number of arguments/, - 'new(): invalid number of arguments'); - -eval { - Net::ZooKeeper->new($hosts, 'session_timeout' => -3); -}; -like($@, qr/invalid session timeout/, - 'new(): invalid session timeout'); - -eval { - Net::ZooKeeper->new($hosts, 'session_timeout' => 0x4000_0000); -}; -like($@, qr/invalid session timeout/, - 'new(): invalid session timeout'); - -eval { - Net::ZooKeeper->new($hosts, 'session_id' => 'abcdef'); -}; -like($@, qr/invalid session ID/, - 'new(): invalid session ID'); - -my $zkh = Net::ZooKeeper->new($hosts); -isa_ok($zkh, 'Net::ZooKeeper', - 'new(): created handle'); - - -## DESTROY() - -eval { - $zkh->DESTROY('foo'); -}; -like($@, qr/Usage: Net::ZooKeeper::DESTROY\(zkh\)/, - 'DESTROY(): too many arguments'); - -my $bad_zkh = {}; -$bad_zkh = bless($bad_zkh, 'Net::ZooKeeper'); - -my $ret = $bad_zkh->DESTROY(); -ok(!$ret, - 'DESTROY(): no action on invalid handle'); - - -## add_auth() - -eval { - $zkh->add_auth(); -}; -like($@, qr/Usage: Net::ZooKeeper::add_auth\(zkh, scheme, cert\)/, - 'add_auth(): no scheme specified'); - -eval { - $zkh->add_auth('foo'); -}; -like($@, qr/Usage: Net::ZooKeeper::add_auth\(zkh, scheme, cert\)/, - 'add_auth(): no certificate specified'); - -eval { - $zkh->add_auth('foo', 'foo', 'bar'); -}; -like($@, qr/Usage: Net::ZooKeeper::add_auth\(zkh, scheme, cert\)/, - 'add_auth(): too many arguments'); - -eval { - $bad_zkh->add_auth('foo', 'foo'); -}; -like($@, qr/invalid handle/, - 'add_auth(): invalid handle'); - -eval { - Net::ZooKeeper::add_auth(1, 'foo', 'foo'); -}; -like($@, qr/zkh is not a hash reference of type Net::ZooKeeper/, - 'add_auth(): invalid hash reference'); - - -## create() - -eval { - $zkh->create(); -}; -like($@, qr/Usage: Net::ZooKeeper::create\(zkh, path, buf, \.\.\.\)/, - 'create(): no path specified'); - -eval { - $zkh->create($node_path); -}; -like($@, qr/Usage: Net::ZooKeeper::create\(zkh, path, buf, \.\.\.\)/, - 'create(): no data buffer specified'); - -eval { - $zkh->create($node_path, 'foo', 'bar'); -}; -like($@, qr/invalid number of arguments/, - 'create(): invalid number of arguments'); - -eval { - $zkh->create($node_path, 'foo', 'path_read_len' => -3); -}; -like($@, qr/invalid path read length/, - 'create(): invalid path read length'); - -eval { - $zkh->create($node_path, 'foo', 'path_read_len' => 1); -}; -like($@, qr/invalid path read length/, - 'create(): invalid path read length'); - -eval { - $zkh->create($node_path, 'foo', 'flags' => 15); -}; -like($@, qr/invalid create flags/, - 'create(): invalid create flags'); - -eval { - $zkh->create($node_path, 'foo', 'flags' => ZOO_EPHEMERAL, 'acl', 'foo'); -}; -like($@, qr/invalid ACL array reference/, - 'create(): invalid ACL array reference'); - -eval { - $zkh->create($node_path, 'foo', 'acl', {}); -}; -like($@, qr/invalid ACL array reference/, - 'create(): invalid ACL array reference to hash'); - -eval { - my @acl = ('foo', 'bar'); - $zkh->create($node_path, 'foo', 'acl', \@acl); -}; -like($@, qr/invalid ACL entry hash reference/, - 'create(): invalid ACL entry hash reference'); - -eval { - my @acl = ({ 'foo' => 'bar' }); - $zkh->create($node_path, 'foo', 'acl', \@acl); -}; -like($@, qr/no ACL entry perms element/, - 'create(): no ACL entry perms element'); - -eval { - my @acl = ( - { - 'perms' => -1 - } - ); - $zkh->create($node_path, 'foo', 'acl', \@acl); -}; -like($@, qr/invalid ACL entry perms/, - 'create(): invalid ACL entry perms'); - -eval { - my @acl = ( - { - 'perms' => ZOO_PERM_ALL - } - ); - $zkh->create($node_path, 'foo', 'acl', \@acl); -}; -like($@, qr/no ACL entry scheme element/, - 'create(): no ACL entry scheme element'); - -eval { - my @acl = ( - { - 'perms' => ZOO_PERM_ALL, - 'scheme' => 'foo' - } - ); - $zkh->create($node_path, 'foo', 'acl', \@acl); -}; -like($@, qr/no ACL entry id element/, - 'create(): no ACL entry id element'); - -eval { - my @acl = ( - { - 'perms' => ZOO_PERM_ALL, - 'scheme' => 'foo', - 'id' => 'bar' - }, - 'bar' - ); - $zkh->create($node_path, 'foo', 'acl', \@acl); -}; -like($@, qr/invalid ACL entry hash reference/, - 'create(): invalid second ACL entry hash reference'); - -eval { - $bad_zkh->create($node_path, 'foo'); -}; -like($@, qr/invalid handle/, - 'create(): invalid handle'); - -eval { - Net::ZooKeeper::create(1, $node_path, 'foo'); -}; -like($@, qr/zkh is not a hash reference of type Net::ZooKeeper/, - 'create(): invalid hash reference'); - - -## delete() - -eval { - $zkh->delete(); -}; -like($@, qr/Usage: Net::ZooKeeper::delete\(zkh, path, \.\.\.\)/, - 'delete(): no path specified'); - -eval { - $zkh->delete($node_path, 'bar'); -}; -like($@, qr/invalid number of arguments/, - 'delete(): invalid number of arguments'); - -eval { - $zkh->delete($node_path, 'version' => -3); -}; -like($@, qr/invalid version requirement/, - 'delete(): invalid version requirement'); - -eval { - $bad_zkh->delete($node_path); -}; -like($@, qr/invalid handle/, - 'delete(): invalid handle'); - -eval { - Net::ZooKeeper::delete(1, $node_path); -}; -like($@, qr/zkh is not a hash reference of type Net::ZooKeeper/, - 'delete(): invalid hash reference'); - - -## exists() - -eval { - $zkh->exists(); -}; -like($@, qr/Usage: Net::ZooKeeper::exists\(zkh, path, \.\.\.\)/, - 'exists(): no path specified'); - -eval { - $zkh->exists($node_path, 'bar'); -}; -like($@, qr/invalid number of arguments/, - 'exists(): invalid number of arguments'); - -eval { - $zkh->exists($node_path, 'watch', 'bar'); -}; -like($@, qr/watch is not a hash reference of type Net::ZooKeeper::Watch/, - 'exists(): invalid watch hash reference'); - -eval { - $zkh->exists($node_path, 'watch', []); -}; -like($@, qr/watch is not a hash reference of type Net::ZooKeeper::Watch/, - 'exists(): invalid watch hash reference to array'); - -eval { - $zkh->exists($node_path, 'stat', 'bar'); -}; -like($@, qr/stat is not a hash reference of type Net::ZooKeeper::Stat/, - 'exists(): invalid stat hash reference'); - -eval { - $zkh->exists($node_path, 'stat', []); -}; -like($@, qr/stat is not a hash reference of type Net::ZooKeeper::Stat/, - 'exists(): invalid stat hash reference'); - -eval { - $bad_zkh->exists($node_path); -}; -like($@, qr/invalid handle/, - 'exists(): invalid handle'); - -eval { - Net::ZooKeeper::exists(1, $node_path); -}; -like($@, qr/zkh is not a hash reference of type Net::ZooKeeper/, - 'exists(): invalid hash reference'); - - -## get_children() - -eval { - $zkh->get_children(); -}; -like($@, qr/Usage: Net::ZooKeeper::get_children\(zkh, path, \.\.\.\)/, - 'get_children(): no path specified'); - -eval { - $zkh->get_children($node_path, 'bar'); -}; -like($@, qr/invalid number of arguments/, - 'get_children(): invalid number of arguments'); - -eval { - $zkh->get_children($node_path, 'watch', 'bar'); -}; -like($@, qr/watch is not a hash reference of type Net::ZooKeeper::Watch/, - 'get_children(): invalid watch hash reference'); - -eval { - $zkh->get_children($node_path, 'watch', []); -}; -like($@, qr/watch is not a hash reference of type Net::ZooKeeper::Watch/, - 'get_children(): invalid watch ash reference to array'); - -eval { - $bad_zkh->get_children($node_path); -}; -like($@, qr/invalid handle/, - 'get_children(): invalid handle'); - -eval { - Net::ZooKeeper::get_children(1, $node_path); -}; -like($@, qr/zkh is not a hash reference of type Net::ZooKeeper/, - 'get_children(): invalid hash reference'); - - -## get() - -eval { - $zkh->get(); -}; -like($@, qr/Usage: Net::ZooKeeper::get\(zkh, path, \.\.\.\)/, - 'get(): no path specified'); - -eval { - $zkh->get($node_path, 'bar'); -}; -like($@, qr/invalid number of arguments/, - 'get(): invalid number of arguments'); - -eval { - $zkh->get($node_path, 'data_read_len' => -3); -}; -like($@, qr/invalid data read length/, - 'get(): invalid data read length'); - -eval { - $zkh->get($node_path, 'data_read_len' => 10, 'watch', 'bar'); -}; -like($@, qr/watch is not a hash reference of type Net::ZooKeeper::Watch/, - 'get(): invalid watch hash reference'); - -eval { - $zkh->get($node_path, 'watch', []); -}; -like($@, qr/watch is not a hash reference of type Net::ZooKeeper::Watch/, - 'get(): invalid watch hash reference to array'); - -eval { - $zkh->get($node_path, 'stat', 'bar'); -}; -like($@, qr/stat is not a hash reference of type Net::ZooKeeper::Stat/, - 'get(): invalid stat hash reference'); - -eval { - $zkh->get($node_path, 'stat', []); -}; -like($@, qr/stat is not a hash reference of type Net::ZooKeeper::Stat/, - 'get(): invalid stat hash reference'); - -eval { - $bad_zkh->get($node_path); -}; -like($@, qr/invalid handle/, - 'get(): invalid handle'); - -eval { - Net::ZooKeeper::get(1, $node_path); -}; -like($@, qr/zkh is not a hash reference of type Net::ZooKeeper/, - 'get(): invalid hash reference'); - - -## set() - -eval { - $zkh->set(); -}; -like($@, qr/Usage: Net::ZooKeeper::set\(zkh, path, buf, \.\.\.\)/, - 'set(): no path specified'); - -eval { - $zkh->set($node_path); -}; -like($@, qr/Usage: Net::ZooKeeper::set\(zkh, path, buf, \.\.\.\)/, - 'set(): no data buffer specified'); - -eval { - $zkh->set($node_path, 'foo', 'bar'); -}; -like($@, qr/invalid number of arguments/, - 'set(): invalid number of arguments'); - -eval { - $zkh->set($node_path, 'foo', 'version' => -3); -}; -like($@, qr/invalid version requirement/, - 'set(): invalid version requirement'); - -eval { - $zkh->set($node_path, 'foo', 'version', 0, 'stat', 'bar'); -}; -like($@, qr/stat is not a hash reference of type Net::ZooKeeper::Stat/, - 'set(): invalid stat hash reference'); - -eval { - $zkh->set($node_path, 'foo', 'stat', []); -}; -like($@, qr/stat is not a hash reference of type Net::ZooKeeper::Stat/, - 'set(): invalid stat hash reference'); - -eval { - $bad_zkh->set($node_path, 'foo'); -}; -like($@, qr/invalid handle/, - 'set(): invalid handle'); - -eval { - Net::ZooKeeper::set(1, $node_path, 'foo'); -}; -like($@, qr/zkh is not a hash reference of type Net::ZooKeeper/, - 'set(): invalid hash reference'); - - -## get_acl() - -eval { - $zkh->get_acl(); -}; -like($@, qr/Usage: Net::ZooKeeper::get_acl\(zkh, path, \.\.\.\)/, - 'get_acl(): no path specified'); - -eval { - $zkh->get_acl($node_path, 'bar'); -}; -like($@, qr/invalid number of arguments/, - 'get_acl(): invalid number of arguments'); - -eval { - $zkh->get_acl($node_path, 'stat', 'bar'); -}; -like($@, qr/stat is not a hash reference of type Net::ZooKeeper::Stat/, - 'get_acl(): invalid stat hash reference'); - -eval { - $zkh->get_acl($node_path, 'stat', []); -}; -like($@, qr/stat is not a hash reference of type Net::ZooKeeper::Stat/, - 'get_acl(): invalid stat hash reference'); - -eval { - $bad_zkh->get_acl($node_path); -}; -like($@, qr/invalid handle/, - 'get_acl(): invalid handle'); - -eval { - Net::ZooKeeper::get_acl(1, $node_path); -}; -like($@, qr/zkh is not a hash reference of type Net::ZooKeeper/, - 'get_acl(): invalid hash reference'); - - -## set_acl() - -eval { - $zkh->set_acl(); -}; -like($@, qr/Usage: Net::ZooKeeper::set_acl\(zkh, path, acl_arr, \.\.\.\)/, - 'set_acl(): no path specified'); - -eval { - $zkh->set_acl($node_path); -}; -like($@, qr/Usage: Net::ZooKeeper::set_acl\(zkh, path, acl_arr, \.\.\.\)/, - 'set_acl(): no data buffer specified'); - -eval { - $zkh->set_acl($node_path, 'foo'); -}; -like($@, qr/acl_arr is not an array reference/, - 'set_acl(): invalid ACL array reference'); - -eval { - $zkh->set_acl($node_path, {}); -}; -like($@, qr/acl_arr is not an array reference/, - 'set_acl(): invalid ACL array reference to hash'); - -eval { - my @acl = ('foo', 'bar'); - $zkh->set_acl($node_path, \@acl); -}; -like($@, qr/invalid ACL entry hash reference/, - 'set_acl(): invalid ACL entry hash reference'); - -eval { - my @acl = ({ 'foo' => 'bar' }); - $zkh->set_acl($node_path, \@acl); -}; -like($@, qr/no ACL entry perms element/, - 'set_acl(): no ACL entry perms element'); - -eval { - my @acl = ( - { - 'perms' => -1 - } - ); - $zkh->set_acl($node_path, \@acl); -}; -like($@, qr/invalid ACL entry perms/, - 'set_acl(): invalid ACL entry perms'); - -eval { - my @acl = ( - { - 'perms' => ZOO_PERM_ALL - } - ); - $zkh->set_acl($node_path, \@acl); -}; -like($@, qr/no ACL entry scheme element/, - 'set_acl(): no ACL entry scheme element'); - -eval { - my @acl = ( - { - 'perms' => ZOO_PERM_ALL, - 'scheme' => 'foo' - } - ); - $zkh->set_acl($node_path, \@acl); -}; -like($@, qr/no ACL entry id element/, - 'set_acl(): no ACL entry id element'); - -eval { - my @acl = ( - { - 'perms' => ZOO_PERM_ALL, - 'scheme' => 'foo', - 'id' => 'bar' - }, - 'bar' - ); - $zkh->set_acl($node_path, \@acl); -}; -like($@, qr/invalid ACL entry hash reference/, - 'set_acl(): invalid second ACL entry hash reference'); - -eval { - $zkh->set_acl($node_path, [], 'bar'); -}; -like($@, qr/invalid number of arguments/, - 'set_acl(): invalid number of arguments'); - -eval { - $zkh->set_acl($node_path, [], 'version' => -3); -}; -like($@, qr/invalid version requirement/, - 'set_acl(): invalid version requirement'); - -eval { - $bad_zkh->set_acl($node_path, []); -}; -like($@, qr/invalid handle/, - 'set_acl(): invalid handle'); - -eval { - Net::ZooKeeper::set_acl(1, $node_path, []); -}; -like($@, qr/zkh is not a hash reference of type Net::ZooKeeper/, - 'set_acl(): invalid hash reference'); - - -## stat() - -eval { - $zkh->stat('bar'); -}; -like($@, qr/Usage: Net::ZooKeeper::stat\(zkh\)/, - 'stat(): too many arguments'); - -eval { - $bad_zkh->stat(); -}; -like($@, qr/invalid handle/, - 'stat(): invalid handle'); - -eval { - Net::ZooKeeper::stat(1); -}; -like($@, qr/zkh is not a hash reference of type Net::ZooKeeper/, - 'stat(): invalid hash reference'); - -my $stat = $zkh->stat(); -isa_ok($stat, 'Net::ZooKeeper::Stat', - 'stat(): created stat handle'); - - -## stat DESTROY() - -eval { - $stat->DESTROY('foo'); -}; -like($@, qr/Usage: Net::ZooKeeper::Stat::DESTROY\(zksh\)/, - 'stat DESTROY(): too many arguments'); - -my $bad_stat = {}; -$bad_stat = bless($bad_stat, 'Net::ZooKeeper::Stat'); - -$ret = $bad_stat->DESTROY(); -ok(!$ret, - 'stat DESTROY(): no action on invalid handle'); - - -## watch() - -eval { - $zkh->watch('bar'); -}; -like($@, qr/invalid number of arguments/, - 'watch(): invalid number of arguments'); - -eval { - $bad_zkh->watch(); -}; -like($@, qr/invalid handle/, - 'watch(): invalid handle'); - -eval { - Net::ZooKeeper::watch(1); -}; -like($@, qr/zkh is not a hash reference of type Net::ZooKeeper/, - 'watch(): invalid hash reference'); - -my $watch = $zkh->watch(); -isa_ok($watch, 'Net::ZooKeeper::Watch', - 'watch(): created watch handle'); - - -## watch DESTROY() - -eval { - $watch->DESTROY('foo'); -}; -like($@, qr/Usage: Net::ZooKeeper::Watch::DESTROY\(zkwh\)/, - 'watch DESTROY(): too many arguments'); - -my $bad_watch = {}; -$bad_watch = bless($bad_watch, 'Net::ZooKeeper::Watch'); - -$ret = $bad_watch->DESTROY(); -ok(!$ret, - 'watch DESTROY(): no action on invalid handle'); - - -## wait() - -eval { - $watch->wait('bar'); -}; -like($@, qr/invalid number of arguments/, - 'wait(): invalid number of arguments'); - -eval { - $bad_watch->wait(); -}; -like($@, qr/invalid handle/, - 'wait(): invalid watch handle'); - -eval { - Net::ZooKeeper::Watch::wait(1); -}; -like($@, qr/zkwh is not a hash reference of type Net::ZooKeeper::Watch/, - 'wait(): invalid watch hash reference'); - - -## set_log_level() - -eval { - my $f = \&Net::ZooKeeper::set_log_level; - &$f(); -}; -like($@, qr/Usage: Net::ZooKeeper::set_log_level\(level\)/, - 'set_log_level(): no level specified'); - -eval { - my $f = \&Net::ZooKeeper::set_log_level; - &$f(ZOO_LOG_LEVEL_OFF, 'foo'); -}; -like($@, qr/Usage: Net::ZooKeeper::set_log_level\(level\)/, - 'set_log_level(): too many arguments'); - -eval { - Net::ZooKeeper::set_log_level((ZOO_LOG_LEVEL_OFF) - 1); -}; -like($@, qr/invalid log level/, - 'set_log_level(): invalid low log level'); - -eval { - Net::ZooKeeper::set_log_level((ZOO_LOG_LEVEL_DEBUG) + 1); -}; -like($@, qr/invalid log level/, - 'set_log_level(): invalid high log level'); - - -## set_deterministic_conn_order() - -eval { - my $f = \&Net::ZooKeeper::set_deterministic_conn_order; - &$f(); -}; -like($@, qr/Usage: Net::ZooKeeper::set_deterministic_conn_order\(flag\)/, - 'set_deterministic_conn_order(): no flag specified'); - -eval { - my $f = \&Net::ZooKeeper::set_deterministic_conn_order; - &$f(1, 'foo'); -}; -like($@, qr/Usage: Net::ZooKeeper::set_deterministic_conn_order\(flag\)/, - 'set_deterministic_conn_order(): too many arguments'); - diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/zkperl/t/15_thread.t b/pkg/registry/zookeeper-3.4.6/src/contrib/zkperl/t/15_thread.t deleted file mode 100644 index 1ef56d0c7..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/contrib/zkperl/t/15_thread.t +++ /dev/null @@ -1,121 +0,0 @@ -# Net::ZooKeeper - Perl extension for Apache ZooKeeper -# -# Licensed to the Apache Software Foundation (ASF) under one -# or more contributor license agreements. See the NOTICE file -# distributed with this work for additional information -# regarding copyright ownership. The ASF licenses this file -# to you 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. - -use Config; -use File::Spec; -use Test::More; - -BEGIN { - if ($Config{'useithreads'}) { - plan tests => 10; - } - else { - plan skip_all => 'no thread support'; - } -} - -use threads; - -BEGIN { use_ok('Net::ZooKeeper', qw(:all)) }; - - -my $test_dir; -(undef, $test_dir, undef) = File::Spec->splitpath($0); -require File::Spec->catfile($test_dir, 'util.pl'); - -my($hosts, $root_path, $node_path) = zk_test_setup(0); - - -my $zkh = Net::ZooKeeper->new($hosts); - -SKIP: { - skip 'no valid handle', 9 unless (defined($zkh)); - - my($thread) = threads->new(\&thread_test, $zkh); - - SKIP: { - skip 'no valid thread', 3 unless (defined($thread)); - - my(@ret) = $thread->join; - - ok((@ret == 3 and $ret[0]), - 'CLONE_SKIP(): handle reference after spawning thread'); - - ok((@ret == 3 and $ret[1]), - 'CLONE_SKIP(): scalar handle reference after spawning thread'); - - ok((@ret == 3 and $ret[2]), - 'CLONE_SKIP(): undef handle reference after spawning thread'); - } - - my $stat = $zkh->stat(); - - ($thread) = threads->new(\&thread_test, $stat); - - SKIP: { - skip 'no valid thread', 3 unless (defined($thread)); - - my(@ret) = $thread->join; - - ok((@ret == 3 and $ret[0]), - 'stat CLONE_SKIP(): stat handle reference after spawning thread'); - - ok((@ret == 3 and $ret[1]), - 'stat CLONE_SKIP(): scalar stat handle reference after ' . - 'spawning thread'); - - ok((@ret == 3 and $ret[2]), - 'stat CLONE_SKIP(): undef stat handle reference after ' . - 'spawning thread'); - } - - my $watch = $zkh->watch(); - - ($thread) = threads->new(\&thread_test, $watch); - - SKIP: { - skip 'no valid thread', 3 unless (defined($thread)); - - my(@ret) = $thread->join; - - ok((@ret == 3 and $ret[0]), - 'watch CLONE_SKIP(): watch handle reference after spawning thread'); - - ok((@ret == 3 and $ret[1]), - 'watch CLONE_SKIP(): scalar watch handle reference after ' . - 'spawning thread'); - - ok((@ret == 3 and $ret[2]), - 'watch CLONE_SKIP(): undef watch handle reference after ' . - 'spawning thread'); - } -} - -sub thread_test -{ - my $zkh = shift; - - my @ret; - - $ret[0] = ref($zkh) ? 1 : 0; - $ret[1] = ($ret[0] and ref($zkh) eq 'SCALAR') ? 1 : 0; - $ret[2] = ($ret[1] and !defined(${$zkh})) ? 1 : 0; - - return @ret; -} - diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/zkperl/t/20_tie.t b/pkg/registry/zookeeper-3.4.6/src/contrib/zkperl/t/20_tie.t deleted file mode 100644 index 37e9a4f4e..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/contrib/zkperl/t/20_tie.t +++ /dev/null @@ -1,353 +0,0 @@ -# Net::ZooKeeper - Perl extension for Apache ZooKeeper -# -# Licensed to the Apache Software Foundation (ASF) under one -# or more contributor license agreements. See the NOTICE file -# distributed with this work for additional information -# regarding copyright ownership. The ASF licenses this file -# to you 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. - -use File::Spec; -use Test::More tests => 54; - -BEGIN { use_ok('Net::ZooKeeper', qw(:all)) }; - - -my $test_dir; -(undef, $test_dir, undef) = File::Spec->splitpath($0); -require File::Spec->catfile($test_dir, 'util.pl'); - -my($hosts, $root_path, $node_path) = zk_test_setup(0); - - -SKIP: { - my $zkh = Net::ZooKeeper->new($hosts); - - skip 'no valid handle', 4 unless (defined($zkh)); - - - ## DESTROY() - - my $attr = tied(%{$zkh}); - - my $ret = $attr->DESTROY(); - ok($ret, - 'DESTROY(): destroyed inner hash'); - - $ret = $attr->DESTROY(); - ok(!$ret, - 'DESTROY(): no action on destroyed inner hash'); - - $ret = $zkh->DESTROY(); - ok(!$ret, - 'DESTROY(): no action on handle with destroyed inner hash'); - - undef $zkh; - ok(!defined($zkh), - 'undef: released handle with destroyed inner hash'); -} - -SKIP: { - my $zkh = Net::ZooKeeper->new($hosts); - - skip 'no valid handle', 49 unless (defined($zkh)); - - - ## TIEHASH(), UNTIE() - - eval { - tie(%{$zkh}, 'Net::ZooKeeper'); - }; - like($@, qr/tying hashes of class Net::ZooKeeper not supported/, - 'tie(): tying hashes not supported'); - - eval { - Net::ZooKeeper::TIEHASH('Net::ZooKeeper'); - }; - like($@, qr/tying hashes of class Net::ZooKeeper not supported/, - 'TIEHASH(): tying hashes not supported'); - - eval { - untie(%{$zkh}); - }; - like($@, qr/untying hashes of class Net::ZooKeeper not supported/, - 'untie(): untying hashes not supported'); - - my $attr = tied(%{$zkh}); - - eval { - $attr->UNTIE(0); - }; - like($@, qr/untying hashes of class Net::ZooKeeper not supported/, - 'UNTIE(): untying hashes not supported'); - - - ## FIRSTKEY(), NEXTKEY(), SCALAR() - - my $copy_zkh; - { - my %copy_zkh = %{$zkh}; - $copy_zkh = \%copy_zkh; - } - bless($copy_zkh, 'Net::ZooKeeper'); - is(ref($copy_zkh), 'Net::ZooKeeper', - 'FIRSTKEY(), NEXTKEY(): copied dereferenced handle'); - - eval { - my $val = $copy_zkh->FIRSTKEY(); - }; - like($@, qr/invalid handle/, - 'FETCHKEY(): invalid handle'); - - eval { - my $val = $copy_zkh->NEXTKEY('data_read_len'); - }; - like($@, qr/invalid handle/, - 'NEXTKEY(): invalid handle'); - - my @keys = keys(%{$zkh}); - is(scalar(@keys), 7, - 'keys(): count of keys from handle'); - - @keys = keys(%{$copy_zkh}); - is(scalar(@keys), 7, - 'keys(): count of keys from copied dereferenced handle'); - - is($attr->FIRSTKEY(), 'data_read_len', - 'FIRSTKEY(): retrieved first key using inner hash'); - - is($attr->NEXTKEY('session_id'), 'pending_watches', - 'NEXTKEY(): retrieved last key using inner hash'); - - is($attr->NEXTKEY('pending_watches'), undef, - 'NEXTKEY(): undef returned after last key using inner hash'); - - ok(scalar(%{$zkh}), - 'scalar(): true value returned for dereferenced handle'); - - ok($zkh->SCALAR(), - 'SCALAR(): true value returned'); - - - ## FETCH() - - eval { - my $val = $copy_zkh->FETCH('data_read_len'); - }; - like($@, qr/invalid handle/, - 'FETCH(): invalid handle'); - - { - my $msg; - - $SIG{'__WARN__'} = sub { $msg = $_[0]; }; - - my $val = $zkh->{'foo'}; - ok(!defined($val), - 'FETCH(): undef returned for invalid element'); - - like($msg, qr/invalid element/, - 'FETCH(): invalid element'); - } - - is($zkh->{'data_read_len'}, 1023, - 'FETCH(): default data read length'); - - is($zkh->{'path_read_len'}, 1023, - 'FETCH(): default path read length'); - - is($zkh->{'hosts'}, $hosts, - 'FETCH(): server hosts'); - - is($zkh->{'session_timeout'}, 10000, - 'FETCH(): default session timeout'); - - ok(defined($zkh->{'session_id'}), - 'FETCH(): session ID'); - - SKIP: { - my $zkh = Net::ZooKeeper->new('0.0.0.0:0'); - - skip 'no valid handle with invalid host', 1 unless (defined($zkh)); - - is($zkh->{'session_id'}, '', - 'FETCH(): empty session ID with invalid host'); - } - - is($zkh->{'pending_watches'}, 0, - 'FETCH(): default pending watch list length'); - - is($attr->FETCH('data_read_len'), 1023, - 'FETCH(): default data read length using inner hash'); - - - ## STORE() - - eval { - my $val = $copy_zkh->STORE('data_read_len', 'foo'); - }; - like($@, qr/invalid handle/, - 'STORE(): invalid handle'); - - { - my $msg; - - $SIG{'__WARN__'} = sub { $msg = $_[0]; }; - - $zkh->{'foo'} = 'foo'; - like($msg, qr/invalid element/, - 'STORE(): invalid element'); - } - - eval { - $zkh->{'data_read_len'} = -3; - }; - like($@, qr/invalid data read length/, - 'STORE(): invalid data read length'); - - eval { - $zkh->{'path_read_len'} = -3; - }; - like($@, qr/invalid path read length/, - 'STORE(): invalid path read length'); - - { - my $msg; - - $SIG{'__WARN__'} = sub { $msg = $_[0]; }; - - $zkh->{'hosts'} = 'foo'; - like($msg, qr/read-only element: hosts/, - 'STORE(): read-only server hosts element'); - } - - { - my $msg; - - $SIG{'__WARN__'} = sub { $msg = $_[0]; }; - - $zkh->{'session_timeout'} = 0; - like($msg, qr/read-only element: session_timeout/, - 'STORE(): read-only session timeout element'); - } - - { - my $msg; - - $SIG{'__WARN__'} = sub { $msg = $_[0]; }; - - $zkh->{'session_id'} = 'foo'; - like($msg, qr/read-only element: session_id/, - 'STORE(): read-only session ID element'); - } - - { - my $msg; - - $SIG{'__WARN__'} = sub { $msg = $_[0]; }; - - $zkh->{'pending_watches'} = 0; - like($msg, qr/read-only element: pending_watches/, - 'STORE(): read-only pending watch list length element'); - } - - $zkh->{'data_read_len'} = 200; - is($zkh->{'data_read_len'}, 200, - 'STORE(): updated data read length'); - - $zkh->{'path_read_len'} = 100; - is($zkh->{'path_read_len'}, 100, - 'STORE(): updated path read length'); - - $attr->STORE('data_read_len', 100); - is($zkh->{'data_read_len'}, 100, - 'STORE(): updated data read length using inner hash'); - - - ## EXISTS() - - eval { - my $val = $copy_zkh->EXISTS('data_read_len'); - }; - like($@, qr/invalid handle/, - 'EXISTS(): invalid handle'); - - ok(!exists($zkh->{'foo'}), - 'exists(): invalid element of handle'); - - ok(exists($zkh->{'data_read_len'}), - 'exists(): data read length'); - - ok(exists($zkh->{'path_read_len'}), - 'exists(): path read length'); - - ok(exists($zkh->{'hosts'}), - 'exists(): server hosts'); - - ok(exists($zkh->{'session_timeout'}), - 'exists(): session timeout'); - - ok(exists($zkh->{'session_id'}), - 'exists(): session ID'); - - ok(exists($zkh->{'pending_watches'}), - 'exists(): pending watch list length'); - - ok($attr->EXISTS('data_read_len'), - 'EXISTS(): data read length using inner hash'); - - - ## DELETE(), CLEAR() - - { - my $msg; - - $SIG{'__WARN__'} = sub { $msg = $_[0]; }; - - delete($zkh->{'data_read_len'}); - like($msg, - qr/deleting elements from hashes of class Net::ZooKeeper not supported/, - 'delete(): deleting hash elements not supported'); - } - - { - my $msg; - - $SIG{'__WARN__'} = sub { $msg = $_[0]; }; - - $zkh->DELETE({'data_read_len'}); - like($msg, - qr/deleting elements from hashes of class Net::ZooKeeper not supported/, - 'DELETE(): deleting hash elements not supported'); - } - - { - my $msg; - - $SIG{'__WARN__'} = sub { $msg = $_[0]; }; - - %{$zkh} = (); - like($msg, qr/clearing hashes of class Net::ZooKeeper not supported/, - 'assign: clearing hashes not supported'); - } - - { - my $msg; - - $SIG{'__WARN__'} = sub { $msg = $_[0]; }; - - $zkh->CLEAR(); - like($msg, qr/clearing hashes of class Net::ZooKeeper not supported/, - 'CLEAR(): clearing hashes not supported'); - } -} - diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/zkperl/t/22_stat_tie.t b/pkg/registry/zookeeper-3.4.6/src/contrib/zkperl/t/22_stat_tie.t deleted file mode 100644 index 02e79131d..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/contrib/zkperl/t/22_stat_tie.t +++ /dev/null @@ -1,438 +0,0 @@ -# Net::ZooKeeper - Perl extension for Apache ZooKeeper -# -# Licensed to the Apache Software Foundation (ASF) under one -# or more contributor license agreements. See the NOTICE file -# distributed with this work for additional information -# regarding copyright ownership. The ASF licenses this file -# to you 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. - -use File::Spec; -use Test::More tests => 66; - -BEGIN { use_ok('Net::ZooKeeper', qw(:all)) }; - - -my $test_dir; -(undef, $test_dir, undef) = File::Spec->splitpath($0); -require File::Spec->catfile($test_dir, 'util.pl'); - -my($hosts, $root_path, $node_path) = zk_test_setup(0); - - -SKIP: { - my $zkh = Net::ZooKeeper->new($hosts); - my $stat = $zkh->stat() if (defined($zkh)); - - skip 'no valid stat handle', 4 unless (defined($stat)); - - - ## DESTROY() - - my $attr = tied(%{$stat}); - - my $ret = $attr->DESTROY(); - ok($ret, - 'stat DESTROY(): destroyed inner stat hash'); - - $ret = $attr->DESTROY(); - ok(!$ret, - 'stat DESTROY(): no action on destroyed inner stat hash'); - - $ret = $stat->DESTROY(); - ok(!$ret, - 'stat DESTROY(): no action on stat handle with destroyed inner hash'); - - undef $stat; - ok(!defined($stat), - 'undef: released stat handle with destroyed inner hash'); -} - -SKIP: { - my $zkh = Net::ZooKeeper->new($hosts); - my $stat = $zkh->stat() if (defined($zkh)); - - skip 'no valid stat handle', 61 unless (defined($stat)); - - - ## TIEHASH(), UNTIE() - - eval { - tie(%{$stat}, 'Net::ZooKeeper::Stat'); - }; - like($@, qr/tying hashes of class Net::ZooKeeper::Stat not supported/, - 'tie(): tying stat hashes not supported'); - - eval { - Net::ZooKeeper::Stat::TIEHASH('Net::ZooKeeper::Stat'); - }; - like($@, qr/tying hashes of class Net::ZooKeeper::Stat not supported/, - 'stat TIEHASH(): tying stat hashes not supported'); - - eval { - untie(%{$stat}); - }; - like($@, qr/untying hashes of class Net::ZooKeeper::Stat not supported/, - 'untie(): untying stat hashes not supported'); - - my $attr = tied(%{$stat}); - - eval { - $attr->UNTIE(0); - }; - like($@, qr/untying hashes of class Net::ZooKeeper::Stat not supported/, - 'stat UNTIE(): untying stat hashes not supported'); - - - ## FIRSTKEY(), NEXTKEY(), SCALAR() - - my $copy_stat; - { - my %copy_stat = %{$stat}; - $copy_stat = \%copy_stat; - } - bless($copy_stat, 'Net::ZooKeeper::Stat'); - is(ref($copy_stat), 'Net::ZooKeeper::Stat', - 'stat FIRSTKEY(), NEXTKEY(): copied dereferenced stat handle'); - - eval { - my $val = $copy_stat->FIRSTKEY(); - }; - like($@, qr/invalid handle/, - 'stat FETCHKEY(): invalid stat handle'); - - eval { - my $val = $copy_stat->NEXTKEY('czxid'); - }; - like($@, qr/invalid handle/, - 'stat NEXTKEY(): invalid stat handle'); - - my @keys = keys(%{$stat}); - is(scalar(@keys), 11, - 'keys(): count of keys from stat handle'); - - @keys = keys(%{$copy_stat}); - is(scalar(@keys), 11, - 'keys(): count of keys from copied dereferenced stat handle'); - - is($attr->FIRSTKEY(), 'czxid', - 'stat FIRSTKEY(): retrieved first key using inner stat hash'); - - is($attr->NEXTKEY('num_children'), 'children_zxid', - 'stat NEXTKEY(): retrieved last key using inner stat hash'); - - is($attr->NEXTKEY('children_zxid'), undef, - 'NEXTKEY(): undef returned after last key using inner stat hash'); - - ok(scalar(%{$stat}), - 'scalar(): true value returned for dereferenced stat handle'); - - ok($stat->SCALAR(), - 'stat SCALAR(): true value returned'); - - - ## FETCH() - - eval { - my $val = $copy_stat->FETCH('version'); - }; - like($@, qr/invalid handle/, - 'stat FETCH(): invalid stat handle'); - - { - my $msg; - - $SIG{'__WARN__'} = sub { $msg = $_[0]; }; - - my $val = $stat->{'foo'}; - ok(!defined($val), - 'stat FETCH(): undef returned for invalid element'); - - like($msg, qr/invalid element/, - 'stat FETCH(): invalid element'); - } - - is($stat->{'czxid'}, 0, - 'stat FETCH(): default node creation ZooKeeper transaction ID'); - - is($stat->{'mzxid'}, 0, - 'stat FETCH(): default data last-modified ZooKeeper transaction ID'); - - is($stat->{'ctime'}, 0, - 'stat FETCH(): default node creation time'); - - is($stat->{'mtime'}, 0, - 'stat FETCH(): default data last-modified time'); - - is($stat->{'version'}, 0, - 'stat FETCH(): default data version'); - - is($stat->{'children_version'}, 0, - 'stat FETCH(): default child node list version'); - - is($stat->{'acl_version'}, 0, - 'stat FETCH(): default ACL version'); - - is($stat->{'ephemeral_owner'}, 0, - 'stat FETCH(): ephemeral node owner session ID'); - - is($stat->{'data_len'}, 0, - 'stat FETCH(): default data length'); - - is($stat->{'num_children'}, 0, - 'stat FETCH(): default child node list length'); - - is($stat->{'children_zxid'}, 0, - 'stat FETCH(): default child node list last-modified ' . - 'ZooKeeper transaction ID'); - - is($attr->FETCH('version'), 0, - 'stat FETCH(): default data version using inner stat hash'); - - - ## STORE() - - eval { - my $val = $copy_stat->STORE('version', 'foo'); - }; - like($@, qr/invalid handle/, - 'stat STORE(): invalid stat handle'); - - { - my $msg; - - $SIG{'__WARN__'} = sub { $msg = $_[0]; }; - - $stat->{'foo'} = 'foo'; - like($msg, qr/invalid element/, - 'stat STORE(): invalid element'); - } - - { - my $msg; - - $SIG{'__WARN__'} = sub { $msg = $_[0]; }; - - $stat->{'czxid'} = 'foo'; - like($msg, qr/read-only element: czxid/, - 'stat STORE(): read-only node creation ' . - 'ZooKeeper transaction ID element'); - } - - { - my $msg; - - $SIG{'__WARN__'} = sub { $msg = $_[0]; }; - - $stat->{'mzxid'} = 'foo'; - like($msg, qr/read-only element: mzxid/, - 'stat STORE(): read-only data last-modified ' . - 'ZooKeeper transaction ID element'); - } - - { - my $msg; - - $SIG{'__WARN__'} = sub { $msg = $_[0]; }; - - $stat->{'ctime'} = 'foo'; - like($msg, qr/read-only element: ctime/, - 'stat STORE(): read-only node creation time element'); - } - - { - my $msg; - - $SIG{'__WARN__'} = sub { $msg = $_[0]; }; - - $stat->{'mtime'} = 'foo'; - like($msg, qr/read-only element: mtime/, - 'stat STORE(): read-only data last-modified time element'); - } - - { - my $msg; - - $SIG{'__WARN__'} = sub { $msg = $_[0]; }; - - $stat->{'version'} = 'foo'; - like($msg, qr/read-only element: version/, - 'stat STORE(): read-only data version element'); - } - - { - my $msg; - - $SIG{'__WARN__'} = sub { $msg = $_[0]; }; - - $stat->{'children_version'} = 'foo'; - like($msg, qr/read-only element: children_version/, - 'stat STORE(): read-only child node list version element'); - } - - { - my $msg; - - $SIG{'__WARN__'} = sub { $msg = $_[0]; }; - - $stat->{'acl_version'} = 'foo'; - like($msg, qr/read-only element: acl_version/, - 'stat STORE(): read-only ACL version element'); - } - - { - my $msg; - - $SIG{'__WARN__'} = sub { $msg = $_[0]; }; - - $stat->{'ephemeral_owner'} = 'foo'; - like($msg, qr/read-only element: ephemeral_owner/, - 'stat STORE(): read-only ephemeral node owner ' . - 'session ID element'); - } - - { - my $msg; - - $SIG{'__WARN__'} = sub { $msg = $_[0]; }; - - $stat->{'data_len'} = 'foo'; - like($msg, qr/read-only element: data_len/, - 'stat STORE(): read-only data length element'); - } - - { - my $msg; - - $SIG{'__WARN__'} = sub { $msg = $_[0]; }; - - $stat->{'num_children'} = 'foo'; - like($msg, qr/read-only element: num_children/, - 'stat STORE(): read-only child node list length element'); - } - - { - my $msg; - - $SIG{'__WARN__'} = sub { $msg = $_[0]; }; - - $stat->{'children_zxid'} = 'foo'; - like($msg, qr/read-only element: children_zxid/, - 'stat STORE(): read-only child node list last-modified ' . - 'ZooKeeper transaction ID element'); - } - - { - my $msg; - - $SIG{'__WARN__'} = sub { $msg = $_[0]; }; - - $attr->STORE('version', 'foo'); - like($msg, qr/read-only element: version/, - 'stat STORE(): read-only data version element using ' . - 'inner stat hash'); - } - - - ## EXISTS() - - eval { - my $val = $copy_stat->EXISTS('version'); - }; - like($@, qr/invalid handle/, - 'stat EXISTS(): invalid stat handle'); - - ok(!exists($stat->{'foo'}), - 'exists(): invalid element of stat handle'); - - ok(exists($stat->{'czxid'}), - 'exists(): node creation ZooKeeper transaction ID'); - - ok(exists($stat->{'mzxid'}), - 'exists(): data last-modified ZooKeeper transaction ID'); - - ok(exists($stat->{'ctime'}), - 'exists(): node creation time'); - - ok(exists($stat->{'mtime'}), - 'exists(): data last-modified time'); - - ok(exists($stat->{'version'}), - 'exists(): data version'); - - ok(exists($stat->{'children_version'}), - 'exists(): child node list version'); - - ok(exists($stat->{'acl_version'}), - 'exists(): ACL version'); - - ok(exists($stat->{'ephemeral_owner'}), - 'exists(): ephemeral node owner session ID'); - - ok(exists($stat->{'data_len'}), - 'exists(): data length'); - - ok(exists($stat->{'num_children'}), - 'exists(): child node list length'); - - ok(exists($stat->{'children_zxid'}), - 'exists(): child node list last-modified ZooKeeper transaction ID'); - - ok($attr->EXISTS('version'), - 'stat EXISTS(): data version using inner stat hash'); - - - ## DELETE(), CLEAR() - - { - my $msg; - - $SIG{'__WARN__'} = sub { $msg = $_[0]; }; - - delete($stat->{'version'}); - like($msg, - qr/deleting elements from hashes of class Net::ZooKeeper::Stat not supported/, - 'delete(): deleting stat hash elements not supported'); - } - - { - my $msg; - - $SIG{'__WARN__'} = sub { $msg = $_[0]; }; - - $stat->DELETE({'version'}); - like($msg, - qr/deleting elements from hashes of class Net::ZooKeeper::Stat not supported/, - 'stat DELETE(): deleting stat hash elements not supported'); - } - - { - my $msg; - - $SIG{'__WARN__'} = sub { $msg = $_[0]; }; - - %{$stat} = (); - like($msg, qr/clearing hashes of class Net::ZooKeeper::Stat not supported/, - 'assign: clearing stat hashes not supported'); - } - - { - my $msg; - - $SIG{'__WARN__'} = sub { $msg = $_[0]; }; - - $stat->CLEAR(); - like($msg, qr/clearing hashes of class Net::ZooKeeper::Stat not supported/, - 'stat CLEAR(): clearing stat hashes not supported'); - } -} - diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/zkperl/t/24_watch_tie.t b/pkg/registry/zookeeper-3.4.6/src/contrib/zkperl/t/24_watch_tie.t deleted file mode 100644 index e77879e62..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/contrib/zkperl/t/24_watch_tie.t +++ /dev/null @@ -1,292 +0,0 @@ -# Net::ZooKeeper - Perl extension for Apache ZooKeeper -# -# Licensed to the Apache Software Foundation (ASF) under one -# or more contributor license agreements. See the NOTICE file -# distributed with this work for additional information -# regarding copyright ownership. The ASF licenses this file -# to you 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. - -use File::Spec; -use Test::More tests => 42; - -BEGIN { use_ok('Net::ZooKeeper', qw(:all)) }; - - -my $test_dir; -(undef, $test_dir, undef) = File::Spec->splitpath($0); -require File::Spec->catfile($test_dir, 'util.pl'); - -my($hosts, $root_path, $node_path) = zk_test_setup(0); - - -SKIP: { - my $zkh = Net::ZooKeeper->new($hosts); - my $watch = $zkh->watch() if (defined($zkh)); - - skip 'no valid watch handle', 4 unless (defined($watch)); - - - ## DESTROY() - - my $attr = tied(%{$watch}); - - my $ret = $attr->DESTROY(); - ok($ret, - 'watch DESTROY(): destroyed inner watch hash'); - - $ret = $attr->DESTROY(); - ok(!$ret, - 'watch DESTROY(): no action on destroyed inner watch hash'); - - $ret = $watch->DESTROY(); - ok(!$ret, - 'watch DESTROY(): no action on watch handle with destroyed inner hash'); - - undef $watch; - ok(!defined($watch), - 'undef: released watch handle with destroyed inner hash'); -} - -SKIP: { - my $zkh = Net::ZooKeeper->new($hosts); - my $watch = $zkh->watch() if (defined($zkh)); - - skip 'no valid watch handle', 37 unless (defined($watch)); - - - ## TIEHASH(), UNTIE() - - eval { - tie(%{$watch}, 'Net::ZooKeeper::Watch'); - }; - like($@, qr/tying hashes of class Net::ZooKeeper::Watch not supported/, - 'tie(): tying watch hashes not supported'); - - eval { - Net::ZooKeeper::Watch::TIEHASH('Net::ZooKeeper::Watch'); - }; - like($@, qr/tying hashes of class Net::ZooKeeper::Watch not supported/, - 'watch TIEHASH(): tying watch hashes not supported'); - - eval { - untie(%{$watch}); - }; - like($@, qr/untying hashes of class Net::ZooKeeper::Watch not supported/, - 'untie(): untying watch hashes not supported'); - - my $attr = tied(%{$watch}); - - eval { - $attr->UNTIE(0); - }; - like($@, qr/untying hashes of class Net::ZooKeeper::Watch not supported/, - 'watch UNTIE(): untying watch hashes not supported'); - - - ## FIRSTKEY(), NEXTKEY(), SCALAR() - - my $copy_watch; - { - my %copy_watch = %{$watch}; - $copy_watch = \%copy_watch; - } - bless($copy_watch, 'Net::ZooKeeper::Watch'); - is(ref($copy_watch), 'Net::ZooKeeper::Watch', - 'watch FIRSTKEY(), NEXTKEY(): copied dereferenced watch handle'); - - eval { - my $val = $copy_watch->FIRSTKEY(); - }; - like($@, qr/invalid handle/, - 'watch FETCHKEY(): invalid watch handle'); - - eval { - my $val = $copy_watch->NEXTKEY('czxid'); - }; - like($@, qr/invalid handle/, - 'watch NEXTKEY(): invalid watch handle'); - - my @keys = keys(%{$watch}); - is(scalar(@keys), 3, - 'keys(): count of keys from watch handle'); - - @keys = keys(%{$copy_watch}); - is(scalar(@keys), 3, - 'keys(): count of keys from copied dereferenced watch handle'); - - is($attr->FIRSTKEY(), 'timeout', - 'watch FIRSTKEY(): retrieved first key using inner watch hash'); - - is($attr->NEXTKEY('event'), 'state', - 'watch NEXTKEY(): retrieved last key using inner watch hash'); - - is($attr->NEXTKEY('state'), undef, - 'NEXTKEY(): undef returned after last key using inner watch hash'); - - ok(scalar(%{$watch}), - 'scalar(): true value returned for dereferenced watch handle'); - - ok($watch->SCALAR(), - 'watch SCALAR(): true value returned'); - - - ## FETCH() - - eval { - my $val = $copy_watch->FETCH('version'); - }; - like($@, qr/invalid handle/, - 'watch FETCH(): invalid watch handle'); - - { - my $msg; - - $SIG{'__WARN__'} = sub { $msg = $_[0]; }; - - my $val = $watch->{'foo'}; - ok(!defined($val), - 'watch FETCH(): undef returned for invalid element'); - - like($msg, qr/invalid element/, - 'watch FETCH(): invalid element'); - } - - is($watch->{'timeout'}, 60000, - 'watch FETCH(): default timeout'); - - is($watch->{'event'}, 0, - 'watch FETCH(): default event'); - - is($watch->{'state'}, 0, - 'watch FETCH(): default state'); - - is($attr->FETCH('timeout'), 60000, - 'watch FETCH(): default timeout using inner watch hash'); - - - ## STORE() - - eval { - my $val = $copy_watch->STORE('version', 'foo'); - }; - like($@, qr/invalid handle/, - 'watch STORE(): invalid watch handle'); - - { - my $msg; - - $SIG{'__WARN__'} = sub { $msg = $_[0]; }; - - $watch->{'foo'} = 'foo'; - like($msg, qr/invalid element/, - 'watch STORE(): invalid element'); - } - - { - my $msg; - - $SIG{'__WARN__'} = sub { $msg = $_[0]; }; - - $watch->{'event'} = 'foo'; - like($msg, qr/read-only element: event/, - 'watch STORE(): read-only event element'); - } - - { - my $msg; - - $SIG{'__WARN__'} = sub { $msg = $_[0]; }; - - $watch->{'state'} = 'foo'; - like($msg, qr/read-only element: state/, - 'watch STORE(): read-only state element'); - } - - $watch->{'timeout'} = 100; - is($watch->{'timeout'}, 100, - 'watch STORE(): updated timeout'); - - $attr->STORE('timeout', 200); - is($watch->{'timeout'}, 200, - 'watch STORE(): updated timeout using inner hash'); - - - ## EXISTS() - - eval { - my $val = $copy_watch->EXISTS('version'); - }; - like($@, qr/invalid handle/, - 'watch EXISTS(): invalid watch handle'); - - ok(!exists($watch->{'foo'}), - 'exists(): invalid element of watch handle'); - - ok(exists($watch->{'timeout'}), - 'exists(): timeout'); - - ok(exists($watch->{'event'}), - 'exists(): event'); - - ok(exists($watch->{'state'}), - 'exists(): state'); - - ok($attr->EXISTS('timeout'), - 'watch EXISTS(): timeout using inner watch hash'); - - - ## DELETE(), CLEAR() - - { - my $msg; - - $SIG{'__WARN__'} = sub { $msg = $_[0]; }; - - delete($watch->{'version'}); - like($msg, - qr/deleting elements from hashes of class Net::ZooKeeper::Watch not supported/, - 'delete(): deleting watch hash elements not supported'); - } - - { - my $msg; - - $SIG{'__WARN__'} = sub { $msg = $_[0]; }; - - $watch->DELETE({'version'}); - like($msg, - qr/deleting elements from hashes of class Net::ZooKeeper::Watch not supported/, - 'watch DELETE(): deleting watch hash elements not supported'); - } - - { - my $msg; - - $SIG{'__WARN__'} = sub { $msg = $_[0]; }; - - %{$watch} = (); - like($msg, qr/clearing hashes of class Net::ZooKeeper::Watch not supported/, - 'assign: clearing watch hashes not supported'); - } - - { - my $msg; - - $SIG{'__WARN__'} = sub { $msg = $_[0]; }; - - $watch->CLEAR(); - like($msg, qr/clearing hashes of class Net::ZooKeeper::Watch not supported/, - 'watch CLEAR(): clearing watch hashes not supported'); - } -} - diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/zkperl/t/30_connect.t b/pkg/registry/zookeeper-3.4.6/src/contrib/zkperl/t/30_connect.t deleted file mode 100644 index c2b68bb4e..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/contrib/zkperl/t/30_connect.t +++ /dev/null @@ -1,202 +0,0 @@ -# Net::ZooKeeper - Perl extension for Apache ZooKeeper -# -# Licensed to the Apache Software Foundation (ASF) under one -# or more contributor license agreements. See the NOTICE file -# distributed with this work for additional information -# regarding copyright ownership. The ASF licenses this file -# to you 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. - -use File::Spec; -use Test::More tests => 29; - -BEGIN { use_ok('Net::ZooKeeper', qw(:all)) }; - - -my $test_dir; -(undef, $test_dir, undef) = File::Spec->splitpath($0); -require File::Spec->catfile($test_dir, 'util.pl'); - -my($hosts, $root_path, $node_path) = zk_test_setup(0); - - -## new(), DESTROY() - -Net::ZooKeeper::set_deterministic_conn_order(1); - -my $zkh = Net::ZooKeeper->new($hosts); -isa_ok($zkh, 'Net::ZooKeeper', - 'new(): created handle'); - -SKIP: { - skip 'no valid handle', 3 unless (defined($zkh)); - - my $ret = $zkh->DESTROY(); - ok($ret, - 'DESTROY(): destroyed handle'); - - $ret = $zkh->DESTROY(); - ok(!$ret, - 'DESTROY(): no action on destroyed handle'); - - undef $zkh; - ok(!defined($zkh), - 'undef: released handle'); -} - -Net::ZooKeeper::set_deterministic_conn_order(0); - -SKIP: { - my $zkh = Net::ZooKeeper->new($hosts); - - skip 'no valid handle', 10 unless (defined($zkh)); - - my $copy_zkh = $zkh; - isa_ok($copy_zkh, 'Net::ZooKeeper', - 'assign: copied handle'); - - my $ret = $zkh->exists($root_path); - ok(defined($ret), - 'exists(): no error from original handle'); - - undef $zkh; - ok(!defined($zkh), - 'undef: released original handle'); - - $ret = $copy_zkh->exists($root_path); - ok(defined($ret), - 'exists(): no error from first copy of handle'); - - $zkh = $copy_zkh; - isa_ok($zkh, 'Net::ZooKeeper', - 'assign: re-copied handle'); - - $ret = $copy_zkh->DESTROY(); - ok($ret, - 'DESTROY(): destroyed first copy of handle'); - - eval { - $zkh->exists($root_path); - }; - like($@, qr/invalid handle/, - 'exists(): invalid second copy of handle'); - - undef $copy_zkh; - ok(!defined($copy_zkh), - 'undef: released first copy of handle'); - - $ret = $zkh->DESTROY(); - ok(!$ret, - 'DESTROY(): no action on second copy of destroyed handle'); - - undef $zkh; - ok(!defined($zkh), - 'undef: released second copy of handle'); -} - -SKIP: { - my $zkh = Net::ZooKeeper->new($hosts); - - skip 'no valid handle', 6 unless (defined($zkh)); - - my $copy_zkh; - { - my %copy_zkh = %{$zkh}; - $copy_zkh = \%copy_zkh; - } - bless($copy_zkh, 'Net::ZooKeeper'); - isa_ok($copy_zkh, 'Net::ZooKeeper', - 'FIRSTKEY(), NEXTKEY(): copied dereferenced handle'); - - eval { - $copy_zkh->exists($root_path); - }; - like($@, qr/invalid handle/, - 'exists(): invalid copy of dereferenced handle'); - - $ret = $copy_zkh->DESTROY(); - ok(!$ret, - 'DESTROY(): no action on copy of dereferenced handle'); - - undef $copy_zkh; - ok(!defined($copy_zkh), - 'undef: released copy of dereferenced handle'); - - my $ret = $zkh->exists($root_path); - ok(defined($ret), - 'exists(): no error from original handle'); - - undef $zkh; - ok(!defined($zkh), - 'undef: released original handle'); -} - -Net::ZooKeeper::set_deterministic_conn_order(1); - -my $zkh1 = Net::ZooKeeper->new($hosts, 'session_timeout' => 0x3FFF_FFFF); -isa_ok($zkh1, 'Net::ZooKeeper', - 'new(): created handle with maximum session timeout'); - -SKIP: { - my $ret = $zkh1->exists($root_path) if (defined($zkh1)); - - skip 'no connection to ZooKeeper', 7 unless - (defined($ret) and $ret); - - - ## FETCH() of read-only attributes - - ok(($zkh1->{'session_timeout'} > 0 and - $zkh1->{'session_timeout'} <= 0x3FFF_FFFF), - 'FETCH(): session timeout reset after connection'); - - my $session_id1 = $zkh1->{'session_id'}; - ok((length($session_id1) > 0), - 'FETCH(): non-empty session ID after connection'); - - SKIP: { - skip 'no session ID after connection', 1 unless - (length($session_id1) > 0); - - my @nonzero_bytes = grep($_ != 0, unpack('c' x length($session_id1), - $session_id1)); - ok((@nonzero_bytes > 0), - 'FETCH(): non-zero session ID after connection'); - } - - ## NOTE: to test re-connections with saved session IDs we create a second - ## connection with the same ID while the first is still active; - ## this is bad practice in normal usage - - my $zkh2 = Net::ZooKeeper->new($hosts, - 'session_id' => $session_id1, - 'session_timeout' => 20000); - isa_ok($zkh2, 'Net::ZooKeeper', - 'new(): created handle with session ID and valid session timeout'); - - $ret = $zkh2->exists($root_path); - ok($ret, - 'new(): reconnection with session ID'); - - SKIP: { - skip 'no connection to ZooKeeper', 2 unless ($ret); - - is($zkh2->{'session_timeout'}, 20000, - 'FETCH(): session timeout unchanged after connection'); - - my $session_id2 = $zkh2->{'session_id'}; - ok((length($session_id2) == length($session_id1) - and $session_id2 eq $session_id1), - 'FETCH(): reconnect with session ID'); - } -} - diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/zkperl/t/35_log.t b/pkg/registry/zookeeper-3.4.6/src/contrib/zkperl/t/35_log.t deleted file mode 100644 index 92821afc1..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/contrib/zkperl/t/35_log.t +++ /dev/null @@ -1,88 +0,0 @@ -# Net::ZooKeeper - Perl extension for Apache ZooKeeper -# -# Licensed to the Apache Software Foundation (ASF) under one -# or more contributor license agreements. See the NOTICE file -# distributed with this work for additional information -# regarding copyright ownership. The ASF licenses this file -# to you 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. - -use File::Spec; -use Test::More tests => 3; - -BEGIN { use_ok('Net::ZooKeeper', qw(:all)) }; - - -my $test_dir; -(undef, $test_dir, undef) = File::Spec->splitpath($0); -require File::Spec->catfile($test_dir, 'util.pl'); - -my($hosts, $root_path, $node_path) = zk_test_setup(0); - - -my $zkh = Net::ZooKeeper->new($hosts); - -Net::ZooKeeper::set_log_level(ZOO_LOG_LEVEL_INFO); - -SKIP: { - skip 'no valid handle', 2 unless (defined($zkh)); - - SKIP: { - my $dup = 0; - - if (open(OLDERR, '>&', fileno(STDERR))) { - if (close(STDERR) and open(STDERR, '+>', undef)) { - $dup = 1; - - my $old_select = select(STDERR); - $| = 1; - select($old_select); - } - else { - open(STDERR, '>&', fileno(OLDERR)); - close(OLDERR); - } - } - - skip 'no duplicated stderr', 2 unless ($dup); - - SKIP: { - $zkh->exists($root_path); - - sleep(1); - - skip 'no seek on stderr', 1 unless (seek(STDERR, 0, 0)); - - my $log = ; - like($log, qr/ZOO_/, - 'exists(): generated log message'); - } - - SKIP: { - $zkh->DESTROY(); - - sleep(1); - - skip 'no seek on stderr', 1 unless (seek(STDERR, 0, 0)); - - my $log = ; - like($log, qr/ZOO_/, - 'DESTROY(): generated log message'); - } - - open(STDERR, '>&', fileno(OLDERR)); - close(OLDERR); - } -} - -Net::ZooKeeper::set_log_level(ZOO_LOG_LEVEL_OFF); - diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/zkperl/t/40_basic.t b/pkg/registry/zookeeper-3.4.6/src/contrib/zkperl/t/40_basic.t deleted file mode 100644 index 38a8a2138..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/contrib/zkperl/t/40_basic.t +++ /dev/null @@ -1,277 +0,0 @@ -# Net::ZooKeeper - Perl extension for Apache ZooKeeper -# -# Licensed to the Apache Software Foundation (ASF) under one -# or more contributor license agreements. See the NOTICE file -# distributed with this work for additional information -# regarding copyright ownership. The ASF licenses this file -# to you 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. - -use File::Spec; -use Test::More tests => 35; - -BEGIN { use_ok('Net::ZooKeeper', qw(:all)) }; - - -my $test_dir; -(undef, $test_dir, undef) = File::Spec->splitpath($0); -require File::Spec->catfile($test_dir, 'util.pl'); - -my($hosts, $root_path, $node_path) = zk_test_setup(0); - - -my $zkh = Net::ZooKeeper->new($hosts); -my $path; - -SKIP: { - my $ret = $zkh->exists($root_path) if (defined($zkh)); - - skip 'no connection to ZooKeeper', 1 unless - (defined($ret) and $ret); - - $path = $zkh->create($node_path, 'foo', 'acl' => ZOO_OPEN_ACL_UNSAFE); - is($path, $node_path, - 'create(): created node'); -} - -SKIP: { - skip 'no connection to ZooKeeper', 21 unless - (defined($path) and $path eq $node_path); - - - ## exists() - - my $ret = $zkh->exists($node_path); - ok($ret, - 'exists(): checked node existence'); - - $ret = $zkh->exists($node_path . '/NONE'); - ok((!$ret and $zkh->get_error() == ZNONODE and $! eq ''), - 'exists(): checked node non-existence'); - - my $stat = $zkh->stat(); - - $ret = $zkh->exists($node_path, 'stat' => $stat); - ok(($ret and $stat->{'data_len'} == 3), - 'exists(): checked node existence with stat handle'); - - - ## get() - - my $node = $zkh->get($node_path); - is($node, 'foo', - 'get(): retrieved node value'); - - $node = $zkh->get($node_path . '/NONE'); - ok((!defined($node) and $zkh->get_error() == ZNONODE and $! eq ''), - 'get(): undef returned for non-extant node'); - - $node = $zkh->get($node_path, 'data_read_len', 2); - is($node, 'fo', - 'get(): retrieved truncated node value'); - - $node = $zkh->get($node_path, 'data_read_len' => 0); - is($node, '', - 'get(): retrieved zero-length node value'); - - $node = $zkh->get($node_path, 'stat' => $stat); - ok(($node eq 'foo' and $stat->{'data_len'} == 3), - 'get(): retrieved node value with stat handle'); - - - ## set() - - $ret = $zkh->set($node_path, 'foo'); - ok($ret, - 'set(): set node value'); - - SKIP: { - my $ret = $zkh->exists($node_path, 'stat' => $stat); - - skip 'invalid node data', 2 unless - ($ret and $stat->{'version'} == 1); - - $ret = $zkh->set($node_path, 'foo', 'version' => $stat->{'version'}); - ok($ret, - 'set(): set node value with matching version'); - - $ret = $zkh->set($node_path, 'foo', 'version' => $stat->{'version'}); - ok((!$ret and $zkh->get_error() == ZBADVERSION and $! eq ''), - 'set(): node value unchanged if non-matching version'); - } - - $ret = $zkh->set($node_path, 'foobaz', 'stat' => $stat); - ok(($ret and $stat->{'data_len'} == 6), - 'set(): retrieved node value with stat handle'); - - - ## create(), delete() - - $path = $zkh->create($node_path, 'foo', 'acl' => ZOO_OPEN_ACL_UNSAFE); - ok((!defined($path) and $zkh->get_error() == ZNODEEXISTS and $! eq ''), - 'create(): undef when attempting to create extant node'); - - $ret = $zkh->delete($node_path . '/NONE'); - ok((!$ret and $zkh->get_error() == ZNONODE and $! eq ''), - 'delete(): no deletion of non-extant node'); - - $ret = $zkh->delete($node_path); - ok($ret, - 'delete(): deleted node'); - - my $path_read_len = length($node_path) - 2; - - $path = $zkh->create($node_path, 'foo', - 'path_read_len' => $path_read_len, - 'acl' => ZOO_OPEN_ACL_UNSAFE); - is($path, substr($node_path, 0, -2), - 'create(): created node with small return path buffer'); - - $path = $zkh->create("$node_path/s", 'foo', - 'flags' => ZOO_SEQUENCE, - 'acl' => ZOO_OPEN_ACL_UNSAFE); - like($path, qr/^$node_path\/s[0-9]+$/, - 'create(): created sequential node'); - - SKIP: { - my $ret = $zkh->exists($path, 'stat' => $stat); - - unless ($ret and $stat->{'version'} == 0) { - my $ret = $zkh->delete($path); - diag(sprintf('unable to delete node %s: %d, %s', - $path, $zkh->get_error(), $!)) unless ($ret); - - skip 'invalid node data', 2; - } - - $ret = $zkh->delete($path, 'version' => ($stat->{'version'} + 1)); - ok((!$ret and $zkh->get_error() == ZBADVERSION and $! eq ''), - 'delete(): node not deleted if non-matching version'); - - $ret = $zkh->delete($path, 'version' => $stat->{'version'}); - ok($ret, - 'delete(): deleted sequential node with matching version'); - } - - $path = $zkh->create("$node_path/e", 'foo', - 'flags' => ZOO_EPHEMERAL, - 'acl' => ZOO_OPEN_ACL_UNSAFE); - is($path, "$node_path/e", - 'create(): created ephemeral node'); - - $path = $zkh->create("$node_path/es", 'foo', - 'flags' => (ZOO_SEQUENCE | ZOO_EPHEMERAL), - 'acl' => ZOO_OPEN_ACL_UNSAFE); - like($path, qr/^$node_path\/es[0-9]+$/, - 'create(): created ephemeral sequential node'); - - undef $zkh; -} - -$zkh = Net::ZooKeeper->new($hosts); - -SKIP: { - my $ret = $zkh->exists($node_path) if (defined($zkh)); - - skip 'no connection to ZooKeeper', 12 unless - (defined($ret) and $ret); - - $ret = $zkh->exists("$node_path/e"); - ok((!$ret and $zkh->get_error() == ZNONODE and $! eq ''), - 'exists(): checked ephemeral node non-extant after reconnection'); - - $ret = $zkh->exists($path); - ok((!$ret and $zkh->get_error() == ZNONODE and $! eq ''), - 'exists(): checked ephemeral sequential node non-extant ' . - 'after reconnection'); - - - ## get_children() - - my @child_paths = ('abc'); - @child_paths = $zkh->get_children($node_path); - ok((@child_paths == 0 and $zkh->get_error() == ZOK), - 'get_children(): retrieved empty list of child nodes'); - - my $num_children = $zkh->get_children($node_path); - ok((defined($num_children) and $num_children == 0), - 'get_children(): retrieved zero count of child nodes'); - - @child_paths = $zkh->get_children($node_path . '/NONE'); - ok((@child_paths == 0 and $zkh->get_error() == ZNONODE and $! eq ''), - 'get_children(): empty list returned for non-extant node'); - - $num_children = $zkh->get_children($node_path . '/NONE'); - ok((!defined($num_children) and $zkh->get_error() == ZNONODE and $! eq ''), - 'get_children(): undef returned for non-extant node'); - - SKIP: { - my $path = $zkh->create("$node_path/c1", 'foo', - 'acl' => ZOO_OPEN_ACL_UNSAFE); - - skip 'no connection to ZooKeeper', 6 unless - (defined($path) and $path eq "$node_path/c1"); - - my @child_paths = ('abc'); - @child_paths = $zkh->get_children($node_path); - ok((@child_paths == 1 and $child_paths[0] eq 'c1'), - 'get_children(): retrieved list of single child node'); - - my $num_children = $zkh->get_children($node_path); - ok((defined($num_children) and $num_children == 1), - 'get_children(): retrieved count of single child node'); - - SKIP: { - my $path = $zkh->create("$node_path/c2", 'foo', - 'acl' => ZOO_OPEN_ACL_UNSAFE); - - skip 'no connection to ZooKeeper', 2 unless - (defined($path) and $path eq "$node_path/c2"); - - my @child_paths = ('abc'); - @child_paths = $zkh->get_children($node_path); - ok((@child_paths == 2 and $child_paths[0] eq 'c1' and - $child_paths[1] eq 'c2'), - 'get_children(): retrieved list of two child nodes'); - - my $num_children = $zkh->get_children($node_path); - ok((defined($num_children) and $num_children == 2), - 'get_children(): retrieved count of two child nodes'); - - my $ret = $zkh->delete("$node_path/c2"); - diag(sprintf('unable to delete node %s: %d, %s', - "$node_path/c2", $zkh->get_error(), $!)) unless - ($ret); - } - - @child_paths = ('abc'); - @child_paths = $zkh->get_children($node_path); - ok((@child_paths == 1 and $child_paths[0] eq 'c1'), - 'get_children(): retrieved list of single child node'); - - $num_children = $zkh->get_children($node_path); - ok((defined($num_children) and $num_children == 1), - 'get_children(): retrieved count of single child node'); - - my $ret = $zkh->delete("$node_path/c1"); - diag(sprintf('unable to delete node %s: %d, %s', - "$node_path/c1", $zkh->get_error(), $!)) unless ($ret); - } - - - ## cleanup - - $ret = $zkh->delete($node_path); - diag(sprintf('unable to delete node %s: %d, %s', - $node_path, $zkh->get_error(), $!)) unless ($ret); -} - diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/zkperl/t/45_class.t b/pkg/registry/zookeeper-3.4.6/src/contrib/zkperl/t/45_class.t deleted file mode 100644 index 4aa1a5733..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/contrib/zkperl/t/45_class.t +++ /dev/null @@ -1,408 +0,0 @@ -# Net::ZooKeeper - Perl extension for Apache ZooKeeper -# -# Licensed to the Apache Software Foundation (ASF) under one -# or more contributor license agreements. See the NOTICE file -# distributed with this work for additional information -# regarding copyright ownership. The ASF licenses this file -# to you 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. - -use File::Spec; -use Test::More tests => 47; - -BEGIN { use_ok('Net::ZooKeeper', qw(:all)) }; - - -my $test_dir; -(undef, $test_dir, undef) = File::Spec->splitpath($0); -require File::Spec->catfile($test_dir, 'util.pl'); - -my($hosts, $root_path, $node_path) = zk_test_setup(0); - - -SKIP: { - my $zkh = Net::ZooKeeper->new($hosts); - - skip 'no valid handle', 15 unless (defined($zkh)); - - my $stat = $zkh->stat(); - my $watch = $zkh->watch(); - - - ## DESTROY() on reblessed handle - - bless($zkh, 'My::ZooKeeper'); - is(ref($zkh), 'My::ZooKeeper', - 'bless(): reblessed handle'); - - eval { - $zkh->EXISTS(); - }; - like($@, qr/Can't locate object method "EXISTS" via package "My::ZooKeeper"/, - 'EXISTS(): not defined on reblessed handle'); - - my $attr = tied(%{$zkh}); - - my $ret = $attr->DESTROY(); - ok($ret, - 'DESTROY(): destroyed inner hash of reblessed handle'); - - $ret = $attr->DESTROY(); - ok(!$ret, - 'DESTROY(): no action on destroyed inner hash of reblessed handle'); - - undef $zkh; - ok(!defined($zkh), - 'undef: released reblessed handle'); - - - ## DESTROY() on reblessed stat handle - - bless($stat, 'My::ZooKeeper::Stat'); - is(ref($stat), 'My::ZooKeeper::Stat', - 'bless(): reblessed stat handle'); - - eval { - $stat->EXISTS(1); - }; - like($@, qr/Can't locate object method "EXISTS" via package "My::ZooKeeper::Stat"/, - 'stat EXISTS(): not defined on reblessed stat handle'); - - $attr = tied(%{$stat}); - - $ret = $attr->DESTROY(); - ok($ret, - 'stat DESTROY(): destroyed inner hash of reblessed stat handle'); - - $ret = $attr->DESTROY(); - ok(!$ret, - 'stat DESTROY(): no action on destroyed inner hash of ' . - 'reblessed stat handle'); - - undef $stat; - ok(!defined($stat), - 'undef: released reblessed stat handle'); - - - ## DESTROY() on reblessed watch handle - - bless($watch, 'My::ZooKeeper::Watch'); - is(ref($watch), 'My::ZooKeeper::Watch', - 'bless(): reblessed watch handle'); - - eval { - $watch->EXISTS(1); - }; - like($@, qr/Can't locate object method "EXISTS" via package "My::ZooKeeper::Watch"/, - 'watch EXISTS(): not defined on reblessed watch handle'); - - $attr = tied(%{$watch}); - - $ret = $attr->DESTROY(); - ok($ret, - 'watch DESTROY(): destroyed inner hash of reblessed watch handle'); - - $ret = $attr->DESTROY(); - ok(!$ret, - 'watch DESTROY(): no action on destroyed inner hash of ' . - 'reblessed watch handle'); - - undef $watch; - ok(!defined($watch), - 'undef: released reblessed watch handle'); -} - -SKIP: { - my $zkh = Net::ZooKeeper->new($hosts); - - skip 'no valid handle', 9 unless (defined($zkh)); - - my $stat = $zkh->stat(); - my $watch = $zkh->watch(); - - - ## UNTIE() on reblessed handle - - bless($zkh, 'My::ZooKeeper'); - is(ref($zkh), 'My::ZooKeeper', - 'bless(): reblessed handle'); - - eval { - untie(%{$zkh}); - }; - like($@, qr/untying hashes of class Net::ZooKeeper not supported/, - 'untie(): untying hashes from reblessed handle not supported'); - - my $attr = tied(%{$zkh}); - - eval { - $attr->UNTIE(0); - }; - like($@, qr/untying hashes of class Net::ZooKeeper not supported/, - 'UNTIE(): untying hashes from reblessed handle not supported'); - - - ## UNTIE() on reblessed stat handle - - bless($stat, 'My::ZooKeeper::Stat'); - is(ref($stat), 'My::ZooKeeper::Stat', - 'bless(): reblessed stat handle'); - - eval { - untie(%{$stat}); - }; - like($@, qr/untying hashes of class Net::ZooKeeper::Stat not supported/, - 'untie(): untying hashes from reblessed stat handle not supported'); - - $attr = tied(%{$stat}); - - eval { - $attr->UNTIE(0); - }; - like($@, qr/untying hashes of class Net::ZooKeeper::Stat not supported/, - 'stat UNTIE(): untying hashes from reblessed stat handle ' . - 'not supported'); - - - ## UNTIE() on reblessed watch handle - - bless($watch, 'My::ZooKeeper::Watch'); - is(ref($watch), 'My::ZooKeeper::Watch', - 'bless(): reblessed watch handle'); - - eval { - untie(%{$watch}); - }; - like($@, qr/untying hashes of class Net::ZooKeeper::Watch not supported/, - 'untie(): untying hashes from reblessed watch handle not supported'); - - $attr = tied(%{$watch}); - - eval { - $attr->UNTIE(0); - }; - like($@, qr/untying hashes of class Net::ZooKeeper::Watch not supported/, - 'watch UNTIE(): untying hashes from reblessed watch handle ' . - 'not supported'); -} - - -package Net::ZooKeeper::Test; - -use Net::ZooKeeper qw(:acls); - -our @ISA = qw(Net::ZooKeeper); - -sub create -{ - my($self, $path, $buf) = @_; - - return $self->SUPER::create($path, $buf, - 'path_read_len' => length($path), - 'acl' => ZOO_OPEN_ACL_UNSAFE); -} - -sub get_first_child -{ - my($self, $path) = @_; - - my @child_paths = $self->get_children($path); - - if (@child_paths > 0) { - return $path . (($path =~ /\/$/) ? '' : '/') . $child_paths[0]; - } - - return undef; -} - -sub stat -{ - my $self = shift; - - my $stat = $self->SUPER::stat(); - - return bless($stat, 'Net::ZooKeeper::Test::Stat'); -} - - -sub watch -{ - my $self = shift; - - my $watch = $self->SUPER::watch(); - - return bless($watch, 'Net::ZooKeeper::Test::Watch'); -} - - -package Net::ZooKeeper::Test::Stat; - -our @ISA = qw(Net::ZooKeeper::Stat); - -sub get_ctime -{ - my $self = shift; - - return $self->{'ctime'}; -} - - -package Net::ZooKeeper::Test::Watch; - -our @ISA = qw(Net::ZooKeeper::Watch); - -sub get_timeout -{ - my $self = shift; - - return $self->{'timeout'}; -} - - -package main; - -my $sub_zkh = Net::ZooKeeper::Test->new($hosts); -isa_ok($sub_zkh, 'Net::ZooKeeper::Test', - 'new(): created subclassed handle'); - -SKIP: { - skip 'no valid subclassed handle', 21 unless (defined($sub_zkh)); - - is($sub_zkh->{'data_read_len'}, 1023, - 'FETCH(): default data read length using subclassed handle'); - - my $path; - - SKIP: { - my $ret = $sub_zkh->exists($root_path); - - skip 'no connection to ZooKeeper', 1 unless - (defined($ret) and $ret); - - $path = $sub_zkh->create($node_path, 'foo', - 'acl' => ZOO_OPEN_ACL_UNSAFE); - is($path, $node_path, - 'create(): created node with subclassed handle'); - } - - SKIP: { - skip 'no connection to ZooKeeper', 1 unless - (defined($path) and $path eq $node_path); - - my $child_path = $sub_zkh->get_first_child($root_path); - is($child_path, $node_path, - 'get_first_child(): retrieved first child with subclassed handle'); - } - - my $sub_stat = $sub_zkh->stat(); - isa_ok($sub_stat, 'Net::ZooKeeper::Test::Stat', - 'stat(): created subclassed stat handle'); - - SKIP: { - skip 'no valid subclassed stat handle', 6 unless - (defined($sub_stat)); - - is($sub_stat->{'ctime'}, 0, - 'stat FETCH(): default ctime using subclassed stat handle'); - - SKIP: { - my $ret = $sub_zkh->exists($node_path, 'stat' => $sub_stat) if - (defined($path) and $path eq $node_path); - - skip 'no connection to ZooKeeper', 2 unless - (defined($ret) and $ret); - - my $ctime = $sub_stat->get_ctime(); - ok($ctime > 0, - 'get_ctime(): retrieved ctime with subclassed stat handle'); - - is($sub_stat->{'ctime'}, $ctime, - 'stat FETCH(): ctime using subclassed stat handle'); - } - - my $ret = $sub_stat->DESTROY(); - ok($ret, - 'stat DESTROY(): destroyed subclassed stat handle'); - - $ret = $sub_stat->DESTROY(); - ok(!$ret, - 'stat DESTROY(): no action on destroyed subclassed stat handle'); - - undef $sub_stat; - ok(!defined($sub_stat), - 'undef: released subclassed stat handle'); - } - - my $sub_watch = $sub_zkh->watch(); - isa_ok($sub_watch, 'Net::ZooKeeper::Test::Watch', - 'watch(): created subclassed watch handle'); - - SKIP: { - skip 'no valid subclassed watch handle', 6 unless - (defined($sub_watch)); - - SKIP: { - my $ret = $sub_zkh->exists($root_path, 'watch' => $sub_watch); - - skip 'no connection to ZooKeeper', 3 unless - (defined($ret) and $ret); - - $sub_watch->{'timeout'} = 50; - - is($sub_watch->get_timeout(), 50, - 'get_timeout(): retrieved timeout with subclassed ' . - 'watch handle'); - - is($sub_watch->{'timeout'}, 50, - 'watch FETCH(): timeout using subclassed stat handle'); - - $ret = $sub_watch->wait(); - ok(!$ret, - 'wait(): watch after checking node existence timed out with ' . - 'subclassed watch handle'); - } - - my $ret = $sub_watch->DESTROY(); - ok($ret, - 'watch DESTROY(): destroyed subclassed watch handle'); - - $ret = $sub_watch->DESTROY(); - ok(!$ret, - 'watch DESTROY(): no action on destroyed subclassed watch handle'); - - undef $sub_watch; - ok(!defined($sub_watch), - 'undef: released subclassed watch handle'); - } - - SKIP: { - skip 'no connection to ZooKeeper', 1 unless - (defined($path) and $path eq $node_path); - - my $ret = $sub_zkh->delete($node_path); - ok($ret, - 'delete(): deleted node with subclassed handle'); - } - - my $ret = $sub_zkh->DESTROY(); - ok($ret, - 'DESTROY(): destroyed subclassed handle'); - - $ret = $sub_zkh->DESTROY(); - ok(!$ret, - 'DESTROY(): no action on destroyed subclassed handle'); - - undef $sub_zkh; - ok(!defined($sub_zkh), - 'undef: released subclassed handle'); -} - diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/zkperl/t/50_access.t b/pkg/registry/zookeeper-3.4.6/src/contrib/zkperl/t/50_access.t deleted file mode 100644 index ef61ed668..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/contrib/zkperl/t/50_access.t +++ /dev/null @@ -1,356 +0,0 @@ -# Net::ZooKeeper - Perl extension for Apache ZooKeeper -# -# Licensed to the Apache Software Foundation (ASF) under one -# or more contributor license agreements. See the NOTICE file -# distributed with this work for additional information -# regarding copyright ownership. The ASF licenses this file -# to you 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. - -use File::Spec; -use Test::More tests => 40; - -BEGIN { use_ok('Net::ZooKeeper', qw(:all)) }; - - -my $test_dir; -(undef, $test_dir, undef) = File::Spec->splitpath($0); -require File::Spec->catfile($test_dir, 'util.pl'); - -my($hosts, $root_path, $node_path) = zk_test_setup(0); - -my($username, $password, $digest) = zk_acl_test_setup(); - - -SKIP: { - my $zkh = Net::ZooKeeper->new($hosts); - - my $path = $zkh->create($node_path, 'foo', - 'acl' => ZOO_OPEN_ACL_UNSAFE) if (defined($zkh)); - - skip 'no connection to ZooKeeper', 36 unless - (defined($path) and $path eq $node_path); - - - ## _zk_acl_constant() - - my $no_read_acl = ZOO_OPEN_ACL_UNSAFE; - ok((ref($no_read_acl) eq 'ARRAY' and - @{$no_read_acl} == 1 and - ref($no_read_acl->[0]) eq 'HASH' and - keys(%{$no_read_acl->[0]}) == 3 and - $no_read_acl->[0]->{'perms'} == ZOO_PERM_ALL), - '_zk_acl_constant(): returned default ACL'); - - my $zoo_read_acl_unsafe = ZOO_READ_ACL_UNSAFE; - ok((ref($zoo_read_acl_unsafe) eq 'ARRAY' and - @{$zoo_read_acl_unsafe} == 1 and - ref($zoo_read_acl_unsafe->[0]) eq 'HASH' and - keys(%{$zoo_read_acl_unsafe->[0]}) == 3 and - $zoo_read_acl_unsafe->[0]->{'perms'} == ZOO_PERM_READ), - '_zk_acl_constant(): returned good ACL'); - - my $zoo_creator_all_acl = ZOO_CREATOR_ALL_ACL; - ok((ref($zoo_creator_all_acl) eq 'ARRAY' and - @{$zoo_creator_all_acl} == 1 and - ref($zoo_creator_all_acl->[0]) eq 'HASH' and - keys(%{$zoo_creator_all_acl->[0]}) == 3 and - $zoo_creator_all_acl->[0]->{'perms'} == ZOO_PERM_ALL), - '_zk_acl_constant(): returned good ACL'); - - $no_read_acl->[0]->{'perms'} &= ~ZOO_PERM_READ; - is($no_read_acl->[0]->{'perms'}, ((ZOO_PERM_ALL) & ~ZOO_PERM_READ), - 'assign: altered default ACL'); - - is(ZOO_OPEN_ACL_UNSAFE->[0]->{'perms'}, ZOO_PERM_ALL, - '_zk_acl_constant(): returned unaltered default ACL'); - - my $copy_no_read_acl = $no_read_acl; - is_deeply($copy_no_read_acl, $no_read_acl, - 'assign: copied default ACL'); - - undef $no_read_acl; - ok(!defined($no_read_acl), - 'undef: released original default ACL'); - - is($copy_no_read_acl->[0]->{'perms'}, ((ZOO_PERM_ALL) & ~ZOO_PERM_READ), - 'undef: no change to copied default ACL'); - - $no_read_acl = $copy_no_read_acl; - is_deeply($no_read_acl, $copy_no_read_acl, - 'assign: re-copied default ACL'); - - - ## create() - - my $acl_node_path = "$node_path/a1"; - - $path = $zkh->create($acl_node_path, 'foo', 'acl' => $no_read_acl); - is($path, $acl_node_path, - 'create(): created node with no-read ACL'); - - my $node = $zkh->get($acl_node_path); - - my $skip_acl; - if (defined($node) and $node eq 'foo') { - $skip_acl = 1; - } - elsif(!defined($node) and $zkh->get_error() == ZNOAUTH) { - $skip_acl = 0; - } - else { - $skip_acl = -1; - diag(sprintf('unable to get node with no-read ACL %s: %d, %s', - $acl_node_path, $zkh->get_error(), $!)); - } - - my $ret = $zkh->delete($acl_node_path); - diag(sprintf('unable to delete node with no-read ACL %s: %d, %s', - $acl_node_path, $zkh->get_error(), $!)) unless ($ret); - - my $digest_acl = [ - { - 'perms' => ZOO_PERM_READ, - 'scheme' => 'world', - 'id' => 'anyone' - }, - { - 'perms' => (ZOO_PERM_WRITE | ZOO_PERM_ADMIN), - 'scheme' => 'digest', - 'id' => "$username:$digest" - } - ]; - - $path = $zkh->create($acl_node_path, 'foo', 'acl' => $digest_acl); - is($path, $acl_node_path, - 'create(): created node with digest auth ACL'); - - SKIP: { - skip 'ZooKeeper skipping ACLs', 1 unless (!$skip_acl); - - my $acl_node_path = "$node_path/a2"; - - my $path = $zkh->create($acl_node_path, 'foo', 'acl' => [ - { - 'perms' => ZOO_PERM_WRITE, - 'scheme' => 'foo', - 'id' => 'bar' - } - ]); - ok((!defined($path) and $zkh->get_error() == ZINVALIDACL and $! eq ''), - 'create(): undef when attempting to create node with invalid ACL'); - } - - - ## get_acl() - - my @acl = ('abc'); - @acl = $zkh->get_acl($node_path . '/NONE'); - ok((@acl == 0 and $zkh->get_error() == ZNONODE and $! eq ''), - 'get_acl(): empty list returned for non-extant node'); - - $num_acl_entries = $zkh->get_acl($node_path . '/NONE'); - ok((!defined($num_acl_entries) and $zkh->get_error() == ZNONODE and - $! eq ''), - 'get_acl(): undef returned for non-extant node'); - - @acl = ('abc'); - @acl = $zkh->get_acl($acl_node_path); - is_deeply(\@acl, $digest_acl, - 'get_acl(): retrieved digest ACL'); - - my $stat = $zkh->stat(); - - @acl = ('abc'); - @acl = $zkh->get_acl($node_path, 'stat' => $stat); - is_deeply(\@acl, ZOO_OPEN_ACL_UNSAFE, - 'get_acl(): retrieved ACL'); - - is($stat->{'data_len'}, 3, - 'get_acl(): retrieved ACL with stat handle'); - - SKIP: { - skip 'ZooKeeper not skipping ACLs', 3 unless ($skip_acl > 0); - - my $acl_node_path = "$node_path/a2"; - - my $path = $zkh->create($acl_node_path, 'foo', 'acl' => []); - is($path, $acl_node_path, - 'create(): created node with empty ACL'); - - my @acl = ('abc'); - @acl = $zkh->get_acl($acl_node_path); - ok((@acl == 0 and $zkh->get_error() == ZOK), - 'get_acl(): retrieved empty ACL'); - - my $num_acl_entries = $zkh->get_acl($acl_node_path); - ok((defined($num_acl_entries) and $num_acl_entries == 0), - 'get_acl(): retrieved zero count of ACL entries'); - - my $ret = $zkh->delete($acl_node_path); - diag(sprintf('unable to delete node with empty ACL %s: %d, %s', - $acl_node_path, $zkh->get_error(), $!)) unless ($ret); - } - - - ## set_acl() - - SKIP: { - skip 'ZooKeeper skipping ACLs', 2 unless (!$skip_acl); - - my $ret = $zkh->set_acl($acl_node_path, [ - { - 'perms' => ZOO_PERM_CREATE, - 'scheme' => 'foo', - 'id' => 'bar' - } - ]); - ok((!$ret and $zkh->get_error() == ZINVALIDACL and $! eq ''), - 'set_acl(): invalid ACL'); - - push @{$digest_acl}, { - 'perms' => (ZOO_PERM_CREATE | ZOO_PERM_DELETE), - 'scheme' => 'ip', - 'id' => '0.0.0.0' - }; - - $ret = $zkh->set_acl($acl_node_path, $digest_acl); - ok((!$ret and $zkh->get_error() == ZNOAUTH and $! eq ''), - 'set_acl(): ACL unchanged if no auth'); - } - - - ## add_auth(), set_acl() - - $ret = $zkh->add_auth('digest', ''); - ok($ret, - 'add_auth(): empty digest cert'); - - SKIP: { - skip 'ZooKeeper skipping ACLs', 1 unless (!$skip_acl); - - my $ret = $zkh->set($acl_node_path, 'foo'); - ok((!$ret and $zkh->get_error() == ZNOAUTH and $! eq ''), - 'set(): node value unchanged if no auth'); - } - - $ret = $zkh->add_auth('digest', "$username:$password"); - ok($ret, - 'add_auth(): valid digest cert'); - - SKIP: { - skip 'ZooKeeper skipping ACLs', 13 unless (!$skip_acl); - - my $ret = $zkh->set($acl_node_path, 'baz'); - ok($ret, - 'set(): set node value with auth'); - - my $node = $zkh->get($acl_node_path); - is($node, 'baz', - 'get(): retrieved node value with auth'); - - $ret = $zkh->set_acl($acl_node_path, $digest_acl); - ok($ret, - 'set_acl(): set digest ACL with auth'); - - my $stat = $zkh->stat(); - - my @acl = ('abc'); - @acl = $zkh->get_acl($acl_node_path, 'stat' => $stat); - is_deeply(\@acl, $digest_acl, - 'get_acl(): retrieved digest ACL with auth'); - - is($stat->{'data_len'}, 3, - 'get_acl(): retrieved digest ACL with stat handle and auth'); - - SKIP: { - skip 'invalid node data', 2 unless ($stat->{'version'} == 1); - - my $ret = $zkh->set_acl($acl_node_path, $digest_acl, - 'version' => $stat->{'version'}); - ok($ret, - 'set_acl(): set digest ACL with matching version with auth'); - - $ret = $zkh->set_acl($acl_node_path, $digest_acl, - 'version' => $stat->{'version'}); - ok((!$ret and $zkh->get_error() == ZBADVERSION and $! eq ''), - 'set_acl(): ACL unchanged if non-matching version'); - } - - my $child_node_path = "$acl_node_path/c1"; - - my $path = $zkh->create($child_node_path, 'foo', - 'acl' => ZOO_OPEN_ACL_UNSAFE); - ok((!defined($path) and $zkh->get_error() == ZNOAUTH and $! eq ''), - 'create(): undef when attempting to create node if no auth'); - - $digest_acl->[1]->{'perms'} |= ZOO_PERM_CREATE; - $digest_acl->[2]->{'perms'} &= ~ZOO_PERM_CREATE; - - $ret = $zkh->set_acl($acl_node_path, $digest_acl); - ok($ret, - 'set_acl(): set changed digest ACL with auth'); - - $path = $zkh->create($child_node_path, 'foo', - 'acl' => ZOO_OPEN_ACL_UNSAFE); - is($path, $child_node_path, - 'create(): created node with auth'); - - $ret = $zkh->delete($child_node_path); - ok((!$ret and $zkh->get_error() == ZNOAUTH and $! eq ''), - 'delete(): no deletion of node if no auth'); - - $digest_acl->[1]->{'perms'} |= ZOO_PERM_DELETE; - pop @{$digest_acl}; - - $ret = $zkh->set_acl($acl_node_path, $digest_acl); - ok($ret, - 'set_acl(): set reduced digest ACL with auth'); - - $ret = $zkh->delete($child_node_path); - ok($ret, - 'delete(): deleted node with auth'); - } - - - ## cleanup - - $ret = $zkh->delete($acl_node_path); - diag(sprintf('unable to delete node with digest auth ACL %s: %d, %s', - $acl_node_path, $zkh->get_error(), $!)) unless ($ret); - - $ret = $zkh->delete($node_path); - diag(sprintf('unable to delete node %s: %d, %s', - $node_path, $zkh->get_error(), $!)) unless ($ret); -} - -SKIP: { - my $zkh = Net::ZooKeeper->new($hosts); - - my $ret = $zkh->exists($root_path) if (defined($zkh)); - - skip 'no connection to ZooKeeper', 1 unless - (defined($ret) and $ret); - - - ## add_auth() - - $ret = $zkh->add_auth('foo', 'bar'); - my $err = $zkh->get_error(); - ok((!$ret and - ($err == ZAUTHFAILED or - $err == ZCONNECTIONLOSS or - $err == ZSESSIONEXPIRED) - and $! eq ''), - 'set_acl(): invalid scheme'); -} - diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/zkperl/t/60_watch.t b/pkg/registry/zookeeper-3.4.6/src/contrib/zkperl/t/60_watch.t deleted file mode 100644 index 7d30602d5..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/contrib/zkperl/t/60_watch.t +++ /dev/null @@ -1,304 +0,0 @@ -# Net::ZooKeeper - Perl extension for Apache ZooKeeper -# -# Licensed to the Apache Software Foundation (ASF) under one -# or more contributor license agreements. See the NOTICE file -# distributed with this work for additional information -# regarding copyright ownership. The ASF licenses this file -# to you 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. - -use File::Spec; -use Test::More tests => 30; - -BEGIN { use_ok('Net::ZooKeeper', qw(:all)) }; - - -my $test_dir; -(undef, $test_dir, undef) = File::Spec->splitpath($0); -require File::Spec->catfile($test_dir, 'util.pl'); - -my($hosts, $root_path, $node_path) = zk_test_setup(0); - - -SKIP: { - my $zkh = Net::ZooKeeper->new($hosts); - - my $path = $zkh->create($node_path, 'foo', - 'acl' => ZOO_OPEN_ACL_UNSAFE) if (defined($zkh)); - - skip 'no connection to ZooKeeper', 20 unless - (defined($path) and $path eq $node_path); - - - ## exists() - - $zkh->{'watch_timeout'} = 100; - - my $watch = $zkh->watch(); - - my $ret = $zkh->exists($node_path, 'watch' => $watch); - ok($ret, - 'exists(): checked node existence with watch handle'); - - $ret = $watch->wait(); - ok(!$ret, - 'wait(): watch after checking node existence timed out'); - - $ret = $zkh->exists($node_path, 'watch' => $watch); - ok($ret, - 'exists(): checked node existence with renewed watch handle'); - - $ret = $watch->wait(); - ok(!$ret, - 'wait(): watch after checking node existence timed out with ' . - 'renewed watch handle'); - - undef $watch; - ok(!defined($watch), - 'undef: released watch handle'); - - my $pending_watches = $zkh->{'pending_watches'}; - is($pending_watches, 2, - '_zk_release_watches(): report pending watches'); - - - ## get_children() - - $watch = $zkh->watch('timeout' => 50); - - my $num_children = $zkh->get_children($node_path, 'watch' => $watch); - ok((defined($num_children) and $num_children == 0), - 'get_children(): retrieved zero count of child nodes with ' . - 'watch handle'); - - $ret = $watch->wait(); - ok(!$ret, - 'wait(): watch after retrieving child nodes timed out with ' . - 'watch handle'); - - $watch->{'timeout'} = 100; - - my @child_paths = $zkh->get_children($node_path, 'watch' => $watch); - ok((@child_paths == 0), - 'get_children(): retrieved empty list of child nodes with ' . - 'renewed watch handle'); - - $ret = $watch->wait(); - ok(!$ret, - 'wait(): watch after retrieving child nodes timed out with ' . - 'renewed watch handle'); - - $pending_watches = $zkh->{'pending_watches'}; - is($pending_watches, 4, - '_zk_release_watches(): report pending watches'); - - - ## get() - - $watch = $zkh->watch(); - - my $node = $zkh->get($node_path, 'watch' => $watch); - is($node, 'foo', - 'get(): retrieved node value with watch handle'); - - $ret = $watch->wait('timeout' => 0); - ok(!$ret, - 'wait(): watch after retrieving node value timed out with ' . - 'watch handle'); - - $node = $zkh->get($node_path, 'watch' => $watch); - is($node, 'foo', - 'get(): retrieved node value with renewed watch handle'); - - $ret = $watch->wait(); - ok(!$ret, - 'wait(): watch after retrieving node value timed out with ' . - 'renewed watch handle'); - - $pending_watches = $zkh->{'pending_watches'}; - is($pending_watches, 6, - '_zk_release_watches(): all watches pending'); - - - ## _zk_release_watches() - - $ret = $zkh->DESTROY(); - ok($ret, - 'DESTROY(): destroyed handle with pending watches'); - - my $event = $watch->{'event'}; - is($event, 0, - '_zk_release_watches(): watch not destroyed when tied to watch handle'); - - $zkh = Net::ZooKeeper->new($hosts); - - SKIP: { - my $ret = $zkh->exists($node_path, 'watch' => $watch); - - skip 'no connection to ZooKeeper', 2 unless - (defined($ret) and $ret); - - ok($ret, - 'exists(): checked node existence with renewed watch handle ' . - 'from prior connection'); - - $ret = $watch->wait(); - ok(!$ret, - 'wait(): watch after checking node existence timed out with ' . - 'renewed watch handle from prior connection'); - - - } -} - -my $pid = fork(); - -SKIP: { - skip 'unable to fork', 4 unless (defined($pid)); - - my $zkh = Net::ZooKeeper->new($hosts); - - my $ret = $zkh->exists($node_path) if (defined($zkh)); - - if ($pid == 0) { - ## child process - - my $code = 0; - - if (defined($ret) and $ret) { - sleep(1); - - my $ret = $zkh->set($node_path, 'foo'); - - diag(sprintf('set(): failed in child process: %d, %s', - $zkh->get_error(), $!)) unless ($ret); - - $code = !$ret; - - sleep(1); - - my $path = $zkh->create("$node_path/c", 'foo', - 'acl' => ZOO_OPEN_ACL_UNSAFE); - - diag(sprintf('create(): failed in child process: %d, %s', - $zkh->get_error(), $!)) unless - (defined($path) and $path eq "$node_path/c"); - - $code &= !$ret; - - sleep(1); - - $ret = $zkh->delete("$node_path/c"); - - diag(sprintf('delete(): failed in child process: %d, %s', - $zkh->get_error(), $!)) unless ($ret); - - $code &= !$ret; - - sleep(1); - - $ret = $zkh->set($node_path, 'foo'); - - diag(sprintf('set(): failed in child process: %d, %s', - $zkh->get_error(), $!)) unless ($ret); - - $code &= !$ret; - } - - exit($code); - } - else { - ## parent process - - SKIP: { - skip 'no connection to ZooKeeper', 9 unless - (defined($ret) and $ret); - - my $watch = $zkh->watch('timeout' => 5000); - - - ## wait() - - my $ret = $zkh->exists($node_path, 'watch' => $watch); - ok($ret, - 'exists(): checked node existence with watch handle ' . - 'in parent'); - - $ret = $watch->wait(); - ok(($ret and $watch->{'event'} == ZOO_CHANGED_EVENT and - $watch->{'state'} == ZOO_CONNECTED_STATE), - 'wait(): waited for event after checking node existence'); - - my $num_children = $zkh->get_children($node_path, - 'watch' => $watch); - ok((defined($num_children) and $num_children == 0), - 'get_children(): retrieved zero count of child nodes with ' . - 'watch handle in parent'); - - $ret = $watch->wait(); - ok(($ret and $watch->{'event'} == ZOO_CHILD_EVENT and - $watch->{'state'} == ZOO_CONNECTED_STATE), - 'wait(): waited for create child event after ' . - 'retrieving child nodes'); - - my @child_paths = $zkh->get_children($node_path, - 'watch' => $watch); - ok((@child_paths == 1 and $child_paths[0] eq 'c'), - 'get_children(): retrieved list of child nodes with ' . - 'watch handle in parent'); - - $ret = $watch->wait(); - ok(($ret and $watch->{'event'} == ZOO_CHILD_EVENT and - $watch->{'state'} == ZOO_CONNECTED_STATE), - 'wait(): waited for delete child event after ' . - 'retrieving child nodes'); - - my $node = $zkh->get($node_path, 'watch' => $watch); - is($node, 'foo', - 'get(): retrieved node value with watch handle in parent'); - - $ret = $watch->wait(); - ok(($ret and $watch->{'event'} == ZOO_CHANGED_EVENT and - $watch->{'state'} == ZOO_CONNECTED_STATE), - 'wait(): waited for event after retrieving node value'); - - undef $watch; - - my $pending_watches = $zkh->{'pending_watches'}; - is($pending_watches, 0, - '_zk_release_watches(): no watches pending'); - } - - my $reap = waitpid($pid, 0); - - diag(sprintf('child process failed: exit %d, signal %d%s', - ($? >> 8), ($? & 127), - (($? & 128) ? ', core dump' : ''))) if - ($reap == $pid and $? != 0); - } -} - - -## cleanup - -{ - my $zkh = Net::ZooKeeper->new($hosts); - - my $ret = $zkh->exists($node_path) if (defined($zkh)); - - if (defined($ret) and $ret) { - $ret = $zkh->delete($node_path); - diag(sprintf('unable to delete node %s: %d, %s', - $node_path, $zkh->get_error(), $!)) unless ($ret); - } -} - diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/zkperl/t/util.pl b/pkg/registry/zookeeper-3.4.6/src/contrib/zkperl/t/util.pl deleted file mode 100644 index 1ca738d99..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/contrib/zkperl/t/util.pl +++ /dev/null @@ -1,62 +0,0 @@ -# Net::ZooKeeper - Perl extension for Apache ZooKeeper -# -# Licensed to the Apache Software Foundation (ASF) under one -# or more contributor license agreements. See the NOTICE file -# distributed with this work for additional information -# regarding copyright ownership. The ASF licenses this file -# to you 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. - -sub zk_test_setup -{ - my $verbose = shift; - - $SIG{'PIPE'} = 'IGNORE'; - - my $hosts = $ENV{'ZK_TEST_HOSTS'}; - unless (defined($hosts) and $hosts =~ /\S/) { - $hosts = 'localhost:0'; - diag('no ZooKeeper hostnames specified in ZK_TEST_HOSTS env var, ' . - "using $hosts") if ($verbose); - } - - my $root_path = $ENV{'ZK_TEST_PATH'}; - if (defined($root_path) and $root_path =~ /^\//) { - $root_path =~ s/\/+/\//g; - $root_path =~ s/\/$//; - } - else { - $root_path = '/'; - diag('no ZooKeeper path specified in ZK_TEST_PATH env var, ' . - 'using root path') if ($verbose); - } - - my $node_path = $root_path . (($root_path =~ /\/$/) ? '' : '/') . - '_net_zookeeper_test'; - - return ($hosts, $root_path, $node_path); -} - -sub zk_acl_test_setup -{ - my $username = '_net_zookeeper_test'; - - my $password = 'test'; - - ## digest is Base64-encoded SHA1 digest of username:password - my $digest = '2qi7Erp2cXYLGcQbXADiwUFaOGo='; - - return ($username, $password, $digest); -} - -1; - diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/zkperl/typemap b/pkg/registry/zookeeper-3.4.6/src/contrib/zkperl/typemap deleted file mode 100644 index 84636fdfe..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/contrib/zkperl/typemap +++ /dev/null @@ -1,38 +0,0 @@ -# Net::ZooKeeper - Perl extension for Apache ZooKeeper -# -# Licensed to the Apache Software Foundation (ASF) under one -# or more contributor license agreements. See the NOTICE file -# distributed with this work for additional information -# regarding copyright ownership. The ASF licenses this file -# to you 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. - -TYPEMAP -Net::ZooKeeper T_ZK_HANDLE -Net::ZooKeeper::Stat T_ZK_HANDLE -Net::ZooKeeper::Watch T_ZK_HANDLE - -INPUT -T_ZK_HANDLE - if (SvROK($arg) && SvTYPE(SvRV($arg)) == SVt_PVHV && - sv_derived_from($arg, \"${ntype}\")) { - $var = (HV*) SvRV($arg); - } - else { - Perl_croak(aTHX_ - \"$var is not a hash reference of type ${ntype}\"); - } - -OUTPUT -T_ZK_HANDLE - NOT_IMPLEMENTED - diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/zkpython/README b/pkg/registry/zookeeper-3.4.6/src/contrib/zkpython/README deleted file mode 100644 index 89d999897..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/contrib/zkpython/README +++ /dev/null @@ -1,109 +0,0 @@ -Early version of ZooKeeper bindings for Python. All functions are imported as methods into the zookeeper module. - -Please do not rely on APIs staying constant in the short term. The handling of exceptions and failure modes is one area that is subject to change. - -DEPENDENCIES: -------------- - -This has only been tested against SVN (i.e. 3.2.0 in development) but should work against 3.1.1. - -You will need the Python development headers installed to build the module - on many package-management systems, these can be found in python-devel. - -Python >= 2.6 is required. We have tested against 2.6. We have not tested against 3.x. - -BUILD AND INSTALL: -------------------- - -To install, make sure that the C client has been built and that the libraries are installed in /usr/local/lib (or change this directory in setup.py). Then run: - -ant install - -from zookeeper/src/contrib/zkpython/. - -To test, run ant test from the same directory. - -You can compile the module without installing by running - -ant compile - -In order to use the module, zookeeper.so must be in your PYTHONPATH or in one of the directories referenced by sys.path. Running ant install should make sure that this is the case, but if you only run ant compile you probably need to add build/contrib/zkpython/* to PYTHONPATH to find the module. The C client libraries must be in a system library path, or LD_LIBRARY_PATH or DYLD_LIBRARY_PATH (Mac OS) for the module to work correctly, otherwise you will see a library not found error when trying to import the module. - -NAMING CONVENTIONS: --------------------- - -All methods that in the C library are zoo_fn_name have been implemented as zookeeper.fn_name. The exception is any function that has a watch function argument is named without the 'w' prefix (for example, zoo_wexists becomes zookeeper.exists). The variants of these functions without the watch argument (i.e. zoo_exists) have not been implemented on the understanding that they are superseded by the zoo_w* API. - -Enums and integer constants that begin ZOO_int_name are named as zookeeper.int_name. - -PARAMETER CHANGES: ------------------- - -Zookeeper handles are represented as integers to avoid marshalling the entire structure for every call. Therefore they are opaque from Python. - -Any parameter that is used to provide arguments to callback methods is not exposed in the API. Python provides better mechanisms for providing a closure to be called in the future. - -Every callback gets passed the handle of the ZooKeeper instance used to register the callback. - -DATA TYPES: ------------ - -ACL_vectors are lists of dictionaries. Stat structures are dictionaries. String_vectors are lists of strings. - -EXCEPTIONS AND ERROR HANDLING: ------------------------------- - -Currently synchronous calls indicate failure by throwing an exception (note that this includes the synchronous calls to set up asynchronous completion callbacks!). Success is returned as an integer. - -Callbacks signify failure by having the integer response code passed in. - -WHAT'S NEW IN 0.4: ------------------- - -More test coverage. - -Better reference counting, fixing at least two serious bugs. - -Out-of-range zhandles are now checked, fixing a potential security hole. - -Docstrings! Editing and cleanup required, but most of the text is there. - -zookeeper.set_watcher is now implemented correctly. - -zookeeper.client_id is now implemented correctly. zookeeper.init now respects the client_id parameter. - -get_context and set_context have been removed from the API. The context mechanism is used by PyZK to store the callables that are dispatched by C-side watchers. Messing with this from Python-side causes bugs very quickly. You should wrap all desired context up in a callable and then use zookeeper.set_watcher to attach it to the global watcher. - -Many methods now have optional parameters (usually if you can specify a watch, it's optional). The only time where genuinely optional parameters are still mandatory is when a required parameters comes after it. Currently we still respect the ZK C client parameter ordering. For example, you can simply connect with zookeeper.init("host:port") and ignore the other three parameters. - - -WHAT'S NEW IN 0.3: ------------------- - -Some tests in zkpython/test. More to follow! - -A variety of bugfixes. - -Changed the way methods return results - all responses are integers now, for the client to convert to a string if it needs. - -WHAT'S NEW IN 0.2: ------------------- - -The asynchronous API is now implemented (see zookeeper.a*). - -Most enums defined in zookeeper.h are now added as constants to the module. - -_set2 and a few other edge API calls have been implemented. The module is now nearly 100% feature complete! - -A reference count error was tracked down and killed. More probably lurk in there! - -WHAT'S NOT DONE / KNOWN ISSUES / FUTURE WORK: ---------------------------------------------- - -1. There may well be more memory leaks / reference count issues; however I am more confident that common paths are relatively safe. -2. There probably needs to be a more Pythonic Python-side wrapper for these functions (e.g. a zookeeper object, the ability to iterate through a tree of zk nodes) -3. Docstrings need a cleanup. -4. The way exceptions and error codes are returned needs looking at. Currently synchronous calls throw exceptions on everything but ZOK return, but asynchronous completions are simply passed the error code. Async. functions should never throw an exception on the C-side as they are practically impossible to catch. For the sync. functions, exceptions seem more reasonable, but some cases are certainly not exceptional. - -Bug reports / comments very welcome! - -Henry Robinson henry@cloudera.com diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/zkpython/build.xml b/pkg/registry/zookeeper-3.4.6/src/contrib/zkpython/build.xml deleted file mode 100644 index d8254d14b..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/contrib/zkpython/build.xml +++ /dev/null @@ -1,198 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/zkpython/ivy.xml b/pkg/registry/zookeeper-3.4.6/src/contrib/zkpython/ivy.xml deleted file mode 100644 index 6931f4684..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/contrib/zkpython/ivy.xml +++ /dev/null @@ -1,43 +0,0 @@ - - - - - - - - ZKPython - - - - - - - - - - - - - - - - - - diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/zkpython/src/c/pyzk_docstrings.h b/pkg/registry/zookeeper-3.4.6/src/contrib/zkpython/src/c/pyzk_docstrings.h deleted file mode 100644 index d2c4d60f6..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/contrib/zkpython/src/c/pyzk_docstrings.h +++ /dev/null @@ -1,594 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you 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. - */ - -#ifndef PYZK_DOCSTRINGS_H -#define PYZK_DOCSTRINGS_H - -const char pyzk_acreate_doc[] = -"Create a node asynchronously.\n" -"\n" -"This method will create a node in ZooKeeper. A node can only be created if\n" -"it does not already exists. The Create Flags affect the creation of nodes.\n" -"If EPHEMERAL flag is set, the node will automatically get removed if the\n" -"client session goes away. If the SEQUENCE flag is set, a unique\n" -"monotonically increasing sequence number is appended to the path name.\n" -"\n" -" zh: the zookeeper handle obtained by a call to zookeeper.init\n" -" path: The name of the node. Expressed as a file name with slashes \n" -"separating ancestors of the node.\n" -" value: The data to be stored in the node.\n" -" acl: The initial ACL of the node. If None, the ACL of the parent will be\n" -" used.\n" -"\n" -" (Subsequent parameters are optional)\n" -" flags: this parameter can be set to 0 for normal create or an OR\n" -" of the Create Flags\n" -" completion: the routine to invoke when the request completes. The completion\n" -"will be triggered with one of the following codes passed in as the rc argument:\n" -"OK operation completed successfully\n" -"NONODE the parent node does not exist.\n" -"NODEEXISTS the node already exists\n" -"NOAUTH the client does not have permission.\n" -"NOCHILDRENFOREPHEMERALS cannot create children of ephemeral nodes.\n" -"\n" -"RETURNS:\n" -"Returns OK on success or throws of the following errcodes on failure:\n" -"EXCEPTIONS:\n" -"BADARGUMENTS - invalid input parameters\n" -"INVALIDSTATE - zhandle state is either SESSION_EXPIRED_STATE or AUTH_FAILED_STATE\n" -"MARSHALLINGERROR - failed to marshall a request; possibly, out of memory"; - -static const char pyzk_client_id_doc[] = -"Return the client session id, only valid if the connections\n" -" is currently connected (ie. last watcher state is CONNECTED_STATE)"; - -static const char pyzk_state_doc[] = -"Get the state of the zookeeper connection.\n" - "The return value will be one of the State Consts."; - -static const char pyzk_adelete_doc[] = -" Delete a node in zookeeper.\n" -"\n" -" zh: the zookeeper handle obtained by a call to zookeeper.init\n" -" path: the name of the node. Expressed as a file name with slashes \n" -"separating ancestors of the node.\n" -"\n" -"(Subsequent parameters are optional)\n" -" version: the expected version of the node. The function will fail if the\n" -" actual version of the node does not match the expected version.\n" -" If -1 is used the version check will not take place. \n" -" completion: the routine to invoke when the request completes. The completion\n" -"will be triggered with one of the following codes passed in as the rc argument:\n" -"OK operation completed successfully\n" -"NONODE the node does not exist.\n" -"NOAUTH the client does not have permission.\n" -"BADVERSION expected version does not match actual version.\n" -"NOTEMPTY children are present; node cannot be deleted.\n" -"Returns OK on success or one of the following errcodes on failure:\n" -"BADARGUMENTS - invalid input parameters\n" -"INVALIDSTATE - zhandle state is either SESSION_EXPIRED_STATE or AUTH_FAILED_STATE\n" - "MARSHALLINGERROR - failed to marshall a request; possibly, out of memory"; - -static const char pyzk_aexists_doc[] = -" checks the existence of a node in zookeeper.\n" -"\n" -" zh the zookeeper handle obtained by a call to zookeeper.init\n" -" path the name of the node. Expressed as a file name with slashes \n" -"separating ancestors of the node.\n" -"\n" -"(Subsequent parameters are optional)\n" -" watch: if not None, a watch will be set at the server to notify the \n" -"client if the node changes. The watch will be set even if the node does not \n" -"exist. This allows clients to watch for nodes to appear.\n" -"\n" -" completion: the routine to invoke when the request completes. The completion\n" -"will be triggered with one of the following codes passed in as the rc argument:\n" -" OK operation completed successfully\n" -" NONODE the node does not exist.\n" -" NOAUTH the client does not have permission.\n" -" data the data that will be passed to the completion routine when the \n" -"function completes.\n" -" OK on success or one of the following errcodes on failure:\n" -" BADARGUMENTS - invalid input parameters\n" -" INVALIDSTATE - zhandle state is either SESSION_EXPIRED_STATE or AUTH_FAILED_STATE\n" -" MARSHALLINGERROR - failed to marshall a request; possibly, out of memory"; - -static const char pyzk_aget_doc[] = -"Gets the data associated with a node.\n" -"\n" -" zh the zookeeper handle obtained by a call to zookeeper.init\n" -" path the name of the node. Expressed as a file name with slashes \n" -"separating ancestors of the node.\n" -"\n" -"(Subsequent parameters are optional)\n" -" watcher if not None, a watch will be set at the server to notify \n" -"the client if the node changes.\n" -" completion: the routine to invoke when the request completes. The completion\n" -"will be triggered with one of the following codes passed in as the rc argument:\n" -" OK operation completed successfully\n" -" NONODE the node does not exist.\n" -" NOAUTH the client does not have permission.\n" -" data the data that will be passed to the completion routine when \n" -"the function completes.\n" -"Returns OK on success or one of the following errcodes on failure:\n" -" BADARGUMENTS - invalid input parameters\n" -" INVALIDSTATE - zhandle state is either in SESSION_EXPIRED_STATE or AUTH_FAILED_STATE\n" - " MARSHALLINGERROR - failed to marshall a request; possibly, out of memory"; - -static const char pyzk_aset_doc[] = -" Sets the data associated with a node.\n" -"\n" -" zh the zookeeper handle obtained by a call to zookeeper.init\n" -" path the name of the node. Expressed as a file name with slashes \n" -"separating ancestors of the node.\n" -" buffer the buffer holding data to be written to the node.\n" -" buflen the number of bytes from buffer to write.\n" -"\n" -"(Subsequent parameters are optional)\n" -" version the expected version of the node. The function will fail if \n" -"the actual version of the node does not match the expected version. If -1 is \n" -"used the version check will not take place.\n" -"completion: If None, \n" -"the function will execute synchronously. Otherwise, the function will return \n" -"immediately and invoke the completion routine when the request completes.\n" -" completion the routine to invoke when the request completes. The completion\n" -"will be triggered with one of the following codes passed in as the rc argument:\n" -"OK operation completed successfully\n" -"NONODE the node does not exist.\n" -"NOAUTH the client does not have permission.\n" -"BADVERSION expected version does not match actual version.\n" -" data the data that will be passed to the completion routine when \n" -"the function completes.\n" -"Returns OK on success or one of the following errcodes on failure:\n" -"BADARGUMENTS - invalid input parameters\n" -"INVALIDSTATE - zhandle state is either SESSION_EXPIRED_STATE or AUTH_FAILED_STATE\n" -"MARSHALLINGERROR - failed to marshall a request; possibly, out of memory"; - -static const char pyzk_aget_children_doc[] = -" Lists the children of a node.\n" -"\n" -"This function is similar to zoo_aget_children except it allows one specify \n" -"a watcher object rather than a boolean watch flag.\n" -" \n" -" zh the zookeeper handle obtained by a call to zookeeper.init\n" -" path the name of the node. Expressed as a file name with slashes \n" -"separating ancestors of the node.\n" -"\n" -"(Subsequent parameters are optional)\n" -" watcher if non-null, a watch will be set at the server to notify \n" -"the client if the node changes.\n" -"\n" -" completion the routine to invoke when the request completes. The completion\n" -"will be triggered with one of the following codes passed in as the rc argument:\n" -"OK operation completed successfully\n" -"NONODE the node does not exist.\n" -"NOAUTH the client does not have permission.\n" -"\n" -"Returns OK on success or one of the following errcodes on failure:\n" -"BADARGUMENTS - invalid input parameters\n" -"INVALIDSTATE - zhandle state is either SESSION_EXPIRED_STATE or AUTH_FAILED_STATE\n" -"MARSHALLINGERROR - failed to marshall a request; possibly, out of memory"; - -static const char pyzk_async_doc[] = -" Flush leader channel.\n" -"\n" -" zh the zookeeper handle obtained by a call to zookeeper.init\n" -" path the name of the node. Expressed as a file name with slashes\n" -"separating ancestors of the node.\n" -" completion the routine to invoke when the request completes. The completion\n" -"will be triggered with one of the following codes passed in as the rc argument:\n" -"OK operation completed successfully\n" -"NONODE the node does not exist.\n" -"NOAUTH the client does not have permission.\n" -"\n" -"Returns OK on success or one of the following errcodes on failure:\n" -"BADARGUMENTS - invalid input parameters\n" -"INVALIDSTATE - zhandle state is either SESSION_EXPIRED_STATE or AUTH_FAILED_STATE\n" - "MARSHALLINGERROR - failed to marshall a request; possibly, out of memory"; - -const static char pyzk_aget_acl_doc[] = -" Gets the acl associated with a node.\n" -"\n" -" zh: the zookeeper handle obtained by a call to zookeeper.init\n" -" path: the name of the node. Expressed as a file name with slashes \n" -"separating ancestors of the node.\n" -"\n" -"(Subsequent parameters are optional)\n" -" completion: the routine to invoke when the request completes. The completion\n" -"will be triggered with one of the following codes passed in as the rc argument:\n" -"OK operation completed successfully\n" -"NONODE the node does not exist.\n" -"NOAUTH the client does not have permission.\n" -"\n" -"Returns:\n" -" OK on success or one of the following errcodes on failure:\n" -" BADARGUMENTS - invalid input parameters\n" -" INVALIDSTATE - zhandle state is either SESSION_EXPIRED_STATE or AUTH_FAILED_STATE\n" -" MARSHALLINGERROR - failed to marshall a request; possibly, out of memory"; - -const char pyzk_aset_acl_doc[] = -" Sets the acl associated with a node.\n" -"\n" -"PARAMETERS:\n" -" zh: the zookeeper handle obtained by a call to zookeeper.init\n" -" path: the name of the node. Expressed as a file name with slashes \n" -"separating ancestors of the node.\n" -" buffer: the buffer holding the acls to be written to the node.\n" -" completion: the routine to invoke when the request completes. The completion\n" -"will be triggered with one of the following codes passed in as the rc argument:\n" -"OK operation completed successfully\n" -"NONODE the node does not exist.\n" -"NOAUTH the client does not have permission.\n" -"INVALIDACL invalid ACL specified\n" -"BADVERSION expected version does not match actual version.\n" -"" -" Returns OK on success or one of the following errcodes on failure:\n" -" BADARGUMENTS - invalid input parameters\n" -" INVALIDSTATE - zhandle state is either SESSION_EXPIRED_STATE or AUTH_FAILED_STATE\n" -" MARSHALLINGERROR - failed to marshall a request; possibly, out of memory"; - -const char pyzk_zerror_doc[] = -"Returns an error string corresponding to an integer error code.\n" -"\n" -"PARAMETERS:\n" -" err: Error code\n" -"RETURNS:\n" - " string corresponding to the return code\n"; - -const char pyzk_add_auth_doc[] = -" specify application credentials.\n" -"\n" -"The application calls this function to specify its credentials for purposes\n" -"of authentication. The server will use the security provider specified by \n" -"the scheme parameter to authenticate the client connection. If the \n" -"authentication request has failed:\n" -"- the server connection is dropped\n" -"- the watcher is called with the AUTH_FAILED_STATE value as the state \n" -"parameter.\n" -"\n" -"PARAMETERS:\n" -" zh: the zookeeper handle obtained by a call to zookeeper.init\n" -" scheme the id of authentication scheme. Natively supported:\n" -"'digest' password-based authentication\n" -" cert: application credentials. The actual value depends on the scheme.\n" -" completion: the routine to invoke when the request completes. One of \n" -"the following result codes may be passed into the completion callback:\n" -"OK operation completed successfully\n" -"AUTHFAILED authentication failed \n" -"\n" -"RETURNS:\n" -"OK on success or one of the following errcodes on failure:\n" -"BADARGUMENTS - invalid input parameters\n" -"INVALIDSTATE - zhandle state is either SESSION_EXPIRED_STATE or AUTH_FAILED_STATE\n" -"MARSHALLINGERROR - failed to marshall a request; possibly, out of memory\n" - "SYSTEMERROR - a system error occured\n"; - -const char pyzk_is_unrecoverable_doc[] = -" checks if the current zookeeper connection state can't be recovered.\n" -"\n" -" The application must close the zhandle and try to reconnect.\n" -"\n" -"PARAMETERS:\n" -" zh the zookeeper handle (see zookeeper.init)\n" -"\n" -"RETURNS:\n" - "True if connection is unrecoverable, otherwise False\n"; - -const char pyzk_set_debug_level_doc[] = -"\brief sets the debugging level for the library \n" -"\n" -"PARAMETERS:\n" -" logLevel: One of LOG_LEVEL_ERROR, LOG_LEVEL_WARN, LOG_LEVEL_INFO or LOG_LEVEL_DEBUG\n" -"\n" -"RETURNS:\n" - " None\n"; - -static const char pyzk_set_log_stream_doc[] = -" sets the stream to be used by the library for logging \n" -"\n" -"The zookeeper library uses stderr as its default log stream. Applications\n" -"must make sure the stream is writable. Passing in NULL resets the stream \n" - "to its default value (stderr).\n" -"\n" -"PARAMETERS:\n" -" logStream: a writable file object\n" -"RETURNS:\n" -" None\n"; - -static const char pyzk_deterministic_conn_order_doc[] = -" enable/disable quorum endpoint order randomization\n" -"\n" -"If passed a non-zero value, will make the client connect to quorum peers\n" -"in the order as specified in the zookeeper.init() call.\n" -"A zero value causes zookeeper.init() to permute the peer endpoints\n" -"which is good for more even client connection distribution among the \n" -"quorum peers.\n" -"PARAMETERS:\n" -" yesOrNo\n" -"\n" -"RETURNS:\n" - " None\n"; - -static const char pyzk_create_doc[] = -" create a node synchronously.\n" -"\n" -"This method will create a node in ZooKeeper. A node can only be created if\n" -"it does not already exists. The Create Flags affect the creation of nodes.\n" -"If the EPHEMERAL flag is set, the node will automatically get removed if the\n" -"client session goes away. If the SEQUENCE flag is set, a unique\n" -"monotonically increasing sequence number is appended to the path name.\n" -"\n" -"PARAMETERS:\n" -" zh: the zookeeper handle obtained by a call to zookeeper.init\n" -" path: The name of the node. Expressed as a file name with slashes \n" -"separating ancestors of the node.\n" -" value: The data to be stored in the node.\n" -" acl: The initial ACL of the node. If null, the ACL of the parent will be\n" -" used.\n" -" flags: this parameter can be set to 0 for normal create or an OR\n" -" of the Create Flags\n" -" realpath: the real path that is created (this might be different than the\n" -" path to create because of the SEQUENCE flag.\n" -" the maximum length of real path you would want.\n" -"\n" -"RETURNS:\n" -" The actual znode path that was created (may be different from path due to use of SEQUENTIAL\n" -" flag).\n" -"EXCEPTIONS:\n" -" NONODE the parent node does not exist.\n" -" NODEEXISTS the node already exists\n" -" NOAUTH the client does not have permission.\n" -" NOCHILDRENFOREPHEMERALS cannot create children of ephemeral nodes.\n" -" BADARGUMENTS - invalid input parameters\n" -" INVALIDSTATE - zhandle state is either SESSION_EXPIRED_STATE or AUTH_FAILED_STATE\n" - " MARSHALLINGERROR - failed to marshall a request; possibly, out of memory\n"; - -static const char pyzk_delete_doc[] = -" delete a node in zookeeper synchronously.\n" -"\n" -"PARAMETERS:\n" -" zh the zookeeper handle obtained by a call to zookeeper.init\n" -" path the name of the node. Expressed as a file name with slashes \n" -"separating ancestors of the node.\n" -"\n" -"(Subsequent parameters are optional)\n" -" version: the expected version of the node. The function will fail if the\n" -" actual version of the node does not match the expected version.\n" -" If -1 (the default) is used the version check will not take place. \n" -"\n" -"RETURNS:\n" -"One of the following values is returned.\n" -"OK operation completed successfully\n" -"NONODE the node does not exist.\n" -"NOAUTH the client does not have permission.\n" -"BADVERSION expected version does not match actual version.\n" -"NOTEMPTY children are present; node cannot be deleted.\n" -"BADARGUMENTS - invalid input parameters\n" -"INVALIDSTATE - zhandle state is either SESSION_EXPIRED_STATE or AUTH_FAILED_STATE\n" - "MARSHALLINGERROR - failed to marshall a request; possibly, out of memory\n"; - -static const char pyzk_exists_doc[] = -" checks the existence of a node in zookeeper synchronously.\n" -"\n" -"PARAMETERS:\n" -" zh: the zookeeper handle obtained by a call to zookeeper.init\n" -" path: the name of the node. Expressed as a file name with slashes \n" -"separating ancestors of the node.\n" -"\n" -"(Subsequent parameters are optional)\n" -" watch: if nonzero, a watch will be set at the server to notify the \n" -"client if the node changes. The watch will be set even if the node does not \n" -"exist. This allows clients to watch for nodes to appear.\n" -"\n" -"RETURNS:\n" -" the return stat value of the node.\n" -"EXCEPTIONS:\n" -"OK operation completed successfully\n" -"NONODE the node does not exist.\n" -"NOAUTH the client does not have permission.\n" -"BADARGUMENTS - invalid input parameters\n" -"INVALIDSTATE - zhandle state is either SESSION_EXPIRED_STATE or AUTH_FAILED_STATE\n" - "MARSHALLINGERROR - failed to marshall a request; possibly, out of memory\n"; - - -static const char pyzk_get_children_doc[] = -" lists the children of a node synchronously.\n" -"\n" -"PARAMETERS:\n" -" zh: the zookeeper handle obtained by a call to zookeeper.init\n" -" path: the name of the node. Expressed as a file name with slashes \n" -"separating ancestors of the node.\n" -"\n" -"(subsequent parameters are optional)\n" -" watcher: if non-null, a watch will be set at the server to notify \n" -"the client if the node changes.\n" -"\n" -"RETURNS:\n" -" A list of znode names\n" -"EXCEPTIONS:\n" -"NONODE the node does not exist.\n" -"NOAUTH the client does not have permission.\n" -"BADARGUMENTS - invalid input parameters\n" -"INVALIDSTATE - zhandle state is either SESSION_EXPIRED_STATE or AUTH_FAILED_STATE\n" - "MARSHALLINGERROR - failed to marshall a request; possibly, out of memory\n"; - -static const char pyzk_set_doc[] = -"\n" -" sets the data associated with a node. See set2 function if\n" -"you require access to the stat information associated with the znode.\n" -"\n" -"PARAMETERS:\n" -" zh: the zookeeper handle obtained by a call to zookeeper.init\n" -" path: the name of the node. Expressed as a file name with slashes \n" -"separating ancestors of the node.\n" -" buffer: the buffer holding data to be written to the node.\n" -"\n" -"(subsequent parameters are optional)\n" -" version: the expected version of the node. The function will fail if \n" -"the actual version of the node does not match the expected version. If -1 is \n" -"used the version check will not take place. \n" -"\n" -"RETURNS:\n" -" the return code for the function call.\n" -"OK operation completed successfully\n" -"EXCEPTIONS:\n" -"NONODE the node does not exist.\n" -"NOAUTH the client does not have permission.\n" -"BADVERSION expected version does not match actual version.\n" -"BADARGUMENTS - invalid input parameters\n" -"INVALIDSTATE - zhandle state is either SESSION_EXPIRED_STATE or AUTH_FAILED_STATE\n" - "MARSHALLINGERROR - failed to marshall a request; possibly, out of memory\n"; - -static const char pyzk_get_acl_doc[] = -" gets the acl associated with a node synchronously.\n" -"\n" -"PARAMETERS:\n" -" zh: the zookeeper handle obtained by a call to zookeeper.init\n" -" path: the name of the node. Expressed as a file name with slashes \n" -"separating ancestors of the node.\n" -" acl: the return value of acls on the path.\n" -"RETURNS:" -" returns the stat of the path specified.\n" -"EXCEPTIONS:" -"NONODE the node does not exist.\n" -"NOAUTH the client does not have permission.\n" -"BADARGUMENTS - invalid input parameters\n" -"INVALIDSTATE - zhandle state is either SESSION_EXPIRED_STATE or AUTH_FAILED_STATE\n" - "MARSHALLINGERROR - failed to marshall a request; possibly, out of memory\n"; - - -static const char pyzk_set_acl_doc[] = -" sets the acl associated with a node synchronously.\n" -"\n" -"PARAMETERS:\n" -" zh: the zookeeper handle obtained by a call to zookeeper.init\n" -" path: the name of the node. Expressed as a file name with slashes \n" -"separating ancestors of the node.\n" -" version: the expected version of the path.\n" -" acl: the acl to be set on the path. \n" -"\n" -"RETURNS:\n" -"OK operation completed successfully\n" -"EXCEPTIONS:\n" -"NONODE the node does not exist.\n" -"NOAUTH the client does not have permission.\n" -"INVALIDACL invalid ACL specified\n" -"BADVERSION expected version does not match actual version.\n" -"BADARGUMENTS - invalid input parameters\n" -"INVALIDSTATE - zhandle state is either SESSION_EXPIRED_STATE or AUTH_FAILED_STATE\n" - "MARSHALLINGERROR - failed to marshall a request; possibly, out of memory\n"; - -static const char pyzk_close_doc[] = -" close the zookeeper handle and free up any resources.\n" -"\n" -"After this call, the client session will no longer be valid. The function\n" -"will flush any outstanding send requests before return. As a result it may \n" -"block.\n" -"\n" -"This method should only be called only once on a zookeeper handle. Calling\n" -"twice will cause undefined (and probably undesirable behavior).\n" -"\n" -"PARAMETERS:\n" -" zh: the zookeeper handle obtained by a call to zookeeper.init\n" -"RETURNS:\n" -"Regardless of the error code returned, the zhandle \n" -"will be destroyed and all resources freed. \n" -"OK - success\n" -"EXCEPTIONS:\n" -"BADARGUMENTS - invalid input parameters\n" -"MARSHALLINGERROR - failed to marshall a request; possibly, out of memory\n" -"OPERATIONTIMEOUT - failed to flush the buffers within the specified timeout.\n" -"CONNECTIONLOSS - a network error occured while attempting to send request to server\n" - "SYSTEMERROR -- a system (OS) error occured; it's worth checking errno to get details\n"; - -static const char pyzk_set2_doc[] = -"\n" -" sets the data associated with a node, and returns the associated stat structure.\n" -"\n" -"PARAMETERS:\n" -" zh: the zookeeper handle obtained by a call to zookeeper.init\n" -" path: the name of the node. Expressed as a file name with slashes \n" -"separating ancestors of the node.\n" -" buffer: the buffer holding data to be written to the node.\n" -"\n" -"(subsequent parameters are optional)\n" -" version: the expected version of the node. The function will fail if \n" -"the actual version of the node does not match the expected version. If -1 is \n" -"used the version check will not take place. \n" -"\n" -"RETURNS:\n" -" the stat structure for the target znode\n" -"OK operation completed successfully\n" -"EXCEPTIONS:\n" -"NONODE the node does not exist.\n" -"NOAUTH the client does not have permission.\n" -"BADVERSION expected version does not match actual version.\n" -"BADARGUMENTS - invalid input parameters\n" -"INVALIDSTATE - zhandle state is either SESSION_EXPIRED_STATE or AUTH_FAILED_STATE\n" - "MARSHALLINGERROR - failed to marshall a request; possibly, out of memory\n"; - -static const char pyzk_init_doc[] = -"This method creates a new handle and a zookeeper session that corresponds\n" -"to that handle. Session establishment is asynchronous, meaning that the\n" -"session should not be considered established until (and unless) an\n" -"event of state CONNECTED_STATE is received.\n" -"PARAMETERS:\n" -" host: comma separated host:port pairs, each corresponding to a zk\n" -" server. e.g. '127.0.0.1:3000,127.0.0.1:3001,127.0.0.1:3002'\n" -"\n" -"(subsequent parameters are optional)\n" -" fn: the global watcher callback function. When notifications are\n" -" triggered this function will be invoked.\n" -" recv_timeout: \n" -" (clientid, passwd)\n" -" clientid the id of a previously established session that this\n" -" client will be reconnecting to. Clients can access the session id of an established, valid,\n" -" connection by calling zoo_client_id. If\n" -" the specified clientid has expired, or if the clientid is invalid for \n" -" any reason, the returned zhandle_t will be invalid -- the zhandle_t \n" -" state will indicate the reason for failure (typically\n" -" EXPIRED_SESSION_STATE).\n" -"\n" -"RETURNS:\n" -" an integer handle. If it fails to create \n" -" a new zhandle the function throws an exception.\n"; - -static const char pyzk_get_doc[] = -" gets the data associated with a node synchronously.\n" -"\n" -"\n" -"PARAMETERS:\n" -" zh the zookeeper handle obtained by a call to zookeeper.init\n" -" path the name of the node. Expressed as a file name with slashes \n" -"separating ancestors of the node.\n" -"\n" -"(subsequent parameters are optional)\n" -" watcher if not None, a watch will be set at the server to notify \n" -" the client if the node changes.\n" -" bufferlen: This value defaults to 1024*1024 - 1Mb. This method returns \n" -" the minimum of bufferlen and the true length of the znode's data. \n" -"RETURNS:\n" -" the data associated with the node\n" -"OK operation completed successfully\n" -"NONODE the node does not exist.\n" -"NOAUTH the client does not have permission.\n" -"BADARGUMENTS - invalid input parameters\n" -"INVALIDSTATE - zhandle state is either in SESSION_EXPIRED_STATE or AUTH_FAILED_STATE\n" - "MARSHALLINGERROR - failed to marshall a request; possibly, out of memory\n"; - -#endif diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/zkpython/src/c/zookeeper.c b/pkg/registry/zookeeper-3.4.6/src/contrib/zkpython/src/c/zookeeper.c deleted file mode 100644 index 7d8c899f1..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/contrib/zkpython/src/c/zookeeper.c +++ /dev/null @@ -1,1664 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you 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. - */ - -#include -#include -#include - -////////////////////////////////////////////// -// EXCEPTIONS -PyObject *ZooKeeperException = NULL; -PyObject *SystemErrorException; -PyObject *RuntimeInconsistencyException; -PyObject *DataInconsistencyException; -PyObject *ConnectionLossException; -PyObject *MarshallingErrorException; -PyObject *UnimplementedException; -PyObject *OperationTimeoutException; -PyObject *BadArgumentsException; -PyObject *InvalidStateException; - -PyObject *ApiErrorException; -PyObject *NoNodeException; -PyObject *NoAuthException; -PyObject *NodeExistsException; -PyObject *BadVersionException; -PyObject *NoChildrenForEphemeralsException; -PyObject *NotEmptyException; -PyObject *SessionExpiredException; -PyObject *SessionMovedException; -PyObject *InvalidCallbackException; -PyObject *InvalidACLException; -PyObject *AuthFailedException; -PyObject *ClosingException; -PyObject *NothingException; - -PyObject *err_to_exception(int errcode) { - switch (errcode) { - case ZSYSTEMERROR: - return SystemErrorException; - case ZINVALIDSTATE: - return InvalidStateException; - case ZRUNTIMEINCONSISTENCY: - return RuntimeInconsistencyException; - case ZDATAINCONSISTENCY: - return DataInconsistencyException; - case ZCONNECTIONLOSS: - return ConnectionLossException; - case ZMARSHALLINGERROR: - return MarshallingErrorException; - case ZUNIMPLEMENTED: - return UnimplementedException; - case ZOPERATIONTIMEOUT: - return OperationTimeoutException; - case ZBADARGUMENTS: - return BadArgumentsException; - case ZAPIERROR: - return ApiErrorException; - case ZNONODE: - return NoNodeException; - case ZNOAUTH: - return NoAuthException; - case ZBADVERSION: - return BadVersionException; - case ZNOCHILDRENFOREPHEMERALS: - return NoChildrenForEphemeralsException; - case ZNODEEXISTS: - return NodeExistsException; - case ZINVALIDACL: - return InvalidACLException; - case ZAUTHFAILED: - return AuthFailedException; - case ZNOTEMPTY: - return NotEmptyException; - case ZSESSIONEXPIRED: - return SessionExpiredException; - case ZINVALIDCALLBACK: - return InvalidCallbackException; - case ZSESSIONMOVED: - return SessionMovedException; - case ZCLOSING: - return ClosingException; - case ZNOTHING: - return NothingException; - case ZOK: - default: - return NULL; - } -} - - -#define CHECK_ZHANDLE(z) if ( (z) < 0 || (z) >= num_zhandles) { \ - PyErr_SetString( ZooKeeperException, "zhandle out of range" ); \ -return NULL; \ -} else if ( zhandles[(z)] == NULL ) { \ - PyErr_SetString(ZooKeeperException, "zhandle already freed"); \ - return NULL; \ - } - -/* Contains all the state required for a watcher callback - these are - passed to the *dispatch functions as void*, cast to pywatcher_t and - then their callback member is invoked if not NULL */ -typedef struct { - int zhandle; - PyObject *callback; - int permanent; -}pywatcher_t; - -/* This array exists because we need to ref. count the global watchers - for each connection - but they're inaccessible without pulling in - zk_adaptor.h, which I'm trying to avoid. */ -static pywatcher_t **watchers; - -/* We keep an array of zhandles available for use. When a zhandle is - correctly closed, the C client frees the memory so we set the - zhandles[i] entry to NULL. This entry can then be re-used. */ -static zhandle_t** zhandles = NULL; -static int num_zhandles = 0; -static int max_zhandles = 0; -#define REAL_MAX_ZHANDLES 32768 - -/* -------------------------------------------------------------------------- */ -/* zhandles - unique connection ids - tracking */ -/* -------------------------------------------------------------------------- */ - - -/* Allocates an initial zhandle and watcher array */ -int init_zhandles(int num) { - zhandles = malloc(sizeof(zhandle_t*)*num); - watchers = malloc(sizeof(pywatcher_t*)*num); - if (zhandles == NULL || watchers == NULL) { - return 0; - } - max_zhandles = num; - num_zhandles = 0; - memset(zhandles, 0, sizeof(zhandle_t*)*max_zhandles); - return 1; -} - -/* Note that the following zhandle functions are not thread-safe. The - C-Python runtime does not seem to pre-empt a thread that is in a C - module, so there's no need for synchronisation. */ - -/* Doubles the size of the zhandle / watcher array Returns 0 if the - new array would be >= REAL_MAX_ZHANDLES in size. Called when zhandles - is full. Returns 0 if allocation failed or if max num zhandles - exceeded. */ -int resize_zhandles(void) { - zhandle_t **tmp = zhandles; - pywatcher_t ** wtmp = watchers; - if (max_zhandles >= REAL_MAX_ZHANDLES >> 1) { - return 0; - } - max_zhandles *= 2; - zhandles = malloc(sizeof(zhandle_t*)*max_zhandles); - if (zhandles == NULL) { - PyErr_SetString(PyExc_MemoryError, "malloc for new zhandles failed"); - return 0; - } - memset(zhandles, 0, sizeof(zhandle_t*)*max_zhandles); - memcpy(zhandles, tmp, sizeof(zhandle_t*)*max_zhandles/2); - - watchers = malloc(sizeof(pywatcher_t*)*max_zhandles); - if (watchers == NULL) { - PyErr_SetString(PyExc_MemoryError, "malloc for new watchers failed"); - return 0; - } - memset(watchers, 0, sizeof(pywatcher_t*)*max_zhandles); - memcpy(watchers, wtmp, sizeof(pywatcher_t*)*max_zhandles/2); - - free(wtmp); - free(tmp); - return 1; -} - -/* Find a free zhandle - this iterates through the list of open - zhandles, but we expect it to be infrequently called. There are - optimisations that can be made if this turns out to be problematic. - Returns -1 if no free handle is found - resize_handles() can be - called in that case. */ -unsigned int next_zhandle(void) { - int i = 0; - for (i=0;izhandle = zh; ret->callback = cb; ret->permanent = permanent; - return ret; -} - -/* Releases the reference taken in create_pywatcher to the callback, - then frees the allocated pywatcher_t* */ -void free_pywatcher(pywatcher_t *pw) -{ - if (pw == NULL) { - return; - } - Py_DECREF(pw->callback); - - free(pw); -} - -/* Constructs a new stat object. Returns Py_None if stat == NULL or a - dictionary containing all the stat information otherwise. In either - case, takes a reference to the returned object. */ -PyObject *build_stat( const struct Stat *stat ) -{ - if (stat == NULL) { - Py_INCREF(Py_None); - return Py_None; - } - return Py_BuildValue( "{s:K, s:K, s:K, s:K," - "s:i, s:i, s:i, s:K," - "s:i, s:i, s:K}", - "czxid", stat->czxid, - "mzxid", stat->mzxid, - "ctime", stat->ctime, - "mtime", stat->mtime, - "version", stat->version, - "cversion", stat->cversion, - "aversion", stat->aversion, - "ephemeralOwner", stat->ephemeralOwner, - "dataLength", stat->dataLength, - "numChildren", stat->numChildren, - "pzxid", stat->pzxid ); -} - -/* Creates a new list of strings from a String_vector. Returns the - empty list if the String_vector is NULL. Takes a reference to the - returned PyObject and gives that reference to the caller. */ -PyObject *build_string_vector(const struct String_vector *sv) -{ - PyObject *ret; - if (!sv) { - return PyList_New(0); - } - - ret = PyList_New(sv->count); - if (ret) { - int i; - for (i=0;icount;++i) { -#if PY_MAJOR_VERSION >= 3 - PyObject *s = PyUnicode_FromString(sv->data[i]); -#else - PyObject *s = PyString_FromString(sv->data[i]); -#endif - if (!s) { - if (ret != Py_None) { - Py_DECREF(ret); - } - ret = NULL; - break; - } - PyList_SetItem(ret, i, s); - } - } - return ret; -} - -/* Returns 1 if the PyObject is a valid representation of an ACL, and - 0 otherwise. */ -int check_is_acl(PyObject *o) { - int i; - PyObject *entry; - if (o == NULL) { - return 0; - } - if (!PyList_Check(o)) { - return 0; - } - for (i=0;icount); - int i; - for (i=0;icount;++i) { - PyObject *acl = Py_BuildValue( "{s:i, s:s, s:s}", - "perms", acls->data[i].perms, - "scheme", acls->data[i].id.scheme, - "id", acls->data[i].id.id ); - PyList_SetItem(ret, i, acl); - } - return ret; -} - -/* Parse the Python representation of an ACL list into an ACL_vector - (which needs subsequent freeing) */ -int parse_acls(struct ACL_vector *acls, PyObject *pyacls) -{ - PyObject *a; - int i; - if (acls == NULL || pyacls == NULL) { - PyErr_SetString(PyExc_ValueError, "acls or pyacls NULL in parse_acls"); - return 0; - } - - acls->count = PyList_Size( pyacls ); - - // Is this a list? If not, we can't do anything - if (PyList_Check(pyacls) == 0) { - PyErr_SetString(InvalidACLException, "List of ACLs required in parse_acls"); - return 0; - } - - acls->data = (struct ACL *)calloc(acls->count, sizeof(struct ACL)); - if (acls->data == NULL) { - PyErr_SetString(PyExc_MemoryError, "calloc failed in parse_acls"); - return 0; - } - - for (i=0;icount;++i) { - a = PyList_GetItem(pyacls, i); - // a is now a dictionary - PyObject *perms = PyDict_GetItemString( a, "perms" ); -#if PY_MAJOR_VERSION >= 3 - acls->data[i].perms = (int32_t)(PyLong_AsLong(perms)); - acls->data[i].id.id = strdup( PyUnicode_AsUnicode( PyDict_GetItemString( a, "id" ) ) ); - acls->data[i].id.scheme = strdup( PyUnicode_AsUnicode( PyDict_GetItemString( a, "scheme" ) ) ); -#else - acls->data[i].perms = (int32_t)(PyInt_AsLong(perms)); - acls->data[i].id.id = strdup( PyString_AsString( PyDict_GetItemString( a, "id" ) ) ); - acls->data[i].id.scheme = strdup( PyString_AsString( PyDict_GetItemString( a, "scheme" ) ) ); -#endif - } - return 1; -} - -/* Deallocates the memory allocated inside an ACL_vector, but not the - ACL_vector itself */ -void free_acls( struct ACL_vector *acls ) -{ - if (acls == NULL) { - return; - } - int i; - for (i=0;icount;++i) { - free(acls->data[i].id.id); - free(acls->data[i].id.scheme); - } - free(acls->data); -} - -/* -------------------------------------------------------------------------- */ -/* Watcher and callback implementation */ -/* -------------------------------------------------------------------------- */ - -/* Every watcher invocation goes through this dispatch point, which - a) acquires the global interpreter lock - - b) unpacks the PyObject to call from the passed context pointer, - which handily includes the index of the relevant zookeeper handle - to pass back to Python. - - c) Makes the call into Python, checking for error conditions which - we are responsible for detecting and doing something about (we just - print the error and plough right on) - - d) releases the lock after freeing up the context object, which is - only used for one watch invocation (watches are one-shot, unless - 'permanent' != 0) -*/ -void watcher_dispatch(zhandle_t *zzh, int type, int state, - const char *path, void *context) -{ - PyGILState_STATE gstate; - pywatcher_t *pyw = (pywatcher_t*)context; - PyObject *callback = pyw->callback; - if (callback == NULL) { - // This is unexpected - char msg[256]; - sprintf(msg, "pywatcher: %d %p %d", pyw->zhandle, pyw->callback, pyw->permanent); - PyErr_SetString(PyExc_ValueError, msg); - return; - } - - gstate = PyGILState_Ensure(); - PyObject *arglist = Py_BuildValue("(i,i,i,s)", pyw->zhandle,type, state, path); - if (PyObject_CallObject((PyObject*)callback, arglist) == NULL) { - PyErr_Print(); - } - Py_DECREF(arglist); - if (pyw->permanent == 0 && (type != ZOO_SESSION_EVENT || state < 0)) { - free_pywatcher(pyw); - } - PyGILState_Release(gstate); -} - -/* The completion callbacks (from asynchronous calls) are implemented similarly */ - -/* Called when an asynchronous call that returns void completes and - dispatches user provided callback */ -void void_completion_dispatch(int rc, const void *data) -{ - PyGILState_STATE gstate; - pywatcher_t *pyw = (pywatcher_t*)data; - if (pyw == NULL) - return; - PyObject *callback = pyw->callback; - gstate = PyGILState_Ensure(); - PyObject *arglist = Py_BuildValue("(i,i)", pyw->zhandle, rc); - if (PyObject_CallObject((PyObject*)callback, arglist) == NULL) - PyErr_Print(); - Py_DECREF(arglist); - free_pywatcher(pyw); - PyGILState_Release(gstate); -} - -/* Called when an asynchronous call that returns a stat structure - completes and dispatches user provided callback */ -void stat_completion_dispatch(int rc, const struct Stat *stat, const void *data) -{ - PyGILState_STATE gstate; - pywatcher_t *pyw = (pywatcher_t*)data; - if (pyw == NULL) - return; - PyObject *callback = pyw->callback; - gstate = PyGILState_Ensure(); - PyObject *pystat = build_stat(stat); - PyObject *arglist = Py_BuildValue("(i,i,O)", pyw->zhandle,rc, pystat); - Py_DECREF(pystat); - if (PyObject_CallObject((PyObject*)callback, arglist) == NULL) - PyErr_Print(); - Py_DECREF(arglist); - free_pywatcher(pyw); - PyGILState_Release(gstate); -} - -/* Called when an asynchronous call that returns a stat structure and - some untyped data completes and dispatches user provided - callback (used by aget) */ -void data_completion_dispatch(int rc, const char *value, int value_len, const struct Stat *stat, const void *data) -{ - PyGILState_STATE gstate; - pywatcher_t *pyw = (pywatcher_t*)data; - if (pyw == NULL) - return; - PyObject *callback = pyw->callback; - gstate = PyGILState_Ensure(); - PyObject *pystat = build_stat(stat); - PyObject *arglist = Py_BuildValue("(i,i,s#,O)", pyw->zhandle,rc, value,value_len, pystat); - Py_DECREF(pystat); - - if (PyObject_CallObject((PyObject*)callback, arglist) == NULL) - PyErr_Print(); - Py_DECREF(arglist); - free_pywatcher(pyw); - PyGILState_Release(gstate); -} - -/* Called when an asynchronous call that returns a list of strings - completes and dispatches user provided callback */ -void strings_completion_dispatch(int rc, const struct String_vector *strings, const void *data) -{ - PyGILState_STATE gstate; - pywatcher_t *pyw = (pywatcher_t*)data; - if (pyw == NULL) - return; - PyObject *callback = pyw->callback; - gstate = PyGILState_Ensure(); - PyObject *pystrings = build_string_vector(strings); - if (pystrings) - { - PyObject *arglist = Py_BuildValue("(i,i,O)", pyw->zhandle, rc, pystrings); - if (arglist == NULL || PyObject_CallObject((PyObject*)callback, arglist) == NULL) - PyErr_Print(); - Py_DECREF(arglist); - } - else - PyErr_Print(); - Py_DECREF(pystrings); - free_pywatcher(pyw); - PyGILState_Release(gstate); -} - -/* Called when an asynchronous call that returns a single string - completes and dispatches user provided callback */ -void string_completion_dispatch(int rc, const char *value, const void *data) -{ - PyGILState_STATE gstate; - pywatcher_t *pyw = (pywatcher_t*)data; - if (pyw == NULL) { - return; - } - PyObject *callback = pyw->callback; - gstate = PyGILState_Ensure(); - PyObject *arglist = Py_BuildValue("(i,i,s)", pyw->zhandle,rc, value); - if (PyObject_CallObject((PyObject*)callback, arglist) == NULL) - PyErr_Print(); - Py_DECREF(arglist); - free_pywatcher(pyw); - PyGILState_Release(gstate); -} - -/* Called when an asynchronous call that returns a list of ACLs - completes and dispatches user provided callback */ -void acl_completion_dispatch(int rc, struct ACL_vector *acl, struct Stat *stat, const void *data) -{ - PyGILState_STATE gstate; - pywatcher_t *pyw = (pywatcher_t*)data; - if (pyw == NULL) { - return; - } - PyObject *callback = pyw->callback; - gstate = PyGILState_Ensure(); - PyObject *pystat = build_stat(stat); - PyObject *pyacls = build_acls(acl); - PyObject *arglist = Py_BuildValue("(i,i,O,O)", pyw->zhandle,rc, pyacls, pystat); - - Py_DECREF(pystat); - Py_DECREF(pyacls); - - if (PyObject_CallObject((PyObject*)callback, arglist) == NULL) { - PyErr_Print(); - } - Py_DECREF(arglist); - free_pywatcher(pyw); - PyGILState_Release(gstate); -} - -/* -------------------------------------------------------------------------- */ -/* ZOOKEEPER API IMPLEMENTATION */ -/* -------------------------------------------------------------------------- */ - -static PyObject *pyzookeeper_init(PyObject *self, PyObject *args) -{ - const char *host; - PyObject *watcherfn = Py_None; - int recv_timeout = 10000; - // int clientid = -1; - clientid_t cid; - cid.client_id = -1; - const char *passwd; - int handle = next_zhandle(); - if (handle == -1) { - if (resize_zhandles() == 0) { - return NULL; - } - handle = next_zhandle(); - } - - if (handle == -1) { - PyErr_SetString(ZooKeeperException,"Couldn't find a free zhandle, something is very wrong"); - return NULL; - } - - if (!PyArg_ParseTuple(args, "s|Oi(Ls)", &host, &watcherfn, &recv_timeout, &cid.client_id, &passwd)) - return NULL; - - if (cid.client_id != -1) { - strncpy(cid.passwd, passwd, 16*sizeof(char)); - } - pywatcher_t *pyw = NULL; - if (watcherfn != Py_None) { - pyw = create_pywatcher(handle, watcherfn,1); - if (pyw == NULL) { - return NULL; - } - } - watchers[handle] = pyw; - zhandle_t *zh = zookeeper_init( host, watcherfn != Py_None ? watcher_dispatch : NULL, - recv_timeout, cid.client_id == -1 ? 0 : &cid, - pyw, - 0 ); - - if (zh == NULL) - { - PyErr_SetString( ZooKeeperException, "Could not internally obtain zookeeper handle" ); - return NULL; - } - - zhandles[handle] = zh; - return Py_BuildValue( "i", handle); -} - - -/* -------------------------------------------------------------------------- */ -/* Asynchronous API implementation */ -/* -------------------------------------------------------------------------- */ - -/* Asynchronous node creation, returns integer error code */ -PyObject *pyzoo_acreate(PyObject *self, PyObject *args) -{ - int zkhid; char *path; char *value; int valuelen; - struct ACL_vector acl; int flags = 0; - PyObject *completion_callback = Py_None; - PyObject *pyacls = Py_None; - if (!PyArg_ParseTuple(args, "iss#O|iO", &zkhid, &path, - &value, &valuelen, &pyacls, &flags, - &completion_callback)) { - return NULL; - } - CHECK_ZHANDLE(zkhid); - CHECK_ACLS(pyacls); - if (parse_acls(&acl, pyacls) == 0) { - return NULL; - } - void *pyw = NULL; - if (completion_callback != Py_None) { - pyw = create_pywatcher(zkhid, completion_callback, 0); - if (pyw == NULL) { - return NULL; - } - } - int err = zoo_acreate( zhandles[zkhid], - path, - value, - valuelen, - pyacls == Py_None ? NULL : &acl, - flags, - string_completion_dispatch, - pyw); - free_acls(&acl); - if (err != ZOK) - { - PyErr_SetString(err_to_exception(err), zerror(err)); - return NULL; - } - return Py_BuildValue("i", err); -} - -/* Asynchronous node deletion, returns integer error code */ -PyObject *pyzoo_adelete(PyObject *self, PyObject *args) -{ - int zkhid; char *path; int version = -1; - PyObject *completion_callback = Py_None; - if (!PyArg_ParseTuple(args, "is|iO", &zkhid, &path, &version, &completion_callback)) - return NULL; - CHECK_ZHANDLE(zkhid); - - void *pyw = NULL; - if (completion_callback != Py_None) { - pyw = create_pywatcher(zkhid, completion_callback, 0); - if (pyw == NULL) { - return NULL; - } - } - - int err = zoo_adelete( zhandles[zkhid], - path, - version, - void_completion_dispatch, - pyw); - - if (err != ZOK) { - PyErr_SetString(err_to_exception(err), zerror(err)); - return NULL; - } - return Py_BuildValue("i", err); -} - -/* Asynchronous node existance check, returns integer error code */ -PyObject *pyzoo_aexists(PyObject *self, PyObject *args) -{ - int zkhid; char *path; - PyObject *completion_callback = Py_None; - PyObject *exists_watch = Py_None; - if (!PyArg_ParseTuple(args, "is|OO", &zkhid, &path, - &exists_watch, &completion_callback)) - return NULL; - CHECK_ZHANDLE(zkhid); - void *comp_pyw = NULL; - if (completion_callback != Py_None) { - comp_pyw = create_pywatcher(zkhid, completion_callback, 0); - if (comp_pyw == NULL) { - return NULL; - } - } - void *exist_pyw = NULL; - if (exists_watch != Py_None) { - exist_pyw = create_pywatcher(zkhid, exists_watch, 0); - if (exist_pyw == NULL) { - return NULL; - } - } - - int err = zoo_awexists( zhandles[zkhid], - path, - exists_watch != Py_None ? watcher_dispatch : NULL, - exist_pyw, - stat_completion_dispatch, - comp_pyw); - - if (err != ZOK) - { - PyErr_SetString(err_to_exception(err), zerror(err)); - return NULL; - } - return Py_BuildValue("i", err);; -} - -/* Asynchronous node data retrieval, returns integer error code */ -PyObject *pyzoo_aget(PyObject *self, PyObject *args) -{ - int zkhid; char *path; - PyObject *completion_callback = Py_None; - PyObject *get_watch = Py_None; - void *comp_pw = NULL; - void *watch_pw = NULL; - - if (!PyArg_ParseTuple(args, "is|OO", &zkhid, &path, - &get_watch, &completion_callback)) { - return NULL; - } - - CHECK_ZHANDLE(zkhid); - - if (get_watch != Py_None) { - if ((watch_pw = create_pywatcher(zkhid, get_watch, 0)) == NULL) { - return NULL; - } - } - - if (completion_callback != Py_None) { - if ((comp_pw = create_pywatcher(zkhid, completion_callback, 0)) == NULL) { - return NULL; - } - } - - int err = zoo_awget( zhandles[zkhid], - path, - get_watch != Py_None ? watcher_dispatch : NULL, - watch_pw, - data_completion_dispatch, - comp_pw); - - if (err != ZOK) { - PyErr_SetString(err_to_exception(err), zerror(err)); - return NULL; - } - return Py_BuildValue("i", err); -} - -/* Asynchronous node contents update, returns integer error code */ -PyObject *pyzoo_aset(PyObject *self, PyObject *args) -{ - int zkhid; char *path; char *buffer; int buflen; int version=-1; - PyObject *completion_callback = Py_None; - if (!PyArg_ParseTuple(args, "iss#|iO", &zkhid, &path, &buffer, &buflen, &version, &completion_callback)) - return NULL; - CHECK_ZHANDLE(zkhid); - void *pyw = NULL; - if (completion_callback != Py_None) { - pyw = create_pywatcher(zkhid, completion_callback, 0); - if (pyw == NULL) { - return NULL; - } - } - int err = zoo_aset( zhandles[zkhid], - path, - buffer, - buflen, - version, - stat_completion_dispatch, - pyw); - - if (err != ZOK) { - PyErr_SetString(err_to_exception(err), zerror(err)); - return NULL; - } - return Py_BuildValue("i", err); -} - -/* Asynchronous node child retrieval, returns integer error code */ -PyObject *pyzoo_aget_children(PyObject *self, PyObject *args) -{ - int zkhid; char *path; - PyObject *completion_callback = Py_None; - PyObject *get_watch; - if (!PyArg_ParseTuple(args, "is|OO", &zkhid, &path, - &get_watch, &completion_callback)) - return NULL; - CHECK_ZHANDLE(zkhid); - - void *get_pyw = NULL; - if (get_watch != Py_None) { - get_pyw = create_pywatcher(zkhid, get_watch, 0); - if (get_pyw == NULL) { - return NULL; - } - } - - void *pyw = NULL; - if (completion_callback != Py_None) { - pyw = create_pywatcher(zkhid, completion_callback, 0); - if (pyw == NULL) { - return NULL; - } - } - - int err = zoo_awget_children( zhandles[zkhid], - path, - get_watch != Py_None ? watcher_dispatch : NULL, - get_pyw, - strings_completion_dispatch, - pyw); - if (err != ZOK) { - PyErr_SetString(err_to_exception(err), zerror(err)); - return NULL; - } - return Py_BuildValue("i", err);; -} - -/* Asynchronous sync, returns integer error code */ -PyObject *pyzoo_async(PyObject *self, PyObject *args) -{ - int zkhid; char *path; - PyObject *completion_callback = Py_None; - if (!PyArg_ParseTuple(args, "is|O", &zkhid, &path, - &completion_callback)) { - return NULL; - } - CHECK_ZHANDLE(zkhid); - - void *pyw = NULL; - if (completion_callback != Py_None) { - pyw = create_pywatcher(zkhid, completion_callback, 0); - if (pyw == NULL) { - return NULL; - } - } - - int err = zoo_async( zhandles[zkhid], - path, - string_completion_dispatch, - pyw); - - if (err != ZOK) { - PyErr_SetString(err_to_exception(err), zerror(err)); - return NULL; - } - return Py_BuildValue("i", err);; -} - -/* Asynchronous node ACL retrieval, returns integer error code */ -PyObject *pyzoo_aget_acl(PyObject *self, PyObject *args) -{ - int zkhid; char *path; - PyObject *completion_callback = Py_None; - if (!PyArg_ParseTuple(args, "is|O", &zkhid, &path, - &completion_callback)) { - return NULL; - } - CHECK_ZHANDLE(zkhid); - - void *pyw = NULL; - if (completion_callback != Py_None) { - pyw = create_pywatcher(zkhid, completion_callback, 0); - if (pyw == NULL) { - return NULL; - } - } - - int err = zoo_aget_acl( zhandles[zkhid], - path, - acl_completion_dispatch, - pyw); - if (err != ZOK) { - PyErr_SetString(err_to_exception(err), zerror(err)); - return NULL; - } - return Py_BuildValue("i", err);; -} - -/* Asynchronous node ACL update, returns integer error code */ -PyObject *pyzoo_aset_acl(PyObject *self, PyObject *args) -{ - int zkhid; char *path; int version; - PyObject *completion_callback = Py_None, *pyacl; - struct ACL_vector aclv; - if (!PyArg_ParseTuple(args, "isiO|O", &zkhid, &path, &version, - &pyacl, &completion_callback)) { - return NULL; - } - CHECK_ZHANDLE(zkhid); - CHECK_ACLS(pyacl); - if (parse_acls(&aclv, pyacl) == 0) { - return NULL; - } - - void *pyw = NULL; - if (completion_callback != Py_None) { - pyw = create_pywatcher(zkhid, completion_callback, 0); - if (pyw == NULL) { - return NULL; - } - } - - int err = zoo_aset_acl( zhandles[zkhid], - path, - version, - &aclv, - void_completion_dispatch, - pyw); - free_acls(&aclv); - if (err != ZOK) { - PyErr_SetString(err_to_exception(err), zerror(err)); - return NULL; - } - return Py_BuildValue("i", err);; -} - -/* Asynchronous authorization addition, returns integer error code */ -PyObject *pyzoo_add_auth(PyObject *self, PyObject *args) -{ - int zkhid; - char *scheme, *cert; - int certLen; - PyObject *completion_callback; - - if (!PyArg_ParseTuple(args, "iss#O", &zkhid, &scheme, &cert, &certLen, - &completion_callback)) { - return NULL; - } - CHECK_ZHANDLE(zkhid); - - void *pyw = NULL; - if (completion_callback != Py_None) { - pyw = create_pywatcher(zkhid, completion_callback, 0); - if (pyw == NULL) { - return NULL; - } - } - - int err = zoo_add_auth( zhandles[zkhid], - scheme, - cert, - certLen, - void_completion_dispatch, - pyw); - if (err != ZOK) { - PyErr_SetString(err_to_exception(err), zerror(err)); - return NULL; - } - return Py_BuildValue("i", err); -} - -/* -------------------------------------------------------------------------- */ -/* Synchronous API implementation */ -/* -------------------------------------------------------------------------- */ - -/* Synchronous node creation, returns node path string */ -static PyObject *pyzoo_create(PyObject *self, PyObject *args) -{ - char *path; - int zkhid; - char* values; - int valuelen; - PyObject *acl = NULL; - int flags = 0; - char realbuf[256]; - const int maxbuf_len = 256; - if (!PyArg_ParseTuple(args, "iss#O|i",&zkhid, &path, &values, &valuelen,&acl,&flags)) - return NULL; - CHECK_ZHANDLE(zkhid); - struct ACL_vector aclv; - CHECK_ACLS(acl); - if (parse_acls(&aclv,acl) == 0) { - return NULL; - } - zhandle_t *zh = zhandles[zkhid]; - int err = zoo_create(zh, path, values, valuelen, &aclv, flags, realbuf, maxbuf_len); - free_acls(&aclv); - if (err != ZOK) { - PyErr_SetString(err_to_exception(err), zerror(err)); - return NULL; - } - - return Py_BuildValue("s", realbuf); -} - -/* Synchronous node deletion, returns integer error code */ -static PyObject *pyzoo_delete(PyObject *self, PyObject *args) -{ - int zkhid; - char *path; - int version = -1; - if (!PyArg_ParseTuple(args, "is|i",&zkhid,&path,&version)) - return NULL; - CHECK_ZHANDLE(zkhid); - zhandle_t *zh = zhandles[zkhid]; - int err = zoo_delete(zh, path, version); - if (err != ZOK) { - PyErr_SetString(err_to_exception(err), zerror(err)); - return NULL; - } - return Py_BuildValue("i", err); -} - -/* Synchronous node existance check, returns stat if exists, None if - absent */ -static PyObject *pyzoo_exists(PyObject *self, PyObject *args) -{ - int zkhid; char *path; PyObject *watcherfn = Py_None; - struct Stat stat; - if (!PyArg_ParseTuple(args, "is|O", &zkhid, &path, &watcherfn)) { - return NULL; - } - CHECK_ZHANDLE(zkhid); - zhandle_t *zh = zhandles[zkhid]; - pywatcher_t *pw = NULL; - void *callback = NULL; - if (watcherfn != Py_None) { - pw = create_pywatcher(zkhid, watcherfn,0); - callback = watcher_dispatch; - if (pw == NULL) { - return NULL; - } - } - int err = zoo_wexists(zh, path, callback, pw, &stat); - if (err != ZOK && err != ZNONODE) { - PyErr_SetString(err_to_exception(err), zerror(err)); - free_pywatcher(pw); - return NULL; - } - if (err == ZNONODE) { - Py_INCREF(Py_None); - return Py_None; // This isn't exceptional - } - return build_stat(&stat); -} - -/* Synchronous node child retrieval, returns list of children's path - as strings */ -static PyObject *pyzoo_get_children(PyObject *self, PyObject *args) -{ - int zkhid; - char *path; - PyObject *watcherfn = Py_None; - struct String_vector strings; - if (!PyArg_ParseTuple(args, "is|O", &zkhid, &path, &watcherfn)) { - return NULL; - } - CHECK_ZHANDLE(zkhid); - pywatcher_t *pw = NULL; - void *callback = NULL; - if (watcherfn != Py_None) { - pw = create_pywatcher( zkhid, watcherfn, 0 ); - callback = watcher_dispatch; - if (pw == NULL) { - return NULL; - } - } - int err = zoo_wget_children(zhandles[zkhid], path, - callback, - pw, &strings ); - - if (err != ZOK) { - PyErr_SetString(err_to_exception(err), zerror(err)); - free_pywatcher(pw); - return NULL; - } - - PyObject *ret = build_string_vector(&strings); - deallocate_String_vector(&strings); - return ret; -} - -/* Synchronous node data update, returns integer error code */ -static PyObject *pyzoo_set(PyObject *self, PyObject *args) -{ - int zkhid; - char *path; - char *buffer; - int buflen; - int version = -1; - if (!PyArg_ParseTuple(args, "iss#|i", &zkhid, &path, &buffer, &buflen, - &version)) { - return NULL; - } - CHECK_ZHANDLE(zkhid); - - int err = zoo_set(zhandles[zkhid], path, buffer, buflen, version); - if (err != ZOK) { - PyErr_SetString(err_to_exception(err), zerror(err)); - return NULL; - } - - return Py_BuildValue("i", err); -} - -/* Synchronous node data update, returns node's stat data structure */ -static PyObject *pyzoo_set2(PyObject *self, PyObject *args) -{ - int zkhid; - char *path; - char *buffer; - int buflen; - int version = -1; - if (!PyArg_ParseTuple(args, "iss#|i", &zkhid, &path, &buffer, &buflen, - &version)) { - return NULL; - } - CHECK_ZHANDLE(zkhid); - struct Stat stat; - int err = zoo_set2(zhandles[zkhid], path, buffer, buflen, version, &stat); - if (err != ZOK) { - PyErr_SetString(err_to_exception(err), zerror(err)); - return NULL; - } - - return build_stat(&stat); -} - -/* As per ZK documentation, datanodes are limited to 1Mb. Why not do a - stat followed by a get, to determine how big the buffer should be? - Because the znode may get updated between calls, so we can't - guarantee a complete get anyhow. */ -#define GET_BUFFER_SIZE 1024*1024 - -/* pyzoo_get has an extra parameter over the java/C equivalents. If - you set the fourth integer parameter buffer_len, we return - min(buffer_len, datalength) bytes. This is set by default to - GET_BUFFER_SIZE */ -static PyObject *pyzoo_get(PyObject *self, PyObject *args) -{ - int zkhid; - char *path; - char *buffer; - int buffer_len=GET_BUFFER_SIZE; - struct Stat stat; - PyObject *watcherfn = Py_None; - pywatcher_t *pw = NULL; - if (!PyArg_ParseTuple(args, "is|Oi", &zkhid, &path, &watcherfn, &buffer_len)) { - return NULL; - } - CHECK_ZHANDLE(zkhid); - if (watcherfn != Py_None) { - pw = create_pywatcher( zkhid, watcherfn,0 ); - if (pw == NULL) { - return NULL; - } - } - buffer = malloc(sizeof(char)*buffer_len); - if (buffer == NULL) { - free_pywatcher(pw); - PyErr_SetString(PyExc_MemoryError, "buffer could not be allocated in pyzoo_get"); - return NULL; - } - - int err = zoo_wget(zhandles[zkhid], path, - watcherfn != Py_None ? watcher_dispatch : NULL, - pw, buffer, - &buffer_len, &stat); - - if (err != ZOK) { - PyErr_SetString(err_to_exception(err), zerror(err)); - free_pywatcher(pw); - free(buffer); - return NULL; - } - - PyObject *stat_dict = build_stat( &stat ); - PyObject *ret = Py_BuildValue( "(s#,N)", buffer,buffer_len, stat_dict ); - free(buffer); - - return ret; -} - -/* Synchronous node ACL retrieval, returns list of ACLs */ -PyObject *pyzoo_get_acl(PyObject *self, PyObject *args) -{ - int zkhid; - char *path; - struct ACL_vector acl; - struct Stat stat; - if (!PyArg_ParseTuple(args, "is", &zkhid, &path)) - return NULL; - CHECK_ZHANDLE(zkhid); - int err = zoo_get_acl( zhandles[zkhid], path, &acl, &stat ); - if (err != ZOK) { - PyErr_SetString(err_to_exception(err), zerror(err)); - return NULL; - } - PyObject *pystat = build_stat( &stat ); - PyObject *acls = build_acls( &acl ); - PyObject *ret = Py_BuildValue( "(O,O)", pystat, acls ); - Py_DECREF(pystat); - Py_DECREF(acls); - return ret; -} - -/* Synchronous node ACL update, returns integer error code */ -PyObject *pyzoo_set_acl(PyObject *self, PyObject *args) -{ - int zkhid; - char *path; - int version; - PyObject *pyacls; - struct ACL_vector acl; - if (!PyArg_ParseTuple(args, "isiO", &zkhid, &path, &version, &pyacls)) { - return NULL; - } - CHECK_ZHANDLE(zkhid); - if (parse_acls(&acl, pyacls) == 0) { - return NULL; - } - int err = zoo_set_acl(zhandles[zkhid], path, version, &acl ); - free_acls(&acl); - if (err != ZOK) { - PyErr_SetString(err_to_exception(err), zerror(err)); - return NULL; - } - return Py_BuildValue("i", err);; -} - -/* -------------------------------------------------------------------------- */ -/* Session and context methods */ -/* -------------------------------------------------------------------------- */ - -/* Closes a connection, returns integer error code */ -PyObject *pyzoo_close(PyObject *self, PyObject *args) -{ - int zkhid, ret; - if (!PyArg_ParseTuple(args, "i", &zkhid)) { - return NULL; - } - CHECK_ZHANDLE(zkhid); - zhandle_t *handle = zhandles[zkhid]; - Py_BEGIN_ALLOW_THREADS - ret = zookeeper_close(handle); - Py_END_ALLOW_THREADS - zhandles[zkhid] = NULL; // The zk C client frees the zhandle - return Py_BuildValue("i", ret); -} - -/* Returns the ID of current client as a tuple (client_id, passwd) */ -PyObject *pyzoo_client_id(PyObject *self, PyObject *args) -{ - int zkhid; - if (!PyArg_ParseTuple(args, "i", &zkhid)) { - return NULL; - } - CHECK_ZHANDLE(zkhid); - const clientid_t *cid = zoo_client_id(zhandles[zkhid]); - return Py_BuildValue("(L,s)", cid->client_id, cid->passwd); -} - -/* DO NOT USE - context is used internally. This method is not exposed - in the Python module */ -PyObject *pyzoo_get_context(PyObject *self, PyObject *args) -{ - int zkhid; - if (!PyArg_ParseTuple(args, "i", &zkhid)) - return NULL; - CHECK_ZHANDLE(zkhid); - PyObject *context = NULL; - context = (PyObject*)zoo_get_context(zhandles[zkhid]); - if (context) return context; - Py_INCREF(Py_None); - return Py_None; -} - -/* DO NOT USE - context is used internally. This method is not exposed - in the Python module */ -PyObject *pyzoo_set_context(PyObject *self, PyObject *args) -{ - int zkhid; - PyObject *context; - if (!PyArg_ParseTuple(args, "iO", &zkhid, &context)) { - return NULL; - } - CHECK_ZHANDLE(zkhid); - PyObject *py_context = (PyObject*)zoo_get_context(zhandles[zkhid]); - if (py_context != NULL && py_context != Py_None) { - Py_DECREF(py_context); - } - Py_INCREF(context); - zoo_set_context(zhandles[zkhid], (void*)context); - Py_INCREF(Py_None); - return Py_None; -} - - -/* -------------------------------------------------------------------------- */ -/* Miscellaneous methods */ -/* -------------------------------------------------------------------------- */ - -/* Sets the global watcher. Returns None */ -PyObject *pyzoo_set_watcher(PyObject *self, PyObject *args) -{ - int zkhid; - PyObject *watcherfn; - if (!PyArg_ParseTuple(args, "iO", &zkhid, &watcherfn)) { - return NULL; - } - CHECK_ZHANDLE(zkhid); - pywatcher_t *pyw = watchers[zkhid]; - if (pyw != NULL) { - free_pywatcher( pyw ); - } - - // Create a *permanent* watcher object, not deallocated when called - pyw = create_pywatcher(zkhid, watcherfn,1); - if (pyw == NULL) { - return NULL; - } - watchers[zkhid] = pyw; - zoo_set_watcher(zhandles[zkhid], watcher_dispatch); - zoo_set_context(zhandles[zkhid], pyw); - Py_INCREF(Py_None); - return Py_None; -} - -/* Returns an integer code representing the current connection - state */ -PyObject *pyzoo_state(PyObject *self, PyObject *args) -{ - int zkhid; - if (!PyArg_ParseTuple(args,"i",&zkhid)) { - return NULL; - } - CHECK_ZHANDLE(zkhid); - int state = zoo_state(zhandles[zkhid]); - return Py_BuildValue("i",state); -} - - -/* Convert an integer error code into a string */ -PyObject *pyzerror(PyObject *self, PyObject *args) -{ - int rc; - if (!PyArg_ParseTuple(args,"i", &rc)) - return NULL; - return Py_BuildValue("s", zerror(rc)); -} - -/* Returns the integer receive timeout for a connection */ -PyObject *pyzoo_recv_timeout(PyObject *self, PyObject *args) -{ - int zkhid; - if (!PyArg_ParseTuple(args,"i",&zkhid)) - return NULL; - CHECK_ZHANDLE(zkhid); - int recv_timeout = zoo_recv_timeout(zhandles[zkhid]); - return Py_BuildValue("i",recv_timeout); -} - -/* Returns True if connection is unrecoverable, False otherwise */ -PyObject *pyis_unrecoverable(PyObject *self, PyObject *args) -{ - int zkhid; - if (!PyArg_ParseTuple(args,"i",&zkhid)) - return NULL; - CHECK_ZHANDLE(zkhid); - int ret = is_unrecoverable(zhandles[zkhid]); - if (ret == ZINVALIDSTATE) - Py_RETURN_TRUE; - Py_RETURN_FALSE; -} - -/* Set the debug level for logging, returns None */ -PyObject *pyzoo_set_debug_level(PyObject *self, PyObject *args) -{ - int loglevel; - if (!PyArg_ParseTuple(args, "i", &loglevel)) - return NULL; - zoo_set_debug_level((ZooLogLevel)loglevel); - Py_INCREF(Py_None); - return Py_None; -} - -static PyObject *log_stream = NULL; - -/* Set the output file-like object for logging output. Returns Py_None */ -PyObject *pyzoo_set_log_stream(PyObject *self, PyObject *args) -{ - PyObject *pystream = NULL; - if (!PyArg_ParseTuple(args,"O",&pystream)) { - PyErr_SetString(PyExc_ValueError, "Must supply a Python object to set_log_stream"); - return NULL; - } - -#if PY_MAJOR_VERSION >= 3 - extern PyTypeObject PyIOBase_Type; - if (!PyObject_IsInstance(pystream, (PyObject *)&PyIOBase_Type)) { -#else - if(!PyFile_Check(pystream)) { -#endif - - PyErr_SetString(PyExc_ValueError, "Must supply a file object to set_log_stream"); - return NULL; - } - /* Release the previous reference to log_stream that we took */ - if (log_stream != NULL) { - Py_DECREF(log_stream); - } - - log_stream = pystream; - Py_INCREF(log_stream); - -#if PY_MAJOR_VERSION >= 3 - int fd = PyObject_AsFileDescriptor(log_stream); - FILE *fp = fdopen(fd, "w"); -#else - FILE *fp = PyFile_AsFile(log_stream); -#endif - zoo_set_log_stream(fp); - - Py_INCREF(Py_None); - return Py_None; -} - -/* Set the connection order - randomized or in-order. Returns None. */ -PyObject *pyzoo_deterministic_conn_order(PyObject *self, PyObject *args) -{ - int yesOrNo; - if (!PyArg_ParseTuple(args, "i",&yesOrNo)) - return NULL; - zoo_deterministic_conn_order( yesOrNo ); - Py_INCREF(Py_None); - return Py_None; -} - -/* -------------------------------------------------------------------------- */ -/* Module setup */ -/* -------------------------------------------------------------------------- */ - -#include "pyzk_docstrings.h" - -static PyMethodDef ZooKeeperMethods[] = { - {"init", pyzookeeper_init, METH_VARARGS, pyzk_init_doc }, - {"create",pyzoo_create, METH_VARARGS, pyzk_create_doc }, - {"delete",pyzoo_delete, METH_VARARGS, pyzk_delete_doc }, - {"get_children", pyzoo_get_children, METH_VARARGS, pyzk_get_children_doc }, - {"set", pyzoo_set, METH_VARARGS, pyzk_set_doc }, - {"set2", pyzoo_set2, METH_VARARGS, pyzk_set2_doc }, - {"get",pyzoo_get, METH_VARARGS, pyzk_get_doc }, - {"exists",pyzoo_exists, METH_VARARGS, pyzk_exists_doc }, - {"get_acl", pyzoo_get_acl, METH_VARARGS, pyzk_get_acl_doc }, - {"set_acl", pyzoo_set_acl, METH_VARARGS, pyzk_set_acl_doc }, - {"close", pyzoo_close, METH_VARARGS, pyzk_close_doc }, - {"client_id", pyzoo_client_id, METH_VARARGS, pyzk_client_id_doc }, - {"set_watcher", pyzoo_set_watcher, METH_VARARGS }, - {"state", pyzoo_state, METH_VARARGS, pyzk_state_doc }, - {"recv_timeout",pyzoo_recv_timeout, METH_VARARGS }, - {"is_unrecoverable",pyis_unrecoverable, METH_VARARGS, pyzk_is_unrecoverable_doc }, - {"set_debug_level",pyzoo_set_debug_level, METH_VARARGS, pyzk_set_debug_level_doc }, - {"set_log_stream",pyzoo_set_log_stream, METH_VARARGS, pyzk_set_log_stream_doc }, - {"deterministic_conn_order",pyzoo_deterministic_conn_order, METH_VARARGS, pyzk_deterministic_conn_order_doc }, - {"acreate", pyzoo_acreate, METH_VARARGS, pyzk_acreate_doc }, - {"adelete", pyzoo_adelete, METH_VARARGS,pyzk_adelete_doc }, - {"aexists", pyzoo_aexists, METH_VARARGS,pyzk_aexists_doc }, - {"aget", pyzoo_aget, METH_VARARGS, pyzk_aget_doc }, - {"aset", pyzoo_aset, METH_VARARGS, pyzk_aset_doc }, - {"aget_children", pyzoo_aget_children, METH_VARARGS, pyzk_aget_children_doc }, - {"async", pyzoo_async, METH_VARARGS, pyzk_async_doc }, - {"aget_acl", pyzoo_aget_acl, METH_VARARGS, pyzk_aget_acl_doc }, - {"aset_acl", pyzoo_aset_acl, METH_VARARGS, pyzk_aset_acl_doc }, - {"zerror", pyzerror, METH_VARARGS, pyzk_zerror_doc }, - {"add_auth", pyzoo_add_auth, METH_VARARGS, pyzk_add_auth_doc }, - /* DO NOT USE get / set_context. Context is used internally to pass - the python watcher to a dispatch function. If you want context, set - it through set_watcher. */ - // {"get_context", pyzoo_get_context, METH_VARARGS, "" }, - // {"set_context", pyzoo_set_context, METH_VARARGS, "" }, - {NULL, NULL} -}; - -#if PY_MAJOR_VERSION >= 3 -static struct PyModuleDef zookeeper_moddef = { - PyModuleDef_HEAD_INIT, - "zookeeper", - NULL, - 0, - ZooKeeperMethods, - 0, - 0, - 0, - 0 -}; -#endif - -#define ADD_INTCONSTANT(x) PyModule_AddIntConstant(module, #x, ZOO_##x) -#define ADD_INTCONSTANTZ(x) PyModule_AddIntConstant(module, #x, Z##x) - -#define ADD_EXCEPTION(x) x = PyErr_NewException("zookeeper."#x, ZooKeeperException, NULL); \ - Py_INCREF(x); \ - PyModule_AddObject(module, #x, x); - -#if PY_MAJOR_VERSION >= 3 -PyMODINIT_FUNC PyInit_zookeeper(void) { -#else -PyMODINIT_FUNC initzookeeper(void) { -#endif - PyEval_InitThreads(); - -#if PY_MAJOR_VERSION >= 3 - PyObject *module = PyModule_Create(&zookeeper_moddef); -#else - PyObject *module = Py_InitModule("zookeeper", ZooKeeperMethods); -#endif - if (init_zhandles(32) == 0) { - return; // TODO: Is there any way to raise an exception here? - } - - ZooKeeperException = PyErr_NewException("zookeeper.ZooKeeperException", - PyExc_Exception, - NULL); - - PyModule_AddObject(module, "ZooKeeperException", ZooKeeperException); - Py_INCREF(ZooKeeperException); - - int size = 10; - char version_str[size]; - snprintf(version_str, size, "%i.%i.%i", ZOO_MAJOR_VERSION, ZOO_MINOR_VERSION, ZOO_PATCH_VERSION); - - PyModule_AddStringConstant(module, "__version__", version_str); - - ADD_INTCONSTANT(PERM_READ); - ADD_INTCONSTANT(PERM_WRITE); - ADD_INTCONSTANT(PERM_CREATE); - ADD_INTCONSTANT(PERM_DELETE); - ADD_INTCONSTANT(PERM_ALL); - ADD_INTCONSTANT(PERM_ADMIN); - - ADD_INTCONSTANT(EPHEMERAL); - ADD_INTCONSTANT(SEQUENCE); - - ADD_INTCONSTANT(EXPIRED_SESSION_STATE); - ADD_INTCONSTANT(AUTH_FAILED_STATE); - ADD_INTCONSTANT(CONNECTING_STATE); - ADD_INTCONSTANT(ASSOCIATING_STATE); - ADD_INTCONSTANT(CONNECTED_STATE); - - ADD_INTCONSTANT(CREATED_EVENT); - ADD_INTCONSTANT(DELETED_EVENT); - ADD_INTCONSTANT(CHANGED_EVENT); - ADD_INTCONSTANT(CHILD_EVENT); - ADD_INTCONSTANT(SESSION_EVENT); - ADD_INTCONSTANT(NOTWATCHING_EVENT); - - ADD_INTCONSTANT(LOG_LEVEL_ERROR); - ADD_INTCONSTANT(LOG_LEVEL_WARN); - ADD_INTCONSTANT(LOG_LEVEL_INFO); - ADD_INTCONSTANT(LOG_LEVEL_DEBUG); - - ADD_INTCONSTANTZ(SYSTEMERROR); - ADD_INTCONSTANTZ(RUNTIMEINCONSISTENCY); - ADD_INTCONSTANTZ(DATAINCONSISTENCY); - ADD_INTCONSTANTZ(CONNECTIONLOSS); - ADD_INTCONSTANTZ(MARSHALLINGERROR); - ADD_INTCONSTANTZ(UNIMPLEMENTED); - ADD_INTCONSTANTZ(OPERATIONTIMEOUT); - ADD_INTCONSTANTZ(BADARGUMENTS); - ADD_INTCONSTANTZ(INVALIDSTATE); - - ADD_EXCEPTION(SystemErrorException); - ADD_EXCEPTION(RuntimeInconsistencyException); - ADD_EXCEPTION(DataInconsistencyException); - ADD_EXCEPTION(ConnectionLossException); - ADD_EXCEPTION(MarshallingErrorException); - ADD_EXCEPTION(UnimplementedException); - ADD_EXCEPTION(OperationTimeoutException); - ADD_EXCEPTION(BadArgumentsException); - ADD_EXCEPTION(InvalidStateException); - - ADD_INTCONSTANTZ(OK); - ADD_INTCONSTANTZ(APIERROR); - ADD_INTCONSTANTZ(NONODE); - ADD_INTCONSTANTZ(NOAUTH); - ADD_INTCONSTANTZ(BADVERSION); - ADD_INTCONSTANTZ(NOCHILDRENFOREPHEMERALS); - ADD_INTCONSTANTZ(NODEEXISTS); - ADD_INTCONSTANTZ(NOTEMPTY); - ADD_INTCONSTANTZ(SESSIONEXPIRED); - ADD_INTCONSTANTZ(INVALIDCALLBACK); - ADD_INTCONSTANTZ(INVALIDACL); - ADD_INTCONSTANTZ(AUTHFAILED); - ADD_INTCONSTANTZ(CLOSING); - ADD_INTCONSTANTZ(NOTHING); - ADD_INTCONSTANTZ(SESSIONMOVED); - - ADD_EXCEPTION(ApiErrorException); - ADD_EXCEPTION(NoNodeException); - ADD_EXCEPTION(NoAuthException); - ADD_EXCEPTION(BadVersionException); - ADD_EXCEPTION(NoChildrenForEphemeralsException); - ADD_EXCEPTION(NodeExistsException); - ADD_EXCEPTION(NotEmptyException); - ADD_EXCEPTION(SessionExpiredException); - ADD_EXCEPTION(InvalidCallbackException); - ADD_EXCEPTION(InvalidACLException); - ADD_EXCEPTION(AuthFailedException); - ADD_EXCEPTION(ClosingException); - ADD_EXCEPTION(NothingException); - ADD_EXCEPTION(SessionMovedException); - -#if PY_MAJOR_VERSION >= 3 - return module; -#endif -} diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/zkpython/src/examples/README b/pkg/registry/zookeeper-3.4.6/src/contrib/zkpython/src/examples/README deleted file mode 100644 index 3c5345425..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/contrib/zkpython/src/examples/README +++ /dev/null @@ -1,8 +0,0 @@ - -This folder contains sample showing how you can use ZooKeeper from Python. - -You should also check the following projects: - -* http://github.com/phunt/zk-smoketest -* http://github.com/henryr/pyzk-recipes - diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/zkpython/src/examples/watch_znode_for_changes.py b/pkg/registry/zookeeper-3.4.6/src/contrib/zkpython/src/examples/watch_znode_for_changes.py deleted file mode 100644 index 07100f020..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/contrib/zkpython/src/examples/watch_znode_for_changes.py +++ /dev/null @@ -1,202 +0,0 @@ -#!/usr/bin/env python2.6 -# Licensed to the Apache Software Foundation (ASF) under one -# or more contributor license agreements. See the NOTICE file -# distributed with this work for additional information -# regarding copyright ownership. The ASF licenses this file -# to you 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. -""" ZNode Change Watcher Skeleton Script - -This script shows you how to write a python program that watches a specific -znode for changes and reacts to them. - -Steps to understand how this script works: - -1. start a standalone ZooKeeper server (by default it listens on localhost:2181) - -Did you know you can deploy "local clusters" by using zkconf[1]? -[1] http://github.com/phunt/zkconf - -2. enter the command line console - -3. create the test node: - [zk: (CONNECTED) 1] create /watch-test dummy-data - Created /watch-test - -4. in another shell start this script in verbose mode - $ python watch_znode_for_changes.py -v - - # you should see a lot of log messages. have a look over them because - # you can easily understand how zookeeper works - -5. update the node data: - - [zk: (CONNECTED) 2] set /watch-test new-data - cZxid = 0xa0000001a - ctime = Fri Jul 09 19:14:45 EEST 2010 - mZxid = 0xa0000001e - mtime = Fri Jul 09 19:18:18 EEST 2010 - pZxid = 0xa0000001a - cversion = 0 - dataVersion = 1 - aclVersion = 0 - ephemeralOwner = 0x0 - dataLength = 8 - numChildren = 0 - - ... and you should see similar log messages: - - 2010-07-09 19:18:18,537:11542(0xb6ea5b70):ZOO_DEBUG@process_completions@1765: Calling a watcher for node [/watch-test], type = -1 event=ZOO_CHANGED_EVENT - 2010-07-09 19:18:18,537 watch_znode_for_changes.py:83 - Running watcher: zh=0 event=3 state=3 path=/watch-test - 2010-07-09 19:18:18,537:11542(0xb6ea5b70):ZOO_DEBUG@zoo_awget@2400: Sending request xid=0x4c374b33 for path [/watch-test] to 127.0.0.1:2181 - 2010-07-09 19:18:18,545:11542(0xb76a6b70):ZOO_DEBUG@zookeeper_process@1980: Queueing asynchronous response - 2010-07-09 19:18:18,545:11542(0xb6ea5b70):ZOO_DEBUG@process_completions@1772: Calling COMPLETION_DATA for xid=0x4c374b33 rc=0 - 2010-07-09 19:18:18,545 watch_znode_for_changes.py:54 - This is where your application does work. - - You can repeat this step multiple times. - -6. that's all. in the end you can delete the node and you should see a ZOO_DELETED_EVENT - -""" - -import logging -import logging.handlers -import signal -import sys -import time -import threading -import zookeeper - -from optparse import OptionParser - -logger = logging.getLogger() - -class MyClass(threading.Thread): - znode = '/watch-test' - - def __init__(self, options, args): - threading.Thread.__init__(self) - - logger.debug('Initializing MyClass thread.') - if options.verbose: - zookeeper.set_debug_level(zookeeper.LOG_LEVEL_DEBUG) - - self.zh = zookeeper.init(options.servers) - if zookeeper.OK != zookeeper.aget(self.zh, self.znode, - self.watcher, self.handler): - logger.critical('Unable to get znode! Exiting.') - sys.exit(1) - - def __del__(self): - zookeeper.close(self.zh) - - def aget(self): - return zookeeper.aget(self.zh, self.znode, self.watcher, self.handler) - - def handler(self, zh, rc, data, stat): - """Handle zookeeper.aget() responses. - - This code handles the zookeeper.aget callback. It does not handle watches. - - Numeric arguments map to constants. See ``DATA`` in ``help(zookeeper)`` - for more information. - - Args: - zh Zookeeper handle that made this request. - rc Return code. - data Data stored in the znode. - - Does not provide a return value. - """ - if zookeeper.OK == rc: - logger.debug('This is where your application does work.') - else: - if zookeeper.NONODE == rc: - # avoid sending too many requests if the node does not yet exists - logger.info('Node not found. Trying again to set the watch.') - time.sleep(1) - - if zookeeper.OK != self.aget(): - logger.critical('Unable to get znode! Exiting.') - sys.exit(1) - - def watcher(self, zh, event, state, path): - """Handle zookeeper.aget() watches. - - This code is called when a znode changes and triggers a data watch. - It is not called to handle the zookeeper.aget call itself. - - Numeric arguments map to constants. See ``DATA`` in ``help(zookeeper)`` - for more information. - - Args: - zh Zookeeper handle that set this watch. - event Event that caused the watch (often called ``type`` elsewhere). - state Connection state. - path Znode that triggered this watch. - - Does not provide a return value. - """ - out = ['Running watcher:', - 'zh=%d' % zh, - 'event=%d' % event, - 'state=%d' % state, - 'path=%s' % path] - logger.debug(' '.join(out)) - if event == zookeeper.CHANGED_EVENT and \ - state == zookeeper.CONNECTED_STATE and \ - self.znode == path: - if zookeeper.OK != self.aget(): - logger.critical('Unable to get znode! Exiting.') - sys.exit(1) - - def run(self): - while True: - time.sleep(86400) - - -def main(argv=None): - # Allow Ctrl-C - signal.signal(signal.SIGINT, signal.SIG_DFL) - - parser = OptionParser() - parser.add_option('-v', '--verbose', - dest='verbose', - default=False, - action='store_true', - help='Verbose logging. (default: %default)') - parser.add_option('-s', '--servers', - dest='servers', - default='localhost:2181', - help='Comma-separated list of host:port pairs. (default: %default)') - - (options, args) = parser.parse_args() - - if options.verbose: - logger.setLevel(logging.DEBUG) - else: - logger.setLevel(logging.INFO) - - formatter = logging.Formatter("%(asctime)s %(filename)s:%(lineno)d - %(message)s") - stream_handler = logging.StreamHandler() - stream_handler.setFormatter(formatter) - logger.addHandler(stream_handler) - - logger.info('Starting Zookeeper python example: %s' % ' '.join(sys.argv)) - - mc = MyClass(options, args) - mc.start() - mc.join() - - -if __name__ == '__main__': - main() diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/zkpython/src/packages/deb/zkpython.control/control b/pkg/registry/zookeeper-3.4.6/src/contrib/zkpython/src/packages/deb/zkpython.control/control deleted file mode 100644 index 6ec76d069..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/contrib/zkpython/src/packages/deb/zkpython.control/control +++ /dev/null @@ -1,23 +0,0 @@ -# Licensed to the Apache Software Foundation (ASF) under one or more -# contributor license agreements. See the NOTICE file distributed with -# this work for additional information regarding copyright ownership. -# The ASF licenses this file to You 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. -Package: zkpython -Version: @version@ -Section: misc -Priority: optional -Architecture: all -Depends: python -Maintainer: Apache Software Foundation -Description: ZooKeeper python binding library -Distribution: development diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/zkpython/src/packages/rpm/spec/zkpython.spec b/pkg/registry/zookeeper-3.4.6/src/contrib/zkpython/src/packages/rpm/spec/zkpython.spec deleted file mode 100644 index d1f981431..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/contrib/zkpython/src/packages/rpm/spec/zkpython.spec +++ /dev/null @@ -1,81 +0,0 @@ -# Licensed to the Apache Software Foundation (ASF) under one or more -# contributor license agreements. See the NOTICE file distributed with -# this work for additional information regarding copyright ownership. -# The ASF licenses this file to You 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. - -# -# RPM Spec file for ZooKeeper version @version@ -# - -%define name zkpython -%define version @version@ -%define release @package.release@ - -# Installation Locations -%define _prefix @package.prefix@ - -# Build time settings -%define _build_dir @package.build.dir@ -%define _final_name @final.name@ -%define _python_lib @python.lib@ -%define debug_package %{nil} - -# Disable brp-java-repack-jars for aspect J -%define __os_install_post \ - /usr/lib/rpm/redhat/brp-compress \ - %{!?__debug_package:/usr/lib/rpm/redhat/brp-strip %{__strip}} \ - /usr/lib/rpm/redhat/brp-strip-static-archive %{__strip} \ - /usr/lib/rpm/redhat/brp-strip-comment-note %{__strip} %{__objdump} \ - /usr/lib/rpm/brp-python-bytecompile %{nil} - -# RPM searches perl files for dependancies and this breaks for non packaged perl lib -# like thrift so disable this -%define _use_internal_dependency_generator 0 - -Summary: ZooKeeper python binding library -Group: Development/Libraries -License: Apache License, Version 2.0 -URL: http://zookeeper.apache.org/ -Vendor: Apache Software Foundation -Name: %{name} -Version: %{version} -Release: %{release} -Source0: %{_python_lib} -Prefix: %{_prefix} -Requires: zookeeper-lib == %{version} -AutoReqProv: no -Provides: zkpython - -%description -ZooKeeper python binding library - -%prep -tar fxz %{_python_lib} -C %{_build_dir} - -%build - -######################### -#### INSTALL SECTION #### -######################### -%install - -%pre - -%post - -%preun - -%files -%defattr(-,root,root) -%{_prefix} - diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/zkpython/src/python/setup.py b/pkg/registry/zookeeper-3.4.6/src/contrib/zkpython/src/python/setup.py deleted file mode 100644 index c6a1ceefb..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/contrib/zkpython/src/python/setup.py +++ /dev/null @@ -1,36 +0,0 @@ -# Licensed to the Apache Software Foundation (ASF) under one -# or more contributor license agreements. See the NOTICE file -# distributed with this work for additional information -# regarding copyright ownership. The ASF licenses this file -# to you 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. - -from distutils.core import setup, Extension - -zookeeper_basedir = "../../../" - -zookeepermodule = Extension("zookeeper", - sources=["src/c/zookeeper.c"], - include_dirs=[zookeeper_basedir + "/src/c/include", - zookeeper_basedir + "/build/c", - zookeeper_basedir + "/src/c/generated"], - libraries=["zookeeper_mt"], - library_dirs=[zookeeper_basedir + "/src/c/.libs/", - zookeeper_basedir + "/build/c/.libs/", - zookeeper_basedir + "/build/test/test-cppunit/.libs", - "/usr/local/lib" - ]) - -setup( name="ZooKeeper", - version = "0.4", - description = "ZooKeeper Python bindings", - ext_modules=[zookeepermodule] ) diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/zkpython/src/python/zk.py b/pkg/registry/zookeeper-3.4.6/src/contrib/zkpython/src/python/zk.py deleted file mode 100644 index 9c0f37482..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/contrib/zkpython/src/python/zk.py +++ /dev/null @@ -1,76 +0,0 @@ -# Licensed to the Apache Software Foundation (ASF) under one -# or more contributor license agreements. See the NOTICE file -# distributed with this work for additional information -# regarding copyright ownership. The ASF licenses this file -# to you 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. - -import zookeeper, time, threading - -f = open("out.log","w") -zookeeper.set_log_stream(f) - -connected = False -conn_cv = threading.Condition( ) - -def my_connection_watcher(handle,type,state,path): - global connected, conn_cv - print("Connected, handle is ", handle) - conn_cv.acquire() - connected = True - conn_cv.notifyAll() - conn_cv.release() - -conn_cv.acquire() -print("Connecting to localhost:2181 -- ") -handle = zookeeper.init("localhost:2181", my_connection_watcher, 10000, 0) -while not connected: - conn_cv.wait() -conn_cv.release() - -def my_getc_watch( handle, type, state, path ): - print("Watch fired -- ") - print(type, state, path) - -ZOO_OPEN_ACL_UNSAFE = {"perms":0x1f, "scheme":"world", "id" :"anyone"}; - -try: - zookeeper.create(handle, "/zk-python", "data", [ZOO_OPEN_ACL_UNSAFE], 0) - zookeeper.get_children(handle, "/zk-python", my_getc_watch) - for i in xrange(5): - print("Creating sequence node ", i, " ", zookeeper.create(handle, "/zk-python/sequencenode", "data", [ZOO_OPEN_ACL_UNSAFE], zookeeper.SEQUENCE )) -except: - pass - -def pp_zk(handle,root, indent = 0): - """Pretty print(a zookeeper tree, starting at root""") - def make_path(child): - if root == "/": - return "/" + child - return root + "/" + child - children = zookeeper.get_children(handle, root, None) - out = "" - for i in xrange(indent): - out += "\t" - out += "|---"+root + " :: " + zookeeper.get(handle, root, None)[0] - print(out) - for child in children: - pp_zk(handle,make_path(child),indent+1) - -print("ZNode tree -- ") -pp_zk(handle,"/") - -print("Getting ACL / Stat for /zk-python --") -(stat, acl) = zookeeper.get_acl(handle, "/zk-python") -print("Stat:: ", stat) -print("Acl:: ", acl) - diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/zktreeutil/Makefile.am b/pkg/registry/zookeeper-3.4.6/src/contrib/zktreeutil/Makefile.am deleted file mode 100644 index 36da1a50d..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/contrib/zktreeutil/Makefile.am +++ /dev/null @@ -1,4 +0,0 @@ -## Process this file with automake to produce Makefile.in - -SUBDIRS = src - diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/zktreeutil/README.txt b/pkg/registry/zookeeper-3.4.6/src/contrib/zktreeutil/README.txt deleted file mode 100644 index 43b06fa72..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/contrib/zktreeutil/README.txt +++ /dev/null @@ -1,74 +0,0 @@ -========================================== -zktreeutil - Zookeeper Tree Data Utility -Author: Anirban Roy -Organization: Yahoo Inc. -========================================== - -zktreeutil program is intended to manage and manipulate zk-tree data quickly, effi- -ciently and with ease. The utility operates on free-form ZK-tree and hence can be used -for any cluster managed by Zookeeper. Here are the basic functionalities - - -EXPORT: The whole/partial ZK-tree is exported into a XML file. This helps in -capturing a current snapshot of the data for backup/analysis. For a subtree -export, one need to specify the path to the ZK-subtree with proper option. - -IMPORT: The ZK-tree can be imported from XML into ZK cluster. This helps in priming -the new ZK cluster with static configuration. The import can be non-intrusive by -making only the additions in the existing data. The import of subtree is also -possible by optionally providing the path to the ZK-subtree. - -DIFF: Creates a diff between live ZK data vs data saved in XML file. Diff can ignore -some ZK-tree branches (possibly dynamic data) on reading the optional ignore flag -from XML file. Diffing on a ZK-subtree achieved by providing path to ZK-subtree with -diff command. - -UPDATE: Make the incremental changes into the live ZK-tree from saved XML, essentia- -lly after running the diff. - -DUMP: Dumps the ZK-tree on the standard output device reading either from live ZK -server or XML file. Like export, ZK-subtree can be dumped with optionaly -providing the path to the ZK-subtree, and till a certain depth of the (sub)tree. - -The exported ZK data into XML file can be shortened by only keeping the static ZK -nodes which are required to prime a cluster. The dynamic zk nodes (created on-the- -fly) can be ignored by setting a 'ignore' attribute at the root node of the dynamic -subtree (see tests/zk_sample.xml), possibly deleting all inner ZK nodes under that. -Once ignored, the whole subtree is ignored during DIFF, UPDATE and WRITE. - -Pre-requisites --------------- -1. Linux system with 2.6.X kernel. -2. Zookeeper C client library (locally built at ../../c/.libs) >= 3.X.X -3. Development build libraries (rpm packages): - a. boost-devel >= 1.32.0 - b. libxml2-devel >= 2.7.3 - c. log4cxx0100-devel >= 0.10.0 - -Build instructions ------------------- -1. cd into this directory -2. autoreconf -if -3. ./configure -4. make -5. 'zktreeutil' binary created under src directory - -Limitations ------------ -Current version works with text data only, binary data will be supported in future -versions. - -Testing and usage of zktreeutil --------------------------------- -1. Run Zookeeper server locally on port 2181 -2. export LD_LIBRARY_PATH=../../c/.libs/:/usr/local/lib/ -3. ./src/zktreeutil --help # show help -4. ./src/zktreeutil --zookeeper=localhost:2181 --import --xmlfile=tests/zk_sample.xml 2>/dev/null # import sample ZK tree -5. ./src/zktreeutil --zookeeper=localhost:2181 --dump --path=/myapp/version-1.0 2>/dev/null # dump Zk subtree -5. ./src/zktreeutil --zookeeper=localhost:2181 --dump --depth=3 2>/dev/null # dump Zk tree till certain depth -6. ./src/zktreeutil --xmlfile=zk_sample.xml -D 2>/dev/null # dump the xml data -7. Change zk_sample.xml with adding/deleting/chaging some nodes -8. ./src/zktreeutil -z localhost:2181 -F -x zk_sample.xml -p /myapp/version-1.0/configuration 2>/dev/null # take a diff of changes -9. ./src/zktreeutil -z localhost:2181 -E 2>/dev/null > zk_sample2.xml # export the mofied ZK tree -10. ./src/zktreeutil -z localhost:2181 -U -x zk_sample.xml -p /myapp/version-1.0/distributions 2>/dev/null # update with incr. changes -11. ./src/zktreeutil --zookeeper=localhost:2181 --import --force --xmlfile=zk_sample2.xml 2>/dev/null # re-prime the ZK tree - diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/zktreeutil/build.xml b/pkg/registry/zookeeper-3.4.6/src/contrib/zktreeutil/build.xml deleted file mode 100644 index 809d134ec..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/contrib/zktreeutil/build.xml +++ /dev/null @@ -1,61 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/zktreeutil/configure.ac b/pkg/registry/zookeeper-3.4.6/src/contrib/zktreeutil/configure.ac deleted file mode 100644 index b4a82a76a..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/contrib/zktreeutil/configure.ac +++ /dev/null @@ -1,66 +0,0 @@ -# -*- Autoconf -*- -# Process this file with autoconf to produce a configure script. - -AC_PREREQ(2.59) - -AC_INIT([zktreeutil], [1.0.0]) -AM_INIT_AUTOMAKE(foreign) - -AC_CONFIG_SRCDIR([src]) -AM_CONFIG_HEADER([config.h]) - -PACKAGE=zktreeutil -VERSION=1.0.0 - -AC_SUBST(PACKAGE) -AC_SUBST(VERSION) -BUILD_PATH="`pwd`" - -# Checks for programs. -AC_LANG_CPLUSPLUS -AC_PROG_CXX - -# Checks for libxm2. -AM_PATH_XML2(2.7.3) -XML2_INCLUDE="/usr/include/libxml2" -AC_SUBST(XML2_INCLUDE) - -# Zookeeper C client -ZOOKEEPER_PATH=${BUILD_PATH}/../../c -AC_CHECK_LIB(zookeeper_mt, main, [ZOOKEEPER="-L${ZOOKEEPER_PATH}/.libs -lzookeeper_mt"],,["-L${ZOOKEEPER_PATH}/.libs"]) -if test -z "${ZOOKEEPER}"; then - AC_ERROR("... zookeeper C client not found!") -fi - -AC_SUBST(ZOOKEEPER) -AC_SUBST(ZOOKEEPER_PATH) - -### log4cxx ### - -LOG4CXX_VERSION="0.10.0" -LOG4CXX_INCLUDE="/usr/local/include" -LOG4CXX_LIB_PATH="/usr/local/lib" -AC_CHECK_LIB(log4cxx, main, [LOG4CXX="-L${LOG4CXX_LIB_PATH} -llog4cxx"],,["-L${LOG4CXX_LIB_PATH}"]) -if test -z "${LOG4CXX}"; then - AC_ERROR("... log4cxx not found!") -fi - -AC_SUBST(LOG4CXX) -AC_SUBST(LOG4CXX_VERSION) -AC_SUBST(LOG4CXX_INCLUDE) - -# Checks for header files. -AC_HEADER_DIRENT -AC_HEADER_STDC -AC_CHECK_HEADERS([stdlib.h string.h stdio.h unistd.h boost/shared_ptr.hpp boost/algorithm/string.hpp boost/algorithm/string/split.hpp]) - -# Checks for typedefs, structures, and compiler characteristics. -AC_HEADER_STDBOOL -AC_C_CONST -AC_C_INLINE -AC_TYPE_SIZE_T -AC_C_VOLATILE - -AC_CONFIG_FILES([Makefile]) -AC_CONFIG_FILES([src/Makefile]) -AC_OUTPUT diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/zktreeutil/src/Makefile.am b/pkg/registry/zookeeper-3.4.6/src/contrib/zktreeutil/src/Makefile.am deleted file mode 100644 index 641077a88..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/contrib/zktreeutil/src/Makefile.am +++ /dev/null @@ -1,24 +0,0 @@ -# Licensed to the Apache Software Foundation (ASF) under one -# or more contributor license agreements. See the NOTICE file -# distributed with this work for additional information -# regarding copyright ownership. The ASF licenses this file -# to you 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. - -AM_CXXFLAGS = -I${ZOOKEEPER_PATH}/include -I${ZOOKEEPER_PATH}/generated \ - -I$(top_srcdir)/include -I${LOG4CXX_INCLUDE} -I/usr/include \ - -I${XML2_INCLUDE} - -bin_PROGRAMS = zktreeutil - -zktreeutil_SOURCES = ZkAdaptor.cc ZkTreeUtil.cc ZkTreeUtilMain.cc -zktreeutil_LDADD = ${ZOOKEEPER} ${XML_LIBS} ${LOG4CXX} diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/zktreeutil/src/SimpleTree.h b/pkg/registry/zookeeper-3.4.6/src/contrib/zktreeutil/src/SimpleTree.h deleted file mode 100644 index 8226f05c9..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/contrib/zktreeutil/src/SimpleTree.h +++ /dev/null @@ -1,150 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you 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. - */ - -#ifndef __SIMPLE_TREE_H__ -#define __SIMPLE_TREE_H__ - -#include -#include - -namespace zktreeutil -{ - using std::vector; - - /** - * \brief A simple tree data-structure template. - */ - template < class KeyType, class DataType > class SimpleTreeNode - { - private: - /** - * \brief The type representing simple-tree node smart-pointer. - */ - typedef boost::shared_ptr< SimpleTreeNode< KeyType, DataType > > SimpleTreeNodeSptr; - - public: - /** - * \brief Constructor. - * - * @param isRoot the flag indicating whether the node is root. - */ - SimpleTreeNode (bool isRoot=false) : isRoot_(isRoot) - { - } - - /** - * \brief Constructor. - * - * @param key the key stored at the tree node - * @param isRoot the flag indicating whether the node is root - */ - SimpleTreeNode (const KeyType& key, bool isRoot=false) : - isRoot_(isRoot), key_(key) - { - } - - /** - * \brief Constructor. - * - * @param key the key stored at the tree node - * @param val the value stored at the tree node - * @param isRoot the flag indicating whether the node is root - */ - SimpleTreeNode (const KeyType& key, const DataType& val, bool isRoot=false) : - isRoot_(isRoot), key_(key), val_(val) - { - } - - /** - * \brief Destructor. - */ - ~SimpleTreeNode () throw() {} - - /** - * \brief Add a child node to this node. - * - * @param node the child node to be added - */ - void addChild (const SimpleTreeNodeSptr node) { children_.push_back (node); } - - /** - * \brief Sets the key of this node. - * - * @param key the key to be set - */ - void setKey (const KeyType& key) { key_ = key; } - - /** - * \brief Sets the data of this node. - * - * @param val the value to be set - */ - void setData (const DataType& val) { val_ = val; } - - /** - * \brief Gets the key of this node. - * - * @return the key of this node - */ - KeyType getKey () const { return key_; } - - /** - * \brief Gets the data of this node. - * - * @return the value of this node - */ - DataType getData () const { return val_; } - - /** - * \brief Gets the i'th of this node. - * - * @param idx the index of the child node - * @return the child node - */ - SimpleTreeNodeSptr getChild (unsigned idx) const { return children_[idx]; } - - /** - * \brief Gets the number of children of this node. - * - * @return the number of children - */ - unsigned numChildren () const { return children_.size(); } - - /** - * \brief Indicates whether this node is root. - * - * @return 'true' if this node is root, 'false' otherwise - */ - bool isRoot () const { return isRoot_; } - - /** - * \brief Indicates whether this node is leaf node. - * - * @return 'true' if this node is leaf node, 'false' otherwise - */ - bool isLeaf () const { return !numChildren(); } - - private: - bool isRoot_; // Flag indicates if the node is root - KeyType key_; // Key of this node - DataType val_; // Value of this node - vector< SimpleTreeNodeSptr > children_; // List of children of this node - }; -} - -#endif // __SIMPLE_TREE_H__ diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/zktreeutil/src/ZkAdaptor.cc b/pkg/registry/zookeeper-3.4.6/src/contrib/zktreeutil/src/ZkAdaptor.cc deleted file mode 100644 index baec8f9b0..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/contrib/zktreeutil/src/ZkAdaptor.cc +++ /dev/null @@ -1,513 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you 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. - */ - -#include "ZkAdaptor.h" -#include -#include -#include -#include -#include - -// Logger -static log4cxx::LoggerPtr zkLoggerPtr = log4cxx::Logger::getLogger ("zookeeper.core"); - -namespace zktreeutil -{ - /** - * \brief This class provides logic for checking if a request can be retried. - */ - class RetryHandler - { - public: - RetryHandler(const ZooKeeperConfig &zkConfig) : m_zkConfig(zkConfig) - { - if (zkConfig.getAutoReconnect()) - retries = 2; - else - retries = 0; - } - - /** - * \brief Attempts to fix a side effect of the given RC. - * - * @param rc the ZK error code - * @return whether the error code has been handled and the caller should - * retry an operation the caused this error - */ - bool handleRC(int rc) - { - //check if the given error code is recoverable - if (!retryOnError(rc)) - return false; - - std::cerr << "[zktreeuti] Number of retries left: " << retries << std::endl; - if (retries-- > 0) - return true; - else - return false; - } - - private: - /** - * The ZK config. - */ - const ZooKeeperConfig &m_zkConfig; - - /** - * The number of outstanding retries. - */ - int retries; - - /** - * Checks whether the given error entitles this adapter - * to retry the previous operation. - * - * @param zkErrorCode one of the ZK error code - */ - static bool retryOnError(int zkErrorCode) - { - return (zkErrorCode == ZCONNECTIONLOSS || zkErrorCode == ZOPERATIONTIMEOUT); - } - }; - - - // ======================================================================= - - ZooKeeperAdapter::ZooKeeperAdapter(ZooKeeperConfig config) throw(ZooKeeperException) : - m_zkConfig(config), - mp_zkHandle(NULL) - { - // Enforce setting up appropriate ZK log level - if (zkLoggerPtr->isDebugEnabled() -#ifdef LOG4CXX_TRACE - || zkLoggerPtr->isTraceEnabled() -#endif - ) - { - zoo_set_debug_level( ZOO_LOG_LEVEL_DEBUG ); - } else if (zkLoggerPtr->isInfoEnabled()) { - zoo_set_debug_level( ZOO_LOG_LEVEL_INFO ); - } else if (zkLoggerPtr->isWarnEnabled()) { - zoo_set_debug_level( ZOO_LOG_LEVEL_WARN ); - } else { - zoo_set_debug_level( ZOO_LOG_LEVEL_ERROR ); - } - - // Establish the connection - reconnect(); - } - - ZooKeeperAdapter::~ZooKeeperAdapter() - { - try - { - disconnect(); - } - catch (std::exception &e) - { - std::cerr << "[zktreeutil] An exception while disconnecting from ZK: " - << e.what() - << std::endl; - } - } - - void ZooKeeperAdapter::validatePath(const string &path) throw(ZooKeeperException) - { - if (path.find ("/") != 0) - { - std::ostringstream oss; - oss << "Node path must start with '/' but" "it was '" - << path - << "'"; - throw ZooKeeperException (oss.str()); - } - if (path.length() > 1) - { - if (path.rfind ("/") == path.length() - 1) - { - std::ostringstream oss; - oss << "Node path must not end with '/' but it was '" - << path - << "'"; - throw ZooKeeperException (oss.str()); - } - if (path.find( "//" ) != string::npos) - { - std::ostringstream oss; - oss << "Node path must not contain '//' but it was '" - << path - << "'"; - throw ZooKeeperException (oss.str()); - } - } - } - - void ZooKeeperAdapter::disconnect() - { - if (mp_zkHandle != NULL) - { - zookeeper_close (mp_zkHandle); - mp_zkHandle = NULL; - } - } - - void ZooKeeperAdapter::reconnect() throw(ZooKeeperException) - { - // Clear the connection state - disconnect(); - - // Establish a new connection to ZooKeeper - mp_zkHandle = zookeeper_init( m_zkConfig.getHosts().c_str(), - NULL, - m_zkConfig.getLeaseTimeout(), - 0, - NULL, - 0); - if (mp_zkHandle == NULL) - { - // Invalid handle returned - std::ostringstream oss; - oss << "Unable to connect to ZK running at '" - << m_zkConfig.getHosts() - << "'"; - throw ZooKeeperException (oss.str()); - } - - // Enter into connect loop - int64_t connWaitTime = m_zkConfig.getConnectTimeout(); - while (1) - { - int state = zoo_state (mp_zkHandle); - if (state == ZOO_CONNECTED_STATE) - { - // connected - std::cerr << "[zktreeutil] Connected! mp_zkHandle: " - << mp_zkHandle - << std::endl; - return; - } - else if ( state && state != ZOO_CONNECTING_STATE) - { - // Not connecting any more... some other issue - std::ostringstream oss; - oss << "Unable to connect to ZK running at '" - << m_zkConfig.getHosts() - << "'; state=" - << state; - throw ZooKeeperException (oss.str()); - } - - // Still connecting, wait and come back - struct timeval now; - gettimeofday( &now, NULL ); - int64_t milliSecs = -(now.tv_sec * 1000LL + now.tv_usec / 1000); - std::cerr << "[zktreeutil] About to wait 1 sec" << std::endl; - sleep (1); - gettimeofday( &now, NULL ); - milliSecs += now.tv_sec * 1000LL + now.tv_usec / 1000; - connWaitTime -= milliSecs; - // Timed out !!! - if (connWaitTime <= 0) - break; - } - - // Timed out while connecting - std::ostringstream oss; - oss << "Timed out while connecting to ZK running at '" - << m_zkConfig.getHosts() - << "'"; - throw ZooKeeperException (oss.str()); - } - - void ZooKeeperAdapter::verifyConnection() throw(ZooKeeperException) - { - // Check connection state - int state = zoo_state (mp_zkHandle); - if (state != ZOO_CONNECTED_STATE) - { - if (m_zkConfig.getAutoReconnect()) - { - // Trying to reconnect - std::cerr << "[zktreeutil] Trying to reconnect..." << std::endl; - reconnect(); - } - else - { - std::ostringstream oss; - oss << "Disconnected from ZK running at '" - << m_zkConfig.getHosts() - << "'; state=" - << state; - throw ZooKeeperException (oss.str()); - } - } - } - - bool ZooKeeperAdapter::createNode(const string &path, - const string &value, - int flags, - bool createAncestors) throw(ZooKeeperException) - { - const int MAX_PATH_LENGTH = 1024; - char realPath[MAX_PATH_LENGTH]; - realPath[0] = 0; - - int rc; - RetryHandler rh(m_zkConfig); - do - { - verifyConnection(); - rc = zoo_create( mp_zkHandle, - path.c_str(), - value.c_str(), - value.length(), - &ZOO_OPEN_ACL_UNSAFE, - flags, - realPath, - MAX_PATH_LENGTH ); - } while (rc != ZOK && rh.handleRC(rc)); - if (rc != ZOK) // check return status - { - if (rc == ZNODEEXISTS) - { - //the node already exists - std::cerr << "[zktreeutil] ZK node " << path << " already exists" << std::endl; - return false; - } - else if (rc == ZNONODE && createAncestors) - { - std::cerr << "[zktreeutil] Intermediate ZK node missing in path " << path << std::endl; - //one of the ancestors doesn't exist so lets start from the root - //and make sure the whole path exists, creating missing nodes if - //necessary - for (string::size_type pos = 1; pos != string::npos; ) - { - pos = path.find( "/", pos ); - if (pos != string::npos) - { - try - { - createNode( path.substr( 0, pos ), "", 0, true ); - } - catch (ZooKeeperException &e) - { - throw ZooKeeperException( string("Unable to create " "node ") + path, rc ); - } - pos++; - } - else - { - // No more path components - return createNode( path, value, flags, false ); - } - } - } - - // Unexpected error during create - std::cerr << "[zktreeutil] Error in creating ZK node " << path << std::endl; - throw ZooKeeperException( string("Unable to create node ") + path, rc ); - } - - // Success - std::cerr << "[zktreeutil] " << realPath << " has been created" << std::endl; - return true; - } - - bool ZooKeeperAdapter::deleteNode(const string &path, - bool recursive, - int version) throw(ZooKeeperException) - { - // Validate the zk path - validatePath( path ); - - int rc; - RetryHandler rh(m_zkConfig); - do - { - verifyConnection(); - rc = zoo_delete( mp_zkHandle, path.c_str(), version ); - } while (rc != ZOK && rh.handleRC(rc)); - if (rc != ZOK) //check return status - { - if (rc == ZNONODE) - { - std::cerr << "[zktreeutil] ZK Node " - << path - << " does not exist" - << std::endl; - return false; - } - if (rc == ZNOTEMPTY && recursive) - { - std::cerr << "[zktreeutil] ZK Node " - << path - << " not empty; deleting..." - << std::endl; - //get all children and delete them recursively... - vector nodeList = getNodeChildren (path); - for (vector::const_iterator i = nodeList.begin(); - i != nodeList.end(); - ++i) { - deleteNode( *i, true ); - } - //...and finally attempt to delete the node again - return deleteNode( path, false ); - } - - // Unexpected return without success - std::cerr << "[zktreeutil] Unable to delete ZK node " << path << std::endl; - throw ZooKeeperException( string("Unable to delete node ") + path, rc ); - } - - // success - std::cerr << "[zktreeutil] " << path << " has been deleted" << std::endl; - return true; - } - - vector< string > ZooKeeperAdapter::getNodeChildren (const string &path) throw (ZooKeeperException) - { - // Validate the zk path - validatePath( path ); - - String_vector children; - memset( &children, 0, sizeof(children) ); - int rc; - RetryHandler rh(m_zkConfig); - do - { - verifyConnection(); - rc = zoo_get_children( mp_zkHandle, - path.c_str(), - 0, - &children ); - } while (rc != ZOK && rh.handleRC(rc)); - if (rc != ZOK) // check return code - { - std::cerr << "[zktreeutil] Error in fetching children of " << path << std::endl; - throw ZooKeeperException( string("Unable to get children of node ") + path, rc ); - } - else - { - vector< string > nodeList; - for (int i = 0; i < children.count; ++i) - { - //convert each child's path from relative to absolute - string absPath(path); - if (path != "/") - { - absPath.append( "/" ); - } - absPath.append( children.data[i] ); - nodeList.push_back( absPath ); - } - - //make sure the order is always deterministic - sort( nodeList.begin(), nodeList.end() ); - return nodeList; - } - } - - bool ZooKeeperAdapter::nodeExists(const string &path) throw(ZooKeeperException) - { - // Validate the zk path - validatePath( path ); - - struct Stat tmpStat; - struct Stat* stat = &tmpStat; - memset( stat, 0, sizeof(Stat) ); - - int rc; - RetryHandler rh(m_zkConfig); - do { - verifyConnection(); - rc = zoo_exists( mp_zkHandle, - path.c_str(), - 0, - stat ); - } while (rc != ZOK && rh.handleRC(rc)); - if (rc != ZOK) - { - if (rc == ZNONODE) - return false; - // Some error - std::cerr << "[zktreeutil] Error in checking existance of " << path << std::endl; - throw ZooKeeperException( string("Unable to check existence of node ") + path, rc ); - } else { - return true; - } - } - - string ZooKeeperAdapter::getNodeData(const string &path) throw(ZooKeeperException) - { - // Validate the zk path - validatePath( path ); - - const int MAX_DATA_LENGTH = 128 * 1024; - char buffer[MAX_DATA_LENGTH]; - memset( buffer, 0, MAX_DATA_LENGTH ); - struct Stat tmpStat; - struct Stat* stat = &tmpStat; - memset( stat, 0, sizeof(Stat) ); - - int rc; - int len; - RetryHandler rh(m_zkConfig); - do { - verifyConnection(); - len = MAX_DATA_LENGTH - 1; - rc = zoo_get( mp_zkHandle, - path.c_str(), - 0, - buffer, &len, stat ); - } while (rc != ZOK && rh.handleRC(rc)); - if (rc != ZOK) // checl return code - { - std::cerr << "[zktreeutil] Error in fetching value of " << path << std::endl; - throw ZooKeeperException( string("Unable to get data of node ") + path, rc ); - } - - // return data - return string( buffer, buffer + len ); - } - - void ZooKeeperAdapter::setNodeData(const string &path, - const string &value, - int version) throw(ZooKeeperException) - { - // Validate the zk path - validatePath( path ); - - int rc; - RetryHandler rh(m_zkConfig); - do { - verifyConnection(); - rc = zoo_set( mp_zkHandle, - path.c_str(), - value.c_str(), - value.length(), - version); - } while (rc != ZOK && rh.handleRC(rc)); - if (rc != ZOK) // check return code - { - std::cerr << "[zktreeutil] Error in setting value of " << path << std::endl; - throw ZooKeeperException( string("Unable to set data for node ") + path, rc ); - } - // success - } - -} /* end of 'namespace zktreeutil' */ diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/zktreeutil/src/ZkAdaptor.h b/pkg/registry/zookeeper-3.4.6/src/contrib/zktreeutil/src/ZkAdaptor.h deleted file mode 100644 index d94b033c5..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/contrib/zktreeutil/src/ZkAdaptor.h +++ /dev/null @@ -1,327 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you 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. - */ - -#ifndef __ZK_ADAPTER_H__ -#define __ZK_ADAPTER_H__ - -#include -#include - -extern "C" { -#include "zookeeper.h" -} - -namespace zktreeutil -{ - using std::string; - using std::vector; - - /** - * \brief A cluster related exception. - */ - class ZooKeeperException : public std::exception - { - public: - - /** - * \brief Constructor. - * - * @param msg the detailed message associated with this exception - */ - ZooKeeperException(const string& msg) : - m_message(msg), - m_zkErrorCode(0) {} - - /** - * \brief Constructor. - * - * @param msg the detailed message associated with this exception - * @param errorCode the ZK error code associated with this exception - */ - ZooKeeperException(const string &msg, int errorCode) : - m_zkErrorCode(errorCode) - { - char tmp[100]; - sprintf( tmp, " (ZK error code: %d)", errorCode ); - m_message = msg + tmp; - } - - /** - * \brief Destructor. - */ - ~ZooKeeperException() throw() {} - - /** - * \brief Returns detailed description of the exception. - */ - const char *what() const throw() - { - return m_message.c_str(); - } - - /** - * \brief Returns the ZK error code. - */ - int getZKErrorCode() const - { - return m_zkErrorCode; - } - - private: - - /** - * The detailed message associated with this exception. - */ - string m_message; - - /** - * The optional error code received from ZK. - */ - int m_zkErrorCode; - - }; - - /** - * \brief This class encapsulates configuration of a ZK client. - */ - class ZooKeeperConfig - { - public: - - /** - * \brief Constructor. - * - * @param hosts the comma separated list of host and port pairs of ZK nodes - * @param leaseTimeout the lease timeout (heartbeat) - * @param autoReconnect whether to allow for auto-reconnect - * @param connectTimeout the connect timeout, in milliseconds; - */ - ZooKeeperConfig(const string &hosts, - int leaseTimeout, - bool autoReconnect = true, - long long int connectTimeout = 15000) - : m_hosts(hosts), - m_leaseTimeout(leaseTimeout), - m_autoReconnect(autoReconnect), - m_connectTimeout(connectTimeout) {} - - /** - * \brief Returns the list of ZK hosts to connect to. - */ - string getHosts() const { return m_hosts; } - - /** - * \brief Returns the lease timeout. - */ - int getLeaseTimeout() const { return m_leaseTimeout; } - - /** - * \brief Returns whether {@link ZooKeeperAdapter} should attempt - * \brief to automatically reconnect in case of a connection failure. - */ - bool getAutoReconnect() const { return m_autoReconnect; } - - /** - * \brief Gets the connect timeout. - * - * @return the connect timeout - */ - long long int getConnectTimeout() const { return m_connectTimeout; } - - private: - - /** - * The host addresses of ZK nodes. - */ - const string m_hosts; - - /** - * The ZK lease timeout. - */ - const int m_leaseTimeout; - - /** - * True if this adapater should attempt to autoreconnect in case - * the current session has been dropped. - */ - const bool m_autoReconnect; - - /** - * How long to wait, in milliseconds, before a connection - * is established to ZK. - */ - const long long int m_connectTimeout; - }; - - /** - * \brief This is a wrapper around ZK C synchrounous API. - */ - class ZooKeeperAdapter - { - public: - /** - * \brief Constructor. - * Attempts to create a ZK adapter, optionally connecting - * to the ZK. Note, that if the connection is to be established - * and the given listener is NULL, some events may be lost, - * as they may arrive asynchronously before this method finishes. - * - * @param config the ZK configuration - * @throw ZooKeeperException if cannot establish connection to the given ZK - */ - ZooKeeperAdapter(ZooKeeperConfig config) throw(ZooKeeperException); - - /** - * \brief Destructor. - */ - ~ZooKeeperAdapter(); - - /** - * \brief Returns the current config. - */ - const ZooKeeperConfig &getZooKeeperConfig() const { return m_zkConfig; } - - /** - * \brief Restablishes connection to the ZK. - * If this adapter is already connected, the current connection - * will be dropped and a new connection will be established. - * - * @throw ZooKeeperException if cannot establish connection to the ZK - */ - void reconnect() throw(ZooKeeperException); - - /** - * \brief Disconnects from the ZK and unregisters {@link #mp_zkHandle}. - */ - void disconnect(); - - /** - * \brief Creates a new node identified by the given path. - * This method will optionally attempt to create all missing ancestors. - * - * @param path the absolute path name of the node to be created - * @param value the initial value to be associated with the node - * @param flags the ZK flags of the node to be created - * @param createAncestors if true and there are some missing ancestor nodes, - * this method will attempt to create them - * - * @return true if the node has been successfully created; false otherwise - * @throw ZooKeeperException if the operation has failed - */ - bool createNode(const string &path, - const string &value = "", - int flags = 0, - bool createAncestors = true) throw(ZooKeeperException); - - /** - * \brief Deletes a node identified by the given path. - * - * @param path the absolute path name of the node to be deleted - * @param recursive if true this method will attempt to remove - * all children of the given node if any exist - * @param version the expected version of the node. The function will - * fail if the actual version of the node does not match - * the expected version - * - * @return true if the node has been deleted; false otherwise - * @throw ZooKeeperException if the operation has failed - */ - bool deleteNode(const string &path, - bool recursive = false, - int version = -1) throw(ZooKeeperException); - - /** - * \brief Retrieves list of all children of the given node. - * - * @param path the absolute path name of the node for which to get children - * @return the list of absolute paths of child nodes, possibly empty - * @throw ZooKeeperException if the operation has failed - */ - vector getNodeChildren( const string &path) throw(ZooKeeperException); - - /** - * \brief Check the existance of path to a znode. - * - * @param path the absolute path name of the znode - * @return TRUE if the znode exists; FALSE otherwise - * @throw ZooKeeperException if the operation has failed - */ - bool nodeExists(const string &path) throw(ZooKeeperException); - - /** - * \brief Gets the given node's data. - * - * @param path the absolute path name of the node to get data from - * - * @return the node's data - * @throw ZooKeeperException if the operation has failed - */ - string getNodeData(const string &path) throw(ZooKeeperException); - - /** - * \brief Sets the given node's data. - * - * @param path the absolute path name of the node to get data from - * @param value the node's data to be set - * @param version the expected version of the node. The function will - * fail if the actual version of the node does not match - * the expected version - * - * @throw ZooKeeperException if the operation has failed - */ - void setNodeData(const string &path, - const string &value, - int version = -1) throw(ZooKeeperException); - - /** - * \brief Validates the given path to a node in ZK. - * - * @param the path to be validated - * - * @throw ZooKeeperException if the given path is not valid - * (for instance it doesn't start with "/") - */ - static void validatePath(const string &path) throw(ZooKeeperException); - - private: - - /** - * Verifies whether the connection is established, - * optionally auto reconnecting. - * - * @throw ZooKeeperConnection if this client is disconnected - * and auto-reconnect failed or was not allowed - */ - void verifyConnection() throw(ZooKeeperException); - - private: - - /** - * The current ZK configuration. - */ - const ZooKeeperConfig m_zkConfig; - - /** - * The current ZK session. - */ - zhandle_t *mp_zkHandle; - }; - -} /* end of 'namespace zktreeutil' */ - -#endif /* __ZK_ADAPTER_H__ */ diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/zktreeutil/src/ZkTreeUtil.cc b/pkg/registry/zookeeper-3.4.6/src/contrib/zktreeutil/src/ZkTreeUtil.cc deleted file mode 100644 index 83f0cbf3f..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/contrib/zktreeutil/src/ZkTreeUtil.cc +++ /dev/null @@ -1,705 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you 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. - */ - -#include "ZkTreeUtil.h" - -#include -#include -#include -#include -#include - -namespace zktreeutil -{ - using std::map; - using std::pair; - - static ZkTreeNodeSptr loadZkTree_ (ZooKeeperAdapterSptr zkHandle, - const string& path) - { - // Extract the node value - string value = zkHandle->getNodeData(path); - - // Extract nodename from the path - string nodename = "/"; - if (path != "/") - { - vector< string > nodes; - boost::split(nodes, path, boost::is_any_of ("/") ); - nodename = nodes[nodes.size()-1]; - } - - // Create tree-node with name and value - ZkTreeNodeSptr nodeSptr = ZkTreeNodeSptr (new ZkTreeNode (nodename, value)); - std::cerr << "[zktreeutil] loaded nodename: " - << nodename - << " value: " - << value - << std::endl; - - // Load all the children - vector< string > cnodes = zkHandle->getNodeChildren (path); - for (unsigned i = 0; i < cnodes.size(); i++) - nodeSptr->addChild (loadZkTree_ (zkHandle, cnodes[i])); - - // Return the constructed node - return nodeSptr; - } - - static ZkTreeNodeSptr loadZkTreeXml_ (xmlNode* xmlNodePtr) - { - // Null check - if (xmlNodePtr == NULL) - { - std::cerr << "[zktreeutil] empty XML node encountered" << std::endl; - exit (-1); - } - - // Get the node name - xmlChar* name = xmlGetProp (xmlNodePtr, BAD_CAST "name"); - string nameStr = (const char*)name; - std::cerr << "[zktreeutil] node name: " << nameStr; - xmlFree (name); - // Get the node value - string valueStr; - xmlChar* value = xmlGetProp (xmlNodePtr, BAD_CAST "value"); - if (value) - { - valueStr = (const char*)value; - std::cerr << " value: " << valueStr; - } - xmlFree (value); - // Get the ignore flag - bool doIgnore = false; - xmlChar* ignore = xmlGetProp (xmlNodePtr, BAD_CAST "ignore"); - if (ignore) - { - string ignoreStr = (const char*) ignore; - if (ignoreStr == "true" || ignoreStr == "yes" || ignoreStr == "1") - { - doIgnore = true; - std::cerr << " "; - } - } - xmlFree (ignore); - std::cerr << std::endl; - - // Create the zk node - ZkTreeNodeSptr nodeSptr = - ZkTreeNodeSptr (new ZkTreeNode (nameStr, - ZkNodeData (valueStr, doIgnore))); - - // Load the children - for (xmlNode* chldNode = xmlNodePtr->children; - chldNode; - chldNode = chldNode->next) - if (chldNode->type == XML_ELEMENT_NODE) - nodeSptr->addChild (loadZkTreeXml_ (chldNode)); - - // Return the loaded node - return nodeSptr; - } - - static void writeZkTree_ (ZooKeeperAdapterSptr zkHandle, - const ZkTreeNodeSptr zkNodeSptr, - const string& path) - { - // Create the path in zk-tree - zkHandle->createNode(path.c_str(), "", 0, false); - std::cerr << "[zktreeutil] created key: " << path << std::endl; - // Set value for the path - string value = zkNodeSptr->getData().value; - if (value != "") - { - zkHandle->setNodeData (path.c_str(), value.c_str()); - std::cerr << "[zktreeutil] set value: " << std::endl; - } - - // Go deep to write the subtree rooted in the node, if not to be ignored - if (!(zkNodeSptr->getData().ignoreUpdate)) - { - for (unsigned i=0; i < zkNodeSptr->numChildren(); i++) - { - ZkTreeNodeSptr childNodeSptr = zkNodeSptr->getChild (i); - // Add the node name into the path and write in zk-tree - string cpath = ((path != "/")? path : "") - + string("/") - + childNodeSptr->getKey(); - writeZkTree_ (zkHandle, childNodeSptr, cpath); - } - } - - return; - } - - static void addTreeZkAction_ (const ZkTreeNodeSptr zkNodeSptr, - const string& path, - vector< ZkAction >& actions) - { - // Create the key - actions.push_back (ZkAction (ZkAction::CREATE, path)); - - // Set value for the new key - if (zkNodeSptr->getData().value != "") - actions.push_back (ZkAction (ZkAction::VALUE, - path, - zkNodeSptr->getData().value)); - - // Add all the children - for (unsigned i=0; i < zkNodeSptr->numChildren(); i++) - { - ZkTreeNodeSptr childSptr = zkNodeSptr->getChild (i); - string cpath = path + string("/") + childSptr->getKey(); - addTreeZkAction_ (childSptr, cpath, actions); - } - - return; - } - - static xmlNodePtr dumpZkTreeXml_ (const ZkTreeNodeSptr zkNodeSptr) - { - // Create xml node with zknode name and value - string nodename = zkNodeSptr->getKey (); - string value = zkNodeSptr->getData().value; - xmlNodePtr node = xmlNewNode(NULL, BAD_CAST "zknode"); - xmlNewProp (node, BAD_CAST "name", BAD_CAST nodename.c_str()); - if (value.length()) - xmlNewProp (node, BAD_CAST "value", BAD_CAST value.c_str()); - - // Add all the children rotted at this node - for (unsigned i=0; i < zkNodeSptr->numChildren(); i++) - xmlAddChild (node, dumpZkTreeXml_ (zkNodeSptr->getChild (i))); - - // Return xml node - return node; - } - - static void dumpZkTree_ (const ZkTreeNodeSptr zkNodeSptr, - int maxLevel, - int level, - vector< bool >& masks) - { - // Check the max. dlevel to be dumped - if (level > maxLevel) - return; - - - // Create branch - for (int i=0; i < level; i++) - { - if ( i== level-1) std::cout << "| "; - else if (masks[i]) std::cout << " "; - else std::cout << "| "; - } - std::cout << std::endl; - for (int i=0; i < level-1; i++) - { - if (masks[i]) std::cout << " "; - else std::cout << "| "; - } - - // Dump the node name and value - std::cout << "|--[" << zkNodeSptr->getKey(); - if (zkNodeSptr->getData().value != "") - std::cout << " => " << zkNodeSptr->getData().value; - std::cout << "]" << std::endl; - - // Dump all the children - for (unsigned i=0; i < zkNodeSptr->numChildren(); i++) - { - // Add mask for last child - if (i == zkNodeSptr->numChildren()-1) - masks.push_back(true); - else - masks.push_back(false); - dumpZkTree_ (zkNodeSptr->getChild (i), maxLevel, level+1, masks); - } - - masks.pop_back(); - return; - } - - static ZkTreeNodeSptr traverseBranch_ (const ZkTreeNodeSptr& zkRootSptr, - const string& path) - { - // Check if the tree is loaded into memory - if (zkRootSptr == NULL) - { - string errMsg = "[zktreeutil] null root passed for traversing"; - std::cout << errMsg << std::endl; - throw std::logic_error (errMsg); - } - - // Split the path and add intermediate znodes - vector< string > nodes; - boost::split(nodes, path, boost::is_any_of ("/") ); - - // Start traversing the tree - ZkTreeNodeSptr currNodeSptr = zkRootSptr; - for (unsigned znode_idx = 1; znode_idx < nodes.size(); znode_idx++) - { - bool found = false; - for (unsigned i=0; i < currNodeSptr->numChildren(); i++) - { - ZkTreeNodeSptr childNodeSptr = currNodeSptr->getChild(i); - if (childNodeSptr->getKey() == nodes[znode_idx]) - { - // Found! go to the znode - currNodeSptr = childNodeSptr; - found = true; - break; - } - } - if (!found) // No such znode found; return NULL node-ptr - { - string errMsg = string("[zktreeutil] unknown znode during traversal: ") - + nodes[znode_idx]; - std::cout << errMsg << std::endl; - throw std::logic_error (errMsg); - } - } - - return currNodeSptr; - } - - static ZkTreeNodeSptr createAncestors_ (const string& path) - { - // Create the root znode - ZkTreeNodeSptr zkRootSptr = ZkTreeNodeSptr (new ZkTreeNode ("/")); - ZkTreeNodeSptr currNodeSptr = zkRootSptr; - // Split the path and add intermediate znodes - vector< string > nodes; - boost::split(nodes, path, boost::is_any_of ("/") ); - for (unsigned i=1; i < nodes.size()-1; i++) - { - ZkTreeNodeSptr childNodeSptr = ZkTreeNodeSptr (new ZkTreeNode (nodes[i])); - currNodeSptr->addChild (childNodeSptr); - currNodeSptr = childNodeSptr; - } - - //Return the root of the branch - return zkRootSptr; - } - - ZooKeeperAdapterSptr ZkTreeUtil::get_zkHandle (const string& zkHosts) - { - try - { - // Create an instance of ZK adapter. - ZooKeeperConfig config (zkHosts, 10000); - ZooKeeperAdapterSptr zkHandleSptr = - ZooKeeperAdapterSptr (new ZooKeeperAdapter (config)); - return zkHandleSptr; - } - catch (const ZooKeeperException &e) - { - std::cerr << "[zktreeutil] zooKeeper exception caught: " - << e.what() - << std::endl; - throw; - } - catch (std::exception &stde) - { - std::cerr << "[zktreeutil] standard exception caught: " - << stde.what() - << std::endl; - throw; - } - catch (...) - { - std::cerr - << "[zktreeutil] unknown exception while connecting to zookeeper" - << std::endl; - throw; - } - } - - - void ZkTreeUtil::loadZkTree (const string& zkHosts, - const string& path, - bool force) - { - // Check if already loaded - if (loaded_ && !force) - { - std::cerr << "[zktreeutil] zk-tree already loaded into memory" - << std::endl; - return; - } - - // Connect to ZK server - ZooKeeperAdapterSptr zkHandle = get_zkHandle (zkHosts); - std::cerr << "[zktreeutil] connected to ZK serverfor reading" - << std::endl; - - // Check the existance of the path to znode - if (!zkHandle->nodeExists (path)) - { - string errMsg = string("[zktreeutil] path does not exists : ") + path; - std::cout << errMsg << std::endl; - throw std::logic_error (errMsg); - } - - // Load the rooted (sub)tree - ZkTreeNodeSptr zkSubrootSptr = loadZkTree_ (zkHandle, path); - - // Create the ancestors before loading the rooted subtree - if (path != "/") - { - zkRootSptr_ = createAncestors_(path); - string ppath = path.substr (0, path.rfind('/')); - ZkTreeNodeSptr parentSptr = traverseBranch_( zkRootSptr_, ppath); - parentSptr->addChild (zkSubrootSptr); - } - else // Loaded entire zk-tree - { - zkRootSptr_ = zkSubrootSptr; - } - - // Set load flag - loaded_ = true; - return; - } - - void ZkTreeUtil::loadZkTreeXml (const string& zkXmlConfig, - bool force) - { - // Check if already loaded - if (loaded_ && !force) - { - std::cerr << "[zktreeutil] zk-tree already loaded into memory" - << std::endl; - return; - } - - // Parse the file and get the DOM - xmlDocPtr docPtr = xmlReadFile(zkXmlConfig.c_str(), NULL, 0); - if (docPtr == NULL) { - std::cerr << "[zktreeutil] could not parse XML file " - << zkXmlConfig - << std::endl; - exit (-1); - } - std::cerr << "[zktreeutil] zk-tree XML parsing successful" - << std::endl; - - // Get the root element node - xmlNodePtr rootPtr = xmlDocGetRootElement(docPtr); - // Create the root zk node - zkRootSptr_ = ZkTreeNodeSptr (new ZkTreeNode ("/")); - // Load the rooted XML tree - for (xmlNode* chldNode = rootPtr->children; - chldNode; - chldNode = chldNode->next) - { - if (chldNode->type == XML_ELEMENT_NODE) - zkRootSptr_->addChild (loadZkTreeXml_ (chldNode)); - } - - // set oad flag - loaded_ = true; - // Cleanup stuff - xmlFreeDoc(docPtr); - xmlCleanupParser(); - return; - } - - void ZkTreeUtil::writeZkTree (const string& zkHosts, - const string& path, - bool force) const - { - // Connect to ZK server - ZooKeeperAdapterSptr zkHandle = get_zkHandle (zkHosts); - std::cerr << "[zktreeutil] connected to ZK server for writing" - << std::endl; - - // Go to the rooted subtree - ZkTreeNodeSptr zkRootSptr = traverseBranch_ (zkRootSptr_, path); - - // Cleanup before write if forceful write enabled - if (force) - { - if (path != "/") // remove the subtree rooted at the znode - { - // Delete the subtree rooted at the znode before write - if (zkHandle->nodeExists (path)) - { - std::cerr << "[zktreeutil] deleting subtree rooted at " - << path - << "..." - << std::endl; - zkHandle->deleteNode (path, true); - } - } - else // remove the rooted znodes - { - std::cerr << "[zktreeutil] deleting rooted zk-tree" - << "..." - << std::endl; - // Get the root's children - vector< string > cnodes = zkHandle->getNodeChildren ("/"); - for (unsigned i=0; i < cnodes.size(); i++) - { - if ( cnodes[i] != "/zookeeper") // reserved for zookeeper use - zkHandle->deleteNode(cnodes[i], true); - } - } - } - - // Start tree construction - writeZkTree_ (zkHandle, zkRootSptr, path); - return; - } - - void ZkTreeUtil::dumpZkTree (bool xml, int depth) const - { - if (xml) - { - // Creates a new document, a node and set it as a root node - xmlDocPtr docPtr = xmlNewDoc(BAD_CAST "1.0"); - xmlNodePtr rootNode = xmlNewNode(NULL, BAD_CAST "root"); - xmlDocSetRootElement(docPtr, rootNode); - - // Add all the rooted children - for (unsigned i=0; i < zkRootSptr_->numChildren(); i++) - xmlAddChild (rootNode, dumpZkTreeXml_ (zkRootSptr_->getChild (i))); - - // Dumping document to stdio or file - xmlSaveFormatFileEnc("-", docPtr, "UTF-8", 1); - - // Cleanup stuff - xmlFreeDoc(docPtr); - xmlCleanupParser(); - return; - } - - // Dump text - std::cout << "/" << std::endl; - vector< bool > masks; - for (unsigned i=0; i < zkRootSptr_->numChildren(); i++) - { - if (i == zkRootSptr_->numChildren()-1) - masks.push_back(true); - else - masks.push_back(false); - dumpZkTree_ (zkRootSptr_->getChild (i), depth, 1, masks); - } - - return; - } - - vector< ZkAction > ZkTreeUtil::diffZkTree (const string& zkHosts, - const string& path) const - { - // Action container - vector< ZkAction > actions; - - if (!loaded_) - { - std::cout << "[zktreeutil] zk-tree not loaded for diff" - << std::endl; - exit (-1); - } - - // Load the rooted subtree from zookeeper - ZooKeeperAdapterSptr zkHandle = get_zkHandle (zkHosts); - std::cerr << "[zktreeutil] connected to ZK server for reading" - << std::endl; - ZkTreeNodeSptr zkLiveRootSptr = loadZkTree_ (zkHandle, path); - - // Go to the saved rooted subtree - ZkTreeNodeSptr zkLoadedRootSptr = - traverseBranch_ (zkRootSptr_, path); - - // Check the root value first - if (zkLoadedRootSptr->getData().value - != zkLiveRootSptr->getData().value) - { - actions.push_back (ZkAction (ZkAction::VALUE, - path, - zkLoadedRootSptr->getData().value, - zkLiveRootSptr->getData().value)); - } - - // Start traversal from root - vector< string > ppaths; - vector< pair< ZkTreeNodeSptr, ZkTreeNodeSptr > > commonNodes; - ppaths.push_back ((path != "/")? path : ""); - commonNodes.push_back (pair< ZkTreeNodeSptr, ZkTreeNodeSptr > - (zkLoadedRootSptr, zkLiveRootSptr)); - - for (unsigned j=0; j < commonNodes.size(); j++) - { - // Get children of loaded tree - map< string, ZkTreeNodeSptr > loadedChildren; - for (unsigned i=0; i < commonNodes[j].first->numChildren(); i++) - { - ZkTreeNodeSptr childSptr = commonNodes[j].first->getChild (i); - loadedChildren[childSptr->getKey()] = childSptr; - } - // Get children of live tree - map< string, ZkTreeNodeSptr > liveChildren; - for (unsigned i=0; i < commonNodes[j].second->numChildren(); i++) - { - ZkTreeNodeSptr childSptr = commonNodes[j].second->getChild (i); - liveChildren[childSptr->getKey()] = childSptr; - } - - // Start comparing the children - for (map< string, ZkTreeNodeSptr >::const_iterator it = - loadedChildren.begin(); - it != loadedChildren.end(); - it++) - { - bool ignoreKey = it->second->getData().ignoreUpdate; - string loadedVal = it->second->getData().value; - // Path to this node - string path = ppaths[j] + string("/") + it->first; - - map< string, ZkTreeNodeSptr >::const_iterator jt = - liveChildren.find (it->first); - if (jt != liveChildren.end()) - { - // Key is present in live zk-tree - string liveVal = jt->second->getData().value; - // Check value for the key, if not ignored - if (!ignoreKey) - { - if (loadedVal != liveVal) - { - // Value differs, set the new value for the key - actions.push_back (ZkAction (ZkAction::VALUE, - path, - loadedVal, - liveVal)); - } - - // Add node to common nodes - ppaths.push_back (path); - commonNodes.push_back (pair< ZkTreeNodeSptr, ZkTreeNodeSptr > - (it->second, jt->second)); - } - - // Remove the live zk node - liveChildren.erase (it->first); - } - else - { - // Add the subtree rooted to this node, if not ignored - if (!ignoreKey) - addTreeZkAction_ (it->second, path, actions); - } - } - - // Remaining live zk nodes to be deleted - for (map< string, ZkTreeNodeSptr >::const_iterator it = liveChildren.begin(); - it != liveChildren.end(); it++) - { - string path = ppaths[j] + string("/") + it->first; - actions.push_back (ZkAction (ZkAction::DELETE, path)); - } - } - // return the diff actions - return actions; - } - - void ZkTreeUtil::executeZkActions (const string& zkHosts, - const vector< ZkAction >& zkActions, - int execFlags) const - { - // Execute the diff zk actions - if (zkActions.size()) - { - // Connect to Zookeeper for writing - ZooKeeperAdapterSptr zkHandleSptr; - if ((execFlags & EXECUTE) - || (execFlags & INTERACTIVE)) - { - zkHandleSptr = get_zkHandle (zkHosts); - std::cerr << "[zktreeutil] connected to ZK server for writing" - << std::endl; - } - - for (unsigned i=0; i < zkActions.size(); i++) - { - if (zkActions[i].action == ZkAction::CREATE) - { - if (execFlags & PRINT) - std::cout << "CREAT- key:" << zkActions[i].key << std::endl; - if (execFlags & EXECUTE) - { - if (execFlags & INTERACTIVE) - { - string resp; - std::cout << "Execute this action?[yes/no]: "; - std::getline(std::cin, resp); - if (resp != "yes") - continue; - } - zkHandleSptr->createNode(zkActions[i].key.c_str(), "", 0, false); - } - } - else if (zkActions[i].action == ZkAction::DELETE) - { - if (execFlags & PRINT) - std::cout << "DELET- key:" << zkActions[i].key << std::endl; - if (execFlags & EXECUTE) - { - if (execFlags & INTERACTIVE) - { - string resp; - std::cout << "Execute this action?[yes/no]: "; - std::getline(std::cin, resp); - if (resp != "yes") - continue; - } - zkHandleSptr->deleteNode(zkActions[i].key.c_str(), true); - } - } - else if (zkActions[i].action == ZkAction::VALUE) - { - if (execFlags & PRINT) - { - std::cout << "VALUE- key:" - << zkActions[i].key - << " value:" << zkActions[i].newval; - if (zkActions[i].oldval != "") - std::cout << " old_value:" << zkActions[i].oldval; - std::cout << std::endl; - } - if (execFlags & EXECUTE) - { - if (execFlags & INTERACTIVE) - { - string resp; - std::cout << "Execute this action?[yes/no]: "; - std::getline(std::cin, resp); - if (resp != "yes") - continue; - } - zkHandleSptr->setNodeData (zkActions[i].key, zkActions[i].newval); - } - } - } - } - - return; - } - -} - diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/zktreeutil/src/ZkTreeUtil.h b/pkg/registry/zookeeper-3.4.6/src/contrib/zktreeutil/src/ZkTreeUtil.h deleted file mode 100644 index 0a9be03f8..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/contrib/zktreeutil/src/ZkTreeUtil.h +++ /dev/null @@ -1,262 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you 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. - */ - -#ifndef __ZK_TREE_UTIL_H__ -#define __ZK_TREE_UTIL_H__ - -#include -#include -#include "SimpleTree.h" -#include "ZkAdaptor.h" - -namespace zktreeutil -{ - -#define ZKTREEUTIL_INF 1000000000 - /** - * \brief A structure containing ZK node data. - */ - struct ZkNodeData - { - /** - * \brief The value string of the ZK node. - */ - string value; - - /** - * \brief The flag indicating whether children of the - * \brief node shduld be ignored during create/diff/update - */ - bool ignoreUpdate; - - /** - * \brief Constructor. - * - * @param val the value string - * @param ignore the flag indicating ignore any update/diff - */ - ZkNodeData (const string& val, bool ignore=false) - : value (val), ignoreUpdate (ignore) {} - - /** - * \brief Constructor. - * - * @param ignore the flag indicating ignore any update/diff - */ - ZkNodeData (bool ignore=false) - : ignoreUpdate (ignore) {} - }; - - /** - * \brief The type representing a ZK Treenode - */ - typedef SimpleTreeNode< string, ZkNodeData > ZkTreeNode; - - /** - * \brief The type representing a ZK Treenode smart-pointer - */ - typedef boost::shared_ptr< ZkTreeNode > ZkTreeNodeSptr; - - /** - * \brief The type representing a ZK Adapter smart-pointer - */ - typedef boost::shared_ptr< ZooKeeperAdapter > ZooKeeperAdapterSptr; - - /** - * \brief A structure defining a particular action on ZK node; - * \brief the action can be any of - - * \brief CREAT- : creates recussively - * \brief DELET- : deletes recursively - * \brief VALUE- : sets to - */ - struct ZkAction - { - /** - * \brief The action type; any of create/delete/setvalue. - */ - enum ZkActionType - { - NONE, - CREATE, - DELETE, - VALUE, - }; - - /** - * \brief action of this instance - */ - ZkActionType action; - - /** - * \brief ZK node key - */ - string key; - - /** - * \brief value to be set, if action is setvalue - */ - string newval; - - /** - * \brief existing value of the ZK node key - */ - string oldval; - - /** - * \brief Constructor. - */ - ZkAction () - : action (ZkAction::NONE) {} - - /** - * \brief Constructor. - * - * @param act the action to be taken - * @param k the key on which action to be taken - */ - ZkAction (ZkActionType act, const string& k) - : action(act), - key(k) {} - - /** - * \brief Constructor. - * - * @param act the action to be taken - * @param k the key on which action to be taken - * @param v the value of the ZK node key - */ - ZkAction (ZkActionType act, const string& k, const string& v) - : action(act), - key(k), - newval(v) {} - - /** - * \brief Constructor. - * - * @param act the action to be taken - * @param k the key on which action to be taken - * @param nv the new value of the ZK node key - * @param ov the old value of the ZK node key - */ - ZkAction (ZkActionType act, const string& k, const string& nv, const string& ov) - : action (act), - key(k), - newval(nv), - oldval(ov) {} - }; - - /** - * \brief The ZK tree utility class; supports loading ZK tree from ZK server OR - * \brief from saved XML file, saving ZK tree into XML file, dumping the ZK tree - * \brief on standard output, creting a diff between saved ZK tree and live ZK - * \brief tree and incremental update of the live ZK tree. - */ - class ZkTreeUtil - { - public: - /** - * \brief Execution flag on ZkAction - */ - enum ZkActionExecuteFlag - { - NONE = 0, - PRINT = 1, - EXECUTE = 2, - INTERACTIVE = 5, - }; - - public: - /** - * \brief Connects to zookeeper and returns a valid ZK handle - * - * @param zkHosts comma separated list of host:port forming ZK quorum - * @param a valid ZK handle - */ - static ZooKeeperAdapterSptr get_zkHandle (const string& zkHosts); - - - public: - /** - * \brief Constructor. - */ - ZkTreeUtil () : loaded_(false) {} - - /** - * \brief loads the ZK tree from ZK server into memory - * - * @param zkHosts comma separated list of host:port forming ZK quorum - * @param path path to the subtree to be loaded into memory - * @param force forces reloading in case tree already loaded into memory - */ - void loadZkTree (const string& zkHosts, const string& path="/", bool force=false); - - /** - * \brief loads the ZK tree from XML file into memory - * - * @param zkXmlConfig ZK tree XML file - * @param force forces reloading in case tree already loaded into memory - */ - void loadZkTreeXml (const string& zkXmlConfig, bool force=false); - - /** - * \brief writes the in-memory ZK tree on to ZK server - * - * @param zkHosts comma separated list of host:port forming ZK quorum - * @param path path to the subtree to be written to ZK tree - * @param force forces cleanup of the ZK tree on the ZK server before writing - */ - void writeZkTree (const string& zkHosts, const string& path="/", bool force=false) const; - - /** - * \brief dupms the in-memory ZK tree on the standard output device; - * - * @param xml flag indicates whether tree should be dumped in XML format - * @param depth the depth of the tree to be dumped for non-xml dump - */ - void dumpZkTree (bool xml=false, int depth=ZKTREEUTIL_INF) const; - - /** - * \brief returns a list of actions after taking a diff of in-memory - * \brief ZK tree and live ZK tree. - * - * @param zkHosts comma separated list of host:port forming ZK quorum - * @param path path to the subtree in consideration while taking diff with ZK tree - * @return a list of ZKAction instances to be performed on live ZK tree - */ - vector< ZkAction > diffZkTree (const string& zkHosts, const string& path="/") const; - - /** - * \brief performs create/delete/setvalue by executing a set of - * ZkActions on a live ZK tree. - * - * @param zkHosts comma separated list of host:port forming ZK quorum - * @param zkActions set of ZkActions - * @param execFlags flags indicating print/execute/interactive etc - */ - void executeZkActions (const string& zkHosts, - const vector< ZkAction >& zkActions, - int execFlags) const; - - private: - - ZkTreeNodeSptr zkRootSptr_; // ZK tree root node - bool loaded_; // Falg indicating whether ZK tree loaded into memory - }; -} - -#endif // __ZK_TREE_UTIL_H__ diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/zktreeutil/src/ZkTreeUtilMain.cc b/pkg/registry/zookeeper-3.4.6/src/contrib/zktreeutil/src/ZkTreeUtilMain.cc deleted file mode 100644 index 8afebf6e2..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/contrib/zktreeutil/src/ZkTreeUtilMain.cc +++ /dev/null @@ -1,247 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you 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. - */ - -#ifdef HAVE_CONFIG_H -#include -#endif - -#include -#ifndef _GNU_SOURCE -#define _GNU_SOURCE -#endif -#include -#include -#include "ZkTreeUtil.h" - -using namespace zktreeutil; - -// The set of "long" options accepted by this program. -static struct option long_options[] = { - {"help", no_argument, 0, 'h'}, - {"import", no_argument, 0, 'I'}, - {"export", no_argument, 0, 'E'}, - {"update", no_argument, 0, 'U'}, - {"diff", no_argument, 0, 'F'}, - {"dump", no_argument, 0, 'D'}, - {"force", no_argument, 0, 'f'}, - {"xmlfile", required_argument, 0, 'x'}, - {"path", required_argument, 0, 'p'}, - {"depth", required_argument, 0, 'd'}, - {"zookeeper", required_argument, 0, 'z'}, - {0, 0, 0, 0} -}; -static char *short_options = "IEUFDfx:p:d:hz:"; - -static void usage(int argc, char *argv[]) -{ - std::cout << "ZK-tree utility for managing ZK-tree with XML import/export," << std::endl; - std::cout << "viewing diff between live and saved ZK-tree and performing" << std::endl; - std::cout << "incremental update of the same." << std::endl; - std::cout << "Usage: " << argv[0] << " [args-and-values]+" << std::endl; - std::cout - << "\t--import or -I: " - << std::endl - << "\t Imports the zookeeper tree from XML file. Must be specified with" - << std::endl - << "\t --zookeeper AND --xmlfile options. Optionally takes --path for" - << std::endl - << "\t importing subtree" - << std::endl; - std::cout - << "\t--export or -E: " - << std::endl - << "\t Exports the zookeeper tree to XML file. Must be specified with" - << std::endl - << "\t --zookeeper option. Optionally takes --path for exporting subtree" - << std::endl; - std::cout - << "\t--update or -U: " - << std::endl - << "\t Updates zookeeper tree with changes from XML file. Update operation" - << std::endl - << "\t is interactive unless specified with --force option. Must be speci-" - << std::endl - << "\t fied with --zookeeper AND --xmlfile options. Optionally takes --path" - << std::endl - << "\t for updating subtree." - << std::endl; - std::cout - << "\t--diff or -F: " - << std::endl - << "\t Creates a list of diff actions on ZK tree based on XML data. Must" - << std::endl - << "\t be specified with --zookeeper OR --xmlfile options. Optionally takes" - << std::endl - << "\t --path for subtree diff" - << std::endl; - std::cout - << "\t--dump or -D: " - << std::endl - << "\t Dumps the entire ZK (sub)tree to standard output. Must be specified" - << std::endl - << "\t with --zookeeper OR --xmlfile options. Optionally takes --path and" - << std::endl - << "\t --depth for dumping subtree." - << std::endl; - std::cout - << "\t--xmlfile= or -x : " - << std::endl - << "\t Zookeeper tree-data XML file." - << std::endl; - std::cout - << "\t--path= or -p : " - << std::endl - << "\t Path to the zookeeper subtree rootnode." - << std::endl; - std::cout - << "\t--depth= or -d : " - << std::endl - << "\t Depth of the ZK tree to be dumped (ignored for XML dump)." - << std::endl; - std::cout - << "\t--force or -f: Forces cleanup before import; also used for forceful" - << std::endl - << "\t update. Optionally be specified with --import and --update." - << std::endl; - std::cout - << "\t--help or -h: " - << std::endl - << "\t prints this message" - << std::endl; - std::cout - << "\t--zookeeper= or -z : " - << std::endl - << "\t specifies information to connect to zookeeper." - << std::endl; -} - -int main(int argc, char **argv) -{ - if (argc == 1) { - usage(argc, argv); - exit(0); - } - - // Parse the arguments. - int op = 0; - bool force = false; - string zkHosts; - string xmlFile; - string path = "/"; - int depth = 0; - while (1) - { - int c = getopt_long(argc, argv, short_options, long_options, 0); - if (c == -1) - break; - - switch (c) { - case 'I': op = c; - break; - case 'E': op = c; - break; - case 'U': op = c; - break; - case 'F': op = c; - break; - case 'D': op = c; - break; - case 'f': force = true; - break; - case 'x': xmlFile = optarg; - break; - case 'p': path = optarg; - break; - case 'd': depth = atoi (optarg); - break; - case 'z': zkHosts = optarg; - break; - case 'h': usage (argc, argv); - exit(0); - } - } - - ZkTreeUtil zkTreeUtil; - switch (op) - { - case 'I': { - if (zkHosts == "" || xmlFile == "") - { - std::cout << "[zktreeutil] missing params; please see usage" << std::endl; - exit (-1); - } - zkTreeUtil.loadZkTreeXml (xmlFile); - zkTreeUtil.writeZkTree (zkHosts, path, force); - std::cout << "[zktreeutil] import successful!" << std::endl; - break; - } - case 'E': { - if (zkHosts == "") - { - std::cout << "[zktreeutil] missing params; please see usage" << std::endl; - exit (-1); - } - zkTreeUtil.loadZkTree (zkHosts, path); - zkTreeUtil.dumpZkTree (true); - break; - } - case 'U': { - if (zkHosts == "" || xmlFile == "") - { - std::cout << "[zktreeutil] missing params; please see usage" << std::endl; - exit (-1); - } - zkTreeUtil.loadZkTreeXml (xmlFile); - vector< ZkAction > zkActions = zkTreeUtil.diffZkTree (zkHosts, path); - int flags = ZkTreeUtil::EXECUTE; - if (!force) flags |= ZkTreeUtil::INTERACTIVE; - zkTreeUtil.executeZkActions (zkHosts, zkActions, flags); - std::cout << "[zktreeutil] update successful!" << std::endl; - break; - } - case 'F': { - if (zkHosts == "" || xmlFile == "") - { - std::cout << "[zktreeutil] missing params; please see usage" << std::endl; - exit (-1); - } - zkTreeUtil.loadZkTreeXml (xmlFile); - vector< ZkAction > zkActions = zkTreeUtil.diffZkTree (zkHosts, path); - zkTreeUtil.executeZkActions (zkHosts, zkActions, ZkTreeUtil::PRINT); - break; - } - case 'D': { - if (zkHosts != "") - zkTreeUtil.loadZkTree (zkHosts, path); - else if (xmlFile != "") - zkTreeUtil.loadZkTreeXml (xmlFile); - else - { - std::cout << "[zktreeutil] missing params; please see usage" << std::endl; - exit (-1); - } - // Dump the ZK tree - if (depth) zkTreeUtil.dumpZkTree (false, depth); - else zkTreeUtil.dumpZkTree (false); - break; - } - } - - exit(0); -} - diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/zktreeutil/tests/zk_sample.xml b/pkg/registry/zookeeper-3.4.6/src/contrib/zktreeutil/tests/zk_sample.xml deleted file mode 100644 index 6e97daa5f..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/contrib/zktreeutil/tests/zk_sample.xml +++ /dev/null @@ -1,44 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/zooinspector/NOTICE.txt b/pkg/registry/zookeeper-3.4.6/src/contrib/zooinspector/NOTICE.txt deleted file mode 100644 index e0bf2f0d7..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/contrib/zooinspector/NOTICE.txt +++ /dev/null @@ -1,3 +0,0 @@ -This contrib module includes icons available under the Eclipse Public Licence Version 1.0 -. from the Eclipse Java Devlopment Platform. -The lib sub-directory includes a binary only jar library developed at http://sourceforge.net/projects/jtoaster/ \ No newline at end of file diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/zooinspector/README.txt b/pkg/registry/zookeeper-3.4.6/src/contrib/zooinspector/README.txt deleted file mode 100644 index 3c2a58f42..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/contrib/zooinspector/README.txt +++ /dev/null @@ -1,94 +0,0 @@ -========================================== -ZooInspector - Browser and Editor for ZooKeeper Instances -Author: Colin Goodheart-Smithe -Date: February 2010 -========================================== - -ZooInspector is a Java Swing based application for browsing and editing ZooKeeper instances. - -Contents --------- - - Features - - Pre-requisites - - Build Instructions - - Using ZooInspector - - Creating and Using Plugins - -Features --------- - Below is a list of features in the current release of ZooInspector. - - Load connection settings from a zookeeper properties file - - Plugable DataEncryptionManagers to specify how data should be encrypted and decrypted in the Zookeeper instance - - Browseable tree view of the ZooKeeper instance - - View the data in a node - - View the ACL's currently applied to a node - - View the metadata for a node (Version, Number of Children, Last modified Tiem, etc.) - - Plugable NodeViewers interface - - Ability to save/load and set default Node Viewers - -Pre-requisites --------------- - - The main zookeeper build script must have been run before building this module - -Build Instructions ------------------- - 1. Open a command line. - 2. cd into this directory - 3. Run command: ant - 4. ZooInspector will be built to ../../../build/contrib/ZooInspector - 5. Copy zookeeper-3.x.x.jar into the lib sub-directory (if you are using zookeeper-3.3.0.jar it will have been - copied to this directory during the build - 6. By default the zookeeper.cmd and zookeeper.sh files expect zookeeper-3.3.0.jar. If you are using another version - you will need to change these files to point to the zookeeper-3.x.x.jar you copied to the lib directory - 7. To run ZooInspector run zooInspector.cmd (on Windows) or zooInspector.sh (on Linux). If you are using - zookeeper-3.3.0.jar and do not require any classpath changes you can run the zookeeper-dev-ZooInspector.jar - directly - -Using ZooInspector ------------------- - To start ZooInspector run zooInspector.cmd (on Windows) or zooInspector.sh (on Linux). If you are using - zookeeper-3.3.0.jar and do not require any classpath changes you can run the zookeeper-dev-ZooInspector.jar - directly. - - Click the play button on the toolbar to bring up the connection dialog. From here you can enter connection - information for your zookeeper instance. You can also load the connection properties from a file. This file can - have the format as a normal zookeeper properties file (i.e. hosts and timeout key-value pairs) and van optional have - an encryptionManager key-value pair to specify the DataEncryptionManager to use for this connection - (DataEncryptionManagers are explained in further detail in the 'Creating and Using Plugins' section below). You can - also set the entered information as the defaults so that when you first start ZooInspector these settings are - automatically loaded into this dialog. Pressing the OK button with connect to your ZooKeeper instance and show the - current node tree on the left of the main panel. - - Clicking a node in the node tree will load the data for that node into the node viewers. Three node viewers are - currently distributed with ZooInspector: - 1. Node Data - This enables you to see the data current stored on that node. This data can be modified and - saved. The data is decrypted and encrypted using the DataEncryptionManager specified on the connection - dialog. - 2. Node Metadata - This enables you to see the metadata associiated with this node. This is Essentially the data - obtained from the Stat object for this node. - 3. Node ACLs - This allows you to see the ACLs currently applied to this node. Currently there is no ability - to change the ACLs on a node, but it is a feature I would like to add. - Other custom Node Viewers can be added, this is explained in the 'Creating and Using Plugins' section below. - - -Creating and Using Plugins --------------------------- - There are two types of plugin which can be used with ZooInspector: - 1. DataEncryptionManager - This specifies how data should be encrypted and decrypted when working with a - zookeeper instance. - 2. ZooInspectorNodeViewer - This is a GUI panel which provides a view of visualisation on a node. - More information on these interfaces can be found in the javadocs for this module. - - To use a plugin in ZooInspector, build the plugin to a jar and copy the jar to the lib sub-directory. Edit the - zooInspector.cmd and/or zooInspector.sh files to include your new jar on the classpath and run ZooInspector. - - For DataEncryptionManagers, click the play button to open the connection dialog and enter the full class name of - your DataEncryptionManager in the 'Data Encryption Manager' field. You can make this Data Encryption Manager the - default by clicking 'Set As Default'. Click the 'OK' button to instantiate and use your plugin. - - For ZooInspectorNodeViewers, Click the 'Change Node Viewers' button on the toolbar (looks like a tree with a pencil) - and enter the full classname for your Node Viewer in the field left of the 'Add' button, then click the 'Add' - button. The Node Viewer will be instantiated and should appear in the list. You can change the order of the Node - viewers by clicking the up and dpwn buttons and delete a Node Viewer by clicking the delete button. You can save - to configuration to a file or set it as the default if necessary. Then click the 'OK' button and your Node Viewer - should appear in the tabs on the right of the main panel. \ No newline at end of file diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/zooinspector/build.xml b/pkg/registry/zookeeper-3.4.6/src/contrib/zooinspector/build.xml deleted file mode 100644 index a2427909e..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/contrib/zooinspector/build.xml +++ /dev/null @@ -1,152 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Tests failed! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/zooinspector/config/defaultConnectionSettings.cfg b/pkg/registry/zookeeper-3.4.6/src/contrib/zooinspector/config/defaultConnectionSettings.cfg deleted file mode 100644 index 36a34ff30..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/contrib/zooinspector/config/defaultConnectionSettings.cfg +++ /dev/null @@ -1,21 +0,0 @@ -# Licensed to the Apache Software Foundation (ASF) under one or more -# contributor license agreements. See the NOTICE file distributed with -# this work for additional information regarding copyright ownership. -# The ASF licenses this file to You 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. -# -#Default connection for ZooInspector -hosts=localhost\:2181 -encryptionManager=org.apache.zookeeper.inspector.encryption.BasicDataEncryptionManager -timeout=5000 -authScheme= -authData= diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/zooinspector/config/defaultNodeVeiwers.cfg b/pkg/registry/zookeeper-3.4.6/src/contrib/zooinspector/config/defaultNodeVeiwers.cfg deleted file mode 100644 index 38fe9a85e..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/contrib/zooinspector/config/defaultNodeVeiwers.cfg +++ /dev/null @@ -1,17 +0,0 @@ -# Licensed to the Apache Software Foundation (ASF) under one or more -# contributor license agreements. See the NOTICE file distributed with -# this work for additional information regarding copyright ownership. -# The ASF licenses this file to You 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. -org.apache.zookeeper.inspector.gui.nodeviewer.NodeViewerData -org.apache.zookeeper.inspector.gui.nodeviewer.NodeViewerMetaData -org.apache.zookeeper.inspector.gui.nodeviewer.NodeViewerACL diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/zooinspector/icons/edtsrclkup_co.gif b/pkg/registry/zookeeper-3.4.6/src/contrib/zooinspector/icons/edtsrclkup_co.gif deleted file mode 100644 index 94eedf6f92944ef56a7165d98ee6482ad24d00f3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 204 zcmZ?wbhEHb6krfwIKsdXQ?+X1(&P7^zE^TizkPY(?k!y(Zmf8Dr0(0Z6O(Jgr_{$z zZA_S45!jz;(U)n_pJO+nzamx|{omhdZ+pPy1w_LK}lAnr-`SJ62+pK*(^ACOa@_X{KW3$$r zUbOlAiXE5N?74dH#gDtszu$lH{mGl3&)@xg`{~!`Z@=#VMPB~6_u~7*S3h2T`1$R} z?`Q9Re)#(P)3@JWfBgRb^LKTLe^s%6bxA;7sb4jaQ5?`-<Y72H(vk7Xs us!1$fvP8{QU92ZrK%7tARasP&f6JDw8m_8J3W|I7DyXXX9C3DJum%7=h^`F) diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/zooinspector/icons/fldr_obj.gif b/pkg/registry/zookeeper-3.4.6/src/contrib/zooinspector/icons/fldr_obj.gif deleted file mode 100644 index 51e703b1b9c671baa2be0f6525edb3b69403370d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 216 zcmZ?wbhEHb6krfwIKsg2wj(b5!P~sjn^4pBFDXFJ7TPNb)}zFdzZN zpDc_F4AKlbATf}g46LCK)cR5~=VfGBty!EmMJ+qTijl!k<;;`cOWYDXbj&=28jDUI znIPA;;-J&oD09KqYe6rnb~B%5E3$|tF?k!UrOe@6&xDe6Z(8Y4cFg@2oFwXHJRx@P^{Hj-{g3x~&Wh)&R@kLgN4c diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/zooinspector/icons/launch_run.gif b/pkg/registry/zookeeper-3.4.6/src/contrib/zooinspector/icons/launch_run.gif deleted file mode 100644 index 57f410224cf0e125fefdfbfd424b34ca32650ac4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 379 zcmZ?wbhEHb6krfwxXQqw(BP;BL>-Qf6T{aP*iM?lCLeYNChZ zME|t4Kq*J#ax2FU508od{@|VOltj+J(UOww!N5}U3iQCI3ZqHwGu%qFO+M$;f|G|KP zbfEZ?g^__lk3k2d733!dwiyo73p{kh9NV1~0xTMO)-@+?HCpL1C+*_|jkQs$L%3SK zWZD#%Uw+AK^#3sVq2$yax7_cq>g;#(C^lABHOjI%u}OEy<@M@F%Q8AK@K5dOm7mJO z;KV30f4Z*Rd;#G}fjokO)8$r)3o+Lza0p5E$no(>iVJg;1ab?@$%#scNeOe;IkR(c Y3G?y_b8(z@@nG_1@(Z}@>d0UX09ibCp#T5? diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/zooinspector/icons/launch_stop.gif b/pkg/registry/zookeeper-3.4.6/src/contrib/zooinspector/icons/launch_stop.gif deleted file mode 100644 index fbf1686e4b47fd4e9fe639c6b6d7bb49ca09b706..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 916 zcma)5Ur1A76hFJWvg?r8zLu)g97e2UJ)cYo*m&hPxr`ObGw zHlGlVw3)yJ-2jSHPy|sC-HKbvwFeR=yJC0B4q@ICkR?%Wb+3=dWKoCD>tJZN&Y})vc0? zTOEK!!^&%5<_m>7ZC_W>bffI*0Q3M>?MO!kHZXwP0@Ip=?UVM1>UuGCF{Xf8sWA(3 z)Kjm6bOcEU|GOtg`5x>V>q(97$0M}V=%K74XBDyf1rJb_8f)3XjPuJ9KnQ?UaVC_s zI}OT#>bSLH<}0q*A08y4I)F~U@`hh_BjWqhz;@}spU0B0JaRKb20rPPmvrzs9h@Tm z1Ot1pchVsPFe=U=z6~%Txx#KZA-Ifg}E3bkV~vIf*ZhHQ@NZ<>v6tiSIG- zJpteVwvnz-wlM@ySr)le222^KbHuRX_{y85@o6sN&lpg|KRX{GE~iCqrTN3WZDOeH zD$FI%!P#(rsFZ_rp2k-}g#b=1?~2ho0qqqLoD>;I_~1$d9PEONHF*}VfWSVLrv4Ma zU5C9K?;ejP?{V90ebMO9v2L@mwpEFe)rKmPps{rBguKlfhzc=G1w^LIbre)@Ii`S<%Te>{Bk z12|TpyR{>mrI{2JXHL%C7O09Mu>554H9&1sF`=rV`q@7GGB8G zKfk`Pt2BF0FFPY+r;7~t)M?XXTxEIZ%$>s~>nhH=Wa(0IS4pnbYt~4*N^x%5yop81 WRg`1b?%krUA_op05^-{5um%7kHK6(c diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/zooinspector/icons/refresh.gif b/pkg/registry/zookeeper-3.4.6/src/contrib/zooinspector/icons/refresh.gif deleted file mode 100644 index 3ca04d06ff9c811a6f791d029a802a7be4681ff4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 327 zcmZ?wbhEHb6krfwxXQrrJWa!4-LeYm0=|77MK@5?WI%v@BcT|Ns9CR0WDZSr{1@R2g(Yrh@#$z?O1g zQh|q#RHw+PiyoXB)1AE)3U1~skT{fJ?U6BUYICAZn$5HYp3GD7dKS#fQdLEHHy z6I^aRo~tUt;P2kV6w~t;=?ud9vy7?cE^q z*1q%4_Md-x_|o&km!6%t_VVPl7w2!kK6mTY)%$O+-hXrZ@w-PaKBPA<&u(2-(6RIc zNcPq9H=oX5zOnP@<=ao*J$&)u*_+SB-Al@Q7r*)NC8Bg+ zz;2_n+r|KMbN2{G6a4_&{kGN)4gvc5juAGR#sRMOu1@w&t^vlzRuN`KMgigX?uQ4k zYgk5@s;SFPcrC52W*VWRCnlyRuKMMRsEVpigru?tONzsU2OVNcZfg!)N^s&3;9>A! zDQIQv=+@exGeO}YGc&uwQjf$B2b)>gB6wUn7Bn7go*uf&AmXGW<1{9LBBLK|is)RRH2yZMG-dG{LyHRvkqv*C;prFW}Cb1QH0&9u|R~HDbFBMu_B(%Cf zXj8fH`cmQLIReYF1^)m4&p+|z+lLr1JVKV69Zf3ff)rJI#S8AmOS&g!objY zXp*F{?P9eo9}@`oK{Iw9&}i^SBU4D}c3FLN?5SiQ`V!5RSYo{04T diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/zooinspector/icons/search_prev.gif b/pkg/registry/zookeeper-3.4.6/src/contrib/zooinspector/icons/search_prev.gif deleted file mode 100644 index 07164754e5ca231666d9daf7fa4a9d12e378a52a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 323 zcmZ?wbhEHb6krfwxXQrr@9+D6zn=X4cJ<${r+>d*`SKk--`OT*-X9 diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/zooinspector/icons/trash.gif b/pkg/registry/zookeeper-3.4.6/src/contrib/zooinspector/icons/trash.gif deleted file mode 100644 index 5f47780f0e61161f1fb21701d68f697fe80cbec9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 132 zcmV-~0DJ#ONk%w1VGsZi0Kx|VhLob9uDr9s&%Mjp$JFB5==JpZ{{R30A^8LW000L7 zEC2ui01yBW0009?c&gC8kOf0c0P(oZ7pO)d76c&(n8vM*SB<2ZGNDimwh*AuSJ=4U mZlJf6sN=bQN1>AjWhS3M!*M diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/zooinspector/ivy.xml b/pkg/registry/zookeeper-3.4.6/src/contrib/zooinspector/ivy.xml deleted file mode 100644 index 096f05c3f..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/contrib/zooinspector/ivy.xml +++ /dev/null @@ -1,48 +0,0 @@ - - - - - - - - ZooInspector - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/zooinspector/lib/jtoaster-1.0.4.jar b/pkg/registry/zookeeper-3.4.6/src/contrib/zooinspector/lib/jtoaster-1.0.4.jar deleted file mode 100644 index aaf3f6ea06f4b66fbe1719f63dd8f68e6ed05193..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14975 zcma)j1CS-#)@IqZZ5v&-ZQHhO+vswaZQHhOqpP~AOVj<{%-p^==700niHyh-=j6)0 zkSq88_P6AvfI(0IAbx#Tnn;)d{ty%Z5C9nwWdT|VSy6f!0a*!A5hZ0h8PSh%0DuRX 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 - - - - - -Eclipse Public License - Version 1.0 - - - - - - -

        Eclipse Public License - v 1.0

        - -

        THE ACCOMPANYING PROGRAM IS PROVIDED UNDER THE TERMS OF THIS ECLIPSE -PUBLIC LICENSE ("AGREEMENT"). ANY USE, REPRODUCTION OR -DISTRIBUTION OF THE PROGRAM CONSTITUTES RECIPIENT'S ACCEPTANCE OF THIS -AGREEMENT.

        - -

        1. DEFINITIONS

        - -

        "Contribution" means:

        - -

        a) in the case of the initial Contributor, the initial -code and documentation distributed under this Agreement, and

        -

        b) in the case of each subsequent Contributor:

        -

        i) changes to the Program, and

        -

        ii) additions to the Program;

        -

        where such changes and/or additions to the Program -originate from and are distributed by that particular Contributor. A -Contribution 'originates' from a Contributor if it was added to the -Program by such Contributor itself or anyone acting on such -Contributor's behalf. Contributions do not include additions to the -Program which: (i) are separate modules of software distributed in -conjunction with the Program under their own license agreement, and (ii) -are not derivative works of the Program.

        - -

        "Contributor" means any person or entity that distributes -the Program.

        - -

        "Licensed Patents" mean patent claims licensable by a -Contributor which are necessarily infringed by the use or sale of its -Contribution alone or when combined with the Program.

        - -

        "Program" means the Contributions distributed in accordance -with this Agreement.

        - -

        "Recipient" means anyone who receives the Program under -this Agreement, including all Contributors.

        - -

        2. GRANT OF RIGHTS

        - -

        a) Subject to the terms of this Agreement, each -Contributor hereby grants Recipient a non-exclusive, worldwide, -royalty-free copyright license to reproduce, prepare derivative works -of, publicly display, publicly perform, distribute and sublicense the -Contribution of such Contributor, if any, and such derivative works, in -source code and object code form.

        - -

        b) Subject to the terms of this Agreement, each -Contributor hereby grants Recipient a non-exclusive, worldwide, -royalty-free patent license under Licensed Patents to make, use, sell, -offer to sell, import and otherwise transfer the Contribution of such -Contributor, if any, in source code and object code form. This patent -license shall apply to the combination of the Contribution and the -Program if, at the time the Contribution is added by the Contributor, -such addition of the Contribution causes such combination to be covered -by the Licensed Patents. The patent license shall not apply to any other -combinations which include the Contribution. No hardware per se is -licensed hereunder.

        - -

        c) Recipient understands that although each Contributor -grants the licenses to its Contributions set forth herein, no assurances -are provided by any Contributor that the Program does not infringe the -patent or other intellectual property rights of any other entity. Each -Contributor disclaims any liability to Recipient for claims brought by -any other entity based on infringement of intellectual property rights -or otherwise. As a condition to exercising the rights and licenses -granted hereunder, each Recipient hereby assumes sole responsibility to -secure any other intellectual property rights needed, if any. For -example, if a third party patent license is required to allow Recipient -to distribute the Program, it is Recipient's responsibility to acquire -that license before distributing the Program.

        - -

        d) Each Contributor represents that to its knowledge it -has sufficient copyright rights in its Contribution, if any, to grant -the copyright license set forth in this Agreement.

        - -

        3. REQUIREMENTS

        - -

        A Contributor may choose to distribute the Program in object code -form under its own license agreement, provided that:

        - -

        a) it complies with the terms and conditions of this -Agreement; and

        - -

        b) its license agreement:

        - -

        i) effectively disclaims on behalf of all Contributors -all warranties and conditions, express and implied, including warranties -or conditions of title and non-infringement, and implied warranties or -conditions of merchantability and fitness for a particular purpose;

        - -

        ii) effectively excludes on behalf of all Contributors -all liability for damages, including direct, indirect, special, -incidental and consequential damages, such as lost profits;

        - -

        iii) states that any provisions which differ from this -Agreement are offered by that Contributor alone and not by any other -party; and

        - -

        iv) states that source code for the Program is available -from such Contributor, and informs licensees how to obtain it in a -reasonable manner on or through a medium customarily used for software -exchange.

        - -

        When the Program is made available in source code form:

        - -

        a) it must be made available under this Agreement; and

        - -

        b) a copy of this Agreement must be included with each -copy of the Program.

        - -

        Contributors may not remove or alter any copyright notices contained -within the Program.

        - -

        Each Contributor must identify itself as the originator of its -Contribution, if any, in a manner that reasonably allows subsequent -Recipients to identify the originator of the Contribution.

        - -

        4. COMMERCIAL DISTRIBUTION

        - -

        Commercial distributors of software may accept certain -responsibilities with respect to end users, business partners and the -like. While this license is intended to facilitate the commercial use of -the Program, the Contributor who includes the Program in a commercial -product offering should do so in a manner which does not create -potential liability for other Contributors. Therefore, if a Contributor -includes the Program in a commercial product offering, such Contributor -("Commercial Contributor") hereby agrees to defend and -indemnify every other Contributor ("Indemnified Contributor") -against any losses, damages and costs (collectively "Losses") -arising from claims, lawsuits and other legal actions brought by a third -party against the Indemnified Contributor to the extent caused by the -acts or omissions of such Commercial Contributor in connection with its -distribution of the Program in a commercial product offering. The -obligations in this section do not apply to any claims or Losses -relating to any actual or alleged intellectual property infringement. In -order to qualify, an Indemnified Contributor must: a) promptly notify -the Commercial Contributor in writing of such claim, and b) allow the -Commercial Contributor to control, and cooperate with the Commercial -Contributor in, the defense and any related settlement negotiations. The -Indemnified Contributor may participate in any such claim at its own -expense.

        - -

        For example, a Contributor might include the Program in a commercial -product offering, Product X. That Contributor is then a Commercial -Contributor. If that Commercial Contributor then makes performance -claims, or offers warranties related to Product X, those performance -claims and warranties are such Commercial Contributor's responsibility -alone. Under this section, the Commercial Contributor would have to -defend claims against the other Contributors related to those -performance claims and warranties, and if a court requires any other -Contributor to pay any damages as a result, the Commercial Contributor -must pay those damages.

        - -

        5. NO WARRANTY

        - -

        EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, THE PROGRAM IS -PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS -OF ANY KIND, EITHER EXPRESS OR IMPLIED INCLUDING, WITHOUT LIMITATION, -ANY WARRANTIES OR CONDITIONS OF TITLE, NON-INFRINGEMENT, MERCHANTABILITY -OR FITNESS FOR A PARTICULAR PURPOSE. Each Recipient is solely -responsible for determining the appropriateness of using and -distributing the Program and assumes all risks associated with its -exercise of rights under this Agreement , including but not limited to -the risks and costs of program errors, compliance with applicable laws, -damage to or loss of data, programs or equipment, and unavailability or -interruption of operations.

        - -

        6. DISCLAIMER OF LIABILITY

        - -

        EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, NEITHER RECIPIENT -NOR ANY CONTRIBUTORS SHALL HAVE ANY LIABILITY FOR ANY DIRECT, INDIRECT, -INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING -WITHOUT LIMITATION LOST PROFITS), 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 OR -DISTRIBUTION OF THE PROGRAM OR THE EXERCISE OF ANY RIGHTS GRANTED -HEREUNDER, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.

        - -

        7. GENERAL

        - -

        If any provision of this Agreement is invalid or unenforceable under -applicable law, it shall not affect the validity or enforceability of -the remainder of the terms of this Agreement, and without further action -by the parties hereto, such provision shall be reformed to the minimum -extent necessary to make such provision valid and enforceable.

        - -

        If Recipient institutes patent litigation against any entity -(including a cross-claim or counterclaim in a lawsuit) alleging that the -Program itself (excluding combinations of the Program with other -software or hardware) infringes such Recipient's patent(s), then such -Recipient's rights granted under Section 2(b) shall terminate as of the -date such litigation is filed.

        - -

        All Recipient's rights under this Agreement shall terminate if it -fails to comply with any of the material terms or conditions of this -Agreement and does not cure such failure in a reasonable period of time -after becoming aware of such noncompliance. If all Recipient's rights -under this Agreement terminate, Recipient agrees to cease use and -distribution of the Program as soon as reasonably practicable. However, -Recipient's obligations under this Agreement and any licenses granted by -Recipient relating to the Program shall continue and survive.

        - -

        Everyone is permitted to copy and distribute copies of this -Agreement, but in order to avoid inconsistency the Agreement is -copyrighted and may only be modified in the following manner. The -Agreement Steward reserves the right to publish new versions (including -revisions) of this Agreement from time to time. No one other than the -Agreement Steward has the right to modify this Agreement. The Eclipse -Foundation is the initial Agreement Steward. The Eclipse Foundation may -assign the responsibility to serve as the Agreement Steward to a -suitable separate entity. Each new version of the Agreement will be -given a distinguishing version number. The Program (including -Contributions) may always be distributed subject to the version of the -Agreement under which it was received. In addition, after a new version -of the Agreement is published, Contributor may elect to distribute the -Program (including its Contributions) under the new version. Except as -expressly stated in Sections 2(a) and 2(b) above, Recipient receives no -rights or licenses to the intellectual property of any Contributor under -this Agreement, whether expressly, by implication, estoppel or -otherwise. All rights in the Program not expressly granted under this -Agreement are reserved.

        - -

        This Agreement is governed by the laws of the State of New York and -the intellectual property laws of the United States of America. No party -to this Agreement will bring a legal action under this Agreement more -than one year after the cause of action arose. Each party waives its -rights to a jury trial in any resulting litigation.

        - - - - diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/zooinspector/src/java/org/apache/zookeeper/inspector/ZooInspector.java b/pkg/registry/zookeeper-3.4.6/src/contrib/zooinspector/src/java/org/apache/zookeeper/inspector/ZooInspector.java deleted file mode 100644 index b637bfd4c..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/contrib/zooinspector/src/java/org/apache/zookeeper/inspector/ZooInspector.java +++ /dev/null @@ -1,66 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you 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. - */ -package org.apache.zookeeper.inspector; - -import java.awt.event.WindowAdapter; -import java.awt.event.WindowEvent; - -import javax.swing.JFrame; -import javax.swing.JOptionPane; -import javax.swing.UIManager; - -import org.apache.zookeeper.inspector.gui.ZooInspectorPanel; -import org.apache.zookeeper.inspector.logger.LoggerFactory; -import org.apache.zookeeper.inspector.manager.ZooInspectorManagerImpl; - -/** - * - */ -public class ZooInspector { - /** - * @param args - * - not used. The value of these parameters will have no effect - * on the application - */ - public static void main(String[] args) { - try { - UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); - JFrame frame = new JFrame("ZooInspector"); - frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); - final ZooInspectorPanel zooInspectorPanel = new ZooInspectorPanel( - new ZooInspectorManagerImpl()); - frame.addWindowListener(new WindowAdapter() { - @Override - public void windowClosed(WindowEvent e) { - super.windowClosed(e); - zooInspectorPanel.disconnect(true); - } - }); - - frame.setContentPane(zooInspectorPanel); - frame.setSize(1024, 768); - frame.setVisible(true); - } catch (Exception e) { - LoggerFactory.getLogger().error( - "Error occurred loading ZooInspector", e); - JOptionPane.showMessageDialog(null, - "ZooInspector failed to start: " + e.getMessage(), "Error", - JOptionPane.ERROR_MESSAGE); - } - } -} diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/zooinspector/src/java/org/apache/zookeeper/inspector/encryption/BasicDataEncryptionManager.java b/pkg/registry/zookeeper-3.4.6/src/contrib/zooinspector/src/java/org/apache/zookeeper/inspector/encryption/BasicDataEncryptionManager.java deleted file mode 100644 index a9e5ac477..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/contrib/zooinspector/src/java/org/apache/zookeeper/inspector/encryption/BasicDataEncryptionManager.java +++ /dev/null @@ -1,50 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you 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. - */ -package org.apache.zookeeper.inspector.encryption; - -/** - * - */ -public class BasicDataEncryptionManager implements DataEncryptionManager { - - /* - * (non-Javadoc) - * - * @see - * org.apache.zookeeper.inspector.encryption.DataEncryptionManager#decryptData - * (byte[]) - */ - public String decryptData(byte[] encrypted) throws Exception { - return new String(encrypted); - } - - /* - * (non-Javadoc) - * - * @see - * org.apache.zookeeper.inspector.encryption.DataEncryptionManager#encryptData - * (java.lang.String) - */ - public byte[] encryptData(String data) throws Exception { - if (data == null) { - return new byte[0]; - } - return data.getBytes(); - } - -} diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/zooinspector/src/java/org/apache/zookeeper/inspector/encryption/DataEncryptionManager.java b/pkg/registry/zookeeper-3.4.6/src/contrib/zooinspector/src/java/org/apache/zookeeper/inspector/encryption/DataEncryptionManager.java deleted file mode 100644 index 15a9ee435..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/contrib/zooinspector/src/java/org/apache/zookeeper/inspector/encryption/DataEncryptionManager.java +++ /dev/null @@ -1,39 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you 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. - */ -package org.apache.zookeeper.inspector.encryption; - -/** - * A class which describes how data should be encrypted and decrypted - */ -public interface DataEncryptionManager { - /** - * @param data - * - the data to be encrypted - * @return the encrypted data - * @throws Exception - */ - public byte[] encryptData(String data) throws Exception; - - /** - * @param encrypted - * - the data to be decrypted - * @return the decrypted data - * @throws Exception - */ - public String decryptData(byte[] encrypted) throws Exception; -} diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/zooinspector/src/java/org/apache/zookeeper/inspector/gui/NodeViewersChangeListener.java b/pkg/registry/zookeeper-3.4.6/src/contrib/zooinspector/src/java/org/apache/zookeeper/inspector/gui/NodeViewersChangeListener.java deleted file mode 100644 index b0b1e9801..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/contrib/zooinspector/src/java/org/apache/zookeeper/inspector/gui/NodeViewersChangeListener.java +++ /dev/null @@ -1,37 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you 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. - */ -package org.apache.zookeeper.inspector.gui; - -import java.util.List; - -import org.apache.zookeeper.inspector.gui.nodeviewer.ZooInspectorNodeViewer; - -/** - * A Listener for changes to the configuration of which node viewers are shown - */ -public interface NodeViewersChangeListener { - /** - * Called when the node viewers configuration is changed (i.e node viewers - * are added, removed or the order of the node viewers is changed) - * - * @param newViewers - * - a {@link List} of {@link ZooInspectorNodeViewer}s which are - * to be shown - */ - public void nodeViewersChanged(List newViewers); -} diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/zooinspector/src/java/org/apache/zookeeper/inspector/gui/ZooInspectorAboutDialog.java b/pkg/registry/zookeeper-3.4.6/src/contrib/zooinspector/src/java/org/apache/zookeeper/inspector/gui/ZooInspectorAboutDialog.java deleted file mode 100644 index fbae8f10f..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/contrib/zooinspector/src/java/org/apache/zookeeper/inspector/gui/ZooInspectorAboutDialog.java +++ /dev/null @@ -1,80 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you 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. - */ -package org.apache.zookeeper.inspector.gui; - -import java.awt.BorderLayout; -import java.awt.Dimension; -import java.awt.FlowLayout; -import java.awt.Frame; -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; -import java.io.IOException; - -import javax.swing.JButton; -import javax.swing.JDialog; -import javax.swing.JEditorPane; -import javax.swing.JPanel; - -import org.apache.zookeeper.inspector.logger.LoggerFactory; - -/** - * The About Dialog for the application - */ -public class ZooInspectorAboutDialog extends JDialog { - /** - * @param frame - * - the Frame from which the dialog is displayed - */ - public ZooInspectorAboutDialog(Frame frame) { - super(frame); - this.setLayout(new BorderLayout()); - this.setIconImage(ZooInspectorIconResources.getInformationIcon() - .getImage()); - this.setTitle("About ZooInspector"); - this.setModal(true); - this.setAlwaysOnTop(true); - this.setResizable(false); - JPanel panel = new JPanel(); - panel.setLayout(new BorderLayout()); - JEditorPane aboutPane = new JEditorPane(); - aboutPane.setEditable(false); - aboutPane.setOpaque(false); - java.net.URL aboutURL = ZooInspectorAboutDialog.class - .getResource("about.html"); - try { - aboutPane.setPage(aboutURL); - } catch (IOException e) { - LoggerFactory.getLogger().error( - "Error loading about.html, file may be corrupt", e); - } - panel.add(aboutPane, BorderLayout.CENTER); - panel.setPreferredSize(new Dimension(600, 200)); - JPanel buttonsPanel = new JPanel(); - buttonsPanel.setLayout(new FlowLayout(FlowLayout.CENTER, 10, 10)); - JButton okButton = new JButton("OK"); - okButton.addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent e) { - ZooInspectorAboutDialog.this.dispose(); - } - }); - buttonsPanel.add(okButton); - this.add(panel, BorderLayout.CENTER); - this.add(buttonsPanel, BorderLayout.SOUTH); - this.pack(); - } -} diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/zooinspector/src/java/org/apache/zookeeper/inspector/gui/ZooInspectorConnectionPropertiesDialog.java b/pkg/registry/zookeeper-3.4.6/src/contrib/zooinspector/src/java/org/apache/zookeeper/inspector/gui/ZooInspectorConnectionPropertiesDialog.java deleted file mode 100644 index c7db5243b..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/contrib/zooinspector/src/java/org/apache/zookeeper/inspector/gui/ZooInspectorConnectionPropertiesDialog.java +++ /dev/null @@ -1,321 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you 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. - */ -package org.apache.zookeeper.inspector.gui; - -import java.awt.BorderLayout; -import java.awt.GridBagConstraints; -import java.awt.GridBagLayout; -import java.awt.Insets; -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; -import java.io.File; -import java.io.FileReader; -import java.io.IOException; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.Properties; -import java.util.Map.Entry; - -import javax.swing.JButton; -import javax.swing.JComboBox; -import javax.swing.JComponent; -import javax.swing.JDialog; -import javax.swing.JFileChooser; -import javax.swing.JLabel; -import javax.swing.JOptionPane; -import javax.swing.JPanel; -import javax.swing.JTextField; - -import org.apache.zookeeper.inspector.logger.LoggerFactory; -import org.apache.zookeeper.inspector.manager.Pair; - -/** - * The connection properties dialog. This is used to determine the settings for - * connecting to a zookeeper instance - */ -public class ZooInspectorConnectionPropertiesDialog extends JDialog { - - private final HashMap components; - - /** - * @param lastConnectionProps - * - the last connection properties used. if this is the first - * conneciton since starting the applications this will be the - * default settings - * @param connectionPropertiesTemplateAndLabels - * - the connection properties and labels to show in this dialog - * @param zooInspectorPanel - * - the {@link ZooInspectorPanel} linked to this dialog - */ - public ZooInspectorConnectionPropertiesDialog( - Properties lastConnectionProps, - Pair>, Map> connectionPropertiesTemplateAndLabels, - final ZooInspectorPanel zooInspectorPanel) { - final Map> connectionPropertiesTemplate = connectionPropertiesTemplateAndLabels - .getKey(); - final Map connectionPropertiesLabels = connectionPropertiesTemplateAndLabels - .getValue(); - this.setLayout(new BorderLayout()); - this.setTitle("Connection Settings"); - this.setModal(true); - this.setAlwaysOnTop(true); - this.setResizable(false); - final JPanel options = new JPanel(); - final JFileChooser fileChooser = new JFileChooser(); - options.setLayout(new GridBagLayout()); - int i = 0; - components = new HashMap(); - for (Entry> entry : connectionPropertiesTemplate - .entrySet()) { - int rowPos = 2 * i + 1; - JLabel label = new JLabel(connectionPropertiesLabels.get(entry - .getKey())); - GridBagConstraints c1 = new GridBagConstraints(); - c1.gridx = 0; - c1.gridy = rowPos; - c1.gridwidth = 1; - c1.gridheight = 1; - c1.weightx = 0; - c1.weighty = 0; - c1.anchor = GridBagConstraints.WEST; - c1.fill = GridBagConstraints.HORIZONTAL; - c1.insets = new Insets(5, 5, 5, 5); - c1.ipadx = 0; - c1.ipady = 0; - options.add(label, c1); - if (entry.getValue().size() == 0) { - JTextField text = new JTextField(); - GridBagConstraints c2 = new GridBagConstraints(); - c2.gridx = 2; - c2.gridy = rowPos; - c2.gridwidth = 1; - c2.gridheight = 1; - c2.weightx = 0; - c2.weighty = 0; - c2.anchor = GridBagConstraints.WEST; - c2.fill = GridBagConstraints.HORIZONTAL; - c2.insets = new Insets(5, 5, 5, 5); - c2.ipadx = 0; - c2.ipady = 0; - options.add(text, c2); - components.put(entry.getKey(), text); - } else if (entry.getValue().size() == 1) { - JTextField text = new JTextField(entry.getValue().get(0)); - GridBagConstraints c2 = new GridBagConstraints(); - c2.gridx = 2; - c2.gridy = rowPos; - c2.gridwidth = 1; - c2.gridheight = 1; - c2.weightx = 0; - c2.weighty = 0; - c2.anchor = GridBagConstraints.WEST; - c2.fill = GridBagConstraints.HORIZONTAL; - c2.insets = new Insets(5, 5, 5, 5); - c2.ipadx = 0; - c2.ipady = 0; - options.add(text, c2); - components.put(entry.getKey(), text); - } else { - List list = entry.getValue(); - JComboBox combo = new JComboBox(list.toArray(new String[list - .size()])); - combo.setSelectedItem(list.get(0)); - GridBagConstraints c2 = new GridBagConstraints(); - c2.gridx = 2; - c2.gridy = rowPos; - c2.gridwidth = 1; - c2.gridheight = 1; - c2.weightx = 0; - c2.weighty = 0; - c2.anchor = GridBagConstraints.WEST; - c2.fill = GridBagConstraints.HORIZONTAL; - c2.insets = new Insets(5, 5, 5, 5); - c2.ipadx = 0; - c2.ipady = 0; - options.add(combo, c2); - components.put(entry.getKey(), combo); - } - i++; - } - loadConnectionProps(lastConnectionProps); - JPanel buttonsPanel = new JPanel(); - buttonsPanel.setLayout(new GridBagLayout()); - JButton loadPropsFileButton = new JButton("Load from file"); - loadPropsFileButton.addActionListener(new ActionListener() { - - public void actionPerformed(ActionEvent e) { - int result = fileChooser - .showOpenDialog(ZooInspectorConnectionPropertiesDialog.this); - if (result == JFileChooser.APPROVE_OPTION) { - File propsFilePath = fileChooser.getSelectedFile(); - Properties props = new Properties(); - try { - FileReader reader = new FileReader(propsFilePath); - try { - props.load(reader); - loadConnectionProps(props); - } finally { - reader.close(); - } - } catch (IOException ex) { - LoggerFactory - .getLogger() - .error( - "An Error occurred loading connection properties from file", - ex); - JOptionPane - .showMessageDialog( - ZooInspectorConnectionPropertiesDialog.this, - "An Error occurred loading connection properties from file", - "Error", JOptionPane.ERROR_MESSAGE); - } - options.revalidate(); - options.repaint(); - } - - } - }); - GridBagConstraints c3 = new GridBagConstraints(); - c3.gridx = 0; - c3.gridy = 0; - c3.gridwidth = 1; - c3.gridheight = 1; - c3.weightx = 0; - c3.weighty = 1; - c3.anchor = GridBagConstraints.SOUTHWEST; - c3.fill = GridBagConstraints.NONE; - c3.insets = new Insets(5, 5, 5, 5); - c3.ipadx = 0; - c3.ipady = 0; - buttonsPanel.add(loadPropsFileButton, c3); - JButton saveDefaultPropsFileButton = new JButton("Set As Default"); - saveDefaultPropsFileButton.addActionListener(new ActionListener() { - - public void actionPerformed(ActionEvent e) { - - Properties connectionProps = getConnectionProps(); - try { - zooInspectorPanel - .setdefaultConnectionProps(connectionProps); - } catch (IOException ex) { - LoggerFactory - .getLogger() - .error( - "An Error occurred saving the default connection properties file", - ex); - JOptionPane - .showMessageDialog( - ZooInspectorConnectionPropertiesDialog.this, - "An Error occurred saving the default connection properties file", - "Error", JOptionPane.ERROR_MESSAGE); - } - } - }); - GridBagConstraints c6 = new GridBagConstraints(); - c6.gridx = 1; - c6.gridy = 0; - c6.gridwidth = 1; - c6.gridheight = 1; - c6.weightx = 1; - c6.weighty = 1; - c6.anchor = GridBagConstraints.SOUTHWEST; - c6.fill = GridBagConstraints.NONE; - c6.insets = new Insets(5, 5, 5, 5); - c6.ipadx = 0; - c6.ipady = 0; - buttonsPanel.add(saveDefaultPropsFileButton, c6); - JButton okButton = new JButton("OK"); - okButton.addActionListener(new ActionListener() { - - public void actionPerformed(ActionEvent e) { - ZooInspectorConnectionPropertiesDialog.this.dispose(); - Properties connectionProps = getConnectionProps(); - zooInspectorPanel.connect(connectionProps); - } - }); - GridBagConstraints c4 = new GridBagConstraints(); - c4.gridx = 2; - c4.gridy = 0; - c4.gridwidth = 1; - c4.gridheight = 1; - c4.weightx = 0; - c4.weighty = 1; - c4.anchor = GridBagConstraints.SOUTH; - c4.fill = GridBagConstraints.HORIZONTAL; - c4.insets = new Insets(5, 5, 5, 5); - c4.ipadx = 0; - c4.ipady = 0; - buttonsPanel.add(okButton, c4); - JButton cancelButton = new JButton("Cancel"); - cancelButton.addActionListener(new ActionListener() { - - public void actionPerformed(ActionEvent e) { - ZooInspectorConnectionPropertiesDialog.this.dispose(); - } - }); - GridBagConstraints c5 = new GridBagConstraints(); - c5.gridx = 3; - c5.gridy = 0; - c5.gridwidth = 1; - c5.gridheight = 1; - c5.weightx = 0; - c5.weighty = 1; - c5.anchor = GridBagConstraints.SOUTH; - c5.fill = GridBagConstraints.HORIZONTAL; - c5.insets = new Insets(5, 5, 5, 5); - c5.ipadx = 0; - c5.ipady = 0; - buttonsPanel.add(cancelButton, c5); - this.add(options, BorderLayout.CENTER); - this.add(buttonsPanel, BorderLayout.SOUTH); - this.pack(); - } - - private void loadConnectionProps(Properties props) { - if (props != null) { - for (Object key : props.keySet()) { - String propsKey = (String) key; - if (components.containsKey(propsKey)) { - JComponent component = components.get(propsKey); - String value = props.getProperty(propsKey); - if (component instanceof JTextField) { - ((JTextField) component).setText(value); - } else if (component instanceof JComboBox) { - ((JComboBox) component).setSelectedItem(value); - } - } - } - } - } - - private Properties getConnectionProps() { - Properties connectionProps = new Properties(); - for (Entry entry : components.entrySet()) { - String value = null; - JComponent component = entry.getValue(); - if (component instanceof JTextField) { - value = ((JTextField) component).getText(); - } else if (component instanceof JComboBox) { - value = ((JComboBox) component).getSelectedItem().toString(); - } - connectionProps.put(entry.getKey(), value); - } - return connectionProps; - } -} diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/zooinspector/src/java/org/apache/zookeeper/inspector/gui/ZooInspectorIconResources.java b/pkg/registry/zookeeper-3.4.6/src/contrib/zooinspector/src/java/org/apache/zookeeper/inspector/gui/ZooInspectorIconResources.java deleted file mode 100644 index fa45ab31e..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/contrib/zooinspector/src/java/org/apache/zookeeper/inspector/gui/ZooInspectorIconResources.java +++ /dev/null @@ -1,118 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you 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. - */ -package org.apache.zookeeper.inspector.gui; - -import javax.swing.ImageIcon; - -/** - * A class containing static methods for retrieving {@link ImageIcon}s used in - * the application - */ -public class ZooInspectorIconResources { - - /** - * @return file icon - */ - public static ImageIcon getTreeLeafIcon() { - return new ImageIcon("icons/file_obj.gif"); //$NON-NLS-1$ - } - - /** - * @return folder open icon - */ - public static ImageIcon getTreeOpenIcon() { - return new ImageIcon("icons/fldr_obj.gif"); //$NON-NLS-1$ - } - - /** - * @return folder closed icon - */ - public static ImageIcon getTreeClosedIcon() { - return new ImageIcon("icons/fldr_obj.gif"); //$NON-NLS-1$ - } - - /** - * @return connect icon - */ - public static ImageIcon getConnectIcon() { - return new ImageIcon("icons/launch_run.gif"); //$NON-NLS-1$ - } - - /** - * @return disconnect icon - */ - public static ImageIcon getDisconnectIcon() { - return new ImageIcon("icons/launch_stop.gif"); //$NON-NLS-1$ - } - - /** - * @return save icon - */ - public static ImageIcon getSaveIcon() { - return new ImageIcon("icons/save_edit.gif"); //$NON-NLS-1$ - } - - /** - * @return add icon - */ - public static ImageIcon getAddNodeIcon() { - return new ImageIcon("icons/new_con.gif"); //$NON-NLS-1$ - } - - /** - * @return delete icon - */ - public static ImageIcon getDeleteNodeIcon() { - return new ImageIcon("icons/trash.gif"); //$NON-NLS-1$ - } - - /** - * @return refresh icon - */ - public static ImageIcon getRefreshIcon() { - return new ImageIcon("icons/refresh.gif"); //$NON-NLS-1$ - } - - /** - * @return information icon - */ - public static ImageIcon getInformationIcon() { - return new ImageIcon("icons/info_obj.gif"); //$NON-NLS-1$ - } - - /** - * @return node viewers icon - */ - public static ImageIcon getChangeNodeViewersIcon() { - return new ImageIcon("icons/edtsrclkup_co.gif"); //$NON-NLS-1$ - } - - /** - * @return up icon - */ - public static ImageIcon getUpIcon() { - return new ImageIcon("icons/search_prev.gif"); //$NON-NLS-1$ - } - - /** - * @return down icon - */ - public static ImageIcon getDownIcon() { - return new ImageIcon("icons/search_next.gif"); //$NON-NLS-1$ - } -} diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/zooinspector/src/java/org/apache/zookeeper/inspector/gui/ZooInspectorNodeViewersDialog.java b/pkg/registry/zookeeper-3.4.6/src/contrib/zooinspector/src/java/org/apache/zookeeper/inspector/gui/ZooInspectorNodeViewersDialog.java deleted file mode 100644 index fd0b00ac0..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/contrib/zooinspector/src/java/org/apache/zookeeper/inspector/gui/ZooInspectorNodeViewersDialog.java +++ /dev/null @@ -1,605 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you 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. - */ -package org.apache.zookeeper.inspector.gui; - -import java.awt.BorderLayout; -import java.awt.Component; -import java.awt.FlowLayout; -import java.awt.Frame; -import java.awt.GridBagConstraints; -import java.awt.GridBagLayout; -import java.awt.Insets; -import java.awt.datatransfer.Transferable; -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; -import java.io.File; -import java.io.IOException; -import java.util.ArrayList; -import java.util.Collection; -import java.util.List; - -import javax.swing.DefaultListCellRenderer; -import javax.swing.DefaultListModel; -import javax.swing.DropMode; -import javax.swing.JButton; -import javax.swing.JComponent; -import javax.swing.JDialog; -import javax.swing.JFileChooser; -import javax.swing.JLabel; -import javax.swing.JList; -import javax.swing.JOptionPane; -import javax.swing.JPanel; -import javax.swing.JScrollPane; -import javax.swing.JTextField; -import javax.swing.ListSelectionModel; -import javax.swing.TransferHandler; -import javax.swing.event.ListSelectionEvent; -import javax.swing.event.ListSelectionListener; - -import org.apache.zookeeper.inspector.gui.nodeviewer.ZooInspectorNodeViewer; -import org.apache.zookeeper.inspector.logger.LoggerFactory; -import org.apache.zookeeper.inspector.manager.ZooInspectorManager; - -/** - * A {@link JDialog} for configuring which {@link ZooInspectorNodeViewer}s to - * show in the application - */ -public class ZooInspectorNodeViewersDialog extends JDialog implements - ListSelectionListener { - - private final JButton upButton; - private final JButton downButton; - private final JButton removeButton; - private final JButton addButton; - private final JList viewersList; - private final JButton saveFileButton; - private final JButton loadFileButton; - private final JButton setDefaultsButton; - private final JFileChooser fileChooser = new JFileChooser(new File(".")); - - /** - * @param frame - * - the Frame from which the dialog is displayed - * @param currentViewers - * - the {@link ZooInspectorNodeViewer}s to show - * @param listeners - * - the {@link NodeViewersChangeListener}s which need to be - * notified of changes to the node viewers configuration - * @param manager - * - the {@link ZooInspectorManager} for the application - * - */ - public ZooInspectorNodeViewersDialog(Frame frame, - final List currentViewers, - final Collection listeners, - final ZooInspectorManager manager) { - super(frame); - final List newViewers = new ArrayList( - currentViewers); - this.setLayout(new BorderLayout()); - this.setIconImage(ZooInspectorIconResources.getChangeNodeViewersIcon() - .getImage()); - this.setTitle("About ZooInspector"); - this.setModal(true); - this.setAlwaysOnTop(true); - this.setResizable(true); - final JPanel panel = new JPanel(); - panel.setLayout(new GridBagLayout()); - viewersList = new JList(); - DefaultListModel model = new DefaultListModel(); - for (ZooInspectorNodeViewer viewer : newViewers) { - model.addElement(viewer); - } - viewersList.setModel(model); - viewersList.setCellRenderer(new DefaultListCellRenderer() { - @Override - public Component getListCellRendererComponent(JList list, - Object value, int index, boolean isSelected, - boolean cellHasFocus) { - ZooInspectorNodeViewer viewer = (ZooInspectorNodeViewer) value; - JLabel label = (JLabel) super.getListCellRendererComponent( - list, value, index, isSelected, cellHasFocus); - label.setText(viewer.getTitle()); - return label; - } - }); - viewersList.setDropMode(DropMode.INSERT); - viewersList.enableInputMethods(true); - viewersList.setDragEnabled(true); - viewersList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); - viewersList.getSelectionModel().addListSelectionListener(this); - viewersList.setTransferHandler(new TransferHandler() { - - @Override - public boolean canImport(TransferHandler.TransferSupport info) { - // we only import NodeViewers - if (!info - .isDataFlavorSupported(ZooInspectorNodeViewer.nodeViewerDataFlavor)) { - return false; - } - - JList.DropLocation dl = (JList.DropLocation) info - .getDropLocation(); - if (dl.getIndex() == -1) { - return false; - } - return true; - } - - @Override - public boolean importData(TransferHandler.TransferSupport info) { - JList.DropLocation dl = (JList.DropLocation) info - .getDropLocation(); - DefaultListModel listModel = (DefaultListModel) viewersList - .getModel(); - int index = dl.getIndex(); - boolean insert = dl.isInsert(); - // Get the string that is being dropped. - Transferable t = info.getTransferable(); - String data; - try { - data = (String) t - .getTransferData(ZooInspectorNodeViewer.nodeViewerDataFlavor); - } catch (Exception e) { - return false; - } - try { - ZooInspectorNodeViewer viewer = (ZooInspectorNodeViewer) Class - .forName(data).newInstance(); - if (listModel.contains(viewer)) { - listModel.removeElement(viewer); - } - if (insert) { - listModel.add(index, viewer); - } else { - listModel.set(index, viewer); - } - return true; - } catch (Exception e) { - LoggerFactory.getLogger().error( - "Error instantiating class: " + data, e); - return false; - } - - } - - @Override - public int getSourceActions(JComponent c) { - return MOVE; - } - - @Override - protected Transferable createTransferable(JComponent c) { - JList list = (JList) c; - ZooInspectorNodeViewer value = (ZooInspectorNodeViewer) list - .getSelectedValue(); - return value; - } - }); - JScrollPane scroller = new JScrollPane(viewersList); - GridBagConstraints c1 = new GridBagConstraints(); - c1.gridx = 0; - c1.gridy = 0; - c1.gridwidth = 3; - c1.gridheight = 3; - c1.weightx = 0; - c1.weighty = 1; - c1.anchor = GridBagConstraints.CENTER; - c1.fill = GridBagConstraints.BOTH; - c1.insets = new Insets(5, 5, 5, 5); - c1.ipadx = 0; - c1.ipady = 0; - panel.add(scroller, c1); - upButton = new JButton(ZooInspectorIconResources.getUpIcon()); - downButton = new JButton(ZooInspectorIconResources.getDownIcon()); - removeButton = new JButton(ZooInspectorIconResources - .getDeleteNodeIcon()); - addButton = new JButton(ZooInspectorIconResources.getAddNodeIcon()); - upButton.setEnabled(false); - downButton.setEnabled(false); - removeButton.setEnabled(false); - addButton.setEnabled(true); - upButton.setToolTipText("Move currently selected node viewer up"); - downButton.setToolTipText("Move currently selected node viewer down"); - removeButton.setToolTipText("Remove currently selected node viewer"); - addButton.setToolTipText("Add node viewer"); - final JTextField newViewerTextField = new JTextField(); - GridBagConstraints c2 = new GridBagConstraints(); - c2.gridx = 3; - c2.gridy = 0; - c2.gridwidth = 1; - c2.gridheight = 1; - c2.weightx = 0; - c2.weighty = 0; - c2.anchor = GridBagConstraints.NORTH; - c2.fill = GridBagConstraints.HORIZONTAL; - c2.insets = new Insets(5, 5, 5, 5); - c2.ipadx = 0; - c2.ipady = 0; - panel.add(upButton, c2); - GridBagConstraints c3 = new GridBagConstraints(); - c3.gridx = 3; - c3.gridy = 2; - c3.gridwidth = 1; - c3.gridheight = 1; - c3.weightx = 0; - c3.weighty = 0; - c3.anchor = GridBagConstraints.NORTH; - c3.fill = GridBagConstraints.HORIZONTAL; - c3.insets = new Insets(5, 5, 5, 5); - c3.ipadx = 0; - c3.ipady = 0; - panel.add(downButton, c3); - GridBagConstraints c4 = new GridBagConstraints(); - c4.gridx = 3; - c4.gridy = 1; - c4.gridwidth = 1; - c4.gridheight = 1; - c4.weightx = 0; - c4.weighty = 0; - c4.anchor = GridBagConstraints.NORTH; - c4.fill = GridBagConstraints.HORIZONTAL; - c4.insets = new Insets(5, 5, 5, 5); - c4.ipadx = 0; - c4.ipady = 0; - panel.add(removeButton, c4); - GridBagConstraints c5 = new GridBagConstraints(); - c5.gridx = 0; - c5.gridy = 3; - c5.gridwidth = 3; - c5.gridheight = 1; - c5.weightx = 0; - c5.weighty = 0; - c5.anchor = GridBagConstraints.CENTER; - c5.fill = GridBagConstraints.BOTH; - c5.insets = new Insets(5, 5, 5, 5); - c5.ipadx = 0; - c5.ipady = 0; - panel.add(newViewerTextField, c5); - GridBagConstraints c6 = new GridBagConstraints(); - c6.gridx = 3; - c6.gridy = 3; - c6.gridwidth = 1; - c6.gridheight = 1; - c6.weightx = 0; - c6.weighty = 0; - c6.anchor = GridBagConstraints.CENTER; - c6.fill = GridBagConstraints.BOTH; - c6.insets = new Insets(5, 5, 5, 5); - c6.ipadx = 0; - c6.ipady = 0; - panel.add(addButton, c6); - upButton.addActionListener(new ActionListener() { - - public void actionPerformed(ActionEvent e) { - DefaultListModel listModel = (DefaultListModel) viewersList - .getModel(); - ZooInspectorNodeViewer viewer = (ZooInspectorNodeViewer) viewersList - .getSelectedValue(); - int index = viewersList.getSelectedIndex(); - if (listModel.contains(viewer)) { - listModel.removeElementAt(index); - listModel.insertElementAt(viewer, index - 1); - viewersList.setSelectedValue(viewer, true); - } - } - }); - downButton.addActionListener(new ActionListener() { - - public void actionPerformed(ActionEvent e) { - DefaultListModel listModel = (DefaultListModel) viewersList - .getModel(); - ZooInspectorNodeViewer viewer = (ZooInspectorNodeViewer) viewersList - .getSelectedValue(); - int index = viewersList.getSelectedIndex(); - if (listModel.contains(viewer)) { - listModel.removeElementAt(index); - listModel.insertElementAt(viewer, index + 1); - viewersList.setSelectedValue(viewer, true); - } - } - }); - removeButton.addActionListener(new ActionListener() { - - public void actionPerformed(ActionEvent e) { - DefaultListModel listModel = (DefaultListModel) viewersList - .getModel(); - ZooInspectorNodeViewer viewer = (ZooInspectorNodeViewer) viewersList - .getSelectedValue(); - int index = viewersList.getSelectedIndex(); - if (listModel.contains(viewer)) { - listModel.removeElement(viewer); - viewersList - .setSelectedIndex(index == listModel.size() ? index - 1 - : index); - } - } - }); - addButton.addActionListener(new ActionListener() { - - public void actionPerformed(ActionEvent e) { - String className = newViewerTextField.getText(); - if (className == null || className.length() == 0) { - JOptionPane - .showMessageDialog( - ZooInspectorNodeViewersDialog.this, - "Please enter the full class name for a Node Viewer and click the add button", - "Input Error", JOptionPane.ERROR_MESSAGE); - } else { - try { - DefaultListModel listModel = (DefaultListModel) viewersList - .getModel(); - ZooInspectorNodeViewer viewer = (ZooInspectorNodeViewer) Class - .forName(className).newInstance(); - if (listModel.contains(viewer)) { - JOptionPane - .showMessageDialog( - ZooInspectorNodeViewersDialog.this, - "Node viewer already exists. Each node viewer can only be added once.", - "Input Error", - JOptionPane.ERROR_MESSAGE); - } else { - listModel.addElement(viewer); - } - } catch (Exception ex) { - LoggerFactory - .getLogger() - .error( - "An error occurred while instaniating the node viewer. ", - ex); - JOptionPane.showMessageDialog( - ZooInspectorNodeViewersDialog.this, - "An error occurred while instaniating the node viewer: " - + ex.getMessage(), "Error", - JOptionPane.ERROR_MESSAGE); - } - } - } - }); - saveFileButton = new JButton("Save"); - loadFileButton = new JButton("Load"); - setDefaultsButton = new JButton("Set As Defaults"); - saveFileButton - .setToolTipText("Save current node viewer configuration to file"); - loadFileButton - .setToolTipText("Load node viewer configuration frm file"); - setDefaultsButton - .setToolTipText("Set current configuration asd defaults"); - GridBagConstraints c7 = new GridBagConstraints(); - c7.gridx = 0; - c7.gridy = 4; - c7.gridwidth = 1; - c7.gridheight = 1; - c7.weightx = 1; - c7.weighty = 0; - c7.anchor = GridBagConstraints.WEST; - c7.fill = GridBagConstraints.VERTICAL; - c7.insets = new Insets(5, 5, 5, 5); - c7.ipadx = 0; - c7.ipady = 0; - panel.add(saveFileButton, c7); - GridBagConstraints c8 = new GridBagConstraints(); - c8.gridx = 1; - c8.gridy = 4; - c8.gridwidth = 1; - c8.gridheight = 1; - c8.weightx = 0; - c8.weighty = 0; - c8.anchor = GridBagConstraints.WEST; - c8.fill = GridBagConstraints.VERTICAL; - c8.insets = new Insets(5, 5, 5, 5); - c8.ipadx = 0; - c8.ipady = 0; - panel.add(loadFileButton, c8); - GridBagConstraints c9 = new GridBagConstraints(); - c9.gridx = 2; - c9.gridy = 4; - c9.gridwidth = 1; - c9.gridheight = 1; - c9.weightx = 0; - c9.weighty = 0; - c9.anchor = GridBagConstraints.WEST; - c9.fill = GridBagConstraints.VERTICAL; - c9.insets = new Insets(5, 5, 5, 5); - c9.ipadx = 0; - c9.ipady = 0; - panel.add(setDefaultsButton, c9); - saveFileButton.addActionListener(new ActionListener() { - - public void actionPerformed(ActionEvent e) { - int result = fileChooser - .showSaveDialog(ZooInspectorNodeViewersDialog.this); - if (result == JFileChooser.APPROVE_OPTION) { - File selectedFile = fileChooser.getSelectedFile(); - int answer = JOptionPane.YES_OPTION; - if (selectedFile.exists()) { - answer = JOptionPane - .showConfirmDialog( - ZooInspectorNodeViewersDialog.this, - "The specified file already exists. do you want to overwrite it?", - "Confirm Overwrite", - JOptionPane.YES_NO_OPTION, - JOptionPane.WARNING_MESSAGE); - } - if (answer == JOptionPane.YES_OPTION) { - DefaultListModel listModel = (DefaultListModel) viewersList - .getModel(); - List nodeViewersClassNames = new ArrayList(); - Object[] modelContents = listModel.toArray(); - for (Object o : modelContents) { - nodeViewersClassNames - .add(((ZooInspectorNodeViewer) o) - .getClass().getCanonicalName()); - } - try { - manager.saveNodeViewersFile(selectedFile, - nodeViewersClassNames); - } catch (IOException ex) { - LoggerFactory - .getLogger() - .error( - "Error saving node veiwer configuration from file.", - ex); - JOptionPane.showMessageDialog( - ZooInspectorNodeViewersDialog.this, - "Error saving node veiwer configuration from file: " - + ex.getMessage(), "Error", - JOptionPane.ERROR_MESSAGE); - } - } - } - } - }); - loadFileButton.addActionListener(new ActionListener() { - - public void actionPerformed(ActionEvent e) { - int result = fileChooser - .showOpenDialog(ZooInspectorNodeViewersDialog.this); - if (result == JFileChooser.APPROVE_OPTION) { - try { - List nodeViewersClassNames = manager - .loadNodeViewersFile(fileChooser - .getSelectedFile()); - List nodeViewers = new ArrayList(); - for (String nodeViewersClassName : nodeViewersClassNames) { - ZooInspectorNodeViewer viewer = (ZooInspectorNodeViewer) Class - .forName(nodeViewersClassName) - .newInstance(); - nodeViewers.add(viewer); - } - DefaultListModel model = new DefaultListModel(); - for (ZooInspectorNodeViewer viewer : nodeViewers) { - model.addElement(viewer); - } - viewersList.setModel(model); - panel.revalidate(); - panel.repaint(); - } catch (Exception ex) { - LoggerFactory - .getLogger() - .error( - "Error loading node veiwer configuration from file.", - ex); - JOptionPane.showMessageDialog( - ZooInspectorNodeViewersDialog.this, - "Error loading node veiwer configuration from file: " - + ex.getMessage(), "Error", - JOptionPane.ERROR_MESSAGE); - } - } - } - }); - setDefaultsButton.addActionListener(new ActionListener() { - - public void actionPerformed(ActionEvent e) { - int answer = JOptionPane - .showConfirmDialog( - ZooInspectorNodeViewersDialog.this, - "Are you sure you want to save this configuration as the default?", - "Confirm Set Defaults", - JOptionPane.YES_NO_OPTION, - JOptionPane.WARNING_MESSAGE); - if (answer == JOptionPane.YES_OPTION) { - DefaultListModel listModel = (DefaultListModel) viewersList - .getModel(); - List nodeViewersClassNames = new ArrayList(); - Object[] modelContents = listModel.toArray(); - for (Object o : modelContents) { - nodeViewersClassNames.add(((ZooInspectorNodeViewer) o) - .getClass().getCanonicalName()); - } - try { - manager - .setDefaultNodeViewerConfiguration(nodeViewersClassNames); - } catch (IOException ex) { - LoggerFactory - .getLogger() - .error( - "Error setting default node veiwer configuration.", - ex); - JOptionPane.showMessageDialog( - ZooInspectorNodeViewersDialog.this, - "Error setting default node veiwer configuration: " - + ex.getMessage(), "Error", - JOptionPane.ERROR_MESSAGE); - } - } - } - }); - - JPanel buttonsPanel = new JPanel(); - buttonsPanel.setLayout(new FlowLayout(FlowLayout.CENTER, 10, 10)); - JButton okButton = new JButton("OK"); - okButton.addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent e) { - ZooInspectorNodeViewersDialog.this.dispose(); - DefaultListModel listModel = (DefaultListModel) viewersList - .getModel(); - newViewers.clear(); - Object[] modelContents = listModel.toArray(); - for (Object o : modelContents) { - newViewers.add((ZooInspectorNodeViewer) o); - } - currentViewers.clear(); - currentViewers.addAll(newViewers); - for (NodeViewersChangeListener listener : listeners) { - listener.nodeViewersChanged(currentViewers); - } - } - }); - buttonsPanel.add(okButton); - JButton cancelButton = new JButton("Cancel"); - cancelButton.addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent e) { - ZooInspectorNodeViewersDialog.this.dispose(); - } - }); - buttonsPanel.add(cancelButton); - this.add(panel, BorderLayout.CENTER); - this.add(buttonsPanel, BorderLayout.SOUTH); - this.pack(); - } - - /* - * (non-Javadoc) - * - * @see - * javax.swing.event.ListSelectionListener#valueChanged(javax.swing.event - * .ListSelectionEvent) - */ - public void valueChanged(ListSelectionEvent e) { - int index = viewersList.getSelectedIndex(); - if (index == -1) { - removeButton.setEnabled(false); - upButton.setEnabled(false); - downButton.setEnabled(false); - } else { - removeButton.setEnabled(true); - if (index == 0) { - upButton.setEnabled(false); - } else { - upButton.setEnabled(true); - } - if (index == ((DefaultListModel) viewersList.getModel()).getSize()) { - downButton.setEnabled(false); - } else { - downButton.setEnabled(true); - } - } - } -} diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/zooinspector/src/java/org/apache/zookeeper/inspector/gui/ZooInspectorNodeViewersPanel.java b/pkg/registry/zookeeper-3.4.6/src/contrib/zooinspector/src/java/org/apache/zookeeper/inspector/gui/ZooInspectorNodeViewersPanel.java deleted file mode 100644 index 05c256b5a..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/contrib/zooinspector/src/java/org/apache/zookeeper/inspector/gui/ZooInspectorNodeViewersPanel.java +++ /dev/null @@ -1,140 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you 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. - */ -package org.apache.zookeeper.inspector.gui; - -import java.awt.BorderLayout; -import java.util.ArrayList; -import java.util.List; - -import javax.swing.JPanel; -import javax.swing.JTabbedPane; -import javax.swing.event.ChangeEvent; -import javax.swing.event.ChangeListener; -import javax.swing.event.TreeSelectionEvent; -import javax.swing.event.TreeSelectionListener; -import javax.swing.tree.TreePath; - -import org.apache.zookeeper.inspector.gui.nodeviewer.ZooInspectorNodeViewer; -import org.apache.zookeeper.inspector.manager.ZooInspectorManager; -import org.apache.zookeeper.inspector.manager.ZooInspectorNodeManager; - -/** - * This is the {@link JPanel} which contains the {@link ZooInspectorNodeViewer}s - */ -public class ZooInspectorNodeViewersPanel extends JPanel implements - TreeSelectionListener, ChangeListener { - - private final List nodeVeiwers = new ArrayList(); - private final List needsReload = new ArrayList(); - private final JTabbedPane tabbedPane; - private final List selectedNodes = new ArrayList(); - private final ZooInspectorNodeManager zooInspectorManager; - - /** - * @param zooInspectorManager - * - the {@link ZooInspectorManager} for the application - * @param nodeVeiwers - * - the {@link ZooInspectorNodeViewer}s to show - */ - public ZooInspectorNodeViewersPanel( - ZooInspectorNodeManager zooInspectorManager, - List nodeVeiwers) { - this.zooInspectorManager = zooInspectorManager; - this.setLayout(new BorderLayout()); - tabbedPane = new JTabbedPane(JTabbedPane.TOP, - JTabbedPane.WRAP_TAB_LAYOUT); - setNodeViewers(nodeVeiwers); - tabbedPane.addChangeListener(this); - this.add(tabbedPane, BorderLayout.CENTER); - reloadSelectedViewer(); - } - - /** - * @param nodeViewers - * - the {@link ZooInspectorNodeViewer}s to show - */ - public void setNodeViewers(List nodeViewers) { - this.nodeVeiwers.clear(); - this.nodeVeiwers.addAll(nodeViewers); - needsReload.clear(); - tabbedPane.removeAll(); - for (ZooInspectorNodeViewer nodeViewer : nodeVeiwers) { - nodeViewer.setZooInspectorManager(zooInspectorManager); - needsReload.add(true); - tabbedPane.add(nodeViewer.getTitle(), nodeViewer); - } - this.revalidate(); - this.repaint(); - } - - private void reloadSelectedViewer() { - int index = this.tabbedPane.getSelectedIndex(); - if (index != -1 && this.needsReload.get(index)) { - ZooInspectorNodeViewer viewer = this.nodeVeiwers.get(index); - viewer.nodeSelectionChanged(selectedNodes); - this.needsReload.set(index, false); - } - } - - /* - * (non-Javadoc) - * - * @see - * javax.swing.event.TreeSelectionListener#valueChanged(javax.swing.event - * .TreeSelectionEvent) - */ - public void valueChanged(TreeSelectionEvent e) { - TreePath[] paths = e.getPaths(); - selectedNodes.clear(); - for (TreePath path : paths) { - boolean appended = false; - StringBuilder sb = new StringBuilder(); - Object[] pathArray = path.getPath(); - for (Object o : pathArray) { - if (o != null) { - String nodeName = o.toString(); - if (nodeName != null) { - if (nodeName.length() > 0) { - appended = true; - sb.append("/"); //$NON-NLS-1$ - sb.append(o.toString()); - } - } - } - } - if (appended) { - selectedNodes.add(sb.toString()); - } - } - for (int i = 0; i < needsReload.size(); i++) { - this.needsReload.set(i, true); - } - reloadSelectedViewer(); - } - - /* - * (non-Javadoc) - * - * @see - * javax.swing.event.ChangeListener#stateChanged(javax.swing.event.ChangeEvent - * ) - */ - public void stateChanged(ChangeEvent e) { - reloadSelectedViewer(); - } -} diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/zooinspector/src/java/org/apache/zookeeper/inspector/gui/ZooInspectorPanel.java b/pkg/registry/zookeeper-3.4.6/src/contrib/zooinspector/src/java/org/apache/zookeeper/inspector/gui/ZooInspectorPanel.java deleted file mode 100644 index 7a4efafa4..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/contrib/zooinspector/src/java/org/apache/zookeeper/inspector/gui/ZooInspectorPanel.java +++ /dev/null @@ -1,361 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you 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. - */ -package org.apache.zookeeper.inspector.gui; - -import java.awt.BorderLayout; -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; -import java.io.IOException; -import java.util.ArrayList; -import java.util.List; -import java.util.Properties; -import java.util.concurrent.ExecutionException; - -import javax.swing.JButton; -import javax.swing.JOptionPane; -import javax.swing.JPanel; -import javax.swing.JScrollPane; -import javax.swing.JSplitPane; -import javax.swing.JToolBar; -import javax.swing.SwingWorker; - -import org.apache.zookeeper.inspector.gui.nodeviewer.ZooInspectorNodeViewer; -import org.apache.zookeeper.inspector.logger.LoggerFactory; -import org.apache.zookeeper.inspector.manager.ZooInspectorManager; - -/** - * The parent {@link JPanel} for the whole application - */ -public class ZooInspectorPanel extends JPanel implements - NodeViewersChangeListener { - private final JButton refreshButton; - private final JButton disconnectButton; - private final JButton connectButton; - private final ZooInspectorNodeViewersPanel nodeViewersPanel; - private final ZooInspectorTreeViewer treeViewer; - private final ZooInspectorManager zooInspectorManager; - private final JButton addNodeButton; - private final JButton deleteNodeButton; - private final JButton nodeViewersButton; - private final JButton aboutButton; - private final List listeners = new ArrayList(); - { - listeners.add(this); - } - - /** - * @param zooInspectorManager - * - the {@link ZooInspectorManager} for the application - */ - public ZooInspectorPanel(final ZooInspectorManager zooInspectorManager) { - this.zooInspectorManager = zooInspectorManager; - final ArrayList nodeViewers = new ArrayList(); - try { - List defaultNodeViewersClassNames = this.zooInspectorManager - .getDefaultNodeViewerConfiguration(); - for (String className : defaultNodeViewersClassNames) { - nodeViewers.add((ZooInspectorNodeViewer) Class.forName( - className).newInstance()); - } - } catch (Exception ex) { - LoggerFactory.getLogger().error( - "Error loading default node viewers.", ex); - JOptionPane.showMessageDialog(ZooInspectorPanel.this, - "Error loading default node viewers: " + ex.getMessage(), - "Error", JOptionPane.ERROR_MESSAGE); - } - nodeViewersPanel = new ZooInspectorNodeViewersPanel( - zooInspectorManager, nodeViewers); - treeViewer = new ZooInspectorTreeViewer(zooInspectorManager, - nodeViewersPanel); - this.setLayout(new BorderLayout()); - JToolBar toolbar = new JToolBar(); - toolbar.setFloatable(false); - connectButton = new JButton(ZooInspectorIconResources.getConnectIcon()); - disconnectButton = new JButton(ZooInspectorIconResources - .getDisconnectIcon()); - refreshButton = new JButton(ZooInspectorIconResources.getRefreshIcon()); - addNodeButton = new JButton(ZooInspectorIconResources.getAddNodeIcon()); - deleteNodeButton = new JButton(ZooInspectorIconResources - .getDeleteNodeIcon()); - nodeViewersButton = new JButton(ZooInspectorIconResources - .getChangeNodeViewersIcon()); - aboutButton = new JButton(ZooInspectorIconResources - .getInformationIcon()); - toolbar.add(connectButton); - toolbar.add(disconnectButton); - toolbar.add(refreshButton); - toolbar.add(addNodeButton); - toolbar.add(deleteNodeButton); - toolbar.add(nodeViewersButton); - toolbar.add(aboutButton); - aboutButton.setEnabled(true); - connectButton.setEnabled(true); - disconnectButton.setEnabled(false); - refreshButton.setEnabled(false); - addNodeButton.setEnabled(false); - deleteNodeButton.setEnabled(false); - nodeViewersButton.setEnabled(true); - nodeViewersButton.setToolTipText("Change Node Viewers"); - aboutButton.setToolTipText("About ZooInspector"); - connectButton.setToolTipText("Connect"); - disconnectButton.setToolTipText("Disconnect"); - refreshButton.setToolTipText("Refresh"); - addNodeButton.setToolTipText("Add Node"); - deleteNodeButton.setToolTipText("Delete Node"); - connectButton.addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent e) { - ZooInspectorConnectionPropertiesDialog zicpd = new ZooInspectorConnectionPropertiesDialog( - zooInspectorManager.getLastConnectionProps(), - zooInspectorManager.getConnectionPropertiesTemplate(), - ZooInspectorPanel.this); - zicpd.setVisible(true); - } - }); - disconnectButton.addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent e) { - disconnect(); - } - }); - refreshButton.addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent e) { - treeViewer.refreshView(); - } - }); - addNodeButton.addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent e) { - final List selectedNodes = treeViewer - .getSelectedNodes(); - if (selectedNodes.size() == 1) { - final String nodeName = JOptionPane.showInputDialog( - ZooInspectorPanel.this, - "Please Enter a name for the new node", - "Create Node", JOptionPane.INFORMATION_MESSAGE); - if (nodeName != null && nodeName.length() > 0) { - SwingWorker worker = new SwingWorker() { - - @Override - protected Boolean doInBackground() throws Exception { - return ZooInspectorPanel.this.zooInspectorManager - .createNode(selectedNodes.get(0), - nodeName); - } - - @Override - protected void done() { - treeViewer.refreshView(); - } - }; - worker.execute(); - } - } else { - JOptionPane.showMessageDialog(ZooInspectorPanel.this, - "Please select 1 parent node for the new node."); - } - } - }); - deleteNodeButton.addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent e) { - final List selectedNodes = treeViewer - .getSelectedNodes(); - if (selectedNodes.size() == 0) { - JOptionPane.showMessageDialog(ZooInspectorPanel.this, - "Please select at least 1 node to be deleted"); - } else { - int answer = JOptionPane.showConfirmDialog( - ZooInspectorPanel.this, - "Are you sure you want to delete the selected nodes?" - + "(This action cannot be reverted)", - "Confirm Delete", JOptionPane.YES_NO_OPTION, - JOptionPane.WARNING_MESSAGE); - if (answer == JOptionPane.YES_OPTION) { - SwingWorker worker = new SwingWorker() { - - @Override - protected Boolean doInBackground() throws Exception { - for (String nodePath : selectedNodes) { - ZooInspectorPanel.this.zooInspectorManager - .deleteNode(nodePath); - } - return true; - } - - @Override - protected void done() { - treeViewer.refreshView(); - } - }; - worker.execute(); - } - } - } - }); - nodeViewersButton.addActionListener(new ActionListener() { - - public void actionPerformed(ActionEvent e) { - ZooInspectorNodeViewersDialog nvd = new ZooInspectorNodeViewersDialog( - JOptionPane.getRootFrame(), nodeViewers, listeners, - zooInspectorManager); - nvd.setVisible(true); - } - }); - aboutButton.addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent e) { - ZooInspectorAboutDialog zicpd = new ZooInspectorAboutDialog( - JOptionPane.getRootFrame()); - zicpd.setVisible(true); - } - }); - JScrollPane treeScroller = new JScrollPane(treeViewer); - JSplitPane splitPane = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, - treeScroller, nodeViewersPanel); - splitPane.setResizeWeight(0.25); - this.add(splitPane, BorderLayout.CENTER); - this.add(toolbar, BorderLayout.NORTH); - } - - /** - * @param connectionProps - * the {@link Properties} for connecting to the zookeeper - * instance - */ - public void connect(final Properties connectionProps) { - SwingWorker worker = new SwingWorker() { - - @Override - protected Boolean doInBackground() throws Exception { - zooInspectorManager.setLastConnectionProps(connectionProps); - return zooInspectorManager.connect(connectionProps); - } - - @Override - protected void done() { - try { - if (get()) { - treeViewer.refreshView(); - connectButton.setEnabled(false); - disconnectButton.setEnabled(true); - refreshButton.setEnabled(true); - addNodeButton.setEnabled(true); - deleteNodeButton.setEnabled(true); - } else { - JOptionPane.showMessageDialog(ZooInspectorPanel.this, - "Unable to connect to zookeeper", "Error", - JOptionPane.ERROR_MESSAGE); - } - } catch (InterruptedException e) { - LoggerFactory - .getLogger() - .error( - "Error occurred while connecting to ZooKeeper server", - e); - } catch (ExecutionException e) { - LoggerFactory - .getLogger() - .error( - "Error occurred while connecting to ZooKeeper server", - e); - } - } - - }; - worker.execute(); - } - - /** - * - */ - public void disconnect() { - disconnect(false); - } - - /** - * @param wait - * - set this to true if the method should only return once the - * application has successfully disconnected - */ - public void disconnect(boolean wait) { - SwingWorker worker = new SwingWorker() { - - @Override - protected Boolean doInBackground() throws Exception { - return ZooInspectorPanel.this.zooInspectorManager.disconnect(); - } - - @Override - protected void done() { - try { - if (get()) { - treeViewer.clearView(); - connectButton.setEnabled(true); - disconnectButton.setEnabled(false); - refreshButton.setEnabled(false); - addNodeButton.setEnabled(false); - deleteNodeButton.setEnabled(false); - } - } catch (InterruptedException e) { - LoggerFactory - .getLogger() - .error( - "Error occurred while disconnecting from ZooKeeper server", - e); - } catch (ExecutionException e) { - LoggerFactory - .getLogger() - .error( - "Error occurred while disconnecting from ZooKeeper server", - e); - } - } - - }; - worker.execute(); - if (wait) { - while (!worker.isDone()) { - try { - Thread.sleep(100); - } catch (InterruptedException e) { - LoggerFactory - .getLogger() - .error( - "Error occurred while disconnecting from ZooKeeper server", - e); - } - } - } - } - - /* - * (non-Javadoc) - * - * @seeorg.apache.zookeeper.inspector.gui.NodeViewersChangeListener# - * nodeViewersChanged(java.util.List) - */ - public void nodeViewersChanged(List newViewers) { - this.nodeViewersPanel.setNodeViewers(newViewers); - } - - /** - * @param connectionProps - * @throws IOException - */ - public void setdefaultConnectionProps(Properties connectionProps) - throws IOException { - this.zooInspectorManager.saveDefaultConnectionFile(connectionProps); - } -} diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/zooinspector/src/java/org/apache/zookeeper/inspector/gui/ZooInspectorTreeViewer.java b/pkg/registry/zookeeper-3.4.6/src/contrib/zooinspector/src/java/org/apache/zookeeper/inspector/gui/ZooInspectorTreeViewer.java deleted file mode 100644 index 128b358eb..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/contrib/zooinspector/src/java/org/apache/zookeeper/inspector/gui/ZooInspectorTreeViewer.java +++ /dev/null @@ -1,362 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you 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. - */ -package org.apache.zookeeper.inspector.gui; - -import java.awt.BorderLayout; -import java.awt.Color; -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; -import java.awt.event.MouseAdapter; -import java.awt.event.MouseEvent; -import java.util.ArrayList; -import java.util.Collections; -import java.util.Enumeration; -import java.util.LinkedHashSet; -import java.util.List; -import java.util.Map; -import java.util.Set; - -import javax.swing.JMenuItem; -import javax.swing.JPanel; -import javax.swing.JPopupMenu; -import javax.swing.JTree; -import javax.swing.SwingWorker; -import javax.swing.event.TreeSelectionListener; -import javax.swing.tree.DefaultMutableTreeNode; -import javax.swing.tree.DefaultTreeCellRenderer; -import javax.swing.tree.DefaultTreeModel; -import javax.swing.tree.TreeNode; -import javax.swing.tree.TreePath; - -import org.apache.zookeeper.inspector.manager.NodeListener; -import org.apache.zookeeper.inspector.manager.ZooInspectorManager; - -import com.nitido.utils.toaster.Toaster; - -/** - * A {@link JPanel} for showing the tree view of all the nodes in the zookeeper - * instance - */ -public class ZooInspectorTreeViewer extends JPanel implements NodeListener { - private final ZooInspectorManager zooInspectorManager; - private final JTree tree; - private final Toaster toasterManager; - - /** - * @param zooInspectorManager - * - the {@link ZooInspectorManager} for the application - * @param listener - * - the {@link TreeSelectionListener} to listen for changes in - * the selected node on the node tree - */ - public ZooInspectorTreeViewer( - final ZooInspectorManager zooInspectorManager, - TreeSelectionListener listener) { - this.zooInspectorManager = zooInspectorManager; - this.setLayout(new BorderLayout()); - final JPopupMenu popupMenu = new JPopupMenu(); - final JMenuItem addNotify = new JMenuItem("Add Change Notification"); - this.toasterManager = new Toaster(); - this.toasterManager.setBorderColor(Color.BLACK); - this.toasterManager.setMessageColor(Color.BLACK); - this.toasterManager.setToasterColor(Color.WHITE); - addNotify.addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent e) { - List selectedNodes = getSelectedNodes(); - zooInspectorManager.addWatchers(selectedNodes, - ZooInspectorTreeViewer.this); - } - }); - final JMenuItem removeNotify = new JMenuItem( - "Remove Change Notification"); - removeNotify.addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent e) { - List selectedNodes = getSelectedNodes(); - zooInspectorManager.removeWatchers(selectedNodes); - } - }); - tree = new JTree(new DefaultMutableTreeNode()); - tree.setCellRenderer(new ZooInspectorTreeCellRenderer()); - tree.setEditable(false); - tree.getSelectionModel().addTreeSelectionListener(listener); - tree.addMouseListener(new MouseAdapter() { - @Override - public void mouseClicked(MouseEvent e) { - if (e.isPopupTrigger() || e.getButton() == MouseEvent.BUTTON3) { - // TODO only show add if a selected node isn't being - // watched, and only show remove if a selected node is being - // watched - popupMenu.removeAll(); - popupMenu.add(addNotify); - popupMenu.add(removeNotify); - popupMenu.show(ZooInspectorTreeViewer.this, e.getX(), e - .getY()); - } - } - }); - this.add(tree, BorderLayout.CENTER); - } - - /** - * Refresh the tree view - */ - public void refreshView() { - final Set expandedNodes = new LinkedHashSet(); - int rowCount = tree.getRowCount(); - for (int i = 0; i < rowCount; i++) { - TreePath path = tree.getPathForRow(i); - if (tree.isExpanded(path)) { - expandedNodes.add(path); - } - } - final TreePath[] selectedNodes = tree.getSelectionPaths(); - SwingWorker worker = new SwingWorker() { - - @Override - protected Boolean doInBackground() throws Exception { - tree.setModel(new DefaultTreeModel(new ZooInspectorTreeNode( - "/", null))); - return true; - } - - @Override - protected void done() { - for (TreePath path : expandedNodes) { - tree.expandPath(path); - } - tree.getSelectionModel().setSelectionPaths(selectedNodes); - } - }; - worker.execute(); - } - - /** - * clear the tree view of all nodes - */ - public void clearView() { - tree.setModel(new DefaultTreeModel(new DefaultMutableTreeNode())); - } - - /** - * @author Colin - * - */ - private static class ZooInspectorTreeCellRenderer extends - DefaultTreeCellRenderer { - public ZooInspectorTreeCellRenderer() { - setLeafIcon(ZooInspectorIconResources.getTreeLeafIcon()); - setOpenIcon(ZooInspectorIconResources.getTreeOpenIcon()); - setClosedIcon(ZooInspectorIconResources.getTreeClosedIcon()); - } - } - - /** - * @author Colin - * - */ - private class ZooInspectorTreeNode implements TreeNode { - private final String nodePath; - private final String nodeName; - private final ZooInspectorTreeNode parent; - - public ZooInspectorTreeNode(String nodePath, ZooInspectorTreeNode parent) { - this.parent = parent; - this.nodePath = nodePath; - int index = nodePath.lastIndexOf("/"); - if (index == -1) { - throw new IllegalArgumentException("Invalid node path" - + nodePath); - } - this.nodeName = nodePath.substring(index + 1); - } - - /* - * (non-Javadoc) - * - * @see javax.swing.tree.TreeNode#children() - */ - public Enumeration children() { - List children = zooInspectorManager - .getChildren(this.nodePath); - Collections.sort(children); - List returnChildren = new ArrayList(); - for (String child : children) { - returnChildren.add(new ZooInspectorTreeNode((this.nodePath - .equals("/") ? "" : this.nodePath) - + "/" + child, this)); - } - return Collections.enumeration(returnChildren); - } - - /* - * (non-Javadoc) - * - * @see javax.swing.tree.TreeNode#getAllowsChildren() - */ - public boolean getAllowsChildren() { - return zooInspectorManager.isAllowsChildren(this.nodePath); - } - - /* - * (non-Javadoc) - * - * @see javax.swing.tree.TreeNode#getChildAt(int) - */ - public TreeNode getChildAt(int childIndex) { - String child = zooInspectorManager.getNodeChild(this.nodePath, - childIndex); - if (child != null) { - return new ZooInspectorTreeNode((this.nodePath.equals("/") ? "" - : this.nodePath) - + "/" + child, this); - } - return null; - } - - /* - * (non-Javadoc) - * - * @see javax.swing.tree.TreeNode#getChildCount() - */ - public int getChildCount() { - return zooInspectorManager.getNumChildren(this.nodePath); - } - - /* - * (non-Javadoc) - * - * @see javax.swing.tree.TreeNode#getIndex(javax.swing.tree.TreeNode) - */ - public int getIndex(TreeNode node) { - return zooInspectorManager.getNodeIndex(this.nodePath); - } - - /* - * (non-Javadoc) - * - * @see javax.swing.tree.TreeNode#getParent() - */ - public TreeNode getParent() { - return this.parent; - } - - /* - * (non-Javadoc) - * - * @see javax.swing.tree.TreeNode#isLeaf() - */ - public boolean isLeaf() { - return !zooInspectorManager.hasChildren(this.nodePath); - } - - @Override - public String toString() { - return this.nodeName; - } - - @Override - public int hashCode() { - final int prime = 31; - int result = 1; - result = prime * result + getOuterType().hashCode(); - result = prime * result - + ((nodePath == null) ? 0 : nodePath.hashCode()); - result = prime * result - + ((parent == null) ? 0 : parent.hashCode()); - return result; - } - - @Override - public boolean equals(Object obj) { - if (this == obj) - return true; - if (obj == null) - return false; - if (getClass() != obj.getClass()) - return false; - ZooInspectorTreeNode other = (ZooInspectorTreeNode) obj; - if (!getOuterType().equals(other.getOuterType())) - return false; - if (nodePath == null) { - if (other.nodePath != null) - return false; - } else if (!nodePath.equals(other.nodePath)) - return false; - if (parent == null) { - if (other.parent != null) - return false; - } else if (!parent.equals(other.parent)) - return false; - return true; - } - - private ZooInspectorTreeViewer getOuterType() { - return ZooInspectorTreeViewer.this; - } - - } - - /** - * @return {@link List} of the currently selected nodes - */ - public List getSelectedNodes() { - TreePath[] paths = tree.getSelectionPaths(); - List selectedNodes = new ArrayList(); - if (paths != null) { - for (TreePath path : paths) { - StringBuilder sb = new StringBuilder(); - Object[] pathArray = path.getPath(); - for (Object o : pathArray) { - String nodeName = o.toString(); - if (nodeName.length() > 0) { - sb.append("/"); - sb.append(o.toString()); - } - } - selectedNodes.add(sb.toString()); - } - } - return selectedNodes; - } - - /* - * (non-Javadoc) - * - * @see - * org.apache.zookeeper.inspector.manager.NodeListener#processEvent(java - * .lang.String, java.lang.String, java.util.Map) - */ - public void processEvent(String nodePath, String eventType, - Map eventInfo) { - StringBuilder sb = new StringBuilder(); - sb.append("Node: "); - sb.append(nodePath); - sb.append("\nEvent: "); - sb.append(eventType); - if (eventInfo != null) { - for (Map.Entry entry : eventInfo.entrySet()) { - sb.append("\n"); - sb.append(entry.getKey()); - sb.append(": "); - sb.append(entry.getValue()); - } - } - this.toasterManager.showToaster(ZooInspectorIconResources - .getInformationIcon(), sb.toString()); - } -} diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/zooinspector/src/java/org/apache/zookeeper/inspector/gui/about.html b/pkg/registry/zookeeper-3.4.6/src/contrib/zooinspector/src/java/org/apache/zookeeper/inspector/gui/about.html deleted file mode 100644 index 17fb3dca2..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/contrib/zooinspector/src/java/org/apache/zookeeper/inspector/gui/about.html +++ /dev/null @@ -1,21 +0,0 @@ - - - - -ZooInspector v0.1 - - -

        ZooInspector was developed by Colin Goodheart-Smithe and is -available under the Apache Software Licence v2.0.

        -
        -

        ZooKeeper is available from http://zookeeper.apache.org/ -and is licensed under an Apache Software Licence v2.0

        -

        The ApacheSoftware Licence v2.0 can be found at http://www.apache.org/licenses/LICENSE-2.0

        - - diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/zooinspector/src/java/org/apache/zookeeper/inspector/gui/nodeviewer/NodeViewerACL.java b/pkg/registry/zookeeper-3.4.6/src/contrib/zooinspector/src/java/org/apache/zookeeper/inspector/gui/nodeviewer/NodeViewerACL.java deleted file mode 100644 index 5ac203c28..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/contrib/zooinspector/src/java/org/apache/zookeeper/inspector/gui/nodeviewer/NodeViewerACL.java +++ /dev/null @@ -1,187 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you 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. - */ -package org.apache.zookeeper.inspector.gui.nodeviewer; - -import java.awt.BorderLayout; -import java.awt.Color; -import java.awt.GridBagConstraints; -import java.awt.GridBagLayout; -import java.awt.Insets; -import java.util.ArrayList; -import java.util.List; -import java.util.Map; -import java.util.concurrent.ExecutionException; - -import javax.swing.BorderFactory; -import javax.swing.JLabel; -import javax.swing.JPanel; -import javax.swing.JScrollPane; -import javax.swing.JTextField; -import javax.swing.SwingWorker; - -import org.apache.zookeeper.inspector.logger.LoggerFactory; -import org.apache.zookeeper.inspector.manager.ZooInspectorNodeManager; - -/** - * A node viewer for displaying the ACLs currently applied to the selected node - */ -public class NodeViewerACL extends ZooInspectorNodeViewer { - private ZooInspectorNodeManager zooInspectorManager; - private final JPanel aclDataPanel; - private String selectedNode; - - /** - * - */ - public NodeViewerACL() { - this.setLayout(new BorderLayout()); - this.aclDataPanel = new JPanel(); - this.aclDataPanel.setBackground(Color.WHITE); - JScrollPane scroller = new JScrollPane(this.aclDataPanel); - this.add(scroller, BorderLayout.CENTER); - } - - /* - * (non-Javadoc) - * - * @see - * org.apache.zookeeper.inspector.gui.nodeviewer.ZooInspectorNodeViewer# - * getTitle() - */ - @Override - public String getTitle() { - return "Node ACLs"; - } - - /* - * (non-Javadoc) - * - * @see - * org.apache.zookeeper.inspector.gui.nodeviewer.ZooInspectorNodeViewer# - * nodeSelectionChanged(java.util.Set) - */ - @Override - public void nodeSelectionChanged(List selectedNodes) { - this.aclDataPanel.removeAll(); - if (selectedNodes.size() > 0) { - this.selectedNode = selectedNodes.get(0); - SwingWorker>, Void> worker = new SwingWorker>, Void>() { - - @Override - protected List> doInBackground() - throws Exception { - return NodeViewerACL.this.zooInspectorManager - .getACLs(NodeViewerACL.this.selectedNode); - } - - @Override - protected void done() { - List> acls = null; - try { - acls = get(); - } catch (InterruptedException e) { - acls = new ArrayList>(); - LoggerFactory.getLogger().error( - "Error retrieving ACL Information for node: " - + NodeViewerACL.this.selectedNode, e); - } catch (ExecutionException e) { - acls = new ArrayList>(); - LoggerFactory.getLogger().error( - "Error retrieving ACL Information for node: " - + NodeViewerACL.this.selectedNode, e); - } - aclDataPanel.setLayout(new GridBagLayout()); - int j = 0; - for (Map data : acls) { - int rowPos = 2 * j + 1; - JPanel aclPanel = new JPanel(); - aclPanel.setBorder(BorderFactory - .createLineBorder(Color.BLACK)); - aclPanel.setBackground(Color.WHITE); - aclPanel.setLayout(new GridBagLayout()); - int i = 0; - for (Map.Entry entry : data.entrySet()) { - int rowPosACL = 2 * i + 1; - JLabel label = new JLabel(entry.getKey()); - JTextField text = new JTextField(entry.getValue()); - text.setEditable(false); - GridBagConstraints c1 = new GridBagConstraints(); - c1.gridx = 1; - c1.gridy = rowPosACL; - c1.gridwidth = 1; - c1.gridheight = 1; - c1.weightx = 0; - c1.weighty = 0; - c1.anchor = GridBagConstraints.NORTHWEST; - c1.fill = GridBagConstraints.BOTH; - c1.insets = new Insets(5, 5, 5, 5); - c1.ipadx = 0; - c1.ipady = 0; - aclPanel.add(label, c1); - GridBagConstraints c2 = new GridBagConstraints(); - c2.gridx = 3; - c2.gridy = rowPosACL; - c2.gridwidth = 1; - c2.gridheight = 1; - c2.weightx = 0; - c2.weighty = 0; - c2.anchor = GridBagConstraints.NORTHWEST; - c2.fill = GridBagConstraints.BOTH; - c2.insets = new Insets(5, 5, 5, 5); - c2.ipadx = 0; - c2.ipady = 0; - aclPanel.add(text, c2); - i++; - } - GridBagConstraints c = new GridBagConstraints(); - c.gridx = 1; - c.gridy = rowPos; - c.gridwidth = 1; - c.gridheight = 1; - c.weightx = 1; - c.weighty = 1; - c.anchor = GridBagConstraints.NORTHWEST; - c.fill = GridBagConstraints.NONE; - c.insets = new Insets(5, 5, 5, 5); - c.ipadx = 0; - c.ipady = 0; - aclDataPanel.add(aclPanel, c); - } - NodeViewerACL.this.aclDataPanel.revalidate(); - NodeViewerACL.this.aclDataPanel.repaint(); - } - }; - worker.execute(); - } - } - - /* - * (non-Javadoc) - * - * @see - * org.apache.zookeeper.inspector.gui.nodeviewer.ZooInspectorNodeViewer# - * setZooInspectorManager - * (org.apache.zookeeper.inspector.manager.ZooInspectorNodeManager) - */ - @Override - public void setZooInspectorManager( - ZooInspectorNodeManager zooInspectorManager) { - this.zooInspectorManager = zooInspectorManager; - } - -} diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/zooinspector/src/java/org/apache/zookeeper/inspector/gui/nodeviewer/NodeViewerData.java b/pkg/registry/zookeeper-3.4.6/src/contrib/zooinspector/src/java/org/apache/zookeeper/inspector/gui/nodeviewer/NodeViewerData.java deleted file mode 100644 index 001cb7b21..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/contrib/zooinspector/src/java/org/apache/zookeeper/inspector/gui/nodeviewer/NodeViewerData.java +++ /dev/null @@ -1,146 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you 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. - */ -package org.apache.zookeeper.inspector.gui.nodeviewer; - -import java.awt.BorderLayout; -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; -import java.util.List; -import java.util.concurrent.ExecutionException; - -import javax.swing.JButton; -import javax.swing.JOptionPane; -import javax.swing.JScrollPane; -import javax.swing.JTextPane; -import javax.swing.JToolBar; -import javax.swing.SwingWorker; - -import org.apache.zookeeper.inspector.gui.ZooInspectorIconResources; -import org.apache.zookeeper.inspector.logger.LoggerFactory; -import org.apache.zookeeper.inspector.manager.ZooInspectorNodeManager; - -/** - * A node viewer for displaying the data for the currently selected node - */ -public class NodeViewerData extends ZooInspectorNodeViewer { - private ZooInspectorNodeManager zooInspectorManager; - private final JTextPane dataArea; - private final JToolBar toolbar; - private String selectedNode; - - /** - * - */ - public NodeViewerData() { - this.setLayout(new BorderLayout()); - this.dataArea = new JTextPane(); - this.toolbar = new JToolBar(); - this.toolbar.setFloatable(false); - JScrollPane scroller = new JScrollPane(this.dataArea); - scroller - .setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_NEVER); - this.add(scroller, BorderLayout.CENTER); - this.add(this.toolbar, BorderLayout.NORTH); - JButton saveButton = new JButton(ZooInspectorIconResources - .getSaveIcon()); - saveButton.addActionListener(new ActionListener() { - - public void actionPerformed(ActionEvent e) { - if (selectedNode != null) { - if (JOptionPane.showConfirmDialog(NodeViewerData.this, - "Are you sure you want to save this node?" - + " (this action cannot be reverted)", - "Confirm Save", JOptionPane.YES_NO_OPTION, - JOptionPane.WARNING_MESSAGE) == JOptionPane.YES_OPTION) { - zooInspectorManager.setData(selectedNode, dataArea - .getText()); - } - } - } - }); - this.toolbar.add(saveButton); - - } - - /* - * (non-Javadoc) - * - * @see - * org.apache.zookeeper.inspector.gui.nodeviewer.ZooInspectorNodeViewer# - * getTitle() - */ - @Override - public String getTitle() { - return "Node Data"; - } - - /* - * (non-Javadoc) - * - * @see - * org.apache.zookeeper.inspector.gui.nodeviewer.ZooInspectorNodeViewer# - * nodeSelectionChanged(java.util.Set) - */ - @Override - public void nodeSelectionChanged(List selectedNodes) { - if (selectedNodes.size() > 0) { - this.selectedNode = selectedNodes.get(0); - SwingWorker worker = new SwingWorker() { - - @Override - protected String doInBackground() throws Exception { - return NodeViewerData.this.zooInspectorManager - .getData(NodeViewerData.this.selectedNode); - } - - @Override - protected void done() { - String data = ""; - try { - data = get(); - } catch (InterruptedException e) { - LoggerFactory.getLogger().error( - "Error retrieving data for node: " - + NodeViewerData.this.selectedNode, e); - } catch (ExecutionException e) { - LoggerFactory.getLogger().error( - "Error retrieving data for node: " - + NodeViewerData.this.selectedNode, e); - } - NodeViewerData.this.dataArea.setText(data); - } - }; - worker.execute(); - } - } - - /* - * (non-Javadoc) - * - * @see - * org.apache.zookeeper.inspector.gui.nodeviewer.ZooInspectorNodeViewer# - * setZooInspectorManager - * (org.apache.zookeeper.inspector.manager.ZooInspectorNodeManager) - */ - @Override - public void setZooInspectorManager( - ZooInspectorNodeManager zooInspectorManager) { - this.zooInspectorManager = zooInspectorManager; - } - -} diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/zooinspector/src/java/org/apache/zookeeper/inspector/gui/nodeviewer/NodeViewerMetaData.java b/pkg/registry/zookeeper-3.4.6/src/contrib/zooinspector/src/java/org/apache/zookeeper/inspector/gui/nodeviewer/NodeViewerMetaData.java deleted file mode 100644 index 5c2df8d88..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/contrib/zooinspector/src/java/org/apache/zookeeper/inspector/gui/nodeviewer/NodeViewerMetaData.java +++ /dev/null @@ -1,186 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you 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. - */ -package org.apache.zookeeper.inspector.gui.nodeviewer; - -import java.awt.BorderLayout; -import java.awt.Color; -import java.awt.GridBagConstraints; -import java.awt.GridBagLayout; -import java.awt.Insets; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.concurrent.ExecutionException; - -import javax.swing.JLabel; -import javax.swing.JPanel; -import javax.swing.JScrollPane; -import javax.swing.JTextField; -import javax.swing.SwingWorker; - -import org.apache.zookeeper.data.Stat; -import org.apache.zookeeper.inspector.logger.LoggerFactory; -import org.apache.zookeeper.inspector.manager.ZooInspectorNodeManager; - -/** - * A node viewer for displaying the meta data for the currently selected node. - * The meta data is essentially the information from the {@link Stat} for the - * node - */ -public class NodeViewerMetaData extends ZooInspectorNodeViewer { - private ZooInspectorNodeManager zooInspectorManager; - private final JPanel metaDataPanel; - private String selectedNode; - - /** - * - */ - public NodeViewerMetaData() { - this.setLayout(new BorderLayout()); - this.metaDataPanel = new JPanel(); - this.metaDataPanel.setBackground(Color.WHITE); - JScrollPane scroller = new JScrollPane(this.metaDataPanel); - this.add(scroller, BorderLayout.CENTER); - } - - /* - * (non-Javadoc) - * - * @see - * org.apache.zookeeper.inspector.gui.nodeviewer.ZooInspectorNodeViewer# - * getTitle() - */ - @Override - public String getTitle() { - return "Node Metadata"; - } - - /* - * (non-Javadoc) - * - * @see - * org.apache.zookeeper.inspector.gui.nodeviewer.ZooInspectorNodeViewer# - * nodeSelectionChanged(java.util.Set) - */ - @Override - public void nodeSelectionChanged(List selectedNodes) { - this.metaDataPanel.removeAll(); - if (selectedNodes.size() > 0) { - this.selectedNode = selectedNodes.get(0); - SwingWorker, Void> worker = new SwingWorker, Void>() { - - @Override - protected Map doInBackground() throws Exception { - return NodeViewerMetaData.this.zooInspectorManager - .getNodeMeta(NodeViewerMetaData.this.selectedNode); - } - - @Override - protected void done() { - Map data = null; - try { - data = get(); - } catch (InterruptedException e) { - data = new HashMap(); - LoggerFactory.getLogger().error( - "Error retrieving meta data for node: " - + NodeViewerMetaData.this.selectedNode, - e); - } catch (ExecutionException e) { - data = new HashMap(); - LoggerFactory.getLogger().error( - "Error retrieving meta data for node: " - + NodeViewerMetaData.this.selectedNode, - e); - } - NodeViewerMetaData.this.metaDataPanel - .setLayout(new GridBagLayout()); - JPanel infoPanel = new JPanel(); - infoPanel.setBackground(Color.WHITE); - infoPanel.setLayout(new GridBagLayout()); - int i = 0; - int rowPos = 0; - for (Map.Entry entry : data.entrySet()) { - rowPos = 2 * i + 1; - JLabel label = new JLabel(entry.getKey()); - JTextField text = new JTextField(entry.getValue()); - text.setEditable(false); - GridBagConstraints c1 = new GridBagConstraints(); - c1.gridx = 0; - c1.gridy = rowPos; - c1.gridwidth = 1; - c1.gridheight = 1; - c1.weightx = 0; - c1.weighty = 0; - c1.anchor = GridBagConstraints.WEST; - c1.fill = GridBagConstraints.HORIZONTAL; - c1.insets = new Insets(5, 5, 5, 5); - c1.ipadx = 0; - c1.ipady = 0; - infoPanel.add(label, c1); - GridBagConstraints c2 = new GridBagConstraints(); - c2.gridx = 2; - c2.gridy = rowPos; - c2.gridwidth = 1; - c2.gridheight = 1; - c2.weightx = 0; - c2.weighty = 0; - c2.anchor = GridBagConstraints.WEST; - c2.fill = GridBagConstraints.HORIZONTAL; - c2.insets = new Insets(5, 5, 5, 5); - c2.ipadx = 0; - c2.ipady = 0; - infoPanel.add(text, c2); - i++; - } - GridBagConstraints c = new GridBagConstraints(); - c.gridx = 1; - c.gridy = rowPos; - c.gridwidth = 1; - c.gridheight = 1; - c.weightx = 1; - c.weighty = 1; - c.anchor = GridBagConstraints.NORTHWEST; - c.fill = GridBagConstraints.NONE; - c.insets = new Insets(5, 5, 5, 5); - c.ipadx = 0; - c.ipady = 0; - NodeViewerMetaData.this.metaDataPanel.add(infoPanel, c); - NodeViewerMetaData.this.metaDataPanel.revalidate(); - NodeViewerMetaData.this.metaDataPanel.repaint(); - } - }; - worker.execute(); - } - } - - /* - * (non-Javadoc) - * - * @see - * org.apache.zookeeper.inspector.gui.nodeviewer.ZooInspectorNodeViewer# - * setZooInspectorManager - * (org.apache.zookeeper.inspector.manager.ZooInspectorNodeManager) - */ - @Override - public void setZooInspectorManager( - ZooInspectorNodeManager zooInspectorManager) { - this.zooInspectorManager = zooInspectorManager; - } - -} diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/zooinspector/src/java/org/apache/zookeeper/inspector/gui/nodeviewer/ZooInspectorNodeViewer.java b/pkg/registry/zookeeper-3.4.6/src/contrib/zooinspector/src/java/org/apache/zookeeper/inspector/gui/nodeviewer/ZooInspectorNodeViewer.java deleted file mode 100644 index 32119a85c..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/contrib/zooinspector/src/java/org/apache/zookeeper/inspector/gui/nodeviewer/ZooInspectorNodeViewer.java +++ /dev/null @@ -1,138 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you 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. - */ -package org.apache.zookeeper.inspector.gui.nodeviewer; - -import java.awt.datatransfer.DataFlavor; -import java.awt.datatransfer.Transferable; -import java.awt.datatransfer.UnsupportedFlavorException; -import java.io.IOException; -import java.util.List; - -import javax.swing.JPanel; - -import org.apache.zookeeper.inspector.manager.ZooInspectorNodeManager; - -/** - * A {@link JPanel} for displaying information about the currently selected - * node(s) - */ -public abstract class ZooInspectorNodeViewer extends JPanel implements - Transferable { - /** - * The {@link DataFlavor} used for DnD in the node viewer configuration - * dialog - */ - public static final DataFlavor nodeViewerDataFlavor = new DataFlavor( - ZooInspectorNodeViewer.class, "nodeviewer"); - - /** - * @param zooInspectorManager - */ - public abstract void setZooInspectorManager( - ZooInspectorNodeManager zooInspectorManager); - - /** - * Called whenever the selected nodes in the tree view changes. - * - * @param selectedNodes - * - the nodes currently selected in the tree view - * - */ - public abstract void nodeSelectionChanged(List selectedNodes); - - /** - * @return the title of the node viewer. this will be shown on the tab for - * this node viewer. - */ - public abstract String getTitle(); - - /* - * (non-Javadoc) - * - * @see - * java.awt.datatransfer.Transferable#getTransferData(java.awt.datatransfer - * .DataFlavor) - */ - public Object getTransferData(DataFlavor flavor) - throws UnsupportedFlavorException, IOException { - if (flavor.equals(nodeViewerDataFlavor)) { - return this.getClass().getCanonicalName(); - } else { - return null; - } - } - - /* - * (non-Javadoc) - * - * @see java.awt.datatransfer.Transferable#getTransferDataFlavors() - */ - public DataFlavor[] getTransferDataFlavors() { - return new DataFlavor[] { nodeViewerDataFlavor }; - } - - /* - * (non-Javadoc) - * - * @seejava.awt.datatransfer.Transferable#isDataFlavorSupported(java.awt. - * datatransfer.DataFlavor) - */ - public boolean isDataFlavorSupported(DataFlavor flavor) { - return flavor.equals(nodeViewerDataFlavor); - } - - /* - * (non-Javadoc) - * - * @see java.lang.Object#hashCode() - */ - @Override - public int hashCode() { - final int prime = 31; - int result = 1; - result = prime * result - + ((getTitle() == null) ? 0 : getTitle().hashCode()); - return result; - } - - /* - * (non-Javadoc) - * - * @see java.lang.Object#equals(java.lang.Object) - */ - @Override - public boolean equals(Object obj) { - if (this == obj) - return true; - if (obj == null) - return false; - if (getClass() != obj.getClass()) - return false; - ZooInspectorNodeViewer other = (ZooInspectorNodeViewer) obj; - if (getClass().getCanonicalName() != other.getClass() - .getCanonicalName()) { - return false; - } - if (getTitle() == null) { - if (other.getTitle() != null) - return false; - } else if (!getTitle().equals(other.getTitle())) - return false; - return true; - } -} diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/zooinspector/src/java/org/apache/zookeeper/inspector/logger/LoggerFactory.java b/pkg/registry/zookeeper-3.4.6/src/contrib/zooinspector/src/java/org/apache/zookeeper/inspector/logger/LoggerFactory.java deleted file mode 100644 index e4fae4169..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/contrib/zooinspector/src/java/org/apache/zookeeper/inspector/logger/LoggerFactory.java +++ /dev/null @@ -1,36 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you 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. - */ -package org.apache.zookeeper.inspector.logger; - -/** - * Provides a {@link Logger} for use across the entire application - * - */ -public class LoggerFactory -{ - private static final org.slf4j.Logger logger = org.slf4j.LoggerFactory.getLogger("org.apache.zookeeper.inspector"); //$NON-NLS-1$ - - /** - * @return {@link Logger} for ZooInspector - */ - public static org.slf4j.Logger getLogger() - { - return logger; - } - -} diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/zooinspector/src/java/org/apache/zookeeper/inspector/manager/NodeListener.java b/pkg/registry/zookeeper-3.4.6/src/contrib/zooinspector/src/java/org/apache/zookeeper/inspector/manager/NodeListener.java deleted file mode 100644 index fe55a45b8..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/contrib/zooinspector/src/java/org/apache/zookeeper/inspector/manager/NodeListener.java +++ /dev/null @@ -1,37 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you 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. - */ -package org.apache.zookeeper.inspector.manager; - -import java.util.Map; - -/** - * A Listener for Events on zookeeper nodes - */ -public interface NodeListener { - /** - * @param nodePath - * - the path of the node - * @param eventType - * - the event type - * @param eventInfo - * - a {@link Map} containing any other information about this - * event - */ - public void processEvent(String nodePath, String eventType, - Map eventInfo); -} diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/zooinspector/src/java/org/apache/zookeeper/inspector/manager/Pair.java b/pkg/registry/zookeeper-3.4.6/src/contrib/zooinspector/src/java/org/apache/zookeeper/inspector/manager/Pair.java deleted file mode 100644 index b72950c95..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/contrib/zooinspector/src/java/org/apache/zookeeper/inspector/manager/Pair.java +++ /dev/null @@ -1,120 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you 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. - */ -package org.apache.zookeeper.inspector.manager; - -/** - * A utility class for storing a pair of objects - * - * @param - * @param - */ -public class Pair { - private K key; - private V value; - - /** - * @param key - * @param value - */ - public Pair(K key, V value) { - this.key = key; - this.value = value; - } - - /** - * - */ - public Pair() { - // Do Nothing - } - - /** - * @return key - */ - public K getKey() { - return key; - } - - /** - * @param key - */ - public void setKey(K key) { - this.key = key; - } - - /** - * @return value - */ - public V getValue() { - return value; - } - - /** - * @param value - */ - public void setValue(V value) { - this.value = value; - } - - @Override - public String toString() { - return "Pair [" + key + ", " + value + "]"; - } - - /* - * (non-Javadoc) - * - * @see java.lang.Object#hashCode() - */ - @Override - public int hashCode() { - final int prime = 31; - int result = 1; - result = prime * result + ((key == null) ? 0 : key.hashCode()); - result = prime * result + ((value == null) ? 0 : value.hashCode()); - return result; - } - - /* - * (non-Javadoc) - * - * @see java.lang.Object#equals(java.lang.Object) - */ - @Override - public boolean equals(Object obj) { - if (this == obj) - return true; - if (obj == null) - return false; - if (getClass() != obj.getClass()) - return false; - Pair other = (Pair) obj; - if (key == null) { - if (other.key != null) - return false; - } else if (!key.equals(other.key)) - return false; - if (value == null) { - if (other.value != null) - return false; - } else if (!value.equals(other.value)) - return false; - return true; - } - -} diff --git a/pkg/registry/zookeeper-3.4.6/src/contrib/zooinspector/src/java/org/apache/zookeeper/inspector/manager/ZooInspectorManager.java b/pkg/registry/zookeeper-3.4.6/src/contrib/zooinspector/src/java/org/apache/zookeeper/inspector/manager/ZooInspectorManager.java deleted file mode 100644 index 74c3cb20e..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/contrib/zooinspector/src/java/org/apache/zookeeper/inspector/manager/ZooInspectorManager.java +++ /dev/null @@ -1,139 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you 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. - */ -package org.apache.zookeeper.inspector.manager; - -import java.io.File; -import java.io.IOException; -import java.util.Collection; -import java.util.List; -import java.util.Map; -import java.util.Properties; - -import javax.swing.JComboBox; -import javax.swing.JTextField; - -/** - * A Manager for all interactions between the application and the Zookeeper - * instance - */ -public interface ZooInspectorManager extends ZooInspectorNodeManager, - ZooInspectorNodeTreeManager { - - /** - * @param connectionProps - * @return true if successfully connected - */ - public boolean connect(Properties connectionProps); - - /** - * @return true if successfully disconnected - */ - public boolean disconnect(); - - /** - * @return a {@link Pair} containing the following: - * ]]> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Important: All versions, of all nodes, under the given node are deleted. -

        - If there is an error with deleting one of the sub-nodes in the tree, - this operation would abort and would be the responsibility of the app to handle the same. - - See {@link #delete(String, int)} for more details. - - @throws IllegalArgumentException if an invalid path is specified]]> - - - - - - - - - - - - Important: All versions, of all nodes, under the given node are deleted. -

        - If there is an error with deleting one of the sub-nodes in the tree, - this operation would abort and would be the responsibility of the app to handle the same. -

        - @param zk the zookeeper handle - @param pathRoot the path to be deleted - @param cb call back method - @param ctx the context the callback method is called with - @throws IllegalArgumentException if an invalid path is specified]]> - - - - - - - - - - Important: This is not an atomic snapshot of the tree ever, but the - state as it exists across multiple RPCs from zkClient to the ensemble. - For practical purposes, it is suggested to bring the clients to the ensemble - down (i.e. prevent writes to pathRoot) to 'simulate' a snapshot behavior. - - @param zk the zookeeper handle - @param pathRoot The znode path, for which the entire subtree needs to be listed. - @throws InterruptedException - @throws KeeperException]]> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Session establishment is asynchronous. This constructor will initiate - connection to the server and return immediately - potentially (usually) - before the session is fully established. The watcher argument specifies - the watcher that will be notified of any changes in state. This - notification can come at any point before or after the constructor call - has returned. -

        - The instantiated ZooKeeper client object will pick an arbitrary server - from the connectString and attempt to connect to it. If establishment of - the connection fails, another server in the connect string will be tried - (the order is non-deterministic, as we random shuffle the list), until a - connection is established. The client will continue attempts until the - session is explicitly closed. -

        - Added in 3.2.0: An optional "chroot" suffix may also be appended to the - connection string. This will run the client commands while interpreting - all paths relative to this root (similar to the unix chroot command). - - @param connectString - comma separated host:port pairs, each corresponding to a zk - server. e.g. "127.0.0.1:3000,127.0.0.1:3001,127.0.0.1:3002" If - the optional chroot suffix is used the example would look - like: "127.0.0.1:3000,127.0.0.1:3001,127.0.0.1:3002/app/a" - where the client would be rooted at "/app/a" and all paths - would be relative to this root - ie getting/setting/etc... - "/foo/bar" would result in operations being run on - "/app/a/foo/bar" (from the server perspective). - @param sessionTimeout - session timeout in milliseconds - @param watcher - a watcher object which will be notified of state changes, may - also be notified for node events - - @throws IOException - in cases of network failure - @throws IllegalArgumentException - if an invalid chroot path is specified]]> - - - - - - - Session establishment is asynchronous. This constructor will initiate - connection to the server and return immediately - potentially (usually) - before the session is fully established. The watcher argument specifies - the watcher that will be notified of any changes in state. This - notification can come at any point before or after the constructor call - has returned. -

        - The instantiated ZooKeeper client object will pick an arbitrary server - from the connectString and attempt to connect to it. If establishment of - the connection fails, another server in the connect string will be tried - (the order is non-deterministic, as we random shuffle the list), until a - connection is established. The client will continue attempts until the - session is explicitly closed. -

        - Added in 3.2.0: An optional "chroot" suffix may also be appended to the - connection string. This will run the client commands while interpreting - all paths relative to this root (similar to the unix chroot command). - - @param connectString - comma separated host:port pairs, each corresponding to a zk - server. e.g. "127.0.0.1:3000,127.0.0.1:3001,127.0.0.1:3002" If - the optional chroot suffix is used the example would look - like: "127.0.0.1:3000,127.0.0.1:3001,127.0.0.1:3002/app/a" - where the client would be rooted at "/app/a" and all paths - would be relative to this root - ie getting/setting/etc... - "/foo/bar" would result in operations being run on - "/app/a/foo/bar" (from the server perspective). - @param sessionTimeout - session timeout in milliseconds - @param watcher - a watcher object which will be notified of state changes, may - also be notified for node events - @param canBeReadOnly - (added in 3.4) whether the created client is allowed to go to - read-only mode in case of partitioning. Read-only mode - basically means that if the client can't find any majority - servers but there's partitioned server it could reach, it - connects to one in read-only mode, i.e. read requests are - allowed while write requests are not. It continues seeking for - majority in the background. - - @throws IOException - in cases of network failure - @throws IllegalArgumentException - if an invalid chroot path is specified]]> - - - - - - - Session establishment is asynchronous. This constructor will initiate - connection to the server and return immediately - potentially (usually) - before the session is fully established. The watcher argument specifies - the watcher that will be notified of any changes in state. This - notification can come at any point before or after the constructor call - has returned. -

        - The instantiated ZooKeeper client object will pick an arbitrary server - from the connectString and attempt to connect to it. If establishment of - the connection fails, another server in the connect string will be tried - (the order is non-deterministic, as we random shuffle the list), until a - connection is established. The client will continue attempts until the - session is explicitly closed (or the session is expired by the server). -

        - Added in 3.2.0: An optional "chroot" suffix may also be appended to the - connection string. This will run the client commands while interpreting - all paths relative to this root (similar to the unix chroot command). -

        - Use {@link #getSessionId} and {@link #getSessionPasswd} on an established - client connection, these values must be passed as sessionId and - sessionPasswd respectively if reconnecting. Otherwise, if not - reconnecting, use the other constructor which does not require these - parameters. - - @param connectString - comma separated host:port pairs, each corresponding to a zk - server. e.g. "127.0.0.1:3000,127.0.0.1:3001,127.0.0.1:3002" - If the optional chroot suffix is used the example would look - like: "127.0.0.1:3000,127.0.0.1:3001,127.0.0.1:3002/app/a" - where the client would be rooted at "/app/a" and all paths - would be relative to this root - ie getting/setting/etc... - "/foo/bar" would result in operations being run on - "/app/a/foo/bar" (from the server perspective). - @param sessionTimeout - session timeout in milliseconds - @param watcher - a watcher object which will be notified of state changes, may - also be notified for node events - @param sessionId - specific session id to use if reconnecting - @param sessionPasswd - password for this session - - @throws IOException in cases of network failure - @throws IllegalArgumentException if an invalid chroot path is specified - @throws IllegalArgumentException for an invalid list of ZooKeeper hosts]]> - - - - - - - Session establishment is asynchronous. This constructor will initiate - connection to the server and return immediately - potentially (usually) - before the session is fully established. The watcher argument specifies - the watcher that will be notified of any changes in state. This - notification can come at any point before or after the constructor call - has returned. -

        - The instantiated ZooKeeper client object will pick an arbitrary server - from the connectString and attempt to connect to it. If establishment of - the connection fails, another server in the connect string will be tried - (the order is non-deterministic, as we random shuffle the list), until a - connection is established. The client will continue attempts until the - session is explicitly closed (or the session is expired by the server). -

        - Added in 3.2.0: An optional "chroot" suffix may also be appended to the - connection string. This will run the client commands while interpreting - all paths relative to this root (similar to the unix chroot command). -

        - Use {@link #getSessionId} and {@link #getSessionPasswd} on an established - client connection, these values must be passed as sessionId and - sessionPasswd respectively if reconnecting. Otherwise, if not - reconnecting, use the other constructor which does not require these - parameters. - - @param connectString - comma separated host:port pairs, each corresponding to a zk - server. e.g. "127.0.0.1:3000,127.0.0.1:3001,127.0.0.1:3002" - If the optional chroot suffix is used the example would look - like: "127.0.0.1:3000,127.0.0.1:3001,127.0.0.1:3002/app/a" - where the client would be rooted at "/app/a" and all paths - would be relative to this root - ie getting/setting/etc... - "/foo/bar" would result in operations being run on - "/app/a/foo/bar" (from the server perspective). - @param sessionTimeout - session timeout in milliseconds - @param watcher - a watcher object which will be notified of state changes, may - also be notified for node events - @param sessionId - specific session id to use if reconnecting - @param sessionPasswd - password for this session - @param canBeReadOnly - (added in 3.4) whether the created client is allowed to go to - read-only mode in case of partitioning. Read-only mode - basically means that if the client can't find any majority - servers but there's partitioned server it could reach, it - connects to one in read-only mode, i.e. read requests are - allowed while write requests are not. It continues seeking for - majority in the background. - - @throws IOException in cases of network failure - @throws IllegalArgumentException if an invalid chroot path is specified]]> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - The flags argument specifies whether the created node will be ephemeral - or not. -

        - An ephemeral node will be removed by the ZooKeeper automatically when the - session associated with the creation of the node expires. -

        - The flags argument can also specify to create a sequential node. The - actual path name of a sequential node will be the given path plus a - suffix "i" where i is the current sequential number of the node. The sequence - number is always fixed length of 10 digits, 0 padded. Once - such a node is created, the sequential number will be incremented by one. -

        - If a node with the same actual path already exists in the ZooKeeper, a - KeeperException with error code KeeperException.NodeExists will be - thrown. Note that since a different actual path is used for each - invocation of creating sequential node with the same path argument, the - call will never throw "file exists" KeeperException. -

        - If the parent node does not exist in the ZooKeeper, a KeeperException - with error code KeeperException.NoNode will be thrown. -

        - An ephemeral node cannot have children. If the parent node of the given - path is ephemeral, a KeeperException with error code - KeeperException.NoChildrenForEphemerals will be thrown. -

        - This operation, if successful, will trigger all the watches left on the - node of the given path by exists and getData API calls, and the watches - left on the parent node by getChildren API calls. -

        - If a node is created successfully, the ZooKeeper server will trigger the - watches on the path left by exists calls, and the watches on the parent - of the node by getChildren calls. -

        - The maximum allowable size of the data array is 1 MB (1,048,576 bytes). - Arrays larger than this will cause a KeeperExecption to be thrown. - - @param path - the path for the node - @param data - the initial data for the node - @param acl - the acl for the node - @param createMode - specifying whether the node to be created is ephemeral - and/or sequential - @return the actual path of the created node - @throws KeeperException if the server returns a non-zero error code - @throws KeeperException.InvalidACLException if the ACL is invalid, null, or empty - @throws InterruptedException if the transaction is interrupted - @throws IllegalArgumentException if an invalid path is specified]]> - - - - - - - - - - - - - - - - - - - - - A KeeperException with error code KeeperException.NoNode will be thrown - if the nodes does not exist. -

        - A KeeperException with error code KeeperException.BadVersion will be - thrown if the given version does not match the node's version. -

        - A KeeperException with error code KeeperException.NotEmpty will be thrown - if the node has children. -

        - This operation, if successful, will trigger all the watches on the node - of the given path left by exists API calls, and the watches on the parent - node left by getChildren API calls. - - @param path - the path of the node to be deleted. - @param version - the expected node version. - @throws InterruptedException IF the server transaction is interrupted - @throws KeeperException If the server signals an error with a non-zero - return code. - @throws IllegalArgumentException if an invalid path is specified]]> - - - - - - - - - On success, a list of results is returned. - On failure, an exception is raised which contains partial results and - error details, see {@link KeeperException#getResults} -

        - Note: The maximum allowable size of all of the data arrays in all of - the setData operations in this single request is typically 1 MB - (1,048,576 bytes). This limit is specified on the server via - jute.maxbuffer. - Requests larger than this will cause a KeeperException to be - thrown. - - @param ops An iterable that contains the operations to be done. - These should be created using the factory methods on {@link Op}. - @return A list of results, one for each input Op, the order of - which exactly matches the order of the ops input - operations. - @throws InterruptedException If the operation was interrupted. - The operation may or may not have succeeded, but will not have - partially succeeded if this exception is thrown. - @throws KeeperException If the operation could not be completed - due to some error in doing one of the specified ops. - @throws IllegalArgumentException if an invalid path is specified - - @since 3.4.0]]> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - If the watch is non-null and the call is successful (no exception is thrown), - a watch will be left on the node with the given path. The watch will be - triggered by a successful operation that creates/delete the node or sets - the data on the node. - - @param path the node path - @param watcher explicit watcher - @return the stat of the node of the given path; return null if no such a - node exists. - @throws KeeperException If the server signals an error - @throws InterruptedException If the server transaction is interrupted. - @throws IllegalArgumentException if an invalid path is specified]]> - - - - - - - - - - If the watch is true and the call is successful (no exception is thrown), - a watch will be left on the node with the given path. The watch will be - triggered by a successful operation that creates/delete the node or sets - the data on the node. - - @param path - the node path - @param watch - whether need to watch this node - @return the stat of the node of the given path; return null if no such a - node exists. - @throws KeeperException If the server signals an error - @throws InterruptedException If the server transaction is interrupted.]]> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - If the watch is non-null and the call is successful (no exception is - thrown), a watch will be left on the node with the given path. The watch - will be triggered by a successful operation that sets data on the node, or - deletes the node. -

        - A KeeperException with error code KeeperException.NoNode will be thrown - if no node with the given path exists. - - @param path the given path - @param watcher explicit watcher - @param stat the stat of the node - @return the data of the node - @throws KeeperException If the server signals an error with a non-zero error code - @throws InterruptedException If the server transaction is interrupted. - @throws IllegalArgumentException if an invalid path is specified]]> - - - - - - - - - - - If the watch is true and the call is successful (no exception is - thrown), a watch will be left on the node with the given path. The watch - will be triggered by a successful operation that sets data on the node, or - deletes the node. -

        - A KeeperException with error code KeeperException.NoNode will be thrown - if no node with the given path exists. - - @param path the given path - @param watch whether need to watch this node - @param stat the stat of the node - @return the data of the node - @throws KeeperException If the server signals an error with a non-zero error code - @throws InterruptedException If the server transaction is interrupted.]]> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - This operation, if successful, will trigger all the watches on the node - of the given path left by getData calls. -

        - A KeeperException with error code KeeperException.NoNode will be thrown - if no node with the given path exists. -

        - A KeeperException with error code KeeperException.BadVersion will be - thrown if the given version does not match the node's version. -

        - The maximum allowable size of the data array is 1 MB (1,048,576 bytes). - Arrays larger than this will cause a KeeperException to be thrown. - - @param path - the path of the node - @param data - the data to set - @param version - the expected matching version - @return the state of the node - @throws InterruptedException If the server transaction is interrupted. - @throws KeeperException If the server signals an error with a non-zero error code. - @throws IllegalArgumentException if an invalid path is specified]]> - - - - - - - - - - - - - - - - - - - - A KeeperException with error code KeeperException.NoNode will be thrown - if no node with the given path exists. - - @param path - the given path for the node - @param stat - the stat of the node will be copied to this parameter. - @return the ACL array of the given node. - @throws InterruptedException If the server transaction is interrupted. - @throws KeeperException If the server signals an error with a non-zero error code. - @throws IllegalArgumentException if an invalid path is specified]]> - - - - - - - - - - - - - - - - - - - - A KeeperException with error code KeeperException.NoNode will be thrown - if no node with the given path exists. -

        - A KeeperException with error code KeeperException.BadVersion will be - thrown if the given version does not match the node's version. - - @param path - @param acl - @param version - @return the stat of the node. - @throws InterruptedException If the server transaction is interrupted. - @throws KeeperException If the server signals an error with a non-zero error code. - @throws org.apache.zookeeper.KeeperException.InvalidACLException If the acl is invalide. - @throws IllegalArgumentException if an invalid path is specified]]> - - - - - - - - - - - - - - - - - - - - If the watch is non-null and the call is successful (no exception is thrown), - a watch will be left on the node with the given path. The watch willbe - triggered by a successful operation that deletes the node of the given - path or creates/delete a child under the node. -

        - The list of children returned is not sorted and no guarantee is provided - as to its natural or lexical order. -

        - A KeeperException with error code KeeperException.NoNode will be thrown - if no node with the given path exists. - - @param path - @param watcher explicit watcher - @return an unordered array of children of the node with the given path - @throws InterruptedException If the server transaction is interrupted. - @throws KeeperException If the server signals an error with a non-zero error code. - @throws IllegalArgumentException if an invalid path is specified]]> - - - - - - - - - - If the watch is true and the call is successful (no exception is thrown), - a watch will be left on the node with the given path. The watch willbe - triggered by a successful operation that deletes the node of the given - path or creates/delete a child under the node. -

        - The list of children returned is not sorted and no guarantee is provided - as to its natural or lexical order. -

        - A KeeperException with error code KeeperException.NoNode will be thrown - if no node with the given path exists. - - @param path - @param watch - @return an unordered array of children of the node with the given path - @throws InterruptedException If the server transaction is interrupted. - @throws KeeperException If the server signals an error with a non-zero error code.]]> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - If the watch is non-null and the call is successful (no exception is thrown), - a watch will be left on the node with the given path. The watch willbe - triggered by a successful operation that deletes the node of the given - path or creates/delete a child under the node. -

        - The list of children returned is not sorted and no guarantee is provided - as to its natural or lexical order. -

        - A KeeperException with error code KeeperException.NoNode will be thrown - if no node with the given path exists. - - @since 3.3.0 - - @param path - @param watcher explicit watcher - @param stat stat of the znode designated by path - @return an unordered array of children of the node with the given path - @throws InterruptedException If the server transaction is interrupted. - @throws KeeperException If the server signals an error with a non-zero error code. - @throws IllegalArgumentException if an invalid path is specified]]> - - - - - - - - - - - If the watch is true and the call is successful (no exception is thrown), - a watch will be left on the node with the given path. The watch willbe - triggered by a successful operation that deletes the node of the given - path or creates/delete a child under the node. -

        - The list of children returned is not sorted and no guarantee is provided - as to its natural or lexical order. -

        - A KeeperException with error code KeeperException.NoNode will be thrown - if no node with the given path exists. - - @since 3.3.0 - - @param path - @param watch - @param stat stat of the znode designated by path - @return an unordered array of children of the node with the given path - @throws InterruptedException If the server transaction is interrupted. - @throws KeeperException If the server signals an error with a non-zero - error code.]]> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Once a connection to a server is established, a session ID is assigned to the - client. The client will send heart beats to the server periodically to keep - the session valid. -

        - The application can call ZooKeeper APIs through a client as long as the - session ID of the client remains valid. -

        - If for some reason, the client fails to send heart beats to the server for a - prolonged period of time (exceeding the sessionTimeout value, for instance), - the server will expire the session, and the session ID will become invalid. - The client object will no longer be usable. To make ZooKeeper API calls, the - application must create a new client object. -

        - If the ZooKeeper server the client currently connects to fails or otherwise - does not respond, the client will automatically try to connect to another - server before its session ID expires. If successful, the application can - continue to use the client. -

        - The ZooKeeper API methods are either synchronous or asynchronous. Synchronous - methods blocks until the server has responded. Asynchronous methods just queue - the request for sending and return immediately. They take a callback object that - will be executed either on successful execution of the request or on error with - an appropriate return code (rc) indicating the error. -

        - Some successful ZooKeeper API calls can leave watches on the "data nodes" in - the ZooKeeper server. Other successful ZooKeeper API calls can trigger those - watches. Once a watch is triggered, an event will be delivered to the client - which left the watch at the first place. Each watch can be triggered only - once. Thus, up to one event will be delivered to a client for every watch it - leaves. -

        - A client needs an object of a class implementing Watcher interface for - processing the events delivered to the client. - - When a client drops current connection and re-connects to a server, all the - existing watches are considered as being triggered but the undelivered events - are lost. To emulate this, the client will generate a special event to tell - the event handler a connection has been dropped. This special event has type - EventNone and state sKeeperStateDisconnected.]]> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/pkg/registry/zookeeper-3.4.6/src/java/lib/jdiff/zookeeper_3.4.6.xml b/pkg/registry/zookeeper-3.4.6/src/java/lib/jdiff/zookeeper_3.4.6.xml deleted file mode 100644 index f91f61149..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/java/lib/jdiff/zookeeper_3.4.6.xml +++ /dev/null @@ -1,4559 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - null. - @param memoryLimit virtual memory limit - @return a String[] with the ulimit command arguments or - null if we are running on a non *nix platform or - if the limit is unspecified.]]> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Shell interface. - @param cmd shell command to execute. - @return the output of the executed command.]]> - - - - - - - - - Shell interface. - @param env the map of environment key=value - @param cmd shell command to execute. - @param timeout time in milliseconds after which script should be marked timeout - @return the output of the executed command.o]]> - - - - - - - - Shell interface. - @param env the map of environment key=value - @param cmd shell command to execute. - @return the output of the executed command.]]> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Shell can be used to run unix commands like du or - df. It also offers facilities to gate commands by - time-intervals.]]> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ShellCommandExecutorshould be used in cases where the output - of the command needs no explicit parsing and where the command, working - directory and the environment remains unchanged. The output of the command - is stored as-is and is expected to be small.]]> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

      1. --short - prints a short version string "1.2.3" -
      2. --revision - prints a short version string with the SVN - repository revision "1.2.3-94" -
      3. --full - prints the revision and the build date - ]]> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Important: All versions, of all nodes, under the given node are deleted. -

        - If there is an error with deleting one of the sub-nodes in the tree, - this operation would abort and would be the responsibility of the app to handle the same. - - See {@link #delete(String, int)} for more details. - - @throws IllegalArgumentException if an invalid path is specified]]> - - - - - - - - - - - - Important: All versions, of all nodes, under the given node are deleted. -

        - If there is an error with deleting one of the sub-nodes in the tree, - this operation would abort and would be the responsibility of the app to handle the same. -

        - @param zk the zookeeper handle - @param pathRoot the path to be deleted - @param cb call back method - @param ctx the context the callback method is called with - @throws IllegalArgumentException if an invalid path is specified]]> - - - - - - - - - - Important: This is not an atomic snapshot of the tree ever, but the - state as it exists across multiple RPCs from zkClient to the ensemble. - For practical purposes, it is suggested to bring the clients to the ensemble - down (i.e. prevent writes to pathRoot) to 'simulate' a snapshot behavior. - - @param zk the zookeeper handle - @param pathRoot The znode path, for which the entire subtree needs to be listed. - @throws InterruptedException - @throws KeeperException]]> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Session establishment is asynchronous. This constructor will initiate - connection to the server and return immediately - potentially (usually) - before the session is fully established. The watcher argument specifies - the watcher that will be notified of any changes in state. This - notification can come at any point before or after the constructor call - has returned. -

        - The instantiated ZooKeeper client object will pick an arbitrary server - from the connectString and attempt to connect to it. If establishment of - the connection fails, another server in the connect string will be tried - (the order is non-deterministic, as we random shuffle the list), until a - connection is established. The client will continue attempts until the - session is explicitly closed. -

        - Added in 3.2.0: An optional "chroot" suffix may also be appended to the - connection string. This will run the client commands while interpreting - all paths relative to this root (similar to the unix chroot command). - - @param connectString - comma separated host:port pairs, each corresponding to a zk - server. e.g. "127.0.0.1:3000,127.0.0.1:3001,127.0.0.1:3002" If - the optional chroot suffix is used the example would look - like: "127.0.0.1:3000,127.0.0.1:3001,127.0.0.1:3002/app/a" - where the client would be rooted at "/app/a" and all paths - would be relative to this root - ie getting/setting/etc... - "/foo/bar" would result in operations being run on - "/app/a/foo/bar" (from the server perspective). - @param sessionTimeout - session timeout in milliseconds - @param watcher - a watcher object which will be notified of state changes, may - also be notified for node events - - @throws IOException - in cases of network failure - @throws IllegalArgumentException - if an invalid chroot path is specified]]> - - - - - - - Session establishment is asynchronous. This constructor will initiate - connection to the server and return immediately - potentially (usually) - before the session is fully established. The watcher argument specifies - the watcher that will be notified of any changes in state. This - notification can come at any point before or after the constructor call - has returned. -

        - The instantiated ZooKeeper client object will pick an arbitrary server - from the connectString and attempt to connect to it. If establishment of - the connection fails, another server in the connect string will be tried - (the order is non-deterministic, as we random shuffle the list), until a - connection is established. The client will continue attempts until the - session is explicitly closed. -

        - Added in 3.2.0: An optional "chroot" suffix may also be appended to the - connection string. This will run the client commands while interpreting - all paths relative to this root (similar to the unix chroot command). - - @param connectString - comma separated host:port pairs, each corresponding to a zk - server. e.g. "127.0.0.1:3000,127.0.0.1:3001,127.0.0.1:3002" If - the optional chroot suffix is used the example would look - like: "127.0.0.1:3000,127.0.0.1:3001,127.0.0.1:3002/app/a" - where the client would be rooted at "/app/a" and all paths - would be relative to this root - ie getting/setting/etc... - "/foo/bar" would result in operations being run on - "/app/a/foo/bar" (from the server perspective). - @param sessionTimeout - session timeout in milliseconds - @param watcher - a watcher object which will be notified of state changes, may - also be notified for node events - @param canBeReadOnly - (added in 3.4) whether the created client is allowed to go to - read-only mode in case of partitioning. Read-only mode - basically means that if the client can't find any majority - servers but there's partitioned server it could reach, it - connects to one in read-only mode, i.e. read requests are - allowed while write requests are not. It continues seeking for - majority in the background. - - @throws IOException - in cases of network failure - @throws IllegalArgumentException - if an invalid chroot path is specified]]> - - - - - - - Session establishment is asynchronous. This constructor will initiate - connection to the server and return immediately - potentially (usually) - before the session is fully established. The watcher argument specifies - the watcher that will be notified of any changes in state. This - notification can come at any point before or after the constructor call - has returned. -

        - The instantiated ZooKeeper client object will pick an arbitrary server - from the connectString and attempt to connect to it. If establishment of - the connection fails, another server in the connect string will be tried - (the order is non-deterministic, as we random shuffle the list), until a - connection is established. The client will continue attempts until the - session is explicitly closed (or the session is expired by the server). -

        - Added in 3.2.0: An optional "chroot" suffix may also be appended to the - connection string. This will run the client commands while interpreting - all paths relative to this root (similar to the unix chroot command). -

        - Use {@link #getSessionId} and {@link #getSessionPasswd} on an established - client connection, these values must be passed as sessionId and - sessionPasswd respectively if reconnecting. Otherwise, if not - reconnecting, use the other constructor which does not require these - parameters. - - @param connectString - comma separated host:port pairs, each corresponding to a zk - server. e.g. "127.0.0.1:3000,127.0.0.1:3001,127.0.0.1:3002" - If the optional chroot suffix is used the example would look - like: "127.0.0.1:3000,127.0.0.1:3001,127.0.0.1:3002/app/a" - where the client would be rooted at "/app/a" and all paths - would be relative to this root - ie getting/setting/etc... - "/foo/bar" would result in operations being run on - "/app/a/foo/bar" (from the server perspective). - @param sessionTimeout - session timeout in milliseconds - @param watcher - a watcher object which will be notified of state changes, may - also be notified for node events - @param sessionId - specific session id to use if reconnecting - @param sessionPasswd - password for this session - - @throws IOException in cases of network failure - @throws IllegalArgumentException if an invalid chroot path is specified - @throws IllegalArgumentException for an invalid list of ZooKeeper hosts]]> - - - - - - - Session establishment is asynchronous. This constructor will initiate - connection to the server and return immediately - potentially (usually) - before the session is fully established. The watcher argument specifies - the watcher that will be notified of any changes in state. This - notification can come at any point before or after the constructor call - has returned. -

        - The instantiated ZooKeeper client object will pick an arbitrary server - from the connectString and attempt to connect to it. If establishment of - the connection fails, another server in the connect string will be tried - (the order is non-deterministic, as we random shuffle the list), until a - connection is established. The client will continue attempts until the - session is explicitly closed (or the session is expired by the server). -

        - Added in 3.2.0: An optional "chroot" suffix may also be appended to the - connection string. This will run the client commands while interpreting - all paths relative to this root (similar to the unix chroot command). -

        - Use {@link #getSessionId} and {@link #getSessionPasswd} on an established - client connection, these values must be passed as sessionId and - sessionPasswd respectively if reconnecting. Otherwise, if not - reconnecting, use the other constructor which does not require these - parameters. - - @param connectString - comma separated host:port pairs, each corresponding to a zk - server. e.g. "127.0.0.1:3000,127.0.0.1:3001,127.0.0.1:3002" - If the optional chroot suffix is used the example would look - like: "127.0.0.1:3000,127.0.0.1:3001,127.0.0.1:3002/app/a" - where the client would be rooted at "/app/a" and all paths - would be relative to this root - ie getting/setting/etc... - "/foo/bar" would result in operations being run on - "/app/a/foo/bar" (from the server perspective). - @param sessionTimeout - session timeout in milliseconds - @param watcher - a watcher object which will be notified of state changes, may - also be notified for node events - @param sessionId - specific session id to use if reconnecting - @param sessionPasswd - password for this session - @param canBeReadOnly - (added in 3.4) whether the created client is allowed to go to - read-only mode in case of partitioning. Read-only mode - basically means that if the client can't find any majority - servers but there's partitioned server it could reach, it - connects to one in read-only mode, i.e. read requests are - allowed while write requests are not. It continues seeking for - majority in the background. - - @throws IOException in cases of network failure - @throws IllegalArgumentException if an invalid chroot path is specified]]> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - The flags argument specifies whether the created node will be ephemeral - or not. -

        - An ephemeral node will be removed by the ZooKeeper automatically when the - session associated with the creation of the node expires. -

        - The flags argument can also specify to create a sequential node. The - actual path name of a sequential node will be the given path plus a - suffix "i" where i is the current sequential number of the node. The sequence - number is always fixed length of 10 digits, 0 padded. Once - such a node is created, the sequential number will be incremented by one. -

        - If a node with the same actual path already exists in the ZooKeeper, a - KeeperException with error code KeeperException.NodeExists will be - thrown. Note that since a different actual path is used for each - invocation of creating sequential node with the same path argument, the - call will never throw "file exists" KeeperException. -

        - If the parent node does not exist in the ZooKeeper, a KeeperException - with error code KeeperException.NoNode will be thrown. -

        - An ephemeral node cannot have children. If the parent node of the given - path is ephemeral, a KeeperException with error code - KeeperException.NoChildrenForEphemerals will be thrown. -

        - This operation, if successful, will trigger all the watches left on the - node of the given path by exists and getData API calls, and the watches - left on the parent node by getChildren API calls. -

        - If a node is created successfully, the ZooKeeper server will trigger the - watches on the path left by exists calls, and the watches on the parent - of the node by getChildren calls. -

        - The maximum allowable size of the data array is 1 MB (1,048,576 bytes). - Arrays larger than this will cause a KeeperExecption to be thrown. - - @param path - the path for the node - @param data - the initial data for the node - @param acl - the acl for the node - @param createMode - specifying whether the node to be created is ephemeral - and/or sequential - @return the actual path of the created node - @throws KeeperException if the server returns a non-zero error code - @throws KeeperException.InvalidACLException if the ACL is invalid, null, or empty - @throws InterruptedException if the transaction is interrupted - @throws IllegalArgumentException if an invalid path is specified]]> - - - - - - - - - - - - - - - - - - - - - A KeeperException with error code KeeperException.NoNode will be thrown - if the nodes does not exist. -

        - A KeeperException with error code KeeperException.BadVersion will be - thrown if the given version does not match the node's version. -

        - A KeeperException with error code KeeperException.NotEmpty will be thrown - if the node has children. -

        - This operation, if successful, will trigger all the watches on the node - of the given path left by exists API calls, and the watches on the parent - node left by getChildren API calls. - - @param path - the path of the node to be deleted. - @param version - the expected node version. - @throws InterruptedException IF the server transaction is interrupted - @throws KeeperException If the server signals an error with a non-zero - return code. - @throws IllegalArgumentException if an invalid path is specified]]> - - - - - - - - - On success, a list of results is returned. - On failure, an exception is raised which contains partial results and - error details, see {@link KeeperException#getResults} -

        - Note: The maximum allowable size of all of the data arrays in all of - the setData operations in this single request is typically 1 MB - (1,048,576 bytes). This limit is specified on the server via - jute.maxbuffer. - Requests larger than this will cause a KeeperException to be - thrown. - - @param ops An iterable that contains the operations to be done. - These should be created using the factory methods on {@link Op}. - @return A list of results, one for each input Op, the order of - which exactly matches the order of the ops input - operations. - @throws InterruptedException If the operation was interrupted. - The operation may or may not have succeeded, but will not have - partially succeeded if this exception is thrown. - @throws KeeperException If the operation could not be completed - due to some error in doing one of the specified ops. - @throws IllegalArgumentException if an invalid path is specified - - @since 3.4.0]]> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - If the watch is non-null and the call is successful (no exception is thrown), - a watch will be left on the node with the given path. The watch will be - triggered by a successful operation that creates/delete the node or sets - the data on the node. - - @param path the node path - @param watcher explicit watcher - @return the stat of the node of the given path; return null if no such a - node exists. - @throws KeeperException If the server signals an error - @throws InterruptedException If the server transaction is interrupted. - @throws IllegalArgumentException if an invalid path is specified]]> - - - - - - - - - - If the watch is true and the call is successful (no exception is thrown), - a watch will be left on the node with the given path. The watch will be - triggered by a successful operation that creates/delete the node or sets - the data on the node. - - @param path - the node path - @param watch - whether need to watch this node - @return the stat of the node of the given path; return null if no such a - node exists. - @throws KeeperException If the server signals an error - @throws InterruptedException If the server transaction is interrupted.]]> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - If the watch is non-null and the call is successful (no exception is - thrown), a watch will be left on the node with the given path. The watch - will be triggered by a successful operation that sets data on the node, or - deletes the node. -

        - A KeeperException with error code KeeperException.NoNode will be thrown - if no node with the given path exists. - - @param path the given path - @param watcher explicit watcher - @param stat the stat of the node - @return the data of the node - @throws KeeperException If the server signals an error with a non-zero error code - @throws InterruptedException If the server transaction is interrupted. - @throws IllegalArgumentException if an invalid path is specified]]> - - - - - - - - - - - If the watch is true and the call is successful (no exception is - thrown), a watch will be left on the node with the given path. The watch - will be triggered by a successful operation that sets data on the node, or - deletes the node. -

        - A KeeperException with error code KeeperException.NoNode will be thrown - if no node with the given path exists. - - @param path the given path - @param watch whether need to watch this node - @param stat the stat of the node - @return the data of the node - @throws KeeperException If the server signals an error with a non-zero error code - @throws InterruptedException If the server transaction is interrupted.]]> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - This operation, if successful, will trigger all the watches on the node - of the given path left by getData calls. -

        - A KeeperException with error code KeeperException.NoNode will be thrown - if no node with the given path exists. -

        - A KeeperException with error code KeeperException.BadVersion will be - thrown if the given version does not match the node's version. -

        - The maximum allowable size of the data array is 1 MB (1,048,576 bytes). - Arrays larger than this will cause a KeeperException to be thrown. - - @param path - the path of the node - @param data - the data to set - @param version - the expected matching version - @return the state of the node - @throws InterruptedException If the server transaction is interrupted. - @throws KeeperException If the server signals an error with a non-zero error code. - @throws IllegalArgumentException if an invalid path is specified]]> - - - - - - - - - - - - - - - - - - - - A KeeperException with error code KeeperException.NoNode will be thrown - if no node with the given path exists. - - @param path - the given path for the node - @param stat - the stat of the node will be copied to this parameter. - @return the ACL array of the given node. - @throws InterruptedException If the server transaction is interrupted. - @throws KeeperException If the server signals an error with a non-zero error code. - @throws IllegalArgumentException if an invalid path is specified]]> - - - - - - - - - - - - - - - - - - - - A KeeperException with error code KeeperException.NoNode will be thrown - if no node with the given path exists. -

        - A KeeperException with error code KeeperException.BadVersion will be - thrown if the given version does not match the node's version. - - @param path - @param acl - @param version - @return the stat of the node. - @throws InterruptedException If the server transaction is interrupted. - @throws KeeperException If the server signals an error with a non-zero error code. - @throws org.apache.zookeeper.KeeperException.InvalidACLException If the acl is invalide. - @throws IllegalArgumentException if an invalid path is specified]]> - - - - - - - - - - - - - - - - - - - - If the watch is non-null and the call is successful (no exception is thrown), - a watch will be left on the node with the given path. The watch willbe - triggered by a successful operation that deletes the node of the given - path or creates/delete a child under the node. -

        - The list of children returned is not sorted and no guarantee is provided - as to its natural or lexical order. -

        - A KeeperException with error code KeeperException.NoNode will be thrown - if no node with the given path exists. - - @param path - @param watcher explicit watcher - @return an unordered array of children of the node with the given path - @throws InterruptedException If the server transaction is interrupted. - @throws KeeperException If the server signals an error with a non-zero error code. - @throws IllegalArgumentException if an invalid path is specified]]> - - - - - - - - - - If the watch is true and the call is successful (no exception is thrown), - a watch will be left on the node with the given path. The watch willbe - triggered by a successful operation that deletes the node of the given - path or creates/delete a child under the node. -

        - The list of children returned is not sorted and no guarantee is provided - as to its natural or lexical order. -

        - A KeeperException with error code KeeperException.NoNode will be thrown - if no node with the given path exists. - - @param path - @param watch - @return an unordered array of children of the node with the given path - @throws InterruptedException If the server transaction is interrupted. - @throws KeeperException If the server signals an error with a non-zero error code.]]> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - If the watch is non-null and the call is successful (no exception is thrown), - a watch will be left on the node with the given path. The watch willbe - triggered by a successful operation that deletes the node of the given - path or creates/delete a child under the node. -

        - The list of children returned is not sorted and no guarantee is provided - as to its natural or lexical order. -

        - A KeeperException with error code KeeperException.NoNode will be thrown - if no node with the given path exists. - - @since 3.3.0 - - @param path - @param watcher explicit watcher - @param stat stat of the znode designated by path - @return an unordered array of children of the node with the given path - @throws InterruptedException If the server transaction is interrupted. - @throws KeeperException If the server signals an error with a non-zero error code. - @throws IllegalArgumentException if an invalid path is specified]]> - - - - - - - - - - - If the watch is true and the call is successful (no exception is thrown), - a watch will be left on the node with the given path. The watch willbe - triggered by a successful operation that deletes the node of the given - path or creates/delete a child under the node. -

        - The list of children returned is not sorted and no guarantee is provided - as to its natural or lexical order. -

        - A KeeperException with error code KeeperException.NoNode will be thrown - if no node with the given path exists. - - @since 3.3.0 - - @param path - @param watch - @param stat stat of the znode designated by path - @return an unordered array of children of the node with the given path - @throws InterruptedException If the server transaction is interrupted. - @throws KeeperException If the server signals an error with a non-zero - error code.]]> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Once a connection to a server is established, a session ID is assigned to the - client. The client will send heart beats to the server periodically to keep - the session valid. -

        - The application can call ZooKeeper APIs through a client as long as the - session ID of the client remains valid. -

        - If for some reason, the client fails to send heart beats to the server for a - prolonged period of time (exceeding the sessionTimeout value, for instance), - the server will expire the session, and the session ID will become invalid. - The client object will no longer be usable. To make ZooKeeper API calls, the - application must create a new client object. -

        - If the ZooKeeper server the client currently connects to fails or otherwise - does not respond, the client will automatically try to connect to another - server before its session ID expires. If successful, the application can - continue to use the client. -

        - The ZooKeeper API methods are either synchronous or asynchronous. Synchronous - methods blocks until the server has responded. Asynchronous methods just queue - the request for sending and return immediately. They take a callback object that - will be executed either on successful execution of the request or on error with - an appropriate return code (rc) indicating the error. -

        - Some successful ZooKeeper API calls can leave watches on the "data nodes" in - the ZooKeeper server. Other successful ZooKeeper API calls can trigger those - watches. Once a watch is triggered, an event will be delivered to the client - which left the watch at the first place. Each watch can be triggered only - once. Thus, up to one event will be delivered to a client for every watch it - leaves. -

        - A client needs an object of a class implementing Watcher interface for - processing the events delivered to the client. - - When a client drops current connection and re-connects to a server, all the - existing watches are considered as being triggered but the undelivered events - are lost. To emulate this, the client will generate a special event to tell - the event handler a connection has been dropped. This special event has type - EventNone and state sKeeperStateDisconnected.]]> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/pkg/registry/zookeeper-3.4.6/src/java/lib/jline-0.9.94.LICENSE.txt b/pkg/registry/zookeeper-3.4.6/src/java/lib/jline-0.9.94.LICENSE.txt deleted file mode 100644 index 1cdc44c21..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/java/lib/jline-0.9.94.LICENSE.txt +++ /dev/null @@ -1,33 +0,0 @@ -Copyright (c) 2002-2006, Marc Prud'hommeaux -All rights reserved. - -Redistribution and use in source and binary forms, with or -without modification, are permitted provided that the following -conditions are met: - -Redistributions of source code must retain the above copyright -notice, this list of conditions and the following disclaimer. - -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. - -Neither the name of JLine nor the names of its contributors -may be used to endorse or promote products derived from this -software without specific prior written permission. - -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. - diff --git a/pkg/registry/zookeeper-3.4.6/src/java/lib/log4j-1.2.16.LICENSE.txt b/pkg/registry/zookeeper-3.4.6/src/java/lib/log4j-1.2.16.LICENSE.txt deleted file mode 100644 index 6279e5206..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/java/lib/log4j-1.2.16.LICENSE.txt +++ /dev/null @@ -1,202 +0,0 @@ - - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "[]" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright 1999-2005 The Apache Software Foundation - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. diff --git a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/jute/BinaryInputArchive.java b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/jute/BinaryInputArchive.java deleted file mode 100644 index 6b2cb46a8..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/jute/BinaryInputArchive.java +++ /dev/null @@ -1,126 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you 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. - */ - -package org.apache.jute; - -import java.io.DataInput; -import java.io.DataInputStream; -import java.io.IOException; -import java.io.InputStream; - -/** - * - */ -public class BinaryInputArchive implements InputArchive { - - private DataInput in; - - static public BinaryInputArchive getArchive(InputStream strm) { - return new BinaryInputArchive(new DataInputStream(strm)); - } - - static private class BinaryIndex implements Index { - private int nelems; - BinaryIndex(int nelems) { - this.nelems = nelems; - } - public boolean done() { - return (nelems <= 0); - } - public void incr() { - nelems--; - } - } - /** Creates a new instance of BinaryInputArchive */ - public BinaryInputArchive(DataInput in) { - this.in = in; - } - - public byte readByte(String tag) throws IOException { - return in.readByte(); - } - - public boolean readBool(String tag) throws IOException { - return in.readBoolean(); - } - - public int readInt(String tag) throws IOException { - return in.readInt(); - } - - public long readLong(String tag) throws IOException { - return in.readLong(); - } - - public float readFloat(String tag) throws IOException { - return in.readFloat(); - } - - public double readDouble(String tag) throws IOException { - return in.readDouble(); - } - - public String readString(String tag) throws IOException { - int len = in.readInt(); - if (len == -1) return null; - byte b[] = new byte[len]; - in.readFully(b); - return new String(b, "UTF8"); - } - - static public final int maxBuffer = Integer.getInteger("jute.maxbuffer", 0xfffff); - - public byte[] readBuffer(String tag) throws IOException { - int len = readInt(tag); - if (len == -1) return null; - // Since this is a rough sanity check, add some padding to maxBuffer to - // make up for extra fields, etc. (otherwise e.g. clients may be able to - // write buffers larger than we can read from disk!) - if (len < 0 || len > maxBuffer + 1024) { - throw new IOException("Unreasonable length = " + len); - } - byte[] arr = new byte[len]; - in.readFully(arr); - return arr; - } - - public void readRecord(Record r, String tag) throws IOException { - r.deserialize(this, tag); - } - - public void startRecord(String tag) throws IOException {} - - public void endRecord(String tag) throws IOException {} - - public Index startVector(String tag) throws IOException { - int len = readInt(tag); - if (len == -1) { - return null; - } - return new BinaryIndex(len); - } - - public void endVector(String tag) throws IOException {} - - public Index startMap(String tag) throws IOException { - return new BinaryIndex(readInt(tag)); - } - - public void endMap(String tag) throws IOException {} - -} diff --git a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/jute/BinaryOutputArchive.java b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/jute/BinaryOutputArchive.java deleted file mode 100644 index 213e20339..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/jute/BinaryOutputArchive.java +++ /dev/null @@ -1,146 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you 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. - */ - -package org.apache.jute; - -import java.io.DataOutput; -import java.io.DataOutputStream; -import java.io.IOException; -import java.io.OutputStream; -import java.nio.ByteBuffer; -import java.util.List; -import java.util.TreeMap; - -/** - * - */ -public class BinaryOutputArchive implements OutputArchive { - private ByteBuffer bb = ByteBuffer.allocate(1024); - - private DataOutput out; - - public static BinaryOutputArchive getArchive(OutputStream strm) { - return new BinaryOutputArchive(new DataOutputStream(strm)); - } - - /** Creates a new instance of BinaryOutputArchive */ - public BinaryOutputArchive(DataOutput out) { - this.out = out; - } - - public void writeByte(byte b, String tag) throws IOException { - out.writeByte(b); - } - - public void writeBool(boolean b, String tag) throws IOException { - out.writeBoolean(b); - } - - public void writeInt(int i, String tag) throws IOException { - out.writeInt(i); - } - - public void writeLong(long l, String tag) throws IOException { - out.writeLong(l); - } - - public void writeFloat(float f, String tag) throws IOException { - out.writeFloat(f); - } - - public void writeDouble(double d, String tag) throws IOException { - out.writeDouble(d); - } - - /** - * create our own char encoder to utf8. This is faster - * then string.getbytes(UTF8). - * @param s the string to encode into utf8 - * @return utf8 byte sequence. - */ - final private ByteBuffer stringToByteBuffer(CharSequence s) { - bb.clear(); - final int len = s.length(); - for (int i = 0; i < len; i++) { - if (bb.remaining() < 3) { - ByteBuffer n = ByteBuffer.allocate(bb.capacity() << 1); - bb.flip(); - n.put(bb); - bb = n; - } - char c = s.charAt(i); - if (c < 0x80) { - bb.put((byte) c); - } else if (c < 0x800) { - bb.put((byte) (0xc0 | (c >> 6))); - bb.put((byte) (0x80 | (c & 0x3f))); - } else { - bb.put((byte) (0xe0 | (c >> 12))); - bb.put((byte) (0x80 | ((c >> 6) & 0x3f))); - bb.put((byte) (0x80 | (c & 0x3f))); - } - } - bb.flip(); - return bb; - } - - public void writeString(String s, String tag) throws IOException { - if (s == null) { - writeInt(-1, "len"); - return; - } - ByteBuffer bb = stringToByteBuffer(s); - writeInt(bb.remaining(), "len"); - out.write(bb.array(), bb.position(), bb.limit()); - } - - public void writeBuffer(byte barr[], String tag) - throws IOException { - if (barr == null) { - out.writeInt(-1); - return; - } - out.writeInt(barr.length); - out.write(barr); - } - - public void writeRecord(Record r, String tag) throws IOException { - r.serialize(this, tag); - } - - public void startRecord(Record r, String tag) throws IOException {} - - public void endRecord(Record r, String tag) throws IOException {} - - public void startVector(List v, String tag) throws IOException { - if (v == null) { - writeInt(-1, tag); - return; - } - writeInt(v.size(), tag); - } - - public void endVector(List v, String tag) throws IOException {} - - public void startMap(TreeMap v, String tag) throws IOException { - writeInt(v.size(), tag); - } - - public void endMap(TreeMap v, String tag) throws IOException {} - -} diff --git a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/jute/CsvInputArchive.java b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/jute/CsvInputArchive.java deleted file mode 100644 index 3eb40ec7e..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/jute/CsvInputArchive.java +++ /dev/null @@ -1,208 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you 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. - */ - -package org.apache.jute; - -import java.io.IOException; -import java.io.InputStream; -import java.io.InputStreamReader; -import java.io.PushbackReader; -import java.io.UnsupportedEncodingException; - -/** - * - */ -class CsvInputArchive implements InputArchive { - - private PushbackReader stream; - - private class CsvIndex implements Index { - public boolean done() { - char c = '\0'; - try { - c = (char) stream.read(); - stream.unread(c); - } catch (IOException ex) { - } - return (c == '}') ? true : false; - } - public void incr() {} - } - - private void throwExceptionOnError(String tag) throws IOException { - throw new IOException("Error deserializing "+tag); - } - - private String readField(String tag) throws IOException { - try { - StringBuilder buf = new StringBuilder(); - while (true) { - char c = (char) stream.read(); - switch (c) { - case ',': - return buf.toString(); - case '}': - case '\n': - case '\r': - stream.unread(c); - return buf.toString(); - default: - buf.append(c); - } - } - } catch (IOException ex) { - throw new IOException("Error reading "+tag); - } - } - - static CsvInputArchive getArchive(InputStream strm) - throws UnsupportedEncodingException { - return new CsvInputArchive(strm); - } - - /** Creates a new instance of CsvInputArchive */ - public CsvInputArchive(InputStream in) - throws UnsupportedEncodingException { - stream = new PushbackReader(new InputStreamReader(in, "UTF-8")); - } - - public byte readByte(String tag) throws IOException { - return (byte) readLong(tag); - } - - public boolean readBool(String tag) throws IOException { - String sval = readField(tag); - return "T".equals(sval) ? true : false; - } - - public int readInt(String tag) throws IOException { - return (int) readLong(tag); - } - - public long readLong(String tag) throws IOException { - String sval = readField(tag); - try { - long lval = Long.parseLong(sval); - return lval; - } catch (NumberFormatException ex) { - throw new IOException("Error deserializing "+tag); - } - } - - public float readFloat(String tag) throws IOException { - return (float) readDouble(tag); - } - - public double readDouble(String tag) throws IOException { - String sval = readField(tag); - try { - double dval = Double.parseDouble(sval); - return dval; - } catch (NumberFormatException ex) { - throw new IOException("Error deserializing "+tag); - } - } - - public String readString(String tag) throws IOException { - String sval = readField(tag); - return Utils.fromCSVString(sval); - - } - - public byte[] readBuffer(String tag) throws IOException { - String sval = readField(tag); - return Utils.fromCSVBuffer(sval); - } - - public void readRecord(Record r, String tag) throws IOException { - r.deserialize(this, tag); - } - - public void startRecord(String tag) throws IOException { - if (tag != null && !"".equals(tag)) { - char c1 = (char) stream.read(); - char c2 = (char) stream.read(); - if (c1 != 's' || c2 != '{') { - throw new IOException("Error deserializing "+tag); - } - } - } - - public void endRecord(String tag) throws IOException { - char c = (char) stream.read(); - if (tag == null || "".equals(tag)) { - if (c != '\n' && c != '\r') { - throw new IOException("Error deserializing record."); - } else { - return; - } - } - - if (c != '}') { - throw new IOException("Error deserializing "+tag); - } - c = (char) stream.read(); - if (c != ',') { - stream.unread(c); - } - - return; - } - - public Index startVector(String tag) throws IOException { - char c1 = (char) stream.read(); - char c2 = (char) stream.read(); - if (c1 != 'v' || c2 != '{') { - throw new IOException("Error deserializing "+tag); - } - return new CsvIndex(); - } - - public void endVector(String tag) throws IOException { - char c = (char) stream.read(); - if (c != '}') { - throw new IOException("Error deserializing "+tag); - } - c = (char) stream.read(); - if (c != ',') { - stream.unread(c); - } - return; - } - - public Index startMap(String tag) throws IOException { - char c1 = (char) stream.read(); - char c2 = (char) stream.read(); - if (c1 != 'm' || c2 != '{') { - throw new IOException("Error deserializing "+tag); - } - return new CsvIndex(); - } - - public void endMap(String tag) throws IOException { - char c = (char) stream.read(); - if (c != '}') { - throw new IOException("Error deserializing "+tag); - } - c = (char) stream.read(); - if (c != ',') { - stream.unread(c); - } - return; - } -} diff --git a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/jute/CsvOutputArchive.java b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/jute/CsvOutputArchive.java deleted file mode 100644 index f6d60d819..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/jute/CsvOutputArchive.java +++ /dev/null @@ -1,150 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you 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. - */ - -package org.apache.jute; - -import java.io.IOException; -import java.io.OutputStream; -import java.io.PrintStream; -import java.io.UnsupportedEncodingException; -import java.util.List; -import java.util.TreeMap; - -/** - * - */ -public class CsvOutputArchive implements OutputArchive { - - private PrintStream stream; - private boolean isFirst = true; - - static CsvOutputArchive getArchive(OutputStream strm) - throws UnsupportedEncodingException { - return new CsvOutputArchive(strm); - } - - private void throwExceptionOnError(String tag) throws IOException { - if (stream.checkError()) { - throw new IOException("Error serializing "+tag); - } - } - - private void printCommaUnlessFirst() { - if (!isFirst) { - stream.print(","); - } - isFirst = false; - } - - /** Creates a new instance of CsvOutputArchive */ - public CsvOutputArchive(OutputStream out) - throws UnsupportedEncodingException { - stream = new PrintStream(out, true, "UTF-8"); - } - - public void writeByte(byte b, String tag) throws IOException { - writeLong((long)b, tag); - } - - public void writeBool(boolean b, String tag) throws IOException { - printCommaUnlessFirst(); - String val = b ? "T" : "F"; - stream.print(val); - throwExceptionOnError(tag); - } - - public void writeInt(int i, String tag) throws IOException { - writeLong((long)i, tag); - } - - public void writeLong(long l, String tag) throws IOException { - printCommaUnlessFirst(); - stream.print(l); - throwExceptionOnError(tag); - } - - public void writeFloat(float f, String tag) throws IOException { - writeDouble((double)f, tag); - } - - public void writeDouble(double d, String tag) throws IOException { - printCommaUnlessFirst(); - stream.print(d); - throwExceptionOnError(tag); - } - - public void writeString(String s, String tag) throws IOException { - printCommaUnlessFirst(); - stream.print(Utils.toCSVString(s)); - throwExceptionOnError(tag); - } - - public void writeBuffer(byte buf[], String tag) - throws IOException { - printCommaUnlessFirst(); - stream.print(Utils.toCSVBuffer(buf)); - throwExceptionOnError(tag); - } - - public void writeRecord(Record r, String tag) throws IOException { - if (r == null) { - return; - } - r.serialize(this, tag); - } - - public void startRecord(Record r, String tag) throws IOException { - if (tag != null && !"".equals(tag)) { - printCommaUnlessFirst(); - stream.print("s{"); - isFirst = true; - } - } - - public void endRecord(Record r, String tag) throws IOException { - if (tag == null || "".equals(tag)) { - stream.print("\n"); - isFirst = true; - } else { - stream.print("}"); - isFirst = false; - } - } - - public void startVector(List v, String tag) throws IOException { - printCommaUnlessFirst(); - stream.print("v{"); - isFirst = true; - } - - public void endVector(List v, String tag) throws IOException { - stream.print("}"); - isFirst = false; - } - - public void startMap(TreeMap v, String tag) throws IOException { - printCommaUnlessFirst(); - stream.print("m{"); - isFirst = true; - } - - public void endMap(TreeMap v, String tag) throws IOException { - stream.print("}"); - isFirst = false; - } -} diff --git a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/jute/Index.java b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/jute/Index.java deleted file mode 100644 index 258c6b55d..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/jute/Index.java +++ /dev/null @@ -1,38 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you 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. - */ - -package org.apache.jute; - -/** - * Interface that acts as an iterator for deserializing maps. - * The deserializer returns an instance that the record uses to - * read vectors and maps. An example of usage is as follows: - * - * - * Index idx = startVector(...); - * while (!idx.done()) { - * .... // read element of a vector - * idx.incr(); - * } - * - * - */ -public interface Index { - public boolean done(); - public void incr(); -} diff --git a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/jute/InputArchive.java b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/jute/InputArchive.java deleted file mode 100644 index b19ab3de6..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/jute/InputArchive.java +++ /dev/null @@ -1,43 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you 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. - */ - -package org.apache.jute; - -import java.io.IOException; - -/** - * Interface that all the Deserializers have to implement. - * - */ -public interface InputArchive { - public byte readByte(String tag) throws IOException; - public boolean readBool(String tag) throws IOException; - public int readInt(String tag) throws IOException; - public long readLong(String tag) throws IOException; - public float readFloat(String tag) throws IOException; - public double readDouble(String tag) throws IOException; - public String readString(String tag) throws IOException; - public byte[] readBuffer(String tag) throws IOException; - public void readRecord(Record r, String tag) throws IOException; - public void startRecord(String tag) throws IOException; - public void endRecord(String tag) throws IOException; - public Index startVector(String tag) throws IOException; - public void endVector(String tag) throws IOException; - public Index startMap(String tag) throws IOException; - public void endMap(String tag) throws IOException; -} diff --git a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/jute/OutputArchive.java b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/jute/OutputArchive.java deleted file mode 100644 index 4e084e8e1..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/jute/OutputArchive.java +++ /dev/null @@ -1,47 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you 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. - */ - -package org.apache.jute; - -import java.io.IOException; -import java.util.List; -import java.util.TreeMap; - -/** - * Interface that alll the serializers have to implement. - * - */ -public interface OutputArchive { - public void writeByte(byte b, String tag) throws IOException; - public void writeBool(boolean b, String tag) throws IOException; - public void writeInt(int i, String tag) throws IOException; - public void writeLong(long l, String tag) throws IOException; - public void writeFloat(float f, String tag) throws IOException; - public void writeDouble(double d, String tag) throws IOException; - public void writeString(String s, String tag) throws IOException; - public void writeBuffer(byte buf[], String tag) - throws IOException; - public void writeRecord(Record r, String tag) throws IOException; - public void startRecord(Record r, String tag) throws IOException; - public void endRecord(Record r, String tag) throws IOException; - public void startVector(List v, String tag) throws IOException; - public void endVector(List v, String tag) throws IOException; - public void startMap(TreeMap v, String tag) throws IOException; - public void endMap(TreeMap v, String tag) throws IOException; - -} diff --git a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/jute/Record.java b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/jute/Record.java deleted file mode 100644 index bc7a350ee..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/jute/Record.java +++ /dev/null @@ -1,32 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you 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. - */ - -package org.apache.jute; - -import java.io.IOException; - -/** - * Interface that is implemented by generated classes. - * - */ -public interface Record { - public void serialize(OutputArchive archive, String tag) - throws IOException; - public void deserialize(InputArchive archive, String tag) - throws IOException; -} diff --git a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/jute/RecordReader.java b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/jute/RecordReader.java deleted file mode 100644 index 2977d3fbe..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/jute/RecordReader.java +++ /dev/null @@ -1,93 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you 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. - */ - -package org.apache.jute; - -import java.io.IOException; -import java.io.InputStream; -import java.lang.reflect.InvocationTargetException; -import java.lang.reflect.Method; -import java.util.HashMap; - -/** - * Front-end interface to deserializers. Also acts as a factory - * for deserializers. - * - */ -public class RecordReader { - - private InputArchive archive; - - static private HashMap archiveFactory; - - static { - archiveFactory = new HashMap(); - Class[] params = { InputStream.class }; - try { - archiveFactory.put("binary", - BinaryInputArchive.class.getDeclaredMethod( - "getArchive", params)); - archiveFactory.put("csv", - CsvInputArchive.class.getDeclaredMethod( - "getArchive", params)); - archiveFactory.put("xml", - XmlInputArchive.class.getDeclaredMethod( - "getArchive", params)); - } catch (SecurityException ex) { - ex.printStackTrace(); - } catch (NoSuchMethodException ex) { - ex.printStackTrace(); - } - } - - static private InputArchive createArchive(InputStream in, String format) - throws IOException { - Method factory = (Method) archiveFactory.get(format); - if (factory != null) { - Object[] params = { in }; - try { - return (InputArchive) factory.invoke(null, params); - } catch (IllegalArgumentException ex) { - ex.printStackTrace(); - } catch (InvocationTargetException ex) { - ex.printStackTrace(); - } catch (IllegalAccessException ex) { - ex.printStackTrace(); - } - } - return null; - } - /** - * Creates a new instance of RecordReader. - * @param in Stream from which to deserialize a record - * @param format Deserialization format ("binary", "xml", or "csv") - */ - public RecordReader(InputStream in, String format) - throws IOException { - archive = createArchive(in, format); - } - - /** - * Deserialize a record - * @param r Record to be deserialized - */ - public void read(Record r) throws IOException { - r.deserialize(archive, ""); - } - -} diff --git a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/jute/RecordWriter.java b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/jute/RecordWriter.java deleted file mode 100644 index 0adbd56f5..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/jute/RecordWriter.java +++ /dev/null @@ -1,113 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you 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. - */ - -package org.apache.jute; - -import java.io.DataOutputStream; -import java.io.IOException; -import java.io.OutputStream; -import java.io.UnsupportedEncodingException; -import java.lang.reflect.InvocationTargetException; -import java.lang.reflect.Method; -import java.util.HashMap; - -/** - * Front-end for serializers. Also serves as a factory for serializers. - * - */ -public class RecordWriter { - - private OutputArchive archive; - - static private OutputArchive getBinaryArchive(OutputStream out) { - return new BinaryOutputArchive(new DataOutputStream(out)); - } - - static private OutputArchive getCsvArchive(OutputStream out) - throws IOException { - try { - return new CsvOutputArchive(out); - } catch (UnsupportedEncodingException ex) { - throw new IOException("Unsupported encoding UTF-8"); - } - } - - static private OutputArchive getXmlArchive(OutputStream out) - throws IOException { - return new XmlOutputArchive(out); - } - - static HashMap constructFactory() { - HashMap factory = new HashMap(); - Class[] params = { OutputStream.class }; - try { - factory.put("binary", - BinaryOutputArchive.class.getDeclaredMethod( - "getArchive", params)); - factory.put("csv", - CsvOutputArchive.class.getDeclaredMethod( - "getArchive", params)); - factory.put("xml", - XmlOutputArchive.class.getDeclaredMethod( - "getArchive", params)); - } catch (SecurityException ex) { - ex.printStackTrace(); - } catch (NoSuchMethodException ex) { - ex.printStackTrace(); - } - return factory; - } - - static private HashMap archiveFactory = constructFactory(); - - static private OutputArchive createArchive(OutputStream out, - String format) - throws IOException { - Method factory = (Method) archiveFactory.get(format); - if (factory != null) { - Object[] params = { out }; - try { - return (OutputArchive) factory.invoke(null, params); - } catch (IllegalArgumentException ex) { - ex.printStackTrace(); - } catch (InvocationTargetException ex) { - ex.printStackTrace(); - } catch (IllegalAccessException ex) { - ex.printStackTrace(); - } - } - return null; - } - /** - * Creates a new instance of RecordWriter - * @param out Output stream where the records will be serialized - * @param format Serialization format ("binary", "xml", or "csv") - */ - public RecordWriter(OutputStream out, String format) - throws IOException { - archive = createArchive(out, format); - } - - /** - * Serialize a record - * @param r record to be serialized - */ - public void write(Record r) throws IOException { - r.serialize(archive, ""); - } -} diff --git a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/jute/Utils.java b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/jute/Utils.java deleted file mode 100644 index 243f2c8b0..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/jute/Utils.java +++ /dev/null @@ -1,282 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you 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. - */ - -package org.apache.jute; - -import java.io.ByteArrayOutputStream; -import java.io.IOException; - -/** - * Various utility functions for Hadoop record I/O runtime. - */ -public class Utils { - - /** Cannot create a new instance of Utils */ - private Utils() { - super(); - } - - /** - * equals function that actually compares two buffers. - * - * @param onearray First buffer - * @param twoarray Second buffer - * @return true if one and two contain exactly the same content, else false. - */ - public static boolean bufEquals(byte onearray[], byte twoarray[] ) { - if (onearray == twoarray) return true; - boolean ret = (onearray.length == twoarray.length); - if (!ret) { - return ret; - } - for (int idx = 0; idx < onearray.length; idx++) { - if (onearray[idx] != twoarray[idx]) { - return false; - } - } - return true; - } - - private static final char[] hexchars = { '0', '1', '2', '3', '4', '5', - '6', '7', '8', '9', 'A', 'B', - 'C', 'D', 'E', 'F' }; - /** - * - * @param s - * @return - */ - static String toXMLString(String s) { - if (s == null) - return ""; - - StringBuilder sb = new StringBuilder(); - for (int idx = 0; idx < s.length(); idx++) { - char ch = s.charAt(idx); - if (ch == '<') { - sb.append("<"); - } else if (ch == '&') { - sb.append("&"); - } else if (ch == '%') { - sb.append("%25"); - } else if (ch < 0x20) { - sb.append("%"); - sb.append(hexchars[ch/16]); - sb.append(hexchars[ch%16]); - } else { - sb.append(ch); - } - } - return sb.toString(); - } - - static private int h2c(char ch) { - if (ch >= '0' && ch <= '9') { - return ch - '0'; - } else if (ch >= 'A' && ch <= 'F') { - return ch - 'A'; - } else if (ch >= 'a' && ch <= 'f') { - return ch - 'a'; - } - return 0; - } - - /** - * - * @param s - * @return - */ - static String fromXMLString(String s) { - StringBuilder sb = new StringBuilder(); - for (int idx = 0; idx < s.length();) { - char ch = s.charAt(idx++); - if (ch == '%') { - char ch1 = s.charAt(idx++); - char ch2 = s.charAt(idx++); - char res = (char)(h2c(ch1)*16 + h2c(ch2)); - sb.append(res); - } else { - sb.append(ch); - } - } - - return sb.toString(); - } - - /** - * - * @param s - * @return - */ - static String toCSVString(String s) { - if (s == null) - return ""; - - StringBuilder sb = new StringBuilder(s.length()+1); - sb.append('\''); - int len = s.length(); - for (int i = 0; i < len; i++) { - char c = s.charAt(i); - switch(c) { - case '\0': - sb.append("%00"); - break; - case '\n': - sb.append("%0A"); - break; - case '\r': - sb.append("%0D"); - break; - case ',': - sb.append("%2C"); - break; - case '}': - sb.append("%7D"); - break; - case '%': - sb.append("%25"); - break; - default: - sb.append(c); - } - } - return sb.toString(); - } - - /** - * - * @param s - * @throws java.io.IOException - * @return - */ - static String fromCSVString(String s) throws IOException { - if (s.charAt(0) != '\'') { - throw new IOException("Error deserializing string."); - } - int len = s.length(); - StringBuilder sb = new StringBuilder(len-1); - for (int i = 1; i < len; i++) { - char c = s.charAt(i); - if (c == '%') { - char ch1 = s.charAt(i+1); - char ch2 = s.charAt(i+2); - i += 2; - if (ch1 == '0' && ch2 == '0') { sb.append('\0'); } - else if (ch1 == '0' && ch2 == 'A') { sb.append('\n'); } - else if (ch1 == '0' && ch2 == 'D') { sb.append('\r'); } - else if (ch1 == '2' && ch2 == 'C') { sb.append(','); } - else if (ch1 == '7' && ch2 == 'D') { sb.append('}'); } - else if (ch1 == '2' && ch2 == '5') { sb.append('%'); } - else {throw new IOException("Error deserializing string.");} - } else { - sb.append(c); - } - } - return sb.toString(); - } - - /** - * - * @param s - * @return - */ - static String toXMLBuffer(byte barr[]) { - if (barr == null || barr.length == 0) { - return ""; - } - StringBuilder sb = new StringBuilder(2*barr.length); - for (int idx = 0; idx < barr.length; idx++) { - sb.append(Integer.toHexString(barr[idx])); - } - return sb.toString(); - } - - /** - * - * @param s - * @throws java.io.IOException - * @return - */ - static byte[] fromXMLBuffer(String s) - throws IOException { - ByteArrayOutputStream stream = new ByteArrayOutputStream(); - if (s.length() == 0) { return stream.toByteArray(); } - int blen = s.length()/2; - byte[] barr = new byte[blen]; - for (int idx = 0; idx < blen; idx++) { - char c1 = s.charAt(2*idx); - char c2 = s.charAt(2*idx+1); - barr[idx] = Byte.parseByte(""+c1+c2, 16); - } - stream.write(barr); - return stream.toByteArray(); - } - - /** - * - * @param buf - * @return - */ - static String toCSVBuffer(byte barr[]) { - if (barr == null || barr.length == 0) { - return ""; - } - StringBuilder sb = new StringBuilder(barr.length + 1); - sb.append('#'); - for(int idx = 0; idx < barr.length; idx++) { - sb.append(Integer.toHexString(barr[idx])); - } - return sb.toString(); - } - - /** - * Converts a CSV-serialized representation of buffer to a new - * ByteArrayOutputStream. - * @param s CSV-serialized representation of buffer - * @throws java.io.IOException - * @return Deserialized ByteArrayOutputStream - */ - static byte[] fromCSVBuffer(String s) - throws IOException { - if (s.charAt(0) != '#') { - throw new IOException("Error deserializing buffer."); - } - ByteArrayOutputStream stream = new ByteArrayOutputStream(); - if (s.length() == 1) { return stream.toByteArray(); } - int blen = (s.length()-1)/2; - byte[] barr = new byte[blen]; - for (int idx = 0; idx < blen; idx++) { - char c1 = s.charAt(2*idx+1); - char c2 = s.charAt(2*idx+2); - barr[idx] = Byte.parseByte(""+c1+c2, 16); - } - stream.write(barr); - return stream.toByteArray(); - } - public static int compareBytes(byte b1[], int off1, int len1, byte b2[], int off2, int len2) { - int i; - for(i=0; i < len1 && i < len2; i++) { - if (b1[off1+i] != b2[off2+i]) { - return b1[off1+i] < b2[off2+1] ? -1 : 1; - } - } - if (len1 != len2) { - return len1 < len2 ? -1 : 1; - } - return 0; - } -} diff --git a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/jute/XmlInputArchive.java b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/jute/XmlInputArchive.java deleted file mode 100644 index 99e11d10e..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/jute/XmlInputArchive.java +++ /dev/null @@ -1,251 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you 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. - */ - -package org.apache.jute; - -import java.io.IOException; -import java.io.InputStream; -import java.util.ArrayList; - -import javax.xml.parsers.ParserConfigurationException; -import javax.xml.parsers.SAXParser; -import javax.xml.parsers.SAXParserFactory; - -import org.xml.sax.Attributes; -import org.xml.sax.SAXException; -import org.xml.sax.helpers.DefaultHandler; -/** - * - */ -class XmlInputArchive implements InputArchive { - - static private class Value { - private String type; - private StringBuffer sb; - - public Value(String t) { - type = t; - sb = new StringBuffer(); - } - public void addChars(char[] buf, int offset, int len) { - sb.append(buf, offset, len); - } - public String getValue() { return sb.toString(); } - public String getType() { return type; } - } - - private static class XMLParser extends DefaultHandler { - private boolean charsValid = false; - - private ArrayList valList; - - private XMLParser(ArrayList vlist) { - valList = vlist; - } - - public void startDocument() throws SAXException {} - - public void endDocument() throws SAXException {} - - public void startElement(String ns, - String sname, - String qname, - Attributes attrs) throws SAXException { - charsValid = false; - if ("boolean".equals(qname) || - "i4".equals(qname) || - "int".equals(qname) || - "string".equals(qname) || - "double".equals(qname) || - "ex:i1".equals(qname) || - "ex:i8".equals(qname) || - "ex:float".equals(qname)) { - charsValid = true; - valList.add(new Value(qname)); - } else if ("struct".equals(qname) || - "array".equals(qname)) { - valList.add(new Value(qname)); - } - } - - public void endElement(String ns, - String sname, - String qname) throws SAXException { - charsValid = false; - if ("struct".equals(qname) || - "array".equals(qname)) { - valList.add(new Value("/"+qname)); - } - } - - public void characters(char buf[], int offset, int len) - throws SAXException { - if (charsValid) { - Value v = valList.get(valList.size()-1); - v.addChars(buf, offset,len); - } - } - - } - - private class XmlIndex implements Index { - public boolean done() { - Value v = valList.get(vIdx); - if ("/array".equals(v.getType())) { - valList.set(vIdx, null); - vIdx++; - return true; - } else { - return false; - } - } - public void incr() {} - } - - private ArrayList valList; - private int vLen; - private int vIdx; - - private Value next() throws IOException { - if (vIdx < vLen) { - Value v = valList.get(vIdx); - valList.set(vIdx, null); - vIdx++; - return v; - } else { - throw new IOException("Error in deserialization."); - } - } - - static XmlInputArchive getArchive(InputStream strm) - throws ParserConfigurationException, SAXException, IOException { - return new XmlInputArchive(strm); - } - - /** Creates a new instance of BinaryInputArchive */ - public XmlInputArchive(InputStream in) - throws ParserConfigurationException, SAXException, IOException { - valList = new ArrayList(); - DefaultHandler handler = new XMLParser(valList); - SAXParserFactory factory = SAXParserFactory.newInstance(); - SAXParser parser = factory.newSAXParser(); - parser.parse(in, handler); - vLen = valList.size(); - vIdx = 0; - } - - public byte readByte(String tag) throws IOException { - Value v = next(); - if (!"ex:i1".equals(v.getType())) { - throw new IOException("Error deserializing "+tag+"."); - } - return Byte.parseByte(v.getValue()); - } - - public boolean readBool(String tag) throws IOException { - Value v = next(); - if (!"boolean".equals(v.getType())) { - throw new IOException("Error deserializing "+tag+"."); - } - return "1".equals(v.getValue()); - } - - public int readInt(String tag) throws IOException { - Value v = next(); - if (!"i4".equals(v.getType()) && - !"int".equals(v.getType())) { - throw new IOException("Error deserializing "+tag+"."); - } - return Integer.parseInt(v.getValue()); - } - - public long readLong(String tag) throws IOException { - Value v = next(); - if (!"ex:i8".equals(v.getType())) { - throw new IOException("Error deserializing "+tag+"."); - } - return Long.parseLong(v.getValue()); - } - - public float readFloat(String tag) throws IOException { - Value v = next(); - if (!"ex:float".equals(v.getType())) { - throw new IOException("Error deserializing "+tag+"."); - } - return Float.parseFloat(v.getValue()); - } - - public double readDouble(String tag) throws IOException { - Value v = next(); - if (!"double".equals(v.getType())) { - throw new IOException("Error deserializing "+tag+"."); - } - return Double.parseDouble(v.getValue()); - } - - public String readString(String tag) throws IOException { - Value v = next(); - if (!"string".equals(v.getType())) { - throw new IOException("Error deserializing "+tag+"."); - } - return Utils.fromXMLString(v.getValue()); - } - - public byte[] readBuffer(String tag) throws IOException { - Value v = next(); - if (!"string".equals(v.getType())) { - throw new IOException("Error deserializing "+tag+"."); - } - return Utils.fromXMLBuffer(v.getValue()); - } - - public void readRecord(Record r, String tag) throws IOException { - r.deserialize(this, tag); - } - - public void startRecord(String tag) throws IOException { - Value v = next(); - if (!"struct".equals(v.getType())) { - throw new IOException("Error deserializing "+tag+"."); - } - } - - public void endRecord(String tag) throws IOException { - Value v = next(); - if (!"/struct".equals(v.getType())) { - throw new IOException("Error deserializing "+tag+"."); - } - } - - public Index startVector(String tag) throws IOException { - Value v = next(); - if (!"array".equals(v.getType())) { - throw new IOException("Error deserializing "+tag+"."); - } - return new XmlIndex(); - } - - public void endVector(String tag) throws IOException {} - - public Index startMap(String tag) throws IOException { - return startVector(tag); - } - - public void endMap(String tag) throws IOException { endVector(tag); } - -} diff --git a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/jute/XmlOutputArchive.java b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/jute/XmlOutputArchive.java deleted file mode 100644 index b65e9a000..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/jute/XmlOutputArchive.java +++ /dev/null @@ -1,251 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you 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. - */ - -package org.apache.jute; - -import java.io.IOException; -import java.io.OutputStream; -import java.io.PrintStream; -import java.util.List; -import java.util.Stack; -import java.util.TreeMap; - -/** - * - */ -class XmlOutputArchive implements OutputArchive { - - private PrintStream stream; - - private int indent = 0; - - private Stack compoundStack; - - private void putIndent() { - StringBuilder sb = new StringBuilder(""); - for (int idx = 0; idx < indent; idx++) { - sb.append(" "); - } - stream.print(sb.toString()); - } - - private void addIndent() { - indent++; - } - - private void closeIndent() { - indent--; - } - - private void printBeginEnvelope(String tag) { - if (!compoundStack.empty()) { - String s = compoundStack.peek(); - if ("struct".equals(s)) { - putIndent(); - stream.print("\n"); - addIndent(); - putIndent(); - stream.print(""+tag+"\n"); - putIndent(); - stream.print(""); - } else if ("vector".equals(s)) { - stream.print(""); - } else if ("map".equals(s)) { - stream.print(""); - } - } else { - stream.print(""); - } - } - - private void printEndEnvelope(String tag) { - if (!compoundStack.empty()) { - String s = compoundStack.peek(); - if ("struct".equals(s)) { - stream.print("\n"); - closeIndent(); - putIndent(); - stream.print("\n"); - } else if ("vector".equals(s)) { - stream.print("\n"); - } else if ("map".equals(s)) { - stream.print("\n"); - } - } else { - stream.print("\n"); - } - } - - private void insideVector(String tag) { - printBeginEnvelope(tag); - compoundStack.push("vector"); - } - - private void outsideVector(String tag) throws IOException { - String s = compoundStack.pop(); - if (!"vector".equals(s)) { - throw new IOException("Error serializing vector."); - } - printEndEnvelope(tag); - } - - private void insideMap(String tag) { - printBeginEnvelope(tag); - compoundStack.push("map"); - } - - private void outsideMap(String tag) throws IOException { - String s = compoundStack.pop(); - if (!"map".equals(s)) { - throw new IOException("Error serializing map."); - } - printEndEnvelope(tag); - } - - private void insideRecord(String tag) { - printBeginEnvelope(tag); - compoundStack.push("struct"); - } - - private void outsideRecord(String tag) throws IOException { - String s = compoundStack.pop(); - if (!"struct".equals(s)) { - throw new IOException("Error serializing record."); - } - printEndEnvelope(tag); - } - - static XmlOutputArchive getArchive(OutputStream strm) { - return new XmlOutputArchive(strm); - } - - /** Creates a new instance of XmlOutputArchive */ - public XmlOutputArchive(OutputStream out) { - stream = new PrintStream(out); - compoundStack = new Stack(); - } - - public void writeByte(byte b, String tag) throws IOException { - printBeginEnvelope(tag); - stream.print(""); - stream.print(Byte.toString(b)); - stream.print(""); - printEndEnvelope(tag); - } - - public void writeBool(boolean b, String tag) throws IOException { - printBeginEnvelope(tag); - stream.print(""); - stream.print(b ? "1" : "0"); - stream.print(""); - printEndEnvelope(tag); - } - - public void writeInt(int i, String tag) throws IOException { - printBeginEnvelope(tag); - stream.print(""); - stream.print(Integer.toString(i)); - stream.print(""); - printEndEnvelope(tag); - } - - public void writeLong(long l, String tag) throws IOException { - printBeginEnvelope(tag); - stream.print(""); - stream.print(Long.toString(l)); - stream.print(""); - printEndEnvelope(tag); - } - - public void writeFloat(float f, String tag) throws IOException { - printBeginEnvelope(tag); - stream.print(""); - stream.print(Float.toString(f)); - stream.print(""); - printEndEnvelope(tag); - } - - public void writeDouble(double d, String tag) throws IOException { - printBeginEnvelope(tag); - stream.print(""); - stream.print(Double.toString(d)); - stream.print(""); - printEndEnvelope(tag); - } - - public void writeString(String s, String tag) throws IOException { - printBeginEnvelope(tag); - stream.print(""); - stream.print(Utils.toXMLString(s)); - stream.print(""); - printEndEnvelope(tag); - } - - public void writeBuffer(byte buf[], String tag) - throws IOException { - printBeginEnvelope(tag); - stream.print(""); - stream.print(Utils.toXMLBuffer(buf)); - stream.print(""); - printEndEnvelope(tag); - } - - public void writeRecord(Record r, String tag) throws IOException { - r.serialize(this, tag); - } - - public void startRecord(Record r, String tag) throws IOException { - insideRecord(tag); - stream.print("\n"); - addIndent(); - } - - public void endRecord(Record r, String tag) throws IOException { - closeIndent(); - putIndent(); - stream.print(""); - outsideRecord(tag); - } - - public void startVector(List v, String tag) throws IOException { - insideVector(tag); - stream.print("\n"); - addIndent(); - } - - public void endVector(List v, String tag) throws IOException { - closeIndent(); - putIndent(); - stream.print(""); - outsideVector(tag); - } - - public void startMap(TreeMap v, String tag) throws IOException { - insideMap(tag); - stream.print("\n"); - addIndent(); - } - - public void endMap(TreeMap v, String tag) throws IOException { - closeIndent(); - putIndent(); - stream.print(""); - outsideMap(tag); - } - -} diff --git a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/jute/compiler/CGenerator.java b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/jute/compiler/CGenerator.java deleted file mode 100644 index 4bfdcadc9..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/jute/compiler/CGenerator.java +++ /dev/null @@ -1,130 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you 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. - */ - -package org.apache.jute.compiler; - -import java.util.ArrayList; -import java.io.File; -import java.io.FileWriter; -import java.io.IOException; -import java.util.Iterator; - -/** - * C++ Code generator front-end for Hadoop record I/O. - */ -class CGenerator { - private String mName; - private ArrayList mInclFiles; - private ArrayList mRecList; - private final File outputDirectory; - - /** Creates a new instance of CppGenerator - * - * @param name possibly full pathname to the file - * @param ilist included files (as JFile) - * @param rlist List of records defined within this file - * @param outputDirectory - */ - CGenerator(String name, ArrayList ilist, ArrayList rlist, - File outputDirectory) - { - this.outputDirectory = outputDirectory; - mName = (new File(name)).getName(); - mInclFiles = ilist; - mRecList = rlist; - } - - /** - * Generate C++ code. This method only creates the requested file(s) - * and spits-out file-level elements (such as include statements etc.) - * record-level code is generated by JRecord. - */ - void genCode() throws IOException { - if (!outputDirectory.exists()) { - if (!outputDirectory.mkdirs()) { - throw new IOException("unable to create output directory " - + outputDirectory); - } - } - FileWriter c = new FileWriter(new File(outputDirectory, mName+".c")); - FileWriter h = new FileWriter(new File(outputDirectory, mName+".h")); - - h.write("/**\n"); - h.write("* Licensed to the Apache Software Foundation (ASF) under one\n"); - h.write("* or more contributor license agreements. See the NOTICE file\n"); - h.write("* distributed with this work for additional information\n"); - h.write("* regarding copyright ownership. The ASF licenses this file\n"); - h.write("* to you under the Apache License, Version 2.0 (the\n"); - h.write("* \"License\"); you may not use this file except in compliance\n"); - h.write("* with the License. You may obtain a copy of the License at\n"); - h.write("*\n"); - h.write("* http://www.apache.org/licenses/LICENSE-2.0\n"); - h.write("*\n"); - h.write("* Unless required by applicable law or agreed to in writing, software\n"); - h.write("* distributed under the License is distributed on an \"AS IS\" BASIS,\n"); - h.write("* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n"); - h.write("* See the License for the specific language governing permissions and\n"); - h.write("* limitations under the License.\n"); - h.write("*/\n"); - h.write("\n"); - - c.write("/**\n"); - c.write("* Licensed to the Apache Software Foundation (ASF) under one\n"); - c.write("* or more contributor license agreements. See the NOTICE file\n"); - c.write("* distributed with this work for additional information\n"); - c.write("* regarding copyright ownership. The ASF licenses this file\n"); - c.write("* to you under the Apache License, Version 2.0 (the\n"); - c.write("* \"License\"); you may not use this file except in compliance\n"); - c.write("* with the License. You may obtain a copy of the License at\n"); - c.write("*\n"); - c.write("* http://www.apache.org/licenses/LICENSE-2.0\n"); - c.write("*\n"); - c.write("* Unless required by applicable law or agreed to in writing, software\n"); - c.write("* distributed under the License is distributed on an \"AS IS\" BASIS,\n"); - c.write("* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n"); - c.write("* See the License for the specific language governing permissions and\n"); - c.write("* limitations under the License.\n"); - c.write("*/\n"); - c.write("\n"); - - h.write("#ifndef __"+mName.toUpperCase().replace('.','_')+"__\n"); - h.write("#define __"+mName.toUpperCase().replace('.','_')+"__\n"); - - h.write("#include \"recordio.h\"\n"); - for (Iterator i = mInclFiles.iterator(); i.hasNext();) { - JFile f = i.next(); - h.write("#include \""+f.getName()+".h\"\n"); - } - // required for compilation from C++ - h.write("\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n"); - - c.write("#include \n"); // need it for calloc() & free() - c.write("#include \""+mName+".h\"\n\n"); - - for (Iterator i = mRecList.iterator(); i.hasNext();) { - JRecord jr = i.next(); - jr.genCCode(h, c); - } - - h.write("\n#ifdef __cplusplus\n}\n#endif\n\n"); - h.write("#endif //"+mName.toUpperCase().replace('.','_')+"__\n"); - - h.close(); - c.close(); - } -} diff --git a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/jute/compiler/CSharpGenerator.java b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/jute/compiler/CSharpGenerator.java deleted file mode 100644 index c28751d00..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/jute/compiler/CSharpGenerator.java +++ /dev/null @@ -1,53 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you 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. - */ - -package org.apache.jute.compiler; - -import java.io.File; -import java.io.IOException; -import java.util.ArrayList; - -public class CSharpGenerator { - private ArrayList mRecList; - private final File outputDirectory; - - /** Creates a new instance of CSharpGenerator - * - * @param name possibly full pathname to the file - * @param ilist included files (as JFile) - * @param rlist List of records defined within this file - * @param outputDirectory - */ - CSharpGenerator(String name, ArrayList ilist, ArrayList rlist, - File outputDirectory) - { - this.outputDirectory = outputDirectory; - mRecList = rlist; - } - - /** - * Generate C# code. This method only creates the requested file(s) - * and spits-out file-level elements (such as include statements etc.) - * record-level code is generated by JRecord. - */ - void genCode() throws IOException { - for (JRecord rec : mRecList) { - rec.genCsharpCode(outputDirectory); - } - } -} diff --git a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/jute/compiler/CppGenerator.java b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/jute/compiler/CppGenerator.java deleted file mode 100644 index 16d44ce0e..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/jute/compiler/CppGenerator.java +++ /dev/null @@ -1,125 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you 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. - */ - -package org.apache.jute.compiler; - -import java.util.ArrayList; -import java.io.File; -import java.io.FileWriter; -import java.io.IOException; -import java.util.Iterator; - -/** - * C++ Code generator front-end for Hadoop record I/O. - */ -class CppGenerator { - private String mName; - private ArrayList mInclFiles; - private ArrayList mRecList; - private final File outputDirectory; - - /** Creates a new instance of CppGenerator - * - * @param name possibly full pathname to the file - * @param ilist included files (as JFile) - * @param rlist List of records defined within this file - * @param outputDirectory - */ - CppGenerator(String name, ArrayList ilist, ArrayList rlist, - File outputDirectory) - { - this.outputDirectory = outputDirectory; - mName = (new File(name)).getName(); - mInclFiles = ilist; - mRecList = rlist; - } - - /** - * Generate C++ code. This method only creates the requested file(s) - * and spits-out file-level elements (such as include statements etc.) - * record-level code is generated by JRecord. - */ - void genCode() throws IOException { - if (!outputDirectory.exists()) { - if (!outputDirectory.mkdirs()) { - throw new IOException("unable to create output directory " - + outputDirectory); - } - } - FileWriter cc = new FileWriter(new File(outputDirectory, mName+".cc")); - FileWriter hh = new FileWriter(new File(outputDirectory, mName+".hh")); - - hh.write("/**\n"); - hh.write("* Licensed to the Apache Software Foundation (ASF) under one\n"); - hh.write("* or more contributor license agreements. See the NOTICE file\n"); - hh.write("* distributed with this work for additional information\n"); - hh.write("* regarding copyright ownership. The ASF licenses this file\n"); - hh.write("* to you under the Apache License, Version 2.0 (the\n"); - hh.write("* \"License\"); you may not use this file except in compliance\n"); - hh.write("* with the License. You may obtain a copy of the License at\n"); - hh.write("*\n"); - hh.write("* http://www.apache.org/licenses/LICENSE-2.0\n"); - hh.write("*\n"); - hh.write("* Unless required by applicable law or agreed to in writing, software\n"); - hh.write("* distributed under the License is distributed on an \"AS IS\" BASIS,\n"); - hh.write("* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n"); - hh.write("* See the License for the specific language governing permissions and\n"); - hh.write("* limitations under the License.\n"); - hh.write("*/\n"); - hh.write("\n"); - - cc.write("/**\n"); - cc.write("* Licensed to the Apache Software Foundation (ASF) under one\n"); - cc.write("* or more contributor license agreements. See the NOTICE file\n"); - cc.write("* distributed with this work for additional information\n"); - cc.write("* regarding copyright ownership. The ASF licenses this file\n"); - cc.write("* to you under the Apache License, Version 2.0 (the\n"); - cc.write("* \"License\"); you may not use this file except in compliance\n"); - cc.write("* with the License. You may obtain a copy of the License at\n"); - cc.write("*\n"); - cc.write("* http://www.apache.org/licenses/LICENSE-2.0\n"); - cc.write("*\n"); - cc.write("* Unless required by applicable law or agreed to in writing, software\n"); - cc.write("* distributed under the License is distributed on an \"AS IS\" BASIS,\n"); - cc.write("* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n"); - cc.write("* See the License for the specific language governing permissions and\n"); - cc.write("* limitations under the License.\n"); - cc.write("*/\n"); - cc.write("\n"); - - hh.write("#ifndef __"+mName.toUpperCase().replace('.','_')+"__\n"); - hh.write("#define __"+mName.toUpperCase().replace('.','_')+"__\n"); - - hh.write("#include \"recordio.hh\"\n"); - for (Iterator i = mInclFiles.iterator(); i.hasNext();) { - JFile f = i.next(); - hh.write("#include \""+f.getName()+".hh\"\n"); - } - cc.write("#include \""+mName+".hh\"\n"); - - for (Iterator i = mRecList.iterator(); i.hasNext();) { - JRecord jr = i.next(); - jr.genCppCode(hh, cc); - } - - hh.write("#endif //"+mName.toUpperCase().replace('.','_')+"__\n"); - - hh.close(); - cc.close(); - } -} diff --git a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/jute/compiler/JBoolean.java b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/jute/compiler/JBoolean.java deleted file mode 100644 index b45b161e3..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/jute/compiler/JBoolean.java +++ /dev/null @@ -1,50 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you 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. - */ - -package org.apache.jute.compiler; - -/** - * - */ -public class JBoolean extends JType { - - /** Creates a new instance of JBoolean */ - public JBoolean() { - super("int32_t", "bool", "bool", "boolean", "Bool", "Boolean", "bool", "toBoolean"); - } - - public String getSignature() { - return "z"; - } - - public String genJavaCompareTo(String fname) { - return " ret = ("+fname+" == peer."+fname+")? 0 : ("+fname+"?1:-1);\n"; - } - - public String genJavaHashCode(String fname) { - return " ret = ("+fname+")?0:1;\n"; - } - - String genCsharpHashCode(String fname) { - return " ret = ("+capitalize(fname)+")?0:1;\n"; - } - - String genCsharpCompareTo(String name) { - return " ret = ("+capitalize(name)+" == peer."+capitalize(name)+")? 0 : ("+capitalize(name)+"?1:-1);\n"; - } -} diff --git a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/jute/compiler/JBuffer.java b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/jute/compiler/JBuffer.java deleted file mode 100644 index b2be5bd06..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/jute/compiler/JBuffer.java +++ /dev/null @@ -1,106 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you 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. - */ - -package org.apache.jute.compiler; - -/** - * - */ -public class JBuffer extends JCompType { - - /** Creates a new instance of JBuffer */ - public JBuffer() { - super("struct buffer", " ::std::string", "byte[]", "byte[]", "Buffer", "byte[]", "byte[]"); - } - - public String genCppGetSet(String fname, int fIdx) { - String cgetFunc = " virtual const "+getCppType()+"& get"+fname+"() const {\n"; - cgetFunc += " return m"+fname+";\n"; - cgetFunc += " }\n"; - String getFunc = " virtual "+getCppType()+"& get"+fname+"() {\n"; - getFunc += " bs_.set("+fIdx+");return m"+fname+";\n"; - getFunc += " }\n"; - return cgetFunc + getFunc; - } - - public String getSignature() { - return "B"; - } - - public String genJavaReadWrapper(String fname, String tag, boolean decl) { - String ret = ""; - if (decl) { - ret = " byte[] "+fname+";\n"; - } - return ret + " "+fname+"=a_.readBuffer(\""+tag+"\");\n"; - } - - public String genJavaWriteWrapper(String fname, String tag) { - return " a_.writeBuffer("+fname+",\""+tag+"\");\n"; - } - - public String genJavaCompareTo(String fname, String other) { - StringBuilder sb = new StringBuilder(); - sb.append(" {\n"); - sb.append(" byte[] my = "+fname+";\n"); - sb.append(" byte[] ur = "+other+";\n"); - sb.append(" ret = org.apache.jute.Utils.compareBytes(my,0,my.length,ur,0,ur.length);\n"); - sb.append(" }\n"); - return sb.toString(); - } - - public String genJavaCompareTo(String fname) { - return genJavaCompareTo(fname, "peer."+fname); - } - public String genJavaCompareToWrapper(String fname, String other) { - return " "+genJavaCompareTo(fname, other); - } - - public String genJavaEquals(String fname, String peer) { - return " ret = org.apache.jute.Utils.bufEquals("+fname+","+peer+");\n"; - } - - public String genJavaHashCode(String fname) { - return " ret = java.util.Arrays.toString("+fname+").hashCode();\n"; - } - - public String genJavaSlurpBytes(String b, String s, String l) { - StringBuilder sb = new StringBuilder(); - sb.append(" {\n"); - sb.append(" int i = org.apache.jute.Utils.readVInt("+b+", "+s+");\n"); - sb.append(" int z = WritableUtils.getVIntSize(i);\n"); - sb.append(" "+s+" += z+i; "+l+" -= (z+i);\n"); - sb.append(" }\n"); - return sb.toString(); - } - - public String genJavaCompareBytes() { - StringBuilder sb = new StringBuilder(); - sb.append(" {\n"); - sb.append(" int i1 = org.apache.jute.Utils.readVInt(b1, s1);\n"); - sb.append(" int i2 = org.apache.jute.Utils.readVInt(b2, s2);\n"); - sb.append(" int z1 = WritableUtils.getVIntSize(i1);\n"); - sb.append(" int z2 = WritableUtils.getVIntSize(i2);\n"); - sb.append(" s1+=z1; s2+=z2; l1-=z1; l2-=z2;\n"); - sb.append(" int r1 = org.apache.jute.Utils.compareBytes(b1,s1,l1,b2,s2,l2);\n"); - sb.append(" if (r1 != 0) { return (r1<0)?-1:0; }\n"); - sb.append(" s1+=i1; s2+=i2; l1-=i1; l1-=i2;\n"); - sb.append(" }\n"); - return sb.toString(); - } -} diff --git a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/jute/compiler/JByte.java b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/jute/compiler/JByte.java deleted file mode 100644 index 4b1cea459..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/jute/compiler/JByte.java +++ /dev/null @@ -1,34 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you 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. - */ - -package org.apache.jute.compiler; - -/** - * - */ -public class JByte extends JType { - - /** Creates a new instance of JByte */ - public JByte() { - super("char", "int8_t", "byte", "byte", "Byte", "Byte", "byte", "toByte"); - } - - public String getSignature() { - return "b"; - } -} diff --git a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/jute/compiler/JCompType.java b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/jute/compiler/JCompType.java deleted file mode 100644 index d98658fcf..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/jute/compiler/JCompType.java +++ /dev/null @@ -1,66 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you 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. - */ - -package org.apache.jute.compiler; - -/** - * Abstract base class for all the "compound" types such as ustring, - * buffer, vector, map, and record. - */ -abstract class JCompType extends JType { - - /** Creates a new instance of JCompType */ - JCompType(String cType, String cppType, String csharpType, String javaType, String suffix, String wrapper, String csharpWrapper) { - super(cType, cppType, csharpType, javaType, suffix, wrapper, csharpWrapper, null); - } - - String genCppGetSet(String fname, int fIdx) { - String cgetFunc = " virtual const "+getCppType()+"& get"+fname+"() const {\n"; - cgetFunc += " return m"+fname+";\n"; - cgetFunc += " }\n"; - String getFunc = " virtual "+getCppType()+"& get"+fname+"() {\n"; - getFunc += " bs_.set("+fIdx+");return m"+fname+";\n"; - getFunc += " }\n"; - return cgetFunc + getFunc; - } - - String genJavaCompareTo(String fname) { - return " ret = "+fname+".compareTo(peer."+fname+");\n"; - } - - String genJavaEquals(String fname, String peer) { - return " ret = "+fname+".equals("+peer+");\n"; - } - - String genJavaHashCode(String fname) { - return " ret = "+fname+".hashCode();\n"; - } - - String genCsharpHashCode(String fname) { - return " ret = "+capitalize(fname)+".GetHashCode();\n"; - } - - String genCsharpEquals(String name, String peer) { - String[] peerSplit = peer.split("\\."); - return " ret = "+capitalize(name)+".Equals("+peerSplit[0] + "." + capitalize(peerSplit[1]) + ");\n"; - } - - String genCsharpCompareTo(String name) { - return " ret = "+capitalize(name)+".CompareTo(peer."+capitalize(name)+");\n"; - } -} diff --git a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/jute/compiler/JDouble.java b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/jute/compiler/JDouble.java deleted file mode 100644 index 21f9cc856..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/jute/compiler/JDouble.java +++ /dev/null @@ -1,40 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you 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. - */ - -package org.apache.jute.compiler; - -/** - * - */ -public class JDouble extends JType { - - /** Creates a new instance of JDouble */ - public JDouble() { - super("double", "double", "double", "double", "Double", "Double", "double", "toDouble"); - } - - public String getSignature() { - return "d"; - } - - public String genJavaHashCode(String fname) { - String tmp = "Double.doubleToLongBits("+fname+")"; - return " ret = (int)("+tmp+"^("+tmp+">>>32));\n"; - } - -} diff --git a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/jute/compiler/JField.java b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/jute/compiler/JField.java deleted file mode 100644 index 50f9fc9df..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/jute/compiler/JField.java +++ /dev/null @@ -1,140 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you 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. - */ - -package org.apache.jute.compiler; - -/** - * - */ -public class JField { - private JType mType; - private String mName; - /** - * Creates a new instance of JField - */ - public JField(JType type, String name) { - mType = type; - mName = name; - } - - public String getSignature() { - return mType.getSignature(); - } - - public String genCppDecl() { - return mType.genCppDecl(mName); - } - - public String genCDecl() { - return mType.genCDecl(mName); - } - - public String genCsharpDecl() { - return mType.genCsharpDecl(mName); - } - - public String genCsharpConstructorParam(String fname) { - return mType.genCsharpConstructorParam(fname); - } - - public String genJavaDecl() { - return mType.genJavaDecl(mName); - } - - public String genJavaConstructorParam(String fname) { - return mType.genJavaConstructorParam(fname); - } - - public String getName() { - return mName; - } - - public String getCsharpName() { - return "Id".equals(mName) ? "ZKId" : mName; - } - - public String getTag() { - return mName; - } - - public JType getType() { - return mType; - } - - public String genCppGetSet(int fIdx) { - return mType.genCppGetSet(mName, fIdx); - } - - public String genCsharpConstructorSet(String fname) { - return mType.genCsharpConstructorSet(mName, fname); - } - - public String genCsharpGetSet(int fIdx) { - return mType.genCsharpGetSet(getCsharpName(), fIdx); - } - - public String genCsharpWriteMethodName() { - return mType.genCsharpWriteMethod(getCsharpName(), getTag()); - } - - public String genCsharpReadMethodName() { - return mType.genCsharpReadMethod(getCsharpName(), getTag()); - } - - public String genCsharpCompareTo() { - return mType.genCsharpCompareTo(getCsharpName()); - } - - public String genCsharpEquals() { - return mType.genCsharpEquals(getCsharpName(), "peer."+getCsharpName()); - } - - public String genCsharpHashCode() { - return mType.genCsharpHashCode(getCsharpName()); - } - - - public String genJavaGetSet(int fIdx) { - return mType.genJavaGetSet(mName, fIdx); - } - - public String genJavaWriteMethodName() { - return mType.genJavaWriteMethod(getName(), getTag()); - } - - public String genJavaReadMethodName() { - return mType.genJavaReadMethod(getName(), getTag()); - } - - public String genJavaCompareTo() { - return mType.genJavaCompareTo(getName()); - } - - public String genJavaEquals() { - return mType.genJavaEquals(getName(), "peer."+getName()); - } - - public String genJavaHashCode() { - return mType.genJavaHashCode(getName()); - } - - public String genJavaConstructorSet(String fname) { - return mType.genJavaConstructorSet(mName, fname); - } - -} diff --git a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/jute/compiler/JFile.java b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/jute/compiler/JFile.java deleted file mode 100644 index e5b0ba361..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/jute/compiler/JFile.java +++ /dev/null @@ -1,84 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you 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. - */ - -package org.apache.jute.compiler; - -import java.io.File; -import java.io.IOException; -import java.util.ArrayList; - -/** - * Container for the Hadoop Record DDL. - * The main components of the file are filename, list of included files, - * and records defined in that file. - * - */ -public class JFile { - - private String mName; - private ArrayList mInclFiles; - private ArrayList mRecords; - - /** Creates a new instance of JFile - * - * @param name possibly full pathname to the file - * @param inclFiles included files (as JFile) - * @param recList List of records defined within this file - */ - public JFile(String name, ArrayList inclFiles, - ArrayList recList) - { - mName = name; - mInclFiles = inclFiles; - mRecords = recList; - } - - /** Strip the other pathname components and return the basename */ - String getName() { - int idx = mName.lastIndexOf('/'); - return (idx > 0) ? mName.substring(idx) : mName; - } - - /** Generate record code in given language. Language should be all - * lowercase. - * @param outputDirectory - */ - public void genCode(String language, File outputDirectory) - throws IOException - { - if ("c++".equals(language)) { - CppGenerator gen = new CppGenerator(mName, mInclFiles, mRecords, - outputDirectory); - gen.genCode(); - } else if ("java".equals(language)) { - JavaGenerator gen = new JavaGenerator(mName, mInclFiles, mRecords, - outputDirectory); - gen.genCode(); - } else if ("c".equals(language)) { - CGenerator gen = new CGenerator(mName, mInclFiles, mRecords, - outputDirectory); - gen.genCode(); - } else if ("csharp".equals(language)) { - CSharpGenerator gen = new CSharpGenerator(mName, mInclFiles, mRecords, - outputDirectory); - gen.genCode(); - } else { - throw new IOException("Cannnot recognize language:" + language); - } - } -} diff --git a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/jute/compiler/JFloat.java b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/jute/compiler/JFloat.java deleted file mode 100644 index a4be6ec99..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/jute/compiler/JFloat.java +++ /dev/null @@ -1,39 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you 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. - */ - -package org.apache.jute.compiler; - -/** - * - */ -public class JFloat extends JType { - - /** Creates a new instance of JFloat */ - public JFloat() { - super("float", "float", "float", "float", "Float", "Float", "float", "toFloat"); - } - - public String getSignature() { - return "f"; - } - - public String genJavaHashCode(String fname) { - return " ret = Float.floatToIntBits("+fname+");\n"; - } - -} diff --git a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/jute/compiler/JInt.java b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/jute/compiler/JInt.java deleted file mode 100644 index 23b902e27..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/jute/compiler/JInt.java +++ /dev/null @@ -1,34 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you 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. - */ - -package org.apache.jute.compiler; - -/** - * - */ -public class JInt extends JType { - - /** Creates a new instance of JInt */ - public JInt() { - super("int32_t", "int32_t", "int", "int", "Int", "Integer", "int", "toInt"); - } - - public String getSignature() { - return "i"; - } -} diff --git a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/jute/compiler/JLong.java b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/jute/compiler/JLong.java deleted file mode 100644 index 342fd9af5..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/jute/compiler/JLong.java +++ /dev/null @@ -1,38 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you 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. - */ - -package org.apache.jute.compiler; - -/** - * - */ -public class JLong extends JType { - - /** Creates a new instance of JLong */ - public JLong() { - super("int64_t", "int64_t", "long", "long", "Long", "Long", "long", "toLong"); - } - - public String getSignature() { - return "l"; - } - - public String genJavaHashCode(String fname) { - return " ret = (int) ("+fname+"^("+fname+">>>32));\n"; - } -} diff --git a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/jute/compiler/JMap.java b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/jute/compiler/JMap.java deleted file mode 100644 index cc503bebf..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/jute/compiler/JMap.java +++ /dev/null @@ -1,149 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you 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. - */ - -package org.apache.jute.compiler; - -/** - * - */ -public class JMap extends JCompType { - - static private int level = 0; - - static private String getLevel() { return Integer.toString(level); } - - static private void incrLevel() { level++; } - - static private void decrLevel() { level--; } - - static private String getId(String id) { return id+getLevel(); } - - private JType mKey; - private JType mValue; - - /** Creates a new instance of JMap */ - public JMap(JType t1, JType t2) { - super("#error", " ::std::map<"+t1.getCppType()+","+t2.getCppType()+">", - "System.Collections.Generic.SortedDictionary", "java.util.TreeMap", "Map", "System.Collections.Generic.SortedDictionary", "java.util.TreeMap"); - mKey = t1; - mValue = t2; - } - - public String getSignature() { - return "{" + mKey.getSignature() + mValue.getSignature() +"}"; - } - - public String genJavaCompareTo(String fname) { - return " throw new UnsupportedOperationException(\"comparing " - + fname + " is unimplemented\");\n"; - } - - public String genJavaReadWrapper(String fname, String tag, boolean decl) { - StringBuilder ret = new StringBuilder(""); - if (decl) { - ret.append(" java.util.TreeMap "+fname+";\n"); - } - ret.append(" {\n"); - incrLevel(); - ret.append(" org.apache.jute.Index "+getId("midx")+" = a_.startMap(\""+tag+"\");\n"); - ret.append(" "+fname+"=new java.util.TreeMap();\n"); - ret.append(" for (; !"+getId("midx")+".done(); "+getId("midx")+".incr()) {\n"); - ret.append(mKey.genJavaReadWrapper(getId("k"),getId("k"),true)); - ret.append(mValue.genJavaReadWrapper(getId("v"),getId("v"),true)); - ret.append(" "+fname+".put("+getId("k")+","+getId("v")+");\n"); - ret.append(" }\n"); - ret.append(" a_.endMap(\""+tag+"\");\n"); - decrLevel(); - ret.append(" }\n"); - return ret.toString(); - } - - public String genJavaReadMethod(String fname, String tag) { - return genJavaReadWrapper(fname, tag, false); - } - - public String genJavaWriteWrapper(String fname, String tag) { - StringBuilder ret = new StringBuilder(" {\n"); - incrLevel(); - ret.append(" a_.startMap("+fname+",\""+tag+"\");\n"); - ret.append(" java.util.Set "+getId("es")+" = "+fname+".entrySet();\n"); - ret.append(" for(java.util.Iterator "+getId("midx")+" = "+getId("es")+".iterator(); "+getId("midx")+".hasNext(); ) {\n"); - ret.append(" java.util.Map.Entry "+getId("me")+" = (java.util.Map.Entry) "+getId("midx")+".next();\n"); - ret.append(" "+mKey.getJavaWrapperType()+" "+getId("k")+" = ("+mKey.getJavaWrapperType()+") "+getId("me")+".getKey();\n"); - ret.append(" "+mValue.getJavaWrapperType()+" "+getId("v")+" = ("+mValue.getJavaWrapperType()+") "+getId("me")+".getValue();\n"); - ret.append(mKey.genJavaWriteWrapper(getId("k"),getId("k"))); - ret.append(mValue.genJavaWriteWrapper(getId("v"),getId("v"))); - ret.append(" }\n"); - ret.append(" a_.endMap("+fname+",\""+tag+"\");\n"); - ret.append(" }\n"); - decrLevel(); - return ret.toString(); - } - - public String genJavaWriteMethod(String fname, String tag) { - return genJavaWriteWrapper(fname, tag); - } - - public String genCsharpWriteWrapper(String fname, int tag) { - StringBuilder ret = new StringBuilder(" {\n"); - incrLevel(); - ret.append(" a_.StartMap("+fname+",\""+tag+"\");\n"); - ret.append(" java.util.Set "+getId("es")+" = "+fname+".entrySet();\n"); - ret.append(" for(java.util.Iterator "+getId("midx")+" = "+getId("es")+".iterator(); "+getId("midx")+".hasNext(); ) {\n"); - ret.append(" java.util.Map.Entry "+getId("me")+" = (java.util.Map.Entry) "+getId("midx")+".next();\n"); - ret.append(" "+mKey.getCsharpWrapperType()+" "+getId("k")+" = ("+mKey.getCsharpWrapperType()+") "+getId("me")+".getKey();\n"); - ret.append(" "+mValue.getCsharpWrapperType()+" "+getId("v")+" = ("+mValue.getCsharpWrapperType()+") "+getId("me")+".getValue();\n"); - ret.append(mKey.genCsharpWriteWrapper(getId("k"),getId("k"))); - ret.append(mValue.genCsharpWriteWrapper(getId("v"),getId("v"))); - ret.append(" }\n"); - ret.append(" a_.EndMap("+fname+",\""+tag+"\");\n"); - ret.append(" }\n"); - decrLevel(); - return ret.toString(); - } - - String genCsharpWriteMethod(String fname, int tag) { - return genCsharpWriteWrapper(fname, tag); - } - - public String genCsharpReadWrapper(String fname, int tag, boolean decl) { - StringBuilder ret = new StringBuilder(""); - if (decl) { - ret.append(" System.Collections.SortedDictionary "+capitalize(fname)+";\n"); - } - ret.append(" {\n"); - incrLevel(); - ret.append(" Org.Apache.Jute.IIndex "+getId("midx")+" = a_.StartMap(\""+tag+"\");\n"); - ret.append(" "+fname+"= new System.Collections.SortedDictionary();\n"); - ret.append(" for (; !"+getId("midx")+".done(); "+getId("midx")+".incr()) {\n"); - ret.append(mKey.genCsharpReadWrapper(getId("k"),getId("k"),true)); - ret.append(mValue.genCsharpReadWrapper(getId("v"),getId("v"),true)); - ret.append(" "+fname+".Add("+getId("k")+","+getId("v")+");\n"); - ret.append(" }\n"); - ret.append(" a_.EndMap(\""+tag+"\");\n"); - decrLevel(); - ret.append(" }\n"); - return ret.toString(); - } - - - - String genCsharpReadMethod(String fname, int tag) { - return genCsharpReadWrapper(fname, tag, false); - } -} diff --git a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/jute/compiler/JRecord.java b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/jute/compiler/JRecord.java deleted file mode 100644 index 01ba2989a..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/jute/compiler/JRecord.java +++ /dev/null @@ -1,761 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you 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. - */ - -package org.apache.jute.compiler; - -import java.io.File; -import java.io.FileWriter; -import java.io.IOException; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.Iterator; - -/** - * - */ -public class JRecord extends JCompType { - - private String mFQName; - private String mName; - private String mModule; - private ArrayList mFields; - - /** - * Creates a new instance of JRecord - */ - public JRecord(String name, ArrayList flist) { - super("struct " + name.substring(name.lastIndexOf('.')+1), - name.replaceAll("\\.","::"), getCsharpFQName(name), name, "Record", name, getCsharpFQName("IRecord")); - mFQName = name; - int idx = name.lastIndexOf('.'); - mName = name.substring(idx+1); - mModule = name.substring(0, idx); - mFields = flist; - } - - public String getName() { - return mName; - } - - public String getCsharpName() { - return "Id".equals(mName) ? "ZKId" : mName; - } - - public String getJavaFQName() { - return mFQName; - } - - public String getCppFQName() { - return mFQName.replaceAll("\\.", "::"); - } - - public String getJavaPackage() { - return mModule; - } - - public String getCppNameSpace() { - return mModule.replaceAll("\\.", "::"); - } - - public String getCsharpNameSpace() { - String[] parts = mModule.split("\\."); - StringBuffer namespace = new StringBuffer(); - for (int i = 0; i < parts.length; i++) { - String capitalized = parts[i].substring(0, 1).toUpperCase() + parts[i].substring(1).toLowerCase(); - namespace.append(capitalized); - if (i != parts.length - 1) namespace.append("."); - } - return namespace.toString(); - } - - public ArrayList getFields() { - return mFields; - } - - public String getSignature() { - StringBuilder sb = new StringBuilder(); - sb.append("L").append(mName).append("("); - for (Iterator i = mFields.iterator(); i.hasNext();) { - String s = i.next().getSignature(); - sb.append(s); - } - sb.append(")"); - return sb.toString(); - } - - public String genCppDecl(String fname) { - return " "+ getCppNameSpace() + "::" + mName+" m"+fname+";\n"; - } - - public String genJavaReadMethod(String fname, String tag) { - return genJavaReadWrapper(fname, tag, false); - } - - public String genJavaReadWrapper(String fname, String tag, boolean decl) { - StringBuilder ret = new StringBuilder(""); - if (decl) { - ret.append(" "+getJavaFQName()+" "+fname+";\n"); - } - ret.append(" "+fname+"= new "+getJavaFQName()+"();\n"); - ret.append(" a_.readRecord("+fname+",\""+tag+"\");\n"); - return ret.toString(); - } - - public String genJavaWriteWrapper(String fname, String tag) { - return " a_.writeRecord("+fname+",\""+tag+"\");\n"; - } - - String genCsharpReadMethod(String fname, String tag) { - //return " "+capitalize(fname)+"=a_.Read"+mMethodSuffix+"(" + capitalize(fname) + ",\""+tag+"\");\n"; - return genCsharpReadWrapper(capitalize(fname), tag, false); - } - - public String genCsharpReadWrapper(String fname, String tag, boolean decl) { - StringBuilder ret = new StringBuilder(""); - if (decl) { - ret.append(" "+getCsharpFQName(mFQName)+" "+fname+";\n"); - } - ret.append(" "+fname+"= new "+getCsharpFQName(mFQName)+"();\n"); - ret.append(" a_.ReadRecord("+fname+",\""+tag+"\");\n"); - return ret.toString(); - } - - public String genCsharpWriteWrapper(String fname, String tag) { - return " a_.WriteRecord("+fname+",\""+tag+"\");\n"; - } - - static HashMap vectorStructs = new HashMap(); - public void genCCode(FileWriter h, FileWriter c) throws IOException { - for (JField f : mFields) { - if (f.getType() instanceof JVector) { - JVector jv = (JVector)f.getType(); - JType jvType = jv.getElementType(); - String struct_name = JVector.extractVectorName(jvType); - if (vectorStructs.get(struct_name) == null) { - vectorStructs.put(struct_name, struct_name); - h.write("struct " + struct_name + " {\n int32_t count;\n" + jv.getElementType().genCDecl("*data") + "\n};\n"); - h.write("int serialize_" + struct_name + "(struct oarchive *out, const char *tag, struct " + struct_name + " *v);\n"); - h.write("int deserialize_" + struct_name + "(struct iarchive *in, const char *tag, struct " + struct_name + " *v);\n"); - h.write("int allocate_" + struct_name + "(struct " + struct_name + " *v, int32_t len);\n"); - h.write("int deallocate_" + struct_name + "(struct " + struct_name + " *v);\n"); - c.write("int allocate_" + struct_name + "(struct " + struct_name + " *v, int32_t len) {\n"); - c.write(" if (!len) {\n"); - c.write(" v->count = 0;\n"); - c.write(" v->data = 0;\n"); - c.write(" } else {\n"); - c.write(" v->count = len;\n"); - c.write(" v->data = calloc(sizeof(*v->data), len);\n"); - c.write(" }\n"); - c.write(" return 0;\n"); - c.write("}\n"); - c.write("int deallocate_" + struct_name + "(struct " + struct_name + " *v) {\n"); - c.write(" if (v->data) {\n"); - c.write(" int32_t i;\n"); - c.write(" for(i=0;icount; i++) {\n"); - c.write(" deallocate_"+JRecord.extractMethodSuffix(jvType)+"(&v->data[i]);\n"); - c.write(" }\n"); - c.write(" free(v->data);\n"); - c.write(" v->data = 0;\n"); - c.write(" }\n"); - c.write(" return 0;\n"); - c.write("}\n"); - c.write("int serialize_" + struct_name + "(struct oarchive *out, const char *tag, struct " + struct_name + " *v)\n"); - c.write("{\n"); - c.write(" int32_t count = v->count;\n"); - c.write(" int rc = 0;\n"); - c.write(" int32_t i;\n"); - c.write(" rc = out->start_vector(out, tag, &count);\n"); - c.write(" for(i=0;icount;i++) {\n"); - genSerialize(c, jvType, "data", "data[i]"); - c.write(" }\n"); - c.write(" rc = rc ? rc : out->end_vector(out, tag);\n"); - c.write(" return rc;\n"); - c.write("}\n"); - c.write("int deserialize_" + struct_name + "(struct iarchive *in, const char *tag, struct " + struct_name + " *v)\n"); - c.write("{\n"); - c.write(" int rc = 0;\n"); - c.write(" int32_t i;\n"); - c.write(" rc = in->start_vector(in, tag, &v->count);\n"); - c.write(" v->data = calloc(v->count, sizeof(*v->data));\n"); - c.write(" for(i=0;icount;i++) {\n"); - genDeserialize(c, jvType, "value", "data[i]"); - c.write(" }\n"); - c.write(" rc = in->end_vector(in, tag);\n"); - c.write(" return rc;\n"); - c.write("}\n"); - - } - } - } - String rec_name = getName(); - h.write("struct " + rec_name + " {\n"); - for (JField f : mFields) { - h.write(f.genCDecl()); - } - h.write("};\n"); - h.write("int serialize_" + rec_name + "(struct oarchive *out, const char *tag, struct " + rec_name + " *v);\n"); - h.write("int deserialize_" + rec_name + "(struct iarchive *in, const char *tag, struct " + rec_name + "*v);\n"); - h.write("void deallocate_" + rec_name + "(struct " + rec_name + "*);\n"); - c.write("int serialize_" + rec_name + "(struct oarchive *out, const char *tag, struct " + rec_name + " *v)"); - c.write("{\n"); - c.write(" int rc;\n"); - c.write(" rc = out->start_record(out, tag);\n"); - for(JField f : mFields) { - genSerialize(c, f.getType(), f.getTag(), f.getName()); - } - c.write(" rc = rc ? rc : out->end_record(out, tag);\n"); - c.write(" return rc;\n"); - c.write("}\n"); - c.write("int deserialize_" + rec_name + "(struct iarchive *in, const char *tag, struct " + rec_name + "*v)"); - c.write("{\n"); - c.write(" int rc;\n"); - c.write(" rc = in->start_record(in, tag);\n"); - for(JField f : mFields) { - genDeserialize(c, f.getType(), f.getTag(), f.getName()); - } - c.write(" rc = rc ? rc : in->end_record(in, tag);\n"); - c.write(" return rc;\n"); - c.write("}\n"); - c.write("void deallocate_" + rec_name + "(struct " + rec_name + "*v)"); - c.write("{\n"); - for(JField f : mFields) { - if (f.getType() instanceof JRecord) { - c.write(" deallocate_" + extractStructName(f.getType()) + "(&v->" + f.getName() + ");\n"); - } else if (f.getType() instanceof JVector) { - JVector vt = (JVector)f.getType(); - c.write(" deallocate_" + JVector.extractVectorName(vt.getElementType())+ "(&v->"+f.getName()+");\n"); - } else if (f.getType() instanceof JCompType) { - c.write(" deallocate_" + extractMethodSuffix(f.getType()) + "(&v->"+f.getName()+");\n"); - } - } - c.write("}\n"); - } - - private void genSerialize(FileWriter c, JType type, String tag, String name) throws IOException { - if (type instanceof JRecord) { - c.write(" rc = rc ? rc : serialize_" + extractStructName(type) + "(out, \"" + tag + "\", &v->" + name + ");\n"); - } else if (type instanceof JVector) { - c.write(" rc = rc ? rc : serialize_" + JVector.extractVectorName(((JVector)type).getElementType()) + "(out, \"" + tag + "\", &v->" + name + ");\n"); - } else { - c.write(" rc = rc ? rc : out->serialize_" + extractMethodSuffix(type) + "(out, \"" + tag + "\", &v->" + name + ");\n"); - } - } - - private void genDeserialize(FileWriter c, JType type, String tag, String name) throws IOException { - if (type instanceof JRecord) { - c.write(" rc = rc ? rc : deserialize_" + extractStructName(type) + "(in, \"" + tag + "\", &v->" + name + ");\n"); - } else if (type instanceof JVector) { - c.write(" rc = rc ? rc : deserialize_" + JVector.extractVectorName(((JVector)type).getElementType()) + "(in, \"" + tag + "\", &v->" + name + ");\n"); - } else { - c.write(" rc = rc ? rc : in->deserialize_" + extractMethodSuffix(type) + "(in, \"" + tag + "\", &v->" + name + ");\n"); - } - } - - static String extractMethodSuffix(JType t) { - if (t instanceof JRecord) { - return extractStructName(t); - } - return t.getMethodSuffix(); - } - - static private String extractStructName(JType t) { - String type = t.getCType(); - if (!type.startsWith("struct ")) return type; - return type.substring("struct ".length()); - } - - public void genCppCode(FileWriter hh, FileWriter cc) - throws IOException { - String[] ns = getCppNameSpace().split("::"); - for (int i = 0; i < ns.length; i++) { - hh.write("namespace "+ns[i]+" {\n"); - } - - hh.write("class "+getName()+" : public ::hadoop::Record {\n"); - hh.write("private:\n"); - - for (Iterator i = mFields.iterator(); i.hasNext();) { - JField jf = i.next(); - hh.write(jf.genCppDecl()); - } - hh.write(" mutable std::bitset<"+mFields.size()+"> bs_;\n"); - hh.write("public:\n"); - hh.write(" virtual void serialize(::hadoop::OArchive& a_, const char* tag) const;\n"); - hh.write(" virtual void deserialize(::hadoop::IArchive& a_, const char* tag);\n"); - hh.write(" virtual const ::std::string& type() const;\n"); - hh.write(" virtual const ::std::string& signature() const;\n"); - hh.write(" virtual bool validate() const;\n"); - hh.write(" virtual bool operator<(const "+getName()+"& peer_) const;\n"); - hh.write(" virtual bool operator==(const "+getName()+"& peer_) const;\n"); - hh.write(" virtual ~"+getName()+"() {};\n"); - int fIdx = 0; - for (Iterator i = mFields.iterator(); i.hasNext(); fIdx++) { - JField jf = i.next(); - hh.write(jf.genCppGetSet(fIdx)); - } - hh.write("}; // end record "+getName()+"\n"); - for (int i=ns.length-1; i>=0; i--) { - hh.write("} // end namespace "+ns[i]+"\n"); - } - cc.write("void "+getCppFQName()+"::serialize(::hadoop::OArchive& a_, const char* tag) const {\n"); - cc.write(" if (!validate()) throw new ::hadoop::IOException(\"All fields not set.\");\n"); - cc.write(" a_.startRecord(*this,tag);\n"); - fIdx = 0; - for (Iterator i = mFields.iterator(); i.hasNext(); fIdx++) { - JField jf = i.next(); - String name = jf.getName(); - if (jf.getType() instanceof JBuffer) { - cc.write(" a_.serialize(m"+name+",m"+name+".length(),\""+jf.getTag()+"\");\n"); - } else { - cc.write(" a_.serialize(m"+name+",\""+jf.getTag()+"\");\n"); - } - cc.write(" bs_.reset("+fIdx+");\n"); - } - cc.write(" a_.endRecord(*this,tag);\n"); - cc.write(" return;\n"); - cc.write("}\n"); - - cc.write("void "+getCppFQName()+"::deserialize(::hadoop::IArchive& a_, const char* tag) {\n"); - cc.write(" a_.startRecord(*this,tag);\n"); - fIdx = 0; - for (Iterator i = mFields.iterator(); i.hasNext(); fIdx++) { - JField jf = i.next(); - String name = jf.getName(); - if (jf.getType() instanceof JBuffer) { - cc.write(" { size_t len=0; a_.deserialize(m"+name+",len,\""+jf.getTag()+"\");}\n"); - } else { - cc.write(" a_.deserialize(m"+name+",\""+jf.getTag()+"\");\n"); - } - cc.write(" bs_.set("+fIdx+");\n"); - } - cc.write(" a_.endRecord(*this,tag);\n"); - cc.write(" return;\n"); - cc.write("}\n"); - - cc.write("bool "+getCppFQName()+"::validate() const {\n"); - cc.write(" if (bs_.size() != bs_.count()) return false;\n"); - for (Iterator i = mFields.iterator(); i.hasNext(); fIdx++) { - JField jf = (JField) i.next(); - JType type = jf.getType(); - if (type instanceof JRecord) { - cc.write(" if (!m"+jf.getName()+".validate()) return false;\n"); - } - } - cc.write(" return true;\n"); - cc.write("}\n"); - - cc.write("bool "+getCppFQName()+"::operator< (const "+getCppFQName()+"& peer_) const {\n"); - cc.write(" return (1\n"); - for (Iterator i = mFields.iterator(); i.hasNext();) { - JField jf = i.next(); - String name = jf.getName(); - cc.write(" && (m"+name+" < peer_.m"+name+")\n"); - } - cc.write(" );\n"); - cc.write("}\n"); - - cc.write("bool "+getCppFQName()+"::operator== (const "+getCppFQName()+"& peer_) const {\n"); - cc.write(" return (1\n"); - for (Iterator i = mFields.iterator(); i.hasNext();) { - JField jf = i.next(); - String name = jf.getName(); - cc.write(" && (m"+name+" == peer_.m"+name+")\n"); - } - cc.write(" );\n"); - cc.write("}\n"); - - cc.write("const ::std::string&"+getCppFQName()+"::type() const {\n"); - cc.write(" static const ::std::string type_(\""+mName+"\");\n"); - cc.write(" return type_;\n"); - cc.write("}\n"); - - cc.write("const ::std::string&"+getCppFQName()+"::signature() const {\n"); - cc.write(" static const ::std::string sig_(\""+getSignature()+"\");\n"); - cc.write(" return sig_;\n"); - cc.write("}\n"); - - } - - public void genJavaCode(File outputDirectory) throws IOException { - String pkg = getJavaPackage(); - String pkgpath = pkg.replaceAll("\\.", "/"); - File pkgdir = new File(outputDirectory, pkgpath); - if (!pkgdir.exists()) { - // create the pkg directory - if (!pkgdir.mkdirs()) { - throw new IOException("Cannnot create directory: " + pkgpath); - } - } else if (!pkgdir.isDirectory()) { - throw new IOException(pkgpath + " is not a directory."); - } - File jfile = new File(pkgdir, getName()+".java"); - FileWriter jj = new FileWriter(jfile); - jj.write("// File generated by hadoop record compiler. Do not edit.\n"); - jj.write("/**\n"); - jj.write("* Licensed to the Apache Software Foundation (ASF) under one\n"); - jj.write("* or more contributor license agreements. See the NOTICE file\n"); - jj.write("* distributed with this work for additional information\n"); - jj.write("* regarding copyright ownership. The ASF licenses this file\n"); - jj.write("* to you under the Apache License, Version 2.0 (the\n"); - jj.write("* \"License\"); you may not use this file except in compliance\n"); - jj.write("* with the License. You may obtain a copy of the License at\n"); - jj.write("*\n"); - jj.write("* http://www.apache.org/licenses/LICENSE-2.0\n"); - jj.write("*\n"); - jj.write("* Unless required by applicable law or agreed to in writing, software\n"); - jj.write("* distributed under the License is distributed on an \"AS IS\" BASIS,\n"); - jj.write("* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n"); - jj.write("* See the License for the specific language governing permissions and\n"); - jj.write("* limitations under the License.\n"); - jj.write("*/\n"); - jj.write("\n"); - jj.write("package "+getJavaPackage()+";\n\n"); - jj.write("import org.apache.jute.*;\n"); - jj.write("public class "+getName()+" implements Record {\n"); - for (Iterator i = mFields.iterator(); i.hasNext();) { - JField jf = i.next(); - jj.write(jf.genJavaDecl()); - } - jj.write(" public "+getName()+"() {\n"); - jj.write(" }\n"); - - jj.write(" public "+getName()+"(\n"); - int fIdx = 0; - int fLen = mFields.size(); - for (Iterator i = mFields.iterator(); i.hasNext(); fIdx++) { - JField jf = i.next(); - jj.write(jf.genJavaConstructorParam(jf.getName())); - jj.write((fLen-1 == fIdx)?"":",\n"); - } - jj.write(") {\n"); - fIdx = 0; - for (Iterator i = mFields.iterator(); i.hasNext(); fIdx++) { - JField jf = i.next(); - jj.write(jf.genJavaConstructorSet(jf.getName())); - } - jj.write(" }\n"); - fIdx = 0; - for (Iterator i = mFields.iterator(); i.hasNext(); fIdx++) { - JField jf = i.next(); - jj.write(jf.genJavaGetSet(fIdx)); - } - jj.write(" public void serialize(OutputArchive a_, String tag) throws java.io.IOException {\n"); - jj.write(" a_.startRecord(this,tag);\n"); - fIdx = 0; - for (Iterator i = mFields.iterator(); i.hasNext(); fIdx++) { - JField jf = i.next(); - jj.write(jf.genJavaWriteMethodName()); - } - jj.write(" a_.endRecord(this,tag);\n"); - jj.write(" }\n"); - - jj.write(" public void deserialize(InputArchive a_, String tag) throws java.io.IOException {\n"); - jj.write(" a_.startRecord(tag);\n"); - fIdx = 0; - for (Iterator i = mFields.iterator(); i.hasNext(); fIdx++) { - JField jf = i.next(); - jj.write(jf.genJavaReadMethodName()); - } - jj.write(" a_.endRecord(tag);\n"); - jj.write("}\n"); - - jj.write(" public String toString() {\n"); - jj.write(" try {\n"); - jj.write(" java.io.ByteArrayOutputStream s =\n"); - jj.write(" new java.io.ByteArrayOutputStream();\n"); - jj.write(" CsvOutputArchive a_ = \n"); - jj.write(" new CsvOutputArchive(s);\n"); - jj.write(" a_.startRecord(this,\"\");\n"); - fIdx = 0; - for (Iterator i = mFields.iterator(); i.hasNext(); fIdx++) { - JField jf = i.next(); - jj.write(jf.genJavaWriteMethodName()); - } - jj.write(" a_.endRecord(this,\"\");\n"); - jj.write(" return new String(s.toByteArray(), \"UTF-8\");\n"); - jj.write(" } catch (Throwable ex) {\n"); - jj.write(" ex.printStackTrace();\n"); - jj.write(" }\n"); - jj.write(" return \"ERROR\";\n"); - jj.write(" }\n"); - - jj.write(" public void write(java.io.DataOutput out) throws java.io.IOException {\n"); - jj.write(" BinaryOutputArchive archive = new BinaryOutputArchive(out);\n"); - jj.write(" serialize(archive, \"\");\n"); - jj.write(" }\n"); - - jj.write(" public void readFields(java.io.DataInput in) throws java.io.IOException {\n"); - jj.write(" BinaryInputArchive archive = new BinaryInputArchive(in);\n"); - jj.write(" deserialize(archive, \"\");\n"); - jj.write(" }\n"); - - jj.write(" public int compareTo (Object peer_) throws ClassCastException {\n"); - boolean unimplemented = false; - for (JField f : mFields) { - if ((f.getType() instanceof JMap) - || (f.getType() instanceof JVector)) - { - unimplemented = true; - } - } - if (unimplemented) { - jj.write(" throw new UnsupportedOperationException(\"comparing " - + getName() + " is unimplemented\");\n"); - } else { - jj.write(" if (!(peer_ instanceof "+getName()+")) {\n"); - jj.write(" throw new ClassCastException(\"Comparing different types of records.\");\n"); - jj.write(" }\n"); - jj.write(" "+getName()+" peer = ("+getName()+") peer_;\n"); - jj.write(" int ret = 0;\n"); - for (Iterator i = mFields.iterator(); i.hasNext(); fIdx++) { - JField jf = i.next(); - jj.write(jf.genJavaCompareTo()); - jj.write(" if (ret != 0) return ret;\n"); - } - jj.write(" return ret;\n"); - } - jj.write(" }\n"); - - jj.write(" public boolean equals(Object peer_) {\n"); - jj.write(" if (!(peer_ instanceof "+getName()+")) {\n"); - jj.write(" return false;\n"); - jj.write(" }\n"); - jj.write(" if (peer_ == this) {\n"); - jj.write(" return true;\n"); - jj.write(" }\n"); - jj.write(" "+getName()+" peer = ("+getName()+") peer_;\n"); - jj.write(" boolean ret = false;\n"); - for (Iterator i = mFields.iterator(); i.hasNext(); fIdx++) { - JField jf = i.next(); - jj.write(jf.genJavaEquals()); - jj.write(" if (!ret) return ret;\n"); - } - jj.write(" return ret;\n"); - jj.write(" }\n"); - - jj.write(" public int hashCode() {\n"); - jj.write(" int result = 17;\n"); - jj.write(" int ret;\n"); - for (Iterator i = mFields.iterator(); i.hasNext(); fIdx++) { - JField jf = i.next(); - jj.write(jf.genJavaHashCode()); - jj.write(" result = 37*result + ret;\n"); - } - jj.write(" return result;\n"); - jj.write(" }\n"); - jj.write(" public static String signature() {\n"); - jj.write(" return \""+getSignature()+"\";\n"); - jj.write(" }\n"); - - jj.write("}\n"); - - jj.close(); - } - - public void genCsharpCode(File outputDirectory) throws IOException { - if (!outputDirectory.exists()) { - // create the pkg directory - if (!outputDirectory.mkdirs()) { - throw new IOException("Cannnot create directory: " + outputDirectory); - } - } else if (!outputDirectory.isDirectory()) { - throw new IOException(outputDirectory + " is not a directory."); - } - File csharpFile = new File(outputDirectory, getName()+".cs"); - FileWriter cs = new FileWriter(csharpFile); - cs.write("// File generated by hadoop record compiler. Do not edit.\n"); - cs.write("/**\n"); - cs.write("* Licensed to the Apache Software Foundation (ASF) under one\n"); - cs.write("* or more contributor license agreements. See the NOTICE file\n"); - cs.write("* distributed with this work for additional information\n"); - cs.write("* regarding copyright ownership. The ASF licenses this file\n"); - cs.write("* to you under the Apache License, Version 2.0 (the\n"); - cs.write("* \"License\"); you may not use this file except in compliance\n"); - cs.write("* with the License. You may obtain a copy of the License at\n"); - cs.write("*\n"); - cs.write("* http://www.apache.org/licenses/LICENSE-2.0\n"); - cs.write("*\n"); - cs.write("* Unless required by applicable law or agreed to in writing, software\n"); - cs.write("* distributed under the License is distributed on an \"AS IS\" BASIS,\n"); - cs.write("* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n"); - cs.write("* See the License for the specific language governing permissions and\n"); - cs.write("* limitations under the License.\n"); - cs.write("*/\n"); - cs.write("\n"); - cs.write("using System;\n"); - cs.write("using Org.Apache.Jute;\n"); - cs.write("\n"); - cs.write("namespace "+getCsharpNameSpace()+"\n"); - cs.write("{\n"); - - String className = getCsharpName(); - cs.write("public class "+className+" : IRecord, IComparable \n"); - cs.write("{\n"); - cs.write(" public "+ className +"() {\n"); - cs.write(" }\n"); - - cs.write(" public "+className+"(\n"); - int fIdx = 0; - int fLen = mFields.size(); - for (Iterator i = mFields.iterator(); i.hasNext(); fIdx++) { - JField jf = i.next(); - cs.write(jf.genCsharpConstructorParam(jf.getCsharpName())); - cs.write((fLen-1 == fIdx)?"":",\n"); - } - cs.write(") {\n"); - fIdx = 0; - for (Iterator i = mFields.iterator(); i.hasNext(); fIdx++) { - JField jf = i.next(); - cs.write(jf.genCsharpConstructorSet(jf.getCsharpName())); - } - cs.write(" }\n"); - fIdx = 0; - for (Iterator i = mFields.iterator(); i.hasNext(); fIdx++) { - JField jf = i.next(); - cs.write(jf.genCsharpGetSet(fIdx)); - cs.write("\n"); - } - cs.write(" public void Serialize(IOutputArchive a_, String tag) {\n"); - cs.write(" a_.StartRecord(this,tag);\n"); - fIdx = 0; - for (Iterator i = mFields.iterator(); i.hasNext(); fIdx++) { - JField jf = i.next(); - cs.write(jf.genCsharpWriteMethodName()); - } - cs.write(" a_.EndRecord(this,tag);\n"); - cs.write(" }\n"); - - cs.write(" public void Deserialize(IInputArchive a_, String tag) {\n"); - cs.write(" a_.StartRecord(tag);\n"); - fIdx = 0; - for (Iterator i = mFields.iterator(); i.hasNext(); fIdx++) { - JField jf = i.next(); - cs.write(jf.genCsharpReadMethodName()); - } - cs.write(" a_.EndRecord(tag);\n"); - cs.write("}\n"); - - cs.write(" public override String ToString() {\n"); - cs.write(" try {\n"); - cs.write(" System.IO.MemoryStream ms = new System.IO.MemoryStream();\n"); - cs.write(" MiscUtil.IO.EndianBinaryWriter writer =\n"); - cs.write(" new MiscUtil.IO.EndianBinaryWriter(MiscUtil.Conversion.EndianBitConverter.Big, ms, System.Text.Encoding.UTF8);\n"); - cs.write(" BinaryOutputArchive a_ = \n"); - cs.write(" new BinaryOutputArchive(writer);\n"); - cs.write(" a_.StartRecord(this,\"\");\n"); - fIdx = 0; - for (Iterator i = mFields.iterator(); i.hasNext(); fIdx++) { - JField jf = i.next(); - cs.write(jf.genCsharpWriteMethodName()); - } - cs.write(" a_.EndRecord(this,\"\");\n"); - cs.write(" ms.Position = 0;\n"); - cs.write(" return System.Text.Encoding.UTF8.GetString(ms.ToArray());\n"); - cs.write(" } catch (Exception ex) {\n"); - cs.write(" Console.WriteLine(ex.StackTrace);\n"); - cs.write(" }\n"); - cs.write(" return \"ERROR\";\n"); - cs.write(" }\n"); - - cs.write(" public void Write(MiscUtil.IO.EndianBinaryWriter writer) {\n"); - cs.write(" BinaryOutputArchive archive = new BinaryOutputArchive(writer);\n"); - cs.write(" Serialize(archive, \"\");\n"); - cs.write(" }\n"); - - cs.write(" public void ReadFields(MiscUtil.IO.EndianBinaryReader reader) {\n"); - cs.write(" BinaryInputArchive archive = new BinaryInputArchive(reader);\n"); - cs.write(" Deserialize(archive, \"\");\n"); - cs.write(" }\n"); - - cs.write(" public int CompareTo (object peer_) {\n"); - boolean unimplemented = false; - for (JField f : mFields) { - if ((f.getType() instanceof JMap) - || (f.getType() instanceof JVector)) - { - unimplemented = true; - } - } - if (unimplemented) { - cs.write(" throw new InvalidOperationException(\"comparing " - + getCsharpName() + " is unimplemented\");\n"); - } else { - cs.write(" if (!(peer_ is "+getCsharpName()+")) {\n"); - cs.write(" throw new InvalidOperationException(\"Comparing different types of records.\");\n"); - cs.write(" }\n"); - cs.write(" "+getCsharpName()+" peer = ("+getCsharpName()+") peer_;\n"); - cs.write(" int ret = 0;\n"); - for (Iterator i = mFields.iterator(); i.hasNext(); fIdx++) { - JField jf = i.next(); - cs.write(jf.genCsharpCompareTo()); - cs.write(" if (ret != 0) return ret;\n"); - } - cs.write(" return ret;\n"); - } - cs.write(" }\n"); - - cs.write(" public override bool Equals(object peer_) {\n"); - cs.write(" if (!(peer_ is "+getCsharpName()+")) {\n"); - cs.write(" return false;\n"); - cs.write(" }\n"); - cs.write(" if (peer_ == this) {\n"); - cs.write(" return true;\n"); - cs.write(" }\n"); - cs.write(" bool ret = false;\n"); - cs.write(" " + getCsharpName() + " peer = (" + getCsharpName() + ")peer_;\n"); - for (Iterator i = mFields.iterator(); i.hasNext(); fIdx++) { - JField jf = i.next(); - cs.write(jf.genCsharpEquals()); - cs.write(" if (!ret) return ret;\n"); - } - cs.write(" return ret;\n"); - cs.write(" }\n"); - - cs.write(" public override int GetHashCode() {\n"); - cs.write(" int result = 17;\n"); - cs.write(" int ret;\n"); - for (Iterator i = mFields.iterator(); i.hasNext(); fIdx++) { - JField jf = i.next(); - cs.write(jf.genCsharpHashCode()); - cs.write(" result = 37*result + ret;\n"); - } - cs.write(" return result;\n"); - cs.write(" }\n"); - cs.write(" public static string Signature() {\n"); - cs.write(" return \""+getSignature()+"\";\n"); - cs.write(" }\n"); - - cs.write("}\n"); - cs.write("}\n"); - - cs.close(); - } - - public static String getCsharpFQName(String name) { - String[] packages = name.split("\\."); - StringBuffer fQName = new StringBuffer(); - for (int i = 0; i < packages.length; i++) { - String pack = packages[i]; - pack = capitalize(pack); - pack = "Id".equals(pack) ? "ZKId" : pack; - fQName.append(capitalize(pack)); - if (i != packages.length - 1) fQName.append("."); - } - return fQName.toString(); - } -} diff --git a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/jute/compiler/JString.java b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/jute/compiler/JString.java deleted file mode 100644 index 7f246c33b..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/jute/compiler/JString.java +++ /dev/null @@ -1,46 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you 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. - */ - -package org.apache.jute.compiler; - -/** - * - */ -public class JString extends JCompType { - - /** Creates a new instance of JString */ - public JString() { - super("char *", " ::std::string", "string", "String", "String", "String", "string"); - } - - public String getSignature() { - return "s"; - } - - public String genJavaReadWrapper(String fname, String tag, boolean decl) { - String ret = ""; - if (decl) { - ret = " String "+fname+";\n"; - } - return ret + " "+fname+"=a_.readString(\""+tag+"\");\n"; - } - - public String genJavaWriteWrapper(String fname, String tag) { - return " a_.writeString("+fname+",\""+tag+"\");\n"; - } -} diff --git a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/jute/compiler/JType.java b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/jute/compiler/JType.java deleted file mode 100644 index ee1b9c085..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/jute/compiler/JType.java +++ /dev/null @@ -1,204 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you 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. - */ - -package org.apache.jute.compiler; - -/** - * Abstract Base class for all types supported by Hadoop Record I/O. - * - */ -abstract public class JType { - - private String mCName; - private String mCppName; - private String mCsharpName; - private String mJavaName; - protected String mMethodSuffix; - private String mWrapper; - private String mSharpWrapper; - private String mUnwrapMethod; - - /** - * Creates a new instance of JType - */ - JType(String cname, String cppname, String csharpName, String javaname, String suffix, String wrapper, String csharpWrapper, String unwrap) { - mCName = cname; - mCppName = cppname; - mCsharpName = "Id".equals(csharpName) ? "ZKId" : csharpName; - mJavaName = javaname; - mMethodSuffix = suffix; - mWrapper = wrapper; - mSharpWrapper = csharpWrapper; - mUnwrapMethod = unwrap; - } - - abstract String getSignature(); - - String genCppDecl(String fname) { - return " "+mCppName+" m"+fname+";\n"; - } - - String genCDecl(String name) { - return " " + mCName + " "+name+";\n"; - } - - public String genCsharpDecl(String name) { - return " private "+mCsharpName+" " +name+";\n"; - } - - String genJavaDecl (String fname) { - return " private "+mJavaName+" " +fname+";\n"; - } - - String genJavaConstructorParam (String fname) { - return " "+mJavaName+" "+fname; - } - - String genCppGetSet(String fname, int fIdx) { - String getFunc = " virtual "+mCppName+" get"+fname+"() const {\n"; - getFunc += " return m"+fname+";\n"; - getFunc += " }\n"; - String setFunc = " virtual void set"+fname+"("+mCppName+" m_) {\n"; - setFunc += " m"+fname+"=m_; bs_.set("+fIdx+");\n"; - setFunc += " }\n"; - return getFunc+setFunc; - } - - String genCsharpGetSet(String fname, int fIdx) { - String getFunc = " public " + getCsharpType() + " " + capitalize(fname) + " { get; set; } "; - return getFunc; - } - - static String capitalize(String s) { - return s.substring(0,1).toUpperCase()+s.substring(1); - } - String genJavaGetSet(String fname, int fIdx) { - String getFunc = " public "+mJavaName+" get"+capitalize(fname)+"() {\n"; - getFunc += " return "+fname+";\n"; - getFunc += " }\n"; - String setFunc = " public void set"+capitalize(fname)+"("+mJavaName+" m_) {\n"; - setFunc += " " + fname+"=m_;\n"; - setFunc += " }\n"; - return getFunc+setFunc; - } - - String getCType() { - return mCName; - } - String getCppType() { - return mCppName; - } - - String getCsharpType() { - return mCsharpName; - } - - String getJavaType() { - return mJavaName; - } - - String getJavaWrapperType() { - return mWrapper; - } - - String getCsharpWrapperType() { - return mSharpWrapper; - } - - String getMethodSuffix() { - return mMethodSuffix; - } - - String genJavaWriteMethod(String fname, String tag) { - return " a_.write"+mMethodSuffix+"("+fname+",\""+tag+"\");\n"; - } - - String genJavaReadMethod(String fname, String tag) { - return " "+fname+"=a_.read"+mMethodSuffix+"(\""+tag+"\");\n"; - } - - String genJavaReadWrapper(String fname, String tag, boolean decl) { - String ret = ""; - if (decl) { - ret = " "+mWrapper+" "+fname+";\n"; - } - return ret + " "+fname+"=new "+mWrapper+"(a_.read"+mMethodSuffix+"(\""+tag+"\"));\n"; - } - - String genJavaWriteWrapper(String fname, String tag) { - return " a_.write"+mMethodSuffix+"("+fname+"."+mUnwrapMethod+"(),\""+tag+"\");\n"; - } - - String genJavaCompareTo(String fname) { - return " ret = ("+fname+" == peer."+fname+")? 0 :(("+fname+"", "System.Collections.Generic.List<" + t.getCsharpType() + ">", "java.util.List<" + t.getJavaType() + ">", "Vector", - "System.Collections.Generic.List<" + t.getCsharpType() + ">", "java.util.ArrayList<" + t.getJavaType() + ">"); - mElement = t; - } - - public String getSignature() { - return "[" + mElement.getSignature() + "]"; - } - - public String genJavaCompareTo(String fname) { - return " throw new UnsupportedOperationException(\"comparing " - + fname + " is unimplemented\");\n"; - } - - public String genJavaReadWrapper(String fname, String tag, boolean decl) { - StringBuilder ret = new StringBuilder(""); - if (decl) { - ret.append(" java.util.List "+fname+";\n"); - } - ret.append(" {\n"); - incrLevel(); - ret.append(" Index "+getId("vidx")+" = a_.startVector(\""+tag+"\");\n"); - ret.append(" if ("+getId("vidx")+"!= null) {"); - ret.append(" "+fname+"=new java.util.ArrayList<"+ mElement.getJavaType() + ">();\n"); - ret.append(" for (; !"+getId("vidx")+".done(); "+getId("vidx")+".incr()) {\n"); - ret.append(mElement.genJavaReadWrapper(getId("e"), getId("e"), true)); - ret.append(" "+fname+".add("+getId("e")+");\n"); - ret.append(" }\n"); - ret.append(" }\n"); - ret.append(" a_.endVector(\""+tag+"\");\n"); - decrLevel(); - ret.append(" }\n"); - return ret.toString(); - } - - public String genJavaReadMethod(String fname, String tag) { - return genJavaReadWrapper(fname, tag, false); - } - - public String genJavaWriteWrapper(String fname, String tag) { - StringBuilder ret = new StringBuilder(" {\n"); - incrLevel(); - ret.append(" a_.startVector("+fname+",\""+tag+"\");\n"); - ret.append(" if ("+fname+"!= null) {"); - ret.append(" int "+getId("len")+" = "+fname+".size();\n"); - ret.append(" for(int "+getId("vidx")+" = 0; "+getId("vidx")+"<"+getId("len")+"; "+getId("vidx")+"++) {\n"); - ret.append(" "+mElement.getJavaWrapperType()+" "+getId("e")+" = ("+mElement.getJavaWrapperType()+") "+fname+".get("+getId("vidx")+");\n"); - ret.append(mElement.genJavaWriteWrapper(getId("e"), getId("e"))); - ret.append(" }\n"); - ret.append(" }\n"); - ret.append(" a_.endVector("+fname+",\""+tag+"\");\n"); - ret.append(" }\n"); - decrLevel(); - return ret.toString(); - } - - public String genJavaWriteMethod(String fname, String tag) { - return genJavaWriteWrapper(fname, tag); - } - - public JType getElementType() { - return mElement; - } - - public String genCsharpWriteWrapper(String fname, String tag) { - StringBuilder ret = new StringBuilder(" {\n"); - incrLevel(); - ret.append(" a_.StartVector("+capitalize(fname)+",\""+tag+"\");\n"); - ret.append(" if ("+capitalize(fname)+"!= null) {"); - ret.append(" int "+getId("len")+" = "+capitalize(fname)+".Count;\n"); - ret.append(" for(int "+getId("vidx")+" = 0; "+getId("vidx")+"<"+getId("len")+"; "+getId("vidx")+"++) {\n"); - ret.append(" "+mElement.getCsharpWrapperType()+" "+getId("e")+" = ("+mElement.getCsharpWrapperType()+") "+capitalize(fname)+"["+getId("vidx")+"];\n"); - ret.append(mElement.genCsharpWriteWrapper(getId("e"), getId("e"))); - ret.append(" }\n"); - ret.append(" }\n"); - ret.append(" a_.EndVector("+capitalize(fname)+",\""+tag+"\");\n"); - ret.append(" }\n"); - decrLevel(); - return ret.toString(); - } - - String genCsharpWriteMethod(String fname, String tag) { - return genCsharpWriteWrapper(fname, tag); - } - - public String genCsharpReadWrapper(String fname, String tag, boolean decl) { - StringBuilder ret = new StringBuilder(""); - if (decl) { - ret.append(" System.Collections.Generic.List<" + mElement.getCsharpType()+ "> "+capitalize(fname)+";\n"); - } - ret.append(" {\n"); - incrLevel(); - ret.append(" IIndex "+getId("vidx")+" = a_.StartVector(\""+tag+"\");\n"); - ret.append(" if ("+getId("vidx")+"!= null) {"); - ret.append(" "+capitalize(fname)+"=new System.Collections.Generic.List<"+ mElement.getCsharpType() + ">();\n"); - ret.append(" for (; !"+getId("vidx")+".Done(); "+getId("vidx")+".Incr()) {\n"); - ret.append(mElement.genCsharpReadWrapper(getId("e"), getId("e"), true)); - ret.append(" "+capitalize(fname)+".Add("+getId("e")+");\n"); - ret.append(" }\n"); - ret.append(" }\n"); - ret.append(" a_.EndVector(\""+tag+"\");\n"); - decrLevel(); - ret.append(" }\n"); - return ret.toString(); - } - - String genCsharpReadMethod(String fname, String tag) { - return genCsharpReadWrapper(fname, tag, false); - } - - static public String extractVectorName(JType jvType) { - return JRecord.extractMethodSuffix(jvType)+"_vector"; - } -} diff --git a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/jute/compiler/JavaGenerator.java b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/jute/compiler/JavaGenerator.java deleted file mode 100644 index 4078520f7..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/jute/compiler/JavaGenerator.java +++ /dev/null @@ -1,57 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you 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. - */ - -package org.apache.jute.compiler; - -import java.io.File; -import java.io.IOException; -import java.util.ArrayList; -import java.util.Iterator; - -/** - * Java Code generator front-end for Hadoop record I/O. - */ -class JavaGenerator { - private ArrayList mRecList; - private final File outputDirectory; - - /** Creates a new instance of JavaGenerator - * - * @param name possibly full pathname to the file - * @param incl included files (as JFile) - * @param records List of records defined within this file - * @param outputDirectory - */ - JavaGenerator(String name, ArrayList incl, - ArrayList records, File outputDirectory) - { - mRecList = records; - this.outputDirectory = outputDirectory; - } - - /** - * Generate Java code for records. This method is only a front-end to - * JRecord, since one file is generated for each record. - */ - void genCode() throws IOException { - for (Iterator i = mRecList.iterator(); i.hasNext(); ) { - JRecord rec = i.next(); - rec.genJavaCode(outputDirectory); - } - } -} diff --git a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/jute/compiler/generated/ParseException.java b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/jute/compiler/generated/ParseException.java deleted file mode 100644 index e4b0a9b67..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/jute/compiler/generated/ParseException.java +++ /dev/null @@ -1,210 +0,0 @@ -/* Generated By:JavaCC: Do not edit this line. ParseException.java Version 3.0 */ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you 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. - */ - -package org.apache.jute.compiler.generated; - -/** - * This exception is thrown when parse errors are encountered. - * You can explicitly create objects of this exception type by - * calling the method generateParseException in the generated - * parser. - * - * You can modify this class to customize your error reporting - * mechanisms so long as you retain the public fields. - */ -public class ParseException extends Exception { - - /** - * This constructor is used by the method "generateParseException" - * in the generated parser. Calling this constructor generates - * a new object of this type with the fields "currentToken", - * "expectedTokenSequences", and "tokenImage" set. The boolean - * flag "specialConstructor" is also set to true to indicate that - * this constructor was used to create this object. - * This constructor calls its super class with the empty string - * to force the "toString" method of parent class "Throwable" to - * print the error message in the form: - * ParseException: - */ - public ParseException(Token currentTokenVal, - int[][] expectedTokenSequencesVal, - String[] tokenImageVal - ) - { - super(""); - specialConstructor = true; - currentToken = currentTokenVal; - expectedTokenSequences = expectedTokenSequencesVal; - tokenImage = tokenImageVal; - } - - /** - * The following constructors are for use by you for whatever - * purpose you can think of. Constructing the exception in this - * manner makes the exception behave in the normal way - i.e., as - * documented in the class "Throwable". The fields "errorToken", - * "expectedTokenSequences", and "tokenImage" do not contain - * relevant information. The JavaCC generated code does not use - * these constructors. - */ - - public ParseException() { - super(); - specialConstructor = false; - } - - public ParseException(String message) { - super(message); - specialConstructor = false; - } - - /** - * This variable determines which constructor was used to create - * this object and thereby affects the semantics of the - * "getMessage" method (see below). - */ - protected boolean specialConstructor; - - /** - * This is the last token that has been consumed successfully. If - * this object has been created due to a parse error, the token - * followng this token will (therefore) be the first error token. - */ - public Token currentToken; - - /** - * Each entry in this array is an array of integers. Each array - * of integers represents a sequence of tokens (by their ordinal - * values) that is expected at this point of the parse. - */ - public int[][] expectedTokenSequences; - - /** - * This is a reference to the "tokenImage" array of the generated - * parser within which the parse error occurred. This array is - * defined in the generated ...Constants interface. - */ - public String[] tokenImage; - - /** - * This method has the standard behavior when this object has been - * created using the standard constructors. Otherwise, it uses - * "currentToken" and "expectedTokenSequences" to generate a parse - * error message and returns it. If this object has been created - * due to a parse error, and you do not catch it (it gets thrown - * from the parser), then this method is called during the printing - * of the final stack trace, and hence the correct error message - * gets displayed. - */ - public String getMessage() { - if (!specialConstructor) { - return super.getMessage(); - } - StringBuffer expected = new StringBuffer(); - int maxSize = 0; - for (int i = 0; i < expectedTokenSequences.length; i++) { - if (maxSize < expectedTokenSequences[i].length) { - maxSize = expectedTokenSequences[i].length; - } - for (int j = 0; j < expectedTokenSequences[i].length; j++) { - expected.append(tokenImage[expectedTokenSequences[i][j]]).append(" "); - } - if (expectedTokenSequences[i][expectedTokenSequences[i].length - 1] != 0) { - expected.append("..."); - } - expected.append(eol).append(" "); - } - String retval = "Encountered \""; - Token tok = currentToken.next; - for (int i = 0; i < maxSize; i++) { - if (i != 0) retval += " "; - if (tok.kind == 0) { - retval += tokenImage[0]; - break; - } - retval += add_escapes(tok.image); - tok = tok.next; - } - retval += "\" at line " + currentToken.next.beginLine + ", column " + currentToken.next.beginColumn; - retval += "." + eol; - if (expectedTokenSequences.length == 1) { - retval += "Was expecting:" + eol + " "; - } else { - retval += "Was expecting one of:" + eol + " "; - } - retval += expected.toString(); - return retval; - } - - /** - * The end of line string for this machine. - */ - protected String eol = System.getProperty("line.separator", "\n"); - - /** - * Used to convert raw characters to their escaped version - * when these raw version cannot be used as part of an ASCII - * string literal. - */ - protected String add_escapes(String str) { - StringBuffer retval = new StringBuffer(); - char ch; - for (int i = 0; i < str.length(); i++) { - switch (str.charAt(i)) - { - case 0 : - continue; - case '\b': - retval.append("\\b"); - continue; - case '\t': - retval.append("\\t"); - continue; - case '\n': - retval.append("\\n"); - continue; - case '\f': - retval.append("\\f"); - continue; - case '\r': - retval.append("\\r"); - continue; - case '\"': - retval.append("\\\""); - continue; - case '\'': - retval.append("\\\'"); - continue; - case '\\': - retval.append("\\\\"); - continue; - default: - if ((ch = str.charAt(i)) < 0x20 || ch > 0x7e) { - String s = "0000" + Integer.toString(ch, 16); - retval.append("\\u" + s.substring(s.length() - 4, s.length())); - } else { - retval.append(ch); - } - continue; - } - } - return retval.toString(); - } - -} diff --git a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/jute/compiler/generated/Rcc.java b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/jute/compiler/generated/Rcc.java deleted file mode 100644 index 1bd4878a9..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/jute/compiler/generated/Rcc.java +++ /dev/null @@ -1,525 +0,0 @@ -/* Generated By:JavaCC: Do not edit this line. Rcc.java */ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you 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. - */ - -package org.apache.jute.compiler.generated; - -import org.apache.jute.compiler.*; -import java.util.ArrayList; -import java.util.Hashtable; -import java.util.Iterator; -import java.io.File; -import java.io.FileReader; -import java.io.FileNotFoundException; -import java.io.IOException; - -public class Rcc implements RccConstants { - private static Hashtable recTab = new Hashtable(); - private static String curDir = System.getProperty("user.dir"); - private static String curFileName; - private static String curModuleName; - - public static void main(String args[]) { - String language = "java"; - ArrayList recFiles = new ArrayList(); - JFile curFile=null; - - for (int i=0; i= 0) { - la1tokens[jj_kind] = true; - jj_kind = -1; - } - for (int i = 0; i < 6; i++) { - if (jj_la1[i] == jj_gen) { - for (int j = 0; j < 32; j++) { - if ((jj_la1_0[i] & (1<", - "\" \"", - "\"\\t\"", - "\"\\n\"", - "\"\\r\"", - "\"//\"", - "", - "", - "\"/*\"", - "\"*/\"", - "", - "\"module\"", - "\"class\"", - "\"include\"", - "\"byte\"", - "\"boolean\"", - "\"int\"", - "\"long\"", - "\"float\"", - "\"double\"", - "\"ustring\"", - "\"buffer\"", - "\"vector\"", - "\"map\"", - "\"{\"", - "\"}\"", - "\"<\"", - "\">\"", - "\";\"", - "\",\"", - "\".\"", - "", - "", - }; - -} diff --git a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/jute/compiler/generated/RccTokenManager.java b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/jute/compiler/generated/RccTokenManager.java deleted file mode 100644 index 5ae99e27d..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/jute/compiler/generated/RccTokenManager.java +++ /dev/null @@ -1,833 +0,0 @@ -/* Generated By:JavaCC: Do not edit this line. RccTokenManager.java */ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you 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. - */ - -package org.apache.jute.compiler.generated; -import org.apache.jute.compiler.*; -import java.util.ArrayList; -import java.util.Hashtable; -import java.util.Iterator; -import java.io.File; -import java.io.FileReader; -import java.io.FileNotFoundException; -import java.io.IOException; - -public class RccTokenManager implements RccConstants -{ - public java.io.PrintStream debugStream = System.out; - public void setDebugStream(java.io.PrintStream ds) { debugStream = ds; } -private final int jjMoveStringLiteralDfa0_1() -{ - return jjMoveNfa_1(0, 0); -} -private final void jjCheckNAdd(int state) -{ - if (jjrounds[state] != jjround) - { - jjstateSet[jjnewStateCnt++] = state; - jjrounds[state] = jjround; - } -} -private final void jjAddStates(int start, int end) -{ - do { - jjstateSet[jjnewStateCnt++] = jjnextStates[start]; - } while (start++ != end); -} -private final void jjCheckNAddTwoStates(int state1, int state2) -{ - jjCheckNAdd(state1); - jjCheckNAdd(state2); -} -private final void jjCheckNAddStates(int start, int end) -{ - do { - jjCheckNAdd(jjnextStates[start]); - } while (start++ != end); -} -private final void jjCheckNAddStates(int start) -{ - jjCheckNAdd(jjnextStates[start]); - jjCheckNAdd(jjnextStates[start + 1]); -} -private final int jjMoveNfa_1(int startState, int curPos) -{ - int[] nextStates; - int startsAt = 0; - jjnewStateCnt = 3; - int i = 1; - jjstateSet[0] = startState; - int j, kind = 0x7fffffff; - for (;;) - { - if (++jjround == 0x7fffffff) - ReInitRounds(); - if (curChar < 64) - { - long l = 1L << curChar; - MatchLoop: do - { - switch(jjstateSet[--i]) - { - case 0: - if ((0x2400L & l) != 0L) - { - if (kind > 6) - kind = 6; - } - if (curChar == 13) - jjstateSet[jjnewStateCnt++] = 1; - break; - case 1: - if (curChar == 10 && kind > 6) - kind = 6; - break; - case 2: - if (curChar == 13) - jjstateSet[jjnewStateCnt++] = 1; - break; - default : break; - } - } while(i != startsAt); - } - else if (curChar < 128) - { - long l = 1L << (curChar & 077); - MatchLoop: do - { - switch(jjstateSet[--i]) - { - default : break; - } - } while(i != startsAt); - } - else - { - int i2 = (curChar & 0xff) >> 6; - long l2 = 1L << (curChar & 077); - MatchLoop: do - { - switch(jjstateSet[--i]) - { - default : break; - } - } while(i != startsAt); - } - if (kind != 0x7fffffff) - { - jjmatchedKind = kind; - jjmatchedPos = curPos; - kind = 0x7fffffff; - } - ++curPos; - if ((i = jjnewStateCnt) == (startsAt = 3 - (jjnewStateCnt = startsAt))) - return curPos; - try { curChar = input_stream.readChar(); } - catch(java.io.IOException e) { return curPos; } - } -} -private final int jjStopStringLiteralDfa_0(int pos, long active0) -{ - switch (pos) - { - case 0: - if ((active0 & 0xfff800L) != 0L) - { - jjmatchedKind = 32; - return 4; - } - return -1; - case 1: - if ((active0 & 0xfff800L) != 0L) - { - jjmatchedKind = 32; - jjmatchedPos = 1; - return 4; - } - return -1; - case 2: - if ((active0 & 0x7ef800L) != 0L) - { - jjmatchedKind = 32; - jjmatchedPos = 2; - return 4; - } - if ((active0 & 0x810000L) != 0L) - return 4; - return -1; - case 3: - if ((active0 & 0x24000L) != 0L) - return 4; - if ((active0 & 0x7cb800L) != 0L) - { - jjmatchedKind = 32; - jjmatchedPos = 3; - return 4; - } - return -1; - case 4: - if ((active0 & 0x41000L) != 0L) - return 4; - if ((active0 & 0x78a800L) != 0L) - { - jjmatchedKind = 32; - jjmatchedPos = 4; - return 4; - } - return -1; - case 5: - if ((active0 & 0x680800L) != 0L) - return 4; - if ((active0 & 0x10a000L) != 0L) - { - jjmatchedKind = 32; - jjmatchedPos = 5; - return 4; - } - return -1; - default : - return -1; - } -} -private final int jjStartNfa_0(int pos, long active0) -{ - return jjMoveNfa_0(jjStopStringLiteralDfa_0(pos, active0), pos + 1); -} -private final int jjStopAtPos(int pos, int kind) -{ - jjmatchedKind = kind; - jjmatchedPos = pos; - return pos + 1; -} -private final int jjStartNfaWithStates_0(int pos, int kind, int state) -{ - jjmatchedKind = kind; - jjmatchedPos = pos; - try { curChar = input_stream.readChar(); } - catch(java.io.IOException e) { return pos + 1; } - return jjMoveNfa_0(state, pos + 1); -} -private final int jjMoveStringLiteralDfa0_0() -{ - switch(curChar) - { - case 44: - return jjStopAtPos(0, 29); - case 46: - return jjStopAtPos(0, 30); - case 47: - return jjMoveStringLiteralDfa1_0(0x120L); - case 59: - return jjStopAtPos(0, 28); - case 60: - return jjStopAtPos(0, 26); - case 62: - return jjStopAtPos(0, 27); - case 98: - return jjMoveStringLiteralDfa1_0(0x20c000L); - case 99: - return jjMoveStringLiteralDfa1_0(0x1000L); - case 100: - return jjMoveStringLiteralDfa1_0(0x80000L); - case 102: - return jjMoveStringLiteralDfa1_0(0x40000L); - case 105: - return jjMoveStringLiteralDfa1_0(0x12000L); - case 108: - return jjMoveStringLiteralDfa1_0(0x20000L); - case 109: - return jjMoveStringLiteralDfa1_0(0x800800L); - case 117: - return jjMoveStringLiteralDfa1_0(0x100000L); - case 118: - return jjMoveStringLiteralDfa1_0(0x400000L); - case 123: - return jjStopAtPos(0, 24); - case 125: - return jjStopAtPos(0, 25); - default : - return jjMoveNfa_0(0, 0); - } -} -private final int jjMoveStringLiteralDfa1_0(long active0) -{ - try { curChar = input_stream.readChar(); } - catch(java.io.IOException e) { - jjStopStringLiteralDfa_0(0, active0); - return 1; - } - switch(curChar) - { - case 42: - if ((active0 & 0x100L) != 0L) - return jjStopAtPos(1, 8); - break; - case 47: - if ((active0 & 0x20L) != 0L) - return jjStopAtPos(1, 5); - break; - case 97: - return jjMoveStringLiteralDfa2_0(active0, 0x800000L); - case 101: - return jjMoveStringLiteralDfa2_0(active0, 0x400000L); - case 108: - return jjMoveStringLiteralDfa2_0(active0, 0x41000L); - case 110: - return jjMoveStringLiteralDfa2_0(active0, 0x12000L); - case 111: - return jjMoveStringLiteralDfa2_0(active0, 0xa8800L); - case 115: - return jjMoveStringLiteralDfa2_0(active0, 0x100000L); - case 117: - return jjMoveStringLiteralDfa2_0(active0, 0x200000L); - case 121: - return jjMoveStringLiteralDfa2_0(active0, 0x4000L); - default : - break; - } - return jjStartNfa_0(0, active0); -} -private final int jjMoveStringLiteralDfa2_0(long old0, long active0) -{ - if (((active0 &= old0)) == 0L) - return jjStartNfa_0(0, old0); - try { curChar = input_stream.readChar(); } - catch(java.io.IOException e) { - jjStopStringLiteralDfa_0(1, active0); - return 2; - } - switch(curChar) - { - case 97: - return jjMoveStringLiteralDfa3_0(active0, 0x1000L); - case 99: - return jjMoveStringLiteralDfa3_0(active0, 0x402000L); - case 100: - return jjMoveStringLiteralDfa3_0(active0, 0x800L); - case 102: - return jjMoveStringLiteralDfa3_0(active0, 0x200000L); - case 110: - return jjMoveStringLiteralDfa3_0(active0, 0x20000L); - case 111: - return jjMoveStringLiteralDfa3_0(active0, 0x48000L); - case 112: - if ((active0 & 0x800000L) != 0L) - return jjStartNfaWithStates_0(2, 23, 4); - break; - case 116: - if ((active0 & 0x10000L) != 0L) - return jjStartNfaWithStates_0(2, 16, 4); - return jjMoveStringLiteralDfa3_0(active0, 0x104000L); - case 117: - return jjMoveStringLiteralDfa3_0(active0, 0x80000L); - default : - break; - } - return jjStartNfa_0(1, active0); -} -private final int jjMoveStringLiteralDfa3_0(long old0, long active0) -{ - if (((active0 &= old0)) == 0L) - return jjStartNfa_0(1, old0); - try { curChar = input_stream.readChar(); } - catch(java.io.IOException e) { - jjStopStringLiteralDfa_0(2, active0); - return 3; - } - switch(curChar) - { - case 97: - return jjMoveStringLiteralDfa4_0(active0, 0x40000L); - case 98: - return jjMoveStringLiteralDfa4_0(active0, 0x80000L); - case 101: - if ((active0 & 0x4000L) != 0L) - return jjStartNfaWithStates_0(3, 14, 4); - break; - case 102: - return jjMoveStringLiteralDfa4_0(active0, 0x200000L); - case 103: - if ((active0 & 0x20000L) != 0L) - return jjStartNfaWithStates_0(3, 17, 4); - break; - case 108: - return jjMoveStringLiteralDfa4_0(active0, 0xa000L); - case 114: - return jjMoveStringLiteralDfa4_0(active0, 0x100000L); - case 115: - return jjMoveStringLiteralDfa4_0(active0, 0x1000L); - case 116: - return jjMoveStringLiteralDfa4_0(active0, 0x400000L); - case 117: - return jjMoveStringLiteralDfa4_0(active0, 0x800L); - default : - break; - } - return jjStartNfa_0(2, active0); -} -private final int jjMoveStringLiteralDfa4_0(long old0, long active0) -{ - if (((active0 &= old0)) == 0L) - return jjStartNfa_0(2, old0); - try { curChar = input_stream.readChar(); } - catch(java.io.IOException e) { - jjStopStringLiteralDfa_0(3, active0); - return 4; - } - switch(curChar) - { - case 101: - return jjMoveStringLiteralDfa5_0(active0, 0x208000L); - case 105: - return jjMoveStringLiteralDfa5_0(active0, 0x100000L); - case 108: - return jjMoveStringLiteralDfa5_0(active0, 0x80800L); - case 111: - return jjMoveStringLiteralDfa5_0(active0, 0x400000L); - case 115: - if ((active0 & 0x1000L) != 0L) - return jjStartNfaWithStates_0(4, 12, 4); - break; - case 116: - if ((active0 & 0x40000L) != 0L) - return jjStartNfaWithStates_0(4, 18, 4); - break; - case 117: - return jjMoveStringLiteralDfa5_0(active0, 0x2000L); - default : - break; - } - return jjStartNfa_0(3, active0); -} -private final int jjMoveStringLiteralDfa5_0(long old0, long active0) -{ - if (((active0 &= old0)) == 0L) - return jjStartNfa_0(3, old0); - try { curChar = input_stream.readChar(); } - catch(java.io.IOException e) { - jjStopStringLiteralDfa_0(4, active0); - return 5; - } - switch(curChar) - { - case 97: - return jjMoveStringLiteralDfa6_0(active0, 0x8000L); - case 100: - return jjMoveStringLiteralDfa6_0(active0, 0x2000L); - case 101: - if ((active0 & 0x800L) != 0L) - return jjStartNfaWithStates_0(5, 11, 4); - else if ((active0 & 0x80000L) != 0L) - return jjStartNfaWithStates_0(5, 19, 4); - break; - case 110: - return jjMoveStringLiteralDfa6_0(active0, 0x100000L); - case 114: - if ((active0 & 0x200000L) != 0L) - return jjStartNfaWithStates_0(5, 21, 4); - else if ((active0 & 0x400000L) != 0L) - return jjStartNfaWithStates_0(5, 22, 4); - break; - default : - break; - } - return jjStartNfa_0(4, active0); -} -private final int jjMoveStringLiteralDfa6_0(long old0, long active0) -{ - if (((active0 &= old0)) == 0L) - return jjStartNfa_0(4, old0); - try { curChar = input_stream.readChar(); } - catch(java.io.IOException e) { - jjStopStringLiteralDfa_0(5, active0); - return 6; - } - switch(curChar) - { - case 101: - if ((active0 & 0x2000L) != 0L) - return jjStartNfaWithStates_0(6, 13, 4); - break; - case 103: - if ((active0 & 0x100000L) != 0L) - return jjStartNfaWithStates_0(6, 20, 4); - break; - case 110: - if ((active0 & 0x8000L) != 0L) - return jjStartNfaWithStates_0(6, 15, 4); - break; - default : - break; - } - return jjStartNfa_0(5, active0); -} -static final long[] jjbitVec0 = { - 0x0L, 0x0L, 0xffffffffffffffffL, 0xffffffffffffffffL -}; -private final int jjMoveNfa_0(int startState, int curPos) -{ - int[] nextStates; - int startsAt = 0; - jjnewStateCnt = 5; - int i = 1; - jjstateSet[0] = startState; - int j, kind = 0x7fffffff; - for (;;) - { - if (++jjround == 0x7fffffff) - ReInitRounds(); - if (curChar < 64) - { - long l = 1L << curChar; - MatchLoop: do - { - switch(jjstateSet[--i]) - { - case 0: - if (curChar == 34) - jjCheckNAdd(1); - break; - case 1: - if ((0xfffffffbffffffffL & l) != 0L) - jjCheckNAddTwoStates(1, 2); - break; - case 2: - if (curChar == 34 && kind > 31) - kind = 31; - break; - case 4: - if ((0x3ff000000000000L & l) == 0L) - break; - if (kind > 32) - kind = 32; - jjstateSet[jjnewStateCnt++] = 4; - break; - default : break; - } - } while(i != startsAt); - } - else if (curChar < 128) - { - long l = 1L << (curChar & 077); - MatchLoop: do - { - switch(jjstateSet[--i]) - { - case 0: - if ((0x7fffffe07fffffeL & l) == 0L) - break; - if (kind > 32) - kind = 32; - jjCheckNAdd(4); - break; - case 1: - jjAddStates(0, 1); - break; - case 4: - if ((0x7fffffe87fffffeL & l) == 0L) - break; - if (kind > 32) - kind = 32; - jjCheckNAdd(4); - break; - default : break; - } - } while(i != startsAt); - } - else - { - int i2 = (curChar & 0xff) >> 6; - long l2 = 1L << (curChar & 077); - MatchLoop: do - { - switch(jjstateSet[--i]) - { - case 1: - if ((jjbitVec0[i2] & l2) != 0L) - jjAddStates(0, 1); - break; - default : break; - } - } while(i != startsAt); - } - if (kind != 0x7fffffff) - { - jjmatchedKind = kind; - jjmatchedPos = curPos; - kind = 0x7fffffff; - } - ++curPos; - if ((i = jjnewStateCnt) == (startsAt = 5 - (jjnewStateCnt = startsAt))) - return curPos; - try { curChar = input_stream.readChar(); } - catch(java.io.IOException e) { return curPos; } - } -} -private final int jjMoveStringLiteralDfa0_2() -{ - switch(curChar) - { - case 42: - return jjMoveStringLiteralDfa1_2(0x200L); - default : - return 1; - } -} -private final int jjMoveStringLiteralDfa1_2(long active0) -{ - try { curChar = input_stream.readChar(); } - catch(java.io.IOException e) { - return 1; - } - switch(curChar) - { - case 47: - if ((active0 & 0x200L) != 0L) - return jjStopAtPos(1, 9); - break; - default : - return 2; - } - return 2; -} -static final int[] jjnextStates = { - 1, 2, -}; -public static final String[] jjstrLiteralImages = { -"", null, null, null, null, null, null, null, null, null, null, -"\155\157\144\165\154\145", "\143\154\141\163\163", "\151\156\143\154\165\144\145", "\142\171\164\145", -"\142\157\157\154\145\141\156", "\151\156\164", "\154\157\156\147", "\146\154\157\141\164", -"\144\157\165\142\154\145", "\165\163\164\162\151\156\147", "\142\165\146\146\145\162", -"\166\145\143\164\157\162", "\155\141\160", "\173", "\175", "\74", "\76", "\73", "\54", "\56", null, null, }; -public static final String[] lexStateNames = { - "DEFAULT", - "WithinOneLineComment", - "WithinMultiLineComment", -}; -public static final int[] jjnewLexState = { - -1, -1, -1, -1, -1, 1, 0, -1, 2, 0, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -}; -static final long[] jjtoToken = { - 0x1fffff801L, -}; -static final long[] jjtoSkip = { - 0x37eL, -}; -static final long[] jjtoSpecial = { - 0x360L, -}; -static final long[] jjtoMore = { - 0x480L, -}; -protected SimpleCharStream input_stream; -private final int[] jjrounds = new int[5]; -private final int[] jjstateSet = new int[10]; -StringBuffer image; -int jjimageLen; -int lengthOfMatch; -protected char curChar; -public RccTokenManager(SimpleCharStream stream){ - if (SimpleCharStream.staticFlag) - throw new Error("ERROR: Cannot use a static CharStream class with a non-static lexical analyzer."); - input_stream = stream; -} -public RccTokenManager(SimpleCharStream stream, int lexState){ - this(stream); - SwitchTo(lexState); -} -public void ReInit(SimpleCharStream stream) -{ - jjmatchedPos = jjnewStateCnt = 0; - curLexState = defaultLexState; - input_stream = stream; - ReInitRounds(); -} -private final void ReInitRounds() -{ - int i; - jjround = 0x80000001; - for (i = 5; i-- > 0;) - jjrounds[i] = 0x80000000; -} -public void ReInit(SimpleCharStream stream, int lexState) -{ - ReInit(stream); - SwitchTo(lexState); -} -public void SwitchTo(int lexState) -{ - if (lexState >= 3 || lexState < 0) - throw new TokenMgrError("Error: Ignoring invalid lexical state : " + lexState + ". State unchanged.", TokenMgrError.INVALID_LEXICAL_STATE); - else - curLexState = lexState; -} - -protected Token jjFillToken() -{ - Token t = Token.newToken(jjmatchedKind); - t.kind = jjmatchedKind; - String im = jjstrLiteralImages[jjmatchedKind]; - t.image = (im == null) ? input_stream.GetImage() : im; - t.beginLine = input_stream.getBeginLine(); - t.beginColumn = input_stream.getBeginColumn(); - t.endLine = input_stream.getEndLine(); - t.endColumn = input_stream.getEndColumn(); - return t; -} - -int curLexState = 0; -int defaultLexState = 0; -int jjnewStateCnt; -int jjround; -int jjmatchedPos; -int jjmatchedKind; - -public Token getNextToken() -{ - int kind; - Token specialToken = null; - Token matchedToken; - int curPos = 0; - - EOFLoop : - for (;;) - { - try - { - curChar = input_stream.BeginToken(); - } - catch(java.io.IOException e) - { - jjmatchedKind = 0; - matchedToken = jjFillToken(); - matchedToken.specialToken = specialToken; - return matchedToken; - } - image = null; - jjimageLen = 0; - - for (;;) - { - switch(curLexState) - { - case 0: - try { input_stream.backup(0); - while (curChar <= 32 && (0x100002600L & (1L << curChar)) != 0L) - curChar = input_stream.BeginToken(); - } - catch (java.io.IOException e1) { continue EOFLoop; } - jjmatchedKind = 0x7fffffff; - jjmatchedPos = 0; - curPos = jjMoveStringLiteralDfa0_0(); - break; - case 1: - jjmatchedKind = 0x7fffffff; - jjmatchedPos = 0; - curPos = jjMoveStringLiteralDfa0_1(); - if (jjmatchedPos == 0 && jjmatchedKind > 7) - { - jjmatchedKind = 7; - } - break; - case 2: - jjmatchedKind = 0x7fffffff; - jjmatchedPos = 0; - curPos = jjMoveStringLiteralDfa0_2(); - if (jjmatchedPos == 0 && jjmatchedKind > 10) - { - jjmatchedKind = 10; - } - break; - } - if (jjmatchedKind != 0x7fffffff) - { - if (jjmatchedPos + 1 < curPos) - input_stream.backup(curPos - jjmatchedPos - 1); - if ((jjtoToken[jjmatchedKind >> 6] & (1L << (jjmatchedKind & 077))) != 0L) - { - matchedToken = jjFillToken(); - matchedToken.specialToken = specialToken; - if (jjnewLexState[jjmatchedKind] != -1) - curLexState = jjnewLexState[jjmatchedKind]; - return matchedToken; - } - else if ((jjtoSkip[jjmatchedKind >> 6] & (1L << (jjmatchedKind & 077))) != 0L) - { - if ((jjtoSpecial[jjmatchedKind >> 6] & (1L << (jjmatchedKind & 077))) != 0L) - { - matchedToken = jjFillToken(); - if (specialToken == null) - specialToken = matchedToken; - else - { - matchedToken.specialToken = specialToken; - specialToken = (specialToken.next = matchedToken); - } - SkipLexicalActions(matchedToken); - } - else - SkipLexicalActions(null); - if (jjnewLexState[jjmatchedKind] != -1) - curLexState = jjnewLexState[jjmatchedKind]; - continue EOFLoop; - } - jjimageLen += jjmatchedPos + 1; - if (jjnewLexState[jjmatchedKind] != -1) - curLexState = jjnewLexState[jjmatchedKind]; - curPos = 0; - jjmatchedKind = 0x7fffffff; - try { - curChar = input_stream.readChar(); - continue; - } - catch (java.io.IOException e1) { } - } - int error_line = input_stream.getEndLine(); - int error_column = input_stream.getEndColumn(); - String error_after = null; - boolean EOFSeen = false; - try { input_stream.readChar(); input_stream.backup(1); } - catch (java.io.IOException e1) { - EOFSeen = true; - error_after = curPos <= 1 ? "" : input_stream.GetImage(); - if (curChar == '\n' || curChar == '\r') { - error_line++; - error_column = 0; - } - else - error_column++; - } - if (!EOFSeen) { - input_stream.backup(1); - error_after = curPos <= 1 ? "" : input_stream.GetImage(); - } - throw new TokenMgrError(EOFSeen, curLexState, error_line, error_column, error_after, curChar, TokenMgrError.LEXICAL_ERROR); - } - } -} - -void SkipLexicalActions(Token matchedToken) -{ - switch(jjmatchedKind) - { - default : - break; - } -} -} diff --git a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/jute/compiler/generated/SimpleCharStream.java b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/jute/compiler/generated/SimpleCharStream.java deleted file mode 100644 index e38b4517b..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/jute/compiler/generated/SimpleCharStream.java +++ /dev/null @@ -1,457 +0,0 @@ -/* Generated By:JavaCC: Do not edit this line. SimpleCharStream.java Version 4.0 */ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you 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. - */ - -package org.apache.jute.compiler.generated; - -/** - * An implementation of interface CharStream, where the stream is assumed to - * contain only ASCII characters (without unicode processing). - */ - -public class SimpleCharStream -{ - public static final boolean staticFlag = false; - int bufsize; - int available; - int tokenBegin; - public int bufpos = -1; - protected int bufline[]; - protected int bufcolumn[]; - - protected int column = 0; - protected int line = 1; - - protected boolean prevCharIsCR = false; - protected boolean prevCharIsLF = false; - - protected java.io.Reader inputStream; - - protected char[] buffer; - protected int maxNextCharInd = 0; - protected int inBuf = 0; - protected int tabSize = 8; - - protected void setTabSize(int i) { tabSize = i; } - protected int getTabSize(int i) { return tabSize; } - - - protected void ExpandBuff(boolean wrapAround) - { - char[] newbuffer = new char[bufsize + 2048]; - int newbufline[] = new int[bufsize + 2048]; - int newbufcolumn[] = new int[bufsize + 2048]; - - try - { - if (wrapAround) - { - System.arraycopy(buffer, tokenBegin, newbuffer, 0, bufsize - tokenBegin); - System.arraycopy(buffer, 0, newbuffer, - bufsize - tokenBegin, bufpos); - buffer = newbuffer; - - System.arraycopy(bufline, tokenBegin, newbufline, 0, bufsize - tokenBegin); - System.arraycopy(bufline, 0, newbufline, bufsize - tokenBegin, bufpos); - bufline = newbufline; - - System.arraycopy(bufcolumn, tokenBegin, newbufcolumn, 0, bufsize - tokenBegin); - System.arraycopy(bufcolumn, 0, newbufcolumn, bufsize - tokenBegin, bufpos); - bufcolumn = newbufcolumn; - - maxNextCharInd = (bufpos += (bufsize - tokenBegin)); - } - else - { - System.arraycopy(buffer, tokenBegin, newbuffer, 0, bufsize - tokenBegin); - buffer = newbuffer; - - System.arraycopy(bufline, tokenBegin, newbufline, 0, bufsize - tokenBegin); - bufline = newbufline; - - System.arraycopy(bufcolumn, tokenBegin, newbufcolumn, 0, bufsize - tokenBegin); - bufcolumn = newbufcolumn; - - maxNextCharInd = (bufpos -= tokenBegin); - } - } - catch (Throwable t) - { - throw new Error(t.getMessage()); - } - - - bufsize += 2048; - available = bufsize; - tokenBegin = 0; - } - - protected void FillBuff() throws java.io.IOException - { - if (maxNextCharInd == available) - { - if (available == bufsize) - { - if (tokenBegin > 2048) - { - bufpos = maxNextCharInd = 0; - available = tokenBegin; - } - else if (tokenBegin < 0) - bufpos = maxNextCharInd = 0; - else - ExpandBuff(false); - } - else if (available > tokenBegin) - available = bufsize; - else if ((tokenBegin - available) < 2048) - ExpandBuff(true); - else - available = tokenBegin; - } - - int i; - try { - if ((i = inputStream.read(buffer, maxNextCharInd, - available - maxNextCharInd)) == -1) - { - inputStream.close(); - throw new java.io.IOException(); - } - else - maxNextCharInd += i; - return; - } - catch(java.io.IOException e) { - --bufpos; - backup(0); - if (tokenBegin == -1) - tokenBegin = bufpos; - throw e; - } - } - - public char BeginToken() throws java.io.IOException - { - tokenBegin = -1; - char c = readChar(); - tokenBegin = bufpos; - - return c; - } - - protected void UpdateLineColumn(char c) - { - column++; - - if (prevCharIsLF) - { - prevCharIsLF = false; - line += (column = 1); - } - else if (prevCharIsCR) - { - prevCharIsCR = false; - if (c == '\n') - { - prevCharIsLF = true; - } - else - line += (column = 1); - } - - switch (c) - { - case '\r' : - prevCharIsCR = true; - break; - case '\n' : - prevCharIsLF = true; - break; - case '\t' : - column--; - column += (tabSize - (column % tabSize)); - break; - default : - break; - } - - bufline[bufpos] = line; - bufcolumn[bufpos] = column; - } - - public char readChar() throws java.io.IOException - { - if (inBuf > 0) - { - --inBuf; - - if (++bufpos == bufsize) - bufpos = 0; - - return buffer[bufpos]; - } - - if (++bufpos >= maxNextCharInd) - FillBuff(); - - char c = buffer[bufpos]; - - UpdateLineColumn(c); - return (c); - } - - /** - * @deprecated - * @see #getEndColumn - */ - - public int getColumn() { - return bufcolumn[bufpos]; - } - - /** - * @deprecated - * @see #getEndLine - */ - - public int getLine() { - return bufline[bufpos]; - } - - public int getEndColumn() { - return bufcolumn[bufpos]; - } - - public int getEndLine() { - return bufline[bufpos]; - } - - public int getBeginColumn() { - return bufcolumn[tokenBegin]; - } - - public int getBeginLine() { - return bufline[tokenBegin]; - } - - public void backup(int amount) { - - inBuf += amount; - if ((bufpos -= amount) < 0) - bufpos += bufsize; - } - - public SimpleCharStream(java.io.Reader dstream, int startline, - int startcolumn, int buffersize) - { - inputStream = dstream; - line = startline; - column = startcolumn - 1; - - available = bufsize = buffersize; - buffer = new char[buffersize]; - bufline = new int[buffersize]; - bufcolumn = new int[buffersize]; - } - - public SimpleCharStream(java.io.Reader dstream, int startline, - int startcolumn) - { - this(dstream, startline, startcolumn, 4096); - } - - public SimpleCharStream(java.io.Reader dstream) - { - this(dstream, 1, 1, 4096); - } - public void ReInit(java.io.Reader dstream, int startline, - int startcolumn, int buffersize) - { - inputStream = dstream; - line = startline; - column = startcolumn - 1; - - if (buffer == null || buffersize != buffer.length) - { - available = bufsize = buffersize; - buffer = new char[buffersize]; - bufline = new int[buffersize]; - bufcolumn = new int[buffersize]; - } - prevCharIsLF = prevCharIsCR = false; - tokenBegin = inBuf = maxNextCharInd = 0; - bufpos = -1; - } - - public void ReInit(java.io.Reader dstream, int startline, - int startcolumn) - { - ReInit(dstream, startline, startcolumn, 4096); - } - - public void ReInit(java.io.Reader dstream) - { - ReInit(dstream, 1, 1, 4096); - } - public SimpleCharStream(java.io.InputStream dstream, String encoding, int startline, - int startcolumn, int buffersize) throws java.io.UnsupportedEncodingException - { - this(encoding == null ? new java.io.InputStreamReader(dstream) : new java.io.InputStreamReader(dstream, encoding), startline, startcolumn, buffersize); - } - - public SimpleCharStream(java.io.InputStream dstream, int startline, - int startcolumn, int buffersize) - { - this(new java.io.InputStreamReader(dstream), startline, startcolumn, buffersize); - } - - public SimpleCharStream(java.io.InputStream dstream, String encoding, int startline, - int startcolumn) throws java.io.UnsupportedEncodingException - { - this(dstream, encoding, startline, startcolumn, 4096); - } - - public SimpleCharStream(java.io.InputStream dstream, int startline, - int startcolumn) - { - this(dstream, startline, startcolumn, 4096); - } - - public SimpleCharStream(java.io.InputStream dstream, String encoding) throws java.io.UnsupportedEncodingException - { - this(dstream, encoding, 1, 1, 4096); - } - - public SimpleCharStream(java.io.InputStream dstream) - { - this(dstream, 1, 1, 4096); - } - - public void ReInit(java.io.InputStream dstream, String encoding, int startline, - int startcolumn, int buffersize) throws java.io.UnsupportedEncodingException - { - ReInit(encoding == null ? new java.io.InputStreamReader(dstream) : new java.io.InputStreamReader(dstream, encoding), startline, startcolumn, buffersize); - } - - public void ReInit(java.io.InputStream dstream, int startline, - int startcolumn, int buffersize) - { - ReInit(new java.io.InputStreamReader(dstream), startline, startcolumn, buffersize); - } - - public void ReInit(java.io.InputStream dstream, String encoding) throws java.io.UnsupportedEncodingException - { - ReInit(dstream, encoding, 1, 1, 4096); - } - - public void ReInit(java.io.InputStream dstream) - { - ReInit(dstream, 1, 1, 4096); - } - public void ReInit(java.io.InputStream dstream, String encoding, int startline, - int startcolumn) throws java.io.UnsupportedEncodingException - { - ReInit(dstream, encoding, startline, startcolumn, 4096); - } - public void ReInit(java.io.InputStream dstream, int startline, - int startcolumn) - { - ReInit(dstream, startline, startcolumn, 4096); - } - public String GetImage() - { - if (bufpos >= tokenBegin) - return new String(buffer, tokenBegin, bufpos - tokenBegin + 1); - else - return new String(buffer, tokenBegin, bufsize - tokenBegin) + - new String(buffer, 0, bufpos + 1); - } - - public char[] GetSuffix(int len) - { - char[] ret = new char[len]; - - if ((bufpos + 1) >= len) - System.arraycopy(buffer, bufpos - len + 1, ret, 0, len); - else - { - System.arraycopy(buffer, bufsize - (len - bufpos - 1), ret, 0, - len - bufpos - 1); - System.arraycopy(buffer, 0, ret, len - bufpos - 1, bufpos + 1); - } - - return ret; - } - - public void Done() - { - buffer = null; - bufline = null; - bufcolumn = null; - } - - /** - * Method to adjust line and column numbers for the start of a token. - */ - public void adjustBeginLineColumn(int newLine, int newCol) - { - int start = tokenBegin; - int len; - - if (bufpos >= tokenBegin) - { - len = bufpos - tokenBegin + inBuf + 1; - } - else - { - len = bufsize - tokenBegin + bufpos + 1 + inBuf; - } - - int i = 0, j = 0, k = 0; - int nextColDiff = 0, columnDiff = 0; - - while (i < len && - bufline[j = start % bufsize] == bufline[k = ++start % bufsize]) - { - bufline[j] = newLine; - nextColDiff = columnDiff + bufcolumn[k] - bufcolumn[j]; - bufcolumn[j] = newCol + columnDiff; - columnDiff = nextColDiff; - i++; - } - - if (i < len) - { - bufline[j] = newLine++; - bufcolumn[j] = newCol + columnDiff; - - while (i++ < len) - { - if (bufline[j = start % bufsize] != bufline[++start % bufsize]) - bufline[j] = newLine++; - else - bufline[j] = newLine; - } - } - - line = bufline[j]; - column = bufcolumn[j]; - } - -} diff --git a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/jute/compiler/generated/Token.java b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/jute/compiler/generated/Token.java deleted file mode 100644 index 3e7018b5d..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/jute/compiler/generated/Token.java +++ /dev/null @@ -1,99 +0,0 @@ -/* Generated By:JavaCC: Do not edit this line. Token.java Version 3.0 */ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you 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. - */ - -package org.apache.jute.compiler.generated; - -/** - * Describes the input token stream. - */ - -public class Token { - - /** - * An integer that describes the kind of this token. This numbering - * system is determined by JavaCCParser, and a table of these numbers is - * stored in the file ...Constants.java. - */ - public int kind; - - /** - * beginLine and beginColumn describe the position of the first character - * of this token; endLine and endColumn describe the position of the - * last character of this token. - */ - public int beginLine, beginColumn, endLine, endColumn; - - /** - * The string image of the token. - */ - public String image; - - /** - * A reference to the next regular (non-special) token from the input - * stream. If this is the last token from the input stream, or if the - * token manager has not read tokens beyond this one, this field is - * set to null. This is true only if this token is also a regular - * token. Otherwise, see below for a description of the contents of - * this field. - */ - public Token next; - - /** - * This field is used to access special tokens that occur prior to this - * token, but after the immediately preceding regular (non-special) token. - * If there are no such special tokens, this field is set to null. - * When there are more than one such special token, this field refers - * to the last of these special tokens, which in turn refers to the next - * previous special token through its specialToken field, and so on - * until the first special token (whose specialToken field is null). - * The next fields of special tokens refer to other special tokens that - * immediately follow it (without an intervening regular token). If there - * is no such token, this field is null. - */ - public Token specialToken; - - /** - * Returns the image. - */ - public String toString() - { - return image; - } - - /** - * Returns a new Token object, by default. However, if you want, you - * can create and return subclass objects based on the value of ofKind. - * Simply add the cases to the switch for all those special cases. - * For example, if you have a subclass of Token called IDToken that - * you want to create if ofKind is ID, simlpy add something like : - * - * case MyParserConstants.ID : return new IDToken(); - * - * to the following switch statement. Then you can cast matchedToken - * variable to the appropriate type and use it in your lexical actions. - */ - public static final Token newToken(int ofKind) - { - switch(ofKind) - { - default : return new Token(); - } - } - -} diff --git a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/jute/compiler/generated/TokenMgrError.java b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/jute/compiler/generated/TokenMgrError.java deleted file mode 100644 index e2469628a..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/jute/compiler/generated/TokenMgrError.java +++ /dev/null @@ -1,151 +0,0 @@ -/* Generated By:JavaCC: Do not edit this line. TokenMgrError.java Version 3.0 */ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you 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. - */ - -package org.apache.jute.compiler.generated; - -public class TokenMgrError extends Error -{ - /* - * Ordinals for various reasons why an Error of this type can be thrown. - */ - - /** - * Lexical error occured. - */ - static final int LEXICAL_ERROR = 0; - - /** - * An attempt wass made to create a second instance of a static token manager. - */ - static final int STATIC_LEXER_ERROR = 1; - - /** - * Tried to change to an invalid lexical state. - */ - static final int INVALID_LEXICAL_STATE = 2; - - /** - * Detected (and bailed out of) an infinite loop in the token manager. - */ - static final int LOOP_DETECTED = 3; - - /** - * Indicates the reason why the exception is thrown. It will have - * one of the above 4 values. - */ - int errorCode; - - /** - * Replaces unprintable characters by their espaced (or unicode escaped) - * equivalents in the given string - */ - protected static final String addEscapes(String str) { - StringBuffer retval = new StringBuffer(); - char ch; - for (int i = 0; i < str.length(); i++) { - switch (str.charAt(i)) - { - case 0 : - continue; - case '\b': - retval.append("\\b"); - continue; - case '\t': - retval.append("\\t"); - continue; - case '\n': - retval.append("\\n"); - continue; - case '\f': - retval.append("\\f"); - continue; - case '\r': - retval.append("\\r"); - continue; - case '\"': - retval.append("\\\""); - continue; - case '\'': - retval.append("\\\'"); - continue; - case '\\': - retval.append("\\\\"); - continue; - default: - if ((ch = str.charAt(i)) < 0x20 || ch > 0x7e) { - String s = "0000" + Integer.toString(ch, 16); - retval.append("\\u" + s.substring(s.length() - 4, s.length())); - } else { - retval.append(ch); - } - continue; - } - } - return retval.toString(); - } - - /** - * Returns a detailed message for the Error when it is thrown by the - * token manager to indicate a lexical error. - * Parameters : - * EOFSeen : indicates if EOF caused the lexicl error - * curLexState : lexical state in which this error occured - * errorLine : line number when the error occured - * errorColumn : column number when the error occured - * errorAfter : prefix that was seen before this error occured - * curchar : the offending character - * Note: You can customize the lexical error message by modifying this method. - */ - protected static String LexicalError(boolean EOFSeen, int lexState, int errorLine, int errorColumn, String errorAfter, char curChar) { - return("Lexical error at line " + - errorLine + ", column " + - errorColumn + ". Encountered: " + - (EOFSeen ? " " : ("\"" + addEscapes(String.valueOf(curChar)) + "\"") + " (" + (int)curChar + "), ") + - "after : \"" + addEscapes(errorAfter) + "\""); - } - - /** - * You can also modify the body of this method to customize your error messages. - * For example, cases like LOOP_DETECTED and INVALID_LEXICAL_STATE are not - * of end-users concern, so you can return something like : - * - * "Internal Error : Please file a bug report .... " - * - * from this method for such cases in the release version of your parser. - */ - public String getMessage() { - return super.getMessage(); - } - - /* - * Constructors of various flavors follow. - */ - - public TokenMgrError() { - } - - public TokenMgrError(String message, int reason) { - super(message); - errorCode = reason; - } - - public TokenMgrError(boolean EOFSeen, int lexState, int errorLine, int errorColumn, String errorAfter, char curChar, int reason) { - this(LexicalError(EOFSeen, lexState, errorLine, errorColumn, errorAfter, curChar), reason); - } -} diff --git a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/jute/compiler/generated/package.html b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/jute/compiler/generated/package.html deleted file mode 100644 index 8ef8a8c7d..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/jute/compiler/generated/package.html +++ /dev/null @@ -1,28 +0,0 @@ - - - - - - Hadoop Record Compiler: Parser - - - This package contains code generated by JavaCC from the - Hadoop record syntax file rcc.jj. For details about the - record file syntax please @see org.apache.hadoop.record. - - diff --git a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/jute/compiler/generated/rcc.jj b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/jute/compiler/generated/rcc.jj deleted file mode 100644 index 94d4f42f6..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/jute/compiler/generated/rcc.jj +++ /dev/null @@ -1,374 +0,0 @@ -options { -STATIC=false; -} - -PARSER_BEGIN(Rcc) -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you 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. - */ - -package org.apache.jute.compiler.generated; - -import org.apache.jute.compiler.*; -import java.util.ArrayList; -import java.util.Hashtable; -import java.io.File; -import java.io.FileReader; -import java.io.FileNotFoundException; -import java.io.IOException; - -@SuppressWarnings("unused") -public class Rcc { - private static Hashtable recTab = new Hashtable(); - private static String curDir = System.getProperty("user.dir"); - private static String curFileName; - private static String curModuleName; - - public static void main(String args[]) { - String language = "java"; - ArrayList recFiles = new ArrayList(); - JFile curFile=null; - - for (int i=0; i(); - return parser.Input(); - } finally { - try { - reader.close(); - } catch (IOException e) { - } - } - } -} - -PARSER_END(Rcc) - -SKIP : -{ - " " -| "\t" -| "\n" -| "\r" -} - -SPECIAL_TOKEN : -{ - "//" : WithinOneLineComment -} - - SPECIAL_TOKEN : -{ - <("\n" | "\r" | "\r\n" )> : DEFAULT -} - - MORE : -{ - <~[]> -} - -SPECIAL_TOKEN : -{ - "/*" : WithinMultiLineComment -} - - SPECIAL_TOKEN : -{ - "*/" : DEFAULT -} - - MORE : -{ - <~[]> -} - -TOKEN : -{ - -| -| -| -| -| -| -| -| -| -| -| -| -| -| -| -| "> -| -| -| -| -| -} - -JFile Input() : -{ - ArrayList ilist = new ArrayList(); - ArrayList rlist = new ArrayList(); - JFile i; - ArrayList l; -} -{ - ( - i = Include() - { ilist.add(i); } - | l = Module() - { rlist.addAll(l); } - )+ - - { return new JFile(curFileName, ilist, rlist); } -} - -JFile Include() : -{ - String fname; - Token t; -} -{ - - t = - { - JFile ret = null; - fname = t.image.replaceAll("^\"", "").replaceAll("\"$",""); - File file = new File(curDir, fname); - String tmpDir = curDir; - String tmpFile = curFileName; - curDir = file.getParent(); - curFileName = file.getName(); - try { - FileReader reader = new FileReader(file); - Rcc parser = new Rcc(reader); - try { - ret = parser.Input(); - System.out.println(fname + " Parsed Successfully"); - } catch (ParseException e) { - System.out.println(e.toString()); - System.exit(1); - } - try { - reader.close(); - } catch (IOException e) { - } - } catch (FileNotFoundException e) { - System.out.println("File " + fname + - " Not found."); - System.exit(1); - } - curDir = tmpDir; - curFileName = tmpFile; - return ret; - } -} - -ArrayList Module() : -{ - String mName; - ArrayList rlist; -} -{ - - mName = ModuleName() - { curModuleName = mName; } - - rlist = RecordList() - - { return rlist; } -} - -String ModuleName() : -{ - String name = ""; - Token t; -} -{ - t = - { name += t.image; } - ( - - t = - { name += "." + t.image; } - )* - { return name; } -} - -ArrayList RecordList() : -{ - ArrayList rlist = new ArrayList(); - JRecord r; -} -{ - ( - r = Record() - { rlist.add(r); } - )+ - { return rlist; } -} - -JRecord Record() : -{ - String rname; - ArrayList flist = new ArrayList(); - Token t; - JField f; -} -{ - - t = - { rname = t.image; } - - ( - f = Field() - { flist.add(f); } - - )+ - - { - String fqn = curModuleName + "." + rname; - JRecord r = new JRecord(fqn, flist); - recTab.put(fqn, r); - return r; - } -} - -JField Field() : -{ - JType jt; - Token t; -} -{ - jt = Type() - t = - { return new JField(jt, t.image); } -} - -JType Type() : -{ - JType jt; - Token t; - String rname; -} -{ - jt = Map() - { return jt; } -| jt = Vector() - { return jt; } -| - { return new JByte(); } -| - { return new JBoolean(); } -| - { return new JInt(); } -| - { return new JLong(); } -| - { return new JFloat(); } -| - { return new JDouble(); } -| - { return new JString(); } -| - { return new JBuffer(); } -| rname = ModuleName() - { - if (rname.indexOf('.', 0) < 0) { - rname = curModuleName + "." + rname; - } - JRecord r = recTab.get(rname); - if (r == null) { - System.out.println("Type " + rname + " not known. Exiting."); - System.exit(1); - } - return r; - } -} - -JMap Map() : -{ - JType jt1; - JType jt2; -} -{ - - - jt1 = Type() - - jt2 = Type() - - { return new JMap(jt1, jt2); } -} - -JVector Vector() : -{ - JType jt; -} -{ - - - jt = Type() - - { return new JVector(jt); } -} diff --git a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/jute/compiler/package.html b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/jute/compiler/package.html deleted file mode 100644 index 03bdb1bbb..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/jute/compiler/package.html +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - Hadoop Record Compiler - - - This package contains classes needed for code generation - from the hadoop record compiler. CppGenerator and JavaGenerator - are the main entry points from the parser. There are classes - corrsponding to every primitive type and compound type - included in Hadoop record I/O syntax. - - diff --git a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/jute/package.html b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/jute/package.html deleted file mode 100644 index 531a6e37a..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/jute/package.html +++ /dev/null @@ -1,801 +0,0 @@ - - - - - - Hadoop Record I/O - - - Hadoop record I/O contains classes and a record description language - translator for simplifying serialization and deserialization of records in a - language-neutral manner. - -

        Introduction

        - - Software systems of any significant complexity require mechanisms for data -interchange with the outside world. These interchanges typically involve the -marshaling and unmarshaling of logical units of data to and from data streams -(files, network connections, memory buffers etc.). Applications usually have -some code for serializing and deserializing the data types that they manipulate -embedded in them. The work of serialization has several features that make -automatic code generation for it worthwhile. Given a particular output encoding -(binary, XML, etc.), serialization of primitive types and simple compositions -of primitives (structs, vectors etc.) is a very mechanical task. Manually -written serialization code can be susceptible to bugs especially when records -have a large number of fields or a record definition changes between software -versions. Lastly, it can be very useful for applications written in different -programming languages to be able to share and interchange data. This can be -made a lot easier by describing the data records manipulated by these -applications in a language agnostic manner and using the descriptions to derive -implementations of serialization in multiple target languages. - -This document describes Hadoop Record I/O, a mechanism that is aimed -at -
          -
        • enabling the specification of simple serializable data types (records) -
        • enabling the generation of code in multiple target languages for -marshaling and unmarshaling such types -
        • providing target language specific support that will enable application -programmers to incorporate generated code into their applications -
        - -The goals of Hadoop Record I/O are similar to those of mechanisms such as XDR, -ASN.1, PADS and ICE. While these systems all include a DDL that enables -the specification of most record types, they differ widely in what else they -focus on. The focus in Hadoop Record I/O is on data marshaling and -multi-lingual support. We take a translator-based approach to serialization. -Hadoop users have to describe their data in a simple data description -language. The Hadoop DDL translator rcc generates code that users -can invoke in order to read/write their data from/to simple stream -abstractions. Next we list explicitly some of the goals and non-goals of -Hadoop Record I/O. - - -

        Goals

        - -
          -
        • Support for commonly used primitive types. Hadoop should include as -primitives commonly used builtin types from programming languages we intend to -support. - -
        • Support for common data compositions (including recursive compositions). -Hadoop should support widely used composite types such as structs and -vectors. - -
        • Code generation in multiple target languages. Hadoop should be capable of -generating serialization code in multiple target languages and should be -easily extensible to new target languages. The initial target languages are -C++ and Java. - -
        • Support for generated target languages. Hadooop should include support -in the form of headers, libraries, packages for supported target languages -that enable easy inclusion and use of generated code in applications. - -
        • Support for multiple output encodings. Candidates include -packed binary, comma-separated text, XML etc. - -
        • Support for specifying record types in a backwards/forwards compatible -manner. This will probably be in the form of support for optional fields in -records. This version of the document does not include a description of the -planned mechanism, we intend to include it in the next iteration. - -
        - -

        Non-Goals

        - -
          -
        • Serializing existing arbitrary C++ classes. -
        • Serializing complex data structures such as trees, linked lists etc. -
        • Built-in indexing schemes, compression, or check-sums. -
        • Dynamic construction of objects from an XML schema. -
        - -The remainder of this document describes the features of Hadoop record I/O -in more detail. Section 2 describes the data types supported by the system. -Section 3 lays out the DDL syntax with some examples of simple records. -Section 4 describes the process of code generation with rcc. Section 5 -describes target language mappings and support for Hadoop types. We include a -fairly complete description of C++ mappings with intent to include Java and -others in upcoming iterations of this document. The last section talks about -supported output encodings. - - -

        Data Types and Streams

        - -This section describes the primitive and composite types supported by Hadoop. -We aim to support a set of types that can be used to simply and efficiently -express a wide range of record types in different programming languages. - -

        Primitive Types

        - -For the most part, the primitive types of Hadoop map directly to primitive -types in high level programming languages. Special cases are the -ustring (a Unicode string) and buffer types, which we believe -find wide use and which are usually implemented in library code and not -available as language built-ins. Hadoop also supplies these via library code -when a target language built-in is not present and there is no widely -adopted "standard" implementation. The complete list of primitive types is: - -
          -
        • byte: An 8-bit unsigned integer. -
        • boolean: A boolean value. -
        • int: A 32-bit signed integer. -
        • long: A 64-bit signed integer. -
        • float: A single precision floating point number as described by - IEEE-754. -
        • double: A double precision floating point number as described by - IEEE-754. -
        • ustring: A string consisting of Unicode characters. -
        • buffer: An arbitrary sequence of bytes. -
        - - -

        Composite Types

        -Hadoop supports a small set of composite types that enable the description -of simple aggregate types and containers. A composite type is serialized -by sequentially serializing it constituent elements. The supported -composite types are: - -
          - -
        • record: An aggregate type like a C-struct. This is a list of -typed fields that are together considered a single unit of data. A record -is serialized by sequentially serializing its constituent fields. In addition -to serialization a record has comparison operations (equality and less-than) -implemented for it, these are defined as memberwise comparisons. - -
        • vector: A sequence of entries of the same data type, primitive -or composite. - -
        • map: An associative container mapping instances of a key type to -instances of a value type. The key and value types may themselves be primitive -or composite types. - -
        - -

        Streams

        - -Hadoop generates code for serializing and deserializing record types to -abstract streams. For each target language Hadoop defines very simple input -and output stream interfaces. Application writers can usually develop -concrete implementations of these by putting a one method wrapper around -an existing stream implementation. - - -

        DDL Syntax and Examples

        - -We now describe the syntax of the Hadoop data description language. This is -followed by a few examples of DDL usage. - -

        Hadoop DDL Syntax

        - -
        
        -recfile = *include module *record
        -include = "include" path
        -path = (relative-path / absolute-path)
        -module = "module" module-name
        -module-name = name *("." name)
        -record := "class" name "{" 1*(field) "}"
        -field := type name ";"
        -name :=  ALPHA (ALPHA / DIGIT / "_" )*
        -type := (ptype / ctype)
        -ptype := ("byte" / "boolean" / "int" |
        -          "long" / "float" / "double"
        -          "ustring" / "buffer")
        -ctype := (("vector" "<" type ">") /
        -          ("map" "<" type "," type ">" ) ) / name)
        -
        - -A DDL file describes one or more record types. It begins with zero or -more include declarations, a single mandatory module declaration -followed by zero or more class declarations. The semantics of each of -these declarations are described below: - -
          - -
        • include: An include declaration specifies a DDL file to be -referenced when generating code for types in the current DDL file. Record types -in the current compilation unit may refer to types in all included files. -File inclusion is recursive. An include does not trigger code -generation for the referenced file. - -
        • module: Every Hadoop DDL file must have a single module -declaration that follows the list of includes and precedes all record -declarations. A module declaration identifies a scope within which -the names of all types in the current file are visible. Module names are -mapped to C++ namespaces, Java packages etc. in generated code. - -
        • class: Records types are specified through class -declarations. A class declaration is like a Java class declaration. -It specifies a named record type and a list of fields that constitute records -of the type. Usage is illustrated in the following examples. - -
        - -

        Examples

        - -
          -
        • A simple DDL file links.jr with just one record declaration. -
          
          -module links {
          -    class Link {
          -        ustring URL;
          -        boolean isRelative;
          -        ustring anchorText;
          -    };
          -}
          -
          - -
        • A DDL file outlinks.jr which includes another -
          
          -include "links.jr"
          -
          -module outlinks {
          -    class OutLinks {
          -        ustring baseURL;
          -        vector outLinks;
          -    };
          -}
          -
          -
        - -

        Code Generation

        - -The Hadoop translator is written in Java. Invocation is done by executing a -wrapper shell script named named rcc. It takes a list of -record description files as a mandatory argument and an -optional language argument (the default is Java) --language or --l. Thus a typical invocation would look like: -
        
        -$ rcc -l C++  ...
        -
        - - -

        Target Language Mappings and Support

        - -For all target languages, the unit of code generation is a record type. -For each record type, Hadoop generates code for serialization and -deserialization, record comparison and access to record members. - -

        C++

        - -Support for including Hadoop generated C++ code in applications comes in the -form of a header file recordio.hh which needs to be included in source -that uses Hadoop types and a library librecordio.a which applications need -to be linked with. The header declares the Hadoop C++ namespace which defines -appropriate types for the various primitives, the basic interfaces for -records and streams and enumerates the supported serialization encodings. -Declarations of these interfaces and a description of their semantics follow: - -
        
        -namespace hadoop {
        -
        -  enum RecFormat { kBinary, kXML, kCSV };
        -
        -  class InStream {
        -  public:
        -    virtual ssize_t read(void *buf, size_t n) = 0;
        -  };
        -
        -  class OutStream {
        -  public:
        -    virtual ssize_t write(const void *buf, size_t n) = 0;
        -  };
        -
        -  class IOError : public runtime_error {
        -  public:
        -    explicit IOError(const std::string& msg);
        -  };
        -
        -  class IArchive;
        -  class OArchive;
        -
        -  class RecordReader {
        -  public:
        -    RecordReader(InStream& in, RecFormat fmt);
        -    virtual ~RecordReader(void);
        -
        -    virtual void read(Record& rec);
        -  };
        -
        -  class RecordWriter {
        -  public:
        -    RecordWriter(OutStream& out, RecFormat fmt);
        -    virtual ~RecordWriter(void);
        -
        -    virtual void write(Record& rec);
        -  };
        -
        -
        -  class Record {
        -  public:
        -    virtual std::string type(void) const = 0;
        -    virtual std::string signature(void) const = 0;
        -  protected:
        -    virtual bool validate(void) const = 0;
        -
        -    virtual void
        -    serialize(OArchive& oa, const std::string& tag) const = 0;
        -
        -    virtual void
        -    deserialize(IArchive& ia, const std::string& tag) = 0;
        -  };
        -}
        -
        - -
          - -
        • RecFormat: An enumeration of the serialization encodings supported -by this implementation of Hadoop. - -
        • InStream: A simple abstraction for an input stream. This has a -single public read method that reads n bytes from the stream into -the buffer buf. Has the same semantics as a blocking read system -call. Returns the number of bytes read or -1 if an error occurs. - -
        • OutStream: A simple abstraction for an output stream. This has a -single write method that writes n bytes to the stream from the -buffer buf. Has the same semantics as a blocking write system -call. Returns the number of bytes written or -1 if an error occurs. - -
        • RecordReader: A RecordReader reads records one at a time from -an underlying stream in a specified record format. The reader is instantiated -with a stream and a serialization format. It has a read method that -takes an instance of a record and deserializes the record from the stream. - -
        • RecordWriter: A RecordWriter writes records one at a -time to an underlying stream in a specified record format. The writer is -instantiated with a stream and a serialization format. It has a -write method that takes an instance of a record and serializes the -record to the stream. - -
        • Record: The base class for all generated record types. This has two -public methods type and signature that return the typename and the -type signature of the record. - -
        - -Two files are generated for each record file (note: not for each record). If a -record file is named "name.jr", the generated files are -"name.jr.cc" and "name.jr.hh" containing serialization -implementations and record type declarations respectively. - -For each record in the DDL file, the generated header file will contain a -class definition corresponding to the record type, method definitions for the -generated type will be present in the '.cc' file. The generated class will -inherit from the abstract class hadoop::Record. The DDL files -module declaration determines the namespace the record belongs to. -Each '.' delimited token in the module declaration results in the -creation of a namespace. For instance, the declaration module docs.links -results in the creation of a docs namespace and a nested -docs::links namespace. In the preceding examples, the Link class -is placed in the links namespace. The header file corresponding to -the links.jr file will contain: - -
        
        -namespace links {
        -  class Link : public hadoop::Record {
        -    // ....
        -  };
        -};
        -
        - -Each field within the record will cause the generation of a private member -declaration of the appropriate type in the class declaration, and one or more -acccessor methods. The generated class will implement the serialize and -deserialize methods defined in hadoop::Record+. It will also -implement the inspection methods type and signature from -hadoop::Record. A default constructor and virtual destructor will also -be generated. Serialization code will read/write records into streams that -implement the hadoop::InStream and the hadoop::OutStream interfaces. - -For each member of a record an accessor method is generated that returns -either the member or a reference to the member. For members that are returned -by value, a setter method is also generated. This is true for primitive -data members of the types byte, int, long, boolean, float and -double. For example, for a int field called MyField the folowing -code is generated. - -
        
        -...
        -private:
        -  int32_t mMyField;
        -  ...
        -public:
        -  int32_t getMyField(void) const {
        -    return mMyField;
        -  };
        -
        -  void setMyField(int32_t m) {
        -    mMyField = m;
        -  };
        -  ...
        -
        - -For a ustring or buffer or composite field. The generated code -only contains accessors that return a reference to the field. A const -and a non-const accessor are generated. For example: - -
        
        -...
        -private:
        -  std::string mMyBuf;
        -  ...
        -public:
        -
        -  std::string& getMyBuf() {
        -    return mMyBuf;
        -  };
        -
        -  const std::string& getMyBuf() const {
        -    return mMyBuf;
        -  };
        -  ...
        -
        - -

        Examples

        - -Suppose the inclrec.jr file contains: -
        
        -module inclrec {
        -    class RI {
        -        int      I32;
        -        double   D;
        -        ustring  S;
        -    };
        -}
        -
        - -and the testrec.jr file contains: - -
        
        -include "inclrec.jr"
        -module testrec {
        -    class R {
        -        vector VF;
        -        RI            Rec;
        -        buffer        Buf;
        -    };
        -}
        -
        - -Then the invocation of rcc such as: -
        
        -$ rcc -l c++ inclrec.jr testrec.jr
        -
        -will result in generation of four files: -inclrec.jr.{cc,hh} and testrec.jr.{cc,hh}. - -The inclrec.jr.hh will contain: - -
        
        -#ifndef _INCLREC_JR_HH_
        -#define _INCLREC_JR_HH_
        -
        -#include "recordio.hh"
        -
        -namespace inclrec {
        -  
        -  class RI : public hadoop::Record {
        -
        -  private:
        -
        -    int32_t      mI32;
        -    double       mD;
        -    std::string  mS;
        -
        -  public:
        -
        -    RI(void);
        -    virtual ~RI(void);
        -
        -    virtual bool operator==(const RI& peer) const;
        -    virtual bool operator<(const RI& peer) const;
        -
        -    virtual int32_t getI32(void) const { return mI32; }
        -    virtual void setI32(int32_t v) { mI32 = v; }
        -
        -    virtual double getD(void) const { return mD; }
        -    virtual void setD(double v) { mD = v; }
        -
        -    virtual std::string& getS(void) const { return mS; }
        -    virtual const std::string& getS(void) const { return mS; }
        -
        -    virtual std::string type(void) const;
        -    virtual std::string signature(void) const;
        -
        -  protected:
        -
        -    virtual void serialize(hadoop::OArchive& a) const;
        -    virtual void deserialize(hadoop::IArchive& a);
        -
        -    virtual bool validate(void);
        -  };
        -} // end namespace inclrec
        -
        -#endif /* _INCLREC_JR_HH_ */
        -
        -
        - -The testrec.jr.hh file will contain: - - -
        
        -
        -#ifndef _TESTREC_JR_HH_
        -#define _TESTREC_JR_HH_
        -
        -#include "inclrec.jr.hh"
        -
        -namespace testrec {
        -  class R : public hadoop::Record {
        -
        -  private:
        -
        -    std::vector mVF;
        -    inclrec::RI        mRec;
        -    std::string        mBuf;
        -
        -  public:
        -
        -    R(void);
        -    virtual ~R(void);
        -
        -    virtual bool operator==(const R& peer) const;
        -    virtual bool operator<(const R& peer) const;
        -
        -    virtual std::vector& getVF(void) const;
        -    virtual const std::vector& getVF(void) const;
        -
        -    virtual std::string& getBuf(void) const ;
        -    virtual const std::string& getBuf(void) const;
        -
        -    virtual inclrec::RI& getRec(void) const;
        -    virtual const inclrec::RI& getRec(void) const;
        -    
        -    virtual bool serialize(hadoop::OutArchive& a) const;
        -    virtual bool deserialize(hadoop::InArchive& a);
        -    
        -    virtual std::string type(void) const;
        -    virtual std::string signature(void) const;
        -  };
        -}; // end namespace testrec
        -#endif /* _TESTREC_JR_HH_ */
        -
        -
        - -

        Java

        - -Code generation for Java is similar to that for C++. A Java class is generated -for each record type with private members corresponding to the fields. Getters -and setters for fields are also generated. Some differences arise in the -way comparison is expressed and in the mapping of modules to packages and -classes to files. For equality testing, an equals method is generated -for each record type. As per Java requirements a hashCode method is also -generated. For comparison a compareTo method is generated for each -record type. This has the semantics as defined by the Java Comparable -interface, that is, the method returns a negative integer, zero, or a positive -integer as the invoked object is less than, equal to, or greater than the -comparison parameter. - -A .java file is generated per record type as opposed to per DDL -file as in C++. The module declaration translates to a Java -package declaration. The module name maps to an identical Java package -name. In addition to this mapping, the DDL compiler creates the appropriate -directory hierarchy for the package and places the generated .java -files in the correct directories. - -

        Mapping Summary

        - -
        
        -DDL Type        C++ Type            Java Type 
        -
        -boolean         bool                boolean
        -byte            int8_t              byte
        -int             int32_t             int
        -long            int64_t             long
        -float           float               float
        -double          double              double
        -ustring         std::string         Text
        -buffer          std::string         java.io.ByteArrayOutputStream
        -class type      class type          class type
        -vector    std::vector   java.util.ArrayList
        -map  std::map java.util.TreeMap
        -
        - -

        Data encodings

        - -This section describes the format of the data encodings supported by Hadoop. -Currently, three data encodings are supported, namely binary, CSV and XML. - -

        Binary Serialization Format

        - -The binary data encoding format is fairly dense. Serialization of composite -types is simply defined as a concatenation of serializations of the constituent -elements (lengths are included in vectors and maps). - -Composite types are serialized as follows: -
          -
        • class: Sequence of serialized members. -
        • vector: The number of elements serialized as an int. Followed by a -sequence of serialized elements. -
        • map: The number of key value pairs serialized as an int. Followed -by a sequence of serialized (key,value) pairs. -
        - -Serialization of primitives is more interesting, with a zero compression -optimization for integral types and normalization to UTF-8 for strings. -Primitive types are serialized as follows: - -
          -
        • byte: Represented by 1 byte, as is. -
        • boolean: Represented by 1-byte (0 or 1) -
        • int/long: Integers and longs are serialized zero compressed. -Represented as 1-byte if -120 <= value < 128. Otherwise, serialized as a -sequence of 2-5 bytes for ints, 2-9 bytes for longs. The first byte represents -the number of trailing bytes, N, as the negative number (-120-N). For example, -the number 1024 (0x400) is represented by the byte sequence 'x86 x04 x00'. -This doesn't help much for 4-byte integers but does a reasonably good job with -longs without bit twiddling. -
        • float/double: Serialized in IEEE 754 single and double precision -format in network byte order. This is the format used by Java. -
        • ustring: Serialized as 4-byte zero compressed length followed by -data encoded as UTF-8. Strings are normalized to UTF-8 regardless of native -language representation. -
        • buffer: Serialized as a 4-byte zero compressed length followed by the -raw bytes in the buffer. -
        - - -

        CSV Serialization Format

        - -The CSV serialization format has a lot more structure than the "standard" -Excel CSV format, but we believe the additional structure is useful because - -
          -
        • it makes parsing a lot easier without detracting too much from legibility -
        • the delimiters around composites make it obvious when one is reading a -sequence of Hadoop records -
        - -Serialization formats for the various types are detailed in the grammar that -follows. The notable feature of the formats is the use of delimiters for -indicating the certain field types. - -
          -
        • A string field begins with a single quote ('). -
        • A buffer field begins with a sharp (#). -
        • A class, vector or map begins with 's{', 'v{' or 'm{' respectively and -ends with '}'. -
        - -The CSV format can be described by the following grammar: - -
        
        -record = primitive / struct / vector / map
        -primitive = boolean / int / long / float / double / ustring / buffer
        -
        -boolean = "T" / "F"
        -int = ["-"] 1*DIGIT
        -long = ";" ["-"] 1*DIGIT
        -float = ["-"] 1*DIGIT "." 1*DIGIT ["E" / "e" ["-"] 1*DIGIT]
        -double = ";" ["-"] 1*DIGIT "." 1*DIGIT ["E" / "e" ["-"] 1*DIGIT]
        -
        -ustring = "'" *(UTF8 char except NULL, LF, % and , / "%00" / "%0a" / "%25" / "%2c" )
        -
        -buffer = "#" *(BYTE except NULL, LF, % and , / "%00" / "%0a" / "%25" / "%2c" )
        -
        -struct = "s{" record *("," record) "}"
        -vector = "v{" [record *("," record)] "}"
        -map = "m{" [*(record "," record)] "}"
        -
        - -

        XML Serialization Format

        - -The XML serialization format is the same used by Apache XML-RPC -(http://ws.apache.org/xmlrpc/types.html). This is an extension of the original -XML-RPC format and adds some additional data types. All record I/O types are -not directly expressible in this format, and access to a DDL is required in -order to convert these to valid types. All types primitive or composite are -represented by <value> elements. The particular XML-RPC type is -indicated by a nested element in the <value> element. The encoding for -records is always UTF-8. Primitive types are serialized as follows: - -
          -
        • byte: XML tag <ex:i1>. Values: 1-byte unsigned -integers represented in US-ASCII -
        • boolean: XML tag <boolean>. Values: "0" or "1" -
        • int: XML tags <i4> or <int>. Values: 4-byte -signed integers represented in US-ASCII. -
        • long: XML tag <ex:i8>. Values: 8-byte signed integers -represented in US-ASCII. -
        • float: XML tag <ex:float>. Values: Single precision -floating point numbers represented in US-ASCII. -
        • double: XML tag <double>. Values: Double precision -floating point numbers represented in US-ASCII. -
        • ustring: XML tag <;string>. Values: String values -represented as UTF-8. XML does not permit all Unicode characters in literal -data. In particular, NULLs and control chars are not allowed. Additionally, -XML processors are required to replace carriage returns with line feeds and to -replace CRLF sequences with line feeds. Programming languages that we work -with do not impose these restrictions on string types. To work around these -restrictions, disallowed characters and CRs are percent escaped in strings. -The '%' character is also percent escaped. -
        • buffer: XML tag <string&>. Values: Arbitrary binary -data. Represented as hexBinary, each byte is replaced by its 2-byte -hexadecimal representation. -
        - -Composite types are serialized as follows: - -
          -
        • class: XML tag <struct>. A struct is a sequence of -<member> elements. Each <member> element has a <name> -element and a <value> element. The <name> is a string that must -match /[a-zA-Z][a-zA-Z0-9_]*/. The value of the member is represented -by a <value> element. - -
        • vector: XML tag <array<. An <array> contains a -single <data> element. The <data> element is a sequence of -<value> elements each of which represents an element of the vector. - -
        • map: XML tag <array>. Same as vector. - -
        - -For example: - -
        
        -class {
        -  int           MY_INT;            // value 5
        -  vector MY_VEC;            // values 0.1, -0.89, 2.45e4
        -  buffer        MY_BUF;            // value '\00\n\tabc%'
        -}
        -
        - -is serialized as - -
        
        -<value>
        -  <struct>
        -    <member>
        -      <name>MY_INT</name>
        -      <value><i4>5</i4></value>
        -    </member>
        -    <member>
        -      <name>MY_VEC</name>
        -      <value>
        -        <array>
        -          <data>
        -            <value><ex:float>0.1</ex:float></value>
        -            <value><ex:float>-0.89</ex:float></value>
        -            <value><ex:float>2.45e4</ex:float></value>
        -          </data>
        -        </array>
        -      </value>
        -    </member>
        -    <member>
        -      <name>MY_BUF</name>
        -      <value><string>%00\n\tabc%25</string></value>
        -    </member>
        -  </struct>
        -</value> 
        -
        - - - diff --git a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/AsyncCallback.java b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/AsyncCallback.java deleted file mode 100644 index 30377238b..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/AsyncCallback.java +++ /dev/null @@ -1,57 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you 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. - */ -package org.apache.zookeeper; - -import java.util.List; - -import org.apache.zookeeper.data.ACL; -import org.apache.zookeeper.data.Stat; - -public interface AsyncCallback { - interface StatCallback extends AsyncCallback { - public void processResult(int rc, String path, Object ctx, Stat stat); - } - - interface DataCallback extends AsyncCallback { - public void processResult(int rc, String path, Object ctx, byte data[], - Stat stat); - } - - interface ACLCallback extends AsyncCallback { - public void processResult(int rc, String path, Object ctx, - List acl, Stat stat); - } - - interface ChildrenCallback extends AsyncCallback { - public void processResult(int rc, String path, Object ctx, - List children); - } - - interface Children2Callback extends AsyncCallback { - public void processResult(int rc, String path, Object ctx, - List children, Stat stat); - } - - interface StringCallback extends AsyncCallback { - public void processResult(int rc, String path, Object ctx, String name); - } - - interface VoidCallback extends AsyncCallback { - public void processResult(int rc, String path, Object ctx); - } -} diff --git a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/ClientCnxn.java b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/ClientCnxn.java deleted file mode 100644 index 6b230d584..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/ClientCnxn.java +++ /dev/null @@ -1,1412 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you 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. - */ - -package org.apache.zookeeper; - -import java.io.BufferedReader; -import java.io.ByteArrayOutputStream; -import java.io.IOException; -import java.io.InputStreamReader; -import java.lang.Thread.UncaughtExceptionHandler; -import java.net.ConnectException; -import java.net.InetSocketAddress; -import java.net.Socket; -import java.net.SocketAddress; -import java.nio.ByteBuffer; -import java.util.LinkedList; -import java.util.List; -import java.util.Random; -import java.util.Set; -import java.util.concurrent.CopyOnWriteArraySet; -import java.util.concurrent.LinkedBlockingQueue; - -import javax.security.auth.login.LoginException; -import javax.security.sasl.SaslException; - -import org.apache.jute.BinaryInputArchive; -import org.apache.jute.BinaryOutputArchive; -import org.apache.jute.Record; -import org.apache.zookeeper.AsyncCallback.ACLCallback; -import org.apache.zookeeper.AsyncCallback.Children2Callback; -import org.apache.zookeeper.AsyncCallback.ChildrenCallback; -import org.apache.zookeeper.AsyncCallback.DataCallback; -import org.apache.zookeeper.AsyncCallback.StatCallback; -import org.apache.zookeeper.AsyncCallback.StringCallback; -import org.apache.zookeeper.AsyncCallback.VoidCallback; -import org.apache.zookeeper.Watcher.Event; -import org.apache.zookeeper.Watcher.Event.EventType; -import org.apache.zookeeper.Watcher.Event.KeeperState; -import org.apache.zookeeper.ZooDefs.OpCode; -import org.apache.zookeeper.ZooKeeper.States; -import org.apache.zookeeper.ZooKeeper.WatchRegistration; -import org.apache.zookeeper.client.HostProvider; -import org.apache.zookeeper.client.ZooKeeperSaslClient; -import org.apache.zookeeper.proto.AuthPacket; -import org.apache.zookeeper.proto.ConnectRequest; -import org.apache.zookeeper.proto.CreateResponse; -import org.apache.zookeeper.proto.ExistsResponse; -import org.apache.zookeeper.proto.GetACLResponse; -import org.apache.zookeeper.proto.GetChildren2Response; -import org.apache.zookeeper.proto.GetChildrenResponse; -import org.apache.zookeeper.proto.GetDataResponse; -import org.apache.zookeeper.proto.GetSASLRequest; -import org.apache.zookeeper.proto.ReplyHeader; -import org.apache.zookeeper.proto.RequestHeader; -import org.apache.zookeeper.proto.SetACLResponse; -import org.apache.zookeeper.proto.SetDataResponse; -import org.apache.zookeeper.proto.SetWatches; -import org.apache.zookeeper.proto.WatcherEvent; -import org.apache.zookeeper.server.ByteBufferInputStream; -import org.apache.zookeeper.server.ZooTrace; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -/** - * This class manages the socket i/o for the client. ClientCnxn maintains a list - * of available servers to connect to and "transparently" switches servers it is - * connected to as needed. - * - */ -public class ClientCnxn { - private static final Logger LOG = LoggerFactory.getLogger(ClientCnxn.class); - - private static final String ZK_SASL_CLIENT_USERNAME = - "zookeeper.sasl.client.username"; - - /** This controls whether automatic watch resetting is enabled. - * Clients automatically reset watches during session reconnect, this - * option allows the client to turn off this behavior by setting - * the environment variable "zookeeper.disableAutoWatchReset" to "true" */ - private static boolean disableAutoWatchReset; - static { - // this var should not be public, but otw there is no easy way - // to test - disableAutoWatchReset = - Boolean.getBoolean("zookeeper.disableAutoWatchReset"); - if (LOG.isDebugEnabled()) { - LOG.debug("zookeeper.disableAutoWatchReset is " - + disableAutoWatchReset); - } - } - - static class AuthData { - AuthData(String scheme, byte data[]) { - this.scheme = scheme; - this.data = data; - } - - String scheme; - - byte data[]; - } - - private final CopyOnWriteArraySet authInfo = new CopyOnWriteArraySet(); - - /** - * These are the packets that have been sent and are waiting for a response. - */ - private final LinkedList pendingQueue = new LinkedList(); - - /** - * These are the packets that need to be sent. - */ - private final LinkedList outgoingQueue = new LinkedList(); - - private int connectTimeout; - - /** - * The timeout in ms the client negotiated with the server. This is the - * "real" timeout, not the timeout request by the client (which may have - * been increased/decreased by the server which applies bounds to this - * value. - */ - private volatile int negotiatedSessionTimeout; - - private int readTimeout; - - private final int sessionTimeout; - - private final ZooKeeper zooKeeper; - - private final ClientWatchManager watcher; - - private long sessionId; - - private byte sessionPasswd[] = new byte[16]; - - /** - * If true, the connection is allowed to go to r-o mode. This field's value - * is sent, besides other data, during session creation handshake. If the - * server on the other side of the wire is partitioned it'll accept - * read-only clients only. - */ - private boolean readOnly; - - final String chrootPath; - - final SendThread sendThread; - - final EventThread eventThread; - - /** - * Set to true when close is called. Latches the connection such that we - * don't attempt to re-connect to the server if in the middle of closing the - * connection (client sends session disconnect to server as part of close - * operation) - */ - private volatile boolean closing = false; - - /** - * A set of ZooKeeper hosts this client could connect to. - */ - private final HostProvider hostProvider; - - /** - * Is set to true when a connection to a r/w server is established for the - * first time; never changed afterwards. - *

        - * Is used to handle situations when client without sessionId connects to a - * read-only server. Such client receives "fake" sessionId from read-only - * server, but this sessionId is invalid for other servers. So when such - * client finds a r/w server, it sends 0 instead of fake sessionId during - * connection handshake and establishes new, valid session. - *

        - * If this field is false (which implies we haven't seen r/w server before) - * then non-zero sessionId is fake, otherwise it is valid. - */ - volatile boolean seenRwServerBefore = false; - - - public ZooKeeperSaslClient zooKeeperSaslClient; - - public long getSessionId() { - return sessionId; - } - - public byte[] getSessionPasswd() { - return sessionPasswd; - } - - public int getSessionTimeout() { - return negotiatedSessionTimeout; - } - - @Override - public String toString() { - StringBuilder sb = new StringBuilder(); - - SocketAddress local = sendThread.getClientCnxnSocket().getLocalSocketAddress(); - SocketAddress remote = sendThread.getClientCnxnSocket().getRemoteSocketAddress(); - sb - .append("sessionid:0x").append(Long.toHexString(getSessionId())) - .append(" local:").append(local) - .append(" remoteserver:").append(remote) - .append(" lastZxid:").append(lastZxid) - .append(" xid:").append(xid) - .append(" sent:").append(sendThread.getClientCnxnSocket().getSentCount()) - .append(" recv:").append(sendThread.getClientCnxnSocket().getRecvCount()) - .append(" queuedpkts:").append(outgoingQueue.size()) - .append(" pendingresp:").append(pendingQueue.size()) - .append(" queuedevents:").append(eventThread.waitingEvents.size()); - - return sb.toString(); - } - - /** - * This class allows us to pass the headers and the relevant records around. - */ - static class Packet { - RequestHeader requestHeader; - - ReplyHeader replyHeader; - - Record request; - - Record response; - - ByteBuffer bb; - - /** Client's view of the path (may differ due to chroot) **/ - String clientPath; - /** Servers's view of the path (may differ due to chroot) **/ - String serverPath; - - boolean finished; - - AsyncCallback cb; - - Object ctx; - - WatchRegistration watchRegistration; - - public boolean readOnly; - - /** Convenience ctor */ - Packet(RequestHeader requestHeader, ReplyHeader replyHeader, - Record request, Record response, - WatchRegistration watchRegistration) { - this(requestHeader, replyHeader, request, response, - watchRegistration, false); - } - - Packet(RequestHeader requestHeader, ReplyHeader replyHeader, - Record request, Record response, - WatchRegistration watchRegistration, boolean readOnly) { - - this.requestHeader = requestHeader; - this.replyHeader = replyHeader; - this.request = request; - this.response = response; - this.readOnly = readOnly; - this.watchRegistration = watchRegistration; - } - - public void createBB() { - try { - ByteArrayOutputStream baos = new ByteArrayOutputStream(); - BinaryOutputArchive boa = BinaryOutputArchive.getArchive(baos); - boa.writeInt(-1, "len"); // We'll fill this in later - if (requestHeader != null) { - requestHeader.serialize(boa, "header"); - } - if (request instanceof ConnectRequest) { - request.serialize(boa, "connect"); - // append "am-I-allowed-to-be-readonly" flag - boa.writeBool(readOnly, "readOnly"); - } else if (request != null) { - request.serialize(boa, "request"); - } - baos.close(); - this.bb = ByteBuffer.wrap(baos.toByteArray()); - this.bb.putInt(this.bb.capacity() - 4); - this.bb.rewind(); - } catch (IOException e) { - LOG.warn("Ignoring unexpected exception", e); - } - } - - @Override - public String toString() { - StringBuilder sb = new StringBuilder(); - - sb.append("clientPath:" + clientPath); - sb.append(" serverPath:" + serverPath); - sb.append(" finished:" + finished); - - sb.append(" header:: " + requestHeader); - sb.append(" replyHeader:: " + replyHeader); - sb.append(" request:: " + request); - sb.append(" response:: " + response); - - // jute toString is horrible, remove unnecessary newlines - return sb.toString().replaceAll("\r*\n+", " "); - } - } - - /** - * Creates a connection object. The actual network connect doesn't get - * established until needed. The start() instance method must be called - * subsequent to construction. - * - * @param chrootPath - the chroot of this client. Should be removed from this Class in ZOOKEEPER-838 - * @param hostProvider - * the list of ZooKeeper servers to connect to - * @param sessionTimeout - * the timeout for connections. - * @param zooKeeper - * the zookeeper object that this connection is related to. - * @param watcher watcher for this connection - * @param clientCnxnSocket - * the socket implementation used (e.g. NIO/Netty) - * @param canBeReadOnly - * whether the connection is allowed to go to read-only - * mode in case of partitioning - * @throws IOException - */ - public ClientCnxn(String chrootPath, HostProvider hostProvider, int sessionTimeout, ZooKeeper zooKeeper, - ClientWatchManager watcher, ClientCnxnSocket clientCnxnSocket, boolean canBeReadOnly) - throws IOException { - this(chrootPath, hostProvider, sessionTimeout, zooKeeper, watcher, - clientCnxnSocket, 0, new byte[16], canBeReadOnly); - } - - /** - * Creates a connection object. The actual network connect doesn't get - * established until needed. The start() instance method must be called - * subsequent to construction. - * - * @param chrootPath - the chroot of this client. Should be removed from this Class in ZOOKEEPER-838 - * @param hostProvider - * the list of ZooKeeper servers to connect to - * @param sessionTimeout - * the timeout for connections. - * @param zooKeeper - * the zookeeper object that this connection is related to. - * @param watcher watcher for this connection - * @param clientCnxnSocket - * the socket implementation used (e.g. NIO/Netty) - * @param sessionId session id if re-establishing session - * @param sessionPasswd session passwd if re-establishing session - * @param canBeReadOnly - * whether the connection is allowed to go to read-only - * mode in case of partitioning - * @throws IOException - */ - public ClientCnxn(String chrootPath, HostProvider hostProvider, int sessionTimeout, ZooKeeper zooKeeper, - ClientWatchManager watcher, ClientCnxnSocket clientCnxnSocket, - long sessionId, byte[] sessionPasswd, boolean canBeReadOnly) { - this.zooKeeper = zooKeeper; - this.watcher = watcher; - this.sessionId = sessionId; - this.sessionPasswd = sessionPasswd; - this.sessionTimeout = sessionTimeout; - this.hostProvider = hostProvider; - this.chrootPath = chrootPath; - - connectTimeout = sessionTimeout / hostProvider.size(); - readTimeout = sessionTimeout * 2 / 3; - readOnly = canBeReadOnly; - - sendThread = new SendThread(clientCnxnSocket); - eventThread = new EventThread(); - - } - - /** - * tests use this to check on reset of watches - * @return if the auto reset of watches are disabled - */ - public static boolean getDisableAutoResetWatch() { - return disableAutoWatchReset; - } - /** - * tests use this to set the auto reset - * @param b the value to set disable watches to - */ - public static void setDisableAutoResetWatch(boolean b) { - disableAutoWatchReset = b; - } - public void start() { - sendThread.start(); - eventThread.start(); - } - - private Object eventOfDeath = new Object(); - - private final static UncaughtExceptionHandler uncaughtExceptionHandler = new UncaughtExceptionHandler() { - @Override - public void uncaughtException(Thread t, Throwable e) { - LOG.error("from " + t.getName(), e); - } - }; - - private static class WatcherSetEventPair { - private final Set watchers; - private final WatchedEvent event; - - public WatcherSetEventPair(Set watchers, WatchedEvent event) { - this.watchers = watchers; - this.event = event; - } - } - - /** - * Guard against creating "-EventThread-EventThread-EventThread-..." thread - * names when ZooKeeper object is being created from within a watcher. - * See ZOOKEEPER-795 for details. - */ - private static String makeThreadName(String suffix) { - String name = Thread.currentThread().getName(). - replaceAll("-EventThread", ""); - return name + suffix; - } - - class EventThread extends Thread { - private final LinkedBlockingQueue waitingEvents = - new LinkedBlockingQueue(); - - /** This is really the queued session state until the event - * thread actually processes the event and hands it to the watcher. - * But for all intents and purposes this is the state. - */ - private volatile KeeperState sessionState = KeeperState.Disconnected; - - private volatile boolean wasKilled = false; - private volatile boolean isRunning = false; - - EventThread() { - super(makeThreadName("-EventThread")); - setUncaughtExceptionHandler(uncaughtExceptionHandler); - setDaemon(true); - } - - public void queueEvent(WatchedEvent event) { - if (event.getType() == EventType.None - && sessionState == event.getState()) { - return; - } - sessionState = event.getState(); - - // materialize the watchers based on the event - WatcherSetEventPair pair = new WatcherSetEventPair( - watcher.materialize(event.getState(), event.getType(), - event.getPath()), - event); - // queue the pair (watch set & event) for later processing - waitingEvents.add(pair); - } - - public void queuePacket(Packet packet) { - if (wasKilled) { - synchronized (waitingEvents) { - if (isRunning) waitingEvents.add(packet); - else processEvent(packet); - } - } else { - waitingEvents.add(packet); - } - } - - public void queueEventOfDeath() { - waitingEvents.add(eventOfDeath); - } - - @Override - public void run() { - try { - isRunning = true; - while (true) { - Object event = waitingEvents.take(); - if (event == eventOfDeath) { - wasKilled = true; - } else { - processEvent(event); - } - if (wasKilled) - synchronized (waitingEvents) { - if (waitingEvents.isEmpty()) { - isRunning = false; - break; - } - } - } - } catch (InterruptedException e) { - LOG.error("Event thread exiting due to interruption", e); - } - - LOG.info("EventThread shut down"); - } - - private void processEvent(Object event) { - try { - if (event instanceof WatcherSetEventPair) { - // each watcher will process the event - WatcherSetEventPair pair = (WatcherSetEventPair) event; - for (Watcher watcher : pair.watchers) { - try { - watcher.process(pair.event); - } catch (Throwable t) { - LOG.error("Error while calling watcher ", t); - } - } - } else { - Packet p = (Packet) event; - int rc = 0; - String clientPath = p.clientPath; - if (p.replyHeader.getErr() != 0) { - rc = p.replyHeader.getErr(); - } - if (p.cb == null) { - LOG.warn("Somehow a null cb got to EventThread!"); - } else if (p.response instanceof ExistsResponse - || p.response instanceof SetDataResponse - || p.response instanceof SetACLResponse) { - StatCallback cb = (StatCallback) p.cb; - if (rc == 0) { - if (p.response instanceof ExistsResponse) { - cb.processResult(rc, clientPath, p.ctx, - ((ExistsResponse) p.response) - .getStat()); - } else if (p.response instanceof SetDataResponse) { - cb.processResult(rc, clientPath, p.ctx, - ((SetDataResponse) p.response) - .getStat()); - } else if (p.response instanceof SetACLResponse) { - cb.processResult(rc, clientPath, p.ctx, - ((SetACLResponse) p.response) - .getStat()); - } - } else { - cb.processResult(rc, clientPath, p.ctx, null); - } - } else if (p.response instanceof GetDataResponse) { - DataCallback cb = (DataCallback) p.cb; - GetDataResponse rsp = (GetDataResponse) p.response; - if (rc == 0) { - cb.processResult(rc, clientPath, p.ctx, rsp - .getData(), rsp.getStat()); - } else { - cb.processResult(rc, clientPath, p.ctx, null, - null); - } - } else if (p.response instanceof GetACLResponse) { - ACLCallback cb = (ACLCallback) p.cb; - GetACLResponse rsp = (GetACLResponse) p.response; - if (rc == 0) { - cb.processResult(rc, clientPath, p.ctx, rsp - .getAcl(), rsp.getStat()); - } else { - cb.processResult(rc, clientPath, p.ctx, null, - null); - } - } else if (p.response instanceof GetChildrenResponse) { - ChildrenCallback cb = (ChildrenCallback) p.cb; - GetChildrenResponse rsp = (GetChildrenResponse) p.response; - if (rc == 0) { - cb.processResult(rc, clientPath, p.ctx, rsp - .getChildren()); - } else { - cb.processResult(rc, clientPath, p.ctx, null); - } - } else if (p.response instanceof GetChildren2Response) { - Children2Callback cb = (Children2Callback) p.cb; - GetChildren2Response rsp = (GetChildren2Response) p.response; - if (rc == 0) { - cb.processResult(rc, clientPath, p.ctx, rsp - .getChildren(), rsp.getStat()); - } else { - cb.processResult(rc, clientPath, p.ctx, null, null); - } - } else if (p.response instanceof CreateResponse) { - StringCallback cb = (StringCallback) p.cb; - CreateResponse rsp = (CreateResponse) p.response; - if (rc == 0) { - cb.processResult(rc, clientPath, p.ctx, - (chrootPath == null - ? rsp.getPath() - : rsp.getPath() - .substring(chrootPath.length()))); - } else { - cb.processResult(rc, clientPath, p.ctx, null); - } - } else if (p.cb instanceof VoidCallback) { - VoidCallback cb = (VoidCallback) p.cb; - cb.processResult(rc, clientPath, p.ctx); - } - } - } catch (Throwable t) { - LOG.error("Caught unexpected throwable", t); - } - } - } - - private void finishPacket(Packet p) { - if (p.watchRegistration != null) { - p.watchRegistration.register(p.replyHeader.getErr()); - } - - if (p.cb == null) { - synchronized (p) { - p.finished = true; - p.notifyAll(); - } - } else { - p.finished = true; - eventThread.queuePacket(p); - } - } - - private void conLossPacket(Packet p) { - if (p.replyHeader == null) { - return; - } - switch (state) { - case AUTH_FAILED: - p.replyHeader.setErr(KeeperException.Code.AUTHFAILED.intValue()); - break; - case CLOSED: - p.replyHeader.setErr(KeeperException.Code.SESSIONEXPIRED.intValue()); - break; - default: - p.replyHeader.setErr(KeeperException.Code.CONNECTIONLOSS.intValue()); - } - finishPacket(p); - } - - private volatile long lastZxid; - - public long getLastZxid() { - return lastZxid; - } - - static class EndOfStreamException extends IOException { - private static final long serialVersionUID = -5438877188796231422L; - - public EndOfStreamException(String msg) { - super(msg); - } - - @Override - public String toString() { - return "EndOfStreamException: " + getMessage(); - } - } - - private static class SessionTimeoutException extends IOException { - private static final long serialVersionUID = 824482094072071178L; - - public SessionTimeoutException(String msg) { - super(msg); - } - } - - private static class SessionExpiredException extends IOException { - private static final long serialVersionUID = -1388816932076193249L; - - public SessionExpiredException(String msg) { - super(msg); - } - } - - private static class RWServerFoundException extends IOException { - private static final long serialVersionUID = 90431199887158758L; - - public RWServerFoundException(String msg) { - super(msg); - } - } - - public static final int packetLen = Integer.getInteger("jute.maxbuffer", - 4096 * 1024); - - /** - * This class services the outgoing request queue and generates the heart - * beats. It also spawns the ReadThread. - */ - class SendThread extends Thread { - private long lastPingSentNs; - private final ClientCnxnSocket clientCnxnSocket; - private Random r = new Random(System.nanoTime()); - private boolean isFirstConnect = true; - - void readResponse(ByteBuffer incomingBuffer) throws IOException { - ByteBufferInputStream bbis = new ByteBufferInputStream( - incomingBuffer); - BinaryInputArchive bbia = BinaryInputArchive.getArchive(bbis); - ReplyHeader replyHdr = new ReplyHeader(); - - replyHdr.deserialize(bbia, "header"); - if (replyHdr.getXid() == -2) { - // -2 is the xid for pings - if (LOG.isDebugEnabled()) { - LOG.debug("Got ping response for sessionid: 0x" - + Long.toHexString(sessionId) - + " after " - + ((System.nanoTime() - lastPingSentNs) / 1000000) - + "ms"); - } - return; - } - if (replyHdr.getXid() == -4) { - // -4 is the xid for AuthPacket - if(replyHdr.getErr() == KeeperException.Code.AUTHFAILED.intValue()) { - state = States.AUTH_FAILED; - eventThread.queueEvent( new WatchedEvent(Watcher.Event.EventType.None, - Watcher.Event.KeeperState.AuthFailed, null) ); - } - if (LOG.isDebugEnabled()) { - LOG.debug("Got auth sessionid:0x" - + Long.toHexString(sessionId)); - } - return; - } - if (replyHdr.getXid() == -1) { - // -1 means notification - if (LOG.isDebugEnabled()) { - LOG.debug("Got notification sessionid:0x" - + Long.toHexString(sessionId)); - } - WatcherEvent event = new WatcherEvent(); - event.deserialize(bbia, "response"); - - // convert from a server path to a client path - if (chrootPath != null) { - String serverPath = event.getPath(); - if(serverPath.compareTo(chrootPath)==0) - event.setPath("/"); - else if (serverPath.length() > chrootPath.length()) - event.setPath(serverPath.substring(chrootPath.length())); - else { - LOG.warn("Got server path " + event.getPath() - + " which is too short for chroot path " - + chrootPath); - } - } - - WatchedEvent we = new WatchedEvent(event); - if (LOG.isDebugEnabled()) { - LOG.debug("Got " + we + " for sessionid 0x" - + Long.toHexString(sessionId)); - } - - eventThread.queueEvent( we ); - return; - } - - // If SASL authentication is currently in progress, construct and - // send a response packet immediately, rather than queuing a - // response as with other packets. - if (clientTunneledAuthenticationInProgress()) { - GetSASLRequest request = new GetSASLRequest(); - request.deserialize(bbia,"token"); - zooKeeperSaslClient.respondToServer(request.getToken(), - ClientCnxn.this); - return; - } - - Packet packet; - synchronized (pendingQueue) { - if (pendingQueue.size() == 0) { - throw new IOException("Nothing in the queue, but got " - + replyHdr.getXid()); - } - packet = pendingQueue.remove(); - } - /* - * Since requests are processed in order, we better get a response - * to the first request! - */ - try { - if (packet.requestHeader.getXid() != replyHdr.getXid()) { - packet.replyHeader.setErr( - KeeperException.Code.CONNECTIONLOSS.intValue()); - throw new IOException("Xid out of order. Got Xid " - + replyHdr.getXid() + " with err " + - + replyHdr.getErr() + - " expected Xid " - + packet.requestHeader.getXid() - + " for a packet with details: " - + packet ); - } - - packet.replyHeader.setXid(replyHdr.getXid()); - packet.replyHeader.setErr(replyHdr.getErr()); - packet.replyHeader.setZxid(replyHdr.getZxid()); - if (replyHdr.getZxid() > 0) { - lastZxid = replyHdr.getZxid(); - } - if (packet.response != null && replyHdr.getErr() == 0) { - packet.response.deserialize(bbia, "response"); - } - - if (LOG.isDebugEnabled()) { - LOG.debug("Reading reply sessionid:0x" - + Long.toHexString(sessionId) + ", packet:: " + packet); - } - } finally { - finishPacket(packet); - } - } - - SendThread(ClientCnxnSocket clientCnxnSocket) { - super(makeThreadName("-SendThread()")); - state = States.CONNECTING; - this.clientCnxnSocket = clientCnxnSocket; - setUncaughtExceptionHandler(uncaughtExceptionHandler); - setDaemon(true); - } - - // TODO: can not name this method getState since Thread.getState() - // already exists - // It would be cleaner to make class SendThread an implementation of - // Runnable - /** - * Used by ClientCnxnSocket - * - * @return - */ - ZooKeeper.States getZkState() { - return state; - } - - ClientCnxnSocket getClientCnxnSocket() { - return clientCnxnSocket; - } - - void primeConnection() throws IOException { - LOG.info("Socket connection established to " - + clientCnxnSocket.getRemoteSocketAddress() - + ", initiating session"); - isFirstConnect = false; - long sessId = (seenRwServerBefore) ? sessionId : 0; - ConnectRequest conReq = new ConnectRequest(0, lastZxid, - sessionTimeout, sessId, sessionPasswd); - synchronized (outgoingQueue) { - // We add backwards since we are pushing into the front - // Only send if there's a pending watch - // TODO: here we have the only remaining use of zooKeeper in - // this class. It's to be eliminated! - if (!disableAutoWatchReset) { - List dataWatches = zooKeeper.getDataWatches(); - List existWatches = zooKeeper.getExistWatches(); - List childWatches = zooKeeper.getChildWatches(); - if (!dataWatches.isEmpty() - || !existWatches.isEmpty() || !childWatches.isEmpty()) { - SetWatches sw = new SetWatches(lastZxid, - prependChroot(dataWatches), - prependChroot(existWatches), - prependChroot(childWatches)); - RequestHeader h = new RequestHeader(); - h.setType(ZooDefs.OpCode.setWatches); - h.setXid(-8); - Packet packet = new Packet(h, new ReplyHeader(), sw, null, null); - outgoingQueue.addFirst(packet); - } - } - - for (AuthData id : authInfo) { - outgoingQueue.addFirst(new Packet(new RequestHeader(-4, - OpCode.auth), null, new AuthPacket(0, id.scheme, - id.data), null, null)); - } - outgoingQueue.addFirst(new Packet(null, null, conReq, - null, null, readOnly)); - } - clientCnxnSocket.enableReadWriteOnly(); - if (LOG.isDebugEnabled()) { - LOG.debug("Session establishment request sent on " - + clientCnxnSocket.getRemoteSocketAddress()); - } - } - - private List prependChroot(List paths) { - if (chrootPath != null && !paths.isEmpty()) { - for (int i = 0; i < paths.size(); ++i) { - String clientPath = paths.get(i); - String serverPath; - // handle clientPath = "/" - if (clientPath.length() == 1) { - serverPath = chrootPath; - } else { - serverPath = chrootPath + clientPath; - } - paths.set(i, serverPath); - } - } - return paths; - } - - private void sendPing() { - lastPingSentNs = System.nanoTime(); - RequestHeader h = new RequestHeader(-2, OpCode.ping); - queuePacket(h, null, null, null, null, null, null, null, null); - } - - private InetSocketAddress rwServerAddress = null; - - private final static int minPingRwTimeout = 100; - - private final static int maxPingRwTimeout = 60000; - - private int pingRwTimeout = minPingRwTimeout; - - // Set to true if and only if constructor of ZooKeeperSaslClient - // throws a LoginException: see startConnect() below. - private boolean saslLoginFailed = false; - - private void startConnect() throws IOException { - state = States.CONNECTING; - - InetSocketAddress addr; - if (rwServerAddress != null) { - addr = rwServerAddress; - rwServerAddress = null; - } else { - addr = hostProvider.next(1000); - } - - setName(getName().replaceAll("\\(.*\\)", - "(" + addr.getHostName() + ":" + addr.getPort() + ")")); - if (ZooKeeperSaslClient.isEnabled()) { - try { - String principalUserName = System.getProperty( - ZK_SASL_CLIENT_USERNAME, "zookeeper"); - zooKeeperSaslClient = - new ZooKeeperSaslClient( - principalUserName+"/"+addr.getHostName()); - } catch (LoginException e) { - // An authentication error occurred when the SASL client tried to initialize: - // for Kerberos this means that the client failed to authenticate with the KDC. - // This is different from an authentication error that occurs during communication - // with the Zookeeper server, which is handled below. - LOG.warn("SASL configuration failed: " + e + " Will continue connection to Zookeeper server without " - + "SASL authentication, if Zookeeper server allows it."); - eventThread.queueEvent(new WatchedEvent( - Watcher.Event.EventType.None, - Watcher.Event.KeeperState.AuthFailed, null)); - saslLoginFailed = true; - } - } - logStartConnect(addr); - - clientCnxnSocket.connect(addr); - } - - private void logStartConnect(InetSocketAddress addr) { - String msg = "Opening socket connection to server " + addr; - if (zooKeeperSaslClient != null) { - msg += ". " + zooKeeperSaslClient.getConfigStatus(); - } - LOG.info(msg); - } - - private static final String RETRY_CONN_MSG = - ", closing socket connection and attempting reconnect"; - - @Override - public void run() { - clientCnxnSocket.introduce(this,sessionId); - clientCnxnSocket.updateNow(); - clientCnxnSocket.updateLastSendAndHeard(); - int to; - long lastPingRwServer = System.currentTimeMillis(); - final int MAX_SEND_PING_INTERVAL = 10000; //10 seconds - while (state.isAlive()) { - try { - if (!clientCnxnSocket.isConnected()) { - if(!isFirstConnect){ - try { - Thread.sleep(r.nextInt(1000)); - } catch (InterruptedException e) { - LOG.warn("Unexpected exception", e); - } - } - // don't re-establish connection if we are closing - if (closing || !state.isAlive()) { - break; - } - startConnect(); - clientCnxnSocket.updateLastSendAndHeard(); - } - - if (state.isConnected()) { - // determine whether we need to send an AuthFailed event. - if (zooKeeperSaslClient != null) { - boolean sendAuthEvent = false; - if (zooKeeperSaslClient.getSaslState() == ZooKeeperSaslClient.SaslState.INITIAL) { - try { - zooKeeperSaslClient.initialize(ClientCnxn.this); - } catch (SaslException e) { - LOG.error("SASL authentication with Zookeeper Quorum member failed: " + e); - state = States.AUTH_FAILED; - sendAuthEvent = true; - } - } - KeeperState authState = zooKeeperSaslClient.getKeeperState(); - if (authState != null) { - if (authState == KeeperState.AuthFailed) { - // An authentication error occurred during authentication with the Zookeeper Server. - state = States.AUTH_FAILED; - sendAuthEvent = true; - } else { - if (authState == KeeperState.SaslAuthenticated) { - sendAuthEvent = true; - } - } - } - - if (sendAuthEvent == true) { - eventThread.queueEvent(new WatchedEvent( - Watcher.Event.EventType.None, - authState,null)); - } - } - to = readTimeout - clientCnxnSocket.getIdleRecv(); - } else { - to = connectTimeout - clientCnxnSocket.getIdleRecv(); - } - - if (to <= 0) { - throw new SessionTimeoutException( - "Client session timed out, have not heard from server in " - + clientCnxnSocket.getIdleRecv() + "ms" - + " for sessionid 0x" - + Long.toHexString(sessionId)); - } - if (state.isConnected()) { - //1000(1 second) is to prevent race condition missing to send the second ping - //also make sure not to send too many pings when readTimeout is small - int timeToNextPing = readTimeout / 2 - clientCnxnSocket.getIdleSend() - - ((clientCnxnSocket.getIdleSend() > 1000) ? 1000 : 0); - //send a ping request either time is due or no packet sent out within MAX_SEND_PING_INTERVAL - if (timeToNextPing <= 0 || clientCnxnSocket.getIdleSend() > MAX_SEND_PING_INTERVAL) { - sendPing(); - clientCnxnSocket.updateLastSend(); - } else { - if (timeToNextPing < to) { - to = timeToNextPing; - } - } - } - - // If we are in read-only mode, seek for read/write server - if (state == States.CONNECTEDREADONLY) { - long now = System.currentTimeMillis(); - int idlePingRwServer = (int) (now - lastPingRwServer); - if (idlePingRwServer >= pingRwTimeout) { - lastPingRwServer = now; - idlePingRwServer = 0; - pingRwTimeout = - Math.min(2*pingRwTimeout, maxPingRwTimeout); - pingRwServer(); - } - to = Math.min(to, pingRwTimeout - idlePingRwServer); - } - - clientCnxnSocket.doTransport(to, pendingQueue, outgoingQueue, ClientCnxn.this); - } catch (Throwable e) { - if (closing) { - if (LOG.isDebugEnabled()) { - // closing so this is expected - LOG.debug("An exception was thrown while closing send thread for session 0x" - + Long.toHexString(getSessionId()) - + " : " + e.getMessage()); - } - break; - } else { - // this is ugly, you have a better way speak up - if (e instanceof SessionExpiredException) { - LOG.info(e.getMessage() + ", closing socket connection"); - } else if (e instanceof SessionTimeoutException) { - LOG.info(e.getMessage() + RETRY_CONN_MSG); - } else if (e instanceof EndOfStreamException) { - LOG.info(e.getMessage() + RETRY_CONN_MSG); - } else if (e instanceof RWServerFoundException) { - LOG.info(e.getMessage()); - } else { - LOG.warn( - "Session 0x" - + Long.toHexString(getSessionId()) - + " for server " - + clientCnxnSocket.getRemoteSocketAddress() - + ", unexpected error" - + RETRY_CONN_MSG, e); - } - cleanup(); - if (state.isAlive()) { - eventThread.queueEvent(new WatchedEvent( - Event.EventType.None, - Event.KeeperState.Disconnected, - null)); - } - clientCnxnSocket.updateNow(); - clientCnxnSocket.updateLastSendAndHeard(); - } - } - } - cleanup(); - clientCnxnSocket.close(); - if (state.isAlive()) { - eventThread.queueEvent(new WatchedEvent(Event.EventType.None, - Event.KeeperState.Disconnected, null)); - } - ZooTrace.logTraceMessage(LOG, ZooTrace.getTextTraceLevel(), - "SendThread exitedloop."); - } - - private void pingRwServer() throws RWServerFoundException { - String result = null; - InetSocketAddress addr = hostProvider.next(0); - LOG.info("Checking server " + addr + " for being r/w." + - " Timeout " + pingRwTimeout); - - Socket sock = null; - BufferedReader br = null; - try { - sock = new Socket(addr.getHostName(), addr.getPort()); - sock.setSoLinger(false, -1); - sock.setSoTimeout(1000); - sock.setTcpNoDelay(true); - sock.getOutputStream().write("isro".getBytes()); - sock.getOutputStream().flush(); - sock.shutdownOutput(); - br = new BufferedReader( - new InputStreamReader(sock.getInputStream())); - result = br.readLine(); - } catch (ConnectException e) { - // ignore, this just means server is not up - } catch (IOException e) { - // some unexpected error, warn about it - LOG.warn("Exception while seeking for r/w server " + - e.getMessage(), e); - } finally { - if (sock != null) { - try { - sock.close(); - } catch (IOException e) { - LOG.warn("Unexpected exception", e); - } - } - if (br != null) { - try { - br.close(); - } catch (IOException e) { - LOG.warn("Unexpected exception", e); - } - } - } - - if ("rw".equals(result)) { - pingRwTimeout = minPingRwTimeout; - // save the found address so that it's used during the next - // connection attempt - rwServerAddress = addr; - throw new RWServerFoundException("Majority server found at " - + addr.getHostName() + ":" + addr.getPort()); - } - } - - private void cleanup() { - clientCnxnSocket.cleanup(); - synchronized (pendingQueue) { - for (Packet p : pendingQueue) { - conLossPacket(p); - } - pendingQueue.clear(); - } - synchronized (outgoingQueue) { - for (Packet p : outgoingQueue) { - conLossPacket(p); - } - outgoingQueue.clear(); - } - } - - /** - * Callback invoked by the ClientCnxnSocket once a connection has been - * established. - * - * @param _negotiatedSessionTimeout - * @param _sessionId - * @param _sessionPasswd - * @param isRO - * @throws IOException - */ - void onConnected(int _negotiatedSessionTimeout, long _sessionId, - byte[] _sessionPasswd, boolean isRO) throws IOException { - negotiatedSessionTimeout = _negotiatedSessionTimeout; - if (negotiatedSessionTimeout <= 0) { - state = States.CLOSED; - - eventThread.queueEvent(new WatchedEvent( - Watcher.Event.EventType.None, - Watcher.Event.KeeperState.Expired, null)); - eventThread.queueEventOfDeath(); - throw new SessionExpiredException( - "Unable to reconnect to ZooKeeper service, session 0x" - + Long.toHexString(sessionId) + " has expired"); - } - if (!readOnly && isRO) { - LOG.error("Read/write client got connected to read-only server"); - } - readTimeout = negotiatedSessionTimeout * 2 / 3; - connectTimeout = negotiatedSessionTimeout / hostProvider.size(); - hostProvider.onConnected(); - sessionId = _sessionId; - sessionPasswd = _sessionPasswd; - state = (isRO) ? - States.CONNECTEDREADONLY : States.CONNECTED; - seenRwServerBefore |= !isRO; - LOG.info("Session establishment complete on server " - + clientCnxnSocket.getRemoteSocketAddress() - + ", sessionid = 0x" + Long.toHexString(sessionId) - + ", negotiated timeout = " + negotiatedSessionTimeout - + (isRO ? " (READ-ONLY mode)" : "")); - KeeperState eventState = (isRO) ? - KeeperState.ConnectedReadOnly : KeeperState.SyncConnected; - eventThread.queueEvent(new WatchedEvent( - Watcher.Event.EventType.None, - eventState, null)); - } - - void close() { - state = States.CLOSED; - clientCnxnSocket.wakeupCnxn(); - } - - void testableCloseSocket() throws IOException { - clientCnxnSocket.testableCloseSocket(); - } - - public boolean clientTunneledAuthenticationInProgress() { - // 1. SASL client is disabled. - if (!ZooKeeperSaslClient.isEnabled()) { - return false; - } - - // 2. SASL login failed. - if (saslLoginFailed == true) { - return false; - } - - // 3. SendThread has not created the authenticating object yet, - // therefore authentication is (at the earliest stage of being) in progress. - if (zooKeeperSaslClient == null) { - return true; - } - - // 4. authenticating object exists, so ask it for its progress. - return zooKeeperSaslClient.clientTunneledAuthenticationInProgress(); - } - - public void sendPacket(Packet p) throws IOException { - clientCnxnSocket.sendPacket(p); - } - } - - /** - * Shutdown the send/event threads. This method should not be called - * directly - rather it should be called as part of close operation. This - * method is primarily here to allow the tests to verify disconnection - * behavior. - */ - public void disconnect() { - if (LOG.isDebugEnabled()) { - LOG.debug("Disconnecting client for session: 0x" - + Long.toHexString(getSessionId())); - } - - sendThread.close(); - eventThread.queueEventOfDeath(); - } - - /** - * Close the connection, which includes; send session disconnect to the - * server, shutdown the send/event threads. - * - * @throws IOException - */ - public void close() throws IOException { - if (LOG.isDebugEnabled()) { - LOG.debug("Closing client for session: 0x" - + Long.toHexString(getSessionId())); - } - - try { - RequestHeader h = new RequestHeader(); - h.setType(ZooDefs.OpCode.closeSession); - - submitRequest(h, null, null, null); - } catch (InterruptedException e) { - // ignore, close the send/event threads - } finally { - disconnect(); - } - } - - private int xid = 1; - - private volatile States state = States.NOT_CONNECTED; - - /* - * getXid() is called externally by ClientCnxnNIO::doIO() when packets are sent from the outgoingQueue to - * the server. Thus, getXid() must be public. - */ - synchronized public int getXid() { - return xid++; - } - - public ReplyHeader submitRequest(RequestHeader h, Record request, - Record response, WatchRegistration watchRegistration) - throws InterruptedException { - ReplyHeader r = new ReplyHeader(); - Packet packet = queuePacket(h, r, request, response, null, null, null, - null, watchRegistration); - synchronized (packet) { - while (!packet.finished) { - packet.wait(); - } - } - return r; - } - - public void enableWrite() { - sendThread.getClientCnxnSocket().enableWrite(); - } - - public void sendPacket(Record request, Record response, AsyncCallback cb, int opCode) - throws IOException { - // Generate Xid now because it will be sent immediately, - // by call to sendThread.sendPacket() below. - int xid = getXid(); - RequestHeader h = new RequestHeader(); - h.setXid(xid); - h.setType(opCode); - - ReplyHeader r = new ReplyHeader(); - r.setXid(xid); - - Packet p = new Packet(h, r, request, response, null, false); - p.cb = cb; - sendThread.sendPacket(p); - } - - Packet queuePacket(RequestHeader h, ReplyHeader r, Record request, - Record response, AsyncCallback cb, String clientPath, - String serverPath, Object ctx, WatchRegistration watchRegistration) - { - Packet packet = null; - - // Note that we do not generate the Xid for the packet yet. It is - // generated later at send-time, by an implementation of ClientCnxnSocket::doIO(), - // where the packet is actually sent. - synchronized (outgoingQueue) { - packet = new Packet(h, r, request, response, watchRegistration); - packet.cb = cb; - packet.ctx = ctx; - packet.clientPath = clientPath; - packet.serverPath = serverPath; - if (!state.isAlive() || closing) { - conLossPacket(packet); - } else { - // If the client is asking to close the session then - // mark as closing - if (h.getType() == OpCode.closeSession) { - closing = true; - } - outgoingQueue.add(packet); - } - } - sendThread.getClientCnxnSocket().wakeupCnxn(); - return packet; - } - - public void addAuthInfo(String scheme, byte auth[]) { - if (!state.isAlive()) { - return; - } - authInfo.add(new AuthData(scheme, auth)); - queuePacket(new RequestHeader(-4, OpCode.auth), null, - new AuthPacket(0, scheme, auth), null, null, null, null, - null, null); - } - - States getState() { - return state; - } -} diff --git a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/ClientCnxnSocket.java b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/ClientCnxnSocket.java deleted file mode 100644 index 5ca0ba77b..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/ClientCnxnSocket.java +++ /dev/null @@ -1,174 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you 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. - */ - -package org.apache.zookeeper; - -import java.io.IOException; -import java.net.InetSocketAddress; -import java.net.SocketAddress; -import java.nio.ByteBuffer; -import java.util.LinkedList; -import java.util.List; - -import org.apache.jute.BinaryInputArchive; -import org.apache.zookeeper.ClientCnxn.Packet; -import org.apache.zookeeper.proto.ConnectResponse; -import org.apache.zookeeper.server.ByteBufferInputStream; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -/** - * A ClientCnxnSocket does the lower level communication with a socket - * implementation. - * - * This code has been moved out of ClientCnxn so that a Netty implementation can - * be provided as an alternative to the NIO socket code. - * - */ -abstract class ClientCnxnSocket { - private static final Logger LOG = LoggerFactory.getLogger(ClientCnxnSocket.class); - - protected boolean initialized; - - /** - * This buffer is only used to read the length of the incoming message. - */ - protected final ByteBuffer lenBuffer = ByteBuffer.allocateDirect(4); - - /** - * After the length is read, a new incomingBuffer is allocated in - * readLength() to receive the full message. - */ - protected ByteBuffer incomingBuffer = lenBuffer; - protected long sentCount = 0; - protected long recvCount = 0; - protected long lastHeard; - protected long lastSend; - protected long now; - protected ClientCnxn.SendThread sendThread; - - /** - * The sessionId is only available here for Log and Exception messages. - * Otherwise the socket doesn't need to know it. - */ - protected long sessionId; - - void introduce(ClientCnxn.SendThread sendThread, long sessionId) { - this.sendThread = sendThread; - this.sessionId = sessionId; - } - - void updateNow() { - now = System.currentTimeMillis(); - } - - int getIdleRecv() { - return (int) (now - lastHeard); - } - - int getIdleSend() { - return (int) (now - lastSend); - } - - long getSentCount() { - return sentCount; - } - - long getRecvCount() { - return recvCount; - } - - void updateLastHeard() { - this.lastHeard = now; - } - - void updateLastSend() { - this.lastSend = now; - } - - void updateLastSendAndHeard() { - this.lastSend = now; - this.lastHeard = now; - } - - protected void readLength() throws IOException { - int len = incomingBuffer.getInt(); - if (len < 0 || len >= ClientCnxn.packetLen) { - throw new IOException("Packet len" + len + " is out of range!"); - } - incomingBuffer = ByteBuffer.allocate(len); - } - - void readConnectResult() throws IOException { - if (LOG.isTraceEnabled()) { - StringBuilder buf = new StringBuilder("0x["); - for (byte b : incomingBuffer.array()) { - buf.append(Integer.toHexString(b) + ","); - } - buf.append("]"); - LOG.trace("readConnectResult " + incomingBuffer.remaining() + " " - + buf.toString()); - } - ByteBufferInputStream bbis = new ByteBufferInputStream(incomingBuffer); - BinaryInputArchive bbia = BinaryInputArchive.getArchive(bbis); - ConnectResponse conRsp = new ConnectResponse(); - conRsp.deserialize(bbia, "connect"); - - // read "is read-only" flag - boolean isRO = false; - try { - isRO = bbia.readBool("readOnly"); - } catch (IOException e) { - // this is ok -- just a packet from an old server which - // doesn't contain readOnly field - LOG.warn("Connected to an old server; r-o mode will be unavailable"); - } - - this.sessionId = conRsp.getSessionId(); - sendThread.onConnected(conRsp.getTimeOut(), this.sessionId, - conRsp.getPasswd(), isRO); - } - - abstract boolean isConnected(); - - abstract void connect(InetSocketAddress addr) throws IOException; - - abstract SocketAddress getRemoteSocketAddress(); - - abstract SocketAddress getLocalSocketAddress(); - - abstract void cleanup(); - - abstract void close(); - - abstract void wakeupCnxn(); - - abstract void enableWrite(); - - abstract void disableWrite(); - - abstract void enableReadWriteOnly(); - - abstract void doTransport(int waitTimeOut, List pendingQueue, - LinkedList outgoingQueue, ClientCnxn cnxn) - throws IOException, InterruptedException; - - abstract void testableCloseSocket() throws IOException; - - abstract void sendPacket(Packet p) throws IOException; -} diff --git a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/ClientCnxnSocketNIO.java b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/ClientCnxnSocketNIO.java deleted file mode 100644 index 720619d89..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/ClientCnxnSocketNIO.java +++ /dev/null @@ -1,431 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you 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. - */ - -package org.apache.zookeeper; - -import java.io.IOException; -import java.net.InetSocketAddress; -import java.net.SocketAddress; -import java.nio.ByteBuffer; -import java.nio.channels.SelectionKey; -import java.nio.channels.Selector; -import java.nio.channels.SocketChannel; -import java.util.LinkedList; -import java.util.List; -import java.util.ListIterator; -import java.util.Set; - -import org.apache.zookeeper.ClientCnxn.EndOfStreamException; -import org.apache.zookeeper.ClientCnxn.Packet; -import org.apache.zookeeper.ZooDefs.OpCode; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -public class ClientCnxnSocketNIO extends ClientCnxnSocket { - private static final Logger LOG = LoggerFactory - .getLogger(ClientCnxnSocketNIO.class); - - private final Selector selector = Selector.open(); - - private SelectionKey sockKey; - - ClientCnxnSocketNIO() throws IOException { - super(); - } - - @Override - boolean isConnected() { - return sockKey != null; - } - - /** - * @return true if a packet was received - * @throws InterruptedException - * @throws IOException - */ - void doIO(List pendingQueue, LinkedList outgoingQueue, ClientCnxn cnxn) - throws InterruptedException, IOException { - SocketChannel sock = (SocketChannel) sockKey.channel(); - if (sock == null) { - throw new IOException("Socket is null!"); - } - if (sockKey.isReadable()) { - int rc = sock.read(incomingBuffer); - if (rc < 0) { - throw new EndOfStreamException( - "Unable to read additional data from server sessionid 0x" - + Long.toHexString(sessionId) - + ", likely server has closed socket"); - } - if (!incomingBuffer.hasRemaining()) { - incomingBuffer.flip(); - if (incomingBuffer == lenBuffer) { - recvCount++; - readLength(); - } else if (!initialized) { - readConnectResult(); - enableRead(); - if (findSendablePacket(outgoingQueue, - cnxn.sendThread.clientTunneledAuthenticationInProgress()) != null) { - // Since SASL authentication has completed (if client is configured to do so), - // outgoing packets waiting in the outgoingQueue can now be sent. - enableWrite(); - } - lenBuffer.clear(); - incomingBuffer = lenBuffer; - updateLastHeard(); - initialized = true; - } else { - sendThread.readResponse(incomingBuffer); - lenBuffer.clear(); - incomingBuffer = lenBuffer; - updateLastHeard(); - } - } - } - if (sockKey.isWritable()) { - synchronized(outgoingQueue) { - Packet p = findSendablePacket(outgoingQueue, - cnxn.sendThread.clientTunneledAuthenticationInProgress()); - - if (p != null) { - updateLastSend(); - // If we already started writing p, p.bb will already exist - if (p.bb == null) { - if ((p.requestHeader != null) && - (p.requestHeader.getType() != OpCode.ping) && - (p.requestHeader.getType() != OpCode.auth)) { - p.requestHeader.setXid(cnxn.getXid()); - } - p.createBB(); - } - sock.write(p.bb); - if (!p.bb.hasRemaining()) { - sentCount++; - outgoingQueue.removeFirstOccurrence(p); - if (p.requestHeader != null - && p.requestHeader.getType() != OpCode.ping - && p.requestHeader.getType() != OpCode.auth) { - synchronized (pendingQueue) { - pendingQueue.add(p); - } - } - } - } - if (outgoingQueue.isEmpty()) { - // No more packets to send: turn off write interest flag. - // Will be turned on later by a later call to enableWrite(), - // from within ZooKeeperSaslClient (if client is configured - // to attempt SASL authentication), or in either doIO() or - // in doTransport() if not. - disableWrite(); - } else if (!initialized && p != null && !p.bb.hasRemaining()) { - // On initial connection, write the complete connect request - // packet, but then disable further writes until after - // receiving a successful connection response. If the - // session is expired, then the server sends the expiration - // response and immediately closes its end of the socket. If - // the client is simultaneously writing on its end, then the - // TCP stack may choose to abort with RST, in which case the - // client would never receive the session expired event. See - // http://docs.oracle.com/javase/6/docs/technotes/guides/net/articles/connection_release.html - disableWrite(); - } else { - // Just in case - enableWrite(); - } - } - } - } - - private Packet findSendablePacket(LinkedList outgoingQueue, - boolean clientTunneledAuthenticationInProgress) { - synchronized (outgoingQueue) { - if (outgoingQueue.isEmpty()) { - return null; - } - if (outgoingQueue.getFirst().bb != null // If we've already starting sending the first packet, we better finish - || !clientTunneledAuthenticationInProgress) { - return outgoingQueue.getFirst(); - } - - // Since client's authentication with server is in progress, - // send only the null-header packet queued by primeConnection(). - // This packet must be sent so that the SASL authentication process - // can proceed, but all other packets should wait until - // SASL authentication completes. - ListIterator iter = outgoingQueue.listIterator(); - while (iter.hasNext()) { - Packet p = iter.next(); - if (p.requestHeader == null) { - // We've found the priming-packet. Move it to the beginning of the queue. - iter.remove(); - outgoingQueue.add(0, p); - return p; - } else { - // Non-priming packet: defer it until later, leaving it in the queue - // until authentication completes. - if (LOG.isDebugEnabled()) { - LOG.debug("deferring non-priming packet: " + p + - "until SASL authentication completes."); - } - } - } - // no sendable packet found. - return null; - } - } - - @Override - void cleanup() { - if (sockKey != null) { - SocketChannel sock = (SocketChannel) sockKey.channel(); - sockKey.cancel(); - try { - sock.socket().shutdownInput(); - } catch (IOException e) { - if (LOG.isDebugEnabled()) { - LOG.debug("Ignoring exception during shutdown input", e); - } - } - try { - sock.socket().shutdownOutput(); - } catch (IOException e) { - if (LOG.isDebugEnabled()) { - LOG.debug("Ignoring exception during shutdown output", - e); - } - } - try { - sock.socket().close(); - } catch (IOException e) { - if (LOG.isDebugEnabled()) { - LOG.debug("Ignoring exception during socket close", e); - } - } - try { - sock.close(); - } catch (IOException e) { - if (LOG.isDebugEnabled()) { - LOG.debug("Ignoring exception during channel close", e); - } - } - } - try { - Thread.sleep(100); - } catch (InterruptedException e) { - if (LOG.isDebugEnabled()) { - LOG.debug("SendThread interrupted during sleep, ignoring"); - } - } - sockKey = null; - } - - @Override - void close() { - try { - if (LOG.isTraceEnabled()) { - LOG.trace("Doing client selector close"); - } - selector.close(); - if (LOG.isTraceEnabled()) { - LOG.trace("Closed client selector"); - } - } catch (IOException e) { - LOG.warn("Ignoring exception during selector close", e); - } - } - - /** - * create a socket channel. - * @return the created socket channel - * @throws IOException - */ - SocketChannel createSock() throws IOException { - SocketChannel sock; - sock = SocketChannel.open(); - sock.configureBlocking(false); - sock.socket().setSoLinger(false, -1); - sock.socket().setTcpNoDelay(true); - return sock; - } - - /** - * register with the selection and connect - * @param sock the {@link SocketChannel} - * @param addr the address of remote host - * @throws IOException - */ - void registerAndConnect(SocketChannel sock, InetSocketAddress addr) - throws IOException { - sockKey = sock.register(selector, SelectionKey.OP_CONNECT); - boolean immediateConnect = sock.connect(addr); - if (immediateConnect) { - sendThread.primeConnection(); - } - } - - @Override - void connect(InetSocketAddress addr) throws IOException { - SocketChannel sock = createSock(); - try { - registerAndConnect(sock, addr); - } catch (IOException e) { - LOG.error("Unable to open socket to " + addr); - sock.close(); - throw e; - } - initialized = false; - - /* - * Reset incomingBuffer - */ - lenBuffer.clear(); - incomingBuffer = lenBuffer; - } - - /** - * Returns the address to which the socket is connected. - * - * @return ip address of the remote side of the connection or null if not - * connected - */ - @Override - SocketAddress getRemoteSocketAddress() { - // a lot could go wrong here, so rather than put in a bunch of code - // to check for nulls all down the chain let's do it the simple - // yet bulletproof way - try { - return ((SocketChannel) sockKey.channel()).socket() - .getRemoteSocketAddress(); - } catch (NullPointerException e) { - return null; - } - } - - /** - * Returns the local address to which the socket is bound. - * - * @return ip address of the remote side of the connection or null if not - * connected - */ - @Override - SocketAddress getLocalSocketAddress() { - // a lot could go wrong here, so rather than put in a bunch of code - // to check for nulls all down the chain let's do it the simple - // yet bulletproof way - try { - return ((SocketChannel) sockKey.channel()).socket() - .getLocalSocketAddress(); - } catch (NullPointerException e) { - return null; - } - } - - @Override - synchronized void wakeupCnxn() { - selector.wakeup(); - } - - @Override - void doTransport(int waitTimeOut, List pendingQueue, LinkedList outgoingQueue, - ClientCnxn cnxn) - throws IOException, InterruptedException { - selector.select(waitTimeOut); - Set selected; - synchronized (this) { - selected = selector.selectedKeys(); - } - // Everything below and until we get back to the select is - // non blocking, so time is effectively a constant. That is - // Why we just have to do this once, here - updateNow(); - for (SelectionKey k : selected) { - SocketChannel sc = ((SocketChannel) k.channel()); - if ((k.readyOps() & SelectionKey.OP_CONNECT) != 0) { - if (sc.finishConnect()) { - updateLastSendAndHeard(); - sendThread.primeConnection(); - } - } else if ((k.readyOps() & (SelectionKey.OP_READ | SelectionKey.OP_WRITE)) != 0) { - doIO(pendingQueue, outgoingQueue, cnxn); - } - } - if (sendThread.getZkState().isConnected()) { - synchronized(outgoingQueue) { - if (findSendablePacket(outgoingQueue, - cnxn.sendThread.clientTunneledAuthenticationInProgress()) != null) { - enableWrite(); - } - } - } - selected.clear(); - } - - //TODO should this be synchronized? - @Override - void testableCloseSocket() throws IOException { - LOG.info("testableCloseSocket() called"); - ((SocketChannel) sockKey.channel()).socket().close(); - } - - @Override - synchronized void enableWrite() { - int i = sockKey.interestOps(); - if ((i & SelectionKey.OP_WRITE) == 0) { - sockKey.interestOps(i | SelectionKey.OP_WRITE); - } - } - - @Override - public synchronized void disableWrite() { - int i = sockKey.interestOps(); - if ((i & SelectionKey.OP_WRITE) != 0) { - sockKey.interestOps(i & (~SelectionKey.OP_WRITE)); - } - } - - synchronized private void enableRead() { - int i = sockKey.interestOps(); - if ((i & SelectionKey.OP_READ) == 0) { - sockKey.interestOps(i | SelectionKey.OP_READ); - } - } - - @Override - synchronized void enableReadWriteOnly() { - sockKey.interestOps(SelectionKey.OP_READ | SelectionKey.OP_WRITE); - } - - Selector getSelector() { - return selector; - } - - @Override - void sendPacket(Packet p) throws IOException { - SocketChannel sock = (SocketChannel) sockKey.channel(); - if (sock == null) { - throw new IOException("Socket is null!"); - } - p.createBB(); - ByteBuffer pbb = p.bb; - sock.write(pbb); - } - - -} diff --git a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/ClientWatchManager.java b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/ClientWatchManager.java deleted file mode 100644 index d56374dee..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/ClientWatchManager.java +++ /dev/null @@ -1,40 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you 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. - */ - -package org.apache.zookeeper; - -import java.util.Set; - -/** - */ -public interface ClientWatchManager { - /** - * Return a set of watchers that should be notified of the event. The - * manager must not notify the watcher(s), however it will update it's - * internal structure as if the watches had triggered. The intent being - * that the callee is now responsible for notifying the watchers of the - * event, possibly at some later time. - * - * @param state event state - * @param type event type - * @param path event path - * @return may be empty set but must not be null - */ - public Set materialize(Watcher.Event.KeeperState state, - Watcher.Event.EventType type, String path); -} diff --git a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/CreateMode.java b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/CreateMode.java deleted file mode 100644 index d87f410c8..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/CreateMode.java +++ /dev/null @@ -1,92 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you 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. - */ -package org.apache.zookeeper; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.apache.zookeeper.KeeperException; - -/*** - * CreateMode value determines how the znode is created on ZooKeeper. - */ -public enum CreateMode { - - /** - * The znode will not be automatically deleted upon client's disconnect. - */ - PERSISTENT (0, false, false), - /** - * The znode will not be automatically deleted upon client's disconnect, - * and its name will be appended with a monotonically increasing number. - */ - PERSISTENT_SEQUENTIAL (2, false, true), - /** - * The znode will be deleted upon the client's disconnect. - */ - EPHEMERAL (1, true, false), - /** - * The znode will be deleted upon the client's disconnect, and its name - * will be appended with a monotonically increasing number. - */ - EPHEMERAL_SEQUENTIAL (3, true, true); - - private static final Logger LOG = LoggerFactory.getLogger(CreateMode.class); - - private boolean ephemeral; - private boolean sequential; - private int flag; - - CreateMode(int flag, boolean ephemeral, boolean sequential) { - this.flag = flag; - this.ephemeral = ephemeral; - this.sequential = sequential; - } - - public boolean isEphemeral() { - return ephemeral; - } - - public boolean isSequential() { - return sequential; - } - - public int toFlag() { - return flag; - } - - /** - * Map an integer value to a CreateMode value - */ - static public CreateMode fromFlag(int flag) throws KeeperException { - switch(flag) { - case 0: return CreateMode.PERSISTENT; - - case 1: return CreateMode.EPHEMERAL; - - case 2: return CreateMode.PERSISTENT_SEQUENTIAL; - - case 3: return CreateMode.EPHEMERAL_SEQUENTIAL ; - - default: - String errMsg = "Received an invalid flag value: " + flag - + " to convert to a CreateMode"; - LOG.error(errMsg); - throw new KeeperException.BadArgumentsException(errMsg); - } - } -} diff --git a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/Environment.java b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/Environment.java deleted file mode 100644 index 34cac4ca9..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/Environment.java +++ /dev/null @@ -1,103 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you 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. - */ - -package org.apache.zookeeper; - -import java.net.InetAddress; -import java.net.UnknownHostException; -import java.util.ArrayList; -import java.util.List; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -/** - * Provide insight into the runtime environment. - * - */ -public class Environment { - public static String JAAS_CONF_KEY = "java.security.auth.login.config"; - - public static class Entry { - private String k; - private String v; - public Entry(String k, String v) { - this.k = k; - this.v = v; - } - public String getKey() { return k; } - public String getValue() { return v; } - - @Override - public String toString() { - return k + "=" + v; - } - } - - private static void put(ArrayList l, String k, String v) { - l.add(new Entry(k,v)); - } - - public static List list() { - ArrayList l = new ArrayList(); - put(l, "zookeeper.version", Version.getFullVersion()); - - try { - put(l, "host.name", - InetAddress.getLocalHost().getCanonicalHostName()); - } catch (UnknownHostException e) { - put(l, "host.name", ""); - } - - put(l, "java.version", - System.getProperty("java.version", "")); - put(l, "java.vendor", - System.getProperty("java.vendor", "")); - put(l, "java.home", - System.getProperty("java.home", "")); - put(l, "java.class.path", - System.getProperty("java.class.path", "")); - put(l, "java.library.path", - System.getProperty("java.library.path", "")); - put(l, "java.io.tmpdir", - System.getProperty("java.io.tmpdir", "")); - put(l, "java.compiler", - System.getProperty("java.compiler", "")); - put(l, "os.name", - System.getProperty("os.name", "")); - put(l, "os.arch", - System.getProperty("os.arch", "")); - put(l, "os.version", - System.getProperty("os.version", "")); - put(l, "user.name", - System.getProperty("user.name", "")); - put(l, "user.home", - System.getProperty("user.home", "")); - put(l, "user.dir", - System.getProperty("user.dir", "")); - - return l; - } - - public static void logEnv(String msg, Logger log) { - List env = Environment.list(); - for (Entry e : env) { - log.info(msg + e.toString()); - } - } -} diff --git a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/JLineZNodeCompletor.java b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/JLineZNodeCompletor.java deleted file mode 100644 index 02b0645af..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/JLineZNodeCompletor.java +++ /dev/null @@ -1,84 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you 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. - */ - -package org.apache.zookeeper; - -import java.util.List; - -import jline.Completor; - -class JLineZNodeCompletor implements Completor { - private ZooKeeper zk; - - public JLineZNodeCompletor(ZooKeeper zk) { - this.zk = zk; - } - - @SuppressWarnings("unchecked") - public int complete(String buffer, int cursor, List candidates) { - // Guarantee that the final token is the one we're expanding - buffer = buffer.substring(0,cursor); - String token = ""; - if (!buffer.endsWith(" ")) { - String[] tokens = buffer.split(" "); - if (tokens.length != 0) { - token = tokens[tokens.length-1] ; - } - } - - if (token.startsWith("/")){ - return completeZNode( buffer, token, candidates); - } - return completeCommand(buffer, token, candidates); - } - - private int completeCommand(String buffer, String token, - List candidates) - { - for (String cmd : ZooKeeperMain.getCommands()) { - if (cmd.startsWith( token )) { - candidates.add(cmd); - } - } - return buffer.lastIndexOf(" ")+1; - } - - private int completeZNode( String buffer, String token, - List candidates) - { - String path = token; - int idx = path.lastIndexOf("/") + 1; - String prefix = path.substring(idx); - try { - // Only the root path can end in a /, so strip it off every other prefix - String dir = idx == 1 ? "/" : path.substring(0,idx-1); - List children = zk.getChildren(dir, false); - for (String child : children) { - if (child.startsWith(prefix)) { - candidates.add( child ); - } - } - } catch( InterruptedException e) { - return 0; - } - catch( KeeperException e) { - return 0; - } - return candidates.size() == 0 ? buffer.length() : buffer.lastIndexOf("/") + 1; - } -} diff --git a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/KeeperException.java b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/KeeperException.java deleted file mode 100644 index 2664411d3..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/KeeperException.java +++ /dev/null @@ -1,702 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you 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. - */ - -package org.apache.zookeeper; - -import java.util.ArrayList; -import java.util.EnumSet; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -@SuppressWarnings("serial") -public abstract class KeeperException extends Exception { - /** - * All multi-requests that result in an exception retain the results - * here so that it is possible to examine the problems in the catch - * scope. Non-multi requests will get a null if they try to access - * these results. - */ - private List results; - - /** - * All non-specific keeper exceptions should be constructed via - * this factory method in order to guarantee consistency in error - * codes and such. If you know the error code, then you should - * construct the special purpose exception directly. That will - * allow you to have the most specific possible declarations of - * what exceptions might actually be thrown. - * - * @param code The error code. - * @param path The ZooKeeper path being operated on. - * @return The specialized exception, presumably to be thrown by - * the caller. - */ - public static KeeperException create(Code code, String path) { - KeeperException r = create(code); - r.path = path; - return r; - } - - /** - * @deprecated deprecated in 3.1.0, use {@link #create(Code, String)} - * instead - */ - @Deprecated - public static KeeperException create(int code, String path) { - KeeperException r = create(Code.get(code)); - r.path = path; - return r; - } - - /** - * @deprecated deprecated in 3.1.0, use {@link #create(Code)} - * instead - */ - @Deprecated - public static KeeperException create(int code) { - return create(Code.get(code)); - } - - /** - * All non-specific keeper exceptions should be constructed via - * this factory method in order to guarantee consistency in error - * codes and such. If you know the error code, then you should - * construct the special purpose exception directly. That will - * allow you to have the most specific possible declarations of - * what exceptions might actually be thrown. - * - * @param code The error code of your new exception. This will - * also determine the specific type of the exception that is - * returned. - * @return The specialized exception, presumably to be thrown by - * the caller. - */ - public static KeeperException create(Code code) { - switch (code) { - case SYSTEMERROR: - return new SystemErrorException(); - case RUNTIMEINCONSISTENCY: - return new RuntimeInconsistencyException(); - case DATAINCONSISTENCY: - return new DataInconsistencyException(); - case CONNECTIONLOSS: - return new ConnectionLossException(); - case MARSHALLINGERROR: - return new MarshallingErrorException(); - case UNIMPLEMENTED: - return new UnimplementedException(); - case OPERATIONTIMEOUT: - return new OperationTimeoutException(); - case BADARGUMENTS: - return new BadArgumentsException(); - case APIERROR: - return new APIErrorException(); - case NONODE: - return new NoNodeException(); - case NOAUTH: - return new NoAuthException(); - case BADVERSION: - return new BadVersionException(); - case NOCHILDRENFOREPHEMERALS: - return new NoChildrenForEphemeralsException(); - case NODEEXISTS: - return new NodeExistsException(); - case INVALIDACL: - return new InvalidACLException(); - case AUTHFAILED: - return new AuthFailedException(); - case NOTEMPTY: - return new NotEmptyException(); - case SESSIONEXPIRED: - return new SessionExpiredException(); - case INVALIDCALLBACK: - return new InvalidCallbackException(); - case SESSIONMOVED: - return new SessionMovedException(); - case NOTREADONLY: - return new NotReadOnlyException(); - - case OK: - default: - throw new IllegalArgumentException("Invalid exception code"); - } - } - - /** - * Set the code for this exception - * @param code error code - * @deprecated deprecated in 3.1.0, exceptions should be immutable, this - * method should not be used - */ - @Deprecated - public void setCode(int code) { - this.code = Code.get(code); - } - - /** This interface contains the original static final int constants - * which have now been replaced with an enumeration in Code. Do not - * reference this class directly, if necessary (legacy code) continue - * to access the constants through Code. - * Note: an interface is used here due to the fact that enums cannot - * reference constants defined within the same enum as said constants - * are considered initialized _after_ the enum itself. By using an - * interface as a super type this allows the deprecated constants to - * be initialized first and referenced when constructing the enums. I - * didn't want to have constants declared twice. This - * interface should be private, but it's declared public to enable - * javadoc to include in the user API spec. - */ - @Deprecated - public interface CodeDeprecated { - /** - * @deprecated deprecated in 3.1.0, use {@link Code#OK} instead - */ - @Deprecated - public static final int Ok = 0; - - /** - * @deprecated deprecated in 3.1.0, use {@link Code#SYSTEMERROR} instead - */ - @Deprecated - public static final int SystemError = -1; - /** - * @deprecated deprecated in 3.1.0, use - * {@link Code#RUNTIMEINCONSISTENCY} instead - */ - @Deprecated - public static final int RuntimeInconsistency = -2; - /** - * @deprecated deprecated in 3.1.0, use {@link Code#DATAINCONSISTENCY} - * instead - */ - @Deprecated - public static final int DataInconsistency = -3; - /** - * @deprecated deprecated in 3.1.0, use {@link Code#CONNECTIONLOSS} - * instead - */ - @Deprecated - public static final int ConnectionLoss = -4; - /** - * @deprecated deprecated in 3.1.0, use {@link Code#MARSHALLINGERROR} - * instead - */ - @Deprecated - public static final int MarshallingError = -5; - /** - * @deprecated deprecated in 3.1.0, use {@link Code#UNIMPLEMENTED} - * instead - */ - @Deprecated - public static final int Unimplemented = -6; - /** - * @deprecated deprecated in 3.1.0, use {@link Code#OPERATIONTIMEOUT} - * instead - */ - @Deprecated - public static final int OperationTimeout = -7; - /** - * @deprecated deprecated in 3.1.0, use {@link Code#BADARGUMENTS} - * instead - */ - @Deprecated - public static final int BadArguments = -8; - - /** - * @deprecated deprecated in 3.1.0, use {@link Code#APIERROR} instead - */ - @Deprecated - public static final int APIError = -100; - - /** - * @deprecated deprecated in 3.1.0, use {@link Code#NONODE} instead - */ - @Deprecated - public static final int NoNode = -101; - /** - * @deprecated deprecated in 3.1.0, use {@link Code#NOAUTH} instead - */ - @Deprecated - public static final int NoAuth = -102; - /** - * @deprecated deprecated in 3.1.0, use {@link Code#BADVERSION} instead - */ - @Deprecated - public static final int BadVersion = -103; - /** - * @deprecated deprecated in 3.1.0, use - * {@link Code#NOCHILDRENFOREPHEMERALS} - * instead - */ - @Deprecated - public static final int NoChildrenForEphemerals = -108; - /** - * @deprecated deprecated in 3.1.0, use {@link Code#NODEEXISTS} instead - */ - @Deprecated - public static final int NodeExists = -110; - /** - * @deprecated deprecated in 3.1.0, use {@link Code#NOTEMPTY} instead - */ - @Deprecated - public static final int NotEmpty = -111; - /** - * @deprecated deprecated in 3.1.0, use {@link Code#SESSIONEXPIRED} instead - */ - @Deprecated - public static final int SessionExpired = -112; - /** - * @deprecated deprecated in 3.1.0, use {@link Code#INVALIDCALLBACK} - * instead - */ - @Deprecated - public static final int InvalidCallback = -113; - /** - * @deprecated deprecated in 3.1.0, use {@link Code#INVALIDACL} instead - */ - @Deprecated - public static final int InvalidACL = -114; - /** - * @deprecated deprecated in 3.1.0, use {@link Code#AUTHFAILED} instead - */ - @Deprecated - public static final int AuthFailed = -115; - /** - * This value will be used directly in {@link CODE#SESSIONMOVED} - */ - // public static final int SessionMoved = -118; - } - - /** Codes which represent the various KeeperException - * types. This enum replaces the deprecated earlier static final int - * constants. The old, deprecated, values are in "camel case" while the new - * enum values are in all CAPS. - */ - public static enum Code implements CodeDeprecated { - /** Everything is OK */ - OK (Ok), - - /** System and server-side errors. - * This is never thrown by the server, it shouldn't be used other than - * to indicate a range. Specifically error codes greater than this - * value, but lesser than {@link #APIERROR}, are system errors. - */ - SYSTEMERROR (SystemError), - - /** A runtime inconsistency was found */ - RUNTIMEINCONSISTENCY (RuntimeInconsistency), - /** A data inconsistency was found */ - DATAINCONSISTENCY (DataInconsistency), - /** Connection to the server has been lost */ - CONNECTIONLOSS (ConnectionLoss), - /** Error while marshalling or unmarshalling data */ - MARSHALLINGERROR (MarshallingError), - /** Operation is unimplemented */ - UNIMPLEMENTED (Unimplemented), - /** Operation timeout */ - OPERATIONTIMEOUT (OperationTimeout), - /** Invalid arguments */ - BADARGUMENTS (BadArguments), - - /** API errors. - * This is never thrown by the server, it shouldn't be used other than - * to indicate a range. Specifically error codes greater than this - * value are API errors (while values less than this indicate a - * {@link #SYSTEMERROR}). - */ - APIERROR (APIError), - - /** Node does not exist */ - NONODE (NoNode), - /** Not authenticated */ - NOAUTH (NoAuth), - /** Version conflict */ - BADVERSION (BadVersion), - /** Ephemeral nodes may not have children */ - NOCHILDRENFOREPHEMERALS (NoChildrenForEphemerals), - /** The node already exists */ - NODEEXISTS (NodeExists), - /** The node has children */ - NOTEMPTY (NotEmpty), - /** The session has been expired by the server */ - SESSIONEXPIRED (SessionExpired), - /** Invalid callback specified */ - INVALIDCALLBACK (InvalidCallback), - /** Invalid ACL specified */ - INVALIDACL (InvalidACL), - /** Client authentication failed */ - AUTHFAILED (AuthFailed), - /** Session moved to another server, so operation is ignored */ - SESSIONMOVED (-118), - /** State-changing request is passed to read-only server */ - NOTREADONLY (-119); - - private static final Map lookup - = new HashMap(); - - static { - for(Code c : EnumSet.allOf(Code.class)) - lookup.put(c.code, c); - } - - private final int code; - Code(int code) { - this.code = code; - } - - /** - * Get the int value for a particular Code. - * @return error code as integer - */ - public int intValue() { return code; } - - /** - * Get the Code value for a particular integer error code - * @param code int error code - * @return Code value corresponding to specified int code, or null - */ - public static Code get(int code) { - return lookup.get(code); - } - } - - static String getCodeMessage(Code code) { - switch (code) { - case OK: - return "ok"; - case SYSTEMERROR: - return "SystemError"; - case RUNTIMEINCONSISTENCY: - return "RuntimeInconsistency"; - case DATAINCONSISTENCY: - return "DataInconsistency"; - case CONNECTIONLOSS: - return "ConnectionLoss"; - case MARSHALLINGERROR: - return "MarshallingError"; - case UNIMPLEMENTED: - return "Unimplemented"; - case OPERATIONTIMEOUT: - return "OperationTimeout"; - case BADARGUMENTS: - return "BadArguments"; - case APIERROR: - return "APIError"; - case NONODE: - return "NoNode"; - case NOAUTH: - return "NoAuth"; - case BADVERSION: - return "BadVersion"; - case NOCHILDRENFOREPHEMERALS: - return "NoChildrenForEphemerals"; - case NODEEXISTS: - return "NodeExists"; - case INVALIDACL: - return "InvalidACL"; - case AUTHFAILED: - return "AuthFailed"; - case NOTEMPTY: - return "Directory not empty"; - case SESSIONEXPIRED: - return "Session expired"; - case INVALIDCALLBACK: - return "Invalid callback"; - case SESSIONMOVED: - return "Session moved"; - case NOTREADONLY: - return "Not a read-only call"; - default: - return "Unknown error " + code; - } - } - - private Code code; - - private String path; - - public KeeperException(Code code) { - this.code = code; - } - - KeeperException(Code code, String path) { - this.code = code; - this.path = path; - } - - /** - * Read the error code for this exception - * @return the error code for this exception - * @deprecated deprecated in 3.1.0, use {@link #code()} instead - */ - @Deprecated - public int getCode() { - return code.code; - } - - /** - * Read the error Code for this exception - * @return the error Code for this exception - */ - public Code code() { - return code; - } - - /** - * Read the path for this exception - * @return the path associated with this error, null if none - */ - public String getPath() { - return path; - } - - @Override - public String getMessage() { - if (path == null) { - return "KeeperErrorCode = " + getCodeMessage(code); - } - return "KeeperErrorCode = " + getCodeMessage(code) + " for " + path; - } - - void setMultiResults(List results) { - this.results = results; - } - - /** - * If this exception was thrown by a multi-request then the (partial) results - * and error codes can be retrieved using this getter. - * @return A copy of the list of results from the operations in the multi-request. - * - * @since 3.4.0 - * - */ - public List getResults() { - return results != null ? new ArrayList(results) : null; - } - - /** - * @see Code#APIERROR - */ - public static class APIErrorException extends KeeperException { - public APIErrorException() { - super(Code.APIERROR); - } - } - - /** - * @see Code#AUTHFAILED - */ - public static class AuthFailedException extends KeeperException { - public AuthFailedException() { - super(Code.AUTHFAILED); - } - } - - /** - * @see Code#BADARGUMENTS - */ - public static class BadArgumentsException extends KeeperException { - public BadArgumentsException() { - super(Code.BADARGUMENTS); - } - public BadArgumentsException(String path) { - super(Code.BADARGUMENTS, path); - } - } - - /** - * @see Code#BADVERSION - */ - public static class BadVersionException extends KeeperException { - public BadVersionException() { - super(Code.BADVERSION); - } - public BadVersionException(String path) { - super(Code.BADVERSION, path); - } - } - - /** - * @see Code#CONNECTIONLOSS - */ - public static class ConnectionLossException extends KeeperException { - public ConnectionLossException() { - super(Code.CONNECTIONLOSS); - } - } - - /** - * @see Code#DATAINCONSISTENCY - */ - public static class DataInconsistencyException extends KeeperException { - public DataInconsistencyException() { - super(Code.DATAINCONSISTENCY); - } - } - - /** - * @see Code#INVALIDACL - */ - public static class InvalidACLException extends KeeperException { - public InvalidACLException() { - super(Code.INVALIDACL); - } - public InvalidACLException(String path) { - super(Code.INVALIDACL, path); - } - } - - /** - * @see Code#INVALIDCALLBACK - */ - public static class InvalidCallbackException extends KeeperException { - public InvalidCallbackException() { - super(Code.INVALIDCALLBACK); - } - } - - /** - * @see Code#MARSHALLINGERROR - */ - public static class MarshallingErrorException extends KeeperException { - public MarshallingErrorException() { - super(Code.MARSHALLINGERROR); - } - } - - /** - * @see Code#NOAUTH - */ - public static class NoAuthException extends KeeperException { - public NoAuthException() { - super(Code.NOAUTH); - } - } - - /** - * @see Code#NOCHILDRENFOREPHEMERALS - */ - public static class NoChildrenForEphemeralsException extends KeeperException { - public NoChildrenForEphemeralsException() { - super(Code.NOCHILDRENFOREPHEMERALS); - } - public NoChildrenForEphemeralsException(String path) { - super(Code.NOCHILDRENFOREPHEMERALS, path); - } - } - - /** - * @see Code#NODEEXISTS - */ - public static class NodeExistsException extends KeeperException { - public NodeExistsException() { - super(Code.NODEEXISTS); - } - public NodeExistsException(String path) { - super(Code.NODEEXISTS, path); - } - } - - /** - * @see Code#NONODE - */ - public static class NoNodeException extends KeeperException { - public NoNodeException() { - super(Code.NONODE); - } - public NoNodeException(String path) { - super(Code.NONODE, path); - } - } - - /** - * @see Code#NOTEMPTY - */ - public static class NotEmptyException extends KeeperException { - public NotEmptyException() { - super(Code.NOTEMPTY); - } - public NotEmptyException(String path) { - super(Code.NOTEMPTY, path); - } - } - - /** - * @see Code#OPERATIONTIMEOUT - */ - public static class OperationTimeoutException extends KeeperException { - public OperationTimeoutException() { - super(Code.OPERATIONTIMEOUT); - } - } - - /** - * @see Code#RUNTIMEINCONSISTENCY - */ - public static class RuntimeInconsistencyException extends KeeperException { - public RuntimeInconsistencyException() { - super(Code.RUNTIMEINCONSISTENCY); - } - } - - /** - * @see Code#SESSIONEXPIRED - */ - public static class SessionExpiredException extends KeeperException { - public SessionExpiredException() { - super(Code.SESSIONEXPIRED); - } - } - - /** - * @see Code#SESSIONMOVED - */ - public static class SessionMovedException extends KeeperException { - public SessionMovedException() { - super(Code.SESSIONMOVED); - } - } - - /** - * @see Code#NOTREADONLY - */ - public static class NotReadOnlyException extends KeeperException { - public NotReadOnlyException() { - super(Code.NOTREADONLY); - } - } - - /** - * @see Code#SYSTEMERROR - */ - public static class SystemErrorException extends KeeperException { - public SystemErrorException() { - super(Code.SYSTEMERROR); - } - } - - /** - * @see Code#UNIMPLEMENTED - */ - public static class UnimplementedException extends KeeperException { - public UnimplementedException() { - super(Code.UNIMPLEMENTED); - } - } -} diff --git a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/Login.java b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/Login.java deleted file mode 100644 index 31ac39a28..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/Login.java +++ /dev/null @@ -1,402 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you 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. - */ - -package org.apache.zookeeper; - -/** - * This class is responsible for refreshing Kerberos credentials for - * logins for both Zookeeper client and server. - * See ZooKeeperSaslServer for server-side usage. - * See ZooKeeperSaslClient for client-side usage. - */ - -import javax.security.auth.kerberos.KerberosPrincipal; -import javax.security.auth.login.AppConfigurationEntry; -import javax.security.auth.login.Configuration; -import javax.security.auth.login.LoginContext; -import javax.security.auth.login.LoginException; -import javax.security.auth.callback.CallbackHandler; - -import org.apache.log4j.Logger; -import org.apache.zookeeper.client.ZooKeeperSaslClient; -import javax.security.auth.kerberos.KerberosTicket; -import javax.security.auth.Subject; -import java.util.Date; -import java.util.Random; -import java.util.Set; - -public class Login { - Logger LOG = Logger.getLogger(Login.class); - public CallbackHandler callbackHandler; - - // LoginThread will sleep until 80% of time from last refresh to - // ticket's expiry has been reached, at which time it will wake - // and try to renew the ticket. - private static final float TICKET_RENEW_WINDOW = 0.80f; - - /** - * Percentage of random jitter added to the renewal time - */ - private static final float TICKET_RENEW_JITTER = 0.05f; - - // Regardless of TICKET_RENEW_WINDOW setting above and the ticket expiry time, - // thread will not sleep between refresh attempts any less than 1 minute (60*1000 milliseconds = 1 minute). - // Change the '1' to e.g. 5, to change this to 5 minutes. - private static final long MIN_TIME_BEFORE_RELOGIN = 1 * 60 * 1000L; - - private Subject subject = null; - private Thread t = null; - private boolean isKrbTicket = false; - private boolean isUsingTicketCache = false; - private boolean isUsingKeytab = false; - - /** Random number generator */ - private static Random rng = new Random(); - - private LoginContext login = null; - private String loginContextName = null; - private String keytabFile = null; - private String principal = null; - - private long lastLogin = 0; - - /** - * LoginThread constructor. The constructor starts the thread used - * to periodically re-login to the Kerberos Ticket Granting Server. - * @param loginContextName - * name of section in JAAS file that will be use to login. - * Passed as first param to javax.security.auth.login.LoginContext(). - * - * @param callbackHandler - * Passed as second param to javax.security.auth.login.LoginContext(). - * @throws javax.security.auth.login.LoginException - * Thrown if authentication fails. - */ - public Login(final String loginContextName, CallbackHandler callbackHandler) - throws LoginException { - this.callbackHandler = callbackHandler; - login = login(loginContextName); - this.loginContextName = loginContextName; - subject = login.getSubject(); - isKrbTicket = !subject.getPrivateCredentials(KerberosTicket.class).isEmpty(); - AppConfigurationEntry entries[] = Configuration.getConfiguration().getAppConfigurationEntry(loginContextName); - for (AppConfigurationEntry entry: entries) { - // there will only be a single entry, so this for() loop will only be iterated through once. - if (entry.getOptions().get("useTicketCache") != null) { - String val = (String)entry.getOptions().get("useTicketCache"); - if (val.equals("true")) { - isUsingTicketCache = true; - } - } - if (entry.getOptions().get("keyTab") != null) { - keytabFile = (String)entry.getOptions().get("keyTab"); - isUsingKeytab = true; - } - if (entry.getOptions().get("principal") != null) { - principal = (String)entry.getOptions().get("principal"); - } - break; - } - - if (!isKrbTicket) { - // if no TGT, do not bother with ticket management. - return; - } - - // Refresh the Ticket Granting Ticket (TGT) periodically. How often to refresh is determined by the - // TGT's existing expiry date and the configured MIN_TIME_BEFORE_RELOGIN. For testing and development, - // you can decrease the interval of expiration of tickets (for example, to 3 minutes) by running : - // "modprinc -maxlife 3mins " in kadmin. - t = new Thread(new Runnable() { - public void run() { - LOG.info("TGT refresh thread started."); - while (true) { // renewal thread's main loop. if it exits from here, thread will exit. - KerberosTicket tgt = getTGT(); - long now = System.currentTimeMillis(); - long nextRefresh; - Date nextRefreshDate; - if (tgt == null) { - nextRefresh = now + MIN_TIME_BEFORE_RELOGIN; - nextRefreshDate = new Date(nextRefresh); - LOG.warn("No TGT found: will try again at " + nextRefreshDate); - } else { - nextRefresh = getRefreshTime(tgt); - long expiry = tgt.getEndTime().getTime(); - Date expiryDate = new Date(expiry); - if ((isUsingTicketCache) && (tgt.getEndTime().equals(tgt.getRenewTill()))) { - LOG.error("The TGT cannot be renewed beyond the next expiry date: " + expiryDate + "." + - "This process will not be able to authenticate new SASL connections after that " + - "time (for example, it will not be authenticate a new connection with a Zookeeper " + - "Quorum member). Ask your system administrator to either increase the " + - "'renew until' time by doing : 'modprinc -maxrenewlife " + principal + "' within " + - "kadmin, or instead, to generate a keytab for " + principal + ". Because the TGT's " + - "expiry cannot be further extended by refreshing, exiting refresh thread now."); - return; - } - // determine how long to sleep from looking at ticket's expiry. - // We should not allow the ticket to expire, but we should take into consideration - // MIN_TIME_BEFORE_RELOGIN. Will not sleep less than MIN_TIME_BEFORE_RELOGIN, unless doing so - // would cause ticket expiration. - if ((nextRefresh > expiry) || - ((now + MIN_TIME_BEFORE_RELOGIN) > expiry)) { - // expiry is before next scheduled refresh). - LOG.info("refreshing now because expiry is before next scheduled refresh time."); - nextRefresh = now; - } else { - if (nextRefresh < (now + MIN_TIME_BEFORE_RELOGIN)) { - // next scheduled refresh is sooner than (now + MIN_TIME_BEFORE_LOGIN). - Date until = new Date(nextRefresh); - Date newuntil = new Date(now + MIN_TIME_BEFORE_RELOGIN); - LOG.warn("TGT refresh thread time adjusted from : " + until + " to : " + newuntil + " since " - + "the former is sooner than the minimum refresh interval (" - + MIN_TIME_BEFORE_RELOGIN / 1000 + " seconds) from now."); - } - nextRefresh = Math.max(nextRefresh, now + MIN_TIME_BEFORE_RELOGIN); - } - nextRefreshDate = new Date(nextRefresh); - if (nextRefresh > expiry) { - LOG.error("next refresh: " + nextRefreshDate + " is later than expiry " + expiryDate - + ". This may indicate a clock skew problem. Check that this host and the KDC's " - + "hosts' clocks are in sync. Exiting refresh thread."); - return; - } - } - if (now < nextRefresh) { - Date until = new Date(nextRefresh); - LOG.info("TGT refresh sleeping until: " + until.toString()); - try { - Thread.sleep(nextRefresh - now); - } catch (InterruptedException ie) { - LOG.warn("TGT renewal thread has been interrupted and will exit."); - break; - } - } - else { - LOG.error("nextRefresh:" + nextRefreshDate + " is in the past: exiting refresh thread. Check" - + " clock sync between this host and KDC - (KDC's clock is likely ahead of this host)." - + " Manual intervention will be required for this client to successfully authenticate." - + " Exiting refresh thread."); - return; - } - if (isUsingTicketCache) { - String cmd = "/usr/bin/kinit"; - if (System.getProperty("zookeeper.kinit") != null) { - cmd = System.getProperty("zookeeper.kinit"); - } - String kinitArgs = "-R"; - int retry = 1; - while (retry >= 0) { - try { - LOG.debug("running ticket cache refresh command: " + cmd + " " + kinitArgs); - Shell.execCommand(cmd, kinitArgs); - break; - } catch (Exception e) { - if (retry > 0) { - --retry; - // sleep for 10 seconds - try { - Thread.sleep(10 * 1000); - } catch (InterruptedException ie) { - LOG.error("Interrupted while renewing TGT, exiting Login thread"); - return; - } - } else { - LOG.warn("Could not renew TGT due to problem running shell command: '" + cmd - + " " + kinitArgs + "'" + "; exception was:" + e + ". Exiting refresh thread.",e); - return; - } - } - } - } - try { - int retry = 1; - while (retry >= 0) { - try { - reLogin(); - break; - } catch (LoginException le) { - if (retry > 0) { - --retry; - // sleep for 10 seconds. - try { - Thread.sleep(10 * 1000); - } catch (InterruptedException e) { - LOG.error("Interrupted during login retry after LoginException:", le); - throw le; - } - } else { - LOG.error("Could not refresh TGT for principal: " + principal + ".", le); - } - } - } - } catch (LoginException le) { - LOG.error("Failed to refresh TGT: refresh thread exiting now.",le); - break; - } - } - } - }); - t.setDaemon(true); - } - - public void startThreadIfNeeded() { - // thread object 't' will be null if a refresh thread is not needed. - if (t != null) { - t.start(); - } - } - - public void shutdown() { - if ((t != null) && (t.isAlive())) { - t.interrupt(); - try { - t.join(); - } catch (InterruptedException e) { - LOG.warn("error while waiting for Login thread to shutdown: " + e); - } - } - } - - public Subject getSubject() { - return subject; - } - - public String getLoginContextName() { - return loginContextName; - } - - private synchronized LoginContext login(final String loginContextName) throws LoginException { - if (loginContextName == null) { - throw new LoginException("loginContext name (JAAS file section header) was null. " + - "Please check your java.security.login.auth.config (=" + - System.getProperty("java.security.login.auth.config") + - ") and your " + ZooKeeperSaslClient.LOGIN_CONTEXT_NAME_KEY + "(=" + - System.getProperty(ZooKeeperSaslClient.LOGIN_CONTEXT_NAME_KEY, "Client") + ")"); - } - LoginContext loginContext = new LoginContext(loginContextName,callbackHandler); - loginContext.login(); - LOG.info("successfully logged in."); - return loginContext; - } - - // c.f. org.apache.hadoop.security.UserGroupInformation. - private long getRefreshTime(KerberosTicket tgt) { - long start = tgt.getStartTime().getTime(); - long expires = tgt.getEndTime().getTime(); - LOG.info("TGT valid starting at: " + tgt.getStartTime().toString()); - LOG.info("TGT expires: " + tgt.getEndTime().toString()); - long proposedRefresh = start + (long) ((expires - start) * - (TICKET_RENEW_WINDOW + (TICKET_RENEW_JITTER * rng.nextDouble()))); - if (proposedRefresh > expires) { - // proposedRefresh is too far in the future: it's after ticket expires: simply return now. - return System.currentTimeMillis(); - } - else { - return proposedRefresh; - } - } - - private synchronized KerberosTicket getTGT() { - Set tickets = subject.getPrivateCredentials(KerberosTicket.class); - for(KerberosTicket ticket: tickets) { - KerberosPrincipal server = ticket.getServer(); - if (server.getName().equals("krbtgt/" + server.getRealm() + "@" + server.getRealm())) { - LOG.debug("Found tgt " + ticket + "."); - return ticket; - } - } - return null; - } - - private boolean hasSufficientTimeElapsed() { - long now = System.currentTimeMillis(); - if (now - getLastLogin() < MIN_TIME_BEFORE_RELOGIN ) { - LOG.warn("Not attempting to re-login since the last re-login was " + - "attempted less than " + (MIN_TIME_BEFORE_RELOGIN/1000) + " seconds"+ - " before."); - return false; - } - // register most recent relogin attempt - setLastLogin(now); - return true; - } - - /** - * Returns login object - * @return login - */ - private LoginContext getLogin() { - return login; - } - - /** - * Set the login object - * @param login - */ - private void setLogin(LoginContext login) { - this.login = login; - } - - /** - * Set the last login time. - * @param time the number of milliseconds since the beginning of time - */ - private void setLastLogin(long time) { - lastLogin = time; - } - - /** - * Get the time of the last login. - * @return the number of milliseconds since the beginning of time. - */ - private long getLastLogin() { - return lastLogin; - } - - /** - * Re-login a principal. This method assumes that {@link #login(String)} has happened already. - * @throws javax.security.auth.login.LoginException on a failure - */ - // c.f. HADOOP-6559 - private synchronized void reLogin() - throws LoginException { - if (!isKrbTicket) { - return; - } - LoginContext login = getLogin(); - if (login == null) { - throw new LoginException("login must be done first"); - } - if (!hasSufficientTimeElapsed()) { - return; - } - LOG.info("Initiating logout for " + principal); - synchronized (Login.class) { - //clear up the kerberos state. But the tokens are not cleared! As per - //the Java kerberos login module code, only the kerberos credentials - //are cleared - login.logout(); - //login and also update the subject field of this instance to - //have the new credentials (pass it to the LoginContext constructor) - login = new LoginContext(loginContextName, getSubject()); - LOG.info("Initiating re-login for " + principal); - login.login(); - setLogin(login); - } - } -} diff --git a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/MultiResponse.java b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/MultiResponse.java deleted file mode 100644 index 70f76236e..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/MultiResponse.java +++ /dev/null @@ -1,166 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You 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. - */ - -package org.apache.zookeeper; - -import org.apache.jute.InputArchive; -import org.apache.jute.OutputArchive; -import org.apache.jute.Record; -import org.apache.zookeeper.proto.CreateResponse; -import org.apache.zookeeper.proto.MultiHeader; -import org.apache.zookeeper.proto.SetDataResponse; -import org.apache.zookeeper.proto.ErrorResponse; - -import java.io.IOException; -import java.util.ArrayList; -import java.util.Iterator; -import java.util.List; - -/** - * Handles the response from a multi request. Such a response consists of - * a sequence of responses each prefixed by a MultiResponse that indicates - * the type of the response. The end of the list is indicated by a MultiHeader - * with a negative type. Each individual response is in the same format as - * with the corresponding operation in the original request list. - */ -public class MultiResponse implements Record, Iterable { - private List results = new ArrayList(); - - public void add(OpResult x) { - results.add(x); - } - - @Override - public Iterator iterator() { - return results.iterator(); - } - - public int size() { - return results.size(); - } - - @Override - public void serialize(OutputArchive archive, String tag) throws IOException { - archive.startRecord(this, tag); - - int index = 0; - for (OpResult result : results) { - int err = result.getType() == ZooDefs.OpCode.error ? ((OpResult.ErrorResult)result).getErr() : 0; - - new MultiHeader(result.getType(), false, err).serialize(archive, tag); - - switch (result.getType()) { - case ZooDefs.OpCode.create: - new CreateResponse(((OpResult.CreateResult) result).getPath()).serialize(archive, tag); - break; - case ZooDefs.OpCode.delete: - case ZooDefs.OpCode.check: - break; - case ZooDefs.OpCode.setData: - new SetDataResponse(((OpResult.SetDataResult) result).getStat()).serialize(archive, tag); - break; - case ZooDefs.OpCode.error: - new ErrorResponse(((OpResult.ErrorResult) result).getErr()).serialize(archive, tag); - break; - default: - throw new IOException("Invalid type " + result.getType() + " in MultiResponse"); - } - } - new MultiHeader(-1, true, -1).serialize(archive, tag); - archive.endRecord(this, tag); - } - - @Override - public void deserialize(InputArchive archive, String tag) throws IOException { - results = new ArrayList(); - - archive.startRecord(tag); - MultiHeader h = new MultiHeader(); - h.deserialize(archive, tag); - while (!h.getDone()) { - switch (h.getType()) { - case ZooDefs.OpCode.create: - CreateResponse cr = new CreateResponse(); - cr.deserialize(archive, tag); - results.add(new OpResult.CreateResult(cr.getPath())); - break; - - case ZooDefs.OpCode.delete: - results.add(new OpResult.DeleteResult()); - break; - - case ZooDefs.OpCode.setData: - SetDataResponse sdr = new SetDataResponse(); - sdr.deserialize(archive, tag); - results.add(new OpResult.SetDataResult(sdr.getStat())); - break; - - case ZooDefs.OpCode.check: - results.add(new OpResult.CheckResult()); - break; - - case ZooDefs.OpCode.error: - //FIXME: need way to more cleanly serialize/deserialize exceptions - ErrorResponse er = new ErrorResponse(); - er.deserialize(archive, tag); - results.add(new OpResult.ErrorResult(er.getErr())); - break; - - default: - throw new IOException("Invalid type " + h.getType() + " in MultiResponse"); - } - h.deserialize(archive, tag); - } - archive.endRecord(tag); - } - - public List getResultList() { - return results; - } - - @Override - public boolean equals(Object o) { - if (this == o) return true; - if (!(o instanceof MultiResponse)) return false; - - MultiResponse other = (MultiResponse) o; - - if (results != null) { - Iterator i = other.results.iterator(); - for (OpResult result : results) { - if (i.hasNext()) { - if (!result.equals(i.next())) { - return false; - } - } else { - return false; - } - } - return !i.hasNext(); - } - else return other.results == null; - } - - @Override - public int hashCode() { - int hash = results.size(); - for (OpResult result : results) { - hash = (hash * 35) + result.hashCode(); - } - return hash; - } -} diff --git a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/MultiTransactionRecord.java b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/MultiTransactionRecord.java deleted file mode 100644 index 801969a9a..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/MultiTransactionRecord.java +++ /dev/null @@ -1,160 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You 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. - */ - -package org.apache.zookeeper; - -import org.apache.jute.InputArchive; -import org.apache.jute.OutputArchive; -import org.apache.jute.Record; -import org.apache.zookeeper.proto.*; - -import java.io.IOException; -import java.util.ArrayList; -import java.util.Iterator; -import java.util.List; - -/** - * Encodes a composite transaction. In the wire format, each transaction - * consists of a single MultiHeader followed by the appropriate request. - * Each of these MultiHeaders has a type which indicates - * the type of the following transaction or a negative number if no more transactions - * are included. - */ -public class MultiTransactionRecord implements Record, Iterable { - private List ops = new ArrayList(); - - public MultiTransactionRecord() { - } - - public MultiTransactionRecord(Iterable ops) { - for (Op op : ops) { - add(op); - } - } - - @Override - public Iterator iterator() { - return ops.iterator() ; - } - - public void add(Op op) { - ops.add(op); - } - - public int size() { - return ops.size(); - } - - @Override - public void serialize(OutputArchive archive, String tag) throws IOException { - archive.startRecord(this, tag); - int index = 0 ; - for (Op op : ops) { - MultiHeader h = new MultiHeader(op.getType(), false, -1); - h.serialize(archive, tag); - switch (op.getType()) { - case ZooDefs.OpCode.create: - op.toRequestRecord().serialize(archive, tag); - break; - case ZooDefs.OpCode.delete: - op.toRequestRecord().serialize(archive, tag); - break; - case ZooDefs.OpCode.setData: - op.toRequestRecord().serialize(archive, tag); - break; - case ZooDefs.OpCode.check: - op.toRequestRecord().serialize(archive, tag); - break; - default: - throw new IOException("Invalid type of op"); - } - } - new MultiHeader(-1, true, -1).serialize(archive, tag); - archive.endRecord(this, tag); - } - - @Override - public void deserialize(InputArchive archive, String tag) throws IOException { - archive.startRecord(tag); - MultiHeader h = new MultiHeader(); - h.deserialize(archive, tag); - - while (!h.getDone()) { - switch (h.getType()) { - case ZooDefs.OpCode.create: - CreateRequest cr = new CreateRequest(); - cr.deserialize(archive, tag); - add(Op.create(cr.getPath(), cr.getData(), cr.getAcl(), cr.getFlags())); - break; - case ZooDefs.OpCode.delete: - DeleteRequest dr = new DeleteRequest(); - dr.deserialize(archive, tag); - add(Op.delete(dr.getPath(), dr.getVersion())); - break; - case ZooDefs.OpCode.setData: - SetDataRequest sdr = new SetDataRequest(); - sdr.deserialize(archive, tag); - add(Op.setData(sdr.getPath(), sdr.getData(), sdr.getVersion())); - break; - case ZooDefs.OpCode.check: - CheckVersionRequest cvr = new CheckVersionRequest(); - cvr.deserialize(archive, tag); - add(Op.check(cvr.getPath(), cvr.getVersion())); - break; - default: - throw new IOException("Invalid type of op"); - } - h.deserialize(archive, tag); - } - archive.endRecord(tag); - } - - @Override - public boolean equals(Object o) { - if (this == o) return true; - if (!(o instanceof MultiTransactionRecord)) return false; - - MultiTransactionRecord that = (MultiTransactionRecord) o; - - if (ops != null) { - Iterator other = that.ops.iterator(); - for (Op op : ops) { - boolean hasMoreData = other.hasNext(); - if (!hasMoreData) { - return false; - } - Op otherOp = other.next(); - if (!op.equals(otherOp)) { - return false; - } - } - return !other.hasNext(); - } else { - return that.ops == null; - } - - } - - @Override - public int hashCode() { - int h = 1023; - for (Op op : ops) { - h = h * 25 + op.hashCode(); - } - return h; - } -} diff --git a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/Op.java b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/Op.java deleted file mode 100644 index 1bc206101..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/Op.java +++ /dev/null @@ -1,351 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You 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. - */ - -package org.apache.zookeeper; - -import org.apache.jute.Record; -import org.apache.zookeeper.common.PathUtils; -import org.apache.zookeeper.data.ACL; -import org.apache.zookeeper.proto.CheckVersionRequest; -import org.apache.zookeeper.proto.CreateRequest; -import org.apache.zookeeper.proto.DeleteRequest; -import org.apache.zookeeper.proto.SetDataRequest; - -import java.util.Arrays; -import java.util.Iterator; -import java.util.List; - -/** - * Represents a single operation in a multi-operation transaction. Each operation can be a create, update - * or delete or can just be a version check. - * - * Sub-classes of Op each represent each detailed type but should not normally be referenced except via - * the provided factory methods. - * - * @see ZooKeeper#create(String, byte[], java.util.List, CreateMode) - * @see ZooKeeper#create(String, byte[], java.util.List, CreateMode, org.apache.zookeeper.AsyncCallback.StringCallback, Object) - * @see ZooKeeper#delete(String, int) - * @see ZooKeeper#setData(String, byte[], int) - */ -public abstract class Op { - private int type; - private String path; - - // prevent untyped construction - private Op(int type, String path) { - this.type = type; - this.path = path; - } - - /** - * Constructs a create operation. Arguments are as for the ZooKeeper method of the same name. - * @see ZooKeeper#create(String, byte[], java.util.List, CreateMode) - * @see CreateMode#fromFlag(int) - * - * @param path - * the path for the node - * @param data - * the initial data for the node - * @param acl - * the acl for the node - * @param flags - * specifying whether the node to be created is ephemeral - * and/or sequential but using the integer encoding. - */ - public static Op create(String path, byte[] data, List acl, int flags) { - return new Create(path, data, acl, flags); - } - - /** - * Constructs a create operation. Arguments are as for the ZooKeeper method of the same name. - * @see ZooKeeper#create(String, byte[], java.util.List, CreateMode) - * - * @param path - * the path for the node - * @param data - * the initial data for the node - * @param acl - * the acl for the node - * @param createMode - * specifying whether the node to be created is ephemeral - * and/or sequential - */ - public static Op create(String path, byte[] data, List acl, CreateMode createMode) { - return new Create(path, data, acl, createMode); - } - - /** - * Constructs a delete operation. Arguments are as for the ZooKeeper method of the same name. - * @see ZooKeeper#delete(String, int) - * - * @param path - * the path of the node to be deleted. - * @param version - * the expected node version. - */ - public static Op delete(String path, int version) { - return new Delete(path, version); - } - - /** - * Constructs an update operation. Arguments are as for the ZooKeeper method of the same name. - * @see ZooKeeper#setData(String, byte[], int) - * - * @param path - * the path of the node - * @param data - * the data to set - * @param version - * the expected matching version - */ - public static Op setData(String path, byte[] data, int version) { - return new SetData(path, data, version); - } - - - /** - * Constructs an version check operation. Arguments are as for the ZooKeeper.setData method except that - * no data is provided since no update is intended. The purpose for this is to allow read-modify-write - * operations that apply to multiple znodes, but where some of the znodes are involved only in the read, - * not the write. A similar effect could be achieved by writing the same data back, but that leads to - * way more version updates than are necessary and more writing in general. - * - * @param path - * the path of the node - * @param version - * the expected matching version - */ - public static Op check(String path, int version) { - return new Check(path, version); - } - - /** - * Gets the integer type code for an Op. This code should be as from ZooDefs.OpCode - * @see ZooDefs.OpCode - * @return The type code. - */ - public int getType() { - return type; - } - - /** - * Gets the path for an Op. - * @return The path. - */ - public String getPath() { - return path; - } - - /** - * Encodes an op for wire transmission. - * @return An appropriate Record structure. - */ - public abstract Record toRequestRecord() ; - - /** - * Reconstructs the transaction with the chroot prefix. - * - * @return transaction with chroot. - */ - abstract Op withChroot(String addRootPrefix); - - /** - * Performs client path validations. - * - * @throws IllegalArgumentException - * if an invalid path is specified - * @throws KeeperException.BadArgumentsException - * if an invalid create mode flag is specified - */ - void validate() throws KeeperException { - PathUtils.validatePath(path); - } - - ////////////////// - // these internal classes are public, but should not generally be referenced. - // - public static class Create extends Op { - private byte[] data; - private List acl; - private int flags; - - private Create(String path, byte[] data, List acl, int flags) { - super(ZooDefs.OpCode.create, path); - this.data = data; - this.acl = acl; - this.flags = flags; - } - - private Create(String path, byte[] data, List acl, CreateMode createMode) { - super(ZooDefs.OpCode.create, path); - this.data = data; - this.acl = acl; - this.flags = createMode.toFlag(); - } - - @Override - public boolean equals(Object o) { - if (this == o) return true; - if (!(o instanceof Create)) return false; - - Create op = (Create) o; - - boolean aclEquals = true; - Iterator i = op.acl.iterator(); - for (ACL acl : op.acl) { - boolean hasMoreData = i.hasNext(); - if (!hasMoreData) { - aclEquals = false; - break; - } - ACL otherAcl = i.next(); - if (!acl.equals(otherAcl)) { - aclEquals = false; - break; - } - } - return !i.hasNext() && getType() == op.getType() && Arrays.equals(data, op.data) && flags == op.flags && aclEquals; - } - - @Override - public int hashCode() { - return getType() + getPath().hashCode() + Arrays.hashCode(data); - } - - @Override - public Record toRequestRecord() { - return new CreateRequest(getPath(), data, acl, flags); - } - - @Override - Op withChroot(String path) { - return new Create(path, data, acl, flags); - } - - @Override - void validate() throws KeeperException { - CreateMode createMode = CreateMode.fromFlag(flags); - PathUtils.validatePath(getPath(), createMode.isSequential()); - } - } - - public static class Delete extends Op { - private int version; - - private Delete(String path, int version) { - super(ZooDefs.OpCode.delete, path); - this.version = version; - } - - @Override - public boolean equals(Object o) { - if (this == o) return true; - if (!(o instanceof Delete)) return false; - - Delete op = (Delete) o; - - return getType() == op.getType() && version == op.version - && getPath().equals(op.getPath()); - } - - @Override - public int hashCode() { - return getType() + getPath().hashCode() + version; - } - - @Override - public Record toRequestRecord() { - return new DeleteRequest(getPath(), version); - } - - @Override - Op withChroot(String path) { - return new Delete(path, version); - } - } - - public static class SetData extends Op { - private byte[] data; - private int version; - - private SetData(String path, byte[] data, int version) { - super(ZooDefs.OpCode.setData, path); - this.data = data; - this.version = version; - } - - @Override - public boolean equals(Object o) { - if (this == o) return true; - if (!(o instanceof SetData)) return false; - - SetData op = (SetData) o; - - return getType() == op.getType() && version == op.version - && getPath().equals(op.getPath()) && Arrays.equals(data, op.data); - } - - @Override - public int hashCode() { - return getType() + getPath().hashCode() + Arrays.hashCode(data) + version; - } - - @Override - public Record toRequestRecord() { - return new SetDataRequest(getPath(), data, version); - } - - @Override - Op withChroot(String path) { - return new SetData(path, data, version); - } - } - - public static class Check extends Op { - private int version; - - private Check(String path, int version) { - super(ZooDefs.OpCode.check, path); - this.version = version; - } - - @Override - public boolean equals(Object o) { - if (this == o) return true; - if (!(o instanceof Check)) return false; - - Check op = (Check) o; - - return getType() == op.getType() && getPath().equals(op.getPath()) && version == op.version; - } - - @Override - public int hashCode() { - return getType() + getPath().hashCode() + version; - } - - @Override - public Record toRequestRecord() { - return new CheckVersionRequest(getPath(), version); - } - - @Override - Op withChroot(String path) { - return new Check(path, version); - } - } -} diff --git a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/OpResult.java b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/OpResult.java deleted file mode 100644 index 45331d114..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/OpResult.java +++ /dev/null @@ -1,185 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You 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. - */ - -package org.apache.zookeeper; - - -import org.apache.zookeeper.data.Stat; - -/** - * Encodes the result of a single part of a multiple operation commit. - */ -public abstract class OpResult { - private int type; - - private OpResult(int type) { - this.type = type; - } - - /** - * Encodes the return type as from ZooDefs.OpCode. Can be used - * to dispatch to the correct cast needed for getting the desired - * additional result data. - * @see ZooDefs.OpCode - * @return an integer identifying what kind of operation this result came from. - */ - public int getType() { - return type; - } - - /** - * A result from a create operation. This kind of result allows the - * path to be retrieved since the create might have been a sequential - * create. - */ - public static class CreateResult extends OpResult { - private String path; - - public CreateResult(String path) { - super(ZooDefs.OpCode.create); - this.path = path; - } - - public String getPath() { - return path; - } - - @Override - public boolean equals(Object o) { - if (this == o) return true; - if (!(o instanceof CreateResult)) return false; - - CreateResult other = (CreateResult) o; - return getType() == other.getType() && path.equals(other.getPath()); - } - - @Override - public int hashCode() { - return getType() * 35 + path.hashCode(); - } - } - - /** - * A result from a delete operation. No special values are available. - */ - public static class DeleteResult extends OpResult { - public DeleteResult() { - super(ZooDefs.OpCode.delete); - } - - @Override - public boolean equals(Object o) { - if (this == o) return true; - if (!(o instanceof DeleteResult)) return false; - - DeleteResult opResult = (DeleteResult) o; - return getType() == opResult.getType(); - } - - @Override - public int hashCode() { - return getType(); - } - } - - /** - * A result from a setData operation. This kind of result provides access - * to the Stat structure from the update. - */ - public static class SetDataResult extends OpResult { - private Stat stat; - - public SetDataResult(Stat stat) { - super(ZooDefs.OpCode.setData); - this.stat = stat; - } - - public Stat getStat() { - return stat; - } - - @Override - public boolean equals(Object o) { - if (this == o) return true; - if (!(o instanceof SetDataResult)) return false; - - SetDataResult other = (SetDataResult) o; - return getType() == other.getType() && stat.getMzxid() == other.stat.getMzxid(); - } - - @Override - public int hashCode() { - return (int) (getType() * 35 + stat.getMzxid()); - } - } - - /** - * A result from a version check operation. No special values are available. - */ - public static class CheckResult extends OpResult { - public CheckResult() { - super(ZooDefs.OpCode.check); - } - - @Override - public boolean equals(Object o) { - if (this == o) return true; - if (!(o instanceof CheckResult)) return false; - - CheckResult other = (CheckResult) o; - return getType() == other.getType(); - } - - @Override - public int hashCode() { - return getType(); - } - } - - /** - * An error result from any kind of operation. The point of error results - * is that they contain an error code which helps understand what happened. - * @see KeeperException.Code - * - */ - public static class ErrorResult extends OpResult { - private int err; - - public ErrorResult(int err) { - super(ZooDefs.OpCode.error); - this.err = err; - } - - public int getErr() { - return err; - } - - @Override - public boolean equals(Object o) { - if (this == o) return true; - if (!(o instanceof ErrorResult)) return false; - - ErrorResult other = (ErrorResult) o; - return getType() == other.getType() && err == other.getErr(); - } - - @Override - public int hashCode() { - return getType() * 35 + err; - } - } -} diff --git a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/Quotas.java b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/Quotas.java deleted file mode 100644 index b82e3395d..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/Quotas.java +++ /dev/null @@ -1,68 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you 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. - */ - -package org.apache.zookeeper; - -/** - * this class manages quotas - * and has many other utils - * for quota - */ -public class Quotas { - - /** the zookeeper nodes that acts as the management and status node **/ - public static final String procZookeeper = "/zookeeper"; - - /** the zookeeper quota node that acts as the quota - * management node for zookeeper */ - public static final String quotaZookeeper = "/zookeeper/quota"; - - /** - * the limit node that has the limit of - * a subtree - */ - public static final String limitNode = "zookeeper_limits"; - - /** - * the stat node that monitors the limit of - * a subtree. - */ - public static final String statNode = "zookeeper_stats"; - - /** - * return the quota path associated with this - * prefix - * @param path the actual path in zookeeper. - * @return the limit quota path - */ - public static String quotaPath(String path) { - return quotaZookeeper + path + - "/" + limitNode; - } - - /** - * return the stat quota path associated with this - * prefix. - * @param path the actual path in zookeeper - * @return the stat quota path - */ - public static String statPath(String path) { - return quotaZookeeper + path + "/" + - statNode; - } -} diff --git a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/ServerAdminClient.java b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/ServerAdminClient.java deleted file mode 100644 index da17fcfcb..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/ServerAdminClient.java +++ /dev/null @@ -1,313 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you 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. - */ - -package org.apache.zookeeper; - -import java.io.IOException; -import java.io.InputStream; -import java.io.OutputStream; -import java.net.InetSocketAddress; -import java.net.Socket; -import java.nio.ByteBuffer; -import java.util.StringTokenizer; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import org.apache.zookeeper.server.ZooTrace; - -public class ServerAdminClient { - private static final Logger LOG = LoggerFactory.getLogger(ServerAdminClient.class); - - private static long getMask(String mask) { - long retv = 0; - if (mask.equalsIgnoreCase("CLIENT_REQUEST_TRACE_MASK")) { - retv = ZooTrace.CLIENT_REQUEST_TRACE_MASK; - } else if (mask.equalsIgnoreCase("CLIENT_DATA_PACKET_TRACE_MASK")) { - retv = ZooTrace.CLIENT_DATA_PACKET_TRACE_MASK; - } else if (mask.equalsIgnoreCase("CLIENT_PING_TRACE_MASK")) { - retv = ZooTrace.CLIENT_PING_TRACE_MASK; - } else if (mask.equalsIgnoreCase("SERVER_PACKET_TRACE_MASK")) { - retv = ZooTrace.SERVER_PACKET_TRACE_MASK; - } else if (mask.equalsIgnoreCase("SESSION_TRACE_MASK")) { - retv = ZooTrace.SESSION_TRACE_MASK; - } else if (mask.equalsIgnoreCase("EVENT_DELIVERY_TRACE_MASK")) { - retv = ZooTrace.EVENT_DELIVERY_TRACE_MASK; - } else if (mask.equalsIgnoreCase("SERVER_PING_TRACE_MASK")) { - retv = ZooTrace.SERVER_PING_TRACE_MASK; - } else if (mask.equalsIgnoreCase("WARNING_TRACE_MASK")) { - retv = ZooTrace.WARNING_TRACE_MASK; - } - return retv; - } - - private static long getMasks(String masks) { - long retv = 0; - StringTokenizer st = new StringTokenizer(masks, "|"); - while (st.hasMoreTokens()) { - String mask = st.nextToken().trim(); - retv = retv | getMask(mask); - } - return retv; - } - - public static void ruok(String host, int port) { - Socket s = null; - try { - byte[] reqBytes = new byte[4]; - ByteBuffer req = ByteBuffer.wrap(reqBytes); - req.putInt(ByteBuffer.wrap("ruok".getBytes()).getInt()); - s = new Socket(); - s.setSoLinger(false, 10); - s.setSoTimeout(20000); - s.connect(new InetSocketAddress(host, port)); - - InputStream is = s.getInputStream(); - OutputStream os = s.getOutputStream(); - - os.write(reqBytes); - - byte[] resBytes = new byte[4]; - - int rc = is.read(resBytes); - String retv = new String(resBytes); - System.out.println("rc=" + rc + " retv=" + retv); - } catch (IOException e) { - LOG.warn("Unexpected exception", e); - } finally { - if (s != null) { - try { - s.close(); - } catch (IOException e) { - LOG.warn("Unexpected exception", e); - } - } - } - } - - public static void dump(String host, int port) { - Socket s = null; - try { - byte[] reqBytes = new byte[4]; - ByteBuffer req = ByteBuffer.wrap(reqBytes); - req.putInt(ByteBuffer.wrap("dump".getBytes()).getInt()); - s = new Socket(); - s.setSoLinger(false, 10); - s.setSoTimeout(20000); - s.connect(new InetSocketAddress(host, port)); - - InputStream is = s.getInputStream(); - OutputStream os = s.getOutputStream(); - - os.write(reqBytes); - - byte[] resBytes = new byte[1024]; - - int rc = is.read(resBytes); - String retv = new String(resBytes); - System.out.println("rc=" + rc + " retv=" + retv); - } catch (IOException e) { - LOG.warn("Unexpected exception", e); - } finally { - if (s != null) { - try { - s.close(); - } catch (IOException e) { - LOG.warn("Unexpected exception", e); - } - } - } - } - - public static void stat(String host, int port) { - Socket s = null; - try { - byte[] reqBytes = new byte[4]; - ByteBuffer req = ByteBuffer.wrap(reqBytes); - req.putInt(ByteBuffer.wrap("stat".getBytes()).getInt()); - s = new Socket(); - s.setSoLinger(false, 10); - s.setSoTimeout(20000); - s.connect(new InetSocketAddress(host, port)); - - InputStream is = s.getInputStream(); - OutputStream os = s.getOutputStream(); - - os.write(reqBytes); - - byte[] resBytes = new byte[1024]; - - int rc = is.read(resBytes); - String retv = new String(resBytes); - System.out.println("rc=" + rc + " retv=" + retv); - } catch (IOException e) { - LOG.warn("Unexpected exception", e); - } finally { - if (s != null) { - try { - s.close(); - } catch (IOException e) { - LOG.warn("Unexpected exception", e); - } - } - } - } - - public static void kill(String host, int port) { - Socket s = null; - try { - byte[] reqBytes = new byte[4]; - ByteBuffer req = ByteBuffer.wrap(reqBytes); - req.putInt(ByteBuffer.wrap("kill".getBytes()).getInt()); - s = new Socket(); - s.setSoLinger(false, 10); - s.setSoTimeout(20000); - s.connect(new InetSocketAddress(host, port)); - - InputStream is = s.getInputStream(); - OutputStream os = s.getOutputStream(); - - os.write(reqBytes); - byte[] resBytes = new byte[4]; - - int rc = is.read(resBytes); - String retv = new String(resBytes); - System.out.println("rc=" + rc + " retv=" + retv); - } catch (IOException e) { - LOG.warn("Unexpected exception", e); - } finally { - if (s != null) { - try { - s.close(); - } catch (IOException e) { - LOG.warn("Unexpected exception", e); - } - } - } - } - - public static void setTraceMask(String host, int port, String traceMaskStr) { - Socket s = null; - try { - byte[] reqBytes = new byte[12]; - ByteBuffer req = ByteBuffer.wrap(reqBytes); - long traceMask = Long.parseLong(traceMaskStr, 8); - req.putInt(ByteBuffer.wrap("stmk".getBytes()).getInt()); - req.putLong(traceMask); - - s = new Socket(); - s.setSoLinger(false, 10); - s.setSoTimeout(20000); - s.connect(new InetSocketAddress(host, port)); - - InputStream is = s.getInputStream(); - OutputStream os = s.getOutputStream(); - - os.write(reqBytes); - - byte[] resBytes = new byte[8]; - - int rc = is.read(resBytes); - ByteBuffer res = ByteBuffer.wrap(resBytes); - long retv = res.getLong(); - System.out.println("rc=" + rc + " retv=0" - + Long.toOctalString(retv) + " masks=0" - + Long.toOctalString(traceMask)); - assert (retv == traceMask); - } catch (IOException e) { - LOG.warn("Unexpected exception", e); - } finally { - if (s != null) { - try { - s.close(); - } catch (IOException e) { - LOG.warn("Unexpected exception", e); - } - } - } - } - - public static void getTraceMask(String host, int port) { - Socket s = null; - try { - byte[] reqBytes = new byte[12]; - ByteBuffer req = ByteBuffer.wrap(reqBytes); - req.putInt(ByteBuffer.wrap("gtmk".getBytes()).getInt()); - - s = new Socket(); - s.setSoLinger(false, 10); - s.setSoTimeout(20000); - s.connect(new InetSocketAddress(host, port)); - - InputStream is = s.getInputStream(); - OutputStream os = s.getOutputStream(); - - os.write(reqBytes); - - byte[] resBytes = new byte[8]; - - int rc = is.read(resBytes); - ByteBuffer res = ByteBuffer.wrap(resBytes); - long retv = res.getLong(); - System.out.println("rc=" + rc + " retv=0" - + Long.toOctalString(retv)); - } catch (IOException e) { - LOG.warn("Unexpected exception", e); - } finally { - if (s != null) { - try { - s.close(); - } catch (IOException e) { - LOG.warn("Unexpected exception", e); - } - } - } - } - - private static void usage() { - System.out - .println("usage: java [-cp CLASSPATH] org.apache.zookeeper.ServerAdminClient " - + "host port op (ruok|stat|dump|kill|gettracemask|settracemask) [arguments]"); - - } - - public static void main(String[] args) { - if (args.length < 3) { - usage(); - return; - } - String host = args[0]; - int port = Integer.parseInt(args[1]); - String op = args[2]; - if (op.equalsIgnoreCase("gettracemask")) { - getTraceMask(host, port); - } else if (op.equalsIgnoreCase("settracemask")) { - setTraceMask(host, port, args[3]); - } else if (op.equalsIgnoreCase("ruok")) { - ruok(host, port); - } else if (op.equalsIgnoreCase("kill")) { - kill(host, port); - } else if (op.equalsIgnoreCase("stat")) { - stat(host, port); - } else if (op.equalsIgnoreCase("dump")) { - dump(host, port); - } else { - System.out.println("Unrecognized op: " + op); - } - } -} diff --git a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/Shell.java b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/Shell.java deleted file mode 100644 index 789c481a6..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/Shell.java +++ /dev/null @@ -1,475 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you 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 file copied from Hadoop's security branch, - * with the following changes: - * 1. package changed from org.apache.hadoop.util to - * org.apache.zookeeper. - * 2. Usage of Hadoop's Configuration class removed since - * it is not available in Zookeeper: instead, system properties - * are used. - * 3. The deprecated getUlimitMemoryCommand() method removed since - * it is not needed. - */ - - -package org.apache.zookeeper; - -import java.io.BufferedReader; -import java.io.File; -import java.io.IOException; -import java.io.InputStreamReader; -import java.util.Map; -import java.util.Timer; -import java.util.TimerTask; -import java.util.concurrent.atomic.AtomicBoolean; -import org.apache.log4j.Logger; - -/** - * A base class for running a Unix command. - * - * Shell can be used to run unix commands like du or - * df. It also offers facilities to gate commands by - * time-intervals. - */ -abstract public class Shell { - - Logger LOG = Logger.getLogger(Shell.class); - - /** a Unix command to get the current user's name */ - public final static String USER_NAME_COMMAND = "whoami"; - /** a Unix command to get the current user's groups list */ - public static String[] getGroupsCommand() { - return new String[]{"bash", "-c", "groups"}; - } - /** a Unix command to get a given user's groups list */ - public static String[] getGroupsForUserCommand(final String user) { - //'groups username' command return is non-consistent across different unixes - return new String [] {"bash", "-c", "id -Gn " + user}; - } - /** a Unix command to set permission */ - public static final String SET_PERMISSION_COMMAND = "chmod"; - /** a Unix command to set owner */ - public static final String SET_OWNER_COMMAND = "chown"; - public static final String SET_GROUP_COMMAND = "chgrp"; - /** Return a Unix command to get permission information. */ - public static String[] getGET_PERMISSION_COMMAND() { - //force /bin/ls, except on windows. - return new String[] {(WINDOWS ? "ls" : "/bin/ls"), "-ld"}; - } - - /**Time after which the executing script would be timedout*/ - protected long timeOutInterval = 0L; - /** If or not script timed out*/ - private AtomicBoolean timedOut; - - /** a Unix command to get ulimit of a process. */ - public static final String ULIMIT_COMMAND = "ulimit"; - - /** - * Get the Unix command for setting the maximum virtual memory available - * to a given child process. This is only relevant when we are forking a - * process from within the Mapper or the Reducer implementations. - * Also see Hadoop Pipes and Hadoop Streaming. - * - * It also checks to ensure that we are running on a *nix platform else - * (e.g. in Cygwin/Windows) it returns null. - * @param memoryLimit virtual memory limit - * @return a String[] with the ulimit command arguments or - * null if we are running on a non *nix platform or - * if the limit is unspecified. - */ - public static String[] getUlimitMemoryCommand(int memoryLimit) { - // ulimit isn't supported on Windows - if (WINDOWS) { - return null; - } - - return new String[] {ULIMIT_COMMAND, "-v", String.valueOf(memoryLimit)}; - } - - /** Set to true on Windows platforms */ - public static final boolean WINDOWS /* borrowed from Path.WINDOWS */ - = System.getProperty("os.name").startsWith("Windows"); - - private long interval; // refresh interval in msec - private long lastTime; // last time the command was performed - private Map environment; // env for the command execution - private File dir; - private Process process; // sub process used to execute the command - private int exitCode; - - /**If or not script finished executing*/ - private volatile AtomicBoolean completed; - - public Shell() { - this(0L); - } - - /** - * @param interval the minimum duration to wait before re-executing the - * command. - */ - public Shell( long interval ) { - this.interval = interval; - this.lastTime = (interval<0) ? 0 : -interval; - } - - /** set the environment for the command - * @param env Mapping of environment variables - */ - protected void setEnvironment(Map env) { - this.environment = env; - } - - /** set the working directory - * @param dir The directory where the command would be executed - */ - protected void setWorkingDirectory(File dir) { - this.dir = dir; - } - - /** check to see if a command needs to be executed and execute if needed */ - protected void run() throws IOException { - if (lastTime + interval > System.currentTimeMillis()) - return; - exitCode = 0; // reset for next run - runCommand(); - } - - /** Run a command */ - private void runCommand() throws IOException { - ProcessBuilder builder = new ProcessBuilder(getExecString()); - Timer timeOutTimer = null; - ShellTimeoutTimerTask timeoutTimerTask = null; - timedOut = new AtomicBoolean(false); - completed = new AtomicBoolean(false); - - if (environment != null) { - builder.environment().putAll(this.environment); - } - if (dir != null) { - builder.directory(this.dir); - } - - process = builder.start(); - if (timeOutInterval > 0) { - timeOutTimer = new Timer(); - timeoutTimerTask = new ShellTimeoutTimerTask( - this); - //One time scheduling. - timeOutTimer.schedule(timeoutTimerTask, timeOutInterval); - } - final BufferedReader errReader = - new BufferedReader(new InputStreamReader(process - .getErrorStream())); - BufferedReader inReader = - new BufferedReader(new InputStreamReader(process - .getInputStream())); - final StringBuffer errMsg = new StringBuffer(); - - // read error and input streams as this would free up the buffers - // free the error stream buffer - Thread errThread = new Thread() { - @Override - public void run() { - try { - String line = errReader.readLine(); - while((line != null) && !isInterrupted()) { - errMsg.append(line); - errMsg.append(System.getProperty("line.separator")); - line = errReader.readLine(); - } - } catch(IOException ioe) { - LOG.warn("Error reading the error stream", ioe); - } - } - }; - try { - errThread.start(); - } catch (IllegalStateException ise) { } - try { - parseExecResult(inReader); // parse the output - // clear the input stream buffer - String line = inReader.readLine(); - while(line != null) { - line = inReader.readLine(); - } - // wait for the process to finish and check the exit code - exitCode = process.waitFor(); - try { - // make sure that the error thread exits - errThread.join(); - } catch (InterruptedException ie) { - LOG.warn("Interrupted while reading the error stream", ie); - } - completed.set(true); - //the timeout thread handling - //taken care in finally block - if (exitCode != 0) { - throw new ExitCodeException(exitCode, errMsg.toString()); - } - } catch (InterruptedException ie) { - throw new IOException(ie.toString()); - } finally { - if ((timeOutTimer!=null) && !timedOut.get()) { - timeOutTimer.cancel(); - } - // close the input stream - try { - inReader.close(); - } catch (IOException ioe) { - LOG.warn("Error while closing the input stream", ioe); - } - if (!completed.get()) { - errThread.interrupt(); - } - try { - errReader.close(); - } catch (IOException ioe) { - LOG.warn("Error while closing the error stream", ioe); - } - process.destroy(); - lastTime = System.currentTimeMillis(); - } - } - - /** return an array containing the command name & its parameters */ - protected abstract String[] getExecString(); - - /** Parse the execution result */ - protected abstract void parseExecResult(BufferedReader lines) - throws IOException; - - /** get the current sub-process executing the given command - * @return process executing the command - */ - public Process getProcess() { - return process; - } - - /** get the exit code - * @return the exit code of the process - */ - public int getExitCode() { - return exitCode; - } - - /** - * This is an IOException with exit code added. - */ - public static class ExitCodeException extends IOException { - int exitCode; - - public ExitCodeException(int exitCode, String message) { - super(message); - this.exitCode = exitCode; - } - - public int getExitCode() { - return exitCode; - } - } - - /** - * A simple shell command executor. - * - * ShellCommandExecutorshould be used in cases where the output - * of the command needs no explicit parsing and where the command, working - * directory and the environment remains unchanged. The output of the command - * is stored as-is and is expected to be small. - */ - public static class ShellCommandExecutor extends Shell { - - private String[] command; - private StringBuffer output; - - - public ShellCommandExecutor(String[] execString) { - this(execString, null); - } - - public ShellCommandExecutor(String[] execString, File dir) { - this(execString, dir, null); - } - - public ShellCommandExecutor(String[] execString, File dir, - Map env) { - this(execString, dir, env , 0L); - } - - /** - * Create a new instance of the ShellCommandExecutor to execute a command. - * - * @param execString The command to execute with arguments - * @param dir If not-null, specifies the directory which should be set - * as the current working directory for the command. - * If null, the current working directory is not modified. - * @param env If not-null, environment of the command will include the - * key-value pairs specified in the map. If null, the current - * environment is not modified. - * @param timeout Specifies the time in milliseconds, after which the - * command will be killed and the status marked as timedout. - * If 0, the command will not be timed out. - */ - public ShellCommandExecutor(String[] execString, File dir, - Map env, long timeout) { - command = execString.clone(); - if (dir != null) { - setWorkingDirectory(dir); - } - if (env != null) { - setEnvironment(env); - } - timeOutInterval = timeout; - } - - - /** Execute the shell command. */ - public void execute() throws IOException { - this.run(); - } - - protected String[] getExecString() { - return command; - } - - protected void parseExecResult(BufferedReader lines) throws IOException { - output = new StringBuffer(); - char[] buf = new char[512]; - int nRead; - while ( (nRead = lines.read(buf, 0, buf.length)) > 0 ) { - output.append(buf, 0, nRead); - } - } - - /** Get the output of the shell command.*/ - public String getOutput() { - return (output == null) ? "" : output.toString(); - } - - /** - * Returns the commands of this instance. - * Arguments with spaces in are presented with quotes round; other - * arguments are presented raw - * - * @return a string representation of the object. - */ - public String toString() { - StringBuilder builder = new StringBuilder(); - String[] args = getExecString(); - for (String s : args) { - if (s.indexOf(' ') >= 0) { - builder.append('"').append(s).append('"'); - } else { - builder.append(s); - } - builder.append(' '); - } - return builder.toString(); - } - } - - /** - * To check if the passed script to shell command executor timed out or - * not. - * - * @return if the script timed out. - */ - public boolean isTimedOut() { - return timedOut.get(); - } - - /** - * Set if the command has timed out. - * - */ - private void setTimedOut() { - this.timedOut.set(true); - } - - /** - * Static method to execute a shell command. - * Covers most of the simple cases without requiring the user to implement - * the Shell interface. - * @param cmd shell command to execute. - * @return the output of the executed command. - */ - public static String execCommand(String ... cmd) throws IOException { - return execCommand(null, cmd, 0L); - } - - /** - * Static method to execute a shell command. - * Covers most of the simple cases without requiring the user to implement - * the Shell interface. - * @param env the map of environment key=value - * @param cmd shell command to execute. - * @param timeout time in milliseconds after which script should be marked timeout - * @return the output of the executed command.o - */ - - public static String execCommand(Map env, String[] cmd, - long timeout) throws IOException { - ShellCommandExecutor exec = new ShellCommandExecutor(cmd, null, env, - timeout); - exec.execute(); - return exec.getOutput(); - } - - /** - * Static method to execute a shell command. - * Covers most of the simple cases without requiring the user to implement - * the Shell interface. - * @param env the map of environment key=value - * @param cmd shell command to execute. - * @return the output of the executed command. - */ - public static String execCommand(Map env, String ... cmd) - throws IOException { - return execCommand(env, cmd, 0L); - } - - /** - * Timer which is used to timeout scripts spawned off by shell. - */ - private static class ShellTimeoutTimerTask extends TimerTask { - - private Shell shell; - - public ShellTimeoutTimerTask(Shell shell) { - this.shell = shell; - } - - @Override - public void run() { - Process p = shell.getProcess(); - try { - p.exitValue(); - } catch (Exception e) { - //Process has not terminated. - //So check if it has completed - //if not just destroy it. - if (p != null && !shell.completed.get()) { - shell.setTimedOut(); - p.destroy(); - } - } - } - } -} diff --git a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/StatsTrack.java b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/StatsTrack.java deleted file mode 100644 index 623c6d446..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/StatsTrack.java +++ /dev/null @@ -1,101 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you 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. - */ - -package org.apache.zookeeper; - -/** - * a class that represents the stats associated with quotas - */ -public class StatsTrack { - private int count; - private long bytes; - private String countStr = "count"; - private String byteStr = "bytes"; - - /** - * a default constructor for - * stats - */ - public StatsTrack() { - this(null); - } - /** - * the stat string should be of the form count=int,bytes=long - * if stats is called with null the count and bytes are initialized - * to -1. - * @param stats the stat string to be intialized with - */ - public StatsTrack(String stats) { - if (stats == null) { - stats = "count=-1,bytes=-1"; - } - String[] split = stats.split(","); - if (split.length != 2) { - throw new IllegalArgumentException("invalid string " + stats); - } - count = Integer.parseInt(split[0].split("=")[1]); - bytes = Long.parseLong(split[1].split("=")[1]); - } - - - /** - * get the count of nodes allowed as part of quota - * - * @return the count as part of this string - */ - public int getCount() { - return this.count; - } - - /** - * set the count for this stat tracker. - * - * @param count - * the count to set with - */ - public void setCount(int count) { - this.count = count; - } - - /** - * get the count of bytes allowed as part of quota - * - * @return the bytes as part of this string - */ - public long getBytes() { - return this.bytes; - } - - /** - * set teh bytes for this stat tracker. - * - * @param bytes - * the bytes to set with - */ - public void setBytes(long bytes) { - this.bytes = bytes; - } - - @Override - /* - * returns the string that maps to this stat tracking. - */ - public String toString() { - return countStr + "=" + count + "," + byteStr + "=" + bytes; - } -} diff --git a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/Transaction.java b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/Transaction.java deleted file mode 100644 index 7e67b87a4..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/Transaction.java +++ /dev/null @@ -1,63 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You 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. - */ - -package org.apache.zookeeper; - -import org.apache.zookeeper.data.ACL; -import java.util.ArrayList; -import java.util.List; - -/** - * Provides a builder style interface for doing multiple updates. This is - * really just a thin layer on top of Zookeeper.multi(). - * - * @since 3.4.0 - * - */ -public class Transaction { - private ZooKeeper zk; - private List ops = new ArrayList(); - - protected Transaction(ZooKeeper zk) { - this.zk = zk; - } - - public Transaction create(final String path, byte data[], List acl, - CreateMode createMode) { - ops.add(Op.create(path, data, acl, createMode.toFlag())); - return this; - } - - public Transaction delete(final String path, int version) { - ops.add(Op.delete(path, version)); - return this; - } - - public Transaction check(String path, int version) { - ops.add(Op.check(path, version)); - return this; - } - - public Transaction setData(final String path, byte data[], int version) { - ops.add(Op.setData(path, data, version)); - return this; - } - - public List commit() throws InterruptedException, KeeperException { - return zk.multi(ops); - } -} diff --git a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/Version.java b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/Version.java deleted file mode 100644 index 46573717b..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/Version.java +++ /dev/null @@ -1,79 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you 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. - */ - -package org.apache.zookeeper; - -public class Version implements org.apache.zookeeper.version.Info { - - public static int getRevision() { - return REVISION; - } - - public static String getBuildDate() { - return BUILD_DATE; - } - - public static String getVersion() { - return MAJOR + "." + MINOR + "." + MICRO - + (QUALIFIER == null ? "" : "-" + QUALIFIER); - } - - public static String getVersionRevision() { - return getVersion() + "-" + getRevision(); - } - - public static String getFullVersion() { - return getVersionRevision() + ", built on " + getBuildDate(); - } - - public static void printUsage() { - System.out - .print("Usage:\tjava -cp ... org.apache.zookeeper.Version " - + "[--full | --short | --revision],\n\tPrints --full version " - + "info if no arg specified."); - System.exit(1); - } - - /** - * Prints the current version, revision and build date to the standard out. - * - * @param args - *
          - *
        • --short - prints a short version string "1.2.3" - *
        • --revision - prints a short version string with the SVN - * repository revision "1.2.3-94" - *
        • --full - prints the revision and the build date - *
        - */ - public static void main(String[] args) { - if (args.length > 1) { - printUsage(); - } - if (args.length == 0 || (args.length == 1 && args[0].equals("--full"))) { - System.out.println(getFullVersion()); - System.exit(0); - } - if (args[0].equals("--short")) - System.out.println(getVersion()); - else if (args[0].equals("--revision")) - System.out.println(getVersionRevision()); - else - printUsage(); - System.exit(0); - } -} diff --git a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/WatchedEvent.java b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/WatchedEvent.java deleted file mode 100644 index 63f29c3c6..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/WatchedEvent.java +++ /dev/null @@ -1,79 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you 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. - */ -package org.apache.zookeeper; - -import org.apache.zookeeper.proto.WatcherEvent; -import org.apache.zookeeper.Watcher.Event.EventType; -import org.apache.zookeeper.Watcher.Event.KeeperState; - -/** - * A WatchedEvent represents a change on the ZooKeeper that a Watcher - * is able to respond to. The WatchedEvent includes exactly what happened, - * the current state of the ZooKeeper, and the path of the znode that - * was involved in the event. - */ -public class WatchedEvent { - final private KeeperState keeperState; - final private EventType eventType; - private String path; - - /** - * Create a WatchedEvent with specified type, state and path - */ - public WatchedEvent(EventType eventType, KeeperState keeperState, String path) { - this.keeperState = keeperState; - this.eventType = eventType; - this.path = path; - } - - /** - * Convert a WatcherEvent sent over the wire into a full-fledged WatcherEvent - */ - public WatchedEvent(WatcherEvent eventMessage) { - keeperState = KeeperState.fromInt(eventMessage.getState()); - eventType = EventType.fromInt(eventMessage.getType()); - path = eventMessage.getPath(); - } - - public KeeperState getState() { - return keeperState; - } - - public EventType getType() { - return eventType; - } - - public String getPath() { - return path; - } - - @Override - public String toString() { - return "WatchedEvent state:" + keeperState - + " type:" + eventType + " path:" + path; - } - - /** - * Convert WatchedEvent to type that can be sent over network - */ - public WatcherEvent getWrapper() { - return new WatcherEvent(eventType.getIntValue(), - keeperState.getIntValue(), - path); - } -} diff --git a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/Watcher.java b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/Watcher.java deleted file mode 100644 index 36c7b5b8d..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/Watcher.java +++ /dev/null @@ -1,149 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you 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. - */ - -package org.apache.zookeeper; - -/** - * This interface specifies the public interface an event handler class must - * implement. A ZooKeeper client will get various events from the ZooKeepr - * server it connects to. An application using such a client handles these - * events by registering a callback object with the client. The callback object - * is expected to be an instance of a class that implements Watcher interface. - * - */ -public interface Watcher { - - /** - * This interface defines the possible states an Event may represent - */ - public interface Event { - /** - * Enumeration of states the ZooKeeper may be at the event - */ - public enum KeeperState { - /** Unused, this state is never generated by the server */ - @Deprecated - Unknown (-1), - - /** The client is in the disconnected state - it is not connected - * to any server in the ensemble. */ - Disconnected (0), - - /** Unused, this state is never generated by the server */ - @Deprecated - NoSyncConnected (1), - - /** The client is in the connected state - it is connected - * to a server in the ensemble (one of the servers specified - * in the host connection parameter during ZooKeeper client - * creation). */ - SyncConnected (3), - - /** - * Auth failed state - */ - AuthFailed (4), - - /** - * The client is connected to a read-only server, that is the - * server which is not currently connected to the majority. - * The only operations allowed after receiving this state is - * read operations. - * This state is generated for read-only clients only since - * read/write clients aren't allowed to connect to r/o servers. - */ - ConnectedReadOnly (5), - - /** - * SaslAuthenticated: used to notify clients that they are SASL-authenticated, - * so that they can perform Zookeeper actions with their SASL-authorized permissions. - */ - SaslAuthenticated(6), - - /** The serving cluster has expired this session. The ZooKeeper - * client connection (the session) is no longer valid. You must - * create a new client connection (instantiate a new ZooKeeper - * instance) if you with to access the ensemble. */ - Expired (-112); - - private final int intValue; // Integer representation of value - // for sending over wire - - KeeperState(int intValue) { - this.intValue = intValue; - } - - public int getIntValue() { - return intValue; - } - - public static KeeperState fromInt(int intValue) { - switch(intValue) { - case -1: return KeeperState.Unknown; - case 0: return KeeperState.Disconnected; - case 1: return KeeperState.NoSyncConnected; - case 3: return KeeperState.SyncConnected; - case 4: return KeeperState.AuthFailed; - case 5: return KeeperState.ConnectedReadOnly; - case 6: return KeeperState.SaslAuthenticated; - case -112: return KeeperState.Expired; - - default: - throw new RuntimeException("Invalid integer value for conversion to KeeperState"); - } - } - } - - /** - * Enumeration of types of events that may occur on the ZooKeeper - */ - public enum EventType { - None (-1), - NodeCreated (1), - NodeDeleted (2), - NodeDataChanged (3), - NodeChildrenChanged (4); - - private final int intValue; // Integer representation of value - // for sending over wire - - EventType(int intValue) { - this.intValue = intValue; - } - - public int getIntValue() { - return intValue; - } - - public static EventType fromInt(int intValue) { - switch(intValue) { - case -1: return EventType.None; - case 1: return EventType.NodeCreated; - case 2: return EventType.NodeDeleted; - case 3: return EventType.NodeDataChanged; - case 4: return EventType.NodeChildrenChanged; - - default: - throw new RuntimeException("Invalid integer value for conversion to EventType"); - } - } - } - } - - abstract public void process(WatchedEvent event); -} diff --git a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/ZKUtil.java b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/ZKUtil.java deleted file mode 100644 index 4713a08a9..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/ZKUtil.java +++ /dev/null @@ -1,124 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you 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. - */ -package org.apache.zookeeper; - -import java.util.ArrayList; -import java.util.Deque; -import java.util.LinkedList; -import java.util.List; - -import org.apache.zookeeper.AsyncCallback.VoidCallback; -import org.apache.zookeeper.common.PathUtils; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -public class ZKUtil { - private static final Logger LOG = LoggerFactory.getLogger(ZKUtil.class); - /** - * Recursively delete the node with the given path. - *

        - * Important: All versions, of all nodes, under the given node are deleted. - *

        - * If there is an error with deleting one of the sub-nodes in the tree, - * this operation would abort and would be the responsibility of the app to handle the same. - * - * See {@link #delete(String, int)} for more details. - * - * @throws IllegalArgumentException if an invalid path is specified - */ - public static void deleteRecursive(ZooKeeper zk, final String pathRoot) - throws InterruptedException, KeeperException - { - PathUtils.validatePath(pathRoot); - - List tree = listSubTreeBFS(zk, pathRoot); - LOG.debug("Deleting " + tree); - LOG.debug("Deleting " + tree.size() + " subnodes "); - for (int i = tree.size() - 1; i >= 0 ; --i) { - //Delete the leaves first and eventually get rid of the root - zk.delete(tree.get(i), -1); //Delete all versions of the node with -1. - } - } - - - /** - * Recursively delete the node with the given path. (async version). - * - *

        - * Important: All versions, of all nodes, under the given node are deleted. - *

        - * If there is an error with deleting one of the sub-nodes in the tree, - * this operation would abort and would be the responsibility of the app to handle the same. - *

        - * @param zk the zookeeper handle - * @param pathRoot the path to be deleted - * @param cb call back method - * @param ctx the context the callback method is called with - * @throws IllegalArgumentException if an invalid path is specified - */ - public static void deleteRecursive(ZooKeeper zk, final String pathRoot, VoidCallback cb, - Object ctx) - throws InterruptedException, KeeperException - { - PathUtils.validatePath(pathRoot); - - List tree = listSubTreeBFS(zk, pathRoot); - LOG.debug("Deleting " + tree); - LOG.debug("Deleting " + tree.size() + " subnodes "); - for (int i = tree.size() - 1; i >= 0 ; --i) { - //Delete the leaves first and eventually get rid of the root - zk.delete(tree.get(i), -1, cb, ctx); //Delete all versions of the node with -1. - } - } - - /** - * BFS Traversal of the system under pathRoot, with the entries in the list, in the - * same order as that of the traversal. - *

        - * Important: This is not an atomic snapshot of the tree ever, but the - * state as it exists across multiple RPCs from zkClient to the ensemble. - * For practical purposes, it is suggested to bring the clients to the ensemble - * down (i.e. prevent writes to pathRoot) to 'simulate' a snapshot behavior. - * - * @param zk the zookeeper handle - * @param pathRoot The znode path, for which the entire subtree needs to be listed. - * @throws InterruptedException - * @throws KeeperException - */ - public static List listSubTreeBFS(ZooKeeper zk, final String pathRoot) throws - KeeperException, InterruptedException { - Deque queue = new LinkedList(); - List tree = new ArrayList(); - queue.add(pathRoot); - tree.add(pathRoot); - while (true) { - String node = queue.pollFirst(); - if (node == null) { - break; - } - List children = zk.getChildren(node, false); - for (final String child : children) { - final String childPath = node + "/" + child; - queue.add(childPath); - tree.add(childPath); - } - } - return tree; - } - -} \ No newline at end of file diff --git a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/ZooDefs.java b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/ZooDefs.java deleted file mode 100644 index c7f1b208c..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/ZooDefs.java +++ /dev/null @@ -1,119 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you 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. - */ - -package org.apache.zookeeper; - -import java.util.ArrayList; -import java.util.Collections; - -import org.apache.zookeeper.data.ACL; -import org.apache.zookeeper.data.Id; - -public class ZooDefs { - public interface OpCode { - public final int notification = 0; - - public final int create = 1; - - public final int delete = 2; - - public final int exists = 3; - - public final int getData = 4; - - public final int setData = 5; - - public final int getACL = 6; - - public final int setACL = 7; - - public final int getChildren = 8; - - public final int sync = 9; - - public final int ping = 11; - - public final int getChildren2 = 12; - - public final int check = 13; - - public final int multi = 14; - - public final int auth = 100; - - public final int setWatches = 101; - - public final int sasl = 102; - - public final int createSession = -10; - - public final int closeSession = -11; - - public final int error = -1; - } - - public interface Perms { - int READ = 1 << 0; - - int WRITE = 1 << 1; - - int CREATE = 1 << 2; - - int DELETE = 1 << 3; - - int ADMIN = 1 << 4; - - int ALL = READ | WRITE | CREATE | DELETE | ADMIN; - } - - public interface Ids { - /** - * This Id represents anyone. - */ - public final Id ANYONE_ID_UNSAFE = new Id("world", "anyone"); - - /** - * This Id is only usable to set ACLs. It will get substituted with the - * Id's the client authenticated with. - */ - public final Id AUTH_IDS = new Id("auth", ""); - - /** - * This is a completely open ACL . - */ - public final ArrayList OPEN_ACL_UNSAFE = new ArrayList( - Collections.singletonList(new ACL(Perms.ALL, ANYONE_ID_UNSAFE))); - - /** - * This ACL gives the creators authentication id's all permissions. - */ - public final ArrayList CREATOR_ALL_ACL = new ArrayList( - Collections.singletonList(new ACL(Perms.ALL, AUTH_IDS))); - - /** - * This ACL gives the world the ability to read. - */ - public final ArrayList READ_ACL_UNSAFE = new ArrayList( - Collections - .singletonList(new ACL(Perms.READ, ANYONE_ID_UNSAFE))); - } - - final public static String[] opNames = { "notification", "create", - "delete", "exists", "getData", "setData", "getACL", "setACL", - "getChildren", "getChildren2", "getMaxChildren", "setMaxChildren", "ping" }; -} diff --git a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/ZooKeeper.java b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/ZooKeeper.java deleted file mode 100644 index 6385781f8..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/ZooKeeper.java +++ /dev/null @@ -1,1788 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you 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. - */ - -package org.apache.zookeeper; - -import org.apache.zookeeper.AsyncCallback.*; -import org.apache.zookeeper.OpResult.ErrorResult; -import org.apache.zookeeper.client.ConnectStringParser; -import org.apache.zookeeper.client.HostProvider; -import org.apache.zookeeper.client.StaticHostProvider; -import org.apache.zookeeper.client.ZooKeeperSaslClient; -import org.apache.zookeeper.common.PathUtils; -import org.apache.zookeeper.data.ACL; -import org.apache.zookeeper.data.Stat; -import org.apache.zookeeper.proto.*; -import org.apache.zookeeper.server.DataTree; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import java.io.IOException; -import java.net.SocketAddress; -import java.util.*; - -/** - * This is the main class of ZooKeeper client library. To use a ZooKeeper - * service, an application must first instantiate an object of ZooKeeper class. - * All the iterations will be done by calling the methods of ZooKeeper class. - * The methods of this class are thread-safe unless otherwise noted. - *

        - * Once a connection to a server is established, a session ID is assigned to the - * client. The client will send heart beats to the server periodically to keep - * the session valid. - *

        - * The application can call ZooKeeper APIs through a client as long as the - * session ID of the client remains valid. - *

        - * If for some reason, the client fails to send heart beats to the server for a - * prolonged period of time (exceeding the sessionTimeout value, for instance), - * the server will expire the session, and the session ID will become invalid. - * The client object will no longer be usable. To make ZooKeeper API calls, the - * application must create a new client object. - *

        - * If the ZooKeeper server the client currently connects to fails or otherwise - * does not respond, the client will automatically try to connect to another - * server before its session ID expires. If successful, the application can - * continue to use the client. - *

        - * The ZooKeeper API methods are either synchronous or asynchronous. Synchronous - * methods blocks until the server has responded. Asynchronous methods just queue - * the request for sending and return immediately. They take a callback object that - * will be executed either on successful execution of the request or on error with - * an appropriate return code (rc) indicating the error. - *

        - * Some successful ZooKeeper API calls can leave watches on the "data nodes" in - * the ZooKeeper server. Other successful ZooKeeper API calls can trigger those - * watches. Once a watch is triggered, an event will be delivered to the client - * which left the watch at the first place. Each watch can be triggered only - * once. Thus, up to one event will be delivered to a client for every watch it - * leaves. - *

        - * A client needs an object of a class implementing Watcher interface for - * processing the events delivered to the client. - * - * When a client drops current connection and re-connects to a server, all the - * existing watches are considered as being triggered but the undelivered events - * are lost. To emulate this, the client will generate a special event to tell - * the event handler a connection has been dropped. This special event has type - * EventNone and state sKeeperStateDisconnected. - * - */ -public class ZooKeeper { - - public static final String ZOOKEEPER_CLIENT_CNXN_SOCKET = "zookeeper.clientCnxnSocket"; - - protected final ClientCnxn cnxn; - private static final Logger LOG; - static { - //Keep these two lines together to keep the initialization order explicit - LOG = LoggerFactory.getLogger(ZooKeeper.class); - Environment.logEnv("Client environment:", LOG); - } - - public ZooKeeperSaslClient getSaslClient() { - return cnxn.zooKeeperSaslClient; - } - - private final ZKWatchManager watchManager = new ZKWatchManager(); - - List getDataWatches() { - synchronized(watchManager.dataWatches) { - List rc = new ArrayList(watchManager.dataWatches.keySet()); - return rc; - } - } - List getExistWatches() { - synchronized(watchManager.existWatches) { - List rc = new ArrayList(watchManager.existWatches.keySet()); - return rc; - } - } - List getChildWatches() { - synchronized(watchManager.childWatches) { - List rc = new ArrayList(watchManager.childWatches.keySet()); - return rc; - } - } - - /** - * Manage watchers & handle events generated by the ClientCnxn object. - * - * We are implementing this as a nested class of ZooKeeper so that - * the public methods will not be exposed as part of the ZooKeeper client - * API. - */ - private static class ZKWatchManager implements ClientWatchManager { - private final Map> dataWatches = - new HashMap>(); - private final Map> existWatches = - new HashMap>(); - private final Map> childWatches = - new HashMap>(); - - private volatile Watcher defaultWatcher; - - final private void addTo(Set from, Set to) { - if (from != null) { - to.addAll(from); - } - } - - /* (non-Javadoc) - * @see org.apache.zookeeper.ClientWatchManager#materialize(Event.KeeperState, - * Event.EventType, java.lang.String) - */ - @Override - public Set materialize(Watcher.Event.KeeperState state, - Watcher.Event.EventType type, - String clientPath) - { - Set result = new HashSet(); - - switch (type) { - case None: - result.add(defaultWatcher); - boolean clear = ClientCnxn.getDisableAutoResetWatch() && - state != Watcher.Event.KeeperState.SyncConnected; - - synchronized(dataWatches) { - for(Set ws: dataWatches.values()) { - result.addAll(ws); - } - if (clear) { - dataWatches.clear(); - } - } - - synchronized(existWatches) { - for(Set ws: existWatches.values()) { - result.addAll(ws); - } - if (clear) { - existWatches.clear(); - } - } - - synchronized(childWatches) { - for(Set ws: childWatches.values()) { - result.addAll(ws); - } - if (clear) { - childWatches.clear(); - } - } - - return result; - case NodeDataChanged: - case NodeCreated: - synchronized (dataWatches) { - addTo(dataWatches.remove(clientPath), result); - } - synchronized (existWatches) { - addTo(existWatches.remove(clientPath), result); - } - break; - case NodeChildrenChanged: - synchronized (childWatches) { - addTo(childWatches.remove(clientPath), result); - } - break; - case NodeDeleted: - synchronized (dataWatches) { - addTo(dataWatches.remove(clientPath), result); - } - // XXX This shouldn't be needed, but just in case - synchronized (existWatches) { - Set list = existWatches.remove(clientPath); - if (list != null) { - addTo(existWatches.remove(clientPath), result); - LOG.warn("We are triggering an exists watch for delete! Shouldn't happen!"); - } - } - synchronized (childWatches) { - addTo(childWatches.remove(clientPath), result); - } - break; - default: - String msg = "Unhandled watch event type " + type - + " with state " + state + " on path " + clientPath; - LOG.error(msg); - throw new RuntimeException(msg); - } - - return result; - } - } - - /** - * Register a watcher for a particular path. - */ - abstract class WatchRegistration { - private Watcher watcher; - private String clientPath; - public WatchRegistration(Watcher watcher, String clientPath) - { - this.watcher = watcher; - this.clientPath = clientPath; - } - - abstract protected Map> getWatches(int rc); - - /** - * Register the watcher with the set of watches on path. - * @param rc the result code of the operation that attempted to - * add the watch on the path. - */ - public void register(int rc) { - if (shouldAddWatch(rc)) { - Map> watches = getWatches(rc); - synchronized(watches) { - Set watchers = watches.get(clientPath); - if (watchers == null) { - watchers = new HashSet(); - watches.put(clientPath, watchers); - } - watchers.add(watcher); - } - } - } - /** - * Determine whether the watch should be added based on return code. - * @param rc the result code of the operation that attempted to add the - * watch on the node - * @return true if the watch should be added, otw false - */ - protected boolean shouldAddWatch(int rc) { - return rc == 0; - } - } - - /** Handle the special case of exists watches - they add a watcher - * even in the case where NONODE result code is returned. - */ - class ExistsWatchRegistration extends WatchRegistration { - public ExistsWatchRegistration(Watcher watcher, String clientPath) { - super(watcher, clientPath); - } - - @Override - protected Map> getWatches(int rc) { - return rc == 0 ? watchManager.dataWatches : watchManager.existWatches; - } - - @Override - protected boolean shouldAddWatch(int rc) { - return rc == 0 || rc == KeeperException.Code.NONODE.intValue(); - } - } - - class DataWatchRegistration extends WatchRegistration { - public DataWatchRegistration(Watcher watcher, String clientPath) { - super(watcher, clientPath); - } - - @Override - protected Map> getWatches(int rc) { - return watchManager.dataWatches; - } - } - - class ChildWatchRegistration extends WatchRegistration { - public ChildWatchRegistration(Watcher watcher, String clientPath) { - super(watcher, clientPath); - } - - @Override - protected Map> getWatches(int rc) { - return watchManager.childWatches; - } - } - - public enum States { - CONNECTING, ASSOCIATING, CONNECTED, CONNECTEDREADONLY, - CLOSED, AUTH_FAILED, NOT_CONNECTED; - - public boolean isAlive() { - return this != CLOSED && this != AUTH_FAILED; - } - - /** - * Returns whether we are connected to a server (which - * could possibly be read-only, if this client is allowed - * to go to read-only mode) - * */ - public boolean isConnected() { - return this == CONNECTED || this == CONNECTEDREADONLY; - } - } - - /** - * To create a ZooKeeper client object, the application needs to pass a - * connection string containing a comma separated list of host:port pairs, - * each corresponding to a ZooKeeper server. - *

        - * Session establishment is asynchronous. This constructor will initiate - * connection to the server and return immediately - potentially (usually) - * before the session is fully established. The watcher argument specifies - * the watcher that will be notified of any changes in state. This - * notification can come at any point before or after the constructor call - * has returned. - *

        - * The instantiated ZooKeeper client object will pick an arbitrary server - * from the connectString and attempt to connect to it. If establishment of - * the connection fails, another server in the connect string will be tried - * (the order is non-deterministic, as we random shuffle the list), until a - * connection is established. The client will continue attempts until the - * session is explicitly closed. - *

        - * Added in 3.2.0: An optional "chroot" suffix may also be appended to the - * connection string. This will run the client commands while interpreting - * all paths relative to this root (similar to the unix chroot command). - * - * @param connectString - * comma separated host:port pairs, each corresponding to a zk - * server. e.g. "127.0.0.1:3000,127.0.0.1:3001,127.0.0.1:3002" If - * the optional chroot suffix is used the example would look - * like: "127.0.0.1:3000,127.0.0.1:3001,127.0.0.1:3002/app/a" - * where the client would be rooted at "/app/a" and all paths - * would be relative to this root - ie getting/setting/etc... - * "/foo/bar" would result in operations being run on - * "/app/a/foo/bar" (from the server perspective). - * @param sessionTimeout - * session timeout in milliseconds - * @param watcher - * a watcher object which will be notified of state changes, may - * also be notified for node events - * - * @throws IOException - * in cases of network failure - * @throws IllegalArgumentException - * if an invalid chroot path is specified - */ - public ZooKeeper(String connectString, int sessionTimeout, Watcher watcher) - throws IOException - { - this(connectString, sessionTimeout, watcher, false); - } - - /** - * To create a ZooKeeper client object, the application needs to pass a - * connection string containing a comma separated list of host:port pairs, - * each corresponding to a ZooKeeper server. - *

        - * Session establishment is asynchronous. This constructor will initiate - * connection to the server and return immediately - potentially (usually) - * before the session is fully established. The watcher argument specifies - * the watcher that will be notified of any changes in state. This - * notification can come at any point before or after the constructor call - * has returned. - *

        - * The instantiated ZooKeeper client object will pick an arbitrary server - * from the connectString and attempt to connect to it. If establishment of - * the connection fails, another server in the connect string will be tried - * (the order is non-deterministic, as we random shuffle the list), until a - * connection is established. The client will continue attempts until the - * session is explicitly closed. - *

        - * Added in 3.2.0: An optional "chroot" suffix may also be appended to the - * connection string. This will run the client commands while interpreting - * all paths relative to this root (similar to the unix chroot command). - * - * @param connectString - * comma separated host:port pairs, each corresponding to a zk - * server. e.g. "127.0.0.1:3000,127.0.0.1:3001,127.0.0.1:3002" If - * the optional chroot suffix is used the example would look - * like: "127.0.0.1:3000,127.0.0.1:3001,127.0.0.1:3002/app/a" - * where the client would be rooted at "/app/a" and all paths - * would be relative to this root - ie getting/setting/etc... - * "/foo/bar" would result in operations being run on - * "/app/a/foo/bar" (from the server perspective). - * @param sessionTimeout - * session timeout in milliseconds - * @param watcher - * a watcher object which will be notified of state changes, may - * also be notified for node events - * @param canBeReadOnly - * (added in 3.4) whether the created client is allowed to go to - * read-only mode in case of partitioning. Read-only mode - * basically means that if the client can't find any majority - * servers but there's partitioned server it could reach, it - * connects to one in read-only mode, i.e. read requests are - * allowed while write requests are not. It continues seeking for - * majority in the background. - * - * @throws IOException - * in cases of network failure - * @throws IllegalArgumentException - * if an invalid chroot path is specified - */ - public ZooKeeper(String connectString, int sessionTimeout, Watcher watcher, - boolean canBeReadOnly) - throws IOException - { - LOG.info("Initiating client connection, connectString=" + connectString - + " sessionTimeout=" + sessionTimeout + " watcher=" + watcher); - - watchManager.defaultWatcher = watcher; - - ConnectStringParser connectStringParser = new ConnectStringParser( - connectString); - HostProvider hostProvider = new StaticHostProvider( - connectStringParser.getServerAddresses()); - cnxn = new ClientCnxn(connectStringParser.getChrootPath(), - hostProvider, sessionTimeout, this, watchManager, - getClientCnxnSocket(), canBeReadOnly); - cnxn.start(); - } - - /** - * To create a ZooKeeper client object, the application needs to pass a - * connection string containing a comma separated list of host:port pairs, - * each corresponding to a ZooKeeper server. - *

        - * Session establishment is asynchronous. This constructor will initiate - * connection to the server and return immediately - potentially (usually) - * before the session is fully established. The watcher argument specifies - * the watcher that will be notified of any changes in state. This - * notification can come at any point before or after the constructor call - * has returned. - *

        - * The instantiated ZooKeeper client object will pick an arbitrary server - * from the connectString and attempt to connect to it. If establishment of - * the connection fails, another server in the connect string will be tried - * (the order is non-deterministic, as we random shuffle the list), until a - * connection is established. The client will continue attempts until the - * session is explicitly closed (or the session is expired by the server). - *

        - * Added in 3.2.0: An optional "chroot" suffix may also be appended to the - * connection string. This will run the client commands while interpreting - * all paths relative to this root (similar to the unix chroot command). - *

        - * Use {@link #getSessionId} and {@link #getSessionPasswd} on an established - * client connection, these values must be passed as sessionId and - * sessionPasswd respectively if reconnecting. Otherwise, if not - * reconnecting, use the other constructor which does not require these - * parameters. - * - * @param connectString - * comma separated host:port pairs, each corresponding to a zk - * server. e.g. "127.0.0.1:3000,127.0.0.1:3001,127.0.0.1:3002" - * If the optional chroot suffix is used the example would look - * like: "127.0.0.1:3000,127.0.0.1:3001,127.0.0.1:3002/app/a" - * where the client would be rooted at "/app/a" and all paths - * would be relative to this root - ie getting/setting/etc... - * "/foo/bar" would result in operations being run on - * "/app/a/foo/bar" (from the server perspective). - * @param sessionTimeout - * session timeout in milliseconds - * @param watcher - * a watcher object which will be notified of state changes, may - * also be notified for node events - * @param sessionId - * specific session id to use if reconnecting - * @param sessionPasswd - * password for this session - * - * @throws IOException in cases of network failure - * @throws IllegalArgumentException if an invalid chroot path is specified - * @throws IllegalArgumentException for an invalid list of ZooKeeper hosts - */ - public ZooKeeper(String connectString, int sessionTimeout, Watcher watcher, - long sessionId, byte[] sessionPasswd) - throws IOException - { - this(connectString, sessionTimeout, watcher, sessionId, sessionPasswd, false); - } - - /** - * To create a ZooKeeper client object, the application needs to pass a - * connection string containing a comma separated list of host:port pairs, - * each corresponding to a ZooKeeper server. - *

        - * Session establishment is asynchronous. This constructor will initiate - * connection to the server and return immediately - potentially (usually) - * before the session is fully established. The watcher argument specifies - * the watcher that will be notified of any changes in state. This - * notification can come at any point before or after the constructor call - * has returned. - *

        - * The instantiated ZooKeeper client object will pick an arbitrary server - * from the connectString and attempt to connect to it. If establishment of - * the connection fails, another server in the connect string will be tried - * (the order is non-deterministic, as we random shuffle the list), until a - * connection is established. The client will continue attempts until the - * session is explicitly closed (or the session is expired by the server). - *

        - * Added in 3.2.0: An optional "chroot" suffix may also be appended to the - * connection string. This will run the client commands while interpreting - * all paths relative to this root (similar to the unix chroot command). - *

        - * Use {@link #getSessionId} and {@link #getSessionPasswd} on an established - * client connection, these values must be passed as sessionId and - * sessionPasswd respectively if reconnecting. Otherwise, if not - * reconnecting, use the other constructor which does not require these - * parameters. - * - * @param connectString - * comma separated host:port pairs, each corresponding to a zk - * server. e.g. "127.0.0.1:3000,127.0.0.1:3001,127.0.0.1:3002" - * If the optional chroot suffix is used the example would look - * like: "127.0.0.1:3000,127.0.0.1:3001,127.0.0.1:3002/app/a" - * where the client would be rooted at "/app/a" and all paths - * would be relative to this root - ie getting/setting/etc... - * "/foo/bar" would result in operations being run on - * "/app/a/foo/bar" (from the server perspective). - * @param sessionTimeout - * session timeout in milliseconds - * @param watcher - * a watcher object which will be notified of state changes, may - * also be notified for node events - * @param sessionId - * specific session id to use if reconnecting - * @param sessionPasswd - * password for this session - * @param canBeReadOnly - * (added in 3.4) whether the created client is allowed to go to - * read-only mode in case of partitioning. Read-only mode - * basically means that if the client can't find any majority - * servers but there's partitioned server it could reach, it - * connects to one in read-only mode, i.e. read requests are - * allowed while write requests are not. It continues seeking for - * majority in the background. - * - * @throws IOException in cases of network failure - * @throws IllegalArgumentException if an invalid chroot path is specified - */ - public ZooKeeper(String connectString, int sessionTimeout, Watcher watcher, - long sessionId, byte[] sessionPasswd, boolean canBeReadOnly) - throws IOException - { - LOG.info("Initiating client connection, connectString=" + connectString - + " sessionTimeout=" + sessionTimeout - + " watcher=" + watcher - + " sessionId=" + Long.toHexString(sessionId) - + " sessionPasswd=" - + (sessionPasswd == null ? "" : "")); - - watchManager.defaultWatcher = watcher; - - ConnectStringParser connectStringParser = new ConnectStringParser( - connectString); - HostProvider hostProvider = new StaticHostProvider( - connectStringParser.getServerAddresses()); - cnxn = new ClientCnxn(connectStringParser.getChrootPath(), - hostProvider, sessionTimeout, this, watchManager, - getClientCnxnSocket(), sessionId, sessionPasswd, canBeReadOnly); - cnxn.seenRwServerBefore = true; // since user has provided sessionId - cnxn.start(); - } - - /** - * The session id for this ZooKeeper client instance. The value returned is - * not valid until the client connects to a server and may change after a - * re-connect. - * - * This method is NOT thread safe - * - * @return current session id - */ - public long getSessionId() { - return cnxn.getSessionId(); - } - - /** - * The session password for this ZooKeeper client instance. The value - * returned is not valid until the client connects to a server and may - * change after a re-connect. - * - * This method is NOT thread safe - * - * @return current session password - */ - public byte[] getSessionPasswd() { - return cnxn.getSessionPasswd(); - } - - /** - * The negotiated session timeout for this ZooKeeper client instance. The - * value returned is not valid until the client connects to a server and - * may change after a re-connect. - * - * This method is NOT thread safe - * - * @return current session timeout - */ - public int getSessionTimeout() { - return cnxn.getSessionTimeout(); - } - - /** - * Add the specified scheme:auth information to this connection. - * - * This method is NOT thread safe - * - * @param scheme - * @param auth - */ - public void addAuthInfo(String scheme, byte auth[]) { - cnxn.addAuthInfo(scheme, auth); - } - - /** - * Specify the default watcher for the connection (overrides the one - * specified during construction). - * - * @param watcher - */ - public synchronized void register(Watcher watcher) { - watchManager.defaultWatcher = watcher; - } - - /** - * Close this client object. Once the client is closed, its session becomes - * invalid. All the ephemeral nodes in the ZooKeeper server associated with - * the session will be removed. The watches left on those nodes (and on - * their parents) will be triggered. - * - * @throws InterruptedException - */ - public synchronized void close() throws InterruptedException { - if (!cnxn.getState().isAlive()) { - if (LOG.isDebugEnabled()) { - LOG.debug("Close called on already closed client"); - } - return; - } - - if (LOG.isDebugEnabled()) { - LOG.debug("Closing session: 0x" + Long.toHexString(getSessionId())); - } - - try { - cnxn.close(); - } catch (IOException e) { - if (LOG.isDebugEnabled()) { - LOG.debug("Ignoring unexpected exception during close", e); - } - } - - LOG.info("Session: 0x" + Long.toHexString(getSessionId()) + " closed"); - } - - /** - * Prepend the chroot to the client path (if present). The expectation of - * this function is that the client path has been validated before this - * function is called - * @param clientPath path to the node - * @return server view of the path (chroot prepended to client path) - */ - private String prependChroot(String clientPath) { - if (cnxn.chrootPath != null) { - // handle clientPath = "/" - if (clientPath.length() == 1) { - return cnxn.chrootPath; - } - return cnxn.chrootPath + clientPath; - } else { - return clientPath; - } - } - - /** - * Create a node with the given path. The node data will be the given data, - * and node acl will be the given acl. - *

        - * The flags argument specifies whether the created node will be ephemeral - * or not. - *

        - * An ephemeral node will be removed by the ZooKeeper automatically when the - * session associated with the creation of the node expires. - *

        - * The flags argument can also specify to create a sequential node. The - * actual path name of a sequential node will be the given path plus a - * suffix "i" where i is the current sequential number of the node. The sequence - * number is always fixed length of 10 digits, 0 padded. Once - * such a node is created, the sequential number will be incremented by one. - *

        - * If a node with the same actual path already exists in the ZooKeeper, a - * KeeperException with error code KeeperException.NodeExists will be - * thrown. Note that since a different actual path is used for each - * invocation of creating sequential node with the same path argument, the - * call will never throw "file exists" KeeperException. - *

        - * If the parent node does not exist in the ZooKeeper, a KeeperException - * with error code KeeperException.NoNode will be thrown. - *

        - * An ephemeral node cannot have children. If the parent node of the given - * path is ephemeral, a KeeperException with error code - * KeeperException.NoChildrenForEphemerals will be thrown. - *

        - * This operation, if successful, will trigger all the watches left on the - * node of the given path by exists and getData API calls, and the watches - * left on the parent node by getChildren API calls. - *

        - * If a node is created successfully, the ZooKeeper server will trigger the - * watches on the path left by exists calls, and the watches on the parent - * of the node by getChildren calls. - *

        - * The maximum allowable size of the data array is 1 MB (1,048,576 bytes). - * Arrays larger than this will cause a KeeperExecption to be thrown. - * - * @param path - * the path for the node - * @param data - * the initial data for the node - * @param acl - * the acl for the node - * @param createMode - * specifying whether the node to be created is ephemeral - * and/or sequential - * @return the actual path of the created node - * @throws KeeperException if the server returns a non-zero error code - * @throws KeeperException.InvalidACLException if the ACL is invalid, null, or empty - * @throws InterruptedException if the transaction is interrupted - * @throws IllegalArgumentException if an invalid path is specified - */ - public String create(final String path, byte data[], List acl, - CreateMode createMode) - throws KeeperException, InterruptedException - { - final String clientPath = path; - PathUtils.validatePath(clientPath, createMode.isSequential()); - - final String serverPath = prependChroot(clientPath); - - RequestHeader h = new RequestHeader(); - h.setType(ZooDefs.OpCode.create); - CreateRequest request = new CreateRequest(); - CreateResponse response = new CreateResponse(); - request.setData(data); - request.setFlags(createMode.toFlag()); - request.setPath(serverPath); - if (acl != null && acl.size() == 0) { - throw new KeeperException.InvalidACLException(); - } - request.setAcl(acl); - ReplyHeader r = cnxn.submitRequest(h, request, response, null); - if (r.getErr() != 0) { - throw KeeperException.create(KeeperException.Code.get(r.getErr()), - clientPath); - } - if (cnxn.chrootPath == null) { - return response.getPath(); - } else { - return response.getPath().substring(cnxn.chrootPath.length()); - } - } - - /** - * The asynchronous version of create. - * - * @see #create(String, byte[], List, CreateMode) - */ - - public void create(final String path, byte data[], List acl, - CreateMode createMode, StringCallback cb, Object ctx) - { - final String clientPath = path; - PathUtils.validatePath(clientPath, createMode.isSequential()); - - final String serverPath = prependChroot(clientPath); - - RequestHeader h = new RequestHeader(); - h.setType(ZooDefs.OpCode.create); - CreateRequest request = new CreateRequest(); - CreateResponse response = new CreateResponse(); - ReplyHeader r = new ReplyHeader(); - request.setData(data); - request.setFlags(createMode.toFlag()); - request.setPath(serverPath); - request.setAcl(acl); - cnxn.queuePacket(h, r, request, response, cb, clientPath, - serverPath, ctx, null); - } - - /** - * Delete the node with the given path. The call will succeed if such a node - * exists, and the given version matches the node's version (if the given - * version is -1, it matches any node's versions). - *

        - * A KeeperException with error code KeeperException.NoNode will be thrown - * if the nodes does not exist. - *

        - * A KeeperException with error code KeeperException.BadVersion will be - * thrown if the given version does not match the node's version. - *

        - * A KeeperException with error code KeeperException.NotEmpty will be thrown - * if the node has children. - *

        - * This operation, if successful, will trigger all the watches on the node - * of the given path left by exists API calls, and the watches on the parent - * node left by getChildren API calls. - * - * @param path - * the path of the node to be deleted. - * @param version - * the expected node version. - * @throws InterruptedException IF the server transaction is interrupted - * @throws KeeperException If the server signals an error with a non-zero - * return code. - * @throws IllegalArgumentException if an invalid path is specified - */ - public void delete(final String path, int version) - throws InterruptedException, KeeperException - { - final String clientPath = path; - PathUtils.validatePath(clientPath); - - final String serverPath; - - // maintain semantics even in chroot case - // specifically - root cannot be deleted - // I think this makes sense even in chroot case. - if (clientPath.equals("/")) { - // a bit of a hack, but delete(/) will never succeed and ensures - // that the same semantics are maintained - serverPath = clientPath; - } else { - serverPath = prependChroot(clientPath); - } - - RequestHeader h = new RequestHeader(); - h.setType(ZooDefs.OpCode.delete); - DeleteRequest request = new DeleteRequest(); - request.setPath(serverPath); - request.setVersion(version); - ReplyHeader r = cnxn.submitRequest(h, request, null, null); - if (r.getErr() != 0) { - throw KeeperException.create(KeeperException.Code.get(r.getErr()), - clientPath); - } - } - - /** - * Executes multiple ZooKeeper operations or none of them. - *

        - * On success, a list of results is returned. - * On failure, an exception is raised which contains partial results and - * error details, see {@link KeeperException#getResults} - *

        - * Note: The maximum allowable size of all of the data arrays in all of - * the setData operations in this single request is typically 1 MB - * (1,048,576 bytes). This limit is specified on the server via - * jute.maxbuffer. - * Requests larger than this will cause a KeeperException to be - * thrown. - * - * @param ops An iterable that contains the operations to be done. - * These should be created using the factory methods on {@link Op}. - * @return A list of results, one for each input Op, the order of - * which exactly matches the order of the ops input - * operations. - * @throws InterruptedException If the operation was interrupted. - * The operation may or may not have succeeded, but will not have - * partially succeeded if this exception is thrown. - * @throws KeeperException If the operation could not be completed - * due to some error in doing one of the specified ops. - * @throws IllegalArgumentException if an invalid path is specified - * - * @since 3.4.0 - */ - public List multi(Iterable ops) throws InterruptedException, KeeperException { - for (Op op : ops) { - op.validate(); - } - // reconstructing transaction with the chroot prefix - List transaction = new ArrayList(); - for (Op op : ops) { - transaction.add(withRootPrefix(op)); - } - return multiInternal(new MultiTransactionRecord(transaction)); - } - - private Op withRootPrefix(Op op) { - if (null != op.getPath()) { - final String serverPath = prependChroot(op.getPath()); - if (!op.getPath().equals(serverPath)) { - return op.withChroot(serverPath); - } - } - return op; - } - - protected List multiInternal(MultiTransactionRecord request) - throws InterruptedException, KeeperException { - RequestHeader h = new RequestHeader(); - h.setType(ZooDefs.OpCode.multi); - MultiResponse response = new MultiResponse(); - ReplyHeader r = cnxn.submitRequest(h, request, response, null); - if (r.getErr() != 0) { - throw KeeperException.create(KeeperException.Code.get(r.getErr())); - } - - List results = response.getResultList(); - - ErrorResult fatalError = null; - for (OpResult result : results) { - if (result instanceof ErrorResult && ((ErrorResult)result).getErr() != KeeperException.Code.OK.intValue()) { - fatalError = (ErrorResult) result; - break; - } - } - - if (fatalError != null) { - KeeperException ex = KeeperException.create(KeeperException.Code.get(fatalError.getErr())); - ex.setMultiResults(results); - throw ex; - } - - return results; - } - - /** - * A Transaction is a thin wrapper on the {@link #multi} method - * which provides a builder object that can be used to construct - * and commit an atomic set of operations. - * - * @since 3.4.0 - * - * @return a Transaction builder object - */ - public Transaction transaction() { - return new Transaction(this); - } - - /** - * The asynchronous version of delete. - * - * @see #delete(String, int) - */ - public void delete(final String path, int version, VoidCallback cb, - Object ctx) - { - final String clientPath = path; - PathUtils.validatePath(clientPath); - - final String serverPath; - - // maintain semantics even in chroot case - // specifically - root cannot be deleted - // I think this makes sense even in chroot case. - if (clientPath.equals("/")) { - // a bit of a hack, but delete(/) will never succeed and ensures - // that the same semantics are maintained - serverPath = clientPath; - } else { - serverPath = prependChroot(clientPath); - } - - RequestHeader h = new RequestHeader(); - h.setType(ZooDefs.OpCode.delete); - DeleteRequest request = new DeleteRequest(); - request.setPath(serverPath); - request.setVersion(version); - cnxn.queuePacket(h, new ReplyHeader(), request, null, cb, clientPath, - serverPath, ctx, null); - } - - /** - * Return the stat of the node of the given path. Return null if no such a - * node exists. - *

        - * If the watch is non-null and the call is successful (no exception is thrown), - * a watch will be left on the node with the given path. The watch will be - * triggered by a successful operation that creates/delete the node or sets - * the data on the node. - * - * @param path the node path - * @param watcher explicit watcher - * @return the stat of the node of the given path; return null if no such a - * node exists. - * @throws KeeperException If the server signals an error - * @throws InterruptedException If the server transaction is interrupted. - * @throws IllegalArgumentException if an invalid path is specified - */ - public Stat exists(final String path, Watcher watcher) - throws KeeperException, InterruptedException - { - final String clientPath = path; - PathUtils.validatePath(clientPath); - - // the watch contains the un-chroot path - WatchRegistration wcb = null; - if (watcher != null) { - wcb = new ExistsWatchRegistration(watcher, clientPath); - } - - final String serverPath = prependChroot(clientPath); - - RequestHeader h = new RequestHeader(); - h.setType(ZooDefs.OpCode.exists); - ExistsRequest request = new ExistsRequest(); - request.setPath(serverPath); - request.setWatch(watcher != null); - SetDataResponse response = new SetDataResponse(); - ReplyHeader r = cnxn.submitRequest(h, request, response, wcb); - if (r.getErr() != 0) { - if (r.getErr() == KeeperException.Code.NONODE.intValue()) { - return null; - } - throw KeeperException.create(KeeperException.Code.get(r.getErr()), - clientPath); - } - - return response.getStat().getCzxid() == -1 ? null : response.getStat(); - } - - /** - * Return the stat of the node of the given path. Return null if no such a - * node exists. - *

        - * If the watch is true and the call is successful (no exception is thrown), - * a watch will be left on the node with the given path. The watch will be - * triggered by a successful operation that creates/delete the node or sets - * the data on the node. - * - * @param path - * the node path - * @param watch - * whether need to watch this node - * @return the stat of the node of the given path; return null if no such a - * node exists. - * @throws KeeperException If the server signals an error - * @throws InterruptedException If the server transaction is interrupted. - */ - public Stat exists(String path, boolean watch) throws KeeperException, - InterruptedException - { - return exists(path, watch ? watchManager.defaultWatcher : null); - } - - /** - * The asynchronous version of exists. - * - * @see #exists(String, Watcher) - */ - public void exists(final String path, Watcher watcher, - StatCallback cb, Object ctx) - { - final String clientPath = path; - PathUtils.validatePath(clientPath); - - // the watch contains the un-chroot path - WatchRegistration wcb = null; - if (watcher != null) { - wcb = new ExistsWatchRegistration(watcher, clientPath); - } - - final String serverPath = prependChroot(clientPath); - - RequestHeader h = new RequestHeader(); - h.setType(ZooDefs.OpCode.exists); - ExistsRequest request = new ExistsRequest(); - request.setPath(serverPath); - request.setWatch(watcher != null); - SetDataResponse response = new SetDataResponse(); - cnxn.queuePacket(h, new ReplyHeader(), request, response, cb, - clientPath, serverPath, ctx, wcb); - } - - /** - * The asynchronous version of exists. - * - * @see #exists(String, boolean) - */ - public void exists(String path, boolean watch, StatCallback cb, Object ctx) { - exists(path, watch ? watchManager.defaultWatcher : null, cb, ctx); - } - - /** - * Return the data and the stat of the node of the given path. - *

        - * If the watch is non-null and the call is successful (no exception is - * thrown), a watch will be left on the node with the given path. The watch - * will be triggered by a successful operation that sets data on the node, or - * deletes the node. - *

        - * A KeeperException with error code KeeperException.NoNode will be thrown - * if no node with the given path exists. - * - * @param path the given path - * @param watcher explicit watcher - * @param stat the stat of the node - * @return the data of the node - * @throws KeeperException If the server signals an error with a non-zero error code - * @throws InterruptedException If the server transaction is interrupted. - * @throws IllegalArgumentException if an invalid path is specified - */ - public byte[] getData(final String path, Watcher watcher, Stat stat) - throws KeeperException, InterruptedException - { - final String clientPath = path; - PathUtils.validatePath(clientPath); - - // the watch contains the un-chroot path - WatchRegistration wcb = null; - if (watcher != null) { - wcb = new DataWatchRegistration(watcher, clientPath); - } - - final String serverPath = prependChroot(clientPath); - - RequestHeader h = new RequestHeader(); - h.setType(ZooDefs.OpCode.getData); - GetDataRequest request = new GetDataRequest(); - request.setPath(serverPath); - request.setWatch(watcher != null); - GetDataResponse response = new GetDataResponse(); - ReplyHeader r = cnxn.submitRequest(h, request, response, wcb); - if (r.getErr() != 0) { - throw KeeperException.create(KeeperException.Code.get(r.getErr()), - clientPath); - } - if (stat != null) { - DataTree.copyStat(response.getStat(), stat); - } - return response.getData(); - } - - /** - * Return the data and the stat of the node of the given path. - *

        - * If the watch is true and the call is successful (no exception is - * thrown), a watch will be left on the node with the given path. The watch - * will be triggered by a successful operation that sets data on the node, or - * deletes the node. - *

        - * A KeeperException with error code KeeperException.NoNode will be thrown - * if no node with the given path exists. - * - * @param path the given path - * @param watch whether need to watch this node - * @param stat the stat of the node - * @return the data of the node - * @throws KeeperException If the server signals an error with a non-zero error code - * @throws InterruptedException If the server transaction is interrupted. - */ - public byte[] getData(String path, boolean watch, Stat stat) - throws KeeperException, InterruptedException { - return getData(path, watch ? watchManager.defaultWatcher : null, stat); - } - - /** - * The asynchronous version of getData. - * - * @see #getData(String, Watcher, Stat) - */ - public void getData(final String path, Watcher watcher, - DataCallback cb, Object ctx) - { - final String clientPath = path; - PathUtils.validatePath(clientPath); - - // the watch contains the un-chroot path - WatchRegistration wcb = null; - if (watcher != null) { - wcb = new DataWatchRegistration(watcher, clientPath); - } - - final String serverPath = prependChroot(clientPath); - - RequestHeader h = new RequestHeader(); - h.setType(ZooDefs.OpCode.getData); - GetDataRequest request = new GetDataRequest(); - request.setPath(serverPath); - request.setWatch(watcher != null); - GetDataResponse response = new GetDataResponse(); - cnxn.queuePacket(h, new ReplyHeader(), request, response, cb, - clientPath, serverPath, ctx, wcb); - } - - /** - * The asynchronous version of getData. - * - * @see #getData(String, boolean, Stat) - */ - public void getData(String path, boolean watch, DataCallback cb, Object ctx) { - getData(path, watch ? watchManager.defaultWatcher : null, cb, ctx); - } - - /** - * Set the data for the node of the given path if such a node exists and the - * given version matches the version of the node (if the given version is - * -1, it matches any node's versions). Return the stat of the node. - *

        - * This operation, if successful, will trigger all the watches on the node - * of the given path left by getData calls. - *

        - * A KeeperException with error code KeeperException.NoNode will be thrown - * if no node with the given path exists. - *

        - * A KeeperException with error code KeeperException.BadVersion will be - * thrown if the given version does not match the node's version. - *

        - * The maximum allowable size of the data array is 1 MB (1,048,576 bytes). - * Arrays larger than this will cause a KeeperException to be thrown. - * - * @param path - * the path of the node - * @param data - * the data to set - * @param version - * the expected matching version - * @return the state of the node - * @throws InterruptedException If the server transaction is interrupted. - * @throws KeeperException If the server signals an error with a non-zero error code. - * @throws IllegalArgumentException if an invalid path is specified - */ - public Stat setData(final String path, byte data[], int version) - throws KeeperException, InterruptedException - { - final String clientPath = path; - PathUtils.validatePath(clientPath); - - final String serverPath = prependChroot(clientPath); - - RequestHeader h = new RequestHeader(); - h.setType(ZooDefs.OpCode.setData); - SetDataRequest request = new SetDataRequest(); - request.setPath(serverPath); - request.setData(data); - request.setVersion(version); - SetDataResponse response = new SetDataResponse(); - ReplyHeader r = cnxn.submitRequest(h, request, response, null); - if (r.getErr() != 0) { - throw KeeperException.create(KeeperException.Code.get(r.getErr()), - clientPath); - } - return response.getStat(); - } - - /** - * The asynchronous version of setData. - * - * @see #setData(String, byte[], int) - */ - public void setData(final String path, byte data[], int version, - StatCallback cb, Object ctx) - { - final String clientPath = path; - PathUtils.validatePath(clientPath); - - final String serverPath = prependChroot(clientPath); - - RequestHeader h = new RequestHeader(); - h.setType(ZooDefs.OpCode.setData); - SetDataRequest request = new SetDataRequest(); - request.setPath(serverPath); - request.setData(data); - request.setVersion(version); - SetDataResponse response = new SetDataResponse(); - cnxn.queuePacket(h, new ReplyHeader(), request, response, cb, - clientPath, serverPath, ctx, null); - } - - /** - * Return the ACL and stat of the node of the given path. - *

        - * A KeeperException with error code KeeperException.NoNode will be thrown - * if no node with the given path exists. - * - * @param path - * the given path for the node - * @param stat - * the stat of the node will be copied to this parameter. - * @return the ACL array of the given node. - * @throws InterruptedException If the server transaction is interrupted. - * @throws KeeperException If the server signals an error with a non-zero error code. - * @throws IllegalArgumentException if an invalid path is specified - */ - public List getACL(final String path, Stat stat) - throws KeeperException, InterruptedException - { - final String clientPath = path; - PathUtils.validatePath(clientPath); - - final String serverPath = prependChroot(clientPath); - - RequestHeader h = new RequestHeader(); - h.setType(ZooDefs.OpCode.getACL); - GetACLRequest request = new GetACLRequest(); - request.setPath(serverPath); - GetACLResponse response = new GetACLResponse(); - ReplyHeader r = cnxn.submitRequest(h, request, response, null); - if (r.getErr() != 0) { - throw KeeperException.create(KeeperException.Code.get(r.getErr()), - clientPath); - } - DataTree.copyStat(response.getStat(), stat); - return response.getAcl(); - } - - /** - * The asynchronous version of getACL. - * - * @see #getACL(String, Stat) - */ - public void getACL(final String path, Stat stat, ACLCallback cb, - Object ctx) - { - final String clientPath = path; - PathUtils.validatePath(clientPath); - - final String serverPath = prependChroot(clientPath); - - RequestHeader h = new RequestHeader(); - h.setType(ZooDefs.OpCode.getACL); - GetACLRequest request = new GetACLRequest(); - request.setPath(serverPath); - GetACLResponse response = new GetACLResponse(); - cnxn.queuePacket(h, new ReplyHeader(), request, response, cb, - clientPath, serverPath, ctx, null); - } - - /** - * Set the ACL for the node of the given path if such a node exists and the - * given version matches the version of the node. Return the stat of the - * node. - *

        - * A KeeperException with error code KeeperException.NoNode will be thrown - * if no node with the given path exists. - *

        - * A KeeperException with error code KeeperException.BadVersion will be - * thrown if the given version does not match the node's version. - * - * @param path - * @param acl - * @param version - * @return the stat of the node. - * @throws InterruptedException If the server transaction is interrupted. - * @throws KeeperException If the server signals an error with a non-zero error code. - * @throws org.apache.zookeeper.KeeperException.InvalidACLException If the acl is invalide. - * @throws IllegalArgumentException if an invalid path is specified - */ - public Stat setACL(final String path, List acl, int version) - throws KeeperException, InterruptedException - { - final String clientPath = path; - PathUtils.validatePath(clientPath); - - final String serverPath = prependChroot(clientPath); - - RequestHeader h = new RequestHeader(); - h.setType(ZooDefs.OpCode.setACL); - SetACLRequest request = new SetACLRequest(); - request.setPath(serverPath); - if (acl != null && acl.size() == 0) { - throw new KeeperException.InvalidACLException(clientPath); - } - request.setAcl(acl); - request.setVersion(version); - SetACLResponse response = new SetACLResponse(); - ReplyHeader r = cnxn.submitRequest(h, request, response, null); - if (r.getErr() != 0) { - throw KeeperException.create(KeeperException.Code.get(r.getErr()), - clientPath); - } - return response.getStat(); - } - - /** - * The asynchronous version of setACL. - * - * @see #setACL(String, List, int) - */ - public void setACL(final String path, List acl, int version, - StatCallback cb, Object ctx) - { - final String clientPath = path; - PathUtils.validatePath(clientPath); - - final String serverPath = prependChroot(clientPath); - - RequestHeader h = new RequestHeader(); - h.setType(ZooDefs.OpCode.setACL); - SetACLRequest request = new SetACLRequest(); - request.setPath(serverPath); - request.setAcl(acl); - request.setVersion(version); - SetACLResponse response = new SetACLResponse(); - cnxn.queuePacket(h, new ReplyHeader(), request, response, cb, - clientPath, serverPath, ctx, null); - } - - /** - * Return the list of the children of the node of the given path. - *

        - * If the watch is non-null and the call is successful (no exception is thrown), - * a watch will be left on the node with the given path. The watch willbe - * triggered by a successful operation that deletes the node of the given - * path or creates/delete a child under the node. - *

        - * The list of children returned is not sorted and no guarantee is provided - * as to its natural or lexical order. - *

        - * A KeeperException with error code KeeperException.NoNode will be thrown - * if no node with the given path exists. - * - * @param path - * @param watcher explicit watcher - * @return an unordered array of children of the node with the given path - * @throws InterruptedException If the server transaction is interrupted. - * @throws KeeperException If the server signals an error with a non-zero error code. - * @throws IllegalArgumentException if an invalid path is specified - */ - public List getChildren(final String path, Watcher watcher) - throws KeeperException, InterruptedException - { - final String clientPath = path; - PathUtils.validatePath(clientPath); - - // the watch contains the un-chroot path - WatchRegistration wcb = null; - if (watcher != null) { - wcb = new ChildWatchRegistration(watcher, clientPath); - } - - final String serverPath = prependChroot(clientPath); - - RequestHeader h = new RequestHeader(); - h.setType(ZooDefs.OpCode.getChildren); - GetChildrenRequest request = new GetChildrenRequest(); - request.setPath(serverPath); - request.setWatch(watcher != null); - GetChildrenResponse response = new GetChildrenResponse(); - ReplyHeader r = cnxn.submitRequest(h, request, response, wcb); - if (r.getErr() != 0) { - throw KeeperException.create(KeeperException.Code.get(r.getErr()), - clientPath); - } - return response.getChildren(); - } - - /** - * Return the list of the children of the node of the given path. - *

        - * If the watch is true and the call is successful (no exception is thrown), - * a watch will be left on the node with the given path. The watch willbe - * triggered by a successful operation that deletes the node of the given - * path or creates/delete a child under the node. - *

        - * The list of children returned is not sorted and no guarantee is provided - * as to its natural or lexical order. - *

        - * A KeeperException with error code KeeperException.NoNode will be thrown - * if no node with the given path exists. - * - * @param path - * @param watch - * @return an unordered array of children of the node with the given path - * @throws InterruptedException If the server transaction is interrupted. - * @throws KeeperException If the server signals an error with a non-zero error code. - */ - public List getChildren(String path, boolean watch) - throws KeeperException, InterruptedException { - return getChildren(path, watch ? watchManager.defaultWatcher : null); - } - - /** - * The asynchronous version of getChildren. - * - * @see #getChildren(String, Watcher) - */ - public void getChildren(final String path, Watcher watcher, - ChildrenCallback cb, Object ctx) - { - final String clientPath = path; - PathUtils.validatePath(clientPath); - - // the watch contains the un-chroot path - WatchRegistration wcb = null; - if (watcher != null) { - wcb = new ChildWatchRegistration(watcher, clientPath); - } - - final String serverPath = prependChroot(clientPath); - - RequestHeader h = new RequestHeader(); - h.setType(ZooDefs.OpCode.getChildren); - GetChildrenRequest request = new GetChildrenRequest(); - request.setPath(serverPath); - request.setWatch(watcher != null); - GetChildrenResponse response = new GetChildrenResponse(); - cnxn.queuePacket(h, new ReplyHeader(), request, response, cb, - clientPath, serverPath, ctx, wcb); - } - - /** - * The asynchronous version of getChildren. - * - * @see #getChildren(String, boolean) - */ - public void getChildren(String path, boolean watch, ChildrenCallback cb, - Object ctx) - { - getChildren(path, watch ? watchManager.defaultWatcher : null, cb, ctx); - } - - /** - * For the given znode path return the stat and children list. - *

        - * If the watch is non-null and the call is successful (no exception is thrown), - * a watch will be left on the node with the given path. The watch willbe - * triggered by a successful operation that deletes the node of the given - * path or creates/delete a child under the node. - *

        - * The list of children returned is not sorted and no guarantee is provided - * as to its natural or lexical order. - *

        - * A KeeperException with error code KeeperException.NoNode will be thrown - * if no node with the given path exists. - * - * @since 3.3.0 - * - * @param path - * @param watcher explicit watcher - * @param stat stat of the znode designated by path - * @return an unordered array of children of the node with the given path - * @throws InterruptedException If the server transaction is interrupted. - * @throws KeeperException If the server signals an error with a non-zero error code. - * @throws IllegalArgumentException if an invalid path is specified - */ - public List getChildren(final String path, Watcher watcher, - Stat stat) - throws KeeperException, InterruptedException - { - final String clientPath = path; - PathUtils.validatePath(clientPath); - - // the watch contains the un-chroot path - WatchRegistration wcb = null; - if (watcher != null) { - wcb = new ChildWatchRegistration(watcher, clientPath); - } - - final String serverPath = prependChroot(clientPath); - - RequestHeader h = new RequestHeader(); - h.setType(ZooDefs.OpCode.getChildren2); - GetChildren2Request request = new GetChildren2Request(); - request.setPath(serverPath); - request.setWatch(watcher != null); - GetChildren2Response response = new GetChildren2Response(); - ReplyHeader r = cnxn.submitRequest(h, request, response, wcb); - if (r.getErr() != 0) { - throw KeeperException.create(KeeperException.Code.get(r.getErr()), - clientPath); - } - if (stat != null) { - DataTree.copyStat(response.getStat(), stat); - } - return response.getChildren(); - } - - /** - * For the given znode path return the stat and children list. - *

        - * If the watch is true and the call is successful (no exception is thrown), - * a watch will be left on the node with the given path. The watch willbe - * triggered by a successful operation that deletes the node of the given - * path or creates/delete a child under the node. - *

        - * The list of children returned is not sorted and no guarantee is provided - * as to its natural or lexical order. - *

        - * A KeeperException with error code KeeperException.NoNode will be thrown - * if no node with the given path exists. - * - * @since 3.3.0 - * - * @param path - * @param watch - * @param stat stat of the znode designated by path - * @return an unordered array of children of the node with the given path - * @throws InterruptedException If the server transaction is interrupted. - * @throws KeeperException If the server signals an error with a non-zero - * error code. - */ - public List getChildren(String path, boolean watch, Stat stat) - throws KeeperException, InterruptedException { - return getChildren(path, watch ? watchManager.defaultWatcher : null, - stat); - } - - /** - * The asynchronous version of getChildren. - * - * @since 3.3.0 - * - * @see #getChildren(String, Watcher, Stat) - */ - public void getChildren(final String path, Watcher watcher, - Children2Callback cb, Object ctx) - { - final String clientPath = path; - PathUtils.validatePath(clientPath); - - // the watch contains the un-chroot path - WatchRegistration wcb = null; - if (watcher != null) { - wcb = new ChildWatchRegistration(watcher, clientPath); - } - - final String serverPath = prependChroot(clientPath); - - RequestHeader h = new RequestHeader(); - h.setType(ZooDefs.OpCode.getChildren2); - GetChildren2Request request = new GetChildren2Request(); - request.setPath(serverPath); - request.setWatch(watcher != null); - GetChildren2Response response = new GetChildren2Response(); - cnxn.queuePacket(h, new ReplyHeader(), request, response, cb, - clientPath, serverPath, ctx, wcb); - } - - /** - * The asynchronous version of getChildren. - * - * @since 3.3.0 - * - * @see #getChildren(String, boolean, Stat) - */ - public void getChildren(String path, boolean watch, Children2Callback cb, - Object ctx) - { - getChildren(path, watch ? watchManager.defaultWatcher : null, cb, ctx); - } - - /** - * Asynchronous sync. Flushes channel between process and leader. - * @param path - * @param cb a handler for the callback - * @param ctx context to be provided to the callback - * @throws IllegalArgumentException if an invalid path is specified - */ - public void sync(final String path, VoidCallback cb, Object ctx){ - final String clientPath = path; - PathUtils.validatePath(clientPath); - - final String serverPath = prependChroot(clientPath); - - RequestHeader h = new RequestHeader(); - h.setType(ZooDefs.OpCode.sync); - SyncRequest request = new SyncRequest(); - SyncResponse response = new SyncResponse(); - request.setPath(serverPath); - cnxn.queuePacket(h, new ReplyHeader(), request, response, cb, - clientPath, serverPath, ctx, null); - } - - public States getState() { - return cnxn.getState(); - } - - /** - * String representation of this ZooKeeper client. Suitable for things - * like logging. - * - * Do NOT count on the format of this string, it may change without - * warning. - * - * @since 3.3.0 - */ - @Override - public String toString() { - States state = getState(); - return ("State:" + state.toString() - + (state.isConnected() ? - " Timeout:" + getSessionTimeout() + " " : - " ") - + cnxn); - } - - /* - * Methods to aid in testing follow. - * - * THESE METHODS ARE EXPECTED TO BE USED FOR TESTING ONLY!!! - */ - - /** - * Wait up to wait milliseconds for the underlying threads to shutdown. - * THIS METHOD IS EXPECTED TO BE USED FOR TESTING ONLY!!! - * - * @since 3.3.0 - * - * @param wait max wait in milliseconds - * @return true iff all threads are shutdown, otw false - */ - protected boolean testableWaitForShutdown(int wait) - throws InterruptedException - { - cnxn.sendThread.join(wait); - if (cnxn.sendThread.isAlive()) return false; - cnxn.eventThread.join(wait); - if (cnxn.eventThread.isAlive()) return false; - return true; - } - - /** - * Returns the address to which the socket is connected. Useful for testing - * against an ensemble - test client may need to know which server - * to shutdown if interested in verifying that the code handles - * disconnection/reconnection correctly. - * THIS METHOD IS EXPECTED TO BE USED FOR TESTING ONLY!!! - * - * @since 3.3.0 - * - * @return ip address of the remote side of the connection or null if - * not connected - */ - protected SocketAddress testableRemoteSocketAddress() { - return cnxn.sendThread.getClientCnxnSocket().getRemoteSocketAddress(); - } - - /** - * Returns the local address to which the socket is bound. - * THIS METHOD IS EXPECTED TO BE USED FOR TESTING ONLY!!! - * - * @since 3.3.0 - * - * @return ip address of the remote side of the connection or null if - * not connected - */ - protected SocketAddress testableLocalSocketAddress() { - return cnxn.sendThread.getClientCnxnSocket().getLocalSocketAddress(); - } - - private static ClientCnxnSocket getClientCnxnSocket() throws IOException { - String clientCnxnSocketName = System - .getProperty(ZOOKEEPER_CLIENT_CNXN_SOCKET); - if (clientCnxnSocketName == null) { - clientCnxnSocketName = ClientCnxnSocketNIO.class.getName(); - } - try { - return (ClientCnxnSocket) Class.forName(clientCnxnSocketName) - .newInstance(); - } catch (Exception e) { - IOException ioe = new IOException("Couldn't instantiate " - + clientCnxnSocketName); - ioe.initCause(e); - throw ioe; - } - } -} diff --git a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/ZooKeeperMain.java b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/ZooKeeperMain.java deleted file mode 100644 index b1b4c2781..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/ZooKeeperMain.java +++ /dev/null @@ -1,859 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you 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. - */ - -package org.apache.zookeeper; - -import java.io.BufferedReader; -import java.io.IOException; -import java.io.InputStreamReader; -import java.lang.reflect.InvocationTargetException; -import java.lang.reflect.Method; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Date; -import java.util.HashMap; -import java.util.Iterator; -import java.util.LinkedList; -import java.util.List; -import java.util.Map; -import java.util.NoSuchElementException; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.apache.zookeeper.AsyncCallback.DataCallback; -import org.apache.zookeeper.ZooDefs.Ids; -import org.apache.zookeeper.data.ACL; -import org.apache.zookeeper.data.Id; -import org.apache.zookeeper.data.Stat; -import java.util.StringTokenizer; - -/** - * The command line client to ZooKeeper. - * - */ -public class ZooKeeperMain { - private static final Logger LOG = LoggerFactory.getLogger(ZooKeeperMain.class); - protected static final Map commandMap = new HashMap( ); - - protected MyCommandOptions cl = new MyCommandOptions(); - protected HashMap history = new HashMap( ); - protected int commandCount = 0; - protected boolean printWatches = true; - - protected ZooKeeper zk; - protected String host = ""; - - public boolean getPrintWatches( ) { - return printWatches; - } - - static { - commandMap.put("connect", "host:port"); - commandMap.put("close",""); - commandMap.put("create", "[-s] [-e] path data acl"); - commandMap.put("delete","path [version]"); - commandMap.put("rmr","path"); - commandMap.put("set","path data [version]"); - commandMap.put("get","path [watch]"); - commandMap.put("ls","path [watch]"); - commandMap.put("ls2","path [watch]"); - commandMap.put("getAcl","path"); - commandMap.put("setAcl","path acl"); - commandMap.put("stat","path [watch]"); - commandMap.put("sync","path"); - commandMap.put("setquota","-n|-b val path"); - commandMap.put("listquota","path"); - commandMap.put("delquota","[-n|-b] path"); - commandMap.put("history",""); - commandMap.put("redo","cmdno"); - commandMap.put("printwatches", "on|off"); - commandMap.put("quit",""); - commandMap.put("addauth", "scheme auth"); - } - - static void usage() { - System.err.println("ZooKeeper -server host:port cmd args"); - for (String cmd : commandMap.keySet()) { - System.err.println("\t"+cmd+ " " + commandMap.get(cmd)); - } - } - - private class MyWatcher implements Watcher { - public void process(WatchedEvent event) { - if (getPrintWatches()) { - ZooKeeperMain.printMessage("WATCHER::"); - ZooKeeperMain.printMessage(event.toString()); - } - } - } - - static private int getPermFromString(String permString) { - int perm = 0; - for (int i = 0; i < permString.length(); i++) { - switch (permString.charAt(i)) { - case 'r': - perm |= ZooDefs.Perms.READ; - break; - case 'w': - perm |= ZooDefs.Perms.WRITE; - break; - case 'c': - perm |= ZooDefs.Perms.CREATE; - break; - case 'd': - perm |= ZooDefs.Perms.DELETE; - break; - case 'a': - perm |= ZooDefs.Perms.ADMIN; - break; - default: - System.err - .println("Unknown perm type: " + permString.charAt(i)); - } - } - return perm; - } - - private static void printStat(Stat stat) { - System.err.println("cZxid = 0x" + Long.toHexString(stat.getCzxid())); - System.err.println("ctime = " + new Date(stat.getCtime()).toString()); - System.err.println("mZxid = 0x" + Long.toHexString(stat.getMzxid())); - System.err.println("mtime = " + new Date(stat.getMtime()).toString()); - System.err.println("pZxid = 0x" + Long.toHexString(stat.getPzxid())); - System.err.println("cversion = " + stat.getCversion()); - System.err.println("dataVersion = " + stat.getVersion()); - System.err.println("aclVersion = " + stat.getAversion()); - System.err.println("ephemeralOwner = 0x" - + Long.toHexString(stat.getEphemeralOwner())); - System.err.println("dataLength = " + stat.getDataLength()); - System.err.println("numChildren = " + stat.getNumChildren()); - } - - /** - * A storage class for both command line options and shell commands. - * - */ - static class MyCommandOptions { - - private Map options = new HashMap(); - private List cmdArgs = null; - private String command = null; - - public MyCommandOptions() { - options.put("server", "localhost:2181"); - options.put("timeout", "30000"); - } - - public String getOption(String opt) { - return options.get(opt); - } - - public String getCommand( ) { - return command; - } - - public String getCmdArgument( int index ) { - return cmdArgs.get(index); - } - - public int getNumArguments( ) { - return cmdArgs.size(); - } - - public String[] getArgArray() { - return cmdArgs.toArray(new String[0]); - } - - /** - * Parses a command line that may contain one or more flags - * before an optional command string - * @param args command line arguments - * @return true if parsing succeeded, false otherwise. - */ - public boolean parseOptions(String[] args) { - List argList = Arrays.asList(args); - Iterator it = argList.iterator(); - - while (it.hasNext()) { - String opt = it.next(); - try { - if (opt.equals("-server")) { - options.put("server", it.next()); - } else if (opt.equals("-timeout")) { - options.put("timeout", it.next()); - } else if (opt.equals("-r")) { - options.put("readonly", "true"); - } - } catch (NoSuchElementException e){ - System.err.println("Error: no argument found for option " - + opt); - return false; - } - - if (!opt.startsWith("-")) { - command = opt; - cmdArgs = new ArrayList( ); - cmdArgs.add( command ); - while (it.hasNext()) { - cmdArgs.add(it.next()); - } - return true; - } - } - return true; - } - - /** - * Breaks a string into command + arguments. - * @param cmdstring string of form "cmd arg1 arg2..etc" - * @return true if parsing succeeded. - */ - public boolean parseCommand( String cmdstring ) { - StringTokenizer cmdTokens = new StringTokenizer(cmdstring, " "); - String[] args = new String[cmdTokens.countTokens()]; - int tokenIndex = 0; - while (cmdTokens.hasMoreTokens()) { - args[tokenIndex] = cmdTokens.nextToken(); - tokenIndex++; - } - if (args.length == 0){ - return false; - } - command = args[0]; - cmdArgs = Arrays.asList(args); - return true; - } - } - - - /** - * Makes a list of possible completions, either for commands - * or for zk nodes if the token to complete begins with / - * - */ - - - protected void addToHistory(int i,String cmd) { - history.put(i, cmd); - } - - public static List getCommands() { - return new LinkedList(commandMap.keySet()); - } - - protected String getPrompt() { - return "[zk: " + host + "("+zk.getState()+")" + " " + commandCount + "] "; - } - - public static void printMessage(String msg) { - System.out.println("\n"+msg); - } - - protected void connectToZK(String newHost) throws InterruptedException, IOException { - if (zk != null && zk.getState().isAlive()) { - zk.close(); - } - host = newHost; - boolean readOnly = cl.getOption("readonly") != null; - zk = new ZooKeeper(host, - Integer.parseInt(cl.getOption("timeout")), - new MyWatcher(), readOnly); - } - - public static void main(String args[]) - throws KeeperException, IOException, InterruptedException - { - ZooKeeperMain main = new ZooKeeperMain(args); - main.run(); - } - - public ZooKeeperMain(String args[]) throws IOException, InterruptedException { - cl.parseOptions(args); - System.out.println("Connecting to " + cl.getOption("server")); - connectToZK(cl.getOption("server")); - //zk = new ZooKeeper(cl.getOption("server"), -// Integer.parseInt(cl.getOption("timeout")), new MyWatcher()); - } - - public ZooKeeperMain(ZooKeeper zk) { - this.zk = zk; - } - - @SuppressWarnings("unchecked") - void run() throws KeeperException, IOException, InterruptedException { - if (cl.getCommand() == null) { - System.out.println("Welcome to ZooKeeper!"); - - boolean jlinemissing = false; - // only use jline if it's in the classpath - try { - Class consoleC = Class.forName("jline.ConsoleReader"); - Class completorC = - Class.forName("org.apache.zookeeper.JLineZNodeCompletor"); - - System.out.println("JLine support is enabled"); - - Object console = - consoleC.getConstructor().newInstance(); - - Object completor = - completorC.getConstructor(ZooKeeper.class).newInstance(zk); - Method addCompletor = consoleC.getMethod("addCompletor", - Class.forName("jline.Completor")); - addCompletor.invoke(console, completor); - - String line; - Method readLine = consoleC.getMethod("readLine", String.class); - while ((line = (String)readLine.invoke(console, getPrompt())) != null) { - executeLine(line); - } - } catch (ClassNotFoundException e) { - LOG.debug("Unable to start jline", e); - jlinemissing = true; - } catch (NoSuchMethodException e) { - LOG.debug("Unable to start jline", e); - jlinemissing = true; - } catch (InvocationTargetException e) { - LOG.debug("Unable to start jline", e); - jlinemissing = true; - } catch (IllegalAccessException e) { - LOG.debug("Unable to start jline", e); - jlinemissing = true; - } catch (InstantiationException e) { - LOG.debug("Unable to start jline", e); - jlinemissing = true; - } - - if (jlinemissing) { - System.out.println("JLine support is disabled"); - BufferedReader br = - new BufferedReader(new InputStreamReader(System.in)); - - String line; - while ((line = br.readLine()) != null) { - executeLine(line); - } - } - } - } - - public void executeLine(String line) - throws InterruptedException, IOException, KeeperException { - if (!line.equals("")) { - cl.parseCommand(line); - addToHistory(commandCount,line); - processCmd(cl); - commandCount++; - } - } - - private static DataCallback dataCallback = new DataCallback() { - - public void processResult(int rc, String path, Object ctx, byte[] data, - Stat stat) { - System.out.println("rc = " + rc + " path = " + path + " data = " - + (data == null ? "null" : new String(data)) + " stat = "); - printStat(stat); - } - - }; - - /** - * trim the quota tree to recover unwanted tree elements - * in the quota's tree - * @param zk the zookeeper client - * @param path the path to start from and go up and see if their - * is any unwanted parent in the path. - * @return true if sucessful - * @throws KeeperException - * @throws IOException - * @throws InterruptedException - */ - private static boolean trimProcQuotas(ZooKeeper zk, String path) - throws KeeperException, IOException, InterruptedException - { - if (Quotas.quotaZookeeper.equals(path)) { - return true; - } - List children = zk.getChildren(path, false); - if (children.size() == 0) { - zk.delete(path, -1); - String parent = path.substring(0, path.lastIndexOf('/')); - return trimProcQuotas(zk, parent); - } else { - return true; - } - } - - /** - * this method deletes quota for a node. - * @param zk the zookeeper client - * @param path the path to delete quota for - * @param bytes true if number of bytes needs to - * be unset - * @param numNodes true if number of nodes needs - * to be unset - * @return true if quota deletion is successful - * @throws KeeperException - * @throws IOException - * @throws InterruptedException - */ - public static boolean delQuota(ZooKeeper zk, String path, - boolean bytes, boolean numNodes) - throws KeeperException, IOException, InterruptedException - { - String parentPath = Quotas.quotaZookeeper + path; - String quotaPath = Quotas.quotaZookeeper + path + "/" + Quotas.limitNode; - if (zk.exists(quotaPath, false) == null) { - System.out.println("Quota does not exist for " + path); - return true; - } - byte[] data = null; - try { - data = zk.getData(quotaPath, false, new Stat()); - } catch(KeeperException.NoNodeException ne) { - System.err.println("quota does not exist for " + path); - return true; - } - StatsTrack strack = new StatsTrack(new String(data)); - if (bytes && !numNodes) { - strack.setBytes(-1L); - zk.setData(quotaPath, strack.toString().getBytes(), -1); - } else if (!bytes && numNodes) { - strack.setCount(-1); - zk.setData(quotaPath, strack.toString().getBytes(), -1); - } else if (bytes && numNodes) { - // delete till you can find a node with more than - // one child - List children = zk.getChildren(parentPath, false); - /// delete the direct children first - for (String child: children) { - zk.delete(parentPath + "/" + child, -1); - } - // cut the tree till their is more than one child - trimProcQuotas(zk, parentPath); - } - return true; - } - - private static void checkIfParentQuota(ZooKeeper zk, String path) - throws InterruptedException, KeeperException - { - final String[] splits = path.split("/"); - String quotaPath = Quotas.quotaZookeeper; - for (String str: splits) { - if (str.length() == 0) { - // this should only be for the beginning of the path - // i.e. "/..." - split(path)[0] is empty string before first '/' - continue; - } - quotaPath += "/" + str; - List children = null; - try { - children = zk.getChildren(quotaPath, false); - } catch(KeeperException.NoNodeException ne) { - LOG.debug("child removed during quota check", ne); - return; - } - if (children.size() == 0) { - return; - } - for (String child: children) { - if (Quotas.limitNode.equals(child)) { - throw new IllegalArgumentException(path + " has a parent " - + quotaPath + " which has a quota"); - } - } - } - } - - /** - * this method creates a quota node for the path - * @param zk the ZooKeeper client - * @param path the path for which quota needs to be created - * @param bytes the limit of bytes on this path - * @param numNodes the limit of number of nodes on this path - * @return true if its successful and false if not. - */ - public static boolean createQuota(ZooKeeper zk, String path, - long bytes, int numNodes) - throws KeeperException, IOException, InterruptedException - { - // check if the path exists. We cannot create - // quota for a path that already exists in zookeeper - // for now. - Stat initStat = zk.exists(path, false); - if (initStat == null) { - throw new IllegalArgumentException(path + " does not exist."); - } - // now check if their is already existing - // parent or child that has quota - - String quotaPath = Quotas.quotaZookeeper; - // check for more than 2 children -- - // if zookeeper_stats and zookeeper_qutoas - // are not the children then this path - // is an ancestor of some path that - // already has quota - String realPath = Quotas.quotaZookeeper + path; - try { - List children = zk.getChildren(realPath, false); - for (String child: children) { - if (!child.startsWith("zookeeper_")) { - throw new IllegalArgumentException(path + " has child " + - child + " which has a quota"); - } - } - } catch(KeeperException.NoNodeException ne) { - // this is fine - } - - //check for any parent that has been quota - checkIfParentQuota(zk, path); - - // this is valid node for quota - // start creating all the parents - if (zk.exists(quotaPath, false) == null) { - try { - zk.create(Quotas.procZookeeper, null, Ids.OPEN_ACL_UNSAFE, - CreateMode.PERSISTENT); - zk.create(Quotas.quotaZookeeper, null, Ids.OPEN_ACL_UNSAFE, - CreateMode.PERSISTENT); - } catch(KeeperException.NodeExistsException ne) { - // do nothing - } - } - - // now create the direct children - // and the stat and quota nodes - String[] splits = path.split("/"); - StringBuilder sb = new StringBuilder(); - sb.append(quotaPath); - for (int i=1; i 2; - String path = null; - List acl = Ids.OPEN_ACL_UNSAFE; - LOG.debug("Processing " + cmd); - - if (cmd.equals("quit")) { - System.out.println("Quitting..."); - zk.close(); - System.exit(0); - } else if (cmd.equals("redo") && args.length >= 2) { - Integer i = Integer.decode(args[1]); - if (commandCount <= i){ // don't allow redoing this redo - System.out.println("Command index out of range"); - return false; - } - cl.parseCommand(history.get(i)); - if (cl.getCommand().equals( "redo" )){ - System.out.println("No redoing redos"); - return false; - } - history.put(commandCount, history.get(i)); - processCmd( cl); - } else if (cmd.equals("history")) { - for (int i=commandCount - 10;i<=commandCount;++i) { - if (i < 0) continue; - System.out.println(i + " - " + history.get(i)); - } - } else if (cmd.equals("printwatches")) { - if (args.length == 1) { - System.out.println("printwatches is " + (printWatches ? "on" : "off")); - } else { - printWatches = args[1].equals("on"); - } - } else if (cmd.equals("connect")) { - if (args.length >=2) { - connectToZK(args[1]); - } else { - connectToZK(host); - } - } - - // Below commands all need a live connection - if (zk == null || !zk.getState().isAlive()) { - System.out.println("Not connected"); - return false; - } - - if (cmd.equals("create") && args.length >= 3) { - int first = 0; - CreateMode flags = CreateMode.PERSISTENT; - if ((args[1].equals("-e") && args[2].equals("-s")) - || (args[1]).equals("-s") && (args[2].equals("-e"))) { - first+=2; - flags = CreateMode.EPHEMERAL_SEQUENTIAL; - } else if (args[1].equals("-e")) { - first++; - flags = CreateMode.EPHEMERAL; - } else if (args[1].equals("-s")) { - first++; - flags = CreateMode.PERSISTENT_SEQUENTIAL; - } - if (args.length == first + 4) { - acl = parseACLs(args[first+3]); - } - path = args[first + 1]; - String newPath = zk.create(path, args[first+2].getBytes(), acl, - flags); - System.err.println("Created " + newPath); - } else if (cmd.equals("delete") && args.length >= 2) { - path = args[1]; - zk.delete(path, watch ? Integer.parseInt(args[2]) : -1); - } else if (cmd.equals("rmr") && args.length >= 2) { - path = args[1]; - ZKUtil.deleteRecursive(zk, path); - } else if (cmd.equals("set") && args.length >= 3) { - path = args[1]; - stat = zk.setData(path, args[2].getBytes(), - args.length > 3 ? Integer.parseInt(args[3]) : -1); - printStat(stat); - } else if (cmd.equals("aget") && args.length >= 2) { - path = args[1]; - zk.getData(path, watch, dataCallback, path); - } else if (cmd.equals("get") && args.length >= 2) { - path = args[1]; - byte data[] = zk.getData(path, watch, stat); - data = (data == null)? "null".getBytes() : data; - System.out.println(new String(data)); - printStat(stat); - } else if (cmd.equals("ls") && args.length >= 2) { - path = args[1]; - List children = zk.getChildren(path, watch); - System.out.println(children); - } else if (cmd.equals("ls2") && args.length >= 2) { - path = args[1]; - List children = zk.getChildren(path, watch, stat); - System.out.println(children); - printStat(stat); - } else if (cmd.equals("getAcl") && args.length >= 2) { - path = args[1]; - acl = zk.getACL(path, stat); - for (ACL a : acl) { - System.out.println(a.getId() + ": " - + getPermString(a.getPerms())); - } - } else if (cmd.equals("setAcl") && args.length >= 3) { - path = args[1]; - stat = zk.setACL(path, parseACLs(args[2]), - args.length > 4 ? Integer.parseInt(args[3]) : -1); - printStat(stat); - } else if (cmd.equals("stat") && args.length >= 2) { - path = args[1]; - stat = zk.exists(path, watch); - if (stat == null) { - throw new KeeperException.NoNodeException(path); - } - printStat(stat); - } else if (cmd.equals("listquota") && args.length >= 2) { - path = args[1]; - String absolutePath = Quotas.quotaZookeeper + path + "/" + Quotas.limitNode; - byte[] data = null; - try { - System.err.println("absolute path is " + absolutePath); - data = zk.getData(absolutePath, false, stat); - StatsTrack st = new StatsTrack(new String(data)); - System.out.println("Output quota for " + path + " " - + st.toString()); - - data = zk.getData(Quotas.quotaZookeeper + path + "/" + - Quotas.statNode, false, stat); - System.out.println("Output stat for " + path + " " + - new StatsTrack(new String(data)).toString()); - } catch(KeeperException.NoNodeException ne) { - System.err.println("quota for " + path + " does not exist."); - } - } else if (cmd.equals("setquota") && args.length >= 4) { - String option = args[1]; - String val = args[2]; - path = args[3]; - System.err.println("Comment: the parts are " + - "option " + option + - " val " + val + - " path " + path); - if ("-b".equals(option)) { - // we are setting the bytes quota - createQuota(zk, path, Long.parseLong(val), -1); - } else if ("-n".equals(option)) { - // we are setting the num quota - createQuota(zk, path, -1L, Integer.parseInt(val)); - } else { - usage(); - } - - } else if (cmd.equals("delquota") && args.length >= 2) { - //if neither option -n or -b is specified, we delete - // the quota node for thsi node. - if (args.length == 3) { - //this time we have an option - String option = args[1]; - path = args[2]; - if ("-b".equals(option)) { - delQuota(zk, path, true, false); - } else if ("-n".equals(option)) { - delQuota(zk, path, false, true); - } - } else if (args.length == 2) { - path = args[1]; - // we dont have an option specified. - // just delete whole quota node - delQuota(zk, path, true, true); - } else if (cmd.equals("help")) { - usage(); - } - } else if (cmd.equals("close")) { - zk.close(); - } else if (cmd.equals("sync") && args.length >= 2) { - path = args[1]; - zk.sync(path, new AsyncCallback.VoidCallback() { public void processResult(int rc, String path, Object ctx) { System.out.println("Sync returned " + rc); } }, null ); - } else if (cmd.equals("addauth") && args.length >=2 ) { - byte[] b = null; - if (args.length >= 3) - b = args[2].getBytes(); - - zk.addAuthInfo(args[1], b); - } else if (!commandMap.containsKey(cmd)) { - usage(); - } - return watch; - } - - private static String getPermString(int perms) { - StringBuilder p = new StringBuilder(); - if ((perms & ZooDefs.Perms.CREATE) != 0) { - p.append('c'); - } - if ((perms & ZooDefs.Perms.DELETE) != 0) { - p.append('d'); - } - if ((perms & ZooDefs.Perms.READ) != 0) { - p.append('r'); - } - if ((perms & ZooDefs.Perms.WRITE) != 0) { - p.append('w'); - } - if ((perms & ZooDefs.Perms.ADMIN) != 0) { - p.append('a'); - } - return p.toString(); - } - - private static List parseACLs(String aclString) { - List acl; - String acls[] = aclString.split(","); - acl = new ArrayList(); - for (String a : acls) { - int firstColon = a.indexOf(':'); - int lastColon = a.lastIndexOf(':'); - if (firstColon == -1 || lastColon == -1 || firstColon == lastColon) { - System.err - .println(a + " does not have the form scheme:id:perm"); - continue; - } - ACL newAcl = new ACL(); - newAcl.setId(new Id(a.substring(0, firstColon), a.substring( - firstColon + 1, lastColon))); - newAcl.setPerms(getPermFromString(a.substring(lastColon + 1))); - acl.add(newAcl); - } - return acl; - } -} diff --git a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/client/ConnectStringParser.java b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/client/ConnectStringParser.java deleted file mode 100644 index ff0425a4e..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/client/ConnectStringParser.java +++ /dev/null @@ -1,87 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you 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. - */ - -package org.apache.zookeeper.client; - -import java.net.InetSocketAddress; -import java.util.ArrayList; - -import org.apache.zookeeper.common.PathUtils; - -/** - * A parser for ZooKeeper Client connect strings. - * - * This class is not meant to be seen or used outside of ZooKeeper itself. - * - * The chrootPath member should be replaced by a Path object in issue - * ZOOKEEPER-849. - * - * @see org.apache.zookeeper.ZooKeeper - */ -public final class ConnectStringParser { - private static final int DEFAULT_PORT = 2181; - - private final String chrootPath; - - private final ArrayList serverAddresses = new ArrayList(); - - /** - * - * @throws IllegalArgumentException - * for an invalid chroot path. - */ - public ConnectStringParser(String connectString) { - // parse out chroot, if any - int off = connectString.indexOf('/'); - if (off >= 0) { - String chrootPath = connectString.substring(off); - // ignore "/" chroot spec, same as null - if (chrootPath.length() == 1) { - this.chrootPath = null; - } else { - PathUtils.validatePath(chrootPath); - this.chrootPath = chrootPath; - } - connectString = connectString.substring(0, off); - } else { - this.chrootPath = null; - } - - String hostsList[] = connectString.split(","); - for (String host : hostsList) { - int port = DEFAULT_PORT; - int pidx = host.lastIndexOf(':'); - if (pidx >= 0) { - // otherwise : is at the end of the string, ignore - if (pidx < host.length() - 1) { - port = Integer.parseInt(host.substring(pidx + 1)); - } - host = host.substring(0, pidx); - } - serverAddresses.add(InetSocketAddress.createUnresolved(host, port)); - } - } - - public String getChrootPath() { - return chrootPath; - } - - public ArrayList getServerAddresses() { - return serverAddresses; - } -} \ No newline at end of file diff --git a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/client/FourLetterWordMain.java b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/client/FourLetterWordMain.java deleted file mode 100644 index e41465ab9..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/client/FourLetterWordMain.java +++ /dev/null @@ -1,79 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you 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. - */ - -package org.apache.zookeeper.client; - -import org.apache.log4j.Logger; - -import java.io.BufferedReader; -import java.io.IOException; -import java.io.InputStreamReader; -import java.io.OutputStream; -import java.net.Socket; - -public class FourLetterWordMain { - protected static final Logger LOG = Logger.getLogger(FourLetterWordMain.class); - - /** - * Send the 4letterword - * @param host the destination host - * @param port the destination port - * @param cmd the 4letterword - * @return server response - * @throws java.io.IOException - */ - public static String send4LetterWord(String host, int port, String cmd) - throws IOException - { - LOG.info("connecting to " + host + " " + port); - Socket sock = new Socket(host, port); - BufferedReader reader = null; - try { - OutputStream outstream = sock.getOutputStream(); - outstream.write(cmd.getBytes()); - outstream.flush(); - // this replicates NC - close the output stream before reading - sock.shutdownOutput(); - - reader = - new BufferedReader( - new InputStreamReader(sock.getInputStream())); - StringBuilder sb = new StringBuilder(); - String line; - while((line = reader.readLine()) != null) { - sb.append(line + "\n"); - } - return sb.toString(); - } finally { - sock.close(); - if (reader != null) { - reader.close(); - } - } - } - - public static void main(String[] args) - throws IOException - { - if (args.length != 3) { - System.out.println("Usage: FourLetterWordMain "); - } else { - System.out.println(send4LetterWord(args[0], Integer.parseInt(args[1]), args[2])); - } - } -} diff --git a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/client/HostProvider.java b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/client/HostProvider.java deleted file mode 100644 index c2815b3e7..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/client/HostProvider.java +++ /dev/null @@ -1,61 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you 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. - */ - -package org.apache.zookeeper.client; - -import java.net.InetSocketAddress; - -/** - * A set of hosts a ZooKeeper client should connect to. - * - * Classes implementing this interface must guarantee the following: - * - * * Every call to next() returns an InetSocketAddress. So the iterator never - * ends. - * - * * The size() of a HostProvider may never be zero. - * - * A HostProvider must return resolved InetSocketAddress instances on next(), - * but it's up to the HostProvider, when it wants to do the resolving. - * - * Different HostProvider could be imagined: - * - * * A HostProvider that loads the list of Hosts from an URL or from DNS - * * A HostProvider that re-resolves the InetSocketAddress after a timeout. - * * A HostProvider that prefers nearby hosts. - */ -public interface HostProvider { - public int size(); - - /** - * The next host to try to connect to. - * - * For a spinDelay of 0 there should be no wait. - * - * @param spinDelay - * Milliseconds to wait if all hosts have been tried once. - */ - public InetSocketAddress next(long spinDelay); - - /** - * Notify the HostProvider of a successful connection. - * - * The HostProvider may use this notification to reset it's inner state. - */ - public void onConnected(); -} diff --git a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/client/StaticHostProvider.java b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/client/StaticHostProvider.java deleted file mode 100644 index e207963fd..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/client/StaticHostProvider.java +++ /dev/null @@ -1,116 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you 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. - */ - -package org.apache.zookeeper.client; - -import java.net.InetAddress; -import java.net.InetSocketAddress; -import java.net.UnknownHostException; -import java.util.ArrayList; -import java.util.Collection; -import java.util.Collections; -import java.util.List; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - - -/** - * Most simple HostProvider, resolves only on instantiation. - * - */ -public final class StaticHostProvider implements HostProvider { - private static final Logger LOG = LoggerFactory - .getLogger(StaticHostProvider.class); - - private final List serverAddresses = new ArrayList( - 5); - - private int lastIndex = -1; - - private int currentIndex = -1; - - /** - * Constructs a SimpleHostSet. - * - * @param serverAddresses - * possibly unresolved ZooKeeper server addresses - * @throws UnknownHostException - * @throws IllegalArgumentException - * if serverAddresses is empty or resolves to an empty list - */ - public StaticHostProvider(Collection serverAddresses) - throws UnknownHostException { - for (InetSocketAddress address : serverAddresses) { - InetAddress ia = address.getAddress(); - InetAddress resolvedAddresses[] = InetAddress.getAllByName((ia!=null) ? ia.getHostAddress(): - address.getHostName()); - for (InetAddress resolvedAddress : resolvedAddresses) { - // If hostName is null but the address is not, we can tell that - // the hostName is an literal IP address. Then we can set the host string as the hostname - // safely to avoid reverse DNS lookup. - // As far as i know, the only way to check if the hostName is null is use toString(). - // Both the two implementations of InetAddress are final class, so we can trust the return value of - // the toString() method. - if (resolvedAddress.toString().startsWith("/") - && resolvedAddress.getAddress() != null) { - this.serverAddresses.add( - new InetSocketAddress(InetAddress.getByAddress( - address.getHostName(), - resolvedAddress.getAddress()), - address.getPort())); - } else { - this.serverAddresses.add(new InetSocketAddress(resolvedAddress.getHostAddress(), address.getPort())); - } - } - } - - if (this.serverAddresses.isEmpty()) { - throw new IllegalArgumentException( - "A HostProvider may not be empty!"); - } - Collections.shuffle(this.serverAddresses); - } - - public int size() { - return serverAddresses.size(); - } - - public InetSocketAddress next(long spinDelay) { - ++currentIndex; - if (currentIndex == serverAddresses.size()) { - currentIndex = 0; - } - if (currentIndex == lastIndex && spinDelay > 0) { - try { - Thread.sleep(spinDelay); - } catch (InterruptedException e) { - LOG.warn("Unexpected exception", e); - } - } else if (lastIndex == -1) { - // We don't want to sleep on the first ever connect attempt. - lastIndex = 0; - } - - return serverAddresses.get(currentIndex); - } - - public void onConnected() { - lastIndex = currentIndex; - } -} diff --git a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/client/ZooKeeperSaslClient.java b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/client/ZooKeeperSaslClient.java deleted file mode 100644 index dbc108019..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/client/ZooKeeperSaslClient.java +++ /dev/null @@ -1,584 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you 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. - */ - -package org.apache.zookeeper.client; - -import java.io.IOException; -import java.security.Principal; -import java.security.PrivilegedActionException; -import java.security.PrivilegedExceptionAction; - -import javax.security.auth.Subject; -import javax.security.auth.callback.Callback; -import javax.security.auth.callback.CallbackHandler; -import javax.security.auth.callback.NameCallback; -import javax.security.auth.callback.PasswordCallback; -import javax.security.auth.callback.UnsupportedCallbackException; -import javax.security.auth.login.AppConfigurationEntry; -import javax.security.auth.login.Configuration; -import javax.security.auth.login.LoginException; -import javax.security.sasl.AuthorizeCallback; -import javax.security.sasl.RealmCallback; -import javax.security.sasl.Sasl; -import javax.security.sasl.SaslClient; -import javax.security.sasl.SaslException; - -import org.apache.zookeeper.AsyncCallback; -import org.apache.zookeeper.ClientCnxn; -import org.apache.zookeeper.Environment; -import org.apache.zookeeper.Login; -import org.apache.zookeeper.Watcher.Event.KeeperState; -import org.apache.zookeeper.ZooDefs; -import org.apache.zookeeper.data.Stat; -import org.apache.zookeeper.proto.GetSASLRequest; -import org.apache.zookeeper.proto.SetSASLResponse; -import org.apache.zookeeper.server.auth.KerberosName; -import org.ietf.jgss.GSSContext; -import org.ietf.jgss.GSSCredential; -import org.ietf.jgss.GSSException; -import org.ietf.jgss.GSSManager; -import org.ietf.jgss.Oid; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -/** - * This class manages SASL authentication for the client. It - * allows ClientCnxn to authenticate using SASL with a Zookeeper server. - */ -public class ZooKeeperSaslClient { - public static final String LOGIN_CONTEXT_NAME_KEY = "zookeeper.sasl.clientconfig"; - public static final String ENABLE_CLIENT_SASL_KEY = "zookeeper.sasl.client"; - public static final String ENABLE_CLIENT_SASL_DEFAULT = "true"; - - /** - * Returns true if the SASL client is enabled. By default, the client - * is enabled but can be disabled by setting the system property - * zookeeper.sasl.client to false. See - * ZOOKEEPER-1657 for more information. - * - * @return If the SASL client is enabled. - */ - public static boolean isEnabled() { - return Boolean.valueOf(System.getProperty(ENABLE_CLIENT_SASL_KEY, ENABLE_CLIENT_SASL_DEFAULT)); - } - - private static final Logger LOG = LoggerFactory.getLogger(ZooKeeperSaslClient.class); - private static Login login = null; - private SaslClient saslClient; - private boolean isSASLConfigured = true; - - private byte[] saslToken = new byte[0]; - - public enum SaslState { - INITIAL,INTERMEDIATE,COMPLETE,FAILED - } - - private SaslState saslState = SaslState.INITIAL; - - private boolean gotLastPacket = false; - /** informational message indicating the current configuration status */ - private final String configStatus; - - public SaslState getSaslState() { - return saslState; - } - - public String getLoginContext() { - if (login != null) - return login.getLoginContextName(); - return null; - } - - public ZooKeeperSaslClient(final String serverPrincipal) - throws LoginException { - /** - * ZOOKEEPER-1373: allow system property to specify the JAAS - * configuration section that the zookeeper client should use. - * Default to "Client". - */ - String clientSection = System.getProperty(ZooKeeperSaslClient.LOGIN_CONTEXT_NAME_KEY, "Client"); - // Note that 'Configuration' here refers to javax.security.auth.login.Configuration. - AppConfigurationEntry entries[] = null; - RuntimeException runtimeException = null; - try { - entries = Configuration.getConfiguration().getAppConfigurationEntry(clientSection); - } catch (SecurityException e) { - // handle below: might be harmless if the user doesn't intend to use JAAS authentication. - runtimeException = e; - } catch (IllegalArgumentException e) { - // third party customized getAppConfigurationEntry could throw IllegalArgumentException when JAAS - // configuration isn't set. We can reevaluate whether to catch RuntimeException instead when more - // different types of RuntimeException found - runtimeException = e; - } - if (entries != null) { - this.configStatus = "Will attempt to SASL-authenticate using Login Context section '" + clientSection + "'"; - this.saslClient = createSaslClient(serverPrincipal, clientSection); - } else { - // Handle situation of clientSection's being null: it might simply because the client does not intend to - // use SASL, so not necessarily an error. - saslState = SaslState.FAILED; - String explicitClientSection = System.getProperty(ZooKeeperSaslClient.LOGIN_CONTEXT_NAME_KEY); - if (explicitClientSection != null) { - // If the user explicitly overrides the default Login Context, they probably expected SASL to - // succeed. But if we got here, SASL failed. - if (runtimeException != null) { - throw new LoginException("Zookeeper client cannot authenticate using the " + explicitClientSection + - " section of the supplied JAAS configuration: '" + - System.getProperty(Environment.JAAS_CONF_KEY) + "' because of a " + - "RuntimeException: " + runtimeException); - } else { - throw new LoginException("Client cannot SASL-authenticate because the specified JAAS configuration " + - "section '" + explicitClientSection + "' could not be found."); - } - } else { - // The user did not override the default context. It might be that they just don't intend to use SASL, - // so log at INFO, not WARN, since they don't expect any SASL-related information. - String msg = "Will not attempt to authenticate using SASL "; - if (runtimeException != null) { - msg += "(" + runtimeException + ")"; - } else { - msg += "(unknown error)"; - } - this.configStatus = msg; - this.isSASLConfigured = false; - } - if (System.getProperty(Environment.JAAS_CONF_KEY) != null) { - // Again, the user explicitly set something SASL-related, so they probably expected SASL to succeed. - if (runtimeException != null) { - throw new LoginException("Zookeeper client cannot authenticate using the '" + - System.getProperty(ZooKeeperSaslClient.LOGIN_CONTEXT_NAME_KEY, "Client") + - "' section of the supplied JAAS configuration: '" + - System.getProperty(Environment.JAAS_CONF_KEY) + "' because of a " + - "RuntimeException: " + runtimeException); - } else { - throw new LoginException("No JAAS configuration section named '" + - System.getProperty(ZooKeeperSaslClient.LOGIN_CONTEXT_NAME_KEY, "Client") + - "' was found in specified JAAS configuration file: '" + - System.getProperty(Environment.JAAS_CONF_KEY) + "'."); - } - } - } - } - - /** - * @return informational message indicating the current configuration status. - */ - public String getConfigStatus() { - return configStatus; - } - - public boolean isComplete() { - return (saslState == SaslState.COMPLETE); - } - - public boolean isFailed() { - return (saslState == SaslState.FAILED); - } - - public static class ServerSaslResponseCallback implements AsyncCallback.DataCallback { - public void processResult(int rc, String path, Object ctx, byte data[], Stat stat) { - // processResult() is used by ClientCnxn's sendThread to respond to - // data[] contains the Zookeeper Server's SASL token. - // ctx is the ZooKeeperSaslClient object. We use this object's respondToServer() method - // to reply to the Zookeeper Server's SASL token - ZooKeeperSaslClient client = ((ClientCnxn)ctx).zooKeeperSaslClient; - if (client == null) { - LOG.warn("sasl client was unexpectedly null: cannot respond to Zookeeper server."); - return; - } - byte[] usedata = data; - if (data != null) { - LOG.debug("ServerSaslResponseCallback(): saslToken server response: (length="+usedata.length+")"); - } - else { - usedata = new byte[0]; - LOG.debug("ServerSaslResponseCallback(): using empty data[] as server response (length="+usedata.length+")"); - } - client.respondToServer(usedata, (ClientCnxn)ctx); - } - } - - synchronized private SaslClient createSaslClient(final String servicePrincipal, - final String loginContext) throws LoginException { - try { - if (login == null) { - if (LOG.isDebugEnabled()) { - LOG.debug("JAAS loginContext is: " + loginContext); - } - // note that the login object is static: it's shared amongst all zookeeper-related connections. - // createSaslClient() must be declared synchronized so that login is initialized only once. - login = new Login(loginContext, new ClientCallbackHandler(null)); - login.startThreadIfNeeded(); - } - Subject subject = login.getSubject(); - SaslClient saslClient; - // Use subject.getPrincipals().isEmpty() as an indication of which SASL mechanism to use: - // if empty, use DIGEST-MD5; otherwise, use GSSAPI. - if (subject.getPrincipals().isEmpty()) { - // no principals: must not be GSSAPI: use DIGEST-MD5 mechanism instead. - LOG.info("Client will use DIGEST-MD5 as SASL mechanism."); - String[] mechs = {"DIGEST-MD5"}; - String username = (String)(subject.getPublicCredentials().toArray()[0]); - String password = (String)(subject.getPrivateCredentials().toArray()[0]); - // "zk-sasl-md5" is a hard-wired 'domain' parameter shared with zookeeper server code (see ServerCnxnFactory.java) - saslClient = Sasl.createSaslClient(mechs, username, "zookeeper", "zk-sasl-md5", null, new ClientCallbackHandler(password)); - return saslClient; - } - else { // GSSAPI. - boolean usingNativeJgss = - Boolean.getBoolean("sun.security.jgss.native"); - if (usingNativeJgss) { - // http://docs.oracle.com/javase/6/docs/technotes/guides/security/jgss/jgss-features.html - // """ - // In addition, when performing operations as a particular - // Subject, e.g. Subject.doAs(...) or Subject.doAsPrivileged(...), - // the to-be-used GSSCredential should be added to Subject's - // private credential set. Otherwise, the GSS operations will - // fail since no credential is found. - // """ - try { - GSSManager manager = GSSManager.getInstance(); - Oid krb5Mechanism = new Oid("1.2.840.113554.1.2.2"); - GSSCredential cred = manager.createCredential(null, - GSSContext.DEFAULT_LIFETIME, - krb5Mechanism, - GSSCredential.INITIATE_ONLY); - subject.getPrivateCredentials().add(cred); - if (LOG.isDebugEnabled()) { - LOG.debug("Added private credential to subject: " + cred); - } - } catch (GSSException ex) { - LOG.warn("Cannot add private credential to subject; " + - "authentication at the server may fail", ex); - } - } - final Object[] principals = subject.getPrincipals().toArray(); - // determine client principal from subject. - final Principal clientPrincipal = (Principal)principals[0]; - final KerberosName clientKerberosName = new KerberosName(clientPrincipal.getName()); - // assume that server and client are in the same realm (by default; unless the system property - // "zookeeper.server.realm" is set). - String serverRealm = System.getProperty("zookeeper.server.realm",clientKerberosName.getRealm()); - KerberosName serviceKerberosName = new KerberosName(servicePrincipal+"@"+serverRealm); - final String serviceName = serviceKerberosName.getServiceName(); - final String serviceHostname = serviceKerberosName.getHostName(); - final String clientPrincipalName = clientKerberosName.toString(); - try { - saslClient = Subject.doAs(subject,new PrivilegedExceptionAction() { - public SaslClient run() throws SaslException { - LOG.info("Client will use GSSAPI as SASL mechanism."); - String[] mechs = {"GSSAPI"}; - LOG.debug("creating sasl client: client="+clientPrincipalName+";service="+serviceName+";serviceHostname="+serviceHostname); - SaslClient saslClient = Sasl.createSaslClient(mechs,clientPrincipalName,serviceName,serviceHostname,null,new ClientCallbackHandler(null)); - return saslClient; - } - }); - return saslClient; - } - catch (Exception e) { - LOG.error("Exception while trying to create SASL client", e); - e.printStackTrace(); - return null; - } - } - } catch (LoginException e) { - // We throw LoginExceptions... - throw e; - } catch (Exception e) { - // ..but consume (with a log message) all other types of exceptions. - LOG.error("Exception while trying to create SASL client: " + e); - return null; - } - } - - public void respondToServer(byte[] serverToken, ClientCnxn cnxn) { - if (saslClient == null) { - LOG.error("saslClient is unexpectedly null. Cannot respond to server's SASL message; ignoring."); - return; - } - - if (!(saslClient.isComplete())) { - try { - saslToken = createSaslToken(serverToken); - if (saslToken != null) { - sendSaslPacket(saslToken, cnxn); - } - } catch (SaslException e) { - LOG.error("SASL authentication failed using login context '" + - this.getLoginContext() + "'."); - saslState = SaslState.FAILED; - gotLastPacket = true; - } - } - - if (saslClient.isComplete()) { - // GSSAPI: server sends a final packet after authentication succeeds - // or fails. - if ((serverToken == null) && (saslClient.getMechanismName().equals("GSSAPI"))) - gotLastPacket = true; - // non-GSSAPI: no final packet from server. - if (!saslClient.getMechanismName().equals("GSSAPI")) { - gotLastPacket = true; - } - // SASL authentication is completed, successfully or not: - // enable the socket's writable flag so that any packets waiting for authentication to complete in - // the outgoing queue will be sent to the Zookeeper server. - cnxn.enableWrite(); - } - } - - private byte[] createSaslToken() throws SaslException { - saslState = SaslState.INTERMEDIATE; - return createSaslToken(saslToken); - } - - private byte[] createSaslToken(final byte[] saslToken) throws SaslException { - if (saslToken == null) { - // TODO: introspect about runtime environment (such as jaas.conf) - saslState = SaslState.FAILED; - throw new SaslException("Error in authenticating with a Zookeeper Quorum member: the quorum member's saslToken is null."); - } - - Subject subject = login.getSubject(); - if (subject != null) { - synchronized(login) { - try { - final byte[] retval = - Subject.doAs(subject, new PrivilegedExceptionAction() { - public byte[] run() throws SaslException { - LOG.debug("saslClient.evaluateChallenge(len="+saslToken.length+")"); - return saslClient.evaluateChallenge(saslToken); - } - }); - return retval; - } - catch (PrivilegedActionException e) { - String error = "An error: (" + e + ") occurred when evaluating Zookeeper Quorum Member's " + - " received SASL token."; - // Try to provide hints to use about what went wrong so they can fix their configuration. - // TODO: introspect about e: look for GSS information. - final String UNKNOWN_SERVER_ERROR_TEXT = - "(Mechanism level: Server not found in Kerberos database (7) - UNKNOWN_SERVER)"; - if (e.toString().indexOf(UNKNOWN_SERVER_ERROR_TEXT) > -1) { - error += " This may be caused by Java's being unable to resolve the Zookeeper Quorum Member's" + - " hostname correctly. You may want to try to adding" + - " '-Dsun.net.spi.nameservice.provider.1=dns,sun' to your client's JVMFLAGS environment."; - } - error += " Zookeeper Client will go to AUTH_FAILED state."; - LOG.error(error); - saslState = SaslState.FAILED; - throw new SaslException(error); - } - } - } - else { - throw new SaslException("Cannot make SASL token without subject defined. " + - "For diagnosis, please look for WARNs and ERRORs in your log related to the Login class."); - } - } - - private void sendSaslPacket(byte[] saslToken, ClientCnxn cnxn) - throws SaslException{ - if (LOG.isDebugEnabled()) { - LOG.debug("ClientCnxn:sendSaslPacket:length="+saslToken.length); - } - - GetSASLRequest request = new GetSASLRequest(); - request.setToken(saslToken); - SetSASLResponse response = new SetSASLResponse(); - ServerSaslResponseCallback cb = new ServerSaslResponseCallback(); - - try { - cnxn.sendPacket(request,response,cb, ZooDefs.OpCode.sasl); - } catch (IOException e) { - throw new SaslException("Failed to send SASL packet to server.", - e); - } - } - - private void sendSaslPacket(ClientCnxn cnxn) throws SaslException { - if (LOG.isDebugEnabled()) { - LOG.debug("ClientCnxn:sendSaslPacket:length="+saslToken.length); - } - GetSASLRequest request = new GetSASLRequest(); - request.setToken(createSaslToken()); - SetSASLResponse response = new SetSASLResponse(); - ServerSaslResponseCallback cb = new ServerSaslResponseCallback(); - try { - cnxn.sendPacket(request,response,cb, ZooDefs.OpCode.sasl); - } catch (IOException e) { - throw new SaslException("Failed to send SASL packet to server due " + - "to IOException:", e); - } - } - - // used by ClientCnxn to know whether to emit a SASL-related event: either AuthFailed or SaslAuthenticated, - // or none, if not ready yet. Sets saslState to COMPLETE as a side-effect. - public KeeperState getKeeperState() { - if (saslClient != null) { - if (saslState == SaslState.FAILED) { - return KeeperState.AuthFailed; - } - if (saslClient.isComplete()) { - if (saslState == SaslState.INTERMEDIATE) { - saslState = SaslState.COMPLETE; - return KeeperState.SaslAuthenticated; - } - } - } - // No event ready to emit yet. - return null; - } - - // Initialize the client's communications with the Zookeeper server by sending the server the first - // authentication packet. - public void initialize(ClientCnxn cnxn) throws SaslException { - if (saslClient == null) { - saslState = SaslState.FAILED; - throw new SaslException("saslClient failed to initialize properly: it's null."); - } - if (saslState == SaslState.INITIAL) { - if (saslClient.hasInitialResponse()) { - sendSaslPacket(cnxn); - } - else { - byte[] emptyToken = new byte[0]; - sendSaslPacket(emptyToken, cnxn); - } - saslState = SaslState.INTERMEDIATE; - } - } - - // The CallbackHandler interface here refers to - // javax.security.auth.callback.CallbackHandler. - // It should not be confused with Zookeeper packet callbacks like - // org.apache.zookeeper.server.auth.SaslServerCallbackHandler. - public static class ClientCallbackHandler implements CallbackHandler { - private String password = null; - - public ClientCallbackHandler(String password) { - this.password = password; - } - - public void handle(Callback[] callbacks) throws - UnsupportedCallbackException { - for (Callback callback : callbacks) { - if (callback instanceof NameCallback) { - NameCallback nc = (NameCallback) callback; - nc.setName(nc.getDefaultName()); - } - else { - if (callback instanceof PasswordCallback) { - PasswordCallback pc = (PasswordCallback)callback; - if (password != null) { - pc.setPassword(this.password.toCharArray()); - } else { - LOG.warn("Could not login: the client is being asked for a password, but the Zookeeper" + - " client code does not currently support obtaining a password from the user." + - " Make sure that the client is configured to use a ticket cache (using" + - " the JAAS configuration setting 'useTicketCache=true)' and restart the client. If" + - " you still get this message after that, the TGT in the ticket cache has expired and must" + - " be manually refreshed. To do so, first determine if you are using a password or a" + - " keytab. If the former, run kinit in a Unix shell in the environment of the user who" + - " is running this Zookeeper client using the command" + - " 'kinit ' (where is the name of the client's Kerberos principal)." + - " If the latter, do" + - " 'kinit -k -t ' (where is the name of the Kerberos principal, and" + - " is the location of the keytab file). After manually refreshing your cache," + - " restart this client. If you continue to see this message after manually refreshing" + - " your cache, ensure that your KDC host's clock is in sync with this host's clock."); - } - } - else { - if (callback instanceof RealmCallback) { - RealmCallback rc = (RealmCallback) callback; - rc.setText(rc.getDefaultText()); - } - else { - if (callback instanceof AuthorizeCallback) { - AuthorizeCallback ac = (AuthorizeCallback) callback; - String authid = ac.getAuthenticationID(); - String authzid = ac.getAuthorizationID(); - if (authid.equals(authzid)) { - ac.setAuthorized(true); - } else { - ac.setAuthorized(false); - } - if (ac.isAuthorized()) { - ac.setAuthorizedID(authzid); - } - } - else { - throw new UnsupportedCallbackException(callback,"Unrecognized SASL ClientCallback"); - } - } - } - } - } - } - } - - public boolean clientTunneledAuthenticationInProgress() { - if (!isSASLConfigured) { - return false; - } - // TODO: Rather than checking a disjunction here, should be a single member - // variable or method in this class to determine whether the client is - // configured to use SASL. (see also ZOOKEEPER-1455). - try { - if ((System.getProperty(Environment.JAAS_CONF_KEY) != null) || - ((javax.security.auth.login.Configuration.getConfiguration() != null) && - (javax.security.auth.login.Configuration.getConfiguration(). - getAppConfigurationEntry(System. - getProperty(ZooKeeperSaslClient.LOGIN_CONTEXT_NAME_KEY,"Client")) - != null))) { - // Client is configured to use a valid login Configuration, so - // authentication is either in progress, successful, or failed. - - // 1. Authentication hasn't finished yet: we must wait for it to do so. - if ((isComplete() == false) && - (isFailed() == false)) { - return true; - } - - // 2. SASL authentication has succeeded or failed.. - if (isComplete() || isFailed()) { - if (gotLastPacket == false) { - // ..but still in progress, because there is a final SASL - // message from server which must be received. - return true; - } - } - } - // Either client is not configured to use a tunnelled authentication - // scheme, or tunnelled authentication has completed (successfully or - // not), and all server SASL messages have been received. - return false; - } catch (SecurityException e) { - // Thrown if the caller does not have permission to retrieve the Configuration. - // In this case, simply returning false is correct. - if (LOG.isDebugEnabled() == true) { - LOG.debug("Could not retrieve login configuration: " + e); - } - return false; - } - } - - -} diff --git a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/common/AtomicFileOutputStream.java b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/common/AtomicFileOutputStream.java deleted file mode 100644 index ecfcad7c4..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/common/AtomicFileOutputStream.java +++ /dev/null @@ -1,115 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you 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. - */ -package org.apache.zookeeper.common; - -import java.io.File; -import java.io.FileNotFoundException; -import java.io.FileOutputStream; -import java.io.FilterOutputStream; -import java.io.IOException; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -/* - * This code is originally from HDFS, see the similarly named files there - * in case of bug fixing, history, etc... - */ - -/** - * A FileOutputStream that has the property that it will only show up at its - * destination once it has been entirely written and flushed to disk. While - * being written, it will use a .tmp suffix. - * - * When the output stream is closed, it is flushed, fsynced, and will be moved - * into place, overwriting any file that already exists at that location. - * - * NOTE: on Windows platforms, it will not atomically replace the target - * file - instead the target file is deleted before this one is moved into - * place. - */ -public class AtomicFileOutputStream extends FilterOutputStream { - private static final String TMP_EXTENSION = ".tmp"; - - private final static Logger LOG = LoggerFactory - .getLogger(AtomicFileOutputStream.class); - - private final File origFile; - private final File tmpFile; - - public AtomicFileOutputStream(File f) throws FileNotFoundException { - // Code unfortunately must be duplicated below since we can't assign - // anything - // before calling super - super(new FileOutputStream(new File(f.getParentFile(), f.getName() - + TMP_EXTENSION))); - origFile = f.getAbsoluteFile(); - tmpFile = new File(f.getParentFile(), f.getName() + TMP_EXTENSION) - .getAbsoluteFile(); - } - - @Override - public void close() throws IOException { - boolean triedToClose = false, success = false; - try { - flush(); - ((FileOutputStream) out).getChannel().force(true); - - triedToClose = true; - super.close(); - success = true; - } finally { - if (success) { - boolean renamed = tmpFile.renameTo(origFile); - if (!renamed) { - // On windows, renameTo does not replace. - if (!origFile.delete() || !tmpFile.renameTo(origFile)) { - throw new IOException( - "Could not rename temporary file " + tmpFile - + " to " + origFile); - } - } - } else { - if (!triedToClose) { - // If we failed when flushing, try to close it to not leak - // an FD - IOUtils.closeStream(out); - } - // close wasn't successful, try to delete the tmp file - if (!tmpFile.delete()) { - LOG.warn("Unable to delete tmp file " + tmpFile); - } - } - } - } - - /** - * Close the atomic file, but do not "commit" the temporary file on top of - * the destination. This should be used if there is a failure in writing. - */ - public void abort() { - try { - super.close(); - } catch (IOException ioe) { - LOG.warn("Unable to abort file " + tmpFile, ioe); - } - if (!tmpFile.delete()) { - LOG.warn("Unable to delete tmp file during abort " + tmpFile); - } - } -} diff --git a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/common/IOUtils.java b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/common/IOUtils.java deleted file mode 100644 index 16aea4ea4..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/common/IOUtils.java +++ /dev/null @@ -1,123 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you 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. - */ -package org.apache.zookeeper.common; - -import java.io.Closeable; -import java.io.IOException; -import java.io.InputStream; -import java.io.OutputStream; -import java.io.PrintStream; - -import org.slf4j.Logger; - -/* - * This code is originally from HDFS, see the similarly named files there - * in case of bug fixing, history, etc... - */ - -public class IOUtils { - /** - * Closes the stream ignoring {@link IOException}. Must only be called in - * cleaning up from exception handlers. - * - * @param stream - * the Stream to close - */ - public static void closeStream(Closeable stream) { - cleanup(null, stream); - } - - /** - * Close the Closeable objects and ignore any {@link IOException} or - * null pointers. Must only be used for cleanup in exception handlers. - * - * @param log - * the log to record problems to at debug level. Can be null. - * @param closeables - * the objects to close - */ - public static void cleanup(Logger log, Closeable... closeables) { - for (Closeable c : closeables) { - if (c != null) { - try { - c.close(); - } catch (IOException e) { - if (log != null) { - log.warn("Exception in closing " + c, e); - } - } - } - } - } - - /** - * Copies from one stream to another. - * - * @param in - * InputStrem to read from - * @param out - * OutputStream to write to - * @param buffSize - * the size of the buffer - * @param close - * whether or not close the InputStream and OutputStream at the - * end. The streams are closed in the finally clause. - */ - public static void copyBytes(InputStream in, OutputStream out, - int buffSize, boolean close) throws IOException { - try { - copyBytes(in, out, buffSize); - if (close) { - out.close(); - out = null; - in.close(); - in = null; - } - } finally { - if (close) { - closeStream(out); - closeStream(in); - } - } - } - - /** - * Copies from one stream to another. - * - * @param in - * InputStrem to read from - * @param out - * OutputStream to write to - * @param buffSize - * the size of the buffer - */ - public static void copyBytes(InputStream in, OutputStream out, int buffSize) - throws IOException { - PrintStream ps = out instanceof PrintStream ? (PrintStream) out : null; - byte buf[] = new byte[buffSize]; - int bytesRead = in.read(buf); - while (bytesRead >= 0) { - out.write(buf, 0, bytesRead); - if ((ps != null) && ps.checkError()) { - throw new IOException("Unable to write to output stream."); - } - bytesRead = in.read(buf); - } - } - -} diff --git a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/common/PathTrie.java b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/common/PathTrie.java deleted file mode 100644 index 73053e02c..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/common/PathTrie.java +++ /dev/null @@ -1,293 +0,0 @@ - /** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you 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. - */ - -package org.apache.zookeeper.common; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -/** - * a class that implements prefix matching for - * components of a filesystem path. the trie - * looks like a tree with edges mapping to - * the component of a path. - * example /ab/bc/cf would map to a trie - * / - * ab/ - * (ab) - * bc/ - * / - * (bc) - * cf/ - * (cf) - */ -public class PathTrie { - /** - * the logger for this class - */ - private static final Logger LOG = LoggerFactory.getLogger(PathTrie.class); - - /** - * the root node of PathTrie - */ - private final TrieNode rootNode ; - - static class TrieNode { - boolean property = false; - final HashMap children; - TrieNode parent = null; - /** - * create a trienode with parent - * as parameter - * @param parent the parent of this trienode - */ - private TrieNode(TrieNode parent) { - children = new HashMap(); - this.parent = parent; - } - - /** - * get the parent of this node - * @return the parent node - */ - TrieNode getParent() { - return this.parent; - } - - /** - * set the parent of this node - * @param parent the parent to set to - */ - void setParent(TrieNode parent) { - this.parent = parent; - } - - /** - * a property that is set - * for a node - making it - * special. - */ - void setProperty(boolean prop) { - this.property = prop; - } - - /** the property of this - * node - * @return the property for this - * node - */ - boolean getProperty() { - return this.property; - } - /** - * add a child to the existing node - * @param childName the string name of the child - * @param node the node that is the child - */ - void addChild(String childName, TrieNode node) { - synchronized(children) { - if (children.containsKey(childName)) { - return; - } - children.put(childName, node); - } - } - - /** - * delete child from this node - * @param childName the string name of the child to - * be deleted - */ - void deleteChild(String childName) { - synchronized(children) { - if (!children.containsKey(childName)) { - return; - } - TrieNode childNode = children.get(childName); - // this is the only child node. - if (childNode.getChildren().length == 1) { - childNode.setParent(null); - children.remove(childName); - } - else { - // their are more child nodes - // so just reset property. - childNode.setProperty(false); - } - } - } - - /** - * return the child of a node mapping - * to the input childname - * @param childName the name of the child - * @return the child of a node - */ - TrieNode getChild(String childName) { - synchronized(children) { - if (!children.containsKey(childName)) { - return null; - } - else { - return children.get(childName); - } - } - } - - /** - * get the list of children of this - * trienode. - * @param node to get its children - * @return the string list of its children - */ - String[] getChildren() { - synchronized(children) { - return children.keySet().toArray(new String[0]); - } - } - - /** - * get the string representation - * for this node - */ - public String toString() { - StringBuilder sb = new StringBuilder(); - sb.append("Children of trienode: "); - synchronized(children) { - for (String str: children.keySet()) { - sb.append(" " + str); - } - } - return sb.toString(); - } - } - - /** - * construct a new PathTrie with - * a root node of / - */ - public PathTrie() { - this.rootNode = new TrieNode(null); - } - - /** - * add a path to the path trie - * @param path - */ - public void addPath(String path) { - if (path == null) { - return; - } - String[] pathComponents = path.split("/"); - TrieNode parent = rootNode; - String part = null; - if (pathComponents.length <= 1) { - throw new IllegalArgumentException("Invalid path " + path); - } - for (int i=1; i components = new ArrayList(); - if (pathComponents.length <= 1) { - throw new IllegalArgumentException("Invalid path " + path); - } - int i = 1; - String part = null; - StringBuilder sb = new StringBuilder(); - int lastindex = -1; - while((i < pathComponents.length)) { - if (parent.getChild(pathComponents[i]) != null) { - part = pathComponents[i]; - parent = parent.getChild(part); - components.add(part); - if (parent.getProperty()) { - lastindex = i-1; - } - } - else { - break; - } - i++; - } - for (int j=0; j< (lastindex+1); j++) { - sb.append("/" + components.get(j)); - } - return sb.toString(); - } - - /** - * clear all nodes - */ - public void clear() { - for(String child : rootNode.getChildren()) { - rootNode.deleteChild(child); - } - } -} diff --git a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/common/PathUtils.java b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/common/PathUtils.java deleted file mode 100644 index 12a68142b..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/common/PathUtils.java +++ /dev/null @@ -1,103 +0,0 @@ - /** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you 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. - */ - -package org.apache.zookeeper.common; - - -/** - * Path related utilities - */ -public class PathUtils { - - /** validate the provided znode path string - * @param path znode path string - * @param isSequential if the path is being created - * with a sequential flag - * @throws IllegalArgumentException if the path is invalid - */ - public static void validatePath(String path, boolean isSequential) - throws IllegalArgumentException { - validatePath(isSequential? path + "1": path); - } - - /** - * Validate the provided znode path string - * @param path znode path string - * @throws IllegalArgumentException if the path is invalid - */ - public static void validatePath(String path) throws IllegalArgumentException { - if (path == null) { - throw new IllegalArgumentException("Path cannot be null"); - } - if (path.length() == 0) { - throw new IllegalArgumentException("Path length must be > 0"); - } - if (path.charAt(0) != '/') { - throw new IllegalArgumentException( - "Path must start with / character"); - } - if (path.length() == 1) { // done checking - it's the root - return; - } - if (path.charAt(path.length() - 1) == '/') { - throw new IllegalArgumentException( - "Path must not end with / character"); - } - - String reason = null; - char lastc = '/'; - char chars[] = path.toCharArray(); - char c; - for (int i = 1; i < chars.length; lastc = chars[i], i++) { - c = chars[i]; - - if (c == 0) { - reason = "null character not allowed @" + i; - break; - } else if (c == '/' && lastc == '/') { - reason = "empty node name specified @" + i; - break; - } else if (c == '.' && lastc == '.') { - if (chars[i-2] == '/' && - ((i + 1 == chars.length) - || chars[i+1] == '/')) { - reason = "relative paths not allowed @" + i; - break; - } - } else if (c == '.') { - if (chars[i-1] == '/' && - ((i + 1 == chars.length) - || chars[i+1] == '/')) { - reason = "relative paths not allowed @" + i; - break; - } - } else if (c > '\u0000' && c < '\u001f' - || c > '\u007f' && c < '\u009F' - || c > '\ud800' && c < '\uf8ff' - || c > '\ufff0' && c < '\uffff') { - reason = "invalid charater @" + i; - break; - } - } - - if (reason != null) { - throw new IllegalArgumentException( - "Invalid path string \"" + path + "\" caused by " + reason); - } - } -} diff --git a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/jmx/CommonNames.java b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/jmx/CommonNames.java deleted file mode 100644 index 986d69dd7..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/jmx/CommonNames.java +++ /dev/null @@ -1,29 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you 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. - */ - -package org.apache.zookeeper.jmx; - -/** - * A bunch of constants. - * TODO: will get rid of it eventually. - */ -public class CommonNames { - public static final String DOMAIN="org.apache.ZooKeeperService"; - public static final String DATA_TREE_KEY="DataTree"; - public static final String STANDALONE_SERVER_KEY="StandaloneServer"; -} diff --git a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/jmx/MBeanRegistry.java b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/jmx/MBeanRegistry.java deleted file mode 100644 index 895b81864..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/jmx/MBeanRegistry.java +++ /dev/null @@ -1,215 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you 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. - */ - -package org.apache.zookeeper.jmx; - -import java.lang.management.ManagementFactory; -import java.util.Map; -import java.util.concurrent.ConcurrentHashMap; - -import javax.management.JMException; -import javax.management.MBeanServer; -import javax.management.MBeanServerFactory; -import javax.management.MalformedObjectNameException; -import javax.management.ObjectName; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -/** - * This class provides a unified interface for registering/unregistering of - * zookeeper MBeans with the platform MBean server. It builds a hierarchy of MBeans - * where each MBean represented by a filesystem-like path. Eventually, this hierarchy - * will be stored in the zookeeper data tree instance as a virtual data tree. - */ -public class MBeanRegistry { - private static final Logger LOG = LoggerFactory.getLogger(MBeanRegistry.class); - - private static MBeanRegistry instance = new MBeanRegistry(); - - private Map mapBean2Path = - new ConcurrentHashMap(); - - private Map mapName2Bean = - new ConcurrentHashMap(); - - private MBeanServer mBeanServer; - - public static MBeanRegistry getInstance() { - return instance; - } - - public MBeanRegistry () { - try { - mBeanServer = ManagementFactory.getPlatformMBeanServer(); - } catch (Error e) { - // Account for running within IKVM and create a new MBeanServer - // if the PlatformMBeanServer does not exist. - mBeanServer = MBeanServerFactory.createMBeanServer(); - } - } - - /** - * Return the underlying MBeanServer that is being - * used to register MBean's. The returned MBeanServer - * may be a new empty MBeanServer if running through IKVM. - */ - public MBeanServer getPlatformMBeanServer() { - return mBeanServer; - } - - /** - * Registers a new MBean with the platform MBean server. - * @param bean the bean being registered - * @param parent if not null, the new bean will be registered as a child - * node of this parent. - */ - public void register(ZKMBeanInfo bean, ZKMBeanInfo parent) - throws JMException - { - assert bean != null; - String path = null; - if (parent != null) { - path = mapBean2Path.get(parent); - assert path != null; - } - path = makeFullPath(path, parent); - if(bean.isHidden()) - return; - ObjectName oname = makeObjectName(path, bean); - try { - mBeanServer.registerMBean(bean, oname); - mapBean2Path.put(bean, path); - mapName2Bean.put(bean.getName(), bean); - } catch (JMException e) { - LOG.warn("Failed to register MBean " + bean.getName()); - throw e; - } - } - - /** - * Unregister the MBean identified by the path. - * @param path - * @param bean - */ - private void unregister(String path,ZKMBeanInfo bean) throws JMException { - if(path==null) - return; - if (!bean.isHidden()) { - try { - mBeanServer.unregisterMBean(makeObjectName(path, bean)); - } catch (JMException e) { - LOG.warn("Failed to unregister MBean " + bean.getName()); - throw e; - } - } - } - - /** - * Unregister MBean. - * @param bean - */ - public void unregister(ZKMBeanInfo bean) { - if(bean==null) - return; - String path=mapBean2Path.get(bean); - try { - unregister(path,bean); - } catch (JMException e) { - LOG.warn("Error during unregister", e); - } - mapBean2Path.remove(bean); - mapName2Bean.remove(bean.getName()); - } - /** - * Unregister all currently registered MBeans - */ - public void unregisterAll() { - for(Map.Entry e: mapBean2Path.entrySet()) { - try { - unregister(e.getValue(), e.getKey()); - } catch (JMException e1) { - LOG.warn("Error during unregister", e1); - } - } - mapBean2Path.clear(); - mapName2Bean.clear(); - } - /** - * Generate a filesystem-like path. - * @param prefix path prefix - * @param name path elements - * @return absolute path - */ - public String makeFullPath(String prefix, String... name) { - StringBuilder sb=new StringBuilder(prefix == null ? "/" : (prefix.equals("/")?prefix:prefix+"/")); - boolean first=true; - for (String s : name) { - if(s==null) continue; - if(!first){ - sb.append("/"); - }else - first=false; - sb.append(s); - } - return sb.toString(); - } - - protected String makeFullPath(String prefix, ZKMBeanInfo bean) { - return makeFullPath(prefix, bean == null ? null : bean.getName()); - } - - /** - * This takes a path, such as /a/b/c, and converts it to - * name0=a,name1=b,name2=c - */ - private int tokenize(StringBuilder sb, String path, int index){ - String[] tokens = path.split("/"); - for (String s: tokens) { - if (s.length()==0) - continue; - sb.append("name").append(index++) - .append("=").append(s).append(","); - } - return index; - } - /** - * Builds an MBean path and creates an ObjectName instance using the path. - * @param path MBean path - * @param bean the MBean instance - * @return ObjectName to be registered with the platform MBean server - */ - protected ObjectName makeObjectName(String path, ZKMBeanInfo bean) - throws MalformedObjectNameException - { - if(path==null) - return null; - StringBuilder beanName = new StringBuilder(CommonNames.DOMAIN + ":"); - int counter=0; - counter=tokenize(beanName,path,counter); - tokenize(beanName,bean.getName(),counter); - beanName.deleteCharAt(beanName.length()-1); - try { - return new ObjectName(beanName.toString()); - } catch (MalformedObjectNameException e) { - LOG.warn("Invalid name \"" + beanName.toString() + "\" for class " - + bean.getClass().toString()); - throw e; - } - } -} diff --git a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/jmx/ManagedUtil.java b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/jmx/ManagedUtil.java deleted file mode 100644 index 64e1942bd..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/jmx/ManagedUtil.java +++ /dev/null @@ -1,71 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you 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. - */ - -package org.apache.zookeeper.jmx; - -import java.util.Enumeration; - -import javax.management.JMException; -import javax.management.MBeanServer; -import javax.management.ObjectName; - -import org.apache.log4j.LogManager; -import org.apache.log4j.Logger; -import org.apache.log4j.jmx.HierarchyDynamicMBean; -import org.apache.log4j.spi.LoggerRepository; - -/** - * Shared utilities - */ -public class ManagedUtil { - /** - * Register the log4j JMX mbeans. Set environment variable - * "zookeeper.jmx.log4j.disable" to true to disable registration. - * @see http://logging.apache.org/log4j/1.2/apidocs/index.html?org/apache/log4j/jmx/package-summary.html - * @throws JMException if registration fails - */ - public static void registerLog4jMBeans() throws JMException { - if (Boolean.getBoolean("zookeeper.jmx.log4j.disable") == true) { - return; - } - - MBeanServer mbs = MBeanRegistry.getInstance().getPlatformMBeanServer(); - - // Create and Register the top level Log4J MBean - HierarchyDynamicMBean hdm = new HierarchyDynamicMBean(); - - ObjectName mbo = new ObjectName("log4j:hiearchy=default"); - mbs.registerMBean(hdm, mbo); - - // Add the root logger to the Hierarchy MBean - Logger rootLogger = Logger.getRootLogger(); - hdm.addLoggerMBean(rootLogger.getName()); - - // Get each logger from the Log4J Repository and add it to - // the Hierarchy MBean created above. - LoggerRepository r = LogManager.getLoggerRepository(); - Enumeration enumer = r.getCurrentLoggers(); - Logger logger = null; - - while (enumer.hasMoreElements()) { - logger = (Logger) enumer.nextElement(); - hdm.addLoggerMBean(logger.getName()); - } - } - -} diff --git a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/jmx/ZKMBeanInfo.java b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/jmx/ZKMBeanInfo.java deleted file mode 100644 index 1e87d92e1..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/jmx/ZKMBeanInfo.java +++ /dev/null @@ -1,36 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you 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. - */ - -package org.apache.zookeeper.jmx; - -/** - * Zookeeper MBean info interface. MBeanRegistry uses the interface to generate - * JMX object name. - */ -public interface ZKMBeanInfo { - /** - * @return a string identifying the MBean - */ - public String getName(); - /** - * If isHidden returns true, the MBean won't be registered with MBean server, - * and thus won't be available for management tools. Used for grouping MBeans. - * @return true if the MBean is hidden. - */ - public boolean isHidden(); -} diff --git a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/ByteBufferInputStream.java b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/ByteBufferInputStream.java deleted file mode 100644 index e5ac120ac..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/ByteBufferInputStream.java +++ /dev/null @@ -1,82 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you 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. - */ - -package org.apache.zookeeper.server; - -import java.io.IOException; -import java.io.InputStream; -import java.nio.ByteBuffer; - -import org.apache.jute.BinaryInputArchive; -import org.apache.jute.Record; - -public class ByteBufferInputStream extends InputStream { - ByteBuffer bb; - - public ByteBufferInputStream(ByteBuffer bb) { - this.bb = bb; - } - - @Override - public int read() throws IOException { - if (bb.remaining() == 0) { - return -1; - } - return bb.get() & 0xff; - } - - @Override - public int available() throws IOException { - return bb.remaining(); - } - - @Override - public int read(byte[] b, int off, int len) throws IOException { - if (bb.remaining() == 0) { - return -1; - } - if (len > bb.remaining()) { - len = bb.remaining(); - } - bb.get(b, off, len); - return len; - } - - @Override - public int read(byte[] b) throws IOException { - return read(b, 0, b.length); - } - - @Override - public long skip(long n) throws IOException { - long newPos = bb.position() + n; - if (newPos > bb.remaining()) { - n = bb.remaining(); - } - bb.position(bb.position() + (int) n); - return n; - } - - static public void byteBuffer2Record(ByteBuffer bb, Record record) - throws IOException { - BinaryInputArchive ia; - ia = BinaryInputArchive.getArchive(new ByteBufferInputStream(bb)); - record.deserialize(ia, "request"); - } - -} diff --git a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/ByteBufferOutputStream.java b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/ByteBufferOutputStream.java deleted file mode 100644 index a2fcc956b..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/ByteBufferOutputStream.java +++ /dev/null @@ -1,52 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you 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. - */ - -package org.apache.zookeeper.server; - -import java.io.IOException; -import java.io.OutputStream; -import java.nio.ByteBuffer; - -import org.apache.jute.BinaryInputArchive; -import org.apache.jute.BinaryOutputArchive; -import org.apache.jute.Record; - -public class ByteBufferOutputStream extends OutputStream { - ByteBuffer bb; - public ByteBufferOutputStream(ByteBuffer bb) { - this.bb = bb; - } - @Override - public void write(int b) throws IOException { - bb.put((byte)b); - } - @Override - public void write(byte[] b) throws IOException { - bb.put(b); - } - @Override - public void write(byte[] b, int off, int len) throws IOException { - bb.put(b, off, len); - } - static public void record2ByteBuffer(Record record, ByteBuffer bb) - throws IOException { - BinaryOutputArchive oa; - oa = BinaryOutputArchive.getArchive(new ByteBufferOutputStream(bb)); - record.serialize(oa, "request"); - } -} diff --git a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/ConnectionBean.java b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/ConnectionBean.java deleted file mode 100644 index 917aacfdc..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/ConnectionBean.java +++ /dev/null @@ -1,173 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you 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. - */ - -package org.apache.zookeeper.server; - -import java.net.Inet6Address; -import java.net.InetAddress; -import java.net.InetSocketAddress; -import java.util.Arrays; -import java.util.Date; - -import javax.management.ObjectName; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.apache.zookeeper.jmx.MBeanRegistry; -import org.apache.zookeeper.jmx.ZKMBeanInfo; - -/** - * Implementation of connection MBean interface. - */ -public class ConnectionBean implements ConnectionMXBean, ZKMBeanInfo { - private static final Logger LOG = LoggerFactory.getLogger(ConnectionBean.class); - - private final ServerCnxn connection; - private final Stats stats; - - private final ZooKeeperServer zk; - - private final String remoteIP; - private final long sessionId; - - public ConnectionBean(ServerCnxn connection,ZooKeeperServer zk){ - this.connection = connection; - this.stats = connection; - this.zk = zk; - - InetSocketAddress sockAddr = connection.getRemoteSocketAddress(); - if (sockAddr == null) { - remoteIP = "Unknown"; - } else { - InetAddress addr = sockAddr.getAddress(); - if (addr instanceof Inet6Address) { - remoteIP = ObjectName.quote(addr.getHostAddress()); - } else { - remoteIP = addr.getHostAddress(); - } - } - sessionId = connection.getSessionId(); - } - - public String getSessionId() { - return "0x" + Long.toHexString(sessionId); - } - - public String getSourceIP() { - InetSocketAddress sockAddr = connection.getRemoteSocketAddress(); - if (sockAddr == null) { - return null; - } - return sockAddr.getAddress().getHostAddress() - + ":" + sockAddr.getPort(); - } - - public String getName() { - return MBeanRegistry.getInstance().makeFullPath("Connections", remoteIP, - getSessionId()); - } - - public boolean isHidden() { - return false; - } - - public String[] getEphemeralNodes() { - if(zk.getZKDatabase() !=null){ - String[] res = zk.getZKDatabase().getEphemerals(sessionId) - .toArray(new String[0]); - Arrays.sort(res); - return res; - } - return null; - } - - public String getStartedTime() { - return stats.getEstablished().toString(); - } - - public void terminateSession() { - try { - zk.closeSession(sessionId); - } catch (Exception e) { - LOG.warn("Unable to closeSession() for session: 0x" - + getSessionId(), e); - } - } - - public void terminateConnection() { - connection.sendCloseSession(); - } - - public void resetCounters() { - stats.resetStats(); - } - - @Override - public String toString() { - return "ConnectionBean{ClientIP=" + ObjectName.quote(getSourceIP()) - + ",SessionId=0x" + getSessionId() + "}"; - } - - public long getOutstandingRequests() { - return stats.getOutstandingRequests(); - } - - public long getPacketsReceived() { - return stats.getPacketsReceived(); - } - - public long getPacketsSent() { - return stats.getPacketsSent(); - } - - public int getSessionTimeout() { - return connection.getSessionTimeout(); - } - - public long getMinLatency() { - return stats.getMinLatency(); - } - - public long getAvgLatency() { - return stats.getAvgLatency(); - } - - public long getMaxLatency() { - return stats.getMaxLatency(); - } - - public String getLastOperation() { - return stats.getLastOperation(); - } - - public String getLastCxid() { - return "0x" + Long.toHexString(stats.getLastCxid()); - } - - public String getLastZxid() { - return "0x" + Long.toHexString(stats.getLastZxid()); - } - - public String getLastResponseTime() { - return new Date(stats.getLastResponseTime()).toString(); - } - - public long getLastLatency() { - return stats.getLastLatency(); - } -} diff --git a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/ConnectionMXBean.java b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/ConnectionMXBean.java deleted file mode 100644 index 8bdec9a02..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/ConnectionMXBean.java +++ /dev/null @@ -1,98 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you 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. - */ - -package org.apache.zookeeper.server; - -/** - * This MBean represents a client connection. - */ -public interface ConnectionMXBean { - /** - * @return source (client) IP address - */ - public String getSourceIP(); - /** - * @return client's session id - */ - public String getSessionId(); - /** - * @return time the connection was started - */ - public String getStartedTime(); - /** - * @return number of ephemeral nodes owned by this connection - */ - public String[] getEphemeralNodes(); - /** - * @return packets received from this client - */ - public long getPacketsReceived(); - /** - * @return number of packets sent to this client - */ - public long getPacketsSent(); - /** - * @return number of requets being processed - */ - public long getOutstandingRequests(); - /** - * @return session timeout in ms - */ - public int getSessionTimeout(); - - /** - * Terminate this client session. The client will reconnect with a different - * session id. - */ - public void terminateSession(); - /** - * Terminate thei client connection. The client will immediately attempt to - * reconnect with the same session id. - */ - public void terminateConnection(); - - - /** Min latency in ms - * @since 3.3.0 */ - long getMinLatency(); - /** Average latency in ms - * @since 3.3.0 */ - long getAvgLatency(); - /** Max latency in ms - * @since 3.3.0 */ - long getMaxLatency(); - /** Last operation performed by this connection - * @since 3.3.0 */ - String getLastOperation(); - /** Last cxid of this connection - * @since 3.3.0 */ - String getLastCxid(); - /** Last zxid of this connection - * @since 3.3.0 */ - String getLastZxid(); - /** Last time server sent a response to client on this connection - * @since 3.3.0 */ - String getLastResponseTime(); - /** Latency of last response to client on this connection in ms - * @since 3.3.0 */ - long getLastLatency(); - - /** Reset counters - * @since 3.3.0 */ - void resetCounters(); -} diff --git a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/DataNode.java b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/DataNode.java deleted file mode 100644 index 9498204fc..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/DataNode.java +++ /dev/null @@ -1,173 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you 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. - */ - -package org.apache.zookeeper.server; - -import java.io.IOException; -import java.util.HashSet; -import java.util.Set; - -import org.apache.jute.InputArchive; -import org.apache.jute.OutputArchive; -import org.apache.jute.Record; -import org.apache.zookeeper.data.Stat; -import org.apache.zookeeper.data.StatPersisted; - -/** - * This class contains the data for a node in the data tree. - *

        - * A data node contains a reference to its parent, a byte array as its data, an - * array of ACLs, a stat object, and a set of its children's paths. - * - */ -public class DataNode implements Record { - /** the parent of this datanode */ - DataNode parent; - - /** the data for this datanode */ - byte data[]; - - /** - * the acl map long for this datanode. the datatree has the map - */ - Long acl; - - /** - * the stat for this node that is persisted to disk. - */ - public StatPersisted stat; - - /** - * the list of children for this node. note that the list of children string - * does not contain the parent path -- just the last part of the path. This - * should be synchronized on except deserializing (for speed up issues). - */ - private Set children = null; - - /** - * default constructor for the datanode - */ - DataNode() { - // default constructor - } - - /** - * create a DataNode with parent, data, acls and stat - * - * @param parent - * the parent of this DataNode - * @param data - * the data to be set - * @param acl - * the acls for this node - * @param stat - * the stat for this node. - */ - public DataNode(DataNode parent, byte data[], Long acl, StatPersisted stat) { - this.parent = parent; - this.data = data; - this.acl = acl; - this.stat = stat; - } - - /** - * Method that inserts a child into the children set - * - * @param child - * to be inserted - * @return true if this set did not already contain the specified element - */ - public synchronized boolean addChild(String child) { - if (children == null) { - // let's be conservative on the typical number of children - children = new HashSet(8); - } - return children.add(child); - } - - /** - * Method that removes a child from the children set - * - * @param child - * @return true if this set contained the specified element - */ - public synchronized boolean removeChild(String child) { - if (children == null) { - return false; - } - return children.remove(child); - } - - /** - * convenience method for setting the children for this datanode - * - * @param children - */ - public synchronized void setChildren(HashSet children) { - this.children = children; - } - - /** - * convenience methods to get the children - * - * @return the children of this datanode - */ - public synchronized Set getChildren() { - return children; - } - - synchronized public void copyStat(Stat to) { - to.setAversion(stat.getAversion()); - to.setCtime(stat.getCtime()); - to.setCzxid(stat.getCzxid()); - to.setMtime(stat.getMtime()); - to.setMzxid(stat.getMzxid()); - to.setPzxid(stat.getPzxid()); - to.setVersion(stat.getVersion()); - to.setEphemeralOwner(stat.getEphemeralOwner()); - to.setDataLength(data == null ? 0 : data.length); - int numChildren = 0; - if (this.children != null) { - numChildren = children.size(); - } - // when we do the Cversion we need to translate from the count of the creates - // to the count of the changes (v3 semantics) - // for every create there is a delete except for the children still present - to.setCversion(stat.getCversion()*2 - numChildren); - to.setNumChildren(numChildren); - } - - synchronized public void deserialize(InputArchive archive, String tag) - throws IOException { - archive.startRecord("node"); - data = archive.readBuffer("data"); - acl = archive.readLong("acl"); - stat = new StatPersisted(); - stat.deserialize(archive, "statpersisted"); - archive.endRecord("node"); - } - - synchronized public void serialize(OutputArchive archive, String tag) - throws IOException { - archive.startRecord(this, "node"); - archive.writeBuffer(data, "data"); - archive.writeLong(acl, "acl"); - stat.serialize(archive, "statpersisted"); - archive.endRecord(this, "node"); - } -} diff --git a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/DataTree.java b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/DataTree.java deleted file mode 100644 index 363b256b6..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/DataTree.java +++ /dev/null @@ -1,1350 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you 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. - */ - -package org.apache.zookeeper.server; - -import java.io.IOException; -import java.io.PrintWriter; -import java.nio.ByteBuffer; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collection; -import java.util.HashMap; -import java.util.HashSet; -import java.util.List; -import java.util.Map; -import java.util.Set; -import java.util.concurrent.ConcurrentHashMap; - -import org.apache.jute.Index; -import org.apache.jute.InputArchive; -import org.apache.jute.OutputArchive; -import org.apache.jute.Record; -import org.apache.zookeeper.KeeperException; -import org.apache.zookeeper.KeeperException.Code; -import org.apache.zookeeper.KeeperException.NoNodeException; -import org.apache.zookeeper.Quotas; -import org.apache.zookeeper.StatsTrack; -import org.apache.zookeeper.WatchedEvent; -import org.apache.zookeeper.Watcher; -import org.apache.zookeeper.Watcher.Event; -import org.apache.zookeeper.Watcher.Event.EventType; -import org.apache.zookeeper.Watcher.Event.KeeperState; -import org.apache.zookeeper.ZooDefs.Ids; -import org.apache.zookeeper.ZooDefs.OpCode; -import org.apache.zookeeper.common.PathTrie; -import org.apache.zookeeper.data.ACL; -import org.apache.zookeeper.data.Stat; -import org.apache.zookeeper.data.StatPersisted; -import org.apache.zookeeper.txn.CheckVersionTxn; -import org.apache.zookeeper.txn.CreateTxn; -import org.apache.zookeeper.txn.DeleteTxn; -import org.apache.zookeeper.txn.ErrorTxn; -import org.apache.zookeeper.txn.MultiTxn; -import org.apache.zookeeper.txn.SetACLTxn; -import org.apache.zookeeper.txn.SetDataTxn; -import org.apache.zookeeper.txn.Txn; -import org.apache.zookeeper.txn.TxnHeader; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -/** - * This class maintains the tree data structure. It doesn't have any networking - * or client connection code in it so that it can be tested in a stand alone - * way. - *

        - * The tree maintains two parallel data structures: a hashtable that maps from - * full paths to DataNodes and a tree of DataNodes. All accesses to a path is - * through the hashtable. The tree is traversed only when serializing to disk. - */ -public class DataTree { - private static final Logger LOG = LoggerFactory.getLogger(DataTree.class); - - /** - * This hashtable provides a fast lookup to the datanodes. The tree is the - * source of truth and is where all the locking occurs - */ - private final ConcurrentHashMap nodes = - new ConcurrentHashMap(); - - private final WatchManager dataWatches = new WatchManager(); - - private final WatchManager childWatches = new WatchManager(); - - /** the root of zookeeper tree */ - private static final String rootZookeeper = "/"; - - /** the zookeeper nodes that acts as the management and status node **/ - private static final String procZookeeper = Quotas.procZookeeper; - - /** this will be the string thats stored as a child of root */ - private static final String procChildZookeeper = procZookeeper.substring(1); - - /** - * the zookeeper quota node that acts as the quota management node for - * zookeeper - */ - private static final String quotaZookeeper = Quotas.quotaZookeeper; - - /** this will be the string thats stored as a child of /zookeeper */ - private static final String quotaChildZookeeper = quotaZookeeper - .substring(procZookeeper.length() + 1); - - /** - * the path trie that keeps track fo the quota nodes in this datatree - */ - private final PathTrie pTrie = new PathTrie(); - - /** - * This hashtable lists the paths of the ephemeral nodes of a session. - */ - private final Map> ephemerals = - new ConcurrentHashMap>(); - - /** - * this is map from longs to acl's. It saves acl's being stored for each - * datanode. - */ - public final Map> longKeyMap = - new HashMap>(); - - /** - * this a map from acls to long. - */ - public final Map, Long> aclKeyMap = - new HashMap, Long>(); - - /** - * these are the number of acls that we have in the datatree - */ - protected long aclIndex = 0; - - @SuppressWarnings("unchecked") - public HashSet getEphemerals(long sessionId) { - HashSet retv = ephemerals.get(sessionId); - if (retv == null) { - return new HashSet(); - } - HashSet cloned = null; - synchronized (retv) { - cloned = (HashSet) retv.clone(); - } - return cloned; - } - - public Map> getEphemeralsMap() { - return ephemerals; - } - - private long incrementIndex() { - return ++aclIndex; - } - - /** - * compare two list of acls. if there elements are in the same order and the - * same size then return true else return false - * - * @param lista - * the list to be compared - * @param listb - * the list to be compared - * @return true if and only if the lists are of the same size and the - * elements are in the same order in lista and listb - */ - private boolean listACLEquals(List lista, List listb) { - if (lista.size() != listb.size()) { - return false; - } - for (int i = 0; i < lista.size(); i++) { - ACL a = lista.get(i); - ACL b = listb.get(i); - if (!a.equals(b)) { - return false; - } - } - return true; - } - - /** - * converts the list of acls to a list of longs. - * - * @param acls - * @return a list of longs that map to the acls - */ - public synchronized Long convertAcls(List acls) { - if (acls == null) - return -1L; - // get the value from the map - Long ret = aclKeyMap.get(acls); - // could not find the map - if (ret != null) - return ret; - long val = incrementIndex(); - longKeyMap.put(val, acls); - aclKeyMap.put(acls, val); - return val; - } - - /** - * converts a list of longs to a list of acls. - * - * @param longVal - * the list of longs - * @return a list of ACLs that map to longs - */ - public synchronized List convertLong(Long longVal) { - if (longVal == null) - return null; - if (longVal == -1L) - return Ids.OPEN_ACL_UNSAFE; - List acls = longKeyMap.get(longVal); - if (acls == null) { - LOG.error("ERROR: ACL not available for long " + longVal); - throw new RuntimeException("Failed to fetch acls for " + longVal); - } - return acls; - } - - public Collection getSessions() { - return ephemerals.keySet(); - } - - /** - * just an accessor method to allow raw creation of datatree's from a bunch - * of datanodes - * - * @param path - * the path of the datanode - * @param node - * the datanode corresponding to this path - */ - public void addDataNode(String path, DataNode node) { - nodes.put(path, node); - } - - public DataNode getNode(String path) { - return nodes.get(path); - } - - public int getNodeCount() { - return nodes.size(); - } - - public int getWatchCount() { - return dataWatches.size() + childWatches.size(); - } - - public int getEphemeralsCount() { - Map> map = this.getEphemeralsMap(); - int result = 0; - for (HashSet set : map.values()) { - result += set.size(); - } - return result; - } - - /** - * Get the size of the nodes based on path and data length. - * - * @return size of the data - */ - public long approximateDataSize() { - long result = 0; - for (Map.Entry entry : nodes.entrySet()) { - DataNode value = entry.getValue(); - synchronized (value) { - result += entry.getKey().length(); - result += (value.data == null ? 0 - : value.data.length); - } - } - return result; - } - - /** - * This is a pointer to the root of the DataTree. It is the source of truth, - * but we usually use the nodes hashmap to find nodes in the tree. - */ - private DataNode root = new DataNode(null, new byte[0], -1L, - new StatPersisted()); - - /** - * create a /zookeeper filesystem that is the proc filesystem of zookeeper - */ - private DataNode procDataNode = new DataNode(root, new byte[0], -1L, - new StatPersisted()); - - /** - * create a /zookeeper/quota node for maintaining quota properties for - * zookeeper - */ - private DataNode quotaDataNode = new DataNode(procDataNode, new byte[0], - -1L, new StatPersisted()); - - public DataTree() { - /* Rather than fight it, let root have an alias */ - nodes.put("", root); - nodes.put(rootZookeeper, root); - - /** add the proc node and quota node */ - root.addChild(procChildZookeeper); - nodes.put(procZookeeper, procDataNode); - - procDataNode.addChild(quotaChildZookeeper); - nodes.put(quotaZookeeper, quotaDataNode); - } - - /** - * is the path one of the special paths owned by zookeeper. - * - * @param path - * the path to be checked - * @return true if a special path. false if not. - */ - boolean isSpecialPath(String path) { - if (rootZookeeper.equals(path) || procZookeeper.equals(path) - || quotaZookeeper.equals(path)) { - return true; - } - return false; - } - - static public void copyStatPersisted(StatPersisted from, StatPersisted to) { - to.setAversion(from.getAversion()); - to.setCtime(from.getCtime()); - to.setCversion(from.getCversion()); - to.setCzxid(from.getCzxid()); - to.setMtime(from.getMtime()); - to.setMzxid(from.getMzxid()); - to.setPzxid(from.getPzxid()); - to.setVersion(from.getVersion()); - to.setEphemeralOwner(from.getEphemeralOwner()); - } - - static public void copyStat(Stat from, Stat to) { - to.setAversion(from.getAversion()); - to.setCtime(from.getCtime()); - to.setCversion(from.getCversion()); - to.setCzxid(from.getCzxid()); - to.setMtime(from.getMtime()); - to.setMzxid(from.getMzxid()); - to.setPzxid(from.getPzxid()); - to.setVersion(from.getVersion()); - to.setEphemeralOwner(from.getEphemeralOwner()); - to.setDataLength(from.getDataLength()); - to.setNumChildren(from.getNumChildren()); - } - - /** - * update the count of this stat datanode - * - * @param lastPrefix - * the path of the node that is quotaed. - * @param diff - * the diff to be added to the count - */ - public void updateCount(String lastPrefix, int diff) { - String statNode = Quotas.statPath(lastPrefix); - DataNode node = nodes.get(statNode); - StatsTrack updatedStat = null; - if (node == null) { - // should not happen - LOG.error("Missing count node for stat " + statNode); - return; - } - synchronized (node) { - updatedStat = new StatsTrack(new String(node.data)); - updatedStat.setCount(updatedStat.getCount() + diff); - node.data = updatedStat.toString().getBytes(); - } - // now check if the counts match the quota - String quotaNode = Quotas.quotaPath(lastPrefix); - node = nodes.get(quotaNode); - StatsTrack thisStats = null; - if (node == null) { - // should not happen - LOG.error("Missing count node for quota " + quotaNode); - return; - } - synchronized (node) { - thisStats = new StatsTrack(new String(node.data)); - } - if (thisStats.getCount() > -1 && (thisStats.getCount() < updatedStat.getCount())) { - LOG - .warn("Quota exceeded: " + lastPrefix + " count=" - + updatedStat.getCount() + " limit=" - + thisStats.getCount()); - } - } - - /** - * update the count of bytes of this stat datanode - * - * @param lastPrefix - * the path of the node that is quotaed - * @param diff - * the diff to added to number of bytes - * @throws IOException - * if path is not found - */ - public void updateBytes(String lastPrefix, long diff) { - String statNode = Quotas.statPath(lastPrefix); - DataNode node = nodes.get(statNode); - if (node == null) { - // should never be null but just to make - // findbugs happy - LOG.error("Missing stat node for bytes " + statNode); - return; - } - StatsTrack updatedStat = null; - synchronized (node) { - updatedStat = new StatsTrack(new String(node.data)); - updatedStat.setBytes(updatedStat.getBytes() + diff); - node.data = updatedStat.toString().getBytes(); - } - // now check if the bytes match the quota - String quotaNode = Quotas.quotaPath(lastPrefix); - node = nodes.get(quotaNode); - if (node == null) { - // should never be null but just to make - // findbugs happy - LOG.error("Missing quota node for bytes " + quotaNode); - return; - } - StatsTrack thisStats = null; - synchronized (node) { - thisStats = new StatsTrack(new String(node.data)); - } - if (thisStats.getBytes() > -1 && (thisStats.getBytes() < updatedStat.getBytes())) { - LOG - .warn("Quota exceeded: " + lastPrefix + " bytes=" - + updatedStat.getBytes() + " limit=" - + thisStats.getBytes()); - } - } - - /** - * @param path - * @param data - * @param acl - * @param ephemeralOwner - * the session id that owns this node. -1 indicates this is not - * an ephemeral node. - * @param zxid - * @param time - * @return the patch of the created node - * @throws KeeperException - */ - public String createNode(String path, byte data[], List acl, - long ephemeralOwner, int parentCVersion, long zxid, long time) - throws KeeperException.NoNodeException, - KeeperException.NodeExistsException { - int lastSlash = path.lastIndexOf('/'); - String parentName = path.substring(0, lastSlash); - String childName = path.substring(lastSlash + 1); - StatPersisted stat = new StatPersisted(); - stat.setCtime(time); - stat.setMtime(time); - stat.setCzxid(zxid); - stat.setMzxid(zxid); - stat.setPzxid(zxid); - stat.setVersion(0); - stat.setAversion(0); - stat.setEphemeralOwner(ephemeralOwner); - DataNode parent = nodes.get(parentName); - if (parent == null) { - throw new KeeperException.NoNodeException(); - } - synchronized (parent) { - Set children = parent.getChildren(); - if (children != null) { - if (children.contains(childName)) { - throw new KeeperException.NodeExistsException(); - } - } - - if (parentCVersion == -1) { - parentCVersion = parent.stat.getCversion(); - parentCVersion++; - } - parent.stat.setCversion(parentCVersion); - parent.stat.setPzxid(zxid); - Long longval = convertAcls(acl); - DataNode child = new DataNode(parent, data, longval, stat); - parent.addChild(childName); - nodes.put(path, child); - if (ephemeralOwner != 0) { - HashSet list = ephemerals.get(ephemeralOwner); - if (list == null) { - list = new HashSet(); - ephemerals.put(ephemeralOwner, list); - } - synchronized (list) { - list.add(path); - } - } - } - // now check if its one of the zookeeper node child - if (parentName.startsWith(quotaZookeeper)) { - // now check if its the limit node - if (Quotas.limitNode.equals(childName)) { - // this is the limit node - // get the parent and add it to the trie - pTrie.addPath(parentName.substring(quotaZookeeper.length())); - } - if (Quotas.statNode.equals(childName)) { - updateQuotaForPath(parentName - .substring(quotaZookeeper.length())); - } - } - // also check to update the quotas for this node - String lastPrefix; - if((lastPrefix = getMaxPrefixWithQuota(path)) != null) { - // ok we have some match and need to update - updateCount(lastPrefix, 1); - updateBytes(lastPrefix, data == null ? 0 : data.length); - } - dataWatches.triggerWatch(path, Event.EventType.NodeCreated); - childWatches.triggerWatch(parentName.equals("") ? "/" : parentName, - Event.EventType.NodeChildrenChanged); - return path; - } - - /** - * remove the path from the datatree - * - * @param path - * the path to of the node to be deleted - * @param zxid - * the current zxid - * @throws KeeperException.NoNodeException - */ - public void deleteNode(String path, long zxid) - throws KeeperException.NoNodeException { - int lastSlash = path.lastIndexOf('/'); - String parentName = path.substring(0, lastSlash); - String childName = path.substring(lastSlash + 1); - DataNode node = nodes.get(path); - if (node == null) { - throw new KeeperException.NoNodeException(); - } - nodes.remove(path); - DataNode parent = nodes.get(parentName); - if (parent == null) { - throw new KeeperException.NoNodeException(); - } - synchronized (parent) { - parent.removeChild(childName); - parent.stat.setPzxid(zxid); - long eowner = node.stat.getEphemeralOwner(); - if (eowner != 0) { - HashSet nodes = ephemerals.get(eowner); - if (nodes != null) { - synchronized (nodes) { - nodes.remove(path); - } - } - } - node.parent = null; - } - if (parentName.startsWith(procZookeeper)) { - // delete the node in the trie. - if (Quotas.limitNode.equals(childName)) { - // we need to update the trie - // as well - pTrie.deletePath(parentName.substring(quotaZookeeper.length())); - } - } - - // also check to update the quotas for this node - String lastPrefix; - if((lastPrefix = getMaxPrefixWithQuota(path)) != null) { - // ok we have some match and need to update - updateCount(lastPrefix, -1); - int bytes = 0; - synchronized (node) { - bytes = (node.data == null ? 0 : -(node.data.length)); - } - updateBytes(lastPrefix, bytes); - } - if (LOG.isTraceEnabled()) { - ZooTrace.logTraceMessage(LOG, ZooTrace.EVENT_DELIVERY_TRACE_MASK, - "dataWatches.triggerWatch " + path); - ZooTrace.logTraceMessage(LOG, ZooTrace.EVENT_DELIVERY_TRACE_MASK, - "childWatches.triggerWatch " + parentName); - } - Set processed = dataWatches.triggerWatch(path, - EventType.NodeDeleted); - childWatches.triggerWatch(path, EventType.NodeDeleted, processed); - childWatches.triggerWatch(parentName.equals("") ? "/" : parentName, - EventType.NodeChildrenChanged); - } - - public Stat setData(String path, byte data[], int version, long zxid, - long time) throws KeeperException.NoNodeException { - Stat s = new Stat(); - DataNode n = nodes.get(path); - if (n == null) { - throw new KeeperException.NoNodeException(); - } - byte lastdata[] = null; - synchronized (n) { - lastdata = n.data; - n.data = data; - n.stat.setMtime(time); - n.stat.setMzxid(zxid); - n.stat.setVersion(version); - n.copyStat(s); - } - // now update if the path is in a quota subtree. - String lastPrefix; - if((lastPrefix = getMaxPrefixWithQuota(path)) != null) { - this.updateBytes(lastPrefix, (data == null ? 0 : data.length) - - (lastdata == null ? 0 : lastdata.length)); - } - dataWatches.triggerWatch(path, EventType.NodeDataChanged); - return s; - } - - /** - * If there is a quota set, return the appropriate prefix for that quota - * Else return null - * @param path The ZK path to check for quota - * @return Max quota prefix, or null if none - */ - public String getMaxPrefixWithQuota(String path) { - // do nothing for the root. - // we are not keeping a quota on the zookeeper - // root node for now. - String lastPrefix = pTrie.findMaxPrefix(path); - - if (!rootZookeeper.equals(lastPrefix) && !("".equals(lastPrefix))) { - return lastPrefix; - } - else { - return null; - } - } - - public byte[] getData(String path, Stat stat, Watcher watcher) - throws KeeperException.NoNodeException { - DataNode n = nodes.get(path); - if (n == null) { - throw new KeeperException.NoNodeException(); - } - synchronized (n) { - n.copyStat(stat); - if (watcher != null) { - dataWatches.addWatch(path, watcher); - } - return n.data; - } - } - - public Stat statNode(String path, Watcher watcher) - throws KeeperException.NoNodeException { - Stat stat = new Stat(); - DataNode n = nodes.get(path); - if (watcher != null) { - dataWatches.addWatch(path, watcher); - } - if (n == null) { - throw new KeeperException.NoNodeException(); - } - synchronized (n) { - n.copyStat(stat); - return stat; - } - } - - public List getChildren(String path, Stat stat, Watcher watcher) - throws KeeperException.NoNodeException { - DataNode n = nodes.get(path); - if (n == null) { - throw new KeeperException.NoNodeException(); - } - synchronized (n) { - if (stat != null) { - n.copyStat(stat); - } - ArrayList children; - Set childs = n.getChildren(); - if (childs != null) { - children = new ArrayList(childs.size()); - children.addAll(childs); - } else { - children = new ArrayList(0); - } - - if (watcher != null) { - childWatches.addWatch(path, watcher); - } - return children; - } - } - - public Stat setACL(String path, List acl, int version) - throws KeeperException.NoNodeException { - Stat stat = new Stat(); - DataNode n = nodes.get(path); - if (n == null) { - throw new KeeperException.NoNodeException(); - } - synchronized (n) { - n.stat.setAversion(version); - n.acl = convertAcls(acl); - n.copyStat(stat); - return stat; - } - } - - @SuppressWarnings("unchecked") - public List getACL(String path, Stat stat) - throws KeeperException.NoNodeException { - DataNode n = nodes.get(path); - if (n == null) { - throw new KeeperException.NoNodeException(); - } - synchronized (n) { - n.copyStat(stat); - return new ArrayList(convertLong(n.acl)); - } - } - - static public class ProcessTxnResult { - public long clientId; - - public int cxid; - - public long zxid; - - public int err; - - public int type; - - public String path; - - public Stat stat; - - public List multiResult; - - /** - * Equality is defined as the clientId and the cxid being the same. This - * allows us to use hash tables to track completion of transactions. - * - * @see java.lang.Object#equals(java.lang.Object) - */ - @Override - public boolean equals(Object o) { - if (o instanceof ProcessTxnResult) { - ProcessTxnResult other = (ProcessTxnResult) o; - return other.clientId == clientId && other.cxid == cxid; - } - return false; - } - - /** - * See equals() to find the rational for how this hashcode is generated. - * - * @see ProcessTxnResult#equals(Object) - * @see java.lang.Object#hashCode() - */ - @Override - public int hashCode() { - return (int) ((clientId ^ cxid) % Integer.MAX_VALUE); - } - - } - - public volatile long lastProcessedZxid = 0; - - public ProcessTxnResult processTxn(TxnHeader header, Record txn) - { - ProcessTxnResult rc = new ProcessTxnResult(); - - try { - rc.clientId = header.getClientId(); - rc.cxid = header.getCxid(); - rc.zxid = header.getZxid(); - rc.type = header.getType(); - rc.err = 0; - rc.multiResult = null; - switch (header.getType()) { - case OpCode.create: - CreateTxn createTxn = (CreateTxn) txn; - rc.path = createTxn.getPath(); - createNode( - createTxn.getPath(), - createTxn.getData(), - createTxn.getAcl(), - createTxn.getEphemeral() ? header.getClientId() : 0, - createTxn.getParentCVersion(), - header.getZxid(), header.getTime()); - break; - case OpCode.delete: - DeleteTxn deleteTxn = (DeleteTxn) txn; - rc.path = deleteTxn.getPath(); - deleteNode(deleteTxn.getPath(), header.getZxid()); - break; - case OpCode.setData: - SetDataTxn setDataTxn = (SetDataTxn) txn; - rc.path = setDataTxn.getPath(); - rc.stat = setData(setDataTxn.getPath(), setDataTxn - .getData(), setDataTxn.getVersion(), header - .getZxid(), header.getTime()); - break; - case OpCode.setACL: - SetACLTxn setACLTxn = (SetACLTxn) txn; - rc.path = setACLTxn.getPath(); - rc.stat = setACL(setACLTxn.getPath(), setACLTxn.getAcl(), - setACLTxn.getVersion()); - break; - case OpCode.closeSession: - killSession(header.getClientId(), header.getZxid()); - break; - case OpCode.error: - ErrorTxn errTxn = (ErrorTxn) txn; - rc.err = errTxn.getErr(); - break; - case OpCode.check: - CheckVersionTxn checkTxn = (CheckVersionTxn) txn; - rc.path = checkTxn.getPath(); - break; - case OpCode.multi: - MultiTxn multiTxn = (MultiTxn) txn ; - List txns = multiTxn.getTxns(); - rc.multiResult = new ArrayList(); - boolean failed = false; - for (Txn subtxn : txns) { - if (subtxn.getType() == OpCode.error) { - failed = true; - break; - } - } - - boolean post_failed = false; - for (Txn subtxn : txns) { - ByteBuffer bb = ByteBuffer.wrap(subtxn.getData()); - Record record = null; - switch (subtxn.getType()) { - case OpCode.create: - record = new CreateTxn(); - break; - case OpCode.delete: - record = new DeleteTxn(); - break; - case OpCode.setData: - record = new SetDataTxn(); - break; - case OpCode.error: - record = new ErrorTxn(); - post_failed = true; - break; - case OpCode.check: - record = new CheckVersionTxn(); - break; - default: - throw new IOException("Invalid type of op: " + subtxn.getType()); - } - assert(record != null); - - ByteBufferInputStream.byteBuffer2Record(bb, record); - - if (failed && subtxn.getType() != OpCode.error){ - int ec = post_failed ? Code.RUNTIMEINCONSISTENCY.intValue() - : Code.OK.intValue(); - - subtxn.setType(OpCode.error); - record = new ErrorTxn(ec); - } - - if (failed) { - assert(subtxn.getType() == OpCode.error) ; - } - - TxnHeader subHdr = new TxnHeader(header.getClientId(), header.getCxid(), - header.getZxid(), header.getTime(), - subtxn.getType()); - ProcessTxnResult subRc = processTxn(subHdr, record); - rc.multiResult.add(subRc); - if (subRc.err != 0 && rc.err == 0) { - rc.err = subRc.err ; - } - } - break; - } - } catch (KeeperException e) { - if (LOG.isDebugEnabled()) { - LOG.debug("Failed: " + header + ":" + txn, e); - } - rc.err = e.code().intValue(); - } catch (IOException e) { - if (LOG.isDebugEnabled()) { - LOG.debug("Failed: " + header + ":" + txn, e); - } - } - /* - * A snapshot might be in progress while we are modifying the data - * tree. If we set lastProcessedZxid prior to making corresponding - * change to the tree, then the zxid associated with the snapshot - * file will be ahead of its contents. Thus, while restoring from - * the snapshot, the restore method will not apply the transaction - * for zxid associated with the snapshot file, since the restore - * method assumes that transaction to be present in the snapshot. - * - * To avoid this, we first apply the transaction and then modify - * lastProcessedZxid. During restore, we correctly handle the - * case where the snapshot contains data ahead of the zxid associated - * with the file. - */ - if (rc.zxid > lastProcessedZxid) { - lastProcessedZxid = rc.zxid; - } - - /* - * Snapshots are taken lazily. It can happen that the child - * znodes of a parent are created after the parent - * is serialized. Therefore, while replaying logs during restore, a - * create might fail because the node was already - * created. - * - * After seeing this failure, we should increment - * the cversion of the parent znode since the parent was serialized - * before its children. - * - * Note, such failures on DT should be seen only during - * restore. - */ - if (header.getType() == OpCode.create && - rc.err == Code.NODEEXISTS.intValue()) { - LOG.debug("Adjusting parent cversion for Txn: " + header.getType() + - " path:" + rc.path + " err: " + rc.err); - int lastSlash = rc.path.lastIndexOf('/'); - String parentName = rc.path.substring(0, lastSlash); - CreateTxn cTxn = (CreateTxn)txn; - try { - setCversionPzxid(parentName, cTxn.getParentCVersion(), - header.getZxid()); - } catch (KeeperException.NoNodeException e) { - LOG.error("Failed to set parent cversion for: " + - parentName, e); - rc.err = e.code().intValue(); - } - } else if (rc.err != Code.OK.intValue()) { - LOG.debug("Ignoring processTxn failure hdr: " + header.getType() + - " : error: " + rc.err); - } - return rc; - } - - void killSession(long session, long zxid) { - // the list is already removed from the ephemerals - // so we do not have to worry about synchronizing on - // the list. This is only called from FinalRequestProcessor - // so there is no need for synchronization. The list is not - // changed here. Only create and delete change the list which - // are again called from FinalRequestProcessor in sequence. - HashSet list = ephemerals.remove(session); - if (list != null) { - for (String path : list) { - try { - deleteNode(path, zxid); - if (LOG.isDebugEnabled()) { - LOG - .debug("Deleting ephemeral node " + path - + " for session 0x" - + Long.toHexString(session)); - } - } catch (NoNodeException e) { - LOG.warn("Ignoring NoNodeException for path " + path - + " while removing ephemeral for dead session 0x" - + Long.toHexString(session)); - } - } - } - } - - /** - * a encapsultaing class for return value - */ - private static class Counts { - long bytes; - int count; - } - - /** - * this method gets the count of nodes and the bytes under a subtree - * - * @param path - * the path to be used - * @param counts - * the int count - */ - private void getCounts(String path, Counts counts) { - DataNode node = getNode(path); - if (node == null) { - return; - } - String[] children = null; - int len = 0; - synchronized (node) { - Set childs = node.getChildren(); - if (childs != null) { - children = childs.toArray(new String[childs.size()]); - } - len = (node.data == null ? 0 : node.data.length); - } - // add itself - counts.count += 1; - counts.bytes += len; - if (children == null || children.length == 0) { - return; - } - for (String child : children) { - getCounts(path + "/" + child, counts); - } - } - - /** - * update the quota for the given path - * - * @param path - * the path to be used - */ - private void updateQuotaForPath(String path) { - Counts c = new Counts(); - getCounts(path, c); - StatsTrack strack = new StatsTrack(); - strack.setBytes(c.bytes); - strack.setCount(c.count); - String statPath = Quotas.quotaZookeeper + path + "/" + Quotas.statNode; - DataNode node = getNode(statPath); - // it should exist - if (node == null) { - LOG.warn("Missing quota stat node " + statPath); - return; - } - synchronized (node) { - node.data = strack.toString().getBytes(); - } - } - - /** - * this method traverses the quota path and update the path trie and sets - * - * @param path - */ - private void traverseNode(String path) { - DataNode node = getNode(path); - String children[] = null; - synchronized (node) { - Set childs = node.getChildren(); - if (childs != null) { - children = childs.toArray(new String[childs.size()]); - } - } - if (children == null || children.length == 0) { - // this node does not have a child - // is the leaf node - // check if its the leaf node - String endString = "/" + Quotas.limitNode; - if (path.endsWith(endString)) { - // ok this is the limit node - // get the real node and update - // the count and the bytes - String realPath = path.substring(Quotas.quotaZookeeper - .length(), path.indexOf(endString)); - updateQuotaForPath(realPath); - this.pTrie.addPath(realPath); - } - return; - } - for (String child : children) { - traverseNode(path + "/" + child); - } - } - - /** - * this method sets up the path trie and sets up stats for quota nodes - */ - private void setupQuota() { - String quotaPath = Quotas.quotaZookeeper; - DataNode node = getNode(quotaPath); - if (node == null) { - return; - } - traverseNode(quotaPath); - } - - /** - * this method uses a stringbuilder to create a new path for children. This - * is faster than string appends ( str1 + str2). - * - * @param oa - * OutputArchive to write to. - * @param path - * a string builder. - * @throws IOException - * @throws InterruptedException - */ - void serializeNode(OutputArchive oa, StringBuilder path) throws IOException { - String pathString = path.toString(); - DataNode node = getNode(pathString); - if (node == null) { - return; - } - String children[] = null; - synchronized (node) { - scount++; - oa.writeString(pathString, "path"); - oa.writeRecord(node, "node"); - Set childs = node.getChildren(); - if (childs != null) { - children = childs.toArray(new String[childs.size()]); - } - } - path.append('/'); - int off = path.length(); - if (children != null) { - for (String child : children) { - // since this is single buffer being resused - // we need - // to truncate the previous bytes of string. - path.delete(off, Integer.MAX_VALUE); - path.append(child); - serializeNode(oa, path); - } - } - } - - int scount; - - public boolean initialized = false; - - private void deserializeList(Map> longKeyMap, - InputArchive ia) throws IOException { - int i = ia.readInt("map"); - while (i > 0) { - Long val = ia.readLong("long"); - if (aclIndex < val) { - aclIndex = val; - } - List aclList = new ArrayList(); - Index j = ia.startVector("acls"); - while (!j.done()) { - ACL acl = new ACL(); - acl.deserialize(ia, "acl"); - aclList.add(acl); - j.incr(); - } - longKeyMap.put(val, aclList); - aclKeyMap.put(aclList, val); - i--; - } - } - - private synchronized void serializeList(Map> longKeyMap, - OutputArchive oa) throws IOException { - oa.writeInt(longKeyMap.size(), "map"); - Set>> set = longKeyMap.entrySet(); - for (Map.Entry> val : set) { - oa.writeLong(val.getKey(), "long"); - List aclList = val.getValue(); - oa.startVector(aclList, "acls"); - for (ACL acl : aclList) { - acl.serialize(oa, "acl"); - } - oa.endVector(aclList, "acls"); - } - } - - public void serialize(OutputArchive oa, String tag) throws IOException { - scount = 0; - serializeList(longKeyMap, oa); - serializeNode(oa, new StringBuilder("")); - // / marks end of stream - // we need to check if clear had been called in between the snapshot. - if (root != null) { - oa.writeString("/", "path"); - } - } - - public void deserialize(InputArchive ia, String tag) throws IOException { - deserializeList(longKeyMap, ia); - nodes.clear(); - pTrie.clear(); - String path = ia.readString("path"); - while (!path.equals("/")) { - DataNode node = new DataNode(); - ia.readRecord(node, "node"); - nodes.put(path, node); - int lastSlash = path.lastIndexOf('/'); - if (lastSlash == -1) { - root = node; - } else { - String parentPath = path.substring(0, lastSlash); - node.parent = nodes.get(parentPath); - if (node.parent == null) { - throw new IOException("Invalid Datatree, unable to find " + - "parent " + parentPath + " of path " + path); - } - node.parent.addChild(path.substring(lastSlash + 1)); - long eowner = node.stat.getEphemeralOwner(); - if (eowner != 0) { - HashSet list = ephemerals.get(eowner); - if (list == null) { - list = new HashSet(); - ephemerals.put(eowner, list); - } - list.add(path); - } - } - path = ia.readString("path"); - } - nodes.put("/", root); - // we are done with deserializing the - // the datatree - // update the quotas - create path trie - // and also update the stat nodes - setupQuota(); - } - - /** - * Summary of the watches on the datatree. - * @param pwriter the output to write to - */ - public synchronized void dumpWatchesSummary(PrintWriter pwriter) { - pwriter.print(dataWatches.toString()); - } - - /** - * Write a text dump of all the watches on the datatree. - * Warning, this is expensive, use sparingly! - * @param pwriter the output to write to - */ - public synchronized void dumpWatches(PrintWriter pwriter, boolean byPath) { - dataWatches.dumpWatches(pwriter, byPath); - } - - /** - * Write a text dump of all the ephemerals in the datatree. - * @param pwriter the output to write to - */ - public void dumpEphemerals(PrintWriter pwriter) { - Set keys = ephemerals.keySet(); - pwriter.println("Sessions with Ephemerals (" - + keys.size() + "):"); - for (long k : keys) { - pwriter.print("0x" + Long.toHexString(k)); - pwriter.println(":"); - HashSet tmp = ephemerals.get(k); - if (tmp != null) { - synchronized (tmp) { - for (String path : tmp) { - pwriter.println("\t" + path); - } - } - } - } - } - - public void removeCnxn(Watcher watcher) { - dataWatches.removeWatcher(watcher); - childWatches.removeWatcher(watcher); - } - - public void clear() { - root = null; - nodes.clear(); - ephemerals.clear(); - } - - public void setWatches(long relativeZxid, List dataWatches, - List existWatches, List childWatches, - Watcher watcher) { - for (String path : dataWatches) { - DataNode node = getNode(path); - if (node == null) { - watcher.process(new WatchedEvent(EventType.NodeDeleted, - KeeperState.SyncConnected, path)); - } else if (node.stat.getMzxid() > relativeZxid) { - watcher.process(new WatchedEvent(EventType.NodeDataChanged, - KeeperState.SyncConnected, path)); - } else { - this.dataWatches.addWatch(path, watcher); - } - } - for (String path : existWatches) { - DataNode node = getNode(path); - if (node != null) { - watcher.process(new WatchedEvent(EventType.NodeCreated, - KeeperState.SyncConnected, path)); - } else { - this.dataWatches.addWatch(path, watcher); - } - } - for (String path : childWatches) { - DataNode node = getNode(path); - if (node == null) { - watcher.process(new WatchedEvent(EventType.NodeDeleted, - KeeperState.SyncConnected, path)); - } else if (node.stat.getPzxid() > relativeZxid) { - watcher.process(new WatchedEvent(EventType.NodeChildrenChanged, - KeeperState.SyncConnected, path)); - } else { - this.childWatches.addWatch(path, watcher); - } - } - } - - /** - * This method sets the Cversion and Pzxid for the specified node to the - * values passed as arguments. The values are modified only if newCversion - * is greater than the current Cversion. A NoNodeException is thrown if - * a znode for the specified path is not found. - * - * @param path - * Full path to the znode whose Cversion needs to be modified. - * A "/" at the end of the path is ignored. - * @param newCversion - * Value to be assigned to Cversion - * @param zxid - * Value to be assigned to Pzxid - * @throws KeeperException.NoNodeException - * If znode not found. - **/ - public void setCversionPzxid(String path, int newCversion, long zxid) - throws KeeperException.NoNodeException { - if (path.endsWith("/")) { - path = path.substring(0, path.length() - 1); - } - DataNode node = nodes.get(path); - if (node == null) { - throw new KeeperException.NoNodeException(path); - } - synchronized (node) { - if(newCversion == -1) { - newCversion = node.stat.getCversion() + 1; - } - if (newCversion > node.stat.getCversion()) { - node.stat.setCversion(newCversion); - node.stat.setPzxid(zxid); - } - } - } -} diff --git a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/DataTreeBean.java b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/DataTreeBean.java deleted file mode 100644 index 433c13fbb..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/DataTreeBean.java +++ /dev/null @@ -1,61 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you 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. - */ - -package org.apache.zookeeper.server; - -import org.apache.zookeeper.jmx.ZKMBeanInfo; - -/** - * This class implements the data tree MBean. - */ -public class DataTreeBean implements DataTreeMXBean, ZKMBeanInfo { - DataTree dataTree; - - public DataTreeBean(org.apache.zookeeper.server.DataTree dataTree){ - this.dataTree = dataTree; - } - - public int getNodeCount() { - return dataTree.getNodeCount(); - } - - public long approximateDataSize() { - return dataTree.approximateDataSize(); - } - - public int countEphemerals() { - return dataTree.getEphemeralsCount(); - } - - public int getWatchCount() { - return dataTree.getWatchCount(); - } - - public String getName() { - return "InMemoryDataTree"; - } - - public boolean isHidden() { - return false; - } - - public String getLastZxid() { - return "0x" + Long.toHexString(dataTree.lastProcessedZxid); - } - -} diff --git a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/DataTreeMXBean.java b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/DataTreeMXBean.java deleted file mode 100644 index 0048b6b27..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/DataTreeMXBean.java +++ /dev/null @@ -1,47 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you 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. - */ - -package org.apache.zookeeper.server; - -/** - * Zookeeper data tree MBean. - */ -public interface DataTreeMXBean { - /** - * @return number of znodes in the data tree. - */ - public int getNodeCount(); - /** - * @return the most recent zxid processed by the data tree. - */ - public String getLastZxid(); - /** - * @return number of watches set. - */ - public int getWatchCount(); - - /** - * @return data tree size in bytes. The size includes the znode path and - * its value. - */ - public long approximateDataSize(); - /** - * @return number of ephemeral nodes in the data tree - */ - public int countEphemerals(); -} diff --git a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/DatadirCleanupManager.java b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/DatadirCleanupManager.java deleted file mode 100644 index 8c4797166..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/DatadirCleanupManager.java +++ /dev/null @@ -1,192 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you 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. - */ - -package org.apache.zookeeper.server; - -import java.io.File; -import java.util.Timer; -import java.util.TimerTask; -import java.util.concurrent.TimeUnit; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -/** - * This class manages the cleanup of snapshots and corresponding transaction - * logs by scheduling the auto purge task with the specified - * 'autopurge.purgeInterval'. It keeps the most recent - * 'autopurge.snapRetainCount' number of snapshots and corresponding transaction - * logs. - */ -public class DatadirCleanupManager { - - private static final Logger LOG = LoggerFactory.getLogger(DatadirCleanupManager.class); - - /** - * Status of the dataDir purge task - */ - public enum PurgeTaskStatus { - NOT_STARTED, STARTED, COMPLETED; - } - - private PurgeTaskStatus purgeTaskStatus = PurgeTaskStatus.NOT_STARTED; - - private final String snapDir; - - private final String dataLogDir; - - private final int snapRetainCount; - - private final int purgeInterval; - - private Timer timer; - - /** - * Constructor of DatadirCleanupManager. It takes the parameters to schedule - * the purge task. - * - * @param snapDir - * snapshot directory - * @param dataLogDir - * transaction log directory - * @param snapRetainCount - * number of snapshots to be retained after purge - * @param purgeInterval - * purge interval in hours - */ - public DatadirCleanupManager(String snapDir, String dataLogDir, int snapRetainCount, - int purgeInterval) { - this.snapDir = snapDir; - this.dataLogDir = dataLogDir; - this.snapRetainCount = snapRetainCount; - this.purgeInterval = purgeInterval; - LOG.info("autopurge.snapRetainCount set to " + snapRetainCount); - LOG.info("autopurge.purgeInterval set to " + purgeInterval); - } - - /** - * Validates the purge configuration and schedules the purge task. Purge - * task keeps the most recent snapRetainCount number of - * snapshots and deletes the remaining for every purgeInterval - * hour(s). - *

        - * purgeInterval of 0 or - * negative integer will not schedule the purge task. - *

        - * - * @see PurgeTxnLog#purge(File, File, int) - */ - public void start() { - if (PurgeTaskStatus.STARTED == purgeTaskStatus) { - LOG.warn("Purge task is already running."); - return; - } - // Don't schedule the purge task with zero or negative purge interval. - if (purgeInterval <= 0) { - LOG.info("Purge task is not scheduled."); - return; - } - - timer = new Timer("PurgeTask", true); - TimerTask task = new PurgeTask(dataLogDir, snapDir, snapRetainCount); - timer.scheduleAtFixedRate(task, 0, TimeUnit.HOURS.toMillis(purgeInterval)); - - purgeTaskStatus = PurgeTaskStatus.STARTED; - } - - /** - * Shutdown the purge task. - */ - public void shutdown() { - if (PurgeTaskStatus.STARTED == purgeTaskStatus) { - LOG.info("Shutting down purge task."); - timer.cancel(); - purgeTaskStatus = PurgeTaskStatus.COMPLETED; - } else { - LOG.warn("Purge task not started. Ignoring shutdown!"); - } - } - - static class PurgeTask extends TimerTask { - private String logsDir; - private String snapsDir; - private int snapRetainCount; - - public PurgeTask(String dataDir, String snapDir, int count) { - logsDir = dataDir; - snapsDir = snapDir; - snapRetainCount = count; - } - - @Override - public void run() { - LOG.info("Purge task started."); - try { - PurgeTxnLog.purge(new File(logsDir), new File(snapsDir), snapRetainCount); - } catch (Exception e) { - LOG.error("Error occured while purging.", e); - } - LOG.info("Purge task completed."); - } - } - - /** - * Returns the status of the purge task. - * - * @return the status of the purge task - */ - public PurgeTaskStatus getPurgeTaskStatus() { - return purgeTaskStatus; - } - - /** - * Returns the snapshot directory. - * - * @return the snapshot directory. - */ - public String getSnapDir() { - return snapDir; - } - - /** - * Returns transaction log directory. - * - * @return the transaction log directory. - */ - public String getDataLogDir() { - return dataLogDir; - } - - /** - * Returns purge interval in hours. - * - * @return the purge interval in hours. - */ - public int getPurgeInterval() { - return purgeInterval; - } - - /** - * Returns the number of snapshots to be retained after purge. - * - * @return the number of snapshots to be retained after purge. - */ - public int getSnapRetainCount() { - return snapRetainCount; - } -} diff --git a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/FinalRequestProcessor.java b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/FinalRequestProcessor.java deleted file mode 100644 index e3cfc4b0e..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/FinalRequestProcessor.java +++ /dev/null @@ -1,418 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you 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. - */ - -package org.apache.zookeeper.server; - -import java.io.IOException; -import java.nio.ByteBuffer; -import java.util.List; - -import org.apache.jute.Record; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.apache.zookeeper.KeeperException; -import org.apache.zookeeper.MultiResponse; -import org.apache.zookeeper.ZooDefs; -import org.apache.zookeeper.KeeperException.Code; -import org.apache.zookeeper.KeeperException.SessionMovedException; -import org.apache.zookeeper.ZooDefs.OpCode; -import org.apache.zookeeper.data.ACL; -import org.apache.zookeeper.data.Stat; -import org.apache.zookeeper.proto.CreateResponse; -import org.apache.zookeeper.proto.ExistsRequest; -import org.apache.zookeeper.proto.ExistsResponse; -import org.apache.zookeeper.proto.GetACLRequest; -import org.apache.zookeeper.proto.GetACLResponse; -import org.apache.zookeeper.proto.GetChildren2Request; -import org.apache.zookeeper.proto.GetChildren2Response; -import org.apache.zookeeper.proto.GetChildrenRequest; -import org.apache.zookeeper.proto.GetChildrenResponse; -import org.apache.zookeeper.proto.GetDataRequest; -import org.apache.zookeeper.proto.GetDataResponse; -import org.apache.zookeeper.proto.ReplyHeader; -import org.apache.zookeeper.proto.SetACLResponse; -import org.apache.zookeeper.proto.SetDataResponse; -import org.apache.zookeeper.proto.SetWatches; -import org.apache.zookeeper.proto.SyncRequest; -import org.apache.zookeeper.proto.SyncResponse; -import org.apache.zookeeper.server.DataTree.ProcessTxnResult; -import org.apache.zookeeper.server.ZooKeeperServer.ChangeRecord; -import org.apache.zookeeper.txn.CreateSessionTxn; -import org.apache.zookeeper.txn.ErrorTxn; -import org.apache.zookeeper.txn.TxnHeader; - -import org.apache.zookeeper.MultiTransactionRecord; -import org.apache.zookeeper.Op; -import org.apache.zookeeper.OpResult; -import org.apache.zookeeper.OpResult.CheckResult; -import org.apache.zookeeper.OpResult.CreateResult; -import org.apache.zookeeper.OpResult.DeleteResult; -import org.apache.zookeeper.OpResult.SetDataResult; -import org.apache.zookeeper.OpResult.ErrorResult; - -/** - * This Request processor actually applies any transaction associated with a - * request and services any queries. It is always at the end of a - * RequestProcessor chain (hence the name), so it does not have a nextProcessor - * member. - * - * This RequestProcessor counts on ZooKeeperServer to populate the - * outstandingRequests member of ZooKeeperServer. - */ -public class FinalRequestProcessor implements RequestProcessor { - private static final Logger LOG = LoggerFactory.getLogger(FinalRequestProcessor.class); - - ZooKeeperServer zks; - - public FinalRequestProcessor(ZooKeeperServer zks) { - this.zks = zks; - } - - public void processRequest(Request request) { - if (LOG.isDebugEnabled()) { - LOG.debug("Processing request:: " + request); - } - // request.addRQRec(">final"); - long traceMask = ZooTrace.CLIENT_REQUEST_TRACE_MASK; - if (request.type == OpCode.ping) { - traceMask = ZooTrace.SERVER_PING_TRACE_MASK; - } - if (LOG.isTraceEnabled()) { - ZooTrace.logRequest(LOG, traceMask, 'E', request, ""); - } - ProcessTxnResult rc = null; - synchronized (zks.outstandingChanges) { - while (!zks.outstandingChanges.isEmpty() - && zks.outstandingChanges.get(0).zxid <= request.zxid) { - ChangeRecord cr = zks.outstandingChanges.remove(0); - if (cr.zxid < request.zxid) { - LOG.warn("Zxid outstanding " - + cr.zxid - + " is less than current " + request.zxid); - } - if (zks.outstandingChangesForPath.get(cr.path) == cr) { - zks.outstandingChangesForPath.remove(cr.path); - } - } - if (request.hdr != null) { - TxnHeader hdr = request.hdr; - Record txn = request.txn; - - rc = zks.processTxn(hdr, txn); - } - // do not add non quorum packets to the queue. - if (Request.isQuorum(request.type)) { - zks.getZKDatabase().addCommittedProposal(request); - } - } - - if (request.hdr != null && request.hdr.getType() == OpCode.closeSession) { - ServerCnxnFactory scxn = zks.getServerCnxnFactory(); - // this might be possible since - // we might just be playing diffs from the leader - if (scxn != null && request.cnxn == null) { - // calling this if we have the cnxn results in the client's - // close session response being lost - we've already closed - // the session/socket here before we can send the closeSession - // in the switch block below - scxn.closeSession(request.sessionId); - return; - } - } - - if (request.cnxn == null) { - return; - } - ServerCnxn cnxn = request.cnxn; - - String lastOp = "NA"; - zks.decInProcess(); - Code err = Code.OK; - Record rsp = null; - boolean closeSession = false; - try { - if (request.hdr != null && request.hdr.getType() == OpCode.error) { - throw KeeperException.create(KeeperException.Code.get(( - (ErrorTxn) request.txn).getErr())); - } - - KeeperException ke = request.getException(); - if (ke != null && request.type != OpCode.multi) { - throw ke; - } - - if (LOG.isDebugEnabled()) { - LOG.debug("{}",request); - } - switch (request.type) { - case OpCode.ping: { - zks.serverStats().updateLatency(request.createTime); - - lastOp = "PING"; - cnxn.updateStatsForResponse(request.cxid, request.zxid, lastOp, - request.createTime, System.currentTimeMillis()); - - cnxn.sendResponse(new ReplyHeader(-2, - zks.getZKDatabase().getDataTreeLastProcessedZxid(), 0), null, "response"); - return; - } - case OpCode.createSession: { - zks.serverStats().updateLatency(request.createTime); - - lastOp = "SESS"; - cnxn.updateStatsForResponse(request.cxid, request.zxid, lastOp, - request.createTime, System.currentTimeMillis()); - - zks.finishSessionInit(request.cnxn, true); - return; - } - case OpCode.multi: { - lastOp = "MULT"; - rsp = new MultiResponse() ; - - for (ProcessTxnResult subTxnResult : rc.multiResult) { - - OpResult subResult ; - - switch (subTxnResult.type) { - case OpCode.check: - subResult = new CheckResult(); - break; - case OpCode.create: - subResult = new CreateResult(subTxnResult.path); - break; - case OpCode.delete: - subResult = new DeleteResult(); - break; - case OpCode.setData: - subResult = new SetDataResult(subTxnResult.stat); - break; - case OpCode.error: - subResult = new ErrorResult(subTxnResult.err) ; - break; - default: - throw new IOException("Invalid type of op"); - } - - ((MultiResponse)rsp).add(subResult); - } - - break; - } - case OpCode.create: { - lastOp = "CREA"; - rsp = new CreateResponse(rc.path); - err = Code.get(rc.err); - break; - } - case OpCode.delete: { - lastOp = "DELE"; - err = Code.get(rc.err); - break; - } - case OpCode.setData: { - lastOp = "SETD"; - rsp = new SetDataResponse(rc.stat); - err = Code.get(rc.err); - break; - } - case OpCode.setACL: { - lastOp = "SETA"; - rsp = new SetACLResponse(rc.stat); - err = Code.get(rc.err); - break; - } - case OpCode.closeSession: { - lastOp = "CLOS"; - closeSession = true; - err = Code.get(rc.err); - break; - } - case OpCode.sync: { - lastOp = "SYNC"; - SyncRequest syncRequest = new SyncRequest(); - ByteBufferInputStream.byteBuffer2Record(request.request, - syncRequest); - rsp = new SyncResponse(syncRequest.getPath()); - break; - } - case OpCode.check: { - lastOp = "CHEC"; - rsp = new SetDataResponse(rc.stat); - err = Code.get(rc.err); - break; - } - case OpCode.exists: { - lastOp = "EXIS"; - // TODO we need to figure out the security requirement for this! - ExistsRequest existsRequest = new ExistsRequest(); - ByteBufferInputStream.byteBuffer2Record(request.request, - existsRequest); - String path = existsRequest.getPath(); - if (path.indexOf('\0') != -1) { - throw new KeeperException.BadArgumentsException(); - } - Stat stat = zks.getZKDatabase().statNode(path, existsRequest - .getWatch() ? cnxn : null); - rsp = new ExistsResponse(stat); - break; - } - case OpCode.getData: { - lastOp = "GETD"; - GetDataRequest getDataRequest = new GetDataRequest(); - ByteBufferInputStream.byteBuffer2Record(request.request, - getDataRequest); - DataNode n = zks.getZKDatabase().getNode(getDataRequest.getPath()); - if (n == null) { - throw new KeeperException.NoNodeException(); - } - Long aclL; - synchronized(n) { - aclL = n.acl; - } - PrepRequestProcessor.checkACL(zks, zks.getZKDatabase().convertLong(aclL), - ZooDefs.Perms.READ, - request.authInfo); - Stat stat = new Stat(); - byte b[] = zks.getZKDatabase().getData(getDataRequest.getPath(), stat, - getDataRequest.getWatch() ? cnxn : null); - rsp = new GetDataResponse(b, stat); - break; - } - case OpCode.setWatches: { - lastOp = "SETW"; - SetWatches setWatches = new SetWatches(); - // XXX We really should NOT need this!!!! - request.request.rewind(); - ByteBufferInputStream.byteBuffer2Record(request.request, setWatches); - long relativeZxid = setWatches.getRelativeZxid(); - zks.getZKDatabase().setWatches(relativeZxid, - setWatches.getDataWatches(), - setWatches.getExistWatches(), - setWatches.getChildWatches(), cnxn); - break; - } - case OpCode.getACL: { - lastOp = "GETA"; - GetACLRequest getACLRequest = new GetACLRequest(); - ByteBufferInputStream.byteBuffer2Record(request.request, - getACLRequest); - Stat stat = new Stat(); - List acl = - zks.getZKDatabase().getACL(getACLRequest.getPath(), stat); - rsp = new GetACLResponse(acl, stat); - break; - } - case OpCode.getChildren: { - lastOp = "GETC"; - GetChildrenRequest getChildrenRequest = new GetChildrenRequest(); - ByteBufferInputStream.byteBuffer2Record(request.request, - getChildrenRequest); - DataNode n = zks.getZKDatabase().getNode(getChildrenRequest.getPath()); - if (n == null) { - throw new KeeperException.NoNodeException(); - } - Long aclG; - synchronized(n) { - aclG = n.acl; - - } - PrepRequestProcessor.checkACL(zks, zks.getZKDatabase().convertLong(aclG), - ZooDefs.Perms.READ, - request.authInfo); - List children = zks.getZKDatabase().getChildren( - getChildrenRequest.getPath(), null, getChildrenRequest - .getWatch() ? cnxn : null); - rsp = new GetChildrenResponse(children); - break; - } - case OpCode.getChildren2: { - lastOp = "GETC"; - GetChildren2Request getChildren2Request = new GetChildren2Request(); - ByteBufferInputStream.byteBuffer2Record(request.request, - getChildren2Request); - Stat stat = new Stat(); - DataNode n = zks.getZKDatabase().getNode(getChildren2Request.getPath()); - if (n == null) { - throw new KeeperException.NoNodeException(); - } - Long aclG; - synchronized(n) { - aclG = n.acl; - } - PrepRequestProcessor.checkACL(zks, zks.getZKDatabase().convertLong(aclG), - ZooDefs.Perms.READ, - request.authInfo); - List children = zks.getZKDatabase().getChildren( - getChildren2Request.getPath(), stat, getChildren2Request - .getWatch() ? cnxn : null); - rsp = new GetChildren2Response(children, stat); - break; - } - } - } catch (SessionMovedException e) { - // session moved is a connection level error, we need to tear - // down the connection otw ZOOKEEPER-710 might happen - // ie client on slow follower starts to renew session, fails - // before this completes, then tries the fast follower (leader) - // and is successful, however the initial renew is then - // successfully fwd/processed by the leader and as a result - // the client and leader disagree on where the client is most - // recently attached (and therefore invalid SESSION MOVED generated) - cnxn.sendCloseSession(); - return; - } catch (KeeperException e) { - err = e.code(); - } catch (Exception e) { - // log at error level as we are returning a marshalling - // error to the user - LOG.error("Failed to process " + request, e); - StringBuilder sb = new StringBuilder(); - ByteBuffer bb = request.request; - bb.rewind(); - while (bb.hasRemaining()) { - sb.append(Integer.toHexString(bb.get() & 0xff)); - } - LOG.error("Dumping request buffer: 0x" + sb.toString()); - err = Code.MARSHALLINGERROR; - } - - long lastZxid = zks.getZKDatabase().getDataTreeLastProcessedZxid(); - ReplyHeader hdr = - new ReplyHeader(request.cxid, lastZxid, err.intValue()); - - zks.serverStats().updateLatency(request.createTime); - cnxn.updateStatsForResponse(request.cxid, lastZxid, lastOp, - request.createTime, System.currentTimeMillis()); - - try { - cnxn.sendResponse(hdr, rsp, "response"); - if (closeSession) { - cnxn.sendCloseSession(); - } - } catch (IOException e) { - LOG.error("FIXMSG",e); - } - } - - public void shutdown() { - // we are the final link in the chain - LOG.info("shutdown of request processor complete"); - } - -} diff --git a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/LogFormatter.java b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/LogFormatter.java deleted file mode 100644 index cd1347d91..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/LogFormatter.java +++ /dev/null @@ -1,106 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you 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. - */ - -package org.apache.zookeeper.server; - -import java.io.ByteArrayInputStream; -import java.io.EOFException; -import java.io.FileInputStream; -import java.io.IOException; -import java.text.DateFormat; -import java.util.Date; -import java.util.zip.Adler32; -import java.util.zip.Checksum; - -import org.apache.jute.BinaryInputArchive; -import org.apache.jute.InputArchive; -import org.apache.jute.Record; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.apache.zookeeper.server.persistence.FileHeader; -import org.apache.zookeeper.server.persistence.FileTxnLog; -import org.apache.zookeeper.server.util.SerializeUtils; -import org.apache.zookeeper.txn.TxnHeader; - -public class LogFormatter { - private static final Logger LOG = LoggerFactory.getLogger(LogFormatter.class); - - /** - * @param args - */ - public static void main(String[] args) throws Exception { - if (args.length != 1) { - System.err.println("USAGE: LogFormatter log_file"); - System.exit(2); - } - FileInputStream fis = new FileInputStream(args[0]); - BinaryInputArchive logStream = BinaryInputArchive.getArchive(fis); - FileHeader fhdr = new FileHeader(); - fhdr.deserialize(logStream, "fileheader"); - - if (fhdr.getMagic() != FileTxnLog.TXNLOG_MAGIC) { - System.err.println("Invalid magic number for " + args[0]); - System.exit(2); - } - System.out.println("ZooKeeper Transactional Log File with dbid " - + fhdr.getDbid() + " txnlog format version " - + fhdr.getVersion()); - - int count = 0; - while (true) { - long crcValue; - byte[] bytes; - try { - crcValue = logStream.readLong("crcvalue"); - - bytes = logStream.readBuffer("txnEntry"); - } catch (EOFException e) { - System.out.println("EOF reached after " + count + " txns."); - return; - } - if (bytes.length == 0) { - // Since we preallocate, we define EOF to be an - // empty transaction - System.out.println("EOF reached after " + count + " txns."); - return; - } - Checksum crc = new Adler32(); - crc.update(bytes, 0, bytes.length); - if (crcValue != crc.getValue()) { - throw new IOException("CRC doesn't match " + crcValue + - " vs " + crc.getValue()); - } - TxnHeader hdr = new TxnHeader(); - Record txn = SerializeUtils.deserializeTxn(bytes, hdr); - System.out.println(DateFormat.getDateTimeInstance(DateFormat.SHORT, - DateFormat.LONG).format(new Date(hdr.getTime())) - + " session 0x" - + Long.toHexString(hdr.getClientId()) - + " cxid 0x" - + Long.toHexString(hdr.getCxid()) - + " zxid 0x" - + Long.toHexString(hdr.getZxid()) - + " " + TraceFormatter.op2String(hdr.getType()) + " " + txn); - if (logStream.readByte("EOR") != 'B') { - LOG.error("Last transaction was partial."); - throw new EOFException("Last transaction was partial."); - } - count++; - } - } -} diff --git a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/NIOServerCnxn.java b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/NIOServerCnxn.java deleted file mode 100644 index d832ad93f..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/NIOServerCnxn.java +++ /dev/null @@ -1,1162 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you 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. - */ - -package org.apache.zookeeper.server; - -import java.io.BufferedWriter; -import java.io.ByteArrayOutputStream; -import java.io.IOException; -import java.io.PrintWriter; -import java.io.Writer; -import java.net.InetAddress; -import java.net.InetSocketAddress; -import java.nio.ByteBuffer; -import java.nio.channels.CancelledKeyException; -import java.nio.channels.SelectionKey; -import java.nio.channels.SocketChannel; -import java.util.HashSet; -import java.util.List; -import java.util.Set; -import java.util.concurrent.LinkedBlockingQueue; - -import org.apache.jute.BinaryInputArchive; -import org.apache.jute.BinaryOutputArchive; -import org.apache.jute.Record; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.apache.zookeeper.Environment; -import org.apache.zookeeper.Version; -import org.apache.zookeeper.WatchedEvent; -import org.apache.zookeeper.data.Id; -import org.apache.zookeeper.proto.ReplyHeader; -import org.apache.zookeeper.proto.RequestHeader; -import org.apache.zookeeper.proto.WatcherEvent; -import org.apache.zookeeper.server.quorum.Leader; -import org.apache.zookeeper.server.quorum.LeaderZooKeeperServer; -import org.apache.zookeeper.server.quorum.ReadOnlyZooKeeperServer; -import org.apache.zookeeper.server.util.OSMXBean; - -/** - * This class handles communication with clients using NIO. There is one per - * client, but only one thread doing the communication. - */ -public class NIOServerCnxn extends ServerCnxn { - static final Logger LOG = LoggerFactory.getLogger(NIOServerCnxn.class); - - NIOServerCnxnFactory factory; - - final SocketChannel sock; - - private final SelectionKey sk; - - boolean initialized; - - ByteBuffer lenBuffer = ByteBuffer.allocate(4); - - ByteBuffer incomingBuffer = lenBuffer; - - LinkedBlockingQueue outgoingBuffers = new LinkedBlockingQueue(); - - int sessionTimeout; - - private final ZooKeeperServer zkServer; - - /** - * The number of requests that have been submitted but not yet responded to. - */ - int outstandingRequests; - - /** - * This is the id that uniquely identifies the session of a client. Once - * this session is no longer active, the ephemeral nodes will go away. - */ - long sessionId; - - static long nextSessionId = 1; - int outstandingLimit = 1; - - public NIOServerCnxn(ZooKeeperServer zk, SocketChannel sock, - SelectionKey sk, NIOServerCnxnFactory factory) throws IOException { - this.zkServer = zk; - this.sock = sock; - this.sk = sk; - this.factory = factory; - if (this.factory.login != null) { - this.zooKeeperSaslServer = new ZooKeeperSaslServer(factory.login); - } - if (zk != null) { - outstandingLimit = zk.getGlobalOutstandingLimit(); - } - sock.socket().setTcpNoDelay(true); - /* set socket linger to false, so that socket close does not - * block */ - sock.socket().setSoLinger(false, -1); - InetAddress addr = ((InetSocketAddress) sock.socket() - .getRemoteSocketAddress()).getAddress(); - authInfo.add(new Id("ip", addr.getHostAddress())); - sk.interestOps(SelectionKey.OP_READ); - } - - /* Send close connection packet to the client, doIO will eventually - * close the underlying machinery (like socket, selectorkey, etc...) - */ - public void sendCloseSession() { - sendBuffer(ServerCnxnFactory.closeConn); - } - - /** - * send buffer without using the asynchronous - * calls to selector and then close the socket - * @param bb - */ - void sendBufferSync(ByteBuffer bb) { - try { - /* configure socket to be blocking - * so that we dont have to do write in - * a tight while loop - */ - sock.configureBlocking(true); - if (bb != ServerCnxnFactory.closeConn) { - if (sock.isOpen()) { - sock.write(bb); - } - packetSent(); - } - } catch (IOException ie) { - LOG.error("Error sending data synchronously ", ie); - } - } - - public void sendBuffer(ByteBuffer bb) { - try { - if (bb != ServerCnxnFactory.closeConn) { - // We check if write interest here because if it is NOT set, - // nothing is queued, so we can try to send the buffer right - // away without waking up the selector - if ((sk.interestOps() & SelectionKey.OP_WRITE) == 0) { - try { - sock.write(bb); - } catch (IOException e) { - // we are just doing best effort right now - } - } - // if there is nothing left to send, we are done - if (bb.remaining() == 0) { - packetSent(); - return; - } - } - - synchronized(this.factory){ - sk.selector().wakeup(); - if (LOG.isTraceEnabled()) { - LOG.trace("Add a buffer to outgoingBuffers, sk " + sk - + " is valid: " + sk.isValid()); - } - outgoingBuffers.add(bb); - if (sk.isValid()) { - sk.interestOps(sk.interestOps() | SelectionKey.OP_WRITE); - } - } - - } catch(Exception e) { - LOG.error("Unexpected Exception: ", e); - } - } - - /** Read the request payload (everything following the length prefix) */ - private void readPayload() throws IOException, InterruptedException { - if (incomingBuffer.remaining() != 0) { // have we read length bytes? - int rc = sock.read(incomingBuffer); // sock is non-blocking, so ok - if (rc < 0) { - throw new EndOfStreamException( - "Unable to read additional data from client sessionid 0x" - + Long.toHexString(sessionId) - + ", likely client has closed socket"); - } - } - - if (incomingBuffer.remaining() == 0) { // have we read length bytes? - packetReceived(); - incomingBuffer.flip(); - if (!initialized) { - readConnectRequest(); - } else { - readRequest(); - } - lenBuffer.clear(); - incomingBuffer = lenBuffer; - } - } - - /** - * Only used in order to allow testing - */ - protected boolean isSocketOpen() { - return sock.isOpen(); - } - - /** - * Handles read/write IO on connection. - */ - void doIO(SelectionKey k) throws InterruptedException { - try { - if (isSocketOpen() == false) { - LOG.warn("trying to do i/o on a null socket for session:0x" - + Long.toHexString(sessionId)); - - return; - } - if (k.isReadable()) { - int rc = sock.read(incomingBuffer); - if (rc < 0) { - throw new EndOfStreamException( - "Unable to read additional data from client sessionid 0x" - + Long.toHexString(sessionId) - + ", likely client has closed socket"); - } - if (incomingBuffer.remaining() == 0) { - boolean isPayload; - if (incomingBuffer == lenBuffer) { // start of next request - incomingBuffer.flip(); - isPayload = readLength(k); - incomingBuffer.clear(); - } else { - // continuation - isPayload = true; - } - if (isPayload) { // not the case for 4letterword - readPayload(); - } - else { - // four letter words take care - // need not do anything else - return; - } - } - } - if (k.isWritable()) { - // ZooLog.logTraceMessage(LOG, - // ZooLog.CLIENT_DATA_PACKET_TRACE_MASK - // "outgoingBuffers.size() = " + - // outgoingBuffers.size()); - if (outgoingBuffers.size() > 0) { - // ZooLog.logTraceMessage(LOG, - // ZooLog.CLIENT_DATA_PACKET_TRACE_MASK, - // "sk " + k + " is valid: " + - // k.isValid()); - - /* - * This is going to reset the buffer position to 0 and the - * limit to the size of the buffer, so that we can fill it - * with data from the non-direct buffers that we need to - * send. - */ - ByteBuffer directBuffer = factory.directBuffer; - directBuffer.clear(); - - for (ByteBuffer b : outgoingBuffers) { - if (directBuffer.remaining() < b.remaining()) { - /* - * When we call put later, if the directBuffer is to - * small to hold everything, nothing will be copied, - * so we've got to slice the buffer if it's too big. - */ - b = (ByteBuffer) b.slice().limit( - directBuffer.remaining()); - } - /* - * put() is going to modify the positions of both - * buffers, put we don't want to change the position of - * the source buffers (we'll do that after the send, if - * needed), so we save and reset the position after the - * copy - */ - int p = b.position(); - directBuffer.put(b); - b.position(p); - if (directBuffer.remaining() == 0) { - break; - } - } - /* - * Do the flip: limit becomes position, position gets set to - * 0. This sets us up for the write. - */ - directBuffer.flip(); - - int sent = sock.write(directBuffer); - ByteBuffer bb; - - // Remove the buffers that we have sent - while (outgoingBuffers.size() > 0) { - bb = outgoingBuffers.peek(); - if (bb == ServerCnxnFactory.closeConn) { - throw new CloseRequestException("close requested"); - } - int left = bb.remaining() - sent; - if (left > 0) { - /* - * We only partially sent this buffer, so we update - * the position and exit the loop. - */ - bb.position(bb.position() + sent); - break; - } - packetSent(); - /* We've sent the whole buffer, so drop the buffer */ - sent -= bb.remaining(); - outgoingBuffers.remove(); - } - // ZooLog.logTraceMessage(LOG, - // ZooLog.CLIENT_DATA_PACKET_TRACE_MASK, "after send, - // outgoingBuffers.size() = " + outgoingBuffers.size()); - } - - synchronized(this.factory){ - if (outgoingBuffers.size() == 0) { - if (!initialized - && (sk.interestOps() & SelectionKey.OP_READ) == 0) { - throw new CloseRequestException("responded to info probe"); - } - sk.interestOps(sk.interestOps() - & (~SelectionKey.OP_WRITE)); - } else { - sk.interestOps(sk.interestOps() - | SelectionKey.OP_WRITE); - } - } - } - } catch (CancelledKeyException e) { - LOG.warn("Exception causing close of session 0x" - + Long.toHexString(sessionId) - + " due to " + e); - if (LOG.isDebugEnabled()) { - LOG.debug("CancelledKeyException stack trace", e); - } - close(); - } catch (CloseRequestException e) { - // expecting close to log session closure - close(); - } catch (EndOfStreamException e) { - LOG.warn("caught end of stream exception",e); // tell user why - - // expecting close to log session closure - close(); - } catch (IOException e) { - LOG.warn("Exception causing close of session 0x" - + Long.toHexString(sessionId) - + " due to " + e); - if (LOG.isDebugEnabled()) { - LOG.debug("IOException stack trace", e); - } - close(); - } - } - - private void readRequest() throws IOException { - zkServer.processPacket(this, incomingBuffer); - } - - protected void incrOutstandingRequests(RequestHeader h) { - if (h.getXid() >= 0) { - synchronized (this) { - outstandingRequests++; - } - synchronized (this.factory) { - // check throttling - if (zkServer.getInProcess() > outstandingLimit) { - if (LOG.isDebugEnabled()) { - LOG.debug("Throttling recv " + zkServer.getInProcess()); - } - disableRecv(); - // following lines should not be needed since we are - // already reading - // } else { - // enableRecv(); - } - } - } - - } - - public void disableRecv() { - sk.interestOps(sk.interestOps() & (~SelectionKey.OP_READ)); - } - - public void enableRecv() { - synchronized (this.factory) { - sk.selector().wakeup(); - if (sk.isValid()) { - int interest = sk.interestOps(); - if ((interest & SelectionKey.OP_READ) == 0) { - sk.interestOps(interest | SelectionKey.OP_READ); - } - } - } - } - - private void readConnectRequest() throws IOException, InterruptedException { - if (zkServer == null) { - throw new IOException("ZooKeeperServer not running"); - } - zkServer.processConnectRequest(this, incomingBuffer); - initialized = true; - } - - /** - * clean up the socket related to a command and also make sure we flush the - * data before we do that - * - * @param pwriter - * the pwriter for a command socket - */ - private void cleanupWriterSocket(PrintWriter pwriter) { - try { - if (pwriter != null) { - pwriter.flush(); - pwriter.close(); - } - } catch (Exception e) { - LOG.info("Error closing PrintWriter ", e); - } finally { - try { - close(); - } catch (Exception e) { - LOG.error("Error closing a command socket ", e); - } - } - } - - /** - * This class wraps the sendBuffer method of NIOServerCnxn. It is - * responsible for chunking up the response to a client. Rather - * than cons'ing up a response fully in memory, which may be large - * for some commands, this class chunks up the result. - */ - private class SendBufferWriter extends Writer { - private StringBuffer sb = new StringBuffer(); - - /** - * Check if we are ready to send another chunk. - * @param force force sending, even if not a full chunk - */ - private void checkFlush(boolean force) { - if ((force && sb.length() > 0) || sb.length() > 2048) { - sendBufferSync(ByteBuffer.wrap(sb.toString().getBytes())); - // clear our internal buffer - sb.setLength(0); - } - } - - @Override - public void close() throws IOException { - if (sb == null) return; - checkFlush(true); - sb = null; // clear out the ref to ensure no reuse - } - - @Override - public void flush() throws IOException { - checkFlush(true); - } - - @Override - public void write(char[] cbuf, int off, int len) throws IOException { - sb.append(cbuf, off, len); - checkFlush(false); - } - } - - private static final String ZK_NOT_SERVING = - "This ZooKeeper instance is not currently serving requests"; - - /** - * Set of threads for commmand ports. All the 4 - * letter commands are run via a thread. Each class - * maps to a corresponding 4 letter command. CommandThread - * is the abstract class from which all the others inherit. - */ - private abstract class CommandThread extends Thread { - PrintWriter pw; - - CommandThread(PrintWriter pw) { - this.pw = pw; - } - - public void run() { - try { - commandRun(); - } catch (IOException ie) { - LOG.error("Error in running command ", ie); - } finally { - cleanupWriterSocket(pw); - } - } - - public abstract void commandRun() throws IOException; - } - - private class RuokCommand extends CommandThread { - public RuokCommand(PrintWriter pw) { - super(pw); - } - - @Override - public void commandRun() { - pw.print("imok"); - - } - } - - private class TraceMaskCommand extends CommandThread { - TraceMaskCommand(PrintWriter pw) { - super(pw); - } - - @Override - public void commandRun() { - long traceMask = ZooTrace.getTextTraceLevel(); - pw.print(traceMask); - } - } - - private class SetTraceMaskCommand extends CommandThread { - long trace = 0; - SetTraceMaskCommand(PrintWriter pw, long trace) { - super(pw); - this.trace = trace; - } - - @Override - public void commandRun() { - pw.print(trace); - } - } - - private class EnvCommand extends CommandThread { - EnvCommand(PrintWriter pw) { - super(pw); - } - - @Override - public void commandRun() { - List env = Environment.list(); - - pw.println("Environment:"); - for(Environment.Entry e : env) { - pw.print(e.getKey()); - pw.print("="); - pw.println(e.getValue()); - } - - } - } - - private class ConfCommand extends CommandThread { - ConfCommand(PrintWriter pw) { - super(pw); - } - - @Override - public void commandRun() { - if (zkServer == null) { - pw.println(ZK_NOT_SERVING); - } else { - zkServer.dumpConf(pw); - } - } - } - - private class StatResetCommand extends CommandThread { - public StatResetCommand(PrintWriter pw) { - super(pw); - } - - @Override - public void commandRun() { - if (zkServer == null) { - pw.println(ZK_NOT_SERVING); - } - else { - zkServer.serverStats().reset(); - pw.println("Server stats reset."); - } - } - } - - private class CnxnStatResetCommand extends CommandThread { - public CnxnStatResetCommand(PrintWriter pw) { - super(pw); - } - - @Override - public void commandRun() { - if (zkServer == null) { - pw.println(ZK_NOT_SERVING); - } else { - synchronized(factory.cnxns){ - for(ServerCnxn c : factory.cnxns){ - c.resetStats(); - } - } - pw.println("Connection stats reset."); - } - } - } - - private class DumpCommand extends CommandThread { - public DumpCommand(PrintWriter pw) { - super(pw); - } - - @Override - public void commandRun() { - if (zkServer == null) { - pw.println(ZK_NOT_SERVING); - } - else { - pw.println("SessionTracker dump:"); - zkServer.sessionTracker.dumpSessions(pw); - pw.println("ephemeral nodes dump:"); - zkServer.dumpEphemerals(pw); - } - } - } - - private class StatCommand extends CommandThread { - int len; - public StatCommand(PrintWriter pw, int len) { - super(pw); - this.len = len; - } - - @SuppressWarnings("unchecked") - @Override - public void commandRun() { - if (zkServer == null) { - pw.println(ZK_NOT_SERVING); - } - else { - pw.print("Zookeeper version: "); - pw.println(Version.getFullVersion()); - if (zkServer instanceof ReadOnlyZooKeeperServer) { - pw.println("READ-ONLY mode; serving only " + - "read-only clients"); - } - if (len == statCmd) { - LOG.info("Stat command output"); - pw.println("Clients:"); - // clone should be faster than iteration - // ie give up the cnxns lock faster - HashSet cnxnset; - synchronized(factory.cnxns){ - cnxnset = (HashSet)factory - .cnxns.clone(); - } - for(NIOServerCnxn c : cnxnset){ - c.dumpConnectionInfo(pw, true); - pw.println(); - } - pw.println(); - } - pw.print(zkServer.serverStats().toString()); - pw.print("Node count: "); - pw.println(zkServer.getZKDatabase().getNodeCount()); - } - - } - } - - private class ConsCommand extends CommandThread { - public ConsCommand(PrintWriter pw) { - super(pw); - } - - @SuppressWarnings("unchecked") - @Override - public void commandRun() { - if (zkServer == null) { - pw.println(ZK_NOT_SERVING); - } else { - // clone should be faster than iteration - // ie give up the cnxns lock faster - HashSet cnxns; - synchronized (factory.cnxns) { - cnxns = (HashSet) factory.cnxns.clone(); - } - for (NIOServerCnxn c : cnxns) { - c.dumpConnectionInfo(pw, false); - pw.println(); - } - pw.println(); - } - } - } - - private class WatchCommand extends CommandThread { - int len = 0; - public WatchCommand(PrintWriter pw, int len) { - super(pw); - this.len = len; - } - - @Override - public void commandRun() { - if (zkServer == null) { - pw.println(ZK_NOT_SERVING); - } else { - DataTree dt = zkServer.getZKDatabase().getDataTree(); - if (len == wchsCmd) { - dt.dumpWatchesSummary(pw); - } else if (len == wchpCmd) { - dt.dumpWatches(pw, true); - } else { - dt.dumpWatches(pw, false); - } - pw.println(); - } - } - } - - private class MonitorCommand extends CommandThread { - - MonitorCommand(PrintWriter pw) { - super(pw); - } - - @Override - public void commandRun() { - if(zkServer == null) { - pw.println(ZK_NOT_SERVING); - return; - } - ZKDatabase zkdb = zkServer.getZKDatabase(); - ServerStats stats = zkServer.serverStats(); - - print("version", Version.getFullVersion()); - - print("avg_latency", stats.getAvgLatency()); - print("max_latency", stats.getMaxLatency()); - print("min_latency", stats.getMinLatency()); - - print("packets_received", stats.getPacketsReceived()); - print("packets_sent", stats.getPacketsSent()); - print("num_alive_connections", stats.getNumAliveClientConnections()); - - print("outstanding_requests", stats.getOutstandingRequests()); - - print("server_state", stats.getServerState()); - print("znode_count", zkdb.getNodeCount()); - - print("watch_count", zkdb.getDataTree().getWatchCount()); - print("ephemerals_count", zkdb.getDataTree().getEphemeralsCount()); - print("approximate_data_size", zkdb.getDataTree().approximateDataSize()); - - OSMXBean osMbean = new OSMXBean(); - if (osMbean != null && osMbean.getUnix() == true) { - print("open_file_descriptor_count", osMbean.getOpenFileDescriptorCount()); - print("max_file_descriptor_count", osMbean.getMaxFileDescriptorCount()); - } - - if(stats.getServerState().equals("leader")) { - Leader leader = ((LeaderZooKeeperServer)zkServer).getLeader(); - - print("followers", leader.getLearners().size()); - print("synced_followers", leader.getForwardingFollowers().size()); - print("pending_syncs", leader.getNumPendingSyncs()); - } - } - - private void print(String key, long number) { - print(key, "" + number); - } - - private void print(String key, String value) { - pw.print("zk_"); - pw.print(key); - pw.print("\t"); - pw.println(value); - } - - } - - private class IsroCommand extends CommandThread { - - public IsroCommand(PrintWriter pw) { - super(pw); - } - - @Override - public void commandRun() { - if (zkServer == null) { - pw.print("null"); - } else if (zkServer instanceof ReadOnlyZooKeeperServer) { - pw.print("ro"); - } else { - pw.print("rw"); - } - } - } - - /** Return if four letter word found and responded to, otw false **/ - private boolean checkFourLetterWord(final SelectionKey k, final int len) - throws IOException - { - // We take advantage of the limited size of the length to look - // for cmds. They are all 4-bytes which fits inside of an int - String cmd = cmd2String.get(len); - if (cmd == null) { - return false; - } - LOG.info("Processing " + cmd + " command from " - + sock.socket().getRemoteSocketAddress()); - packetReceived(); - - /** cancel the selection key to remove the socket handling - * from selector. This is to prevent netcat problem wherein - * netcat immediately closes the sending side after sending the - * commands and still keeps the receiving channel open. - * The idea is to remove the selectionkey from the selector - * so that the selector does not notice the closed read on the - * socket channel and keep the socket alive to write the data to - * and makes sure to close the socket after its done writing the data - */ - if (k != null) { - try { - k.cancel(); - } catch(Exception e) { - LOG.error("Error cancelling command selection key ", e); - } - } - - final PrintWriter pwriter = new PrintWriter( - new BufferedWriter(new SendBufferWriter())); - if (len == ruokCmd) { - RuokCommand ruok = new RuokCommand(pwriter); - ruok.start(); - return true; - } else if (len == getTraceMaskCmd) { - TraceMaskCommand tmask = new TraceMaskCommand(pwriter); - tmask.start(); - return true; - } else if (len == setTraceMaskCmd) { - int rc = sock.read(incomingBuffer); - if (rc < 0) { - throw new IOException("Read error"); - } - - incomingBuffer.flip(); - long traceMask = incomingBuffer.getLong(); - ZooTrace.setTextTraceLevel(traceMask); - SetTraceMaskCommand setMask = new SetTraceMaskCommand(pwriter, traceMask); - setMask.start(); - return true; - } else if (len == enviCmd) { - EnvCommand env = new EnvCommand(pwriter); - env.start(); - return true; - } else if (len == confCmd) { - ConfCommand ccmd = new ConfCommand(pwriter); - ccmd.start(); - return true; - } else if (len == srstCmd) { - StatResetCommand strst = new StatResetCommand(pwriter); - strst.start(); - return true; - } else if (len == crstCmd) { - CnxnStatResetCommand crst = new CnxnStatResetCommand(pwriter); - crst.start(); - return true; - } else if (len == dumpCmd) { - DumpCommand dump = new DumpCommand(pwriter); - dump.start(); - return true; - } else if (len == statCmd || len == srvrCmd) { - StatCommand stat = new StatCommand(pwriter, len); - stat.start(); - return true; - } else if (len == consCmd) { - ConsCommand cons = new ConsCommand(pwriter); - cons.start(); - return true; - } else if (len == wchpCmd || len == wchcCmd || len == wchsCmd) { - WatchCommand wcmd = new WatchCommand(pwriter, len); - wcmd.start(); - return true; - } else if (len == mntrCmd) { - MonitorCommand mntr = new MonitorCommand(pwriter); - mntr.start(); - return true; - } else if (len == isroCmd) { - IsroCommand isro = new IsroCommand(pwriter); - isro.start(); - return true; - } - return false; - } - - /** Reads the first 4 bytes of lenBuffer, which could be true length or - * four letter word. - * - * @param k selection key - * @return true if length read, otw false (wasn't really the length) - * @throws IOException if buffer size exceeds maxBuffer size - */ - private boolean readLength(SelectionKey k) throws IOException { - // Read the length, now get the buffer - int len = lenBuffer.getInt(); - if (!initialized && checkFourLetterWord(sk, len)) { - return false; - } - if (len < 0 || len > BinaryInputArchive.maxBuffer) { - throw new IOException("Len error " + len); - } - if (zkServer == null) { - throw new IOException("ZooKeeperServer not running"); - } - incomingBuffer = ByteBuffer.allocate(len); - return true; - } - - public long getOutstandingRequests() { - synchronized (this) { - synchronized (this.factory) { - return outstandingRequests; - } - } - } - - /* - * (non-Javadoc) - * - * @see org.apache.zookeeper.server.ServerCnxnIface#getSessionTimeout() - */ - public int getSessionTimeout() { - return sessionTimeout; - } - - @Override - public String toString() { - return "NIOServerCnxn object with sock = " + sock + " and sk = " + sk; - } - - /* - * Close the cnxn and remove it from the factory cnxns list. - * - * This function returns immediately if the cnxn is not on the cnxns list. - */ - @Override - public void close() { - synchronized(factory.cnxns){ - // if this is not in cnxns then it's already closed - if (!factory.cnxns.remove(this)) { - return; - } - - synchronized (factory.ipMap) { - Set s = - factory.ipMap.get(sock.socket().getInetAddress()); - s.remove(this); - } - - factory.unregisterConnection(this); - - if (zkServer != null) { - zkServer.removeCnxn(this); - } - - closeSock(); - - if (sk != null) { - try { - // need to cancel this selection key from the selector - sk.cancel(); - } catch (Exception e) { - if (LOG.isDebugEnabled()) { - LOG.debug("ignoring exception during selectionkey cancel", e); - } - } - } - } - } - - /** - * Close resources associated with the sock of this cnxn. - */ - private void closeSock() { - if (sock.isOpen() == false) { - return; - } - - LOG.info("Closed socket connection for client " - + sock.socket().getRemoteSocketAddress() - + (sessionId != 0 ? - " which had sessionid 0x" + Long.toHexString(sessionId) : - " (no session established for client)")); - try { - /* - * The following sequence of code is stupid! You would think that - * only sock.close() is needed, but alas, it doesn't work that way. - * If you just do sock.close() there are cases where the socket - * doesn't actually close... - */ - sock.socket().shutdownOutput(); - } catch (IOException e) { - // This is a relatively common exception that we can't avoid - if (LOG.isDebugEnabled()) { - LOG.debug("ignoring exception during output shutdown", e); - } - } - try { - sock.socket().shutdownInput(); - } catch (IOException e) { - // This is a relatively common exception that we can't avoid - if (LOG.isDebugEnabled()) { - LOG.debug("ignoring exception during input shutdown", e); - } - } - try { - sock.socket().close(); - } catch (IOException e) { - if (LOG.isDebugEnabled()) { - LOG.debug("ignoring exception during socket close", e); - } - } - try { - sock.close(); - // XXX The next line doesn't seem to be needed, but some posts - // to forums suggest that it is needed. Keep in mind if errors in - // this section arise. - // factory.selector.wakeup(); - } catch (IOException e) { - if (LOG.isDebugEnabled()) { - LOG.debug("ignoring exception during socketchannel close", e); - } - } - } - - private final static byte fourBytes[] = new byte[4]; - - /* - * (non-Javadoc) - * - * @see org.apache.zookeeper.server.ServerCnxnIface#sendResponse(org.apache.zookeeper.proto.ReplyHeader, - * org.apache.jute.Record, java.lang.String) - */ - @Override - synchronized public void sendResponse(ReplyHeader h, Record r, String tag) { - try { - ByteArrayOutputStream baos = new ByteArrayOutputStream(); - // Make space for length - BinaryOutputArchive bos = BinaryOutputArchive.getArchive(baos); - try { - baos.write(fourBytes); - bos.writeRecord(h, "header"); - if (r != null) { - bos.writeRecord(r, tag); - } - baos.close(); - } catch (IOException e) { - LOG.error("Error serializing response"); - } - byte b[] = baos.toByteArray(); - ByteBuffer bb = ByteBuffer.wrap(b); - bb.putInt(b.length - 4).rewind(); - sendBuffer(bb); - if (h.getXid() > 0) { - synchronized(this){ - outstandingRequests--; - } - // check throttling - synchronized (this.factory) { - if (zkServer.getInProcess() < outstandingLimit - || outstandingRequests < 1) { - sk.selector().wakeup(); - enableRecv(); - } - } - } - } catch(Exception e) { - LOG.warn("Unexpected exception. Destruction averted.", e); - } - } - - /* - * (non-Javadoc) - * - * @see org.apache.zookeeper.server.ServerCnxnIface#process(org.apache.zookeeper.proto.WatcherEvent) - */ - @Override - synchronized public void process(WatchedEvent event) { - ReplyHeader h = new ReplyHeader(-1, -1L, 0); - if (LOG.isTraceEnabled()) { - ZooTrace.logTraceMessage(LOG, ZooTrace.EVENT_DELIVERY_TRACE_MASK, - "Deliver event " + event + " to 0x" - + Long.toHexString(this.sessionId) - + " through " + this); - } - - // Convert WatchedEvent to a type that can be sent over the wire - WatcherEvent e = event.getWrapper(); - - sendResponse(h, e, "notification"); - } - - /* - * (non-Javadoc) - * - * @see org.apache.zookeeper.server.ServerCnxnIface#getSessionId() - */ - @Override - public long getSessionId() { - return sessionId; - } - - @Override - public void setSessionId(long sessionId) { - this.sessionId = sessionId; - } - - @Override - public void setSessionTimeout(int sessionTimeout) { - this.sessionTimeout = sessionTimeout; - } - - @Override - public int getInterestOps() { - return sk.isValid() ? sk.interestOps() : 0; - } - - @Override - public InetSocketAddress getRemoteSocketAddress() { - if (sock.isOpen() == false) { - return null; - } - return (InetSocketAddress) sock.socket().getRemoteSocketAddress(); - } - - @Override - protected ServerStats serverStats() { - if (zkServer == null) { - return null; - } - return zkServer.serverStats(); - } - -} diff --git a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/NIOServerCnxnFactory.java b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/NIOServerCnxnFactory.java deleted file mode 100644 index 8b4c46bc9..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/NIOServerCnxnFactory.java +++ /dev/null @@ -1,309 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you 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. - */ - -package org.apache.zookeeper.server; - -import java.io.IOException; -import java.net.InetAddress; -import java.net.InetSocketAddress; -import java.nio.ByteBuffer; -import java.nio.channels.SelectionKey; -import java.nio.channels.Selector; -import java.nio.channels.ServerSocketChannel; -import java.nio.channels.SocketChannel; -import java.util.ArrayList; -import java.util.Collections; -import java.util.HashMap; -import java.util.HashSet; -import java.util.Set; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -public class NIOServerCnxnFactory extends ServerCnxnFactory implements Runnable { - private static final Logger LOG = LoggerFactory.getLogger(NIOServerCnxnFactory.class); - - static { - Thread.setDefaultUncaughtExceptionHandler(new Thread.UncaughtExceptionHandler() { - public void uncaughtException(Thread t, Throwable e) { - LOG.error("Thread " + t + " died", e); - } - }); - /** - * this is to avoid the jvm bug: - * NullPointerException in Selector.open() - * http://bugs.sun.com/view_bug.do?bug_id=6427854 - */ - try { - Selector.open().close(); - } catch(IOException ie) { - LOG.error("Selector failed to open", ie); - } - } - - ServerSocketChannel ss; - - final Selector selector = Selector.open(); - - /** - * We use this buffer to do efficient socket I/O. Since there is a single - * sender thread per NIOServerCnxn instance, we can use a member variable to - * only allocate it once. - */ - final ByteBuffer directBuffer = ByteBuffer.allocateDirect(64 * 1024); - - final HashMap> ipMap = - new HashMap>( ); - - int maxClientCnxns = 60; - - /** - * Construct a new server connection factory which will accept an unlimited number - * of concurrent connections from each client (up to the file descriptor - * limits of the operating system). startup(zks) must be called subsequently. - * @throws IOException - */ - public NIOServerCnxnFactory() throws IOException { - } - - Thread thread; - @Override - public void configure(InetSocketAddress addr, int maxcc) throws IOException { - configureSaslLogin(); - - thread = new Thread(this, "NIOServerCxn.Factory:" + addr); - thread.setDaemon(true); - maxClientCnxns = maxcc; - this.ss = ServerSocketChannel.open(); - ss.socket().setReuseAddress(true); - LOG.info("binding to port " + addr); - ss.socket().bind(addr); - ss.configureBlocking(false); - ss.register(selector, SelectionKey.OP_ACCEPT); - } - - /** {@inheritDoc} */ - public int getMaxClientCnxnsPerHost() { - return maxClientCnxns; - } - - /** {@inheritDoc} */ - public void setMaxClientCnxnsPerHost(int max) { - maxClientCnxns = max; - } - - @Override - public void start() { - // ensure thread is started once and only once - if (thread.getState() == Thread.State.NEW) { - thread.start(); - } - } - - @Override - public void startup(ZooKeeperServer zks) throws IOException, - InterruptedException { - start(); - zks.startdata(); - zks.startup(); - setZooKeeperServer(zks); - } - - @Override - public InetSocketAddress getLocalAddress(){ - return (InetSocketAddress)ss.socket().getLocalSocketAddress(); - } - - @Override - public int getLocalPort(){ - return ss.socket().getLocalPort(); - } - - private void addCnxn(NIOServerCnxn cnxn) { - synchronized (cnxns) { - cnxns.add(cnxn); - synchronized (ipMap){ - InetAddress addr = cnxn.sock.socket().getInetAddress(); - Set s = ipMap.get(addr); - if (s == null) { - // in general we will see 1 connection from each - // host, setting the initial cap to 2 allows us - // to minimize mem usage in the common case - // of 1 entry -- we need to set the initial cap - // to 2 to avoid rehash when the first entry is added - s = new HashSet(2); - s.add(cnxn); - ipMap.put(addr,s); - } else { - s.add(cnxn); - } - } - } - } - - protected NIOServerCnxn createConnection(SocketChannel sock, - SelectionKey sk) throws IOException { - return new NIOServerCnxn(zkServer, sock, sk, this); - } - - private int getClientCnxnCount(InetAddress cl) { - // The ipMap lock covers both the map, and its contents - // (that is, the cnxn sets shouldn't be modified outside of - // this lock) - synchronized (ipMap) { - Set s = ipMap.get(cl); - if (s == null) return 0; - return s.size(); - } - } - - public void run() { - while (!ss.socket().isClosed()) { - try { - selector.select(1000); - Set selected; - synchronized (this) { - selected = selector.selectedKeys(); - } - ArrayList selectedList = new ArrayList( - selected); - Collections.shuffle(selectedList); - for (SelectionKey k : selectedList) { - if ((k.readyOps() & SelectionKey.OP_ACCEPT) != 0) { - SocketChannel sc = ((ServerSocketChannel) k - .channel()).accept(); - InetAddress ia = sc.socket().getInetAddress(); - int cnxncount = getClientCnxnCount(ia); - if (maxClientCnxns > 0 && cnxncount >= maxClientCnxns){ - LOG.warn("Too many connections from " + ia - + " - max is " + maxClientCnxns ); - sc.close(); - } else { - LOG.info("Accepted socket connection from " - + sc.socket().getRemoteSocketAddress()); - sc.configureBlocking(false); - SelectionKey sk = sc.register(selector, - SelectionKey.OP_READ); - NIOServerCnxn cnxn = createConnection(sc, sk); - sk.attach(cnxn); - addCnxn(cnxn); - } - } else if ((k.readyOps() & (SelectionKey.OP_READ | SelectionKey.OP_WRITE)) != 0) { - NIOServerCnxn c = (NIOServerCnxn) k.attachment(); - c.doIO(k); - } else { - if (LOG.isDebugEnabled()) { - LOG.debug("Unexpected ops in select " - + k.readyOps()); - } - } - } - selected.clear(); - } catch (RuntimeException e) { - LOG.warn("Ignoring unexpected runtime exception", e); - } catch (Exception e) { - LOG.warn("Ignoring exception", e); - } - } - closeAll(); - LOG.info("NIOServerCnxn factory exited run method"); - } - - /** - * clear all the connections in the selector - * - */ - @Override - @SuppressWarnings("unchecked") - synchronized public void closeAll() { - selector.wakeup(); - HashSet cnxns; - synchronized (this.cnxns) { - cnxns = (HashSet)this.cnxns.clone(); - } - // got to clear all the connections that we have in the selector - for (NIOServerCnxn cnxn: cnxns) { - try { - // don't hold this.cnxns lock as deadlock may occur - cnxn.close(); - } catch (Exception e) { - LOG.warn("Ignoring exception closing cnxn sessionid 0x" - + Long.toHexString(cnxn.sessionId), e); - } - } - } - - public void shutdown() { - try { - ss.close(); - closeAll(); - thread.interrupt(); - thread.join(); - if (login != null) { - login.shutdown(); - } - } catch (InterruptedException e) { - LOG.warn("Ignoring interrupted exception during shutdown", e); - } catch (Exception e) { - LOG.warn("Ignoring unexpected exception during shutdown", e); - } - try { - selector.close(); - } catch (IOException e) { - LOG.warn("Selector closing", e); - } - if (zkServer != null) { - zkServer.shutdown(); - } - } - - @Override - public synchronized void closeSession(long sessionId) { - selector.wakeup(); - closeSessionWithoutWakeup(sessionId); - } - - @SuppressWarnings("unchecked") - private void closeSessionWithoutWakeup(long sessionId) { - HashSet cnxns; - synchronized (this.cnxns) { - cnxns = (HashSet)this.cnxns.clone(); - } - - for (NIOServerCnxn cnxn : cnxns) { - if (cnxn.getSessionId() == sessionId) { - try { - cnxn.close(); - } catch (Exception e) { - LOG.warn("exception during session close", e); - } - break; - } - } - } - - @Override - public void join() throws InterruptedException { - thread.join(); - } - - @Override - public Iterable getConnections() { - return cnxns; - } -} diff --git a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/NettyServerCnxn.java b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/NettyServerCnxn.java deleted file mode 100644 index cf43c8b22..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/NettyServerCnxn.java +++ /dev/null @@ -1,856 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you 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. - */ - -package org.apache.zookeeper.server; - -import static org.jboss.netty.buffer.ChannelBuffers.wrappedBuffer; - -import java.io.BufferedWriter; -import java.io.ByteArrayOutputStream; -import java.io.IOException; -import java.io.PrintWriter; -import java.io.Writer; -import java.net.InetSocketAddress; -import java.net.SocketAddress; -import java.nio.ByteBuffer; -import java.util.AbstractSet; -import java.util.HashSet; -import java.util.List; -import java.util.Set; -import java.util.concurrent.atomic.AtomicLong; - -import org.apache.jute.BinaryInputArchive; -import org.apache.jute.BinaryOutputArchive; -import org.apache.jute.Record; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.apache.zookeeper.Environment; -import org.apache.zookeeper.Version; -import org.apache.zookeeper.WatchedEvent; -import org.apache.zookeeper.proto.ReplyHeader; -import org.apache.zookeeper.proto.WatcherEvent; -import org.apache.zookeeper.server.quorum.Leader; -import org.apache.zookeeper.server.quorum.LeaderZooKeeperServer; -import org.apache.zookeeper.server.quorum.ReadOnlyZooKeeperServer; -import org.apache.zookeeper.server.util.OSMXBean; -import org.jboss.netty.buffer.ChannelBuffer; -import org.jboss.netty.buffer.ChannelBuffers; -import org.jboss.netty.channel.Channel; -import org.jboss.netty.channel.ChannelFuture; -import org.jboss.netty.channel.MessageEvent; - -public class NettyServerCnxn extends ServerCnxn { - Logger LOG = LoggerFactory.getLogger(NettyServerCnxn.class); - Channel channel; - ChannelBuffer queuedBuffer; - volatile boolean throttled; - ByteBuffer bb; - ByteBuffer bbLen = ByteBuffer.allocate(4); - long sessionId; - int sessionTimeout; - AtomicLong outstandingCount = new AtomicLong(); - - /** The ZooKeeperServer for this connection. May be null if the server - * is not currently serving requests (for example if the server is not - * an active quorum participant. - */ - private volatile ZooKeeperServer zkServer; - - NettyServerCnxnFactory factory; - boolean initialized; - - NettyServerCnxn(Channel channel, ZooKeeperServer zks, NettyServerCnxnFactory factory) { - this.channel = channel; - this.zkServer = zks; - this.factory = factory; - if (this.factory.login != null) { - this.zooKeeperSaslServer = new ZooKeeperSaslServer(factory.login); - } - } - - @Override - public void close() { - if (LOG.isDebugEnabled()) { - LOG.debug("close called for sessionid:0x" - + Long.toHexString(sessionId)); - } - synchronized(factory.cnxns){ - // if this is not in cnxns then it's already closed - if (!factory.cnxns.remove(this)) { - if (LOG.isDebugEnabled()) { - LOG.debug("cnxns size:" + factory.cnxns.size()); - } - return; - } - if (LOG.isDebugEnabled()) { - LOG.debug("close in progress for sessionid:0x" - + Long.toHexString(sessionId)); - } - - synchronized (factory.ipMap) { - Set s = - factory.ipMap.get(((InetSocketAddress)channel - .getRemoteAddress()).getAddress()); - s.remove(this); - } - } - - if (channel.isOpen()) { - channel.close(); - } - factory.unregisterConnection(this); - } - - @Override - public long getSessionId() { - return sessionId; - } - - @Override - public int getSessionTimeout() { - return sessionTimeout; - } - - @Override - public void process(WatchedEvent event) { - ReplyHeader h = new ReplyHeader(-1, -1L, 0); - if (LOG.isTraceEnabled()) { - ZooTrace.logTraceMessage(LOG, ZooTrace.EVENT_DELIVERY_TRACE_MASK, - "Deliver event " + event + " to 0x" - + Long.toHexString(this.sessionId) - + " through " + this); - } - - // Convert WatchedEvent to a type that can be sent over the wire - WatcherEvent e = event.getWrapper(); - - try { - sendResponse(h, e, "notification"); - } catch (IOException e1) { - if (LOG.isDebugEnabled()) { - LOG.debug("Problem sending to " + getRemoteSocketAddress(), e1); - } - close(); - } - } - - private static final byte[] fourBytes = new byte[4]; - static class ResumeMessageEvent implements MessageEvent { - Channel channel; - ResumeMessageEvent(Channel channel) { - this.channel = channel; - } - @Override - public Object getMessage() {return null;} - @Override - public SocketAddress getRemoteAddress() {return null;} - @Override - public Channel getChannel() {return channel;} - @Override - public ChannelFuture getFuture() {return null;} - }; - - @Override - public void sendResponse(ReplyHeader h, Record r, String tag) - throws IOException { - if (!channel.isOpen()) { - return; - } - ByteArrayOutputStream baos = new ByteArrayOutputStream(); - // Make space for length - BinaryOutputArchive bos = BinaryOutputArchive.getArchive(baos); - try { - baos.write(fourBytes); - bos.writeRecord(h, "header"); - if (r != null) { - bos.writeRecord(r, tag); - } - baos.close(); - } catch (IOException e) { - LOG.error("Error serializing response"); - } - byte b[] = baos.toByteArray(); - ByteBuffer bb = ByteBuffer.wrap(b); - bb.putInt(b.length - 4).rewind(); - sendBuffer(bb); - if (h.getXid() > 0) { - // zks cannot be null otherwise we would not have gotten here! - if (!zkServer.shouldThrottle(outstandingCount.decrementAndGet())) { - enableRecv(); - } - } - } - - @Override - public void setSessionId(long sessionId) { - this.sessionId = sessionId; - } - - @Override - public void enableRecv() { - if (throttled) { - throttled = false; - if (LOG.isDebugEnabled()) { - LOG.debug("Sending unthrottle event " + this); - } - channel.getPipeline().sendUpstream(new ResumeMessageEvent(channel)); - } - } - - @Override - public void sendBuffer(ByteBuffer sendBuffer) { - if (sendBuffer == ServerCnxnFactory.closeConn) { - close(); - return; - } - channel.write(wrappedBuffer(sendBuffer)); - packetSent(); - } - - /** - * clean up the socket related to a command and also make sure we flush the - * data before we do that - * - * @param pwriter - * the pwriter for a command socket - */ - private void cleanupWriterSocket(PrintWriter pwriter) { - try { - if (pwriter != null) { - pwriter.flush(); - pwriter.close(); - } - } catch (Exception e) { - LOG.info("Error closing PrintWriter ", e); - } finally { - try { - close(); - } catch (Exception e) { - LOG.error("Error closing a command socket ", e); - } - } - } - - /** - * This class wraps the sendBuffer method of NIOServerCnxn. It is - * responsible for chunking up the response to a client. Rather - * than cons'ing up a response fully in memory, which may be large - * for some commands, this class chunks up the result. - */ - private class SendBufferWriter extends Writer { - private StringBuffer sb = new StringBuffer(); - - /** - * Check if we are ready to send another chunk. - * @param force force sending, even if not a full chunk - */ - private void checkFlush(boolean force) { - if ((force && sb.length() > 0) || sb.length() > 2048) { - sendBuffer(ByteBuffer.wrap(sb.toString().getBytes())); - // clear our internal buffer - sb.setLength(0); - } - } - - @Override - public void close() throws IOException { - if (sb == null) return; - checkFlush(true); - sb = null; // clear out the ref to ensure no reuse - } - - @Override - public void flush() throws IOException { - checkFlush(true); - } - - @Override - public void write(char[] cbuf, int off, int len) throws IOException { - sb.append(cbuf, off, len); - checkFlush(false); - } - } - - private static final String ZK_NOT_SERVING = - "This ZooKeeper instance is not currently serving requests"; - - /** - * Set of threads for commmand ports. All the 4 - * letter commands are run via a thread. Each class - * maps to a correspoding 4 letter command. CommandThread - * is the abstract class from which all the others inherit. - */ - private abstract class CommandThread /*extends Thread*/ { - PrintWriter pw; - - CommandThread(PrintWriter pw) { - this.pw = pw; - } - - public void start() { - run(); - } - - public void run() { - try { - commandRun(); - } catch (IOException ie) { - LOG.error("Error in running command ", ie); - } finally { - cleanupWriterSocket(pw); - } - } - - public abstract void commandRun() throws IOException; - } - - private class RuokCommand extends CommandThread { - public RuokCommand(PrintWriter pw) { - super(pw); - } - - @Override - public void commandRun() { - pw.print("imok"); - - } - } - - private class TraceMaskCommand extends CommandThread { - TraceMaskCommand(PrintWriter pw) { - super(pw); - } - - @Override - public void commandRun() { - long traceMask = ZooTrace.getTextTraceLevel(); - pw.print(traceMask); - } - } - - private class SetTraceMaskCommand extends CommandThread { - long trace = 0; - SetTraceMaskCommand(PrintWriter pw, long trace) { - super(pw); - this.trace = trace; - } - - @Override - public void commandRun() { - pw.print(trace); - } - } - - private class EnvCommand extends CommandThread { - EnvCommand(PrintWriter pw) { - super(pw); - } - - @Override - public void commandRun() { - List env = Environment.list(); - - pw.println("Environment:"); - for(Environment.Entry e : env) { - pw.print(e.getKey()); - pw.print("="); - pw.println(e.getValue()); - } - - } - } - - private class ConfCommand extends CommandThread { - ConfCommand(PrintWriter pw) { - super(pw); - } - - @Override - public void commandRun() { - if (zkServer == null) { - pw.println(ZK_NOT_SERVING); - } else { - zkServer.dumpConf(pw); - } - } - } - - private class StatResetCommand extends CommandThread { - public StatResetCommand(PrintWriter pw) { - super(pw); - } - - @Override - public void commandRun() { - if (zkServer == null) { - pw.println(ZK_NOT_SERVING); - } - else { - zkServer.serverStats().reset(); - pw.println("Server stats reset."); - } - } - } - - private class CnxnStatResetCommand extends CommandThread { - public CnxnStatResetCommand(PrintWriter pw) { - super(pw); - } - - @Override - public void commandRun() { - if (zkServer == null) { - pw.println(ZK_NOT_SERVING); - } else { - synchronized(factory.cnxns){ - for(ServerCnxn c : factory.cnxns){ - c.resetStats(); - } - } - pw.println("Connection stats reset."); - } - } - } - - private class DumpCommand extends CommandThread { - public DumpCommand(PrintWriter pw) { - super(pw); - } - - @Override - public void commandRun() { - if (zkServer == null) { - pw.println(ZK_NOT_SERVING); - } - else { - pw.println("SessionTracker dump:"); - zkServer.sessionTracker.dumpSessions(pw); - pw.println("ephemeral nodes dump:"); - zkServer.dumpEphemerals(pw); - } - } - } - - private class StatCommand extends CommandThread { - int len; - public StatCommand(PrintWriter pw, int len) { - super(pw); - this.len = len; - } - - @Override - public void commandRun() { - if (zkServer == null) { - pw.println(ZK_NOT_SERVING); - } - else { - pw.print("Zookeeper version: "); - pw.println(Version.getFullVersion()); - if (zkServer instanceof ReadOnlyZooKeeperServer) { - pw.println("READ-ONLY mode; serving only " + - "read-only clients"); - } - if (len == statCmd) { - LOG.info("Stat command output"); - pw.println("Clients:"); - // clone should be faster than iteration - // ie give up the cnxns lock faster - HashSet cnxns; - synchronized(factory.cnxns){ - cnxns = new HashSet(factory.cnxns); - } - for(ServerCnxn c : cnxns){ - c.dumpConnectionInfo(pw, true); - pw.println(); - } - pw.println(); - } - pw.print(zkServer.serverStats().toString()); - pw.print("Node count: "); - pw.println(zkServer.getZKDatabase().getNodeCount()); - } - - } - } - - private class ConsCommand extends CommandThread { - public ConsCommand(PrintWriter pw) { - super(pw); - } - - @Override - public void commandRun() { - if (zkServer == null) { - pw.println(ZK_NOT_SERVING); - } else { - // clone should be faster than iteration - // ie give up the cnxns lock faster - AbstractSet cnxns; - synchronized (factory.cnxns) { - cnxns = new HashSet(factory.cnxns); - } - for (ServerCnxn c : cnxns) { - c.dumpConnectionInfo(pw, false); - pw.println(); - } - pw.println(); - } - } - } - - private class WatchCommand extends CommandThread { - int len = 0; - public WatchCommand(PrintWriter pw, int len) { - super(pw); - this.len = len; - } - - @Override - public void commandRun() { - if (zkServer == null) { - pw.println(ZK_NOT_SERVING); - } else { - DataTree dt = zkServer.getZKDatabase().getDataTree(); - if (len == wchsCmd) { - dt.dumpWatchesSummary(pw); - } else if (len == wchpCmd) { - dt.dumpWatches(pw, true); - } else { - dt.dumpWatches(pw, false); - } - pw.println(); - } - } - } - - private class MonitorCommand extends CommandThread { - - MonitorCommand(PrintWriter pw) { - super(pw); - } - - @Override - public void commandRun() { - if(zkServer == null) { - pw.println(ZK_NOT_SERVING); - return; - } - ZKDatabase zkdb = zkServer.getZKDatabase(); - ServerStats stats = zkServer.serverStats(); - - print("version", Version.getFullVersion()); - - print("avg_latency", stats.getAvgLatency()); - print("max_latency", stats.getMaxLatency()); - print("min_latency", stats.getMinLatency()); - - print("packets_received", stats.getPacketsReceived()); - print("packets_sent", stats.getPacketsSent()); - print("num_alive_connections", stats.getNumAliveClientConnections()); - - print("outstanding_requests", stats.getOutstandingRequests()); - - print("server_state", stats.getServerState()); - print("znode_count", zkdb.getNodeCount()); - - print("watch_count", zkdb.getDataTree().getWatchCount()); - print("ephemerals_count", zkdb.getDataTree().getEphemeralsCount()); - print("approximate_data_size", zkdb.getDataTree().approximateDataSize()); - - OSMXBean osMbean = new OSMXBean(); - if (osMbean != null && osMbean.getUnix() == true) { - print("open_file_descriptor_count", osMbean.getOpenFileDescriptorCount()); - print("max_file_descriptor_count", osMbean.getMaxFileDescriptorCount()); - } - - if(stats.getServerState().equals("leader")) { - Leader leader = ((LeaderZooKeeperServer)zkServer).getLeader(); - - print("followers", leader.getLearners().size()); - print("synced_followers", leader.getForwardingFollowers().size()); - print("pending_syncs", leader.getNumPendingSyncs()); - } - } - - private void print(String key, long number) { - print(key, "" + number); - } - - private void print(String key, String value) { - pw.print("zk_"); - pw.print(key); - pw.print("\t"); - pw.println(value); - } - - } - - private class IsroCommand extends CommandThread { - - public IsroCommand(PrintWriter pw) { - super(pw); - } - - @Override - public void commandRun() { - if (zkServer == null) { - pw.print("null"); - } else if (zkServer instanceof ReadOnlyZooKeeperServer) { - pw.print("ro"); - } else { - pw.print("rw"); - } - } - } - - /** Return if four letter word found and responded to, otw false **/ - private boolean checkFourLetterWord(final Channel channel, - ChannelBuffer message, final int len) throws IOException - { - // We take advantage of the limited size of the length to look - // for cmds. They are all 4-bytes which fits inside of an int - String cmd = cmd2String.get(len); - if (cmd == null) { - return false; - } - channel.setInterestOps(0).awaitUninterruptibly(); - LOG.info("Processing " + cmd + " command from " - + channel.getRemoteAddress()); - packetReceived(); - - final PrintWriter pwriter = new PrintWriter( - new BufferedWriter(new SendBufferWriter())); - if (len == ruokCmd) { - RuokCommand ruok = new RuokCommand(pwriter); - ruok.start(); - return true; - } else if (len == getTraceMaskCmd) { - TraceMaskCommand tmask = new TraceMaskCommand(pwriter); - tmask.start(); - return true; - } else if (len == setTraceMaskCmd) { - ByteBuffer mask = ByteBuffer.allocate(4); - message.readBytes(mask); - - bb.flip(); - long traceMask = mask.getLong(); - ZooTrace.setTextTraceLevel(traceMask); - SetTraceMaskCommand setMask = new SetTraceMaskCommand(pwriter, traceMask); - setMask.start(); - return true; - } else if (len == enviCmd) { - EnvCommand env = new EnvCommand(pwriter); - env.start(); - return true; - } else if (len == confCmd) { - ConfCommand ccmd = new ConfCommand(pwriter); - ccmd.start(); - return true; - } else if (len == srstCmd) { - StatResetCommand strst = new StatResetCommand(pwriter); - strst.start(); - return true; - } else if (len == crstCmd) { - CnxnStatResetCommand crst = new CnxnStatResetCommand(pwriter); - crst.start(); - return true; - } else if (len == dumpCmd) { - DumpCommand dump = new DumpCommand(pwriter); - dump.start(); - return true; - } else if (len == statCmd || len == srvrCmd) { - StatCommand stat = new StatCommand(pwriter, len); - stat.start(); - return true; - } else if (len == consCmd) { - ConsCommand cons = new ConsCommand(pwriter); - cons.start(); - return true; - } else if (len == wchpCmd || len == wchcCmd || len == wchsCmd) { - WatchCommand wcmd = new WatchCommand(pwriter, len); - wcmd.start(); - return true; - } else if (len == mntrCmd) { - MonitorCommand mntr = new MonitorCommand(pwriter); - mntr.start(); - return true; - } else if (len == isroCmd) { - IsroCommand isro = new IsroCommand(pwriter); - isro.start(); - return true; - } - return false; - } - - public void receiveMessage(ChannelBuffer message) { - try { - while(message.readable() && !throttled) { - if (bb != null) { - if (LOG.isTraceEnabled()) { - LOG.trace("message readable " + message.readableBytes() - + " bb len " + bb.remaining() + " " + bb); - ByteBuffer dat = bb.duplicate(); - dat.flip(); - LOG.trace(Long.toHexString(sessionId) - + " bb 0x" - + ChannelBuffers.hexDump( - ChannelBuffers.copiedBuffer(dat))); - } - - if (bb.remaining() > message.readableBytes()) { - int newLimit = bb.position() + message.readableBytes(); - bb.limit(newLimit); - } - message.readBytes(bb); - bb.limit(bb.capacity()); - - if (LOG.isTraceEnabled()) { - LOG.trace("after readBytes message readable " - + message.readableBytes() - + " bb len " + bb.remaining() + " " + bb); - ByteBuffer dat = bb.duplicate(); - dat.flip(); - LOG.trace("after readbytes " - + Long.toHexString(sessionId) - + " bb 0x" - + ChannelBuffers.hexDump( - ChannelBuffers.copiedBuffer(dat))); - } - if (bb.remaining() == 0) { - packetReceived(); - bb.flip(); - - ZooKeeperServer zks = this.zkServer; - if (zks == null) { - throw new IOException("ZK down"); - } - if (initialized) { - zks.processPacket(this, bb); - - if (zks.shouldThrottle(outstandingCount.incrementAndGet())) { - disableRecvNoWait(); - } - } else { - LOG.debug("got conn req request from " - + getRemoteSocketAddress()); - zks.processConnectRequest(this, bb); - initialized = true; - } - bb = null; - } - } else { - if (LOG.isTraceEnabled()) { - LOG.trace("message readable " - + message.readableBytes() - + " bblenrem " + bbLen.remaining()); - ByteBuffer dat = bbLen.duplicate(); - dat.flip(); - LOG.trace(Long.toHexString(sessionId) - + " bbLen 0x" - + ChannelBuffers.hexDump( - ChannelBuffers.copiedBuffer(dat))); - } - - if (message.readableBytes() < bbLen.remaining()) { - bbLen.limit(bbLen.position() + message.readableBytes()); - } - message.readBytes(bbLen); - bbLen.limit(bbLen.capacity()); - if (bbLen.remaining() == 0) { - bbLen.flip(); - - if (LOG.isTraceEnabled()) { - LOG.trace(Long.toHexString(sessionId) - + " bbLen 0x" - + ChannelBuffers.hexDump( - ChannelBuffers.copiedBuffer(bbLen))); - } - int len = bbLen.getInt(); - if (LOG.isTraceEnabled()) { - LOG.trace(Long.toHexString(sessionId) - + " bbLen len is " + len); - } - - bbLen.clear(); - if (!initialized) { - if (checkFourLetterWord(channel, message, len)) { - return; - } - } - if (len < 0 || len > BinaryInputArchive.maxBuffer) { - throw new IOException("Len error " + len); - } - bb = ByteBuffer.allocate(len); - } - } - } - } catch(IOException e) { - LOG.warn("Closing connection to " + getRemoteSocketAddress(), e); - close(); - } - } - - @Override - public void disableRecv() { - disableRecvNoWait().awaitUninterruptibly(); - } - - private ChannelFuture disableRecvNoWait() { - throttled = true; - if (LOG.isDebugEnabled()) { - LOG.debug("Throttling - disabling recv " + this); - } - return channel.setReadable(false); - } - - @Override - public long getOutstandingRequests() { - return outstandingCount.longValue(); - } - - @Override - public void setSessionTimeout(int sessionTimeout) { - this.sessionTimeout = sessionTimeout; - } - - @Override - public int getInterestOps() { - return channel.getInterestOps(); - } - - @Override - public InetSocketAddress getRemoteSocketAddress() { - return (InetSocketAddress)channel.getRemoteAddress(); - } - - /** Send close connection packet to the client. - */ - @Override - public void sendCloseSession() { - sendBuffer(ServerCnxnFactory.closeConn); - } - - @Override - protected ServerStats serverStats() { - if (zkServer == null) { - return null; - } - return zkServer.serverStats(); - } - -} diff --git a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/NettyServerCnxnFactory.java b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/NettyServerCnxnFactory.java deleted file mode 100644 index 7a84ce911..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/NettyServerCnxnFactory.java +++ /dev/null @@ -1,403 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you 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. - */ - -package org.apache.zookeeper.server; - -import static org.jboss.netty.buffer.ChannelBuffers.dynamicBuffer; - -import java.io.IOException; -import java.net.InetAddress; -import java.net.InetSocketAddress; -import java.util.HashMap; -import java.util.HashSet; -import java.util.Set; -import java.util.concurrent.Executors; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.jboss.netty.bootstrap.ServerBootstrap; -import org.jboss.netty.buffer.ChannelBuffer; -import org.jboss.netty.buffer.ChannelBuffers; -import org.jboss.netty.channel.Channel; -import org.jboss.netty.channel.ChannelHandler.Sharable; -import org.jboss.netty.channel.ChannelHandlerContext; -import org.jboss.netty.channel.ChannelStateEvent; -import org.jboss.netty.channel.ExceptionEvent; -import org.jboss.netty.channel.MessageEvent; -import org.jboss.netty.channel.SimpleChannelHandler; -import org.jboss.netty.channel.WriteCompletionEvent; -import org.jboss.netty.channel.group.ChannelGroup; -import org.jboss.netty.channel.group.DefaultChannelGroup; -import org.jboss.netty.channel.socket.nio.NioServerSocketChannelFactory; - -public class NettyServerCnxnFactory extends ServerCnxnFactory { - Logger LOG = LoggerFactory.getLogger(NettyServerCnxnFactory.class); - - ServerBootstrap bootstrap; - Channel parentChannel; - ChannelGroup allChannels = new DefaultChannelGroup("zkServerCnxns"); - HashMap> ipMap = - new HashMap>( ); - InetSocketAddress localAddress; - int maxClientCnxns = 60; - - /** - * This is an inner class since we need to extend SimpleChannelHandler, but - * NettyServerCnxnFactory already extends ServerCnxnFactory. By making it inner - * this class gets access to the member variables and methods. - */ - @Sharable - class CnxnChannelHandler extends SimpleChannelHandler { - - @Override - public void channelClosed(ChannelHandlerContext ctx, ChannelStateEvent e) - throws Exception - { - if (LOG.isTraceEnabled()) { - LOG.trace("Channel closed " + e); - } - allChannels.remove(ctx.getChannel()); - } - - @Override - public void channelConnected(ChannelHandlerContext ctx, - ChannelStateEvent e) throws Exception - { - if (LOG.isTraceEnabled()) { - LOG.trace("Channel connected " + e); - } - allChannels.add(ctx.getChannel()); - NettyServerCnxn cnxn = new NettyServerCnxn(ctx.getChannel(), - zkServer, NettyServerCnxnFactory.this); - ctx.setAttachment(cnxn); - addCnxn(cnxn); - } - - @Override - public void channelDisconnected(ChannelHandlerContext ctx, - ChannelStateEvent e) throws Exception - { - if (LOG.isTraceEnabled()) { - LOG.trace("Channel disconnected " + e); - } - NettyServerCnxn cnxn = (NettyServerCnxn) ctx.getAttachment(); - if (cnxn != null) { - if (LOG.isTraceEnabled()) { - LOG.trace("Channel disconnect caused close " + e); - } - cnxn.close(); - } - } - - @Override - public void exceptionCaught(ChannelHandlerContext ctx, ExceptionEvent e) - throws Exception - { - LOG.warn("Exception caught " + e, e.getCause()); - NettyServerCnxn cnxn = (NettyServerCnxn) ctx.getAttachment(); - if (cnxn != null) { - if (LOG.isDebugEnabled()) { - LOG.debug("Closing " + cnxn); - cnxn.close(); - } - } - } - - @Override - public void messageReceived(ChannelHandlerContext ctx, MessageEvent e) - throws Exception - { - if (LOG.isTraceEnabled()) { - LOG.trace("message received called " + e.getMessage()); - } - try { - if (LOG.isDebugEnabled()) { - LOG.debug("New message " + e.toString() - + " from " + ctx.getChannel()); - } - NettyServerCnxn cnxn = (NettyServerCnxn)ctx.getAttachment(); - synchronized(cnxn) { - processMessage(e, cnxn); - } - } catch(Exception ex) { - LOG.error("Unexpected exception in receive", ex); - throw ex; - } - } - - private void processMessage(MessageEvent e, NettyServerCnxn cnxn) { - if (LOG.isDebugEnabled()) { - LOG.debug(Long.toHexString(cnxn.sessionId) + " queuedBuffer: " - + cnxn.queuedBuffer); - } - - if (e instanceof NettyServerCnxn.ResumeMessageEvent) { - LOG.debug("Received ResumeMessageEvent"); - if (cnxn.queuedBuffer != null) { - if (LOG.isTraceEnabled()) { - LOG.trace("processing queue " - + Long.toHexString(cnxn.sessionId) - + " queuedBuffer 0x" - + ChannelBuffers.hexDump(cnxn.queuedBuffer)); - } - cnxn.receiveMessage(cnxn.queuedBuffer); - if (!cnxn.queuedBuffer.readable()) { - LOG.debug("Processed queue - no bytes remaining"); - cnxn.queuedBuffer = null; - } else { - LOG.debug("Processed queue - bytes remaining"); - } - } else { - LOG.debug("queue empty"); - } - cnxn.channel.setReadable(true); - } else { - ChannelBuffer buf = (ChannelBuffer)e.getMessage(); - if (LOG.isTraceEnabled()) { - LOG.trace(Long.toHexString(cnxn.sessionId) - + " buf 0x" - + ChannelBuffers.hexDump(buf)); - } - - if (cnxn.throttled) { - LOG.debug("Received message while throttled"); - // we are throttled, so we need to queue - if (cnxn.queuedBuffer == null) { - LOG.debug("allocating queue"); - cnxn.queuedBuffer = dynamicBuffer(buf.readableBytes()); - } - cnxn.queuedBuffer.writeBytes(buf); - LOG.debug(Long.toHexString(cnxn.sessionId) - + " queuedBuffer 0x" - + ChannelBuffers.hexDump(cnxn.queuedBuffer)); - } else { - LOG.debug("not throttled"); - if (cnxn.queuedBuffer != null) { - if (LOG.isTraceEnabled()) { - LOG.trace(Long.toHexString(cnxn.sessionId) - + " queuedBuffer 0x" - + ChannelBuffers.hexDump(cnxn.queuedBuffer)); - } - cnxn.queuedBuffer.writeBytes(buf); - if (LOG.isTraceEnabled()) { - LOG.trace(Long.toHexString(cnxn.sessionId) - + " queuedBuffer 0x" - + ChannelBuffers.hexDump(cnxn.queuedBuffer)); - } - - cnxn.receiveMessage(cnxn.queuedBuffer); - if (!cnxn.queuedBuffer.readable()) { - LOG.debug("Processed queue - no bytes remaining"); - cnxn.queuedBuffer = null; - } else { - LOG.debug("Processed queue - bytes remaining"); - } - } else { - cnxn.receiveMessage(buf); - if (buf.readable()) { - if (LOG.isTraceEnabled()) { - LOG.trace("Before copy " + buf); - } - cnxn.queuedBuffer = dynamicBuffer(buf.readableBytes()); - cnxn.queuedBuffer.writeBytes(buf); - if (LOG.isTraceEnabled()) { - LOG.trace("Copy is " + cnxn.queuedBuffer); - LOG.trace(Long.toHexString(cnxn.sessionId) - + " queuedBuffer 0x" - + ChannelBuffers.hexDump(cnxn.queuedBuffer)); - } - } - } - } - } - } - - @Override - public void writeComplete(ChannelHandlerContext ctx, - WriteCompletionEvent e) throws Exception - { - if (LOG.isTraceEnabled()) { - LOG.trace("write complete " + e); - } - } - - } - - CnxnChannelHandler channelHandler = new CnxnChannelHandler(); - - NettyServerCnxnFactory() { - bootstrap = new ServerBootstrap( - new NioServerSocketChannelFactory( - Executors.newCachedThreadPool(), - Executors.newCachedThreadPool())); - // parent channel - bootstrap.setOption("reuseAddress", true); - // child channels - bootstrap.setOption("child.tcpNoDelay", true); - /* set socket linger to off, so that socket close does not block */ - bootstrap.setOption("child.soLinger", -1); - - bootstrap.getPipeline().addLast("servercnxnfactory", channelHandler); - } - - @Override - public void closeAll() { - if (LOG.isDebugEnabled()) { - LOG.debug("closeAll()"); - } - - NettyServerCnxn[] allCnxns = null; - synchronized (cnxns) { - allCnxns = cnxns.toArray(new NettyServerCnxn[cnxns.size()]); - } - // got to clear all the connections that we have in the selector - for (NettyServerCnxn cnxn : allCnxns) { - try { - cnxn.close(); - } catch (Exception e) { - LOG.warn("Ignoring exception closing cnxn sessionid 0x" - + Long.toHexString(cnxn.getSessionId()), e); - } - } - if (LOG.isDebugEnabled()) { - LOG.debug("allChannels size:" + allChannels.size() + " cnxns size:" - + allCnxns.length); - } - } - - @Override - public void closeSession(long sessionId) { - if (LOG.isDebugEnabled()) { - LOG.debug("closeSession sessionid:0x" + sessionId); - } - NettyServerCnxn[] allCnxns = null; - synchronized (cnxns) { - allCnxns = cnxns.toArray(new NettyServerCnxn[cnxns.size()]); - } - for (NettyServerCnxn cnxn : allCnxns) { - if (cnxn.getSessionId() == sessionId) { - try { - cnxn.close(); - } catch (Exception e) { - LOG.warn("exception during session close", e); - } - break; - } - } - } - - @Override - public void configure(InetSocketAddress addr, int maxClientCnxns) - throws IOException - { - configureSaslLogin(); - localAddress = addr; - this.maxClientCnxns = maxClientCnxns; - } - - /** {@inheritDoc} */ - public int getMaxClientCnxnsPerHost() { - return maxClientCnxns; - } - - /** {@inheritDoc} */ - public void setMaxClientCnxnsPerHost(int max) { - maxClientCnxns = max; - } - - @Override - public int getLocalPort() { - return localAddress.getPort(); - } - - boolean killed; - @Override - public void join() throws InterruptedException { - synchronized(this) { - while(!killed) { - wait(); - } - } - } - - @Override - public void shutdown() { - LOG.info("shutdown called " + localAddress); - if (login != null) { - login.shutdown(); - } - // null if factory never started - if (parentChannel != null) { - parentChannel.close().awaitUninterruptibly(); - closeAll(); - allChannels.close().awaitUninterruptibly(); - bootstrap.releaseExternalResources(); - } - - if (zkServer != null) { - zkServer.shutdown(); - } - synchronized(this) { - killed = true; - notifyAll(); - } - } - - @Override - public void start() { - LOG.info("binding to port " + localAddress); - parentChannel = bootstrap.bind(localAddress); - } - - @Override - public void startup(ZooKeeperServer zks) throws IOException, - InterruptedException { - start(); - zks.startdata(); - zks.startup(); - setZooKeeperServer(zks); - } - - @Override - public Iterable getConnections() { - return cnxns; - } - - @Override - public InetSocketAddress getLocalAddress() { - return localAddress; - } - - private void addCnxn(NettyServerCnxn cnxn) { - synchronized (cnxns) { - cnxns.add(cnxn); - synchronized (ipMap){ - InetAddress addr = - ((InetSocketAddress)cnxn.channel.getRemoteAddress()) - .getAddress(); - Set s = ipMap.get(addr); - if (s == null) { - s = new HashSet(); - } - s.add(cnxn); - ipMap.put(addr,s); - } - } - } - -} diff --git a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/ObserverBean.java b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/ObserverBean.java deleted file mode 100644 index 4e0e82a8e..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/ObserverBean.java +++ /dev/null @@ -1,45 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you 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. - */ - -package org.apache.zookeeper.server; - -import org.apache.zookeeper.server.quorum.Observer; -import org.apache.zookeeper.server.quorum.ObserverMXBean; - -/** - * ObserverBean - * - */ -public class ObserverBean extends ZooKeeperServerBean implements ObserverMXBean{ - - private Observer observer; - - public ObserverBean(Observer observer, ZooKeeperServer zks) { - super(zks); - this.observer = observer; - } - - public int getPendingRevalidationCount() { - return this.observer.getPendingRevalidationsCount(); - } - - public String getQuorumAddress() { - return observer.getSocket().toString(); - } - -} diff --git a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/PrepRequestProcessor.java b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/PrepRequestProcessor.java deleted file mode 100644 index f636d2a87..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/PrepRequestProcessor.java +++ /dev/null @@ -1,766 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you 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. - */ - -package org.apache.zookeeper.server; - -import java.io.ByteArrayOutputStream; -import java.io.IOException; -import java.nio.ByteBuffer; -import java.util.ArrayList; -import java.util.HashSet; -import java.util.HashMap; -import java.util.Iterator; -import java.util.LinkedList; -import java.util.List; -import java.util.ListIterator; -import java.util.Locale; -import java.util.Set; -import java.util.concurrent.LinkedBlockingQueue; - -import org.apache.jute.Record; -import org.apache.jute.BinaryOutputArchive; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.apache.zookeeper.CreateMode; -import org.apache.zookeeper.KeeperException; -import org.apache.zookeeper.MultiTransactionRecord; -import org.apache.zookeeper.Op; -import org.apache.zookeeper.ZooDefs; -import org.apache.zookeeper.KeeperException.Code; -import org.apache.zookeeper.ZooDefs.OpCode; -import org.apache.zookeeper.common.PathUtils; -import org.apache.zookeeper.data.ACL; -import org.apache.zookeeper.data.Id; -import org.apache.zookeeper.data.StatPersisted; -import org.apache.zookeeper.proto.CreateRequest; -import org.apache.zookeeper.proto.DeleteRequest; -import org.apache.zookeeper.proto.SetACLRequest; -import org.apache.zookeeper.proto.SetDataRequest; -import org.apache.zookeeper.proto.CheckVersionRequest; -import org.apache.zookeeper.server.ZooKeeperServer.ChangeRecord; -import org.apache.zookeeper.server.auth.AuthenticationProvider; -import org.apache.zookeeper.server.auth.ProviderRegistry; -import org.apache.zookeeper.server.quorum.Leader.XidRolloverException; -import org.apache.zookeeper.txn.CreateSessionTxn; -import org.apache.zookeeper.txn.CreateTxn; -import org.apache.zookeeper.txn.DeleteTxn; -import org.apache.zookeeper.txn.ErrorTxn; -import org.apache.zookeeper.txn.SetACLTxn; -import org.apache.zookeeper.txn.SetDataTxn; -import org.apache.zookeeper.txn.CheckVersionTxn; -import org.apache.zookeeper.txn.Txn; -import org.apache.zookeeper.txn.MultiTxn; -import org.apache.zookeeper.txn.TxnHeader; - -/** - * This request processor is generally at the start of a RequestProcessor - * change. It sets up any transactions associated with requests that change the - * state of the system. It counts on ZooKeeperServer to update - * outstandingRequests, so that it can take into account transactions that are - * in the queue to be applied when generating a transaction. - */ -public class PrepRequestProcessor extends Thread implements RequestProcessor { - private static final Logger LOG = LoggerFactory.getLogger(PrepRequestProcessor.class); - - static boolean skipACL; - static { - skipACL = System.getProperty("zookeeper.skipACL", "no").equals("yes"); - if (skipACL) { - LOG.info("zookeeper.skipACL==\"yes\", ACL checks will be skipped"); - } - } - - /** - * this is only for testing purposes. - * should never be useed otherwise - */ - private static boolean failCreate = false; - - LinkedBlockingQueue submittedRequests = new LinkedBlockingQueue(); - - RequestProcessor nextProcessor; - - ZooKeeperServer zks; - - public PrepRequestProcessor(ZooKeeperServer zks, - RequestProcessor nextProcessor) { - super("ProcessThread(sid:" + zks.getServerId() - + " cport:" + zks.getClientPort() + "):"); - this.nextProcessor = nextProcessor; - this.zks = zks; - } - - /** - * method for tests to set failCreate - * @param b - */ - public static void setFailCreate(boolean b) { - failCreate = b; - } - @Override - public void run() { - try { - while (true) { - Request request = submittedRequests.take(); - long traceMask = ZooTrace.CLIENT_REQUEST_TRACE_MASK; - if (request.type == OpCode.ping) { - traceMask = ZooTrace.CLIENT_PING_TRACE_MASK; - } - if (LOG.isTraceEnabled()) { - ZooTrace.logRequest(LOG, traceMask, 'P', request, ""); - } - if (Request.requestOfDeath == request) { - break; - } - pRequest(request); - } - } catch (InterruptedException e) { - LOG.error("Unexpected interruption", e); - } catch (RequestProcessorException e) { - if (e.getCause() instanceof XidRolloverException) { - LOG.info(e.getCause().getMessage()); - } - LOG.error("Unexpected exception", e); - } catch (Exception e) { - LOG.error("Unexpected exception", e); - } - LOG.info("PrepRequestProcessor exited loop!"); - } - - ChangeRecord getRecordForPath(String path) throws KeeperException.NoNodeException { - ChangeRecord lastChange = null; - synchronized (zks.outstandingChanges) { - lastChange = zks.outstandingChangesForPath.get(path); - /* - for (int i = 0; i < zks.outstandingChanges.size(); i++) { - ChangeRecord c = zks.outstandingChanges.get(i); - if (c.path.equals(path)) { - lastChange = c; - } - } - */ - if (lastChange == null) { - DataNode n = zks.getZKDatabase().getNode(path); - if (n != null) { - Long acl; - Set children; - synchronized(n) { - acl = n.acl; - children = n.getChildren(); - } - lastChange = new ChangeRecord(-1, path, n.stat, - children != null ? children.size() : 0, - zks.getZKDatabase().convertLong(acl)); - } - } - } - if (lastChange == null || lastChange.stat == null) { - throw new KeeperException.NoNodeException(path); - } - return lastChange; - } - - void addChangeRecord(ChangeRecord c) { - synchronized (zks.outstandingChanges) { - zks.outstandingChanges.add(c); - zks.outstandingChangesForPath.put(c.path, c); - } - } - - /** - * Grab current pending change records for each op in a multi-op. - * - * This is used inside MultiOp error code path to rollback in the event - * of a failed multi-op. - * - * @param multiRequest - */ - HashMap getPendingChanges(MultiTransactionRecord multiRequest) { - HashMap pendingChangeRecords = new HashMap(); - - for(Op op: multiRequest) { - String path = op.getPath(); - - try { - ChangeRecord cr = getRecordForPath(path); - if (cr != null) { - pendingChangeRecords.put(path, cr); - } - /* - * ZOOKEEPER-1624 - We need to store for parent's ChangeRecord - * of the parent node of a request. So that if this is a - * sequential node creation request, rollbackPendingChanges() - * can restore previous parent's ChangeRecord correctly. - * - * Otherwise, sequential node name generation will be incorrect - * for a subsequent request. - */ - int lastSlash = path.lastIndexOf('/'); - if (lastSlash == -1 || path.indexOf('\0') != -1) { - continue; - } - String parentPath = path.substring(0, lastSlash); - ChangeRecord parentCr = getRecordForPath(parentPath); - if (parentCr != null) { - pendingChangeRecords.put(parentPath, parentCr); - } - } catch (KeeperException.NoNodeException e) { - // ignore this one - } - } - - return pendingChangeRecords; - } - - /** - * Rollback pending changes records from a failed multi-op. - * - * If a multi-op fails, we can't leave any invalid change records we created - * around. We also need to restore their prior value (if any) if their prior - * value is still valid. - * - * @param zxid - * @param pendingChangeRecords - */ - void rollbackPendingChanges(long zxid, HashMappendingChangeRecords) { - - synchronized (zks.outstandingChanges) { - // Grab a list iterator starting at the END of the list so we can iterate in reverse - ListIterator iter = zks.outstandingChanges.listIterator(zks.outstandingChanges.size()); - while (iter.hasPrevious()) { - ChangeRecord c = iter.previous(); - if (c.zxid == zxid) { - iter.remove(); - zks.outstandingChangesForPath.remove(c.path); - } else { - break; - } - } - - boolean empty = zks.outstandingChanges.isEmpty(); - long firstZxid = 0; - if (!empty) { - firstZxid = zks.outstandingChanges.get(0).zxid; - } - - Iterator priorIter = pendingChangeRecords.values().iterator(); - while (priorIter.hasNext()) { - ChangeRecord c = priorIter.next(); - - /* Don't apply any prior change records less than firstZxid */ - if (!empty && (c.zxid < firstZxid)) { - continue; - } - - zks.outstandingChangesForPath.put(c.path, c); - } - } - } - - static void checkACL(ZooKeeperServer zks, List acl, int perm, - List ids) throws KeeperException.NoAuthException { - if (skipACL) { - return; - } - if (acl == null || acl.size() == 0) { - return; - } - for (Id authId : ids) { - if (authId.getScheme().equals("super")) { - return; - } - } - for (ACL a : acl) { - Id id = a.getId(); - if ((a.getPerms() & perm) != 0) { - if (id.getScheme().equals("world") - && id.getId().equals("anyone")) { - return; - } - AuthenticationProvider ap = ProviderRegistry.getProvider(id - .getScheme()); - if (ap != null) { - for (Id authId : ids) { - if (authId.getScheme().equals(id.getScheme()) - && ap.matches(authId.getId(), id.getId())) { - return; - } - } - } - } - } - throw new KeeperException.NoAuthException(); - } - - /** - * This method will be called inside the ProcessRequestThread, which is a - * singleton, so there will be a single thread calling this code. - * - * @param type - * @param zxid - * @param request - * @param record - */ - @SuppressWarnings("unchecked") - protected void pRequest2Txn(int type, long zxid, Request request, Record record, boolean deserialize) - throws KeeperException, IOException, RequestProcessorException - { - request.hdr = new TxnHeader(request.sessionId, request.cxid, zxid, - zks.getTime(), type); - - switch (type) { - case OpCode.create: - zks.sessionTracker.checkSession(request.sessionId, request.getOwner()); - CreateRequest createRequest = (CreateRequest)record; - if(deserialize) - ByteBufferInputStream.byteBuffer2Record(request.request, createRequest); - String path = createRequest.getPath(); - int lastSlash = path.lastIndexOf('/'); - if (lastSlash == -1 || path.indexOf('\0') != -1 || failCreate) { - LOG.info("Invalid path " + path + " with session 0x" + - Long.toHexString(request.sessionId)); - throw new KeeperException.BadArgumentsException(path); - } - List listACL = removeDuplicates(createRequest.getAcl()); - if (!fixupACL(request.authInfo, listACL)) { - throw new KeeperException.InvalidACLException(path); - } - String parentPath = path.substring(0, lastSlash); - ChangeRecord parentRecord = getRecordForPath(parentPath); - - checkACL(zks, parentRecord.acl, ZooDefs.Perms.CREATE, - request.authInfo); - int parentCVersion = parentRecord.stat.getCversion(); - CreateMode createMode = - CreateMode.fromFlag(createRequest.getFlags()); - if (createMode.isSequential()) { - path = path + String.format(Locale.ENGLISH, "%010d", parentCVersion); - } - try { - PathUtils.validatePath(path); - } catch(IllegalArgumentException ie) { - LOG.info("Invalid path " + path + " with session 0x" + - Long.toHexString(request.sessionId)); - throw new KeeperException.BadArgumentsException(path); - } - try { - if (getRecordForPath(path) != null) { - throw new KeeperException.NodeExistsException(path); - } - } catch (KeeperException.NoNodeException e) { - // ignore this one - } - boolean ephemeralParent = parentRecord.stat.getEphemeralOwner() != 0; - if (ephemeralParent) { - throw new KeeperException.NoChildrenForEphemeralsException(path); - } - int newCversion = parentRecord.stat.getCversion()+1; - request.txn = new CreateTxn(path, createRequest.getData(), - listACL, - createMode.isEphemeral(), newCversion); - StatPersisted s = new StatPersisted(); - if (createMode.isEphemeral()) { - s.setEphemeralOwner(request.sessionId); - } - parentRecord = parentRecord.duplicate(request.hdr.getZxid()); - parentRecord.childCount++; - parentRecord.stat.setCversion(newCversion); - addChangeRecord(parentRecord); - addChangeRecord(new ChangeRecord(request.hdr.getZxid(), path, s, - 0, listACL)); - break; - case OpCode.delete: - zks.sessionTracker.checkSession(request.sessionId, request.getOwner()); - DeleteRequest deleteRequest = (DeleteRequest)record; - if(deserialize) - ByteBufferInputStream.byteBuffer2Record(request.request, deleteRequest); - path = deleteRequest.getPath(); - lastSlash = path.lastIndexOf('/'); - if (lastSlash == -1 || path.indexOf('\0') != -1 - || zks.getZKDatabase().isSpecialPath(path)) { - throw new KeeperException.BadArgumentsException(path); - } - parentPath = path.substring(0, lastSlash); - parentRecord = getRecordForPath(parentPath); - ChangeRecord nodeRecord = getRecordForPath(path); - checkACL(zks, parentRecord.acl, ZooDefs.Perms.DELETE, - request.authInfo); - int version = deleteRequest.getVersion(); - if (version != -1 && nodeRecord.stat.getVersion() != version) { - throw new KeeperException.BadVersionException(path); - } - if (nodeRecord.childCount > 0) { - throw new KeeperException.NotEmptyException(path); - } - request.txn = new DeleteTxn(path); - parentRecord = parentRecord.duplicate(request.hdr.getZxid()); - parentRecord.childCount--; - addChangeRecord(parentRecord); - addChangeRecord(new ChangeRecord(request.hdr.getZxid(), path, - null, -1, null)); - break; - case OpCode.setData: - zks.sessionTracker.checkSession(request.sessionId, request.getOwner()); - SetDataRequest setDataRequest = (SetDataRequest)record; - if(deserialize) - ByteBufferInputStream.byteBuffer2Record(request.request, setDataRequest); - path = setDataRequest.getPath(); - nodeRecord = getRecordForPath(path); - checkACL(zks, nodeRecord.acl, ZooDefs.Perms.WRITE, - request.authInfo); - version = setDataRequest.getVersion(); - int currentVersion = nodeRecord.stat.getVersion(); - if (version != -1 && version != currentVersion) { - throw new KeeperException.BadVersionException(path); - } - version = currentVersion + 1; - request.txn = new SetDataTxn(path, setDataRequest.getData(), version); - nodeRecord = nodeRecord.duplicate(request.hdr.getZxid()); - nodeRecord.stat.setVersion(version); - addChangeRecord(nodeRecord); - break; - case OpCode.setACL: - zks.sessionTracker.checkSession(request.sessionId, request.getOwner()); - SetACLRequest setAclRequest = (SetACLRequest)record; - if(deserialize) - ByteBufferInputStream.byteBuffer2Record(request.request, setAclRequest); - path = setAclRequest.getPath(); - listACL = removeDuplicates(setAclRequest.getAcl()); - if (!fixupACL(request.authInfo, listACL)) { - throw new KeeperException.InvalidACLException(path); - } - nodeRecord = getRecordForPath(path); - checkACL(zks, nodeRecord.acl, ZooDefs.Perms.ADMIN, - request.authInfo); - version = setAclRequest.getVersion(); - currentVersion = nodeRecord.stat.getAversion(); - if (version != -1 && version != currentVersion) { - throw new KeeperException.BadVersionException(path); - } - version = currentVersion + 1; - request.txn = new SetACLTxn(path, listACL, version); - nodeRecord = nodeRecord.duplicate(request.hdr.getZxid()); - nodeRecord.stat.setAversion(version); - addChangeRecord(nodeRecord); - break; - case OpCode.createSession: - request.request.rewind(); - int to = request.request.getInt(); - request.txn = new CreateSessionTxn(to); - request.request.rewind(); - zks.sessionTracker.addSession(request.sessionId, to); - zks.setOwner(request.sessionId, request.getOwner()); - break; - case OpCode.closeSession: - // We don't want to do this check since the session expiration thread - // queues up this operation without being the session owner. - // this request is the last of the session so it should be ok - //zks.sessionTracker.checkSession(request.sessionId, request.getOwner()); - HashSet es = zks.getZKDatabase() - .getEphemerals(request.sessionId); - synchronized (zks.outstandingChanges) { - for (ChangeRecord c : zks.outstandingChanges) { - if (c.stat == null) { - // Doing a delete - es.remove(c.path); - } else if (c.stat.getEphemeralOwner() == request.sessionId) { - es.add(c.path); - } - } - for (String path2Delete : es) { - addChangeRecord(new ChangeRecord(request.hdr.getZxid(), - path2Delete, null, 0, null)); - } - - zks.sessionTracker.setSessionClosing(request.sessionId); - } - - LOG.info("Processed session termination for sessionid: 0x" - + Long.toHexString(request.sessionId)); - break; - case OpCode.check: - zks.sessionTracker.checkSession(request.sessionId, request.getOwner()); - CheckVersionRequest checkVersionRequest = (CheckVersionRequest)record; - if(deserialize) - ByteBufferInputStream.byteBuffer2Record(request.request, checkVersionRequest); - path = checkVersionRequest.getPath(); - nodeRecord = getRecordForPath(path); - checkACL(zks, nodeRecord.acl, ZooDefs.Perms.READ, - request.authInfo); - version = checkVersionRequest.getVersion(); - currentVersion = nodeRecord.stat.getVersion(); - if (version != -1 && version != currentVersion) { - throw new KeeperException.BadVersionException(path); - } - version = currentVersion + 1; - request.txn = new CheckVersionTxn(path, version); - break; - } - } - - /** - * This method will be called inside the ProcessRequestThread, which is a - * singleton, so there will be a single thread calling this code. - * - * @param request - */ - @SuppressWarnings("unchecked") - protected void pRequest(Request request) throws RequestProcessorException { - // LOG.info("Prep>>> cxid = " + request.cxid + " type = " + - // request.type + " id = 0x" + Long.toHexString(request.sessionId)); - request.hdr = null; - request.txn = null; - - try { - switch (request.type) { - case OpCode.create: - CreateRequest createRequest = new CreateRequest(); - pRequest2Txn(request.type, zks.getNextZxid(), request, createRequest, true); - break; - case OpCode.delete: - DeleteRequest deleteRequest = new DeleteRequest(); - pRequest2Txn(request.type, zks.getNextZxid(), request, deleteRequest, true); - break; - case OpCode.setData: - SetDataRequest setDataRequest = new SetDataRequest(); - pRequest2Txn(request.type, zks.getNextZxid(), request, setDataRequest, true); - break; - case OpCode.setACL: - SetACLRequest setAclRequest = new SetACLRequest(); - pRequest2Txn(request.type, zks.getNextZxid(), request, setAclRequest, true); - break; - case OpCode.check: - CheckVersionRequest checkRequest = new CheckVersionRequest(); - pRequest2Txn(request.type, zks.getNextZxid(), request, checkRequest, true); - break; - case OpCode.multi: - MultiTransactionRecord multiRequest = new MultiTransactionRecord(); - try { - ByteBufferInputStream.byteBuffer2Record(request.request, multiRequest); - } catch(IOException e) { - request.hdr = new TxnHeader(request.sessionId, request.cxid, zks.getNextZxid(), - zks.getTime(), OpCode.multi); - throw e; - } - List txns = new ArrayList(); - //Each op in a multi-op must have the same zxid! - long zxid = zks.getNextZxid(); - KeeperException ke = null; - - //Store off current pending change records in case we need to rollback - HashMap pendingChanges = getPendingChanges(multiRequest); - - int index = 0; - for(Op op: multiRequest) { - Record subrequest = op.toRequestRecord() ; - - /* If we've already failed one of the ops, don't bother - * trying the rest as we know it's going to fail and it - * would be confusing in the logfiles. - */ - if (ke != null) { - request.hdr.setType(OpCode.error); - request.txn = new ErrorTxn(Code.RUNTIMEINCONSISTENCY.intValue()); - } - - /* Prep the request and convert to a Txn */ - else { - try { - pRequest2Txn(op.getType(), zxid, request, subrequest, false); - } catch (KeeperException e) { - if (ke == null) { - ke = e; - } - request.hdr.setType(OpCode.error); - request.txn = new ErrorTxn(e.code().intValue()); - LOG.info("Got user-level KeeperException when processing " - + request.toString() + " aborting remaining multi ops." - + " Error Path:" + e.getPath() - + " Error:" + e.getMessage()); - - request.setException(e); - - /* Rollback change records from failed multi-op */ - rollbackPendingChanges(zxid, pendingChanges); - } - } - - //FIXME: I don't want to have to serialize it here and then - // immediately deserialize in next processor. But I'm - // not sure how else to get the txn stored into our list. - ByteArrayOutputStream baos = new ByteArrayOutputStream(); - BinaryOutputArchive boa = BinaryOutputArchive.getArchive(baos); - request.txn.serialize(boa, "request") ; - ByteBuffer bb = ByteBuffer.wrap(baos.toByteArray()); - - txns.add(new Txn(request.hdr.getType(), bb.array())); - index++; - } - - request.hdr = new TxnHeader(request.sessionId, request.cxid, zxid, zks.getTime(), request.type); - request.txn = new MultiTxn(txns); - - break; - - //create/close session don't require request record - case OpCode.createSession: - case OpCode.closeSession: - pRequest2Txn(request.type, zks.getNextZxid(), request, null, true); - break; - - //All the rest don't need to create a Txn - just verify session - case OpCode.sync: - case OpCode.exists: - case OpCode.getData: - case OpCode.getACL: - case OpCode.getChildren: - case OpCode.getChildren2: - case OpCode.ping: - case OpCode.setWatches: - zks.sessionTracker.checkSession(request.sessionId, - request.getOwner()); - break; - } - } catch (KeeperException e) { - if (request.hdr != null) { - request.hdr.setType(OpCode.error); - request.txn = new ErrorTxn(e.code().intValue()); - } - LOG.info("Got user-level KeeperException when processing " - + request.toString() - + " Error Path:" + e.getPath() - + " Error:" + e.getMessage()); - request.setException(e); - } catch (Exception e) { - // log at error level as we are returning a marshalling - // error to the user - LOG.error("Failed to process " + request, e); - - StringBuilder sb = new StringBuilder(); - ByteBuffer bb = request.request; - if(bb != null){ - bb.rewind(); - while (bb.hasRemaining()) { - sb.append(Integer.toHexString(bb.get() & 0xff)); - } - } else { - sb.append("request buffer is null"); - } - - LOG.error("Dumping request buffer: 0x" + sb.toString()); - if (request.hdr != null) { - request.hdr.setType(OpCode.error); - request.txn = new ErrorTxn(Code.MARSHALLINGERROR.intValue()); - } - } - request.zxid = zks.getZxid(); - nextProcessor.processRequest(request); - } - - private List removeDuplicates(List acl) { - - ArrayList retval = new ArrayList(); - Iterator it = acl.iterator(); - while (it.hasNext()) { - ACL a = it.next(); - if (retval.contains(a) == false) { - retval.add(a); - } - } - return retval; - } - - - /** - * This method checks out the acl making sure it isn't null or empty, - * it has valid schemes and ids, and expanding any relative ids that - * depend on the requestor's authentication information. - * - * @param authInfo list of ACL IDs associated with the client connection - * @param acl list of ACLs being assigned to the node (create or setACL operation) - * @return - */ - private boolean fixupACL(List authInfo, List acl) { - if (skipACL) { - return true; - } - if (acl == null || acl.size() == 0) { - return false; - } - - Iterator it = acl.iterator(); - LinkedList toAdd = null; - while (it.hasNext()) { - ACL a = it.next(); - Id id = a.getId(); - if (id.getScheme().equals("world") && id.getId().equals("anyone")) { - // wide open - } else if (id.getScheme().equals("auth")) { - // This is the "auth" id, so we have to expand it to the - // authenticated ids of the requestor - it.remove(); - if (toAdd == null) { - toAdd = new LinkedList(); - } - boolean authIdValid = false; - for (Id cid : authInfo) { - AuthenticationProvider ap = - ProviderRegistry.getProvider(cid.getScheme()); - if (ap == null) { - LOG.error("Missing AuthenticationProvider for " - + cid.getScheme()); - } else if (ap.isAuthenticated()) { - authIdValid = true; - toAdd.add(new ACL(a.getPerms(), cid)); - } - } - if (!authIdValid) { - return false; - } - } else { - AuthenticationProvider ap = ProviderRegistry.getProvider(id - .getScheme()); - if (ap == null) { - return false; - } - if (!ap.isValid(id.getId())) { - return false; - } - } - } - if (toAdd != null) { - for (ACL a : toAdd) { - acl.add(a); - } - } - return acl.size() > 0; - } - - public void processRequest(Request request) { - // request.addRQRec(">prep="+zks.outstandingChanges.size()); - submittedRequests.add(request); - } - - public void shutdown() { - LOG.info("Shutting down"); - submittedRequests.clear(); - submittedRequests.add(Request.requestOfDeath); - nextProcessor.shutdown(); - } -} diff --git a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/PurgeTxnLog.java b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/PurgeTxnLog.java deleted file mode 100644 index 185c1e123..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/PurgeTxnLog.java +++ /dev/null @@ -1,133 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you 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. - */ - -package org.apache.zookeeper.server; - -import java.io.File; -import java.io.FileFilter; -import java.io.IOException; -import java.text.DateFormat; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.HashSet; -import java.util.List; -import java.util.Set; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.apache.zookeeper.server.persistence.FileTxnSnapLog; -import org.apache.zookeeper.server.persistence.Util; - -/** - * this class is used to clean up the - * snapshot and data log dir's. This is usually - * run as a cronjob on the zookeeper server machine. - * Invocation of this class will clean up the datalogdir - * files and snapdir files keeping the last "-n" snapshot files - * and the corresponding logs. - */ -public class PurgeTxnLog { - private static final Logger LOG = LoggerFactory.getLogger(PurgeTxnLog.class); - - static void printUsage(){ - System.out.println("PurgeTxnLog dataLogDir [snapDir] -n count"); - System.out.println("\tdataLogDir -- path to the txn log directory"); - System.out.println("\tsnapDir -- path to the snapshot directory"); - System.out.println("\tcount -- the number of old snaps/logs you want to keep"); - System.exit(1); - } - - /** - * purges the snapshot and logs keeping the last num snapshots - * and the corresponding logs. - * @param dataDir the dir that has the logs - * @param snapDir the dir that has the snapshots - * @param num the number of snapshots to keep - * @throws IOException - */ - public static void purge(File dataDir, File snapDir, int num) throws IOException { - if (num < 3) { - throw new IllegalArgumentException("count should be greater than 3"); - } - - FileTxnSnapLog txnLog = new FileTxnSnapLog(dataDir, snapDir); - - // found any valid recent snapshots? - - // files to exclude from deletion - Set exc=new HashSet(); - List snaps = txnLog.findNRecentSnapshots(num); - if (snaps.size() == 0) - return; - File snapShot = snaps.get(snaps.size() -1); - for (File f: snaps) { - exc.add(f); - } - long zxid = Util.getZxidFromName(snapShot.getName(),"snapshot"); - exc.addAll(Arrays.asList(txnLog.getSnapshotLogs(zxid))); - - final Set exclude=exc; - class MyFileFilter implements FileFilter{ - private final String prefix; - MyFileFilter(String prefix){ - this.prefix=prefix; - } - public boolean accept(File f){ - if(!f.getName().startsWith(prefix) || exclude.contains(f)) - return false; - return true; - } - } - // add all non-excluded log files - List files=new ArrayList( - Arrays.asList(txnLog.getDataDir().listFiles(new MyFileFilter("log.")))); - // add all non-excluded snapshot files to the deletion list - files.addAll(Arrays.asList(txnLog.getSnapDir().listFiles(new MyFileFilter("snapshot.")))); - // remove the old files - for(File f: files) - { - System.out.println("Removing file: "+ - DateFormat.getDateTimeInstance().format(f.lastModified())+ - "\t"+f.getPath()); - if(!f.delete()){ - System.err.println("Failed to remove "+f.getPath()); - } - } - - } - - /** - * @param args PurgeTxnLog dataLogDir - * dataLogDir -- txn log directory - * -n num (number of snapshots to keep) - */ - public static void main(String[] args) throws IOException { - if(args.length<3 || args.length>4) - printUsage(); - int i = 0; - File dataDir=new File(args[0]); - File snapDir=dataDir; - if(args.length==4){ - i++; - snapDir=new File(args[i]); - } - i++; i++; - int num = Integer.parseInt(args[i]); - purge(dataDir, snapDir, num); - } -} diff --git a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/Request.java b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/Request.java deleted file mode 100644 index 80d2b99d5..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/Request.java +++ /dev/null @@ -1,241 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you 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. - */ - -package org.apache.zookeeper.server; - -import java.nio.ByteBuffer; -import java.util.List; - -import org.apache.jute.Record; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.apache.zookeeper.KeeperException; -import org.apache.zookeeper.ZooDefs.OpCode; -import org.apache.zookeeper.data.Id; -import org.apache.zookeeper.txn.TxnHeader; - -/** - * This is the structure that represents a request moving through a chain of - * RequestProcessors. There are various pieces of information that is tacked - * onto the request as it is processed. - */ -public class Request { - private static final Logger LOG = LoggerFactory.getLogger(Request.class); - - public final static Request requestOfDeath = new Request(null, 0, 0, 0, - null, null); - - /** - * @param cnxn - * @param sessionId - * @param xid - * @param type - * @param bb - */ - public Request(ServerCnxn cnxn, long sessionId, int xid, int type, - ByteBuffer bb, List authInfo) { - this.cnxn = cnxn; - this.sessionId = sessionId; - this.cxid = xid; - this.type = type; - this.request = bb; - this.authInfo = authInfo; - } - - public final long sessionId; - - public final int cxid; - - public final int type; - - public final ByteBuffer request; - - public final ServerCnxn cnxn; - - public TxnHeader hdr; - - public Record txn; - - public long zxid = -1; - - public final List authInfo; - - public final long createTime = System.currentTimeMillis(); - - private Object owner; - - private KeeperException e; - - public Object getOwner() { - return owner; - } - - public void setOwner(Object owner) { - this.owner = owner; - } - - /** - * is the packet type a valid packet in zookeeper - * - * @param type - * the type of the packet - * @return true if a valid packet, false if not - */ - static boolean isValid(int type) { - // make sure this is always synchronized with Zoodefs!! - switch (type) { - case OpCode.notification: - return false; - case OpCode.create: - case OpCode.delete: - case OpCode.createSession: - case OpCode.exists: - case OpCode.getData: - case OpCode.check: - case OpCode.multi: - case OpCode.setData: - case OpCode.sync: - case OpCode.getACL: - case OpCode.setACL: - case OpCode.getChildren: - case OpCode.getChildren2: - case OpCode.ping: - case OpCode.closeSession: - case OpCode.setWatches: - return true; - default: - return false; - } - } - - static boolean isQuorum(int type) { - switch (type) { - case OpCode.exists: - case OpCode.getACL: - case OpCode.getChildren: - case OpCode.getChildren2: - case OpCode.getData: - return false; - case OpCode.error: - case OpCode.closeSession: - case OpCode.create: - case OpCode.createSession: - case OpCode.delete: - case OpCode.setACL: - case OpCode.setData: - case OpCode.check: - case OpCode.multi: - return true; - default: - return false; - } - } - - static String op2String(int op) { - switch (op) { - case OpCode.notification: - return "notification"; - case OpCode.create: - return "create"; - case OpCode.setWatches: - return "setWatches"; - case OpCode.delete: - return "delete"; - case OpCode.exists: - return "exists"; - case OpCode.getData: - return "getData"; - case OpCode.check: - return "check"; - case OpCode.multi: - return "multi"; - case OpCode.setData: - return "setData"; - case OpCode.sync: - return "sync:"; - case OpCode.getACL: - return "getACL"; - case OpCode.setACL: - return "setACL"; - case OpCode.getChildren: - return "getChildren"; - case OpCode.getChildren2: - return "getChildren2"; - case OpCode.ping: - return "ping"; - case OpCode.createSession: - return "createSession"; - case OpCode.closeSession: - return "closeSession"; - case OpCode.error: - return "error"; - default: - return "unknown " + op; - } - } - - @Override - public String toString() { - StringBuilder sb = new StringBuilder(); - sb.append("sessionid:0x").append(Long.toHexString(sessionId)) - .append(" type:").append(op2String(type)) - .append(" cxid:0x").append(Long.toHexString(cxid)) - .append(" zxid:0x").append(Long.toHexString(hdr == null ? - -2 : hdr.getZxid())) - .append(" txntype:").append(hdr == null ? - "unknown" : "" + hdr.getType()); - - // best effort to print the path assoc with this request - String path = "n/a"; - if (type != OpCode.createSession - && type != OpCode.setWatches - && type != OpCode.closeSession - && request != null - && request.remaining() >= 4) - { - try { - // make sure we don't mess with request itself - ByteBuffer rbuf = request.asReadOnlyBuffer(); - rbuf.clear(); - int pathLen = rbuf.getInt(); - // sanity check - if (pathLen >= 0 - && pathLen < 4096 - && rbuf.remaining() >= pathLen) - { - byte b[] = new byte[pathLen]; - rbuf.get(b); - path = new String(b); - } - } catch (Exception e) { - // ignore - can't find the path, will output "n/a" instead - } - } - sb.append(" reqpath:").append(path); - - return sb.toString(); - } - - public void setException(KeeperException e) { - this.e = e; - } - - public KeeperException getException() { - return e; - } -} diff --git a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/RequestProcessor.java b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/RequestProcessor.java deleted file mode 100644 index 9c9e5bdc0..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/RequestProcessor.java +++ /dev/null @@ -1,44 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you 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. - */ - -package org.apache.zookeeper.server; - -/** - * RequestProcessors are chained together to process transactions. Requests are - * always processed in order. The standalone server, follower, and leader all - * have slightly different RequestProcessors chained together. - * - * Requests always move forward through the chain of RequestProcessors. Requests - * are passed to a RequestProcessor through processRequest(). Generally method - * will always be invoked by a single thread. - * - * When shutdown is called, the request RequestProcessor should also shutdown - * any RequestProcessors that it is connected to. - */ -public interface RequestProcessor { - @SuppressWarnings("serial") - public static class RequestProcessorException extends Exception { - public RequestProcessorException(String msg, Throwable t) { - super(msg, t); - } - } - - void processRequest(Request request) throws RequestProcessorException; - - void shutdown(); -} diff --git a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/ServerCnxn.java b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/ServerCnxn.java deleted file mode 100644 index 6dd509b16..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/ServerCnxn.java +++ /dev/null @@ -1,452 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you 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. - */ - -package org.apache.zookeeper.server; - -import java.io.IOException; -import java.io.PrintWriter; -import java.io.StringWriter; -import java.net.InetSocketAddress; -import java.nio.ByteBuffer; -import java.util.ArrayList; -import java.util.Collections; -import java.util.Date; -import java.util.HashMap; -import java.util.List; -import java.util.concurrent.atomic.AtomicLong; - -import org.apache.jute.Record; -import org.apache.zookeeper.WatchedEvent; -import org.apache.zookeeper.Watcher; -import org.apache.zookeeper.data.Id; -import org.apache.zookeeper.proto.ReplyHeader; -import org.apache.zookeeper.proto.RequestHeader; - -/** - * Interface to a Server connection - represents a connection from a client - * to the server. - */ -public abstract class ServerCnxn implements Stats, Watcher { - // This is just an arbitrary object to represent requests issued by - // (aka owned by) this class - final public static Object me = new Object(); - - protected ArrayList authInfo = new ArrayList(); - - /** - * If the client is of old version, we don't send r-o mode info to it. - * The reason is that if we would, old C client doesn't read it, which - * results in TCP RST packet, i.e. "connection reset by peer". - */ - boolean isOldClient = true; - - abstract int getSessionTimeout(); - - abstract void close(); - - public abstract void sendResponse(ReplyHeader h, Record r, String tag) - throws IOException; - - /* notify the client the session is closing and close/cleanup socket */ - abstract void sendCloseSession(); - - public abstract void process(WatchedEvent event); - - abstract long getSessionId(); - - abstract void setSessionId(long sessionId); - - /** auth info for the cnxn, returns an unmodifyable list */ - public List getAuthInfo() { - return Collections.unmodifiableList(authInfo); - } - - public void addAuthInfo(Id id) { - if (authInfo.contains(id) == false) { - authInfo.add(id); - } - } - - public boolean removeAuthInfo(Id id) { - return authInfo.remove(id); - } - - abstract void sendBuffer(ByteBuffer closeConn); - - abstract void enableRecv(); - - abstract void disableRecv(); - - abstract void setSessionTimeout(int sessionTimeout); - - protected ZooKeeperSaslServer zooKeeperSaslServer = null; - - protected static class CloseRequestException extends IOException { - private static final long serialVersionUID = -7854505709816442681L; - - public CloseRequestException(String msg) { - super(msg); - } - } - - protected static class EndOfStreamException extends IOException { - private static final long serialVersionUID = -8255690282104294178L; - - public EndOfStreamException(String msg) { - super(msg); - } - - public String toString() { - return "EndOfStreamException: " + getMessage(); - } - } - - /* - * See - * Zk Admin. this link is for all the commands. - */ - protected final static int confCmd = - ByteBuffer.wrap("conf".getBytes()).getInt(); - - /* - * See - * Zk Admin. this link is for all the commands. - */ - protected final static int consCmd = - ByteBuffer.wrap("cons".getBytes()).getInt(); - - /* - * See - * Zk Admin. this link is for all the commands. - */ - protected final static int crstCmd = - ByteBuffer.wrap("crst".getBytes()).getInt(); - - /* - * See - * Zk Admin. this link is for all the commands. - */ - protected final static int dumpCmd = - ByteBuffer.wrap("dump".getBytes()).getInt(); - - /* - * See - * Zk Admin. this link is for all the commands. - */ - protected final static int enviCmd = - ByteBuffer.wrap("envi".getBytes()).getInt(); - - /* - * See - * Zk Admin. this link is for all the commands. - */ - protected final static int getTraceMaskCmd = - ByteBuffer.wrap("gtmk".getBytes()).getInt(); - - /* - * See - * Zk Admin. this link is for all the commands. - */ - protected final static int ruokCmd = - ByteBuffer.wrap("ruok".getBytes()).getInt(); - /* - * See - * Zk Admin. this link is for all the commands. - */ - protected final static int setTraceMaskCmd = - ByteBuffer.wrap("stmk".getBytes()).getInt(); - - /* - * See - * Zk Admin. this link is for all the commands. - */ - protected final static int srvrCmd = - ByteBuffer.wrap("srvr".getBytes()).getInt(); - - /* - * See - * Zk Admin. this link is for all the commands. - */ - protected final static int srstCmd = - ByteBuffer.wrap("srst".getBytes()).getInt(); - - /* - * See - * Zk Admin. this link is for all the commands. - */ - protected final static int statCmd = - ByteBuffer.wrap("stat".getBytes()).getInt(); - - /* - * See - * Zk Admin. this link is for all the commands. - */ - protected final static int wchcCmd = - ByteBuffer.wrap("wchc".getBytes()).getInt(); - - /* - * See - * Zk Admin. this link is for all the commands. - */ - protected final static int wchpCmd = - ByteBuffer.wrap("wchp".getBytes()).getInt(); - - /* - * See - * Zk Admin. this link is for all the commands. - */ - protected final static int wchsCmd = - ByteBuffer.wrap("wchs".getBytes()).getInt(); - - /* - * See - * Zk Admin. this link is for all the commands. - */ - protected final static int mntrCmd = ByteBuffer.wrap("mntr".getBytes()) - .getInt(); - - /* - * See - * Zk Admin. this link is for all the commands. - */ - protected final static int isroCmd = ByteBuffer.wrap("isro".getBytes()) - .getInt(); - - protected final static HashMap cmd2String = - new HashMap(); - - // specify all of the commands that are available - static { - cmd2String.put(confCmd, "conf"); - cmd2String.put(consCmd, "cons"); - cmd2String.put(crstCmd, "crst"); - cmd2String.put(dumpCmd, "dump"); - cmd2String.put(enviCmd, "envi"); - cmd2String.put(getTraceMaskCmd, "gtmk"); - cmd2String.put(ruokCmd, "ruok"); - cmd2String.put(setTraceMaskCmd, "stmk"); - cmd2String.put(srstCmd, "srst"); - cmd2String.put(srvrCmd, "srvr"); - cmd2String.put(statCmd, "stat"); - cmd2String.put(wchcCmd, "wchc"); - cmd2String.put(wchpCmd, "wchp"); - cmd2String.put(wchsCmd, "wchs"); - cmd2String.put(mntrCmd, "mntr"); - cmd2String.put(isroCmd, "isro"); - } - - protected void packetReceived() { - incrPacketsReceived(); - ServerStats serverStats = serverStats(); - if (serverStats != null) { - serverStats().incrementPacketsReceived(); - } - } - - protected void packetSent() { - incrPacketsSent(); - ServerStats serverStats = serverStats(); - if (serverStats != null) { - serverStats().incrementPacketsSent(); - } - } - - protected abstract ServerStats serverStats(); - - protected final Date established = new Date(); - - protected final AtomicLong packetsReceived = new AtomicLong(); - protected final AtomicLong packetsSent = new AtomicLong(); - - protected long minLatency; - protected long maxLatency; - protected String lastOp; - protected long lastCxid; - protected long lastZxid; - protected long lastResponseTime; - protected long lastLatency; - - protected long count; - protected long totalLatency; - - public synchronized void resetStats() { - packetsReceived.set(0); - packetsSent.set(0); - minLatency = Long.MAX_VALUE; - maxLatency = 0; - lastOp = "NA"; - lastCxid = -1; - lastZxid = -1; - lastResponseTime = 0; - lastLatency = 0; - - count = 0; - totalLatency = 0; - } - - protected long incrPacketsReceived() { - return packetsReceived.incrementAndGet(); - } - - protected void incrOutstandingRequests(RequestHeader h) { - } - - protected long incrPacketsSent() { - return packetsSent.incrementAndGet(); - } - - protected synchronized void updateStatsForResponse(long cxid, long zxid, - String op, long start, long end) - { - // don't overwrite with "special" xids - we're interested - // in the clients last real operation - if (cxid >= 0) { - lastCxid = cxid; - } - lastZxid = zxid; - lastOp = op; - lastResponseTime = end; - long elapsed = end - start; - lastLatency = elapsed; - if (elapsed < minLatency) { - minLatency = elapsed; - } - if (elapsed > maxLatency) { - maxLatency = elapsed; - } - count++; - totalLatency += elapsed; - } - - public Date getEstablished() { - return (Date)established.clone(); - } - - public abstract long getOutstandingRequests(); - - public long getPacketsReceived() { - return packetsReceived.longValue(); - } - - public long getPacketsSent() { - return packetsSent.longValue(); - } - - public synchronized long getMinLatency() { - return minLatency == Long.MAX_VALUE ? 0 : minLatency; - } - - public synchronized long getAvgLatency() { - return count == 0 ? 0 : totalLatency / count; - } - - public synchronized long getMaxLatency() { - return maxLatency; - } - - public synchronized String getLastOperation() { - return lastOp; - } - - public synchronized long getLastCxid() { - return lastCxid; - } - - public synchronized long getLastZxid() { - return lastZxid; - } - - public synchronized long getLastResponseTime() { - return lastResponseTime; - } - - public synchronized long getLastLatency() { - return lastLatency; - } - - /** - * Prints detailed stats information for the connection. - * - * @see dumpConnectionInfo(PrintWriter, boolean) for brief stats - */ - @Override - public String toString() { - StringWriter sw = new StringWriter(); - PrintWriter pwriter = new PrintWriter(sw); - dumpConnectionInfo(pwriter, false); - pwriter.flush(); - pwriter.close(); - return sw.toString(); - } - - public abstract InetSocketAddress getRemoteSocketAddress(); - public abstract int getInterestOps(); - - /** - * Print information about the connection. - * @param brief iff true prints brief details, otw full detail - * @return information about this connection - */ - protected synchronized void - dumpConnectionInfo(PrintWriter pwriter, boolean brief) { - pwriter.print(" "); - pwriter.print(getRemoteSocketAddress()); - pwriter.print("["); - int interestOps = getInterestOps(); - pwriter.print(interestOps == 0 ? "0" : Integer.toHexString(interestOps)); - pwriter.print("](queued="); - pwriter.print(getOutstandingRequests()); - pwriter.print(",recved="); - pwriter.print(getPacketsReceived()); - pwriter.print(",sent="); - pwriter.print(getPacketsSent()); - - if (!brief) { - long sessionId = getSessionId(); - if (sessionId != 0) { - pwriter.print(",sid=0x"); - pwriter.print(Long.toHexString(sessionId)); - pwriter.print(",lop="); - pwriter.print(getLastOperation()); - pwriter.print(",est="); - pwriter.print(getEstablished().getTime()); - pwriter.print(",to="); - pwriter.print(getSessionTimeout()); - long lastCxid = getLastCxid(); - if (lastCxid >= 0) { - pwriter.print(",lcxid=0x"); - pwriter.print(Long.toHexString(lastCxid)); - } - pwriter.print(",lzxid=0x"); - pwriter.print(Long.toHexString(getLastZxid())); - pwriter.print(",lresp="); - pwriter.print(getLastResponseTime()); - pwriter.print(",llat="); - pwriter.print(getLastLatency()); - pwriter.print(",minlat="); - pwriter.print(getMinLatency()); - pwriter.print(",avglat="); - pwriter.print(getAvgLatency()); - pwriter.print(",maxlat="); - pwriter.print(getMaxLatency()); - } - } - pwriter.print(")"); - } - -} diff --git a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/ServerCnxnFactory.java b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/ServerCnxnFactory.java deleted file mode 100644 index 9b7fd8738..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/ServerCnxnFactory.java +++ /dev/null @@ -1,211 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you 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. - */ - -package org.apache.zookeeper.server; - -import java.io.IOException; -import java.net.InetSocketAddress; -import java.nio.ByteBuffer; -import java.util.HashSet; -import java.util.Map; -import java.util.concurrent.ConcurrentHashMap; - -import javax.security.auth.login.Configuration; -import javax.security.auth.login.LoginException; -import javax.security.auth.login.AppConfigurationEntry; - -import javax.management.JMException; - -import org.apache.zookeeper.Login; -import org.apache.zookeeper.Environment; -import org.apache.zookeeper.jmx.MBeanRegistry; -import org.apache.zookeeper.server.auth.SaslServerCallbackHandler; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -public abstract class ServerCnxnFactory { - - public static final String ZOOKEEPER_SERVER_CNXN_FACTORY = "zookeeper.serverCnxnFactory"; - - public interface PacketProcessor { - public void processPacket(ByteBuffer packet, ServerCnxn src); - } - - Logger LOG = LoggerFactory.getLogger(ServerCnxnFactory.class); - - /** - * The buffer will cause the connection to be close when we do a send. - */ - static final ByteBuffer closeConn = ByteBuffer.allocate(0); - - public abstract int getLocalPort(); - - public abstract Iterable getConnections(); - - public int getNumAliveConnections() { - synchronized(cnxns) { - return cnxns.size(); - } - } - - public abstract void closeSession(long sessionId); - - public abstract void configure(InetSocketAddress addr, - int maxClientCnxns) throws IOException; - - protected SaslServerCallbackHandler saslServerCallbackHandler; - public Login login; - - /** Maximum number of connections allowed from particular host (ip) */ - public abstract int getMaxClientCnxnsPerHost(); - - /** Maximum number of connections allowed from particular host (ip) */ - public abstract void setMaxClientCnxnsPerHost(int max); - - public abstract void startup(ZooKeeperServer zkServer) - throws IOException, InterruptedException; - - public abstract void join() throws InterruptedException; - - public abstract void shutdown(); - - public abstract void start(); - - protected ZooKeeperServer zkServer; - final public void setZooKeeperServer(ZooKeeperServer zk) { - this.zkServer = zk; - if (zk != null) { - zk.setServerCnxnFactory(this); - } - } - - public abstract void closeAll(); - - static public ServerCnxnFactory createFactory() throws IOException { - String serverCnxnFactoryName = - System.getProperty(ZOOKEEPER_SERVER_CNXN_FACTORY); - if (serverCnxnFactoryName == null) { - serverCnxnFactoryName = NIOServerCnxnFactory.class.getName(); - } - try { - return (ServerCnxnFactory) Class.forName(serverCnxnFactoryName) - .newInstance(); - } catch (Exception e) { - IOException ioe = new IOException("Couldn't instantiate " - + serverCnxnFactoryName); - ioe.initCause(e); - throw ioe; - } - } - - static public ServerCnxnFactory createFactory(int clientPort, - int maxClientCnxns) throws IOException - { - return createFactory(new InetSocketAddress(clientPort), maxClientCnxns); - } - - static public ServerCnxnFactory createFactory(InetSocketAddress addr, - int maxClientCnxns) throws IOException - { - ServerCnxnFactory factory = createFactory(); - factory.configure(addr, maxClientCnxns); - return factory; - } - - public abstract InetSocketAddress getLocalAddress(); - - private final Map connectionBeans - = new ConcurrentHashMap(); - - protected final HashSet cnxns = new HashSet(); - public void unregisterConnection(ServerCnxn serverCnxn) { - ConnectionBean jmxConnectionBean = connectionBeans.remove(serverCnxn); - if (jmxConnectionBean != null){ - MBeanRegistry.getInstance().unregister(jmxConnectionBean); - } - } - - public void registerConnection(ServerCnxn serverCnxn) { - if (zkServer != null) { - ConnectionBean jmxConnectionBean = new ConnectionBean(serverCnxn, zkServer); - try { - MBeanRegistry.getInstance().register(jmxConnectionBean, zkServer.jmxServerBean); - connectionBeans.put(serverCnxn, jmxConnectionBean); - } catch (JMException e) { - LOG.warn("Could not register connection", e); - } - } - - } - - /** - * Initialize the server SASL if specified. - * - * If the user has specified a "ZooKeeperServer.LOGIN_CONTEXT_NAME_KEY" - * or a jaas.conf using "java.security.auth.login.config" - * the authentication is required and an exception is raised. - * Otherwise no authentication is configured and no exception is raised. - * - * @throws IOException if jaas.conf is missing or there's an error in it. - */ - protected void configureSaslLogin() throws IOException { - String serverSection = System.getProperty(ZooKeeperSaslServer.LOGIN_CONTEXT_NAME_KEY, - ZooKeeperSaslServer.DEFAULT_LOGIN_CONTEXT_NAME); - - // Note that 'Configuration' here refers to javax.security.auth.login.Configuration. - AppConfigurationEntry entries[] = null; - SecurityException securityException = null; - try { - entries = Configuration.getConfiguration().getAppConfigurationEntry(serverSection); - } catch (SecurityException e) { - // handle below: might be harmless if the user doesn't intend to use JAAS authentication. - securityException = e; - } - - // No entries in jaas.conf - // If there's a configuration exception fetching the jaas section and - // the user has required sasl by specifying a LOGIN_CONTEXT_NAME_KEY or a jaas file - // we throw an exception otherwise we continue without authentication. - if (entries == null) { - String jaasFile = System.getProperty(Environment.JAAS_CONF_KEY); - String loginContextName = System.getProperty(ZooKeeperSaslServer.LOGIN_CONTEXT_NAME_KEY); - if (securityException != null && (loginContextName != null || jaasFile != null)) { - String errorMessage = "No JAAS configuration section named '" + serverSection + "' was found"; - if (jaasFile != null) { - errorMessage += "in '" + jaasFile + "'."; - } - if (loginContextName != null) { - errorMessage += " But " + ZooKeeperSaslServer.LOGIN_CONTEXT_NAME_KEY + " was set."; - } - LOG.error(errorMessage); - throw new IOException(errorMessage); - } - return; - } - - // jaas.conf entry available - try { - saslServerCallbackHandler = new SaslServerCallbackHandler(Configuration.getConfiguration()); - login = new Login(serverSection, saslServerCallbackHandler); - login.startThreadIfNeeded(); - } catch (LoginException e) { - throw new IOException("Could not configure server because SASL configuration did not allow the " - + " ZooKeeper server to authenticate itself properly: " + e); - } - } -} diff --git a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/ServerConfig.java b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/ServerConfig.java deleted file mode 100644 index ec710cd3a..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/ServerConfig.java +++ /dev/null @@ -1,111 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you 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. - */ - -package org.apache.zookeeper.server; - -import java.net.InetSocketAddress; -import java.util.Arrays; - -import org.apache.zookeeper.server.quorum.QuorumPeerConfig; -import org.apache.zookeeper.server.quorum.QuorumPeerConfig.ConfigException; - -/** - * Server configuration storage. - * - * We use this instead of Properties as it's typed. - * - */ -public class ServerConfig { - //// - //// If you update the configuration parameters be sure - //// to update the "conf" 4letter word - //// - protected InetSocketAddress clientPortAddress; - protected String dataDir; - protected String dataLogDir; - protected int tickTime = ZooKeeperServer.DEFAULT_TICK_TIME; - protected int maxClientCnxns; - /** defaults to -1 if not set explicitly */ - protected int minSessionTimeout = -1; - /** defaults to -1 if not set explicitly */ - protected int maxSessionTimeout = -1; - - /** - * Parse arguments for server configuration - * @param args clientPort dataDir and optional tickTime - * @return ServerConfig configured wrt arguments - * @throws IllegalArgumentException on invalid usage - */ - public void parse(String[] args) { - if (args.length < 2 || args.length > 4) { - throw new IllegalArgumentException("Invalid args:" - + Arrays.toString(args)); - } - - clientPortAddress = new InetSocketAddress(Integer.parseInt(args[0])); - dataDir = args[1]; - dataLogDir = dataDir; - if (args.length == 3) { - tickTime = Integer.parseInt(args[2]); - } - if (args.length == 4) { - maxClientCnxns = Integer.parseInt(args[3]); - } - } - - /** - * Parse a ZooKeeper configuration file - * @param path the patch of the configuration file - * @return ServerConfig configured wrt arguments - * @throws ConfigException error processing configuration - */ - public void parse(String path) throws ConfigException { - QuorumPeerConfig config = new QuorumPeerConfig(); - config.parse(path); - - // let qpconfig parse the file and then pull the stuff we are - // interested in - readFrom(config); - } - - /** - * Read attributes from a QuorumPeerConfig. - * @param config - */ - public void readFrom(QuorumPeerConfig config) { - clientPortAddress = config.getClientPortAddress(); - dataDir = config.getDataDir(); - dataLogDir = config.getDataLogDir(); - tickTime = config.getTickTime(); - maxClientCnxns = config.getMaxClientCnxns(); - minSessionTimeout = config.getMinSessionTimeout(); - maxSessionTimeout = config.getMaxSessionTimeout(); - } - - public InetSocketAddress getClientPortAddress() { - return clientPortAddress; - } - public String getDataDir() { return dataDir; } - public String getDataLogDir() { return dataLogDir; } - public int getTickTime() { return tickTime; } - public int getMaxClientCnxns() { return maxClientCnxns; } - /** minimum session timeout in milliseconds, -1 if unset */ - public int getMinSessionTimeout() { return minSessionTimeout; } - /** maximum session timeout in milliseconds, -1 if unset */ - public int getMaxSessionTimeout() { return maxSessionTimeout; } -} diff --git a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/ServerStats.java b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/ServerStats.java deleted file mode 100644 index dbee6d540..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/ServerStats.java +++ /dev/null @@ -1,139 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you 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. - */ - -package org.apache.zookeeper.server; - - -/** - * Basic Server Statistics - */ -public class ServerStats { - private long packetsSent; - private long packetsReceived; - private long maxLatency; - private long minLatency = Long.MAX_VALUE; - private long totalLatency = 0; - private long count = 0; - - private final Provider provider; - - public interface Provider { - public long getOutstandingRequests(); - public long getLastProcessedZxid(); - public String getState(); - public int getNumAliveConnections(); - } - - public ServerStats(Provider provider) { - this.provider = provider; - } - - // getters - synchronized public long getMinLatency() { - return minLatency == Long.MAX_VALUE ? 0 : minLatency; - } - - synchronized public long getAvgLatency() { - if (count != 0) { - return totalLatency / count; - } - return 0; - } - - synchronized public long getMaxLatency() { - return maxLatency; - } - - public long getOutstandingRequests() { - return provider.getOutstandingRequests(); - } - - public long getLastProcessedZxid(){ - return provider.getLastProcessedZxid(); - } - - synchronized public long getPacketsReceived() { - return packetsReceived; - } - - synchronized public long getPacketsSent() { - return packetsSent; - } - - public String getServerState() { - return provider.getState(); - } - - /** The number of client connections alive to this server */ - public int getNumAliveClientConnections() { - return provider.getNumAliveConnections(); - } - - @Override - public String toString(){ - StringBuilder sb = new StringBuilder(); - sb.append("Latency min/avg/max: " + getMinLatency() + "/" - + getAvgLatency() + "/" + getMaxLatency() + "\n"); - sb.append("Received: " + getPacketsReceived() + "\n"); - sb.append("Sent: " + getPacketsSent() + "\n"); - sb.append("Connections: " + getNumAliveClientConnections() + "\n"); - - if (provider != null) { - sb.append("Outstanding: " + getOutstandingRequests() + "\n"); - sb.append("Zxid: 0x"+ Long.toHexString(getLastProcessedZxid())+ "\n"); - } - sb.append("Mode: " + getServerState() + "\n"); - return sb.toString(); - } - // mutators - synchronized void updateLatency(long requestCreateTime) { - long latency = System.currentTimeMillis() - requestCreateTime; - totalLatency += latency; - count++; - if (latency < minLatency) { - minLatency = latency; - } - if (latency > maxLatency) { - maxLatency = latency; - } - } - synchronized public void resetLatency(){ - totalLatency = 0; - count = 0; - maxLatency = 0; - minLatency = Long.MAX_VALUE; - } - synchronized public void resetMaxLatency(){ - maxLatency = getMinLatency(); - } - synchronized public void incrementPacketsReceived() { - packetsReceived++; - } - synchronized public void incrementPacketsSent() { - packetsSent++; - } - synchronized public void resetRequestCounters(){ - packetsReceived = 0; - packetsSent = 0; - } - synchronized public void reset() { - resetLatency(); - resetRequestCounters(); - } - -} diff --git a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/SessionTracker.java b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/SessionTracker.java deleted file mode 100644 index 3535e1b5c..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/SessionTracker.java +++ /dev/null @@ -1,81 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you 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. - */ - -package org.apache.zookeeper.server; - -import java.io.PrintWriter; - -import org.apache.zookeeper.KeeperException; -import org.apache.zookeeper.KeeperException.SessionExpiredException; -import org.apache.zookeeper.KeeperException.SessionMovedException; - -/** - * This is the basic interface that ZooKeeperServer uses to track sessions. The - * standalone and leader ZooKeeperServer use the same SessionTracker. The - * FollowerZooKeeperServer uses a SessionTracker which is basically a simple - * shell to track information to be forwarded to the leader. - */ -public interface SessionTracker { - public static interface Session { - long getSessionId(); - int getTimeout(); - boolean isClosing(); - } - public static interface SessionExpirer { - void expire(Session session); - - long getServerId(); - } - - long createSession(int sessionTimeout); - - void addSession(long id, int to); - - /** - * @param sessionId - * @param sessionTimeout - * @return false if session is no longer active - */ - boolean touchSession(long sessionId, int sessionTimeout); - - /** - * Mark that the session is in the process of closing. - * @param sessionId - */ - void setSessionClosing(long sessionId); - - /** - * - */ - void shutdown(); - - /** - * @param sessionId - */ - void removeSession(long sessionId); - - void checkSession(long sessionId, Object owner) throws KeeperException.SessionExpiredException, SessionMovedException; - - void setOwner(long id, Object owner) throws SessionExpiredException; - - /** - * Text dump of session information, suitable for debugging. - * @param pwriter the output writer - */ - void dumpSessions(PrintWriter pwriter); -} diff --git a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/SessionTrackerImpl.java b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/SessionTrackerImpl.java deleted file mode 100644 index 0cf2fa9fc..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/SessionTrackerImpl.java +++ /dev/null @@ -1,279 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you 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. - */ - -package org.apache.zookeeper.server; - -import java.io.PrintWriter; -import java.io.StringWriter; -import java.util.ArrayList; -import java.util.Collections; -import java.util.Date; -import java.util.HashMap; -import java.util.HashSet; -import java.util.Map.Entry; -import java.util.concurrent.ConcurrentHashMap; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.apache.zookeeper.KeeperException; -import org.apache.zookeeper.KeeperException.SessionExpiredException; - -/** - * This is a full featured SessionTracker. It tracks session in grouped by tick - * interval. It always rounds up the tick interval to provide a sort of grace - * period. Sessions are thus expired in batches made up of sessions that expire - * in a given interval. - */ -public class SessionTrackerImpl extends Thread implements SessionTracker { - private static final Logger LOG = LoggerFactory.getLogger(SessionTrackerImpl.class); - - HashMap sessionsById = new HashMap(); - - HashMap sessionSets = new HashMap(); - - ConcurrentHashMap sessionsWithTimeout; - long nextSessionId = 0; - long nextExpirationTime; - - int expirationInterval; - - public static class SessionImpl implements Session { - SessionImpl(long sessionId, int timeout, long expireTime) { - this.sessionId = sessionId; - this.timeout = timeout; - this.tickTime = expireTime; - isClosing = false; - } - - final long sessionId; - final int timeout; - long tickTime; - boolean isClosing; - - Object owner; - - public long getSessionId() { return sessionId; } - public int getTimeout() { return timeout; } - public boolean isClosing() { return isClosing; } - } - - public static long initializeNextSession(long id) { - long nextSid = 0; - nextSid = (System.currentTimeMillis() << 24) >>> 8; - nextSid = nextSid | (id <<56); - return nextSid; - } - - static class SessionSet { - HashSet sessions = new HashSet(); - } - - SessionExpirer expirer; - - private long roundToInterval(long time) { - // We give a one interval grace period - return (time / expirationInterval + 1) * expirationInterval; - } - - public SessionTrackerImpl(SessionExpirer expirer, - ConcurrentHashMap sessionsWithTimeout, int tickTime, - long sid) - { - super("SessionTracker"); - this.expirer = expirer; - this.expirationInterval = tickTime; - this.sessionsWithTimeout = sessionsWithTimeout; - nextExpirationTime = roundToInterval(System.currentTimeMillis()); - this.nextSessionId = initializeNextSession(sid); - for (Entry e : sessionsWithTimeout.entrySet()) { - addSession(e.getKey(), e.getValue()); - } - } - - volatile boolean running = true; - - volatile long currentTime; - - synchronized public void dumpSessions(PrintWriter pwriter) { - pwriter.print("Session Sets ("); - pwriter.print(sessionSets.size()); - pwriter.println("):"); - ArrayList keys = new ArrayList(sessionSets.keySet()); - Collections.sort(keys); - for (long time : keys) { - pwriter.print(sessionSets.get(time).sessions.size()); - pwriter.print(" expire at "); - pwriter.print(new Date(time)); - pwriter.println(":"); - for (SessionImpl s : sessionSets.get(time).sessions) { - pwriter.print("\t0x"); - pwriter.println(Long.toHexString(s.sessionId)); - } - } - } - - @Override - synchronized public String toString() { - StringWriter sw = new StringWriter(); - PrintWriter pwriter = new PrintWriter(sw); - dumpSessions(pwriter); - pwriter.flush(); - pwriter.close(); - return sw.toString(); - } - - @Override - synchronized public void run() { - try { - while (running) { - currentTime = System.currentTimeMillis(); - if (nextExpirationTime > currentTime) { - this.wait(nextExpirationTime - currentTime); - continue; - } - SessionSet set; - set = sessionSets.remove(nextExpirationTime); - if (set != null) { - for (SessionImpl s : set.sessions) { - setSessionClosing(s.sessionId); - expirer.expire(s); - } - } - nextExpirationTime += expirationInterval; - } - } catch (InterruptedException e) { - LOG.error("Unexpected interruption", e); - } - LOG.info("SessionTrackerImpl exited loop!"); - } - - synchronized public boolean touchSession(long sessionId, int timeout) { - if (LOG.isTraceEnabled()) { - ZooTrace.logTraceMessage(LOG, - ZooTrace.CLIENT_PING_TRACE_MASK, - "SessionTrackerImpl --- Touch session: 0x" - + Long.toHexString(sessionId) + " with timeout " + timeout); - } - SessionImpl s = sessionsById.get(sessionId); - // Return false, if the session doesn't exists or marked as closing - if (s == null || s.isClosing()) { - return false; - } - long expireTime = roundToInterval(System.currentTimeMillis() + timeout); - if (s.tickTime >= expireTime) { - // Nothing needs to be done - return true; - } - SessionSet set = sessionSets.get(s.tickTime); - if (set != null) { - set.sessions.remove(s); - } - s.tickTime = expireTime; - set = sessionSets.get(s.tickTime); - if (set == null) { - set = new SessionSet(); - sessionSets.put(expireTime, set); - } - set.sessions.add(s); - return true; - } - - synchronized public void setSessionClosing(long sessionId) { - if (LOG.isTraceEnabled()) { - LOG.info("Session closing: 0x" + Long.toHexString(sessionId)); - } - SessionImpl s = sessionsById.get(sessionId); - if (s == null) { - return; - } - s.isClosing = true; - } - - synchronized public void removeSession(long sessionId) { - SessionImpl s = sessionsById.remove(sessionId); - sessionsWithTimeout.remove(sessionId); - if (LOG.isTraceEnabled()) { - ZooTrace.logTraceMessage(LOG, ZooTrace.SESSION_TRACE_MASK, - "SessionTrackerImpl --- Removing session 0x" - + Long.toHexString(sessionId)); - } - if (s != null) { - SessionSet set = sessionSets.get(s.tickTime); - // Session expiration has been removing the sessions - if(set != null){ - set.sessions.remove(s); - } - } - } - - public void shutdown() { - LOG.info("Shutting down"); - - running = false; - if (LOG.isTraceEnabled()) { - ZooTrace.logTraceMessage(LOG, ZooTrace.getTextTraceLevel(), - "Shutdown SessionTrackerImpl!"); - } - } - - - synchronized public long createSession(int sessionTimeout) { - addSession(nextSessionId, sessionTimeout); - return nextSessionId++; - } - - synchronized public void addSession(long id, int sessionTimeout) { - sessionsWithTimeout.put(id, sessionTimeout); - if (sessionsById.get(id) == null) { - SessionImpl s = new SessionImpl(id, sessionTimeout, 0); - sessionsById.put(id, s); - if (LOG.isTraceEnabled()) { - ZooTrace.logTraceMessage(LOG, ZooTrace.SESSION_TRACE_MASK, - "SessionTrackerImpl --- Adding session 0x" - + Long.toHexString(id) + " " + sessionTimeout); - } - } else { - if (LOG.isTraceEnabled()) { - ZooTrace.logTraceMessage(LOG, ZooTrace.SESSION_TRACE_MASK, - "SessionTrackerImpl --- Existing session 0x" - + Long.toHexString(id) + " " + sessionTimeout); - } - } - touchSession(id, sessionTimeout); - } - - synchronized public void checkSession(long sessionId, Object owner) throws KeeperException.SessionExpiredException, KeeperException.SessionMovedException { - SessionImpl session = sessionsById.get(sessionId); - if (session == null || session.isClosing()) { - throw new KeeperException.SessionExpiredException(); - } - if (session.owner == null) { - session.owner = owner; - } else if (session.owner != owner) { - throw new KeeperException.SessionMovedException(); - } - } - - synchronized public void setOwner(long id, Object owner) throws SessionExpiredException { - SessionImpl session = sessionsById.get(id); - if (session == null || session.isClosing()) { - throw new KeeperException.SessionExpiredException(); - } - session.owner = owner; - } -} diff --git a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/SnapshotFormatter.java b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/SnapshotFormatter.java deleted file mode 100644 index f94c54ddf..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/SnapshotFormatter.java +++ /dev/null @@ -1,128 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you 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. - */ - -package org.apache.zookeeper.server; - -import java.io.BufferedInputStream; -import java.io.FileInputStream; -import java.io.IOException; -import java.io.InputStream; -import java.util.Date; -import java.util.HashMap; -import java.util.Map; -import java.util.Set; -import java.util.zip.Adler32; -import java.util.zip.CheckedInputStream; - -import org.apache.jute.BinaryInputArchive; -import org.apache.jute.InputArchive; -import org.apache.zookeeper.data.StatPersisted; -import org.apache.zookeeper.server.persistence.FileSnap; - -/** - * Dump a snapshot file to stdout. - */ -public class SnapshotFormatter { - - /** - * USAGE: SnapshotFormatter snapshot_file - */ - public static void main(String[] args) throws Exception { - if (args.length != 1) { - System.err.println("USAGE: SnapshotFormatter snapshot_file"); - System.exit(2); - } - - new SnapshotFormatter().run(args[0]); - } - - public void run(String snapshotFileName) throws IOException { - InputStream is = new CheckedInputStream( - new BufferedInputStream(new FileInputStream(snapshotFileName)), - new Adler32()); - InputArchive ia = BinaryInputArchive.getArchive(is); - - FileSnap fileSnap = new FileSnap(null); - - DataTree dataTree = new DataTree(); - Map sessions = new HashMap(); - - fileSnap.deserialize(dataTree, sessions, ia); - - printDetails(dataTree, sessions); - } - - private void printDetails(DataTree dataTree, Map sessions) { - printZnodeDetails(dataTree); - printSessionDetails(dataTree, sessions); - } - - private void printZnodeDetails(DataTree dataTree) { - System.out.println(String.format("ZNode Details (count=%d):", - dataTree.getNodeCount())); - - printZnode(dataTree, "/"); - System.out.println("----"); - } - - private void printZnode(DataTree dataTree, String name) { - System.out.println("----"); - DataNode n = dataTree.getNode(name); - Set children; - synchronized(n) { // keep findbugs happy - System.out.println(name); - printStat(n.stat); - if (n.data != null) { - System.out.println(" dataLength = " + n.data.length); - } else { - System.out.println(" no data"); - } - children = n.getChildren(); - } - if (children != null) { - for (String child : children) { - printZnode(dataTree, name + (name.equals("/") ? "" : "/") + child); - } - } - } - - private void printSessionDetails(DataTree dataTree, Map sessions) { - System.out.println("Session Details (sid, timeout, ephemeralCount):"); - for (Map.Entry e : sessions.entrySet()) { - long sid = e.getKey(); - System.out.println(String.format("%#016x, %d, %d", - sid, e.getValue(), dataTree.getEphemerals(sid).size())); - } - } - - private void printStat(StatPersisted stat) { - printHex("cZxid", stat.getCzxid()); - System.out.println(" ctime = " + new Date(stat.getCtime()).toString()); - printHex("mZxid", stat.getMzxid()); - System.out.println(" mtime = " + new Date(stat.getMtime()).toString()); - printHex("pZxid", stat.getPzxid()); - System.out.println(" cversion = " + stat.getCversion()); - System.out.println(" dataVersion = " + stat.getVersion()); - System.out.println(" aclVersion = " + stat.getAversion()); - printHex("ephemeralOwner", stat.getEphemeralOwner()); - } - - private void printHex(String prefix, long value) { - System.out.println(String.format(" %s = %#016x", prefix, value)); - } -} diff --git a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/Stats.java b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/Stats.java deleted file mode 100644 index e2584ee58..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/Stats.java +++ /dev/null @@ -1,68 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you 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. - */ - -package org.apache.zookeeper.server; - -import java.util.Date; - -/** - * Statistics on the ServerCnxn - */ -interface Stats { - /** Date/time the connection was established - * @since 3.3.0 */ - Date getEstablished(); - - /** - * The number of requests that have been submitted but not yet - * responded to. - */ - long getOutstandingRequests(); - /** Number of packets received */ - long getPacketsReceived(); - /** Number of packets sent (incl notifications) */ - long getPacketsSent(); - /** Min latency in ms - * @since 3.3.0 */ - long getMinLatency(); - /** Average latency in ms - * @since 3.3.0 */ - long getAvgLatency(); - /** Max latency in ms - * @since 3.3.0 */ - long getMaxLatency(); - /** Last operation performed by this connection - * @since 3.3.0 */ - String getLastOperation(); - /** Last cxid of this connection - * @since 3.3.0 */ - long getLastCxid(); - /** Last zxid of this connection - * @since 3.3.0 */ - long getLastZxid(); - /** Last time server sent a response to client on this connection - * @since 3.3.0 */ - long getLastResponseTime(); - /** Latency of last response to client on this connection in ms - * @since 3.3.0 */ - long getLastLatency(); - - /** Reset counters - * @since 3.3.0 */ - void resetStats(); -} diff --git a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/SyncRequestProcessor.java b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/SyncRequestProcessor.java deleted file mode 100644 index 929996147..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/SyncRequestProcessor.java +++ /dev/null @@ -1,235 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you 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. - */ - -package org.apache.zookeeper.server; - -import java.io.Flushable; -import java.io.IOException; -import java.util.LinkedList; -import java.util.Random; -import java.util.concurrent.LinkedBlockingQueue; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -/** - * This RequestProcessor logs requests to disk. It batches the requests to do - * the io efficiently. The request is not passed to the next RequestProcessor - * until its log has been synced to disk. - * - * SyncRequestProcessor is used in 3 different cases - * 1. Leader - Sync request to disk and forward it to AckRequestProcessor which - * send ack back to itself. - * 2. Follower - Sync request to disk and forward request to - * SendAckRequestProcessor which send the packets to leader. - * SendAckRequestProcessor is flushable which allow us to force - * push packets to leader. - * 3. Observer - Sync committed request to disk (received as INFORM packet). - * It never send ack back to the leader, so the nextProcessor will - * be null. This change the semantic of txnlog on the observer - * since it only contains committed txns. - */ -public class SyncRequestProcessor extends Thread implements RequestProcessor { - private static final Logger LOG = LoggerFactory.getLogger(SyncRequestProcessor.class); - private final ZooKeeperServer zks; - private final LinkedBlockingQueue queuedRequests = - new LinkedBlockingQueue(); - private final RequestProcessor nextProcessor; - - private Thread snapInProcess = null; - volatile private boolean running; - - /** - * Transactions that have been written and are waiting to be flushed to - * disk. Basically this is the list of SyncItems whose callbacks will be - * invoked after flush returns successfully. - */ - private final LinkedList toFlush = new LinkedList(); - private final Random r = new Random(System.nanoTime()); - /** - * The number of log entries to log before starting a snapshot - */ - private static int snapCount = ZooKeeperServer.getSnapCount(); - - /** - * The number of log entries before rolling the log, number - * is chosen randomly - */ - private static int randRoll; - - private final Request requestOfDeath = Request.requestOfDeath; - - public SyncRequestProcessor(ZooKeeperServer zks, - RequestProcessor nextProcessor) - { - super("SyncThread:" + zks.getServerId()); - this.zks = zks; - this.nextProcessor = nextProcessor; - running = true; - } - - /** - * used by tests to check for changing - * snapcounts - * @param count - */ - public static void setSnapCount(int count) { - snapCount = count; - randRoll = count; - } - - /** - * used by tests to get the snapcount - * @return the snapcount - */ - public static int getSnapCount() { - return snapCount; - } - - /** - * Sets the value of randRoll. This method - * is here to avoid a findbugs warning for - * setting a static variable in an instance - * method. - * - * @param roll - */ - private static void setRandRoll(int roll) { - randRoll = roll; - } - - @Override - public void run() { - try { - int logCount = 0; - - // we do this in an attempt to ensure that not all of the servers - // in the ensemble take a snapshot at the same time - setRandRoll(r.nextInt(snapCount/2)); - while (true) { - Request si = null; - if (toFlush.isEmpty()) { - si = queuedRequests.take(); - } else { - si = queuedRequests.poll(); - if (si == null) { - flush(toFlush); - continue; - } - } - if (si == requestOfDeath) { - break; - } - if (si != null) { - // track the number of records written to the log - if (zks.getZKDatabase().append(si)) { - logCount++; - if (logCount > (snapCount / 2 + randRoll)) { - randRoll = r.nextInt(snapCount/2); - // roll the log - zks.getZKDatabase().rollLog(); - // take a snapshot - if (snapInProcess != null && snapInProcess.isAlive()) { - LOG.warn("Too busy to snap, skipping"); - } else { - snapInProcess = new Thread("Snapshot Thread") { - public void run() { - try { - zks.takeSnapshot(); - } catch(Exception e) { - LOG.warn("Unexpected exception", e); - } - } - }; - snapInProcess.start(); - } - logCount = 0; - } - } else if (toFlush.isEmpty()) { - // optimization for read heavy workloads - // iff this is a read, and there are no pending - // flushes (writes), then just pass this to the next - // processor - if (nextProcessor != null) { - nextProcessor.processRequest(si); - if (nextProcessor instanceof Flushable) { - ((Flushable)nextProcessor).flush(); - } - } - continue; - } - toFlush.add(si); - if (toFlush.size() > 1000) { - flush(toFlush); - } - } - } - } catch (Throwable t) { - LOG.error("Severe unrecoverable error, exiting", t); - running = false; - System.exit(11); - } - LOG.info("SyncRequestProcessor exited!"); - } - - private void flush(LinkedList toFlush) - throws IOException, RequestProcessorException - { - if (toFlush.isEmpty()) - return; - - zks.getZKDatabase().commit(); - while (!toFlush.isEmpty()) { - Request i = toFlush.remove(); - if (nextProcessor != null) { - nextProcessor.processRequest(i); - } - } - if (nextProcessor != null && nextProcessor instanceof Flushable) { - ((Flushable)nextProcessor).flush(); - } - } - - public void shutdown() { - LOG.info("Shutting down"); - queuedRequests.add(requestOfDeath); - try { - if(running){ - this.join(); - } - if (!toFlush.isEmpty()) { - flush(toFlush); - } - } catch(InterruptedException e) { - LOG.warn("Interrupted while wating for " + this + " to finish"); - } catch (IOException e) { - LOG.warn("Got IO exception during shutdown"); - } catch (RequestProcessorException e) { - LOG.warn("Got request processor exception during shutdown"); - } - if (nextProcessor != null) { - nextProcessor.shutdown(); - } - } - - public void processRequest(Request request) { - // request.addRQRec(">sync"); - queuedRequests.add(request); - } - -} diff --git a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/TraceFormatter.java b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/TraceFormatter.java deleted file mode 100644 index 60d1cc758..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/TraceFormatter.java +++ /dev/null @@ -1,123 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you 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. - */ - -package org.apache.zookeeper.server; - -import java.io.FileInputStream; -import java.io.IOException; -import java.nio.ByteBuffer; -import java.nio.channels.FileChannel; -import java.text.DateFormat; -import java.util.Date; - -import org.apache.zookeeper.ZooDefs.OpCode; - -public class TraceFormatter { - - static String op2String(int op) { - switch (op) { - case OpCode.notification: - return "notification"; - case OpCode.create: - return "create"; - case OpCode.delete: - return "delete"; - case OpCode.exists: - return "exists"; - case OpCode.getData: - return "getDate"; - case OpCode.setData: - return "setData"; - case OpCode.multi: - return "multi"; - case OpCode.getACL: - return "getACL"; - case OpCode.setACL: - return "setACL"; - case OpCode.getChildren: - return "getChildren"; - case OpCode.getChildren2: - return "getChildren2"; - case OpCode.ping: - return "ping"; - case OpCode.createSession: - return "createSession"; - case OpCode.closeSession: - return "closeSession"; - case OpCode.error: - return "error"; - default: - return "unknown " + op; - } - } - - /** - * @param args - * @throws IOException - */ - public static void main(String[] args) throws IOException { - if (args.length != 1) { - System.err.println("USAGE: TraceFormatter trace_file"); - System.exit(2); - } - FileChannel fc = new FileInputStream(args[0]).getChannel(); - while (true) { - ByteBuffer bb = ByteBuffer.allocate(41); - fc.read(bb); - bb.flip(); - - byte app = bb.get(); - long time = bb.getLong(); - long id = bb.getLong(); - int cxid = bb.getInt(); - long zxid = bb.getLong(); - int txnType = bb.getInt(); - int type = bb.getInt(); - int len = bb.getInt(); - bb = ByteBuffer.allocate(len); - fc.read(bb); - bb.flip(); - String path = "n/a"; - if (bb.remaining() > 0) { - if (type != OpCode.createSession) { - int pathLen = bb.getInt(); - byte b[] = new byte[pathLen]; - bb.get(b); - path = new String(b); - } - } - System.out.println(DateFormat.getDateTimeInstance(DateFormat.SHORT, - DateFormat.LONG).format(new Date(time)) - + ": " - + (char) app - + " id=0x" - + Long.toHexString(id) - + " cxid=" - + cxid - + " op=" - + op2String(type) - + " zxid=0x" - + Long.toHexString(zxid) - + " txnType=" - + txnType - + " len=" - + len + " path=" + path); - } - } - -} diff --git a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/UnimplementedRequestProcessor.java b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/UnimplementedRequestProcessor.java deleted file mode 100644 index aa58e63d4..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/UnimplementedRequestProcessor.java +++ /dev/null @@ -1,48 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you 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. - */ - -package org.apache.zookeeper.server; - -import java.io.IOException; - -import org.apache.zookeeper.KeeperException; -import org.apache.zookeeper.proto.ReplyHeader; - -/** - * Manages the unknown requests (i.e. unknown OpCode), by: - * - sending back the KeeperException.UnimplementedException() error code to the client - * - closing the connection. - */ -public class UnimplementedRequestProcessor implements RequestProcessor { - - public void processRequest(Request request) throws RequestProcessorException { - KeeperException ke = new KeeperException.UnimplementedException(); - request.setException(ke); - ReplyHeader rh = new ReplyHeader(request.cxid, request.zxid, ke.code().intValue()); - try { - request.cnxn.sendResponse(rh, null, "response"); - } catch (IOException e) { - throw new RequestProcessorException("Can't send the response", e); - } - - request.cnxn.sendCloseSession(); - } - - public void shutdown() { - } -} diff --git a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/WatchManager.java b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/WatchManager.java deleted file mode 100644 index 76e37f2a3..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/WatchManager.java +++ /dev/null @@ -1,171 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you 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. - */ - -package org.apache.zookeeper.server; - -import java.io.PrintWriter; -import java.util.HashMap; -import java.util.HashSet; -import java.util.Set; -import java.util.Map.Entry; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.apache.zookeeper.WatchedEvent; -import org.apache.zookeeper.Watcher; -import org.apache.zookeeper.Watcher.Event.EventType; -import org.apache.zookeeper.Watcher.Event.KeeperState; - -/** - * This class manages watches. It allows watches to be associated with a string - * and removes watchers and their watches in addition to managing triggers. - */ -public class WatchManager { - private static final Logger LOG = LoggerFactory.getLogger(WatchManager.class); - - private final HashMap> watchTable = - new HashMap>(); - - private final HashMap> watch2Paths = - new HashMap>(); - - public synchronized int size(){ - int result = 0; - for(Set watches : watchTable.values()) { - result += watches.size(); - } - return result; - } - - public synchronized void addWatch(String path, Watcher watcher) { - HashSet list = watchTable.get(path); - if (list == null) { - // don't waste memory if there are few watches on a node - // rehash when the 4th entry is added, doubling size thereafter - // seems like a good compromise - list = new HashSet(4); - watchTable.put(path, list); - } - list.add(watcher); - - HashSet paths = watch2Paths.get(watcher); - if (paths == null) { - // cnxns typically have many watches, so use default cap here - paths = new HashSet(); - watch2Paths.put(watcher, paths); - } - paths.add(path); - } - - public synchronized void removeWatcher(Watcher watcher) { - HashSet paths = watch2Paths.remove(watcher); - if (paths == null) { - return; - } - for (String p : paths) { - HashSet list = watchTable.get(p); - if (list != null) { - list.remove(watcher); - if (list.size() == 0) { - watchTable.remove(p); - } - } - } - } - - public Set triggerWatch(String path, EventType type) { - return triggerWatch(path, type, null); - } - - public Set triggerWatch(String path, EventType type, Set supress) { - WatchedEvent e = new WatchedEvent(type, - KeeperState.SyncConnected, path); - HashSet watchers; - synchronized (this) { - watchers = watchTable.remove(path); - if (watchers == null || watchers.isEmpty()) { - if (LOG.isTraceEnabled()) { - ZooTrace.logTraceMessage(LOG, - ZooTrace.EVENT_DELIVERY_TRACE_MASK, - "No watchers for " + path); - } - return null; - } - for (Watcher w : watchers) { - HashSet paths = watch2Paths.get(w); - if (paths != null) { - paths.remove(path); - } - } - } - for (Watcher w : watchers) { - if (supress != null && supress.contains(w)) { - continue; - } - w.process(e); - } - return watchers; - } - - /** - * Brief description of this object. - */ - @Override - public synchronized String toString() { - StringBuilder sb = new StringBuilder(); - - sb.append(watch2Paths.size()).append(" connections watching ") - .append(watchTable.size()).append(" paths\n"); - - int total = 0; - for (HashSet paths : watch2Paths.values()) { - total += paths.size(); - } - sb.append("Total watches:").append(total); - - return sb.toString(); - } - - /** - * String representation of watches. Warning, may be large! - * @param byPath iff true output watches by paths, otw output - * watches by connection - * @return string representation of watches - */ - public synchronized void dumpWatches(PrintWriter pwriter, boolean byPath) { - if (byPath) { - for (Entry> e : watchTable.entrySet()) { - pwriter.println(e.getKey()); - for (Watcher w : e.getValue()) { - pwriter.print("\t0x"); - pwriter.print(Long.toHexString(((ServerCnxn)w).getSessionId())); - pwriter.print("\n"); - } - } - } else { - for (Entry> e : watch2Paths.entrySet()) { - pwriter.print("0x"); - pwriter.println(Long.toHexString(((ServerCnxn)e.getKey()).getSessionId())); - for (String path : e.getValue()) { - pwriter.print("\t"); - pwriter.println(path); - } - } - } - } -} diff --git a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/ZKDatabase.java b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/ZKDatabase.java deleted file mode 100644 index 4c29dead8..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/ZKDatabase.java +++ /dev/null @@ -1,502 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you 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. - */ - -package org.apache.zookeeper.server; - -import java.io.ByteArrayOutputStream; -import java.io.IOException; -import java.io.PrintWriter; -import java.util.Collection; -import java.util.HashSet; -import java.util.LinkedList; -import java.util.List; -import java.util.concurrent.ConcurrentHashMap; -import java.util.concurrent.locks.ReentrantReadWriteLock; -import java.util.concurrent.locks.ReentrantReadWriteLock.ReadLock; -import java.util.concurrent.locks.ReentrantReadWriteLock.WriteLock; - -import org.apache.jute.BinaryOutputArchive; -import org.apache.jute.InputArchive; -import org.apache.jute.OutputArchive; -import org.apache.jute.Record; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.apache.zookeeper.KeeperException; -import org.apache.zookeeper.KeeperException.NoNodeException; -import org.apache.zookeeper.Watcher; -import org.apache.zookeeper.data.ACL; -import org.apache.zookeeper.data.Stat; -import org.apache.zookeeper.server.DataTree.ProcessTxnResult; -import org.apache.zookeeper.server.persistence.FileTxnSnapLog; -import org.apache.zookeeper.server.persistence.FileTxnSnapLog.PlayBackListener; -import org.apache.zookeeper.server.quorum.Leader; -import org.apache.zookeeper.server.quorum.Leader.Proposal; -import org.apache.zookeeper.server.quorum.QuorumPacket; -import org.apache.zookeeper.server.util.SerializeUtils; -import org.apache.zookeeper.txn.TxnHeader; - -/** - * This class maintains the in memory database of zookeeper - * server states that includes the sessions, datatree and the - * committed logs. It is booted up after reading the logs - * and snapshots from the disk. - */ -public class ZKDatabase { - - private static final Logger LOG = LoggerFactory.getLogger(ZKDatabase.class); - - /** - * make sure on a clear you take care of - * all these members. - */ - protected DataTree dataTree; - protected ConcurrentHashMap sessionsWithTimeouts; - protected FileTxnSnapLog snapLog; - protected long minCommittedLog, maxCommittedLog; - public static final int commitLogCount = 500; - protected static int commitLogBuffer = 700; - protected LinkedList committedLog = new LinkedList(); - protected ReentrantReadWriteLock logLock = new ReentrantReadWriteLock(); - volatile private boolean initialized = false; - - /** - * the filetxnsnaplog that this zk database - * maps to. There is a one to one relationship - * between a filetxnsnaplog and zkdatabase. - * @param snapLog the FileTxnSnapLog mapping this zkdatabase - */ - public ZKDatabase(FileTxnSnapLog snapLog) { - dataTree = new DataTree(); - sessionsWithTimeouts = new ConcurrentHashMap(); - this.snapLog = snapLog; - } - - /** - * checks to see if the zk database has been - * initialized or not. - * @return true if zk database is initialized and false if not - */ - public boolean isInitialized() { - return initialized; - } - - /** - * clear the zkdatabase. - * Note to developers - be careful to see that - * the clear method does clear out all the - * data structures in zkdatabase. - */ - public void clear() { - minCommittedLog = 0; - maxCommittedLog = 0; - /* to be safe we just create a new - * datatree. - */ - dataTree = new DataTree(); - sessionsWithTimeouts.clear(); - WriteLock lock = logLock.writeLock(); - try { - lock.lock(); - committedLog.clear(); - } finally { - lock.unlock(); - } - initialized = false; - } - - /** - * the datatree for this zkdatabase - * @return the datatree for this zkdatabase - */ - public DataTree getDataTree() { - return this.dataTree; - } - - /** - * the committed log for this zk database - * @return the committed log for this zkdatabase - */ - public long getmaxCommittedLog() { - return maxCommittedLog; - } - - - /** - * the minimum committed transaction log - * available in memory - * @return the minimum committed transaction - * log available in memory - */ - public long getminCommittedLog() { - return minCommittedLog; - } - /** - * Get the lock that controls the committedLog. If you want to get the pointer to the committedLog, you need - * to use this lock to acquire a read lock before calling getCommittedLog() - * @return the lock that controls the committed log - */ - public ReentrantReadWriteLock getLogLock() { - return logLock; - } - - - public synchronized LinkedList getCommittedLog() { - ReadLock rl = logLock.readLock(); - // only make a copy if this thread isn't already holding a lock - if(logLock.getReadHoldCount() <=0) { - try { - rl.lock(); - return new LinkedList(this.committedLog); - } finally { - rl.unlock(); - } - } - return this.committedLog; - } - - /** - * get the last processed zxid from a datatree - * @return the last processed zxid of a datatree - */ - public long getDataTreeLastProcessedZxid() { - return dataTree.lastProcessedZxid; - } - - /** - * set the datatree initialized or not - * @param b set the datatree initialized to b - */ - public void setDataTreeInit(boolean b) { - dataTree.initialized = b; - } - - /** - * return the sessions in the datatree - * @return the data tree sessions - */ - public Collection getSessions() { - return dataTree.getSessions(); - } - - /** - * get sessions with timeouts - * @return the hashmap of sessions with timeouts - */ - public ConcurrentHashMap getSessionWithTimeOuts() { - return sessionsWithTimeouts; - } - - - /** - * load the database from the disk onto memory and also add - * the transactions to the committedlog in memory. - * @return the last valid zxid on disk - * @throws IOException - */ - public long loadDataBase() throws IOException { - PlayBackListener listener=new PlayBackListener(){ - public void onTxnLoaded(TxnHeader hdr,Record txn){ - Request r = new Request(null, 0, hdr.getCxid(),hdr.getType(), - null, null); - r.txn = txn; - r.hdr = hdr; - r.zxid = hdr.getZxid(); - addCommittedProposal(r); - } - }; - - long zxid = snapLog.restore(dataTree,sessionsWithTimeouts,listener); - initialized = true; - return zxid; - } - - /** - * maintains a list of last committedLog - * or so committed requests. This is used for - * fast follower synchronization. - * @param request committed request - */ - public void addCommittedProposal(Request request) { - WriteLock wl = logLock.writeLock(); - try { - wl.lock(); - if (committedLog.size() > commitLogCount) { - committedLog.removeFirst(); - minCommittedLog = committedLog.getFirst().packet.getZxid(); - } - if (committedLog.size() == 0) { - minCommittedLog = request.zxid; - maxCommittedLog = request.zxid; - } - - ByteArrayOutputStream baos = new ByteArrayOutputStream(); - BinaryOutputArchive boa = BinaryOutputArchive.getArchive(baos); - try { - request.hdr.serialize(boa, "hdr"); - if (request.txn != null) { - request.txn.serialize(boa, "txn"); - } - baos.close(); - } catch (IOException e) { - LOG.error("This really should be impossible", e); - } - QuorumPacket pp = new QuorumPacket(Leader.PROPOSAL, request.zxid, - baos.toByteArray(), null); - Proposal p = new Proposal(); - p.packet = pp; - p.request = request; - committedLog.add(p); - maxCommittedLog = p.packet.getZxid(); - } finally { - wl.unlock(); - } - } - - - /** - * remove a cnxn from the datatree - * @param cnxn the cnxn to remove from the datatree - */ - public void removeCnxn(ServerCnxn cnxn) { - dataTree.removeCnxn(cnxn); - } - - /** - * kill a given session in the datatree - * @param sessionId the session id to be killed - * @param zxid the zxid of kill session transaction - */ - public void killSession(long sessionId, long zxid) { - dataTree.killSession(sessionId, zxid); - } - - /** - * write a text dump of all the ephemerals in the datatree - * @param pwriter the output to write to - */ - public void dumpEphemerals(PrintWriter pwriter) { - dataTree.dumpEphemerals(pwriter); - } - - /** - * the node count of the datatree - * @return the node count of datatree - */ - public int getNodeCount() { - return dataTree.getNodeCount(); - } - - /** - * the paths for ephemeral session id - * @param sessionId the session id for which paths match to - * @return the paths for a session id - */ - public HashSet getEphemerals(long sessionId) { - return dataTree.getEphemerals(sessionId); - } - - /** - * the last processed zxid in the datatree - * @param zxid the last processed zxid in the datatree - */ - public void setlastProcessedZxid(long zxid) { - dataTree.lastProcessedZxid = zxid; - } - - /** - * the process txn on the data - * @param hdr the txnheader for the txn - * @param txn the transaction that needs to be processed - * @return the result of processing the transaction on this - * datatree/zkdatabase - */ - public ProcessTxnResult processTxn(TxnHeader hdr, Record txn) { - return dataTree.processTxn(hdr, txn); - } - - /** - * stat the path - * @param path the path for which stat is to be done - * @param serverCnxn the servercnxn attached to this request - * @return the stat of this node - * @throws KeeperException.NoNodeException - */ - public Stat statNode(String path, ServerCnxn serverCnxn) throws KeeperException.NoNodeException { - return dataTree.statNode(path, serverCnxn); - } - - /** - * get the datanode for this path - * @param path the path to lookup - * @return the datanode for getting the path - */ - public DataNode getNode(String path) { - return dataTree.getNode(path); - } - - /** - * convert from long to the acl entry - * @param aclL the long for which to get the acl - * @return the acl corresponding to this long entry - */ - public List convertLong(Long aclL) { - return dataTree.convertLong(aclL); - } - - /** - * get data and stat for a path - * @param path the path being queried - * @param stat the stat for this path - * @param watcher the watcher function - * @return - * @throws KeeperException.NoNodeException - */ - public byte[] getData(String path, Stat stat, Watcher watcher) - throws KeeperException.NoNodeException { - return dataTree.getData(path, stat, watcher); - } - - /** - * set watches on the datatree - * @param relativeZxid the relative zxid that client has seen - * @param dataWatches the data watches the client wants to reset - * @param existWatches the exists watches the client wants to reset - * @param childWatches the child watches the client wants to reset - * @param watcher the watcher function - */ - public void setWatches(long relativeZxid, List dataWatches, - List existWatches, List childWatches, Watcher watcher) { - dataTree.setWatches(relativeZxid, dataWatches, existWatches, childWatches, watcher); - } - - /** - * get acl for a path - * @param path the path to query for acl - * @param stat the stat for the node - * @return the acl list for this path - * @throws NoNodeException - */ - public List getACL(String path, Stat stat) throws NoNodeException { - return dataTree.getACL(path, stat); - } - - /** - * get children list for this path - * @param path the path of the node - * @param stat the stat of the node - * @param watcher the watcher function for this path - * @return the list of children for this path - * @throws KeeperException.NoNodeException - */ - public List getChildren(String path, Stat stat, Watcher watcher) - throws KeeperException.NoNodeException { - return dataTree.getChildren(path, stat, watcher); - } - - /** - * check if the path is special or not - * @param path the input path - * @return true if path is special and false if not - */ - public boolean isSpecialPath(String path) { - return dataTree.isSpecialPath(path); - } - - /** - * get the acl size of the datatree - * @return the acl size of the datatree - */ - public int getAclSize() { - return dataTree.longKeyMap.size(); - } - - /** - * Truncate the ZKDatabase to the specified zxid - * @param zxid the zxid to truncate zk database to - * @return true if the truncate is successful and false if not - * @throws IOException - */ - public boolean truncateLog(long zxid) throws IOException { - clear(); - - // truncate the log - boolean truncated = snapLog.truncateLog(zxid); - - if (!truncated) { - return false; - } - - loadDataBase(); - return true; - } - - /** - * deserialize a snapshot from an input archive - * @param ia the input archive you want to deserialize from - * @throws IOException - */ - public void deserializeSnapshot(InputArchive ia) throws IOException { - clear(); - SerializeUtils.deserializeSnapshot(getDataTree(),ia,getSessionWithTimeOuts()); - initialized = true; - } - - /** - * serialize the snapshot - * @param oa the output archive to which the snapshot needs to be serialized - * @throws IOException - * @throws InterruptedException - */ - public void serializeSnapshot(OutputArchive oa) throws IOException, - InterruptedException { - SerializeUtils.serializeSnapshot(getDataTree(), oa, getSessionWithTimeOuts()); - } - - /** - * append to the underlying transaction log - * @param si the request to append - * @return true if the append was succesfull and false if not - */ - public boolean append(Request si) throws IOException { - return this.snapLog.append(si); - } - - /** - * roll the underlying log - */ - public void rollLog() throws IOException { - this.snapLog.rollLog(); - } - - /** - * commit to the underlying transaction log - * @throws IOException - */ - public void commit() throws IOException { - this.snapLog.commit(); - } - - /** - * close this database. free the resources - * @throws IOException - */ - public void close() throws IOException { - this.snapLog.close(); - } - -} diff --git a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/ZooKeeperSaslServer.java b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/ZooKeeperSaslServer.java deleted file mode 100644 index 71870ce1c..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/ZooKeeperSaslServer.java +++ /dev/null @@ -1,173 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you 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. - */ - -package org.apache.zookeeper.server; - -import java.security.Principal; -import java.security.PrivilegedActionException; -import java.security.PrivilegedExceptionAction; - -import javax.security.auth.Subject; -import javax.security.sasl.Sasl; -import javax.security.sasl.SaslException; -import javax.security.sasl.SaslServer; - -import org.apache.zookeeper.Login; -import org.ietf.jgss.GSSContext; -import org.ietf.jgss.GSSCredential; -import org.ietf.jgss.GSSException; -import org.ietf.jgss.GSSManager; -import org.ietf.jgss.GSSName; -import org.ietf.jgss.Oid; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -public class ZooKeeperSaslServer { - public static final String LOGIN_CONTEXT_NAME_KEY = "zookeeper.sasl.serverconfig"; - public static final String DEFAULT_LOGIN_CONTEXT_NAME = "Server"; - - Logger LOG = LoggerFactory.getLogger(ZooKeeperSaslServer.class); - private SaslServer saslServer; - - ZooKeeperSaslServer(final Login login) { - saslServer = createSaslServer(login); - } - - private SaslServer createSaslServer(final Login login) { - synchronized (login) { - Subject subject = login.getSubject(); - if (subject != null) { - // server is using a JAAS-authenticated subject: determine service principal name and hostname from zk server's subject. - if (subject.getPrincipals().size() > 0) { - try { - final Object[] principals = subject.getPrincipals().toArray(); - final Principal servicePrincipal = (Principal)principals[0]; - - // e.g. servicePrincipalNameAndHostname := "zookeeper/myhost.foo.com@FOO.COM" - final String servicePrincipalNameAndHostname = servicePrincipal.getName(); - - int indexOf = servicePrincipalNameAndHostname.indexOf("/"); - - // e.g. servicePrincipalName := "zookeeper" - final String servicePrincipalName = servicePrincipalNameAndHostname.substring(0, indexOf); - - // e.g. serviceHostnameAndKerbDomain := "myhost.foo.com@FOO.COM" - final String serviceHostnameAndKerbDomain = servicePrincipalNameAndHostname.substring(indexOf+1,servicePrincipalNameAndHostname.length()); - - indexOf = serviceHostnameAndKerbDomain.indexOf("@"); - // e.g. serviceHostname := "myhost.foo.com" - final String serviceHostname = serviceHostnameAndKerbDomain.substring(0,indexOf); - - final String mech = "GSSAPI"; // TODO: should depend on zoo.cfg specified mechs, but if subject is non-null, it can be assumed to be GSSAPI. - - LOG.debug("serviceHostname is '"+ serviceHostname + "'"); - LOG.debug("servicePrincipalName is '"+ servicePrincipalName + "'"); - LOG.debug("SASL mechanism(mech) is '"+ mech +"'"); - - boolean usingNativeJgss = - Boolean.getBoolean("sun.security.jgss.native"); - if (usingNativeJgss) { - // http://docs.oracle.com/javase/6/docs/technotes/guides/security/jgss/jgss-features.html - // """ - // In addition, when performing operations as a particular - // Subject, e.g. Subject.doAs(...) or - // Subject.doAsPrivileged(...), the to-be-used - // GSSCredential should be added to Subject's - // private credential set. Otherwise, the GSS operations - // will fail since no credential is found. - // """ - try { - GSSManager manager = GSSManager.getInstance(); - Oid krb5Mechanism = new Oid("1.2.840.113554.1.2.2"); - GSSName gssName = manager.createName( - servicePrincipalName + "@" + serviceHostname, - GSSName.NT_HOSTBASED_SERVICE); - GSSCredential cred = manager.createCredential(gssName, - GSSContext.DEFAULT_LIFETIME, - krb5Mechanism, - GSSCredential.ACCEPT_ONLY); - subject.getPrivateCredentials().add(cred); - if (LOG.isDebugEnabled()) { - LOG.debug("Added private credential to subject: " + cred); - } - } catch (GSSException ex) { - LOG.warn("Cannot add private credential to subject; " + - "clients authentication may fail", ex); - } - } - try { - return Subject.doAs(subject,new PrivilegedExceptionAction() { - public SaslServer run() { - try { - SaslServer saslServer; - saslServer = Sasl.createSaslServer(mech, servicePrincipalName, serviceHostname, null, login.callbackHandler); - return saslServer; - } - catch (SaslException e) { - LOG.error("Zookeeper Server failed to create a SaslServer to interact with a client during session initiation: " + e); - e.printStackTrace(); - return null; - } - } - } - ); - } - catch (PrivilegedActionException e) { - // TODO: exit server at this point(?) - LOG.error("Zookeeper Quorum member experienced a PrivilegedActionException exception while creating a SaslServer using a JAAS principal context:" + e); - e.printStackTrace(); - } - } - catch (IndexOutOfBoundsException e) { - LOG.error("server principal name/hostname determination error: ", e); - } - } - else { - // JAAS non-GSSAPI authentication: assuming and supporting only DIGEST-MD5 mechanism for now. - // TODO: use 'authMech=' value in zoo.cfg. - try { - SaslServer saslServer = Sasl.createSaslServer("DIGEST-MD5","zookeeper","zk-sasl-md5",null, login.callbackHandler); - return saslServer; - } - catch (SaslException e) { - LOG.error("Zookeeper Quorum member failed to create a SaslServer to interact with a client during session initiation", e); - } - } - } - } - LOG.error("failed to create saslServer object."); - return null; - } - - public byte[] evaluateResponse(byte[] response) throws SaslException { - return saslServer.evaluateResponse(response); - } - - public boolean isComplete() { - return saslServer.isComplete(); - } - - public String getAuthorizationID() { - return saslServer.getAuthorizationID(); - } - -} - - - - diff --git a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/ZooKeeperServer.java b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/ZooKeeperServer.java deleted file mode 100644 index c1812c453..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/ZooKeeperServer.java +++ /dev/null @@ -1,1012 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you 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. - */ - -package org.apache.zookeeper.server; - -import java.io.ByteArrayOutputStream; -import java.io.File; -import java.io.IOException; -import java.io.InputStream; -import java.io.PrintWriter; -import java.nio.ByteBuffer; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.HashMap; -import java.util.LinkedList; -import java.util.List; -import java.util.Random; - -import javax.security.sasl.SaslException; - -import org.apache.jute.BinaryInputArchive; -import org.apache.jute.BinaryOutputArchive; -import org.apache.jute.Record; -import org.apache.zookeeper.Environment; -import org.apache.zookeeper.KeeperException; -import org.apache.zookeeper.KeeperException.Code; -import org.apache.zookeeper.KeeperException.SessionExpiredException; -import org.apache.zookeeper.ZooDefs.OpCode; -import org.apache.zookeeper.data.ACL; -import org.apache.zookeeper.data.Id; -import org.apache.zookeeper.data.StatPersisted; -import org.apache.zookeeper.jmx.MBeanRegistry; -import org.apache.zookeeper.proto.AuthPacket; -import org.apache.zookeeper.proto.ConnectRequest; -import org.apache.zookeeper.proto.ConnectResponse; -import org.apache.zookeeper.proto.GetSASLRequest; -import org.apache.zookeeper.proto.ReplyHeader; -import org.apache.zookeeper.proto.RequestHeader; -import org.apache.zookeeper.proto.SetSASLResponse; -import org.apache.zookeeper.server.DataTree.ProcessTxnResult; -import org.apache.zookeeper.server.RequestProcessor.RequestProcessorException; -import org.apache.zookeeper.server.ServerCnxn.CloseRequestException; -import org.apache.zookeeper.server.SessionTracker.Session; -import org.apache.zookeeper.server.SessionTracker.SessionExpirer; -import org.apache.zookeeper.server.auth.AuthenticationProvider; -import org.apache.zookeeper.server.auth.ProviderRegistry; -import org.apache.zookeeper.server.persistence.FileTxnSnapLog; -import org.apache.zookeeper.server.quorum.ReadOnlyZooKeeperServer; -import org.apache.zookeeper.txn.CreateSessionTxn; -import org.apache.zookeeper.txn.TxnHeader; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - - -/** - * This class implements a simple standalone ZooKeeperServer. It sets up the - * following chain of RequestProcessors to process requests: - * PrepRequestProcessor -> SyncRequestProcessor -> FinalRequestProcessor - */ -public class ZooKeeperServer implements SessionExpirer, ServerStats.Provider { - protected static final Logger LOG; - - static { - LOG = LoggerFactory.getLogger(ZooKeeperServer.class); - - Environment.logEnv("Server environment:", LOG); - } - - protected ZooKeeperServerBean jmxServerBean; - protected DataTreeBean jmxDataTreeBean; - - - /** - * The server delegates loading of the tree to an instance of the interface - */ - public interface DataTreeBuilder { - public DataTree build(); - } - - static public class BasicDataTreeBuilder implements DataTreeBuilder { - public DataTree build() { - return new DataTree(); - } - } - - public static final int DEFAULT_TICK_TIME = 3000; - protected int tickTime = DEFAULT_TICK_TIME; - /** value of -1 indicates unset, use default */ - protected int minSessionTimeout = -1; - /** value of -1 indicates unset, use default */ - protected int maxSessionTimeout = -1; - protected SessionTracker sessionTracker; - private FileTxnSnapLog txnLogFactory = null; - private ZKDatabase zkDb; - protected long hzxid = 0; - public final static Exception ok = new Exception("No prob"); - protected RequestProcessor firstProcessor; - protected volatile boolean running; - - /** - * This is the secret that we use to generate passwords, for the moment it - * is more of a sanity check. - */ - static final private long superSecret = 0XB3415C00L; - - int requestsInProcess; - final List outstandingChanges = new ArrayList(); - // this data structure must be accessed under the outstandingChanges lock - final HashMap outstandingChangesForPath = - new HashMap(); - - private ServerCnxnFactory serverCnxnFactory; - - private final ServerStats serverStats; - - void removeCnxn(ServerCnxn cnxn) { - zkDb.removeCnxn(cnxn); - } - - /** - * Creates a ZooKeeperServer instance. Nothing is setup, use the setX - * methods to prepare the instance (eg datadir, datalogdir, ticktime, - * builder, etc...) - * - * @throws IOException - */ - public ZooKeeperServer() { - serverStats = new ServerStats(this); - } - - /** - * Creates a ZooKeeperServer instance. It sets everything up, but doesn't - * actually start listening for clients until run() is invoked. - * - * @param dataDir the directory to put the data - */ - public ZooKeeperServer(FileTxnSnapLog txnLogFactory, int tickTime, - int minSessionTimeout, int maxSessionTimeout, - DataTreeBuilder treeBuilder, ZKDatabase zkDb) { - serverStats = new ServerStats(this); - this.txnLogFactory = txnLogFactory; - this.zkDb = zkDb; - this.tickTime = tickTime; - this.minSessionTimeout = minSessionTimeout; - this.maxSessionTimeout = maxSessionTimeout; - - LOG.info("Created server with tickTime " + tickTime - + " minSessionTimeout " + getMinSessionTimeout() - + " maxSessionTimeout " + getMaxSessionTimeout() - + " datadir " + txnLogFactory.getDataDir() - + " snapdir " + txnLogFactory.getSnapDir()); - } - - /** - * creates a zookeeperserver instance. - * @param txnLogFactory the file transaction snapshot logging class - * @param tickTime the ticktime for the server - * @param treeBuilder the datatree builder - * @throws IOException - */ - public ZooKeeperServer(FileTxnSnapLog txnLogFactory, int tickTime, - DataTreeBuilder treeBuilder) throws IOException { - this(txnLogFactory, tickTime, -1, -1, treeBuilder, - new ZKDatabase(txnLogFactory)); - } - - public ServerStats serverStats() { - return serverStats; - } - - public void dumpConf(PrintWriter pwriter) { - pwriter.print("clientPort="); - pwriter.println(getClientPort()); - pwriter.print("dataDir="); - pwriter.println(zkDb.snapLog.getSnapDir().getAbsolutePath()); - pwriter.print("dataLogDir="); - pwriter.println(zkDb.snapLog.getDataDir().getAbsolutePath()); - pwriter.print("tickTime="); - pwriter.println(getTickTime()); - pwriter.print("maxClientCnxns="); - pwriter.println(serverCnxnFactory.getMaxClientCnxnsPerHost()); - pwriter.print("minSessionTimeout="); - pwriter.println(getMinSessionTimeout()); - pwriter.print("maxSessionTimeout="); - pwriter.println(getMaxSessionTimeout()); - - pwriter.print("serverId="); - pwriter.println(getServerId()); - } - - /** - * This constructor is for backward compatibility with the existing unit - * test code. - * It defaults to FileLogProvider persistence provider. - */ - public ZooKeeperServer(File snapDir, File logDir, int tickTime) - throws IOException { - this( new FileTxnSnapLog(snapDir, logDir), - tickTime, new BasicDataTreeBuilder()); - } - - /** - * Default constructor, relies on the config for its agrument values - * - * @throws IOException - */ - public ZooKeeperServer(FileTxnSnapLog txnLogFactory, - DataTreeBuilder treeBuilder) - throws IOException - { - this(txnLogFactory, DEFAULT_TICK_TIME, -1, -1, treeBuilder, - new ZKDatabase(txnLogFactory)); - } - - /** - * get the zookeeper database for this server - * @return the zookeeper database for this server - */ - public ZKDatabase getZKDatabase() { - return this.zkDb; - } - - /** - * set the zkdatabase for this zookeeper server - * @param zkDb - */ - public void setZKDatabase(ZKDatabase zkDb) { - this.zkDb = zkDb; - } - - /** - * Restore sessions and data - */ - public void loadData() throws IOException, InterruptedException { - /* - * When a new leader starts executing Leader#lead, it - * invokes this method. The database, however, has been - * initialized before running leader election so that - * the server could pick its zxid for its initial vote. - * It does it by invoking QuorumPeer#getLastLoggedZxid. - * Consequently, we don't need to initialize it once more - * and avoid the penalty of loading it a second time. Not - * reloading it is particularly important for applications - * that host a large database. - * - * The following if block checks whether the database has - * been initialized or not. Note that this method is - * invoked by at least one other method: - * ZooKeeperServer#startdata. - * - * See ZOOKEEPER-1642 for more detail. - */ - if(zkDb.isInitialized()){ - setZxid(zkDb.getDataTreeLastProcessedZxid()); - } - else { - setZxid(zkDb.loadDataBase()); - } - - // Clean up dead sessions - LinkedList deadSessions = new LinkedList(); - for (Long session : zkDb.getSessions()) { - if (zkDb.getSessionWithTimeOuts().get(session) == null) { - deadSessions.add(session); - } - } - zkDb.setDataTreeInit(true); - for (long session : deadSessions) { - // XXX: Is lastProcessedZxid really the best thing to use? - killSession(session, zkDb.getDataTreeLastProcessedZxid()); - } - } - - public void takeSnapshot(){ - - try { - txnLogFactory.save(zkDb.getDataTree(), zkDb.getSessionWithTimeOuts()); - } catch (IOException e) { - LOG.error("Severe unrecoverable error, exiting", e); - // This is a severe error that we cannot recover from, - // so we need to exit - System.exit(10); - } - } - - - /** - * This should be called from a synchronized block on this! - */ - synchronized public long getZxid() { - return hzxid; - } - - synchronized long getNextZxid() { - return ++hzxid; - } - - synchronized public void setZxid(long zxid) { - hzxid = zxid; - } - - long getTime() { - return System.currentTimeMillis(); - } - - private void close(long sessionId) { - submitRequest(null, sessionId, OpCode.closeSession, 0, null, null); - } - - public void closeSession(long sessionId) { - LOG.info("Closing session 0x" + Long.toHexString(sessionId)); - - // we do not want to wait for a session close. send it as soon as we - // detect it! - close(sessionId); - } - - protected void killSession(long sessionId, long zxid) { - zkDb.killSession(sessionId, zxid); - if (LOG.isTraceEnabled()) { - ZooTrace.logTraceMessage(LOG, ZooTrace.SESSION_TRACE_MASK, - "ZooKeeperServer --- killSession: 0x" - + Long.toHexString(sessionId)); - } - if (sessionTracker != null) { - sessionTracker.removeSession(sessionId); - } - } - - public void expire(Session session) { - long sessionId = session.getSessionId(); - LOG.info("Expiring session 0x" + Long.toHexString(sessionId) - + ", timeout of " + session.getTimeout() + "ms exceeded"); - close(sessionId); - } - - public static class MissingSessionException extends IOException { - private static final long serialVersionUID = 7467414635467261007L; - - public MissingSessionException(String msg) { - super(msg); - } - } - - void touch(ServerCnxn cnxn) throws MissingSessionException { - if (cnxn == null) { - return; - } - long id = cnxn.getSessionId(); - int to = cnxn.getSessionTimeout(); - if (!sessionTracker.touchSession(id, to)) { - throw new MissingSessionException( - "No session with sessionid 0x" + Long.toHexString(id) - + " exists, probably expired and removed"); - } - } - - protected void registerJMX() { - // register with JMX - try { - jmxServerBean = new ZooKeeperServerBean(this); - MBeanRegistry.getInstance().register(jmxServerBean, null); - - try { - jmxDataTreeBean = new DataTreeBean(zkDb.getDataTree()); - MBeanRegistry.getInstance().register(jmxDataTreeBean, jmxServerBean); - } catch (Exception e) { - LOG.warn("Failed to register with JMX", e); - jmxDataTreeBean = null; - } - } catch (Exception e) { - LOG.warn("Failed to register with JMX", e); - jmxServerBean = null; - } - } - - public void startdata() - throws IOException, InterruptedException { - //check to see if zkDb is not null - if (zkDb == null) { - zkDb = new ZKDatabase(this.txnLogFactory); - } - if (!zkDb.isInitialized()) { - loadData(); - } - } - - public void startup() { - if (sessionTracker == null) { - createSessionTracker(); - } - startSessionTracker(); - setupRequestProcessors(); - - registerJMX(); - - synchronized (this) { - running = true; - notifyAll(); - } - } - - protected void setupRequestProcessors() { - RequestProcessor finalProcessor = new FinalRequestProcessor(this); - RequestProcessor syncProcessor = new SyncRequestProcessor(this, - finalProcessor); - ((SyncRequestProcessor)syncProcessor).start(); - firstProcessor = new PrepRequestProcessor(this, syncProcessor); - ((PrepRequestProcessor)firstProcessor).start(); - } - - protected void createSessionTracker() { - sessionTracker = new SessionTrackerImpl(this, zkDb.getSessionWithTimeOuts(), - tickTime, 1); - } - - protected void startSessionTracker() { - ((SessionTrackerImpl)sessionTracker).start(); - } - - public boolean isRunning() { - return running; - } - - public void shutdown() { - LOG.info("shutting down"); - - // new RuntimeException("Calling shutdown").printStackTrace(); - this.running = false; - // Since sessionTracker and syncThreads poll we just have to - // set running to false and they will detect it during the poll - // interval. - if (sessionTracker != null) { - sessionTracker.shutdown(); - } - if (firstProcessor != null) { - firstProcessor.shutdown(); - } - if (zkDb != null) { - zkDb.clear(); - } - - unregisterJMX(); - } - - protected void unregisterJMX() { - // unregister from JMX - try { - if (jmxDataTreeBean != null) { - MBeanRegistry.getInstance().unregister(jmxDataTreeBean); - } - } catch (Exception e) { - LOG.warn("Failed to unregister with JMX", e); - } - try { - if (jmxServerBean != null) { - MBeanRegistry.getInstance().unregister(jmxServerBean); - } - } catch (Exception e) { - LOG.warn("Failed to unregister with JMX", e); - } - jmxServerBean = null; - jmxDataTreeBean = null; - } - - synchronized public void incInProcess() { - requestsInProcess++; - } - - synchronized public void decInProcess() { - requestsInProcess--; - } - - public int getInProcess() { - return requestsInProcess; - } - - /** - * This structure is used to facilitate information sharing between PrepRP - * and FinalRP. - */ - static class ChangeRecord { - ChangeRecord(long zxid, String path, StatPersisted stat, int childCount, - List acl) { - this.zxid = zxid; - this.path = path; - this.stat = stat; - this.childCount = childCount; - this.acl = acl; - } - - long zxid; - - String path; - - StatPersisted stat; /* Make sure to create a new object when changing */ - - int childCount; - - List acl; /* Make sure to create a new object when changing */ - - @SuppressWarnings("unchecked") - ChangeRecord duplicate(long zxid) { - StatPersisted stat = new StatPersisted(); - if (this.stat != null) { - DataTree.copyStatPersisted(this.stat, stat); - } - return new ChangeRecord(zxid, path, stat, childCount, - acl == null ? new ArrayList() : new ArrayList(acl)); - } - } - - byte[] generatePasswd(long id) { - Random r = new Random(id ^ superSecret); - byte p[] = new byte[16]; - r.nextBytes(p); - return p; - } - - protected boolean checkPasswd(long sessionId, byte[] passwd) { - return sessionId != 0 - && Arrays.equals(passwd, generatePasswd(sessionId)); - } - - long createSession(ServerCnxn cnxn, byte passwd[], int timeout) { - long sessionId = sessionTracker.createSession(timeout); - Random r = new Random(sessionId ^ superSecret); - r.nextBytes(passwd); - ByteBuffer to = ByteBuffer.allocate(4); - to.putInt(timeout); - cnxn.setSessionId(sessionId); - submitRequest(cnxn, sessionId, OpCode.createSession, 0, to, null); - return sessionId; - } - - /** - * set the owner of this session as owner - * @param id the session id - * @param owner the owner of the session - * @throws SessionExpiredException - */ - public void setOwner(long id, Object owner) throws SessionExpiredException { - sessionTracker.setOwner(id, owner); - } - - protected void revalidateSession(ServerCnxn cnxn, long sessionId, - int sessionTimeout) throws IOException { - boolean rc = sessionTracker.touchSession(sessionId, sessionTimeout); - if (LOG.isTraceEnabled()) { - ZooTrace.logTraceMessage(LOG,ZooTrace.SESSION_TRACE_MASK, - "Session 0x" + Long.toHexString(sessionId) + - " is valid: " + rc); - } - finishSessionInit(cnxn, rc); - } - - public void reopenSession(ServerCnxn cnxn, long sessionId, byte[] passwd, - int sessionTimeout) throws IOException { - if (!checkPasswd(sessionId, passwd)) { - finishSessionInit(cnxn, false); - } else { - revalidateSession(cnxn, sessionId, sessionTimeout); - } - } - - public void finishSessionInit(ServerCnxn cnxn, boolean valid) { - // register with JMX - try { - if (valid) { - serverCnxnFactory.registerConnection(cnxn); - } - } catch (Exception e) { - LOG.warn("Failed to register with JMX", e); - } - - try { - ConnectResponse rsp = new ConnectResponse(0, valid ? cnxn.getSessionTimeout() - : 0, valid ? cnxn.getSessionId() : 0, // send 0 if session is no - // longer valid - valid ? generatePasswd(cnxn.getSessionId()) : new byte[16]); - ByteArrayOutputStream baos = new ByteArrayOutputStream(); - BinaryOutputArchive bos = BinaryOutputArchive.getArchive(baos); - bos.writeInt(-1, "len"); - rsp.serialize(bos, "connect"); - if (!cnxn.isOldClient) { - bos.writeBool( - this instanceof ReadOnlyZooKeeperServer, "readOnly"); - } - baos.close(); - ByteBuffer bb = ByteBuffer.wrap(baos.toByteArray()); - bb.putInt(bb.remaining() - 4).rewind(); - cnxn.sendBuffer(bb); - - if (!valid) { - LOG.info("Invalid session 0x" - + Long.toHexString(cnxn.getSessionId()) - + " for client " - + cnxn.getRemoteSocketAddress() - + ", probably expired"); - cnxn.sendBuffer(ServerCnxnFactory.closeConn); - } else { - LOG.info("Established session 0x" - + Long.toHexString(cnxn.getSessionId()) - + " with negotiated timeout " + cnxn.getSessionTimeout() - + " for client " - + cnxn.getRemoteSocketAddress()); - cnxn.enableRecv(); - } - - } catch (Exception e) { - LOG.warn("Exception while establishing session, closing", e); - cnxn.close(); - } - } - - public void closeSession(ServerCnxn cnxn, RequestHeader requestHeader) { - closeSession(cnxn.getSessionId()); - } - - public long getServerId() { - return 0; - } - - /** - * @param cnxn - * @param sessionId - * @param xid - * @param bb - */ - private void submitRequest(ServerCnxn cnxn, long sessionId, int type, - int xid, ByteBuffer bb, List authInfo) { - Request si = new Request(cnxn, sessionId, xid, type, bb, authInfo); - submitRequest(si); - } - - public void submitRequest(Request si) { - if (firstProcessor == null) { - synchronized (this) { - try { - while (!running) { - wait(1000); - } - } catch (InterruptedException e) { - LOG.warn("Unexpected interruption", e); - } - if (firstProcessor == null) { - throw new RuntimeException("Not started"); - } - } - } - try { - touch(si.cnxn); - boolean validpacket = Request.isValid(si.type); - if (validpacket) { - firstProcessor.processRequest(si); - if (si.cnxn != null) { - incInProcess(); - } - } else { - LOG.warn("Received packet at server of unknown type " + si.type); - new UnimplementedRequestProcessor().processRequest(si); - } - } catch (MissingSessionException e) { - if (LOG.isDebugEnabled()) { - LOG.debug("Dropping request: " + e.getMessage()); - } - } catch (RequestProcessorException e) { - LOG.error("Unable to process request:" + e.getMessage(), e); - } - } - - public static int getSnapCount() { - String sc = System.getProperty("zookeeper.snapCount"); - try { - int snapCount = Integer.parseInt(sc); - - // snapCount must be 2 or more. See org.apache.zookeeper.server.SyncRequestProcessor - if( snapCount < 2 ) { - LOG.warn("SnapCount should be 2 or more. Now, snapCount is reset to 2"); - snapCount = 2; - } - return snapCount; - } catch (Exception e) { - return 100000; - } - } - - public int getGlobalOutstandingLimit() { - String sc = System.getProperty("zookeeper.globalOutstandingLimit"); - int limit; - try { - limit = Integer.parseInt(sc); - } catch (Exception e) { - limit = 1000; - } - return limit; - } - - public void setServerCnxnFactory(ServerCnxnFactory factory) { - serverCnxnFactory = factory; - } - - public ServerCnxnFactory getServerCnxnFactory() { - return serverCnxnFactory; - } - - /** - * return the last proceesed id from the - * datatree - */ - public long getLastProcessedZxid() { - return zkDb.getDataTreeLastProcessedZxid(); - } - - /** - * return the outstanding requests - * in the queue, which havent been - * processed yet - */ - public long getOutstandingRequests() { - return getInProcess(); - } - - /** - * trunccate the log to get in sync with others - * if in a quorum - * @param zxid the zxid that it needs to get in sync - * with others - * @throws IOException - */ - public void truncateLog(long zxid) throws IOException { - this.zkDb.truncateLog(zxid); - } - - public int getTickTime() { - return tickTime; - } - - public void setTickTime(int tickTime) { - LOG.info("tickTime set to " + tickTime); - this.tickTime = tickTime; - } - - public int getMinSessionTimeout() { - return minSessionTimeout == -1 ? tickTime * 2 : minSessionTimeout; - } - - public void setMinSessionTimeout(int min) { - LOG.info("minSessionTimeout set to " + min); - this.minSessionTimeout = min; - } - - public int getMaxSessionTimeout() { - return maxSessionTimeout == -1 ? tickTime * 20 : maxSessionTimeout; - } - - public void setMaxSessionTimeout(int max) { - LOG.info("maxSessionTimeout set to " + max); - this.maxSessionTimeout = max; - } - - public int getClientPort() { - return serverCnxnFactory != null ? serverCnxnFactory.getLocalPort() : -1; - } - - public void setTxnLogFactory(FileTxnSnapLog txnLog) { - this.txnLogFactory = txnLog; - } - - public FileTxnSnapLog getTxnLogFactory() { - return this.txnLogFactory; - } - - public String getState() { - return "standalone"; - } - - public void dumpEphemerals(PrintWriter pwriter) { - zkDb.dumpEphemerals(pwriter); - } - - /** - * return the total number of client connections that are alive - * to this server - */ - public int getNumAliveConnections() { - return serverCnxnFactory.getNumAliveConnections(); - } - - public void processConnectRequest(ServerCnxn cnxn, ByteBuffer incomingBuffer) throws IOException { - BinaryInputArchive bia = BinaryInputArchive.getArchive(new ByteBufferInputStream(incomingBuffer)); - ConnectRequest connReq = new ConnectRequest(); - connReq.deserialize(bia, "connect"); - if (LOG.isDebugEnabled()) { - LOG.debug("Session establishment request from client " - + cnxn.getRemoteSocketAddress() - + " client's lastZxid is 0x" - + Long.toHexString(connReq.getLastZxidSeen())); - } - boolean readOnly = false; - try { - readOnly = bia.readBool("readOnly"); - cnxn.isOldClient = false; - } catch (IOException e) { - // this is ok -- just a packet from an old client which - // doesn't contain readOnly field - LOG.warn("Connection request from old client " - + cnxn.getRemoteSocketAddress() - + "; will be dropped if server is in r-o mode"); - } - if (readOnly == false && this instanceof ReadOnlyZooKeeperServer) { - String msg = "Refusing session request for not-read-only client " - + cnxn.getRemoteSocketAddress(); - LOG.info(msg); - throw new CloseRequestException(msg); - } - if (connReq.getLastZxidSeen() > zkDb.dataTree.lastProcessedZxid) { - String msg = "Refusing session request for client " - + cnxn.getRemoteSocketAddress() - + " as it has seen zxid 0x" - + Long.toHexString(connReq.getLastZxidSeen()) - + " our last zxid is 0x" - + Long.toHexString(getZKDatabase().getDataTreeLastProcessedZxid()) - + " client must try another server"; - - LOG.info(msg); - throw new CloseRequestException(msg); - } - int sessionTimeout = connReq.getTimeOut(); - byte passwd[] = connReq.getPasswd(); - int minSessionTimeout = getMinSessionTimeout(); - if (sessionTimeout < minSessionTimeout) { - sessionTimeout = minSessionTimeout; - } - int maxSessionTimeout = getMaxSessionTimeout(); - if (sessionTimeout > maxSessionTimeout) { - sessionTimeout = maxSessionTimeout; - } - cnxn.setSessionTimeout(sessionTimeout); - // We don't want to receive any packets until we are sure that the - // session is setup - cnxn.disableRecv(); - long sessionId = connReq.getSessionId(); - if (sessionId != 0) { - long clientSessionId = connReq.getSessionId(); - LOG.info("Client attempting to renew session 0x" - + Long.toHexString(clientSessionId) - + " at " + cnxn.getRemoteSocketAddress()); - serverCnxnFactory.closeSession(sessionId); - cnxn.setSessionId(sessionId); - reopenSession(cnxn, sessionId, passwd, sessionTimeout); - } else { - LOG.info("Client attempting to establish new session at " - + cnxn.getRemoteSocketAddress()); - createSession(cnxn, passwd, sessionTimeout); - } - } - - public boolean shouldThrottle(long outStandingCount) { - if (getGlobalOutstandingLimit() < getInProcess()) { - return outStandingCount > 0; - } - return false; - } - - public void processPacket(ServerCnxn cnxn, ByteBuffer incomingBuffer) throws IOException { - // We have the request, now process and setup for next - InputStream bais = new ByteBufferInputStream(incomingBuffer); - BinaryInputArchive bia = BinaryInputArchive.getArchive(bais); - RequestHeader h = new RequestHeader(); - h.deserialize(bia, "header"); - // Through the magic of byte buffers, txn will not be - // pointing - // to the start of the txn - incomingBuffer = incomingBuffer.slice(); - if (h.getType() == OpCode.auth) { - LOG.info("got auth packet " + cnxn.getRemoteSocketAddress()); - AuthPacket authPacket = new AuthPacket(); - ByteBufferInputStream.byteBuffer2Record(incomingBuffer, authPacket); - String scheme = authPacket.getScheme(); - AuthenticationProvider ap = ProviderRegistry.getProvider(scheme); - Code authReturn = KeeperException.Code.AUTHFAILED; - if(ap != null) { - try { - authReturn = ap.handleAuthentication(cnxn, authPacket.getAuth()); - } catch(RuntimeException e) { - LOG.warn("Caught runtime exception from AuthenticationProvider: " + scheme + " due to " + e); - authReturn = KeeperException.Code.AUTHFAILED; - } - } - if (authReturn!= KeeperException.Code.OK) { - if (ap == null) { - LOG.warn("No authentication provider for scheme: " - + scheme + " has " - + ProviderRegistry.listProviders()); - } else { - LOG.warn("Authentication failed for scheme: " + scheme); - } - // send a response... - ReplyHeader rh = new ReplyHeader(h.getXid(), 0, - KeeperException.Code.AUTHFAILED.intValue()); - cnxn.sendResponse(rh, null, null); - // ... and close connection - cnxn.sendBuffer(ServerCnxnFactory.closeConn); - cnxn.disableRecv(); - } else { - if (LOG.isDebugEnabled()) { - LOG.debug("Authentication succeeded for scheme: " - + scheme); - } - LOG.info("auth success " + cnxn.getRemoteSocketAddress()); - ReplyHeader rh = new ReplyHeader(h.getXid(), 0, - KeeperException.Code.OK.intValue()); - cnxn.sendResponse(rh, null, null); - } - return; - } else { - if (h.getType() == OpCode.sasl) { - Record rsp = processSasl(incomingBuffer,cnxn); - ReplyHeader rh = new ReplyHeader(h.getXid(), 0, KeeperException.Code.OK.intValue()); - cnxn.sendResponse(rh,rsp, "response"); // not sure about 3rd arg..what is it? - } - else { - Request si = new Request(cnxn, cnxn.getSessionId(), h.getXid(), - h.getType(), incomingBuffer, cnxn.getAuthInfo()); - si.setOwner(ServerCnxn.me); - submitRequest(si); - } - } - cnxn.incrOutstandingRequests(h); - } - - private Record processSasl(ByteBuffer incomingBuffer, ServerCnxn cnxn) throws IOException { - LOG.debug("Responding to client SASL token."); - GetSASLRequest clientTokenRecord = new GetSASLRequest(); - ByteBufferInputStream.byteBuffer2Record(incomingBuffer,clientTokenRecord); - byte[] clientToken = clientTokenRecord.getToken(); - LOG.debug("Size of client SASL token: " + clientToken.length); - byte[] responseToken = null; - try { - ZooKeeperSaslServer saslServer = cnxn.zooKeeperSaslServer; - try { - // note that clientToken might be empty (clientToken.length == 0): - // if using the DIGEST-MD5 mechanism, clientToken will be empty at the beginning of the - // SASL negotiation process. - responseToken = saslServer.evaluateResponse(clientToken); - if (saslServer.isComplete() == true) { - String authorizationID = saslServer.getAuthorizationID(); - LOG.info("adding SASL authorization for authorizationID: " + authorizationID); - cnxn.addAuthInfo(new Id("sasl",authorizationID)); - } - } - catch (SaslException e) { - LOG.warn("Client failed to SASL authenticate: " + e); - if ((System.getProperty("zookeeper.allowSaslFailedClients") != null) - && - (System.getProperty("zookeeper.allowSaslFailedClients").equals("true"))) { - LOG.warn("Maintaining client connection despite SASL authentication failure."); - } else { - LOG.warn("Closing client connection due to SASL authentication failure."); - cnxn.close(); - } - } - } - catch (NullPointerException e) { - LOG.error("cnxn.saslServer is null: cnxn object did not initialize its saslServer properly."); - } - if (responseToken != null) { - LOG.debug("Size of server SASL response: " + responseToken.length); - } - // wrap SASL response token to client inside a Response object. - return new SetSASLResponse(responseToken); - } - - public ProcessTxnResult processTxn(TxnHeader hdr, Record txn) { - ProcessTxnResult rc; - int opCode = hdr.getType(); - long sessionId = hdr.getClientId(); - rc = getZKDatabase().processTxn(hdr, txn); - if (opCode == OpCode.createSession) { - if (txn instanceof CreateSessionTxn) { - CreateSessionTxn cst = (CreateSessionTxn) txn; - sessionTracker.addSession(sessionId, cst - .getTimeOut()); - } else { - LOG.warn("*****>>>>> Got " - + txn.getClass() + " " - + txn.toString()); - } - } else if (opCode == OpCode.closeSession) { - sessionTracker.removeSession(sessionId); - } - return rc; - } - - -} diff --git a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/ZooKeeperServerBean.java b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/ZooKeeperServerBean.java deleted file mode 100644 index 0eb5c7f97..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/ZooKeeperServerBean.java +++ /dev/null @@ -1,147 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you 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. - */ - -package org.apache.zookeeper.server; - -import java.net.InetAddress; -import java.net.UnknownHostException; -import java.util.Date; - -import org.apache.zookeeper.Version; -import org.apache.zookeeper.jmx.ZKMBeanInfo; - -/** - * This class implements the ZooKeeper server MBean interface. - */ -public class ZooKeeperServerBean implements ZooKeeperServerMXBean, ZKMBeanInfo { - private final Date startTime; - private final String name; - - protected final ZooKeeperServer zks; - - public ZooKeeperServerBean(ZooKeeperServer zks) { - startTime = new Date(); - this.zks = zks; - name = "StandaloneServer_port" + zks.getClientPort(); - } - - public String getClientPort() { - try { - return InetAddress.getLocalHost().getHostAddress() + ":" - + zks.getClientPort(); - } catch (UnknownHostException e) { - return "localhost:" + zks.getClientPort(); - } - } - - public String getName() { - return name; - } - - public boolean isHidden() { - return false; - } - - public String getStartTime() { - return startTime.toString(); - } - - public String getVersion() { - return Version.getFullVersion(); - } - - public long getAvgRequestLatency() { - return zks.serverStats().getAvgLatency(); - } - - public long getMaxRequestLatency() { - return zks.serverStats().getMaxLatency(); - } - - public long getMinRequestLatency() { - return zks.serverStats().getMinLatency(); - } - - public long getOutstandingRequests() { - return zks.serverStats().getOutstandingRequests(); - } - - public int getTickTime() { - return zks.getTickTime(); - } - - public void setTickTime(int tickTime) { - zks.setTickTime(tickTime); - } - - public int getMaxClientCnxnsPerHost() { - ServerCnxnFactory fac = zks.getServerCnxnFactory(); - if (fac == null) { - return -1; - } - return fac.getMaxClientCnxnsPerHost(); - } - - public void setMaxClientCnxnsPerHost(int max) { - // if fac is null the exception will be propagated to the client - zks.getServerCnxnFactory().setMaxClientCnxnsPerHost(max); - } - - public int getMinSessionTimeout() { - return zks.getMinSessionTimeout(); - } - - public void setMinSessionTimeout(int min) { - zks.setMinSessionTimeout(min); - } - - public int getMaxSessionTimeout() { - return zks.getMaxSessionTimeout(); - } - - public void setMaxSessionTimeout(int max) { - zks.setMaxSessionTimeout(max); - } - - - public long getPacketsReceived() { - return zks.serverStats().getPacketsReceived(); - } - - public long getPacketsSent() { - return zks.serverStats().getPacketsSent(); - } - - public void resetLatency() { - zks.serverStats().resetLatency(); - } - - public void resetMaxLatency() { - zks.serverStats().resetMaxLatency(); - } - - public void resetStatistics() { - ServerStats serverStats = zks.serverStats(); - serverStats.resetRequestCounters(); - serverStats.resetLatency(); - } - - public long getNumAliveConnections() { - return zks.getNumAliveConnections(); - } -} diff --git a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/ZooKeeperServerMXBean.java b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/ZooKeeperServerMXBean.java deleted file mode 100644 index 127ead8a0..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/ZooKeeperServerMXBean.java +++ /dev/null @@ -1,110 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you 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. - */ - -package org.apache.zookeeper.server; - -/** - * ZooKeeper server MBean. - */ -public interface ZooKeeperServerMXBean { - /** - * @return the server socket port number - */ - public String getClientPort(); - /** - * @return the zookeeper server version - */ - public String getVersion(); - /** - * @return time the server was started - */ - public String getStartTime(); - /** - * @return min request latency in ms - */ - public long getMinRequestLatency(); - /** - * @return average request latency in ms - */ - public long getAvgRequestLatency(); - /** - * @return max request latency in ms - */ - public long getMaxRequestLatency(); - /** - * @return number of packets received so far - */ - public long getPacketsReceived(); - /** - * @return number of packets sent so far - */ - public long getPacketsSent(); - /** - * @return number of outstanding requests. - */ - public long getOutstandingRequests(); - /** - * Current TickTime of server in milliseconds - */ - public int getTickTime(); - /** - * Set TickTime of server in milliseconds - */ - public void setTickTime(int tickTime); - - /** Current maxClientCnxns allowed from a particular host */ - public int getMaxClientCnxnsPerHost(); - - /** Set maxClientCnxns allowed from a particular host */ - public void setMaxClientCnxnsPerHost(int max); - - /** - * Current minSessionTimeout of the server in milliseconds - */ - public int getMinSessionTimeout(); - /** - * Set minSessionTimeout of server in milliseconds - */ - public void setMinSessionTimeout(int min); - - /** - * Current maxSessionTimeout of the server in milliseconds - */ - public int getMaxSessionTimeout(); - /** - * Set maxSessionTimeout of server in milliseconds - */ - public void setMaxSessionTimeout(int max); - - /** - * Reset packet and latency statistics - */ - public void resetStatistics(); - /** - * Reset min/avg/max latency statistics - */ - public void resetLatency(); - /** - * Reset max latency statistics only. - */ - public void resetMaxLatency(); - /** - * @return number of alive client connections - */ - public long getNumAliveConnections(); -} diff --git a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/ZooKeeperServerMain.java b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/ZooKeeperServerMain.java deleted file mode 100644 index c7eb9d640..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/ZooKeeperServerMain.java +++ /dev/null @@ -1,134 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you 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. - */ - -package org.apache.zookeeper.server; - -import java.io.File; -import java.io.IOException; - -import javax.management.JMException; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.apache.zookeeper.jmx.ManagedUtil; -import org.apache.zookeeper.server.persistence.FileTxnSnapLog; -import org.apache.zookeeper.server.quorum.QuorumPeerConfig.ConfigException; - -/** - * This class starts and runs a standalone ZooKeeperServer. - */ -public class ZooKeeperServerMain { - private static final Logger LOG = - LoggerFactory.getLogger(ZooKeeperServerMain.class); - - private static final String USAGE = - "Usage: ZooKeeperServerMain configfile | port datadir [ticktime] [maxcnxns]"; - - private ServerCnxnFactory cnxnFactory; - - /* - * Start up the ZooKeeper server. - * - * @param args the configfile or the port datadir [ticktime] - */ - public static void main(String[] args) { - ZooKeeperServerMain main = new ZooKeeperServerMain(); - try { - main.initializeAndRun(args); - } catch (IllegalArgumentException e) { - LOG.error("Invalid arguments, exiting abnormally", e); - LOG.info(USAGE); - System.err.println(USAGE); - System.exit(2); - } catch (ConfigException e) { - LOG.error("Invalid config, exiting abnormally", e); - System.err.println("Invalid config, exiting abnormally"); - System.exit(2); - } catch (Exception e) { - LOG.error("Unexpected exception, exiting abnormally", e); - System.exit(1); - } - LOG.info("Exiting normally"); - System.exit(0); - } - - protected void initializeAndRun(String[] args) - throws ConfigException, IOException - { - try { - ManagedUtil.registerLog4jMBeans(); - } catch (JMException e) { - LOG.warn("Unable to register log4j JMX control", e); - } - - ServerConfig config = new ServerConfig(); - if (args.length == 1) { - config.parse(args[0]); - } else { - config.parse(args); - } - - runFromConfig(config); - } - - /** - * Run from a ServerConfig. - * @param config ServerConfig to use. - * @throws IOException - */ - public void runFromConfig(ServerConfig config) throws IOException { - LOG.info("Starting server"); - FileTxnSnapLog txnLog = null; - try { - // Note that this thread isn't going to be doing anything else, - // so rather than spawning another thread, we will just call - // run() in this thread. - // create a file logger url from the command line args - ZooKeeperServer zkServer = new ZooKeeperServer(); - - txnLog = new FileTxnSnapLog(new File(config.dataLogDir), new File( - config.dataDir)); - zkServer.setTxnLogFactory(txnLog); - zkServer.setTickTime(config.tickTime); - zkServer.setMinSessionTimeout(config.minSessionTimeout); - zkServer.setMaxSessionTimeout(config.maxSessionTimeout); - cnxnFactory = ServerCnxnFactory.createFactory(); - cnxnFactory.configure(config.getClientPortAddress(), - config.getMaxClientCnxns()); - cnxnFactory.startup(zkServer); - cnxnFactory.join(); - if (zkServer.isRunning()) { - zkServer.shutdown(); - } - } catch (InterruptedException e) { - // warn, but generally this is ok - LOG.warn("Server interrupted", e); - } finally { - if (txnLog != null) { - txnLog.close(); - } - } - } - - /** - * Shutdown the serving instance - */ - protected void shutdown() { - cnxnFactory.shutdown(); - } -} diff --git a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/ZooTrace.java b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/ZooTrace.java deleted file mode 100644 index ac14fe22c..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/ZooTrace.java +++ /dev/null @@ -1,93 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you 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. - */ - -package org.apache.zookeeper.server; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import org.apache.zookeeper.server.quorum.QuorumPacket; - -/** - * This class encapsulates and centralizes tracing for the ZooKeeper server. - * Trace messages go to the log with TRACE level. - *

        - * Log4j must be correctly configured to capture the TRACE messages. - */ -public class ZooTrace { - final static public long CLIENT_REQUEST_TRACE_MASK = 1 << 1; - - final static public long CLIENT_DATA_PACKET_TRACE_MASK = 1 << 2; - - final static public long CLIENT_PING_TRACE_MASK = 1 << 3; - - final static public long SERVER_PACKET_TRACE_MASK = 1 << 4; - - final static public long SESSION_TRACE_MASK = 1 << 5; - - final static public long EVENT_DELIVERY_TRACE_MASK = 1 << 6; - - final static public long SERVER_PING_TRACE_MASK = 1 << 7; - - final static public long WARNING_TRACE_MASK = 1 << 8; - - final static public long JMX_TRACE_MASK = 1 << 9; - - private static long traceMask = CLIENT_REQUEST_TRACE_MASK - | SERVER_PACKET_TRACE_MASK | SESSION_TRACE_MASK - | WARNING_TRACE_MASK; - - public static long getTextTraceLevel() { - return traceMask; - } - - public static void setTextTraceLevel(long mask) { - traceMask = mask; - Logger LOG = LoggerFactory.getLogger(ZooTrace.class); - LOG.info("Set text trace mask to 0x" + Long.toHexString(mask)); - } - - public static boolean isTraceEnabled(Logger log, long mask) { - return log.isTraceEnabled() && (mask & traceMask) != 0; - } - - public static void logTraceMessage(Logger log, long mask, String msg) { - if (isTraceEnabled(log, mask)) { - log.trace(msg); - } - } - - static public void logQuorumPacket(Logger log, long mask, - char direction, QuorumPacket qp) - { - return; - - // if (isTraceEnabled(log, mask)) { - // logTraceMessage(LOG, mask, direction + " " - // + FollowerHandler.packetToString(qp)); - // } - } - - static public void logRequest(Logger log, long mask, - char rp, Request request, String header) - { - if (isTraceEnabled(log, mask)) { - log.trace(header + ":" + rp + request.toString()); - } - } -} diff --git a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/auth/AuthenticationProvider.java b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/auth/AuthenticationProvider.java deleted file mode 100644 index dd6e32fde..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/auth/AuthenticationProvider.java +++ /dev/null @@ -1,82 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you 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. - */ - -package org.apache.zookeeper.server.auth; - -import org.apache.zookeeper.KeeperException; -import org.apache.zookeeper.server.ServerCnxn; - -/** - * This interface is implemented by authentication providers to add new kinds of - * authentication schemes to ZooKeeper. - */ -public interface AuthenticationProvider { - /** - * The String used to represent this provider. This will correspond to the - * scheme field of an Id. - * - * @return the scheme of this provider. - */ - String getScheme(); - - /** - * This method is called when a client passes authentication data for this - * scheme. The authData is directly from the authentication packet. The - * implementor may attach new ids to the authInfo field of cnxn or may use - * cnxn to send packets back to the client. - * - * @param cnxn - * the cnxn that received the authentication information. - * @param authData - * the authentication data received. - * @return TODO - */ - KeeperException.Code handleAuthentication(ServerCnxn cnxn, byte authData[]); - - /** - * This method is called to see if the given id matches the given id - * expression in the ACL. This allows schemes to use application specific - * wild cards. - * - * @param id - * the id to check. - * @param aclExpr - * the expression to match ids against. - * @return true if the id can be matched by the expression. - */ - boolean matches(String id, String aclExpr); - - /** - * This method is used to check if the authentication done by this provider - * should be used to identify the creator of a node. Some ids such as hosts - * and ip addresses are rather transient and in general don't really - * identify a client even though sometimes they do. - * - * @return true if this provider identifies creators. - */ - boolean isAuthenticated(); - - /** - * Validates the syntax of an id. - * - * @param id - * the id to validate. - * @return true if id is well formed. - */ - boolean isValid(String id); -} diff --git a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/auth/DigestAuthenticationProvider.java b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/auth/DigestAuthenticationProvider.java deleted file mode 100644 index 2427e7a4b..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/auth/DigestAuthenticationProvider.java +++ /dev/null @@ -1,139 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you 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. - */ - -package org.apache.zookeeper.server.auth; - -import java.security.MessageDigest; -import java.security.NoSuchAlgorithmException; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.apache.zookeeper.KeeperException; -import org.apache.zookeeper.data.Id; -import org.apache.zookeeper.server.ServerCnxn; - -public class DigestAuthenticationProvider implements AuthenticationProvider { - private static final Logger LOG = - LoggerFactory.getLogger(DigestAuthenticationProvider.class); - - /** specify a command line property with key of - * "zookeeper.DigestAuthenticationProvider.superDigest" - * and value of "super:" to enable - * super user access (i.e. acls disabled) - */ - private final static String superDigest = System.getProperty( - "zookeeper.DigestAuthenticationProvider.superDigest"); - - public String getScheme() { - return "digest"; - } - - static final private String base64Encode(byte b[]) { - StringBuilder sb = new StringBuilder(); - for (int i = 0; i < b.length;) { - int pad = 0; - int v = (b[i++] & 0xff) << 16; - if (i < b.length) { - v |= (b[i++] & 0xff) << 8; - } else { - pad++; - } - if (i < b.length) { - v |= (b[i++] & 0xff); - } else { - pad++; - } - sb.append(encode(v >> 18)); - sb.append(encode(v >> 12)); - if (pad < 2) { - sb.append(encode(v >> 6)); - } else { - sb.append('='); - } - if (pad < 1) { - sb.append(encode(v)); - } else { - sb.append('='); - } - } - return sb.toString(); - } - - static final private char encode(int i) { - i &= 0x3f; - if (i < 26) { - return (char) ('A' + i); - } - if (i < 52) { - return (char) ('a' + i - 26); - } - if (i < 62) { - return (char) ('0' + i - 52); - } - return i == 62 ? '+' : '/'; - } - - static public String generateDigest(String idPassword) - throws NoSuchAlgorithmException { - String parts[] = idPassword.split(":", 2); - byte digest[] = MessageDigest.getInstance("SHA1").digest( - idPassword.getBytes()); - return parts[0] + ":" + base64Encode(digest); - } - - public KeeperException.Code - handleAuthentication(ServerCnxn cnxn, byte[] authData) - { - String id = new String(authData); - try { - String digest = generateDigest(id); - if (digest.equals(superDigest)) { - cnxn.addAuthInfo(new Id("super", "")); - } - cnxn.addAuthInfo(new Id(getScheme(), digest)); - return KeeperException.Code.OK; - } catch (NoSuchAlgorithmException e) { - LOG.error("Missing algorithm",e); - } - return KeeperException.Code.AUTHFAILED; - } - - public boolean isAuthenticated() { - return true; - } - - public boolean isValid(String id) { - String parts[] = id.split(":"); - return parts.length == 2; - } - - public boolean matches(String id, String aclExpr) { - return id.equals(aclExpr); - } - - /** Call with a single argument of user:pass to generate authdata. - * Authdata output can be used when setting superDigest for example. - * @param args single argument of user:pass - * @throws NoSuchAlgorithmException - */ - public static void main(String args[]) throws NoSuchAlgorithmException { - for (int i = 0; i < args.length; i++) { - System.out.println(args[i] + "->" + generateDigest(args[i])); - } - } -} diff --git a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/auth/DigestLoginModule.java b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/auth/DigestLoginModule.java deleted file mode 100644 index 955c728b6..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/auth/DigestLoginModule.java +++ /dev/null @@ -1,61 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you 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. - */ - -package org.apache.zookeeper.server.auth; - -import javax.security.auth.Subject; -import javax.security.auth.callback.CallbackHandler; -import javax.security.auth.spi.LoginModule; -import java.util.Map; - -public class DigestLoginModule implements LoginModule { - private Subject subject; - - public boolean abort() { - return false; - } - - public boolean commit() { - return true; - } - - public void initialize(Subject subject, CallbackHandler callbackHandler, Map sharedState, Map options) { - if (options.containsKey("username")) { - // Zookeeper client: get username and password from JAAS conf (only used if using DIGEST-MD5). - this.subject = subject; - String username = (String)options.get("username"); - this.subject.getPublicCredentials().add((Object)username); - String password = (String)options.get("password"); - this.subject.getPrivateCredentials().add((Object)password); - } - return; - } - - public boolean logout() { - return true; - } - - public boolean login() { - // Unlike with Krb5LoginModule, we don't do any actual login or credential passing here: authentication to Zookeeper - // is done later, through the SASLClient object. - return true; - } - -} - - diff --git a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/auth/IPAuthenticationProvider.java b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/auth/IPAuthenticationProvider.java deleted file mode 100644 index 192dc0603..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/auth/IPAuthenticationProvider.java +++ /dev/null @@ -1,117 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you 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. - */ - -package org.apache.zookeeper.server.auth; - -import org.apache.zookeeper.KeeperException; -import org.apache.zookeeper.data.Id; -import org.apache.zookeeper.server.ServerCnxn; - -public class IPAuthenticationProvider implements AuthenticationProvider { - - public String getScheme() { - return "ip"; - } - - public KeeperException.Code - handleAuthentication(ServerCnxn cnxn, byte[] authData) - { - String id = cnxn.getRemoteSocketAddress().getAddress().getHostAddress(); - cnxn.addAuthInfo(new Id(getScheme(), id)); - return KeeperException.Code.OK; - } - - // This is a bit weird but we need to return the address and the number of - // bytes (to distinguish between IPv4 and IPv6 - private byte[] addr2Bytes(String addr) { - byte b[] = v4addr2Bytes(addr); - // TODO Write the v6addr2Bytes - return b; - } - - private byte[] v4addr2Bytes(String addr) { - String parts[] = addr.split("\\.", -1); - if (parts.length != 4) { - return null; - } - byte b[] = new byte[4]; - for (int i = 0; i < 4; i++) { - try { - int v = Integer.parseInt(parts[i]); - if (v >= 0 && v <= 255) { - b[i] = (byte) v; - } else { - return null; - } - } catch (NumberFormatException e) { - return null; - } - } - return b; - } - - private void mask(byte b[], int bits) { - int start = bits / 8; - int startMask = (1 << (8 - (bits % 8))) - 1; - startMask = ~startMask; - while (start < b.length) { - b[start] &= startMask; - startMask = 0; - start++; - } - } - - public boolean matches(String id, String aclExpr) { - String parts[] = aclExpr.split("/", 2); - byte aclAddr[] = addr2Bytes(parts[0]); - if (aclAddr == null) { - return false; - } - int bits = aclAddr.length * 8; - if (parts.length == 2) { - try { - bits = Integer.parseInt(parts[1]); - if (bits < 0 || bits > aclAddr.length * 8) { - return false; - } - } catch (NumberFormatException e) { - return false; - } - } - mask(aclAddr, bits); - byte remoteAddr[] = addr2Bytes(id); - if (remoteAddr == null) { - return false; - } - mask(remoteAddr, bits); - for (int i = 0; i < remoteAddr.length; i++) { - if (remoteAddr[i] != aclAddr[i]) { - return false; - } - } - return true; - } - - public boolean isAuthenticated() { - return false; - } - - public boolean isValid(String id) { - return addr2Bytes(id) != null; - } -} diff --git a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/auth/KerberosName.java b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/auth/KerberosName.java deleted file mode 100644 index 01d1f6664..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/auth/KerberosName.java +++ /dev/null @@ -1,418 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you 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 file copied from Hadoop's security branch, - * with the following changes: - * 1. package changed from org.apache.hadoop.security to - * org.apache.zookeeper.server.auth. - * 2. Usage of Hadoop's Configuration class removed since - * it is not available in Zookeeper: instead, system property - * "zookeeper.security.auth_to_local" is used. - */ - -package org.apache.zookeeper.server.auth; - -import java.io.IOException; -import java.util.ArrayList; -import java.util.List; -import java.util.regex.Matcher; -import java.util.regex.Pattern; - -import org.apache.zookeeper.server.util.KerberosUtil; - -/** - * This class implements parsing and handling of Kerberos principal names. In - * particular, it splits them apart and translates them down into local - * operating system names. - */ -public class KerberosName { - /** The first component of the name */ - private final String serviceName; - /** The second component of the name. It may be null. */ - private final String hostName; - /** The realm of the name. */ - private final String realm; - - /** - * A pattern that matches a Kerberos name with at most 2 components. - */ - private static final Pattern nameParser = - Pattern.compile("([^/@]*)(/([^/@]*))?@([^/@]*)"); - - /** - * A pattern that matches a string with out '$' and then a single - * parameter with $n. - */ - private static Pattern parameterPattern = - Pattern.compile("([^$]*)(\\$(\\d*))?"); - - /** - * A pattern for parsing a auth_to_local rule. - */ - private static final Pattern ruleParser = - Pattern.compile("\\s*((DEFAULT)|(RULE:\\[(\\d*):([^\\]]*)](\\(([^)]*)\\))?"+ - "(s/([^/]*)/([^/]*)/(g)?)?))"); - - /** - * A pattern that recognizes simple/non-simple names. - */ - private static final Pattern nonSimplePattern = Pattern.compile("[/@]"); - - /** - * The list of translation rules. - */ - private static List rules; - - private static String defaultRealm; - - static { - try { - defaultRealm = KerberosUtil.getDefaultRealm(); - } catch (Exception ke) { - if ((System.getProperty("zookeeper.requireKerberosConfig") != null) && - (System.getProperty("zookeeper.requireKerberosConfig").equals("true"))) { - throw new IllegalArgumentException("Can't get Kerberos configuration",ke); - } - else - defaultRealm=""; - } - try { - // setConfiguration() will work even if the above try() fails due - // to a missing Kerberos configuration (unless zookeeper.requireKerberosConfig - // is set to true, which would not allow execution to reach here due to the - // throwing of an IllegalArgumentException above). - setConfiguration(); - } - catch (IOException e) { - throw new IllegalArgumentException("Could not configure Kerberos principal name mapping."); - } - } - - /** - * Create a name from the full Kerberos principal name. - * @param name - */ - public KerberosName(String name) { - Matcher match = nameParser.matcher(name); - if (!match.matches()) { - if (name.contains("@")) { - throw new IllegalArgumentException("Malformed Kerberos name: " + name); - } else { - serviceName = name; - hostName = null; - realm = null; - } - } else { - serviceName = match.group(1); - hostName = match.group(3); - realm = match.group(4); - } - } - - /** - * Get the configured default realm. - * @return the default realm from the krb5.conf - */ - public String getDefaultRealm() { - return defaultRealm; - } - - /** - * Put the name back together from the parts. - */ - @Override - public String toString() { - StringBuilder result = new StringBuilder(); - result.append(serviceName); - if (hostName != null) { - result.append('/'); - result.append(hostName); - } - if (realm != null) { - result.append('@'); - result.append(realm); - } - return result.toString(); - } - - /** - * Get the first component of the name. - * @return the first section of the Kerberos principal name - */ - public String getServiceName() { - return serviceName; - } - - /** - * Get the second component of the name. - * @return the second section of the Kerberos principal name, and may be null - */ - public String getHostName() { - return hostName; - } - - /** - * Get the realm of the name. - * @return the realm of the name, may be null - */ - public String getRealm() { - return realm; - } - - /** - * An encoding of a rule for translating kerberos names. - */ - private static class Rule { - private final boolean isDefault; - private final int numOfComponents; - private final String format; - private final Pattern match; - private final Pattern fromPattern; - private final String toPattern; - private final boolean repeat; - - Rule() { - isDefault = true; - numOfComponents = 0; - format = null; - match = null; - fromPattern = null; - toPattern = null; - repeat = false; - } - - Rule(int numOfComponents, String format, String match, String fromPattern, - String toPattern, boolean repeat) { - isDefault = false; - this.numOfComponents = numOfComponents; - this.format = format; - this.match = match == null ? null : Pattern.compile(match); - this.fromPattern = - fromPattern == null ? null : Pattern.compile(fromPattern); - this.toPattern = toPattern; - this.repeat = repeat; - } - - @Override - public String toString() { - StringBuilder buf = new StringBuilder(); - if (isDefault) { - buf.append("DEFAULT"); - } else { - buf.append("RULE:["); - buf.append(numOfComponents); - buf.append(':'); - buf.append(format); - buf.append(']'); - if (match != null) { - buf.append('('); - buf.append(match); - buf.append(')'); - } - if (fromPattern != null) { - buf.append("s/"); - buf.append(fromPattern); - buf.append('/'); - buf.append(toPattern); - buf.append('/'); - if (repeat) { - buf.append('g'); - } - } - } - return buf.toString(); - } - - /** - * Replace the numbered parameters of the form $n where n is from 1 to - * the length of params. Normal text is copied directly and $n is replaced - * by the corresponding parameter. - * @param format the string to replace parameters again - * @param params the list of parameters - * @return the generated string with the parameter references replaced. - * @throws BadFormatString - */ - static String replaceParameters(String format, - String[] params) throws BadFormatString { - Matcher match = parameterPattern.matcher(format); - int start = 0; - StringBuilder result = new StringBuilder(); - while (start < format.length() && match.find(start)) { - result.append(match.group(1)); - String paramNum = match.group(3); - if (paramNum != null) { - try { - int num = Integer.parseInt(paramNum); - if (num < 0 || num > params.length) { - throw new BadFormatString("index " + num + " from " + format + - " is outside of the valid range 0 to " + - (params.length - 1)); - } - result.append(params[num]); - } catch (NumberFormatException nfe) { - throw new BadFormatString("bad format in username mapping in " + - paramNum, nfe); - } - - } - start = match.end(); - } - return result.toString(); - } - - /** - * Replace the matches of the from pattern in the base string with the value - * of the to string. - * @param base the string to transform - * @param from the pattern to look for in the base string - * @param to the string to replace matches of the pattern with - * @param repeat whether the substitution should be repeated - * @return - */ - static String replaceSubstitution(String base, Pattern from, String to, - boolean repeat) { - Matcher match = from.matcher(base); - if (repeat) { - return match.replaceAll(to); - } else { - return match.replaceFirst(to); - } - } - - /** - * Try to apply this rule to the given name represented as a parameter - * array. - * @param params first element is the realm, second and later elements are - * are the components of the name "a/b@FOO" -> {"FOO", "a", "b"} - * @return the short name if this rule applies or null - * @throws IOException throws if something is wrong with the rules - */ - String apply(String[] params) throws IOException { - String result = null; - if (isDefault) { - if (defaultRealm.equals(params[0])) { - result = params[1]; - } - } else if (params.length - 1 == numOfComponents) { - String base = replaceParameters(format, params); - if (match == null || match.matcher(base).matches()) { - if (fromPattern == null) { - result = base; - } else { - result = replaceSubstitution(base, fromPattern, toPattern, repeat); - } - } - } - if (result != null && nonSimplePattern.matcher(result).find()) { - throw new NoMatchingRule("Non-simple name " + result + - " after auth_to_local rule " + this); - } - return result; - } - } - - static List parseRules(String rules) { - List result = new ArrayList(); - String remaining = rules.trim(); - while (remaining.length() > 0) { - Matcher matcher = ruleParser.matcher(remaining); - if (!matcher.lookingAt()) { - throw new IllegalArgumentException("Invalid rule: " + remaining); - } - if (matcher.group(2) != null) { - result.add(new Rule()); - } else { - result.add(new Rule(Integer.parseInt(matcher.group(4)), - matcher.group(5), - matcher.group(7), - matcher.group(9), - matcher.group(10), - "g".equals(matcher.group(11)))); - } - remaining = remaining.substring(matcher.end()); - } - return result; - } - - /** - * Set the static configuration to get the rules. - * @param conf the new configuration - * @throws IOException - */ - public static void setConfiguration() throws IOException { - String ruleString = System.getProperty("zookeeper.security.auth_to_local", "DEFAULT"); - rules = parseRules(ruleString); - } - - @SuppressWarnings("serial") - public static class BadFormatString extends IOException { - BadFormatString(String msg) { - super(msg); - } - BadFormatString(String msg, Throwable err) { - super(msg, err); - } - } - - @SuppressWarnings("serial") - public static class NoMatchingRule extends IOException { - NoMatchingRule(String msg) { - super(msg); - } - } - - /** - * Get the translation of the principal name into an operating system - * user name. - * @return the short name - * @throws IOException - */ - public String getShortName() throws IOException { - String[] params; - if (hostName == null) { - // if it is already simple, just return it - if (realm == null) { - return serviceName; - } - params = new String[]{realm, serviceName}; - } else { - params = new String[]{realm, serviceName, hostName}; - } - for(Rule r: rules) { - String result = r.apply(params); - if (result != null) { - return result; - } - } - throw new NoMatchingRule("No rules applied to " + toString()); - } - - static void printRules() throws IOException { - int i = 0; - for(Rule r: rules) { - System.out.println(++i + " " + r); - } - } - - public static void main(String[] args) throws Exception { - for(String arg: args) { - KerberosName name = new KerberosName(arg); - System.out.println("Name: " + name + " to " + name.getShortName()); - } - } -} diff --git a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/auth/ProviderRegistry.java b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/auth/ProviderRegistry.java deleted file mode 100644 index 406015f84..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/auth/ProviderRegistry.java +++ /dev/null @@ -1,77 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you 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. - */ - -package org.apache.zookeeper.server.auth; - -import java.util.Enumeration; -import java.util.HashMap; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import org.apache.zookeeper.server.ZooKeeperServer; - -public class ProviderRegistry { - private static final Logger LOG = LoggerFactory.getLogger(ProviderRegistry.class); - - private static boolean initialized = false; - private static HashMap authenticationProviders = - new HashMap(); - - public static void initialize() { - synchronized (ProviderRegistry.class) { - if (initialized) - return; - IPAuthenticationProvider ipp = new IPAuthenticationProvider(); - DigestAuthenticationProvider digp = new DigestAuthenticationProvider(); - authenticationProviders.put(ipp.getScheme(), ipp); - authenticationProviders.put(digp.getScheme(), digp); - Enumeration en = System.getProperties().keys(); - while (en.hasMoreElements()) { - String k = (String) en.nextElement(); - if (k.startsWith("zookeeper.authProvider.")) { - String className = System.getProperty(k); - try { - Class c = ZooKeeperServer.class.getClassLoader() - .loadClass(className); - AuthenticationProvider ap = (AuthenticationProvider) c - .newInstance(); - authenticationProviders.put(ap.getScheme(), ap); - } catch (Exception e) { - LOG.warn("Problems loading " + className,e); - } - } - } - initialized = true; - } - } - - public static AuthenticationProvider getProvider(String scheme) { - if(!initialized) - initialize(); - return authenticationProviders.get(scheme); - } - - public static String listProviders() { - StringBuilder sb = new StringBuilder(); - for(String s: authenticationProviders.keySet()) { - sb.append(s + " "); -} - return sb.toString(); - } -} diff --git a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/auth/SASLAuthenticationProvider.java b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/auth/SASLAuthenticationProvider.java deleted file mode 100644 index 063304f44..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/auth/SASLAuthenticationProvider.java +++ /dev/null @@ -1,70 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you 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. - */ - -package org.apache.zookeeper.server.auth; - -import org.apache.zookeeper.KeeperException; -import org.apache.zookeeper.server.ServerCnxn; - -public class SASLAuthenticationProvider implements AuthenticationProvider { - - public String getScheme() { - return "sasl"; - } - - public KeeperException.Code - handleAuthentication(ServerCnxn cnxn, byte[] authData) - { - // Should never call this: SASL authentication is negotiated at session initiation. - // TODO: consider substituting current implementation of direct ClientCnxn manipulation with - // a call to this method (SASLAuthenticationProvider:handleAuthentication()) at session initiation. - return KeeperException.Code.AUTHFAILED; - - } - - public boolean matches(String id,String aclExpr) { - if (System.getProperty("zookeeper.superUser") != null) { - return (id.equals(System.getProperty("zookeeper.superUser")) || id.equals(aclExpr)); - } - return (id.equals("super") || id.equals(aclExpr)); - } - - public boolean isAuthenticated() { - return true; - } - - public boolean isValid(String id) { - // Since the SASL authenticator will usually be used with Kerberos authentication, - // it should enforce that these names are valid according to Kerberos's - // syntax for principals. - // - // Use the KerberosName(id) constructor to define validity: - // if KerberosName(id) throws IllegalArgumentException, then id is invalid. - // otherwise, it is valid. - // - try { - new KerberosName(id); - return true; - } - catch (IllegalArgumentException e) { - return false; - } - } - - -} diff --git a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/auth/SaslServerCallbackHandler.java b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/auth/SaslServerCallbackHandler.java deleted file mode 100644 index 2fbd6eda4..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/auth/SaslServerCallbackHandler.java +++ /dev/null @@ -1,152 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you 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. - */ - -package org.apache.zookeeper.server.auth; - -import java.io.IOException; -import java.util.HashMap; -import java.util.Map; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import javax.security.auth.callback.Callback; -import javax.security.auth.callback.CallbackHandler; -import javax.security.auth.callback.NameCallback; -import javax.security.auth.callback.PasswordCallback; -import javax.security.auth.callback.UnsupportedCallbackException; -import javax.security.auth.login.AppConfigurationEntry; -import javax.security.auth.login.Configuration; -import javax.security.sasl.AuthorizeCallback; -import javax.security.sasl.RealmCallback; - -import org.apache.zookeeper.server.ZooKeeperSaslServer; - -public class SaslServerCallbackHandler implements CallbackHandler { - private static final String USER_PREFIX = "user_"; - private static final Logger LOG = LoggerFactory.getLogger(SaslServerCallbackHandler.class); - private static final String SYSPROP_SUPER_PASSWORD = "zookeeper.SASLAuthenticationProvider.superPassword"; - private static final String SYSPROP_REMOVE_HOST = "zookeeper.kerberos.removeHostFromPrincipal"; - private static final String SYSPROP_REMOVE_REALM = "zookeeper.kerberos.removeRealmFromPrincipal"; - - private String userName; - private final Map credentials = new HashMap(); - - public SaslServerCallbackHandler(Configuration configuration) throws IOException { - String serverSection = System.getProperty(ZooKeeperSaslServer.LOGIN_CONTEXT_NAME_KEY, - ZooKeeperSaslServer.DEFAULT_LOGIN_CONTEXT_NAME); - AppConfigurationEntry configurationEntries[] = configuration.getAppConfigurationEntry(serverSection); - - if (configurationEntries == null) { - String errorMessage = "Could not find a 'Server' entry in this configuration: Server cannot start."; - LOG.error(errorMessage); - throw new IOException(errorMessage); - } - credentials.clear(); - for(AppConfigurationEntry entry: configurationEntries) { - Map options = entry.getOptions(); - // Populate DIGEST-MD5 user -> password map with JAAS configuration entries from the "Server" section. - // Usernames are distinguished from other options by prefixing the username with a "user_" prefix. - for(Map.Entry pair : options.entrySet()) { - String key = pair.getKey(); - if (key.startsWith(USER_PREFIX)) { - String userName = key.substring(USER_PREFIX.length()); - credentials.put(userName,(String)pair.getValue()); - } - } - } - } - - public void handle(Callback[] callbacks) throws UnsupportedCallbackException { - for (Callback callback : callbacks) { - if (callback instanceof NameCallback) { - handleNameCallback((NameCallback) callback); - } else if (callback instanceof PasswordCallback) { - handlePasswordCallback((PasswordCallback) callback); - } else if (callback instanceof RealmCallback) { - handleRealmCallback((RealmCallback) callback); - } else if (callback instanceof AuthorizeCallback) { - handleAuthorizeCallback((AuthorizeCallback) callback); - } - } - } - - private void handleNameCallback(NameCallback nc) { - // check to see if this user is in the user password database. - if (credentials.get(nc.getDefaultName()) == null) { - LOG.warn("User '" + nc.getDefaultName() + "' not found in list of DIGEST-MD5 authenticateable users."); - return; - } - nc.setName(nc.getDefaultName()); - userName = nc.getDefaultName(); - } - - private void handlePasswordCallback(PasswordCallback pc) { - if ("super".equals(this.userName) && System.getProperty(SYSPROP_SUPER_PASSWORD) != null) { - // superuser: use Java system property for password, if available. - pc.setPassword(System.getProperty(SYSPROP_SUPER_PASSWORD).toCharArray()); - } else if (credentials.containsKey(userName) ) { - pc.setPassword(credentials.get(userName).toCharArray()); - } else { - LOG.warn("No password found for user: " + userName); - } - } - - private void handleRealmCallback(RealmCallback rc) { - LOG.debug("client supplied realm: " + rc.getDefaultText()); - rc.setText(rc.getDefaultText()); - } - - private void handleAuthorizeCallback(AuthorizeCallback ac) { - String authenticationID = ac.getAuthenticationID(); - String authorizationID = ac.getAuthorizationID(); - - LOG.info("Successfully authenticated client: authenticationID=" + authenticationID - + "; authorizationID=" + authorizationID + "."); - ac.setAuthorized(true); - - // canonicalize authorization id according to system properties: - // zookeeper.kerberos.removeRealmFromPrincipal(={true,false}) - // zookeeper.kerberos.removeHostFromPrincipal(={true,false}) - KerberosName kerberosName = new KerberosName(authenticationID); - try { - StringBuilder userNameBuilder = new StringBuilder(kerberosName.getShortName()); - if (shouldAppendHost(kerberosName)) { - userNameBuilder.append("/").append(kerberosName.getHostName()); - } - if (shouldAppendRealm(kerberosName)) { - userNameBuilder.append("@").append(kerberosName.getRealm()); - } - LOG.info("Setting authorizedID: " + userNameBuilder); - ac.setAuthorizedID(userNameBuilder.toString()); - } catch (IOException e) { - LOG.error("Failed to set name based on Kerberos authentication rules."); - } - } - - private boolean shouldAppendRealm(KerberosName kerberosName) { - return !isSystemPropertyTrue(SYSPROP_REMOVE_REALM) && kerberosName.getRealm() != null; - } - - private boolean shouldAppendHost(KerberosName kerberosName) { - return !isSystemPropertyTrue(SYSPROP_REMOVE_HOST) && kerberosName.getHostName() != null; - } - - private boolean isSystemPropertyTrue(String propertyName) { - return "true".equals(System.getProperty(propertyName)); - } -} diff --git a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/package.html b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/package.html deleted file mode 100644 index 89a5d7eff..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/package.html +++ /dev/null @@ -1,101 +0,0 @@ - - - - -

        ZooKeeper server theory of operation

        -ZooKeeperServer is designed to work in standalone mode and also -be extensible so that it can be used to implement the quorum based -version of ZooKeeper. -

        -ZooKeeper maintains a order when processing requests: -

          -
        • All requests will be processed in order. -
        • All responses will return in order. -
        • All watches will be sent in the order that the update takes place. -
        -

        -We will explain the three aspects of ZooKeeperServer: request processing, data -structure maintenance, and session tracking. - -

        Request processing

        - -Requests are received by the ServerCnxn. Demarshalling of a request is -done by ClientRequestHandler. After a request has been demarshalled, -ClientRequestHandler invokes the relevant method in ZooKeeper and marshals -the result. -

        -If the request is just a query, it will be processed by ZooKeeper and returned. -Otherwise, the request will be validated and a transaction will be generated -and logged. This the request will then wait until the request has been logged -before continuing processing. -

        -Requests are logged as a group. Transactions are queued up and the SyncThread -will process them at predefined intervals. (Currently 20ms) The SyncThread -interacts with ZooKeeperServer the txnQueue. Transactions are added to the -txnQueue of SyncThread via queueItem. When the transaction has been synced to -disk, its callback will be invoked which will cause the request processing to -be completed. - -

        Data structure maintenance

        - -ZooKeeper data is stored in-memory. Each znode is stored in a DataNode object. -This object is accessed through a hash table that maps paths to DataNodes. -DataNodes also organize themselves into a tree. This tree is only used for -serializing nodes. -

        -We guarantee that changes to nodes are stored to non-volatile media before -responding to a client. We do this quickly by writing changes as a sequence -of transactions in a log file. Even though we flush transactions as a group, -we need to avoid seeks as much as possible. Also, since the server can fail -at any point, we need to be careful of partial records. -

        -We address the above problems by -

          -
        • Pre-allocating 1M chunks of file space. This allows us to append to the -file without causing seeks to update file size. It also means that we need -to check for the end of the log by looking for a zero length transaction -rather than simply end of file. -
        • Writing a signature at the end of each transaction. When processing -transactions, we only use transactions that have a valid signature at the end. -
        -

        -As the server runs, the log file will grow quite large. To avoid long startup -times we periodically take a snapshot of the tree of DataNodes. We cannot -take the snapshot synchronously as the data takes a while to write out, so -instead we asynchronously write out the tree. This means that we end up -with a "corrupt" snapshot of the data tree. More formally if we define T -to be the real snapshot of the tree at the time we begin taking the snapshot -and l as the sequence of transactions that are applied to the tree between -the time the snapshot begins and the time the snapshot completes, we write -to disk T+l' where l' is a subset of the transactions in l. While we do not -have a way of figuring out which transactions make up l', it doesn't really -matter. T+l'+l = T+l since the transactions we log are idempotent (applying -the transaction multiple times has the same result as applying the transaction -once). So when we restore the snapshot we also play all transactions in the log -that occur after the snapshot was begun. We can easily figure out where to -start the replay because we start a new logfile when we start a snapshot. Both -the snapshot file and log file have a numeric suffix that represent the -transaction id that created the respective files. - -

        Session tracking

        -Rather than tracking sessions exactly, we track them in batches. That are -processed at fixed intervals. This is easier to implement than exact -session tracking and it is more efficient in terms of performance. It also -provides a small grace period for session renewal. - - \ No newline at end of file diff --git a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/persistence/FileSnap.java b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/persistence/FileSnap.java deleted file mode 100644 index 8f5733841..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/persistence/FileSnap.java +++ /dev/null @@ -1,250 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you 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. - */ - -package org.apache.zookeeper.server.persistence; -import java.io.BufferedInputStream; -import java.io.BufferedOutputStream; -import java.io.File; -import java.io.FileInputStream; -import java.io.FileOutputStream; -import java.io.IOException; -import java.io.InputStream; -import java.io.OutputStream; -import java.nio.ByteBuffer; -import java.util.ArrayList; -import java.util.List; -import java.util.Map; -import java.util.zip.Adler32; -import java.util.zip.CheckedInputStream; -import java.util.zip.CheckedOutputStream; - -import org.apache.jute.BinaryInputArchive; -import org.apache.jute.BinaryOutputArchive; -import org.apache.jute.InputArchive; -import org.apache.jute.OutputArchive; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.apache.zookeeper.server.DataTree; -import org.apache.zookeeper.server.util.SerializeUtils; - -/** - * This class implements the snapshot interface. - * it is responsible for storing, serializing - * and deserializing the right snapshot. - * and provides access to the snapshots. - */ -public class FileSnap implements SnapShot { - File snapDir; - private volatile boolean close = false; - private static final int VERSION=2; - private static final long dbId=-1; - private static final Logger LOG = LoggerFactory.getLogger(FileSnap.class); - public final static int SNAP_MAGIC - = ByteBuffer.wrap("ZKSN".getBytes()).getInt(); - public FileSnap(File snapDir) { - this.snapDir = snapDir; - } - - /** - * deserialize a data tree from the most recent snapshot - * @return the zxid of the snapshot - */ - public long deserialize(DataTree dt, Map sessions) - throws IOException { - // we run through 100 snapshots (not all of them) - // if we cannot get it running within 100 snapshots - // we should give up - List snapList = findNValidSnapshots(100); - if (snapList.size() == 0) { - return -1L; - } - File snap = null; - boolean foundValid = false; - for (int i = 0; i < snapList.size(); i++) { - snap = snapList.get(i); - InputStream snapIS = null; - CheckedInputStream crcIn = null; - try { - LOG.info("Reading snapshot " + snap); - snapIS = new BufferedInputStream(new FileInputStream(snap)); - crcIn = new CheckedInputStream(snapIS, new Adler32()); - InputArchive ia = BinaryInputArchive.getArchive(crcIn); - deserialize(dt,sessions, ia); - long checkSum = crcIn.getChecksum().getValue(); - long val = ia.readLong("val"); - if (val != checkSum) { - throw new IOException("CRC corruption in snapshot : " + snap); - } - foundValid = true; - break; - } catch(IOException e) { - LOG.warn("problem reading snap file " + snap, e); - } finally { - if (snapIS != null) - snapIS.close(); - if (crcIn != null) - crcIn.close(); - } - } - if (!foundValid) { - throw new IOException("Not able to find valid snapshots in " + snapDir); - } - dt.lastProcessedZxid = Util.getZxidFromName(snap.getName(), "snapshot"); - return dt.lastProcessedZxid; - } - - /** - * deserialize the datatree from an inputarchive - * @param dt the datatree to be serialized into - * @param sessions the sessions to be filled up - * @param ia the input archive to restore from - * @throws IOException - */ - public void deserialize(DataTree dt, Map sessions, - InputArchive ia) throws IOException { - FileHeader header = new FileHeader(); - header.deserialize(ia, "fileheader"); - if (header.getMagic() != SNAP_MAGIC) { - throw new IOException("mismatching magic headers " - + header.getMagic() + - " != " + FileSnap.SNAP_MAGIC); - } - SerializeUtils.deserializeSnapshot(dt,ia,sessions); - } - - /** - * find the most recent snapshot in the database. - * @return the file containing the most recent snapshot - */ - public File findMostRecentSnapshot() throws IOException { - List files = findNValidSnapshots(1); - if (files.size() == 0) { - return null; - } - return files.get(0); - } - - /** - * find the last (maybe) valid n snapshots. this does some - * minor checks on the validity of the snapshots. It just - * checks for / at the end of the snapshot. This does - * not mean that the snapshot is truly valid but is - * valid with a high probability. also, the most recent - * will be first on the list. - * @param n the number of most recent snapshots - * @return the last n snapshots (the number might be - * less than n in case enough snapshots are not available). - * @throws IOException - */ - private List findNValidSnapshots(int n) throws IOException { - List files = Util.sortDataDir(snapDir.listFiles(),"snapshot", false); - int count = 0; - List list = new ArrayList(); - for (File f : files) { - // we should catch the exceptions - // from the valid snapshot and continue - // until we find a valid one - try { - if (Util.isValidSnapshot(f)) { - list.add(f); - count++; - if (count == n) { - break; - } - } - } catch (IOException e) { - LOG.info("invalid snapshot " + f, e); - } - } - return list; - } - - /** - * find the last n snapshots. this does not have - * any checks if the snapshot might be valid or not - * @param the number of most recent snapshots - * @return the last n snapshots - * @throws IOException - */ - public List findNRecentSnapshots(int n) throws IOException { - List files = Util.sortDataDir(snapDir.listFiles(), "snapshot", false); - int i = 0; - List list = new ArrayList(); - for (File f: files) { - if (i==n) - break; - i++; - list.add(f); - } - return list; - } - - /** - * serialize the datatree and sessions - * @param dt the datatree to be serialized - * @param sessions the sessions to be serialized - * @param oa the output archive to serialize into - * @param header the header of this snapshot - * @throws IOException - */ - protected void serialize(DataTree dt,Map sessions, - OutputArchive oa, FileHeader header) throws IOException { - // this is really a programmatic error and not something that can - // happen at runtime - if(header==null) - throw new IllegalStateException( - "Snapshot's not open for writing: uninitialized header"); - header.serialize(oa, "fileheader"); - SerializeUtils.serializeSnapshot(dt,oa,sessions); - } - - /** - * serialize the datatree and session into the file snapshot - * @param dt the datatree to be serialized - * @param sessions the sessions to be serialized - * @param snapShot the file to store snapshot into - */ - public synchronized void serialize(DataTree dt, Map sessions, File snapShot) - throws IOException { - if (!close) { - OutputStream sessOS = new BufferedOutputStream(new FileOutputStream(snapShot)); - CheckedOutputStream crcOut = new CheckedOutputStream(sessOS, new Adler32()); - //CheckedOutputStream cout = new CheckedOutputStream() - OutputArchive oa = BinaryOutputArchive.getArchive(crcOut); - FileHeader header = new FileHeader(SNAP_MAGIC, VERSION, dbId); - serialize(dt,sessions,oa, header); - long val = crcOut.getChecksum().getValue(); - oa.writeLong(val, "val"); - oa.writeString("/", "path"); - sessOS.flush(); - crcOut.close(); - sessOS.close(); - } - } - - /** - * synchronized close just so that if serialize is in place - * the close operation will block and will wait till serialize - * is done and will set the close flag - */ - @Override - public synchronized void close() throws IOException { - close = true; - } - - } diff --git a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/persistence/FileTxnLog.java b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/persistence/FileTxnLog.java deleted file mode 100644 index b0dd79c1c..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/persistence/FileTxnLog.java +++ /dev/null @@ -1,684 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you 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. - */ -package org.apache.zookeeper.server.persistence; - -import java.io.BufferedInputStream; -import java.io.BufferedOutputStream; -import java.io.EOFException; -import java.io.File; -import java.io.FileInputStream; -import java.io.FileOutputStream; -import java.io.FilterInputStream; -import java.io.IOException; -import java.io.InputStream; -import java.io.RandomAccessFile; -import java.nio.ByteBuffer; -import java.util.ArrayList; -import java.util.LinkedList; -import java.util.List; -import java.util.concurrent.TimeUnit; -import java.util.zip.Adler32; -import java.util.zip.Checksum; - -import org.apache.jute.BinaryInputArchive; -import org.apache.jute.BinaryOutputArchive; -import org.apache.jute.InputArchive; -import org.apache.jute.OutputArchive; -import org.apache.jute.Record; -import org.apache.zookeeper.server.util.SerializeUtils; -import org.apache.zookeeper.txn.TxnHeader; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -/** - * This class implements the TxnLog interface. It provides api's - * to access the txnlogs and add entries to it. - *

        - * The format of a Transactional log is as follows: - *

        - * LogFile:
        - *     FileHeader TxnList ZeroPad
        - * 
        - * FileHeader: {
        - *     magic 4bytes (ZKLG)
        - *     version 4bytes
        - *     dbid 8bytes
        - *   }
        - * 
        - * TxnList:
        - *     Txn || Txn TxnList
        - *     
        - * Txn:
        - *     checksum Txnlen TxnHeader Record 0x42
        - * 
        - * checksum: 8bytes Adler32 is currently used
        - *   calculated across payload -- Txnlen, TxnHeader, Record and 0x42
        - * 
        - * Txnlen:
        - *     len 4bytes
        - * 
        - * TxnHeader: {
        - *     sessionid 8bytes
        - *     cxid 4bytes
        - *     zxid 8bytes
        - *     time 8bytes
        - *     type 4bytes
        - *   }
        - *     
        - * Record:
        - *     See Jute definition file for details on the various record types
        - *      
        - * ZeroPad:
        - *     0 padded to EOF (filled during preallocation stage)
        - * 
        - */ -public class FileTxnLog implements TxnLog { - private static final Logger LOG; - - static long preAllocSize = 65536 * 1024; - - public final static int TXNLOG_MAGIC = - ByteBuffer.wrap("ZKLG".getBytes()).getInt(); - - public final static int VERSION = 2; - - /** Maximum time we allow for elapsed fsync before WARNing */ - private final static long fsyncWarningThresholdMS; - - static { - LOG = LoggerFactory.getLogger(FileTxnLog.class); - - String size = System.getProperty("zookeeper.preAllocSize"); - if (size != null) { - try { - preAllocSize = Long.parseLong(size) * 1024; - } catch (NumberFormatException e) { - LOG.warn(size + " is not a valid value for preAllocSize"); - } - } - fsyncWarningThresholdMS = Long.getLong("fsync.warningthresholdms", 1000); - } - - long lastZxidSeen; - volatile BufferedOutputStream logStream = null; - volatile OutputArchive oa; - volatile FileOutputStream fos = null; - - File logDir; - private final boolean forceSync = !System.getProperty("zookeeper.forceSync", "yes").equals("no");; - long dbId; - private LinkedList streamsToFlush = - new LinkedList(); - long currentSize; - File logFileWrite = null; - - /** - * constructor for FileTxnLog. Take the directory - * where the txnlogs are stored - * @param logDir the directory where the txnlogs are stored - */ - public FileTxnLog(File logDir) { - this.logDir = logDir; - } - - /** - * method to allow setting preallocate size - * of log file to pad the file. - * @param size the size to set to in bytes - */ - public static void setPreallocSize(long size) { - preAllocSize = size; - } - - /** - * creates a checksum alogrithm to be used - * @return the checksum used for this txnlog - */ - protected Checksum makeChecksumAlgorithm(){ - return new Adler32(); - } - - - /** - * rollover the current log file to a new one. - * @throws IOException - */ - public synchronized void rollLog() throws IOException { - if (logStream != null) { - this.logStream.flush(); - this.logStream = null; - oa = null; - } - } - - /** - * close all the open file handles - * @throws IOException - */ - public synchronized void close() throws IOException { - if (logStream != null) { - logStream.close(); - } - for (FileOutputStream log : streamsToFlush) { - log.close(); - } - } - - /** - * append an entry to the transaction log - * @param hdr the header of the transaction - * @param txn the transaction part of the entry - * returns true iff something appended, otw false - */ - public synchronized boolean append(TxnHeader hdr, Record txn) - throws IOException - { - if (hdr != null) { - if (hdr.getZxid() <= lastZxidSeen) { - LOG.warn("Current zxid " + hdr.getZxid() - + " is <= " + lastZxidSeen + " for " - + hdr.getType()); - } - if (logStream==null) { - if(LOG.isInfoEnabled()){ - LOG.info("Creating new log file: log." + - Long.toHexString(hdr.getZxid())); - } - - logFileWrite = new File(logDir, ("log." + - Long.toHexString(hdr.getZxid()))); - fos = new FileOutputStream(logFileWrite); - logStream=new BufferedOutputStream(fos); - oa = BinaryOutputArchive.getArchive(logStream); - FileHeader fhdr = new FileHeader(TXNLOG_MAGIC,VERSION, dbId); - fhdr.serialize(oa, "fileheader"); - // Make sure that the magic number is written before padding. - logStream.flush(); - currentSize = fos.getChannel().position(); - streamsToFlush.add(fos); - } - padFile(fos); - byte[] buf = Util.marshallTxnEntry(hdr, txn); - if (buf == null || buf.length == 0) { - throw new IOException("Faulty serialization for header " + - "and txn"); - } - Checksum crc = makeChecksumAlgorithm(); - crc.update(buf, 0, buf.length); - oa.writeLong(crc.getValue(), "txnEntryCRC"); - Util.writeTxnBytes(oa, buf); - - return true; - } - return false; - } - - /** - * pad the current file to increase its size - * @param out the outputstream to be padded - * @throws IOException - */ - private void padFile(FileOutputStream out) throws IOException { - currentSize = Util.padLogFile(out, currentSize, preAllocSize); - } - - /** - * Find the log file that starts at, or just before, the snapshot. Return - * this and all subsequent logs. Results are ordered by zxid of file, - * ascending order. - * @param logDirList array of files - * @param snapshotZxid return files at, or before this zxid - * @return - */ - public static File[] getLogFiles(File[] logDirList,long snapshotZxid) { - List files = Util.sortDataDir(logDirList, "log", true); - long logZxid = 0; - // Find the log file that starts before or at the same time as the - // zxid of the snapshot - for (File f : files) { - long fzxid = Util.getZxidFromName(f.getName(), "log"); - if (fzxid > snapshotZxid) { - continue; - } - // the files - // are sorted with zxid's - if (fzxid > logZxid) { - logZxid = fzxid; - } - } - List v=new ArrayList(5); - for (File f : files) { - long fzxid = Util.getZxidFromName(f.getName(), "log"); - if (fzxid < logZxid) { - continue; - } - v.add(f); - } - return v.toArray(new File[0]); - - } - - /** - * get the last zxid that was logged in the transaction logs - * @return the last zxid logged in the transaction logs - */ - public long getLastLoggedZxid() { - File[] files = getLogFiles(logDir.listFiles(), 0); - long maxLog=files.length>0? - Util.getZxidFromName(files[files.length-1].getName(),"log"):-1; - - // if a log file is more recent we must scan it to find - // the highest zxid - long zxid = maxLog; - TxnIterator itr = null; - try { - FileTxnLog txn = new FileTxnLog(logDir); - itr = txn.read(maxLog); - while (true) { - if(!itr.next()) - break; - TxnHeader hdr = itr.getHeader(); - zxid = hdr.getZxid(); - } - } catch (IOException e) { - LOG.warn("Unexpected exception", e); - } finally { - close(itr); - } - return zxid; - } - - private void close(TxnIterator itr) { - if (itr != null) { - try { - itr.close(); - } catch (IOException ioe) { - LOG.warn("Error closing file iterator", ioe); - } - } - } - - /** - * commit the logs. make sure that evertyhing hits the - * disk - */ - public synchronized void commit() throws IOException { - if (logStream != null) { - logStream.flush(); - } - for (FileOutputStream log : streamsToFlush) { - log.flush(); - if (forceSync) { - long startSyncNS = System.nanoTime(); - - log.getChannel().force(false); - - long syncElapsedMS = - TimeUnit.NANOSECONDS.toMillis(System.nanoTime() - startSyncNS); - if (syncElapsedMS > fsyncWarningThresholdMS) { - LOG.warn("fsync-ing the write ahead log in " - + Thread.currentThread().getName() - + " took " + syncElapsedMS - + "ms which will adversely effect operation latency. " - + "See the ZooKeeper troubleshooting guide"); - } - } - } - while (streamsToFlush.size() > 1) { - streamsToFlush.removeFirst().close(); - } - } - - /** - * start reading all the transactions from the given zxid - * @param zxid the zxid to start reading transactions from - * @return returns an iterator to iterate through the transaction - * logs - */ - public TxnIterator read(long zxid) throws IOException { - return new FileTxnIterator(logDir, zxid); - } - - /** - * truncate the current transaction logs - * @param zxid the zxid to truncate the logs to - * @return true if successful false if not - */ - public boolean truncate(long zxid) throws IOException { - FileTxnIterator itr = null; - try { - itr = new FileTxnIterator(this.logDir, zxid); - PositionInputStream input = itr.inputStream; - long pos = input.getPosition(); - // now, truncate at the current position - RandomAccessFile raf = new RandomAccessFile(itr.logFile, "rw"); - raf.setLength(pos); - raf.close(); - while (itr.goToNextLog()) { - if (!itr.logFile.delete()) { - LOG.warn("Unable to truncate {}", itr.logFile); - } - } - } finally { - close(itr); - } - return true; - } - - /** - * read the header of the transaction file - * @param file the transaction file to read - * @return header that was read fomr the file - * @throws IOException - */ - private static FileHeader readHeader(File file) throws IOException { - InputStream is =null; - try { - is = new BufferedInputStream(new FileInputStream(file)); - InputArchive ia=BinaryInputArchive.getArchive(is); - FileHeader hdr = new FileHeader(); - hdr.deserialize(ia, "fileheader"); - return hdr; - } finally { - try { - if (is != null) is.close(); - } catch (IOException e) { - LOG.warn("Ignoring exception during close", e); - } - } - } - - /** - * the dbid of this transaction database - * @return the dbid of this database - */ - public long getDbId() throws IOException { - FileTxnIterator itr = new FileTxnIterator(logDir, 0); - FileHeader fh=readHeader(itr.logFile); - itr.close(); - if(fh==null) - throw new IOException("Unsupported Format."); - return fh.getDbid(); - } - - /** - * the forceSync value. true if forceSync is enabled, false otherwise. - * @return the forceSync value - */ - public boolean isForceSync() { - return forceSync; - } - - /** - * a class that keeps track of the position - * in the input stream. The position points to offset - * that has been consumed by the applications. It can - * wrap buffered input streams to provide the right offset - * for the application. - */ - static class PositionInputStream extends FilterInputStream { - long position; - protected PositionInputStream(InputStream in) { - super(in); - position = 0; - } - - @Override - public int read() throws IOException { - int rc = super.read(); - if (rc > -1) { - position++; - } - return rc; - } - - public int read(byte[] b) throws IOException { - int rc = super.read(b); - if (rc > 0) { - position += rc; - } - return rc; - } - - @Override - public int read(byte[] b, int off, int len) throws IOException { - int rc = super.read(b, off, len); - if (rc > 0) { - position += rc; - } - return rc; - } - - @Override - public long skip(long n) throws IOException { - long rc = super.skip(n); - if (rc > 0) { - position += rc; - } - return rc; - } - public long getPosition() { - return position; - } - - @Override - public boolean markSupported() { - return false; - } - - @Override - public void mark(int readLimit) { - throw new UnsupportedOperationException("mark"); - } - - @Override - public void reset() { - throw new UnsupportedOperationException("reset"); - } - } - - /** - * this class implements the txnlog iterator interface - * which is used for reading the transaction logs - */ - public static class FileTxnIterator implements TxnLog.TxnIterator { - File logDir; - long zxid; - TxnHeader hdr; - Record record; - File logFile; - InputArchive ia; - static final String CRC_ERROR="CRC check failed"; - - PositionInputStream inputStream=null; - //stored files is the list of files greater than - //the zxid we are looking for. - private ArrayList storedFiles; - - /** - * create an iterator over a transaction database directory - * @param logDir the transaction database directory - * @param zxid the zxid to start reading from - * @throws IOException - */ - public FileTxnIterator(File logDir, long zxid) throws IOException { - this.logDir = logDir; - this.zxid = zxid; - init(); - } - - /** - * initialize to the zxid specified - * this is inclusive of the zxid - * @throws IOException - */ - void init() throws IOException { - storedFiles = new ArrayList(); - List files = Util.sortDataDir(FileTxnLog.getLogFiles(logDir.listFiles(), 0), "log", false); - for (File f: files) { - if (Util.getZxidFromName(f.getName(), "log") >= zxid) { - storedFiles.add(f); - } - // add the last logfile that is less than the zxid - else if (Util.getZxidFromName(f.getName(), "log") < zxid) { - storedFiles.add(f); - break; - } - } - goToNextLog(); - if (!next()) - return; - while (hdr.getZxid() < zxid) { - if (!next()) - return; - } - } - - /** - * go to the next logfile - * @return true if there is one and false if there is no - * new file to be read - * @throws IOException - */ - private boolean goToNextLog() throws IOException { - if (storedFiles.size() > 0) { - this.logFile = storedFiles.remove(storedFiles.size()-1); - ia = createInputArchive(this.logFile); - return true; - } - return false; - } - - /** - * read the header from the inputarchive - * @param ia the inputarchive to be read from - * @param is the inputstream - * @throws IOException - */ - protected void inStreamCreated(InputArchive ia, InputStream is) - throws IOException{ - FileHeader header= new FileHeader(); - header.deserialize(ia, "fileheader"); - if (header.getMagic() != FileTxnLog.TXNLOG_MAGIC) { - throw new IOException("Transaction log: " + this.logFile + " has invalid magic number " - + header.getMagic() - + " != " + FileTxnLog.TXNLOG_MAGIC); - } - } - - /** - * Invoked to indicate that the input stream has been created. - * @param ia input archive - * @param is file input stream associated with the input archive. - * @throws IOException - **/ - protected InputArchive createInputArchive(File logFile) throws IOException { - if(inputStream==null){ - inputStream= new PositionInputStream(new BufferedInputStream(new FileInputStream(logFile))); - LOG.debug("Created new input stream " + logFile); - ia = BinaryInputArchive.getArchive(inputStream); - inStreamCreated(ia,inputStream); - LOG.debug("Created new input archive " + logFile); - } - return ia; - } - - /** - * create a checksum algorithm - * @return the checksum algorithm - */ - protected Checksum makeChecksumAlgorithm(){ - return new Adler32(); - } - - /** - * the iterator that moves to the next transaction - * @return true if there is more transactions to be read - * false if not. - */ - public boolean next() throws IOException { - if (ia == null) { - return false; - } - try { - long crcValue = ia.readLong("crcvalue"); - byte[] bytes = Util.readTxnBytes(ia); - // Since we preallocate, we define EOF to be an - if (bytes == null || bytes.length==0) { - throw new EOFException("Failed to read " + logFile); - } - // EOF or corrupted record - // validate CRC - Checksum crc = makeChecksumAlgorithm(); - crc.update(bytes, 0, bytes.length); - if (crcValue != crc.getValue()) - throw new IOException(CRC_ERROR); - if (bytes == null || bytes.length == 0) - return false; - hdr = new TxnHeader(); - record = SerializeUtils.deserializeTxn(bytes, hdr); - } catch (EOFException e) { - LOG.debug("EOF excepton " + e); - inputStream.close(); - inputStream = null; - ia = null; - hdr = null; - // this means that the file has ended - // we should go to the next file - if (!goToNextLog()) { - return false; - } - // if we went to the next log file, we should call next() again - return next(); - } catch (IOException e) { - inputStream.close(); - throw e; - } - return true; - } - - /** - * reutrn the current header - * @return the current header that - * is read - */ - public TxnHeader getHeader() { - return hdr; - } - - /** - * return the current transaction - * @return the current transaction - * that is read - */ - public Record getTxn() { - return record; - } - - /** - * close the iterator - * and release the resources. - */ - public void close() throws IOException { - if (inputStream != null) { - inputStream.close(); - } - } - } - -} diff --git a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/persistence/FileTxnSnapLog.java b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/persistence/FileTxnSnapLog.java deleted file mode 100644 index 6f0df515f..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/persistence/FileTxnSnapLog.java +++ /dev/null @@ -1,341 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you 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. - */ - -package org.apache.zookeeper.server.persistence; - -import java.io.File; -import java.io.IOException; -import java.util.List; -import java.util.Map; -import java.util.concurrent.ConcurrentHashMap; - -import org.apache.jute.Record; -import org.apache.zookeeper.KeeperException; -import org.apache.zookeeper.KeeperException.Code; -import org.apache.zookeeper.ZooDefs.OpCode; -import org.apache.zookeeper.server.DataTree; -import org.apache.zookeeper.server.DataTree.ProcessTxnResult; -import org.apache.zookeeper.server.Request; -import org.apache.zookeeper.server.ZooTrace; -import org.apache.zookeeper.server.persistence.TxnLog.TxnIterator; -import org.apache.zookeeper.txn.CreateSessionTxn; -import org.apache.zookeeper.txn.TxnHeader; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -/** - * This is a helper class - * above the implementations - * of txnlog and snapshot - * classes - */ -public class FileTxnSnapLog { - //the direcotry containing the - //the transaction logs - private final File dataDir; - //the directory containing the - //the snapshot directory - private final File snapDir; - private TxnLog txnLog; - private SnapShot snapLog; - public final static int VERSION = 2; - public final static String version = "version-"; - - private static final Logger LOG = LoggerFactory.getLogger(FileTxnSnapLog.class); - - /** - * This listener helps - * the external apis calling - * restore to gather information - * while the data is being - * restored. - */ - public interface PlayBackListener { - void onTxnLoaded(TxnHeader hdr, Record rec); - } - - /** - * the constructor which takes the datadir and - * snapdir. - * @param dataDir the trasaction directory - * @param snapDir the snapshot directory - */ - public FileTxnSnapLog(File dataDir, File snapDir) throws IOException { - LOG.debug("Opening datadir:{} snapDir:{}", dataDir, snapDir); - - this.dataDir = new File(dataDir, version + VERSION); - this.snapDir = new File(snapDir, version + VERSION); - if (!this.dataDir.exists()) { - if (!this.dataDir.mkdirs()) { - throw new IOException("Unable to create data directory " - + this.dataDir); - } - } - if (!this.snapDir.exists()) { - if (!this.snapDir.mkdirs()) { - throw new IOException("Unable to create snap directory " - + this.snapDir); - } - } - txnLog = new FileTxnLog(this.dataDir); - snapLog = new FileSnap(this.snapDir); - } - - /** - * get the datadir used by this filetxn - * snap log - * @return the data dir - */ - public File getDataDir() { - return this.dataDir; - } - - /** - * get the snap dir used by this - * filetxn snap log - * @return the snap dir - */ - public File getSnapDir() { - return this.snapDir; - } - - /** - * this function restores the server - * database after reading from the - * snapshots and transaction logs - * @param dt the datatree to be restored - * @param sessions the sessions to be restored - * @param listener the playback listener to run on the - * database restoration - * @return the highest zxid restored - * @throws IOException - */ - public long restore(DataTree dt, Map sessions, - PlayBackListener listener) throws IOException { - snapLog.deserialize(dt, sessions); - FileTxnLog txnLog = new FileTxnLog(dataDir); - TxnIterator itr = txnLog.read(dt.lastProcessedZxid+1); - long highestZxid = dt.lastProcessedZxid; - TxnHeader hdr; - try { - while (true) { - // iterator points to - // the first valid txn when initialized - hdr = itr.getHeader(); - if (hdr == null) { - //empty logs - return dt.lastProcessedZxid; - } - if (hdr.getZxid() < highestZxid && highestZxid != 0) { - LOG.error("{}(higestZxid) > {}(next log) for type {}", - new Object[] { highestZxid, hdr.getZxid(), - hdr.getType() }); - } else { - highestZxid = hdr.getZxid(); - } - try { - processTransaction(hdr,dt,sessions, itr.getTxn()); - } catch(KeeperException.NoNodeException e) { - throw new IOException("Failed to process transaction type: " + - hdr.getType() + " error: " + e.getMessage(), e); - } - listener.onTxnLoaded(hdr, itr.getTxn()); - if (!itr.next()) - break; - } - } finally { - if (itr != null) { - itr.close(); - } - } - return highestZxid; - } - - /** - * process the transaction on the datatree - * @param hdr the hdr of the transaction - * @param dt the datatree to apply transaction to - * @param sessions the sessions to be restored - * @param txn the transaction to be applied - */ - public void processTransaction(TxnHeader hdr,DataTree dt, - Map sessions, Record txn) - throws KeeperException.NoNodeException { - ProcessTxnResult rc; - switch (hdr.getType()) { - case OpCode.createSession: - sessions.put(hdr.getClientId(), - ((CreateSessionTxn) txn).getTimeOut()); - if (LOG.isTraceEnabled()) { - ZooTrace.logTraceMessage(LOG,ZooTrace.SESSION_TRACE_MASK, - "playLog --- create session in log: 0x" - + Long.toHexString(hdr.getClientId()) - + " with timeout: " - + ((CreateSessionTxn) txn).getTimeOut()); - } - // give dataTree a chance to sync its lastProcessedZxid - rc = dt.processTxn(hdr, txn); - break; - case OpCode.closeSession: - sessions.remove(hdr.getClientId()); - if (LOG.isTraceEnabled()) { - ZooTrace.logTraceMessage(LOG,ZooTrace.SESSION_TRACE_MASK, - "playLog --- close session in log: 0x" - + Long.toHexString(hdr.getClientId())); - } - rc = dt.processTxn(hdr, txn); - break; - default: - rc = dt.processTxn(hdr, txn); - } - - /** - * Snapshots are lazily created. So when a snapshot is in progress, - * there is a chance for later transactions to make into the - * snapshot. Then when the snapshot is restored, NONODE/NODEEXISTS - * errors could occur. It should be safe to ignore these. - */ - if (rc.err != Code.OK.intValue()) { - LOG.debug("Ignoring processTxn failure hdr:" + hdr.getType() - + ", error: " + rc.err + ", path: " + rc.path); - } - } - - /** - * the last logged zxid on the transaction logs - * @return the last logged zxid - */ - public long getLastLoggedZxid() { - FileTxnLog txnLog = new FileTxnLog(dataDir); - return txnLog.getLastLoggedZxid(); - } - - /** - * save the datatree and the sessions into a snapshot - * @param dataTree the datatree to be serialized onto disk - * @param sessionsWithTimeouts the sesssion timeouts to be - * serialized onto disk - * @throws IOException - */ - public void save(DataTree dataTree, - ConcurrentHashMap sessionsWithTimeouts) - throws IOException { - long lastZxid = dataTree.lastProcessedZxid; - File snapshotFile = new File(snapDir, Util.makeSnapshotName(lastZxid)); - LOG.info("Snapshotting: 0x{} to {}", Long.toHexString(lastZxid), - snapshotFile); - snapLog.serialize(dataTree, sessionsWithTimeouts, snapshotFile); - - } - - /** - * truncate the transaction logs the zxid - * specified - * @param zxid the zxid to truncate the logs to - * @return true if able to truncate the log, false if not - * @throws IOException - */ - public boolean truncateLog(long zxid) throws IOException { - // close the existing txnLog and snapLog - close(); - - // truncate it - FileTxnLog truncLog = new FileTxnLog(dataDir); - boolean truncated = truncLog.truncate(zxid); - truncLog.close(); - - // re-open the txnLog and snapLog - // I'd rather just close/reopen this object itself, however that - // would have a big impact outside ZKDatabase as there are other - // objects holding a reference to this object. - txnLog = new FileTxnLog(dataDir); - snapLog = new FileSnap(snapDir); - - return truncated; - } - - /** - * the most recent snapshot in the snapshot - * directory - * @return the file that contains the most - * recent snapshot - * @throws IOException - */ - public File findMostRecentSnapshot() throws IOException { - FileSnap snaplog = new FileSnap(snapDir); - return snaplog.findMostRecentSnapshot(); - } - - /** - * the n most recent snapshots - * @param n the number of recent snapshots - * @return the list of n most recent snapshots, with - * the most recent in front - * @throws IOException - */ - public List findNRecentSnapshots(int n) throws IOException { - FileSnap snaplog = new FileSnap(snapDir); - return snaplog.findNRecentSnapshots(n); - } - - /** - * get the snapshot logs that are greater than - * the given zxid - * @param zxid the zxid that contains logs greater than - * zxid - * @return - */ - public File[] getSnapshotLogs(long zxid) { - return FileTxnLog.getLogFiles(dataDir.listFiles(), zxid); - } - - /** - * append the request to the transaction logs - * @param si the request to be appended - * returns true iff something appended, otw false - * @throws IOException - */ - public boolean append(Request si) throws IOException { - return txnLog.append(si.hdr, si.txn); - } - - /** - * commit the transaction of logs - * @throws IOException - */ - public void commit() throws IOException { - txnLog.commit(); - } - - /** - * roll the transaction logs - * @throws IOException - */ - public void rollLog() throws IOException { - txnLog.rollLog(); - } - - /** - * close the transaction log files - * @throws IOException - */ - public void close() throws IOException { - txnLog.close(); - snapLog.close(); - } -} diff --git a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/persistence/SnapShot.java b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/persistence/SnapShot.java deleted file mode 100644 index c964afc6d..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/persistence/SnapShot.java +++ /dev/null @@ -1,66 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you 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. - */ - -package org.apache.zookeeper.server.persistence; -import java.io.File; -import java.io.IOException; -import java.util.Map; - -import org.apache.zookeeper.server.DataTree; - -/** - * snapshot interface for the persistence layer. - * implement this interface for implementing - * snapshots. - */ -public interface SnapShot { - - /** - * deserialize a data tree from the last valid snapshot and - * return the last zxid that was deserialized - * @param dt the datatree to be deserialized into - * @param sessions the sessions to be deserialized into - * @return the last zxid that was deserialized from the snapshot - * @throws IOException - */ - long deserialize(DataTree dt, Map sessions) - throws IOException; - - /** - * persist the datatree and the sessions into a persistence storage - * @param dt the datatree to be serialized - * @param sessions - * @throws IOException - */ - void serialize(DataTree dt, Map sessions, - File name) - throws IOException; - - /** - * find the most recent snapshot file - * @return the most recent snapshot file - * @throws IOException - */ - File findMostRecentSnapshot() throws IOException; - - /** - * free resources from this snapshot immediately - * @throws IOException - */ - void close() throws IOException; -} diff --git a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/persistence/TxnLog.java b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/persistence/TxnLog.java deleted file mode 100644 index d52dfb796..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/persistence/TxnLog.java +++ /dev/null @@ -1,121 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you 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. - */ - -package org.apache.zookeeper.server.persistence; - -import java.io.IOException; - -import org.apache.jute.Record; -import org.apache.zookeeper.txn.TxnHeader; - -/** - * Interface for reading transaction logs. - * - */ -public interface TxnLog { - - /** - * roll the current - * log being appended to - * @throws IOException - */ - void rollLog() throws IOException; - /** - * Append a request to the transaction log - * @param hdr the transaction header - * @param r the transaction itself - * returns true iff something appended, otw false - * @throws IOException - */ - boolean append(TxnHeader hdr, Record r) throws IOException; - - /** - * Start reading the transaction logs - * from a given zxid - * @param zxid - * @return returns an iterator to read the - * next transaction in the logs. - * @throws IOException - */ - TxnIterator read(long zxid) throws IOException; - - /** - * the last zxid of the logged transactions. - * @return the last zxid of the logged transactions. - * @throws IOException - */ - long getLastLoggedZxid() throws IOException; - - /** - * truncate the log to get in sync with the - * leader. - * @param zxid the zxid to truncate at. - * @throws IOException - */ - boolean truncate(long zxid) throws IOException; - - /** - * the dbid for this transaction log. - * @return the dbid for this transaction log. - * @throws IOException - */ - long getDbId() throws IOException; - - /** - * commmit the trasaction and make sure - * they are persisted - * @throws IOException - */ - void commit() throws IOException; - - /** - * close the transactions logs - */ - void close() throws IOException; - /** - * an iterating interface for reading - * transaction logs. - */ - public interface TxnIterator { - /** - * return the transaction header. - * @return return the transaction header. - */ - TxnHeader getHeader(); - - /** - * return the transaction record. - * @return return the transaction record. - */ - Record getTxn(); - - /** - * go to the next transaction record. - * @throws IOException - */ - boolean next() throws IOException; - - /** - * close files and release the - * resources - * @throws IOException - */ - void close() throws IOException; - } -} - diff --git a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/persistence/Util.java b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/persistence/Util.java deleted file mode 100644 index 7ef7f9c41..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/persistence/Util.java +++ /dev/null @@ -1,326 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you 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. - */ - -package org.apache.zookeeper.server.persistence; - -import java.io.ByteArrayOutputStream; -import java.io.EOFException; -import java.io.File; -import java.io.FileOutputStream; -import java.io.IOException; -import java.io.RandomAccessFile; -import java.io.Serializable; -import java.net.URI; -import java.nio.ByteBuffer; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collections; -import java.util.Comparator; -import java.util.List; -import java.util.Properties; - -import org.apache.jute.BinaryOutputArchive; -import org.apache.jute.InputArchive; -import org.apache.jute.OutputArchive; -import org.apache.jute.Record; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.apache.zookeeper.txn.TxnHeader; - -/** - * A collection of utility methods for dealing with file name parsing, - * low level I/O file operations and marshalling/unmarshalling. - */ -public class Util { - private static final Logger LOG = LoggerFactory.getLogger(Util.class); - private static final String SNAP_DIR="snapDir"; - private static final String LOG_DIR="logDir"; - private static final String DB_FORMAT_CONV="dbFormatConversion"; - private static final ByteBuffer fill = ByteBuffer.allocateDirect(1); - - public static String makeURIString(String dataDir, String dataLogDir, - String convPolicy){ - String uri="file:"+SNAP_DIR+"="+dataDir+";"+LOG_DIR+"="+dataLogDir; - if(convPolicy!=null) - uri+=";"+DB_FORMAT_CONV+"="+convPolicy; - return uri.replace('\\', '/'); - } - /** - * Given two directory files the method returns a well-formed - * logfile provider URI. This method is for backward compatibility with the - * existing code that only supports logfile persistence and expects these two - * parameters passed either on the command-line or in the configuration file. - * - * @param dataDir snapshot directory - * @param dataLogDir transaction log directory - * @return logfile provider URI - */ - public static URI makeFileLoggerURL(File dataDir, File dataLogDir){ - return URI.create(makeURIString(dataDir.getPath(),dataLogDir.getPath(),null)); - } - - public static URI makeFileLoggerURL(File dataDir, File dataLogDir,String convPolicy){ - return URI.create(makeURIString(dataDir.getPath(),dataLogDir.getPath(),convPolicy)); - } - - /** - * Creates a valid transaction log file name. - * - * @param zxid used as a file name suffix (extention) - * @return file name - */ - public static String makeLogName(long zxid) { - return "log." + Long.toHexString(zxid); - } - - /** - * Creates a snapshot file name. - * - * @param zxid used as a suffix - * @return file name - */ - public static String makeSnapshotName(long zxid) { - return "snapshot." + Long.toHexString(zxid); - } - - /** - * Extracts snapshot directory property value from the container. - * - * @param props properties container - * @return file representing the snapshot directory - */ - public static File getSnapDir(Properties props){ - return new File(props.getProperty(SNAP_DIR)); - } - - /** - * Extracts transaction log directory property value from the container. - * - * @param props properties container - * @return file representing the txn log directory - */ - public static File getLogDir(Properties props){ - return new File(props.getProperty(LOG_DIR)); - } - - /** - * Extracts the value of the dbFormatConversion attribute. - * - * @param props properties container - * @return value of the dbFormatConversion attribute - */ - public static String getFormatConversionPolicy(Properties props){ - return props.getProperty(DB_FORMAT_CONV); - } - - /** - * Extracts zxid from the file name. The file name should have been created - * using one of the {@link makeLogName} or {@link makeSnapshotName}. - * - * @param name the file name to parse - * @param prefix the file name prefix (snapshot or log) - * @return zxid - */ - public static long getZxidFromName(String name, String prefix) { - long zxid = -1; - String nameParts[] = name.split("\\."); - if (nameParts.length == 2 && nameParts[0].equals(prefix)) { - try { - zxid = Long.parseLong(nameParts[1], 16); - } catch (NumberFormatException e) { - } - } - return zxid; - } - - /** - * Verifies that the file is a valid snapshot. Snapshot may be invalid if - * it's incomplete as in a situation when the server dies while in the process - * of storing a snapshot. Any file that is not a snapshot is also - * an invalid snapshot. - * - * @param f file to verify - * @return true if the snapshot is valid - * @throws IOException - */ - public static boolean isValidSnapshot(File f) throws IOException { - if (f==null || Util.getZxidFromName(f.getName(), "snapshot") == -1) - return false; - - // Check for a valid snapshot - RandomAccessFile raf = new RandomAccessFile(f, "r"); - try { - // including the header and the last / bytes - // the snapshot should be atleast 10 bytes - if (raf.length() < 10) { - return false; - } - raf.seek(raf.length() - 5); - byte bytes[] = new byte[5]; - int readlen = 0; - int l; - while(readlen < 5 && - (l = raf.read(bytes, readlen, bytes.length - readlen)) >= 0) { - readlen += l; - } - if (readlen != bytes.length) { - LOG.info("Invalid snapshot " + f - + " too short, len = " + readlen); - return false; - } - ByteBuffer bb = ByteBuffer.wrap(bytes); - int len = bb.getInt(); - byte b = bb.get(); - if (len != 1 || b != '/') { - LOG.info("Invalid snapshot " + f + " len = " + len - + " byte = " + (b & 0xff)); - return false; - } - } finally { - raf.close(); - } - - return true; - } - - /** - * Grows the file to the specified number of bytes. This only happenes if - * the current file position is sufficiently close (less than 4K) to end of - * file. - * - * @param f output stream to pad - * @param currentSize application keeps track of the cuurent file size - * @param preAllocSize how many bytes to pad - * @return the new file size. It can be the same as currentSize if no - * padding was done. - * @throws IOException - */ - public static long padLogFile(FileOutputStream f,long currentSize, - long preAllocSize) throws IOException{ - long position = f.getChannel().position(); - if (position + 4096 >= currentSize) { - currentSize = currentSize + preAllocSize; - fill.position(0); - f.getChannel().write(fill, currentSize-fill.remaining()); - } - return currentSize; - } - - /** - * Reads a transaction entry from the input archive. - * @param ia archive to read from - * @return null if the entry is corrupted or EOF has been reached; a buffer - * (possible empty) containing serialized transaction record. - * @throws IOException - */ - public static byte[] readTxnBytes(InputArchive ia) throws IOException { - try{ - byte[] bytes = ia.readBuffer("txtEntry"); - // Since we preallocate, we define EOF to be an - // empty transaction - if (bytes.length == 0) - return bytes; - if (ia.readByte("EOF") != 'B') { - LOG.error("Last transaction was partial."); - return null; - } - return bytes; - }catch(EOFException e){} - return null; - } - - - /** - * Serializes transaction header and transaction data into a byte buffer. - * - * @param hdr transaction header - * @param txn transaction data - * @return serialized transaction record - * @throws IOException - */ - public static byte[] marshallTxnEntry(TxnHeader hdr, Record txn) - throws IOException { - ByteArrayOutputStream baos = new ByteArrayOutputStream(); - OutputArchive boa = BinaryOutputArchive.getArchive(baos); - - hdr.serialize(boa, "hdr"); - if (txn != null) { - txn.serialize(boa, "txn"); - } - return baos.toByteArray(); - } - - /** - * Write the serialized transaction record to the output archive. - * - * @param oa output archive - * @param bytes serialized trasnaction record - * @throws IOException - */ - public static void writeTxnBytes(OutputArchive oa, byte[] bytes) - throws IOException { - oa.writeBuffer(bytes, "txnEntry"); - oa.writeByte((byte) 0x42, "EOR"); // 'B' - } - - - /** - * Compare file file names of form "prefix.version". Sort order result - * returned in order of version. - */ - private static class DataDirFileComparator - implements Comparator, Serializable - { - private static final long serialVersionUID = -2648639884525140318L; - - private String prefix; - private boolean ascending; - public DataDirFileComparator(String prefix, boolean ascending) { - this.prefix = prefix; - this.ascending = ascending; - } - - public int compare(File o1, File o2) { - long z1 = Util.getZxidFromName(o1.getName(), prefix); - long z2 = Util.getZxidFromName(o2.getName(), prefix); - int result = z1 < z2 ? -1 : (z1 > z2 ? 1 : 0); - return ascending ? result : -result; - } - } - - /** - * Sort the list of files. Recency as determined by the version component - * of the file name. - * - * @param files array of files - * @param prefix files not matching this prefix are assumed to have a - * version = -1) - * @param ascending true sorted in ascending order, false results in - * descending order - * @return sorted input files - */ - public static List sortDataDir(File[] files, String prefix, boolean ascending) - { - if(files==null) - return new ArrayList(0); - List filelist = Arrays.asList(files); - Collections.sort(filelist, new DataDirFileComparator(prefix, ascending)); - return filelist; - } - -} diff --git a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/quorum/AckRequestProcessor.java b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/quorum/AckRequestProcessor.java deleted file mode 100644 index 8e7e472e1..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/quorum/AckRequestProcessor.java +++ /dev/null @@ -1,54 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you 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. - */ - -package org.apache.zookeeper.server.quorum; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import org.apache.zookeeper.server.Request; -import org.apache.zookeeper.server.RequestProcessor; - - -/** - * This is a very simple RequestProcessor that simply forwards a request from a - * previous stage to the leader as an ACK. - */ -class AckRequestProcessor implements RequestProcessor { - private static final Logger LOG = LoggerFactory.getLogger(AckRequestProcessor.class); - Leader leader; - - AckRequestProcessor(Leader leader) { - this.leader = leader; - } - - /** - * Forward the request as an ACK to the leader - */ - public void processRequest(Request request) { - QuorumPeer self = leader.self; - if(self != null) - leader.processAck(self.getId(), request.zxid, null); - else - LOG.error("Null QuorumPeer"); - } - - public void shutdown() { - // XXX No need to do anything - } -} diff --git a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/quorum/AuthFastLeaderElection.java b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/quorum/AuthFastLeaderElection.java deleted file mode 100644 index ad6019a7e..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/quorum/AuthFastLeaderElection.java +++ /dev/null @@ -1,978 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you 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. - */ - -package org.apache.zookeeper.server.quorum; - -import java.io.IOException; -import java.net.DatagramPacket; -import java.net.DatagramSocket; -import java.net.InetSocketAddress; -import java.net.SocketException; -import java.nio.ByteBuffer; -import java.util.Collection; -import java.util.Collections; -import java.util.HashMap; -import java.util.HashSet; -import java.util.Set; -import java.util.concurrent.ConcurrentHashMap; -import java.util.concurrent.LinkedBlockingQueue; -import java.util.concurrent.Semaphore; - -import java.util.concurrent.TimeUnit; -import java.util.Random; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import org.apache.zookeeper.jmx.MBeanRegistry; -import org.apache.zookeeper.server.quorum.Election; -import org.apache.zookeeper.server.quorum.Vote; -import org.apache.zookeeper.server.quorum.QuorumPeer.QuorumServer; -import org.apache.zookeeper.server.quorum.QuorumPeer.ServerState; - -/** - * @deprecated This class has been deprecated as of release 3.4.0. - */ -@Deprecated -public class AuthFastLeaderElection implements Election { - private static final Logger LOG = LoggerFactory.getLogger(AuthFastLeaderElection.class); - - /* Sequence numbers for messages */ - static int sequencer = 0; - static int maxTag = 0; - - /* - * Determine how much time a process has to wait once it believes that it - * has reached the end of leader election. - */ - static int finalizeWait = 100; - - /* - * Challenge counter to avoid replay attacks - */ - - static int challengeCounter = 0; - - /* - * Flag to determine whether to authenticate or not - */ - - private boolean authEnabled = false; - - static public class Notification { - /* - * Proposed leader - */ - long leader; - - /* - * zxid of the proposed leader - */ - long zxid; - - /* - * Epoch - */ - long epoch; - - /* - * current state of sender - */ - QuorumPeer.ServerState state; - - /* - * Address of the sender - */ - InetSocketAddress addr; - } - - /* - * Messages to send, both Notifications and Acks - */ - static public class ToSend { - static enum mType { - crequest, challenge, notification, ack - } - - ToSend(mType type, long tag, long leader, long zxid, long epoch, - ServerState state, InetSocketAddress addr) { - - switch (type) { - case crequest: - this.type = 0; - this.tag = tag; - this.leader = leader; - this.zxid = zxid; - this.epoch = epoch; - this.state = state; - this.addr = addr; - - break; - case challenge: - this.type = 1; - this.tag = tag; - this.leader = leader; - this.zxid = zxid; - this.epoch = epoch; - this.state = state; - this.addr = addr; - - break; - case notification: - this.type = 2; - this.leader = leader; - this.zxid = zxid; - this.epoch = epoch; - this.state = QuorumPeer.ServerState.LOOKING; - this.tag = tag; - this.addr = addr; - - break; - case ack: - this.type = 3; - this.tag = tag; - this.leader = leader; - this.zxid = zxid; - this.epoch = epoch; - this.state = state; - this.addr = addr; - - break; - default: - break; - } - } - - /* - * Message type: 0 notification, 1 acknowledgement - */ - int type; - - /* - * Proposed leader in the case of notification - */ - long leader; - - /* - * id contains the tag for acks, and zxid for notifications - */ - long zxid; - - /* - * Epoch - */ - long epoch; - - /* - * Current state; - */ - QuorumPeer.ServerState state; - - /* - * Message tag - */ - long tag; - - InetSocketAddress addr; - } - - LinkedBlockingQueue sendqueue; - - LinkedBlockingQueue recvqueue; - - private class Messenger { - - final DatagramSocket mySocket; - long lastProposedLeader; - long lastProposedZxid; - long lastEpoch; - final Set ackset; - final ConcurrentHashMap challengeMap; - final ConcurrentHashMap challengeMutex; - final ConcurrentHashMap ackMutex; - final ConcurrentHashMap> addrChallengeMap; - - class WorkerReceiver implements Runnable { - - DatagramSocket mySocket; - Messenger myMsg; - - WorkerReceiver(DatagramSocket s, Messenger msg) { - mySocket = s; - myMsg = msg; - } - - boolean saveChallenge(long tag, long challenge) { - Semaphore s = challengeMutex.get(tag); - if (s != null) { - synchronized (Messenger.this) { - challengeMap.put(tag, challenge); - challengeMutex.remove(tag); - } - - - s.release(); - } else { - LOG.error("No challenge mutex object"); - } - - - return true; - } - - public void run() { - byte responseBytes[] = new byte[48]; - ByteBuffer responseBuffer = ByteBuffer.wrap(responseBytes); - DatagramPacket responsePacket = new DatagramPacket( - responseBytes, responseBytes.length); - while (true) { - // Sleeps on receive - try { - responseBuffer.clear(); - mySocket.receive(responsePacket); - } catch (IOException e) { - LOG.warn("Ignoring exception receiving", e); - } - // Receive new message - if (responsePacket.getLength() != responseBytes.length) { - LOG.warn("Got a short response: " - + responsePacket.getLength() + " " - + responsePacket.toString()); - continue; - } - responseBuffer.clear(); - int type = responseBuffer.getInt(); - if ((type > 3) || (type < 0)) { - LOG.warn("Got bad Msg type: " + type); - continue; - } - long tag = responseBuffer.getLong(); - - QuorumPeer.ServerState ackstate = QuorumPeer.ServerState.LOOKING; - switch (responseBuffer.getInt()) { - case 0: - ackstate = QuorumPeer.ServerState.LOOKING; - break; - case 1: - ackstate = QuorumPeer.ServerState.LEADING; - break; - case 2: - ackstate = QuorumPeer.ServerState.FOLLOWING; - break; - } - - Vote current = self.getCurrentVote(); - - switch (type) { - case 0: - // Receive challenge request - ToSend c = new ToSend(ToSend.mType.challenge, tag, - current.getId(), current.getZxid(), - logicalclock, self.getPeerState(), - (InetSocketAddress) responsePacket - .getSocketAddress()); - sendqueue.offer(c); - break; - case 1: - // Receive challenge and store somewhere else - long challenge = responseBuffer.getLong(); - saveChallenge(tag, challenge); - - break; - case 2: - Notification n = new Notification(); - n.leader = responseBuffer.getLong(); - n.zxid = responseBuffer.getLong(); - n.epoch = responseBuffer.getLong(); - n.state = ackstate; - n.addr = (InetSocketAddress) responsePacket - .getSocketAddress(); - - if ((myMsg.lastEpoch <= n.epoch) - && ((n.zxid > myMsg.lastProposedZxid) - || ((n.zxid == myMsg.lastProposedZxid) - && (n.leader > myMsg.lastProposedLeader)))) { - myMsg.lastProposedZxid = n.zxid; - myMsg.lastProposedLeader = n.leader; - myMsg.lastEpoch = n.epoch; - } - - long recChallenge; - InetSocketAddress addr = (InetSocketAddress) responsePacket - .getSocketAddress(); - if (authEnabled) { - ConcurrentHashMap tmpMap = addrChallengeMap.get(addr); - if(tmpMap != null){ - if (tmpMap.get(tag) != null) { - recChallenge = responseBuffer.getLong(); - - if (tmpMap.get(tag) == recChallenge) { - recvqueue.offer(n); - - ToSend a = new ToSend(ToSend.mType.ack, - tag, current.getId(), - current.getZxid(), - logicalclock, self.getPeerState(), - addr); - - sendqueue.offer(a); - } else { - LOG.warn("Incorrect challenge: " - + recChallenge + ", " - + addrChallengeMap.toString()); - } - } else { - LOG.warn("No challenge for host: " + addr - + " " + tag); - } - } - } else { - recvqueue.offer(n); - - ToSend a = new ToSend(ToSend.mType.ack, tag, - current.getId(), current.getZxid(), - logicalclock, self.getPeerState(), - (InetSocketAddress) responsePacket - .getSocketAddress()); - - sendqueue.offer(a); - } - break; - - // Upon reception of an ack message, remove it from the - // queue - case 3: - Semaphore s = ackMutex.get(tag); - - if(s != null) - s.release(); - else LOG.error("Empty ack semaphore"); - - ackset.add(tag); - - if (authEnabled) { - ConcurrentHashMap tmpMap = addrChallengeMap.get(responsePacket - .getSocketAddress()); - if(tmpMap != null) { - tmpMap.remove(tag); - } else { - LOG.warn("No such address in the ensemble configuration " + responsePacket - .getSocketAddress()); - } - } - - if (ackstate != QuorumPeer.ServerState.LOOKING) { - Notification outofsync = new Notification(); - outofsync.leader = responseBuffer.getLong(); - outofsync.zxid = responseBuffer.getLong(); - outofsync.epoch = responseBuffer.getLong(); - outofsync.state = ackstate; - outofsync.addr = (InetSocketAddress) responsePacket - .getSocketAddress(); - - recvqueue.offer(outofsync); - } - - break; - // Default case - default: - LOG.warn("Received message of incorrect type " + type); - break; - } - } - } - } - - class WorkerSender implements Runnable { - - Random rand; - int maxAttempts; - int ackWait = finalizeWait; - - /* - * Receives a socket and max number of attempts as input - */ - - WorkerSender(int attempts) { - maxAttempts = attempts; - rand = new Random(java.lang.Thread.currentThread().getId() - + System.currentTimeMillis()); - } - - long genChallenge() { - byte buf[] = new byte[8]; - - buf[0] = (byte) ((challengeCounter & 0xff000000) >>> 24); - buf[1] = (byte) ((challengeCounter & 0x00ff0000) >>> 16); - buf[2] = (byte) ((challengeCounter & 0x0000ff00) >>> 8); - buf[3] = (byte) ((challengeCounter & 0x000000ff)); - - challengeCounter++; - int secret = rand.nextInt(java.lang.Integer.MAX_VALUE); - - buf[4] = (byte) ((secret & 0xff000000) >>> 24); - buf[5] = (byte) ((secret & 0x00ff0000) >>> 16); - buf[6] = (byte) ((secret & 0x0000ff00) >>> 8); - buf[7] = (byte) ((secret & 0x000000ff)); - - return (((long)(buf[0] & 0xFF)) << 56) - + (((long)(buf[1] & 0xFF)) << 48) - + (((long)(buf[2] & 0xFF)) << 40) - + (((long)(buf[3] & 0xFF)) << 32) - + (((long)(buf[4] & 0xFF)) << 24) - + (((long)(buf[5] & 0xFF)) << 16) - + (((long)(buf[6] & 0xFF)) << 8) - + ((long)(buf[7] & 0xFF)); - } - - public void run() { - while (true) { - try { - ToSend m = sendqueue.take(); - process(m); - } catch (InterruptedException e) { - break; - } - - } - } - - private void process(ToSend m) { - int attempts = 0; - byte zeroes[]; - byte requestBytes[] = new byte[48]; - DatagramPacket requestPacket = new DatagramPacket(requestBytes, - requestBytes.length); - ByteBuffer requestBuffer = ByteBuffer.wrap(requestBytes); - - switch (m.type) { - case 0: - /* - * Building challenge request packet to send - */ - requestBuffer.clear(); - requestBuffer.putInt(ToSend.mType.crequest.ordinal()); - requestBuffer.putLong(m.tag); - requestBuffer.putInt(m.state.ordinal()); - zeroes = new byte[32]; - requestBuffer.put(zeroes); - - requestPacket.setLength(48); - try { - requestPacket.setSocketAddress(m.addr); - } catch (IllegalArgumentException e) { - // Sun doesn't include the address that causes this - // exception to be thrown, so we wrap the exception - // in order to capture this critical detail. - throw new IllegalArgumentException( - "Unable to set socket address on packet, msg:" - + e.getMessage() + " with addr:" + m.addr, - e); - } - - try { - if (challengeMap.get(m.tag) == null) { - mySocket.send(requestPacket); - } - } catch (IOException e) { - LOG.warn("Exception while sending challenge: ", e); - } - - break; - case 1: - /* - * Building challenge packet to send - */ - - long newChallenge; - ConcurrentHashMap tmpMap = addrChallengeMap.get(m.addr); - if(tmpMap != null){ - Long tmpLong = tmpMap.get(m.tag); - if (tmpLong != null) { - newChallenge = tmpLong; - } else { - newChallenge = genChallenge(); - } - - tmpMap.put(m.tag, newChallenge); - - requestBuffer.clear(); - requestBuffer.putInt(ToSend.mType.challenge.ordinal()); - requestBuffer.putLong(m.tag); - requestBuffer.putInt(m.state.ordinal()); - requestBuffer.putLong(newChallenge); - zeroes = new byte[24]; - requestBuffer.put(zeroes); - - requestPacket.setLength(48); - try { - requestPacket.setSocketAddress(m.addr); - } catch (IllegalArgumentException e) { - // Sun doesn't include the address that causes this - // exception to be thrown, so we wrap the exception - // in order to capture this critical detail. - throw new IllegalArgumentException( - "Unable to set socket address on packet, msg:" - + e.getMessage() + " with addr:" + m.addr, - e); - } - - - try { - mySocket.send(requestPacket); - } catch (IOException e) { - LOG.warn("Exception while sending challenge: ", e); - } - } else { - LOG.error("Address is not in the configuration: " + m.addr); - } - - break; - case 2: - - /* - * Building notification packet to send - */ - - requestBuffer.clear(); - requestBuffer.putInt(m.type); - requestBuffer.putLong(m.tag); - requestBuffer.putInt(m.state.ordinal()); - requestBuffer.putLong(m.leader); - requestBuffer.putLong(m.zxid); - requestBuffer.putLong(m.epoch); - zeroes = new byte[8]; - requestBuffer.put(zeroes); - - requestPacket.setLength(48); - try { - requestPacket.setSocketAddress(m.addr); - } catch (IllegalArgumentException e) { - // Sun doesn't include the address that causes this - // exception to be thrown, so we wrap the exception - // in order to capture this critical detail. - throw new IllegalArgumentException( - "Unable to set socket address on packet, msg:" - + e.getMessage() + " with addr:" + m.addr, - e); - } - - - boolean myChallenge = false; - boolean myAck = false; - - while (attempts < maxAttempts) { - try { - /* - * Try to obtain a challenge only if does not have - * one yet - */ - - if (!myChallenge && authEnabled) { - ToSend crequest = new ToSend( - ToSend.mType.crequest, m.tag, m.leader, - m.zxid, m.epoch, - QuorumPeer.ServerState.LOOKING, m.addr); - sendqueue.offer(crequest); - - try { - double timeout = ackWait - * java.lang.Math.pow(2, attempts); - - Semaphore s = new Semaphore(0); - synchronized(Messenger.this) { - challengeMutex.put(m.tag, s); - s.tryAcquire((long) timeout, TimeUnit.MILLISECONDS); - myChallenge = challengeMap - .containsKey(m.tag); - } - } catch (InterruptedException e) { - LOG.warn("Challenge request exception: ", e); - } - } - - /* - * If don't have challenge yet, skip sending - * notification - */ - - if (authEnabled && !myChallenge) { - attempts++; - continue; - } - - if (authEnabled) { - requestBuffer.position(40); - Long tmpLong = challengeMap.get(m.tag); - if(tmpLong != null){ - requestBuffer.putLong(tmpLong); - } else { - LOG.warn("No challenge with tag: " + m.tag); - } - } - mySocket.send(requestPacket); - try { - Semaphore s = new Semaphore(0); - double timeout = ackWait - * java.lang.Math.pow(10, attempts); - ackMutex.put(m.tag, s); - s.tryAcquire((int) timeout, TimeUnit.MILLISECONDS); - } catch (InterruptedException e) { - LOG.warn("Ack exception: ", e); - } - - if(ackset.remove(m.tag)){ - myAck = true; - } - - } catch (IOException e) { - LOG.warn("Sending exception: ", e); - /* - * Do nothing, just try again - */ - } - if (myAck) { - /* - * Received ack successfully, so return - */ - challengeMap.remove(m.tag); - - return; - } else - attempts++; - } - /* - * Return message to queue for another attempt later if - * epoch hasn't changed. - */ - if (m.epoch == logicalclock) { - challengeMap.remove(m.tag); - sendqueue.offer(m); - } - break; - case 3: - - requestBuffer.clear(); - requestBuffer.putInt(m.type); - requestBuffer.putLong(m.tag); - requestBuffer.putInt(m.state.ordinal()); - requestBuffer.putLong(m.leader); - requestBuffer.putLong(m.zxid); - requestBuffer.putLong(m.epoch); - - requestPacket.setLength(48); - try { - requestPacket.setSocketAddress(m.addr); - } catch (IllegalArgumentException e) { - // Sun doesn't include the address that causes this - // exception to be thrown, so we wrap the exception - // in order to capture this critical detail. - throw new IllegalArgumentException( - "Unable to set socket address on packet, msg:" - + e.getMessage() + " with addr:" + m.addr, - e); - } - - - try { - mySocket.send(requestPacket); - } catch (IOException e) { - LOG.warn("Exception while sending ack: ", e); - } - break; - } - } - } - - public boolean queueEmpty() { - return (sendqueue.isEmpty() || ackset.isEmpty() || recvqueue - .isEmpty()); - } - - Messenger(int threads, DatagramSocket s) { - mySocket = s; - ackset = Collections.newSetFromMap(new ConcurrentHashMap()); - challengeMap = new ConcurrentHashMap(); - challengeMutex = new ConcurrentHashMap(); - ackMutex = new ConcurrentHashMap(); - addrChallengeMap = new ConcurrentHashMap>(); - lastProposedLeader = 0; - lastProposedZxid = 0; - lastEpoch = 0; - - for (int i = 0; i < threads; ++i) { - Thread t = new Thread(new WorkerSender(3), - "WorkerSender Thread: " + (i + 1)); - t.setDaemon(true); - t.start(); - } - - for (QuorumServer server : self.getVotingView().values()) { - InetSocketAddress saddr = new InetSocketAddress(server.addr - .getAddress(), port); - addrChallengeMap.put(saddr, new ConcurrentHashMap()); - } - - Thread t = new Thread(new WorkerReceiver(s, this), - "WorkerReceiver Thread"); - t.start(); - } - - } - - QuorumPeer self; - int port; - volatile long logicalclock; /* Election instance */ - DatagramSocket mySocket; - long proposedLeader; - long proposedZxid; - - public AuthFastLeaderElection(QuorumPeer self, - boolean auth) { - this.authEnabled = auth; - starter(self); - } - - public AuthFastLeaderElection(QuorumPeer self) { - starter(self); - } - - private void starter(QuorumPeer self) { - this.self = self; - port = self.getVotingView().get(self.getId()).electionAddr.getPort(); - proposedLeader = -1; - proposedZxid = -1; - - try { - mySocket = new DatagramSocket(port); - // mySocket.setSoTimeout(20000); - } catch (SocketException e1) { - e1.printStackTrace(); - throw new RuntimeException(); - } - sendqueue = new LinkedBlockingQueue(2 * self.getVotingView().size()); - recvqueue = new LinkedBlockingQueue(2 * self.getVotingView() - .size()); - new Messenger(self.getVotingView().size() * 2, mySocket); - } - - private void leaveInstance() { - logicalclock++; - } - - private void sendNotifications() { - for (QuorumServer server : self.getView().values()) { - - ToSend notmsg = new ToSend(ToSend.mType.notification, - AuthFastLeaderElection.sequencer++, proposedLeader, - proposedZxid, logicalclock, QuorumPeer.ServerState.LOOKING, - self.getView().get(server.id).electionAddr); - - sendqueue.offer(notmsg); - } - } - - private boolean totalOrderPredicate(long id, long zxid) { - if ((zxid > proposedZxid) - || ((zxid == proposedZxid) && (id > proposedLeader))) - return true; - else - return false; - - } - - private boolean termPredicate(HashMap votes, - long l, long zxid) { - - - Collection votesCast = votes.values(); - int count = 0; - /* - * First make the views consistent. Sometimes peers will have different - * zxids for a server depending on timing. - */ - for (Vote v : votesCast) { - if ((v.getId() == l) && (v.getZxid() == zxid)) - count++; - } - - if (count > (self.getVotingView().size() / 2)) - return true; - else - return false; - - } - - /** - * There is nothing to shutdown in this implementation of - * leader election, so we simply have an empty method. - */ - public void shutdown(){} - - /** - * Invoked in QuorumPeer to find or elect a new leader. - * - * @throws InterruptedException - */ - public Vote lookForLeader() throws InterruptedException { - try { - self.jmxLeaderElectionBean = new LeaderElectionBean(); - MBeanRegistry.getInstance().register( - self.jmxLeaderElectionBean, self.jmxLocalPeerBean); - } catch (Exception e) { - LOG.warn("Failed to register with JMX", e); - self.jmxLeaderElectionBean = null; - } - - try { - HashMap recvset = - new HashMap(); - - HashMap outofelection = - new HashMap(); - - logicalclock++; - - proposedLeader = self.getId(); - proposedZxid = self.getLastLoggedZxid(); - - LOG.info("Election tally"); - sendNotifications(); - - /* - * Loop in which we exchange notifications until we find a leader - */ - - while (self.getPeerState() == ServerState.LOOKING) { - /* - * Remove next notification from queue, times out after 2 times - * the termination time - */ - Notification n = recvqueue.poll(2 * finalizeWait, - TimeUnit.MILLISECONDS); - - /* - * Sends more notifications if haven't received enough. - * Otherwise processes new notification. - */ - if (n == null) { - if (((!outofelection.isEmpty()) || (recvset.size() > 1))) - sendNotifications(); - } else - switch (n.state) { - case LOOKING: - if (n.epoch > logicalclock) { - logicalclock = n.epoch; - recvset.clear(); - if (totalOrderPredicate(n.leader, n.zxid)) { - proposedLeader = n.leader; - proposedZxid = n.zxid; - } - sendNotifications(); - } else if (n.epoch < logicalclock) { - break; - } else if (totalOrderPredicate(n.leader, n.zxid)) { - proposedLeader = n.leader; - proposedZxid = n.zxid; - - sendNotifications(); - } - - recvset.put(n.addr, new Vote(n.leader, n.zxid)); - - // If have received from all nodes, then terminate - if (self.getVotingView().size() == recvset.size()) { - self.setPeerState((proposedLeader == self.getId()) ? - ServerState.LEADING: ServerState.FOLLOWING); - // if (self.state == ServerState.FOLLOWING) { - // Thread.sleep(100); - // } - leaveInstance(); - return new Vote(proposedLeader, proposedZxid); - - } else if (termPredicate(recvset, proposedLeader, - proposedZxid)) { - // Otherwise, wait for a fixed amount of time - LOG.info("Passed predicate"); - Thread.sleep(finalizeWait); - - // Notification probe = recvqueue.peek(); - - // Verify if there is any change in the proposed leader - while ((!recvqueue.isEmpty()) - && !totalOrderPredicate( - recvqueue.peek().leader, recvqueue - .peek().zxid)) { - recvqueue.poll(); - } - if (recvqueue.isEmpty()) { - // LOG.warn("Proposed leader: " + - // proposedLeader); - self.setPeerState( - (proposedLeader == self.getId()) ? - ServerState.LEADING : - ServerState.FOLLOWING); - - leaveInstance(); - return new Vote(proposedLeader, proposedZxid); - } - } - break; - case LEADING: - outofelection.put(n.addr, new Vote(n.leader, n.zxid)); - - if (termPredicate(outofelection, n.leader, n.zxid)) { - - self.setPeerState((n.leader == self.getId()) ? - ServerState.LEADING: ServerState.FOLLOWING); - - leaveInstance(); - return new Vote(n.leader, n.zxid); - } - break; - case FOLLOWING: - outofelection.put(n.addr, new Vote(n.leader, n.zxid)); - - if (termPredicate(outofelection, n.leader, n.zxid)) { - - self.setPeerState((n.leader == self.getId()) ? - ServerState.LEADING: ServerState.FOLLOWING); - - leaveInstance(); - return new Vote(n.leader, n.zxid); - } - break; - default: - break; - } - } - - return null; - } finally { - try { - if(self.jmxLeaderElectionBean != null){ - MBeanRegistry.getInstance().unregister( - self.jmxLeaderElectionBean); - } - } catch (Exception e) { - LOG.warn("Failed to unregister with JMX", e); - } - self.jmxLeaderElectionBean = null; - } - } -} diff --git a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/quorum/CommitProcessor.java b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/quorum/CommitProcessor.java deleted file mode 100644 index a0c2cbdd0..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/quorum/CommitProcessor.java +++ /dev/null @@ -1,192 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you 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. - */ - -package org.apache.zookeeper.server.quorum; - -import java.util.ArrayList; -import java.util.LinkedList; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.apache.zookeeper.ZooDefs.OpCode; -import org.apache.zookeeper.server.Request; -import org.apache.zookeeper.server.RequestProcessor; - -/** - * This RequestProcessor matches the incoming committed requests with the - * locally submitted requests. The trick is that locally submitted requests that - * change the state of the system will come back as incoming committed requests, - * so we need to match them up. - */ -public class CommitProcessor extends Thread implements RequestProcessor { - private static final Logger LOG = LoggerFactory.getLogger(CommitProcessor.class); - - /** - * Requests that we are holding until the commit comes in. - */ - LinkedList queuedRequests = new LinkedList(); - - /** - * Requests that have been committed. - */ - LinkedList committedRequests = new LinkedList(); - - RequestProcessor nextProcessor; - ArrayList toProcess = new ArrayList(); - - /** - * This flag indicates whether we need to wait for a response to come back from the - * leader or we just let the sync operation flow through like a read. The flag will - * be true if the CommitProcessor is in a Leader pipeline. - */ - boolean matchSyncs; - - public CommitProcessor(RequestProcessor nextProcessor, String id, boolean matchSyncs) { - super("CommitProcessor:" + id); - this.nextProcessor = nextProcessor; - this.matchSyncs = matchSyncs; - } - - volatile boolean finished = false; - - @Override - public void run() { - try { - Request nextPending = null; - while (!finished) { - int len = toProcess.size(); - for (int i = 0; i < len; i++) { - nextProcessor.processRequest(toProcess.get(i)); - } - toProcess.clear(); - synchronized (this) { - if ((queuedRequests.size() == 0 || nextPending != null) - && committedRequests.size() == 0) { - wait(); - continue; - } - // First check and see if the commit came in for the pending - // request - if ((queuedRequests.size() == 0 || nextPending != null) - && committedRequests.size() > 0) { - Request r = committedRequests.remove(); - /* - * We match with nextPending so that we can move to the - * next request when it is committed. We also want to - * use nextPending because it has the cnxn member set - * properly. - */ - if (nextPending != null - && nextPending.sessionId == r.sessionId - && nextPending.cxid == r.cxid) { - // we want to send our version of the request. - // the pointer to the connection in the request - nextPending.hdr = r.hdr; - nextPending.txn = r.txn; - nextPending.zxid = r.zxid; - toProcess.add(nextPending); - nextPending = null; - } else { - // this request came from someone else so just - // send the commit packet - toProcess.add(r); - } - } - } - - // We haven't matched the pending requests, so go back to - // waiting - if (nextPending != null) { - continue; - } - - synchronized (this) { - // Process the next requests in the queuedRequests - while (nextPending == null && queuedRequests.size() > 0) { - Request request = queuedRequests.remove(); - switch (request.type) { - case OpCode.create: - case OpCode.delete: - case OpCode.setData: - case OpCode.multi: - case OpCode.setACL: - case OpCode.createSession: - case OpCode.closeSession: - nextPending = request; - break; - case OpCode.sync: - if (matchSyncs) { - nextPending = request; - } else { - toProcess.add(request); - } - break; - default: - toProcess.add(request); - } - } - } - } - } catch (InterruptedException e) { - LOG.warn("Interrupted exception while waiting", e); - } catch (Throwable e) { - LOG.error("Unexpected exception causing CommitProcessor to exit", e); - } - LOG.info("CommitProcessor exited loop!"); - } - - synchronized public void commit(Request request) { - if (!finished) { - if (request == null) { - LOG.warn("Committed a null!", - new Exception("committing a null! ")); - return; - } - if (LOG.isDebugEnabled()) { - LOG.debug("Committing request:: " + request); - } - committedRequests.add(request); - notifyAll(); - } - } - - synchronized public void processRequest(Request request) { - // request.addRQRec(">commit"); - if (LOG.isDebugEnabled()) { - LOG.debug("Processing request:: " + request); - } - - if (!finished) { - queuedRequests.add(request); - notifyAll(); - } - } - - public void shutdown() { - LOG.info("Shutting down"); - synchronized (this) { - finished = true; - queuedRequests.clear(); - notifyAll(); - } - if (nextProcessor != null) { - nextProcessor.shutdown(); - } - } - -} diff --git a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/quorum/Election.java b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/quorum/Election.java deleted file mode 100644 index 899063853..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/quorum/Election.java +++ /dev/null @@ -1,27 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you 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. - */ - -package org.apache.zookeeper.server.quorum; - - -import org.apache.zookeeper.server.quorum.Vote; - -public interface Election { - public Vote lookForLeader() throws InterruptedException; - public void shutdown(); -} diff --git a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/quorum/FastLeaderElection.java b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/quorum/FastLeaderElection.java deleted file mode 100644 index 6b79d04a1..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/quorum/FastLeaderElection.java +++ /dev/null @@ -1,999 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you 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. - */ - - -package org.apache.zookeeper.server.quorum; - -import java.io.IOException; -import java.nio.ByteBuffer; -import java.util.HashMap; -import java.util.HashSet; -import java.util.Map; -import java.util.concurrent.LinkedBlockingQueue; -import java.util.concurrent.TimeUnit; - -import org.apache.zookeeper.jmx.MBeanRegistry; -import org.apache.zookeeper.server.quorum.QuorumCnxManager.Message; -import org.apache.zookeeper.server.quorum.QuorumPeer.LearnerType; -import org.apache.zookeeper.server.quorum.QuorumPeer.QuorumServer; -import org.apache.zookeeper.server.quorum.QuorumPeer.ServerState; -import org.apache.zookeeper.server.util.ZxidUtils; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - - -/** - * Implementation of leader election using TCP. It uses an object of the class - * QuorumCnxManager to manage connections. Otherwise, the algorithm is push-based - * as with the other UDP implementations. - * - * There are a few parameters that can be tuned to change its behavior. First, - * finalizeWait determines the amount of time to wait until deciding upon a leader. - * This is part of the leader election algorithm. - */ - - -public class FastLeaderElection implements Election { - private static final Logger LOG = LoggerFactory.getLogger(FastLeaderElection.class); - - /** - * Determine how much time a process has to wait - * once it believes that it has reached the end of - * leader election. - */ - final static int finalizeWait = 200; - - - /** - * Upper bound on the amount of time between two consecutive - * notification checks. This impacts the amount of time to get - * the system up again after long partitions. Currently 60 seconds. - */ - - final static int maxNotificationInterval = 60000; - - /** - * Connection manager. Fast leader election uses TCP for - * communication between peers, and QuorumCnxManager manages - * such connections. - */ - - QuorumCnxManager manager; - - - /** - * Notifications are messages that let other peers know that - * a given peer has changed its vote, either because it has - * joined leader election or because it learned of another - * peer with higher zxid or same zxid and higher server id - */ - - static public class Notification { - /* - * Format version, introduced in 3.4.6 - */ - - public final static int CURRENTVERSION = 0x1; - int version; - - /* - * Proposed leader - */ - long leader; - - /* - * zxid of the proposed leader - */ - long zxid; - - /* - * Epoch - */ - long electionEpoch; - - /* - * current state of sender - */ - QuorumPeer.ServerState state; - - /* - * Address of sender - */ - long sid; - - /* - * epoch of the proposed leader - */ - long peerEpoch; - - @Override - public String toString() { - return new String(Long.toHexString(version) + " (message format version), " - + leader + " (n.leader), 0x" - + Long.toHexString(zxid) + " (n.zxid), 0x" - + Long.toHexString(electionEpoch) + " (n.round), " + state - + " (n.state), " + sid + " (n.sid), 0x" - + Long.toHexString(peerEpoch) + " (n.peerEpoch) "); - } - } - - static ByteBuffer buildMsg(int state, - long leader, - long zxid, - long electionEpoch, - long epoch) { - byte requestBytes[] = new byte[40]; - ByteBuffer requestBuffer = ByteBuffer.wrap(requestBytes); - - /* - * Building notification packet to send - */ - - requestBuffer.clear(); - requestBuffer.putInt(state); - requestBuffer.putLong(leader); - requestBuffer.putLong(zxid); - requestBuffer.putLong(electionEpoch); - requestBuffer.putLong(epoch); - requestBuffer.putInt(Notification.CURRENTVERSION); - - return requestBuffer; - } - - /** - * Messages that a peer wants to send to other peers. - * These messages can be both Notifications and Acks - * of reception of notification. - */ - static public class ToSend { - static enum mType {crequest, challenge, notification, ack} - - ToSend(mType type, - long leader, - long zxid, - long electionEpoch, - ServerState state, - long sid, - long peerEpoch) { - - this.leader = leader; - this.zxid = zxid; - this.electionEpoch = electionEpoch; - this.state = state; - this.sid = sid; - this.peerEpoch = peerEpoch; - } - - /* - * Proposed leader in the case of notification - */ - long leader; - - /* - * id contains the tag for acks, and zxid for notifications - */ - long zxid; - - /* - * Epoch - */ - long electionEpoch; - - /* - * Current state; - */ - QuorumPeer.ServerState state; - - /* - * Address of recipient - */ - long sid; - - /* - * Leader epoch - */ - long peerEpoch; - } - - LinkedBlockingQueue sendqueue; - LinkedBlockingQueue recvqueue; - - /** - * Multi-threaded implementation of message handler. Messenger - * implements two sub-classes: WorkReceiver and WorkSender. The - * functionality of each is obvious from the name. Each of these - * spawns a new thread. - */ - - protected class Messenger { - - /** - * Receives messages from instance of QuorumCnxManager on - * method run(), and processes such messages. - */ - - class WorkerReceiver implements Runnable { - volatile boolean stop; - QuorumCnxManager manager; - - WorkerReceiver(QuorumCnxManager manager) { - this.stop = false; - this.manager = manager; - } - - public void run() { - - Message response; - while (!stop) { - // Sleeps on receive - try{ - response = manager.pollRecvQueue(3000, TimeUnit.MILLISECONDS); - if(response == null) continue; - - /* - * If it is from an observer, respond right away. - * Note that the following predicate assumes that - * if a server is not a follower, then it must be - * an observer. If we ever have any other type of - * learner in the future, we'll have to change the - * way we check for observers. - */ - if(!self.getVotingView().containsKey(response.sid)){ - Vote current = self.getCurrentVote(); - ToSend notmsg = new ToSend(ToSend.mType.notification, - current.getId(), - current.getZxid(), - logicalclock, - self.getPeerState(), - response.sid, - current.getPeerEpoch()); - - sendqueue.offer(notmsg); - } else { - // Receive new message - if (LOG.isDebugEnabled()) { - LOG.debug("Receive new notification message. My id = " - + self.getId()); - } - - /* - * We check for 28 bytes for backward compatibility - */ - if (response.buffer.capacity() < 28) { - LOG.error("Got a short response: " - + response.buffer.capacity()); - continue; - } - boolean backCompatibility = (response.buffer.capacity() == 28); - response.buffer.clear(); - - // Instantiate Notification and set its attributes - Notification n = new Notification(); - - // State of peer that sent this message - QuorumPeer.ServerState ackstate = QuorumPeer.ServerState.LOOKING; - switch (response.buffer.getInt()) { - case 0: - ackstate = QuorumPeer.ServerState.LOOKING; - break; - case 1: - ackstate = QuorumPeer.ServerState.FOLLOWING; - break; - case 2: - ackstate = QuorumPeer.ServerState.LEADING; - break; - case 3: - ackstate = QuorumPeer.ServerState.OBSERVING; - break; - default: - continue; - } - - n.leader = response.buffer.getLong(); - n.zxid = response.buffer.getLong(); - n.electionEpoch = response.buffer.getLong(); - n.state = ackstate; - n.sid = response.sid; - if(!backCompatibility){ - n.peerEpoch = response.buffer.getLong(); - } else { - if(LOG.isInfoEnabled()){ - LOG.info("Backward compatibility mode, server id=" + n.sid); - } - n.peerEpoch = ZxidUtils.getEpochFromZxid(n.zxid); - } - - /* - * Version added in 3.4.6 - */ - - n.version = (response.buffer.remaining() >= 4) ? - response.buffer.getInt() : 0x0; - - /* - * Print notification info - */ - if(LOG.isInfoEnabled()){ - printNotification(n); - } - - /* - * If this server is looking, then send proposed leader - */ - - if(self.getPeerState() == QuorumPeer.ServerState.LOOKING){ - recvqueue.offer(n); - - /* - * Send a notification back if the peer that sent this - * message is also looking and its logical clock is - * lagging behind. - */ - if((ackstate == QuorumPeer.ServerState.LOOKING) - && (n.electionEpoch < logicalclock)){ - Vote v = getVote(); - ToSend notmsg = new ToSend(ToSend.mType.notification, - v.getId(), - v.getZxid(), - logicalclock, - self.getPeerState(), - response.sid, - v.getPeerEpoch()); - sendqueue.offer(notmsg); - } - } else { - /* - * If this server is not looking, but the one that sent the ack - * is looking, then send back what it believes to be the leader. - */ - Vote current = self.getCurrentVote(); - if(ackstate == QuorumPeer.ServerState.LOOKING){ - if(LOG.isDebugEnabled()){ - LOG.debug("Sending new notification. My id = " + - self.getId() + " recipient=" + - response.sid + " zxid=0x" + - Long.toHexString(current.getZxid()) + - " leader=" + current.getId()); - } - - ToSend notmsg; - if(n.version > 0x0) { - notmsg = new ToSend( - ToSend.mType.notification, - current.getId(), - current.getZxid(), - current.getElectionEpoch(), - self.getPeerState(), - response.sid, - current.getPeerEpoch()); - - } else { - Vote bcVote = self.getBCVote(); - notmsg = new ToSend( - ToSend.mType.notification, - bcVote.getId(), - bcVote.getZxid(), - bcVote.getElectionEpoch(), - self.getPeerState(), - response.sid, - bcVote.getPeerEpoch()); - } - sendqueue.offer(notmsg); - } - } - } - } catch (InterruptedException e) { - System.out.println("Interrupted Exception while waiting for new message" + - e.toString()); - } - } - LOG.info("WorkerReceiver is down"); - } - } - - - /** - * This worker simply dequeues a message to send and - * and queues it on the manager's queue. - */ - - class WorkerSender implements Runnable { - volatile boolean stop; - QuorumCnxManager manager; - - WorkerSender(QuorumCnxManager manager){ - this.stop = false; - this.manager = manager; - } - - public void run() { - while (!stop) { - try { - ToSend m = sendqueue.poll(3000, TimeUnit.MILLISECONDS); - if(m == null) continue; - - process(m); - } catch (InterruptedException e) { - break; - } - } - LOG.info("WorkerSender is down"); - } - - /** - * Called by run() once there is a new message to send. - * - * @param m message to send - */ - void process(ToSend m) { - ByteBuffer requestBuffer = buildMsg(m.state.ordinal(), - m.leader, - m.zxid, - m.electionEpoch, - m.peerEpoch); - manager.toSend(m.sid, requestBuffer); - } - } - - /** - * Test if both send and receive queues are empty. - */ - public boolean queueEmpty() { - return (sendqueue.isEmpty() || recvqueue.isEmpty()); - } - - - WorkerSender ws; - WorkerReceiver wr; - - /** - * Constructor of class Messenger. - * - * @param manager Connection manager - */ - Messenger(QuorumCnxManager manager) { - - this.ws = new WorkerSender(manager); - - Thread t = new Thread(this.ws, - "WorkerSender[myid=" + self.getId() + "]"); - t.setDaemon(true); - t.start(); - - this.wr = new WorkerReceiver(manager); - - t = new Thread(this.wr, - "WorkerReceiver[myid=" + self.getId() + "]"); - t.setDaemon(true); - t.start(); - } - - /** - * Stops instances of WorkerSender and WorkerReceiver - */ - void halt(){ - this.ws.stop = true; - this.wr.stop = true; - } - - } - - QuorumPeer self; - Messenger messenger; - volatile long logicalclock; /* Election instance */ - long proposedLeader; - long proposedZxid; - long proposedEpoch; - - - /** - * Returns the current vlue of the logical clock counter - */ - public long getLogicalClock(){ - return logicalclock; - } - - /** - * Constructor of FastLeaderElection. It takes two parameters, one - * is the QuorumPeer object that instantiated this object, and the other - * is the connection manager. Such an object should be created only once - * by each peer during an instance of the ZooKeeper service. - * - * @param self QuorumPeer that created this object - * @param manager Connection manager - */ - public FastLeaderElection(QuorumPeer self, QuorumCnxManager manager){ - this.stop = false; - this.manager = manager; - starter(self, manager); - } - - /** - * This method is invoked by the constructor. Because it is a - * part of the starting procedure of the object that must be on - * any constructor of this class, it is probably best to keep as - * a separate method. As we have a single constructor currently, - * it is not strictly necessary to have it separate. - * - * @param self QuorumPeer that created this object - * @param manager Connection manager - */ - private void starter(QuorumPeer self, QuorumCnxManager manager) { - this.self = self; - proposedLeader = -1; - proposedZxid = -1; - - sendqueue = new LinkedBlockingQueue(); - recvqueue = new LinkedBlockingQueue(); - this.messenger = new Messenger(manager); - } - - private void leaveInstance(Vote v) { - if(LOG.isDebugEnabled()){ - LOG.debug("About to leave FLE instance: leader=" - + v.getId() + ", zxid=0x" + - Long.toHexString(v.getZxid()) + ", my id=" + self.getId() - + ", my state=" + self.getPeerState()); - } - recvqueue.clear(); - } - - public QuorumCnxManager getCnxManager(){ - return manager; - } - - volatile boolean stop; - public void shutdown(){ - stop = true; - LOG.debug("Shutting down connection manager"); - manager.halt(); - LOG.debug("Shutting down messenger"); - messenger.halt(); - LOG.debug("FLE is down"); - } - - - /** - * Send notifications to all peers upon a change in our vote - */ - private void sendNotifications() { - for (QuorumServer server : self.getVotingView().values()) { - long sid = server.id; - - ToSend notmsg = new ToSend(ToSend.mType.notification, - proposedLeader, - proposedZxid, - logicalclock, - QuorumPeer.ServerState.LOOKING, - sid, - proposedEpoch); - if(LOG.isDebugEnabled()){ - LOG.debug("Sending Notification: " + proposedLeader + " (n.leader), 0x" + - Long.toHexString(proposedZxid) + " (n.zxid), 0x" + Long.toHexString(logicalclock) + - " (n.round), " + sid + " (recipient), " + self.getId() + - " (myid), 0x" + Long.toHexString(proposedEpoch) + " (n.peerEpoch)"); - } - sendqueue.offer(notmsg); - } - } - - - private void printNotification(Notification n){ - LOG.info("Notification: " + n.toString() - + self.getPeerState() + " (my state)"); - } - - /** - * Check if a pair (server id, zxid) succeeds our - * current vote. - * - * @param id Server identifier - * @param zxid Last zxid observed by the issuer of this vote - */ - protected boolean totalOrderPredicate(long newId, long newZxid, long newEpoch, long curId, long curZxid, long curEpoch) { - LOG.debug("id: " + newId + ", proposed id: " + curId + ", zxid: 0x" + - Long.toHexString(newZxid) + ", proposed zxid: 0x" + Long.toHexString(curZxid)); - if(self.getQuorumVerifier().getWeight(newId) == 0){ - return false; - } - - /* - * We return true if one of the following three cases hold: - * 1- New epoch is higher - * 2- New epoch is the same as current epoch, but new zxid is higher - * 3- New epoch is the same as current epoch, new zxid is the same - * as current zxid, but server id is higher. - */ - - return ((newEpoch > curEpoch) || - ((newEpoch == curEpoch) && - ((newZxid > curZxid) || ((newZxid == curZxid) && (newId > curId))))); - } - - /** - * Termination predicate. Given a set of votes, determines if - * have sufficient to declare the end of the election round. - * - * @param votes Set of votes - * @param l Identifier of the vote received last - * @param zxid zxid of the the vote received last - */ - protected boolean termPredicate( - HashMap votes, - Vote vote) { - - HashSet set = new HashSet(); - - /* - * First make the views consistent. Sometimes peers will have - * different zxids for a server depending on timing. - */ - for (Map.Entry entry : votes.entrySet()) { - if (vote.equals(entry.getValue())){ - set.add(entry.getKey()); - } - } - - return self.getQuorumVerifier().containsQuorum(set); - } - - /** - * In the case there is a leader elected, and a quorum supporting - * this leader, we have to check if the leader has voted and acked - * that it is leading. We need this check to avoid that peers keep - * electing over and over a peer that has crashed and it is no - * longer leading. - * - * @param votes set of votes - * @param leader leader id - * @param electionEpoch epoch id - */ - protected boolean checkLeader( - HashMap votes, - long leader, - long electionEpoch){ - - boolean predicate = true; - - /* - * If everyone else thinks I'm the leader, I must be the leader. - * The other two checks are just for the case in which I'm not the - * leader. If I'm not the leader and I haven't received a message - * from leader stating that it is leading, then predicate is false. - */ - - if(leader != self.getId()){ - if(votes.get(leader) == null) predicate = false; - else if(votes.get(leader).getState() != ServerState.LEADING) predicate = false; - } else if(logicalclock != electionEpoch) { - predicate = false; - } - - return predicate; - } - - /** - * This predicate checks that a leader has been elected. It doesn't - * make a lot of sense without context (check lookForLeader) and it - * has been separated for testing purposes. - * - * @param recv map of received votes - * @param ooe map containing out of election votes (LEADING or FOLLOWING) - * @param n Notification - * @return - */ - protected boolean ooePredicate(HashMap recv, - HashMap ooe, - Notification n) { - - return (termPredicate(recv, new Vote(n.version, - n.leader, - n.zxid, - n.electionEpoch, - n.peerEpoch, - n.state)) - && checkLeader(ooe, n.leader, n.electionEpoch)); - - } - - synchronized void updateProposal(long leader, long zxid, long epoch){ - if(LOG.isDebugEnabled()){ - LOG.debug("Updating proposal: " + leader + " (newleader), 0x" - + Long.toHexString(zxid) + " (newzxid), " + proposedLeader - + " (oldleader), 0x" + Long.toHexString(proposedZxid) + " (oldzxid)"); - } - proposedLeader = leader; - proposedZxid = zxid; - proposedEpoch = epoch; - } - - synchronized Vote getVote(){ - return new Vote(proposedLeader, proposedZxid, proposedEpoch); - } - - /** - * A learning state can be either FOLLOWING or OBSERVING. - * This method simply decides which one depending on the - * role of the server. - * - * @return ServerState - */ - private ServerState learningState(){ - if(self.getLearnerType() == LearnerType.PARTICIPANT){ - LOG.debug("I'm a participant: " + self.getId()); - return ServerState.FOLLOWING; - } - else{ - LOG.debug("I'm an observer: " + self.getId()); - return ServerState.OBSERVING; - } - } - - /** - * Returns the initial vote value of server identifier. - * - * @return long - */ - private long getInitId(){ - if(self.getLearnerType() == LearnerType.PARTICIPANT) - return self.getId(); - else return Long.MIN_VALUE; - } - - /** - * Returns initial last logged zxid. - * - * @return long - */ - private long getInitLastLoggedZxid(){ - if(self.getLearnerType() == LearnerType.PARTICIPANT) - return self.getLastLoggedZxid(); - else return Long.MIN_VALUE; - } - - /** - * Returns the initial vote value of the peer epoch. - * - * @return long - */ - private long getPeerEpoch(){ - if(self.getLearnerType() == LearnerType.PARTICIPANT) - try { - return self.getCurrentEpoch(); - } catch(IOException e) { - RuntimeException re = new RuntimeException(e.getMessage()); - re.setStackTrace(e.getStackTrace()); - throw re; - } - else return Long.MIN_VALUE; - } - - /** - * Starts a new round of leader election. Whenever our QuorumPeer - * changes its state to LOOKING, this method is invoked, and it - * sends notifications to all other peers. - */ - public Vote lookForLeader() throws InterruptedException { - try { - self.jmxLeaderElectionBean = new LeaderElectionBean(); - MBeanRegistry.getInstance().register( - self.jmxLeaderElectionBean, self.jmxLocalPeerBean); - } catch (Exception e) { - LOG.warn("Failed to register with JMX", e); - self.jmxLeaderElectionBean = null; - } - if (self.start_fle == 0) { - self.start_fle = System.currentTimeMillis(); - } - try { - HashMap recvset = new HashMap(); - - HashMap outofelection = new HashMap(); - - int notTimeout = finalizeWait; - - synchronized(this){ - logicalclock++; - updateProposal(getInitId(), getInitLastLoggedZxid(), getPeerEpoch()); - } - - LOG.info("New election. My id = " + self.getId() + - ", proposed zxid=0x" + Long.toHexString(proposedZxid)); - sendNotifications(); - - /* - * Loop in which we exchange notifications until we find a leader - */ - - while ((self.getPeerState() == ServerState.LOOKING) && - (!stop)){ - /* - * Remove next notification from queue, times out after 2 times - * the termination time - */ - Notification n = recvqueue.poll(notTimeout, - TimeUnit.MILLISECONDS); - - /* - * Sends more notifications if haven't received enough. - * Otherwise processes new notification. - */ - if(n == null){ - if(manager.haveDelivered()){ - sendNotifications(); - } else { - manager.connectAll(); - } - - /* - * Exponential backoff - */ - int tmpTimeOut = notTimeout*2; - notTimeout = (tmpTimeOut < maxNotificationInterval? - tmpTimeOut : maxNotificationInterval); - LOG.info("Notification time out: " + notTimeout); - } - else if(self.getVotingView().containsKey(n.sid)) { - /* - * Only proceed if the vote comes from a replica in the - * voting view. - */ - switch (n.state) { - case LOOKING: - // If notification > current, replace and send messages out - if (n.electionEpoch > logicalclock) { - logicalclock = n.electionEpoch; - recvset.clear(); - if(totalOrderPredicate(n.leader, n.zxid, n.peerEpoch, - getInitId(), getInitLastLoggedZxid(), getPeerEpoch())) { - updateProposal(n.leader, n.zxid, n.peerEpoch); - } else { - updateProposal(getInitId(), - getInitLastLoggedZxid(), - getPeerEpoch()); - } - sendNotifications(); - } else if (n.electionEpoch < logicalclock) { - if(LOG.isDebugEnabled()){ - LOG.debug("Notification election epoch is smaller than logicalclock. n.electionEpoch = 0x" - + Long.toHexString(n.electionEpoch) - + ", logicalclock=0x" + Long.toHexString(logicalclock)); - } - break; - } else if (totalOrderPredicate(n.leader, n.zxid, n.peerEpoch, - proposedLeader, proposedZxid, proposedEpoch)) { - updateProposal(n.leader, n.zxid, n.peerEpoch); - sendNotifications(); - } - - if(LOG.isDebugEnabled()){ - LOG.debug("Adding vote: from=" + n.sid + - ", proposed leader=" + n.leader + - ", proposed zxid=0x" + Long.toHexString(n.zxid) + - ", proposed election epoch=0x" + Long.toHexString(n.electionEpoch)); - } - - recvset.put(n.sid, new Vote(n.leader, n.zxid, n.electionEpoch, n.peerEpoch)); - - if (termPredicate(recvset, - new Vote(proposedLeader, proposedZxid, - logicalclock, proposedEpoch))) { - - // Verify if there is any change in the proposed leader - while((n = recvqueue.poll(finalizeWait, - TimeUnit.MILLISECONDS)) != null){ - if(totalOrderPredicate(n.leader, n.zxid, n.peerEpoch, - proposedLeader, proposedZxid, proposedEpoch)){ - recvqueue.put(n); - break; - } - } - - /* - * This predicate is true once we don't read any new - * relevant message from the reception queue - */ - if (n == null) { - self.setPeerState((proposedLeader == self.getId()) ? - ServerState.LEADING: learningState()); - - Vote endVote = new Vote(proposedLeader, - proposedZxid, - logicalclock, - proposedEpoch); - leaveInstance(endVote); - return endVote; - } - } - break; - case OBSERVING: - LOG.debug("Notification from observer: " + n.sid); - break; - case FOLLOWING: - case LEADING: - /* - * Consider all notifications from the same epoch - * together. - */ - if(n.electionEpoch == logicalclock){ - recvset.put(n.sid, new Vote(n.leader, - n.zxid, - n.electionEpoch, - n.peerEpoch)); - - if(ooePredicate(recvset, outofelection, n)) { - self.setPeerState((n.leader == self.getId()) ? - ServerState.LEADING: learningState()); - - Vote endVote = new Vote(n.leader, - n.zxid, - n.electionEpoch, - n.peerEpoch); - leaveInstance(endVote); - return endVote; - } - } - - /* - * Before joining an established ensemble, verify - * a majority is following the same leader. - */ - outofelection.put(n.sid, new Vote(n.version, - n.leader, - n.zxid, - n.electionEpoch, - n.peerEpoch, - n.state)); - - if(ooePredicate(outofelection, outofelection, n)) { - synchronized(this){ - logicalclock = n.electionEpoch; - self.setPeerState((n.leader == self.getId()) ? - ServerState.LEADING: learningState()); - } - Vote endVote = new Vote(n.leader, - n.zxid, - n.electionEpoch, - n.peerEpoch); - leaveInstance(endVote); - return endVote; - } - break; - default: - LOG.warn("Notification state unrecognized: {} (n.state), {} (n.sid)", - n.state, n.sid); - break; - } - } else { - LOG.warn("Ignoring notification from non-cluster member " + n.sid); - } - } - return null; - } finally { - try { - if(self.jmxLeaderElectionBean != null){ - MBeanRegistry.getInstance().unregister( - self.jmxLeaderElectionBean); - } - } catch (Exception e) { - LOG.warn("Failed to unregister with JMX", e); - } - self.jmxLeaderElectionBean = null; - } - } -} diff --git a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/quorum/Follower.java b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/quorum/Follower.java deleted file mode 100644 index ab3f288ed..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/quorum/Follower.java +++ /dev/null @@ -1,169 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you 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. - */ - -package org.apache.zookeeper.server.quorum; - -import java.io.ByteArrayInputStream; -import java.io.IOException; -import java.net.InetSocketAddress; - -import org.apache.jute.BinaryInputArchive; -import org.apache.jute.Record; -import org.apache.zookeeper.server.util.SerializeUtils; -import org.apache.zookeeper.server.util.ZxidUtils; -import org.apache.zookeeper.txn.TxnHeader; - -/** - * This class has the control logic for the Follower. - */ -public class Follower extends Learner{ - - private long lastQueued; - // This is the same object as this.zk, but we cache the downcast op - final FollowerZooKeeperServer fzk; - - Follower(QuorumPeer self,FollowerZooKeeperServer zk) { - this.self = self; - this.zk=zk; - this.fzk = zk; - } - - @Override - public String toString() { - StringBuilder sb = new StringBuilder(); - sb.append("Follower ").append(sock); - sb.append(" lastQueuedZxid:").append(lastQueued); - sb.append(" pendingRevalidationCount:") - .append(pendingRevalidations.size()); - return sb.toString(); - } - - /** - * the main method called by the follower to follow the leader - * - * @throws InterruptedException - */ - void followLeader() throws InterruptedException { - self.end_fle = System.currentTimeMillis(); - LOG.info("FOLLOWING - LEADER ELECTION TOOK - " + - (self.end_fle - self.start_fle)); - self.start_fle = 0; - self.end_fle = 0; - fzk.registerJMX(new FollowerBean(this, zk), self.jmxLocalPeerBean); - try { - InetSocketAddress addr = findLeader(); - try { - connectToLeader(addr); - long newEpochZxid = registerWithLeader(Leader.FOLLOWERINFO); - - //check to see if the leader zxid is lower than ours - //this should never happen but is just a safety check - long newEpoch = ZxidUtils.getEpochFromZxid(newEpochZxid); - if (newEpoch < self.getAcceptedEpoch()) { - LOG.error("Proposed leader epoch " + ZxidUtils.zxidToString(newEpochZxid) - + " is less than our accepted epoch " + ZxidUtils.zxidToString(self.getAcceptedEpoch())); - throw new IOException("Error: Epoch of leader is lower"); - } - syncWithLeader(newEpochZxid); - QuorumPacket qp = new QuorumPacket(); - while (self.isRunning()) { - readPacket(qp); - processPacket(qp); - } - } catch (IOException e) { - LOG.warn("Exception when following the leader", e); - try { - sock.close(); - } catch (IOException e1) { - e1.printStackTrace(); - } - - // clear pending revalidations - pendingRevalidations.clear(); - } - } finally { - zk.unregisterJMX((Learner)this); - } - } - - /** - * Examine the packet received in qp and dispatch based on its contents. - * @param qp - * @throws IOException - */ - protected void processPacket(QuorumPacket qp) throws IOException{ - switch (qp.getType()) { - case Leader.PING: - ping(qp); - break; - case Leader.PROPOSAL: - TxnHeader hdr = new TxnHeader(); - Record txn = SerializeUtils.deserializeTxn(qp.getData(), hdr); - if (hdr.getZxid() != lastQueued + 1) { - LOG.warn("Got zxid 0x" - + Long.toHexString(hdr.getZxid()) - + " expected 0x" - + Long.toHexString(lastQueued + 1)); - } - lastQueued = hdr.getZxid(); - fzk.logRequest(hdr, txn); - break; - case Leader.COMMIT: - fzk.commit(qp.getZxid()); - break; - case Leader.UPTODATE: - LOG.error("Received an UPTODATE message after Follower started"); - break; - case Leader.REVALIDATE: - revalidate(qp); - break; - case Leader.SYNC: - fzk.sync(); - break; - } - } - - /** - * The zxid of the last operation seen - * @return zxid - */ - public long getZxid() { - try { - synchronized (fzk) { - return fzk.getZxid(); - } - } catch (NullPointerException e) { - LOG.warn("error getting zxid", e); - } - return -1; - } - - /** - * The zxid of the last operation queued - * @return zxid - */ - protected long getLastQueued() { - return lastQueued; - } - - @Override - public void shutdown() { - LOG.info("shutdown called", new Exception("shutdown Follower")); - super.shutdown(); - } -} diff --git a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/quorum/FollowerBean.java b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/quorum/FollowerBean.java deleted file mode 100644 index fd31fa2b6..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/quorum/FollowerBean.java +++ /dev/null @@ -1,50 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you 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. - */ - -package org.apache.zookeeper.server.quorum; - -import org.apache.zookeeper.server.ZooKeeperServer; -import org.apache.zookeeper.server.ZooKeeperServerBean; - -/** - * Follower MBean inteface implementation - */ -public class FollowerBean extends ZooKeeperServerBean implements FollowerMXBean { - private final Follower follower; - - public FollowerBean(Follower follower, ZooKeeperServer zks) { - super(zks); - this.follower = follower; - } - - public String getName() { - return "Follower"; - } - - public String getQuorumAddress() { - return follower.sock.toString(); - } - - public String getLastQueuedZxid() { - return "0x" + Long.toHexString(follower.getLastQueued()); - } - - public int getPendingRevalidationCount() { - return follower.getPendingRevalidationsCount(); - } -} diff --git a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/quorum/FollowerMXBean.java b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/quorum/FollowerMXBean.java deleted file mode 100644 index ded0e1ca0..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/quorum/FollowerMXBean.java +++ /dev/null @@ -1,41 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you 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. - */ - -package org.apache.zookeeper.server.quorum; - -import org.apache.zookeeper.server.ZooKeeperServerMXBean; - -/** - * Follower MBean - */ -public interface FollowerMXBean extends ZooKeeperServerMXBean { - /** - * @return socket address - */ - public String getQuorumAddress(); - - /** - * @return last queued zxid - */ - public String getLastQueuedZxid(); - - /** - * @return count of pending revalidations - */ - public int getPendingRevalidationCount(); -} diff --git a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/quorum/FollowerRequestProcessor.java b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/quorum/FollowerRequestProcessor.java deleted file mode 100644 index a1c8ce23d..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/quorum/FollowerRequestProcessor.java +++ /dev/null @@ -1,112 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you 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. - */ - -package org.apache.zookeeper.server.quorum; - -import java.util.concurrent.LinkedBlockingQueue; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import org.apache.zookeeper.ZooDefs.OpCode; -import org.apache.zookeeper.server.RequestProcessor; -import org.apache.zookeeper.server.Request; -import org.apache.zookeeper.server.ZooTrace; - -/** - * This RequestProcessor forwards any requests that modify the state of the - * system to the Leader. - */ -public class FollowerRequestProcessor extends Thread implements - RequestProcessor { - private static final Logger LOG = LoggerFactory.getLogger(FollowerRequestProcessor.class); - - FollowerZooKeeperServer zks; - - RequestProcessor nextProcessor; - - LinkedBlockingQueue queuedRequests = new LinkedBlockingQueue(); - - boolean finished = false; - - public FollowerRequestProcessor(FollowerZooKeeperServer zks, - RequestProcessor nextProcessor) { - super("FollowerRequestProcessor:" + zks.getServerId()); - this.zks = zks; - this.nextProcessor = nextProcessor; - } - - @Override - public void run() { - try { - while (!finished) { - Request request = queuedRequests.take(); - if (LOG.isTraceEnabled()) { - ZooTrace.logRequest(LOG, ZooTrace.CLIENT_REQUEST_TRACE_MASK, - 'F', request, ""); - } - if (request == Request.requestOfDeath) { - break; - } - // We want to queue the request to be processed before we submit - // the request to the leader so that we are ready to receive - // the response - nextProcessor.processRequest(request); - - // We now ship the request to the leader. As with all - // other quorum operations, sync also follows this code - // path, but different from others, we need to keep track - // of the sync operations this follower has pending, so we - // add it to pendingSyncs. - switch (request.type) { - case OpCode.sync: - zks.pendingSyncs.add(request); - zks.getFollower().request(request); - break; - case OpCode.create: - case OpCode.delete: - case OpCode.setData: - case OpCode.setACL: - case OpCode.createSession: - case OpCode.closeSession: - case OpCode.multi: - zks.getFollower().request(request); - break; - } - } - } catch (Exception e) { - LOG.error("Unexpected exception causing exit", e); - } - LOG.info("FollowerRequestProcessor exited loop!"); - } - - public void processRequest(Request request) { - if (!finished) { - queuedRequests.add(request); - } - } - - public void shutdown() { - LOG.info("Shutting down"); - finished = true; - queuedRequests.clear(); - queuedRequests.add(Request.requestOfDeath); - nextProcessor.shutdown(); - } - -} diff --git a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/quorum/FollowerZooKeeperServer.java b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/quorum/FollowerZooKeeperServer.java deleted file mode 100644 index 95c77b5c8..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/quorum/FollowerZooKeeperServer.java +++ /dev/null @@ -1,164 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you 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. - */ - -package org.apache.zookeeper.server.quorum; - -import java.io.IOException; -import java.util.concurrent.ConcurrentLinkedQueue; -import java.util.concurrent.LinkedBlockingQueue; - -import org.apache.jute.Record; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.apache.zookeeper.server.FinalRequestProcessor; -import org.apache.zookeeper.server.Request; -import org.apache.zookeeper.server.RequestProcessor; -import org.apache.zookeeper.server.SyncRequestProcessor; -import org.apache.zookeeper.server.ZKDatabase; -import org.apache.zookeeper.server.persistence.FileTxnSnapLog; -import org.apache.zookeeper.txn.TxnHeader; - -/** - * Just like the standard ZooKeeperServer. We just replace the request - * processors: FollowerRequestProcessor -> CommitProcessor -> - * FinalRequestProcessor - * - * A SyncRequestProcessor is also spawned off to log proposals from the leader. - */ -public class FollowerZooKeeperServer extends LearnerZooKeeperServer { - private static final Logger LOG = - LoggerFactory.getLogger(FollowerZooKeeperServer.class); - - CommitProcessor commitProcessor; - - SyncRequestProcessor syncProcessor; - - /* - * Pending sync requests - */ - ConcurrentLinkedQueue pendingSyncs; - - /** - * @param port - * @param dataDir - * @throws IOException - */ - FollowerZooKeeperServer(FileTxnSnapLog logFactory,QuorumPeer self, - DataTreeBuilder treeBuilder, ZKDatabase zkDb) throws IOException { - super(logFactory, self.tickTime, self.minSessionTimeout, - self.maxSessionTimeout, treeBuilder, zkDb, self); - this.pendingSyncs = new ConcurrentLinkedQueue(); - } - - public Follower getFollower(){ - return self.follower; - } - - @Override - protected void setupRequestProcessors() { - RequestProcessor finalProcessor = new FinalRequestProcessor(this); - commitProcessor = new CommitProcessor(finalProcessor, - Long.toString(getServerId()), true); - commitProcessor.start(); - firstProcessor = new FollowerRequestProcessor(this, commitProcessor); - ((FollowerRequestProcessor) firstProcessor).start(); - syncProcessor = new SyncRequestProcessor(this, - new SendAckRequestProcessor((Learner)getFollower())); - syncProcessor.start(); - } - - LinkedBlockingQueue pendingTxns = new LinkedBlockingQueue(); - - public void logRequest(TxnHeader hdr, Record txn) { - Request request = new Request(null, hdr.getClientId(), hdr.getCxid(), - hdr.getType(), null, null); - request.hdr = hdr; - request.txn = txn; - request.zxid = hdr.getZxid(); - if ((request.zxid & 0xffffffffL) != 0) { - pendingTxns.add(request); - } - syncProcessor.processRequest(request); - } - - /** - * When a COMMIT message is received, eventually this method is called, - * which matches up the zxid from the COMMIT with (hopefully) the head of - * the pendingTxns queue and hands it to the commitProcessor to commit. - * @param zxid - must correspond to the head of pendingTxns if it exists - */ - public void commit(long zxid) { - if (pendingTxns.size() == 0) { - LOG.warn("Committing " + Long.toHexString(zxid) - + " without seeing txn"); - return; - } - long firstElementZxid = pendingTxns.element().zxid; - if (firstElementZxid != zxid) { - LOG.error("Committing zxid 0x" + Long.toHexString(zxid) - + " but next pending txn 0x" - + Long.toHexString(firstElementZxid)); - System.exit(12); - } - Request request = pendingTxns.remove(); - commitProcessor.commit(request); - } - - synchronized public void sync(){ - if(pendingSyncs.size() ==0){ - LOG.warn("Not expecting a sync."); - return; - } - - Request r = pendingSyncs.remove(); - commitProcessor.commit(r); - } - - @Override - public int getGlobalOutstandingLimit() { - return super.getGlobalOutstandingLimit() / (self.getQuorumSize() - 1); - } - - @Override - public void shutdown() { - LOG.info("Shutting down"); - try { - super.shutdown(); - } catch (Exception e) { - LOG.warn("Ignoring unexpected exception during shutdown", e); - } - try { - if (syncProcessor != null) { - syncProcessor.shutdown(); - } - } catch (Exception e) { - LOG.warn("Ignoring unexpected exception in syncprocessor shutdown", - e); - } - } - - @Override - public String getState() { - return "follower"; - } - - @Override - public Learner getLearner() { - return getFollower(); - } -} diff --git a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/quorum/Leader.java b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/quorum/Leader.java deleted file mode 100644 index dd11a91dc..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/quorum/Leader.java +++ /dev/null @@ -1,1055 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you 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. - */ - -package org.apache.zookeeper.server.quorum; - -import java.io.ByteArrayOutputStream; -import java.io.IOException; -import java.net.BindException; -import java.net.InetSocketAddress; -import java.net.ServerSocket; -import java.net.Socket; -import java.net.SocketAddress; -import java.net.SocketException; -import java.util.ArrayList; -import java.util.Collections; -import java.util.HashMap; -import java.util.HashSet; -import java.util.Iterator; -import java.util.List; -import java.util.Set; -import java.util.concurrent.atomic.AtomicLong; -import java.util.concurrent.ConcurrentHashMap; -import java.util.concurrent.ConcurrentLinkedQueue; -import java.util.concurrent.ConcurrentMap; - -import org.apache.jute.BinaryOutputArchive; -import org.apache.zookeeper.server.ZooKeeperServer; -import org.apache.zookeeper.server.FinalRequestProcessor; -import org.apache.zookeeper.server.Request; -import org.apache.zookeeper.server.RequestProcessor; -import org.apache.zookeeper.server.quorum.QuorumPeer.LearnerType; -import org.apache.zookeeper.server.quorum.flexible.QuorumVerifier; -import org.apache.zookeeper.server.util.ZxidUtils; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -/** - * This class has the control logic for the Leader. - */ -public class Leader { - private static final Logger LOG = LoggerFactory.getLogger(Leader.class); - - static final private boolean nodelay = System.getProperty("leader.nodelay", "true").equals("true"); - static { - LOG.info("TCP NoDelay set to: " + nodelay); - } - - static public class Proposal { - public QuorumPacket packet; - - public HashSet ackSet = new HashSet(); - - public Request request; - - @Override - public String toString() { - return packet.getType() + ", " + packet.getZxid() + ", " + request; - } - } - - final LeaderZooKeeperServer zk; - - final QuorumPeer self; - - private boolean quorumFormed = false; - - // the follower acceptor thread - LearnerCnxAcceptor cnxAcceptor; - - // list of all the followers - private final HashSet learners = - new HashSet(); - - /** - * Returns a copy of the current learner snapshot - */ - public List getLearners() { - synchronized (learners) { - return new ArrayList(learners); - } - } - - // list of followers that are ready to follow (i.e synced with the leader) - private final HashSet forwardingFollowers = - new HashSet(); - - /** - * Returns a copy of the current forwarding follower snapshot - */ - public List getForwardingFollowers() { - synchronized (forwardingFollowers) { - return new ArrayList(forwardingFollowers); - } - } - - private void addForwardingFollower(LearnerHandler lh) { - synchronized (forwardingFollowers) { - forwardingFollowers.add(lh); - } - } - - private final HashSet observingLearners = - new HashSet(); - - /** - * Returns a copy of the current observer snapshot - */ - public List getObservingLearners() { - synchronized (observingLearners) { - return new ArrayList(observingLearners); - } - } - - private void addObserverLearnerHandler(LearnerHandler lh) { - synchronized (observingLearners) { - observingLearners.add(lh); - } - } - - // Pending sync requests. Must access under 'this' lock. - private final HashMap> pendingSyncs = - new HashMap>(); - - synchronized public int getNumPendingSyncs() { - return pendingSyncs.size(); - } - - //Follower counter - final AtomicLong followerCounter = new AtomicLong(-1); - - /** - * Adds peer to the leader. - * - * @param learner - * instance of learner handle - */ - void addLearnerHandler(LearnerHandler learner) { - synchronized (learners) { - learners.add(learner); - } - } - - /** - * Remove the learner from the learner list - * - * @param peer - */ - void removeLearnerHandler(LearnerHandler peer) { - synchronized (forwardingFollowers) { - forwardingFollowers.remove(peer); - } - synchronized (learners) { - learners.remove(peer); - } - synchronized (observingLearners) { - observingLearners.remove(peer); - } - } - - boolean isLearnerSynced(LearnerHandler peer){ - synchronized (forwardingFollowers) { - return forwardingFollowers.contains(peer); - } - } - - ServerSocket ss; - - Leader(QuorumPeer self,LeaderZooKeeperServer zk) throws IOException { - this.self = self; - try { - if (self.getQuorumListenOnAllIPs()) { - ss = new ServerSocket(self.getQuorumAddress().getPort()); - } else { - ss = new ServerSocket(); - } - ss.setReuseAddress(true); - if (!self.getQuorumListenOnAllIPs()) { - ss.bind(self.getQuorumAddress()); - } - } catch (BindException e) { - if (self.getQuorumListenOnAllIPs()) { - LOG.error("Couldn't bind to port " + self.getQuorumAddress().getPort(), e); - } else { - LOG.error("Couldn't bind to " + self.getQuorumAddress(), e); - } - throw e; - } - this.zk=zk; - } - - /** - * This message is for follower to expect diff - */ - final static int DIFF = 13; - - /** - * This is for follower to truncate its logs - */ - final static int TRUNC = 14; - - /** - * This is for follower to download the snapshots - */ - final static int SNAP = 15; - - /** - * This tells the leader that the connecting peer is actually an observer - */ - final static int OBSERVERINFO = 16; - - /** - * This message type is sent by the leader to indicate it's zxid and if - * needed, its database. - */ - final static int NEWLEADER = 10; - - /** - * This message type is sent by a follower to pass the last zxid. This is here - * for backward compatibility purposes. - */ - final static int FOLLOWERINFO = 11; - - /** - * This message type is sent by the leader to indicate that the follower is - * now uptodate andt can start responding to clients. - */ - final static int UPTODATE = 12; - - /** - * This message is the first that a follower receives from the leader. - * It has the protocol version and the epoch of the leader. - */ - public static final int LEADERINFO = 17; - - /** - * This message is used by the follow to ack a proposed epoch. - */ - public static final int ACKEPOCH = 18; - - /** - * This message type is sent to a leader to request and mutation operation. - * The payload will consist of a request header followed by a request. - */ - final static int REQUEST = 1; - - /** - * This message type is sent by a leader to propose a mutation. - */ - public final static int PROPOSAL = 2; - - /** - * This message type is sent by a follower after it has synced a proposal. - */ - final static int ACK = 3; - - /** - * This message type is sent by a leader to commit a proposal and cause - * followers to start serving the corresponding data. - */ - final static int COMMIT = 4; - - /** - * This message type is enchanged between follower and leader (initiated by - * follower) to determine liveliness. - */ - final static int PING = 5; - - /** - * This message type is to validate a session that should be active. - */ - final static int REVALIDATE = 6; - - /** - * This message is a reply to a synchronize command flushing the pipe - * between the leader and the follower. - */ - final static int SYNC = 7; - - /** - * This message type informs observers of a committed proposal. - */ - final static int INFORM = 8; - - ConcurrentMap outstandingProposals = new ConcurrentHashMap(); - - ConcurrentLinkedQueue toBeApplied = new ConcurrentLinkedQueue(); - - Proposal newLeaderProposal = new Proposal(); - - class LearnerCnxAcceptor extends Thread{ - private volatile boolean stop = false; - - @Override - public void run() { - try { - while (!stop) { - try{ - Socket s = ss.accept(); - // start with the initLimit, once the ack is processed - // in LearnerHandler switch to the syncLimit - s.setSoTimeout(self.tickTime * self.initLimit); - s.setTcpNoDelay(nodelay); - LearnerHandler fh = new LearnerHandler(s, Leader.this); - fh.start(); - } catch (SocketException e) { - if (stop) { - LOG.info("exception while shutting down acceptor: " - + e); - - // When Leader.shutdown() calls ss.close(), - // the call to accept throws an exception. - // We catch and set stop to true. - stop = true; - } else { - throw e; - } - } - } - } catch (Exception e) { - LOG.warn("Exception while accepting follower", e); - } - } - - public void halt() { - stop = true; - } - } - - StateSummary leaderStateSummary; - - long epoch = -1; - boolean waitingForNewEpoch = true; - volatile boolean readyToStart = false; - - /** - * This method is main function that is called to lead - * - * @throws IOException - * @throws InterruptedException - */ - void lead() throws IOException, InterruptedException { - self.end_fle = System.currentTimeMillis(); - LOG.info("LEADING - LEADER ELECTION TOOK - " + - (self.end_fle - self.start_fle)); - self.start_fle = 0; - self.end_fle = 0; - - zk.registerJMX(new LeaderBean(this, zk), self.jmxLocalPeerBean); - - try { - self.tick = 0; - zk.loadData(); - - leaderStateSummary = new StateSummary(self.getCurrentEpoch(), zk.getLastProcessedZxid()); - - // Start thread that waits for connection requests from - // new followers. - cnxAcceptor = new LearnerCnxAcceptor(); - cnxAcceptor.start(); - - readyToStart = true; - long epoch = getEpochToPropose(self.getId(), self.getAcceptedEpoch()); - - zk.setZxid(ZxidUtils.makeZxid(epoch, 0)); - - synchronized(this){ - lastProposed = zk.getZxid(); - } - - newLeaderProposal.packet = new QuorumPacket(NEWLEADER, zk.getZxid(), - null, null); - - - if ((newLeaderProposal.packet.getZxid() & 0xffffffffL) != 0) { - LOG.info("NEWLEADER proposal has Zxid of " - + Long.toHexString(newLeaderProposal.packet.getZxid())); - } - - waitForEpochAck(self.getId(), leaderStateSummary); - self.setCurrentEpoch(epoch); - - // We have to get at least a majority of servers in sync with - // us. We do this by waiting for the NEWLEADER packet to get - // acknowledged - try { - waitForNewLeaderAck(self.getId(), zk.getZxid(), LearnerType.PARTICIPANT); - } catch (InterruptedException e) { - shutdown("Waiting for a quorum of followers, only synced with sids: [ " - + getSidSetString(newLeaderProposal.ackSet) + " ]"); - HashSet followerSet = new HashSet(); - for (LearnerHandler f : learners) - followerSet.add(f.getSid()); - - if (self.getQuorumVerifier().containsQuorum(followerSet)) { - LOG.warn("Enough followers present. " - + "Perhaps the initTicks need to be increased."); - } - Thread.sleep(self.tickTime); - self.tick++; - return; - } - - startZkServer(); - - /** - * WARNING: do not use this for anything other than QA testing - * on a real cluster. Specifically to enable verification that quorum - * can handle the lower 32bit roll-over issue identified in - * ZOOKEEPER-1277. Without this option it would take a very long - * time (on order of a month say) to see the 4 billion writes - * necessary to cause the roll-over to occur. - * - * This field allows you to override the zxid of the server. Typically - * you'll want to set it to something like 0xfffffff0 and then - * start the quorum, run some operations and see the re-election. - */ - String initialZxid = System.getProperty("zookeeper.testingonly.initialZxid"); - if (initialZxid != null) { - long zxid = Long.parseLong(initialZxid); - zk.setZxid((zk.getZxid() & 0xffffffff00000000L) | zxid); - } - - if (!System.getProperty("zookeeper.leaderServes", "yes").equals("no")) { - self.cnxnFactory.setZooKeeperServer(zk); - } - // Everything is a go, simply start counting the ticks - // WARNING: I couldn't find any wait statement on a synchronized - // block that would be notified by this notifyAll() call, so - // I commented it out - //synchronized (this) { - // notifyAll(); - //} - // We ping twice a tick, so we only update the tick every other - // iteration - boolean tickSkip = true; - - while (true) { - Thread.sleep(self.tickTime / 2); - if (!tickSkip) { - self.tick++; - } - HashSet syncedSet = new HashSet(); - - // lock on the followers when we use it. - syncedSet.add(self.getId()); - - for (LearnerHandler f : getLearners()) { - // Synced set is used to check we have a supporting quorum, so only - // PARTICIPANT, not OBSERVER, learners should be used - if (f.synced() && f.getLearnerType() == LearnerType.PARTICIPANT) { - syncedSet.add(f.getSid()); - } - f.ping(); - } - - if (!tickSkip && !self.getQuorumVerifier().containsQuorum(syncedSet)) { - //if (!tickSkip && syncedCount < self.quorumPeers.size() / 2) { - // Lost quorum, shutdown - shutdown("Not sufficient followers synced, only synced with sids: [ " - + getSidSetString(syncedSet) + " ]"); - // make sure the order is the same! - // the leader goes to looking - return; - } - tickSkip = !tickSkip; - } - } finally { - zk.unregisterJMX(this); - } - } - - boolean isShutdown; - - /** - * Close down all the LearnerHandlers - */ - void shutdown(String reason) { - LOG.info("Shutting down"); - - if (isShutdown) { - return; - } - - LOG.info("Shutdown called", - new Exception("shutdown Leader! reason: " + reason)); - - if (cnxAcceptor != null) { - cnxAcceptor.halt(); - } - - // NIO should not accept conenctions - self.cnxnFactory.setZooKeeperServer(null); - try { - ss.close(); - } catch (IOException e) { - LOG.warn("Ignoring unexpected exception during close",e); - } - // clear all the connections - self.cnxnFactory.closeAll(); - // shutdown the previous zk - if (zk != null) { - zk.shutdown(); - } - synchronized (learners) { - for (Iterator it = learners.iterator(); it - .hasNext();) { - LearnerHandler f = it.next(); - it.remove(); - f.shutdown(); - } - } - isShutdown = true; - } - - /** - * Keep a count of acks that are received by the leader for a particular - * proposal - * - * @param zxid - * the zxid of the proposal sent out - * @param followerAddr - */ - synchronized public void processAck(long sid, long zxid, SocketAddress followerAddr) { - if (LOG.isTraceEnabled()) { - LOG.trace("Ack zxid: 0x{}", Long.toHexString(zxid)); - for (Proposal p : outstandingProposals.values()) { - long packetZxid = p.packet.getZxid(); - LOG.trace("outstanding proposal: 0x{}", - Long.toHexString(packetZxid)); - } - LOG.trace("outstanding proposals all"); - } - - if ((zxid & 0xffffffffL) == 0) { - /* - * We no longer process NEWLEADER ack by this method. However, - * the learner sends ack back to the leader after it gets UPTODATE - * so we just ignore the message. - */ - return; - } - - if (outstandingProposals.size() == 0) { - if (LOG.isDebugEnabled()) { - LOG.debug("outstanding is 0"); - } - return; - } - if (lastCommitted >= zxid) { - if (LOG.isDebugEnabled()) { - LOG.debug("proposal has already been committed, pzxid: 0x{} zxid: 0x{}", - Long.toHexString(lastCommitted), Long.toHexString(zxid)); - } - // The proposal has already been committed - return; - } - Proposal p = outstandingProposals.get(zxid); - if (p == null) { - LOG.warn("Trying to commit future proposal: zxid 0x{} from {}", - Long.toHexString(zxid), followerAddr); - return; - } - - p.ackSet.add(sid); - if (LOG.isDebugEnabled()) { - LOG.debug("Count for zxid: 0x{} is {}", - Long.toHexString(zxid), p.ackSet.size()); - } - if (self.getQuorumVerifier().containsQuorum(p.ackSet)){ - if (zxid != lastCommitted+1) { - LOG.warn("Commiting zxid 0x{} from {} not first!", - Long.toHexString(zxid), followerAddr); - LOG.warn("First is 0x{}", Long.toHexString(lastCommitted + 1)); - } - outstandingProposals.remove(zxid); - if (p.request != null) { - toBeApplied.add(p); - } - - if (p.request == null) { - LOG.warn("Going to commmit null request for proposal: {}", p); - } - commit(zxid); - inform(p); - zk.commitProcessor.commit(p.request); - if(pendingSyncs.containsKey(zxid)){ - for(LearnerSyncRequest r: pendingSyncs.remove(zxid)) { - sendSync(r); - } - } - } - } - - static class ToBeAppliedRequestProcessor implements RequestProcessor { - private RequestProcessor next; - - private ConcurrentLinkedQueue toBeApplied; - - /** - * This request processor simply maintains the toBeApplied list. For - * this to work next must be a FinalRequestProcessor and - * FinalRequestProcessor.processRequest MUST process the request - * synchronously! - * - * @param next - * a reference to the FinalRequestProcessor - */ - ToBeAppliedRequestProcessor(RequestProcessor next, - ConcurrentLinkedQueue toBeApplied) { - if (!(next instanceof FinalRequestProcessor)) { - throw new RuntimeException(ToBeAppliedRequestProcessor.class - .getName() - + " must be connected to " - + FinalRequestProcessor.class.getName() - + " not " - + next.getClass().getName()); - } - this.toBeApplied = toBeApplied; - this.next = next; - } - - /* - * (non-Javadoc) - * - * @see org.apache.zookeeper.server.RequestProcessor#processRequest(org.apache.zookeeper.server.Request) - */ - public void processRequest(Request request) throws RequestProcessorException { - // request.addRQRec(">tobe"); - next.processRequest(request); - Proposal p = toBeApplied.peek(); - if (p != null && p.request != null - && p.request.zxid == request.zxid) { - toBeApplied.remove(); - } - } - - /* - * (non-Javadoc) - * - * @see org.apache.zookeeper.server.RequestProcessor#shutdown() - */ - public void shutdown() { - LOG.info("Shutting down"); - next.shutdown(); - } - } - - /** - * send a packet to all the followers ready to follow - * - * @param qp - * the packet to be sent - */ - void sendPacket(QuorumPacket qp) { - synchronized (forwardingFollowers) { - for (LearnerHandler f : forwardingFollowers) { - f.queuePacket(qp); - } - } - } - - /** - * send a packet to all observers - */ - void sendObserverPacket(QuorumPacket qp) { - for (LearnerHandler f : getObservingLearners()) { - f.queuePacket(qp); - } - } - - long lastCommitted = -1; - - /** - * Create a commit packet and send it to all the members of the quorum - * - * @param zxid - */ - public void commit(long zxid) { - synchronized(this){ - lastCommitted = zxid; - } - QuorumPacket qp = new QuorumPacket(Leader.COMMIT, zxid, null, null); - sendPacket(qp); - } - - /** - * Create an inform packet and send it to all observers. - * @param zxid - * @param proposal - */ - public void inform(Proposal proposal) { - QuorumPacket qp = new QuorumPacket(Leader.INFORM, proposal.request.zxid, - proposal.packet.getData(), null); - sendObserverPacket(qp); - } - - long lastProposed; - - - /** - * Returns the current epoch of the leader. - * - * @return - */ - public long getEpoch(){ - return ZxidUtils.getEpochFromZxid(lastProposed); - } - - @SuppressWarnings("serial") - public static class XidRolloverException extends Exception { - public XidRolloverException(String message) { - super(message); - } - } - - /** - * create a proposal and send it out to all the members - * - * @param request - * @return the proposal that is queued to send to all the members - */ - public Proposal propose(Request request) throws XidRolloverException { - /** - * Address the rollover issue. All lower 32bits set indicate a new leader - * election. Force a re-election instead. See ZOOKEEPER-1277 - */ - if ((request.zxid & 0xffffffffL) == 0xffffffffL) { - String msg = - "zxid lower 32 bits have rolled over, forcing re-election, and therefore new epoch start"; - shutdown(msg); - throw new XidRolloverException(msg); - } - - ByteArrayOutputStream baos = new ByteArrayOutputStream(); - BinaryOutputArchive boa = BinaryOutputArchive.getArchive(baos); - try { - request.hdr.serialize(boa, "hdr"); - if (request.txn != null) { - request.txn.serialize(boa, "txn"); - } - baos.close(); - } catch (IOException e) { - LOG.warn("This really should be impossible", e); - } - QuorumPacket pp = new QuorumPacket(Leader.PROPOSAL, request.zxid, - baos.toByteArray(), null); - - Proposal p = new Proposal(); - p.packet = pp; - p.request = request; - synchronized (this) { - if (LOG.isDebugEnabled()) { - LOG.debug("Proposing:: " + request); - } - - lastProposed = p.packet.getZxid(); - outstandingProposals.put(lastProposed, p); - sendPacket(pp); - } - return p; - } - - /** - * Process sync requests - * - * @param r the request - */ - - synchronized public void processSync(LearnerSyncRequest r){ - if(outstandingProposals.isEmpty()){ - sendSync(r); - } else { - List l = pendingSyncs.get(lastProposed); - if (l == null) { - l = new ArrayList(); - } - l.add(r); - pendingSyncs.put(lastProposed, l); - } - } - - /** - * Sends a sync message to the appropriate server - * - * @param f - * @param r - */ - - public void sendSync(LearnerSyncRequest r){ - QuorumPacket qp = new QuorumPacket(Leader.SYNC, 0, null, null); - r.fh.queuePacket(qp); - } - - /** - * lets the leader know that a follower is capable of following and is done - * syncing - * - * @param handler handler of the follower - * @return last proposed zxid - */ - synchronized public long startForwarding(LearnerHandler handler, - long lastSeenZxid) { - // Queue up any outstanding requests enabling the receipt of - // new requests - if (lastProposed > lastSeenZxid) { - for (Proposal p : toBeApplied) { - if (p.packet.getZxid() <= lastSeenZxid) { - continue; - } - handler.queuePacket(p.packet); - // Since the proposal has been committed we need to send the - // commit message also - QuorumPacket qp = new QuorumPacket(Leader.COMMIT, p.packet - .getZxid(), null, null); - handler.queuePacket(qp); - } - // Only participant need to get outstanding proposals - if (handler.getLearnerType() == LearnerType.PARTICIPANT) { - Listzxids = new ArrayList(outstandingProposals.keySet()); - Collections.sort(zxids); - for (Long zxid: zxids) { - if (zxid <= lastSeenZxid) { - continue; - } - handler.queuePacket(outstandingProposals.get(zxid).packet); - } - } - } - if (handler.getLearnerType() == LearnerType.PARTICIPANT) { - addForwardingFollower(handler); - } else { - addObserverLearnerHandler(handler); - } - - return lastProposed; - } - - private HashSet connectingFollowers = new HashSet(); - public long getEpochToPropose(long sid, long lastAcceptedEpoch) throws InterruptedException, IOException { - synchronized(connectingFollowers) { - if (!waitingForNewEpoch) { - return epoch; - } - if (lastAcceptedEpoch >= epoch) { - epoch = lastAcceptedEpoch+1; - } - connectingFollowers.add(sid); - QuorumVerifier verifier = self.getQuorumVerifier(); - if (connectingFollowers.contains(self.getId()) && - verifier.containsQuorum(connectingFollowers)) { - waitingForNewEpoch = false; - self.setAcceptedEpoch(epoch); - connectingFollowers.notifyAll(); - } else { - long start = System.currentTimeMillis(); - long cur = start; - long end = start + self.getInitLimit()*self.getTickTime(); - while(waitingForNewEpoch && cur < end) { - connectingFollowers.wait(end - cur); - cur = System.currentTimeMillis(); - } - if (waitingForNewEpoch) { - throw new InterruptedException("Timeout while waiting for epoch from quorum"); - } - } - return epoch; - } - } - - private HashSet electingFollowers = new HashSet(); - private boolean electionFinished = false; - public void waitForEpochAck(long id, StateSummary ss) throws IOException, InterruptedException { - synchronized(electingFollowers) { - if (electionFinished) { - return; - } - if (ss.getCurrentEpoch() != -1) { - if (ss.isMoreRecentThan(leaderStateSummary)) { - throw new IOException("Follower is ahead of the leader, leader summary: " - + leaderStateSummary.getCurrentEpoch() - + " (current epoch), " - + leaderStateSummary.getLastZxid() - + " (last zxid)"); - } - electingFollowers.add(id); - } - QuorumVerifier verifier = self.getQuorumVerifier(); - if (electingFollowers.contains(self.getId()) && verifier.containsQuorum(electingFollowers)) { - electionFinished = true; - electingFollowers.notifyAll(); - } else { - long start = System.currentTimeMillis(); - long cur = start; - long end = start + self.getInitLimit()*self.getTickTime(); - while(!electionFinished && cur < end) { - electingFollowers.wait(end - cur); - cur = System.currentTimeMillis(); - } - if (!electionFinished) { - throw new InterruptedException("Timeout while waiting for epoch to be acked by quorum"); - } - } - } - } - - /** - * Return a list of sid in set as string - */ - private String getSidSetString(Set sidSet) { - StringBuilder sids = new StringBuilder(); - Iterator iter = sidSet.iterator(); - while (iter.hasNext()) { - sids.append(iter.next()); - if (!iter.hasNext()) { - break; - } - sids.append(","); - } - return sids.toString(); - } - - /** - * Start up Leader ZooKeeper server and initialize zxid to the new epoch - */ - private synchronized void startZkServer() { - // Update lastCommitted and Db's zxid to a value representing the new epoch - lastCommitted = zk.getZxid(); - LOG.info("Have quorum of supporters, sids: [ " - + getSidSetString(newLeaderProposal.ackSet) - + " ]; starting up and setting last processed zxid: 0x{}", - Long.toHexString(zk.getZxid())); - zk.startup(); - /* - * Update the election vote here to ensure that all members of the - * ensemble report the same vote to new servers that start up and - * send leader election notifications to the ensemble. - * - * @see https://issues.apache.org/jira/browse/ZOOKEEPER-1732 - */ - self.updateElectionVote(getEpoch()); - - zk.getZKDatabase().setlastProcessedZxid(zk.getZxid()); - } - - /** - * Process NEWLEADER ack of a given sid and wait until the leader receives - * sufficient acks. - * - * @param sid - * @param learnerType - * @throws InterruptedException - */ - public void waitForNewLeaderAck(long sid, long zxid, LearnerType learnerType) - throws InterruptedException { - - synchronized (newLeaderProposal.ackSet) { - - if (quorumFormed) { - return; - } - - long currentZxid = newLeaderProposal.packet.getZxid(); - if (zxid != currentZxid) { - LOG.error("NEWLEADER ACK from sid: " + sid - + " is from a different epoch - current 0x" - + Long.toHexString(currentZxid) + " receieved 0x" - + Long.toHexString(zxid)); - return; - } - - if (learnerType == LearnerType.PARTICIPANT) { - newLeaderProposal.ackSet.add(sid); - } - - if (self.getQuorumVerifier().containsQuorum( - newLeaderProposal.ackSet)) { - quorumFormed = true; - newLeaderProposal.ackSet.notifyAll(); - } else { - long start = System.currentTimeMillis(); - long cur = start; - long end = start + self.getInitLimit() * self.getTickTime(); - while (!quorumFormed && cur < end) { - newLeaderProposal.ackSet.wait(end - cur); - cur = System.currentTimeMillis(); - } - if (!quorumFormed) { - throw new InterruptedException( - "Timeout while waiting for NEWLEADER to be acked by quorum"); - } - } - } - } - - /** - * Get string representation of a given packet type - * @param packetType - * @return string representing the packet type - */ - public static String getPacketType(int packetType) { - switch (packetType) { - case DIFF: - return "DIFF"; - case TRUNC: - return "TRUNC"; - case SNAP: - return "SNAP"; - case OBSERVERINFO: - return "OBSERVERINFO"; - case NEWLEADER: - return "NEWLEADER"; - case FOLLOWERINFO: - return "FOLLOWERINFO"; - case UPTODATE: - return "UPTODATE"; - case LEADERINFO: - return "LEADERINFO"; - case ACKEPOCH: - return "ACKEPOCH"; - case REQUEST: - return "REQUEST"; - case PROPOSAL: - return "PROPOSAL"; - case ACK: - return "ACK"; - case COMMIT: - return "COMMIT"; - case PING: - return "PING"; - case REVALIDATE: - return "REVALIDATE"; - case SYNC: - return "SYNC"; - case INFORM: - return "INFORM"; - default: - return "UNKNOWN"; - } - } -} diff --git a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/quorum/LeaderBean.java b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/quorum/LeaderBean.java deleted file mode 100644 index b5a3a10ec..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/quorum/LeaderBean.java +++ /dev/null @@ -1,53 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you 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. - */ - -package org.apache.zookeeper.server.quorum; - -import org.apache.zookeeper.server.ZooKeeperServerBean; -import org.apache.zookeeper.server.ZooKeeperServer; -import org.apache.zookeeper.server.quorum.LearnerHandler; -import org.apache.zookeeper.server.quorum.Leader; - -/** - * Leader MBean interface implementation. - */ -public class LeaderBean extends ZooKeeperServerBean implements LeaderMXBean { - private final Leader leader; - - public LeaderBean(Leader leader, ZooKeeperServer zks) { - super(zks); - this.leader = leader; - } - - public String getName() { - return "Leader"; - } - - public String getCurrentZxid() { - return "0x" + Long.toHexString(zks.getZxid()); - } - - public String followerInfo() { - StringBuilder sb = new StringBuilder(); - for (LearnerHandler handler : leader.getLearners()) { - sb.append(handler.toString()).append("\n"); - } - return sb.toString(); - } - -} diff --git a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/quorum/LeaderElection.java b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/quorum/LeaderElection.java deleted file mode 100644 index a66ee789e..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/quorum/LeaderElection.java +++ /dev/null @@ -1,295 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you 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. - */ - -package org.apache.zookeeper.server.quorum; - -import java.io.IOException; -import java.net.DatagramPacket; -import java.net.DatagramSocket; -import java.net.InetSocketAddress; -import java.net.SocketException; -import java.nio.ByteBuffer; -import java.util.Collection; -import java.util.HashMap; -import java.util.HashSet; -import java.util.Iterator; -import java.util.Map; -import java.util.Random; -import java.util.Map.Entry; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import org.apache.zookeeper.jmx.MBeanRegistry; -import org.apache.zookeeper.server.quorum.Vote; -import org.apache.zookeeper.server.quorum.QuorumPeer.LearnerType; -import org.apache.zookeeper.server.quorum.QuorumPeer.QuorumServer; -import org.apache.zookeeper.server.quorum.QuorumPeer.ServerState; - -/** - * @deprecated This class has been deprecated as of release 3.4.0. - */ -@Deprecated -public class LeaderElection implements Election { - private static final Logger LOG = LoggerFactory.getLogger(LeaderElection.class); - protected static final Random epochGen = new Random(); - - protected QuorumPeer self; - - public LeaderElection(QuorumPeer self) { - this.self = self; - } - - protected static class ElectionResult { - public Vote vote; - - public int count; - - public Vote winner; - - public int winningCount; - - public int numValidVotes; - } - - protected ElectionResult countVotes(HashMap votes, HashSet heardFrom) { - final ElectionResult result = new ElectionResult(); - // Initialize with null vote - result.vote = new Vote(Long.MIN_VALUE, Long.MIN_VALUE); - result.winner = new Vote(Long.MIN_VALUE, Long.MIN_VALUE); - - // First, filter out votes from unheard-from machines. Then - // make the views consistent. Sometimes peers will have - // different zxids for a server depending on timing. - final HashMap validVotes = new HashMap(); - final Map maxZxids = new HashMap(); - for (Map.Entry e : votes.entrySet()) { - // Only include votes from machines that we heard from - final Vote v = e.getValue(); - if (heardFrom.contains(v.getId())) { - validVotes.put(e.getKey(), v); - Long val = maxZxids.get(v.getId()); - if (val == null || val < v.getZxid()) { - maxZxids.put(v.getId(), v.getZxid()); - } - } - } - - // Make all zxids for a given vote id equal to the largest zxid seen for - // that id - for (Map.Entry e : validVotes.entrySet()) { - final Vote v = e.getValue(); - Long zxid = maxZxids.get(v.getId()); - if (v.getZxid() < zxid) { - // This is safe inside an iterator as per - // http://download.oracle.com/javase/1.5.0/docs/api/java/util/Map.Entry.html - e.setValue(new Vote(v.getId(), zxid, v.getElectionEpoch(), v.getPeerEpoch(), v.getState())); - } - } - - result.numValidVotes = validVotes.size(); - - final HashMap countTable = new HashMap(); - // Now do the tally - for (Vote v : validVotes.values()) { - Integer count = countTable.get(v); - if (count == null) { - count = 0; - } - countTable.put(v, count + 1); - if (v.getId() == result.vote.getId()) { - result.count++; - } else if (v.getZxid() > result.vote.getZxid() - || (v.getZxid() == result.vote.getZxid() && v.getId() > result.vote.getId())) { - result.vote = v; - result.count = 1; - } - } - result.winningCount = 0; - LOG.info("Election tally: "); - for (Entry entry : countTable.entrySet()) { - if (entry.getValue() > result.winningCount) { - result.winningCount = entry.getValue(); - result.winner = entry.getKey(); - } - LOG.info(entry.getKey().getId() + "\t-> " + entry.getValue()); - } - return result; - } - - /** - * There is nothing to shutdown in this implementation of - * leader election, so we simply have an empty method. - */ - public void shutdown(){} - - /** - * Invoked in QuorumPeer to find or elect a new leader. - * - * @throws InterruptedException - */ - public Vote lookForLeader() throws InterruptedException { - try { - self.jmxLeaderElectionBean = new LeaderElectionBean(); - MBeanRegistry.getInstance().register( - self.jmxLeaderElectionBean, self.jmxLocalPeerBean); - } catch (Exception e) { - LOG.warn("Failed to register with JMX", e); - self.jmxLeaderElectionBean = null; - } - - try { - self.setCurrentVote(new Vote(self.getId(), - self.getLastLoggedZxid())); - // We are going to look for a leader by casting a vote for ourself - byte requestBytes[] = new byte[4]; - ByteBuffer requestBuffer = ByteBuffer.wrap(requestBytes); - byte responseBytes[] = new byte[28]; - ByteBuffer responseBuffer = ByteBuffer.wrap(responseBytes); - /* The current vote for the leader. Initially me! */ - DatagramSocket s = null; - try { - s = new DatagramSocket(); - s.setSoTimeout(200); - } catch (SocketException e1) { - LOG.error("Socket exception when creating socket for leader election", e1); - System.exit(4); - } - DatagramPacket requestPacket = new DatagramPacket(requestBytes, - requestBytes.length); - DatagramPacket responsePacket = new DatagramPacket(responseBytes, - responseBytes.length); - int xid = epochGen.nextInt(); - while (self.isRunning()) { - HashMap votes = - new HashMap(self.getVotingView().size()); - - requestBuffer.clear(); - requestBuffer.putInt(xid); - requestPacket.setLength(4); - HashSet heardFrom = new HashSet(); - for (QuorumServer server : self.getVotingView().values()) { - LOG.info("Server address: " + server.addr); - try { - requestPacket.setSocketAddress(server.addr); - } catch (IllegalArgumentException e) { - // Sun doesn't include the address that causes this - // exception to be thrown, so we wrap the exception - // in order to capture this critical detail. - throw new IllegalArgumentException( - "Unable to set socket address on packet, msg:" - + e.getMessage() + " with addr:" + server.addr, - e); - } - - try { - s.send(requestPacket); - responsePacket.setLength(responseBytes.length); - s.receive(responsePacket); - if (responsePacket.getLength() != responseBytes.length) { - LOG.error("Got a short response: " - + responsePacket.getLength()); - continue; - } - responseBuffer.clear(); - int recvedXid = responseBuffer.getInt(); - if (recvedXid != xid) { - LOG.error("Got bad xid: expected " + xid - + " got " + recvedXid); - continue; - } - long peerId = responseBuffer.getLong(); - heardFrom.add(peerId); - //if(server.id != peerId){ - Vote vote = new Vote(responseBuffer.getLong(), - responseBuffer.getLong()); - InetSocketAddress addr = - (InetSocketAddress) responsePacket - .getSocketAddress(); - votes.put(addr, vote); - //} - } catch (IOException e) { - LOG.warn("Ignoring exception while looking for leader", - e); - // Errors are okay, since hosts may be - // down - } - } - - ElectionResult result = countVotes(votes, heardFrom); - // ZOOKEEPER-569: - // If no votes are received for live peers, reset to voting - // for ourselves as otherwise we may hang on to a vote - // for a dead peer - if (result.numValidVotes == 0) { - self.setCurrentVote(new Vote(self.getId(), - self.getLastLoggedZxid())); - } else { - if (result.winner.getId() >= 0) { - self.setCurrentVote(result.vote); - // To do: this doesn't use a quorum verifier - if (result.winningCount > (self.getVotingView().size() / 2)) { - self.setCurrentVote(result.winner); - s.close(); - Vote current = self.getCurrentVote(); - LOG.info("Found leader: my type is: " + self.getLearnerType()); - /* - * We want to make sure we implement the state machine - * correctly. If we are a PARTICIPANT, once a leader - * is elected we can move either to LEADING or - * FOLLOWING. However if we are an OBSERVER, it is an - * error to be elected as a Leader. - */ - if (self.getLearnerType() == LearnerType.OBSERVER) { - if (current.getId() == self.getId()) { - // This should never happen! - LOG.error("OBSERVER elected as leader!"); - Thread.sleep(100); - } - else { - self.setPeerState(ServerState.OBSERVING); - Thread.sleep(100); - return current; - } - } else { - self.setPeerState((current.getId() == self.getId()) - ? ServerState.LEADING: ServerState.FOLLOWING); - if (self.getPeerState() == ServerState.FOLLOWING) { - Thread.sleep(100); - } - return current; - } - } - } - } - Thread.sleep(1000); - } - return null; - } finally { - try { - if(self.jmxLeaderElectionBean != null){ - MBeanRegistry.getInstance().unregister( - self.jmxLeaderElectionBean); - } - } catch (Exception e) { - LOG.warn("Failed to unregister with JMX", e); - } - self.jmxLeaderElectionBean = null; - } - } -} diff --git a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/quorum/LeaderElectionBean.java b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/quorum/LeaderElectionBean.java deleted file mode 100644 index 7c20a58ca..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/quorum/LeaderElectionBean.java +++ /dev/null @@ -1,42 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you 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. - */ - -package org.apache.zookeeper.server.quorum; - -import java.util.Date; - -import org.apache.zookeeper.jmx.ZKMBeanInfo; - -/** - * Leader election MBean interface implementation - */ -public class LeaderElectionBean implements LeaderElectionMXBean, ZKMBeanInfo { - private final Date startTime = new Date(); - - public String getName() { - return "LeaderElection"; - } - - public boolean isHidden() { - return false; - } - - public String getStartTime() { - return startTime.toString(); - } -} diff --git a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/quorum/LeaderElectionMXBean.java b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/quorum/LeaderElectionMXBean.java deleted file mode 100644 index 406d153c9..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/quorum/LeaderElectionMXBean.java +++ /dev/null @@ -1,31 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you 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. - */ - -package org.apache.zookeeper.server.quorum; - - -/** - * Leader election protocol MBean. - */ -public interface LeaderElectionMXBean { - /** - * - * @return the time when the leader election started - */ - public String getStartTime(); -} diff --git a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/quorum/LeaderMXBean.java b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/quorum/LeaderMXBean.java deleted file mode 100644 index bf08104ec..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/quorum/LeaderMXBean.java +++ /dev/null @@ -1,36 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you 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. - */ - -package org.apache.zookeeper.server.quorum; - -import org.apache.zookeeper.server.ZooKeeperServerMXBean; - -/** - * Leader MBean. - */ -public interface LeaderMXBean extends ZooKeeperServerMXBean { - /** - * Current zxid of cluster. - */ - public String getCurrentZxid(); - - /** - * @return information on current followers - */ - public String followerInfo(); -} diff --git a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/quorum/LeaderZooKeeperServer.java b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/quorum/LeaderZooKeeperServer.java deleted file mode 100644 index 575f73d41..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/quorum/LeaderZooKeeperServer.java +++ /dev/null @@ -1,180 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you 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. - */ - -package org.apache.zookeeper.server.quorum; - -import java.io.IOException; - -import org.apache.zookeeper.KeeperException.SessionExpiredException; -import org.apache.zookeeper.jmx.MBeanRegistry; -import org.apache.zookeeper.server.DataTreeBean; -import org.apache.zookeeper.server.FinalRequestProcessor; -import org.apache.zookeeper.server.PrepRequestProcessor; -import org.apache.zookeeper.server.RequestProcessor; -import org.apache.zookeeper.server.ServerCnxn; -import org.apache.zookeeper.server.SessionTrackerImpl; -import org.apache.zookeeper.server.ZKDatabase; -import org.apache.zookeeper.server.persistence.FileTxnSnapLog; - -/** - * - * Just like the standard ZooKeeperServer. We just replace the request - * processors: PrepRequestProcessor -> ProposalRequestProcessor -> - * CommitProcessor -> Leader.ToBeAppliedRequestProcessor -> - * FinalRequestProcessor - */ -public class LeaderZooKeeperServer extends QuorumZooKeeperServer { - CommitProcessor commitProcessor; - - /** - * @param port - * @param dataDir - * @throws IOException - */ - LeaderZooKeeperServer(FileTxnSnapLog logFactory, QuorumPeer self, - DataTreeBuilder treeBuilder, ZKDatabase zkDb) throws IOException { - super(logFactory, self.tickTime, self.minSessionTimeout, - self.maxSessionTimeout, treeBuilder, zkDb, self); - } - - public Leader getLeader(){ - return self.leader; - } - - @Override - protected void setupRequestProcessors() { - RequestProcessor finalProcessor = new FinalRequestProcessor(this); - RequestProcessor toBeAppliedProcessor = new Leader.ToBeAppliedRequestProcessor( - finalProcessor, getLeader().toBeApplied); - commitProcessor = new CommitProcessor(toBeAppliedProcessor, - Long.toString(getServerId()), false); - commitProcessor.start(); - ProposalRequestProcessor proposalProcessor = new ProposalRequestProcessor(this, - commitProcessor); - proposalProcessor.initialize(); - firstProcessor = new PrepRequestProcessor(this, proposalProcessor); - ((PrepRequestProcessor)firstProcessor).start(); - } - - @Override - public int getGlobalOutstandingLimit() { - return super.getGlobalOutstandingLimit() / (self.getQuorumSize() - 1); - } - - @Override - public void createSessionTracker() { - sessionTracker = new SessionTrackerImpl(this, getZKDatabase().getSessionWithTimeOuts(), - tickTime, self.getId()); - } - - @Override - protected void startSessionTracker() { - ((SessionTrackerImpl)sessionTracker).start(); - } - - - public boolean touch(long sess, int to) { - return sessionTracker.touchSession(sess, to); - } - - @Override - protected void registerJMX() { - // register with JMX - try { - jmxDataTreeBean = new DataTreeBean(getZKDatabase().getDataTree()); - MBeanRegistry.getInstance().register(jmxDataTreeBean, jmxServerBean); - } catch (Exception e) { - LOG.warn("Failed to register with JMX", e); - jmxDataTreeBean = null; - } - } - - public void registerJMX(LeaderBean leaderBean, - LocalPeerBean localPeerBean) - { - // register with JMX - if (self.jmxLeaderElectionBean != null) { - try { - MBeanRegistry.getInstance().unregister(self.jmxLeaderElectionBean); - } catch (Exception e) { - LOG.warn("Failed to register with JMX", e); - } - self.jmxLeaderElectionBean = null; - } - - try { - jmxServerBean = leaderBean; - MBeanRegistry.getInstance().register(leaderBean, localPeerBean); - } catch (Exception e) { - LOG.warn("Failed to register with JMX", e); - jmxServerBean = null; - } - } - - @Override - protected void unregisterJMX() { - // unregister from JMX - try { - if (jmxDataTreeBean != null) { - MBeanRegistry.getInstance().unregister(jmxDataTreeBean); - } - } catch (Exception e) { - LOG.warn("Failed to unregister with JMX", e); - } - jmxDataTreeBean = null; - } - - protected void unregisterJMX(Leader leader) { - // unregister from JMX - try { - if (jmxServerBean != null) { - MBeanRegistry.getInstance().unregister(jmxServerBean); - } - } catch (Exception e) { - LOG.warn("Failed to unregister with JMX", e); - } - jmxServerBean = null; - } - - @Override - public String getState() { - return "leader"; - } - - /** - * Returns the id of the associated QuorumPeer, which will do for a unique - * id of this server. - */ - @Override - public long getServerId() { - return self.getId(); - } - - @Override - protected void revalidateSession(ServerCnxn cnxn, long sessionId, - int sessionTimeout) throws IOException { - super.revalidateSession(cnxn, sessionId, sessionTimeout); - try { - // setowner as the leader itself, unless updated - // via the follower handlers - setOwner(sessionId, ServerCnxn.me); - } catch (SessionExpiredException e) { - // this is ok, it just means that the session revalidation failed. - } - } -} diff --git a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/quorum/Learner.java b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/quorum/Learner.java deleted file mode 100644 index 0af88449b..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/quorum/Learner.java +++ /dev/null @@ -1,549 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you 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. - */ -package org.apache.zookeeper.server.quorum; - -import java.io.BufferedInputStream; -import java.io.BufferedOutputStream; -import java.io.ByteArrayInputStream; -import java.io.ByteArrayOutputStream; -import java.io.DataInputStream; -import java.io.DataOutputStream; -import java.io.File; -import java.io.IOException; -import java.net.ConnectException; -import java.net.InetSocketAddress; -import java.net.Socket; -import java.nio.ByteBuffer; -import java.util.HashMap; -import java.util.LinkedList; -import java.util.Map.Entry; -import java.util.concurrent.ConcurrentHashMap; - -import org.apache.jute.BinaryInputArchive; -import org.apache.jute.BinaryOutputArchive; -import org.apache.jute.InputArchive; -import org.apache.jute.OutputArchive; -import org.apache.jute.Record; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.apache.zookeeper.server.Request; -import org.apache.zookeeper.server.ServerCnxn; -import org.apache.zookeeper.server.ZooTrace; -import org.apache.zookeeper.server.quorum.QuorumPeer.QuorumServer; -import org.apache.zookeeper.server.util.SerializeUtils; -import org.apache.zookeeper.server.util.ZxidUtils; -import org.apache.zookeeper.txn.TxnHeader; - -/** - * This class is the superclass of two of the three main actors in a ZK - * ensemble: Followers and Observers. Both Followers and Observers share - * a good deal of code which is moved into Peer to avoid duplication. - */ -public class Learner { - static class PacketInFlight { - TxnHeader hdr; - Record rec; - } - QuorumPeer self; - LearnerZooKeeperServer zk; - - protected BufferedOutputStream bufferedOutput; - - protected Socket sock; - - /** - * Socket getter - * @return - */ - public Socket getSocket() { - return sock; - } - - protected InputArchive leaderIs; - protected OutputArchive leaderOs; - /** the protocol version of the leader */ - protected int leaderProtocolVersion = 0x01; - - protected static final Logger LOG = LoggerFactory.getLogger(Learner.class); - - static final private boolean nodelay = System.getProperty("follower.nodelay", "true").equals("true"); - static { - LOG.info("TCP NoDelay set to: " + nodelay); - } - - final ConcurrentHashMap pendingRevalidations = - new ConcurrentHashMap(); - - public int getPendingRevalidationsCount() { - return pendingRevalidations.size(); - } - - /** - * validate a session for a client - * - * @param clientId - * the client to be revalidated - * @param timeout - * the timeout for which the session is valid - * @return - * @throws IOException - */ - void validateSession(ServerCnxn cnxn, long clientId, int timeout) - throws IOException { - LOG.info("Revalidating client: 0x" + Long.toHexString(clientId)); - ByteArrayOutputStream baos = new ByteArrayOutputStream(); - DataOutputStream dos = new DataOutputStream(baos); - dos.writeLong(clientId); - dos.writeInt(timeout); - dos.close(); - QuorumPacket qp = new QuorumPacket(Leader.REVALIDATE, -1, baos - .toByteArray(), null); - pendingRevalidations.put(clientId, cnxn); - if (LOG.isTraceEnabled()) { - ZooTrace.logTraceMessage(LOG, - ZooTrace.SESSION_TRACE_MASK, - "To validate session 0x" - + Long.toHexString(clientId)); - } - writePacket(qp, true); - } - - /** - * write a packet to the leader - * - * @param pp - * the proposal packet to be sent to the leader - * @throws IOException - */ - void writePacket(QuorumPacket pp, boolean flush) throws IOException { - synchronized (leaderOs) { - if (pp != null) { - leaderOs.writeRecord(pp, "packet"); - } - if (flush) { - bufferedOutput.flush(); - } - } - } - - /** - * read a packet from the leader - * - * @param pp - * the packet to be instantiated - * @throws IOException - */ - void readPacket(QuorumPacket pp) throws IOException { - synchronized (leaderIs) { - leaderIs.readRecord(pp, "packet"); - } - long traceMask = ZooTrace.SERVER_PACKET_TRACE_MASK; - if (pp.getType() == Leader.PING) { - traceMask = ZooTrace.SERVER_PING_TRACE_MASK; - } - if (LOG.isTraceEnabled()) { - ZooTrace.logQuorumPacket(LOG, traceMask, 'i', pp); - } - } - - /** - * send a request packet to the leader - * - * @param request - * the request from the client - * @throws IOException - */ - void request(Request request) throws IOException { - ByteArrayOutputStream baos = new ByteArrayOutputStream(); - DataOutputStream oa = new DataOutputStream(baos); - oa.writeLong(request.sessionId); - oa.writeInt(request.cxid); - oa.writeInt(request.type); - if (request.request != null) { - request.request.rewind(); - int len = request.request.remaining(); - byte b[] = new byte[len]; - request.request.get(b); - request.request.rewind(); - oa.write(b); - } - oa.close(); - QuorumPacket qp = new QuorumPacket(Leader.REQUEST, -1, baos - .toByteArray(), request.authInfo); - writePacket(qp, true); - } - - /** - * Returns the address of the node we think is the leader. - */ - protected InetSocketAddress findLeader() { - InetSocketAddress addr = null; - // Find the leader by id - Vote current = self.getCurrentVote(); - for (QuorumServer s : self.getView().values()) { - if (s.id == current.getId()) { - addr = s.addr; - break; - } - } - if (addr == null) { - LOG.warn("Couldn't find the leader with id = " - + current.getId()); - } - return addr; - } - - /** - * Establish a connection with the Leader found by findLeader. Retries - * 5 times before giving up. - * @param addr - the address of the Leader to connect to. - * @throws IOException - if the socket connection fails on the 5th attempt - * @throws ConnectException - * @throws InterruptedException - */ - protected void connectToLeader(InetSocketAddress addr) - throws IOException, ConnectException, InterruptedException { - sock = new Socket(); - sock.setSoTimeout(self.tickTime * self.initLimit); - for (int tries = 0; tries < 5; tries++) { - try { - sock.connect(addr, self.tickTime * self.syncLimit); - sock.setTcpNoDelay(nodelay); - break; - } catch (IOException e) { - if (tries == 4) { - LOG.error("Unexpected exception",e); - throw e; - } else { - LOG.warn("Unexpected exception, tries="+tries+ - ", connecting to " + addr,e); - sock = new Socket(); - sock.setSoTimeout(self.tickTime * self.initLimit); - } - } - Thread.sleep(1000); - } - leaderIs = BinaryInputArchive.getArchive(new BufferedInputStream( - sock.getInputStream())); - bufferedOutput = new BufferedOutputStream(sock.getOutputStream()); - leaderOs = BinaryOutputArchive.getArchive(bufferedOutput); - } - - /** - * Once connected to the leader, perform the handshake protocol to - * establish a following / observing connection. - * @param pktType - * @return the zxid the Leader sends for synchronization purposes. - * @throws IOException - */ - protected long registerWithLeader(int pktType) throws IOException{ - /* - * Send follower info, including last zxid and sid - */ - long lastLoggedZxid = self.getLastLoggedZxid(); - QuorumPacket qp = new QuorumPacket(); - qp.setType(pktType); - qp.setZxid(ZxidUtils.makeZxid(self.getAcceptedEpoch(), 0)); - - /* - * Add sid to payload - */ - LearnerInfo li = new LearnerInfo(self.getId(), 0x10000); - ByteArrayOutputStream bsid = new ByteArrayOutputStream(); - BinaryOutputArchive boa = BinaryOutputArchive.getArchive(bsid); - boa.writeRecord(li, "LearnerInfo"); - qp.setData(bsid.toByteArray()); - - writePacket(qp, true); - readPacket(qp); - final long newEpoch = ZxidUtils.getEpochFromZxid(qp.getZxid()); - if (qp.getType() == Leader.LEADERINFO) { - // we are connected to a 1.0 server so accept the new epoch and read the next packet - leaderProtocolVersion = ByteBuffer.wrap(qp.getData()).getInt(); - byte epochBytes[] = new byte[4]; - final ByteBuffer wrappedEpochBytes = ByteBuffer.wrap(epochBytes); - if (newEpoch > self.getAcceptedEpoch()) { - wrappedEpochBytes.putInt((int)self.getCurrentEpoch()); - self.setAcceptedEpoch(newEpoch); - } else if (newEpoch == self.getAcceptedEpoch()) { - // since we have already acked an epoch equal to the leaders, we cannot ack - // again, but we still need to send our lastZxid to the leader so that we can - // sync with it if it does assume leadership of the epoch. - // the -1 indicates that this reply should not count as an ack for the new epoch - wrappedEpochBytes.putInt(-1); - } else { - throw new IOException("Leaders epoch, " + newEpoch + " is less than accepted epoch, " + self.getAcceptedEpoch()); - } - QuorumPacket ackNewEpoch = new QuorumPacket(Leader.ACKEPOCH, lastLoggedZxid, epochBytes, null); - writePacket(ackNewEpoch, true); - return ZxidUtils.makeZxid(newEpoch, 0); - } else { - if (newEpoch > self.getAcceptedEpoch()) { - self.setAcceptedEpoch(newEpoch); - } - if (qp.getType() != Leader.NEWLEADER) { - LOG.error("First packet should have been NEWLEADER"); - throw new IOException("First packet should have been NEWLEADER"); - } - return qp.getZxid(); - } - } - - /** - * Finally, synchronize our history with the Leader. - * @param newLeaderZxid - * @throws IOException - * @throws InterruptedException - */ - protected void syncWithLeader(long newLeaderZxid) throws IOException, InterruptedException{ - QuorumPacket ack = new QuorumPacket(Leader.ACK, 0, null, null); - QuorumPacket qp = new QuorumPacket(); - long newEpoch = ZxidUtils.getEpochFromZxid(newLeaderZxid); - - readPacket(qp); - LinkedList packetsCommitted = new LinkedList(); - LinkedList packetsNotCommitted = new LinkedList(); - synchronized (zk) { - if (qp.getType() == Leader.DIFF) { - LOG.info("Getting a diff from the leader 0x" + Long.toHexString(qp.getZxid())); - } - else if (qp.getType() == Leader.SNAP) { - LOG.info("Getting a snapshot from leader"); - // The leader is going to dump the database - // clear our own database and read - zk.getZKDatabase().clear(); - zk.getZKDatabase().deserializeSnapshot(leaderIs); - String signature = leaderIs.readString("signature"); - if (!signature.equals("BenWasHere")) { - LOG.error("Missing signature. Got " + signature); - throw new IOException("Missing signature"); - } - } else if (qp.getType() == Leader.TRUNC) { - //we need to truncate the log to the lastzxid of the leader - LOG.warn("Truncating log to get in sync with the leader 0x" - + Long.toHexString(qp.getZxid())); - boolean truncated=zk.getZKDatabase().truncateLog(qp.getZxid()); - if (!truncated) { - // not able to truncate the log - LOG.error("Not able to truncate the log " - + Long.toHexString(qp.getZxid())); - System.exit(13); - } - - } - else { - LOG.error("Got unexpected packet from leader " - + qp.getType() + " exiting ... " ); - System.exit(13); - - } - zk.getZKDatabase().setlastProcessedZxid(qp.getZxid()); - zk.createSessionTracker(); - - long lastQueued = 0; - - // in V1.0 we take a snapshot when we get the NEWLEADER message, but in pre V1.0 - // we take the snapshot at the UPDATE, since V1.0 also gets the UPDATE (after the NEWLEADER) - // we need to make sure that we don't take the snapshot twice. - boolean snapshotTaken = false; - // we are now going to start getting transactions to apply followed by an UPTODATE - outerLoop: - while (self.isRunning()) { - readPacket(qp); - switch(qp.getType()) { - case Leader.PROPOSAL: - PacketInFlight pif = new PacketInFlight(); - pif.hdr = new TxnHeader(); - pif.rec = SerializeUtils.deserializeTxn(qp.getData(), pif.hdr); - if (pif.hdr.getZxid() != lastQueued + 1) { - LOG.warn("Got zxid 0x" - + Long.toHexString(pif.hdr.getZxid()) - + " expected 0x" - + Long.toHexString(lastQueued + 1)); - } - lastQueued = pif.hdr.getZxid(); - packetsNotCommitted.add(pif); - break; - case Leader.COMMIT: - if (!snapshotTaken) { - pif = packetsNotCommitted.peekFirst(); - if (pif.hdr.getZxid() != qp.getZxid()) { - LOG.warn("Committing " + qp.getZxid() + ", but next proposal is " + pif.hdr.getZxid()); - } else { - zk.processTxn(pif.hdr, pif.rec); - packetsNotCommitted.remove(); - } - } else { - packetsCommitted.add(qp.getZxid()); - } - break; - case Leader.INFORM: - /* - * Only observer get this type of packet. We treat this - * as receiving PROPOSAL and COMMMIT. - */ - PacketInFlight packet = new PacketInFlight(); - packet.hdr = new TxnHeader(); - packet.rec = SerializeUtils.deserializeTxn(qp.getData(), packet.hdr); - // Log warning message if txn comes out-of-order - if (packet.hdr.getZxid() != lastQueued + 1) { - LOG.warn("Got zxid 0x" - + Long.toHexString(packet.hdr.getZxid()) - + " expected 0x" - + Long.toHexString(lastQueued + 1)); - } - lastQueued = packet.hdr.getZxid(); - if (!snapshotTaken) { - // Apply to db directly if we haven't taken the snapshot - zk.processTxn(packet.hdr, packet.rec); - } else { - packetsNotCommitted.add(packet); - packetsCommitted.add(qp.getZxid()); - } - break; - case Leader.UPTODATE: - if (!snapshotTaken) { // true for the pre v1.0 case - zk.takeSnapshot(); - self.setCurrentEpoch(newEpoch); - } - self.cnxnFactory.setZooKeeperServer(zk); - break outerLoop; - case Leader.NEWLEADER: // it will be NEWLEADER in v1.0 - // Create updatingEpoch file and remove it after current - // epoch is set. QuorumPeer.loadDataBase() uses this file to - // detect the case where the server was terminated after - // taking a snapshot but before setting the current epoch. - File updating = new File(self.getTxnFactory().getSnapDir(), - QuorumPeer.UPDATING_EPOCH_FILENAME); - if (!updating.exists() && !updating.createNewFile()) { - throw new IOException("Failed to create " + - updating.toString()); - } - zk.takeSnapshot(); - self.setCurrentEpoch(newEpoch); - if (!updating.delete()) { - throw new IOException("Failed to delete " + - updating.toString()); - } - snapshotTaken = true; - writePacket(new QuorumPacket(Leader.ACK, newLeaderZxid, null, null), true); - break; - } - } - } - ack.setZxid(ZxidUtils.makeZxid(newEpoch, 0)); - writePacket(ack, true); - sock.setSoTimeout(self.tickTime * self.syncLimit); - zk.startup(); - /* - * Update the election vote here to ensure that all members of the - * ensemble report the same vote to new servers that start up and - * send leader election notifications to the ensemble. - * - * @see https://issues.apache.org/jira/browse/ZOOKEEPER-1732 - */ - self.updateElectionVote(newEpoch); - - // We need to log the stuff that came in between the snapshot and the uptodate - if (zk instanceof FollowerZooKeeperServer) { - FollowerZooKeeperServer fzk = (FollowerZooKeeperServer)zk; - for(PacketInFlight p: packetsNotCommitted) { - fzk.logRequest(p.hdr, p.rec); - } - for(Long zxid: packetsCommitted) { - fzk.commit(zxid); - } - } else if (zk instanceof ObserverZooKeeperServer) { - // Similar to follower, we need to log requests between the snapshot - // and UPTODATE - ObserverZooKeeperServer ozk = (ObserverZooKeeperServer) zk; - for (PacketInFlight p : packetsNotCommitted) { - Long zxid = packetsCommitted.peekFirst(); - if (p.hdr.getZxid() != zxid) { - // log warning message if there is no matching commit - // old leader send outstanding proposal to observer - LOG.warn("Committing " + Long.toHexString(zxid) - + ", but next proposal is " - + Long.toHexString(p.hdr.getZxid())); - continue; - } - packetsCommitted.remove(); - Request request = new Request(null, p.hdr.getClientId(), - p.hdr.getCxid(), p.hdr.getType(), null, null); - request.txn = p.rec; - request.hdr = p.hdr; - ozk.commitRequest(request); - } - } else { - // New server type need to handle in-flight packets - throw new UnsupportedOperationException("Unknown server type"); - } - } - - protected void revalidate(QuorumPacket qp) throws IOException { - ByteArrayInputStream bis = new ByteArrayInputStream(qp - .getData()); - DataInputStream dis = new DataInputStream(bis); - long sessionId = dis.readLong(); - boolean valid = dis.readBoolean(); - ServerCnxn cnxn = pendingRevalidations - .remove(sessionId); - if (cnxn == null) { - LOG.warn("Missing session 0x" - + Long.toHexString(sessionId) - + " for validation"); - } else { - zk.finishSessionInit(cnxn, valid); - } - if (LOG.isTraceEnabled()) { - ZooTrace.logTraceMessage(LOG, - ZooTrace.SESSION_TRACE_MASK, - "Session 0x" + Long.toHexString(sessionId) - + " is valid: " + valid); - } - } - - protected void ping(QuorumPacket qp) throws IOException { - // Send back the ping with our session data - ByteArrayOutputStream bos = new ByteArrayOutputStream(); - DataOutputStream dos = new DataOutputStream(bos); - HashMap touchTable = zk - .getTouchSnapshot(); - for (Entry entry : touchTable.entrySet()) { - dos.writeLong(entry.getKey()); - dos.writeInt(entry.getValue()); - } - qp.setData(bos.toByteArray()); - writePacket(qp, true); - } - - - /** - * Shutdown the Peer - */ - public void shutdown() { - // set the zookeeper server to null - self.cnxnFactory.setZooKeeperServer(null); - // clear all the connections - self.cnxnFactory.closeAll(); - // shutdown previous zookeeper - if (zk != null) { - zk.shutdown(); - } - } -} diff --git a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/quorum/LearnerHandler.java b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/quorum/LearnerHandler.java deleted file mode 100644 index 01e79dc1b..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/quorum/LearnerHandler.java +++ /dev/null @@ -1,700 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you 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. - */ - -package org.apache.zookeeper.server.quorum; - -import java.io.BufferedInputStream; -import java.io.BufferedOutputStream; -import java.io.ByteArrayInputStream; -import java.io.ByteArrayOutputStream; -import java.io.DataInputStream; -import java.io.DataOutputStream; -import java.io.IOException; -import java.net.Socket; -import java.nio.ByteBuffer; -import java.util.LinkedList; -import java.util.concurrent.LinkedBlockingQueue; -import java.util.concurrent.locks.ReentrantReadWriteLock; -import java.util.concurrent.locks.ReentrantReadWriteLock.ReadLock; - -import org.apache.jute.BinaryInputArchive; -import org.apache.jute.BinaryOutputArchive; -import org.apache.jute.Record; -import org.apache.zookeeper.KeeperException.SessionExpiredException; -import org.apache.zookeeper.ZooDefs.OpCode; -import org.apache.zookeeper.server.ByteBufferInputStream; -import org.apache.zookeeper.server.Request; -import org.apache.zookeeper.server.ZooTrace; -import org.apache.zookeeper.server.quorum.Leader.Proposal; -import org.apache.zookeeper.server.quorum.QuorumPeer.LearnerType; -import org.apache.zookeeper.server.util.SerializeUtils; -import org.apache.zookeeper.server.util.ZxidUtils; -import org.apache.zookeeper.txn.TxnHeader; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -/** - * There will be an instance of this class created by the Leader for each - * learner. All communication with a learner is handled by this - * class. - */ -public class LearnerHandler extends Thread { - private static final Logger LOG = LoggerFactory.getLogger(LearnerHandler.class); - - protected final Socket sock; - - public Socket getSocket() { - return sock; - } - - final Leader leader; - - /** Deadline for receiving the next ack. If we are bootstrapping then - * it's based on the initLimit, if we are done bootstrapping it's based - * on the syncLimit. Once the deadline is past this learner should - * be considered no longer "sync'd" with the leader. */ - volatile long tickOfNextAckDeadline; - - /** - * ZooKeeper server identifier of this learner - */ - protected long sid = 0; - - long getSid(){ - return sid; - } - - protected int version = 0x1; - - int getVersion() { - return version; - } - - /** - * The packets to be sent to the learner - */ - final LinkedBlockingQueue queuedPackets = - new LinkedBlockingQueue(); - - /** - * This class controls the time that the Leader has been - * waiting for acknowledgement of a proposal from this Learner. - * If the time is above syncLimit, the connection will be closed. - * It keeps track of only one proposal at a time, when the ACK for - * that proposal arrives, it switches to the last proposal received - * or clears the value if there is no pending proposal. - */ - private class SyncLimitCheck { - private boolean started = false; - private long currentZxid = 0; - private long currentTime = 0; - private long nextZxid = 0; - private long nextTime = 0; - - public synchronized void start() { - started = true; - } - - public synchronized void updateProposal(long zxid, long time) { - if (!started) { - return; - } - if (currentTime == 0) { - currentTime = time; - currentZxid = zxid; - } else { - nextTime = time; - nextZxid = zxid; - } - } - - public synchronized void updateAck(long zxid) { - if (currentZxid == zxid) { - currentTime = nextTime; - currentZxid = nextZxid; - nextTime = 0; - nextZxid = 0; - } else if (nextZxid == zxid) { - LOG.warn("ACK for " + zxid + " received before ACK for " + currentZxid + "!!!!"); - nextTime = 0; - nextZxid = 0; - } - } - - public synchronized boolean check(long time) { - if (currentTime == 0) { - return true; - } else { - long msDelay = (time - currentTime) / 1000000; - return (msDelay < (leader.self.tickTime * leader.self.syncLimit)); - } - } - }; - - private SyncLimitCheck syncLimitCheck = new SyncLimitCheck(); - - private BinaryInputArchive ia; - - private BinaryOutputArchive oa; - - private BufferedOutputStream bufferedOutput; - - LearnerHandler(Socket sock, Leader leader) throws IOException { - super("LearnerHandler-" + sock.getRemoteSocketAddress()); - this.sock = sock; - this.leader = leader; - leader.addLearnerHandler(this); - } - - @Override - public String toString() { - StringBuilder sb = new StringBuilder(); - sb.append("LearnerHandler ").append(sock); - sb.append(" tickOfNextAckDeadline:").append(tickOfNextAckDeadline()); - sb.append(" synced?:").append(synced()); - sb.append(" queuedPacketLength:").append(queuedPackets.size()); - return sb.toString(); - } - - /** - * If this packet is queued, the sender thread will exit - */ - final QuorumPacket proposalOfDeath = new QuorumPacket(); - - private LearnerType learnerType = LearnerType.PARTICIPANT; - public LearnerType getLearnerType() { - return learnerType; - } - - /** - * This method will use the thread to send packets added to the - * queuedPackets list - * - * @throws InterruptedException - */ - private void sendPackets() throws InterruptedException { - long traceMask = ZooTrace.SERVER_PACKET_TRACE_MASK; - while (true) { - try { - QuorumPacket p; - p = queuedPackets.poll(); - if (p == null) { - bufferedOutput.flush(); - p = queuedPackets.take(); - } - - if (p == proposalOfDeath) { - // Packet of death! - break; - } - if (p.getType() == Leader.PING) { - traceMask = ZooTrace.SERVER_PING_TRACE_MASK; - } - if (p.getType() == Leader.PROPOSAL) { - syncLimitCheck.updateProposal(p.getZxid(), System.nanoTime()); - } - if (LOG.isTraceEnabled()) { - ZooTrace.logQuorumPacket(LOG, traceMask, 'o', p); - } - oa.writeRecord(p, "packet"); - } catch (IOException e) { - if (!sock.isClosed()) { - LOG.warn("Unexpected exception at " + this, e); - try { - // this will cause everything to shutdown on - // this learner handler and will help notify - // the learner/observer instantaneously - sock.close(); - } catch(IOException ie) { - LOG.warn("Error closing socket for handler " + this, ie); - } - } - break; - } - } - } - - static public String packetToString(QuorumPacket p) { - if (true) - return null; - String type = null; - String mess = null; - Record txn = null; - - switch (p.getType()) { - case Leader.ACK: - type = "ACK"; - break; - case Leader.COMMIT: - type = "COMMIT"; - break; - case Leader.FOLLOWERINFO: - type = "FOLLOWERINFO"; - break; - case Leader.NEWLEADER: - type = "NEWLEADER"; - break; - case Leader.PING: - type = "PING"; - break; - case Leader.PROPOSAL: - type = "PROPOSAL"; - TxnHeader hdr = new TxnHeader(); - try { - txn = SerializeUtils.deserializeTxn(p.getData(), hdr); - // mess = "transaction: " + txn.toString(); - } catch (IOException e) { - LOG.warn("Unexpected exception",e); - } - break; - case Leader.REQUEST: - type = "REQUEST"; - break; - case Leader.REVALIDATE: - type = "REVALIDATE"; - ByteArrayInputStream bis = new ByteArrayInputStream(p.getData()); - DataInputStream dis = new DataInputStream(bis); - try { - long id = dis.readLong(); - mess = " sessionid = " + id; - } catch (IOException e) { - LOG.warn("Unexpected exception", e); - } - - break; - case Leader.UPTODATE: - type = "UPTODATE"; - break; - default: - type = "UNKNOWN" + p.getType(); - } - String entry = null; - if (type != null) { - entry = type + " " + Long.toHexString(p.getZxid()) + " " + mess; - } - return entry; - } - - /** - * This thread will receive packets from the peer and process them and - * also listen to new connections from new peers. - */ - @Override - public void run() { - try { - tickOfNextAckDeadline = leader.self.tick - + leader.self.initLimit + leader.self.syncLimit; - - ia = BinaryInputArchive.getArchive(new BufferedInputStream(sock - .getInputStream())); - bufferedOutput = new BufferedOutputStream(sock.getOutputStream()); - oa = BinaryOutputArchive.getArchive(bufferedOutput); - - QuorumPacket qp = new QuorumPacket(); - ia.readRecord(qp, "packet"); - if(qp.getType() != Leader.FOLLOWERINFO && qp.getType() != Leader.OBSERVERINFO){ - LOG.error("First packet " + qp.toString() - + " is not FOLLOWERINFO or OBSERVERINFO!"); - return; - } - byte learnerInfoData[] = qp.getData(); - if (learnerInfoData != null) { - if (learnerInfoData.length == 8) { - ByteBuffer bbsid = ByteBuffer.wrap(learnerInfoData); - this.sid = bbsid.getLong(); - } else { - LearnerInfo li = new LearnerInfo(); - ByteBufferInputStream.byteBuffer2Record(ByteBuffer.wrap(learnerInfoData), li); - this.sid = li.getServerid(); - this.version = li.getProtocolVersion(); - } - } else { - this.sid = leader.followerCounter.getAndDecrement(); - } - - LOG.info("Follower sid: " + sid + " : info : " - + leader.self.quorumPeers.get(sid)); - - if (qp.getType() == Leader.OBSERVERINFO) { - learnerType = LearnerType.OBSERVER; - } - - long lastAcceptedEpoch = ZxidUtils.getEpochFromZxid(qp.getZxid()); - - long peerLastZxid; - StateSummary ss = null; - long zxid = qp.getZxid(); - long newEpoch = leader.getEpochToPropose(this.getSid(), lastAcceptedEpoch); - - if (this.getVersion() < 0x10000) { - // we are going to have to extrapolate the epoch information - long epoch = ZxidUtils.getEpochFromZxid(zxid); - ss = new StateSummary(epoch, zxid); - // fake the message - leader.waitForEpochAck(this.getSid(), ss); - } else { - byte ver[] = new byte[4]; - ByteBuffer.wrap(ver).putInt(0x10000); - QuorumPacket newEpochPacket = new QuorumPacket(Leader.LEADERINFO, ZxidUtils.makeZxid(newEpoch, 0), ver, null); - oa.writeRecord(newEpochPacket, "packet"); - bufferedOutput.flush(); - QuorumPacket ackEpochPacket = new QuorumPacket(); - ia.readRecord(ackEpochPacket, "packet"); - if (ackEpochPacket.getType() != Leader.ACKEPOCH) { - LOG.error(ackEpochPacket.toString() - + " is not ACKEPOCH"); - return; - } - ByteBuffer bbepoch = ByteBuffer.wrap(ackEpochPacket.getData()); - ss = new StateSummary(bbepoch.getInt(), ackEpochPacket.getZxid()); - leader.waitForEpochAck(this.getSid(), ss); - } - peerLastZxid = ss.getLastZxid(); - - /* the default to send to the follower */ - int packetToSend = Leader.SNAP; - long zxidToSend = 0; - long leaderLastZxid = 0; - /** the packets that the follower needs to get updates from **/ - long updates = peerLastZxid; - - /* we are sending the diff check if we have proposals in memory to be able to - * send a diff to the - */ - ReentrantReadWriteLock lock = leader.zk.getZKDatabase().getLogLock(); - ReadLock rl = lock.readLock(); - try { - rl.lock(); - final long maxCommittedLog = leader.zk.getZKDatabase().getmaxCommittedLog(); - final long minCommittedLog = leader.zk.getZKDatabase().getminCommittedLog(); - LOG.info("Synchronizing with Follower sid: " + sid - +" maxCommittedLog=0x"+Long.toHexString(maxCommittedLog) - +" minCommittedLog=0x"+Long.toHexString(minCommittedLog) - +" peerLastZxid=0x"+Long.toHexString(peerLastZxid)); - - LinkedList proposals = leader.zk.getZKDatabase().getCommittedLog(); - - if (proposals.size() != 0) { - LOG.debug("proposal size is {}", proposals.size()); - if ((maxCommittedLog >= peerLastZxid) - && (minCommittedLog <= peerLastZxid)) { - LOG.debug("Sending proposals to follower"); - - // as we look through proposals, this variable keeps track of previous - // proposal Id. - long prevProposalZxid = minCommittedLog; - - // Keep track of whether we are about to send the first packet. - // Before sending the first packet, we have to tell the learner - // whether to expect a trunc or a diff - boolean firstPacket=true; - - // If we are here, we can use committedLog to sync with - // follower. Then we only need to decide whether to - // send trunc or not - packetToSend = Leader.DIFF; - zxidToSend = maxCommittedLog; - - for (Proposal propose: proposals) { - // skip the proposals the peer already has - if (propose.packet.getZxid() <= peerLastZxid) { - prevProposalZxid = propose.packet.getZxid(); - continue; - } else { - // If we are sending the first packet, figure out whether to trunc - // in case the follower has some proposals that the leader doesn't - if (firstPacket) { - firstPacket = false; - // Does the peer have some proposals that the leader hasn't seen yet - if (prevProposalZxid < peerLastZxid) { - // send a trunc message before sending the diff - packetToSend = Leader.TRUNC; - zxidToSend = prevProposalZxid; - updates = zxidToSend; - } - } - queuePacket(propose.packet); - QuorumPacket qcommit = new QuorumPacket(Leader.COMMIT, propose.packet.getZxid(), - null, null); - queuePacket(qcommit); - } - } - } else if (peerLastZxid > maxCommittedLog) { - LOG.debug("Sending TRUNC to follower zxidToSend=0x{} updates=0x{}", - Long.toHexString(maxCommittedLog), - Long.toHexString(updates)); - - packetToSend = Leader.TRUNC; - zxidToSend = maxCommittedLog; - updates = zxidToSend; - } else { - LOG.warn("Unhandled proposal scenario"); - } - } else if (peerLastZxid == leader.zk.getZKDatabase().getDataTreeLastProcessedZxid()) { - // The leader may recently take a snapshot, so the committedLog - // is empty. We don't need to send snapshot if the follow - // is already sync with in-memory db. - LOG.debug("committedLog is empty but leader and follower " - + "are in sync, zxid=0x{}", - Long.toHexString(peerLastZxid)); - packetToSend = Leader.DIFF; - zxidToSend = peerLastZxid; - } else { - // just let the state transfer happen - LOG.debug("proposals is empty"); - } - - LOG.info("Sending " + Leader.getPacketType(packetToSend)); - leaderLastZxid = leader.startForwarding(this, updates); - - } finally { - rl.unlock(); - } - - QuorumPacket newLeaderQP = new QuorumPacket(Leader.NEWLEADER, - ZxidUtils.makeZxid(newEpoch, 0), null, null); - if (getVersion() < 0x10000) { - oa.writeRecord(newLeaderQP, "packet"); - } else { - queuedPackets.add(newLeaderQP); - } - bufferedOutput.flush(); - //Need to set the zxidToSend to the latest zxid - if (packetToSend == Leader.SNAP) { - zxidToSend = leader.zk.getZKDatabase().getDataTreeLastProcessedZxid(); - } - oa.writeRecord(new QuorumPacket(packetToSend, zxidToSend, null, null), "packet"); - bufferedOutput.flush(); - - /* if we are not truncating or sending a diff just send a snapshot */ - if (packetToSend == Leader.SNAP) { - LOG.info("Sending snapshot last zxid of peer is 0x" - + Long.toHexString(peerLastZxid) + " " - + " zxid of leader is 0x" - + Long.toHexString(leaderLastZxid) - + "sent zxid of db as 0x" - + Long.toHexString(zxidToSend)); - // Dump data to peer - leader.zk.getZKDatabase().serializeSnapshot(oa); - oa.writeString("BenWasHere", "signature"); - } - bufferedOutput.flush(); - - // Start sending packets - new Thread() { - public void run() { - Thread.currentThread().setName( - "Sender-" + sock.getRemoteSocketAddress()); - try { - sendPackets(); - } catch (InterruptedException e) { - LOG.warn("Unexpected interruption",e); - } - } - }.start(); - - /* - * Have to wait for the first ACK, wait until - * the leader is ready, and only then we can - * start processing messages. - */ - qp = new QuorumPacket(); - ia.readRecord(qp, "packet"); - if(qp.getType() != Leader.ACK){ - LOG.error("Next packet was supposed to be an ACK"); - return; - } - LOG.info("Received NEWLEADER-ACK message from " + getSid()); - leader.waitForNewLeaderAck(getSid(), qp.getZxid(), getLearnerType()); - - syncLimitCheck.start(); - - // now that the ack has been processed expect the syncLimit - sock.setSoTimeout(leader.self.tickTime * leader.self.syncLimit); - - /* - * Wait until leader starts up - */ - synchronized(leader.zk){ - while(!leader.zk.isRunning() && !this.isInterrupted()){ - leader.zk.wait(20); - } - } - // Mutation packets will be queued during the serialize, - // so we need to mark when the peer can actually start - // using the data - // - queuedPackets.add(new QuorumPacket(Leader.UPTODATE, -1, null, null)); - - while (true) { - qp = new QuorumPacket(); - ia.readRecord(qp, "packet"); - - long traceMask = ZooTrace.SERVER_PACKET_TRACE_MASK; - if (qp.getType() == Leader.PING) { - traceMask = ZooTrace.SERVER_PING_TRACE_MASK; - } - if (LOG.isTraceEnabled()) { - ZooTrace.logQuorumPacket(LOG, traceMask, 'i', qp); - } - tickOfNextAckDeadline = leader.self.tick + leader.self.syncLimit; - - - ByteBuffer bb; - long sessionId; - int cxid; - int type; - - switch (qp.getType()) { - case Leader.ACK: - if (this.learnerType == LearnerType.OBSERVER) { - if (LOG.isDebugEnabled()) { - LOG.debug("Received ACK from Observer " + this.sid); - } - } - syncLimitCheck.updateAck(qp.getZxid()); - leader.processAck(this.sid, qp.getZxid(), sock.getLocalSocketAddress()); - break; - case Leader.PING: - // Process the touches - ByteArrayInputStream bis = new ByteArrayInputStream(qp - .getData()); - DataInputStream dis = new DataInputStream(bis); - while (dis.available() > 0) { - long sess = dis.readLong(); - int to = dis.readInt(); - leader.zk.touch(sess, to); - } - break; - case Leader.REVALIDATE: - bis = new ByteArrayInputStream(qp.getData()); - dis = new DataInputStream(bis); - long id = dis.readLong(); - int to = dis.readInt(); - ByteArrayOutputStream bos = new ByteArrayOutputStream(); - DataOutputStream dos = new DataOutputStream(bos); - dos.writeLong(id); - boolean valid = leader.zk.touch(id, to); - if (valid) { - try { - //set the session owner - // as the follower that - // owns the session - leader.zk.setOwner(id, this); - } catch (SessionExpiredException e) { - LOG.error("Somehow session " + Long.toHexString(id) + " expired right after being renewed! (impossible)", e); - } - } - if (LOG.isTraceEnabled()) { - ZooTrace.logTraceMessage(LOG, - ZooTrace.SESSION_TRACE_MASK, - "Session 0x" + Long.toHexString(id) - + " is valid: "+ valid); - } - dos.writeBoolean(valid); - qp.setData(bos.toByteArray()); - queuedPackets.add(qp); - break; - case Leader.REQUEST: - bb = ByteBuffer.wrap(qp.getData()); - sessionId = bb.getLong(); - cxid = bb.getInt(); - type = bb.getInt(); - bb = bb.slice(); - Request si; - if(type == OpCode.sync){ - si = new LearnerSyncRequest(this, sessionId, cxid, type, bb, qp.getAuthinfo()); - } else { - si = new Request(null, sessionId, cxid, type, bb, qp.getAuthinfo()); - } - si.setOwner(this); - leader.zk.submitRequest(si); - break; - default: - } - } - } catch (IOException e) { - if (sock != null && !sock.isClosed()) { - LOG.error("Unexpected exception causing shutdown while sock " - + "still open", e); - //close the socket to make sure the - //other side can see it being close - try { - sock.close(); - } catch(IOException ie) { - // do nothing - } - } - } catch (InterruptedException e) { - LOG.error("Unexpected exception causing shutdown", e); - } finally { - LOG.warn("******* GOODBYE " - + (sock != null ? sock.getRemoteSocketAddress() : "") - + " ********"); - shutdown(); - } - } - - public void shutdown() { - // Send the packet of death - try { - queuedPackets.put(proposalOfDeath); - } catch (InterruptedException e) { - LOG.warn("Ignoring unexpected exception", e); - } - try { - if (sock != null && !sock.isClosed()) { - sock.close(); - } - } catch (IOException e) { - LOG.warn("Ignoring unexpected exception during socket close", e); - } - this.interrupt(); - leader.removeLearnerHandler(this); - } - - public long tickOfNextAckDeadline() { - return tickOfNextAckDeadline; - } - - /** - * ping calls from the leader to the peers - */ - public void ping() { - long id; - if (syncLimitCheck.check(System.nanoTime())) { - synchronized(leader) { - id = leader.lastProposed; - } - QuorumPacket ping = new QuorumPacket(Leader.PING, id, null, null); - queuePacket(ping); - } else { - LOG.warn("Closing connection to peer due to transaction timeout."); - shutdown(); - } - } - - void queuePacket(QuorumPacket p) { - queuedPackets.add(p); - } - - public boolean synced() { - return isAlive() - && leader.self.tick <= tickOfNextAckDeadline; - } -} diff --git a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/quorum/LearnerSessionTracker.java b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/quorum/LearnerSessionTracker.java deleted file mode 100644 index 318241970..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/quorum/LearnerSessionTracker.java +++ /dev/null @@ -1,96 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you 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. - */ - -package org.apache.zookeeper.server.quorum; - -import java.io.PrintWriter; -import java.util.HashMap; -import java.util.concurrent.ConcurrentHashMap; - -import org.apache.zookeeper.server.SessionTracker; -import org.apache.zookeeper.server.SessionTrackerImpl; - -/** - * This is really just a shell of a SessionTracker that tracks session activity - * to be forwarded to the Leader using a PING. - */ -public class LearnerSessionTracker implements SessionTracker { - SessionExpirer expirer; - - HashMap touchTable = new HashMap(); - long serverId = 1; - long nextSessionId=0; - - private ConcurrentHashMap sessionsWithTimeouts; - - public LearnerSessionTracker(SessionExpirer expirer, - ConcurrentHashMap sessionsWithTimeouts, long id) { - this.expirer = expirer; - this.sessionsWithTimeouts = sessionsWithTimeouts; - this.serverId = id; - nextSessionId = SessionTrackerImpl.initializeNextSession(this.serverId); - - } - - synchronized public void removeSession(long sessionId) { - sessionsWithTimeouts.remove(sessionId); - touchTable.remove(sessionId); - } - - public void shutdown() { - } - - synchronized public void addSession(long sessionId, int sessionTimeout) { - sessionsWithTimeouts.put(sessionId, sessionTimeout); - touchTable.put(sessionId, sessionTimeout); - } - - synchronized public boolean touchSession(long sessionId, int sessionTimeout) { - touchTable.put(sessionId, sessionTimeout); - return true; - } - - synchronized HashMap snapshot() { - HashMap oldTouchTable = touchTable; - touchTable = new HashMap(); - return oldTouchTable; - } - - - synchronized public long createSession(int sessionTimeout) { - return (nextSessionId++); - } - - public void checkSession(long sessionId, Object owner) { - // Nothing to do here. Sessions are checked at the Leader - } - - public void setOwner(long sessionId, Object owner) { - // Nothing to do here. Sessions are checked at the Leader - } - - public void dumpSessions(PrintWriter pwriter) { - // the original class didn't have tostring impl, so just - // dup what we had before - pwriter.println(toString()); - } - - public void setSessionClosing(long sessionId) { - // Nothing to do here. - } -} diff --git a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/quorum/LearnerSyncRequest.java b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/quorum/LearnerSyncRequest.java deleted file mode 100644 index bfbc9a8fd..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/quorum/LearnerSyncRequest.java +++ /dev/null @@ -1,34 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you 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. - */ - -package org.apache.zookeeper.server.quorum; - -import java.nio.ByteBuffer; -import java.util.List; - -import org.apache.zookeeper.data.Id; -import org.apache.zookeeper.server.Request; - -public class LearnerSyncRequest extends Request { - LearnerHandler fh; - public LearnerSyncRequest(LearnerHandler fh, long sessionId, int xid, int type, - ByteBuffer bb, List authInfo) { - super(null, sessionId, xid, type, bb, authInfo); - this.fh = fh; - } -} diff --git a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/quorum/LearnerZooKeeperServer.java b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/quorum/LearnerZooKeeperServer.java deleted file mode 100644 index 5dd133202..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/quorum/LearnerZooKeeperServer.java +++ /dev/null @@ -1,145 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you 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. - */ -package org.apache.zookeeper.server.quorum; - -import java.io.IOException; -import java.util.HashMap; - -import org.apache.zookeeper.jmx.MBeanRegistry; -import org.apache.zookeeper.server.DataTreeBean; -import org.apache.zookeeper.server.ServerCnxn; -import org.apache.zookeeper.server.ZKDatabase; -import org.apache.zookeeper.server.ZooKeeperServerBean; -import org.apache.zookeeper.server.persistence.FileTxnSnapLog; - -/** - * Parent class for all ZooKeeperServers for Learners - */ -public abstract class LearnerZooKeeperServer extends QuorumZooKeeperServer { - public LearnerZooKeeperServer(FileTxnSnapLog logFactory, int tickTime, - int minSessionTimeout, int maxSessionTimeout, - DataTreeBuilder treeBuilder, ZKDatabase zkDb, QuorumPeer self) - throws IOException - { - super(logFactory, tickTime, minSessionTimeout, maxSessionTimeout, - treeBuilder, zkDb, self); - } - - /** - * Abstract method to return the learner associated with this server. - * Since the Learner may change under our feet (when QuorumPeer reassigns - * it) we can't simply take a reference here. Instead, we need the - * subclasses to implement this. - */ - abstract public Learner getLearner(); - - /** - * Returns the current state of the session tracker. This is only currently - * used by a Learner to build a ping response packet. - * - */ - protected HashMap getTouchSnapshot() { - if (sessionTracker != null) { - return ((LearnerSessionTracker) sessionTracker).snapshot(); - } - return new HashMap(); - } - - /** - * Returns the id of the associated QuorumPeer, which will do for a unique - * id of this server. - */ - @Override - public long getServerId() { - return self.getId(); - } - - @Override - public void createSessionTracker() { - sessionTracker = new LearnerSessionTracker(this, getZKDatabase().getSessionWithTimeOuts(), - self.getId()); - } - - @Override - protected void startSessionTracker() {} - - @Override - protected void revalidateSession(ServerCnxn cnxn, long sessionId, - int sessionTimeout) throws IOException { - getLearner().validateSession(cnxn, sessionId, sessionTimeout); - } - - @Override - protected void registerJMX() { - // register with JMX - try { - jmxDataTreeBean = new DataTreeBean(getZKDatabase().getDataTree()); - MBeanRegistry.getInstance().register(jmxDataTreeBean, jmxServerBean); - } catch (Exception e) { - LOG.warn("Failed to register with JMX", e); - jmxDataTreeBean = null; - } - } - - public void registerJMX(ZooKeeperServerBean serverBean, - LocalPeerBean localPeerBean) - { - // register with JMX - if (self.jmxLeaderElectionBean != null) { - try { - MBeanRegistry.getInstance().unregister(self.jmxLeaderElectionBean); - } catch (Exception e) { - LOG.warn("Failed to register with JMX", e); - } - self.jmxLeaderElectionBean = null; - } - - try { - jmxServerBean = serverBean; - MBeanRegistry.getInstance().register(serverBean, localPeerBean); - } catch (Exception e) { - LOG.warn("Failed to register with JMX", e); - jmxServerBean = null; - } - } - - @Override - protected void unregisterJMX() { - // unregister from JMX - try { - if (jmxDataTreeBean != null) { - MBeanRegistry.getInstance().unregister(jmxDataTreeBean); - } - } catch (Exception e) { - LOG.warn("Failed to unregister with JMX", e); - } - jmxDataTreeBean = null; - } - - protected void unregisterJMX(Learner peer) { - // unregister from JMX - try { - if (jmxServerBean != null) { - MBeanRegistry.getInstance().unregister(jmxServerBean); - } - } catch (Exception e) { - LOG.warn("Failed to unregister with JMX", e); - } - jmxServerBean = null; - } -} diff --git a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/quorum/LocalPeerBean.java b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/quorum/LocalPeerBean.java deleted file mode 100644 index 03f3f06bf..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/quorum/LocalPeerBean.java +++ /dev/null @@ -1,79 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you 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. - */ - -package org.apache.zookeeper.server.quorum; - - -/** - * Implementation of the local peer MBean interface. - */ -public class LocalPeerBean extends ServerBean implements LocalPeerMXBean { - private final QuorumPeer peer; - - public LocalPeerBean(QuorumPeer peer) { - this.peer = peer; - } - - public String getName() { - return "replica." + peer.getId(); - } - - public boolean isHidden() { - return false; - } - - public int getTickTime() { - return peer.getTickTime(); - } - - public int getMaxClientCnxnsPerHost() { - return peer.getMaxClientCnxnsPerHost(); - } - - public int getMinSessionTimeout() { - return peer.getMinSessionTimeout(); - } - - public int getMaxSessionTimeout() { - return peer.getMaxSessionTimeout(); - } - - public int getInitLimit() { - return peer.getInitLimit(); - } - - public int getSyncLimit() { - return peer.getSyncLimit(); - } - - public int getTick() { - return peer.getTick(); - } - - public String getState() { - return peer.getState().toString(); - } - - public String getQuorumAddress() { - return peer.getQuorumAddress().toString(); - } - - public int getElectionType() { - return peer.getElectionType(); - } -} diff --git a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/quorum/LocalPeerMXBean.java b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/quorum/LocalPeerMXBean.java deleted file mode 100644 index eedf308c0..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/quorum/LocalPeerMXBean.java +++ /dev/null @@ -1,77 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you 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. - */ - -package org.apache.zookeeper.server.quorum; - - -/** - * A local zookeeper server MBean interface. Unlike the remote peer, the local - * peer provides complete state/statistics at runtime and can be managed (just - * like a standalone zookeeper server). - */ -public interface LocalPeerMXBean extends ServerMXBean { - - /** - * @return the number of milliseconds of each tick - */ - public int getTickTime(); - - /** Current maxClientCnxns allowed from a particular host */ - public int getMaxClientCnxnsPerHost(); - - /** - * @return the minimum number of milliseconds allowed for a session timeout - */ - public int getMinSessionTimeout(); - - /** - * @return the maximum number of milliseconds allowed for a session timeout - */ - public int getMaxSessionTimeout(); - - /** - * @return the number of ticks that the initial sync phase can take - */ - public int getInitLimit(); - - /** - * @return the number of ticks that can pass between sending a request - * and getting a acknowledgment - */ - public int getSyncLimit(); - - /** - * @return the current tick - */ - public int getTick(); - - /** - * @return the current server state - */ - public String getState(); - - /** - * @return the quorum address - */ - public String getQuorumAddress(); - - /** - * @return the election type - */ - public int getElectionType(); -} diff --git a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/quorum/Observer.java b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/quorum/Observer.java deleted file mode 100644 index ee61a90c4..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/quorum/Observer.java +++ /dev/null @@ -1,141 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you 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. - */ - -package org.apache.zookeeper.server.quorum; - -import java.io.ByteArrayInputStream; -import java.io.IOException; -import java.net.InetSocketAddress; - -import org.apache.jute.BinaryInputArchive; -import org.apache.jute.Record; -import org.apache.zookeeper.server.ObserverBean; -import org.apache.zookeeper.server.Request; -import org.apache.zookeeper.server.util.SerializeUtils; -import org.apache.zookeeper.txn.TxnHeader; - -/** - * Observers are peers that do not take part in the atomic broadcast protocol. - * Instead, they are informed of successful proposals by the Leader. Observers - * therefore naturally act as a relay point for publishing the proposal stream - * and can relieve Followers of some of the connection load. Observers may - * submit proposals, but do not vote in their acceptance. - * - * See ZOOKEEPER-368 for a discussion of this feature. - */ -public class Observer extends Learner{ - - Observer(QuorumPeer self,ObserverZooKeeperServer observerZooKeeperServer) { - this.self = self; - this.zk=observerZooKeeperServer; - } - - @Override - public String toString() { - StringBuilder sb = new StringBuilder(); - sb.append("Observer ").append(sock); - sb.append(" pendingRevalidationCount:") - .append(pendingRevalidations.size()); - return sb.toString(); - } - - /** - * the main method called by the observer to observe the leader - * - * @throws InterruptedException - */ - void observeLeader() throws InterruptedException { - zk.registerJMX(new ObserverBean(this, zk), self.jmxLocalPeerBean); - - try { - InetSocketAddress addr = findLeader(); - LOG.info("Observing " + addr); - try { - connectToLeader(addr); - long newLeaderZxid = registerWithLeader(Leader.OBSERVERINFO); - - syncWithLeader(newLeaderZxid); - QuorumPacket qp = new QuorumPacket(); - while (self.isRunning()) { - readPacket(qp); - processPacket(qp); - } - } catch (IOException e) { - LOG.warn("Exception when observing the leader", e); - try { - sock.close(); - } catch (IOException e1) { - e1.printStackTrace(); - } - - // clear pending revalidations - pendingRevalidations.clear(); - } - } finally { - zk.unregisterJMX(this); - } - } - - /** - * Controls the response of an observer to the receipt of a quorumpacket - * @param qp - * @throws IOException - */ - protected void processPacket(QuorumPacket qp) throws IOException{ - switch (qp.getType()) { - case Leader.PING: - ping(qp); - break; - case Leader.PROPOSAL: - LOG.warn("Ignoring proposal"); - break; - case Leader.COMMIT: - LOG.warn("Ignoring commit"); - break; - case Leader.UPTODATE: - LOG.error("Received an UPTODATE message after Observer started"); - break; - case Leader.REVALIDATE: - revalidate(qp); - break; - case Leader.SYNC: - ((ObserverZooKeeperServer)zk).sync(); - break; - case Leader.INFORM: - TxnHeader hdr = new TxnHeader(); - Record txn = SerializeUtils.deserializeTxn(qp.getData(), hdr); - Request request = new Request (null, hdr.getClientId(), - hdr.getCxid(), - hdr.getType(), null, null); - request.txn = txn; - request.hdr = hdr; - ObserverZooKeeperServer obs = (ObserverZooKeeperServer)zk; - obs.commitRequest(request); - break; - } - } - - /** - * Shutdown the Observer. - */ - public void shutdown() { - LOG.info("shutdown called", new Exception("shutdown Observer")); - super.shutdown(); - } -} - diff --git a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/quorum/ObserverMXBean.java b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/quorum/ObserverMXBean.java deleted file mode 100644 index 2c1799ab5..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/quorum/ObserverMXBean.java +++ /dev/null @@ -1,37 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you 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. - */ - -package org.apache.zookeeper.server.quorum; - -import org.apache.zookeeper.server.ZooKeeperServerMXBean; - -/** - * Observer MX Bean interface, implemented by ObserverBean - * - */ -public interface ObserverMXBean extends ZooKeeperServerMXBean { - /** - * @return count of pending revalidations - */ - public int getPendingRevalidationCount(); - - /** - * @return socket address - */ - public String getQuorumAddress(); -} diff --git a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/quorum/ObserverRequestProcessor.java b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/quorum/ObserverRequestProcessor.java deleted file mode 100644 index e94414ff4..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/quorum/ObserverRequestProcessor.java +++ /dev/null @@ -1,126 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you 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. - */ - -package org.apache.zookeeper.server.quorum; - -import java.util.concurrent.LinkedBlockingQueue; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import org.apache.zookeeper.ZooDefs.OpCode; -import org.apache.zookeeper.server.RequestProcessor; -import org.apache.zookeeper.server.Request; -import org.apache.zookeeper.server.ZooTrace; - -/** - * This RequestProcessor forwards any requests that modify the state of the - * system to the Leader. - */ -public class ObserverRequestProcessor extends Thread implements - RequestProcessor { - private static final Logger LOG = LoggerFactory.getLogger(ObserverRequestProcessor.class); - - ObserverZooKeeperServer zks; - - RequestProcessor nextProcessor; - - // We keep a queue of requests. As requests get submitted they are - // stored here. The queue is drained in the run() method. - LinkedBlockingQueue queuedRequests = new LinkedBlockingQueue(); - - boolean finished = false; - - /** - * Constructor - takes an ObserverZooKeeperServer to associate with - * and the next processor to pass requests to after we're finished. - * @param zks - * @param nextProcessor - */ - public ObserverRequestProcessor(ObserverZooKeeperServer zks, - RequestProcessor nextProcessor) { - super("ObserverRequestProcessor:" + zks.getServerId()); - this.zks = zks; - this.nextProcessor = nextProcessor; - } - - @Override - public void run() { - try { - while (!finished) { - Request request = queuedRequests.take(); - if (LOG.isTraceEnabled()) { - ZooTrace.logRequest(LOG, ZooTrace.CLIENT_REQUEST_TRACE_MASK, - 'F', request, ""); - } - if (request == Request.requestOfDeath) { - break; - } - // We want to queue the request to be processed before we submit - // the request to the leader so that we are ready to receive - // the response - nextProcessor.processRequest(request); - - // We now ship the request to the leader. As with all - // other quorum operations, sync also follows this code - // path, but different from others, we need to keep track - // of the sync operations this Observer has pending, so we - // add it to pendingSyncs. - switch (request.type) { - case OpCode.sync: - zks.pendingSyncs.add(request); - zks.getObserver().request(request); - break; - case OpCode.create: - case OpCode.delete: - case OpCode.setData: - case OpCode.setACL: - case OpCode.createSession: - case OpCode.closeSession: - case OpCode.multi: - zks.getObserver().request(request); - break; - } - } - } catch (Exception e) { - LOG.error("Unexpected exception causing exit", e); - } - LOG.info("ObserverRequestProcessor exited loop!"); - } - - /** - * Simply queue the request, which will be processed in FIFO order. - */ - public void processRequest(Request request) { - if (!finished) { - queuedRequests.add(request); - } - } - - /** - * Shutdown the processor. - */ - public void shutdown() { - LOG.info("Shutting down"); - finished = true; - queuedRequests.clear(); - queuedRequests.add(Request.requestOfDeath); - nextProcessor.shutdown(); - } - -} diff --git a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/quorum/ObserverZooKeeperServer.java b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/quorum/ObserverZooKeeperServer.java deleted file mode 100644 index 4359b8dd2..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/quorum/ObserverZooKeeperServer.java +++ /dev/null @@ -1,147 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you 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. - */ -package org.apache.zookeeper.server.quorum; - -import java.io.IOException; -import java.util.concurrent.ConcurrentLinkedQueue; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.apache.zookeeper.server.FinalRequestProcessor; -import org.apache.zookeeper.server.Request; -import org.apache.zookeeper.server.RequestProcessor; -import org.apache.zookeeper.server.SyncRequestProcessor; -import org.apache.zookeeper.server.ZKDatabase; -import org.apache.zookeeper.server.persistence.FileTxnSnapLog; - -/** - * A ZooKeeperServer for the Observer node type. Not much is different, but - * we anticipate specializing the request processors in the future. - * - */ -public class ObserverZooKeeperServer extends LearnerZooKeeperServer { - private static final Logger LOG = - LoggerFactory.getLogger(ObserverZooKeeperServer.class); - - /** - * Enable since request processor for writing txnlog to disk and - * take periodic snapshot. Default is ON. - */ - - private boolean syncRequestProcessorEnabled = this.self.getSyncEnabled(); - - /* - * Request processors - */ - private CommitProcessor commitProcessor; - private SyncRequestProcessor syncProcessor; - - /* - * Pending sync requests - */ - ConcurrentLinkedQueue pendingSyncs = - new ConcurrentLinkedQueue(); - - ObserverZooKeeperServer(FileTxnSnapLog logFactory, QuorumPeer self, - DataTreeBuilder treeBuilder, ZKDatabase zkDb) throws IOException { - super(logFactory, self.tickTime, self.minSessionTimeout, - self.maxSessionTimeout, treeBuilder, zkDb, self); - LOG.info("syncEnabled =" + syncRequestProcessorEnabled); - } - - public Observer getObserver() { - return self.observer; - } - - @Override - public Learner getLearner() { - return self.observer; - } - - /** - * Unlike a Follower, which sees a full request only during the PROPOSAL - * phase, Observers get all the data required with the INFORM packet. - * This method commits a request that has been unpacked by from an INFORM - * received from the Leader. - * - * @param request - */ - public void commitRequest(Request request) { - if (syncRequestProcessorEnabled) { - // Write to txnlog and take periodic snapshot - syncProcessor.processRequest(request); - } - commitProcessor.commit(request); - } - - /** - * Set up the request processors for an Observer: - * firstProcesor->commitProcessor->finalProcessor - */ - @Override - protected void setupRequestProcessors() { - // We might consider changing the processor behaviour of - // Observers to, for example, remove the disk sync requirements. - // Currently, they behave almost exactly the same as followers. - RequestProcessor finalProcessor = new FinalRequestProcessor(this); - commitProcessor = new CommitProcessor(finalProcessor, - Long.toString(getServerId()), true); - commitProcessor.start(); - firstProcessor = new ObserverRequestProcessor(this, commitProcessor); - ((ObserverRequestProcessor) firstProcessor).start(); - - /* - * Observer should write to disk, so that the it won't request - * too old txn from the leader which may lead to getting an entire - * snapshot. - * - * However, this may degrade performance as it has to write to disk - * and do periodic snapshot which may double the memory requirements - */ - if (syncRequestProcessorEnabled) { - syncProcessor = new SyncRequestProcessor(this, null); - syncProcessor.start(); - } - } - - /* - * Process a sync request - */ - synchronized public void sync(){ - if(pendingSyncs.size() ==0){ - LOG.warn("Not expecting a sync."); - return; - } - - Request r = pendingSyncs.remove(); - commitProcessor.commit(r); - } - - @Override - public String getState() { - return "observer"; - }; - - @Override - public void shutdown() { - super.shutdown(); - if (syncRequestProcessorEnabled && syncProcessor != null) { - syncProcessor.shutdown(); - } - } -} diff --git a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/quorum/ProposalRequestProcessor.java b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/quorum/ProposalRequestProcessor.java deleted file mode 100644 index 641262e10..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/quorum/ProposalRequestProcessor.java +++ /dev/null @@ -1,93 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you 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. - */ - -package org.apache.zookeeper.server.quorum; - -import org.apache.zookeeper.server.Request; -import org.apache.zookeeper.server.RequestProcessor; -import org.apache.zookeeper.server.SyncRequestProcessor; -import org.apache.zookeeper.server.quorum.Leader.XidRolloverException; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -/** - * This RequestProcessor simply forwards requests to an AckRequestProcessor and - * SyncRequestProcessor. - */ -public class ProposalRequestProcessor implements RequestProcessor { - private static final Logger LOG = - LoggerFactory.getLogger(ProposalRequestProcessor.class); - - LeaderZooKeeperServer zks; - - RequestProcessor nextProcessor; - - SyncRequestProcessor syncProcessor; - - public ProposalRequestProcessor(LeaderZooKeeperServer zks, - RequestProcessor nextProcessor) { - this.zks = zks; - this.nextProcessor = nextProcessor; - AckRequestProcessor ackProcessor = new AckRequestProcessor(zks.getLeader()); - syncProcessor = new SyncRequestProcessor(zks, ackProcessor); - } - - /** - * initialize this processor - */ - public void initialize() { - syncProcessor.start(); - } - - public void processRequest(Request request) throws RequestProcessorException { - // LOG.warn("Ack>>> cxid = " + request.cxid + " type = " + - // request.type + " id = " + request.sessionId); - // request.addRQRec(">prop"); - - - /* In the following IF-THEN-ELSE block, we process syncs on the leader. - * If the sync is coming from a follower, then the follower - * handler adds it to syncHandler. Otherwise, if it is a client of - * the leader that issued the sync command, then syncHandler won't - * contain the handler. In this case, we add it to syncHandler, and - * call processRequest on the next processor. - */ - - if(request instanceof LearnerSyncRequest){ - zks.getLeader().processSync((LearnerSyncRequest)request); - } else { - nextProcessor.processRequest(request); - if (request.hdr != null) { - // We need to sync and get consensus on any transactions - try { - zks.getLeader().propose(request); - } catch (XidRolloverException e) { - throw new RequestProcessorException(e.getMessage(), e); - } - syncProcessor.processRequest(request); - } - } - } - - public void shutdown() { - LOG.info("Shutting down"); - nextProcessor.shutdown(); - syncProcessor.shutdown(); - } - -} diff --git a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/quorum/QuorumBean.java b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/quorum/QuorumBean.java deleted file mode 100644 index ef4036aae..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/quorum/QuorumBean.java +++ /dev/null @@ -1,44 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you 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. - */ - -package org.apache.zookeeper.server.quorum; - -import org.apache.zookeeper.jmx.ZKMBeanInfo; -import org.apache.zookeeper.server.quorum.QuorumPeer; - -public class QuorumBean implements QuorumMXBean, ZKMBeanInfo { - private final QuorumPeer peer; - private final String name; - - public QuorumBean(QuorumPeer peer){ - this.peer = peer; - name = "ReplicatedServer_id" + peer.getMyid(); - } - - public String getName() { - return name; - } - - public boolean isHidden() { - return false; - } - - public int getQuorumSize() { - return peer.getQuorumSize(); - } -} diff --git a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/quorum/QuorumCnxManager.java b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/quorum/QuorumCnxManager.java deleted file mode 100644 index eacea312b..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/quorum/QuorumCnxManager.java +++ /dev/null @@ -1,903 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you 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. - */ - -package org.apache.zookeeper.server.quorum; - -import java.io.DataInputStream; -import java.io.DataOutputStream; -import java.io.IOException; -import java.net.InetSocketAddress; -import java.net.ServerSocket; -import java.net.Socket; -import java.net.SocketException; -import java.nio.BufferUnderflowException; -import java.nio.ByteBuffer; -import java.nio.channels.UnresolvedAddressException; -import java.util.Enumeration; -import java.util.concurrent.ArrayBlockingQueue; -import java.util.concurrent.ConcurrentHashMap; -import java.util.concurrent.TimeUnit; -import java.util.NoSuchElementException; -import java.util.concurrent.atomic.AtomicInteger; -import java.util.Date; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import org.apache.zookeeper.server.ZooKeeperServer; - -/** - * This class implements a connection manager for leader election using TCP. It - * maintains one connection for every pair of servers. The tricky part is to - * guarantee that there is exactly one connection for every pair of servers that - * are operating correctly and that can communicate over the network. - * - * If two servers try to start a connection concurrently, then the connection - * manager uses a very simple tie-breaking mechanism to decide which connection - * to drop based on the IP addressed of the two parties. - * - * For every peer, the manager maintains a queue of messages to send. If the - * connection to any particular peer drops, then the sender thread puts the - * message back on the list. As this implementation currently uses a queue - * implementation to maintain messages to send to another peer, we add the - * message to the tail of the queue, thus changing the order of messages. - * Although this is not a problem for the leader election, it could be a problem - * when consolidating peer communication. This is to be verified, though. - * - */ - -public class QuorumCnxManager { - private static final Logger LOG = LoggerFactory.getLogger(QuorumCnxManager.class); - - /* - * Maximum capacity of thread queues - */ - static final int RECV_CAPACITY = 100; - // Initialized to 1 to prevent sending - // stale notifications to peers - static final int SEND_CAPACITY = 1; - - static final int PACKETMAXSIZE = 1024 * 512; - /* - * Maximum number of attempts to connect to a peer - */ - - static final int MAX_CONNECTION_ATTEMPTS = 2; - - /* - * Negative counter for observer server ids. - */ - - private long observerCounter = -1; - - /* - * Connection time out value in milliseconds - */ - - private int cnxTO = 5000; - - /* - * Local IP address - */ - final QuorumPeer self; - - /* - * Mapping from Peer to Thread number - */ - final ConcurrentHashMap senderWorkerMap; - final ConcurrentHashMap> queueSendMap; - final ConcurrentHashMap lastMessageSent; - - /* - * Reception queue - */ - public final ArrayBlockingQueue recvQueue; - /* - * Object to synchronize access to recvQueue - */ - private final Object recvQLock = new Object(); - - /* - * Shutdown flag - */ - - volatile boolean shutdown = false; - - /* - * Listener thread - */ - public final Listener listener; - - /* - * Counter to count worker threads - */ - private AtomicInteger threadCnt = new AtomicInteger(0); - - static public class Message { - - Message(ByteBuffer buffer, long sid) { - this.buffer = buffer; - this.sid = sid; - } - - ByteBuffer buffer; - long sid; - } - - public QuorumCnxManager(QuorumPeer self) { - this.recvQueue = new ArrayBlockingQueue(RECV_CAPACITY); - this.queueSendMap = new ConcurrentHashMap>(); - this.senderWorkerMap = new ConcurrentHashMap(); - this.lastMessageSent = new ConcurrentHashMap(); - - String cnxToValue = System.getProperty("zookeeper.cnxTimeout"); - if(cnxToValue != null){ - this.cnxTO = new Integer(cnxToValue); - } - - this.self = self; - - // Starts listener thread that waits for connection requests - listener = new Listener(); - } - - /** - * Invokes initiateConnection for testing purposes - * - * @param sid - */ - public void testInitiateConnection(long sid) throws Exception { - if (LOG.isDebugEnabled()) { - LOG.debug("Opening channel to server " + sid); - } - Socket sock = new Socket(); - setSockOpts(sock); - sock.connect(self.getVotingView().get(sid).electionAddr, cnxTO); - initiateConnection(sock, sid); - } - - /** - * If this server has initiated the connection, then it gives up on the - * connection if it loses challenge. Otherwise, it keeps the connection. - */ - public boolean initiateConnection(Socket sock, Long sid) { - DataOutputStream dout = null; - try { - // Sending id and challenge - dout = new DataOutputStream(sock.getOutputStream()); - dout.writeLong(self.getId()); - dout.flush(); - } catch (IOException e) { - LOG.warn("Ignoring exception reading or writing challenge: ", e); - closeSocket(sock); - return false; - } - - // If lost the challenge, then drop the new connection - if (sid > self.getId()) { - LOG.info("Have smaller server identifier, so dropping the " + - "connection: (" + sid + ", " + self.getId() + ")"); - closeSocket(sock); - // Otherwise proceed with the connection - } else { - SendWorker sw = new SendWorker(sock, sid); - RecvWorker rw = new RecvWorker(sock, sid, sw); - sw.setRecv(rw); - - SendWorker vsw = senderWorkerMap.get(sid); - - if(vsw != null) - vsw.finish(); - - senderWorkerMap.put(sid, sw); - if (!queueSendMap.containsKey(sid)) { - queueSendMap.put(sid, new ArrayBlockingQueue( - SEND_CAPACITY)); - } - - sw.start(); - rw.start(); - - return true; - - } - return false; - } - - - - /** - * If this server receives a connection request, then it gives up on the new - * connection if it wins. Notice that it checks whether it has a connection - * to this server already or not. If it does, then it sends the smallest - * possible long value to lose the challenge. - * - */ - public boolean receiveConnection(Socket sock) { - Long sid = null; - - try { - // Read server id - DataInputStream din = new DataInputStream(sock.getInputStream()); - sid = din.readLong(); - if (sid < 0) { // this is not a server id but a protocol version (see ZOOKEEPER-1633) - sid = din.readLong(); - // next comes the #bytes in the remainder of the message - int num_remaining_bytes = din.readInt(); - byte[] b = new byte[num_remaining_bytes]; - // remove the remainder of the message from din - int num_read = din.read(b); - if (num_read != num_remaining_bytes) { - LOG.error("Read only " + num_read + " bytes out of " + num_remaining_bytes + " sent by server " + sid); - } - } - if (sid == QuorumPeer.OBSERVER_ID) { - /* - * Choose identifier at random. We need a value to identify - * the connection. - */ - - sid = observerCounter--; - LOG.info("Setting arbitrary identifier to observer: " + sid); - } - } catch (IOException e) { - closeSocket(sock); - LOG.warn("Exception reading or writing challenge: " + e.toString()); - return false; - } - - //If wins the challenge, then close the new connection. - if (sid < self.getId()) { - /* - * This replica might still believe that the connection to sid is - * up, so we have to shut down the workers before trying to open a - * new connection. - */ - SendWorker sw = senderWorkerMap.get(sid); - if (sw != null) { - sw.finish(); - } - - /* - * Now we start a new connection - */ - LOG.debug("Create new connection to server: " + sid); - closeSocket(sock); - connectOne(sid); - - // Otherwise start worker threads to receive data. - } else { - SendWorker sw = new SendWorker(sock, sid); - RecvWorker rw = new RecvWorker(sock, sid, sw); - sw.setRecv(rw); - - SendWorker vsw = senderWorkerMap.get(sid); - - if(vsw != null) - vsw.finish(); - - senderWorkerMap.put(sid, sw); - - if (!queueSendMap.containsKey(sid)) { - queueSendMap.put(sid, new ArrayBlockingQueue( - SEND_CAPACITY)); - } - - sw.start(); - rw.start(); - - return true; - } - return false; - } - - /** - * Processes invoke this message to queue a message to send. Currently, - * only leader election uses it. - */ - public void toSend(Long sid, ByteBuffer b) { - /* - * If sending message to myself, then simply enqueue it (loopback). - */ - if (self.getId() == sid) { - b.position(0); - addToRecvQueue(new Message(b.duplicate(), sid)); - /* - * Otherwise send to the corresponding thread to send. - */ - } else { - /* - * Start a new connection if doesn't have one already. - */ - if (!queueSendMap.containsKey(sid)) { - ArrayBlockingQueue bq = new ArrayBlockingQueue( - SEND_CAPACITY); - queueSendMap.put(sid, bq); - addToSendQueue(bq, b); - - } else { - ArrayBlockingQueue bq = queueSendMap.get(sid); - if(bq != null){ - addToSendQueue(bq, b); - } else { - LOG.error("No queue for server " + sid); - } - } - connectOne(sid); - - } - } - - /** - * Try to establish a connection to server with id sid. - * - * @param sid server id - */ - - synchronized void connectOne(long sid){ - if (senderWorkerMap.get(sid) == null){ - InetSocketAddress electionAddr; - if (self.quorumPeers.containsKey(sid)) { - electionAddr = self.quorumPeers.get(sid).electionAddr; - } else { - LOG.warn("Invalid server id: " + sid); - return; - } - try { - - if (LOG.isDebugEnabled()) { - LOG.debug("Opening channel to server " + sid); - } - Socket sock = new Socket(); - setSockOpts(sock); - sock.connect(self.getView().get(sid).electionAddr, cnxTO); - if (LOG.isDebugEnabled()) { - LOG.debug("Connected to server " + sid); - } - initiateConnection(sock, sid); - } catch (UnresolvedAddressException e) { - // Sun doesn't include the address that causes this - // exception to be thrown, also UAE cannot be wrapped cleanly - // so we log the exception in order to capture this critical - // detail. - LOG.warn("Cannot open channel to " + sid - + " at election address " + electionAddr, e); - throw e; - } catch (IOException e) { - LOG.warn("Cannot open channel to " + sid - + " at election address " + electionAddr, - e); - } - } else { - LOG.debug("There is a connection already for server " + sid); - } - } - - - /** - * Try to establish a connection with each server if one - * doesn't exist. - */ - - public void connectAll(){ - long sid; - for(Enumeration en = queueSendMap.keys(); - en.hasMoreElements();){ - sid = en.nextElement(); - connectOne(sid); - } - } - - - /** - * Check if all queues are empty, indicating that all messages have been delivered. - */ - boolean haveDelivered() { - for (ArrayBlockingQueue queue : queueSendMap.values()) { - LOG.debug("Queue size: " + queue.size()); - if (queue.size() == 0) { - return true; - } - } - - return false; - } - - /** - * Flag that it is time to wrap up all activities and interrupt the listener. - */ - public void halt() { - shutdown = true; - LOG.debug("Halting listener"); - listener.halt(); - - softHalt(); - } - - /** - * A soft halt simply finishes workers. - */ - public void softHalt() { - for (SendWorker sw : senderWorkerMap.values()) { - LOG.debug("Halting sender: " + sw); - sw.finish(); - } - } - - /** - * Helper method to set socket options. - * - * @param sock - * Reference to socket - */ - private void setSockOpts(Socket sock) throws SocketException { - sock.setTcpNoDelay(true); - sock.setSoTimeout(self.tickTime * self.syncLimit); - } - - /** - * Helper method to close a socket. - * - * @param sock - * Reference to socket - */ - private void closeSocket(Socket sock) { - try { - sock.close(); - } catch (IOException ie) { - LOG.error("Exception while closing", ie); - } - } - - /** - * Return number of worker threads - */ - public long getThreadCount() { - return threadCnt.get(); - } - /** - * Return reference to QuorumPeer - */ - public QuorumPeer getQuorumPeer() { - return self; - } - - /** - * Thread to listen on some port - */ - public class Listener extends Thread { - - volatile ServerSocket ss = null; - - /** - * Sleeps on accept(). - */ - @Override - public void run() { - int numRetries = 0; - InetSocketAddress addr; - while((!shutdown) && (numRetries < 3)){ - try { - ss = new ServerSocket(); - ss.setReuseAddress(true); - if (self.getQuorumListenOnAllIPs()) { - int port = self.quorumPeers.get(self.getId()).electionAddr.getPort(); - addr = new InetSocketAddress(port); - } else { - addr = self.quorumPeers.get(self.getId()).electionAddr; - } - LOG.info("My election bind port: " + addr.toString()); - setName(self.quorumPeers.get(self.getId()).electionAddr - .toString()); - ss.bind(addr); - while (!shutdown) { - Socket client = ss.accept(); - setSockOpts(client); - LOG.info("Received connection request " - + client.getRemoteSocketAddress()); - receiveConnection(client); - numRetries = 0; - } - } catch (IOException e) { - LOG.error("Exception while listening", e); - numRetries++; - try { - ss.close(); - Thread.sleep(1000); - } catch (IOException ie) { - LOG.error("Error closing server socket", ie); - } catch (InterruptedException ie) { - LOG.error("Interrupted while sleeping. " + - "Ignoring exception", ie); - } - } - } - LOG.info("Leaving listener"); - if (!shutdown) { - LOG.error("As I'm leaving the listener thread, " - + "I won't be able to participate in leader " - + "election any longer: " - + self.quorumPeers.get(self.getId()).electionAddr); - } - } - - /** - * Halts this listener thread. - */ - void halt(){ - try{ - LOG.debug("Trying to close listener: " + ss); - if(ss != null) { - LOG.debug("Closing listener: " + self.getId()); - ss.close(); - } - } catch (IOException e){ - LOG.warn("Exception when shutting down listener: " + e); - } - } - } - - /** - * Thread to send messages. Instance waits on a queue, and send a message as - * soon as there is one available. If connection breaks, then opens a new - * one. - */ - class SendWorker extends Thread { - Long sid; - Socket sock; - RecvWorker recvWorker; - volatile boolean running = true; - DataOutputStream dout; - - /** - * An instance of this thread receives messages to send - * through a queue and sends them to the server sid. - * - * @param sock - * Socket to remote peer - * @param sid - * Server identifier of remote peer - */ - SendWorker(Socket sock, Long sid) { - super("SendWorker:" + sid); - this.sid = sid; - this.sock = sock; - recvWorker = null; - try { - dout = new DataOutputStream(sock.getOutputStream()); - } catch (IOException e) { - LOG.error("Unable to access socket output stream", e); - closeSocket(sock); - running = false; - } - LOG.debug("Address of remote peer: " + this.sid); - } - - synchronized void setRecv(RecvWorker recvWorker) { - this.recvWorker = recvWorker; - } - - /** - * Returns RecvWorker that pairs up with this SendWorker. - * - * @return RecvWorker - */ - synchronized RecvWorker getRecvWorker(){ - return recvWorker; - } - - synchronized boolean finish() { - if (LOG.isDebugEnabled()) { - LOG.debug("Calling finish for " + sid); - } - - if(!running){ - /* - * Avoids running finish() twice. - */ - return running; - } - - running = false; - closeSocket(sock); - // channel = null; - - this.interrupt(); - if (recvWorker != null) { - recvWorker.finish(); - } - - if (LOG.isDebugEnabled()) { - LOG.debug("Removing entry from senderWorkerMap sid=" + sid); - } - senderWorkerMap.remove(sid, this); - threadCnt.decrementAndGet(); - return running; - } - - synchronized void send(ByteBuffer b) throws IOException { - byte[] msgBytes = new byte[b.capacity()]; - try { - b.position(0); - b.get(msgBytes); - } catch (BufferUnderflowException be) { - LOG.error("BufferUnderflowException ", be); - return; - } - dout.writeInt(b.capacity()); - dout.write(b.array()); - dout.flush(); - } - - @Override - public void run() { - threadCnt.incrementAndGet(); - try { - /** - * If there is nothing in the queue to send, then we - * send the lastMessage to ensure that the last message - * was received by the peer. The message could be dropped - * in case self or the peer shutdown their connection - * (and exit the thread) prior to reading/processing - * the last message. Duplicate messages are handled correctly - * by the peer. - * - * If the send queue is non-empty, then we have a recent - * message than that stored in lastMessage. To avoid sending - * stale message, we should send the message in the send queue. - */ - ArrayBlockingQueue bq = queueSendMap.get(sid); - if (bq == null || isSendQueueEmpty(bq)) { - ByteBuffer b = lastMessageSent.get(sid); - if (b != null) { - LOG.debug("Attempting to send lastMessage to sid=" + sid); - send(b); - } - } - } catch (IOException e) { - LOG.error("Failed to send last message. Shutting down thread.", e); - this.finish(); - } - - try { - while (running && !shutdown && sock != null) { - - ByteBuffer b = null; - try { - ArrayBlockingQueue bq = queueSendMap - .get(sid); - if (bq != null) { - b = pollSendQueue(bq, 1000, TimeUnit.MILLISECONDS); - } else { - LOG.error("No queue of incoming messages for " + - "server " + sid); - break; - } - - if(b != null){ - lastMessageSent.put(sid, b); - send(b); - } - } catch (InterruptedException e) { - LOG.warn("Interrupted while waiting for message on queue", - e); - } - } - } catch (Exception e) { - LOG.warn("Exception when using channel: for id " + sid + " my id = " + - self.getId() + " error = " + e); - } - this.finish(); - LOG.warn("Send worker leaving thread"); - } - } - - /** - * Thread to receive messages. Instance waits on a socket read. If the - * channel breaks, then removes itself from the pool of receivers. - */ - class RecvWorker extends Thread { - Long sid; - Socket sock; - volatile boolean running = true; - DataInputStream din; - final SendWorker sw; - - RecvWorker(Socket sock, Long sid, SendWorker sw) { - super("RecvWorker:" + sid); - this.sid = sid; - this.sock = sock; - this.sw = sw; - try { - din = new DataInputStream(sock.getInputStream()); - // OK to wait until socket disconnects while reading. - sock.setSoTimeout(0); - } catch (IOException e) { - LOG.error("Error while accessing socket for " + sid, e); - closeSocket(sock); - running = false; - } - } - - /** - * Shuts down this worker - * - * @return boolean Value of variable running - */ - synchronized boolean finish() { - if(!running){ - /* - * Avoids running finish() twice. - */ - return running; - } - running = false; - - this.interrupt(); - threadCnt.decrementAndGet(); - return running; - } - - @Override - public void run() { - threadCnt.incrementAndGet(); - try { - while (running && !shutdown && sock != null) { - /** - * Reads the first int to determine the length of the - * message - */ - int length = din.readInt(); - if (length <= 0 || length > PACKETMAXSIZE) { - throw new IOException( - "Received packet with invalid packet: " - + length); - } - /** - * Allocates a new ByteBuffer to receive the message - */ - byte[] msgArray = new byte[length]; - din.readFully(msgArray, 0, length); - ByteBuffer message = ByteBuffer.wrap(msgArray); - addToRecvQueue(new Message(message.duplicate(), sid)); - } - } catch (Exception e) { - LOG.warn("Connection broken for id " + sid + ", my id = " + - self.getId() + ", error = " , e); - } finally { - LOG.warn("Interrupting SendWorker"); - sw.finish(); - if (sock != null) { - closeSocket(sock); - } - } - } - } - - /** - * Inserts an element in the specified queue. If the Queue is full, this - * method removes an element from the head of the Queue and then inserts - * the element at the tail. It can happen that the an element is removed - * by another thread in {@link SendWorker#processMessage() processMessage} - * method before this method attempts to remove an element from the queue. - * This will cause {@link ArrayBlockingQueue#remove() remove} to throw an - * exception, which is safe to ignore. - * - * Unlike {@link #addToRecvQueue(Message) addToRecvQueue} this method does - * not need to be synchronized since there is only one thread that inserts - * an element in the queue and another thread that reads from the queue. - * - * @param queue - * Reference to the Queue - * @param buffer - * Reference to the buffer to be inserted in the queue - */ - private void addToSendQueue(ArrayBlockingQueue queue, - ByteBuffer buffer) { - if (queue.remainingCapacity() == 0) { - try { - queue.remove(); - } catch (NoSuchElementException ne) { - // element could be removed by poll() - LOG.debug("Trying to remove from an empty " + - "Queue. Ignoring exception " + ne); - } - } - try { - queue.add(buffer); - } catch (IllegalStateException ie) { - // This should never happen - LOG.error("Unable to insert an element in the queue " + ie); - } - } - - /** - * Returns true if queue is empty. - * @param queue - * Reference to the queue - * @return - * true if the specified queue is empty - */ - private boolean isSendQueueEmpty(ArrayBlockingQueue queue) { - return queue.isEmpty(); - } - - /** - * Retrieves and removes buffer at the head of this queue, - * waiting up to the specified wait time if necessary for an element to - * become available. - * - * {@link ArrayBlockingQueue#poll(long, java.util.concurrent.TimeUnit)} - */ - private ByteBuffer pollSendQueue(ArrayBlockingQueue queue, - long timeout, TimeUnit unit) throws InterruptedException { - return queue.poll(timeout, unit); - } - - /** - * Inserts an element in the {@link #recvQueue}. If the Queue is full, this - * methods removes an element from the head of the Queue and then inserts - * the element at the tail of the queue. - * - * This method is synchronized to achieve fairness between two threads that - * are trying to insert an element in the queue. Each thread checks if the - * queue is full, then removes the element at the head of the queue, and - * then inserts an element at the tail. This three-step process is done to - * prevent a thread from blocking while inserting an element in the queue. - * If we do not synchronize the call to this method, then a thread can grab - * a slot in the queue created by the second thread. This can cause the call - * to insert by the second thread to fail. - * Note that synchronizing this method does not block another thread - * from polling the queue since that synchronization is provided by the - * queue itself. - * - * @param msg - * Reference to the message to be inserted in the queue - */ - public void addToRecvQueue(Message msg) { - synchronized(recvQLock) { - if (recvQueue.remainingCapacity() == 0) { - try { - recvQueue.remove(); - } catch (NoSuchElementException ne) { - // element could be removed by poll() - LOG.debug("Trying to remove from an empty " + - "recvQueue. Ignoring exception " + ne); - } - } - try { - recvQueue.add(msg); - } catch (IllegalStateException ie) { - // This should never happen - LOG.error("Unable to insert element in the recvQueue " + ie); - } - } - } - - /** - * Retrieves and removes a message at the head of this queue, - * waiting up to the specified wait time if necessary for an element to - * become available. - * - * {@link ArrayBlockingQueue#poll(long, java.util.concurrent.TimeUnit)} - */ - public Message pollRecvQueue(long timeout, TimeUnit unit) - throws InterruptedException { - return recvQueue.poll(timeout, unit); - } -} diff --git a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/quorum/QuorumMXBean.java b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/quorum/QuorumMXBean.java deleted file mode 100644 index 2edce68d9..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/quorum/QuorumMXBean.java +++ /dev/null @@ -1,34 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you 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. - */ - -package org.apache.zookeeper.server.quorum; - -/** - * An MBean representing a zookeeper cluster nodes (aka quorum peers) - */ -public interface QuorumMXBean { - /** - * @return the name of the quorum - */ - public String getName(); - - /** - * @return configured number of peers in the quorum - */ - public int getQuorumSize(); -} diff --git a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/quorum/QuorumPeer.java b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/quorum/QuorumPeer.java deleted file mode 100644 index df2a7413f..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/quorum/QuorumPeer.java +++ /dev/null @@ -1,1249 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you 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. - */ -package org.apache.zookeeper.server.quorum; - -import java.io.BufferedReader; -import java.io.BufferedWriter; -import java.io.File; -import java.io.FileNotFoundException; -import java.io.FileReader; -import java.io.IOException; -import java.io.OutputStreamWriter; -import java.net.DatagramPacket; -import java.net.DatagramSocket; -import java.net.InetSocketAddress; -import java.net.SocketException; -import java.nio.ByteBuffer; -import java.util.ArrayList; -import java.util.Collections; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -import org.apache.zookeeper.common.AtomicFileOutputStream; -import org.apache.zookeeper.jmx.MBeanRegistry; -import org.apache.zookeeper.jmx.ZKMBeanInfo; -import org.apache.zookeeper.server.ServerCnxnFactory; -import org.apache.zookeeper.server.ZKDatabase; -import org.apache.zookeeper.server.ZooKeeperServer; -import org.apache.zookeeper.server.persistence.FileTxnSnapLog; -import org.apache.zookeeper.server.quorum.flexible.QuorumMaj; -import org.apache.zookeeper.server.quorum.flexible.QuorumVerifier; -import org.apache.zookeeper.server.util.ZxidUtils; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -/** - * This class manages the quorum protocol. There are three states this server - * can be in: - *
          - *
        1. Leader election - each server will elect a leader (proposing itself as a - * leader initially).
        2. - *
        3. Follower - the server will synchronize with the leader and replicate any - * transactions.
        4. - *
        5. Leader - the server will process requests and forward them to followers. - * A majority of followers must log the request before it can be accepted. - *
        - * - * This class will setup a datagram socket that will always respond with its - * view of the current leader. The response will take the form of: - * - *
        - * int xid;
        - *
        - * long myid;
        - *
        - * long leader_id;
        - *
        - * long leader_zxid;
        - * 
        - * - * The request for the current leader will consist solely of an xid: int xid; - */ -public class QuorumPeer extends Thread implements QuorumStats.Provider { - private static final Logger LOG = LoggerFactory.getLogger(QuorumPeer.class); - - QuorumBean jmxQuorumBean; - LocalPeerBean jmxLocalPeerBean; - LeaderElectionBean jmxLeaderElectionBean; - QuorumCnxManager qcm; - - /* ZKDatabase is a top level member of quorumpeer - * which will be used in all the zookeeperservers - * instantiated later. Also, it is created once on - * bootup and only thrown away in case of a truncate - * message from the leader - */ - private ZKDatabase zkDb; - - public static class QuorumServer { - public QuorumServer(long id, InetSocketAddress addr, - InetSocketAddress electionAddr) { - this.id = id; - this.addr = addr; - this.electionAddr = electionAddr; - } - - public QuorumServer(long id, InetSocketAddress addr) { - this.id = id; - this.addr = addr; - this.electionAddr = null; - } - - public QuorumServer(long id, InetSocketAddress addr, - InetSocketAddress electionAddr, LearnerType type) { - this.id = id; - this.addr = addr; - this.electionAddr = electionAddr; - this.type = type; - } - - public InetSocketAddress addr; - - public InetSocketAddress electionAddr; - - public long id; - - public LearnerType type = LearnerType.PARTICIPANT; - } - - public enum ServerState { - LOOKING, FOLLOWING, LEADING, OBSERVING; - } - - /* - * A peer can either be participating, which implies that it is willing to - * both vote in instances of consensus and to elect or become a Leader, or - * it may be observing in which case it isn't. - * - * We need this distinction to decide which ServerState to move to when - * conditions change (e.g. which state to become after LOOKING). - */ - public enum LearnerType { - PARTICIPANT, OBSERVER; - } - - /* - * To enable observers to have no identifier, we need a generic identifier - * at least for QuorumCnxManager. We use the following constant to as the - * value of such a generic identifier. - */ - - static final long OBSERVER_ID = Long.MAX_VALUE; - - /* - * Record leader election time - */ - public long start_fle, end_fle; - - /* - * Default value of peer is participant - */ - private LearnerType learnerType = LearnerType.PARTICIPANT; - - public LearnerType getLearnerType() { - return learnerType; - } - - /** - * Sets the LearnerType both in the QuorumPeer and in the peerMap - */ - public void setLearnerType(LearnerType p) { - learnerType = p; - if (quorumPeers.containsKey(this.myid)) { - this.quorumPeers.get(myid).type = p; - } else { - LOG.error("Setting LearnerType to " + p + " but " + myid - + " not in QuorumPeers. "); - } - - } - /** - * The servers that make up the cluster - */ - protected Map quorumPeers; - public int getQuorumSize(){ - return getVotingView().size(); - } - - /** - * QuorumVerifier implementation; default (majority). - */ - - private QuorumVerifier quorumConfig; - - /** - * My id - */ - private long myid; - - - /** - * get the id of this quorum peer. - */ - public long getId() { - return myid; - } - - /** - * This is who I think the leader currently is. - */ - volatile private Vote currentVote; - - /** - * ... and its counterpart for backward compatibility - */ - volatile private Vote bcVote; - - public synchronized Vote getCurrentVote(){ - return currentVote; - } - - public synchronized void setCurrentVote(Vote v){ - currentVote = v; - } - - synchronized Vote getBCVote() { - if (bcVote == null) { - return currentVote; - } else { - return bcVote; - } - } - - synchronized void setBCVote(Vote v) { - bcVote = v; - } - - volatile boolean running = true; - - /** - * The number of milliseconds of each tick - */ - protected int tickTime; - - /** - * Minimum number of milliseconds to allow for session timeout. - * A value of -1 indicates unset, use default. - */ - protected int minSessionTimeout = -1; - - /** - * Maximum number of milliseconds to allow for session timeout. - * A value of -1 indicates unset, use default. - */ - protected int maxSessionTimeout = -1; - - /** - * The number of ticks that the initial synchronization phase can take - */ - protected int initLimit; - - /** - * The number of ticks that can pass between sending a request and getting - * an acknowledgment - */ - protected int syncLimit; - - /** - * Enables/Disables sync request processor. This option is enabled - * by default and is to be used with observers. - */ - protected boolean syncEnabled = true; - - /** - * The current tick - */ - protected volatile int tick; - - /** - * Whether or not to listen on all IPs for the two quorum ports - * (broadcast and fast leader election). - */ - protected boolean quorumListenOnAllIPs = false; - - /** - * @deprecated As of release 3.4.0, this class has been deprecated, since - * it is used with one of the udp-based versions of leader election, which - * we are also deprecating. - * - * This class simply responds to requests for the current leader of this - * node. - *

        - * The request contains just an xid generated by the requestor. - *

        - * The response has the xid, the id of this server, the id of the leader, - * and the zxid of the leader. - * - * - */ - @Deprecated - class ResponderThread extends Thread { - ResponderThread() { - super("ResponderThread"); - } - - volatile boolean running = true; - - @Override - public void run() { - try { - byte b[] = new byte[36]; - ByteBuffer responseBuffer = ByteBuffer.wrap(b); - DatagramPacket packet = new DatagramPacket(b, b.length); - while (running) { - udpSocket.receive(packet); - if (packet.getLength() != 4) { - LOG.warn("Got more than just an xid! Len = " - + packet.getLength()); - } else { - responseBuffer.clear(); - responseBuffer.getInt(); // Skip the xid - responseBuffer.putLong(myid); - Vote current = getCurrentVote(); - switch (getPeerState()) { - case LOOKING: - responseBuffer.putLong(current.getId()); - responseBuffer.putLong(current.getZxid()); - break; - case LEADING: - responseBuffer.putLong(myid); - try { - long proposed; - synchronized(leader) { - proposed = leader.lastProposed; - } - responseBuffer.putLong(proposed); - } catch (NullPointerException npe) { - // This can happen in state transitions, - // just ignore the request - } - break; - case FOLLOWING: - responseBuffer.putLong(current.getId()); - try { - responseBuffer.putLong(follower.getZxid()); - } catch (NullPointerException npe) { - // This can happen in state transitions, - // just ignore the request - } - break; - case OBSERVING: - // Do nothing, Observers keep themselves to - // themselves. - break; - } - packet.setData(b); - udpSocket.send(packet); - } - packet.setLength(b.length); - } - } catch (RuntimeException e) { - LOG.warn("Unexpected runtime exception in ResponderThread",e); - } catch (IOException e) { - LOG.warn("Unexpected IO exception in ResponderThread",e); - } finally { - LOG.warn("QuorumPeer responder thread exited"); - } - } - } - - private ServerState state = ServerState.LOOKING; - - public synchronized void setPeerState(ServerState newState){ - state=newState; - } - - public synchronized ServerState getPeerState(){ - return state; - } - - DatagramSocket udpSocket; - - private InetSocketAddress myQuorumAddr; - - public InetSocketAddress getQuorumAddress(){ - return myQuorumAddr; - } - - private int electionType; - - Election electionAlg; - - ServerCnxnFactory cnxnFactory; - private FileTxnSnapLog logFactory = null; - - private final QuorumStats quorumStats; - - public QuorumPeer() { - super("QuorumPeer"); - quorumStats = new QuorumStats(this); - } - - - /** - * For backward compatibility purposes, we instantiate QuorumMaj by default. - */ - - public QuorumPeer(Map quorumPeers, File dataDir, - File dataLogDir, int electionType, - long myid, int tickTime, int initLimit, int syncLimit, - ServerCnxnFactory cnxnFactory) throws IOException { - this(quorumPeers, dataDir, dataLogDir, electionType, myid, tickTime, - initLimit, syncLimit, false, cnxnFactory, - new QuorumMaj(countParticipants(quorumPeers))); - } - - public QuorumPeer(Map quorumPeers, File dataDir, - File dataLogDir, int electionType, - long myid, int tickTime, int initLimit, int syncLimit, - boolean quorumListenOnAllIPs, - ServerCnxnFactory cnxnFactory, - QuorumVerifier quorumConfig) throws IOException { - this(); - this.cnxnFactory = cnxnFactory; - this.quorumPeers = quorumPeers; - this.electionType = electionType; - this.myid = myid; - this.tickTime = tickTime; - this.initLimit = initLimit; - this.syncLimit = syncLimit; - this.quorumListenOnAllIPs = quorumListenOnAllIPs; - this.logFactory = new FileTxnSnapLog(dataLogDir, dataDir); - this.zkDb = new ZKDatabase(this.logFactory); - if(quorumConfig == null) - this.quorumConfig = new QuorumMaj(countParticipants(quorumPeers)); - else this.quorumConfig = quorumConfig; - } - - QuorumStats quorumStats() { - return quorumStats; - } - - @Override - public synchronized void start() { - loadDataBase(); - cnxnFactory.start(); - startLeaderElection(); - super.start(); - } - - private void loadDataBase() { - File updating = new File(getTxnFactory().getSnapDir(), - UPDATING_EPOCH_FILENAME); - try { - zkDb.loadDataBase(); - - // load the epochs - long lastProcessedZxid = zkDb.getDataTree().lastProcessedZxid; - long epochOfZxid = ZxidUtils.getEpochFromZxid(lastProcessedZxid); - try { - currentEpoch = readLongFromFile(CURRENT_EPOCH_FILENAME); - if (epochOfZxid > currentEpoch && updating.exists()) { - LOG.info("{} found. The server was terminated after " + - "taking a snapshot but before updating current " + - "epoch. Setting current epoch to {}.", - UPDATING_EPOCH_FILENAME, epochOfZxid); - setCurrentEpoch(epochOfZxid); - if (!updating.delete()) { - throw new IOException("Failed to delete " + - updating.toString()); - } - } - } catch(FileNotFoundException e) { - // pick a reasonable epoch number - // this should only happen once when moving to a - // new code version - currentEpoch = epochOfZxid; - LOG.info(CURRENT_EPOCH_FILENAME - + " not found! Creating with a reasonable default of {}. This should only happen when you are upgrading your installation", - currentEpoch); - writeLongToFile(CURRENT_EPOCH_FILENAME, currentEpoch); - } - if (epochOfZxid > currentEpoch) { - throw new IOException("The current epoch, " + ZxidUtils.zxidToString(currentEpoch) + ", is older than the last zxid, " + lastProcessedZxid); - } - try { - acceptedEpoch = readLongFromFile(ACCEPTED_EPOCH_FILENAME); - } catch(FileNotFoundException e) { - // pick a reasonable epoch number - // this should only happen once when moving to a - // new code version - acceptedEpoch = epochOfZxid; - LOG.info(ACCEPTED_EPOCH_FILENAME - + " not found! Creating with a reasonable default of {}. This should only happen when you are upgrading your installation", - acceptedEpoch); - writeLongToFile(ACCEPTED_EPOCH_FILENAME, acceptedEpoch); - } - if (acceptedEpoch < currentEpoch) { - throw new IOException("The current epoch, " + ZxidUtils.zxidToString(currentEpoch) + " is less than the accepted epoch, " + ZxidUtils.zxidToString(acceptedEpoch)); - } - } catch(IOException ie) { - LOG.error("Unable to load database on disk", ie); - throw new RuntimeException("Unable to run quorum server ", ie); - } - } - - ResponderThread responder; - - synchronized public void stopLeaderElection() { - responder.running = false; - responder.interrupt(); - } - synchronized public void startLeaderElection() { - try { - currentVote = new Vote(myid, getLastLoggedZxid(), getCurrentEpoch()); - } catch(IOException e) { - RuntimeException re = new RuntimeException(e.getMessage()); - re.setStackTrace(e.getStackTrace()); - throw re; - } - for (QuorumServer p : getView().values()) { - if (p.id == myid) { - myQuorumAddr = p.addr; - break; - } - } - if (myQuorumAddr == null) { - throw new RuntimeException("My id " + myid + " not in the peer list"); - } - if (electionType == 0) { - try { - udpSocket = new DatagramSocket(myQuorumAddr.getPort()); - responder = new ResponderThread(); - responder.start(); - } catch (SocketException e) { - throw new RuntimeException(e); - } - } - this.electionAlg = createElectionAlgorithm(electionType); - } - - /** - * Count the number of nodes in the map that could be followers. - * @param peers - * @return The number of followers in the map - */ - protected static int countParticipants(Map peers) { - int count = 0; - for (QuorumServer q : peers.values()) { - if (q.type == LearnerType.PARTICIPANT) { - count++; - } - } - return count; - } - - /** - * This constructor is only used by the existing unit test code. - * It defaults to FileLogProvider persistence provider. - */ - public QuorumPeer(Map quorumPeers, File snapDir, - File logDir, int clientPort, int electionAlg, - long myid, int tickTime, int initLimit, int syncLimit) - throws IOException - { - this(quorumPeers, snapDir, logDir, electionAlg, - myid,tickTime, initLimit,syncLimit, false, - ServerCnxnFactory.createFactory(new InetSocketAddress(clientPort), -1), - new QuorumMaj(countParticipants(quorumPeers))); - } - - /** - * This constructor is only used by the existing unit test code. - * It defaults to FileLogProvider persistence provider. - */ - public QuorumPeer(Map quorumPeers, File snapDir, - File logDir, int clientPort, int electionAlg, - long myid, int tickTime, int initLimit, int syncLimit, - QuorumVerifier quorumConfig) - throws IOException - { - this(quorumPeers, snapDir, logDir, electionAlg, - myid,tickTime, initLimit,syncLimit, false, - ServerCnxnFactory.createFactory(new InetSocketAddress(clientPort), -1), - quorumConfig); - } - - /** - * returns the highest zxid that this host has seen - * - * @return the highest zxid for this host - */ - public long getLastLoggedZxid() { - if (!zkDb.isInitialized()) { - loadDataBase(); - } - return zkDb.getDataTreeLastProcessedZxid(); - } - - public Follower follower; - public Leader leader; - public Observer observer; - - protected Follower makeFollower(FileTxnSnapLog logFactory) throws IOException { - return new Follower(this, new FollowerZooKeeperServer(logFactory, - this,new ZooKeeperServer.BasicDataTreeBuilder(), this.zkDb)); - } - - protected Leader makeLeader(FileTxnSnapLog logFactory) throws IOException { - return new Leader(this, new LeaderZooKeeperServer(logFactory, - this,new ZooKeeperServer.BasicDataTreeBuilder(), this.zkDb)); - } - - protected Observer makeObserver(FileTxnSnapLog logFactory) throws IOException { - return new Observer(this, new ObserverZooKeeperServer(logFactory, - this, new ZooKeeperServer.BasicDataTreeBuilder(), this.zkDb)); - } - - protected Election createElectionAlgorithm(int electionAlgorithm){ - Election le=null; - - //TODO: use a factory rather than a switch - switch (electionAlgorithm) { - case 0: - le = new LeaderElection(this); - break; - case 1: - le = new AuthFastLeaderElection(this); - break; - case 2: - le = new AuthFastLeaderElection(this, true); - break; - case 3: - qcm = new QuorumCnxManager(this); - QuorumCnxManager.Listener listener = qcm.listener; - if(listener != null){ - listener.start(); - le = new FastLeaderElection(this, qcm); - } else { - LOG.error("Null listener when initializing cnx manager"); - } - break; - default: - assert false; - } - return le; - } - - protected Election makeLEStrategy(){ - LOG.debug("Initializing leader election protocol..."); - if (getElectionType() == 0) { - electionAlg = new LeaderElection(this); - } - return electionAlg; - } - - synchronized protected void setLeader(Leader newLeader){ - leader=newLeader; - } - - synchronized protected void setFollower(Follower newFollower){ - follower=newFollower; - } - - synchronized protected void setObserver(Observer newObserver){ - observer=newObserver; - } - - synchronized public ZooKeeperServer getActiveServer(){ - if(leader!=null) - return leader.zk; - else if(follower!=null) - return follower.zk; - else if (observer != null) - return observer.zk; - return null; - } - - @Override - public void run() { - setName("QuorumPeer" + "[myid=" + getId() + "]" + - cnxnFactory.getLocalAddress()); - - LOG.debug("Starting quorum peer"); - try { - jmxQuorumBean = new QuorumBean(this); - MBeanRegistry.getInstance().register(jmxQuorumBean, null); - for(QuorumServer s: getView().values()){ - ZKMBeanInfo p; - if (getId() == s.id) { - p = jmxLocalPeerBean = new LocalPeerBean(this); - try { - MBeanRegistry.getInstance().register(p, jmxQuorumBean); - } catch (Exception e) { - LOG.warn("Failed to register with JMX", e); - jmxLocalPeerBean = null; - } - } else { - p = new RemotePeerBean(s); - try { - MBeanRegistry.getInstance().register(p, jmxQuorumBean); - } catch (Exception e) { - LOG.warn("Failed to register with JMX", e); - } - } - } - } catch (Exception e) { - LOG.warn("Failed to register with JMX", e); - jmxQuorumBean = null; - } - - try { - /* - * Main loop - */ - while (running) { - switch (getPeerState()) { - case LOOKING: - LOG.info("LOOKING"); - - if (Boolean.getBoolean("readonlymode.enabled")) { - LOG.info("Attempting to start ReadOnlyZooKeeperServer"); - - // Create read-only server but don't start it immediately - final ReadOnlyZooKeeperServer roZk = new ReadOnlyZooKeeperServer( - logFactory, this, - new ZooKeeperServer.BasicDataTreeBuilder(), - this.zkDb); - - // Instead of starting roZk immediately, wait some grace - // period before we decide we're partitioned. - // - // Thread is used here because otherwise it would require - // changes in each of election strategy classes which is - // unnecessary code coupling. - Thread roZkMgr = new Thread() { - public void run() { - try { - // lower-bound grace period to 2 secs - sleep(Math.max(2000, tickTime)); - if (ServerState.LOOKING.equals(getPeerState())) { - roZk.startup(); - } - } catch (InterruptedException e) { - LOG.info("Interrupted while attempting to start ReadOnlyZooKeeperServer, not started"); - } catch (Exception e) { - LOG.error("FAILED to start ReadOnlyZooKeeperServer", e); - } - } - }; - try { - roZkMgr.start(); - setBCVote(null); - setCurrentVote(makeLEStrategy().lookForLeader()); - } catch (Exception e) { - LOG.warn("Unexpected exception",e); - setPeerState(ServerState.LOOKING); - } finally { - // If the thread is in the the grace period, interrupt - // to come out of waiting. - roZkMgr.interrupt(); - roZk.shutdown(); - } - } else { - try { - setBCVote(null); - setCurrentVote(makeLEStrategy().lookForLeader()); - } catch (Exception e) { - LOG.warn("Unexpected exception", e); - setPeerState(ServerState.LOOKING); - } - } - break; - case OBSERVING: - try { - LOG.info("OBSERVING"); - setObserver(makeObserver(logFactory)); - observer.observeLeader(); - } catch (Exception e) { - LOG.warn("Unexpected exception",e ); - } finally { - observer.shutdown(); - setObserver(null); - setPeerState(ServerState.LOOKING); - } - break; - case FOLLOWING: - try { - LOG.info("FOLLOWING"); - setFollower(makeFollower(logFactory)); - follower.followLeader(); - } catch (Exception e) { - LOG.warn("Unexpected exception",e); - } finally { - follower.shutdown(); - setFollower(null); - setPeerState(ServerState.LOOKING); - } - break; - case LEADING: - LOG.info("LEADING"); - try { - setLeader(makeLeader(logFactory)); - leader.lead(); - setLeader(null); - } catch (Exception e) { - LOG.warn("Unexpected exception",e); - } finally { - if (leader != null) { - leader.shutdown("Forcing shutdown"); - setLeader(null); - } - setPeerState(ServerState.LOOKING); - } - break; - } - } - } finally { - LOG.warn("QuorumPeer main thread exited"); - try { - MBeanRegistry.getInstance().unregisterAll(); - } catch (Exception e) { - LOG.warn("Failed to unregister with JMX", e); - } - jmxQuorumBean = null; - jmxLocalPeerBean = null; - } - } - - public void shutdown() { - running = false; - if (leader != null) { - leader.shutdown("quorum Peer shutdown"); - } - if (follower != null) { - follower.shutdown(); - } - cnxnFactory.shutdown(); - if(udpSocket != null) { - udpSocket.close(); - } - - if(getElectionAlg() != null){ - this.interrupt(); - getElectionAlg().shutdown(); - } - try { - zkDb.close(); - } catch (IOException ie) { - LOG.warn("Error closing logs ", ie); - } - } - - /** - * A 'view' is a node's current opinion of the membership of the entire - * ensemble. - */ - public Map getView() { - return Collections.unmodifiableMap(this.quorumPeers); - } - - /** - * Observers are not contained in this view, only nodes with - * PeerType=PARTICIPANT. - */ - public Map getVotingView() { - Map ret = - new HashMap(); - Map view = getView(); - for (QuorumServer server : view.values()) { - if (server.type == LearnerType.PARTICIPANT) { - ret.put(server.id, server); - } - } - return ret; - } - - /** - * Returns only observers, no followers. - */ - public Map getObservingView() { - Map ret = - new HashMap(); - Map view = getView(); - for (QuorumServer server : view.values()) { - if (server.type == LearnerType.OBSERVER) { - ret.put(server.id, server); - } - } - return ret; - } - - /** - * Check if a node is in the current view. With static membership, the - * result of this check will never change; only when dynamic membership - * is introduced will this be more useful. - */ - public boolean viewContains(Long sid) { - return this.quorumPeers.containsKey(sid); - } - - /** - * Only used by QuorumStats at the moment - */ - public String[] getQuorumPeers() { - List l = new ArrayList(); - synchronized (this) { - if (leader != null) { - for (LearnerHandler fh : leader.getLearners()) { - if (fh.getSocket() != null) { - String s = fh.getSocket().getRemoteSocketAddress().toString(); - if (leader.isLearnerSynced(fh)) - s += "*"; - l.add(s); - } - } - } else if (follower != null) { - l.add(follower.sock.getRemoteSocketAddress().toString()); - } - } - return l.toArray(new String[0]); - } - - public String getServerState() { - switch (getPeerState()) { - case LOOKING: - return QuorumStats.Provider.LOOKING_STATE; - case LEADING: - return QuorumStats.Provider.LEADING_STATE; - case FOLLOWING: - return QuorumStats.Provider.FOLLOWING_STATE; - case OBSERVING: - return QuorumStats.Provider.OBSERVING_STATE; - } - return QuorumStats.Provider.UNKNOWN_STATE; - } - - - /** - * get the id of this quorum peer. - */ - public long getMyid() { - return myid; - } - - /** - * set the id of this quorum peer. - */ - public void setMyid(long myid) { - this.myid = myid; - } - - /** - * Get the number of milliseconds of each tick - */ - public int getTickTime() { - return tickTime; - } - - /** - * Set the number of milliseconds of each tick - */ - public void setTickTime(int tickTime) { - LOG.info("tickTime set to " + tickTime); - this.tickTime = tickTime; - } - - /** Maximum number of connections allowed from particular host (ip) */ - public int getMaxClientCnxnsPerHost() { - ServerCnxnFactory fac = getCnxnFactory(); - if (fac == null) { - return -1; - } - return fac.getMaxClientCnxnsPerHost(); - } - - /** minimum session timeout in milliseconds */ - public int getMinSessionTimeout() { - return minSessionTimeout == -1 ? tickTime * 2 : minSessionTimeout; - } - - /** minimum session timeout in milliseconds */ - public void setMinSessionTimeout(int min) { - LOG.info("minSessionTimeout set to " + min); - this.minSessionTimeout = min; - } - - /** maximum session timeout in milliseconds */ - public int getMaxSessionTimeout() { - return maxSessionTimeout == -1 ? tickTime * 20 : maxSessionTimeout; - } - - /** minimum session timeout in milliseconds */ - public void setMaxSessionTimeout(int max) { - LOG.info("maxSessionTimeout set to " + max); - this.maxSessionTimeout = max; - } - - /** - * Get the number of ticks that the initial synchronization phase can take - */ - public int getInitLimit() { - return initLimit; - } - - /** - * Set the number of ticks that the initial synchronization phase can take - */ - public void setInitLimit(int initLimit) { - LOG.info("initLimit set to " + initLimit); - this.initLimit = initLimit; - } - - /** - * Get the current tick - */ - public int getTick() { - return tick; - } - - /** - * Return QuorumVerifier object - */ - - public QuorumVerifier getQuorumVerifier(){ - return quorumConfig; - - } - - public void setQuorumVerifier(QuorumVerifier quorumConfig){ - this.quorumConfig = quorumConfig; - } - - /** - * Get an instance of LeaderElection - */ - - public Election getElectionAlg(){ - return electionAlg; - } - - /** - * Get the synclimit - */ - public int getSyncLimit() { - return syncLimit; - } - - /** - * Set the synclimit - */ - public void setSyncLimit(int syncLimit) { - this.syncLimit = syncLimit; - } - - - /** - * The syncEnabled can also be set via a system property. - */ - public static final String SYNC_ENABLED = "zookeeper.observer.syncEnabled"; - - /** - * Return syncEnabled. - * - * @return - */ - public boolean getSyncEnabled() { - if (System.getProperty(SYNC_ENABLED) != null) { - LOG.info(SYNC_ENABLED + "=" + Boolean.getBoolean(SYNC_ENABLED)); - return Boolean.getBoolean(SYNC_ENABLED); - } else { - return syncEnabled; - } - } - - /** - * Set syncEnabled. - * - * @param syncEnabled - */ - public void setSyncEnabled(boolean syncEnabled) { - this.syncEnabled = syncEnabled; - } - - /** - * Gets the election type - */ - public int getElectionType() { - return electionType; - } - - /** - * Sets the election type - */ - public void setElectionType(int electionType) { - this.electionType = electionType; - } - - public boolean getQuorumListenOnAllIPs() { - return quorumListenOnAllIPs; - } - - public void setQuorumListenOnAllIPs(boolean quorumListenOnAllIPs) { - this.quorumListenOnAllIPs = quorumListenOnAllIPs; - } - - public ServerCnxnFactory getCnxnFactory() { - return cnxnFactory; - } - - public void setCnxnFactory(ServerCnxnFactory cnxnFactory) { - this.cnxnFactory = cnxnFactory; - } - - public void setQuorumPeers(Map quorumPeers) { - this.quorumPeers = quorumPeers; - } - - public int getClientPort() { - return cnxnFactory.getLocalPort(); - } - - public void setClientPortAddress(InetSocketAddress addr) { - } - - public void setTxnFactory(FileTxnSnapLog factory) { - this.logFactory = factory; - } - - public FileTxnSnapLog getTxnFactory() { - return this.logFactory; - } - - /** - * set zk database for this node - * @param database - */ - public void setZKDatabase(ZKDatabase database) { - this.zkDb = database; - } - - public void setRunning(boolean running) { - this.running = running; - } - - public boolean isRunning() { - return running; - } - - /** - * get reference to QuorumCnxManager - */ - public QuorumCnxManager getQuorumCnxManager() { - return qcm; - } - private long readLongFromFile(String name) throws IOException { - File file = new File(logFactory.getSnapDir(), name); - BufferedReader br = new BufferedReader(new FileReader(file)); - String line = ""; - try { - line = br.readLine(); - return Long.parseLong(line); - } catch(NumberFormatException e) { - throw new IOException("Found " + line + " in " + file); - } finally { - br.close(); - } - } - - private long acceptedEpoch = -1; - private long currentEpoch = -1; - - public static final String CURRENT_EPOCH_FILENAME = "currentEpoch"; - - public static final String ACCEPTED_EPOCH_FILENAME = "acceptedEpoch"; - - public static final String UPDATING_EPOCH_FILENAME = "updatingEpoch"; - - /** - * Write a long value to disk atomically. Either succeeds or an exception - * is thrown. - * @param name file name to write the long to - * @param value the long value to write to the named file - * @throws IOException if the file cannot be written atomically - */ - private void writeLongToFile(String name, long value) throws IOException { - File file = new File(logFactory.getSnapDir(), name); - AtomicFileOutputStream out = new AtomicFileOutputStream(file); - BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(out)); - boolean aborted = false; - try { - bw.write(Long.toString(value)); - bw.flush(); - - out.flush(); - } catch (IOException e) { - LOG.error("Failed to write new file " + file, e); - // worst case here the tmp file/resources(fd) are not cleaned up - // and the caller will be notified (IOException) - aborted = true; - out.abort(); - throw e; - } finally { - if (!aborted) { - // if the close operation (rename) fails we'll get notified. - // worst case the tmp file may still exist - out.close(); - } - } - } - - public long getCurrentEpoch() throws IOException { - if (currentEpoch == -1) { - currentEpoch = readLongFromFile(CURRENT_EPOCH_FILENAME); - } - return currentEpoch; - } - - public long getAcceptedEpoch() throws IOException { - if (acceptedEpoch == -1) { - acceptedEpoch = readLongFromFile(ACCEPTED_EPOCH_FILENAME); - } - return acceptedEpoch; - } - - public void setCurrentEpoch(long e) throws IOException { - currentEpoch = e; - writeLongToFile(CURRENT_EPOCH_FILENAME, e); - - } - - public void setAcceptedEpoch(long e) throws IOException { - acceptedEpoch = e; - writeLongToFile(ACCEPTED_EPOCH_FILENAME, e); - } - - /** - * Updates leader election info to avoid inconsistencies when - * a new server tries to join the ensemble. - * See ZOOKEEPER-1732 for more info. - */ - protected void updateElectionVote(long newEpoch) { - Vote currentVote = getCurrentVote(); - setBCVote(currentVote); - if (currentVote != null) { - setCurrentVote(new Vote(currentVote.getId(), - currentVote.getZxid(), - currentVote.getElectionEpoch(), - newEpoch, - currentVote.getState())); - } - } - -} diff --git a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/quorum/QuorumPeerConfig.java b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/quorum/QuorumPeerConfig.java deleted file mode 100644 index 59e048d66..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/quorum/QuorumPeerConfig.java +++ /dev/null @@ -1,425 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you 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. - */ - -package org.apache.zookeeper.server.quorum; - -import java.io.BufferedReader; -import java.io.File; -import java.io.FileInputStream; -import java.io.FileReader; -import java.io.IOException; -import java.net.InetAddress; -import java.net.InetSocketAddress; -import java.util.Collections; -import java.util.HashMap; -import java.util.Map; -import java.util.Properties; -import java.util.Map.Entry; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.slf4j.MDC; - -import org.apache.zookeeper.server.ZooKeeperServer; -import org.apache.zookeeper.server.quorum.QuorumPeer.LearnerType; -import org.apache.zookeeper.server.quorum.QuorumPeer.QuorumServer; -import org.apache.zookeeper.server.quorum.flexible.QuorumHierarchical; -import org.apache.zookeeper.server.quorum.flexible.QuorumMaj; -import org.apache.zookeeper.server.quorum.flexible.QuorumVerifier; - -public class QuorumPeerConfig { - private static final Logger LOG = LoggerFactory.getLogger(QuorumPeerConfig.class); - - protected InetSocketAddress clientPortAddress; - protected String dataDir; - protected String dataLogDir; - protected int tickTime = ZooKeeperServer.DEFAULT_TICK_TIME; - protected int maxClientCnxns = 60; - /** defaults to -1 if not set explicitly */ - protected int minSessionTimeout = -1; - /** defaults to -1 if not set explicitly */ - protected int maxSessionTimeout = -1; - - protected int initLimit; - protected int syncLimit; - protected int electionAlg = 3; - protected int electionPort = 2182; - protected boolean quorumListenOnAllIPs = false; - protected final HashMap servers = - new HashMap(); - protected final HashMap observers = - new HashMap(); - - protected long serverId; - protected HashMap serverWeight = new HashMap(); - protected HashMap serverGroup = new HashMap(); - protected int numGroups = 0; - protected QuorumVerifier quorumVerifier; - protected int snapRetainCount = 3; - protected int purgeInterval = 0; - protected boolean syncEnabled = true; - - protected LearnerType peerType = LearnerType.PARTICIPANT; - - /** - * Minimum snapshot retain count. - * @see org.apache.zookeeper.server.PurgeTxnLog#purge(File, File, int) - */ - private final int MIN_SNAP_RETAIN_COUNT = 3; - - @SuppressWarnings("serial") - public static class ConfigException extends Exception { - public ConfigException(String msg) { - super(msg); - } - public ConfigException(String msg, Exception e) { - super(msg, e); - } - } - - /** - * Parse a ZooKeeper configuration file - * @param path the patch of the configuration file - * @throws ConfigException error processing configuration - */ - public void parse(String path) throws ConfigException { - File configFile = new File(path); - - LOG.info("Reading configuration from: " + configFile); - - try { - if (!configFile.exists()) { - throw new IllegalArgumentException(configFile.toString() - + " file is missing"); - } - - Properties cfg = new Properties(); - FileInputStream in = new FileInputStream(configFile); - try { - cfg.load(in); - } finally { - in.close(); - } - - parseProperties(cfg); - } catch (IOException e) { - throw new ConfigException("Error processing " + path, e); - } catch (IllegalArgumentException e) { - throw new ConfigException("Error processing " + path, e); - } - } - - /** - * Parse config from a Properties. - * @param zkProp Properties to parse from. - * @throws IOException - * @throws ConfigException - */ - public void parseProperties(Properties zkProp) - throws IOException, ConfigException { - int clientPort = 0; - String clientPortAddress = null; - for (Entry entry : zkProp.entrySet()) { - String key = entry.getKey().toString().trim(); - String value = entry.getValue().toString().trim(); - if (key.equals("dataDir")) { - dataDir = value; - } else if (key.equals("dataLogDir")) { - dataLogDir = value; - } else if (key.equals("clientPort")) { - clientPort = Integer.parseInt(value); - } else if (key.equals("clientPortAddress")) { - clientPortAddress = value.trim(); - } else if (key.equals("tickTime")) { - tickTime = Integer.parseInt(value); - } else if (key.equals("maxClientCnxns")) { - maxClientCnxns = Integer.parseInt(value); - } else if (key.equals("minSessionTimeout")) { - minSessionTimeout = Integer.parseInt(value); - } else if (key.equals("maxSessionTimeout")) { - maxSessionTimeout = Integer.parseInt(value); - } else if (key.equals("initLimit")) { - initLimit = Integer.parseInt(value); - } else if (key.equals("syncLimit")) { - syncLimit = Integer.parseInt(value); - } else if (key.equals("electionAlg")) { - electionAlg = Integer.parseInt(value); - } else if (key.equals("quorumListenOnAllIPs")) { - quorumListenOnAllIPs = Boolean.parseBoolean(value); - } else if (key.equals("peerType")) { - if (value.toLowerCase().equals("observer")) { - peerType = LearnerType.OBSERVER; - } else if (value.toLowerCase().equals("participant")) { - peerType = LearnerType.PARTICIPANT; - } else - { - throw new ConfigException("Unrecognised peertype: " + value); - } - } else if (key.equals( "syncEnabled" )) { - syncEnabled = Boolean.parseBoolean(value); - } else if (key.equals("autopurge.snapRetainCount")) { - snapRetainCount = Integer.parseInt(value); - } else if (key.equals("autopurge.purgeInterval")) { - purgeInterval = Integer.parseInt(value); - } else if (key.startsWith("server.")) { - int dot = key.indexOf('.'); - long sid = Long.parseLong(key.substring(dot + 1)); - String parts[] = value.split(":"); - if ((parts.length != 2) && (parts.length != 3) && (parts.length !=4)) { - LOG.error(value - + " does not have the form host:port or host:port:port " + - " or host:port:port:type"); - } - InetSocketAddress addr = new InetSocketAddress(parts[0], - Integer.parseInt(parts[1])); - if (parts.length == 2) { - servers.put(Long.valueOf(sid), new QuorumServer(sid, addr)); - } else if (parts.length == 3) { - InetSocketAddress electionAddr = new InetSocketAddress( - parts[0], Integer.parseInt(parts[2])); - servers.put(Long.valueOf(sid), new QuorumServer(sid, addr, - electionAddr)); - } else if (parts.length == 4) { - InetSocketAddress electionAddr = new InetSocketAddress( - parts[0], Integer.parseInt(parts[2])); - LearnerType type = LearnerType.PARTICIPANT; - if (parts[3].toLowerCase().equals("observer")) { - type = LearnerType.OBSERVER; - observers.put(Long.valueOf(sid), new QuorumServer(sid, addr, - electionAddr,type)); - } else if (parts[3].toLowerCase().equals("participant")) { - type = LearnerType.PARTICIPANT; - servers.put(Long.valueOf(sid), new QuorumServer(sid, addr, - electionAddr,type)); - } else { - throw new ConfigException("Unrecognised peertype: " + value); - } - } - } else if (key.startsWith("group")) { - int dot = key.indexOf('.'); - long gid = Long.parseLong(key.substring(dot + 1)); - - numGroups++; - - String parts[] = value.split(":"); - for(String s : parts){ - long sid = Long.parseLong(s); - if(serverGroup.containsKey(sid)) - throw new ConfigException("Server " + sid + "is in multiple groups"); - else - serverGroup.put(sid, gid); - } - - } else if(key.startsWith("weight")) { - int dot = key.indexOf('.'); - long sid = Long.parseLong(key.substring(dot + 1)); - serverWeight.put(sid, Long.parseLong(value)); - } else { - System.setProperty("zookeeper." + key, value); - } - } - - // Reset to MIN_SNAP_RETAIN_COUNT if invalid (less than 3) - // PurgeTxnLog.purge(File, File, int) will not allow to purge less - // than 3. - if (snapRetainCount < MIN_SNAP_RETAIN_COUNT) { - LOG.warn("Invalid autopurge.snapRetainCount: " + snapRetainCount - + ". Defaulting to " + MIN_SNAP_RETAIN_COUNT); - snapRetainCount = MIN_SNAP_RETAIN_COUNT; - } - - if (dataDir == null) { - throw new IllegalArgumentException("dataDir is not set"); - } - if (dataLogDir == null) { - dataLogDir = dataDir; - } else { - if (!new File(dataLogDir).isDirectory()) { - throw new IllegalArgumentException("dataLogDir " + dataLogDir - + " is missing."); - } - } - if (clientPort == 0) { - throw new IllegalArgumentException("clientPort is not set"); - } - if (clientPortAddress != null) { - this.clientPortAddress = new InetSocketAddress( - InetAddress.getByName(clientPortAddress), clientPort); - } else { - this.clientPortAddress = new InetSocketAddress(clientPort); - } - - if (tickTime == 0) { - throw new IllegalArgumentException("tickTime is not set"); - } - if (minSessionTimeout > maxSessionTimeout) { - throw new IllegalArgumentException( - "minSessionTimeout must not be larger than maxSessionTimeout"); - } - if (servers.size() == 0) { - if (observers.size() > 0) { - throw new IllegalArgumentException("Observers w/o participants is an invalid configuration"); - } - // Not a quorum configuration so return immediately - not an error - // case (for b/w compatibility), server will default to standalone - // mode. - return; - } else if (servers.size() == 1) { - if (observers.size() > 0) { - throw new IllegalArgumentException("Observers w/o quorum is an invalid configuration"); - } - - // HBase currently adds a single server line to the config, for - // b/w compatibility reasons we need to keep this here. - LOG.error("Invalid configuration, only one server specified (ignoring)"); - servers.clear(); - } else if (servers.size() > 1) { - if (servers.size() == 2) { - LOG.warn("No server failure will be tolerated. " + - "You need at least 3 servers."); - } else if (servers.size() % 2 == 0) { - LOG.warn("Non-optimial configuration, consider an odd number of servers."); - } - if (initLimit == 0) { - throw new IllegalArgumentException("initLimit is not set"); - } - if (syncLimit == 0) { - throw new IllegalArgumentException("syncLimit is not set"); - } - /* - * If using FLE, then every server requires a separate election - * port. - */ - if (electionAlg != 0) { - for (QuorumServer s : servers.values()) { - if (s.electionAddr == null) - throw new IllegalArgumentException( - "Missing election port for server: " + s.id); - } - } - - /* - * Default of quorum config is majority - */ - if(serverGroup.size() > 0){ - if(servers.size() != serverGroup.size()) - throw new ConfigException("Every server must be in exactly one group"); - /* - * The deafult weight of a server is 1 - */ - for(QuorumServer s : servers.values()){ - if(!serverWeight.containsKey(s.id)) - serverWeight.put(s.id, (long) 1); - } - - /* - * Set the quorumVerifier to be QuorumHierarchical - */ - quorumVerifier = new QuorumHierarchical(numGroups, - serverWeight, serverGroup); - } else { - /* - * The default QuorumVerifier is QuorumMaj - */ - - LOG.info("Defaulting to majority quorums"); - quorumVerifier = new QuorumMaj(servers.size()); - } - - // Now add observers to servers, once the quorums have been - // figured out - servers.putAll(observers); - - File myIdFile = new File(dataDir, "myid"); - if (!myIdFile.exists()) { - throw new IllegalArgumentException(myIdFile.toString() - + " file is missing"); - } - BufferedReader br = new BufferedReader(new FileReader(myIdFile)); - String myIdString; - try { - myIdString = br.readLine(); - } finally { - br.close(); - } - try { - serverId = Long.parseLong(myIdString); - MDC.put("myid", myIdString); - } catch (NumberFormatException e) { - throw new IllegalArgumentException("serverid " + myIdString - + " is not a number"); - } - - // Warn about inconsistent peer type - LearnerType roleByServersList = observers.containsKey(serverId) ? LearnerType.OBSERVER - : LearnerType.PARTICIPANT; - if (roleByServersList != peerType) { - LOG.warn("Peer type from servers list (" + roleByServersList - + ") doesn't match peerType (" + peerType - + "). Defaulting to servers list."); - - peerType = roleByServersList; - } - } - } - - public InetSocketAddress getClientPortAddress() { return clientPortAddress; } - public String getDataDir() { return dataDir; } - public String getDataLogDir() { return dataLogDir; } - public int getTickTime() { return tickTime; } - public int getMaxClientCnxns() { return maxClientCnxns; } - public int getMinSessionTimeout() { return minSessionTimeout; } - public int getMaxSessionTimeout() { return maxSessionTimeout; } - - public int getInitLimit() { return initLimit; } - public int getSyncLimit() { return syncLimit; } - public int getElectionAlg() { return electionAlg; } - public int getElectionPort() { return electionPort; } - - public int getSnapRetainCount() { - return snapRetainCount; - } - - public int getPurgeInterval() { - return purgeInterval; - } - - public boolean getSyncEnabled() { - return syncEnabled; - } - - public QuorumVerifier getQuorumVerifier() { - return quorumVerifier; - } - - public Map getServers() { - return Collections.unmodifiableMap(servers); - } - - public long getServerId() { return serverId; } - - public boolean isDistributed() { return servers.size() > 1; } - - public LearnerType getPeerType() { - return peerType; - } - - public Boolean getQuorumListenOnAllIPs() { - return quorumListenOnAllIPs; - } -} diff --git a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/quorum/QuorumPeerMain.java b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/quorum/QuorumPeerMain.java deleted file mode 100644 index e9c80070b..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/quorum/QuorumPeerMain.java +++ /dev/null @@ -1,160 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you 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. - */ -package org.apache.zookeeper.server.quorum; - -import java.io.File; -import java.io.IOException; - -import javax.management.JMException; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.apache.zookeeper.jmx.ManagedUtil; -import org.apache.zookeeper.server.ServerCnxnFactory; -import org.apache.zookeeper.server.ZKDatabase; -import org.apache.zookeeper.server.DatadirCleanupManager; -import org.apache.zookeeper.server.ZooKeeperServerMain; -import org.apache.zookeeper.server.persistence.FileTxnSnapLog; -import org.apache.zookeeper.server.quorum.QuorumPeerConfig.ConfigException; - -/** - * - *

        Configuration file

        - * - * When the main() method of this class is used to start the program, the first - * argument is used as a path to the config file, which will be used to obtain - * configuration information. This file is a Properties file, so keys and - * values are separated by equals (=) and the key/value pairs are separated - * by new lines. The following is a general summary of keys used in the - * configuration file. For full details on this see the documentation in - * docs/index.html - *
          - *
        1. dataDir - The directory where the ZooKeeper data is stored.
        2. - *
        3. dataLogDir - The directory where the ZooKeeper transaction log is stored.
        4. - *
        5. clientPort - The port used to communicate with clients.
        6. - *
        7. tickTime - The duration of a tick in milliseconds. This is the basic - * unit of time in ZooKeeper.
        8. - *
        9. initLimit - The maximum number of ticks that a follower will wait to - * initially synchronize with a leader.
        10. - *
        11. syncLimit - The maximum number of ticks that a follower will wait for a - * message (including heartbeats) from the leader.
        12. - *
        13. server.id - This is the host:port[:port] that the server with the - * given id will use for the quorum protocol.
        14. - *
        - * In addition to the config file. There is a file in the data directory called - * "myid" that contains the server id as an ASCII decimal value. - * - */ -public class QuorumPeerMain { - private static final Logger LOG = LoggerFactory.getLogger(QuorumPeerMain.class); - - private static final String USAGE = "Usage: QuorumPeerMain configfile"; - - protected QuorumPeer quorumPeer; - - /** - * To start the replicated server specify the configuration file name on - * the command line. - * @param args path to the configfile - */ - public static void main(String[] args) { - QuorumPeerMain main = new QuorumPeerMain(); - try { - main.initializeAndRun(args); - } catch (IllegalArgumentException e) { - LOG.error("Invalid arguments, exiting abnormally", e); - LOG.info(USAGE); - System.err.println(USAGE); - System.exit(2); - } catch (ConfigException e) { - LOG.error("Invalid config, exiting abnormally", e); - System.err.println("Invalid config, exiting abnormally"); - System.exit(2); - } catch (Exception e) { - LOG.error("Unexpected exception, exiting abnormally", e); - System.exit(1); - } - LOG.info("Exiting normally"); - System.exit(0); - } - - protected void initializeAndRun(String[] args) - throws ConfigException, IOException - { - QuorumPeerConfig config = new QuorumPeerConfig(); - if (args.length == 1) { - config.parse(args[0]); - } - - // Start and schedule the the purge task - DatadirCleanupManager purgeMgr = new DatadirCleanupManager(config - .getDataDir(), config.getDataLogDir(), config - .getSnapRetainCount(), config.getPurgeInterval()); - purgeMgr.start(); - - if (args.length == 1 && config.servers.size() > 0) { - runFromConfig(config); - } else { - LOG.warn("Either no config or no quorum defined in config, running " - + " in standalone mode"); - // there is only server in the quorum -- run as standalone - ZooKeeperServerMain.main(args); - } - } - - public void runFromConfig(QuorumPeerConfig config) throws IOException { - try { - ManagedUtil.registerLog4jMBeans(); - } catch (JMException e) { - LOG.warn("Unable to register log4j JMX control", e); - } - - LOG.info("Starting quorum peer"); - try { - ServerCnxnFactory cnxnFactory = ServerCnxnFactory.createFactory(); - cnxnFactory.configure(config.getClientPortAddress(), - config.getMaxClientCnxns()); - - quorumPeer = new QuorumPeer(); - quorumPeer.setClientPortAddress(config.getClientPortAddress()); - quorumPeer.setTxnFactory(new FileTxnSnapLog( - new File(config.getDataLogDir()), - new File(config.getDataDir()))); - quorumPeer.setQuorumPeers(config.getServers()); - quorumPeer.setElectionType(config.getElectionAlg()); - quorumPeer.setMyid(config.getServerId()); - quorumPeer.setTickTime(config.getTickTime()); - quorumPeer.setMinSessionTimeout(config.getMinSessionTimeout()); - quorumPeer.setMaxSessionTimeout(config.getMaxSessionTimeout()); - quorumPeer.setInitLimit(config.getInitLimit()); - quorumPeer.setSyncLimit(config.getSyncLimit()); - quorumPeer.setQuorumVerifier(config.getQuorumVerifier()); - quorumPeer.setCnxnFactory(cnxnFactory); - quorumPeer.setZKDatabase(new ZKDatabase(quorumPeer.getTxnFactory())); - quorumPeer.setLearnerType(config.getPeerType()); - quorumPeer.setSyncEnabled(config.getSyncEnabled()); - quorumPeer.setQuorumListenOnAllIPs(config.getQuorumListenOnAllIPs()); - - quorumPeer.start(); - quorumPeer.join(); - } catch (InterruptedException e) { - // warn, but generally this is ok - LOG.warn("Quorum Peer interrupted", e); - } - } -} diff --git a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/quorum/QuorumStats.java b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/quorum/QuorumStats.java deleted file mode 100644 index b6c62e442..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/quorum/QuorumStats.java +++ /dev/null @@ -1,68 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you 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. - */ - -package org.apache.zookeeper.server.quorum; - -public class QuorumStats { - private final Provider provider; - - public interface Provider { - static public final String UNKNOWN_STATE = "unknown"; - static public final String LOOKING_STATE = "leaderelection"; - static public final String LEADING_STATE = "leading"; - static public final String FOLLOWING_STATE = "following"; - static public final String OBSERVING_STATE = "observing"; - public String[] getQuorumPeers(); - public String getServerState(); - } - - protected QuorumStats(Provider provider) { - this.provider = provider; - } - - public String getServerState(){ - return provider.getServerState(); - } - - public String[] getQuorumPeers(){ - return provider.getQuorumPeers(); - } - - @Override - public String toString(){ - StringBuilder sb=new StringBuilder(super.toString()); - String state=getServerState(); - if(state.equals(Provider.LEADING_STATE)){ - sb.append("Followers:"); - for(String f: getQuorumPeers()){ - sb.append(" ").append(f); - } - sb.append("\n"); - }else if(state.equals(Provider.FOLLOWING_STATE) - || state.equals(Provider.OBSERVING_STATE)){ - sb.append("Leader: "); - String[] ldr=getQuorumPeers(); - if(ldr.length>0) - sb.append(ldr[0]); - else - sb.append("not connected"); - sb.append("\n"); - } - return sb.toString(); - } -} diff --git a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/quorum/QuorumZooKeeperServer.java b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/quorum/QuorumZooKeeperServer.java deleted file mode 100644 index 32096a7a1..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/quorum/QuorumZooKeeperServer.java +++ /dev/null @@ -1,60 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you 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. - */ -package org.apache.zookeeper.server.quorum; - -import java.io.PrintWriter; - -import org.apache.zookeeper.server.ZKDatabase; -import org.apache.zookeeper.server.ZooKeeperServer; -import org.apache.zookeeper.server.persistence.FileTxnSnapLog; - -/** - * Abstract base class for all ZooKeeperServers that participate in - * a quorum. - */ -public abstract class QuorumZooKeeperServer extends ZooKeeperServer { - protected final QuorumPeer self; - - protected QuorumZooKeeperServer(FileTxnSnapLog logFactory, int tickTime, - int minSessionTimeout, int maxSessionTimeout, - DataTreeBuilder treeBuilder, ZKDatabase zkDb, QuorumPeer self) - { - super(logFactory, tickTime, minSessionTimeout, maxSessionTimeout, - treeBuilder, zkDb); - this.self = self; - } - - @Override - public void dumpConf(PrintWriter pwriter) { - super.dumpConf(pwriter); - - pwriter.print("initLimit="); - pwriter.println(self.getInitLimit()); - pwriter.print("syncLimit="); - pwriter.println(self.getSyncLimit()); - pwriter.print("electionAlg="); - pwriter.println(self.getElectionType()); - pwriter.print("electionPort="); - pwriter.println(self.quorumPeers.get(self.getId()).electionAddr - .getPort()); - pwriter.print("quorumPort="); - pwriter.println(self.quorumPeers.get(self.getId()).addr.getPort()); - pwriter.print("peerType="); - pwriter.println(self.getLearnerType().ordinal()); - } -} diff --git a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/quorum/ReadOnlyBean.java b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/quorum/ReadOnlyBean.java deleted file mode 100644 index a2b6fe3c7..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/quorum/ReadOnlyBean.java +++ /dev/null @@ -1,38 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you 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. - */ - -package org.apache.zookeeper.server.quorum; - -import org.apache.zookeeper.server.ZooKeeperServer; -import org.apache.zookeeper.server.ZooKeeperServerBean; - -/** - * ReadOnly MX Bean interface, implemented by ReadOnlyBean - * - */ -public class ReadOnlyBean extends ZooKeeperServerBean { - - public ReadOnlyBean(ZooKeeperServer zks) { - super(zks); - } - - public String getName() { - return "ReadOnlyServer"; - } - -} diff --git a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/quorum/ReadOnlyRequestProcessor.java b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/quorum/ReadOnlyRequestProcessor.java deleted file mode 100644 index 14c09988f..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/quorum/ReadOnlyRequestProcessor.java +++ /dev/null @@ -1,128 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you 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. - */ - -package org.apache.zookeeper.server.quorum; - -import java.io.IOException; -import java.util.concurrent.LinkedBlockingQueue; - -import org.apache.zookeeper.KeeperException.Code; -import org.apache.zookeeper.ZooDefs.OpCode; -import org.apache.zookeeper.proto.ReplyHeader; -import org.apache.zookeeper.server.Request; -import org.apache.zookeeper.server.RequestProcessor; -import org.apache.zookeeper.server.ZooKeeperServer; -import org.apache.zookeeper.server.ZooTrace; -import org.apache.zookeeper.server.quorum.Leader.XidRolloverException; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -/** - * This processor is at the beginning of the ReadOnlyZooKeeperServer's - * processors chain. All it does is, it passes read-only operations (e.g. - * OpCode.getData, OpCode.exists) through to the next processor, but drops - * state-changing operations (e.g. OpCode.create, OpCode.setData). - */ -public class ReadOnlyRequestProcessor extends Thread implements RequestProcessor { - - private static final Logger LOG = LoggerFactory.getLogger(ReadOnlyRequestProcessor.class); - - private LinkedBlockingQueue queuedRequests = new LinkedBlockingQueue(); - - private boolean finished = false; - - private RequestProcessor nextProcessor; - - private ZooKeeperServer zks; - - public ReadOnlyRequestProcessor(ZooKeeperServer zks, RequestProcessor nextProcessor) { - super("ReadOnlyRequestProcessor:" + zks.getServerId()); - this.zks = zks; - this.nextProcessor = nextProcessor; - } - - public void run() { - try { - while (!finished) { - Request request = queuedRequests.take(); - - // log request - long traceMask = ZooTrace.CLIENT_REQUEST_TRACE_MASK; - if (request.type == OpCode.ping) { - traceMask = ZooTrace.CLIENT_PING_TRACE_MASK; - } - if (LOG.isTraceEnabled()) { - ZooTrace.logRequest(LOG, traceMask, 'R', request, ""); - } - if (Request.requestOfDeath == request) { - break; - } - - // filter read requests - switch (request.type) { - case OpCode.sync: - case OpCode.create: - case OpCode.delete: - case OpCode.setData: - case OpCode.setACL: - case OpCode.multi: - case OpCode.check: - ReplyHeader hdr = new ReplyHeader(request.cxid, zks.getZKDatabase() - .getDataTreeLastProcessedZxid(), Code.NOTREADONLY.intValue()); - try { - request.cnxn.sendResponse(hdr, null, null); - } catch (IOException e) { - LOG.error("IO exception while sending response", e); - } - continue; - } - - // proceed to the next processor - if (nextProcessor != null) { - nextProcessor.processRequest(request); - } - } - } catch (InterruptedException e) { - LOG.error("Unexpected interruption", e); - } catch (RequestProcessorException e) { - if (e.getCause() instanceof XidRolloverException) { - LOG.info(e.getCause().getMessage()); - } - LOG.error("Unexpected exception", e); - } catch (Exception e) { - LOG.error("Unexpected exception", e); - } - LOG.info("ReadOnlyRequestProcessor exited loop!"); - } - - @Override - public void processRequest(Request request) { - if (!finished) { - queuedRequests.add(request); - } - } - - @Override - public void shutdown() { - finished = true; - queuedRequests.clear(); - queuedRequests.add(Request.requestOfDeath); - nextProcessor.shutdown(); - } - -} diff --git a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/quorum/ReadOnlyZooKeeperServer.java b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/quorum/ReadOnlyZooKeeperServer.java deleted file mode 100644 index 3cbfcaa18..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/quorum/ReadOnlyZooKeeperServer.java +++ /dev/null @@ -1,146 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you 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. - */ - -package org.apache.zookeeper.server.quorum; - -import org.apache.zookeeper.jmx.MBeanRegistry; -import org.apache.zookeeper.server.DataTreeBean; -import org.apache.zookeeper.server.FinalRequestProcessor; -import org.apache.zookeeper.server.PrepRequestProcessor; -import org.apache.zookeeper.server.RequestProcessor; -import org.apache.zookeeper.server.ZKDatabase; -import org.apache.zookeeper.server.ZooKeeperServer; -import org.apache.zookeeper.server.ZooKeeperServerBean; -import org.apache.zookeeper.server.persistence.FileTxnSnapLog; - -/** - * A ZooKeeperServer which comes into play when peer is partitioned from the - * majority. Handles read-only clients, but drops connections from not-read-only - * ones. - *

        - * The very first processor in the chain of request processors is a - * ReadOnlyRequestProcessor which drops state-changing requests. - */ -public class ReadOnlyZooKeeperServer extends QuorumZooKeeperServer { - - private volatile boolean shutdown = false; - ReadOnlyZooKeeperServer(FileTxnSnapLog logFactory, QuorumPeer self, - DataTreeBuilder treeBuilder, ZKDatabase zkDb) { - super(logFactory, self.tickTime, self.minSessionTimeout, self.maxSessionTimeout, - treeBuilder, zkDb, self); - } - - @Override - protected void setupRequestProcessors() { - RequestProcessor finalProcessor = new FinalRequestProcessor(this); - RequestProcessor prepProcessor = new PrepRequestProcessor(this, finalProcessor); - ((PrepRequestProcessor) prepProcessor).start(); - firstProcessor = new ReadOnlyRequestProcessor(this, prepProcessor); - ((ReadOnlyRequestProcessor) firstProcessor).start(); - } - - @Override - public synchronized void startup() { - // check to avoid startup follows shutdown - if (shutdown) { - LOG.warn("Not starting Read-only server as startup follows shutdown!"); - return; - } - registerJMX(new ReadOnlyBean(this), self.jmxLocalPeerBean); - super.startup(); - self.cnxnFactory.setZooKeeperServer(this); - LOG.info("Read-only server started"); - } - - @Override - protected void registerJMX() { - // register with JMX - try { - jmxDataTreeBean = new DataTreeBean(getZKDatabase().getDataTree()); - MBeanRegistry.getInstance().register(jmxDataTreeBean, jmxServerBean); - } catch (Exception e) { - LOG.warn("Failed to register with JMX", e); - jmxDataTreeBean = null; - } - } - - public void registerJMX(ZooKeeperServerBean serverBean, LocalPeerBean localPeerBean) { - // register with JMX - try { - jmxServerBean = serverBean; - MBeanRegistry.getInstance().register(serverBean, localPeerBean); - } catch (Exception e) { - LOG.warn("Failed to register with JMX", e); - jmxServerBean = null; - } - } - - @Override - protected void unregisterJMX() { - // unregister from JMX - try { - if (jmxDataTreeBean != null) { - MBeanRegistry.getInstance().unregister(jmxDataTreeBean); - } - } catch (Exception e) { - LOG.warn("Failed to unregister with JMX", e); - } - jmxDataTreeBean = null; - } - - protected void unregisterJMX(ZooKeeperServer zks) { - // unregister from JMX - try { - if (jmxServerBean != null) { - MBeanRegistry.getInstance().unregister(jmxServerBean); - } - } catch (Exception e) { - LOG.warn("Failed to unregister with JMX", e); - } - jmxServerBean = null; - } - - @Override - public String getState() { - return "read-only"; - } - - /** - * Returns the id of the associated QuorumPeer, which will do for a unique - * id of this server. - */ - @Override - public long getServerId() { - return self.getId(); - } - - @Override - public synchronized void shutdown() { - shutdown = true; - unregisterJMX(this); - - // set peer's server to null - self.cnxnFactory.setZooKeeperServer(null); - // clear all the connections - self.cnxnFactory.closeAll(); - - // shutdown the server itself - super.shutdown(); - } - -} diff --git a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/quorum/RemotePeerBean.java b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/quorum/RemotePeerBean.java deleted file mode 100644 index 5841f6c52..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/quorum/RemotePeerBean.java +++ /dev/null @@ -1,45 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you 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. - */ - -package org.apache.zookeeper.server.quorum; - -import org.apache.zookeeper.jmx.ZKMBeanInfo; -import org.apache.zookeeper.server.quorum.QuorumPeer; - -/** - * A remote peer bean only provides limited information about the remote peer, - * and the peer cannot be managed remotely. - */ -public class RemotePeerBean implements RemotePeerMXBean,ZKMBeanInfo { - private QuorumPeer.QuorumServer peer; - - public RemotePeerBean(QuorumPeer.QuorumServer peer){ - this.peer=peer; - } - public String getName() { - return "replica."+peer.id; - } - public boolean isHidden() { - return false; - } - - public String getQuorumAddress() { - return peer.addr.getHostName()+":"+peer.addr.getPort(); - } - -} diff --git a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/quorum/RemotePeerMXBean.java b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/quorum/RemotePeerMXBean.java deleted file mode 100644 index 1d2ec6b0a..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/quorum/RemotePeerMXBean.java +++ /dev/null @@ -1,33 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you 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. - */ - -package org.apache.zookeeper.server.quorum; - -/** - * A proxy for a remote quorum peer. - */ -public interface RemotePeerMXBean { - /** - * @return name of the peer - */ - public String getName(); - /** - * @return IP address of the quorum peer - */ - public String getQuorumAddress(); -} diff --git a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/quorum/SendAckRequestProcessor.java b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/quorum/SendAckRequestProcessor.java deleted file mode 100644 index 7f81a5ad8..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/quorum/SendAckRequestProcessor.java +++ /dev/null @@ -1,80 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you 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. - */ - -package org.apache.zookeeper.server.quorum; - -import java.io.Flushable; -import java.io.IOException; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import org.apache.zookeeper.ZooDefs.OpCode; -import org.apache.zookeeper.server.Request; -import org.apache.zookeeper.server.RequestProcessor; - -public class SendAckRequestProcessor implements RequestProcessor, Flushable { - private static final Logger LOG = LoggerFactory.getLogger(SendAckRequestProcessor.class); - - Learner learner; - - SendAckRequestProcessor(Learner peer) { - this.learner = peer; - } - - public void processRequest(Request si) { - if(si.type != OpCode.sync){ - QuorumPacket qp = new QuorumPacket(Leader.ACK, si.hdr.getZxid(), null, - null); - try { - learner.writePacket(qp, false); - } catch (IOException e) { - LOG.warn("Closing connection to leader, exception during packet send", e); - try { - if (!learner.sock.isClosed()) { - learner.sock.close(); - } - } catch (IOException e1) { - // Nothing to do, we are shutting things down, so an exception here is irrelevant - LOG.debug("Ignoring error closing the connection", e1); - } - } - } - } - - public void flush() throws IOException { - try { - learner.writePacket(null, true); - } catch(IOException e) { - LOG.warn("Closing connection to leader, exception during packet send", e); - try { - if (!learner.sock.isClosed()) { - learner.sock.close(); - } - } catch (IOException e1) { - // Nothing to do, we are shutting things down, so an exception here is irrelevant - LOG.debug("Ignoring error closing the connection", e1); - } - } - } - - public void shutdown() { - // Nothing needed - } - -} diff --git a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/quorum/ServerBean.java b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/quorum/ServerBean.java deleted file mode 100644 index 281c05bc0..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/quorum/ServerBean.java +++ /dev/null @@ -1,38 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you 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. - */ - -package org.apache.zookeeper.server.quorum; - -import java.util.Date; - -import org.apache.zookeeper.jmx.ZKMBeanInfo; - -/** - * An abstract base class for the leader and follower MBeans. - */ -public abstract class ServerBean implements ServerMXBean, ZKMBeanInfo { - private final Date startTime=new Date(); - - public boolean isHidden() { - return false; - } - - public String getStartTime() { - return startTime.toString(); - } -} diff --git a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/quorum/ServerMXBean.java b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/quorum/ServerMXBean.java deleted file mode 100644 index df52aea70..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/quorum/ServerMXBean.java +++ /dev/null @@ -1,33 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you 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. - */ - -package org.apache.zookeeper.server.quorum; - -/** - * A quorum server MBean. - */ -public interface ServerMXBean { - /** - * @return name of the server MBean - */ - public String getName(); - /** - * @return the start time the server - */ - public String getStartTime(); -} diff --git a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/quorum/StateSummary.java b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/quorum/StateSummary.java deleted file mode 100644 index aaaa4f869..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/quorum/StateSummary.java +++ /dev/null @@ -1,57 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you 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. - */ - -package org.apache.zookeeper.server.quorum; - -/** - * This class encapsulates the state comparison logic. Specifically, - * how two different states are compared. - */ -public class StateSummary { - private long currentEpoch; - private long lastZxid; - public StateSummary(long currentEpoch, long lastZxid) { - this.currentEpoch = currentEpoch; - this.lastZxid = lastZxid; - } - - public long getCurrentEpoch() { - return currentEpoch; - } - - public long getLastZxid() { - return lastZxid; - } - - public boolean isMoreRecentThan(StateSummary ss) { - return (currentEpoch > ss.currentEpoch) || (currentEpoch == ss.currentEpoch && lastZxid > ss.lastZxid); - } - @Override - public boolean equals(Object obj) { - if (!(obj instanceof StateSummary)) { - return false; - } - StateSummary ss = (StateSummary)obj; - return currentEpoch == ss.currentEpoch && lastZxid == ss.lastZxid; - } - - @Override - public int hashCode() { - return (int)(currentEpoch ^ lastZxid); - } -} diff --git a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/quorum/Vote.java b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/quorum/Vote.java deleted file mode 100644 index aca9a9a21..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/quorum/Vote.java +++ /dev/null @@ -1,169 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you 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. - */ - -package org.apache.zookeeper.server.quorum; - -import org.apache.zookeeper.server.quorum.QuorumPeer.ServerState; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - - -public class Vote { - private static final Logger LOG = LoggerFactory.getLogger(Vote.class); - - public Vote(long id, - long zxid) { - this.version = 0x0; - this.id = id; - this.zxid = zxid; - this.electionEpoch = -1; - this.peerEpoch = -1; - this.state = ServerState.LOOKING; - } - - public Vote(long id, - long zxid, - long peerEpoch) { - this.version = 0x0; - this.id = id; - this.zxid = zxid; - this.electionEpoch = -1; - this.peerEpoch = peerEpoch; - this.state = ServerState.LOOKING; - } - - public Vote(long id, - long zxid, - long electionEpoch, - long peerEpoch) { - this.version = 0x0; - this.id = id; - this.zxid = zxid; - this.electionEpoch = electionEpoch; - this.peerEpoch = peerEpoch; - this.state = ServerState.LOOKING; - } - - public Vote(int version, - long id, - long zxid, - long electionEpoch, - long peerEpoch, - ServerState state) { - this.version = version; - this.id = id; - this.zxid = zxid; - this.electionEpoch = electionEpoch; - this.state = state; - this.peerEpoch = peerEpoch; - } - - public Vote(long id, - long zxid, - long electionEpoch, - long peerEpoch, - ServerState state) { - this.id = id; - this.zxid = zxid; - this.electionEpoch = electionEpoch; - this.state = state; - this.peerEpoch = peerEpoch; - this.version = 0x0; - } - - final private int version; - - final private long id; - - final private long zxid; - - final private long electionEpoch; - - final private long peerEpoch; - - public int getVersion() { - return version; - } - - public long getId() { - return id; - } - - public long getZxid() { - return zxid; - } - - public long getElectionEpoch() { - return electionEpoch; - } - - public long getPeerEpoch() { - return peerEpoch; - } - - public ServerState getState() { - return state; - } - - final private ServerState state; - - @Override - public boolean equals(Object o) { - if (!(o instanceof Vote)) { - return false; - } - Vote other = (Vote) o; - - - /* - * There are two things going on in the logic below. - * First, we compare votes of servers out of election - * using only id and peer epoch. Second, if one version - * is 0x0 and the other isn't, then we only use the - * leader id. This case is here to enable rolling upgrades. - * - * {@see https://issues.apache.org/jira/browse/ZOOKEEPER-1805} - */ - if ((state == ServerState.LOOKING) || - (other.state == ServerState.LOOKING)) { - return (id == other.id - && zxid == other.zxid - && electionEpoch == other.electionEpoch - && peerEpoch == other.peerEpoch); - } else { - if ((version > 0x0) ^ (other.version > 0x0)) { - return id == other.id; - } else { - return (id == other.id - && peerEpoch == other.peerEpoch); - } - } - } - - @Override - public int hashCode() { - return (int) (id & zxid); - } - - public String toString() { - return String.format("(%d, %s, %s)", - id, - Long.toHexString(zxid), - Long.toHexString(peerEpoch)); - } -} diff --git a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/quorum/flexible/QuorumHierarchical.java b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/quorum/flexible/QuorumHierarchical.java deleted file mode 100644 index d37881f90..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/quorum/flexible/QuorumHierarchical.java +++ /dev/null @@ -1,273 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you 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. - */ - -package org.apache.zookeeper.server.quorum.flexible; - -import java.io.BufferedReader; -import java.io.File; -import java.io.FileInputStream; -import java.io.FileReader; -import java.io.IOException; -import java.util.HashSet; -import java.util.HashMap; -import java.util.Properties; -import java.util.Map.Entry; - - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import org.apache.zookeeper.server.quorum.QuorumPeerConfig.ConfigException; - - -/** - * This class implements a validator for hierarchical quorums. With this - * construction, zookeeper servers are split into disjoint groups, and - * each server has a weight. We obtain a quorum if we get more than half - * of the total weight of a group for a majority of groups. - * - * The configuration of quorums uses two parameters: group and weight. - * Groups are sets of ZooKeeper servers, and we set a group by passing - * a colon-separated list of server ids. It is also necessary to assign - * weights to server. Here is an example of a configuration that creates - * three groups and assigns a weight of 1 to each server: - * - * group.1=1:2:3 - * group.2=4:5:6 - * group.3=7:8:9 - * - * weight.1=1 - * weight.2=1 - * weight.3=1 - * weight.4=1 - * weight.5=1 - * weight.6=1 - * weight.7=1 - * weight.8=1 - * weight.9=1 - * - * Note that it is still necessary to define peers using the server keyword. - */ - -public class QuorumHierarchical implements QuorumVerifier { - private static final Logger LOG = LoggerFactory.getLogger(QuorumHierarchical.class); - - HashMap serverWeight; - HashMap serverGroup; - HashMap groupWeight; - - int numGroups; - - /** - * This contructor requires the quorum configuration - * to be declared in a separate file, and it takes the - * file as an input parameter. - */ - public QuorumHierarchical(String filename) - throws ConfigException { - this.serverWeight = new HashMap(); - this.serverGroup = new HashMap(); - this.groupWeight = new HashMap(); - this.numGroups = 0; - - readConfigFile(filename); - } - - /** - * This constructor takes a set of properties. We use - * it in the unit test for this feature. - */ - - public QuorumHierarchical(Properties qp) - throws ConfigException { - this.serverWeight = new HashMap(); - this.serverGroup = new HashMap(); - this.groupWeight = new HashMap(); - this.numGroups = 0; - - parse(qp); - - LOG.info(serverWeight.size() + ", " + serverGroup.size() + ", " + groupWeight.size()); - } - - /** - * This contructor takes the two hash maps needed to enable - * validating quorums. We use it with QuorumPeerConfig. That is, - * we declare weights and groups in the server configuration - * file along with the other parameters. - * @param numGroups - * @param serverWeight - * @param serverGroup - */ - public QuorumHierarchical(int numGroups, - HashMap serverWeight, - HashMap serverGroup) - { - this.serverWeight = serverWeight; - this.serverGroup = serverGroup; - this.groupWeight = new HashMap(); - - this.numGroups = numGroups; - computeGroupWeight(); - } - - - /** - * Returns the weight of a server. - * - * @param id - */ - public long getWeight(long id){ - return serverWeight.get(id); - } - - /** - * Reads a configration file. Called from the constructor - * that takes a file as an input. - */ - private void readConfigFile(String filename) - throws ConfigException{ - File configFile = new File(filename); - - LOG.info("Reading configuration from: " + configFile); - - try { - if (!configFile.exists()) { - throw new IllegalArgumentException(configFile.toString() - + " file is missing"); - } - - Properties cfg = new Properties(); - FileInputStream in = new FileInputStream(configFile); - try { - cfg.load(in); - } finally { - in.close(); - } - - parse(cfg); - } catch (IOException e) { - throw new ConfigException("Error processing " + filename, e); - } catch (IllegalArgumentException e) { - throw new ConfigException("Error processing " + filename, e); - } - - } - - - /** - * Parse properties if configuration given in a separate file. - */ - private void parse(Properties quorumProp){ - for (Entry entry : quorumProp.entrySet()) { - String key = entry.getKey().toString(); - String value = entry.getValue().toString(); - if (key.startsWith("group")) { - int dot = key.indexOf('.'); - long gid = Long.parseLong(key.substring(dot + 1)); - - numGroups++; - - String parts[] = value.split(":"); - for(String s : parts){ - long sid = Long.parseLong(s); - serverGroup.put(sid, gid); - } - - - } else if(key.startsWith("weight")) { - int dot = key.indexOf('.'); - long sid = Long.parseLong(key.substring(dot + 1)); - serverWeight.put(sid, Long.parseLong(value)); - } - } - - computeGroupWeight(); - } - - /** - * This method pre-computes the weights of groups to speed up processing - * when validating a given set. We compute the weights of groups in - * different places, so we have a separate method. - */ - private void computeGroupWeight(){ - for(long sid : serverGroup.keySet()){ - Long gid = serverGroup.get(sid); - if(!groupWeight.containsKey(gid)) - groupWeight.put(gid, serverWeight.get(sid)); - else { - long totalWeight = serverWeight.get(sid) + groupWeight.get(gid); - groupWeight.put(gid, totalWeight); - } - } - - /* - * Do not consider groups with weight zero - */ - for(long weight: groupWeight.values()){ - LOG.debug("Group weight: " + weight); - if(weight == ((long) 0)){ - numGroups--; - LOG.debug("One zero-weight group: " + 1 + ", " + numGroups); - } - } - } - - /** - * Verifies if a given set is a quorum. - */ - public boolean containsQuorum(HashSet set){ - HashMap expansion = new HashMap(); - - /* - * Adds up weights per group - */ - if(set.size() == 0) return false; - else LOG.debug("Set size: " + set.size()); - - for(long sid : set){ - Long gid = serverGroup.get(sid); - if(!expansion.containsKey(gid)) - expansion.put(gid, serverWeight.get(sid)); - else { - long totalWeight = serverWeight.get(sid) + expansion.get(gid); - expansion.put(gid, totalWeight); - } - } - - /* - * Check if all groups have majority - */ - int majGroupCounter = 0; - for(long gid : expansion.keySet()) { - LOG.debug("Group info: " + expansion.get(gid) + ", " + gid + ", " + groupWeight.get(gid)); - if(expansion.get(gid) > (groupWeight.get(gid) / 2) ) - majGroupCounter++; - } - - LOG.debug("Majority group counter: " + majGroupCounter + ", " + numGroups); - if((majGroupCounter > (numGroups / 2))){ - LOG.debug("Positive set size: " + set.size()); - return true; - } - else { - LOG.debug("Negative set size: " + set.size()); - return false; - } - } -} diff --git a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/quorum/flexible/QuorumMaj.java b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/quorum/flexible/QuorumMaj.java deleted file mode 100644 index 04773d711..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/quorum/flexible/QuorumMaj.java +++ /dev/null @@ -1,63 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you 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. - */ - -package org.apache.zookeeper.server.quorum.flexible; - -import java.util.HashSet; - -//import org.apache.zookeeper.server.quorum.QuorumCnxManager; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -/** - * This class implements a validator for majority quorums. The - * implementation is straightforward. - * - */ -public class QuorumMaj implements QuorumVerifier { - private static final Logger LOG = LoggerFactory.getLogger(QuorumMaj.class); - - int half; - - /** - * Defines a majority to avoid computing it every time. - * - * @param n number of servers - */ - public QuorumMaj(int n){ - this.half = n/2; - } - - /** - * Returns weight of 1 by default. - * - * @param id - */ - public long getWeight(long id){ - return (long) 1; - } - - /** - * Verifies if a set is a majority. - */ - public boolean containsQuorum(HashSet set){ - return (set.size() > half); - } - -} diff --git a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/quorum/flexible/QuorumVerifier.java b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/quorum/flexible/QuorumVerifier.java deleted file mode 100644 index 984036560..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/quorum/flexible/QuorumVerifier.java +++ /dev/null @@ -1,33 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you 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. - */ - -package org.apache.zookeeper.server.quorum.flexible; - -import java.util.HashSet; - -/** - * All quorum validators have to implement a method called - * containsQuorum, which verifies if a HashSet of server - * identifiers constitutes a quorum. - * - */ - -public interface QuorumVerifier { - long getWeight(long id); - boolean containsQuorum(HashSet set); -} diff --git a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/upgrade/DataNodeV1.java b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/upgrade/DataNodeV1.java deleted file mode 100644 index 6156d99b7..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/upgrade/DataNodeV1.java +++ /dev/null @@ -1,129 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you 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. - */ - -package org.apache.zookeeper.server.upgrade; - -import java.io.IOException; -import java.util.ArrayList; -import java.util.HashSet; -import java.util.List; - -import org.apache.jute.Index; -import org.apache.jute.InputArchive; -import org.apache.jute.OutputArchive; -import org.apache.jute.Record; -import org.apache.zookeeper.data.ACL; -import org.apache.zookeeper.data.Stat; -import org.apache.zookeeper.data.StatPersistedV1; - -/** - * This class contains the data for a node in the data tree. - *

        - * A data node contains a reference to its parent, a byte array as its data, an - * array of ACLs, a stat object, and a set of its children's paths. - * - */ -public class DataNodeV1 implements Record { - DataNodeV1() { - // default rather than public constructor - } - - DataNodeV1(DataNodeV1 parent, byte data[], List acl, StatPersistedV1 stat) { - this.parent = parent; - this.data = data; - this.acl = acl; - this.stat = stat; - this.children = new HashSet(); - } - - - /** - * convenience method for creating DataNode - * fully - * @param children - */ - public void setChildren(HashSet children) { - this.children = children; - } - - /** - * convenience methods to get the children - * @return the children of this datanode - */ - public HashSet getChildren() { - return this.children; - } - - DataNodeV1 parent; - - byte data[]; - - List acl; - - public StatPersistedV1 stat; - - HashSet children = new HashSet(); - - public void copyStat(Stat to) { - to.setAversion(stat.getAversion()); - to.setCtime(stat.getCtime()); - to.setCversion(stat.getCversion()); - to.setCzxid(stat.getCzxid()); - to.setMtime(stat.getMtime()); - to.setMzxid(stat.getMzxid()); - to.setVersion(stat.getVersion()); - to.setEphemeralOwner(stat.getEphemeralOwner()); - to.setDataLength(data.length); - to.setNumChildren(children.size()); - } - - public void deserialize(InputArchive archive, String tag) - throws IOException { - archive.startRecord("node"); - data = archive.readBuffer("data"); - Index i = archive.startVector("acl"); - if (i != null) { - acl = new ArrayList(); - while (!i.done()) { - ACL a = new ACL(); - a.deserialize(archive, "aclEntry"); - acl.add(a); - i.incr(); - } - } - archive.endVector("acl"); - stat = new StatPersistedV1(); - stat.deserialize(archive, "stat"); - archive.endRecord("node"); - } - - synchronized public void serialize(OutputArchive archive, String tag) - throws IOException { - archive.startRecord(this, "node"); - archive.writeBuffer(data, "data"); - archive.startVector(acl, "acl"); - if (acl != null) { - for (ACL a : acl) { - a.serialize(archive, "aclEntry"); - } - } - archive.endVector(acl, "acl"); - stat.serialize(archive, "stat"); - archive.endRecord(this, "node"); - } -} diff --git a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/upgrade/DataTreeV1.java b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/upgrade/DataTreeV1.java deleted file mode 100644 index e3d0633f6..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/upgrade/DataTreeV1.java +++ /dev/null @@ -1,584 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you 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. - */ - -package org.apache.zookeeper.server.upgrade; - -import java.io.IOException; -import java.util.ArrayList; -import java.util.Collection; -import java.util.HashSet; -import java.util.List; -import java.util.Map; -import java.util.Set; -import java.util.concurrent.ConcurrentHashMap; - -import org.apache.jute.InputArchive; -import org.apache.jute.OutputArchive; -import org.apache.jute.Record; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.apache.zookeeper.KeeperException; -import org.apache.zookeeper.Watcher; -import org.apache.zookeeper.KeeperException.Code; -import org.apache.zookeeper.KeeperException.NoNodeException; -import org.apache.zookeeper.Watcher.Event; -import org.apache.zookeeper.Watcher.Event.EventType; -import org.apache.zookeeper.ZooDefs.OpCode; -import org.apache.zookeeper.data.ACL; -import org.apache.zookeeper.data.Stat; -import org.apache.zookeeper.data.StatPersistedV1; -import org.apache.zookeeper.server.WatchManager; -import org.apache.zookeeper.txn.CreateTxn; -import org.apache.zookeeper.txn.DeleteTxn; -import org.apache.zookeeper.txn.ErrorTxn; -import org.apache.zookeeper.txn.SetACLTxn; -import org.apache.zookeeper.txn.SetDataTxn; -import org.apache.zookeeper.txn.TxnHeader; - -/** - * This class maintains the tree data structure. It doesn't have any networking - * or client connection code in it so that it can be tested in a stand alone - * way. - *

        - * The tree maintains two parallel data structures: a hashtable that maps from - * full paths to DataNodes and a tree of DataNodes. All accesses to a path is - * through the hashtable. The tree is traversed only when serializing to disk. - */ -public class DataTreeV1 { - private static final Logger LOG = LoggerFactory.getLogger(DataTreeV1.class); - - /** - * This hashtable provides a fast lookup to the datanodes. The tree is the - * source of truth and is where all the locking occurs - */ - private ConcurrentHashMap nodes = new ConcurrentHashMap(); - - private WatchManager dataWatches = new WatchManager(); - - private WatchManager childWatches = new WatchManager(); - - /** - * This hashtable lists the paths of the ephemeral nodes of a session. - */ - private Map> ephemerals = new ConcurrentHashMap>(); - - /** - * return the ephemerals for this tree - * @return the ephemerals for this tree - */ - public Map> getEphemeralsMap() { - return this.ephemerals; - } - - public void setEphemeralsMap(Map> ephemerals) { - this.ephemerals = ephemerals; - } - - @SuppressWarnings("unchecked") - public HashSet getEphemerals(long sessionId) { - HashSet retv = ephemerals.get(sessionId); - if (retv == null) { - return new HashSet(); - } - HashSet cloned = null; - synchronized(retv) { - cloned = (HashSet) retv.clone(); - } - return cloned; - } - - public Collection getSessions() { - return ephemerals.keySet(); - } - - public DataNodeV1 getNode(String path) { - return nodes.get(path); - } - - /** - * This is a pointer to the root of the DataTree. It is the source of truth, - * but we usually use the nodes hashmap to find nodes in the tree. - */ - private DataNodeV1 root = new DataNodeV1(null, new byte[0], null, new StatPersistedV1()); - - public DataTreeV1() { - /* Rather than fight it, let root have an alias */ - nodes.put("", root); - nodes.put("/", root); - } - - static public void copyStatPersisted(StatPersistedV1 from, StatPersistedV1 to) { - to.setAversion(from.getAversion()); - to.setCtime(from.getCtime()); - to.setCversion(from.getCversion()); - to.setCzxid(from.getCzxid()); - to.setMtime(from.getMtime()); - to.setMzxid(from.getMzxid()); - to.setVersion(from.getVersion()); - to.setEphemeralOwner(from.getEphemeralOwner()); - } - - static public void copyStat(Stat from, Stat to) { - to.setAversion(from.getAversion()); - to.setCtime(from.getCtime()); - to.setCversion(from.getCversion()); - to.setCzxid(from.getCzxid()); - to.setMtime(from.getMtime()); - to.setMzxid(from.getMzxid()); - to.setVersion(from.getVersion()); - to.setEphemeralOwner(from.getEphemeralOwner()); - to.setDataLength(from.getDataLength()); - to.setNumChildren(from.getNumChildren()); - } - - - // public void remooveInterest(String path, Watcher nw) { - // DataNode n = nodes.get(path); - // if (n == null) { - // synchronized (nonExistentWatches) { - // HashSet list = nonExistentWatches.get(path); - // if (list != null) { - // list.remove(nw); - // } - // } - // } - // synchronized (n) { - // n.dataWatchers.remove(nw); - // n.childWatchers.remove(nw); - // } - // } - - /** - * @param path - * @param data - * @param acl - * @param ephemeralOwner - * the session id that owns this node. -1 indicates this is - * not an ephemeral node. - * @param zxid - * @param time - * @return the patch of the created node - * @throws KeeperException - */ - public String createNode(String path, byte data[], List acl, - long ephemeralOwner, long zxid, long time) - throws KeeperException.NoNodeException, KeeperException.NodeExistsException { - int lastSlash = path.lastIndexOf('/'); - String parentName = path.substring(0, lastSlash); - String childName = path.substring(lastSlash + 1); - StatPersistedV1 stat = new StatPersistedV1(); - stat.setCtime(time); - stat.setMtime(time); - stat.setCzxid(zxid); - stat.setMzxid(zxid); - stat.setVersion(0); - stat.setAversion(0); - stat.setEphemeralOwner(ephemeralOwner); - DataNodeV1 parent = nodes.get(parentName); - if (parent == null) { - throw new KeeperException.NoNodeException(); - } - synchronized (parent) { - if (parent.children.contains(childName)) { - throw new KeeperException.NodeExistsException(); - } - int cver = parent.stat.getCversion(); - cver++; - parent.stat.setCversion(cver); - DataNodeV1 child = new DataNodeV1(parent, data, acl, stat); - parent.children.add(childName); - nodes.put(path, child); - if (ephemeralOwner != 0) { - HashSet list = ephemerals.get(ephemeralOwner); - if (list == null) { - list = new HashSet(); - ephemerals.put(ephemeralOwner, list); - } - synchronized(list) { - list.add(path); - } - } - } - dataWatches.triggerWatch(path, Event.EventType.NodeCreated); - childWatches.triggerWatch(parentName.equals("")?"/":parentName, Event.EventType.NodeChildrenChanged); - return path; - } - - public void deleteNode(String path) throws KeeperException.NoNodeException { - int lastSlash = path.lastIndexOf('/'); - String parentName = path.substring(0, lastSlash); - String childName = path.substring(lastSlash + 1); - DataNodeV1 node = nodes.get(path); - if (node == null) { - throw new KeeperException.NoNodeException(); - } - nodes.remove(path); - DataNodeV1 parent = nodes.get(parentName); - if (parent == null) { - throw new KeeperException.NoNodeException(); - } - synchronized (parent) { - parent.children.remove(childName); - parent.stat.setCversion(parent.stat.getCversion() + 1); - long eowner = node.stat.getEphemeralOwner(); - if (eowner != 0) { - HashSet nodes = ephemerals.get(eowner); - if (nodes != null) { - synchronized(nodes) { - nodes.remove(path); - } - } - } - node.parent = null; - } - Set processed = - dataWatches.triggerWatch(path, EventType.NodeDeleted); - childWatches.triggerWatch(path, EventType.NodeDeleted, processed); - childWatches.triggerWatch(parentName.equals("")?"/":parentName, EventType.NodeChildrenChanged); - } - - public Stat setData(String path, byte data[], int version, long zxid, - long time) throws KeeperException.NoNodeException { - Stat s = new Stat(); - DataNodeV1 n = nodes.get(path); - if (n == null) { - throw new KeeperException.NoNodeException(); - } - synchronized (n) { - n.data = data; - n.stat.setMtime(time); - n.stat.setMzxid(zxid); - n.stat.setVersion(version); - n.copyStat(s); - } - dataWatches.triggerWatch(path, EventType.NodeDataChanged); - return s; - } - - public byte[] getData(String path, Stat stat, Watcher watcher) throws KeeperException.NoNodeException { - DataNodeV1 n = nodes.get(path); - if (n == null) { - throw new KeeperException.NoNodeException(); - } - synchronized (n) { - n.copyStat(stat); - if (watcher != null) { - dataWatches.addWatch(path, watcher); - } - return n.data; - } - } - - public Stat statNode(String path, Watcher watcher) throws KeeperException.NoNodeException { - Stat stat = new Stat(); - DataNodeV1 n = nodes.get(path); - if (watcher != null) { - dataWatches.addWatch(path, watcher); - } - if (n == null) { - throw new KeeperException.NoNodeException(); - } - synchronized (n) { - n.copyStat(stat); - return stat; - } - } - - public ArrayList getChildren(String path, Stat stat, Watcher watcher) throws KeeperException.NoNodeException { - DataNodeV1 n = nodes.get(path); - if (n == null) { - throw new KeeperException.NoNodeException(); - } - synchronized (n) { - ArrayList children = new ArrayList(); - children.addAll(n.children); - if (watcher != null) { - childWatches.addWatch(path, watcher); - } - return children; - } - } - - public Stat setACL(String path, List acl, int version) throws KeeperException.NoNodeException { - Stat stat = new Stat(); - DataNodeV1 n = nodes.get(path); - if (n == null) { - throw new KeeperException.NoNodeException(); - } - synchronized (n) { - n.stat.setAversion(version); - n.acl = acl; - n.copyStat(stat); - return stat; - } - } - - @SuppressWarnings("unchecked") - public List getACL(String path, Stat stat) throws KeeperException.NoNodeException { - DataNodeV1 n = nodes.get(path); - if (n == null) { - throw new KeeperException.NoNodeException(); - } - synchronized (n) { - n.copyStat(stat); - return new ArrayList(n.acl); - } - } - - static public class ProcessTxnResult { - public long clientId; - - public int cxid; - - public long zxid; - - public int err; - - public int type; - - public String path; - - public Stat stat; - - /** - * Equality is defined as the clientId and the cxid being the same. This - * allows us to use hash tables to track completion of transactions. - * - * @see java.lang.Object#equals(java.lang.Object) - */ - @Override - public boolean equals(Object o) { - if (o instanceof ProcessTxnResult) { - ProcessTxnResult other = (ProcessTxnResult) o; - return other.clientId == clientId && other.cxid == cxid; - } - return false; - } - - /** - * See equals() to find the rational for how this hashcode is generated. - * - * @see ProcessTxnResult#equals(Object) - * @see java.lang.Object#hashCode() - */ - @Override - public int hashCode() { - return (int) ((clientId ^ cxid) % Integer.MAX_VALUE); - } - - } - - public volatile long lastProcessedZxid = 0; - - @SuppressWarnings("unchecked") - public ProcessTxnResult processTxn(TxnHeader header, Record txn) { - ProcessTxnResult rc = new ProcessTxnResult(); - - String debug = ""; - try { - rc.clientId = header.getClientId(); - rc.cxid = header.getCxid(); - rc.zxid = header.getZxid(); - rc.type = header.getType(); - rc.err = 0; - if (rc.zxid > lastProcessedZxid) { - lastProcessedZxid = rc.zxid; - } - switch (header.getType()) { - case OpCode.create: - CreateTxn createTxn = (CreateTxn) txn; - debug = "Create transaction for " + createTxn.getPath(); - createNode(createTxn.getPath(), createTxn.getData(), createTxn - .getAcl(), createTxn.getEphemeral() ? header - .getClientId() : 0, header.getZxid(), header.getTime()); - rc.path = createTxn.getPath(); - break; - case OpCode.delete: - DeleteTxn deleteTxn = (DeleteTxn) txn; - debug = "Delete transaction for " + deleteTxn.getPath(); - deleteNode(deleteTxn.getPath()); - break; - case OpCode.setData: - SetDataTxn setDataTxn = (SetDataTxn) txn; - debug = "Set data for transaction for " + setDataTxn.getPath(); - rc.stat = setData(setDataTxn.getPath(), setDataTxn.getData(), - setDataTxn.getVersion(), header.getZxid(), header - .getTime()); - break; - case OpCode.setACL: - SetACLTxn setACLTxn = (SetACLTxn) txn; - debug = "Set ACL for transaction for " + setACLTxn.getPath(); - rc.stat = setACL(setACLTxn.getPath(), setACLTxn.getAcl(), - setACLTxn.getVersion()); - break; - case OpCode.closeSession: - killSession(header.getClientId()); - break; - case OpCode.error: - ErrorTxn errTxn = (ErrorTxn) txn; - rc.err = errTxn.getErr(); - break; - } - } catch (KeeperException e) { - // These are expected errors since we take a lazy snapshot - if (initialized - || (e.code() != Code.NONODE - && e.code() != Code.NODEEXISTS)) { - LOG.warn("Failed:" + debug, e); - } - } - return rc; - } - - void killSession(long session) { - // the list is already removed from the ephemerals - // so we do not have to worry about synchronyzing on - // the list. This is only called from FinalRequestProcessor - // so there is no need for synchornization. The list is not - // changed here. Only create and delete change the list which - // are again called from FinalRequestProcessor in sequence. - HashSet list = ephemerals.remove(session); - if (list != null) { - for (String path : list) { - try { - deleteNode(path); - if (LOG.isDebugEnabled()) { - LOG.debug("Deleting ephemeral node " + path - + " for session 0x" - + Long.toHexString(session)); - } - } catch (NoNodeException e) { - LOG.warn("Ignoring NoNodeException for path " + path - + " while removing ephemeral for dead session 0x" - + Long.toHexString(session)); - } - } - } - } - - /** - * this method uses a stringbuilder to create a new - * path for children. This is faster than string - * appends ( str1 + str2). - * @param oa OutputArchive to write to. - * @param path a string builder. - * @throws IOException - * @throws InterruptedException - */ - void serializeNode(OutputArchive oa, StringBuilder path) - throws IOException, InterruptedException { - String pathString = path.toString(); - DataNodeV1 node = getNode(pathString); - if (node == null) { - return; - } - String children[] = null; - synchronized (node) { - scount++; - oa.writeString(pathString, "path"); - oa.writeRecord(node, "node"); - children = node.children.toArray(new String[node.children.size()]); - } - path.append('/'); - int off = path.length(); - if (children != null) { - for (String child : children) { - //since this is single buffer being resused - // we need - // to truncate the previous bytes of string. - path.delete(off, Integer.MAX_VALUE); - path.append(child); - serializeNode(oa, path); - } - } - } - - int scount; - - public boolean initialized = false; - - public void serialize(OutputArchive oa, String tag) throws IOException, - InterruptedException { - scount = 0; - serializeNode(oa, new StringBuilder("")); - // / marks end of stream - // we need to check if clear had been called in between the snapshot. - if (root != null) { - oa.writeString("/", "path"); - } - } - - public void deserialize(InputArchive ia, String tag) throws IOException { - nodes.clear(); - String path = ia.readString("path"); - while (!path.equals("/")) { - DataNodeV1 node = new DataNodeV1(); - ia.readRecord(node, "node"); - nodes.put(path, node); - int lastSlash = path.lastIndexOf('/'); - if (lastSlash == -1) { - root = node; - } else { - String parentPath = path.substring(0, lastSlash); - node.parent = nodes.get(parentPath); - node.parent.children.add(path.substring(lastSlash + 1)); - long eowner = node.stat.getEphemeralOwner(); - if (eowner != 0) { - HashSet list = ephemerals.get(eowner); - if (list == null) { - list = new HashSet(); - ephemerals.put(eowner, list); - } - list.add(path); - } - } - path = ia.readString("path"); - } - nodes.put("/", root); - } - - public String dumpEphemerals() { - Set keys = ephemerals.keySet(); - StringBuilder sb = new StringBuilder("Sessions with Ephemerals (" - + keys.size() + "):\n"); - for (long k : keys) { - sb.append("0x" + Long.toHexString(k)); - sb.append(":\n"); - HashSet tmp = ephemerals.get(k); - synchronized(tmp) { - for (String path : tmp) { - sb.append("\t" + path + "\n"); - } - } - } - return sb.toString(); - } - - public void removeCnxn(Watcher watcher) { - dataWatches.removeWatcher(watcher); - childWatches.removeWatcher(watcher); - } - - public void clear() { - root = null; - nodes.clear(); - ephemerals.clear(); - // dataWatches = null; - // childWatches = null; - } -} diff --git a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/upgrade/UpgradeMain.java b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/upgrade/UpgradeMain.java deleted file mode 100644 index 779c48187..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/upgrade/UpgradeMain.java +++ /dev/null @@ -1,181 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you 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. - */ - -package org.apache.zookeeper.server.upgrade; - -import java.io.File; -import java.io.IOException; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.apache.zookeeper.server.DataTree; -import org.apache.zookeeper.server.persistence.FileTxnSnapLog; - -/** - * This class upgrades the older database - * to a new database for the zookeeper - * servers. - * The way to run it is - * java -class path zookeeper.jar Upgrade dataDir snapShotDir - * or using zookeeper scripts with zkServer -upgrade dataDir snapShotDir - * it creates a backup in the dataDir/.bkup and snapShotDir/.bkup which - * can be retrieved back to the snapShotDir and dataDir - */ -public class UpgradeMain { - File snapShotDir; - File dataDir; - File bkupsnapShotDir; - File bkupdataDir; - File currentdataDir; - File currentsnapShotDir; - - private static final Logger LOG = LoggerFactory.getLogger(UpgradeMain.class); - private static final String USAGE = "Usage: UpgradeMain dataDir snapShotDir"; - private static final int LASTVERSION = 1; - private static final int CURRENTVERSION = FileTxnSnapLog.VERSION; - private static final String dirName = FileTxnSnapLog.version; - private static final String manual = "Please take manual steps to " + - "sanitize your database.\n Please read the upgrade manual"; - - /** - * upgrade class that takes the two file - * directories. - * @param dataDir the directory that contains the - * transaction logs - * @param snapShotDir the directory that contains - * the snapshots - */ - public UpgradeMain(File dataDir, File snapShotDir) { - this.snapShotDir = snapShotDir; - this.dataDir = dataDir; - this.bkupdataDir = new File(dataDir, dirName + LASTVERSION); - this.bkupsnapShotDir = new File(snapShotDir, dirName + LASTVERSION ); - this.currentsnapShotDir = new File(snapShotDir, dirName + CURRENTVERSION); - this.currentdataDir = new File(dataDir, dirName + CURRENTVERSION); - } - - /** - * create all the bkup directories and the current - * database directories - * @throws IOException - */ - private void createAllDirs() throws IOException { - String error = "backup directory " + bkupdataDir + " already exists"; - LOG.info("Creating previous version data dir " + bkupdataDir); - if (!bkupdataDir.mkdirs()) { - LOG.error(error); - LOG.error(manual); - throw new IOException(error); - } - LOG.info("Creating previous version snapshot dir " + bkupdataDir); - if (!bkupsnapShotDir.mkdirs() && !bkupsnapShotDir.exists()) { - LOG.error(error); - LOG.error(manual); - throw new IOException(error); - } - error = "current directory " + currentdataDir + " already exists"; - LOG.info("Creating current data dir " + currentdataDir); - if (!currentdataDir.mkdirs()) { - LOG.error(error); - LOG.error(manual); - throw new IOException(error); - } - LOG.info("Creating current snapshot dir " + currentdataDir); - if (!currentsnapShotDir.mkdirs() && !currentsnapShotDir.exists()) { - LOG.error(error); - LOG.error(manual); - throw new IOException(error); - } - } - - /** - * copy files from srcdir to dstdir that have the string - * filter in the srcdir filenames - * @param srcDir the source directory - * @param dstDir the destination directory - * @param filter the filter of filenames that - * need to be copied. - * @throws IOException - */ - void copyFiles(File srcDir, File dstDir, String filter) throws IOException { - File[] list = srcDir.listFiles(); - for (File file: list) { - String name = file.getName(); - if (name.startsWith(filter)) { - // we need to copy this file - File dest = new File(dstDir, name); - LOG.info("Renaming " + file + " to " + dest); - if (!file.renameTo(dest)) { - throw new IOException("Unable to rename " - + file + " to " + dest); - } - } - } - } - - /** - * run the upgrade - * @throws IOException - */ - public void runUpgrade() throws IOException { - if (!dataDir.exists()) { - throw new IOException(dataDir + " does not exist"); - } - if (!snapShotDir.exists()) { - throw new IOException(snapShotDir + " does not exist"); - } - // create the bkup directorya - createAllDirs(); - //copy all the files for backup - try { - copyFiles(dataDir, bkupdataDir, "log"); - copyFiles(snapShotDir, bkupsnapShotDir, "snapshot"); - } catch(IOException io) { - LOG.error("Failed in backing up."); - throw io; - } - - //evrything is backed up - // read old database and create - // an old snapshot - UpgradeSnapShotV1 upgrade = new UpgradeSnapShotV1(bkupdataDir, - bkupsnapShotDir); - LOG.info("Creating new data tree"); - DataTree dt = upgrade.getNewDataTree(); - FileTxnSnapLog filesnapLog = new FileTxnSnapLog(dataDir, - snapShotDir); - LOG.info("snapshotting the new datatree"); - filesnapLog.save(dt, upgrade.getSessionWithTimeOuts()); - //done saving. - LOG.info("Upgrade is complete"); - } - - public static void main(String[] argv) { - if (argv.length < 2) { - LOG.error(USAGE); - System.exit(-1); - } - try { - UpgradeMain upgrade = new UpgradeMain(new File(argv[0]), new File(argv[1])); - upgrade.runUpgrade(); - } catch(Throwable th) { - LOG.error("Upgrade Error: Please read the " + - "docs for manual failure recovery ", th); - } - } -} diff --git a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/upgrade/UpgradeSnapShot.java b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/upgrade/UpgradeSnapShot.java deleted file mode 100644 index 8cfbd93d7..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/upgrade/UpgradeSnapShot.java +++ /dev/null @@ -1,33 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you 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. - */ - -package org.apache.zookeeper.server.upgrade; - -import java.io.IOException; -import java.util.concurrent.ConcurrentHashMap; - -import org.apache.zookeeper.server.DataTree; - -/** - * interface for snapshot conversion. - * - */ -public interface UpgradeSnapShot { - public DataTree getNewDataTree() throws IOException; - public ConcurrentHashMap getSessionWithTimeOuts(); -} diff --git a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/upgrade/UpgradeSnapShotV1.java b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/upgrade/UpgradeSnapShotV1.java deleted file mode 100644 index aecc4d2a6..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/upgrade/UpgradeSnapShotV1.java +++ /dev/null @@ -1,332 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you 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. - */ - -package org.apache.zookeeper.server.upgrade; - -import java.io.BufferedInputStream; -import java.io.ByteArrayInputStream; -import java.io.EOFException; -import java.io.File; -import java.io.FileInputStream; -import java.io.IOException; -import java.io.InputStream; -import java.util.HashSet; -import java.util.List; -import java.util.Map; -import java.util.concurrent.ConcurrentHashMap; - -import org.apache.jute.BinaryInputArchive; -import org.apache.jute.InputArchive; -import org.apache.jute.Record; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.apache.zookeeper.ZooDefs.OpCode; -import org.apache.zookeeper.data.StatPersisted; -import org.apache.zookeeper.data.StatPersistedV1; -import org.apache.zookeeper.server.DataNode; -import org.apache.zookeeper.server.DataTree; -import org.apache.zookeeper.server.Request; -import org.apache.zookeeper.server.ZooTrace; -import org.apache.zookeeper.server.persistence.FileTxnLog; -import org.apache.zookeeper.server.persistence.Util; -import org.apache.zookeeper.server.util.SerializeUtils; -import org.apache.zookeeper.txn.CreateSessionTxn; -import org.apache.zookeeper.txn.TxnHeader; - -/** - * This class gets the old snapshot - * and the old dataDir and creates - * an brand new snapshot that is - * then converted to the new snapshot - * for upgrading. - */ -public class UpgradeSnapShotV1 implements UpgradeSnapShot { - private static final Logger LOG = LoggerFactory.getLogger(UpgradeSnapShotV1.class); - - ConcurrentHashMap sessionsWithTimeouts = - new ConcurrentHashMap(); - File dataDir; - File snapShotDir; - DataTreeV1 oldDataTree; - - /** - * upgrade from version 1 to version 2 - * @param dataDir - * @param snapShotDir - */ - public UpgradeSnapShotV1(File dataDir, File snapShotDir) { - this.dataDir = dataDir; - this.snapShotDir = snapShotDir; - oldDataTree = new DataTreeV1(); - } - - /** - * deseriluize from an inputarchive - * @param oldTree the tree to be created - * @param ia the input archive to be read from - * @param sessions the sessions to be created - * @throws IOException - */ - private void deserializeSnapshot(DataTreeV1 oldTree, InputArchive ia, - Map sessions) throws IOException { - int count = ia.readInt("count"); - while (count > 0) { - long id = ia.readLong("id"); - int to = ia.readInt("timeout"); - sessions.put(id, to); - if (LOG.isTraceEnabled()) { - ZooTrace.logTraceMessage(LOG, ZooTrace.SESSION_TRACE_MASK, - "loadData --- session in archive: " + id - + " with timeout: " + to); - } - count--; - } - oldTree.deserialize(ia, "tree"); - } - - /** - * play the log from this logstream into the datatree - * @param logStream - * @return - * @throws IOException - */ - public long playLog(InputArchive logStream) throws IOException { - long highestZxid = 0; - try { - while (true) { - byte[] bytes = logStream.readBuffer("txnEntry"); - if (bytes.length == 0) { - // Since we preallocate, we define EOF to be an - // empty transaction - throw new EOFException(); - } - TxnHeader hdr = new TxnHeader(); - Record txn = SerializeUtils.deserializeTxn(bytes, hdr); - if (logStream.readByte("EOR") != 'B') { - LOG.warn("Last transaction was partial."); - throw new EOFException("Last transaction was partial."); - } - if (hdr.getZxid() <= highestZxid && highestZxid != 0) { - LOG.error(highestZxid + "(higestZxid) >= " - + hdr.getZxid() + "(next log) for type " - + hdr.getType()); - } else { - highestZxid = hdr.getZxid(); - } - switch (hdr.getType()) { - case OpCode.createSession: - sessionsWithTimeouts.put(hdr.getClientId(), - ((CreateSessionTxn) txn).getTimeOut()); - if (LOG.isTraceEnabled()) { - ZooTrace.logTraceMessage(LOG, - ZooTrace.SESSION_TRACE_MASK, - "playLog --- create session in log: 0x" - + Long.toHexString(hdr.getClientId()) - + " with timeout: " - + ((CreateSessionTxn) txn).getTimeOut()); - } - // give dataTree a chance to sync its lastProcessedZxid - oldDataTree.processTxn(hdr, txn); - break; - case OpCode.closeSession: - sessionsWithTimeouts.remove(hdr.getClientId()); - if (LOG.isTraceEnabled()) { - ZooTrace.logTraceMessage(LOG, - ZooTrace.SESSION_TRACE_MASK, - "playLog --- close session in log: 0x" - + Long.toHexString(hdr.getClientId())); - } - oldDataTree.processTxn(hdr, txn); - break; - default: - oldDataTree.processTxn(hdr, txn); - } - Request r = new Request(null, 0, hdr.getCxid(), hdr.getType(), - null, null); - r.txn = txn; - r.hdr = hdr; - r.zxid = hdr.getZxid(); - } - } catch (EOFException e) { - // expected in some cases - see comments in try block - } - return highestZxid; - } - - - - /** - * apply the log files to the datatree - * @param oldTree the datatreee to apply the logs to - * @param logFiles the logs to be applied - * @throws IOException - */ - private long processLogFiles(DataTreeV1 oldTree, - File[] logFiles) throws IOException { - long zxid = 0; - for (File f: logFiles) { - LOG.info("Processing log file: " + f); - InputStream logIs = - new BufferedInputStream(new FileInputStream(f)); - zxid = playLog(BinaryInputArchive.getArchive(logIs)); - logIs.close(); - } - return zxid; - } - - /** - * create the old snapshot database - * apply logs to it and create the final - * database - * @throws IOException - */ - private void loadThisSnapShot() throws IOException { - // pick the most recent snapshot - File snapshot = findMostRecentSnapshot(); - if (snapshot == null) { - throw new IOException("Invalid snapshots " + - "or not snapshots in " + snapShotDir); - } - InputStream inputstream = new BufferedInputStream( - new FileInputStream(snapshot)); - InputArchive ia = BinaryInputArchive.getArchive(inputstream); - deserializeSnapshot(oldDataTree, ia, sessionsWithTimeouts); - //ok done with the snapshot - // now apply the logs - long snapshotZxid = oldDataTree.lastProcessedZxid; - File[] files = FileTxnLog.getLogFiles( - dataDir.listFiles(), snapshotZxid); - long zxid = processLogFiles(oldDataTree, files); - //check for this zxid to be sane - if (zxid != oldDataTree.lastProcessedZxid) { - LOG.error("Zxids not equal " + " log zxid " + - zxid + " datatree processed " + oldDataTree.lastProcessedZxid); - } - } - - /** - * find the most recent snapshot - * in the snapshot directory - * @return - * @throws IOException - */ - private File findMostRecentSnapshot() throws IOException { - List files = Util.sortDataDir(snapShotDir.listFiles(), - "snapshot", false); - for (File f: files) { - try { - if (Util.isValidSnapshot(f)) - return f; - } catch(IOException e) { - LOG.info("Invalid snapshot " + f, e); - } - } - return null; - } - - /** - * convert the old stat to new stat - * @param oldStat the old stat - * @return the new stat - */ - private StatPersisted convertStat(StatPersistedV1 oldStat) { - StatPersisted stat = new StatPersisted(); - stat.setAversion(oldStat.getAversion()); - stat.setCtime(oldStat.getCtime()); - stat.setCversion(oldStat.getCversion()); - stat.setCzxid(oldStat.getCzxid()); - stat.setEphemeralOwner(oldStat.getEphemeralOwner()); - stat.setMtime(oldStat.getMtime()); - stat.setMzxid(oldStat.getMzxid()); - stat.setVersion(oldStat.getVersion()); - return stat; - } - - /** - * convert a given old datanode to new datanode - * @param dt the new datatree - * @param parent the parent of the datanode to be constructed - * @param oldDataNode the old datanode - * @return the new datanode - */ - private DataNode convertDataNode(DataTree dt, DataNode parent, - DataNodeV1 oldDataNode) { - StatPersisted stat = convertStat(oldDataNode.stat); - DataNode dataNode = new DataNode(parent, oldDataNode.data, - dt.convertAcls(oldDataNode.acl), stat); - dataNode.setChildren(oldDataNode.children); - return dataNode; - } - - /** - * recurse through the old datatree and construct the - * new data tree - * @param dataTree the new datatree to be constructed - * @param path the path to start with - */ - private void recurseThroughDataTree(DataTree dataTree, String path) { - if (path == null) - return; - DataNodeV1 oldDataNode = oldDataTree.getNode(path); - HashSet children = oldDataNode.children; - DataNode parent = null; - if ("".equals(path)) { - parent = null; - } - else { - int lastSlash = path.lastIndexOf('/'); - String parentPath = path.substring(0, lastSlash); - parent = dataTree.getNode(parentPath); - } - DataNode thisDatNode = convertDataNode(dataTree, parent, - oldDataNode); - dataTree.addDataNode(path, thisDatNode); - if (children == null || children.size() == 0) { - return; - } - else { - for (String child: children) { - recurseThroughDataTree(dataTree, path + "/" +child); - } - } - } - - private DataTree convertThisSnapShot() throws IOException { - // create a datatree - DataTree dataTree = new DataTree(); - DataNodeV1 oldDataNode = oldDataTree.getNode(""); - if (oldDataNode == null) { - //should never happen - LOG.error("Upgrading from an empty snapshot."); - } - - recurseThroughDataTree(dataTree, ""); - dataTree.lastProcessedZxid = oldDataTree.lastProcessedZxid; - return dataTree; - } - - public DataTree getNewDataTree() throws IOException { - loadThisSnapShot(); - DataTree dt = convertThisSnapShot(); - return dt; - } - - public ConcurrentHashMap getSessionWithTimeOuts() { - return this.sessionsWithTimeouts; - } -} diff --git a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/util/KerberosUtil.java b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/util/KerberosUtil.java deleted file mode 100644 index 1434ff0ea..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/util/KerberosUtil.java +++ /dev/null @@ -1,45 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you 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. - */ - -package org.apache.zookeeper.server.util; - -import java.lang.reflect.InvocationTargetException; -import java.lang.reflect.Method; - -public class KerberosUtil { - - public static String getDefaultRealm() - throws ClassNotFoundException, NoSuchMethodException, - IllegalArgumentException, IllegalAccessException, - InvocationTargetException { - Object kerbConf; - Class classRef; - Method getInstanceMethod; - Method getDefaultRealmMethod; - if (System.getProperty("java.vendor").contains("IBM")) { - classRef = Class.forName("com.ibm.security.krb5.internal.Config"); - } else { - classRef = Class.forName("sun.security.krb5.Config"); - } - getInstanceMethod = classRef.getMethod("getInstance", new Class[0]); - kerbConf = getInstanceMethod.invoke(classRef, new Object[0]); - getDefaultRealmMethod = classRef.getDeclaredMethod("getDefaultRealm", - new Class[0]); - return (String)getDefaultRealmMethod.invoke(kerbConf, new Object[0]); - } -} diff --git a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/util/OSMXBean.java b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/util/OSMXBean.java deleted file mode 100644 index b22824d09..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/util/OSMXBean.java +++ /dev/null @@ -1,182 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you 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. - */ - -package org.apache.zookeeper.server.util; - -import java.lang.management.ManagementFactory; -import java.lang.management.OperatingSystemMXBean; -import java.lang.management.RuntimeMXBean; - -import java.io.BufferedReader; -import java.io.IOException; -import java.io.InputStream; -import java.io.InputStreamReader; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import java.lang.reflect.Method; - -/** - * This class is a wrapper for the implementation of - * com.sun.management.UnixOperatingSystemMXBean - * It will decide to use the sun api or its own implementation - * depending on the runtime (vendor) used. - */ -public class OSMXBean -{ - static final Logger LOG = LoggerFactory.getLogger(OSMXBean.class); - - private OperatingSystemMXBean osMbean; - - private static final boolean ibmvendor = - System.getProperty("java.vendor").contains("IBM"); - private static final boolean windows = - System.getProperty("os.name").startsWith("Windows"); - private static final boolean linux = - System.getProperty("os.name").startsWith("Linux"); - - /** - * Constructor. Get the running Operating System instance - */ - public OSMXBean () { - this.osMbean = ManagementFactory.getOperatingSystemMXBean(); - } - - /** - * Check if the OS is unix. If using the IBM java runtime, this - * will only work for linux. - * - * @return whether this is unix or not. - */ - public boolean getUnix() { - if (windows) { - return false; - } - return (ibmvendor ? linux : true); - } - - /** - * Load the implementation of UnixOperatingSystemMXBean for sun jvm - * and runs the desired method. - * @param mBeanMethodName : method to run from the interface UnixOperatingSystemMXBean - * @return the method result - */ - private Long getOSUnixMXBeanMethod (String mBeanMethodName) - { - Object unixos; - Class classRef; - Method mBeanMethod; - - try { - classRef = Class.forName("com.sun.management.UnixOperatingSystemMXBean"); - if (classRef.isInstance(osMbean)) { - mBeanMethod = classRef.getDeclaredMethod(mBeanMethodName, - new Class[0]); - unixos = classRef.cast(osMbean); - return (Long)mBeanMethod.invoke(unixos); - } - } catch(Exception e) { - LOG.warn("Not able to load class or method for com.sun.managment.UnixOperatingSystemMXBean.", e); - } - return null; - } - - /** - * Get the number of opened filed descriptor for the runtime jvm. - * If sun java, it will use the com.sun.management interfaces. - * Otherwise, this methods implements it (linux only). - * @return number of open file descriptors for the jvm - */ - public long getOpenFileDescriptorCount() - { - Long ofdc; - - if (!ibmvendor) { - ofdc = getOSUnixMXBeanMethod("getOpenFileDescriptorCount"); - return (ofdc != null ? ofdc.longValue () : -1); - } - - try { - //need to get the PID number of the process first - RuntimeMXBean rtmbean = ManagementFactory.getRuntimeMXBean(); - String rtname = rtmbean.getName(); - String[] pidhost = rtname.split("@"); - - //using linux bash commands to retrieve info - Process p = Runtime.getRuntime().exec( - new String[] { "bash", "-c", - "ls /proc/" + pidhost[0] + "/fdinfo | wc -l" }); - InputStream in = p.getInputStream(); - BufferedReader output = new BufferedReader( - new InputStreamReader(in)); - - try { - String openFileDesCount; - if ((openFileDesCount = output.readLine()) != null) { - return Long.parseLong(openFileDesCount); - } - } finally { - if (output != null) { - output.close(); - } - } - } catch (IOException ie) { - LOG.warn("Not able to get the number of open file descriptors", ie); - } - return -1; - } - - /** - * Get the number of the maximum file descriptors the system can use. - * If sun java, it will use the com.sun.management interfaces. - * Otherwise, this methods implements it (linux only). - * @return max number of file descriptors the operating system can use. - */ - public long getMaxFileDescriptorCount() - { - Long mfdc; - - if (!ibmvendor) { - mfdc = getOSUnixMXBeanMethod("getMaxFileDescriptorCount"); - return (mfdc != null ? mfdc.longValue () : -1); - } - - try { - //using linux bash commands to retrieve info - Process p = Runtime.getRuntime().exec( - new String[] { "bash", "-c", "ulimit -n" }); - InputStream in = p.getInputStream(); - BufferedReader output = new BufferedReader( - new InputStreamReader(in)); - - try { - String maxFileDesCount; - if ((maxFileDesCount = output.readLine()) != null) { - return Long.parseLong(maxFileDesCount); - } - } finally { - if (output != null) { - output.close(); - } - } - } catch (IOException ie) { - LOG.warn("Not able to get the max number of file descriptors", ie); - } - return -1; - } -} diff --git a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/util/Profiler.java b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/util/Profiler.java deleted file mode 100644 index f81d27047..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/util/Profiler.java +++ /dev/null @@ -1,41 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you 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. - */ - -package org.apache.zookeeper.server.util; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -public class Profiler { - private static final Logger LOG = LoggerFactory.getLogger(Profiler.class); - - public interface Operation { - public T execute() throws Exception; - } - - public static T profile(Operation op, long timeout, String message) - throws Exception { - long start = System.currentTimeMillis(); - T res = op.execute(); - long end = System.currentTimeMillis(); - if (end - start > timeout) { - LOG.info("Elapsed "+(end - start) + " ms: " + message); - } - return res; - } -} diff --git a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/util/SerializeUtils.java b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/util/SerializeUtils.java deleted file mode 100644 index f9647c458..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/util/SerializeUtils.java +++ /dev/null @@ -1,141 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you 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. - */ - -package org.apache.zookeeper.server.util; - -import java.io.ByteArrayInputStream; -import java.io.EOFException; -import java.io.IOException; -import java.util.HashMap; -import java.util.Map; -import java.util.Map.Entry; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import org.apache.jute.BinaryInputArchive; -import org.apache.jute.InputArchive; -import org.apache.jute.OutputArchive; -import org.apache.jute.Record; -import org.apache.zookeeper.ZooDefs.OpCode; -import org.apache.zookeeper.server.DataTree; -import org.apache.zookeeper.server.ZooTrace; -import org.apache.zookeeper.txn.CreateSessionTxn; -import org.apache.zookeeper.txn.CreateTxn; -import org.apache.zookeeper.txn.CreateTxnV0; -import org.apache.zookeeper.txn.DeleteTxn; -import org.apache.zookeeper.txn.ErrorTxn; -import org.apache.zookeeper.txn.SetACLTxn; -import org.apache.zookeeper.txn.SetDataTxn; -import org.apache.zookeeper.txn.TxnHeader; -import org.apache.zookeeper.txn.MultiTxn; - -public class SerializeUtils { - private static final Logger LOG = LoggerFactory.getLogger(SerializeUtils.class); - - public static Record deserializeTxn(byte txnBytes[], TxnHeader hdr) - throws IOException { - final ByteArrayInputStream bais = new ByteArrayInputStream(txnBytes); - InputArchive ia = BinaryInputArchive.getArchive(bais); - - hdr.deserialize(ia, "hdr"); - bais.mark(bais.available()); - Record txn = null; - switch (hdr.getType()) { - case OpCode.createSession: - // This isn't really an error txn; it just has the same - // format. The error represents the timeout - txn = new CreateSessionTxn(); - break; - case OpCode.closeSession: - return null; - case OpCode.create: - txn = new CreateTxn(); - break; - case OpCode.delete: - txn = new DeleteTxn(); - break; - case OpCode.setData: - txn = new SetDataTxn(); - break; - case OpCode.setACL: - txn = new SetACLTxn(); - break; - case OpCode.error: - txn = new ErrorTxn(); - break; - case OpCode.multi: - txn = new MultiTxn(); - break; - default: - throw new IOException("Unsupported Txn with type=%d" + hdr.getType()); - } - if (txn != null) { - try { - txn.deserialize(ia, "txn"); - } catch(EOFException e) { - // perhaps this is a V0 Create - if (hdr.getType() == OpCode.create) { - CreateTxn create = (CreateTxn)txn; - bais.reset(); - CreateTxnV0 createv0 = new CreateTxnV0(); - createv0.deserialize(ia, "txn"); - // cool now make it V1. a -1 parentCVersion will - // trigger fixup processing in processTxn - create.setPath(createv0.getPath()); - create.setData(createv0.getData()); - create.setAcl(createv0.getAcl()); - create.setEphemeral(createv0.getEphemeral()); - create.setParentCVersion(-1); - } else { - throw e; - } - } - } - return txn; - } - - public static void deserializeSnapshot(DataTree dt,InputArchive ia, - Map sessions) throws IOException { - int count = ia.readInt("count"); - while (count > 0) { - long id = ia.readLong("id"); - int to = ia.readInt("timeout"); - sessions.put(id, to); - if (LOG.isTraceEnabled()) { - ZooTrace.logTraceMessage(LOG, ZooTrace.SESSION_TRACE_MASK, - "loadData --- session in archive: " + id - + " with timeout: " + to); - } - count--; - } - dt.deserialize(ia, "tree"); - } - - public static void serializeSnapshot(DataTree dt,OutputArchive oa, - Map sessions) throws IOException { - HashMap sessSnap = new HashMap(sessions); - oa.writeInt(sessSnap.size(), "count"); - for (Entry entry : sessSnap.entrySet()) { - oa.writeLong(entry.getKey().longValue(), "id"); - oa.writeInt(entry.getValue().intValue(), "timeout"); - } - dt.serialize(oa, "tree"); - } - -} diff --git a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/util/ZxidUtils.java b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/util/ZxidUtils.java deleted file mode 100644 index 39e076a27..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/server/util/ZxidUtils.java +++ /dev/null @@ -1,34 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you 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. - */ - -package org.apache.zookeeper.server.util; - -public class ZxidUtils { - static public long getEpochFromZxid(long zxid) { - return zxid >> 32L; - } - static public long getCounterFromZxid(long zxid) { - return zxid & 0xffffffffL; - } - static public long makeZxid(long epoch, long counter) { - return (epoch << 32L) | (counter & 0xffffffffL); - } - static public String zxidToString(long zxid) { - return Long.toHexString(zxid); - } -} diff --git a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/version/util/VerGen.java b/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/version/util/VerGen.java deleted file mode 100644 index d4cbeb64e..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/java/main/org/apache/zookeeper/version/util/VerGen.java +++ /dev/null @@ -1,177 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you 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. - */ - -package org.apache.zookeeper.version.util; - -import java.io.File; -import java.io.FileWriter; -import java.io.IOException; -import java.util.regex.Matcher; -import java.util.regex.Pattern; - -public class VerGen { - private static final String PACKAGE_NAME = "org.apache.zookeeper.version"; - private static final String TYPE_NAME = "Info"; - - static void printUsage() { - System.out.print("Usage:\tjava -cp org.apache.zookeeper." - + "version.util.VerGen maj.min.micro[-qualifier] rev buildDate"); - System.exit(1); - } - - public static void generateFile(File outputDir, Version version, int rev, String buildDate) - { - String path = PACKAGE_NAME.replaceAll("\\.", "/"); - File pkgdir = new File(outputDir, path); - if (!pkgdir.exists()) { - // create the pkg directory - boolean ret = pkgdir.mkdirs(); - if (!ret) { - System.out.println("Cannnot create directory: " + path); - System.exit(1); - } - } else if (!pkgdir.isDirectory()) { - // not a directory - System.out.println(path + " is not a directory."); - System.exit(1); - } - File file = new File(pkgdir, TYPE_NAME + ".java"); - FileWriter w = null; - try { - w = new FileWriter(file); - w.write("// Do not edit!\n// File generated by org.apache.zookeeper" - + ".version.util.VerGen.\n"); - w.write("/**\n"); - w.write("* Licensed to the Apache Software Foundation (ASF) under one\n"); - w.write("* or more contributor license agreements. See the NOTICE file\n"); - w.write("* distributed with this work for additional information\n"); - w.write("* regarding copyright ownership. The ASF licenses this file\n"); - w.write("* to you under the Apache License, Version 2.0 (the\n"); - w.write("* \"License\"); you may not use this file except in compliance\n"); - w.write("* with the License. You may obtain a copy of the License at\n"); - w.write("*\n"); - w.write("* http://www.apache.org/licenses/LICENSE-2.0\n"); - w.write("*\n"); - w.write("* Unless required by applicable law or agreed to in writing, software\n"); - w.write("* distributed under the License is distributed on an \"AS IS\" BASIS,\n"); - w.write("* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n"); - w.write("* See the License for the specific language governing permissions and\n"); - w.write("* limitations under the License.\n"); - w.write("*/\n"); - w.write("\n"); - w.write("package " + PACKAGE_NAME + ";\n\n"); - w.write("public interface " + TYPE_NAME + " {\n"); - w.write(" public static final int MAJOR=" + version.maj + ";\n"); - w.write(" public static final int MINOR=" + version.min + ";\n"); - w.write(" public static final int MICRO=" + version.micro + ";\n"); - w.write(" public static final String QUALIFIER=" - + (version.qualifier == null ? null : - "\"" + version.qualifier + "\"") - + ";\n"); - if (rev < 0) { - System.out.println("Unknown REVISION number, using " + rev); - } - w.write(" public static final int REVISION=" + rev + ";\n"); - w.write(" public static final String BUILD_DATE=\"" + buildDate - + "\";\n"); - w.write("}\n"); - } catch (IOException e) { - System.out.println("Unable to generate version.Info file: " - + e.getMessage()); - System.exit(1); - } finally { - if (w != null) { - try { - w.close(); - } catch (IOException e) { - System.out.println("Unable to close file writer" - + e.getMessage()); - } - } - } - } - - public static class Version { - public int maj; - public int min; - public int micro; - public String qualifier; - } - - public static Version parseVersionString(String input) { - Version result = new Version(); - - Pattern p = Pattern.compile("^(\\d+)\\.(\\d+)\\.(\\d+)((\\.\\d+)*)(-(.+))?$"); - Matcher m = p.matcher(input); - - if (!m.matches()) { - return null; - } - result.maj = Integer.parseInt(m.group(1)); - result.min = Integer.parseInt(m.group(2)); - result.micro = Integer.parseInt(m.group(3)); - if (m.groupCount() == 7) { - result.qualifier = m.group(7); - } else { - result.qualifier = null; - } - return result; - } - - /** - * Emits a org.apache.zookeeper.version.Info interface file with version and - * revision information constants set to the values passed in as command - * line parameters. The file is created in the current directory.
        - * Usage: java org.apache.zookeeper.version.util.VerGen maj.min.micro[-qualifier] - * rev buildDate - * - * @param args - *

          - *
        • maj - major version number - *
        • min - minor version number - *
        • micro - minor minor version number - *
        • qualifier - optional qualifier (dash followed by qualifier text) - *
        • rev - current SVN revision number - *
        • buildDate - date the build - *
        - */ - public static void main(String[] args) { - if (args.length != 3) - printUsage(); - try { - Version version = parseVersionString(args[0]); - if (version == null) { - System.err.println( - "Invalid version number format, must be \"x.y.z(-.*)?\""); - System.exit(1); - } - int rev; - try { - rev = Integer.parseInt(args[1]); - } catch (NumberFormatException e) { - rev = -1; - } - generateFile(new File("."), version, rev, args[2]); - } catch (NumberFormatException e) { - System.err.println( - "All version-related parameters must be valid integers!"); - throw e; - } - } - -} diff --git a/pkg/registry/zookeeper-3.4.6/src/java/main/overview.html b/pkg/registry/zookeeper-3.4.6/src/java/main/overview.html deleted file mode 100644 index db9b16f0f..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/java/main/overview.html +++ /dev/null @@ -1,26 +0,0 @@ - - - - - - ZooKeeper - - -ZooKeeper is a service for coordinating processes of distributed applications. - - diff --git a/pkg/registry/zookeeper-3.4.6/src/java/systest/README.txt b/pkg/registry/zookeeper-3.4.6/src/java/systest/README.txt deleted file mode 100644 index 8a2985c2e..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/java/systest/README.txt +++ /dev/null @@ -1,62 +0,0 @@ -To run the system test we need to create processing containers that we can -spawn tasks, called Instances, in. (how is that for a dangling preposition!?!) -Start up InstanceContainers first. Then run the system test. The system test -finds the InstanceContainers and directs them through ZooKeeper, so you are -going to need an instance of ZooKeeper running that they can all access. -The easiest way to do all of this is to use the zookeeper fat jar. - -Steps to run system test ------------------------- -1) transfer the fatjar from the release directory to all systems - participating in the test. fatjar is in contrib/fatjar directory. - - (developers can generate by running "ant jar compile-test" - targets in trunk, then compiling using "ant jar" in src/contrib/jarjar) - -2) run a zookeeper standalone instance (cluster is ok too) - -e.g. java -jar zookeeper--fatjar.jar server - -Note: you must provide zoo.cfg, see sample in conf directory - -3) on each host start the system test container - -e.g. java -jar zookeeper--fatjar.jar ic /sysTest - -name : name of the test container - must be unique - typically it's a good idea to name after the host to aid debugging - -zkHostPort : the host:port of the server from step 2) - -4) initiate the system test using the fatjar: - -java -jar build/contrib/fatjar/zookeeper--fatjar.jar systest org.apache.zookeeper.test.system.SimpleSysTest - -by default it will access the zk server started in 2) on localhost:2181 - -or you can specify a remote host:port using - -DsysTest.zkHostPort=:,:,... - -java -DsysTest.zkHostPort=hostA:2181 -jar build/contrib/fatjar/zookeeper--fatjar.jar systest org.apache.zookeeper.test.system.SimpleSysTest - -where hostA is running the zk server started in step 2) above - -InstanceContainers can also be used to run a the saturation benchmark. The -first two steps are the same as the system test. Step 3 is almost the same: - -3) start the InstanceContainer on each host: - -e.g. java -jar zookeeper--fatjar.jar ic - -note prefix can be /sysTest or any other path. If you do use /sysTest, make -sure the system test isn't running when you run the benchmark. - -4) run GenerateLoad using the following - -java -jar build/contrib/fatjar/zookeeper--fatjar.jar generateLoad #servers #clients - -Once GenerateLoad is started, it will read commands from stdin. Usually -the only command you need to know is "percentage" which sets the percentage -of writes to use in the requests. Once a percentage is set, the benchmark -will start. "percentage 0" will cause only reads to be issued and -"percentage 100" will cause only writes to be issued. diff --git a/pkg/registry/zookeeper-3.4.6/src/lastRevision.bat b/pkg/registry/zookeeper-3.4.6/src/lastRevision.bat deleted file mode 100644 index e31a6b96c..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/lastRevision.bat +++ /dev/null @@ -1,23 +0,0 @@ -echo off -rem Licensed to the Apache Software Foundation (ASF) under one -rem or more contributor license agreements. See the NOTICE file -rem distributed with this work for additional information -rem regarding copyright ownership. The ASF licenses this file -rem to you under the Apache License, Version 2.0 (the -rem "License"); you may not use this file except in compliance -rem with the License. You may obtain a copy of the License at -rem -rem http://www.apache.org/licenses/LICENSE-2.0 -rem -rem Unless required by applicable law or agreed to in writing, software -rem distributed under the License is distributed on an "AS IS" BASIS, -rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -rem See the License for the specific language governing permissions and -rem limitations under the License. - -rem Find the current revision, store it in a file, for DOS -svn info | findstr Revision > %1 - -For /F "tokens=1,2 delims= " %%a In (%1) Do ( - echo lastRevision=%%b> %1 -) diff --git a/pkg/registry/zookeeper-3.4.6/src/lastRevision.sh b/pkg/registry/zookeeper-3.4.6/src/lastRevision.sh deleted file mode 100755 index a462990e7..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/lastRevision.sh +++ /dev/null @@ -1,21 +0,0 @@ -# Licensed to the Apache Software Foundation (ASF) under one -# or more contributor license agreements. See the NOTICE file -# distributed with this work for additional information -# regarding copyright ownership. The ASF licenses this file -# to you 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. - -# Find the current revision, store it in a file -FILE=$1 -LASTREV=`svn info | grep '^Revision' | sed -e 's/Revision: *//'` - -echo "lastRevision=${LASTREV}" > $FILE diff --git a/pkg/registry/zookeeper-3.4.6/src/packages/deb/init.d/zookeeper b/pkg/registry/zookeeper-3.4.6/src/packages/deb/init.d/zookeeper deleted file mode 100644 index 656076fc5..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/packages/deb/init.d/zookeeper +++ /dev/null @@ -1,140 +0,0 @@ -#! /bin/sh - -# Licensed to the Apache Software Foundation (ASF) under one or more -# contributor license agreements. See the NOTICE file distributed with -# this work for additional information regarding copyright ownership. -# The ASF licenses this file to You 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. - -### BEGIN INIT INFO -# Provides: zookeeper -# Required-Start: $remote_fs $syslog -# Required-Stop: $remote_fs $syslog -# Default-Start: 2 3 4 5 -# Default-Stop: -# Short-Description: Apache ZooKeeper server -### END INIT INFO - -set -e - -# /etc/init.d/zookeeper: start and stop the Apache ZooKeeper daemon - -umask 022 - -. /usr/libexec/zkEnv.sh - -. /lib/lsb/init-functions - -ZOOPIDDIR=/var/lib/zookeeper/data -ZOOPIDFILE=${ZOOPIDDIR}/zookeeper_server.pid - -check_privsep_dir() { - # Create the PrivSep empty dir if necessary - if [ ! -d ${ZOOPIDDIR} ]; then - mkdir -p ${ZOOPIDDIR} - chown zookeeper:hadoop ${ZOOPIDDIR} - chmod 0775 ${ZOOPIDDIR} - fi -} - -# Are we running from init? -run_by_init() { - ([ "$previous" ] && [ "$runlevel" ]) || [ "$runlevel" = S ] -} - -check_for_no_start() { - # forget it if we're trying to start, and /etc/zookeeper/zookeeper_not_to_be_run exists - if [ -e /etc/zookeeper/zookeeper_not_to_be_run ]; then - if [ "$1" = log_end_msg ]; then - log_end_msg 0 - fi - if ! run_by_init; then - log_action_msg "Apache ZooKeeper server not in use (/etc/zookeeper/zookeeper_not_to_be_run)" - fi - exit 0 - fi -} - -export PATH="${PATH:+$PATH:}/usr/sbin:/usr/bin" - -case "$1" in - start) - check_for_no_start - check_privsep_dir - log_daemon_msg "Starting Apache ZooKeeper server" "zookeeper" - if start-stop-daemon --start --quiet --oknodo --pidfile ${ZOOPIDFILE} -c zookeeper -x ${ZOOKEEPER_PREFIX}/sbin/zkServer.sh start; then - log_end_msg 0 - else - log_end_msg 1 - fi - ;; - stop) - log_daemon_msg "Stopping Apache ZooKeeper server" "zookeeper" - if start-stop-daemon --stop --quiet --oknodo --pidfile ${ZOOPIDFILE}; then - log_end_msg 0 - else - log_end_msg 1 - fi - ;; - - restart) - check_privsep_dir - log_daemon_msg "Restarting Apache ZooKeeper server" "zookeeper" - start-stop-daemon --stop --quiet --oknodo --retry 30 --pidfile ${ZOOPIDFILE} - check_for_no_start log_end_msg - if start-stop-daemon --start --quiet --oknodo --pidfile ${ZOOPIDFILE} -c zookeeper -x ${ZOOKEEPER_PREFIX}/sbin/zkServer.sh start; then - log_end_msg 0 - else - log_end_msg 1 - fi - ;; - - try-restart) - check_privsep_dir - log_daemon_msg "Restarting Apache ZooKeeper server" "zookeeper" - set +e - start-stop-daemon --stop --quiet --retry 30 --pidfile ${ZOOPIDFILE} - RET="$?" - set -e - case $RET in - 0) - # old daemon stopped - check_for_no_start log_end_msg - if start-stop-daemon --start --quiet --oknodo --pidfile ${ZOOPIDFILE} -c zookeeper -x ${ZOOKEEPER_PREFIX}/sbin/zkServer.sh start; then - log_end_msg 0 - else - log_end_msg 1 - fi - ;; - 1) - # daemon not running - log_progress_msg "(not running)" - log_end_msg 0 - ;; - *) - # failed to stop - log_progress_msg "(failed to stop)" - log_end_msg 1 - ;; - esac - ;; - - status) - status_of_proc -p ${ZOOPIDFILE} ${JAVA_HOME}/bin/java zookeeper && exit 0 || exit $? - ;; - - *) - log_action_msg "Usage: /etc/init.d/zookeeper {start|stop|restart|try-restart|status}" - exit 1 -esac - -exit 0 diff --git a/pkg/registry/zookeeper-3.4.6/src/packages/deb/zookeeper.control/conffile b/pkg/registry/zookeeper-3.4.6/src/packages/deb/zookeeper.control/conffile deleted file mode 100644 index 6fdd65be1..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/packages/deb/zookeeper.control/conffile +++ /dev/null @@ -1,15 +0,0 @@ -# Licensed to the Apache Software Foundation (ASF) under one or more -# contributor license agreements. See the NOTICE file distributed with -# this work for additional information regarding copyright ownership. -# The ASF licenses this file to You 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. -/etc/zookeeper diff --git a/pkg/registry/zookeeper-3.4.6/src/packages/deb/zookeeper.control/control b/pkg/registry/zookeeper-3.4.6/src/packages/deb/zookeeper.control/control deleted file mode 100644 index c74690602..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/packages/deb/zookeeper.control/control +++ /dev/null @@ -1,23 +0,0 @@ -# Licensed to the Apache Software Foundation (ASF) under one or more -# contributor license agreements. See the NOTICE file distributed with -# this work for additional information regarding copyright ownership. -# The ASF licenses this file to You 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. -Package: zookeeper -Version: @version@ -Section: misc -Priority: optional -Architecture: all -Depends: sun-java6-jre -Maintainer: Apache Software Foundation -Description: ZooKeeper is a centralized service for maintaining configuration information, naming, providing distributed synchronization, and providing group services. -Distribution: development diff --git a/pkg/registry/zookeeper-3.4.6/src/packages/deb/zookeeper.control/postinst b/pkg/registry/zookeeper-3.4.6/src/packages/deb/zookeeper.control/postinst deleted file mode 100644 index a6cbd22d1..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/packages/deb/zookeeper.control/postinst +++ /dev/null @@ -1,23 +0,0 @@ -#!/bin/sh - -# Licensed to the Apache Software Foundation (ASF) under one or more -# contributor license agreements. See the NOTICE file distributed with -# this work for additional information regarding copyright ownership. -# The ASF licenses this file to You 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. - -bash /usr/sbin/update-zookeeper-env.sh \ - --prefix=/usr \ - --conf-dir=/etc/zookeeper \ - --log-dir=/var/log/zookeeper \ - --pid-dir=/var/run/zookeeper \ - --var-dir=/var/lib/zookeeper diff --git a/pkg/registry/zookeeper-3.4.6/src/packages/deb/zookeeper.control/postrm b/pkg/registry/zookeeper-3.4.6/src/packages/deb/zookeeper.control/postrm deleted file mode 100644 index 27842b756..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/packages/deb/zookeeper.control/postrm +++ /dev/null @@ -1,19 +0,0 @@ -#!/bin/sh - -# Licensed to the Apache Software Foundation (ASF) under one or more -# contributor license agreements. See the NOTICE file distributed with -# this work for additional information regarding copyright ownership. -# The ASF licenses this file to You 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. - -/usr/sbin/userdel zookeeper 2> /dev/null >/dev/null -exit 0 diff --git a/pkg/registry/zookeeper-3.4.6/src/packages/deb/zookeeper.control/preinst b/pkg/registry/zookeeper-3.4.6/src/packages/deb/zookeeper.control/preinst deleted file mode 100644 index d4ca7f713..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/packages/deb/zookeeper.control/preinst +++ /dev/null @@ -1,20 +0,0 @@ -#!/bin/sh - -# Licensed to the Apache Software Foundation (ASF) under one or more -# contributor license agreements. See the NOTICE file distributed with -# this work for additional information regarding copyright ownership. -# The ASF licenses this file to You 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. - -getent group hadoop 2>/dev/null >/dev/null || /usr/sbin/groupadd -r hadoop - -/usr/sbin/useradd --comment "ZooKeeper" --shell /bin/bash -M -r --groups hadoop --home /usr/share/zookeeper zookeeper 2> /dev/null || : diff --git a/pkg/registry/zookeeper-3.4.6/src/packages/deb/zookeeper.control/prerm b/pkg/registry/zookeeper-3.4.6/src/packages/deb/zookeeper.control/prerm deleted file mode 100644 index c986688a7..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/packages/deb/zookeeper.control/prerm +++ /dev/null @@ -1,24 +0,0 @@ -#!/bin/sh - -# Licensed to the Apache Software Foundation (ASF) under one or more -# contributor license agreements. See the NOTICE file distributed with -# this work for additional information regarding copyright ownership. -# The ASF licenses this file to You 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. - -/etc/init.d/zookeeper stop 2>/dev/null >/dev/null -bash /usr/sbin/update-zookeeper-env.sh \ - --prefix=/usr \ - --conf-dir=/etc/zookeeper \ - --log-dir=/var/log/zookeeper \ - --pid-dir=/var/run/zookeeper \ - --uninstal diff --git a/pkg/registry/zookeeper-3.4.6/src/packages/rpm/init.d/zookeeper b/pkg/registry/zookeeper-3.4.6/src/packages/rpm/init.d/zookeeper deleted file mode 100644 index faeebb7a9..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/packages/rpm/init.d/zookeeper +++ /dev/null @@ -1,84 +0,0 @@ -#!/bin/bash - -# Licensed to the Apache Software Foundation (ASF) under one or more -# contributor license agreements. See the NOTICE file distributed with -# this work for additional information regarding copyright ownership. -# The ASF licenses this file to You 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. - -# -# ZooKeeper -# -# chkconfig: 2345 89 9 -# description: zookeeper - -source /etc/rc.d/init.d/functions -source /usr/libexec/zkEnv.sh - -RETVAL=0 -PIDFILE="${ZOOPIDFILE}" -desc="ZooKeeper daemon" - -start() { - echo -n $"Starting $desc (zookeeper): " - daemon --user zookeeper zkServer.sh start - RETVAL=$? - echo - [ $RETVAL -eq 0 ] && touch /var/lock/subsys/zookeeper - return $RETVAL -} - -stop() { - echo -n $"Stopping $desc (zookeeper): " - daemon --user zookeeper zkServer.sh stop - RETVAL=$? - sleep 5 - echo - [ $RETVAL -eq 0 ] && rm -f /var/lock/subsys/zookeeper $PIDFILE -} - -restart() { - stop - start -} - -checkstatus(){ - status -p $PIDFILE ${JAVA_HOME}/bin/java - RETVAL=$? -} - -condrestart(){ - [ -e /var/lock/subsys/zookeeper ] && restart || : -} - -case "$1" in - start) - start - ;; - stop) - stop - ;; - status) - checkstatus - ;; - restart) - restart - ;; - condrestart) - condrestart - ;; - *) - echo $"Usage: $0 {start|stop|status|restart|condrestart}" - exit 1 -esac - -exit $RETVAL diff --git a/pkg/registry/zookeeper-3.4.6/src/packages/rpm/spec/zookeeper.spec b/pkg/registry/zookeeper-3.4.6/src/packages/rpm/spec/zookeeper.spec deleted file mode 100644 index 8e195c716..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/packages/rpm/spec/zookeeper.spec +++ /dev/null @@ -1,166 +0,0 @@ -# Licensed to the Apache Software Foundation (ASF) under one or more -# contributor license agreements. See the NOTICE file distributed with -# this work for additional information regarding copyright ownership. -# The ASF licenses this file to You 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. - -# -# RPM Spec file for ZooKeeper version @version@ -# - -%define name zookeeper -%define version @version@ -%define release @package.release@ - -# Installation Locations -%define _prefix @package.prefix@ -%define _bin_dir %{_prefix}/bin -%define _conf_dir @package.conf.dir@ -%define _include_dir %{_prefix}/include -%define _lib_dir %{_prefix}/lib -%define _lib64_dir %{_prefix}/lib64 -%define _libexec_dir %{_prefix}/libexec -%define _log_dir @package.log.dir@ -%define _man_dir %{_prefix}/man -%define _pid_dir @package.pid.dir@ -%define _sbin_dir %{_prefix}/sbin -%define _share_dir %{_prefix}/share/zookeeper -%define _src_dir %{_prefix}/src -%define _var_dir @package.var.dir@ - -# Build time settings -%define _build_dir @package.build.dir@ -%define _final_name @final.name@ -%define _c_lib @c.lib@ -%define debug_package %{nil} - -# Disable brp-java-repack-jars for aspect J -%define __os_install_post \ - /usr/lib/rpm/redhat/brp-compress \ - %{!?__debug_package:/usr/lib/rpm/redhat/brp-strip %{__strip}} \ - /usr/lib/rpm/redhat/brp-strip-static-archive %{__strip} \ - /usr/lib/rpm/redhat/brp-strip-comment-note %{__strip} %{__objdump} \ - /usr/lib/rpm/brp-python-bytecompile %{nil} - -# RPM searches perl files for dependancies and this breaks for non packaged perl lib -# like thrift so disable this -%define _use_internal_dependency_generator 0 - -Summary: ZooKeeper is a centralized service for maintaining configuration information, naming, providing distributed synchronization, and providing group services. -License: Apache License, Version 2.0 -URL: http://zookeeper.apache.org/ -Vendor: Apache Software Foundation -Group: Development/Libraries -Name: %{name} -Version: %{version} -Release: %{release} -Source0: %{_final_name}.tar.gz -Source1: %{_final_name}-lib.tar.gz -Prefix: %{_prefix} -Prefix: %{_conf_dir} -Prefix: %{_log_dir} -Prefix: %{_pid_dir} -Prefix: %{_var_dir} -Requires: sh-utils, textutils, /usr/sbin/useradd, /usr/sbin/usermod, /sbin/chkconfig, /sbin/service, jdk >= 1.6 -AutoReqProv: no -Provides: zookeeper - -%description -ZooKeeper is a centralized service for maintaining configuration information, naming, providing distributed synchronization, and providing group services. All of these kinds of services are used in some form or another by distributed applications. Each time they are implemented there is a lot of work that goes into fixing the bugs and race conditions that are inevitable. Because of the difficulty of implementing these kinds of services, applications initially usually skimp on them ,which make them brittle in the presence of change and difficult to manage. Even when done correctly, different implementations of these services lead to management complexity when the applications are deployed. - -%package lib -Summary: ZooKeeper C binding library -Group: System/Libraries -#Requires: %{name} == %{version} -Provides: zookeeper-lib - -%description lib -ZooKeeper C client library for communicating with ZooKeeper Server. - -%prep -%setup -D -b 1 -n %{_final_name} -%setup -D -a 0 -n %{_final_name} - -%build -mkdir -p ${RPM_BUILD_DIR}%{_prefix} -mkdir -p ${RPM_BUILD_DIR}%{_bin_dir} -mkdir -p ${RPM_BUILD_DIR}%{_include_dir} -mkdir -p ${RPM_BUILD_DIR}%{_lib_dir} -%ifarch amd64 x86_64 -mkdir -p ${RPM_BUILD_DIR}%{_lib64_dir} -%endif -mkdir -p ${RPM_BUILD_DIR}%{_libexec_dir} -mkdir -p ${RPM_BUILD_DIR}%{_log_dir} -mkdir -p ${RPM_BUILD_DIR}%{_conf_dir} -mkdir -p ${RPM_BUILD_DIR}%{_man_dir} -mkdir -p ${RPM_BUILD_DIR}%{_pid_dir} -mkdir -p ${RPM_BUILD_DIR}%{_sbin_dir} -mkdir -p ${RPM_BUILD_DIR}%{_share_dir} -mkdir -p ${RPM_BUILD_DIR}%{_var_dir} -mkdir -p ${RPM_BUILD_DIR}/etc/init.d - -cp ${RPM_BUILD_DIR}/%{_final_name}/src/packages/rpm/init.d/zookeeper ${RPM_BUILD_DIR}/etc/init.d/zookeeper -cp ${RPM_BUILD_DIR}/%{_final_name}/src/packages/update-zookeeper-env.sh ${RPM_BUILD_DIR}/%{_final_name}/sbin/update-zookeeper-env.sh -chmod 0755 ${RPM_BUILD_DIR}/%{_final_name}/sbin/* -chmod 0755 ${RPM_BUILD_DIR}/etc/init.d/zookeeper - -######################### -#### INSTALL SECTION #### -######################### -%install -pushd ${RPM_BUILD_DIR} -mv ${RPM_BUILD_DIR}/%{_final_name}/bin/* ${RPM_BUILD_DIR}%{_bin_dir} -mv ${RPM_BUILD_DIR}/%{_final_name}/libexec/* ${RPM_BUILD_DIR}%{_libexec_dir} -mv ${RPM_BUILD_DIR}/%{_final_name}/share/zookeeper/* ${RPM_BUILD_DIR}%{_share_dir} -mv ${RPM_BUILD_DIR}/%{_final_name}/conf/* ${RPM_BUILD_DIR}%{_conf_dir} -mv ${RPM_BUILD_DIR}/%{_final_name}/sbin/* ${RPM_BUILD_DIR}%{_sbin_dir} -cp -f ${RPM_BUILD_DIR}%{_conf_dir}/zoo_sample.cfg ${RPM_BUILD_DIR}%{_conf_dir}/zoo.cfg -popd ${RPM_BUILD_DIR} -rm -rf ${RPM_BUILD_DIR}/%{_final_name} - -%pre -getent group hadoop 2>/dev/null >/dev/null || /usr/sbin/groupadd -r hadoop - -/usr/sbin/useradd --comment "ZooKeeper" --shell /bin/bash -M -r --groups hadoop --home %{_share_dir} zookeeper 2> /dev/null || : - -%post -bash ${RPM_INSTALL_PREFIX0}/sbin/update-zookeeper-env.sh \ - --prefix=${RPM_INSTALL_PREFIX0} \ - --conf-dir=${RPM_INSTALL_PREFIX1} \ - --log-dir=${RPM_INSTALL_PREFIX2} \ - --pid-dir=${RPM_INSTALL_PREFIX3} \ - --var-dir=${RPM_INSTALL_PREFIX4} - -%preun -bash ${RPM_INSTALL_PREFIX0}/sbin/update-zookeeper-env.sh \ - --prefix=${RPM_INSTALL_PREFIX0} \ - --conf-dir=${RPM_INSTALL_PREFIX1} \ - --log-dir=${RPM_INSTALL_PREFIX2} \ - --pid-dir=${RPM_INSTALL_PREFIX3} \ - --var-dir=${RPM_INSTALL_PREFIX4} \ - --uninstall - -%files -%defattr(-,root,root) -%attr(0755,root,hadoop) %{_log_dir} -%attr(0775,root,hadoop) %{_pid_dir} -%attr(0775,root,hadoop) /etc/init.d/zookeeper -%config(noreplace) %{_conf_dir}/* -%{_prefix} - -%post lib -/sbin/ldconfig - -%files lib -%defattr(-,root,root) -%{_prefix}/lib/* -%{_prefix}/bin diff --git a/pkg/registry/zookeeper-3.4.6/src/packages/templates/conf/zookeeper-env.sh b/pkg/registry/zookeeper-3.4.6/src/packages/templates/conf/zookeeper-env.sh deleted file mode 100755 index a9efb63fb..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/packages/templates/conf/zookeeper-env.sh +++ /dev/null @@ -1,16 +0,0 @@ -# Licensed to the Apache Software Foundation (ASF) under one or more -# contributor license agreements. See the NOTICE file distributed with -# this work for additional information regarding copyright ownership. -# The ASF licenses this file to You 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. -export JAVA_HOME=${JAVA_HOME} -export ZOO_LOG_DIR=${LOG_DIR} diff --git a/pkg/registry/zookeeper-3.4.6/src/packages/update-zookeeper-env.sh b/pkg/registry/zookeeper-3.4.6/src/packages/update-zookeeper-env.sh deleted file mode 100755 index 842848741..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/packages/update-zookeeper-env.sh +++ /dev/null @@ -1,163 +0,0 @@ -#!/usr/bin/env bash - -# Licensed to the Apache Software Foundation (ASF) under one or more -# contributor license agreements. See the NOTICE file distributed with -# this work for additional information regarding copyright ownership. -# The ASF licenses this file to You 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 script configures zookeeper-env.sh and zoo.cfg. - -usage() { - echo " -usage: $0 - Required parameters: - --prefix=PREFIX path to install into - - Optional parameters: - --arch=i386 OS Architecture - --conf-dir=/etc/zookeeper Configuration directory - --log-dir=/var/log/zookeeper Log directory - --pid-dir=/var/run PID file location - " - exit 1 -} - -template_generator() { - REGEX='(\$\{[a-zA-Z_][a-zA-Z_0-9]*\})' - cat $1 | - while read line ; do - while [[ "$line" =~ $REGEX ]] ; do - LHS=${BASH_REMATCH[1]} - RHS="$(eval echo "\"$LHS\"")" - line=${line//$LHS/$RHS} - done - echo $line >> $2 - done -} - -OPTS=$(getopt \ - -n $0 \ - -o '' \ - -l 'arch:' \ - -l 'prefix:' \ - -l 'conf-dir:' \ - -l 'log-dir:' \ - -l 'pid-dir:' \ - -l 'var-dir:' \ - -l 'uninstall' \ - -- "$@") - -if [ $? != 0 ] ; then - usage -fi - -eval set -- "${OPTS}" -while true ; do - case "$1" in - --arch) - ARCH=$2 ; shift 2 - ;; - --prefix) - PREFIX=$2 ; shift 2 - ;; - --log-dir) - LOG_DIR=$2 ; shift 2 - ;; - --lib-dir) - LIB_DIR=$2 ; shift 2 - ;; - --conf-dir) - CONF_DIR=$2 ; shift 2 - ;; - --pid-dir) - PID_DIR=$2 ; shift 2 - ;; - --uninstall) - UNINSTALL=1; shift - ;; - --var-dir) - VAR_DIR=$2 ; shift 2 - ;; - --) - shift ; break - ;; - *) - echo "Unknown option: $1" - usage - exit 1 - ;; - esac -done - -for var in PREFIX; do - if [ -z "$(eval "echo \$$var")" ]; then - echo Missing param: $var - usage - fi -done - -ARCH=${ARCH:-i386} -CONF_DIR=${CONF_DIR:-$PREFIX/etc/zookeeper} -LIB_DIR=${LIB_DIR:-$PREFIX/lib} -LOG_DIR=${LOG_DIR:-$PREFIX/var/log} -PID_DIR=${PID_DIR:-$PREFIX/var/run} -VAR_DIR=${VAR_DIR:-$PREFIX/var/lib} -UNINSTALL=${UNINSTALL:-0} - -if [ "${ARCH}" != "i386" ]; then - LIB_DIR=${LIB_DIR}64 -fi - -if [ "${UNINSTALL}" -eq "1" ]; then - # Remove symlinks - if [ -e ${PREFIX}/etc/zookeeper ]; then - rm -f ${PREFIX}/etc/zookeeper - fi -else - # Create symlinks - if [ ${CONF_DIR} != ${PREFIX}/etc/zookeeper ]; then - mkdir -p ${PREFIX}/etc - ln -sf ${CONF_DIR} ${PREFIX}/etc/zookeeper - fi - - mkdir -p ${LOG_DIR} - chown zookeeper:hadoop ${LOG_DIR} - chmod 755 ${LOG_DIR} - - if [ ! -d ${PID_DIR} ]; then - mkdir -p ${PID_DIR} - chown zookeeper:hadoop ${PID_DIR} - chmod 755 ${PID_DIR} - fi - - if [ ! -d ${VAR_DIR} ]; then - mkdir -p ${VAR_DIR}/data - chown -R zookeeper:hadoop ${VAR_DIR} - chmod -R 755 ${VAR_DIR} - fi - - TFILE="/tmp/$(basename $0).$$.tmp" - if [ -z "${JAVA_HOME}" ]; then - if [ -e /etc/debian_version ]; then - JAVA_HOME=/usr/lib/jvm/java-6-sun/jre - else - JAVA_HOME=/usr/java/default - fi - fi - template_generator ${PREFIX}/share/zookeeper/templates/conf/zookeeper-env.sh $TFILE - cp ${TFILE} ${CONF_DIR}/zookeeper-env.sh - rm -f ${TFILE} - template_generator ${PREFIX}/share/zookeeper/templates/conf/zoo.cfg $TFILE - cp ${TFILE} ${CONF_DIR}/zoo.cfg - rm -f ${TFILE} -fi diff --git a/pkg/registry/zookeeper-3.4.6/src/recipes/README.txt b/pkg/registry/zookeeper-3.4.6/src/recipes/README.txt deleted file mode 100644 index 4f880cdfb..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/recipes/README.txt +++ /dev/null @@ -1,25 +0,0 @@ -1) This source directory contains various Zookeeper recipe implementations. - -2) The recipe directory name should specify the name of the recipe you are implementing - eg. lock/. - -3) It would be great if you can provide both the java and c recipes for the zookeeper recipes. -The c recipes go in to recipe-name/src/c and the java implementation goes into recipe-name/src/java. - -4) The recipes hold high standards like our zookeeper c/java libraries, so make sure that you include -some unit testing with both the c and java recipe code. - -5) Also, please name your c client public methods as -zkr_recipe-name_methodname -(eg. zkr_lock_lock in lock/src/c) - -6) The various recipes are in ../../docs/recipes.html or -../../docs/reciped.pdf. Also, this is not an exhaustive list by any chance. -Zookeeper is used (and can be used) for more than what we have listed in the docs. - -7) To run the c tests in all the recipes, -- make sure the main zookeeper c libraries in -{top}/src/c/ are compiled. Run autoreconf -if;./configure; make. The libaries -will be installed in {top}/src/c/.libs. -- run autoreconf if;./configure;make run-check - in src/recipes/$recipename/src/c - diff --git a/pkg/registry/zookeeper-3.4.6/src/recipes/build-recipes.xml b/pkg/registry/zookeeper-3.4.6/src/recipes/build-recipes.xml deleted file mode 100644 index dff659df9..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/recipes/build-recipes.xml +++ /dev/null @@ -1,177 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/pkg/registry/zookeeper-3.4.6/src/recipes/build.xml b/pkg/registry/zookeeper-3.4.6/src/recipes/build.xml deleted file mode 100644 index cd7310478..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/recipes/build.xml +++ /dev/null @@ -1,79 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/pkg/registry/zookeeper-3.4.6/src/recipes/election/README.txt b/pkg/registry/zookeeper-3.4.6/src/recipes/election/README.txt deleted file mode 100644 index 10447ed4d..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/recipes/election/README.txt +++ /dev/null @@ -1,27 +0,0 @@ - - -1) This election interface recipe implements the leader election recipe -mentioned in ../../../docs/recipes.[html,pdf]. - -2) To compile the leader election java recipe you can just run ant jar from -this directory. -Please report any bugs on the jira - -http://issues.apache.org/jira/browse/ZOOKEEPER - - diff --git a/pkg/registry/zookeeper-3.4.6/src/recipes/election/build.xml b/pkg/registry/zookeeper-3.4.6/src/recipes/election/build.xml deleted file mode 100644 index 3e1bcb854..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/recipes/election/build.xml +++ /dev/null @@ -1,128 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Tests failed! - - - - - - - - - - - - - - - - - - diff --git a/pkg/registry/zookeeper-3.4.6/src/recipes/election/src/java/org/apache/zookeeper/recipes/leader/LeaderElectionAware.java b/pkg/registry/zookeeper-3.4.6/src/recipes/election/src/java/org/apache/zookeeper/recipes/leader/LeaderElectionAware.java deleted file mode 100644 index 6c32ebc9b..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/recipes/election/src/java/org/apache/zookeeper/recipes/leader/LeaderElectionAware.java +++ /dev/null @@ -1,37 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You 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. - */ -package org.apache.zookeeper.recipes.leader; - -import org.apache.zookeeper.recipes.leader.LeaderElectionSupport.EventType; - -/** - * An interface to be implemented by clients that want to receive election - * events. - */ -public interface LeaderElectionAware { - - /** - * Called during each state transition. Current, low level events are provided - * at the beginning and end of each state. For instance, START may be followed - * by OFFER_START, OFFER_COMPLETE, DETERMINE_START, DETERMINE_COMPLETE, and so - * on. - * - * @param eventType - */ - public void onElectionEvent(EventType eventType); - -} diff --git a/pkg/registry/zookeeper-3.4.6/src/recipes/election/src/java/org/apache/zookeeper/recipes/leader/LeaderElectionSupport.java b/pkg/registry/zookeeper-3.4.6/src/recipes/election/src/java/org/apache/zookeeper/recipes/leader/LeaderElectionSupport.java deleted file mode 100644 index 8f8ae2060..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/recipes/election/src/java/org/apache/zookeeper/recipes/leader/LeaderElectionSupport.java +++ /dev/null @@ -1,461 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You 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. - */ -package org.apache.zookeeper.recipes.leader; - -import java.util.ArrayList; -import java.util.Collections; -import java.util.HashSet; -import java.util.List; -import java.util.Set; - -import org.apache.zookeeper.CreateMode; -import org.apache.zookeeper.KeeperException; -import org.apache.zookeeper.WatchedEvent; -import org.apache.zookeeper.Watcher; -import org.apache.zookeeper.ZooDefs; -import org.apache.zookeeper.ZooKeeper; -import org.apache.zookeeper.data.Stat; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -/** - *

        - * A leader election support library implementing the ZooKeeper election recipe. - *

        - *

        - * This support library is meant to simplify the construction of an exclusive - * leader system on top of Apache ZooKeeper. Any application that can become the - * leader (usually a process that provides a service, exclusively) would - * configure an instance of this class with their hostname, at least one - * listener (an implementation of {@link LeaderElectionAware}), and either an - * instance of {@link ZooKeeper} or the proper connection information. Once - * configured, invoking {@link #start()} will cause the client to connect to - * ZooKeeper and create a leader offer. The library then determines if it has - * been elected the leader using the algorithm described below. The client - * application can follow all state transitions via the listener callback. - *

        - *

        - * Leader election algorithm - *

        - *

        - * The library starts in a START state. Through each state transition, a state - * start and a state complete event are sent to all listeners. When - * {@link #start()} is called, a leader offer is created in ZooKeeper. A leader - * offer is an ephemeral sequential node that indicates a process that can act - * as a leader for this service. A read of all leader offers is then performed. - * The offer with the lowest sequence number is said to be the leader. The - * process elected leader will transition to the leader state. All other - * processes will transition to a ready state. Internally, the library creates a - * ZooKeeper watch on the leader offer with the sequence ID of N - 1 (where N is - * the process's sequence ID). If that offer disappears due to a process - * failure, the watching process will run through the election determination - * process again to see if it should become the leader. Note that sequence ID - * may not be contiguous due to failed processes. A process may revoke its offer - * to be the leader at any time by calling {@link #stop()}. - *

        - *

        - * Guarantees (not) Made and Caveats - *

        - *

        - *

          - *
        • It is possible for a (poorly implemented) process to create a leader - * offer, get the lowest sequence ID, but have something terrible occur where it - * maintains its connection to ZK (and thus its ephemeral leader offer node) but - * doesn't actually provide the service in question. It is up to the user to - * ensure any failure to become the leader - and whatever that means in the - * context of the user's application - results in a revocation of its leader - * offer (i.e. that {@link #stop()} is called).
        • - *
        • It is possible for ZK timeouts and retries to play a role in service - * liveliness. In other words, if process A has the lowest sequence ID but - * requires a few attempts to read the other leader offers' sequence IDs, - * election can seem slow. Users should apply timeouts during the determination - * process if they need to hit a specific SLA.
        • - *
        • The library makes a "best effort" to detect catastrophic failures of the - * process. It is possible that an unforeseen event results in (for instance) an - * unchecked exception that propagates passed normal error handling code. This - * normally doesn't matter as the same exception would almost certain destroy - * the entire process and thus the connection to ZK and the leader offer - * resulting in another round of leader determination.
        • - *
        - *

        - */ -public class LeaderElectionSupport implements Watcher { - - private static final Logger logger = LoggerFactory - .getLogger(LeaderElectionSupport.class); - - private ZooKeeper zooKeeper; - - private State state; - private Set listeners; - - private String rootNodeName; - private LeaderOffer leaderOffer; - private String hostName; - - public LeaderElectionSupport() { - state = State.STOP; - listeners = Collections.synchronizedSet(new HashSet()); - } - - /** - *

        - * Start the election process. This method will create a leader offer, - * determine its status, and either become the leader or become ready. If an - * instance of {@link ZooKeeper} has not yet been configured by the user, a - * new instance is created using the connectString and sessionTime specified. - *

        - *

        - * Any (anticipated) failures result in a failed event being sent to all - * listeners. - *

        - */ - public synchronized void start() { - state = State.START; - dispatchEvent(EventType.START); - - logger.info("Starting leader election support"); - - if (zooKeeper == null) { - throw new IllegalStateException( - "No instance of zookeeper provided. Hint: use setZooKeeper()"); - } - - if (hostName == null) { - throw new IllegalStateException( - "No hostname provided. Hint: use setHostName()"); - } - - try { - makeOffer(); - determineElectionStatus(); - } catch (KeeperException e) { - becomeFailed(e); - return; - } catch (InterruptedException e) { - becomeFailed(e); - return; - } - } - - /** - * Stops all election services, revokes any outstanding leader offers, and - * disconnects from ZooKeeper. - */ - public synchronized void stop() { - state = State.STOP; - dispatchEvent(EventType.STOP_START); - - logger.info("Stopping leader election support"); - - if (leaderOffer != null) { - try { - zooKeeper.delete(leaderOffer.getNodePath(), -1); - logger.info("Removed leader offer {}", leaderOffer.getNodePath()); - } catch (InterruptedException e) { - becomeFailed(e); - } catch (KeeperException e) { - becomeFailed(e); - } - } - - dispatchEvent(EventType.STOP_COMPLETE); - } - - private void makeOffer() throws KeeperException, InterruptedException { - state = State.OFFER; - dispatchEvent(EventType.OFFER_START); - - leaderOffer = new LeaderOffer(); - - leaderOffer.setHostName(hostName); - leaderOffer.setNodePath(zooKeeper.create(rootNodeName + "/" + "n_", - hostName.getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, - CreateMode.EPHEMERAL_SEQUENTIAL)); - - logger.debug("Created leader offer {}", leaderOffer); - - dispatchEvent(EventType.OFFER_COMPLETE); - } - - private void determineElectionStatus() throws KeeperException, - InterruptedException { - - state = State.DETERMINE; - dispatchEvent(EventType.DETERMINE_START); - - String[] components = leaderOffer.getNodePath().split("/"); - - leaderOffer.setId(Integer.valueOf(components[components.length - 1] - .substring("n_".length()))); - - List leaderOffers = toLeaderOffers(zooKeeper.getChildren( - rootNodeName, false)); - - /* - * For each leader offer, find out where we fit in. If we're first, we - * become the leader. If we're not elected the leader, attempt to stat the - * offer just less than us. If they exist, watch for their failure, but if - * they don't, become the leader. - */ - for (int i = 0; i < leaderOffers.size(); i++) { - LeaderOffer leaderOffer = leaderOffers.get(i); - - if (leaderOffer.getId().equals(this.leaderOffer.getId())) { - logger.debug("There are {} leader offers. I am {} in line.", - leaderOffers.size(), i); - - dispatchEvent(EventType.DETERMINE_COMPLETE); - - if (i == 0) { - becomeLeader(); - } else { - becomeReady(leaderOffers.get(i - 1)); - } - - /* Once we've figured out where we are, we're done. */ - break; - } - } - } - - private void becomeReady(LeaderOffer neighborLeaderOffer) - throws KeeperException, InterruptedException { - dispatchEvent(EventType.READY_START); - - logger.info("{} not elected leader. Watching node:{}", - leaderOffer.getNodePath(), neighborLeaderOffer.getNodePath()); - - /* - * Make sure to pass an explicit Watcher because we could be sharing this - * zooKeeper instance with someone else. - */ - Stat stat = zooKeeper.exists(neighborLeaderOffer.getNodePath(), this); - - if (stat != null) { - logger.debug( - "We're behind {} in line and they're alive. Keeping an eye on them.", - neighborLeaderOffer.getNodePath()); - state = State.READY; - dispatchEvent(EventType.READY_COMPLETE); - } else { - /* - * If the stat fails, the node has gone missing between the call to - * getChildren() and exists(). We need to try and become the leader. - */ - logger - .info( - "We were behind {} but it looks like they died. Back to determination.", - neighborLeaderOffer.getNodePath()); - determineElectionStatus(); - } - - } - - private void becomeLeader() { - state = State.ELECTED; - dispatchEvent(EventType.ELECTED_START); - - logger.info("Becoming leader with node:{}", leaderOffer.getNodePath()); - - dispatchEvent(EventType.ELECTED_COMPLETE); - } - - private void becomeFailed(Exception e) { - logger.error("Failed in state {} - Exception:{}", state, e); - - state = State.FAILED; - dispatchEvent(EventType.FAILED); - } - - /** - * Fetch the (user supplied) hostname of the current leader. Note that by the - * time this method returns, state could have changed so do not depend on this - * to be strongly consistent. This method has to read all leader offers from - * ZooKeeper to deterime who the leader is (i.e. there is no caching) so - * consider the performance implications of frequent invocation. If there are - * no leader offers this method returns null. - * - * @return hostname of the current leader - * @throws KeeperException - * @throws InterruptedException - */ - public String getLeaderHostName() throws KeeperException, - InterruptedException { - - List leaderOffers = toLeaderOffers(zooKeeper.getChildren( - rootNodeName, false)); - - if (leaderOffers.size() > 0) { - return leaderOffers.get(0).getHostName(); - } - - return null; - } - - private List toLeaderOffers(List strings) - throws KeeperException, InterruptedException { - - List leaderOffers = new ArrayList(strings.size()); - - /* - * Turn each child of rootNodeName into a leader offer. This is a tuple of - * the sequence number and the node name. - */ - for (String offer : strings) { - String hostName = new String(zooKeeper.getData( - rootNodeName + "/" + offer, false, null)); - - leaderOffers.add(new LeaderOffer(Integer.valueOf(offer.substring("n_" - .length())), rootNodeName + "/" + offer, hostName)); - } - - /* - * We sort leader offers by sequence number (which may not be zero-based or - * contiguous) and keep their paths handy for setting watches. - */ - Collections.sort(leaderOffers, new LeaderOffer.IdComparator()); - - return leaderOffers; - } - - @Override - public void process(WatchedEvent event) { - if (event.getType().equals(Watcher.Event.EventType.NodeDeleted)) { - if (!event.getPath().equals(leaderOffer.getNodePath()) - && state != State.STOP) { - logger.debug( - "Node {} deleted. Need to run through the election process.", - event.getPath()); - try { - determineElectionStatus(); - } catch (KeeperException e) { - becomeFailed(e); - } catch (InterruptedException e) { - becomeFailed(e); - } - } - } - } - - private void dispatchEvent(EventType eventType) { - logger.debug("Dispatching event:{}", eventType); - - synchronized (listeners) { - if (listeners.size() > 0) { - for (LeaderElectionAware observer : listeners) { - observer.onElectionEvent(eventType); - } - } - } - } - - /** - * Adds {@code listener} to the list of listeners who will receive events. - * - * @param listener - */ - public void addListener(LeaderElectionAware listener) { - listeners.add(listener); - } - - /** - * Remove {@code listener} from the list of listeners who receive events. - * - * @param listener - */ - public void removeListener(LeaderElectionAware listener) { - listeners.remove(listener); - } - - @Override - public String toString() { - return "{ state:" + state + " leaderOffer:" + leaderOffer + " zooKeeper:" - + zooKeeper + " hostName:" + hostName + " listeners:" + listeners - + " }"; - } - - /** - *

        - * Gets the ZooKeeper root node to use for this service. - *

        - *

        - * For instance, a root node of {@code /mycompany/myservice} would be the - * parent of all leader offers for this service. Obviously all processes that - * wish to contend for leader status need to use the same root node. Note: We - * assume this node already exists. - *

        - * - * @return a znode path - */ - public String getRootNodeName() { - return rootNodeName; - } - - /** - *

        - * Sets the ZooKeeper root node to use for this service. - *

        - *

        - * For instance, a root node of {@code /mycompany/myservice} would be the - * parent of all leader offers for this service. Obviously all processes that - * wish to contend for leader status need to use the same root node. Note: We - * assume this node already exists. - *

        - */ - public void setRootNodeName(String rootNodeName) { - this.rootNodeName = rootNodeName; - } - - /** - * The {@link ZooKeeper} instance to use for all operations. Provided this - * overrides any connectString or sessionTimeout set. - */ - public ZooKeeper getZooKeeper() { - return zooKeeper; - } - - public void setZooKeeper(ZooKeeper zooKeeper) { - this.zooKeeper = zooKeeper; - } - - /** - * The hostname of this process. Mostly used as a convenience for logging and - * to respond to {@link #getLeaderHostName()} requests. - */ - public String getHostName() { - return hostName; - } - - public void setHostName(String hostName) { - this.hostName = hostName; - } - - /** - * The type of event. - */ - public static enum EventType { - START, OFFER_START, OFFER_COMPLETE, DETERMINE_START, DETERMINE_COMPLETE, ELECTED_START, ELECTED_COMPLETE, READY_START, READY_COMPLETE, FAILED, STOP_START, STOP_COMPLETE, - } - - /** - * The internal state of the election support service. - */ - public static enum State { - START, OFFER, DETERMINE, ELECTED, READY, FAILED, STOP - } -} diff --git a/pkg/registry/zookeeper-3.4.6/src/recipes/election/src/java/org/apache/zookeeper/recipes/leader/LeaderOffer.java b/pkg/registry/zookeeper-3.4.6/src/recipes/election/src/java/org/apache/zookeeper/recipes/leader/LeaderOffer.java deleted file mode 100644 index 188a6d575..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/recipes/election/src/java/org/apache/zookeeper/recipes/leader/LeaderOffer.java +++ /dev/null @@ -1,84 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You 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. - */ -package org.apache.zookeeper.recipes.leader; - -import java.util.Comparator; - -/** - * A leader offer is a numeric id / path pair. The id is the sequential node id - * assigned by ZooKeeper where as the path is the absolute path to the ZNode. - */ -public class LeaderOffer { - - private Integer id; - private String nodePath; - private String hostName; - - public LeaderOffer() { - // Default constructor - } - - public LeaderOffer(Integer id, String nodePath, String hostName) { - this.id = id; - this.nodePath = nodePath; - this.hostName = hostName; - } - - @Override - public String toString() { - return "{ id:" + id + " nodePath:" + nodePath + " hostName:" + hostName - + " }"; - } - - public Integer getId() { - return id; - } - - public void setId(Integer id) { - this.id = id; - } - - public String getNodePath() { - return nodePath; - } - - public void setNodePath(String nodePath) { - this.nodePath = nodePath; - } - - public String getHostName() { - return hostName; - } - - public void setHostName(String hostName) { - this.hostName = hostName; - } - - /** - * Compare two instances of {@link LeaderOffer} using only the {code}id{code} - * member. - */ - public static class IdComparator implements Comparator { - - @Override - public int compare(LeaderOffer o1, LeaderOffer o2) { - return o1.getId().compareTo(o2.getId()); - } - - } - -} diff --git a/pkg/registry/zookeeper-3.4.6/src/recipes/lock/README.txt b/pkg/registry/zookeeper-3.4.6/src/recipes/lock/README.txt deleted file mode 100644 index 1fc4fbfc5..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/recipes/lock/README.txt +++ /dev/null @@ -1,28 +0,0 @@ - - -1) This lock interface recipe implements the lock recipe -mentioned in ../../../docs/recipes.[html,pdf]. - -2) To compile the lock java recipe you can just run ant jar from -this directory. For compiling the c libarary go to src/c and read -the INSTALLATION instructions. -Please report any bugs on the jira - -http://issues.apache.org/jira/browse/ZOOKEEPER - - diff --git a/pkg/registry/zookeeper-3.4.6/src/recipes/lock/build.xml b/pkg/registry/zookeeper-3.4.6/src/recipes/lock/build.xml deleted file mode 100644 index 841cc0181..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/recipes/lock/build.xml +++ /dev/null @@ -1,128 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Tests failed! - - - - - - - - - - - - - - - - - - diff --git a/pkg/registry/zookeeper-3.4.6/src/recipes/lock/src/c/INSTALL b/pkg/registry/zookeeper-3.4.6/src/recipes/lock/src/c/INSTALL deleted file mode 100644 index 5458714e1..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/recipes/lock/src/c/INSTALL +++ /dev/null @@ -1,234 +0,0 @@ -Installation Instructions -************************* - -Copyright (C) 1994, 1995, 1996, 1999, 2000, 2001, 2002, 2004, 2005, -2006 Free Software Foundation, Inc. - -This file is free documentation; the Free Software Foundation gives -unlimited permission to copy, distribute and modify it. - -Basic Installation -================== - -Briefly, the shell commands `./configure; make; make install' should -configure, build, and install this package. The following -more-detailed instructions are generic; see the `README' file for -instructions specific to this package. - - The `configure' shell script attempts to guess correct values for -various system-dependent variables used during compilation. It uses -those values to create a `Makefile' in each directory of the package. -It may also create one or more `.h' files containing system-dependent -definitions. Finally, it creates a shell script `config.status' that -you can run in the future to recreate the current configuration, and a -file `config.log' containing compiler output (useful mainly for -debugging `configure'). - - It can also use an optional file (typically called `config.cache' -and enabled with `--cache-file=config.cache' or simply `-C') that saves -the results of its tests to speed up reconfiguring. Caching is -disabled by default to prevent problems with accidental use of stale -cache files. - - If you need to do unusual things to compile the package, please try -to figure out how `configure' could check whether to do them, and mail -diffs or instructions to the address given in the `README' so they can -be considered for the next release. If you are using the cache, and at -some point `config.cache' contains results you don't want to keep, you -may remove or edit it. - - The file `configure.ac' (or `configure.in') is used to create -`configure' by a program called `autoconf'. You need `configure.ac' if -you want to change it or regenerate `configure' using a newer version -of `autoconf'. - -The simplest way to compile this package is: - - 1. `cd' to the directory containing the package's source code and type - `./configure' to configure the package for your system. - - Running `configure' might take a while. While running, it prints - some messages telling which features it is checking for. - - 2. Type `make' to compile the package. - - 3. Optionally, type `make check' to run any self-tests that come with - the package. - - 4. Type `make install' to install the programs and any data files and - documentation. - - 5. You can remove the program binaries and object files from the - source code directory by typing `make clean'. To also remove the - files that `configure' created (so you can compile the package for - a different kind of computer), type `make distclean'. There is - also a `make maintainer-clean' target, but that is intended mainly - for the package's developers. If you use it, you may have to get - all sorts of other programs in order to regenerate files that came - with the distribution. - -Compilers and Options -===================== - -Some systems require unusual options for compilation or linking that the -`configure' script does not know about. Run `./configure --help' for -details on some of the pertinent environment variables. - - You can give `configure' initial values for configuration parameters -by setting variables in the command line or in the environment. Here -is an example: - - ./configure CC=c99 CFLAGS=-g LIBS=-lposix - - *Note Defining Variables::, for more details. - -Compiling For Multiple Architectures -==================================== - -You can compile the package for more than one kind of computer at the -same time, by placing the object files for each architecture in their -own directory. To do this, you can use GNU `make'. `cd' to the -directory where you want the object files and executables to go and run -the `configure' script. `configure' automatically checks for the -source code in the directory that `configure' is in and in `..'. - - With a non-GNU `make', it is safer to compile the package for one -architecture at a time in the source code directory. After you have -installed the package for one architecture, use `make distclean' before -reconfiguring for another architecture. - -Installation Names -================== - -By default, `make install' installs the package's commands under -`/usr/local/bin', include files under `/usr/local/include', etc. You -can specify an installation prefix other than `/usr/local' by giving -`configure' the option `--prefix=PREFIX'. - - You can specify separate installation prefixes for -architecture-specific files and architecture-independent files. If you -pass the option `--exec-prefix=PREFIX' to `configure', the package uses -PREFIX as the prefix for installing programs and libraries. -Documentation and other data files still use the regular prefix. - - In addition, if you use an unusual directory layout you can give -options like `--bindir=DIR' to specify different values for particular -kinds of files. Run `configure --help' for a list of the directories -you can set and what kinds of files go in them. - - If the package supports it, you can cause programs to be installed -with an extra prefix or suffix on their names by giving `configure' the -option `--program-prefix=PREFIX' or `--program-suffix=SUFFIX'. - -Optional Features -================= - -Some packages pay attention to `--enable-FEATURE' options to -`configure', where FEATURE indicates an optional part of the package. -They may also pay attention to `--with-PACKAGE' options, where PACKAGE -is something like `gnu-as' or `x' (for the X Window System). The -`README' should mention any `--enable-' and `--with-' options that the -package recognizes. - - For packages that use the X Window System, `configure' can usually -find the X include and library files automatically, but if it doesn't, -you can use the `configure' options `--x-includes=DIR' and -`--x-libraries=DIR' to specify their locations. - -Specifying the System Type -========================== - -There may be some features `configure' cannot figure out automatically, -but needs to determine by the type of machine the package will run on. -Usually, assuming the package is built to be run on the _same_ -architectures, `configure' can figure that out, but if it prints a -message saying it cannot guess the machine type, give it the -`--build=TYPE' option. TYPE can either be a short name for the system -type, such as `sun4', or a canonical name which has the form: - - CPU-COMPANY-SYSTEM - -where SYSTEM can have one of these forms: - - OS KERNEL-OS - - See the file `config.sub' for the possible values of each field. If -`config.sub' isn't included in this package, then this package doesn't -need to know the machine type. - - If you are _building_ compiler tools for cross-compiling, you should -use the option `--target=TYPE' to select the type of system they will -produce code for. - - If you want to _use_ a cross compiler, that generates code for a -platform different from the build platform, you should specify the -"host" platform (i.e., that on which the generated programs will -eventually be run) with `--host=TYPE'. - -Sharing Defaults -================ - -If you want to set default values for `configure' scripts to share, you -can create a site shell script called `config.site' that gives default -values for variables like `CC', `cache_file', and `prefix'. -`configure' looks for `PREFIX/share/config.site' if it exists, then -`PREFIX/etc/config.site' if it exists. Or, you can set the -`CONFIG_SITE' environment variable to the location of the site script. -A warning: not all `configure' scripts look for a site script. - -Defining Variables -================== - -Variables not defined in a site shell script can be set in the -environment passed to `configure'. However, some packages may run -configure again during the build, and the customized values of these -variables may be lost. In order to avoid this problem, you should set -them in the `configure' command line, using `VAR=value'. For example: - - ./configure CC=/usr/local2/bin/gcc - -causes the specified `gcc' to be used as the C compiler (unless it is -overridden in the site shell script). - -Unfortunately, this technique does not work for `CONFIG_SHELL' due to -an Autoconf bug. Until the bug is fixed you can use this workaround: - - CONFIG_SHELL=/bin/bash /bin/bash ./configure CONFIG_SHELL=/bin/bash - -`configure' Invocation -====================== - -`configure' recognizes the following options to control how it operates. - -`--help' -`-h' - Print a summary of the options to `configure', and exit. - -`--version' -`-V' - Print the version of Autoconf used to generate the `configure' - script, and exit. - -`--cache-file=FILE' - Enable the cache: use and save the results of the tests in FILE, - traditionally `config.cache'. FILE defaults to `/dev/null' to - disable caching. - -`--config-cache' -`-C' - Alias for `--cache-file=config.cache'. - -`--quiet' -`--silent' -`-q' - Do not print messages saying which checks are being made. To - suppress all normal output, redirect it to `/dev/null' (any error - messages will still be shown). - -`--srcdir=DIR' - Look for the package's source code in directory DIR. Usually - `configure' can determine that directory automatically. - -`configure' also accepts some other, not widely useful, options. Run -`configure --help' for more details. - diff --git a/pkg/registry/zookeeper-3.4.6/src/recipes/lock/src/c/LICENSE b/pkg/registry/zookeeper-3.4.6/src/recipes/lock/src/c/LICENSE deleted file mode 100644 index d64569567..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/recipes/lock/src/c/LICENSE +++ /dev/null @@ -1,202 +0,0 @@ - - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "[]" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright [yyyy] [name of copyright owner] - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. diff --git a/pkg/registry/zookeeper-3.4.6/src/recipes/lock/src/c/Makefile.am b/pkg/registry/zookeeper-3.4.6/src/recipes/lock/src/c/Makefile.am deleted file mode 100644 index 9b36b43e1..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/recipes/lock/src/c/Makefile.am +++ /dev/null @@ -1,46 +0,0 @@ -# Licensed to the Apache Software Foundation (ASF) under one -# or more contributor license agreements. See the NOTICE file -# distributed with this work for additional information -# regarding copyright ownership. The ASF licenses this file -# to you 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. - -include $(top_srcdir)/aminclude.am - -AM_CFLAGS = -Wall -fPIC -I${ZOOKEEPER_PATH}/include -I${ZOOKEEPER_PATH}/generated \ - -I$(top_srcdir)/include -I/usr/include -AM_CPPFLAGS = -Wall -I${ZOOKEEPER_PATH}/include -I${ZOOKEEPER_PATH}/generated\ - -I${top_srcdir}/include -I/usr/include -EXTRA_DIST = LICENSE -lib_LTLIBRARIES = libzoolock.la -libzoolock_la_SOURCES = src/zoo_lock.c include/zoo_lock.h -libzoolock_la_CPPFLAGS = -DDLOPEN_MODULE -libzoolock_la_LDFLAGS = -version-info 0:1:0 - -#run the tests now - -TEST_SOURCES = tests/TestDriver.cc tests/TestClient.cc tests/Util.cc - - -check_PROGRAMS = zklocktest -nodist_zklocktest_SOURCES = ${TEST_SOURCES} -zklocktest_LDADD = ${ZOOKEEPER_LD} libzoolock.la -lpthread ${CPPUNIT_LIBS} -zklocktest_CXXFLAGS = -DUSE_STATIC_LIB ${CPPUNIT_CFLAGS} - -run-check: check - ./zklocktest ${TEST_OPTIONS} - -clean-local: clean-check - ${RM} ${DX_CLEANFILES} - -clean-check: - ${RM} ${nodist_zklocktest_OBJECTS} diff --git a/pkg/registry/zookeeper-3.4.6/src/recipes/lock/src/c/README.txt b/pkg/registry/zookeeper-3.4.6/src/recipes/lock/src/c/README.txt deleted file mode 100644 index 326bba85d..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/recipes/lock/src/c/README.txt +++ /dev/null @@ -1,28 +0,0 @@ - Zookeeper C lock client library - - -INSTALLATION - -If you're building the client from a source checkout you need to -follow the steps outlined below. If you're building from a release -tar downloaded from Apache please skip to step 2. - -1) make sure that you compile the main zookeeper c client library. - -2) change directory to src/recipes/lock/src/c - and do a "autoreconf -if" to bootstrap - autoconf, automake and libtool. Please make sure you have autoconf - version 2.59 or greater installed. -3) do a "./configure [OPTIONS]" to generate the makefile. See INSTALL - for general information about running configure. - -4) do a "make" or "make install" to build the libraries and install them. - Alternatively, you can also build and run a unit test suite (and - you probably should). Please make sure you have cppunit-1.10.x or - higher installed before you execute step 4. Once ./configure has - finished, do a "make run-check". It will build the libraries, build - the tests and run them. -5) to generate doxygen documentation do a "make doxygen-doc". All - documentations will be placed to a new subfolder named docs. By - default only HTML documentation is generated. For information on - other document formats please use "./configure --help" diff --git a/pkg/registry/zookeeper-3.4.6/src/recipes/lock/src/c/acinclude.m4 b/pkg/registry/zookeeper-3.4.6/src/recipes/lock/src/c/acinclude.m4 deleted file mode 100644 index d0041d8c2..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/recipes/lock/src/c/acinclude.m4 +++ /dev/null @@ -1,312 +0,0 @@ -# This file is part of Autoconf. -*- Autoconf -*- - -# Copyright (C) 2004 Oren Ben-Kiki -# This file is distributed under the same terms as the Autoconf macro files. - -# Generate automatic documentation using Doxygen. Works in concert with the -# aminclude.m4 file and a compatible doxygen configuration file. Defines the -# following public macros: -# -# DX_???_FEATURE(ON|OFF) - control the default setting fo a Doxygen feature. -# Supported features are 'DOXYGEN' itself, 'DOT' for generating graphics, -# 'HTML' for plain HTML, 'CHM' for compressed HTML help (for MS users), 'CHI' -# for generating a seperate .chi file by the .chm file, and 'MAN', 'RTF', -# 'XML', 'PDF' and 'PS' for the appropriate output formats. The environment -# variable DOXYGEN_PAPER_SIZE may be specified to override the default 'a4wide' -# paper size. -# -# By default, HTML, PDF and PS documentation is generated as this seems to be -# the most popular and portable combination. MAN pages created by Doxygen are -# usually problematic, though by picking an appropriate subset and doing some -# massaging they might be better than nothing. CHM and RTF are specific for MS -# (note that you can't generate both HTML and CHM at the same time). The XML is -# rather useless unless you apply specialized post-processing to it. -# -# The macro mainly controls the default state of the feature. The use can -# override the default by specifying --enable or --disable. The macros ensure -# that contradictory flags are not given (e.g., --enable-doxygen-html and -# --enable-doxygen-chm, --enable-doxygen-anything with --disable-doxygen, etc.) -# Finally, each feature will be automatically disabled (with a warning) if the -# required programs are missing. -# -# Once all the feature defaults have been specified, call DX_INIT_DOXYGEN with -# the following parameters: a one-word name for the project for use as a -# filename base etc., an optional configuration file name (the default is -# 'Doxyfile', the same as Doxygen's default), and an optional output directory -# name (the default is 'doxygen-doc'). - -## ----------## -## Defaults. ## -## ----------## - -DX_ENV="" -AC_DEFUN([DX_FEATURE_doc], ON) -AC_DEFUN([DX_FEATURE_dot], ON) -AC_DEFUN([DX_FEATURE_man], OFF) -AC_DEFUN([DX_FEATURE_html], ON) -AC_DEFUN([DX_FEATURE_chm], OFF) -AC_DEFUN([DX_FEATURE_chi], OFF) -AC_DEFUN([DX_FEATURE_rtf], OFF) -AC_DEFUN([DX_FEATURE_xml], OFF) -AC_DEFUN([DX_FEATURE_pdf], ON) -AC_DEFUN([DX_FEATURE_ps], ON) - -## --------------- ## -## Private macros. ## -## --------------- ## - -# DX_ENV_APPEND(VARIABLE, VALUE) -# ------------------------------ -# Append VARIABLE="VALUE" to DX_ENV for invoking doxygen. -AC_DEFUN([DX_ENV_APPEND], [AC_SUBST([DX_ENV], ["$DX_ENV $1='$2'"])]) - -# DX_DIRNAME_EXPR -# --------------- -# Expand into a shell expression prints the directory part of a path. -AC_DEFUN([DX_DIRNAME_EXPR], - [[expr ".$1" : '\(\.\)[^/]*$' \| "x$1" : 'x\(.*\)/[^/]*$']]) - -# DX_IF_FEATURE(FEATURE, IF-ON, IF-OFF) -# ------------------------------------- -# Expands according to the M4 (static) status of the feature. -AC_DEFUN([DX_IF_FEATURE], [ifelse(DX_FEATURE_$1, ON, [$2], [$3])]) - -# DX_REQUIRE_PROG(VARIABLE, PROGRAM) -# ---------------------------------- -# Require the specified program to be found for the DX_CURRENT_FEATURE to work. -AC_DEFUN([DX_REQUIRE_PROG], [ -AC_PATH_TOOL([$1], [$2]) -if test "$DX_FLAG_$[DX_CURRENT_FEATURE$$1]" = 1; then - AC_MSG_WARN([$2 not found - will not DX_CURRENT_DESCRIPTION]) - AC_SUBST([DX_FLAG_]DX_CURRENT_FEATURE, 0) -fi -]) - -# DX_TEST_FEATURE(FEATURE) -# ------------------------ -# Expand to a shell expression testing whether the feature is active. -AC_DEFUN([DX_TEST_FEATURE], [test "$DX_FLAG_$1" = 1]) - -# DX_CHECK_DEPEND(REQUIRED_FEATURE, REQUIRED_STATE) -# ------------------------------------------------- -# Verify that a required features has the right state before trying to turn on -# the DX_CURRENT_FEATURE. -AC_DEFUN([DX_CHECK_DEPEND], [ -test "$DX_FLAG_$1" = "$2" \ -|| AC_MSG_ERROR([doxygen-DX_CURRENT_FEATURE ifelse([$2], 1, - requires, contradicts) doxygen-DX_CURRENT_FEATURE]) -]) - -# DX_CLEAR_DEPEND(FEATURE, REQUIRED_FEATURE, REQUIRED_STATE) -# ---------------------------------------------------------- -# Turn off the DX_CURRENT_FEATURE if the required feature is off. -AC_DEFUN([DX_CLEAR_DEPEND], [ -test "$DX_FLAG_$1" = "$2" || AC_SUBST([DX_FLAG_]DX_CURRENT_FEATURE, 0) -]) - -# DX_FEATURE_ARG(FEATURE, DESCRIPTION, -# CHECK_DEPEND, CLEAR_DEPEND, -# REQUIRE, DO-IF-ON, DO-IF-OFF) -# -------------------------------------------- -# Parse the command-line option controlling a feature. CHECK_DEPEND is called -# if the user explicitly turns the feature on (and invokes DX_CHECK_DEPEND), -# otherwise CLEAR_DEPEND is called to turn off the default state if a required -# feature is disabled (using DX_CLEAR_DEPEND). REQUIRE performs additional -# requirement tests (DX_REQUIRE_PROG). Finally, an automake flag is set and -# DO-IF-ON or DO-IF-OFF are called according to the final state of the feature. -AC_DEFUN([DX_ARG_ABLE], [ - AC_DEFUN([DX_CURRENT_FEATURE], [$1]) - AC_DEFUN([DX_CURRENT_DESCRIPTION], [$2]) - AC_ARG_ENABLE(doxygen-$1, - [AS_HELP_STRING(DX_IF_FEATURE([$1], [--disable-doxygen-$1], - [--enable-doxygen-$1]), - DX_IF_FEATURE([$1], [don't $2], [$2]))], - [ -case "$enableval" in -#( -y|Y|yes|Yes|YES) - AC_SUBST([DX_FLAG_$1], 1) - $3 -;; #( -n|N|no|No|NO) - AC_SUBST([DX_FLAG_$1], 0) -;; #( -*) - AC_MSG_ERROR([invalid value '$enableval' given to doxygen-$1]) -;; -esac -], [ -AC_SUBST([DX_FLAG_$1], [DX_IF_FEATURE([$1], 1, 0)]) -$4 -]) -if DX_TEST_FEATURE([$1]); then - $5 - : -fi -if DX_TEST_FEATURE([$1]); then - AM_CONDITIONAL(DX_COND_$1, :) - $6 - : -else - AM_CONDITIONAL(DX_COND_$1, false) - $7 - : -fi -]) - -## -------------- ## -## Public macros. ## -## -------------- ## - -# DX_XXX_FEATURE(DEFAULT_STATE) -# ----------------------------- -AC_DEFUN([DX_DOXYGEN_FEATURE], [AC_DEFUN([DX_FEATURE_doc], [$1])]) -AC_DEFUN([DX_MAN_FEATURE], [AC_DEFUN([DX_FEATURE_man], [$1])]) -AC_DEFUN([DX_HTML_FEATURE], [AC_DEFUN([DX_FEATURE_html], [$1])]) -AC_DEFUN([DX_CHM_FEATURE], [AC_DEFUN([DX_FEATURE_chm], [$1])]) -AC_DEFUN([DX_CHI_FEATURE], [AC_DEFUN([DX_FEATURE_chi], [$1])]) -AC_DEFUN([DX_RTF_FEATURE], [AC_DEFUN([DX_FEATURE_rtf], [$1])]) -AC_DEFUN([DX_XML_FEATURE], [AC_DEFUN([DX_FEATURE_xml], [$1])]) -AC_DEFUN([DX_XML_FEATURE], [AC_DEFUN([DX_FEATURE_xml], [$1])]) -AC_DEFUN([DX_PDF_FEATURE], [AC_DEFUN([DX_FEATURE_pdf], [$1])]) -AC_DEFUN([DX_PS_FEATURE], [AC_DEFUN([DX_FEATURE_ps], [$1])]) - -# DX_INIT_DOXYGEN(PROJECT, [CONFIG-FILE], [OUTPUT-DOC-DIR]) -# --------------------------------------------------------- -# PROJECT also serves as the base name for the documentation files. -# The default CONFIG-FILE is "Doxyfile" and OUTPUT-DOC-DIR is "doxygen-doc". -AC_DEFUN([DX_INIT_DOXYGEN], [ - -# Files: -AC_SUBST([DX_PROJECT], [$1]) -AC_SUBST([DX_CONFIG], [ifelse([$2], [], Doxyfile, [$2])]) -AC_SUBST([DX_DOCDIR], [ifelse([$3], [], doxygen-doc, [$3])]) - -# Environment variables used inside doxygen.cfg: -DX_ENV_APPEND(SRCDIR, $srcdir) -DX_ENV_APPEND(PROJECT, $DX_PROJECT) -DX_ENV_APPEND(DOCDIR, $DX_DOCDIR) -DX_ENV_APPEND(VERSION, $PACKAGE_VERSION) - -# Doxygen itself: -DX_ARG_ABLE(doc, [generate any doxygen documentation], - [], - [], - [DX_REQUIRE_PROG([DX_DOXYGEN], doxygen) - DX_REQUIRE_PROG([DX_PERL], perl)], - [DX_ENV_APPEND(PERL_PATH, $DX_PERL)]) - -# Dot for graphics: -DX_ARG_ABLE(dot, [generate graphics for doxygen documentation], - [DX_CHECK_DEPEND(doc, 1)], - [DX_CLEAR_DEPEND(doc, 1)], - [DX_REQUIRE_PROG([DX_DOT], dot)], - [DX_ENV_APPEND(HAVE_DOT, YES) - DX_ENV_APPEND(DOT_PATH, [`DX_DIRNAME_EXPR($DX_DOT)`])], - [DX_ENV_APPEND(HAVE_DOT, NO)]) - -# Man pages generation: -DX_ARG_ABLE(man, [generate doxygen manual pages], - [DX_CHECK_DEPEND(doc, 1)], - [DX_CLEAR_DEPEND(doc, 1)], - [], - [DX_ENV_APPEND(GENERATE_MAN, YES)], - [DX_ENV_APPEND(GENERATE_MAN, NO)]) - -# RTF file generation: -DX_ARG_ABLE(rtf, [generate doxygen RTF documentation], - [DX_CHECK_DEPEND(doc, 1)], - [DX_CLEAR_DEPEND(doc, 1)], - [], - [DX_ENV_APPEND(GENERATE_RTF, YES)], - [DX_ENV_APPEND(GENERATE_RTF, NO)]) - -# XML file generation: -DX_ARG_ABLE(xml, [generate doxygen XML documentation], - [DX_CHECK_DEPEND(doc, 1)], - [DX_CLEAR_DEPEND(doc, 1)], - [], - [DX_ENV_APPEND(GENERATE_XML, YES)], - [DX_ENV_APPEND(GENERATE_XML, NO)]) - -# (Compressed) HTML help generation: -DX_ARG_ABLE(chm, [generate doxygen compressed HTML help documentation], - [DX_CHECK_DEPEND(doc, 1)], - [DX_CLEAR_DEPEND(doc, 1)], - [DX_REQUIRE_PROG([DX_HHC], hhc)], - [DX_ENV_APPEND(HHC_PATH, $DX_HHC) - DX_ENV_APPEND(GENERATE_HTML, YES) - DX_ENV_APPEND(GENERATE_HTMLHELP, YES)], - [DX_ENV_APPEND(GENERATE_HTMLHELP, NO)]) - -# Seperate CHI file generation. -DX_ARG_ABLE(chi, [generate doxygen seperate compressed HTML help index file], - [DX_CHECK_DEPEND(chm, 1)], - [DX_CLEAR_DEPEND(chm, 1)], - [], - [DX_ENV_APPEND(GENERATE_CHI, YES)], - [DX_ENV_APPEND(GENERATE_CHI, NO)]) - -# Plain HTML pages generation: -DX_ARG_ABLE(html, [generate doxygen plain HTML documentation], - [DX_CHECK_DEPEND(doc, 1) DX_CHECK_DEPEND(chm, 0)], - [DX_CLEAR_DEPEND(doc, 1) DX_CLEAR_DEPEND(chm, 0)], - [], - [DX_ENV_APPEND(GENERATE_HTML, YES)], - [DX_TEST_FEATURE(chm) || DX_ENV_APPEND(GENERATE_HTML, NO)]) - -# PostScript file generation: -DX_ARG_ABLE(ps, [generate doxygen PostScript documentation], - [DX_CHECK_DEPEND(doc, 1)], - [DX_CLEAR_DEPEND(doc, 1)], - [DX_REQUIRE_PROG([DX_LATEX], latex) - DX_REQUIRE_PROG([DX_MAKEINDEX], makeindex) - DX_REQUIRE_PROG([DX_DVIPS], dvips) - DX_REQUIRE_PROG([DX_EGREP], egrep)]) - -# PDF file generation: -DX_ARG_ABLE(pdf, [generate doxygen PDF documentation], - [DX_CHECK_DEPEND(doc, 1)], - [DX_CLEAR_DEPEND(doc, 1)], - [DX_REQUIRE_PROG([DX_PDFLATEX], pdflatex) - DX_REQUIRE_PROG([DX_MAKEINDEX], makeindex) - DX_REQUIRE_PROG([DX_EGREP], egrep)]) - -# LaTeX generation for PS and/or PDF: -if DX_TEST_FEATURE(ps) || DX_TEST_FEATURE(pdf); then - AM_CONDITIONAL(DX_COND_latex, :) - DX_ENV_APPEND(GENERATE_LATEX, YES) -else - AM_CONDITIONAL(DX_COND_latex, false) - DX_ENV_APPEND(GENERATE_LATEX, NO) -fi - -# Paper size for PS and/or PDF: -AC_ARG_VAR(DOXYGEN_PAPER_SIZE, - [a4wide (default), a4, letter, legal or executive]) -case "$DOXYGEN_PAPER_SIZE" in -#( -"") - AC_SUBST(DOXYGEN_PAPER_SIZE, "") -;; #( -a4wide|a4|letter|legal|executive) - DX_ENV_APPEND(PAPER_SIZE, $DOXYGEN_PAPER_SIZE) -;; #( -*) - AC_MSG_ERROR([unknown DOXYGEN_PAPER_SIZE='$DOXYGEN_PAPER_SIZE']) -;; -esac - -#For debugging: -#echo DX_FLAG_doc=$DX_FLAG_doc -#echo DX_FLAG_dot=$DX_FLAG_dot -#echo DX_FLAG_man=$DX_FLAG_man -#echo DX_FLAG_html=$DX_FLAG_html -#echo DX_FLAG_chm=$DX_FLAG_chm -#echo DX_FLAG_chi=$DX_FLAG_chi -#echo DX_FLAG_rtf=$DX_FLAG_rtf -#echo DX_FLAG_xml=$DX_FLAG_xml -#echo DX_FLAG_pdf=$DX_FLAG_pdf -#echo DX_FLAG_ps=$DX_FLAG_ps -#echo DX_ENV=$DX_ENV -]) diff --git a/pkg/registry/zookeeper-3.4.6/src/recipes/lock/src/c/aminclude.am b/pkg/registry/zookeeper-3.4.6/src/recipes/lock/src/c/aminclude.am deleted file mode 100644 index 420049eca..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/recipes/lock/src/c/aminclude.am +++ /dev/null @@ -1,186 +0,0 @@ -# Copyright (C) 2004 Oren Ben-Kiki -# This file is distributed under the same terms as the Automake macro files. - -# Generate automatic documentation using Doxygen. Goals and variables values -# are controlled by the various DX_COND_??? conditionals set by autoconf. -# -# The provided goals are: -# doxygen-doc: Generate all doxygen documentation. -# doxygen-run: Run doxygen, which will generate some of the documentation -# (HTML, CHM, CHI, MAN, RTF, XML) but will not do the post -# processing required for the rest of it (PS, PDF, and some MAN). -# doxygen-man: Rename some doxygen generated man pages. -# doxygen-ps: Generate doxygen PostScript documentation. -# doxygen-pdf: Generate doxygen PDF documentation. -# -# Note that by default these are not integrated into the automake goals. If -# doxygen is used to generate man pages, you can achieve this integration by -# setting man3_MANS to the list of man pages generated and then adding the -# dependency: -# -# $(man3_MANS): doxygen-doc -# -# This will cause make to run doxygen and generate all the documentation. -# -# The following variable is intended for use in Makefile.am: -# -# DX_CLEANFILES = everything to clean. -# -# This is usually added to MOSTLYCLEANFILES. - -## --------------------------------- ## -## Format-independent Doxygen rules. ## -## --------------------------------- ## - -if DX_COND_doc - -## ------------------------------- ## -## Rules specific for HTML output. ## -## ------------------------------- ## - -if DX_COND_html - -DX_CLEAN_HTML = @DX_DOCDIR@/html - -endif DX_COND_html - -## ------------------------------ ## -## Rules specific for CHM output. ## -## ------------------------------ ## - -if DX_COND_chm - -DX_CLEAN_CHM = @DX_DOCDIR@/chm - -if DX_COND_chi - -DX_CLEAN_CHI = @DX_DOCDIR@/@PACKAGE@.chi - -endif DX_COND_chi - -endif DX_COND_chm - -## ------------------------------ ## -## Rules specific for MAN output. ## -## ------------------------------ ## - -if DX_COND_man - -DX_CLEAN_MAN = @DX_DOCDIR@/man - -endif DX_COND_man - -## ------------------------------ ## -## Rules specific for RTF output. ## -## ------------------------------ ## - -if DX_COND_rtf - -DX_CLEAN_RTF = @DX_DOCDIR@/rtf - -endif DX_COND_rtf - -## ------------------------------ ## -## Rules specific for XML output. ## -## ------------------------------ ## - -if DX_COND_xml - -DX_CLEAN_XML = @DX_DOCDIR@/xml - -endif DX_COND_xml - -## ----------------------------- ## -## Rules specific for PS output. ## -## ----------------------------- ## - -if DX_COND_ps - -DX_CLEAN_PS = @DX_DOCDIR@/@PACKAGE@.ps - -DX_PS_GOAL = doxygen-ps - -doxygen-ps: @DX_DOCDIR@/@PACKAGE@.ps - -@DX_DOCDIR@/@PACKAGE@.ps: @DX_DOCDIR@/@PACKAGE@.tag - cd @DX_DOCDIR@/latex; \ - rm -f *.aux *.toc *.idx *.ind *.ilg *.log *.out; \ - $(DX_LATEX) refman.tex; \ - $(MAKEINDEX_PATH) refman.idx; \ - $(DX_LATEX) refman.tex; \ - countdown=5; \ - while $(DX_EGREP) 'Rerun (LaTeX|to get cross-references right)' \ - refman.log > /dev/null 2>&1 \ - && test $$countdown -gt 0; do \ - $(DX_LATEX) refman.tex; \ - countdown=`expr $$countdown - 1`; \ - done; \ - $(DX_DVIPS) -o ../@PACKAGE@.ps refman.dvi - -endif DX_COND_ps - -## ------------------------------ ## -## Rules specific for PDF output. ## -## ------------------------------ ## - -if DX_COND_pdf - -DX_CLEAN_PDF = @DX_DOCDIR@/@PACKAGE@.pdf - -DX_PDF_GOAL = doxygen-pdf - -doxygen-pdf: @DX_DOCDIR@/@PACKAGE@.pdf - -@DX_DOCDIR@/@PACKAGE@.pdf: @DX_DOCDIR@/@PACKAGE@.tag - cd @DX_DOCDIR@/latex; \ - rm -f *.aux *.toc *.idx *.ind *.ilg *.log *.out; \ - $(DX_PDFLATEX) refman.tex; \ - $(DX_MAKEINDEX) refman.idx; \ - $(DX_PDFLATEX) refman.tex; \ - countdown=5; \ - while $(DX_EGREP) 'Rerun (LaTeX|to get cross-references right)' \ - refman.log > /dev/null 2>&1 \ - && test $$countdown -gt 0; do \ - $(DX_PDFLATEX) refman.tex; \ - countdown=`expr $$countdown - 1`; \ - done; \ - mv refman.pdf ../@PACKAGE@.pdf - -endif DX_COND_pdf - -## ------------------------------------------------- ## -## Rules specific for LaTeX (shared for PS and PDF). ## -## ------------------------------------------------- ## - -if DX_COND_latex - -DX_CLEAN_LATEX = @DX_DOCDIR@/latex - -endif DX_COND_latex - -.PHONY: doxygen-run doxygen-doc $(DX_PS_GOAL) $(DX_PDF_GOAL) - -.INTERMEDIATE: doxygen-run $(DX_PS_GOAL) $(DX_PDF_GOAL) - -doxygen-run: @DX_DOCDIR@/@PACKAGE@.tag - -doxygen-doc: doxygen-run $(DX_PS_GOAL) $(DX_PDF_GOAL) - -@DX_DOCDIR@/@PACKAGE@.tag: $(DX_CONFIG) $(pkginclude_HEADERS) - rm -rf @DX_DOCDIR@ - $(DX_ENV) $(DX_DOXYGEN) $(srcdir)/$(DX_CONFIG) - -DX_CLEANFILES = \ - @DX_DOCDIR@/@PACKAGE@.tag \ - -r \ - $(DX_CLEAN_HTML) \ - $(DX_CLEAN_CHM) \ - $(DX_CLEAN_CHI) \ - $(DX_CLEAN_MAN) \ - $(DX_CLEAN_RTF) \ - $(DX_CLEAN_XML) \ - $(DX_CLEAN_PS) \ - $(DX_CLEAN_PDF) \ - $(DX_CLEAN_LATEX) - -endif DX_COND_doc diff --git a/pkg/registry/zookeeper-3.4.6/src/recipes/lock/src/c/c-doc.Doxyfile b/pkg/registry/zookeeper-3.4.6/src/recipes/lock/src/c/c-doc.Doxyfile deleted file mode 100644 index c56e86dc5..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/recipes/lock/src/c/c-doc.Doxyfile +++ /dev/null @@ -1,1252 +0,0 @@ -# Doxyfile 1.4.7 - -# 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 (" ") - -#--------------------------------------------------------------------------- -# Project related 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 = $(PROJECT)-$(VERSION) - -# 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 = $(DOCDIR) - -# If the CREATE_SUBDIRS tag is set to YES, then doxygen will create -# 4096 sub-directories (in 2 levels) under the output directory of each output -# format and will distribute the generated files over these directories. -# Enabling this option can be useful when feeding doxygen a huge amount of -# source files, where putting all generated files in the same directory would -# otherwise cause performance problems for the file system. - -CREATE_SUBDIRS = NO - -# 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, Korean-en, Norwegian, -# Polish, Portuguese, Romanian, Russian, Serbian, Slovak, Slovene, Spanish, -# Swedish, and Ukrainian. - -OUTPUT_LANGUAGE = English - -# This tag can be used to specify the encoding used in the generated output. -# The encoding is not always determined by the language that is chosen, -# but also whether or not the output is meant for Windows or non-Windows users. -# In case there is a difference, setting the USE_WINDOWS_ENCODING tag to YES -# forces the Windows encoding (this is the default for the Windows binary), -# whereas setting the tag to NO uses a Unix-style encoding (the default for -# all platforms other than Windows). - -USE_WINDOWS_ENCODING = 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 - -# This tag implements a quasi-intelligent brief description abbreviator -# that is used to form the text in various listings. Each string -# in this list, if found as the leading text of the brief description, will be -# stripped from the text and the result after processing the whole list, is -# used as the annotated text. Otherwise, the brief description is used as-is. -# If left blank, the following values are used ("$name" is automatically -# replaced with the name of the entity): "The $name class" "The $name widget" -# "The $name file" "is" "provides" "specifies" "contains" -# "represents" "a" "an" "the" - -ABBREVIATE_BRIEF = - -# 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 = YES - -# 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. The tag can be used to show relative paths in the file list. -# If left blank the directory from which doxygen is run is used as the -# path to strip. - -STRIP_FROM_PATH = - -# The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of -# the path mentioned in the documentation of a class, which tells -# the reader which header file to include in order to use a class. -# If left blank only the name of the header file containing the class -# definition is used. Otherwise one should specify the include paths that -# are normally passed to the compiler using the -I flag. - -STRIP_FROM_INC_PATH = - -# 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 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 -# explicit @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 -# re-implements. - -INHERIT_DOCS = YES - -# If the SEPARATE_MEMBER_PAGES tag is set to YES, then doxygen will produce -# a new page for each member. If set to NO, the documentation of a member will -# be part of the file/class/namespace that contains it. - -SEPARATE_MEMBER_PAGES = 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 - -# 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 = - -# 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 - -# If you use STL classes (i.e. std::string, std::vector, etc.) but do not want to -# include (a tag file for) the STL sources as input, then you should -# set this tag to YES in order to let doxygen match functions declarations and -# definitions whose arguments contain STL classes (e.g. func(std::string); v.s. -# func(std::string) {}). This also make the inheritance and collaboration -# diagrams that involve STL classes more complete and accurate. - -BUILTIN_STL_SUPPORT = NO - -# 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 - -# Set the SUBGROUPING tag to YES (the default) to allow class member groups of -# the same type (for instance a group of public functions) to be put as a -# subgroup of that type (e.g. under the Public Functions section). Set it to -# NO to prevent subgrouping. Alternatively, this can be done per class using -# the \nosubgrouping command. - -SUBGROUPING = YES - -#--------------------------------------------------------------------------- -# Build related configuration options -#--------------------------------------------------------------------------- - -# 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 = NO - -# 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 = YES - -# 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 = YES - -# This flag is only useful for Objective-C code. When set to YES local -# methods, which are defined in the implementation section but not in -# the interface are included in the documentation. -# If set to NO (the default) only methods in the interface are included. - -EXTRACT_LOCAL_METHODS = 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 classes 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 HIDE_IN_BODY_DOCS tag is set to YES, Doxygen will hide any -# documentation blocks found inside the body of a function. -# If set to NO (the default) these blocks will be appended to the -# function's detailed documentation block. - -HIDE_IN_BODY_DOCS = NO - -# 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 - -# 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 -# and Mac users are advised to set this option to NO. - -CASE_SENSE_NAMES = YES - -# 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 SHOW_INCLUDE_FILES tag is set to YES (the default) then Doxygen -# will put a list of the files that are included by a file in the documentation -# of that file. - -SHOW_INCLUDE_FILES = NO - -# 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 the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the -# brief documentation of file, namespace and class members alphabetically -# by member name. If set to NO (the default) the members will appear in -# declaration order. - -SORT_BRIEF_DOCS = NO - -# If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be -# sorted by fully-qualified names, including namespaces. If set to -# NO (the default), the class list will be sorted only by class name, -# not including the namespace part. -# Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES. -# Note: This option applies only to the class list, not to the -# alphabetical list. - -SORT_BY_SCOPE_NAME = NO - -# 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 - -# 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 consists 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 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 = YES - -# If the sources in your project are distributed over multiple directories -# then setting the SHOW_DIRECTORIES tag to YES will show the directory hierarchy -# in the documentation. The default is NO. - -SHOW_DIRECTORIES = NO - -# The FILE_VERSION_FILTER tag can be used to specify a program or script that -# doxygen should invoke to get the current version for each file (typically from the -# version control system). Doxygen will invoke the program by executing (via -# popen()) the command , where is the value of -# the FILE_VERSION_FILTER tag, and is the name of an input file -# provided by doxygen. Whatever the program writes to standard output -# is used as the file version. See the manual for examples. - -FILE_VERSION_FILTER = - -#--------------------------------------------------------------------------- -# 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 - -# If WARN_IF_DOC_ERROR is set to YES, doxygen will generate warnings for -# potential errors in the documentation, such as not documenting some -# parameters in a documented function, or documenting parameters that -# don't exist or using markup commands wrongly. - -WARN_IF_DOC_ERROR = YES - -# This WARN_NO_PARAMDOC option can be abled to get warnings for -# functions that are documented, but have no documentation for their parameters -# or return value. If set to NO (the default) doxygen will only warn about -# wrong or incomplete parameter documentation, but not about the absence of -# documentation. - -WARN_NO_PARAMDOC = NO - -# 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. Optionally the format may contain -# $version, which will be replaced by the version of the file (if it could -# be obtained via FILE_VERSION_FILTER) - -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 = include/zoo_lock.h - -# 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 *.cs *.php *.php3 *.inc *.m *.mm *.py - -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. Note that the wildcards are matched -# against the file with absolute path, so to exclude all test directories -# for example use the pattern */test/* - -EXCLUDE_PATTERNS = - -# The EXAMPLE_PATH tag can be used to specify one or more files or -# directories that contain example code fragments that are included (see -# the \include command). - -EXAMPLE_PATH = - -# If the value of the EXAMPLE_PATH tag contains directories, you can use the -# EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp -# and *.h) to filter out the source-files in the directories. If left -# blank all files are included. - -EXAMPLE_PATTERNS = - -# If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be -# searched for input files to be used with the \include or \dontinclude -# commands irrespective of the value of the RECURSIVE tag. -# Possible values are YES and NO. If left blank NO is used. - -EXAMPLE_RECURSIVE = NO - -# The IMAGE_PATH tag can be used to specify one or more files or -# directories that contain image that are included in the documentation (see -# the \image command). - -IMAGE_PATH = - -# The INPUT_FILTER tag can be used to specify a program that doxygen should -# invoke to filter for each input file. Doxygen will invoke the filter program -# by executing (via popen()) the command , where -# is the value of the INPUT_FILTER tag, and is the name of an -# input file. Doxygen will then use the output that the filter program writes -# to standard output. If FILTER_PATTERNS is specified, this tag will be -# ignored. - -INPUT_FILTER = - -# The FILTER_PATTERNS tag can be used to specify filters on a per file pattern -# basis. Doxygen will compare the file name with each pattern and apply the -# filter if there is a match. The filters are a list of the form: -# pattern=filter (like *.cpp=my_cpp_filter). See INPUT_FILTER for further -# info on how filters are used. If FILTER_PATTERNS is empty, INPUT_FILTER -# is applied to all files. - -FILTER_PATTERNS = - -# 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. -# Note: To get rid of all source code in the generated output, make sure also -# VERBATIM_HEADERS is set to NO. - -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 - -# 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 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 = YES - -# 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 = YES - -# If the REFERENCES_LINK_SOURCE tag is set to YES (the default) -# and SOURCE_BROWSER tag is set to YES, then the hyperlinks from -# functions in REFERENCES_RELATION and REFERENCED_BY_RELATION lists will -# link to the source code. Otherwise they will link to the documentstion. - -REFERENCES_LINK_SOURCE = YES - -# If the USE_HTAGS tag is set to YES then the references to source code -# will point to the HTML generated by the htags(1) tool instead of doxygen -# built-in source browser. The htags tool is part of GNU's global source -# tagging system (see http://www.gnu.org/software/global/global.html). You -# will need version 4.8.6 or higher. - -USE_HTAGS = 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 - -#--------------------------------------------------------------------------- -# 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 = NO - -# 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 = $(GENERATE_HTML) - -# 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 = html - -# 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. Note that doxygen will try to copy -# the style sheet file to the HTML output directory, so don't put your own -# stylesheet in the HTML output directory as well, or it will be erased! - -HTML_STYLESHEET = - -# 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 = $(GENERATE_HTMLHELP) - -# 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 directory. - -CHM_FILE = ../$(PROJECT).chm - -# 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 = $(HHC_PATH) - -# 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 = $(GENERATE_CHI) - -# 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 = NO - -# 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, DHTML, CSS and frames is required (for instance Mozilla 1.0+, -# Netscape 6.0+, Internet explorer 5.0+, or Konqueror). 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 = $(GENERATE_LATEX) - -# 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 = $(PAPER_SIZE) - -# 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 = $(GENERATE_PDF) - -# 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 - -# If LATEX_HIDE_INDICES is set to YES then doxygen will not -# include the index chapters (such as File Index, Compound Index, etc.) -# in the output. - -LATEX_HIDE_INDICES = 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 optimized for Word 97 and may not look very pretty with -# other RTF readers or editors. - -GENERATE_RTF = $(GENERATE_RTF) - -# 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 assignments. 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 = $(GENERATE_MAN) - -# 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. - -GENERATE_XML = $(GENERATE_XML) - -# The XML_OUTPUT tag is used to specify where the XML 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 `xml' will be used as the default path. - -XML_OUTPUT = xml - -# 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 = - -# If the XML_PROGRAMLISTING tag is set to YES Doxygen will -# dump the program listings (including syntax highlighting -# and cross-referencing information) to the XML output. Note that -# enabling this will significantly increase the size of the XML output. - -XML_PROGRAMLISTING = YES - -#--------------------------------------------------------------------------- -# 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 Perl module output -#--------------------------------------------------------------------------- - -# If the GENERATE_PERLMOD tag is set to YES Doxygen will -# generate a Perl module file that captures the structure of -# the code including all documentation. Note that this -# feature is still experimental and incomplete at the -# moment. - -GENERATE_PERLMOD = NO - -# If the PERLMOD_LATEX tag is set to YES Doxygen will generate -# the necessary Makefile rules, Perl scripts and LaTeX code to be able -# to generate PDF and DVI output from the Perl module output. - -PERLMOD_LATEX = NO - -# If the PERLMOD_PRETTY tag is set to YES the Perl module output will be -# nicely formatted so it can be parsed by a human reader. This is useful -# if you want to understand what is going on. On the other hand, if this -# tag is set to NO the size of the Perl module output will be much smaller -# and Perl will parse it just the same. - -PERLMOD_PRETTY = YES - -# The names of the make variables in the generated doxyrules.make file -# are prefixed with the string contained in PERLMOD_MAKEVAR_PREFIX. -# This is useful so different doxyrules.make files included by the same -# Makefile don't overwrite each other's variables. - -PERLMOD_MAKEVAR_PREFIX = - -#--------------------------------------------------------------------------- -# 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 = YES - -# 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_DEFINED 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. To prevent a macro definition from being -# undefined via #undef or recursively expanded use the := operator -# instead of the = operator. - -PREDEFINED = - -# If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF 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::additions related to external references -#--------------------------------------------------------------------------- - -# The TAGFILES option can be used to specify one or more tagfiles. -# Optionally an initial location of the external documentation -# can be added for each tagfile. The format of a tag file without -# this location is as follows: -# TAGFILES = file1 file2 ... -# Adding location for the tag files is done as follows: -# TAGFILES = file1=loc1 "file2 = loc2" ... -# where "loc1" and "loc2" can be relative or absolute paths or -# URLs. If a location is present for each tag, the installdox tool -# does not have to be run to correct the links. -# Note that each tag file must have a unique name -# (where the name does NOT include the path) -# If a tag file is not located in the directory in which doxygen -# is run, you must also specify the path to the tagfile here. - -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 = $(DOCDIR)/$(PROJECT).tag - -# 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 superseded by the HAVE_DOT option below. This is only a -# fallback. It is recommended to install and use dot, since it yields 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 = $(HAVE_DOT) - -# 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 the GROUP_GRAPHS and HAVE_DOT tags are set to YES then doxygen -# will generate a graph for groups, showing the direct groups dependencies - -GROUP_GRAPHS = YES - -# If the UML_LOOK tag is set to YES doxygen will generate inheritance and -# collaboration diagrams in a style similar to the OMG's Unified Modeling -# Language. - -UML_LOOK = NO - -# If set to YES, the inheritance and collaboration graphs will show the -# relations between templates and their instances. - -TEMPLATE_RELATIONS = NO - -# 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 CALL_GRAPH and HAVE_DOT tags are set to YES then doxygen will -# generate a call dependency graph for every global function or class method. -# Note that enabling this option will significantly increase the time of a run. -# So in most cases it will be better to enable call graphs for selected -# functions only using the \callgraph command. - -CALL_GRAPH = NO - -# If the CALLER_GRAPH and HAVE_DOT tags are set to YES then doxygen will -# generate a caller dependency graph for every global function or class method. -# Note that enabling this option will significantly increase the time of a run. -# So in most cases it will be better to enable caller graphs for selected -# functions only using the \callergraph command. - -CALLER_GRAPH = NO - -# 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 - -# If the DIRECTORY_GRAPH, SHOW_DIRECTORIES and HAVE_DOT tags are set to YES -# then doxygen will show the dependencies a directory has on other directories -# in a graphical way. The dependency relations are determined by the #include -# relations between the files in the directories. - -DIRECTORY_GRAPH = 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 in the path. - -DOT_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 - -# The MAX_DOT_GRAPH_DEPTH tag can be used to set the maximum depth of the -# graphs generated by dot. A depth value of 3 means that only nodes reachable -# from the root by following a path via at most 3 edges will be shown. Nodes -# that lay further from the root node will be omitted. Note that setting this -# option to 1 or 2 may greatly reduce the computation time needed for large -# code bases. Also note that a graph may be further truncated if the graph's -# image dimensions are not sufficient to fit the graph (see MAX_DOT_GRAPH_WIDTH -# and MAX_DOT_GRAPH_HEIGHT). If 0 is used for the depth value (the default), -# the graph is not depth-constrained. - -MAX_DOT_GRAPH_DEPTH = 0 - -# Set the DOT_TRANSPARENT tag to YES to generate images with a transparent -# background. This is disabled by default, which results in a white background. -# Warning: Depending on the platform used, enabling this option may lead to -# badly anti-aliased labels on the edges of a graph (i.e. they become hard to -# read). - -DOT_TRANSPARENT = NO - -# Set the DOT_MULTI_TARGETS tag to YES allow dot to generate multiple output -# files in one run (i.e. multiple -o and -T options on the command line). This -# makes dot run faster, but since only newer versions of dot (>1.8.10) -# support this, this feature is disabled by default. - -DOT_MULTI_TARGETS = NO - -# 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 intermediate dot files that are used to generate -# the various graphs. - -DOT_CLEANUP = YES - -#--------------------------------------------------------------------------- -# Configuration::additions 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 diff --git a/pkg/registry/zookeeper-3.4.6/src/recipes/lock/src/c/configure.ac b/pkg/registry/zookeeper-3.4.6/src/recipes/lock/src/c/configure.ac deleted file mode 100644 index 3954123ee..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/recipes/lock/src/c/configure.ac +++ /dev/null @@ -1,82 +0,0 @@ -# Licensed to the Apache Software Foundation (ASF) under one -# or more contributor license agreements. See the NOTICE file -# distributed with this work for additional information -# regarding copyright ownership. The ASF licenses this file -# to you 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. -# -*- Autoconf -*- -# Process this file with autoconf to produce a configure script. - -AC_PREREQ(2.59) - -AC_INIT([zoolock], [3.2.0]) - -AC_CONFIG_SRCDIR([include/zoo_lock.h]) - -PACKAGE=zoolock -VERSION=1.0 - -AC_SUBST(PACKAGE) -AC_SUBST(VERSION) - -BUILD_PATH="`pwd`" - -# Checks for programs. -AC_LANG_CPLUSPLUS - -AM_INIT_AUTOMAKE([-Wall foreign]) -# Checks for libraries. - -#initialize Doxygen support -DX_HTML_FEATURE(ON) -DX_CHM_FEATURE(OFF) -DX_CHI_FEATURE(OFF) -DX_MAN_FEATURE(OFF) -DX_RTF_FEATURE(OFF) -DX_XML_FEATURE(OFF) -DX_PDF_FEATURE(OFF) -DX_PS_FEATURE(OFF) -DX_INIT_DOXYGEN([zookeeper-locks],[c-doc.Doxyfile],[docs]) - - -ZOOKEEPER_PATH=${BUILD_PATH}/../../../../../src/c -ZOOKEEPER_LD=-L${BUILD_PATH}/../../../../../src/c\ -lzookeeper_mt - -AC_SUBST(ZOOKEEPER_PATH) -AC_SUBST(ZOOKEEPER_LD) - -# Checks for header files. -AC_HEADER_DIRENT -AC_HEADER_STDC -AC_CHECK_HEADERS([fcntl.h stdlib.h string.h sys/time.h unistd.h]) - -# Checks for typedefs, structures, and compiler characteristics. -AC_HEADER_STDBOOL -AC_C_CONST -AC_TYPE_UID_T -AC_C_INLINE -AC_TYPE_OFF_T -AC_TYPE_SIZE_T -AC_STRUCT_ST_BLOCKS -AC_HEADER_TIME -AC_C_VOLATILE -AC_PROG_CC -AC_PROG_LIBTOOL -#check for cppunit -AM_PATH_CPPUNIT(1.10.2) -# Checks for library functions. -AC_FUNC_UTIME_NULL -AC_CHECK_FUNCS([gettimeofday memset mkdir rmdir strdup strerror strstr strtol strtoul strtoull utime]) - -AC_CONFIG_FILES([Makefile]) -AC_OUTPUT -AC_C_VOLATILE diff --git a/pkg/registry/zookeeper-3.4.6/src/recipes/lock/src/c/include/zoo_lock.h b/pkg/registry/zookeeper-3.4.6/src/recipes/lock/src/c/include/zoo_lock.h deleted file mode 100644 index 5c06bbf2f..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/recipes/lock/src/c/include/zoo_lock.h +++ /dev/null @@ -1,168 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you 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. - */ -#ifndef ZOOKEEPER_LOCK_H_ -#define ZOOKEEPER_LOCK_H_ - -#include -#include - -#ifdef __cplusplus -extern "C" { -#endif -/** - * \brief the call back function called on status change of lock - * - * the call back funtion is called with a rc of 0 if lock is acquired and - * with an rc of 1 if the lock is released - * \param rc the value to let us know if its locked or unlocked - * \param cbdata the callback data that we passed when initializing - * the zookeeper lock. - */ - -typedef void (* zkr_lock_completion) (int rc, void* cbdata); - -/** - * \file zoo_lock.h - * \brief zookeeper recipe for locking and leader election. - * this api implements a writelock on a given path in zookeeper. - * this api can also be used for leader election. - */ - -struct zkr_lock_mutex { - zhandle_t *zh; - char *path; - struct ACL_vector *acl; - char *id; - void *cbdata; - zkr_lock_completion completion; - pthread_mutex_t pmutex; - int isOwner; - char* ownerid; -}; - -typedef struct zkr_lock_mutex zkr_lock_mutex_t; - - -/** - * \brief initializing a zookeeper lock. - * - * this method instantiates the zookeeper mutex lock. - * \param mutex the mutex to initialize - * \param zh the zookeeper handle to use - * \param path the path in zookeeper to use for locking - * \param acl the acls to use in zookeeper. - * \return return 0 if successful. - */ -ZOOAPI int zkr_lock_init(zkr_lock_mutex_t *mutex, zhandle_t* zh, - char* path, struct ACL_vector *acl); - -/** - * \brief initializing a zookeeper lock. - * - * - * this method instantiates the zookeeper mutex lock with - * a completion function. - * - * \param mutex the mutex to initialize - * \param zh the zookeeper handle to use - * \param path the path in zookeeper to use for locking - * \param acl the acls to use in zookeeper. - * \param completion the callback thats called when lock - * is acquired and released. - * \param cbdata the callback method is called with data - * \return return 0 if successful. - */ -ZOOAPI int zkr_lock_init_cb(zkr_lock_mutex_t *mutex, zhandle_t* zh, - char* path, struct ACL_vector *acl, - zkr_lock_completion completion, void* cbdata); - -/** - * \brief lock the zookeeper mutex - * - * this method tries locking the mutex - * \param mutex the zookeeper mutex - * \return return 0 if there is no error. check - * with zkr_lock_isowner() if you have the lock - */ -ZOOAPI int zkr_lock_lock(zkr_lock_mutex_t *mutex); - -/** - * \brief unlock the zookeeper mutex - * - * this method unlocks the zookeeper mutex - * \param mutex the zookeeper mutex - * \return return 0 if there is not error in executing unlock. - * else returns non zero - */ -ZOOAPI int zkr_lock_unlock(zkr_lock_mutex_t *mutex); - -/** - * \brief set the callback function for zookeeper mutex - * - * this method sets the callback for zookeeper mutex - * \param mutex the zookeeper mutex - * \param callback the call back completion function - */ -ZOOAPI void zkr_lock_setcallback(zkr_lock_mutex_t *mutex, - zkr_lock_completion completion); - -/** - * \brief get the callback function for zookeeper mutex - * - * this method gets the callback funtion for zookeeper mutex - * \param mutex the zookeeper mutex - * \return the lock completion function - */ -ZOOAPI zkr_lock_completion zkr_lock_getcallback(zkr_lock_mutex_t *mutex); - -/** - * \brief destroy the mutex - * this method free the mutex - * \param mutex destroy the zookepeer lock. - * \return return 0 if destroyed. - */ -ZOOAPI int zkr_lock_destroy(zkr_lock_mutex_t* mutex); - -/** - * \brief return the parent path this mutex is using - * this method returns the parent path - * \param mutex the mutex - * \return return the parent path - */ -ZOOAPI char* zkr_lock_getpath(zkr_lock_mutex_t *mutex); - -/** - * \brief return if this mutex is owner of the lock - * this method returns if its owner or not - * \param mutex the mutex - * \return return true if is owner and false if not - */ -ZOOAPI int zkr_lock_isowner(zkr_lock_mutex_t *mutex); - -/** - * \brief return the id for this mutex - * this mutex retunrns the id string - * \param mutex the mutex - * \return the id for this mutex - */ -ZOOAPI char* zkr_lock_getid(zkr_lock_mutex_t *mutex); - -#ifdef __cplusplus -} -#endif -#endif //ZOOKEEPER_LOCK_H_ diff --git a/pkg/registry/zookeeper-3.4.6/src/recipes/lock/src/c/src/zoo_lock.c b/pkg/registry/zookeeper-3.4.6/src/recipes/lock/src/c/src/zoo_lock.c deleted file mode 100644 index 8a6d81763..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/recipes/lock/src/c/src/zoo_lock.c +++ /dev/null @@ -1,396 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you 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. - */ - -#ifdef DLL_EXPORT -#define USE_STATIC_LIB -#endif - -#if defined(__CYGWIN__) -#define USE_IPV6 -#endif - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#ifdef HAVE_SYS_UTSNAME_H -#include -#endif - -#ifdef HAVE_GETPWUID_R -#include -#endif - -#define IF_DEBUG(x) if (logLevel==ZOO_LOG_LEVEL_DEBUG) {x;} - - -ZOOAPI int zkr_lock_init(zkr_lock_mutex_t* mutex, zhandle_t* zh, - char* path, struct ACL_vector *acl) { - mutex->zh = zh; - mutex->path = path; - mutex->acl = acl; - mutex->completion = NULL; - mutex->cbdata = NULL; - mutex->id = NULL; - mutex->ownerid = NULL; - mutex->isOwner = 0; - pthread_mutex_init(&(mutex->pmutex), NULL); - return 0; -} - -ZOOAPI int zkr_lock_init_cb(zkr_lock_mutex_t *mutex, zhandle_t* zh, - char *path, struct ACL_vector *acl, - zkr_lock_completion completion, void* cbdata) { - mutex->zh = zh; - mutex->path = path; - mutex->acl = acl; - mutex->completion = completion; - mutex->cbdata = cbdata; - mutex->isOwner = 0; - mutex->ownerid = NULL; - mutex->id = NULL; - pthread_mutex_init(&(mutex->pmutex), NULL); - return 0; -} - -/** - * unlock the mutex - */ -ZOOAPI int zkr_lock_unlock(zkr_lock_mutex_t *mutex) { - pthread_mutex_lock(&(mutex->pmutex)); - zhandle_t *zh = mutex->zh; - if (mutex->id != NULL) { - int len = strlen(mutex->path) + strlen(mutex->id) + 2; - char buf[len]; - sprintf(buf, "%s/%s", mutex->path, mutex->id); - int ret = 0; - int count = 0; - struct timespec ts; - ts.tv_sec = 0; - ts.tv_nsec = (.5)*1000000; - ret = ZCONNECTIONLOSS; - while (ret == ZCONNECTIONLOSS && (count < 3)) { - ret = zoo_delete(zh, buf, -1); - if (ret == ZCONNECTIONLOSS) { - LOG_DEBUG(("connectionloss while deleting the node")); - nanosleep(&ts, 0); - count++; - } - } - if (ret == ZOK || ret == ZNONODE) { - zkr_lock_completion completion = mutex->completion; - if (completion != NULL) { - completion(1, mutex->cbdata); - } - - free(mutex->id); - mutex->id = NULL; - pthread_mutex_unlock(&(mutex->pmutex)); - return 0; - } - LOG_WARN(("not able to connect to server - giving up")); - pthread_mutex_unlock(&(mutex->pmutex)); - return ZCONNECTIONLOSS; - } - pthread_mutex_unlock(&(mutex->pmutex)); - return ZSYSTEMERROR; -} - -static void free_String_vector(struct String_vector *v) { - if (v->data) { - int32_t i; - for (i=0; icount; i++) { - free(v->data[i]); - } - free(v->data); - v->data = 0; - } -} - -static int vstrcmp(const void* str1, const void* str2) { - const char **a = (const char**)str1; - const char **b = (const char**) str2; - return strcmp(strrchr(*a, '-')+1, strrchr(*b, '-')+1); -} - -static void sort_children(struct String_vector *vector) { - qsort( vector->data, vector->count, sizeof(char*), &vstrcmp); -} - -static char* child_floor(char **sorted_data, int len, char *element) { - char* ret = NULL; - int i =0; - for (i=0; i < len; i++) { - if (strcmp(sorted_data[i], element) < 0) { - ret = sorted_data[i]; - } - } - return ret; -} - -static void lock_watcher_fn(zhandle_t* zh, int type, int state, - const char* path, void *watcherCtx) { - //callback that we registered - //should be called - zkr_lock_lock((zkr_lock_mutex_t*) watcherCtx); -} - -/** - * get the last name of the path - */ -static char* getName(char* str) { - char* name = strrchr(str, '/'); - if (name == NULL) - return NULL; - return strdup(name + 1); -} - -/** - * just a method to retry get children - */ -static int retry_getchildren(zhandle_t *zh, char* path, struct String_vector *vector, - struct timespec *ts, int retry) { - int ret = ZCONNECTIONLOSS; - int count = 0; - while (ret == ZCONNECTIONLOSS && count < retry) { - ret = zoo_get_children(zh, path, 0, vector); - if (ret == ZCONNECTIONLOSS) { - LOG_DEBUG(("connection loss to the server")); - nanosleep(ts, 0); - count++; - } - } - return ret; -} - -/** see if our node already exists - * if it does then we dup the name and - * return it - */ -static char* lookupnode(struct String_vector *vector, char *prefix) { - char *ret = NULL; - if (vector->data) { - int i = 0; - for (i = 0; i < vector->count; i++) { - char* child = vector->data[i]; - if (strncmp(prefix, child, strlen(prefix)) == 0) { - ret = strdup(child); - break; - } - } - } - return ret; -} - -/** retry zoo_wexists - */ -static int retry_zoowexists(zhandle_t *zh, char* path, watcher_fn watcher, void* ctx, - struct Stat *stat, struct timespec *ts, int retry) { - int ret = ZCONNECTIONLOSS; - int count = 0; - while (ret == ZCONNECTIONLOSS && count < retry) { - ret = zoo_wexists(zh, path, watcher, ctx, stat); - if (ret == ZCONNECTIONLOSS) { - LOG_DEBUG(("connectionloss while setting watch on my predecessor")); - nanosleep(ts, 0); - count++; - } - } - return ret; -} - -/** - * the main code that does the zookeeper leader - * election. this code creates its own ephemeral - * node on the given path and sees if its the first - * one on the list and claims to be a leader if and only - * if its the first one of children in the paretn path - */ -static int zkr_lock_operation(zkr_lock_mutex_t *mutex, struct timespec *ts) { - zhandle_t *zh = mutex->zh; - char *path = mutex->path; - char *id = mutex->id; - struct Stat stat; - char* owner_id = NULL; - int retry = 3; - do { - const clientid_t *cid = zoo_client_id(zh); - // get the session id - int64_t session = cid->client_id; - char prefix[30]; - int ret = 0; -#if defined(__x86_64__) - snprintf(prefix, 30, "x-%016lx-", session); -#else - snprintf(prefix, 30, "x-%016llx-", session); -#endif - struct String_vector vectorst; - vectorst.data = NULL; - vectorst.count = 0; - ret = ZCONNECTIONLOSS; - ret = retry_getchildren(zh, path, &vectorst, ts, retry); - if (ret != ZOK) - return ret; - struct String_vector *vector = &vectorst; - mutex->id = lookupnode(vector, prefix); - free_String_vector(vector); - if (mutex->id == NULL) { - int len = strlen(path) + strlen(prefix) + 2; - char buf[len]; - char retbuf[len+20]; - snprintf(buf, len, "%s/%s", path, prefix); - ret = ZCONNECTIONLOSS; - ret = zoo_create(zh, buf, NULL, 0, mutex->acl, - ZOO_EPHEMERAL|ZOO_SEQUENCE, retbuf, (len+20)); - - // do not want to retry the create since - // we would end up creating more than one child - if (ret != ZOK) { - LOG_WARN(("could not create zoo node %s", buf)); - return ret; - } - mutex->id = getName(retbuf); - } - - if (mutex->id != NULL) { - ret = ZCONNECTIONLOSS; - ret = retry_getchildren(zh, path, vector, ts, retry); - if (ret != ZOK) { - LOG_WARN(("could not connect to server")); - return ret; - } - //sort this list - sort_children(vector); - owner_id = vector->data[0]; - mutex->ownerid = strdup(owner_id); - id = mutex->id; - char* lessthanme = child_floor(vector->data, vector->count, id); - if (lessthanme != NULL) { - int flen = strlen(mutex->path) + strlen(lessthanme) + 2; - char last_child[flen]; - sprintf(last_child, "%s/%s",mutex->path, lessthanme); - ret = ZCONNECTIONLOSS; - ret = retry_zoowexists(zh, last_child, &lock_watcher_fn, mutex, - &stat, ts, retry); - // cannot watch my predecessor i am giving up - // we need to be able to watch the predecessor - // since if we do not become a leader the others - // will keep waiting - if (ret != ZOK) { - free_String_vector(vector); - LOG_WARN(("unable to watch my predecessor")); - ret = zkr_lock_unlock(mutex); - while (ret == 0) { - //we have to give up our leadership - // since we cannot watch out predecessor - ret = zkr_lock_unlock(mutex); - } - return ret; - } - // we are not the owner of the lock - mutex->isOwner = 0; - } - else { - // this is the case when we are the owner - // of the lock - if (strcmp(mutex->id, owner_id) == 0) { - LOG_DEBUG(("got the zoo lock owner - %s", mutex->id)); - mutex->isOwner = 1; - if (mutex->completion != NULL) { - mutex->completion(0, mutex->cbdata); - } - return ZOK; - } - } - free_String_vector(vector); - return ZOK; - } - } while (mutex->id == NULL); - return ZOK; -} - -ZOOAPI int zkr_lock_lock(zkr_lock_mutex_t *mutex) { - pthread_mutex_lock(&(mutex->pmutex)); - zhandle_t *zh = mutex->zh; - char *path = mutex->path; - struct Stat stat; - int exists = zoo_exists(zh, path, 0, &stat); - int count = 0; - struct timespec ts; - ts.tv_sec = 0; - ts.tv_nsec = (.5)*1000000; - // retry to see if the path exists and - // and create if the path does not exist - while ((exists == ZCONNECTIONLOSS || exists == ZNONODE) && (count <4)) { - count++; - // retry the operation - if (exists == ZCONNECTIONLOSS) - exists = zoo_exists(zh, path, 0, &stat); - else if (exists == ZNONODE) - exists = zoo_create(zh, path, NULL, 0, mutex->acl, 0, NULL, 0); - nanosleep(&ts, 0); - - } - - // need to check if we cannot still access the server - int check_retry = ZCONNECTIONLOSS; - count = 0; - while (check_retry != ZOK && count <4) { - check_retry = zkr_lock_operation(mutex, &ts); - if (check_retry != ZOK) { - nanosleep(&ts, 0); - count++; - } - } - pthread_mutex_unlock(&(mutex->pmutex)); - return zkr_lock_isowner(mutex); -} - - -ZOOAPI char* zkr_lock_getpath(zkr_lock_mutex_t *mutex) { - return mutex->path; -} - -ZOOAPI int zkr_lock_isowner(zkr_lock_mutex_t *mutex) { - return (mutex->id != NULL && mutex->ownerid != NULL - && (strcmp(mutex->id, mutex->ownerid) == 0)); -} - -ZOOAPI char* zkr_lock_getid(zkr_lock_mutex_t *mutex) { - return mutex->ownerid; -} - -ZOOAPI int zkr_lock_destroy(zkr_lock_mutex_t* mutex) { - if (mutex->id) - free(mutex->id); - mutex->path = NULL; - mutex->acl = NULL; - mutex->completion = NULL; - pthread_mutex_destroy(&(mutex->pmutex)); - mutex->isOwner = 0; - if (mutex->ownerid) - free(mutex->ownerid); - return 0; -} - diff --git a/pkg/registry/zookeeper-3.4.6/src/recipes/lock/src/c/tests/TestClient.cc b/pkg/registry/zookeeper-3.4.6/src/recipes/lock/src/c/tests/TestClient.cc deleted file mode 100644 index 2cc56cf34..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/recipes/lock/src/c/tests/TestClient.cc +++ /dev/null @@ -1,201 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you 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. - */ - -#include - -#include -#include -#include - - -using namespace std; - -#include -#include - -#include -#include - -static void yield(zhandle_t *zh, int i) -{ - sleep(i); -} - -typedef struct evt { - string path; - int type; -} evt_t; - -typedef struct watchCtx { -private: - list events; -public: - bool connected; - zhandle_t *zh; - - watchCtx() { - connected = false; - zh = 0; - } - ~watchCtx() { - if (zh) { - zookeeper_close(zh); - zh = 0; - } - } - - evt_t getEvent() { - evt_t evt; - evt = events.front(); - events.pop_front(); - return evt; - } - - int countEvents() { - int count; - count = events.size(); - return count; - } - - void putEvent(evt_t evt) { - events.push_back(evt); - } - - bool waitForConnected(zhandle_t *zh) { - time_t expires = time(0) + 10; - while(!connected && time(0) < expires) { - yield(zh, 1); - } - return connected; - } - bool waitForDisconnected(zhandle_t *zh) { - time_t expires = time(0) + 15; - while(connected && time(0) < expires) { - yield(zh, 1); - } - return !connected; - } -} watchctx_t; - -class Zookeeper_locktest : public CPPUNIT_NS::TestFixture -{ - CPPUNIT_TEST_SUITE(Zookeeper_locktest); - CPPUNIT_TEST(testlock); - CPPUNIT_TEST_SUITE_END(); - - static void watcher(zhandle_t *, int type, int state, const char *path,void*v){ - watchctx_t *ctx = (watchctx_t*)v; - - if (state == ZOO_CONNECTED_STATE) { - ctx->connected = true; - } else { - ctx->connected = false; - } - if (type != ZOO_SESSION_EVENT) { - evt_t evt; - evt.path = path; - evt.type = type; - ctx->putEvent(evt); - } - } - - static const char hostPorts[]; - - const char *getHostPorts() { - return hostPorts; - } - - zhandle_t *createClient(watchctx_t *ctx) { - zhandle_t *zk = zookeeper_init(hostPorts, watcher, 10000, 0, - ctx, 0); - ctx->zh = zk; - sleep(1); - return zk; - } - -public: - -#define ZKSERVER_CMD "./tests/zkServer.sh" - - void setUp() - { - char cmd[1024]; - sprintf(cmd, "%s startClean %s", ZKSERVER_CMD, getHostPorts()); - CPPUNIT_ASSERT(system(cmd) == 0); - } - - - void startServer() { - char cmd[1024]; - sprintf(cmd, "%s start %s", ZKSERVER_CMD, getHostPorts()); - CPPUNIT_ASSERT(system(cmd) == 0); - } - - void stopServer() { - tearDown(); - } - - void tearDown() - { - char cmd[1024]; - sprintf(cmd, "%s stop %s", ZKSERVER_CMD, getHostPorts()); - CPPUNIT_ASSERT(system(cmd) == 0); - } - - - void testlock() - { - watchctx_t ctx; - int rc; - struct Stat stat; - char buf[1024]; - int blen; - struct String_vector strings; - const char *testName; - zkr_lock_mutex_t mutexes[3]; - int count = 3; - int i = 0; - char* path = "/test-lock"; - for (i=0; i< 3; i++) { - zhandle_t *zh = createClient(&ctx); - zkr_lock_init(&mutexes[i], zh, path, &ZOO_OPEN_ACL_UNSAFE); - zkr_lock_lock(&mutexes[i]); - } - sleep(30); - zkr_lock_mutex leader = mutexes[0]; - zkr_lock_mutex mutex; - int ret = strcmp(leader.id, leader.ownerid); - CPPUNIT_ASSERT(ret == 0); - for(i=1; i < count; i++) { - mutex = mutexes[i]; - CPPUNIT_ASSERT(strcmp(mutex.id, mutex.ownerid) != 0); - } - zkr_lock_unlock(&leader); - sleep(30); - zkr_lock_mutex secondleader = mutexes[1]; - CPPUNIT_ASSERT(strcmp(secondleader.id , secondleader.ownerid) == 0); - for (i=2; i -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include "Util.h" - -using namespace std; - -CPPUNIT_NS_BEGIN - -class EclipseOutputter: public CompilerOutputter -{ -public: - EclipseOutputter(TestResultCollector *result,ostream &stream): - CompilerOutputter(result,stream,"%p:%l: "),stream_(stream) - { - } - virtual void printFailedTestName( TestFailure *failure ){} - virtual void printFailureMessage( TestFailure *failure ) - { - stream_<<": "; - Message msg = failure->thrownException()->message(); - stream_<< msg.shortDescription(); - - string text; - for(int i=0; i the output must be in the compiler error format. - //bool selfTest = (argc > 1) && (std::string("-ide") == argv[1]); - globalTestConfig.addConfigFromCmdLine(argc,argv); - - // Create the event manager and test controller - CPPUNIT_NS::TestResult controller; - // Add a listener that colllects test result - CPPUNIT_NS::TestResultCollector result; - controller.addListener( &result ); - - // Add a listener that print dots as tests run. - // CPPUNIT_NS::TextTestProgressListener progress; - CPPUNIT_NS::BriefTestProgressListener progress; - controller.addListener( &progress ); - - CPPUNIT_NS::TestRunner runner; - runner.addTest( CPPUNIT_NS::TestFactoryRegistry::getRegistry().makeTest() ); - - try - { - cout << "Running " << globalTestConfig.getTestName(); - runner.run( controller, globalTestConfig.getTestName()); - cout< -#include -#include - -// number of elements in array -#define COUNTOF(array) sizeof(array)/sizeof(array[0]) - -#define DECLARE_WRAPPER(ret,sym,sig) \ - extern "C" ret __real_##sym sig; \ - extern "C" ret __wrap_##sym sig - -#define CALL_REAL(sym,params) \ - __real_##sym params - -// must include "src/zookeeper_log.h" to be able to use this macro -#define TEST_TRACE(x) \ - log_message(3,__LINE__,__func__,format_log_message x) - -extern const std::string EMPTY_STRING; - -// ***************************************************************************** -// A bit of wizardry to get to the bare type from a reference or a pointer -// to the type -template -struct TypeOp { - typedef T BareT; - typedef T ArgT; -}; - -// partial specialization for reference types -template -struct TypeOp{ - typedef T& ArgT; - typedef typename TypeOp::BareT BareT; -}; - -// partial specialization for pointers -template -struct TypeOp{ - typedef T* ArgT; - typedef typename TypeOp::BareT BareT; -}; - -// ***************************************************************************** -// Container utilities - -template -void putValue(std::map& map,const K& k, const V& v){ - typedef std::map Map; - typename Map::const_iterator it=map.find(k); - if(it==map.end()) - map.insert(typename Map::value_type(k,v)); - else - map[k]=v; -} - -template -bool getValue(const std::map& map,const K& k,V& v){ - typedef std::map Map; - typename Map::const_iterator it=map.find(k); - if(it==map.end()) - return false; - v=it->second; - return true; -} - -// ***************************************************************************** -// misc utils - -// millisecond sleep -void millisleep(int ms); -// evaluate given predicate until it returns true or the timeout -// (in millis) has expired -template -int ensureCondition(const Predicate& p,int timeout){ - int elapsed=0; - while(!p() && elapsed CmdLineOptList; -public: - typedef CmdLineOptList::const_iterator const_iterator; - TestConfig(){} - ~TestConfig(){} - void addConfigFromCmdLine(int argc, char* argv[]){ - if(argc>=2) - testName_=argv[1]; - for(int i=2; i /tmp/zk.log & - echo $! > /tmp/zk.pid - sleep 5 - ;; -stop) - # Already killed above - ;; -*) - echo "Unknown command " + $1 - exit 2 -esac - diff --git a/pkg/registry/zookeeper-3.4.6/src/recipes/lock/src/java/org/apache/zookeeper/recipes/lock/LockListener.java b/pkg/registry/zookeeper-3.4.6/src/recipes/lock/src/java/org/apache/zookeeper/recipes/lock/LockListener.java deleted file mode 100644 index 1c21ad661..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/recipes/lock/src/java/org/apache/zookeeper/recipes/lock/LockListener.java +++ /dev/null @@ -1,38 +0,0 @@ -/** - * - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You 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. - */ -package org.apache.zookeeper.recipes.lock; - -/** - * This class has two methods which are call - * back methods when a lock is acquired and - * when the lock is released. - * - */ -public interface LockListener { - /** - * call back called when the lock - * is acquired - */ - public void lockAcquired(); - - /** - * call back called when the lock is - * released. - */ - public void lockReleased(); -} diff --git a/pkg/registry/zookeeper-3.4.6/src/recipes/lock/src/java/org/apache/zookeeper/recipes/lock/ProtocolSupport.java b/pkg/registry/zookeeper-3.4.6/src/recipes/lock/src/java/org/apache/zookeeper/recipes/lock/ProtocolSupport.java deleted file mode 100644 index 4efdb854d..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/recipes/lock/src/java/org/apache/zookeeper/recipes/lock/ProtocolSupport.java +++ /dev/null @@ -1,193 +0,0 @@ -/** - * - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You 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. - */ -package org.apache.zookeeper.recipes.lock; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.apache.zookeeper.CreateMode; -import org.apache.zookeeper.KeeperException; -import org.apache.zookeeper.ZooDefs; -import org.apache.zookeeper.ZooKeeper; -import org.apache.zookeeper.data.ACL; -import org.apache.zookeeper.data.Stat; -import org.apache.zookeeper.recipes.lock.ZooKeeperOperation; - -import java.util.List; -import java.util.concurrent.atomic.AtomicBoolean; - -/** - * A base class for protocol implementations which provides a number of higher - * level helper methods for working with ZooKeeper along with retrying synchronous - * operations if the connection to ZooKeeper closes such as - * {@link #retryOperation(ZooKeeperOperation)} - * - */ -class ProtocolSupport { - private static final Logger LOG = LoggerFactory.getLogger(ProtocolSupport.class); - - protected final ZooKeeper zookeeper; - private AtomicBoolean closed = new AtomicBoolean(false); - private long retryDelay = 500L; - private int retryCount = 10; - private List acl = ZooDefs.Ids.OPEN_ACL_UNSAFE; - - public ProtocolSupport(ZooKeeper zookeeper) { - this.zookeeper = zookeeper; - } - - /** - * Closes this strategy and releases any ZooKeeper resources; but keeps the - * ZooKeeper instance open - */ - public void close() { - if (closed.compareAndSet(false, true)) { - doClose(); - } - } - - /** - * return zookeeper client instance - * @return zookeeper client instance - */ - public ZooKeeper getZookeeper() { - return zookeeper; - } - - /** - * return the acl its using - * @return the acl. - */ - public List getAcl() { - return acl; - } - - /** - * set the acl - * @param acl the acl to set to - */ - public void setAcl(List acl) { - this.acl = acl; - } - - /** - * get the retry delay in milliseconds - * @return the retry delay - */ - public long getRetryDelay() { - return retryDelay; - } - - /** - * Sets the time waited between retry delays - * @param retryDelay the retry delay - */ - public void setRetryDelay(long retryDelay) { - this.retryDelay = retryDelay; - } - - /** - * Allow derived classes to perform - * some custom closing operations to release resources - */ - protected void doClose() { - } - - - /** - * Perform the given operation, retrying if the connection fails - * @return object. it needs to be cast to the callee's expected - * return type. - */ - protected Object retryOperation(ZooKeeperOperation operation) - throws KeeperException, InterruptedException { - KeeperException exception = null; - for (int i = 0; i < retryCount; i++) { - try { - return operation.execute(); - } catch (KeeperException.SessionExpiredException e) { - LOG.warn("Session expired for: " + zookeeper + " so reconnecting due to: " + e, e); - throw e; - } catch (KeeperException.ConnectionLossException e) { - if (exception == null) { - exception = e; - } - LOG.debug("Attempt " + i + " failed with connection loss so " + - "attempting to reconnect: " + e, e); - retryDelay(i); - } - } - throw exception; - } - - /** - * Ensures that the given path exists with no data, the current - * ACL and no flags - * @param path - */ - protected void ensurePathExists(String path) { - ensureExists(path, null, acl, CreateMode.PERSISTENT); - } - - /** - * Ensures that the given path exists with the given data, ACL and flags - * @param path - * @param acl - * @param flags - */ - protected void ensureExists(final String path, final byte[] data, - final List acl, final CreateMode flags) { - try { - retryOperation(new ZooKeeperOperation() { - public boolean execute() throws KeeperException, InterruptedException { - Stat stat = zookeeper.exists(path, false); - if (stat != null) { - return true; - } - zookeeper.create(path, data, acl, flags); - return true; - } - }); - } catch (KeeperException e) { - LOG.warn("Caught: " + e, e); - } catch (InterruptedException e) { - LOG.warn("Caught: " + e, e); - } - } - - /** - * Returns true if this protocol has been closed - * @return true if this protocol is closed - */ - protected boolean isClosed() { - return closed.get(); - } - - /** - * Performs a retry delay if this is not the first attempt - * @param attemptCount the number of the attempts performed so far - */ - protected void retryDelay(int attemptCount) { - if (attemptCount > 0) { - try { - Thread.sleep(attemptCount * retryDelay); - } catch (InterruptedException e) { - LOG.debug("Failed to sleep: " + e, e); - } - } - } -} diff --git a/pkg/registry/zookeeper-3.4.6/src/recipes/lock/src/java/org/apache/zookeeper/recipes/lock/WriteLock.java b/pkg/registry/zookeeper-3.4.6/src/recipes/lock/src/java/org/apache/zookeeper/recipes/lock/WriteLock.java deleted file mode 100644 index 5caebee46..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/recipes/lock/src/java/org/apache/zookeeper/recipes/lock/WriteLock.java +++ /dev/null @@ -1,296 +0,0 @@ -/** - * - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You 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. - */ -package org.apache.zookeeper.recipes.lock; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.apache.zookeeper.KeeperException; -import org.apache.zookeeper.WatchedEvent; -import org.apache.zookeeper.Watcher; -import static org.apache.zookeeper.CreateMode.EPHEMERAL_SEQUENTIAL; -import org.apache.zookeeper.ZooKeeper; -import org.apache.zookeeper.data.ACL; -import org.apache.zookeeper.data.Stat; - -import java.util.List; -import java.util.SortedSet; -import java.util.TreeSet; - -/** - * A protocol to implement an exclusive - * write lock or to elect a leader.

        You invoke {@link #lock()} to - * start the process of grabbing the lock; you may get the lock then or it may be - * some time later.

        You can register a listener so that you are invoked - * when you get the lock; otherwise you can ask if you have the lock - * by calling {@link #isOwner()} - * - */ -public class WriteLock extends ProtocolSupport { - private static final Logger LOG = LoggerFactory.getLogger(WriteLock.class); - - private final String dir; - private String id; - private ZNodeName idName; - private String ownerId; - private String lastChildId; - private byte[] data = {0x12, 0x34}; - private LockListener callback; - private LockZooKeeperOperation zop; - - /** - * zookeeper contructor for writelock - * @param zookeeper zookeeper client instance - * @param dir the parent path you want to use for locking - * @param acls the acls that you want to use for all the paths, - * if null world read/write is used. - */ - public WriteLock(ZooKeeper zookeeper, String dir, List acl) { - super(zookeeper); - this.dir = dir; - if (acl != null) { - setAcl(acl); - } - this.zop = new LockZooKeeperOperation(); - } - - /** - * zookeeper contructor for writelock with callback - * @param zookeeper the zookeeper client instance - * @param dir the parent path you want to use for locking - * @param acl the acls that you want to use for all the paths - * @param callback the call back instance - */ - public WriteLock(ZooKeeper zookeeper, String dir, List acl, - LockListener callback) { - this(zookeeper, dir, acl); - this.callback = callback; - } - - /** - * return the current locklistener - * @return the locklistener - */ - public LockListener getLockListener() { - return this.callback; - } - - /** - * register a different call back listener - * @param callback the call back instance - */ - public void setLockListener(LockListener callback) { - this.callback = callback; - } - - /** - * Removes the lock or associated znode if - * you no longer require the lock. this also - * removes your request in the queue for locking - * in case you do not already hold the lock. - * @throws RuntimeException throws a runtime exception - * if it cannot connect to zookeeper. - */ - public synchronized void unlock() throws RuntimeException { - - if (!isClosed() && id != null) { - // we don't need to retry this operation in the case of failure - // as ZK will remove ephemeral files and we don't wanna hang - // this process when closing if we cannot reconnect to ZK - try { - - ZooKeeperOperation zopdel = new ZooKeeperOperation() { - public boolean execute() throws KeeperException, - InterruptedException { - zookeeper.delete(id, -1); - return Boolean.TRUE; - } - }; - zopdel.execute(); - } catch (InterruptedException e) { - LOG.warn("Caught: " + e, e); - //set that we have been interrupted. - Thread.currentThread().interrupt(); - } catch (KeeperException.NoNodeException e) { - // do nothing - } catch (KeeperException e) { - LOG.warn("Caught: " + e, e); - throw (RuntimeException) new RuntimeException(e.getMessage()). - initCause(e); - } - finally { - if (callback != null) { - callback.lockReleased(); - } - id = null; - } - } - } - - /** - * the watcher called on - * getting watch while watching - * my predecessor - */ - private class LockWatcher implements Watcher { - public void process(WatchedEvent event) { - // lets either become the leader or watch the new/updated node - LOG.debug("Watcher fired on path: " + event.getPath() + " state: " + - event.getState() + " type " + event.getType()); - try { - lock(); - } catch (Exception e) { - LOG.warn("Failed to acquire lock: " + e, e); - } - } - } - - /** - * a zoookeeper operation that is mainly responsible - * for all the magic required for locking. - */ - private class LockZooKeeperOperation implements ZooKeeperOperation { - - /** find if we have been created earler if not create our node - * - * @param prefix the prefix node - * @param zookeeper teh zookeeper client - * @param dir the dir paretn - * @throws KeeperException - * @throws InterruptedException - */ - private void findPrefixInChildren(String prefix, ZooKeeper zookeeper, String dir) - throws KeeperException, InterruptedException { - List names = zookeeper.getChildren(dir, false); - for (String name : names) { - if (name.startsWith(prefix)) { - id = name; - if (LOG.isDebugEnabled()) { - LOG.debug("Found id created last time: " + id); - } - break; - } - } - if (id == null) { - id = zookeeper.create(dir + "/" + prefix, data, - getAcl(), EPHEMERAL_SEQUENTIAL); - - if (LOG.isDebugEnabled()) { - LOG.debug("Created id: " + id); - } - } - - } - - /** - * the command that is run and retried for actually - * obtaining the lock - * @return if the command was successful or not - */ - public boolean execute() throws KeeperException, InterruptedException { - do { - if (id == null) { - long sessionId = zookeeper.getSessionId(); - String prefix = "x-" + sessionId + "-"; - // lets try look up the current ID if we failed - // in the middle of creating the znode - findPrefixInChildren(prefix, zookeeper, dir); - idName = new ZNodeName(id); - } - if (id != null) { - List names = zookeeper.getChildren(dir, false); - if (names.isEmpty()) { - LOG.warn("No children in: " + dir + " when we've just " + - "created one! Lets recreate it..."); - // lets force the recreation of the id - id = null; - } else { - // lets sort them explicitly (though they do seem to come back in order ususally :) - SortedSet sortedNames = new TreeSet(); - for (String name : names) { - sortedNames.add(new ZNodeName(dir + "/" + name)); - } - ownerId = sortedNames.first().getName(); - SortedSet lessThanMe = sortedNames.headSet(idName); - if (!lessThanMe.isEmpty()) { - ZNodeName lastChildName = lessThanMe.last(); - lastChildId = lastChildName.getName(); - if (LOG.isDebugEnabled()) { - LOG.debug("watching less than me node: " + lastChildId); - } - Stat stat = zookeeper.exists(lastChildId, new LockWatcher()); - if (stat != null) { - return Boolean.FALSE; - } else { - LOG.warn("Could not find the" + - " stats for less than me: " + lastChildName.getName()); - } - } else { - if (isOwner()) { - if (callback != null) { - callback.lockAcquired(); - } - return Boolean.TRUE; - } - } - } - } - } - while (id == null); - return Boolean.FALSE; - } - }; - - /** - * Attempts to acquire the exclusive write lock returning whether or not it was - * acquired. Note that the exclusive lock may be acquired some time later after - * this method has been invoked due to the current lock owner going away. - */ - public synchronized boolean lock() throws KeeperException, InterruptedException { - if (isClosed()) { - return false; - } - ensurePathExists(dir); - - return (Boolean) retryOperation(zop); - } - - /** - * return the parent dir for lock - * @return the parent dir used for locks. - */ - public String getDir() { - return dir; - } - - /** - * Returns true if this node is the owner of the - * lock (or the leader) - */ - public boolean isOwner() { - return id != null && ownerId != null && id.equals(ownerId); - } - - /** - * return the id for this lock - * @return the id for this lock - */ - public String getId() { - return this.id; - } -} - diff --git a/pkg/registry/zookeeper-3.4.6/src/recipes/lock/src/java/org/apache/zookeeper/recipes/lock/ZNodeName.java b/pkg/registry/zookeeper-3.4.6/src/recipes/lock/src/java/org/apache/zookeeper/recipes/lock/ZNodeName.java deleted file mode 100644 index 99b6616f9..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/recipes/lock/src/java/org/apache/zookeeper/recipes/lock/ZNodeName.java +++ /dev/null @@ -1,110 +0,0 @@ -/** - * - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You 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. - */ -package org.apache.zookeeper.recipes.lock; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -/** - * Represents an ephemeral znode name which has an ordered sequence number - * and can be sorted in order - * - */ -class ZNodeName implements Comparable { - private final String name; - private String prefix; - private int sequence = -1; - private static final Logger LOG = LoggerFactory.getLogger(ZNodeName.class); - - public ZNodeName(String name) { - if (name == null) { - throw new NullPointerException("id cannot be null"); - } - this.name = name; - this.prefix = name; - int idx = name.lastIndexOf('-'); - if (idx >= 0) { - this.prefix = name.substring(0, idx); - try { - this.sequence = Integer.parseInt(name.substring(idx + 1)); - // If an exception occurred we misdetected a sequence suffix, - // so return -1. - } catch (NumberFormatException e) { - LOG.info("Number format exception for " + idx, e); - } catch (ArrayIndexOutOfBoundsException e) { - LOG.info("Array out of bounds for " + idx, e); - } - } - } - - @Override - public String toString() { - return name.toString(); - } - - @Override - public boolean equals(Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; - - ZNodeName sequence = (ZNodeName) o; - - if (!name.equals(sequence.name)) return false; - - return true; - } - - @Override - public int hashCode() { - return name.hashCode() + 37; - } - - public int compareTo(ZNodeName that) { - int answer = this.prefix.compareTo(that.prefix); - if (answer == 0) { - int s1 = this.sequence; - int s2 = that.sequence; - if (s1 == -1 && s2 == -1) { - return this.name.compareTo(that.name); - } - answer = s1 == -1 ? 1 : s2 == -1 ? -1 : s1 - s2; - } - return answer; - } - - /** - * Returns the name of the znode - */ - public String getName() { - return name; - } - - /** - * Returns the sequence number - */ - public int getZNodeName() { - return sequence; - } - - /** - * Returns the text prefix before the sequence number - */ - public String getPrefix() { - return prefix; - } -} diff --git a/pkg/registry/zookeeper-3.4.6/src/recipes/lock/src/java/org/apache/zookeeper/recipes/lock/ZooKeeperOperation.java b/pkg/registry/zookeeper-3.4.6/src/recipes/lock/src/java/org/apache/zookeeper/recipes/lock/ZooKeeperOperation.java deleted file mode 100644 index 54317ed95..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/recipes/lock/src/java/org/apache/zookeeper/recipes/lock/ZooKeeperOperation.java +++ /dev/null @@ -1,38 +0,0 @@ -/** - * - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You 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. - */ -package org.apache.zookeeper.recipes.lock; - -import org.apache.zookeeper.KeeperException; - -/** - * A callback object which can be used for implementing retry-able operations in the - * {@link org.apache.zookeeper.recipes.lock.ProtocolSupport} class - * - */ -public interface ZooKeeperOperation { - - /** - * Performs the operation - which may be involved multiple times if the connection - * to ZooKeeper closes during this operation - * - * @return the result of the operation or null - * @throws KeeperException - * @throws InterruptedException - */ - public boolean execute() throws KeeperException, InterruptedException; -} diff --git a/pkg/registry/zookeeper-3.4.6/src/recipes/queue/README.txt b/pkg/registry/zookeeper-3.4.6/src/recipes/queue/README.txt deleted file mode 100644 index d59a3c317..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/recipes/queue/README.txt +++ /dev/null @@ -1,30 +0,0 @@ - - -1) This queue interface recipe implements the queue recipe -mentioned in ../../../docs/recipes.[html,pdf]. -A more detailed explanation is at http://www.cloudera.com/blog/2009/05/28/building-a-distributed-concurrent-queue-with-apache-zookeeper/ - -2) This recipe does not handle KeeperException.ConnectionLossException or ZCONNECTIONLOSS. It will only work correctly once ZOOKEEPER-22 https://issues.apache.org/jira/browse/ZOOKEEPER-22 is resolved. - -3) To compile the queue java recipe you can just run ant jar from -this directory. -Please report any bugs on the jira - -http://issues.apache.org/jira/browse/ZOOKEEPER - - diff --git a/pkg/registry/zookeeper-3.4.6/src/recipes/queue/build.xml b/pkg/registry/zookeeper-3.4.6/src/recipes/queue/build.xml deleted file mode 100644 index 0f3505ab9..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/recipes/queue/build.xml +++ /dev/null @@ -1,128 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Tests failed! - - - - - - - - - - - - - - - - - - diff --git a/pkg/registry/zookeeper-3.4.6/src/recipes/queue/src/c/INSTALL b/pkg/registry/zookeeper-3.4.6/src/recipes/queue/src/c/INSTALL deleted file mode 100644 index 5458714e1..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/recipes/queue/src/c/INSTALL +++ /dev/null @@ -1,234 +0,0 @@ -Installation Instructions -************************* - -Copyright (C) 1994, 1995, 1996, 1999, 2000, 2001, 2002, 2004, 2005, -2006 Free Software Foundation, Inc. - -This file is free documentation; the Free Software Foundation gives -unlimited permission to copy, distribute and modify it. - -Basic Installation -================== - -Briefly, the shell commands `./configure; make; make install' should -configure, build, and install this package. The following -more-detailed instructions are generic; see the `README' file for -instructions specific to this package. - - The `configure' shell script attempts to guess correct values for -various system-dependent variables used during compilation. It uses -those values to create a `Makefile' in each directory of the package. -It may also create one or more `.h' files containing system-dependent -definitions. Finally, it creates a shell script `config.status' that -you can run in the future to recreate the current configuration, and a -file `config.log' containing compiler output (useful mainly for -debugging `configure'). - - It can also use an optional file (typically called `config.cache' -and enabled with `--cache-file=config.cache' or simply `-C') that saves -the results of its tests to speed up reconfiguring. Caching is -disabled by default to prevent problems with accidental use of stale -cache files. - - If you need to do unusual things to compile the package, please try -to figure out how `configure' could check whether to do them, and mail -diffs or instructions to the address given in the `README' so they can -be considered for the next release. If you are using the cache, and at -some point `config.cache' contains results you don't want to keep, you -may remove or edit it. - - The file `configure.ac' (or `configure.in') is used to create -`configure' by a program called `autoconf'. You need `configure.ac' if -you want to change it or regenerate `configure' using a newer version -of `autoconf'. - -The simplest way to compile this package is: - - 1. `cd' to the directory containing the package's source code and type - `./configure' to configure the package for your system. - - Running `configure' might take a while. While running, it prints - some messages telling which features it is checking for. - - 2. Type `make' to compile the package. - - 3. Optionally, type `make check' to run any self-tests that come with - the package. - - 4. Type `make install' to install the programs and any data files and - documentation. - - 5. You can remove the program binaries and object files from the - source code directory by typing `make clean'. To also remove the - files that `configure' created (so you can compile the package for - a different kind of computer), type `make distclean'. There is - also a `make maintainer-clean' target, but that is intended mainly - for the package's developers. If you use it, you may have to get - all sorts of other programs in order to regenerate files that came - with the distribution. - -Compilers and Options -===================== - -Some systems require unusual options for compilation or linking that the -`configure' script does not know about. Run `./configure --help' for -details on some of the pertinent environment variables. - - You can give `configure' initial values for configuration parameters -by setting variables in the command line or in the environment. Here -is an example: - - ./configure CC=c99 CFLAGS=-g LIBS=-lposix - - *Note Defining Variables::, for more details. - -Compiling For Multiple Architectures -==================================== - -You can compile the package for more than one kind of computer at the -same time, by placing the object files for each architecture in their -own directory. To do this, you can use GNU `make'. `cd' to the -directory where you want the object files and executables to go and run -the `configure' script. `configure' automatically checks for the -source code in the directory that `configure' is in and in `..'. - - With a non-GNU `make', it is safer to compile the package for one -architecture at a time in the source code directory. After you have -installed the package for one architecture, use `make distclean' before -reconfiguring for another architecture. - -Installation Names -================== - -By default, `make install' installs the package's commands under -`/usr/local/bin', include files under `/usr/local/include', etc. You -can specify an installation prefix other than `/usr/local' by giving -`configure' the option `--prefix=PREFIX'. - - You can specify separate installation prefixes for -architecture-specific files and architecture-independent files. If you -pass the option `--exec-prefix=PREFIX' to `configure', the package uses -PREFIX as the prefix for installing programs and libraries. -Documentation and other data files still use the regular prefix. - - In addition, if you use an unusual directory layout you can give -options like `--bindir=DIR' to specify different values for particular -kinds of files. Run `configure --help' for a list of the directories -you can set and what kinds of files go in them. - - If the package supports it, you can cause programs to be installed -with an extra prefix or suffix on their names by giving `configure' the -option `--program-prefix=PREFIX' or `--program-suffix=SUFFIX'. - -Optional Features -================= - -Some packages pay attention to `--enable-FEATURE' options to -`configure', where FEATURE indicates an optional part of the package. -They may also pay attention to `--with-PACKAGE' options, where PACKAGE -is something like `gnu-as' or `x' (for the X Window System). The -`README' should mention any `--enable-' and `--with-' options that the -package recognizes. - - For packages that use the X Window System, `configure' can usually -find the X include and library files automatically, but if it doesn't, -you can use the `configure' options `--x-includes=DIR' and -`--x-libraries=DIR' to specify their locations. - -Specifying the System Type -========================== - -There may be some features `configure' cannot figure out automatically, -but needs to determine by the type of machine the package will run on. -Usually, assuming the package is built to be run on the _same_ -architectures, `configure' can figure that out, but if it prints a -message saying it cannot guess the machine type, give it the -`--build=TYPE' option. TYPE can either be a short name for the system -type, such as `sun4', or a canonical name which has the form: - - CPU-COMPANY-SYSTEM - -where SYSTEM can have one of these forms: - - OS KERNEL-OS - - See the file `config.sub' for the possible values of each field. If -`config.sub' isn't included in this package, then this package doesn't -need to know the machine type. - - If you are _building_ compiler tools for cross-compiling, you should -use the option `--target=TYPE' to select the type of system they will -produce code for. - - If you want to _use_ a cross compiler, that generates code for a -platform different from the build platform, you should specify the -"host" platform (i.e., that on which the generated programs will -eventually be run) with `--host=TYPE'. - -Sharing Defaults -================ - -If you want to set default values for `configure' scripts to share, you -can create a site shell script called `config.site' that gives default -values for variables like `CC', `cache_file', and `prefix'. -`configure' looks for `PREFIX/share/config.site' if it exists, then -`PREFIX/etc/config.site' if it exists. Or, you can set the -`CONFIG_SITE' environment variable to the location of the site script. -A warning: not all `configure' scripts look for a site script. - -Defining Variables -================== - -Variables not defined in a site shell script can be set in the -environment passed to `configure'. However, some packages may run -configure again during the build, and the customized values of these -variables may be lost. In order to avoid this problem, you should set -them in the `configure' command line, using `VAR=value'. For example: - - ./configure CC=/usr/local2/bin/gcc - -causes the specified `gcc' to be used as the C compiler (unless it is -overridden in the site shell script). - -Unfortunately, this technique does not work for `CONFIG_SHELL' due to -an Autoconf bug. Until the bug is fixed you can use this workaround: - - CONFIG_SHELL=/bin/bash /bin/bash ./configure CONFIG_SHELL=/bin/bash - -`configure' Invocation -====================== - -`configure' recognizes the following options to control how it operates. - -`--help' -`-h' - Print a summary of the options to `configure', and exit. - -`--version' -`-V' - Print the version of Autoconf used to generate the `configure' - script, and exit. - -`--cache-file=FILE' - Enable the cache: use and save the results of the tests in FILE, - traditionally `config.cache'. FILE defaults to `/dev/null' to - disable caching. - -`--config-cache' -`-C' - Alias for `--cache-file=config.cache'. - -`--quiet' -`--silent' -`-q' - Do not print messages saying which checks are being made. To - suppress all normal output, redirect it to `/dev/null' (any error - messages will still be shown). - -`--srcdir=DIR' - Look for the package's source code in directory DIR. Usually - `configure' can determine that directory automatically. - -`configure' also accepts some other, not widely useful, options. Run -`configure --help' for more details. - diff --git a/pkg/registry/zookeeper-3.4.6/src/recipes/queue/src/c/LICENSE b/pkg/registry/zookeeper-3.4.6/src/recipes/queue/src/c/LICENSE deleted file mode 100644 index d64569567..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/recipes/queue/src/c/LICENSE +++ /dev/null @@ -1,202 +0,0 @@ - - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "[]" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright [yyyy] [name of copyright owner] - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. diff --git a/pkg/registry/zookeeper-3.4.6/src/recipes/queue/src/c/Makefile.am b/pkg/registry/zookeeper-3.4.6/src/recipes/queue/src/c/Makefile.am deleted file mode 100644 index ecef3cc79..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/recipes/queue/src/c/Makefile.am +++ /dev/null @@ -1,46 +0,0 @@ -# Licensed to the Apache Software Foundation (ASF) under one -# or more contributor license agreements. See the NOTICE file -# distributed with this work for additional information -# regarding copyright ownership. The ASF licenses this file -# to you 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. - -include $(top_srcdir)/aminclude.am - -AM_CFLAGS = -Wall -fPIC -I${ZOOKEEPER_PATH}/include -I${ZOOKEEPER_PATH}/generated \ - -I$(top_srcdir)/include -I/usr/include -AM_CPPFLAGS = -Wall -I${ZOOKEEPER_PATH}/include -I${ZOOKEEPER_PATH}/generated\ - -I${top_srcdir}/include -I/usr/include -EXTRA_DIST = LICENSE -lib_LTLIBRARIES = libzooqueue.la -libzooqueue_la_SOURCES = src/zoo_queue.c include/zoo_queue.h -libzooqueue_la_CPPFLAGS = -DDLOPEN_MODULE -libzooqueue_la_LDFLAGS = -version-info 0:1:0 - -#run the tests now - -TEST_SOURCES = tests/TestDriver.cc tests/TestClient.cc tests/Util.cc - - -check_PROGRAMS = zkqueuetest -nodist_zkqueuetest_SOURCES = ${TEST_SOURCES} -zkqueuetest_LDADD = ${ZOOKEEPER_LD} libzooqueue.la -lpthread ${CPPUNIT_LIBS} -zkqueuetest_CXXFLAGS = -DUSE_STATIC_LIB ${CPPUNIT_CFLAGS} - -run-check: check - ./zkqueuetest ${TEST_OPTIONS} - -clean-local: clean-check - ${RM} ${DX_CLEANFILES} - -clean-check: - ${RM} ${nodist_zkqueuetest_OBJECTS} diff --git a/pkg/registry/zookeeper-3.4.6/src/recipes/queue/src/c/README.txt b/pkg/registry/zookeeper-3.4.6/src/recipes/queue/src/c/README.txt deleted file mode 100644 index 7ef253fc9..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/recipes/queue/src/c/README.txt +++ /dev/null @@ -1,30 +0,0 @@ - Zookeeper C queue client library - - -INSTALLATION - -If you're building the client from a source checkout you need to -follow the steps outlined below. If you're building from a release -tar downloaded from Apache please skip to step 2. - -This recipe does not handle ZCONNECTIONLOSS. It will only work correctly once ZOOKEEPER-22 https://issues.apache.org/jira/browse/ZOOKEEPER-22 is resolved. - -1) make sure that you compile the main zookeeper c client library. - -2) change directory to src/recipes/queue/src/c - and do a "autoreconf -if" to bootstrap - autoconf, automake and libtool. Please make sure you have autoconf - version 2.59 or greater installed. -3) do a "./configure [OPTIONS]" to generate the makefile. See INSTALL - for general information about running configure. - -4) do a "make" or "make install" to build the libraries and install them. - Alternatively, you can also build and run a unit test suite (and - you probably should). Please make sure you have cppunit-1.10.x or - higher installed before you execute step 4. Once ./configure has - finished, do a "make run-check". It will build the libraries, build - the tests and run them. -5) to generate doxygen documentation do a "make doxygen-doc". All - documentations will be placed to a new subfolder named docs. By - default only HTML documentation is generated. For information on - other document formats please use "./configure --help" diff --git a/pkg/registry/zookeeper-3.4.6/src/recipes/queue/src/c/acinclude.m4 b/pkg/registry/zookeeper-3.4.6/src/recipes/queue/src/c/acinclude.m4 deleted file mode 100644 index d0041d8c2..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/recipes/queue/src/c/acinclude.m4 +++ /dev/null @@ -1,312 +0,0 @@ -# This file is part of Autoconf. -*- Autoconf -*- - -# Copyright (C) 2004 Oren Ben-Kiki -# This file is distributed under the same terms as the Autoconf macro files. - -# Generate automatic documentation using Doxygen. Works in concert with the -# aminclude.m4 file and a compatible doxygen configuration file. Defines the -# following public macros: -# -# DX_???_FEATURE(ON|OFF) - control the default setting fo a Doxygen feature. -# Supported features are 'DOXYGEN' itself, 'DOT' for generating graphics, -# 'HTML' for plain HTML, 'CHM' for compressed HTML help (for MS users), 'CHI' -# for generating a seperate .chi file by the .chm file, and 'MAN', 'RTF', -# 'XML', 'PDF' and 'PS' for the appropriate output formats. The environment -# variable DOXYGEN_PAPER_SIZE may be specified to override the default 'a4wide' -# paper size. -# -# By default, HTML, PDF and PS documentation is generated as this seems to be -# the most popular and portable combination. MAN pages created by Doxygen are -# usually problematic, though by picking an appropriate subset and doing some -# massaging they might be better than nothing. CHM and RTF are specific for MS -# (note that you can't generate both HTML and CHM at the same time). The XML is -# rather useless unless you apply specialized post-processing to it. -# -# The macro mainly controls the default state of the feature. The use can -# override the default by specifying --enable or --disable. The macros ensure -# that contradictory flags are not given (e.g., --enable-doxygen-html and -# --enable-doxygen-chm, --enable-doxygen-anything with --disable-doxygen, etc.) -# Finally, each feature will be automatically disabled (with a warning) if the -# required programs are missing. -# -# Once all the feature defaults have been specified, call DX_INIT_DOXYGEN with -# the following parameters: a one-word name for the project for use as a -# filename base etc., an optional configuration file name (the default is -# 'Doxyfile', the same as Doxygen's default), and an optional output directory -# name (the default is 'doxygen-doc'). - -## ----------## -## Defaults. ## -## ----------## - -DX_ENV="" -AC_DEFUN([DX_FEATURE_doc], ON) -AC_DEFUN([DX_FEATURE_dot], ON) -AC_DEFUN([DX_FEATURE_man], OFF) -AC_DEFUN([DX_FEATURE_html], ON) -AC_DEFUN([DX_FEATURE_chm], OFF) -AC_DEFUN([DX_FEATURE_chi], OFF) -AC_DEFUN([DX_FEATURE_rtf], OFF) -AC_DEFUN([DX_FEATURE_xml], OFF) -AC_DEFUN([DX_FEATURE_pdf], ON) -AC_DEFUN([DX_FEATURE_ps], ON) - -## --------------- ## -## Private macros. ## -## --------------- ## - -# DX_ENV_APPEND(VARIABLE, VALUE) -# ------------------------------ -# Append VARIABLE="VALUE" to DX_ENV for invoking doxygen. -AC_DEFUN([DX_ENV_APPEND], [AC_SUBST([DX_ENV], ["$DX_ENV $1='$2'"])]) - -# DX_DIRNAME_EXPR -# --------------- -# Expand into a shell expression prints the directory part of a path. -AC_DEFUN([DX_DIRNAME_EXPR], - [[expr ".$1" : '\(\.\)[^/]*$' \| "x$1" : 'x\(.*\)/[^/]*$']]) - -# DX_IF_FEATURE(FEATURE, IF-ON, IF-OFF) -# ------------------------------------- -# Expands according to the M4 (static) status of the feature. -AC_DEFUN([DX_IF_FEATURE], [ifelse(DX_FEATURE_$1, ON, [$2], [$3])]) - -# DX_REQUIRE_PROG(VARIABLE, PROGRAM) -# ---------------------------------- -# Require the specified program to be found for the DX_CURRENT_FEATURE to work. -AC_DEFUN([DX_REQUIRE_PROG], [ -AC_PATH_TOOL([$1], [$2]) -if test "$DX_FLAG_$[DX_CURRENT_FEATURE$$1]" = 1; then - AC_MSG_WARN([$2 not found - will not DX_CURRENT_DESCRIPTION]) - AC_SUBST([DX_FLAG_]DX_CURRENT_FEATURE, 0) -fi -]) - -# DX_TEST_FEATURE(FEATURE) -# ------------------------ -# Expand to a shell expression testing whether the feature is active. -AC_DEFUN([DX_TEST_FEATURE], [test "$DX_FLAG_$1" = 1]) - -# DX_CHECK_DEPEND(REQUIRED_FEATURE, REQUIRED_STATE) -# ------------------------------------------------- -# Verify that a required features has the right state before trying to turn on -# the DX_CURRENT_FEATURE. -AC_DEFUN([DX_CHECK_DEPEND], [ -test "$DX_FLAG_$1" = "$2" \ -|| AC_MSG_ERROR([doxygen-DX_CURRENT_FEATURE ifelse([$2], 1, - requires, contradicts) doxygen-DX_CURRENT_FEATURE]) -]) - -# DX_CLEAR_DEPEND(FEATURE, REQUIRED_FEATURE, REQUIRED_STATE) -# ---------------------------------------------------------- -# Turn off the DX_CURRENT_FEATURE if the required feature is off. -AC_DEFUN([DX_CLEAR_DEPEND], [ -test "$DX_FLAG_$1" = "$2" || AC_SUBST([DX_FLAG_]DX_CURRENT_FEATURE, 0) -]) - -# DX_FEATURE_ARG(FEATURE, DESCRIPTION, -# CHECK_DEPEND, CLEAR_DEPEND, -# REQUIRE, DO-IF-ON, DO-IF-OFF) -# -------------------------------------------- -# Parse the command-line option controlling a feature. CHECK_DEPEND is called -# if the user explicitly turns the feature on (and invokes DX_CHECK_DEPEND), -# otherwise CLEAR_DEPEND is called to turn off the default state if a required -# feature is disabled (using DX_CLEAR_DEPEND). REQUIRE performs additional -# requirement tests (DX_REQUIRE_PROG). Finally, an automake flag is set and -# DO-IF-ON or DO-IF-OFF are called according to the final state of the feature. -AC_DEFUN([DX_ARG_ABLE], [ - AC_DEFUN([DX_CURRENT_FEATURE], [$1]) - AC_DEFUN([DX_CURRENT_DESCRIPTION], [$2]) - AC_ARG_ENABLE(doxygen-$1, - [AS_HELP_STRING(DX_IF_FEATURE([$1], [--disable-doxygen-$1], - [--enable-doxygen-$1]), - DX_IF_FEATURE([$1], [don't $2], [$2]))], - [ -case "$enableval" in -#( -y|Y|yes|Yes|YES) - AC_SUBST([DX_FLAG_$1], 1) - $3 -;; #( -n|N|no|No|NO) - AC_SUBST([DX_FLAG_$1], 0) -;; #( -*) - AC_MSG_ERROR([invalid value '$enableval' given to doxygen-$1]) -;; -esac -], [ -AC_SUBST([DX_FLAG_$1], [DX_IF_FEATURE([$1], 1, 0)]) -$4 -]) -if DX_TEST_FEATURE([$1]); then - $5 - : -fi -if DX_TEST_FEATURE([$1]); then - AM_CONDITIONAL(DX_COND_$1, :) - $6 - : -else - AM_CONDITIONAL(DX_COND_$1, false) - $7 - : -fi -]) - -## -------------- ## -## Public macros. ## -## -------------- ## - -# DX_XXX_FEATURE(DEFAULT_STATE) -# ----------------------------- -AC_DEFUN([DX_DOXYGEN_FEATURE], [AC_DEFUN([DX_FEATURE_doc], [$1])]) -AC_DEFUN([DX_MAN_FEATURE], [AC_DEFUN([DX_FEATURE_man], [$1])]) -AC_DEFUN([DX_HTML_FEATURE], [AC_DEFUN([DX_FEATURE_html], [$1])]) -AC_DEFUN([DX_CHM_FEATURE], [AC_DEFUN([DX_FEATURE_chm], [$1])]) -AC_DEFUN([DX_CHI_FEATURE], [AC_DEFUN([DX_FEATURE_chi], [$1])]) -AC_DEFUN([DX_RTF_FEATURE], [AC_DEFUN([DX_FEATURE_rtf], [$1])]) -AC_DEFUN([DX_XML_FEATURE], [AC_DEFUN([DX_FEATURE_xml], [$1])]) -AC_DEFUN([DX_XML_FEATURE], [AC_DEFUN([DX_FEATURE_xml], [$1])]) -AC_DEFUN([DX_PDF_FEATURE], [AC_DEFUN([DX_FEATURE_pdf], [$1])]) -AC_DEFUN([DX_PS_FEATURE], [AC_DEFUN([DX_FEATURE_ps], [$1])]) - -# DX_INIT_DOXYGEN(PROJECT, [CONFIG-FILE], [OUTPUT-DOC-DIR]) -# --------------------------------------------------------- -# PROJECT also serves as the base name for the documentation files. -# The default CONFIG-FILE is "Doxyfile" and OUTPUT-DOC-DIR is "doxygen-doc". -AC_DEFUN([DX_INIT_DOXYGEN], [ - -# Files: -AC_SUBST([DX_PROJECT], [$1]) -AC_SUBST([DX_CONFIG], [ifelse([$2], [], Doxyfile, [$2])]) -AC_SUBST([DX_DOCDIR], [ifelse([$3], [], doxygen-doc, [$3])]) - -# Environment variables used inside doxygen.cfg: -DX_ENV_APPEND(SRCDIR, $srcdir) -DX_ENV_APPEND(PROJECT, $DX_PROJECT) -DX_ENV_APPEND(DOCDIR, $DX_DOCDIR) -DX_ENV_APPEND(VERSION, $PACKAGE_VERSION) - -# Doxygen itself: -DX_ARG_ABLE(doc, [generate any doxygen documentation], - [], - [], - [DX_REQUIRE_PROG([DX_DOXYGEN], doxygen) - DX_REQUIRE_PROG([DX_PERL], perl)], - [DX_ENV_APPEND(PERL_PATH, $DX_PERL)]) - -# Dot for graphics: -DX_ARG_ABLE(dot, [generate graphics for doxygen documentation], - [DX_CHECK_DEPEND(doc, 1)], - [DX_CLEAR_DEPEND(doc, 1)], - [DX_REQUIRE_PROG([DX_DOT], dot)], - [DX_ENV_APPEND(HAVE_DOT, YES) - DX_ENV_APPEND(DOT_PATH, [`DX_DIRNAME_EXPR($DX_DOT)`])], - [DX_ENV_APPEND(HAVE_DOT, NO)]) - -# Man pages generation: -DX_ARG_ABLE(man, [generate doxygen manual pages], - [DX_CHECK_DEPEND(doc, 1)], - [DX_CLEAR_DEPEND(doc, 1)], - [], - [DX_ENV_APPEND(GENERATE_MAN, YES)], - [DX_ENV_APPEND(GENERATE_MAN, NO)]) - -# RTF file generation: -DX_ARG_ABLE(rtf, [generate doxygen RTF documentation], - [DX_CHECK_DEPEND(doc, 1)], - [DX_CLEAR_DEPEND(doc, 1)], - [], - [DX_ENV_APPEND(GENERATE_RTF, YES)], - [DX_ENV_APPEND(GENERATE_RTF, NO)]) - -# XML file generation: -DX_ARG_ABLE(xml, [generate doxygen XML documentation], - [DX_CHECK_DEPEND(doc, 1)], - [DX_CLEAR_DEPEND(doc, 1)], - [], - [DX_ENV_APPEND(GENERATE_XML, YES)], - [DX_ENV_APPEND(GENERATE_XML, NO)]) - -# (Compressed) HTML help generation: -DX_ARG_ABLE(chm, [generate doxygen compressed HTML help documentation], - [DX_CHECK_DEPEND(doc, 1)], - [DX_CLEAR_DEPEND(doc, 1)], - [DX_REQUIRE_PROG([DX_HHC], hhc)], - [DX_ENV_APPEND(HHC_PATH, $DX_HHC) - DX_ENV_APPEND(GENERATE_HTML, YES) - DX_ENV_APPEND(GENERATE_HTMLHELP, YES)], - [DX_ENV_APPEND(GENERATE_HTMLHELP, NO)]) - -# Seperate CHI file generation. -DX_ARG_ABLE(chi, [generate doxygen seperate compressed HTML help index file], - [DX_CHECK_DEPEND(chm, 1)], - [DX_CLEAR_DEPEND(chm, 1)], - [], - [DX_ENV_APPEND(GENERATE_CHI, YES)], - [DX_ENV_APPEND(GENERATE_CHI, NO)]) - -# Plain HTML pages generation: -DX_ARG_ABLE(html, [generate doxygen plain HTML documentation], - [DX_CHECK_DEPEND(doc, 1) DX_CHECK_DEPEND(chm, 0)], - [DX_CLEAR_DEPEND(doc, 1) DX_CLEAR_DEPEND(chm, 0)], - [], - [DX_ENV_APPEND(GENERATE_HTML, YES)], - [DX_TEST_FEATURE(chm) || DX_ENV_APPEND(GENERATE_HTML, NO)]) - -# PostScript file generation: -DX_ARG_ABLE(ps, [generate doxygen PostScript documentation], - [DX_CHECK_DEPEND(doc, 1)], - [DX_CLEAR_DEPEND(doc, 1)], - [DX_REQUIRE_PROG([DX_LATEX], latex) - DX_REQUIRE_PROG([DX_MAKEINDEX], makeindex) - DX_REQUIRE_PROG([DX_DVIPS], dvips) - DX_REQUIRE_PROG([DX_EGREP], egrep)]) - -# PDF file generation: -DX_ARG_ABLE(pdf, [generate doxygen PDF documentation], - [DX_CHECK_DEPEND(doc, 1)], - [DX_CLEAR_DEPEND(doc, 1)], - [DX_REQUIRE_PROG([DX_PDFLATEX], pdflatex) - DX_REQUIRE_PROG([DX_MAKEINDEX], makeindex) - DX_REQUIRE_PROG([DX_EGREP], egrep)]) - -# LaTeX generation for PS and/or PDF: -if DX_TEST_FEATURE(ps) || DX_TEST_FEATURE(pdf); then - AM_CONDITIONAL(DX_COND_latex, :) - DX_ENV_APPEND(GENERATE_LATEX, YES) -else - AM_CONDITIONAL(DX_COND_latex, false) - DX_ENV_APPEND(GENERATE_LATEX, NO) -fi - -# Paper size for PS and/or PDF: -AC_ARG_VAR(DOXYGEN_PAPER_SIZE, - [a4wide (default), a4, letter, legal or executive]) -case "$DOXYGEN_PAPER_SIZE" in -#( -"") - AC_SUBST(DOXYGEN_PAPER_SIZE, "") -;; #( -a4wide|a4|letter|legal|executive) - DX_ENV_APPEND(PAPER_SIZE, $DOXYGEN_PAPER_SIZE) -;; #( -*) - AC_MSG_ERROR([unknown DOXYGEN_PAPER_SIZE='$DOXYGEN_PAPER_SIZE']) -;; -esac - -#For debugging: -#echo DX_FLAG_doc=$DX_FLAG_doc -#echo DX_FLAG_dot=$DX_FLAG_dot -#echo DX_FLAG_man=$DX_FLAG_man -#echo DX_FLAG_html=$DX_FLAG_html -#echo DX_FLAG_chm=$DX_FLAG_chm -#echo DX_FLAG_chi=$DX_FLAG_chi -#echo DX_FLAG_rtf=$DX_FLAG_rtf -#echo DX_FLAG_xml=$DX_FLAG_xml -#echo DX_FLAG_pdf=$DX_FLAG_pdf -#echo DX_FLAG_ps=$DX_FLAG_ps -#echo DX_ENV=$DX_ENV -]) diff --git a/pkg/registry/zookeeper-3.4.6/src/recipes/queue/src/c/aminclude.am b/pkg/registry/zookeeper-3.4.6/src/recipes/queue/src/c/aminclude.am deleted file mode 100644 index 420049eca..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/recipes/queue/src/c/aminclude.am +++ /dev/null @@ -1,186 +0,0 @@ -# Copyright (C) 2004 Oren Ben-Kiki -# This file is distributed under the same terms as the Automake macro files. - -# Generate automatic documentation using Doxygen. Goals and variables values -# are controlled by the various DX_COND_??? conditionals set by autoconf. -# -# The provided goals are: -# doxygen-doc: Generate all doxygen documentation. -# doxygen-run: Run doxygen, which will generate some of the documentation -# (HTML, CHM, CHI, MAN, RTF, XML) but will not do the post -# processing required for the rest of it (PS, PDF, and some MAN). -# doxygen-man: Rename some doxygen generated man pages. -# doxygen-ps: Generate doxygen PostScript documentation. -# doxygen-pdf: Generate doxygen PDF documentation. -# -# Note that by default these are not integrated into the automake goals. If -# doxygen is used to generate man pages, you can achieve this integration by -# setting man3_MANS to the list of man pages generated and then adding the -# dependency: -# -# $(man3_MANS): doxygen-doc -# -# This will cause make to run doxygen and generate all the documentation. -# -# The following variable is intended for use in Makefile.am: -# -# DX_CLEANFILES = everything to clean. -# -# This is usually added to MOSTLYCLEANFILES. - -## --------------------------------- ## -## Format-independent Doxygen rules. ## -## --------------------------------- ## - -if DX_COND_doc - -## ------------------------------- ## -## Rules specific for HTML output. ## -## ------------------------------- ## - -if DX_COND_html - -DX_CLEAN_HTML = @DX_DOCDIR@/html - -endif DX_COND_html - -## ------------------------------ ## -## Rules specific for CHM output. ## -## ------------------------------ ## - -if DX_COND_chm - -DX_CLEAN_CHM = @DX_DOCDIR@/chm - -if DX_COND_chi - -DX_CLEAN_CHI = @DX_DOCDIR@/@PACKAGE@.chi - -endif DX_COND_chi - -endif DX_COND_chm - -## ------------------------------ ## -## Rules specific for MAN output. ## -## ------------------------------ ## - -if DX_COND_man - -DX_CLEAN_MAN = @DX_DOCDIR@/man - -endif DX_COND_man - -## ------------------------------ ## -## Rules specific for RTF output. ## -## ------------------------------ ## - -if DX_COND_rtf - -DX_CLEAN_RTF = @DX_DOCDIR@/rtf - -endif DX_COND_rtf - -## ------------------------------ ## -## Rules specific for XML output. ## -## ------------------------------ ## - -if DX_COND_xml - -DX_CLEAN_XML = @DX_DOCDIR@/xml - -endif DX_COND_xml - -## ----------------------------- ## -## Rules specific for PS output. ## -## ----------------------------- ## - -if DX_COND_ps - -DX_CLEAN_PS = @DX_DOCDIR@/@PACKAGE@.ps - -DX_PS_GOAL = doxygen-ps - -doxygen-ps: @DX_DOCDIR@/@PACKAGE@.ps - -@DX_DOCDIR@/@PACKAGE@.ps: @DX_DOCDIR@/@PACKAGE@.tag - cd @DX_DOCDIR@/latex; \ - rm -f *.aux *.toc *.idx *.ind *.ilg *.log *.out; \ - $(DX_LATEX) refman.tex; \ - $(MAKEINDEX_PATH) refman.idx; \ - $(DX_LATEX) refman.tex; \ - countdown=5; \ - while $(DX_EGREP) 'Rerun (LaTeX|to get cross-references right)' \ - refman.log > /dev/null 2>&1 \ - && test $$countdown -gt 0; do \ - $(DX_LATEX) refman.tex; \ - countdown=`expr $$countdown - 1`; \ - done; \ - $(DX_DVIPS) -o ../@PACKAGE@.ps refman.dvi - -endif DX_COND_ps - -## ------------------------------ ## -## Rules specific for PDF output. ## -## ------------------------------ ## - -if DX_COND_pdf - -DX_CLEAN_PDF = @DX_DOCDIR@/@PACKAGE@.pdf - -DX_PDF_GOAL = doxygen-pdf - -doxygen-pdf: @DX_DOCDIR@/@PACKAGE@.pdf - -@DX_DOCDIR@/@PACKAGE@.pdf: @DX_DOCDIR@/@PACKAGE@.tag - cd @DX_DOCDIR@/latex; \ - rm -f *.aux *.toc *.idx *.ind *.ilg *.log *.out; \ - $(DX_PDFLATEX) refman.tex; \ - $(DX_MAKEINDEX) refman.idx; \ - $(DX_PDFLATEX) refman.tex; \ - countdown=5; \ - while $(DX_EGREP) 'Rerun (LaTeX|to get cross-references right)' \ - refman.log > /dev/null 2>&1 \ - && test $$countdown -gt 0; do \ - $(DX_PDFLATEX) refman.tex; \ - countdown=`expr $$countdown - 1`; \ - done; \ - mv refman.pdf ../@PACKAGE@.pdf - -endif DX_COND_pdf - -## ------------------------------------------------- ## -## Rules specific for LaTeX (shared for PS and PDF). ## -## ------------------------------------------------- ## - -if DX_COND_latex - -DX_CLEAN_LATEX = @DX_DOCDIR@/latex - -endif DX_COND_latex - -.PHONY: doxygen-run doxygen-doc $(DX_PS_GOAL) $(DX_PDF_GOAL) - -.INTERMEDIATE: doxygen-run $(DX_PS_GOAL) $(DX_PDF_GOAL) - -doxygen-run: @DX_DOCDIR@/@PACKAGE@.tag - -doxygen-doc: doxygen-run $(DX_PS_GOAL) $(DX_PDF_GOAL) - -@DX_DOCDIR@/@PACKAGE@.tag: $(DX_CONFIG) $(pkginclude_HEADERS) - rm -rf @DX_DOCDIR@ - $(DX_ENV) $(DX_DOXYGEN) $(srcdir)/$(DX_CONFIG) - -DX_CLEANFILES = \ - @DX_DOCDIR@/@PACKAGE@.tag \ - -r \ - $(DX_CLEAN_HTML) \ - $(DX_CLEAN_CHM) \ - $(DX_CLEAN_CHI) \ - $(DX_CLEAN_MAN) \ - $(DX_CLEAN_RTF) \ - $(DX_CLEAN_XML) \ - $(DX_CLEAN_PS) \ - $(DX_CLEAN_PDF) \ - $(DX_CLEAN_LATEX) - -endif DX_COND_doc diff --git a/pkg/registry/zookeeper-3.4.6/src/recipes/queue/src/c/c-doc.Doxyfile b/pkg/registry/zookeeper-3.4.6/src/recipes/queue/src/c/c-doc.Doxyfile deleted file mode 100644 index 32e09a1c8..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/recipes/queue/src/c/c-doc.Doxyfile +++ /dev/null @@ -1,1252 +0,0 @@ -# Doxyfile 1.4.7 - -# 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 (" ") - -#--------------------------------------------------------------------------- -# Project related 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 = $(PROJECT)-$(VERSION) - -# 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 = $(DOCDIR) - -# If the CREATE_SUBDIRS tag is set to YES, then doxygen will create -# 4096 sub-directories (in 2 levels) under the output directory of each output -# format and will distribute the generated files over these directories. -# Enabling this option can be useful when feeding doxygen a huge amount of -# source files, where putting all generated files in the same directory would -# otherwise cause performance problems for the file system. - -CREATE_SUBDIRS = NO - -# 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, Korean-en, Norwegian, -# Polish, Portuguese, Romanian, Russian, Serbian, Slovak, Slovene, Spanish, -# Swedish, and Ukrainian. - -OUTPUT_LANGUAGE = English - -# This tag can be used to specify the encoding used in the generated output. -# The encoding is not always determined by the language that is chosen, -# but also whether or not the output is meant for Windows or non-Windows users. -# In case there is a difference, setting the USE_WINDOWS_ENCODING tag to YES -# forces the Windows encoding (this is the default for the Windows binary), -# whereas setting the tag to NO uses a Unix-style encoding (the default for -# all platforms other than Windows). - -USE_WINDOWS_ENCODING = 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 - -# This tag implements a quasi-intelligent brief description abbreviator -# that is used to form the text in various listings. Each string -# in this list, if found as the leading text of the brief description, will be -# stripped from the text and the result after processing the whole list, is -# used as the annotated text. Otherwise, the brief description is used as-is. -# If left blank, the following values are used ("$name" is automatically -# replaced with the name of the entity): "The $name class" "The $name widget" -# "The $name file" "is" "provides" "specifies" "contains" -# "represents" "a" "an" "the" - -ABBREVIATE_BRIEF = - -# 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 = YES - -# 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. The tag can be used to show relative paths in the file list. -# If left blank the directory from which doxygen is run is used as the -# path to strip. - -STRIP_FROM_PATH = - -# The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of -# the path mentioned in the documentation of a class, which tells -# the reader which header file to include in order to use a class. -# If left blank only the name of the header file containing the class -# definition is used. Otherwise one should specify the include paths that -# are normally passed to the compiler using the -I flag. - -STRIP_FROM_INC_PATH = - -# 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 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 -# explicit @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 -# re-implements. - -INHERIT_DOCS = YES - -# If the SEPARATE_MEMBER_PAGES tag is set to YES, then doxygen will produce -# a new page for each member. If set to NO, the documentation of a member will -# be part of the file/class/namespace that contains it. - -SEPARATE_MEMBER_PAGES = 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 - -# 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 = - -# 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 - -# If you use STL classes (i.e. std::string, std::vector, etc.) but do not want to -# include (a tag file for) the STL sources as input, then you should -# set this tag to YES in order to let doxygen match functions declarations and -# definitions whose arguments contain STL classes (e.g. func(std::string); v.s. -# func(std::string) {}). This also make the inheritance and collaboration -# diagrams that involve STL classes more complete and accurate. - -BUILTIN_STL_SUPPORT = NO - -# 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 - -# Set the SUBGROUPING tag to YES (the default) to allow class member groups of -# the same type (for instance a group of public functions) to be put as a -# subgroup of that type (e.g. under the Public Functions section). Set it to -# NO to prevent subgrouping. Alternatively, this can be done per class using -# the \nosubgrouping command. - -SUBGROUPING = YES - -#--------------------------------------------------------------------------- -# Build related configuration options -#--------------------------------------------------------------------------- - -# 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 = NO - -# 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 = YES - -# 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 = YES - -# This flag is only useful for Objective-C code. When set to YES local -# methods, which are defined in the implementation section but not in -# the interface are included in the documentation. -# If set to NO (the default) only methods in the interface are included. - -EXTRACT_LOCAL_METHODS = 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 classes 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 HIDE_IN_BODY_DOCS tag is set to YES, Doxygen will hide any -# documentation blocks found inside the body of a function. -# If set to NO (the default) these blocks will be appended to the -# function's detailed documentation block. - -HIDE_IN_BODY_DOCS = NO - -# 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 - -# 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 -# and Mac users are advised to set this option to NO. - -CASE_SENSE_NAMES = YES - -# 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 SHOW_INCLUDE_FILES tag is set to YES (the default) then Doxygen -# will put a list of the files that are included by a file in the documentation -# of that file. - -SHOW_INCLUDE_FILES = NO - -# 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 the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the -# brief documentation of file, namespace and class members alphabetically -# by member name. If set to NO (the default) the members will appear in -# declaration order. - -SORT_BRIEF_DOCS = NO - -# If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be -# sorted by fully-qualified names, including namespaces. If set to -# NO (the default), the class list will be sorted only by class name, -# not including the namespace part. -# Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES. -# Note: This option applies only to the class list, not to the -# alphabetical list. - -SORT_BY_SCOPE_NAME = NO - -# 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 - -# 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 consists 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 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 = YES - -# If the sources in your project are distributed over multiple directories -# then setting the SHOW_DIRECTORIES tag to YES will show the directory hierarchy -# in the documentation. The default is NO. - -SHOW_DIRECTORIES = NO - -# The FILE_VERSION_FILTER tag can be used to specify a program or script that -# doxygen should invoke to get the current version for each file (typically from the -# version control system). Doxygen will invoke the program by executing (via -# popen()) the command , where is the value of -# the FILE_VERSION_FILTER tag, and is the name of an input file -# provided by doxygen. Whatever the program writes to standard output -# is used as the file version. See the manual for examples. - -FILE_VERSION_FILTER = - -#--------------------------------------------------------------------------- -# 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 - -# If WARN_IF_DOC_ERROR is set to YES, doxygen will generate warnings for -# potential errors in the documentation, such as not documenting some -# parameters in a documented function, or documenting parameters that -# don't exist or using markup commands wrongly. - -WARN_IF_DOC_ERROR = YES - -# This WARN_NO_PARAMDOC option can be abled to get warnings for -# functions that are documented, but have no documentation for their parameters -# or return value. If set to NO (the default) doxygen will only warn about -# wrong or incomplete parameter documentation, but not about the absence of -# documentation. - -WARN_NO_PARAMDOC = NO - -# 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. Optionally the format may contain -# $version, which will be replaced by the version of the file (if it could -# be obtained via FILE_VERSION_FILTER) - -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 = include/zoo_queue.h - -# 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 *.cs *.php *.php3 *.inc *.m *.mm *.py - -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. Note that the wildcards are matched -# against the file with absolute path, so to exclude all test directories -# for example use the pattern */test/* - -EXCLUDE_PATTERNS = - -# The EXAMPLE_PATH tag can be used to specify one or more files or -# directories that contain example code fragments that are included (see -# the \include command). - -EXAMPLE_PATH = - -# If the value of the EXAMPLE_PATH tag contains directories, you can use the -# EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp -# and *.h) to filter out the source-files in the directories. If left -# blank all files are included. - -EXAMPLE_PATTERNS = - -# If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be -# searched for input files to be used with the \include or \dontinclude -# commands irrespective of the value of the RECURSIVE tag. -# Possible values are YES and NO. If left blank NO is used. - -EXAMPLE_RECURSIVE = NO - -# The IMAGE_PATH tag can be used to specify one or more files or -# directories that contain image that are included in the documentation (see -# the \image command). - -IMAGE_PATH = - -# The INPUT_FILTER tag can be used to specify a program that doxygen should -# invoke to filter for each input file. Doxygen will invoke the filter program -# by executing (via popen()) the command , where -# is the value of the INPUT_FILTER tag, and is the name of an -# input file. Doxygen will then use the output that the filter program writes -# to standard output. If FILTER_PATTERNS is specified, this tag will be -# ignored. - -INPUT_FILTER = - -# The FILTER_PATTERNS tag can be used to specify filters on a per file pattern -# basis. Doxygen will compare the file name with each pattern and apply the -# filter if there is a match. The filters are a list of the form: -# pattern=filter (like *.cpp=my_cpp_filter). See INPUT_FILTER for further -# info on how filters are used. If FILTER_PATTERNS is empty, INPUT_FILTER -# is applied to all files. - -FILTER_PATTERNS = - -# 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. -# Note: To get rid of all source code in the generated output, make sure also -# VERBATIM_HEADERS is set to NO. - -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 - -# 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 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 = YES - -# 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 = YES - -# If the REFERENCES_LINK_SOURCE tag is set to YES (the default) -# and SOURCE_BROWSER tag is set to YES, then the hyperlinks from -# functions in REFERENCES_RELATION and REFERENCED_BY_RELATION lists will -# link to the source code. Otherwise they will link to the documentstion. - -REFERENCES_LINK_SOURCE = YES - -# If the USE_HTAGS tag is set to YES then the references to source code -# will point to the HTML generated by the htags(1) tool instead of doxygen -# built-in source browser. The htags tool is part of GNU's global source -# tagging system (see http://www.gnu.org/software/global/global.html). You -# will need version 4.8.6 or higher. - -USE_HTAGS = 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 - -#--------------------------------------------------------------------------- -# 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 = NO - -# 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 = $(GENERATE_HTML) - -# 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 = html - -# 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. Note that doxygen will try to copy -# the style sheet file to the HTML output directory, so don't put your own -# stylesheet in the HTML output directory as well, or it will be erased! - -HTML_STYLESHEET = - -# 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 = $(GENERATE_HTMLHELP) - -# 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 directory. - -CHM_FILE = ../$(PROJECT).chm - -# 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 = $(HHC_PATH) - -# 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 = $(GENERATE_CHI) - -# 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 = NO - -# 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, DHTML, CSS and frames is required (for instance Mozilla 1.0+, -# Netscape 6.0+, Internet explorer 5.0+, or Konqueror). 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 = $(GENERATE_LATEX) - -# 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 = $(PAPER_SIZE) - -# 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 = $(GENERATE_PDF) - -# 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 - -# If LATEX_HIDE_INDICES is set to YES then doxygen will not -# include the index chapters (such as File Index, Compound Index, etc.) -# in the output. - -LATEX_HIDE_INDICES = 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 optimized for Word 97 and may not look very pretty with -# other RTF readers or editors. - -GENERATE_RTF = $(GENERATE_RTF) - -# 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 assignments. 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 = $(GENERATE_MAN) - -# 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. - -GENERATE_XML = $(GENERATE_XML) - -# The XML_OUTPUT tag is used to specify where the XML 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 `xml' will be used as the default path. - -XML_OUTPUT = xml - -# 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 = - -# If the XML_PROGRAMLISTING tag is set to YES Doxygen will -# dump the program listings (including syntax highlighting -# and cross-referencing information) to the XML output. Note that -# enabling this will significantly increase the size of the XML output. - -XML_PROGRAMLISTING = YES - -#--------------------------------------------------------------------------- -# 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 Perl module output -#--------------------------------------------------------------------------- - -# If the GENERATE_PERLMOD tag is set to YES Doxygen will -# generate a Perl module file that captures the structure of -# the code including all documentation. Note that this -# feature is still experimental and incomplete at the -# moment. - -GENERATE_PERLMOD = NO - -# If the PERLMOD_LATEX tag is set to YES Doxygen will generate -# the necessary Makefile rules, Perl scripts and LaTeX code to be able -# to generate PDF and DVI output from the Perl module output. - -PERLMOD_LATEX = NO - -# If the PERLMOD_PRETTY tag is set to YES the Perl module output will be -# nicely formatted so it can be parsed by a human reader. This is useful -# if you want to understand what is going on. On the other hand, if this -# tag is set to NO the size of the Perl module output will be much smaller -# and Perl will parse it just the same. - -PERLMOD_PRETTY = YES - -# The names of the make variables in the generated doxyrules.make file -# are prefixed with the string contained in PERLMOD_MAKEVAR_PREFIX. -# This is useful so different doxyrules.make files included by the same -# Makefile don't overwrite each other's variables. - -PERLMOD_MAKEVAR_PREFIX = - -#--------------------------------------------------------------------------- -# 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 = YES - -# 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_DEFINED 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. To prevent a macro definition from being -# undefined via #undef or recursively expanded use the := operator -# instead of the = operator. - -PREDEFINED = - -# If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF 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::additions related to external references -#--------------------------------------------------------------------------- - -# The TAGFILES option can be used to specify one or more tagfiles. -# Optionally an initial location of the external documentation -# can be added for each tagfile. The format of a tag file without -# this location is as follows: -# TAGFILES = file1 file2 ... -# Adding location for the tag files is done as follows: -# TAGFILES = file1=loc1 "file2 = loc2" ... -# where "loc1" and "loc2" can be relative or absolute paths or -# URLs. If a location is present for each tag, the installdox tool -# does not have to be run to correct the links. -# Note that each tag file must have a unique name -# (where the name does NOT include the path) -# If a tag file is not located in the directory in which doxygen -# is run, you must also specify the path to the tagfile here. - -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 = $(DOCDIR)/$(PROJECT).tag - -# 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 superseded by the HAVE_DOT option below. This is only a -# fallback. It is recommended to install and use dot, since it yields 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 = $(HAVE_DOT) - -# 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 the GROUP_GRAPHS and HAVE_DOT tags are set to YES then doxygen -# will generate a graph for groups, showing the direct groups dependencies - -GROUP_GRAPHS = YES - -# If the UML_LOOK tag is set to YES doxygen will generate inheritance and -# collaboration diagrams in a style similar to the OMG's Unified Modeling -# Language. - -UML_LOOK = NO - -# If set to YES, the inheritance and collaboration graphs will show the -# relations between templates and their instances. - -TEMPLATE_RELATIONS = NO - -# 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 CALL_GRAPH and HAVE_DOT tags are set to YES then doxygen will -# generate a call dependency graph for every global function or class method. -# Note that enabling this option will significantly increase the time of a run. -# So in most cases it will be better to enable call graphs for selected -# functions only using the \callgraph command. - -CALL_GRAPH = NO - -# If the CALLER_GRAPH and HAVE_DOT tags are set to YES then doxygen will -# generate a caller dependency graph for every global function or class method. -# Note that enabling this option will significantly increase the time of a run. -# So in most cases it will be better to enable caller graphs for selected -# functions only using the \callergraph command. - -CALLER_GRAPH = NO - -# 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 - -# If the DIRECTORY_GRAPH, SHOW_DIRECTORIES and HAVE_DOT tags are set to YES -# then doxygen will show the dependencies a directory has on other directories -# in a graphical way. The dependency relations are determined by the #include -# relations between the files in the directories. - -DIRECTORY_GRAPH = 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 in the path. - -DOT_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 - -# The MAX_DOT_GRAPH_DEPTH tag can be used to set the maximum depth of the -# graphs generated by dot. A depth value of 3 means that only nodes reachable -# from the root by following a path via at most 3 edges will be shown. Nodes -# that lay further from the root node will be omitted. Note that setting this -# option to 1 or 2 may greatly reduce the computation time needed for large -# code bases. Also note that a graph may be further truncated if the graph's -# image dimensions are not sufficient to fit the graph (see MAX_DOT_GRAPH_WIDTH -# and MAX_DOT_GRAPH_HEIGHT). If 0 is used for the depth value (the default), -# the graph is not depth-constrained. - -MAX_DOT_GRAPH_DEPTH = 0 - -# Set the DOT_TRANSPARENT tag to YES to generate images with a transparent -# background. This is disabled by default, which results in a white background. -# Warning: Depending on the platform used, enabling this option may lead to -# badly anti-aliased labels on the edges of a graph (i.e. they become hard to -# read). - -DOT_TRANSPARENT = NO - -# Set the DOT_MULTI_TARGETS tag to YES allow dot to generate multiple output -# files in one run (i.e. multiple -o and -T options on the command line). This -# makes dot run faster, but since only newer versions of dot (>1.8.10) -# support this, this feature is disabled by default. - -DOT_MULTI_TARGETS = NO - -# 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 intermediate dot files that are used to generate -# the various graphs. - -DOT_CLEANUP = YES - -#--------------------------------------------------------------------------- -# Configuration::additions 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 diff --git a/pkg/registry/zookeeper-3.4.6/src/recipes/queue/src/c/configure.ac b/pkg/registry/zookeeper-3.4.6/src/recipes/queue/src/c/configure.ac deleted file mode 100644 index a9fb7b130..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/recipes/queue/src/c/configure.ac +++ /dev/null @@ -1,82 +0,0 @@ -# Licensed to the Apache Software Foundation (ASF) under one -# or more contributor license agreements. See the NOTICE file -# distributed with this work for additional information -# regarding copyright ownership. The ASF licenses this file -# to you 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. -# -*- Autoconf -*- -# Process this file with autoconf to produce a configure script. - -AC_PREREQ(2.59) - -AC_INIT([zooqueue], [3.2.0]) - -AC_CONFIG_SRCDIR([include/zoo_queue.h]) - -PACKAGE=zooqueue -VERSION=1.0 - -AC_SUBST(PACKAGE) -AC_SUBST(VERSION) - -BUILD_PATH="`pwd`" - -# Checks for programs. -AC_LANG_CPLUSPLUS - -AM_INIT_AUTOMAKE([-Wall foreign]) -# Checks for libraries. - -#initialize Doxygen support -DX_HTML_FEATURE(ON) -DX_CHM_FEATURE(OFF) -DX_CHI_FEATURE(OFF) -DX_MAN_FEATURE(OFF) -DX_RTF_FEATURE(OFF) -DX_XML_FEATURE(OFF) -DX_PDF_FEATURE(OFF) -DX_PS_FEATURE(OFF) -DX_INIT_DOXYGEN([zookeeper-queues],[c-doc.Doxyfile],[docs]) - - -ZOOKEEPER_PATH=${BUILD_PATH}/../../../../../src/c -ZOOKEEPER_LD=-L${BUILD_PATH}/../../../../../src/c\ -lzookeeper_mt - -AC_SUBST(ZOOKEEPER_PATH) -AC_SUBST(ZOOKEEPER_LD) - -# Checks for header files. -AC_HEADER_DIRENT -AC_HEADER_STDC -AC_CHECK_HEADERS([fcntl.h stdlib.h string.h sys/time.h unistd.h]) - -# Checks for typedefs, structures, and compiler characteristics. -AC_HEADER_STDBOOL -AC_C_CONST -AC_TYPE_UID_T -AC_C_INLINE -AC_TYPE_OFF_T -AC_TYPE_SIZE_T -AC_STRUCT_ST_BLOCKS -AC_HEADER_TIME -AC_C_VOLATILE -AC_PROG_CC -AC_PROG_LIBTOOL -#check for cppunit -AM_PATH_CPPUNIT(1.10.2) -# Checks for library functions. -AC_FUNC_UTIME_NULL -AC_CHECK_FUNCS([gettimeofday memset mkdir rmdir strdup strerror strstr strtol strtoul strtoull utime]) - -AC_CONFIG_FILES([Makefile]) -AC_OUTPUT -AC_C_VOLATILE diff --git a/pkg/registry/zookeeper-3.4.6/src/recipes/queue/src/c/include/zoo_queue.h b/pkg/registry/zookeeper-3.4.6/src/recipes/queue/src/c/include/zoo_queue.h deleted file mode 100644 index ccc4602f6..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/recipes/queue/src/c/include/zoo_queue.h +++ /dev/null @@ -1,118 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you 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. - */ - -#ifndef ZOOKEEPER_QUEUE_H_ -#define ZOOKEEPER_QUEUE_H_ - -#include -#include - -#ifdef __cplusplus -extern "C" { -#endif - - -/** - * \file zoo_queue.h - * \brief zookeeper recipe for queues. - */ - - -struct zkr_queue { - zhandle_t *zh; - char *path; - struct ACL_vector *acl; - pthread_mutex_t pmutex; - char *node_name; - int node_name_length; - char *cached_create_path; -}; - -typedef struct zkr_queue zkr_queue_t; - - -/** - * \brief initializes a zookeeper queue - * - * this method instantiates a zookeeper queue - * \param queue the zookeeper queue to initialize - * \param zh the zookeeper handle to use - * \param path the path in zookeeper to use for the queue - * \param acl the acl to use in zookeeper. - * \return return 0 if successful. - */ -ZOOAPI int zkr_queue_init(zkr_queue_t *queue, zhandle_t* zh, char* path, struct ACL_vector *acl); - -/** - * \brief adds an element to a zookeeper queue - * - * this method adds an element to the back of a zookeeper queue. - * \param queue the zookeeper queue to add the element to - * \param data a pointer to a data buffer - * \param buffer_len the length of the buffer - * \return returns 0 (ZOK) if successful, otherwise returns a zookeeper error code. - */ -ZOOAPI int zkr_queue_offer(zkr_queue_t *queue, const char *data, int buffer_len); - -/** - * \brief returns the head of a zookeeper queue - * - * this method returns the head of a zookeeper queue without removing it. - * \param queue the zookeeper queue to add the element to - * \param buffer a pointer to a data buffer - * \param buffer_len a pointer to the length of the buffer - * \return returns 0 (ZOK) and sets *buffer_len to the length of data written if successful (-1 if the queue is empty). Otherwise it will set *buffer_len to -1 and return a zookeeper error code. - */ -ZOOAPI int zkr_queue_element(zkr_queue_t *queue, char *buffer, int *buffer_len); - -/** - * \brief returns the head of a zookeeper queue - * - * this method returns the head of a zookeeper queue without removing it. - * \param queue the zookeeper queue to get the head of - * \param buffer a pointer to a data buffer - * \param buffer_len a pointer to the length of the buffer - * \return returns 0 (ZOK) and sets *buffer_len to the length of data written if successful (-1 if the queue is empty). Otherwise it will set *buffer_len to -1 and return a zookeeper error code. - */ -ZOOAPI int zkr_queue_remove(zkr_queue_t *queue, char *buffer, int *buffer_len); - -/** - * \brief removes and returns the head of a zookeeper queue, blocks if necessary - * - * this method returns the head of a zookeeper queue without removing it. - * \param queue the zookeeper queue to remove and return the head of - * \param buffer a pointer to a data buffer - * \param buffer_len a pointer to the length of the buffer - * \return returns 0 (ZOK) and sets *buffer_len to the length of data written if successful. Otherwise it will set *buffer_len to -1 and return a zookeeper error code. - */ -ZOOAPI int zkr_queue_take(zkr_queue_t *queue, char *buffer, int *buffer_len); - -/** - * \brief destroys a zookeeper queue structure - * - * this destroys a zookeeper queue structure, this is only a local operation and will not affect - * the state of the queue on the zookeeper server. - * \param queue the zookeeper queue to destroy - */ -void zkr_queue_destroy(zkr_queue_t *queue); - - -#ifdef __cplusplus -} -#endif -#endif //ZOOKEEPER_QUEUE_H_ diff --git a/pkg/registry/zookeeper-3.4.6/src/recipes/queue/src/c/src/zoo_queue.c b/pkg/registry/zookeeper-3.4.6/src/recipes/queue/src/c/src/zoo_queue.c deleted file mode 100644 index 89ec24b6e..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/recipes/queue/src/c/src/zoo_queue.c +++ /dev/null @@ -1,442 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you 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. - */ - -#ifdef DLL_EXPORT -#define USE_STATIC_LIB -#endif - -#if defined(__CYGWIN__) -#define USE_IPV6 -#endif - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#ifdef HAVE_SYS_UTSNAME_H -#include -#endif - -#ifdef HAVE_GETPWUID_R -#include -#endif - -#define IF_DEBUG(x) if (logLevel==ZOO_LOG_LEVEL_DEBUG) {x;} - - -static void free_String_vector(struct String_vector *v) { - if (v->data) { - int32_t i; - for (i=0; icount; i++) { - free(v->data[i]); - } - free(v->data); - v->data = 0; - } -} - - -static int vstrcmp(const void* str1, const void* str2) { - const char **a = (const char**)str1; - const char **b = (const char**) str2; - return strcmp(*a, *b); -} - -static void sort_children(struct String_vector *vector) { - qsort( vector->data, vector->count, sizeof(char*), &vstrcmp); -} - - -static void concat_path_nodename_n(char *buffer, int len, const char *path, const char *node_name){ - snprintf(buffer, len, "%s/%s", path, node_name); -} - -static char *concat_path_nodename(const char *path, const char *node_name){ - int node_path_length = strlen(path) + 1+ strlen(node_name) +1; - char *node_path = (char *) malloc(node_path_length * sizeof(char)); - concat_path_nodename_n(node_path, node_path_length, path, node_name); - return node_path; -} - - -static void zkr_queue_cache_create_path(zkr_queue_t *queue){ - if(queue->cached_create_path != NULL){ - free(queue->cached_create_path); - } - queue->cached_create_path = concat_path_nodename(queue->path, queue->node_name); -} - -ZOOAPI int zkr_queue_init(zkr_queue_t *queue, zhandle_t* zh, char* path, struct ACL_vector *acl){ - queue->zh = zh; - queue->path = path; - queue->node_name = "qn-"; - queue->node_name_length = strlen(queue->node_name); - queue->cached_create_path = NULL; - queue->acl = acl; - pthread_mutex_init(&(queue->pmutex), NULL); - zkr_queue_cache_create_path(queue); - return 0; -} - -static ZOOAPI int create_queue_root(zkr_queue_t *queue){ - return zoo_create(queue->zh, queue->path, NULL, 0, queue->acl, 0, NULL, 0 ); -} - -static int valid_child_name(zkr_queue_t *queue, const char *child_name){ - return strncmp(queue->node_name, child_name, queue->node_name_length); -} - -ZOOAPI int zkr_queue_offer(zkr_queue_t *queue, const char *data, int buffer_len){ - for(;;){ - int rc = zoo_create(queue->zh, queue->cached_create_path, data, buffer_len, queue->acl, ZOO_SEQUENCE, NULL, 0 ); - switch(rc){ - int create_root_rc; - case ZNONODE: - create_root_rc = create_queue_root(queue); - switch(create_root_rc){ - case ZNODEEXISTS: - case ZOK: - break; - default: - return create_root_rc; - } - break; - default: - return rc; - } - } -} - - -ZOOAPI int zkr_queue_element(zkr_queue_t *queue, char *buffer, int *buffer_len){ - int path_length = strlen(queue->path); - for(;;){ - struct String_vector stvector; - struct String_vector *vector = &stvector; - /*Get sorted children*/ - int get_children_rc = zoo_get_children(queue->zh, queue->path, 0, vector); - switch(get_children_rc){ - case ZOK: - break; - case ZNONODE: - *buffer_len = -1; - return ZOK; - default: - return get_children_rc; - } - if(stvector.count == 0){ - *buffer_len = -1; - return ZOK; - } - - sort_children(vector); - /*try all*/ - int i; - for(i=0; i < stvector.count; i++){ - char *child_name = stvector.data[i]; - int child_path_length = path_length + 1 + strlen(child_name) +1; - char child_path[child_path_length]; - concat_path_nodename_n(child_path, child_path_length, queue->path, child_name); - int get_rc = zoo_get(queue->zh, child_path, 0, buffer, buffer_len, NULL); - switch(get_rc){ - case ZOK: - free_String_vector(vector); - return ZOK; - case ZNONODE: - break; - default: - free_String_vector(vector); - return get_rc; - } - } - - free_String_vector(vector); - } -} - -ZOOAPI int zkr_queue_remove(zkr_queue_t *queue, char *buffer, int *buffer_len){ - int path_length = strlen(queue->path); - for(;;){ - struct String_vector stvector; - struct String_vector *vector = &stvector; - /*Get sorted children*/ - int get_children_rc = zoo_get_children(queue->zh, queue->path, 0, &stvector); - switch(get_children_rc){ - case ZOK: - break; - case ZNONODE: - *buffer_len = -1; - return ZOK; - - default: - *buffer_len = -1; - return get_children_rc; - } - if(stvector.count == 0){ - *buffer_len = -1; - return ZOK; - } - - sort_children(vector); - /*try all*/ - int i; - for( i=0; i < stvector.count; i++){ - char *child_name = stvector.data[i]; - int child_path_length = path_length + 1 + strlen(child_name) +1; - char child_path[child_path_length]; - concat_path_nodename_n(child_path, child_path_length, queue->path, child_name); - int get_rc = zoo_get(queue->zh, child_path, 0, buffer, buffer_len, NULL); - switch(get_rc){ - int delete_rc; - case ZOK: - delete_rc = zoo_delete(queue->zh, child_path, -1); - switch(delete_rc){ - case ZOK: - free_String_vector(vector); - return delete_rc; - case ZNONODE: - break; - default: - free_String_vector(vector); - *buffer_len = -1; - return delete_rc; - } - break; - case ZNONODE: - break; - default: - free_String_vector(vector); - *buffer_len = -1; - return get_rc; - } - } - free_String_vector(vector); - } -} - -/** - * The take_latch structure roughly emulates a Java CountdownLatch with 1 as the initial value. - * It is meant to be used by a setter thread and a waiter thread. - * - * This latch is specialized to be used with the queue, all latches created for the same queue structure will use the same mutex. - * - * The setter thread at some point will call take_latch_setter_trigger_latch() on the thread. - * - * The waiter thread creates the latch and at some point either calls take_latch_waiter_await()s or take_latch_waiter_mark_unneeded()s it. - * The await function will return after the setter thread has triggered the latch. - * The mark unneeded function will return immediately and avoid some unneeded initialization. - * - * Whichever thread is last to call their required function disposes of the latch. - * - * The latch may disposed if no threads will call the waiting, marking, or triggering functions using take_latch_destroy_syncrhonized(). - */ - -struct take_latch { - enum take_state {take_init, take_waiting, take_triggered, take_not_needed} state; - pthread_cond_t latch_condition; - zkr_queue_t *queue; -}; - - -typedef struct take_latch take_latch_t; - - -static void take_latch_init( take_latch_t *latch, zkr_queue_t *queue){ - pthread_mutex_t *mutex = &(queue->pmutex); - pthread_mutex_lock(mutex); - latch->state = take_init; - latch->queue = queue; - pthread_mutex_unlock(mutex); -} - -static take_latch_t *create_take_latch(zkr_queue_t *queue){ - take_latch_t *new_take_latch = (take_latch_t *) malloc(sizeof(take_latch_t)); - take_latch_init(new_take_latch, queue); - return new_take_latch; -} - - -//Only call this when you own the mutex -static void take_latch_destroy_unsafe(take_latch_t *latch){ - if(latch->state == take_waiting){ - pthread_cond_destroy(&(latch->latch_condition)); - } - free(latch); -} - -static void take_latch_destroy_synchronized(take_latch_t *latch){ - pthread_mutex_t *mutex = &(latch->queue->pmutex); - pthread_mutex_lock(mutex); - take_latch_destroy_unsafe(latch); - pthread_mutex_unlock(mutex); -} - -static void take_latch_setter_trigger_latch(take_latch_t *latch){ - pthread_mutex_t *mutex = &(latch->queue->pmutex); - pthread_mutex_lock(mutex); - switch(latch->state){ - case take_init: - latch->state = take_triggered; - break; - case take_not_needed: - take_latch_destroy_unsafe(latch); - break; - case take_triggered: - LOG_DEBUG(("Error! Latch was triggered twice.")); - break; - case take_waiting: - pthread_cond_signal(&(latch->latch_condition)); - break; - } - pthread_mutex_unlock(mutex); -} - -static void take_latch_waiter_await(take_latch_t *latch){ - pthread_mutex_t *mutex = &(latch->queue->pmutex); - pthread_mutex_lock(mutex); - switch(latch->state){ - case take_init: - pthread_cond_init(&(latch->latch_condition),NULL); - latch->state = take_waiting; - pthread_cond_wait(&(latch->latch_condition),mutex); - take_latch_destroy_unsafe(latch); - break; - case take_waiting: - LOG_DEBUG(("Error! Called await twice.")); - break; - case take_not_needed: - LOG_DEBUG(("Error! Waiting after marking not needed.")); - break; - case take_triggered: - take_latch_destroy_unsafe(latch); - break; - } - pthread_mutex_unlock(mutex); -} - -static void take_latch_waiter_mark_unneeded(take_latch_t *latch){ - pthread_mutex_t *mutex = &(latch->queue->pmutex); - pthread_mutex_lock(mutex); - switch(latch->state){ - case take_init: - latch->state = take_not_needed; - break; - case take_waiting: - LOG_DEBUG(("Error! Can't mark unneeded after waiting.")); - break; - case take_not_needed: - LOG_DEBUG(("Marked unneeded twice.")); - break; - case take_triggered: - take_latch_destroy_unsafe(latch); - break; - } - pthread_mutex_unlock(mutex); -} - -static void take_watcher(zhandle_t *zh, int type, int state, const char *path, void *watcherCtx){ - take_latch_t *latch = (take_latch_t *) watcherCtx; - take_latch_setter_trigger_latch(latch); -} - - - -ZOOAPI int zkr_queue_take(zkr_queue_t *queue, char *buffer, int *buffer_len){ - int path_length = strlen(queue->path); -take_attempt: - for(;;){ - struct String_vector stvector; - struct String_vector *vector = &stvector; - /*Get sorted children*/ - take_latch_t *take_latch = create_take_latch(queue); - int get_children_rc = zoo_wget_children(queue->zh, queue->path, take_watcher, take_latch, &stvector); - switch(get_children_rc){ - case ZOK: - break; - int create_queue_rc; - case ZNONODE: - take_latch_destroy_synchronized(take_latch); - create_queue_rc = create_queue_root(queue); - switch(create_queue_rc){ - case ZNODEEXISTS: - case ZOK: - goto take_attempt; - default: - *buffer_len = -1; - return create_queue_rc; - } - default: - take_latch_destroy_synchronized(take_latch); - *buffer_len = -1; - return get_children_rc; - } - if(stvector.count == 0){ - take_latch_waiter_await(take_latch); - }else{ - take_latch_waiter_mark_unneeded(take_latch); - } - - sort_children(vector); - /*try all*/ - int i; - for( i=0; i < stvector.count; i++){ - char *child_name = stvector.data[i]; - int child_path_length = path_length + 1 + strlen(child_name) +1; - char child_path[child_path_length]; - concat_path_nodename_n(child_path, child_path_length, queue->path, child_name); - int get_rc = zoo_get(queue->zh, child_path, 0, buffer, buffer_len, NULL); - switch(get_rc){ - int delete_rc; - case ZOK: - delete_rc = zoo_delete(queue->zh, child_path, -1); - switch(delete_rc){ - case ZOK: - free_String_vector(vector); - return delete_rc; - case ZNONODE: - break; - default: - free_String_vector(vector); - *buffer_len = -1; - return delete_rc; - } - break; - case ZNONODE: - break; - default: - free_String_vector(vector); - *buffer_len = -1; - return get_rc; - } - } - free_String_vector(vector); - } -} - -ZOOAPI void zkr_queue_destroy(zkr_queue_t *queue){ - pthread_mutex_destroy(&(queue->pmutex)); - if(queue->cached_create_path != NULL){ - free(queue->cached_create_path); - } -} diff --git a/pkg/registry/zookeeper-3.4.6/src/recipes/queue/src/c/tests/TestClient.cc b/pkg/registry/zookeeper-3.4.6/src/recipes/queue/src/c/tests/TestClient.cc deleted file mode 100644 index 5446d9b82..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/recipes/queue/src/c/tests/TestClient.cc +++ /dev/null @@ -1,452 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you 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. - */ - -#include - -#include -#include -#include -#include -#include - - -using namespace std; - -#include -#include - -#include -#include - -static void yield(zhandle_t *zh, int i) -{ - sleep(i); -} - -typedef struct evt { - string path; - int type; -} evt_t; - -typedef struct watchCtx { -private: - list events; -public: - bool connected; - zhandle_t *zh; - - watchCtx() { - connected = false; - zh = 0; - } - ~watchCtx() { - if (zh) { - zookeeper_close(zh); - zh = 0; - } - } - - evt_t getEvent() { - evt_t evt; - evt = events.front(); - events.pop_front(); - return evt; - } - - int countEvents() { - int count; - count = events.size(); - return count; - } - - void putEvent(evt_t evt) { - events.push_back(evt); - } - - bool waitForConnected(zhandle_t *zh) { - time_t expires = time(0) + 10; - while(!connected && time(0) < expires) { - yield(zh, 1); - } - return connected; - } - bool waitForDisconnected(zhandle_t *zh) { - time_t expires = time(0) + 15; - while(connected && time(0) < expires) { - yield(zh, 1); - } - return !connected; - } -} watchctx_t; - -extern "C" { - - const char *thread_test_string="Hello World!"; - - void *offer_thread_shared_queue(void *queue_handle){ - zkr_queue_t *queue = (zkr_queue_t *) queue_handle; - - int test_string_buffer_length = strlen(thread_test_string) + 1; - int offer_rc = zkr_queue_offer(queue, thread_test_string, test_string_buffer_length); - pthread_exit(NULL); - } - - void *take_thread_shared_queue(void *queue_handle){ - zkr_queue_t *queue = (zkr_queue_t *) queue_handle; - - int test_string_buffer_length = strlen(thread_test_string) + 1; - int receive_buffer_capacity = test_string_buffer_length; - int receive_buffer_length = receive_buffer_capacity; - char *receive_buffer = (char *) malloc(sizeof(char) * receive_buffer_capacity); - - int remove_rc = zkr_queue_take(queue, receive_buffer, &receive_buffer_length); - switch(remove_rc){ - case ZOK: - pthread_exit(receive_buffer); - default: - free(receive_buffer); - pthread_exit(NULL); - } - } - - int valid_test_string(void *result){ - char *result_string = (char *) result; - return !strncmp(result_string, thread_test_string, strlen(thread_test_string)); - } -} - -class Zookeeper_queuetest : public CPPUNIT_NS::TestFixture -{ - CPPUNIT_TEST_SUITE(Zookeeper_queuetest); - CPPUNIT_TEST(testInitDestroy); - CPPUNIT_TEST(testOffer1); - CPPUNIT_TEST(testOfferRemove1); - CPPUNIT_TEST(testOfferRemove2); - CPPUNIT_TEST(testOfferRemove3); - CPPUNIT_TEST(testOfferRemove4); - CPPUNIT_TEST(testOfferRemove5); - CPPUNIT_TEST(testOfferRemove6); - CPPUNIT_TEST(testOfferTake1); - CPPUNIT_TEST(testOfferTake2); - CPPUNIT_TEST(testOfferTake3); - CPPUNIT_TEST(testOfferTake4); - CPPUNIT_TEST(testOfferTake5); - CPPUNIT_TEST(testOfferTake6); - CPPUNIT_TEST_SUITE_END(); - - static void watcher(zhandle_t *, int type, int state, const char *path,void*v){ - watchctx_t *ctx = (watchctx_t*)v; - - if (state == ZOO_CONNECTED_STATE) { - ctx->connected = true; - } else { - ctx->connected = false; - } - if (type != ZOO_SESSION_EVENT) { - evt_t evt; - evt.path = path; - evt.type = type; - ctx->putEvent(evt); - } - } - - static const char hostPorts[]; - - const char *getHostPorts() { - return hostPorts; - } - - zhandle_t *createClient(watchctx_t *ctx) { - zhandle_t *zk = zookeeper_init(hostPorts, watcher, 10000, 0, - ctx, 0); - ctx->zh = zk; - sleep(1); - return zk; - } - -public: - -#define ZKSERVER_CMD "./tests/zkServer.sh" - - void setUp() - { - char cmd[1024]; - sprintf(cmd, "%s startClean %s", ZKSERVER_CMD, getHostPorts()); - CPPUNIT_ASSERT(system(cmd) == 0); - } - - - void startServer() { - char cmd[1024]; - sprintf(cmd, "%s start %s", ZKSERVER_CMD, getHostPorts()); - CPPUNIT_ASSERT(system(cmd) == 0); - } - - void stopServer() { - tearDown(); - } - - void tearDown() - { - char cmd[1024]; - sprintf(cmd, "%s stop %s", ZKSERVER_CMD, getHostPorts()); - CPPUNIT_ASSERT(system(cmd) == 0); - } - - void initializeQueuesAndHandles(int num_clients, zhandle_t *zoohandles[], - watchctx_t ctxs[], zkr_queue_t queues[], char *path){ - int i; - for(i=0; i< num_clients; i++){ - zoohandles[i] = createClient(&ctxs[i]); - zkr_queue_init(&queues[i], zoohandles[i], path, &ZOO_OPEN_ACL_UNSAFE); - } - } - - void cleanUpQueues(int num_clients, zkr_queue_t queues[]){ - int i; - for(i=0; i < num_clients; i++){ - zkr_queue_destroy(&queues[i]); - } - } - - void testInitDestroy(){ - int num_clients = 1; - watchctx_t ctxs[num_clients]; - zhandle_t *zoohandles[num_clients]; - zkr_queue_t queues[num_clients]; - char *path= (char *)"/testInitDestroy"; - - int i; - for(i=0; i< num_clients; i++){ - zoohandles[i] = createClient(&ctxs[i]); - zkr_queue_init(&queues[i], zoohandles[i], path, &ZOO_OPEN_ACL_UNSAFE); - } - - for(i=0; i< num_clients; i++){ - zkr_queue_destroy(&queues[i]); - } - - } - - void testOffer1(){ - int num_clients = 1; - watchctx_t ctxs[num_clients]; - zhandle_t *zoohandles[num_clients]; - zkr_queue_t queues[num_clients]; - char *path= (char *)"/testOffer1"; - - initializeQueuesAndHandles(num_clients, zoohandles, ctxs, queues, path); - - const char *test_string="Hello World!"; - int test_string_length = strlen(test_string); - int test_string_buffer_length = test_string_length + 1; - char buffer[test_string_buffer_length]; - - int offer_rc = zkr_queue_offer(&queues[0], test_string, test_string_buffer_length); - CPPUNIT_ASSERT(offer_rc == ZOK); - - int removed_element_buffer_length = test_string_buffer_length; - int remove_rc = zkr_queue_remove(&queues[0], buffer, &removed_element_buffer_length); - CPPUNIT_ASSERT(remove_rc == ZOK); - CPPUNIT_ASSERT(removed_element_buffer_length == test_string_buffer_length); - CPPUNIT_ASSERT(strncmp(test_string,buffer,test_string_length)==0); - - cleanUpQueues(num_clients,queues); - } - - void create_n_remove_m(char *path, int n, int m){ - int num_clients = 2; - watchctx_t ctxs[num_clients]; - zhandle_t *zoohandles[num_clients]; - zkr_queue_t queues[num_clients]; - - initializeQueuesAndHandles(num_clients, zoohandles, ctxs, queues, path); - - int i; - int max_digits = sizeof(int)*3; - const char *test_string = "Hello World!"; - int buffer_length = strlen(test_string) + max_digits + 1; - char correct_buffer[buffer_length]; - char receive_buffer[buffer_length]; - - for(i = 0; i < n; i++){ - snprintf(correct_buffer, buffer_length, "%s%d", test_string,i); - int offer_rc = zkr_queue_offer(&queues[0], correct_buffer, buffer_length); - CPPUNIT_ASSERT(offer_rc == ZOK); - } - printf("Offers\n"); - for(i=0; i=n){ - CPPUNIT_ASSERT(receive_buffer_length == -1); - }else{ - CPPUNIT_ASSERT(strncmp(correct_buffer,receive_buffer, buffer_length)==0); - } - } - - cleanUpQueues(num_clients,queues); - } - - void testOfferRemove1(){ - create_n_remove_m((char *)"/testOfferRemove1", 0,1); - } - - void testOfferRemove2(){ - create_n_remove_m((char *)"/testOfferRemove2", 1,1); - } - - void testOfferRemove3(){ - create_n_remove_m((char *)"/testOfferRemove3", 10,1); - } - - void testOfferRemove4(){ - create_n_remove_m((char *)"/testOfferRemove4", 10,10); - } - - void testOfferRemove5(){ - create_n_remove_m((char *)"/testOfferRemove5", 10,5); - } - - void testOfferRemove6(){ - create_n_remove_m((char *)"/testOfferRemove6", 10,11); - } - - void create_n_take_m(char *path, int n, int m){ - CPPUNIT_ASSERT(m<=n); - int num_clients = 2; - watchctx_t ctxs[num_clients]; - zhandle_t *zoohandles[num_clients]; - zkr_queue_t queues[num_clients]; - - initializeQueuesAndHandles(num_clients, zoohandles, ctxs, queues, path); - - int i; - int max_digits = sizeof(int)*3; - const char *test_string = "Hello World!"; - int buffer_length = strlen(test_string) + max_digits + 1; - char correct_buffer[buffer_length]; - char receive_buffer[buffer_length]; - - for(i = 0; i < n; i++){ - snprintf(correct_buffer, buffer_length, "%s%d", test_string,i); - int offer_rc = zkr_queue_offer(&queues[0], correct_buffer, buffer_length); - CPPUNIT_ASSERT(offer_rc == ZOK); - } - printf("Offers\n"); - for(i=0; i=n){ - CPPUNIT_ASSERT(receive_buffer_length == -1); - }else{ - CPPUNIT_ASSERT(strncmp(correct_buffer,receive_buffer, buffer_length)==0); - } - } - - cleanUpQueues(num_clients,queues); - } - - void testOfferTake1(){ - create_n_take_m((char *)"/testOfferTake1", 2,1); - } - - void testOfferTake2(){ - create_n_take_m((char *)"/testOfferTake2", 1,1); - } - - void testOfferTake3(){ - create_n_take_m((char *)"/testOfferTake3", 10,1); - } - - void testOfferTake4(){ - create_n_take_m((char *)"/testOfferTake4", 10,10); - } - - void testOfferTake5(){ - create_n_take_m((char *)"/testOfferTake5", 10,5); - } - - void testOfferTake6(){ - create_n_take_m((char *)"/testOfferTake6", 12,11); - } - - void testTakeThreaded(){ - int num_clients = 1; - watchctx_t ctxs[num_clients]; - zhandle_t *zoohandles[num_clients]; - zkr_queue_t queues[num_clients]; - char *path=(char *)"/testTakeThreaded"; - - initializeQueuesAndHandles(num_clients, zoohandles, ctxs, queues, path); - pthread_t take_thread; - - pthread_create(&take_thread, NULL, take_thread_shared_queue, (void *) &queues[0]); - - usleep(1000); - - pthread_t offer_thread; - pthread_create(&offer_thread, NULL, offer_thread_shared_queue, (void *) &queues[0]); - pthread_join(offer_thread, NULL); - - void *take_thread_result; - pthread_join(take_thread, &take_thread_result); - CPPUNIT_ASSERT(take_thread_result != NULL); - CPPUNIT_ASSERT(valid_test_string(take_thread_result)); - - cleanUpQueues(num_clients,queues); - } - - void testTakeThreaded2(){ - int num_clients = 1; - watchctx_t ctxs[num_clients]; - zhandle_t *zoohandles[num_clients]; - zkr_queue_t queues[num_clients]; - char *path=(char *)"/testTakeThreaded2"; - - initializeQueuesAndHandles(num_clients, zoohandles, ctxs, queues, path); - - int take_attempts; - int num_take_attempts = 2; - for(take_attempts=0; take_attempts < num_take_attempts; take_attempts++){ - pthread_t take_thread; - - pthread_create(&take_thread, NULL, take_thread_shared_queue, (void *) &queues[0]); - - usleep(1000); - - pthread_t offer_thread; - pthread_create(&offer_thread, NULL, offer_thread_shared_queue, (void *) &queues[0]); - pthread_join(offer_thread, NULL); - - void *take_thread_result; - pthread_join(take_thread, &take_thread_result); - CPPUNIT_ASSERT(take_thread_result != NULL); - CPPUNIT_ASSERT(valid_test_string(take_thread_result)); - - } - cleanUpQueues(num_clients,queues); - } -}; - -const char Zookeeper_queuetest::hostPorts[] = "127.0.0.1:22181"; -CPPUNIT_TEST_SUITE_REGISTRATION(Zookeeper_queuetest); diff --git a/pkg/registry/zookeeper-3.4.6/src/recipes/queue/src/c/tests/TestDriver.cc b/pkg/registry/zookeeper-3.4.6/src/recipes/queue/src/c/tests/TestDriver.cc deleted file mode 100644 index 2b818f450..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/recipes/queue/src/c/tests/TestDriver.cc +++ /dev/null @@ -1,114 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you 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. - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include "Util.h" - -using namespace std; - -CPPUNIT_NS_BEGIN - -class EclipseOutputter: public CompilerOutputter -{ -public: - EclipseOutputter(TestResultCollector *result,ostream &stream): - CompilerOutputter(result,stream,"%p:%l: "),stream_(stream) - { - } - virtual void printFailedTestName( TestFailure *failure ){} - virtual void printFailureMessage( TestFailure *failure ) - { - stream_<<": "; - Message msg = failure->thrownException()->message(); - stream_<< msg.shortDescription(); - - string text; - for(int i=0; i the output must be in the compiler error format. - //bool selfTest = (argc > 1) && (std::string("-ide") == argv[1]); - globalTestConfig.addConfigFromCmdLine(argc,argv); - - // Create the event manager and test controller - CPPUNIT_NS::TestResult controller; - // Add a listener that colllects test result - CPPUNIT_NS::TestResultCollector result; - controller.addListener( &result ); - - // Add a listener that print dots as tests run. - // CPPUNIT_NS::TextTestProgressListener progress; - CPPUNIT_NS::BriefTestProgressListener progress; - controller.addListener( &progress ); - - CPPUNIT_NS::TestRunner runner; - runner.addTest( CPPUNIT_NS::TestFactoryRegistry::getRegistry().makeTest() ); - - try - { - cout << "Running " << globalTestConfig.getTestName(); - runner.run( controller, globalTestConfig.getTestName()); - cout< -#include -#include - -// number of elements in array -#define COUNTOF(array) sizeof(array)/sizeof(array[0]) - -#define DECLARE_WRAPPER(ret,sym,sig) \ - extern "C" ret __real_##sym sig; \ - extern "C" ret __wrap_##sym sig - -#define CALL_REAL(sym,params) \ - __real_##sym params - -// must include "src/zookeeper_log.h" to be able to use this macro -#define TEST_TRACE(x) \ - log_message(3,__LINE__,__func__,format_log_message x) - -extern const std::string EMPTY_STRING; - -// ***************************************************************************** -// A bit of wizardry to get to the bare type from a reference or a pointer -// to the type -template -struct TypeOp { - typedef T BareT; - typedef T ArgT; -}; - -// partial specialization for reference types -template -struct TypeOp{ - typedef T& ArgT; - typedef typename TypeOp::BareT BareT; -}; - -// partial specialization for pointers -template -struct TypeOp{ - typedef T* ArgT; - typedef typename TypeOp::BareT BareT; -}; - -// ***************************************************************************** -// Container utilities - -template -void putValue(std::map& map,const K& k, const V& v){ - typedef std::map Map; - typename Map::const_iterator it=map.find(k); - if(it==map.end()) - map.insert(typename Map::value_type(k,v)); - else - map[k]=v; -} - -template -bool getValue(const std::map& map,const K& k,V& v){ - typedef std::map Map; - typename Map::const_iterator it=map.find(k); - if(it==map.end()) - return false; - v=it->second; - return true; -} - -// ***************************************************************************** -// misc utils - -// millisecond sleep -void millisleep(int ms); -// evaluate given predicate until it returns true or the timeout -// (in millis) has expired -template -int ensureCondition(const Predicate& p,int timeout){ - int elapsed=0; - while(!p() && elapsed CmdLineOptList; -public: - typedef CmdLineOptList::const_iterator const_iterator; - TestConfig(){} - ~TestConfig(){} - void addConfigFromCmdLine(int argc, char* argv[]){ - if(argc>=2) - testName_=argv[1]; - for(int i=2; i /tmp/zk.log & - echo $! > /tmp/zk.pid - sleep 5 - ;; -stop) - # Already killed above - ;; -*) - echo "Unknown command " + $1 - exit 2 -esac - diff --git a/pkg/registry/zookeeper-3.4.6/src/recipes/queue/src/java/org/apache/zookeeper/recipes/queue/DistributedQueue.java b/pkg/registry/zookeeper-3.4.6/src/recipes/queue/src/java/org/apache/zookeeper/recipes/queue/DistributedQueue.java deleted file mode 100644 index c5d7c83ec..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/recipes/queue/src/java/org/apache/zookeeper/recipes/queue/DistributedQueue.java +++ /dev/null @@ -1,313 +0,0 @@ -/** - * - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You 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. - */ - -package org.apache.zookeeper.recipes.queue; - -import java.util.List; -import java.util.NoSuchElementException; -import java.util.TreeMap; -import java.util.concurrent.CountDownLatch; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.apache.zookeeper.CreateMode; -import org.apache.zookeeper.KeeperException; -import org.apache.zookeeper.WatchedEvent; -import org.apache.zookeeper.Watcher; -import org.apache.zookeeper.ZooDefs; -import org.apache.zookeeper.ZooKeeper; -import org.apache.zookeeper.data.ACL; -import org.apache.zookeeper.data.Stat; - -/** - * - * A protocol to implement a distributed queue. - * - */ - -public class DistributedQueue { - private static final Logger LOG = LoggerFactory.getLogger(DistributedQueue.class); - - private final String dir; - - private ZooKeeper zookeeper; - private List acl = ZooDefs.Ids.OPEN_ACL_UNSAFE; - - private final String prefix = "qn-"; - - - public DistributedQueue(ZooKeeper zookeeper, String dir, List acl){ - this.dir = dir; - - if(acl != null){ - this.acl = acl; - } - this.zookeeper = zookeeper; - - } - - - - /** - * Returns a Map of the children, ordered by id. - * @param watcher optional watcher on getChildren() operation. - * @return map from id to child name for all children - */ - private TreeMap orderedChildren(Watcher watcher) throws KeeperException, InterruptedException { - TreeMap orderedChildren = new TreeMap(); - - List childNames = null; - try{ - childNames = zookeeper.getChildren(dir, watcher); - }catch (KeeperException.NoNodeException e){ - throw e; - } - - for(String childName : childNames){ - try{ - //Check format - if(!childName.regionMatches(0, prefix, 0, prefix.length())){ - LOG.warn("Found child node with improper name: " + childName); - continue; - } - String suffix = childName.substring(prefix.length()); - Long childId = new Long(suffix); - orderedChildren.put(childId,childName); - }catch(NumberFormatException e){ - LOG.warn("Found child node with improper format : " + childName + " " + e,e); - } - } - - return orderedChildren; - } - - /** - * Find the smallest child node. - * @return The name of the smallest child node. - */ - private String smallestChildName() throws KeeperException, InterruptedException { - long minId = Long.MAX_VALUE; - String minName = ""; - - List childNames = null; - - try{ - childNames = zookeeper.getChildren(dir, false); - }catch(KeeperException.NoNodeException e){ - LOG.warn("Caught: " +e,e); - return null; - } - - for(String childName : childNames){ - try{ - //Check format - if(!childName.regionMatches(0, prefix, 0, prefix.length())){ - LOG.warn("Found child node with improper name: " + childName); - continue; - } - String suffix = childName.substring(prefix.length()); - long childId = Long.parseLong(suffix); - if(childId < minId){ - minId = childId; - minName = childName; - } - }catch(NumberFormatException e){ - LOG.warn("Found child node with improper format : " + childName + " " + e,e); - } - } - - - if(minId < Long.MAX_VALUE){ - return minName; - }else{ - return null; - } - } - - /** - * Return the head of the queue without modifying the queue. - * @return the data at the head of the queue. - * @throws NoSuchElementException - * @throws KeeperException - * @throws InterruptedException - */ - public byte[] element() throws NoSuchElementException, KeeperException, InterruptedException { - TreeMap orderedChildren; - - // element, take, and remove follow the same pattern. - // We want to return the child node with the smallest sequence number. - // Since other clients are remove()ing and take()ing nodes concurrently, - // the child with the smallest sequence number in orderedChildren might be gone by the time we check. - // We don't call getChildren again until we have tried the rest of the nodes in sequence order. - while(true){ - try{ - orderedChildren = orderedChildren(null); - }catch(KeeperException.NoNodeException e){ - throw new NoSuchElementException(); - } - if(orderedChildren.size() == 0 ) throw new NoSuchElementException(); - - for(String headNode : orderedChildren.values()){ - if(headNode != null){ - try{ - return zookeeper.getData(dir+"/"+headNode, false, null); - }catch(KeeperException.NoNodeException e){ - //Another client removed the node first, try next - } - } - } - - } - } - - - /** - * Attempts to remove the head of the queue and return it. - * @return The former head of the queue - * @throws NoSuchElementException - * @throws KeeperException - * @throws InterruptedException - */ - public byte[] remove() throws NoSuchElementException, KeeperException, InterruptedException { - TreeMap orderedChildren; - // Same as for element. Should refactor this. - while(true){ - try{ - orderedChildren = orderedChildren(null); - }catch(KeeperException.NoNodeException e){ - throw new NoSuchElementException(); - } - if(orderedChildren.size() == 0) throw new NoSuchElementException(); - - for(String headNode : orderedChildren.values()){ - String path = dir +"/"+headNode; - try{ - byte[] data = zookeeper.getData(path, false, null); - zookeeper.delete(path, -1); - return data; - }catch(KeeperException.NoNodeException e){ - // Another client deleted the node first. - } - } - - } - } - - private class LatchChildWatcher implements Watcher { - - CountDownLatch latch; - - public LatchChildWatcher(){ - latch = new CountDownLatch(1); - } - - public void process(WatchedEvent event){ - LOG.debug("Watcher fired on path: " + event.getPath() + " state: " + - event.getState() + " type " + event.getType()); - latch.countDown(); - } - public void await() throws InterruptedException { - latch.await(); - } - } - - /** - * Removes the head of the queue and returns it, blocks until it succeeds. - * @return The former head of the queue - * @throws NoSuchElementException - * @throws KeeperException - * @throws InterruptedException - */ - public byte[] take() throws KeeperException, InterruptedException { - TreeMap orderedChildren; - // Same as for element. Should refactor this. - while(true){ - LatchChildWatcher childWatcher = new LatchChildWatcher(); - try{ - orderedChildren = orderedChildren(childWatcher); - }catch(KeeperException.NoNodeException e){ - zookeeper.create(dir, new byte[0], acl, CreateMode.PERSISTENT); - continue; - } - if(orderedChildren.size() == 0){ - childWatcher.await(); - continue; - } - - for(String headNode : orderedChildren.values()){ - String path = dir +"/"+headNode; - try{ - byte[] data = zookeeper.getData(path, false, null); - zookeeper.delete(path, -1); - return data; - }catch(KeeperException.NoNodeException e){ - // Another client deleted the node first. - } - } - } - } - - /** - * Inserts data into queue. - * @param data - * @return true if data was successfully added - */ - public boolean offer(byte[] data) throws KeeperException, InterruptedException{ - for(;;){ - try{ - zookeeper.create(dir+"/"+prefix, data, acl, CreateMode.PERSISTENT_SEQUENTIAL); - return true; - }catch(KeeperException.NoNodeException e){ - zookeeper.create(dir, new byte[0], acl, CreateMode.PERSISTENT); - } - } - - } - - /** - * Returns the data at the first element of the queue, or null if the queue is empty. - * @return data at the first element of the queue, or null. - * @throws KeeperException - * @throws InterruptedException - */ - public byte[] peek() throws KeeperException, InterruptedException{ - try{ - return element(); - }catch(NoSuchElementException e){ - return null; - } - } - - - /** - * Attempts to remove the head of the queue and return it. Returns null if the queue is empty. - * @return Head of the queue or null. - * @throws KeeperException - * @throws InterruptedException - */ - public byte[] poll() throws KeeperException, InterruptedException { - try{ - return remove(); - }catch(NoSuchElementException e){ - return null; - } - } - - - -} diff --git a/pkg/registry/zookeeper-3.4.6/src/zookeeper.jute b/pkg/registry/zookeeper-3.4.6/src/zookeeper.jute deleted file mode 100644 index 6521e54cd..000000000 --- a/pkg/registry/zookeeper-3.4.6/src/zookeeper.jute +++ /dev/null @@ -1,288 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you 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. - */ - -module org.apache.zookeeper.data { - class Id { - ustring scheme; - ustring id; - } - class ACL { - int perms; - Id id; - } - // information shared with the client - class Stat { - long czxid; // created zxid - long mzxid; // last modified zxid - long ctime; // created - long mtime; // last modified - int version; // version - int cversion; // child version - int aversion; // acl version - long ephemeralOwner; // owner id if ephemeral, 0 otw - int dataLength; //length of the data in the node - int numChildren; //number of children of this node - long pzxid; // last modified children - } - // information explicitly stored by the server persistently - class StatPersisted { - long czxid; // created zxid - long mzxid; // last modified zxid - long ctime; // created - long mtime; // last modified - int version; // version - int cversion; // child version - int aversion; // acl version - long ephemeralOwner; // owner id if ephemeral, 0 otw - long pzxid; // last modified children - } - - // information explicitly stored by the version 1 database of servers - class StatPersistedV1 { - long czxid; //created zxid - long mzxid; //last modified zxid - long ctime; //created - long mtime; //last modified - int version; //version - int cversion; //child version - int aversion; //acl version - long ephemeralOwner; //owner id if ephemeral. 0 otw - } -} - -module org.apache.zookeeper.proto { - class ConnectRequest { - int protocolVersion; - long lastZxidSeen; - int timeOut; - long sessionId; - buffer passwd; - } - class ConnectResponse { - int protocolVersion; - int timeOut; - long sessionId; - buffer passwd; - } - class SetWatches { - long relativeZxid; - vectordataWatches; - vectorexistWatches; - vectorchildWatches; - } - class RequestHeader { - int xid; - int type; - } - class MultiHeader { - int type; - boolean done; - int err; - } - class AuthPacket { - int type; - ustring scheme; - buffer auth; - } - class ReplyHeader { - int xid; - long zxid; - int err; - } - class GetDataRequest { - ustring path; - boolean watch; - } - class SetDataRequest { - ustring path; - buffer data; - int version; - } - class SetDataResponse { - org.apache.zookeeper.data.Stat stat; - } - class GetSASLRequest { - buffer token; - } - class SetSASLRequest { - buffer token; - } - class SetSASLResponse { - buffer token; - } - class CreateRequest { - ustring path; - buffer data; - vector acl; - int flags; - } - class DeleteRequest { - ustring path; - int version; - } - class GetChildrenRequest { - ustring path; - boolean watch; - } - class GetChildren2Request { - ustring path; - boolean watch; - } - class CheckVersionRequest { - ustring path; - int version; - } - class GetMaxChildrenRequest { - ustring path; - } - class GetMaxChildrenResponse { - int max; - } - class SetMaxChildrenRequest { - ustring path; - int max; - } - class SyncRequest { - ustring path; - } - class SyncResponse { - ustring path; - } - class GetACLRequest { - ustring path; - } - class SetACLRequest { - ustring path; - vector acl; - int version; - } - class SetACLResponse { - org.apache.zookeeper.data.Stat stat; - } - class WatcherEvent { - int type; // event type - int state; // state of the Keeper client runtime - ustring path; - } - class ErrorResponse { - int err; - } - class CreateResponse { - ustring path; - } - class ExistsRequest { - ustring path; - boolean watch; - } - class ExistsResponse { - org.apache.zookeeper.data.Stat stat; - } - class GetDataResponse { - buffer data; - org.apache.zookeeper.data.Stat stat; - } - class GetChildrenResponse { - vector children; - } - class GetChildren2Response { - vector children; - org.apache.zookeeper.data.Stat stat; - } - class GetACLResponse { - vector acl; - org.apache.zookeeper.data.Stat stat; - } -} - -module org.apache.zookeeper.server.quorum { - class LearnerInfo { - long serverid; - int protocolVersion; - } - class QuorumPacket { - int type; // Request, Ack, Commit, Ping - long zxid; - buffer data; // Only significant when type is request - vector authinfo; - } -} - -module org.apache.zookeeper.server.persistence { - class FileHeader { - int magic; - int version; - long dbid; - } -} - -module org.apache.zookeeper.txn { - class TxnHeader { - long clientId; - int cxid; - long zxid; - long time; - int type; - } - class CreateTxnV0 { - ustring path; - buffer data; - vector acl; - boolean ephemeral; - } - class CreateTxn { - ustring path; - buffer data; - vector acl; - boolean ephemeral; - int parentCVersion; - } - class DeleteTxn { - ustring path; - } - class SetDataTxn { - ustring path; - buffer data; - int version; - } - class CheckVersionTxn { - ustring path; - int version; - } - class SetACLTxn { - ustring path; - vector acl; - int version; - } - class SetMaxChildrenTxn { - ustring path; - int max; - } - class CreateSessionTxn { - int timeOut; - } - class ErrorTxn { - int err; - } - class Txn { - int type; - buffer data; - } - class MultiTxn { - vector txns; - } -} diff --git a/pkg/registry/zookeeper-3.4.6/zookeeper-3.4.6.jar.REMOVED.git-id b/pkg/registry/zookeeper-3.4.6/zookeeper-3.4.6.jar.REMOVED.git-id deleted file mode 100644 index 043b9185c..000000000 --- a/pkg/registry/zookeeper-3.4.6/zookeeper-3.4.6.jar.REMOVED.git-id +++ /dev/null @@ -1 +0,0 @@ -8dcf8179fc7bc85d7a3be25fd2f1582b2e81c7bb \ No newline at end of file diff --git a/pkg/registry/zookeeper-3.4.6/zookeeper-3.4.6.jar.asc b/pkg/registry/zookeeper-3.4.6/zookeeper-3.4.6.jar.asc deleted file mode 100644 index e7505de26..000000000 --- a/pkg/registry/zookeeper-3.4.6/zookeeper-3.4.6.jar.asc +++ /dev/null @@ -1,17 +0,0 @@ ------BEGIN PGP SIGNATURE----- -Version: GnuPG v1.4.11 (GNU/Linux) - -iQIcBAABAgAGBQJTBd+1AAoJEJP7AlTSyA4yi7MP/2kz8a2kDT2QBaKkFOfGEIi+ -X/qL+EURa5hooSyWwqP2n/EB73/nJA/0nf3JFd9qdc2TuKKaCTHJtqVPg1rA3DBL -Qk7nLyGmQuDKEwq3B8rd+RzTKwR2yULMWisSfOpp1m7dct0kX2Q2s9Vw3YYr+CXX -HqLucSXWyibIow84QconzKf16eVeZvbBsrl/W+uv3mPq60iPuQtjrqkEnFOPD/yR -lYiv8FsCrmOfPz3jjkrzHULQFQJ7pAiQfGfB3T05unnnH/mEM/G5g6ORhQxYaz5i -nITU/UkD6YUJLWdpkMS8BkS+vQ9ZVCUjgRN2CpwXgHJDGLE8LxYOa8iBLH9KiRq4 -ArH9khmrh4QW4M/OTE+UOTTCp6yGVDqe7tNGizeKAcgRj0zqqYiDvADRt8t+nxwb -PKZN5PrDOWW1lB7gpHtOR3whqDTaSbUXhuJtwq0aK2iac/PPlxIReah2wjRu218V -mUpfUer5TeDG6bhscJ6McUEWbBB1bi2xF8N7IwnDaC5r8BHW3tmCEgIQGLwwrfx5 -h3AN5pckgEIvyhcaXCMUvl9/5+7fzNMyUbWZRTv+HWvAC5zdHTRiPx7K8A/4faRf -8hT/32zgvYNuX2wF5QkNOnLU0fxrhJ4T5bRHlMy9tBPjOaxnUfi1CcP1/t5U2Cet -rcVs7oAfaokmSKB/YalK -=jvDp ------END PGP SIGNATURE----- diff --git a/pkg/registry/zookeeper-3.4.6/zookeeper-3.4.6.jar.md5 b/pkg/registry/zookeeper-3.4.6/zookeeper-3.4.6.jar.md5 deleted file mode 100644 index 73c43dc41..000000000 --- a/pkg/registry/zookeeper-3.4.6/zookeeper-3.4.6.jar.md5 +++ /dev/null @@ -1 +0,0 @@ -9aaec9ffbb5036f91f25a70fd4a14023 diff --git a/pkg/registry/zookeeper-3.4.6/zookeeper-3.4.6.jar.sha1 b/pkg/registry/zookeeper-3.4.6/zookeeper-3.4.6.jar.sha1 deleted file mode 100644 index 1125ca001..000000000 --- a/pkg/registry/zookeeper-3.4.6/zookeeper-3.4.6.jar.sha1 +++ /dev/null @@ -1 +0,0 @@ -27d477d3603af659999a90d7133dcd22434ac685 From 86c53a5fa4be29bfd7d776f92af2443493825f9a Mon Sep 17 00:00:00 2001 From: shen <1292369127@qq.com> Date: Fri, 30 Oct 2020 17:10:15 +0800 Subject: [PATCH 186/227] fix merge errors Former-commit-id: e02710367e389aefd80d4b6d1aa444d42fcf0486 Former-commit-id: 8f272288943dc8dd7130b77f0183f8d2c5fe1144 --- pkg/registry/util.go | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/pkg/registry/util.go b/pkg/registry/util.go index a159f7165..da6471385 100644 --- a/pkg/registry/util.go +++ b/pkg/registry/util.go @@ -21,7 +21,6 @@ import ( ) import ( - "github.com/dubbogo/dubbo-go-proxy/pkg/client/dubbo" "github.com/dubbogo/dubbo-go-proxy/pkg/common/constant" "github.com/dubbogo/dubbo-go-proxy/pkg/config" ) @@ -31,8 +30,8 @@ func TransferURL2Api(url common.URL, clusterName string) []config.IntegrationReq var irs []config.IntegrationRequest for _, method := range url.Methods { irs = append(irs, config.IntegrationRequest{ - RequestType: url.Protocol, - DubboMetadata: dubbo.DubboMetadata{ + RequestType: config.RequestType(url.Protocol), + DubboBackendConfig: config.DubboBackendConfig{ ApplicationName: url.GetParam(constant.NameKey, ""), Group: url.GetParam(constant.GroupKey, ""), Version: url.GetParam(constant.VersionKey, ""), @@ -40,7 +39,6 @@ func TransferURL2Api(url common.URL, clusterName string) []config.IntegrationReq Method: method, Retries: url.GetParam(constant.RetriesKey, ""), ClusterName: clusterName, - ProtocolTypeStr: url.Protocol, }, }) } From 1074b14614af043f89d4d2f85834a5b23acf1c8f Mon Sep 17 00:00:00 2001 From: "yangqing.xyq" Date: Fri, 30 Oct 2020 19:53:51 +0800 Subject: [PATCH 187/227] merge from master --- pkg/config/api_config.go | 2 -- pkg/context/http/context.go | 9 +-------- pkg/filter/remote_call_filter.go | 4 ++-- pkg/pool/pool.go | 12 ++++++------ pkg/service/api/discovery_service.go | 8 ++------ 5 files changed, 11 insertions(+), 24 deletions(-) diff --git a/pkg/config/api_config.go b/pkg/config/api_config.go index 2d340c6ee..fff47240d 100644 --- a/pkg/config/api_config.go +++ b/pkg/config/api_config.go @@ -18,12 +18,10 @@ package config import ( - perrors "github.com/pkg/errors" ) import ( - "github.com/dubbogo/dubbo-go-proxy/pkg/client" "github.com/dubbogo/dubbo-go-proxy/pkg/common/yaml" "github.com/dubbogo/dubbo-go-proxy/pkg/logger" "sync" diff --git a/pkg/context/http/context.go b/pkg/context/http/context.go index 283e593bb..ca60d07df 100644 --- a/pkg/context/http/context.go +++ b/pkg/context/http/context.go @@ -26,7 +26,6 @@ import ( "github.com/dubbogo/dubbo-go-proxy/pkg/client" "github.com/dubbogo/dubbo-go-proxy/pkg/common/constant" "github.com/dubbogo/dubbo-go-proxy/pkg/common/extension" - "github.com/dubbogo/dubbo-go-proxy/pkg/config" "github.com/dubbogo/dubbo-go-proxy/pkg/context" "github.com/dubbogo/dubbo-go-proxy/pkg/model" "github.com/dubbogo/dubbo-go-proxy/pkg/router" @@ -178,13 +177,7 @@ func (hc *HttpContext) BuildFilters() { filterFuncs = append(filterFuncs, extension.GetMustFilterFunc(v)) } - switch api.Method.IntegrationRequest.RequestType { - case config.DubboRequest: - hc.AppendFilterFunc(extension.GetMustFilterFunc(constant.HttpTransferDubboFilter)) - case config.HTTPRequest: - break - } - + hc.AppendFilterFunc(extension.GetMustFilterFunc(constant.RemoteCallFilter)) hc.AppendFilterFunc(filterFuncs...) } diff --git a/pkg/filter/remote_call_filter.go b/pkg/filter/remote_call_filter.go index a8d28ea39..7c5170e56 100644 --- a/pkg/filter/remote_call_filter.go +++ b/pkg/filter/remote_call_filter.go @@ -30,13 +30,13 @@ import ( ) import ( - "github.com/dubbogo/dubbo-go-proxy/pkg/pool" "github.com/dubbogo/dubbo-go-proxy/pkg/client" "github.com/dubbogo/dubbo-go-proxy/pkg/common/constant" "github.com/dubbogo/dubbo-go-proxy/pkg/common/extension" "github.com/dubbogo/dubbo-go-proxy/pkg/context" "github.com/dubbogo/dubbo-go-proxy/pkg/context/http" "github.com/dubbogo/dubbo-go-proxy/pkg/logger" + "github.com/dubbogo/dubbo-go-proxy/pkg/pool" ) func init() { @@ -52,7 +52,7 @@ func RemoteCall() context.FilterFunc { func doRemoteCall(c *http.HttpContext) { api := c.GetAPI() - cl, e := pool.SingletonPool().GetClient(api.IType) + cl, e := pool.SingletonPool().GetClient(api.Method.IntegrationRequest.RequestType) if e != nil { c.WriteFail() c.AbortWithError("", e) diff --git a/pkg/pool/pool.go b/pkg/pool/pool.go index 82cdbb680..8006e2c25 100644 --- a/pkg/pool/pool.go +++ b/pkg/pool/pool.go @@ -22,13 +22,13 @@ import ( "github.com/dubbogo/dubbo-go-proxy/pkg/client" "github.com/dubbogo/dubbo-go-proxy/pkg/client/dubbo" "github.com/dubbogo/dubbo-go-proxy/pkg/client/httpclient" - "github.com/dubbogo/dubbo-go-proxy/pkg/model" + "github.com/dubbogo/dubbo-go-proxy/pkg/config" "sync" ) //ClientPool a pool of client. type ClientPool struct { - poolMap map[model.ApiType]*sync.Pool + poolMap map[config.RequestType]*sync.Pool } var ( @@ -38,14 +38,14 @@ var ( func newClientPool() *ClientPool { clientPool := &ClientPool{ - poolMap: make(map[model.ApiType]*sync.Pool), + poolMap: make(map[config.RequestType]*sync.Pool), } - clientPool.poolMap[model.DUBBO] = &sync.Pool{ + clientPool.poolMap[config.DubboRequest] = &sync.Pool{ New: func() interface{} { return dubbo.NewDubboClient() }, } - clientPool.poolMap[model.REST] = &sync.Pool{ + clientPool.poolMap[config.HTTPRequest] = &sync.Pool{ New: func() interface{} { return httpclient.NewHttpClient() }, @@ -65,7 +65,7 @@ func SingletonPool() *ClientPool { } // GetClient a factory method to get a client according to apiType . -func (pool *ClientPool) GetClient(t model.ApiType) (client.Client, error) { +func (pool *ClientPool) GetClient(t config.RequestType) (client.Client, error) { if pool.poolMap[t] != nil { return pool.poolMap[t].Get().(client.Client), nil } diff --git a/pkg/service/api/discovery_service.go b/pkg/service/api/discovery_service.go index 3deafa592..aa61fe26c 100644 --- a/pkg/service/api/discovery_service.go +++ b/pkg/service/api/discovery_service.go @@ -18,17 +18,13 @@ package api import ( - "fmt" - "encoding/json" "errors" + "fmt" ) -import ( - "github.com/pkg/errors" -) +import () import ( - "github.com/dubbogo/dubbo-go-proxy/pkg/client" "github.com/dubbogo/dubbo-go-proxy/pkg/common/constant" "github.com/dubbogo/dubbo-go-proxy/pkg/common/extension" "github.com/dubbogo/dubbo-go-proxy/pkg/config" From 8ba8852b2e48564f597d7bcccc910b6776b6db93 Mon Sep 17 00:00:00 2001 From: tiecheng Date: Sat, 31 Oct 2020 20:07:13 +0800 Subject: [PATCH 188/227] test CI --- pkg/filter/timeout/timeout.go | 2 -- pkg/filter/timeout/timeout_test.go | 2 +- 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/pkg/filter/timeout/timeout.go b/pkg/filter/timeout/timeout.go index f4a00a054..8b4d7fd93 100644 --- a/pkg/filter/timeout/timeout.go +++ b/pkg/filter/timeout/timeout.go @@ -34,8 +34,6 @@ import ( const ( // timeout code TimeoutError = "S005" - // unknown code - UnknownError = "S003" ) func init() { diff --git a/pkg/filter/timeout/timeout_test.go b/pkg/filter/timeout/timeout_test.go index fb35de81f..042962e26 100644 --- a/pkg/filter/timeout/timeout_test.go +++ b/pkg/filter/timeout/timeout_test.go @@ -20,7 +20,6 @@ package timeout import ( "context" "fmt" - "github.com/dubbogo/dubbo-go-proxy/pkg/filter/recovery" "net/http" "testing" "time" @@ -29,6 +28,7 @@ import ( import ( selfcontext "github.com/dubbogo/dubbo-go-proxy/pkg/context" selfhttp "github.com/dubbogo/dubbo-go-proxy/pkg/context/http" + "github.com/dubbogo/dubbo-go-proxy/pkg/filter/recovery" ) func TestPanic(t *testing.T) { From 539e0b6da5cf64be6d2235322695c8a6434e86e6 Mon Sep 17 00:00:00 2001 From: tiecheng Date: Sat, 31 Oct 2020 20:24:34 +0800 Subject: [PATCH 189/227] test CI --- pkg/filter/recovery/recovery_test.go | 21 +++++++++++++++++++-- pkg/filter/timeout/timeout.go | 2 +- pkg/filter/timeout/timeout_test.go | 8 ++++---- 3 files changed, 24 insertions(+), 7 deletions(-) diff --git a/pkg/filter/recovery/recovery_test.go b/pkg/filter/recovery/recovery_test.go index 0ff6435ce..9bb5cfe5d 100644 --- a/pkg/filter/recovery/recovery_test.go +++ b/pkg/filter/recovery/recovery_test.go @@ -1,3 +1,20 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + */ + package recovery import ( @@ -14,7 +31,7 @@ import ( ) func TestRecovery(t *testing.T) { - c := MockHttpContext(func(c selfcontext.Context) { + c := MockHTTPContext(func(c selfcontext.Context) { time.Sleep(time.Millisecond * 100) // panic var m map[string]string @@ -26,7 +43,7 @@ func TestRecovery(t *testing.T) { // "assignment to entry in nil map" } -func MockHttpContext(fc ...selfcontext.FilterFunc) *selfhttp.HttpContext { +func MockHTTPContext(fc ...selfcontext.FilterFunc) *selfhttp.HttpContext { result := &selfhttp.HttpContext{ BaseContext: &selfcontext.BaseContext{ Index: -1, diff --git a/pkg/filter/timeout/timeout.go b/pkg/filter/timeout/timeout.go index 8b4d7fd93..55e2d05d3 100644 --- a/pkg/filter/timeout/timeout.go +++ b/pkg/filter/timeout/timeout.go @@ -32,7 +32,7 @@ import ( ) const ( - // timeout code + // TimeoutError timeout code TimeoutError = "S005" ) diff --git a/pkg/filter/timeout/timeout_test.go b/pkg/filter/timeout/timeout_test.go index 042962e26..709c86a2b 100644 --- a/pkg/filter/timeout/timeout_test.go +++ b/pkg/filter/timeout/timeout_test.go @@ -32,7 +32,7 @@ import ( ) func TestPanic(t *testing.T) { - c := MockHttpContext(testPanicFilter) + c := MockHTTPContext(testPanicFilter) c.Next() // print // 500 @@ -45,7 +45,7 @@ var testPanicFilter = func(c selfcontext.Context) { } func TestTimeout(t *testing.T) { - c := MockHttpContext(testTimeoutFilter) + c := MockHTTPContext(testTimeoutFilter) c.Next() // print // 503 @@ -57,7 +57,7 @@ var testTimeoutFilter = func(c selfcontext.Context) { } func TestNormal(t *testing.T) { - c := MockHttpContext(testNormalFilter) + c := MockHTTPContext(testNormalFilter) c.Next() } @@ -66,7 +66,7 @@ var testNormalFilter = func(c selfcontext.Context) { fmt.Println("normal call") } -func MockHttpContext(fc ...selfcontext.FilterFunc) *selfhttp.HttpContext { +func MockHTTPContext(fc ...selfcontext.FilterFunc) *selfhttp.HttpContext { result := &selfhttp.HttpContext{ BaseContext: &selfcontext.BaseContext{ Index: -1, From 0a2520cc320a167e493c972e30141e1bb7b63dba Mon Sep 17 00:00:00 2001 From: williamfeng323 Date: Sun, 1 Nov 2020 21:20:49 +0800 Subject: [PATCH 190/227] the readme for config api config --- configs/conf.yaml | 12 ++++++------ doc/api_gateway_config_en.md | 3 +++ 2 files changed, 9 insertions(+), 6 deletions(-) create mode 100644 doc/api_gateway_config_en.md diff --git a/configs/conf.yaml b/configs/conf.yaml index a8d1b12de..3b71e9abe 100644 --- a/configs/conf.yaml +++ b/configs/conf.yaml @@ -49,13 +49,13 @@ static_resources: request_timeout: "10s" registries: "zookeeper": - - timeout: "3s" - address: "127.0.0.1:2182" - username: "" - password: "" + timeout: "3s" + address: "127.0.0.1:2182" + username: "" + password: "" "consul": - - timeout: "3s" - address: "127.0.0.1:8500" + timeout: "3s" + address: "127.0.0.1:8500" shutdown_config: timeout: "60s" step_timeout: "10s" diff --git a/doc/api_gateway_config_en.md b/doc/api_gateway_config_en.md new file mode 100644 index 000000000..31ab15b7c --- /dev/null +++ b/doc/api_gateway_config_en.md @@ -0,0 +1,3 @@ +# API Gateway +API is the key feature of the dubbo-go-proxy. With this feature, you can expose your dubbo service as a HTTP service. +## Configuration From 48338de4b8b3b39deacd9d6326342c32f7a21b08 Mon Sep 17 00:00:00 2001 From: williamfeng323 Date: Mon, 2 Nov 2020 11:00:16 +0800 Subject: [PATCH 191/227] finished the configuration part --- doc/api_gateway_config_en.md | 142 +++++++++++++++++++++++++++++++++++ 1 file changed, 142 insertions(+) diff --git a/doc/api_gateway_config_en.md b/doc/api_gateway_config_en.md index 31ab15b7c..0673f66d3 100644 --- a/doc/api_gateway_config_en.md +++ b/doc/api_gateway_config_en.md @@ -1,3 +1,145 @@ # API Gateway API is the key feature of the dubbo-go-proxy. With this feature, you can expose your dubbo service as a HTTP service. ## Configuration +Sample: +``` yaml +name: api name +description: api description +resources: + - path: '/' + type: restful + description: resource documentation + filters: + - filter0 + methods: + - httpVerb: GET + onAir: true + inboundRequest: + requestType: http + queryStrings: + - name: id + required: false + integrationRequest: + requestType: dubbo + mappingParams: + - name: queryStrings.id + mapTo: 1 + applicationName: "BDTService" + interface: "com.ikurento.user.UserProvider" + method: "GetUser" + clusterName: "test_dubbo" + +definitions: + - name: modelDefinition + schema: >- + { + "type" : "object", + "properties" : { + "id" : { + "type" : "integer" + }, + "type" : { + "type" : "string" + }, + "price" : { + "type" : "number" + } + } + } +``` +name +: +> The name of the Gateway. + + +description +: +> The description of the Gateway + +resources +: +> Defines the API resources. + +path +: +> Defines the path of the API. Parameterized path is acceptable. For instance, you can specify /users/:id, the :id will be considered as parameter in query string. You can also specify /users/:id/transactions/:transactionId, which :id, and :transactionId will be used as query parameters. + +type +: +> The type of the API, possible values: restful. Type dubbo will be support later to provide dubbo-to-http gateway function. + +filters +: +> The filters in resource level. Use comma to separate the filters. + +methods +: +> Defines the methods within the resource. + +httpVerb +: +> The http method, accept GET/POST/PUT/DELETE/OPTIONS/PATCH/HEAD/HEAD/ANY(Not supported yet) + +onAir +: +> Defines the API is online/offline. true -> online, false -> offline. When the API is offline, it returns 406. + +inboundRequest +: +> Defines the way to expose the API. + +requestType +: +> the inbound request type. Values: http. Type dubbo will be support later to provide dubbo-to-http gateway function. + +queryString +: +> the query string defines the parameters that the API exposes. The parameters you defined in the path will be merged into the configuration here. + + name: the name of the query parameter + required: if the parameter is required. + +requestBody +: +> The parameters in request body. It works with the definition config. + + definitionName: The name of the defined definition maps to this request body. + +integrationRequest +: +> Defines the detail of the actual backend service. + +requestType +: +> The request type in integrationRequest defines the type of the backend service. 'dubbo' is the value we support now. 'http' will be support later with the dubbo-to-http proxy feature. + +mappingParams +: +> It is the field that describe how to map the inboundRequest parameters to backend service parameters. + + name: The name of the inboundRequest parameter name. use queryStrings.* for the parameters defines in queryStrings, + mapTo: The index of the target parameters. Starts from 0. + +application +: +> The name of the target dubbo application. + +interface +: +> The interface represents the interface in dubbo. + +method +: +> The method in integrationRequest represents the method in dubbo + +clusterName +: +> The clusterName defines which dubbo cluster to call(Will release later) + +definitions +: +> the definitions of the models. They will be used as request body. + + name: The name of the definitions. + schema: The detail definition of the definition. Use json.schema. + From f3795d0785153512d591efb0e9244ba370f4e993 Mon Sep 17 00:00:00 2001 From: shen Date: Mon, 2 Nov 2020 17:08:45 +0800 Subject: [PATCH 192/227] debug travis --- .travis.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index e0dbd425e..1a584077c 100644 --- a/.travis.yml +++ b/.travis.yml @@ -8,7 +8,8 @@ env: install: true script: - - go fmt ./... && [[ -z `git status -s` ]] + - go fmt ./... + - git status -s - echo 'start unit-test' - go mod vendor && go test ./... -coverprofile=coverage.txt -covermode=atomic From c243cb33654798cf2690fb1d1329ff6cbdcbe0f2 Mon Sep 17 00:00:00 2001 From: "yangqing.xyq" Date: Mon, 2 Nov 2020 20:03:23 +0800 Subject: [PATCH 193/227] real http call . --- pkg/client/dubbo/dubbo_client.go | 17 +++++++++++++---- pkg/client/httpclient/http_client.go | 16 +++++++++++++--- pkg/client/request.go | 12 ++++++------ pkg/config/api_config.go | 11 +++++++++++ pkg/context/http/context.go | 5 +++++ pkg/filter/remote_call_filter.go | 20 ++++++-------------- 6 files changed, 54 insertions(+), 27 deletions(-) diff --git a/pkg/client/dubbo/dubbo_client.go b/pkg/client/dubbo/dubbo_client.go index 8723ee612..e3556eca1 100644 --- a/pkg/client/dubbo/dubbo_client.go +++ b/pkg/client/dubbo/dubbo_client.go @@ -20,6 +20,7 @@ package dubbo import ( "context" "encoding/json" + "io/ioutil" "strings" "sync" "time" @@ -95,6 +96,14 @@ func (dc *DubboClient) Call(r *client.Request) (resp client.Response, err error) gs := dc.Get(dm.Interface, dm.Version, dm.Group, dm) var reqData []interface{} + var indate []byte + var e error + + indate, e = ioutil.ReadAll(r.IngressRequest.Body) + + if e != nil { + return *client.EmptyResponse, err + } l := len(dm.ParamTypes) switch { @@ -103,28 +112,28 @@ func (dc *DubboClient) Call(r *client.Request) (resp client.Response, err error) switch t { case JavaStringClassName: var s string - if err := json.Unmarshal(r.Body, &s); err != nil { + if err := json.Unmarshal(indate, &s); err != nil { logger.Errorf("params parse error:%+v", err) } else { reqData = append(reqData, s) } case JavaLangClassName: var i int - if err := json.Unmarshal(r.Body, &i); err != nil { + if err := json.Unmarshal(indate, &i); err != nil { logger.Errorf("params parse error:%+v", err) } else { reqData = append(reqData, i) } default: bodyMap := make(map[string]interface{}) - if err := json.Unmarshal(r.Body, &bodyMap); err != nil { + if err := json.Unmarshal(indate, &bodyMap); err != nil { return *client.EmptyResponse, err } else { reqData = append(reqData, bodyMap) } } case l > 1: - if err = json.Unmarshal(r.Body, &reqData); err != nil { + if err = json.Unmarshal(indate, &reqData); err != nil { return *client.EmptyResponse, err } } diff --git a/pkg/client/httpclient/http_client.go b/pkg/client/httpclient/http_client.go index fd4760f11..31f431c85 100644 --- a/pkg/client/httpclient/http_client.go +++ b/pkg/client/httpclient/http_client.go @@ -19,6 +19,8 @@ package httpclient import ( "context" + "net/http" + "net/url" "strings" "sync" "time" @@ -100,9 +102,17 @@ func (dc *HTTPClient) Close() error { } // Call invoke service -func (dc *HTTPClient) Call(r *client.Request) (resp *client.Response, err error) { - //TODO:get Matched rest api url according to input url ,then make a http call. - return nil, nil +func (dc *HTTPClient) Call(r *client.Request) (resp client.Response, err error) { + + var urlStr = r.API.IntegrationRequest.HTTPBackendConfig.Protocol + "://" + r.API.IntegrationRequest.HTTPBackendConfig.TargetUrl + var httpClient = &http.Client{Timeout: 5 * time.Second} + var request = r.IngressRequest.Clone(context.Background()) + request.URL, _ = url.ParseRequestURI(urlStr) + //TODO header replace, url rewrite.... + + var tmpRet, e = httpClient.Do(request) + var ret = client.Response{Data: tmpRet} + return ret, e } func (dc *HTTPClient) get(key string) *dg.GenericService { diff --git a/pkg/client/request.go b/pkg/client/request.go index c8623ff15..3c516c6e2 100644 --- a/pkg/client/request.go +++ b/pkg/client/request.go @@ -19,19 +19,19 @@ package client import ( "github.com/dubbogo/dubbo-go-proxy/pkg/router" + "net/http" ) // Request request for endpoint type Request struct { - Body []byte - Header map[string]string - API *router.API + IngressRequest *http.Request + API *router.API } // NewRequest create a request -func NewRequest(b []byte, api *router.API) *Request { +func NewRequest(request *http.Request, api *router.API) *Request { return &Request{ - Body: b, - API: api, + IngressRequest: request, + API: api, } } diff --git a/pkg/config/api_config.go b/pkg/config/api_config.go index fff47240d..be1d22873 100644 --- a/pkg/config/api_config.go +++ b/pkg/config/api_config.go @@ -114,6 +114,7 @@ type BodyDefinition struct { type IntegrationRequest struct { RequestType `json:"requestType" yaml:"requestType"` // dubbo, TO-DO: http DubboBackendConfig `json:"dubboBackendConfig,inline,omitempty" yaml:"dubboBackendConfig,inline,omitempty"` + HTTPBackendConfig `json:"httpBackendConfig" yaml:"httpBackendConfig"` MappingParams []MappingParam `json:"mappingParams,omitempty" yaml:"mappingParams,omitempty"` } @@ -136,6 +137,16 @@ type DubboBackendConfig struct { Retries string `yaml:"retries" json:"retries,omitempty"` } +// HTTPBackendConfig defines the basic dubbo backend config +type HTTPBackendConfig struct { + //TODO resolve from yaml config needed. head mapping needed. paramMappingneeded + TargetUrl string `yaml:"targetUrl" json:"targetUrl"` + ApplicationName string `yaml:"applicationName" json:"applicationName"` + Protocol string `yaml:"protocol" json:"protocol,schema" default:"https"` + Version string `yaml:"version" json:"version"` + Retries string `yaml:"retries" json:"retries,omitempty"` +} + // Definition defines the complex json request body type Definition struct { Name string `json:"name" yaml:"name"` diff --git a/pkg/context/http/context.go b/pkg/context/http/context.go index ca60d07df..562aedb90 100644 --- a/pkg/context/http/context.go +++ b/pkg/context/http/context.go @@ -96,6 +96,11 @@ func (hc *HttpContext) GetHeader(k string) string { return hc.Request.Header.Get(k) } +//AllHeaders get all headers +func (hc *HttpContext) AllHeaders() http.Header { + return hc.Request.Header +} + // GetUrl get http request url func (hc *HttpContext) GetUrl() string { return hc.Request.URL.Path diff --git a/pkg/filter/remote_call_filter.go b/pkg/filter/remote_call_filter.go index 7c5170e56..6d2f6710b 100644 --- a/pkg/filter/remote_call_filter.go +++ b/pkg/filter/remote_call_filter.go @@ -17,10 +17,6 @@ package filter -import ( - "io/ioutil" -) - import ( _ "github.com/apache/dubbo-go/cluster/cluster_impl" _ "github.com/apache/dubbo-go/cluster/loadbalance" @@ -57,18 +53,14 @@ func doRemoteCall(c *http.HttpContext) { c.WriteFail() c.AbortWithError("", e) } - if bytes, err := ioutil.ReadAll(c.Request.Body); err != nil { - logger.Errorf("[dubboproxy go] read body err:%v!", err) + + if resp, err := cl.Call(client.NewRequest(c.Request, api)); err != nil { + logger.Errorf("[dubboproxy go] client do err:%v!", err) c.WriteFail() c.Abort() } else { - if resp, err := cl.Call(client.NewRequest(bytes, api)); err != nil { - logger.Errorf("[dubboproxy go] client do err:%v!", err) - c.WriteFail() - c.Abort() - } else { - c.WriteResponse(resp) - c.Next() - } + c.WriteResponse(resp) + c.Next() } + } From 25a8c3971b0bed3bd8c541312f849553d3d51cd0 Mon Sep 17 00:00:00 2001 From: "yangqing.xyq" Date: Mon, 2 Nov 2020 20:35:14 +0800 Subject: [PATCH 194/227] fix error --- pkg/client/dubbo/dubbo_client.go | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/pkg/client/dubbo/dubbo_client.go b/pkg/client/dubbo/dubbo_client.go index e3556eca1..fffbe2fd8 100644 --- a/pkg/client/dubbo/dubbo_client.go +++ b/pkg/client/dubbo/dubbo_client.go @@ -93,7 +93,7 @@ func (dc *DubboClient) Close() error { // Call invoke service func (dc *DubboClient) Call(r *client.Request) (resp client.Response, err error) { dm := r.API.Method.IntegrationRequest - gs := dc.Get(dm.Interface, dm.Version, dm.Group, dm) + gs := dc.Get(dm.Interface, dm.DubboBackendConfig.Version, dm.Group, dm) var reqData []interface{} var indate []byte @@ -178,19 +178,19 @@ func (dc *DubboClient) create(key string, irequest config.IntegrationRequest) *d } referenceConfig.Registry = strings.Join(registers, ",") - if len(irequest.Protocol) == 0 { + if len(irequest.DubboBackendConfig.Protocol) == 0 { referenceConfig.Protocol = dubbo.DUBBO } else { - referenceConfig.Protocol = irequest.Protocol + referenceConfig.Protocol = irequest.DubboBackendConfig.Protocol } - referenceConfig.Version = irequest.Version + referenceConfig.Version = irequest.DubboBackendConfig.Version referenceConfig.Group = irequest.Group referenceConfig.Generic = true - if len(irequest.Retries) == 0 { + if len(irequest.DubboBackendConfig.Retries) == 0 { referenceConfig.Retries = "3" } else { - referenceConfig.Retries = irequest.Retries + referenceConfig.Retries = irequest.DubboBackendConfig.Retries } dc.mLock.Lock() defer dc.mLock.Unlock() @@ -204,7 +204,7 @@ func (dc *DubboClient) create(key string, irequest config.IntegrationRequest) *d // Get find a dubbo GenericService func (dc *DubboClient) Get(interfaceName, version, group string, ir config.IntegrationRequest) *dg.GenericService { - key := strings.Join([]string{ir.ApplicationName, interfaceName, version, group}, "_") + key := strings.Join([]string{ir.DubboBackendConfig.ApplicationName, interfaceName, version, group}, "_") if dc.check(key) { return dc.get(key) } From c3c06a514586a4a237f1defed84bbd172eccdd94 Mon Sep 17 00:00:00 2001 From: "yangqing.xyq" Date: Mon, 2 Nov 2020 20:40:20 +0800 Subject: [PATCH 195/227] fix error --- pkg/router/route_test.go | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/pkg/router/route_test.go b/pkg/router/route_test.go index 7b02b6faa..56a798099 100644 --- a/pkg/router/route_test.go +++ b/pkg/router/route_test.go @@ -122,25 +122,25 @@ func TestFindMethod(t *testing.T) { func TestUpdateMethod(t *testing.T) { m0 := getMockMethod(config.MethodGet) m1 := getMockMethod(config.MethodGet) - m0.Version = "1.0.0" - m1.Version = "2.0.0" + m0.DubboBackendConfig.Version = "1.0.0" + m1.DubboBackendConfig.Version = "2.0.0" rt := NewRoute() rt.PutAPI(API{URLPattern: "/marvel", Method: m0}) m, _ := rt.FindAPI("/marvel", config.MethodGet) - assert.Equal(t, m.Version, "1.0.0") + assert.Equal(t, m.DubboBackendConfig.Version, "1.0.0") rt.UpdateAPI(API{URLPattern: "/marvel", Method: m1}) m, ok := rt.FindAPI("/marvel", config.MethodGet) assert.True(t, ok) - assert.Equal(t, m.Version, "2.0.0") + assert.Equal(t, m.DubboBackendConfig.Version, "2.0.0") rt.PutAPI(API{URLPattern: "/theboys/:id", Method: m0}) m, _ = rt.FindAPI("/theBoys/12345", config.MethodGet) - assert.Equal(t, m.Version, "1.0.0") + assert.Equal(t, m.DubboBackendConfig.Version, "1.0.0") rt.UpdateAPI(API{URLPattern: "/theBoys/:id", Method: m1}) m, ok = rt.FindAPI("/theBoys/12345", config.MethodGet) assert.True(t, ok) - assert.Equal(t, m.Version, "2.0.0") + assert.Equal(t, m.DubboBackendConfig.Version, "2.0.0") } func TestSearchWildcard(t *testing.T) { From 9cf7b5a8cec9a1eb87114d5e8c56025047fd82b8 Mon Sep 17 00:00:00 2001 From: zhangshen023 <1292369127@qq.com> Date: Mon, 2 Nov 2020 21:55:24 +0800 Subject: [PATCH 196/227] revert Former-commit-id: 2a19c721b53b436203bb782ba33707a501da4a79 Former-commit-id: c5f26e480725c887646cb1ffd11cf04d0b42f4d9 --- .travis.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.travis.yml b/.travis.yml index 1161f3908..424a72213 100644 --- a/.travis.yml +++ b/.travis.yml @@ -8,8 +8,7 @@ env: install: true script: - - go fmt ./... - - git status -s + - go fmt ./... && [[ -z `git status -s` ]] - sh before_validate_license.sh - chmod u+x /tmp/tools/license/license-header-checker - /tmp/tools/license/license-header-checker -v -a -r -i vendor /tmp/tools/license/license.txt . go && [[ -z `git status -s` ]] @@ -23,3 +22,4 @@ after_success: notifications: webhooks: https://oapi.dingtalk.com/robot/send?access_token=e6b085c90561a7543cc5fde89e9c8108100460c15e955c0604fea180a500a0ad + From ab955f4816c3546f9b7e0fb6bbff24acb6ca7bbf Mon Sep 17 00:00:00 2001 From: zhangshen023 <1292369127@qq.com> Date: Mon, 2 Nov 2020 22:23:19 +0800 Subject: [PATCH 197/227] add license Former-commit-id: eb80057efecbf47cb77083c4481acc8bb95f254a Former-commit-id: 9d259bfc82f036ae8f27047d01d982e2d4aa455c --- pkg/common/constant/interface_url.go | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/pkg/common/constant/interface_url.go b/pkg/common/constant/interface_url.go index 35e784416..dd396d53a 100644 --- a/pkg/common/constant/interface_url.go +++ b/pkg/common/constant/interface_url.go @@ -1,3 +1,19 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + */ package constant const ( From e81ecb2b0f31f27a2896b06da9276ae1d2c34cc1 Mon Sep 17 00:00:00 2001 From: tiecheng Date: Mon, 2 Nov 2020 23:49:08 +0800 Subject: [PATCH 198/227] change zk jar path --- before_ut.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/before_ut.sh b/before_ut.sh index 2d6e27f6f..8d4fc5984 100755 --- a/before_ut.sh +++ b/before_ut.sh @@ -16,7 +16,7 @@ zkJarName="zookeeper-3.4.9-fatjar.jar" remoteJarUrl="https://github.com/dubbogo/resources/raw/master/zookeeper-4unitest/contrib/fatjar/${zkJarName}" -zkJarPath="registry/zookeeper/zookeeper-4unittest/contrib/fatjar" +zkJarPath="pkg/registry/zookeeper/zookeeper-4unittest/contrib/fatjar" zkJar="${zkJarPath}/${zkJarName}" if [ ! -f "${zkJar}" ]; then From a4b1faeb4927cbbddc98dc63dab61bc665a9ab85 Mon Sep 17 00:00:00 2001 From: shen Date: Tue, 3 Nov 2020 10:15:57 +0800 Subject: [PATCH 199/227] go.sum Former-commit-id: 17237e3e5cbaa152ed5d1aa552b717aa5864aaf4 Former-commit-id: 761261c5a38b19c12735756b9e2ca7eab0e4bf00 --- go.sum | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/go.sum b/go.sum index 8573a9f95..51cd48924 100644 --- a/go.sum +++ b/go.sum @@ -32,6 +32,7 @@ github.com/Azure/go-autorest/autorest/date v0.2.0 h1:yW+Zlqf26583pE43KhfnhFcdmSW github.com/Azure/go-autorest/autorest/date v0.2.0/go.mod h1:vcORJHLJEh643/Ioh9+vPmf1Ij9AEBM5FuBIXLmIy0g= github.com/Azure/go-autorest/autorest/mocks v0.1.0/go.mod h1:OTyCOPRA2IgIlWxVYxBee2F5Gr4kF2zd2J5cFRaIDN0= github.com/Azure/go-autorest/autorest/mocks v0.2.0/go.mod h1:OTyCOPRA2IgIlWxVYxBee2F5Gr4kF2zd2J5cFRaIDN0= +github.com/Azure/go-autorest/autorest/mocks v0.3.0 h1:qJumjCaCudz+OcqE9/XtEPfvtOjOmKaui4EOpFI6zZc= github.com/Azure/go-autorest/autorest/mocks v0.3.0/go.mod h1:a8FDP3DYzQ4RYfVAxAN3SVSiiO77gL2j2ronKKP0syM= github.com/Azure/go-autorest/autorest/to v0.3.0 h1:zebkZaadz7+wIQYgC7GXaz3Wb28yKYfVkkBKwc38VF8= github.com/Azure/go-autorest/autorest/to v0.3.0/go.mod h1:MgwOyqaIuKdG4TL/2ywSsIWKAfJfgHDo8ObuUk3t5sA= @@ -57,9 +58,11 @@ github.com/NYTimes/gziphandler v1.1.1/go.mod h1:n/CVRwUEOgIxrgPvAQhUUr9oeUtvrhMo github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= github.com/PuerkitoBio/purell v1.0.0/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= github.com/PuerkitoBio/urlesc v0.0.0-20160726150825-5bd2802263f2/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE= +github.com/StackExchange/wmi v0.0.0-20180116203802-5d049714c4a6 h1:fLjPD/aNc3UIOA6tDi6QXUemppXK3P9BI7mr2hd6gx8= github.com/StackExchange/wmi v0.0.0-20180116203802-5d049714c4a6/go.mod h1:3eOhrUMpNV+6aFIbp5/iudMxNCF27Vw2OZgy4xEx0Fg= github.com/Workiva/go-datastructures v1.0.50 h1:slDmfW6KCHcC7U+LP3DDBbm4fqTwZGn1beOFPfGaLvo= github.com/Workiva/go-datastructures v1.0.50/go.mod h1:Z+F2Rca0qCsVYDS8z7bAGm8f3UkzuWYS/oBZz5a7VVA= +github.com/abdullin/seq v0.0.0-20160510034733-d5467c17e7af h1:DBNMBMuMiWYu0b+8KMJuWmfCkcxl09JwdlqwDZZ6U14= github.com/abdullin/seq v0.0.0-20160510034733-d5467c17e7af/go.mod h1:5Jv4cbFiHJMsVxt52+i0Ha45fjshj6wxYr1r19tB9bw= github.com/afex/hystrix-go v0.0.0-20180502004556-fa1af6a1f4f5 h1:rFw4nCn9iMW+Vajsk51NtYIcwSTkXr+JGrMd36kTDJw= github.com/afex/hystrix-go v0.0.0-20180502004556-fa1af6a1f4f5/go.mod h1:SkGFH1ia65gfNATL8TAiHDNxPzPdmEL5uirI2Uyuz6c= @@ -135,6 +138,7 @@ github.com/digitalocean/godo v1.10.0 h1:uW1/FcvZE/hoixnJcnlmIUvTVNdZCLjRLzmDtRi1 github.com/digitalocean/godo v1.10.0/go.mod h1:h6faOIcZ8lWIwNQ+DN7b3CgX4Kwby5T+nbpNqkUIozU= github.com/dimchansky/utfbom v1.1.0 h1:FcM3g+nofKgUteL8dm/UpdRXNC9KmADgTpLKsu0TRo4= github.com/dimchansky/utfbom v1.1.0/go.mod h1:rO41eb7gLfo8SF1jd9F8HplJm1Fewwi4mQvIirEdv+8= +github.com/dnaeon/go-vcr v1.0.1 h1:r8L/HqC0Hje5AXMu1ooW8oyQyOFv4GxqpL0nRP7SLLY= github.com/dnaeon/go-vcr v1.0.1/go.mod h1:aBB1+wY4s93YsC3HHjMBMrwTj2R9FHDzUr9KyGc8n1E= github.com/docker/go-connections v0.3.0/go.mod h1:Gbd7IOopHjR8Iph03tsViu4nIes5XhDvyHbTtUxmeec= github.com/docker/go-connections v0.4.0 h1:El9xVISelRB7BuFusrZozjnkIM5YnzCViNKohAFqRJQ= @@ -182,6 +186,7 @@ github.com/go-ldap/ldap/v3 v3.1.3/go.mod h1:3rbOH3jRS2u6jg2rJnKAMLE/xQyCKIveG2Sa github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= github.com/go-logr/logr v0.1.0/go.mod h1:ixOQHD9gLJUVQQ2ZOR7zLEifBX6tGkNJF4QyIY7sIas= +github.com/go-ole/go-ole v1.2.1 h1:2lOsA72HgjxAuMlKpFiCbHTvu44PIVkZ5hqm3RSdI/E= github.com/go-ole/go-ole v1.2.1/go.mod h1:7FAglXiTm7HKlQRDeOQ6ZNUHidzCWXuZWq/1dTyBNF8= github.com/go-openapi/jsonpointer v0.0.0-20160704185906-46af16f9f7b1/go.mod h1:+35s3my2LFTysnkMfxsJBAMHj/DoqoB9knIWoYG/Vk0= github.com/go-openapi/jsonreference v0.0.0-20160704190145-13c6e3589ad9/go.mod h1:W3Z9FmVs9qj+KR4zFKmDPGiLdk1D9Rlm7cyMvf57TTg= @@ -368,6 +373,7 @@ github.com/imdario/mergo v0.3.6/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJ github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= github.com/jackc/fake v0.0.0-20150926172116-812a484cc733/go.mod h1:WrMFNQdiFJ80sQsxDoMokWK1W5TQtxBFNpzWTD84ibQ= github.com/jackc/pgx v3.3.0+incompatible/go.mod h1:0ZGrqGqkRlliWnWB4zKnWtjbSWbGkVEFm4TeybAXq+I= +github.com/jarcoal/httpmock v0.0.0-20180424175123-9c70cfe4a1da h1:FjHUJJ7oBW4G/9j1KzlHaXL09LyMVM9rupS39lncbXk= github.com/jarcoal/httpmock v0.0.0-20180424175123-9c70cfe4a1da/go.mod h1:ks+b9deReOc7jgqp+e7LuFiCBH6Rm5hL32cLcEAArb4= github.com/jehiah/go-strftime v0.0.0-20171201141054-1d33003b3869/go.mod h1:cJ6Cj7dQo+O6GJNiMx+Pa94qKj+TG8ONdKHgMNIyyag= github.com/jinzhu/copier v0.0.0-20190625015134-976e0346caa8 h1:mGIXW/lubQ4B+3bXTLxcTMTjUNDqoF6T/HUW9LbFx9s= @@ -391,6 +397,7 @@ github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvW github.com/kisielk/errcheck v1.2.0/go.mod h1:/BMXB+zMLi60iA8Vv6Ksmxu/1UDYcXs4uQLJ+jE2L00= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= +github.com/konsorten/go-windows-terminal-sequences v1.0.2 h1:DB17ag19krx9CFsz4o3enTrPXyIXCl+2iCXH/aMAp9s= github.com/konsorten/go-windows-terminal-sequences v1.0.2/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= @@ -548,6 +555,7 @@ github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg github.com/shirou/gopsutil v0.0.0-20181107111621-48177ef5f880/go.mod h1:5b4v6he4MtMOwMlS0TUMTu2PcXUg8+E1lC7eC3UO/RA= github.com/shirou/gopsutil v2.19.9+incompatible h1:IrPVlK4nfwW10DF7pW+7YJKws9NkgNzWozwwWv9FsgY= github.com/shirou/gopsutil v2.19.9+incompatible/go.mod h1:5b4v6he4MtMOwMlS0TUMTu2PcXUg8+E1lC7eC3UO/RA= +github.com/shirou/w32 v0.0.0-20160930032740-bb4de0191aa4 h1:udFKJ0aHUL60LboW/A+DfgoHVedieIzIXE8uylPue0U= github.com/shirou/w32 v0.0.0-20160930032740-bb4de0191aa4/go.mod h1:qsXQc7+bwAM3Q1u/4XEfrquwF8Lw7D7y5cD8CuHnfIc= github.com/shopspring/decimal v0.0.0-20180709203117-cd690d0c9e24/go.mod h1:M+9NzErvs504Cn4c5DxATwIqPbtswREoFCre64PpcG4= github.com/shurcooL/sanitized_anchor_name v1.0.0 h1:PdmoCO6wvbs+7yrJyMORt4/BmY5IYyJwS/kOiWx8mHo= From e6ac14c7b56119bcf3252cd494d5fd4adc27fdf0 Mon Sep 17 00:00:00 2001 From: "yangqing.xyq" Date: Tue, 3 Nov 2020 10:49:33 +0800 Subject: [PATCH 200/227] resolve conversation --- pkg/client/httpclient/http_client.go | 12 ++++++------ pkg/client/httpclient/http_response.go | 1 + pkg/config/api_config.go | 2 +- pkg/pool/pool.go | 2 +- 4 files changed, 9 insertions(+), 8 deletions(-) diff --git a/pkg/client/httpclient/http_client.go b/pkg/client/httpclient/http_client.go index 31f431c85..f47528963 100644 --- a/pkg/client/httpclient/http_client.go +++ b/pkg/client/httpclient/http_client.go @@ -68,19 +68,19 @@ type HTTPClient struct { GenericServicePool map[string]*dg.GenericService } -// SingleHttpClient singleton HTTP Client -func SingleHttpClient() *HTTPClient { +// SingleHTTPClient singleton HTTP Client +func SingleHTTPClient() *HTTPClient { if _httpClient == nil { countDown.Do(func() { - _httpClient = NewHttpClient() + _httpClient = NewHTTPClient() }) } return _httpClient } -// NewHttpClient create dubbo client -func NewHttpClient() *HTTPClient { +// NewHTTPClient create dubbo client +func NewHTTPClient() *HTTPClient { return &HTTPClient{ mLock: sync.RWMutex{}, GenericServicePool: make(map[string]*dg.GenericService), @@ -104,7 +104,7 @@ func (dc *HTTPClient) Close() error { // Call invoke service func (dc *HTTPClient) Call(r *client.Request) (resp client.Response, err error) { - var urlStr = r.API.IntegrationRequest.HTTPBackendConfig.Protocol + "://" + r.API.IntegrationRequest.HTTPBackendConfig.TargetUrl + var urlStr = r.API.IntegrationRequest.HTTPBackendConfig.Protocol + "://" + r.API.IntegrationRequest.HTTPBackendConfig.TargetURL var httpClient = &http.Client{Timeout: 5 * time.Second} var request = r.IngressRequest.Clone(context.Background()) request.URL, _ = url.ParseRequestURI(urlStr) diff --git a/pkg/client/httpclient/http_response.go b/pkg/client/httpclient/http_response.go index fc73ea8d8..5dec853be 100644 --- a/pkg/client/httpclient/http_response.go +++ b/pkg/client/httpclient/http_response.go @@ -14,6 +14,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ + package httpclient import ( diff --git a/pkg/config/api_config.go b/pkg/config/api_config.go index be1d22873..afd524a5b 100644 --- a/pkg/config/api_config.go +++ b/pkg/config/api_config.go @@ -140,7 +140,7 @@ type DubboBackendConfig struct { // HTTPBackendConfig defines the basic dubbo backend config type HTTPBackendConfig struct { //TODO resolve from yaml config needed. head mapping needed. paramMappingneeded - TargetUrl string `yaml:"targetUrl" json:"targetUrl"` + TargetURL string `yaml:"targetUrl" json:"targetUrl"` ApplicationName string `yaml:"applicationName" json:"applicationName"` Protocol string `yaml:"protocol" json:"protocol,schema" default:"https"` Version string `yaml:"version" json:"version"` diff --git a/pkg/pool/pool.go b/pkg/pool/pool.go index 8006e2c25..0617998a4 100644 --- a/pkg/pool/pool.go +++ b/pkg/pool/pool.go @@ -47,7 +47,7 @@ func newClientPool() *ClientPool { } clientPool.poolMap[config.HTTPRequest] = &sync.Pool{ New: func() interface{} { - return httpclient.NewHttpClient() + return httpclient.NewHTTPClient() }, } return clientPool From a9adcdc64e77546c3a7c0174e82043a3cf04b772 Mon Sep 17 00:00:00 2001 From: shen Date: Tue, 3 Nov 2020 12:35:59 +0800 Subject: [PATCH 201/227] zookeeper path --- before_ut.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/before_ut.sh b/before_ut.sh index 8d4fc5984..02bef2d99 100755 --- a/before_ut.sh +++ b/before_ut.sh @@ -16,7 +16,7 @@ zkJarName="zookeeper-3.4.9-fatjar.jar" remoteJarUrl="https://github.com/dubbogo/resources/raw/master/zookeeper-4unitest/contrib/fatjar/${zkJarName}" -zkJarPath="pkg/registry/zookeeper/zookeeper-4unittest/contrib/fatjar" +zkJarPath="pkg/registry/zookeeper-4unittest/contrib/fatjar" zkJar="${zkJarPath}/${zkJarName}" if [ ! -f "${zkJar}" ]; then From 8254786440e0c6587566036e3a7c4e7d5e9de664 Mon Sep 17 00:00:00 2001 From: zhangshen023 <1292369127@qq.com> Date: Tue, 3 Nov 2020 22:41:38 +0800 Subject: [PATCH 202/227] code optimization Former-commit-id: 0e7adc349a93ffef93c4aefc1c1825a58837a91e Former-commit-id: 47ca5de153f6ae5593fb4a3eafd296bc7eca3f76 --- .travis.yml | 3 +-- pkg/common/constant/{interface_url.go => url.go} | 0 pkg/registry/{consul_registry.go => consul.go} | 8 ++++---- pkg/registry/{consul_registry_test.go => consul_test.go} | 0 pkg/registry/{registry_load.go => load.go} | 0 pkg/registry/util.go | 3 --- pkg/registry/{zookeeper_registry.go => zookeeper.go} | 6 +++--- .../{zookeeper_registry_test.go => zookeeper_test.go} | 5 +---- 8 files changed, 9 insertions(+), 16 deletions(-) rename pkg/common/constant/{interface_url.go => url.go} (100%) rename pkg/registry/{consul_registry.go => consul.go} (100%) rename pkg/registry/{consul_registry_test.go => consul_test.go} (100%) rename pkg/registry/{registry_load.go => load.go} (100%) rename pkg/registry/{zookeeper_registry.go => zookeeper.go} (100%) rename pkg/registry/{zookeeper_registry_test.go => zookeeper_test.go} (99%) diff --git a/.travis.yml b/.travis.yml index 424a72213..0eff0dc9e 100644 --- a/.travis.yml +++ b/.travis.yml @@ -21,5 +21,4 @@ after_success: - bash <(curl -s https://codecov.io/bash) notifications: - webhooks: https://oapi.dingtalk.com/robot/send?access_token=e6b085c90561a7543cc5fde89e9c8108100460c15e955c0604fea180a500a0ad - + webhooks: https://oapi.dingtalk.com/robot/send?access_token=e6b085c90561a7543cc5fde89e9c8108100460c15e955c0604fea180a500a0ad \ No newline at end of file diff --git a/pkg/common/constant/interface_url.go b/pkg/common/constant/url.go similarity index 100% rename from pkg/common/constant/interface_url.go rename to pkg/common/constant/url.go diff --git a/pkg/registry/consul_registry.go b/pkg/registry/consul.go similarity index 100% rename from pkg/registry/consul_registry.go rename to pkg/registry/consul.go index dba78c978..075c391f0 100644 --- a/pkg/registry/consul_registry.go +++ b/pkg/registry/consul.go @@ -22,10 +22,6 @@ import ( "strings" ) -import ( - "github.com/dubbogo/dubbo-go-proxy/pkg/logger" -) - import ( "github.com/apache/dubbo-go/common" "github.com/apache/dubbo-go/common/constant" @@ -33,6 +29,10 @@ import ( perrors "github.com/pkg/errors" ) +import ( + "github.com/dubbogo/dubbo-go-proxy/pkg/logger" +) + func init() { var _ Loader = new(ConsulRegistryLoad) } diff --git a/pkg/registry/consul_registry_test.go b/pkg/registry/consul_test.go similarity index 100% rename from pkg/registry/consul_registry_test.go rename to pkg/registry/consul_test.go diff --git a/pkg/registry/registry_load.go b/pkg/registry/load.go similarity index 100% rename from pkg/registry/registry_load.go rename to pkg/registry/load.go diff --git a/pkg/registry/util.go b/pkg/registry/util.go index da6471385..2de26653d 100644 --- a/pkg/registry/util.go +++ b/pkg/registry/util.go @@ -18,9 +18,6 @@ package registry import ( "github.com/apache/dubbo-go/common" -) - -import ( "github.com/dubbogo/dubbo-go-proxy/pkg/common/constant" "github.com/dubbogo/dubbo-go-proxy/pkg/config" ) diff --git a/pkg/registry/zookeeper_registry.go b/pkg/registry/zookeeper.go similarity index 100% rename from pkg/registry/zookeeper_registry.go rename to pkg/registry/zookeeper.go index 6f1059474..bf11620f9 100644 --- a/pkg/registry/zookeeper_registry.go +++ b/pkg/registry/zookeeper.go @@ -23,12 +23,12 @@ import ( ) import ( - "github.com/dubbogo/dubbo-go-proxy/pkg/logger" + "github.com/apache/dubbo-go/common" + "github.com/apache/dubbo-go/remoting/zookeeper" ) import ( - "github.com/apache/dubbo-go/common" - "github.com/apache/dubbo-go/remoting/zookeeper" + "github.com/dubbogo/dubbo-go-proxy/pkg/logger" ) const ( diff --git a/pkg/registry/zookeeper_registry_test.go b/pkg/registry/zookeeper_test.go similarity index 99% rename from pkg/registry/zookeeper_registry_test.go rename to pkg/registry/zookeeper_test.go index e07339400..7e89a15ca 100644 --- a/pkg/registry/zookeeper_registry_test.go +++ b/pkg/registry/zookeeper_test.go @@ -25,14 +25,11 @@ import ( "time" ) -import ( - "github.com/dubbogo/go-zookeeper/zk" -) - import ( "github.com/apache/dubbo-go/common" "github.com/apache/dubbo-go/common/constant" "github.com/apache/dubbo-go/remoting/zookeeper" + "github.com/dubbogo/go-zookeeper/zk" "github.com/stretchr/testify/assert" ) From ca57634dafe0211d7a4640e63b06fdc9f4db96b3 Mon Sep 17 00:00:00 2001 From: "yangqing.xyq" Date: Wed, 4 Nov 2020 14:19:00 +0800 Subject: [PATCH 203/227] resolve conversation --- pkg/client/dubbo/dubbo_client.go | 4 ++-- pkg/client/httpclient/http_client.go | 23 ++--------------------- pkg/client/request.go | 5 ++++- pkg/pool/pool.go | 5 ++++- pkg/proxy/proxy_start.go | 2 +- pkg/service/api/discovery_service.go | 2 -- 6 files changed, 13 insertions(+), 28 deletions(-) diff --git a/pkg/client/dubbo/dubbo_client.go b/pkg/client/dubbo/dubbo_client.go index fffbe2fd8..fd0eddf68 100644 --- a/pkg/client/dubbo/dubbo_client.go +++ b/pkg/client/dubbo/dubbo_client.go @@ -56,8 +56,8 @@ type DubboClient struct { GenericServicePool map[string]*dg.GenericService } -// SingleDubboClient singleton dubbo clent -func SingleDubboClient() *DubboClient { +// SingletonDubboClient singleton dubbo clent +func SingletonDubboClient() *DubboClient { if _DubboClient == nil { onceClient.Do(func() { _DubboClient = NewDubboClient() diff --git a/pkg/client/httpclient/http_client.go b/pkg/client/httpclient/http_client.go index f47528963..ef98941a3 100644 --- a/pkg/client/httpclient/http_client.go +++ b/pkg/client/httpclient/http_client.go @@ -68,8 +68,8 @@ type HTTPClient struct { GenericServicePool map[string]*dg.GenericService } -// SingleHTTPClient singleton HTTP Client -func SingleHTTPClient() *HTTPClient { +// SingletonHTTPClient singleton HTTP Client +func SingletonHTTPClient() *HTTPClient { if _httpClient == nil { countDown.Do(func() { @@ -121,16 +121,6 @@ func (dc *HTTPClient) get(key string) *dg.GenericService { return dc.GenericServicePool[key] } -func (dc *HTTPClient) check(key string) bool { - dc.mLock.RLock() - defer dc.mLock.RUnlock() - if _, ok := dc.GenericServicePool[key]; ok { - return true - } else { - return false - } -} - func (dc *HTTPClient) create(key string, dm *RestMetadata) *dg.GenericService { referenceConfig := dg.NewReferenceConfig(dm.Interface, context.TODO()) referenceConfig.InterfaceName = dm.Interface @@ -164,12 +154,3 @@ func (dc *HTTPClient) create(key string, dm *RestMetadata) *dg.GenericService { dc.GenericServicePool[key] = clientService return clientService } - -// Get find a dubbo GenericService -func (dc *HTTPClient) Get(interfaceName, version, group string, dm *RestMetadata) *dg.GenericService { - key := strings.Join([]string{dm.ApplicationName, interfaceName, version, group}, "_") - if dc.check(key) { - return dc.get(key) - } - return dc.create(key, dm) -} diff --git a/pkg/client/request.go b/pkg/client/request.go index 3c516c6e2..e8fe1d072 100644 --- a/pkg/client/request.go +++ b/pkg/client/request.go @@ -18,10 +18,13 @@ package client import ( - "github.com/dubbogo/dubbo-go-proxy/pkg/router" "net/http" ) +import ( + "github.com/dubbogo/dubbo-go-proxy/pkg/router" +) + // Request request for endpoint type Request struct { IngressRequest *http.Request diff --git a/pkg/pool/pool.go b/pkg/pool/pool.go index 0617998a4..f9dde3994 100644 --- a/pkg/pool/pool.go +++ b/pkg/pool/pool.go @@ -19,11 +19,14 @@ package pool import ( "errors" + "sync" +) + +import ( "github.com/dubbogo/dubbo-go-proxy/pkg/client" "github.com/dubbogo/dubbo-go-proxy/pkg/client/dubbo" "github.com/dubbogo/dubbo-go-proxy/pkg/client/httpclient" "github.com/dubbogo/dubbo-go-proxy/pkg/config" - "sync" ) //ClientPool a pool of client. diff --git a/pkg/proxy/proxy_start.go b/pkg/proxy/proxy_start.go index 609c14bd3..33fcd90a8 100644 --- a/pkg/proxy/proxy_start.go +++ b/pkg/proxy/proxy_start.go @@ -59,7 +59,7 @@ func (p *Proxy) Start() { } func (p *Proxy) beforeStart() { - dubbo.SingleDubboClient().Init() + dubbo.SingletonDubboClient().Init() api.InitAPIsFromConfig(config.GetAPIConf()) } diff --git a/pkg/service/api/discovery_service.go b/pkg/service/api/discovery_service.go index aa61fe26c..9206cfbf2 100644 --- a/pkg/service/api/discovery_service.go +++ b/pkg/service/api/discovery_service.go @@ -22,8 +22,6 @@ import ( "fmt" ) -import () - import ( "github.com/dubbogo/dubbo-go-proxy/pkg/common/constant" "github.com/dubbogo/dubbo-go-proxy/pkg/common/extension" From 482ad0c49e76ae48a6523039aca305066059e88d Mon Sep 17 00:00:00 2001 From: "yangqing.xyq" Date: Wed, 4 Nov 2020 14:45:02 +0800 Subject: [PATCH 204/227] resolve conversation --- pkg/client/metadata.go | 1 + 1 file changed, 1 insertion(+) diff --git a/pkg/client/metadata.go b/pkg/client/metadata.go index 164b01624..3c4cb6809 100644 --- a/pkg/client/metadata.go +++ b/pkg/client/metadata.go @@ -14,6 +14,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ + package client // DubboMetadata dubbo metadata, api config From b1249821275bd34ff09373090ec9d813c299f43b Mon Sep 17 00:00:00 2001 From: shen Date: Wed, 4 Nov 2020 18:23:57 +0800 Subject: [PATCH 205/227] code optimization Former-commit-id: 9af5662992be62e578dcdf2df1c0a48a9a560a0d Former-commit-id: 137b379f226061dd12317e941e476bc9c9d41a3c --- pkg/registry/consul.go | 1 + pkg/registry/consul_test.go | 15 +++++++++++---- pkg/registry/zookeeper.go | 5 +++-- 3 files changed, 15 insertions(+), 6 deletions(-) diff --git a/pkg/registry/consul.go b/pkg/registry/consul.go index 075c391f0..9be262585 100644 --- a/pkg/registry/consul.go +++ b/pkg/registry/consul.go @@ -65,6 +65,7 @@ func newConsulRegistryLoad(address, cluster string) (Loader, error) { return r, nil } +// nolint func (crl *ConsulRegistryLoad) GetCluster() (string, error) { return crl.cluster, nil } diff --git a/pkg/registry/consul_test.go b/pkg/registry/consul_test.go index 7ebadb2ab..affd58fa6 100644 --- a/pkg/registry/consul_test.go +++ b/pkg/registry/consul_test.go @@ -19,6 +19,7 @@ package registry import ( "net/url" "strconv" + "strings" "testing" ) @@ -54,7 +55,7 @@ func TestConsulRegistryLoad_GetCluster(t *testing.T) { func TestConsulRegistryLoad_LoadAllServices(t *testing.T) { consulAgent := consul.NewConsulAgent(t, registryPort) defer consulAgent.Shutdown() - registryUrl, _ := common.NewURL(protocol + "://" + providerHost + ":" + strconv.Itoa(providerPort) + "/" + service + "?anyhost=true&" + + registryURL, _ := common.NewURL(protocol + "://" + providerHost + ":" + strconv.Itoa(providerPort) + "/" + service + "?anyhost=true&" + "application=BDTService&category=providers&default.timeout=10000&dubbo=dubbo-provider-golang-1.0.0&" + "environment=dev&interface=com.ikurento.user.UserProvider&ip=192.168.56.1&methods=GetUser%2C&" + "module=dubbogo+user-info+server&org=ikurento.com&owner=ZX&pid=1447&revision=0.0.1&" + @@ -62,14 +63,20 @@ func TestConsulRegistryLoad_LoadAllServices(t *testing.T) { registry, err := extension.GetRegistry("consul", common.NewURLWithOptions(common.WithParams(url.Values{}), common.WithIp("localhost"), common.WithPort("8500"), common.WithParamsValue(constant.ROLE_KEY, strconv.Itoa(common.PROVIDER)))) assert.Nil(t, err) - err = registry.Register(registryUrl) + err = registry.Register(registryURL) assert.Nil(t, err) - defer registry.UnRegister(registryUrl) + defer registry.UnRegister(registryURL) loader, err := newConsulRegistryLoad(registryHost+":"+strconv.Itoa(registryPort), "test_cluster") assert.Nil(t, err) services, err := loader.LoadAllServices() assert.Nil(t, err) assert.Len(t, services, 1) assert.Contains(t, services[0].Methods, "GetUser") - assert.Equal(t, services[0].GetParams(), registryUrl.GetParams()) + assert.Equal(t, services[0].GetParams(), registryURL.GetParams()) +} + +func TestName(t *testing.T) { + s := "1,,,1" + right := strings.TrimRight(s, ",") + t.Log(right) } diff --git a/pkg/registry/zookeeper.go b/pkg/registry/zookeeper.go index bf11620f9..c9728a243 100644 --- a/pkg/registry/zookeeper.go +++ b/pkg/registry/zookeeper.go @@ -39,7 +39,7 @@ func init() { var _ Loader = new(ZookeeperRegistryLoad) } -// ConsulRegistryLoad load dubbo apis from consul registry +// ZookeeperRegistryLoad load dubbo apis from zookeeper registry type ZookeeperRegistryLoad struct { zkName string client *zookeeper.ZookeeperClient @@ -63,11 +63,12 @@ func newZookeeperRegistryLoad(address, cluster string) (Loader, error) { return r, nil } +// nolint func (crl *ZookeeperRegistryLoad) GetCluster() (string, error) { return crl.cluster, nil } -// LoadAllServices load all services from consul registry +// LoadAllServices load all services from zookeeper registry func (crl *ZookeeperRegistryLoad) LoadAllServices() ([]common.URL, error) { children, err := crl.client.GetChildren(rootPath) if err != nil { From 73bf6175f2bfe9ef0c4434097eca300fcc74bbce Mon Sep 17 00:00:00 2001 From: "yangqing.xyq" Date: Wed, 4 Nov 2020 18:44:17 +0800 Subject: [PATCH 206/227] resolve conversation --- pkg/client/dubbo/dubbo_client.go | 12 ++++++------ pkg/client/request.go | 4 ++-- pkg/context/base_context.go | 5 ++--- pkg/filter/remote_call_filter.go | 2 +- 4 files changed, 11 insertions(+), 12 deletions(-) diff --git a/pkg/client/dubbo/dubbo_client.go b/pkg/client/dubbo/dubbo_client.go index fd0eddf68..d37682ca7 100644 --- a/pkg/client/dubbo/dubbo_client.go +++ b/pkg/client/dubbo/dubbo_client.go @@ -96,10 +96,10 @@ func (dc *DubboClient) Call(r *client.Request) (resp client.Response, err error) gs := dc.Get(dm.Interface, dm.DubboBackendConfig.Version, dm.Group, dm) var reqData []interface{} - var indate []byte + var ingaressReqDate []byte var e error - indate, e = ioutil.ReadAll(r.IngressRequest.Body) + ingaressReqDate, e = ioutil.ReadAll(r.IngressRequest.Body) if e != nil { return *client.EmptyResponse, err @@ -112,28 +112,28 @@ func (dc *DubboClient) Call(r *client.Request) (resp client.Response, err error) switch t { case JavaStringClassName: var s string - if err := json.Unmarshal(indate, &s); err != nil { + if err := json.Unmarshal(ingaressReqDate, &s); err != nil { logger.Errorf("params parse error:%+v", err) } else { reqData = append(reqData, s) } case JavaLangClassName: var i int - if err := json.Unmarshal(indate, &i); err != nil { + if err := json.Unmarshal(ingaressReqDate, &i); err != nil { logger.Errorf("params parse error:%+v", err) } else { reqData = append(reqData, i) } default: bodyMap := make(map[string]interface{}) - if err := json.Unmarshal(indate, &bodyMap); err != nil { + if err := json.Unmarshal(ingaressReqDate, &bodyMap); err != nil { return *client.EmptyResponse, err } else { reqData = append(reqData, bodyMap) } } case l > 1: - if err = json.Unmarshal(indate, &reqData); err != nil { + if err = json.Unmarshal(ingaressReqDate, &reqData); err != nil { return *client.EmptyResponse, err } } diff --git a/pkg/client/request.go b/pkg/client/request.go index e8fe1d072..2863362b0 100644 --- a/pkg/client/request.go +++ b/pkg/client/request.go @@ -31,8 +31,8 @@ type Request struct { API *router.API } -// NewRequest create a request -func NewRequest(request *http.Request, api *router.API) *Request { +// NewReq create a request +func NewReq(request *http.Request, api *router.API) *Request { return &Request{ IngressRequest: request, API: api, diff --git a/pkg/context/base_context.go b/pkg/context/base_context.go index c7b1b5428..e1fa4b4b0 100644 --- a/pkg/context/base_context.go +++ b/pkg/context/base_context.go @@ -18,7 +18,7 @@ package context import ( - "log" + "github.com/dubbogo/dubbo-go-proxy/pkg/logger" "math" ) @@ -54,8 +54,7 @@ func (c *BaseContext) Abort() { // AbortWithError filter chain break , filter after the current filter will not executed. And log will print. func (c *BaseContext) AbortWithError(message string, err error) { c.Index = abortIndex - log.Println(message, err) //TODO print stack - + logger.GetLogger().Error(err) } func (c *BaseContext) AppendFilterFunc(ff ...FilterFunc) { diff --git a/pkg/filter/remote_call_filter.go b/pkg/filter/remote_call_filter.go index 6d2f6710b..803b681bc 100644 --- a/pkg/filter/remote_call_filter.go +++ b/pkg/filter/remote_call_filter.go @@ -54,7 +54,7 @@ func doRemoteCall(c *http.HttpContext) { c.AbortWithError("", e) } - if resp, err := cl.Call(client.NewRequest(c.Request, api)); err != nil { + if resp, err := cl.Call(client.NewReq(c.Request, api)); err != nil { logger.Errorf("[dubboproxy go] client do err:%v!", err) c.WriteFail() c.Abort() From 3b664d3ef673a821ed5bfd237e78a92b220537a1 Mon Sep 17 00:00:00 2001 From: "yangqing.xyq" Date: Wed, 4 Nov 2020 19:09:36 +0800 Subject: [PATCH 207/227] resolve conversation --- pkg/client/httpclient/http_client.go | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/pkg/client/httpclient/http_client.go b/pkg/client/httpclient/http_client.go index ef98941a3..ec5af1379 100644 --- a/pkg/client/httpclient/http_client.go +++ b/pkg/client/httpclient/http_client.go @@ -83,7 +83,7 @@ func SingletonHTTPClient() *HTTPClient { func NewHTTPClient() *HTTPClient { return &HTTPClient{ mLock: sync.RWMutex{}, - GenericServicePool: make(map[string]*dg.GenericService), + GenericServicePool: make(map[string]*dg.GenericService, 4), } } @@ -104,15 +104,15 @@ func (dc *HTTPClient) Close() error { // Call invoke service func (dc *HTTPClient) Call(r *client.Request) (resp client.Response, err error) { - var urlStr = r.API.IntegrationRequest.HTTPBackendConfig.Protocol + "://" + r.API.IntegrationRequest.HTTPBackendConfig.TargetURL - var httpClient = &http.Client{Timeout: 5 * time.Second} - var request = r.IngressRequest.Clone(context.Background()) + urlStr := r.API.IntegrationRequest.HTTPBackendConfig.Protocol + "://" + r.API.IntegrationRequest.HTTPBackendConfig.TargetURL + httpClient := &http.Client{Timeout: 5 * time.Second} + request := r.IngressRequest.Clone(context.Background()) request.URL, _ = url.ParseRequestURI(urlStr) //TODO header replace, url rewrite.... - var tmpRet, e = httpClient.Do(request) - var ret = client.Response{Data: tmpRet} - return ret, e + tmpRet, err := httpClient.Do(request) + ret := client.Response{Data: tmpRet} + return ret, err } func (dc *HTTPClient) get(key string) *dg.GenericService { From 9fdc45f360917b91c0fd1a67ab5a3d0c4db0243d Mon Sep 17 00:00:00 2001 From: tiecheng Date: Fri, 6 Nov 2020 10:41:17 +0800 Subject: [PATCH 208/227] sample base file --- sample/proxy/api_config.yaml | 64 ++++++++++++++ sample/proxy/conf.yaml | 62 ++++++++++++++ sample/sample.md | 28 +++++++ sample/server/app/server.go | 78 +++++++++++++++++ sample/server/app/user.go | 144 ++++++++++++++++++++++++++++++++ sample/server/app/version.go | 22 +++++ sample/server/config/log.yml | 27 ++++++ sample/server/config/server.yml | 66 +++++++++++++++ 8 files changed, 491 insertions(+) create mode 100644 sample/proxy/api_config.yaml create mode 100644 sample/proxy/conf.yaml create mode 100644 sample/sample.md create mode 100644 sample/server/app/server.go create mode 100644 sample/server/app/user.go create mode 100644 sample/server/app/version.go create mode 100644 sample/server/config/log.yml create mode 100644 sample/server/config/server.yml diff --git a/sample/proxy/api_config.yaml b/sample/proxy/api_config.yaml new file mode 100644 index 000000000..5b2e2dfbe --- /dev/null +++ b/sample/proxy/api_config.yaml @@ -0,0 +1,64 @@ +name: proxy +description: proxy sample +resources: + - path: '/api/v1/test-dubbo/user' + type: restful + description: resource documentation + filters: + - filter0 + methods: + - httpVerb: GET + onAir: true + inboundRequest: + requestType: http + queryStrings: + - name: name + required: true + integrationRequest: + requestType: dubbo + mappingParams: + - name: queryStrings.name + mapTo: 1 + applicationName: "UserProvider" + interface: "com.ic.user.UserProvider" + method: "GetUserByName" + group: "test" + version: 1.0.0 + clusterName: "test_dubbo" + - path: '/api/v1/test-dubbo/user' + type: restful + description: resource documentation + filters: + - filter0 + methods: + - httpVerb: POST + onAir: true + inboundRequest: + requestType: http + requestBody: + - definitionName: userCreate + integrationRequest: + requestType: dubbo + applicationName: "UserProvider" + interface: "com.ic.user.UserProvider" + method: "CreateUser" + clusterName: "test_dubbo" + group: "test" + version: 1.0.0 +definitions: + - name: userCreate + schema: >- + { + "type" : "object", + "properties" : { + "id" : { + "type" : "integer" + }, + "name" : { + "type" : "string" + }, + "age" : { + "type" : "integer" + } + } + } diff --git a/sample/proxy/conf.yaml b/sample/proxy/conf.yaml new file mode 100644 index 000000000..3b71e9abe --- /dev/null +++ b/sample/proxy/conf.yaml @@ -0,0 +1,62 @@ +--- +static_resources: + listeners: + - name: "net/http" + address: + socket_address: + protocol_type: "HTTP" + address: "0.0.0.0" + port: 8888 + filter_chains: + - filter_chain_match: + domains: + - api.dubbo.com + - api.proxy.com + filters: + - name: dgp.filters.http_connect_manager + config: + route_config: + routes: + - match: + prefix: "/api/v1" + headers: + - name: "X-DGP-WAY" + value: "dubbo" + route: + cluster: "test_dubbo" + cluster_not_found_response_code: 505 + cors: + allow_origin: + - "*" + enabled: true + http_filters: + - name: dgp.filters.http.api + config: + - name: dgp.filters.http.router + config: + - name: dgp.filters.http_transfer_dubbo + config: + server_name: "test_http_dubbo" + generate_request_id: false + config: + idle_timeout: 5s + read_timeout: 5s + write_timeout: 5s + clusters: + - name: "test_dubbo" + lb_policy: "RoundRobin" + connect_timeout: "5s" + request_timeout: "10s" + registries: + "zookeeper": + timeout: "3s" + address: "127.0.0.1:2182" + username: "" + password: "" + "consul": + timeout: "3s" + address: "127.0.0.1:8500" + shutdown_config: + timeout: "60s" + step_timeout: "10s" + reject_policy: "immediacy" \ No newline at end of file diff --git a/sample/sample.md b/sample/sample.md new file mode 100644 index 000000000..c096477e0 --- /dev/null +++ b/sample/sample.md @@ -0,0 +1,28 @@ +# 本地例子 + +> 自行准备好 zookeeper 环境 + +## 启动服务提供方 + +配置好下面两个环境变量: +- CONF_PROVIDER_FILE_PATH=/XXX/dubbo-go-proxy/sample/server/config/server.yml +- APP_LOG_CONF_FILE=/XXX/dubbo-go-proxy/sample/server/config/log.yml + +运行 sample/server/app/server.go + +## 启动 proxy + +配置好下面的环境变量: +- -c /Users/tc/Documents/workspace_2020/dubbo-go-proxy/sample/proxy/conf.yaml +- -a /Users/tc/Documents/workspace_2020/dubbo-go-proxy/sample/proxy/api_config.yaml + +运行 cmd/proxy/proxy.go + +因为没有配置 dubbogo 的配置文件,所以启动的时候出现日志如下: +```bash +2020/11/06 10:29:09 [InitLog] warn: ioutil.ReadFile(file:./conf/log.yml) = error:open ./conf/log.yml: no such file or directory +2020/11/06 10:29:09 [InitLog] warn: log configure file name is nil +2020/11/06 10:29:28 [consumerInit] application configure(consumer) file name is nil +2020/11/06 10:29:28 [providerInit] application configure(provider) file name is nil +``` + diff --git a/sample/server/app/server.go b/sample/server/app/server.go new file mode 100644 index 000000000..00d924a97 --- /dev/null +++ b/sample/server/app/server.go @@ -0,0 +1,78 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + */ + +package main + +import ( + "fmt" + "os" + "os/signal" + "syscall" + "time" +) + +import ( + hessian "github.com/apache/dubbo-go-hessian2" + "github.com/apache/dubbo-go/common/logger" + "github.com/apache/dubbo-go/config" + _ "github.com/apache/dubbo-go/protocol/dubbo" + _ "github.com/apache/dubbo-go/registry/protocol" + + _ "github.com/apache/dubbo-go/common/proxy/proxy_factory" + _ "github.com/apache/dubbo-go/filter/filter_impl" + + _ "github.com/apache/dubbo-go/cluster/cluster_impl" + _ "github.com/apache/dubbo-go/cluster/loadbalance" + _ "github.com/apache/dubbo-go/registry/zookeeper" +) + +var ( + survivalTimeout = int(3e9) +) + +// they are necessary: +// export CONF_PROVIDER_FILE_PATH="xxx" +// export APP_LOG_CONF_FILE="xxx" +func main() { + hessian.RegisterPOJO(&User{}) + config.Load() + + initSignal() +} + +func initSignal() { + signals := make(chan os.Signal, 1) + // It is not possible to block SIGKILL or syscall.SIGSTOP + signal.Notify(signals, os.Interrupt, os.Kill, syscall.SIGHUP, syscall.SIGQUIT, syscall.SIGTERM, syscall.SIGINT) + for { + sig := <-signals + logger.Infof("get signal %s", sig.String()) + switch sig { + case syscall.SIGHUP: + // reload() + default: + time.AfterFunc(time.Duration(survivalTimeout), func() { + logger.Warnf("app exit now by force...") + os.Exit(1) + }) + + // The program exits normally or timeout forcibly exits. + fmt.Println("provider app exit now...") + return + } + } +} diff --git a/sample/server/app/user.go b/sample/server/app/user.go new file mode 100644 index 000000000..27602514e --- /dev/null +++ b/sample/server/app/user.go @@ -0,0 +1,144 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + */ + +package main + +import ( + "context" + "errors" + "fmt" + "sync" + "time" +) + +import ( + hessian "github.com/apache/dubbo-go-hessian2" + "github.com/apache/dubbo-go/config" +) + +func init() { + config.SetProviderService(new(UserProvider)) + // ------for hessian2------ + hessian.RegisterPOJO(&User{}) + + cache = &UserDB{ + cacheMap: make(map[string]*User, 16), + lock: sync.Mutex{}, + } +} + +var cache *UserDB + +type UserDB struct { + // key is name, value is user obj + cacheMap map[string]*User + lock sync.Mutex +} + +func (db *UserDB) Add(u *User) bool { + db.lock.Lock() + defer db.lock.Unlock() + + db.cacheMap[u.Name] = u + return true +} + +func (db *UserDB) Get(n string) (*User, bool) { + db.lock.Lock() + defer db.lock.Unlock() + + r, ok := db.cacheMap[n] + return r, ok +} + +type User struct { + Id string + Name string + Age int32 + Time time.Time +} + +// version: 1.0.0 group: test +// methods: all +type UserProvider struct { +} + +func (u *UserProvider) CreateUser(ctx context.Context, user *User) (*User, error) { + println("Req QueryUser data:%#v", user) + if user == nil { + return nil, errors.New("not found") + } + _, ok := cache.Get(user.Name) + if ok { + return nil, errors.New("data is exist") + } + + cache.Add(user) + + return user, nil +} + +func (u *UserProvider) GetUserByName(ctx context.Context, name string) (*User, error) { + println("Req GetUserByName data:%#v", name) + r, ok := cache.Get(name) + if ok { + println("Req GetUserByName result:%#v", r) + return r, nil + } + + return nil, nil +} + +func (u *UserProvider) QueryUser(ctx context.Context, user *User) (*User, error) { + println("Req QueryUser data:%#v", user) + rsp := User{user.Id, user.Name, user.Age, time.Now()} + println("Req QueryUser data:%#v", rsp) + return &rsp, nil +} + +func (u *UserProvider) TwoSimpleParams(ctx context.Context, name string, age int32) (*User, error) { + println("Req TwoSimpleParams name:%s, age:%d", name, age) + rsp := User{"1", name, age, time.Now()} + println("Req TwoSimpleParams data:%#v", rsp) + return &rsp, nil +} + +func (u *UserProvider) TwoSimpleParamsWithError(ctx context.Context, name string, age int32) (*User, error) { + println("Req TwoSimpleParamsWithError name:%s, age:%d", name, age) + rsp := User{"1", name, age, time.Now()} + println("Req TwoSimpleParamsWithError data:%#v", rsp) + return &rsp, errors.New("TwoSimpleParams error") +} + +// 方法名称映射 +func (u *UserProvider) MethodMapper() map[string]string { + return map[string]string{ + "GetUserByName": "queryUserByName", + } +} + +func (u *UserProvider) Reference() string { + return "UserProvider" +} + +func (u User) JavaClassName() string { + return "com.ikurento.user.User" +} + +func println(format string, args ...interface{}) { + fmt.Printf("\033[32;40m"+format+"\033[0m\n", args...) +} diff --git a/sample/server/app/version.go b/sample/server/app/version.go new file mode 100644 index 000000000..ae51f45d9 --- /dev/null +++ b/sample/server/app/version.go @@ -0,0 +1,22 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + */ + +package main + +var ( + Version = "2.7.5" +) diff --git a/sample/server/config/log.yml b/sample/server/config/log.yml new file mode 100644 index 000000000..47f9e60f7 --- /dev/null +++ b/sample/server/config/log.yml @@ -0,0 +1,27 @@ +level: "info" +development: true +disableCaller: false +disableStacktrace: false +sampling: +encoding: "console" + +# encoder +encoderConfig: + messageKey: "message" + levelKey: "level" + timeKey: "time" + nameKey: "logger" + callerKey: "caller" + stacktraceKey: "stacktrace" + lineEnding: "" + levelEncoder: "capitalColor" + timeEncoder: "iso8601" + durationEncoder: "seconds" + callerEncoder: "short" + nameEncoder: "" + +outputPaths: + - "stderr" +errorOutputPaths: + - "stderr" +initialFields: diff --git a/sample/server/config/server.yml b/sample/server/config/server.yml new file mode 100644 index 000000000..101234a7d --- /dev/null +++ b/sample/server/config/server.yml @@ -0,0 +1,66 @@ +# dubbo server yaml configure file + + +# application config +application: + organization: "dubbogoproxy.com" + name: "User Micro Service" + module: "dubbogoproxy user-info server" + version: "0.0.1" + owner: "ZX" + environment: "dev" + +registries: + "zk1": + protocol: "zookeeper" + timeout: "3s" + address: "127.0.0.1:2181" + +services: + "UserProvider": + # 可以指定多个registry,使用逗号隔开;不指定默认向所有注册中心注册 + registry: "zk1" + protocol: "dubbo" + # 相当于dubbo.xml中的interface + interface: "com.ic.user.UserProvider" + loadbalance: "random" + warmup: "100" + cluster: "failover" + version: 1.0.0 + group: test + methods: + - name: "CreateUser" + retries: 1 + - name: "GetUser" + retries: 1 + loadbalance: "random" + - name: "QueryUser" + retries: 1 + loadbalance: "random" + - name: "TwoSimpleParams" + retries: 1 + loadbalance: "random" + +protocols: + "dubbo": + name: "dubbo" + port: 20000 + +protocol_conf: + dubbo: + session_number: 700 + session_timeout: "20s" + getty_session_param: + compress_encoding: false + tcp_no_delay: true + tcp_keep_alive: true + keep_alive_period: "120s" + tcp_r_buf_size: 262144 + tcp_w_buf_size: 65536 + pkg_rq_size: 1024 + pkg_wq_size: 512 + tcp_read_timeout: "1s" + tcp_write_timeout: "5s" + wait_timeout: "1s" + max_msg_len: 1024 + session_name: "server" From 081463ac5376126eb4567f43fced82b868b48504 Mon Sep 17 00:00:00 2001 From: tiecheng Date: Sun, 8 Nov 2020 16:52:07 +0800 Subject: [PATCH 209/227] add sample dubbogo. Former-commit-id: acd34ba7ad6b8e1e9e8a364c1850419a903b6dc6 Former-commit-id: 9bd6c4a131fccf91ab0ae97577ff18e27f3d95f1 --- cmd/proxy/control.go | 3 +- configs/client.yml | 0 pkg/client/client.go | 3 + pkg/client/dubbo/client.go | 307 ++++++++++++++++++ pkg/client/dubbo/client_test.go | 81 +++++ pkg/client/dubbo/dubbo_client.go | 213 ------------ .../dubbo/{dubbo_response.go => response.go} | 7 +- .../http_client.go => http/http.go} | 13 +- .../http_response.go => http/response.go} | 2 +- pkg/common/constant/filter.go | 1 + pkg/config/api_config.go | 1 + pkg/filter/recovery_filter.go | 1 + .../{remote_call_filter.go => remote/call.go} | 61 +++- pkg/model/cluster.go | 2 +- pkg/pool/pool.go | 25 +- pkg/proxy/listener.go | 1 + sample/dubbogo/client/app/client.go | 105 ++++++ sample/dubbogo/client/app/user.go | 33 ++ sample/dubbogo/client/config/client.yml | 50 +++ .../{server => dubbogo/client}/config/log.yml | 0 sample/{ => dubbogo}/proxy/api_config.yaml | 22 +- sample/{ => dubbogo}/proxy/conf.yaml | 8 +- sample/dubbogo/sample.md | 54 +++ sample/{ => dubbogo}/server/app/server.go | 0 sample/{ => dubbogo}/server/app/user.go | 17 +- sample/{ => dubbogo}/server/app/version.go | 0 sample/dubbogo/server/config/log.yml | 27 ++ sample/{ => dubbogo}/server/config/server.yml | 3 +- sample/sample.md | 28 -- 29 files changed, 774 insertions(+), 294 deletions(-) delete mode 100644 configs/client.yml create mode 100644 pkg/client/dubbo/client.go create mode 100644 pkg/client/dubbo/client_test.go delete mode 100644 pkg/client/dubbo/dubbo_client.go rename pkg/client/dubbo/{dubbo_response.go => response.go} (97%) rename pkg/client/{httpclient/http_client.go => http/http.go} (97%) rename pkg/client/{httpclient/http_response.go => http/response.go} (99%) rename pkg/filter/{remote_call_filter.go => remote/call.go} (53%) create mode 100755 sample/dubbogo/client/app/client.go create mode 100755 sample/dubbogo/client/app/user.go create mode 100755 sample/dubbogo/client/config/client.yml rename sample/{server => dubbogo/client}/config/log.yml (100%) mode change 100644 => 100755 rename sample/{ => dubbogo}/proxy/api_config.yaml (71%) rename sample/{ => dubbogo}/proxy/conf.yaml (93%) create mode 100644 sample/dubbogo/sample.md rename sample/{ => dubbogo}/server/app/server.go (100%) rename sample/{ => dubbogo}/server/app/user.go (91%) rename sample/{ => dubbogo}/server/app/version.go (100%) create mode 100644 sample/dubbogo/server/config/log.yml rename sample/{ => dubbogo}/server/config/server.yml (97%) delete mode 100644 sample/sample.md diff --git a/cmd/proxy/control.go b/cmd/proxy/control.go index 6b3f2ca0f..d09a9d998 100644 --- a/cmd/proxy/control.go +++ b/cmd/proxy/control.go @@ -89,7 +89,8 @@ var ( } logger.InitLog(logConfPath) if _, err := config.LoadAPIConfigFromFile(apiConfigPath); err != nil { - logger.Info(err.Error()) + logger.Error(err.Error()) + return err } limitCpus := c.Int("limit-cpus") diff --git a/configs/client.yml b/configs/client.yml deleted file mode 100644 index e69de29bb..000000000 diff --git a/pkg/client/client.go b/pkg/client/client.go index ac7c56a1d..e283ccc50 100644 --- a/pkg/client/client.go +++ b/pkg/client/client.go @@ -21,4 +21,7 @@ type Client interface { Init() error Close() error Call(req *Request) (resp Response, err error) + + // MappingParams mapping param, uri, query, body ... + MappingParams(req *Request) (types []string, reqData []interface{}, err error) } diff --git a/pkg/client/dubbo/client.go b/pkg/client/dubbo/client.go new file mode 100644 index 000000000..45f4db177 --- /dev/null +++ b/pkg/client/dubbo/client.go @@ -0,0 +1,307 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + */ + +package dubbo + +import ( + "context" + "encoding/json" + "errors" + "io/ioutil" + "regexp" + "strings" + "sync" + "time" +) + +import ( + "github.com/apache/dubbo-go/common/constant" + dg "github.com/apache/dubbo-go/config" + "github.com/apache/dubbo-go/protocol/dubbo" +) + +import ( + "github.com/dubbogo/dubbo-go-proxy/pkg/client" + "github.com/dubbogo/dubbo-go-proxy/pkg/config" + "github.com/dubbogo/dubbo-go-proxy/pkg/logger" +) + +// TODO java class name elem +const ( + JavaStringClassName = "java.lang.String" + JavaLangClassName = "java.lang.Long" +) + +var ( + _DubboClient *DubboClient + onceClient = sync.Once{} + dgCfg dg.ConsumerConfig + defaultApplication = &dg.ApplicationConfig{ + Organization: "dubbo-go-proxy", + Name: "Dubbogo Proxy", + Module: "dubbogo proxy", + Version: "0.1.0", + Owner: "Dubbogo Proxy", + Environment: "dev", + } +) + +// DubboClient client to generic invoke dubbo +type DubboClient struct { + lock sync.RWMutex + GenericServicePool map[string]*dg.GenericService +} + +// SingletonDubboClient singleton dubbo clent +func SingletonDubboClient() *DubboClient { + if _DubboClient == nil { + onceClient.Do(func() { + _DubboClient = NewDubboClient() + }) + } + + return _DubboClient +} + +// NewDubboClient create dubbo client +func NewDubboClient() *DubboClient { + return &DubboClient{ + lock: sync.RWMutex{}, + GenericServicePool: make(map[string]*dg.GenericService, 4), + } +} + +// Init init dubbo, config mapping can do here +func (dc *DubboClient) Init() error { + dc.GenericServicePool = make(map[string]*dg.GenericService, 4) + + cls := config.GetBootstrap().StaticResources.Clusters + + // dubbogo comsumer config + dgCfg = dg.ConsumerConfig{ + Check: new(bool), + Registries: make(map[string]*dg.RegistryConfig, 4), + } + dgCfg.ApplicationConfig = defaultApplication + for i := range cls { + c := cls[i] + dgCfg.Request_Timeout = c.RequestTimeoutStr + dgCfg.Connect_Timeout = c.ConnectTimeoutStr + for k, v := range c.Registries { + dgCfg.Registries[k] = &dg.RegistryConfig{ + Protocol: k, + Address: v.Address, + TimeoutStr: v.Timeout, + Username: v.Username, + Password: v.Password, + } + } + } + + initDubbogo() + + return nil +} + +func initDubbogo() { + dg.SetConsumerConfig(dgCfg) + dubbo.SetClientConf(dubbo.GetDefaultClientConfig()) + dg.Load() +} + +// Close +func (dc *DubboClient) Close() error { + dc.lock.Lock() + defer dc.lock.Unlock() + for k := range dc.GenericServicePool { + delete(dc.GenericServicePool, k) + } + return nil +} + +// Call invoke service +func (dc *DubboClient) Call(req *client.Request) (resp client.Response, err error) { + dm := req.API.Method.IntegrationRequest + types, values, err := dc.MappingParams(req) + method := dm.Method + logger.Debugf("[dubbogo proxy] invoke, method:%s, types:%s, reqData:%v", method, types, values) + + gs := dc.Get(dm) + + rst, err := gs.Invoke(context.Background(), []interface{}{method, types, values}) + + if err != nil { + return *client.EmptyResponse, err + } + + logger.Debugf("[dubbogo proxy] dubbo client resp:%v", rst) + + if rst == nil { + return client.Response{}, nil + } + + return *NewDubboResponse(rst), nil +} + +// MappingParams +// TODO wait for detail impl +func (dc *DubboClient) MappingParams(req *client.Request) (types []string, reqData []interface{}, err error) { + r := req.API.Method.IntegrationRequest + for i := range r.MappingParams { + m := r.MappingParams[i] + typ, value, err := paramParse(req, m.Name) + if err != nil { + return nil, nil, err + } + + types = append(types, typ) + reqData = append(reqData, value) + } + + return +} + +func paramParse(req *client.Request, param string) (typ string, value interface{}, err error) { + inboundRequest := req.API.Method.InboundRequest + inReq := req.IngressRequest + + var ingaressReqDate []byte + + if param == "requestBody" && req.API.Method.RequestBody != nil { + ingaressReqDate, err = ioutil.ReadAll(inReq.Body) + if err != nil { + return "", nil, err + } + + bodyMap := make(map[string]interface{}) + if err := json.Unmarshal(ingaressReqDate, &bodyMap); err != nil { + return "", nil, err + } + // TODO + return inboundRequest.RequestBody[0].DefinitionName, bodyMap, nil + } + + reg := regexp.MustCompile(`^([query|uri][\w|\d]+)\.([\w|\d]+)$`) + if !reg.MatchString(param) { + return "", nil, errors.New("not match, check your config") + } + ps := reg.FindStringSubmatch(param) + + _from := ps[1] + _key := ps[2] + if _from == "queryStrings" { + for i := range inboundRequest.QueryStrings { + p := inboundRequest.QueryStrings[i] + q := inReq.URL.Query().Get(_key) + if p.Name == _key { + if p.Required && q == "" { + return "", nil, errors.New("illegal param") + } + + if q != "" { + ingaressReqDate, err = json.Marshal(q) + } + + switch p.Type { + case "string": + var s string + if err := json.Unmarshal(ingaressReqDate, &s); err != nil { + logger.Errorf("params parse error:%+v", err) + return "", "", err + } + return JavaStringClassName, s, nil + case "int": + var i int + if err := json.Unmarshal(ingaressReqDate, &i); err != nil { + logger.Errorf("params parse error:%+v", err) + return "", nil, err + } + return JavaLangClassName, i, nil + } + + break + } + } + } + + return "", "", nil +} + +func (dc *DubboClient) get(key string) *dg.GenericService { + dc.lock.RLock() + defer dc.lock.RUnlock() + return dc.GenericServicePool[key] +} + +func (dc *DubboClient) check(key string) bool { + dc.lock.RLock() + defer dc.lock.RUnlock() + if _, ok := dc.GenericServicePool[key]; ok { + return true + } else { + return false + } +} + +// Get find a dubbo GenericService +func (dc *DubboClient) Get(ir config.IntegrationRequest) *dg.GenericService { + key := apiKey(&ir) + if dc.check(key) { + return dc.get(key) + } + + return dc.create(key, ir) +} + +func apiKey(ir *config.IntegrationRequest) string { + dbc := ir.DubboBackendConfig + return strings.Join([]string{dbc.ClusterName, dbc.ApplicationName, dbc.Interface, dbc.Version, dbc.Group}, "_") +} + +func (dc *DubboClient) create(key string, irequest config.IntegrationRequest) *dg.GenericService { + referenceConfig := dg.NewReferenceConfig(irequest.Interface, context.TODO()) + referenceConfig.InterfaceName = irequest.Interface + referenceConfig.Cluster = constant.DEFAULT_CLUSTER + var registers []string + for k := range dgCfg.Registries { + registers = append(registers, k) + } + referenceConfig.Registry = strings.Join(registers, ",") + + if len(irequest.DubboBackendConfig.Protocol) == 0 { + referenceConfig.Protocol = dubbo.DUBBO + } else { + referenceConfig.Protocol = irequest.DubboBackendConfig.Protocol + } + + referenceConfig.Version = irequest.DubboBackendConfig.Version + referenceConfig.Group = irequest.Group + referenceConfig.Generic = true + if len(irequest.DubboBackendConfig.Retries) == 0 { + referenceConfig.Retries = "3" + } else { + referenceConfig.Retries = irequest.DubboBackendConfig.Retries + } + dc.lock.Lock() + defer dc.lock.Unlock() + referenceConfig.GenericLoad(key) + time.Sleep(200 * time.Millisecond) //sleep to wait invoker create + clientService := referenceConfig.GetRPCService().(*dg.GenericService) + + dc.GenericServicePool[key] = clientService + return clientService +} diff --git a/pkg/client/dubbo/client_test.go b/pkg/client/dubbo/client_test.go new file mode 100644 index 000000000..01f727be7 --- /dev/null +++ b/pkg/client/dubbo/client_test.go @@ -0,0 +1,81 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + */ + +package dubbo + +import ( + "regexp" + "testing" +) + +import ( + "github.com/stretchr/testify/assert" +) + +func TestReg(t *testing.T) { + reg := regexp.MustCompile(`^(query|uri)`) + b := reg.MatchString("Stringquery") + assert.False(t, b) + b = reg.MatchString("queryString") + assert.True(t, b) + b = reg.MatchString("queryuri") + assert.True(t, b) + + reg = regexp.MustCompile(`^(query|uri)(String|Int|Long|Double|Time)`) + b = reg.MatchString("Stringquery") + assert.False(t, b) + b = reg.MatchString("queryString") + assert.True(t, b) + b = reg.MatchString("queryuri") + assert.False(t, b) + b = reg.MatchString("queryuriInt") + assert.False(t, b) + + reg = regexp.MustCompile(`^(query|uri)(String|Int|Long|Double|Time)\.([\w|\d]+)`) + b = reg.MatchString("Stringquery") + assert.False(t, b) + b = reg.MatchString("queryString") + assert.False(t, b) + b = reg.MatchString("queryString.name") + assert.True(t, b) + b = reg.MatchString("queryuriInt.age") + assert.False(t, b) + + reg = regexp.MustCompile(`^([query|uri][\w|\d]+)\.([\w|\d]+)$`) + b = reg.MatchString("queryStrings.name") + assert.True(t, b) + b = reg.MatchString("uriInt.") + assert.False(t, b) + b = reg.MatchString("queryStrings") + assert.False(t, b) + + param := reg.FindStringSubmatch("queryString.name") + for _, p := range param { + t.Log(p) + } +} + +func TestClose(t *testing.T) { + client := SingletonDubboClient() + client.GenericServicePool["key1"] = nil + client.GenericServicePool["key2"] = nil + client.GenericServicePool["key3"] = nil + client.GenericServicePool["key4"] = nil + assert.Equal(t, 4, len(client.GenericServicePool)) + client.Close() + assert.Equal(t, 0, len(client.GenericServicePool)) +} diff --git a/pkg/client/dubbo/dubbo_client.go b/pkg/client/dubbo/dubbo_client.go deleted file mode 100644 index d37682ca7..000000000 --- a/pkg/client/dubbo/dubbo_client.go +++ /dev/null @@ -1,213 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You 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. - */ - -package dubbo - -import ( - "context" - "encoding/json" - "io/ioutil" - "strings" - "sync" - "time" -) - -import ( - "github.com/apache/dubbo-go/common/constant" - dg "github.com/apache/dubbo-go/config" - "github.com/apache/dubbo-go/protocol/dubbo" -) - -import ( - "github.com/dubbogo/dubbo-go-proxy/pkg/client" - "github.com/dubbogo/dubbo-go-proxy/pkg/config" - "github.com/dubbogo/dubbo-go-proxy/pkg/logger" -) - -// TODO java class name elem -const ( - JavaStringClassName = "java.lang.String" - JavaLangClassName = "java.lang.Long" -) - -var ( - _DubboClient *DubboClient - onceClient = sync.Once{} - dgCfg dg.ConsumerConfig -) - -// DubboClient client to generic invoke dubbo -type DubboClient struct { - mLock sync.RWMutex - GenericServicePool map[string]*dg.GenericService -} - -// SingletonDubboClient singleton dubbo clent -func SingletonDubboClient() *DubboClient { - if _DubboClient == nil { - onceClient.Do(func() { - _DubboClient = NewDubboClient() - }) - } - - return _DubboClient -} - -// NewDubboClient create dubbo client -func NewDubboClient() *DubboClient { - return &DubboClient{ - mLock: sync.RWMutex{}, - GenericServicePool: make(map[string]*dg.GenericService), - } -} - -// Init init dubbo, config mapping can do here -func (dc *DubboClient) Init() error { - dgCfg = dg.GetConsumerConfig() - //can change config here - dg.SetConsumerConfig(dgCfg) - dg.Load() - dc.GenericServicePool = make(map[string]*dg.GenericService) - return nil -} - -// Close -func (dc *DubboClient) Close() error { - return nil -} - -// Call invoke service -func (dc *DubboClient) Call(r *client.Request) (resp client.Response, err error) { - dm := r.API.Method.IntegrationRequest - gs := dc.Get(dm.Interface, dm.DubboBackendConfig.Version, dm.Group, dm) - - var reqData []interface{} - var ingaressReqDate []byte - var e error - - ingaressReqDate, e = ioutil.ReadAll(r.IngressRequest.Body) - - if e != nil { - return *client.EmptyResponse, err - } - - l := len(dm.ParamTypes) - switch { - case l == 1: - t := dm.ParamTypes[0] - switch t { - case JavaStringClassName: - var s string - if err := json.Unmarshal(ingaressReqDate, &s); err != nil { - logger.Errorf("params parse error:%+v", err) - } else { - reqData = append(reqData, s) - } - case JavaLangClassName: - var i int - if err := json.Unmarshal(ingaressReqDate, &i); err != nil { - logger.Errorf("params parse error:%+v", err) - } else { - reqData = append(reqData, i) - } - default: - bodyMap := make(map[string]interface{}) - if err := json.Unmarshal(ingaressReqDate, &bodyMap); err != nil { - return *client.EmptyResponse, err - } else { - reqData = append(reqData, bodyMap) - } - } - case l > 1: - if err = json.Unmarshal(ingaressReqDate, &reqData); err != nil { - return *client.EmptyResponse, err - } - } - - logger.Debugf("[dubbogo proxy] invoke, method:%s, types:%s, reqData:%s", dm.Method, dm.ParamTypes, reqData) - - rst, err := gs.Invoke(context.Background(), []interface{}{dm.Method, dm.ParamTypes, reqData}) - if err != nil { - return *client.EmptyResponse, err - } - if rst == nil { - return client.Response{}, nil - } - resp = rst.(client.Response) - logger.Debugf("[dubbogo proxy] dubbo client resp:%v", resp) - return *NewDubboResponse(resp), nil -} - -func (dc *DubboClient) get(key string) *dg.GenericService { - dc.mLock.RLock() - defer dc.mLock.RUnlock() - return dc.GenericServicePool[key] -} - -func (dc *DubboClient) check(key string) bool { - dc.mLock.RLock() - defer dc.mLock.RUnlock() - if _, ok := dc.GenericServicePool[key]; ok { - return true - } else { - return false - } -} - -func (dc *DubboClient) create(key string, irequest config.IntegrationRequest) *dg.GenericService { - referenceConfig := dg.NewReferenceConfig(irequest.Interface, context.TODO()) - referenceConfig.InterfaceName = irequest.Interface - referenceConfig.Cluster = constant.DEFAULT_CLUSTER - var registers []string - for k := range dgCfg.Registries { - registers = append(registers, k) - } - referenceConfig.Registry = strings.Join(registers, ",") - - if len(irequest.DubboBackendConfig.Protocol) == 0 { - referenceConfig.Protocol = dubbo.DUBBO - } else { - referenceConfig.Protocol = irequest.DubboBackendConfig.Protocol - } - - referenceConfig.Version = irequest.DubboBackendConfig.Version - referenceConfig.Group = irequest.Group - referenceConfig.Generic = true - if len(irequest.DubboBackendConfig.Retries) == 0 { - referenceConfig.Retries = "3" - } else { - referenceConfig.Retries = irequest.DubboBackendConfig.Retries - } - dc.mLock.Lock() - defer dc.mLock.Unlock() - referenceConfig.GenericLoad(key) - time.Sleep(200 * time.Millisecond) //sleep to wait invoker create - clientService := referenceConfig.GetRPCService().(*dg.GenericService) - - dc.GenericServicePool[key] = clientService - return clientService -} - -// Get find a dubbo GenericService -func (dc *DubboClient) Get(interfaceName, version, group string, ir config.IntegrationRequest) *dg.GenericService { - key := strings.Join([]string{ir.DubboBackendConfig.ApplicationName, interfaceName, version, group}, "_") - if dc.check(key) { - return dc.get(key) - } - - return dc.create(key, ir) -} diff --git a/pkg/client/dubbo/dubbo_response.go b/pkg/client/dubbo/response.go similarity index 97% rename from pkg/client/dubbo/dubbo_response.go rename to pkg/client/dubbo/response.go index a9a25bea2..44fb2fc03 100644 --- a/pkg/client/dubbo/dubbo_response.go +++ b/pkg/client/dubbo/response.go @@ -30,11 +30,12 @@ import ( // NewDubboResponse create dubbo response func NewDubboResponse(data interface{}) *client.Response { - if r, err := dealResp(data, true); err != nil { + r, err := dealResp(data, true) + if err != nil { return &client.Response{Data: data} - } else { - return &client.Response{Data: r} } + + return &client.Response{Data: r} } func dealResp(in interface{}, HumpToLine bool) (interface{}, error) { diff --git a/pkg/client/httpclient/http_client.go b/pkg/client/http/http.go similarity index 97% rename from pkg/client/httpclient/http_client.go rename to pkg/client/http/http.go index ec5af1379..4986d7809 100644 --- a/pkg/client/httpclient/http_client.go +++ b/pkg/client/http/http.go @@ -15,7 +15,7 @@ * limitations under the License. */ -package httpclient +package http import ( "context" @@ -36,12 +36,6 @@ import ( "github.com/dubbogo/dubbo-go-proxy/pkg/client" ) -// TODO java class name elem -const ( - JavaStringClassName = "java.lang.String" - JavaLangClassName = "java.lang.Long" -) - // RestMetadata dubbo metadata, api config type RestMetadata struct { ApplicationName string `yaml:"application_name" json:"application_name" mapstructure:"application_name"` @@ -70,7 +64,6 @@ type HTTPClient struct { // SingletonHTTPClient singleton HTTP Client func SingletonHTTPClient() *HTTPClient { - if _httpClient == nil { countDown.Do(func() { _httpClient = NewHTTPClient() @@ -115,6 +108,10 @@ func (dc *HTTPClient) Call(r *client.Request) (resp client.Response, err error) return ret, err } +func (dc *HTTPClient) MappingParams(req *client.Request) (types []string, reqData []interface{}, err error) { + return nil, nil, nil +} + func (dc *HTTPClient) get(key string) *dg.GenericService { dc.mLock.RLock() defer dc.mLock.RUnlock() diff --git a/pkg/client/httpclient/http_response.go b/pkg/client/http/response.go similarity index 99% rename from pkg/client/httpclient/http_response.go rename to pkg/client/http/response.go index 5dec853be..f2ad0ce4b 100644 --- a/pkg/client/httpclient/http_response.go +++ b/pkg/client/http/response.go @@ -15,7 +15,7 @@ * limitations under the License. */ -package httpclient +package http import ( "fmt" diff --git a/pkg/common/constant/filter.go b/pkg/common/constant/filter.go index 3c48570ea..e33ceac65 100644 --- a/pkg/common/constant/filter.go +++ b/pkg/common/constant/filter.go @@ -22,4 +22,5 @@ var ( Default404Body = []byte("404 page not found") Default405Body = []byte("405 method not allowed") Default406Body = []byte("406 api not up") + Default503Body = []byte("503 service unavailable") ) diff --git a/pkg/config/api_config.go b/pkg/config/api_config.go index afd524a5b..34cd200e7 100644 --- a/pkg/config/api_config.go +++ b/pkg/config/api_config.go @@ -102,6 +102,7 @@ type InboundRequest struct { // Params defines the simple parameter definition type Params struct { Name string `json:"name" yaml:"name"` + Type string `json:"type" yaml:"type"` Required bool `json:"required" yaml:"required"` } diff --git a/pkg/filter/recovery_filter.go b/pkg/filter/recovery_filter.go index 1079ddbe5..2691a1c7f 100644 --- a/pkg/filter/recovery_filter.go +++ b/pkg/filter/recovery_filter.go @@ -34,6 +34,7 @@ func Recover() context.FilterFunc { defer func() { if err := recover(); err != nil { logger.Infof("[dubboproxy go] error:%+v", err) + c.WriteErr(err) } }() diff --git a/pkg/filter/remote_call_filter.go b/pkg/filter/remote/call.go similarity index 53% rename from pkg/filter/remote_call_filter.go rename to pkg/filter/remote/call.go index 803b681bc..2a1ab2414 100644 --- a/pkg/filter/remote_call_filter.go +++ b/pkg/filter/remote/call.go @@ -15,7 +15,12 @@ * limitations under the License. */ -package filter +package remote + +import ( + "errors" + "net/http" +) import ( _ "github.com/apache/dubbo-go/cluster/cluster_impl" @@ -27,40 +32,60 @@ import ( import ( "github.com/dubbogo/dubbo-go-proxy/pkg/client" + "github.com/dubbogo/dubbo-go-proxy/pkg/client/dubbo" + clienthttp "github.com/dubbogo/dubbo-go-proxy/pkg/client/http" "github.com/dubbogo/dubbo-go-proxy/pkg/common/constant" "github.com/dubbogo/dubbo-go-proxy/pkg/common/extension" + "github.com/dubbogo/dubbo-go-proxy/pkg/config" "github.com/dubbogo/dubbo-go-proxy/pkg/context" - "github.com/dubbogo/dubbo-go-proxy/pkg/context/http" + selfhttp "github.com/dubbogo/dubbo-go-proxy/pkg/context/http" "github.com/dubbogo/dubbo-go-proxy/pkg/logger" - "github.com/dubbogo/dubbo-go-proxy/pkg/pool" ) func init() { - extension.SetFilterFunc(constant.RemoteCallFilter, RemoteCall()) + extension.SetFilterFunc(constant.RemoteCallFilter, Call()) } -// RemoteCall http 2 dubbo -func RemoteCall() context.FilterFunc { +// Call +// support: 1 http 2 dubbo 2 http 2 http +func Call() context.FilterFunc { return func(c context.Context) { - doRemoteCall(c.(*http.HttpContext)) + doRemoteCall(c.(*selfhttp.HttpContext)) } } -func doRemoteCall(c *http.HttpContext) { +func doRemoteCall(c *selfhttp.HttpContext) { api := c.GetAPI() - cl, e := pool.SingletonPool().GetClient(api.Method.IntegrationRequest.RequestType) - if e != nil { - c.WriteFail() - c.AbortWithError("", e) + + typ := api.Method.IntegrationRequest.RequestType + + cli, err := matchClient(typ) + if err != nil { + c.WriteWithStatus(http.StatusServiceUnavailable, constant.Default503Body) + c.AddHeader(constant.HeaderKeyContextType, constant.HeaderValueTextPlain) + return } - if resp, err := cl.Call(client.NewReq(c.Request, api)); err != nil { + resp, err := cli.Call(client.NewReq(c.Request, api)) + + if err != nil { logger.Errorf("[dubboproxy go] client do err:%v!", err) - c.WriteFail() - c.Abort() - } else { - c.WriteResponse(resp) - c.Next() + c.WriteWithStatus(http.StatusServiceUnavailable, constant.Default503Body) + c.AddHeader(constant.HeaderKeyContextType, constant.HeaderValueTextPlain) + return } + c.WriteResponse(resp) + c.Next() +} + +func matchClient(typ config.RequestType) (client.Client, error) { + switch typ { + case config.DubboRequest: + return dubbo.SingletonDubboClient(), nil + case config.HTTPRequest: + return clienthttp.SingletonHTTPClient(), nil + default: + return nil, errors.New("not support") + } } diff --git a/pkg/model/cluster.go b/pkg/model/cluster.go index 86ab8efe4..0531af7a8 100644 --- a/pkg/model/cluster.go +++ b/pkg/model/cluster.go @@ -28,7 +28,7 @@ type Cluster struct { ConnectTimeoutStr string `yaml:"connect_timeout" json:"connect_timeout"` // ConnectTimeout timeout for connect to cluster node HealthChecks []HealthCheck `yaml:"health_checks" json:"health_checks"` Hosts []Address `yaml:"hosts" json:"hosts"` // Hosts whe discovery type is Static, StrictDNS or LogicalDns,this need config - RequestTimeout string `yaml:"request_timeout" json:"request_timeout"` + RequestTimeoutStr string `yaml:"request_timeout" json:"request_timeout"` Registries map[string]Registry `yaml:"registries" json:"registries"` } diff --git a/pkg/pool/pool.go b/pkg/pool/pool.go index f9dde3994..340f55adf 100644 --- a/pkg/pool/pool.go +++ b/pkg/pool/pool.go @@ -25,7 +25,7 @@ import ( import ( "github.com/dubbogo/dubbo-go-proxy/pkg/client" "github.com/dubbogo/dubbo-go-proxy/pkg/client/dubbo" - "github.com/dubbogo/dubbo-go-proxy/pkg/client/httpclient" + "github.com/dubbogo/dubbo-go-proxy/pkg/client/http" "github.com/dubbogo/dubbo-go-proxy/pkg/config" ) @@ -35,14 +35,15 @@ type ClientPool struct { } var ( - _clinetPool *ClientPool + _clientPool *ClientPool once = sync.Once{} ) func newClientPool() *ClientPool { clientPool := &ClientPool{ - poolMap: make(map[config.RequestType]*sync.Pool), + poolMap: make(map[config.RequestType]*sync.Pool, 4), } + // init default support request type clientPool.poolMap[config.DubboRequest] = &sync.Pool{ New: func() interface{} { return dubbo.NewDubboClient() @@ -50,7 +51,7 @@ func newClientPool() *ClientPool { } clientPool.poolMap[config.HTTPRequest] = &sync.Pool{ New: func() interface{} { - return httpclient.NewHTTPClient() + return http.NewHTTPClient() }, } return clientPool @@ -58,13 +59,13 @@ func newClientPool() *ClientPool { // SingletonPool singleton pool func SingletonPool() *ClientPool { - if _clinetPool == nil { + if _clientPool == nil { once.Do(func() { - _clinetPool = newClientPool() + _clientPool = newClientPool() }) } - return _clinetPool + return _clientPool } // GetClient a factory method to get a client according to apiType . @@ -74,3 +75,13 @@ func (pool *ClientPool) GetClient(t config.RequestType) (client.Client, error) { } return nil, errors.New("protocol not supported yet") } + +// Put put client to pool. +func (pool *ClientPool) Put(t config.RequestType, c client.Client) error { + if pool.poolMap[t] != nil { + pool.poolMap[t].Put(c) + return nil + } + + return errors.New("protocol not supported yet") +} diff --git a/pkg/proxy/listener.go b/pkg/proxy/listener.go index 791e787e1..43a9836e1 100644 --- a/pkg/proxy/listener.go +++ b/pkg/proxy/listener.go @@ -35,6 +35,7 @@ import ( "github.com/dubbogo/dubbo-go-proxy/pkg/config" "github.com/dubbogo/dubbo-go-proxy/pkg/context" h "github.com/dubbogo/dubbo-go-proxy/pkg/context/http" + _ "github.com/dubbogo/dubbo-go-proxy/pkg/filter/remote" "github.com/dubbogo/dubbo-go-proxy/pkg/logger" "github.com/dubbogo/dubbo-go-proxy/pkg/model" "github.com/dubbogo/dubbo-go-proxy/pkg/router" diff --git a/sample/dubbogo/client/app/client.go b/sample/dubbogo/client/app/client.go new file mode 100755 index 000000000..8b87604ea --- /dev/null +++ b/sample/dubbogo/client/app/client.go @@ -0,0 +1,105 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + */ + +package main + +import ( + "context" + "fmt" + "os" + "os/signal" + "syscall" + "time" +) + +import ( + "github.com/apache/dubbo-go/common/logger" + _ "github.com/apache/dubbo-go/common/proxy/proxy_factory" + "github.com/apache/dubbo-go/config" + "github.com/apache/dubbo-go/protocol/dubbo" + _ "github.com/apache/dubbo-go/registry/protocol" + + _ "github.com/apache/dubbo-go/filter/filter_impl" + + _ "github.com/apache/dubbo-go/cluster/cluster_impl" + _ "github.com/apache/dubbo-go/cluster/loadbalance" + _ "github.com/apache/dubbo-go/registry/zookeeper" +) + +var ( + survivalTimeout int = 10e9 + allReferenceConfig config.ReferenceConfig +) + +// they are necessary: +// export CONF_CONSUMER_FILE_PATH="xxx" +// export APP_LOG_CONF_FILE="xxx" +func main() { + println("\n\ntest GetUserByName") + doGetUserByName() + initSignal() +} + +func doGetUserByName() { + var appName = "UserProviderGer" + var referenceConfig = config.ReferenceConfig{ + InterfaceName: "com.ic.user.UserProvider", + Cluster: "failover", + Registry: "zk1", + Version: "1.0.0", + Group: "test", + Protocol: dubbo.DUBBO, + Generic: true, + } + referenceConfig.GenericLoad(appName) + + time.Sleep(3 * time.Second) + println("\n\n\nstart to generic invoke") + resp, err := referenceConfig.GetRPCService().(*config.GenericService).Invoke(context.TODO(), []interface{}{"GetUserByName", []string{"java.lang.String"}, []interface{}{"tiecheng"}}) + if err != nil { + panic(err) + } + println("res: %+v\n", resp) +} + +func println(format string, args ...interface{}) { + fmt.Printf("\033[32;40m"+format+"\033[0m\n", args...) +} + +func initSignal() { + signals := make(chan os.Signal, 1) + // It is not possible to block SIGKILL or syscall.SIGSTOP + signal.Notify(signals, os.Interrupt, os.Kill, syscall.SIGHUP, + syscall.SIGQUIT, syscall.SIGTERM, syscall.SIGINT) + for { + sig := <-signals + logger.Infof("get signal %s", sig.String()) + switch sig { + case syscall.SIGHUP: + // reload() + default: + time.AfterFunc(time.Duration(survivalTimeout), func() { + logger.Warnf("app exit now by force...") + os.Exit(1) + }) + + // The program exits normally or timeout forcibly exits. + fmt.Println("app exit now...") + return + } + } +} diff --git a/sample/dubbogo/client/app/user.go b/sample/dubbogo/client/app/user.go new file mode 100755 index 000000000..68b0b941b --- /dev/null +++ b/sample/dubbogo/client/app/user.go @@ -0,0 +1,33 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + */ + +package main + +import ( + "time" +) + +type User struct { + Id string + Name string + Age int32 + Time time.Time +} + +func (u User) JavaClassName() string { + return "com.ikurento.user.User" +} diff --git a/sample/dubbogo/client/config/client.yml b/sample/dubbogo/client/config/client.yml new file mode 100755 index 000000000..651c6777e --- /dev/null +++ b/sample/dubbogo/client/config/client.yml @@ -0,0 +1,50 @@ +# dubbo client yaml configure file + + +check: true +# client +request_timeout: "3s" +# connect timeout +connect_timeout: "3s" + +# application config +application: + organization: "dubbogoproxy.com" + name: "User Micro Service" + module: "dubbogoproxy user-info server" + version: "0.1.0" + group: "tc" + owner: "ZX" + environment: "dev" + +registries: + "zk1": + protocol: "zookeeper" + timeout: "3s" + address: "127.0.0.1:2181" + username: "" + password: "" + +references: + +protocol_conf: + dubbo: + reconnect_interval: 0 + connection_number: 1 + heartbeat_period: "5s" + session_timeout: "180s" + pool_size: 64 + pool_ttl: 600 + getty_session_param: + compress_encoding: false + tcp_no_delay: true + tcp_keep_alive: true + keep_alive_period: "120s" + tcp_r_buf_size: 262144 + tcp_w_buf_size: 65536 + pkg_wq_size: 512 + tcp_read_timeout: "1s" + tcp_write_timeout: "5s" + wait_timeout: "1s" + max_msg_len: 1024000 + session_name: "client" diff --git a/sample/server/config/log.yml b/sample/dubbogo/client/config/log.yml old mode 100644 new mode 100755 similarity index 100% rename from sample/server/config/log.yml rename to sample/dubbogo/client/config/log.yml diff --git a/sample/proxy/api_config.yaml b/sample/dubbogo/proxy/api_config.yaml similarity index 71% rename from sample/proxy/api_config.yaml rename to sample/dubbogo/proxy/api_config.yaml index 5b2e2dfbe..b86eda344 100644 --- a/sample/proxy/api_config.yaml +++ b/sample/dubbogo/proxy/api_config.yaml @@ -3,7 +3,7 @@ description: proxy sample resources: - path: '/api/v1/test-dubbo/user' type: restful - description: resource documentation + description: user filters: - filter0 methods: @@ -13,6 +13,7 @@ resources: requestType: http queryStrings: - name: name + type: string required: true integrationRequest: requestType: dubbo @@ -25,7 +26,24 @@ resources: group: "test" version: 1.0.0 clusterName: "test_dubbo" - - path: '/api/v1/test-dubbo/user' + - httpVerb: POST + onAir: true + inboundRequest: + requestType: http + requestBody: + - definitionName: "com.ikurento.user.User" + integrationRequest: + requestType: dubbo + mappingParams: + - name: requestBody + mapTo: 1 + applicationName: "UserProvider" + interface: "com.ic.user.UserProvider" + method: "CreateUser" + clusterName: "test_dubbo" + group: "test" + version: 1.0.0 + - path: '/test-dubbo/user' type: restful description: resource documentation filters: diff --git a/sample/proxy/conf.yaml b/sample/dubbogo/proxy/conf.yaml similarity index 93% rename from sample/proxy/conf.yaml rename to sample/dubbogo/proxy/conf.yaml index 3b71e9abe..048584335 100644 --- a/sample/proxy/conf.yaml +++ b/sample/dubbogo/proxy/conf.yaml @@ -50,12 +50,12 @@ static_resources: registries: "zookeeper": timeout: "3s" - address: "127.0.0.1:2182" + address: "127.0.0.1:2181" username: "" password: "" - "consul": - timeout: "3s" - address: "127.0.0.1:8500" +# "consul": +# timeout: "3s" +# address: "127.0.0.1:8500" shutdown_config: timeout: "60s" step_timeout: "10s" diff --git a/sample/dubbogo/sample.md b/sample/dubbogo/sample.md new file mode 100644 index 000000000..fe8fe8adc --- /dev/null +++ b/sample/dubbogo/sample.md @@ -0,0 +1,54 @@ +# 本地例子 + +> 自行准备好 zookeeper 环境 + +## 启动服务提供方 + +配置好下面两个环境变量: +- CONF_PROVIDER_FILE_PATH=/XXX/dubbo-go-proxy/sample/dubbogo/server/config/server.yml +- APP_LOG_CONF_FILE=/XXX/dubbo-go-proxy/sample/dubbogo/server/config/log.yml + +运行 sample/server/app/server.go + +## 启动 proxy + +配置好下面的环境变量: +- -c /Users/tc/Documents/workspace_2020/dubbo-go-proxy/sample/dubbogo/proxy/conf.yaml +- -a /Users/tc/Documents/workspace_2020/dubbo-go-proxy/sample/dubbogo/proxy/api_config.yaml + +运行 cmd/proxy/proxy.go + +因为没有配置 dubbogo 的配置文件,所以启动的时候出现日志如下: +```bash +2020/11/06 10:29:09 [InitLog] warn: ioutil.ReadFile(file:./conf/log.yml) = error:open ./conf/log.yml: no such file or directory +2020/11/06 10:29:09 [InitLog] warn: log configure file name is nil +2020/11/06 10:29:28 [consumerInit] application configure(consumer) file name is nil +2020/11/06 10:29:28 [providerInit] application configure(provider) file name is nil +``` + +在浏览器或其它工具输入 `http://127.0.0.1:8888/api/v1/test-dubbo/user?name=tc` , 可以得到结果 + +```json +{ + "age": 18, + "id": "0001", + "name": "tc" +} +``` + +正常调用 proxy 日志: + +```bash +2020-11-08T11:02:47.106+0800 DEBUG dubbo/dubbo_invoker.go:121 result.Err: , result.Rest: 0xc0001ad560 +2020-11-08T11:02:47.106+0800 DEBUG proxy/proxy.go:172 [makeDubboCallProxy] result: 0xc0001ad560, err: +2020-11-08T11:02:47.106+0800 DEBUG dubbo/client.go:146 [dubbogo proxy] dubbo client resp:map[age:18 id:0001 name:tc time:] +2020-11-08T11:02:47.106+0800 INFO filter/logger_filter.go:44 [dubboproxy go] [UPSTREAM] receive request | 200 | 349.835096ms | GET | /api/v1/test-dubbo/user | +``` + +server 日志: + +```bash +Req GetUserByName data:"tc" +Req GetUserByName result:&main.User{Id:"0001", Name:"tc", Age:18, Time:time.Time{wall:0xbfe201c6b219ce40, ext:5594874, loc:(*time.Location)(0x1c3b100)}} +2020-11-08T14:33:31.676+0800 INFO dubbo/listener.go:196 got session:session {server:TCP_SERVER:2:192.168.0.113:20000<->192.168.0.113:52871}, Read Bytes: 0, Write Bytes: 0, Read Pkgs: 0, Write Pkgs: 0 +``` \ No newline at end of file diff --git a/sample/server/app/server.go b/sample/dubbogo/server/app/server.go similarity index 100% rename from sample/server/app/server.go rename to sample/dubbogo/server/app/server.go diff --git a/sample/server/app/user.go b/sample/dubbogo/server/app/user.go similarity index 91% rename from sample/server/app/user.go rename to sample/dubbogo/server/app/user.go index 27602514e..d82b0be82 100644 --- a/sample/server/app/user.go +++ b/sample/dubbogo/server/app/user.go @@ -39,6 +39,8 @@ func init() { cacheMap: make(map[string]*User, 16), lock: sync.Mutex{}, } + + cache.Add(&User{Id: "0001", Name: "tc", Age: 18, Time: time.Now()}) } var cache *UserDB @@ -78,7 +80,7 @@ type UserProvider struct { } func (u *UserProvider) CreateUser(ctx context.Context, user *User) (*User, error) { - println("Req QueryUser data:%#v", user) + println("Req CreateUser data:%#v", user) if user == nil { return nil, errors.New("not found") } @@ -124,12 +126,13 @@ func (u *UserProvider) TwoSimpleParamsWithError(ctx context.Context, name string return &rsp, errors.New("TwoSimpleParams error") } -// 方法名称映射 -func (u *UserProvider) MethodMapper() map[string]string { - return map[string]string{ - "GetUserByName": "queryUserByName", - } -} +// 方法名称映射,做参考 +// GetUserByName can call success. +//func (u *UserProvider) MethodMapper() map[string]string { +// return map[string]string{ +// "GetUserByName": "queryUserByName", +// } +//} func (u *UserProvider) Reference() string { return "UserProvider" diff --git a/sample/server/app/version.go b/sample/dubbogo/server/app/version.go similarity index 100% rename from sample/server/app/version.go rename to sample/dubbogo/server/app/version.go diff --git a/sample/dubbogo/server/config/log.yml b/sample/dubbogo/server/config/log.yml new file mode 100644 index 000000000..47f9e60f7 --- /dev/null +++ b/sample/dubbogo/server/config/log.yml @@ -0,0 +1,27 @@ +level: "info" +development: true +disableCaller: false +disableStacktrace: false +sampling: +encoding: "console" + +# encoder +encoderConfig: + messageKey: "message" + levelKey: "level" + timeKey: "time" + nameKey: "logger" + callerKey: "caller" + stacktraceKey: "stacktrace" + lineEnding: "" + levelEncoder: "capitalColor" + timeEncoder: "iso8601" + durationEncoder: "seconds" + callerEncoder: "short" + nameEncoder: "" + +outputPaths: + - "stderr" +errorOutputPaths: + - "stderr" +initialFields: diff --git a/sample/server/config/server.yml b/sample/dubbogo/server/config/server.yml similarity index 97% rename from sample/server/config/server.yml rename to sample/dubbogo/server/config/server.yml index 101234a7d..06424af1a 100644 --- a/sample/server/config/server.yml +++ b/sample/dubbogo/server/config/server.yml @@ -6,7 +6,8 @@ application: organization: "dubbogoproxy.com" name: "User Micro Service" module: "dubbogoproxy user-info server" - version: "0.0.1" + version: "0.1.0" + group: "tc" owner: "ZX" environment: "dev" diff --git a/sample/sample.md b/sample/sample.md deleted file mode 100644 index c096477e0..000000000 --- a/sample/sample.md +++ /dev/null @@ -1,28 +0,0 @@ -# 本地例子 - -> 自行准备好 zookeeper 环境 - -## 启动服务提供方 - -配置好下面两个环境变量: -- CONF_PROVIDER_FILE_PATH=/XXX/dubbo-go-proxy/sample/server/config/server.yml -- APP_LOG_CONF_FILE=/XXX/dubbo-go-proxy/sample/server/config/log.yml - -运行 sample/server/app/server.go - -## 启动 proxy - -配置好下面的环境变量: -- -c /Users/tc/Documents/workspace_2020/dubbo-go-proxy/sample/proxy/conf.yaml -- -a /Users/tc/Documents/workspace_2020/dubbo-go-proxy/sample/proxy/api_config.yaml - -运行 cmd/proxy/proxy.go - -因为没有配置 dubbogo 的配置文件,所以启动的时候出现日志如下: -```bash -2020/11/06 10:29:09 [InitLog] warn: ioutil.ReadFile(file:./conf/log.yml) = error:open ./conf/log.yml: no such file or directory -2020/11/06 10:29:09 [InitLog] warn: log configure file name is nil -2020/11/06 10:29:28 [consumerInit] application configure(consumer) file name is nil -2020/11/06 10:29:28 [providerInit] application configure(provider) file name is nil -``` - From dd2888182250cc455dec0da138717a0df2fac256 Mon Sep 17 00:00:00 2001 From: tiecheng Date: Sun, 8 Nov 2020 21:11:13 +0800 Subject: [PATCH 210/227] resolve conversation Former-commit-id: 4f0094f3e25c03f50cc2fca61ccc225a46fd59b4 Former-commit-id: 1af373dbb68e01774c5b6956d79940a442760f43 --- cmd/proxy/control.go | 2 +- cmd/proxy/proxy.go | 4 + go.mod | 1 + pkg/client/dubbo/{client.go => dubbo.go} | 51 ++++++------ .../dubbo/{client_test.go => dubbo_test.go} | 0 pkg/client/http/http.go | 1 + pkg/filter/remote/call.go | 8 +- pkg/proxy/listener.go | 1 - sample/dubbogo/client/app/user.go | 4 +- sample/dubbogo/sample.md | 6 +- sample/dubbogo/server/app/user.go | 81 ++++++++++++------- sample/dubbogo/server/app/version.go | 1 + 12 files changed, 96 insertions(+), 64 deletions(-) rename pkg/client/dubbo/{client.go => dubbo.go} (87%) rename pkg/client/dubbo/{client_test.go => dubbo_test.go} (100%) diff --git a/cmd/proxy/control.go b/cmd/proxy/control.go index d09a9d998..fbe97d186 100644 --- a/cmd/proxy/control.go +++ b/cmd/proxy/control.go @@ -89,7 +89,7 @@ var ( } logger.InitLog(logConfPath) if _, err := config.LoadAPIConfigFromFile(apiConfigPath); err != nil { - logger.Error(err.Error()) + logger.Errorf("load api config error:%+v", err) return err } diff --git a/cmd/proxy/proxy.go b/cmd/proxy/proxy.go index eb0e0a1af..d60050420 100644 --- a/cmd/proxy/proxy.go +++ b/cmd/proxy/proxy.go @@ -27,6 +27,10 @@ import ( "github.com/urfave/cli" ) +import ( + _ "github.com/dubbogo/dubbo-go-proxy/pkg/filter/remote" +) + // Version proxy version var Version = "0.1.0" diff --git a/go.mod b/go.mod index 6721884c5..2b0ec51ac 100644 --- a/go.mod +++ b/go.mod @@ -4,6 +4,7 @@ go 1.14 require ( github.com/apache/dubbo-go v1.5.1 + github.com/apache/dubbo-go-hessian2 v1.6.2 github.com/dubbogo/go-zookeeper v1.0.1 github.com/emirpasic/gods v1.12.0 github.com/ghodss/yaml v1.0.1-0.20190212211648-25d852aebe32 diff --git a/pkg/client/dubbo/client.go b/pkg/client/dubbo/dubbo.go similarity index 87% rename from pkg/client/dubbo/client.go rename to pkg/client/dubbo/dubbo.go index 45f4db177..87b3f41cf 100644 --- a/pkg/client/dubbo/client.go +++ b/pkg/client/dubbo/dubbo.go @@ -47,7 +47,7 @@ const ( ) var ( - _DubboClient *DubboClient + dubboClient *Client onceClient = sync.Once{} dgCfg dg.ConsumerConfig defaultApplication = &dg.ApplicationConfig{ @@ -60,33 +60,33 @@ var ( } ) -// DubboClient client to generic invoke dubbo -type DubboClient struct { +// Client client to generic invoke dubbo +type Client struct { lock sync.RWMutex GenericServicePool map[string]*dg.GenericService } // SingletonDubboClient singleton dubbo clent -func SingletonDubboClient() *DubboClient { - if _DubboClient == nil { +func SingletonDubboClient() *Client { + if dubboClient == nil { onceClient.Do(func() { - _DubboClient = NewDubboClient() + dubboClient = NewDubboClient() }) } - return _DubboClient + return dubboClient } // NewDubboClient create dubbo client -func NewDubboClient() *DubboClient { - return &DubboClient{ +func NewDubboClient() *Client { + return &Client{ lock: sync.RWMutex{}, GenericServicePool: make(map[string]*dg.GenericService, 4), } } // Init init dubbo, config mapping can do here -func (dc *DubboClient) Init() error { +func (dc *Client) Init() error { dc.GenericServicePool = make(map[string]*dg.GenericService, 4) cls := config.GetBootstrap().StaticResources.Clusters @@ -123,8 +123,8 @@ func initDubbogo() { dg.Load() } -// Close -func (dc *DubboClient) Close() error { +// Close clear GenericServicePool. +func (dc *Client) Close() error { dc.lock.Lock() defer dc.lock.Unlock() for k := range dc.GenericServicePool { @@ -134,7 +134,7 @@ func (dc *DubboClient) Close() error { } // Call invoke service -func (dc *DubboClient) Call(req *client.Request) (resp client.Response, err error) { +func (dc *Client) Call(req *client.Request) (resp client.Response, err error) { dm := req.API.Method.IntegrationRequest types, values, err := dc.MappingParams(req) method := dm.Method @@ -157,9 +157,9 @@ func (dc *DubboClient) Call(req *client.Request) (resp client.Response, err erro return *NewDubboResponse(rst), nil } -// MappingParams +// MappingParams param mapping to api. // TODO wait for detail impl -func (dc *DubboClient) MappingParams(req *client.Request) (types []string, reqData []interface{}, err error) { +func (dc *Client) MappingParams(req *client.Request) (types []string, reqData []interface{}, err error) { r := req.API.Method.IntegrationRequest for i := range r.MappingParams { m := r.MappingParams[i] @@ -201,13 +201,13 @@ func paramParse(req *client.Request, param string) (typ string, value interface{ } ps := reg.FindStringSubmatch(param) - _from := ps[1] - _key := ps[2] - if _from == "queryStrings" { + from := ps[1] + key := ps[2] + if from == "queryStrings" { for i := range inboundRequest.QueryStrings { p := inboundRequest.QueryStrings[i] - q := inReq.URL.Query().Get(_key) - if p.Name == _key { + q := inReq.URL.Query().Get(key) + if p.Name == key { if p.Required && q == "" { return "", nil, errors.New("illegal param") } @@ -241,24 +241,23 @@ func paramParse(req *client.Request, param string) (typ string, value interface{ return "", "", nil } -func (dc *DubboClient) get(key string) *dg.GenericService { +func (dc *Client) get(key string) *dg.GenericService { dc.lock.RLock() defer dc.lock.RUnlock() return dc.GenericServicePool[key] } -func (dc *DubboClient) check(key string) bool { +func (dc *Client) check(key string) bool { dc.lock.RLock() defer dc.lock.RUnlock() if _, ok := dc.GenericServicePool[key]; ok { return true - } else { - return false } + return false } // Get find a dubbo GenericService -func (dc *DubboClient) Get(ir config.IntegrationRequest) *dg.GenericService { +func (dc *Client) Get(ir config.IntegrationRequest) *dg.GenericService { key := apiKey(&ir) if dc.check(key) { return dc.get(key) @@ -272,7 +271,7 @@ func apiKey(ir *config.IntegrationRequest) string { return strings.Join([]string{dbc.ClusterName, dbc.ApplicationName, dbc.Interface, dbc.Version, dbc.Group}, "_") } -func (dc *DubboClient) create(key string, irequest config.IntegrationRequest) *dg.GenericService { +func (dc *Client) create(key string, irequest config.IntegrationRequest) *dg.GenericService { referenceConfig := dg.NewReferenceConfig(irequest.Interface, context.TODO()) referenceConfig.InterfaceName = irequest.Interface referenceConfig.Cluster = constant.DEFAULT_CLUSTER diff --git a/pkg/client/dubbo/client_test.go b/pkg/client/dubbo/dubbo_test.go similarity index 100% rename from pkg/client/dubbo/client_test.go rename to pkg/client/dubbo/dubbo_test.go diff --git a/pkg/client/http/http.go b/pkg/client/http/http.go index 4986d7809..6f9aee1b4 100644 --- a/pkg/client/http/http.go +++ b/pkg/client/http/http.go @@ -108,6 +108,7 @@ func (dc *HTTPClient) Call(r *client.Request) (resp client.Response, err error) return ret, err } +// MappingParams param mapping to api. func (dc *HTTPClient) MappingParams(req *client.Request) (types []string, reqData []interface{}, err error) { return nil, nil, nil } diff --git a/pkg/filter/remote/call.go b/pkg/filter/remote/call.go index 2a1ab2414..2ee18b135 100644 --- a/pkg/filter/remote/call.go +++ b/pkg/filter/remote/call.go @@ -38,7 +38,7 @@ import ( "github.com/dubbogo/dubbo-go-proxy/pkg/common/extension" "github.com/dubbogo/dubbo-go-proxy/pkg/config" "github.com/dubbogo/dubbo-go-proxy/pkg/context" - selfhttp "github.com/dubbogo/dubbo-go-proxy/pkg/context/http" + contexthttp "github.com/dubbogo/dubbo-go-proxy/pkg/context/http" "github.com/dubbogo/dubbo-go-proxy/pkg/logger" ) @@ -46,15 +46,15 @@ func init() { extension.SetFilterFunc(constant.RemoteCallFilter, Call()) } -// Call +// Call remote call context.FilterFunc. // support: 1 http 2 dubbo 2 http 2 http func Call() context.FilterFunc { return func(c context.Context) { - doRemoteCall(c.(*selfhttp.HttpContext)) + doRemoteCall(c.(*contexthttp.HttpContext)) } } -func doRemoteCall(c *selfhttp.HttpContext) { +func doRemoteCall(c *contexthttp.HttpContext) { api := c.GetAPI() typ := api.Method.IntegrationRequest.RequestType diff --git a/pkg/proxy/listener.go b/pkg/proxy/listener.go index 43a9836e1..791e787e1 100644 --- a/pkg/proxy/listener.go +++ b/pkg/proxy/listener.go @@ -35,7 +35,6 @@ import ( "github.com/dubbogo/dubbo-go-proxy/pkg/config" "github.com/dubbogo/dubbo-go-proxy/pkg/context" h "github.com/dubbogo/dubbo-go-proxy/pkg/context/http" - _ "github.com/dubbogo/dubbo-go-proxy/pkg/filter/remote" "github.com/dubbogo/dubbo-go-proxy/pkg/logger" "github.com/dubbogo/dubbo-go-proxy/pkg/model" "github.com/dubbogo/dubbo-go-proxy/pkg/router" diff --git a/sample/dubbogo/client/app/user.go b/sample/dubbogo/client/app/user.go index 68b0b941b..01e039791 100755 --- a/sample/dubbogo/client/app/user.go +++ b/sample/dubbogo/client/app/user.go @@ -21,13 +21,15 @@ import ( "time" ) +// nolint. type User struct { - Id string + ID string Name string Age int32 Time time.Time } +// nolint. func (u User) JavaClassName() string { return "com.ikurento.user.User" } diff --git a/sample/dubbogo/sample.md b/sample/dubbogo/sample.md index fe8fe8adc..9b5b24ded 100644 --- a/sample/dubbogo/sample.md +++ b/sample/dubbogo/sample.md @@ -51,4 +51,8 @@ server 日志: Req GetUserByName data:"tc" Req GetUserByName result:&main.User{Id:"0001", Name:"tc", Age:18, Time:time.Time{wall:0xbfe201c6b219ce40, ext:5594874, loc:(*time.Location)(0x1c3b100)}} 2020-11-08T14:33:31.676+0800 INFO dubbo/listener.go:196 got session:session {server:TCP_SERVER:2:192.168.0.113:20000<->192.168.0.113:52871}, Read Bytes: 0, Write Bytes: 0, Read Pkgs: 0, Write Pkgs: 0 -``` \ No newline at end of file +``` + +## 其它 + +dubbogo/client 是给泛化调用的客户端使用例子,方便对比和学习泛化调用 \ No newline at end of file diff --git a/sample/dubbogo/server/app/user.go b/sample/dubbogo/server/app/user.go index d82b0be82..c0f54d7ea 100644 --- a/sample/dubbogo/server/app/user.go +++ b/sample/dubbogo/server/app/user.go @@ -40,17 +40,19 @@ func init() { lock: sync.Mutex{}, } - cache.Add(&User{Id: "0001", Name: "tc", Age: 18, Time: time.Now()}) + cache.Add(&User{ID: "0001", Name: "tc", Age: 18, Time: time.Now()}) } var cache *UserDB +// UserDB cache user. type UserDB struct { // key is name, value is user obj cacheMap map[string]*User lock sync.Mutex } +// nolint. func (db *UserDB) Add(u *User) bool { db.lock.Lock() defer db.lock.Unlock() @@ -59,6 +61,7 @@ func (db *UserDB) Add(u *User) bool { return true } +// nolint. func (db *UserDB) Get(n string) (*User, bool) { db.lock.Lock() defer db.lock.Unlock() @@ -67,18 +70,20 @@ func (db *UserDB) Get(n string) (*User, bool) { return r, ok } +// User user obj. type User struct { - Id string + ID string Name string Age int32 Time time.Time } -// version: 1.0.0 group: test -// methods: all +// UserProvider the dubbo provider. +// like: version: 1.0.0 group: test type UserProvider struct { } +// CreateUser new user, Proxy config POST. func (u *UserProvider) CreateUser(ctx context.Context, user *User) (*User, error) { println("Req CreateUser data:%#v", user) if user == nil { @@ -90,58 +95,74 @@ func (u *UserProvider) CreateUser(ctx context.Context, user *User) (*User, error } cache.Add(user) - return user, nil } +// GetUserByName query by name, single param, Proxy config GET. func (u *UserProvider) GetUserByName(ctx context.Context, name string) (*User, error) { - println("Req GetUserByName data:%#v", name) + println("Req GetUserByName name:%#v", name) r, ok := cache.Get(name) if ok { println("Req GetUserByName result:%#v", r) return r, nil } - return nil, nil } -func (u *UserProvider) QueryUser(ctx context.Context, user *User) (*User, error) { - println("Req QueryUser data:%#v", user) - rsp := User{user.Id, user.Name, user.Age, time.Now()} - println("Req QueryUser data:%#v", rsp) - return &rsp, nil +// GetUserByNameAndAge query by name and age, two params, Proxy config GET. +func (u *UserProvider) GetUserByNameAndAge(ctx context.Context, name string, age int32) (*User, error) { + println("Req GetUserByNameAndAge name:%s, age:%d", name, age) + r, ok := cache.Get(name) + if ok && r.Age == age { + println("Req GetUserByName result:%#v", r) + return r, nil + } + return r, nil } -func (u *UserProvider) TwoSimpleParams(ctx context.Context, name string, age int32) (*User, error) { - println("Req TwoSimpleParams name:%s, age:%d", name, age) - rsp := User{"1", name, age, time.Now()} - println("Req TwoSimpleParams data:%#v", rsp) - return &rsp, nil +// UpdateUser update by user struct, my be another struct, Proxy config POST or PUT. +func (u *UserProvider) UpdateUser(ctx context.Context, user *User) (bool, error) { + println("Req UpdateUser data:%#v", user) + r, ok := cache.Get(user.Name) + if ok { + if user.ID != "" { + r.ID = user.ID + } + if user.Age >= 0 { + r.Age = user.Age + } + return true, nil + } + return false, errors.New("not found") } -func (u *UserProvider) TwoSimpleParamsWithError(ctx context.Context, name string, age int32) (*User, error) { - println("Req TwoSimpleParamsWithError name:%s, age:%d", name, age) - rsp := User{"1", name, age, time.Now()} - println("Req TwoSimpleParamsWithError data:%#v", rsp) - return &rsp, errors.New("TwoSimpleParams error") +// UpdateUser update by user struct, my be another struct, Proxy config POST or PUT. +func (u *UserProvider) UpdateUserByName(ctx context.Context, name string, user *User) (bool, error) { + println("Req UpdateUser data:%#v", user) + r, ok := cache.Get(name) + if ok { + if user.ID != "" { + r.ID = user.ID + } + if user.Age >= 0 { + r.Age = user.Age + } + return true, nil + } + return false, errors.New("not found") } -// 方法名称映射,做参考 -// GetUserByName can call success. -//func (u *UserProvider) MethodMapper() map[string]string { -// return map[string]string{ -// "GetUserByName": "queryUserByName", -// } -//} - +// nolint. func (u *UserProvider) Reference() string { return "UserProvider" } +// nolint. func (u User) JavaClassName() string { return "com.ikurento.user.User" } +// nolint. func println(format string, args ...interface{}) { fmt.Printf("\033[32;40m"+format+"\033[0m\n", args...) } diff --git a/sample/dubbogo/server/app/version.go b/sample/dubbogo/server/app/version.go index ae51f45d9..2d2a70eb2 100644 --- a/sample/dubbogo/server/app/version.go +++ b/sample/dubbogo/server/app/version.go @@ -18,5 +18,6 @@ package main var ( + // Version dubbo version Version = "2.7.5" ) From adc0873100d516ffa95b6edebd3706298f37e271 Mon Sep 17 00:00:00 2001 From: tiecheng Date: Mon, 9 Nov 2020 15:04:28 +0800 Subject: [PATCH 211/227] resolve conversation Former-commit-id: f80d9a6b53897e0694afb48bfbebb4f84af86d7f Former-commit-id: f104f043f33cab274eeba836c2d3513a95e91261 --- pkg/pool/pool.go | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/pkg/pool/pool.go b/pkg/pool/pool.go index 340f55adf..40c7ff417 100644 --- a/pkg/pool/pool.go +++ b/pkg/pool/pool.go @@ -35,8 +35,8 @@ type ClientPool struct { } var ( - _clientPool *ClientPool - once = sync.Once{} + clientPool *ClientPool + once = sync.Once{} ) func newClientPool() *ClientPool { @@ -59,13 +59,13 @@ func newClientPool() *ClientPool { // SingletonPool singleton pool func SingletonPool() *ClientPool { - if _clientPool == nil { + if clientPool == nil { once.Do(func() { - _clientPool = newClientPool() + clientPool = newClientPool() }) } - return _clientPool + return clientPool } // GetClient a factory method to get a client according to apiType . From f9d11fc7a8d792f4edfb7abaf9554fc3a60b751f Mon Sep 17 00:00:00 2001 From: tiecheng Date: Mon, 9 Nov 2020 15:15:56 +0800 Subject: [PATCH 212/227] resolve conversation Former-commit-id: a99bf12c4f6aeadf2975ce9d57b45545d6cee9cf Former-commit-id: 49f83837bfb4569bae23f15284a9e3ed0e8304f5 --- pkg/context/http/context_test.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/pkg/context/http/context_test.go b/pkg/context/http/context_test.go index 3f94c49bf..d28059fa4 100644 --- a/pkg/context/http/context_test.go +++ b/pkg/context/http/context_test.go @@ -15,7 +15,7 @@ * limitations under the License. */ -package http_test +package http import ( "testing" @@ -29,8 +29,8 @@ import ( "github.com/dubbogo/dubbo-go-proxy/pkg/common/extension" "github.com/dubbogo/dubbo-go-proxy/pkg/config" "github.com/dubbogo/dubbo-go-proxy/pkg/context" - httpCtx "github.com/dubbogo/dubbo-go-proxy/pkg/context/http" _ "github.com/dubbogo/dubbo-go-proxy/pkg/filter" + _ "github.com/dubbogo/dubbo-go-proxy/pkg/filter/remote" "github.com/dubbogo/dubbo-go-proxy/pkg/model" "github.com/dubbogo/dubbo-go-proxy/pkg/router" ) @@ -55,7 +55,7 @@ func TestBuildContext(t *testing.T) { extension.SetFilterFunc("a", func(ctx context.Context) { ctx.Next() }) extension.SetFilterFunc("b", func(ctx context.Context) { ctx.Next() }) extension.SetFilterFunc("c", func(ctx context.Context) { ctx.Next() }) - ctx := httpCtx.HttpContext{ + ctx := HttpContext{ FilterChains: []model.FilterChain{}, BaseContext: context.NewBaseContext(), } From cfa7142abb6b1f32f02ac174c38c4659bb4895c8 Mon Sep 17 00:00:00 2001 From: tiecheng Date: Mon, 9 Nov 2020 15:37:04 +0800 Subject: [PATCH 213/227] resolve conversation Former-commit-id: 5b74c825831d420e382909fc168805df63bc3f5d Former-commit-id: bd737fc24fbfb3b345100b4aff1e8f7aaa85557b --- pkg/context/http/context_test.go | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/pkg/context/http/context_test.go b/pkg/context/http/context_test.go index d28059fa4..349d6230a 100644 --- a/pkg/context/http/context_test.go +++ b/pkg/context/http/context_test.go @@ -29,8 +29,6 @@ import ( "github.com/dubbogo/dubbo-go-proxy/pkg/common/extension" "github.com/dubbogo/dubbo-go-proxy/pkg/config" "github.com/dubbogo/dubbo-go-proxy/pkg/context" - _ "github.com/dubbogo/dubbo-go-proxy/pkg/filter" - _ "github.com/dubbogo/dubbo-go-proxy/pkg/filter/remote" "github.com/dubbogo/dubbo-go-proxy/pkg/model" "github.com/dubbogo/dubbo-go-proxy/pkg/router" ) @@ -60,7 +58,6 @@ func TestBuildContext(t *testing.T) { BaseContext: context.NewBaseContext(), } ctx.API(getMockAPI(config.MethodPost, "/mock/test", "a", "b", "c")) - ctx.BuildFilters() - assert.Equal(t, len(ctx.Filters), 4) + assert.Equal(t, len(ctx.Filters), 3) } From 24c9d39b5c08142f90968c2d6e5ae6614311d5f7 Mon Sep 17 00:00:00 2001 From: tiecheng Date: Mon, 9 Nov 2020 15:44:43 +0800 Subject: [PATCH 214/227] resolve conversation Former-commit-id: e274d1c75d961ec7273a3fb89362a798ea705d66 Former-commit-id: 685e1977f533e54bb1e69d61a6ecdcb9683d7f10 --- pkg/context/http/context.go | 8 +++++++- pkg/context/http/context_test.go | 1 + pkg/proxy/listener.go | 2 +- 3 files changed, 9 insertions(+), 2 deletions(-) diff --git a/pkg/context/http/context.go b/pkg/context/http/context.go index 562aedb90..1423d1d72 100644 --- a/pkg/context/http/context.go +++ b/pkg/context/http/context.go @@ -182,10 +182,16 @@ func (hc *HttpContext) BuildFilters() { filterFuncs = append(filterFuncs, extension.GetMustFilterFunc(v)) } - hc.AppendFilterFunc(extension.GetMustFilterFunc(constant.RemoteCallFilter)) hc.AppendFilterFunc(filterFuncs...) } +// BuildFiltersWithDefault build filter like BuildFilters, but add some default filter. +func (hc *HttpContext) BuildFiltersWithDefault() { + hc.AppendFilterFunc(extension.GetMustFilterFunc(constant.RemoteCallFilter)) + + hc.BuildFilters() +} + // ResetWritermen reset writermen func (hc *HttpContext) ResetWritermen(w http.ResponseWriter) { hc.writermem.reset(w) diff --git a/pkg/context/http/context_test.go b/pkg/context/http/context_test.go index 349d6230a..6b056b78c 100644 --- a/pkg/context/http/context_test.go +++ b/pkg/context/http/context_test.go @@ -58,6 +58,7 @@ func TestBuildContext(t *testing.T) { BaseContext: context.NewBaseContext(), } ctx.API(getMockAPI(config.MethodPost, "/mock/test", "a", "b", "c")) + ctx.BuildFilters() assert.Equal(t, len(ctx.Filters), 3) } diff --git a/pkg/proxy/listener.go b/pkg/proxy/listener.go index 791e787e1..c6d3a6a25 100644 --- a/pkg/proxy/listener.go +++ b/pkg/proxy/listener.go @@ -136,7 +136,7 @@ func (s *DefaultHttpListener) ServeHTTP(w http.ResponseWriter, r *http.Request) s.pool.Put(hc) return } - hc.BuildFilters() + hc.BuildFiltersWithDefault() s.handleHTTPRequest(hc) From bc64cd5409ea482eb44220349303363edc0a3250 Mon Sep 17 00:00:00 2001 From: xiaoliu <18721825717@163.com> Date: Mon, 9 Nov 2020 16:03:15 +0800 Subject: [PATCH 215/227] 1. merge develop Former-commit-id: ce3fee8c2049d2f74f9900bf27739ebd7e005db8 Former-commit-id: 36450e11eb42d255d85a99a3ae5dd734ed6d98b3 --- pkg/proxy/proxy_start.go | 1 + 1 file changed, 1 insertion(+) diff --git a/pkg/proxy/proxy_start.go b/pkg/proxy/proxy_start.go index b6fc1b25d..0c4eb761f 100644 --- a/pkg/proxy/proxy_start.go +++ b/pkg/proxy/proxy_start.go @@ -25,6 +25,7 @@ import ( import ( "github.com/dubbogo/dubbo-go-proxy/pkg/client/dubbo" + "github.com/dubbogo/dubbo-go-proxy/pkg/common/constant" "github.com/dubbogo/dubbo-go-proxy/pkg/config" _ "github.com/dubbogo/dubbo-go-proxy/pkg/filter" "github.com/dubbogo/dubbo-go-proxy/pkg/logger" From 7bec50ae19524a5e0709eb40de46d4ad9f63e661 Mon Sep 17 00:00:00 2001 From: xiaoliu <18721825717@163.com> Date: Tue, 10 Nov 2020 16:19:31 +0800 Subject: [PATCH 216/227] 1. format code Former-commit-id: 0999db8767cb0c24d74ddefbff03f353b2808b70 Former-commit-id: 4d3b948cb4a74956c8a665316de1968ea7d78d98 --- pkg/model/bootstrap.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkg/model/bootstrap.go b/pkg/model/bootstrap.go index 858c654f4..d63f6e388 100644 --- a/pkg/model/bootstrap.go +++ b/pkg/model/bootstrap.go @@ -52,7 +52,7 @@ type StaticResources struct { Listeners []Listener `yaml:"listeners" json:"listeners" mapstructure:"listeners"` Clusters []Cluster `yaml:"clusters" json:"clusters" mapstructure:"clusters"` ShutdownConfig *ShutdownConfig `yaml:"shutdown_config" json:"shutdown_config" mapstructure:"shutdown_config"` - PprofConf PprofConf `yaml:"pprofConf json:"pprofConf" mapstructure:"pprofConf"` + PprofConf PprofConf `yaml:"pprofConf json:"pprofConf" mapstructure:"pprofConf"` } // DynamicResources TODO From 66d014c50d6516a1730bf606f6ac21d32f60b09f Mon Sep 17 00:00:00 2001 From: oaoit Date: Tue, 10 Nov 2020 19:06:37 +0800 Subject: [PATCH 217/227] merge HTTP filter const. Former-commit-id: c6d09ec2221623306d620b1bea0e327358050a15 Former-commit-id: 11c5eb4f406107e11087e27e12b27fe7052e41f7 --- pkg/common/constant/key.go | 5 ----- 1 file changed, 5 deletions(-) diff --git a/pkg/common/constant/key.go b/pkg/common/constant/key.go index 368ceb149..7d09a506e 100644 --- a/pkg/common/constant/key.go +++ b/pkg/common/constant/key.go @@ -24,11 +24,6 @@ const ( HTTPRouterFilter = "dgp.filters.http.router" HTTPApiFilter = "dgp.filters.http.api" HTTPDomainFilter = "dgp.filters.http.domain" - HTTPTransferDubboFilter = "dgp.filters.http_transfer_dubbo" - HttpConnectManagerFilter = "dgp.filters.http_connect_manager" - HttpRouterFilter = "dgp.filters.http.router" - HttpApiFilter = "dgp.filters.http.api" - HttpDomainFilter = "dgp.filters.http.domain" RemoteCallFilter = "dgp.filters.remote_call" LoggerFilter = "dgp.filters.logger" From 25e9555e03997efe031103f3a95444dd646f7630 Mon Sep 17 00:00:00 2001 From: tiecheng Date: Wed, 11 Nov 2020 19:41:16 +0800 Subject: [PATCH 218/227] move recovery Former-commit-id: fbbc9732b9ab90c1fcd6a635ddc195f3e68210d5 Former-commit-id: d694999fbc891af831c5ea0ae661dbf66aa6f46f --- .../recovery.go} | 10 ++++---- pkg/filter/recovery/recovery_test.go | 24 +++++++++++++++++++ 2 files changed, 29 insertions(+), 5 deletions(-) rename pkg/filter/{recovery_filter.go => recovery/recovery.go} (84%) create mode 100644 pkg/filter/recovery/recovery_test.go diff --git a/pkg/filter/recovery_filter.go b/pkg/filter/recovery/recovery.go similarity index 84% rename from pkg/filter/recovery_filter.go rename to pkg/filter/recovery/recovery.go index 2691a1c7f..53ad6e95b 100644 --- a/pkg/filter/recovery_filter.go +++ b/pkg/filter/recovery/recovery.go @@ -15,7 +15,7 @@ * limitations under the License. */ -package filter +package recovery import ( "github.com/dubbogo/dubbo-go-proxy/pkg/common/constant" @@ -25,15 +25,15 @@ import ( ) func init() { - extension.SetFilterFunc(constant.RecoveryFilter, Recover()) + extension.SetFilterFunc(constant.RecoveryFilter, Recovery()) } -// Recover -func Recover() context.FilterFunc { +// Recovery recovery the panic, print log. +func Recovery() context.FilterFunc { return func(c context.Context) { defer func() { if err := recover(); err != nil { - logger.Infof("[dubboproxy go] error:%+v", err) + logger.Warnf("[dubboproxy go] error:%+v", err) c.WriteErr(err) } diff --git a/pkg/filter/recovery/recovery_test.go b/pkg/filter/recovery/recovery_test.go new file mode 100644 index 000000000..c1402a05d --- /dev/null +++ b/pkg/filter/recovery/recovery_test.go @@ -0,0 +1,24 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + */ + +package recovery + +import "testing" + +func TestRecoveryHandler(t *testing.T) { + +} From 04a49b7057091c541170527a2bc01abc3a93af83 Mon Sep 17 00:00:00 2001 From: williamfeng323 Date: Thu, 12 Nov 2020 14:14:28 +0800 Subject: [PATCH 219/227] #41 implement mapping inbound params to backend dubbo server Former-commit-id: 00fac0cce2406dc978aaa422349d204b64452079 Former-commit-id: 382f7bbf134fb75de8afa659e1ff4463bfaede19 --- .gitignore | 3 +- go.sum | 1 + pkg/client/dubbo/dubbo.go | 121 +++++++------------ pkg/client/dubbo/dubbo_test.go | 122 +++++++++++++++++++ pkg/client/dubbo/mapper.go | 127 ++++++++++++++++++++ pkg/client/dubbo/mapper_test.go | 136 ++++++++++++++++++++++ pkg/client/mapper.go | 47 ++++++++ pkg/client/request.go | 4 +- pkg/common/mock/router.go | 40 +++++++ pkg/context/http/context_test.go | 22 +--- pkg/filter/remote/call.go | 2 +- pkg/proxy/listener_test.go | 20 +--- pkg/service/api/discovery_service_test.go | 33 ++---- 13 files changed, 537 insertions(+), 141 deletions(-) create mode 100644 pkg/client/dubbo/mapper.go create mode 100644 pkg/client/dubbo/mapper_test.go create mode 100644 pkg/client/mapper.go create mode 100644 pkg/common/mock/router.go diff --git a/.gitignore b/.gitignore index 9a8941e54..dea7be67e 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,5 @@ ./dubbo-go-proxy /logs /.idea -/.vscode \ No newline at end of file +/.vscode +pkg/registry/zookeeper-4unittest/contrib/fatjar \ No newline at end of file diff --git a/go.sum b/go.sum index 51cd48924..3128542f0 100644 --- a/go.sum +++ b/go.sum @@ -73,6 +73,7 @@ github.com/apache/dubbo-getty v1.3.10 h1:ys5mwjPdxG/KwkPjS6EI0RzQtU6p6FCPoKpaFEz github.com/apache/dubbo-getty v1.3.10/go.mod h1:x6rraK01BL5C7jUM2fPl5KMkAxLVIx54ZB8/XEOik9Y= github.com/apache/dubbo-go v1.5.1 h1:hYktTWnMJdzwY0NkvSqJfOERkwFApZ3mH/tQBLVGO34= github.com/apache/dubbo-go v1.5.1/go.mod h1:lxwgtF+27mSFQsSrBLaVbdQpwCp+pBN/mHP4w4/N2Qc= +github.com/apache/dubbo-go v1.5.4 h1:kRVw2p6Fqk5PlJGHeb8IVFg5AuBJFPFvCvRm7/i3Qco= github.com/apache/dubbo-go-hessian2 v1.6.2 h1:i7F5GjVaUatLQz1x9vUmmSIFj49L8J6rVICdF6xw4qw= github.com/apache/dubbo-go-hessian2 v1.6.2/go.mod h1:7rEw9guWABQa6Aqb8HeZcsYPHsOS7XT1qtJvkmI6c5w= github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e h1:QEF07wC0T1rKkctt1RINW/+RMTVmiwxETico2l3gxJA= diff --git a/pkg/client/dubbo/dubbo.go b/pkg/client/dubbo/dubbo.go index 87b3f41cf..b47225249 100644 --- a/pkg/client/dubbo/dubbo.go +++ b/pkg/client/dubbo/dubbo.go @@ -19,10 +19,7 @@ package dubbo import ( "context" - "encoding/json" - "errors" - "io/ioutil" - "regexp" + "reflect" "strings" "sync" "time" @@ -32,6 +29,7 @@ import ( "github.com/apache/dubbo-go/common/constant" dg "github.com/apache/dubbo-go/config" "github.com/apache/dubbo-go/protocol/dubbo" + "github.com/pkg/errors" ) import ( @@ -46,6 +44,12 @@ const ( JavaLangClassName = "java.lang.Long" ) +var mappers = map[string]client.ParamMapper{ + "queryStrings": queryStringsMapper{}, + "headers": headerMapper{}, + "requestBody": bodyMapper{}, +} + var ( dubboClient *Client onceClient = sync.Once{} @@ -158,87 +162,21 @@ func (dc *Client) Call(req *client.Request) (resp client.Response, err error) { } // MappingParams param mapping to api. -// TODO wait for detail impl -func (dc *Client) MappingParams(req *client.Request) (types []string, reqData []interface{}, err error) { +func (dc *Client) MappingParams(req *client.Request) ([]string, []interface{}, error) { r := req.API.Method.IntegrationRequest - for i := range r.MappingParams { - m := r.MappingParams[i] - typ, value, err := paramParse(req, m.Name) + values := []interface{}{} + for _, mappingParam := range r.MappingParams { + source, _, err := client.ParseMapSource(mappingParam.Name) if err != nil { return nil, nil, err } - - types = append(types, typ) - reqData = append(reqData, value) - } - - return -} - -func paramParse(req *client.Request, param string) (typ string, value interface{}, err error) { - inboundRequest := req.API.Method.InboundRequest - inReq := req.IngressRequest - - var ingaressReqDate []byte - - if param == "requestBody" && req.API.Method.RequestBody != nil { - ingaressReqDate, err = ioutil.ReadAll(inReq.Body) - if err != nil { - return "", nil, err - } - - bodyMap := make(map[string]interface{}) - if err := json.Unmarshal(ingaressReqDate, &bodyMap); err != nil { - return "", nil, err - } - // TODO - return inboundRequest.RequestBody[0].DefinitionName, bodyMap, nil - } - - reg := regexp.MustCompile(`^([query|uri][\w|\d]+)\.([\w|\d]+)$`) - if !reg.MatchString(param) { - return "", nil, errors.New("not match, check your config") - } - ps := reg.FindStringSubmatch(param) - - from := ps[1] - key := ps[2] - if from == "queryStrings" { - for i := range inboundRequest.QueryStrings { - p := inboundRequest.QueryStrings[i] - q := inReq.URL.Query().Get(key) - if p.Name == key { - if p.Required && q == "" { - return "", nil, errors.New("illegal param") - } - - if q != "" { - ingaressReqDate, err = json.Marshal(q) - } - - switch p.Type { - case "string": - var s string - if err := json.Unmarshal(ingaressReqDate, &s); err != nil { - logger.Errorf("params parse error:%+v", err) - return "", "", err - } - return JavaStringClassName, s, nil - case "int": - var i int - if err := json.Unmarshal(ingaressReqDate, &i); err != nil { - logger.Errorf("params parse error:%+v", err) - return "", nil, err - } - return JavaLangClassName, i, nil - } - - break + if mapper, ok := mappers[source]; ok { + if err := mapper.Map(mappingParam, *req, &values); err != nil { + return nil, nil, err } } } - - return "", "", nil + return req.API.IntegrationRequest.ParamTypes, values, nil } func (dc *Client) get(key string) *dg.GenericService { @@ -304,3 +242,30 @@ func (dc *Client) create(key string, irequest config.IntegrationRequest) *dg.Gen dc.GenericServicePool[key] = clientService return clientService } + +func validateTarget(target interface{}) (reflect.Value, error) { + rv := reflect.ValueOf(target) + if rv.Kind() != reflect.Ptr || rv.IsNil() { + return rv, errors.New("Target params must be a non-nil pointer") + } + if _, ok := target.(*[]interface{}); !ok { + return rv, errors.New("Target params for dubbo backend must be *[]interface{}") + } + return rv, nil +} + +func setTarget(rv reflect.Value, pos int, value interface{}) { + if rv.Kind() != reflect.Ptr && rv.Type().Name() != "" && rv.CanAddr() { + rv = rv.Addr() + } else { + rv = rv.Elem() + } + + tempValue := rv.Interface().([]interface{}) + if len(tempValue) <= pos { + list := make([]interface{}, pos+1-len(tempValue)) + tempValue = append(tempValue, list...) + } + tempValue[pos] = value + rv.Set(reflect.ValueOf(tempValue)) +} diff --git a/pkg/client/dubbo/dubbo_test.go b/pkg/client/dubbo/dubbo_test.go index 01f727be7..33985309f 100644 --- a/pkg/client/dubbo/dubbo_test.go +++ b/pkg/client/dubbo/dubbo_test.go @@ -18,6 +18,8 @@ package dubbo import ( + "bytes" + "net/http" "regexp" "testing" ) @@ -26,6 +28,12 @@ import ( "github.com/stretchr/testify/assert" ) +import ( + "github.com/dubbogo/dubbo-go-proxy/pkg/client" + "github.com/dubbogo/dubbo-go-proxy/pkg/common/mock" + "github.com/dubbogo/dubbo-go-proxy/pkg/config" +) + func TestReg(t *testing.T) { reg := regexp.MustCompile(`^(query|uri)`) b := reg.MatchString("Stringquery") @@ -79,3 +87,117 @@ func TestClose(t *testing.T) { client.Close() assert.Equal(t, 0, len(client.GenericServicePool)) } + +func TestMappingParams(t *testing.T) { + dClient := NewDubboClient() + r, _ := http.NewRequest("GET", "/mock/test?id=12345&age=19", bytes.NewReader([]byte(""))) + api := mock.GetMockAPI(config.MethodGet, "/mock/test") + api.IntegrationRequest.MappingParams = []config.MappingParam{ + { + Name: "queryStrings.id", + MapTo: "0", + }, + { + Name: "queryStrings.age", + MapTo: "1", + }, + } + req := client.NewReq(r, api) + _, params, err := dClient.MappingParams(req) + assert.Nil(t, err) + assert.Equal(t, params[0], "12345") + assert.Equal(t, params[1], "19") + + r, _ = http.NewRequest("GET", "/mock/test?id=12345&age=19", bytes.NewReader([]byte(""))) + api = mock.GetMockAPI(config.MethodGet, "/mock/test") + api.IntegrationRequest.MappingParams = []config.MappingParam{ + { + Name: "queryStrings.id", + MapTo: "0", + }, + { + Name: "queryStrings.age", + MapTo: "1", + }, + { + Name: "headers.Auth", + MapTo: "2", + }, + } + r.Header.Set("Auth", "1234567") + req = client.NewReq(r, api) + _, params, err = dClient.MappingParams(req) + assert.Nil(t, err) + assert.Equal(t, params[0], "12345") + assert.Equal(t, params[1], "19") + assert.Equal(t, params[2], "1234567") + + r, _ = http.NewRequest("POST", "/mock/test?id=12345&age=19", bytes.NewReader([]byte(`{"sex": "male", "name":{"firstName": "Joe", "lastName": "Biden"}}`))) + api = mock.GetMockAPI(config.MethodGet, "/mock/test") + api.IntegrationRequest.MappingParams = []config.MappingParam{ + { + Name: "queryStrings.id", + MapTo: "0", + }, + { + Name: "queryStrings.age", + MapTo: "1", + }, + { + Name: "headers.Auth", + MapTo: "2", + }, + { + Name: "requestBody.sex", + MapTo: "3", + }, + { + Name: "requestBody.name.firstName", + MapTo: "4", + }, + } + r.Header.Set("Auth", "1234567") + req = client.NewReq(r, api) + _, params, err = dClient.MappingParams(req) + assert.Nil(t, err) + assert.Equal(t, params[0], "12345") + assert.Equal(t, params[1], "19") + assert.Equal(t, params[2], "1234567") + assert.Equal(t, params[3], "male") + assert.Equal(t, params[4], "Joe") +} + +func TestValidateTarget(t *testing.T) { + target := []interface{}{} + val, err := validateTarget(&target) + assert.Nil(t, err) + assert.NotNil(t, val) + _, err = validateTarget(target) + assert.EqualError(t, err, "Target params must be a non-nil pointer") + target2 := "" + _, err = validateTarget(&target2) + assert.EqualError(t, err, "Target params for dubbo backend must be *[]interface{}") +} + +func TestParseMapSource(t *testing.T) { + from, key, err := client.ParseMapSource("queryStrings.id") + assert.Nil(t, err) + assert.Equal(t, from, "queryStrings") + assert.Equal(t, key[0], "id") + + from, key, err = client.ParseMapSource("headers.id") + assert.Nil(t, err) + assert.Equal(t, from, "headers") + assert.Equal(t, key[0], "id") + + from, key, err = client.ParseMapSource("requestBody.user.id") + assert.Nil(t, err) + assert.Equal(t, from, "requestBody") + assert.Equal(t, key[0], "user") + assert.Equal(t, key[1], "id") + + from, key, err = client.ParseMapSource("what.user.id") + assert.EqualError(t, err, "Parameter mapping config incorrect. Please fix it") + from, key, err = client.ParseMapSource("requestBody.*userid") + assert.EqualError(t, err, "Parameter mapping config incorrect. Please fix it") +} diff --git a/pkg/client/dubbo/mapper.go b/pkg/client/dubbo/mapper.go new file mode 100644 index 000000000..baeb7d242 --- /dev/null +++ b/pkg/client/dubbo/mapper.go @@ -0,0 +1,127 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + */ + +package dubbo + +import ( + "strconv" +) + +import ( + "github.com/pkg/errors" +) + +import ( + "encoding/json" + "github.com/dubbogo/dubbo-go-proxy/pkg/client" + "github.com/dubbogo/dubbo-go-proxy/pkg/config" + "io/ioutil" + "reflect" +) + +type queryStringsMapper struct{} + +func (qm queryStringsMapper) Map(mp config.MappingParam, c client.Request, target interface{}) error { + rv, err := validateTarget(target) + if err != nil { + return err + } + c.IngressRequest.ParseForm() + _, key, err := client.ParseMapSource(mp.Name) + if err != nil { + return err + } + pos, err := strconv.Atoi(mp.MapTo) + if err != nil { + return errors.Errorf("Parameter mapping %v incorrect", mp) + } + formValue := c.IngressRequest.Form.Get(key[0]) + if len(formValue) == 0 { + return errors.Errorf("Query parameter %s does not exist", key) + } + + setTarget(rv, pos, formValue) + + return nil +} + +type headerMapper struct{} + +func (hm headerMapper) Map(mp config.MappingParam, c client.Request, target interface{}) error { + rv, err := validateTarget(target) + if err != nil { + return err + } + _, key, err := client.ParseMapSource(mp.Name) + pos, err := strconv.Atoi(mp.MapTo) + if err != nil { + return errors.Errorf("Parameter mapping %v incorrect", mp) + } + header := c.IngressRequest.Header.Get(key[0]) + if len(header) == 0 { + return errors.Errorf("Header %s not found", key[0]) + } + setTarget(rv, pos, header) + return nil +} + +type bodyMapper struct{} + +func (bm bodyMapper) Map(mp config.MappingParam, c client.Request, target interface{}) error { + rv, err := validateTarget(target) + if err != nil { + return err + } + _, keys, err := client.ParseMapSource(mp.Name) + if err != nil { + return err + } + pos, err := strconv.Atoi(mp.MapTo) + if err != nil { + return errors.Errorf("Parameter mapping %v incorrect", mp) + } + + body, err := c.IngressRequest.GetBody() + if err != nil { + return err + } + rawBody, err := ioutil.ReadAll(body) + if err != nil { + return err + } + mapBody := map[string]interface{}{} + json.Unmarshal(rawBody, &mapBody) + val, err := getMapValue(mapBody, keys) + + setTarget(rv, pos, val) + return nil +} + +func getMapValue(sourceMap map[string]interface{}, keys []string) (interface{}, error) { + for i, key := range keys { + _, ok := sourceMap[key] + if !ok { + return nil, errors.Errorf("%s does not exist in request body", key) + } + rvalue := reflect.ValueOf(sourceMap[key]) + if rvalue.Type().Kind() != reflect.Map { + return rvalue.Interface(), nil + } + return getMapValue(sourceMap[key].(map[string]interface{}), keys[i+1:]) + } + return nil, nil +} diff --git a/pkg/client/dubbo/mapper_test.go b/pkg/client/dubbo/mapper_test.go new file mode 100644 index 000000000..0d1bda4e3 --- /dev/null +++ b/pkg/client/dubbo/mapper_test.go @@ -0,0 +1,136 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + */ + +package dubbo + +import ( + "bytes" + "net/http" + "testing" +) + +import ( + "github.com/stretchr/testify/assert" +) + +import ( + "github.com/dubbogo/dubbo-go-proxy/pkg/client" + "github.com/dubbogo/dubbo-go-proxy/pkg/common/mock" + "github.com/dubbogo/dubbo-go-proxy/pkg/config" +) + +func TestQueryStringsMapper(t *testing.T) { + r, _ := http.NewRequest("GET", "/mock/test?id=12345&age=19", bytes.NewReader([]byte(""))) + api := mock.GetMockAPI(config.MethodGet, "/mock/test") + api.IntegrationRequest.MappingParams = []config.MappingParam{ + { + Name: "queryStrings.id", + MapTo: "0", + }, + { + Name: "queryStrings.name", + MapTo: "1", + }, + { + Name: "queryStrings.age", + MapTo: "jk", + }, + } + req := client.NewReq(r, api) + + params := []interface{}{} + qs := queryStringsMapper{} + err := qs.Map(api.IntegrationRequest.MappingParams[0], *req, ¶ms) + assert.Nil(t, err) + assert.Equal(t, params[0], "12345") + err = qs.Map(api.IntegrationRequest.MappingParams[1], *req, ¶ms) + assert.EqualError(t, err, "Query parameter [name] does not exist") + err = qs.Map(api.IntegrationRequest.MappingParams[2], *req, ¶ms) + assert.EqualError(t, err, "Parameter mapping {queryStrings.age jk} incorrect") + + r, _ = http.NewRequest("GET", "/mock/test?id=12345&age=19", bytes.NewReader([]byte(""))) + api = mock.GetMockAPI(config.MethodGet, "/mock/test") + api.IntegrationRequest.MappingParams = []config.MappingParam{ + { + Name: "queryStrings.id", + MapTo: "1", + }, + { + Name: "queryStrings.age", + MapTo: "0", + }, + } + req = client.NewReq(r, api) + params = []interface{}{} + err = qs.Map(api.IntegrationRequest.MappingParams[0], *req, ¶ms) + assert.Nil(t, err) + assert.Equal(t, params[1], "12345") + assert.Nil(t, params[0]) + err = qs.Map(api.IntegrationRequest.MappingParams[1], *req, ¶ms) + assert.Nil(t, err) + assert.Equal(t, params[1], "12345") + assert.Equal(t, params[0], "19") +} + +func TestHeaderMapper(t *testing.T) { + r, _ := http.NewRequest("GET", "/mock/test?id=12345&age=19", bytes.NewReader([]byte(""))) + r.Header.Set("Auth", "1234567") + api := mock.GetMockAPI(config.MethodGet, "/mock/test") + api.IntegrationRequest.MappingParams = []config.MappingParam{ + { + Name: "headers.Auth", + MapTo: "0", + }, + } + hm := headerMapper{} + target := []interface{}{} + req := client.NewReq(r, api) + + err := hm.Map(api.IntegrationRequest.MappingParams[0], *req, &target) + assert.Nil(t, err) + assert.Equal(t, target[0], "1234567") + + err = hm.Map(config.MappingParam{Name: "headers.Test", MapTo: "0"}, *req, &target) + assert.EqualError(t, err, "Header Test not found") +} + +func TestBodyMapper(t *testing.T) { + r, _ := http.NewRequest("POST", "/mock/test?id=12345&age=19", bytes.NewReader([]byte(`{"sex": "male", "name":{"firstName": "Joe", "lastName": "Biden"}}`))) + r.Header.Set("Auth", "1234567") + api := mock.GetMockAPI(config.MethodGet, "/mock/test") + api.IntegrationRequest.MappingParams = []config.MappingParam{ + { + Name: "requestBody.sex", + MapTo: "0", + }, + { + Name: "requestBody.name.lastName", + MapTo: "1", + }, + } + bm := bodyMapper{} + target := []interface{}{} + req := client.NewReq(r, api) + + err := bm.Map(api.IntegrationRequest.MappingParams[0], *req, &target) + assert.Nil(t, err) + assert.Equal(t, target[0], "male") + + err = bm.Map(api.IntegrationRequest.MappingParams[1], *req, &target) + assert.Nil(t, err) + assert.Equal(t, target[1], "Biden") +} diff --git a/pkg/client/mapper.go b/pkg/client/mapper.go new file mode 100644 index 000000000..3acd5f847 --- /dev/null +++ b/pkg/client/mapper.go @@ -0,0 +1,47 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + */ + +package client + +import ( + "regexp" + "strings" +) + +import ( + "github.com/pkg/errors" +) + +import ( + "github.com/dubbogo/dubbo-go-proxy/pkg/config" +) + +// ParamMapper defines the interface about how to map the params in the inbound request. +type ParamMapper interface { + Map(config.MappingParam, Request, interface{}) error +} + +// ParseMapSource parses the source parameter config in the mappingParams +// the source parameter in config could be queryStrings.*, headers.*, requestBody.* +func ParseMapSource(source string) (from string, params []string, err error) { + reg := regexp.MustCompile(`^([queryStrings|headers|requestBody][\w|\d]+)\.([\w|\d|\.]+)$`) + if !reg.MatchString(source) { + return "", nil, errors.New("Parameter mapping config incorrect. Please fix it") + } + ps := reg.FindStringSubmatch(source) + return ps[1], strings.Split(ps[2], "."), nil +} diff --git a/pkg/client/request.go b/pkg/client/request.go index 2863362b0..f922ca951 100644 --- a/pkg/client/request.go +++ b/pkg/client/request.go @@ -28,11 +28,11 @@ import ( // Request request for endpoint type Request struct { IngressRequest *http.Request - API *router.API + API router.API } // NewReq create a request -func NewReq(request *http.Request, api *router.API) *Request { +func NewReq(request *http.Request, api router.API) *Request { return &Request{ IngressRequest: request, API: api, diff --git a/pkg/common/mock/router.go b/pkg/common/mock/router.go new file mode 100644 index 000000000..4f1851673 --- /dev/null +++ b/pkg/common/mock/router.go @@ -0,0 +1,40 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + */ + +package mock + +import ( + "github.com/dubbogo/dubbo-go-proxy/pkg/config" + "github.com/dubbogo/dubbo-go-proxy/pkg/router" +) + +// GetMockAPI a mock util to create router.API +func GetMockAPI(verb config.HTTPVerb, urlPattern string, filters ...string) router.API { + inbound := config.InboundRequest{} + integration := config.IntegrationRequest{RequestType: config.DubboRequest} + method := config.Method{ + OnAir: true, + HTTPVerb: verb, + InboundRequest: inbound, + IntegrationRequest: integration, + Filters: filters, + } + return router.API{ + URLPattern: urlPattern, + Method: method, + } +} diff --git a/pkg/context/http/context_test.go b/pkg/context/http/context_test.go index 6b056b78c..32af5a6e0 100644 --- a/pkg/context/http/context_test.go +++ b/pkg/context/http/context_test.go @@ -26,38 +26,24 @@ import ( ) import ( + "github.com/dubbogo/dubbo-go-proxy/pkg/common/constant" "github.com/dubbogo/dubbo-go-proxy/pkg/common/extension" + "github.com/dubbogo/dubbo-go-proxy/pkg/common/mock" "github.com/dubbogo/dubbo-go-proxy/pkg/config" "github.com/dubbogo/dubbo-go-proxy/pkg/context" "github.com/dubbogo/dubbo-go-proxy/pkg/model" - "github.com/dubbogo/dubbo-go-proxy/pkg/router" ) -func getMockAPI(verb config.HTTPVerb, urlPattern string, filters ...string) router.API { - inbound := config.InboundRequest{} - integration := config.IntegrationRequest{RequestType: config.DubboRequest} - method := config.Method{ - OnAir: true, - HTTPVerb: verb, - InboundRequest: inbound, - IntegrationRequest: integration, - Filters: filters, - } - return router.API{ - URLPattern: urlPattern, - Method: method, - } -} - func TestBuildContext(t *testing.T) { extension.SetFilterFunc("a", func(ctx context.Context) { ctx.Next() }) extension.SetFilterFunc("b", func(ctx context.Context) { ctx.Next() }) extension.SetFilterFunc("c", func(ctx context.Context) { ctx.Next() }) + extension.SetFilterFunc(constant.RemoteCallFilter, func(ctx context.Context) { ctx.Next() }) ctx := HttpContext{ FilterChains: []model.FilterChain{}, BaseContext: context.NewBaseContext(), } - ctx.API(getMockAPI(config.MethodPost, "/mock/test", "a", "b", "c")) + ctx.API(mock.GetMockAPI(config.MethodPost, "/mock/test", "a", "b", "c")) ctx.BuildFilters() assert.Equal(t, len(ctx.Filters), 3) diff --git a/pkg/filter/remote/call.go b/pkg/filter/remote/call.go index 2ee18b135..937c74c12 100644 --- a/pkg/filter/remote/call.go +++ b/pkg/filter/remote/call.go @@ -66,7 +66,7 @@ func doRemoteCall(c *contexthttp.HttpContext) { return } - resp, err := cli.Call(client.NewReq(c.Request, api)) + resp, err := cli.Call(client.NewReq(c.Request, *api)) if err != nil { logger.Errorf("[dubboproxy go] client do err:%v!", err) diff --git a/pkg/proxy/listener_test.go b/pkg/proxy/listener_test.go index 321436621..d43ade4bd 100644 --- a/pkg/proxy/listener_test.go +++ b/pkg/proxy/listener_test.go @@ -31,6 +31,7 @@ import ( import ( "github.com/dubbogo/dubbo-go-proxy/pkg/common/constant" "github.com/dubbogo/dubbo-go-proxy/pkg/common/extension" + "github.com/dubbogo/dubbo-go-proxy/pkg/common/mock" "github.com/dubbogo/dubbo-go-proxy/pkg/config" "github.com/dubbogo/dubbo-go-proxy/pkg/context" ctxHttp "github.com/dubbogo/dubbo-go-proxy/pkg/context/http" @@ -64,28 +65,13 @@ func getTestContext() *ctxHttp.HttpContext { return hc } -func getMockAPI(verb config.HTTPVerb, urlPattern string) router.API { - inbound := config.InboundRequest{} - integration := config.IntegrationRequest{} - method := config.Method{ - OnAir: true, - HTTPVerb: verb, - InboundRequest: inbound, - IntegrationRequest: integration, - } - return router.API{ - URLPattern: urlPattern, - Method: method, - } -} - func TestRouteRequest(t *testing.T) { - mockAPI := getMockAPI(config.MethodPost, "/mock/test") + mockAPI := mock.GetMockAPI(config.MethodPost, "/mock/test") mockAPI.Method.OnAir = false apiDiscoverySrv := extension.GetMustAPIDiscoveryService(constant.LocalMemoryApiDiscoveryService) apiDiscoverySrv.AddAPI(mockAPI) - apiDiscoverySrv.AddAPI(getMockAPI(config.MethodGet, "/mock/test")) + apiDiscoverySrv.AddAPI(mock.GetMockAPI(config.MethodGet, "/mock/test")) listener := NewDefaultHttpListener() listener.pool.New = func() interface{} { diff --git a/pkg/service/api/discovery_service_test.go b/pkg/service/api/discovery_service_test.go index ae8b14f1f..7790e1e62 100644 --- a/pkg/service/api/discovery_service_test.go +++ b/pkg/service/api/discovery_service_test.go @@ -28,25 +28,10 @@ import ( import ( "github.com/dubbogo/dubbo-go-proxy/pkg/common/constant" "github.com/dubbogo/dubbo-go-proxy/pkg/common/extension" + "github.com/dubbogo/dubbo-go-proxy/pkg/common/mock" "github.com/dubbogo/dubbo-go-proxy/pkg/config" - "github.com/dubbogo/dubbo-go-proxy/pkg/router" ) -func getMockAPI(urlPattern string, verb config.HTTPVerb) router.API { - inbound := config.InboundRequest{} - integration := config.IntegrationRequest{} - method := config.Method{ - OnAir: true, - HTTPVerb: verb, - InboundRequest: inbound, - IntegrationRequest: integration, - } - return router.API{ - URLPattern: urlPattern, - Method: method, - } -} - func TestNewLocalMemoryAPIDiscoveryService(t *testing.T) { l := NewLocalMemoryAPIDiscoveryService() assert.NotNil(t, l) @@ -55,7 +40,7 @@ func TestNewLocalMemoryAPIDiscoveryService(t *testing.T) { func TestAddAPI(t *testing.T) { l := NewLocalMemoryAPIDiscoveryService() - err := l.AddAPI(getMockAPI("/this/is/test", config.MethodPut)) + err := l.AddAPI(mock.GetMockAPI(config.MethodPut, "/this/is/test")) assert.Nil(t, err) _, found := l.router.FindAPI("/this/is/test", config.MethodPut) assert.True(t, found) @@ -63,7 +48,7 @@ func TestAddAPI(t *testing.T) { func TestGetAPI(t *testing.T) { l := NewLocalMemoryAPIDiscoveryService() - err := l.AddAPI(getMockAPI("/this/is/test", config.MethodPut)) + err := l.AddAPI(mock.GetMockAPI(config.MethodPut, "/this/is/test")) assert.Nil(t, err) _, err = l.GetAPI("/this/is/test", config.MethodPut) assert.Nil(t, err) @@ -90,9 +75,9 @@ func TestLoadAPI(t *testing.T) { func TestLoadAPIFromResource(t *testing.T) { apiDiscSrv := NewLocalMemoryAPIDiscoveryService() - mockMethod1 := getMockAPI("", config.MethodPut).Method - mockMethod2 := getMockAPI("", config.MethodPost).Method - mockMethod3 := getMockAPI("", config.MethodGet).Method + mockMethod1 := mock.GetMockAPI(config.MethodPut, "").Method + mockMethod2 := mock.GetMockAPI(config.MethodPost, "").Method + mockMethod3 := mock.GetMockAPI(config.MethodGet, "").Method tempResources := []config.Resource{ { Type: "Restful", @@ -181,9 +166,9 @@ func TestLoadAPIFromResource(t *testing.T) { func TestLoadAPIFromMethods(t *testing.T) { tempMethods := []config.Method{ - getMockAPI("", config.MethodPut).Method, - getMockAPI("", config.MethodGet).Method, - getMockAPI("", config.MethodPut).Method, + mock.GetMockAPI(config.MethodPut, "").Method, + mock.GetMockAPI(config.MethodGet, "").Method, + mock.GetMockAPI(config.MethodPut, "").Method, } apiDiscSrv := NewLocalMemoryAPIDiscoveryService() err := loadAPIFromMethods("/mock", tempMethods, apiDiscSrv) From 07e1b6eec817511b3279c02457fa0ef7b4b3063e Mon Sep 17 00:00:00 2001 From: williamfeng323 Date: Thu, 12 Nov 2020 14:25:40 +0800 Subject: [PATCH 220/227] remove dubbogo 1.5.4 Former-commit-id: 0d9c7e8f8ed6fa6261626eca0533ffa62fa1b93a Former-commit-id: a0f057a69bd0a0d9495f45bf6144fb2dd36a431d --- go.sum | 1 - 1 file changed, 1 deletion(-) diff --git a/go.sum b/go.sum index 3128542f0..51cd48924 100644 --- a/go.sum +++ b/go.sum @@ -73,7 +73,6 @@ github.com/apache/dubbo-getty v1.3.10 h1:ys5mwjPdxG/KwkPjS6EI0RzQtU6p6FCPoKpaFEz github.com/apache/dubbo-getty v1.3.10/go.mod h1:x6rraK01BL5C7jUM2fPl5KMkAxLVIx54ZB8/XEOik9Y= github.com/apache/dubbo-go v1.5.1 h1:hYktTWnMJdzwY0NkvSqJfOERkwFApZ3mH/tQBLVGO34= github.com/apache/dubbo-go v1.5.1/go.mod h1:lxwgtF+27mSFQsSrBLaVbdQpwCp+pBN/mHP4w4/N2Qc= -github.com/apache/dubbo-go v1.5.4 h1:kRVw2p6Fqk5PlJGHeb8IVFg5AuBJFPFvCvRm7/i3Qco= github.com/apache/dubbo-go-hessian2 v1.6.2 h1:i7F5GjVaUatLQz1x9vUmmSIFj49L8J6rVICdF6xw4qw= github.com/apache/dubbo-go-hessian2 v1.6.2/go.mod h1:7rEw9guWABQa6Aqb8HeZcsYPHsOS7XT1qtJvkmI6c5w= github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e h1:QEF07wC0T1rKkctt1RINW/+RMTVmiwxETico2l3gxJA= From 0c98182d0929e7ea623abec86a1258eabd580739 Mon Sep 17 00:00:00 2001 From: tiecheng Date: Thu, 12 Nov 2020 17:49:26 +0800 Subject: [PATCH 221/227] update sum Former-commit-id: 67588828c90a93d8004fe1e5908519e145978e10 Former-commit-id: 3bdbb5167f6501d622ce5e07e38340614718f414 --- go.sum | 147 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 147 insertions(+) diff --git a/go.sum b/go.sum index b02061ac5..5f3fe4da6 100644 --- a/go.sum +++ b/go.sum @@ -4,6 +4,7 @@ cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSR cloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU= cloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY= cloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc= +cloud.google.com/go v0.46.3 h1:AVXDdKsrtX33oR9fbCMu/+c1o8Ofjq6Ku/MInaLVg5Y= cloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0= cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o= cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= @@ -11,45 +12,63 @@ cloud.google.com/go/firestore v1.1.0/go.mod h1:ulACoGHTpvq5r8rxGJ4ddJZBZqakUQqCl cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I= cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw= dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= +github.com/Azure/azure-sdk-for-go v40.3.0+incompatible h1:NthZg3psrLxvQLN6rVm07pZ9mv2wvGNaBNGQ3fnPvLE= github.com/Azure/azure-sdk-for-go v40.3.0+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc= github.com/Azure/go-autorest/autorest v0.9.0/go.mod h1:xyHB1BMZT0cuDHU7I0+g046+BFDTQ8rEZB0s4Yfa6bI= github.com/Azure/go-autorest/autorest v0.9.3/go.mod h1:GsRuLYvwzLjjjRoWEIyMUaYq8GNUx2nRB378IPt/1p0= +github.com/Azure/go-autorest/autorest v0.10.0 h1:mvdtztBqcL8se7MdrUweNieTNi4kfNG6GOJuurQJpuY= github.com/Azure/go-autorest/autorest v0.10.0/go.mod h1:/FALq9T/kS7b5J5qsQ+RSTUdAmGFqi0vUdVNNx8q630= github.com/Azure/go-autorest/autorest/adal v0.5.0/go.mod h1:8Z9fGy2MpX0PvDjB1pEgQTmVqjGhiHBW7RJJEciWzS0= github.com/Azure/go-autorest/autorest/adal v0.8.0/go.mod h1:Z6vX6WXXuyieHAXwMj0S6HY6e6wcHn37qQMBQlvY3lc= github.com/Azure/go-autorest/autorest/adal v0.8.1/go.mod h1:ZjhuQClTqx435SRJ2iMlOxPYt3d2C/T/7TiQCVZSn3Q= +github.com/Azure/go-autorest/autorest/adal v0.8.2 h1:O1X4oexUxnZCaEUGsvMnr8ZGj8HI37tNezwY4npRqA0= github.com/Azure/go-autorest/autorest/adal v0.8.2/go.mod h1:ZjhuQClTqx435SRJ2iMlOxPYt3d2C/T/7TiQCVZSn3Q= +github.com/Azure/go-autorest/autorest/azure/auth v0.4.2 h1:iM6UAvjR97ZIeR93qTcwpKNMpV+/FTWjwEbuPD495Tk= github.com/Azure/go-autorest/autorest/azure/auth v0.4.2/go.mod h1:90gmfKdlmKgfjUpnCEpOJzsUEjrWDSLwHIG73tSXddM= +github.com/Azure/go-autorest/autorest/azure/cli v0.3.1 h1:LXl088ZQlP0SBppGFsRZonW6hSvwgL5gRByMbvUbx8U= github.com/Azure/go-autorest/autorest/azure/cli v0.3.1/go.mod h1:ZG5p860J94/0kI9mNJVoIoLgXcirM2gF5i2kWloofxw= github.com/Azure/go-autorest/autorest/date v0.1.0/go.mod h1:plvfp3oPSKwf2DNjlBjWF/7vwR+cUD/ELuzDCXwHUVA= +github.com/Azure/go-autorest/autorest/date v0.2.0 h1:yW+Zlqf26583pE43KhfnhFcdmSWlm5Ew6bxipnr/tbM= github.com/Azure/go-autorest/autorest/date v0.2.0/go.mod h1:vcORJHLJEh643/Ioh9+vPmf1Ij9AEBM5FuBIXLmIy0g= github.com/Azure/go-autorest/autorest/mocks v0.1.0/go.mod h1:OTyCOPRA2IgIlWxVYxBee2F5Gr4kF2zd2J5cFRaIDN0= github.com/Azure/go-autorest/autorest/mocks v0.2.0/go.mod h1:OTyCOPRA2IgIlWxVYxBee2F5Gr4kF2zd2J5cFRaIDN0= +github.com/Azure/go-autorest/autorest/mocks v0.3.0 h1:qJumjCaCudz+OcqE9/XtEPfvtOjOmKaui4EOpFI6zZc= github.com/Azure/go-autorest/autorest/mocks v0.3.0/go.mod h1:a8FDP3DYzQ4RYfVAxAN3SVSiiO77gL2j2ronKKP0syM= +github.com/Azure/go-autorest/autorest/to v0.3.0 h1:zebkZaadz7+wIQYgC7GXaz3Wb28yKYfVkkBKwc38VF8= github.com/Azure/go-autorest/autorest/to v0.3.0/go.mod h1:MgwOyqaIuKdG4TL/2ywSsIWKAfJfgHDo8ObuUk3t5sA= +github.com/Azure/go-autorest/autorest/validation v0.2.0 h1:15vMO4y76dehZSq7pAaOLQxC6dZYsSrj2GQpflyM/L4= github.com/Azure/go-autorest/autorest/validation v0.2.0/go.mod h1:3EEqHnBxQGHXRYq3HT1WyXAvT7LLY3tl70hw6tQIbjI= +github.com/Azure/go-autorest/logger v0.1.0 h1:ruG4BSDXONFRrZZJ2GUXDiUyVpayPmb1GnWeHDdaNKY= github.com/Azure/go-autorest/logger v0.1.0/go.mod h1:oExouG+K6PryycPJfVSxi/koC6LSNgds39diKLz7Vrc= +github.com/Azure/go-autorest/tracing v0.5.0 h1:TRn4WjSnkcSy5AEG3pnbtFSwNtwzjr4VYyQflFE619k= github.com/Azure/go-autorest/tracing v0.5.0/go.mod h1:r/s2XiOKccPW3HrqB+W0TQzfbtp2fGCgRFtBroKn4Dk= github.com/BurntSushi/toml v0.3.1 h1:WXkYYl6Yr3qBf1K79EBnL4mak0OimBfB0XUf9Vl28OQ= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= github.com/DataDog/datadog-go v2.2.0+incompatible/go.mod h1:LButxg5PwREeZtORoXG3tL4fMGNddJ+vMq1mwgfaqoQ= +github.com/DataDog/datadog-go v3.2.0+incompatible h1:qSG2N4FghB1He/r2mFrWKCaL7dXCilEuNEeAn20fdD4= github.com/DataDog/datadog-go v3.2.0+incompatible/go.mod h1:LButxg5PwREeZtORoXG3tL4fMGNddJ+vMq1mwgfaqoQ= github.com/Microsoft/go-winio v0.4.3/go.mod h1:VhR8bwka0BXejwEJY73c50VrPtXAaKcyvVC4A4RozmA= +github.com/Microsoft/go-winio v0.4.13 h1:Hmi80lzZuI/CaYmlJp/b+FjZdRZhKu9c2mDVqKlLWVs= github.com/Microsoft/go-winio v0.4.13/go.mod h1:qXqCSQ3Xa7+6tgxaGTIe4Kpcdsi+P8jBhyzoq1bpyYA= github.com/NYTimes/gziphandler v0.0.0-20170623195520-56545f4a5d46/go.mod h1:3wb06e3pkSAbeQ52E9H9iFoQsEEwGN64994WTCIhntQ= github.com/NYTimes/gziphandler v1.0.1/go.mod h1:3wb06e3pkSAbeQ52E9H9iFoQsEEwGN64994WTCIhntQ= +github.com/NYTimes/gziphandler v1.1.1 h1:ZUDjpQae29j0ryrS0u/B8HZfJBtBQHjqw2rQ2cqUQ3I= github.com/NYTimes/gziphandler v1.1.1/go.mod h1:n/CVRwUEOgIxrgPvAQhUUr9oeUtvrhMomdKFjzJNB0c= github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= github.com/PuerkitoBio/purell v1.0.0/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= github.com/PuerkitoBio/urlesc v0.0.0-20160726150825-5bd2802263f2/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE= +github.com/StackExchange/wmi v0.0.0-20180116203802-5d049714c4a6 h1:fLjPD/aNc3UIOA6tDi6QXUemppXK3P9BI7mr2hd6gx8= github.com/StackExchange/wmi v0.0.0-20180116203802-5d049714c4a6/go.mod h1:3eOhrUMpNV+6aFIbp5/iudMxNCF27Vw2OZgy4xEx0Fg= github.com/Workiva/go-datastructures v1.0.50 h1:slDmfW6KCHcC7U+LP3DDBbm4fqTwZGn1beOFPfGaLvo= github.com/Workiva/go-datastructures v1.0.50/go.mod h1:Z+F2Rca0qCsVYDS8z7bAGm8f3UkzuWYS/oBZz5a7VVA= +github.com/abdullin/seq v0.0.0-20160510034733-d5467c17e7af h1:DBNMBMuMiWYu0b+8KMJuWmfCkcxl09JwdlqwDZZ6U14= github.com/abdullin/seq v0.0.0-20160510034733-d5467c17e7af/go.mod h1:5Jv4cbFiHJMsVxt52+i0Ha45fjshj6wxYr1r19tB9bw= github.com/afex/hystrix-go v0.0.0-20180502004556-fa1af6a1f4f5 h1:rFw4nCn9iMW+Vajsk51NtYIcwSTkXr+JGrMd36kTDJw= github.com/afex/hystrix-go v0.0.0-20180502004556-fa1af6a1f4f5/go.mod h1:SkGFH1ia65gfNATL8TAiHDNxPzPdmEL5uirI2Uyuz6c= +github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc h1:cAKDfWh5VpdgMhJosfJnn5/FoN2SRZ4p7fJNX58YPaU= github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= +github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf h1:qet1QNfXsQxTZqLG4oE62mJzwPIB8+Tee4RNCL9ulrY= github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= github.com/aliyun/alibaba-cloud-sdk-go v1.61.18/go.mod h1:v8ESoHo4SyHmuB4b1tJqDHxfTGEciD+yhvOU/5s1Rfk= github.com/apache/dubbo-getty v1.3.10 h1:ys5mwjPdxG/KwkPjS6EI0RzQtU6p6FCPoKpaFEzpAL0= @@ -58,32 +77,43 @@ github.com/apache/dubbo-go v1.5.1 h1:hYktTWnMJdzwY0NkvSqJfOERkwFApZ3mH/tQBLVGO34 github.com/apache/dubbo-go v1.5.1/go.mod h1:lxwgtF+27mSFQsSrBLaVbdQpwCp+pBN/mHP4w4/N2Qc= github.com/apache/dubbo-go-hessian2 v1.6.2 h1:i7F5GjVaUatLQz1x9vUmmSIFj49L8J6rVICdF6xw4qw= github.com/apache/dubbo-go-hessian2 v1.6.2/go.mod h1:7rEw9guWABQa6Aqb8HeZcsYPHsOS7XT1qtJvkmI6c5w= +github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e h1:QEF07wC0T1rKkctt1RINW/+RMTVmiwxETico2l3gxJA= github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o= github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8= github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY= github.com/armon/go-metrics v0.0.0-20190430140413-ec5e00d3c878/go.mod h1:3AMJUQhVx52RsWOnlkpikZr01T/yAVN2gn0861vByNg= +github.com/armon/go-metrics v0.3.0 h1:B7AQgHi8QSEi4uHu7Sbsga+IJDU+CENgjxoo81vDUqU= github.com/armon/go-metrics v0.3.0/go.mod h1:zXjbSimjXTd7vOpY8B0/2LpvNvDoXBuplAD+gJD3GYs= github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= +github.com/armon/go-radix v1.0.0 h1:F4z6KzEeeQIMeLFa97iZU6vupzoecKdU5TX24SNppXI= github.com/armon/go-radix v1.0.0/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= +github.com/aws/aws-sdk-go v1.25.41 h1:/hj7nZ0586wFqpwjNpzWiUTwtaMgxAZNZKHay80MdXw= github.com/aws/aws-sdk-go v1.25.41/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= +github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= +github.com/bgentry/speakeasy v0.1.0 h1:ByYyxL9InA1OWqxJqqp2A5pYHUrCiAL6K3J+LKSsQkY= github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= github.com/bketelsen/crypt v0.0.3-0.20200106085610-5cbc8cc4026c/go.mod h1:MKsuJmJgSg28kpZDP6UIiPt0e0Oz0kqKNGyRaWEPv84= +github.com/boltdb/bolt v1.3.1 h1:JQmyP4ZBrce+ZQu0dY660FMfatumYDLun9hBCUVIkF4= github.com/boltdb/bolt v1.3.1/go.mod h1:clJnj/oiGkjum5o1McbSZDSLxVThjynRyGBgiAx27Ps= github.com/buger/jsonparser v0.0.0-20181115193947-bf1c66bbce23/go.mod h1:bbYlZJ7hK1yFx9hf58LP0zeX7UjIGs20ufpu3evjr+s= github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= +github.com/circonus-labs/circonus-gometrics v2.3.1+incompatible h1:C29Ae4G5GtYyYMm1aztcyj/J5ckgJm2zwdDajFbx1NY= github.com/circonus-labs/circonus-gometrics v2.3.1+incompatible/go.mod h1:nmEj6Dob7S7YxXgwXpfOuvO54S+tGdZdw9fuRZt25Ag= +github.com/circonus-labs/circonusllhist v0.1.3 h1:TJH+oke8D16535+jHExHj4nQvzlZrj7ug5D7I/orNUA= github.com/circonus-labs/circonusllhist v0.1.3/go.mod h1:kMXHVDlOchFAehlya5ePtbp5jckzBHf4XRpQvBOLI+I= github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= github.com/cockroachdb/apd v1.1.0/go.mod h1:8Sl8LxpKi29FqWXR16WEFZRNSz3SoPzUzeMeY4+DwBQ= +github.com/coredns/coredns v1.1.2 h1:bAFHrSsBeTeRG5W3Nf2su3lUGw7Npw2UKeCJm/3A638= github.com/coredns/coredns v1.1.2/go.mod h1:zASH/MVDgR6XZTbxvOnsZfffS+31vg6Ackf/wo1+AM0= github.com/coreos/bbolt v1.3.2/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk= github.com/coreos/bbolt v1.3.3/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk= github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= github.com/coreos/etcd v3.3.13+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= github.com/coreos/go-etcd v2.0.0+incompatible/go.mod h1:Jez6KQU2B/sWsbdaef3ED8NzMklzPG4d5KIOhIy30Tk= +github.com/coreos/go-oidc v2.1.0+incompatible h1:sdJrfw8akMnCuUlaZU3tE/uYXFgfqom8DBE9so9EBsM= github.com/coreos/go-oidc v2.1.0+incompatible/go.mod h1:CgnwVTmzoESiwO9qyAFEMiHoZ1nMCKZlZ9V6mm3/LKc= github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= @@ -100,14 +130,20 @@ github.com/davecgh/go-spew v0.0.0-20151105211317-5215b55f46b2/go.mod h1:J7Y8YcW2 github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/denverdino/aliyungo v0.0.0-20170926055100-d3308649c661 h1:lrWnAyy/F72MbxIxFUzKmcMCdt9Oi8RzpAxzTNQHD7o= github.com/denverdino/aliyungo v0.0.0-20170926055100-d3308649c661/go.mod h1:dV8lFg6daOBZbT6/BDGIz6Y3WFGn8juu6G+CQ6LHtl0= +github.com/dgrijalva/jwt-go v3.2.0+incompatible h1:7qlOGliEKZXTDg6OTjfoBKDXWrumCAMpl/TFQ4/5kLM= github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no= github.com/digitalocean/godo v1.1.1/go.mod h1:h6faOIcZ8lWIwNQ+DN7b3CgX4Kwby5T+nbpNqkUIozU= +github.com/digitalocean/godo v1.10.0 h1:uW1/FcvZE/hoixnJcnlmIUvTVNdZCLjRLzmDtRi1xXY= github.com/digitalocean/godo v1.10.0/go.mod h1:h6faOIcZ8lWIwNQ+DN7b3CgX4Kwby5T+nbpNqkUIozU= +github.com/dimchansky/utfbom v1.1.0 h1:FcM3g+nofKgUteL8dm/UpdRXNC9KmADgTpLKsu0TRo4= github.com/dimchansky/utfbom v1.1.0/go.mod h1:rO41eb7gLfo8SF1jd9F8HplJm1Fewwi4mQvIirEdv+8= +github.com/dnaeon/go-vcr v1.0.1 h1:r8L/HqC0Hje5AXMu1ooW8oyQyOFv4GxqpL0nRP7SLLY= github.com/dnaeon/go-vcr v1.0.1/go.mod h1:aBB1+wY4s93YsC3HHjMBMrwTj2R9FHDzUr9KyGc8n1E= github.com/docker/go-connections v0.3.0/go.mod h1:Gbd7IOopHjR8Iph03tsViu4nIes5XhDvyHbTtUxmeec= +github.com/docker/go-connections v0.4.0 h1:El9xVISelRB7BuFusrZozjnkIM5YnzCViNKohAFqRJQ= github.com/docker/go-connections v0.4.0/go.mod h1:Gbd7IOopHjR8Iph03tsViu4nIes5XhDvyHbTtUxmeec= github.com/docker/spdystream v0.0.0-20160310174837-449fdfce4d96/go.mod h1:Qh8CwZgvJUkLughtfhJv5dyTYa91l1fOUCrgjqmcifM= github.com/dubbogo/go-zookeeper v1.0.1 h1:irLzvOsDOTNsN8Sv9tvYYxVu6DCQfLtziZQtUHmZgz8= @@ -117,19 +153,24 @@ github.com/dubbogo/gost v1.9.1 h1:0/PPFo13zPbjt4Ia0zYWMFi3C6rAe9X7O1J2Iv+BHNM= github.com/dubbogo/gost v1.9.1/go.mod h1:pPTjVyoJan3aPxBPNUX0ADkXjPibLo+/Ib0/fADXSG8= github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= github.com/elazarl/go-bindata-assetfs v0.0.0-20160803192304-e1a2a7ec64b0/go.mod h1:v+YaWX3bdea5J/mo8dSETolEo7R71Vk1u8bnjau5yw4= +github.com/elazarl/go-bindata-assetfs v1.0.0 h1:G/bYguwHIzWq9ZoyUQqrjTmJbbYn3j3CKKpKinvZLFk= github.com/elazarl/go-bindata-assetfs v1.0.0/go.mod h1:v+YaWX3bdea5J/mo8dSETolEo7R71Vk1u8bnjau5yw4= github.com/elazarl/goproxy v0.0.0-20170405201442-c4fc26588b6e/go.mod h1:/Zj4wYkgs4iZTTu3o/KG3Itv/qCCa8VVMlb3i9OVuzc= github.com/emicklei/go-restful v0.0.0-20170410110728-ff4f55a20633/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs= github.com/emicklei/go-restful/v3 v3.0.0/go.mod h1:6n3XBCmQQb25CM2LCACGz8ukIrRry+4bhvbpWn3mrbc= github.com/emirpasic/gods v1.12.0 h1:QAUIPSaCu4G+POclxeqb3F+WPpdKqFGlw36+yOzGlrg= github.com/emirpasic/gods v1.12.0/go.mod h1:YfzfFFoVP/catgzJb4IKIqXjX78Ha8FMSDh3ymbK86o= +github.com/envoyproxy/go-control-plane v0.8.0 h1:uE6Fp4fOcAJdc1wTQXLJ+SYistkbG1dNoi6Zs1+Ybvk= github.com/envoyproxy/go-control-plane v0.8.0/go.mod h1:GSSbY9P1neVhdY7G4wu+IK1rk/dqhiCC/4ExuWJZVuk= +github.com/envoyproxy/protoc-gen-validate v0.0.14 h1:YBW6/cKy9prEGRYLnaGa4IDhzxZhRCtKsax8srGKDnM= github.com/envoyproxy/protoc-gen-validate v0.0.14/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= github.com/evanphx/json-patch v4.2.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= github.com/fastly/go-utils v0.0.0-20180712184237-d95a45783239/go.mod h1:Gdwt2ce0yfBxPvZrHkprdPPTTS3N5rwmLE8T22KBXlw= github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= +github.com/fatih/color v1.9.0 h1:8xPHl4/q1VyqGIPif1F+1V3Y3lSmrq01EabUW3CoW5s= github.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL+zU= github.com/fatih/structs v1.1.0/go.mod h1:9NiDSp5zOcgEDl+j00MP/WkGVPOlPRLejGD8Ga6PJ7M= +github.com/frankban/quicktest v1.4.1 h1:Wv2VwvNn73pAdFIVUQRXYDFp31lXKbqblIXo/Q5GPSg= github.com/frankban/quicktest v1.4.1/go.mod h1:36zfPVQyHxymz4cH7wlDmVwDrJuljRB60qkgn7rorfQ= github.com/fsnotify/fsnotify v1.4.7 h1:IXs+QLmnXW2CcXuY+8Mzv/fWEsPGWxqefPtCP5CnV9I= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= @@ -147,6 +188,7 @@ github.com/go-ldap/ldap/v3 v3.1.3/go.mod h1:3rbOH3jRS2u6jg2rJnKAMLE/xQyCKIveG2Sa github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= github.com/go-logr/logr v0.1.0/go.mod h1:ixOQHD9gLJUVQQ2ZOR7zLEifBX6tGkNJF4QyIY7sIas= +github.com/go-ole/go-ole v1.2.1 h1:2lOsA72HgjxAuMlKpFiCbHTvu44PIVkZ5hqm3RSdI/E= github.com/go-ole/go-ole v1.2.1/go.mod h1:7FAglXiTm7HKlQRDeOQ6ZNUHidzCWXuZWq/1dTyBNF8= github.com/go-openapi/jsonpointer v0.0.0-20160704185906-46af16f9f7b1/go.mod h1:+35s3my2LFTysnkMfxsJBAMHj/DoqoB9knIWoYG/Vk0= github.com/go-openapi/jsonreference v0.0.0-20160704190145-13c6e3589ad9/go.mod h1:W3Z9FmVs9qj+KR4zFKmDPGiLdk1D9Rlm7cyMvf57TTg= @@ -156,14 +198,18 @@ github.com/go-redis/redis v6.15.5+incompatible/go.mod h1:NAIEuMOZ/fxfXJIrKDQDz8w github.com/go-resty/resty/v2 v2.1.0/go.mod h1:dZGr0i9PLlaaTD4H/hoZIDjQ+r6xq8mgbRzHZf7f2J8= github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= github.com/go-test/deep v1.0.2-0.20181118220953-042da051cf31/go.mod h1:wGDj63lr65AM2AQyKZd/NYHGb0R+1RLqB8NKt3aSFNA= +github.com/go-test/deep v1.0.2 h1:onZX1rnHT3Wv6cqNgYyFOOlgVKJrksuCMCRvJStbMYw= github.com/go-test/deep v1.0.2/go.mod h1:wGDj63lr65AM2AQyKZd/NYHGb0R+1RLqB8NKt3aSFNA= +github.com/gogo/googleapis v1.1.0 h1:kFkMAZBNAn4j7K0GiZr8cRYzejq68VbheufiV3YuyFI= github.com/gogo/googleapis v1.1.0/go.mod h1:gf4bu3Q80BeJ6H1S1vYPm8/ELATdvryBaNFGgqEef3s= github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4= +github.com/gogo/protobuf v1.2.2-0.20190723190241-65acae22fc9d h1:3PaI8p3seN09VjbTYC/QWlUZdZ1qS1zGjy7LH2Wt07I= github.com/gogo/protobuf v1.2.2-0.20190723190241-65acae22fc9d/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= github.com/goinggo/mapstructure v0.0.0-20140717182941-194205d9b4a9 h1:wqckanyE9qc/XnvnybC6SHOb8Nyd62QXAZOzA8twFig= github.com/goinggo/mapstructure v0.0.0-20140717182941-194205d9b4a9/go.mod h1:64ikIrMv84B+raz7akXOqbF7cK3/OQQ/6cClY10oy7A= github.com/goji/httpauth v0.0.0-20160601135302-2da839ab0f4d/go.mod h1:nnjvkQ9ptGaCkuDUx6wNykzzlUixGxvkme+H/lnzb+A= +github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b h1:VKtxabqXZkF25pY9ekfRL6a582T4P37/31XEstQ5p58= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= github.com/golang/groupcache v0.0.0-20160516000752-02826c3e7903/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20190129154638-5b532d6fd5ef/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= @@ -175,28 +221,37 @@ github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFU github.com/golang/protobuf v0.0.0-20161109072736-4bd1920723d7/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.2 h1:6nsPYzhq5kReh6QImI3k5qWzO4PEbvbIW2cwSfR/6xs= github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/snappy v0.0.1 h1:Qgr9rKW7uDUkrbSmQeiDsGa8SjGyCOGtuasMWwvp2P4= github.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= +github.com/google/btree v1.0.0 h1:0udJVsspx3VBr5FwtLhQQtuAsVc79tTq0ocGIPAU6qo= github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= +github.com/google/go-cmp v0.3.1 h1:Xye71clBPdm5HgqGwUkwhbynsUJZhDbS20FvLhQ2izg= github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= github.com/google/go-querystring v0.0.0-20170111101155-53e6ce116135/go.mod h1:odCYkC5MyYFN7vkCjXpyrEuKhc/BUO6wN/zVPAxq5ck= +github.com/google/go-querystring v1.0.0 h1:Xkwi/a1rcvNg1PPYe5vI8GbeBY/jrVuDX5ASuANWTrk= github.com/google/go-querystring v1.0.0/go.mod h1:odCYkC5MyYFN7vkCjXpyrEuKhc/BUO6wN/zVPAxq5ck= github.com/google/gofuzz v0.0.0-20161122191042-44d81051d367/go.mod h1:HP5RmnzzSNb993RKQDq4+1A4ia9nllfqcQFTQJedwGI= +github.com/google/gofuzz v1.0.0 h1:A8PeW59pxE9IoFRqBp37U+mSNaQoZ46F1f0f863XSXw= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= +github.com/google/tcpproxy v0.0.0-20180808230851-dfa16c61dad2 h1:AtvtonGEH/fZK0XPNNBdB6swgy7Iudfx88wzyIpwqJ8= github.com/google/tcpproxy v0.0.0-20180808230851-dfa16c61dad2/go.mod h1:DavVbd41y+b7ukKDmlnPR4nGYmkWXR6vHUkjQNiHPBs= github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= +github.com/googleapis/gax-go/v2 v2.0.5 h1:sjZBwGj9Jlw33ImPtvFviGYvseOtDM7hkSKB7+Tv3SM= github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= github.com/googleapis/gnostic v0.0.0-20170729233727-0c5108395e2d/go.mod h1:sJBsCZ4ayReDTBIg8b9dl28c5xFWyhBTVRp3pOg5EKY= +github.com/googleapis/gnostic v0.2.0 h1:l6N3VoaVzTncYYW+9yOz2LJJammFZGBO13sqgEhpy9g= github.com/googleapis/gnostic v0.2.0/go.mod h1:sJBsCZ4ayReDTBIg8b9dl28c5xFWyhBTVRp3pOg5EKY= +github.com/gophercloud/gophercloud v0.1.0 h1:P/nh25+rzXouhytV2pUHBb65fnds26Ghl8/391+sT5o= github.com/gophercloud/gophercloud v0.1.0/go.mod h1:vxM41WHh5uqHVBMZHzuwNOHh8XEoIEcSTewFxm1c5g8= github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1 h1:EGx4pi6eqNxGaHF6qqu48+N2wcFQ5qg5FXgOdqsJ5d8= github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= @@ -210,94 +265,131 @@ github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgf github.com/grpc-ecosystem/grpc-gateway v1.9.0/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= github.com/grpc-ecosystem/grpc-gateway v1.9.5/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= github.com/grpc-ecosystem/grpc-opentracing v0.0.0-20180507213350-8e809c8a8645/go.mod h1:6iZfnjpejD4L/4DwD7NryNaJyCQdzwWwH2MWhCA90Kw= +github.com/hashicorp/consul v1.8.0 h1:yRKMKZyPLqUxl37t4nFt5OuGmTXoFhTJrakhfnYKCYA= github.com/hashicorp/consul v1.8.0/go.mod h1:Gg9/UgAQ9rdY3CTvzQZ6g2jcIb7NlIfjI+0pvLk5D1A= github.com/hashicorp/consul/api v1.1.0/go.mod h1:VmuI/Lkw1nC05EYQWNKwWGbkg+FbDBtguAZLlVdkD9Q= +github.com/hashicorp/consul/api v1.5.0 h1:Yo2bneoGy68A7aNwmuETFnPhjyBEm7n3vzRacEVMjvI= github.com/hashicorp/consul/api v1.5.0/go.mod h1:LqwrLNW876eYSuUOo4ZLHBcdKc038txr/IMfbLPATa4= github.com/hashicorp/consul/sdk v0.1.1/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyNV1vwHyQBF0x8= +github.com/hashicorp/consul/sdk v0.5.0 h1:WC4594Wp/LkEeML/OdQKEC1yqBmEYkRp6i7X5u0zDAs= github.com/hashicorp/consul/sdk v0.5.0/go.mod h1:fY08Y9z5SvJqevyZNy6WWPXiG3KwBPAvlcdx16zZ0fM= +github.com/hashicorp/errwrap v1.0.0 h1:hLrqtEDnRye3+sgx6z4qVLNuviH3MR5aQ0ykNJa/UYA= github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= +github.com/hashicorp/go-bexpr v0.1.2 h1:ijMXI4qERbzxbCnkxmfUtwMyjrrk3y+Vt0MxojNCbBs= github.com/hashicorp/go-bexpr v0.1.2/go.mod h1:ANbpTX1oAql27TZkKVeW8p1w8NTdnyzPe/0qqPCKohU= github.com/hashicorp/go-checkpoint v0.0.0-20171009173528-1545e56e46de/go.mod h1:xIwEieBHERyEvaeKF/TcHh1Hu+lxPM+n2vT1+g9I4m4= github.com/hashicorp/go-cleanhttp v0.5.0/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= +github.com/hashicorp/go-cleanhttp v0.5.1 h1:dH3aiDG9Jvb5r5+bYHsikaOUIpcM0xvgMXVoDkXMzJM= github.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= +github.com/hashicorp/go-connlimit v0.2.0 h1:OZjcfNxH/hPh/bT2Iw5yOJcLzz+zuIWpsp3I1S4Pjw4= github.com/hashicorp/go-connlimit v0.2.0/go.mod h1:OUj9FGL1tPIhl/2RCfzYHrIiWj+VVPGNyVPnUX8AqS0= +github.com/hashicorp/go-discover v0.0.0-20200501174627-ad1e96bde088 h1:jBvElOilnIl6mm8S6gva/dfeTJCcMs9TGO6/2C6k52E= github.com/hashicorp/go-discover v0.0.0-20200501174627-ad1e96bde088/go.mod h1:vZu6Opqf49xX5lsFAu7iFNewkcVF1sn/wyapZh5ytlg= github.com/hashicorp/go-hclog v0.0.0-20180709165350-ff2cf002a8dd/go.mod h1:9bjs9uLqI8l75knNv3lV1kA55veR+WUPSiKIWcQHudI= github.com/hashicorp/go-hclog v0.8.0/go.mod h1:5CU+agLiy3J7N7QjHK5d05KxGsuXiQLrjA0H7acj2lQ= github.com/hashicorp/go-hclog v0.9.1/go.mod h1:5CU+agLiy3J7N7QjHK5d05KxGsuXiQLrjA0H7acj2lQ= github.com/hashicorp/go-hclog v0.9.2/go.mod h1:5CU+agLiy3J7N7QjHK5d05KxGsuXiQLrjA0H7acj2lQ= +github.com/hashicorp/go-hclog v0.12.0 h1:d4QkX8FRTYaKaCZBoXYY8zJX2BXjWxurN/GA2tkrmZM= github.com/hashicorp/go-hclog v0.12.0/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ= github.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= +github.com/hashicorp/go-immutable-radix v1.1.0 h1:vN9wG1D6KG6YHRTWr8512cxGOVgTMEfgEdSj/hr8MPc= github.com/hashicorp/go-immutable-radix v1.1.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= +github.com/hashicorp/go-memdb v1.0.3 h1:iiqzNk8jKB6/sLRj623Ui/Vi1zf21LOUpgzGjTge6a8= github.com/hashicorp/go-memdb v1.0.3/go.mod h1:LWQ8R70vPrS4OEY9k28D2z8/Zzyu34NVzeRibGAzHO0= github.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM= +github.com/hashicorp/go-msgpack v0.5.5 h1:i9R9JSrqIz0QVLz3sz+i3YJdT7TTSLcfLLzJi9aZTuI= github.com/hashicorp/go-msgpack v0.5.5/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM= github.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk= +github.com/hashicorp/go-multierror v1.1.0 h1:B9UzwGQJehnUY1yNrnwREHc3fGbC2xefo8g4TbElacI= github.com/hashicorp/go-multierror v1.1.0/go.mod h1:spPvp8C1qA32ftKqdAHm4hHTbPw+vmowP0z+KUhOZdA= github.com/hashicorp/go-plugin v1.0.1/go.mod h1:++UyYGoz3o5w9ZzAdZxtQKrWWP+iqPBn3cQptSMzBuY= github.com/hashicorp/go-raftchunking v0.6.1/go.mod h1:cGlg3JtDy7qy6c/3Bu660Mic1JF+7lWqIwCFSb08fX0= +github.com/hashicorp/go-raftchunking v0.6.3-0.20191002164813-7e9e8525653a h1:FmnBDwGwlTgugDGbVxwV8UavqSMACbGrUpfc98yFLR4= github.com/hashicorp/go-raftchunking v0.6.3-0.20191002164813-7e9e8525653a/go.mod h1:xbXnmKqX9/+RhPkJ4zrEx4738HacP72aaUPlT2RZ4sU= github.com/hashicorp/go-retryablehttp v0.5.3/go.mod h1:9B5zBasrRhHXnJnui7y6sL7es7NDiJgTc6Er0maI1Xs= github.com/hashicorp/go-retryablehttp v0.5.4/go.mod h1:9B5zBasrRhHXnJnui7y6sL7es7NDiJgTc6Er0maI1Xs= +github.com/hashicorp/go-retryablehttp v0.6.2 h1:bHM2aVXwBtBJWxHtkSrWuI4umABCUczs52eiUS9nSiw= github.com/hashicorp/go-retryablehttp v0.6.2/go.mod h1:gEx6HMUGxYYhJScX7W1Il64m6cc2C1mDaW3NQ9sY1FY= github.com/hashicorp/go-rootcerts v1.0.0/go.mod h1:K6zTfqpRlCUIjkwsN4Z+hiSfzSTQa6eBIzfwKfwNnHU= github.com/hashicorp/go-rootcerts v1.0.1/go.mod h1:pqUvnprVnM5bf7AOirdbb01K4ccR319Vf4pU3K5EGc8= +github.com/hashicorp/go-rootcerts v1.0.2 h1:jzhAVGtqPKbwpyCPELlgNWhE1znq+qwJtW5Oi2viEzc= github.com/hashicorp/go-rootcerts v1.0.2/go.mod h1:pqUvnprVnM5bf7AOirdbb01K4ccR319Vf4pU3K5EGc8= github.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU= +github.com/hashicorp/go-sockaddr v1.0.2 h1:ztczhD1jLxIRjVejw8gFomI1BQZOe2WoVOu0SyteCQc= github.com/hashicorp/go-sockaddr v1.0.2/go.mod h1:rB4wwRAUzs07qva3c5SdrY/NEtAUjGlgmH/UkBUC97A= +github.com/hashicorp/go-syslog v1.0.0 h1:KaodqZuhUoZereWVIYmpUgZysurB1kBLX2j0MwMrUAE= github.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4= github.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= github.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= github.com/hashicorp/go-uuid v1.0.2-0.20191001231223-f32f5fe8d6a8/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= +github.com/hashicorp/go-uuid v1.0.2 h1:cfejS+Tpcp13yd5nYHWDI6qVCny6wyX2Mt5SGur2IGE= github.com/hashicorp/go-uuid v1.0.2/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= github.com/hashicorp/go-version v1.1.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= +github.com/hashicorp/go-version v1.2.0 h1:3vNe/fWF5CBgRIguda1meWhsZHy3m8gCJ5wx+dIzX/E= github.com/hashicorp/go-version v1.2.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= github.com/hashicorp/go.net v0.0.1/go.mod h1:hjKkEWcCURg++eb33jQU7oqQcI9XDCnUzHA0oac0k90= github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= +github.com/hashicorp/golang-lru v0.5.3 h1:YPkqC67at8FYaadspW/6uE0COsBxS2656RLEr8Bppgk= github.com/hashicorp/golang-lru v0.5.3/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4= github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= +github.com/hashicorp/hil v0.0.0-20160711231837-1e86c6b523c5 h1:uk280DXEbQiCOZgCOI3elFSeNxf8YIZiNsbr2pQLYD0= github.com/hashicorp/hil v0.0.0-20160711231837-1e86c6b523c5/go.mod h1:KHvg/R2/dPtaePb16oW4qIyzkMxXOL38xjRN64adsts= github.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64= github.com/hashicorp/mdns v1.0.0/go.mod h1:tL+uN++7HEJ6SQLQ2/p+z2pH24WQKWjBPkE0mNTz8vQ= +github.com/hashicorp/mdns v1.0.1 h1:XFSOubp8KWB+Jd2PDyaX5xUd5bhSP/+pTDZVDMzZJM8= github.com/hashicorp/mdns v1.0.1/go.mod h1:4gW7WsVCke5TE7EPeYliwHlRUyBtfCwuFwuMg2DmyNY= github.com/hashicorp/memberlist v0.1.3/go.mod h1:ajVTdAv/9Im8oMAAj5G31PhhMCZJV2pPBoIllUwCN7I= github.com/hashicorp/memberlist v0.2.0/go.mod h1:MS2lj3INKhZjWNqd3N0m3J+Jxf3DAOnAH9VT3Sh9MUE= +github.com/hashicorp/memberlist v0.2.2 h1:5+RffWKwqJ71YPu9mWsF7ZOscZmwfasdA8kbdC7AO2g= github.com/hashicorp/memberlist v0.2.2/go.mod h1:MS2lj3INKhZjWNqd3N0m3J+Jxf3DAOnAH9VT3Sh9MUE= +github.com/hashicorp/net-rpc-msgpackrpc v0.0.0-20151116020338-a14192a58a69 h1:lc3c72qGlIMDqQpQH82Y4vaglRMMFdJbziYWriR4UcE= github.com/hashicorp/net-rpc-msgpackrpc v0.0.0-20151116020338-a14192a58a69/go.mod h1:/z+jUGRBlwVpUZfjute9jWaF6/HuhjuFQuL1YXzVD1Q= github.com/hashicorp/raft v1.1.1/go.mod h1:vPAJM8Asw6u8LxC3eJCUZmRP/E4QmUGE1R7g7k8sG/8= github.com/hashicorp/raft v1.1.2-0.20191002163536-9c6bd3e3eb17/go.mod h1:vPAJM8Asw6u8LxC3eJCUZmRP/E4QmUGE1R7g7k8sG/8= +github.com/hashicorp/raft v1.1.2 h1:oxEL5DDeurYxLd3UbcY/hccgSPhLLpiBZ1YxtWEq59c= github.com/hashicorp/raft v1.1.2/go.mod h1:vPAJM8Asw6u8LxC3eJCUZmRP/E4QmUGE1R7g7k8sG/8= +github.com/hashicorp/raft-boltdb v0.0.0-20171010151810-6e5ba93211ea h1:xykPFhrBAS2J0VBzVa5e80b5ZtYuNQtgXjN40qBZlD4= github.com/hashicorp/raft-boltdb v0.0.0-20171010151810-6e5ba93211ea/go.mod h1:pNv7Wc3ycL6F5oOWn+tPGo2gWD4a5X+yp/ntwdKLjRk= github.com/hashicorp/serf v0.8.2/go.mod h1:6hOLApaqBFA1NXqRQAsxw9QxuDEvNxSQRwA/JwenrHc= github.com/hashicorp/serf v0.9.0/go.mod h1:YL0HO+FifKOW2u1ke99DGVu1zhcpZzNwrLIqBC7vbYU= +github.com/hashicorp/serf v0.9.2 h1:yJoyfZXo4Pk2p/M/viW+YLibBFiIbKoP79gu7kDAFP0= github.com/hashicorp/serf v0.9.2/go.mod h1:UWDWwZeL5cuWDJdl0C6wrvrUwEqtQ4ZKBKKENpqIUyk= github.com/hashicorp/vault/api v1.0.4/go.mod h1:gDcqh3WGcR1cpF5AJz/B1UFheUEneMoIospckxBxk6Q= +github.com/hashicorp/vault/api v1.0.5-0.20191108163347-bdd38fca2cff h1:cl94LQIrs/mNbh3ny1R8lM1gtYcUBa7HnGtOCi35SlQ= github.com/hashicorp/vault/api v1.0.5-0.20191108163347-bdd38fca2cff/go.mod h1:Uf8LaHyrYsgVgHzO2tMZKhqRGlL3UJ6XaSwW2EA1Iqo= github.com/hashicorp/vault/sdk v0.1.13/go.mod h1:B+hVj7TpuQY1Y/GPbCpffmgd+tSEwvhkWnjtSYCaS2M= github.com/hashicorp/vault/sdk v0.1.14-0.20191108161836-82f2b5571044/go.mod h1:PcekaFGiPJyHnFy+NZhP6ll650zEw51Ag7g/YEa+EOU= +github.com/hashicorp/vault/sdk v0.1.14-0.20191112033314-390e96e22eb2 h1:mKYi4Fm2uSfe94Ji89CoAaP7SPEEkfdtaUlgRGGb2go= github.com/hashicorp/vault/sdk v0.1.14-0.20191112033314-390e96e22eb2/go.mod h1:PcekaFGiPJyHnFy+NZhP6ll650zEw51Ag7g/YEa+EOU= +github.com/hashicorp/vic v1.5.1-0.20190403131502-bbfe86ec9443 h1:O/pT5C1Q3mVXMyuqg7yuAWUg/jMZR1/0QTzTRdNR6Uw= github.com/hashicorp/vic v1.5.1-0.20190403131502-bbfe86ec9443/go.mod h1:bEpDU35nTu0ey1EXjwNwPjI9xErAsoOCmcMb9GKvyxo= github.com/hashicorp/yamux v0.0.0-20180604194846-3520598351bb/go.mod h1:+NfK9FKeTrX5uv1uIXGdwYDTeHna2qgaIlx54MXqjAM= +github.com/hashicorp/yamux v0.0.0-20181012175058-2f1d1f20f75d h1:kJCB4vdITiW1eC1vq2e6IsrXKrZit1bv/TDYFGMp4BQ= github.com/hashicorp/yamux v0.0.0-20181012175058-2f1d1f20f75d/go.mod h1:+NfK9FKeTrX5uv1uIXGdwYDTeHna2qgaIlx54MXqjAM= github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= github.com/imdario/mergo v0.3.5/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= +github.com/imdario/mergo v0.3.6 h1:xTNEAn+kxVO7dTZGu0CegyqKZmoWFI0rF8UxjlB2d28= github.com/imdario/mergo v0.3.6/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= github.com/jackc/fake v0.0.0-20150926172116-812a484cc733/go.mod h1:WrMFNQdiFJ80sQsxDoMokWK1W5TQtxBFNpzWTD84ibQ= github.com/jackc/pgx v3.3.0+incompatible/go.mod h1:0ZGrqGqkRlliWnWB4zKnWtjbSWbGkVEFm4TeybAXq+I= +github.com/jarcoal/httpmock v0.0.0-20180424175123-9c70cfe4a1da h1:FjHUJJ7oBW4G/9j1KzlHaXL09LyMVM9rupS39lncbXk= github.com/jarcoal/httpmock v0.0.0-20180424175123-9c70cfe4a1da/go.mod h1:ks+b9deReOc7jgqp+e7LuFiCBH6Rm5hL32cLcEAArb4= github.com/jehiah/go-strftime v0.0.0-20171201141054-1d33003b3869/go.mod h1:cJ6Cj7dQo+O6GJNiMx+Pa94qKj+TG8ONdKHgMNIyyag= github.com/jinzhu/copier v0.0.0-20190625015134-976e0346caa8 h1:mGIXW/lubQ4B+3bXTLxcTMTjUNDqoF6T/HUW9LbFx9s= github.com/jinzhu/copier v0.0.0-20190625015134-976e0346caa8/go.mod h1:yL958EeXv8Ylng6IfnvG4oflryUi3vgA3xPs9hmII1s= +github.com/jmespath/go-jmespath v0.0.0-20180206201540-c2b33e8439af h1:pmfjZENx5imkbgOkpRUYLnmbU7UEFbjtDA2hxJ1ichM= github.com/jmespath/go-jmespath v0.0.0-20180206201540-c2b33e8439af/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k= github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo= github.com/joyent/triton-go v0.0.0-20180628001255-830d2b111e62/go.mod h1:U+RSyWxWd04xTqnuOQxnai7XGS2PrPY2cfGoDKtMHjA= +github.com/joyent/triton-go v1.7.1-0.20200416154420-6801d15b779f h1:ENpDacvnr8faw5ugQmEF1QYk+f/Y9lXFvuYmRxykago= github.com/joyent/triton-go v1.7.1-0.20200416154420-6801d15b779f/go.mod h1:KDSfL7qe5ZfQqvlDMkVjCztbmcpp/c8M77vhQP8ZPvk= github.com/json-iterator/go v0.0.0-20180612202835-f2b4162afba3/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= github.com/json-iterator/go v1.1.5/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= +github.com/json-iterator/go v1.1.7 h1:KfgG9LzI+pYjr4xvmz/5H4FXjokeP+rlHLhv3iH62Fo= github.com/json-iterator/go v1.1.7/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= github.com/jtolds/gls v4.20.0+incompatible h1:xdiiI2gbIgH/gLH7ADydsJ1uDOEzR8yvV7C0MuV77Wo= @@ -307,6 +399,7 @@ github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvW github.com/kisielk/errcheck v1.2.0/go.mod h1:/BMXB+zMLi60iA8Vv6Ksmxu/1UDYcXs4uQLJ+jE2L00= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= +github.com/konsorten/go-windows-terminal-sequences v1.0.2 h1:DB17ag19krx9CFsz4o3enTrPXyIXCl+2iCXH/aMAp9s= github.com/konsorten/go-windows-terminal-sequences v1.0.2/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= @@ -319,6 +412,7 @@ github.com/lestrrat/go-envload v0.0.0-20180220120943-6ed08b54a570/go.mod h1:BLt8 github.com/lestrrat/go-file-rotatelogs v0.0.0-20180223000712-d3151e2a480f/go.mod h1:UGmTpUd3rjbtfIpwAPrcfmGf/Z1HS95TATB+m57TPB8= github.com/lestrrat/go-strftime v0.0.0-20180220042222-ba3bf9c1d042/go.mod h1:TPpsiPUEh0zFL1Snz4crhMlBe60PYxRHr5oFF3rRYg0= github.com/lib/pq v1.1.1/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= +github.com/linode/linodego v0.7.1 h1:4WZmMpSA2NRwlPZcc0+4Gyn7rr99Evk9bnr0B3gXRKE= github.com/linode/linodego v0.7.1/go.mod h1:ga11n3ivecUrPCHN0rANxKmfWBJVkOXfLMZinAbj2sY= github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= github.com/magiconair/properties v1.8.1 h1:ZC2Vc7/ZFkGmsVC9KvOjumD+G5lXy2RtTKyzRKO2BQ4= @@ -326,46 +420,59 @@ github.com/magiconair/properties v1.8.1/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czP github.com/mailru/easyjson v0.0.0-20160728113105-d5b7844b561a/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= github.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= +github.com/mattn/go-colorable v0.1.6 h1:6Su7aK7lXmJ/U79bYtBjLNaha4Fs1Rg9plHpcH+vvnE= github.com/mattn/go-colorable v0.1.6/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= github.com/mattn/go-isatty v0.0.10/go.mod h1:qgIWMr58cqv1PHHyhnkY9lrL7etaEgOFcMEpPG5Rm84= github.com/mattn/go-isatty v0.0.11/go.mod h1:PhnuNfih5lzO57/f3n+odYbM4JtupLOxQOAqxQCu2WE= +github.com/mattn/go-isatty v0.0.12 h1:wuysRhFDzyxgEmMf5xjvJ2M9dZoWAXNNr5LSBS7uHXY= github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= github.com/mattn/go-runewidth v0.0.3/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= +github.com/matttproud/golang_protobuf_extensions v1.0.1 h1:4hp9jkHxhMHkqkrB3Ix0jegS5sx/RkqARlsWZ6pIwiU= github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= +github.com/miekg/dns v1.1.26 h1:gPxPSwALAeHJSjarOs00QjVdV9QoBvc1D2ujQUr5BzU= github.com/miekg/dns v1.1.26/go.mod h1:bPDLeHnStXmXAq1m/Ch/hvfNHr14JKNPMBo3VZKjuso= github.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc= +github.com/mitchellh/cli v1.1.0 h1:tEElEatulEHDeedTxwckzyYMA5c86fbmNIUL1hBIiTg= github.com/mitchellh/cli v1.1.0/go.mod h1:xcISNoH86gajksDmfB23e/pu+B+GeFRMYmoHXxx3xhI= +github.com/mitchellh/copystructure v1.0.0 h1:Laisrj+bAB6b/yJwB5Bt3ITZhGJdqmxquMKeZ+mmkFQ= github.com/mitchellh/copystructure v1.0.0/go.mod h1:SNtv71yrdKgLRyLFxmLdkAbkKEFWgYaq1OVrnRcwhnw= github.com/mitchellh/go-homedir v1.0.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= +github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y= github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= github.com/mitchellh/go-testing-interface v0.0.0-20171004221916-a61a99592b77/go.mod h1:kRemZodwjscx+RGhAo8eIhFbs2+BFgRtFPeD/KE+zxI= github.com/mitchellh/go-testing-interface v1.0.0/go.mod h1:kRemZodwjscx+RGhAo8eIhFbs2+BFgRtFPeD/KE+zxI= +github.com/mitchellh/go-testing-interface v1.14.0 h1:/x0XQ6h+3U3nAyk1yx+bHPURrKa9sVVvYbuqZ7pIAtI= github.com/mitchellh/go-testing-interface v1.14.0/go.mod h1:gfgS7OtZj6MA4U1UrDRp04twqAjfvlZyCfX3sDjEym8= github.com/mitchellh/go-wordwrap v1.0.0/go.mod h1:ZXFpozHsX6DPmq2I0TCekCxypsnAUbP2oI0UX1GXzOo= github.com/mitchellh/gox v0.4.0/go.mod h1:Sd9lOJ0+aimLBi73mGofS1ycjY8lL3uZM3JPS42BGNg= github.com/mitchellh/hashstructure v0.0.0-20170609045927-2bca23e0e452/go.mod h1:QjSHrPWS+BGUVBYkbTZWEnOh3G1DutKwClXU/ABz6AQ= +github.com/mitchellh/hashstructure v1.0.0 h1:ZkRJX1CyOoTkar7p/mLS5TZU4nJ1Rn/F8u9dGS02Q3Y= github.com/mitchellh/hashstructure v1.0.0/go.mod h1:QjSHrPWS+BGUVBYkbTZWEnOh3G1DutKwClXU/ABz6AQ= github.com/mitchellh/iochan v1.0.0/go.mod h1:JwYml1nuB7xOzsp52dPpHFffvOCDupsG0QubkSMEySY= github.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= github.com/mitchellh/mapstructure v1.2.3 h1:f/MjBEBDLttYCGfRaKBbKSRVF5aV2O6fnBpzknuE3jU= github.com/mitchellh/mapstructure v1.2.3/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= +github.com/mitchellh/pointerstructure v1.0.0 h1:ATSdz4NWrmWPOF1CeCBU4sMCno2hgqdbSrRPFWQSVZI= github.com/mitchellh/pointerstructure v1.0.0/go.mod h1:k4XwG94++jLVsSiTxo7qdIfXA9pj9EAeo0QsNNJOLZ8= github.com/mitchellh/reflectwalk v1.0.0/go.mod h1:mSTlrgnPZtwu0c4WaC2kGObEpuNDbx0jmZXqmk4esnw= +github.com/mitchellh/reflectwalk v1.0.1 h1:FVzMWA5RllMAKIdUSC8mdWo3XtwoecrH79BY70sEEpE= github.com/mitchellh/reflectwalk v1.0.1/go.mod h1:mSTlrgnPZtwu0c4WaC2kGObEpuNDbx0jmZXqmk4esnw= github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/reflect2 v0.0.0-20180320133207-05fbef0ca5da/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= +github.com/modern-go/reflect2 v1.0.1 h1:9f412s+6RmYXLWZSEzVVgPGK7C2PphHj5RJrvfx9AWI= github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= github.com/munnerz/goautoneg v0.0.0-20120707110453-a547fc61f48d/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= github.com/mxk/go-flowrate v0.0.0-20140419014527-cca7078d478f/go.mod h1:ZdcZmHo+o7JKHSa8/e818NopupXU1YMK5fe1lsApnBw= github.com/nacos-group/nacos-sdk-go v1.0.0/go.mod h1:hlAPn3UdzlxIlSILAyOXKxjFSvDJ9oLzTJ9hLAK1KzA= +github.com/nicolai86/scaleway-sdk v1.10.2-0.20180628010248-798f60e20bb2 h1:BQ1HW7hr4IVovMwWg0E0PYcyW8CzqDcVmaew9cujU4s= github.com/nicolai86/scaleway-sdk v1.10.2-0.20180628010248-798f60e20bb2/go.mod h1:TLb2Sg7HQcgGdloNxkrmtgDNR9uVYF3lfdFIN4Ro6Sk= github.com/oklog/run v1.0.0/go.mod h1:dlhp/R75TPv97u0XWUtDeV/lRKWPKSdTuV0TZvrmrQA= github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U= @@ -379,14 +486,18 @@ github.com/onsi/gomega v1.5.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1Cpa github.com/onsi/gomega v1.7.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= github.com/opentracing/opentracing-go v1.1.0 h1:pWlfV3Bxv7k65HYwkikxat0+s3pV4bsqf19k25Ur8rU= github.com/opentracing/opentracing-go v1.1.0/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= +github.com/packethost/packngo v0.1.1-0.20180711074735-b9cb5096f54c h1:vwpFWvAO8DeIZfFeqASzZfsxuWPno9ncAebBEP0N3uE= github.com/packethost/packngo v0.1.1-0.20180711074735-b9cb5096f54c/go.mod h1:otzZQXgoO96RTzDB/Hycg0qZcXZsWJGJRSXbmEIJ+4M= github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= +github.com/pascaldekloe/goe v0.1.0 h1:cBOtyMzM9HTpWjXfbbunk26uA6nG3a8n06Wieeh0MwY= github.com/pascaldekloe/goe v0.1.0/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= +github.com/patrickmn/go-cache v2.1.0+incompatible h1:HRMgzkcYKYpi3C8ajMPV8OFXaaRUnok+kx1WdO15EQc= github.com/patrickmn/go-cache v2.1.0+incompatible/go.mod h1:3Qf8kWWT7OJRJbdiICTKqZju1ZixQ/KpMGzzAfe6+WQ= github.com/pelletier/go-toml v1.2.0 h1:T5zMGML61Wp+FlcbWjRDT7yAxhJNAiPPLOFECq181zc= github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= github.com/peterbourgon/diskv v2.0.1+incompatible/go.mod h1:uqqh8zWWbv1HBMNONnaR/tNboyR3/BZd58JJSHlUSCU= github.com/pierrec/lz4 v2.0.5+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY= +github.com/pierrec/lz4 v2.2.6+incompatible h1:6aCX4/YZ9v8q69hTyiR7dNLnTA3fgtKHVVW5BCd5Znw= github.com/pierrec/lz4 v2.2.6+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY= github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= @@ -396,27 +507,34 @@ github.com/pmezard/go-difflib v0.0.0-20151028094244-d8ed2627bdf0/go.mod h1:iKH77 github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI= +github.com/posener/complete v1.2.3 h1:NP0eAhjcjImqslEwo/1hq7gpajME0fTLTezBKDqfXqo= github.com/posener/complete v1.2.3/go.mod h1:WZIdtGGp+qx0sLrYKtIRAruyNpv6hFCicSgv7Sy7s/s= +github.com/pquerna/cachecontrol v0.0.0-20180517163645-1555304b9b35 h1:J9b7z+QKAmPf4YLrFg6oQUotqHQeUNWwkvo7jZp1GLU= github.com/pquerna/cachecontrol v0.0.0-20180517163645-1555304b9b35/go.mod h1:prYjPmNq4d1NPVmpShWobRqXY3q7Vp+80DqgxxUrUIA= github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= github.com/prometheus/client_golang v0.9.2/go.mod h1:OsXs2jCmiKlQ1lTBmv21f2mNfw4xf/QclQDMrYNZzcM= github.com/prometheus/client_golang v0.9.3/go.mod h1:/TN21ttK/J9q6uSwhBd54HahCDft0ttaMvbicHlPoso= github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo= +github.com/prometheus/client_golang v1.1.0 h1:BQ53HtBmfOitExawJ6LokA4x8ov/z0SYYb0+HxJfRI8= github.com/prometheus/client_golang v1.1.0/go.mod h1:I1FGZT9+L76gKKOs5djB6ezCbFQP1xR9D75/vuwEF3g= github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= +github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90 h1:S/YWwWx/RA8rT8tKFRuGUZhuA90OyIBpPCXkcbwU8DE= github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/common v0.0.0-20181113130724-41aa239b4cce/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= github.com/prometheus/common v0.0.0-20181126121408-4724e9255275/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= github.com/prometheus/common v0.4.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= +github.com/prometheus/common v0.6.0 h1:kRhiuYSXR3+uv2IbVbZhUxK5zVD/2pp3Gd2PpvPkpEo= github.com/prometheus/common v0.6.0/go.mod h1:eBmuwkDJBwy6iBfxCBob6t6dR6ENT/y+J+Zk0j9GMYc= github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= github.com/prometheus/procfs v0.0.0-20181204211112-1dc9a6cbc91a/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= github.com/prometheus/procfs v0.0.0-20190507164030-5867b95ac084/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= +github.com/prometheus/procfs v0.0.3 h1:CTwfnzjQ+8dS6MhHHu4YswVAD99sL2wjPqP+VkURmKE= github.com/prometheus/procfs v0.0.3/go.mod h1:4A/X28fw3Fc593LaREMrKMqOKvUAntwMDaekg4FpcdQ= github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU= github.com/rboyer/safeio v0.2.1/go.mod h1:Cq/cEPK+YXFn622lsQ0K4KsPZSPtaptHHEldsy7Fmig= +github.com/renier/xmlrpc v0.0.0-20170708154548-ce4a1a486c03 h1:Wdi9nwnhFNAlseAOekn6B5G/+GMtks9UKbvRU/CMM/o= github.com/renier/xmlrpc v0.0.0-20170708154548-ce4a1a486c03/go.mod h1:gRAiPF5C5Nd0eyyRdqIu9qTiFSoZzpTq727b5B8fkkU= github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg= github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= @@ -427,15 +545,19 @@ github.com/russross/blackfriday/v2 v2.0.1 h1:lPqVAte+HuHNfhJ/0LC98ESWRz8afy9tM/0 github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= github.com/ryanuber/columnize v2.1.0+incompatible/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= +github.com/ryanuber/go-glob v1.0.0 h1:iQh3xXAumdQ+4Ufa5b25cRpC5TYKlno6hsv6Cb3pkBk= github.com/ryanuber/go-glob v1.0.0/go.mod h1:807d1WSdnB0XRJzKNil9Om6lcp/3a0v4qIHxIXzX/Yc= github.com/satori/go.uuid v1.2.0/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0= github.com/satori/go.uuid v1.2.1-0.20181028125025-b2ce2384e17b h1:gQZ0qzfKHQIybLANtM3mBXNUtOfsCFXeTsnBqCsx1KM= github.com/satori/go.uuid v1.2.1-0.20181028125025-b2ce2384e17b/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0= github.com/sean-/conswriter v0.0.0-20180208195008-f5ae3917a627/go.mod h1:7zjs06qF79/FKAJpBvFx3P8Ww4UTIMAe+lpNXDHziac= github.com/sean-/pager v0.0.0-20180208200047-666be9bf53b5/go.mod h1:BeybITEsBEg6qbIiqJ6/Bqeq25bCLbL7YFmpaFfJDuM= +github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529 h1:nn5Wsu0esKSJiIVhscUtVbo7ada43DJhG55ua/hjS5I= github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc= github.com/shirou/gopsutil v0.0.0-20181107111621-48177ef5f880/go.mod h1:5b4v6he4MtMOwMlS0TUMTu2PcXUg8+E1lC7eC3UO/RA= +github.com/shirou/gopsutil v2.19.9+incompatible h1:IrPVlK4nfwW10DF7pW+7YJKws9NkgNzWozwwWv9FsgY= github.com/shirou/gopsutil v2.19.9+incompatible/go.mod h1:5b4v6he4MtMOwMlS0TUMTu2PcXUg8+E1lC7eC3UO/RA= +github.com/shirou/w32 v0.0.0-20160930032740-bb4de0191aa4 h1:udFKJ0aHUL60LboW/A+DfgoHVedieIzIXE8uylPue0U= github.com/shirou/w32 v0.0.0-20160930032740-bb4de0191aa4/go.mod h1:qsXQc7+bwAM3Q1u/4XEfrquwF8Lw7D7y5cD8CuHnfIc= github.com/shopspring/decimal v0.0.0-20180709203117-cd690d0c9e24/go.mod h1:M+9NzErvs504Cn4c5DxATwIqPbtswREoFCre64PpcG4= github.com/shurcooL/sanitized_anchor_name v1.0.0 h1:PdmoCO6wvbs+7yrJyMORt4/BmY5IYyJwS/kOiWx8mHo= @@ -443,12 +565,14 @@ github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeV github.com/sirupsen/logrus v1.0.6/go.mod h1:pMByvHTf9Beacp5x1UXfOR9xyW/9antXMhjMPG0dEzc= github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= github.com/sirupsen/logrus v1.4.1/go.mod h1:ni0Sbl8bgC9z8RoU9G6nDWqqs/fq4eDPysMBDgk/93Q= +github.com/sirupsen/logrus v1.4.2 h1:SPIRibHv4MatM3XXNO2BJeFLZwZ2LvZgfQ5+UNI2im4= github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d h1:zE9ykElWQ6/NYmHa3jpm/yHnI4xSofP+UP6SpjHcSeM= github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= github.com/smartystreets/goconvey v0.0.0-20190330032615-68dc04aab96a/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= github.com/smartystreets/goconvey v1.6.4 h1:fv0U8FUIMPNf1L9lnHLvLhgicrIVChEkdzIKYqbNC9s= github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= +github.com/softlayer/softlayer-go v0.0.0-20180806151055-260589d94c7d h1:bVQRCxQvfjNUeRqaY/uT0tFuvuFY0ulgnczuR684Xic= github.com/softlayer/softlayer-go v0.0.0-20180806151055-260589d94c7d/go.mod h1:Cw4GTlQccdRGSEf6KiMju767x0NEHE0YIVPJSaXjlsw= github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM= github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= @@ -482,17 +606,20 @@ github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5 github.com/subosito/gotenv v1.2.0 h1:Slr1R9HxAlEKefgq5jn9U+DnETlIUa6HfgEzj0g5d7s= github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw= github.com/tebeka/strftime v0.1.3/go.mod h1:7wJm3dZlpr4l/oVK0t1HYIc4rMzQ2XJlOMIUJUJH6XQ= +github.com/tencentcloud/tencentcloud-sdk-go v3.0.83+incompatible h1:8uRvJleFpqLsO77WaAh2UrasMOzd8MxXrNj20e7El+Q= github.com/tencentcloud/tencentcloud-sdk-go v3.0.83+incompatible/go.mod h1:0PfYow01SHPMhKY31xa+EFz2RStxIqj6JFAJS+IkCi4= github.com/tent/http-link-go v0.0.0-20130702225549-ac974c61c2f9/go.mod h1:RHkNRtSLfOK7qBTHaeSX1D6BNpI3qw7NTxsmNr4RvN8= github.com/tevid/gohamcrest v1.1.1 h1:ou+xSqlIw1xfGTg1uq1nif/htZ2S3EzRqLm2BP+tYU0= github.com/tevid/gohamcrest v1.1.1/go.mod h1:3UvtWlqm8j5JbwYZh80D/PVBt0mJ1eJiYgZMibh0H/k= github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= github.com/toolkits/concurrent v0.0.0-20150624120057-a4371d70e3e3/go.mod h1:QDlpd3qS71vYtakd2hmdpqhJ9nwv6mD6A30bQ1BPBFE= +github.com/tv42/httpunix v0.0.0-20150427012821-b75d8614f926 h1:G3dpKMzFDjgEh2q1Z7zUUtKa8ViPtH+ocF0bE0g00O8= github.com/tv42/httpunix v0.0.0-20150427012821-b75d8614f926/go.mod h1:9ESjWnEqriFuLhtthL60Sar/7RFoluCcXsuvEwTV5KM= github.com/ugorji/go v1.1.4/go.mod h1:uQMGLiO92mf5W77hV/PUCpI3pbzQx3CRekS0kk+RGrc= github.com/ugorji/go/codec v0.0.0-20181204163529-d75b2dcb6bc8/go.mod h1:VFNgLljTbGfSG7qAOspJ7OScBnGdDN/yBr0sguwnwf0= github.com/urfave/cli v1.22.4 h1:u7tSpNPPswAFymm8IehJhy4uJMlUuU/GmqSkvJ1InXA= github.com/urfave/cli v1.22.4/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= +github.com/vmware/govmomi v0.18.0 h1:f7QxSmP7meCtoAmiKZogvVbLInT+CZx6Px6K5rYsJZo= github.com/vmware/govmomi v0.18.0/go.mod h1:URlwyTFZX72RmxtxuaFL2Uj3fD1JTvZdx59bHWk6aFU= github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU= github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q= @@ -501,6 +628,7 @@ github.com/zouyx/agollo/v3 v3.4.4/go.mod h1:ag0XmE1r4iAgPd6PUnU9TJ0DMEjM1VKX1HUN go.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= go.etcd.io/bbolt v1.3.4/go.mod h1:G5EMThwa9y8QZGBClrRx5EY+Yw9kAhnjy3bSjsnlVTQ= go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= +go.opencensus.io v0.22.0 h1:C9hSCOW830chIVkdja34wa6Ky+IzWllkUinR+BtRZd4= go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= go.uber.org/atomic v1.6.0 h1:Ezj3JGmsOnG1MoRWQkPBsKLe9DwWD9QeXzTRzzldNVk= @@ -523,6 +651,7 @@ golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8U golang.org/x/crypto v0.0.0-20190611184440-5c40567a22f8/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190923035154-9ee001bba392/go.mod h1:/lpIB1dKB+9EgE3H3cr1v9wB50oz8l4C4h62xy7jSTY= golang.org/x/crypto v0.0.0-20191206172530-e9b2fee46413/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20200220183623-bac4c82f6975 h1:/Tl7pH94bvbAAHBdZJT947M/+gp0+CqQXDtMRC0fseo= golang.org/x/crypto v0.0.0-20200220183623-bac4c82f6975/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= @@ -564,15 +693,18 @@ golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLL golang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190923162816-aa69164e4478/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20191004110552-13f9640d40b9/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200226121028-0de0cce0169b h1:0mm1VjtFUOIlE1SbDlwjYaDxZVDP2S5ou6y0gSgXHu8= golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45 h1:SVwTIAaPC2U/AvvLNZ2a7OVsmBpC8L5BlwK1whH3hm0= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e h1:vcxGaoTs7kV8m5Np9uUNQin4BrLOthgV7252N8V+FwY= golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sys v0.0.0-20170830134202-bb24a47a89ea/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -616,6 +748,7 @@ golang.org/x/text v0.3.1-0.20181227161524-e6919f6577db/go.mod h1:bEr9sfX3Q8Zfm5f golang.org/x/text v0.3.2 h1:tW2bmiBqwgJj/UpqtC8EpXEZVYOwU0yG4iWbprSVAcs= golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.0.0-20190308202827-9d24e82272b4 h1:SvFZT6jyqRaOeXpc5h/JSfZenJ2O330aBsf7JfSUXmQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= @@ -646,11 +779,13 @@ google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEt google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M= google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= google.golang.org/api v0.9.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= +google.golang.org/api v0.13.0 h1:Q3Ui3V3/CVinFWFiW39Iw0kMuVrRzYX0wN6OPFp0lTA= google.golang.org/api v0.13.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/appengine v1.6.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= +google.golang.org/appengine v1.6.1 h1:QzqyMA1tlu6CgqCDUtU9V+ZKhLFT2dkJuANu5QaxI3I= google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= @@ -662,6 +797,7 @@ google.golang.org/genproto v0.0.0-20190530194941-fb225487d101/go.mod h1:z3L6/3dT google.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= google.golang.org/genproto v0.0.0-20190911173649-1774047e7e51/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8= +google.golang.org/genproto v0.0.0-20191108220845-16a3f7862a1a h1:Ob5/580gVHBJZgXnff1cZDbG+xLtMVE5mDRTe+nIsX4= google.golang.org/genproto v0.0.0-20191108220845-16a3f7862a1a/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= google.golang.org/grpc v1.14.0/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= @@ -670,8 +806,10 @@ google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiq google.golang.org/grpc v1.21.0/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= google.golang.org/grpc v1.22.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= +google.golang.org/grpc v1.23.0 h1:AzbTB6ux+okLTzP8Ru1Xs41C303zdcfEht7MQnYJt5A= google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= gopkg.in/airbrake/gobrake.v2 v2.0.9/go.mod h1:/h5ZAUhDkGaJfjzjKLSjv6zCL6O0LLBxU4K+aSYdM/U= +gopkg.in/alecthomas/kingpin.v2 v2.2.6 h1:jMFz6MfLP0/4fUyZle81rXUoxOBFi19VUFKVDOQfozc= gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= gopkg.in/asn1-ber.v1 v1.0.0-20181015200546-f715ec2f112d/go.mod h1:cuepJuh7vyXfUyUwEgHQXw849cJrilpS5NeIjOWESAw= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= @@ -681,12 +819,15 @@ gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8 gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= gopkg.in/gemnasium/logrus-airbrake-hook.v2 v2.1.2/go.mod h1:Xk6kEKp8OKb+X14hQBKWaSkCsqBpgog8nAV2xsGOxlo= +gopkg.in/inf.v0 v0.9.1 h1:73M5CoZyi3ZLMOyDlQh031Cx6N9NDJ2Vvfl76EDAgDc= gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= gopkg.in/ini.v1 v1.42.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= gopkg.in/ini.v1 v1.51.0 h1:AQvPpx3LzTDM0AjnIRlVFwFFGC+npRopjZxLJj6gdno= gopkg.in/ini.v1 v1.51.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= +gopkg.in/resty.v1 v1.12.0 h1:CuXP0Pjfw9rOuY6EP+UvtNvt5DSqHpIxILZKT/quCZI= gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo= gopkg.in/square/go-jose.v2 v2.3.1/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI= +gopkg.in/square/go-jose.v2 v2.4.1 h1:H0TmLt7/KmzlrDOpa1F+zr0Tk90PbJYBfsVUmRLrf9Y= gopkg.in/square/go-jose.v2 v2.4.1/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= gopkg.in/yaml.v2 v2.0.0-20170812160011-eb3733d160e7/go.mod h1:JAlM8MvJe8wmxCU4Bli9HhUf9+ttbYbLASfIpnQbh74= @@ -702,17 +843,23 @@ honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWh honnef.co/go/tools v0.0.1-2019.2.3 h1:3JgtbtFHMiCmsznwGVTUWbgGov+pVqnlf1dEJTNAXeM= honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= istio.io/gogo-genproto v0.0.0-20190124151557-6d926a6e6feb/go.mod h1:eIDJ6jNk/IeJz6ODSksHl5Aiczy5JUq6vFhJWI5OtiI= +k8s.io/api v0.16.9 h1:3vCx0WX9qcg1Hv4aQ/G1tiIKectGVuimvPVTJU4VOCA= k8s.io/api v0.16.9/go.mod h1:Y7dZNHs1Xy0mSwSlzL9QShi6qkljnN41yR8oWCRTDe8= +k8s.io/apimachinery v0.16.9 h1:ESUZ4hMBUKF2kn2HBFL5zM/wQv4j/0uRbR7AjgqGJ4o= k8s.io/apimachinery v0.16.9/go.mod h1:Xk2vD2TRRpuWYLQNM6lT9R7DSFZUYG03SarNkbGrnKE= +k8s.io/client-go v0.16.9 h1:6Eh4lMDxFtDzBkqid1AOL3bQ/pPYrulx8l23DXw4mRU= k8s.io/client-go v0.16.9/go.mod h1:ThjPlh7Kx+XoBFOCt775vx5J7atwY7F/zaFzTco5gL0= k8s.io/gengo v0.0.0-20190128074634-0689ccc1d7d6/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0= k8s.io/klog v0.0.0-20181102134211-b9b56d5dfc92/go.mod h1:Gq+BEi5rUBO/HRz0bTSXDUcqjScdoY3a9IHpCEIOOfk= k8s.io/klog v0.3.0/go.mod h1:Gq+BEi5rUBO/HRz0bTSXDUcqjScdoY3a9IHpCEIOOfk= +k8s.io/klog v1.0.0 h1:Pt+yjF5aB1xDSVbau4VsWe+dQNzA0qv1LlXdC2dF6Q8= k8s.io/klog v1.0.0/go.mod h1:4Bi6QPql/J/LkTDqv7R/cd3hPo4k2DG6Ptcz060Ez5I= k8s.io/kube-openapi v0.0.0-20190816220812-743ec37842bf/go.mod h1:1TqjTSzOxsLGIKfj0lK8EeCP7K1iUG65v09OM0/WG5E= k8s.io/kube-openapi v0.0.0-20191107075043-30be4d16710a/go.mod h1:1TqjTSzOxsLGIKfj0lK8EeCP7K1iUG65v09OM0/WG5E= +k8s.io/utils v0.0.0-20190801114015-581e00157fb1 h1:+ySTxfHnfzZb9ys375PXNlLhkJPLKgHajBU0N62BDvE= k8s.io/utils v0.0.0-20190801114015-581e00157fb1/go.mod h1:sZAwmy6armz5eXlNoLmJcl4F1QuKu7sr+mFQ0byX7Ew= launchpad.net/gocheck v0.0.0-20140225173054-000000000087/go.mod h1:hj7XX3B/0A+80Vse0e+BUHsHMTEhd0O4cpUHr/e/BUM= rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= sigs.k8s.io/structured-merge-diff v0.0.0-20190525122527-15d366b2352e/go.mod h1:wWxsB5ozmmv/SG7nM11ayaAW51xMvak/t1r0CSlcokI= +sigs.k8s.io/yaml v1.1.0 h1:4A07+ZFc2wgJwo8YNlQpr1rVlgUDlxXHhPJciaPY5gs= sigs.k8s.io/yaml v1.1.0/go.mod h1:UJmg0vDUVViEyp3mgSv9WPwZCDxu4rQW1olrI1uml+o= From 7129cc9f1fa910bc47d43d2ef952692f9c63b6e3 Mon Sep 17 00:00:00 2001 From: tiecheng Date: Thu, 12 Nov 2020 17:50:42 +0800 Subject: [PATCH 222/227] resolve Former-commit-id: 85eaa18d8c02b85b070f0ec7f11e6d197686f46d Former-commit-id: f18272afe82b9c47e61bc2c6583ec73b503bbc90 --- pkg/client/request.go | 7 ++++--- pkg/context/http/context.go | 6 ++---- pkg/filter/timeout/timeout.go | 4 ---- sample/dubbogo/server/app/user.go | 2 +- 4 files changed, 7 insertions(+), 12 deletions(-) diff --git a/pkg/client/request.go b/pkg/client/request.go index 49d5b93df..ad9a76b01 100644 --- a/pkg/client/request.go +++ b/pkg/client/request.go @@ -28,16 +28,17 @@ import ( // Request request for endpoint type Request struct { + Context context.Context + IngressRequest *http.Request API *router.API - Context context.Context } // NewReq create a request -func NewReq(request *http.Request, api *router.API, ctx context.Context) *Request { +func NewReq(ctx context.Context, request *http.Request, api *router.API) *Request { return &Request{ + Context: ctx, IngressRequest: request, API: api, - Context: ctx, } } diff --git a/pkg/context/http/context.go b/pkg/context/http/context.go index a74f77d99..464d1eb5a 100644 --- a/pkg/context/http/context.go +++ b/pkg/context/http/context.go @@ -23,7 +23,6 @@ import ( "net/http" "net/url" "strings" - "sync" ) import ( @@ -46,7 +45,6 @@ type HttpContext struct { Request *http.Request writermem responseWriter Writer ResponseWriter - Lock sync.Mutex } // Next logic for lookup filter @@ -80,7 +78,7 @@ func (hc *HttpContext) Write(b []byte) (int, error) { return hc.Writer.Write(b) } -// WriteHeaderNow +// WriteHeaderNow write header now func (hc *HttpContext) WriteHeaderNow() { hc.writermem.WriteHeaderNow() } @@ -116,7 +114,7 @@ func (hc *HttpContext) GetMethod() string { return hc.Request.Method } -// Api +// Api wait do delete func (hc *HttpContext) Api(api *model.Api) { // hc.api = api } diff --git a/pkg/filter/timeout/timeout.go b/pkg/filter/timeout/timeout.go index 6aa9226c8..7f0179c88 100644 --- a/pkg/filter/timeout/timeout.go +++ b/pkg/filter/timeout/timeout.go @@ -77,8 +77,6 @@ func (f *timeoutFilter) Do() selfcontext.FilterFunc { select { // timeout do. case <-ctx.Done(): - hc.Lock.Lock() - defer hc.Lock.Unlock() logger.Warnf("api %v request timeout", hc.GetAPI()) bt, _ := json.Marshal(errResponse{Code: TimeoutError, Message: http.ErrHandlerTimeout.Error()}) @@ -86,8 +84,6 @@ func (f *timeoutFilter) Do() selfcontext.FilterFunc { hc.AddHeader(constant.HeaderKeyContextType, constant.HeaderValueJsonUtf8) hc.Abort() case <-finishChan: - hc.Lock.Lock() - defer hc.Lock.Unlock() // finish call do something. } } diff --git a/sample/dubbogo/server/app/user.go b/sample/dubbogo/server/app/user.go index 58cb62fcd..e8083542a 100644 --- a/sample/dubbogo/server/app/user.go +++ b/sample/dubbogo/server/app/user.go @@ -109,7 +109,7 @@ func (u *UserProvider) GetUserByName(ctx context.Context, name string) (*User, e return nil, nil } -// GetUserByName query by name, will timeout for proxy. +// GetUserTimeout query by name, will timeout for proxy. func (u *UserProvider) GetUserTimeout(ctx context.Context, name string) (*User, error) { println("Req GetUserByName name:%#v", name) // sleep 10s, proxy config less than 10s. From 2eb8068523c700ba6385bbe3f32133321edad66f Mon Sep 17 00:00:00 2001 From: tiecheng Date: Thu, 12 Nov 2020 19:13:02 +0800 Subject: [PATCH 223/227] resolve Former-commit-id: 97dae50574fd4f77b74cbe42be8f25c4e2855239 Former-commit-id: 224c13d24b1ea21a5929de8c17082687e8d458fa --- pkg/filter/recovery/recovery.go | 11 ++++++----- pkg/filter/remote/call.go | 32 ++++++++++++++++++++++++-------- pkg/filter/timeout/timeout.go | 12 ++++++------ 3 files changed, 36 insertions(+), 19 deletions(-) diff --git a/pkg/filter/recovery/recovery.go b/pkg/filter/recovery/recovery.go index 43b372056..e46e64f13 100644 --- a/pkg/filter/recovery/recovery.go +++ b/pkg/filter/recovery/recovery.go @@ -28,16 +28,17 @@ func init() { extension.SetFilterFunc(constant.RecoveryFilter, NewRecoveryFilter().Do()) } -type recoveryFilter struct { +// RecoveryFilter is a filter for recover. +type RecoveryFilter struct { } // NewRecoveryFilter create timeout filter. -func NewRecoveryFilter() *recoveryFilter { - return &recoveryFilter{} +func NewRecoveryFilter() *RecoveryFilter { + return &RecoveryFilter{} } -// Recovery recovery the panic, print log. -func (f *recoveryFilter) Do() context.FilterFunc { +// Recovery execute RecoveryFilter filter logic, if recover happen, print log or do other things. +func (f *RecoveryFilter) Do() context.FilterFunc { return func(c context.Context) { defer func() { if err := recover(); err != nil { diff --git a/pkg/filter/remote/call.go b/pkg/filter/remote/call.go index eb1945cc8..5cb5daf27 100644 --- a/pkg/filter/remote/call.go +++ b/pkg/filter/remote/call.go @@ -37,26 +37,42 @@ import ( "github.com/dubbogo/dubbo-go-proxy/pkg/common/constant" "github.com/dubbogo/dubbo-go-proxy/pkg/common/extension" "github.com/dubbogo/dubbo-go-proxy/pkg/config" - "github.com/dubbogo/dubbo-go-proxy/pkg/context" + selfcontext "github.com/dubbogo/dubbo-go-proxy/pkg/context" contexthttp "github.com/dubbogo/dubbo-go-proxy/pkg/context/http" "github.com/dubbogo/dubbo-go-proxy/pkg/logger" ) func init() { - extension.SetFilterFunc(constant.RemoteCallFilter, Call()) + extension.SetFilterFunc(constant.RemoteCallFilter, NewClientFilter(false).Do()) } -// Call remote call context.FilterFunc. +// ClientFilter is a filter for recover. +type ClientFilter struct { + mock bool +} + +// NewClientFilter create timeout filter. +func NewClientFilter(mock bool) *ClientFilter { + return &ClientFilter{ + mock: mock, + } +} + +// Do execute ClientFilter filter logic // support: 1 http 2 dubbo 2 http 2 http -func Call() context.FilterFunc { - return func(c context.Context) { - doRemoteCall(c.(*contexthttp.HttpContext)) +func (f *ClientFilter) Do() selfcontext.FilterFunc { + return func(c selfcontext.Context) { + f.doRemoteCall(c.(*contexthttp.HttpContext)) } } -func doRemoteCall(c *contexthttp.HttpContext) { +func (f *ClientFilter) doRemoteCall(c *contexthttp.HttpContext) { api := c.GetAPI() + if f.mock { + return + } + typ := api.Method.IntegrationRequest.RequestType cli, err := matchClient(typ) @@ -66,7 +82,7 @@ func doRemoteCall(c *contexthttp.HttpContext) { return } - resp, err := cli.Call(client.NewReq(c.Request, api, c.Ctx)) + resp, err := cli.Call(client.NewReq(c.Ctx, c.Request, api)) if err != nil { logger.Errorf("[dubboproxy go] client do err:%v!", err) diff --git a/pkg/filter/timeout/timeout.go b/pkg/filter/timeout/timeout.go index 7f0179c88..d36a254f6 100644 --- a/pkg/filter/timeout/timeout.go +++ b/pkg/filter/timeout/timeout.go @@ -41,24 +41,24 @@ func init() { extension.SetFilterFunc(constant.TimeoutFilter, NewTimeoutFilter(0).Do()) } -// timeoutFilter is a filter for control request time out. -type timeoutFilter struct { +// TimeoutFilter is a filter for control request time out. +type TimeoutFilter struct { // global timeout waitTime time.Duration } // NewTimeoutFilter create timeout filter. -func NewTimeoutFilter(t time.Duration) *timeoutFilter { +func NewTimeoutFilter(t time.Duration) *TimeoutFilter { if t <= 0 { t = constant.DefaultTimeout } - return &timeoutFilter{ + return &TimeoutFilter{ waitTime: t, } } -// Do timeoutFilter execute filter logic. -func (f *timeoutFilter) Do() selfcontext.FilterFunc { +// Do execute TimeoutFilter filter logic. +func (f *TimeoutFilter) Do() selfcontext.FilterFunc { return func(c selfcontext.Context) { hc := c.(*contexthttp.HttpContext) From d9a1c98db62f392659858ba2b0865321b2e62ef1 Mon Sep 17 00:00:00 2001 From: tiecheng Date: Fri, 13 Nov 2020 09:44:42 +0800 Subject: [PATCH 224/227] resolve suggest & CI Former-commit-id: 243d9ddb3ff77040c9f85a0849eceb7373320586 Former-commit-id: 236583d58b303072c1f4bdc1493dfc749883bf11 --- go.sum | 3 --- pkg/context/base_context.go | 10 ---------- pkg/filter/recovery/recovery.go | 17 ++++++++-------- pkg/filter/recovery/recovery_test.go | 2 +- pkg/filter/remote/call.go | 19 +++++++++--------- pkg/filter/timeout/timeout.go | 29 ++++++++++++++++++---------- pkg/filter/timeout/timeout_test.go | 5 ++--- 7 files changed, 41 insertions(+), 44 deletions(-) diff --git a/go.sum b/go.sum index 5f3fe4da6..51cd48924 100644 --- a/go.sum +++ b/go.sum @@ -66,9 +66,7 @@ github.com/abdullin/seq v0.0.0-20160510034733-d5467c17e7af h1:DBNMBMuMiWYu0b+8KM github.com/abdullin/seq v0.0.0-20160510034733-d5467c17e7af/go.mod h1:5Jv4cbFiHJMsVxt52+i0Ha45fjshj6wxYr1r19tB9bw= github.com/afex/hystrix-go v0.0.0-20180502004556-fa1af6a1f4f5 h1:rFw4nCn9iMW+Vajsk51NtYIcwSTkXr+JGrMd36kTDJw= github.com/afex/hystrix-go v0.0.0-20180502004556-fa1af6a1f4f5/go.mod h1:SkGFH1ia65gfNATL8TAiHDNxPzPdmEL5uirI2Uyuz6c= -github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc h1:cAKDfWh5VpdgMhJosfJnn5/FoN2SRZ4p7fJNX58YPaU= github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= -github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf h1:qet1QNfXsQxTZqLG4oE62mJzwPIB8+Tee4RNCL9ulrY= github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= github.com/aliyun/alibaba-cloud-sdk-go v1.61.18/go.mod h1:v8ESoHo4SyHmuB4b1tJqDHxfTGEciD+yhvOU/5s1Rfk= github.com/apache/dubbo-getty v1.3.10 h1:ys5mwjPdxG/KwkPjS6EI0RzQtU6p6FCPoKpaFEzpAL0= @@ -809,7 +807,6 @@ google.golang.org/grpc v1.22.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyac google.golang.org/grpc v1.23.0 h1:AzbTB6ux+okLTzP8Ru1Xs41C303zdcfEht7MQnYJt5A= google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= gopkg.in/airbrake/gobrake.v2 v2.0.9/go.mod h1:/h5ZAUhDkGaJfjzjKLSjv6zCL6O0LLBxU4K+aSYdM/U= -gopkg.in/alecthomas/kingpin.v2 v2.2.6 h1:jMFz6MfLP0/4fUyZle81rXUoxOBFi19VUFKVDOQfozc= gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= gopkg.in/asn1-ber.v1 v1.0.0-20181015200546-f715ec2f112d/go.mod h1:cuepJuh7vyXfUyUwEgHQXw849cJrilpS5NeIjOWESAw= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= diff --git a/pkg/context/base_context.go b/pkg/context/base_context.go index 0072daa54..eb1cf0f63 100644 --- a/pkg/context/base_context.go +++ b/pkg/context/base_context.go @@ -19,7 +19,6 @@ package context import ( "context" - "github.com/dubbogo/dubbo-go-proxy/pkg/common/constant" "math" "time" ) @@ -72,12 +71,3 @@ func (c *BaseContext) AppendFilterFunc(ff ...FilterFunc) { c.Filters = append(c.Filters, v) } } - -// GetTimeout request timeout. -func (c *BaseContext) GetTimeout(t time.Duration) time.Duration { - if t <= 0 { - return constant.DefaultTimeout - } - - return t -} diff --git a/pkg/filter/recovery/recovery.go b/pkg/filter/recovery/recovery.go index e46e64f13..3203bfa6a 100644 --- a/pkg/filter/recovery/recovery.go +++ b/pkg/filter/recovery/recovery.go @@ -21,24 +21,25 @@ import ( "github.com/dubbogo/dubbo-go-proxy/pkg/common/constant" "github.com/dubbogo/dubbo-go-proxy/pkg/common/extension" "github.com/dubbogo/dubbo-go-proxy/pkg/context" + "github.com/dubbogo/dubbo-go-proxy/pkg/filter" "github.com/dubbogo/dubbo-go-proxy/pkg/logger" ) func init() { - extension.SetFilterFunc(constant.RecoveryFilter, NewRecoveryFilter().Do()) + extension.SetFilterFunc(constant.RecoveryFilter, New().Do()) } -// RecoveryFilter is a filter for recover. -type RecoveryFilter struct { +// recoveryFilter is a filter for recover. +type recoveryFilter struct { } -// NewRecoveryFilter create timeout filter. -func NewRecoveryFilter() *RecoveryFilter { - return &RecoveryFilter{} +// New create timeout filter. +func New() filter.Filter { + return &recoveryFilter{} } -// Recovery execute RecoveryFilter filter logic, if recover happen, print log or do other things. -func (f *RecoveryFilter) Do() context.FilterFunc { +// Recovery execute recoveryFilter filter logic, if recover happen, print log or do other things. +func (f *recoveryFilter) Do() context.FilterFunc { return func(c context.Context) { defer func() { if err := recover(); err != nil { diff --git a/pkg/filter/recovery/recovery_test.go b/pkg/filter/recovery/recovery_test.go index d74a9ca96..f799c5722 100644 --- a/pkg/filter/recovery/recovery_test.go +++ b/pkg/filter/recovery/recovery_test.go @@ -55,7 +55,7 @@ func MockHTTPContext(fc ...selfcontext.FilterFunc) *selfhttp.HttpContext { result.ResetWritermen(&w) result.Reset() - result.Filters = append(result.Filters, NewRecoveryFilter().Do()) + result.Filters = append(result.Filters, New().Do()) for i := range fc { result.Filters = append(result.Filters, fc[i]) } diff --git a/pkg/filter/remote/call.go b/pkg/filter/remote/call.go index 5cb5daf27..5d2db1c8a 100644 --- a/pkg/filter/remote/call.go +++ b/pkg/filter/remote/call.go @@ -39,34 +39,35 @@ import ( "github.com/dubbogo/dubbo-go-proxy/pkg/config" selfcontext "github.com/dubbogo/dubbo-go-proxy/pkg/context" contexthttp "github.com/dubbogo/dubbo-go-proxy/pkg/context/http" + "github.com/dubbogo/dubbo-go-proxy/pkg/filter" "github.com/dubbogo/dubbo-go-proxy/pkg/logger" ) func init() { - extension.SetFilterFunc(constant.RemoteCallFilter, NewClientFilter(false).Do()) + extension.SetFilterFunc(constant.RemoteCallFilter, New(false).Do()) } -// ClientFilter is a filter for recover. -type ClientFilter struct { +// clientFilter is a filter for recover. +type clientFilter struct { mock bool } -// NewClientFilter create timeout filter. -func NewClientFilter(mock bool) *ClientFilter { - return &ClientFilter{ +// New create timeout filter. +func New(mock bool) filter.Filter { + return &clientFilter{ mock: mock, } } -// Do execute ClientFilter filter logic +// Do execute clientFilter filter logic // support: 1 http 2 dubbo 2 http 2 http -func (f *ClientFilter) Do() selfcontext.FilterFunc { +func (f *clientFilter) Do() selfcontext.FilterFunc { return func(c selfcontext.Context) { f.doRemoteCall(c.(*contexthttp.HttpContext)) } } -func (f *ClientFilter) doRemoteCall(c *contexthttp.HttpContext) { +func (f *clientFilter) doRemoteCall(c *contexthttp.HttpContext) { api := c.GetAPI() if f.mock { diff --git a/pkg/filter/timeout/timeout.go b/pkg/filter/timeout/timeout.go index d36a254f6..3f12e6126 100644 --- a/pkg/filter/timeout/timeout.go +++ b/pkg/filter/timeout/timeout.go @@ -20,7 +20,6 @@ package timeout import ( "context" "encoding/json" - "github.com/dubbogo/dubbo-go-proxy/pkg/logger" "net/http" "time" ) @@ -30,6 +29,8 @@ import ( "github.com/dubbogo/dubbo-go-proxy/pkg/common/extension" selfcontext "github.com/dubbogo/dubbo-go-proxy/pkg/context" contexthttp "github.com/dubbogo/dubbo-go-proxy/pkg/context/http" + "github.com/dubbogo/dubbo-go-proxy/pkg/filter" + "github.com/dubbogo/dubbo-go-proxy/pkg/logger" ) const ( @@ -38,31 +39,31 @@ const ( ) func init() { - extension.SetFilterFunc(constant.TimeoutFilter, NewTimeoutFilter(0).Do()) + extension.SetFilterFunc(constant.TimeoutFilter, New(0).Do()) } -// TimeoutFilter is a filter for control request time out. -type TimeoutFilter struct { +// timeoutFilter is a filter for control request time out. +type timeoutFilter struct { // global timeout waitTime time.Duration } -// NewTimeoutFilter create timeout filter. -func NewTimeoutFilter(t time.Duration) *TimeoutFilter { +// New create timeout filter. +func New(t time.Duration) filter.Filter { if t <= 0 { t = constant.DefaultTimeout } - return &TimeoutFilter{ + return &timeoutFilter{ waitTime: t, } } -// Do execute TimeoutFilter filter logic. -func (f *TimeoutFilter) Do() selfcontext.FilterFunc { +// Do execute timeoutFilter filter logic. +func (f *timeoutFilter) Do() selfcontext.FilterFunc { return func(c selfcontext.Context) { hc := c.(*contexthttp.HttpContext) - ctx, cancel := context.WithTimeout(hc.Ctx, hc.GetTimeout(hc.Timeout)) + ctx, cancel := context.WithTimeout(hc.Ctx, f.getTimeout(hc.Timeout)) defer cancel() // Channel capacity must be greater than 0. // Otherwise, if the parent coroutine quit due to timeout, @@ -89,6 +90,14 @@ func (f *TimeoutFilter) Do() selfcontext.FilterFunc { } } +func (f *timeoutFilter) getTimeout(t time.Duration) time.Duration { + if t <= 0 { + return f.waitTime + } + + return t +} + type errResponse struct { Code string `json:"code"` Message string `json:"message"` diff --git a/pkg/filter/timeout/timeout_test.go b/pkg/filter/timeout/timeout_test.go index 2e2ae2f87..690ad2c82 100644 --- a/pkg/filter/timeout/timeout_test.go +++ b/pkg/filter/timeout/timeout_test.go @@ -32,7 +32,7 @@ import ( ) func TestPanic(t *testing.T) { - c := MockHTTPContext(testPanicFilter) + c := MockHTTPContext(New(0).Do(), recovery.New().Do(), testPanicFilter) c.Next() // print // 500 @@ -45,7 +45,7 @@ var testPanicFilter = func(c pkgcontext.Context) { } func TestTimeout(t *testing.T) { - c := MockHTTPContext(testTimeoutFilter) + c := MockHTTPContext(New(0).Do(), testTimeoutFilter) c.Next() // print // 503 @@ -78,7 +78,6 @@ func MockHTTPContext(fc ...pkgcontext.FilterFunc) *contexthttp.HttpContext { result.ResetWritermen(&w) result.Reset() - result.Filters = append(result.Filters, NewTimeoutFilter().Do(), recovery.NewRecoveryFilter().Do()) for i := range fc { result.Filters = append(result.Filters, fc[i]) } From e88186c537fa2298b4fe876dd980d8bbb3e4c84b Mon Sep 17 00:00:00 2001 From: tiecheng Date: Fri, 13 Nov 2020 09:47:28 +0800 Subject: [PATCH 225/227] package add Former-commit-id: 81a8d0399bc4d9e32a535bee9f7aa2d1b0792762 Former-commit-id: 63ece761d129a31f51416fb87841d125f043316f --- go.mod | 3 +++ 1 file changed, 3 insertions(+) diff --git a/go.mod b/go.mod index c4a449479..2b0ec51ac 100644 --- a/go.mod +++ b/go.mod @@ -4,9 +4,12 @@ go 1.14 require ( github.com/apache/dubbo-go v1.5.1 + github.com/apache/dubbo-go-hessian2 v1.6.2 + github.com/dubbogo/go-zookeeper v1.0.1 github.com/emirpasic/gods v1.12.0 github.com/ghodss/yaml v1.0.1-0.20190212211648-25d852aebe32 github.com/goinggo/mapstructure v0.0.0-20140717182941-194205d9b4a9 + github.com/hashicorp/consul/api v1.5.0 github.com/pkg/errors v0.9.1 github.com/stretchr/testify v1.5.1 github.com/urfave/cli v1.22.4 From fd25ee358f069cbc6dfbfacd20bb5845931489d5 Mon Sep 17 00:00:00 2001 From: tiecheng Date: Fri, 13 Nov 2020 12:23:38 +0800 Subject: [PATCH 226/227] test change Former-commit-id: e32b5098f1e1a146d2dcac26ad1ecf2322839a41 Former-commit-id: a2a83d5948faaf47f715f9c964a74947dd4d7d70 --- pkg/client/dubbo/dubbo_test.go | 7 ++++--- pkg/client/dubbo/mapper_test.go | 9 +++++---- 2 files changed, 9 insertions(+), 7 deletions(-) diff --git a/pkg/client/dubbo/dubbo_test.go b/pkg/client/dubbo/dubbo_test.go index 33985309f..b51fdadc5 100644 --- a/pkg/client/dubbo/dubbo_test.go +++ b/pkg/client/dubbo/dubbo_test.go @@ -19,6 +19,7 @@ package dubbo import ( "bytes" + "context" "net/http" "regexp" "testing" @@ -102,7 +103,7 @@ func TestMappingParams(t *testing.T) { MapTo: "1", }, } - req := client.NewReq(r, api) + req := client.NewReq(context.TODO(), r, api) _, params, err := dClient.MappingParams(req) assert.Nil(t, err) assert.Equal(t, params[0], "12345") @@ -125,7 +126,7 @@ func TestMappingParams(t *testing.T) { }, } r.Header.Set("Auth", "1234567") - req = client.NewReq(r, api) + req = client.NewReq(context.TODO(), r, api) _, params, err = dClient.MappingParams(req) assert.Nil(t, err) assert.Equal(t, params[0], "12345") @@ -157,7 +158,7 @@ func TestMappingParams(t *testing.T) { }, } r.Header.Set("Auth", "1234567") - req = client.NewReq(r, api) + req = client.NewReq(context.TODO(), r, api) _, params, err = dClient.MappingParams(req) assert.Nil(t, err) assert.Equal(t, params[0], "12345") diff --git a/pkg/client/dubbo/mapper_test.go b/pkg/client/dubbo/mapper_test.go index 0d1bda4e3..5158fe000 100644 --- a/pkg/client/dubbo/mapper_test.go +++ b/pkg/client/dubbo/mapper_test.go @@ -19,6 +19,7 @@ package dubbo import ( "bytes" + "context" "net/http" "testing" ) @@ -50,7 +51,7 @@ func TestQueryStringsMapper(t *testing.T) { MapTo: "jk", }, } - req := client.NewReq(r, api) + req := client.NewReq(context.TODO(), r, api) params := []interface{}{} qs := queryStringsMapper{} @@ -74,7 +75,7 @@ func TestQueryStringsMapper(t *testing.T) { MapTo: "0", }, } - req = client.NewReq(r, api) + req = client.NewReq(context.TODO(), r, api) params = []interface{}{} err = qs.Map(api.IntegrationRequest.MappingParams[0], *req, ¶ms) assert.Nil(t, err) @@ -98,7 +99,7 @@ func TestHeaderMapper(t *testing.T) { } hm := headerMapper{} target := []interface{}{} - req := client.NewReq(r, api) + req := client.NewReq(context.TODO(), r, api) err := hm.Map(api.IntegrationRequest.MappingParams[0], *req, &target) assert.Nil(t, err) @@ -124,7 +125,7 @@ func TestBodyMapper(t *testing.T) { } bm := bodyMapper{} target := []interface{}{} - req := client.NewReq(r, api) + req := client.NewReq(context.TODO(), r, api) err := bm.Map(api.IntegrationRequest.MappingParams[0], *req, &target) assert.Nil(t, err) From 43386cb6e6952770ca960ae2b398f7ff85730f53 Mon Sep 17 00:00:00 2001 From: tiecheng Date: Fri, 13 Nov 2020 18:45:39 +0800 Subject: [PATCH 227/227] update sample config Former-commit-id: b1259579f635ec2f8313eef8c30bbf5927da6d97 Former-commit-id: db3a20cafa4c81a2f759482f79a02b113e66a694 --- pkg/client/dubbo/dubbo.go | 2 +- sample/dubbogo/proxy/api_config.yaml | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/pkg/client/dubbo/dubbo.go b/pkg/client/dubbo/dubbo.go index 8356b93e2..69dc84400 100644 --- a/pkg/client/dubbo/dubbo.go +++ b/pkg/client/dubbo/dubbo.go @@ -164,7 +164,7 @@ func (dc *Client) Call(req *client.Request) (resp client.Response, err error) { // MappingParams param mapping to api. func (dc *Client) MappingParams(req *client.Request) ([]string, []interface{}, error) { r := req.API.Method.IntegrationRequest - values := []interface{}{} + var values []interface{} for _, mappingParam := range r.MappingParams { source, _, err := client.ParseMapSource(mappingParam.Name) if err != nil { diff --git a/sample/dubbogo/proxy/api_config.yaml b/sample/dubbogo/proxy/api_config.yaml index e3cb19aa4..782865d70 100644 --- a/sample/dubbogo/proxy/api_config.yaml +++ b/sample/dubbogo/proxy/api_config.yaml @@ -20,10 +20,11 @@ resources: requestType: dubbo mappingParams: - name: queryStrings.name - mapTo: 1 + mapTo: 0 applicationName: "UserProvider" interface: "com.ic.user.UserProvider" method: "GetUserByName" + paramTypes: [ "java.lang.String" ] group: "test" version: 1.0.0 clusterName: "test_dubbo"

      4. The Icons used were sourced from the Eclipse project (http://www.eclipse.org) and licensed -under the Eclipse Public Licence v1.0. [http://www.eclipse.org/org/documents/epl-v10.php] -

    7. The Icons used were sourced from the Eclipse project (http://www.eclipse.org) and licensed +under the Eclipse Public Licence v1.0. [http://www.eclipse.org/org/documents/epl-v10.php] +